summaryrefslogtreecommitdiffstatshomepage
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/devices/bus/a1bus/a1bus.cpp6
-rw-r--r--src/devices/bus/a1bus/a1bus.h21
-rw-r--r--src/devices/bus/a1bus/a1cassette.cpp11
-rw-r--r--src/devices/bus/a2bus/a2alfam2.cpp44
-rw-r--r--src/devices/bus/a2bus/a2arcadebd.cpp6
-rw-r--r--src/devices/bus/a2bus/a2bus.cpp28
-rw-r--r--src/devices/bus/a2bus/a2bus.h49
-rw-r--r--src/devices/bus/a2bus/a2cffa.cpp2
-rw-r--r--src/devices/bus/a2bus/a2corvus.cpp19
-rw-r--r--src/devices/bus/a2bus/a2diskii.cpp22
-rw-r--r--src/devices/bus/a2bus/a2diskiing.cpp29
-rw-r--r--src/devices/bus/a2bus/a2diskiing.h5
-rw-r--r--src/devices/bus/a2bus/a2dx1.cpp14
-rw-r--r--src/devices/bus/a2bus/a2eauxslot.cpp37
-rw-r--r--src/devices/bus/a2bus/a2eauxslot.h59
-rw-r--r--src/devices/bus/a2bus/a2eext80col.cpp1
-rw-r--r--src/devices/bus/a2bus/a2eramworks3.cpp3
-rw-r--r--src/devices/bus/a2bus/a2eramworks3.h2
-rw-r--r--src/devices/bus/a2bus/a2estd80col.cpp1
-rw-r--r--src/devices/bus/a2bus/a2hsscsi.cpp39
-rw-r--r--src/devices/bus/a2bus/a2hsscsi.h2
-rw-r--r--src/devices/bus/a2bus/a2mcms.cpp18
-rw-r--r--src/devices/bus/a2bus/a2mcms.h2
-rw-r--r--src/devices/bus/a2bus/a2memexp.cpp5
-rw-r--r--src/devices/bus/a2bus/a2midi.cpp22
-rw-r--r--src/devices/bus/a2bus/a2mockingboard.cpp50
-rw-r--r--src/devices/bus/a2bus/a2pic.cpp8
-rw-r--r--src/devices/bus/a2bus/a2sam.cpp12
-rw-r--r--src/devices/bus/a2bus/a2scsi.cpp39
-rw-r--r--src/devices/bus/a2bus/a2scsi.h2
-rw-r--r--src/devices/bus/a2bus/a2softcard.cpp28
-rw-r--r--src/devices/bus/a2bus/a2ssc.cpp4
-rw-r--r--src/devices/bus/a2bus/a2themill.cpp28
-rw-r--r--src/devices/bus/a2bus/a2ultraterm.cpp17
-rw-r--r--src/devices/bus/a2bus/a2videoterm.cpp17
-rw-r--r--src/devices/bus/a2bus/a2zipdrive.cpp107
-rw-r--r--src/devices/bus/a2bus/a2zipdrive.h18
-rw-r--r--src/devices/bus/a2bus/agat7ports.cpp12
-rw-r--r--src/devices/bus/a2bus/agat840k_hle.cpp15
-rw-r--r--src/devices/bus/a2bus/corvfdc02.cpp6
-rw-r--r--src/devices/bus/a2bus/ezcgi.cpp34
-rw-r--r--src/devices/bus/a2bus/laser128.cpp5
-rw-r--r--src/devices/bus/a2bus/mouse.cpp4
-rw-r--r--src/devices/bus/a2bus/pc_xporter.cpp45
-rw-r--r--src/devices/bus/a2bus/pc_xporter.h1
-rw-r--r--src/devices/bus/a2bus/ssbapple.cpp9
-rw-r--r--src/devices/bus/a2bus/ssprite.cpp6
-rw-r--r--src/devices/bus/a2bus/timemasterho.cpp4
-rw-r--r--src/devices/bus/a2bus/transwarp.cpp37
-rw-r--r--src/devices/bus/a2bus/transwarp.h1
-rw-r--r--src/devices/bus/a7800/cpuwiz.cpp8
-rw-r--r--src/devices/bus/a7800/cpuwiz.h4
-rw-r--r--src/devices/bus/a7800/rom.cpp59
-rw-r--r--src/devices/bus/a7800/rom.h16
-rw-r--r--src/devices/bus/a7800/xboard.cpp12
-rw-r--r--src/devices/bus/a800/cassette.cpp13
-rw-r--r--src/devices/bus/abcbus/abc890.cpp112
-rw-r--r--src/devices/bus/abcbus/abcbus.h72
-rw-r--r--src/devices/bus/abcbus/cadmouse.cpp11
-rw-r--r--src/devices/bus/abcbus/db411223.cpp11
-rw-r--r--src/devices/bus/abcbus/unidisk.cpp5
-rw-r--r--src/devices/bus/abckb/abc77.cpp8
-rw-r--r--src/devices/bus/abckb/abc99.cpp2
-rw-r--r--src/devices/bus/abckb/abckb.h41
-rw-r--r--src/devices/bus/acorn/atom/discpack.cpp2
-rw-r--r--src/devices/bus/acorn/atom/econet.cpp2
-rw-r--r--src/devices/bus/acorn/atom/sid.cpp2
-rw-r--r--src/devices/bus/acorn/bus.cpp2
-rw-r--r--src/devices/bus/acorn/bus.h6
-rw-r--r--src/devices/bus/acorn/cms/4080term.cpp22
-rw-r--r--src/devices/bus/acorn/cms/hires.cpp15
-rw-r--r--src/devices/bus/acorn/system/cass.cpp9
-rw-r--r--src/devices/bus/acorn/system/econet.cpp2
-rw-r--r--src/devices/bus/acorn/system/fdc.cpp2
-rw-r--r--src/devices/bus/acorn/system/vdu40.cpp15
-rw-r--r--src/devices/bus/acorn/system/vdu80.cpp19
-rw-r--r--src/devices/bus/acorn/system/vib.cpp10
-rw-r--r--src/devices/bus/adam/adamlink.cpp4
-rw-r--r--src/devices/bus/adam/adamlink.h4
-rw-r--r--src/devices/bus/adam/exp.cpp8
-rw-r--r--src/devices/bus/adam/exp.h8
-rw-r--r--src/devices/bus/adam/ide.cpp4
-rw-r--r--src/devices/bus/adam/ide.h4
-rw-r--r--src/devices/bus/adam/ram.cpp4
-rw-r--r--src/devices/bus/adam/ram.h4
-rw-r--r--src/devices/bus/adamnet/adamnet.h11
-rw-r--r--src/devices/bus/adamnet/ddp.cpp27
-rw-r--r--src/devices/bus/adamnet/spi.cpp8
-rw-r--r--src/devices/bus/amiga/zorro/a2052.cpp6
-rw-r--r--src/devices/bus/amiga/zorro/a2058.cpp6
-rw-r--r--src/devices/bus/amiga/zorro/a2065.cpp10
-rw-r--r--src/devices/bus/amiga/zorro/a2232.cpp22
-rw-r--r--src/devices/bus/amiga/zorro/a590.cpp52
-rw-r--r--src/devices/bus/amiga/zorro/a590.h8
-rw-r--r--src/devices/bus/amiga/zorro/buddha.cpp18
-rw-r--r--src/devices/bus/amiga/zorro/zorro.cpp46
-rw-r--r--src/devices/bus/amiga/zorro/zorro.h112
-rw-r--r--src/devices/bus/apf/slot.h16
-rw-r--r--src/devices/bus/apricot/expansion/cards.cpp2
-rw-r--r--src/devices/bus/apricot/expansion/expansion.cpp25
-rw-r--r--src/devices/bus/apricot/expansion/expansion.h33
-rw-r--r--src/devices/bus/apricot/expansion/winchester.cpp254
-rw-r--r--src/devices/bus/apricot/expansion/winchester.h66
-rw-r--r--src/devices/bus/apricot/keyboard/hle.cpp85
-rw-r--r--src/devices/bus/apricot/keyboard/hle.h12
-rw-r--r--src/devices/bus/astrocde/accessory.cpp112
-rw-r--r--src/devices/bus/astrocde/accessory.h99
-rw-r--r--src/devices/bus/astrocde/cassette.cpp130
-rw-r--r--src/devices/bus/astrocde/cassette.h61
-rw-r--r--src/devices/bus/astrocde/ctrl.cpp120
-rw-r--r--src/devices/bus/astrocde/ctrl.h98
-rw-r--r--src/devices/bus/astrocde/exp.cpp14
-rw-r--r--src/devices/bus/astrocde/exp.h4
-rw-r--r--src/devices/bus/astrocde/joy.cpp56
-rw-r--r--src/devices/bus/astrocde/joy.h45
-rw-r--r--src/devices/bus/astrocde/lightpen.cpp87
-rw-r--r--src/devices/bus/astrocde/lightpen.h51
-rw-r--r--src/devices/bus/astrocde/ram.cpp61
-rw-r--r--src/devices/bus/astrocde/ram.h12
-rw-r--r--src/devices/bus/astrocde/rom.cpp41
-rw-r--r--src/devices/bus/astrocde/rom.h21
-rw-r--r--src/devices/bus/astrocde/slot.cpp3
-rw-r--r--src/devices/bus/astrocde/slot.h3
-rw-r--r--src/devices/bus/bbc/1mhzbus/1mhzbus.cpp19
-rw-r--r--src/devices/bus/bbc/1mhzbus/1mhzbus.h16
-rw-r--r--src/devices/bus/bbc/1mhzbus/beebsid.cpp20
-rw-r--r--src/devices/bus/bbc/1mhzbus/beebsid.h8
-rw-r--r--src/devices/bus/bbc/1mhzbus/cfa3000opt.cpp2
-rw-r--r--src/devices/bus/bbc/1mhzbus/cfa3000opt.h2
-rw-r--r--src/devices/bus/bbc/1mhzbus/emrmidi.cpp8
-rw-r--r--src/devices/bus/bbc/1mhzbus/emrmidi.h4
-rw-r--r--src/devices/bus/bbc/1mhzbus/ieee488.cpp113
-rw-r--r--src/devices/bus/bbc/1mhzbus/ieee488.h16
-rw-r--r--src/devices/bus/bbc/1mhzbus/m2000.cpp28
-rw-r--r--src/devices/bus/bbc/1mhzbus/m2000.h8
-rw-r--r--src/devices/bus/bbc/1mhzbus/opus3.cpp8
-rw-r--r--src/devices/bus/bbc/1mhzbus/opus3.h8
-rw-r--r--src/devices/bus/bbc/1mhzbus/sprite.cpp99
-rw-r--r--src/devices/bus/bbc/1mhzbus/sprite.h49
-rw-r--r--src/devices/bus/bbc/exp/exp.cpp32
-rw-r--r--src/devices/bus/bbc/exp/exp.h34
-rw-r--r--src/devices/bus/bbc/exp/mertec.cpp34
-rw-r--r--src/devices/bus/bbc/exp/mertec.h18
-rw-r--r--src/devices/bus/bbc/fdc/acorn.cpp16
-rw-r--r--src/devices/bus/bbc/fdc/acorn.h8
-rw-r--r--src/devices/bus/bbc/fdc/ams.cpp12
-rw-r--r--src/devices/bus/bbc/fdc/ams.h4
-rw-r--r--src/devices/bus/bbc/fdc/cumana.cpp4
-rw-r--r--src/devices/bus/bbc/fdc/cumana.h4
-rw-r--r--src/devices/bus/bbc/fdc/cv1797.cpp4
-rw-r--r--src/devices/bus/bbc/fdc/cv1797.h4
-rw-r--r--src/devices/bus/bbc/fdc/fdc.cpp8
-rw-r--r--src/devices/bus/bbc/fdc/fdc.h8
-rw-r--r--src/devices/bus/bbc/fdc/microware.cpp4
-rw-r--r--src/devices/bus/bbc/fdc/microware.h4
-rw-r--r--src/devices/bus/bbc/fdc/opus.cpp14
-rw-r--r--src/devices/bus/bbc/fdc/opus.h8
-rw-r--r--src/devices/bus/bbc/fdc/watford.cpp8
-rw-r--r--src/devices/bus/bbc/fdc/watford.h8
-rw-r--r--src/devices/bus/bbc/joyport/joyport.cpp8
-rw-r--r--src/devices/bus/bbc/joyport/joyport.h8
-rw-r--r--src/devices/bus/bbc/joyport/joystick.cpp2
-rw-r--r--src/devices/bus/bbc/joyport/joystick.h2
-rw-r--r--src/devices/bus/bbc/rom/dfs.cpp63
-rw-r--r--src/devices/bus/bbc/rom/dfs.h42
-rw-r--r--src/devices/bus/bbc/rom/pal.cpp312
-rw-r--r--src/devices/bus/bbc/rom/pal.h167
-rw-r--r--src/devices/bus/bbc/rom/ram.cpp57
-rw-r--r--src/devices/bus/bbc/rom/ram.h42
-rw-r--r--src/devices/bus/bbc/rom/rom.cpp50
-rw-r--r--src/devices/bus/bbc/rom/rom.h41
-rw-r--r--src/devices/bus/bbc/rom/rtc.cpp124
-rw-r--r--src/devices/bus/bbc/rom/rtc.h72
-rw-r--r--src/devices/bus/bbc/rom/slot.cpp234
-rw-r--r--src/devices/bus/bbc/rom/slot.h155
-rw-r--r--src/devices/bus/bbc/tube/tube.cpp20
-rw-r--r--src/devices/bus/bbc/tube/tube.h8
-rw-r--r--src/devices/bus/bbc/tube/tube_32016.cpp210
-rw-r--r--src/devices/bus/bbc/tube/tube_32016.h71
-rw-r--r--src/devices/bus/bbc/tube/tube_6502.cpp16
-rw-r--r--src/devices/bus/bbc/tube/tube_6502.h8
-rw-r--r--src/devices/bus/bbc/tube/tube_80186.cpp8
-rw-r--r--src/devices/bus/bbc/tube/tube_80186.h4
-rw-r--r--src/devices/bus/bbc/tube/tube_80286.cpp15
-rw-r--r--src/devices/bus/bbc/tube/tube_80286.h8
-rw-r--r--src/devices/bus/bbc/tube/tube_arm.cpp12
-rw-r--r--src/devices/bus/bbc/tube/tube_arm.h8
-rw-r--r--src/devices/bus/bbc/tube/tube_casper.cpp4
-rw-r--r--src/devices/bus/bbc/tube/tube_casper.h4
-rw-r--r--src/devices/bus/bbc/tube/tube_rc6502.cpp12
-rw-r--r--src/devices/bus/bbc/tube/tube_rc6502.h8
-rw-r--r--src/devices/bus/bbc/tube/tube_z80.cpp14
-rw-r--r--src/devices/bus/bbc/tube/tube_z80.h10
-rw-r--r--src/devices/bus/bbc/tube/tube_zep100.cpp18
-rw-r--r--src/devices/bus/bbc/tube/tube_zep100.h18
-rw-r--r--src/devices/bus/bbc/userport/beebspch.cpp2
-rw-r--r--src/devices/bus/bbc/userport/beebspch.h2
-rw-r--r--src/devices/bus/bbc/userport/cfa3000kbd.cpp2
-rw-r--r--src/devices/bus/bbc/userport/cfa3000kbd.h2
-rw-r--r--src/devices/bus/bbc/userport/pointer.cpp6
-rw-r--r--src/devices/bus/bbc/userport/pointer.h6
-rw-r--r--src/devices/bus/bbc/userport/userport.cpp8
-rw-r--r--src/devices/bus/bbc/userport/userport.h8
-rw-r--r--src/devices/bus/bml3/bml3bus.cpp6
-rw-r--r--src/devices/bus/bml3/bml3bus.h53
-rw-r--r--src/devices/bus/bw2/exp.cpp24
-rw-r--r--src/devices/bus/bw2/exp.h45
-rw-r--r--src/devices/bus/bw2/ramcard.cpp6
-rw-r--r--src/devices/bus/bw2/ramcard.h6
-rw-r--r--src/devices/bus/c64/16kb.cpp17
-rw-r--r--src/devices/bus/c64/16kb.h2
-rw-r--r--src/devices/bus/c64/c128_comal80.cpp4
-rw-r--r--src/devices/bus/c64/c128_comal80.h4
-rw-r--r--src/devices/bus/c64/c128_partner.cpp4
-rw-r--r--src/devices/bus/c64/c128_partner.h4
-rw-r--r--src/devices/bus/c64/comal80.cpp4
-rw-r--r--src/devices/bus/c64/comal80.h4
-rw-r--r--src/devices/bus/c64/cpm.cpp6
-rw-r--r--src/devices/bus/c64/cpm.h2
-rw-r--r--src/devices/bus/c64/currah_speech.cpp4
-rw-r--r--src/devices/bus/c64/currah_speech.h4
-rw-r--r--src/devices/bus/c64/dela_ep256.cpp35
-rw-r--r--src/devices/bus/c64/dela_ep256.h4
-rw-r--r--src/devices/bus/c64/dela_ep64.cpp19
-rw-r--r--src/devices/bus/c64/dela_ep64.h4
-rw-r--r--src/devices/bus/c64/dela_ep7x8.cpp52
-rw-r--r--src/devices/bus/c64/dela_ep7x8.h12
-rw-r--r--src/devices/bus/c64/dinamic.cpp2
-rw-r--r--src/devices/bus/c64/dinamic.h2
-rw-r--r--src/devices/bus/c64/dqbb.cpp4
-rw-r--r--src/devices/bus/c64/dqbb.h4
-rw-r--r--src/devices/bus/c64/easy_calc_result.cpp4
-rw-r--r--src/devices/bus/c64/easy_calc_result.h4
-rw-r--r--src/devices/bus/c64/easyflash.cpp12
-rw-r--r--src/devices/bus/c64/easyflash.h4
-rw-r--r--src/devices/bus/c64/epyx_fast_load.cpp4
-rw-r--r--src/devices/bus/c64/epyx_fast_load.h4
-rw-r--r--src/devices/bus/c64/exos.cpp2
-rw-r--r--src/devices/bus/c64/exos.h2
-rw-r--r--src/devices/bus/c64/exp.cpp8
-rw-r--r--src/devices/bus/c64/exp.h12
-rw-r--r--src/devices/bus/c64/fcc.cpp13
-rw-r--r--src/devices/bus/c64/fcc.h4
-rw-r--r--src/devices/bus/c64/final.cpp4
-rw-r--r--src/devices/bus/c64/final.h4
-rw-r--r--src/devices/bus/c64/final3.cpp4
-rw-r--r--src/devices/bus/c64/final3.h4
-rw-r--r--src/devices/bus/c64/fun_play.cpp4
-rw-r--r--src/devices/bus/c64/fun_play.h4
-rw-r--r--src/devices/bus/c64/geocable.cpp9
-rw-r--r--src/devices/bus/c64/georam.cpp4
-rw-r--r--src/devices/bus/c64/georam.h4
-rw-r--r--src/devices/bus/c64/ide64.cpp8
-rw-r--r--src/devices/bus/c64/ide64.h4
-rw-r--r--src/devices/bus/c64/ieee488.cpp12
-rw-r--r--src/devices/bus/c64/ieee488.h4
-rw-r--r--src/devices/bus/c64/kingsoft.cpp4
-rw-r--r--src/devices/bus/c64/kingsoft.h4
-rw-r--r--src/devices/bus/c64/mach5.cpp4
-rw-r--r--src/devices/bus/c64/mach5.h4
-rw-r--r--src/devices/bus/c64/magic_desk.cpp4
-rw-r--r--src/devices/bus/c64/magic_desk.h4
-rw-r--r--src/devices/bus/c64/magic_formel.cpp6
-rw-r--r--src/devices/bus/c64/magic_formel.h4
-rw-r--r--src/devices/bus/c64/magic_voice.cpp14
-rw-r--r--src/devices/bus/c64/magic_voice.h4
-rw-r--r--src/devices/bus/c64/midi_maplin.cpp22
-rw-r--r--src/devices/bus/c64/midi_maplin.h4
-rw-r--r--src/devices/bus/c64/midi_namesoft.cpp22
-rw-r--r--src/devices/bus/c64/midi_namesoft.h4
-rw-r--r--src/devices/bus/c64/midi_passport.cpp26
-rw-r--r--src/devices/bus/c64/midi_passport.h4
-rw-r--r--src/devices/bus/c64/midi_sci.cpp22
-rw-r--r--src/devices/bus/c64/midi_sci.h4
-rw-r--r--src/devices/bus/c64/midi_siel.cpp22
-rw-r--r--src/devices/bus/c64/midi_siel.h4
-rw-r--r--src/devices/bus/c64/mikro_assembler.cpp2
-rw-r--r--src/devices/bus/c64/mikro_assembler.h2
-rw-r--r--src/devices/bus/c64/multiscreen.cpp17
-rw-r--r--src/devices/bus/c64/multiscreen.h4
-rw-r--r--src/devices/bus/c64/music64.cpp8
-rw-r--r--src/devices/bus/c64/music64.h4
-rw-r--r--src/devices/bus/c64/neoram.cpp4
-rw-r--r--src/devices/bus/c64/neoram.h4
-rw-r--r--src/devices/bus/c64/ocean.cpp4
-rw-r--r--src/devices/bus/c64/ocean.h4
-rw-r--r--src/devices/bus/c64/pagefox.cpp4
-rw-r--r--src/devices/bus/c64/pagefox.h4
-rw-r--r--src/devices/bus/c64/partner.cpp4
-rw-r--r--src/devices/bus/c64/partner.h4
-rw-r--r--src/devices/bus/c64/prophet64.cpp4
-rw-r--r--src/devices/bus/c64/prophet64.h4
-rw-r--r--src/devices/bus/c64/ps64.cpp25
-rw-r--r--src/devices/bus/c64/ps64.h4
-rw-r--r--src/devices/bus/c64/reu.cpp20
-rw-r--r--src/devices/bus/c64/reu.h4
-rw-r--r--src/devices/bus/c64/rex.cpp2
-rw-r--r--src/devices/bus/c64/rex.h2
-rw-r--r--src/devices/bus/c64/rex_ep256.cpp35
-rw-r--r--src/devices/bus/c64/rex_ep256.h4
-rw-r--r--src/devices/bus/c64/ross.cpp4
-rw-r--r--src/devices/bus/c64/ross.h4
-rw-r--r--src/devices/bus/c64/sfx_sound_expander.cpp12
-rw-r--r--src/devices/bus/c64/sfx_sound_expander.h4
-rw-r--r--src/devices/bus/c64/silverrock.cpp4
-rw-r--r--src/devices/bus/c64/silverrock.h4
-rw-r--r--src/devices/bus/c64/simons_basic.cpp4
-rw-r--r--src/devices/bus/c64/simons_basic.h4
-rw-r--r--src/devices/bus/c64/speakeasy.cpp16
-rw-r--r--src/devices/bus/c64/speakeasy.h4
-rw-r--r--src/devices/bus/c64/stardos.cpp4
-rw-r--r--src/devices/bus/c64/stardos.h4
-rw-r--r--src/devices/bus/c64/std.cpp2
-rw-r--r--src/devices/bus/c64/std.h2
-rw-r--r--src/devices/bus/c64/structured_basic.cpp4
-rw-r--r--src/devices/bus/c64/structured_basic.h4
-rw-r--r--src/devices/bus/c64/super_explode.cpp4
-rw-r--r--src/devices/bus/c64/super_explode.h4
-rw-r--r--src/devices/bus/c64/super_games.cpp4
-rw-r--r--src/devices/bus/c64/super_games.h4
-rw-r--r--src/devices/bus/c64/supercpu.cpp8
-rw-r--r--src/devices/bus/c64/supercpu.h4
-rw-r--r--src/devices/bus/c64/sw8k.cpp2
-rw-r--r--src/devices/bus/c64/sw8k.h2
-rw-r--r--src/devices/bus/c64/swiftlink.cpp8
-rw-r--r--src/devices/bus/c64/swiftlink.h4
-rw-r--r--src/devices/bus/c64/system3.cpp4
-rw-r--r--src/devices/bus/c64/system3.h4
-rw-r--r--src/devices/bus/c64/tdos.cpp12
-rw-r--r--src/devices/bus/c64/tdos.h4
-rw-r--r--src/devices/bus/c64/turbo232.cpp10
-rw-r--r--src/devices/bus/c64/turbo232.h4
-rw-r--r--src/devices/bus/c64/vizastar.cpp2
-rw-r--r--src/devices/bus/c64/vizastar.h2
-rw-r--r--src/devices/bus/c64/vw64.cpp2
-rw-r--r--src/devices/bus/c64/vw64.h2
-rw-r--r--src/devices/bus/c64/warp_speed.cpp4
-rw-r--r--src/devices/bus/c64/warp_speed.h4
-rw-r--r--src/devices/bus/c64/westermann.cpp2
-rw-r--r--src/devices/bus/c64/westermann.h2
-rw-r--r--src/devices/bus/c64/xl80.cpp29
-rw-r--r--src/devices/bus/c64/xl80.h4
-rw-r--r--src/devices/bus/c64/zaxxon.cpp2
-rw-r--r--src/devices/bus/c64/zaxxon.h2
-rw-r--r--src/devices/bus/cbm2/24k.cpp4
-rw-r--r--src/devices/bus/cbm2/24k.h4
-rw-r--r--src/devices/bus/cbm2/exp.cpp8
-rw-r--r--src/devices/bus/cbm2/exp.h19
-rw-r--r--src/devices/bus/cbm2/hrg.cpp64
-rw-r--r--src/devices/bus/cbm2/hrg.h7
-rw-r--r--src/devices/bus/cbm2/std.cpp2
-rw-r--r--src/devices/bus/cbm2/std.h2
-rw-r--r--src/devices/bus/cbm2/user.h26
-rw-r--r--src/devices/bus/cbmiec/c1526.cpp22
-rw-r--r--src/devices/bus/cbmiec/c1541.cpp18
-rw-r--r--src/devices/bus/cbmiec/c1571.cpp11
-rw-r--r--src/devices/bus/cbmiec/c1581.cpp31
-rw-r--r--src/devices/bus/cbmiec/cbmiec.h45
-rw-r--r--src/devices/bus/cbmiec/interpod.cpp17
-rw-r--r--src/devices/bus/cbmiec/interpod.h10
-rw-r--r--src/devices/bus/cbmiec/serialbox.cpp9
-rw-r--r--src/devices/bus/cbmiec/vic1515.cpp11
-rw-r--r--src/devices/bus/cbmiec/vic1520.cpp9
-rw-r--r--src/devices/bus/cbus/pc9801_118.cpp4
-rw-r--r--src/devices/bus/cbus/pc9801_26.cpp4
-rw-r--r--src/devices/bus/cbus/pc9801_86.cpp30
-rw-r--r--src/devices/bus/cbus/pc9801_amd98.cpp16
-rw-r--r--src/devices/bus/cbus/pc9801_cbus.cpp11
-rw-r--r--src/devices/bus/cbus/pc9801_cbus.h106
-rw-r--r--src/devices/bus/centronics/comxpl80.cpp11
-rw-r--r--src/devices/bus/centronics/covox.cpp29
-rw-r--r--src/devices/bus/centronics/ctronics.h80
-rw-r--r--src/devices/bus/centronics/digiblst.cpp12
-rw-r--r--src/devices/bus/centronics/epson_lx810l.cpp1
-rw-r--r--src/devices/bus/centronics/nec_p72.cpp10
-rw-r--r--src/devices/bus/centronics/printer.cpp9
-rw-r--r--src/devices/bus/cgenie/expansion/expansion.cpp22
-rw-r--r--src/devices/bus/cgenie/expansion/expansion.h45
-rw-r--r--src/devices/bus/cgenie/expansion/floppy.cpp16
-rw-r--r--src/devices/bus/cgenie/parallel/parallel.h23
-rw-r--r--src/devices/bus/cgenie/parallel/printer.cpp19
-rw-r--r--src/devices/bus/chanf/slot.h16
-rw-r--r--src/devices/bus/coco/coco_dcmodem.cpp9
-rw-r--r--src/devices/bus/coco/coco_fdc.cpp15
-rw-r--r--src/devices/bus/coco/coco_fdc.h1
-rw-r--r--src/devices/bus/coco/coco_gmc.cpp8
-rw-r--r--src/devices/bus/coco/coco_multi.cpp82
-rw-r--r--src/devices/bus/coco/coco_orch90.cpp20
-rw-r--r--src/devices/bus/coco/coco_rs232.cpp9
-rw-r--r--src/devices/bus/coco/coco_ssc.cpp15
-rw-r--r--src/devices/bus/coco/coco_t4426.cpp14
-rw-r--r--src/devices/bus/coco/cococart.cpp40
-rw-r--r--src/devices/bus/coco/cococart.h46
-rw-r--r--src/devices/bus/coco/dragon_jcbsnd.cpp15
-rw-r--r--src/devices/bus/coco/dragon_jcbsnd.h1
-rw-r--r--src/devices/bus/coleco/cartridge/exp.cpp (renamed from src/devices/bus/coleco/exp.cpp)4
-rw-r--r--src/devices/bus/coleco/cartridge/exp.h (renamed from src/devices/bus/coleco/exp.h)4
-rw-r--r--src/devices/bus/coleco/cartridge/std.cpp (renamed from src/devices/bus/coleco/std.cpp)2
-rw-r--r--src/devices/bus/coleco/cartridge/std.h (renamed from src/devices/bus/coleco/std.h)2
-rw-r--r--src/devices/bus/coleco/cartridge/xin1.cpp (renamed from src/devices/bus/coleco/xin1.cpp)2
-rw-r--r--src/devices/bus/coleco/cartridge/xin1.h (renamed from src/devices/bus/coleco/xin1.h)2
-rw-r--r--src/devices/bus/coleco/controller/ctrl.cpp (renamed from src/devices/bus/coleco/ctrl.cpp)0
-rw-r--r--src/devices/bus/coleco/controller/ctrl.h (renamed from src/devices/bus/coleco/ctrl.h)0
-rw-r--r--src/devices/bus/coleco/controller/hand.cpp (renamed from src/devices/bus/coleco/hand.cpp)0
-rw-r--r--src/devices/bus/coleco/controller/hand.h (renamed from src/devices/bus/coleco/hand.h)0
-rw-r--r--src/devices/bus/coleco/controller/sac.cpp (renamed from src/devices/bus/coleco/sac.cpp)0
-rw-r--r--src/devices/bus/coleco/controller/sac.h (renamed from src/devices/bus/coleco/sac.h)0
-rw-r--r--src/devices/bus/compis/graphics.h40
-rw-r--r--src/devices/bus/compis/hrg.cpp50
-rw-r--r--src/devices/bus/compis/hrg.h4
-rw-r--r--src/devices/bus/compucolor/floppy.cpp33
-rw-r--r--src/devices/bus/compucolor/floppy.h2
-rw-r--r--src/devices/bus/comx35/clm.cpp31
-rw-r--r--src/devices/bus/comx35/clm.h4
-rw-r--r--src/devices/bus/comx35/eprom.cpp4
-rw-r--r--src/devices/bus/comx35/eprom.h4
-rw-r--r--src/devices/bus/comx35/exp.cpp16
-rw-r--r--src/devices/bus/comx35/exp.h16
-rw-r--r--src/devices/bus/comx35/expbox.cpp16
-rw-r--r--src/devices/bus/comx35/expbox.h8
-rw-r--r--src/devices/bus/comx35/fdc.cpp6
-rw-r--r--src/devices/bus/comx35/fdc.h6
-rw-r--r--src/devices/bus/comx35/joycard.cpp2
-rw-r--r--src/devices/bus/comx35/joycard.h2
-rw-r--r--src/devices/bus/comx35/printer.cpp27
-rw-r--r--src/devices/bus/comx35/printer.h6
-rw-r--r--src/devices/bus/comx35/ram.cpp6
-rw-r--r--src/devices/bus/comx35/ram.h6
-rw-r--r--src/devices/bus/comx35/thermal.cpp6
-rw-r--r--src/devices/bus/comx35/thermal.h6
-rw-r--r--src/devices/bus/cpc/amdrum.cpp12
-rw-r--r--src/devices/bus/cpc/cpc_rom.cpp21
-rw-r--r--src/devices/bus/cpc/cpc_rom.h3
-rw-r--r--src/devices/bus/cpc/cpcexp.cpp2
-rw-r--r--src/devices/bus/cpc/ddi1.cpp6
-rw-r--r--src/devices/bus/cpc/doubler.cpp13
-rw-r--r--src/devices/bus/cpc/hd20.cpp11
-rw-r--r--src/devices/bus/cpc/magicsound.cpp16
-rw-r--r--src/devices/bus/cpc/playcity.cpp12
-rw-r--r--src/devices/bus/cpc/smartwatch.cpp13
-rw-r--r--src/devices/bus/cpc/symbfac2.cpp19
-rw-r--r--src/devices/bus/dmv/dmvbus.cpp13
-rw-r--r--src/devices/bus/dmv/dmvbus.h51
-rw-r--r--src/devices/bus/dmv/k210.cpp13
-rw-r--r--src/devices/bus/dmv/k210.h4
-rw-r--r--src/devices/bus/dmv/k220.cpp3
-rw-r--r--src/devices/bus/dmv/k220.h1
-rw-r--r--src/devices/bus/dmv/k230.cpp13
-rw-r--r--src/devices/bus/dmv/k230.h3
-rw-r--r--src/devices/bus/dmv/k233.cpp2
-rw-r--r--src/devices/bus/dmv/k233.h2
-rw-r--r--src/devices/bus/dmv/k801.cpp8
-rw-r--r--src/devices/bus/dmv/k801.h8
-rw-r--r--src/devices/bus/dmv/k803.cpp17
-rw-r--r--src/devices/bus/dmv/k803.h4
-rw-r--r--src/devices/bus/dmv/k806.cpp8
-rw-r--r--src/devices/bus/dmv/k806.h4
-rw-r--r--src/devices/bus/ecbbus/ecbbus.h38
-rw-r--r--src/devices/bus/econet/e01.cpp8
-rw-r--r--src/devices/bus/econet/econet.h24
-rw-r--r--src/devices/bus/einstein/pipe/pipe.cpp44
-rw-r--r--src/devices/bus/einstein/pipe/pipe.h9
-rw-r--r--src/devices/bus/einstein/pipe/speculator.cpp13
-rw-r--r--src/devices/bus/einstein/pipe/tk02.cpp3
-rw-r--r--src/devices/bus/einstein/userport/userport.h29
-rw-r--r--src/devices/bus/ekara/rom.cpp121
-rw-r--r--src/devices/bus/ekara/rom.h46
-rw-r--r--src/devices/bus/ekara/slot.cpp38
-rw-r--r--src/devices/bus/ekara/slot.h21
-rw-r--r--src/devices/bus/electron/cart/abr.cpp16
-rw-r--r--src/devices/bus/electron/cart/abr.h4
-rw-r--r--src/devices/bus/electron/cart/ap34.cpp28
-rw-r--r--src/devices/bus/electron/cart/ap34.h6
-rw-r--r--src/devices/bus/electron/cart/ap5.cpp171
-rw-r--r--src/devices/bus/electron/cart/ap5.h60
-rw-r--r--src/devices/bus/electron/cart/aqr.cpp19
-rw-r--r--src/devices/bus/electron/cart/aqr.h4
-rw-r--r--src/devices/bus/electron/cart/click.cpp21
-rw-r--r--src/devices/bus/electron/cart/click.h6
-rw-r--r--src/devices/bus/electron/cart/cumana.cpp22
-rw-r--r--src/devices/bus/electron/cart/cumana.h6
-rw-r--r--src/devices/bus/electron/cart/mgc.cpp23
-rw-r--r--src/devices/bus/electron/cart/mgc.h4
-rw-r--r--src/devices/bus/electron/cart/peg400.cpp20
-rw-r--r--src/devices/bus/electron/cart/peg400.h6
-rw-r--r--src/devices/bus/electron/cart/romp144.cpp162
-rw-r--r--src/devices/bus/electron/cart/romp144.h60
-rw-r--r--src/devices/bus/electron/cart/slot.cpp26
-rw-r--r--src/devices/bus/electron/cart/slot.h33
-rw-r--r--src/devices/bus/electron/cart/sndexp.cpp19
-rw-r--r--src/devices/bus/electron/cart/sndexp.h4
-rw-r--r--src/devices/bus/electron/cart/sndexp3.cpp18
-rw-r--r--src/devices/bus/electron/cart/sndexp3.h4
-rw-r--r--src/devices/bus/electron/cart/sp64.cpp14
-rw-r--r--src/devices/bus/electron/cart/sp64.h4
-rw-r--r--src/devices/bus/electron/cart/std.cpp6
-rw-r--r--src/devices/bus/electron/cart/std.h2
-rw-r--r--src/devices/bus/electron/cart/stlefs.cpp32
-rw-r--r--src/devices/bus/electron/cart/stlefs.h8
-rw-r--r--src/devices/bus/electron/cart/tube.cpp91
-rw-r--r--src/devices/bus/electron/cart/tube.h47
-rw-r--r--src/devices/bus/electron/exp.cpp30
-rw-r--r--src/devices/bus/electron/exp.h52
-rw-r--r--src/devices/bus/electron/fbjoy.cpp4
-rw-r--r--src/devices/bus/electron/fbjoy.h2
-rw-r--r--src/devices/bus/electron/m2105.cpp154
-rw-r--r--src/devices/bus/electron/m2105.h9
-rw-r--r--src/devices/bus/electron/plus1.cpp79
-rw-r--r--src/devices/bus/electron/plus1.h8
-rw-r--r--src/devices/bus/electron/plus2.cpp236
-rw-r--r--src/devices/bus/electron/plus2.h62
-rw-r--r--src/devices/bus/electron/plus3.cpp31
-rw-r--r--src/devices/bus/electron/plus3.h6
-rw-r--r--src/devices/bus/electron/pwrjoy.cpp6
-rw-r--r--src/devices/bus/electron/pwrjoy.h4
-rw-r--r--src/devices/bus/electron/rombox.cpp65
-rw-r--r--src/devices/bus/electron/rombox.h4
-rw-r--r--src/devices/bus/electron/romboxp.cpp95
-rw-r--r--src/devices/bus/electron/romboxp.h8
-rw-r--r--src/devices/bus/ep64/exp.cpp3
-rw-r--r--src/devices/bus/ep64/exp.h40
-rw-r--r--src/devices/bus/epson_sio/epson_sio.h38
-rw-r--r--src/devices/bus/epson_sio/pf10.cpp22
-rw-r--r--src/devices/bus/epson_sio/pf10.h3
-rw-r--r--src/devices/bus/epson_sio/tf20.cpp36
-rw-r--r--src/devices/bus/epson_sio/tf20.h5
-rw-r--r--src/devices/bus/gamate/rom.cpp7
-rw-r--r--src/devices/bus/gamate/slot.h16
-rw-r--r--src/devices/bus/gameboy/gb_slot.cpp16
-rw-r--r--src/devices/bus/gameboy/gb_slot.h16
-rw-r--r--src/devices/bus/gameboy/mbc.cpp132
-rw-r--r--src/devices/bus/gameboy/mbc.h132
-rw-r--r--src/devices/bus/gameboy/rom.cpp34
-rw-r--r--src/devices/bus/gameboy/rom.h34
-rw-r--r--src/devices/bus/gamegear/ggext.h38
-rw-r--r--src/devices/bus/gamegear/smsctrladp.cpp11
-rw-r--r--src/devices/bus/gba/gba_slot.h17
-rw-r--r--src/devices/bus/gba/rom.cpp32
-rw-r--r--src/devices/bus/generic/ram.cpp8
-rw-r--r--src/devices/bus/generic/ram.h8
-rw-r--r--src/devices/bus/generic/rom.cpp16
-rw-r--r--src/devices/bus/generic/rom.h16
-rw-r--r--src/devices/bus/generic/slot.cpp20
-rw-r--r--src/devices/bus/generic/slot.h20
-rw-r--r--src/devices/bus/hexbus/hx5102.cpp11
-rw-r--r--src/devices/bus/hp80_io/hp80_io.h27
-rw-r--r--src/devices/bus/hp80_optroms/hp80_optrom.h13
-rw-r--r--src/devices/bus/hp9845_io/98032.cpp7
-rw-r--r--src/devices/bus/hp9845_io/98034.cpp19
-rw-r--r--src/devices/bus/hp9845_io/hp9885.cpp974
-rw-r--r--src/devices/bus/hp9845_io/hp9885.h136
-rw-r--r--src/devices/bus/hp_dio/hp98265a.cpp4
-rw-r--r--src/devices/bus/hp_dio/hp98603a.cpp5
-rw-r--r--src/devices/bus/hp_dio/hp98603b.cpp5
-rw-r--r--src/devices/bus/hp_dio/hp98620.cpp6
-rw-r--r--src/devices/bus/hp_dio/hp98643.cpp2
-rw-r--r--src/devices/bus/hp_dio/hp_dio.cpp6
-rw-r--r--src/devices/bus/hp_dio/hp_dio.h9
-rw-r--r--src/devices/bus/hp_dio/human_interface.cpp12
-rw-r--r--src/devices/bus/ieee488/c2040fdc.h19
-rw-r--r--src/devices/bus/ieee488/c8280.cpp31
-rw-r--r--src/devices/bus/ieee488/hardbox.cpp25
-rw-r--r--src/devices/bus/ieee488/hp9122c.cpp19
-rw-r--r--src/devices/bus/ieee488/ieee488.h116
-rw-r--r--src/devices/bus/ieee488/remote488.cpp7
-rw-r--r--src/devices/bus/ieee488/softbox.cpp31
-rw-r--r--src/devices/bus/imi7000/imi7000.h51
-rw-r--r--src/devices/bus/intellec4/intellec4.cpp29
-rw-r--r--src/devices/bus/intellec4/intellec4.h27
-rw-r--r--src/devices/bus/interpro/keyboard/hle.cpp8
-rw-r--r--src/devices/bus/interpro/sr/edge.cpp4
-rw-r--r--src/devices/bus/interpro/sr/sr.cpp3
-rw-r--r--src/devices/bus/interpro/sr/sr.h26
-rw-r--r--src/devices/bus/intv/ecs.cpp55
-rw-r--r--src/devices/bus/intv/ecs.h54
-rw-r--r--src/devices/bus/intv/rom.h38
-rw-r--r--src/devices/bus/intv/slot.cpp16
-rw-r--r--src/devices/bus/intv/slot.h128
-rw-r--r--src/devices/bus/intv/voice.cpp31
-rw-r--r--src/devices/bus/intv/voice.h42
-rw-r--r--src/devices/bus/intv_ctrl/ctrl.h23
-rw-r--r--src/devices/bus/intv_ctrl/ecs_ctrl.cpp9
-rw-r--r--src/devices/bus/intv_ctrl/ecs_ctrl.h22
-rw-r--r--src/devices/bus/iq151/disc2.cpp11
-rw-r--r--src/devices/bus/iq151/iq151.h52
-rw-r--r--src/devices/bus/isa/3c503.cpp13
-rw-r--r--src/devices/bus/isa/3c505.cpp4
-rw-r--r--src/devices/bus/isa/adlib.cpp14
-rw-r--r--src/devices/bus/isa/aga.cpp25
-rw-r--r--src/devices/bus/isa/aha1542.cpp200
-rw-r--r--src/devices/bus/isa/aha1542.h54
-rw-r--r--src/devices/bus/isa/aha1542b.cpp126
-rw-r--r--src/devices/bus/isa/aha1542b.h57
-rw-r--r--src/devices/bus/isa/aha1542c.cpp323
-rw-r--r--src/devices/bus/isa/aha1542c.h95
-rw-r--r--src/devices/bus/isa/aha174x.cpp160
-rw-r--r--src/devices/bus/isa/aha174x.h61
-rw-r--r--src/devices/bus/isa/bt54x.cpp201
-rw-r--r--src/devices/bus/isa/bt54x.h74
-rw-r--r--src/devices/bus/isa/cga.cpp43
-rw-r--r--src/devices/bus/isa/cl_sh260.cpp93
-rw-r--r--src/devices/bus/isa/cl_sh260.h64
-rw-r--r--src/devices/bus/isa/dcb.cpp70
-rw-r--r--src/devices/bus/isa/dcb.h43
-rw-r--r--src/devices/bus/isa/dectalk.cpp1
-rw-r--r--src/devices/bus/isa/ega.cpp45
-rw-r--r--src/devices/bus/isa/ega.h2
-rw-r--r--src/devices/bus/isa/eis_sad8852.cpp11
-rw-r--r--src/devices/bus/isa/fdc.cpp5
-rw-r--r--src/devices/bus/isa/fdc.h1
-rw-r--r--src/devices/bus/isa/finalchs.cpp9
-rw-r--r--src/devices/bus/isa/gus.cpp22
-rw-r--r--src/devices/bus/isa/gus.h43
-rw-r--r--src/devices/bus/isa/hdc.cpp32
-rw-r--r--src/devices/bus/isa/hdc.h9
-rw-r--r--src/devices/bus/isa/ibm_mfc.cpp17
-rw-r--r--src/devices/bus/isa/isa.cpp92
-rw-r--r--src/devices/bus/isa/isa.h26
-rw-r--r--src/devices/bus/isa/isa_cards.cpp23
-rw-r--r--src/devices/bus/isa/lbaenhancer.cpp7
-rw-r--r--src/devices/bus/isa/mc1502_fdc.cpp12
-rw-r--r--src/devices/bus/isa/mda.cpp57
-rw-r--r--src/devices/bus/isa/mufdc.cpp5
-rw-r--r--src/devices/bus/isa/mufdc.h1
-rw-r--r--src/devices/bus/isa/ne1000.cpp13
-rw-r--r--src/devices/bus/isa/ne2000.cpp13
-rw-r--r--src/devices/bus/isa/np600.cpp76
-rw-r--r--src/devices/bus/isa/np600.h39
-rw-r--r--src/devices/bus/isa/num9rev.cpp21
-rw-r--r--src/devices/bus/isa/omti8621.cpp5
-rw-r--r--src/devices/bus/isa/omti8621.h1
-rw-r--r--src/devices/bus/isa/p1_fdc.cpp15
-rw-r--r--src/devices/bus/isa/p1_hdc.cpp26
-rw-r--r--src/devices/bus/isa/p1_sound.cpp20
-rw-r--r--src/devices/bus/isa/pc1640_iga.cpp4
-rw-r--r--src/devices/bus/isa/pds.cpp7
-rw-r--r--src/devices/bus/isa/pgc.cpp33
-rw-r--r--src/devices/bus/isa/sb16.cpp6
-rw-r--r--src/devices/bus/isa/sblaster.cpp37
-rw-r--r--src/devices/bus/isa/sc499.cpp7
-rw-r--r--src/devices/bus/isa/ssi2001.cpp2
-rw-r--r--src/devices/bus/isa/stereo_fx.cpp5
-rw-r--r--src/devices/bus/isa/svga_cirrus.cpp28
-rw-r--r--src/devices/bus/isa/svga_s3.cpp56
-rw-r--r--src/devices/bus/isa/svga_trident.cpp16
-rw-r--r--src/devices/bus/isa/svga_tseng.cpp16
-rw-r--r--src/devices/bus/isa/vga.cpp16
-rw-r--r--src/devices/bus/isa/vga_ati.cpp53
-rw-r--r--src/devices/bus/isa/wd1007a.cpp7
-rw-r--r--src/devices/bus/isa/wdxt_gen.cpp10
-rw-r--r--src/devices/bus/isa/wdxt_gen.h1
-rw-r--r--src/devices/bus/isbx/compis_fdc.cpp14
-rw-r--r--src/devices/bus/isbx/compis_fdc.h8
-rw-r--r--src/devices/bus/isbx/isbc_218a.cpp18
-rw-r--r--src/devices/bus/isbx/isbc_218a.h12
-rw-r--r--src/devices/bus/isbx/isbx.h24
-rw-r--r--src/devices/bus/jakks_gamekey/rom.cpp111
-rw-r--r--src/devices/bus/jakks_gamekey/rom.h77
-rw-r--r--src/devices/bus/jakks_gamekey/slot.cpp237
-rw-r--r--src/devices/bus/jakks_gamekey/slot.h119
-rw-r--r--src/devices/bus/kc/d002.cpp60
-rw-r--r--src/devices/bus/kc/d004.cpp4
-rw-r--r--src/devices/bus/kc/kc.h62
-rw-r--r--src/devices/bus/lpci/mpc105.cpp4
-rw-r--r--src/devices/bus/lpci/mpc105.h10
-rw-r--r--src/devices/bus/lpci/pci.h16
-rw-r--r--src/devices/bus/lpci/southbridge.cpp55
-rw-r--r--src/devices/bus/lpci/southbridge.h1
-rw-r--r--src/devices/bus/m5/slot.h17
-rw-r--r--src/devices/bus/macpds/macpds.h16
-rw-r--r--src/devices/bus/macpds/pds_tpdfpd.cpp13
-rw-r--r--src/devices/bus/megadrive/eeprom.cpp49
-rw-r--r--src/devices/bus/megadrive/ggenie.cpp9
-rw-r--r--src/devices/bus/megadrive/jcart.cpp14
-rw-r--r--src/devices/bus/megadrive/md_slot.h18
-rw-r--r--src/devices/bus/megadrive/sk.cpp9
-rw-r--r--src/devices/bus/megadrive/svp.cpp11
-rw-r--r--src/devices/bus/midi/midi.h8
-rw-r--r--src/devices/bus/midi/midiinport.cpp9
-rw-r--r--src/devices/bus/midi/midioutport.cpp7
-rw-r--r--src/devices/bus/msx_cart/arc.cpp11
-rw-r--r--src/devices/bus/msx_cart/arc.h8
-rw-r--r--src/devices/bus/msx_cart/ascii.cpp50
-rw-r--r--src/devices/bus/msx_cart/ascii.h25
-rw-r--r--src/devices/bus/msx_cart/bm_012.cpp17
-rw-r--r--src/devices/bus/msx_cart/cartridge.cpp19
-rw-r--r--src/devices/bus/msx_cart/cartridge.h21
-rw-r--r--src/devices/bus/msx_cart/crossblaim.cpp10
-rw-r--r--src/devices/bus/msx_cart/crossblaim.h5
-rw-r--r--src/devices/bus/msx_cart/disk.cpp74
-rw-r--r--src/devices/bus/msx_cart/disk.h18
-rw-r--r--src/devices/bus/msx_cart/dooly.cpp4
-rw-r--r--src/devices/bus/msx_cart/dooly.h4
-rw-r--r--src/devices/bus/msx_cart/fmpac.cpp29
-rw-r--r--src/devices/bus/msx_cart/fmpac.h9
-rw-r--r--src/devices/bus/msx_cart/fs_sr022.cpp4
-rw-r--r--src/devices/bus/msx_cart/fs_sr022.h4
-rw-r--r--src/devices/bus/msx_cart/halnote.cpp10
-rw-r--r--src/devices/bus/msx_cart/halnote.h5
-rw-r--r--src/devices/bus/msx_cart/hfox.cpp10
-rw-r--r--src/devices/bus/msx_cart/hfox.h5
-rw-r--r--src/devices/bus/msx_cart/holy_quran.cpp10
-rw-r--r--src/devices/bus/msx_cart/holy_quran.h5
-rw-r--r--src/devices/bus/msx_cart/konami.cpp142
-rw-r--r--src/devices/bus/msx_cart/konami.h32
-rw-r--r--src/devices/bus/msx_cart/korean.cpp35
-rw-r--r--src/devices/bus/msx_cart/korean.h17
-rw-r--r--src/devices/bus/msx_cart/majutsushi.cpp22
-rw-r--r--src/devices/bus/msx_cart/majutsushi.h5
-rw-r--r--src/devices/bus/msx_cart/moonsound.cpp29
-rw-r--r--src/devices/bus/msx_cart/moonsound.h10
-rw-r--r--src/devices/bus/msx_cart/msx_audio.cpp43
-rw-r--r--src/devices/bus/msx_cart/msx_audio.h18
-rw-r--r--src/devices/bus/msx_cart/msx_audio_kb.cpp16
-rw-r--r--src/devices/bus/msx_cart/msx_audio_kb.h9
-rw-r--r--src/devices/bus/msx_cart/msxdos2.cpp10
-rw-r--r--src/devices/bus/msx_cart/msxdos2.h5
-rw-r--r--src/devices/bus/msx_cart/nomapper.cpp2
-rw-r--r--src/devices/bus/msx_cart/nomapper.h2
-rw-r--r--src/devices/bus/msx_cart/rtype.cpp10
-rw-r--r--src/devices/bus/msx_cart/rtype.h5
-rw-r--r--src/devices/bus/msx_cart/super_swangi.cpp10
-rw-r--r--src/devices/bus/msx_cart/super_swangi.h5
-rw-r--r--src/devices/bus/msx_cart/superloderunner.cpp15
-rw-r--r--src/devices/bus/msx_cart/superloderunner.h7
-rw-r--r--src/devices/bus/msx_cart/yamaha.cpp18
-rw-r--r--src/devices/bus/msx_cart/yamaha.h5
-rw-r--r--src/devices/bus/msx_slot/bunsetsu.cpp6
-rw-r--r--src/devices/bus/msx_slot/bunsetsu.h9
-rw-r--r--src/devices/bus/msx_slot/cartridge.cpp25
-rw-r--r--src/devices/bus/msx_slot/cartridge.h21
-rw-r--r--src/devices/bus/msx_slot/disk.cpp75
-rw-r--r--src/devices/bus/msx_slot/disk.h98
-rw-r--r--src/devices/bus/msx_slot/fs4600.cpp12
-rw-r--r--src/devices/bus/msx_slot/fs4600.h9
-rw-r--r--src/devices/bus/msx_slot/music.cpp11
-rw-r--r--src/devices/bus/msx_slot/music.h11
-rw-r--r--src/devices/bus/msx_slot/panasonic08.cpp12
-rw-r--r--src/devices/bus/msx_slot/panasonic08.h9
-rw-r--r--src/devices/bus/msx_slot/ram.cpp6
-rw-r--r--src/devices/bus/msx_slot/ram.h12
-rw-r--r--src/devices/bus/msx_slot/ram_mm.cpp22
-rw-r--r--src/devices/bus/msx_slot/ram_mm.h22
-rw-r--r--src/devices/bus/msx_slot/rom.cpp4
-rw-r--r--src/devices/bus/msx_slot/rom.h6
-rw-r--r--src/devices/bus/msx_slot/slot.cpp7
-rw-r--r--src/devices/bus/msx_slot/slot.h20
-rw-r--r--src/devices/bus/msx_slot/sony08.cpp12
-rw-r--r--src/devices/bus/msx_slot/sony08.h9
-rw-r--r--src/devices/bus/mtx/exp.cpp109
-rw-r--r--src/devices/bus/mtx/exp.h93
-rw-r--r--src/devices/bus/mtx/sdx.cpp425
-rw-r--r--src/devices/bus/mtx/sdx.h105
-rw-r--r--src/devices/bus/nasbus/avc.cpp15
-rw-r--r--src/devices/bus/nasbus/nasbus.cpp35
-rw-r--r--src/devices/bus/nasbus/nasbus.h42
-rw-r--r--src/devices/bus/neogeo/boot_cthd.cpp18
-rw-r--r--src/devices/bus/neogeo/boot_kof10th.cpp7
-rw-r--r--src/devices/bus/neogeo/boot_kof2k2.cpp39
-rw-r--r--src/devices/bus/neogeo/boot_kof2k3.cpp43
-rw-r--r--src/devices/bus/neogeo/boot_misc.cpp27
-rw-r--r--src/devices/bus/neogeo/boot_svc.cpp18
-rw-r--r--src/devices/bus/neogeo/cmc.cpp19
-rw-r--r--src/devices/bus/neogeo/cmc.h8
-rw-r--r--src/devices/bus/neogeo/fatfury2.cpp7
-rw-r--r--src/devices/bus/neogeo/kof2k2.cpp13
-rw-r--r--src/devices/bus/neogeo/kof98.cpp7
-rw-r--r--src/devices/bus/neogeo/mslugx.cpp7
-rw-r--r--src/devices/bus/neogeo/pcm2.cpp9
-rw-r--r--src/devices/bus/neogeo/prot_cmc.h5
-rw-r--r--src/devices/bus/neogeo/prot_cthd.h6
-rw-r--r--src/devices/bus/neogeo/prot_fatfury2.h5
-rw-r--r--src/devices/bus/neogeo/prot_kof2k2.h5
-rw-r--r--src/devices/bus/neogeo/prot_kof2k3bl.h5
-rw-r--r--src/devices/bus/neogeo/prot_kof98.h5
-rw-r--r--src/devices/bus/neogeo/prot_misc.h5
-rw-r--r--src/devices/bus/neogeo/prot_mslugx.h5
-rw-r--r--src/devices/bus/neogeo/prot_pcm2.h5
-rw-r--r--src/devices/bus/neogeo/prot_pvc.h5
-rw-r--r--src/devices/bus/neogeo/prot_sma.h5
-rw-r--r--src/devices/bus/neogeo/pvc.cpp11
-rw-r--r--src/devices/bus/neogeo/rom.cpp12
-rw-r--r--src/devices/bus/neogeo/rom.h8
-rw-r--r--src/devices/bus/neogeo/slot.h20
-rw-r--r--src/devices/bus/neogeo/sma.cpp9
-rw-r--r--src/devices/bus/neogeo_ctrl/ctrl.h32
-rw-r--r--src/devices/bus/nes/2a03pur.cpp4
-rw-r--r--src/devices/bus/nes/2a03pur.h4
-rw-r--r--src/devices/bus/nes/act53.cpp4
-rw-r--r--src/devices/bus/nes/act53.h4
-rw-r--r--src/devices/bus/nes/aladdin.cpp21
-rw-r--r--src/devices/bus/nes/aladdin.h23
-rw-r--r--src/devices/bus/nes/ave.cpp6
-rw-r--r--src/devices/bus/nes/ave.h6
-rw-r--r--src/devices/bus/nes/bandai.cpp40
-rw-r--r--src/devices/bus/nes/bandai.h22
-rw-r--r--src/devices/bus/nes/benshieng.cpp2
-rw-r--r--src/devices/bus/nes/benshieng.h2
-rw-r--r--src/devices/bus/nes/bootleg.cpp98
-rw-r--r--src/devices/bus/nes/bootleg.h98
-rw-r--r--src/devices/bus/nes/camerica.cpp6
-rw-r--r--src/devices/bus/nes/camerica.h8
-rw-r--r--src/devices/bus/nes/cne.cpp8
-rw-r--r--src/devices/bus/nes/cne.h8
-rw-r--r--src/devices/bus/nes/cony.cpp12
-rw-r--r--src/devices/bus/nes/cony.h12
-rw-r--r--src/devices/bus/nes/datach.cpp36
-rw-r--r--src/devices/bus/nes/datach.h24
-rw-r--r--src/devices/bus/nes/discrete.cpp8
-rw-r--r--src/devices/bus/nes/discrete.h8
-rw-r--r--src/devices/bus/nes/disksys.cpp19
-rw-r--r--src/devices/bus/nes/disksys.h12
-rw-r--r--src/devices/bus/nes/ggenie.cpp38
-rw-r--r--src/devices/bus/nes/ggenie.h22
-rw-r--r--src/devices/bus/nes/henggedianzi.cpp8
-rw-r--r--src/devices/bus/nes/henggedianzi.h8
-rw-r--r--src/devices/bus/nes/hes.cpp2
-rw-r--r--src/devices/bus/nes/hes.h2
-rw-r--r--src/devices/bus/nes/hosenkan.cpp2
-rw-r--r--src/devices/bus/nes/hosenkan.h2
-rw-r--r--src/devices/bus/nes/irem.cpp10
-rw-r--r--src/devices/bus/nes/irem.h10
-rw-r--r--src/devices/bus/nes/jaleco.cpp22
-rw-r--r--src/devices/bus/nes/jaleco.h28
-rw-r--r--src/devices/bus/nes/jy.cpp20
-rw-r--r--src/devices/bus/nes/jy.h14
-rw-r--r--src/devices/bus/nes/kaiser.cpp48
-rw-r--r--src/devices/bus/nes/kaiser.h46
-rw-r--r--src/devices/bus/nes/karastudio.cpp23
-rw-r--r--src/devices/bus/nes/karastudio.h25
-rw-r--r--src/devices/bus/nes/konami.cpp50
-rw-r--r--src/devices/bus/nes/konami.h18
-rw-r--r--src/devices/bus/nes/legacy.cpp12
-rw-r--r--src/devices/bus/nes/legacy.h14
-rw-r--r--src/devices/bus/nes/mmc1.cpp24
-rw-r--r--src/devices/bus/nes/mmc1.h18
-rw-r--r--src/devices/bus/nes/mmc2.cpp6
-rw-r--r--src/devices/bus/nes/mmc2.h6
-rw-r--r--src/devices/bus/nes/mmc3.cpp28
-rw-r--r--src/devices/bus/nes/mmc3.h20
-rw-r--r--src/devices/bus/nes/mmc3_clones.cpp202
-rw-r--r--src/devices/bus/nes/mmc3_clones.h112
-rw-r--r--src/devices/bus/nes/mmc5.cpp24
-rw-r--r--src/devices/bus/nes/mmc5.h20
-rw-r--r--src/devices/bus/nes/multigame.cpp128
-rw-r--r--src/devices/bus/nes/multigame.h122
-rw-r--r--src/devices/bus/nes/namcot.cpp44
-rw-r--r--src/devices/bus/nes/namcot.h40
-rw-r--r--src/devices/bus/nes/nanjing.cpp4
-rw-r--r--src/devices/bus/nes/nanjing.h4
-rw-r--r--src/devices/bus/nes/nes_slot.cpp63
-rw-r--r--src/devices/bus/nes/nes_slot.h51
-rw-r--r--src/devices/bus/nes/ntdec.cpp4
-rw-r--r--src/devices/bus/nes/ntdec.h4
-rw-r--r--src/devices/bus/nes/nxrom.cpp35
-rw-r--r--src/devices/bus/nes/nxrom.h28
-rw-r--r--src/devices/bus/nes/pirate.cpp48
-rw-r--r--src/devices/bus/nes/pirate.h46
-rw-r--r--src/devices/bus/nes/pt554.cpp2
-rw-r--r--src/devices/bus/nes/pt554.h2
-rw-r--r--src/devices/bus/nes/racermate.cpp2
-rw-r--r--src/devices/bus/nes/racermate.h2
-rw-r--r--src/devices/bus/nes/rcm.cpp12
-rw-r--r--src/devices/bus/nes/rcm.h14
-rw-r--r--src/devices/bus/nes/rexsoft.cpp8
-rw-r--r--src/devices/bus/nes/rexsoft.h10
-rw-r--r--src/devices/bus/nes/sachen.cpp26
-rw-r--r--src/devices/bus/nes/sachen.h34
-rw-r--r--src/devices/bus/nes/somari.cpp16
-rw-r--r--src/devices/bus/nes/somari.h12
-rw-r--r--src/devices/bus/nes/subor.cpp12
-rw-r--r--src/devices/bus/nes/subor.h10
-rw-r--r--src/devices/bus/nes/sunsoft.cpp30
-rw-r--r--src/devices/bus/nes/sunsoft.h24
-rw-r--r--src/devices/bus/nes/sunsoft_dcs.cpp27
-rw-r--r--src/devices/bus/nes/sunsoft_dcs.h27
-rw-r--r--src/devices/bus/nes/taito.cpp18
-rw-r--r--src/devices/bus/nes/taito.h14
-rw-r--r--src/devices/bus/nes/tengen.cpp8
-rw-r--r--src/devices/bus/nes/tengen.h8
-rw-r--r--src/devices/bus/nes/txc.cpp16
-rw-r--r--src/devices/bus/nes/txc.h16
-rw-r--r--src/devices/bus/nes/waixing.cpp46
-rw-r--r--src/devices/bus/nes/waixing.h36
-rw-r--r--src/devices/bus/nes/zemina.cpp2
-rw-r--r--src/devices/bus/nes/zemina.h2
-rw-r--r--src/devices/bus/nes_ctrl/fckeybrd.cpp11
-rw-r--r--src/devices/bus/nes_ctrl/miracle.cpp10
-rw-r--r--src/devices/bus/newbrain/eim.cpp25
-rw-r--r--src/devices/bus/newbrain/eim.h8
-rw-r--r--src/devices/bus/newbrain/exp.cpp16
-rw-r--r--src/devices/bus/newbrain/exp.h37
-rw-r--r--src/devices/bus/newbrain/fdc.cpp45
-rw-r--r--src/devices/bus/newbrain/fdc.h14
-rw-r--r--src/devices/bus/nubus/nubus.cpp56
-rw-r--r--src/devices/bus/nubus/nubus.h51
-rw-r--r--src/devices/bus/nubus/nubus_48gc.cpp19
-rw-r--r--src/devices/bus/nubus/nubus_asntmc3b.cpp13
-rw-r--r--src/devices/bus/nubus/nubus_cb264.cpp15
-rw-r--r--src/devices/bus/nubus/nubus_image.cpp7
-rw-r--r--src/devices/bus/nubus/nubus_m2hires.cpp15
-rw-r--r--src/devices/bus/nubus/nubus_m2video.cpp15
-rw-r--r--src/devices/bus/nubus/nubus_radiustpd.cpp13
-rw-r--r--src/devices/bus/nubus/nubus_spec8.cpp15
-rw-r--r--src/devices/bus/nubus/nubus_specpdq.cpp99
-rw-r--r--src/devices/bus/nubus/nubus_vikbw.cpp15
-rw-r--r--src/devices/bus/nubus/nubus_wsportrait.cpp15
-rw-r--r--src/devices/bus/nubus/pds30_30hr.cpp15
-rw-r--r--src/devices/bus/nubus/pds30_cb264.cpp15
-rw-r--r--src/devices/bus/nubus/pds30_mc30.cpp15
-rw-r--r--src/devices/bus/nubus/pds30_procolor816.cpp15
-rw-r--r--src/devices/bus/nubus/pds30_sigmalview.cpp15
-rw-r--r--src/devices/bus/odyssey2/chess.cpp11
-rw-r--r--src/devices/bus/odyssey2/slot.h16
-rw-r--r--src/devices/bus/odyssey2/voice.cpp7
-rw-r--r--src/devices/bus/pc1512/mouse.h37
-rw-r--r--src/devices/bus/pc_kbd/ec1841.cpp33
-rw-r--r--src/devices/bus/pc_kbd/iskr1030.cpp39
-rw-r--r--src/devices/bus/pc_kbd/pc_kbdc.cpp24
-rw-r--r--src/devices/bus/pc_kbd/pc_kbdc.h17
-rw-r--r--src/devices/bus/pce/pce_slot.h22
-rw-r--r--src/devices/bus/pet/2joysnd.cpp11
-rw-r--r--src/devices/bus/pet/64k.cpp6
-rw-r--r--src/devices/bus/pet/64k.h6
-rw-r--r--src/devices/bus/pet/c2n.cpp13
-rw-r--r--src/devices/bus/pet/cass.h13
-rw-r--r--src/devices/bus/pet/cb2snd.cpp11
-rw-r--r--src/devices/bus/pet/exp.cpp12
-rw-r--r--src/devices/bus/pet/exp.h32
-rw-r--r--src/devices/bus/pet/hsg.cpp66
-rw-r--r--src/devices/bus/pet/hsg.h9
-rw-r--r--src/devices/bus/pet/superpet.cpp16
-rw-r--r--src/devices/bus/pet/superpet.h6
-rw-r--r--src/devices/bus/plus4/c1551.cpp38
-rw-r--r--src/devices/bus/plus4/c1551.h26
-rw-r--r--src/devices/bus/plus4/exp.cpp8
-rw-r--r--src/devices/bus/plus4/exp.h43
-rw-r--r--src/devices/bus/plus4/sid.cpp20
-rw-r--r--src/devices/bus/plus4/sid.h4
-rw-r--r--src/devices/bus/plus4/std.cpp2
-rw-r--r--src/devices/bus/plus4/std.h2
-rw-r--r--src/devices/bus/pofo/ccm.h31
-rw-r--r--src/devices/bus/pofo/exp.h44
-rw-r--r--src/devices/bus/pofo/hpc101.cpp37
-rw-r--r--src/devices/bus/pofo/hpc101.h4
-rw-r--r--src/devices/bus/pofo/hpc102.cpp8
-rw-r--r--src/devices/bus/pofo/hpc102.h4
-rw-r--r--src/devices/bus/pofo/hpc104.cpp27
-rw-r--r--src/devices/bus/pofo/hpc104.h4
-rw-r--r--src/devices/bus/pofo/ram.cpp4
-rw-r--r--src/devices/bus/pofo/ram.h4
-rw-r--r--src/devices/bus/pofo/rom.cpp2
-rw-r--r--src/devices/bus/pofo/rom.h2
-rw-r--r--src/devices/bus/psi_kbd/ergoline.cpp11
-rw-r--r--src/devices/bus/psi_kbd/psi_kbd.h34
-rw-r--r--src/devices/bus/psx/ctlrport.cpp7
-rw-r--r--src/devices/bus/psx/ctlrport.h5
-rw-r--r--src/devices/bus/psx/gamebooster.cpp8
-rw-r--r--src/devices/bus/psx/memcard.h2
-rw-r--r--src/devices/bus/ql/cst_q_plus4.cpp43
-rw-r--r--src/devices/bus/ql/cst_q_plus4.h4
-rw-r--r--src/devices/bus/ql/cst_qdisc.cpp4
-rw-r--r--src/devices/bus/ql/cst_qdisc.h4
-rw-r--r--src/devices/bus/ql/cumana_fdi.cpp4
-rw-r--r--src/devices/bus/ql/cumana_fdi.h4
-rw-r--r--src/devices/bus/ql/exp.h34
-rw-r--r--src/devices/bus/ql/kempston_di.cpp4
-rw-r--r--src/devices/bus/ql/kempston_di.h4
-rw-r--r--src/devices/bus/ql/miracle_gold_card.cpp4
-rw-r--r--src/devices/bus/ql/miracle_gold_card.h4
-rw-r--r--src/devices/bus/ql/miracle_hd.cpp4
-rw-r--r--src/devices/bus/ql/miracle_hd.h4
-rw-r--r--src/devices/bus/ql/mp_fdi.cpp4
-rw-r--r--src/devices/bus/ql/mp_fdi.h4
-rw-r--r--src/devices/bus/ql/opd_basic_master.cpp4
-rw-r--r--src/devices/bus/ql/opd_basic_master.h4
-rw-r--r--src/devices/bus/ql/pcml_qdisk.cpp4
-rw-r--r--src/devices/bus/ql/pcml_qdisk.h4
-rw-r--r--src/devices/bus/ql/qubide.cpp4
-rw-r--r--src/devices/bus/ql/qubide.h4
-rw-r--r--src/devices/bus/ql/rom.h8
-rw-r--r--src/devices/bus/ql/sandy_superdisk.cpp4
-rw-r--r--src/devices/bus/ql/sandy_superdisk.h4
-rw-r--r--src/devices/bus/ql/sandy_superqboard.cpp4
-rw-r--r--src/devices/bus/ql/sandy_superqboard.h4
-rw-r--r--src/devices/bus/ql/std.cpp2
-rw-r--r--src/devices/bus/ql/std.h2
-rw-r--r--src/devices/bus/ql/trumpcard.cpp4
-rw-r--r--src/devices/bus/ql/trumpcard.h4
-rw-r--r--src/devices/bus/rs232/null_modem.cpp7
-rw-r--r--src/devices/bus/rs232/printer.cpp9
-rw-r--r--src/devices/bus/rs232/xvd701.cpp5
-rw-r--r--src/devices/bus/s100/dj2db.cpp8
-rw-r--r--src/devices/bus/s100/dj2db.h8
-rw-r--r--src/devices/bus/s100/djdma.cpp2
-rw-r--r--src/devices/bus/s100/djdma.h2
-rw-r--r--src/devices/bus/s100/mm65k16s.cpp4
-rw-r--r--src/devices/bus/s100/mm65k16s.h4
-rw-r--r--src/devices/bus/s100/nsmdsa.cpp14
-rw-r--r--src/devices/bus/s100/nsmdsa.h5
-rw-r--r--src/devices/bus/s100/nsmdsad.cpp14
-rw-r--r--src/devices/bus/s100/nsmdsad.h5
-rw-r--r--src/devices/bus/s100/s100.cpp16
-rw-r--r--src/devices/bus/s100/s100.h121
-rw-r--r--src/devices/bus/s100/seals8k.cpp8
-rw-r--r--src/devices/bus/s100/wunderbus.cpp16
-rw-r--r--src/devices/bus/s100/wunderbus.h4
-rw-r--r--src/devices/bus/saturn/sat_slot.h16
-rw-r--r--src/devices/bus/sbus/cgthree.cpp4
-rw-r--r--src/devices/bus/scsi/omti5100.cpp9
-rw-r--r--src/devices/bus/scsi/s1410.cpp17
-rw-r--r--src/devices/bus/scsi/sa1403d.cpp7
-rw-r--r--src/devices/bus/scsi/scsi.h88
-rw-r--r--src/devices/bus/scsi/scsicd.cpp10
-rw-r--r--src/devices/bus/scsi/scsihd.cpp8
-rw-r--r--src/devices/bus/scsi/scsihle.h6
-rw-r--r--src/devices/bus/scv/slot.h16
-rw-r--r--src/devices/bus/sega8/ccatch.cpp7
-rw-r--r--src/devices/bus/sega8/mgear.cpp9
-rw-r--r--src/devices/bus/sega8/rom.cpp112
-rw-r--r--src/devices/bus/sega8/rom.h56
-rw-r--r--src/devices/bus/sega8/sega8_slot.cpp91
-rw-r--r--src/devices/bus/sega8/sega8_slot.h262
-rw-r--r--src/devices/bus/sg1000_exp/fm_unit.cpp13
-rw-r--r--src/devices/bus/sg1000_exp/kblink.cpp179
-rw-r--r--src/devices/bus/sg1000_exp/kblink.h82
-rw-r--r--src/devices/bus/sg1000_exp/sg1000exp.h26
-rw-r--r--src/devices/bus/sg1000_exp/sk1100.cpp45
-rw-r--r--src/devices/bus/sg1000_exp/sk1100.h3
-rw-r--r--src/devices/bus/sg1000_exp/sk1100prn.cpp125
-rw-r--r--src/devices/bus/sg1000_exp/sk1100prn.h88
-rw-r--r--src/devices/bus/sms_ctrl/multitap.cpp21
-rw-r--r--src/devices/bus/sms_ctrl/rfu.cpp11
-rw-r--r--src/devices/bus/sms_ctrl/smsctrl.h34
-rw-r--r--src/devices/bus/sms_exp/gender.cpp7
-rw-r--r--src/devices/bus/sms_exp/smsexp.h23
-rw-r--r--src/devices/bus/snes/bsx.cpp38
-rw-r--r--src/devices/bus/snes/bsx.h32
-rw-r--r--src/devices/bus/snes/event.cpp23
-rw-r--r--src/devices/bus/snes/event.h12
-rw-r--r--src/devices/bus/snes/rom.cpp54
-rw-r--r--src/devices/bus/snes/rom.h54
-rw-r--r--src/devices/bus/snes/rom21.cpp8
-rw-r--r--src/devices/bus/snes/rom21.h8
-rw-r--r--src/devices/bus/snes/sa1.cpp87
-rw-r--r--src/devices/bus/snes/sa1.h32
-rw-r--r--src/devices/bus/snes/sdd1.cpp14
-rw-r--r--src/devices/bus/snes/sdd1.h12
-rw-r--r--src/devices/bus/snes/sfx.cpp26
-rw-r--r--src/devices/bus/snes/sfx.h26
-rw-r--r--src/devices/bus/snes/sgb.cpp44
-rw-r--r--src/devices/bus/snes/sgb.h33
-rw-r--r--src/devices/bus/snes/snes_slot.cpp51
-rw-r--r--src/devices/bus/snes/snes_slot.h36
-rw-r--r--src/devices/bus/snes/spc7110.cpp12
-rw-r--r--src/devices/bus/snes/spc7110.h20
-rw-r--r--src/devices/bus/snes/sufami.cpp26
-rw-r--r--src/devices/bus/snes/sufami.h10
-rw-r--r--src/devices/bus/snes/upd.cpp170
-rw-r--r--src/devices/bus/snes/upd.h30
-rw-r--r--src/devices/bus/snes_ctrl/ctrl.h22
-rw-r--r--src/devices/bus/snes_ctrl/miracle.cpp10
-rw-r--r--src/devices/bus/snes_ctrl/multitap.cpp13
-rw-r--r--src/devices/bus/spc1000/exp.h9
-rw-r--r--src/devices/bus/spectrum/beta.cpp256
-rw-r--r--src/devices/bus/spectrum/beta.h64
-rw-r--r--src/devices/bus/spectrum/exp.cpp63
-rw-r--r--src/devices/bus/spectrum/exp.h22
-rw-r--r--src/devices/bus/spectrum/fuller.cpp65
-rw-r--r--src/devices/bus/spectrum/fuller.h11
-rw-r--r--src/devices/bus/spectrum/intf1.cpp47
-rw-r--r--src/devices/bus/spectrum/intf1.h8
-rw-r--r--src/devices/bus/spectrum/intf2.cpp19
-rw-r--r--src/devices/bus/spectrum/intf2.h4
-rw-r--r--src/devices/bus/spectrum/kempjoy.cpp20
-rw-r--r--src/devices/bus/spectrum/kempjoy.h5
-rw-r--r--src/devices/bus/spectrum/melodik.cpp55
-rw-r--r--src/devices/bus/spectrum/melodik.h9
-rw-r--r--src/devices/bus/spectrum/mface.cpp321
-rw-r--r--src/devices/bus/spectrum/mface.h100
-rw-r--r--src/devices/bus/spectrum/mikroplus.cpp22
-rw-r--r--src/devices/bus/spectrum/mikroplus.h6
-rw-r--r--src/devices/bus/spectrum/opus.cpp289
-rw-r--r--src/devices/bus/spectrum/opus.h75
-rw-r--r--src/devices/bus/spectrum/plus2test.cpp2
-rw-r--r--src/devices/bus/spectrum/plus2test.h2
-rw-r--r--src/devices/bus/spectrum/protek.cpp17
-rw-r--r--src/devices/bus/spectrum/protek.h2
-rw-r--r--src/devices/bus/spectrum/specdrum.cpp73
-rw-r--r--src/devices/bus/spectrum/specdrum.h51
-rw-r--r--src/devices/bus/spectrum/uslot.cpp38
-rw-r--r--src/devices/bus/spectrum/uslot.h8
-rw-r--r--src/devices/bus/spectrum/usource.cpp13
-rw-r--r--src/devices/bus/spectrum/usource.h3
-rw-r--r--src/devices/bus/spectrum/uspeech.cpp40
-rw-r--r--src/devices/bus/spectrum/uspeech.h6
-rw-r--r--src/devices/bus/ss50/interface.cpp10
-rw-r--r--src/devices/bus/ss50/interface.h37
-rw-r--r--src/devices/bus/ss50/mpc.cpp23
-rw-r--r--src/devices/bus/ss50/mps.cpp12
-rw-r--r--src/devices/bus/sunkbd/hlekbd.cpp8
-rw-r--r--src/devices/bus/svi3x8/expander/expander.cpp16
-rw-r--r--src/devices/bus/svi3x8/expander/expander.h74
-rw-r--r--src/devices/bus/svi3x8/expander/sv601.cpp35
-rw-r--r--src/devices/bus/svi3x8/expander/sv601.h8
-rw-r--r--src/devices/bus/svi3x8/expander/sv602.cpp23
-rw-r--r--src/devices/bus/svi3x8/expander/sv602.h8
-rw-r--r--src/devices/bus/svi3x8/expander/sv603.cpp119
-rw-r--r--src/devices/bus/svi3x8/expander/sv603.h17
-rw-r--r--src/devices/bus/svi3x8/slot/slot.cpp35
-rw-r--r--src/devices/bus/svi3x8/slot/slot.h55
-rw-r--r--src/devices/bus/svi3x8/slot/sv801.cpp8
-rw-r--r--src/devices/bus/svi3x8/slot/sv801.h6
-rw-r--r--src/devices/bus/svi3x8/slot/sv802.cpp16
-rw-r--r--src/devices/bus/svi3x8/slot/sv802.h4
-rw-r--r--src/devices/bus/svi3x8/slot/sv803.cpp4
-rw-r--r--src/devices/bus/svi3x8/slot/sv803.h4
-rw-r--r--src/devices/bus/svi3x8/slot/sv805.cpp8
-rw-r--r--src/devices/bus/svi3x8/slot/sv805.h4
-rw-r--r--src/devices/bus/svi3x8/slot/sv806.cpp14
-rw-r--r--src/devices/bus/svi3x8/slot/sv806.h8
-rw-r--r--src/devices/bus/svi3x8/slot/sv807.cpp4
-rw-r--r--src/devices/bus/svi3x8/slot/sv807.h4
-rw-r--r--src/devices/bus/ti8x/bitsocket.cpp7
-rw-r--r--src/devices/bus/ti8x/teeconn.cpp19
-rw-r--r--src/devices/bus/ti8x/ti8x.h11
-rw-r--r--src/devices/bus/ti8x/tispeaker.cpp19
-rw-r--r--src/devices/bus/ti99/gromport/cartridges.cpp56
-rw-r--r--src/devices/bus/ti99/gromport/cartridges.h36
-rw-r--r--src/devices/bus/ti99/gromport/gkracker.cpp12
-rw-r--r--src/devices/bus/ti99/gromport/gkracker.h4
-rw-r--r--src/devices/bus/ti99/gromport/gromport.cpp12
-rw-r--r--src/devices/bus/ti99/gromport/gromport.h9
-rw-r--r--src/devices/bus/ti99/gromport/multiconn.cpp16
-rw-r--r--src/devices/bus/ti99/gromport/multiconn.h4
-rw-r--r--src/devices/bus/ti99/gromport/singleconn.cpp12
-rw-r--r--src/devices/bus/ti99/gromport/singleconn.h4
-rw-r--r--src/devices/bus/ti99/internal/992board.cpp10
-rw-r--r--src/devices/bus/ti99/internal/992board.h4
-rw-r--r--src/devices/bus/ti99/internal/998board.cpp78
-rw-r--r--src/devices/bus/ti99/internal/998board.h29
-rw-r--r--src/devices/bus/ti99/internal/datamux.cpp75
-rw-r--r--src/devices/bus/ti99/internal/datamux.h19
-rw-r--r--src/devices/bus/ti99/internal/genboard.cpp48
-rw-r--r--src/devices/bus/ti99/internal/genboard.h14
-rw-r--r--src/devices/bus/ti99/internal/ioport.cpp14
-rw-r--r--src/devices/bus/ti99/internal/ioport.h20
-rw-r--r--src/devices/bus/ti99/joyport/handset.cpp1
-rw-r--r--src/devices/bus/ti99/peb/bwg.cpp12
-rw-r--r--src/devices/bus/ti99/peb/bwg.h4
-rw-r--r--src/devices/bus/ti99/peb/evpc.cpp11
-rw-r--r--src/devices/bus/ti99/peb/evpc.h4
-rw-r--r--src/devices/bus/ti99/peb/hfdc.cpp22
-rw-r--r--src/devices/bus/ti99/peb/hfdc.h10
-rw-r--r--src/devices/bus/ti99/peb/horizon.cpp4
-rw-r--r--src/devices/bus/ti99/peb/horizon.h4
-rw-r--r--src/devices/bus/ti99/peb/hsgpl.cpp44
-rw-r--r--src/devices/bus/ti99/peb/hsgpl.h14
-rw-r--r--src/devices/bus/ti99/peb/memex.cpp7
-rw-r--r--src/devices/bus/ti99/peb/memex.h4
-rw-r--r--src/devices/bus/ti99/peb/myarcmem.cpp4
-rw-r--r--src/devices/bus/ti99/peb/myarcmem.h4
-rw-r--r--src/devices/bus/ti99/peb/pcode.cpp8
-rw-r--r--src/devices/bus/ti99/peb/pcode.h6
-rw-r--r--src/devices/bus/ti99/peb/peribox.cpp28
-rw-r--r--src/devices/bus/ti99/peb/peribox.h12
-rw-r--r--src/devices/bus/ti99/peb/samsmem.cpp4
-rw-r--r--src/devices/bus/ti99/peb/samsmem.h4
-rw-r--r--src/devices/bus/ti99/peb/spchsyn.cpp13
-rw-r--r--src/devices/bus/ti99/peb/spchsyn.h5
-rw-r--r--src/devices/bus/ti99/peb/ti_32kmem.cpp7
-rw-r--r--src/devices/bus/ti99/peb/ti_32kmem.h4
-rw-r--r--src/devices/bus/ti99/peb/ti_fdc.cpp8
-rw-r--r--src/devices/bus/ti99/peb/ti_fdc.h4
-rw-r--r--src/devices/bus/ti99/peb/ti_rs232.cpp27
-rw-r--r--src/devices/bus/ti99/peb/ti_rs232.h12
-rw-r--r--src/devices/bus/ti99/peb/tn_ide.cpp26
-rw-r--r--src/devices/bus/ti99/peb/tn_ide.h4
-rw-r--r--src/devices/bus/ti99/peb/tn_usbsm.cpp18
-rw-r--r--src/devices/bus/ti99/peb/tn_usbsm.h4
-rw-r--r--src/devices/bus/ti99/ti99defs.h8
-rw-r--r--src/devices/bus/ti99x/990_dk.cpp17
-rw-r--r--src/devices/bus/ti99x/990_hd.cpp12
-rw-r--r--src/devices/bus/ti99x/990_hd.h3
-rw-r--r--src/devices/bus/ti99x/990_tap.cpp22
-rw-r--r--src/devices/bus/ti99x/990_tap.h3
-rw-r--r--src/devices/bus/tiki100/8088.cpp17
-rw-r--r--src/devices/bus/tiki100/8088.h4
-rw-r--r--src/devices/bus/tiki100/exp.cpp16
-rw-r--r--src/devices/bus/tiki100/exp.h72
-rw-r--r--src/devices/bus/tiki100/hdc.cpp8
-rw-r--r--src/devices/bus/tiki100/hdc.h4
-rw-r--r--src/devices/bus/tmc600/euro.h23
-rw-r--r--src/devices/bus/tvc/tvc.h26
-rw-r--r--src/devices/bus/uts_kbd/400kbd.cpp275
-rw-r--r--src/devices/bus/uts_kbd/400kbd.h44
-rw-r--r--src/devices/bus/uts_kbd/extw.cpp290
-rw-r--r--src/devices/bus/uts_kbd/extw.h47
-rw-r--r--src/devices/bus/uts_kbd/uts_kbd.cpp89
-rw-r--r--src/devices/bus/uts_kbd/uts_kbd.h101
-rw-r--r--src/devices/bus/vboy/slot.h15
-rw-r--r--src/devices/bus/vc4000/rom.cpp12
-rw-r--r--src/devices/bus/vc4000/rom.h12
-rw-r--r--src/devices/bus/vc4000/slot.cpp16
-rw-r--r--src/devices/bus/vc4000/slot.h16
-rw-r--r--src/devices/bus/vcs/dpc.cpp7
-rw-r--r--src/devices/bus/vcs/harmony_melody.cpp9
-rw-r--r--src/devices/bus/vcs/scharger.cpp18
-rw-r--r--src/devices/bus/vcs_ctrl/ctrl.h17
-rw-r--r--src/devices/bus/vectrex/slot.h4
-rw-r--r--src/devices/bus/vic10/exp.cpp8
-rw-r--r--src/devices/bus/vic10/exp.h8
-rw-r--r--src/devices/bus/vic10/multimax.cpp4
-rw-r--r--src/devices/bus/vic10/multimax.h4
-rw-r--r--src/devices/bus/vic10/std.cpp4
-rw-r--r--src/devices/bus/vic10/std.h4
-rw-r--r--src/devices/bus/vic20/exp.cpp8
-rw-r--r--src/devices/bus/vic20/exp.h8
-rw-r--r--src/devices/bus/vic20/fe3.cpp38
-rw-r--r--src/devices/bus/vic20/fe3.h4
-rw-r--r--src/devices/bus/vic20/megacart.cpp11
-rw-r--r--src/devices/bus/vic20/megacart.h4
-rw-r--r--src/devices/bus/vic20/speakeasy.cpp16
-rw-r--r--src/devices/bus/vic20/speakeasy.h4
-rw-r--r--src/devices/bus/vic20/std.cpp2
-rw-r--r--src/devices/bus/vic20/std.h2
-rw-r--r--src/devices/bus/vic20/vic1010.cpp8
-rw-r--r--src/devices/bus/vic20/vic1010.h4
-rw-r--r--src/devices/bus/vic20/vic1110.cpp4
-rw-r--r--src/devices/bus/vic20/vic1110.h4
-rw-r--r--src/devices/bus/vic20/vic1111.cpp4
-rw-r--r--src/devices/bus/vic20/vic1111.h4
-rw-r--r--src/devices/bus/vic20/vic1112.cpp4
-rw-r--r--src/devices/bus/vic20/vic1112.h4
-rw-r--r--src/devices/bus/vic20/vic1210.cpp4
-rw-r--r--src/devices/bus/vic20/vic1210.h4
-rw-r--r--src/devices/bus/vic20/videopak.cpp29
-rw-r--r--src/devices/bus/vic20/videopak.h4
-rw-r--r--src/devices/bus/vidbrain/exp.cpp8
-rw-r--r--src/devices/bus/vidbrain/exp.h52
-rw-r--r--src/devices/bus/vidbrain/money_minder.cpp4
-rw-r--r--src/devices/bus/vidbrain/money_minder.h4
-rw-r--r--src/devices/bus/vidbrain/std.cpp2
-rw-r--r--src/devices/bus/vidbrain/std.h2
-rw-r--r--src/devices/bus/vidbrain/timeshare.cpp4
-rw-r--r--src/devices/bus/vidbrain/timeshare.h4
-rw-r--r--src/devices/bus/vip/byteio.h28
-rw-r--r--src/devices/bus/vip/exp.cpp26
-rw-r--r--src/devices/bus/vip/exp.h62
-rw-r--r--src/devices/bus/vip/vp550.cpp20
-rw-r--r--src/devices/bus/vip/vp550.h10
-rw-r--r--src/devices/bus/vip/vp570.cpp4
-rw-r--r--src/devices/bus/vip/vp570.h4
-rw-r--r--src/devices/bus/vip/vp575.cpp82
-rw-r--r--src/devices/bus/vip/vp575.h12
-rw-r--r--src/devices/bus/vip/vp585.cpp2
-rw-r--r--src/devices/bus/vip/vp585.h2
-rw-r--r--src/devices/bus/vip/vp590.cpp15
-rw-r--r--src/devices/bus/vip/vp590.h6
-rw-r--r--src/devices/bus/vip/vp595.cpp4
-rw-r--r--src/devices/bus/vip/vp595.h2
-rw-r--r--src/devices/bus/vip/vp620.cpp2
-rw-r--r--src/devices/bus/vip/vp700.cpp2
-rw-r--r--src/devices/bus/vip/vp700.h2
-rw-r--r--src/devices/bus/vme/vme.cpp30
-rw-r--r--src/devices/bus/vme/vme.h43
-rw-r--r--src/devices/bus/vme/vme_fccpu20.cpp64
-rw-r--r--src/devices/bus/vme/vme_fccpu20.h3
-rw-r--r--src/devices/bus/vme/vme_hcpu30.h2
-rw-r--r--src/devices/bus/vme/vme_mvme350.cpp11
-rw-r--r--src/devices/bus/vme/vme_mzr8105.cpp12
-rw-r--r--src/devices/bus/vme/vme_mzr8300.cpp4
-rw-r--r--src/devices/bus/vsmile/pad.cpp275
-rw-r--r--src/devices/bus/vsmile/pad.h78
-rw-r--r--src/devices/bus/vsmile/rom.cpp86
-rw-r--r--src/devices/bus/vsmile/rom.h59
-rw-r--r--src/devices/bus/vsmile/vsmile_ctrl.cpp315
-rw-r--r--src/devices/bus/vsmile/vsmile_ctrl.h153
-rw-r--r--src/devices/bus/vsmile/vsmile_slot.cpp254
-rw-r--r--src/devices/bus/vsmile/vsmile_slot.h128
-rw-r--r--src/devices/bus/vtech/ioexp/ioexp.cpp11
-rw-r--r--src/devices/bus/vtech/ioexp/ioexp.h4
-rw-r--r--src/devices/bus/vtech/ioexp/printer.cpp13
-rw-r--r--src/devices/bus/vtech/memexp/floppy.cpp3
-rw-r--r--src/devices/bus/vtech/memexp/memexp.cpp44
-rw-r--r--src/devices/bus/vtech/memexp/memexp.h9
-rw-r--r--src/devices/bus/wangpc/emb.cpp8
-rw-r--r--src/devices/bus/wangpc/emb.h8
-rw-r--r--src/devices/bus/wangpc/lic.cpp14
-rw-r--r--src/devices/bus/wangpc/lic.h8
-rw-r--r--src/devices/bus/wangpc/lvc.cpp33
-rw-r--r--src/devices/bus/wangpc/lvc.h8
-rw-r--r--src/devices/bus/wangpc/mcc.cpp14
-rw-r--r--src/devices/bus/wangpc/mcc.h4
-rw-r--r--src/devices/bus/wangpc/mvc.cpp31
-rw-r--r--src/devices/bus/wangpc/mvc.h8
-rw-r--r--src/devices/bus/wangpc/rtc.cpp8
-rw-r--r--src/devices/bus/wangpc/rtc.h8
-rw-r--r--src/devices/bus/wangpc/tig.cpp47
-rw-r--r--src/devices/bus/wangpc/tig.h8
-rw-r--r--src/devices/bus/wangpc/wangpc.cpp24
-rw-r--r--src/devices/bus/wangpc/wangpc.h117
-rw-r--r--src/devices/bus/wangpc/wdc.cpp30
-rw-r--r--src/devices/bus/wangpc/wdc.h12
-rw-r--r--src/devices/bus/wswan/rom.cpp26
-rw-r--r--src/devices/bus/wswan/rom.h20
-rw-r--r--src/devices/bus/wswan/slot.cpp28
-rw-r--r--src/devices/bus/wswan/slot.h28
-rw-r--r--src/devices/bus/x68k/x68k_midi.cpp18
-rw-r--r--src/devices/bus/x68k/x68k_neptunex.cpp17
-rw-r--r--src/devices/bus/x68k/x68k_scsiext.cpp20
-rw-r--r--src/devices/bus/x68k/x68kexp.cpp1
-rw-r--r--src/devices/bus/x68k/x68kexp.h40
-rw-r--r--src/devices/bus/z88/flash.cpp4
-rw-r--r--src/devices/bus/z88/z88.h19
-rw-r--r--src/devices/cpu/8x300/8x300.cpp330
-rw-r--r--src/devices/cpu/8x300/8x300.h47
-rw-r--r--src/devices/cpu/8x300/8x300dasm.cpp8
-rw-r--r--src/devices/cpu/alpha/alpha.cpp995
-rw-r--r--src/devices/cpu/alpha/alpha.h284
-rw-r--r--src/devices/cpu/alpha/alphad.cpp1245
-rw-r--r--src/devices/cpu/alpha/alphad.h40
-rw-r--r--src/devices/cpu/alpha/common.h19
-rw-r--r--src/devices/cpu/alto2/a2ether.cpp10
-rw-r--r--src/devices/cpu/amis2000/amis2000.h3
-rw-r--r--src/devices/cpu/amis2000/amis2000op.cpp11
-rw-r--r--src/devices/cpu/arm7/lpc210x.cpp7
-rw-r--r--src/devices/cpu/cosmac/cosmac.cpp2
-rw-r--r--src/devices/cpu/dspp/dspp.h18
-rw-r--r--src/devices/cpu/dspp/dsppdrc.cpp334
-rw-r--r--src/devices/cpu/e132xs/e132xs.h2
-rw-r--r--src/devices/cpu/f8/f8.cpp692
-rw-r--r--src/devices/cpu/f8/f8.h3
-rw-r--r--src/devices/cpu/g65816/g65816.cpp7
-rw-r--r--src/devices/cpu/g65816/g65816.h7
-rw-r--r--src/devices/cpu/g65816/g65816ds.cpp2
-rw-r--r--src/devices/cpu/g65816/g65816op.h3
-rw-r--r--src/devices/cpu/h8/h83003.cpp3
-rw-r--r--src/devices/cpu/hmcs40/hmcs40.cpp1
-rw-r--r--src/devices/cpu/hpc/hpc.cpp144
-rw-r--r--src/devices/cpu/hpc/hpc.h88
-rw-r--r--src/devices/cpu/hpc/hpcdasm.cpp764
-rw-r--r--src/devices/cpu/hpc/hpcdasm.h58
-rw-r--r--src/devices/cpu/hphybrid/hphybrid.cpp45
-rw-r--r--src/devices/cpu/hphybrid/hphybrid.h28
-rw-r--r--src/devices/cpu/i386/cache.h258
-rw-r--r--src/devices/cpu/i386/cpuidmsrs.hxx94
-rw-r--r--src/devices/cpu/i386/i386.cpp236
-rw-r--r--src/devices/cpu/i386/i386.h52
-rw-r--r--src/devices/cpu/i386/i386priv.h32
-rw-r--r--src/devices/cpu/i386/i486ops.hxx8
-rw-r--r--src/devices/cpu/i386/pentops.hxx13
-rw-r--r--src/devices/cpu/i8089/i8089.cpp2
-rw-r--r--src/devices/cpu/i8089/i8089_channel.cpp7
-rw-r--r--src/devices/cpu/i86/i186.cpp29
-rw-r--r--src/devices/cpu/i86/i186.h12
-rw-r--r--src/devices/cpu/i86/i86.cpp2
-rw-r--r--src/devices/cpu/m6502/dxavix2000.lst2
-rw-r--r--src/devices/cpu/m6502/oxavix.lst8
-rw-r--r--src/devices/cpu/m6502/oxavix2000.lst13
-rw-r--r--src/devices/cpu/m6502/xavix.h4
-rw-r--r--src/devices/cpu/m6502/xavix2000.cpp101
-rw-r--r--src/devices/cpu/m6502/xavix2000.h11
-rw-r--r--src/devices/cpu/m68000/m68000.h19
-rw-r--r--src/devices/cpu/m68000/m68k_in.cpp1
-rw-r--r--src/devices/cpu/m68000/m68kcpu.cpp21
-rw-r--r--src/devices/cpu/m68000/m68kmmu.h2
-rw-r--r--src/devices/cpu/m6809/6x09dasm.cpp22
-rw-r--r--src/devices/cpu/m6809/6x09dasm.h6
-rw-r--r--src/devices/cpu/mcs51/mcs51.cpp12
-rw-r--r--src/devices/cpu/mcs51/mcs51.h4
-rw-r--r--src/devices/cpu/mips/mips1.cpp2118
-rw-r--r--src/devices/cpu/mips/mips1.h208
-rw-r--r--src/devices/cpu/mips/mips3.cpp74
-rw-r--r--src/devices/cpu/mips/mips3.h3
-rw-r--r--src/devices/cpu/mips/mips3com.cpp7
-rw-r--r--src/devices/cpu/mips/mips3drc.cpp59
-rw-r--r--src/devices/cpu/mips/mips3fe.cpp4
-rw-r--r--src/devices/cpu/mips/r4000.cpp3067
-rw-r--r--src/devices/cpu/mips/r4000.h463
-rw-r--r--src/devices/cpu/nec/v5x.cpp8
-rw-r--r--src/devices/cpu/ns32000/ns32000.cpp160
-rw-r--r--src/devices/cpu/ns32000/ns32000.h149
-rw-r--r--src/devices/cpu/ns32000/ns32000dasm.cpp835
-rw-r--r--src/devices/cpu/ns32000/ns32000dasm.h117
-rw-r--r--src/devices/cpu/pic16c5x/pic16c5x.cpp4
-rw-r--r--src/devices/cpu/sh/sh2.cpp2
-rw-r--r--src/devices/cpu/sm510/sm510base.cpp4
-rw-r--r--src/devices/cpu/tms1000/tms0270.cpp7
-rw-r--r--src/devices/cpu/tms1000/tms0270.h9
-rw-r--r--src/devices/cpu/tms1000/tms1000c.cpp18
-rw-r--r--src/devices/cpu/tms1000/tms1000c.h1
-rw-r--r--src/devices/cpu/tms1000/tms1k_base.cpp19
-rw-r--r--src/devices/cpu/tms1000/tms1k_base.h18
-rw-r--r--src/devices/cpu/tms34010/tms34010.cpp91
-rw-r--r--src/devices/cpu/tms34010/tms34010.h26
-rw-r--r--src/devices/cpu/tms9900/tms9900.cpp87
-rw-r--r--src/devices/cpu/tms9900/tms9995.cpp108
-rw-r--r--src/devices/cpu/tms9900/tms9995.h2
-rw-r--r--src/devices/cpu/unsp/unsp.cpp840
-rw-r--r--src/devices/cpu/unsp/unsp.h181
-rw-r--r--src/devices/cpu/unsp/unspdefs.h22
-rw-r--r--src/devices/cpu/unsp/unspdrc.cpp1316
-rw-r--r--src/devices/cpu/unsp/unspfe.cpp357
-rw-r--r--src/devices/cpu/unsp/unspfe.h27
-rw-r--r--src/devices/cpu/z8/z8.cpp542
-rw-r--r--src/devices/cpu/z8/z8.h56
-rw-r--r--src/devices/cpu/z8/z8dasm.cpp5
-rw-r--r--src/devices/cpu/z80/kl5c80a12.cpp5
-rw-r--r--src/devices/imagedev/bitbngr.h4
-rw-r--r--src/devices/imagedev/cassette.h21
-rw-r--r--src/devices/imagedev/chd_cd.h11
-rw-r--r--src/devices/imagedev/diablo.h16
-rw-r--r--src/devices/imagedev/flopdrv.h40
-rw-r--r--src/devices/imagedev/floppy.cpp5
-rw-r--r--src/devices/imagedev/floppy.h13
-rw-r--r--src/devices/imagedev/harddriv.h5
-rw-r--r--src/devices/imagedev/mfmhd.cpp2
-rw-r--r--src/devices/imagedev/midiin.h5
-rw-r--r--src/devices/imagedev/midiout.h8
-rw-r--r--src/devices/imagedev/printer.h4
-rw-r--r--src/devices/imagedev/snapquik.cpp4
-rw-r--r--src/devices/imagedev/snapquik.h22
-rw-r--r--src/devices/machine/6525tpi.cpp22
-rw-r--r--src/devices/machine/6525tpi.h16
-rw-r--r--src/devices/machine/68153bim.cpp13
-rw-r--r--src/devices/machine/6821pia.cpp4
-rw-r--r--src/devices/machine/6821pia.h11
-rw-r--r--src/devices/machine/68307.cpp25
-rw-r--r--src/devices/machine/68307.h2
-rw-r--r--src/devices/machine/68340.cpp9
-rw-r--r--src/devices/machine/68340.h2
-rw-r--r--src/devices/machine/68340dma.cpp5
-rw-r--r--src/devices/machine/68340dma.h1
-rw-r--r--src/devices/machine/68340ser.cpp5
-rw-r--r--src/devices/machine/68340ser.h7
-rw-r--r--src/devices/machine/68340sim.cpp6
-rw-r--r--src/devices/machine/68340sim.h1
-rw-r--r--src/devices/machine/68340tmu.cpp10
-rw-r--r--src/devices/machine/68340tmu.h11
-rw-r--r--src/devices/machine/6840ptm.cpp4
-rw-r--r--src/devices/machine/6840ptm.h4
-rw-r--r--src/devices/machine/6850acia.cpp64
-rw-r--r--src/devices/machine/6850acia.h12
-rw-r--r--src/devices/machine/74157.cpp20
-rw-r--r--src/devices/machine/74157.h17
-rw-r--r--src/devices/machine/74165.cpp7
-rw-r--r--src/devices/machine/74166.cpp7
-rw-r--r--src/devices/machine/7474.h15
-rw-r--r--src/devices/machine/8042kbdc.cpp22
-rw-r--r--src/devices/machine/8042kbdc.h5
-rw-r--r--src/devices/machine/8364_paula.h14
-rw-r--r--src/devices/machine/adc0808.cpp14
-rw-r--r--src/devices/machine/adc0808.h8
-rw-r--r--src/devices/machine/adc0844.cpp6
-rw-r--r--src/devices/machine/adc0844.h6
-rw-r--r--src/devices/machine/aic6250.cpp17
-rw-r--r--src/devices/machine/aic6250.h13
-rw-r--r--src/devices/machine/aicartc.h7
-rw-r--r--src/devices/machine/akiko.cpp5
-rw-r--r--src/devices/machine/am9513.cpp8
-rw-r--r--src/devices/machine/am9513.h8
-rw-r--r--src/devices/machine/am9517a.cpp65
-rw-r--r--src/devices/machine/am9517a.h51
-rw-r--r--src/devices/machine/am9519.cpp8
-rw-r--r--src/devices/machine/am9519.h8
-rw-r--r--src/devices/machine/appldriv.h29
-rw-r--r--src/devices/machine/applefdc.h32
-rw-r--r--src/devices/machine/at29x.cpp4
-rw-r--r--src/devices/machine/at29x.h4
-rw-r--r--src/devices/machine/at_keybc.cpp24
-rw-r--r--src/devices/machine/at_keybc.h16
-rw-r--r--src/devices/machine/atapicdr.cpp10
-rw-r--r--src/devices/machine/ay31015.cpp70
-rw-r--r--src/devices/machine/ay31015.h20
-rw-r--r--src/devices/machine/bankdev.cpp18
-rw-r--r--src/devices/machine/bankdev.h42
-rw-r--r--src/devices/machine/clock.h8
-rw-r--r--src/devices/machine/com8116.cpp29
-rw-r--r--src/devices/machine/com8116.h22
-rw-r--r--src/devices/machine/cr511b.cpp14
-rw-r--r--src/devices/machine/cs4031.cpp80
-rw-r--r--src/devices/machine/cs4031.h72
-rw-r--r--src/devices/machine/diablo_hd.cpp15
-rw-r--r--src/devices/machine/diablo_hd.h3
-rw-r--r--src/devices/machine/dp8390.h33
-rw-r--r--src/devices/machine/dp83932c.cpp153
-rw-r--r--src/devices/machine/dp83932c.h111
-rw-r--r--src/devices/machine/ds1204.h3
-rw-r--r--src/devices/machine/ds1205.h3
-rw-r--r--src/devices/machine/ds128x.cpp58
-rw-r--r--src/devices/machine/ds128x.h25
-rw-r--r--src/devices/machine/ds1315.cpp16
-rw-r--r--src/devices/machine/ds1315.h10
-rw-r--r--src/devices/machine/ds75160a.h12
-rw-r--r--src/devices/machine/f3853.cpp353
-rw-r--r--src/devices/machine/f3853.h168
-rw-r--r--src/devices/machine/fdc37c665gt.cpp9
-rw-r--r--src/devices/machine/fdc37c93x.cpp4
-rw-r--r--src/devices/machine/gen_fifo.h11
-rw-r--r--src/devices/machine/genpc.cpp60
-rw-r--r--src/devices/machine/genpc.h29
-rw-r--r--src/devices/machine/hdc92x4.cpp4
-rw-r--r--src/devices/machine/hdc92x4.h4
-rw-r--r--src/devices/machine/i2cmem.cpp121
-rw-r--r--src/devices/machine/i2cmem.h89
-rw-r--r--src/devices/machine/i7220.cpp65
-rw-r--r--src/devices/machine/i8087.cpp14
-rw-r--r--src/devices/machine/i8087.h13
-rw-r--r--src/devices/machine/i8155.cpp26
-rw-r--r--src/devices/machine/i8155.h14
-rw-r--r--src/devices/machine/i82357.cpp307
-rw-r--r--src/devices/machine/i82357.h91
-rw-r--r--src/devices/machine/i82371sb.cpp25
-rw-r--r--src/devices/machine/i82371sb.h1
-rw-r--r--src/devices/machine/i8251.cpp8
-rw-r--r--src/devices/machine/i8251.h8
-rw-r--r--src/devices/machine/i8271.cpp37
-rw-r--r--src/devices/machine/i8271.h18
-rw-r--r--src/devices/machine/idectrl.cpp13
-rw-r--r--src/devices/machine/idectrl.h6
-rw-r--r--src/devices/machine/idehd.cpp7
-rw-r--r--src/devices/machine/ie15.cpp32
-rw-r--r--src/devices/machine/ie15_kbd.cpp5
-rw-r--r--src/devices/machine/input_merger.h22
-rw-r--r--src/devices/machine/ins8154.cpp71
-rw-r--r--src/devices/machine/ins8154.h13
-rw-r--r--src/devices/machine/ins8250.cpp2
-rw-r--r--src/devices/machine/intelfsh.h8
-rw-r--r--src/devices/machine/k054321.cpp2
-rw-r--r--src/devices/machine/keyboard.cpp6
-rw-r--r--src/devices/machine/ldp1000.h7
-rw-r--r--src/devices/machine/ldp1450.h7
-rw-r--r--src/devices/machine/ldpr8210.h2
-rw-r--r--src/devices/machine/ldstub.cpp8
-rw-r--r--src/devices/machine/ldstub.h21
-rw-r--r--src/devices/machine/ldv1000.cpp5
-rw-r--r--src/devices/machine/ldv1000.h6
-rw-r--r--src/devices/machine/ldvp931.cpp80
-rw-r--r--src/devices/machine/ldvp931.h18
-rw-r--r--src/devices/machine/legscsi.h2
-rw-r--r--src/devices/machine/mb8421.cpp16
-rw-r--r--src/devices/machine/mb8421.h16
-rw-r--r--src/devices/machine/mc146818.cpp12
-rw-r--r--src/devices/machine/mc146818.h8
-rw-r--r--src/devices/machine/mc6843.h2
-rw-r--r--src/devices/machine/mc6852.cpp7
-rw-r--r--src/devices/machine/mc6852.h32
-rw-r--r--src/devices/machine/mc6854.cpp4
-rw-r--r--src/devices/machine/mc6854.h4
-rw-r--r--src/devices/machine/mc68681.cpp35
-rw-r--r--src/devices/machine/mc68681.h37
-rw-r--r--src/devices/machine/mccs1850.h22
-rw-r--r--src/devices/machine/mcf5206e.cpp2
-rw-r--r--src/devices/machine/mcf5206e.h9
-rw-r--r--src/devices/machine/meters.h5
-rw-r--r--src/devices/machine/microtch.h12
-rw-r--r--src/devices/machine/mm5740.h38
-rw-r--r--src/devices/machine/mm58167.cpp4
-rw-r--r--src/devices/machine/mm58167.h13
-rw-r--r--src/devices/machine/mm58274c.cpp4
-rw-r--r--src/devices/machine/mm58274c.h17
-rw-r--r--src/devices/machine/mm74c922.h44
-rw-r--r--src/devices/machine/mos6526.cpp12
-rw-r--r--src/devices/machine/mos6526.h61
-rw-r--r--src/devices/machine/mos6530.h21
-rw-r--r--src/devices/machine/mos6530n.h128
-rw-r--r--src/devices/machine/mos6551.cpp36
-rw-r--r--src/devices/machine/mos6551.h6
-rw-r--r--src/devices/machine/mos6702.cpp4
-rw-r--r--src/devices/machine/mos6702.h14
-rw-r--r--src/devices/machine/mos8706.h11
-rw-r--r--src/devices/machine/mos8722.cpp2
-rw-r--r--src/devices/machine/mos8722.h2
-rw-r--r--src/devices/machine/mos8726.cpp4
-rw-r--r--src/devices/machine/mos8726.h15
-rw-r--r--src/devices/machine/mpu401.cpp10
-rw-r--r--src/devices/machine/msm58321.h31
-rw-r--r--src/devices/machine/msm6242.h5
-rw-r--r--src/devices/machine/myb3k_kbd.h21
-rw-r--r--src/devices/machine/ncr5380.h3
-rw-r--r--src/devices/machine/ncr5380n.cpp116
-rw-r--r--src/devices/machine/ncr5380n.h45
-rw-r--r--src/devices/machine/ncr5385.cpp4
-rw-r--r--src/devices/machine/ncr5385.h13
-rw-r--r--src/devices/machine/ncr5390.cpp337
-rw-r--r--src/devices/machine/ncr5390.h135
-rw-r--r--src/devices/machine/ncr539x.cpp4
-rw-r--r--src/devices/machine/ncr539x.h11
-rw-r--r--src/devices/machine/netlist.cpp375
-rw-r--r--src/devices/machine/netlist.h74
-rw-r--r--src/devices/machine/nmc9306.h11
-rw-r--r--src/devices/machine/nsc810.cpp4
-rw-r--r--src/devices/machine/nsc810.h63
-rw-r--r--src/devices/machine/nscsi_bus.cpp67
-rw-r--r--src/devices/machine/nscsi_bus.h28
-rw-r--r--src/devices/machine/nscsi_cb.h46
-rw-r--r--src/devices/machine/nscsi_cd.cpp296
-rw-r--r--src/devices/machine/nscsi_cd.h12
-rw-r--r--src/devices/machine/nscsi_hd.cpp147
-rw-r--r--src/devices/machine/nscsi_hd.h3
-rw-r--r--src/devices/machine/output_latch.h25
-rw-r--r--src/devices/machine/pc_fdc.cpp2
-rw-r--r--src/devices/machine/pc_lpt.cpp8
-rw-r--r--src/devices/machine/pckeybrd.h25
-rw-r--r--src/devices/machine/pdc.cpp3
-rw-r--r--src/devices/machine/pic8259.h4
-rw-r--r--src/devices/machine/pit8253.cpp11
-rw-r--r--src/devices/machine/pit8253.h6
-rw-r--r--src/devices/machine/pla.h21
-rw-r--r--src/devices/machine/pxa255.cpp26
-rw-r--r--src/devices/machine/rtc65271.cpp8
-rw-r--r--src/devices/machine/rtc65271.h8
-rw-r--r--src/devices/machine/scc2698b.cpp5
-rw-r--r--src/devices/machine/scnxx562.cpp9
-rw-r--r--src/devices/machine/sis85c496.cpp27
-rw-r--r--src/devices/machine/smc91c9x.cpp1141
-rw-r--r--src/devices/machine/smc91c9x.h252
-rw-r--r--src/devices/machine/smpc.cpp2
-rw-r--r--src/devices/machine/sonydriv.h18
-rw-r--r--src/devices/machine/spg110.cpp669
-rw-r--r--src/devices/machine/spg110.h220
-rw-r--r--src/devices/machine/spg2xx.cpp2451
-rw-r--r--src/devices/machine/spg2xx.h434
-rw-r--r--src/devices/machine/spg2xx_audio.cpp1258
-rw-r--r--src/devices/machine/spg2xx_audio.h372
-rw-r--r--src/devices/machine/spg2xx_io.cpp1313
-rw-r--r--src/devices/machine/spg2xx_io.h183
-rw-r--r--src/devices/machine/strata.cpp20
-rw-r--r--src/devices/machine/strata.h12
-rw-r--r--src/devices/machine/stvcd.cpp18
-rw-r--r--src/devices/machine/tc009xlvc.cpp2
-rw-r--r--src/devices/machine/terminal.cpp21
-rw-r--r--src/devices/machine/terminal.h2
-rw-r--r--src/devices/machine/ticket.h16
-rw-r--r--src/devices/machine/timekpr.cpp264
-rw-r--r--src/devices/machine/timekpr.h68
-rw-r--r--src/devices/machine/timer.h58
-rw-r--r--src/devices/machine/tmp68301.cpp62
-rw-r--r--src/devices/machine/tmp68301.h24
-rw-r--r--src/devices/machine/tms5501.cpp3
-rw-r--r--src/devices/machine/tms9901.cpp111
-rw-r--r--src/devices/machine/tms9901.h15
-rw-r--r--src/devices/machine/tms9902.cpp127
-rw-r--r--src/devices/machine/tms9902.h4
-rw-r--r--src/devices/machine/tms9914.cpp4
-rw-r--r--src/devices/machine/tms9914.h5
-rw-r--r--src/devices/machine/tube.cpp8
-rw-r--r--src/devices/machine/tube.h8
-rw-r--r--src/devices/machine/upd7002.cpp6
-rw-r--r--src/devices/machine/upd7002.h6
-rw-r--r--src/devices/machine/upd765.cpp139
-rw-r--r--src/devices/machine/upd765.h43
-rw-r--r--src/devices/machine/wd1010.cpp583
-rw-r--r--src/devices/machine/wd1010.h143
-rw-r--r--src/devices/machine/wd11c00_17.cpp9
-rw-r--r--src/devices/machine/wd11c00_17.h1
-rw-r--r--src/devices/machine/wd2010.cpp10
-rw-r--r--src/devices/machine/wd2010.h4
-rw-r--r--src/devices/machine/wd33c93.cpp984
-rw-r--r--src/devices/machine/wd33c93.h112
-rw-r--r--src/devices/machine/wd33c9x.cpp1064
-rw-r--r--src/devices/machine/wd33c9x.h32
-rw-r--r--src/devices/machine/wd7600.cpp128
-rw-r--r--src/devices/machine/wd7600.h88
-rw-r--r--src/devices/machine/x2201.cpp11
-rw-r--r--src/devices/machine/x2201.h1
-rw-r--r--src/devices/machine/xc1700e.cpp91
-rw-r--r--src/devices/machine/xc1700e.h118
-rw-r--r--src/devices/machine/ym2148.cpp4
-rw-r--r--src/devices/machine/ym2148.h4
-rw-r--r--src/devices/machine/z80scc.cpp14
-rw-r--r--src/devices/machine/z80scc.h1
-rw-r--r--src/devices/machine/z80sio.cpp20
-rw-r--r--src/devices/sound/2203intf.cpp20
-rw-r--r--src/devices/sound/2203intf.h12
-rw-r--r--src/devices/sound/2608intf.cpp4
-rw-r--r--src/devices/sound/2608intf.h4
-rw-r--r--src/devices/sound/2610intf.cpp4
-rw-r--r--src/devices/sound/2610intf.h4
-rw-r--r--src/devices/sound/2612intf.cpp4
-rw-r--r--src/devices/sound/2612intf.h4
-rw-r--r--src/devices/sound/262intf.cpp4
-rw-r--r--src/devices/sound/262intf.h4
-rw-r--r--src/devices/sound/3526intf.cpp12
-rw-r--r--src/devices/sound/3526intf.h12
-rw-r--r--src/devices/sound/3812intf.cpp12
-rw-r--r--src/devices/sound/3812intf.h12
-rw-r--r--src/devices/sound/8950intf.cpp12
-rw-r--r--src/devices/sound/8950intf.h12
-rw-r--r--src/devices/sound/ad1848.cpp1
-rw-r--r--src/devices/sound/astrocde.cpp6
-rw-r--r--src/devices/sound/astrocde.h4
-rw-r--r--src/devices/sound/ay8910.cpp140
-rw-r--r--src/devices/sound/ay8910.h85
-rw-r--r--src/devices/sound/bsmt2000.cpp8
-rw-r--r--src/devices/sound/c140.cpp4
-rw-r--r--src/devices/sound/c140.h4
-rw-r--r--src/devices/sound/cdp1864.cpp12
-rw-r--r--src/devices/sound/cdp1869.cpp5
-rw-r--r--src/devices/sound/dac.h2
-rw-r--r--src/devices/sound/es1373.cpp5
-rw-r--r--src/devices/sound/es5506.cpp15
-rw-r--r--src/devices/sound/es5506.h2
-rw-r--r--src/devices/sound/es8712.cpp2
-rw-r--r--src/devices/sound/es8712.h2
-rw-r--r--src/devices/sound/esqpump.cpp20
-rw-r--r--src/devices/sound/esqpump.h5
-rw-r--r--src/devices/sound/gaelco.cpp4
-rw-r--r--src/devices/sound/ics2115.cpp517
-rw-r--r--src/devices/sound/ics2115.h102
-rw-r--r--src/devices/sound/k051649.cpp23
-rw-r--r--src/devices/sound/k051649.h20
-rw-r--r--src/devices/sound/k054539.cpp4
-rw-r--r--src/devices/sound/k054539.h4
-rw-r--r--src/devices/sound/meg.cpp384
-rw-r--r--src/devices/sound/meg.h122
-rw-r--r--src/devices/sound/megd.cpp118
-rw-r--r--src/devices/sound/megd.h39
-rw-r--r--src/devices/sound/mos6560.cpp10
-rw-r--r--src/devices/sound/mos6581.cpp4
-rw-r--r--src/devices/sound/mos6581.h4
-rw-r--r--src/devices/sound/mos7360.cpp5
-rw-r--r--src/devices/sound/msm5205.h10
-rw-r--r--src/devices/sound/nile.cpp5
-rw-r--r--src/devices/sound/okim6258.cpp6
-rw-r--r--src/devices/sound/okim6258.h6
-rw-r--r--src/devices/sound/okim6295.cpp28
-rw-r--r--src/devices/sound/okim6295.h7
-rw-r--r--src/devices/sound/okim6376.cpp2
-rw-r--r--src/devices/sound/okim6376.h2
-rw-r--r--src/devices/sound/pokey.cpp119
-rw-r--r--src/devices/sound/pokey.h13
-rw-r--r--src/devices/sound/qs1000.h1
-rw-r--r--src/devices/sound/rf5c68.cpp8
-rw-r--r--src/devices/sound/rf5c68.h8
-rw-r--r--src/devices/sound/sn76496.cpp4
-rw-r--r--src/devices/sound/sn76496.h5
-rw-r--r--src/devices/sound/spkrdev.h4
-rw-r--r--src/devices/sound/swp30.cpp61
-rw-r--r--src/devices/sound/swp30.h9
-rw-r--r--src/devices/sound/t6721a.cpp4
-rw-r--r--src/devices/sound/t6721a.h4
-rw-r--r--src/devices/sound/t6w28.cpp2
-rw-r--r--src/devices/sound/t6w28.h4
-rw-r--r--src/devices/sound/upd7752.cpp6
-rw-r--r--src/devices/sound/vlm5030.cpp4
-rw-r--r--src/devices/sound/vlm5030.h2
-rw-r--r--src/devices/sound/volt_reg.cpp2
-rw-r--r--src/devices/sound/volt_reg.h5
-rw-r--r--src/devices/sound/votrax.cpp4
-rw-r--r--src/devices/sound/votrax.h4
-rw-r--r--src/devices/sound/vrc6.cpp4
-rw-r--r--src/devices/sound/vrc6.h2
-rw-r--r--src/devices/sound/ym2151.cpp16
-rw-r--r--src/devices/sound/ym2151.h10
-rw-r--r--src/devices/sound/ym2413.cpp134
-rw-r--r--src/devices/sound/ym2413.h29
-rw-r--r--src/devices/sound/ymf271.cpp4
-rw-r--r--src/devices/sound/ymf271.h4
-rw-r--r--src/devices/sound/ymf278b.cpp4
-rw-r--r--src/devices/sound/ymf278b.h4
-rw-r--r--src/devices/sound/ymz280b.cpp4
-rw-r--r--src/devices/sound/ymz280b.h4
-rw-r--r--src/devices/video/315_5124.cpp196
-rw-r--r--src/devices/video/315_5124.h157
-rw-r--r--src/devices/video/315_5313.cpp10
-rw-r--r--src/devices/video/315_5313.h53
-rw-r--r--src/devices/video/cdp1862.cpp2
-rw-r--r--src/devices/video/cdp1862.h2
-rw-r--r--src/devices/video/cesblit.h24
-rw-r--r--src/devices/video/crt9007.cpp5
-rw-r--r--src/devices/video/crt9021.h6
-rw-r--r--src/devices/video/crt9028.cpp371
-rw-r--r--src/devices/video/crt9028.h142
-rw-r--r--src/devices/video/crtc_ega.cpp6
-rw-r--r--src/devices/video/crtc_ega.h48
-rw-r--r--src/devices/video/decsfb.cpp175
-rw-r--r--src/devices/video/decsfb.h38
-rw-r--r--src/devices/video/dl1416.h12
-rw-r--r--src/devices/video/dm9368.h15
-rw-r--r--src/devices/video/ef9340_1.h12
-rw-r--r--src/devices/video/ef9345.cpp43
-rw-r--r--src/devices/video/ef9345.h6
-rw-r--r--src/devices/video/ef9364.cpp5
-rw-r--r--src/devices/video/ef9364.h8
-rw-r--r--src/devices/video/ef9365.cpp9
-rw-r--r--src/devices/video/ef9365.h17
-rw-r--r--src/devices/video/epic12.h6
-rw-r--r--src/devices/video/fixfreq.cpp408
-rw-r--r--src/devices/video/fixfreq.h278
-rw-r--r--src/devices/video/gba_lcd.cpp13
-rw-r--r--src/devices/video/gba_lcd.h33
-rw-r--r--src/devices/video/hd44102.h21
-rw-r--r--src/devices/video/hd44780.h12
-rw-r--r--src/devices/video/hd61830.cpp5
-rw-r--r--src/devices/video/hd61830.h13
-rw-r--r--src/devices/video/hd63484.h24
-rw-r--r--src/devices/video/hd66421.cpp5
-rw-r--r--src/devices/video/hlcd0515.cpp44
-rw-r--r--src/devices/video/hlcd0515.h8
-rw-r--r--src/devices/video/hlcd0538.cpp29
-rw-r--r--src/devices/video/hlcd0538.h12
-rw-r--r--src/devices/video/huc6202.h61
-rw-r--r--src/devices/video/huc6260.h17
-rw-r--r--src/devices/video/huc6261.h10
-rw-r--r--src/devices/video/huc6270.h7
-rw-r--r--src/devices/video/huc6271.cpp5
-rw-r--r--src/devices/video/huc6272.cpp14
-rw-r--r--src/devices/video/huc6272.h13
-rw-r--r--src/devices/video/i8244.cpp16
-rw-r--r--src/devices/video/i8244.h24
-rw-r--r--src/devices/video/i8275.h24
-rw-r--r--src/devices/video/ims_cvc.cpp297
-rw-r--r--src/devices/video/ims_cvc.h144
-rw-r--r--src/devices/video/jangou_blitter.h8
-rw-r--r--src/devices/video/m50458.cpp23
-rw-r--r--src/devices/video/m50458.h17
-rw-r--r--src/devices/video/mb88303.h21
-rw-r--r--src/devices/video/mb90082.cpp9
-rw-r--r--src/devices/video/mb90082.h8
-rw-r--r--src/devices/video/mb_vcu.cpp30
-rw-r--r--src/devices/video/mb_vcu.h15
-rw-r--r--src/devices/video/mc6845.cpp73
-rw-r--r--src/devices/video/mc6845.h27
-rw-r--r--src/devices/video/mc6847.cpp33
-rw-r--r--src/devices/video/mc6847.h71
-rw-r--r--src/devices/video/mm5445.cpp106
-rw-r--r--src/devices/video/mm5445.h101
-rw-r--r--src/devices/video/mos6566.cpp14
-rw-r--r--src/devices/video/mos6566.h4
-rw-r--r--src/devices/video/msm6222b.h5
-rw-r--r--src/devices/video/msm6255.cpp5
-rw-r--r--src/devices/video/nt7534.h5
-rw-r--r--src/devices/video/pc_vga.cpp14
-rw-r--r--src/devices/video/pc_vga.h15
-rw-r--r--src/devices/video/pcd8544.h8
-rw-r--r--src/devices/video/ppu2c0x.cpp13
-rw-r--r--src/devices/video/ps2gs.cpp7
-rw-r--r--src/devices/video/ramdac.cpp13
-rw-r--r--src/devices/video/saa5050.h16
-rw-r--r--src/devices/video/scn2674.cpp326
-rw-r--r--src/devices/video/scn2674.h18
-rw-r--r--src/devices/video/sda5708.h7
-rw-r--r--src/devices/video/sed1200.h11
-rw-r--r--src/devices/video/sed1330.cpp5
-rw-r--r--src/devices/video/t6a04.h3
-rw-r--r--src/devices/video/tea1002.h9
-rw-r--r--src/devices/video/tlc34076.cpp4
-rw-r--r--src/devices/video/tlc34076.h13
-rw-r--r--src/devices/video/tms34061.cpp32
-rw-r--r--src/devices/video/tms34061.h70
-rw-r--r--src/devices/video/tms3556.cpp5
-rw-r--r--src/devices/video/tms3556.h6
-rw-r--r--src/devices/video/tms9927.cpp2
-rw-r--r--src/devices/video/tms9928a.cpp53
-rw-r--r--src/devices/video/tms9928a.h12
-rw-r--r--src/devices/video/upd3301.h24
-rw-r--r--src/devices/video/upd7220.cpp13
-rw-r--r--src/devices/video/upd7220.h51
-rw-r--r--src/devices/video/v9938.cpp4
-rw-r--r--src/devices/video/v9938.h4
-rw-r--r--src/devices/video/vector.h3
-rw-r--r--src/devices/video/vic4567.h49
-rw-r--r--src/devices/video/voodoo.h29
-rw-r--r--src/devices/video/voodoo_pci.cpp54
-rw-r--r--src/emu/addrmap.cpp6
-rw-r--r--src/emu/debug/debugcmd.cpp27
-rw-r--r--src/emu/debug/dvbpoints.cpp51
-rw-r--r--src/emu/debug/dvbpoints.h2
-rw-r--r--src/emu/debug/dvwpoints.cpp67
-rw-r--r--src/emu/debug/dvwpoints.h2
-rw-r--r--src/emu/devfind.cpp105
-rw-r--r--src/emu/devfind.h140
-rw-r--r--src/emu/device.h44
-rw-r--r--src/emu/didisasm.h3
-rw-r--r--src/emu/digfx.h22
-rw-r--r--src/emu/diimage.cpp4
-rw-r--r--src/emu/dinetwork.cpp11
-rw-r--r--src/emu/diserial.cpp10
-rw-r--r--src/emu/diserial.h4
-rw-r--r--src/emu/dislot.h1
-rw-r--r--src/emu/distate.h6
-rw-r--r--src/emu/divideo.h9
-rw-r--r--src/emu/drivenum.cpp123
-rw-r--r--src/emu/drivenum.h3
-rw-r--r--src/emu/drivers/empty.cpp16
-rw-r--r--src/emu/emucore.h6
-rw-r--r--src/emu/emumem.cpp23
-rw-r--r--src/emu/emumem.h5
-rw-r--r--src/emu/emumem_hedp.cpp28
-rw-r--r--src/emu/emumem_hedr0.cpp17
-rw-r--r--src/emu/emumem_hedr1.cpp17
-rw-r--r--src/emu/emumem_hedr2.cpp17
-rw-r--r--src/emu/emumem_hedr3.cpp17
-rw-r--r--src/emu/emumem_hedw0.cpp17
-rw-r--r--src/emu/emumem_hedw1.cpp17
-rw-r--r--src/emu/emumem_hedw2.cpp17
-rw-r--r--src/emu/emumem_hedw3.cpp17
-rw-r--r--src/emu/emumem_hem.cpp8
-rw-r--r--src/emu/emumem_hep.cpp4
-rw-r--r--src/emu/emumem_het.cpp4
-rw-r--r--src/emu/emumem_heu.cpp4
-rw-r--r--src/emu/emumem_heun.cpp8
-rw-r--r--src/emu/emupal.h15
-rw-r--r--src/emu/fileio.cpp2
-rw-r--r--src/emu/inpttype.h4
-rw-r--r--src/emu/ioport.h2
-rw-r--r--src/emu/machine.cpp2
-rw-r--r--src/emu/mconfig.h8
-rw-r--r--src/emu/render.h2
-rw-r--r--src/emu/rendlay.cpp17
-rw-r--r--src/emu/romload.cpp29
-rw-r--r--src/emu/schedule.h1
-rw-r--r--src/emu/screen.cpp25
-rw-r--r--src/emu/screen.h27
-rw-r--r--src/emu/softlist_dev.cpp35
-rw-r--r--src/emu/softlist_dev.h31
-rw-r--r--src/emu/tilemap.h1
-rw-r--r--src/emu/video.cpp19
-rw-r--r--src/emu/video/resnet.h23
-rw-r--r--src/emu/xtal.cpp17
-rw-r--r--src/frontend/mame/clifront.cpp451
-rw-r--r--src/frontend/mame/clifront.h2
-rw-r--r--src/frontend/mame/info.cpp19
-rw-r--r--src/frontend/mame/language.cpp2
-rw-r--r--src/frontend/mame/mame.cpp34
-rw-r--r--src/frontend/mame/mame.h20
-rw-r--r--src/frontend/mame/mameopts.cpp4
-rw-r--r--src/frontend/mame/ui/auditmenu.cpp11
-rw-r--r--src/frontend/mame/ui/icorender.cpp781
-rw-r--r--src/frontend/mame/ui/icorender.h227
-rw-r--r--src/frontend/mame/ui/info.cpp35
-rw-r--r--src/frontend/mame/ui/inifile.cpp585
-rw-r--r--src/frontend/mame/ui/inifile.h90
-rw-r--r--src/frontend/mame/ui/mainmenu.cpp6
-rw-r--r--src/frontend/mame/ui/menu.cpp16
-rw-r--r--src/frontend/mame/ui/menu.h25
-rw-r--r--src/frontend/mame/ui/miscmenu.cpp99
-rw-r--r--src/frontend/mame/ui/miscmenu.h22
-rw-r--r--src/frontend/mame/ui/optsmenu.cpp365
-rw-r--r--src/frontend/mame/ui/optsmenu.h53
-rw-r--r--src/frontend/mame/ui/selector.cpp14
-rw-r--r--src/frontend/mame/ui/selector.h16
-rw-r--r--src/frontend/mame/ui/selgame.cpp755
-rw-r--r--src/frontend/mame/ui/selgame.h27
-rw-r--r--src/frontend/mame/ui/selmenu.cpp439
-rw-r--r--src/frontend/mame/ui/selmenu.h40
-rw-r--r--src/frontend/mame/ui/selsoft.cpp383
-rw-r--r--src/frontend/mame/ui/selsoft.h59
-rw-r--r--src/frontend/mame/ui/simpleselgame.cpp10
-rw-r--r--src/frontend/mame/ui/utils.cpp287
-rw-r--r--src/frontend/mame/ui/utils.h166
-rw-r--r--src/frontend/mame/ui/videoopt.cpp2
-rw-r--r--src/frontend/mame/ui/widgets.cpp13
-rw-r--r--src/frontend/mame/ui/widgets.h12
-rw-r--r--src/lib/formats/apridisk.h2
-rw-r--r--src/lib/formats/dsk_dsk.cpp6
-rw-r--r--src/lib/formats/hpi_dsk.cpp96
-rw-r--r--src/lib/formats/hpi_dsk.h3
-rw-r--r--src/lib/formats/mtx_dsk.cpp53
-rw-r--r--src/lib/formats/mtx_dsk.h33
-rw-r--r--src/lib/formats/opd_dsk.cpp61
-rw-r--r--src/lib/formats/opd_dsk.h38
-rw-r--r--src/lib/netlist/analog/nld_bjt.cpp632
-rw-r--r--src/lib/netlist/analog/nld_bjt.h2
-rw-r--r--src/lib/netlist/analog/nld_fourterm.h2
-rw-r--r--src/lib/netlist/analog/nld_mosfet.cpp488
-rw-r--r--src/lib/netlist/analog/nld_mosfet.h21
-rw-r--r--src/lib/netlist/analog/nld_opamps.cpp30
-rw-r--r--src/lib/netlist/analog/nld_opamps.h2
-rw-r--r--src/lib/netlist/analog/nld_switches.cpp49
-rw-r--r--src/lib/netlist/analog/nld_switches.h2
-rw-r--r--src/lib/netlist/analog/nld_twoterm.h2
-rw-r--r--src/lib/netlist/analog/nlid_fourterm.cpp52
-rw-r--r--src/lib/netlist/analog/nlid_fourterm.h60
-rw-r--r--src/lib/netlist/analog/nlid_twoterm.cpp233
-rw-r--r--src/lib/netlist/analog/nlid_twoterm.h338
-rw-r--r--src/lib/netlist/build/makefile75
-rw-r--r--src/lib/netlist/devices/net_lib.cpp281
-rw-r--r--src/lib/netlist/devices/net_lib.h46
-rw-r--r--src/lib/netlist/devices/nld_2102A.cpp8
-rw-r--r--src/lib/netlist/devices/nld_2102A.h2
-rw-r--r--src/lib/netlist/devices/nld_2716.cpp6
-rw-r--r--src/lib/netlist/devices/nld_2716.h2
-rw-r--r--src/lib/netlist/devices/nld_4020.cpp7
-rw-r--r--src/lib/netlist/devices/nld_4020.h2
-rw-r--r--src/lib/netlist/devices/nld_4066.cpp37
-rw-r--r--src/lib/netlist/devices/nld_4066.h2
-rw-r--r--src/lib/netlist/devices/nld_4316.cpp18
-rw-r--r--src/lib/netlist/devices/nld_4316.h2
-rw-r--r--src/lib/netlist/devices/nld_74107.cpp20
-rw-r--r--src/lib/netlist/devices/nld_74107.h2
-rw-r--r--src/lib/netlist/devices/nld_74123.cpp26
-rw-r--r--src/lib/netlist/devices/nld_74123.h2
-rw-r--r--src/lib/netlist/devices/nld_74153.cpp12
-rw-r--r--src/lib/netlist/devices/nld_74153.h2
-rw-r--r--src/lib/netlist/devices/nld_74161.cpp8
-rw-r--r--src/lib/netlist/devices/nld_74161.h2
-rw-r--r--src/lib/netlist/devices/nld_74164.cpp6
-rw-r--r--src/lib/netlist/devices/nld_74164.h2
-rw-r--r--src/lib/netlist/devices/nld_74165.cpp7
-rw-r--r--src/lib/netlist/devices/nld_74165.h2
-rw-r--r--src/lib/netlist/devices/nld_74166.cpp6
-rw-r--r--src/lib/netlist/devices/nld_74166.h2
-rw-r--r--src/lib/netlist/devices/nld_74174.cpp6
-rw-r--r--src/lib/netlist/devices/nld_74174.h2
-rw-r--r--src/lib/netlist/devices/nld_74175.cpp6
-rw-r--r--src/lib/netlist/devices/nld_74175.h2
-rw-r--r--src/lib/netlist/devices/nld_74192.cpp8
-rw-r--r--src/lib/netlist/devices/nld_74192.h2
-rw-r--r--src/lib/netlist/devices/nld_74193.cpp8
-rw-r--r--src/lib/netlist/devices/nld_74193.h2
-rw-r--r--src/lib/netlist/devices/nld_74194.cpp6
-rw-r--r--src/lib/netlist/devices/nld_74194.h2
-rw-r--r--src/lib/netlist/devices/nld_74365.cpp14
-rw-r--r--src/lib/netlist/devices/nld_74365.h2
-rw-r--r--src/lib/netlist/devices/nld_7448.cpp24
-rw-r--r--src/lib/netlist/devices/nld_7448.h2
-rw-r--r--src/lib/netlist/devices/nld_7450.cpp18
-rw-r--r--src/lib/netlist/devices/nld_7450.h2
-rw-r--r--src/lib/netlist/devices/nld_7473.cpp10
-rw-r--r--src/lib/netlist/devices/nld_7473.h2
-rw-r--r--src/lib/netlist/devices/nld_7474.cpp132
-rw-r--r--src/lib/netlist/devices/nld_7474.h2
-rw-r--r--src/lib/netlist/devices/nld_7475.cpp12
-rw-r--r--src/lib/netlist/devices/nld_7475.h2
-rw-r--r--src/lib/netlist/devices/nld_7483.cpp47
-rw-r--r--src/lib/netlist/devices/nld_7483.h2
-rw-r--r--src/lib/netlist/devices/nld_7485.cpp6
-rw-r--r--src/lib/netlist/devices/nld_7485.h2
-rw-r--r--src/lib/netlist/devices/nld_7490.cpp35
-rw-r--r--src/lib/netlist/devices/nld_7490.h2
-rw-r--r--src/lib/netlist/devices/nld_7493.cpp87
-rw-r--r--src/lib/netlist/devices/nld_7493.h2
-rw-r--r--src/lib/netlist/devices/nld_7497.cpp174
-rw-r--r--src/lib/netlist/devices/nld_7497.h57
-rw-r--r--src/lib/netlist/devices/nld_74ls629.cpp19
-rw-r--r--src/lib/netlist/devices/nld_74ls629.h2
-rw-r--r--src/lib/netlist/devices/nld_82S115.cpp6
-rw-r--r--src/lib/netlist/devices/nld_82S115.h2
-rw-r--r--src/lib/netlist/devices/nld_82S123.cpp6
-rw-r--r--src/lib/netlist/devices/nld_82S123.h2
-rw-r--r--src/lib/netlist/devices/nld_82S126.cpp6
-rw-r--r--src/lib/netlist/devices/nld_82S126.h2
-rw-r--r--src/lib/netlist/devices/nld_82S16.cpp73
-rw-r--r--src/lib/netlist/devices/nld_82S16.h2
-rw-r--r--src/lib/netlist/devices/nld_9310.cpp42
-rw-r--r--src/lib/netlist/devices/nld_9310.h2
-rw-r--r--src/lib/netlist/devices/nld_9316.cpp138
-rw-r--r--src/lib/netlist/devices/nld_9316.h2
-rw-r--r--src/lib/netlist/devices/nld_9322.cpp14
-rw-r--r--src/lib/netlist/devices/nld_9322.h2
-rw-r--r--src/lib/netlist/devices/nld_am2847.cpp10
-rw-r--r--src/lib/netlist/devices/nld_am2847.h2
-rw-r--r--src/lib/netlist/devices/nld_dm9314.cpp6
-rw-r--r--src/lib/netlist/devices/nld_dm9314.h2
-rw-r--r--src/lib/netlist/devices/nld_dm9334.cpp6
-rw-r--r--src/lib/netlist/devices/nld_dm9334.h2
-rw-r--r--src/lib/netlist/devices/nld_legacy.cpp10
-rw-r--r--src/lib/netlist/devices/nld_legacy.h2
-rw-r--r--src/lib/netlist/devices/nld_log.cpp18
-rw-r--r--src/lib/netlist/devices/nld_log.h4
-rw-r--r--src/lib/netlist/devices/nld_mm5837.cpp16
-rw-r--r--src/lib/netlist/devices/nld_mm5837.h2
-rw-r--r--src/lib/netlist/devices/nld_ne555.cpp101
-rw-r--r--src/lib/netlist/devices/nld_ne555.h8
-rw-r--r--src/lib/netlist/devices/nld_r2r_dac.cpp14
-rw-r--r--src/lib/netlist/devices/nld_r2r_dac.h2
-rw-r--r--src/lib/netlist/devices/nld_schmitt.cpp30
-rw-r--r--src/lib/netlist/devices/nld_schmitt.h2
-rw-r--r--src/lib/netlist/devices/nld_system.cpp95
-rw-r--r--src/lib/netlist/devices/nld_system.h2
-rw-r--r--src/lib/netlist/devices/nld_tms4800.cpp10
-rw-r--r--src/lib/netlist/devices/nld_tms4800.h2
-rw-r--r--src/lib/netlist/devices/nld_tristate.cpp6
-rw-r--r--src/lib/netlist/devices/nld_tristate.h2
-rw-r--r--src/lib/netlist/devices/nlid_cmos.h4
-rw-r--r--src/lib/netlist/devices/nlid_proxy.cpp54
-rw-r--r--src/lib/netlist/devices/nlid_proxy.h24
-rw-r--r--src/lib/netlist/devices/nlid_system.h92
-rw-r--r--src/lib/netlist/devices/nlid_truthtable.cpp141
-rw-r--r--src/lib/netlist/devices/nlid_truthtable.h175
-rw-r--r--src/lib/netlist/macro/nlm_base.cpp39
-rw-r--r--src/lib/netlist/macro/nlm_base.h2
-rw-r--r--src/lib/netlist/macro/nlm_cd4xxx.cpp8
-rw-r--r--src/lib/netlist/macro/nlm_cd4xxx.h2
-rw-r--r--src/lib/netlist/macro/nlm_opamp.cpp2
-rw-r--r--src/lib/netlist/macro/nlm_opamp.h2
-rw-r--r--src/lib/netlist/macro/nlm_other.cpp2
-rw-r--r--src/lib/netlist/macro/nlm_other.h2
-rw-r--r--src/lib/netlist/macro/nlm_ttl74xx.cpp9
-rw-r--r--src/lib/netlist/macro/nlm_ttl74xx.h2
-rw-r--r--src/lib/netlist/netlist_types.h54
-rw-r--r--src/lib/netlist/nl_base.cpp765
-rw-r--r--src/lib/netlist/nl_base.h1307
-rw-r--r--src/lib/netlist/nl_config.h46
-rw-r--r--src/lib/netlist/nl_dice_compat.h17
-rw-r--r--src/lib/netlist/nl_errstr.h3
-rw-r--r--src/lib/netlist/nl_factory.cpp140
-rw-r--r--src/lib/netlist/nl_factory.h87
-rw-r--r--src/lib/netlist/nl_lists.h163
-rw-r--r--src/lib/netlist/nl_parser.cpp43
-rw-r--r--src/lib/netlist/nl_parser.h18
-rw-r--r--src/lib/netlist/nl_setup.cpp838
-rw-r--r--src/lib/netlist/nl_setup.h309
-rw-r--r--src/lib/netlist/nl_time.h145
-rw-r--r--src/lib/netlist/nltypes.h147
-rw-r--r--src/lib/netlist/plib/gmres.h450
-rw-r--r--src/lib/netlist/plib/mat_cr.h530
-rw-r--r--src/lib/netlist/plib/palloc.cpp105
-rw-r--r--src/lib/netlist/plib/palloc.h513
-rw-r--r--src/lib/netlist/plib/parray.h126
-rw-r--r--src/lib/netlist/plib/pchrono.cpp4
-rw-r--r--src/lib/netlist/plib/pchrono.h52
-rw-r--r--src/lib/netlist/plib/pconfig.h51
-rw-r--r--src/lib/netlist/plib/pdynlib.cpp18
-rw-r--r--src/lib/netlist/plib/pdynlib.h15
-rw-r--r--src/lib/netlist/plib/pexception.cpp215
-rw-r--r--src/lib/netlist/plib/pexception.h214
-rw-r--r--src/lib/netlist/plib/pfmtlog.cpp121
-rw-r--r--src/lib/netlist/plib/pfmtlog.h50
-rw-r--r--src/lib/netlist/plib/pfunction.cpp32
-rw-r--r--src/lib/netlist/plib/pfunction.h4
-rw-r--r--src/lib/netlist/plib/plists.h122
-rw-r--r--src/lib/netlist/plib/pmain.cpp13
-rw-r--r--src/lib/netlist/plib/pmain.h20
-rw-r--r--src/lib/netlist/plib/pmatrix2d.h85
-rw-r--r--src/lib/netlist/plib/pmempool.h187
-rw-r--r--src/lib/netlist/plib/pomp.h28
-rw-r--r--src/lib/netlist/plib/poptions.cpp154
-rw-r--r--src/lib/netlist/plib/poptions.h161
-rw-r--r--src/lib/netlist/plib/pparser.cpp278
-rw-r--r--src/lib/netlist/plib/pparser.h107
-rw-r--r--src/lib/netlist/plib/ppmf.h28
-rw-r--r--src/lib/netlist/plib/pstate.cpp35
-rw-r--r--src/lib/netlist/plib/pstate.h67
-rw-r--r--src/lib/netlist/plib/pstream.cpp131
-rw-r--r--src/lib/netlist/plib/pstream.h408
-rw-r--r--src/lib/netlist/plib/pstring.cpp131
-rw-r--r--src/lib/netlist/plib/pstring.h457
-rw-r--r--src/lib/netlist/plib/ptime.h136
-rw-r--r--src/lib/netlist/plib/ptypes.h124
-rw-r--r--src/lib/netlist/plib/putil.cpp75
-rw-r--r--src/lib/netlist/plib/putil.h103
-rw-r--r--src/lib/netlist/plib/vector_ops.h151
-rw-r--r--src/lib/netlist/prg/nltool.cpp374
-rw-r--r--src/lib/netlist/prg/nlwav.cpp591
-rw-r--r--src/lib/netlist/solver/mat_cr.h175
-rw-r--r--src/lib/netlist/solver/nld_matrix_solver.cpp937
-rw-r--r--src/lib/netlist/solver/nld_matrix_solver.h471
-rw-r--r--src/lib/netlist/solver/nld_ms_direct.h386
-rw-r--r--src/lib/netlist/solver/nld_ms_direct1.h50
-rw-r--r--src/lib/netlist/solver/nld_ms_direct2.h59
-rw-r--r--src/lib/netlist/solver/nld_ms_direct_lu.h26
-rw-r--r--src/lib/netlist/solver/nld_ms_gcr.h562
-rw-r--r--src/lib/netlist/solver/nld_ms_gmres.h412
-rw-r--r--src/lib/netlist/solver/nld_ms_sm.h416
-rw-r--r--src/lib/netlist/solver/nld_ms_sor.h112
-rw-r--r--src/lib/netlist/solver/nld_ms_sor_mat.h338
-rw-r--r--src/lib/netlist/solver/nld_ms_w.h165
-rw-r--r--src/lib/netlist/solver/nld_solver.cpp641
-rw-r--r--src/lib/netlist/solver/nld_solver.h178
-rw-r--r--src/lib/netlist/solver/vector_base.h144
-rw-r--r--src/lib/netlist/tools/nl_convert.cpp117
-rw-r--r--src/lib/netlist/tools/nl_convert.h69
-rw-r--r--src/lib/util/corefile.cpp22
-rw-r--r--src/lib/util/corefile.h21
-rw-r--r--src/lib/util/corestr.cpp95
-rw-r--r--src/lib/util/corestr.h7
-rw-r--r--src/lib/util/unicode.cpp170
-rw-r--r--src/lib/util/unicode.h17
-rw-r--r--src/mame/arcade.flt4
-rw-r--r--src/mame/audio/alesis.cpp12
-rw-r--r--src/mame/audio/asteroid.cpp16
-rw-r--r--src/mame/audio/astrof.cpp5
-rw-r--r--src/mame/audio/atarijsa.cpp30
-rw-r--r--src/mame/audio/avalnche.cpp22
-rw-r--r--src/mame/audio/bwidow.cpp2
-rw-r--r--src/mame/audio/cage.cpp41
-rw-r--r--src/mame/audio/cage.h3
-rw-r--r--src/mame/audio/carnival.cpp4
-rw-r--r--src/mame/audio/cmi01a.cpp32
-rw-r--r--src/mame/audio/cmi01a.h12
-rw-r--r--src/mame/audio/csd.cpp20
-rw-r--r--src/mame/audio/csd.h4
-rw-r--r--src/mame/audio/exidy.cpp47
-rw-r--r--src/mame/audio/exidy440.cpp21
-rw-r--r--src/mame/audio/gottlieb.cpp79
-rw-r--r--src/mame/audio/harddriv.cpp15
-rw-r--r--src/mame/audio/irem.cpp12
-rw-r--r--src/mame/audio/leland.cpp30
-rw-r--r--src/mame/audio/llander.cpp8
-rw-r--r--src/mame/audio/midway.cpp44
-rw-r--r--src/mame/audio/n8080.cpp3
-rw-r--r--src/mame/audio/nichisnd.cpp18
-rw-r--r--src/mame/audio/nl_kidniki.cpp31
-rw-r--r--src/mame/audio/nl_zac1b11142.cpp2
-rw-r--r--src/mame/audio/redalert.cpp16
-rw-r--r--src/mame/audio/s11c_bg.cpp25
-rw-r--r--src/mame/audio/segag80r.cpp1
-rw-r--r--src/mame/audio/snk6502.cpp1
-rw-r--r--src/mame/audio/spacefb.cpp1
-rw-r--r--src/mame/audio/spiders.cpp9
-rw-r--r--src/mame/audio/sprint8.cpp37
-rw-r--r--src/mame/audio/t5182.cpp12
-rw-r--r--src/mame/audio/taito_en.cpp15
-rw-r--r--src/mame/audio/taito_en.h1
-rw-r--r--src/mame/audio/targ.cpp2
-rw-r--r--src/mame/audio/timeplt.cpp8
-rw-r--r--src/mame/audio/timeplt.h3
-rw-r--r--src/mame/audio/tx1.cpp38
-rw-r--r--src/mame/audio/williams.cpp132
-rw-r--r--src/mame/audio/williams.h70
-rw-r--r--src/mame/audio/wpcsnd.cpp21
-rw-r--r--src/mame/audio/wswan.cpp2
-rw-r--r--src/mame/audio/wswan.h2
-rw-r--r--src/mame/audio/zaccaria.cpp13
-rw-r--r--src/mame/drivers/1942.cpp37
-rw-r--r--src/mame/drivers/1943.cpp58
-rw-r--r--src/mame/drivers/20pacgal.cpp1
-rw-r--r--src/mame/drivers/24cdjuke.cpp13
-rw-r--r--src/mame/drivers/39in1.cpp5
-rw-r--r--src/mame/drivers/3do.cpp40
-rw-r--r--src/mame/drivers/3x3puzzl.cpp27
-rw-r--r--src/mame/drivers/4004clk.cpp16
-rw-r--r--src/mame/drivers/40love.cpp1
-rw-r--r--src/mame/drivers/4dpi.cpp20
-rw-r--r--src/mame/drivers/4enlinea.cpp30
-rw-r--r--src/mame/drivers/4enraya.cpp45
-rw-r--r--src/mame/drivers/4roses.cpp38
-rw-r--r--src/mame/drivers/5clown.cpp54
-rw-r--r--src/mame/drivers/8080bw.cpp69
-rw-r--r--src/mame/drivers/a1supply.cpp23
-rw-r--r--src/mame/drivers/a5105.cpp31
-rw-r--r--src/mame/drivers/a51xx.cpp40
-rw-r--r--src/mame/drivers/a7150.cpp3
-rw-r--r--src/mame/drivers/aa310.cpp1
-rw-r--r--src/mame/drivers/aaa.cpp262
-rw-r--r--src/mame/drivers/abc1600.cpp63
-rw-r--r--src/mame/drivers/abc80.cpp18
-rw-r--r--src/mame/drivers/abc80x.cpp89
-rw-r--r--src/mame/drivers/ac1.cpp45
-rw-r--r--src/mame/drivers/acd.cpp5
-rw-r--r--src/mame/drivers/ace.cpp28
-rw-r--r--src/mame/drivers/aceex.cpp9
-rw-r--r--src/mame/drivers/acefruit.cpp28
-rw-r--r--src/mame/drivers/acesp.cpp12
-rw-r--r--src/mame/drivers/aci_boris.cpp258
-rw-r--r--src/mame/drivers/aci_borisdpl.cpp236
-rw-r--r--src/mame/drivers/acommand.cpp38
-rw-r--r--src/mame/drivers/acrnsys.cpp12
-rw-r--r--src/mame/drivers/acrnsys1.cpp21
-rw-r--r--src/mame/drivers/actfancr.cpp9
-rw-r--r--src/mame/drivers/acvirus.cpp9
-rw-r--r--src/mame/drivers/adam.cpp28
-rw-r--r--src/mame/drivers/adm23.cpp86
-rw-r--r--src/mame/drivers/adm31.cpp513
-rw-r--r--src/mame/drivers/adm36.cpp202
-rw-r--r--src/mame/drivers/adp.cpp66
-rw-r--r--src/mame/drivers/advision.cpp3
-rw-r--r--src/mame/drivers/aeroboto.cpp32
-rw-r--r--src/mame/drivers/aerofgt.cpp2
-rw-r--r--src/mame/drivers/agat.cpp35
-rw-r--r--src/mame/drivers/age_candy.cpp22
-rw-r--r--src/mame/drivers/aim65.cpp44
-rw-r--r--src/mame/drivers/airbustr.cpp57
-rw-r--r--src/mame/drivers/airraid.cpp30
-rw-r--r--src/mame/drivers/albazc.cpp32
-rw-r--r--src/mame/drivers/albazg.cpp30
-rw-r--r--src/mame/drivers/aleck64.cpp75
-rw-r--r--src/mame/drivers/aleisttl.cpp23
-rw-r--r--src/mame/drivers/alesis.cpp46
-rw-r--r--src/mame/drivers/alesis_qs.cpp9
-rw-r--r--src/mame/drivers/alg.cpp84
-rw-r--r--src/mame/drivers/alien.cpp26
-rw-r--r--src/mame/drivers/alinvade.cpp27
-rw-r--r--src/mame/drivers/allied.cpp35
-rw-r--r--src/mame/drivers/alpha68k.cpp4
-rw-r--r--src/mame/drivers/alphasma.cpp35
-rw-r--r--src/mame/drivers/alphatpx.cpp73
-rw-r--r--src/mame/drivers/alphatro.cpp32
-rw-r--r--src/mame/drivers/altair.cpp2
-rw-r--r--src/mame/drivers/alto1.cpp5
-rw-r--r--src/mame/drivers/alto2.cpp19
-rw-r--r--src/mame/drivers/altos5.cpp10
-rw-r--r--src/mame/drivers/alvg.cpp9
-rw-r--r--src/mame/drivers/amaticmg.cpp54
-rw-r--r--src/mame/drivers/ambush.cpp46
-rw-r--r--src/mame/drivers/amerihok.cpp82
-rw-r--r--src/mame/drivers/amico2k.cpp9
-rw-r--r--src/mame/drivers/amiga.cpp612
-rw-r--r--src/mame/drivers/ampex.cpp4
-rw-r--r--src/mame/drivers/ampoker2.cpp35
-rw-r--r--src/mame/drivers/ampscarp.cpp9
-rw-r--r--src/mame/drivers/amspdwy.cpp36
-rw-r--r--src/mame/drivers/amstr_pc.cpp22
-rw-r--r--src/mame/drivers/amstrad.cpp163
-rw-r--r--src/mame/drivers/amusco.cpp68
-rw-r--r--src/mame/drivers/amust.cpp34
-rw-r--r--src/mame/drivers/anes.cpp32
-rw-r--r--src/mame/drivers/angelkds.cpp118
-rw-r--r--src/mame/drivers/anzterm.cpp33
-rw-r--r--src/mame/drivers/apc.cpp41
-rw-r--r--src/mame/drivers/apf.cpp60
-rw-r--r--src/mame/drivers/apollo.cpp96
-rw-r--r--src/mame/drivers/apple1.cpp21
-rw-r--r--src/mame/drivers/apple2.cpp90
-rw-r--r--src/mame/drivers/apple2e.cpp217
-rw-r--r--src/mame/drivers/apple2gs.cpp49
-rw-r--r--src/mame/drivers/apple3.cpp6
-rw-r--r--src/mame/drivers/applix.cpp60
-rw-r--r--src/mame/drivers/appoooh.cpp6
-rw-r--r--src/mame/drivers/apricot.cpp12
-rw-r--r--src/mame/drivers/apricotf.cpp45
-rw-r--r--src/mame/drivers/apricotp.cpp59
-rw-r--r--src/mame/drivers/aquarium.cpp50
-rw-r--r--src/mame/drivers/aquarius.cpp39
-rw-r--r--src/mame/drivers/arachnid.cpp18
-rw-r--r--src/mame/drivers/arcadecl.cpp27
-rw-r--r--src/mame/drivers/argo.cpp23
-rw-r--r--src/mame/drivers/argox.cpp11
-rw-r--r--src/mame/drivers/argus.cpp4
-rw-r--r--src/mame/drivers/aristmk4.cpp32
-rw-r--r--src/mame/drivers/aristmk5.cpp1334
-rw-r--r--src/mame/drivers/aristmk6.cpp319
-rw-r--r--src/mame/drivers/arkanoid.cpp124
-rw-r--r--src/mame/drivers/armedf.cpp348
-rw-r--r--src/mame/drivers/arsystems.cpp49
-rw-r--r--src/mame/drivers/artmagic.cpp67
-rw-r--r--src/mame/drivers/ashnojoe.cpp8
-rw-r--r--src/mame/drivers/asst128.cpp32
-rw-r--r--src/mame/drivers/asteroid.cpp38
-rw-r--r--src/mame/drivers/astrafr.cpp50
-rw-r--r--src/mame/drivers/astrcorp.cpp319
-rw-r--r--src/mame/drivers/astrocde.cpp8
-rw-r--r--src/mame/drivers/astrof.cpp52
-rw-r--r--src/mame/drivers/astrohome.cpp79
-rw-r--r--src/mame/drivers/astropc.cpp11
-rw-r--r--src/mame/drivers/asuka.cpp2
-rw-r--r--src/mame/drivers/at.cpp3
-rw-r--r--src/mame/drivers/atari400.cpp4
-rw-r--r--src/mame/drivers/atari_s1.cpp36
-rw-r--r--src/mame/drivers/atari_s2.cpp31
-rw-r--r--src/mame/drivers/atarifb.cpp70
-rw-r--r--src/mame/drivers/atarig1.cpp32
-rw-r--r--src/mame/drivers/atarig42.cpp27
-rw-r--r--src/mame/drivers/atarigt.cpp26
-rw-r--r--src/mame/drivers/atarigx2.cpp24
-rw-r--r--src/mame/drivers/atarist.cpp24
-rw-r--r--src/mame/drivers/atarisy1.cpp54
-rw-r--r--src/mame/drivers/atarittl.cpp77
-rw-r--r--src/mame/drivers/atetris.cpp6
-rw-r--r--src/mame/drivers/atlantis.cpp6
-rw-r--r--src/mame/drivers/atm.cpp25
-rw-r--r--src/mame/drivers/atom.cpp141
-rw-r--r--src/mame/drivers/atronic.cpp34
-rw-r--r--src/mame/drivers/att4425.cpp29
-rw-r--r--src/mame/drivers/att630.cpp20
-rw-r--r--src/mame/drivers/attache.cpp48
-rw-r--r--src/mame/drivers/attckufo.cpp33
-rw-r--r--src/mame/drivers/aussiebyte.cpp11
-rw-r--r--src/mame/drivers/avalnche.cpp31
-rw-r--r--src/mame/drivers/ave_arb.cpp255
-rw-r--r--src/mame/drivers/avigo.cpp28
-rw-r--r--src/mame/drivers/avt.cpp37
-rw-r--r--src/mame/drivers/ax20.cpp30
-rw-r--r--src/mame/drivers/aztarac.cpp32
-rw-r--r--src/mame/drivers/b16.cpp34
-rw-r--r--src/mame/drivers/b2m.cpp48
-rw-r--r--src/mame/drivers/backfire.cpp52
-rw-r--r--src/mame/drivers/badlands.cpp32
-rw-r--r--src/mame/drivers/badlandsbl.cpp34
-rw-r--r--src/mame/drivers/bailey.cpp23
-rw-r--r--src/mame/drivers/banctec.cpp25
-rw-r--r--src/mame/drivers/bankp.cpp37
-rw-r--r--src/mame/drivers/barata.cpp5
-rw-r--r--src/mame/drivers/barni.cpp53
-rw-r--r--src/mame/drivers/bartop52.cpp2
-rw-r--r--src/mame/drivers/batman.cpp22
-rw-r--r--src/mame/drivers/battlane.cpp4
-rw-r--r--src/mame/drivers/battlera.cpp6
-rw-r--r--src/mame/drivers/battlex.cpp40
-rw-r--r--src/mame/drivers/battlnts.cpp36
-rw-r--r--src/mame/drivers/bbc.cpp53
-rw-r--r--src/mame/drivers/bbcbc.cpp12
-rw-r--r--src/mame/drivers/bcs3.cpp58
-rw-r--r--src/mame/drivers/beaminv.cpp23
-rw-r--r--src/mame/drivers/beathead.cpp26
-rw-r--r--src/mame/drivers/bebox.cpp11
-rw-r--r--src/mame/drivers/beehive.cpp25
-rw-r--r--src/mame/drivers/beezer.cpp6
-rw-r--r--src/mame/drivers/belatra.cpp9
-rw-r--r--src/mame/drivers/bert.cpp121
-rw-r--r--src/mame/drivers/berzerk.cpp97
-rw-r--r--src/mame/drivers/besta.cpp21
-rw-r--r--src/mame/drivers/bestleag.cpp41
-rw-r--r--src/mame/drivers/beta.cpp19
-rw-r--r--src/mame/drivers/bfcobra.cpp43
-rw-r--r--src/mame/drivers/bfm_ad5.cpp13
-rw-r--r--src/mame/drivers/bfm_sc1.cpp35
-rw-r--r--src/mame/drivers/bfm_sc2.cpp116
-rw-r--r--src/mame/drivers/bfm_sc4.cpp29
-rw-r--r--src/mame/drivers/bfm_sc5.cpp27
-rw-r--r--src/mame/drivers/bfm_swp.cpp21
-rw-r--r--src/mame/drivers/bfmsys85.cpp19
-rw-r--r--src/mame/drivers/bgt.cpp11
-rw-r--r--src/mame/drivers/bigbord2.cpp24
-rw-r--r--src/mame/drivers/bigevglf.cpp3
-rw-r--r--src/mame/drivers/bigstrkb.cpp38
-rw-r--r--src/mame/drivers/binbug.cpp6
-rw-r--r--src/mame/drivers/bingo.cpp27
-rw-r--r--src/mame/drivers/bingoc.cpp60
-rw-r--r--src/mame/drivers/bingoman.cpp26
-rw-r--r--src/mame/drivers/bingowav.cpp6
-rw-r--r--src/mame/drivers/bionicc.cpp81
-rw-r--r--src/mame/drivers/bitgraph.cpp116
-rw-r--r--src/mame/drivers/bk.cpp8
-rw-r--r--src/mame/drivers/bking.cpp55
-rw-r--r--src/mame/drivers/blackt96.cpp51
-rw-r--r--src/mame/drivers/bladestl.cpp41
-rw-r--r--src/mame/drivers/blitz68k.cpp198
-rw-r--r--src/mame/drivers/blktiger.cpp4
-rw-r--r--src/mame/drivers/blmbycar.cpp48
-rw-r--r--src/mame/drivers/blockout.cpp40
-rw-r--r--src/mame/drivers/blocktax.cpp24
-rw-r--r--src/mame/drivers/bloodbro.cpp2
-rw-r--r--src/mame/drivers/blstroid.cpp24
-rw-r--r--src/mame/drivers/blueprnt.cpp49
-rw-r--r--src/mame/drivers/blw700i.cpp27
-rw-r--r--src/mame/drivers/bmjr.cpp29
-rw-r--r--src/mame/drivers/bml3.cpp108
-rw-r--r--src/mame/drivers/bnstars.cpp73
-rw-r--r--src/mame/drivers/bntyhunt.cpp27
-rw-r--r--src/mame/drivers/bogeyman.cpp34
-rw-r--r--src/mame/drivers/bombjack.cpp16
-rw-r--r--src/mame/drivers/boogwing.cpp38
-rw-r--r--src/mame/drivers/bowltry.cpp28
-rw-r--r--src/mame/drivers/boxer.cpp26
-rw-r--r--src/mame/drivers/br8641.cpp8
-rw-r--r--src/mame/drivers/brkthru.cpp14
-rw-r--r--src/mame/drivers/bsktball.cpp30
-rw-r--r--src/mame/drivers/btime.cpp153
-rw-r--r--src/mame/drivers/btoads.cpp29
-rw-r--r--src/mame/drivers/buggychl.cpp2
-rw-r--r--src/mame/drivers/bullet.cpp110
-rw-r--r--src/mame/drivers/busicom.cpp21
-rw-r--r--src/mame/drivers/buster.cpp27
-rw-r--r--src/mame/drivers/bw12.cpp73
-rw-r--r--src/mame/drivers/bw2.cpp51
-rw-r--r--src/mame/drivers/bwidow.cpp64
-rw-r--r--src/mame/drivers/bwing.cpp51
-rw-r--r--src/mame/drivers/by17.cpp19
-rw-r--r--src/mame/drivers/by35.cpp46
-rw-r--r--src/mame/drivers/by6803.cpp12
-rw-r--r--src/mame/drivers/by68701.cpp9
-rw-r--r--src/mame/drivers/byvid.cpp62
-rw-r--r--src/mame/drivers/c10.cpp27
-rw-r--r--src/mame/drivers/c128.cpp88
-rw-r--r--src/mame/drivers/c2color.cpp127
-rw-r--r--src/mame/drivers/c64.cpp58
-rw-r--r--src/mame/drivers/c64dtv.cpp15
-rw-r--r--src/mame/drivers/c65.cpp68
-rw-r--r--src/mame/drivers/c80.cpp11
-rw-r--r--src/mame/drivers/c900.cpp35
-rw-r--r--src/mame/drivers/cabaret.cpp34
-rw-r--r--src/mame/drivers/calchase.cpp36
-rw-r--r--src/mame/drivers/calcune.cpp82
-rw-r--r--src/mame/drivers/calomega.cpp69
-rw-r--r--src/mame/drivers/calorie.cpp36
-rw-r--r--src/mame/drivers/camplynx.cpp53
-rw-r--r--src/mame/drivers/candela.cpp45
-rw-r--r--src/mame/drivers/canon_s80.cpp9
-rw-r--r--src/mame/drivers/canyon.cpp28
-rw-r--r--src/mame/drivers/capbowl.cpp56
-rw-r--r--src/mame/drivers/capcom.cpp9
-rw-r--r--src/mame/drivers/caprcyc.cpp10
-rw-r--r--src/mame/drivers/cardinal.cpp66
-rw-r--r--src/mame/drivers/cardline.cpp29
-rw-r--r--src/mame/drivers/carjmbre.cpp32
-rw-r--r--src/mame/drivers/carpolo.cpp22
-rw-r--r--src/mame/drivers/carrera.cpp25
-rw-r--r--src/mame/drivers/casloopy.cpp33
-rw-r--r--src/mame/drivers/castle.cpp24
-rw-r--r--src/mame/drivers/caswin.cpp29
-rw-r--r--src/mame/drivers/cat.cpp42
-rw-r--r--src/mame/drivers/cavepc.cpp29
-rw-r--r--src/mame/drivers/cball.cpp24
-rw-r--r--src/mame/drivers/cbasebal.cpp40
-rw-r--r--src/mame/drivers/cbm2.cpp130
-rw-r--r--src/mame/drivers/cbuster.cpp37
-rw-r--r--src/mame/drivers/cc40.cpp32
-rw-r--r--src/mame/drivers/cchance.cpp28
-rw-r--r--src/mame/drivers/cchasm.cpp32
-rw-r--r--src/mame/drivers/cclimber.cpp99
-rw-r--r--src/mame/drivers/ccs2810.cpp25
-rw-r--r--src/mame/drivers/cd2650.cpp4
-rw-r--r--src/mame/drivers/cdc721.cpp31
-rw-r--r--src/mame/drivers/cdi.cpp224
-rw-r--r--src/mame/drivers/cedar_magnet.cpp122
-rw-r--r--src/mame/drivers/centiped.cpp10
-rw-r--r--src/mame/drivers/cesclass.cpp29
-rw-r--r--src/mame/drivers/cgc7900.cpp18
-rw-r--r--src/mame/drivers/cgenie.cpp39
-rw-r--r--src/mame/drivers/chaknpop.cpp30
-rw-r--r--src/mame/drivers/champbas.cpp230
-rw-r--r--src/mame/drivers/champbwl.cpp67
-rw-r--r--src/mame/drivers/chanbara.cpp28
-rw-r--r--src/mame/drivers/chance32.cpp33
-rw-r--r--src/mame/drivers/channelf.cpp132
-rw-r--r--src/mame/drivers/chaos.cpp17
-rw-r--r--src/mame/drivers/cheekyms.cpp28
-rw-r--r--src/mame/drivers/chessmst.cpp121
-rw-r--r--src/mame/drivers/chesstrv.cpp376
-rw-r--r--src/mame/drivers/chexx.cpp4
-rw-r--r--src/mame/drivers/chicago.cpp23
-rw-r--r--src/mame/drivers/chihiro.cpp184
-rw-r--r--src/mame/drivers/chinagat.cpp18
-rw-r--r--src/mame/drivers/chsuper.cpp39
-rw-r--r--src/mame/drivers/cidelsa.cpp6
-rw-r--r--src/mame/drivers/circusc.cpp46
-rw-r--r--src/mame/drivers/cischeat.cpp250
-rw-r--r--src/mame/drivers/citycon.cpp28
-rw-r--r--src/mame/drivers/cking_master.cpp239
-rw-r--r--src/mame/drivers/ckz80.cpp473
-rw-r--r--src/mame/drivers/clayshoo.cpp26
-rw-r--r--src/mame/drivers/clcd.cpp24
-rw-r--r--src/mame/drivers/clickstart.cpp441
-rw-r--r--src/mame/drivers/cliffhgr.cpp74
-rw-r--r--src/mame/drivers/clowndwn.cpp20
-rw-r--r--src/mame/drivers/clpoker.cpp33
-rw-r--r--src/mame/drivers/clshroad.cpp72
-rw-r--r--src/mame/drivers/cm1800.cpp7
-rw-r--r--src/mame/drivers/cmi.cpp108
-rw-r--r--src/mame/drivers/cmmb.cpp26
-rw-r--r--src/mame/drivers/cms.cpp2
-rw-r--r--src/mame/drivers/cninja.cpp215
-rw-r--r--src/mame/drivers/cntsteer.cpp71
-rw-r--r--src/mame/drivers/cobra.cpp24
-rw-r--r--src/mame/drivers/coco12.cpp123
-rw-r--r--src/mame/drivers/coco3.cpp75
-rw-r--r--src/mame/drivers/cocoloco.cpp12
-rw-r--r--src/mame/drivers/coinmstr.cpp71
-rw-r--r--src/mame/drivers/coinmvga.cpp46
-rw-r--r--src/mame/drivers/coleco.cpp7
-rw-r--r--src/mame/drivers/comebaby.cpp29
-rw-r--r--src/mame/drivers/commando.cpp20
-rw-r--r--src/mame/drivers/compc.cpp40
-rw-r--r--src/mame/drivers/compgolf.cpp28
-rw-r--r--src/mame/drivers/compis.cpp44
-rw-r--r--src/mame/drivers/compucolor.cpp21
-rw-r--r--src/mame/drivers/comquest.cpp31
-rw-r--r--src/mame/drivers/comx35.cpp14
-rw-r--r--src/mame/drivers/concept.cpp29
-rw-r--r--src/mame/drivers/contra.cpp32
-rw-r--r--src/mame/drivers/controlid.cpp19
-rw-r--r--src/mame/drivers/coolpool.cpp49
-rw-r--r--src/mame/drivers/coolridr.cpp58
-rw-r--r--src/mame/drivers/cop01.cpp79
-rw-r--r--src/mame/drivers/copsnrob.cpp12
-rw-r--r--src/mame/drivers/corona.cpp171
-rw-r--r--src/mame/drivers/cortex.cpp44
-rw-r--r--src/mame/drivers/cosmic.cpp22
-rw-r--r--src/mame/drivers/cosmicos.cpp15
-rw-r--r--src/mame/drivers/cp1.cpp30
-rw-r--r--src/mame/drivers/cps1.cpp212
-rw-r--r--src/mame/drivers/cps2.cpp67
-rw-r--r--src/mame/drivers/cps3.cpp211
-rw-r--r--src/mame/drivers/craft.cpp1
-rw-r--r--src/mame/drivers/crbaloon.cpp31
-rw-r--r--src/mame/drivers/cromptons.cpp150
-rw-r--r--src/mame/drivers/crospang.cpp114
-rw-r--r--src/mame/drivers/crvision.cpp20
-rw-r--r--src/mame/drivers/csplayh5.cpp16
-rw-r--r--src/mame/drivers/cswat.cpp33
-rw-r--r--src/mame/drivers/ct486.cpp53
-rw-r--r--src/mame/drivers/cubeqst.cpp1
-rw-r--r--src/mame/drivers/cubo.cpp41
-rw-r--r--src/mame/drivers/cultures.cpp34
-rw-r--r--src/mame/drivers/cupidon.cpp21
-rw-r--r--src/mame/drivers/cvicny.cpp9
-rw-r--r--src/mame/drivers/cvs.cpp1
-rw-r--r--src/mame/drivers/cxg_ch2001.cpp193
-rw-r--r--src/mame/drivers/cxgz80.cpp437
-rw-r--r--src/mame/drivers/cxhumax.cpp33
-rw-r--r--src/mame/drivers/cyberbal.cpp35
-rw-r--r--src/mame/drivers/cybertnk.cpp61
-rw-r--r--src/mame/drivers/cybiko.cpp8
-rw-r--r--src/mame/drivers/cybstorm.cpp23
-rw-r--r--src/mame/drivers/cyclemb.cpp53
-rw-r--r--src/mame/drivers/cz101.cpp25
-rw-r--r--src/mame/drivers/d6800.cpp64
-rw-r--r--src/mame/drivers/d6809.cpp18
-rw-r--r--src/mame/drivers/d9final.cpp39
-rw-r--r--src/mame/drivers/dacholer.cpp8
-rw-r--r--src/mame/drivers/dai.cpp43
-rw-r--r--src/mame/drivers/dai3wksi.cpp6
-rw-r--r--src/mame/drivers/dambustr.cpp23
-rw-r--r--src/mame/drivers/darkmist.cpp29
-rw-r--r--src/mame/drivers/darkseal.cpp41
-rw-r--r--src/mame/drivers/daruma.cpp16
-rw-r--r--src/mame/drivers/dassault.cpp52
-rw-r--r--src/mame/drivers/datum.cpp11
-rw-r--r--src/mame/drivers/dblcrown.cpp30
-rw-r--r--src/mame/drivers/dblewing.cpp44
-rw-r--r--src/mame/drivers/dbox.cpp12
-rw-r--r--src/mame/drivers/dbz.cpp38
-rw-r--r--src/mame/drivers/dccons.cpp60
-rw-r--r--src/mame/drivers/dcheese.cpp65
-rw-r--r--src/mame/drivers/dday.cpp24
-rw-r--r--src/mame/drivers/ddayjlc.cpp36
-rw-r--r--src/mame/drivers/ddealer.cpp33
-rw-r--r--src/mame/drivers/ddenlovr.cpp227
-rw-r--r--src/mame/drivers/ddragon.cpp29
-rw-r--r--src/mame/drivers/ddragon3.cpp108
-rw-r--r--src/mame/drivers/ddribble.cpp59
-rw-r--r--src/mame/drivers/de_3.cpp15
-rw-r--r--src/mame/drivers/dec0.cpp224
-rw-r--r--src/mame/drivers/deco156.cpp70
-rw-r--r--src/mame/drivers/deco32.cpp2
-rw-r--r--src/mame/drivers/deco_ld.cpp30
-rw-r--r--src/mame/drivers/deco_mlc.cpp99
-rw-r--r--src/mame/drivers/decocass.cpp183
-rw-r--r--src/mame/drivers/decstation.cpp186
-rw-r--r--src/mame/drivers/dectalk.cpp33
-rw-r--r--src/mame/drivers/decwritr.cpp38
-rw-r--r--src/mame/drivers/deniam.cpp6
-rw-r--r--src/mame/drivers/deshoros.cpp26
-rw-r--r--src/mame/drivers/destroyr.cpp28
-rw-r--r--src/mame/drivers/dfruit.cpp34
-rw-r--r--src/mame/drivers/dgn_beta.cpp47
-rw-r--r--src/mame/drivers/dgpix.cpp25
-rw-r--r--src/mame/drivers/diablo1300.cpp11
-rw-r--r--src/mame/drivers/didact.cpp449
-rw-r--r--src/mame/drivers/dietgo.cpp33
-rw-r--r--src/mame/drivers/digel804.cpp44
-rw-r--r--src/mame/drivers/digijet.cpp9
-rw-r--r--src/mame/drivers/dim68k.cpp32
-rw-r--r--src/mame/drivers/discoboy.cpp53
-rw-r--r--src/mame/drivers/divebomb.cpp59
-rw-r--r--src/mame/drivers/diverboy.cpp35
-rw-r--r--src/mame/drivers/djboy.cpp159
-rw-r--r--src/mame/drivers/djmain.cpp58
-rw-r--r--src/mame/drivers/dkmb.cpp24
-rw-r--r--src/mame/drivers/dkong.cpp84
-rw-r--r--src/mame/drivers/dlair.cpp34
-rw-r--r--src/mame/drivers/dlair2.cpp30
-rw-r--r--src/mame/drivers/dm7000.cpp2
-rw-r--r--src/mame/drivers/dmax8000.cpp20
-rw-r--r--src/mame/drivers/dmndrby.cpp39
-rw-r--r--src/mame/drivers/dms5000.cpp27
-rw-r--r--src/mame/drivers/dmv.cpp185
-rw-r--r--src/mame/drivers/docastle.cpp72
-rw-r--r--src/mame/drivers/dogfgt.cpp36
-rw-r--r--src/mame/drivers/dominob.cpp28
-rw-r--r--src/mame/drivers/dooyong.cpp321
-rw-r--r--src/mame/drivers/dorachan.cpp24
-rw-r--r--src/mame/drivers/dotrikun.cpp29
-rw-r--r--src/mame/drivers/dps1.cpp25
-rw-r--r--src/mame/drivers/dragon.cpp141
-rw-r--r--src/mame/drivers/dragrace.cpp36
-rw-r--r--src/mame/drivers/dreambal.cpp32
-rw-r--r--src/mame/drivers/dreamwld.cpp58
-rw-r--r--src/mame/drivers/drgnmst.cpp54
-rw-r--r--src/mame/drivers/dribling.cpp30
-rw-r--r--src/mame/drivers/drmicro.cpp56
-rw-r--r--src/mame/drivers/drtomy.cpp29
-rw-r--r--src/mame/drivers/drw80pkr.cpp27
-rw-r--r--src/mame/drivers/dual68.cpp25
-rw-r--r--src/mame/drivers/duet16.cpp73
-rw-r--r--src/mame/drivers/dunhuang.cpp35
-rw-r--r--src/mame/drivers/dvk_kcgd.cpp24
-rw-r--r--src/mame/drivers/dvk_ksm.cpp60
-rw-r--r--src/mame/drivers/dynadice.cpp40
-rw-r--r--src/mame/drivers/dynax.cpp235
-rw-r--r--src/mame/drivers/e100.cpp35
-rw-r--r--src/mame/drivers/eacc.cpp13
-rw-r--r--src/mame/drivers/ec184x.cpp126
-rw-r--r--src/mame/drivers/ec65.cpp52
-rw-r--r--src/mame/drivers/ecoinf1.cpp11
-rw-r--r--src/mame/drivers/ecoinf2.cpp2
-rw-r--r--src/mame/drivers/ecoinf3.cpp2
-rw-r--r--src/mame/drivers/efdt.cpp33
-rw-r--r--src/mame/drivers/egghunt.cpp37
-rw-r--r--src/mame/drivers/einstein.cpp44
-rw-r--r--src/mame/drivers/electra.cpp23
-rw-r--r--src/mame/drivers/electron.cpp25
-rw-r--r--src/mame/drivers/elekscmp.cpp9
-rw-r--r--src/mame/drivers/elektronmono.cpp9
-rw-r--r--src/mame/drivers/elf.cpp33
-rw-r--r--src/mame/drivers/elwro800.cpp53
-rw-r--r--src/mame/drivers/embargo.cpp25
-rw-r--r--src/mame/drivers/emma2.cpp15
-rw-r--r--src/mame/drivers/enigma2.cpp46
-rw-r--r--src/mame/drivers/eolith.cpp4
-rw-r--r--src/mame/drivers/eolith16.cpp31
-rw-r--r--src/mame/drivers/ep64.cpp10
-rw-r--r--src/mame/drivers/epos.cpp52
-rw-r--r--src/mame/drivers/eprom.cpp104
-rw-r--r--src/mame/drivers/equites.cpp1
-rw-r--r--src/mame/drivers/ertictac.cpp1
-rw-r--r--src/mame/drivers/esd16.cpp371
-rw-r--r--src/mame/drivers/esh.cpp24
-rw-r--r--src/mame/drivers/espial.cpp45
-rw-r--r--src/mame/drivers/esq5505.cpp13
-rw-r--r--src/mame/drivers/esqasr.cpp17
-rw-r--r--src/mame/drivers/esqkt.cpp10
-rw-r--r--src/mame/drivers/esripsys.cpp1
-rw-r--r--src/mame/drivers/et3400.cpp15
-rw-r--r--src/mame/drivers/eti660.cpp10
-rw-r--r--src/mame/drivers/ettrivia.cpp51
-rw-r--r--src/mame/drivers/eurocom2.cpp71
-rw-r--r--src/mame/drivers/europc.cpp99
-rw-r--r--src/mame/drivers/evmbug.cpp25
-rw-r--r--src/mame/drivers/excali64.cpp48
-rw-r--r--src/mame/drivers/exedexes.cpp48
-rw-r--r--src/mame/drivers/exelv.cpp2
-rw-r--r--src/mame/drivers/exerion.cpp22
-rw-r--r--src/mame/drivers/exidy.cpp104
-rw-r--r--src/mame/drivers/exidy440.cpp23
-rw-r--r--src/mame/drivers/exidyttl.cpp46
-rw-r--r--src/mame/drivers/expro02.cpp143
-rw-r--r--src/mame/drivers/exterm.cpp33
-rw-r--r--src/mame/drivers/extrema.cpp11
-rw-r--r--src/mame/drivers/exzisus.cpp48
-rw-r--r--src/mame/drivers/ez2d.cpp22
-rw-r--r--src/mame/drivers/f-32.cpp68
-rw-r--r--src/mame/drivers/fantland.cpp83
-rw-r--r--src/mame/drivers/fanucs15.cpp27
-rw-r--r--src/mame/drivers/fanucspmg.cpp3
-rw-r--r--src/mame/drivers/fastfred.cpp87
-rw-r--r--src/mame/drivers/fb01.cpp42
-rw-r--r--src/mame/drivers/fc100.cpp55
-rw-r--r--src/mame/drivers/fccpu20.cpp75
-rw-r--r--src/mame/drivers/fccpu30.cpp77
-rw-r--r--src/mame/drivers/fcombat.cpp22
-rw-r--r--src/mame/drivers/fcrash.cpp643
-rw-r--r--src/mame/drivers/feversoc.cpp31
-rw-r--r--src/mame/drivers/fgoal.cpp22
-rw-r--r--src/mame/drivers/fidel6502.cpp2902
-rw-r--r--src/mame/drivers/fidel68k.cpp818
-rw-r--r--src/mame/drivers/fidel_as12.cpp192
-rw-r--r--src/mame/drivers/fidel_card.cpp675
-rw-r--r--src/mame/drivers/fidel_cc1.cpp221
-rw-r--r--src/mame/drivers/fidel_cc10.cpp321
-rw-r--r--src/mame/drivers/fidel_cc7.cpp245
-rw-r--r--src/mame/drivers/fidel_chesster.cpp227
-rw-r--r--src/mame/drivers/fidel_csc.cpp712
-rw-r--r--src/mame/drivers/fidel_dames.cpp180
-rw-r--r--src/mame/drivers/fidel_desdis.cpp358
-rw-r--r--src/mame/drivers/fidel_eag68k.cpp737
-rw-r--r--src/mame/drivers/fidel_elite.cpp647
-rw-r--r--src/mame/drivers/fidel_excel.cpp523
-rw-r--r--src/mame/drivers/fidel_phantom.cpp143
-rw-r--r--src/mame/drivers/fidel_sc12.cpp244
-rw-r--r--src/mame/drivers/fidel_sc6.cpp (renamed from src/mame/drivers/fidelmcs48.cpp)149
-rw-r--r--src/mame/drivers/fidel_sc8.cpp157
-rw-r--r--src/mame/drivers/fidel_sc9.cpp295
-rw-r--r--src/mame/drivers/fidel_vcc.cpp386
-rw-r--r--src/mame/drivers/fidel_vsc.cpp430
-rw-r--r--src/mame/drivers/fidelz80.cpp2045
-rw-r--r--src/mame/drivers/finalizr.cpp70
-rw-r--r--src/mame/drivers/fireball.cpp11
-rw-r--r--src/mame/drivers/firebeat.cpp4
-rw-r--r--src/mame/drivers/firefox.cpp68
-rw-r--r--src/mame/drivers/firetrap.cpp105
-rw-r--r--src/mame/drivers/firetrk.cpp60
-rw-r--r--src/mame/drivers/fitfight.cpp44
-rw-r--r--src/mame/drivers/fk1.cpp31
-rw-r--r--src/mame/drivers/flipjack.cpp6
-rw-r--r--src/mame/drivers/flower.cpp38
-rw-r--r--src/mame/drivers/flstory.cpp1
-rw-r--r--src/mame/drivers/flyball.cpp28
-rw-r--r--src/mame/drivers/fm7.cpp288
-rw-r--r--src/mame/drivers/fontwriter.cpp60
-rw-r--r--src/mame/drivers/foodf.cpp2
-rw-r--r--src/mame/drivers/force68k.cpp76
-rw-r--r--src/mame/drivers/forte2.cpp3
-rw-r--r--src/mame/drivers/fortecar.cpp31
-rw-r--r--src/mame/drivers/fp1100.cpp43
-rw-r--r--src/mame/drivers/fp6000.cpp34
-rw-r--r--src/mame/drivers/freekick.cpp323
-rw-r--r--src/mame/drivers/freeway.cpp191
-rw-r--r--src/mame/drivers/fresh.cpp29
-rw-r--r--src/mame/drivers/fromance.cpp130
-rw-r--r--src/mame/drivers/fruitpc.cpp22
-rw-r--r--src/mame/drivers/fs3216.cpp357
-rw-r--r--src/mame/drivers/fungames.cpp23
-rw-r--r--src/mame/drivers/funkball.cpp32
-rw-r--r--src/mame/drivers/funkybee.cpp28
-rw-r--r--src/mame/drivers/funkyjet.cpp34
-rw-r--r--src/mame/drivers/funtech.cpp34
-rw-r--r--src/mame/drivers/funworld.cpp767
-rw-r--r--src/mame/drivers/funybubl.cpp40
-rw-r--r--src/mame/drivers/fuukifg2.cpp4
-rw-r--r--src/mame/drivers/g627.cpp14
-rw-r--r--src/mame/drivers/gaelco.cpp138
-rw-r--r--src/mame/drivers/gaelco2.cpp384
-rw-r--r--src/mame/drivers/gaelcopc.cpp27
-rw-r--r--src/mame/drivers/gaiden.cpp2
-rw-r--r--src/mame/drivers/gal3.cpp69
-rw-r--r--src/mame/drivers/galaga.cpp8
-rw-r--r--src/mame/drivers/galastrm.cpp40
-rw-r--r--src/mame/drivers/galaxi.cpp47
-rw-r--r--src/mame/drivers/galaxian.cpp835
-rw-r--r--src/mame/drivers/galaxold.cpp316
-rw-r--r--src/mame/drivers/galaxy.cpp74
-rw-r--r--src/mame/drivers/galeb.cpp32
-rw-r--r--src/mame/drivers/galgames.cpp155
-rw-r--r--src/mame/drivers/galivan.cpp123
-rw-r--r--src/mame/drivers/galpani2.cpp38
-rw-r--r--src/mame/drivers/galpani3.cpp46
-rw-r--r--src/mame/drivers/galpanic.cpp42
-rw-r--r--src/mame/drivers/galspnbl.cpp6
-rw-r--r--src/mame/drivers/gamate.cpp21
-rw-r--r--src/mame/drivers/gambl186.cpp25
-rw-r--r--src/mame/drivers/gamecom.cpp34
-rw-r--r--src/mame/drivers/gamecstl.cpp30
-rw-r--r--src/mame/drivers/gamecube.cpp9
-rw-r--r--src/mame/drivers/gameking.cpp34
-rw-r--r--src/mame/drivers/gamemachine.cpp419
-rw-r--r--src/mame/drivers/gamepock.cpp9
-rw-r--r--src/mame/drivers/gammagic.cpp13
-rw-r--r--src/mame/drivers/gamtor.cpp22
-rw-r--r--src/mame/drivers/gatron.cpp39
-rw-r--r--src/mame/drivers/gauntlet.cpp94
-rw-r--r--src/mame/drivers/gb.cpp20
-rw-r--r--src/mame/drivers/gba.cpp54
-rw-r--r--src/mame/drivers/gberet.cpp70
-rw-r--r--src/mame/drivers/gcpinbal.cpp31
-rw-r--r--src/mame/drivers/gei.cpp109
-rw-r--r--src/mame/drivers/geneve.cpp51
-rw-r--r--src/mame/drivers/geniusiq.cpp22
-rw-r--r--src/mame/drivers/genpc.cpp69
-rw-r--r--src/mame/drivers/ggconnie.cpp104
-rw-r--r--src/mame/drivers/ghosteo.cpp22
-rw-r--r--src/mame/drivers/giclassic.cpp51
-rw-r--r--src/mame/drivers/gimix.cpp21
-rw-r--r--src/mame/drivers/ginganin.cpp37
-rw-r--r--src/mame/drivers/gizmondo.cpp23
-rw-r--r--src/mame/drivers/gkigt.cpp51
-rw-r--r--src/mame/drivers/gladiatr.cpp112
-rw-r--r--src/mame/drivers/glasgow.cpp35
-rw-r--r--src/mame/drivers/glass.cpp45
-rw-r--r--src/mame/drivers/globalvr.cpp9
-rw-r--r--src/mame/drivers/gluck2.cpp30
-rw-r--r--src/mame/drivers/gmaster.cpp13
-rw-r--r--src/mame/drivers/gng.cpp70
-rw-r--r--src/mame/drivers/go2000.cpp39
-rw-r--r--src/mame/drivers/goal92.cpp2
-rw-r--r--src/mame/drivers/goindol.cpp44
-rw-r--r--src/mame/drivers/gokidetor.cpp16
-rw-r--r--src/mame/drivers/goldnpkr.cpp39
-rw-r--r--src/mame/drivers/goldstar.cpp882
-rw-r--r--src/mame/drivers/gomoku.cpp28
-rw-r--r--src/mame/drivers/good.cpp32
-rw-r--r--src/mame/drivers/gotcha.cpp60
-rw-r--r--src/mame/drivers/gottlieb.cpp24
-rw-r--r--src/mame/drivers/gp2x.cpp23
-rw-r--r--src/mame/drivers/gp32.cpp42
-rw-r--r--src/mame/drivers/gp_2.cpp7
-rw-r--r--src/mame/drivers/gpworld.cpp24
-rw-r--r--src/mame/drivers/grchamp.cpp41
-rw-r--r--src/mame/drivers/grfd2301.cpp25
-rw-r--r--src/mame/drivers/gridcomp.cpp108
-rw-r--r--src/mame/drivers/groundfx.cpp26
-rw-r--r--src/mame/drivers/gstream.cpp61
-rw-r--r--src/mame/drivers/gsword.cpp95
-rw-r--r--src/mame/drivers/gts80a.cpp28
-rw-r--r--src/mame/drivers/guab.cpp8
-rw-r--r--src/mame/drivers/gumbo.cpp48
-rw-r--r--src/mame/drivers/gunbustr.cpp26
-rw-r--r--src/mame/drivers/gundealr.cpp52
-rw-r--r--src/mame/drivers/gunpey.cpp34
-rw-r--r--src/mame/drivers/gunsmoke.cpp56
-rw-r--r--src/mame/drivers/gyruss.cpp38
-rw-r--r--src/mame/drivers/h19.cpp56
-rw-r--r--src/mame/drivers/halleys.cpp51
-rw-r--r--src/mame/drivers/hanaawas.cpp28
-rw-r--r--src/mame/drivers/hankin.cpp24
-rw-r--r--src/mame/drivers/hapyfish.cpp34
-rw-r--r--src/mame/drivers/harddriv.cpp10
-rw-r--r--src/mame/drivers/hazeltin.cpp21
-rw-r--r--src/mame/drivers/headonb.cpp32
-rw-r--r--src/mame/drivers/hec2hrp.cpp277
-rw-r--r--src/mame/drivers/hh_amis2k.cpp478
-rw-r--r--src/mame/drivers/hh_cop400.cpp325
-rw-r--r--src/mame/drivers/hh_hmcs40.cpp1382
-rw-r--r--src/mame/drivers/hh_melps4.cpp95
-rw-r--r--src/mame/drivers/hh_pic16.cpp295
-rw-r--r--src/mame/drivers/hh_sm510.cpp3542
-rw-r--r--src/mame/drivers/hh_tms1k.cpp2764
-rw-r--r--src/mame/drivers/hh_ucom4.cpp638
-rw-r--r--src/mame/drivers/hideseek.cpp28
-rw-r--r--src/mame/drivers/higemaru.cpp28
-rw-r--r--src/mame/drivers/highvdeo.cpp204
-rw-r--r--src/mame/drivers/hitme.cpp45
-rw-r--r--src/mame/drivers/hitpoker.cpp3
-rw-r--r--src/mame/drivers/hk68v10.cpp13
-rw-r--r--src/mame/drivers/hnayayoi.cpp47
-rw-r--r--src/mame/drivers/hng64.cpp11
-rw-r--r--src/mame/drivers/holeland.cpp64
-rw-r--r--src/mame/drivers/homedata.cpp430
-rw-r--r--src/mame/drivers/homelab.cpp108
-rw-r--r--src/mame/drivers/homerun.cpp88
-rw-r--r--src/mame/drivers/homez80.cpp29
-rw-r--r--src/mame/drivers/horizon.cpp58
-rw-r--r--src/mame/drivers/hornet.cpp21
-rw-r--r--src/mame/drivers/hotblock.cpp22
-rw-r--r--src/mame/drivers/hotstuff.cpp32
-rw-r--r--src/mame/drivers/hp16500.cpp49
-rw-r--r--src/mame/drivers/hp2100.cpp5
-rw-r--r--src/mame/drivers/hp2640.cpp43
-rw-r--r--src/mame/drivers/hp48.cpp1
-rw-r--r--src/mame/drivers/hp49gp.cpp23
-rw-r--r--src/mame/drivers/hp64k.cpp76
-rw-r--r--src/mame/drivers/hp80.cpp90
-rw-r--r--src/mame/drivers/hp95lx.cpp34
-rw-r--r--src/mame/drivers/hp9825.cpp317
-rw-r--r--src/mame/drivers/hp9845.cpp147
-rw-r--r--src/mame/drivers/hp9k.cpp31
-rw-r--r--src/mame/drivers/hp9k_3xx.cpp97
-rw-r--r--src/mame/drivers/hp_ipc.cpp98
-rw-r--r--src/mame/drivers/hprot1.cpp53
-rw-r--r--src/mame/drivers/hpz80unk.cpp16
-rw-r--r--src/mame/drivers/hshavoc.cpp2
-rw-r--r--src/mame/drivers/ht68k.cpp31
-rw-r--r--src/mame/drivers/huebler.cpp21
-rw-r--r--src/mame/drivers/hunter2.cpp54
-rw-r--r--src/mame/drivers/hvyunit.cpp51
-rw-r--r--src/mame/drivers/hx20.cpp46
-rw-r--r--src/mame/drivers/hyhoo.cpp33
-rw-r--r--src/mame/drivers/hyperscan.cpp25
-rw-r--r--src/mame/drivers/hyperspt.cpp77
-rw-r--r--src/mame/drivers/hyprduel.cpp68
-rw-r--r--src/mame/drivers/i7000.cpp23
-rw-r--r--src/mame/drivers/ibm3153.cpp25
-rw-r--r--src/mame/drivers/ibm6580.cpp107
-rw-r--r--src/mame/drivers/ibmpc.cpp84
-rw-r--r--src/mame/drivers/ibmpcjr.cpp51
-rw-r--r--src/mame/drivers/icatel.cpp25
-rw-r--r--src/mame/drivers/ice_bozopail.cpp10
-rw-r--r--src/mame/drivers/ice_tbd.cpp12
-rw-r--r--src/mame/drivers/icebox.cpp21
-rw-r--r--src/mame/drivers/icecold.cpp8
-rw-r--r--src/mame/drivers/ichiban.cpp60
-rw-r--r--src/mame/drivers/idsa.cpp17
-rw-r--r--src/mame/drivers/ie15.cpp7
-rw-r--r--src/mame/drivers/if800.cpp28
-rw-r--r--src/mame/drivers/igs009.cpp47
-rw-r--r--src/mame/drivers/igs011.cpp37
-rw-r--r--src/mame/drivers/igs017.cpp297
-rw-r--r--src/mame/drivers/igs_m027.cpp64
-rw-r--r--src/mame/drivers/igs_m036.cpp62
-rw-r--r--src/mame/drivers/igspc.cpp11
-rw-r--r--src/mame/drivers/igspoker.cpp87
-rw-r--r--src/mame/drivers/ikki.cpp38
-rw-r--r--src/mame/drivers/imds2.cpp2
-rw-r--r--src/mame/drivers/imolagp.cpp40
-rw-r--r--src/mame/drivers/inder.cpp65
-rw-r--r--src/mame/drivers/inderp.cpp15
-rw-r--r--src/mame/drivers/indiana.cpp18
-rw-r--r--src/mame/drivers/indigo.cpp385
-rw-r--r--src/mame/drivers/indy_indigo2.cpp119
-rw-r--r--src/mame/drivers/instantm.cpp26
-rw-r--r--src/mame/drivers/instruct.cpp4
-rw-r--r--src/mame/drivers/inteladv.cpp23
-rw-r--r--src/mame/drivers/intellect02.cpp321
-rw-r--r--src/mame/drivers/interact.cpp80
-rw-r--r--src/mame/drivers/interpro.cpp32
-rw-r--r--src/mame/drivers/intrscti.cpp40
-rw-r--r--src/mame/drivers/intv.cpp107
-rw-r--r--src/mame/drivers/invqix.cpp33
-rw-r--r--src/mame/drivers/ipds.cpp31
-rw-r--r--src/mame/drivers/iphone2g.cpp16
-rw-r--r--src/mame/drivers/iq151.cpp109
-rw-r--r--src/mame/drivers/iqblock.cpp32
-rw-r--r--src/mame/drivers/iqunlim.cpp21
-rw-r--r--src/mame/drivers/iris3130.cpp8
-rw-r--r--src/mame/drivers/irisha.cpp32
-rw-r--r--src/mame/drivers/irobot.cpp4
-rw-r--r--src/mame/drivers/ironhors.cpp61
-rw-r--r--src/mame/drivers/isbc8010.cpp60
-rw-r--r--src/mame/drivers/iskr103x.cpp46
-rw-r--r--src/mame/drivers/istellar.cpp32
-rw-r--r--src/mame/drivers/istrebiteli.cpp38
-rw-r--r--src/mame/drivers/iteagle.cpp65
-rw-r--r--src/mame/drivers/itech32.cpp43
-rw-r--r--src/mame/drivers/itech8.cpp4
-rw-r--r--src/mame/drivers/itgambl2.cpp22
-rw-r--r--src/mame/drivers/itgambl3.cpp25
-rw-r--r--src/mame/drivers/itt3030.cpp32
-rw-r--r--src/mame/drivers/jack.cpp86
-rw-r--r--src/mame/drivers/jackal.cpp32
-rw-r--r--src/mame/drivers/jackpool.cpp28
-rw-r--r--src/mame/drivers/jaguar.cpp6
-rw-r--r--src/mame/drivers/jailbrek.cpp33
-rw-r--r--src/mame/drivers/jalmah.cpp52
-rw-r--r--src/mame/drivers/jangou.cpp102
-rw-r--r--src/mame/drivers/jankenmn.cpp12
-rw-r--r--src/mame/drivers/jantotsu.cpp45
-rw-r--r--src/mame/drivers/jazz.cpp276
-rw-r--r--src/mame/drivers/jchan.cpp38
-rw-r--r--src/mame/drivers/jclub2.cpp98
-rw-r--r--src/mame/drivers/jedi.cpp12
-rw-r--r--src/mame/drivers/jensen.cpp246
-rw-r--r--src/mame/drivers/jeutel.cpp31
-rw-r--r--src/mame/drivers/joctronic.cpp60
-rw-r--r--src/mame/drivers/jokrwild.cpp25
-rw-r--r--src/mame/drivers/jollyjgr.cpp34
-rw-r--r--src/mame/drivers/jongkyo.cpp20
-rw-r--r--src/mame/drivers/jonos.cpp27
-rw-r--r--src/mame/drivers/joystand.cpp52
-rw-r--r--src/mame/drivers/jp.cpp31
-rw-r--r--src/mame/drivers/jpmimpct.cpp50
-rw-r--r--src/mame/drivers/jpmmps.cpp33
-rw-r--r--src/mame/drivers/jpms80.cpp28
-rw-r--r--src/mame/drivers/jpmsru.cpp10
-rw-r--r--src/mame/drivers/jpmsys5.cpp39
-rw-r--r--src/mame/drivers/jpmsys7.cpp11
-rw-r--r--src/mame/drivers/jr100.cpp4
-rw-r--r--src/mame/drivers/jr200.cpp32
-rw-r--r--src/mame/drivers/jtc.cpp80
-rw-r--r--src/mame/drivers/jubilee.cpp36
-rw-r--r--src/mame/drivers/juicebox.cpp33
-rw-r--r--src/mame/drivers/jungleyo.cpp32
-rw-r--r--src/mame/drivers/junior.cpp27
-rw-r--r--src/mame/drivers/junofrst.cpp24
-rw-r--r--src/mame/drivers/jupace.cpp44
-rw-r--r--src/mame/drivers/jupiter.cpp33
-rw-r--r--src/mame/drivers/jvh.cpp44
-rw-r--r--src/mame/drivers/k1003.cpp11
-rw-r--r--src/mame/drivers/k28.cpp301
-rw-r--r--src/mame/drivers/k8915.cpp25
-rw-r--r--src/mame/drivers/kaneko16.cpp199
-rw-r--r--src/mame/drivers/kangaroo.cpp36
-rw-r--r--src/mame/drivers/karnov.cpp4
-rw-r--r--src/mame/drivers/kas89.cpp22
-rw-r--r--src/mame/drivers/kaypro.cpp116
-rw-r--r--src/mame/drivers/kc.cpp141
-rw-r--r--src/mame/drivers/kchamp.cpp196
-rw-r--r--src/mame/drivers/kdt6.cpp31
-rw-r--r--src/mame/drivers/kickgoal.cpp100
-rw-r--r--src/mame/drivers/kim1.cpp38
-rw-r--r--src/mame/drivers/kingdrby.cpp69
-rw-r--r--src/mame/drivers/kingobox.cpp84
-rw-r--r--src/mame/drivers/kingpin.cpp3
-rw-r--r--src/mame/drivers/klax.cpp55
-rw-r--r--src/mame/drivers/kncljoe.cpp42
-rw-r--r--src/mame/drivers/koftball.cpp45
-rw-r--r--src/mame/drivers/koikoi.cpp28
-rw-r--r--src/mame/drivers/konamigv.cpp40
-rw-r--r--src/mame/drivers/konamigx.cpp2
-rw-r--r--src/mame/drivers/konamim2.cpp11
-rw-r--r--src/mame/drivers/konblands.cpp33
-rw-r--r--src/mame/drivers/konendev.cpp31
-rw-r--r--src/mame/drivers/konmedal68k.cpp31
-rw-r--r--src/mame/drivers/kontest.cpp36
-rw-r--r--src/mame/drivers/kopunch.cpp28
-rw-r--r--src/mame/drivers/kramermc.cpp28
-rw-r--r--src/mame/drivers/kron.cpp27
-rw-r--r--src/mame/drivers/krz2000.cpp7
-rw-r--r--src/mame/drivers/ksayakyu.cpp41
-rw-r--r--src/mame/drivers/kungfur.cpp30
-rw-r--r--src/mame/drivers/kurukuru.cpp48
-rw-r--r--src/mame/drivers/kyocera.cpp40
-rw-r--r--src/mame/drivers/kyugo.cpp90
-rw-r--r--src/mame/drivers/labyrunr.cpp28
-rw-r--r--src/mame/drivers/ladybug.cpp82
-rw-r--r--src/mame/drivers/ladyfrog.cpp1
-rw-r--r--src/mame/drivers/laser3k.cpp29
-rw-r--r--src/mame/drivers/laserbas.cpp47
-rw-r--r--src/mame/drivers/lasso.cpp106
-rw-r--r--src/mame/drivers/lastbank.cpp45
-rw-r--r--src/mame/drivers/lastfght.cpp26
-rw-r--r--src/mame/drivers/laz_aftrshok.cpp118
-rw-r--r--src/mame/drivers/laz_awetoss.cpp17
-rw-r--r--src/mame/drivers/laz_ribrac.cpp15
-rw-r--r--src/mame/drivers/lazercmd.cpp122
-rw-r--r--src/mame/drivers/lb186.cpp56
-rw-r--r--src/mame/drivers/lbeach.cpp26
-rw-r--r--src/mame/drivers/lc80.cpp44
-rw-r--r--src/mame/drivers/lckydraw.cpp11
-rw-r--r--src/mame/drivers/lcmate2.cpp29
-rw-r--r--src/mame/drivers/ldplayer.cpp5
-rw-r--r--src/mame/drivers/leapfrog_leappad.cpp145
-rw-r--r--src/mame/drivers/leapster.cpp26
-rw-r--r--src/mame/drivers/learnwin.cpp14
-rw-r--r--src/mame/drivers/legionna.cpp26
-rw-r--r--src/mame/drivers/leland.cpp82
-rw-r--r--src/mame/drivers/lemmings.cpp46
-rw-r--r--src/mame/drivers/lethal.cpp26
-rw-r--r--src/mame/drivers/lethalj.cpp36
-rw-r--r--src/mame/drivers/lg-dvd.cpp9
-rw-r--r--src/mame/drivers/lgp.cpp29
-rw-r--r--src/mame/drivers/liberate.cpp131
-rw-r--r--src/mame/drivers/lilith.cpp5
-rw-r--r--src/mame/drivers/limenko.cpp24
-rw-r--r--src/mame/drivers/lindbergh.cpp7
-rw-r--r--src/mame/drivers/lisa.cpp44
-rw-r--r--src/mame/drivers/littlerb.cpp23
-rw-r--r--src/mame/drivers/lkage.cpp2
-rw-r--r--src/mame/drivers/llc.cpp51
-rw-r--r--src/mame/drivers/lockon.cpp38
-rw-r--r--src/mame/drivers/looping.cpp13
-rw-r--r--src/mame/drivers/lsasquad.cpp92
-rw-r--r--src/mame/drivers/ltcasino.cpp25
-rw-r--r--src/mame/drivers/ltd.cpp16
-rw-r--r--src/mame/drivers/luckgrln.cpp46
-rw-r--r--src/mame/drivers/lucky74.cpp54
-rw-r--r--src/mame/drivers/luckybal.cpp26
-rw-r--r--src/mame/drivers/lvcards.cpp43
-rw-r--r--src/mame/drivers/lviv.cpp49
-rw-r--r--src/mame/drivers/lwings.cpp170
-rw-r--r--src/mame/drivers/lynx.cpp24
-rw-r--r--src/mame/drivers/m20.cpp35
-rw-r--r--src/mame/drivers/m24.cpp484
-rw-r--r--src/mame/drivers/m3.cpp25
-rw-r--r--src/mame/drivers/m5.cpp75
-rw-r--r--src/mame/drivers/m52.cpp35
-rw-r--r--src/mame/drivers/m57.cpp31
-rw-r--r--src/mame/drivers/m58.cpp24
-rw-r--r--src/mame/drivers/m62.cpp199
-rw-r--r--src/mame/drivers/m63.cpp12
-rw-r--r--src/mame/drivers/m6805evs.cpp9
-rw-r--r--src/mame/drivers/m72.cpp244
-rw-r--r--src/mame/drivers/m79152pc.cpp7
-rw-r--r--src/mame/drivers/m79amb.cpp27
-rw-r--r--src/mame/drivers/m90.cpp30
-rw-r--r--src/mame/drivers/mac.cpp13
-rw-r--r--src/mame/drivers/mac128.cpp7
-rw-r--r--src/mame/drivers/macp.cpp26
-rw-r--r--src/mame/drivers/macs.cpp3
-rw-r--r--src/mame/drivers/madalien.cpp17
-rw-r--r--src/mame/drivers/madmotor.cpp41
-rw-r--r--src/mame/drivers/magic10.cpp71
-rw-r--r--src/mame/drivers/magicard.cpp42
-rw-r--r--src/mame/drivers/magicfly.cpp36
-rw-r--r--src/mame/drivers/magictg.cpp37
-rw-r--r--src/mame/drivers/magmax.cpp32
-rw-r--r--src/mame/drivers/magnum.cpp52
-rw-r--r--src/mame/drivers/magreel.cpp31
-rw-r--r--src/mame/drivers/magtouch.cpp26
-rw-r--r--src/mame/drivers/mainsnk.cpp32
-rw-r--r--src/mame/drivers/majorpkr.cpp24
-rw-r--r--src/mame/drivers/manohman.cpp22
-rw-r--r--src/mame/drivers/mappy.cpp9
-rw-r--r--src/mame/drivers/marineb.cpp79
-rw-r--r--src/mame/drivers/marinedt.cpp22
-rw-r--r--src/mame/drivers/mario.cpp33
-rw-r--r--src/mame/drivers/markham.cpp77
-rw-r--r--src/mame/drivers/marywu.cpp11
-rw-r--r--src/mame/drivers/mastboyo.cpp31
-rw-r--r--src/mame/drivers/matmania.cpp6
-rw-r--r--src/mame/drivers/maxaflex.cpp2
-rw-r--r--src/mame/drivers/maygay1b.cpp58
-rw-r--r--src/mame/drivers/maygayep.cpp12
-rw-r--r--src/mame/drivers/maygaysw.cpp10
-rw-r--r--src/mame/drivers/maygayv1.cpp39
-rw-r--r--src/mame/drivers/mazerbla.cpp106
-rw-r--r--src/mame/drivers/mbc200.cpp45
-rw-r--r--src/mame/drivers/mbc55x.cpp324
-rw-r--r--src/mame/drivers/mbee.cpp161
-rw-r--r--src/mame/drivers/mc10.cpp86
-rw-r--r--src/mame/drivers/mc1000.cpp52
-rw-r--r--src/mame/drivers/mc1502.cpp43
-rw-r--r--src/mame/drivers/mc8020.cpp19
-rw-r--r--src/mame/drivers/mc8030.cpp19
-rw-r--r--src/mame/drivers/mcb216.cpp30
-rw-r--r--src/mame/drivers/mcr3.cpp97
-rw-r--r--src/mame/drivers/mcr68.cpp73
-rw-r--r--src/mame/drivers/meadows.cpp4
-rw-r--r--src/mame/drivers/meadwttl.cpp23
-rw-r--r--src/mame/drivers/mediagx.cpp30
-rw-r--r--src/mame/drivers/megadriv.cpp220
-rw-r--r--src/mame/drivers/megadriv_acbl.cpp177
-rw-r--r--src/mame/drivers/megadriv_rad.cpp24
-rw-r--r--src/mame/drivers/megaplay.cpp42
-rw-r--r--src/mame/drivers/megasys1.cpp195
-rw-r--r--src/mame/drivers/megatech.cpp95
-rw-r--r--src/mame/drivers/megazone.cpp52
-rw-r--r--src/mame/drivers/meijinsn.cpp40
-rw-r--r--src/mame/drivers/mekd2.cpp25
-rw-r--r--src/mame/drivers/mephisto.cpp78
-rw-r--r--src/mame/drivers/mephisto_montec.cpp72
-rw-r--r--src/mame/drivers/mephistp.cpp40
-rw-r--r--src/mame/drivers/merit.cpp113
-rw-r--r--src/mame/drivers/meritm.cpp23
-rw-r--r--src/mame/drivers/meritum.cpp22
-rw-r--r--src/mame/drivers/mermaid.cpp49
-rw-r--r--src/mame/drivers/mes.cpp25
-rw-r--r--src/mame/drivers/metalmx.cpp39
-rw-r--r--src/mame/drivers/metlclsh.cpp4
-rw-r--r--src/mame/drivers/metlfrzr.cpp30
-rw-r--r--src/mame/drivers/metro.cpp75
-rw-r--r--src/mame/drivers/mexico86.cpp2
-rw-r--r--src/mame/drivers/meyc8080.cpp30
-rw-r--r--src/mame/drivers/meyc8088.cpp28
-rw-r--r--src/mame/drivers/mgames.cpp96
-rw-r--r--src/mame/drivers/mgavegas.cpp36
-rw-r--r--src/mame/drivers/mgolf.cpp26
-rw-r--r--src/mame/drivers/mhavoc.cpp8
-rw-r--r--src/mame/drivers/micral.cpp44
-rw-r--r--src/mame/drivers/micro20.cpp31
-rw-r--r--src/mame/drivers/micro3d.cpp49
-rw-r--r--src/mame/drivers/microkit.cpp2
-rw-r--r--src/mame/drivers/micromon.cpp96
-rw-r--r--src/mame/drivers/micronic.cpp31
-rw-r--r--src/mame/drivers/micropin.cpp33
-rw-r--r--src/mame/drivers/microtan.cpp30
-rw-r--r--src/mame/drivers/microvsn.cpp27
-rw-r--r--src/mame/drivers/midas.cpp196
-rw-r--r--src/mame/drivers/midqslvr.cpp8
-rw-r--r--src/mame/drivers/midtunit.cpp1
-rw-r--r--src/mame/drivers/midvunit.cpp41
-rw-r--r--src/mame/drivers/midwunit.cpp1
-rw-r--r--src/mame/drivers/midxunit.cpp1
-rw-r--r--src/mame/drivers/midyunit.cpp127
-rw-r--r--src/mame/drivers/midzeus.cpp36
-rw-r--r--src/mame/drivers/mightyframe.cpp9
-rw-r--r--src/mame/drivers/mikie.cpp40
-rw-r--r--src/mame/drivers/mikro80.cpp63
-rw-r--r--src/mame/drivers/mikromik.cpp24
-rw-r--r--src/mame/drivers/mikrosha.cpp46
-rw-r--r--src/mame/drivers/mil4000.cpp38
-rw-r--r--src/mame/drivers/milton6805.cpp13
-rw-r--r--src/mame/drivers/mini2440.cpp34
-rw-r--r--src/mame/drivers/miniboy7.cpp39
-rw-r--r--src/mame/drivers/miniforce.cpp27
-rw-r--r--src/mame/drivers/minitel_2_rpic.cpp4
-rw-r--r--src/mame/drivers/minivadr.cpp24
-rw-r--r--src/mame/drivers/mips.cpp145
-rw-r--r--src/mame/drivers/mirage.cpp36
-rw-r--r--src/mame/drivers/mirax.cpp39
-rw-r--r--src/mame/drivers/missb2.cpp4
-rw-r--r--src/mame/drivers/missbamby.cpp134
-rw-r--r--src/mame/drivers/missile.cpp4
-rw-r--r--src/mame/drivers/mitchell.cpp269
-rw-r--r--src/mame/drivers/mjkjidai.cpp55
-rw-r--r--src/mame/drivers/mjsenpu.cpp35
-rw-r--r--src/mame/drivers/mjsister.cpp35
-rw-r--r--src/mame/drivers/mk1.cpp349
-rw-r--r--src/mame/drivers/mk14.cpp5
-rw-r--r--src/mame/drivers/mk2.cpp26
-rw-r--r--src/mame/drivers/mkit09.cpp22
-rw-r--r--src/mame/drivers/mmodular.cpp62
-rw-r--r--src/mame/drivers/mod8.cpp15
-rw-r--r--src/mame/drivers/model1.cpp86
-rw-r--r--src/mame/drivers/model2.cpp95
-rw-r--r--src/mame/drivers/model3.cpp11
-rw-r--r--src/mame/drivers/modellot.cpp29
-rw-r--r--src/mame/drivers/modena.cpp19
-rw-r--r--src/mame/drivers/mogura.cpp38
-rw-r--r--src/mame/drivers/mole.cpp30
-rw-r--r--src/mame/drivers/molecular.cpp44
-rw-r--r--src/mame/drivers/momoko.cpp30
-rw-r--r--src/mame/drivers/monacogp.cpp23
-rw-r--r--src/mame/drivers/monon_color.cpp23
-rw-r--r--src/mame/drivers/monzagp.cpp13
-rw-r--r--src/mame/drivers/moo.cpp76
-rw-r--r--src/mame/drivers/mosaic.cpp44
-rw-r--r--src/mame/drivers/mouser.cpp36
-rw-r--r--src/mame/drivers/mpc3000.cpp13
-rw-r--r--src/mame/drivers/mpf1.cpp46
-rw-r--r--src/mame/drivers/mps1230.cpp20
-rw-r--r--src/mame/drivers/mpu12wbk.cpp25
-rw-r--r--src/mame/drivers/mpu2.cpp9
-rw-r--r--src/mame/drivers/mpu3.cpp20
-rw-r--r--src/mame/drivers/mpu4dealem.cpp31
-rw-r--r--src/mame/drivers/mpu4plasma.cpp31
-rw-r--r--src/mame/drivers/mpu4sw.cpp34
-rw-r--r--src/mame/drivers/mpz80.cpp59
-rw-r--r--src/mame/drivers/mrdo.cpp37
-rw-r--r--src/mame/drivers/mrflea.cpp38
-rw-r--r--src/mame/drivers/mrgame.cpp7
-rw-r--r--src/mame/drivers/mrjong.cpp32
-rw-r--r--src/mame/drivers/ms0515.cpp29
-rw-r--r--src/mame/drivers/ms32.cpp57
-rw-r--r--src/mame/drivers/msbc1.cpp9
-rw-r--r--src/mame/drivers/mstation.cpp29
-rw-r--r--src/mame/drivers/msx.cpp4250
-rw-r--r--src/mame/drivers/mt735.cpp9
-rw-r--r--src/mame/drivers/mtx.cpp136
-rw-r--r--src/mame/drivers/mugsmash.cpp38
-rw-r--r--src/mame/drivers/multfish.cpp241
-rw-r--r--src/mame/drivers/multfish_boot.cpp24
-rw-r--r--src/mame/drivers/multi16.cpp25
-rw-r--r--src/mame/drivers/multi8.cpp36
-rw-r--r--src/mame/drivers/munchmo.cpp38
-rw-r--r--src/mame/drivers/murogem.cpp31
-rw-r--r--src/mame/drivers/murogmbl.cpp60
-rw-r--r--src/mame/drivers/mustache.cpp34
-rw-r--r--src/mame/drivers/mvme147.cpp14
-rw-r--r--src/mame/drivers/mw18w.cpp14
-rw-r--r--src/mame/drivers/mw8080bw.cpp1
-rw-r--r--src/mame/drivers/mwarr.cpp38
-rw-r--r--src/mame/drivers/mwsub.cpp14
-rw-r--r--src/mame/drivers/mx2178.cpp25
-rw-r--r--src/mame/drivers/myb3k.cpp67
-rw-r--r--src/mame/drivers/mycom.cpp44
-rw-r--r--src/mame/drivers/mystston.cpp14
-rw-r--r--src/mame/drivers/mystwarr.cpp36
-rw-r--r--src/mame/drivers/myvision.cpp14
-rw-r--r--src/mame/drivers/mz2000.cpp59
-rw-r--r--src/mame/drivers/mz2500.cpp36
-rw-r--r--src/mame/drivers/mz3500.cpp46
-rw-r--r--src/mame/drivers/mz6500.cpp31
-rw-r--r--src/mame/drivers/mz700.cpp68
-rw-r--r--src/mame/drivers/mz80.cpp55
-rw-r--r--src/mame/drivers/mzr8105.cpp14
-rw-r--r--src/mame/drivers/nakajies.cpp53
-rw-r--r--src/mame/drivers/namcofl.cpp45
-rw-r--r--src/mame/drivers/namcona1.cpp26
-rw-r--r--src/mame/drivers/namconb1.cpp54
-rw-r--r--src/mame/drivers/namcond1.cpp61
-rw-r--r--src/mame/drivers/namcos1.cpp13
-rw-r--r--src/mame/drivers/namcos2.cpp497
-rw-r--r--src/mame/drivers/namcos21.cpp43
-rw-r--r--src/mame/drivers/namcos21_c67.cpp58
-rw-r--r--src/mame/drivers/namcos21_de.cpp37
-rw-r--r--src/mame/drivers/namcos22.cpp164
-rw-r--r--src/mame/drivers/nanos.cpp27
-rw-r--r--src/mame/drivers/naomi.cpp513
-rw-r--r--src/mame/drivers/nascom1.cpp112
-rw-r--r--src/mame/drivers/nbmj8688.cpp227
-rw-r--r--src/mame/drivers/nbmj8891.cpp224
-rw-r--r--src/mame/drivers/nbmj8900.cpp48
-rw-r--r--src/mame/drivers/nbmj8991.cpp177
-rw-r--r--src/mame/drivers/nbmj9195.cpp180
-rw-r--r--src/mame/drivers/nc.cpp77
-rw-r--r--src/mame/drivers/neogeo.cpp691
-rw-r--r--src/mame/drivers/neogeocd.cpp21
-rw-r--r--src/mame/drivers/neopcb.cpp21
-rw-r--r--src/mame/drivers/neoprint.cpp238
-rw-r--r--src/mame/drivers/neptunp2.cpp33
-rw-r--r--src/mame/drivers/nes.cpp20
-rw-r--r--src/mame/drivers/nes_vt.cpp18
-rw-r--r--src/mame/drivers/newbrain.cpp23
-rw-r--r--src/mame/drivers/news.cpp29
-rw-r--r--src/mame/drivers/next.cpp138
-rw-r--r--src/mame/drivers/nexus3d.cpp25
-rw-r--r--src/mame/drivers/nforcepc.cpp230
-rw-r--r--src/mame/drivers/ngen.cpp22
-rw-r--r--src/mame/drivers/ngp.cpp400
-rw-r--r--src/mame/drivers/nibble.cpp20
-rw-r--r--src/mame/drivers/nichild.cpp6
-rw-r--r--src/mame/drivers/nightgal.cpp104
-rw-r--r--src/mame/drivers/nightmare.cpp10
-rw-r--r--src/mame/drivers/ninjaw.cpp2
-rw-r--r--src/mame/drivers/nitedrvr.cpp27
-rw-r--r--src/mame/drivers/niyanpai.cpp68
-rw-r--r--src/mame/drivers/nmg5.cpp8
-rw-r--r--src/mame/drivers/nmk16.cpp53
-rw-r--r--src/mame/drivers/nmkmedal.cpp12
-rw-r--r--src/mame/drivers/nokia_3310.cpp64
-rw-r--r--src/mame/drivers/notechan.cpp16
-rw-r--r--src/mame/drivers/notetaker.cpp41
-rw-r--r--src/mame/drivers/nova2001.cpp196
-rw-r--r--src/mame/drivers/novag6502.cpp1078
-rw-r--r--src/mame/drivers/novag_cforte.cpp259
-rw-r--r--src/mame/drivers/novag_delta1.cpp (renamed from src/mame/drivers/novagf8.cpp)136
-rw-r--r--src/mame/drivers/novag_diablo.cpp (renamed from src/mame/drivers/novag68k.cpp)187
-rw-r--r--src/mame/drivers/novag_presto.cpp (renamed from src/mame/drivers/novagmcs48.cpp)138
-rw-r--r--src/mame/drivers/novag_scon.cpp195
-rw-r--r--src/mame/drivers/novag_sexpert.cpp450
-rw-r--r--src/mame/drivers/nsm.cpp24
-rw-r--r--src/mame/drivers/nsmpoker.cpp27
-rw-r--r--src/mame/drivers/nss.cpp50
-rw-r--r--src/mame/drivers/nycaptor.cpp3
-rw-r--r--src/mame/drivers/nyny.cpp41
-rw-r--r--src/mame/drivers/ob68k1a.cpp14
-rw-r--r--src/mame/drivers/octopus.cpp51
-rw-r--r--src/mame/drivers/odyssey.cpp22
-rw-r--r--src/mame/drivers/odyssey2.cpp115
-rw-r--r--src/mame/drivers/offtwall.cpp22
-rw-r--r--src/mame/drivers/ohmygod.cpp34
-rw-r--r--src/mame/drivers/ojankohs.cpp148
-rw-r--r--src/mame/drivers/okean240.cpp49
-rw-r--r--src/mame/drivers/olibochu.cpp38
-rw-r--r--src/mame/drivers/olytext.cpp31
-rw-r--r--src/mame/drivers/omegrace.cpp34
-rw-r--r--src/mame/drivers/ondra.cpp37
-rw-r--r--src/mame/drivers/oneshot.cpp224
-rw-r--r--src/mame/drivers/opwolf.cpp124
-rw-r--r--src/mame/drivers/orao.cpp33
-rw-r--r--src/mame/drivers/orbit.cpp30
-rw-r--r--src/mame/drivers/oric.cpp13
-rw-r--r--src/mame/drivers/orion.cpp19
-rw-r--r--src/mame/drivers/osbexec.cpp16
-rw-r--r--src/mame/drivers/othello.cpp9
-rw-r--r--src/mame/drivers/otomedius.cpp22
-rw-r--r--src/mame/drivers/p112.cpp27
-rw-r--r--src/mame/drivers/p2000t.cpp63
-rw-r--r--src/mame/drivers/p8k.cpp32
-rw-r--r--src/mame/drivers/pachifev.cpp30
-rw-r--r--src/mame/drivers/pacman.cpp279
-rw-r--r--src/mame/drivers/palestra.cpp95
-rw-r--r--src/mame/drivers/palm.cpp35
-rw-r--r--src/mame/drivers/palmz22.cpp24
-rw-r--r--src/mame/drivers/pandoras.cpp31
-rw-r--r--src/mame/drivers/pangofun.cpp18
-rw-r--r--src/mame/drivers/panicr.cpp30
-rw-r--r--src/mame/drivers/paradise.cpp86
-rw-r--r--src/mame/drivers/paranoia.cpp46
-rw-r--r--src/mame/drivers/pasha2.cpp36
-rw-r--r--src/mame/drivers/paso1600.cpp42
-rw-r--r--src/mame/drivers/pasogo.cpp76
-rw-r--r--src/mame/drivers/pasopia.cpp21
-rw-r--r--src/mame/drivers/pasopia7.cpp69
-rw-r--r--src/mame/drivers/pass.cpp40
-rw-r--r--src/mame/drivers/pastelg.cpp70
-rw-r--r--src/mame/drivers/patapata.cpp35
-rw-r--r--src/mame/drivers/patinho_feio.cpp4
-rw-r--r--src/mame/drivers/pbaction.cpp22
-rw-r--r--src/mame/drivers/pc.cpp238
-rw-r--r--src/mame/drivers/pc100.cpp35
-rw-r--r--src/mame/drivers/pc1512.cpp176
-rw-r--r--src/mame/drivers/pc2000.cpp2
-rw-r--r--src/mame/drivers/pc4.cpp23
-rw-r--r--src/mame/drivers/pc6001.cpp113
-rw-r--r--src/mame/drivers/pc8001.cpp102
-rw-r--r--src/mame/drivers/pc8401a.cpp40
-rw-r--r--src/mame/drivers/pc8801.cpp79
-rw-r--r--src/mame/drivers/pc88va.cpp52
-rw-r--r--src/mame/drivers/pc9801.cpp22
-rw-r--r--src/mame/drivers/pcat_dyn.cpp3
-rw-r--r--src/mame/drivers/pcat_nit.cpp30
-rw-r--r--src/mame/drivers/pcd.cpp32
-rw-r--r--src/mame/drivers/pce.cpp127
-rw-r--r--src/mame/drivers/pce220.cpp81
-rw-r--r--src/mame/drivers/pcfx.cpp47
-rw-r--r--src/mame/drivers/pcktgal.cpp70
-rw-r--r--src/mame/drivers/pcm.cpp25
-rw-r--r--src/mame/drivers/pcw.cpp2
-rw-r--r--src/mame/drivers/pcw16.cpp48
-rw-r--r--src/mame/drivers/pcxt.cpp37
-rw-r--r--src/mame/drivers/pdp11.cpp12
-rw-r--r--src/mame/drivers/pegasus.cpp48
-rw-r--r--src/mame/drivers/pencil2.cpp40
-rw-r--r--src/mame/drivers/pengadvb.cpp49
-rw-r--r--src/mame/drivers/pengo.cpp128
-rw-r--r--src/mame/drivers/pentagon.cpp27
-rw-r--r--src/mame/drivers/peoplepc.cpp21
-rw-r--r--src/mame/drivers/peplus.cpp15
-rw-r--r--src/mame/drivers/perq.cpp5
-rw-r--r--src/mame/drivers/pes.cpp2
-rw-r--r--src/mame/drivers/pet.cpp52
-rw-r--r--src/mame/drivers/peyper.cpp13
-rw-r--r--src/mame/drivers/pg685.cpp71
-rw-r--r--src/mame/drivers/pgm.cpp2
-rw-r--r--src/mame/drivers/pgm3.cpp32
-rw-r--r--src/mame/drivers/phc25.cpp70
-rw-r--r--src/mame/drivers/photon.cpp30
-rw-r--r--src/mame/drivers/photon2.cpp29
-rw-r--r--src/mame/drivers/photoply.cpp19
-rw-r--r--src/mame/drivers/phunsy.cpp4
-rw-r--r--src/mame/drivers/picno.cpp15
-rw-r--r--src/mame/drivers/piggypas.cpp56
-rw-r--r--src/mame/drivers/pinball2k.cpp24
-rw-r--r--src/mame/drivers/pingpong.cpp44
-rw-r--r--src/mame/drivers/pinkiri8.cpp37
-rw-r--r--src/mame/drivers/pipbug.cpp4
-rw-r--r--src/mame/drivers/pirates.cpp54
-rw-r--r--src/mame/drivers/piratesh.cpp2
-rw-r--r--src/mame/drivers/pitagjr.cpp23
-rw-r--r--src/mame/drivers/pk8000.cpp37
-rw-r--r--src/mame/drivers/pk8020.cpp46
-rw-r--r--src/mame/drivers/pktgaldx.cpp84
-rw-r--r--src/mame/drivers/plan80.cpp29
-rw-r--r--src/mame/drivers/play_1.cpp24
-rw-r--r--src/mame/drivers/play_2.cpp6
-rw-r--r--src/mame/drivers/play_3.cpp32
-rw-r--r--src/mame/drivers/playmark.cpp238
-rw-r--r--src/mame/drivers/plus4.cpp24
-rw-r--r--src/mame/drivers/pmi80.cpp11
-rw-r--r--src/mame/drivers/pntnpuzl.cpp18
-rw-r--r--src/mame/drivers/pockchal.cpp26
-rw-r--r--src/mame/drivers/pockstat.cpp29
-rw-r--r--src/mame/drivers/pofo.cpp68
-rw-r--r--src/mame/drivers/poisk1.cpp105
-rw-r--r--src/mame/drivers/pokechmp.cpp22
-rw-r--r--src/mame/drivers/pokemini.cpp2
-rw-r--r--src/mame/drivers/poker72.cpp25
-rw-r--r--src/mame/drivers/polepos.cpp1
-rw-r--r--src/mame/drivers/poly.cpp61
-rw-r--r--src/mame/drivers/poly88.cpp48
-rw-r--r--src/mame/drivers/poly880.cpp15
-rw-r--r--src/mame/drivers/polyplay.cpp17
-rw-r--r--src/mame/drivers/pong.cpp257
-rw-r--r--src/mame/drivers/poolshrk.cpp31
-rw-r--r--src/mame/drivers/pooyan.cpp24
-rw-r--r--src/mame/drivers/popobear.cpp40
-rw-r--r--src/mame/drivers/popper.cpp25
-rw-r--r--src/mame/drivers/portrait.cpp29
-rw-r--r--src/mame/drivers/potgoldu.cpp12
-rw-r--r--src/mame/drivers/powerbal.cpp80
-rw-r--r--src/mame/drivers/powerstack.cpp9
-rw-r--r--src/mame/drivers/pp01.cpp27
-rw-r--r--src/mame/drivers/ppmast93.cpp47
-rw-r--r--src/mame/drivers/prestige.cpp122
-rw-r--r--src/mame/drivers/primo.cpp92
-rw-r--r--src/mame/drivers/pro80.cpp15
-rw-r--r--src/mame/drivers/proconn.cpp8
-rw-r--r--src/mame/drivers/prof180x.cpp43
-rw-r--r--src/mame/drivers/prof80.cpp35
-rw-r--r--src/mame/drivers/progolf.cpp44
-rw-r--r--src/mame/drivers/prophet600.cpp21
-rw-r--r--src/mame/drivers/proteus.cpp35
-rw-r--r--src/mame/drivers/proteus3.cpp35
-rw-r--r--src/mame/drivers/pse.cpp23
-rw-r--r--src/mame/drivers/psikyo.cpp193
-rw-r--r--src/mame/drivers/psion.cpp108
-rw-r--r--src/mame/drivers/psx.cpp16
-rw-r--r--src/mame/drivers/pt68k4.cpp96
-rw-r--r--src/mame/drivers/ptcsol.cpp23
-rw-r--r--src/mame/drivers/pturn.cpp33
-rw-r--r--src/mame/drivers/puckpkmn.cpp34
-rw-r--r--src/mame/drivers/punchout.cpp64
-rw-r--r--src/mame/drivers/pv1000.cpp18
-rw-r--r--src/mame/drivers/pv2000.cpp25
-rw-r--r--src/mame/drivers/pv9234.cpp24
-rw-r--r--src/mame/drivers/pwrview.cpp23
-rw-r--r--src/mame/drivers/px4.cpp68
-rw-r--r--src/mame/drivers/px8.cpp55
-rw-r--r--src/mame/drivers/pyl601.cpp47
-rw-r--r--src/mame/drivers/pzletime.cpp26
-rw-r--r--src/mame/drivers/ql.cpp75
-rw-r--r--src/mame/drivers/quakeat.cpp32
-rw-r--r--src/mame/drivers/quasar.cpp1
-rw-r--r--src/mame/drivers/queen.cpp8
-rw-r--r--src/mame/drivers/quickpick5.cpp14
-rw-r--r--src/mame/drivers/quizdna.cpp55
-rw-r--r--src/mame/drivers/quizo.cpp28
-rw-r--r--src/mame/drivers/quizpani.cpp31
-rw-r--r--src/mame/drivers/quizshow.cpp1
-rw-r--r--src/mame/drivers/qvt201.cpp19
-rw-r--r--src/mame/drivers/qvt70.cpp9
-rw-r--r--src/mame/drivers/qx10.cpp22
-rw-r--r--src/mame/drivers/r2dtank.cpp39
-rw-r--r--src/mame/drivers/r9751.cpp51
-rw-r--r--src/mame/drivers/rad_eu3a05.cpp30
-rw-r--r--src/mame/drivers/rad_eu3a14.cpp835
-rw-r--r--src/mame/drivers/radio86.cpp82
-rw-r--r--src/mame/drivers/raiden.cpp37
-rw-r--r--src/mame/drivers/rainbow.cpp139
-rw-r--r--src/mame/drivers/rampart.cpp30
-rw-r--r--src/mame/drivers/ramtek.cpp23
-rw-r--r--src/mame/drivers/rastan.cpp44
-rw-r--r--src/mame/drivers/rastersp.cpp24
-rw-r--r--src/mame/drivers/ravens.cpp10
-rw-r--r--src/mame/drivers/rbisland.cpp81
-rw-r--r--src/mame/drivers/rbmk.cpp46
-rw-r--r--src/mame/drivers/rc702.cpp22
-rw-r--r--src/mame/drivers/rc759.cpp2
-rw-r--r--src/mame/drivers/rcorsair.cpp42
-rw-r--r--src/mame/drivers/rd100.cpp27
-rw-r--r--src/mame/drivers/rd110.cpp25
-rw-r--r--src/mame/drivers/re900.cpp3
-rw-r--r--src/mame/drivers/realbrk.cpp86
-rw-r--r--src/mame/drivers/redalert.cpp48
-rw-r--r--src/mame/drivers/redclash.cpp132
-rw-r--r--src/mame/drivers/relief.cpp31
-rw-r--r--src/mame/drivers/replicator.cpp1
-rw-r--r--src/mame/drivers/retofinv.cpp79
-rw-r--r--src/mame/drivers/rex6000.cpp62
-rw-r--r--src/mame/drivers/rgum.cpp27
-rw-r--r--src/mame/drivers/risc2500.cpp1
-rw-r--r--src/mame/drivers/riscpc.cpp131
-rw-r--r--src/mame/drivers/rltennis.cpp36
-rw-r--r--src/mame/drivers/rm380z.cpp62
-rw-r--r--src/mame/drivers/rmhaihai.cpp70
-rw-r--r--src/mame/drivers/rmnimbus.cpp2
-rw-r--r--src/mame/drivers/rmt32.cpp29
-rw-r--r--src/mame/drivers/rockrage.cpp38
-rw-r--r--src/mame/drivers/rocnrope.cpp26
-rw-r--r--src/mame/drivers/rohga.cpp184
-rw-r--r--src/mame/drivers/rollext.cpp39
-rw-r--r--src/mame/drivers/rollrace.cpp40
-rw-r--r--src/mame/drivers/ron.cpp26
-rw-r--r--src/mame/drivers/roul.cpp33
-rw-r--r--src/mame/drivers/route16.cpp1
-rw-r--r--src/mame/drivers/rowamet.cpp26
-rw-r--r--src/mame/drivers/royalmah.cpp282
-rw-r--r--src/mame/drivers/rpunch.cpp69
-rw-r--r--src/mame/drivers/rt1715.cpp371
-rw-r--r--src/mame/drivers/rulechan.cpp11
-rw-r--r--src/mame/drivers/rungun.cpp10
-rw-r--r--src/mame/drivers/rx78.cpp40
-rw-r--r--src/mame/drivers/rzone.cpp67
-rw-r--r--src/mame/drivers/s11.cpp42
-rw-r--r--src/mame/drivers/s11a.cpp38
-rw-r--r--src/mame/drivers/s11b.cpp36
-rw-r--r--src/mame/drivers/s3.cpp27
-rw-r--r--src/mame/drivers/s4.cpp27
-rw-r--r--src/mame/drivers/s6.cpp23
-rw-r--r--src/mame/drivers/s6a.cpp23
-rw-r--r--src/mame/drivers/s7.cpp23
-rw-r--r--src/mame/drivers/s8.cpp20
-rw-r--r--src/mame/drivers/s8a.cpp20
-rw-r--r--src/mame/drivers/s9.cpp23
-rw-r--r--src/mame/drivers/sage2.cpp35
-rw-r--r--src/mame/drivers/sam.cpp9
-rw-r--r--src/mame/drivers/sandscrp.cpp38
-rw-r--r--src/mame/drivers/sangho.cpp32
-rw-r--r--src/mame/drivers/sanremmg.cpp24
-rw-r--r--src/mame/drivers/sanremo.cpp52
-rw-r--r--src/mame/drivers/sansa_fuze.cpp11
-rw-r--r--src/mame/drivers/sapi1.cpp79
-rw-r--r--src/mame/drivers/sartorius.cpp5
-rw-r--r--src/mame/drivers/saturn.cpp52
-rw-r--r--src/mame/drivers/sauro.cpp75
-rw-r--r--src/mame/drivers/savquest.cpp28
-rw-r--r--src/mame/drivers/sbasketb.cpp54
-rw-r--r--src/mame/drivers/sbc6510.cpp2
-rw-r--r--src/mame/drivers/sbowling.cpp25
-rw-r--r--src/mame/drivers/sbrain.cpp55
-rw-r--r--src/mame/drivers/sbrkout.cpp10
-rw-r--r--src/mame/drivers/sbugger.cpp38
-rw-r--r--src/mame/drivers/sc1.cpp190
-rw-r--r--src/mame/drivers/sc2.cpp329
-rw-r--r--src/mame/drivers/scm_500.cpp7
-rw-r--r--src/mame/drivers/scobra.cpp153
-rw-r--r--src/mame/drivers/scopus.cpp54
-rw-r--r--src/mame/drivers/scorpion.cpp33
-rw-r--r--src/mame/drivers/scotrsht.cpp35
-rw-r--r--src/mame/drivers/scramble.cpp205
-rw-r--r--src/mame/drivers/scregg.cpp40
-rw-r--r--src/mame/drivers/scv.cpp12
-rw-r--r--src/mame/drivers/scyclone.cpp2
-rw-r--r--src/mame/drivers/sderby.cpp174
-rw-r--r--src/mame/drivers/sderby2.cpp37
-rw-r--r--src/mame/drivers/sdk51.cpp18
-rw-r--r--src/mame/drivers/sdk85.cpp11
-rw-r--r--src/mame/drivers/seabattl.cpp4
-rw-r--r--src/mame/drivers/sealy.cpp25
-rw-r--r--src/mame/drivers/seattlecmp.cpp13
-rw-r--r--src/mame/drivers/sega_beena.cpp137
-rw-r--r--src/mame/drivers/sega_sawatte.cpp7
-rw-r--r--src/mame/drivers/segae.cpp73
-rw-r--r--src/mame/drivers/segag80r.cpp116
-rw-r--r--src/mame/drivers/segag80v.cpp2
-rw-r--r--src/mame/drivers/segald.cpp26
-rw-r--r--src/mame/drivers/segapm.cpp24
-rw-r--r--src/mame/drivers/segas16a.cpp54
-rw-r--r--src/mame/drivers/segas16b.cpp131
-rw-r--r--src/mame/drivers/segas18.cpp3
-rw-r--r--src/mame/drivers/segas24.cpp1
-rw-r--r--src/mame/drivers/segas32.cpp25
-rw-r--r--src/mame/drivers/segasp.cpp39
-rw-r--r--src/mame/drivers/segattl.cpp23
-rw-r--r--src/mame/drivers/segaxbd.cpp12
-rw-r--r--src/mame/drivers/segaybd.cpp1
-rw-r--r--src/mame/drivers/seibucats.cpp38
-rw-r--r--src/mame/drivers/seibuspi.cpp38
-rw-r--r--src/mame/drivers/seicross.cpp57
-rw-r--r--src/mame/drivers/seicupbl.cpp97
-rw-r--r--src/mame/drivers/selz80.cpp19
-rw-r--r--src/mame/drivers/sengokmj.cpp4
-rw-r--r--src/mame/drivers/senjyo.cpp63
-rw-r--r--src/mame/drivers/seta.cpp93
-rw-r--r--src/mame/drivers/seta2.cpp407
-rw-r--r--src/mame/drivers/sf.cpp92
-rw-r--r--src/mame/drivers/sfbonus.cpp36
-rw-r--r--src/mame/drivers/sfcbox.cpp52
-rw-r--r--src/mame/drivers/sg1000.cpp117
-rw-r--r--src/mame/drivers/sg1000a.cpp34
-rw-r--r--src/mame/drivers/shadfrce.cpp32
-rw-r--r--src/mame/drivers/shanghai.cpp99
-rw-r--r--src/mame/drivers/shangkid.cpp66
-rw-r--r--src/mame/drivers/shaolins.cpp47
-rw-r--r--src/mame/drivers/shine.cpp10
-rw-r--r--src/mame/drivers/shisen.cpp53
-rw-r--r--src/mame/drivers/shootaway2.cpp28
-rw-r--r--src/mame/drivers/shootout.cpp62
-rw-r--r--src/mame/drivers/shougi.cpp46
-rw-r--r--src/mame/drivers/shtzone.cpp29
-rw-r--r--src/mame/drivers/shuuz.cpp25
-rw-r--r--src/mame/drivers/si5500.cpp51
-rw-r--r--src/mame/drivers/sigmab52.cpp36
-rw-r--r--src/mame/drivers/sigmab98.cpp220
-rw-r--r--src/mame/drivers/silkroad.cpp40
-rw-r--r--src/mame/drivers/silvmil.cpp286
-rw-r--r--src/mame/drivers/simpl156.cpp76
-rw-r--r--src/mame/drivers/simple_st0016.cpp56
-rw-r--r--src/mame/drivers/sk1.cpp5
-rw-r--r--src/mame/drivers/skeetsht.cpp13
-rw-r--r--src/mame/drivers/skimaxx.cpp46
-rw-r--r--src/mame/drivers/skullxbo.cpp30
-rw-r--r--src/mame/drivers/skyarmy.cpp49
-rw-r--r--src/mame/drivers/skydiver.cpp22
-rw-r--r--src/mame/drivers/skyfox.cpp36
-rw-r--r--src/mame/drivers/skylncr.cpp70
-rw-r--r--src/mame/drivers/skyraid.cpp28
-rw-r--r--src/mame/drivers/slapfght.cpp124
-rw-r--r--src/mame/drivers/slc1.cpp24
-rw-r--r--src/mame/drivers/slc1a.cpp212
-rw-r--r--src/mame/drivers/sleic.cpp9
-rw-r--r--src/mame/drivers/slicer.cpp52
-rw-r--r--src/mame/drivers/sliver.cpp36
-rw-r--r--src/mame/drivers/slotcarn.cpp22
-rw-r--r--src/mame/drivers/sm1800.cpp37
-rw-r--r--src/mame/drivers/sm7238.cpp25
-rw-r--r--src/mame/drivers/smc777.cpp270
-rw-r--r--src/mame/drivers/sms.cpp399
-rw-r--r--src/mame/drivers/sms_bootleg.cpp42
-rw-r--r--src/mame/drivers/smsmcorp.cpp37
-rw-r--r--src/mame/drivers/snes.cpp356
-rw-r--r--src/mame/drivers/snesb.cpp147
-rw-r--r--src/mame/drivers/snk6502.cpp98
-rw-r--r--src/mame/drivers/snookr10.cpp59
-rw-r--r--src/mame/drivers/snowbros.cpp26
-rw-r--r--src/mame/drivers/socrates.cpp95
-rw-r--r--src/mame/drivers/softbox.cpp35
-rw-r--r--src/mame/drivers/solbourne.cpp5
-rw-r--r--src/mame/drivers/solomon.cpp36
-rw-r--r--src/mame/drivers/sonson.cpp32
-rw-r--r--src/mame/drivers/sorcerer.cpp88
-rw-r--r--src/mame/drivers/sothello.cpp32
-rw-r--r--src/mame/drivers/spacefb.cpp15
-rw-r--r--src/mame/drivers/spaceg.cpp4
-rw-r--r--src/mame/drivers/spartanxtec.cpp39
-rw-r--r--src/mame/drivers/spbactn.cpp2
-rw-r--r--src/mame/drivers/spc1000.cpp52
-rw-r--r--src/mame/drivers/spc1500.cpp64
-rw-r--r--src/mame/drivers/spec128.cpp63
-rw-r--r--src/mame/drivers/special.cpp118
-rw-r--r--src/mame/drivers/specpls3.cpp124
-rw-r--r--src/mame/drivers/spectra.cpp2
-rw-r--r--src/mame/drivers/spectrum.cpp56
-rw-r--r--src/mame/drivers/speedatk.cpp28
-rw-r--r--src/mame/drivers/speedbal.cpp39
-rw-r--r--src/mame/drivers/speedspn.cpp38
-rw-r--r--src/mame/drivers/speglsht.cpp32
-rw-r--r--src/mame/drivers/spg110.cpp399
-rw-r--r--src/mame/drivers/spiders.cpp26
-rw-r--r--src/mame/drivers/spinb.cpp8
-rw-r--r--src/mame/drivers/spirit76.cpp14
-rw-r--r--src/mame/drivers/splash.cpp10
-rw-r--r--src/mame/drivers/splus.cpp4
-rw-r--r--src/mame/drivers/spool99.cpp48
-rw-r--r--src/mame/drivers/sprcros2.cpp41
-rw-r--r--src/mame/drivers/sprint2.cpp58
-rw-r--r--src/mame/drivers/sprint4.cpp29
-rw-r--r--src/mame/drivers/sprint8.cpp31
-rw-r--r--src/mame/drivers/spyhuntertec.cpp52
-rw-r--r--src/mame/drivers/squale.cpp36
-rw-r--r--src/mame/drivers/srmp2.cpp121
-rw-r--r--src/mame/drivers/srmp5.cpp26
-rw-r--r--src/mame/drivers/srmp6.cpp304
-rw-r--r--src/mame/drivers/srumbler.cpp60
-rw-r--r--src/mame/drivers/ssem.cpp18
-rw-r--r--src/mame/drivers/ssfindo.cpp51
-rw-r--r--src/mame/drivers/sshot.cpp28
-rw-r--r--src/mame/drivers/ssingles.cpp77
-rw-r--r--src/mame/drivers/sslam.cpp32
-rw-r--r--src/mame/drivers/ssozumo.cpp41
-rw-r--r--src/mame/drivers/sspeedr.cpp30
-rw-r--r--src/mame/drivers/ssrj.cpp28
-rw-r--r--src/mame/drivers/sstrangr.cpp35
-rw-r--r--src/mame/drivers/ssv.cpp4
-rw-r--r--src/mame/drivers/st17xx.cpp25
-rw-r--r--src/mame/drivers/st_mp100.cpp13
-rw-r--r--src/mame/drivers/st_mp200.cpp21
-rw-r--r--src/mame/drivers/stactics.cpp12
-rw-r--r--src/mame/drivers/stargame.cpp16
-rw-r--r--src/mame/drivers/starshp1.cpp27
-rw-r--r--src/mame/drivers/starwars.cpp38
-rw-r--r--src/mame/drivers/statriv2.cpp174
-rw-r--r--src/mame/drivers/stellafr.cpp17
-rw-r--r--src/mame/drivers/stlforce.cpp49
-rw-r--r--src/mame/drivers/storio.cpp171
-rw-r--r--src/mame/drivers/stratos.cpp25
-rw-r--r--src/mame/drivers/strkzn.cpp19
-rw-r--r--src/mame/drivers/studio2.cpp30
-rw-r--r--src/mame/drivers/stuntair.cpp34
-rw-r--r--src/mame/drivers/su2000.cpp29
-rw-r--r--src/mame/drivers/sub.cpp36
-rw-r--r--src/mame/drivers/subs.cpp42
-rw-r--r--src/mame/drivers/subsino.cpp180
-rw-r--r--src/mame/drivers/subsino2.cpp344
-rw-r--r--src/mame/drivers/summit.cpp25
-rw-r--r--src/mame/drivers/sumt8035.cpp12
-rw-r--r--src/mame/drivers/sun2.cpp60
-rw-r--r--src/mame/drivers/sun3.cpp149
-rw-r--r--src/mame/drivers/sun3x.cpp36
-rw-r--r--src/mame/drivers/sun4.cpp84
-rw-r--r--src/mame/drivers/suna16.cpp4
-rw-r--r--src/mame/drivers/suna8.cpp1
-rw-r--r--src/mame/drivers/supbtime.cpp46
-rw-r--r--src/mame/drivers/supdrapo.cpp26
-rw-r--r--src/mame/drivers/supduck.cpp41
-rw-r--r--src/mame/drivers/super6.cpp2
-rw-r--r--src/mame/drivers/super80.cpp8
-rw-r--r--src/mame/drivers/superchs.cpp44
-rw-r--r--src/mame/drivers/supercrd.cpp35
-rw-r--r--src/mame/drivers/superdq.cpp28
-rw-r--r--src/mame/drivers/superqix.cpp2
-rw-r--r--src/mame/drivers/superslave.cpp2
-rw-r--r--src/mame/drivers/supertnk.cpp4
-rw-r--r--src/mame/drivers/superwng.cpp33
-rw-r--r--src/mame/drivers/supracan.cpp30
-rw-r--r--src/mame/drivers/suprgolf.cpp40
-rw-r--r--src/mame/drivers/suprloco.cpp36
-rw-r--r--src/mame/drivers/suprnova.cpp153
-rw-r--r--src/mame/drivers/suprridr.cpp34
-rw-r--r--src/mame/drivers/supstarf.cpp8
-rw-r--r--src/mame/drivers/sv8000.cpp19
-rw-r--r--src/mame/drivers/svi318.cpp95
-rw-r--r--src/mame/drivers/svision.cpp47
-rw-r--r--src/mame/drivers/svmu.cpp12
-rw-r--r--src/mame/drivers/swtpc.cpp79
-rw-r--r--src/mame/drivers/symbolics.cpp10
-rw-r--r--src/mame/drivers/sys2900.cpp25
-rw-r--r--src/mame/drivers/sys9002.cpp25
-rw-r--r--src/mame/drivers/system1.cpp6
-rw-r--r--src/mame/drivers/system16.cpp490
-rw-r--r--src/mame/drivers/tagteam.cpp39
-rw-r--r--src/mame/drivers/tail2nos.cpp32
-rw-r--r--src/mame/drivers/taito.cpp25
-rw-r--r--src/mame/drivers/taito_b.cpp2
-rw-r--r--src/mame/drivers/taito_f2.cpp4
-rw-r--r--src/mame/drivers/taito_f3.cpp5
-rw-r--r--src/mame/drivers/taito_l.cpp122
-rw-r--r--src/mame/drivers/taito_o.cpp26
-rw-r--r--src/mame/drivers/taito_z.cpp93
-rw-r--r--src/mame/drivers/taitoair.cpp4
-rw-r--r--src/mame/drivers/taitogn.cpp10
-rw-r--r--src/mame/drivers/taitosj.cpp70
-rw-r--r--src/mame/drivers/taitottl.cpp23
-rw-r--r--src/mame/drivers/taitotx.cpp27
-rw-r--r--src/mame/drivers/taitowlf.cpp20
-rw-r--r--src/mame/drivers/tamag1.cpp6
-rw-r--r--src/mame/drivers/tandy1t.cpp143
-rw-r--r--src/mame/drivers/tandy2k.cpp288
-rw-r--r--src/mame/drivers/tank8.cpp36
-rw-r--r--src/mame/drivers/tankbust.cpp38
-rw-r--r--src/mame/drivers/tapatune.cpp39
-rw-r--r--src/mame/drivers/targeth.cpp36
-rw-r--r--src/mame/drivers/tasman.cpp27
-rw-r--r--src/mame/drivers/tatsumi.cpp123
-rw-r--r--src/mame/drivers/tavernie.cpp39
-rw-r--r--src/mame/drivers/taxidriv.cpp42
-rw-r--r--src/mame/drivers/tb303.cpp20
-rw-r--r--src/mame/drivers/tbowl.cpp4
-rw-r--r--src/mame/drivers/tceptor.cpp1
-rw-r--r--src/mame/drivers/tdv2324.cpp39
-rw-r--r--src/mame/drivers/tec1.cpp29
-rw-r--r--src/mame/drivers/techno.cpp14
-rw-r--r--src/mame/drivers/tecmo.cpp38
-rw-r--r--src/mame/drivers/tecmo16.cpp51
-rw-r--r--src/mame/drivers/tecnbras.cpp2
-rw-r--r--src/mame/drivers/tehkanwc.cpp51
-rw-r--r--src/mame/drivers/tek405x.cpp162
-rw-r--r--src/mame/drivers/tek410x.cpp48
-rw-r--r--src/mame/drivers/tek440x.cpp35
-rw-r--r--src/mame/drivers/tekxp33x.cpp25
-rw-r--r--src/mame/drivers/tempest.cpp2
-rw-r--r--src/mame/drivers/terco.cpp15
-rw-r--r--src/mame/drivers/terminal.cpp9
-rw-r--r--src/mame/drivers/terracre.cpp92
-rw-r--r--src/mame/drivers/testconsole.cpp29
-rw-r--r--src/mame/drivers/testpat.cpp150
-rw-r--r--src/mame/drivers/tetrisp2.cpp321
-rw-r--r--src/mame/drivers/tg100.cpp20
-rw-r--r--src/mame/drivers/tgtpanic.cpp26
-rw-r--r--src/mame/drivers/thedealr.cpp21
-rw-r--r--src/mame/drivers/thepit.cpp60
-rw-r--r--src/mame/drivers/thomson.cpp302
-rw-r--r--src/mame/drivers/thoop2.cpp40
-rw-r--r--src/mame/drivers/thunderj.cpp28
-rw-r--r--src/mame/drivers/ti74.cpp50
-rw-r--r--src/mame/drivers/ti85.cpp334
-rw-r--r--src/mame/drivers/ti89.cpp67
-rw-r--r--src/mame/drivers/ti990_10.cpp13
-rw-r--r--src/mame/drivers/ti990_4.cpp66
-rw-r--r--src/mame/drivers/ti99_2.cpp10
-rw-r--r--src/mame/drivers/ti99_4p.cpp91
-rw-r--r--src/mame/drivers/ti99_4x.cpp58
-rw-r--r--src/mame/drivers/ti99_8.cpp47
-rw-r--r--src/mame/drivers/tiamc1.cpp42
-rw-r--r--src/mame/drivers/ticalc1x.cpp560
-rw-r--r--src/mame/drivers/tickee.cpp68
-rw-r--r--src/mame/drivers/tiki100.cpp65
-rw-r--r--src/mame/drivers/tim011.cpp37
-rw-r--r--src/mame/drivers/tim100.cpp39
-rw-r--r--src/mame/drivers/timelimt.cpp38
-rw-r--r--src/mame/drivers/timetrv.cpp28
-rw-r--r--src/mame/drivers/timex.cpp67
-rw-r--r--src/mame/drivers/tispeak.cpp257
-rw-r--r--src/mame/drivers/tispellb.cpp63
-rw-r--r--src/mame/drivers/titan_soc.cpp121
-rw-r--r--src/mame/drivers/tk2000.cpp35
-rw-r--r--src/mame/drivers/tk80bs.cpp25
-rw-r--r--src/mame/drivers/tm990189.cpp30
-rw-r--r--src/mame/drivers/tmaster.cpp50
-rw-r--r--src/mame/drivers/tmc1800.cpp24
-rw-r--r--src/mame/drivers/tmc600.cpp11
-rw-r--r--src/mame/drivers/tmnt.cpp15
-rw-r--r--src/mame/drivers/tmspoker.cpp23
-rw-r--r--src/mame/drivers/tnzs.cpp3
-rw-r--r--src/mame/drivers/toaplan1.cpp607
-rw-r--r--src/mame/drivers/toaplan2.cpp167
-rw-r--r--src/mame/drivers/tomcat.cpp53
-rw-r--r--src/mame/drivers/toobin.cpp26
-rw-r--r--src/mame/drivers/topspeed.cpp54
-rw-r--r--src/mame/drivers/tosh1000.cpp61
-rw-r--r--src/mame/drivers/tourvis.cpp37
-rw-r--r--src/mame/drivers/tp84.cpp59
-rw-r--r--src/mame/drivers/tr606.cpp21
-rw-r--r--src/mame/drivers/trackfld.cpp165
-rw-r--r--src/mame/drivers/travrusa.cpp47
-rw-r--r--src/mame/drivers/triforce.cpp374
-rw-r--r--src/mame/drivers/trkfldch.cpp196
-rw-r--r--src/mame/drivers/trs80.cpp164
-rw-r--r--src/mame/drivers/trs80m2.cpp98
-rw-r--r--src/mame/drivers/trs80m3.cpp77
-rw-r--r--src/mame/drivers/truco.cpp34
-rw-r--r--src/mame/drivers/trucocl.cpp34
-rw-r--r--src/mame/drivers/trvmadns.cpp35
-rw-r--r--src/mame/drivers/tryout.cpp36
-rw-r--r--src/mame/drivers/ts3000.cpp11
-rw-r--r--src/mame/drivers/ts803.cpp21
-rw-r--r--src/mame/drivers/tsamurai.cpp133
-rw-r--r--src/mame/drivers/tsispch.cpp12
-rw-r--r--src/mame/drivers/ttchamp.cpp34
-rw-r--r--src/mame/drivers/tti.cpp96
-rw-r--r--src/mame/drivers/tubep.cpp106
-rw-r--r--src/mame/drivers/tugboat.cpp23
-rw-r--r--src/mame/drivers/tumbleb.cpp195
-rw-r--r--src/mame/drivers/turbo.cpp86
-rw-r--r--src/mame/drivers/turrett.cpp24
-rw-r--r--src/mame/drivers/tutankhm.cpp24
-rw-r--r--src/mame/drivers/tutor.cpp44
-rw-r--r--src/mame/drivers/tv910.cpp48
-rw-r--r--src/mame/drivers/tv955.cpp10
-rw-r--r--src/mame/drivers/tvc.cpp72
-rw-r--r--src/mame/drivers/tvcapcom.cpp27
-rw-r--r--src/mame/drivers/tvgame.cpp28
-rw-r--r--src/mame/drivers/twincobr.cpp20
-rw-r--r--src/mame/drivers/twins.cpp75
-rw-r--r--src/mame/drivers/tx0.cpp30
-rw-r--r--src/mame/drivers/tx1.cpp125
-rw-r--r--src/mame/drivers/uapce.cpp59
-rw-r--r--src/mame/drivers/ultraman.cpp43
-rw-r--r--src/mame/drivers/ultratnk.cpp30
-rw-r--r--src/mame/drivers/undrfire.cpp60
-rw-r--r--src/mame/drivers/unianapc.cpp22
-rw-r--r--src/mame/drivers/unichamp.cpp2
-rw-r--r--src/mame/drivers/unico.cpp118
-rw-r--r--src/mame/drivers/unior.cpp33
-rw-r--r--src/mame/drivers/univac.cpp416
-rw-r--r--src/mame/drivers/unixpc.cpp76
-rw-r--r--src/mame/drivers/unkhorse.cpp31
-rw-r--r--src/mame/drivers/unkpoker.cpp173
-rw-r--r--src/mame/drivers/upscope.cpp29
-rw-r--r--src/mame/drivers/usbilliards.cpp23
-rw-r--r--src/mame/drivers/usgames.cpp34
-rw-r--r--src/mame/drivers/ut88.cpp67
-rw-r--r--src/mame/drivers/uzebox.cpp2
-rw-r--r--src/mame/drivers/v100.cpp84
-rw-r--r--src/mame/drivers/v102.cpp82
-rw-r--r--src/mame/drivers/v1050.cpp87
-rw-r--r--src/mame/drivers/v550.cpp4
-rw-r--r--src/mame/drivers/v6809.cpp39
-rw-r--r--src/mame/drivers/vaportra.cpp41
-rw-r--r--src/mame/drivers/vax11.cpp2
-rw-r--r--src/mame/drivers/vball.cpp37
-rw-r--r--src/mame/drivers/vboy.cpp46
-rw-r--r--src/mame/drivers/vc4000.cpp20
-rw-r--r--src/mame/drivers/vcombat.cpp88
-rw-r--r--src/mame/drivers/vcs80.cpp7
-rw-r--r--src/mame/drivers/vd.cpp13
-rw-r--r--src/mame/drivers/vectrex.cpp1
-rw-r--r--src/mame/drivers/vectrix.cpp13
-rw-r--r--src/mame/drivers/vega.cpp13
-rw-r--r--src/mame/drivers/vegaeo.cpp2
-rw-r--r--src/mame/drivers/vegas.cpp113
-rw-r--r--src/mame/drivers/vertigo.cpp30
-rw-r--r--src/mame/drivers/vg5k.cpp58
-rw-r--r--src/mame/drivers/vgmplay.cpp20
-rw-r--r--src/mame/drivers/vic10.cpp72
-rw-r--r--src/mame/drivers/vic20.cpp10
-rw-r--r--src/mame/drivers/vicdual.cpp291
-rw-r--r--src/mame/drivers/victor9k.cpp2
-rw-r--r--src/mame/drivers/victory.cpp27
-rw-r--r--src/mame/drivers/vidbrain.cpp34
-rw-r--r--src/mame/drivers/video21.cpp2
-rw-r--r--src/mame/drivers/videopin.cpp26
-rw-r--r--src/mame/drivers/videopkr.cpp86
-rw-r--r--src/mame/drivers/vigilant.cpp5
-rw-r--r--src/mame/drivers/vii.cpp1704
-rw-r--r--src/mame/drivers/vindictr.cpp28
-rw-r--r--src/mame/drivers/vip.cpp37
-rw-r--r--src/mame/drivers/viper.cpp2
-rw-r--r--src/mame/drivers/vis.cpp3
-rw-r--r--src/mame/drivers/vixen.cpp115
-rw-r--r--src/mame/drivers/vk100.cpp17
-rw-r--r--src/mame/drivers/vlc.cpp54
-rw-r--r--src/mame/drivers/volfied.cpp34
-rw-r--r--src/mame/drivers/votrpss.cpp20
-rw-r--r--src/mame/drivers/voyager.cpp8
-rw-r--r--src/mame/drivers/vpoker.cpp30
-rw-r--r--src/mame/drivers/vroulet.cpp32
-rw-r--r--src/mame/drivers/vsmile.cpp421
-rw-r--r--src/mame/drivers/vsmileb.cpp164
-rw-r--r--src/mame/drivers/vsmilepro.cpp14
-rw-r--r--src/mame/drivers/vsnes.cpp6
-rw-r--r--src/mame/drivers/vt100.cpp95
-rw-r--r--src/mame/drivers/vt220.cpp10
-rw-r--r--src/mame/drivers/vt240.cpp25
-rw-r--r--src/mame/drivers/vt320.cpp26
-rw-r--r--src/mame/drivers/vt520.cpp50
-rw-r--r--src/mame/drivers/vta2000.cpp29
-rw-r--r--src/mame/drivers/vtech1.cpp40
-rw-r--r--src/mame/drivers/vtech2.cpp43
-rw-r--r--src/mame/drivers/vtech_eu3a12.cpp20
-rw-r--r--src/mame/drivers/vtech_unk1.cpp19
-rw-r--r--src/mame/drivers/vtech_unk2.cpp19
-rw-r--r--src/mame/drivers/vulgus.cpp34
-rw-r--r--src/mame/drivers/wacky_gator.cpp28
-rw-r--r--src/mame/drivers/wallc.cpp58
-rw-r--r--src/mame/drivers/wangpc.cpp65
-rw-r--r--src/mame/drivers/wardner.cpp46
-rw-r--r--src/mame/drivers/warpsped.cpp28
-rw-r--r--src/mame/drivers/warpwarp.cpp70
-rw-r--r--src/mame/drivers/warriorb.cpp12
-rw-r--r--src/mame/drivers/wc90b.cpp51
-rw-r--r--src/mame/drivers/welltris.cpp4
-rw-r--r--src/mame/drivers/wgp.cpp6
-rw-r--r--src/mame/drivers/wheelfir.cpp44
-rw-r--r--src/mame/drivers/white_mod.cpp9
-rw-r--r--src/mame/drivers/wicat.cpp8
-rw-r--r--src/mame/drivers/wico.cpp26
-rw-r--r--src/mame/drivers/wildpkr.cpp80
-rw-r--r--src/mame/drivers/williams.cpp211
-rw-r--r--src/mame/drivers/wink.cpp35
-rw-r--r--src/mame/drivers/wiping.cpp32
-rw-r--r--src/mame/drivers/witch.cpp131
-rw-r--r--src/mame/drivers/wiz.cpp79
-rw-r--r--src/mame/drivers/wmg.cpp41
-rw-r--r--src/mame/drivers/wms.cpp43
-rw-r--r--src/mame/drivers/wolfpack.cpp32
-rw-r--r--src/mame/drivers/wpc_95.cpp24
-rw-r--r--src/mame/drivers/wpc_dcs.cpp33
-rw-r--r--src/mame/drivers/wpc_s.cpp24
-rw-r--r--src/mame/drivers/wrally.cpp39
-rw-r--r--src/mame/drivers/wrlshunt.cpp179
-rw-r--r--src/mame/drivers/wswan.cpp62
-rw-r--r--src/mame/drivers/wwfsstar.cpp31
-rw-r--r--src/mame/drivers/wy150.cpp122
-rw-r--r--src/mame/drivers/wy30p.cpp128
-rw-r--r--src/mame/drivers/wy50.cpp145
-rw-r--r--src/mame/drivers/wy55.cpp111
-rw-r--r--src/mame/drivers/wy60.cpp168
-rw-r--r--src/mame/drivers/wyse.cpp103
-rw-r--r--src/mame/drivers/wyvernf0.cpp5
-rw-r--r--src/mame/drivers/x07.cpp44
-rw-r--r--src/mame/drivers/x1.cpp68
-rw-r--r--src/mame/drivers/x1twin.cpp62
-rw-r--r--src/mame/drivers/x68k.cpp33
-rw-r--r--src/mame/drivers/xain.cpp41
-rw-r--r--src/mame/drivers/xavix.cpp918
-rw-r--r--src/mame/drivers/xavix2.cpp161
-rw-r--r--src/mame/drivers/xbox.cpp22
-rw-r--r--src/mame/drivers/xerox820.cpp66
-rw-r--r--src/mame/drivers/xmen.cpp121
-rw-r--r--src/mame/drivers/xor100.cpp54
-rw-r--r--src/mame/drivers/xtheball.cpp24
-rw-r--r--src/mame/drivers/xtom3d.cpp8
-rw-r--r--src/mame/drivers/xxmissio.cpp34
-rw-r--r--src/mame/drivers/xybots.cpp26
-rw-r--r--src/mame/drivers/xyonix.cpp34
-rw-r--r--src/mame/drivers/y2.cpp21
-rw-r--r--src/mame/drivers/yiear.cpp39
-rw-r--r--src/mame/drivers/ymmu100.cpp574
-rw-r--r--src/mame/drivers/yunsung8.cpp47
-rw-r--r--src/mame/drivers/z100.cpp97
-rw-r--r--src/mame/drivers/z1013.cpp35
-rw-r--r--src/mame/drivers/z80dev.cpp11
-rw-r--r--src/mame/drivers/z80ne.cpp136
-rw-r--r--src/mame/drivers/z88.cpp22
-rw-r--r--src/mame/drivers/z9001.cpp27
-rw-r--r--src/mame/drivers/zac_proto.cpp10
-rw-r--r--src/mame/drivers/zaccaria.cpp28
-rw-r--r--src/mame/drivers/zapcomputer.cpp11
-rw-r--r--src/mame/drivers/zaurus.cpp26
-rw-r--r--src/mame/drivers/zaxxon.cpp84
-rw-r--r--src/mame/drivers/zexall.cpp2
-rw-r--r--src/mame/drivers/zms8085.cpp9
-rw-r--r--src/mame/drivers/zn.cpp8
-rw-r--r--src/mame/drivers/zorba.cpp49
-rw-r--r--src/mame/drivers/zr107.cpp10
-rw-r--r--src/mame/drivers/zwackery.cpp4
-rw-r--r--src/mame/etc/korgm1.cpp30
-rw-r--r--src/mame/etc/template_device.cpp7
-rw-r--r--src/mame/etc/unkfr.cpp5
-rw-r--r--src/mame/includes/8080bw.h4
-rw-r--r--src/mame/includes/adam.h4
-rw-r--r--src/mame/includes/apollo.h18
-rw-r--r--src/mame/includes/apple3.h16
-rw-r--r--src/mame/includes/ashnojoe.h1
-rw-r--r--src/mame/includes/astrocde.h1
-rw-r--r--src/mame/includes/battlera.h1
-rw-r--r--src/mame/includes/bbc.h33
-rw-r--r--src/mame/includes/btoads.h86
-rw-r--r--src/mame/includes/canyon.h2
-rw-r--r--src/mame/includes/champbas.h1
-rw-r--r--src/mame/includes/chessbase.h70
-rw-r--r--src/mame/includes/ckingbase.h73
-rw-r--r--src/mame/includes/coco12.h1
-rw-r--r--src/mame/includes/coleco.h2
-rw-r--r--src/mame/includes/concept.h10
-rw-r--r--src/mame/includes/cosmic.h1
-rw-r--r--src/mame/includes/cps1.h1
-rw-r--r--src/mame/includes/cps3.h60
-rw-r--r--src/mame/includes/crospang.h64
-rw-r--r--src/mame/includes/cxgbase.h76
-rw-r--r--src/mame/includes/dccons.h1
-rw-r--r--src/mame/includes/dcheese.h30
-rw-r--r--src/mame/includes/dec0.h4
-rw-r--r--src/mame/includes/dragrace.h2
-rw-r--r--src/mame/includes/esd16.h78
-rw-r--r--src/mame/includes/fidelbase.h80
-rw-r--r--src/mame/includes/funworld.h6
-rw-r--r--src/mame/includes/gaelco2.h73
-rw-r--r--src/mame/includes/galastrm.h18
-rw-r--r--src/mame/includes/galaxian.h6
-rw-r--r--src/mame/includes/galaxold.h8
-rw-r--r--src/mame/includes/galivan.h6
-rw-r--r--src/mame/includes/gyruss.h2
-rw-r--r--src/mame/includes/harddriv.h2
-rw-r--r--src/mame/includes/hec2hrp.h18
-rw-r--r--src/mame/includes/hh_sm510.h7
-rw-r--r--src/mame/includes/hh_tms1k.h23
-rw-r--r--src/mame/includes/hh_ucom4.h4
-rw-r--r--src/mame/includes/homedata.h49
-rw-r--r--src/mame/includes/homerun.h55
-rw-r--r--src/mame/includes/itech8.h2
-rw-r--r--src/mame/includes/jazz.h42
-rw-r--r--src/mame/includes/jensen.h72
-rw-r--r--src/mame/includes/jpmsys5.h2
-rw-r--r--src/mame/includes/kchamp.h2
-rw-r--r--src/mame/includes/kingobox.h18
-rw-r--r--src/mame/includes/kyocera.h32
-rw-r--r--src/mame/includes/ladybug.h3
-rw-r--r--src/mame/includes/lisa.h6
-rw-r--r--src/mame/includes/lvcards.h5
-rw-r--r--src/mame/includes/lwings.h4
-rw-r--r--src/mame/includes/m52.h12
-rw-r--r--src/mame/includes/madalien.h4
-rw-r--r--src/mame/includes/mbc55x.h52
-rw-r--r--src/mame/includes/mcr3.h2
-rw-r--r--src/mame/includes/megadriv.h24
-rw-r--r--src/mame/includes/megadriv_acbl.h5
-rw-r--r--src/mame/includes/megasys1.h65
-rw-r--r--src/mame/includes/midyunit.h44
-rw-r--r--src/mame/includes/mips.h2
-rw-r--r--src/mame/includes/model1.h1
-rw-r--r--src/mame/includes/ms32.h17
-rw-r--r--src/mame/includes/msx.h123
-rw-r--r--src/mame/includes/mtx.h31
-rw-r--r--src/mame/includes/multfish.h4
-rw-r--r--src/mame/includes/mw8080bw.h4
-rw-r--r--src/mame/includes/mystston.h6
-rw-r--r--src/mame/includes/mystwarr.h1
-rw-r--r--src/mame/includes/namcona1.h2
-rw-r--r--src/mame/includes/namcos1.h85
-rw-r--r--src/mame/includes/nforcepc.h90
-rw-r--r--src/mame/includes/niyanpai.h4
-rw-r--r--src/mame/includes/nmk16.h1
-rw-r--r--src/mame/includes/nova2001.h30
-rw-r--r--src/mame/includes/novagbase.h72
-rw-r--r--src/mame/includes/oneshot.h57
-rw-r--r--src/mame/includes/orbit.h2
-rw-r--r--src/mame/includes/psikyo.h82
-rw-r--r--src/mame/includes/realbrk.h4
-rw-r--r--src/mame/includes/redclash.h20
-rw-r--r--src/mame/includes/rungun.h1
-rw-r--r--src/mame/includes/segag80r.h7
-rw-r--r--src/mame/includes/segaybd.h2
-rw-r--r--src/mame/includes/seta.h6
-rw-r--r--src/mame/includes/seta2.h2
-rw-r--r--src/mame/includes/sms.h53
-rw-r--r--src/mame/includes/snes.h1
-rw-r--r--src/mame/includes/sorcerer.h3
-rw-r--r--src/mame/includes/spectrum.h6
-rw-r--r--src/mame/includes/sprint2.h2
-rw-r--r--src/mame/includes/sprint4.h2
-rw-r--r--src/mame/includes/sprint8.h2
-rw-r--r--src/mame/includes/taitosj.h2
-rw-r--r--src/mame/includes/tandy2k.h46
-rw-r--r--src/mame/includes/terracre.h3
-rw-r--r--src/mame/includes/thomson.h21
-rw-r--r--src/mame/includes/ti85.h14
-rw-r--r--src/mame/includes/timelimt.h1
-rw-r--r--src/mame/includes/tmnt.h2
-rw-r--r--src/mame/includes/toaplan1.h292
-rw-r--r--src/mame/includes/trs80.h7
-rw-r--r--src/mame/includes/twincobr.h116
-rw-r--r--src/mame/includes/unico.h14
-rw-r--r--src/mame/includes/vcs80.h8
-rw-r--r--src/mame/includes/videopin.h14
-rw-r--r--src/mame/includes/vsmile.h175
-rw-r--r--src/mame/includes/witch.h9
-rw-r--r--src/mame/includes/wswan.h6
-rw-r--r--src/mame/includes/xavix.h262
-rw-r--r--src/mame/includes/xbox.h21
-rw-r--r--src/mame/includes/xbox_pci.h50
-rw-r--r--src/mame/includes/z80ne.h4
-rw-r--r--src/mame/layout/aci_boris.lay172
-rw-r--r--src/mame/layout/aci_borisdpl.lay318
-rw-r--r--src/mame/layout/alphie.lay38
-rw-r--r--src/mame/layout/arrball.lay296
-rw-r--r--src/mame/layout/ave_arb.lay437
-rw-r--r--src/mame/layout/baddog.lay14
-rw-r--r--src/mame/layout/bambball.lay67
-rw-r--r--src/mame/layout/borisdpl.lay35
-rw-r--r--src/mame/layout/cc40.lay12
-rw-r--r--src/mame/layout/chessmst.lay76
-rw-r--r--src/mame/layout/chessmstdm.lay52
-rw-r--r--src/mame/layout/chesstrv.lay126
-rw-r--r--src/mame/layout/ck_master.lay24
-rw-r--r--src/mame/layout/cmpchess.lay265
-rw-r--r--src/mame/layout/ctstein.lay49
-rw-r--r--src/mame/layout/cxg_ch2001.lay30
-rw-r--r--src/mame/layout/f2pbball.lay120
-rw-r--r--src/mame/layout/fidel_acr.lay173
-rw-r--r--src/mame/layout/fidel_as12.lay24
-rw-r--r--src/mame/layout/fidel_bkc.lay178
-rw-r--r--src/mame/layout/fidel_brc.lay495
-rw-r--r--src/mame/layout/fidel_bv3.lay461
-rw-r--r--src/mame/layout/fidel_cc1.lay145
-rw-r--r--src/mame/layout/fidel_cc10.lay (renamed from src/mame/layout/fidel_cc.lay)4
-rw-r--r--src/mame/layout/fidel_chesster.lay28
-rw-r--r--src/mame/layout/fidel_csc.lay194
-rw-r--r--src/mame/layout/fidel_des.lay24
-rw-r--r--src/mame/layout/fidel_desdis.lay28
-rw-r--r--src/mame/layout/fidel_desdis_68kg.lay28
-rw-r--r--src/mame/layout/fidel_desdis_68kr.lay28
-rw-r--r--src/mame/layout/fidel_dsc.lay32
-rw-r--r--src/mame/layout/fidel_eag.lay46
-rw-r--r--src/mame/layout/fidel_eag_68k.lay46
-rw-r--r--src/mame/layout/fidel_eas.lay24
-rw-r--r--src/mame/layout/fidel_eas_priv.lay438
-rw-r--r--src/mame/layout/fidel_ex.lay24
-rw-r--r--src/mame/layout/fidel_ex_68k.lay24
-rw-r--r--src/mame/layout/fidel_exd.lay24
-rw-r--r--src/mame/layout/fidel_gin.lay465
-rw-r--r--src/mame/layout/fidel_pc.lay54
-rw-r--r--src/mame/layout/fidel_playmatic.lay24
-rw-r--r--src/mame/layout/fidel_sc12.lay24
-rw-r--r--src/mame/layout/fidel_sc6.lay24
-rw-r--r--src/mame/layout/fidel_sc8.lay24
-rw-r--r--src/mame/layout/fidel_sc9.lay24
-rw-r--r--src/mame/layout/fidel_su9.lay24
-rw-r--r--src/mame/layout/fidel_vbrc.lay114
-rw-r--r--src/mame/layout/fidel_vsc.lay24
-rw-r--r--src/mame/layout/gckong.lay43
-rw-r--r--src/mame/layout/h2hbaskb.lay163
-rw-r--r--src/mame/layout/h2hbaskbc.lay56
-rw-r--r--src/mame/layout/h2hhockey.lay56
-rw-r--r--src/mame/layout/h2hhockeyc.lay56
-rw-r--r--src/mame/layout/h2hsoccerc.lay56
-rw-r--r--src/mame/layout/hh_amis2k_test.lay34
-rw-r--r--src/mame/layout/hh_cop400_test.lay537
-rw-r--r--src/mame/layout/hh_hmcs40_test.lay665
-rw-r--r--src/mame/layout/hh_melps4_test.lay537
-rw-r--r--src/mame/layout/hh_pic16_test.lay537
-rw-r--r--src/mame/layout/hh_sm500_test.lay104
-rw-r--r--src/mame/layout/hh_sm510_test.lay314
-rw-r--r--src/mame/layout/hh_tms1k_test.lay537
-rw-r--r--src/mame/layout/hh_ucom4_test.lay537
-rw-r--r--src/mame/layout/intellect02.lay106
-rw-r--r--src/mame/layout/k28.lay48
-rw-r--r--src/mame/layout/matchme.lay111
-rw-r--r--[-rwxr-xr-x]src/mame/layout/md6802.lay473
-rw-r--r--src/mame/layout/mdndclab.lay13
-rw-r--r--src/mame/layout/mephisto_academy.lay24
-rw-r--r--src/mame/layout/mephisto_lcd.lay24
-rw-r--r--src/mame/layout/mephisto_megaiv.lay16
-rw-r--r--src/mame/layout/mephisto_milano.lay24
-rw-r--r--src/mame/layout/mephisto_modena.lay24
-rw-r--r--src/mame/layout/mephisto_mondial2.lay12
-rw-r--r--src/mame/layout/mephisto_montec.lay16
-rw-r--r--src/mame/layout/mephisto_smondial2.lay16
-rw-r--r--src/mame/layout/mk1.lay288
-rw-r--r--src/mame/layout/modulab.lay429
-rw-r--r--src/mame/layout/msthawk.lay22
-rw-r--r--src/mame/layout/mwcbaseb.lay41
-rw-r--r--src/mame/layout/novag_cforte.lay32
-rw-r--r--src/mame/layout/novag_delta1.lay283
-rw-r--r--src/mame/layout/novag_diablo68k.lay26
-rw-r--r--src/mame/layout/novag_presto.lay24
-rw-r--r--src/mame/layout/novag_scorpio68k.lay60
-rw-r--r--src/mame/layout/novag_sexpert.lay26
-rw-r--r--src/mame/layout/novag_sforte.lay34
-rw-r--r--src/mame/layout/novag_supercon.lay48
-rw-r--r--src/mame/layout/packmon.lay81
-rw-r--r--src/mame/layout/phpball.lay72
-rw-r--r--src/mame/layout/raisedvl.lay91
-rw-r--r--src/mame/layout/rebound.lay23
-rw-r--r--src/mame/layout/risc2500.lay100
-rw-r--r--src/mame/layout/sc1.lay62
-rw-r--r--src/mame/layout/sc2.lay243
-rw-r--r--src/mame/layout/simon.lay94
-rw-r--r--src/mame/layout/slc1a.lay20
-rw-r--r--src/mame/layout/ssimon.lay184
-rw-r--r--src/mame/layout/tgm.lay28
-rw-r--r--src/mame/layout/ti74.lay12
-rw-r--r--src/mame/layout/ti95.lay6
-rw-r--r--src/mame/layout/tmtennis.lay56
-rw-r--r--src/mame/layout/tntell.lay6
-rw-r--r--src/mame/layout/touchme.lay115
-rw-r--r--src/mame/layout/wildfire.lay135
-rw-r--r--src/mame/layout/zodiac.lay204
-rw-r--r--src/mame/machine/abc80kb.cpp11
-rw-r--r--src/mame/machine/acs8600_ics.cpp8
-rw-r--r--src/mame/machine/acs8600_ics.h6
-rw-r--r--src/mame/machine/aim65.cpp14
-rw-r--r--src/mame/machine/amiga.cpp8
-rw-r--r--src/mame/machine/amstrad.cpp49
-rw-r--r--src/mame/machine/apollo.cpp48
-rw-r--r--src/mame/machine/apollo_kbd.cpp35
-rw-r--r--src/mame/machine/apollo_kbd.h2
-rw-r--r--src/mame/machine/apple2common.cpp806
-rw-r--r--src/mame/machine/apple2common.h54
-rw-r--r--src/mame/machine/apple3.cpp32
-rw-r--r--src/mame/machine/apricotkb.cpp9
-rw-r--r--src/mame/machine/at.cpp45
-rw-r--r--src/mame/machine/at.h1
-rw-r--r--src/mame/machine/atarifdc.cpp7
-rw-r--r--src/mame/machine/balsente.cpp2
-rw-r--r--src/mame/machine/bbc.cpp151
-rw-r--r--src/mame/machine/bebox.cpp4
-rw-r--r--src/mame/machine/cbm_snqk.h2
-rw-r--r--src/mame/machine/cedar_magnet_plane.cpp11
-rw-r--r--src/mame/machine/cedar_magnet_sprite.cpp13
-rw-r--r--src/mame/machine/chessbase.cpp318
-rw-r--r--src/mame/machine/cit101_kbd.cpp8
-rw-r--r--src/mame/machine/coco.cpp12
-rw-r--r--src/mame/machine/coco_vhd.cpp2
-rw-r--r--src/mame/machine/coco_vhd.h16
-rw-r--r--src/mame/machine/concept.cpp35
-rw-r--r--src/mame/machine/cuda.cpp17
-rw-r--r--src/mame/machine/dec_lk201.cpp13
-rw-r--r--src/mame/machine/decioga.cpp37
-rw-r--r--src/mame/machine/decioga.h12
-rw-r--r--src/mame/machine/dgnalpha.cpp10
-rw-r--r--src/mame/machine/dragon.cpp10
-rw-r--r--src/mame/machine/egret.cpp9
-rw-r--r--src/mame/machine/electron.cpp16
-rw-r--r--src/mame/machine/esqlcd.cpp5
-rw-r--r--src/mame/machine/esqvfd.cpp15
-rw-r--r--src/mame/machine/fd1089.cpp2
-rw-r--r--src/mame/machine/fidelbase.cpp151
-rw-r--r--src/mame/machine/gaelco2.cpp68
-rw-r--r--src/mame/machine/gaelco_ds5002fp.cpp13
-rw-r--r--src/mame/machine/gaelco_ds5002fp.h13
-rw-r--r--src/mame/machine/gamepock.cpp2
-rw-r--r--src/mame/machine/gdrom.cpp48
-rw-r--r--src/mame/machine/harddriv.cpp20
-rw-r--r--src/mame/machine/hng64_net.cpp11
-rw-r--r--src/mame/machine/hp9825_tape.cpp5
-rw-r--r--src/mame/machine/hp9845_printer.cpp9
-rw-r--r--src/mame/machine/hpc1.cpp227
-rw-r--r--src/mame/machine/hpc1.h19
-rw-r--r--src/mame/machine/hpc3.cpp73
-rw-r--r--src/mame/machine/hpc3.h15
-rw-r--r--src/mame/machine/ibm6580_fdc.cpp32
-rw-r--r--src/mame/machine/ibm6580_kbd.cpp38
-rw-r--r--src/mame/machine/imds2ioc.cpp10
-rw-r--r--src/mame/machine/inder_sb.cpp31
-rw-r--r--src/mame/machine/inder_vid.cpp15
-rw-r--r--src/mame/machine/interpro_ioga.cpp9
-rw-r--r--src/mame/machine/interpro_ioga.h9
-rw-r--r--src/mame/machine/intv.cpp32
-rw-r--r--src/mame/machine/ioc2.cpp80
-rw-r--r--src/mame/machine/ioc2.h4
-rw-r--r--src/mame/machine/isbc_208.cpp4
-rw-r--r--src/mame/machine/iteagle_fpga.cpp7
-rw-r--r--src/mame/machine/jazz_mct_adr.cpp265
-rw-r--r--src/mame/machine/jazz_mct_adr.h123
-rw-r--r--src/mame/machine/k7659kb.cpp6
-rw-r--r--src/mame/machine/kc_keyb.cpp2
-rw-r--r--src/mame/machine/km035.cpp28
-rw-r--r--src/mame/machine/leland.cpp8
-rw-r--r--src/mame/machine/lisa.cpp6
-rw-r--r--src/mame/machine/lynx.cpp2
-rw-r--r--src/mame/machine/m20_8086.cpp13
-rw-r--r--src/mame/machine/m24_z8000.cpp2
-rw-r--r--src/mame/machine/m2comm.cpp5
-rw-r--r--src/mame/machine/m3comm.cpp9
-rw-r--r--src/mame/machine/macpci.cpp8
-rw-r--r--src/mame/machine/mbc55x.cpp383
-rw-r--r--src/mame/machine/mbc55x_kbd.cpp295
-rw-r--r--src/mame/machine/mbc55x_kbd.h64
-rw-r--r--src/mame/machine/mbee.cpp6
-rw-r--r--src/mame/machine/mega32x.cpp1
-rw-r--r--src/mame/machine/megacd.cpp81
-rw-r--r--src/mame/machine/megacd.h11
-rw-r--r--src/mame/machine/megacdcd.cpp13
-rw-r--r--src/mame/machine/megadriv.cpp106
-rw-r--r--src/mame/machine/microtan.cpp8
-rw-r--r--src/mame/machine/midtunit.cpp2
-rw-r--r--src/mame/machine/midwayic.cpp56
-rw-r--r--src/mame/machine/midwayic.h17
-rw-r--r--src/mame/machine/midwunit.cpp6
-rw-r--r--src/mame/machine/midxunit.cpp6
-rw-r--r--src/mame/machine/midyunit.cpp12
-rw-r--r--src/mame/machine/mips_rambo.cpp219
-rw-r--r--src/mame/machine/mips_rambo.h26
-rw-r--r--src/mame/machine/mmboard.cpp24
-rw-r--r--src/mame/machine/mpu4.cpp108
-rw-r--r--src/mame/machine/ms7004.cpp27
-rw-r--r--src/mame/machine/msx.cpp14
-rw-r--r--src/mame/machine/mtx.cpp153
-rw-r--r--src/mame/machine/mw8080bw.cpp28
-rw-r--r--src/mame/machine/namcos1.cpp273
-rw-r--r--src/mame/machine/nb1412m2.cpp2
-rw-r--r--src/mame/machine/nes.cpp22
-rw-r--r--src/mame/machine/nl_breakout.cpp53
-rw-r--r--src/mame/machine/nl_palestra.cpp710
-rw-r--r--src/mame/machine/nl_palestra.h4
-rw-r--r--src/mame/machine/nl_rebound.cpp1272
-rw-r--r--src/mame/machine/nl_rebound.h4
-rw-r--r--src/mame/machine/nl_tp1983.cpp123
-rw-r--r--src/mame/machine/nl_tp1983.h4
-rw-r--r--src/mame/machine/nl_tp1985.cpp246
-rw-r--r--src/mame/machine/nl_tp1985.h4
-rw-r--r--src/mame/machine/novagbase.cpp60
-rw-r--r--src/mame/machine/orion.cpp18
-rw-r--r--src/mame/machine/osborne1.cpp12
-rw-r--r--src/mame/machine/pce_cd.cpp27
-rw-r--r--src/mame/machine/pcshare.cpp90
-rw-r--r--src/mame/machine/pgmprot_igs025_igs012.cpp8
-rw-r--r--src/mame/machine/pgmprot_igs025_igs022.cpp18
-rw-r--r--src/mame/machine/pgmprot_igs025_igs028.cpp8
-rw-r--r--src/mame/machine/pgmprot_igs027a_type1.cpp37
-rw-r--r--src/mame/machine/pgmprot_igs027a_type2.cpp12
-rw-r--r--src/mame/machine/pgmprot_igs027a_type3.cpp12
-rw-r--r--src/mame/machine/pgmprot_orlegend.cpp5
-rw-r--r--src/mame/machine/poly.cpp4
-rw-r--r--src/mame/machine/qimi.cpp6
-rw-r--r--src/mame/machine/qimi.h4
-rw-r--r--src/mame/machine/qix.cpp2
-rw-r--r--src/mame/machine/rad_eu3a05gpio.h6
-rw-r--r--src/mame/machine/radio86.cpp2
-rw-r--r--src/mame/machine/rx01.cpp7
-rw-r--r--src/mame/machine/s32comm.cpp5
-rw-r--r--src/mame/machine/saturn_cdb.cpp11
-rw-r--r--src/mame/machine/segaic16.cpp6
-rw-r--r--src/mame/machine/seicopbl.cpp2
-rw-r--r--src/mame/machine/sgi.cpp310
-rw-r--r--src/mame/machine/sgi.h30
-rw-r--r--src/mame/machine/sms.cpp86
-rw-r--r--src/mame/machine/snes.cpp5
-rw-r--r--src/mame/machine/sorcerer.cpp7
-rw-r--r--src/mame/machine/spec_snqk.cpp6
-rw-r--r--src/mame/machine/taitocchip.cpp32
-rw-r--r--src/mame/machine/taitocchip.h20
-rw-r--r--src/mame/machine/tatsumi.cpp4
-rw-r--r--src/mame/machine/teleprinter.cpp20
-rw-r--r--src/mame/machine/thomflop.cpp4
-rw-r--r--src/mame/machine/thomson.cpp30
-rw-r--r--src/mame/machine/ti85.cpp36
-rw-r--r--src/mame/machine/toaplan1.cpp134
-rw-r--r--src/mame/machine/trs80.cpp3
-rw-r--r--src/mame/machine/tv950kb.cpp2
-rw-r--r--src/mame/machine/tv955kb.cpp47
-rw-r--r--src/mame/machine/tv955kb.h14
-rw-r--r--src/mame/machine/twincobr.cpp39
-rw-r--r--src/mame/machine/v102_kbd.cpp225
-rw-r--r--src/mame/machine/v102_kbd.h45
-rw-r--r--src/mame/machine/v1050kb.cpp8
-rw-r--r--src/mame/machine/vector06.cpp6
-rw-r--r--src/mame/machine/vectrex.cpp2
-rw-r--r--src/mame/machine/vertigo.cpp2
-rw-r--r--src/mame/machine/vt100_kbd.cpp8
-rw-r--r--src/mame/machine/vtech2.cpp5
-rw-r--r--src/mame/machine/wangpckb.cpp2
-rw-r--r--src/mame/machine/williams.cpp4
-rw-r--r--src/mame/machine/wswan.cpp34
-rw-r--r--src/mame/machine/wy50kb.cpp187
-rw-r--r--src/mame/machine/wy50kb.h29
-rw-r--r--src/mame/machine/xavix.cpp392
-rw-r--r--src/mame/machine/xavix2002_io.cpp127
-rw-r--r--src/mame/machine/xavix2002_io.h49
-rw-r--r--src/mame/machine/xavix_adc.cpp100
-rw-r--r--src/mame/machine/xavix_adc.h50
-rw-r--r--src/mame/machine/xavix_anport.cpp81
-rw-r--r--src/mame/machine/xavix_anport.h41
-rw-r--r--src/mame/machine/xavix_io.cpp103
-rw-r--r--src/mame/machine/xavix_io.h42
-rw-r--r--src/mame/machine/xavix_math.cpp171
-rw-r--r--src/mame/machine/xavix_math.h34
-rw-r--r--src/mame/machine/xbox.cpp179
-rw-r--r--src/mame/machine/xbox_pci.cpp277
-rw-r--r--src/mame/machine/z80ne.cpp16
-rw-r--r--src/mame/mame.lst585
-rw-r--r--src/mame/mess.flt67
-rw-r--r--src/mame/nl.lst7
-rw-r--r--src/mame/video/20pacgal.cpp19
-rw-r--r--src/mame/video/3dom2_te.cpp6
-rw-r--r--src/mame/video/733_asr.cpp24
-rw-r--r--src/mame/video/911_vdt.cpp24
-rw-r--r--src/mame/video/abc1600.cpp11
-rw-r--r--src/mame/video/abc80.cpp16
-rw-r--r--src/mame/video/abc800.cpp38
-rw-r--r--src/mame/video/abc802.cpp13
-rw-r--r--src/mame/video/abc806.cpp13
-rw-r--r--src/mame/video/agat7.cpp13
-rw-r--r--src/mame/video/airraid_dev.cpp25
-rw-r--r--src/mame/video/amiga.cpp32
-rw-r--r--src/mame/video/ampoker2.cpp6
-rw-r--r--src/mame/video/apollo.cpp26
-rw-r--r--src/mame/video/arabian.cpp8
-rw-r--r--src/mame/video/astrocde.cpp14
-rw-r--r--src/mame/video/aussiebyte.cpp4
-rw-r--r--src/mame/video/bagman.cpp6
-rw-r--r--src/mame/video/bfm_adr2.cpp29
-rw-r--r--src/mame/video/bfm_dm01.cpp32
-rw-r--r--src/mame/video/bking.cpp6
-rw-r--r--src/mame/video/btoads.cpp4
-rw-r--r--src/mame/video/capbowl.cpp4
-rw-r--r--src/mame/video/ccastles.cpp6
-rw-r--r--src/mame/video/cclimber.cpp6
-rw-r--r--src/mame/video/cgc7900.cpp25
-rw-r--r--src/mame/video/champbas.cpp6
-rw-r--r--src/mame/video/circusc.cpp6
-rw-r--r--src/mame/video/cloak.cpp6
-rw-r--r--src/mame/video/cloud9.cpp6
-rw-r--r--src/mame/video/cninja.cpp8
-rw-r--r--src/mame/video/cps1.cpp2
-rw-r--r--src/mame/video/crospang.cpp38
-rw-r--r--src/mame/video/dcheese.cpp75
-rw-r--r--src/mame/video/dec0.cpp27
-rw-r--r--src/mame/video/decbac06.cpp155
-rw-r--r--src/mame/video/decmxc06.cpp9
-rw-r--r--src/mame/video/decodmd1.cpp25
-rw-r--r--src/mame/video/decodmd2.cpp6
-rw-r--r--src/mame/video/decodmd3.cpp6
-rw-r--r--src/mame/video/divebomb.cpp6
-rw-r--r--src/mame/video/esd16.cpp106
-rw-r--r--src/mame/video/exerion.cpp6
-rw-r--r--src/mame/video/exidy440.cpp39
-rw-r--r--src/mame/video/fastfred.cpp6
-rw-r--r--src/mame/video/finalizr.cpp6
-rw-r--r--src/mame/video/foodf.cpp6
-rw-r--r--src/mame/video/funworld.cpp12
-rw-r--r--src/mame/video/gaelco2.cpp255
-rw-r--r--src/mame/video/galastrm.cpp14
-rw-r--r--src/mame/video/galaxian.cpp18
-rw-r--r--src/mame/video/gamate.cpp21
-rw-r--r--src/mame/video/gottlieb.cpp6
-rw-r--r--src/mame/video/gotya.cpp6
-rw-r--r--src/mame/video/grchamp.cpp6
-rw-r--r--src/mame/video/gyruss.cpp6
-rw-r--r--src/mame/video/homedata.cpp30
-rw-r--r--src/mame/video/homerun.cpp112
-rw-r--r--src/mame/video/hyperspt.cpp6
-rw-r--r--src/mame/video/ironhors.cpp6
-rw-r--r--src/mame/video/itech8.cpp12
-rw-r--r--src/mame/video/jedi.cpp15
-rw-r--r--src/mame/video/k057714.cpp169
-rw-r--r--src/mame/video/k057714.h6
-rw-r--r--src/mame/video/kaypro.cpp6
-rw-r--r--src/mame/video/kingobox.cpp16
-rw-r--r--src/mame/video/kyocera.cpp72
-rw-r--r--src/mame/video/ladybug.cpp6
-rw-r--r--src/mame/video/leland.cpp28
-rw-r--r--src/mame/video/light.cpp381
-rw-r--r--src/mame/video/light.h75
-rw-r--r--src/mame/video/lucky74.cpp12
-rw-r--r--src/mame/video/m52.cpp25
-rw-r--r--src/mame/video/m58.cpp18
-rw-r--r--src/mame/video/madalien.cpp22
-rw-r--r--src/mame/video/mappy.cpp18
-rw-r--r--src/mame/video/mbc55x.cpp34
-rw-r--r--src/mame/video/mbee.cpp4
-rw-r--r--src/mame/video/megasys1.cpp113
-rw-r--r--src/mame/video/megazone.cpp6
-rw-r--r--src/mame/video/mikie.cpp6
-rw-r--r--src/mame/video/mikromik.cpp33
-rw-r--r--src/mame/video/mystston.cpp30
-rw-r--r--src/mame/video/namcos1.cpp53
-rw-r--r--src/mame/video/naughtyb.cpp6
-rw-r--r--src/mame/video/neogeo.cpp8
-rw-r--r--src/mame/video/neogeo_spr.cpp84
-rw-r--r--src/mame/video/neogeo_spr.h9
-rw-r--r--src/mame/video/newbrain.cpp17
-rw-r--r--src/mame/video/newport.cpp2807
-rw-r--r--src/mame/video/newport.h113
-rw-r--r--src/mame/video/nick.cpp6
-rw-r--r--src/mame/video/nova2001.cpp132
-rw-r--r--src/mame/video/oneshot.cpp96
-rw-r--r--src/mame/video/osi.cpp51
-rw-r--r--src/mame/video/pacman.cpp6
-rw-r--r--src/mame/video/pandoras.cpp6
-rw-r--r--src/mame/video/pc1512.cpp8
-rw-r--r--src/mame/video/pc8401a.cpp50
-rw-r--r--src/mame/video/pc9801.cpp4
-rw-r--r--src/mame/video/pc_t1t.cpp10
-rw-r--r--src/mame/video/pcd.cpp17
-rw-r--r--src/mame/video/pooyan.cpp6
-rw-r--r--src/mame/video/psikyo.cpp323
-rw-r--r--src/mame/video/psikyosh.cpp2
-rw-r--r--src/mame/video/rallyx.cpp18
-rw-r--r--src/mame/video/redalert.cpp64
-rw-r--r--src/mame/video/redclash.cpp59
-rw-r--r--src/mame/video/rocnrope.cpp6
-rw-r--r--src/mame/video/sbasketb.cpp6
-rw-r--r--src/mame/video/segag80r.cpp12
-rw-r--r--src/mame/video/segaybd.cpp2
-rw-r--r--src/mame/video/seibu_crtc.cpp2
-rw-r--r--src/mame/video/seta2.cpp5
-rw-r--r--src/mame/video/shaolins.cpp6
-rw-r--r--src/mame/video/snookr10.cpp18
-rw-r--r--src/mame/video/spacefb.cpp12
-rw-r--r--src/mame/video/speedatk.cpp4
-rw-r--r--src/mame/video/stactics.cpp21
-rw-r--r--src/mame/video/stadhero.cpp2
-rw-r--r--src/mame/video/stfight_dev.cpp23
-rw-r--r--src/mame/video/super80.cpp4
-rw-r--r--src/mame/video/system16.cpp18
-rw-r--r--src/mame/video/taitosj.cpp6
-rw-r--r--src/mame/video/thomson.cpp73
-rw-r--r--src/mame/video/tia.cpp192
-rw-r--r--src/mame/video/timelimt.cpp6
-rw-r--r--src/mame/video/tmc1800.cpp15
-rw-r--r--src/mame/video/toaplan1.cpp687
-rw-r--r--src/mame/video/toaplan2.cpp4
-rw-r--r--src/mame/video/toaplan_scu.cpp58
-rw-r--r--src/mame/video/toaplan_scu.h4
-rw-r--r--src/mame/video/tp84.cpp6
-rw-r--r--src/mame/video/trackfld.cpp6
-rw-r--r--src/mame/video/tubep.cpp12
-rw-r--r--src/mame/video/turbo.cpp18
-rw-r--r--src/mame/video/twincobr.cpp144
-rw-r--r--src/mame/video/v1050.cpp17
-rw-r--r--src/mame/video/vectrex.cpp4
-rw-r--r--src/mame/video/videopin.cpp4
-rw-r--r--src/mame/video/vtvideo.cpp7
-rw-r--r--src/mame/video/warpwarp.cpp6
-rw-r--r--src/mame/video/williams.cpp6
-rw-r--r--src/mame/video/wiping.cpp6
-rw-r--r--src/mame/video/wiz.cpp6
-rw-r--r--src/mame/video/wpc_dmd.cpp21
-rw-r--r--src/mame/video/wswan.cpp8
-rw-r--r--src/mame/video/wswan.h8
-rw-r--r--src/mame/video/xavix.cpp192
-rw-r--r--src/mame/video/zaccaria.cpp6
-rw-r--r--src/mame/video/zaxxon.cpp6
-rw-r--r--src/mame/video/zx8301.cpp5
-rw-r--r--src/osd/eigccx86.h34
-rw-r--r--src/osd/eivcx86.h20
-rw-r--r--src/osd/eminline.h58
-rw-r--r--src/osd/modules/debugger/qt/debuggerview.cpp2
-rw-r--r--src/osd/modules/debugger/qt/memorywindow.cpp2
-rw-r--r--src/osd/modules/input/input_common.cpp6
-rw-r--r--src/osd/modules/input/input_common.h1
-rw-r--r--src/osd/modules/input/input_sdl.cpp312
-rw-r--r--src/osd/modules/input/input_x11.cpp18
-rw-r--r--src/osd/modules/lib/osdobj_common.cpp32
-rw-r--r--src/osd/modules/lib/osdobj_common.h3
-rw-r--r--src/osd/modules/osdhelper.h61
-rw-r--r--src/osd/modules/render/bgfx/shaders/chains/hlsl/fs_chroma.sc6
-rw-r--r--src/osd/modules/render/bgfx/shaders/chains/xbr/fs_xbr-lv3-noblend.sc6
-rw-r--r--src/osd/modules/render/bgfx/shaders/shader.mk2
-rw-r--r--src/osd/modules/render/drawogl.cpp32
-rw-r--r--src/osd/modules/sound/sdl_sound.cpp9
-rw-r--r--src/osd/osdepend.h5
-rw-r--r--src/osd/sdl/sdlmain.cpp1
-rw-r--r--src/osd/windows/video.h22
-rw-r--r--src/osd/windows/window.cpp29
-rw-r--r--src/osd/windows/winmain.cpp33
-rw-r--r--src/osd/windows/winmain.h2
-rw-r--r--src/osd/windows/winutf8.cpp10
-rw-r--r--src/osd/windows/winutf8.h23
-rw-r--r--src/tools/chdman.cpp2
-rw-r--r--src/tools/imgtool/filtbas.cpp2
-rw-r--r--src/tools/imgtool/main.cpp2
-rw-r--r--src/tools/imgtool/modules.cpp1
-rw-r--r--src/tools/imgtool/modules/rt11.cpp695
-rw-r--r--src/tools/testkeys.cpp346
-rw-r--r--src/tools/unidasm.cpp39
-rw-r--r--src/zexall/zexall.cpp9
4686 files changed, 172877 insertions, 109876 deletions
diff --git a/src/devices/bus/a1bus/a1bus.cpp b/src/devices/bus/a1bus/a1bus.cpp
index b9370c084d6..1dee51c40b2 100644
--- a/src/devices/bus/a1bus/a1bus.cpp
+++ b/src/devices/bus/a1bus/a1bus.cpp
@@ -82,7 +82,7 @@ a1bus_device::a1bus_device(const machine_config &mconfig, const char *tag, devic
a1bus_device::a1bus_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock)
: device_t(mconfig, type, tag, owner, clock)
- , m_maincpu(*this, finder_base::DUMMY_TAG)
+ , m_space(*this, finder_base::DUMMY_TAG, -1)
, m_out_irq_cb(*this)
, m_out_nmi_cb(*this)
, m_device(nullptr)
@@ -136,13 +136,13 @@ void a1bus_device::set_nmi_line(int state)
void a1bus_device::install_device(offs_t start, offs_t end, read8_delegate rhandler, write8_delegate whandler)
{
- m_maincpu->space(AS_PROGRAM).install_readwrite_handler(start, end, rhandler, whandler);
+ m_space->install_readwrite_handler(start, end, rhandler, whandler);
}
void a1bus_device::install_bank(offs_t start, offs_t end, const char *tag, uint8_t *data)
{
// printf("install_bank: %s @ %x->%x\n", tag, start, end);
- m_maincpu->space(AS_PROGRAM).install_readwrite_bank(start, end, tag);
+ m_space->install_readwrite_bank(start, end, tag);
machine().root_device().membank(siblingtag(tag).c_str())->set_base(data);
}
diff --git a/src/devices/bus/a1bus/a1bus.h b/src/devices/bus/a1bus/a1bus.h
index 484cba5b70f..7970f150719 100644
--- a/src/devices/bus/a1bus/a1bus.h
+++ b/src/devices/bus/a1bus/a1bus.h
@@ -13,19 +13,6 @@
//**************************************************************************
-// INTERFACE CONFIGURATION MACROS
-//**************************************************************************
-
-#define MCFG_A1BUS_CPU(_cputag) \
- downcast<a1bus_device &>(*device).set_cputag(_cputag);
-
-#define MCFG_A1BUS_OUT_IRQ_CB(_devcb) \
- downcast<a1bus_device &>(*device).set_out_irq_callback(DEVCB_##_devcb);
-
-#define MCFG_A1BUS_OUT_NMI_CB(_devcb) \
- downcast<a1bus_device &>(*device).set_out_nmi_callback(DEVCB_##_devcb);
-
-//**************************************************************************
// TYPE DEFINITIONS
//**************************************************************************
@@ -72,9 +59,9 @@ public:
a1bus_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
// inline configuration
- template <typename T> void set_cputag(T &&tag) { m_maincpu.set_tag(std::forward<T>(tag)); }
- template <class Object> devcb_base &set_out_irq_callback(Object &&cb) { return m_out_irq_cb.set_callback(std::forward<Object>(cb)); }
- template <class Object> devcb_base &set_out_nmi_callback(Object &&cb) { return m_out_nmi_cb.set_callback(std::forward<Object>(cb)); }
+ template <typename T> void set_space(T &&tag, int spacenum) { m_space.set_tag(std::forward<T>(tag), spacenum); }
+ auto out_irq_callback() { return m_out_irq_cb.bind(); }
+ auto out_nmi_callback() { return m_out_nmi_cb.bind(); }
void add_a1bus_card(device_a1bus_card_interface *card);
device_a1bus_card_interface *get_a1bus_card();
@@ -97,7 +84,7 @@ protected:
virtual void device_reset() override;
// internal state
- required_device<cpu_device> m_maincpu;
+ required_address_space m_space;
devcb_write_line m_out_irq_cb;
devcb_write_line m_out_nmi_cb;
diff --git a/src/devices/bus/a1bus/a1cassette.cpp b/src/devices/bus/a1bus/a1cassette.cpp
index 5605e156304..13140382f48 100644
--- a/src/devices/bus/a1bus/a1cassette.cpp
+++ b/src/devices/bus/a1bus/a1cassette.cpp
@@ -36,11 +36,12 @@ ROM_END
/* sound output */
-MACHINE_CONFIG_START(a1bus_cassette_device::device_add_mconfig)
- MCFG_CASSETTE_ADD("cassette")
- MCFG_CASSETTE_DEFAULT_STATE(CASSETTE_STOPPED)
- MCFG_CASSETTE_INTERFACE("apple1_cass")
-MACHINE_CONFIG_END
+void a1bus_cassette_device::device_add_mconfig(machine_config &config)
+{
+ CASSETTE(config, m_cassette);
+ m_cassette->set_default_state(CASSETTE_STOPPED);
+ m_cassette->set_interface("apple1_cass");
+}
const tiny_rom_entry *a1bus_cassette_device::device_rom_region() const
{
diff --git a/src/devices/bus/a2bus/a2alfam2.cpp b/src/devices/bus/a2bus/a2alfam2.cpp
index 6817176c202..e97722708da 100644
--- a/src/devices/bus/a2bus/a2alfam2.cpp
+++ b/src/devices/bus/a2bus/a2alfam2.cpp
@@ -39,37 +39,39 @@ DEFINE_DEVICE_TYPE(A2BUS_AESMS, a2bus_aesms_device, "a2aesms", "Applied Engin
// device_add_mconfig - add device configuration
//-------------------------------------------------
-MACHINE_CONFIG_START(a2bus_sn76489_device::device_add_mconfig)
+void a2bus_sn76489_device::device_add_mconfig(machine_config &config)
+{
SPEAKER(config, "alf_l").front_left();
SPEAKER(config, "alf_r").front_right();
- MCFG_DEVICE_ADD(SN1_TAG, SN76489, 1020484)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "alf_l", 0.50)
- MCFG_DEVICE_ADD(SN2_TAG, SN76489, 1020484)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "alf_l", 0.50)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "alf_r", 0.50)
- MCFG_DEVICE_ADD(SN3_TAG, SN76489, 1020484)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "alf_r", 0.50)
-MACHINE_CONFIG_END
+ SN76489(config, m_sn1, 1020484);
+ m_sn1->add_route(ALL_OUTPUTS, "alf_l", 0.50);
+ SN76489(config, m_sn2, 1020484);
+ m_sn2->add_route(ALL_OUTPUTS, "alf_l", 0.50);
+ m_sn2->add_route(ALL_OUTPUTS, "alf_r", 0.50);
+ SN76489(config, m_sn3, 1020484);
+ m_sn3->add_route(ALL_OUTPUTS, "alf_r", 0.50);
+}
-MACHINE_CONFIG_START(a2bus_aesms_device::device_add_mconfig)
+void a2bus_aesms_device::device_add_mconfig(machine_config &config)
+{
SPEAKER(config, "alf_l").front_left();
SPEAKER(config, "alf_r").front_right();
- MCFG_DEVICE_ADD(SN1_TAG, SN76489, 1020484)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "alf_l", 0.50)
+ SN76489(config, m_sn1, 1020484);
+ m_sn1->add_route(ALL_OUTPUTS, "alf_l", 0.50);
- MCFG_DEVICE_ADD(SN2_TAG, SN76489, 1020484)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "alf_l", 0.50)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "alf_r", 0.50)
+ SN76489(config, m_sn2, 1020484);
+ m_sn2->add_route(ALL_OUTPUTS, "alf_l", 0.50);
+ m_sn2->add_route(ALL_OUTPUTS, "alf_r", 0.50);
- MCFG_DEVICE_ADD(SN3_TAG, SN76489, 1020484)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "alf_r", 0.50)
+ SN76489(config, m_sn3, 1020484);
+ m_sn3->add_route(ALL_OUTPUTS, "alf_r", 0.50);
- MCFG_DEVICE_ADD(SN4_TAG, SN76489, 1020484)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "alf_l", 0.50)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "alf_r", 0.50)
-MACHINE_CONFIG_END
+ SN76489(config, m_sn4, 1020484);
+ m_sn4->add_route(ALL_OUTPUTS, "alf_l", 0.50);
+ m_sn4->add_route(ALL_OUTPUTS, "alf_r", 0.50);
+}
//**************************************************************************
// LIVE DEVICE
diff --git a/src/devices/bus/a2bus/a2arcadebd.cpp b/src/devices/bus/a2bus/a2arcadebd.cpp
index 4bdd0a6911b..169971ea3e5 100644
--- a/src/devices/bus/a2bus/a2arcadebd.cpp
+++ b/src/devices/bus/a2bus/a2arcadebd.cpp
@@ -97,7 +97,7 @@ uint8_t a2bus_arcboard_device::read_c0nx(uint8_t offset)
return m_tms->register_read();
case 6:
- return m_ay->read_data();
+ return m_ay->data_r();
}
return 0xff;
@@ -118,11 +118,11 @@ void a2bus_arcboard_device::write_c0nx(uint8_t offset, uint8_t data)
break;
case 5:
- m_ay->write_address(data);
+ m_ay->address_w(data);
break;
case 6:
- m_ay->write_data(data);
+ m_ay->data_w(data);
break;
}
}
diff --git a/src/devices/bus/a2bus/a2bus.cpp b/src/devices/bus/a2bus/a2bus.cpp
index 84df6f73b35..7adcaf368a7 100644
--- a/src/devices/bus/a2bus/a2bus.cpp
+++ b/src/devices/bus/a2bus/a2bus.cpp
@@ -145,8 +145,11 @@ a2bus_device::a2bus_device(const machine_config &mconfig, const char *tag, devic
a2bus_device::a2bus_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock)
: device_t(mconfig, type, tag, owner, clock)
- , m_maincpu(*this, finder_base::DUMMY_TAG), m_maincpu_space(nullptr)
- , m_out_irq_cb(*this) , m_out_nmi_cb(*this), m_out_inh_cb(*this)
+ , m_maincpu_space(*this, finder_base::DUMMY_TAG, -1)
+ , m_out_irq_cb(*this)
+ , m_out_nmi_cb(*this)
+ , m_out_inh_cb(*this)
+ , m_out_dma_cb(*this)
, m_slot_irq_mask(0), m_slot_nmi_mask(0)
{
}
@@ -157,12 +160,11 @@ a2bus_device::a2bus_device(const machine_config &mconfig, device_type type, cons
void a2bus_device::device_resolve_objects()
{
- m_maincpu_space = &m_maincpu->space(AS_PROGRAM);
-
// resolve callbacks
m_out_irq_cb.resolve_safe();
m_out_nmi_cb.resolve_safe();
m_out_inh_cb.resolve_safe();
+ m_out_dma_cb.resolve_safe();
}
void a2bus_device::device_start()
@@ -239,27 +241,17 @@ void a2bus_device::set_nmi_line(int state, int slot)
}
}
-void a2bus_device::set_maincpu_halt(int state)
+void a2bus_device::set_dma_line(int state)
{
- m_maincpu->set_input_line(INPUT_LINE_HALT, state);
-}
-
-uint8_t a2bus_device::dma_r(address_space &space, uint16_t offset)
-{
- return m_maincpu_space->read_byte(offset);
-}
-
-void a2bus_device::dma_w(address_space &space, uint16_t offset, uint8_t data)
-{
- m_maincpu_space->write_byte(offset, data);
+ m_out_dma_cb(state);
}
-uint8_t a2bus_device::dma_nospace_r(uint16_t offset)
+uint8_t a2bus_device::dma_r(uint16_t offset)
{
return m_maincpu_space->read_byte(offset);
}
-void a2bus_device::dma_nospace_w(uint16_t offset, uint8_t data)
+void a2bus_device::dma_w(uint16_t offset, uint8_t data)
{
m_maincpu_space->write_byte(offset, data);
}
diff --git a/src/devices/bus/a2bus/a2bus.h b/src/devices/bus/a2bus/a2bus.h
index 862aeca3803..502ff72e854 100644
--- a/src/devices/bus/a2bus/a2bus.h
+++ b/src/devices/bus/a2bus/a2bus.h
@@ -25,22 +25,6 @@
#define INH_READ 0x01
#define INH_WRITE 0x02
-//**************************************************************************
-// INTERFACE CONFIGURATION MACROS
-//**************************************************************************
-
-#define MCFG_A2BUS_CPU(_cputag) \
- downcast<a2bus_device &>(*device).set_cputag(_cputag);
-
-#define MCFG_A2BUS_OUT_IRQ_CB(_devcb) \
- downcast<a2bus_device &>(*device).set_out_irq_callback(DEVCB_##_devcb);
-
-#define MCFG_A2BUS_OUT_NMI_CB(_devcb) \
- downcast<a2bus_device &>(*device).set_out_nmi_callback(DEVCB_##_devcb);
-
-#define MCFG_A2BUS_OUT_INH_CB(_devcb) \
- downcast<a2bus_device &>(*device).set_out_inh_callback(DEVCB_##_devcb);
-
// 7M = XTAL(14'318'181) / 2 or XTAL(28'636'363) / 4 (for IIgs)
static constexpr uint32_t A2BUS_7M_CLOCK = 7159090;
@@ -99,15 +83,11 @@ public:
a2bus_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
// inline configuration
- template <typename T> void set_cputag(T &&tag) { m_maincpu.set_tag(std::forward<T>(tag)); }
- template <class Object> devcb_base &set_out_irq_callback(Object &&cb) { return m_out_irq_cb.set_callback(std::forward<Object>(cb)); }
- template <class Object> devcb_base &set_out_nmi_callback(Object &&cb) { return m_out_nmi_cb.set_callback(std::forward<Object>(cb)); }
- template <class Object> devcb_base &set_out_inh_callback(Object &&cb) { return m_out_inh_cb.set_callback(std::forward<Object>(cb)); }
-
- // devcb3
+ template <typename T> void set_space(T &&tag, int spacenum) { m_maincpu_space.set_tag(std::forward<T>(tag), spacenum); }
auto irq_w() { return m_out_irq_cb.bind(); }
auto nmi_w() { return m_out_nmi_cb.bind(); }
auto inh_w() { return m_out_inh_cb.bind(); }
+ auto dma_w() { return m_out_dma_cb.bind(); }
void add_a2bus_card(int slot, device_a2bus_card_interface *card);
device_a2bus_card_interface *get_a2bus_card(int slot);
@@ -116,12 +96,10 @@ public:
void set_irq_line(int state, int slot);
void set_nmi_line(int state, int slot);
- void set_maincpu_halt(int state);
+ void set_dma_line(int state);
void recalc_inh(int slot);
- uint8_t dma_r(address_space &space, uint16_t offset);
- void dma_w(address_space &space, uint16_t offset, uint8_t data);
- uint8_t dma_nospace_r(uint16_t offset);
- void dma_nospace_w(uint16_t offset, uint8_t data);
+ uint8_t dma_r(uint16_t offset);
+ void dma_w(uint16_t offset, uint8_t data);
DECLARE_WRITE_LINE_MEMBER( irq_w );
DECLARE_WRITE_LINE_MEMBER( nmi_w );
@@ -135,12 +113,12 @@ protected:
virtual void device_reset() override;
// internal state
- required_device<cpu_device> m_maincpu;
- address_space *m_maincpu_space;
+ required_address_space m_maincpu_space;
devcb_write_line m_out_irq_cb;
devcb_write_line m_out_nmi_cb;
devcb_write8 m_out_inh_cb;
+ devcb_write_line m_out_dma_cb;
device_a2bus_card_interface *m_device_list[8];
@@ -181,14 +159,8 @@ public:
void set_a2bus(a2bus_device *a2bus, const char *slottag) { m_a2bus = a2bus; m_a2bus_slottag = slottag; }
template <typename T> void set_onboard(T &&a2bus) { m_a2bus_finder.set_tag(std::forward<T>(a2bus)); m_a2bus_slottag = device().tag(); }
- // pass through the original address space if any for debugger protection
- // when debugging e.g. coprocessor cards (Z80 SoftCard etc).
- uint8_t slot_dma_read(address_space &space, uint16_t offset) { return m_a2bus->dma_r(space, offset); }
- void slot_dma_write(address_space &space, uint16_t offset, uint8_t data) { m_a2bus->dma_w(space, offset, data); }
-
- // these versions forego that protection for when the DMA isn't coming from a debuggable CPU device
- uint8_t slot_dma_read_no_space(uint16_t offset) { return m_a2bus->dma_nospace_r(offset); }
- void slot_dma_write_no_space(uint16_t offset, uint8_t data) { m_a2bus->dma_nospace_w(offset, data); }
+ uint8_t slot_dma_read(uint16_t offset) { return m_a2bus->dma_r(offset); }
+ void slot_dma_write(uint16_t offset, uint8_t data) { m_a2bus->dma_w(offset, data); }
protected:
uint32_t get_slotromspace() { return 0xc000 | (m_slot<<8); } // return Cn00 address for this slot
@@ -199,7 +171,8 @@ protected:
void raise_slot_nmi() { m_a2bus->set_nmi_line(ASSERT_LINE, m_slot); }
void lower_slot_nmi() { m_a2bus->set_nmi_line(CLEAR_LINE, m_slot); }
void recalc_slot_inh() { m_a2bus->recalc_inh(m_slot); }
- void set_maincpu_halt(int state) { m_a2bus->set_maincpu_halt(state); }
+ void raise_slot_dma() { m_a2bus->set_dma_line(ASSERT_LINE); }
+ void lower_slot_dma() { m_a2bus->set_dma_line(CLEAR_LINE); }
device_a2bus_card_interface(const machine_config &mconfig, device_t &device);
diff --git a/src/devices/bus/a2bus/a2cffa.cpp b/src/devices/bus/a2bus/a2cffa.cpp
index 4eb5c7d2d98..41c5a1603f6 100644
--- a/src/devices/bus/a2bus/a2cffa.cpp
+++ b/src/devices/bus/a2bus/a2cffa.cpp
@@ -56,7 +56,7 @@ void a2bus_cffa2000_device::device_add_mconfig(machine_config &config)
ATA_INTERFACE(config, m_ata).options(ata_devices, "hdd", nullptr, false);
// not yet, the core explodes
-// MCFG_SOFTWARE_LIST_ADD("hdd_list", "apple2gs_hdd")
+// SOFTWARE_LIST(config, "hdd_list").set_original("apple2gs_hdd");
}
//-------------------------------------------------
diff --git a/src/devices/bus/a2bus/a2corvus.cpp b/src/devices/bus/a2bus/a2corvus.cpp
index 251485d3f28..3b0af093659 100644
--- a/src/devices/bus/a2bus/a2corvus.cpp
+++ b/src/devices/bus/a2bus/a2corvus.cpp
@@ -71,17 +71,14 @@ ROM_END
// device_add_mconfig - add device configuration
//-------------------------------------------------
-MACHINE_CONFIG_START(a2bus_corvus_device::device_add_mconfig)
- MCFG_DEVICE_ADD(CORVUS_HD_TAG, CORVUS_HDC, 0)
- MCFG_HARDDISK_ADD("harddisk1")
- MCFG_HARDDISK_INTERFACE("corvus_hdd")
- MCFG_HARDDISK_ADD("harddisk2")
- MCFG_HARDDISK_INTERFACE("corvus_hdd")
- MCFG_HARDDISK_ADD("harddisk3")
- MCFG_HARDDISK_INTERFACE("corvus_hdd")
- MCFG_HARDDISK_ADD("harddisk4")
- MCFG_HARDDISK_INTERFACE("corvus_hdd")
-MACHINE_CONFIG_END
+void a2bus_corvus_device::device_add_mconfig(machine_config &config)
+{
+ CORVUS_HDC(config, m_corvushd, 0);
+ HARDDISK(config, "harddisk1", "corvus_hdd");
+ HARDDISK(config, "harddisk2", "corvus_hdd");
+ HARDDISK(config, "harddisk3", "corvus_hdd");
+ HARDDISK(config, "harddisk4", "corvus_hdd");
+}
//-------------------------------------------------
// rom_region - device-specific ROM region
diff --git a/src/devices/bus/a2bus/a2diskii.cpp b/src/devices/bus/a2bus/a2diskii.cpp
index 9673abbb1da..20aff173549 100644
--- a/src/devices/bus/a2bus/a2diskii.cpp
+++ b/src/devices/bus/a2bus/a2diskii.cpp
@@ -61,15 +61,19 @@ ROM_END
// device_add_mconfig - add device configuration
//-------------------------------------------------
-MACHINE_CONFIG_START(a2bus_floppy_device::device_add_mconfig)
- MCFG_APPLEFDC_ADD(FDC_TAG, fdc_interface)
- MCFG_LEGACY_FLOPPY_APPLE_2_DRIVES_ADD(floppy_interface,15,16)
-MACHINE_CONFIG_END
-
-MACHINE_CONFIG_START(a2bus_iwmflop_device::device_add_mconfig)
- MCFG_IWM_ADD(FDC_TAG, fdc_interface)
- MCFG_LEGACY_FLOPPY_APPLE_2_DRIVES_ADD(floppy_interface,15,16)
-MACHINE_CONFIG_END
+void a2bus_floppy_device::device_add_mconfig(machine_config &config)
+{
+ APPLEFDC(config, m_fdc, &fdc_interface);
+ FLOPPY_APPLE(config, FLOPPY_0, &floppy_interface, 15, 16);
+ FLOPPY_APPLE(config, FLOPPY_1, &floppy_interface, 15, 16);
+}
+
+void a2bus_iwmflop_device::device_add_mconfig(machine_config &config)
+{
+ IWM(config, m_fdc, &fdc_interface);
+ FLOPPY_APPLE(config, FLOPPY_0, &floppy_interface, 15, 16);
+ FLOPPY_APPLE(config, FLOPPY_1, &floppy_interface, 15, 16);
+}
//-------------------------------------------------
// rom_region - device-specific ROM region
diff --git a/src/devices/bus/a2bus/a2diskiing.cpp b/src/devices/bus/a2bus/a2diskiing.cpp
index 28194db0421..1846b447a04 100644
--- a/src/devices/bus/a2bus/a2diskiing.cpp
+++ b/src/devices/bus/a2bus/a2diskiing.cpp
@@ -54,17 +54,19 @@ FLOPPY_FORMATS_END
// device_add_mconfig - add device configuration
//-------------------------------------------------
-MACHINE_CONFIG_START(diskiing_device::device_add_mconfig)
- MCFG_DEVICE_ADD(WOZFDC_TAG, DISKII_FDC, 1021800*2)
- MCFG_FLOPPY_DRIVE_ADD("0", a2_floppies, "525", diskiing_device::floppy_formats)
- MCFG_FLOPPY_DRIVE_ADD("1", a2_floppies, "525", diskiing_device::floppy_formats)
-MACHINE_CONFIG_END
-
-MACHINE_CONFIG_START(a2bus_diskiing13_device::device_add_mconfig)
- MCFG_DEVICE_ADD(WOZFDC_TAG, DISKII_FDC, 1021800*2)
- MCFG_FLOPPY_DRIVE_ADD("0", a2_floppies, "525", a2bus_diskiing13_device::floppy_formats)
- MCFG_FLOPPY_DRIVE_ADD("1", a2_floppies, "525", a2bus_diskiing13_device::floppy_formats)
-MACHINE_CONFIG_END
+void diskiing_device::device_add_mconfig(machine_config &config)
+{
+ DISKII_FDC(config, m_wozfdc, 1021800*2);
+ for (auto &floppy : m_floppy)
+ FLOPPY_CONNECTOR(config, floppy, a2_floppies, "525", diskiing_device::floppy_formats);
+}
+
+void a2bus_diskiing13_device::device_add_mconfig(machine_config &config)
+{
+ DISKII_FDC(config, m_wozfdc, 1021800*2);
+ for (auto &floppy : m_floppy)
+ FLOPPY_CONNECTOR(config, floppy, a2_floppies, "525", a2bus_diskiing13_device::floppy_formats);
+}
//-------------------------------------------------
// rom_region - device-specific ROM region
@@ -88,8 +90,7 @@ diskiing_device::diskiing_device(const machine_config &mconfig, device_type type
device_t(mconfig, type, tag, owner, clock),
device_a2bus_card_interface(mconfig, *this),
m_wozfdc(*this, WOZFDC_TAG),
- floppy0(*this, "0"),
- floppy1(*this, "1"),
+ m_floppy(*this, "%u", 0U),
m_rom(nullptr)
{
}
@@ -115,7 +116,7 @@ void diskiing_device::device_start()
void diskiing_device::device_reset()
{
- m_wozfdc->set_floppies(floppy0, floppy1);
+ m_wozfdc->set_floppies(m_floppy[0], m_floppy[1]);
}
/*-------------------------------------------------
diff --git a/src/devices/bus/a2bus/a2diskiing.h b/src/devices/bus/a2bus/a2diskiing.h
index e6476cb29a7..c30d49ebf0d 100644
--- a/src/devices/bus/a2bus/a2diskiing.h
+++ b/src/devices/bus/a2bus/a2diskiing.h
@@ -42,11 +42,10 @@ protected:
virtual void write_c0nx(uint8_t offset, uint8_t data) override;
virtual uint8_t read_cnxx(uint8_t offset) override;
-private:
required_device<diskii_fdc_device> m_wozfdc;
- required_device<floppy_connector> floppy0;
- required_device<floppy_connector> floppy1;
+ required_device_array<floppy_connector, 2> m_floppy;
+private:
const uint8_t *m_rom;
DECLARE_FLOPPY_FORMATS( floppy_formats );
diff --git a/src/devices/bus/a2bus/a2dx1.cpp b/src/devices/bus/a2bus/a2dx1.cpp
index 5efd112a779..9c1a0733405 100644
--- a/src/devices/bus/a2bus/a2dx1.cpp
+++ b/src/devices/bus/a2bus/a2dx1.cpp
@@ -31,14 +31,14 @@ DEFINE_DEVICE_TYPE(A2BUS_DX1, a2bus_dx1_device, "a2dx1", "Decillonix DX-1")
// device_add_mconfig - add device configuration
//-------------------------------------------------
-MACHINE_CONFIG_START(a2bus_dx1_device::device_add_mconfig)
+void a2bus_dx1_device::device_add_mconfig(machine_config &config)
+{
SPEAKER(config, "speaker").front_center();
- MCFG_DEVICE_ADD("dac", DAC_8BIT_R2R, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 0.5) // unknown DAC
- MCFG_DEVICE_ADD("dacvol", DAC_8BIT_R2R, 0) // unknown DAC
- MCFG_SOUND_ROUTE(0, "dac", 1.0, DAC_VREF_POS_INPUT) MCFG_SOUND_ROUTE(0, "dac", -1.0, DAC_VREF_NEG_INPUT)
- MCFG_DEVICE_ADD("vref", VOLTAGE_REGULATOR, 0) MCFG_VOLTAGE_REGULATOR_OUTPUT(5.0)
- MCFG_SOUND_ROUTE(0, "dacvol", 1.0, DAC_VREF_POS_INPUT)
-MACHINE_CONFIG_END
+ DAC_8BIT_R2R(config, m_dac, 0).add_route(ALL_OUTPUTS, "speaker", 0.5); // unknown DAC
+ DAC_8BIT_R2R(config, m_dacvol, 0).add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT).add_route(0, "dac", -1.0, DAC_VREF_NEG_INPUT); // unknown DAC
+ voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref"));
+ vref.add_route(0, "dacvol", 1.0, DAC_VREF_POS_INPUT);
+}
//**************************************************************************
// LIVE DEVICE
diff --git a/src/devices/bus/a2bus/a2eauxslot.cpp b/src/devices/bus/a2bus/a2eauxslot.cpp
index 6885d528128..5fab40ba9ae 100644
--- a/src/devices/bus/a2bus/a2eauxslot.cpp
+++ b/src/devices/bus/a2bus/a2eauxslot.cpp
@@ -33,20 +33,16 @@ a2eauxslot_slot_device::a2eauxslot_slot_device(const machine_config &mconfig, co
a2eauxslot_slot_device::a2eauxslot_slot_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock)
: device_t(mconfig, type, tag, owner, clock)
, device_slot_interface(mconfig, *this)
- , m_a2eauxslot_tag(nullptr)
- , m_a2eauxslot_slottag(nullptr)
+ , m_a2eauxslot(*this, finder_base::DUMMY_TAG)
{
}
-//-------------------------------------------------
-// device_start - device-specific startup
-//-------------------------------------------------
-
-void a2eauxslot_slot_device::device_start()
+void a2eauxslot_slot_device::device_resolve_objects()
{
device_a2eauxslot_card_interface *dev = dynamic_cast<device_a2eauxslot_card_interface *>(get_card_device());
- if (dev) dev->set_a2eauxslot_tag(m_a2eauxslot_tag, m_a2eauxslot_slottag);
+ if (dev)
+ dev->set_a2eauxslot_device(m_a2eauxslot.target());
}
//**************************************************************************
@@ -70,34 +66,31 @@ a2eauxslot_device::a2eauxslot_device(const machine_config &mconfig, const char *
a2eauxslot_device::a2eauxslot_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock)
: device_t(mconfig, type, tag, owner, clock)
- , m_maincpu(nullptr)
+ , m_space(*this, finder_base::DUMMY_TAG, -1)
, m_out_irq_cb(*this)
, m_out_nmi_cb(*this)
, m_device(nullptr)
- , m_cputag(nullptr)
{
}
+
//-------------------------------------------------
-// device_start - device-specific startup
+// device_resolve_objects - resolve objects that
+// may be needed for other devices to set
+// initial conditions at start time
//-------------------------------------------------
-void a2eauxslot_device::device_start()
+void a2eauxslot_device::device_resolve_objects()
{
- m_maincpu = machine().device<cpu_device>(m_cputag);
-
// resolve callbacks
m_out_irq_cb.resolve_safe();
m_out_nmi_cb.resolve_safe();
-
- // clear slot
- m_device = nullptr;
}
//-------------------------------------------------
-// device_reset - device-specific reset
+// device_start - device-specific startup
//-------------------------------------------------
-void a2eauxslot_device::device_reset()
+void a2eauxslot_device::device_start()
{
}
@@ -141,7 +134,7 @@ WRITE_LINE_MEMBER( a2eauxslot_device::nmi_w ) { m_out_nmi_cb(state); }
device_a2eauxslot_card_interface::device_a2eauxslot_card_interface(const machine_config &mconfig, device_t &device)
: device_slot_card_interface(mconfig, device),
m_a2eauxslot(nullptr),
- m_a2eauxslot_tag(nullptr), m_a2eauxslot_slottag(nullptr), m_slot(0), m_next(nullptr)
+ m_slot(0), m_next(nullptr)
{
}
@@ -154,8 +147,8 @@ device_a2eauxslot_card_interface::~device_a2eauxslot_card_interface()
{
}
-void device_a2eauxslot_card_interface::set_a2eauxslot_device()
+void device_a2eauxslot_card_interface::set_a2eauxslot_device(a2eauxslot_device *a2eauxslot)
{
- m_a2eauxslot = dynamic_cast<a2eauxslot_device *>(device().machine().device(m_a2eauxslot_tag));
+ m_a2eauxslot = a2eauxslot;
m_a2eauxslot->add_a2eauxslot_card(this);
}
diff --git a/src/devices/bus/a2bus/a2eauxslot.h b/src/devices/bus/a2bus/a2eauxslot.h
index 1da89b18d7a..4351bc6112a 100644
--- a/src/devices/bus/a2bus/a2eauxslot.h
+++ b/src/devices/bus/a2bus/a2eauxslot.h
@@ -15,25 +15,6 @@
#include "a2bus.h"
-//**************************************************************************
-// INTERFACE CONFIGURATION MACROS
-//**************************************************************************
-
-#define MCFG_A2EAUXSLOT_CPU(_cputag) \
- downcast<a2eauxslot_device &>(*device).set_cputag(_cputag);
-
-#define MCFG_A2EAUXSLOT_OUT_IRQ_CB(_devcb) \
- downcast<a2eauxslot_device &>(*device).set_out_irq_callback(DEVCB_##_devcb);
-
-#define MCFG_A2EAUXSLOT_OUT_NMI_CB(_devcb) \
- downcast<a2eauxslot_device &>(*device).set_out_nmi_callback(DEVCB_##_devcb);
-
-#define MCFG_A2EAUXSLOT_SLOT_ADD(_nbtag, _tag, _slot_intf, _def_slot) \
- MCFG_DEVICE_ADD(_tag, A2EAUXSLOT_SLOT, 0) \
- MCFG_DEVICE_SLOT_INTERFACE(_slot_intf, _def_slot, false) \
- downcast<a2eauxslot_slot_device &>(*device).set_a2eauxslot_slot(_nbtag, _tag);
-#define MCFG_A2EAUXSLOT_SLOT_REMOVE(_tag) \
- MCFG_DEVICE_REMOVE(_tag)
//**************************************************************************
// TYPE DEFINITIONS
@@ -46,19 +27,28 @@ class a2eauxslot_slot_device : public device_t,
{
public:
// construction/destruction
- a2eauxslot_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+ template <typename T, typename U>
+ a2eauxslot_slot_device(machine_config const &mconfig, char const *tag, device_t *owner, T &&slottag, U &&opts, char const *dflt)
+ : a2eauxslot_slot_device(mconfig, tag, owner, 0)
+ {
+ option_reset();
+ opts(*this);
+ set_default_option(dflt);
+ set_fixed(false);
+ m_a2eauxslot.set_tag(std::forward<T>(slottag));
+ }
+
+ a2eauxslot_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock = 0);
// device-level overrides
- virtual void device_start() override;
-
- // inline configuration
- void set_a2eauxslot_slot(const char *tag, const char *slottag) { m_a2eauxslot_tag = tag; m_a2eauxslot_slottag = slottag; }
+ virtual void device_resolve_objects() override;
+ virtual void device_start() override { }
protected:
a2eauxslot_slot_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock);
// configuration
- const char *m_a2eauxslot_tag, *m_a2eauxslot_slottag;
+ required_device<a2eauxslot_device> m_a2eauxslot;
};
// device type definition
@@ -75,9 +65,9 @@ public:
a2eauxslot_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
// inline configuration
- void set_cputag(const char *tag) { m_cputag = tag; }
- template <class Object> devcb_base &set_out_irq_callback(Object &&cb) { return m_out_irq_cb.set_callback(std::forward<Object>(cb)); }
- template <class Object> devcb_base &set_out_nmi_callback(Object &&cb) { return m_out_nmi_cb.set_callback(std::forward<Object>(cb)); }
+ template <typename T> void set_space(T &&tag, int spacenum) { m_space.set_tag(std::forward<T>(tag), spacenum); }
+ auto out_irq_callback() { return m_out_irq_cb.bind(); }
+ auto out_nmi_callback() { return m_out_nmi_cb.bind(); }
void add_a2eauxslot_card(device_a2eauxslot_card_interface *card);
device_a2eauxslot_card_interface *get_a2eauxslot_card();
@@ -92,17 +82,16 @@ protected:
a2eauxslot_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock);
// device-level overrides
+ virtual void device_resolve_objects() override;
virtual void device_start() override;
- virtual void device_reset() override;
// internal state
- cpu_device *m_maincpu;
+ required_address_space m_space;
devcb_write_line m_out_irq_cb;
devcb_write_line m_out_nmi_cb;
device_a2eauxslot_card_interface *m_device;
- const char *m_cputag;
};
@@ -121,28 +110,24 @@ public:
virtual uint8_t read_auxram(uint16_t offset) { printf("a2eauxslot: unhandled auxram read @ %04x\n", offset); return 0xff; }
virtual void write_auxram(uint16_t offset, uint8_t data) { printf("a2eauxslot: unhandled auxram write %02x @ %04x\n", data, offset); }
- virtual void write_c07x(address_space &space, uint8_t offset, uint8_t data) {}
+ virtual void write_c07x(uint8_t offset, uint8_t data) {}
virtual uint8_t *get_vram_ptr() = 0;
virtual uint8_t *get_auxbank_ptr() = 0;
virtual bool allow_dhr() { return true; }
device_a2eauxslot_card_interface *next() const { return m_next; }
- void set_a2eauxslot_device();
+ void set_a2eauxslot_device(a2eauxslot_device *a2eauxslot);
void raise_slot_irq() { m_a2eauxslot->set_irq_line(ASSERT_LINE); }
void lower_slot_irq() { m_a2eauxslot->set_irq_line(CLEAR_LINE); }
void raise_slot_nmi() { m_a2eauxslot->set_nmi_line(ASSERT_LINE); }
void lower_slot_nmi() { m_a2eauxslot->set_nmi_line(CLEAR_LINE); }
- // inline configuration
- void set_a2eauxslot_tag(const char *tag, const char *slottag) { m_a2eauxslot_tag = tag; m_a2eauxslot_slottag = slottag; }
-
protected:
device_a2eauxslot_card_interface(const machine_config &mconfig, device_t &device);
a2eauxslot_device *m_a2eauxslot;
- const char *m_a2eauxslot_tag, *m_a2eauxslot_slottag;
int m_slot;
device_a2eauxslot_card_interface *m_next;
};
diff --git a/src/devices/bus/a2bus/a2eext80col.cpp b/src/devices/bus/a2bus/a2eext80col.cpp
index b98d31c0d5c..2ddb4a0b476 100644
--- a/src/devices/bus/a2bus/a2eext80col.cpp
+++ b/src/devices/bus/a2bus/a2eext80col.cpp
@@ -43,7 +43,6 @@ a2eaux_ext80col_device::a2eaux_ext80col_device(const machine_config &mconfig, de
void a2eaux_ext80col_device::device_start()
{
- set_a2eauxslot_device();
memset(m_ram, 0, sizeof(m_ram));
save_item(NAME(m_ram));
}
diff --git a/src/devices/bus/a2bus/a2eramworks3.cpp b/src/devices/bus/a2bus/a2eramworks3.cpp
index e82225cbd27..46ada4066a1 100644
--- a/src/devices/bus/a2bus/a2eramworks3.cpp
+++ b/src/devices/bus/a2bus/a2eramworks3.cpp
@@ -45,7 +45,6 @@ a2eaux_ramworks3_device::a2eaux_ramworks3_device(const machine_config &mconfig,
void a2eaux_ramworks3_device::device_start()
{
- set_a2eauxslot_device();
save_item(NAME(m_ram));
save_item(NAME(m_bank));
}
@@ -88,7 +87,7 @@ uint8_t *a2eaux_ramworks3_device::get_auxbank_ptr()
However, the software will recognize and correctly use a configuration in which
all of banks 00-7F are populated for a total of 8 megabytes. So that's what we do.
*/
-void a2eaux_ramworks3_device::write_c07x(address_space &space, uint8_t offset, uint8_t data)
+void a2eaux_ramworks3_device::write_c07x(uint8_t offset, uint8_t data)
{
// write to C073?
if (offset == 3)
diff --git a/src/devices/bus/a2bus/a2eramworks3.h b/src/devices/bus/a2bus/a2eramworks3.h
index f2b327ebfab..d47d88c37d9 100644
--- a/src/devices/bus/a2bus/a2eramworks3.h
+++ b/src/devices/bus/a2bus/a2eramworks3.h
@@ -36,7 +36,7 @@ protected:
virtual uint8_t *get_vram_ptr() override;
virtual uint8_t *get_auxbank_ptr() override;
virtual bool allow_dhr() override { return true; }
- virtual void write_c07x(address_space &space, uint8_t offset, uint8_t data) override;
+ virtual void write_c07x(uint8_t offset, uint8_t data) override;
private:
uint8_t m_ram[8*1024*1024];
diff --git a/src/devices/bus/a2bus/a2estd80col.cpp b/src/devices/bus/a2bus/a2estd80col.cpp
index e5a9741e7a0..8eecf223c48 100644
--- a/src/devices/bus/a2bus/a2estd80col.cpp
+++ b/src/devices/bus/a2bus/a2estd80col.cpp
@@ -43,7 +43,6 @@ a2eaux_std80col_device::a2eaux_std80col_device(const machine_config &mconfig, de
void a2eaux_std80col_device::device_start()
{
- set_a2eauxslot_device();
save_item(NAME(m_ram));
}
diff --git a/src/devices/bus/a2bus/a2hsscsi.cpp b/src/devices/bus/a2bus/a2hsscsi.cpp
index 6be63715d88..ec4eea8080a 100644
--- a/src/devices/bus/a2bus/a2hsscsi.cpp
+++ b/src/devices/bus/a2bus/a2hsscsi.cpp
@@ -57,14 +57,6 @@ DEFINE_DEVICE_TYPE(A2BUS_HSSCSI, a2bus_hsscsi_device, "a2hsscsi", "Apple II High
#define SCSI_BUS_TAG "scsibus"
#define SCSI_5380_TAG "scsibus:7:ncr5380"
-void a2bus_hsscsi_device::ncr5380(device_t *device)
-{
- devcb_base *devcb;
- (void)devcb;
- MCFG_DEVICE_CLOCK(10000000)
- MCFG_NCR5380N_DRQ_HANDLER(WRITELINE("^^", a2bus_hsscsi_device, drq_w))
-}
-
static void hsscsi_devices(device_slot_interface &device)
{
device.option_add("cdrom", NSCSI_CDROM);
@@ -85,18 +77,21 @@ ROM_END
// device_add_mconfig - add device configuration
//-------------------------------------------------
-MACHINE_CONFIG_START(a2bus_hsscsi_device::device_add_mconfig)
- MCFG_NSCSI_BUS_ADD(SCSI_BUS_TAG)
- MCFG_NSCSI_ADD("scsibus:0", hsscsi_devices, nullptr, false)
- MCFG_NSCSI_ADD("scsibus:1", hsscsi_devices, nullptr, false)
- MCFG_NSCSI_ADD("scsibus:2", hsscsi_devices, nullptr, false)
- MCFG_NSCSI_ADD("scsibus:3", hsscsi_devices, nullptr, false)
- MCFG_NSCSI_ADD("scsibus:4", hsscsi_devices, nullptr, false)
- MCFG_NSCSI_ADD("scsibus:5", hsscsi_devices, nullptr, false)
- MCFG_NSCSI_ADD("scsibus:6", hsscsi_devices, "harddisk", false)
- MCFG_NSCSI_ADD("scsibus:7", hsscsi_devices, "ncr5380", true)
- MCFG_SLOT_OPTION_MACHINE_CONFIG("ncr5380", ncr5380)
-MACHINE_CONFIG_END
+void a2bus_hsscsi_device::device_add_mconfig(machine_config &config)
+{
+ NSCSI_BUS(config, m_scsibus);
+ NSCSI_CONNECTOR(config, "scsibus:0", hsscsi_devices, nullptr, false);
+ NSCSI_CONNECTOR(config, "scsibus:1", hsscsi_devices, nullptr, false);
+ NSCSI_CONNECTOR(config, "scsibus:2", hsscsi_devices, nullptr, false);
+ NSCSI_CONNECTOR(config, "scsibus:3", hsscsi_devices, nullptr, false);
+ NSCSI_CONNECTOR(config, "scsibus:4", hsscsi_devices, nullptr, false);
+ NSCSI_CONNECTOR(config, "scsibus:5", hsscsi_devices, nullptr, false);
+ NSCSI_CONNECTOR(config, "scsibus:6", hsscsi_devices, "harddisk", false);
+ NSCSI_CONNECTOR(config, "scsibus:7", hsscsi_devices, "ncr5380", true).set_option_machine_config("ncr5380", [this](device_t *device) {
+ device->set_clock(10000000);
+ downcast<ncr5380n_device &>(*device).drq_handler().set(*this, FUNC(a2bus_hsscsi_device::drq_w));
+ });
+}
//-------------------------------------------------
// rom_region - device-specific ROM region
@@ -168,7 +163,7 @@ uint8_t a2bus_hsscsi_device::read_c0nx(uint8_t offset)
case 6:
case 7:
// logerror("Read 5380 @ %x\n", offset);
- return m_ncr5380->read(machine().dummy_space(), offset);
+ return m_ncr5380->read(offset);
case 0xc:
return 0x00; // indicate watchdog?
@@ -205,7 +200,7 @@ void a2bus_hsscsi_device::write_c0nx(uint8_t offset, uint8_t data)
case 6:
case 7:
// logerror("%02x to 5380 reg %x\n", data, offset);
- m_ncr5380->write(machine().dummy_space(), offset, data);
+ m_ncr5380->write(offset, data);
break;
#if 0
case 8: // DMA address low
diff --git a/src/devices/bus/a2bus/a2hsscsi.h b/src/devices/bus/a2bus/a2hsscsi.h
index c3534ede770..da96b3e8776 100644
--- a/src/devices/bus/a2bus/a2hsscsi.h
+++ b/src/devices/bus/a2bus/a2hsscsi.h
@@ -30,8 +30,6 @@ public:
DECLARE_WRITE_LINE_MEMBER( drq_w );
- static void ncr5380(device_t *device);
-
protected:
a2bus_hsscsi_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock);
diff --git a/src/devices/bus/a2bus/a2mcms.cpp b/src/devices/bus/a2bus/a2mcms.cpp
index 1442d7d68bc..7e2cab57b6b 100644
--- a/src/devices/bus/a2bus/a2mcms.cpp
+++ b/src/devices/bus/a2bus/a2mcms.cpp
@@ -38,8 +38,6 @@ DEFINE_DEVICE_TYPE(A2BUS_MCMS2, a2bus_mcms2_device, "a2mcms2", "Mountain Compute
#define ENGINE_TAG "engine"
-#define MCFG_MCMS_IRQ_CALLBACK(_cb) \
- downcast<mcms_device &>(*device).set_irq_cb(DEVCB_##_cb);
/***************************************************************************
FUNCTION PROTOTYPES
@@ -49,16 +47,16 @@ DEFINE_DEVICE_TYPE(A2BUS_MCMS2, a2bus_mcms2_device, "a2mcms2", "Mountain Compute
// device_add_mconfig - add device configuration
//-------------------------------------------------
-MACHINE_CONFIG_START(a2bus_mcms1_device::device_add_mconfig)
+void a2bus_mcms1_device::device_add_mconfig(machine_config &config)
+{
SPEAKER(config, "mcms_l").front_left();
SPEAKER(config, "mcms_r").front_right();
- MCFG_DEVICE_ADD(ENGINE_TAG, MCMS, 1000000)
- MCFG_MCMS_IRQ_CALLBACK(WRITELINE(*this, a2bus_mcms1_device, irq_w))
-
- MCFG_SOUND_ROUTE(0, "mcms_l", 1.0)
- MCFG_SOUND_ROUTE(1, "mcms_r", 1.0)
-MACHINE_CONFIG_END
+ MCMS(config, m_mcms, 1000000);
+ m_mcms->irq_cb().set(FUNC(a2bus_mcms1_device::irq_w));
+ m_mcms->add_route(0, "mcms_l", 1.0);
+ m_mcms->add_route(1, "mcms_r", 1.0);
+}
//**************************************************************************
// LIVE DEVICE - Card 1
@@ -277,7 +275,7 @@ void mcms_device::sound_stream_update(sound_stream &stream, stream_sample_t **in
wptr = (m_table[v]<<8) | (m_acc[v]>>8);
m_rand = (m_acc[v]>>8) & 0x1f;
- sample = (m_pBusDevice->slot_dma_read_no_space(wptr) ^ 0x80);
+ sample = (m_pBusDevice->slot_dma_read(wptr) ^ 0x80);
if (v & 1)
{
mixL += sample * m_vols[v];
diff --git a/src/devices/bus/a2bus/a2mcms.h b/src/devices/bus/a2bus/a2mcms.h
index f1026d97afd..9a183a9313d 100644
--- a/src/devices/bus/a2bus/a2mcms.h
+++ b/src/devices/bus/a2bus/a2mcms.h
@@ -33,7 +33,7 @@ public:
void set_bus_device(a2bus_mcms1_device *pDev) { m_pBusDevice = pDev; }
- template<class Object> devcb_base &set_irq_cb(Object &&wr) { return m_write_irq.set_callback(std::forward<Object>(wr)); }
+ auto irq_cb() { return m_write_irq.bind(); }
devcb_write_line m_write_irq;
protected:
diff --git a/src/devices/bus/a2bus/a2memexp.cpp b/src/devices/bus/a2bus/a2memexp.cpp
index a544713abb7..6b088a1ea12 100644
--- a/src/devices/bus/a2bus/a2memexp.cpp
+++ b/src/devices/bus/a2bus/a2memexp.cpp
@@ -46,8 +46,9 @@ ROM_END
// device_add_mconfig - add device configuration
//-------------------------------------------------
-MACHINE_CONFIG_START(a2bus_memexp_device::device_add_mconfig)
-MACHINE_CONFIG_END
+void a2bus_memexp_device::device_add_mconfig(machine_config &config)
+{
+}
//-------------------------------------------------
// rom_region - device-specific ROM region
diff --git a/src/devices/bus/a2bus/a2midi.cpp b/src/devices/bus/a2bus/a2midi.cpp
index d73aaf82bbc..dfd6ce71694 100644
--- a/src/devices/bus/a2bus/a2midi.cpp
+++ b/src/devices/bus/a2bus/a2midi.cpp
@@ -32,7 +32,8 @@ DEFINE_DEVICE_TYPE(A2BUS_MIDI, a2bus_midi_device, "a2midi", "6850 MIDI card")
// device_add_mconfig - add device configuration
//-------------------------------------------------
-MACHINE_CONFIG_START(a2bus_midi_device::device_add_mconfig)
+void a2bus_midi_device::device_add_mconfig(machine_config &config)
+{
PTM6840(config, m_ptm, 1021800);
m_ptm->set_external_clocks(1021800.0f, 1021800.0f, 1021800.0f);
m_ptm->irq_callback().set(FUNC(a2bus_midi_device::ptm_irq_w));
@@ -41,14 +42,13 @@ MACHINE_CONFIG_START(a2bus_midi_device::device_add_mconfig)
m_acia->txd_handler().set("mdout", FUNC(midi_port_device::write_txd));
m_acia->irq_handler().set(FUNC(a2bus_midi_device::acia_irq_w));
- MCFG_MIDI_PORT_ADD("mdin", midiin_slot, "midiin")
- MCFG_MIDI_RX_HANDLER(WRITELINE(MIDI_ACIA_TAG, acia6850_device, write_rxd))
+ MIDI_PORT(config, "mdin", midiin_slot, "midiin").rxd_handler().set(m_acia, FUNC(acia6850_device::write_rxd));
- MCFG_MIDI_PORT_ADD("mdout", midiout_slot, "midiout")
+ MIDI_PORT(config, "mdout", midiout_slot, "midiout");
- MCFG_DEVICE_ADD("acia_clock", CLOCK, 31250*16)
- MCFG_CLOCK_SIGNAL_HANDLER(WRITELINE(*this, a2bus_midi_device, write_acia_clock))
-MACHINE_CONFIG_END
+ clock_device &acia_clock(CLOCK(config, "acia_clock", 31250*16));
+ acia_clock.signal_handler().set(FUNC(a2bus_midi_device::write_acia_clock));
+}
//**************************************************************************
// LIVE DEVICE
@@ -91,11 +91,11 @@ uint8_t a2bus_midi_device::read_c0nx(uint8_t offset)
if (offset < 8)
{
- return m_ptm->read(machine().dummy_space(), offset & 7);
+ return m_ptm->read(offset & 7);
}
else if (offset == 8 || offset == 9)
{
- return m_acia->read(machine().dummy_space(), offset & 1);
+ return m_acia->read(offset & 1);
}
return 0;
@@ -109,11 +109,11 @@ void a2bus_midi_device::write_c0nx(uint8_t offset, uint8_t data)
{
if (offset < 8)
{
- m_ptm->write(machine().dummy_space(), offset & 7, data);
+ m_ptm->write(offset & 7, data);
}
else if (offset == 8 || offset == 9)
{
- m_acia->write(machine().dummy_space(), offset & 1, data);
+ m_acia->write(offset & 1, data);
}
}
diff --git a/src/devices/bus/a2bus/a2mockingboard.cpp b/src/devices/bus/a2bus/a2mockingboard.cpp
index c1d67bfa7d3..c4c45b6975b 100644
--- a/src/devices/bus/a2bus/a2mockingboard.cpp
+++ b/src/devices/bus/a2bus/a2mockingboard.cpp
@@ -238,7 +238,7 @@ WRITE8_MEMBER( a2bus_ayboard_device::via1_out_b )
{
if (!BIT(data, 2))
{
- m_ay1->reset_w(space, 0, 0);
+ m_ay1->reset_w();
}
else
{
@@ -248,15 +248,15 @@ WRITE8_MEMBER( a2bus_ayboard_device::via1_out_b )
break;
case 1: // BDIR=0, BC1=1 (read PSG)
- m_porta1 = m_ay1->read_data();
+ m_porta1 = m_ay1->data_r();
break;
case 2: // BDIR=1, BC1=0 (write PSG)
- m_ay1->write_data(m_porta1);
+ m_ay1->data_w(m_porta1);
break;
case 3: // BDIR=1, BC1=1 (latch)
- m_ay1->write_address(m_porta1);
+ m_ay1->address_w(m_porta1);
break;
}
}
@@ -266,10 +266,10 @@ WRITE8_MEMBER( a2bus_phasor_device::via1_out_b )
{
if (!(data & 4))
{
- m_ay1->reset_w(space, 0, 0);
+ m_ay1->reset_w();
if (m_native)
{
- m_ay2->reset_w(space, 0, 0);
+ m_ay2->reset_w();
}
}
else
@@ -289,23 +289,23 @@ WRITE8_MEMBER( a2bus_phasor_device::via1_out_b )
case 1: // BDIR=0, BC1=1 (read PSG)
if (BIT(chip_sel, 0))
- m_porta1 = m_ay1->read_data();
+ m_porta1 = m_ay1->data_r();
if (BIT(chip_sel, 1))
- m_porta1 = m_ay2->read_data();
+ m_porta1 = m_ay2->data_r();
break;
case 2: // BDIR=1, BC1=0 (write PSG)
if (BIT(chip_sel, 0))
- m_ay1->write_data(m_porta1);
+ m_ay1->data_w(m_porta1);
if (BIT(chip_sel, 1))
- m_ay2->write_data(m_porta1);
+ m_ay2->data_w(m_porta1);
break;
case 3: // BDIR=1, BC1=1 (latch)
if (BIT(chip_sel, 0))
- m_ay1->write_address(m_porta1);
+ m_ay1->address_w(m_porta1);
if (BIT(chip_sel, 1))
- m_ay2->write_address(m_porta1);
+ m_ay2->address_w(m_porta1);
break;
}
}
@@ -320,7 +320,7 @@ WRITE8_MEMBER( a2bus_ayboard_device::via2_out_b )
{
if (!BIT(data, 2))
{
- m_ay2->reset_w(space, 0, 0);
+ m_ay2->reset_w();
}
else
{
@@ -330,15 +330,15 @@ WRITE8_MEMBER( a2bus_ayboard_device::via2_out_b )
break;
case 1: // BDIR=0, BC1=1 (read PSG)
- m_porta2 = m_ay2->read_data();
+ m_porta2 = m_ay2->data_r();
break;
case 2: // BDIR=1, BC1=0 (write PSG)
- m_ay2->write_data(m_porta2);
+ m_ay2->data_w(m_porta2);
break;
case 3: // BDIR=1, BC1=1 (latch)
- m_ay2->write_data(m_porta2);
+ m_ay2->data_w(m_porta2);
break;
}
}
@@ -350,12 +350,12 @@ WRITE8_MEMBER( a2bus_phasor_device::via2_out_b )
{
if (m_native)
{
- m_ay3->reset_w(space, 0, 0);
- m_ay4->reset_w(space, 0, 0);
+ m_ay3->reset_w();
+ m_ay4->reset_w();
}
else
{
- m_ay2->reset_w(space, 0, 0);
+ m_ay2->reset_w();
}
}
else
@@ -375,23 +375,23 @@ WRITE8_MEMBER( a2bus_phasor_device::via2_out_b )
case 1: // BDIR=0, BC1=1 (read PSG)
if (BIT(chip_sel, 0))
- m_porta2 = m_ay3->read_data();
+ m_porta2 = m_ay3->data_r();
if (BIT(chip_sel, 1))
- m_porta2 = m_ay4->read_data();
+ m_porta2 = m_ay4->data_r();
break;
case 2: // BDIR=1, BC1=0 (write PSG)
if (BIT(chip_sel, 0))
- m_ay3->write_data(m_porta2);
+ m_ay3->data_w(m_porta2);
if (BIT(chip_sel, 1))
- m_ay4->write_data(m_porta2);
+ m_ay4->data_w(m_porta2);
break;
case 3: // BDIR=1, BC1=1 (latch)
if (BIT(chip_sel, 0))
- m_ay3->write_address(m_porta2);
+ m_ay3->address_w(m_porta2);
if (BIT(chip_sel, 1))
- m_ay4->write_address(m_porta2);
+ m_ay4->address_w(m_porta2);
break;
}
}
diff --git a/src/devices/bus/a2bus/a2pic.cpp b/src/devices/bus/a2bus/a2pic.cpp
index 218d3ac6892..21c749eb50c 100644
--- a/src/devices/bus/a2bus/a2pic.cpp
+++ b/src/devices/bus/a2bus/a2pic.cpp
@@ -71,14 +71,16 @@ ioport_constructor a2bus_pic_device::device_input_ports() const
// device_add_mconfig - add device configuration
//-------------------------------------------------
-MACHINE_CONFIG_START(a2bus_pic_device::device_add_mconfig)
+void a2bus_pic_device::device_add_mconfig(machine_config &config)
+{
CENTRONICS(config, m_ctx, centronics_devices, "printer");
m_ctx->set_data_input_buffer(m_ctx_data_in);
m_ctx->ack_handler().set(FUNC(a2bus_pic_device::ack_w));
INPUT_BUFFER(config, m_ctx_data_in);
- MCFG_CENTRONICS_OUTPUT_LATCH_ADD("ctx_data_out", PIC_CENTRONICS_TAG)
-MACHINE_CONFIG_END
+ OUTPUT_LATCH(config, m_ctx_data_out);
+ m_ctx->set_output_latch(*m_ctx_data_out);
+}
//-------------------------------------------------
// rom_region - device-specific ROM region
diff --git a/src/devices/bus/a2bus/a2sam.cpp b/src/devices/bus/a2bus/a2sam.cpp
index 21ea8d1fdca..16b8b5affe8 100644
--- a/src/devices/bus/a2bus/a2sam.cpp
+++ b/src/devices/bus/a2bus/a2sam.cpp
@@ -31,12 +31,14 @@ DEFINE_DEVICE_TYPE(A2BUS_SAM, a2bus_sam_device, "a2sam", "Don't Ask Software S.A
// device_add_mconfig - add device configuration
//-------------------------------------------------
-MACHINE_CONFIG_START(a2bus_sam_device::device_add_mconfig)
+void a2bus_sam_device::device_add_mconfig(machine_config &config)
+{
SPEAKER(config, "speaker").front_center();
- MCFG_DEVICE_ADD("dac", DAC_8BIT_R2R, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 0.5) // unknown DAC
- MCFG_DEVICE_ADD("vref", VOLTAGE_REGULATOR, 0) MCFG_VOLTAGE_REGULATOR_OUTPUT(5.0)
- MCFG_SOUND_ROUTE(0, "dac", 1.0, DAC_VREF_POS_INPUT) MCFG_SOUND_ROUTE(0, "dac", -1.0, DAC_VREF_NEG_INPUT)
-MACHINE_CONFIG_END
+ DAC_8BIT_R2R(config, m_dac, 0).add_route(ALL_OUTPUTS, "speaker", 0.5); // unknown DAC
+ voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref"));
+ vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT);
+ vref.add_route(0, "dac", -1.0, DAC_VREF_NEG_INPUT);
+}
//**************************************************************************
// LIVE DEVICE
diff --git a/src/devices/bus/a2bus/a2scsi.cpp b/src/devices/bus/a2bus/a2scsi.cpp
index ef3422e9783..014414e7e98 100644
--- a/src/devices/bus/a2bus/a2scsi.cpp
+++ b/src/devices/bus/a2bus/a2scsi.cpp
@@ -50,14 +50,6 @@ DEFINE_DEVICE_TYPE(A2BUS_SCSI, a2bus_scsi_device, "a2scsi", "Apple II SCSI Card"
#define SCSI_BUS_TAG "scsibus"
#define SCSI_5380_TAG "scsibus:7:ncr5380"
-void a2bus_scsi_device::ncr5380(device_t *device)
-{
- devcb_base *devcb;
- (void)devcb;
- MCFG_DEVICE_CLOCK(10000000)
- MCFG_NCR5380N_DRQ_HANDLER(WRITELINE("^^", a2bus_scsi_device, drq_w))
-}
-
static void scsi_devices(device_slot_interface &device)
{
device.option_add("cdrom", NSCSI_CDROM);
@@ -78,18 +70,21 @@ ROM_END
// device_add_mconfig - add device configuration
//-------------------------------------------------
-MACHINE_CONFIG_START(a2bus_scsi_device::device_add_mconfig)
- MCFG_NSCSI_BUS_ADD(SCSI_BUS_TAG)
- MCFG_NSCSI_ADD("scsibus:0", scsi_devices, nullptr, false)
- MCFG_NSCSI_ADD("scsibus:1", scsi_devices, nullptr, false)
- MCFG_NSCSI_ADD("scsibus:2", scsi_devices, nullptr, false)
- MCFG_NSCSI_ADD("scsibus:3", scsi_devices, nullptr, false)
- MCFG_NSCSI_ADD("scsibus:4", scsi_devices, nullptr, false)
- MCFG_NSCSI_ADD("scsibus:5", scsi_devices, nullptr, false)
- MCFG_NSCSI_ADD("scsibus:6", scsi_devices, "harddisk", false)
- MCFG_NSCSI_ADD("scsibus:7", scsi_devices, "ncr5380", true)
- MCFG_SLOT_OPTION_MACHINE_CONFIG("ncr5380", ncr5380)
-MACHINE_CONFIG_END
+void a2bus_scsi_device::device_add_mconfig(machine_config &config)
+{
+ NSCSI_BUS(config, m_scsibus);
+ NSCSI_CONNECTOR(config, "scsibus:0", scsi_devices, nullptr, false);
+ NSCSI_CONNECTOR(config, "scsibus:1", scsi_devices, nullptr, false);
+ NSCSI_CONNECTOR(config, "scsibus:2", scsi_devices, nullptr, false);
+ NSCSI_CONNECTOR(config, "scsibus:3", scsi_devices, nullptr, false);
+ NSCSI_CONNECTOR(config, "scsibus:4", scsi_devices, nullptr, false);
+ NSCSI_CONNECTOR(config, "scsibus:5", scsi_devices, nullptr, false);
+ NSCSI_CONNECTOR(config, "scsibus:6", scsi_devices, "harddisk", false);
+ NSCSI_CONNECTOR(config, "scsibus:7", scsi_devices, "ncr5380", true).set_option_machine_config("ncr5380", [this](device_t *device) {
+ device->set_clock(10000000);
+ downcast<ncr5380n_device &>(*device).drq_handler().set(*this, FUNC(a2bus_scsi_device::drq_w));
+ });
+}
//-------------------------------------------------
// rom_region - device-specific ROM region
@@ -159,7 +154,7 @@ uint8_t a2bus_scsi_device::read_c0nx(uint8_t offset)
case 6:
case 7:
// logerror("Read 5380 @ %x\n", offset);
- return m_ncr5380->read(machine().dummy_space(), offset);
+ return m_ncr5380->read(offset);
case 8: // read and DACK
return m_ncr5380->dma_r();
@@ -199,7 +194,7 @@ void a2bus_scsi_device::write_c0nx(uint8_t offset, uint8_t data)
case 6:
case 7:
// logerror("%02x to 5380 reg %x\n", data, offset);
- m_ncr5380->write(machine().dummy_space(), offset, data);
+ m_ncr5380->write(offset, data);
break;
case 8: // write and DACK
diff --git a/src/devices/bus/a2bus/a2scsi.h b/src/devices/bus/a2bus/a2scsi.h
index d9d143da6e9..f1a556eeab7 100644
--- a/src/devices/bus/a2bus/a2scsi.h
+++ b/src/devices/bus/a2bus/a2scsi.h
@@ -30,8 +30,6 @@ public:
DECLARE_WRITE_LINE_MEMBER( drq_w );
- static void ncr5380(device_t *device);
-
protected:
a2bus_scsi_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock);
diff --git a/src/devices/bus/a2bus/a2softcard.cpp b/src/devices/bus/a2bus/a2softcard.cpp
index b8c71153e7b..d41c84b9425 100644
--- a/src/devices/bus/a2bus/a2softcard.cpp
+++ b/src/devices/bus/a2bus/a2softcard.cpp
@@ -82,7 +82,7 @@ void a2bus_softcard_device::write_cnxx(uint8_t offset, uint8_t data)
if (!m_bEnabled)
{
m_z80->set_input_line(INPUT_LINE_HALT, CLEAR_LINE);
- set_maincpu_halt(ASSERT_LINE);
+ raise_slot_dma();
if (m_FirstZ80Boot)
{
@@ -95,7 +95,7 @@ void a2bus_softcard_device::write_cnxx(uint8_t offset, uint8_t data)
else
{
m_z80->set_input_line(INPUT_LINE_HALT, ASSERT_LINE);
- set_maincpu_halt(CLEAR_LINE);
+ lower_slot_dma();
m_bEnabled = false;
}
}
@@ -106,27 +106,27 @@ READ8_MEMBER( a2bus_softcard_device::dma_r )
{
if (offset <= 0xafff)
{
- return slot_dma_read(space, offset+0x1000);
+ return slot_dma_read(offset+0x1000);
}
else if (offset <= 0xbfff) // LC bank 2 d000-dfff
{
- return slot_dma_read(space, (offset&0xfff) + 0xd000);
+ return slot_dma_read((offset&0xfff) + 0xd000);
}
else if (offset <= 0xcfff) // LC e000-efff
{
- return slot_dma_read(space, (offset&0xfff) + 0xe000);
+ return slot_dma_read((offset&0xfff) + 0xe000);
}
else if (offset <= 0xdfff) // LC f000-ffff (or ROM?)
{
- return slot_dma_read(space, (offset&0xfff) + 0xf000);
+ return slot_dma_read((offset&0xfff) + 0xf000);
}
else if (offset <= 0xefff) // I/O space c000-cfff
{
- return slot_dma_read(space, (offset&0xfff) + 0xc000);
+ return slot_dma_read((offset&0xfff) + 0xc000);
}
else // zero page
{
- return slot_dma_read(space, offset&0xfff);
+ return slot_dma_read(offset&0xfff);
}
}
@@ -144,27 +144,27 @@ WRITE8_MEMBER( a2bus_softcard_device::dma_w )
{
if (offset <= 0xafff)
{
- slot_dma_write(space, offset+0x1000, data);
+ slot_dma_write(offset+0x1000, data);
}
else if (offset <= 0xbfff) // LC bank 2 d000-dfff
{
- slot_dma_write(space, (offset&0xfff) + 0xd000, data);
+ slot_dma_write((offset&0xfff) + 0xd000, data);
}
else if (offset <= 0xcfff) // LC e000-efff
{
- slot_dma_write(space, (offset&0xfff) + 0xe000, data);
+ slot_dma_write((offset&0xfff) + 0xe000, data);
}
else if (offset <= 0xdfff) // LC f000-ffff (or ROM?)
{
- slot_dma_write(space, (offset&0xfff) + 0xf000, data);
+ slot_dma_write((offset&0xfff) + 0xf000, data);
}
else if (offset <= 0xefff) // I/O space c000-cfff
{
- slot_dma_write(space, (offset&0xfff) + 0xc000, data);
+ slot_dma_write((offset&0xfff) + 0xc000, data);
}
else // zero page
{
- slot_dma_write(space, offset&0xfff, data);
+ slot_dma_write(offset&0xfff, data);
}
}
}
diff --git a/src/devices/bus/a2bus/a2ssc.cpp b/src/devices/bus/a2bus/a2ssc.cpp
index 0261835e1d7..773f4db246f 100644
--- a/src/devices/bus/a2bus/a2ssc.cpp
+++ b/src/devices/bus/a2bus/a2ssc.cpp
@@ -189,7 +189,7 @@ uint8_t a2bus_ssc_device::read_c0nx(uint8_t offset)
case 9:
case 0xa:
case 0xb:
- return m_acia->read(machine().dummy_space(), offset-8);
+ return m_acia->read(offset-8);
}
@@ -208,7 +208,7 @@ void a2bus_ssc_device::write_c0nx(uint8_t offset, uint8_t data)
case 9:
case 0xa:
case 0xb:
- m_acia->write(machine().dummy_space(), offset-8, data);
+ m_acia->write(offset-8, data);
break;
}
}
diff --git a/src/devices/bus/a2bus/a2themill.cpp b/src/devices/bus/a2bus/a2themill.cpp
index effa5ac9cfb..14474662ef8 100644
--- a/src/devices/bus/a2bus/a2themill.cpp
+++ b/src/devices/bus/a2bus/a2themill.cpp
@@ -238,34 +238,34 @@ READ8_MEMBER( a2bus_themill_device::dma_r )
{
if (offset <= 0x7fff)
{
- return slot_dma_read(space, offset+0x1000);
+ return slot_dma_read(offset+0x1000);
}
else if (offset <= 0xafff)
{
- return slot_dma_read(space, (offset&0x3fff) + 0xd000);
+ return slot_dma_read((offset&0x3fff) + 0xd000);
}
else if (offset <= 0xbfff)
{
- return slot_dma_read(space, (offset&0xfff) + 0xc000);
+ return slot_dma_read((offset&0xfff) + 0xc000);
}
else if (offset <= 0xcfff) // 6809 Cxxx -> 6502 ZP
{
- return slot_dma_read(space, (offset&0xfff));
+ return slot_dma_read((offset&0xfff));
}
else // 6809 Dxxx -> 6502 9000
{
- return slot_dma_read(space, (offset-0xd000)+0x9000);
+ return slot_dma_read((offset-0xd000)+0x9000);
}
}
else
{
if (m_flipAddrSpace)
{
- return slot_dma_read(space, offset^0x8000);
+ return slot_dma_read(offset^0x8000);
}
else
{
- return slot_dma_read(space, offset);
+ return slot_dma_read(offset);
}
}
@@ -283,34 +283,34 @@ WRITE8_MEMBER( a2bus_themill_device::dma_w )
{
if (offset <= 0x7fff)
{
- slot_dma_write(space, offset+0x1000, data);
+ slot_dma_write(offset+0x1000, data);
}
else if (offset <= 0xafff)
{
- slot_dma_write(space, (offset&0x3fff) + 0xd000, data);
+ slot_dma_write((offset&0x3fff) + 0xd000, data);
}
else if (offset <= 0xbfff)
{
- slot_dma_write(space, (offset&0xfff) + 0xc000, data);
+ slot_dma_write((offset&0xfff) + 0xc000, data);
}
else if (offset <= 0xcfff)
{
- slot_dma_write(space, (offset&0xfff), data);
+ slot_dma_write((offset&0xfff), data);
}
else // 6809 Dxxx -> 6502 9000
{
- slot_dma_write(space, (offset-0xd000)+0x9000, data);
+ slot_dma_write((offset-0xd000)+0x9000, data);
}
}
else
{
if (m_flipAddrSpace)
{
- slot_dma_write(space, offset^0x8000, data);
+ slot_dma_write(offset^0x8000, data);
}
else
{
- slot_dma_write(space, offset, data);
+ slot_dma_write(offset, data);
}
}
}
diff --git a/src/devices/bus/a2bus/a2ultraterm.cpp b/src/devices/bus/a2bus/a2ultraterm.cpp
index 9ea36ea2496..fd8fb2a895a 100644
--- a/src/devices/bus/a2bus/a2ultraterm.cpp
+++ b/src/devices/bus/a2bus/a2ultraterm.cpp
@@ -104,10 +104,11 @@ ROM_END
// device_add_mconfig - add device configuration
//-------------------------------------------------
-MACHINE_CONFIG_START(a2bus_videx160_device::device_add_mconfig)
- MCFG_SCREEN_ADD( ULTRATERM_SCREEN_NAME, RASTER)
- MCFG_SCREEN_RAW_PARAMS(CLOCK_LOW, 882, 0, 720, 370, 0, 350 )
- MCFG_SCREEN_UPDATE_DEVICE( ULTRATERM_MC6845_NAME, mc6845_device, screen_update )
+void a2bus_videx160_device::device_add_mconfig(machine_config &config)
+{
+ screen_device &screen(SCREEN(config, ULTRATERM_SCREEN_NAME, SCREEN_TYPE_RASTER));
+ screen.set_raw(CLOCK_LOW, 882, 0, 720, 370, 0, 350);
+ screen.set_screen_update(ULTRATERM_MC6845_NAME, FUNC(mc6845_device::screen_update));
MC6845(config, m_crtc, CLOCK_LOW/9);
m_crtc->set_screen(ULTRATERM_SCREEN_NAME);
@@ -115,7 +116,7 @@ MACHINE_CONFIG_START(a2bus_videx160_device::device_add_mconfig)
m_crtc->set_char_width(8);
m_crtc->set_update_row_callback(FUNC(a2bus_videx160_device::crtc_update_row), this);
m_crtc->out_vsync_callback().set(FUNC(a2bus_videx160_device::vsync_changed));
-MACHINE_CONFIG_END
+}
//-------------------------------------------------
// rom_region - device-specific ROM region
@@ -194,7 +195,7 @@ uint8_t a2bus_videx160_device::read_c0nx(uint8_t offset)
switch (offset)
{
case 1:
- return m_crtc->read_register(); // status_r?
+ return m_crtc->register_r(); // status_r?
case 2:
return m_ctrl1;
@@ -218,11 +219,11 @@ void a2bus_videx160_device::write_c0nx(uint8_t offset, uint8_t data)
switch (offset)
{
case 0:
- m_crtc->write_address(data);
+ m_crtc->address_w(data);
break;
case 1:
- m_crtc->write_register(data);
+ m_crtc->register_w(data);
break;
case 2:
diff --git a/src/devices/bus/a2bus/a2videoterm.cpp b/src/devices/bus/a2bus/a2videoterm.cpp
index 519496b1b1b..35cb657afd9 100644
--- a/src/devices/bus/a2bus/a2videoterm.cpp
+++ b/src/devices/bus/a2bus/a2videoterm.cpp
@@ -117,10 +117,11 @@ ROM_END
// device_add_mconfig - add device configuration
//-------------------------------------------------
-MACHINE_CONFIG_START(a2bus_videx80_device::device_add_mconfig)
- MCFG_SCREEN_ADD( VIDEOTERM_SCREEN_NAME, RASTER) // 560x216? (80x24 7x9 characters)
- MCFG_SCREEN_RAW_PARAMS(MDA_CLOCK, 882, 0, 720, 370, 0, 350 )
- MCFG_SCREEN_UPDATE_DEVICE( VIDEOTERM_MC6845_NAME, mc6845_device, screen_update )
+void a2bus_videx80_device::device_add_mconfig(machine_config &config)
+{
+ screen_device &screen(SCREEN(config, VIDEOTERM_SCREEN_NAME, SCREEN_TYPE_RASTER)); // 560x216? (80x24 7x9 characters)
+ screen.set_raw(MDA_CLOCK, 882, 0, 720, 370, 0, 350);
+ screen.set_screen_update(VIDEOTERM_MC6845_NAME, FUNC(mc6845_device::screen_update));
MC6845(config, m_crtc, MDA_CLOCK/9);
m_crtc->set_screen(VIDEOTERM_SCREEN_NAME);
@@ -128,7 +129,7 @@ MACHINE_CONFIG_START(a2bus_videx80_device::device_add_mconfig)
m_crtc->set_char_width(8);
m_crtc->set_update_row_callback(FUNC(a2bus_videx80_device::crtc_update_row), this);
m_crtc->out_vsync_callback().set(FUNC(a2bus_videx80_device::vsync_changed));
-MACHINE_CONFIG_END
+}
//-------------------------------------------------
// rom_region - device-specific ROM region
@@ -240,7 +241,7 @@ uint8_t a2bus_videx80_device::read_c0nx(uint8_t offset)
if (offset == 1)
{
- return m_crtc->read_register(); // status_r?
+ return m_crtc->register_r(); // status_r?
}
return 0xff;
@@ -255,11 +256,11 @@ void a2bus_videx80_device::write_c0nx(uint8_t offset, uint8_t data)
{
if (offset == 0)
{
- m_crtc->write_address(data);
+ m_crtc->address_w(data);
}
else if (offset == 1)
{
- m_crtc->write_register(data);
+ m_crtc->register_w(data);
}
m_rambank = ((offset>>2) & 3) * 512;
diff --git a/src/devices/bus/a2bus/a2zipdrive.cpp b/src/devices/bus/a2bus/a2zipdrive.cpp
index aaeb6ed6219..41034fab231 100644
--- a/src/devices/bus/a2bus/a2zipdrive.cpp
+++ b/src/devices/bus/a2bus/a2zipdrive.cpp
@@ -2,16 +2,19 @@
// copyright-holders:R. Belmont
/*********************************************************************
- a2zipdrive.c
+ a2zipdrive.cpp
ZIP Technologies ZipDrive IDE card
+ Parsons Engineering Focus Drive IDE card
- NOTE: No known dump exists of the formatter utility and the
+ These cards are very, very similar. Maybe Parsons designed both?
+
+ NOTE: No known dump exists of the Zip formatter utility and the
format of the custom partition record (block 0) that the card
expects has not yet been determined, so this is largely untested
and will work only with a drive dump from real h/w.
- PLEASE use it only on a backup copy of said dump and contact MESSdev
+ PLEASE use it only on a backup copy of said dump and contact MAMEdev
if you have one!
Partition block format:
@@ -29,6 +32,7 @@
//**************************************************************************
DEFINE_DEVICE_TYPE(A2BUS_ZIPDRIVE, a2bus_zipdrive_device, "a2zipdrv", "Zip Technologies ZipDrive")
+DEFINE_DEVICE_TYPE(A2BUS_FOCUSDRIVE, a2bus_focusdrive_device, "a2focdrv", "Parsons Engineering Focus Drive")
#define ZIPDRIVE_ROM_REGION "zipdrive_rom"
#define ZIPDRIVE_ATA_TAG "zipdrive_ata"
@@ -38,6 +42,11 @@ ROM_START( zipdrive )
ROM_LOAD( "zip drive - rom.bin", 0x000000, 0x002000, CRC(fd800a40) SHA1(46636bfed88c864139e3d2826661908a8c07c459) )
ROM_END
+ROM_START( focusdrive )
+ ROM_REGION(0x2000, ZIPDRIVE_ROM_REGION, 0)
+ ROM_LOAD( "focusrom.bin", 0x001000, 0x001000, CRC(0fd0ba25) SHA1(acf414aa145fcfa1c12aca0269f1f7ada82f1c04) )
+ROM_END
+
/***************************************************************************
FUNCTION PROTOTYPES
***************************************************************************/
@@ -60,6 +69,11 @@ const tiny_rom_entry *a2bus_zipdrivebase_device::device_rom_region() const
return ROM_NAME( zipdrive );
}
+const tiny_rom_entry *a2bus_focusdrive_device::device_rom_region() const
+{
+ return ROM_NAME( focusdrive );
+}
+
//**************************************************************************
// LIVE DEVICE
//**************************************************************************
@@ -76,6 +90,11 @@ a2bus_zipdrive_device::a2bus_zipdrive_device(const machine_config &mconfig, cons
{
}
+a2bus_focusdrive_device::a2bus_focusdrive_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) :
+ a2bus_zipdrivebase_device(mconfig, A2BUS_FOCUSDRIVE, tag, owner, clock)
+{
+}
+
//-------------------------------------------------
// device_start - device-specific startup
//-------------------------------------------------
@@ -89,9 +108,12 @@ void a2bus_zipdrivebase_device::device_start()
void a2bus_zipdrivebase_device::device_reset()
{
- popmessage("Zip Drive partition format unknown, contact MESSdev if you have the software or a drive dump!");
}
+void a2bus_focusdrive_device::device_reset()
+{
+ m_rom[0x1c6c] = 0x03; // eat 3 IDE words here instead of 1, fixes a bug? in the original ROM
+}
/*-------------------------------------------------
read_c0nx - called for reads from this card's c0nx space
@@ -112,7 +134,7 @@ uint8_t a2bus_zipdrivebase_device::read_c0nx(uint8_t offset)
return m_ata->read_cs0(offset, 0xff);
case 8: // data port
- m_lastdata = m_ata->read_cs0(offset);
+ m_lastdata = m_ata->read_cs0(offset, 0xffff);
// printf("%04x @ IDE data\n", m_lastdata);
return m_lastdata&0xff;
@@ -120,13 +142,42 @@ uint8_t a2bus_zipdrivebase_device::read_c0nx(uint8_t offset)
return (m_lastdata>>8) & 0xff;
default:
- logerror("a2zipdrive: unhandled read @ C0n%x\n", offset);
+ logerror("unhandled read @ C0n%x\n", offset);
break;
}
return 0xff;
}
+uint8_t a2bus_focusdrive_device::read_c0nx(uint8_t offset)
+{
+ switch (offset)
+ {
+ case 8:
+ case 9:
+ case 0xa:
+ case 0xb:
+ case 0xc:
+ case 0xd:
+ case 0xe:
+ case 0xf:
+ return m_ata->read_cs0(offset&7, 0xff);
+
+ case 0: // data port
+ m_lastdata = m_ata->read_cs0(offset, 0xffff);
+ //printf("%04x @ IDE data\n", m_lastdata);
+ return m_lastdata&0xff;
+
+ case 1:
+ return (m_lastdata>>8) & 0xff;
+
+ default:
+ logerror("unhandled read @ C0n%x\n", offset);
+ break;
+ }
+
+ return 0xff;
+}
/*-------------------------------------------------
write_c0nx - called for writes to this card's c0nx space
@@ -157,7 +208,7 @@ void a2bus_zipdrivebase_device::write_c0nx(uint8_t offset, uint8_t data)
// printf("%02x to IDE data hi\n", data);
m_lastdata &= 0x00ff;
m_lastdata |= (data << 8);
- m_ata->write_cs0(0, m_lastdata);
+ m_ata->write_cs0(0, m_lastdata, 0xffff);
break;
default:
@@ -166,6 +217,48 @@ void a2bus_zipdrivebase_device::write_c0nx(uint8_t offset, uint8_t data)
}
}
+void a2bus_focusdrive_device::write_c0nx(uint8_t offset, uint8_t data)
+{
+ switch (offset)
+ {
+ case 8:
+ case 9:
+ case 0xa:
+ case 0xb:
+ case 0xc:
+ case 0xd:
+ case 0xe:
+ case 0xf:
+ // due to a bug in the 6502 firmware, eat data if DRQ is set
+ #if 0
+ while (m_ata->read_cs0(7, 0xff) & 0x08)
+ {
+ m_ata->read_cs0(0, 0xffff);
+ printf("eating 2 bytes to clear DRQ\n");
+ }
+ #endif
+// printf("%02x to IDE controller @ %x\n", data, offset);
+ m_ata->write_cs0(offset & 7, data, 0xff);
+ break;
+
+ case 0:
+// printf("%02x to IDE data lo\n", data);
+ m_lastdata = data;
+ break;
+
+ case 1:
+// printf("%02x to IDE data hi\n", data);
+ m_lastdata &= 0x00ff;
+ m_lastdata |= (data << 8);
+ m_ata->write_cs0(0, m_lastdata, 0xffff);
+ break;
+
+ default:
+ printf("focus: write %02x @ unhandled C0n%x\n", data, offset);
+ break;
+ }
+}
+
/*-------------------------------------------------
read_cnxx - called for reads from this card's cnxx space
-------------------------------------------------*/
diff --git a/src/devices/bus/a2bus/a2zipdrive.h b/src/devices/bus/a2bus/a2zipdrive.h
index 8187e04cdd2..9e3e68e79f2 100644
--- a/src/devices/bus/a2bus/a2zipdrive.h
+++ b/src/devices/bus/a2bus/a2zipdrive.h
@@ -5,8 +5,9 @@
a2zipdrive.h
ZIP Technologies ZipDrive IDE card
+ Parsons Engineering Focus Drive IDE card
- See important NOTE at the top of a2zipdrive.c!
+ See important NOTE at the top of a2zipdrive.cpp!
*********************************************************************/
@@ -44,8 +45,6 @@ protected:
required_device<ata_interface_device> m_ata;
uint8_t *m_rom;
-
-private:
uint16_t m_lastdata;
};
@@ -55,7 +54,20 @@ public:
a2bus_zipdrive_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
};
+class a2bus_focusdrive_device : public a2bus_zipdrivebase_device
+{
+public:
+ a2bus_focusdrive_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+
+protected:
+ virtual void device_reset() override;
+ virtual const tiny_rom_entry *device_rom_region() const override;
+ virtual uint8_t read_c0nx(uint8_t offset) override;
+ virtual void write_c0nx(uint8_t offset, uint8_t data) override;
+};
+
// device type definition
DECLARE_DEVICE_TYPE(A2BUS_ZIPDRIVE, a2bus_zipdrive_device)
+DECLARE_DEVICE_TYPE(A2BUS_FOCUSDRIVE, a2bus_focusdrive_device)
#endif // MAME_BUS_A2BUS_ZIPDRIVE_H
diff --git a/src/devices/bus/a2bus/agat7ports.cpp b/src/devices/bus/a2bus/agat7ports.cpp
index d7c12ad81d9..5c24d8fac8f 100644
--- a/src/devices/bus/a2bus/agat7ports.cpp
+++ b/src/devices/bus/a2bus/agat7ports.cpp
@@ -51,18 +51,20 @@ INPUT_PORTS_END
// device_add_mconfig - add device configuration
//-------------------------------------------------
-MACHINE_CONFIG_START(a2bus_agat7_ports_device::device_add_mconfig)
+void a2bus_agat7_ports_device::device_add_mconfig(machine_config &config)
+{
I8255(config, m_d9);
m_d9->out_pa_callback().set("cent_data_out", FUNC(output_latch_device::bus_w));
m_d9->out_pb_callback().set(FUNC(a2bus_agat7_ports_device::write_portb));
m_d9->in_pc_callback().set(FUNC(a2bus_agat7_ports_device::read_portc));
- MCFG_DEVICE_ADD(m_centronics, CENTRONICS, centronics_devices, "printer")
- MCFG_CENTRONICS_BUSY_HANDLER(WRITELINE(*this, a2bus_agat7_ports_device, write_centronics_busy))
- MCFG_CENTRONICS_OUTPUT_LATCH_ADD("cent_data_out", "centronics")
+ CENTRONICS(config, m_centronics, centronics_devices, "printer");
+ m_centronics->busy_handler().set(FUNC(a2bus_agat7_ports_device::write_centronics_busy));
+ output_latch_device &cent_data_out(OUTPUT_LATCH(config, "cent_data_out"));
+ m_centronics->set_output_latch(cent_data_out);
I8251(config, m_d10, 0);
-MACHINE_CONFIG_END
+}
//-------------------------------------------------
// input_ports - device-specific input ports
diff --git a/src/devices/bus/a2bus/agat840k_hle.cpp b/src/devices/bus/a2bus/agat840k_hle.cpp
index 3571513b7d5..c95d66a09e9 100644
--- a/src/devices/bus/a2bus/agat840k_hle.cpp
+++ b/src/devices/bus/a2bus/agat840k_hle.cpp
@@ -51,13 +51,12 @@ static const floppy_interface agat840k_hle_floppy_interface =
"floppy_5_25"
};
-MACHINE_CONFIG_START(a2bus_agat840k_hle_device::device_add_mconfig)
- MCFG_DEVICE_ADD(FLOPPY_0, LEGACY_FLOPPY, 0)
- MCFG_LEGACY_FLOPPY_CONFIG(agat840k_hle_floppy_interface)
- MCFG_LEGACY_FLOPPY_IDX_CB(WRITELINE(*this, a2bus_agat840k_hle_device, index_0_w))
- MCFG_DEVICE_ADD(FLOPPY_1, LEGACY_FLOPPY, 0)
- MCFG_LEGACY_FLOPPY_CONFIG(agat840k_hle_floppy_interface)
- MCFG_LEGACY_FLOPPY_IDX_CB(WRITELINE(*this, a2bus_agat840k_hle_device, index_1_w))
+void a2bus_agat840k_hle_device::device_add_mconfig(machine_config &config)
+{
+ legacy_floppy_image_device &floppy0(LEGACY_FLOPPY(config, FLOPPY_0, 0, &agat840k_hle_floppy_interface));
+ floppy0.out_idx_cb().set(FUNC(a2bus_agat840k_hle_device::index_0_w));
+ legacy_floppy_image_device &floppy1(LEGACY_FLOPPY(config, FLOPPY_1, 0, &agat840k_hle_floppy_interface));
+ floppy1.out_idx_cb().set(FUNC(a2bus_agat840k_hle_device::index_1_w));
I8255(config, m_d14);
// PA not connected
@@ -69,7 +68,7 @@ MACHINE_CONFIG_START(a2bus_agat840k_hle_device::device_add_mconfig)
// m_d15->out_pb_callback().set(FUNC(a2bus_agat840k_hle_device::d15_o_b)); // write data
m_d15->in_pc_callback().set(FUNC(a2bus_agat840k_hle_device::d15_i_c));
m_d15->out_pc_callback().set(FUNC(a2bus_agat840k_hle_device::d15_o_c));
-MACHINE_CONFIG_END
+}
//-------------------------------------------------
// rom_region - device-specific ROM region
diff --git a/src/devices/bus/a2bus/corvfdc02.cpp b/src/devices/bus/a2bus/corvfdc02.cpp
index 7d4bc6ed785..36f5dbbd09c 100644
--- a/src/devices/bus/a2bus/corvfdc02.cpp
+++ b/src/devices/bus/a2bus/corvfdc02.cpp
@@ -132,10 +132,10 @@ uint8_t a2bus_corvfdc02_device::read_c0nx(uint8_t offset)
switch (offset)
{
case 0: // 765 FIFO
- return m_fdc->read_fifo();
+ return m_fdc->fifo_r();
case 1: // 765 MSR
- return m_fdc->read_msr();
+ return m_fdc->msr_r();
case 2: // buffer address
return (m_bufptr>>1) & 0xff;
@@ -170,7 +170,7 @@ void a2bus_corvfdc02_device::write_c0nx(uint8_t offset, uint8_t data)
switch (offset)
{
case 0: // FDC FIFO write
- m_fdc->write_fifo(data);
+ m_fdc->fifo_w(data);
break;
case 1: // FDC ???
diff --git a/src/devices/bus/a2bus/ezcgi.cpp b/src/devices/bus/a2bus/ezcgi.cpp
index ec9dce1cad4..a9bc648f08e 100644
--- a/src/devices/bus/a2bus/ezcgi.cpp
+++ b/src/devices/bus/a2bus/ezcgi.cpp
@@ -48,33 +48,35 @@ void a2bus_ezcgi_device::device_add_mconfig(machine_config &config)
SCREEN(config, SCREEN_TAG, SCREEN_TYPE_RASTER);
}
-MACHINE_CONFIG_START(a2bus_ezcgi_9938_device::device_add_mconfig)
+void a2bus_ezcgi_9938_device::device_add_mconfig(machine_config &config)
+{
V9938(config, m_tms, XTAL(21'477'272)); // typical 9938 clock, not verified
m_tms->set_vram_size(0x30000); // 192K of VRAM
m_tms->set_screen(SCREEN_TAG);
m_tms->int_cb().set(FUNC(a2bus_ezcgi_9938_device::tms_irq_w));
- MCFG_SCREEN_ADD(SCREEN_TAG, RASTER)
- MCFG_SCREEN_VIDEO_ATTRIBUTES(VIDEO_UPDATE_BEFORE_VBLANK)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */
- MCFG_SCREEN_SIZE(MSX2_TOTAL_XRES_PIXELS, 262*2)
- MCFG_SCREEN_VISIBLE_AREA(MSX2_XBORDER_PIXELS - MSX2_VISIBLE_XBORDER_PIXELS, MSX2_TOTAL_XRES_PIXELS - MSX2_XBORDER_PIXELS + MSX2_VISIBLE_XBORDER_PIXELS - 1, MSX2_YBORDER_PIXELS - MSX2_VISIBLE_YBORDER_PIXELS, MSX2_TOTAL_YRES_PIXELS - MSX2_YBORDER_PIXELS + MSX2_VISIBLE_YBORDER_PIXELS - 1)
-MACHINE_CONFIG_END
+ screen_device &screen(SCREEN(config, SCREEN_TAG, SCREEN_TYPE_RASTER));
+ screen.set_video_attributes(VIDEO_UPDATE_BEFORE_VBLANK);
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */
+ screen.set_size(MSX2_TOTAL_XRES_PIXELS, 262*2);
+ screen.set_visarea(MSX2_XBORDER_PIXELS - MSX2_VISIBLE_XBORDER_PIXELS, MSX2_TOTAL_XRES_PIXELS - MSX2_XBORDER_PIXELS + MSX2_VISIBLE_XBORDER_PIXELS - 1, MSX2_YBORDER_PIXELS - MSX2_VISIBLE_YBORDER_PIXELS, MSX2_TOTAL_YRES_PIXELS - MSX2_YBORDER_PIXELS + MSX2_VISIBLE_YBORDER_PIXELS - 1);
+}
-MACHINE_CONFIG_START(a2bus_ezcgi_9958_device::device_add_mconfig)
+void a2bus_ezcgi_9958_device::device_add_mconfig(machine_config &config)
+{
V9958(config, m_tms, XTAL(21'477'272)); // typical 9938/9958 clock, not verified
m_tms->set_vram_size(0x30000); // 192K of VRAM
m_tms->set_screen(SCREEN_TAG);
m_tms->int_cb().set(FUNC(a2bus_ezcgi_9958_device::tms_irq_w));
- MCFG_SCREEN_ADD(SCREEN_TAG, RASTER)
- MCFG_SCREEN_VIDEO_ATTRIBUTES(VIDEO_UPDATE_BEFORE_VBLANK)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */
- MCFG_SCREEN_SIZE(MSX2_TOTAL_XRES_PIXELS, 262*2)
- MCFG_SCREEN_VISIBLE_AREA(MSX2_XBORDER_PIXELS - MSX2_VISIBLE_XBORDER_PIXELS, MSX2_TOTAL_XRES_PIXELS - MSX2_XBORDER_PIXELS + MSX2_VISIBLE_XBORDER_PIXELS - 1, MSX2_YBORDER_PIXELS - MSX2_VISIBLE_YBORDER_PIXELS, MSX2_TOTAL_YRES_PIXELS - MSX2_YBORDER_PIXELS + MSX2_VISIBLE_YBORDER_PIXELS - 1)
-MACHINE_CONFIG_END
+ screen_device &screen(SCREEN(config, SCREEN_TAG, SCREEN_TYPE_RASTER));
+ screen.set_video_attributes(VIDEO_UPDATE_BEFORE_VBLANK);
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */
+ screen.set_size(MSX2_TOTAL_XRES_PIXELS, 262*2);
+ screen.set_visarea(MSX2_XBORDER_PIXELS - MSX2_VISIBLE_XBORDER_PIXELS, MSX2_TOTAL_XRES_PIXELS - MSX2_XBORDER_PIXELS + MSX2_VISIBLE_XBORDER_PIXELS - 1, MSX2_YBORDER_PIXELS - MSX2_VISIBLE_YBORDER_PIXELS, MSX2_TOTAL_YRES_PIXELS - MSX2_YBORDER_PIXELS + MSX2_VISIBLE_YBORDER_PIXELS - 1);
+}
//**************************************************************************
// LIVE DEVICE
diff --git a/src/devices/bus/a2bus/laser128.cpp b/src/devices/bus/a2bus/laser128.cpp
index dc7ae4fea21..e0c7626aa93 100644
--- a/src/devices/bus/a2bus/laser128.cpp
+++ b/src/devices/bus/a2bus/laser128.cpp
@@ -32,8 +32,9 @@ DEFINE_DEVICE_TYPE(A2BUS_LASER128, a2bus_laser128_device, "a2laser128", "VTech L
// device_add_mconfig - add device configuration
//-------------------------------------------------
-MACHINE_CONFIG_START(a2bus_laser128_device::device_add_mconfig)
-MACHINE_CONFIG_END
+void a2bus_laser128_device::device_add_mconfig(machine_config &config)
+{
+}
//**************************************************************************
// LIVE DEVICE
diff --git a/src/devices/bus/a2bus/mouse.cpp b/src/devices/bus/a2bus/mouse.cpp
index e95bb6f019a..a960c74e52c 100644
--- a/src/devices/bus/a2bus/mouse.cpp
+++ b/src/devices/bus/a2bus/mouse.cpp
@@ -203,7 +203,7 @@ void a2bus_mouse_device::device_reset()
uint8_t a2bus_mouse_device::read_c0nx(uint8_t offset)
{
- return m_pia->reg_r(offset & 3);
+ return m_pia->read(offset & 3);
}
/*-------------------------------------------------
@@ -212,7 +212,7 @@ uint8_t a2bus_mouse_device::read_c0nx(uint8_t offset)
void a2bus_mouse_device::write_c0nx(uint8_t offset, uint8_t data)
{
- m_pia->reg_w(offset & 3, data);
+ m_pia->write(offset & 3, data);
}
/*-------------------------------------------------
diff --git a/src/devices/bus/a2bus/pc_xporter.cpp b/src/devices/bus/a2bus/pc_xporter.cpp
index 6334463533b..305da9aa868 100644
--- a/src/devices/bus/a2bus/pc_xporter.cpp
+++ b/src/devices/bus/a2bus/pc_xporter.cpp
@@ -115,14 +115,15 @@ void a2bus_pcxporter_device::pc_io(address_map &map)
// device_add_mconfig - add device configuration
//-------------------------------------------------
-MACHINE_CONFIG_START(a2bus_pcxporter_device::device_add_mconfig)
- MCFG_DEVICE_ADD(m_v30, V30, A2BUS_7M_CLOCK) // 7.16 MHz as per manual
- MCFG_DEVICE_PROGRAM_MAP(pc_map)
- MCFG_DEVICE_IO_MAP(pc_io)
- MCFG_DEVICE_IRQ_ACKNOWLEDGE_DEVICE("pic8259", pic8259_device, inta_cb)
- MCFG_DEVICE_DISABLE()
-
- PIT8253(config, m_pit8253, 0);
+void a2bus_pcxporter_device::device_add_mconfig(machine_config &config)
+{
+ V30(config, m_v30, A2BUS_7M_CLOCK); // 7.16 MHz as per manual
+ m_v30->set_addrmap(AS_PROGRAM, &a2bus_pcxporter_device::pc_map);
+ m_v30->set_addrmap(AS_IO, &a2bus_pcxporter_device::pc_io);
+ m_v30->set_irq_acknowledge_callback("pic8259", FUNC(pic8259_device::inta_cb));
+ m_v30->set_disable();
+
+ PIT8253(config, m_pit8253);
m_pit8253->set_clk<0>(A2BUS_7M_CLOCK / 6.0); // heartbeat IRQ
m_pit8253->out_handler<0>().set(m_pic8259, FUNC(pic8259_device::ir0_w));
m_pit8253->set_clk<1>(A2BUS_7M_CLOCK / 6.0); // DRAM refresh
@@ -147,11 +148,12 @@ MACHINE_CONFIG_START(a2bus_pcxporter_device::device_add_mconfig)
m_dma8237->out_dack_callback<2>().set(FUNC(a2bus_pcxporter_device::pc_dack2_w));
m_dma8237->out_dack_callback<3>().set(FUNC(a2bus_pcxporter_device::pc_dack3_w));
- PIC8259(config, m_pic8259, 0);
+ PIC8259(config, m_pic8259);
m_pic8259->out_int_callback().set_inputline(m_v30, 0);
ISA8(config, m_isabus, 0);
- m_isabus->set_cputag(m_v30);
+ m_isabus->set_memspace(m_v30, AS_PROGRAM);
+ m_isabus->set_iospace(m_v30, AS_IO);
m_isabus->irq2_callback().set(m_pic8259, FUNC(pic8259_device::ir2_w));
m_isabus->irq3_callback().set(m_pic8259, FUNC(pic8259_device::ir3_w));
m_isabus->irq4_callback().set(m_pic8259, FUNC(pic8259_device::ir4_w));
@@ -162,18 +164,18 @@ MACHINE_CONFIG_START(a2bus_pcxporter_device::device_add_mconfig)
m_isabus->drq2_callback().set(m_dma8237, FUNC(am9517a_device::dreq2_w));
m_isabus->drq3_callback().set(m_dma8237, FUNC(am9517a_device::dreq3_w));
- MCFG_DEVICE_ADD(m_pc_kbdc, PC_KBDC, 0)
- MCFG_PC_KBDC_OUT_CLOCK_CB(WRITELINE(*this, a2bus_pcxporter_device, keyboard_clock_w))
- MCFG_PC_KBDC_OUT_DATA_CB(WRITELINE(*this, a2bus_pcxporter_device, keyboard_data_w))
- MCFG_PC_KBDC_SLOT_ADD("pc_kbdc", "kbd", pc_xt_keyboards, STR_KBD_KEYTRONIC_PC3270)
+ PC_KBDC(config, m_pc_kbdc, 0);
+ m_pc_kbdc->out_clock_cb().set(FUNC(a2bus_pcxporter_device::keyboard_clock_w));
+ m_pc_kbdc->out_data_cb().set(FUNC(a2bus_pcxporter_device::keyboard_data_w));
+ PC_KBDC_SLOT(config, "kbd", pc_xt_keyboards, STR_KBD_KEYTRONIC_PC3270).set_pc_kbdc_slot(m_pc_kbdc);
/* sound hardware */
SPEAKER(config, "mono").front_center();
SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 1.00);
- MCFG_DEVICE_ADD("isa1", ISA8_SLOT, 0, m_isabus, pc_isa8_cards, "cga", true) // FIXME: determine ISA bus clock
- MCFG_DEVICE_ADD("isa2", ISA8_SLOT, 0, m_isabus, pc_isa8_cards, "fdc_xt", true)
-MACHINE_CONFIG_END
+ ISA8_SLOT(config, "isa1", 0, m_isabus, pc_isa8_cards, "cga", true); // FIXME: determine ISA bus clock
+ ISA8_SLOT(config, "isa2", 0, m_isabus, pc_isa8_cards, "fdc_xt", true);
+}
//**************************************************************************
// LIVE DEVICE
@@ -631,5 +633,12 @@ WRITE_LINE_MEMBER( a2bus_pcxporter_device::keyboard_data_w )
WRITE8_MEMBER( a2bus_pcxporter_device::nmi_enable_w )
{
m_nmi_enabled = BIT(data,7);
- m_isabus->set_nmi_state(m_nmi_enabled);
+ if (!m_nmi_enabled)
+ m_v30->set_input_line(INPUT_LINE_NMI, CLEAR_LINE);
+}
+
+WRITE_LINE_MEMBER( a2bus_pcxporter_device::iochck_w )
+{
+ if (m_nmi_enabled && !state)
+ m_v30->set_input_line(INPUT_LINE_NMI, ASSERT_LINE);
}
diff --git a/src/devices/bus/a2bus/pc_xporter.h b/src/devices/bus/a2bus/pc_xporter.h
index da9aecc6c6c..2a449ed4019 100644
--- a/src/devices/bus/a2bus/pc_xporter.h
+++ b/src/devices/bus/a2bus/pc_xporter.h
@@ -113,6 +113,7 @@ private:
DECLARE_WRITE8_MEMBER(pc_page_w);
DECLARE_WRITE8_MEMBER(nmi_enable_w);
+ DECLARE_WRITE_LINE_MEMBER(iochck_w);
void pc_select_dma_channel(int channel, bool state);
diff --git a/src/devices/bus/a2bus/ssbapple.cpp b/src/devices/bus/a2bus/ssbapple.cpp
index bde53973c13..89165617867 100644
--- a/src/devices/bus/a2bus/ssbapple.cpp
+++ b/src/devices/bus/a2bus/ssbapple.cpp
@@ -34,11 +34,12 @@ DEFINE_DEVICE_TYPE(A2BUS_SSBAPPLE, a2bus_ssb_device, "a2ssbapl", "Multitech Indu
// device_add_mconfig - add device configuration
//-------------------------------------------------
-MACHINE_CONFIG_START(a2bus_ssb_device::device_add_mconfig)
+void a2bus_ssb_device::device_add_mconfig(machine_config &config)
+{
SPEAKER(config, "ssbapple").front_center();
- MCFG_DEVICE_ADD(TMS_TAG, TMS5220, 640000) // guess - this gives 8 kHz output according to the datasheet
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "ssbapple", 1.0)
-MACHINE_CONFIG_END
+ TMS5220(config, m_tms, 640000); // guess - this gives 8 kHz output according to the datasheet
+ m_tms->add_route(ALL_OUTPUTS, "ssbapple", 1.0);
+}
//**************************************************************************
// LIVE DEVICE
diff --git a/src/devices/bus/a2bus/ssprite.cpp b/src/devices/bus/a2bus/ssprite.cpp
index 818bde14b89..69e12dc98dd 100644
--- a/src/devices/bus/a2bus/ssprite.cpp
+++ b/src/devices/bus/a2bus/ssprite.cpp
@@ -104,7 +104,7 @@ uint8_t a2bus_ssprite_device::read_c0nx(uint8_t offset)
return 0x1f | m_tms5220->status_r();
case 14:
case 15:
- return m_ay->read_data();
+ return m_ay->data_r();
}
return 0xff;
@@ -125,11 +125,11 @@ void a2bus_ssprite_device::write_c0nx(uint8_t offset, uint8_t data)
break;
case 12:
case 13:
- m_ay->write_data(data);
+ m_ay->data_w(data);
break;
case 14:
case 15:
- m_ay->write_address(data);
+ m_ay->address_w(data);
break;
}
}
diff --git a/src/devices/bus/a2bus/timemasterho.cpp b/src/devices/bus/a2bus/timemasterho.cpp
index ad0e96f2ab3..6b7f0b1f5eb 100644
--- a/src/devices/bus/a2bus/timemasterho.cpp
+++ b/src/devices/bus/a2bus/timemasterho.cpp
@@ -157,7 +157,7 @@ uint8_t a2bus_timemasterho_device::read_c0nx(uint8_t offset)
{
if (offset <= 3)
{
- return m_pia->reg_r(offset);
+ return m_pia->read(offset);
}
return 0xff;
@@ -172,7 +172,7 @@ void a2bus_timemasterho_device::write_c0nx(uint8_t offset, uint8_t data)
{
if (offset <= 3)
{
- m_pia->reg_w(offset, data);
+ m_pia->write(offset, data);
}
}
diff --git a/src/devices/bus/a2bus/transwarp.cpp b/src/devices/bus/a2bus/transwarp.cpp
index 06557e28cb0..97e02eb8b4e 100644
--- a/src/devices/bus/a2bus/transwarp.cpp
+++ b/src/devices/bus/a2bus/transwarp.cpp
@@ -121,10 +121,11 @@ ioport_constructor a2bus_transwarp_device::device_input_ports() const
// device_add_mconfig - add device configuration
//-------------------------------------------------
-MACHINE_CONFIG_START(a2bus_transwarp_device::device_add_mconfig)
- MCFG_DEVICE_ADD(CPU_TAG, M65C02, A2BUS_7M_CLOCK / 2)
- MCFG_DEVICE_PROGRAM_MAP(m65c02_mem)
-MACHINE_CONFIG_END
+void a2bus_transwarp_device::device_add_mconfig(machine_config &config)
+{
+ M65C02(config, m_ourcpu, A2BUS_7M_CLOCK / 2);
+ m_ourcpu->set_addrmap(AS_PROGRAM, &a2bus_transwarp_device::m65c02_mem);
+}
//**************************************************************************
// LIVE DEVICE
@@ -161,7 +162,7 @@ void a2bus_transwarp_device::device_reset()
{
m_bEnabled = true;
m_bReadA2ROM = false;
- set_maincpu_halt(ASSERT_LINE);
+ raise_slot_dma();
if (!(m_dsw2->read() & 0x80))
{
if (m_dsw1->read() & 0x80)
@@ -189,6 +190,11 @@ void a2bus_transwarp_device::device_timer(emu_timer &timer, device_timer_id id,
READ8_MEMBER( a2bus_transwarp_device::dma_r )
{
+ if (offset == 0xc070)
+ {
+ hit_slot_joy();
+ }
+
if ((offset >= 0xc090) && (offset <= 0xc0ff))
{
hit_slot(((offset >> 4) & 0xf) - 8);
@@ -199,7 +205,7 @@ READ8_MEMBER( a2bus_transwarp_device::dma_r )
return m_rom[offset & 0xfff];
}
- return slot_dma_read(space, offset);
+ return slot_dma_read(offset);
}
@@ -211,6 +217,11 @@ WRITE8_MEMBER( a2bus_transwarp_device::dma_w )
{
//if ((offset >= 0xc070) && (offset <= 0xc07f)) printf("%02x to %04x\n", data, offset);
+ if (offset == 0xc070)
+ {
+ hit_slot_joy();
+ }
+
if (offset == 0xc072)
{
m_bReadA2ROM = true;
@@ -221,7 +232,7 @@ WRITE8_MEMBER( a2bus_transwarp_device::dma_w )
hit_slot(((offset >> 4) & 0xf) - 8);
}
- slot_dma_write(space, offset, data);
+ slot_dma_write(offset, data);
}
bool a2bus_transwarp_device::take_c800()
@@ -243,3 +254,15 @@ void a2bus_transwarp_device::hit_slot(int slot)
}
}
}
+
+void a2bus_transwarp_device::hit_slot_joy()
+{
+ // only do slot slowdown if acceleration is enabled
+ if (!(m_dsw2->read() & 0x80))
+ {
+ // accleration's on
+ m_ourcpu->set_unscaled_clock(1021800);
+ // PREAD main loop counts up to 11*256 uSec, add 1 to cover the setup
+ m_timer->adjust(attotime::from_usec(11*257));
+ }
+}
diff --git a/src/devices/bus/a2bus/transwarp.h b/src/devices/bus/a2bus/transwarp.h
index 8b42aefa7e5..e687ae6d350 100644
--- a/src/devices/bus/a2bus/transwarp.h
+++ b/src/devices/bus/a2bus/transwarp.h
@@ -54,6 +54,7 @@ private:
void m65c02_mem(address_map &map);
void hit_slot(int slot);
+ void hit_slot_joy();
};
// device type definition
diff --git a/src/devices/bus/a7800/cpuwiz.cpp b/src/devices/bus/a7800/cpuwiz.cpp
index 8c39f5bf001..0b76f7b2233 100644
--- a/src/devices/bus/a7800/cpuwiz.cpp
+++ b/src/devices/bus/a7800/cpuwiz.cpp
@@ -120,9 +120,9 @@ WRITE8_MEMBER(a78_megacart_device::write_40xx)
// VersaBoard + POKEY @ 0x0450
-MACHINE_CONFIG_START(a78_rom_p450_vb_device::device_add_mconfig)
+void a78_rom_p450_vb_device::device_add_mconfig(machine_config &config)
+{
SPEAKER(config, "addon").front_center();
- MCFG_DEVICE_ADD("pokey450", POKEY, XTAL(14'318'181)/8)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "addon", 1.00)
-MACHINE_CONFIG_END
+ POKEY(config, m_pokey450, XTAL(14'318'181)/8).add_route(ALL_OUTPUTS, "addon", 1.00);
+}
diff --git a/src/devices/bus/a7800/cpuwiz.h b/src/devices/bus/a7800/cpuwiz.h
index 1d9b33693d9..e9f52a24d4f 100644
--- a/src/devices/bus/a7800/cpuwiz.h
+++ b/src/devices/bus/a7800/cpuwiz.h
@@ -56,8 +56,8 @@ public:
a78_rom_p450_vb_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
// reading and writing
- virtual DECLARE_READ8_MEMBER(read_04xx) override { if (offset >= 0x50 && offset < 0x60) return m_pokey450->read(space, offset & 0x0f); else return 0xff; }
- virtual DECLARE_WRITE8_MEMBER(write_04xx) override { if (offset >= 0x50 && offset < 0x60) m_pokey450->write(space, offset & 0x0f, data); }
+ virtual DECLARE_READ8_MEMBER(read_04xx) override { if (offset >= 0x50 && offset < 0x60) return m_pokey450->read(offset & 0x0f); else return 0xff; }
+ virtual DECLARE_WRITE8_MEMBER(write_04xx) override { if (offset >= 0x50 && offset < 0x60) m_pokey450->write(offset & 0x0f, data); }
protected:
virtual void device_add_mconfig(machine_config &config) override;
diff --git a/src/devices/bus/a7800/rom.cpp b/src/devices/bus/a7800/rom.cpp
index b40eea850c4..362902dbe51 100644
--- a/src/devices/bus/a7800/rom.cpp
+++ b/src/devices/bus/a7800/rom.cpp
@@ -229,7 +229,7 @@ READ8_MEMBER(a78_rom_device::read_40xx)
READ8_MEMBER(a78_rom_pokey_device::read_40xx)
{
if (offset < 0x4000)
- return m_pokey->read(space, offset & 0x0f);
+ return m_pokey->read(offset & 0x0f);
if (offset + 0x4000 < m_base_rom)
return 0xff;
@@ -240,16 +240,16 @@ READ8_MEMBER(a78_rom_pokey_device::read_40xx)
WRITE8_MEMBER(a78_rom_pokey_device::write_40xx)
{
if (offset < 0x4000)
- m_pokey->write(space, offset & 0x0f, data);
+ m_pokey->write(offset & 0x0f, data);
}
// TO DO: do we need a PAL variant?!?
-MACHINE_CONFIG_START(a78_rom_pokey_device::device_add_mconfig)
+void a78_rom_pokey_device::device_add_mconfig(machine_config &config)
+{
SPEAKER(config, "addon").front_center();
- MCFG_DEVICE_ADD("pokey", POKEY, XTAL(14'318'181)/8)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "addon", 1.00)
-MACHINE_CONFIG_END
+ POKEY(config, m_pokey, XTAL(14'318'181)/8).add_route(ALL_OUTPUTS, "addon", 1.00);
+}
/*-------------------------------------------------
@@ -327,7 +327,7 @@ WRITE8_MEMBER(a78_rom_sg_device::write_40xx)
READ8_MEMBER(a78_rom_sg_pokey_device::read_40xx)
{
if (offset < 0x4000)
- return m_pokey->read(space, offset & 0x0f);
+ return m_pokey->read(offset & 0x0f);
else if (offset < 0x8000)
return m_rom[(offset & 0x3fff) + (m_bank * 0x4000)];
else
@@ -337,17 +337,17 @@ READ8_MEMBER(a78_rom_sg_pokey_device::read_40xx)
WRITE8_MEMBER(a78_rom_sg_pokey_device::write_40xx)
{
if (offset < 0x4000)
- m_pokey->write(space, offset & 0x0f, data);
+ m_pokey->write(offset & 0x0f, data);
else if (offset < 0x8000)
m_bank = data & m_bank_mask;
}
-MACHINE_CONFIG_START(a78_rom_sg_pokey_device::device_add_mconfig)
+void a78_rom_sg_pokey_device::device_add_mconfig(machine_config &config)
+{
SPEAKER(config, "addon").front_center();
- MCFG_DEVICE_ADD("pokey", POKEY, XTAL(14'318'181)/8)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "addon", 1.00)
-MACHINE_CONFIG_END
+ POKEY(config, m_pokey, XTAL(14'318'181)/8).add_route(ALL_OUTPUTS, "addon", 1.00);
+}
/*-------------------------------------------------
@@ -497,34 +497,33 @@ WRITE8_MEMBER(a78_rom_act_device::write_40xx)
// Machine configs for PCB variants with a POKEY at $0450
-MACHINE_CONFIG_START(a78_rom_p450_device::device_add_mconfig)
+void a78_rom_p450_device::device_add_mconfig(machine_config &config)
+{
SPEAKER(config, "pokey_450").front_center();
- MCFG_DEVICE_ADD("pokey450", POKEY, XTAL(14'318'181)/8)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "pokey_450", 1.00)
-MACHINE_CONFIG_END
+ POKEY(config, m_pokey450, XTAL(14'318'181)/8).add_route(ALL_OUTPUTS, "pokey_450", 1.00);
+}
-MACHINE_CONFIG_START(a78_rom_p450_pokey_device::device_add_mconfig)
+void a78_rom_p450_pokey_device::device_add_mconfig(machine_config &config)
+{
SPEAKER(config, "addon").front_center();
- MCFG_DEVICE_ADD("pokey", POKEY, XTAL(14'318'181)/8)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "addon", 1.00)
+ POKEY(config, m_pokey, XTAL(14'318'181)/8).add_route(ALL_OUTPUTS, "addon", 1.00);
- MCFG_DEVICE_ADD("pokey450", POKEY, XTAL(14'318'181)/8)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "addon", 1.00)
-MACHINE_CONFIG_END
+ POKEY(config, m_pokey450, XTAL(14'318'181)/8).add_route(ALL_OUTPUTS, "addon", 1.00);
+}
-MACHINE_CONFIG_START(a78_rom_p450_sg_ram_device::device_add_mconfig)
+void a78_rom_p450_sg_ram_device::device_add_mconfig(machine_config &config)
+{
SPEAKER(config, "pokey_450").front_center();
- MCFG_DEVICE_ADD("pokey450", POKEY, XTAL(14'318'181)/8)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "pokey_450", 1.00)
-MACHINE_CONFIG_END
+ POKEY(config, m_pokey450, XTAL(14'318'181)/8).add_route(ALL_OUTPUTS, "pokey_450", 1.00);
+}
-MACHINE_CONFIG_START(a78_rom_p450_sg9_device::device_add_mconfig)
+void a78_rom_p450_sg9_device::device_add_mconfig(machine_config &config)
+{
SPEAKER(config, "pokey_450").front_center();
- MCFG_DEVICE_ADD("pokey450", POKEY, XTAL(14'318'181)/8)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "pokey_450", 1.00)
-MACHINE_CONFIG_END
+ POKEY(config, m_pokey450, XTAL(14'318'181)/8).add_route(ALL_OUTPUTS, "pokey_450", 1.00);
+}
diff --git a/src/devices/bus/a7800/rom.h b/src/devices/bus/a7800/rom.h
index 406746c4e93..1ad27663b6f 100644
--- a/src/devices/bus/a7800/rom.h
+++ b/src/devices/bus/a7800/rom.h
@@ -197,8 +197,8 @@ public:
a78_rom_p450_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
// reading and writing
- virtual DECLARE_READ8_MEMBER(read_04xx) override { if (offset >= 0x50 && offset < 0x60) return m_pokey450->read(space, offset & 0x0f); else return 0xff; }
- virtual DECLARE_WRITE8_MEMBER(write_04xx) override { if (offset >= 0x50 && offset < 0x60) m_pokey450->write(space, offset & 0x0f, data); }
+ virtual DECLARE_READ8_MEMBER(read_04xx) override { if (offset >= 0x50 && offset < 0x60) return m_pokey450->read(offset & 0x0f); else return 0xff; }
+ virtual DECLARE_WRITE8_MEMBER(write_04xx) override { if (offset >= 0x50 && offset < 0x60) m_pokey450->write(offset & 0x0f, data); }
protected:
virtual void device_add_mconfig(machine_config &config) override;
@@ -216,8 +216,8 @@ public:
a78_rom_p450_pokey_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
// reading and writing
- virtual DECLARE_READ8_MEMBER(read_04xx) override { if (offset >= 0x50 && offset < 0x60) return m_pokey450->read(space, offset & 0x0f); else return 0xff; }
- virtual DECLARE_WRITE8_MEMBER(write_04xx) override { if (offset >= 0x50 && offset < 0x60) m_pokey450->write(space, offset & 0x0f, data); }
+ virtual DECLARE_READ8_MEMBER(read_04xx) override { if (offset >= 0x50 && offset < 0x60) return m_pokey450->read(offset & 0x0f); else return 0xff; }
+ virtual DECLARE_WRITE8_MEMBER(write_04xx) override { if (offset >= 0x50 && offset < 0x60) m_pokey450->write(offset & 0x0f, data); }
protected:
virtual void device_add_mconfig(machine_config &config) override;
@@ -235,8 +235,8 @@ public:
a78_rom_p450_sg_ram_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
// reading and writing
- virtual DECLARE_READ8_MEMBER(read_04xx) override { if (offset >= 0x50 && offset < 0x60) return m_pokey450->read(space, offset & 0x0f); else return 0xff; }
- virtual DECLARE_WRITE8_MEMBER(write_04xx) override { if (offset >= 0x50 && offset < 0x60) m_pokey450->write(space, offset & 0x0f, data); }
+ virtual DECLARE_READ8_MEMBER(read_04xx) override { if (offset >= 0x50 && offset < 0x60) return m_pokey450->read(offset & 0x0f); else return 0xff; }
+ virtual DECLARE_WRITE8_MEMBER(write_04xx) override { if (offset >= 0x50 && offset < 0x60) m_pokey450->write(offset & 0x0f, data); }
protected:
virtual void device_add_mconfig(machine_config &config) override;
@@ -254,8 +254,8 @@ public:
a78_rom_p450_sg9_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
// reading and writing
- virtual DECLARE_READ8_MEMBER(read_04xx) override { if (offset >= 0x50 && offset < 0x60) return m_pokey450->read(space, offset & 0x0f); else return 0xff; }
- virtual DECLARE_WRITE8_MEMBER(write_04xx) override { if (offset >= 0x50 && offset < 0x60) m_pokey450->write(space, offset & 0x0f, data); }
+ virtual DECLARE_READ8_MEMBER(read_04xx) override { if (offset >= 0x50 && offset < 0x60) return m_pokey450->read(offset & 0x0f); else return 0xff; }
+ virtual DECLARE_WRITE8_MEMBER(write_04xx) override { if (offset >= 0x50 && offset < 0x60) m_pokey450->write(offset & 0x0f, data); }
protected:
virtual void device_add_mconfig(machine_config &config) override;
diff --git a/src/devices/bus/a7800/xboard.cpp b/src/devices/bus/a7800/xboard.cpp
index d2e610f666e..0005e595a88 100644
--- a/src/devices/bus/a7800/xboard.cpp
+++ b/src/devices/bus/a7800/xboard.cpp
@@ -158,7 +158,7 @@ WRITE8_MEMBER(a78_xboard_device::write_40xx)
READ8_MEMBER(a78_xboard_device::read_04xx)
{
if (BIT(m_reg, 4) && offset >= 0x50 && offset < 0x60)
- return m_pokey->read(space, offset & 0x0f);
+ return m_pokey->read(offset & 0x0f);
else if (BIT(m_reg, 4) && offset >= 0x60 && offset < 0x70)
return m_xbslot->read_04xx(space, offset - 0x10); // access second POKEY
else
@@ -168,7 +168,7 @@ READ8_MEMBER(a78_xboard_device::read_04xx)
WRITE8_MEMBER(a78_xboard_device::write_04xx)
{
if (BIT(m_reg, 4) && offset >= 0x50 && offset < 0x60)
- m_pokey->write(space, offset & 0x0f, data);
+ m_pokey->write(offset & 0x0f, data);
else if (BIT(m_reg, 4) && offset >= 0x60 && offset < 0x70)
m_xbslot->write_04xx(space, offset - 0x10, data); // access second POKEY
else if (offset >= 0x70 && offset < 0x80)
@@ -203,9 +203,9 @@ READ8_MEMBER(a78_xm_device::read_30xx)
READ8_MEMBER(a78_xm_device::read_04xx)
{
if (BIT(m_reg, 4) && offset >= 0x50 && offset < 0x60)
- return m_pokey->read(space, offset & 0x0f);
+ return m_pokey->read(offset & 0x0f);
else if (m_ym_enabled && offset >= 0x60 && offset <= 0x61)
- return m_ym->read(space, offset & 1);
+ return m_ym->read(offset & 1);
else if (BIT(m_reg, 4) && offset >= 0x60 && offset < 0x70)
return m_xbslot->read_04xx(space, offset - 0x10); // access second POKEY
else
@@ -215,9 +215,9 @@ READ8_MEMBER(a78_xm_device::read_04xx)
WRITE8_MEMBER(a78_xm_device::write_04xx)
{
if (BIT(m_reg, 4) && offset >= 0x50 && offset < 0x60)
- m_pokey->write(space, offset & 0x0f, data);
+ m_pokey->write(offset & 0x0f, data);
else if (m_ym_enabled && offset >= 0x60 && offset <= 0x61)
- m_ym->write(space, offset & 1, data);
+ m_ym->write(offset & 1, data);
else if (BIT(m_reg, 4) && offset >= 0x60 && offset < 0x70)
m_xbslot->write_04xx(space, offset - 0x10, data); // access second POKEY
else if (offset >= 0x70 && offset < 0x80)
diff --git a/src/devices/bus/a800/cassette.cpp b/src/devices/bus/a800/cassette.cpp
index 1545cf434c7..fb08819e5ae 100644
--- a/src/devices/bus/a800/cassette.cpp
+++ b/src/devices/bus/a800/cassette.cpp
@@ -28,12 +28,13 @@ TODO:
DEFINE_DEVICE_TYPE(A8SIO_CASSETTE, a8sio_cassette_device, "a8sio_cass", "Atari 8 bit cassette")
const device_timer_id TIMER_CASSETTE_READ = 1;
-MACHINE_CONFIG_START(a8sio_cassette_device::device_add_mconfig)
- MCFG_CASSETTE_ADD("cassette")
- //MCFG_CASSETTE_DEFAULT_STATE(CASSETTE_STOPPED)
- MCFG_CASSETTE_DEFAULT_STATE(CASSETTE_PLAY)
- MCFG_CASSETTE_INTERFACE("atari8bit_cass")
-MACHINE_CONFIG_END
+void a8sio_cassette_device::device_add_mconfig(machine_config &config)
+{
+ CASSETTE(config, m_cassette);
+ //m_cassette->set_default_state(CASSETTE_STOPPED);
+ m_cassette->set_default_state(CASSETTE_PLAY);
+ m_cassette->set_interface("atari8bit_cass");
+}
//**************************************************************************
// LIVE DEVICE
diff --git a/src/devices/bus/abcbus/abc890.cpp b/src/devices/bus/abcbus/abc890.cpp
index 4807a09a9f5..27530439929 100644
--- a/src/devices/bus/abcbus/abc890.cpp
+++ b/src/devices/bus/abcbus/abc890.cpp
@@ -27,89 +27,95 @@ DEFINE_DEVICE_TYPE(ABC856, abc856_device, "abc856", "ABC
// device_add_mconfig - add device configuration
//-------------------------------------------------
-MACHINE_CONFIG_START(abc890_device::device_add_mconfig)
- MCFG_ABCBUS_SLOT_ADD("io1", abcbus_cards, nullptr)
- MCFG_ABCBUS_SLOT_ADD("io2", abcbus_cards, nullptr)
- MCFG_ABCBUS_SLOT_ADD("io3", abcbus_cards, nullptr)
- MCFG_ABCBUS_SLOT_ADD("io4", abcbus_cards, nullptr)
- MCFG_ABCBUS_SLOT_ADD("mem1", abcbus_cards, nullptr)
- MCFG_ABCBUS_SLOT_ADD("mem2", abcbus_cards, nullptr)
- MCFG_ABCBUS_SLOT_ADD("mem3", abcbus_cards, nullptr)
-MACHINE_CONFIG_END
+void abc890_device::device_add_mconfig(machine_config &config)
+{
+ ABCBUS_SLOT(config, "io1", DERIVED_CLOCK(1, 1), abcbus_cards, nullptr);
+ ABCBUS_SLOT(config, "io2", DERIVED_CLOCK(1, 1), abcbus_cards, nullptr);
+ ABCBUS_SLOT(config, "io3", DERIVED_CLOCK(1, 1), abcbus_cards, nullptr);
+ ABCBUS_SLOT(config, "io4", DERIVED_CLOCK(1, 1), abcbus_cards, nullptr);
+ ABCBUS_SLOT(config, "mem1", DERIVED_CLOCK(1, 1), abcbus_cards, nullptr);
+ ABCBUS_SLOT(config, "mem2", DERIVED_CLOCK(1, 1), abcbus_cards, nullptr);
+ ABCBUS_SLOT(config, "mem3", DERIVED_CLOCK(1, 1), abcbus_cards, nullptr);
+}
//-------------------------------------------------
// device_add_mconfig - add device configuration
//-------------------------------------------------
-MACHINE_CONFIG_START(abc_expansion_unit_device::device_add_mconfig)
- MCFG_ABCBUS_SLOT_ADD("io1", abc80_cards, "abc830")
- MCFG_ABCBUS_SLOT_ADD("io2", abc80_cards, nullptr)
- MCFG_ABCBUS_SLOT_ADD("io3", abc80_cards, nullptr)
- MCFG_ABCBUS_SLOT_ADD("io4", abc80_cards, nullptr)
- MCFG_ABCBUS_SLOT_ADD("mem1", abc80_cards, "memcard")
- MCFG_ABCBUS_SLOT_ADD("mem2", abc80_cards, "16k")
- MCFG_ABCBUS_SLOT_ADD("mem3", abc80_cards, nullptr)
-MACHINE_CONFIG_END
+void abc_expansion_unit_device::device_add_mconfig(machine_config &config)
+{
+ ABCBUS_SLOT(config, "io1", DERIVED_CLOCK(1, 1), abc80_cards, "abc830");
+ ABCBUS_SLOT(config, "io2", DERIVED_CLOCK(1, 1), abc80_cards, nullptr);
+ ABCBUS_SLOT(config, "io3", DERIVED_CLOCK(1, 1), abc80_cards, nullptr);
+ ABCBUS_SLOT(config, "io4", DERIVED_CLOCK(1, 1), abc80_cards, nullptr);
+ ABCBUS_SLOT(config, "mem1", DERIVED_CLOCK(1, 1), abc80_cards, "memcard");
+ ABCBUS_SLOT(config, "mem2", DERIVED_CLOCK(1, 1), abc80_cards, "16k");
+ ABCBUS_SLOT(config, "mem3", DERIVED_CLOCK(1, 1), abc80_cards, nullptr);
+}
//-------------------------------------------------
// device_add_mconfig - add device configuration
//-------------------------------------------------
-MACHINE_CONFIG_START(abc894_device::device_add_mconfig)
- MCFG_ABCBUS_SLOT_ADD("io1", abcbus_cards, nullptr)
- MCFG_ABCBUS_SLOT_ADD("io2", abcbus_cards, nullptr)
- MCFG_ABCBUS_SLOT_ADD("io3", abcbus_cards, nullptr)
-MACHINE_CONFIG_END
+void abc894_device::device_add_mconfig(machine_config &config)
+{
+ ABCBUS_SLOT(config, "io1", DERIVED_CLOCK(1, 1), abcbus_cards, nullptr);
+ ABCBUS_SLOT(config, "io2", DERIVED_CLOCK(1, 1), abcbus_cards, nullptr);
+ ABCBUS_SLOT(config, "io3", DERIVED_CLOCK(1, 1), abcbus_cards, nullptr);
+}
//-------------------------------------------------
// device_add_mconfig - add device configuration
//-------------------------------------------------
-MACHINE_CONFIG_START(abc850_device::device_add_mconfig)
- MCFG_ABCBUS_SLOT_ADD("io1", abcbus_cards, "abc850fdd")
- MCFG_ABCBUS_SLOT_ADD("io2", abcbus_cards, "xebec")
- MCFG_SLOT_OPTION_DEFAULT_BIOS("xebec", "ro202")
- MCFG_ABCBUS_SLOT_ADD("io3", abcbus_cards, nullptr)
- MCFG_ABCBUS_SLOT_ADD("io4", abcbus_cards, nullptr)
- MCFG_ABCBUS_SLOT_ADD("io5", abcbus_cards, nullptr)
- MCFG_ABCBUS_SLOT_ADD("io6", abcbus_cards, nullptr)
- MCFG_ABCBUS_SLOT_ADD("io7", abcbus_cards, nullptr)
-MACHINE_CONFIG_END
+void abc850_device::device_add_mconfig(machine_config &config)
+{
+ ABCBUS_SLOT(config, "io1", DERIVED_CLOCK(1, 1), abcbus_cards, "abc850fdd");
+ ABCBUS_SLOT(config, "io2", DERIVED_CLOCK(1, 1), abcbus_cards, "xebec")
+ .set_option_default_bios("xebec", "ro202");
+ ABCBUS_SLOT(config, "io3", DERIVED_CLOCK(1, 1), abcbus_cards, nullptr);
+ ABCBUS_SLOT(config, "io4", DERIVED_CLOCK(1, 1), abcbus_cards, nullptr);
+ ABCBUS_SLOT(config, "io5", DERIVED_CLOCK(1, 1), abcbus_cards, nullptr);
+ ABCBUS_SLOT(config, "io6", DERIVED_CLOCK(1, 1), abcbus_cards, nullptr);
+ ABCBUS_SLOT(config, "io7", DERIVED_CLOCK(1, 1), abcbus_cards, nullptr);
+}
//-------------------------------------------------
// device_add_mconfig - add device configuration
//-------------------------------------------------
-MACHINE_CONFIG_START(abc852_device::device_add_mconfig)
- MCFG_ABCBUS_SLOT_ADD("io1", abcbus_cards, "abc850fdd")
- MCFG_ABCBUS_SLOT_ADD("io2", abcbus_cards, "xebec")
- MCFG_SLOT_OPTION_DEFAULT_BIOS("xebec", "basf6185")
- MCFG_ABCBUS_SLOT_ADD("io3", abcbus_cards, nullptr)
- MCFG_ABCBUS_SLOT_ADD("io4", abcbus_cards, nullptr)
- MCFG_ABCBUS_SLOT_ADD("io5", abcbus_cards, nullptr)
- MCFG_ABCBUS_SLOT_ADD("io6", abcbus_cards, nullptr)
- MCFG_ABCBUS_SLOT_ADD("io7", abcbus_cards, nullptr)
-MACHINE_CONFIG_END
+void abc852_device::device_add_mconfig(machine_config &config)
+{
+ ABCBUS_SLOT(config, "io1", DERIVED_CLOCK(1, 1), abcbus_cards, "abc850fdd");
+ ABCBUS_SLOT(config, "io2", DERIVED_CLOCK(1, 1), abcbus_cards, "xebec")
+ .set_option_default_bios("xebec", "basf6185");
+ ABCBUS_SLOT(config, "io3", DERIVED_CLOCK(1, 1), abcbus_cards, nullptr);
+ ABCBUS_SLOT(config, "io4", DERIVED_CLOCK(1, 1), abcbus_cards, nullptr);
+ ABCBUS_SLOT(config, "io5", DERIVED_CLOCK(1, 1), abcbus_cards, nullptr);
+ ABCBUS_SLOT(config, "io6", DERIVED_CLOCK(1, 1), abcbus_cards, nullptr);
+ ABCBUS_SLOT(config, "io7", DERIVED_CLOCK(1, 1), abcbus_cards, nullptr);
+}
//-------------------------------------------------
// device_add_mconfig - add device configuration
//-------------------------------------------------
-MACHINE_CONFIG_START(abc856_device::device_add_mconfig)
- MCFG_ABCBUS_SLOT_ADD("io1", abcbus_cards, "abc850fdd")
- MCFG_ABCBUS_SLOT_ADD("io2", abcbus_cards, "xebec")
- MCFG_SLOT_OPTION_DEFAULT_BIOS("xebec", "micr1325")
- MCFG_ABCBUS_SLOT_ADD("io3", abcbus_cards, nullptr)
- MCFG_ABCBUS_SLOT_ADD("io4", abcbus_cards, nullptr)
- MCFG_ABCBUS_SLOT_ADD("io5", abcbus_cards, nullptr)
- MCFG_ABCBUS_SLOT_ADD("io6", abcbus_cards, nullptr)
- MCFG_ABCBUS_SLOT_ADD("io7", abcbus_cards, nullptr)
-MACHINE_CONFIG_END
+void abc856_device::device_add_mconfig(machine_config &config)
+{
+ ABCBUS_SLOT(config, "io1", DERIVED_CLOCK(1, 1), abcbus_cards, "abc850fdd");
+ ABCBUS_SLOT(config, "io2", DERIVED_CLOCK(1, 1), abcbus_cards, "xebec")
+ .set_option_default_bios("xebec", "micr1325");
+ ABCBUS_SLOT(config, "io3", DERIVED_CLOCK(1, 1), abcbus_cards, nullptr);
+ ABCBUS_SLOT(config, "io4", DERIVED_CLOCK(1, 1), abcbus_cards, nullptr);
+ ABCBUS_SLOT(config, "io5", DERIVED_CLOCK(1, 1), abcbus_cards, nullptr);
+ ABCBUS_SLOT(config, "io6", DERIVED_CLOCK(1, 1), abcbus_cards, nullptr);
+ ABCBUS_SLOT(config, "io7", DERIVED_CLOCK(1, 1), abcbus_cards, nullptr);
+}
diff --git a/src/devices/bus/abcbus/abcbus.h b/src/devices/bus/abcbus/abcbus.h
index 5bd338b05d7..2388fbc73cf 100644
--- a/src/devices/bus/abcbus/abcbus.h
+++ b/src/devices/bus/abcbus/abcbus.h
@@ -111,47 +111,6 @@
//**************************************************************************
-// INTERFACE CONFIGURATION MACROS
-//**************************************************************************
-
-#define MCFG_ABCBUS_SLOT_ADD(_tag, _slot_intf, _def_slot) \
- MCFG_DEVICE_ADD(_tag, ABCBUS_SLOT, 0) \
- MCFG_DEVICE_SLOT_INTERFACE(_slot_intf, _def_slot, false)
-
-
-#define MCFG_ABCBUS_SLOT_IRQ_CALLBACK(_irq) \
- downcast<abcbus_slot_device *>(device)->set_irq_callback(DEVCB_##_irq);
-
-#define MCFG_ABCBUS_SLOT_NMI_CALLBACK(_nmi) \
- downcast<abcbus_slot_device *>(device)->set_nmi_callback(DEVCB_##_nmi);
-
-#define MCFG_ABCBUS_SLOT_RDY_CALLBACK(_rdy) \
- downcast<abcbus_slot_device *>(device)->set_rdy_callback(DEVCB_##_rdy);
-
-#define MCFG_ABCBUS_SLOT_RESIN_CALLBACK(_resin) \
- downcast<abcbus_slot_device *>(device)->set_resin_callback(DEVCB_##_resin);
-
-#define MCFG_ABCBUS_SLOT_PREN_CALLBACK(_pren) \
- downcast<abcbus_slot_device *>(device)->set_pren_callback(DEVCB_##_pren);
-
-#define MCFG_ABCBUS_SLOT_TRRQ_CALLBACK(_trrq) \
- downcast<abcbus_slot_device *>(device)->set_trrq_callback(DEVCB_##_trrq);
-
-#define MCFG_ABCBUS_SLOT_XINT2_CALLBACK(_xint2) \
- downcast<abcbus_slot_device *>(device)->set_xint2_callback(DEVCB_##_xint2);
-
-#define MCFG_ABCBUS_SLOT_XINT3_CALLBACK(_xint3) \
- downcast<abcbus_slot_device *>(device)->set_xint3_callback(DEVCB_##_xint3);
-
-#define MCFG_ABCBUS_SLOT_XINT4_CALLBACK(_xint4) \
- downcast<abcbus_slot_device *>(device)->set_xint4_callback(DEVCB_##_xint4);
-
-#define MCFG_ABCBUS_SLOT_XINT5_CALLBACK(_xint5) \
- downcast<abcbus_slot_device *>(device)->set_xint5_callback(DEVCB_##_xint5);
-
-
-
-//**************************************************************************
// TYPE DEFINITIONS
//**************************************************************************
@@ -207,17 +166,26 @@ class abcbus_slot_device : public device_t,
public:
// construction/destruction
abcbus_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
-
- template <class Object> devcb_base &set_irq_callback(Object &&cb) { return m_write_irq.set_callback(std::forward<Object>(cb)); }
- template <class Object> devcb_base &set_nmi_callback(Object &&cb) { return m_write_nmi.set_callback(std::forward<Object>(cb)); }
- template <class Object> devcb_base &set_rdy_callback(Object &&cb) { return m_write_rdy.set_callback(std::forward<Object>(cb)); }
- template <class Object> devcb_base &set_resin_callback(Object &&cb) { return m_write_resin.set_callback(std::forward<Object>(cb)); }
- template <class Object> devcb_base &set_pren_callback(Object &&cb) { return m_write_pren.set_callback(std::forward<Object>(cb)); }
- template <class Object> devcb_base &set_trrq_callback(Object &&cb) { return m_write_trrq.set_callback(std::forward<Object>(cb)); }
- template <class Object> devcb_base &set_xint2_callback(Object &&cb) { return m_write_xint2.set_callback(std::forward<Object>(cb)); }
- template <class Object> devcb_base &set_xint3_callback(Object &&cb) { return m_write_xint3.set_callback(std::forward<Object>(cb)); }
- template <class Object> devcb_base &set_xint4_callback(Object &&cb) { return m_write_xint4.set_callback(std::forward<Object>(cb)); }
- template <class Object> devcb_base &set_xint5_callback(Object &&cb) { return m_write_xint5.set_callback(std::forward<Object>(cb)); }
+ template <typename T>
+ abcbus_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock, T &&opts, const char *dflt)
+ : abcbus_slot_device(mconfig, tag, owner, clock)
+ {
+ option_reset();
+ opts(*this);
+ set_default_option(dflt);
+ set_fixed(false);
+ }
+
+ auto irq_callback() { return m_write_irq.bind(); }
+ auto nmi_callback() { return m_write_nmi.bind(); }
+ auto rdy_callback() { return m_write_rdy.bind(); }
+ auto resin_callback() { return m_write_resin.bind(); }
+ auto pren_callback() { return m_write_pren.bind(); }
+ auto trrq_callback() { return m_write_trrq.bind(); }
+ auto xint2_callback() { return m_write_xint2.bind(); }
+ auto xint3_callback() { return m_write_xint3.bind(); }
+ auto xint4_callback() { return m_write_xint4.bind(); }
+ auto xint5_callback() { return m_write_xint5.bind(); }
// computer interface
void write_cs(uint8_t data) { if (m_card) m_card->abcbus_cs(data); }
diff --git a/src/devices/bus/abcbus/cadmouse.cpp b/src/devices/bus/abcbus/cadmouse.cpp
index 9cee7326cf4..7a4d90916f9 100644
--- a/src/devices/bus/abcbus/cadmouse.cpp
+++ b/src/devices/bus/abcbus/cadmouse.cpp
@@ -125,11 +125,12 @@ void abc_cadmouse_device::abc_cadmouse_io(address_map &map)
// device_add_mconfig - add device configuration
//-------------------------------------------------
-MACHINE_CONFIG_START(abc_cadmouse_device::device_add_mconfig)
- MCFG_DEVICE_ADD(Z80_TAG, Z80, XTAL(8'000'000)/2)
- MCFG_DEVICE_PROGRAM_MAP(abc_cadmouse_mem)
- MCFG_DEVICE_IO_MAP(abc_cadmouse_io)
-MACHINE_CONFIG_END
+void abc_cadmouse_device::device_add_mconfig(machine_config &config)
+{
+ Z80(config, m_maincpu, XTAL(8'000'000)/2);
+ m_maincpu->set_addrmap(AS_PROGRAM, &abc_cadmouse_device::abc_cadmouse_mem);
+ m_maincpu->set_addrmap(AS_IO, &abc_cadmouse_device::abc_cadmouse_io);
+}
//**************************************************************************
// LIVE DEVICE
diff --git a/src/devices/bus/abcbus/db411223.cpp b/src/devices/bus/abcbus/db411223.cpp
index d9d2906f6d6..86ba1f22ee9 100644
--- a/src/devices/bus/abcbus/db411223.cpp
+++ b/src/devices/bus/abcbus/db411223.cpp
@@ -68,11 +68,12 @@ void databoard_4112_23_t::databoard_4112_23_io(address_map &map)
// device_add_mconfig - add device configuration
//-------------------------------------------------
-MACHINE_CONFIG_START(databoard_4112_23_t::device_add_mconfig)
- MCFG_DEVICE_ADD(Z80_TAG, Z80, 4000000)
- MCFG_DEVICE_PROGRAM_MAP(databoard_4112_23_mem)
- MCFG_DEVICE_IO_MAP(databoard_4112_23_io)
-MACHINE_CONFIG_END
+void databoard_4112_23_t::device_add_mconfig(machine_config &config)
+{
+ Z80(config, m_maincpu, 4000000);
+ m_maincpu->set_addrmap(AS_PROGRAM, &databoard_4112_23_t::databoard_4112_23_mem);
+ m_maincpu->set_addrmap(AS_IO, &databoard_4112_23_t::databoard_4112_23_io);
+}
//-------------------------------------------------
diff --git a/src/devices/bus/abcbus/unidisk.cpp b/src/devices/bus/abcbus/unidisk.cpp
index 0d5968aa71b..0b068000193 100644
--- a/src/devices/bus/abcbus/unidisk.cpp
+++ b/src/devices/bus/abcbus/unidisk.cpp
@@ -73,11 +73,12 @@ void unidisk_t::unidisk_io(address_map &map)
// device_add_mconfig - add device configuration
//-------------------------------------------------
-MACHINE_CONFIG_START(unidisk_t::device_add_mconfig)
+void unidisk_t::device_add_mconfig(machine_config &config)
+{
TMS9995(config, m_maincpu, 12000000);
m_maincpu->set_addrmap(AS_PROGRAM, &unidisk_t::unidisk_mem);
m_maincpu->set_addrmap(AS_IO, &unidisk_t::unidisk_io);
-MACHINE_CONFIG_END
+}
//-------------------------------------------------
diff --git a/src/devices/bus/abckb/abc77.cpp b/src/devices/bus/abckb/abc77.cpp
index 87acedf4fb8..996a5af23c9 100644
--- a/src/devices/bus/abckb/abc77.cpp
+++ b/src/devices/bus/abckb/abc77.cpp
@@ -129,7 +129,8 @@ DISCRETE_SOUND_END
// device_add_mconfig - add device configuration
//-------------------------------------------------
-MACHINE_CONFIG_START(abc77_device::device_add_mconfig)
+void abc77_device::device_add_mconfig(machine_config &config)
+{
// keyboard cpu
I8035(config, m_maincpu, XTAL(4'608'000));
m_maincpu->set_addrmap(AS_PROGRAM, &abc77_device::abc77_map);
@@ -144,9 +145,8 @@ MACHINE_CONFIG_START(abc77_device::device_add_mconfig)
// discrete sound
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD(DISCRETE_TAG, DISCRETE, abc77_discrete)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.80)
-MACHINE_CONFIG_END
+ DISCRETE(config, m_discrete, abc77_discrete).add_route(ALL_OUTPUTS, "mono", 0.80);
+}
//-------------------------------------------------
diff --git a/src/devices/bus/abckb/abc99.cpp b/src/devices/bus/abckb/abc99.cpp
index 6782fbd8a59..4b49e73548e 100644
--- a/src/devices/bus/abckb/abc99.cpp
+++ b/src/devices/bus/abckb/abc99.cpp
@@ -169,7 +169,7 @@ void abc99_device::device_add_mconfig(machine_config &config)
m_mousecpu->set_addrmap(AS_PROGRAM, &abc99_device::abc99_z5_mem);
//m_mousecpu->p1_in_cb().set(FUNC(abc99_device::z5_p1_r));
//m_mousecpu->p2_out_cb().set(FUNC(abc99_device::z5_p2_w));
- //MCFG_MCS48_PORT_T0_CLK_CUSTOM() // Z2 CLK
+ //m_mousecpu->set_t0_clk_cb(); // Z2 CLK
//m_mousecpu->t1_in_cb().set(FUNC(abc99_device::z5_t1_r));
m_mousecpu->set_disable(); // HACK fix for broken serial I/O
diff --git a/src/devices/bus/abckb/abckb.h b/src/devices/bus/abckb/abckb.h
index 7ec223fc942..d7ab8b6162a 100644
--- a/src/devices/bus/abckb/abckb.h
+++ b/src/devices/bus/abckb/abckb.h
@@ -12,27 +12,6 @@
#pragma once
-
-
-//**************************************************************************
-// INTERFACE CONFIGURATION MACROS
-//**************************************************************************
-
-#define MCFG_ABC_KEYBOARD_PORT_ADD(_tag, _def_slot) \
- MCFG_DEVICE_ADD(_tag, ABC_KEYBOARD_PORT, 0) \
- MCFG_DEVICE_SLOT_INTERFACE(abc_keyboard_devices, _def_slot, false)
-
-#define MCFG_ABC_KEYBOARD_OUT_RX_HANDLER(_devcb) \
- downcast<abc_keyboard_port_device &>(*device).set_out_rx_handler(DEVCB_##_devcb);
-
-#define MCFG_ABC_KEYBOARD_OUT_TRXC_HANDLER(_devcb) \
- downcast<abc_keyboard_port_device &>(*device).set_out_trxc_handler(DEVCB_##_devcb);
-
-#define MCFG_ABC_KEYBOARD_OUT_KEYDOWN_HANDLER(_devcb) \
- downcast<abc_keyboard_port_device &>(*device).set_out_keydown_handler(DEVCB_##_devcb);
-
-
-
//**************************************************************************
// TYPE DEFINITIONS
//**************************************************************************
@@ -43,11 +22,21 @@ class abc_keyboard_port_device : public device_t, public device_slot_interface
{
public:
// construction/destruction
- abc_keyboard_port_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
-
- template <class Object> devcb_base &set_out_rx_handler(Object &&cb) { return m_out_rx_handler.set_callback(std::forward<Object>(cb)); }
- template <class Object> devcb_base &set_out_trxc_handler(Object &&cb) { return m_out_trxc_handler.set_callback(std::forward<Object>(cb)); }
- template <class Object> devcb_base &set_out_keydown_handler(Object &&cb) { return m_out_keydown_handler.set_callback(std::forward<Object>(cb)); }
+ template <typename T>
+ abc_keyboard_port_device(machine_config const &mconfig, char const *tag, device_t *owner, T &&opts, char const *dflt)
+ : abc_keyboard_port_device(mconfig, tag, owner, 0)
+ {
+ option_reset();
+ opts(*this);
+ set_default_option(dflt);
+ set_fixed(false);
+ }
+
+ abc_keyboard_port_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock = 0);
+
+ auto out_rx_handler() { return m_out_rx_handler.bind(); }
+ auto out_trxc_handler() { return m_out_trxc_handler.bind(); }
+ auto out_keydown_handler() { return m_out_keydown_handler.bind(); }
// computer interface
DECLARE_WRITE_LINE_MEMBER( txd_w );
diff --git a/src/devices/bus/acorn/atom/discpack.cpp b/src/devices/bus/acorn/atom/discpack.cpp
index 63a29d403f1..fd33ec293a6 100644
--- a/src/devices/bus/acorn/atom/discpack.cpp
+++ b/src/devices/bus/acorn/atom/discpack.cpp
@@ -84,7 +84,7 @@ void atom_discpack_device::device_start()
address_space &space = m_bus->memspace();
space.install_device(0x0a00, 0x0a03, *m_fdc, &i8271_device::map);
- space.install_readwrite_handler(0x0a04, 0x0a04, 0, 0x1f8, 0, read8_delegate(FUNC(i8271_device::data_r), m_fdc.target()), write8_delegate(FUNC(i8271_device::data_w), m_fdc.target()));
+ space.install_readwrite_handler(0x0a04, 0x0a04, 0, 0x1f8, 0, read8smo_delegate(FUNC(i8271_device::data_r), m_fdc.target()), write8smo_delegate(FUNC(i8271_device::data_w), m_fdc.target()));
space.install_ram(0x2000, 0x23ff);
space.install_ram(0x2400, 0x27ff);
space.install_ram(0x3c00, 0x3fff);
diff --git a/src/devices/bus/acorn/atom/econet.cpp b/src/devices/bus/acorn/atom/econet.cpp
index 210ca895445..5051fd0e8e7 100644
--- a/src/devices/bus/acorn/atom/econet.cpp
+++ b/src/devices/bus/acorn/atom/econet.cpp
@@ -63,7 +63,7 @@ void atom_econet_device::device_start()
{
address_space &space = m_bus->memspace();
- space.install_readwrite_handler(0xb400, 0xb403, read8_delegate(FUNC(mc6854_device::read), m_adlc.target()), write8_delegate(FUNC(mc6854_device::write), m_adlc.target()));
+ space.install_readwrite_handler(0xb400, 0xb403, read8sm_delegate(FUNC(mc6854_device::read), m_adlc.target()), write8sm_delegate(FUNC(mc6854_device::write), m_adlc.target()));
space.install_read_handler(0xb404, 0xb404, read8_delegate(FUNC(atom_econet_device::statid_r), this));
}
diff --git a/src/devices/bus/acorn/atom/sid.cpp b/src/devices/bus/acorn/atom/sid.cpp
index 950f4de2c58..8b5cd738cfe 100644
--- a/src/devices/bus/acorn/atom/sid.cpp
+++ b/src/devices/bus/acorn/atom/sid.cpp
@@ -55,5 +55,5 @@ void atom_sid_device::device_start()
{
address_space &space = m_bus->memspace();
- space.install_readwrite_handler(0xbdc0, 0xbddf, read8_delegate(FUNC(mos6581_device::read), m_sid.target()), write8_delegate(FUNC(mos6581_device::write), m_sid.target()));
+ space.install_readwrite_handler(0xbdc0, 0xbddf, read8sm_delegate(FUNC(mos6581_device::read), m_sid.target()), write8sm_delegate(FUNC(mos6581_device::write), m_sid.target()));
}
diff --git a/src/devices/bus/acorn/bus.cpp b/src/devices/bus/acorn/bus.cpp
index ed759be82af..2ecb509c30f 100644
--- a/src/devices/bus/acorn/bus.cpp
+++ b/src/devices/bus/acorn/bus.cpp
@@ -80,7 +80,7 @@ DEFINE_DEVICE_TYPE(ACORN_BUS, acorn_bus_device, "acorn_bus", "Acorn Bus")
acorn_bus_device::acorn_bus_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
: device_t(mconfig, ACORN_BUS, tag, owner, clock)
- , m_maincpu(*this, finder_base::DUMMY_TAG)
+ , m_space(*this, finder_base::DUMMY_TAG, -1)
, m_out_irq_cb(*this)
, m_out_nmi_cb(*this)
{
diff --git a/src/devices/bus/acorn/bus.h b/src/devices/bus/acorn/bus.h
index 9ebcafdad73..149da10d447 100644
--- a/src/devices/bus/acorn/bus.h
+++ b/src/devices/bus/acorn/bus.h
@@ -64,11 +64,11 @@ public:
acorn_bus_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
// inline configuration
- template <typename T> void set_cputag(T &&tag) { m_maincpu.set_tag(std::forward<T>(tag)); }
+ template <typename T> void set_space(T &&tag, int spacenum) { m_space.set_tag(std::forward<T>(tag), spacenum); }
auto out_irq_callback() { return m_out_irq_cb.bind(); }
auto out_nmi_callback() { return m_out_nmi_cb.bind(); }
- address_space &memspace() const { return m_maincpu->space(AS_PROGRAM); }
+ address_space &memspace() const { return *m_space; }
DECLARE_WRITE_LINE_MEMBER(irq_w);
DECLARE_WRITE_LINE_MEMBER(nmi_w);
@@ -81,7 +81,7 @@ protected:
virtual void device_reset() override;
// internal state
- required_device<cpu_device> m_maincpu;
+ required_address_space m_space;
devcb_write_line m_out_irq_cb;
devcb_write_line m_out_nmi_cb;
diff --git a/src/devices/bus/acorn/cms/4080term.cpp b/src/devices/bus/acorn/cms/4080term.cpp
index 0bf9cf5a7ea..7bb64493481 100644
--- a/src/devices/bus/acorn/cms/4080term.cpp
+++ b/src/devices/bus/acorn/cms/4080term.cpp
@@ -68,22 +68,23 @@ DEVICE_INPUT_DEFAULTS_END
// device_add_mconfig - add device configuration
//-------------------------------------------------
-MACHINE_CONFIG_START(cms_4080term_device::device_add_mconfig)
+void cms_4080term_device::device_add_mconfig(machine_config &config)
+{
/* video hardware */
- device = &SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
m_screen->set_refresh_hz(50);
m_screen->set_size(768, 312);
m_screen->set_visarea(0, 492 - 1, 0, 270 - 1);
- MCFG_SCREEN_UPDATE_DEVICE("ef9345", ef9345_device, screen_update)
+ m_screen->set_screen_update("ef9345", FUNC(ef9345_device::screen_update));
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_cms_4080term)
- MCFG_PALETTE_ADD("palette", 8)
+ GFXDECODE(config, "gfxdecode", "palette", gfx_cms_4080term);
+ PALETTE(config, "palette").set_entries(8);
EF9345(config, m_ef9345, 0);
m_ef9345->set_screen("screen");
m_ef9345->set_palette_tag("palette");
- MCFG_TIMER_DRIVER_ADD_SCANLINE("scantimer", cms_4080term_device, update_scanline, "screen", 0, 10)
+ TIMER(config, "scantimer").configure_scanline(FUNC(cms_4080term_device::update_scanline), "screen", 0, 10);
VIA6522(config, m_via, 1_MHz_XTAL);
m_via->writepa_handler().set("cent_data_out", FUNC(output_latch_device::bus_w));
@@ -107,8 +108,9 @@ MACHINE_CONFIG_START(cms_4080term_device::device_add_mconfig)
/* printer */
CENTRONICS(config, m_centronics, centronics_devices, "printer");
m_centronics->ack_handler().set(m_via, FUNC(via6522_device::write_ca1));
- MCFG_CENTRONICS_OUTPUT_LATCH_ADD("cent_data_out", "centronics")
-MACHINE_CONFIG_END
+ output_latch_device &cent_data_out(OUTPUT_LATCH(config, "cent_data_out"));
+ m_centronics->set_output_latch(cent_data_out);
+}
const tiny_rom_entry *cms_4080term_device::device_rom_region() const
@@ -145,9 +147,9 @@ void cms_4080term_device::device_start()
{
address_space &space = m_bus->memspace();
- space.install_readwrite_handler(0xfd20, 0xfd2f, read8_delegate(FUNC(ef9345_device::data_r), m_ef9345.target()), write8_delegate(FUNC(ef9345_device::data_w), m_ef9345.target()));
+ space.install_readwrite_handler(0xfd20, 0xfd2f, read8sm_delegate(FUNC(ef9345_device::data_r), m_ef9345.target()), write8sm_delegate(FUNC(ef9345_device::data_w), m_ef9345.target()));
space.install_readwrite_handler(0xfd30, 0xfd3f, read8sm_delegate(FUNC(via6522_device::read), m_via.target()), write8sm_delegate(FUNC(via6522_device::write), m_via.target()));
- space.install_readwrite_handler(0xfd40, 0xfd4f, read8_delegate(FUNC(mos6551_device::read), m_acia.target()), write8_delegate(FUNC(mos6551_device::write), m_acia.target()));
+ space.install_readwrite_handler(0xfd40, 0xfd4f, read8sm_delegate(FUNC(mos6551_device::read), m_acia.target()), write8sm_delegate(FUNC(mos6551_device::write), m_acia.target()));
uint8_t *FNT = memregion("ef9345")->base();
uint16_t dest = 0x2000;
diff --git a/src/devices/bus/acorn/cms/hires.cpp b/src/devices/bus/acorn/cms/hires.cpp
index d15032bd30c..9e6e169737b 100644
--- a/src/devices/bus/acorn/cms/hires.cpp
+++ b/src/devices/bus/acorn/cms/hires.cpp
@@ -25,23 +25,24 @@ DEFINE_DEVICE_TYPE(CMS_HIRES, cms_hires_device, "cms_hires", "CMS High Resolutio
// device_add_mconfig - add device configuration
//-------------------------------------------------
-MACHINE_CONFIG_START(cms_hires_device::device_add_mconfig)
+void cms_hires_device::device_add_mconfig(machine_config &config)
+{
/* video hardware */
- device = &SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
m_screen->set_size(512, 312);
m_screen->set_visarea(0, 512 - 1, 0, 256 - 1);
m_screen->set_refresh_hz(50);
- MCFG_SCREEN_UPDATE_DEVICE("ef9366", ef9365_device, screen_update)
- MCFG_PALETTE_ADD("palette", 16)
+ m_screen->set_screen_update("ef9366", FUNC(ef9365_device::screen_update));
+ PALETTE(config, "palette").set_entries(16);
- MCFG_TIMER_DRIVER_ADD_PERIODIC("flash_rate", cms_hires_device, flash_rate, attotime::from_hz(3)) // from 555 timer (4.7uF, 100K, 470R)
+ TIMER(config, "flash_rate").configure_periodic(FUNC(cms_hires_device::flash_rate), attotime::from_hz(3)); // from 555 timer (4.7uF, 100K, 470R)
EF9365(config, m_gdp, 14_MHz_XTAL / 8);
m_gdp->set_screen("screen");
m_gdp->set_palette_tag("palette");
m_gdp->set_nb_bitplanes(4);
m_gdp->set_display_mode(ef9365_device::DISPLAY_MODE_512x256);
-MACHINE_CONFIG_END
+}
//**************************************************************************
@@ -70,7 +71,7 @@ void cms_hires_device::device_start()
{
address_space &space = m_bus->memspace();
- space.install_readwrite_handler(0xfc10, 0xfc1f, read8_delegate(FUNC(ef9365_device::data_r), m_gdp.target()), write8_delegate(FUNC(ef9365_device::data_w), m_gdp.target()));
+ space.install_readwrite_handler(0xfc10, 0xfc1f, read8sm_delegate(FUNC(ef9365_device::data_r), m_gdp.target()), write8sm_delegate(FUNC(ef9365_device::data_w), m_gdp.target()));
space.install_write_handler(0xfc20, 0xfc2f, write8_delegate(FUNC(cms_hires_device::colour_reg_w), this));
save_item(NAME(m_flash_state));
diff --git a/src/devices/bus/acorn/system/cass.cpp b/src/devices/bus/acorn/system/cass.cpp
index 092a72f40a3..6e5b8faf40c 100644
--- a/src/devices/bus/acorn/system/cass.cpp
+++ b/src/devices/bus/acorn/system/cass.cpp
@@ -24,15 +24,16 @@ DEFINE_DEVICE_TYPE(ACORN_CASS, acorn_cass_device, "acorn_cass", "Acorn Cassette
// device_add_mconfig - add device configuration
//-------------------------------------------------
-MACHINE_CONFIG_START(acorn_cass_device::device_add_mconfig)
+void acorn_cass_device::device_add_mconfig(machine_config &config)
+{
/* sound hardware */
SPEAKER(config, "mono").front_center();
WAVE(config, "wave", "cassette").add_route(ALL_OUTPUTS, "mono", 0.25);
CASSETTE(config, "cassette", 0);
- MCFG_TIMER_DRIVER_ADD_PERIODIC("cass_c", acorn_cass_device, cass_c, attotime::from_hz(4800))
- MCFG_TIMER_DRIVER_ADD_PERIODIC("cass_p", acorn_cass_device, cass_p, attotime::from_hz(40000))
-MACHINE_CONFIG_END
+ TIMER(config, "cass_c").configure_periodic(FUNC(acorn_cass_device::cass_c), attotime::from_hz(4800));
+ TIMER(config, "cass_p").configure_periodic(FUNC(acorn_cass_device::cass_p), attotime::from_hz(40000));
+}
//**************************************************************************
diff --git a/src/devices/bus/acorn/system/econet.cpp b/src/devices/bus/acorn/system/econet.cpp
index d6613f35bf7..f8e2c6f0ce4 100644
--- a/src/devices/bus/acorn/system/econet.cpp
+++ b/src/devices/bus/acorn/system/econet.cpp
@@ -72,7 +72,7 @@ void acorn_econet_device::device_reset()
{
address_space &space = m_bus->memspace();
- space.install_readwrite_handler(0x1940, 0x1943, read8_delegate(FUNC(mc6854_device::read), m_adlc.target()), write8_delegate(FUNC(mc6854_device::write), m_adlc.target()));
+ space.install_readwrite_handler(0x1940, 0x1943, read8sm_delegate(FUNC(mc6854_device::read), m_adlc.target()), write8sm_delegate(FUNC(mc6854_device::write), m_adlc.target()));
space.install_read_handler(0x1944, 0x1944, read8_delegate(FUNC(acorn_econet_device::statid_r), this));
}
diff --git a/src/devices/bus/acorn/system/fdc.cpp b/src/devices/bus/acorn/system/fdc.cpp
index 398736eab9e..179b914d3cf 100644
--- a/src/devices/bus/acorn/system/fdc.cpp
+++ b/src/devices/bus/acorn/system/fdc.cpp
@@ -85,7 +85,7 @@ void acorn_fdc_device::device_reset()
address_space &space = m_bus->memspace();
space.install_device(0x0a00, 0x0a03, *m_fdc, &i8271_device::map);
- space.install_readwrite_handler(0x0a04, 0x0a04, 0, 0x1f8, 0, read8_delegate(FUNC(i8271_device::data_r), m_fdc.target()), write8_delegate(FUNC(i8271_device::data_w), m_fdc.target()));
+ space.install_readwrite_handler(0x0a04, 0x0a04, 0, 0x1f8, 0, read8smo_delegate(FUNC(i8271_device::data_r), m_fdc.target()), write8smo_delegate(FUNC(i8271_device::data_w), m_fdc.target()));
}
diff --git a/src/devices/bus/acorn/system/vdu40.cpp b/src/devices/bus/acorn/system/vdu40.cpp
index 93d54819fa5..4f97b778a5b 100644
--- a/src/devices/bus/acorn/system/vdu40.cpp
+++ b/src/devices/bus/acorn/system/vdu40.cpp
@@ -25,12 +25,13 @@ DEFINE_DEVICE_TYPE(ACORN_VDU40, acorn_vdu40_device, "acorn_vdu40", "Acorn 40 Col
// device_add_mconfig - add device configuration
//-------------------------------------------------
-MACHINE_CONFIG_START(acorn_vdu40_device::device_add_mconfig)
- device = &SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+void acorn_vdu40_device::device_add_mconfig(machine_config &config)
+{
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
m_screen->set_raw(12_MHz_XTAL, 768, 132, 612, 311, 20, 270);
- MCFG_SCREEN_UPDATE_DEVICE("mc6845", mc6845_device, screen_update)
+ m_screen->set_screen_update("mc6845", FUNC(mc6845_device::screen_update));
- MCFG_PALETTE_ADD("palette", 8)
+ PALETTE(config, "palette").set_entries(8);
HD6845(config, m_crtc, 12_MHz_XTAL / 6);
m_crtc->set_screen("screen");
@@ -41,7 +42,7 @@ MACHINE_CONFIG_START(acorn_vdu40_device::device_add_mconfig)
SAA5050(config, m_trom, 12_MHz_XTAL / 2);
m_trom->set_screen_size(40, 25, 40);
-MACHINE_CONFIG_END
+}
//**************************************************************************
@@ -81,8 +82,8 @@ void acorn_vdu40_device::device_reset()
address_space &space = m_bus->memspace();
space.install_ram(0x0400, 0x07ff, m_videoram.get());
- space.install_readwrite_handler(0x0800, 0x0800, read8_delegate(FUNC(mc6845_device::status_r), m_crtc.target()), write8_delegate(FUNC(mc6845_device::address_w), m_crtc.target()));
- space.install_readwrite_handler(0x0801, 0x0801, read8_delegate(FUNC(mc6845_device::register_r), m_crtc.target()), write8_delegate(FUNC(mc6845_device::register_w), m_crtc.target()));
+ space.install_readwrite_handler(0x0800, 0x0800, read8smo_delegate(FUNC(mc6845_device::status_r), m_crtc.target()), write8smo_delegate(FUNC(mc6845_device::address_w), m_crtc.target()));
+ space.install_readwrite_handler(0x0801, 0x0801, read8smo_delegate(FUNC(mc6845_device::register_r), m_crtc.target()), write8smo_delegate(FUNC(mc6845_device::register_w), m_crtc.target()));
}
diff --git a/src/devices/bus/acorn/system/vdu80.cpp b/src/devices/bus/acorn/system/vdu80.cpp
index 65e22414e94..ef6cd463baa 100644
--- a/src/devices/bus/acorn/system/vdu80.cpp
+++ b/src/devices/bus/acorn/system/vdu80.cpp
@@ -87,13 +87,14 @@ GFXDECODE_END
// device_add_mconfig - add device configuration
//-------------------------------------------------
-MACHINE_CONFIG_START(acorn_vdu80_device::device_add_mconfig)
- device = &SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+void acorn_vdu80_device::device_add_mconfig(machine_config &config)
+{
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
m_screen->set_color(rgb_t::white());
m_screen->set_raw(12_MHz_XTAL, 768, 132, 612, 312, 20, 270);
- MCFG_SCREEN_UPDATE_DEVICE("mc6845", mc6845_device, screen_update)
+ m_screen->set_screen_update("mc6845", FUNC(mc6845_device::screen_update));
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_acorn_vdu80)
+ GFXDECODE(config, "gfxdecode", m_palette, gfx_acorn_vdu80);
PALETTE(config, m_palette, palette_device::MONOCHROME);
H46505(config, m_crtc, 2_MHz_XTAL);
@@ -101,7 +102,7 @@ MACHINE_CONFIG_START(acorn_vdu80_device::device_add_mconfig)
m_crtc->set_show_border_area(false);
m_crtc->set_char_width(6);
m_crtc->set_update_row_callback(FUNC(acorn_vdu80_device::crtc_update_row), this);
-MACHINE_CONFIG_END
+}
const tiny_rom_entry *acorn_vdu80_device::device_rom_region() const
@@ -151,15 +152,15 @@ void acorn_vdu80_device::device_reset()
{
space.install_ram(0xf000, 0x0f7ff, m_videoram.get());
- space.install_readwrite_handler(0xe840, 0xe840, 0, 0x3f, 0, read8_delegate(FUNC(mc6845_device::status_r), m_crtc.target()), write8_delegate(FUNC(mc6845_device::address_w), m_crtc.target()));
- space.install_readwrite_handler(0xe841, 0xe841, 0, 0x3e, 0, read8_delegate(FUNC(mc6845_device::register_r), m_crtc.target()), write8_delegate(FUNC(mc6845_device::register_w), m_crtc.target()));
+ space.install_readwrite_handler(0xe840, 0xe840, 0, 0x3f, 0, read8smo_delegate(FUNC(mc6845_device::status_r), m_crtc.target()), write8smo_delegate(FUNC(mc6845_device::address_w), m_crtc.target()));
+ space.install_readwrite_handler(0xe841, 0xe841, 0, 0x3e, 0, read8smo_delegate(FUNC(mc6845_device::register_r), m_crtc.target()), write8smo_delegate(FUNC(mc6845_device::register_w), m_crtc.target()));
}
else
{
space.install_ram(0x1000, 0x017ff, m_videoram.get());
- space.install_readwrite_handler(0x1840, 0x1840, 0, 0x3f, 0, read8_delegate(FUNC(mc6845_device::status_r), m_crtc.target()), write8_delegate(FUNC(mc6845_device::address_w), m_crtc.target()));
- space.install_readwrite_handler(0x1841, 0x1841, 0, 0x3e, 0, read8_delegate(FUNC(mc6845_device::register_r), m_crtc.target()), write8_delegate(FUNC(mc6845_device::register_w), m_crtc.target()));
+ space.install_readwrite_handler(0x1840, 0x1840, 0, 0x3f, 0, read8smo_delegate(FUNC(mc6845_device::status_r), m_crtc.target()), write8smo_delegate(FUNC(mc6845_device::address_w), m_crtc.target()));
+ space.install_readwrite_handler(0x1841, 0x1841, 0, 0x3e, 0, read8smo_delegate(FUNC(mc6845_device::register_r), m_crtc.target()), write8smo_delegate(FUNC(mc6845_device::register_w), m_crtc.target()));
}
}
diff --git a/src/devices/bus/acorn/system/vib.cpp b/src/devices/bus/acorn/system/vib.cpp
index 69a5d2189a4..e392225f1e0 100644
--- a/src/devices/bus/acorn/system/vib.cpp
+++ b/src/devices/bus/acorn/system/vib.cpp
@@ -26,7 +26,8 @@ DEFINE_DEVICE_TYPE(ACORN_VIB, acorn_vib_device, "acorn_vib", "Acorn Versatile In
// device_add_mconfig - add device configuration
//-------------------------------------------------
-MACHINE_CONFIG_START(acorn_vib_device::device_add_mconfig)
+void acorn_vib_device::device_add_mconfig(machine_config &config)
+{
INPUT_MERGER_ANY_HIGH(config, m_irqs).output_handler().set(FUNC(acorn_vib_device::irq_w));
VIA6522(config, m_via6522, XTAL(1'000'000));
@@ -37,7 +38,8 @@ MACHINE_CONFIG_START(acorn_vib_device::device_add_mconfig)
CENTRONICS(config, m_centronics, centronics_devices, "printer");
m_centronics->ack_handler().set(m_via6522, FUNC(via6522_device::write_ca1));
m_centronics->busy_handler().set(m_via6522, FUNC(via6522_device::write_pa7));
- MCFG_CENTRONICS_OUTPUT_LATCH_ADD("cent_data_out", "centronics")
+ output_latch_device &cent_data_out(OUTPUT_LATCH(config, "cent_data_out"));
+ m_centronics->set_output_latch(cent_data_out);
I8255(config, m_ppi8255, 0);
@@ -53,7 +55,7 @@ MACHINE_CONFIG_START(acorn_vib_device::device_add_mconfig)
CLOCK(config, m_acia_clock, 1.8432_MHz_XTAL);
m_acia_clock->signal_handler().set(FUNC(acorn_vib_device::write_acia_clock));
-MACHINE_CONFIG_END
+}
//**************************************************************************
// LIVE DEVICE
@@ -94,7 +96,7 @@ void acorn_vib_device::device_reset()
address_space &space = m_bus->memspace();
space.install_readwrite_handler(0x0c00, 0x0c0f, 0, 0x10, 0, read8sm_delegate(FUNC(via6522_device::read), m_via6522.target()), write8sm_delegate(FUNC(via6522_device::write), m_via6522.target()));
- space.install_readwrite_handler(0x0c20, 0x0c21, 0, 0x1e, 0, read8_delegate(FUNC(acia6850_device::read), m_acia.target()), write8_delegate(FUNC(acia6850_device::write), m_acia.target()));
+ space.install_readwrite_handler(0x0c20, 0x0c21, 0, 0x1e, 0, read8sm_delegate(FUNC(acia6850_device::read), m_acia.target()), write8sm_delegate(FUNC(acia6850_device::write), m_acia.target()));
space.install_readwrite_handler(0x0c40, 0x0c43, 0, 0x1c, 0, read8sm_delegate(FUNC(i8255_device::read), m_ppi8255.target()), write8sm_delegate(FUNC(i8255_device::write), m_ppi8255.target()));
}
diff --git a/src/devices/bus/adam/adamlink.cpp b/src/devices/bus/adam/adamlink.cpp
index f4227273421..4dc2d44b3d7 100644
--- a/src/devices/bus/adam/adamlink.cpp
+++ b/src/devices/bus/adam/adamlink.cpp
@@ -47,7 +47,7 @@ void adamlink_device::device_start()
// adam_bd_r - buffered data read
//-------------------------------------------------
-uint8_t adamlink_device::adam_bd_r(address_space &space, offs_t offset, uint8_t data, int bmreq, int biorq, int aux_rom_cs, int cas1, int cas2)
+uint8_t adamlink_device::adam_bd_r(offs_t offset, uint8_t data, int bmreq, int biorq, int aux_rom_cs, int cas1, int cas2)
{
if (!biorq)
{
@@ -69,7 +69,7 @@ uint8_t adamlink_device::adam_bd_r(address_space &space, offs_t offset, uint8_t
// adam_bd_w - buffered data write
//-------------------------------------------------
-void adamlink_device::adam_bd_w(address_space &space, offs_t offset, uint8_t data, int bmreq, int biorq, int aux_rom_cs, int cas1, int cas2)
+void adamlink_device::adam_bd_w(offs_t offset, uint8_t data, int bmreq, int biorq, int aux_rom_cs, int cas1, int cas2)
{
if (!biorq)
{
diff --git a/src/devices/bus/adam/adamlink.h b/src/devices/bus/adam/adamlink.h
index 42fd06490f9..6fb07f81c6f 100644
--- a/src/devices/bus/adam/adamlink.h
+++ b/src/devices/bus/adam/adamlink.h
@@ -33,8 +33,8 @@ protected:
virtual void device_start() override;
// device_adam_expansion_slot_card_interface overrides
- virtual uint8_t adam_bd_r(address_space &space, offs_t offset, uint8_t data, int bmreq, int biorq, int aux_rom_cs, int cas1, int cas2) override;
- virtual void adam_bd_w(address_space &space, offs_t offset, uint8_t data, int bmreq, int biorq, int aux_rom_cs, int cas1, int cas2) override;
+ virtual uint8_t adam_bd_r(offs_t offset, uint8_t data, int bmreq, int biorq, int aux_rom_cs, int cas1, int cas2) override;
+ virtual void adam_bd_w(offs_t offset, uint8_t data, int bmreq, int biorq, int aux_rom_cs, int cas1, int cas2) override;
};
diff --git a/src/devices/bus/adam/exp.cpp b/src/devices/bus/adam/exp.cpp
index c9d529a68ab..4555ed961eb 100644
--- a/src/devices/bus/adam/exp.cpp
+++ b/src/devices/bus/adam/exp.cpp
@@ -123,11 +123,11 @@ std::string adam_expansion_slot_device::get_default_card_software(get_default_ca
// bd_r - buffered data read
//-------------------------------------------------
-uint8_t adam_expansion_slot_device::bd_r(address_space &space, offs_t offset, uint8_t data, int bmreq, int biorq, int aux_rom_cs, int cas1, int cas2)
+uint8_t adam_expansion_slot_device::bd_r(offs_t offset, uint8_t data, int bmreq, int biorq, int aux_rom_cs, int cas1, int cas2)
{
if (m_card != nullptr)
{
- data = m_card->adam_bd_r(space, offset, data, bmreq, biorq, aux_rom_cs, cas1, cas2);
+ data = m_card->adam_bd_r(offset, data, bmreq, biorq, aux_rom_cs, cas1, cas2);
}
return data;
@@ -138,11 +138,11 @@ uint8_t adam_expansion_slot_device::bd_r(address_space &space, offs_t offset, ui
// cd_w - cartridge data write
//-------------------------------------------------
-void adam_expansion_slot_device::bd_w(address_space &space, offs_t offset, uint8_t data, int bmreq, int biorq, int aux_rom_cs, int cas1, int cas2)
+void adam_expansion_slot_device::bd_w(offs_t offset, uint8_t data, int bmreq, int biorq, int aux_rom_cs, int cas1, int cas2)
{
if (m_card != nullptr)
{
- m_card->adam_bd_w(space, offset, data, bmreq, biorq, aux_rom_cs, cas1, cas2);
+ m_card->adam_bd_w(offset, data, bmreq, biorq, aux_rom_cs, cas1, cas2);
}
}
diff --git a/src/devices/bus/adam/exp.h b/src/devices/bus/adam/exp.h
index 063d28b4271..618bc3d365a 100644
--- a/src/devices/bus/adam/exp.h
+++ b/src/devices/bus/adam/exp.h
@@ -51,8 +51,8 @@ public:
auto irq() { return m_write_irq.bind(); }
// computer interface
- uint8_t bd_r(address_space &space, offs_t offset, uint8_t data, int bmreq, int biorq, int aux_rom_cs, int cas1, int cas2);
- void bd_w(address_space &space, offs_t offset, uint8_t data, int bmreq, int biorq, int aux_rom_cs, int cas1, int cas2);
+ uint8_t bd_r(offs_t offset, uint8_t data, int bmreq, int biorq, int aux_rom_cs, int cas1, int cas2);
+ void bd_w(offs_t offset, uint8_t data, int bmreq, int biorq, int aux_rom_cs, int cas1, int cas2);
// cartridge interface
DECLARE_WRITE_LINE_MEMBER( irq_w ) { m_write_irq(state); }
@@ -96,8 +96,8 @@ protected:
device_adam_expansion_slot_card_interface(const machine_config &mconfig, device_t &device);
// runtime
- virtual uint8_t adam_bd_r(address_space &space, offs_t offset, uint8_t data, int bmreq, int biorq, int aux_rom_cs, int cas1, int cas2) { return data; }
- virtual void adam_bd_w(address_space &space, offs_t offset, uint8_t data, int bmreq, int biorq, int aux_rom_cs, int cas1, int cas2) { }
+ virtual uint8_t adam_bd_r(offs_t offset, uint8_t data, int bmreq, int biorq, int aux_rom_cs, int cas1, int cas2) { return data; }
+ virtual void adam_bd_w(offs_t offset, uint8_t data, int bmreq, int biorq, int aux_rom_cs, int cas1, int cas2) { }
adam_expansion_slot_device *m_slot;
diff --git a/src/devices/bus/adam/ide.cpp b/src/devices/bus/adam/ide.cpp
index fe97b7be512..98078003f4b 100644
--- a/src/devices/bus/adam/ide.cpp
+++ b/src/devices/bus/adam/ide.cpp
@@ -103,7 +103,7 @@ void powermate_ide_device::device_start()
// adam_bd_r - buffered data read
//-------------------------------------------------
-uint8_t powermate_ide_device::adam_bd_r(address_space &space, offs_t offset, uint8_t data, int bmreq, int biorq, int aux_rom_cs, int cas1, int cas2)
+uint8_t powermate_ide_device::adam_bd_r(offs_t offset, uint8_t data, int bmreq, int biorq, int aux_rom_cs, int cas1, int cas2)
{
if (!biorq)
{
@@ -164,7 +164,7 @@ uint8_t powermate_ide_device::adam_bd_r(address_space &space, offs_t offset, uin
// adam_bd_w - buffered data write
//-------------------------------------------------
-void powermate_ide_device::adam_bd_w(address_space &space, offs_t offset, uint8_t data, int bmreq, int biorq, int aux_rom_cs, int cas1, int cas2)
+void powermate_ide_device::adam_bd_w(offs_t offset, uint8_t data, int bmreq, int biorq, int aux_rom_cs, int cas1, int cas2)
{
if (!biorq)
{
diff --git a/src/devices/bus/adam/ide.h b/src/devices/bus/adam/ide.h
index 992b66aee3d..bfce0f9851f 100644
--- a/src/devices/bus/adam/ide.h
+++ b/src/devices/bus/adam/ide.h
@@ -39,8 +39,8 @@ protected:
virtual void device_add_mconfig(machine_config &config) override;
// device_adam_expansion_slot_card_interface overrides
- virtual uint8_t adam_bd_r(address_space &space, offs_t offset, uint8_t data, int bmreq, int biorq, int aux_rom_cs, int cas1, int cas2) override;
- virtual void adam_bd_w(address_space &space, offs_t offset, uint8_t data, int bmreq, int biorq, int aux_rom_cs, int cas1, int cas2) override;
+ virtual uint8_t adam_bd_r(offs_t offset, uint8_t data, int bmreq, int biorq, int aux_rom_cs, int cas1, int cas2) override;
+ virtual void adam_bd_w(offs_t offset, uint8_t data, int bmreq, int biorq, int aux_rom_cs, int cas1, int cas2) override;
private:
required_device<ata_interface_device> m_ata;
diff --git a/src/devices/bus/adam/ram.cpp b/src/devices/bus/adam/ram.cpp
index 2a756000dc2..a7e79719867 100644
--- a/src/devices/bus/adam/ram.cpp
+++ b/src/devices/bus/adam/ram.cpp
@@ -49,7 +49,7 @@ void adam_ram_expansion_device::device_start()
// adam_bd_r - buffered data read
//-------------------------------------------------
-uint8_t adam_ram_expansion_device::adam_bd_r(address_space &space, offs_t offset, uint8_t data, int bmreq, int biorq, int aux_rom_cs, int cas1, int cas2)
+uint8_t adam_ram_expansion_device::adam_bd_r(offs_t offset, uint8_t data, int bmreq, int biorq, int aux_rom_cs, int cas1, int cas2)
{
if (!cas2)
{
@@ -64,7 +64,7 @@ uint8_t adam_ram_expansion_device::adam_bd_r(address_space &space, offs_t offset
// adam_bd_w - buffered data write
//-------------------------------------------------
-void adam_ram_expansion_device::adam_bd_w(address_space &space, offs_t offset, uint8_t data, int bmreq, int biorq, int aux_rom_cs, int cas1, int cas2)
+void adam_ram_expansion_device::adam_bd_w(offs_t offset, uint8_t data, int bmreq, int biorq, int aux_rom_cs, int cas1, int cas2)
{
if (!cas2)
{
diff --git a/src/devices/bus/adam/ram.h b/src/devices/bus/adam/ram.h
index 80ec417f3cc..780d51be726 100644
--- a/src/devices/bus/adam/ram.h
+++ b/src/devices/bus/adam/ram.h
@@ -33,8 +33,8 @@ protected:
virtual void device_start() override;
// device_adam_expansion_slot_card_interface overrides
- virtual uint8_t adam_bd_r(address_space &space, offs_t offset, uint8_t data, int bmreq, int biorq, int aux_rom_cs, int cas1, int cas2) override;
- virtual void adam_bd_w(address_space &space, offs_t offset, uint8_t data, int bmreq, int biorq, int aux_rom_cs, int cas1, int cas2) override;
+ virtual uint8_t adam_bd_r(offs_t offset, uint8_t data, int bmreq, int biorq, int aux_rom_cs, int cas1, int cas2) override;
+ virtual void adam_bd_w(offs_t offset, uint8_t data, int bmreq, int biorq, int aux_rom_cs, int cas1, int cas2) override;
private:
optional_shared_ptr<uint8_t> m_ram;
diff --git a/src/devices/bus/adamnet/adamnet.h b/src/devices/bus/adamnet/adamnet.h
index c9090bf5482..51fc46a38dd 100644
--- a/src/devices/bus/adamnet/adamnet.h
+++ b/src/devices/bus/adamnet/adamnet.h
@@ -21,17 +21,6 @@
#define ADAMNET_TAG "adamnet"
-
-//**************************************************************************
-// INTERFACE CONFIGURATION MACROS
-//**************************************************************************
-
-#define MCFG_ADAMNET_SLOT_ADD(_tag, _slot_intf, _def_slot) \
- MCFG_DEVICE_ADD(_tag, ADAMNET_SLOT, 0) \
- MCFG_DEVICE_SLOT_INTERFACE(_slot_intf, _def_slot, false)
-
-
-
//**************************************************************************
// TYPE DEFINITIONS
//**************************************************************************
diff --git a/src/devices/bus/adamnet/ddp.cpp b/src/devices/bus/adamnet/ddp.cpp
index cf267e95a36..ede3719c910 100644
--- a/src/devices/bus/adamnet/ddp.cpp
+++ b/src/devices/bus/adamnet/ddp.cpp
@@ -70,7 +70,8 @@ static const struct CassetteOptions adam_cassette_options =
// device_add_mconfig - add device configuration
//-------------------------------------------------
-MACHINE_CONFIG_START(adam_digital_data_pack_device::device_add_mconfig)
+void adam_digital_data_pack_device::device_add_mconfig(machine_config &config)
+{
M6801(config, m_maincpu, XTAL(4'000'000));
m_maincpu->set_addrmap(AS_PROGRAM, &adam_digital_data_pack_device::adam_ddp_mem);
m_maincpu->out_p1_cb().set(FUNC(adam_digital_data_pack_device::p1_w));
@@ -79,18 +80,18 @@ MACHINE_CONFIG_START(adam_digital_data_pack_device::device_add_mconfig)
// Port 3 = Multiplexed Address/Data
m_maincpu->in_p4_cb().set(FUNC(adam_digital_data_pack_device::p4_r));
- MCFG_CASSETTE_ADD("cassette")
- MCFG_CASSETTE_FORMATS(coleco_adam_cassette_formats)
- MCFG_CASSETTE_CREATE_OPTS(&adam_cassette_options)
- MCFG_CASSETTE_DEFAULT_STATE(CASSETTE_PLAY | CASSETTE_MOTOR_DISABLED | CASSETTE_SPEAKER_MUTED)
- MCFG_CASSETTE_INTERFACE("adam_cass")
-
- MCFG_CASSETTE_ADD("cassette2")
- MCFG_CASSETTE_FORMATS(coleco_adam_cassette_formats)
- MCFG_CASSETTE_CREATE_OPTS(&adam_cassette_options)
- MCFG_CASSETTE_DEFAULT_STATE(CASSETTE_PLAY | CASSETTE_MOTOR_DISABLED | CASSETTE_SPEAKER_MUTED)
- MCFG_CASSETTE_INTERFACE("adam_cass")
-MACHINE_CONFIG_END
+ CASSETTE(config, m_ddp0);
+ m_ddp0->set_formats(coleco_adam_cassette_formats);
+ m_ddp0->set_create_opts(&adam_cassette_options);
+ m_ddp0->set_default_state(CASSETTE_PLAY | CASSETTE_MOTOR_DISABLED | CASSETTE_SPEAKER_MUTED);
+ m_ddp0->set_interface("adam_cass");
+
+ CASSETTE(config, m_ddp1);
+ m_ddp1->set_formats(coleco_adam_cassette_formats);
+ m_ddp1->set_create_opts(&adam_cassette_options);
+ m_ddp1->set_default_state(CASSETTE_PLAY | CASSETTE_MOTOR_DISABLED | CASSETTE_SPEAKER_MUTED);
+ m_ddp1->set_interface("adam_cass");
+}
diff --git a/src/devices/bus/adamnet/spi.cpp b/src/devices/bus/adamnet/spi.cpp
index 612bb11c547..6ad84bbed7c 100644
--- a/src/devices/bus/adamnet/spi.cpp
+++ b/src/devices/bus/adamnet/spi.cpp
@@ -64,7 +64,8 @@ void adam_spi_device::adam_spi_mem(address_map &map)
// device_add_mconfig - add device configuration
//-------------------------------------------------
-MACHINE_CONFIG_START(adam_spi_device::device_add_mconfig)
+void adam_spi_device::device_add_mconfig(machine_config &config)
+{
M6801(config, m_maincpu, XTAL(4'000'000));
m_maincpu->set_addrmap(AS_PROGRAM, &adam_spi_device::adam_spi_mem);
m_maincpu->in_p2_cb().set(FUNC(adam_spi_device::p2_r));
@@ -78,8 +79,9 @@ MACHINE_CONFIG_START(adam_spi_device::device_add_mconfig)
centronics_device &centronics(CENTRONICS(config, "centronics", centronics_devices, "printer"));
centronics.set_data_input_buffer("cent_data_in");
INPUT_BUFFER(config, "cent_data_in");
- MCFG_CENTRONICS_OUTPUT_LATCH_ADD("cent_data_out", "centronics")
-MACHINE_CONFIG_END
+ output_latch_device &cent_data_out(OUTPUT_LATCH(config, "cent_data_out"));
+ centronics.set_output_latch(cent_data_out);
+}
diff --git a/src/devices/bus/amiga/zorro/a2052.cpp b/src/devices/bus/amiga/zorro/a2052.cpp
index f2cef15b32e..515c568c019 100644
--- a/src/devices/bus/amiga/zorro/a2052.cpp
+++ b/src/devices/bus/amiga/zorro/a2052.cpp
@@ -81,10 +81,10 @@ void a2052_device::autoconfig_base_address(offs_t address)
logerror("-> installing a2052\n");
// stop responding to default autoconfig
- m_slot->m_space->unmap_readwrite(0xe80000, 0xe8007f);
+ m_slot->space().unmap_readwrite(0xe80000, 0xe8007f);
// install access to the rom space
- m_slot->m_space->install_ram(address, address + m_ram.size()*2 - 1, &m_ram[0]);
+ m_slot->space().install_ram(address, address + m_ram.size()*2 - 1, &m_ram[0]);
// we're done
m_slot->cfgout_w(0);
@@ -128,7 +128,7 @@ WRITE_LINE_MEMBER( a2052_device::cfgin_w )
autoconfig_can_shutup(true); // ?
// install autoconfig handler
- m_slot->m_space->install_readwrite_handler(0xe80000, 0xe8007f,
+ m_slot->space().install_readwrite_handler(0xe80000, 0xe8007f,
read16_delegate(FUNC(amiga_autoconfig::autoconfig_read), static_cast<amiga_autoconfig *>(this)),
write16_delegate(FUNC(amiga_autoconfig::autoconfig_write), static_cast<amiga_autoconfig *>(this)), 0xffff);
}
diff --git a/src/devices/bus/amiga/zorro/a2058.cpp b/src/devices/bus/amiga/zorro/a2058.cpp
index 8fc58669d14..e8d6e8c28fb 100644
--- a/src/devices/bus/amiga/zorro/a2058.cpp
+++ b/src/devices/bus/amiga/zorro/a2058.cpp
@@ -89,10 +89,10 @@ void a2058_device::autoconfig_base_address(offs_t address)
logerror("-> installing a2058\n");
// stop responding to default autoconfig
- m_slot->m_space->unmap_readwrite(0xe80000, 0xe8007f);
+ m_slot->space().unmap_readwrite(0xe80000, 0xe8007f);
// install access to the rom space
- m_slot->m_space->install_ram(address, address + (m_ram_size << 20) - 1, m_ram.get());
+ m_slot->space().install_ram(address, address + (m_ram_size << 20) - 1, m_ram.get());
// we're done
m_slot->cfgout_w(0);
@@ -140,7 +140,7 @@ WRITE_LINE_MEMBER( a2058_device::cfgin_w )
autoconfig_can_shutup(true); // ?
// install autoconfig handler
- m_slot->m_space->install_readwrite_handler(0xe80000, 0xe8007f,
+ m_slot->space().install_readwrite_handler(0xe80000, 0xe8007f,
read16_delegate(FUNC(amiga_autoconfig::autoconfig_read), static_cast<amiga_autoconfig *>(this)),
write16_delegate(FUNC(amiga_autoconfig::autoconfig_write), static_cast<amiga_autoconfig *>(this)), 0xffff);
}
diff --git a/src/devices/bus/amiga/zorro/a2065.cpp b/src/devices/bus/amiga/zorro/a2065.cpp
index 9eb0d835db2..b1b747594cc 100644
--- a/src/devices/bus/amiga/zorro/a2065.cpp
+++ b/src/devices/bus/amiga/zorro/a2065.cpp
@@ -81,20 +81,20 @@ void a2065_device::autoconfig_base_address(offs_t address)
LOG("-> installing a2065\n");
// stop responding to default autoconfig
- m_slot->m_space->unmap_readwrite(0xe80000, 0xe8007f);
+ m_slot->space().unmap_readwrite(0xe80000, 0xe8007f);
// install autoconfig handler to new location
- m_slot->m_space->install_readwrite_handler(address, address + 0x7f,
+ m_slot->space().install_readwrite_handler(address, address + 0x7f,
read16_delegate(FUNC(amiga_autoconfig::autoconfig_read), static_cast<amiga_autoconfig *>(this)),
write16_delegate(FUNC(amiga_autoconfig::autoconfig_write), static_cast<amiga_autoconfig *>(this)), 0xffff);
// install access to lance registers
- m_slot->m_space->install_readwrite_handler(address + 0x4000, address + 0x4003,
+ m_slot->space().install_readwrite_handler(address + 0x4000, address + 0x4003,
read16_delegate(FUNC(am7990_device::regs_r), &(*m_lance)),
write16_delegate(FUNC(am7990_device::regs_w), &(*m_lance)), 0xffff);
// install access to onboard ram (32k)
- m_slot->m_space->install_readwrite_handler(address + 0x8000, address + 0x8000 + 0x7fff,
+ m_slot->space().install_readwrite_handler(address + 0x8000, address + 0x8000 + 0x7fff,
read16_delegate(FUNC(a2065_device::host_ram_r), this),
write16_delegate(FUNC(a2065_device::host_ram_w), this), 0xffff);
@@ -123,7 +123,7 @@ WRITE_LINE_MEMBER( a2065_device::cfgin_w )
autoconfig_can_shutup(true); // ?
// install autoconfig handler
- m_slot->m_space->install_readwrite_handler(0xe80000, 0xe8007f,
+ m_slot->space().install_readwrite_handler(0xe80000, 0xe8007f,
read16_delegate(FUNC(amiga_autoconfig::autoconfig_read), static_cast<amiga_autoconfig *>(this)),
write16_delegate(FUNC(amiga_autoconfig::autoconfig_write), static_cast<amiga_autoconfig *>(this)), 0xffff);
}
diff --git a/src/devices/bus/amiga/zorro/a2232.cpp b/src/devices/bus/amiga/zorro/a2232.cpp
index 41334067412..24020d7a25d 100644
--- a/src/devices/bus/amiga/zorro/a2232.cpp
+++ b/src/devices/bus/amiga/zorro/a2232.cpp
@@ -188,25 +188,25 @@ void a2232_device::autoconfig_base_address(offs_t address)
logerror("-> installing a2232\n");
// stop responding to default autoconfig
- m_slot->m_space->unmap_readwrite(0xe80000, 0xe8007f);
+ m_slot->space().unmap_readwrite(0xe80000, 0xe8007f);
- m_slot->m_space->install_readwrite_handler(address, address + 0x3fff,
+ m_slot->space().install_readwrite_handler(address, address + 0x3fff,
read16_delegate(FUNC(a2232_device::shared_ram_r), this),
write16_delegate(FUNC(a2232_device::shared_ram_w), this), 0xffff);
- m_slot->m_space->install_readwrite_handler(address + 0x4000, address + 0x4001,
+ m_slot->space().install_readwrite_handler(address + 0x4000, address + 0x4001,
read16_delegate(FUNC(a2232_device::irq_ack_r), this),
write16_delegate(FUNC(a2232_device::irq_ack_w), this), 0xffff);
- m_slot->m_space->install_readwrite_handler(address + 0x8000, address + 0x8001,
+ m_slot->space().install_readwrite_handler(address + 0x8000, address + 0x8001,
read16_delegate(FUNC(a2232_device::reset_low_r), this),
write16_delegate(FUNC(a2232_device::reset_low_w), this), 0xffff);
- m_slot->m_space->install_readwrite_handler(address + 0xa000, address + 0xa001,
+ m_slot->space().install_readwrite_handler(address + 0xa000, address + 0xa001,
read16_delegate(FUNC(a2232_device::irq_r), this),
write16_delegate(FUNC(a2232_device::irq_w), this), 0xffff);
- m_slot->m_space->install_readwrite_handler(address + 0xc000, address + 0xc001,
+ m_slot->space().install_readwrite_handler(address + 0xc000, address + 0xc001,
read16_delegate(FUNC(a2232_device::reset_high_r), this),
write16_delegate(FUNC(a2232_device::reset_high_w), this), 0xffff);
@@ -236,7 +236,7 @@ WRITE_LINE_MEMBER( a2232_device::cfgin_w )
autoconfig_can_shutup(true); // ?
// install autoconfig handler
- m_slot->m_space->install_readwrite_handler(0xe80000, 0xe8007f,
+ m_slot->space().install_readwrite_handler(0xe80000, 0xe8007f,
read16_delegate(FUNC(amiga_autoconfig::autoconfig_read), static_cast<amiga_autoconfig *>(this)),
write16_delegate(FUNC(amiga_autoconfig::autoconfig_write), static_cast<amiga_autoconfig *>(this)), 0xffff);
}
@@ -344,13 +344,13 @@ WRITE16_MEMBER( a2232_device::reset_high_w )
template<int N>
READ8_MEMBER( a2232_device::acia_r )
{
- return m_acia[N]->read(space, offset >> 1);
+ return m_acia[N]->read(offset >> 1);
}
template<int N>
WRITE8_MEMBER( a2232_device::acia_w )
{
- m_acia[N]->write(space, offset >> 1, data);
+ m_acia[N]->write(offset >> 1, data);
}
@@ -360,12 +360,12 @@ WRITE8_MEMBER( a2232_device::acia_w )
READ8_MEMBER( a2232_device::cia_r )
{
- return m_cia->read(space, offset >> 1);
+ return m_cia->read(offset >> 1);
}
WRITE8_MEMBER( a2232_device::cia_w )
{
- m_cia->write(space, offset >> 1, data);
+ m_cia->write(offset >> 1, data);
}
READ8_MEMBER( a2232_device::cia_port_a_r )
diff --git a/src/devices/bus/amiga/zorro/a590.cpp b/src/devices/bus/amiga/zorro/a590.cpp
index 32328b2f944..045a0eab7c8 100644
--- a/src/devices/bus/amiga/zorro/a590.cpp
+++ b/src/devices/bus/amiga/zorro/a590.cpp
@@ -10,8 +10,9 @@
#include "emu.h"
#include "a590.h"
-#include "bus/scsi/scsi.h"
-#include "bus/scsi/scsihd.h"
+#include "machine/nscsi_bus.h"
+#include "machine/nscsi_cd.h"
+#include "machine/nscsi_hd.h"
//**************************************************************************
@@ -114,6 +115,19 @@ ioport_constructor a2091_device::device_input_ports() const
// device_add_mconfig - add device configuration
//-------------------------------------------------
+void dmac_hdc_device::scsi_devices(device_slot_interface &device)
+{
+ device.option_add("cdrom", NSCSI_CDROM);
+ device.option_add("harddisk", NSCSI_HARDDISK);
+}
+
+void dmac_hdc_device::wd33c93(device_t *device)
+{
+ device->set_clock(10000000);
+ downcast<wd33c93a_device *>(device)->irq_cb().set(*this, FUNC(dmac_hdc_device::scsi_irq_w));
+ downcast<wd33c93a_device *>(device)->drq_cb().set(*this, FUNC(dmac_hdc_device::scsi_drq_w));
+}
+
void dmac_hdc_device::device_add_mconfig(machine_config &config)
{
amiga_dmac_device &dmac(AMIGA_DMAC(config, "dmac", 0));
@@ -122,12 +136,15 @@ void dmac_hdc_device::device_add_mconfig(machine_config &config)
dmac.int_handler().set(FUNC(dmac_hdc_device::dmac_int_w));
dmac.cfgout_handler().set(FUNC(dmac_hdc_device::dmac_cfgout_w));
- scsi_port_device &scsi(SCSI_PORT(config, "scsi"));
- scsi.set_slot_device(1, "harddisk", SCSIHD, DEVICE_INPUT_DEFAULTS_NAME(SCSI_ID_1));
-
- wd33c93_device &scsi_ctrl(WD33C93(config, "wd33c93"));
- scsi_ctrl.set_scsi_port("scsi");
- scsi_ctrl.irq_cb().set(FUNC(dmac_hdc_device::scsi_irq_w));
+ NSCSI_BUS(config, "scsi", 0);
+ NSCSI_CONNECTOR(config, "scsi:0", scsi_devices, nullptr, false);
+ NSCSI_CONNECTOR(config, "scsi:1", scsi_devices, "harddisk", false);
+ NSCSI_CONNECTOR(config, "scsi:3", scsi_devices, nullptr, false);
+ NSCSI_CONNECTOR(config, "scsi:4", scsi_devices, nullptr, false);
+ NSCSI_CONNECTOR(config, "scsi:5", scsi_devices, nullptr, false);
+ NSCSI_CONNECTOR(config, "scsi:6", scsi_devices, nullptr, false);
+ NSCSI_CONNECTOR(config, "scsi:7").option_set("wd33c93", WD33C93A)
+ .machine_config([this](device_t *device) { wd33c93(device); });
}
@@ -205,7 +222,7 @@ dmac_hdc_device::dmac_hdc_device(const machine_config &mconfig, device_type type
device_t(mconfig, type, tag, owner, clock),
m_int6(false),
m_dmac(*this, "dmac"),
- m_wdc(*this, "wd33c93")
+ m_wdc(*this, "scsi:7:wd33c93")
{
}
@@ -243,7 +260,7 @@ void a590_device::device_start()
set_zorro_device();
// setup DMAC
- m_dmac->set_address_space(m_slot->m_space);
+ m_dmac->set_address_space(&m_slot->space());
m_dmac->set_rom(memregion("bootrom")->base());
}
@@ -252,7 +269,7 @@ void a2091_device::device_start()
set_zorro_device();
// setup DMAC
- m_dmac->set_address_space(m_slot->m_space);
+ m_dmac->set_address_space(&m_slot->space());
m_dmac->set_rom(memregion("bootrom")->base());
}
@@ -327,8 +344,8 @@ READ8_MEMBER( dmac_hdc_device::dmac_scsi_r )
{
switch (offset)
{
- case 0x48: return m_wdc->read(space, 0);
- case 0x49: return m_wdc->read(space, 1);
+ case 0x48: return m_wdc->indir_addr_r();
+ case 0x49: return m_wdc->indir_reg_r();
}
return 0xff;
@@ -338,8 +355,8 @@ WRITE8_MEMBER( dmac_hdc_device::dmac_scsi_w )
{
switch (offset)
{
- case 0x48: m_wdc->write(space, 0, data); break;
- case 0x49: m_wdc->write(space, 1, data); break;
+ case 0x48: m_wdc->indir_addr_w(data); break;
+ case 0x49: m_wdc->indir_reg_w(data); break;
}
}
@@ -356,3 +373,8 @@ WRITE_LINE_MEMBER( dmac_hdc_device::scsi_irq_w )
// should be or'ed with xt-ide IRQ
m_dmac->intx_w(state);
}
+
+WRITE_LINE_MEMBER( dmac_hdc_device::scsi_drq_w )
+{
+ m_dmac->xdreq_w(state);
+}
diff --git a/src/devices/bus/amiga/zorro/a590.h b/src/devices/bus/amiga/zorro/a590.h
index cf051fd30dc..62ea3bd189f 100644
--- a/src/devices/bus/amiga/zorro/a590.h
+++ b/src/devices/bus/amiga/zorro/a590.h
@@ -15,7 +15,7 @@
#include "zorro.h"
#include "machine/dmac.h"
-#include "machine/wd33c93.h"
+#include "machine/wd33c9x.h"
//**************************************************************************
@@ -51,7 +51,7 @@ protected:
// sub-devices
required_device<amiga_dmac_device> m_dmac;
- required_device<wd33c93_device> m_wdc;
+ required_device<wd33c93a_device> m_wdc;
std::vector<uint8_t> m_ram;
@@ -61,6 +61,10 @@ private:
DECLARE_WRITE_LINE_MEMBER( dmac_int_w );
DECLARE_WRITE_LINE_MEMBER( dmac_cfgout_w ) { cfgout_w(state); }
DECLARE_WRITE_LINE_MEMBER( scsi_irq_w );
+ DECLARE_WRITE_LINE_MEMBER( scsi_drq_w );
+
+ static void scsi_devices(device_slot_interface &device);
+ void wd33c93(device_t *device);
};
// ======================> a590_device
diff --git a/src/devices/bus/amiga/zorro/buddha.cpp b/src/devices/bus/amiga/zorro/buddha.cpp
index b82f2d8818b..376e2824660 100644
--- a/src/devices/bus/amiga/zorro/buddha.cpp
+++ b/src/devices/bus/amiga/zorro/buddha.cpp
@@ -143,18 +143,18 @@ void buddha_device::autoconfig_base_address(offs_t address)
logerror("-> installing buddha\n");
// stop responding to default autoconfig
- m_slot->m_space->unmap_readwrite(0xe80000, 0xe8007f);
+ m_slot->space().unmap_readwrite(0xe80000, 0xe8007f);
// buddha registers
- m_slot->m_space->install_device(address, address + 0xfff, *this, &buddha_device::mmio_map);
+ m_slot->space().install_device(address, address + 0xfff, *this, &buddha_device::mmio_map);
// install autoconfig handler to new location
- m_slot->m_space->install_readwrite_handler(address, address + 0x7f,
+ m_slot->space().install_readwrite_handler(address, address + 0x7f,
read16_delegate(FUNC(amiga_autoconfig::autoconfig_read), static_cast<amiga_autoconfig *>(this)),
write16_delegate(FUNC(amiga_autoconfig::autoconfig_write), static_cast<amiga_autoconfig *>(this)), 0xffff);
// install access to the rom space
- m_slot->m_space->install_rom(address + 0x1000, address + 0xffff, memregion("bootrom")->base() + 0x1000);
+ m_slot->space().install_rom(address + 0x1000, address + 0xffff, memregion("bootrom")->base() + 0x1000);
// we're done
m_slot->cfgout_w(0);
@@ -181,7 +181,7 @@ WRITE_LINE_MEMBER( buddha_device::cfgin_w )
autoconfig_rom_vector(0x1000);
// install autoconfig handler
- m_slot->m_space->install_readwrite_handler(0xe80000, 0xe8007f,
+ m_slot->space().install_readwrite_handler(0xe80000, 0xe8007f,
read16_delegate(FUNC(amiga_autoconfig::autoconfig_read), static_cast<amiga_autoconfig *>(this)),
write16_delegate(FUNC(amiga_autoconfig::autoconfig_write), static_cast<amiga_autoconfig *>(this)), 0xffff);
}
@@ -231,8 +231,8 @@ READ16_MEMBER( buddha_device::ide_0_interrupt_r )
data = m_ide_0_interrupt << 15;
- if (VERBOSE && 0)
- logerror("ide_0_interrupt_r %04x [mask = %04x]\n", data, mem_mask);
+// if (VERBOSE)
+// logerror("ide_0_interrupt_r %04x [mask = %04x]\n", data, mem_mask);
return data;
}
@@ -243,8 +243,8 @@ READ16_MEMBER( buddha_device::ide_1_interrupt_r )
data = m_ide_1_interrupt << 15;
- if (VERBOSE && 0)
- logerror("ide_1_interrupt_r %04x [mask = %04x]\n", data, mem_mask);
+// if (VERBOSE)
+// logerror("ide_1_interrupt_r %04x [mask = %04x]\n", data, mem_mask);
return data;
}
diff --git a/src/devices/bus/amiga/zorro/zorro.cpp b/src/devices/bus/amiga/zorro/zorro.cpp
index fec5d745015..b4f06507d55 100644
--- a/src/devices/bus/amiga/zorro/zorro.cpp
+++ b/src/devices/bus/amiga/zorro/zorro.cpp
@@ -30,7 +30,7 @@ zorro_slot_device::zorro_slot_device(const machine_config &mconfig, const char *
zorro_slot_device::zorro_slot_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock) :
device_t(mconfig, type, tag, owner, clock),
device_slot_interface(mconfig, *this),
- m_zorro_tag(nullptr)
+ m_zorro_bus(*this, finder_base::DUMMY_TAG)
{
}
@@ -43,10 +43,7 @@ void zorro_slot_device::device_start()
device_zorro_card_interface *dev = dynamic_cast<device_zorro_card_interface *>(get_card_device());
if (dev)
- {
- zorro_device *m_zorro_bus = downcast<zorro_device *>(m_owner->subdevice(m_zorro_tag));
m_zorro_bus->add_card(dev);
- }
}
@@ -60,8 +57,7 @@ void zorro_slot_device::device_start()
zorro_device::zorro_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock) :
device_t(mconfig, type, tag, owner, clock),
- m_space(nullptr),
- m_cputag(nullptr),
+ m_space(*this, finder_base::DUMMY_TAG, -1),
m_ovr_handler(*this),
m_int2_handler(*this),
m_int6_handler(*this)
@@ -69,21 +65,27 @@ zorro_device::zorro_device(const machine_config &mconfig, device_type type, cons
}
//-------------------------------------------------
-// device_start - device-specific startup
+// device_resolve_objects - resolve objects that
+// may be needed for other devices to set
+// initial conditions at start time
//-------------------------------------------------
-void zorro_device::device_start()
+void zorro_device::device_resolve_objects()
{
- // get address space
- device_t *cpu = machine().device(m_cputag);
- m_space = &cpu->memory().space(AS_PROGRAM);
-
// resolve callbacks
m_ovr_handler.resolve_safe();
m_int2_handler.resolve_safe();
m_int6_handler.resolve_safe();
}
+//-------------------------------------------------
+// device_start - device-specific startup
+//-------------------------------------------------
+
+void zorro_device::device_start()
+{
+}
+
// from slot device
WRITE_LINE_MEMBER( zorro_device::ovr_w ) { m_ovr_handler(state); }
WRITE_LINE_MEMBER( zorro_device::int2_w ) { m_int2_handler(state); }
@@ -115,16 +117,18 @@ exp_slot_device::exp_slot_device(const machine_config &mconfig, device_type type
}
//-------------------------------------------------
-// device_start - device-specific startup
+// device_resolve_objects - resolve objects that
+// may be needed for other devices to set
+// initial conditions at start time
//-------------------------------------------------
-void exp_slot_device::device_start()
+void exp_slot_device::device_resolve_objects()
{
// resolve callbacks
m_ipl_handler.resolve_safe();
- // call base device start
- zorro_device::device_start();
+ // call base device
+ zorro_device::device_resolve_objects();
}
//-------------------------------------------------
@@ -190,10 +194,12 @@ zorro2_device::~zorro2_device()
}
//-------------------------------------------------
-// device_start - device-specific startup
+// device_resolve_objects - resolve objects that
+// may be needed for other devices to set
+// initial conditions at start time
//-------------------------------------------------
-void zorro2_device::device_start()
+void zorro2_device::device_resolve_objects()
{
// resolve callbacks
m_eint1_handler.resolve_safe();
@@ -201,8 +207,8 @@ void zorro2_device::device_start()
m_eint5_handler.resolve_safe();
m_eint7_handler.resolve_safe();
- // call base device start
- zorro_device::device_start();
+ // call base device
+ zorro_device::device_resolve_objects();
}
//-------------------------------------------------
diff --git a/src/devices/bus/amiga/zorro/zorro.h b/src/devices/bus/amiga/zorro/zorro.h
index 3686f050002..4ad72da638b 100644
--- a/src/devices/bus/amiga/zorro/zorro.h
+++ b/src/devices/bus/amiga/zorro/zorro.h
@@ -145,76 +145,6 @@
//**************************************************************************
-// CONSTANTS / MACROS
-//**************************************************************************
-
-#define EXP_SLOT_TAG "exp"
-#define ZORROBUS_TAG "zorrobus"
-
-
-//**************************************************************************
-// INTERFACE CONFIGURATION MACROS
-//**************************************************************************
-
-#define MCFG_ZORRO_SLOT_ADD(_zorrotag, _tag, _slot_intf, _def_slot) \
- MCFG_DEVICE_ADD(_tag, ZORRO_SLOT, 0) \
- MCFG_DEVICE_SLOT_INTERFACE(_slot_intf, _def_slot, false) \
- downcast<zorro_slot_device &>(*device).set_zorro_slot(this, _zorrotag);
-
-// ======================> expansion slot
-
-#define MCFG_EXPANSION_SLOT_ADD(_cputag, _slot_intf, _def_slot) \
- MCFG_DEVICE_ADD(EXP_SLOT_TAG, EXP_SLOT, 0) \
- device_t *temp = device; \
- downcast<zorro_device &>(*device).set_cputag(_cputag); \
- MCFG_ZORRO_SLOT_ADD(EXP_SLOT_TAG, "slot", _slot_intf, _def_slot) \
- device = temp;
-
-// callbacks
-#define MCFG_EXPANSION_SLOT_OVR_HANDLER(_devcb) \
- downcast<zorro_device &>(*device).set_ovr_handler(DEVCB_##_devcb);
-
-#define MCFG_EXPANSION_SLOT_INT2_HANDLER(_devcb) \
- downcast<zorro_device &>(*device).set_int2_handler(DEVCB_##_devcb);
-
-#define MCFG_EXPANSION_SLOT_INT6_HANDLER(_devcb) \
- downcast<zorro_device &>(*device).set_int6_handler(DEVCB_##_devcb);
-
-#define MCFG_EXPANSION_SLOT_IPL_HANDLER(_devcb) \
- downcast<exp_slot_device &>(*device).set_ipl_handler(DEVCB_##_devcb);
-
-// ======================> zorro 2 bus
-
-#define MCFG_ZORRO2_ADD(_cputag) \
- MCFG_DEVICE_ADD(ZORROBUS_TAG, ZORRO2, 0) \
- downcast<zorro_device &>(*device).set_cputag(_cputag);
-
-#define MCFG_ZORRO2_SLOT_ADD(_tag, _slot_intf, _def_slot) \
- MCFG_ZORRO_SLOT_ADD(ZORROBUS_TAG, _tag, _slot_intf, _def_slot)
-
-#define MCFG_ZORRO2_OVR_HANDLER(_devcb) \
- downcast<zorro_device &>(*device).set_ovr_handler(DEVCB_##_devcb);
-
-#define MCFG_ZORRO2_INT2_HANDLER(_devcb) \
- downcast<zorro_device &>(*device).set_int2_handler(DEVCB_##_devcb);
-
-#define MCFG_ZORRO2_INT6_HANDLER(_devcb) \
- downcast<zorro_device &>(*device).set_int6_handler(DEVCB_##_devcb);
-
-#define MCFG_ZORRO2_EINT1_HANDLER(_devcb) \
- downcast<zorro2_device &>(*device).set_eint1_handler(DEVCB_##_devcb);
-
-#define MCFG_ZORRO2_EINT4_HANDLER(_devcb) \
- downcast<zorro2_device &>(*device).set_eint4_handler(DEVCB_##_devcb);
-
-#define MCFG_ZORRO2_EINT5_HANDLER(_devcb) \
- downcast<zorro2_device &>(*device).set_eint5_handler(DEVCB_##_devcb);
-
-#define MCFG_ZORRO2_EINT7_HANDLER(_devcb) \
- downcast<zorro2_device &>(*device).set_eint7_handler(DEVCB_##_devcb);
-
-
-//**************************************************************************
// TYPE DEFINITIONS
//**************************************************************************
@@ -222,6 +152,7 @@
class device_zorro_card_interface;
class device_exp_card_interface;
class device_zorro2_card_interface;
+class zorro_device;
// ======================> zorro slot device
@@ -230,18 +161,28 @@ class zorro_slot_device : public device_t, public device_slot_interface
public:
// construction/destruction
zorro_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+ template <typename T, typename O>
+ zorro_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, T &&zorrotag, O &&opts, const char *dflt)
+ : zorro_slot_device(mconfig, tag, owner, 0)
+ {
+ set_zorro_slot(std::forward<T>(zorrotag));
+ option_reset();
+ opts(*this);
+ set_default_option(dflt);
+ set_fixed(false);
+ }
// device-level overrides
virtual void device_start() override;
// inline configuration
- void set_zorro_slot(device_t *owner, const char *zorro_tag) { m_owner = owner; m_zorro_tag = zorro_tag; }
+ template <class T> void set_zorro_slot(T &&zorro_tag) { m_zorro_bus.set_tag(zorro_tag); }
protected:
zorro_slot_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock);
// configuration
- const char *m_zorro_tag;
+ required_device<zorro_device> m_zorro_bus;
};
// device type definition
@@ -253,11 +194,11 @@ class zorro_device : public device_t
{
public:
// configuration helpers
- void set_cputag(const char *tag) { m_cputag = tag; }
+ template <class T> void set_space(T &&tag, int spacenum) { m_space.set_tag(std::forward<T>(tag), spacenum); }
- template <class Object> devcb_base &set_int2_handler(Object &&cb) { return m_int2_handler.set_callback(std::forward<Object>(cb)); }
- template <class Object> devcb_base &set_int6_handler(Object &&cb) { return m_int6_handler.set_callback(std::forward<Object>(cb)); }
- template <class Object> devcb_base &set_ovr_handler(Object &&cb) { return m_ovr_handler.set_callback(std::forward<Object>(cb)); }
+ auto int2_handler() { return m_int2_handler.bind(); }
+ auto int6_handler() { return m_int6_handler.bind(); }
+ auto ovr_handler() { return m_ovr_handler.bind(); }
virtual void add_card(device_zorro_card_interface *card) = 0;
@@ -272,17 +213,18 @@ public:
virtual void fc_w(int code) = 0;
// access to the host space
- address_space *m_space;
+ address_space &space() const { return *m_space; }
protected:
// construction/destruction
zorro_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock);
// device-level overrides
+ virtual void device_resolve_objects() override;
virtual void device_start() override;
private:
- const char *m_cputag;
+ required_address_space m_space;
devcb_write_line m_ovr_handler;
devcb_write_line m_int2_handler;
@@ -297,7 +239,7 @@ public:
// construction/destruction
exp_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- template <class Object> devcb_base &set_ipl_handler(Object &&cb) { return m_ipl_handler.set_callback(std::forward<Object>(cb)); }
+ auto ipl_handler() { return m_ipl_handler.bind(); }
// the expansion slot can only have a single card
virtual void add_card(device_zorro_card_interface *card) override;
@@ -312,7 +254,7 @@ protected:
exp_slot_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock);
// device-level overrides
- virtual void device_start() override;
+ virtual void device_resolve_objects() override;
virtual void device_reset() override;
private:
@@ -333,10 +275,10 @@ public:
zorro2_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
~zorro2_device();
- template <class Object> devcb_base &set_eint1_handler(Object &&cb) { return m_eint1_handler.set_callback(std::forward<Object>(cb)); }
- template <class Object> devcb_base &set_eint4_handler(Object &&cb) { return m_eint4_handler.set_callback(std::forward<Object>(cb)); }
- template <class Object> devcb_base &set_eint5_handler(Object &&cb) { return m_eint5_handler.set_callback(std::forward<Object>(cb)); }
- template <class Object> devcb_base &set_eint7_handler(Object &&cb) { return m_eint7_handler.set_callback(std::forward<Object>(cb)); }
+ auto eint1_handler() { return m_eint1_handler.bind(); }
+ auto eint4_handler() { return m_eint4_handler.bind(); }
+ auto eint5_handler() { return m_eint5_handler.bind(); }
+ auto eint7_handler() { return m_eint7_handler.bind(); }
// the zorro2 bus supports multiple cards
virtual void add_card(device_zorro_card_interface *card) override;
@@ -356,7 +298,7 @@ protected:
zorro2_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock);
// device-level overrides
- virtual void device_start() override;
+ virtual void device_resolve_objects() override;
virtual void device_reset() override;
private:
diff --git a/src/devices/bus/apf/slot.h b/src/devices/bus/apf/slot.h
index 92ebbe4ad43..3678124c3e9 100644
--- a/src/devices/bus/apf/slot.h
+++ b/src/devices/bus/apf/slot.h
@@ -59,7 +59,17 @@ class apf_cart_slot_device : public device_t,
{
public:
// construction/destruction
- apf_cart_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+ template <typename T>
+ apf_cart_slot_device(machine_config const &mconfig, char const *tag, device_t *owner, T &&opts, char const *dflt)
+ : apf_cart_slot_device(mconfig, tag, owner, 0)
+ {
+ option_reset();
+ opts(*this);
+ set_default_option(dflt);
+ set_fixed(false);
+ }
+
+ apf_cart_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock = 0);
virtual ~apf_cart_slot_device();
// device-level overrides
@@ -110,8 +120,4 @@ DECLARE_DEVICE_TYPE(APF_CART_SLOT, apf_cart_slot_device)
#define APFSLOT_ROM_REGION_TAG ":cart:rom"
-#define MCFG_APF_CARTRIDGE_ADD(_tag,_slot_intf,_def_slot) \
- MCFG_DEVICE_ADD(_tag, APF_CART_SLOT, 0) \
- MCFG_DEVICE_SLOT_INTERFACE(_slot_intf, _def_slot, false)
-
#endif // MAME_BUS_APF_SLOT_H
diff --git a/src/devices/bus/apricot/expansion/cards.cpp b/src/devices/bus/apricot/expansion/cards.cpp
index d2c35366e42..ef0243bf412 100644
--- a/src/devices/bus/apricot/expansion/cards.cpp
+++ b/src/devices/bus/apricot/expansion/cards.cpp
@@ -9,10 +9,12 @@
#include "emu.h"
#include "cards.h"
#include "ram.h"
+#include "winchester.h"
void apricot_expansion_cards(device_slot_interface &device)
{
device.option_add("128k", APRICOT_128K_RAM);
device.option_add("256k", APRICOT_256K_RAM);
device.option_add("512k", APRICOT_512K_RAM);
+ device.option_add("winchester", APRICOT_WINCHESTER);
}
diff --git a/src/devices/bus/apricot/expansion/expansion.cpp b/src/devices/bus/apricot/expansion/expansion.cpp
index 98141860782..5a89c9a8868 100644
--- a/src/devices/bus/apricot/expansion/expansion.cpp
+++ b/src/devices/bus/apricot/expansion/expansion.cpp
@@ -59,18 +59,16 @@ DEFINE_DEVICE_TYPE(APRICOT_EXPANSION_BUS, apricot_expansion_bus_device, "apricot
apricot_expansion_bus_device::apricot_expansion_bus_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) :
device_t(mconfig, APRICOT_EXPANSION_BUS, tag, owner, clock),
- m_program(nullptr),
- m_io(nullptr),
- m_program_iop(nullptr),
- m_io_iop(nullptr),
+ m_program(*this, finder_base::DUMMY_TAG, -1),
+ m_io(*this, finder_base::DUMMY_TAG, -1),
+ m_program_iop(*this, finder_base::DUMMY_TAG, -1),
+ m_io_iop(*this, finder_base::DUMMY_TAG, -1),
m_dma1_handler(*this),
m_dma2_handler(*this),
m_ext1_handler(*this),
m_ext2_handler(*this),
m_int2_handler(*this),
- m_int3_handler(*this),
- m_cpu(*this, finder_base::DUMMY_TAG),
- m_iop(*this, finder_base::DUMMY_TAG)
+ m_int3_handler(*this)
{
}
@@ -99,19 +97,6 @@ void apricot_expansion_bus_device::device_start()
}
//-------------------------------------------------
-// device_reset - device-specific reset
-//-------------------------------------------------
-
-void apricot_expansion_bus_device::device_reset()
-{
- m_program = &m_cpu->space(AS_PROGRAM);
- m_io = &m_cpu->space(AS_IO);
-
- m_program_iop = &m_iop->space(AS_PROGRAM);
- m_io_iop = &m_iop->space(AS_IO);
-}
-
-//-------------------------------------------------
// add_card - add new card to our bus
//-------------------------------------------------
diff --git a/src/devices/bus/apricot/expansion/expansion.h b/src/devices/bus/apricot/expansion/expansion.h
index 85b0e47dc5e..93c529f24e3 100644
--- a/src/devices/bus/apricot/expansion/expansion.h
+++ b/src/devices/bus/apricot/expansion/expansion.h
@@ -89,16 +89,14 @@ class apricot_expansion_bus_device : public device_t
{
public:
// construction/destruction
- template <typename T, typename U>
- apricot_expansion_bus_device(const machine_config &mconfig, const char *tag, device_t *owner, T &&cpu_tag, U &&iop_tag)
- : apricot_expansion_bus_device(mconfig, tag, owner, (uint32_t)0)
- {
- m_cpu.set_tag(std::forward<T>(cpu_tag));
- m_iop.set_tag(std::forward<U>(iop_tag));
- }
apricot_expansion_bus_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
virtual ~apricot_expansion_bus_device();
+ template <typename T> void set_program_space(T &&tag, int spacenum) { m_program.set_tag(std::forward<T>(tag), spacenum); }
+ template <typename T> void set_io_space(T &&tag, int spacenum) { m_io.set_tag(std::forward<T>(tag), spacenum); }
+ template <typename T> void set_program_iop_space(T &&tag, int spacenum) { m_program_iop.set_tag(std::forward<T>(tag), spacenum); }
+ template <typename T> void set_io_iop_space(T &&tag, int spacenum) { m_io_iop.set_tag(std::forward<T>(tag), spacenum); }
+
auto dma1() { return m_dma1_handler.bind(); }
auto dma2() { return m_dma2_handler.bind(); }
auto ext1() { return m_ext1_handler.bind(); }
@@ -118,19 +116,26 @@ public:
void install_ram(offs_t addrstart, offs_t addrend, void *baseptr);
+ template<typename T> void install_io_device(offs_t addrstart, offs_t addrend, T &device, void (T::*map)(class address_map &map), uint64_t unitmask = ~u64(0))
+ {
+ m_io->install_device(addrstart, addrend, device, map, unitmask);
+
+ if (m_io_iop)
+ m_io_iop->install_device(addrstart, addrend, device, map, unitmask);
+ }
+
protected:
// device-level overrides
virtual void device_start() override;
- virtual void device_reset() override;
private:
simple_list<device_apricot_expansion_card_interface> m_dev;
// address spaces we have access to
- address_space *m_program;
- address_space *m_io;
- address_space *m_program_iop;
- address_space *m_io_iop;
+ required_address_space m_program;
+ required_address_space m_io;
+ optional_address_space m_program_iop;
+ optional_address_space m_io_iop;
devcb_write_line m_dma1_handler;
devcb_write_line m_dma2_handler;
@@ -138,10 +143,6 @@ private:
devcb_write_line m_ext2_handler;
devcb_write_line m_int2_handler;
devcb_write_line m_int3_handler;
-
- // configuration
- required_device<cpu_device> m_cpu;
- required_device<cpu_device> m_iop;
};
// device type definition
diff --git a/src/devices/bus/apricot/expansion/winchester.cpp b/src/devices/bus/apricot/expansion/winchester.cpp
new file mode 100644
index 00000000000..f16752b3ede
--- /dev/null
+++ b/src/devices/bus/apricot/expansion/winchester.cpp
@@ -0,0 +1,254 @@
+// license:GPL-2.0+
+// copyright-holders:Dirk Best
+/***************************************************************************
+
+ ACT Apricot Winchester Controller
+
+ Version Rev 9
+
+***************************************************************************/
+
+#include "emu.h"
+#include "winchester.h"
+#include "imagedev/harddriv.h"
+
+//#define LOG_GENERAL (1U << 0)
+#define LOG_REGS (1U << 1)
+#define LOG_DATA (1U << 2)
+
+//#define VERBOSE (LOG_REGS)
+//#define LOG_OUTPUT_STREAM std::cout
+
+#include "logmacro.h"
+
+#define LOGREGS(...) LOGMASKED(LOG_REGS, __VA_ARGS__)
+#define LOGDATA(...) LOGMASKED(LOG_DATA, __VA_ARGS__)
+
+
+//**************************************************************************
+// DEVICE DEFINITIONS
+//**************************************************************************
+
+DEFINE_DEVICE_TYPE(APRICOT_WINCHESTER, apricot_winchester_device, "apricot_winchester", "Apricot Winchester Controller Board")
+
+//-------------------------------------------------
+// regs - controller register i/o map
+//-------------------------------------------------
+
+void apricot_winchester_device::regs(address_map &map)
+{
+ map(0x0e0, 0x0ef).rw(m_hdc, FUNC(wd1010_device::read), FUNC(wd1010_device::write)).umask16(0x00ff);
+ map(0x1e0, 0x1e0).rw(FUNC(apricot_winchester_device::int_r), FUNC(apricot_winchester_device::head_w<0>)).umask16(0x00ff);
+ map(0x1e2, 0x1e2).w(FUNC(apricot_winchester_device::head_w<1>)).umask16(0x00ff);
+ map(0x1e4, 0x1e4).w(FUNC(apricot_winchester_device::head_w<2>)).umask16(0x00ff);
+ map(0x1e6, 0x1e6).w(FUNC(apricot_winchester_device::drive_w<0>)).umask16(0x00ff);
+ map(0x1e8, 0x1e8).w(FUNC(apricot_winchester_device::xferd_w)).umask16(0x00ff); // transferred
+ map(0x1ea, 0x1ea).w(FUNC(apricot_winchester_device::hbcr_w)).umask16(0x00ff); // host buffer clear register
+ map(0x1ec, 0x1ec).w(FUNC(apricot_winchester_device::clksel_w)).umask16(0x00ff); // buffer chip read/write clock select (host or wdc)
+ map(0x1ee, 0x1ee).w(FUNC(apricot_winchester_device::drive_w<1>)).umask16(0x00ff);
+ map(0x1f0, 0x1f0).rw(FUNC(apricot_winchester_device::data_r), FUNC(apricot_winchester_device::data_w)).umask16(0x00ff);
+}
+
+//-------------------------------------------------
+// device_add_mconfig - add device configuration
+//-------------------------------------------------
+
+void apricot_winchester_device::device_add_mconfig(machine_config &config)
+{
+ WD1010(config, m_hdc, 5000000);
+ m_hdc->out_intrq_callback().set(FUNC(apricot_winchester_device::hdc_intrq_w));
+ m_hdc->in_data_callback().set(FUNC(apricot_winchester_device::hdc_data_r));
+ m_hdc->out_data_callback().set(FUNC(apricot_winchester_device::hdc_data_w));
+
+ HARDDISK(config, "hdc:0", 0);
+ HARDDISK(config, "hdc:1", 0);
+}
+
+
+//**************************************************************************
+// LIVE DEVICE
+//**************************************************************************
+
+//-------------------------------------------------
+// apricot_winchester_device - constructor
+//-------------------------------------------------
+
+apricot_winchester_device::apricot_winchester_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) :
+ device_t(mconfig, APRICOT_WINCHESTER, tag, owner, clock),
+ device_apricot_expansion_card_interface(mconfig, *this),
+ m_hdc(*this, "hdc"),
+ m_ram_ptr(0),
+ m_int(0),
+ m_drive(0),
+ m_head(0),
+ m_hbcr(0),
+ m_clksel(0)
+{
+}
+
+//-------------------------------------------------
+// device_start - device-specific startup
+//-------------------------------------------------
+
+void apricot_winchester_device::device_start()
+{
+ // allocate 8-bit buffer ram (8k)
+ m_ram = std::make_unique<uint8_t[]>(0x2000);
+
+ // register for save states
+ save_pointer(NAME(m_ram), 0x2000);
+ save_item(NAME(m_ram_ptr));
+ save_item(NAME(m_int));
+ save_item(NAME(m_drive));
+ save_item(NAME(m_head));
+ save_item(NAME(m_hbcr));
+ save_item(NAME(m_clksel));
+}
+
+//-------------------------------------------------
+// device_reset - device-specific reset
+//-------------------------------------------------
+
+void apricot_winchester_device::device_reset()
+{
+ m_bus->install_io_device(0x000, 0xfff, *this, &apricot_winchester_device::regs);
+}
+
+
+//**************************************************************************
+// IMPLEMENTATION
+//**************************************************************************
+
+WRITE_LINE_MEMBER( apricot_winchester_device::hdc_intrq_w )
+{
+ LOGREGS("hdc_intrq_w: %d\n", state);
+
+ m_int = state;
+ m_bus->int2_w(state);
+}
+
+READ8_MEMBER( apricot_winchester_device::hdc_data_r )
+{
+ uint8_t data = 0xff;
+
+ if (m_clksel == 1)
+ {
+ LOGDATA("hdc_data_r[%04x]\n", m_ram_ptr);
+
+ data = m_ram[m_ram_ptr];
+ if (m_ram_ptr < 0x1fff)
+ m_ram_ptr++;
+ }
+
+ return data;
+}
+
+WRITE8_MEMBER( apricot_winchester_device::hdc_data_w )
+{
+ if (m_clksel == 1)
+ {
+ LOGDATA("hdc_data_w[%04x] = %02x\n", m_ram_ptr, data);
+
+ m_ram[m_ram_ptr] = data;
+ if (m_ram_ptr < 0x1fff)
+ m_ram_ptr++;
+ }
+}
+
+READ8_MEMBER( apricot_winchester_device::int_r )
+{
+ return m_int;
+}
+
+template<int N>
+WRITE8_MEMBER( apricot_winchester_device::head_w )
+{
+ m_head = (m_head & ~(1 << N)) | (BIT(data, 0) << N);
+ LOGREGS("Select head: %d\n", m_head);
+}
+
+template<int N>
+WRITE8_MEMBER( apricot_winchester_device::drive_w )
+{
+ m_drive = (m_drive & ~(1 << N)) | (BIT(data, 0) << N);
+ LOGREGS("Select drive: %d\n", m_drive);
+
+ // forward drive status to the hdc
+ harddisk_image_device *drive = nullptr;
+
+ switch (m_drive)
+ {
+ case 0:
+ drive = nullptr;
+ break;
+ case 1:
+ drive = m_hdc->subdevice<harddisk_image_device>("0");
+ break;
+ case 2:
+ drive = m_hdc->subdevice<harddisk_image_device>("1");
+ break;
+ case 3:
+ // both (invalid?)
+ drive = nullptr;
+ break;
+ }
+
+ m_hdc->drdy_w(drive != nullptr && drive->exists());
+}
+
+WRITE8_MEMBER( apricot_winchester_device::xferd_w )
+{
+ LOGREGS("xferd_w: %02x\n", data);
+
+ m_hdc->brdy_w(BIT(data, 0));
+}
+
+WRITE8_MEMBER( apricot_winchester_device::hbcr_w )
+{
+ LOGREGS("hbcr_w: %02x\n", data);
+
+ // reset ram pointer on high->low transition
+ if (m_hbcr == 1 && data == 0)
+ m_ram_ptr = 0;
+
+ m_hbcr = BIT(data, 0);
+}
+
+WRITE8_MEMBER( apricot_winchester_device::clksel_w )
+{
+ LOGREGS("clksel_w: %02x\n", data);
+
+ m_clksel = BIT(data, 0);
+}
+
+READ8_MEMBER( apricot_winchester_device::data_r )
+{
+ uint8_t data = 0xff;
+
+ if (m_clksel == 0)
+ {
+ LOGDATA("data_r[%04x]\n", m_ram_ptr);
+
+ data = m_ram[m_ram_ptr];
+
+ // wrap or stop at end?
+ if (m_ram_ptr < 0x1fff)
+ m_ram_ptr++;
+ }
+
+ return data;
+}
+
+WRITE8_MEMBER( apricot_winchester_device::data_w )
+{
+ if (m_clksel == 0)
+ {
+ LOGDATA("data_w[%04x] = %02x\n", m_ram_ptr, data);
+
+ m_ram[m_ram_ptr] = data;
+
+ // wrap or stop at end?
+ if (m_ram_ptr < 0x1fff)
+ m_ram_ptr++;
+ }
+}
diff --git a/src/devices/bus/apricot/expansion/winchester.h b/src/devices/bus/apricot/expansion/winchester.h
new file mode 100644
index 00000000000..c4c82ab0585
--- /dev/null
+++ b/src/devices/bus/apricot/expansion/winchester.h
@@ -0,0 +1,66 @@
+// license:GPL-2.0+
+// copyright-holders:Dirk Best
+/***************************************************************************
+
+ ACT Apricot Winchester Controller
+
+***************************************************************************/
+
+#ifndef MAME_BUS_APRICOT_WINCHESTER_H
+#define MAME_BUS_APRICOT_WINCHESTER_H
+
+#pragma once
+
+#include "expansion.h"
+#include "machine/wd1010.h"
+
+
+//**************************************************************************
+// TYPE DEFINITIONS
+//**************************************************************************
+
+// ======================> apricot_winchester_device
+
+class apricot_winchester_device : public device_t, public device_apricot_expansion_card_interface
+{
+public:
+ // construction/destruction
+ apricot_winchester_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+
+protected:
+ // device-level overrides
+ virtual void device_add_mconfig(machine_config &config) override;
+ virtual void device_start() override;
+ virtual void device_reset() override;
+
+private:
+ DECLARE_WRITE_LINE_MEMBER(hdc_intrq_w);
+ DECLARE_READ8_MEMBER(hdc_data_r);
+ DECLARE_WRITE8_MEMBER(hdc_data_w);
+ DECLARE_READ8_MEMBER(int_r);
+ template<int N> DECLARE_WRITE8_MEMBER(head_w);
+ template<int N> DECLARE_WRITE8_MEMBER(drive_w);
+ DECLARE_WRITE8_MEMBER(xferd_w);
+ DECLARE_WRITE8_MEMBER(hbcr_w);
+ DECLARE_WRITE8_MEMBER(clksel_w);
+ DECLARE_WRITE8_MEMBER(drvsel2_w);
+ DECLARE_READ8_MEMBER(data_r);
+ DECLARE_WRITE8_MEMBER(data_w);
+
+ void regs(address_map &map);
+
+ required_device<wd1010_device> m_hdc;
+
+ std::unique_ptr<uint8_t[]> m_ram;
+ unsigned m_ram_ptr;
+ int m_int;
+ int m_drive;
+ int m_head;
+ int m_hbcr;
+ int m_clksel;
+};
+
+// device type definition
+DECLARE_DEVICE_TYPE(APRICOT_WINCHESTER, apricot_winchester_device)
+
+#endif // MAME_BUS_APRICOT_WINCHESTER_H
diff --git a/src/devices/bus/apricot/keyboard/hle.cpp b/src/devices/bus/apricot/keyboard/hle.cpp
index c8df35cd0cb..28e98b9fb50 100644
--- a/src/devices/bus/apricot/keyboard/hle.cpp
+++ b/src/devices/bus/apricot/keyboard/hle.cpp
@@ -6,7 +6,6 @@
TODO:
- MicroScreen emulation
- - Mouse emulation
- LEDs
Keyboard to System:
@@ -188,6 +187,17 @@ static INPUT_PORTS_START( keyboard )
PORT_START("row_c")
PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_ENTER_PAD) PORT_CHAR(UCHAR_MAMEKEY(ENTER_PAD))
+
+ PORT_START("mouse_b")
+ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_BUTTON2) PORT_NAME("Mouse Right Button")
+ PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_BUTTON1) PORT_NAME("Mouse Left Button")
+ PORT_BIT(0x0c, IP_ACTIVE_HIGH, IPT_UNUSED)
+
+ PORT_START("mouse_x")
+ PORT_BIT(0xff, 0x00, IPT_MOUSE_X) PORT_SENSITIVITY(75) PORT_KEYDELTA(5)
+
+ PORT_START("mouse_y")
+ PORT_BIT(0xff, 0x00, IPT_MOUSE_Y) PORT_SENSITIVITY(50) PORT_KEYDELTA(5)
INPUT_PORTS_END
ioport_constructor apricot_keyboard_hle_device::device_input_ports() const
@@ -195,9 +205,12 @@ ioport_constructor apricot_keyboard_hle_device::device_input_ports() const
return INPUT_PORTS_NAME( keyboard );
}
-MACHINE_CONFIG_START(apricot_keyboard_hle_device::device_add_mconfig)
- MCFG_DEVICE_ADD("rtc", MSM5832, 32.768_kHz_XTAL)
-MACHINE_CONFIG_END
+void apricot_keyboard_hle_device::device_add_mconfig(machine_config &config)
+{
+ MSM5832(config, m_rtc, 32.768_kHz_XTAL);
+
+ TIMER(config, "timer").configure_periodic(FUNC(apricot_keyboard_hle_device::mouse_callback), attotime::from_hz(60));
+}
//**************************************************************************
@@ -214,7 +227,12 @@ apricot_keyboard_hle_device::apricot_keyboard_hle_device(const machine_config &m
device_buffered_serial_interface(mconfig, *this),
device_matrix_keyboard_interface(mconfig, *this, "row_0", "row_1", "row_2", "row_3", "row_4", "row_5", "row_6", "row_7", "row_8", "row_9", "row_a", "row_b", "row_c"),
m_rtc(*this, "rtc"),
- m_rtc_index(0)
+ m_mouse_b(*this, "mouse_b"),
+ m_mouse_x(*this, "mouse_x"),
+ m_mouse_y(*this, "mouse_y"),
+ m_rtc_index(0),
+ m_mouse_enabled(false),
+ m_mouse_last_b(0), m_mouse_last_x(0), m_mouse_last_y(0)
{
}
@@ -224,6 +242,12 @@ apricot_keyboard_hle_device::apricot_keyboard_hle_device(const machine_config &m
void apricot_keyboard_hle_device::device_start()
{
+ // register for save states
+ save_item(NAME(m_rtc_index));
+ save_item(NAME(m_mouse_enabled));
+ save_item(NAME(m_mouse_last_b));
+ save_item(NAME(m_mouse_last_x));
+ save_item(NAME(m_mouse_last_y));
}
//-------------------------------------------------
@@ -308,6 +332,16 @@ void apricot_keyboard_hle_device::received_byte(uint8_t byte)
break;
+ case CMD_ENABLE_MOUSE:
+ logerror("System enables mouse\n");
+ m_mouse_enabled = true;
+ break;
+
+ case CMD_DISABLE_MOUSE:
+ logerror("System disables mouse\n");
+ m_mouse_enabled = false;
+ break;
+
case CMD_KEYBOARD_RESET:
logerror("System requests keyboard reset\n");
transmit_byte(ACK_DIAGNOSTICS);
@@ -347,3 +381,44 @@ void apricot_keyboard_hle_device::out_w(int state)
{
device_buffered_serial_interface::rx_w(state);
}
+
+//-------------------------------------------------
+// mouse_callback - check for new mouse events
+//-------------------------------------------------
+
+TIMER_DEVICE_CALLBACK_MEMBER( apricot_keyboard_hle_device::mouse_callback )
+{
+ if (m_mouse_enabled)
+ {
+ // get mouse state
+ uint8_t buttons = m_mouse_b->read();
+ uint8_t x = m_mouse_x->read();
+ uint8_t y = m_mouse_y->read();
+
+ // anything changed since last time?
+ if (buttons != m_mouse_last_b || x != m_mouse_last_x || y != m_mouse_last_y)
+ {
+ // mouse header
+ transmit_byte(0xef);
+
+ // button state
+ transmit_byte(0x70 | buttons);
+
+ int8_t dx = x - m_mouse_last_x;
+ int8_t dy = y - m_mouse_last_y;
+
+ // y direction change
+ transmit_byte(0x70 | ((dy >> 4) & 0x0f));
+ transmit_byte(0x70 | ((dy >> 0) & 0x0f));
+
+ // x direction change
+ transmit_byte(0x70 | ((dx >> 4) & 0x0f));
+ transmit_byte(0x70 | ((dx >> 0) & 0x0f));
+
+ // save mouse state for next run
+ m_mouse_last_b = buttons;
+ m_mouse_last_x = x;
+ m_mouse_last_y = y;
+ }
+ }
+}
diff --git a/src/devices/bus/apricot/keyboard/hle.h b/src/devices/bus/apricot/keyboard/hle.h
index 5565ff6026a..c9738598a57 100644
--- a/src/devices/bus/apricot/keyboard/hle.h
+++ b/src/devices/bus/apricot/keyboard/hle.h
@@ -14,6 +14,7 @@
#include "keyboard.h"
#include "machine/keyboard.h"
#include "machine/msm5832.h"
+#include "machine/timer.h"
#include "diserial.h"
@@ -51,9 +52,13 @@ protected:
virtual void key_break(uint8_t row, uint8_t column) override;
private:
+ TIMER_DEVICE_CALLBACK_MEMBER(mouse_callback);
+
enum {
CMD_REQ_TIME_AND_DATE = 0xe1,
CMD_SET_TIME_AND_DATE = 0xe4,
+ CMD_ENABLE_MOUSE = 0xe5,
+ CMD_DISABLE_MOUSE = 0xe6,
CMD_KEYBOARD_RESET = 0xe8
};
@@ -62,8 +67,15 @@ private:
};
required_device<msm5832_device> m_rtc;
+ required_ioport m_mouse_b;
+ required_ioport m_mouse_x;
+ required_ioport m_mouse_y;
int m_rtc_index;
+ bool m_mouse_enabled;
+ uint8_t m_mouse_last_b;
+ uint8_t m_mouse_last_x;
+ uint8_t m_mouse_last_y;
};
diff --git a/src/devices/bus/astrocde/accessory.cpp b/src/devices/bus/astrocde/accessory.cpp
new file mode 100644
index 00000000000..fe7727b855d
--- /dev/null
+++ b/src/devices/bus/astrocde/accessory.cpp
@@ -0,0 +1,112 @@
+// license:BSD-3-Clause
+// copyright-holders:Ryan Holtz
+
+#include "emu.h"
+#include "accessory.h"
+
+#include <cassert>
+
+
+//**************************************************************************
+// GLOBAL VARIABLES
+//**************************************************************************
+
+DEFINE_DEVICE_TYPE(ASTROCADE_ACCESSORY_PORT, astrocade_accessory_port_device, "astrocade_accessory_port", "Bally Astrocade Accessory Port")
+
+
+//**************************************************************************
+// Bally Astrocade accessory interface
+//**************************************************************************
+
+device_astrocade_accessory_interface::device_astrocade_accessory_interface(const machine_config &mconfig, device_t &device)
+ : device_slot_card_interface(mconfig, device)
+ , m_port(dynamic_cast<astrocade_accessory_port_device *>(device.owner()))
+{
+}
+
+device_astrocade_accessory_interface::~device_astrocade_accessory_interface()
+{
+}
+
+void device_astrocade_accessory_interface::interface_validity_check(validity_checker &valid) const
+{
+ device_slot_card_interface::interface_validity_check(valid);
+
+ if (device().owner() && !m_port)
+ {
+ osd_printf_error("Owner device %s (%s) is not an astrocade_accessory_port_device\n", device().owner()->tag(), device().owner()->name());
+ }
+}
+
+void device_astrocade_accessory_interface::interface_pre_start()
+{
+ device_slot_card_interface::interface_pre_start();
+
+ if (m_port && !m_port->started())
+ throw device_missing_dependencies();
+}
+
+
+//**************************************************************************
+// Bally Astrocade accessory port
+//**************************************************************************
+
+astrocade_accessory_port_device::astrocade_accessory_port_device(machine_config const &mconfig, char const *tag, device_t *owner, uint32_t clock)
+ : device_t(mconfig, ASTROCADE_ACCESSORY_PORT, tag, owner, clock)
+ , device_slot_interface(mconfig, *this)
+ , m_ltpen(0)
+ , m_ltpen_handler(*this)
+ , m_screen(*this, finder_base::DUMMY_TAG)
+ , m_device(nullptr)
+{
+}
+
+astrocade_accessory_port_device::~astrocade_accessory_port_device()
+{
+}
+
+void astrocade_accessory_port_device::device_validity_check(validity_checker &valid) const
+{
+ device_t *const card(get_card_device());
+ if (card && !dynamic_cast<device_astrocade_accessory_interface *>(card))
+ {
+ osd_printf_error("Card device %s (%s) does not implement device_astrocade_accessory_interface\n", card->tag(), card->name());
+ }
+}
+
+void astrocade_accessory_port_device::device_resolve_objects()
+{
+ device_astrocade_accessory_interface *const card(dynamic_cast<device_astrocade_accessory_interface *>(get_card_device()));
+ if (card)
+ {
+ m_device = card;
+ m_device->set_screen(m_screen);
+ }
+
+ m_ltpen_handler.resolve_safe();
+}
+
+void astrocade_accessory_port_device::device_start()
+{
+ device_t *const card(get_card_device());
+ if (card)
+ {
+ if (!m_device)
+ {
+ throw emu_fatalerror("astrocade_accessory_port_device: card device %s (%s) does not implement device_astrocade_accessory_interface\n", card->tag(), card->name());
+ }
+ }
+
+ save_item(NAME(m_ltpen));
+
+ m_ltpen = 0;
+
+ m_ltpen_handler(0);
+}
+
+#include "lightpen.h"
+
+void astrocade_accessories(device_slot_interface &device)
+{
+ device.option_add("lightpen", ASTROCADE_LIGHTPEN);
+}
diff --git a/src/devices/bus/astrocde/accessory.h b/src/devices/bus/astrocde/accessory.h
new file mode 100644
index 00000000000..d745e464cd2
--- /dev/null
+++ b/src/devices/bus/astrocde/accessory.h
@@ -0,0 +1,99 @@
+// license:BSD-3-Clause
+// copyright-holders:Ryan Holtz
+#ifndef MAME_BUS_ASTROCDE_ACCESSORY_H
+#define MAME_BUS_ASTROCDE_ACCESSORY_H
+
+#pragma once
+
+#include "screen.h"
+
+
+/***************************************************************************
+ FORWARD DECLARATIONS
+ ***************************************************************************/
+
+class device_astrocade_accessory_interface;
+
+
+/***************************************************************************
+ TYPE DEFINITIONS
+ ***************************************************************************/
+
+// ======================> astrocade_accessory_port_device
+
+class astrocade_accessory_port_device : public device_t, public device_slot_interface
+{
+public:
+ // construction/destruction
+ template <typename T, typename U>
+ astrocade_accessory_port_device(machine_config const &mconfig, char const *tag, device_t *owner, T &&screen_tag, U &&opts, char const *dflt)
+ : astrocade_accessory_port_device(mconfig, tag, owner, 0U)
+ {
+ m_screen.set_tag(std::forward<T>(screen_tag));
+ option_reset();
+ opts(*this);
+ set_default_option(dflt);
+ set_fixed(false);
+ }
+ astrocade_accessory_port_device(machine_config const &mconfig, char const *tag, device_t *owner, uint32_t clock = 0U);
+ virtual ~astrocade_accessory_port_device();
+
+ auto ltpen_handler() { return m_ltpen_handler.bind(); }
+
+protected:
+ // device_t implementation
+ virtual void device_validity_check(validity_checker &valid) const override ATTR_COLD;
+ virtual void device_resolve_objects() override;
+ virtual void device_start() override;
+
+ int m_ltpen;
+ devcb_write_line m_ltpen_handler;
+ required_device<screen_device> m_screen;
+
+private:
+ device_astrocade_accessory_interface *m_device;
+
+ friend class device_astrocade_accessory_interface;
+};
+
+
+// ======================> device_astrocade_accessory_interface
+
+class device_astrocade_accessory_interface : public device_slot_card_interface
+{
+public:
+ virtual ~device_astrocade_accessory_interface();
+
+ DECLARE_WRITE_LINE_MEMBER( write_ltpen ) { m_port->m_ltpen = state; m_port->m_ltpen_handler(state); }
+
+protected:
+ device_astrocade_accessory_interface(machine_config const &mconfig, device_t &device);
+
+ // device_interface implementation
+ virtual void interface_validity_check(validity_checker &valid) const override ATTR_COLD;
+ virtual void interface_pre_start() override;
+
+ void set_screen(screen_device *screen) { m_screen = screen; }
+ screen_device *m_screen;
+
+private:
+ astrocade_accessory_port_device *const m_port;
+
+ friend class astrocade_accessory_port_device;
+};
+
+
+/***************************************************************************
+ FUNCTIONS
+ ***************************************************************************/
+
+void astrocade_accessories(device_slot_interface &device);
+
+
+/***************************************************************************
+ DEVICE TYPES
+ ***************************************************************************/
+
+DECLARE_DEVICE_TYPE(ASTROCADE_ACCESSORY_PORT, astrocade_accessory_port_device)
+
+#endif // MAME_BUS_ASTROCDE_ACCESSORY_H
diff --git a/src/devices/bus/astrocde/cassette.cpp b/src/devices/bus/astrocde/cassette.cpp
new file mode 100644
index 00000000000..3e4cc80deb8
--- /dev/null
+++ b/src/devices/bus/astrocde/cassette.cpp
@@ -0,0 +1,130 @@
+// license:BSD-3-Clause
+// copyright-holders:Ryan Holtz
+//
+// Decoding is done in hardware by an external box, and decoded bits are fed to bit 0 of the controller port,
+// with sync bits being fed to bit 1. The current HLE is not remotely accurate to hardware, but works.
+
+#include "emu.h"
+#include "cassette.h"
+
+//**************************************************************************
+// GLOBAL VARIABLES
+//**************************************************************************
+
+DEFINE_DEVICE_TYPE(ASTROCADE_CASSETTE, astrocade_cassette_device, "astrocade_cass", "Bally Astrocade Cassette")
+
+
+//**************************************************************************
+// Bally Astrocade cassette input
+//**************************************************************************
+
+astrocade_cassette_device::astrocade_cassette_device(machine_config const &mconfig, char const *tag, device_t *owner, uint32_t clock)
+ : device_t(mconfig, ASTROCADE_CASSETTE, tag, owner, clock)
+ , device_astrocade_ctrl_interface(mconfig, *this)
+ , m_cassette(*this, "cassette")
+{
+}
+
+astrocade_cassette_device::~astrocade_cassette_device()
+{
+}
+
+void astrocade_cassette_device::device_start()
+{
+ save_item(NAME(m_cass_wave));
+ save_item(NAME(m_cass_delta));
+ save_item(NAME(m_cass_wave_ticks));
+ save_item(NAME(m_cass_cycles));
+ save_item(NAME(m_cass_mark));
+}
+
+void astrocade_cassette_device::device_reset()
+{
+ m_cass_wave = 0.0;
+ m_cass_delta = 0.0;
+ m_cass_wave_ticks = 0;
+ m_cass_cycles = 0;
+ m_cass_mark = false;
+}
+
+uint8_t astrocade_cassette_device::read_handle()
+{
+ if (m_cass_data.size())
+ {
+ const uint8_t data = m_cass_data.front();
+ m_cass_data.pop();
+ return data;
+ }
+ return 0;
+}
+
+uint8_t astrocade_cassette_device::read_knob()
+{
+ return 0;
+}
+
+TIMER_DEVICE_CALLBACK_MEMBER(astrocade_cassette_device::check_cassette_wave)
+{
+ if (m_cassette->get_state() & CASSETTE_MOTOR_DISABLED)
+ return;
+
+ double old_cass_wave = m_cass_wave;
+ m_cass_wave = m_cassette->input();
+
+ bool cycled = false;
+ if (old_cass_wave != m_cass_wave)
+ {
+ double old_delta = m_cass_delta;
+ m_cass_delta = m_cass_wave - old_cass_wave;
+ if (old_delta < 0.0 && m_cass_delta > 0.0)
+ {
+ cycled = true;
+ }
+ }
+
+ if (cycled)
+ {
+ m_cass_mark = m_cass_wave_ticks <= 30;
+
+ m_cass_wave_ticks = 0;
+
+ m_cass_cycles++;
+ if (m_cass_mark)
+ {
+ if (m_cass_cycles >= 8)
+ {
+ m_cass_data.push(1);
+ m_cass_cycles = 0;
+ }
+ }
+ else
+ {
+ if (m_cass_cycles >= 4)
+ {
+ m_cass_data.push(0);
+ m_cass_cycles = 0;
+ }
+ }
+ }
+
+ m_cass_wave_ticks++;
+}
+
+TIMER_DEVICE_CALLBACK_MEMBER(astrocade_cassette_device::pulse_cassette_clock)
+{
+ if (m_cass_data.size())
+ {
+ write_ltpen(1);
+ write_ltpen(0);
+ }
+}
+
+void astrocade_cassette_device::device_add_mconfig(machine_config &config)
+{
+ CASSETTE(config, m_cassette);
+ m_cassette->set_default_state(CASSETTE_STOPPED);
+ m_cassette->set_interface("astrocade_cass");
+
+ TIMER(config, "kcs_hle").configure_periodic(FUNC(astrocade_cassette_device::check_cassette_wave), attotime::from_hz(48000));
+ TIMER(config, "kcs_clk").configure_periodic(FUNC(astrocade_cassette_device::pulse_cassette_clock), attotime::from_hz(300));
+}
diff --git a/src/devices/bus/astrocde/cassette.h b/src/devices/bus/astrocde/cassette.h
new file mode 100644
index 00000000000..d36e8a1bfd7
--- /dev/null
+++ b/src/devices/bus/astrocde/cassette.h
@@ -0,0 +1,61 @@
+// license:BSD-3-Clause
+// copyright-holders:Ryan Holtz
+#ifndef MAME_BUS_ASTROCDE_CASSETTE_H
+#define MAME_BUS_ASTROCDE_CASSETTE_H
+
+#pragma once
+
+#include "ctrl.h"
+#include "imagedev/cassette.h"
+#include "machine/timer.h"
+
+#include <queue>
+
+
+/***************************************************************************
+ TYPE DEFINITIONS
+ ***************************************************************************/
+
+// ======================> astrocade_cassette_device
+
+class astrocade_cassette_device : public device_t,
+ public device_astrocade_ctrl_interface
+{
+public:
+ static constexpr feature_type imperfect_features() { return feature::TAPE; }
+
+ // construction/destruction
+ astrocade_cassette_device(machine_config const &mconfig, char const *tag, device_t *owner, uint32_t clock = 0U);
+ virtual ~astrocade_cassette_device();
+
+ // device_astrocade_ctrl_interface implementation
+ virtual uint8_t read_handle() override;
+ virtual uint8_t read_knob() override;
+
+protected:
+ // device_t implementation
+ virtual void device_start() override;
+ virtual void device_reset() override;
+ virtual void device_add_mconfig(machine_config &config) override;
+
+ TIMER_DEVICE_CALLBACK_MEMBER(check_cassette_wave);
+ TIMER_DEVICE_CALLBACK_MEMBER(pulse_cassette_clock);
+
+private:
+ required_device<cassette_image_device> m_cassette;
+ double m_cass_wave;
+ double m_cass_delta;
+ uint32_t m_cass_wave_ticks;
+ uint32_t m_cass_cycles;
+ bool m_cass_mark;
+ std::queue<uint8_t> m_cass_data;
+};
+
+
+/***************************************************************************
+ DEVICE TYPES
+ ***************************************************************************/
+
+DECLARE_DEVICE_TYPE(ASTROCADE_CASSETTE, astrocade_cassette_device)
+
+#endif // MAME_BUS_ASTROCDE_CASSETTE_H
diff --git a/src/devices/bus/astrocde/ctrl.cpp b/src/devices/bus/astrocde/ctrl.cpp
new file mode 100644
index 00000000000..89cd60ca6a5
--- /dev/null
+++ b/src/devices/bus/astrocde/ctrl.cpp
@@ -0,0 +1,120 @@
+// license:BSD-3-Clause
+// copyright-holders:Ryan Holtz
+
+#include "emu.h"
+#include "ctrl.h"
+
+#include <cassert>
+
+
+//**************************************************************************
+// GLOBAL VARIABLES
+//**************************************************************************
+
+DEFINE_DEVICE_TYPE(ASTROCADE_CTRL_PORT, astrocade_ctrl_port_device, "astrocade_ctrl_port", "Bally Astrocade Control Port")
+
+
+//**************************************************************************
+// Bally Astrocade controller interface
+//**************************************************************************
+
+device_astrocade_ctrl_interface::device_astrocade_ctrl_interface(const machine_config &mconfig, device_t &device)
+ : device_slot_card_interface(mconfig, device)
+ , m_port(dynamic_cast<astrocade_ctrl_port_device *>(device.owner()))
+{
+}
+
+device_astrocade_ctrl_interface::~device_astrocade_ctrl_interface()
+{
+}
+
+void device_astrocade_ctrl_interface::interface_validity_check(validity_checker &valid) const
+{
+ device_slot_card_interface::interface_validity_check(valid);
+
+ if (device().owner() && !m_port)
+ {
+ osd_printf_error("Owner device %s (%s) is not an astrocade_ctrl_port_device\n", device().owner()->tag(), device().owner()->name());
+ }
+}
+
+void device_astrocade_ctrl_interface::interface_pre_start()
+{
+ device_slot_card_interface::interface_pre_start();
+
+ if (m_port && !m_port->started())
+ throw device_missing_dependencies();
+}
+
+
+//**************************************************************************
+// Bally Astrocade controller port
+//**************************************************************************
+
+astrocade_ctrl_port_device::astrocade_ctrl_port_device(machine_config const &mconfig, char const *tag, device_t *owner, uint32_t clock)
+ : device_t(mconfig, ASTROCADE_CTRL_PORT, tag, owner, clock)
+ , device_slot_interface(mconfig, *this)
+ , m_ltpen(0)
+ , m_ltpen_handler(*this)
+ , m_device(nullptr)
+{
+}
+
+astrocade_ctrl_port_device::~astrocade_ctrl_port_device()
+{
+}
+
+void astrocade_ctrl_port_device::device_validity_check(validity_checker &valid) const
+{
+ device_t *const card(get_card_device());
+ if (card && !dynamic_cast<device_astrocade_ctrl_interface *>(card))
+ {
+ osd_printf_error("Card device %s (%s) does not implement device_astrocade_ctrl_interface\n", card->tag(), card->name());
+ }
+}
+
+void astrocade_ctrl_port_device::device_resolve_objects()
+{
+ device_astrocade_ctrl_interface *const card(dynamic_cast<device_astrocade_ctrl_interface *>(get_card_device()));
+ if (card)
+ m_device = card;
+
+ m_ltpen_handler.resolve_safe();
+}
+
+void astrocade_ctrl_port_device::device_start()
+{
+ device_t *const card(get_card_device());
+ if (card)
+ {
+ if (!m_device)
+ {
+ throw emu_fatalerror("astrocade_ctrl_port_device: card device %s (%s) does not implement device_astrocade_ctrl_interface\n", card->tag(), card->name());
+ }
+ }
+
+ save_item(NAME(m_ltpen));
+
+ m_ltpen = 0;
+
+ m_ltpen_handler(0);
+}
+
+uint8_t astrocade_ctrl_port_device::read_handle()
+{
+ return m_device ? m_device->read_handle() : 0;
+}
+
+uint8_t astrocade_ctrl_port_device::read_knob()
+{
+ return m_device ? m_device->read_knob() : 0;
+}
+
+#include "joy.h"
+#include "cassette.h"
+
+void astrocade_controllers(device_slot_interface &device)
+{
+ device.option_add("joy", ASTROCADE_JOY);
+ device.option_add("cassette", ASTROCADE_CASSETTE);
+}
diff --git a/src/devices/bus/astrocde/ctrl.h b/src/devices/bus/astrocde/ctrl.h
new file mode 100644
index 00000000000..0cc34ea4dcc
--- /dev/null
+++ b/src/devices/bus/astrocde/ctrl.h
@@ -0,0 +1,98 @@
+// license:BSD-3-Clause
+// copyright-holders:Ryan Holtz
+#ifndef MAME_BUS_ASTROCDE_CTRL_H
+#define MAME_BUS_ASTROCDE_CTRL_H
+
+#pragma once
+
+
+/***************************************************************************
+ FORWARD DECLARATIONS
+ ***************************************************************************/
+
+class device_astrocade_ctrl_interface;
+
+
+/***************************************************************************
+ TYPE DEFINITIONS
+ ***************************************************************************/
+
+// ======================> astrocade_ctrl_port_device
+
+class astrocade_ctrl_port_device : public device_t, public device_slot_interface
+{
+public:
+ // construction/destruction
+ template <typename T>
+ astrocade_ctrl_port_device(machine_config const &mconfig, char const *tag, device_t *owner, T &&opts, char const *dflt)
+ : astrocade_ctrl_port_device(mconfig, tag, owner, 0U)
+ {
+ option_reset();
+ opts(*this);
+ set_default_option(dflt);
+ set_fixed(false);
+ }
+ astrocade_ctrl_port_device(machine_config const &mconfig, char const *tag, device_t *owner, uint32_t clock = 0U);
+ virtual ~astrocade_ctrl_port_device();
+
+ auto ltpen_handler() { return m_ltpen_handler.bind(); }
+
+ uint8_t read_handle();
+ uint8_t read_knob();
+
+protected:
+ // device_t implementation
+ virtual void device_validity_check(validity_checker &valid) const override ATTR_COLD;
+ virtual void device_resolve_objects() override;
+ virtual void device_start() override;
+
+ int m_ltpen;
+ devcb_write_line m_ltpen_handler;
+
+private:
+ device_astrocade_ctrl_interface *m_device;
+
+ friend class device_astrocade_ctrl_interface;
+};
+
+
+// ======================> device_astrocade_ctrl_interface
+
+class device_astrocade_ctrl_interface : public device_slot_card_interface
+{
+public:
+ virtual ~device_astrocade_ctrl_interface();
+
+ virtual uint8_t read_handle() { return 0; }
+ virtual uint8_t read_knob() { return 0; }
+
+ DECLARE_WRITE_LINE_MEMBER( write_ltpen ) { m_port->m_ltpen = state; m_port->m_ltpen_handler(state); }
+
+protected:
+ device_astrocade_ctrl_interface(machine_config const &mconfig, device_t &device);
+
+ // device_interface implementation
+ virtual void interface_validity_check(validity_checker &valid) const override ATTR_COLD;
+ virtual void interface_pre_start() override;
+
+private:
+ astrocade_ctrl_port_device *const m_port;
+
+ friend class astrocade_ctrl_port_device;
+};
+
+
+/***************************************************************************
+ FUNCTIONS
+ ***************************************************************************/
+
+void astrocade_controllers(device_slot_interface &device);
+
+
+/***************************************************************************
+ DEVICE TYPES
+ ***************************************************************************/
+
+DECLARE_DEVICE_TYPE(ASTROCADE_CTRL_PORT, astrocade_ctrl_port_device)
+
+#endif // MAME_BUS_ASTROCDE_CTRL_H
diff --git a/src/devices/bus/astrocde/exp.cpp b/src/devices/bus/astrocde/exp.cpp
index 40b6fbecbc4..9fe3c9f3fda 100644
--- a/src/devices/bus/astrocde/exp.cpp
+++ b/src/devices/bus/astrocde/exp.cpp
@@ -74,6 +74,14 @@ READ8_MEMBER(astrocade_exp_device::read)
return 0xff;
}
+READ8_MEMBER(astrocade_exp_device::read_io)
+{
+ if (m_card)
+ return m_card->read_io(space, offset);
+ else
+ return 0xff;
+}
+
/*-------------------------------------------------
write
-------------------------------------------------*/
@@ -83,3 +91,9 @@ WRITE8_MEMBER(astrocade_exp_device::write)
if (m_card)
m_card->write(space, offset, data);
}
+
+WRITE8_MEMBER(astrocade_exp_device::write_io)
+{
+ if (m_card)
+ m_card->write_io(space, offset, data);
+}
diff --git a/src/devices/bus/astrocde/exp.h b/src/devices/bus/astrocde/exp.h
index e6c97862224..a01db130974 100644
--- a/src/devices/bus/astrocde/exp.h
+++ b/src/devices/bus/astrocde/exp.h
@@ -14,6 +14,8 @@ public:
// reading and writing
virtual DECLARE_READ8_MEMBER(read) { return 0xff; }
virtual DECLARE_WRITE8_MEMBER(write) { }
+ virtual DECLARE_READ8_MEMBER(read_io) { return 0xff; }
+ virtual DECLARE_WRITE8_MEMBER(write_io) { }
protected:
device_astrocade_card_interface(const machine_config &mconfig, device_t &device);
@@ -46,6 +48,8 @@ public:
// reading and writing
virtual DECLARE_READ8_MEMBER(read);
virtual DECLARE_WRITE8_MEMBER(write);
+ virtual DECLARE_READ8_MEMBER(read_io);
+ virtual DECLARE_WRITE8_MEMBER(write_io);
protected:
bool m_card_mounted;
diff --git a/src/devices/bus/astrocde/joy.cpp b/src/devices/bus/astrocde/joy.cpp
new file mode 100644
index 00000000000..cbf75da0c5c
--- /dev/null
+++ b/src/devices/bus/astrocde/joy.cpp
@@ -0,0 +1,56 @@
+// license:BSD-3-Clause
+// copyright-holders:Ryan Holtz
+
+#include "emu.h"
+#include "joy.h"
+
+//**************************************************************************
+// GLOBAL VARIABLES
+//**************************************************************************
+
+DEFINE_DEVICE_TYPE(ASTROCADE_JOY, astrocade_joy_device, "astrocade_joy", "Bally Astrocade Joystick")
+
+
+//**************************************************************************
+// Bally Astrocade joystick control
+//**************************************************************************
+
+astrocade_joy_device::astrocade_joy_device(machine_config const &mconfig, char const *tag, device_t *owner, uint32_t clock)
+ : device_t(mconfig, ASTROCADE_JOY, tag, owner, clock)
+ , device_astrocade_ctrl_interface(mconfig, *this)
+ , m_handle(*this, "HANDLE")
+ , m_knob(*this, "KNOB")
+{
+}
+
+astrocade_joy_device::~astrocade_joy_device()
+{
+}
+
+uint8_t astrocade_joy_device::read_handle()
+{
+ return m_handle->read();
+}
+
+uint8_t astrocade_joy_device::read_knob()
+{
+ return m_knob->read();
+}
+
+static INPUT_PORTS_START( astrocade_joy )
+ PORT_START("HANDLE")
+ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP) PORT_8WAY
+ PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN) PORT_8WAY
+ PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT) PORT_8WAY
+ PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT) PORT_8WAY
+ PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_BUTTON1)
+ PORT_BIT(0xe0, IP_ACTIVE_HIGH, IPT_UNUSED)
+
+ PORT_START("KNOB")
+ PORT_BIT(0xff, 0x00, IPT_PADDLE) PORT_INVERT PORT_SENSITIVITY(85) PORT_KEYDELTA(10) PORT_CENTERDELTA(0) PORT_MINMAX(0,255) PORT_CODE_DEC(KEYCODE_Z) PORT_CODE_INC(KEYCODE_X)
+INPUT_PORTS_END
+
+ioport_constructor astrocade_joy_device::device_input_ports() const
+{
+ return INPUT_PORTS_NAME( astrocade_joy );
+}
diff --git a/src/devices/bus/astrocde/joy.h b/src/devices/bus/astrocde/joy.h
new file mode 100644
index 00000000000..bb8f755c845
--- /dev/null
+++ b/src/devices/bus/astrocde/joy.h
@@ -0,0 +1,45 @@
+// license:BSD-3-Clause
+// copyright-holders:Ryan Holtz
+#ifndef MAME_BUS_ASTROCDE_JOY_H
+#define MAME_BUS_ASTROCDE_JOY_H
+
+#pragma once
+
+#include "ctrl.h"
+
+/***************************************************************************
+ TYPE DEFINITIONS
+ ***************************************************************************/
+
+// ======================> astrocade_joy_device
+
+class astrocade_joy_device : public device_t,
+ public device_astrocade_ctrl_interface
+{
+public:
+ // construction/destruction
+ astrocade_joy_device(machine_config const &mconfig, char const *tag, device_t *owner, uint32_t clock = 0U);
+ virtual ~astrocade_joy_device();
+
+ // device_astrocade_ctrl_interface implementation
+ virtual uint8_t read_handle() override;
+ virtual uint8_t read_knob() override;
+
+protected:
+ // device_t implementation
+ virtual ioport_constructor device_input_ports() const override;
+ virtual void device_start() override { }
+
+private:
+ required_ioport m_handle;
+ required_ioport m_knob;
+};
+
+
+/***************************************************************************
+ DEVICE TYPES
+ ***************************************************************************/
+
+DECLARE_DEVICE_TYPE(ASTROCADE_JOY, astrocade_joy_device)
+
+#endif // MAME_BUS_ASTROCDE_JOY_H
diff --git a/src/devices/bus/astrocde/lightpen.cpp b/src/devices/bus/astrocde/lightpen.cpp
new file mode 100644
index 00000000000..e31eed122be
--- /dev/null
+++ b/src/devices/bus/astrocde/lightpen.cpp
@@ -0,0 +1,87 @@
+// license:BSD-3-Clause
+// copyright-holders:Ryan Holtz
+
+#include "emu.h"
+#include "lightpen.h"
+
+//**************************************************************************
+// GLOBAL VARIABLES
+//**************************************************************************
+
+DEFINE_DEVICE_TYPE(ASTROCADE_LIGHTPEN, astrocade_lightpen_device, "astrocade_lightpen", "Bally Astrocade Light Pen")
+
+
+//**************************************************************************
+// Bally Astrocade light pen input
+//**************************************************************************
+
+astrocade_lightpen_device::astrocade_lightpen_device(machine_config const &mconfig, char const *tag, device_t *owner, uint32_t clock)
+ : device_t(mconfig, ASTROCADE_LIGHTPEN, tag, owner, clock)
+ , device_astrocade_accessory_interface(mconfig, *this)
+ , m_trigger(*this, "TRIGGER")
+ , m_lightx(*this, "LIGHTX")
+ , m_lighty(*this, "LIGHTY")
+ , m_pen_timer(nullptr)
+{
+}
+
+astrocade_lightpen_device::~astrocade_lightpen_device()
+{
+}
+
+void astrocade_lightpen_device::device_start()
+{
+ m_pen_timer = timer_alloc(TIMER_TRIGGER);
+
+ save_item(NAME(m_retrigger));
+}
+
+void astrocade_lightpen_device::device_reset()
+{
+ m_pen_timer->adjust(attotime::never);
+ m_retrigger = false;
+}
+
+void astrocade_lightpen_device::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr)
+{
+ if (id == TIMER_TRIGGER)
+ {
+ write_ltpen(1);
+ write_ltpen(0);
+ if (m_retrigger)
+ m_pen_timer->adjust(m_screen->time_until_pos(m_lighty->read(), m_lightx->read()));
+ else
+ m_pen_timer->adjust(attotime::never);
+ }
+}
+
+INPUT_CHANGED_MEMBER( astrocade_lightpen_device::trigger )
+{
+ if (newval)
+ {
+ m_retrigger = true;
+ m_pen_timer->adjust(m_screen->time_until_pos(m_lighty->read(), m_lightx->read()));
+ }
+ else
+ {
+ m_retrigger = false;
+ m_pen_timer->adjust(attotime::never);
+ }
+}
+
+static INPUT_PORTS_START( astrocade_lightpen )
+ PORT_START("TRIGGER")
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_MEMBER(DEVICE_SELF, astrocade_lightpen_device, trigger, nullptr)
+ PORT_BIT( 0xfe, IP_ACTIVE_HIGH, IPT_UNUSED )
+
+ PORT_START("LIGHTX")
+ PORT_BIT(0x1ff, 0x000, IPT_LIGHTGUN_X) PORT_MINMAX(0x000, 0x15f) PORT_CROSSHAIR(X, 1.0, 0.0, 0) PORT_SENSITIVITY(45) PORT_KEYDELTA(15)
+
+ PORT_START("LIGHTY")
+ PORT_BIT(0x0ff, 0x000, IPT_LIGHTGUN_Y) PORT_MINMAX(0x000, 0x0f0) PORT_CROSSHAIR(Y, 1.0, 0.0, 0) PORT_SENSITIVITY(45) PORT_KEYDELTA(15)
+INPUT_PORTS_END
+
+ioport_constructor astrocade_lightpen_device::device_input_ports() const
+{
+ return INPUT_PORTS_NAME( astrocade_lightpen );
+}
diff --git a/src/devices/bus/astrocde/lightpen.h b/src/devices/bus/astrocde/lightpen.h
new file mode 100644
index 00000000000..a0863d5d3e8
--- /dev/null
+++ b/src/devices/bus/astrocde/lightpen.h
@@ -0,0 +1,51 @@
+// license:BSD-3-Clause
+// copyright-holders:Ryan Holtz
+#ifndef MAME_BUS_ASTROCDE_LIGHTPEN_H
+#define MAME_BUS_ASTROCDE_LIGHTPEN_H
+
+#pragma once
+
+#include "accessory.h"
+
+
+/***************************************************************************
+ TYPE DEFINITIONS
+ ***************************************************************************/
+
+// ======================> astrocade_lightpen_device
+
+class astrocade_lightpen_device : public device_t,
+ public device_astrocade_accessory_interface
+{
+public:
+ // construction/destruction
+ astrocade_lightpen_device(machine_config const &mconfig, char const *tag, device_t *owner, uint32_t clock = 0U);
+ virtual ~astrocade_lightpen_device();
+
+ DECLARE_INPUT_CHANGED_MEMBER( trigger );
+
+protected:
+ // device_t implementation
+ virtual void device_start() override;
+ virtual void device_reset() override;
+ virtual ioport_constructor device_input_ports() const override;
+ virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override;
+
+ static const device_timer_id TIMER_TRIGGER = 0;
+
+private:
+ required_ioport m_trigger;
+ required_ioport m_lightx;
+ required_ioport m_lighty;
+ emu_timer *m_pen_timer;
+ bool m_retrigger;
+};
+
+
+/***************************************************************************
+ DEVICE TYPES
+ ***************************************************************************/
+
+DECLARE_DEVICE_TYPE(ASTROCADE_LIGHTPEN, astrocade_lightpen_device)
+
+#endif // MAME_BUS_ASTROCDE_LIGHTPEN_H
diff --git a/src/devices/bus/astrocde/ram.cpp b/src/devices/bus/astrocde/ram.cpp
index 36d1ed9ab77..8f20b0256fa 100644
--- a/src/devices/bus/astrocde/ram.cpp
+++ b/src/devices/bus/astrocde/ram.cpp
@@ -21,10 +21,10 @@
switch and run it as a cartridge. This is useful for cartridge development.
Blue RAM -- available in 4K, 16K, and 32K. These also use an INS8154 chip,
- (not yet implemented) which has an additional $80 bytes of RAM mapped
- immediately after the end of the expansion address space. This memory
- can't be write protected. The INS8154 has I/O features needed for loading
- tape programs into Blue RAM BASIC, as well as running the Blue RAM Utility cart.
+ which has an additional $80 bytes of RAM mapped immediately after the end of
+ the expansion address space (not yet implemented). This memory can't be write
+ protected. The INS8154 has I/O features needed for loading tape programs into
+ Blue RAM BASIC, as well as running the Blue RAM Utility cart.
4K: $6000 to $6FFF (can't run VIPERSoft BASIC, because this program needs memory
past this range)
16K: $6000 to $9FFF
@@ -69,9 +69,11 @@ DEFINE_DEVICE_TYPE(ASTROCADE_RL64RAM, astrocade_rl64ram_device, "astroca
astrocade_blueram_4k_device::astrocade_blueram_4k_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock)
- : device_t(mconfig, type, tag, owner, clock),
- device_astrocade_card_interface(mconfig, *this),
- m_write_prot(*this, "RAM_PROTECT")
+ : device_t(mconfig, type, tag, owner, clock)
+ , device_astrocade_card_interface(mconfig, *this)
+ , m_write_prot(*this, "RAM_PROTECT")
+ , m_ramio(*this, "ramio")
+ , m_cassette(*this, "cassette")
{
}
@@ -163,7 +165,35 @@ WRITE8_MEMBER(astrocade_blueram_4k_device::write)
m_ram[offset - 0x1000] = data;
}
+READ8_MEMBER(astrocade_blueram_4k_device::read_io)
+{
+ return m_ramio->read_io(offset & 0x7f);
+}
+
+WRITE8_MEMBER(astrocade_blueram_4k_device::write_io)
+{
+ logerror("write_io: %04x = %02x\n", offset, data);
+ m_ramio->write_io(offset & 0x7f, data);
+}
+
+uint8_t astrocade_blueram_4k_device::porta_r()
+{
+ return 0;
+}
+
+uint8_t astrocade_blueram_4k_device::portb_r()
+{
+ return m_cassette->input() > 0.0 ? 1 : 0;
+}
+
+void astrocade_blueram_4k_device::porta_w(uint8_t data)
+{
+}
+void astrocade_blueram_4k_device::portb_w(uint8_t data)
+{
+ m_cassette->output(BIT(data, 0) ? +1 : -1);
+}
// Viper System 1 expansion has RAM in 0x6000-0x9fff
READ8_MEMBER(astrocade_viper_sys1_device::read)
@@ -207,3 +237,20 @@ WRITE8_MEMBER(astrocade_rl64ram_device::write)
if (!m_write_prot->read())
m_ram[offset] = data;
}
+
+/*-------------------------------------------------
+ machine configuration
+ -------------------------------------------------*/
+
+void astrocade_blueram_4k_device::device_add_mconfig(machine_config &config)
+{
+ CASSETTE(config, m_cassette);
+ m_cassette->set_default_state(CASSETTE_STOPPED);
+ m_cassette->set_interface("astrocade_cass");
+
+ INS8154(config, m_ramio);
+ m_ramio->out_a().set(FUNC(astrocade_blueram_4k_device::porta_w));
+ m_ramio->out_b().set(FUNC(astrocade_blueram_4k_device::portb_w));
+ m_ramio->in_a().set(FUNC(astrocade_blueram_4k_device::porta_r));
+ m_ramio->in_b().set(FUNC(astrocade_blueram_4k_device::portb_r));
+}
diff --git a/src/devices/bus/astrocde/ram.h b/src/devices/bus/astrocde/ram.h
index 83f9483d2e8..ee5ed884ef4 100644
--- a/src/devices/bus/astrocde/ram.h
+++ b/src/devices/bus/astrocde/ram.h
@@ -6,6 +6,8 @@
#pragma once
#include "exp.h"
+#include "imagedev/cassette.h"
+#include "machine/ins8154.h"
// ======================> astrocade_blueram_4k_device
@@ -22,15 +24,25 @@ public:
// reading and writing
virtual DECLARE_READ8_MEMBER(read) override;
virtual DECLARE_WRITE8_MEMBER(write) override;
+ virtual DECLARE_READ8_MEMBER(read_io) override;
+ virtual DECLARE_WRITE8_MEMBER(write_io) override;
+
+ uint8_t porta_r();
+ uint8_t portb_r();
+ void porta_w(uint8_t data);
+ void portb_w(uint8_t data);
protected:
astrocade_blueram_4k_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock);
virtual void device_start() override { m_ram.resize(0x1000); save_item(NAME(m_ram)); }
virtual void device_reset() override { }
+ virtual void device_add_mconfig(machine_config &config) override;
std::vector<uint8_t> m_ram;
required_ioport m_write_prot;
+ required_device<ins8154_device> m_ramio;
+ required_device<cassette_image_device> m_cassette;
};
// ======================> astrocade_blueram_16k_device
diff --git a/src/devices/bus/astrocde/rom.cpp b/src/devices/bus/astrocde/rom.cpp
index fcebedfc81d..bb5d6912fc2 100644
--- a/src/devices/bus/astrocde/rom.cpp
+++ b/src/devices/bus/astrocde/rom.cpp
@@ -17,9 +17,10 @@
// astrocade_rom_device - constructor
//-------------------------------------------------
-DEFINE_DEVICE_TYPE(ASTROCADE_ROM_STD, astrocade_rom_device, "astrocade_rom", "Bally Astrocade Standard Carts")
-DEFINE_DEVICE_TYPE(ASTROCADE_ROM_256K, astrocade_rom_256k_device, "astrocade_256k", "Bally Astrocade 256K Carts")
-DEFINE_DEVICE_TYPE(ASTROCADE_ROM_512K, astrocade_rom_512k_device, "astrocade_512k", "Bally Astrocade 512K Carts")
+DEFINE_DEVICE_TYPE(ASTROCADE_ROM_STD, astrocade_rom_device, "astrocade_rom", "Bally Astrocade Standard Carts")
+DEFINE_DEVICE_TYPE(ASTROCADE_ROM_256K, astrocade_rom_256k_device, "astrocade_rom_256k", "Bally Astrocade 256K Carts")
+DEFINE_DEVICE_TYPE(ASTROCADE_ROM_512K, astrocade_rom_512k_device, "astrocade_rom_512k", "Bally Astrocade 512K Carts")
+DEFINE_DEVICE_TYPE(ASTROCADE_ROM_CASS, astrocade_rom_cass_device, "astrocade_rom_cass", "Bally Astrocade AstroBASIC Cart")
astrocade_rom_device::astrocade_rom_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock)
@@ -42,6 +43,12 @@ astrocade_rom_512k_device::astrocade_rom_512k_device(const machine_config &mconf
{
}
+astrocade_rom_cass_device::astrocade_rom_cass_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+ : astrocade_rom_device(mconfig, ASTROCADE_ROM_CASS, tag, owner, clock)
+ , m_cassette(*this, "cassette")
+{
+}
+
void astrocade_rom_256k_device::device_start()
{
@@ -95,3 +102,31 @@ READ8_MEMBER(astrocade_rom_512k_device::read_rom)
else // 0x3fc0-0x3fff
return m_base_bank = offset & 0x7f;
}
+
+READ8_MEMBER(astrocade_rom_cass_device::read_rom)
+{
+ if (offset < m_rom_size)
+ return m_rom[offset];
+ else if ((offset & 0x1c00) == 0x1800)
+ {
+ m_cassette->output(+1);
+ return 0xff;
+ }
+ else if ((offset & 0x1c00) == 0x1c00)
+ {
+ m_cassette->output(-1);
+ return m_cassette->input() > 0.0 ? 0 : 1;
+ }
+ return 0xff;
+}
+
+/*-------------------------------------------------
+ mapper specific device configuration
+ -------------------------------------------------*/
+
+void astrocade_rom_cass_device::device_add_mconfig(machine_config &config)
+{
+ CASSETTE(config, m_cassette);
+ m_cassette->set_default_state(CASSETTE_STOPPED);
+ m_cassette->set_interface("astrocade_cass");
+}
diff --git a/src/devices/bus/astrocde/rom.h b/src/devices/bus/astrocde/rom.h
index 0471ada8dd1..efd17b16ded 100644
--- a/src/devices/bus/astrocde/rom.h
+++ b/src/devices/bus/astrocde/rom.h
@@ -6,6 +6,7 @@
#pragma once
#include "slot.h"
+#include "imagedev/cassette.h"
// ======================> astrocade_rom_device
@@ -64,10 +65,30 @@ private:
uint8_t m_base_bank;
};
+// ======================> astrocade_rom_cass_device
+
+class astrocade_rom_cass_device : public astrocade_rom_device
+{
+public:
+ // construction/destruction
+ astrocade_rom_cass_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+
+ // reading and writing
+ virtual DECLARE_READ8_MEMBER(read_rom) override;
+
+private:
+ virtual void device_start() override { }
+ virtual void device_reset() override { }
+ virtual void device_add_mconfig(machine_config &config) override;
+
+ required_device<cassette_image_device> m_cassette;
+};
+
// device type definition
DECLARE_DEVICE_TYPE(ASTROCADE_ROM_STD, astrocade_rom_device)
DECLARE_DEVICE_TYPE(ASTROCADE_ROM_256K, astrocade_rom_256k_device)
DECLARE_DEVICE_TYPE(ASTROCADE_ROM_512K, astrocade_rom_512k_device)
+DECLARE_DEVICE_TYPE(ASTROCADE_ROM_CASS, astrocade_rom_cass_device)
#endif // MAME_BUS_ASTROCADE_ROM_H
diff --git a/src/devices/bus/astrocde/slot.cpp b/src/devices/bus/astrocde/slot.cpp
index b83b8e576ad..2aa78be98d9 100644
--- a/src/devices/bus/astrocde/slot.cpp
+++ b/src/devices/bus/astrocde/slot.cpp
@@ -104,7 +104,8 @@ static const astrocade_slot slot_list[] =
{
{ ASTROCADE_STD, "rom" },
{ ASTROCADE_256K, "rom_256k" },
- { ASTROCADE_512K, "rom_512k" }
+ { ASTROCADE_512K, "rom_512k" },
+ { ASTROCADE_CASS, "rom_cass" }
};
static int astrocade_get_pcb_id(const char *slot)
diff --git a/src/devices/bus/astrocde/slot.h b/src/devices/bus/astrocde/slot.h
index 88c34fa0d8e..419f4672985 100644
--- a/src/devices/bus/astrocde/slot.h
+++ b/src/devices/bus/astrocde/slot.h
@@ -19,7 +19,8 @@ enum
{
ASTROCADE_STD = 0,
ASTROCADE_256K,
- ASTROCADE_512K
+ ASTROCADE_512K,
+ ASTROCADE_CASS
};
diff --git a/src/devices/bus/bbc/1mhzbus/1mhzbus.cpp b/src/devices/bus/bbc/1mhzbus/1mhzbus.cpp
index 43cabfdfec3..41e9bc0e8cb 100644
--- a/src/devices/bus/bbc/1mhzbus/1mhzbus.cpp
+++ b/src/devices/bus/bbc/1mhzbus/1mhzbus.cpp
@@ -92,18 +92,18 @@ void bbc_1mhzbus_slot_device::device_reset()
// read
//-------------------------------------------------
-READ8_MEMBER(bbc_1mhzbus_slot_device::fred_r)
+uint8_t bbc_1mhzbus_slot_device::fred_r(offs_t offset)
{
if (m_card)
- return m_card->fred_r(space, offset);
+ return m_card->fred_r(offset);
else
return 0xff;
}
-READ8_MEMBER(bbc_1mhzbus_slot_device::jim_r)
+uint8_t bbc_1mhzbus_slot_device::jim_r(offs_t offset)
{
if (m_card)
- return m_card->jim_r(space, offset);
+ return m_card->jim_r(offset);
else
return 0xff;
}
@@ -112,16 +112,16 @@ READ8_MEMBER(bbc_1mhzbus_slot_device::jim_r)
// write
//-------------------------------------------------
-WRITE8_MEMBER(bbc_1mhzbus_slot_device::fred_w)
+void bbc_1mhzbus_slot_device::fred_w(offs_t offset, uint8_t data)
{
if (m_card)
- m_card->fred_w(space, offset, data);
+ m_card->fred_w(offset, data);
}
-WRITE8_MEMBER(bbc_1mhzbus_slot_device::jim_w)
+void bbc_1mhzbus_slot_device::jim_w(offs_t offset, uint8_t data)
{
if (m_card)
- m_card->jim_w(space, offset, data);
+ m_card->jim_w(offset, data);
}
//-------------------------------------------------
@@ -142,6 +142,7 @@ WRITE8_MEMBER(bbc_1mhzbus_slot_device::jim_w)
//#include "graduate.h"
#include "beebsid.h"
//#include "prisma3.h"
+#include "sprite.h"
#include "cfa3000opt.h"
@@ -161,6 +162,7 @@ void bbc_1mhzbus_devices(device_slot_interface &device)
//device.option_add("graduate", BBC_GRADUATE); /* The Torch Graduate G400/G800 */
device.option_add("beebsid", BBC_BEEBSID); /* BeebSID */
//device.option_add("prisma3", BBC_PRISMA3); /* PRISMA-3 - Millipede 1989 */
+ device.option_add("sprite", BBC_SPRITE); /* Logotron Sprite Board */
}
void bbcm_1mhzbus_devices(device_slot_interface &device)
@@ -183,5 +185,6 @@ void bbcm_1mhzbus_devices(device_slot_interface &device)
//device.option_add("graduate", BBC_GRADUATE); /* The Torch Graduate G400/G800 */
device.option_add("beebsid", BBC_BEEBSID); /* BeebSID */
//device.option_add("prisma3", BBC_PRISMA3); /* PRISMA-3 - Millipede 1989 */
+ device.option_add("sprite", BBC_SPRITE); /* Logotron Sprite Board */
device.option_add("cfa3000opt", CFA3000_OPT); /* Henson CFA 3000 Option Board */
}
diff --git a/src/devices/bus/bbc/1mhzbus/1mhzbus.h b/src/devices/bus/bbc/1mhzbus/1mhzbus.h
index ad435876bf0..80e48425973 100644
--- a/src/devices/bus/bbc/1mhzbus/1mhzbus.h
+++ b/src/devices/bus/bbc/1mhzbus/1mhzbus.h
@@ -107,10 +107,10 @@ public:
auto irq_handler() { return m_irq_handler.bind(); }
auto nmi_handler() { return m_nmi_handler.bind(); }
- virtual DECLARE_READ8_MEMBER(fred_r);
- virtual DECLARE_WRITE8_MEMBER(fred_w);
- virtual DECLARE_READ8_MEMBER(jim_r);
- virtual DECLARE_WRITE8_MEMBER(jim_w);
+ virtual uint8_t fred_r(offs_t offset);
+ virtual void fred_w(offs_t offset, uint8_t data);
+ virtual uint8_t jim_r(offs_t offset);
+ virtual void jim_w(offs_t offset, uint8_t data);
DECLARE_WRITE_LINE_MEMBER( irq_w ) { m_irq_handler(state); }
DECLARE_WRITE_LINE_MEMBER( nmi_w ) { m_nmi_handler(state); }
@@ -134,10 +134,10 @@ private:
class device_bbc_1mhzbus_interface : public device_slot_card_interface
{
public:
- virtual DECLARE_READ8_MEMBER(fred_r) { return 0xff; }
- virtual DECLARE_WRITE8_MEMBER(fred_w) { }
- virtual DECLARE_READ8_MEMBER(jim_r) { return 0xff; }
- virtual DECLARE_WRITE8_MEMBER(jim_w) { }
+ virtual uint8_t fred_r(offs_t offset) { return 0xff; }
+ virtual void fred_w(offs_t offset, uint8_t data) { }
+ virtual uint8_t jim_r(offs_t offset) { return 0xff; }
+ virtual void jim_w(offs_t offset, uint8_t data) { }
protected:
device_bbc_1mhzbus_interface(const machine_config &mconfig, device_t &device);
diff --git a/src/devices/bus/bbc/1mhzbus/beebsid.cpp b/src/devices/bus/bbc/1mhzbus/beebsid.cpp
index c0e6ea62c46..d50449ede99 100644
--- a/src/devices/bus/bbc/1mhzbus/beebsid.cpp
+++ b/src/devices/bus/bbc/1mhzbus/beebsid.cpp
@@ -65,40 +65,40 @@ void bbc_beebsid_device::device_start()
// IMPLEMENTATION
//**************************************************************************
-READ8_MEMBER(bbc_beebsid_device::fred_r)
+uint8_t bbc_beebsid_device::fred_r(offs_t offset)
{
uint8_t data = 0xff;
if (offset >= 0x20 && offset < 0x40)
{
- data = m_sid->read(space, offset);
+ data = m_sid->read(offset);
}
- data &= m_1mhzbus->fred_r(space, offset);
+ data &= m_1mhzbus->fred_r(offset);
return data;
}
-WRITE8_MEMBER(bbc_beebsid_device::fred_w)
+void bbc_beebsid_device::fred_w(offs_t offset, uint8_t data)
{
if (offset >= 0x20 && offset < 0x40)
{
- m_sid->write(space, offset, data);
+ m_sid->write(offset, data);
}
- m_1mhzbus->fred_w(space, offset, data);
+ m_1mhzbus->fred_w(offset, data);
}
-READ8_MEMBER(bbc_beebsid_device::jim_r)
+uint8_t bbc_beebsid_device::jim_r(offs_t offset)
{
uint8_t data = 0xff;
- data &= m_1mhzbus->jim_r(space, offset);
+ data &= m_1mhzbus->jim_r(offset);
return data;
}
-WRITE8_MEMBER(bbc_beebsid_device::jim_w)
+void bbc_beebsid_device::jim_w(offs_t offset, uint8_t data)
{
- m_1mhzbus->jim_w(space, offset, data);
+ m_1mhzbus->jim_w(offset, data);
}
diff --git a/src/devices/bus/bbc/1mhzbus/beebsid.h b/src/devices/bus/bbc/1mhzbus/beebsid.h
index d78d5486c10..107e875abde 100644
--- a/src/devices/bus/bbc/1mhzbus/beebsid.h
+++ b/src/devices/bus/bbc/1mhzbus/beebsid.h
@@ -34,10 +34,10 @@ protected:
// optional information overrides
virtual void device_add_mconfig(machine_config &config) override;
- virtual DECLARE_READ8_MEMBER(fred_r) override;
- virtual DECLARE_WRITE8_MEMBER(fred_w) override;
- virtual DECLARE_READ8_MEMBER(jim_r) override;
- virtual DECLARE_WRITE8_MEMBER(jim_w) override;
+ virtual uint8_t fred_r(offs_t offset) override;
+ virtual void fred_w(offs_t offset, uint8_t data) override;
+ virtual uint8_t jim_r(offs_t offset) override;
+ virtual void jim_w(offs_t offset, uint8_t data) override;
private:
required_device<bbc_1mhzbus_slot_device> m_1mhzbus;
diff --git a/src/devices/bus/bbc/1mhzbus/cfa3000opt.cpp b/src/devices/bus/bbc/1mhzbus/cfa3000opt.cpp
index 0946d9cdf82..e5ac755e006 100644
--- a/src/devices/bus/bbc/1mhzbus/cfa3000opt.cpp
+++ b/src/devices/bus/bbc/1mhzbus/cfa3000opt.cpp
@@ -98,7 +98,7 @@ void cfa3000_opt_device::device_start()
// IMPLEMENTATION
//**************************************************************************
-READ8_MEMBER(cfa3000_opt_device::fred_r)
+uint8_t cfa3000_opt_device::fred_r(offs_t offset)
{
uint8_t data = 0xff;
diff --git a/src/devices/bus/bbc/1mhzbus/cfa3000opt.h b/src/devices/bus/bbc/1mhzbus/cfa3000opt.h
index 5a4e413754b..64913e95604 100644
--- a/src/devices/bus/bbc/1mhzbus/cfa3000opt.h
+++ b/src/devices/bus/bbc/1mhzbus/cfa3000opt.h
@@ -35,7 +35,7 @@ protected:
// optional information overrides
virtual ioport_constructor device_input_ports() const override;
- virtual DECLARE_READ8_MEMBER(fred_r) override;
+ virtual uint8_t fred_r(offs_t offset) override;
private:
required_ioport m_opt;
diff --git a/src/devices/bus/bbc/1mhzbus/emrmidi.cpp b/src/devices/bus/bbc/1mhzbus/emrmidi.cpp
index 9c7c036f44c..6cfbacf23da 100644
--- a/src/devices/bus/bbc/1mhzbus/emrmidi.cpp
+++ b/src/devices/bus/bbc/1mhzbus/emrmidi.cpp
@@ -81,23 +81,23 @@ void bbc_emrmidi_device::device_start()
// IMPLEMENTATION
//**************************************************************************
-READ8_MEMBER(bbc_emrmidi_device::fred_r)
+uint8_t bbc_emrmidi_device::fred_r(offs_t offset)
{
uint8_t data = 0xff;
if (offset >= 0xf0 && offset < 0xf2)
{
- data = m_acia->read(space, offset & 1);
+ data = m_acia->read(offset & 1);
}
return data;
}
-WRITE8_MEMBER(bbc_emrmidi_device::fred_w)
+void bbc_emrmidi_device::fred_w(offs_t offset, uint8_t data)
{
if (offset >= 0xf0 && offset < 0xf2)
{
- m_acia->write(space, offset & 1, data);
+ m_acia->write(offset & 1, data);
}
}
diff --git a/src/devices/bus/bbc/1mhzbus/emrmidi.h b/src/devices/bus/bbc/1mhzbus/emrmidi.h
index bbc41992948..341e487ce24 100644
--- a/src/devices/bus/bbc/1mhzbus/emrmidi.h
+++ b/src/devices/bus/bbc/1mhzbus/emrmidi.h
@@ -36,8 +36,8 @@ protected:
// optional information overrides
virtual void device_add_mconfig(machine_config &config) override;
- virtual DECLARE_READ8_MEMBER(fred_r) override;
- virtual DECLARE_WRITE8_MEMBER(fred_w) override;
+ virtual uint8_t fred_r(offs_t offset) override;
+ virtual void fred_w(offs_t offset, uint8_t data) override;
private:
DECLARE_WRITE_LINE_MEMBER(write_acia_clock);
diff --git a/src/devices/bus/bbc/1mhzbus/ieee488.cpp b/src/devices/bus/bbc/1mhzbus/ieee488.cpp
index 383ceef537b..3aae6fe2f54 100644
--- a/src/devices/bus/bbc/1mhzbus/ieee488.cpp
+++ b/src/devices/bus/bbc/1mhzbus/ieee488.cpp
@@ -54,7 +54,8 @@ ROM_END
// device_add_mconfig - add device configuration
//-------------------------------------------------
-MACHINE_CONFIG_START(bbc_ieee488_device::device_add_mconfig)
+void bbc_ieee488_device::device_add_mconfig(machine_config &config)
+{
TMS9914(config, m_tms9914, 5_MHz_XTAL);
m_tms9914->int_write_cb().set(DEVICE_SELF_OWNER, FUNC(bbc_1mhzbus_slot_device::irq_w));
m_tms9914->dio_read_cb().set(IEEE488_TAG, FUNC(ieee488_device::dio_r));
@@ -67,23 +68,25 @@ MACHINE_CONFIG_START(bbc_ieee488_device::device_add_mconfig)
m_tms9914->srq_write_cb().set(IEEE488_TAG, FUNC(ieee488_device::host_srq_w));
m_tms9914->atn_write_cb().set(IEEE488_TAG, FUNC(ieee488_device::host_atn_w));
m_tms9914->ren_write_cb().set(IEEE488_TAG, FUNC(ieee488_device::host_ren_w));
- MCFG_IEEE488_BUS_ADD()
- MCFG_IEEE488_EOI_CALLBACK(WRITELINE(m_tms9914, tms9914_device, eoi_w))
- MCFG_IEEE488_DAV_CALLBACK(WRITELINE(m_tms9914, tms9914_device, dav_w))
- MCFG_IEEE488_NRFD_CALLBACK(WRITELINE(m_tms9914, tms9914_device, nrfd_w))
- MCFG_IEEE488_NDAC_CALLBACK(WRITELINE(m_tms9914, tms9914_device, ndac_w))
- MCFG_IEEE488_IFC_CALLBACK(WRITELINE(m_tms9914, tms9914_device, ifc_w))
- MCFG_IEEE488_SRQ_CALLBACK(WRITELINE(m_tms9914, tms9914_device, srq_w))
- MCFG_IEEE488_ATN_CALLBACK(WRITELINE(m_tms9914, tms9914_device, atn_w))
- MCFG_IEEE488_REN_CALLBACK(WRITELINE(m_tms9914, tms9914_device, ren_w))
- MCFG_IEEE488_SLOT_ADD("ieee_dev", 0, cbm_ieee488_devices, nullptr)
+
+ IEEE488(config, m_ieee);
+ m_ieee->eoi_callback().set(m_tms9914, FUNC(tms9914_device::eoi_w));
+ m_ieee->dav_callback().set(m_tms9914, FUNC(tms9914_device::dav_w));
+ m_ieee->nrfd_callback().set(m_tms9914, FUNC(tms9914_device::nrfd_w));
+ m_ieee->ndac_callback().set(m_tms9914, FUNC(tms9914_device::ndac_w));
+ m_ieee->ifc_callback().set(m_tms9914, FUNC(tms9914_device::ifc_w));
+ m_ieee->srq_callback().set(m_tms9914, FUNC(tms9914_device::srq_w));
+ m_ieee->atn_callback().set(m_tms9914, FUNC(tms9914_device::atn_w));
+ m_ieee->ren_callback().set(m_tms9914, FUNC(tms9914_device::ren_w));
+ IEEE488_SLOT(config, "ieee_dev", 0, cbm_ieee488_devices, nullptr);
BBC_1MHZBUS_SLOT(config, m_1mhzbus, DERIVED_CLOCK(1, 1), bbc_1mhzbus_devices, nullptr);
m_1mhzbus->irq_handler().set(DEVICE_SELF_OWNER, FUNC(bbc_1mhzbus_slot_device::irq_w));
m_1mhzbus->nmi_handler().set(DEVICE_SELF_OWNER, FUNC(bbc_1mhzbus_slot_device::nmi_w));
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(bbc_b488_device::device_add_mconfig)
+void bbc_b488_device::device_add_mconfig(machine_config &config)
+{
TMS9914(config, m_tms9914, 5_MHz_XTAL); // TODO: verify clock
m_tms9914->int_write_cb().set(DEVICE_SELF_OWNER, FUNC(bbc_1mhzbus_slot_device::irq_w));
m_tms9914->dio_read_cb().set(IEEE488_TAG, FUNC(ieee488_device::dio_r));
@@ -96,35 +99,37 @@ MACHINE_CONFIG_START(bbc_b488_device::device_add_mconfig)
m_tms9914->srq_write_cb().set(IEEE488_TAG, FUNC(ieee488_device::host_srq_w));
m_tms9914->atn_write_cb().set(IEEE488_TAG, FUNC(ieee488_device::host_atn_w));
m_tms9914->ren_write_cb().set(IEEE488_TAG, FUNC(ieee488_device::host_ren_w));
- MCFG_IEEE488_BUS_ADD()
- MCFG_IEEE488_EOI_CALLBACK(WRITELINE(m_tms9914, tms9914_device, eoi_w))
- MCFG_IEEE488_DAV_CALLBACK(WRITELINE(m_tms9914, tms9914_device, dav_w))
- MCFG_IEEE488_NRFD_CALLBACK(WRITELINE(m_tms9914, tms9914_device, nrfd_w))
- MCFG_IEEE488_NDAC_CALLBACK(WRITELINE(m_tms9914, tms9914_device, ndac_w))
- MCFG_IEEE488_IFC_CALLBACK(WRITELINE(m_tms9914, tms9914_device, ifc_w))
- MCFG_IEEE488_SRQ_CALLBACK(WRITELINE(m_tms9914, tms9914_device, srq_w))
- MCFG_IEEE488_ATN_CALLBACK(WRITELINE(m_tms9914, tms9914_device, atn_w))
- MCFG_IEEE488_REN_CALLBACK(WRITELINE(m_tms9914, tms9914_device, ren_w))
- MCFG_IEEE488_SLOT_ADD("ieee_dev", 0, cbm_ieee488_devices, nullptr)
+
+ IEEE488(config, m_ieee);
+ m_ieee->eoi_callback().set(m_tms9914, FUNC(tms9914_device::eoi_w));
+ m_ieee->dav_callback().set(m_tms9914, FUNC(tms9914_device::dav_w));
+ m_ieee->nrfd_callback().set(m_tms9914, FUNC(tms9914_device::nrfd_w));
+ m_ieee->ndac_callback().set(m_tms9914, FUNC(tms9914_device::ndac_w));
+ m_ieee->ifc_callback().set(m_tms9914, FUNC(tms9914_device::ifc_w));
+ m_ieee->srq_callback().set(m_tms9914, FUNC(tms9914_device::srq_w));
+ m_ieee->atn_callback().set(m_tms9914, FUNC(tms9914_device::atn_w));
+ m_ieee->ren_callback().set(m_tms9914, FUNC(tms9914_device::ren_w));
+ IEEE488_SLOT(config, "ieee_dev", 0, cbm_ieee488_devices, nullptr);
// TODO: LED's for ATN, TALK, and DATA
-MACHINE_CONFIG_END
+}
-//MACHINE_CONFIG_START(bbc_procyon_device::device_add_mconfig)
+//void bbc_procyon_device::device_add_mconfig(machine_config &config)
+//{
// TODO: Implement MC68488
- //MCFG_IEEE488_BUS_ADD()
- //MCFG_IEEE488_EOI_CALLBACK(WRITELINE(m_mc68488, mc68488_device, eoi_w))
- //MCFG_IEEE488_DAV_CALLBACK(WRITELINE(m_mc68488, mc68488_device, dav_w))
- //MCFG_IEEE488_NRFD_CALLBACK(WRITELINE(m_mc68488, mc68488_device, nrfd_w))
- //MCFG_IEEE488_NDAC_CALLBACK(WRITELINE(m_mc68488, mc68488_device, ndac_w))
- //MCFG_IEEE488_IFC_CALLBACK(WRITELINE(m_mc68488, mc68488_device, ifc_w))
- //MCFG_IEEE488_SRQ_CALLBACK(WRITELINE(m_mc68488, mc68488_device, srq_w))
- //MCFG_IEEE488_ATN_CALLBACK(WRITELINE(m_mc68488, mc68488_device, atn_w))
- //MCFG_IEEE488_REN_CALLBACK(WRITELINE(m_mc68488, mc68488_device, ren_w))
- //MCFG_IEEE488_SLOT_ADD("ieee_dev", 0, cbm_ieee488_devices, nullptr)
+ //IEEE488(config, m_ieee);
+ //m_ieee->eoi_callback(m_mc68488, FUNC(mc68488_device::eoi_w));
+ //m_ieee->dav_callback(m_mc68488, FUNC(mc68488_device::dav_w));
+ //m_ieee->nrfd_callback(m_mc68488, FUNC(mc68488_device::nrfd_w));
+ //m_ieee->ndac_callback(m_mc68488, FUNC(mc68488_device::ndac_w));
+ //m_ieee->ifc_callback(m_mc68488, FUNC(mc68488_device::ifc_w));
+ //m_ieee->srq_callback(m_mc68488, FUNC(mc68488_device::srq_w));
+ //m_ieee->atn_callback(m_mc68488, FUNC(mc68488_device::atn_w));
+ //m_ieee->ren_callback(m_mc68488, FUNC(mc68488_device::ren_w));
+ //IEEE488_SLOT(config, "ieee_dev", 0, cbm_ieee488_devices, nullptr);
// TODO: LED's for Bus Active, Byte Out, and Byte In
-//MACHINE_CONFIG_END
+//}
//-------------------------------------------------
// rom_region - device-specific ROM region
@@ -192,82 +197,82 @@ void bbc_b488_device::device_start()
// IMPLEMENTATION
//**************************************************************************
-READ8_MEMBER(bbc_ieee488_device::fred_r)
+uint8_t bbc_ieee488_device::fred_r(offs_t offset)
{
uint8_t data = 0xff;
if (offset >= 0x20 && offset < 0x28)
{
- data = m_tms9914->reg8_r(space, offset & 0x07);
+ data = m_tms9914->read(offset & 0x07);
}
- data &= m_1mhzbus->fred_r(space, offset);
+ data &= m_1mhzbus->fred_r(offset);
return data;
}
-WRITE8_MEMBER(bbc_ieee488_device::fred_w)
+void bbc_ieee488_device::fred_w(offs_t offset, uint8_t data)
{
if (offset >= 0x20 && offset < 0x28)
{
- m_tms9914->reg8_w(space, offset & 0x07, data);
+ m_tms9914->write(offset & 0x07, data);
}
- m_1mhzbus->fred_w(space, offset, data);
+ m_1mhzbus->fred_w(offset, data);
}
-READ8_MEMBER(bbc_ieee488_device::jim_r)
+uint8_t bbc_ieee488_device::jim_r(offs_t offset)
{
uint8_t data = 0xff;
- data &= m_1mhzbus->jim_r(space, offset);
+ data &= m_1mhzbus->jim_r(offset);
return data;
}
-WRITE8_MEMBER(bbc_ieee488_device::jim_w)
+void bbc_ieee488_device::jim_w(offs_t offset, uint8_t data)
{
- m_1mhzbus->jim_w(space, offset, data);
+ m_1mhzbus->jim_w(offset, data);
}
-READ8_MEMBER(bbc_b488_device::fred_r)
+uint8_t bbc_b488_device::fred_r(offs_t offset)
{
uint8_t data = 0xff;
if (offset >= 0x20 && offset < 0x28)
{
- data = m_tms9914->reg8_r(space, offset & 0x07);
+ data = m_tms9914->read(offset & 0x07);
}
return data;
}
-WRITE8_MEMBER(bbc_b488_device::fred_w)
+void bbc_b488_device::fred_w(offs_t offset, uint8_t data)
{
if (offset >= 0x20 && offset < 0x28)
{
- m_tms9914->reg8_w(space, offset & 0x07, data);
+ m_tms9914->write(offset & 0x07, data);
}
}
-//READ8_MEMBER(bbc_procyon_device::fred_r)
+//uint8_t bbc_procyon_device::fred_r(offs_t offset)
//{
//uint8_t data = 0xff;
//if (offset >= 0x20 && offset < 0x28)
//{
- // data = mc68488_device->reg8_r(space, offset & 0x07);
+ // data = mc68488_device->read(offset & 0x07);
//}
//return data;
//}
-//WRITE8_MEMBER(bbc_procyon_device::fred_w)
+//void bbc_procyon_device::fred_w(offs_t offset, uint8_t data)
//{
//if (offset >= 0x20 && offset < 0x28)
//{
- // mc68488_device->reg8_w(space, offset & 0x07, data);
+ // mc68488_device->write(offset & 0x07, data);
//}
//}
diff --git a/src/devices/bus/bbc/1mhzbus/ieee488.h b/src/devices/bus/bbc/1mhzbus/ieee488.h
index 05a9e60c928..9b810b4bf8d 100644
--- a/src/devices/bus/bbc/1mhzbus/ieee488.h
+++ b/src/devices/bus/bbc/1mhzbus/ieee488.h
@@ -42,10 +42,10 @@ protected:
virtual void device_add_mconfig(machine_config &config) override;
virtual const tiny_rom_entry *device_rom_region() const override;
- virtual DECLARE_READ8_MEMBER(fred_r) override;
- virtual DECLARE_WRITE8_MEMBER(fred_w) override;
- virtual DECLARE_READ8_MEMBER(jim_r) override;
- virtual DECLARE_WRITE8_MEMBER(jim_w) override;
+ virtual uint8_t fred_r(offs_t offset) override;
+ virtual void fred_w(offs_t offset, uint8_t data) override;
+ virtual uint8_t jim_r(offs_t offset) override;
+ virtual void jim_w(offs_t offset, uint8_t data) override;
private:
required_device<ieee488_device> m_ieee;
@@ -69,8 +69,8 @@ protected:
// optional information overrides
virtual void device_add_mconfig(machine_config &config) override;
- virtual DECLARE_READ8_MEMBER(fred_r) override;
- virtual DECLARE_WRITE8_MEMBER(fred_w) override;
+ virtual uint8_t fred_r(offs_t offset) override;
+ virtual void fred_w(offs_t offset, uint8_t data) override;
private:
required_device<ieee488_device> m_ieee;
@@ -94,8 +94,8 @@ private:
// virtual void device_add_mconfig(machine_config &config) override;
// virtual const tiny_rom_entry *device_rom_region() const override;
//
-// virtual DECLARE_READ8_MEMBER(fred_r) override;
-// virtual DECLARE_WRITE8_MEMBER(fred_w) override;
+// virtual uint8_t fred_r(offs_t offset) override;
+// virtual void fred_w(offs_t offset, uint8_t data) override;
//
//private:
// required_device<ieee488_device> m_ieee;
diff --git a/src/devices/bus/bbc/1mhzbus/m2000.cpp b/src/devices/bus/bbc/1mhzbus/m2000.cpp
index 88a713d1ff8..8203cada22e 100644
--- a/src/devices/bus/bbc/1mhzbus/m2000.cpp
+++ b/src/devices/bus/bbc/1mhzbus/m2000.cpp
@@ -91,7 +91,7 @@ void bbc_m2000_device::device_start()
// IMPLEMENTATION
//**************************************************************************
-READ8_MEMBER(bbc_m2000_device::fred_r)
+uint8_t bbc_m2000_device::fred_r(offs_t offset)
{
uint8_t data = 0xff;
@@ -100,59 +100,59 @@ READ8_MEMBER(bbc_m2000_device::fred_r)
switch (offset & 0x06)
{
case 0x00:
- data = m_acia1->read(space, offset & 1);
+ data = m_acia1->read(offset & 1);
break;
case 0x02:
- data = m_acia2->read(space, offset & 1);
+ data = m_acia2->read(offset & 1);
break;
case 0x04:
- data = m_acia3->read(space, offset & 1);
+ data = m_acia3->read(offset & 1);
break;
case 0x06:
break;
}
}
- data &= m_1mhzbus->fred_r(space, offset);
+ data &= m_1mhzbus->fred_r(offset);
return data;
}
-WRITE8_MEMBER(bbc_m2000_device::fred_w)
+void bbc_m2000_device::fred_w(offs_t offset, uint8_t data)
{
if (offset >= 0x08 && offset < 0x10)
{
switch (offset & 0x06)
{
case 0x00:
- m_acia1->write(space, offset & 1, data);
+ m_acia1->write(offset & 1, data);
break;
case 0x02:
- m_acia2->write(space, offset & 1, data);
+ m_acia2->write(offset & 1, data);
break;
case 0x04:
- m_acia3->write(space, offset & 1, data);
+ m_acia3->write(offset & 1, data);
break;
case 0x06:
break;
}
}
- m_1mhzbus->fred_w(space, offset, data);
+ m_1mhzbus->fred_w(offset, data);
}
-READ8_MEMBER(bbc_m2000_device::jim_r)
+uint8_t bbc_m2000_device::jim_r(offs_t offset)
{
uint8_t data = 0xff;
- data &= m_1mhzbus->jim_r(space, offset);
+ data &= m_1mhzbus->jim_r(offset);
return data;
}
-WRITE8_MEMBER(bbc_m2000_device::jim_w)
+void bbc_m2000_device::jim_w(offs_t offset, uint8_t data)
{
- m_1mhzbus->jim_w(space, offset, data);
+ m_1mhzbus->jim_w(offset, data);
}
WRITE_LINE_MEMBER(bbc_m2000_device::write_acia_clock)
diff --git a/src/devices/bus/bbc/1mhzbus/m2000.h b/src/devices/bus/bbc/1mhzbus/m2000.h
index f476c92dac5..eeee1034a4e 100644
--- a/src/devices/bus/bbc/1mhzbus/m2000.h
+++ b/src/devices/bus/bbc/1mhzbus/m2000.h
@@ -38,10 +38,10 @@ protected:
// optional information overrides
virtual void device_add_mconfig(machine_config &config) override;
- virtual DECLARE_READ8_MEMBER(fred_r) override;
- virtual DECLARE_WRITE8_MEMBER(fred_w) override;
- virtual DECLARE_READ8_MEMBER(jim_r) override;
- virtual DECLARE_WRITE8_MEMBER(jim_w) override;
+ virtual uint8_t fred_r(offs_t offset) override;
+ virtual void fred_w(offs_t offset, uint8_t data) override;
+ virtual uint8_t jim_r(offs_t offset) override;
+ virtual void jim_w(offs_t offset, uint8_t data) override;
private:
DECLARE_WRITE_LINE_MEMBER(write_acia_clock);
diff --git a/src/devices/bus/bbc/1mhzbus/opus3.cpp b/src/devices/bus/bbc/1mhzbus/opus3.cpp
index 65a8a3134ec..77f21ac199a 100644
--- a/src/devices/bus/bbc/1mhzbus/opus3.cpp
+++ b/src/devices/bus/bbc/1mhzbus/opus3.cpp
@@ -159,7 +159,7 @@ void bbc_opusa_device::device_start()
// IMPLEMENTATION
//**************************************************************************
-READ8_MEMBER(bbc_opus3_device::fred_r)
+uint8_t bbc_opus3_device::fred_r(offs_t offset)
{
uint8_t data = 0xff;
@@ -175,7 +175,7 @@ READ8_MEMBER(bbc_opus3_device::fred_r)
return data;
}
-WRITE8_MEMBER(bbc_opus3_device::fred_w)
+void bbc_opus3_device::fred_w(offs_t offset, uint8_t data)
{
floppy_image_device *floppy = nullptr;
@@ -219,7 +219,7 @@ WRITE_LINE_MEMBER(bbc_opus3_device::fdc_drq_w)
m_slot->nmi_w((m_fdc_drq && m_fdc_ie) ? ASSERT_LINE : CLEAR_LINE);
}
-READ8_MEMBER(bbc_opus3_device::jim_r)
+uint8_t bbc_opus3_device::jim_r(offs_t offset)
{
if ((m_ramdisk_page << 8) < m_ramdisk->size())
return m_ramdisk->read((m_ramdisk_page << 8) + offset);
@@ -227,7 +227,7 @@ READ8_MEMBER(bbc_opus3_device::jim_r)
return 0xff;
}
-WRITE8_MEMBER(bbc_opus3_device::jim_w)
+void bbc_opus3_device::jim_w(offs_t offset, uint8_t data)
{
if ((m_ramdisk_page << 8) < m_ramdisk->size())
m_ramdisk->write((m_ramdisk_page << 8) + offset, data);
diff --git a/src/devices/bus/bbc/1mhzbus/opus3.h b/src/devices/bus/bbc/1mhzbus/opus3.h
index ef7a2174f5c..7d287f1622c 100644
--- a/src/devices/bus/bbc/1mhzbus/opus3.h
+++ b/src/devices/bus/bbc/1mhzbus/opus3.h
@@ -39,10 +39,10 @@ protected:
virtual void device_add_mconfig(machine_config &config) override;
virtual const tiny_rom_entry *device_rom_region() const override;
- virtual DECLARE_READ8_MEMBER(fred_r) override;
- virtual DECLARE_WRITE8_MEMBER(fred_w) override;
- virtual DECLARE_READ8_MEMBER(jim_r) override;
- virtual DECLARE_WRITE8_MEMBER(jim_w) override;
+ virtual uint8_t fred_r(offs_t offset) override;
+ virtual void fred_w(offs_t offset, uint8_t data) override;
+ virtual uint8_t jim_r(offs_t offset) override;
+ virtual void jim_w(offs_t offset, uint8_t data) override;
private:
DECLARE_FLOPPY_FORMATS(floppy_formats);
diff --git a/src/devices/bus/bbc/1mhzbus/sprite.cpp b/src/devices/bus/bbc/1mhzbus/sprite.cpp
new file mode 100644
index 00000000000..ee7f5f292e7
--- /dev/null
+++ b/src/devices/bus/bbc/1mhzbus/sprite.cpp
@@ -0,0 +1,99 @@
+// license:BSD-3-Clause
+// copyright-holders:Nigel Barnes
+/**********************************************************************
+
+ Logotron Sprite Board
+
+**********************************************************************/
+
+
+#include "emu.h"
+#include "sprite.h"
+#include "screen.h"
+
+
+//**************************************************************************
+// DEVICE DEFINITIONS
+//**************************************************************************
+
+DEFINE_DEVICE_TYPE(BBC_SPRITE, bbc_sprite_device, "bbc_sprite", "Logotron Sprite Board");
+
+
+//-------------------------------------------------
+// device_add_mconfig - add device configuration
+//-------------------------------------------------
+
+void bbc_sprite_device::device_add_mconfig(machine_config &config)
+{
+ TMS9129(config, m_vdp, 10.738635_MHz_XTAL);
+ m_vdp->int_callback().set(DEVICE_SELF_OWNER, FUNC(bbc_1mhzbus_slot_device::irq_w));
+ m_vdp->set_screen("screen");
+ m_vdp->set_vram_size(0x4000);
+
+ SCREEN(config, "screen", SCREEN_TYPE_RASTER);
+}
+
+//**************************************************************************
+// LIVE DEVICE
+//**************************************************************************
+
+//-------------------------------------------------
+// bbc_sprite_device - constructor
+//-------------------------------------------------
+
+bbc_sprite_device::bbc_sprite_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+ : device_t(mconfig, BBC_SPRITE, tag, owner, clock)
+ , device_bbc_1mhzbus_interface(mconfig, *this)
+ , m_vdp(*this, "vdp")
+{
+}
+
+//-------------------------------------------------
+// device_start - device-specific startup
+//-------------------------------------------------
+
+void bbc_sprite_device::device_start()
+{
+}
+
+//-------------------------------------------------
+// device_reset - device-specific reset
+//-------------------------------------------------
+
+void bbc_sprite_device::device_reset()
+{
+}
+
+
+//**************************************************************************
+// IMPLEMENTATION
+//**************************************************************************
+
+uint8_t bbc_sprite_device::fred_r(offs_t offset)
+{
+ uint8_t data = 0xff;
+
+ switch (offset)
+ {
+ case 0xa0:
+ data = m_vdp->vram_read();
+ break;
+ case 0xa2:
+ data = m_vdp->register_read();
+ break;
+ }
+ return data;
+}
+
+void bbc_sprite_device::fred_w(offs_t offset, uint8_t data)
+{
+ switch (offset)
+ {
+ case 0xa1:
+ m_vdp->vram_write(data);
+ break;
+ case 0xa3:
+ m_vdp->register_write(data);
+ break;
+ }
+}
diff --git a/src/devices/bus/bbc/1mhzbus/sprite.h b/src/devices/bus/bbc/1mhzbus/sprite.h
new file mode 100644
index 00000000000..02b0cff5dc2
--- /dev/null
+++ b/src/devices/bus/bbc/1mhzbus/sprite.h
@@ -0,0 +1,49 @@
+// license:BSD-3-Clause
+// copyright-holders:Nigel Barnes
+/**********************************************************************
+
+ Logotron Sprite Board
+
+**********************************************************************/
+
+
+#ifndef MAME_BUS_BBC_1MHZBUS_SPRITE_H
+#define MAME_BUS_BBC_1MHZBUS_SPRITE_H
+
+#include "1mhzbus.h"
+#include "video/tms9928a.h"
+
+
+//**************************************************************************
+// TYPE DEFINITIONS
+//**************************************************************************
+
+class bbc_sprite_device:
+ public device_t,
+ public device_bbc_1mhzbus_interface
+{
+public:
+ // construction/destruction
+ bbc_sprite_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+
+protected:
+ // device-level overrides
+ virtual void device_start() override;
+ virtual void device_reset() override;
+
+ // optional information overrides
+ virtual void device_add_mconfig(machine_config &config) override;
+
+ virtual uint8_t fred_r(offs_t offset) override;
+ virtual void fred_w(offs_t offset, uint8_t data) override;
+
+private:
+ required_device<tms9129_device> m_vdp;
+};
+
+
+// device type definition
+DECLARE_DEVICE_TYPE(BBC_SPRITE, bbc_sprite_device);
+
+
+#endif /* MAME_BUS_BBC_1MHZBUS_SPRITE_H */
diff --git a/src/devices/bus/bbc/exp/exp.cpp b/src/devices/bus/bbc/exp/exp.cpp
index d2a5cca3611..25f19746b72 100644
--- a/src/devices/bus/bbc/exp/exp.cpp
+++ b/src/devices/bus/bbc/exp/exp.cpp
@@ -97,26 +97,26 @@ void bbc_exp_slot_device::device_reset()
// read
//-------------------------------------------------
-READ8_MEMBER(bbc_exp_slot_device::fred_r)
+uint8_t bbc_exp_slot_device::fred_r(offs_t offset)
{
if (m_card)
- return m_card->fred_r(space, offset);
+ return m_card->fred_r(offset);
else
return 0xff;
}
-READ8_MEMBER(bbc_exp_slot_device::jim_r)
+uint8_t bbc_exp_slot_device::jim_r(offs_t offset)
{
if (m_card)
- return m_card->jim_r(space, offset);
+ return m_card->jim_r(offset);
else
return 0xff;
}
-READ8_MEMBER(bbc_exp_slot_device::sheila_r)
+uint8_t bbc_exp_slot_device::sheila_r(offs_t offset)
{
if (m_card)
- return m_card->sheila_r(space, offset);
+ return m_card->sheila_r(offset);
else
return 0xfe;
}
@@ -125,32 +125,32 @@ READ8_MEMBER(bbc_exp_slot_device::sheila_r)
// write
//-------------------------------------------------
-WRITE8_MEMBER(bbc_exp_slot_device::fred_w)
+void bbc_exp_slot_device::fred_w(offs_t offset, uint8_t data)
{
if (m_card)
- m_card->fred_w(space, offset, data);
+ m_card->fred_w(offset, data);
}
-WRITE8_MEMBER(bbc_exp_slot_device::jim_w)
+void bbc_exp_slot_device::jim_w(offs_t offset, uint8_t data)
{
if (m_card)
- m_card->jim_w(space, offset, data);
+ m_card->jim_w(offset, data);
}
-WRITE8_MEMBER(bbc_exp_slot_device::sheila_w)
+void bbc_exp_slot_device::sheila_w(offs_t offset, uint8_t data)
{
if (m_card)
- m_card->sheila_w(space, offset, data);
+ m_card->sheila_w(offset, data);
}
//-------------------------------------------------
// pb_r
//-------------------------------------------------
-READ8_MEMBER(bbc_exp_slot_device::pb_r)
+uint8_t bbc_exp_slot_device::pb_r()
{
if (m_card)
- return 0x1f | m_card->pb_r(space, 0);
+ return 0x1f | m_card->pb_r();
else
return 0xff;
}
@@ -160,10 +160,10 @@ READ8_MEMBER(bbc_exp_slot_device::pb_r)
// pb_w
//-------------------------------------------------
-WRITE8_MEMBER(bbc_exp_slot_device::pb_w)
+void bbc_exp_slot_device::pb_w(uint8_t data)
{
if (m_card)
- m_card->pb_w(space, 0, data);
+ m_card->pb_w(data);
}
//-------------------------------------------------
diff --git a/src/devices/bus/bbc/exp/exp.h b/src/devices/bus/bbc/exp/exp.h
index 5269deb3900..ef1a0174b1a 100644
--- a/src/devices/bus/bbc/exp/exp.h
+++ b/src/devices/bus/bbc/exp/exp.h
@@ -75,12 +75,12 @@ public:
auto cb1_handler() { return m_cb1_handler.bind(); }
auto cb2_handler() { return m_cb2_handler.bind(); }
- virtual DECLARE_READ8_MEMBER(fred_r);
- virtual DECLARE_WRITE8_MEMBER(fred_w);
- virtual DECLARE_READ8_MEMBER(jim_r);
- virtual DECLARE_WRITE8_MEMBER(jim_w);
- virtual DECLARE_READ8_MEMBER(sheila_r);
- virtual DECLARE_WRITE8_MEMBER(sheila_w);
+ uint8_t fred_r(offs_t offset);
+ void fred_w(offs_t offset, uint8_t data);
+ uint8_t jim_r(offs_t offset);
+ void jim_w(offs_t offset, uint8_t data);
+ uint8_t sheila_r(offs_t offset);
+ void sheila_w(offs_t offset, uint8_t data);
DECLARE_WRITE_LINE_MEMBER( irq_w ) { m_irq_handler(state); }
DECLARE_WRITE_LINE_MEMBER( nmi_w ) { m_nmi_handler(state); }
@@ -89,8 +89,8 @@ public:
DECLARE_WRITE_LINE_MEMBER(cb1_w) { m_cb1_handler(state); }
DECLARE_WRITE_LINE_MEMBER(cb2_w) { m_cb2_handler(state); }
- DECLARE_READ8_MEMBER(pb_r);
- DECLARE_WRITE8_MEMBER(pb_w);
+ uint8_t pb_r();
+ void pb_w(uint8_t data);
protected:
// device-level overrides
@@ -114,15 +114,15 @@ private:
class device_bbc_exp_interface : public device_slot_card_interface
{
public:
- virtual DECLARE_READ8_MEMBER(fred_r) { return 0xff; }
- virtual DECLARE_WRITE8_MEMBER(fred_w) { }
- virtual DECLARE_READ8_MEMBER(jim_r) { return 0xff; }
- virtual DECLARE_WRITE8_MEMBER(jim_w) { }
- virtual DECLARE_READ8_MEMBER(sheila_r) { return 0xfe; }
- virtual DECLARE_WRITE8_MEMBER(sheila_w) { }
-
- virtual DECLARE_READ8_MEMBER(pb_r) { return 0xff; }
- virtual DECLARE_WRITE8_MEMBER(pb_w) { }
+ virtual uint8_t fred_r(offs_t offset) { return 0xff; }
+ virtual void fred_w(offs_t offset, uint8_t data) { }
+ virtual uint8_t jim_r(offs_t offset) { return 0xff; }
+ virtual void jim_w(offs_t offset, uint8_t data) { }
+ virtual uint8_t sheila_r(offs_t offset) { return 0xfe; }
+ virtual void sheila_w(offs_t offset, uint8_t data) { }
+
+ virtual uint8_t pb_r() { return 0xff; }
+ virtual void pb_w(uint8_t data) { }
protected:
device_bbc_exp_interface(const machine_config &mconfig, device_t &device);
diff --git a/src/devices/bus/bbc/exp/mertec.cpp b/src/devices/bus/bbc/exp/mertec.cpp
index 8f896da0359..ab9dc3c2f6e 100644
--- a/src/devices/bus/bbc/exp/mertec.cpp
+++ b/src/devices/bus/bbc/exp/mertec.cpp
@@ -52,7 +52,7 @@ void bbc_mertec_device::device_add_mconfig(machine_config &config)
//m_pia->irq_handler().set("irqs", FUNC(input_merger_device::in_w<0>));
/* adc */
- UPD7002(config, m_upd7002, 0);
+ UPD7002(config, m_upd7002, DERIVED_CLOCK(1, 8));
m_upd7002->set_get_analogue_callback(FUNC(bbc_mertec_device::get_analogue_input), this);
m_upd7002->set_eoc_callback(FUNC(bbc_mertec_device::upd7002_eoc), this);
@@ -114,52 +114,52 @@ void bbc_mertec_device::upd7002_eoc(int data)
//m_via6522_0->write_cb1(data);
}
-READ8_MEMBER(bbc_mertec_device::fred_r)
+uint8_t bbc_mertec_device::fred_r(offs_t offset)
{
- return m_2mhzbus->fred_r(space, offset);
+ return m_2mhzbus->fred_r(offset);
}
-WRITE8_MEMBER(bbc_mertec_device::fred_w)
+void bbc_mertec_device::fred_w(offs_t offset, uint8_t data)
{
- m_2mhzbus->fred_w(space, offset, data);
+ m_2mhzbus->fred_w(offset, data);
}
-READ8_MEMBER(bbc_mertec_device::jim_r)
+uint8_t bbc_mertec_device::jim_r(offs_t offset)
{
- return m_2mhzbus->jim_r(space, offset);
+ return m_2mhzbus->jim_r(offset);
}
-WRITE8_MEMBER(bbc_mertec_device::jim_w)
+void bbc_mertec_device::jim_w(offs_t offset, uint8_t data)
{
- m_2mhzbus->jim_w(space, offset, data);
+ m_2mhzbus->jim_w(offset, data);
}
-READ8_MEMBER(bbc_mertec_device::sheila_r)
+uint8_t bbc_mertec_device::sheila_r(offs_t offset)
{
uint8_t data = 0xfe;
if (offset >= 0x18 && offset < 0x20)
{
- data = m_upd7002->read(space, offset & 0x03);
+ data = m_upd7002->read(offset & 0x03);
}
return data;
}
-WRITE8_MEMBER(bbc_mertec_device::sheila_w)
+void bbc_mertec_device::sheila_w(offs_t offset, uint8_t data)
{
if (offset >= 0x18 && offset < 0x20)
{
- m_upd7002->write(space, offset & 0x03, data);
+ m_upd7002->write(offset & 0x03, data);
}
}
-READ8_MEMBER(bbc_mertec_device::pb_r)
+uint8_t bbc_mertec_device::pb_r()
{
- return m_userport->pb_r(space, 0);
+ return m_userport->pb_r();
}
-WRITE8_MEMBER(bbc_mertec_device::pb_w)
+void bbc_mertec_device::pb_w(uint8_t data)
{
- m_userport->pb_w(space, 0, data);
+ m_userport->pb_w(data);
}
diff --git a/src/devices/bus/bbc/exp/mertec.h b/src/devices/bus/bbc/exp/mertec.h
index bd87c0d5398..33d71ab2ce9 100644
--- a/src/devices/bus/bbc/exp/mertec.h
+++ b/src/devices/bus/bbc/exp/mertec.h
@@ -40,15 +40,15 @@ protected:
virtual void device_add_mconfig(machine_config &config) override;
virtual const tiny_rom_entry *device_rom_region() const override;
- virtual DECLARE_READ8_MEMBER(fred_r) override;
- virtual DECLARE_WRITE8_MEMBER(fred_w) override;
- virtual DECLARE_READ8_MEMBER(jim_r) override;
- virtual DECLARE_WRITE8_MEMBER(jim_w) override;
- virtual DECLARE_READ8_MEMBER(sheila_r) override;
- virtual DECLARE_WRITE8_MEMBER(sheila_w) override;
-
- virtual DECLARE_READ8_MEMBER(pb_r) override;
- virtual DECLARE_WRITE8_MEMBER(pb_w) override;
+ virtual uint8_t fred_r(offs_t offset) override;
+ virtual void fred_w(offs_t offset, uint8_t data) override;
+ virtual uint8_t jim_r(offs_t offset) override;
+ virtual void jim_w(offs_t offset, uint8_t data) override;
+ virtual uint8_t sheila_r(offs_t offset) override;
+ virtual void sheila_w(offs_t offset, uint8_t data) override;
+
+ virtual uint8_t pb_r() override;
+ virtual void pb_w(uint8_t data) override;
private:
int get_analogue_input(int channel_number);
diff --git a/src/devices/bus/bbc/fdc/acorn.cpp b/src/devices/bus/bbc/fdc/acorn.cpp
index dd5d8f28559..0df7b38b076 100644
--- a/src/devices/bus/bbc/fdc/acorn.cpp
+++ b/src/devices/bus/bbc/fdc/acorn.cpp
@@ -166,30 +166,30 @@ void bbc_acorn1770_device::device_start()
// IMPLEMENTATION
//**************************************************************************
-READ8_MEMBER(bbc_acorn8271_device::read)
+uint8_t bbc_acorn8271_device::read(offs_t offset)
{
uint8_t data;
if (offset & 0x04)
{
- data = m_fdc->data_r(space , 0);
+ data = m_fdc->data_r();
}
else
{
- data = m_fdc->read(space, offset & 0x03);
+ data = m_fdc->read(offset & 0x03);
}
return data;
}
-WRITE8_MEMBER(bbc_acorn8271_device::write)
+void bbc_acorn8271_device::write(offs_t offset, uint8_t data)
{
if (offset & 0x04)
{
- m_fdc->data_w(space, 0, data);
+ m_fdc->data_w(data);
}
else
{
- m_fdc->write(space, offset & 0x03, data);
+ m_fdc->write(offset & 0x03, data);
}
}
@@ -207,7 +207,7 @@ WRITE_LINE_MEMBER(bbc_acorn8271_device::side_w)
}
-READ8_MEMBER(bbc_acorn1770_device::read)
+uint8_t bbc_acorn1770_device::read(offs_t offset)
{
uint8_t data = 0xff;
@@ -222,7 +222,7 @@ READ8_MEMBER(bbc_acorn1770_device::read)
return data;
}
-WRITE8_MEMBER(bbc_acorn1770_device::write)
+void bbc_acorn1770_device::write(offs_t offset, uint8_t data)
{
if (offset & 0x04)
{
diff --git a/src/devices/bus/bbc/fdc/acorn.h b/src/devices/bus/bbc/fdc/acorn.h
index 951b7e33e1d..13b434b156b 100644
--- a/src/devices/bus/bbc/fdc/acorn.h
+++ b/src/devices/bus/bbc/fdc/acorn.h
@@ -42,8 +42,8 @@ protected:
virtual void device_add_mconfig(machine_config &config) override;
virtual const tiny_rom_entry *device_rom_region() const override;
- virtual DECLARE_READ8_MEMBER(read) override;
- virtual DECLARE_WRITE8_MEMBER(write) override;
+ virtual uint8_t read(offs_t offset) override;
+ virtual void write(offs_t offset, uint8_t data) override;
private:
DECLARE_WRITE_LINE_MEMBER(motor_w);
@@ -70,8 +70,8 @@ protected:
virtual void device_add_mconfig(machine_config &config) override;
virtual const tiny_rom_entry *device_rom_region() const override;
- virtual DECLARE_READ8_MEMBER(read) override;
- virtual DECLARE_WRITE8_MEMBER(write) override;
+ virtual uint8_t read(offs_t offset) override;
+ virtual void write(offs_t offset, uint8_t data) override;
private:
DECLARE_WRITE_LINE_MEMBER(fdc_intrq_w);
diff --git a/src/devices/bus/bbc/fdc/ams.cpp b/src/devices/bus/bbc/fdc/ams.cpp
index 02af01be5c5..db9eb7e3012 100644
--- a/src/devices/bus/bbc/fdc/ams.cpp
+++ b/src/devices/bus/bbc/fdc/ams.cpp
@@ -89,30 +89,30 @@ void bbc_ams3_device::device_start()
// IMPLEMENTATION
//**************************************************************************
-READ8_MEMBER(bbc_ams3_device::read)
+uint8_t bbc_ams3_device::read(offs_t offset)
{
uint8_t data;
if (offset & 0x04)
{
- data = m_fdc->data_r(space , 0);
+ data = m_fdc->data_r();
}
else
{
- data = m_fdc->read(space, offset & 0x03);
+ data = m_fdc->read(offset & 0x03);
}
return data;
}
-WRITE8_MEMBER(bbc_ams3_device::write)
+void bbc_ams3_device::write(offs_t offset, uint8_t data)
{
if (offset & 0x04)
{
- m_fdc->data_w(space, 0, data);
+ m_fdc->data_w(data);
}
else
{
- m_fdc->write(space, offset & 0x03, data);
+ m_fdc->write(offset & 0x03, data);
}
}
diff --git a/src/devices/bus/bbc/fdc/ams.h b/src/devices/bus/bbc/fdc/ams.h
index a97a6b762c5..304666b5392 100644
--- a/src/devices/bus/bbc/fdc/ams.h
+++ b/src/devices/bus/bbc/fdc/ams.h
@@ -39,8 +39,8 @@ protected:
virtual void device_add_mconfig(machine_config &config) override;
virtual const tiny_rom_entry *device_rom_region() const override;
- virtual DECLARE_READ8_MEMBER(read) override;
- virtual DECLARE_WRITE8_MEMBER(write) override;
+ virtual uint8_t read(offs_t offset) override;
+ virtual void write(offs_t offset, uint8_t data) override;
private:
DECLARE_WRITE_LINE_MEMBER(fdc_intrq_w);
diff --git a/src/devices/bus/bbc/fdc/cumana.cpp b/src/devices/bus/bbc/fdc/cumana.cpp
index 23cecd3ebcf..f4490b1922d 100644
--- a/src/devices/bus/bbc/fdc/cumana.cpp
+++ b/src/devices/bus/bbc/fdc/cumana.cpp
@@ -137,7 +137,7 @@ void bbc_cumanafdc_device::device_start()
// IMPLEMENTATION
//**************************************************************************
-READ8_MEMBER(bbc_cumanafdc_device::read)
+uint8_t bbc_cumanafdc_device::read(offs_t offset)
{
uint8_t data;
@@ -152,7 +152,7 @@ READ8_MEMBER(bbc_cumanafdc_device::read)
return data;
}
-WRITE8_MEMBER(bbc_cumanafdc_device::write)
+void bbc_cumanafdc_device::write(offs_t offset, uint8_t data)
{
if (offset & 0x04)
{
diff --git a/src/devices/bus/bbc/fdc/cumana.h b/src/devices/bus/bbc/fdc/cumana.h
index 5b2439000ec..6e1a4f25011 100644
--- a/src/devices/bus/bbc/fdc/cumana.h
+++ b/src/devices/bus/bbc/fdc/cumana.h
@@ -39,8 +39,8 @@ protected:
// device-level overrides
virtual void device_start() override;
- virtual DECLARE_READ8_MEMBER(read) override;
- virtual DECLARE_WRITE8_MEMBER(write) override;
+ virtual uint8_t read(offs_t offset) override;
+ virtual void write(offs_t offset, uint8_t data) override;
required_device<mb8877_device> m_fdc;
required_device<floppy_connector> m_floppy0;
diff --git a/src/devices/bus/bbc/fdc/cv1797.cpp b/src/devices/bus/bbc/fdc/cv1797.cpp
index 98f54718c42..d14098a3fa3 100644
--- a/src/devices/bus/bbc/fdc/cv1797.cpp
+++ b/src/devices/bus/bbc/fdc/cv1797.cpp
@@ -100,7 +100,7 @@ void bbc_cv1797_device::device_start()
// IMPLEMENTATION
//**************************************************************************
-READ8_MEMBER(bbc_cv1797_device::read)
+uint8_t bbc_cv1797_device::read(offs_t offset)
{
uint8_t data;
@@ -115,7 +115,7 @@ READ8_MEMBER(bbc_cv1797_device::read)
return data;
}
-WRITE8_MEMBER(bbc_cv1797_device::write)
+void bbc_cv1797_device::write(offs_t offset, uint8_t data)
{
if (offset & 0x04)
{
diff --git a/src/devices/bus/bbc/fdc/cv1797.h b/src/devices/bus/bbc/fdc/cv1797.h
index a887a1b18a4..86207c8fcd0 100644
--- a/src/devices/bus/bbc/fdc/cv1797.h
+++ b/src/devices/bus/bbc/fdc/cv1797.h
@@ -40,8 +40,8 @@ protected:
virtual void device_add_mconfig(machine_config &config) override;
virtual const tiny_rom_entry *device_rom_region() const override;
- virtual DECLARE_READ8_MEMBER(read) override;
- virtual DECLARE_WRITE8_MEMBER(write) override;
+ virtual uint8_t read(offs_t offset) override;
+ virtual void write(offs_t offset, uint8_t data) override;
private:
DECLARE_FLOPPY_FORMATS(floppy_formats);
diff --git a/src/devices/bus/bbc/fdc/fdc.cpp b/src/devices/bus/bbc/fdc/fdc.cpp
index 10f9131351f..2269bb3370a 100644
--- a/src/devices/bus/bbc/fdc/fdc.cpp
+++ b/src/devices/bus/bbc/fdc/fdc.cpp
@@ -89,10 +89,10 @@ void bbc_fdc_slot_device::device_reset()
// read
//-------------------------------------------------
-READ8_MEMBER(bbc_fdc_slot_device::read)
+uint8_t bbc_fdc_slot_device::read(offs_t offset)
{
if (m_card)
- return m_card->read(space, offset);
+ return m_card->read(offset);
else
return 0xff;
}
@@ -101,10 +101,10 @@ READ8_MEMBER(bbc_fdc_slot_device::read)
// write
//-------------------------------------------------
-WRITE8_MEMBER(bbc_fdc_slot_device::write)
+void bbc_fdc_slot_device::write(offs_t offset, uint8_t data)
{
if (m_card)
- m_card->write(space, offset, data);
+ m_card->write(offset, data);
}
//-------------------------------------------------
diff --git a/src/devices/bus/bbc/fdc/fdc.h b/src/devices/bus/bbc/fdc/fdc.h
index 0cc256961ee..3264172a25d 100644
--- a/src/devices/bus/bbc/fdc/fdc.h
+++ b/src/devices/bus/bbc/fdc/fdc.h
@@ -41,8 +41,8 @@ public:
auto intrq_wr_callback() { return m_intrq_cb.bind(); }
auto drq_wr_callback() { return m_drq_cb.bind(); }
- virtual DECLARE_READ8_MEMBER(read);
- virtual DECLARE_WRITE8_MEMBER(write);
+ uint8_t read(offs_t offset);
+ void write(offs_t offset, uint8_t data);
DECLARE_WRITE_LINE_MEMBER( intrq_w ) { m_intrq_cb(state); }
DECLARE_WRITE_LINE_MEMBER( drq_w) { m_drq_cb(state); }
@@ -66,8 +66,8 @@ private:
class device_bbc_fdc_interface : public device_slot_card_interface
{
public:
- virtual DECLARE_READ8_MEMBER(read) { return 0xff; }
- virtual DECLARE_WRITE8_MEMBER(write) { }
+ virtual uint8_t read(offs_t offset) { return 0xff; }
+ virtual void write(offs_t offset, uint8_t data) { }
protected:
device_bbc_fdc_interface(const machine_config &mconfig, device_t &device);
diff --git a/src/devices/bus/bbc/fdc/microware.cpp b/src/devices/bus/bbc/fdc/microware.cpp
index 29489af382c..477ac0f3f9e 100644
--- a/src/devices/bus/bbc/fdc/microware.cpp
+++ b/src/devices/bus/bbc/fdc/microware.cpp
@@ -101,7 +101,7 @@ void bbc_microware_device::device_start()
// IMPLEMENTATION
//**************************************************************************
-READ8_MEMBER(bbc_microware_device::read)
+uint8_t bbc_microware_device::read(offs_t offset)
{
uint8_t data;
@@ -116,7 +116,7 @@ READ8_MEMBER(bbc_microware_device::read)
return data;
}
-WRITE8_MEMBER(bbc_microware_device::write)
+void bbc_microware_device::write(offs_t offset, uint8_t data)
{
if (offset & 0x04)
{
diff --git a/src/devices/bus/bbc/fdc/microware.h b/src/devices/bus/bbc/fdc/microware.h
index 117159b407d..61c0cb358cf 100644
--- a/src/devices/bus/bbc/fdc/microware.h
+++ b/src/devices/bus/bbc/fdc/microware.h
@@ -42,8 +42,8 @@ protected:
virtual void device_add_mconfig(machine_config &config) override;
virtual const tiny_rom_entry *device_rom_region() const override;
- virtual DECLARE_READ8_MEMBER(read) override;
- virtual DECLARE_WRITE8_MEMBER(write) override;
+ virtual uint8_t read(offs_t offset) override;
+ virtual void write(offs_t offset, uint8_t data) override;
private:
DECLARE_FLOPPY_FORMATS(floppy_formats);
diff --git a/src/devices/bus/bbc/fdc/opus.cpp b/src/devices/bus/bbc/fdc/opus.cpp
index f25de315c58..f6b07df6bcb 100644
--- a/src/devices/bus/bbc/fdc/opus.cpp
+++ b/src/devices/bus/bbc/fdc/opus.cpp
@@ -212,7 +212,7 @@ void bbc_opusfdc_device::device_start()
// IMPLEMENTATION
//**************************************************************************
-READ8_MEMBER(bbc_opus8272_device::read)
+uint8_t bbc_opus8272_device::read(offs_t offset)
{
uint8_t data = 0xff;
@@ -227,20 +227,20 @@ READ8_MEMBER(bbc_opus8272_device::read)
if (m_floppy0->get_device()) m_floppy0->get_device()->mon_w(1);
if (m_floppy1->get_device()) m_floppy1->get_device()->mon_w(1);
case 0x04:
- data = m_fdc->msr_r(space, 0);
+ data = m_fdc->msr_r();
break;
case 0x05:
if (m_floppy0->get_device()) m_floppy0->get_device()->mon_w(0);
if (m_floppy1->get_device()) m_floppy1->get_device()->mon_w(0);
case 0x07:
- data = m_fdc->fifo_r(space, 0);
+ data = m_fdc->fifo_r();
break;
}
return data;
}
-WRITE8_MEMBER(bbc_opus8272_device::write)
+void bbc_opus8272_device::write(offs_t offset, uint8_t data)
{
floppy_image_device *floppy = nullptr;
@@ -259,13 +259,13 @@ WRITE8_MEMBER(bbc_opus8272_device::write)
if (m_floppy0->get_device()) m_floppy0->get_device()->mon_w(0);
if (m_floppy1->get_device()) m_floppy1->get_device()->mon_w(0);
case 0x07:
- m_fdc->fifo_w(space, 0, data);
+ m_fdc->fifo_w(data);
break;
}
}
-READ8_MEMBER(bbc_opusfdc_device::read)
+uint8_t bbc_opusfdc_device::read(offs_t offset)
{
uint8_t data;
@@ -280,7 +280,7 @@ READ8_MEMBER(bbc_opusfdc_device::read)
return data;
}
-WRITE8_MEMBER(bbc_opusfdc_device::write)
+void bbc_opusfdc_device::write(offs_t offset, uint8_t data)
{
if (offset & 0x04)
{
diff --git a/src/devices/bus/bbc/fdc/opus.h b/src/devices/bus/bbc/fdc/opus.h
index 721f3ebab5c..033fccc02c4 100644
--- a/src/devices/bus/bbc/fdc/opus.h
+++ b/src/devices/bus/bbc/fdc/opus.h
@@ -36,8 +36,8 @@ protected:
virtual void device_add_mconfig(machine_config &config) override;
virtual const tiny_rom_entry *device_rom_region() const override;
- virtual DECLARE_READ8_MEMBER(read) override;
- virtual DECLARE_WRITE8_MEMBER(write) override;
+ virtual uint8_t read(offs_t offset) override;
+ virtual void write(offs_t offset, uint8_t data) override;
private:
required_device<i8272a_device> m_fdc;
@@ -62,8 +62,8 @@ protected:
// device-level overrides
virtual void device_start() override;
- virtual DECLARE_READ8_MEMBER(read) override;
- virtual DECLARE_WRITE8_MEMBER(write) override;
+ virtual uint8_t read(offs_t offset) override;
+ virtual void write(offs_t offset, uint8_t data) override;
required_device<wd_fdc_device_base> m_fdc;
required_device<floppy_connector> m_floppy0;
diff --git a/src/devices/bus/bbc/fdc/watford.cpp b/src/devices/bus/bbc/fdc/watford.cpp
index b888840314f..4c3f31344ee 100644
--- a/src/devices/bus/bbc/fdc/watford.cpp
+++ b/src/devices/bus/bbc/fdc/watford.cpp
@@ -147,7 +147,7 @@ void bbc_weddb3_device::device_start()
// IMPLEMENTATION
//**************************************************************************
-READ8_MEMBER(bbc_weddb2_device::read)
+uint8_t bbc_weddb2_device::read(offs_t offset)
{
uint8_t data;
@@ -162,7 +162,7 @@ READ8_MEMBER(bbc_weddb2_device::read)
return data;
}
-WRITE8_MEMBER(bbc_weddb2_device::write)
+void bbc_weddb2_device::write(offs_t offset, uint8_t data)
{
if (offset & 0x04)
{
@@ -192,7 +192,7 @@ WRITE8_MEMBER(bbc_weddb2_device::write)
}
}
-READ8_MEMBER(bbc_weddb3_device::read)
+uint8_t bbc_weddb3_device::read(offs_t offset)
{
uint8_t data;
@@ -207,7 +207,7 @@ READ8_MEMBER(bbc_weddb3_device::read)
return data;
}
-WRITE8_MEMBER(bbc_weddb3_device::write)
+void bbc_weddb3_device::write(offs_t offset, uint8_t data)
{
if (offset & 0x04)
{
diff --git a/src/devices/bus/bbc/fdc/watford.h b/src/devices/bus/bbc/fdc/watford.h
index 02bbf59f523..2f1cfa65c64 100644
--- a/src/devices/bus/bbc/fdc/watford.h
+++ b/src/devices/bus/bbc/fdc/watford.h
@@ -45,8 +45,8 @@ protected:
virtual void device_add_mconfig(machine_config &config) override;
virtual const tiny_rom_entry *device_rom_region() const override;
- virtual DECLARE_READ8_MEMBER(read) override;
- virtual DECLARE_WRITE8_MEMBER(write) override;
+ virtual uint8_t read(offs_t offset) override;
+ virtual void write(offs_t offset, uint8_t data) override;
private:
required_device<wd_fdc_device_base> m_fdc;
@@ -68,8 +68,8 @@ protected:
virtual void device_add_mconfig(machine_config &config) override;
virtual const tiny_rom_entry *device_rom_region() const override;
- virtual DECLARE_READ8_MEMBER(read) override;
- virtual DECLARE_WRITE8_MEMBER(write) override;
+ virtual uint8_t read(offs_t offset) override;
+ virtual void write(offs_t offset, uint8_t data) override;
private:
required_device<wd_fdc_device_base> m_fdc;
diff --git a/src/devices/bus/bbc/joyport/joyport.cpp b/src/devices/bus/bbc/joyport/joyport.cpp
index 5ed3f8d2fff..0c1bae50ee2 100644
--- a/src/devices/bus/bbc/joyport/joyport.cpp
+++ b/src/devices/bus/bbc/joyport/joyport.cpp
@@ -91,11 +91,11 @@ void bbc_joyport_slot_device::device_reset()
// pb_r
//-------------------------------------------------
-READ8_MEMBER(bbc_joyport_slot_device::pb_r)
+uint8_t bbc_joyport_slot_device::pb_r()
{
// TODO: Joyport connected to PB0-PB4 only. PB5-PB7 are expansion port.
if (m_device)
- return 0xe0 | m_device->pb_r(space, 0);
+ return 0xe0 | m_device->pb_r();
else
return 0xff;
}
@@ -105,10 +105,10 @@ READ8_MEMBER(bbc_joyport_slot_device::pb_r)
// pb_w
//-------------------------------------------------
-WRITE8_MEMBER(bbc_joyport_slot_device::pb_w)
+void bbc_joyport_slot_device::pb_w(uint8_t data)
{
if (m_device)
- m_device->pb_w(space, 0, data);
+ m_device->pb_w(data);
}
diff --git a/src/devices/bus/bbc/joyport/joyport.h b/src/devices/bus/bbc/joyport/joyport.h
index 572e41f7612..6abda62633d 100644
--- a/src/devices/bus/bbc/joyport/joyport.h
+++ b/src/devices/bus/bbc/joyport/joyport.h
@@ -64,8 +64,8 @@ public:
DECLARE_WRITE_LINE_MEMBER(cb1_w) { m_cb1_handler(state); }
DECLARE_WRITE_LINE_MEMBER(cb2_w) { m_cb2_handler(state); }
- DECLARE_READ8_MEMBER(pb_r);
- DECLARE_WRITE8_MEMBER(pb_w);
+ uint8_t pb_r();
+ void pb_w(uint8_t data);
protected:
// device-level overrides
@@ -86,8 +86,8 @@ private:
class device_bbc_joyport_interface : public device_slot_card_interface
{
public:
- virtual DECLARE_READ8_MEMBER(pb_r) { return 0xff; }
- virtual DECLARE_WRITE8_MEMBER(pb_w) { }
+ virtual uint8_t pb_r() { return 0xff; }
+ virtual void pb_w(uint8_t data) { }
protected:
device_bbc_joyport_interface(const machine_config &mconfig, device_t &device);
diff --git a/src/devices/bus/bbc/joyport/joystick.cpp b/src/devices/bus/bbc/joyport/joystick.cpp
index 5f4047c13a3..d53186f118d 100644
--- a/src/devices/bus/bbc/joyport/joystick.cpp
+++ b/src/devices/bus/bbc/joyport/joystick.cpp
@@ -78,7 +78,7 @@ void bbcmc_joystick_device::device_reset()
// IMPLEMENTATION
//**************************************************************************
-READ8_MEMBER(bbcmc_joystick_device::pb_r)
+uint8_t bbcmc_joystick_device::pb_r()
{
return m_joy->read();
}
diff --git a/src/devices/bus/bbc/joyport/joystick.h b/src/devices/bus/bbc/joyport/joystick.h
index 0e9cea22716..8d0cc5a0458 100644
--- a/src/devices/bus/bbc/joyport/joystick.h
+++ b/src/devices/bus/bbc/joyport/joystick.h
@@ -36,7 +36,7 @@ protected:
virtual void device_start() override;
virtual void device_reset() override;
- virtual DECLARE_READ8_MEMBER(pb_r) override;
+ virtual uint8_t pb_r() override;
private:
required_ioport m_joy;
diff --git a/src/devices/bus/bbc/rom/dfs.cpp b/src/devices/bus/bbc/rom/dfs.cpp
new file mode 100644
index 00000000000..8a3aac6d588
--- /dev/null
+++ b/src/devices/bus/bbc/rom/dfs.cpp
@@ -0,0 +1,63 @@
+// license:BSD-3-Clause
+// copyright-holders:Nigel Barnes
+/***************************************************************************
+
+ BBC Micro MRM E00 DFS emulation
+
+ Comprises of 8K ROM and 2K/4K? RAM on a carrier board, with flying lead
+ to RW line to enable writing to RAM.
+
+***************************************************************************/
+
+#include "emu.h"
+#include "dfs.h"
+
+
+//**************************************************************************
+// DEVICE DEFINITIONS
+//**************************************************************************
+
+DEFINE_DEVICE_TYPE(BBC_MRME00, bbc_mrme00_device, "bbc_mrme00", "BBC Micro MRM E00 DFS")
+
+//**************************************************************************
+// LIVE DEVICE
+//**************************************************************************
+
+//-------------------------------------------------
+// bbc_rom_device - constructor
+//-------------------------------------------------
+
+bbc_mrme00_device::bbc_mrme00_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+ : device_t(mconfig, BBC_MRME00, tag, owner, clock)
+ , device_bbc_rom_interface(mconfig, *this)
+{
+}
+
+//-------------------------------------------------
+// device_start - device-specific startup
+//-------------------------------------------------
+
+void bbc_mrme00_device::device_start()
+{
+}
+
+//-------------------------------------------------
+// read
+//-------------------------------------------------
+
+uint8_t bbc_mrme00_device::read(offs_t offset)
+{
+ if (offset < get_rom_size())
+ return get_rom_base()[offset & (get_rom_size() - 1)];
+ else
+ return get_ram_base()[offset & (get_ram_size() - 1)];
+}
+
+//-------------------------------------------------
+// write
+//-------------------------------------------------
+
+void bbc_mrme00_device::write(offs_t offset, uint8_t data)
+{
+ get_ram_base()[offset & (get_ram_size() - 1)] = data;
+}
diff --git a/src/devices/bus/bbc/rom/dfs.h b/src/devices/bus/bbc/rom/dfs.h
new file mode 100644
index 00000000000..b76a7ab26ed
--- /dev/null
+++ b/src/devices/bus/bbc/rom/dfs.h
@@ -0,0 +1,42 @@
+// license:BSD-3-Clause
+// copyright-holders:Nigel Barnes
+/***************************************************************************
+
+ BBC Micro MRM E00 DFS emulation
+
+***************************************************************************/
+
+#ifndef MAME_BUS_BBC_ROM_DFS_H
+#define MAME_BUS_BBC_ROM_DFS_H
+
+#pragma once
+
+#include "slot.h"
+
+//**************************************************************************
+// TYPE DEFINITIONS
+//**************************************************************************
+
+// ======================> bbc_mrme00_device
+
+class bbc_mrme00_device : public device_t,
+ public device_bbc_rom_interface
+{
+public:
+ // construction/destruction
+ bbc_mrme00_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+
+protected:
+ // device-level overrides
+ virtual void device_start() override;
+
+ // device_bbc_rom_interface overrides
+ virtual uint8_t read(offs_t offset) override;
+ virtual void write(offs_t offset, uint8_t data) override;
+};
+
+// device type definition
+DECLARE_DEVICE_TYPE(BBC_MRME00, bbc_mrme00_device)
+
+
+#endif // MAME_BUS_BBC_ROM_DFS_H
diff --git a/src/devices/bus/bbc/rom/pal.cpp b/src/devices/bus/bbc/rom/pal.cpp
new file mode 100644
index 00000000000..51667f70955
--- /dev/null
+++ b/src/devices/bus/bbc/rom/pal.cpp
@@ -0,0 +1,312 @@
+// license:BSD-3-Clause
+// copyright-holders:Nigel Barnes
+/***************************************************************************
+
+ BBC Micro PALPROM carrier boards
+
+ Computer Concepts PALPROM carrier boards (PAL16R4):
+ These were the first to provide a 32K ROM banked into a 16K slot using
+ a PAL to perform the switching upon reads from pre-programmed zones. In
+ addition to being able to provide larger ROM based applications such
+ as Inter-Word and Inter-Base, it also served as copy protection since
+ the carrier board and PAL would have to be reproduced to support the
+ ROM.
+ Other publishers such as Beebug and PMS also used the carrier boards
+ and PAL provided by Computer Concepts.
+
+ Watford Electronics PALPROM carrier boards (PAL16L8):
+ The PALPROM device provides a means of running 32K software within the
+ space allocated to a 16K sideways ROM whilst providing a good degree of
+ software protection.
+ Within a PALPROM, a 32K EPROM is divided into 4 banks of 8K. These are
+ arranged in a 3 plus 1 arrangement. Bank 0, which occupies &8000 to
+ &9FFF is permanently enabled, whilst banks 1 to 3, which occupy the
+ region &A000 to &BFFF, are swapped in one at a time. This swapping is
+ made by performing an access to a special switching zone, of which there
+ are 8 in total. Accessing a switching zone, which is 32 bytes in length
+ and aligned to start on a 32 byte boundary, selects a pre-specified bank
+ (1 to 3)
+
+ P.R.E.S. PALPROM carrier boards:
+ This was based on the Computer Concepts carrier board.
+
+ Instant Mini Office 2:
+ Not a PALPROM carrier board but a larger ROM carrier containing 4x32K
+ and TTL circuits to enable and page each ROM into 16K banks.
+
+***************************************************************************/
+
+#include "emu.h"
+#include "pal.h"
+
+
+//**************************************************************************
+// DEVICE DEFINITIONS
+//**************************************************************************
+
+DEFINE_DEVICE_TYPE(BBC_CCIWORD, bbc_cciword_device, "bbc_cciword", "Computer Concepts 32K ROM Carrier (Inter-Word)")
+DEFINE_DEVICE_TYPE(BBC_CCIBASE, bbc_ccibase_device, "bbc_ccibase", "Computer Concepts 64K ROM Carrier (Inter-Base)")
+DEFINE_DEVICE_TYPE(BBC_CCISPELL, bbc_ccispell_device, "bbc_ccispell", "Computer Concepts 128K ROM Carrier (SpellMaster)")
+DEFINE_DEVICE_TYPE(BBC_PALQST, bbc_palqst_device, "bbc_palqst", "Watford Electronics ROM Carrier (Quest Paint)")
+DEFINE_DEVICE_TYPE(BBC_PALWAP, bbc_palwap_device, "bbc_palwap", "Watford Electronics ROM Carrier (Wapping Editor)")
+DEFINE_DEVICE_TYPE(BBC_PALTED, bbc_palted_device, "bbc_palted", "Watford Electronics ROM Carrier (TED)")
+DEFINE_DEVICE_TYPE(BBC_PALABEP, bbc_palabep_device, "bbc_palabep", "P.R.E.S. 32K ROM Carrier (ABE+)")
+DEFINE_DEVICE_TYPE(BBC_PALABE, bbc_palabe_device, "bbc_palabe", "P.R.E.S. 32K ROM Carrier (ABE)")
+DEFINE_DEVICE_TYPE(BBC_PALMO2, bbc_palmo2_device, "bbc_palmo2", "Instant Mini Office 2 ROM Carrier")
+
+
+//**************************************************************************
+// LIVE DEVICE
+//**************************************************************************
+
+//-------------------------------------------------
+// bbc_palprom_device - constructor
+//-------------------------------------------------
+
+bbc_pal_device::bbc_pal_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock)
+ : device_t(mconfig, type, tag, owner, clock)
+ , device_bbc_rom_interface(mconfig, *this)
+ , m_bank(0)
+{
+}
+
+bbc_cciword_device::bbc_cciword_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+ : bbc_pal_device(mconfig, BBC_CCIWORD, tag, owner, clock)
+{
+}
+
+bbc_ccibase_device::bbc_ccibase_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+ : bbc_pal_device(mconfig, BBC_CCIBASE, tag, owner, clock)
+{
+}
+
+bbc_ccispell_device::bbc_ccispell_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+ : bbc_pal_device(mconfig, BBC_CCISPELL, tag, owner, clock)
+{
+}
+
+bbc_palqst_device::bbc_palqst_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+ : bbc_pal_device(mconfig, BBC_PALQST, tag, owner, clock)
+{
+}
+
+bbc_palwap_device::bbc_palwap_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+ : bbc_pal_device(mconfig, BBC_PALWAP, tag, owner, clock)
+{
+}
+
+bbc_palted_device::bbc_palted_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+ : bbc_pal_device(mconfig, BBC_PALTED, tag, owner, clock)
+{
+}
+
+bbc_palabep_device::bbc_palabep_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+ : bbc_pal_device(mconfig, BBC_PALABEP, tag, owner, clock)
+{
+}
+
+bbc_palabe_device::bbc_palabe_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+ : bbc_pal_device(mconfig, BBC_PALABE, tag, owner, clock)
+{
+}
+
+bbc_palmo2_device::bbc_palmo2_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+ : bbc_pal_device(mconfig, BBC_PALMO2, tag, owner, clock)
+{
+}
+
+
+//-------------------------------------------------
+// device_start - device-specific startup
+//-------------------------------------------------
+
+void bbc_pal_device::device_start()
+{
+ save_item(NAME(m_bank));
+}
+
+//-------------------------------------------------
+// read
+//-------------------------------------------------
+
+uint8_t bbc_cciword_device::read(offs_t offset)
+{
+ if (!machine().side_effects_disabled())
+ {
+ /* switching zones for Inter-Word */
+ switch (offset & 0x3fe0)
+ {
+ case 0x0060:
+ case 0x3fc0: m_bank = 0; break;
+ case 0x0040:
+ case 0x3fa0:
+ case 0x3fe0: m_bank = 1; break;
+ }
+ }
+
+ return get_rom_base()[(offset & 0x3fff) | (m_bank << 14)];
+}
+
+uint8_t bbc_ccibase_device::read(offs_t offset)
+{
+ if (!machine().side_effects_disabled())
+ {
+ /* switching zones for Inter-Base */
+ switch (offset & 0x3fe0)
+ {
+ case 0x3f80: m_bank = 0; break;
+ case 0x3fa0: m_bank = 1; break;
+ case 0x3fc0: m_bank = 2; break;
+ case 0x3fe0: m_bank = 3; break;
+ }
+ }
+
+ return get_rom_base()[(offset & 0x3fff) | (m_bank << 14)];
+}
+
+uint8_t bbc_ccispell_device::read(offs_t offset)
+{
+ if (!machine().side_effects_disabled())
+ {
+ /* switching zones for SpellMaster */
+ if (offset == 0x3fe0)
+ {
+ m_bank = 0;
+ }
+ else if (m_bank == 0)
+ {
+ switch (offset & 0x3fe0)
+ {
+ case 0x3fc0: m_bank = 1; break;
+ case 0x3fa0: m_bank = 2; break;
+ case 0x3f80: m_bank = 3; break;
+ case 0x3f60: m_bank = 4; break;
+ case 0x3f40: m_bank = 5; break;
+ case 0x3f20: m_bank = 6; break;
+ case 0x3f00: m_bank = 7; break;
+ }
+ }
+ }
+
+ return get_rom_base()[(offset & 0x3fff) | (m_bank << 14)];
+}
+
+uint8_t bbc_palqst_device::read(offs_t offset)
+{
+ if (!machine().side_effects_disabled())
+ {
+ /* switching zones for Quest Paint and ConQuest */
+ switch (offset & 0x3fe0)
+ {
+ case 0x0820: m_bank = 2; break;
+ case 0x11e0: m_bank = 1; break;
+ case 0x12c0: m_bank = 3; break;
+ case 0x1340: m_bank = 0; break;
+ }
+ }
+
+ if (offset & 0x2000)
+ {
+ return get_rom_base()[(offset & 0x1fff) | (m_bank << 13)];
+ }
+ else
+ {
+ return get_rom_base()[offset & 0x1fff];
+ }
+}
+
+uint8_t bbc_palwap_device::read(offs_t offset)
+{
+ if (!machine().side_effects_disabled())
+ {
+ /* switching zones for Wapping Editor */
+ switch (offset & 0x3fe0)
+ {
+ case 0x1f00: m_bank = 0; break;
+ case 0x1f20: m_bank = 1; break;
+ case 0x1f40: m_bank = 2; break;
+ case 0x1f60: m_bank = 3; break;
+ case 0x1f80: m_bank = 4; break;
+ case 0x1fa0: m_bank = 5; break;
+ case 0x1fc0: m_bank = 6; break;
+ case 0x1fe0: m_bank = 7; break;
+ }
+ }
+
+ if (offset & 0x2000)
+ {
+ return get_rom_base()[(offset & 0x1fff) | (m_bank << 13)];
+ }
+ else
+ {
+ return get_rom_base()[offset & 0x1fff];
+ }
+}
+
+uint8_t bbc_palted_device::read(offs_t offset)
+{
+ if (!machine().side_effects_disabled())
+ {
+ /* switching zones for TED */
+ switch (offset & 0x3fe0)
+ {
+ case 0x1f80: m_bank = 0; break;
+ case 0x1fa0: m_bank = 1; break;
+ case 0x1fc0: m_bank = 2; break;
+ case 0x1fe0: m_bank = 3; break;
+ }
+ }
+
+ if (offset & 0x2000)
+ {
+ return get_rom_base()[(offset & 0x1fff) | (m_bank << 13)];
+ }
+ else
+ {
+ return get_rom_base()[offset & 0x1fff];
+ }
+}
+
+uint8_t bbc_palabep_device::read(offs_t offset)
+{
+ if (!machine().side_effects_disabled())
+ {
+ /* switching zones for Advanced BASIC Editor Plus */
+ switch (offset & 0x3ffc)
+ {
+ case 0x3ff8: m_bank = 0; break;
+ case 0x3ffc: m_bank = 1; break;
+ }
+ }
+
+ return get_rom_base()[(offset & 0x3fff) | (m_bank << 14)];
+}
+
+uint8_t bbc_palabe_device::read(offs_t offset)
+{
+ if (!machine().side_effects_disabled())
+ {
+ /* switching zones for Advanced BASIC Editor */
+ switch (offset & 0x3ffc)
+ {
+ case 0x3ff8: m_bank = 1; break;
+ case 0x3ffc: m_bank = 0; break;
+ }
+ }
+
+ return get_rom_base()[(offset & 0x3fff) | (m_bank << 14)];
+}
+
+uint8_t bbc_palmo2_device::read(offs_t offset)
+{
+ if (!machine().side_effects_disabled())
+ {
+ /* switching zones for Instant Mini Office 2 */
+ switch (offset & 0x3ff0)
+ {
+ case 0x2000: m_bank = offset & 0x0f; break;
+ }
+ }
+
+ return get_rom_base()[(offset & 0x3fff) | (m_bank << 13)];
+}
diff --git a/src/devices/bus/bbc/rom/pal.h b/src/devices/bus/bbc/rom/pal.h
new file mode 100644
index 00000000000..31c8dcd0d78
--- /dev/null
+++ b/src/devices/bus/bbc/rom/pal.h
@@ -0,0 +1,167 @@
+// license:BSD-3-Clause
+// copyright-holders:Nigel Barnes
+/***************************************************************************
+
+ BBC Micro PALPROM carrier boards
+
+***************************************************************************/
+
+#ifndef MAME_BUS_BBC_ROM_PAL_H
+#define MAME_BUS_BBC_ROM_PAL_H
+
+#pragma once
+
+#include "slot.h"
+
+
+//**************************************************************************
+// TYPE DEFINITIONS
+//**************************************************************************
+
+// ======================> bbc_pal_device
+
+class bbc_pal_device : public device_t,
+ public device_bbc_rom_interface
+{
+protected:
+ // construction/destruction
+ bbc_pal_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock);
+
+ // device-level overrides
+ virtual void device_start() override;
+
+ // device_bbc_rom_interface overrides
+ virtual uint32_t get_rom_size() override { return 0x4000; }
+
+ uint8_t m_bank;
+};
+
+// ======================> bbc_cciword_device
+
+class bbc_cciword_device : public bbc_pal_device
+{
+public:
+ // construction/destruction
+ bbc_cciword_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+
+protected:
+ // device_bbc_rom_interface overrides
+ virtual uint8_t read(offs_t offset) override;
+};
+
+// ======================> bbc_ccibase_device
+
+class bbc_ccibase_device : public bbc_pal_device
+{
+public:
+ // construction/destruction
+ bbc_ccibase_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+
+protected:
+ // device_bbc_rom_interface overrides
+ virtual uint8_t read(offs_t offset) override;
+};
+
+// ======================> bbc_ccispell_device
+
+class bbc_ccispell_device : public bbc_pal_device
+{
+public:
+ // construction/destruction
+ bbc_ccispell_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+
+protected:
+ // device_bbc_rom_interface overrides
+ virtual uint8_t read(offs_t offset) override;
+};
+
+// ======================> bbc_palqst_device
+
+class bbc_palqst_device : public bbc_pal_device
+{
+public:
+ bbc_palqst_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+
+protected:
+ // device_bbc_rom_interface overrides
+ virtual uint8_t read(offs_t offset) override;
+};
+
+// ======================> bbc_palwap_device
+
+class bbc_palwap_device : public bbc_pal_device
+{
+public:
+ bbc_palwap_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+
+protected:
+ // device_bbc_rom_interface overrides
+ virtual uint8_t read(offs_t offset) override;
+};
+
+// ======================> bbc_palted_device
+
+class bbc_palted_device : public bbc_pal_device
+{
+public:
+ // construction/destruction
+ bbc_palted_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+
+protected:
+ // device_bbc_rom_interface overrides
+ virtual uint8_t read(offs_t offset) override;
+};
+
+// ======================> bbc_palabep_device
+
+class bbc_palabep_device : public bbc_pal_device
+{
+public:
+ // construction/destruction
+ bbc_palabep_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+
+protected:
+ // device_bbc_rom_interface overrides
+ virtual uint8_t read(offs_t offset) override;
+};
+
+// ======================> bbc_palabe_device
+
+class bbc_palabe_device : public bbc_pal_device
+{
+public:
+ // construction/destruction
+ bbc_palabe_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+
+protected:
+ // device_bbc_rom_interface overrides
+ virtual uint8_t read(offs_t offset) override;
+};
+
+// ======================> bbc_palmo2_device
+
+class bbc_palmo2_device : public bbc_pal_device
+{
+public:
+ // construction/destruction
+ bbc_palmo2_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+
+protected:
+ // device_bbc_rom_interface overrides
+ virtual uint8_t read(offs_t offset) override;
+};
+
+
+// device type definition
+DECLARE_DEVICE_TYPE(BBC_CCIWORD, bbc_cciword_device)
+DECLARE_DEVICE_TYPE(BBC_CCIBASE, bbc_ccibase_device)
+DECLARE_DEVICE_TYPE(BBC_CCISPELL, bbc_ccispell_device)
+DECLARE_DEVICE_TYPE(BBC_PALQST, bbc_palqst_device)
+DECLARE_DEVICE_TYPE(BBC_PALWAP, bbc_palwap_device)
+DECLARE_DEVICE_TYPE(BBC_PALTED, bbc_palted_device)
+DECLARE_DEVICE_TYPE(BBC_PALABEP, bbc_palabep_device)
+DECLARE_DEVICE_TYPE(BBC_PALABE, bbc_palabe_device)
+DECLARE_DEVICE_TYPE(BBC_PALMO2, bbc_palmo2_device)
+
+
+#endif // MAME_BUS_BBC_ROM_PAL_H
diff --git a/src/devices/bus/bbc/rom/ram.cpp b/src/devices/bus/bbc/rom/ram.cpp
new file mode 100644
index 00000000000..0d626955812
--- /dev/null
+++ b/src/devices/bus/bbc/rom/ram.cpp
@@ -0,0 +1,57 @@
+// license:BSD-3-Clause
+// copyright-holders:Nigel Barnes
+/***************************************************************************
+
+ BBC Micro Sideways RAM emulation
+
+***************************************************************************/
+
+#include "emu.h"
+#include "ram.h"
+
+
+//**************************************************************************
+// DEVICE DEFINITIONS
+//**************************************************************************
+
+DEFINE_DEVICE_TYPE(BBC_RAM, bbc_ram_device, "bbc_ram", "BBC Micro Sideways RAM")
+
+//**************************************************************************
+// LIVE DEVICE
+//**************************************************************************
+
+//-------------------------------------------------
+// bbc_ram_device - constructor
+//-------------------------------------------------
+
+bbc_ram_device::bbc_ram_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+ : device_t(mconfig, BBC_RAM, tag, owner, clock)
+ , device_bbc_rom_interface(mconfig, *this)
+{
+}
+
+//-------------------------------------------------
+// device_start - device-specific startup
+//-------------------------------------------------
+
+void bbc_ram_device::device_start()
+{
+}
+
+//-------------------------------------------------
+// read
+//-------------------------------------------------
+
+uint8_t bbc_ram_device::read(offs_t offset)
+{
+ return get_ram_base()[offset & (get_ram_size() - 1)];
+}
+
+//-------------------------------------------------
+// write
+//-------------------------------------------------
+
+void bbc_ram_device::write(offs_t offset, uint8_t data)
+{
+ get_ram_base()[offset & (get_ram_size() - 1)] = data;
+}
diff --git a/src/devices/bus/bbc/rom/ram.h b/src/devices/bus/bbc/rom/ram.h
new file mode 100644
index 00000000000..85267147a35
--- /dev/null
+++ b/src/devices/bus/bbc/rom/ram.h
@@ -0,0 +1,42 @@
+// license:BSD-3-Clause
+// copyright-holders:Nigel Barnes
+/***************************************************************************
+
+ BBC Micro Sideways RAM emulation
+
+***************************************************************************/
+
+#ifndef MAME_BUS_BBC_ROM_RAM_H
+#define MAME_BUS_BBC_ROM_RAM_H
+
+#pragma once
+
+#include "slot.h"
+
+//**************************************************************************
+// TYPE DEFINITIONS
+//**************************************************************************
+
+// ======================> bbc_ram_device
+
+class bbc_ram_device : public device_t,
+ public device_bbc_rom_interface
+{
+public:
+ // construction/destruction
+ bbc_ram_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+
+protected:
+ // device-level overrides
+ virtual void device_start() override;
+
+ // device_bbc_rom_interface overrides
+ virtual uint8_t read(offs_t offset) override;
+ virtual void write(offs_t offset, uint8_t data) override;
+};
+
+
+// device type definition
+DECLARE_DEVICE_TYPE(BBC_RAM, bbc_ram_device)
+
+#endif // MAME_BUS_BBC_ROM_RAM_H
diff --git a/src/devices/bus/bbc/rom/rom.cpp b/src/devices/bus/bbc/rom/rom.cpp
new file mode 100644
index 00000000000..f798de11c6a
--- /dev/null
+++ b/src/devices/bus/bbc/rom/rom.cpp
@@ -0,0 +1,50 @@
+// license:BSD-3-Clause
+// copyright-holders:Nigel Barnes
+/***************************************************************************
+
+ BBC Micro Sideways ROM emulation
+
+***************************************************************************/
+
+#include "emu.h"
+#include "rom.h"
+
+
+//**************************************************************************
+// DEVICE DEFINITIONS
+//**************************************************************************
+
+DEFINE_DEVICE_TYPE(BBC_ROM, bbc_rom_device, "bbc_rom", "BBC Micro Sideways ROM")
+
+//**************************************************************************
+// LIVE DEVICE
+//**************************************************************************
+
+//-------------------------------------------------
+// bbc_rom_device - constructor
+//-------------------------------------------------
+
+bbc_rom_device::bbc_rom_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+ : device_t(mconfig, BBC_ROM, tag, owner, clock)
+ , device_bbc_rom_interface(mconfig, *this)
+{
+}
+
+//-------------------------------------------------
+// device_start - device-specific startup
+//-------------------------------------------------
+
+void bbc_rom_device::device_start()
+{
+}
+
+//-------------------------------------------------
+// read
+//-------------------------------------------------
+
+uint8_t bbc_rom_device::read(offs_t offset)
+{
+ uint32_t size = std::min((int32_t)get_rom_size(), 0x4000);
+
+ return get_rom_base()[offset & (size - 1)];
+}
diff --git a/src/devices/bus/bbc/rom/rom.h b/src/devices/bus/bbc/rom/rom.h
new file mode 100644
index 00000000000..282e5471781
--- /dev/null
+++ b/src/devices/bus/bbc/rom/rom.h
@@ -0,0 +1,41 @@
+// license:BSD-3-Clause
+// copyright-holders:Nigel Barnes
+/***************************************************************************
+
+ BBC Micro Sideways ROM emulation
+
+***************************************************************************/
+
+#ifndef MAME_BUS_BBC_ROM_ROM_H
+#define MAME_BUS_BBC_ROM_ROM_H
+
+#pragma once
+
+#include "slot.h"
+
+//**************************************************************************
+// TYPE DEFINITIONS
+//**************************************************************************
+
+// ======================> bbc_rom_device
+
+class bbc_rom_device : public device_t,
+ public device_bbc_rom_interface
+{
+public:
+ // construction/destruction
+ bbc_rom_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+
+protected:
+ // device-level overrides
+ virtual void device_start() override;
+
+ // device_bbc_rom_interface overrides
+ virtual uint8_t read(offs_t offset) override;
+};
+
+// device type definition
+DECLARE_DEVICE_TYPE(BBC_ROM, bbc_rom_device)
+
+
+#endif // MAME_BUS_BBC_ROM_ROM_H
diff --git a/src/devices/bus/bbc/rom/rtc.cpp b/src/devices/bus/bbc/rom/rtc.cpp
new file mode 100644
index 00000000000..7d73c24b53e
--- /dev/null
+++ b/src/devices/bus/bbc/rom/rtc.cpp
@@ -0,0 +1,124 @@
+// license:BSD-3-Clause
+// copyright-holders:Nigel Barnes
+/***************************************************************************
+
+ Solidisk Real Time Clock
+
+ http://chrisacorns.computinghistory.org.uk/8bit_Upgrades/Solidisk_RTC.html
+
+ PMS Genie Watch (RTC for the BBC)
+
+***************************************************************************/
+
+#include "emu.h"
+#include "rtc.h"
+
+
+//**************************************************************************
+// DEVICE DEFINITIONS
+//**************************************************************************
+
+DEFINE_DEVICE_TYPE(BBC_STLRTC, bbc_stlrtc_device, "bbc_stlrtc", "Solidisk Real Time Clock")
+DEFINE_DEVICE_TYPE(BBC_PMSRTC, bbc_pmsrtc_device, "bbc_pmsrtc", "PMS Genie Real Time Clock")
+
+
+//-------------------------------------------------
+// device_add_mconfig - add device configuration
+//-------------------------------------------------
+
+void bbc_stlrtc_device::device_add_mconfig(machine_config &config)
+{
+ MC146818(config, m_rtc, 32.768_kHz_XTAL); // TODO: verify clock
+}
+
+void bbc_pmsrtc_device::device_add_mconfig(machine_config &config)
+{
+ /* Dallas DS1216 SmartWatch RAM */
+ DS1315(config, m_rtc, 0);
+}
+
+//**************************************************************************
+// LIVE DEVICE
+//**************************************************************************
+
+//-------------------------------------------------
+// bbc_stlrtc_device - constructor
+//-------------------------------------------------
+
+bbc_stlrtc_device::bbc_stlrtc_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+ : device_t(mconfig, BBC_STLRTC, tag, owner, clock)
+ , device_bbc_rom_interface(mconfig, *this)
+ , m_rtc(*this, "rtc")
+{
+}
+
+bbc_pmsrtc_device::bbc_pmsrtc_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+ : device_t(mconfig, BBC_PMSRTC, tag, owner, clock)
+ , device_bbc_rom_interface(mconfig, *this)
+ , m_rtc(*this, "rtc")
+{
+}
+
+//-------------------------------------------------
+// device_start - device-specific startup
+//-------------------------------------------------
+
+void bbc_stlrtc_device::device_start()
+{
+}
+
+void bbc_pmsrtc_device::device_start()
+{
+}
+
+//-------------------------------------------------
+// read
+//-------------------------------------------------
+
+uint8_t bbc_stlrtc_device::read(offs_t offset)
+{
+ uint8_t data = get_rom_base()[offset & 0x3fff];
+
+ switch (offset & 0x3fc0)
+ {
+ case 0x3e00:
+ data = m_rtc->read(1);
+ break;
+ case 0x3e40:
+ if (!machine().side_effects_disabled())
+ m_rtc->write(0, data);
+ break;
+ case 0x3e80:
+ case 0x3ec0:
+ data = m_rtc->read(0);
+ break;
+ case 0x3f00:
+ case 0x3f40:
+ case 0x3f80:
+ case 0x3fc0:
+ if (!machine().side_effects_disabled())
+ m_rtc->write(1, data);
+ break;
+ }
+ return data;
+}
+
+uint8_t bbc_pmsrtc_device::read(offs_t offset)
+{
+ uint8_t data = get_rom_base()[offset & 0x1fff];
+
+ switch (offset)
+ {
+ case 0x00:
+ data |= m_rtc->read_0();
+ break;
+ case 0x01:
+ data |= m_rtc->read_1();
+ break;
+ case 0x04:
+ if (m_rtc->chip_enable())
+ data = m_rtc->read_data() & 0x01;
+ break;
+ }
+ return data;
+}
diff --git a/src/devices/bus/bbc/rom/rtc.h b/src/devices/bus/bbc/rom/rtc.h
new file mode 100644
index 00000000000..d37b2174b9b
--- /dev/null
+++ b/src/devices/bus/bbc/rom/rtc.h
@@ -0,0 +1,72 @@
+// license:BSD-3-Clause
+// copyright-holders:Nigel Barnes
+/***************************************************************************
+
+ Solidisk Real Time Clock emulation
+
+ PMS Genie Watch (RTC for the BBC)
+
+***************************************************************************/
+
+#ifndef MAME_BUS_BBC_ROM_RTC_H
+#define MAME_BUS_BBC_ROM_RTC_H
+
+#pragma once
+
+#include "slot.h"
+#include "machine/mc146818.h"
+#include "machine/ds1315.h"
+
+//**************************************************************************
+// TYPE DEFINITIONS
+//**************************************************************************
+
+// ======================> bbc_stlrtc_device
+
+class bbc_stlrtc_device : public device_t,
+ public device_bbc_rom_interface
+{
+public:
+ // construction/destruction
+ bbc_stlrtc_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+
+protected:
+ // device-level overrides
+ virtual void device_add_mconfig(machine_config &config) override;
+
+ virtual void device_start() override;
+
+ // device_bbc_rom_interface overrides
+ virtual uint8_t read(offs_t offset) override;
+
+private:
+ required_device<mc146818_device> m_rtc;
+};
+
+// ======================> bbc_pmsrtc_device
+
+class bbc_pmsrtc_device : public device_t,
+ public device_bbc_rom_interface
+{
+public:
+ // construction/destruction
+ bbc_pmsrtc_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+
+protected:
+ // device-level overrides
+ virtual void device_add_mconfig(machine_config &config) override;
+
+ virtual void device_start() override;
+
+ // device_bbc_rom_interface overrides
+ virtual uint8_t read(offs_t offset) override;
+
+private:
+ required_device<ds1315_device> m_rtc;
+};
+
+// device type definition
+DECLARE_DEVICE_TYPE(BBC_STLRTC, bbc_stlrtc_device)
+DECLARE_DEVICE_TYPE(BBC_PMSRTC, bbc_pmsrtc_device)
+
+#endif // MAME_BUS_BBC_ROM_RTC_H
diff --git a/src/devices/bus/bbc/rom/slot.cpp b/src/devices/bus/bbc/rom/slot.cpp
new file mode 100644
index 00000000000..af8ae212d6d
--- /dev/null
+++ b/src/devices/bus/bbc/rom/slot.cpp
@@ -0,0 +1,234 @@
+// license:BSD-3-Clause
+// copyright-holders:Nigel Barnes
+/*********************************************************************
+
+ BBC Micro ROM slot emulation
+
+*********************************************************************/
+
+#include "emu.h"
+#include "slot.h"
+
+
+//**************************************************************************
+// GLOBAL VARIABLES
+//**************************************************************************
+
+DEFINE_DEVICE_TYPE(BBC_ROMSLOT16, bbc_romslot16_device, "bbc_romslot16", "BBC Micro 16K ROM Slot")
+DEFINE_DEVICE_TYPE(BBC_ROMSLOT32, bbc_romslot32_device, "bbc_romslot32", "BBC Micro 32K ROM Slot")
+
+
+//**************************************************************************
+// DEVICE BBC_ROMSLOT CARD INTERFACE
+//**************************************************************************
+
+//-------------------------------------------------
+// device_bbc_rom_interface - constructor
+//-------------------------------------------------
+
+device_bbc_rom_interface::device_bbc_rom_interface(const machine_config &mconfig, device_t &device)
+ : device_slot_card_interface(mconfig, device)
+ , m_rom(nullptr)
+ , m_rom_size(0)
+{
+}
+
+
+//-------------------------------------------------
+// ~device_bbc_rom_interface - destructor
+//-------------------------------------------------
+
+device_bbc_rom_interface::~device_bbc_rom_interface()
+{
+}
+
+//-------------------------------------------------
+// rom_alloc - alloc the space for the ROM
+//-------------------------------------------------
+
+void device_bbc_rom_interface::rom_alloc(uint32_t size, const char *tag)
+{
+ if (m_rom == nullptr)
+ {
+ m_rom = device().machine().memory().region_alloc(std::string(tag).append(BBC_ROM_REGION_TAG).c_str(), size, 1, ENDIANNESS_LITTLE)->base();
+ m_rom_size = size;
+ }
+}
+
+//-------------------------------------------------
+// ram_alloc - alloc the space for the RAM
+//-------------------------------------------------
+
+void device_bbc_rom_interface::ram_alloc(uint32_t size)
+{
+ m_ram.resize(size);
+ device().save_item(NAME(m_ram));
+}
+
+//-------------------------------------------------
+// nvram_alloc - alloc the space for the NVRAM
+//-------------------------------------------------
+
+void device_bbc_rom_interface::nvram_alloc(uint32_t size)
+{
+ m_nvram.resize(size);
+}
+
+//**************************************************************************
+// LIVE DEVICE
+//**************************************************************************
+
+//-------------------------------------------------
+// bbc_romslot_device - constructor
+//-------------------------------------------------
+bbc_romslot_device::bbc_romslot_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock)
+ : device_t(mconfig, type, tag, owner, clock)
+ , device_image_interface(mconfig, *this)
+ , device_slot_interface(mconfig, *this)
+ , m_cart(nullptr)
+{
+}
+
+bbc_romslot16_device::bbc_romslot16_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+ : bbc_romslot_device(mconfig, BBC_ROMSLOT16, tag, owner, clock)
+{
+}
+
+bbc_romslot32_device::bbc_romslot32_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+ : bbc_romslot_device(mconfig, BBC_ROMSLOT32, tag, owner, clock)
+{
+}
+
+//-------------------------------------------------
+// device_start - device-specific startup
+//-------------------------------------------------
+
+void bbc_romslot_device::device_start()
+{
+ m_cart = dynamic_cast<device_bbc_rom_interface *>(get_card_device());
+}
+
+
+//-------------------------------------------------
+// call load
+//-------------------------------------------------
+
+image_init_result bbc_romslot_device::call_load()
+{
+ if (m_cart)
+ {
+ uint32_t size = !loaded_through_softlist() ? length() : get_software_region_length("rom");
+
+ if (size % 0x2000)
+ {
+ seterror(IMAGE_ERROR_INVALIDIMAGE, "Invalid ROM size");
+ return image_init_result::FAIL;
+ }
+
+ m_cart->rom_alloc(size, tag());
+
+ if (!loaded_through_softlist())
+ fread(m_cart->get_rom_base(), size);
+ else
+ memcpy(m_cart->get_rom_base(), get_software_region("rom"), size);
+
+ if (get_software_region("ram"))
+ m_cart->ram_alloc(get_software_region_length("ram"));
+
+ if (get_software_region("nvram"))
+ m_cart->nvram_alloc(get_software_region_length("nvram"));
+ }
+
+ return image_init_result::PASS;
+}
+
+//-------------------------------------------------
+// call_unload
+//-------------------------------------------------
+
+void bbc_romslot_device::call_unload()
+{
+ if (m_cart && m_cart->get_nvram_base() && m_cart->get_nvram_size())
+ battery_save(m_cart->get_nvram_base(), m_cart->get_nvram_size());
+}
+
+
+//-------------------------------------------------
+// get default card software
+//-------------------------------------------------
+
+std::string bbc_romslot_device::get_default_card_software(get_default_card_software_hook &hook) const
+{
+ return software_get_default_slot("rom");
+}
+
+
+//-------------------------------------------------
+// rom size
+//-------------------------------------------------
+
+uint32_t bbc_romslot_device::get_rom_size()
+{
+ if (m_cart)
+ return m_cart->get_rom_size();
+ else
+ return 0;
+}
+
+
+//-------------------------------------------------
+// read - rom read
+//-------------------------------------------------
+
+uint8_t bbc_romslot_device::read(offs_t offset)
+{
+ if (m_cart)
+ return m_cart->read(offset);
+ else
+ return 0xff;
+}
+
+
+//-------------------------------------------------
+// write - rom write
+//-------------------------------------------------
+
+void bbc_romslot_device::write(offs_t offset, uint8_t data)
+{
+ if (m_cart)
+ m_cart->write(offset, data);
+}
+
+
+//-------------------------------------------------
+// SLOT_INTERFACE( bbc_rom )
+//-------------------------------------------------
+
+#include "rom.h"
+#include "ram.h"
+#include "dfs.h"
+//#include "genie.h"
+#include "pal.h"
+//#include "replay.h"
+#include "rtc.h"
+
+
+void bbc_rom_devices(device_slot_interface &device)
+{
+ device.option_add_internal("rom", BBC_ROM);
+ device.option_add_internal("ram", BBC_RAM);
+ device.option_add_internal("cciword", BBC_CCIWORD);
+ device.option_add_internal("ccibase", BBC_CCIBASE);
+ device.option_add_internal("ccispell", BBC_CCISPELL);
+ device.option_add_internal("palqst", BBC_PALQST);
+ device.option_add_internal("palwap", BBC_PALWAP);
+ device.option_add_internal("palted", BBC_PALTED);
+ device.option_add_internal("palabep", BBC_PALABEP);
+ device.option_add_internal("palabe", BBC_PALABE);
+ device.option_add_internal("palmo2", BBC_PALMO2);
+ //device.option_add_internal("genie", BBC_PMSGENIE);
+ device.option_add_internal("mrme00", BBC_MRME00);
+ //device.option_add_internal("replay", BBC_REPLAY);
+ device.option_add_internal("stlrtc", BBC_STLRTC);
+ device.option_add_internal("pmsrtc", BBC_PMSRTC);
+}
diff --git a/src/devices/bus/bbc/rom/slot.h b/src/devices/bus/bbc/rom/slot.h
new file mode 100644
index 00000000000..40818d9e619
--- /dev/null
+++ b/src/devices/bus/bbc/rom/slot.h
@@ -0,0 +1,155 @@
+// license:BSD-3-Clause
+// copyright-holders:Nigel Barnes
+/*********************************************************************
+
+ BBC Micro ROM slot emulation
+
+*********************************************************************/
+
+#ifndef MAME_BUS_BBC_ROM_SLOT_H
+#define MAME_BUS_BBC_ROM_SLOT_H
+
+#pragma once
+
+#include "softlist_dev.h"
+
+
+#define BBC_ROM_REGION_TAG ":cart:rom"
+
+/***************************************************************************
+ TYPE DEFINITIONS
+***************************************************************************/
+
+// ======================> bbc_romslot_device
+
+class device_bbc_rom_interface;
+
+class bbc_romslot_device : public device_t,
+ public device_image_interface,
+ public device_slot_interface
+{
+public:
+ // image-level overrides
+ virtual image_init_result call_load() override;
+ virtual void call_unload() override;
+ virtual const software_list_loader &get_software_list_loader() const override { return rom_software_list_loader::instance(); }
+
+ virtual iodevice_t image_type() const override { return IO_ROM; }
+ virtual bool is_readable() const override { return 1; }
+ virtual bool is_writeable() const override { return 0; }
+ virtual bool is_creatable() const override { return 0; }
+ virtual bool must_be_loaded() const override { return 0; }
+ virtual bool is_reset_on_load() const override { return 1; }
+ virtual const char *image_interface() const override { return "bbc_rom"; }
+ virtual const char *file_extensions() const override { return "rom,bin"; }
+
+ // slot interface overrides
+ virtual std::string get_default_card_software(get_default_card_software_hook &hook) const override;
+
+ // reading and writing
+ uint8_t read(offs_t offset);
+ void write(offs_t offset, uint8_t data);
+
+ uint32_t get_rom_size();
+ uint32_t get_slot_size() const { return m_slot_size; }
+
+protected:
+ // construction/destruction
+ bbc_romslot_device(const machine_config &mconfig, device_type type, char const *tag, device_t *owner, uint32_t clock);
+
+ // device-level overrides
+ virtual void device_start() override;
+
+ uint32_t m_slot_size;
+
+private:
+ device_bbc_rom_interface* m_cart;
+};
+
+// ======================> bbc_romslot16_device
+
+class bbc_romslot16_device : public bbc_romslot_device
+{
+public:
+ // construction/destruction
+ template <typename T>
+ bbc_romslot16_device(machine_config const &mconfig, char const *tag, device_t *owner, T &&slot_options, char const *default_option)
+ : bbc_romslot16_device(mconfig, tag, owner)
+ {
+ option_reset();
+ slot_options(*this);
+ set_default_option(default_option);
+ set_fixed(false);
+ m_slot_size = 0x4000;
+ }
+
+ bbc_romslot16_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock = 0);
+};
+
+// ======================> bbc_romslot32_device
+
+class bbc_romslot32_device : public bbc_romslot_device
+{
+public:
+ // construction/destruction
+ template <typename T>
+ bbc_romslot32_device(machine_config const &mconfig, char const *tag, device_t *owner, T &&slot_options, char const *default_option)
+ : bbc_romslot32_device(mconfig, tag, owner)
+ {
+ option_reset();
+ slot_options(*this);
+ set_default_option(default_option);
+ set_fixed(false);
+ m_slot_size = 0x8000;
+ }
+
+ bbc_romslot32_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock = 0);
+};
+
+
+// ======================> device_bbc_rom_interface
+
+class device_bbc_rom_interface : public device_slot_card_interface
+{
+public:
+ // construction/destruction
+ virtual ~device_bbc_rom_interface();
+
+ // reading and writing
+ virtual uint8_t read(offs_t offset) { return 0xff; }
+ virtual void write(offs_t offset, uint8_t data) { m_device.logerror("unhandled ROM write to %04X = %02X\n", offset | 0x8000, data); }
+
+ void rom_alloc(uint32_t size, const char *tag);
+ void ram_alloc(uint32_t size);
+ void nvram_alloc(uint32_t size);
+
+ uint8_t* get_rom_base() { return m_rom; }
+ virtual uint32_t get_rom_size() { return m_rom_size; }
+
+ uint8_t* get_ram_base() { return &m_ram[0]; }
+ uint32_t get_ram_size() { return m_ram.size(); }
+
+ uint8_t* get_nvram_base() { return &m_nvram[0]; }
+ uint32_t get_nvram_size() { return m_nvram.size(); }
+
+protected:
+ device_bbc_rom_interface(const machine_config &mconfig, device_t &device);
+
+ bbc_romslot_device *m_slot;
+
+private:
+ // internal state
+ uint8_t *m_rom;
+ uint32_t m_rom_size;
+ std::vector<uint8_t> m_ram;
+ std::vector<uint8_t> m_nvram;
+};
+
+
+// device type definition
+DECLARE_DEVICE_TYPE(BBC_ROMSLOT16, bbc_romslot16_device)
+DECLARE_DEVICE_TYPE(BBC_ROMSLOT32, bbc_romslot32_device)
+
+void bbc_rom_devices(device_slot_interface &device);
+
+#endif // MAME_BUS_BBC_ROM_SLOT_H
diff --git a/src/devices/bus/bbc/tube/tube.cpp b/src/devices/bus/bbc/tube/tube.cpp
index 2ac1bf5fb15..602ea3c845a 100644
--- a/src/devices/bus/bbc/tube/tube.cpp
+++ b/src/devices/bus/bbc/tube/tube.cpp
@@ -92,10 +92,10 @@ void bbc_tube_slot_device::device_reset()
// host_r
//-------------------------------------------------
-READ8_MEMBER(bbc_tube_slot_device::host_r)
+uint8_t bbc_tube_slot_device::host_r(offs_t offset)
{
if (m_card)
- return m_card->host_r(space, offset);
+ return m_card->host_r(offset);
else
return 0xfe;
}
@@ -104,14 +104,15 @@ READ8_MEMBER(bbc_tube_slot_device::host_r)
// host_w
//-------------------------------------------------
-WRITE8_MEMBER(bbc_tube_slot_device::host_w)
+void bbc_tube_slot_device::host_w(offs_t offset, uint8_t data)
{
if (m_card)
- m_card->host_w(space, offset, data);
+ m_card->host_w(offset, data);
}
// slot devices
+#include "tube_32016.h"
#include "tube_6502.h"
#include "tube_80186.h"
#include "tube_80286.h"
@@ -133,7 +134,7 @@ void bbc_tube_devices(device_slot_interface &device)
{
device.option_add("6502", BBC_TUBE_6502); /* Acorn ANC01 6502 2nd processor */
device.option_add("z80", BBC_TUBE_Z80); /* Acorn ANC04 Z80 2nd processor */
- //device.option_add("32016", BBC_TUBE_32016); /* Acorn ANC05 32016 2nd processor */
+ device.option_add("32016", BBC_TUBE_32016); /* Acorn ANC05 32016 2nd processor */
device.option_add("arm", BBC_TUBE_ARM); /* Acorn ANC13 ARM Evaluation System */
device.option_add("80286", BBC_TUBE_80286); /* Acorn 80286 2nd Processor */
//device.option_add("a500", BBC_TUBE_A500); /* Acorn A500 2nd Processor */
@@ -142,8 +143,8 @@ void bbc_tube_devices(device_slot_interface &device)
//device.option_add("hdp68k", BBC_TUBE_HDP68K); /* Torch Unicorn (HDP68K) */
//device.option_add("x25", BBC_TUBE_X25); /* Econet X25 Gateway */
device.option_add("zep100", BBC_TUBE_ZEP100); /* Torch Z80 Communicator (ZEP100) (Torch) */
- //device.option_add("zep100l", BBC_TUBE_ZEP100L); /* Torch Z80 Communicator (ZEP100) (Acorn 8271) */
- //device.option_add("zep100w", BBC_TUBE_ZEP100W); /* Torch Z80 Communicator (ZEP100) (Acorn 1770) */
+ //device.option_add("zep100l", BBC_TUBE_ZEP100L); /* Torch Z80 Communicator (ZEP100) (Model B) */
+ //device.option_add("zep100w", BBC_TUBE_ZEP100W); /* Torch Z80 Communicator (ZEP100) (Model B+) */
/* Acorn ANC21 Universal 2nd Processor Unit */
device.option_add("65c102", BBC_TUBE_65C102); /* Acorn ADC06 65C102 co-processor */
device.option_add("80186", BBC_TUBE_80186); /* Acorn ADC08 80186 co-processor */
@@ -160,11 +161,12 @@ void bbc_extube_devices(device_slot_interface &device)
{
device.option_add("6502", BBC_TUBE_6502); /* Acorn ANC01 6502 2nd processor */
device.option_add("z80", BBC_TUBE_Z80); /* Acorn ANC04 Z80 2nd processor */
- //device.option_add("32016", BBC_TUBE_32016); /* Acorn ANC05 32016 2nd processor */
+ device.option_add("32016", BBC_TUBE_32016); /* Acorn ANC05 32016 2nd processor */
device.option_add("arm", BBC_TUBE_ARM); /* Acorn ANC13 ARM Evaluation System */
device.option_add("80286", BBC_TUBE_80286); /* Acorn 80286 2nd Processor */
//device.option_add("a500", BBC_TUBE_A500); /* Acorn A500 2nd Processor */
//device.option_add("pmsb2p", BBC_TUBE_PMSB2P); /* PMS B2P-6502 */
+ //device.option_add("zep100m", BBC_TUBE_ZEP100M); /* Torch Z80 Communicator (ZEP100) (Master) */
/* Acorn ANC21 Universal 2nd Processor Unit */
device.option_add("65c102", BBC_TUBE_65C102); /* Acorn ADC06 65C102 co-processor */
device.option_add("80186", BBC_TUBE_80186); /* Acorn ADC08 80186 co-processor */
@@ -181,7 +183,6 @@ void bbc_intube_devices(device_slot_interface &device)
{
device.option_add("65c102", BBC_TUBE_65C102); /* Acorn ADC06 65C102 co-processor */
device.option_add("80186", BBC_TUBE_80186); /* Acorn ADC08 80186 co-processor */
- //device.option_add("zep100m", BBC_TUBE_ZEP100M); /* Torch Z80 Communicator (ZEP100) (Master) */
//device.option_add("arm7", BBC_TUBE_ARM7); /* Sprow ARM7 co-processor */
device.option_add("rc6502", BBC_TUBE_RC6502); /* ReCo6502 (6502) */
device.option_add("rc65816", BBC_TUBE_RC65816); /* ReCo6502 (65816) */
@@ -196,6 +197,7 @@ void electron_tube_devices(device_slot_interface &device)
{
device.option_add("6502", BBC_TUBE_6502); /* Acorn ANC01 6502 2nd processor */
device.option_add("z80", BBC_TUBE_Z80); /* Acorn ANC04 Z80 2nd processor */
+ device.option_add("32016", BBC_TUBE_32016); /* Acorn ANC05 32016 2nd processor */
device.option_add("arm", BBC_TUBE_ARM); /* Acorn ANC13 ARM Evaluation System */
device.option_add("65c102", BBC_TUBE_65C102); /* Acorn ADC06 65C102 co-processor */
device.option_add("80186", BBC_TUBE_80186); /* Acorn ADC08 80186 co-processor */
diff --git a/src/devices/bus/bbc/tube/tube.h b/src/devices/bus/bbc/tube/tube.h
index 954867f0b7f..e0d66907cb6 100644
--- a/src/devices/bus/bbc/tube/tube.h
+++ b/src/devices/bus/bbc/tube/tube.h
@@ -66,8 +66,8 @@ public:
// callbacks
auto irq_handler() { return m_irq_handler.bind(); }
- DECLARE_READ8_MEMBER( host_r );
- DECLARE_WRITE8_MEMBER( host_w );
+ uint8_t host_r(offs_t offset);
+ void host_w(offs_t offset, uint8_t data);
DECLARE_WRITE_LINE_MEMBER( irq_w ) { m_irq_handler(state); }
@@ -90,8 +90,8 @@ class device_bbc_tube_interface : public device_slot_card_interface
{
public:
// reading and writing
- virtual DECLARE_READ8_MEMBER(host_r) { return 0xfe; }
- virtual DECLARE_WRITE8_MEMBER(host_w) { }
+ virtual uint8_t host_r(offs_t offset) { return 0xfe; }
+ virtual void host_w(offs_t offset, uint8_t data) { }
protected:
device_bbc_tube_interface(const machine_config &mconfig, device_t &device);
diff --git a/src/devices/bus/bbc/tube/tube_32016.cpp b/src/devices/bus/bbc/tube/tube_32016.cpp
new file mode 100644
index 00000000000..7b6ac355e42
--- /dev/null
+++ b/src/devices/bus/bbc/tube/tube_32016.cpp
@@ -0,0 +1,210 @@
+// license:BSD-3-Clause
+// copyright-holders:Nigel Barnes
+/**********************************************************************
+
+ Acorn ANC05 32016 2nd processor
+
+ http://chrisacorns.computinghistory.org.uk/8bit_Upgrades/Acorn_ANC05_320162ndproc.html
+
+ Acorn ANC06 Cambridge Co-Processor
+
+ http://chrisacorns.computinghistory.org.uk/8bit_Upgrades/Acorn_ANC06_CamCoPro.html
+
+ IC1 (ULA) TUBE
+ IC2 (MMU) NS32082 Not fitted
+ IC3 (CPU) NS32016
+ IC4 (TCU) NS32201
+ IC20 (FPU) NS32081
+
+**********************************************************************/
+
+
+#include "emu.h"
+#include "tube_32016.h"
+#include "softlist_dev.h"
+
+
+//**************************************************************************
+// DEVICE DEFINITIONS
+//**************************************************************************
+
+DEFINE_DEVICE_TYPE(BBC_TUBE_32016, bbc_tube_32016_device, "bbc_tube_32016", "Acorn 32016 2nd processor")
+
+
+//-------------------------------------------------
+// ADDRESS_MAP( tube_32016_mem )
+//-------------------------------------------------
+
+void bbc_tube_32016_device::tube_32016_mem(address_map &map)
+{
+ map(0x000000, 0xffffff).rw(FUNC(bbc_tube_32016_device::read), FUNC(bbc_tube_32016_device::write));
+ map(0xf90000, 0xf90001).portr("CONFIG");
+ map(0xfffff0, 0xffffff).rw("ula", FUNC(tube_device::parasite_r), FUNC(tube_device::parasite_w)).umask32(0x00ff);
+}
+
+//-------------------------------------------------
+// ROM( tube_32016 )
+//-------------------------------------------------
+
+ROM_START(tube_32016)
+ ROM_REGION(0x8000, "rom", 0)
+ ROM_DEFAULT_BIOS("200")
+ ROM_SYSTEM_BIOS(0, "200", "Pandora v2.00")
+ ROMX_LOAD("pan200lo.rom", 0x0000, 0x4000, CRC(b1980fd0) SHA1(8084f8896cd22953abefbd43c51e1a422b30e28d), ROM_SKIP(1) | ROM_BIOS(0)) // 0201-764-02 Pandora Lo
+ ROMX_LOAD("pan200hi.rom", 0x0001, 0x4000, CRC(cab98d6b) SHA1(dfad1f4180c50757a74fcfe3a0ee7d7b48eb1bee), ROM_SKIP(1) | ROM_BIOS(0)) // 0201-763-02 Pandora Hi
+ ROM_SYSTEM_BIOS(1, "100", "Pandora v1.00")
+ ROMX_LOAD("pan100.rom", 0x0000, 0x8000, BAD_DUMP CRC(75333006) SHA1(996cd120103039390c9b979b16c327bb95da72e4), ROM_BIOS(1)) // 0201-763-01, 0201-764-01 Pandora
+ ROM_SYSTEM_BIOS(2, "061", "Pandora v0.61")
+ ROMX_LOAD("pan061lo.rom", 0x0000, 0x4000, CRC(6f801b35) SHA1(ce31f7c10603f3d15a06a8e32bde40df0639e446), ROM_SKIP(1) | ROM_BIOS(2))
+ ROMX_LOAD("pan061hi.rom", 0x0001, 0x4000, CRC(c00b1ab0) SHA1(e6a705232278c518340ddc69ea51af91965fa332), ROM_SKIP(1) | ROM_BIOS(2))
+ROM_END
+
+//-------------------------------------------------
+// INPUT_PORTS( tube_32016 )
+//-------------------------------------------------
+
+static INPUT_PORTS_START(tube_32016)
+ PORT_START("CONFIG")
+ PORT_DIPNAME(0x80, 0x80, "H") PORT_DIPLOCATION("LKS:1")
+ PORT_DIPSETTING(0x80, "FPU")
+ PORT_DIPSETTING(0x00, "No FPU")
+
+ PORT_DIPNAME(0x40, 0x00, "G") PORT_DIPLOCATION("LKS:2")
+ PORT_DIPSETTING(0x40, "MMU")
+ PORT_DIPSETTING(0x00, "No MMU")
+
+ PORT_DIPNAME(0x20, 0x00, "F") PORT_DIPLOCATION("LKS:3")
+ PORT_DIPSETTING(0x20, "Reserved")
+ PORT_DIPSETTING(0x00, "Reserved")
+
+ PORT_DIPNAME(0x10, 0x00, "E") PORT_DIPLOCATION("LKS:4")
+ PORT_DIPSETTING(0x10, "Reserved")
+ PORT_DIPSETTING(0x00, "Reserved")
+
+ PORT_DIPNAME(0x08, 0x00, "D") PORT_DIPLOCATION("LKS:5")
+ PORT_DIPSETTING(0x08, "Reserved")
+ PORT_DIPSETTING(0x00, "Reserved")
+
+ PORT_DIPNAME(0x04, 0x00, "C") PORT_DIPLOCATION("LKS:6")
+ PORT_DIPSETTING(0x04, "Reserved")
+ PORT_DIPSETTING(0x00, "Reserved")
+
+ PORT_DIPNAME(0x02, 0x00, "B") PORT_DIPLOCATION("LKS:7")
+ PORT_DIPSETTING(0x02, "Reserved")
+ PORT_DIPSETTING(0x00, "Reserved")
+
+ PORT_DIPNAME(0x01, 0x00, "A") PORT_DIPLOCATION("LKS:8")
+ PORT_DIPSETTING(0x01, "Reserved")
+ PORT_DIPSETTING(0x00, "Reserved")
+INPUT_PORTS_END
+
+//-------------------------------------------------
+// device_add_mconfig - add device configuration
+//-------------------------------------------------
+
+void bbc_tube_32016_device::device_add_mconfig(machine_config &config)
+{
+ NS32016(config, m_maincpu, 12_MHz_XTAL / 2);
+ m_maincpu->set_addrmap(AS_PROGRAM, &bbc_tube_32016_device::tube_32016_mem);
+
+ TUBE(config, m_ula);
+ m_ula->pnmi_handler().set_inputline(m_maincpu, INPUT_LINE_NMI);
+ m_ula->pirq_handler().set_inputline(m_maincpu, INPUT_LINE_IRQ0);
+
+ /* internal ram */
+ RAM(config, m_ram).set_default_size("1M").set_default_value(0);
+
+ /* software lists */
+ SOFTWARE_LIST(config, "flop_ls_32016").set_original("bbc_flop_32016");
+}
+
+//-------------------------------------------------
+// rom_region - device-specific ROM region
+//-------------------------------------------------
+
+const tiny_rom_entry *bbc_tube_32016_device::device_rom_region() const
+{
+ return ROM_NAME( tube_32016 );
+}
+
+//-------------------------------------------------
+// input_ports - device-specific input ports
+//-------------------------------------------------
+
+ioport_constructor bbc_tube_32016_device::device_input_ports() const
+{
+ return INPUT_PORTS_NAME( tube_32016 );
+}
+
+//**************************************************************************
+// LIVE DEVICE
+//**************************************************************************
+
+//-------------------------------------------------
+// bbc_tube_32016_device - constructor
+//-------------------------------------------------
+
+bbc_tube_32016_device::bbc_tube_32016_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+ : device_t(mconfig, BBC_TUBE_32016, tag, owner, clock)
+ , device_bbc_tube_interface(mconfig, *this)
+ , m_maincpu(*this, "maincpu")
+ , m_ula(*this, "ula")
+ , m_ram(*this, "ram")
+ , m_rom(*this, "rom")
+ , m_rom_enabled(true)
+{
+}
+
+//-------------------------------------------------
+// device_start - device-specific startup
+//-------------------------------------------------
+
+void bbc_tube_32016_device::device_start()
+{
+}
+
+//-------------------------------------------------
+// device_reset - device-specific reset
+//-------------------------------------------------
+
+void bbc_tube_32016_device::device_reset()
+{
+ m_rom_enabled = true;
+}
+
+
+//**************************************************************************
+// IMPLEMENTATION
+//**************************************************************************
+
+uint8_t bbc_tube_32016_device::host_r(offs_t offset)
+{
+ return m_ula->host_r(offset);
+}
+
+void bbc_tube_32016_device::host_w(offs_t offset, uint8_t data)
+{
+ m_ula->host_w(offset, data);
+}
+
+
+READ8_MEMBER(bbc_tube_32016_device::read)
+{
+ uint16_t data = 0xffff;
+
+ if (m_rom_enabled)
+ data = m_rom->base()[offset & 0x3fff];
+ else if (offset < m_ram->size())
+ data = m_ram->pointer()[offset];
+
+ return data;
+}
+
+WRITE8_MEMBER(bbc_tube_32016_device::write)
+{
+ /* clear ROM select on first write */
+ if (!machine().side_effects_disabled()) m_rom_enabled = false;
+
+ if (offset < m_ram->size())
+ m_ram->pointer()[offset] = data;
+}
diff --git a/src/devices/bus/bbc/tube/tube_32016.h b/src/devices/bus/bbc/tube/tube_32016.h
new file mode 100644
index 00000000000..864b8173703
--- /dev/null
+++ b/src/devices/bus/bbc/tube/tube_32016.h
@@ -0,0 +1,71 @@
+// license:BSD-3-Clause
+// copyright-holders:Nigel Barnes
+/**********************************************************************
+
+ Acorn ANC05 32016 2nd processor
+
+ http://chrisacorns.computinghistory.org.uk/8bit_Upgrades/Acorn_ANC05_320162ndproc.html
+
+ Acorn ANC06 Cambridge Co-Processor
+
+ http://chrisacorns.computinghistory.org.uk/8bit_Upgrades/Acorn_ANC06_CamCoPro.html
+
+**********************************************************************/
+
+
+#ifndef MAME_BUS_BBC_TUBE_32016_H
+#define MAME_BUS_BBC_TUBE_32016_H
+
+#include "tube.h"
+#include "cpu/ns32000/ns32000.h"
+#include "machine/ram.h"
+#include "machine/tube.h"
+
+//**************************************************************************
+// TYPE DEFINITIONS
+//**************************************************************************
+
+// ======================> bbc_tube_32016_device
+
+class bbc_tube_32016_device :
+ public device_t,
+ public device_bbc_tube_interface
+{
+public:
+ // construction/destruction
+ bbc_tube_32016_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+
+protected:
+ // device-level overrides
+ virtual void device_start() override;
+ virtual void device_reset() override;
+
+ // optional information overrides
+ virtual void device_add_mconfig(machine_config &config) override;
+ virtual const tiny_rom_entry *device_rom_region() const override;
+ virtual ioport_constructor device_input_ports() const override;
+
+ virtual uint8_t host_r(offs_t offset) override;
+ virtual void host_w(offs_t offset, uint8_t data) override;
+
+private:
+ required_device<ns32016_cpu_device> m_maincpu;
+ required_device<tube_device> m_ula;
+ required_device<ram_device> m_ram;
+ required_memory_region m_rom;
+
+ DECLARE_READ8_MEMBER(read);
+ DECLARE_WRITE8_MEMBER(write);
+
+ void tube_32016_mem(address_map &map);
+
+ bool m_rom_enabled;
+};
+
+
+
+// device type definition
+DECLARE_DEVICE_TYPE(BBC_TUBE_32016, bbc_tube_32016_device)
+
+
+#endif /* MAME_BUS_BBC_TUBE_32016_H */
diff --git a/src/devices/bus/bbc/tube/tube_6502.cpp b/src/devices/bus/bbc/tube/tube_6502.cpp
index 8120ab16812..99852ca8d90 100644
--- a/src/devices/bus/bbc/tube/tube_6502.cpp
+++ b/src/devices/bus/bbc/tube/tube_6502.cpp
@@ -168,27 +168,27 @@ void bbc_tube_6502_device::device_reset()
// IMPLEMENTATION
//**************************************************************************
-READ8_MEMBER(bbc_tube_6502_device::host_r)
+uint8_t bbc_tube_6502_device::host_r(offs_t offset)
{
- return m_ula->host_r(space, offset);
+ return m_ula->host_r(offset);
}
-WRITE8_MEMBER(bbc_tube_6502_device::host_w)
+void bbc_tube_6502_device::host_w(offs_t offset, uint8_t data)
{
- m_ula->host_w(space, offset, data);
+ m_ula->host_w(offset, data);
}
-READ8_MEMBER(bbc_tube_6502_device::tube_r)
+uint8_t bbc_tube_6502_device::tube_r(offs_t offset)
{
// Disable ROM on first access
if (!machine().side_effects_disabled())
m_bankdev->set_bank(1);
- return m_ula->parasite_r(space, offset);
+ return m_ula->parasite_r(offset);
}
-WRITE8_MEMBER(bbc_tube_6502_device::tube_w)
+void bbc_tube_6502_device::tube_w(offs_t offset, uint8_t data)
{
- m_ula->parasite_w(space, offset, data);
+ m_ula->parasite_w(offset, data);
}
diff --git a/src/devices/bus/bbc/tube/tube_6502.h b/src/devices/bus/bbc/tube/tube_6502.h
index 244eb9f2105..abb907ef3bd 100644
--- a/src/devices/bus/bbc/tube/tube_6502.h
+++ b/src/devices/bus/bbc/tube/tube_6502.h
@@ -52,11 +52,11 @@ protected:
void add_common_devices(machine_config &config);
- virtual DECLARE_READ8_MEMBER( host_r ) override;
- virtual DECLARE_WRITE8_MEMBER( host_w ) override;
+ virtual uint8_t host_r(offs_t offset) override;
+ virtual void host_w(offs_t offset, uint8_t data) override;
- virtual DECLARE_READ8_MEMBER( tube_r );
- virtual DECLARE_WRITE8_MEMBER( tube_w );
+ virtual uint8_t tube_r(offs_t offset);
+ virtual void tube_w(offs_t offset, uint8_t data);
required_device<cpu_device> m_maincpu;
required_device<address_map_bank_device> m_bankdev;
diff --git a/src/devices/bus/bbc/tube/tube_80186.cpp b/src/devices/bus/bbc/tube/tube_80186.cpp
index 4721d48e534..85331ab1b2a 100644
--- a/src/devices/bus/bbc/tube/tube_80186.cpp
+++ b/src/devices/bus/bbc/tube/tube_80186.cpp
@@ -126,12 +126,12 @@ void bbc_tube_80186_device::device_reset()
// IMPLEMENTATION
//**************************************************************************
-READ8_MEMBER(bbc_tube_80186_device::host_r)
+uint8_t bbc_tube_80186_device::host_r(offs_t offset)
{
- return m_ula->host_r(space, offset);
+ return m_ula->host_r(offset);
}
-WRITE8_MEMBER(bbc_tube_80186_device::host_w)
+void bbc_tube_80186_device::host_w(offs_t offset, uint8_t data)
{
- m_ula->host_w(space, offset, data);
+ m_ula->host_w(offset, data);
}
diff --git a/src/devices/bus/bbc/tube/tube_80186.h b/src/devices/bus/bbc/tube/tube_80186.h
index 3081acbddac..42f757e75e4 100644
--- a/src/devices/bus/bbc/tube/tube_80186.h
+++ b/src/devices/bus/bbc/tube/tube_80186.h
@@ -40,8 +40,8 @@ protected:
virtual void device_add_mconfig(machine_config &config) override;
virtual const tiny_rom_entry *device_rom_region() const override;
- virtual DECLARE_READ8_MEMBER( host_r ) override;
- virtual DECLARE_WRITE8_MEMBER( host_w ) override;
+ virtual uint8_t host_r(offs_t offset) override;
+ virtual void host_w(offs_t offset, uint8_t data) override;
private:
required_device<i80186_cpu_device> m_i80186;
diff --git a/src/devices/bus/bbc/tube/tube_80286.cpp b/src/devices/bus/bbc/tube/tube_80286.cpp
index f38761341f5..e8ff167d0fb 100644
--- a/src/devices/bus/bbc/tube/tube_80286.cpp
+++ b/src/devices/bus/bbc/tube/tube_80286.cpp
@@ -129,24 +129,25 @@ void bbc_tube_80286_device::device_reset()
// IMPLEMENTATION
//**************************************************************************
-READ8_MEMBER(bbc_tube_80286_device::host_r)
+uint8_t bbc_tube_80286_device::host_r(offs_t offset)
{
- return m_ula->host_r(space, offset);
+ return m_ula->host_r(offset);
}
-WRITE8_MEMBER(bbc_tube_80286_device::host_w)
+void bbc_tube_80286_device::host_w(offs_t offset, uint8_t data)
{
- m_ula->host_w(space, offset, data);
+ m_ula->host_w(offset, data);
}
-READ8_MEMBER(bbc_tube_80286_device::disable_boot_rom)
+uint8_t bbc_tube_80286_device::disable_boot_rom()
{
- m_i80286->space(AS_PROGRAM).install_ram(0xc0000, 0xfffff, m_ram->pointer() + 0xc0000);
+ if (!machine().side_effects_disabled())
+ m_i80286->space(AS_PROGRAM).install_ram(0xc0000, 0xfffff, m_ram->pointer() + 0xc0000);
return 0xff;
}
-WRITE8_MEMBER(bbc_tube_80286_device::irq_latch_w)
+void bbc_tube_80286_device::irq_latch_w(uint8_t data)
{
m_irq_latch = data;
}
diff --git a/src/devices/bus/bbc/tube/tube_80286.h b/src/devices/bus/bbc/tube/tube_80286.h
index da2d807477b..a6e952d6bf2 100644
--- a/src/devices/bus/bbc/tube/tube_80286.h
+++ b/src/devices/bus/bbc/tube/tube_80286.h
@@ -38,8 +38,8 @@ protected:
virtual void device_add_mconfig(machine_config &config) override;
virtual const tiny_rom_entry *device_rom_region() const override;
- virtual DECLARE_READ8_MEMBER( host_r ) override;
- virtual DECLARE_WRITE8_MEMBER( host_w ) override;
+ virtual uint8_t host_r(offs_t offset) override;
+ virtual void host_w(offs_t offset, uint8_t data) override;
private:
uint8_t m_irq_latch;
@@ -51,8 +51,8 @@ private:
required_device<ram_device> m_ram;
required_memory_region m_bootstrap;
- DECLARE_READ8_MEMBER( disable_boot_rom );
- DECLARE_WRITE8_MEMBER( irq_latch_w );
+ uint8_t disable_boot_rom();
+ void irq_latch_w(uint8_t data);
void tube_80286_io(address_map &map);
void tube_80286_mem(address_map &map);
diff --git a/src/devices/bus/bbc/tube/tube_arm.cpp b/src/devices/bus/bbc/tube/tube_arm.cpp
index 444e188a657..463a82713be 100644
--- a/src/devices/bus/bbc/tube/tube_arm.cpp
+++ b/src/devices/bus/bbc/tube/tube_arm.cpp
@@ -120,18 +120,18 @@ void bbc_tube_arm_device::device_reset()
// IMPLEMENTATION
//**************************************************************************
-READ8_MEMBER(bbc_tube_arm_device::host_r)
+uint8_t bbc_tube_arm_device::host_r(offs_t offset)
{
- return m_ula->host_r(space, offset);
+ return m_ula->host_r(offset);
}
-WRITE8_MEMBER(bbc_tube_arm_device::host_w)
+void bbc_tube_arm_device::host_w(offs_t offset, uint8_t data)
{
- m_ula->host_w(space, offset, data);
+ m_ula->host_w(offset, data);
}
-READ8_MEMBER(bbc_tube_arm_device::ram_r)
+uint8_t bbc_tube_arm_device::ram_r(offs_t offset)
{
uint8_t data;
@@ -143,7 +143,7 @@ READ8_MEMBER(bbc_tube_arm_device::ram_r)
return data;
}
-WRITE8_MEMBER(bbc_tube_arm_device::ram_w)
+void bbc_tube_arm_device::ram_w(offs_t offset, uint8_t data)
{
/* clear ROM select on first write */
if (!machine().side_effects_disabled()) m_rom_select = false;
diff --git a/src/devices/bus/bbc/tube/tube_arm.h b/src/devices/bus/bbc/tube/tube_arm.h
index 7b58d2b40bd..8470fec84ef 100644
--- a/src/devices/bus/bbc/tube/tube_arm.h
+++ b/src/devices/bus/bbc/tube/tube_arm.h
@@ -38,8 +38,8 @@ protected:
virtual void device_add_mconfig(machine_config &config) override;
virtual const tiny_rom_entry *device_rom_region() const override;
- virtual DECLARE_READ8_MEMBER( host_r ) override;
- virtual DECLARE_WRITE8_MEMBER( host_w ) override;
+ virtual uint8_t host_r(offs_t offset) override;
+ virtual void host_w(offs_t offset, uint8_t data) override;
private:
required_device<arm_cpu_device> m_arm;
@@ -49,8 +49,8 @@ private:
bool m_rom_select;
- DECLARE_READ8_MEMBER( ram_r );
- DECLARE_WRITE8_MEMBER( ram_w );
+ uint8_t ram_r(offs_t offset);
+ void ram_w(offs_t offset, uint8_t data);
void tube_arm_mem(address_map &map);
};
diff --git a/src/devices/bus/bbc/tube/tube_casper.cpp b/src/devices/bus/bbc/tube/tube_casper.cpp
index db84143f553..f6bb4bdce84 100644
--- a/src/devices/bus/bbc/tube/tube_casper.cpp
+++ b/src/devices/bus/bbc/tube/tube_casper.cpp
@@ -109,12 +109,12 @@ void bbc_tube_casper_device::device_start()
// IMPLEMENTATION
//**************************************************************************
-READ8_MEMBER(bbc_tube_casper_device::host_r)
+uint8_t bbc_tube_casper_device::host_r(offs_t offset)
{
return m_via6522_0->read(offset & 0xf);
}
-WRITE8_MEMBER(bbc_tube_casper_device::host_w)
+void bbc_tube_casper_device::host_w(offs_t offset, uint8_t data)
{
m_via6522_0->write(offset & 0xf, data);
}
diff --git a/src/devices/bus/bbc/tube/tube_casper.h b/src/devices/bus/bbc/tube/tube_casper.h
index e464f4a8c68..965ac703355 100644
--- a/src/devices/bus/bbc/tube/tube_casper.h
+++ b/src/devices/bus/bbc/tube/tube_casper.h
@@ -36,8 +36,8 @@ protected:
virtual void device_add_mconfig(machine_config &config) override;
virtual const tiny_rom_entry *device_rom_region() const override;
- virtual DECLARE_READ8_MEMBER( host_r ) override;
- virtual DECLARE_WRITE8_MEMBER( host_w ) override;
+ virtual uint8_t host_r(offs_t offset) override;
+ virtual void host_w(offs_t offset, uint8_t data) override;
private:
required_device<cpu_device> m_m68000;
diff --git a/src/devices/bus/bbc/tube/tube_rc6502.cpp b/src/devices/bus/bbc/tube/tube_rc6502.cpp
index 80061f8a5ca..c567be6f98a 100644
--- a/src/devices/bus/bbc/tube/tube_rc6502.cpp
+++ b/src/devices/bus/bbc/tube/tube_rc6502.cpp
@@ -233,23 +233,23 @@ void bbc_tube_rc6502_device::device_reset()
// IMPLEMENTATION
//**************************************************************************
-READ8_MEMBER(bbc_tube_rc6502_device::host_r)
+uint8_t bbc_tube_rc6502_device::host_r(offs_t offset)
{
- return m_ula->host_r(space, offset);
+ return m_ula->host_r(offset);
}
-WRITE8_MEMBER(bbc_tube_rc6502_device::host_w)
+void bbc_tube_rc6502_device::host_w(offs_t offset, uint8_t data)
{
- m_ula->host_w(space, offset, data);
+ m_ula->host_w(offset, data);
}
-READ8_MEMBER(bbc_tube_rc6502_device::config_r)
+uint8_t bbc_tube_rc6502_device::config_r()
{
return m_banknum;
}
-WRITE8_MEMBER(bbc_tube_rc6502_device::register_w)
+void bbc_tube_rc6502_device::register_w(uint8_t data)
{
switch (data & 0x06)
{
diff --git a/src/devices/bus/bbc/tube/tube_rc6502.h b/src/devices/bus/bbc/tube/tube_rc6502.h
index 77542cf4a45..eadb460cc96 100644
--- a/src/devices/bus/bbc/tube/tube_rc6502.h
+++ b/src/devices/bus/bbc/tube/tube_rc6502.h
@@ -47,11 +47,11 @@ protected:
void add_common_devices(machine_config &config);
- virtual DECLARE_READ8_MEMBER( host_r ) override;
- virtual DECLARE_WRITE8_MEMBER( host_w ) override;
+ virtual uint8_t host_r(offs_t offset) override;
+ virtual void host_w(offs_t offset, uint8_t data) override;
- DECLARE_READ8_MEMBER(config_r);
- DECLARE_WRITE8_MEMBER(register_w);
+ uint8_t config_r();
+ void register_w(uint8_t data);
void tube_rc6502_bank(address_map &map);
diff --git a/src/devices/bus/bbc/tube/tube_z80.cpp b/src/devices/bus/bbc/tube/tube_z80.cpp
index cc6f87527bf..06e6931c7a3 100644
--- a/src/devices/bus/bbc/tube/tube_z80.cpp
+++ b/src/devices/bus/bbc/tube/tube_z80.cpp
@@ -134,18 +134,18 @@ void bbc_tube_z80_device::device_reset()
// IMPLEMENTATION
//**************************************************************************
-READ8_MEMBER(bbc_tube_z80_device::host_r)
+uint8_t bbc_tube_z80_device::host_r(offs_t offset)
{
- return m_ula->host_r(space, offset);
+ return m_ula->host_r(offset);
}
-WRITE8_MEMBER(bbc_tube_z80_device::host_w)
+void bbc_tube_z80_device::host_w(offs_t offset, uint8_t data)
{
- m_ula->host_w(space, offset, data);
+ m_ula->host_w(offset, data);
}
-READ8_MEMBER(bbc_tube_z80_device::opcode_r)
+uint8_t bbc_tube_z80_device::opcode_r(offs_t offset)
{
if (!machine().side_effects_disabled())
{
@@ -158,7 +158,7 @@ READ8_MEMBER(bbc_tube_z80_device::opcode_r)
}
-READ8_MEMBER(bbc_tube_z80_device::mem_r)
+uint8_t bbc_tube_z80_device::mem_r(offs_t offset)
{
uint8_t data;
@@ -170,7 +170,7 @@ READ8_MEMBER(bbc_tube_z80_device::mem_r)
return data;
}
-WRITE8_MEMBER(bbc_tube_z80_device::mem_w)
+void bbc_tube_z80_device::mem_w(offs_t offset, uint8_t data)
{
m_ram->pointer()[offset] = data;
}
diff --git a/src/devices/bus/bbc/tube/tube_z80.h b/src/devices/bus/bbc/tube/tube_z80.h
index e35dfa02ef4..536e506d43d 100644
--- a/src/devices/bus/bbc/tube/tube_z80.h
+++ b/src/devices/bus/bbc/tube/tube_z80.h
@@ -40,8 +40,8 @@ protected:
virtual void device_add_mconfig(machine_config &config) override;
virtual const tiny_rom_entry *device_rom_region() const override;
- virtual DECLARE_READ8_MEMBER( host_r ) override;
- virtual DECLARE_WRITE8_MEMBER( host_w ) override;
+ virtual uint8_t host_r(offs_t offset) override;
+ virtual void host_w(offs_t offset, uint8_t data) override;
private:
IRQ_CALLBACK_MEMBER( irq_callback );
@@ -54,9 +54,9 @@ private:
bool m_rom_enabled;
- DECLARE_READ8_MEMBER( mem_r );
- DECLARE_WRITE8_MEMBER( mem_w );
- DECLARE_READ8_MEMBER( opcode_r );
+ uint8_t mem_r(offs_t offset);
+ void mem_w(offs_t offset, uint8_t data);
+ uint8_t opcode_r(offs_t offset);
void tube_z80_fetch(address_map &map);
void tube_z80_io(address_map &map);
diff --git a/src/devices/bus/bbc/tube/tube_zep100.cpp b/src/devices/bus/bbc/tube/tube_zep100.cpp
index 6ec898bb705..f11f0af6415 100644
--- a/src/devices/bus/bbc/tube/tube_zep100.cpp
+++ b/src/devices/bus/bbc/tube/tube_zep100.cpp
@@ -146,12 +146,12 @@ void bbc_tube_zep100_device::device_reset()
// IMPLEMENTATION
//**************************************************************************
-READ8_MEMBER(bbc_tube_zep100_device::host_r)
+uint8_t bbc_tube_zep100_device::host_r(offs_t offset)
{
return m_via->read(offset & 0x0f);
}
-WRITE8_MEMBER(bbc_tube_zep100_device::host_w)
+void bbc_tube_zep100_device::host_w(offs_t offset, uint8_t data)
{
if (offset & 0x10)
m_z80->reset();
@@ -160,7 +160,7 @@ WRITE8_MEMBER(bbc_tube_zep100_device::host_w)
}
-READ8_MEMBER(bbc_tube_zep100_device::mem_r)
+uint8_t bbc_tube_zep100_device::mem_r(offs_t offset)
{
uint8_t data;
@@ -172,13 +172,13 @@ READ8_MEMBER(bbc_tube_zep100_device::mem_r)
return data;
}
-WRITE8_MEMBER(bbc_tube_zep100_device::mem_w)
+void bbc_tube_zep100_device::mem_w(offs_t offset, uint8_t data)
{
m_ram->pointer()[offset] = data;
}
-READ8_MEMBER(bbc_tube_zep100_device::io_r)
+uint8_t bbc_tube_zep100_device::io_r(offs_t offset)
{
uint8_t data = 0xff;
@@ -190,23 +190,23 @@ READ8_MEMBER(bbc_tube_zep100_device::io_r)
return data;
}
-WRITE8_MEMBER(bbc_tube_zep100_device::io_w)
+void bbc_tube_zep100_device::io_w(offs_t offset, uint8_t data)
{
m_ppi->write(offset & 0x03, data);
}
-WRITE8_MEMBER(bbc_tube_zep100_device::via_pb_w)
+void bbc_tube_zep100_device::via_pb_w(uint8_t data)
{
m_port_b = data;
}
-READ8_MEMBER(bbc_tube_zep100_device::ppi_pb_r)
+uint8_t bbc_tube_zep100_device::ppi_pb_r()
{
return m_port_b;
}
-WRITE8_MEMBER(bbc_tube_zep100_device::ppi_pc_w)
+void bbc_tube_zep100_device::ppi_pc_w(uint8_t data)
{
m_via->write_ca1(BIT(data, 7));
m_via->write_cb1(BIT(data, 1));
diff --git a/src/devices/bus/bbc/tube/tube_zep100.h b/src/devices/bus/bbc/tube/tube_zep100.h
index 24b07ea4269..b7f881fcfac 100644
--- a/src/devices/bus/bbc/tube/tube_zep100.h
+++ b/src/devices/bus/bbc/tube/tube_zep100.h
@@ -43,8 +43,8 @@ protected:
virtual void device_add_mconfig(machine_config &config) override;
virtual const tiny_rom_entry *device_rom_region() const override;
- virtual DECLARE_READ8_MEMBER( host_r ) override;
- virtual DECLARE_WRITE8_MEMBER( host_w ) override;
+ virtual uint8_t host_r(offs_t offset) override;
+ virtual void host_w(offs_t offset, uint8_t data) override;
bool m_rom_enabled;
@@ -57,14 +57,14 @@ private:
uint8_t m_port_b;
- DECLARE_READ8_MEMBER( mem_r );
- DECLARE_WRITE8_MEMBER( mem_w );
- DECLARE_READ8_MEMBER( io_r );
- DECLARE_WRITE8_MEMBER( io_w );
+ uint8_t mem_r(offs_t offset);
+ void mem_w(offs_t offset, uint8_t data);
+ uint8_t io_r(offs_t offset);
+ void io_w(offs_t offset, uint8_t data);
- DECLARE_WRITE8_MEMBER( via_pb_w );
- DECLARE_READ8_MEMBER( ppi_pb_r );
- DECLARE_WRITE8_MEMBER( ppi_pc_w );
+ void via_pb_w(uint8_t data);
+ uint8_t ppi_pb_r();
+ void ppi_pc_w(uint8_t data);
void tube_zep100_io(address_map &map);
void tube_zep100_mem(address_map &map);
diff --git a/src/devices/bus/bbc/userport/beebspch.cpp b/src/devices/bus/bbc/userport/beebspch.cpp
index 291179b54c6..728d8ae6658 100644
--- a/src/devices/bus/bbc/userport/beebspch.cpp
+++ b/src/devices/bus/bbc/userport/beebspch.cpp
@@ -82,7 +82,7 @@ void bbc_beebspch_device::device_start()
// IMPLEMENTATION
//**************************************************************************
-WRITE8_MEMBER(bbc_beebspch_device::pb_w)
+void bbc_beebspch_device::pb_w(uint8_t data)
{
switch (data & 0xc0)
{
diff --git a/src/devices/bus/bbc/userport/beebspch.h b/src/devices/bus/bbc/userport/beebspch.h
index 94c36b0cc84..79e6abf64ab 100644
--- a/src/devices/bus/bbc/userport/beebspch.h
+++ b/src/devices/bus/bbc/userport/beebspch.h
@@ -38,7 +38,7 @@ protected:
virtual void device_add_mconfig(machine_config &config) override;
virtual const tiny_rom_entry *device_rom_region() const override;
- virtual DECLARE_WRITE8_MEMBER(pb_w) override;
+ virtual void pb_w(uint8_t data) override;
private:
required_device<sp0256_device> m_nsp;
diff --git a/src/devices/bus/bbc/userport/cfa3000kbd.cpp b/src/devices/bus/bbc/userport/cfa3000kbd.cpp
index d07d7b6dd2f..5b2d5586f56 100644
--- a/src/devices/bus/bbc/userport/cfa3000kbd.cpp
+++ b/src/devices/bus/bbc/userport/cfa3000kbd.cpp
@@ -113,7 +113,7 @@ void cfa3000_kbd_device::device_reset()
// IMPLEMENTATION
//**************************************************************************
-READ8_MEMBER(cfa3000_kbd_device::pb_r)
+uint8_t cfa3000_kbd_device::pb_r()
{
uint8_t data = 0x00;
diff --git a/src/devices/bus/bbc/userport/cfa3000kbd.h b/src/devices/bus/bbc/userport/cfa3000kbd.h
index 2ece3cbf380..ff9951399c8 100644
--- a/src/devices/bus/bbc/userport/cfa3000kbd.h
+++ b/src/devices/bus/bbc/userport/cfa3000kbd.h
@@ -36,7 +36,7 @@ protected:
// optional information overrides
virtual ioport_constructor device_input_ports() const override;
- virtual DECLARE_READ8_MEMBER(pb_r) override;
+ virtual uint8_t pb_r() override;
private:
required_ioport_array<4> m_kbd;
diff --git a/src/devices/bus/bbc/userport/pointer.cpp b/src/devices/bus/bbc/userport/pointer.cpp
index 9a222388989..d8272766d98 100644
--- a/src/devices/bus/bbc/userport/pointer.cpp
+++ b/src/devices/bus/bbc/userport/pointer.cpp
@@ -261,17 +261,17 @@ TIMER_CALLBACK_MEMBER(bbc_pointer_device::pointer_poll)
}
}
-READ8_MEMBER(bbc_amxmouse_device::pb_r)
+uint8_t bbc_amxmouse_device::pb_r()
{
return (m_buttons->read() & 0xe0) | (m_xdir << 0) | (m_ydir << 2) | 0x1a;
}
-READ8_MEMBER(bbc_m512mouse_device::pb_r)
+uint8_t bbc_m512mouse_device::pb_r()
{
return (m_buttons->read() & 0x07) | (m_xdir << 3) | (m_ydir << 4) | 0xe0;
}
-READ8_MEMBER(bbc_tracker_device::pb_r)
+uint8_t bbc_tracker_device::pb_r()
{
return (m_buttons->read() & 0x07) | (m_xdir << 3) | (m_ydir << 4) | 0xe0;
}
diff --git a/src/devices/bus/bbc/userport/pointer.h b/src/devices/bus/bbc/userport/pointer.h
index 5551a2c82dd..a6e1bd0a629 100644
--- a/src/devices/bus/bbc/userport/pointer.h
+++ b/src/devices/bus/bbc/userport/pointer.h
@@ -58,7 +58,7 @@ public:
// construction/destruction
bbc_amxmouse_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- DECLARE_READ8_MEMBER(pb_r) override;
+ uint8_t pb_r() override;
// optional information overrides
virtual ioport_constructor device_input_ports() const override;
@@ -73,7 +73,7 @@ public:
// construction/destruction
bbc_m512mouse_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- DECLARE_READ8_MEMBER(pb_r) override;
+ uint8_t pb_r() override;
// optional information overrides
virtual ioport_constructor device_input_ports() const override;
@@ -88,7 +88,7 @@ public:
// construction/destruction
bbc_tracker_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- DECLARE_READ8_MEMBER(pb_r) override;
+ uint8_t pb_r() override;
// optional information overrides
virtual ioport_constructor device_input_ports() const override;
diff --git a/src/devices/bus/bbc/userport/userport.cpp b/src/devices/bus/bbc/userport/userport.cpp
index a4610217651..601a6845801 100644
--- a/src/devices/bus/bbc/userport/userport.cpp
+++ b/src/devices/bus/bbc/userport/userport.cpp
@@ -89,10 +89,10 @@ void bbc_userport_slot_device::device_reset()
// pb_r
//-------------------------------------------------
-READ8_MEMBER(bbc_userport_slot_device::pb_r)
+uint8_t bbc_userport_slot_device::pb_r()
{
if (m_device)
- return m_device->pb_r(space, 0);
+ return m_device->pb_r();
else
return 0xff;
}
@@ -102,10 +102,10 @@ READ8_MEMBER(bbc_userport_slot_device::pb_r)
// pb_w
//-------------------------------------------------
-WRITE8_MEMBER(bbc_userport_slot_device::pb_w)
+void bbc_userport_slot_device::pb_w(uint8_t data)
{
if (m_device)
- m_device->pb_w(space, 0, data);
+ m_device->pb_w(data);
}
diff --git a/src/devices/bus/bbc/userport/userport.h b/src/devices/bus/bbc/userport/userport.h
index e2807146efe..e3040283a5a 100644
--- a/src/devices/bus/bbc/userport/userport.h
+++ b/src/devices/bus/bbc/userport/userport.h
@@ -64,8 +64,8 @@ public:
DECLARE_WRITE_LINE_MEMBER(cb1_w) { m_cb1_handler(state); }
DECLARE_WRITE_LINE_MEMBER(cb2_w) { m_cb2_handler(state); }
- DECLARE_READ8_MEMBER(pb_r);
- DECLARE_WRITE8_MEMBER(pb_w);
+ uint8_t pb_r();
+ void pb_w(uint8_t data);
protected:
// device-level overrides
@@ -88,8 +88,8 @@ public:
// construction/destruction
virtual ~device_bbc_userport_interface();
- virtual DECLARE_READ8_MEMBER(pb_r) { return 0xff; }
- virtual DECLARE_WRITE8_MEMBER(pb_w) { }
+ virtual uint8_t pb_r() { return 0xff; }
+ virtual void pb_w(uint8_t data) { }
protected:
device_bbc_userport_interface(const machine_config &mconfig, device_t &device);
diff --git a/src/devices/bus/bml3/bml3bus.cpp b/src/devices/bus/bml3/bml3bus.cpp
index e1ff1ad39ab..9acb1b9acb5 100644
--- a/src/devices/bus/bml3/bml3bus.cpp
+++ b/src/devices/bus/bml3/bml3bus.cpp
@@ -102,13 +102,13 @@ bml3bus_device::bml3bus_device(const machine_config &mconfig, const char *tag, d
bml3bus_device::bml3bus_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock) :
device_t(mconfig, type, tag, owner, clock),
- m_maincpu(*this, finder_base::DUMMY_TAG),
+ m_space(*this, finder_base::DUMMY_TAG, -1, 8),
m_out_nmi_cb(*this),
m_out_irq_cb(*this),
- m_out_firq_cb(*this),
- m_cputag(nullptr)
+ m_out_firq_cb(*this)
{
}
+
//-------------------------------------------------
// device_start - device-specific startup
//-------------------------------------------------
diff --git a/src/devices/bus/bml3/bml3bus.h b/src/devices/bus/bml3/bml3bus.h
index 918e7b449b1..2132d376041 100644
--- a/src/devices/bus/bml3/bml3bus.h
+++ b/src/devices/bus/bml3/bml3bus.h
@@ -16,33 +16,6 @@
#define BML3BUS_MAX_SLOTS 6
-//**************************************************************************
-// INTERFACE CONFIGURATION MACROS
-//**************************************************************************
-
-#define MCFG_BML3BUS_CPU(_cputag) \
- downcast<bml3bus_device &>(*device).set_cputag(_cputag);
-
-#define MCFG_BML3BUS_OUT_NMI_CB(_devcb) \
- downcast<bml3bus_device &>(*device).set_out_nmi_callback(DEVCB_##_devcb);
-
-#define MCFG_BML3BUS_OUT_IRQ_CB(_devcb) \
- downcast<bml3bus_device &>(*device).set_out_irq_callback(DEVCB_##_devcb);
-
-#define MCFG_BML3BUS_OUT_FIRQ_CB(_devcb) \
- downcast<bml3bus_device &>(*device).set_out_firq_callback(DEVCB_##_devcb);
-
-#define MCFG_BML3BUS_SLOT_ADD(_nbtag, _tag, _slot_intf, _def_slot) \
- MCFG_DEVICE_ADD(_tag, BML3BUS_SLOT, 0) \
- MCFG_DEVICE_SLOT_INTERFACE(_slot_intf, _def_slot, false) \
- downcast<bml3bus_slot_device &>(*device).set_bml3bus_slot(_nbtag, _tag);
-#define MCFG_BML3BUS_SLOT_REMOVE(_tag) \
- MCFG_DEVICE_REMOVE(_tag)
-
-#define MCFG_BML3BUS_ONBOARD_ADD(_nbtag, _tag, _dev_type) \
- MCFG_DEVICE_ADD(_tag, _dev_type, 0) \
- downcast<device_bml3bus_card_interface &>(*device).set_bml3bus_tag(_nbtag, _tag);
-
//**************************************************************************
// TYPE DEFINITIONS
@@ -55,7 +28,18 @@ class bml3bus_slot_device : public device_t,
{
public:
// construction/destruction
- bml3bus_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+ template <typename T>
+ bml3bus_slot_device(machine_config const &mconfig, const char *tag, device_t *owner, const char *nbtag, T &&opts, const char *dflt)
+ : bml3bus_slot_device(mconfig, tag, owner, (uint32_t)0)
+ {
+ option_reset();
+ opts(*this);
+ set_default_option(dflt);
+ set_fixed(false);
+ set_bml3bus_slot(nbtag, tag);
+ }
+
+ bml3bus_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock = 0);
// device-level overrides
virtual void device_start() override;
@@ -83,10 +67,10 @@ public:
bml3bus_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
// inline configuration
- void set_cputag(const char *tag) { m_maincpu.set_tag(tag); }
- template <class Object> devcb_base &set_out_nmi_callback(Object &&cb) { return m_out_nmi_cb.set_callback(std::forward<Object>(cb)); }
- template <class Object> devcb_base &set_out_irq_callback(Object &&cb) { return m_out_irq_cb.set_callback(std::forward<Object>(cb)); }
- template <class Object> devcb_base &set_out_firq_callback(Object &&cb) { return m_out_firq_cb.set_callback(std::forward<Object>(cb)); }
+ template <class Object> void set_space(Object &&tag, int spacenum) { m_space.set_tag(std::forward<Object>(tag), spacenum); }
+ auto nmi_callback() { return m_out_nmi_cb.bind(); }
+ auto irq_callback() { return m_out_irq_cb.bind(); }
+ auto firq_callback() { return m_out_firq_cb.bind(); }
void add_bml3bus_card(int slot, device_bml3bus_card_interface *card);
device_bml3bus_card_interface *get_bml3bus_card(int slot);
@@ -99,7 +83,7 @@ public:
DECLARE_WRITE_LINE_MEMBER( irq_w );
DECLARE_WRITE_LINE_MEMBER( firq_w );
- address_space &space() const { return m_maincpu->space(AS_PROGRAM); }
+ address_space &space() const { return *m_space; }
protected:
bml3bus_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock);
@@ -109,14 +93,13 @@ protected:
virtual void device_reset() override;
// internal state
- required_device<cpu_device> m_maincpu;
+ required_address_space m_space;
devcb_write_line m_out_nmi_cb;
devcb_write_line m_out_irq_cb;
devcb_write_line m_out_firq_cb;
device_bml3bus_card_interface *m_device_list[BML3BUS_MAX_SLOTS];
- const char *m_cputag;
};
diff --git a/src/devices/bus/bw2/exp.cpp b/src/devices/bus/bw2/exp.cpp
index ae02f1f10fa..50f776b066e 100644
--- a/src/devices/bus/bw2/exp.cpp
+++ b/src/devices/bus/bw2/exp.cpp
@@ -95,11 +95,11 @@ void bw2_expansion_slot_device::device_reset()
// cd_r - cartridge data read
//-------------------------------------------------
-uint8_t bw2_expansion_slot_device::cd_r(address_space &space, offs_t offset, uint8_t data, int ram2, int ram3, int ram4, int ram5, int ram6)
+uint8_t bw2_expansion_slot_device::cd_r(offs_t offset, uint8_t data, int ram2, int ram3, int ram4, int ram5, int ram6)
{
if (m_cart != nullptr)
{
- data = m_cart->bw2_cd_r(space, offset, data, ram2, ram3, ram4, ram5, ram6);
+ data = m_cart->bw2_cd_r(offset, data, ram2, ram3, ram4, ram5, ram6);
}
return data;
@@ -110,11 +110,11 @@ uint8_t bw2_expansion_slot_device::cd_r(address_space &space, offs_t offset, uin
// cd_w - cartridge data write
//-------------------------------------------------
-void bw2_expansion_slot_device::cd_w(address_space &space, offs_t offset, uint8_t data, int ram2, int ram3, int ram4, int ram5, int ram6)
+void bw2_expansion_slot_device::cd_w(offs_t offset, uint8_t data, int ram2, int ram3, int ram4, int ram5, int ram6)
{
if (m_cart != nullptr)
{
- m_cart->bw2_cd_w(space, offset, data, ram2, ram3, ram4, ram5, ram6);
+ m_cart->bw2_cd_w(offset, data, ram2, ram3, ram4, ram5, ram6);
}
}
@@ -123,13 +123,13 @@ void bw2_expansion_slot_device::cd_w(address_space &space, offs_t offset, uint8_
// slot_r - slot read
//-------------------------------------------------
-READ8_MEMBER( bw2_expansion_slot_device::slot_r )
+uint8_t bw2_expansion_slot_device::slot_r(offs_t offset)
{
uint8_t data = 0xff;
if (m_cart != nullptr)
{
- data = m_cart->bw2_slot_r(space, offset);
+ data = m_cart->bw2_slot_r(offset);
}
return data;
@@ -140,11 +140,11 @@ READ8_MEMBER( bw2_expansion_slot_device::slot_r )
// slot_w - slot write
//-------------------------------------------------
-WRITE8_MEMBER( bw2_expansion_slot_device::slot_w )
+void bw2_expansion_slot_device::slot_w(offs_t offset, uint8_t data)
{
if (m_cart != nullptr)
{
- m_cart->bw2_slot_w(space, offset, data);
+ m_cart->bw2_slot_w(offset, data);
}
}
@@ -153,13 +153,13 @@ WRITE8_MEMBER( bw2_expansion_slot_device::slot_w )
// modsel_r - modsel read
//-------------------------------------------------
-READ8_MEMBER( bw2_expansion_slot_device::modsel_r )
+uint8_t bw2_expansion_slot_device::modsel_r(offs_t offset)
{
uint8_t data = 0xff;
if (m_cart != nullptr)
{
- data = m_cart->bw2_modsel_r(space, offset);
+ data = m_cart->bw2_modsel_r(offset);
}
return data;
@@ -170,11 +170,11 @@ READ8_MEMBER( bw2_expansion_slot_device::modsel_r )
// modsel_w - modsel write
//-------------------------------------------------
-WRITE8_MEMBER( bw2_expansion_slot_device::modsel_w )
+void bw2_expansion_slot_device::modsel_w(offs_t offset, uint8_t data)
{
if (m_cart != nullptr)
{
- m_cart->bw2_modsel_w(space, offset, data);
+ m_cart->bw2_modsel_w(offset, data);
}
}
diff --git a/src/devices/bus/bw2/exp.h b/src/devices/bus/bw2/exp.h
index 5bd353c5d35..d37e5c66879 100644
--- a/src/devices/bus/bw2/exp.h
+++ b/src/devices/bus/bw2/exp.h
@@ -49,17 +49,6 @@
#define BW2_EXPANSION_SLOT_TAG "exp"
-
-//**************************************************************************
-// INTERFACE CONFIGURATION MACROS
-//**************************************************************************
-
-#define MCFG_BW2_EXPANSION_SLOT_ADD(_tag, _clock, _slot_intf, _def_slot) \
- MCFG_DEVICE_ADD(_tag, BW2_EXPANSION_SLOT, _clock) \
- MCFG_DEVICE_SLOT_INTERFACE(_slot_intf, _def_slot, false)
-
-
-
//**************************************************************************
// TYPE DEFINITIONS
//**************************************************************************
@@ -73,18 +62,28 @@ class bw2_expansion_slot_device : public device_t,
{
public:
// construction/destruction
+ template <typename T>
+ bw2_expansion_slot_device(machine_config const &mconfig, char const *tag, device_t *owner, uint32_t clock, T &&opts, char const *dflt)
+ : bw2_expansion_slot_device(mconfig, tag, owner, clock)
+ {
+ option_reset();
+ opts(*this);
+ set_default_option(dflt);
+ set_fixed(false);
+ }
+
bw2_expansion_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
virtual ~bw2_expansion_slot_device();
// computer interface
- uint8_t cd_r(address_space &space, offs_t offset, uint8_t data, int ram2, int ram3, int ram4, int ram5, int ram6);
- void cd_w(address_space &space, offs_t offset, uint8_t data, int ram2, int ram3, int ram4, int ram5, int ram6);
+ uint8_t cd_r(offs_t offset, uint8_t data, int ram2, int ram3, int ram4, int ram5, int ram6);
+ void cd_w(offs_t offset, uint8_t data, int ram2, int ram3, int ram4, int ram5, int ram6);
- DECLARE_READ8_MEMBER( slot_r );
- DECLARE_WRITE8_MEMBER( slot_w );
+ uint8_t slot_r(offs_t offset);
+ void slot_w(offs_t offset, uint8_t data);
- DECLARE_READ8_MEMBER( modsel_r );
- DECLARE_WRITE8_MEMBER( modsel_w );
+ uint8_t modsel_r(offs_t offset);
+ void modsel_w(offs_t offset, uint8_t data);
protected:
// device-level overrides
@@ -104,14 +103,14 @@ public:
// construction/destruction
virtual ~device_bw2_expansion_slot_interface();
- virtual uint8_t bw2_cd_r(address_space &space, offs_t offset, uint8_t data, int ram2, int ram3, int ram4, int ram5, int ram6) { return data; };
- virtual void bw2_cd_w(address_space &space, offs_t offset, uint8_t data, int ram2, int ram3, int ram4, int ram5, int ram6) { };
+ virtual uint8_t bw2_cd_r(offs_t offset, uint8_t data, int ram2, int ram3, int ram4, int ram5, int ram6) { return data; }
+ virtual void bw2_cd_w(offs_t offset, uint8_t data, int ram2, int ram3, int ram4, int ram5, int ram6) { }
- virtual uint8_t bw2_slot_r(address_space &space, offs_t offset) { return 0xff; }
- virtual void bw2_slot_w(address_space &space, offs_t offset, uint8_t data) { }
+ virtual uint8_t bw2_slot_r(offs_t offset) { return 0xff; }
+ virtual void bw2_slot_w(offs_t offset, uint8_t data) { }
- virtual uint8_t bw2_modsel_r(address_space &space, offs_t offset) { return 0xff; }
- virtual void bw2_modsel_w(address_space &space, offs_t offset, uint8_t data) { }
+ virtual uint8_t bw2_modsel_r(offs_t offset) { return 0xff; }
+ virtual void bw2_modsel_w(offs_t offset, uint8_t data) { }
protected:
device_bw2_expansion_slot_interface(const machine_config &mconfig, device_t &device);
diff --git a/src/devices/bus/bw2/ramcard.cpp b/src/devices/bus/bw2/ramcard.cpp
index b59159cd5b1..48de6cffdec 100644
--- a/src/devices/bus/bw2/ramcard.cpp
+++ b/src/devices/bus/bw2/ramcard.cpp
@@ -88,7 +88,7 @@ void bw2_ramcard_device::device_reset()
// bw2_cd_r - cartridge data read
//-------------------------------------------------
-uint8_t bw2_ramcard_device::bw2_cd_r(address_space &space, offs_t offset, uint8_t data, int ram2, int ram3, int ram4, int ram5, int ram6)
+uint8_t bw2_ramcard_device::bw2_cd_r(offs_t offset, uint8_t data, int ram2, int ram3, int ram4, int ram5, int ram6)
{
if (!ram2)
{
@@ -107,7 +107,7 @@ uint8_t bw2_ramcard_device::bw2_cd_r(address_space &space, offs_t offset, uint8_
// bw2_cd_r - cartridge data write
//-------------------------------------------------
-void bw2_ramcard_device::bw2_cd_w(address_space &space, offs_t offset, uint8_t data, int ram2, int ram3, int ram4, int ram5, int ram6)
+void bw2_ramcard_device::bw2_cd_w(offs_t offset, uint8_t data, int ram2, int ram3, int ram4, int ram5, int ram6)
{
if (m_en && !ram5)
{
@@ -120,7 +120,7 @@ void bw2_ramcard_device::bw2_cd_w(address_space &space, offs_t offset, uint8_t d
// bw2_slot_w - slot write
//-------------------------------------------------
-void bw2_ramcard_device::bw2_slot_w(address_space &space, offs_t offset, uint8_t data)
+void bw2_ramcard_device::bw2_slot_w(offs_t offset, uint8_t data)
{
m_en = 1;
m_bank = data & 0x0f;
diff --git a/src/devices/bus/bw2/ramcard.h b/src/devices/bus/bw2/ramcard.h
index 9ac2b0433fa..029d9b91feb 100644
--- a/src/devices/bus/bw2/ramcard.h
+++ b/src/devices/bus/bw2/ramcard.h
@@ -37,9 +37,9 @@ protected:
virtual void device_reset() override;
// device_bw2_expansion_slot_interface overrides
- virtual uint8_t bw2_cd_r(address_space &space, offs_t offset, uint8_t data, int ram2, int ram3, int ram4, int ram5, int ram6) override;
- virtual void bw2_cd_w(address_space &space, offs_t offset, uint8_t data, int ram2, int ram3, int ram4, int ram5, int ram6) override;
- virtual void bw2_slot_w(address_space &space, offs_t offset, uint8_t data) override;
+ virtual uint8_t bw2_cd_r(offs_t offset, uint8_t data, int ram2, int ram3, int ram4, int ram5, int ram6) override;
+ virtual void bw2_cd_w(offs_t offset, uint8_t data, int ram2, int ram3, int ram4, int ram5, int ram6) override;
+ virtual void bw2_slot_w(offs_t offset, uint8_t data) override;
private:
required_memory_region m_rom;
diff --git a/src/devices/bus/c64/16kb.cpp b/src/devices/bus/c64/16kb.cpp
index 4b23cb663f7..4b497f88591 100644
--- a/src/devices/bus/c64/16kb.cpp
+++ b/src/devices/bus/c64/16kb.cpp
@@ -22,13 +22,12 @@ DEFINE_DEVICE_TYPE(C64_16KB, c64_16kb_cartridge_device, "c64_16kb", "C64 16KB EP
// device_add_mconfig - add device configuration
//-------------------------------------------------
-MACHINE_CONFIG_START(c64_16kb_cartridge_device::device_add_mconfig)
- MCFG_GENERIC_CARTSLOT_ADD("roml", generic_linear_slot, nullptr)
- MCFG_GENERIC_EXTENSIONS("rom,bin,80")
+void c64_16kb_cartridge_device::device_add_mconfig(machine_config &config)
+{
+ GENERIC_CARTSLOT(config, m_low, generic_linear_slot, nullptr, "rom,bin,80");
- MCFG_GENERIC_CARTSLOT_ADD("romh", generic_linear_slot, nullptr)
- MCFG_GENERIC_EXTENSIONS("rom,bin,a0,e0")
-MACHINE_CONFIG_END
+ GENERIC_CARTSLOT(config, m_high, generic_linear_slot, nullptr, "rom,bin,a0,e0");
+}
//-------------------------------------------------
@@ -99,15 +98,15 @@ void c64_16kb_cartridge_device::device_reset()
// c64_cd_r - cartridge data read
//-------------------------------------------------
-uint8_t c64_16kb_cartridge_device::c64_cd_r(address_space &space, offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2)
+uint8_t c64_16kb_cartridge_device::c64_cd_r(offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2)
{
if (!roml)
{
- data = m_low->read_rom(space, offset & 0x1fff);
+ data = m_low->read_rom(offset & 0x1fff);
}
else if (!romh)
{
- data = m_high->read_rom(space, offset & 0x1fff);
+ data = m_high->read_rom(offset & 0x1fff);
}
return data;
diff --git a/src/devices/bus/c64/16kb.h b/src/devices/bus/c64/16kb.h
index 97afa77f5af..db7f294fda0 100644
--- a/src/devices/bus/c64/16kb.h
+++ b/src/devices/bus/c64/16kb.h
@@ -41,7 +41,7 @@ protected:
virtual ioport_constructor device_input_ports() const override;
// device_c64_expansion_card_interface overrides
- virtual uint8_t c64_cd_r(address_space &space, offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2) override;
+ virtual uint8_t c64_cd_r(offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2) override;
private:
required_ioport m_sw1;
diff --git a/src/devices/bus/c64/c128_comal80.cpp b/src/devices/bus/c64/c128_comal80.cpp
index 234a3499a19..f1ce8c5c87a 100644
--- a/src/devices/bus/c64/c128_comal80.cpp
+++ b/src/devices/bus/c64/c128_comal80.cpp
@@ -60,7 +60,7 @@ void c128_comal80_cartridge_device::device_reset()
// c64_cd_r - cartridge data read
//-------------------------------------------------
-uint8_t c128_comal80_cartridge_device::c64_cd_r(address_space &space, offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2)
+uint8_t c128_comal80_cartridge_device::c64_cd_r(offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2)
{
if (!romh)
{
@@ -80,7 +80,7 @@ uint8_t c128_comal80_cartridge_device::c64_cd_r(address_space &space, offs_t off
// c64_cd_w - cartridge data write
//-------------------------------------------------
-void c128_comal80_cartridge_device::c64_cd_w(address_space &space, offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2)
+void c128_comal80_cartridge_device::c64_cd_w(offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2)
{
if (!io1)
{
diff --git a/src/devices/bus/c64/c128_comal80.h b/src/devices/bus/c64/c128_comal80.h
index c141cffb69e..fe413f9bef6 100644
--- a/src/devices/bus/c64/c128_comal80.h
+++ b/src/devices/bus/c64/c128_comal80.h
@@ -35,8 +35,8 @@ protected:
virtual void device_reset() override;
// device_c64_expansion_card_interface overrides
- virtual uint8_t c64_cd_r(address_space &space, offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2) override;
- virtual void c64_cd_w(address_space &space, offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2) override;
+ virtual uint8_t c64_cd_r(offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2) override;
+ virtual void c64_cd_w(offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2) override;
private:
uint8_t m_bank;
diff --git a/src/devices/bus/c64/c128_partner.cpp b/src/devices/bus/c64/c128_partner.cpp
index d5e74cc43cb..91b7cf751ab 100644
--- a/src/devices/bus/c64/c128_partner.cpp
+++ b/src/devices/bus/c64/c128_partner.cpp
@@ -147,7 +147,7 @@ void c128_partner_cartridge_device::device_timer(emu_timer &timer, device_timer_
// c64_cd_r - cartridge data read
//-------------------------------------------------
-uint8_t c128_partner_cartridge_device::c64_cd_r(address_space &space, offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2)
+uint8_t c128_partner_cartridge_device::c64_cd_r(offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2)
{
if (!roml)
{
@@ -185,7 +185,7 @@ uint8_t c128_partner_cartridge_device::c64_cd_r(address_space &space, offs_t off
// c64_cd_w - cartridge data write
//-------------------------------------------------
-void c128_partner_cartridge_device::c64_cd_w(address_space &space, offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2)
+void c128_partner_cartridge_device::c64_cd_w(offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2)
{
if (!io1)
{
diff --git a/src/devices/bus/c64/c128_partner.h b/src/devices/bus/c64/c128_partner.h
index 632e526b035..1f4402d5b22 100644
--- a/src/devices/bus/c64/c128_partner.h
+++ b/src/devices/bus/c64/c128_partner.h
@@ -42,8 +42,8 @@ protected:
virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override;
// device_c64_expansion_card_interface overrides
- virtual uint8_t c64_cd_r(address_space &space, offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2) override;
- virtual void c64_cd_w(address_space &space, offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2) override;
+ virtual uint8_t c64_cd_r(offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2) override;
+ virtual void c64_cd_w(offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2) override;
// device_vcs_control_port_interface overrides
virtual void vcs_joy_w(uint8_t data);
diff --git a/src/devices/bus/c64/comal80.cpp b/src/devices/bus/c64/comal80.cpp
index 24c966eccc1..0ce6dcbfb5a 100644
--- a/src/devices/bus/c64/comal80.cpp
+++ b/src/devices/bus/c64/comal80.cpp
@@ -60,7 +60,7 @@ void c64_comal80_cartridge_device::device_reset()
// c64_cd_r - cartridge data read
//-------------------------------------------------
-uint8_t c64_comal80_cartridge_device::c64_cd_r(address_space &space, offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2)
+uint8_t c64_comal80_cartridge_device::c64_cd_r(offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2)
{
if (!roml || !romh)
{
@@ -76,7 +76,7 @@ uint8_t c64_comal80_cartridge_device::c64_cd_r(address_space &space, offs_t offs
// c64_cd_w - cartridge data write
//-------------------------------------------------
-void c64_comal80_cartridge_device::c64_cd_w(address_space &space, offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2)
+void c64_comal80_cartridge_device::c64_cd_w(offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2)
{
if (!io1)
{
diff --git a/src/devices/bus/c64/comal80.h b/src/devices/bus/c64/comal80.h
index fb0ceaad303..af0958a8940 100644
--- a/src/devices/bus/c64/comal80.h
+++ b/src/devices/bus/c64/comal80.h
@@ -35,8 +35,8 @@ protected:
virtual void device_reset() override;
// device_c64_expansion_card_interface overrides
- virtual uint8_t c64_cd_r(address_space &space, offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2) override;
- virtual void c64_cd_w(address_space &space, offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2) override;
+ virtual uint8_t c64_cd_r(offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2) override;
+ virtual void c64_cd_w(offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2) override;
private:
uint8_t m_bank;
diff --git a/src/devices/bus/c64/cpm.cpp b/src/devices/bus/c64/cpm.cpp
index 81b6dd4eea2..7a909f6e920 100644
--- a/src/devices/bus/c64/cpm.cpp
+++ b/src/devices/bus/c64/cpm.cpp
@@ -161,7 +161,7 @@ void c64_cpm_cartridge_device::device_reset()
// c64_cd_w - cartridge data write
//-------------------------------------------------
-void c64_cpm_cartridge_device::c64_cd_w(address_space &space, offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2)
+void c64_cpm_cartridge_device::c64_cd_w(offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2)
{
if (!io1)
{
@@ -201,7 +201,7 @@ READ8_MEMBER( c64_cpm_cartridge_device::dma_r )
{
offs_t addr = (offset + 0x1000) & 0xffff;
- data = m_slot->dma_cd_r(space, addr);
+ data = m_slot->dma_cd_r(addr);
}
return data;
@@ -218,6 +218,6 @@ WRITE8_MEMBER( c64_cpm_cartridge_device::dma_w )
{
offs_t addr = (offset + 0x1000) & 0xffff;
- m_slot->dma_cd_w(space, addr, data);
+ m_slot->dma_cd_w(addr, data);
}
}
diff --git a/src/devices/bus/c64/cpm.h b/src/devices/bus/c64/cpm.h
index f0da4d6c0f7..63d3a7123cd 100644
--- a/src/devices/bus/c64/cpm.h
+++ b/src/devices/bus/c64/cpm.h
@@ -38,7 +38,7 @@ protected:
virtual void device_add_mconfig(machine_config &config) override;
// device_c64_expansion_card_interface overrides
- virtual void c64_cd_w(address_space &space, offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2) override;
+ virtual void c64_cd_w(offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2) override;
virtual int c64_game_r(offs_t offset, int sphi2, int ba, int rw) override;
private:
diff --git a/src/devices/bus/c64/currah_speech.cpp b/src/devices/bus/c64/currah_speech.cpp
index 84d64f2ea2a..2ce77f2ea04 100644
--- a/src/devices/bus/c64/currah_speech.cpp
+++ b/src/devices/bus/c64/currah_speech.cpp
@@ -170,7 +170,7 @@ void c64_currah_speech_cartridge_device::device_reset()
// c64_cd_r - cartridge data read
//-------------------------------------------------
-uint8_t c64_currah_speech_cartridge_device::c64_cd_r(address_space &space, offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2)
+uint8_t c64_currah_speech_cartridge_device::c64_cd_r(offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2)
{
if (!romh)
{
@@ -210,7 +210,7 @@ uint8_t c64_currah_speech_cartridge_device::c64_cd_r(address_space &space, offs_
// c64_cd_w - cartridge data write
//-------------------------------------------------
-void c64_currah_speech_cartridge_device::c64_cd_w(address_space &space, offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2)
+void c64_currah_speech_cartridge_device::c64_cd_w(offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2)
{
if (!io1)
{
diff --git a/src/devices/bus/c64/currah_speech.h b/src/devices/bus/c64/currah_speech.h
index 44d5adb083a..f856833f659 100644
--- a/src/devices/bus/c64/currah_speech.h
+++ b/src/devices/bus/c64/currah_speech.h
@@ -40,8 +40,8 @@ protected:
virtual void device_add_mconfig(machine_config &config) override;
// device_c64_expansion_card_interface overrides
- virtual uint8_t c64_cd_r(address_space &space, offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2) override;
- virtual void c64_cd_w(address_space &space, offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2) override;
+ virtual uint8_t c64_cd_r(offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2) override;
+ virtual void c64_cd_w(offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2) override;
private:
inline void set_osc1(int voice, int intonation);
diff --git a/src/devices/bus/c64/dela_ep256.cpp b/src/devices/bus/c64/dela_ep256.cpp
index e11b3ae8f53..107f2828d21 100644
--- a/src/devices/bus/c64/dela_ep256.cpp
+++ b/src/devices/bus/c64/dela_ep256.cpp
@@ -22,24 +22,17 @@ DEFINE_DEVICE_TYPE(C64_DELA_EP256, c64_dela_ep256_cartridge_device, "delep256",
// device_add_mconfig - add device configuration
//-------------------------------------------------
-MACHINE_CONFIG_START(c64_dela_ep256_cartridge_device::device_add_mconfig)
- MCFG_GENERIC_SOCKET_ADD("rom1", generic_linear_slot, nullptr)
- MCFG_GENERIC_EXTENSIONS("bin,rom")
- MCFG_GENERIC_SOCKET_ADD("rom2", generic_linear_slot, nullptr)
- MCFG_GENERIC_EXTENSIONS("bin,rom")
- MCFG_GENERIC_SOCKET_ADD("rom3", generic_linear_slot, nullptr)
- MCFG_GENERIC_EXTENSIONS("bin,rom")
- MCFG_GENERIC_SOCKET_ADD("rom4", generic_linear_slot, nullptr)
- MCFG_GENERIC_EXTENSIONS("bin,rom")
- MCFG_GENERIC_SOCKET_ADD("rom5", generic_linear_slot, nullptr)
- MCFG_GENERIC_EXTENSIONS("bin,rom")
- MCFG_GENERIC_SOCKET_ADD("rom6", generic_linear_slot, nullptr)
- MCFG_GENERIC_EXTENSIONS("bin,rom")
- MCFG_GENERIC_SOCKET_ADD("rom7", generic_linear_slot, nullptr)
- MCFG_GENERIC_EXTENSIONS("bin,rom")
- MCFG_GENERIC_SOCKET_ADD("rom8", generic_linear_slot, nullptr)
- MCFG_GENERIC_EXTENSIONS("bin,rom")
-MACHINE_CONFIG_END
+void c64_dela_ep256_cartridge_device::device_add_mconfig(machine_config &config)
+{
+ GENERIC_SOCKET(config, "rom1", generic_linear_slot, nullptr, "bin,rom");
+ GENERIC_SOCKET(config, "rom2", generic_linear_slot, nullptr, "bin,rom");
+ GENERIC_SOCKET(config, "rom3", generic_linear_slot, nullptr, "bin,rom");
+ GENERIC_SOCKET(config, "rom4", generic_linear_slot, nullptr, "bin,rom");
+ GENERIC_SOCKET(config, "rom5", generic_linear_slot, nullptr, "bin,rom");
+ GENERIC_SOCKET(config, "rom6", generic_linear_slot, nullptr, "bin,rom");
+ GENERIC_SOCKET(config, "rom7", generic_linear_slot, nullptr, "bin,rom");
+ GENERIC_SOCKET(config, "rom8", generic_linear_slot, nullptr, "bin,rom");
+}
@@ -94,7 +87,7 @@ void c64_dela_ep256_cartridge_device::device_reset()
// c64_cd_r - cartridge data read
//-------------------------------------------------
-uint8_t c64_dela_ep256_cartridge_device::c64_cd_r(address_space &space, offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2)
+uint8_t c64_dela_ep256_cartridge_device::c64_cd_r(offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2)
{
if (!roml)
{
@@ -105,7 +98,7 @@ uint8_t c64_dela_ep256_cartridge_device::c64_cd_r(address_space &space, offs_t o
else
{
offs_t addr = (m_bank << 13) | (offset & 0x1fff);
- data = m_eproms[m_socket]->read_rom(space, addr);
+ data = m_eproms[m_socket]->read_rom(addr);
}
}
@@ -117,7 +110,7 @@ uint8_t c64_dela_ep256_cartridge_device::c64_cd_r(address_space &space, offs_t o
// c64_cd_w - cartridge data write
//-------------------------------------------------
-void c64_dela_ep256_cartridge_device::c64_cd_w(address_space &space, offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2)
+void c64_dela_ep256_cartridge_device::c64_cd_w(offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2)
{
if (!io2 && ((offset & 0xf0) == 0xa0))
{
diff --git a/src/devices/bus/c64/dela_ep256.h b/src/devices/bus/c64/dela_ep256.h
index bcc1992b969..61501df0790 100644
--- a/src/devices/bus/c64/dela_ep256.h
+++ b/src/devices/bus/c64/dela_ep256.h
@@ -40,8 +40,8 @@ protected:
virtual void device_add_mconfig(machine_config &config) override;
// device_c64_expansion_card_interface overrides
- virtual uint8_t c64_cd_r(address_space &space, offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2) override;
- virtual void c64_cd_w(address_space &space, offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2) override;
+ virtual uint8_t c64_cd_r(offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2) override;
+ virtual void c64_cd_w(offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2) override;
private:
generic_slot_device *m_eproms[8];
diff --git a/src/devices/bus/c64/dela_ep64.cpp b/src/devices/bus/c64/dela_ep64.cpp
index c9eee384a5a..5798794f7eb 100644
--- a/src/devices/bus/c64/dela_ep64.cpp
+++ b/src/devices/bus/c64/dela_ep64.cpp
@@ -22,12 +22,11 @@ DEFINE_DEVICE_TYPE(C64_DELA_EP64, c64_dela_ep64_cartridge_device, "c64_dela_ep64
// device_add_mconfig - add device configuration
//-------------------------------------------------
-MACHINE_CONFIG_START(c64_dela_ep64_cartridge_device::device_add_mconfig)
- MCFG_GENERIC_SOCKET_ADD("eprom1", generic_linear_slot, nullptr)
- MCFG_GENERIC_EXTENSIONS("rom,bin")
- MCFG_GENERIC_SOCKET_ADD("eprom2", generic_linear_slot, nullptr)
- MCFG_GENERIC_EXTENSIONS("rom,bin")
-MACHINE_CONFIG_END
+void c64_dela_ep64_cartridge_device::device_add_mconfig(machine_config &config)
+{
+ GENERIC_SOCKET(config, m_eprom1, generic_linear_slot, nullptr, "rom,bin");
+ GENERIC_SOCKET(config, m_eprom2, generic_linear_slot, nullptr, "rom,bin");
+}
//**************************************************************************
@@ -78,7 +77,7 @@ void c64_dela_ep64_cartridge_device::device_reset()
// c64_cd_r - cartridge data read
//-------------------------------------------------
-uint8_t c64_dela_ep64_cartridge_device::c64_cd_r(address_space &space, offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2)
+uint8_t c64_dela_ep64_cartridge_device::c64_cd_r(offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2)
{
if (!roml)
{
@@ -91,8 +90,8 @@ uint8_t c64_dela_ep64_cartridge_device::c64_cd_r(address_space &space, offs_t of
offs_t addr = (m_bank << 13) | (offset & 0x1fff);
if (!m_rom0_ce) data |= m_roml[offset & 0x1fff];
- if (!m_rom1_ce) data |= m_eprom1->read_rom(space, addr);
- if (!m_rom2_ce) data |= m_eprom2->read_rom(space, addr);
+ if (!m_rom1_ce) data |= m_eprom1->read_rom(addr);
+ if (!m_rom2_ce) data |= m_eprom2->read_rom(addr);
}
}
@@ -104,7 +103,7 @@ uint8_t c64_dela_ep64_cartridge_device::c64_cd_r(address_space &space, offs_t of
// c64_cd_w - cartridge data write
//-------------------------------------------------
-void c64_dela_ep64_cartridge_device::c64_cd_w(address_space &space, offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2)
+void c64_dela_ep64_cartridge_device::c64_cd_w(offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2)
{
if (!io1)
{
diff --git a/src/devices/bus/c64/dela_ep64.h b/src/devices/bus/c64/dela_ep64.h
index a3e2d77bd48..95ac3440871 100644
--- a/src/devices/bus/c64/dela_ep64.h
+++ b/src/devices/bus/c64/dela_ep64.h
@@ -40,8 +40,8 @@ protected:
virtual void device_add_mconfig(machine_config &config) override;
// device_c64_expansion_card_interface overrides
- virtual uint8_t c64_cd_r(address_space &space, offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2) override;
- virtual void c64_cd_w(address_space &space, offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2) override;
+ virtual uint8_t c64_cd_r(offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2) override;
+ virtual void c64_cd_w(offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2) override;
private:
required_device<generic_slot_device> m_eprom1;
diff --git a/src/devices/bus/c64/dela_ep7x8.cpp b/src/devices/bus/c64/dela_ep7x8.cpp
index 564e7196449..0c71555b880 100644
--- a/src/devices/bus/c64/dela_ep7x8.cpp
+++ b/src/devices/bus/c64/dela_ep7x8.cpp
@@ -22,22 +22,16 @@ DEFINE_DEVICE_TYPE(C64_DELA_EP7X8, c64_dela_ep7x8_cartridge_device, "c64_dela_ep
// device_add_mconfig - add device configuration
//-------------------------------------------------
-MACHINE_CONFIG_START(c64_dela_ep7x8_cartridge_device::device_add_mconfig)
- MCFG_GENERIC_SOCKET_ADD("rom1", generic_linear_slot, nullptr)
- MCFG_GENERIC_EXTENSIONS("bin,rom")
- MCFG_GENERIC_SOCKET_ADD("rom2", generic_linear_slot, nullptr)
- MCFG_GENERIC_EXTENSIONS("bin,rom")
- MCFG_GENERIC_SOCKET_ADD("rom3", generic_linear_slot, nullptr)
- MCFG_GENERIC_EXTENSIONS("bin,rom")
- MCFG_GENERIC_SOCKET_ADD("rom4", generic_linear_slot, nullptr)
- MCFG_GENERIC_EXTENSIONS("bin,rom")
- MCFG_GENERIC_SOCKET_ADD("rom5", generic_linear_slot, nullptr)
- MCFG_GENERIC_EXTENSIONS("bin,rom")
- MCFG_GENERIC_SOCKET_ADD("rom6", generic_linear_slot, nullptr)
- MCFG_GENERIC_EXTENSIONS("bin,rom")
- MCFG_GENERIC_SOCKET_ADD("rom7", generic_linear_slot, nullptr)
- MCFG_GENERIC_EXTENSIONS("bin,rom")
-MACHINE_CONFIG_END
+void c64_dela_ep7x8_cartridge_device::device_add_mconfig(machine_config &config)
+{
+ GENERIC_SOCKET(config, m_eprom[0], generic_linear_slot, nullptr, "bin,rom");
+ GENERIC_SOCKET(config, m_eprom[1], generic_linear_slot, nullptr, "bin,rom");
+ GENERIC_SOCKET(config, m_eprom[2], generic_linear_slot, nullptr, "bin,rom");
+ GENERIC_SOCKET(config, m_eprom[3], generic_linear_slot, nullptr, "bin,rom");
+ GENERIC_SOCKET(config, m_eprom[4], generic_linear_slot, nullptr, "bin,rom");
+ GENERIC_SOCKET(config, m_eprom[5], generic_linear_slot, nullptr, "bin,rom");
+ GENERIC_SOCKET(config, m_eprom[6], generic_linear_slot, nullptr, "bin,rom");
+}
//**************************************************************************
@@ -51,13 +45,7 @@ MACHINE_CONFIG_END
c64_dela_ep7x8_cartridge_device::c64_dela_ep7x8_cartridge_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) :
device_t(mconfig, C64_DELA_EP7X8, tag, owner, clock),
device_c64_expansion_card_interface(mconfig, *this),
- m_eprom1(*this, "rom1"),
- m_eprom2(*this, "rom2"),
- m_eprom3(*this, "rom3"),
- m_eprom4(*this, "rom4"),
- m_eprom5(*this, "rom5"),
- m_eprom6(*this, "rom6"),
- m_eprom7(*this, "rom7"), m_bank(0)
+ m_eprom(*this, "rom%u", 1U)
{
}
@@ -88,20 +76,20 @@ void c64_dela_ep7x8_cartridge_device::device_reset()
// c64_cd_r - cartridge data read
//-------------------------------------------------
-uint8_t c64_dela_ep7x8_cartridge_device::c64_cd_r(address_space &space, offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2)
+uint8_t c64_dela_ep7x8_cartridge_device::c64_cd_r(offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2)
{
if (!roml)
{
offs_t addr = offset & 0x1fff;
if (!BIT(m_bank, 0)) data |= m_roml[addr];
- if (!BIT(m_bank, 1)) data |= m_eprom1->read_rom(space, addr);
- if (!BIT(m_bank, 2)) data |= m_eprom2->read_rom(space, addr);
- if (!BIT(m_bank, 3)) data |= m_eprom3->read_rom(space, addr);
- if (!BIT(m_bank, 4)) data |= m_eprom4->read_rom(space, addr);
- if (!BIT(m_bank, 5)) data |= m_eprom5->read_rom(space, addr);
- if (!BIT(m_bank, 6)) data |= m_eprom6->read_rom(space, addr);
- if (!BIT(m_bank, 7)) data |= m_eprom7->read_rom(space, addr);
+ if (!BIT(m_bank, 1)) data |= m_eprom[0]->read_rom(addr);
+ if (!BIT(m_bank, 2)) data |= m_eprom[1]->read_rom(addr);
+ if (!BIT(m_bank, 3)) data |= m_eprom[2]->read_rom(addr);
+ if (!BIT(m_bank, 4)) data |= m_eprom[3]->read_rom(addr);
+ if (!BIT(m_bank, 5)) data |= m_eprom[4]->read_rom(addr);
+ if (!BIT(m_bank, 6)) data |= m_eprom[5]->read_rom(addr);
+ if (!BIT(m_bank, 7)) data |= m_eprom[6]->read_rom(addr);
}
return data;
@@ -112,7 +100,7 @@ uint8_t c64_dela_ep7x8_cartridge_device::c64_cd_r(address_space &space, offs_t o
// c64_cd_w - cartridge data write
//-------------------------------------------------
-void c64_dela_ep7x8_cartridge_device::c64_cd_w(address_space &space, offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2)
+void c64_dela_ep7x8_cartridge_device::c64_cd_w(offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2)
{
if (!io1)
{
diff --git a/src/devices/bus/c64/dela_ep7x8.h b/src/devices/bus/c64/dela_ep7x8.h
index 48146d1c5e1..50e1b3af01e 100644
--- a/src/devices/bus/c64/dela_ep7x8.h
+++ b/src/devices/bus/c64/dela_ep7x8.h
@@ -40,17 +40,11 @@ protected:
virtual void device_add_mconfig(machine_config &config) override;
// device_c64_expansion_card_interface overrides
- virtual uint8_t c64_cd_r(address_space &space, offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2) override;
- virtual void c64_cd_w(address_space &space, offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2) override;
+ virtual uint8_t c64_cd_r(offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2) override;
+ virtual void c64_cd_w(offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2) override;
private:
- required_device<generic_slot_device> m_eprom1;
- required_device<generic_slot_device> m_eprom2;
- required_device<generic_slot_device> m_eprom3;
- required_device<generic_slot_device> m_eprom4;
- required_device<generic_slot_device> m_eprom5;
- required_device<generic_slot_device> m_eprom6;
- required_device<generic_slot_device> m_eprom7;
+ required_device_array<generic_slot_device, 7> m_eprom;
uint8_t m_bank;
};
diff --git a/src/devices/bus/c64/dinamic.cpp b/src/devices/bus/c64/dinamic.cpp
index 8ab60892263..13d37749335 100644
--- a/src/devices/bus/c64/dinamic.cpp
+++ b/src/devices/bus/c64/dinamic.cpp
@@ -60,7 +60,7 @@ void c64_dinamic_cartridge_device::device_reset()
// c64_cd_r - cartridge data read
//-------------------------------------------------
-uint8_t c64_dinamic_cartridge_device::c64_cd_r(address_space &space, offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2)
+uint8_t c64_dinamic_cartridge_device::c64_cd_r(offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2)
{
if (!roml)
{
diff --git a/src/devices/bus/c64/dinamic.h b/src/devices/bus/c64/dinamic.h
index 84bd1503503..e204964e4a1 100644
--- a/src/devices/bus/c64/dinamic.h
+++ b/src/devices/bus/c64/dinamic.h
@@ -35,7 +35,7 @@ protected:
virtual void device_reset() override;
// device_c64_expansion_card_interface overrides
- virtual uint8_t c64_cd_r(address_space &space, offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2) override;
+ virtual uint8_t c64_cd_r(offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2) override;
private:
uint8_t m_bank;
diff --git a/src/devices/bus/c64/dqbb.cpp b/src/devices/bus/c64/dqbb.cpp
index b9cb32ce1cc..20adedd9057 100644
--- a/src/devices/bus/c64/dqbb.cpp
+++ b/src/devices/bus/c64/dqbb.cpp
@@ -78,7 +78,7 @@ void c64_dqbb_cartridge_device::device_reset()
// c64_cd_r - cartridge data read
//-------------------------------------------------
-uint8_t c64_dqbb_cartridge_device::c64_cd_r(address_space &space, offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2)
+uint8_t c64_dqbb_cartridge_device::c64_cd_r(offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2)
{
if (!m_cs && (!roml || !romh))
{
@@ -93,7 +93,7 @@ uint8_t c64_dqbb_cartridge_device::c64_cd_r(address_space &space, offs_t offset,
// c64_cd_w - cartridge data write
//-------------------------------------------------
-void c64_dqbb_cartridge_device::c64_cd_w(address_space &space, offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2)
+void c64_dqbb_cartridge_device::c64_cd_w(offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2)
{
if (!m_cs && m_we && (offset >= 0x8000 && offset < 0xc000))
{
diff --git a/src/devices/bus/c64/dqbb.h b/src/devices/bus/c64/dqbb.h
index 6c472eb6696..aaa8c0e1bf4 100644
--- a/src/devices/bus/c64/dqbb.h
+++ b/src/devices/bus/c64/dqbb.h
@@ -42,8 +42,8 @@ protected:
virtual void nvram_write(emu_file &file) override { if (m_nvram != nullptr) { file.write(m_nvram, m_nvram.bytes()); } }
// device_c64_expansion_card_interface overrides
- virtual uint8_t c64_cd_r(address_space &space, offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2) override;
- virtual void c64_cd_w(address_space &space, offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2) override;
+ virtual uint8_t c64_cd_r(offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2) override;
+ virtual void c64_cd_w(offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2) override;
private:
int m_cs;
diff --git a/src/devices/bus/c64/easy_calc_result.cpp b/src/devices/bus/c64/easy_calc_result.cpp
index 4ddd4cbdac0..123870d5d3e 100644
--- a/src/devices/bus/c64/easy_calc_result.cpp
+++ b/src/devices/bus/c64/easy_calc_result.cpp
@@ -80,7 +80,7 @@ void c64_easy_calc_result_cartridge_device::device_reset()
// c64_cd_r - cartridge data read
//-------------------------------------------------
-uint8_t c64_easy_calc_result_cartridge_device::c64_cd_r(address_space &space, offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2)
+uint8_t c64_easy_calc_result_cartridge_device::c64_cd_r(offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2)
{
if (!roml)
{
@@ -99,7 +99,7 @@ uint8_t c64_easy_calc_result_cartridge_device::c64_cd_r(address_space &space, of
// c64_cd_w - cartridge data write
//-------------------------------------------------
-void c64_easy_calc_result_cartridge_device::c64_cd_w(address_space &space, offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2)
+void c64_easy_calc_result_cartridge_device::c64_cd_w(offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2)
{
if (!io1)
{
diff --git a/src/devices/bus/c64/easy_calc_result.h b/src/devices/bus/c64/easy_calc_result.h
index 377bbd12b17..2d945b7dea2 100644
--- a/src/devices/bus/c64/easy_calc_result.h
+++ b/src/devices/bus/c64/easy_calc_result.h
@@ -35,8 +35,8 @@ protected:
virtual void device_reset() override;
// device_c64_expansion_card_interface overrides
- virtual uint8_t c64_cd_r(address_space &space, offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2) override;
- virtual void c64_cd_w(address_space &space, offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2) override;
+ virtual uint8_t c64_cd_r(offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2) override;
+ virtual void c64_cd_w(offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2) override;
private:
int m_bank;
diff --git a/src/devices/bus/c64/easyflash.cpp b/src/devices/bus/c64/easyflash.cpp
index abdd891572f..38cdf9739c6 100644
--- a/src/devices/bus/c64/easyflash.cpp
+++ b/src/devices/bus/c64/easyflash.cpp
@@ -114,17 +114,17 @@ void c64_easyflash_cartridge_device::device_reset()
// c64_cd_r - cartridge data read
//-------------------------------------------------
-uint8_t c64_easyflash_cartridge_device::c64_cd_r(address_space &space, offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2)
+uint8_t c64_easyflash_cartridge_device::c64_cd_r(offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2)
{
if (!roml)
{
offs_t addr = (m_bank << 13) | (offset & 0x1fff);
- data = m_flash_roml->read(space, addr);
+ data = m_flash_roml->read(addr);
}
else if (!romh)
{
offs_t addr = (m_bank << 13) | (offset & 0x1fff);
- data = m_flash_romh->read(space, addr);
+ data = m_flash_romh->read(addr);
}
else if (!io2)
{
@@ -139,17 +139,17 @@ uint8_t c64_easyflash_cartridge_device::c64_cd_r(address_space &space, offs_t of
// c64_cd_w - cartridge data write
//-------------------------------------------------
-void c64_easyflash_cartridge_device::c64_cd_w(address_space &space, offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2)
+void c64_easyflash_cartridge_device::c64_cd_w(offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2)
{
if (!roml)
{
offs_t addr = (m_bank << 13) | (offset & 0x1fff);
- m_flash_roml->write(space, addr, data);
+ m_flash_roml->write(addr, data);
}
else if (!romh)
{
offs_t addr = (m_bank << 13) | (offset & 0x1fff);
- m_flash_romh->write(space, addr, data);
+ m_flash_romh->write(addr, data);
}
else if (!io1)
{
diff --git a/src/devices/bus/c64/easyflash.h b/src/devices/bus/c64/easyflash.h
index ef11fa5162d..377de25d50d 100644
--- a/src/devices/bus/c64/easyflash.h
+++ b/src/devices/bus/c64/easyflash.h
@@ -40,8 +40,8 @@ protected:
virtual ioport_constructor device_input_ports() const override;
// device_c64_expansion_card_interface overrides
- virtual uint8_t c64_cd_r(address_space &space, offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2) override;
- virtual void c64_cd_w(address_space &space, offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2) override;
+ virtual uint8_t c64_cd_r(offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2) override;
+ virtual void c64_cd_w(offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2) override;
virtual int c64_exrom_r(offs_t offset, int sphi2, int ba, int rw) override;
virtual int c64_game_r(offs_t offset, int sphi2, int ba, int rw) override;
diff --git a/src/devices/bus/c64/epyx_fast_load.cpp b/src/devices/bus/c64/epyx_fast_load.cpp
index d119091555b..4dced91c76a 100644
--- a/src/devices/bus/c64/epyx_fast_load.cpp
+++ b/src/devices/bus/c64/epyx_fast_load.cpp
@@ -80,7 +80,7 @@ void c64_epyx_fast_load_cartridge_device::device_timer(emu_timer &timer, device_
// c64_cd_r - cartridge data read
//-------------------------------------------------
-uint8_t c64_epyx_fast_load_cartridge_device::c64_cd_r(address_space &space, offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2)
+uint8_t c64_epyx_fast_load_cartridge_device::c64_cd_r(offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2)
{
if (!roml)
{
@@ -107,7 +107,7 @@ uint8_t c64_epyx_fast_load_cartridge_device::c64_cd_r(address_space &space, offs
// c64_cd_w - cartridge data write
//-------------------------------------------------
-void c64_epyx_fast_load_cartridge_device::c64_cd_w(address_space &space, offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2)
+void c64_epyx_fast_load_cartridge_device::c64_cd_w(offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2)
{
if (!io1)
{
diff --git a/src/devices/bus/c64/epyx_fast_load.h b/src/devices/bus/c64/epyx_fast_load.h
index 42f04254703..64d23f6febb 100644
--- a/src/devices/bus/c64/epyx_fast_load.h
+++ b/src/devices/bus/c64/epyx_fast_load.h
@@ -36,8 +36,8 @@ protected:
virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override;
// device_c64_expansion_card_interface overrides
- virtual uint8_t c64_cd_r(address_space &space, offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2) override;
- virtual void c64_cd_w(address_space &space, offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2) override;
+ virtual uint8_t c64_cd_r(offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2) override;
+ virtual void c64_cd_w(offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2) override;
private:
emu_timer *m_exrom_timer;
diff --git a/src/devices/bus/c64/exos.cpp b/src/devices/bus/c64/exos.cpp
index 5c41cd7d6d3..13c5d972642 100644
--- a/src/devices/bus/c64/exos.cpp
+++ b/src/devices/bus/c64/exos.cpp
@@ -47,7 +47,7 @@ void c64_exos_cartridge_device::device_start()
// c64_cd_r - cartridge data read
//-------------------------------------------------
-uint8_t c64_exos_cartridge_device::c64_cd_r(address_space &space, offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2)
+uint8_t c64_exos_cartridge_device::c64_cd_r(offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2)
{
if (!romh)
{
diff --git a/src/devices/bus/c64/exos.h b/src/devices/bus/c64/exos.h
index 93872e38e7a..73b9b2699aa 100644
--- a/src/devices/bus/c64/exos.h
+++ b/src/devices/bus/c64/exos.h
@@ -34,7 +34,7 @@ protected:
virtual void device_start() override;
// device_c64_expansion_card_interface overrides
- virtual uint8_t c64_cd_r(address_space &space, offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2) override;
+ virtual uint8_t c64_cd_r(offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2) override;
virtual int c64_game_r(offs_t offset, int sphi2, int ba, int rw) override;
};
diff --git a/src/devices/bus/c64/exp.cpp b/src/devices/bus/c64/exp.cpp
index 1dc007f95a0..2d4743fe7c4 100644
--- a/src/devices/bus/c64/exp.cpp
+++ b/src/devices/bus/c64/exp.cpp
@@ -225,11 +225,11 @@ std::string c64_expansion_slot_device::get_default_card_software(get_default_car
// cd_r - cartridge data read
//-------------------------------------------------
-uint8_t c64_expansion_slot_device::cd_r(address_space &space, offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2)
+uint8_t c64_expansion_slot_device::cd_r(offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2)
{
if (m_card != nullptr)
{
- data = m_card->c64_cd_r(space, offset, data, sphi2, ba, roml, romh, io1, io2);
+ data = m_card->c64_cd_r(offset, data, sphi2, ba, roml, romh, io1, io2);
}
return data;
@@ -240,11 +240,11 @@ uint8_t c64_expansion_slot_device::cd_r(address_space &space, offs_t offset, uin
// cd_w - cartridge data write
//-------------------------------------------------
-void c64_expansion_slot_device::cd_w(address_space &space, offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2)
+void c64_expansion_slot_device::cd_w(offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2)
{
if (m_card != nullptr)
{
- m_card->c64_cd_w(space, offset, data, sphi2, ba, roml, romh, io1, io2);
+ m_card->c64_cd_w(offset, data, sphi2, ba, roml, romh, io1, io2);
}
}
diff --git a/src/devices/bus/c64/exp.h b/src/devices/bus/c64/exp.h
index c188434d1b8..7cba776f683 100644
--- a/src/devices/bus/c64/exp.h
+++ b/src/devices/bus/c64/exp.h
@@ -81,14 +81,14 @@ public:
auto dma_callback() { return m_write_dma.bind(); }
// computer interface
- uint8_t cd_r(address_space &space, offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2);
- void cd_w(address_space &space, offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2);
+ uint8_t cd_r(offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2);
+ void cd_w(offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2);
int game_r(offs_t offset, int sphi2, int ba, int rw, int hiram);
int exrom_r(offs_t offset, int sphi2, int ba, int rw, int hiram);
// cartridge interface
- DECLARE_READ8_MEMBER( dma_cd_r ) { return m_read_dma_cd(offset); }
- DECLARE_WRITE8_MEMBER( dma_cd_w ) { m_write_dma_cd(offset, data); }
+ uint8_t dma_cd_r(offs_t offset) { return m_read_dma_cd(offset); }
+ void dma_cd_w(offs_t offset, uint8_t data) { m_write_dma_cd(offset, data); }
DECLARE_WRITE_LINE_MEMBER( irq_w ) { m_write_irq(state); }
DECLARE_WRITE_LINE_MEMBER( nmi_w ) { m_write_nmi(state); }
DECLARE_WRITE_LINE_MEMBER( dma_w ) { m_write_dma(state); }
@@ -145,8 +145,8 @@ public:
// construction/destruction
virtual ~device_c64_expansion_card_interface();
- virtual uint8_t c64_cd_r(address_space &space, offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2) { return data; };
- virtual void c64_cd_w(address_space &space, offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2) { };
+ virtual uint8_t c64_cd_r(offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2) { return data; };
+ virtual void c64_cd_w(offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2) { };
virtual int c64_game_r(offs_t offset, int sphi2, int ba, int rw) { return m_game; }
virtual int c64_exrom_r(offs_t offset, int sphi2, int ba, int rw) { return m_exrom; }
diff --git a/src/devices/bus/c64/fcc.cpp b/src/devices/bus/c64/fcc.cpp
index 77d505e97a3..24aaa6ec523 100644
--- a/src/devices/bus/c64/fcc.cpp
+++ b/src/devices/bus/c64/fcc.cpp
@@ -75,10 +75,11 @@ void c64_final_chesscard_device::c64_fcc_map(address_map &map)
// device_add_mconfig - add device configuration
//-------------------------------------------------
-MACHINE_CONFIG_START(c64_final_chesscard_device::device_add_mconfig)
- MCFG_DEVICE_ADD(G65SC02P4_TAG, M65SC02, XTAL(5'000'000))
- MCFG_DEVICE_PROGRAM_MAP(c64_fcc_map)
-MACHINE_CONFIG_END
+void c64_final_chesscard_device::device_add_mconfig(machine_config &config)
+{
+ M65SC02(config, m_maincpu, XTAL(5'000'000));
+ m_maincpu->set_addrmap(AS_PROGRAM, &c64_final_chesscard_device::c64_fcc_map);
+}
//-------------------------------------------------
@@ -147,7 +148,7 @@ void c64_final_chesscard_device::device_reset()
// c64_cd_r - cartridge data read
//-------------------------------------------------
-uint8_t c64_final_chesscard_device::c64_cd_r(address_space &space, offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2)
+uint8_t c64_final_chesscard_device::c64_cd_r(offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2)
{
if (!roml)
{
@@ -173,7 +174,7 @@ uint8_t c64_final_chesscard_device::c64_cd_r(address_space &space, offs_t offset
// c64_cd_w - cartridge data write
//-------------------------------------------------
-void c64_final_chesscard_device::c64_cd_w(address_space &space, offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2)
+void c64_final_chesscard_device::c64_cd_w(offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2)
{
if (!roml)
{
diff --git a/src/devices/bus/c64/fcc.h b/src/devices/bus/c64/fcc.h
index 4d548f38528..3988a597fd4 100644
--- a/src/devices/bus/c64/fcc.h
+++ b/src/devices/bus/c64/fcc.h
@@ -46,8 +46,8 @@ protected:
virtual void nvram_write(emu_file &file) override { if (m_nvram != nullptr) { file.write(m_nvram, m_nvram.bytes()); } }
// device_c64_expansion_card_interface overrides
- virtual uint8_t c64_cd_r(address_space &space, offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2) override;
- virtual void c64_cd_w(address_space &space, offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2) override;
+ virtual uint8_t c64_cd_r(offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2) override;
+ virtual void c64_cd_w(offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2) override;
private:
required_device<m65sc02_device> m_maincpu;
diff --git a/src/devices/bus/c64/final.cpp b/src/devices/bus/c64/final.cpp
index 90be1e6e588..36b8ee1bae6 100644
--- a/src/devices/bus/c64/final.cpp
+++ b/src/devices/bus/c64/final.cpp
@@ -94,7 +94,7 @@ void c64_final_cartridge_device::device_reset()
// c64_cd_r - cartridge data read
//-------------------------------------------------
-uint8_t c64_final_cartridge_device::c64_cd_r(address_space &space, offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2)
+uint8_t c64_final_cartridge_device::c64_cd_r(offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2)
{
if (!roml || !romh || !io1 || !io2)
{
@@ -120,7 +120,7 @@ uint8_t c64_final_cartridge_device::c64_cd_r(address_space &space, offs_t offset
// c64_cd_w - cartridge data write
//-------------------------------------------------
-void c64_final_cartridge_device::c64_cd_w(address_space &space, offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2)
+void c64_final_cartridge_device::c64_cd_w(offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2)
{
if (!io1)
{
diff --git a/src/devices/bus/c64/final.h b/src/devices/bus/c64/final.h
index a8ed113f13b..6d59e737c02 100644
--- a/src/devices/bus/c64/final.h
+++ b/src/devices/bus/c64/final.h
@@ -40,8 +40,8 @@ protected:
virtual void device_reset() override;
// device_c64_expansion_card_interface overrides
- virtual uint8_t c64_cd_r(address_space &space, offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2) override;
- virtual void c64_cd_w(address_space &space, offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2) override;
+ virtual uint8_t c64_cd_r(offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2) override;
+ virtual void c64_cd_w(offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2) override;
};
diff --git a/src/devices/bus/c64/final3.cpp b/src/devices/bus/c64/final3.cpp
index 9a64e7c4172..23b54a829e0 100644
--- a/src/devices/bus/c64/final3.cpp
+++ b/src/devices/bus/c64/final3.cpp
@@ -104,7 +104,7 @@ void c64_final3_cartridge_device::device_reset()
// c64_cd_r - cartridge data read
//-------------------------------------------------
-uint8_t c64_final3_cartridge_device::c64_cd_r(address_space &space, offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2)
+uint8_t c64_final3_cartridge_device::c64_cd_r(offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2)
{
if (!roml || !romh || !io1 || !io2)
{
@@ -120,7 +120,7 @@ uint8_t c64_final3_cartridge_device::c64_cd_r(address_space &space, offs_t offse
// c64_cd_w - cartridge data write
//-------------------------------------------------
-void c64_final3_cartridge_device::c64_cd_w(address_space &space, offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2)
+void c64_final3_cartridge_device::c64_cd_w(offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2)
{
if (!m_hidden && !io2 && ((offset & 0xff) == 0xff))
{
diff --git a/src/devices/bus/c64/final3.h b/src/devices/bus/c64/final3.h
index d424c76537a..8b020482560 100644
--- a/src/devices/bus/c64/final3.h
+++ b/src/devices/bus/c64/final3.h
@@ -40,8 +40,8 @@ protected:
virtual void device_reset() override;
// device_c64_expansion_card_interface overrides
- virtual uint8_t c64_cd_r(address_space &space, offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2) override;
- virtual void c64_cd_w(address_space &space, offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2) override;
+ virtual uint8_t c64_cd_r(offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2) override;
+ virtual void c64_cd_w(offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2) override;
private:
uint8_t m_bank;
diff --git a/src/devices/bus/c64/fun_play.cpp b/src/devices/bus/c64/fun_play.cpp
index b4b7a7285d2..2a211b21ab5 100644
--- a/src/devices/bus/c64/fun_play.cpp
+++ b/src/devices/bus/c64/fun_play.cpp
@@ -60,7 +60,7 @@ void c64_fun_play_cartridge_device::device_reset()
// c64_cd_r - cartridge data read
//-------------------------------------------------
-uint8_t c64_fun_play_cartridge_device::c64_cd_r(address_space &space, offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2)
+uint8_t c64_fun_play_cartridge_device::c64_cd_r(offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2)
{
if (!roml)
{
@@ -76,7 +76,7 @@ uint8_t c64_fun_play_cartridge_device::c64_cd_r(address_space &space, offs_t off
// c64_cd_w - cartridge data write
//-------------------------------------------------
-void c64_fun_play_cartridge_device::c64_cd_w(address_space &space, offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2)
+void c64_fun_play_cartridge_device::c64_cd_w(offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2)
{
if (!io1)
{
diff --git a/src/devices/bus/c64/fun_play.h b/src/devices/bus/c64/fun_play.h
index ba62626651a..6fc082164c6 100644
--- a/src/devices/bus/c64/fun_play.h
+++ b/src/devices/bus/c64/fun_play.h
@@ -35,8 +35,8 @@ protected:
virtual void device_reset() override;
// device_c64_expansion_card_interface overrides
- virtual uint8_t c64_cd_r(address_space &space, offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2) override;
- virtual void c64_cd_w(address_space &space, offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2) override;
+ virtual uint8_t c64_cd_r(offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2) override;
+ virtual void c64_cd_w(offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2) override;
private:
uint8_t m_bank;
diff --git a/src/devices/bus/c64/geocable.cpp b/src/devices/bus/c64/geocable.cpp
index e740ec0da69..e07734f987f 100644
--- a/src/devices/bus/c64/geocable.cpp
+++ b/src/devices/bus/c64/geocable.cpp
@@ -30,10 +30,11 @@ DEFINE_DEVICE_TYPE(C64_GEOCABLE, c64_geocable_device, "c64_geocable", "C64 geoCa
// device_add_mconfig - add device configuration
//-------------------------------------------------
-MACHINE_CONFIG_START(c64_geocable_device::device_add_mconfig)
- MCFG_DEVICE_ADD(m_centronics, CENTRONICS, centronics_devices, "printer")
- MCFG_CENTRONICS_BUSY_HANDLER(WRITELINE(*this, c64_geocable_device, output_b))
-MACHINE_CONFIG_END
+void c64_geocable_device::device_add_mconfig(machine_config &config)
+{
+ CENTRONICS(config, m_centronics, centronics_devices, "printer");
+ m_centronics->busy_handler().set(FUNC(c64_geocable_device::output_b));
+}
diff --git a/src/devices/bus/c64/georam.cpp b/src/devices/bus/c64/georam.cpp
index e82061df80e..6bf8a16a1d8 100644
--- a/src/devices/bus/c64/georam.cpp
+++ b/src/devices/bus/c64/georam.cpp
@@ -64,7 +64,7 @@ void c64_georam_cartridge_device::device_reset()
// c64_cd_r - cartridge data read
//-------------------------------------------------
-uint8_t c64_georam_cartridge_device::c64_cd_r(address_space &space, offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2)
+uint8_t c64_georam_cartridge_device::c64_cd_r(offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2)
{
if (!io1)
{
@@ -80,7 +80,7 @@ uint8_t c64_georam_cartridge_device::c64_cd_r(address_space &space, offs_t offse
// c64_cd_w - cartridge data write
//-------------------------------------------------
-void c64_georam_cartridge_device::c64_cd_w(address_space &space, offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2)
+void c64_georam_cartridge_device::c64_cd_w(offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2)
{
if (!io1)
{
diff --git a/src/devices/bus/c64/georam.h b/src/devices/bus/c64/georam.h
index 352ddff6d1b..03967625c23 100644
--- a/src/devices/bus/c64/georam.h
+++ b/src/devices/bus/c64/georam.h
@@ -35,8 +35,8 @@ protected:
virtual void device_reset() override;
// device_c64_expansion_card_interface overrides
- virtual uint8_t c64_cd_r(address_space &space, offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2) override;
- virtual void c64_cd_w(address_space &space, offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2) override;
+ virtual uint8_t c64_cd_r(offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2) override;
+ virtual void c64_cd_w(offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2) override;
private:
optional_shared_ptr<uint8_t> m_ram;
diff --git a/src/devices/bus/c64/ide64.cpp b/src/devices/bus/c64/ide64.cpp
index f70ca03c10a..1942ce466b5 100644
--- a/src/devices/bus/c64/ide64.cpp
+++ b/src/devices/bus/c64/ide64.cpp
@@ -134,7 +134,7 @@ void c64_ide64_cartridge_device::device_reset()
// c64_cd_r - cartridge data read
//-------------------------------------------------
-uint8_t c64_ide64_cartridge_device::c64_cd_r(address_space &space, offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2)
+uint8_t c64_ide64_cartridge_device::c64_cd_r(offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2)
{
if (!m_enable) return data;
@@ -225,7 +225,7 @@ uint8_t c64_ide64_cartridge_device::c64_cd_r(address_space &space, offs_t offset
{
offs_t addr = (m_bank << 14) | (offset & 0x3fff);
- data = m_flash_rom->read(space, addr);
+ data = m_flash_rom->read(addr);
}
else if (!ram_oe)
{
@@ -240,7 +240,7 @@ uint8_t c64_ide64_cartridge_device::c64_cd_r(address_space &space, offs_t offset
// c64_cd_w - cartridge data write
//-------------------------------------------------
-void c64_ide64_cartridge_device::c64_cd_w(address_space &space, offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2)
+void c64_ide64_cartridge_device::c64_cd_w(offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2)
{
if (!m_enable) return;
@@ -259,7 +259,7 @@ void c64_ide64_cartridge_device::c64_cd_w(address_space &space, offs_t offset, u
if ((offset >= 0x8000 && offset < 0xc000) && !m_wp)
{
offs_t addr = (m_bank << 14) | (offset & 0x3fff);
- m_flash_rom->write(space, addr, data);
+ m_flash_rom->write(addr, data);
}
if (!io1)
diff --git a/src/devices/bus/c64/ide64.h b/src/devices/bus/c64/ide64.h
index b43e7bdaf98..bfabad10c87 100644
--- a/src/devices/bus/c64/ide64.h
+++ b/src/devices/bus/c64/ide64.h
@@ -43,8 +43,8 @@ protected:
virtual ioport_constructor device_input_ports() const override;
// device_c64_expansion_card_interface overrides
- virtual uint8_t c64_cd_r(address_space &space, offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2) override;
- virtual void c64_cd_w(address_space &space, offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2) override;
+ virtual uint8_t c64_cd_r(offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2) override;
+ virtual void c64_cd_w(offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2) override;
virtual int c64_game_r(offs_t offset, int sphi2, int ba, int rw) override;
virtual int c64_exrom_r(offs_t offset, int sphi2, int ba, int rw) override;
diff --git a/src/devices/bus/c64/ieee488.cpp b/src/devices/bus/c64/ieee488.cpp
index db1558b9766..d77e5064dfc 100644
--- a/src/devices/bus/c64/ieee488.cpp
+++ b/src/devices/bus/c64/ieee488.cpp
@@ -202,9 +202,9 @@ void c64_ieee488_device::device_reset()
// c64_cd_r - cartridge data read
//-------------------------------------------------
-uint8_t c64_ieee488_device::c64_cd_r(address_space &space, offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2)
+uint8_t c64_ieee488_device::c64_cd_r(offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2)
{
- data = m_exp->cd_r(space, offset, data, sphi2, ba, roml, romh, io1, io2);
+ data = m_exp->cd_r(offset, data, sphi2, ba, roml, romh, io1, io2);
if (!roml && m_roml_sel)
{
@@ -212,7 +212,7 @@ uint8_t c64_ieee488_device::c64_cd_r(address_space &space, offs_t offset, uint8_
}
else if (!io2)
{
- data = m_tpi->read(space, offset & 0x07);
+ data = m_tpi->read(offset & 0x07);
}
return data;
@@ -223,14 +223,14 @@ uint8_t c64_ieee488_device::c64_cd_r(address_space &space, offs_t offset, uint8_
// c64_cd_w - cartridge data write
//-------------------------------------------------
-void c64_ieee488_device::c64_cd_w(address_space &space, offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2)
+void c64_ieee488_device::c64_cd_w(offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2)
{
if (!io2)
{
- m_tpi->write(space, offset & 0x07, data);
+ m_tpi->write(offset & 0x07, data);
}
- m_exp->cd_w(space, offset, data, sphi2, ba, roml, romh, io1, io2);
+ m_exp->cd_w(offset, data, sphi2, ba, roml, romh, io1, io2);
}
diff --git a/src/devices/bus/c64/ieee488.h b/src/devices/bus/c64/ieee488.h
index 185a2623317..ab3c7748b8d 100644
--- a/src/devices/bus/c64/ieee488.h
+++ b/src/devices/bus/c64/ieee488.h
@@ -39,8 +39,8 @@ protected:
virtual void device_add_mconfig(machine_config &config) override;
// device_c64_expansion_card_interface overrides
- virtual uint8_t c64_cd_r(address_space &space, offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2) override;
- virtual void c64_cd_w(address_space &space, offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2) override;
+ virtual uint8_t c64_cd_r(offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2) override;
+ virtual void c64_cd_w(offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2) override;
virtual int c64_game_r(offs_t offset, int sphi2, int ba, int rw) override;
private:
diff --git a/src/devices/bus/c64/kingsoft.cpp b/src/devices/bus/c64/kingsoft.cpp
index 84263b71da7..510032fb720 100644
--- a/src/devices/bus/c64/kingsoft.cpp
+++ b/src/devices/bus/c64/kingsoft.cpp
@@ -57,7 +57,7 @@ void c64_kingsoft_cartridge_device::device_reset()
// c64_cd_r - cartridge data read
//-------------------------------------------------
-uint8_t c64_kingsoft_cartridge_device::c64_cd_r(address_space &space, offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2)
+uint8_t c64_kingsoft_cartridge_device::c64_cd_r(offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2)
{
if (!roml)
{
@@ -80,7 +80,7 @@ uint8_t c64_kingsoft_cartridge_device::c64_cd_r(address_space &space, offs_t off
// c64_cd_w - cartridge data write
//-------------------------------------------------
-void c64_kingsoft_cartridge_device::c64_cd_w(address_space &space, offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2)
+void c64_kingsoft_cartridge_device::c64_cd_w(offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2)
{
if (!io1)
{
diff --git a/src/devices/bus/c64/kingsoft.h b/src/devices/bus/c64/kingsoft.h
index 89b2a4e0367..3a9fda45fef 100644
--- a/src/devices/bus/c64/kingsoft.h
+++ b/src/devices/bus/c64/kingsoft.h
@@ -35,8 +35,8 @@ protected:
virtual void device_reset() override;
// device_c64_expansion_card_interface overrides
- virtual uint8_t c64_cd_r(address_space &space, offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2) override;
- virtual void c64_cd_w(address_space &space, offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2) override;
+ virtual uint8_t c64_cd_r(offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2) override;
+ virtual void c64_cd_w(offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2) override;
virtual int c64_game_r(offs_t offset, int sphi2, int ba, int rw) override;
};
diff --git a/src/devices/bus/c64/mach5.cpp b/src/devices/bus/c64/mach5.cpp
index f312a14e1d4..ddd44407d3e 100644
--- a/src/devices/bus/c64/mach5.cpp
+++ b/src/devices/bus/c64/mach5.cpp
@@ -88,7 +88,7 @@ void c64_mach5_cartridge_device::device_reset()
// c64_cd_r - cartridge data read
//-------------------------------------------------
-uint8_t c64_mach5_cartridge_device::c64_cd_r(address_space &space, offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2)
+uint8_t c64_mach5_cartridge_device::c64_cd_r(offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2)
{
if (!roml || !romh || !io1 || !io2)
{
@@ -103,7 +103,7 @@ uint8_t c64_mach5_cartridge_device::c64_cd_r(address_space &space, offs_t offset
// c64_cd_w - cartridge data write
//-------------------------------------------------
-void c64_mach5_cartridge_device::c64_cd_w(address_space &space, offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2)
+void c64_mach5_cartridge_device::c64_cd_w(offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2)
{
if (!m_c128)
{
diff --git a/src/devices/bus/c64/mach5.h b/src/devices/bus/c64/mach5.h
index affe03a52dc..a49e1bec347 100644
--- a/src/devices/bus/c64/mach5.h
+++ b/src/devices/bus/c64/mach5.h
@@ -37,8 +37,8 @@ protected:
virtual void device_reset() override;
// device_c64_expansion_card_interface overrides
- virtual uint8_t c64_cd_r(address_space &space, offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2) override;
- virtual void c64_cd_w(address_space &space, offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2) override;
+ virtual uint8_t c64_cd_r(offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2) override;
+ virtual void c64_cd_w(offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2) override;
private:
required_ioport m_s1;
diff --git a/src/devices/bus/c64/magic_desk.cpp b/src/devices/bus/c64/magic_desk.cpp
index 9f72a1f416f..2fe55681966 100644
--- a/src/devices/bus/c64/magic_desk.cpp
+++ b/src/devices/bus/c64/magic_desk.cpp
@@ -60,7 +60,7 @@ void c64_magic_desk_cartridge_device::device_reset()
// c64_cd_r - cartridge data read
//-------------------------------------------------
-uint8_t c64_magic_desk_cartridge_device::c64_cd_r(address_space &space, offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2)
+uint8_t c64_magic_desk_cartridge_device::c64_cd_r(offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2)
{
if (!roml)
{
@@ -76,7 +76,7 @@ uint8_t c64_magic_desk_cartridge_device::c64_cd_r(address_space &space, offs_t o
// c64_cd_w - cartridge data write
//-------------------------------------------------
-void c64_magic_desk_cartridge_device::c64_cd_w(address_space &space, offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2)
+void c64_magic_desk_cartridge_device::c64_cd_w(offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2)
{
if (!io1)
{
diff --git a/src/devices/bus/c64/magic_desk.h b/src/devices/bus/c64/magic_desk.h
index 4082fc5ff56..75f76dee732 100644
--- a/src/devices/bus/c64/magic_desk.h
+++ b/src/devices/bus/c64/magic_desk.h
@@ -35,8 +35,8 @@ protected:
virtual void device_reset() override;
// device_c64_expansion_card_interface overrides
- virtual uint8_t c64_cd_r(address_space &space, offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2) override;
- virtual void c64_cd_w(address_space &space, offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2) override;
+ virtual uint8_t c64_cd_r(offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2) override;
+ virtual void c64_cd_w(offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2) override;
private:
uint8_t m_bank;
diff --git a/src/devices/bus/c64/magic_formel.cpp b/src/devices/bus/c64/magic_formel.cpp
index 7575320b765..9ebadc5320b 100644
--- a/src/devices/bus/c64/magic_formel.cpp
+++ b/src/devices/bus/c64/magic_formel.cpp
@@ -206,7 +206,7 @@ void c64_magic_formel_cartridge_device::device_reset()
// c64_cd_r - cartridge data read
//-------------------------------------------------
-uint8_t c64_magic_formel_cartridge_device::c64_cd_r(address_space &space, offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2)
+uint8_t c64_magic_formel_cartridge_device::c64_cd_r(offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2)
{
if (!romh)
{
@@ -227,7 +227,7 @@ uint8_t c64_magic_formel_cartridge_device::c64_cd_r(address_space &space, offs_t
// c64_cd_w - cartridge data write
//-------------------------------------------------
-void c64_magic_formel_cartridge_device::c64_cd_w(address_space &space, offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2)
+void c64_magic_formel_cartridge_device::c64_cd_w(offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2)
{
if (!io1 && !m_ram_oe)
{
@@ -239,7 +239,7 @@ void c64_magic_formel_cartridge_device::c64_cd_w(address_space &space, offs_t of
offs_t addr = (offset >> 6) & 0x03;
uint8_t new_data = (BIT(data, 1) << 7) | (offset & 0x3f);
- m_pia->write(space, addr, new_data);
+ m_pia->write(addr, new_data);
}
else if (offset == 0x0001)
{
diff --git a/src/devices/bus/c64/magic_formel.h b/src/devices/bus/c64/magic_formel.h
index b4427511f32..818342d3c3f 100644
--- a/src/devices/bus/c64/magic_formel.h
+++ b/src/devices/bus/c64/magic_formel.h
@@ -41,8 +41,8 @@ protected:
virtual ioport_constructor device_input_ports() const override;
// device_c64_expansion_card_interface overrides
- virtual uint8_t c64_cd_r(address_space &space, offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2) override;
- virtual void c64_cd_w(address_space &space, offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2) override;
+ virtual uint8_t c64_cd_r(offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2) override;
+ virtual void c64_cd_w(offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2) override;
virtual int c64_game_r(offs_t offset, int sphi2, int ba, int rw) override;
private:
diff --git a/src/devices/bus/c64/magic_voice.cpp b/src/devices/bus/c64/magic_voice.cpp
index 8479f56a238..72d4afe5cf3 100644
--- a/src/devices/bus/c64/magic_voice.cpp
+++ b/src/devices/bus/c64/magic_voice.cpp
@@ -168,7 +168,7 @@ WRITE8_MEMBER( c64_magic_voice_cartridge_device::tpi_pb_w )
if (!BIT(m_tpi_pb, 4) && BIT(data, 4))
{
- m_vslsi->write(space, 0, data & 0x0f);
+ m_vslsi->write(data & 0x0f);
}
m_tpi_pb = data;
@@ -303,12 +303,12 @@ void c64_magic_voice_cartridge_device::device_reset()
// c64_cd_r - cartridge data read
//-------------------------------------------------
-uint8_t c64_magic_voice_cartridge_device::c64_cd_r(address_space &space, offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2)
+uint8_t c64_magic_voice_cartridge_device::c64_cd_r(offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2)
{
if (!io2 && sphi2)
{
m_ca = offset;
- data = m_tpi->read(space, offset & 0x07);
+ data = m_tpi->read(offset & 0x07);
}
if (PB6 && A13 && A15)
@@ -319,7 +319,7 @@ uint8_t c64_magic_voice_cartridge_device::c64_cd_r(address_space &space, offs_t
int roml2 = !(!roml || (roml && !PB5 && A12 && A13 && !A14 && A15));
int romh2 = !((!romh && !PB6) || (!PB5 && A12 && A13 && !A14 && !A15));
- data = m_exp->cd_r(space, get_offset(offset), data, sphi2, ba, roml2, romh2, io1, 1);
+ data = m_exp->cd_r(get_offset(offset), data, sphi2, ba, roml2, romh2, io1, 1);
return data;
}
@@ -329,17 +329,17 @@ uint8_t c64_magic_voice_cartridge_device::c64_cd_r(address_space &space, offs_t
// c64_cd_w - cartridge data write
//-------------------------------------------------
-void c64_magic_voice_cartridge_device::c64_cd_w(address_space &space, offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2)
+void c64_magic_voice_cartridge_device::c64_cd_w(offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2)
{
if (!io2 && sphi2)
{
- m_tpi->write(space, offset & 0x07, data);
+ m_tpi->write(offset & 0x07, data);
}
int roml2 = !(!roml || (roml && !PB5 && A12 && A13 && !A14 && A15));
int romh2 = !((!romh && !PB6) || (!PB5 && A12 && A13 && !A14 && !A15));
- m_exp->cd_w(space, get_offset(offset), data, sphi2, ba, roml2, romh2, io1, 1);
+ m_exp->cd_w(get_offset(offset), data, sphi2, ba, roml2, romh2, io1, 1);
}
diff --git a/src/devices/bus/c64/magic_voice.h b/src/devices/bus/c64/magic_voice.h
index 264c2531197..bf6f081fd67 100644
--- a/src/devices/bus/c64/magic_voice.h
+++ b/src/devices/bus/c64/magic_voice.h
@@ -40,8 +40,8 @@ protected:
virtual void device_add_mconfig(machine_config &config) override;
// device_c64_expansion_card_interface overrides
- virtual uint8_t c64_cd_r(address_space &space, offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2) override;
- virtual void c64_cd_w(address_space &space, offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2) override;
+ virtual uint8_t c64_cd_r(offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2) override;
+ virtual void c64_cd_w(offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2) override;
virtual int c64_game_r(offs_t offset, int sphi2, int ba, int rw) override;
private:
diff --git a/src/devices/bus/c64/midi_maplin.cpp b/src/devices/bus/c64/midi_maplin.cpp
index 1845f167e33..adc8556a7bd 100644
--- a/src/devices/bus/c64/midi_maplin.cpp
+++ b/src/devices/bus/c64/midi_maplin.cpp
@@ -44,19 +44,19 @@ WRITE_LINE_MEMBER( c64_maplin_midi_cartridge_device::write_acia_clock )
// device_add_mconfig - add device configuration
//-------------------------------------------------
-MACHINE_CONFIG_START(c64_maplin_midi_cartridge_device::device_add_mconfig)
+void c64_maplin_midi_cartridge_device::device_add_mconfig(machine_config &config)
+{
ACIA6850(config, m_acia, 0);
m_acia->txd_handler().set("mdout", FUNC(midi_port_device::write_txd));
m_acia->irq_handler().set(FUNC(c64_maplin_midi_cartridge_device::acia_irq_w));
- MCFG_MIDI_PORT_ADD("mdin", midiin_slot, "midiin")
- MCFG_MIDI_RX_HANDLER(WRITELINE(MC6850_TAG, acia6850_device, write_rxd))
+ MIDI_PORT(config, "mdin", midiin_slot, "midiin").rxd_handler().set(m_acia, FUNC(acia6850_device::write_rxd));
- MCFG_MIDI_PORT_ADD("mdout", midiout_slot, "midiout")
+ MIDI_PORT(config, "mdout", midiout_slot, "midiout");
- MCFG_DEVICE_ADD("acia_clock", CLOCK, 31250*16)
- MCFG_CLOCK_SIGNAL_HANDLER(WRITELINE(*this, c64_maplin_midi_cartridge_device, write_acia_clock))
-MACHINE_CONFIG_END
+ clock_device &acia_clock(CLOCK(config, "acia_clock", 31250*16));
+ acia_clock.signal_handler().set(FUNC(c64_maplin_midi_cartridge_device::write_acia_clock));
+}
@@ -100,7 +100,7 @@ void c64_maplin_midi_cartridge_device::device_reset()
// c64_cd_r - cartridge data read
//-------------------------------------------------
-uint8_t c64_maplin_midi_cartridge_device::c64_cd_r(address_space &space, offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2)
+uint8_t c64_maplin_midi_cartridge_device::c64_cd_r(offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2)
{
if (!io2)
{
@@ -108,7 +108,7 @@ uint8_t c64_maplin_midi_cartridge_device::c64_cd_r(address_space &space, offs_t
{
case 0:
case 1:
- data = m_acia->read(space, offset & 1);
+ data = m_acia->read(offset & 1);
break;
}
}
@@ -121,7 +121,7 @@ uint8_t c64_maplin_midi_cartridge_device::c64_cd_r(address_space &space, offs_t
// c64_cd_w - cartridge data write
//-------------------------------------------------
-void c64_maplin_midi_cartridge_device::c64_cd_w(address_space &space, offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2)
+void c64_maplin_midi_cartridge_device::c64_cd_w(offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2)
{
if (!io2)
{
@@ -129,7 +129,7 @@ void c64_maplin_midi_cartridge_device::c64_cd_w(address_space &space, offs_t off
{
case 0:
case 1:
- m_acia->write(space, offset & 1, data);
+ m_acia->write(offset & 1, data);
break;
}
}
diff --git a/src/devices/bus/c64/midi_maplin.h b/src/devices/bus/c64/midi_maplin.h
index d844d007b36..eff1129802d 100644
--- a/src/devices/bus/c64/midi_maplin.h
+++ b/src/devices/bus/c64/midi_maplin.h
@@ -38,8 +38,8 @@ protected:
virtual void device_add_mconfig(machine_config &config) override;
// device_c64_expansion_card_interface overrides
- virtual uint8_t c64_cd_r(address_space &space, offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2) override;
- virtual void c64_cd_w(address_space &space, offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2) override;
+ virtual uint8_t c64_cd_r(offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2) override;
+ virtual void c64_cd_w(offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2) override;
private:
DECLARE_WRITE_LINE_MEMBER( acia_irq_w );
diff --git a/src/devices/bus/c64/midi_namesoft.cpp b/src/devices/bus/c64/midi_namesoft.cpp
index c572cf4ea55..d4e7c8b59ac 100644
--- a/src/devices/bus/c64/midi_namesoft.cpp
+++ b/src/devices/bus/c64/midi_namesoft.cpp
@@ -44,19 +44,19 @@ WRITE_LINE_MEMBER( c64_namesoft_midi_cartridge_device::write_acia_clock )
// device_add_mconfig - add device configuration
//-------------------------------------------------
-MACHINE_CONFIG_START(c64_namesoft_midi_cartridge_device::device_add_mconfig)
+void c64_namesoft_midi_cartridge_device::device_add_mconfig(machine_config &config)
+{
ACIA6850(config, m_acia, 0);
m_acia->txd_handler().set("mdout", FUNC(midi_port_device::write_txd));
m_acia->irq_handler().set(FUNC(c64_namesoft_midi_cartridge_device::acia_irq_w));
- MCFG_MIDI_PORT_ADD("mdin", midiin_slot, "midiin")
- MCFG_MIDI_RX_HANDLER(WRITELINE(MC6850_TAG, acia6850_device, write_rxd))
+ MIDI_PORT(config, "mdin", midiin_slot, "midiin").rxd_handler().set(m_acia, FUNC(acia6850_device::write_rxd));
- MCFG_MIDI_PORT_ADD("mdout", midiout_slot, "midiout")
+ MIDI_PORT(config, "mdout", midiout_slot, "midiout");
- MCFG_DEVICE_ADD("acia_clock", CLOCK, 31250*16)
- MCFG_CLOCK_SIGNAL_HANDLER(WRITELINE(*this, c64_namesoft_midi_cartridge_device, write_acia_clock))
-MACHINE_CONFIG_END
+ clock_device &acia_clock(CLOCK(config, "acia_clock", 31250*16));
+ acia_clock.signal_handler().set(FUNC(c64_namesoft_midi_cartridge_device::write_acia_clock));
+}
@@ -98,7 +98,7 @@ void c64_namesoft_midi_cartridge_device::device_reset()
// c64_cd_r - cartridge data read
//-------------------------------------------------
-uint8_t c64_namesoft_midi_cartridge_device::c64_cd_r(address_space &space, offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2)
+uint8_t c64_namesoft_midi_cartridge_device::c64_cd_r(offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2)
{
if (!io1)
{
@@ -106,7 +106,7 @@ uint8_t c64_namesoft_midi_cartridge_device::c64_cd_r(address_space &space, offs_
{
case 2:
case 3:
- data = m_acia->read(space, offset & 1);
+ data = m_acia->read(offset & 1);
break;
}
}
@@ -119,7 +119,7 @@ uint8_t c64_namesoft_midi_cartridge_device::c64_cd_r(address_space &space, offs_
// c64_cd_w - cartridge data write
//-------------------------------------------------
-void c64_namesoft_midi_cartridge_device::c64_cd_w(address_space &space, offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2)
+void c64_namesoft_midi_cartridge_device::c64_cd_w(offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2)
{
if (!io1)
{
@@ -127,7 +127,7 @@ void c64_namesoft_midi_cartridge_device::c64_cd_w(address_space &space, offs_t o
{
case 0:
case 1:
- m_acia->write(space, offset & 1, data);
+ m_acia->write(offset & 1, data);
break;
}
}
diff --git a/src/devices/bus/c64/midi_namesoft.h b/src/devices/bus/c64/midi_namesoft.h
index fe583e9cac1..ab5064486c0 100644
--- a/src/devices/bus/c64/midi_namesoft.h
+++ b/src/devices/bus/c64/midi_namesoft.h
@@ -38,8 +38,8 @@ protected:
virtual void device_add_mconfig(machine_config &config) override;
// device_c64_expansion_card_interface overrides
- virtual uint8_t c64_cd_r(address_space &space, offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2) override;
- virtual void c64_cd_w(address_space &space, offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2) override;
+ virtual uint8_t c64_cd_r(offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2) override;
+ virtual void c64_cd_w(offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2) override;
private:
DECLARE_WRITE_LINE_MEMBER( acia_irq_w );
diff --git a/src/devices/bus/c64/midi_passport.cpp b/src/devices/bus/c64/midi_passport.cpp
index bedab8e52c1..05a3fbb1a36 100644
--- a/src/devices/bus/c64/midi_passport.cpp
+++ b/src/devices/bus/c64/midi_passport.cpp
@@ -58,7 +58,8 @@ WRITE_LINE_MEMBER( c64_passport_midi_cartridge_device::write_acia_clock )
// device_add_mconfig - add device configuration
//-------------------------------------------------
-MACHINE_CONFIG_START(c64_passport_midi_cartridge_device::device_add_mconfig)
+void c64_passport_midi_cartridge_device::device_add_mconfig(machine_config &config)
+{
ACIA6850(config, m_acia, 0);
m_acia->txd_handler().set("mdout", FUNC(midi_port_device::write_txd));
m_acia->irq_handler().set(FUNC(c64_passport_midi_cartridge_device::acia_irq_w));
@@ -67,14 +68,13 @@ MACHINE_CONFIG_START(c64_passport_midi_cartridge_device::device_add_mconfig)
m_ptm->set_external_clocks(1021800.0f, 1021800.0f, 1021800.0f);
m_ptm->irq_callback().set(FUNC(c64_passport_midi_cartridge_device::ptm_irq_w));
- MCFG_MIDI_PORT_ADD("mdin", midiin_slot, "midiin")
- MCFG_MIDI_RX_HANDLER(WRITELINE(MC6850_TAG, acia6850_device, write_rxd))
+ MIDI_PORT(config, "mdin", midiin_slot, "midiin").rxd_handler().set(m_acia, FUNC(acia6850_device::write_rxd));
- MCFG_MIDI_PORT_ADD("mdout", midiout_slot, "midiout")
+ MIDI_PORT(config, "mdout", midiout_slot, "midiout");
- MCFG_DEVICE_ADD("acia_clock", CLOCK, 31250*16) /// TODO: work out if the clock should come from the 6840
- MCFG_CLOCK_SIGNAL_HANDLER(WRITELINE(*this, c64_passport_midi_cartridge_device, write_acia_clock))
-MACHINE_CONFIG_END
+ clock_device &acia_clock(CLOCK(config, "acia_clock", 31250*16)); // TODO: work out if the clock should come from the 6840
+ acia_clock.signal_handler().set(FUNC(c64_passport_midi_cartridge_device::write_acia_clock));
+}
@@ -124,7 +124,7 @@ void c64_passport_midi_cartridge_device::device_reset()
// c64_cd_r - cartridge data read
//-------------------------------------------------
-uint8_t c64_passport_midi_cartridge_device::c64_cd_r(address_space &space, offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2)
+uint8_t c64_passport_midi_cartridge_device::c64_cd_r(offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2)
{
if (!io1)
{
@@ -132,11 +132,11 @@ uint8_t c64_passport_midi_cartridge_device::c64_cd_r(address_space &space, offs_
{
case 0: case 1: case 2: case 3:
case 4: case 5: case 6: case 7:
- data = m_ptm->read(space, offset & 0x07);
+ data = m_ptm->read(offset & 0x07);
break;
case 8: case 9:
- data = m_acia->read(space, offset & 0x01);
+ data = m_acia->read(offset & 0x01);
break;
}
}
@@ -149,7 +149,7 @@ uint8_t c64_passport_midi_cartridge_device::c64_cd_r(address_space &space, offs_
// c64_cd_w - cartridge data write
//-------------------------------------------------
-void c64_passport_midi_cartridge_device::c64_cd_w(address_space &space, offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2)
+void c64_passport_midi_cartridge_device::c64_cd_w(offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2)
{
if (!io1)
{
@@ -157,11 +157,11 @@ void c64_passport_midi_cartridge_device::c64_cd_w(address_space &space, offs_t o
{
case 0: case 1: case 2: case 3:
case 4: case 5: case 6: case 7:
- m_ptm->write(space, offset & 0x07, data);
+ m_ptm->write(offset & 0x07, data);
break;
case 8: case 9:
- m_acia->write(space, offset & 0x01, data);
+ m_acia->write(offset & 0x01, data);
break;
case 0x30:
diff --git a/src/devices/bus/c64/midi_passport.h b/src/devices/bus/c64/midi_passport.h
index 5385e3fff91..a538d312912 100644
--- a/src/devices/bus/c64/midi_passport.h
+++ b/src/devices/bus/c64/midi_passport.h
@@ -39,8 +39,8 @@ protected:
virtual void device_add_mconfig(machine_config &config) override;
// device_c64_expansion_card_interface overrides
- virtual uint8_t c64_cd_r(address_space &space, offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2) override;
- virtual void c64_cd_w(address_space &space, offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2) override;
+ virtual uint8_t c64_cd_r(offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2) override;
+ virtual void c64_cd_w(offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2) override;
private:
DECLARE_WRITE_LINE_MEMBER( ptm_irq_w );
diff --git a/src/devices/bus/c64/midi_sci.cpp b/src/devices/bus/c64/midi_sci.cpp
index 9d58052b38a..14309ee5e7c 100644
--- a/src/devices/bus/c64/midi_sci.cpp
+++ b/src/devices/bus/c64/midi_sci.cpp
@@ -44,19 +44,19 @@ WRITE_LINE_MEMBER( c64_sequential_midi_cartridge_device::write_acia_clock )
// device_add_mconfig - add device configuration
//-------------------------------------------------
-MACHINE_CONFIG_START(c64_sequential_midi_cartridge_device::device_add_mconfig)
+void c64_sequential_midi_cartridge_device::device_add_mconfig(machine_config &config)
+{
ACIA6850(config, m_acia, 0);
m_acia->txd_handler().set("mdout", FUNC(midi_port_device::write_txd));
m_acia->irq_handler().set(FUNC(c64_sequential_midi_cartridge_device::acia_irq_w));
- MCFG_MIDI_PORT_ADD("mdin", midiin_slot, "midiin")
- MCFG_MIDI_RX_HANDLER(WRITELINE(MC6850_TAG, acia6850_device, write_rxd))
+ MIDI_PORT(config, "mdin", midiin_slot, "midiin").rxd_handler().set(m_acia, FUNC(acia6850_device::write_rxd));
- MCFG_MIDI_PORT_ADD("mdout", midiout_slot, "midiout")
+ MIDI_PORT(config, "mdout", midiout_slot, "midiout");
- MCFG_DEVICE_ADD("acia_clock", CLOCK, 31250*16)
- MCFG_CLOCK_SIGNAL_HANDLER(WRITELINE(*this, c64_sequential_midi_cartridge_device, write_acia_clock))
-MACHINE_CONFIG_END
+ clock_device &acia_clock(CLOCK(config, "acia_clock", 31250*16));
+ acia_clock.signal_handler().set(FUNC(c64_sequential_midi_cartridge_device::write_acia_clock));
+}
@@ -99,7 +99,7 @@ void c64_sequential_midi_cartridge_device::device_reset()
// c64_cd_r - cartridge data read
//-------------------------------------------------
-uint8_t c64_sequential_midi_cartridge_device::c64_cd_r(address_space &space, offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2)
+uint8_t c64_sequential_midi_cartridge_device::c64_cd_r(offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2)
{
if (!io1)
{
@@ -107,7 +107,7 @@ uint8_t c64_sequential_midi_cartridge_device::c64_cd_r(address_space &space, off
{
case 2:
case 3:
- data = m_acia->read(space, offset & 1);
+ data = m_acia->read(offset & 1);
break;
}
}
@@ -120,7 +120,7 @@ uint8_t c64_sequential_midi_cartridge_device::c64_cd_r(address_space &space, off
// c64_cd_w - cartridge data write
//-------------------------------------------------
-void c64_sequential_midi_cartridge_device::c64_cd_w(address_space &space, offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2)
+void c64_sequential_midi_cartridge_device::c64_cd_w(offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2)
{
if (!io1)
{
@@ -128,7 +128,7 @@ void c64_sequential_midi_cartridge_device::c64_cd_w(address_space &space, offs_t
{
case 0:
case 1:
- m_acia->write(space, offset & 1, data);
+ m_acia->write(offset & 1, data);
break;
}
}
diff --git a/src/devices/bus/c64/midi_sci.h b/src/devices/bus/c64/midi_sci.h
index 2c3dfc7f8ff..b0d52a0f70d 100644
--- a/src/devices/bus/c64/midi_sci.h
+++ b/src/devices/bus/c64/midi_sci.h
@@ -38,8 +38,8 @@ protected:
virtual void device_add_mconfig(machine_config &config) override;
// device_c64_expansion_card_interface overrides
- virtual uint8_t c64_cd_r(address_space &space, offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2) override;
- virtual void c64_cd_w(address_space &space, offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2) override;
+ virtual uint8_t c64_cd_r(offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2) override;
+ virtual void c64_cd_w(offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2) override;
private:
DECLARE_WRITE_LINE_MEMBER( acia_irq_w );
diff --git a/src/devices/bus/c64/midi_siel.cpp b/src/devices/bus/c64/midi_siel.cpp
index f5338bc6995..eea7a4b333d 100644
--- a/src/devices/bus/c64/midi_siel.cpp
+++ b/src/devices/bus/c64/midi_siel.cpp
@@ -44,19 +44,19 @@ WRITE_LINE_MEMBER( c64_siel_midi_cartridge_device::write_acia_clock )
// device_add_mconfig - add device configuration
//-------------------------------------------------
-MACHINE_CONFIG_START(c64_siel_midi_cartridge_device::device_add_mconfig)
+void c64_siel_midi_cartridge_device::device_add_mconfig(machine_config &config)
+{
ACIA6850(config, m_acia, 0);
m_acia->txd_handler().set("mdout", FUNC(midi_port_device::write_txd));
m_acia->irq_handler().set(FUNC(c64_siel_midi_cartridge_device::acia_irq_w));
- MCFG_MIDI_PORT_ADD("mdin", midiin_slot, "midiin")
- MCFG_MIDI_RX_HANDLER(WRITELINE(MC6850_TAG, acia6850_device, write_rxd))
+ MIDI_PORT(config, "mdin", midiin_slot, "midiin").rxd_handler().set(m_acia, FUNC(acia6850_device::write_rxd));
- MCFG_MIDI_PORT_ADD("mdout", midiout_slot, "midiout")
+ MIDI_PORT(config, "mdout", midiout_slot, "midiout");
- MCFG_DEVICE_ADD("acia_clock", CLOCK, 31250*16)
- MCFG_CLOCK_SIGNAL_HANDLER(WRITELINE(*this, c64_siel_midi_cartridge_device, write_acia_clock))
-MACHINE_CONFIG_END
+ clock_device &acia_clock(CLOCK(config, "acia_clock", 31250*16));
+ acia_clock.signal_handler().set(FUNC(c64_siel_midi_cartridge_device::write_acia_clock));
+}
@@ -100,7 +100,7 @@ void c64_siel_midi_cartridge_device::device_reset()
// c64_cd_r - cartridge data read
//-------------------------------------------------
-uint8_t c64_siel_midi_cartridge_device::c64_cd_r(address_space &space, offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2)
+uint8_t c64_siel_midi_cartridge_device::c64_cd_r(offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2)
{
if (!io1)
{
@@ -108,7 +108,7 @@ uint8_t c64_siel_midi_cartridge_device::c64_cd_r(address_space &space, offs_t of
{
case 6:
case 7:
- data = m_acia->read(space, offset & 1);
+ data = m_acia->read(offset & 1);
break;
}
}
@@ -121,7 +121,7 @@ uint8_t c64_siel_midi_cartridge_device::c64_cd_r(address_space &space, offs_t of
// c64_cd_w - cartridge data write
//-------------------------------------------------
-void c64_siel_midi_cartridge_device::c64_cd_w(address_space &space, offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2)
+void c64_siel_midi_cartridge_device::c64_cd_w(offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2)
{
if (!io1)
{
@@ -129,7 +129,7 @@ void c64_siel_midi_cartridge_device::c64_cd_w(address_space &space, offs_t offse
{
case 4:
case 5:
- m_acia->write(space, offset & 1, data);
+ m_acia->write(offset & 1, data);
break;
}
}
diff --git a/src/devices/bus/c64/midi_siel.h b/src/devices/bus/c64/midi_siel.h
index 9e84f5e1852..fe38834278e 100644
--- a/src/devices/bus/c64/midi_siel.h
+++ b/src/devices/bus/c64/midi_siel.h
@@ -38,8 +38,8 @@ protected:
virtual void device_add_mconfig(machine_config &config) override;
// device_c64_expansion_card_interface overrides
- virtual uint8_t c64_cd_r(address_space &space, offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2) override;
- virtual void c64_cd_w(address_space &space, offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2) override;
+ virtual uint8_t c64_cd_r(offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2) override;
+ virtual void c64_cd_w(offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2) override;
private:
DECLARE_WRITE_LINE_MEMBER( acia_irq_w );
diff --git a/src/devices/bus/c64/mikro_assembler.cpp b/src/devices/bus/c64/mikro_assembler.cpp
index fe97c9472d7..d6c02be7681 100644
--- a/src/devices/bus/c64/mikro_assembler.cpp
+++ b/src/devices/bus/c64/mikro_assembler.cpp
@@ -47,7 +47,7 @@ void c64_mikro_assembler_cartridge_device::device_start()
// c64_cd_r - cartridge data read
//-------------------------------------------------
-uint8_t c64_mikro_assembler_cartridge_device::c64_cd_r(address_space &space, offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2)
+uint8_t c64_mikro_assembler_cartridge_device::c64_cd_r(offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2)
{
if (!roml || !romh || !io1 || !io2)
{
diff --git a/src/devices/bus/c64/mikro_assembler.h b/src/devices/bus/c64/mikro_assembler.h
index edeb220fd43..754a91385d4 100644
--- a/src/devices/bus/c64/mikro_assembler.h
+++ b/src/devices/bus/c64/mikro_assembler.h
@@ -34,7 +34,7 @@ protected:
virtual void device_start() override;
// device_c64_expansion_card_interface overrides
- virtual uint8_t c64_cd_r(address_space &space, offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2) override;
+ virtual uint8_t c64_cd_r(offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2) override;
};
diff --git a/src/devices/bus/c64/multiscreen.cpp b/src/devices/bus/c64/multiscreen.cpp
index e243a335e50..890c1a35799 100644
--- a/src/devices/bus/c64/multiscreen.cpp
+++ b/src/devices/bus/c64/multiscreen.cpp
@@ -112,13 +112,14 @@ void c64_multiscreen_cartridge_device::multiscreen_mem(address_map &map)
// device_add_mconfig - add device configuration
//-------------------------------------------------
-MACHINE_CONFIG_START(c64_multiscreen_cartridge_device::device_add_mconfig)
- MCFG_DEVICE_ADD(MC6802P_TAG, M6802, XTAL(4'000'000))
- MCFG_DEVICE_PROGRAM_MAP(multiscreen_mem)
+void c64_multiscreen_cartridge_device::device_add_mconfig(machine_config &config)
+{
+ m6802_cpu_device &cpu(M6802(config, MC6802P_TAG, XTAL(4'000'000)));
+ cpu.set_addrmap(AS_PROGRAM, &c64_multiscreen_cartridge_device::multiscreen_mem);
- MCFG_DEVICE_ADD(MC6821P_0_TAG, PIA6821, 0)
- MCFG_DEVICE_ADD(MC6821P_1_TAG, PIA6821, 0)
-MACHINE_CONFIG_END
+ PIA6821(config, MC6821P_0_TAG, 0);
+ PIA6821(config, MC6821P_1_TAG, 0);
+}
//**************************************************************************
@@ -161,7 +162,7 @@ void c64_multiscreen_cartridge_device::device_reset()
// c64_cd_r - cartridge data read
//-------------------------------------------------
-uint8_t c64_multiscreen_cartridge_device::c64_cd_r(address_space &space, offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2)
+uint8_t c64_multiscreen_cartridge_device::c64_cd_r(offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2)
{
if (!roml)
{
@@ -198,7 +199,7 @@ uint8_t c64_multiscreen_cartridge_device::c64_cd_r(address_space &space, offs_t
// c64_cd_w - cartridge data write
//-------------------------------------------------
-void c64_multiscreen_cartridge_device::c64_cd_w(address_space &space, offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2)
+void c64_multiscreen_cartridge_device::c64_cd_w(offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2)
{
if (offset >= 0x8000 && offset < 0xa000)
{
diff --git a/src/devices/bus/c64/multiscreen.h b/src/devices/bus/c64/multiscreen.h
index 9d26edb723a..619154d18c5 100644
--- a/src/devices/bus/c64/multiscreen.h
+++ b/src/devices/bus/c64/multiscreen.h
@@ -41,8 +41,8 @@ protected:
virtual void device_add_mconfig(machine_config &config) override;
// device_c64_expansion_card_interface overrides
- virtual uint8_t c64_cd_r(address_space &space, offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2) override;
- virtual void c64_cd_w(address_space &space, offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2) override;
+ virtual uint8_t c64_cd_r(offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2) override;
+ virtual void c64_cd_w(offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2) override;
private:
uint8_t m_bank;
diff --git a/src/devices/bus/c64/music64.cpp b/src/devices/bus/c64/music64.cpp
index 7042774ec5d..9e31a26c62b 100644
--- a/src/devices/bus/c64/music64.cpp
+++ b/src/devices/bus/c64/music64.cpp
@@ -172,9 +172,9 @@ void c64_music64_cartridge_device::device_reset()
// c64_cd_r - cartridge data read
//-------------------------------------------------
-uint8_t c64_music64_cartridge_device::c64_cd_r(address_space &space, offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2)
+uint8_t c64_music64_cartridge_device::c64_cd_r(offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2)
{
- data = m_exp->cd_r(space, offset, data, sphi2, ba, roml, romh, io1, io2);
+ data = m_exp->cd_r(offset, data, sphi2, ba, roml, romh, io1, io2);
if (!io2)
{
@@ -194,9 +194,9 @@ uint8_t c64_music64_cartridge_device::c64_cd_r(address_space &space, offs_t offs
// c64_cd_w - cartridge data write
//-------------------------------------------------
-void c64_music64_cartridge_device::c64_cd_w(address_space &space, offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2)
+void c64_music64_cartridge_device::c64_cd_w(offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2)
{
- m_exp->cd_w(space, offset, data, sphi2, ba, roml, romh, io1, io2);
+ m_exp->cd_w(offset, data, sphi2, ba, roml, romh, io1, io2);
}
diff --git a/src/devices/bus/c64/music64.h b/src/devices/bus/c64/music64.h
index c9ae5414ac9..cf494c481b8 100644
--- a/src/devices/bus/c64/music64.h
+++ b/src/devices/bus/c64/music64.h
@@ -38,8 +38,8 @@ protected:
virtual ioport_constructor device_input_ports() const override;
// device_c64_expansion_card_interface overrides
- virtual uint8_t c64_cd_r(address_space &space, offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2) override;
- virtual void c64_cd_w(address_space &space, offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2) override;
+ virtual uint8_t c64_cd_r(offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2) override;
+ virtual void c64_cd_w(offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2) override;
virtual int c64_game_r(offs_t offset, int sphi2, int ba, int rw) override;
virtual int c64_exrom_r(offs_t offset, int sphi2, int ba, int rw) override;
diff --git a/src/devices/bus/c64/neoram.cpp b/src/devices/bus/c64/neoram.cpp
index a2576cebeeb..4cb34cbbb57 100644
--- a/src/devices/bus/c64/neoram.cpp
+++ b/src/devices/bus/c64/neoram.cpp
@@ -64,7 +64,7 @@ void c64_neoram_cartridge_device::device_reset()
// c64_cd_r - cartridge data read
//-------------------------------------------------
-uint8_t c64_neoram_cartridge_device::c64_cd_r(address_space &space, offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2)
+uint8_t c64_neoram_cartridge_device::c64_cd_r(offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2)
{
if (!io1)
{
@@ -80,7 +80,7 @@ uint8_t c64_neoram_cartridge_device::c64_cd_r(address_space &space, offs_t offse
// c64_cd_w - cartridge data write
//-------------------------------------------------
-void c64_neoram_cartridge_device::c64_cd_w(address_space &space, offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2)
+void c64_neoram_cartridge_device::c64_cd_w(offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2)
{
if (!io1)
{
diff --git a/src/devices/bus/c64/neoram.h b/src/devices/bus/c64/neoram.h
index e75a76cd088..d5058b878b7 100644
--- a/src/devices/bus/c64/neoram.h
+++ b/src/devices/bus/c64/neoram.h
@@ -41,8 +41,8 @@ protected:
virtual void nvram_write(emu_file &file) override { if (m_nvram != nullptr) { file.write(m_nvram, m_nvram.bytes()); } }
// device_c64_expansion_card_interface overrides
- virtual uint8_t c64_cd_r(address_space &space, offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2) override;
- virtual void c64_cd_w(address_space &space, offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2) override;
+ virtual uint8_t c64_cd_r(offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2) override;
+ virtual void c64_cd_w(offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2) override;
private:
uint16_t m_bank;
diff --git a/src/devices/bus/c64/ocean.cpp b/src/devices/bus/c64/ocean.cpp
index 6f4fecda52f..92b18de6a51 100644
--- a/src/devices/bus/c64/ocean.cpp
+++ b/src/devices/bus/c64/ocean.cpp
@@ -82,7 +82,7 @@ void c64_ocean_cartridge_device::device_reset()
// c64_cd_r - cartridge data read
//-------------------------------------------------
-uint8_t c64_ocean_cartridge_device::c64_cd_r(address_space &space, offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2)
+uint8_t c64_ocean_cartridge_device::c64_cd_r(offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2)
{
if (!roml && m_roml.bytes())
{
@@ -107,7 +107,7 @@ uint8_t c64_ocean_cartridge_device::c64_cd_r(address_space &space, offs_t offset
// c64_cd_w - cartridge data write
//-------------------------------------------------
-void c64_ocean_cartridge_device::c64_cd_w(address_space &space, offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2)
+void c64_ocean_cartridge_device::c64_cd_w(offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2)
{
if (!io1)
{
diff --git a/src/devices/bus/c64/ocean.h b/src/devices/bus/c64/ocean.h
index 1af2101b3fa..9a78f5e21f9 100644
--- a/src/devices/bus/c64/ocean.h
+++ b/src/devices/bus/c64/ocean.h
@@ -35,8 +35,8 @@ protected:
virtual void device_reset() override;
// device_c64_expansion_card_interface overrides
- virtual uint8_t c64_cd_r(address_space &space, offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2) override;
- virtual void c64_cd_w(address_space &space, offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2) override;
+ virtual uint8_t c64_cd_r(offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2) override;
+ virtual void c64_cd_w(offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2) override;
private:
uint8_t m_bank;
diff --git a/src/devices/bus/c64/pagefox.cpp b/src/devices/bus/c64/pagefox.cpp
index 975f64d5408..80264aab13b 100644
--- a/src/devices/bus/c64/pagefox.cpp
+++ b/src/devices/bus/c64/pagefox.cpp
@@ -85,7 +85,7 @@ void c64_pagefox_cartridge_device::device_reset()
// c64_cd_r - cartridge data read
//-------------------------------------------------
-uint8_t c64_pagefox_cartridge_device::c64_cd_r(address_space &space, offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2)
+uint8_t c64_pagefox_cartridge_device::c64_cd_r(offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2)
{
if (!roml || !romh)
{
@@ -110,7 +110,7 @@ uint8_t c64_pagefox_cartridge_device::c64_cd_r(address_space &space, offs_t offs
// c64_cd_w - cartridge data write
//-------------------------------------------------
-void c64_pagefox_cartridge_device::c64_cd_w(address_space &space, offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2)
+void c64_pagefox_cartridge_device::c64_cd_w(offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2)
{
if (offset >= 0x8000 && offset < 0xc000)
{
diff --git a/src/devices/bus/c64/pagefox.h b/src/devices/bus/c64/pagefox.h
index 25eedac9eb0..74ed5a4edf0 100644
--- a/src/devices/bus/c64/pagefox.h
+++ b/src/devices/bus/c64/pagefox.h
@@ -35,8 +35,8 @@ protected:
virtual void device_reset() override;
// device_c64_expansion_card_interface overrides
- virtual uint8_t c64_cd_r(address_space &space, offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2) override;
- virtual void c64_cd_w(address_space &space, offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2) override;
+ virtual uint8_t c64_cd_r(offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2) override;
+ virtual void c64_cd_w(offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2) override;
private:
optional_shared_ptr<uint8_t> m_ram;
diff --git a/src/devices/bus/c64/partner.cpp b/src/devices/bus/c64/partner.cpp
index 9f198bc1220..55e4d07f3e1 100644
--- a/src/devices/bus/c64/partner.cpp
+++ b/src/devices/bus/c64/partner.cpp
@@ -120,7 +120,7 @@ void c64_partner_cartridge_device::device_reset()
// c64_cd_r - cartridge data read
//-------------------------------------------------
-uint8_t c64_partner_cartridge_device::c64_cd_r(address_space &space, offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2)
+uint8_t c64_partner_cartridge_device::c64_cd_r(offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2)
{
if (!io1)
{
@@ -154,7 +154,7 @@ uint8_t c64_partner_cartridge_device::c64_cd_r(address_space &space, offs_t offs
// c64_cd_w - cartridge data write
//-------------------------------------------------
-void c64_partner_cartridge_device::c64_cd_w(address_space &space, offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2)
+void c64_partner_cartridge_device::c64_cd_w(offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2)
{
if (!io1)
{
diff --git a/src/devices/bus/c64/partner.h b/src/devices/bus/c64/partner.h
index cfd82208a8b..6ecf4503a91 100644
--- a/src/devices/bus/c64/partner.h
+++ b/src/devices/bus/c64/partner.h
@@ -39,8 +39,8 @@ protected:
virtual void device_reset() override;
// device_c64_expansion_card_interface overrides
- virtual uint8_t c64_cd_r(address_space &space, offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2) override;
- virtual void c64_cd_w(address_space &space, offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2) override;
+ virtual uint8_t c64_cd_r(offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2) override;
+ virtual void c64_cd_w(offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2) override;
virtual int c64_game_r(offs_t offset, int sphi2, int ba, int rw) override;
private:
diff --git a/src/devices/bus/c64/prophet64.cpp b/src/devices/bus/c64/prophet64.cpp
index 3b84ea81a5d..ea5e16a3000 100644
--- a/src/devices/bus/c64/prophet64.cpp
+++ b/src/devices/bus/c64/prophet64.cpp
@@ -61,7 +61,7 @@ void c64_prophet64_cartridge_device::device_reset()
// c64_cd_r - cartridge data read
//-------------------------------------------------
-uint8_t c64_prophet64_cartridge_device::c64_cd_r(address_space &space, offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2)
+uint8_t c64_prophet64_cartridge_device::c64_cd_r(offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2)
{
if (!roml)
{
@@ -77,7 +77,7 @@ uint8_t c64_prophet64_cartridge_device::c64_cd_r(address_space &space, offs_t of
// c64_cd_w - cartridge data write
//-------------------------------------------------
-void c64_prophet64_cartridge_device::c64_cd_w(address_space &space, offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2)
+void c64_prophet64_cartridge_device::c64_cd_w(offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2)
{
if (!io2)
{
diff --git a/src/devices/bus/c64/prophet64.h b/src/devices/bus/c64/prophet64.h
index af7b1c32544..f58ba30b7b7 100644
--- a/src/devices/bus/c64/prophet64.h
+++ b/src/devices/bus/c64/prophet64.h
@@ -34,8 +34,8 @@ protected:
virtual void device_reset() override;
// device_c64_expansion_card_interface overrides
- virtual uint8_t c64_cd_r(address_space &space, offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2) override;
- virtual void c64_cd_w(address_space &space, offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2) override;
+ virtual uint8_t c64_cd_r(offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2) override;
+ virtual void c64_cd_w(offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2) override;
private:
uint8_t m_bank;
diff --git a/src/devices/bus/c64/ps64.cpp b/src/devices/bus/c64/ps64.cpp
index b70c8a61c0f..c14008b2c08 100644
--- a/src/devices/bus/c64/ps64.cpp
+++ b/src/devices/bus/c64/ps64.cpp
@@ -61,25 +61,14 @@ DEFINE_DEVICE_TYPE(C64_PS64, c64_ps64_cartridge_device, "c64_ps64", "C64 PS-64")
//-------------------------------------------------
-// votrax_sc02_interface votrax_intf
-//-------------------------------------------------
-/*
-static struct votrax_sc02_interface votrax_intf =
-{
- DEVCB_NOOP
-};
-*/
-
-
-//-------------------------------------------------
// device_add_mconfig - add device configuration
//-------------------------------------------------
-MACHINE_CONFIG_START(c64_ps64_cartridge_device::device_add_mconfig)
- //MCFG_SPEAKER_STANDARD_MONO("mono")
- //MCFG_VOTRAX_SC02_ADD(SSI263_TAG, 2000000, votrax_intf)
- //MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.00)
-MACHINE_CONFIG_END
+void c64_ps64_cartridge_device::device_add_mconfig(machine_config &config)
+{
+ //SPEAKER(config, "speaker").front_center();
+ //VOTRAX_SC02(config, SSI263_TAG, 2000000).add_route(ALL_OUTPUTS, "mono", 1.00);
+}
@@ -120,7 +109,7 @@ void c64_ps64_cartridge_device::device_reset()
// c64_cd_r - cartridge data read
//-------------------------------------------------
-uint8_t c64_ps64_cartridge_device::c64_cd_r(address_space &space, offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2)
+uint8_t c64_ps64_cartridge_device::c64_cd_r(offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2)
{
if (!roml)
{
@@ -139,7 +128,7 @@ uint8_t c64_ps64_cartridge_device::c64_cd_r(address_space &space, offs_t offset,
// c64_cd_w - cartridge data write
//-------------------------------------------------
-void c64_ps64_cartridge_device::c64_cd_w(address_space &space, offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2)
+void c64_ps64_cartridge_device::c64_cd_w(offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2)
{
if (!io1)
{
diff --git a/src/devices/bus/c64/ps64.h b/src/devices/bus/c64/ps64.h
index 4d75432d51a..69a9c5b0110 100644
--- a/src/devices/bus/c64/ps64.h
+++ b/src/devices/bus/c64/ps64.h
@@ -39,8 +39,8 @@ protected:
virtual void device_add_mconfig(machine_config &config) override;
// device_c64_expansion_card_interface overrides
- virtual uint8_t c64_cd_r(address_space &space, offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2) override;
- virtual void c64_cd_w(address_space &space, offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2) override;
+ virtual uint8_t c64_cd_r(offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2) override;
+ virtual void c64_cd_w(offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2) override;
};
diff --git a/src/devices/bus/c64/reu.cpp b/src/devices/bus/c64/reu.cpp
index b7ab238e47e..332ac53f8a8 100644
--- a/src/devices/bus/c64/reu.cpp
+++ b/src/devices/bus/c64/reu.cpp
@@ -31,12 +31,12 @@ DEFINE_DEVICE_TYPE(C64_REU1764, c64_reu1764_cartridge_device, "c64_1764reu", "17
// device_add_mconfig - add device configuration
//-------------------------------------------------
-MACHINE_CONFIG_START(c64_reu_cartridge_device::device_add_mconfig)
- MCFG_MOS8726_ADD(MOS8726R1_TAG)
+void c64_reu_cartridge_device::device_add_mconfig(machine_config &config)
+{
+ MOS8726(config, m_dmac, 1000000); // dummy clock
- MCFG_GENERIC_SOCKET_ADD("rom", generic_linear_slot, nullptr)
- MCFG_GENERIC_EXTENSIONS("bin,rom")
-MACHINE_CONFIG_END
+ GENERIC_SOCKET(config, m_eprom, generic_linear_slot, nullptr, "bin,rom");
+}
@@ -99,15 +99,15 @@ void c64_reu_cartridge_device::device_reset()
// c64_cd_r - cartridge data read
//-------------------------------------------------
-uint8_t c64_reu_cartridge_device::c64_cd_r(address_space &space, offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2)
+uint8_t c64_reu_cartridge_device::c64_cd_r(offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2)
{
if (!m_dmac->romsel_r(roml, romh))
{
- data = m_eprom->read_rom(space, offset & 0x7fff);
+ data = m_eprom->read_rom(offset & 0x7fff);
}
else if (!io2)
{
- data = m_dmac->read(space, offset);
+ data = m_dmac->read(offset);
}
return data;
@@ -118,10 +118,10 @@ uint8_t c64_reu_cartridge_device::c64_cd_r(address_space &space, offs_t offset,
// c64_cd_w - cartridge data write
//-------------------------------------------------
-void c64_reu_cartridge_device::c64_cd_w(address_space &space, offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2)
+void c64_reu_cartridge_device::c64_cd_w(offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2)
{
if (!io2)
{
- m_dmac->write(space, offset, data);
+ m_dmac->write(offset, data);
}
}
diff --git a/src/devices/bus/c64/reu.h b/src/devices/bus/c64/reu.h
index dd8b9e32d5f..0cbb67d9576 100644
--- a/src/devices/bus/c64/reu.h
+++ b/src/devices/bus/c64/reu.h
@@ -47,8 +47,8 @@ protected:
virtual void device_add_mconfig(machine_config &config) override;
// device_c64_expansion_card_interface overrides
- virtual uint8_t c64_cd_r(address_space &space, offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2) override;
- virtual void c64_cd_w(address_space &space, offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2) override;
+ virtual uint8_t c64_cd_r(offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2) override;
+ virtual void c64_cd_w(offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2) override;
required_device<mos8726_device> m_dmac;
required_device<generic_slot_device> m_eprom;
diff --git a/src/devices/bus/c64/rex.cpp b/src/devices/bus/c64/rex.cpp
index 73bcdaf453a..97fecd740af 100644
--- a/src/devices/bus/c64/rex.cpp
+++ b/src/devices/bus/c64/rex.cpp
@@ -57,7 +57,7 @@ void c64_rex_cartridge_device::device_reset()
// c64_cd_r - cartridge data read
//-------------------------------------------------
-uint8_t c64_rex_cartridge_device::c64_cd_r(address_space &space, offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2)
+uint8_t c64_rex_cartridge_device::c64_cd_r(offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2)
{
if (!roml)
{
diff --git a/src/devices/bus/c64/rex.h b/src/devices/bus/c64/rex.h
index 42d565971ed..cc0cccb52da 100644
--- a/src/devices/bus/c64/rex.h
+++ b/src/devices/bus/c64/rex.h
@@ -35,7 +35,7 @@ protected:
virtual void device_reset() override;
// device_c64_expansion_card_interface overrides
- virtual uint8_t c64_cd_r(address_space &space, offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2) override;
+ virtual uint8_t c64_cd_r(offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2) override;
};
diff --git a/src/devices/bus/c64/rex_ep256.cpp b/src/devices/bus/c64/rex_ep256.cpp
index 67f1ce015b9..da1f7b601b7 100644
--- a/src/devices/bus/c64/rex_ep256.cpp
+++ b/src/devices/bus/c64/rex_ep256.cpp
@@ -22,24 +22,17 @@ DEFINE_DEVICE_TYPE(C64_REX_EP256, c64_rex_ep256_cartridge_device, "rexexp256", "
// device_add_mconfig - add device configuration
//-------------------------------------------------
-MACHINE_CONFIG_START(c64_rex_ep256_cartridge_device::device_add_mconfig)
- MCFG_GENERIC_SOCKET_ADD("rom1", generic_linear_slot, nullptr)
- MCFG_GENERIC_EXTENSIONS("bin,rom")
- MCFG_GENERIC_SOCKET_ADD("rom2", generic_linear_slot, nullptr)
- MCFG_GENERIC_EXTENSIONS("bin,rom")
- MCFG_GENERIC_SOCKET_ADD("rom3", generic_linear_slot, nullptr)
- MCFG_GENERIC_EXTENSIONS("bin,rom")
- MCFG_GENERIC_SOCKET_ADD("rom4", generic_linear_slot, nullptr)
- MCFG_GENERIC_EXTENSIONS("bin,rom")
- MCFG_GENERIC_SOCKET_ADD("rom5", generic_linear_slot, nullptr)
- MCFG_GENERIC_EXTENSIONS("bin,rom")
- MCFG_GENERIC_SOCKET_ADD("rom6", generic_linear_slot, nullptr)
- MCFG_GENERIC_EXTENSIONS("bin,rom")
- MCFG_GENERIC_SOCKET_ADD("rom7", generic_linear_slot, nullptr)
- MCFG_GENERIC_EXTENSIONS("bin,rom")
- MCFG_GENERIC_SOCKET_ADD("rom8", generic_linear_slot, nullptr)
- MCFG_GENERIC_EXTENSIONS("bin,rom")
-MACHINE_CONFIG_END
+void c64_rex_ep256_cartridge_device::device_add_mconfig(machine_config &config)
+{
+ GENERIC_SOCKET(config, "rom1", generic_linear_slot, nullptr, "bin,rom");
+ GENERIC_SOCKET(config, "rom2", generic_linear_slot, nullptr, "bin,rom");
+ GENERIC_SOCKET(config, "rom3", generic_linear_slot, nullptr, "bin,rom");
+ GENERIC_SOCKET(config, "rom4", generic_linear_slot, nullptr, "bin,rom");
+ GENERIC_SOCKET(config, "rom5", generic_linear_slot, nullptr, "bin,rom");
+ GENERIC_SOCKET(config, "rom6", generic_linear_slot, nullptr, "bin,rom");
+ GENERIC_SOCKET(config, "rom7", generic_linear_slot, nullptr, "bin,rom");
+ GENERIC_SOCKET(config, "rom8", generic_linear_slot, nullptr, "bin,rom");
+}
@@ -94,7 +87,7 @@ void c64_rex_ep256_cartridge_device::device_reset()
// c64_cd_r - cartridge data read
//-------------------------------------------------
-uint8_t c64_rex_ep256_cartridge_device::c64_cd_r(address_space &space, offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2)
+uint8_t c64_rex_ep256_cartridge_device::c64_cd_r(offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2)
{
if (!roml)
{
@@ -105,7 +98,7 @@ uint8_t c64_rex_ep256_cartridge_device::c64_cd_r(address_space &space, offs_t of
else
{
offs_t addr = (m_bank << 13) | (offset & 0x1fff);
- data = m_eproms[m_socket]->read_rom(space, addr);
+ data = m_eproms[m_socket]->read_rom(addr);
}
}
else if (!io2)
@@ -128,7 +121,7 @@ uint8_t c64_rex_ep256_cartridge_device::c64_cd_r(address_space &space, offs_t of
// c64_cd_w - cartridge data write
//-------------------------------------------------
-void c64_rex_ep256_cartridge_device::c64_cd_w(address_space &space, offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2)
+void c64_rex_ep256_cartridge_device::c64_cd_w(offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2)
{
if (!io2 && ((offset & 0xf0) == 0xa0))
{
diff --git a/src/devices/bus/c64/rex_ep256.h b/src/devices/bus/c64/rex_ep256.h
index 536929d8cdb..06f4a4325d5 100644
--- a/src/devices/bus/c64/rex_ep256.h
+++ b/src/devices/bus/c64/rex_ep256.h
@@ -40,8 +40,8 @@ protected:
virtual void device_add_mconfig(machine_config &config) override;
// device_c64_expansion_card_interface overrides
- virtual uint8_t c64_cd_r(address_space &space, offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2) override;
- virtual void c64_cd_w(address_space &space, offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2) override;
+ virtual uint8_t c64_cd_r(offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2) override;
+ virtual void c64_cd_w(offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2) override;
private:
generic_slot_device *m_eproms[8];
diff --git a/src/devices/bus/c64/ross.cpp b/src/devices/bus/c64/ross.cpp
index 827f98f9401..25c1a996df8 100644
--- a/src/devices/bus/c64/ross.cpp
+++ b/src/devices/bus/c64/ross.cpp
@@ -62,7 +62,7 @@ void c64_ross_cartridge_device::device_reset()
// c64_cd_r - cartridge data read
//-------------------------------------------------
-uint8_t c64_ross_cartridge_device::c64_cd_r(address_space &space, offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2)
+uint8_t c64_ross_cartridge_device::c64_cd_r(offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2)
{
if (!roml || !romh)
{
@@ -79,7 +79,7 @@ uint8_t c64_ross_cartridge_device::c64_cd_r(address_space &space, offs_t offset,
// c64_cd_w - cartridge data write
//-------------------------------------------------
-void c64_ross_cartridge_device::c64_cd_w(address_space &space, offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2)
+void c64_ross_cartridge_device::c64_cd_w(offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2)
{
if (!io1)
{
diff --git a/src/devices/bus/c64/ross.h b/src/devices/bus/c64/ross.h
index c36e616948d..97f2698fb6c 100644
--- a/src/devices/bus/c64/ross.h
+++ b/src/devices/bus/c64/ross.h
@@ -35,8 +35,8 @@ protected:
virtual void device_reset() override;
// device_c64_expansion_card_interface overrides
- virtual uint8_t c64_cd_r(address_space &space, offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2) override;
- virtual void c64_cd_w(address_space &space, offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2) override;
+ virtual uint8_t c64_cd_r(offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2) override;
+ virtual void c64_cd_w(offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2) override;
private:
uint8_t m_bank;
diff --git a/src/devices/bus/c64/sfx_sound_expander.cpp b/src/devices/bus/c64/sfx_sound_expander.cpp
index bf55a2994df..71229014c46 100644
--- a/src/devices/bus/c64/sfx_sound_expander.cpp
+++ b/src/devices/bus/c64/sfx_sound_expander.cpp
@@ -206,9 +206,9 @@ void c64_sfx_sound_expander_cartridge_device::device_reset()
// c64_cd_r - cartridge data read
//-------------------------------------------------
-uint8_t c64_sfx_sound_expander_cartridge_device::c64_cd_r(address_space &space, offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2)
+uint8_t c64_sfx_sound_expander_cartridge_device::c64_cd_r(offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2)
{
- data = m_exp->cd_r(space, get_offset(offset, 1), data, sphi2, ba, roml, romh, io1, io2);
+ data = m_exp->cd_r(get_offset(offset, 1), data, sphi2, ba, roml, romh, io1, io2);
if (!io2 && sphi2)
{
@@ -219,7 +219,7 @@ uint8_t c64_sfx_sound_expander_cartridge_device::c64_cd_r(address_space &space,
if (BIT(offset, 5))
{
- data = m_opl->read(space, BIT(offset, 4));
+ data = m_opl->read(BIT(offset, 4));
}
}
@@ -231,14 +231,14 @@ uint8_t c64_sfx_sound_expander_cartridge_device::c64_cd_r(address_space &space,
// c64_cd_w - cartridge data write
//-------------------------------------------------
-void c64_sfx_sound_expander_cartridge_device::c64_cd_w(address_space &space, offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2)
+void c64_sfx_sound_expander_cartridge_device::c64_cd_w(offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2)
{
if (!io2 && sphi2)
{
- m_opl->write(space, BIT(offset, 4), data);
+ m_opl->write(BIT(offset, 4), data);
}
- m_exp->cd_w(space, get_offset(offset, 0), data, sphi2, ba, roml, romh, io1, io2);
+ m_exp->cd_w(get_offset(offset, 0), data, sphi2, ba, roml, romh, io1, io2);
}
diff --git a/src/devices/bus/c64/sfx_sound_expander.h b/src/devices/bus/c64/sfx_sound_expander.h
index eb402bf1e54..9380e055c18 100644
--- a/src/devices/bus/c64/sfx_sound_expander.h
+++ b/src/devices/bus/c64/sfx_sound_expander.h
@@ -39,8 +39,8 @@ protected:
virtual ioport_constructor device_input_ports() const override;
// device_c64_expansion_card_interface overrides
- virtual uint8_t c64_cd_r(address_space &space, offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2) override;
- virtual void c64_cd_w(address_space &space, offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2) override;
+ virtual uint8_t c64_cd_r(offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2) override;
+ virtual void c64_cd_w(offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2) override;
virtual int c64_game_r(offs_t offset, int sphi2, int ba, int rw) override;
virtual int c64_exrom_r(offs_t offset, int sphi2, int ba, int rw) override;
diff --git a/src/devices/bus/c64/silverrock.cpp b/src/devices/bus/c64/silverrock.cpp
index a34f21d17a7..f52efc569b6 100644
--- a/src/devices/bus/c64/silverrock.cpp
+++ b/src/devices/bus/c64/silverrock.cpp
@@ -92,7 +92,7 @@ void c64_silverrock_cartridge_device::device_reset()
// c64_cd_r - cartridge data read
//-------------------------------------------------
-uint8_t c64_silverrock_cartridge_device::c64_cd_r(address_space &space, offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2)
+uint8_t c64_silverrock_cartridge_device::c64_cd_r(offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2)
{
if (!roml)
{
@@ -109,7 +109,7 @@ uint8_t c64_silverrock_cartridge_device::c64_cd_r(address_space &space, offs_t o
// c64_cd_w - cartridge data write
//-------------------------------------------------
-void c64_silverrock_cartridge_device::c64_cd_w(address_space &space, offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2)
+void c64_silverrock_cartridge_device::c64_cd_w(offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2)
{
if (!io1)
{
diff --git a/src/devices/bus/c64/silverrock.h b/src/devices/bus/c64/silverrock.h
index 4bd33a4db71..3d9c4e015f2 100644
--- a/src/devices/bus/c64/silverrock.h
+++ b/src/devices/bus/c64/silverrock.h
@@ -35,8 +35,8 @@ protected:
virtual void device_reset() override;
// device_c64_expansion_card_interface overrides
- virtual uint8_t c64_cd_r(address_space &space, offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2) override;
- virtual void c64_cd_w(address_space &space, offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2) override;
+ virtual uint8_t c64_cd_r(offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2) override;
+ virtual void c64_cd_w(offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2) override;
private:
uint8_t m_bank;
diff --git a/src/devices/bus/c64/simons_basic.cpp b/src/devices/bus/c64/simons_basic.cpp
index 043d43531c0..246e67b8b56 100644
--- a/src/devices/bus/c64/simons_basic.cpp
+++ b/src/devices/bus/c64/simons_basic.cpp
@@ -57,7 +57,7 @@ void c64_simons_basic_cartridge_device::device_reset()
// c64_cd_r - cartridge data read
//-------------------------------------------------
-uint8_t c64_simons_basic_cartridge_device::c64_cd_r(address_space &space, offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2)
+uint8_t c64_simons_basic_cartridge_device::c64_cd_r(offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2)
{
if (!roml)
{
@@ -76,7 +76,7 @@ uint8_t c64_simons_basic_cartridge_device::c64_cd_r(address_space &space, offs_t
// c64_cd_w - cartridge data write
//-------------------------------------------------
-void c64_simons_basic_cartridge_device::c64_cd_w(address_space &space, offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2)
+void c64_simons_basic_cartridge_device::c64_cd_w(offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2)
{
if (!io1)
{
diff --git a/src/devices/bus/c64/simons_basic.h b/src/devices/bus/c64/simons_basic.h
index 9f9cd5a1636..63d2dfb5cb9 100644
--- a/src/devices/bus/c64/simons_basic.h
+++ b/src/devices/bus/c64/simons_basic.h
@@ -35,8 +35,8 @@ protected:
virtual void device_reset() override;
// device_c64_expansion_card_interface overrides
- virtual uint8_t c64_cd_r(address_space &space, offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2) override;
- virtual void c64_cd_w(address_space &space, offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2) override;
+ virtual uint8_t c64_cd_r(offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2) override;
+ virtual void c64_cd_w(offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2) override;
};
diff --git a/src/devices/bus/c64/speakeasy.cpp b/src/devices/bus/c64/speakeasy.cpp
index 09427458fe7..23caee3488f 100644
--- a/src/devices/bus/c64/speakeasy.cpp
+++ b/src/devices/bus/c64/speakeasy.cpp
@@ -31,12 +31,12 @@ DEFINE_DEVICE_TYPE(C64_SPEAKEASY, c64_speakeasy_cartridge_device, "c64_speakeasy
// device_add_mconfig - add device configuration
//-------------------------------------------------
-MACHINE_CONFIG_START(c64_speakeasy_cartridge_device::device_add_mconfig)
+void c64_speakeasy_cartridge_device::device_add_mconfig(machine_config &config)
+{
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD(SC01A_TAG, VOTRAX_SC01, 720000)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.85)
-MACHINE_CONFIG_END
+ VOTRAX_SC01(config, m_votrax, 720000).add_route(ALL_OUTPUTS, "mono", 0.85);
+}
@@ -69,7 +69,7 @@ void c64_speakeasy_cartridge_device::device_start()
// c64_cd_r - cartridge data read
//-------------------------------------------------
-uint8_t c64_speakeasy_cartridge_device::c64_cd_r(address_space &space, offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2)
+uint8_t c64_speakeasy_cartridge_device::c64_cd_r(offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2)
{
if (!io1)
{
@@ -84,11 +84,11 @@ uint8_t c64_speakeasy_cartridge_device::c64_cd_r(address_space &space, offs_t of
// c64_cd_w - cartridge data write
//-------------------------------------------------
-void c64_speakeasy_cartridge_device::c64_cd_w(address_space &space, offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2)
+void c64_speakeasy_cartridge_device::c64_cd_w(offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2)
{
if (!io1)
{
- m_votrax->write(space, 0, data & 0x3f);
- m_votrax->inflection_w(space, 0, data >> 6);
+ m_votrax->write(data & 0x3f);
+ m_votrax->inflection_w(data >> 6);
}
}
diff --git a/src/devices/bus/c64/speakeasy.h b/src/devices/bus/c64/speakeasy.h
index 8c8ecdc9403..0816e4caa2e 100644
--- a/src/devices/bus/c64/speakeasy.h
+++ b/src/devices/bus/c64/speakeasy.h
@@ -36,8 +36,8 @@ protected:
virtual void device_add_mconfig(machine_config &config) override;
// device_c64_expansion_card_interface overrides
- virtual uint8_t c64_cd_r(address_space &space, offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2) override;
- virtual void c64_cd_w(address_space &space, offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2) override;
+ virtual uint8_t c64_cd_r(offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2) override;
+ virtual void c64_cd_w(offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2) override;
private:
required_device<votrax_sc01_device> m_votrax;
diff --git a/src/devices/bus/c64/stardos.cpp b/src/devices/bus/c64/stardos.cpp
index c8e47d300e8..601ada2778c 100644
--- a/src/devices/bus/c64/stardos.cpp
+++ b/src/devices/bus/c64/stardos.cpp
@@ -138,7 +138,7 @@ void c64_stardos_cartridge_device::device_start()
// c64_cd_r - cartridge data read
//-------------------------------------------------
-uint8_t c64_stardos_cartridge_device::c64_cd_r(address_space &space, offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2)
+uint8_t c64_stardos_cartridge_device::c64_cd_r(offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2)
{
if (!roml || !romh)
{
@@ -162,7 +162,7 @@ uint8_t c64_stardos_cartridge_device::c64_cd_r(address_space &space, offs_t offs
// c64_cd_w - cartridge data write
//-------------------------------------------------
-void c64_stardos_cartridge_device::c64_cd_w(address_space &space, offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2)
+void c64_stardos_cartridge_device::c64_cd_w(offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2)
{
if (!io1)
{
diff --git a/src/devices/bus/c64/stardos.h b/src/devices/bus/c64/stardos.h
index d9c8699a991..9be9f599957 100644
--- a/src/devices/bus/c64/stardos.h
+++ b/src/devices/bus/c64/stardos.h
@@ -38,8 +38,8 @@ protected:
virtual void device_start() override;
// device_c64_expansion_card_interface overrides
- virtual uint8_t c64_cd_r(address_space &space, offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2) override;
- virtual void c64_cd_w(address_space &space, offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2) override;
+ virtual uint8_t c64_cd_r(offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2) override;
+ virtual void c64_cd_w(offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2) override;
virtual int c64_game_r(offs_t offset, int sphi2, int ba, int rw) override;
virtual int c64_exrom_r(offs_t offset, int sphi2, int ba, int rw) override;
diff --git a/src/devices/bus/c64/std.cpp b/src/devices/bus/c64/std.cpp
index fac9d021696..08f4c1d65e0 100644
--- a/src/devices/bus/c64/std.cpp
+++ b/src/devices/bus/c64/std.cpp
@@ -47,7 +47,7 @@ void c64_standard_cartridge_device::device_start()
// c64_cd_r - cartridge data read
//-------------------------------------------------
-uint8_t c64_standard_cartridge_device::c64_cd_r(address_space &space, offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2)
+uint8_t c64_standard_cartridge_device::c64_cd_r(offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2)
{
if (!roml && m_roml.bytes())
{
diff --git a/src/devices/bus/c64/std.h b/src/devices/bus/c64/std.h
index 8a2599fe7bd..391e9ac973f 100644
--- a/src/devices/bus/c64/std.h
+++ b/src/devices/bus/c64/std.h
@@ -34,7 +34,7 @@ protected:
virtual void device_start() override;
// device_c64_expansion_card_interface overrides
- virtual uint8_t c64_cd_r(address_space &space, offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2) override;
+ virtual uint8_t c64_cd_r(offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2) override;
};
diff --git a/src/devices/bus/c64/structured_basic.cpp b/src/devices/bus/c64/structured_basic.cpp
index 2f968643b7d..e7773c772c0 100644
--- a/src/devices/bus/c64/structured_basic.cpp
+++ b/src/devices/bus/c64/structured_basic.cpp
@@ -62,7 +62,7 @@ void c64_structured_basic_cartridge_device::device_reset()
// c64_cd_r - cartridge data read
//-------------------------------------------------
-uint8_t c64_structured_basic_cartridge_device::c64_cd_r(address_space &space, offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2)
+uint8_t c64_structured_basic_cartridge_device::c64_cd_r(offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2)
{
if (!roml)
{
@@ -79,7 +79,7 @@ uint8_t c64_structured_basic_cartridge_device::c64_cd_r(address_space &space, of
// c64_cd_w - cartridge data write
//-------------------------------------------------
-void c64_structured_basic_cartridge_device::c64_cd_w(address_space &space, offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2)
+void c64_structured_basic_cartridge_device::c64_cd_w(offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2)
{
if (!io1)
{
diff --git a/src/devices/bus/c64/structured_basic.h b/src/devices/bus/c64/structured_basic.h
index 7b36402dcf5..44d370cdb3f 100644
--- a/src/devices/bus/c64/structured_basic.h
+++ b/src/devices/bus/c64/structured_basic.h
@@ -35,8 +35,8 @@ protected:
virtual void device_reset() override;
// device_c64_expansion_card_interface overrides
- virtual uint8_t c64_cd_r(address_space &space, offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2) override;
- virtual void c64_cd_w(address_space &space, offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2) override;
+ virtual uint8_t c64_cd_r(offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2) override;
+ virtual void c64_cd_w(offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2) override;
private:
uint8_t m_bank;
diff --git a/src/devices/bus/c64/super_explode.cpp b/src/devices/bus/c64/super_explode.cpp
index 88e7a9b48ab..4ed2456bd2a 100644
--- a/src/devices/bus/c64/super_explode.cpp
+++ b/src/devices/bus/c64/super_explode.cpp
@@ -85,7 +85,7 @@ void c64_super_explode_cartridge_device::device_timer(emu_timer &timer, device_t
// c64_cd_r - cartridge data read
//-------------------------------------------------
-uint8_t c64_super_explode_cartridge_device::c64_cd_r(address_space &space, offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2)
+uint8_t c64_super_explode_cartridge_device::c64_cd_r(offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2)
{
if (!roml)
{
@@ -112,7 +112,7 @@ uint8_t c64_super_explode_cartridge_device::c64_cd_r(address_space &space, offs_
// c64_cd_w - cartridge data write
//-------------------------------------------------
-void c64_super_explode_cartridge_device::c64_cd_w(address_space &space, offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2)
+void c64_super_explode_cartridge_device::c64_cd_w(offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2)
{
if (!io1)
{
diff --git a/src/devices/bus/c64/super_explode.h b/src/devices/bus/c64/super_explode.h
index 74edade0e6e..ca3abdeebf5 100644
--- a/src/devices/bus/c64/super_explode.h
+++ b/src/devices/bus/c64/super_explode.h
@@ -36,8 +36,8 @@ protected:
virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override;
// device_c64_expansion_card_interface overrides
- virtual uint8_t c64_cd_r(address_space &space, offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2) override;
- virtual void c64_cd_w(address_space &space, offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2) override;
+ virtual uint8_t c64_cd_r(offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2) override;
+ virtual void c64_cd_w(offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2) override;
private:
uint8_t m_bank;
diff --git a/src/devices/bus/c64/super_games.cpp b/src/devices/bus/c64/super_games.cpp
index 7a58d29cd57..610861c360e 100644
--- a/src/devices/bus/c64/super_games.cpp
+++ b/src/devices/bus/c64/super_games.cpp
@@ -60,7 +60,7 @@ void c64_super_games_cartridge_device::device_reset()
// c64_cd_r - cartridge data read
//-------------------------------------------------
-uint8_t c64_super_games_cartridge_device::c64_cd_r(address_space &space, offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2)
+uint8_t c64_super_games_cartridge_device::c64_cd_r(offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2)
{
if (!roml || !romh)
{
@@ -76,7 +76,7 @@ uint8_t c64_super_games_cartridge_device::c64_cd_r(address_space &space, offs_t
// c64_cd_w - cartridge data write
//-------------------------------------------------
-void c64_super_games_cartridge_device::c64_cd_w(address_space &space, offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2)
+void c64_super_games_cartridge_device::c64_cd_w(offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2)
{
if (!io2)
{
diff --git a/src/devices/bus/c64/super_games.h b/src/devices/bus/c64/super_games.h
index 64a50f9e240..11e4b44046a 100644
--- a/src/devices/bus/c64/super_games.h
+++ b/src/devices/bus/c64/super_games.h
@@ -35,8 +35,8 @@ protected:
virtual void device_reset() override;
// device_c64_expansion_card_interface overrides
- virtual uint8_t c64_cd_r(address_space &space, offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2) override;
- virtual void c64_cd_w(address_space &space, offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2) override;
+ virtual uint8_t c64_cd_r(offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2) override;
+ virtual void c64_cd_w(offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2) override;
private:
uint8_t m_bank;
diff --git a/src/devices/bus/c64/supercpu.cpp b/src/devices/bus/c64/supercpu.cpp
index a517eecb016..4e48d77c35c 100644
--- a/src/devices/bus/c64/supercpu.cpp
+++ b/src/devices/bus/c64/supercpu.cpp
@@ -144,9 +144,9 @@ void c64_supercpu_device::device_reset()
// c64_cd_r - cartridge data read
//-------------------------------------------------
-uint8_t c64_supercpu_device::c64_cd_r(address_space &space, offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2)
+uint8_t c64_supercpu_device::c64_cd_r(offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2)
{
- data = m_exp->cd_r(space, offset, data, sphi2, ba, roml, romh, io1, io2);
+ data = m_exp->cd_r(offset, data, sphi2, ba, roml, romh, io1, io2);
switch (offset)
{
@@ -198,7 +198,7 @@ uint8_t c64_supercpu_device::c64_cd_r(address_space &space, offs_t offset, uint8
// c64_cd_w - cartridge data write
//-------------------------------------------------
-void c64_supercpu_device::c64_cd_w(address_space &space, offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2)
+void c64_supercpu_device::c64_cd_w(offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2)
{
switch (offset)
{
@@ -275,7 +275,7 @@ void c64_supercpu_device::c64_cd_w(address_space &space, offs_t offset, uint8_t
break;
}
- m_exp->cd_w(space, offset, data, sphi2, ba, roml, romh, io1, io2);
+ m_exp->cd_w(offset, data, sphi2, ba, roml, romh, io1, io2);
}
diff --git a/src/devices/bus/c64/supercpu.h b/src/devices/bus/c64/supercpu.h
index 006449400c1..73982328c31 100644
--- a/src/devices/bus/c64/supercpu.h
+++ b/src/devices/bus/c64/supercpu.h
@@ -40,8 +40,8 @@ protected:
virtual ioport_constructor device_input_ports() const override;
// device_c64_expansion_card_interface overrides
- virtual uint8_t c64_cd_r(address_space &space, offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2) override;
- virtual void c64_cd_w(address_space &space, offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2) override;
+ virtual uint8_t c64_cd_r(offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2) override;
+ virtual void c64_cd_w(offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2) override;
virtual int c64_game_r(offs_t offset, int sphi2, int ba, int rw) override;
virtual int c64_exrom_r(offs_t offset, int sphi2, int ba, int rw) override;
diff --git a/src/devices/bus/c64/sw8k.cpp b/src/devices/bus/c64/sw8k.cpp
index ff0e3310101..2f55b223797 100644
--- a/src/devices/bus/c64/sw8k.cpp
+++ b/src/devices/bus/c64/sw8k.cpp
@@ -103,7 +103,7 @@ void c64_switchable_8k_cartridge_device::device_reset()
// c64_cd_r - cartridge data read
//-------------------------------------------------
-uint8_t c64_switchable_8k_cartridge_device::c64_cd_r(address_space &space, offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2)
+uint8_t c64_switchable_8k_cartridge_device::c64_cd_r(offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2)
{
if (!roml)
{
diff --git a/src/devices/bus/c64/sw8k.h b/src/devices/bus/c64/sw8k.h
index 94bcb17b5a3..186e96792d6 100644
--- a/src/devices/bus/c64/sw8k.h
+++ b/src/devices/bus/c64/sw8k.h
@@ -38,7 +38,7 @@ protected:
virtual void device_reset() override;
// device_c64_expansion_card_interface overrides
- virtual uint8_t c64_cd_r(address_space &space, offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2) override;
+ virtual uint8_t c64_cd_r(offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2) override;
private:
required_ioport m_sw;
diff --git a/src/devices/bus/c64/swiftlink.cpp b/src/devices/bus/c64/swiftlink.cpp
index 3f807fb13dc..3855da85ca3 100644
--- a/src/devices/bus/c64/swiftlink.cpp
+++ b/src/devices/bus/c64/swiftlink.cpp
@@ -126,12 +126,12 @@ void c64_swiftlink_cartridge_device::device_reset()
// c64_cd_r - cartridge data read
//-------------------------------------------------
-uint8_t c64_swiftlink_cartridge_device::c64_cd_r(address_space &space, offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2)
+uint8_t c64_swiftlink_cartridge_device::c64_cd_r(offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2)
{
if (((m_cs == DE00) && !io1) || ((m_cs == DF00) && !io2) ||
((m_cs == D700) && ((offset & 0xff00) == 0xd700)))
{
- data = m_acia->read(space, offset & 0x03);
+ data = m_acia->read(offset & 0x03);
}
return data;
@@ -142,12 +142,12 @@ uint8_t c64_swiftlink_cartridge_device::c64_cd_r(address_space &space, offs_t of
// c64_cd_w - cartridge data write
//-------------------------------------------------
-void c64_swiftlink_cartridge_device::c64_cd_w(address_space &space, offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2)
+void c64_swiftlink_cartridge_device::c64_cd_w(offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2)
{
if (((m_cs == DE00) && !io1) || ((m_cs == DF00) && !io2) ||
((m_cs == D700) && ((offset & 0xff00) == 0xd700)))
{
- m_acia->write(space, offset & 0x03, data);
+ m_acia->write(offset & 0x03, data);
}
}
diff --git a/src/devices/bus/c64/swiftlink.h b/src/devices/bus/c64/swiftlink.h
index 0c1f577bafe..409cfafa33a 100644
--- a/src/devices/bus/c64/swiftlink.h
+++ b/src/devices/bus/c64/swiftlink.h
@@ -41,8 +41,8 @@ protected:
virtual ioport_constructor device_input_ports() const override;
// device_c64_expansion_card_interface overrides
- virtual uint8_t c64_cd_r(address_space &space, offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2) override;
- virtual void c64_cd_w(address_space &space, offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2) override;
+ virtual uint8_t c64_cd_r(offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2) override;
+ virtual void c64_cd_w(offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2) override;
private:
DECLARE_WRITE_LINE_MEMBER( acia_irq_w );
diff --git a/src/devices/bus/c64/system3.cpp b/src/devices/bus/c64/system3.cpp
index 7a1fd54ab3e..f02ef692b3b 100644
--- a/src/devices/bus/c64/system3.cpp
+++ b/src/devices/bus/c64/system3.cpp
@@ -60,7 +60,7 @@ void c64_system3_cartridge_device::device_reset()
// c64_cd_r - cartridge data read
//-------------------------------------------------
-uint8_t c64_system3_cartridge_device::c64_cd_r(address_space &space, offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2)
+uint8_t c64_system3_cartridge_device::c64_cd_r(offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2)
{
if (!roml)
{
@@ -82,7 +82,7 @@ uint8_t c64_system3_cartridge_device::c64_cd_r(address_space &space, offs_t offs
// c64_cd_w - cartridge data write
//-------------------------------------------------
-void c64_system3_cartridge_device::c64_cd_w(address_space &space, offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2)
+void c64_system3_cartridge_device::c64_cd_w(offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2)
{
if (!io1)
{
diff --git a/src/devices/bus/c64/system3.h b/src/devices/bus/c64/system3.h
index ff5ed78b53d..024798fc77e 100644
--- a/src/devices/bus/c64/system3.h
+++ b/src/devices/bus/c64/system3.h
@@ -35,8 +35,8 @@ protected:
virtual void device_reset() override;
// device_c64_expansion_card_interface overrides
- virtual uint8_t c64_cd_r(address_space &space, offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2) override;
- virtual void c64_cd_w(address_space &space, offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2) override;
+ virtual uint8_t c64_cd_r(offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2) override;
+ virtual void c64_cd_w(offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2) override;
private:
uint8_t m_bank;
diff --git a/src/devices/bus/c64/tdos.cpp b/src/devices/bus/c64/tdos.cpp
index a814ccc26a8..b52b61f57a4 100644
--- a/src/devices/bus/c64/tdos.cpp
+++ b/src/devices/bus/c64/tdos.cpp
@@ -230,9 +230,9 @@ void c64_tdos_cartridge_device::device_reset()
// c64_cd_r - cartridge data read
//-------------------------------------------------
-uint8_t c64_tdos_cartridge_device::c64_cd_r(address_space &space, offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2)
+uint8_t c64_tdos_cartridge_device::c64_cd_r(offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2)
{
- data = m_exp->cd_r(space, offset, data, sphi2, ba, roml, romh, io1, io2);
+ data = m_exp->cd_r(offset, data, sphi2, ba, roml, romh, io1, io2);
if (m_enabled && !roml)
{
@@ -244,7 +244,7 @@ uint8_t c64_tdos_cartridge_device::c64_cd_r(address_space &space, offs_t offset,
switch ((offset >> 1) & 0x7f)
{
case 0:
- data = m_ssda->read(space, offset & 0x01);
+ data = m_ssda->read(offset & 0x01);
break;
case 1:
@@ -277,16 +277,16 @@ uint8_t c64_tdos_cartridge_device::c64_cd_r(address_space &space, offs_t offset,
// c64_cd_w - cartridge data write
//-------------------------------------------------
-void c64_tdos_cartridge_device::c64_cd_w(address_space &space, offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2)
+void c64_tdos_cartridge_device::c64_cd_w(offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2)
{
- m_exp->cd_w(space, offset, data, sphi2, ba, roml, romh, io1, io2);
+ m_exp->cd_w(offset, data, sphi2, ba, roml, romh, io1, io2);
if (m_enabled && !io2 && sphi2)
{
switch ((offset >> 1) & 0x7f)
{
case 0:
- m_ssda->write(space, offset & 0x01, data);
+ m_ssda->write(offset & 0x01, data);
break;
case 1:
diff --git a/src/devices/bus/c64/tdos.h b/src/devices/bus/c64/tdos.h
index adf2bf874b5..49c1b07651c 100644
--- a/src/devices/bus/c64/tdos.h
+++ b/src/devices/bus/c64/tdos.h
@@ -39,8 +39,8 @@ protected:
virtual ioport_constructor device_input_ports() const override;
// device_c64_expansion_card_interface overrides
- virtual uint8_t c64_cd_r(address_space &space, offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2) override;
- virtual void c64_cd_w(address_space &space, offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2) override;
+ virtual uint8_t c64_cd_r(offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2) override;
+ virtual void c64_cd_w(offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2) override;
virtual int c64_game_r(offs_t offset, int sphi2, int ba, int rw) override;
virtual int c64_exrom_r(offs_t offset, int sphi2, int ba, int rw) override;
diff --git a/src/devices/bus/c64/turbo232.cpp b/src/devices/bus/c64/turbo232.cpp
index 4c6e5f1ebdb..f9113bed1c5 100644
--- a/src/devices/bus/c64/turbo232.cpp
+++ b/src/devices/bus/c64/turbo232.cpp
@@ -128,7 +128,7 @@ void c64_turbo232_cartridge_device::device_reset()
// c64_cd_r - cartridge data read
//-------------------------------------------------
-uint8_t c64_turbo232_cartridge_device::c64_cd_r(address_space &space, offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2)
+uint8_t c64_turbo232_cartridge_device::c64_cd_r(offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2)
{
if (((m_cs == DE00) && !io1) || ((m_cs == DF00) && !io2) ||
((m_cs == D700) && ((offset & 0xff00) == 0xd700)))
@@ -138,7 +138,7 @@ uint8_t c64_turbo232_cartridge_device::c64_cd_r(address_space &space, offs_t off
switch (offset & 0x07)
{
case 0: case 1: case 2: case 3:
- data = m_acia->read(space, offset & 0x03);
+ data = m_acia->read(offset & 0x03);
break;
case 7:
@@ -155,7 +155,7 @@ uint8_t c64_turbo232_cartridge_device::c64_cd_r(address_space &space, offs_t off
// c64_cd_w - cartridge data write
//-------------------------------------------------
-void c64_turbo232_cartridge_device::c64_cd_w(address_space &space, offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2)
+void c64_turbo232_cartridge_device::c64_cd_w(offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2)
{
if (((m_cs == DE00) && !io1) || ((m_cs == DF00) && !io2) ||
((m_cs == D700) && ((offset & 0xff00) == 0xd700)))
@@ -165,11 +165,11 @@ void c64_turbo232_cartridge_device::c64_cd_w(address_space &space, offs_t offset
switch (offset & 0x07)
{
case 0: case 1: case 2:
- m_acia->write(space, offset & 0x03, data);
+ m_acia->write(offset & 0x03, data);
break;
case 3:
- m_acia->write(space, offset & 0x03, data);
+ m_acia->write(offset & 0x03, data);
if (data & 0x0f)
m_es &= ~ES_M;
diff --git a/src/devices/bus/c64/turbo232.h b/src/devices/bus/c64/turbo232.h
index 177e044307d..4f5638f88fa 100644
--- a/src/devices/bus/c64/turbo232.h
+++ b/src/devices/bus/c64/turbo232.h
@@ -41,8 +41,8 @@ protected:
virtual ioport_constructor device_input_ports() const override;
// device_c64_expansion_card_interface overrides
- virtual uint8_t c64_cd_r(address_space &space, offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2) override;
- virtual void c64_cd_w(address_space &space, offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2) override;
+ virtual uint8_t c64_cd_r(offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2) override;
+ virtual void c64_cd_w(offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2) override;
private:
DECLARE_WRITE_LINE_MEMBER( acia_irq_w );
diff --git a/src/devices/bus/c64/vizastar.cpp b/src/devices/bus/c64/vizastar.cpp
index 444ff656b68..443c232bde7 100644
--- a/src/devices/bus/c64/vizastar.cpp
+++ b/src/devices/bus/c64/vizastar.cpp
@@ -79,7 +79,7 @@ void c64_vizastar_cartridge_device::device_start()
// c64_cd_r - cartridge data read
//-------------------------------------------------
-uint8_t c64_vizastar_cartridge_device::c64_cd_r(address_space &space, offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2)
+uint8_t c64_vizastar_cartridge_device::c64_cd_r(offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2)
{
if (!roml)
{
diff --git a/src/devices/bus/c64/vizastar.h b/src/devices/bus/c64/vizastar.h
index 95453eb6e38..26ec63cd46b 100644
--- a/src/devices/bus/c64/vizastar.h
+++ b/src/devices/bus/c64/vizastar.h
@@ -34,7 +34,7 @@ protected:
virtual void device_start() override;
// device_c64_expansion_card_interface overrides
- virtual uint8_t c64_cd_r(address_space &space, offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2) override;
+ virtual uint8_t c64_cd_r(offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2) override;
};
diff --git a/src/devices/bus/c64/vw64.cpp b/src/devices/bus/c64/vw64.cpp
index ea0d3c3dac2..bf4d584d40d 100644
--- a/src/devices/bus/c64/vw64.cpp
+++ b/src/devices/bus/c64/vw64.cpp
@@ -111,7 +111,7 @@ void c64_vizawrite_cartridge_device::device_timer(emu_timer &timer, device_timer
// c64_cd_r - cartridge data read
//-------------------------------------------------
-uint8_t c64_vizawrite_cartridge_device::c64_cd_r(address_space &space, offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2)
+uint8_t c64_vizawrite_cartridge_device::c64_cd_r(offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2)
{
if (!roml)
{
diff --git a/src/devices/bus/c64/vw64.h b/src/devices/bus/c64/vw64.h
index abff81acb4b..64287c0c785 100644
--- a/src/devices/bus/c64/vw64.h
+++ b/src/devices/bus/c64/vw64.h
@@ -36,7 +36,7 @@ protected:
virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override;
// device_c64_expansion_card_interface overrides
- virtual uint8_t c64_cd_r(address_space &space, offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2) override;
+ virtual uint8_t c64_cd_r(offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2) override;
virtual int c64_exrom_r(offs_t offset, int sphi2, int ba, int rw) override { return 0; }
private:
diff --git a/src/devices/bus/c64/warp_speed.cpp b/src/devices/bus/c64/warp_speed.cpp
index 3c266e3618d..ff485c05277 100644
--- a/src/devices/bus/c64/warp_speed.cpp
+++ b/src/devices/bus/c64/warp_speed.cpp
@@ -117,7 +117,7 @@ void c64_warp_speed_cartridge_device::device_reset()
// c64_cd_r - cartridge data read
//-------------------------------------------------
-uint8_t c64_warp_speed_cartridge_device::c64_cd_r(address_space &space, offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2)
+uint8_t c64_warp_speed_cartridge_device::c64_cd_r(offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2)
{
if (!roml || !romh || !io1 || !io2)
{
@@ -133,7 +133,7 @@ uint8_t c64_warp_speed_cartridge_device::c64_cd_r(address_space &space, offs_t o
// c64_cd_w - cartridge data write
//-------------------------------------------------
-void c64_warp_speed_cartridge_device::c64_cd_w(address_space &space, offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2)
+void c64_warp_speed_cartridge_device::c64_cd_w(offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2)
{
if (!io1)
{
diff --git a/src/devices/bus/c64/warp_speed.h b/src/devices/bus/c64/warp_speed.h
index 7a3b25cecfc..d5c61f50f49 100644
--- a/src/devices/bus/c64/warp_speed.h
+++ b/src/devices/bus/c64/warp_speed.h
@@ -38,8 +38,8 @@ protected:
virtual void device_reset() override;
// device_c64_expansion_card_interface overrides
- virtual uint8_t c64_cd_r(address_space &space, offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2) override;
- virtual void c64_cd_w(address_space &space, offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2) override;
+ virtual uint8_t c64_cd_r(offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2) override;
+ virtual void c64_cd_w(offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2) override;
};
diff --git a/src/devices/bus/c64/westermann.cpp b/src/devices/bus/c64/westermann.cpp
index 8cb86b39a1c..ac254733f01 100644
--- a/src/devices/bus/c64/westermann.cpp
+++ b/src/devices/bus/c64/westermann.cpp
@@ -57,7 +57,7 @@ void c64_westermann_cartridge_device::device_reset()
// c64_cd_r - cartridge data read
//-------------------------------------------------
-uint8_t c64_westermann_cartridge_device::c64_cd_r(address_space &space, offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2)
+uint8_t c64_westermann_cartridge_device::c64_cd_r(offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2)
{
if (!roml)
{
diff --git a/src/devices/bus/c64/westermann.h b/src/devices/bus/c64/westermann.h
index b9392c52f72..4b7b2e4389f 100644
--- a/src/devices/bus/c64/westermann.h
+++ b/src/devices/bus/c64/westermann.h
@@ -35,7 +35,7 @@ protected:
virtual void device_reset() override;
// device_c64_expansion_card_interface overrides
- virtual uint8_t c64_cd_r(address_space &space, offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2) override;
+ virtual uint8_t c64_cd_r(offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2) override;
};
diff --git a/src/devices/bus/c64/xl80.cpp b/src/devices/bus/c64/xl80.cpp
index fbeacd759b3..8e09508e2a3 100644
--- a/src/devices/bus/c64/xl80.cpp
+++ b/src/devices/bus/c64/xl80.cpp
@@ -123,14 +123,15 @@ GFXDECODE_END
// device_add_mconfig - add device configuration
//-------------------------------------------------
-MACHINE_CONFIG_START(c64_xl80_device::device_add_mconfig)
- MCFG_SCREEN_ADD_MONOCHROME(MC6845_SCREEN_TAG, RASTER, rgb_t::white())
- MCFG_SCREEN_UPDATE_DEVICE(HD46505SP_TAG, h46505_device, screen_update)
- MCFG_SCREEN_SIZE(80*8, 24*8)
- MCFG_SCREEN_VISIBLE_AREA(0, 80*8-1, 0, 24*8-1)
- MCFG_SCREEN_REFRESH_RATE(50)
-
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_c64_xl80)
+void c64_xl80_device::device_add_mconfig(machine_config &config)
+{
+ screen_device &screen(SCREEN(config, MC6845_SCREEN_TAG, SCREEN_TYPE_RASTER, rgb_t::white()));
+ screen.set_screen_update(HD46505SP_TAG, FUNC(h46505_device::screen_update));
+ screen.set_size(80*8, 24*8);
+ screen.set_visarea(0, 80*8-1, 0, 24*8-1);
+ screen.set_refresh_hz(50);
+
+ GFXDECODE(config, "gfxdecode", m_palette, gfx_c64_xl80);
PALETTE(config, m_palette, palette_device::MONOCHROME);
H46505(config, m_crtc, XTAL(14'318'181) / 8);
@@ -138,7 +139,7 @@ MACHINE_CONFIG_START(c64_xl80_device::device_add_mconfig)
m_crtc->set_show_border_area(true);
m_crtc->set_char_width(8);
m_crtc->set_update_row_callback(FUNC(c64_xl80_device::crtc_update_row), this);
-MACHINE_CONFIG_END
+}
@@ -185,13 +186,13 @@ void c64_xl80_device::device_reset()
// c64_cd_r - cartridge data read
//-------------------------------------------------
-uint8_t c64_xl80_device::c64_cd_r(address_space &space, offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2)
+uint8_t c64_xl80_device::c64_cd_r(offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2)
{
if (!io2 && BIT(offset, 2))
{
if (offset & 0x01)
{
- data = m_crtc->register_r(space, 0);
+ data = m_crtc->register_r();
}
}
else if (offset >= 0x8000 && offset < 0x9000)
@@ -211,7 +212,7 @@ uint8_t c64_xl80_device::c64_cd_r(address_space &space, offs_t offset, uint8_t d
// c64_cd_w - cartridge data write
//-------------------------------------------------
-void c64_xl80_device::c64_cd_w(address_space &space, offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2)
+void c64_xl80_device::c64_cd_w(offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2)
{
if (offset >= 0x9800 && offset < 0xa000)
{
@@ -221,11 +222,11 @@ void c64_xl80_device::c64_cd_w(address_space &space, offs_t offset, uint8_t data
{
if (offset & 0x01)
{
- m_crtc->register_w(space, 0, data);
+ m_crtc->register_w(data);
}
else
{
- m_crtc->address_w(space, 0, data);
+ m_crtc->address_w(data);
}
}
}
diff --git a/src/devices/bus/c64/xl80.h b/src/devices/bus/c64/xl80.h
index fe406af174b..82ebdee51d0 100644
--- a/src/devices/bus/c64/xl80.h
+++ b/src/devices/bus/c64/xl80.h
@@ -41,8 +41,8 @@ protected:
virtual void device_add_mconfig(machine_config &config) override;
// device_c64_expansion_card_interface overrides
- virtual uint8_t c64_cd_r(address_space &space, offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2) override;
- virtual void c64_cd_w(address_space &space, offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2) override;
+ virtual uint8_t c64_cd_r(offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2) override;
+ virtual void c64_cd_w(offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2) override;
virtual int c64_game_r(offs_t offset, int sphi2, int ba, int rw) override { return 1; }
virtual int c64_exrom_r(offs_t offset, int sphi2, int ba, int rw) override { return 0; }
diff --git a/src/devices/bus/c64/zaxxon.cpp b/src/devices/bus/c64/zaxxon.cpp
index 8de226cfb9d..d63b05da095 100644
--- a/src/devices/bus/c64/zaxxon.cpp
+++ b/src/devices/bus/c64/zaxxon.cpp
@@ -50,7 +50,7 @@ void c64_zaxxon_cartridge_device::device_start()
// c64_cd_r - cartridge data read
//-------------------------------------------------
-uint8_t c64_zaxxon_cartridge_device::c64_cd_r(address_space &space, offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2)
+uint8_t c64_zaxxon_cartridge_device::c64_cd_r(offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2)
{
if (!roml)
{
diff --git a/src/devices/bus/c64/zaxxon.h b/src/devices/bus/c64/zaxxon.h
index dafd293081f..8e47d4caff7 100644
--- a/src/devices/bus/c64/zaxxon.h
+++ b/src/devices/bus/c64/zaxxon.h
@@ -34,7 +34,7 @@ protected:
virtual void device_start() override;
// device_c64_expansion_card_interface overrides
- virtual uint8_t c64_cd_r(address_space &space, offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2) override;
+ virtual uint8_t c64_cd_r(offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2) override;
private:
int m_bank;
diff --git a/src/devices/bus/cbm2/24k.cpp b/src/devices/bus/cbm2/24k.cpp
index 9517337f8c1..c212b2fef83 100644
--- a/src/devices/bus/cbm2/24k.cpp
+++ b/src/devices/bus/cbm2/24k.cpp
@@ -49,7 +49,7 @@ void cbm2_24k_cartridge_device::device_start()
// cbm2_bd_r - cartridge data read
//-------------------------------------------------
-uint8_t cbm2_24k_cartridge_device::cbm2_bd_r(address_space &space, offs_t offset, uint8_t data, int csbank1, int csbank2, int csbank3)
+uint8_t cbm2_24k_cartridge_device::cbm2_bd_r(offs_t offset, uint8_t data, int csbank1, int csbank2, int csbank3)
{
if (!csbank1)
{
@@ -72,7 +72,7 @@ uint8_t cbm2_24k_cartridge_device::cbm2_bd_r(address_space &space, offs_t offset
// cbm2_bd_w - cartridge data write
//-------------------------------------------------
-void cbm2_24k_cartridge_device::cbm2_bd_w(address_space &space, offs_t offset, uint8_t data, int csbank1, int csbank2, int csbank3)
+void cbm2_24k_cartridge_device::cbm2_bd_w(offs_t offset, uint8_t data, int csbank1, int csbank2, int csbank3)
{
if (!csbank1)
{
diff --git a/src/devices/bus/cbm2/24k.h b/src/devices/bus/cbm2/24k.h
index 0e40e67d478..b1c029c5254 100644
--- a/src/devices/bus/cbm2/24k.h
+++ b/src/devices/bus/cbm2/24k.h
@@ -33,8 +33,8 @@ protected:
virtual void device_start() override;
// device_cbm2_expansion_card_interface overrides
- virtual uint8_t cbm2_bd_r(address_space &space, offs_t offset, uint8_t data, int csbank1, int csbank2, int csbank3) override;
- virtual void cbm2_bd_w(address_space &space, offs_t offset, uint8_t data, int csbank1, int csbank2, int csbank3) override;
+ virtual uint8_t cbm2_bd_r(offs_t offset, uint8_t data, int csbank1, int csbank2, int csbank3) override;
+ virtual void cbm2_bd_w(offs_t offset, uint8_t data, int csbank1, int csbank2, int csbank3) override;
optional_shared_ptr<uint8_t> m_ram;
};
diff --git a/src/devices/bus/cbm2/exp.cpp b/src/devices/bus/cbm2/exp.cpp
index e4246026a54..bcc2a654060 100644
--- a/src/devices/bus/cbm2/exp.cpp
+++ b/src/devices/bus/cbm2/exp.cpp
@@ -155,11 +155,11 @@ std::string cbm2_expansion_slot_device::get_default_card_software(get_default_ca
// read - cartridge data read
//-------------------------------------------------
-uint8_t cbm2_expansion_slot_device::read(address_space &space, offs_t offset, uint8_t data, int csbank1, int csbank2, int csbank3)
+uint8_t cbm2_expansion_slot_device::read(offs_t offset, uint8_t data, int csbank1, int csbank2, int csbank3)
{
if (m_card != nullptr)
{
- data = m_card->cbm2_bd_r(space, offset, data, csbank1, csbank2, csbank3);
+ data = m_card->cbm2_bd_r(offset, data, csbank1, csbank2, csbank3);
}
return data;
@@ -170,11 +170,11 @@ uint8_t cbm2_expansion_slot_device::read(address_space &space, offs_t offset, ui
// write - cartridge data write
//-------------------------------------------------
-void cbm2_expansion_slot_device::write(address_space &space, offs_t offset, uint8_t data, int csbank1, int csbank2, int csbank3)
+void cbm2_expansion_slot_device::write(offs_t offset, uint8_t data, int csbank1, int csbank2, int csbank3)
{
if (m_card != nullptr)
{
- m_card->cbm2_bd_w(space, offset, data, csbank1, csbank2, csbank3);
+ m_card->cbm2_bd_w(offset, data, csbank1, csbank2, csbank3);
}
}
diff --git a/src/devices/bus/cbm2/exp.h b/src/devices/bus/cbm2/exp.h
index 51f2cb15119..4d905225299 100644
--- a/src/devices/bus/cbm2/exp.h
+++ b/src/devices/bus/cbm2/exp.h
@@ -40,17 +40,6 @@
#define CBM2_EXPANSION_SLOT_TAG "exp"
-
-//**************************************************************************
-// INTERFACE CONFIGURATION MACROS
-//**************************************************************************
-
-#define MCFG_CBM2_EXPANSION_SLOT_ADD(_tag, _clock, _slot_intf, _def_slot) \
- MCFG_DEVICE_ADD(_tag, CBM2_EXPANSION_SLOT, _clock) \
- MCFG_DEVICE_SLOT_INTERFACE(_slot_intf, _def_slot, false)
-
-
-
//**************************************************************************
// TYPE DEFINITIONS
//**************************************************************************
@@ -77,8 +66,8 @@ public:
cbm2_expansion_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock = 0);
// computer interface
- uint8_t read(address_space &space, offs_t offset, uint8_t data, int csbank1, int csbank2, int csbank3);
- void write(address_space &space, offs_t offset, uint8_t data, int csbank1, int csbank2, int csbank3);
+ uint8_t read(offs_t offset, uint8_t data, int csbank1, int csbank2, int csbank3);
+ void write(offs_t offset, uint8_t data, int csbank1, int csbank2, int csbank3);
// cartridge interface
int phi2() { return clock(); }
@@ -119,8 +108,8 @@ public:
// construction/destruction
virtual ~device_cbm2_expansion_card_interface();
- virtual uint8_t cbm2_bd_r(address_space &space, offs_t offset, uint8_t data, int csbank1, int csbank2, int csbank3) { return data; };
- virtual void cbm2_bd_w(address_space &space, offs_t offset, uint8_t data, int csbank1, int csbank2, int csbank3) { };
+ virtual uint8_t cbm2_bd_r(offs_t offset, uint8_t data, int csbank1, int csbank2, int csbank3) { return data; };
+ virtual void cbm2_bd_w(offs_t offset, uint8_t data, int csbank1, int csbank2, int csbank3) { };
protected:
device_cbm2_expansion_card_interface(const machine_config &mconfig, device_t &device);
diff --git a/src/devices/bus/cbm2/hrg.cpp b/src/devices/bus/cbm2/hrg.cpp
index 4956b0a708b..166e38e76b2 100644
--- a/src/devices/bus/cbm2/hrg.cpp
+++ b/src/devices/bus/cbm2/hrg.cpp
@@ -88,37 +88,39 @@ void cbm2_hrg_b_device::hrg_b_map(address_map &map)
// device_add_mconfig - add device configuration
//-------------------------------------------------
-MACHINE_CONFIG_START(cbm2_hrg_a_device::device_add_mconfig)
- MCFG_SCREEN_ADD_MONOCHROME(SCREEN_TAG, RASTER, rgb_t::green())
- MCFG_SCREEN_UPDATE_DEVICE(EF9365_TAG, ef9365_device, screen_update)
- MCFG_SCREEN_SIZE(512, 512)
- MCFG_SCREEN_VISIBLE_AREA(0, 512-1, 0, 512-1)
- MCFG_SCREEN_REFRESH_RATE(25)
+void cbm2_hrg_a_device::device_add_mconfig(machine_config &config)
+{
+ screen_device &screen(SCREEN(config, SCREEN_TAG, SCREEN_TYPE_RASTER, rgb_t::green()));
+ screen.set_screen_update(EF9365_TAG, FUNC(ef9365_device::screen_update));
+ screen.set_size(512, 512);
+ screen.set_visarea(0, 512-1, 0, 512-1);
+ screen.set_refresh_hz(25);
PALETTE(config, "palette", palette_device::MONOCHROME);
- MCFG_DEVICE_ADD(EF9365_TAG, EF9365, 1750000)
- MCFG_VIDEO_SET_SCREEN(SCREEN_TAG)
- MCFG_DEVICE_ADDRESS_MAP(0, hrg_a_map)
- MCFG_EF936X_PALETTE("palette")
- MCFG_EF936X_BITPLANES_CNT(1);
- MCFG_EF936X_DISPLAYMODE(DISPLAY_MODE_512x512);
-MACHINE_CONFIG_END
-
-MACHINE_CONFIG_START(cbm2_hrg_b_device::device_add_mconfig)
- MCFG_SCREEN_ADD_MONOCHROME(SCREEN_TAG, RASTER, rgb_t::green())
- MCFG_SCREEN_UPDATE_DEVICE(EF9366_TAG, ef9365_device, screen_update)
- MCFG_SCREEN_SIZE(512, 256)
- MCFG_SCREEN_VISIBLE_AREA(0, 512-1, 0, 256-1)
- MCFG_SCREEN_REFRESH_RATE(50)
+ EF9365(config, m_gdc, 1750000);
+ m_gdc->set_screen(SCREEN_TAG);
+ m_gdc->set_addrmap(0, &cbm2_hrg_a_device::hrg_a_map);
+ m_gdc->set_palette_tag("palette");
+ m_gdc->set_nb_bitplanes(1);
+ m_gdc->set_display_mode(ef9365_device::DISPLAY_MODE_512x512);
+}
+
+void cbm2_hrg_b_device::device_add_mconfig(machine_config &config)
+{
+ screen_device &screen(SCREEN(config, SCREEN_TAG, SCREEN_TYPE_RASTER, rgb_t::green()));
+ screen.set_screen_update(EF9366_TAG, FUNC(ef9365_device::screen_update));
+ screen.set_size(512, 256);
+ screen.set_visarea(0, 512-1, 0, 256-1);
+ screen.set_refresh_hz(50);
PALETTE(config, "palette", palette_device::MONOCHROME);
- MCFG_DEVICE_ADD(EF9366_TAG, EF9365, 1750000)
- MCFG_VIDEO_SET_SCREEN(SCREEN_TAG)
- MCFG_DEVICE_ADDRESS_MAP(0, hrg_b_map)
- MCFG_EF936X_PALETTE("palette")
- MCFG_EF936X_BITPLANES_CNT(1);
- MCFG_EF936X_DISPLAYMODE(DISPLAY_MODE_512x256);
-MACHINE_CONFIG_END
+ EF9365(config, m_gdc, 1750000); //EF9366
+ m_gdc->set_screen(SCREEN_TAG);
+ m_gdc->set_addrmap(0, &cbm2_hrg_b_device::hrg_b_map);
+ m_gdc->set_palette_tag("palette");
+ m_gdc->set_nb_bitplanes(1);
+ m_gdc->set_display_mode(ef9365_device::DISPLAY_MODE_512x256);
+}
@@ -172,7 +174,7 @@ void cbm2_hrg_device::device_reset()
// cbm2_bd_r - cartridge data read
//-------------------------------------------------
-uint8_t cbm2_hrg_device::cbm2_bd_r(address_space &space, offs_t offset, uint8_t data, int csbank1, int csbank2, int csbank3)
+uint8_t cbm2_hrg_device::cbm2_bd_r(offs_t offset, uint8_t data, int csbank1, int csbank2, int csbank3)
{
if (!csbank3)
{
@@ -203,7 +205,7 @@ uint8_t cbm2_hrg_device::cbm2_bd_r(address_space &space, offs_t offset, uint8_t
}
else if (offset >= 0x7ff0)
{
- data = m_gdc->data_r(space, offset & 0x0f);
+ data = m_gdc->data_r(offset & 0x0f);
}
}
@@ -215,7 +217,7 @@ uint8_t cbm2_hrg_device::cbm2_bd_r(address_space &space, offs_t offset, uint8_t
// cbm2_bd_w - cartridge data write
//-------------------------------------------------
-void cbm2_hrg_device::cbm2_bd_w(address_space &space, offs_t offset, uint8_t data, int csbank1, int csbank2, int csbank3)
+void cbm2_hrg_device::cbm2_bd_w(offs_t offset, uint8_t data, int csbank1, int csbank2, int csbank3)
{
if (!csbank3)
{
@@ -238,7 +240,7 @@ void cbm2_hrg_device::cbm2_bd_w(address_space &space, offs_t offset, uint8_t dat
}
else if (offset >= 0x7ff0)
{
- m_gdc->data_w(space, offset & 0x0f, data);
+ m_gdc->data_w(offset & 0x0f, data);
}
}
}
diff --git a/src/devices/bus/cbm2/hrg.h b/src/devices/bus/cbm2/hrg.h
index ccd16dc1b05..3b6a20c94e8 100644
--- a/src/devices/bus/cbm2/hrg.h
+++ b/src/devices/bus/cbm2/hrg.h
@@ -38,11 +38,12 @@ protected:
virtual void device_reset() override;
// device_cbm2_expansion_card_interface overrides
- virtual uint8_t cbm2_bd_r(address_space &space, offs_t offset, uint8_t data, int csbank1, int csbank2, int csbank3) override;
- virtual void cbm2_bd_w(address_space &space, offs_t offset, uint8_t data, int csbank1, int csbank2, int csbank3) override;
+ virtual uint8_t cbm2_bd_r(offs_t offset, uint8_t data, int csbank1, int csbank2, int csbank3) override;
+ virtual void cbm2_bd_w(offs_t offset, uint8_t data, int csbank1, int csbank2, int csbank3) override;
-private:
required_device<ef9365_device> m_gdc;
+
+private:
required_memory_region m_bank3;
};
diff --git a/src/devices/bus/cbm2/std.cpp b/src/devices/bus/cbm2/std.cpp
index 5087e39cd93..f56226028ee 100644
--- a/src/devices/bus/cbm2/std.cpp
+++ b/src/devices/bus/cbm2/std.cpp
@@ -47,7 +47,7 @@ void cbm2_standard_cartridge_device::device_start()
// cbm2_bd_r - cartridge data read
//-------------------------------------------------
-uint8_t cbm2_standard_cartridge_device::cbm2_bd_r(address_space &space, offs_t offset, uint8_t data, int csbank1, int csbank2, int csbank3)
+uint8_t cbm2_standard_cartridge_device::cbm2_bd_r(offs_t offset, uint8_t data, int csbank1, int csbank2, int csbank3)
{
if (!csbank1 && m_bank1.bytes())
{
diff --git a/src/devices/bus/cbm2/std.h b/src/devices/bus/cbm2/std.h
index beb54e1fb2e..ee941ca580a 100644
--- a/src/devices/bus/cbm2/std.h
+++ b/src/devices/bus/cbm2/std.h
@@ -33,7 +33,7 @@ protected:
virtual void device_start() override;
// device_cbm2_expansion_card_interface overrides
- virtual uint8_t cbm2_bd_r(address_space &space, offs_t offset, uint8_t data, int csbank1, int csbank2, int csbank3) override;
+ virtual uint8_t cbm2_bd_r(offs_t offset, uint8_t data, int csbank1, int csbank2, int csbank3) override;
};
diff --git a/src/devices/bus/cbm2/user.h b/src/devices/bus/cbm2/user.h
index aa963d0dccc..6bb6bba33c6 100644
--- a/src/devices/bus/cbm2/user.h
+++ b/src/devices/bus/cbm2/user.h
@@ -42,20 +42,20 @@ class cbm2_user_port_device;
class device_cbm2_user_port_interface : public device_slot_card_interface
{
public:
- virtual uint8_t cbm2_d1_r(address_space &space, offs_t offset) { return 0xff; };
- virtual void cbm2_d1_w(address_space &space, offs_t offset, uint8_t data) { };
+ virtual uint8_t cbm2_d1_r() { return 0xff; }
+ virtual void cbm2_d1_w(uint8_t data) { }
- virtual uint8_t cbm2_d2_r(address_space &space, offs_t offset) { return 0xff; };
- virtual void cbm2_d2_w(address_space &space, offs_t offset, uint8_t data) { };
+ virtual uint8_t cbm2_d2_r() { return 0xff; }
+ virtual void cbm2_d2_w(uint8_t data) { }
virtual int cbm2_pb2_r() { return 1; }
- virtual void cbm2_pb2_w(int state) { };
+ virtual void cbm2_pb2_w(int state) { }
virtual int cbm2_pb3_r() { return 1; }
- virtual void cbm2_pb3_w(int state) { };
+ virtual void cbm2_pb3_w(int state) { }
- virtual void cbm2_pc_w(int state) { };
- virtual void cbm2_cnt_w(int state) { };
- virtual void cbm2_sp_w(int state) { };
+ virtual void cbm2_pc_w(int state) { }
+ virtual void cbm2_cnt_w(int state) { }
+ virtual void cbm2_sp_w(int state) { }
protected:
// construction/destruction
@@ -89,10 +89,10 @@ public:
auto flag_callback() { return m_write_flag.bind(); }
// computer interface
- DECLARE_READ8_MEMBER( d1_r ) { uint8_t data = 0xff; if (m_card != nullptr) data = m_card->cbm2_d1_r(space, offset); return data; }
- DECLARE_WRITE8_MEMBER( d1_w ) { if (m_card != nullptr) m_card->cbm2_d1_w(space, offset, data); }
- DECLARE_READ8_MEMBER( d2_r ) { uint8_t data = 0xff; if (m_card != nullptr) data = m_card->cbm2_d2_r(space, offset); return data; }
- DECLARE_WRITE8_MEMBER( d2_w ) { if (m_card != nullptr) m_card->cbm2_d2_w(space, offset, data); }
+ uint8_t d1_r() { uint8_t data = 0xff; if (m_card != nullptr) data = m_card->cbm2_d1_r(); return data; }
+ void d1_w(uint8_t data) { if (m_card != nullptr) m_card->cbm2_d1_w(data); }
+ uint8_t d2_r() { uint8_t data = 0xff; if (m_card != nullptr) data = m_card->cbm2_d2_r(); return data; }
+ void d2_w(uint8_t data) { if (m_card != nullptr) m_card->cbm2_d2_w(data); }
DECLARE_READ_LINE_MEMBER( pb2_r ) { return m_card ? m_card->cbm2_pb2_r() : 1; }
DECLARE_WRITE_LINE_MEMBER( pb2_w ) { if (m_card != nullptr) m_card->cbm2_pb2_w(state); }
DECLARE_READ_LINE_MEMBER( pb3_r ) { return m_card ? m_card->cbm2_pb3_r() : 1; }
diff --git a/src/devices/bus/cbmiec/c1526.cpp b/src/devices/bus/cbmiec/c1526.cpp
index 9a5fcc4dbb3..7123782d42c 100644
--- a/src/devices/bus/cbmiec/c1526.cpp
+++ b/src/devices/bus/cbmiec/c1526.cpp
@@ -23,8 +23,8 @@
// DEVICE DEFINITIONS
//**************************************************************************
-DEFINE_DEVICE_TYPE(C1526, c1526_device, "c1526", "MPS802/C1526 Printer")
-DEFINE_DEVICE_TYPE(C4023, c4023_device, "c4023", "C4023 Printer")
+DEFINE_DEVICE_TYPE(C1526, c1526_device, "c1526", "Commodore 1526/MPS802 Printer")
+DEFINE_DEVICE_TYPE(C4023, c4023_device, "c4023", "Commodore 4023 Printer")
//-------------------------------------------------
@@ -88,20 +88,22 @@ void c1526_device_base::c1526_mem(address_map &map)
// device_add_mconfig - add device configuration
//-------------------------------------------------
-MACHINE_CONFIG_START(c1526_device::device_add_mconfig)
- MCFG_DEVICE_ADD(M6504_TAG, M6504, XTAL(4'000'000)/4)
- MCFG_DEVICE_PROGRAM_MAP(c1526_mem)
-MACHINE_CONFIG_END
+void c1526_device::device_add_mconfig(machine_config &config)
+{
+ m6504_device &cpu(M6504(config, M6504_TAG, XTAL(4'000'000)/4));
+ cpu.set_addrmap(AS_PROGRAM, &c1526_device::c1526_mem);
+}
//-------------------------------------------------
// device_add_mconfig - add device configuration
//-------------------------------------------------
-MACHINE_CONFIG_START(c4023_device::device_add_mconfig)
- MCFG_DEVICE_ADD(M6504_TAG, M6504, XTAL(4'000'000)/4)
- MCFG_DEVICE_PROGRAM_MAP(c1526_mem)
-MACHINE_CONFIG_END
+void c4023_device::device_add_mconfig(machine_config &config)
+{
+ m6504_device &cpu(M6504(config, M6504_TAG, XTAL(4'000'000)/4));
+ cpu.set_addrmap(AS_PROGRAM, &c4023_device::c1526_mem);
+}
//-------------------------------------------------
diff --git a/src/devices/bus/cbmiec/c1541.cpp b/src/devices/bus/cbmiec/c1541.cpp
index 17f2ff59084..30b5eb8f255 100644
--- a/src/devices/bus/cbmiec/c1541.cpp
+++ b/src/devices/bus/cbmiec/c1541.cpp
@@ -161,17 +161,17 @@
// DEVICE DEFINITIONS
//**************************************************************************
-DEFINE_DEVICE_TYPE(C1540, c1540_device, "c1540", "C1540 Disk Drive")
-DEFINE_DEVICE_TYPE(C1541, c1541_device, "c1541", "C1541 Disk Drive")
-DEFINE_DEVICE_TYPE(C1541C, c1541c_device, "c1541c", "C1541C Disk Drive")
-DEFINE_DEVICE_TYPE(C1541II, c1541ii_device, "c1541ii", "C1541-II Disk Drive")
+DEFINE_DEVICE_TYPE(C1540, c1540_device, "c1540", "Commodore 1540 Disk Drive")
+DEFINE_DEVICE_TYPE(C1541, c1541_device, "c1541", "Commodore 1541 Disk Drive")
+DEFINE_DEVICE_TYPE(C1541C, c1541c_device, "c1541c", "Commodore 1541C Disk Drive")
+DEFINE_DEVICE_TYPE(C1541II, c1541ii_device, "c1541ii", "Commodore 1541-II Disk Drive")
DEFINE_DEVICE_TYPE(SX1541, sx1541_device, "sx1541", "SX1541 Disk Drive")
DEFINE_DEVICE_TYPE(FSD1, fsd1_device, "fsd1", "FSD-1 Disk Drive")
DEFINE_DEVICE_TYPE(FSD2, fsd2_device, "fsd2", "FSD-2 Disk Drive")
DEFINE_DEVICE_TYPE(CSD1, csd1_device, "csd1", "CSD-1 Disk Drive")
-DEFINE_DEVICE_TYPE(C1541_DOLPHIN_DOS, c1541_dolphin_dos_device, "c1541dd", "C1541 Dolphin-DOS 2.0 Disk Drive")
-DEFINE_DEVICE_TYPE(C1541_PROFESSIONAL_DOS_V1, c1541_professional_dos_v1_device, "c1541pd", "C1541 Professional-DOS v1 Disk Drive")
-DEFINE_DEVICE_TYPE(C1541_PROLOGIC_DOS_CLASSIC, c1541_prologic_dos_classic_device, "c1541pdc", "C1541 ProLogic-DOS Classic Disk Drive")
+DEFINE_DEVICE_TYPE(C1541_DOLPHIN_DOS, c1541_dolphin_dos_device, "c1541dd", "Commodore 1541 Dolphin-DOS 2.0 Disk Drive")
+DEFINE_DEVICE_TYPE(C1541_PROFESSIONAL_DOS_V1, c1541_professional_dos_v1_device, "c1541pd", "Commodore 1541 Professional-DOS v1 Disk Drive")
+DEFINE_DEVICE_TYPE(C1541_PROLOGIC_DOS_CLASSIC, c1541_prologic_dos_classic_device, "c1541pdc", "Commodore 1541 ProLogic-DOS Classic Disk Drive")
DEFINE_DEVICE_TYPE(INDUS_GT, indus_gt_device, "indusgt", "Indus GT Disk Drive")
@@ -762,12 +762,12 @@ FLOPPY_FORMATS_END
READ8_MEMBER( c1541_prologic_dos_classic_device::pia_r )
{
- return m_pia->read(space, (offset >> 2) & 0x03);
+ return m_pia->read((offset >> 2) & 0x03);
}
WRITE8_MEMBER( c1541_prologic_dos_classic_device::pia_w )
{
- m_pia->write(space, (offset >> 2) & 0x03, data);
+ m_pia->write((offset >> 2) & 0x03, data);
}
WRITE8_MEMBER( c1541_prologic_dos_classic_device::pia_pa_w )
diff --git a/src/devices/bus/cbmiec/c1571.cpp b/src/devices/bus/cbmiec/c1571.cpp
index 91fe7d4bd96..568cd646fe7 100644
--- a/src/devices/bus/cbmiec/c1571.cpp
+++ b/src/devices/bus/cbmiec/c1571.cpp
@@ -44,9 +44,9 @@
// DEVICE DEFINITIONS
//**************************************************************************
-DEFINE_DEVICE_TYPE(C1570, c1570_device, "c1570", "C1570 Disk Drive")
-DEFINE_DEVICE_TYPE(C1571, c1571_device, "c1571", "C1571 Disk Drive")
-DEFINE_DEVICE_TYPE(C1571CR, c1571cr_device, "c1571cr", "C1571CR Disk Drive")
+DEFINE_DEVICE_TYPE(C1570, c1570_device, "c1570", "Commodore 1570 Disk Drive")
+DEFINE_DEVICE_TYPE(C1571, c1571_device, "c1571", "Commodore 1571 Disk Drive")
+DEFINE_DEVICE_TYPE(C1571CR, c1571cr_device, "c1571cr", "Commodore 1571CR Disk Drive")
DEFINE_DEVICE_TYPE(MINI_CHIEF, mini_chief_device, "minichif", "ICT Mini Chief Disk Drive")
@@ -660,7 +660,7 @@ void c1571cr_device::device_add_mconfig(machine_config &config)
m_via0->writepa_handler().set(FUNC(c1571cr_device::via0_pa_w));
m_via0->writepb_handler().set(FUNC(c1571cr_device::via0_pb_w));
- //MCFG_MOS5710_ADD(M5710_TAG, 16_MHz_XTAL / 16, 0)
+ //MOS5710(config, M5710_TAG, 16_MHz_XTAL / 16);
}
@@ -672,7 +672,8 @@ void mini_chief_device::device_add_mconfig(machine_config &config)
m_maincpu->set_addrmap(AS_PROGRAM, &mini_chief_device::mini_chief_mem);
isa8_device &isa8(ISA8(config, ISA_BUS_TAG, 0));
- isa8.set_cputag(m_maincpu);
+ isa8.set_memspace(m_maincpu, AS_PROGRAM);
+ isa8.set_iospace(m_maincpu, AS_PROGRAM);
ISA8_SLOT(config, "isa1", 0, ISA_BUS_TAG, mini_chief_isa8_cards, "wd1002a_wx1", false);
}
diff --git a/src/devices/bus/cbmiec/c1581.cpp b/src/devices/bus/cbmiec/c1581.cpp
index 190cab5cd07..f589cb2f427 100644
--- a/src/devices/bus/cbmiec/c1581.cpp
+++ b/src/devices/bus/cbmiec/c1581.cpp
@@ -33,8 +33,8 @@
// DEVICE DEFINITIONS
//**************************************************************************
-DEFINE_DEVICE_TYPE(C1563, c1563_device, "c1563", "C1563 Disk Drive")
-DEFINE_DEVICE_TYPE(C1581, c1581_device, "c1581", "C1581 Disk Drive")
+DEFINE_DEVICE_TYPE(C1563, c1563_device, "c1563", "Commodore 1563 3.5 Disk Drive")
+DEFINE_DEVICE_TYPE(C1581, c1581_device, "c1581", "Commodore 1581 3.5 Disk Drive")
//-------------------------------------------------
@@ -267,22 +267,23 @@ FLOPPY_FORMATS_END
// device_add_mconfig - add device configuration
//-------------------------------------------------
-MACHINE_CONFIG_START(c1581_device::device_add_mconfig)
- MCFG_DEVICE_ADD(M6502_TAG, M6502, 16_MHz_XTAL / 8)
- MCFG_DEVICE_PROGRAM_MAP(c1581_mem)
-
- MCFG_DEVICE_ADD(M8520_TAG, MOS8520, 16_MHz_XTAL / 8)
- MCFG_MOS6526_IRQ_CALLBACK(INPUTLINE(M6502_TAG, INPUT_LINE_IRQ0))
- MCFG_MOS6526_CNT_CALLBACK(WRITELINE(*this, c1581_device, cnt_w))
- MCFG_MOS6526_SP_CALLBACK(WRITELINE(*this, c1581_device, sp_w))
- MCFG_MOS6526_PA_INPUT_CALLBACK(READ8(*this, c1581_device, cia_pa_r))
- MCFG_MOS6526_PA_OUTPUT_CALLBACK(WRITE8(*this, c1581_device, cia_pa_w))
- MCFG_MOS6526_PB_INPUT_CALLBACK(READ8(*this, c1581_device, cia_pb_r))
- MCFG_MOS6526_PB_OUTPUT_CALLBACK(WRITE8(*this, c1581_device, cia_pb_w))
+void c1581_device::device_add_mconfig(machine_config &config)
+{
+ M6502(config, m_maincpu, 16_MHz_XTAL / 8);
+ m_maincpu->set_addrmap(AS_PROGRAM, &c1581_device::c1581_mem);
+
+ MOS8520(config, m_cia, 16_MHz_XTAL / 8);
+ m_cia->irq_wr_callback().set_inputline(m_maincpu, INPUT_LINE_IRQ0);
+ m_cia->cnt_wr_callback().set(FUNC(c1581_device::cnt_w));
+ m_cia->sp_wr_callback().set(FUNC(c1581_device::sp_w));
+ m_cia->pa_rd_callback().set(FUNC(c1581_device::cia_pa_r));
+ m_cia->pa_wr_callback().set(FUNC(c1581_device::cia_pa_w));
+ m_cia->pb_rd_callback().set(FUNC(c1581_device::cia_pb_r));
+ m_cia->pb_wr_callback().set(FUNC(c1581_device::cia_pb_w));
WD1772(config, m_fdc, 16_MHz_XTAL / 2);
FLOPPY_CONNECTOR(config, WD1772_TAG":0", c1581_floppies, "35dd", c1581_device::floppy_formats, true);
-MACHINE_CONFIG_END
+}
//-------------------------------------------------
diff --git a/src/devices/bus/cbmiec/cbmiec.h b/src/devices/bus/cbmiec/cbmiec.h
index 4977bfc97be..ceb03d44948 100644
--- a/src/devices/bus/cbmiec/cbmiec.h
+++ b/src/devices/bus/cbmiec/cbmiec.h
@@ -21,46 +21,6 @@
#define CBM_IEC_TAG "iec_bus"
-
-//**************************************************************************
-// INTERFACE CONFIGURATION MACROS
-//**************************************************************************
-
-#define MCFG_CBM_IEC_BUS_ADD() \
- MCFG_DEVICE_ADD(CBM_IEC_TAG, CBM_IEC, 0)
-
-
-#define MCFG_CBM_IEC_BUS_SRQ_CALLBACK(_write) \
- downcast<cbm_iec_device *>(device)->set_srq_callback(DEVCB_##_write);
-
-#define MCFG_CBM_IEC_BUS_ATN_CALLBACK(_write) \
- downcast<cbm_iec_device *>(device)->set_atn_callback(DEVCB_##_write);
-
-#define MCFG_CBM_IEC_BUS_CLK_CALLBACK(_write) \
- downcast<cbm_iec_device *>(device)->set_clk_callback(DEVCB_##_write);
-
-#define MCFG_CBM_IEC_BUS_DATA_CALLBACK(_write) \
- downcast<cbm_iec_device *>(device)->set_data_callback(DEVCB_##_write);
-
-#define MCFG_CBM_IEC_BUS_RESET_CALLBACK(_write) \
- downcast<cbm_iec_device *>(device)->set_reset_callback(DEVCB_##_write);
-
-
-#define MCFG_CBM_IEC_SLOT_ADD(_tag, _address, _slot_intf, _def_slot) \
- MCFG_DEVICE_ADD(_tag, CBM_IEC_SLOT, 0) \
- MCFG_DEVICE_SLOT_INTERFACE(_slot_intf, _def_slot, false) \
- downcast<cbm_iec_slot_device *>(device)->set_address(_address);
-
-
-#define MCFG_CBM_IEC_ADD(_default_drive) \
- MCFG_CBM_IEC_SLOT_ADD("iec4", 4, cbm_iec_devices, nullptr) \
- MCFG_CBM_IEC_SLOT_ADD("iec8", 8, cbm_iec_devices, _default_drive) \
- MCFG_CBM_IEC_SLOT_ADD("iec9", 9, cbm_iec_devices, nullptr) \
- MCFG_CBM_IEC_SLOT_ADD("iec10", 10, cbm_iec_devices, nullptr) \
- MCFG_CBM_IEC_SLOT_ADD("iec11", 11, cbm_iec_devices, nullptr) \
- MCFG_CBM_IEC_BUS_ADD()
-
-
void cbm_iec_devices(device_slot_interface &device);
//**************************************************************************
@@ -78,11 +38,6 @@ public:
// construction/destruction
cbm_iec_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- template <class Object> devcb_base &set_srq_callback(Object &&wr) { return m_write_srq.set_callback(std::forward<Object>(wr)); }
- template <class Object> devcb_base &set_atn_callback(Object &&wr) { return m_write_atn.set_callback(std::forward<Object>(wr)); }
- template <class Object> devcb_base &set_clk_callback(Object &&wr) { return m_write_clk.set_callback(std::forward<Object>(wr)); }
- template <class Object> devcb_base &set_data_callback(Object &&wr) { return m_write_data.set_callback(std::forward<Object>(wr)); }
- template <class Object> devcb_base &set_reset_callback(Object &&wr) { return m_write_reset.set_callback(std::forward<Object>(wr)); }
auto srq_callback() { return m_write_srq.bind(); }
auto atn_callback() { return m_write_atn.bind(); }
auto clk_callback() { return m_write_clk.bind(); }
diff --git a/src/devices/bus/cbmiec/interpod.cpp b/src/devices/bus/cbmiec/interpod.cpp
index d6111dafe4d..ac87a55cf21 100644
--- a/src/devices/bus/cbmiec/interpod.cpp
+++ b/src/devices/bus/cbmiec/interpod.cpp
@@ -123,16 +123,17 @@ void interpod_device::interpod_mem(address_map &map)
// device_add_mconfig - add device configuration
//-------------------------------------------------
-MACHINE_CONFIG_START(interpod_device::device_add_mconfig)
- MCFG_DEVICE_ADD(R6502_TAG, M6502, 1000000)
- MCFG_DEVICE_PROGRAM_MAP(interpod_mem)
+void interpod_device::device_add_mconfig(machine_config &config)
+{
+ M6502(config, m_maincpu, 1000000);
+ m_maincpu->set_addrmap(AS_PROGRAM, &interpod_device::interpod_mem);
- MCFG_DEVICE_ADD(R6522_TAG, VIA6522, 1000000)
- MCFG_DEVICE_ADD(R6532_TAG, MOS6532_NEW, 1000000)
- MCFG_DEVICE_ADD(MC6850_TAG, ACIA6850, 0)
+ VIA6522(config, m_via, 1000000);
+ MOS6532_NEW(config, m_riot, 1000000);
+ ACIA6850(config, m_acia, 0);
- MCFG_CBM_IEEE488_ADD(nullptr)
-MACHINE_CONFIG_END
+ ieee488_device::add_cbm_devices(config, nullptr);
+}
//**************************************************************************
diff --git a/src/devices/bus/cbmiec/interpod.h b/src/devices/bus/cbmiec/interpod.h
index cc6e07f7c7a..58c193286cf 100644
--- a/src/devices/bus/cbmiec/interpod.h
+++ b/src/devices/bus/cbmiec/interpod.h
@@ -27,16 +27,6 @@
#define INTERPOD_TAG "interpod"
-
-//**************************************************************************
-// INTERFACE CONFIGURATION MACROS
-//**************************************************************************
-
-#define MCFG_INTERPOD_ADD() \
- MCFG_DEVICE_ADD(INTERPOD_TAG, INTERPOD, 0)
-
-
-
//**************************************************************************
// TYPE DEFINITIONS
//**************************************************************************
diff --git a/src/devices/bus/cbmiec/serialbox.cpp b/src/devices/bus/cbmiec/serialbox.cpp
index b14eca1f389..ab8326528d0 100644
--- a/src/devices/bus/cbmiec/serialbox.cpp
+++ b/src/devices/bus/cbmiec/serialbox.cpp
@@ -69,10 +69,11 @@ void serial_box_device::serial_box_mem(address_map &map)
// device_add_mconfig - add device configuration
//-------------------------------------------------
-MACHINE_CONFIG_START(serial_box_device::device_add_mconfig)
- MCFG_DEVICE_ADD(M6502_TAG, M65C02, XTAL(4'000'000)/4)
- MCFG_DEVICE_PROGRAM_MAP(serial_box_mem)
-MACHINE_CONFIG_END
+void serial_box_device::device_add_mconfig(machine_config &config)
+{
+ M65C02(config, m_maincpu, XTAL(4'000'000)/4);
+ m_maincpu->set_addrmap(AS_PROGRAM, &serial_box_device::serial_box_mem);
+}
diff --git a/src/devices/bus/cbmiec/vic1515.cpp b/src/devices/bus/cbmiec/vic1515.cpp
index 1afc47ce807..5accd8b6858 100644
--- a/src/devices/bus/cbmiec/vic1515.cpp
+++ b/src/devices/bus/cbmiec/vic1515.cpp
@@ -61,11 +61,12 @@ void vic1515_device::vic1515_io(address_map &map)
// device_add_mconfig - add device configuration
//-------------------------------------------------
-MACHINE_CONFIG_START(vic1515_device::device_add_mconfig)
- MCFG_DEVICE_ADD("maincpu", I8039, XTAL(6'000'000))
- MCFG_DEVICE_PROGRAM_MAP(vic1515_mem)
- MCFG_DEVICE_IO_MAP(vic1515_io)
-MACHINE_CONFIG_END
+void vic1515_device::device_add_mconfig(machine_config &config)
+{
+ i8039_device &maincpu(I8039(config, "maincpu", XTAL(6'000'000)));
+ maincpu.set_addrmap(AS_PROGRAM, &vic1515_device::vic1515_mem);
+ maincpu.set_addrmap(AS_IO, &vic1515_device::vic1515_io);
+}
//-------------------------------------------------
diff --git a/src/devices/bus/cbmiec/vic1520.cpp b/src/devices/bus/cbmiec/vic1520.cpp
index 0f515f8638a..8e535c230e6 100644
--- a/src/devices/bus/cbmiec/vic1520.cpp
+++ b/src/devices/bus/cbmiec/vic1520.cpp
@@ -94,10 +94,11 @@ void vic1520_device::vic1520_mem(address_map &map)
// device_add_mconfig - add device configuration
//-------------------------------------------------
-MACHINE_CONFIG_START(vic1520_device::device_add_mconfig)
- MCFG_DEVICE_ADD(M6500_1_TAG, M6502, XTAL(2'000'000)) // M6500/1
- MCFG_DEVICE_PROGRAM_MAP(vic1520_mem)
-MACHINE_CONFIG_END
+void vic1520_device::device_add_mconfig(machine_config &config)
+{
+ m6502_device &cpu(M6502(config, M6500_1_TAG, XTAL(2'000'000))); // M6500/1
+ cpu.set_addrmap(AS_PROGRAM, &vic1520_device::vic1520_mem);
+}
//-------------------------------------------------
diff --git a/src/devices/bus/cbus/pc9801_118.cpp b/src/devices/bus/cbus/pc9801_118.cpp
index 96f0d0b4091..a9271ecb0bf 100644
--- a/src/devices/bus/cbus/pc9801_118.cpp
+++ b/src/devices/bus/cbus/pc9801_118.cpp
@@ -141,7 +141,7 @@ void pc9801_118_device::device_reset()
READ8_MEMBER(pc9801_118_device::opn3_r)
{
if(((offset & 5) == 0) || m_ext_reg)
- return m_opn3->read(space, offset >> 1);
+ return m_opn3->read(offset >> 1);
else // odd
{
//printf("PC9801-118: Read to undefined port [%02x]\n",offset+0x188);
@@ -153,7 +153,7 @@ READ8_MEMBER(pc9801_118_device::opn3_r)
WRITE8_MEMBER(pc9801_118_device::opn3_w)
{
if(((offset & 5) == 0) || m_ext_reg)
- m_opn3->write(space, offset >> 1,data);
+ m_opn3->write(offset >> 1,data);
//else // odd
// printf("PC9801-118: Write to undefined port [%02x] %02x\n",offset+0x188,data);
}
diff --git a/src/devices/bus/cbus/pc9801_26.cpp b/src/devices/bus/cbus/pc9801_26.cpp
index 41141476483..603ea4a80b3 100644
--- a/src/devices/bus/cbus/pc9801_26.cpp
+++ b/src/devices/bus/cbus/pc9801_26.cpp
@@ -146,7 +146,7 @@ READ8_MEMBER(pc9801_26_device::opn_r)
{
if((offset & 1) == 0)
{
- return offset & 4 ? 0xff : m_opn->read(space, offset >> 1);
+ return offset & 4 ? 0xff : m_opn->read(offset >> 1);
}
else // odd
{
@@ -159,7 +159,7 @@ READ8_MEMBER(pc9801_26_device::opn_r)
WRITE8_MEMBER(pc9801_26_device::opn_w)
{
if((offset & 5) == 0)
- m_opn->write(space, offset >> 1, data);
+ m_opn->write(offset >> 1, data);
else // odd
printf("PC9801-26: Write to undefined port [%02x] %02x\n",offset+0x188,data);
}
diff --git a/src/devices/bus/cbus/pc9801_86.cpp b/src/devices/bus/cbus/pc9801_86.cpp
index 04c1feb4cf8..d9d6150a9fa 100644
--- a/src/devices/bus/cbus/pc9801_86.cpp
+++ b/src/devices/bus/cbus/pc9801_86.cpp
@@ -47,7 +47,8 @@ WRITE_LINE_MEMBER(pc9801_86_device::sound_irq)
// device_add_mconfig - add device configuration
//-------------------------------------------------
-MACHINE_CONFIG_START(pc9801_86_device::pc9801_86_config)
+void pc9801_86_device::pc9801_86_config(machine_config &config)
+{
SPEAKER(config, "lspeaker").front_left();
SPEAKER(config, "rspeaker").front_right();
YM2608(config, m_opna, 7.987_MHz_XTAL);
@@ -62,16 +63,19 @@ MACHINE_CONFIG_START(pc9801_86_device::pc9801_86_config)
m_opna->add_route(1, "lspeaker", 1.00);
m_opna->add_route(2, "rspeaker", 1.00);
- MCFG_DEVICE_ADD("ldac", DAC_16BIT_R2R_TWOS_COMPLEMENT, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 1.0) // burr brown pcm61p
- MCFG_DEVICE_ADD("rdac", DAC_16BIT_R2R_TWOS_COMPLEMENT, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 1.0) // burr brown pcm61p
- MCFG_DEVICE_ADD("vref", VOLTAGE_REGULATOR, 0) MCFG_VOLTAGE_REGULATOR_OUTPUT(5.0)
- MCFG_SOUND_ROUTE(0, "ldac", 1.0, DAC_VREF_POS_INPUT) MCFG_SOUND_ROUTE(0, "ldac", -1.0, DAC_VREF_NEG_INPUT)
- MCFG_SOUND_ROUTE(0, "rdac", 1.0, DAC_VREF_POS_INPUT) MCFG_SOUND_ROUTE(0, "rdac", -1.0, DAC_VREF_NEG_INPUT)
-MACHINE_CONFIG_END
+ DAC_16BIT_R2R_TWOS_COMPLEMENT(config, m_ldac, 0).add_route(ALL_OUTPUTS, "lspeaker", 1.0); // burr brown pcm61p
+ DAC_16BIT_R2R_TWOS_COMPLEMENT(config, m_rdac, 0).add_route(ALL_OUTPUTS, "rspeaker", 1.0); // burr brown pcm61p
+ voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref"));
+ vref.add_route(0, "ldac", 1.0, DAC_VREF_POS_INPUT);
+ vref.add_route(0, "ldac", -1.0, DAC_VREF_NEG_INPUT);
+ vref.add_route(0, "rdac", 1.0, DAC_VREF_POS_INPUT);
+ vref.add_route(0, "rdac", -1.0, DAC_VREF_NEG_INPUT);
+}
-MACHINE_CONFIG_START(pc9801_86_device::device_add_mconfig)
+void pc9801_86_device::device_add_mconfig(machine_config &config)
+{
pc9801_86_config(config);
-MACHINE_CONFIG_END
+}
// to load a different bios for slots:
// -cbusX pc9801_86,bios=N
@@ -197,7 +201,7 @@ void pc9801_86_device::device_reset()
READ8_MEMBER(pc9801_86_device::opna_r)
{
if((offset & 1) == 0)
- return m_opna->read(space, offset >> 1);
+ return m_opna->read(offset >> 1);
else // odd
{
logerror("PC9801-86: Read to undefined port [%02x]\n",offset+0x188);
@@ -208,7 +212,7 @@ READ8_MEMBER(pc9801_86_device::opna_r)
WRITE8_MEMBER(pc9801_86_device::opna_w)
{
if((offset & 1) == 0)
- m_opna->write(space, offset >> 1,data);
+ m_opna->write(offset >> 1,data);
else // odd
logerror("PC9801-86: Write to undefined port [%02x] %02x\n",offset+0x188,data);
}
@@ -419,7 +423,7 @@ void pc9801_speakboard_device::device_reset()
READ8_MEMBER(pc9801_speakboard_device::opna_slave_r)
{
if((offset & 1) == 0)
- return m_opna_slave->read(space, offset >> 1);
+ return m_opna_slave->read(offset >> 1);
else // odd
{
logerror("PC9801-SPB: Read to undefined port [%02x]\n",offset+0x588);
@@ -430,7 +434,7 @@ READ8_MEMBER(pc9801_speakboard_device::opna_slave_r)
WRITE8_MEMBER(pc9801_speakboard_device::opna_slave_w)
{
if((offset & 1) == 0)
- m_opna_slave->write(space, offset >> 1,data);
+ m_opna_slave->write(offset >> 1,data);
else // odd
logerror("PC9801-SPB: Write to undefined port [%02x] %02x\n",offset+0x588,data);
}
diff --git a/src/devices/bus/cbus/pc9801_amd98.cpp b/src/devices/bus/cbus/pc9801_amd98.cpp
index f7207aabd21..ca7b32e7b4e 100644
--- a/src/devices/bus/cbus/pc9801_amd98.cpp
+++ b/src/devices/bus/cbus/pc9801_amd98.cpp
@@ -149,9 +149,9 @@ READ8_MEMBER(pc9801_amd98_device::read)
switch(offset)
{
case 2:
- return m_ay1->data_r(space,0);
+ return m_ay1->data_r();
case 3:
- return m_ay2->data_r(space,0);
+ return m_ay2->data_r();
}
printf("%02x\n",offset);
@@ -164,16 +164,16 @@ WRITE8_MEMBER(pc9801_amd98_device::write)
switch(offset)
{
case 0:
- m_ay1->address_w(space,0,data);
+ m_ay1->address_w(data);
break;
case 1:
- m_ay2->address_w(space,0,data);
+ m_ay2->address_w(data);
break;
case 2:
- m_ay1->data_w(space,0,data);
+ m_ay1->data_w(data);
break;
case 3:
- m_ay2->data_w(space,0,data);
+ m_ay2->data_w(data);
break;
default:
printf("%02x %02x\n",offset,data);
@@ -192,11 +192,11 @@ WRITE8_MEMBER(pc9801_amd98_device::ay3_data_latch_w)
{
case 0x47:
//printf("%02x addr\n",m_ay3_latch);
- m_ay3->address_w(space,0,m_ay3_latch);
+ m_ay3->address_w(m_ay3_latch);
break;
case 0x43:
//printf("%02x data\n",m_ay3_latch);
- m_ay3->data_w(space,0,m_ay3_latch);
+ m_ay3->data_w(m_ay3_latch);
break;
}
}
diff --git a/src/devices/bus/cbus/pc9801_cbus.cpp b/src/devices/bus/cbus/pc9801_cbus.cpp
index eb62af6daaa..5a53eddcce7 100644
--- a/src/devices/bus/cbus/pc9801_cbus.cpp
+++ b/src/devices/bus/cbus/pc9801_cbus.cpp
@@ -55,7 +55,8 @@ device_pc9801cbus_card_interface::~device_pc9801cbus_card_interface()
pc9801_slot_device::pc9801_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) :
device_t(mconfig, PC9801CBUS_SLOT, tag, owner, clock),
device_slot_interface(mconfig, *this),
- m_cpu(*this, finder_base::DUMMY_TAG),
+ m_memspace(*this, finder_base::DUMMY_TAG, -1),
+ m_iospace(*this, finder_base::DUMMY_TAG, -1),
m_int_callback{{*this}, {*this}, {*this}, {*this}, {*this}, {*this}, {*this}}
{
}
@@ -97,17 +98,17 @@ void pc9801_slot_device::device_start()
void pc9801_slot_device::install_io(offs_t start, offs_t end, read8_delegate rhandler, write8_delegate whandler)
{
- int buswidth = this->io_space().data_width();
+ int buswidth = m_iospace->data_width();
switch(buswidth)
{
case 8:
- this->io_space().install_readwrite_handler(start, end, rhandler, whandler, 0);
+ m_iospace->install_readwrite_handler(start, end, rhandler, whandler, 0);
break;
case 16:
- this->io_space().install_readwrite_handler(start, end, rhandler, whandler, 0xffff);
+ m_iospace->install_readwrite_handler(start, end, rhandler, whandler, 0xffff);
break;
case 32:
- this->io_space().install_readwrite_handler(start, end, rhandler, whandler, 0xffffffff);
+ m_iospace->install_readwrite_handler(start, end, rhandler, whandler, 0xffffffff);
break;
default:
fatalerror("PC-9801-26: Bus width %d not supported\n", buswidth);
diff --git a/src/devices/bus/cbus/pc9801_cbus.h b/src/devices/bus/cbus/pc9801_cbus.h
index 400cfa67d27..e094693f06c 100644
--- a/src/devices/bus/cbus/pc9801_cbus.h
+++ b/src/devices/bus/cbus/pc9801_cbus.h
@@ -2,6 +2,60 @@
// copyright-holders:Angelo Salese
/**********************************************************************
+ <B> <A>
+ +------+
+ GND |[ 01 ]| GND
+ V1 |[ 02 ]| V1
+ V2 |[ 03 ]| V2
+ DB001 |[ 04 ]| AB001
+ DB011 |[ 05 ]| AB011
+ DB021 |[ 06 ]| AB021
+ DB031 |[ 07 ]| AB031
+ DB041 |[ 08 ]| AB041
+ DB051 |[ 09 ]| AB051
+ DB061 |[ 10 ]| AB061
+ GND |[ 11 ]| GND
+ DB071 |[ 12 ]| AB071
+ DB081 |[ 13 ]| AB081
+ DB091 |[ 14 ]| AB091
+ DB101 |[ 15 ]| AB101
+ DB111 |[ 16 ]| AB111
+ DB121 |[ 17 ]| AB121
+ DB131 |[ 18 ]| AB131
+ DB141 |[ 19 ]| AB141
+ DB151 |[ 20 ]| AB151
+ GND |[ 21 ]| GND
+ +12 V |[ 22 ]| AB161
+ +12 V |[ 23 ]| AB171
+ "INT0" IR31 |[ 24 ]| AB181
+ "INT1" IR51 |[ 25 ]| AB191
+ "INT2" IR61 |[ 26 ]| AB201
+ "INT3" IR91 |[ 27 ]| AB211
+ "INT4" IR101/IR111 |[ 28 ]| AB221
+ "INT5" IR121 |[ 29 ]| AB231
+ "INT6" IR131 |[ 30 ]| INT0
+ GND |[ 31 ]| GND
+ -12 V |[ 32 ]| IOCHK0
+ -12 V |[ 33 ]| IOR0
+ RESET0 |[ 34 ]| IOW0
+ DACK00 |[ 35 ]| MRC0
+ DACK30/DACK20 |[ 36 ]| MWC0
+ DRQ00 |[ 37 ]| S00 (INTA0)
+ DRQ30/DRQ20 |[ 38 ]| S10 (NOWAIT0)
+ WORD0 |[ 39 ]| S20 (SALE1)
+ (EXHRQ10) CPKILL0 |[ 40 ]| LOCK (MACS0)
+ GND |[ 41 ]| GND
+ (EXHLA10) RQGT0 |[ 42 ]| CPUENB10
+ DMATC0 |[ 43 ]| RFSH0
+ NMI0 |[ 44 ]| BHE0
+ MWE0 |[ 45 ]| IORDY1
+ (EXHLA20) HLDA00 |[ 46 ]| SCLK1
+ (EXHRQ20) HRQ00 |[ 47 ]| S18CLK1 = 307.2 kHz
+ (SUBSRQ1) DMAHLD0 |[ 48 ]| POWER0
+ +5 V |[ 49 ]| +5 V
+ +5 V |[ 50 ]| +5 V
+ +------+
+ <B> <A>
**********************************************************************/
#ifndef MAME_MACHINE_PC9801_CBUS_H
@@ -10,43 +64,6 @@
#pragma once
-
-
-//**************************************************************************
-// CONSTANTS
-//**************************************************************************
-
-
-
-//**************************************************************************
-// INTERFACE CONFIGURATION MACROS
-//**************************************************************************
-
-#define MCFG_PC9801CBUS_CPU(_cputag) \
- downcast<pc9801_slot_device &>(*device).set_cpu_tag(_cputag);
-
-#define MCFG_PC9801CBUS_INT0_CALLBACK(_devcb) \
- downcast<pc9801_slot_device &>(*device).set_int_callback<0>(DEVCB_##_devcb);
-
-#define MCFG_PC9801CBUS_INT1_CALLBACK(_devcb) \
- downcast<pc9801_slot_device &>(*device).set_int_callback<1>(DEVCB_##_devcb);
-
-#define MCFG_PC9801CBUS_INT2_CALLBACK(_devcb) \
- downcast<pc9801_slot_device &>(*device).set_int_callback<2>(DEVCB_##_devcb);
-
-#define MCFG_PC9801CBUS_INT3_CALLBACK(_devcb) \
- downcast<pc9801_slot_device &>(*device).set_int_callback<3>(DEVCB_##_devcb);
-
-#define MCFG_PC9801CBUS_INT4_CALLBACK(_devcb) \
- downcast<pc9801_slot_device &>(*device).set_int_callback<4>(DEVCB_##_devcb);
-
-#define MCFG_PC9801CBUS_INT5_CALLBACK(_devcb) \
- downcast<pc9801_slot_device &>(*device).set_int_callback<5>(DEVCB_##_devcb);
-
-#define MCFG_PC9801CBUS_INT6_CALLBACK(_devcb) \
- downcast<pc9801_slot_device &>(*device).set_int_callback<6>(DEVCB_##_devcb);
-
-
//**************************************************************************
// TYPE DEFINITIONS
//**************************************************************************
@@ -74,11 +91,10 @@ class pc9801_slot_device : public device_t, public device_slot_interface
{
public:
// construction/destruction
- template <typename T, typename U>
- pc9801_slot_device(machine_config const &mconfig, char const *tag, device_t *owner, T &&cpu_tag, U &&opts, char const *dflt)
+ template <typename T>
+ pc9801_slot_device(machine_config const &mconfig, char const *tag, device_t *owner, T &&opts, char const *dflt)
: pc9801_slot_device(mconfig, tag, owner, (uint32_t)0)
{
- m_cpu.set_tag(std::forward<T>(cpu_tag));
option_reset();
opts(*this);
set_default_option(dflt);
@@ -86,11 +102,14 @@ public:
}
pc9801_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+ template <typename T> void set_memspace(T &&tag, int spacenum) { m_memspace.set_tag(std::forward<T>(tag), spacenum); }
+ template <typename T> void set_iospace(T &&tag, int spacenum) { m_iospace.set_tag(std::forward<T>(tag), spacenum); }
+
// configuration access
template<std::size_t Line> auto int_cb() { return m_int_callback[Line].bind(); }
- address_space &program_space() const { return m_cpu->space(AS_PROGRAM); }
- address_space &io_space() const { return m_cpu->space(AS_IO); }
+ address_space &program_space() const { return *m_memspace; }
+ address_space &io_space() const { return *m_iospace; }
template<int I> void int_w(bool state) { m_int_callback[I](state); }
void install_io(offs_t start, offs_t end, read8_delegate rhandler, write8_delegate whandler);
@@ -102,7 +121,8 @@ protected:
private:
// device_pc9801_slot_card_interface *m_card;
- required_device<cpu_device> m_cpu;
+ required_address_space m_memspace;
+ required_address_space m_iospace;
devcb_write_line m_int_callback[7];
};
diff --git a/src/devices/bus/centronics/comxpl80.cpp b/src/devices/bus/centronics/comxpl80.cpp
index afdce31a8bf..17fd3165f8d 100644
--- a/src/devices/bus/centronics/comxpl80.cpp
+++ b/src/devices/bus/centronics/comxpl80.cpp
@@ -86,11 +86,12 @@ void comx_pl80_device::comxpl80_mem(address_map &map)
// device_add_mconfig - add device configuration
//-------------------------------------------------
-MACHINE_CONFIG_START(comx_pl80_device::device_add_mconfig)
- MCFG_DEVICE_ADD(CX005_TAG, M6805, 4000000) // CX005: some kind of MC6805/MC68HC05 clone
- MCFG_DEVICE_PROGRAM_MAP(comxpl80_mem)
- MCFG_DEVICE_DISABLE()
-MACHINE_CONFIG_END
+void comx_pl80_device::device_add_mconfig(machine_config &config)
+{
+ m6805_device &cx005(M6805(config, CX005_TAG, 4000000)); // CX005: some kind of MC6805/MC68HC05 clone
+ cx005.set_addrmap(AS_PROGRAM, &comx_pl80_device::comxpl80_mem);
+ cx005.set_disable();
+}
//-------------------------------------------------
diff --git a/src/devices/bus/centronics/covox.cpp b/src/devices/bus/centronics/covox.cpp
index e508578ffe6..6cafe74cb42 100644
--- a/src/devices/bus/centronics/covox.cpp
+++ b/src/devices/bus/centronics/covox.cpp
@@ -38,13 +38,15 @@ centronics_covox_device::centronics_covox_device(const machine_config &mconfig,
// device_add_mconfig - add device configuration
//-------------------------------------------------
-MACHINE_CONFIG_START(centronics_covox_device::device_add_mconfig)
+void centronics_covox_device::device_add_mconfig(machine_config &config)
+{
/* sound hardware */
SPEAKER(config, "speaker").front_center();
- MCFG_DEVICE_ADD("dac", DAC_8BIT_R2R, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 0.5) // unknown DAC
- MCFG_DEVICE_ADD("vref", VOLTAGE_REGULATOR, 0) MCFG_VOLTAGE_REGULATOR_OUTPUT(5.0)
- MCFG_SOUND_ROUTE(0, "dac", 1.0, DAC_VREF_POS_INPUT) MCFG_SOUND_ROUTE(0, "dac", -1.0, DAC_VREF_NEG_INPUT)
-MACHINE_CONFIG_END
+ DAC_8BIT_R2R(config, m_dac, 0).add_route(ALL_OUTPUTS, "speaker", 0.5); // unknown DAC
+ voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref"));
+ vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT);
+ vref.add_route(0, "dac", -1.0, DAC_VREF_NEG_INPUT);
+}
void centronics_covox_device::device_start()
{
@@ -87,16 +89,19 @@ centronics_covox_stereo_device::centronics_covox_stereo_device(const machine_con
// device_add_mconfig - add device configuration
//-------------------------------------------------
-MACHINE_CONFIG_START(centronics_covox_stereo_device::device_add_mconfig)
+void centronics_covox_stereo_device::device_add_mconfig(machine_config &config)
+{
/* sound hardware */
SPEAKER(config, "lspeaker").front_left();
SPEAKER(config, "rspeaker").front_right();
- MCFG_DEVICE_ADD("ldac", DAC_8BIT_R2R, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 0.5) // unknown DAC
- MCFG_DEVICE_ADD("rdac", DAC_8BIT_R2R, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 0.5) // unknown DAC
- MCFG_DEVICE_ADD("vref", VOLTAGE_REGULATOR, 0) MCFG_VOLTAGE_REGULATOR_OUTPUT(5.0)
- MCFG_SOUND_ROUTE(0, "ldac", 1.0, DAC_VREF_POS_INPUT) MCFG_SOUND_ROUTE(0, "ldac", -1.0, DAC_VREF_NEG_INPUT)
- MCFG_SOUND_ROUTE(0, "rdac", 1.0, DAC_VREF_POS_INPUT) MCFG_SOUND_ROUTE(0, "rdac", -1.0, DAC_VREF_NEG_INPUT)
-MACHINE_CONFIG_END
+ DAC_8BIT_R2R(config, m_ldac, 0).add_route(ALL_OUTPUTS, "lspeaker", 0.5); // unknown DAC
+ DAC_8BIT_R2R(config, m_rdac, 0).add_route(ALL_OUTPUTS, "rspeaker", 0.5); // unknown DAC
+ voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref"));
+ vref.add_route(0, "ldac", 1.0, DAC_VREF_POS_INPUT);
+ vref.add_route(0, "ldac", -1.0, DAC_VREF_NEG_INPUT);
+ vref.add_route(0, "rdac", 1.0, DAC_VREF_POS_INPUT);
+ vref.add_route(0, "rdac", -1.0, DAC_VREF_NEG_INPUT);
+}
void centronics_covox_stereo_device::device_start()
{
diff --git a/src/devices/bus/centronics/ctronics.h b/src/devices/bus/centronics/ctronics.h
index c05d59a94c1..7189c465e98 100644
--- a/src/devices/bus/centronics/ctronics.h
+++ b/src/devices/bus/centronics/ctronics.h
@@ -14,68 +14,6 @@
#include "machine/output_latch.h"
-#define MCFG_CENTRONICS_STROBE_HANDLER(_devcb) \
- downcast<centronics_device &>(*device).set_strobe_handler(DEVCB_##_devcb);
-
-#define MCFG_CENTRONICS_DATA0_HANDLER(_devcb) \
- downcast<centronics_device &>(*device).set_data0_handler(DEVCB_##_devcb);
-
-#define MCFG_CENTRONICS_DATA1_HANDLER(_devcb) \
- downcast<centronics_device &>(*device).set_data1_handler(DEVCB_##_devcb);
-
-#define MCFG_CENTRONICS_DATA2_HANDLER(_devcb) \
- downcast<centronics_device &>(*device).set_data2_handler(DEVCB_##_devcb);
-
-#define MCFG_CENTRONICS_DATA3_HANDLER(_devcb) \
- downcast<centronics_device &>(*device).set_data3_handler(DEVCB_##_devcb);
-
-#define MCFG_CENTRONICS_DATA4_HANDLER(_devcb) \
- downcast<centronics_device &>(*device).set_data4_handler(DEVCB_##_devcb);
-
-#define MCFG_CENTRONICS_DATA5_HANDLER(_devcb) \
- downcast<centronics_device &>(*device).set_data5_handler(DEVCB_##_devcb);
-
-#define MCFG_CENTRONICS_DATA6_HANDLER(_devcb) \
- downcast<centronics_device &>(*device).set_data6_handler(DEVCB_##_devcb);
-
-#define MCFG_CENTRONICS_DATA7_HANDLER(_devcb) \
- downcast<centronics_device &>(*device).set_data7_handler(DEVCB_##_devcb);
-
-#define MCFG_CENTRONICS_ACK_HANDLER(_devcb) \
- downcast<centronics_device &>(*device).set_ack_handler(DEVCB_##_devcb);
-
-#define MCFG_CENTRONICS_BUSY_HANDLER(_devcb) \
- downcast<centronics_device &>(*device).set_busy_handler(DEVCB_##_devcb);
-
-#define MCFG_CENTRONICS_PERROR_HANDLER(_devcb) \
- downcast<centronics_device &>(*device).set_perror_handler(DEVCB_##_devcb);
-
-#define MCFG_CENTRONICS_SELECT_HANDLER(_devcb) \
- downcast<centronics_device &>(*device).set_select_handler(DEVCB_##_devcb);
-
-#define MCFG_CENTRONICS_AUTOFD_HANDLER(_devcb) \
- downcast<centronics_device &>(*device).set_autofd_handler(DEVCB_##_devcb);
-
-#define MCFG_CENTRONICS_FAULT_HANDLER(_devcb) \
- downcast<centronics_device &>(*device).set_fault_handler(DEVCB_##_devcb);
-
-#define MCFG_CENTRONICS_INIT_HANDLER(_devcb) \
- downcast<centronics_device &>(*device).set_init_handler(DEVCB_##_devcb);
-
-#define MCFG_CENTRONICS_SELECT_IN_HANDLER(_devcb) \
- downcast<centronics_device &>(*device).set_select_in_handler(DEVCB_##_devcb);
-
-#define MCFG_CENTRONICS_OUTPUT_LATCH_ADD(_tag, _centronics_tag) \
- MCFG_DEVICE_ADD(_tag, OUTPUT_LATCH, 0) \
- MCFG_OUTPUT_LATCH_BIT0_HANDLER(WRITELINE(_centronics_tag, centronics_device, write_data0)) \
- MCFG_OUTPUT_LATCH_BIT1_HANDLER(WRITELINE(_centronics_tag, centronics_device, write_data1)) \
- MCFG_OUTPUT_LATCH_BIT2_HANDLER(WRITELINE(_centronics_tag, centronics_device, write_data2)) \
- MCFG_OUTPUT_LATCH_BIT3_HANDLER(WRITELINE(_centronics_tag, centronics_device, write_data3)) \
- MCFG_OUTPUT_LATCH_BIT4_HANDLER(WRITELINE(_centronics_tag, centronics_device, write_data4)) \
- MCFG_OUTPUT_LATCH_BIT5_HANDLER(WRITELINE(_centronics_tag, centronics_device, write_data5)) \
- MCFG_OUTPUT_LATCH_BIT6_HANDLER(WRITELINE(_centronics_tag, centronics_device, write_data6)) \
- MCFG_OUTPUT_LATCH_BIT7_HANDLER(WRITELINE(_centronics_tag, centronics_device, write_data7))
-
DECLARE_DEVICE_TYPE(CENTRONICS, centronics_device)
class device_centronics_peripheral_interface;
@@ -97,24 +35,6 @@ public:
}
centronics_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- template <class Object> devcb_base &set_strobe_handler(Object &&cb) { return m_strobe_handler.set_callback(std::forward<Object>(cb)); }
- template <class Object> devcb_base &set_data0_handler(Object &&cb) { return m_data0_handler.set_callback(std::forward<Object>(cb)); }
- template <class Object> devcb_base &set_data1_handler(Object &&cb) { return m_data1_handler.set_callback(std::forward<Object>(cb)); }
- template <class Object> devcb_base &set_data2_handler(Object &&cb) { return m_data2_handler.set_callback(std::forward<Object>(cb)); }
- template <class Object> devcb_base &set_data3_handler(Object &&cb) { return m_data3_handler.set_callback(std::forward<Object>(cb)); }
- template <class Object> devcb_base &set_data4_handler(Object &&cb) { return m_data4_handler.set_callback(std::forward<Object>(cb)); }
- template <class Object> devcb_base &set_data5_handler(Object &&cb) { return m_data5_handler.set_callback(std::forward<Object>(cb)); }
- template <class Object> devcb_base &set_data6_handler(Object &&cb) { return m_data6_handler.set_callback(std::forward<Object>(cb)); }
- template <class Object> devcb_base &set_data7_handler(Object &&cb) { return m_data7_handler.set_callback(std::forward<Object>(cb)); }
- template <class Object> devcb_base &set_ack_handler(Object &&cb) { return m_ack_handler.set_callback(std::forward<Object>(cb)); }
- template <class Object> devcb_base &set_busy_handler(Object &&cb) { return m_busy_handler.set_callback(std::forward<Object>(cb)); }
- template <class Object> devcb_base &set_perror_handler(Object &&cb) { return m_perror_handler.set_callback(std::forward<Object>(cb)); }
- template <class Object> devcb_base &set_select_handler(Object &&cb) { return m_select_handler.set_callback(std::forward<Object>(cb)); }
- template <class Object> devcb_base &set_autofd_handler(Object &&cb) { return m_autofd_handler.set_callback(std::forward<Object>(cb)); }
- template <class Object> devcb_base &set_fault_handler(Object &&cb) { return m_fault_handler.set_callback(std::forward<Object>(cb)); }
- template <class Object> devcb_base &set_init_handler(Object &&cb) { return m_init_handler.set_callback(std::forward<Object>(cb)); }
- template <class Object> devcb_base &set_select_in_handler(Object &&cb) { return m_select_in_handler.set_callback(std::forward<Object>(cb)); }
-
auto strobe_handler() { return m_strobe_handler.bind(); }
auto ack_handler() { return m_ack_handler.bind(); }
diff --git a/src/devices/bus/centronics/digiblst.cpp b/src/devices/bus/centronics/digiblst.cpp
index 99a046f4d13..97a37054172 100644
--- a/src/devices/bus/centronics/digiblst.cpp
+++ b/src/devices/bus/centronics/digiblst.cpp
@@ -38,13 +38,15 @@ centronics_digiblaster_device::centronics_digiblaster_device(const machine_confi
// device_add_mconfig - add device configuration
//-------------------------------------------------
-MACHINE_CONFIG_START(centronics_digiblaster_device::device_add_mconfig)
+void centronics_digiblaster_device::device_add_mconfig(machine_config &config)
+{
/* sound hardware */
SPEAKER(config, "speaker").front_center();
- MCFG_DEVICE_ADD("dac", DAC_8BIT_R2R, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 0.5) // unknown DAC
- MCFG_DEVICE_ADD("vref", VOLTAGE_REGULATOR, 0) MCFG_VOLTAGE_REGULATOR_OUTPUT(5.0)
- MCFG_SOUND_ROUTE(0, "dac", 1.0, DAC_VREF_POS_INPUT) MCFG_SOUND_ROUTE(0, "dac", -1.0, DAC_VREF_NEG_INPUT)
-MACHINE_CONFIG_END
+ DAC_8BIT_R2R(config, m_dac, 0).add_route(ALL_OUTPUTS, "speaker", 0.5); // unknown DAC
+ voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref"));
+ vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT);
+ vref.add_route(0, "dac", -1.0, DAC_VREF_NEG_INPUT);
+}
void centronics_digiblaster_device::device_start()
{
diff --git a/src/devices/bus/centronics/epson_lx810l.cpp b/src/devices/bus/centronics/epson_lx810l.cpp
index 848f1246a90..0a0d9668cfc 100644
--- a/src/devices/bus/centronics/epson_lx810l.cpp
+++ b/src/devices/bus/centronics/epson_lx810l.cpp
@@ -142,7 +142,6 @@ void epson_lx810l_device::device_add_mconfig(machine_config &config)
SPEAKER(config, "speaker").front_center();
DAC_1BIT(config, "dac", 0).add_route(ALL_OUTPUTS, "speaker", 0.25);
voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref"));
- vref.set_output(5.0);
vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT);
/* gate array */
diff --git a/src/devices/bus/centronics/nec_p72.cpp b/src/devices/bus/centronics/nec_p72.cpp
index cd7914a0bde..c3a9ddd2ab2 100644
--- a/src/devices/bus/centronics/nec_p72.cpp
+++ b/src/devices/bus/centronics/nec_p72.cpp
@@ -49,12 +49,12 @@ void nec_p72_device::p72_mem(address_map &map)
// device_add_mconfig - add device configuration
//-------------------------------------------------
-MACHINE_CONFIG_START(nec_p72_device::device_add_mconfig)
+void nec_p72_device::device_add_mconfig(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", V33, XTAL(16'000'000)/2) /* TODO it's actually a V40 */
- MCFG_DEVICE_PROGRAM_MAP(p72_mem)
-
-MACHINE_CONFIG_END
+ V33(config, m_maincpu, XTAL(16'000'000)/2); /* TODO it's actually a V40 */
+ m_maincpu->set_addrmap(AS_PROGRAM, &nec_p72_device::p72_mem);
+}
//-------------------------------------------------
diff --git a/src/devices/bus/centronics/printer.cpp b/src/devices/bus/centronics/printer.cpp
index 129e53426f4..484e718d074 100644
--- a/src/devices/bus/centronics/printer.cpp
+++ b/src/devices/bus/centronics/printer.cpp
@@ -32,10 +32,11 @@ centronics_printer_device::centronics_printer_device(const machine_config &mconf
//-------------------------------------------------
-MACHINE_CONFIG_START(centronics_printer_device::device_add_mconfig)
- MCFG_DEVICE_ADD("printer", PRINTER, 0)
- MCFG_PRINTER_ONLINE_CB(WRITELINE(*this, centronics_printer_device, printer_online))
-MACHINE_CONFIG_END
+void centronics_printer_device::device_add_mconfig(machine_config &config)
+{
+ PRINTER(config, m_printer, 0);
+ m_printer->online_callback().set(FUNC(centronics_printer_device::printer_online));
+}
/*-------------------------------------------------
printer_online - callback that
diff --git a/src/devices/bus/cgenie/expansion/expansion.cpp b/src/devices/bus/cgenie/expansion/expansion.cpp
index 366b1513aca..3a7665f7c2b 100644
--- a/src/devices/bus/cgenie/expansion/expansion.cpp
+++ b/src/devices/bus/cgenie/expansion/expansion.cpp
@@ -30,8 +30,8 @@ DEFINE_DEVICE_TYPE(CG_EXP_SLOT, cg_exp_slot_device, "cg_exp_slot", "Colour Genie
cg_exp_slot_device::cg_exp_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) :
device_t(mconfig, CG_EXP_SLOT, tag, owner, clock),
device_slot_interface(mconfig, *this),
- m_program(nullptr),
- m_io(nullptr),
+ m_program(*this, finder_base::DUMMY_TAG, -1),
+ m_io(*this, finder_base::DUMMY_TAG, -1),
m_cart(nullptr),
m_int_handler(*this),
m_nmi_handler(*this),
@@ -67,24 +67,6 @@ void cg_exp_slot_device::device_reset()
{
}
-//-------------------------------------------------
-// set_program_space - set address space we are attached to
-//-------------------------------------------------
-
-void cg_exp_slot_device::set_program_space(address_space *program)
-{
- m_program = program;
-}
-
-//-------------------------------------------------
-// set_io_space - set address space we are attached to
-//-------------------------------------------------
-
-void cg_exp_slot_device::set_io_space(address_space *io)
-{
- m_io = io;
-}
-
//**************************************************************************
// CARTRIDGE INTERFACE
diff --git a/src/devices/bus/cgenie/expansion/expansion.h b/src/devices/bus/cgenie/expansion/expansion.h
index 2dd6f659f5e..3f61b275c19 100644
--- a/src/devices/bus/cgenie/expansion/expansion.h
+++ b/src/devices/bus/cgenie/expansion/expansion.h
@@ -39,24 +39,8 @@
#pragma once
-
-
-//**************************************************************************
-// INTERFACE CONFIGURATION MACROS
-//**************************************************************************
-
-#define MCFG_CG_EXP_SLOT_ADD(_tag) \
- MCFG_DEVICE_ADD(_tag, CG_EXP_SLOT, 0) \
- MCFG_DEVICE_SLOT_INTERFACE(cg_exp_slot_carts, nullptr, false)
-
-#define MCFG_CG_EXP_SLOT_INT_HANDLER(_devcb) \
- downcast<cg_exp_slot_device &>(*device).set_int_handler(DEVCB_##_devcb);
-
-#define MCFG_CG_EXP_SLOT_NMI_HANDLER(_devcb) \
- downcast<cg_exp_slot_device &>(*device).set_nmi_handler(DEVCB_##_devcb);
-
-#define MCFG_CG_EXP_SLOT_RESET_HANDLER(_devcb) \
- downcast<cg_exp_slot_device &>(*device).set_reset_handler(DEVCB_##_devcb);
+// include here so drivers don't need to
+#include "carts.h"
//**************************************************************************
@@ -69,24 +53,32 @@ class cg_exp_slot_device : public device_t, public device_slot_interface
{
public:
// construction/destruction
+ cg_exp_slot_device(machine_config const &mconfig, char const *tag, device_t *owner)
+ : cg_exp_slot_device(mconfig, tag, owner, (uint32_t)0)
+ {
+ option_reset();
+ cg_exp_slot_carts(*this);
+ set_default_option(nullptr);
+ set_fixed(false);
+ }
cg_exp_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
virtual ~cg_exp_slot_device();
- void set_program_space(address_space *program);
- void set_io_space(address_space *io);
+ template <typename T> void set_program_space(T &&tag, int spacenum) { m_program.set_tag(std::forward<T>(tag), spacenum); }
+ template <typename T> void set_io_space(T &&tag, int spacenum) { m_io.set_tag(std::forward<T>(tag), spacenum); }
// callbacks
- template <class Object> devcb_base &set_int_handler(Object &&cb) { return m_int_handler.set_callback(std::forward<Object>(cb)); }
- template <class Object> devcb_base &set_nmi_handler(Object &&cb) { return m_nmi_handler.set_callback(std::forward<Object>(cb)); }
- template <class Object> devcb_base &set_reset_handler(Object &&cb) { return m_reset_handler.set_callback(std::forward<Object>(cb)); }
+ auto int_handler() { return m_int_handler.bind(); }
+ auto nmi_handler() { return m_nmi_handler.bind(); }
+ auto reset_handler() { return m_reset_handler.bind(); }
// called from cart device
DECLARE_WRITE_LINE_MEMBER( int_w ) { m_int_handler(state); }
DECLARE_WRITE_LINE_MEMBER( nmi_w ) { m_nmi_handler(state); }
DECLARE_WRITE_LINE_MEMBER( reset_w ) { m_reset_handler(state); }
- address_space *m_program;
- address_space *m_io;
+ required_address_space m_program;
+ required_address_space m_io;
protected:
// device-level overrides
@@ -117,7 +109,4 @@ protected:
// device type definition
DECLARE_DEVICE_TYPE(CG_EXP_SLOT, cg_exp_slot_device)
-// include here so drivers don't need to
-#include "carts.h"
-
#endif // MAME_BUS_CGENIE_EXPANSION_EXPANSION_H
diff --git a/src/devices/bus/cgenie/expansion/floppy.cpp b/src/devices/bus/cgenie/expansion/floppy.cpp
index 021f00e9f8d..331fdfd207e 100644
--- a/src/devices/bus/cgenie/expansion/floppy.cpp
+++ b/src/devices/bus/cgenie/expansion/floppy.cpp
@@ -72,23 +72,23 @@ const tiny_rom_entry *cgenie_fdc_device::device_rom_region() const
//-------------------------------------------------
MACHINE_CONFIG_START(cgenie_fdc_device::device_add_mconfig)
- MCFG_TIMER_DRIVER_ADD_PERIODIC("timer", cgenie_fdc_device, timer_callback, attotime::from_msec(25))
+ TIMER(config, "timer").configure_periodic(FUNC(cgenie_fdc_device::timer_callback), attotime::from_msec(25));
FD1793(config, m_fdc, 1_MHz_XTAL);
m_fdc->intrq_wr_callback().set(FUNC(cgenie_fdc_device::intrq_w));
- MCFG_FLOPPY_DRIVE_ADD("fd1793:0", cgenie_floppies, "ssdd", cgenie_fdc_device::floppy_formats)
- MCFG_FLOPPY_DRIVE_ADD("fd1793:1", cgenie_floppies, "ssdd", cgenie_fdc_device::floppy_formats)
- MCFG_FLOPPY_DRIVE_ADD("fd1793:2", cgenie_floppies, nullptr, cgenie_fdc_device::floppy_formats)
- MCFG_FLOPPY_DRIVE_ADD("fd1793:3", cgenie_floppies, nullptr, cgenie_fdc_device::floppy_formats)
+ FLOPPY_CONNECTOR(config, "fd1793:0", cgenie_floppies, "ssdd", cgenie_fdc_device::floppy_formats);
+ FLOPPY_CONNECTOR(config, "fd1793:1", cgenie_floppies, "ssdd", cgenie_fdc_device::floppy_formats);
+ FLOPPY_CONNECTOR(config, "fd1793:2", cgenie_floppies, nullptr, cgenie_fdc_device::floppy_formats);
+ FLOPPY_CONNECTOR(config, "fd1793:3", cgenie_floppies, nullptr, cgenie_fdc_device::floppy_formats);
-// MCFG_SOFTWARE_LIST_ADD("floppy_list", "cgenie_flop")
+// SOFTWARE_LIST(config, "floppy_list").set_original("cgenie_flop");
MCFG_GENERIC_SOCKET_ADD("socket", generic_plain_slot, "cgenie_flop_rom")
MCFG_GENERIC_EXTENSIONS("bin,rom")
MCFG_GENERIC_LOAD(cgenie_fdc_device, socket_load)
- MCFG_SOFTWARE_LIST_ADD("rom_list", "cgenie_flop_rom")
+ SOFTWARE_LIST(config, "rom_list").set_original("cgenie_flop_rom");
MACHINE_CONFIG_END
@@ -137,7 +137,7 @@ void cgenie_fdc_device::device_reset()
// map extra socket
if (m_socket->exists())
{
- m_slot->m_program->install_read_handler(0xe000, 0xefff, read8_delegate(FUNC(generic_slot_device::read_rom), (generic_slot_device *) m_socket));
+ m_slot->m_program->install_read_handler(0xe000, 0xefff, read8sm_delegate(FUNC(generic_slot_device::read_rom), (generic_slot_device *) m_socket));
}
}
diff --git a/src/devices/bus/cgenie/parallel/parallel.h b/src/devices/bus/cgenie/parallel/parallel.h
index 9bc8d5665c4..b31f8c749f4 100644
--- a/src/devices/bus/cgenie/parallel/parallel.h
+++ b/src/devices/bus/cgenie/parallel/parallel.h
@@ -24,16 +24,8 @@
#pragma once
-
-
-//**************************************************************************
-// INTERFACE CONFIGURATION MACROS
-//**************************************************************************
-
-#define MCFG_CG_PARALLEL_SLOT_ADD(_tag) \
- MCFG_DEVICE_ADD(_tag, CG_PARALLEL_SLOT, 0) \
- MCFG_DEVICE_SLOT_INTERFACE(cg_parallel_slot_carts, nullptr, false)
-
+// include here so drivers don't need to
+#include "carts.h"
//**************************************************************************
// TYPE DEFINITIONS
@@ -45,6 +37,14 @@ class cg_parallel_slot_device : public device_t, public device_slot_interface
{
public:
// construction/destruction
+ cg_parallel_slot_device(machine_config const &mconfig, char const *tag, device_t *owner)
+ : cg_parallel_slot_device(mconfig, tag, owner, (uint32_t)0)
+ {
+ option_reset();
+ cg_parallel_slot_carts(*this);
+ set_default_option(nullptr);
+ set_fixed(false);
+ }
cg_parallel_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
virtual ~cg_parallel_slot_device();
@@ -86,7 +86,4 @@ protected:
// device type definition
DECLARE_DEVICE_TYPE(CG_PARALLEL_SLOT, cg_parallel_slot_device)
-// include here so drivers don't need to
-#include "carts.h"
-
#endif // MAME_BUS_CGENIE_PARALLEL_PARALLEL_H
diff --git a/src/devices/bus/cgenie/parallel/printer.cpp b/src/devices/bus/cgenie/parallel/printer.cpp
index bce52a61c97..9a3e9df5dc4 100644
--- a/src/devices/bus/cgenie/parallel/printer.cpp
+++ b/src/devices/bus/cgenie/parallel/printer.cpp
@@ -27,14 +27,17 @@ DEFINE_DEVICE_TYPE(CGENIE_PRINTER, cgenie_printer_device, "cgenie_printer", "Pri
// device_add_mconfig - add device configuration
//-------------------------------------------------
-MACHINE_CONFIG_START(cgenie_printer_device::device_add_mconfig)
- MCFG_DEVICE_ADD(m_centronics, CENTRONICS, centronics_devices, "printer")
- MCFG_CENTRONICS_BUSY_HANDLER(WRITELINE(*this, cgenie_printer_device, busy_w))
- MCFG_CENTRONICS_PERROR_HANDLER(WRITELINE(*this, cgenie_printer_device, perror_w))
- MCFG_CENTRONICS_SELECT_HANDLER(WRITELINE(*this, cgenie_printer_device, select_w))
- MCFG_CENTRONICS_FAULT_HANDLER(WRITELINE(*this, cgenie_printer_device, fault_w))
- MCFG_CENTRONICS_OUTPUT_LATCH_ADD("latch", "centronics")
-MACHINE_CONFIG_END
+void cgenie_printer_device::device_add_mconfig(machine_config &config)
+{
+ CENTRONICS(config, m_centronics, centronics_devices, "printer");
+ m_centronics->busy_handler().set(FUNC(cgenie_printer_device::busy_w));
+ m_centronics->perror_handler().set(FUNC(cgenie_printer_device::perror_w));
+ m_centronics->select_handler().set(FUNC(cgenie_printer_device::select_w));
+ m_centronics->fault_handler().set(FUNC(cgenie_printer_device::fault_w));
+
+ OUTPUT_LATCH(config, m_latch);
+ m_centronics->set_output_latch(*m_latch);
+}
//**************************************************************************
diff --git a/src/devices/bus/chanf/slot.h b/src/devices/bus/chanf/slot.h
index 289c1b3e600..d2f9654e8cd 100644
--- a/src/devices/bus/chanf/slot.h
+++ b/src/devices/bus/chanf/slot.h
@@ -64,7 +64,17 @@ class channelf_cart_slot_device : public device_t,
{
public:
// construction/destruction
- channelf_cart_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+ template <typename T>
+ channelf_cart_slot_device(machine_config const &mconfig, char const *tag, device_t *owner, T &&opts, char const *dflt)
+ : channelf_cart_slot_device(mconfig, tag, owner, 0)
+ {
+ option_reset();
+ opts(*this);
+ set_default_option(dflt);
+ set_fixed(false);
+ }
+
+ channelf_cart_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock = 0);
virtual ~channelf_cart_slot_device();
// device-level overrides
@@ -115,8 +125,4 @@ DECLARE_DEVICE_TYPE(CHANF_CART_SLOT, channelf_cart_slot_device)
#define CHANFSLOT_ROM_REGION_TAG ":cart:rom"
-#define MCFG_CHANNELF_CARTRIDGE_ADD(_tag,_slot_intf,_def_slot) \
- MCFG_DEVICE_ADD(_tag, CHANF_CART_SLOT, 0) \
- MCFG_DEVICE_SLOT_INTERFACE(_slot_intf, _def_slot, false)
-
#endif // MAME_BUS_CHANF_SLOT_H
diff --git a/src/devices/bus/coco/coco_dcmodem.cpp b/src/devices/bus/coco/coco_dcmodem.cpp
index cad760775b7..bebd6c275d5 100644
--- a/src/devices/bus/coco/coco_dcmodem.cpp
+++ b/src/devices/bus/coco/coco_dcmodem.cpp
@@ -58,8 +58,8 @@ namespace
virtual void device_start() override
{
install_readwrite_handler(0xFF6C, 0xFF6F,
- read8_delegate(FUNC(mos6551_device::read), (mos6551_device *)m_uart),
- write8_delegate(FUNC(mos6551_device::write), (mos6551_device *)m_uart));
+ read8sm_delegate(FUNC(mos6551_device::read), (mos6551_device *)m_uart),
+ write8sm_delegate(FUNC(mos6551_device::write), (mos6551_device *)m_uart));
}
virtual const tiny_rom_entry *device_rom_region() const override;
@@ -70,6 +70,11 @@ namespace
return memregion("eprom")->base();
}
+ virtual memory_region* get_cart_memregion() override
+ {
+ return memregion("eprom");
+ }
+
private:
// internal state
required_device<mos6551_device> m_uart;
diff --git a/src/devices/bus/coco/coco_fdc.cpp b/src/devices/bus/coco/coco_fdc.cpp
index db8df415ee3..79658d27d60 100644
--- a/src/devices/bus/coco/coco_fdc.cpp
+++ b/src/devices/bus/coco/coco_fdc.cpp
@@ -180,6 +180,15 @@ uint8_t* coco_family_fdc_device_base::get_cart_base()
return memregion("eprom")->base();
}
+//-------------------------------------------------
+// coco_family_fdc_device_base::get_cart_memregion
+//-------------------------------------------------
+
+memory_region* coco_family_fdc_device_base::get_cart_memregion()
+{
+ return memregion("eprom");
+}
+
//***************************************************************************
// COCO FDCs
@@ -334,17 +343,17 @@ READ8_MEMBER(coco_fdc_device_base::scs_read)
case 0x38: /* FF78 */
if (real_time_clock() == rtc_type::CLOUD9)
- m_ds1315->read_0(space, offset);
+ m_ds1315->read_0();
break;
case 0x39: /* FF79 */
if (real_time_clock() == rtc_type::CLOUD9)
- m_ds1315->read_1(space, offset);
+ m_ds1315->read_1();
break;
case 0x3C: /* FF7C */
if (real_time_clock() == rtc_type::CLOUD9)
- result = m_ds1315->read_data(space, offset);
+ result = m_ds1315->read_data();
break;
}
return result;
diff --git a/src/devices/bus/coco/coco_fdc.h b/src/devices/bus/coco/coco_fdc.h
index a8df8313a7c..2568ed51bd0 100644
--- a/src/devices/bus/coco/coco_fdc.h
+++ b/src/devices/bus/coco/coco_fdc.h
@@ -46,6 +46,7 @@ protected:
// FDC overrides
virtual void update_lines() = 0;
virtual uint8_t* get_cart_base() override;
+ virtual memory_region* get_cart_memregion() override;
// accessors
uint8_t dskreg() const { return m_dskreg; }
diff --git a/src/devices/bus/coco/coco_gmc.cpp b/src/devices/bus/coco/coco_gmc.cpp
index 706bdf3cb1b..72c9edfdc80 100644
--- a/src/devices/bus/coco/coco_gmc.cpp
+++ b/src/devices/bus/coco/coco_gmc.cpp
@@ -51,11 +51,11 @@ namespace
};
-MACHINE_CONFIG_START(coco_pak_gmc_device::device_add_mconfig)
+void coco_pak_gmc_device::device_add_mconfig(machine_config &config)
+{
SPEAKER(config, "gmc_speaker").front_center();
- MCFG_DEVICE_ADD(SN76489AN_TAG, SN76489A, 4_MHz_XTAL)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "gmc_speaker", 1.0)
-MACHINE_CONFIG_END
+ SN76489A(config, m_psg, 4_MHz_XTAL).add_route(ALL_OUTPUTS, "gmc_speaker", 1.0);
+}
//**************************************************************************
diff --git a/src/devices/bus/coco/coco_multi.cpp b/src/devices/bus/coco/coco_multi.cpp
index 60a2b99286c..628a550fe07 100644
--- a/src/devices/bus/coco/coco_multi.cpp
+++ b/src/devices/bus/coco/coco_multi.cpp
@@ -96,29 +96,6 @@ namespace
// construction/destruction
coco_multipak_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- // optional information overrides
- virtual void device_add_mconfig(machine_config &config) override;
-
- virtual uint8_t* get_cart_base() override;
- virtual uint32_t get_cart_size() override;
-
- // these are only public so they can be in a MACHINE_CONFIG_START
- // declaration; don't think about them as publically accessable
- DECLARE_WRITE_LINE_MEMBER(multi_slot1_cart_w);
- DECLARE_WRITE_LINE_MEMBER(multi_slot1_nmi_w);
- DECLARE_WRITE_LINE_MEMBER(multi_slot1_halt_w);
- DECLARE_WRITE_LINE_MEMBER(multi_slot2_cart_w);
- DECLARE_WRITE_LINE_MEMBER(multi_slot2_nmi_w);
- DECLARE_WRITE_LINE_MEMBER(multi_slot2_halt_w);
- DECLARE_WRITE_LINE_MEMBER(multi_slot3_cart_w);
- DECLARE_WRITE_LINE_MEMBER(multi_slot3_nmi_w);
- DECLARE_WRITE_LINE_MEMBER(multi_slot3_halt_w);
- DECLARE_WRITE_LINE_MEMBER(multi_slot4_cart_w);
- DECLARE_WRITE_LINE_MEMBER(multi_slot4_nmi_w);
- DECLARE_WRITE_LINE_MEMBER(multi_slot4_halt_w);
-
- virtual address_space &cartridge_space() override;
- virtual ioport_constructor device_input_ports() const override;
INPUT_CHANGED_MEMBER( switch_changed );
protected:
@@ -129,6 +106,15 @@ namespace
virtual WRITE8_MEMBER(scs_write) override;
virtual void set_sound_enable(bool sound_enable) override;
+ // optional information overrides
+ virtual void device_add_mconfig(machine_config &config) override;
+
+ virtual uint8_t* get_cart_base() override;
+ virtual uint32_t get_cart_size() override;
+
+ virtual address_space &cartridge_space() override;
+ virtual ioport_constructor device_input_ports() const override;
+
private:
// device references
required_device_array<cococart_slot_device, 4> m_slots;
@@ -149,6 +135,19 @@ namespace
DECLARE_READ8_MEMBER(ff7f_read);
DECLARE_WRITE8_MEMBER(ff7f_write);
void update_line(int slot_number, line ln);
+
+ DECLARE_WRITE_LINE_MEMBER(multi_slot1_cart_w);
+ DECLARE_WRITE_LINE_MEMBER(multi_slot1_nmi_w);
+ DECLARE_WRITE_LINE_MEMBER(multi_slot1_halt_w);
+ DECLARE_WRITE_LINE_MEMBER(multi_slot2_cart_w);
+ DECLARE_WRITE_LINE_MEMBER(multi_slot2_nmi_w);
+ DECLARE_WRITE_LINE_MEMBER(multi_slot2_halt_w);
+ DECLARE_WRITE_LINE_MEMBER(multi_slot3_cart_w);
+ DECLARE_WRITE_LINE_MEMBER(multi_slot3_nmi_w);
+ DECLARE_WRITE_LINE_MEMBER(multi_slot3_halt_w);
+ DECLARE_WRITE_LINE_MEMBER(multi_slot4_cart_w);
+ DECLARE_WRITE_LINE_MEMBER(multi_slot4_nmi_w);
+ DECLARE_WRITE_LINE_MEMBER(multi_slot4_halt_w);
};
};
@@ -182,24 +181,25 @@ static void coco_cart_slot4(device_slot_interface &device)
}
-MACHINE_CONFIG_START(coco_multipak_device::device_add_mconfig)
- MCFG_COCO_CARTRIDGE_ADD(SLOT1_TAG, coco_cart_slot1_3, nullptr)
- MCFG_COCO_CARTRIDGE_CART_CB(WRITELINE(DEVICE_SELF, coco_multipak_device, multi_slot1_cart_w))
- MCFG_COCO_CARTRIDGE_NMI_CB(WRITELINE(DEVICE_SELF, coco_multipak_device, multi_slot1_nmi_w))
- MCFG_COCO_CARTRIDGE_HALT_CB(WRITELINE(DEVICE_SELF, coco_multipak_device, multi_slot1_halt_w))
- MCFG_COCO_CARTRIDGE_ADD(SLOT2_TAG, coco_cart_slot1_3, nullptr)
- MCFG_COCO_CARTRIDGE_CART_CB(WRITELINE(DEVICE_SELF, coco_multipak_device, multi_slot2_cart_w))
- MCFG_COCO_CARTRIDGE_NMI_CB(WRITELINE(DEVICE_SELF, coco_multipak_device, multi_slot2_nmi_w))
- MCFG_COCO_CARTRIDGE_HALT_CB(WRITELINE(DEVICE_SELF, coco_multipak_device, multi_slot2_halt_w))
- MCFG_COCO_CARTRIDGE_ADD(SLOT3_TAG, coco_cart_slot1_3, nullptr)
- MCFG_COCO_CARTRIDGE_CART_CB(WRITELINE(DEVICE_SELF, coco_multipak_device, multi_slot3_cart_w))
- MCFG_COCO_CARTRIDGE_NMI_CB(WRITELINE(DEVICE_SELF, coco_multipak_device, multi_slot3_nmi_w))
- MCFG_COCO_CARTRIDGE_HALT_CB(WRITELINE(DEVICE_SELF, coco_multipak_device, multi_slot3_halt_w))
- MCFG_COCO_CARTRIDGE_ADD(SLOT4_TAG, coco_cart_slot4, "fdcv11")
- MCFG_COCO_CARTRIDGE_CART_CB(WRITELINE(DEVICE_SELF, coco_multipak_device, multi_slot4_cart_w))
- MCFG_COCO_CARTRIDGE_NMI_CB(WRITELINE(DEVICE_SELF, coco_multipak_device, multi_slot4_nmi_w))
- MCFG_COCO_CARTRIDGE_HALT_CB(WRITELINE(DEVICE_SELF, coco_multipak_device, multi_slot4_halt_w))
-MACHINE_CONFIG_END
+void coco_multipak_device::device_add_mconfig(machine_config &config)
+{
+ COCOCART_SLOT(config, m_slots[0], DERIVED_CLOCK(1, 1), coco_cart_slot1_3, nullptr);
+ m_slots[0]->cart_callback().set(FUNC(coco_multipak_device::multi_slot1_cart_w));
+ m_slots[0]->nmi_callback().set(FUNC(coco_multipak_device::multi_slot1_nmi_w));
+ m_slots[0]->halt_callback().set(FUNC(coco_multipak_device::multi_slot1_halt_w));
+ COCOCART_SLOT(config, m_slots[1], DERIVED_CLOCK(1, 1), coco_cart_slot1_3, nullptr);
+ m_slots[1]->cart_callback().set(FUNC(coco_multipak_device::multi_slot2_cart_w));
+ m_slots[1]->nmi_callback().set(FUNC(coco_multipak_device::multi_slot2_nmi_w));
+ m_slots[1]->halt_callback().set(FUNC(coco_multipak_device::multi_slot2_halt_w));
+ COCOCART_SLOT(config, m_slots[2], DERIVED_CLOCK(1, 1), coco_cart_slot1_3, nullptr);
+ m_slots[2]->cart_callback().set(FUNC(coco_multipak_device::multi_slot3_cart_w));
+ m_slots[2]->nmi_callback().set(FUNC(coco_multipak_device::multi_slot3_nmi_w));
+ m_slots[2]->halt_callback().set(FUNC(coco_multipak_device::multi_slot3_halt_w));
+ COCOCART_SLOT(config, m_slots[3], DERIVED_CLOCK(1, 1), coco_cart_slot4, "fdcv11");
+ m_slots[3]->cart_callback().set(FUNC(coco_multipak_device::multi_slot4_cart_w));
+ m_slots[3]->nmi_callback().set(FUNC(coco_multipak_device::multi_slot4_nmi_w));
+ m_slots[3]->halt_callback().set(FUNC(coco_multipak_device::multi_slot4_halt_w));
+}
INPUT_PORTS_START( coco_multipack )
PORT_START( SWITCH_CONFIG_TAG )
diff --git a/src/devices/bus/coco/coco_orch90.cpp b/src/devices/bus/coco/coco_orch90.cpp
index 979acd423a1..2ad8afdaae1 100644
--- a/src/devices/bus/coco/coco_orch90.cpp
+++ b/src/devices/bus/coco/coco_orch90.cpp
@@ -92,6 +92,11 @@ namespace
return memregion("eprom")->base();
}
+ virtual memory_region* get_cart_memregion() override
+ {
+ return memregion("eprom");
+ }
+
private:
WRITE8_MEMBER(write_left) { m_ldac->write(data); }
WRITE8_MEMBER(write_right) { m_rdac->write(data); }
@@ -107,15 +112,16 @@ namespace
// MACHINE AND ROM DECLARATIONS
//**************************************************************************
-MACHINE_CONFIG_START(coco_orch90_device::device_add_mconfig)
+void coco_orch90_device::device_add_mconfig(machine_config &config)
+{
SPEAKER(config, "lspeaker").front_left();
SPEAKER(config, "rspeaker").front_right();
- MCFG_DEVICE_ADD("ldac", DAC_8BIT_R2R, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 0.5) // ls374.ic5 + r7 (8x20k) + r9 (8x10k)
- MCFG_DEVICE_ADD("rdac", DAC_8BIT_R2R, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 0.5) // ls374.ic4 + r6 (8x20k) + r8 (8x10k)
- MCFG_DEVICE_ADD("vref", VOLTAGE_REGULATOR, 0) MCFG_VOLTAGE_REGULATOR_OUTPUT(5.0)
- MCFG_SOUND_ROUTE(0, "ldac", 1.0, DAC_VREF_POS_INPUT) MCFG_SOUND_ROUTE(0, "ldac", -1.0, DAC_VREF_NEG_INPUT)
- MCFG_SOUND_ROUTE(0, "rdac", 1.0, DAC_VREF_POS_INPUT) MCFG_SOUND_ROUTE(0, "rdac", -1.0, DAC_VREF_NEG_INPUT)
-MACHINE_CONFIG_END
+ DAC_8BIT_R2R(config, m_ldac, 0).add_route(ALL_OUTPUTS, "lspeaker", 0.5); // ls374.ic5 + r7 (8x20k) + r9 (8x10k)
+ DAC_8BIT_R2R(config, m_rdac, 0).add_route(ALL_OUTPUTS, "rspeaker", 0.5); // ls374.ic4 + r6 (8x20k) + r8 (8x10k)
+ voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref"));
+ vref.add_route(0, "ldac", 1.0, DAC_VREF_POS_INPUT); vref.add_route(0, "ldac", -1.0, DAC_VREF_NEG_INPUT);
+ vref.add_route(0, "rdac", 1.0, DAC_VREF_POS_INPUT); vref.add_route(0, "rdac", -1.0, DAC_VREF_NEG_INPUT);
+}
//**************************************************************************
diff --git a/src/devices/bus/coco/coco_rs232.cpp b/src/devices/bus/coco/coco_rs232.cpp
index 802d46251ad..5a124986792 100644
--- a/src/devices/bus/coco/coco_rs232.cpp
+++ b/src/devices/bus/coco/coco_rs232.cpp
@@ -56,8 +56,8 @@ namespace
virtual void device_start() override
{
install_readwrite_handler(0xFF68, 0xFF6B,
- read8_delegate(FUNC(mos6551_device::read), (mos6551_device *)m_uart),
- write8_delegate(FUNC(mos6551_device::write), (mos6551_device *)m_uart));
+ read8sm_delegate(FUNC(mos6551_device::read), (mos6551_device *)m_uart),
+ write8sm_delegate(FUNC(mos6551_device::write), (mos6551_device *)m_uart));
}
virtual const tiny_rom_entry *device_rom_region() const override;
@@ -68,6 +68,11 @@ namespace
return memregion("eprom")->base();
}
+ virtual memory_region* get_cart_memregion() override
+ {
+ return memregion("eprom");
+ }
+
private:
// internal state
required_device<mos6551_device> m_uart;
diff --git a/src/devices/bus/coco/coco_ssc.cpp b/src/devices/bus/coco/coco_ssc.cpp
index 8840df18835..6dcd34a8f03 100644
--- a/src/devices/bus/coco/coco_ssc.cpp
+++ b/src/devices/bus/coco/coco_ssc.cpp
@@ -152,7 +152,8 @@ DEFINE_DEVICE_TYPE(COCOSSC_SAC, cocossc_sac_device, "cocossc_sac", "CoCo SSC Sou
// MACHINE FRAGMENTS AND ADDRESS MAPS
//**************************************************************************
-MACHINE_CONFIG_START(coco_ssc_device::device_add_mconfig)
+void coco_ssc_device::device_add_mconfig(machine_config &config)
+{
TMS7040(config, m_tms7040, DERIVED_CLOCK(2, 1));
m_tms7040->in_porta().set(FUNC(coco_ssc_device::ssc_port_a_r));
m_tms7040->out_portb().set(FUNC(coco_ssc_device::ssc_port_b_w));
@@ -173,9 +174,9 @@ MACHINE_CONFIG_START(coco_ssc_device::device_add_mconfig)
m_ay->set_flags(AY8910_SINGLE_OUTPUT);
m_ay->add_route(ALL_OUTPUTS, "coco_sac_tag", AY8913_GAIN);
- MCFG_DEVICE_ADD("coco_sac_tag", COCOSSC_SAC, DERIVED_CLOCK(2, 1))
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "ssc_audio", 1.0)
-MACHINE_CONFIG_END
+ COCOSSC_SAC(config, m_sac, DERIVED_CLOCK(2, 1));
+ m_sac->add_route(ALL_OUTPUTS, "ssc_audio", 1.0);
+}
ROM_START(coco_ssc)
ROM_REGION(0x1000, PIC_TAG, 0)
@@ -437,12 +438,12 @@ WRITE8_MEMBER(coco_ssc_device::ssc_port_c_w)
{
if( (data & (C_BDR|C_BC1)) == (C_BDR|C_BC1) ) /* BDIR = 1, BC1 = 1: latch address */
{
- m_ay->address_w(space, 0, m_tms7000_portd);
+ m_ay->address_w(m_tms7000_portd);
}
if( ((data & C_BDR) == C_BDR) && ((data & C_BC1) == 0) ) /* BDIR = 1, BC1 = 0: write data */
{
- m_ay->data_w(space, 0, m_tms7000_portd);
+ m_ay->data_w(m_tms7000_portd);
}
}
@@ -492,7 +493,7 @@ READ8_MEMBER(coco_ssc_device::ssc_port_d_r)
{
if( ((m_tms7000_portc & C_BDR) == 0) && ((m_tms7000_portc & C_BC1) == C_BC1) ) /* psg read data */
{
- m_tms7000_portd = m_ay->data_r(space, 0);
+ m_tms7000_portd = m_ay->data_r();
}
}
diff --git a/src/devices/bus/coco/coco_t4426.cpp b/src/devices/bus/coco/coco_t4426.cpp
index eaa6f651ef2..11c4499990a 100644
--- a/src/devices/bus/coco/coco_t4426.cpp
+++ b/src/devices/bus/coco/coco_t4426.cpp
@@ -332,16 +332,13 @@ READ8_MEMBER(coco_t4426_device::scs_read)
if ((offset >= 0x00) && (offset <= 0x07))
{
LOGPIA("- PIA\n");
- result = m_pia->read(space, offset & 3);
+ result = m_pia->read(offset & 3);
LOGPIA("- Offs:%04x Data:%02x\n", offset - 0x04, result);
}
else if ((offset >= 0x08) && (offset <= 0x0f) && (offset & 2))
{
LOGACIA("- ACIA\n");
- if (offset & 1)
- result = m_uart->status_r(space, offset & 1);
- else
- result = m_uart->data_r(space, offset & 1);
+ result = m_uart->read(offset & 1);
LOGACIA("- Offs:%04x Data:%02x\n", offset - 0x04, result);
}
else
@@ -366,15 +363,12 @@ WRITE8_MEMBER(coco_t4426_device::scs_write)
if ((offset >= 0x00) && (offset <= 0x07))
{
LOG("- PIA\n");
- m_pia->write(space, offset & 3, data);
+ m_pia->write(offset & 3, data);
}
else if ((offset >= 0x08) && (offset <= 0x0f) && (offset & 2))
{
LOGACIA("- ACIA");
- if (offset & 1)
- m_uart->control_w(space, offset & 1, data);
- else
- m_uart->data_w(space, offset & 1, data);
+ m_uart->write(offset & 1, data);
LOGACIA(" - Offs:%04x Data:%02x\n", offset & 1, data);
}
else
diff --git a/src/devices/bus/coco/cococart.cpp b/src/devices/bus/coco/cococart.cpp
index 2c009aa8724..6bf6360d24b 100644
--- a/src/devices/bus/coco/cococart.cpp
+++ b/src/devices/bus/coco/cococart.cpp
@@ -412,11 +412,11 @@ image_init_result cococart_slot_device::call_load()
{
memory_region *cart_mem = m_cart->get_cart_memregion();
uint8_t *base = cart_mem->base();
- offs_t read_length, cart_legnth = cart_mem->bytes();;
+ offs_t read_length, cart_length = cart_mem->bytes();;
if (!loaded_through_softlist())
{
- read_length = fread(base, cart_legnth);
+ read_length = fread(base, cart_length);
}
else
{
@@ -424,7 +424,7 @@ image_init_result cococart_slot_device::call_load()
memcpy(base, get_software_region("rom"), read_length);
}
- while (read_length < cart_legnth)
+ while (read_length < cart_length)
{
offs_t len = std::min(read_length, m_cart->get_cart_size() - read_length);
memcpy(base + read_length, base, len);
@@ -597,40 +597,6 @@ address_space &device_cococart_interface::cartridge_space()
//-------------------------------------------------
-// install_read_handler
-//-------------------------------------------------
-
-void device_cococart_interface::install_read_handler(uint16_t addrstart, uint16_t addrend, read8_delegate rhandler)
-{
- address_space &space(cartridge_space());
- space.install_read_handler(addrstart, addrend, rhandler);
-}
-
-
-//-------------------------------------------------
-// install_write_handler
-//-------------------------------------------------
-
-void device_cococart_interface::install_write_handler(uint16_t addrstart, uint16_t addrend, write8_delegate whandler)
-{
- address_space &space(cartridge_space());
- space.install_write_handler(addrstart, addrend, whandler);
-}
-
-
-//-------------------------------------------------
-// install_readwrite_handler
-//-------------------------------------------------
-
-void device_cococart_interface::install_readwrite_handler(uint16_t addrstart, uint16_t addrend, read8_delegate rhandler, write8_delegate whandler)
-{
- address_space &space(cartridge_space());
- space.install_read_handler(addrstart, addrend, rhandler);
- space.install_write_handler(addrstart, addrend, whandler);
-}
-
-
-//-------------------------------------------------
// set_line_value
//-------------------------------------------------
diff --git a/src/devices/bus/coco/cococart.h b/src/devices/bus/coco/cococart.h
index 2d5d37fd443..c559a2eea53 100644
--- a/src/devices/bus/coco/cococart.h
+++ b/src/devices/bus/coco/cococart.h
@@ -25,15 +25,6 @@
// direct region update handler
typedef delegate<void (uint8_t *)> cococart_base_update_delegate;
-#define MCFG_COCO_CARTRIDGE_CART_CB(_devcb) \
- downcast<cococart_slot_device &>(*device).set_cart_callback(DEVCB_##_devcb);
-
-#define MCFG_COCO_CARTRIDGE_NMI_CB(_devcb) \
- downcast<cococart_slot_device &>(*device).set_nmi_callback(DEVCB_##_devcb);
-
-#define MCFG_COCO_CARTRIDGE_HALT_CB(_devcb) \
- downcast<cococart_slot_device &>(*device).set_halt_callback(DEVCB_##_devcb);
-
// ======================> cococart_slot_device
class device_cococart_interface;
@@ -72,9 +63,6 @@ public:
}
cococart_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- template <class Object> devcb_base &set_cart_callback(Object &&cb) { return m_cart_callback.set_callback(std::forward<Object>(cb)); }
- template <class Object> devcb_base &set_nmi_callback(Object &&cb) { return m_nmi_callback.set_callback(std::forward<Object>(cb)); }
- template <class Object> devcb_base &set_halt_callback(Object &&cb) { return m_halt_callback.set_callback(std::forward<Object>(cb)); }
auto cart_callback() { return m_cart_callback.bind(); }
auto nmi_callback() { return m_nmi_callback.bind(); }
auto halt_callback() { return m_halt_callback.bind(); }
@@ -199,9 +187,25 @@ protected:
// cartridges (e.g. - Orch-90, Multi-Pak interface) for their control registers, independently
// of the SCS or CTS lines
address_space &cartridge_space();
- void install_read_handler(uint16_t addrstart, uint16_t addrend, read8_delegate rhandler);
- void install_write_handler(uint16_t addrstart, uint16_t addrend, write8_delegate whandler);
- void install_readwrite_handler(uint16_t addrstart, uint16_t addrend, read8_delegate rhandler, write8_delegate whandler);
+ template <typename R>
+ void install_read_handler(u16 addrstart, u16 addrend, R &&rhandler)
+ {
+ address_space &space(cartridge_space());
+ space.install_read_handler(addrstart, addrend, std::forward<R>(rhandler));
+ }
+ template <typename W>
+ void install_write_handler(u16 addrstart, u16 addrend, W &&whandler)
+ {
+ address_space &space(cartridge_space());
+ space.install_write_handler(addrstart, addrend, std::forward<W>(whandler));
+ }
+ template <typename R, typename W>
+ void install_readwrite_handler(u16 addrstart, u16 addrend, R &&rhandler, W &&whandler)
+ {
+ address_space &space(cartridge_space());
+ space.install_read_handler(addrstart, addrend, std::forward<R>(rhandler));
+ space.install_write_handler(addrstart, addrend, std::forward<W>(whandler));
+ }
// setting line values
void set_line_value(cococart_slot_device::line line, cococart_slot_device::line_value value);
@@ -216,16 +220,4 @@ private:
device_cococart_host_interface * m_host;
};
-
-/***************************************************************************
- DEVICE CONFIGURATION MACROS
-***************************************************************************/
-
-#define MCFG_COCO_CARTRIDGE_ADD(_tag,_slot_intf,_def_slot) \
- MCFG_DEVICE_ADD(_tag, COCOCART_SLOT, DERIVED_CLOCK(1, 1)) \
- MCFG_DEVICE_SLOT_INTERFACE(_slot_intf, _def_slot, false)
-
-#define MCFG_COCO_CARTRIDGE_REMOVE(_tag) \
- MCFG_DEVICE_REMOVE(_tag)
-
#endif // MAME_BUS_COCO_COCOCART_H
diff --git a/src/devices/bus/coco/dragon_jcbsnd.cpp b/src/devices/bus/coco/dragon_jcbsnd.cpp
index 8fae5eaf8df..efb2bc42a62 100644
--- a/src/devices/bus/coco/dragon_jcbsnd.cpp
+++ b/src/devices/bus/coco/dragon_jcbsnd.cpp
@@ -22,7 +22,7 @@
ROM_START( dragon_jcbsnd )
- ROM_REGION(0x8000, "eprom", ROMREGION_ERASE00)
+ ROM_REGION(0x1000, "eprom", ROMREGION_ERASE00)
ROM_LOAD("d32sem.rom", 0x0000, 0x1000, CRC(4cd0f30b) SHA1(d07bb9272e3d3928059853730ff656905a80b68e))
ROM_END
@@ -53,8 +53,8 @@ dragon_jcbsnd_device::dragon_jcbsnd_device(const machine_config &mconfig, const
void dragon_jcbsnd_device::device_start()
{
- install_write_handler(0xfefe, 0xfefe, write8_delegate(FUNC(ay8910_device::address_w), (ay8910_device *)m_ay8910));
- install_readwrite_handler(0xfeff, 0xfeff, read8_delegate(FUNC(ay8910_device::data_r), (ay8910_device *)m_ay8910), write8_delegate(FUNC(ay8910_device::data_w), (ay8910_device *)m_ay8910));
+ install_write_handler(0xfefe, 0xfefe, write8smo_delegate(FUNC(ay8910_device::address_w), (ay8910_device *)m_ay8910));
+ install_readwrite_handler(0xfeff, 0xfeff, read8smo_delegate(FUNC(ay8910_device::data_r), (ay8910_device *)m_ay8910), write8smo_delegate(FUNC(ay8910_device::data_w), (ay8910_device *)m_ay8910));
set_line_value(line::CART, line_value::Q);
}
@@ -69,6 +69,15 @@ uint8_t* dragon_jcbsnd_device::get_cart_base()
}
//-------------------------------------------------
+// dragon_jcbsnd_device::get_cart_memregion
+//-------------------------------------------------
+
+memory_region* dragon_jcbsnd_device::get_cart_memregion()
+{
+ return memregion("eprom");
+}
+
+//-------------------------------------------------
// device_add_mconfig - add device configuration
//-------------------------------------------------
diff --git a/src/devices/bus/coco/dragon_jcbsnd.h b/src/devices/bus/coco/dragon_jcbsnd.h
index 35167dd53f8..2ed76628075 100644
--- a/src/devices/bus/coco/dragon_jcbsnd.h
+++ b/src/devices/bus/coco/dragon_jcbsnd.h
@@ -29,6 +29,7 @@ protected:
// device-level overrides
virtual void device_start() override;
virtual uint8_t* get_cart_base() override;
+ virtual memory_region* get_cart_memregion() override;
// internal state
device_image_interface *m_cart;
diff --git a/src/devices/bus/coleco/exp.cpp b/src/devices/bus/coleco/cartridge/exp.cpp
index c2878c4523a..eaf3f144322 100644
--- a/src/devices/bus/coleco/exp.cpp
+++ b/src/devices/bus/coleco/cartridge/exp.cpp
@@ -118,11 +118,11 @@ std::string colecovision_cartridge_slot_device::get_default_card_software(get_de
// bd_r - cartridge data read
//-------------------------------------------------
-uint8_t colecovision_cartridge_slot_device::bd_r(address_space &space, offs_t offset, uint8_t data, int _8000, int _a000, int _c000, int _e000)
+uint8_t colecovision_cartridge_slot_device::bd_r(offs_t offset, uint8_t data, int _8000, int _a000, int _c000, int _e000)
{
if (m_card != nullptr)
{
- data = m_card->bd_r(space, offset, data, _8000, _a000, _c000, _e000);
+ data = m_card->bd_r(offset, data, _8000, _a000, _c000, _e000);
}
return data;
diff --git a/src/devices/bus/coleco/exp.h b/src/devices/bus/coleco/cartridge/exp.h
index a4bf724c6e7..4da9d2d1d00 100644
--- a/src/devices/bus/coleco/exp.h
+++ b/src/devices/bus/coleco/cartridge/exp.h
@@ -65,7 +65,7 @@ public:
colecovision_cartridge_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
// computer interface
- uint8_t bd_r(address_space &space, offs_t offset, uint8_t data, int _8000, int _a000, int _c000, int _e000);
+ uint8_t bd_r(offs_t offset, uint8_t data, int _8000, int _a000, int _c000, int _e000);
protected:
// device-level overrides
@@ -99,7 +99,7 @@ class device_colecovision_cartridge_interface : public device_slot_card_interfac
friend class colecovision_cartridge_slot_device;
public:
- virtual uint8_t bd_r(address_space &space, offs_t offset, uint8_t data, int _8000, int _a000, int _c000, int _e000) { return 0xff; }
+ virtual uint8_t bd_r(offs_t offset, uint8_t data, int _8000, int _a000, int _c000, int _e000) { return 0xff; }
void rom_alloc(size_t size);
diff --git a/src/devices/bus/coleco/std.cpp b/src/devices/bus/coleco/cartridge/std.cpp
index ae490dea2e9..24bb815834e 100644
--- a/src/devices/bus/coleco/std.cpp
+++ b/src/devices/bus/coleco/cartridge/std.cpp
@@ -47,7 +47,7 @@ void colecovision_standard_cartridge_device::device_start()
// read - cartridge data read
//-------------------------------------------------
-uint8_t colecovision_standard_cartridge_device::bd_r(address_space &space, offs_t offset, uint8_t data, int _8000, int _a000, int _c000, int _e000)
+uint8_t colecovision_standard_cartridge_device::bd_r(offs_t offset, uint8_t data, int _8000, int _a000, int _c000, int _e000)
{
if (!_8000 || !_a000 || !_c000 || !_e000)
{
diff --git a/src/devices/bus/coleco/std.h b/src/devices/bus/coleco/cartridge/std.h
index 7ee221502a7..6e0c5206ada 100644
--- a/src/devices/bus/coleco/std.h
+++ b/src/devices/bus/coleco/cartridge/std.h
@@ -33,7 +33,7 @@ protected:
virtual void device_start() override;
// device_colecovision_expansion_card_interface overrides
- virtual uint8_t bd_r(address_space &space, offs_t offset, uint8_t data, int _8000, int _a000, int _c000, int _e000) override;
+ virtual uint8_t bd_r(offs_t offset, uint8_t data, int _8000, int _a000, int _c000, int _e000) override;
};
diff --git a/src/devices/bus/coleco/xin1.cpp b/src/devices/bus/coleco/cartridge/xin1.cpp
index 3538f93bb90..140d2132ee4 100644
--- a/src/devices/bus/coleco/xin1.cpp
+++ b/src/devices/bus/coleco/cartridge/xin1.cpp
@@ -58,7 +58,7 @@ void colecovision_xin1_cartridge_device::device_reset()
// read - cartridge data read
//-------------------------------------------------
-uint8_t colecovision_xin1_cartridge_device::bd_r(address_space &space, offs_t offset, uint8_t data, int _8000, int _a000, int _c000, int _e000)
+uint8_t colecovision_xin1_cartridge_device::bd_r(offs_t offset, uint8_t data, int _8000, int _a000, int _c000, int _e000)
{
if (!_8000 || !_a000 || !_c000 || !_e000)
{
diff --git a/src/devices/bus/coleco/xin1.h b/src/devices/bus/coleco/cartridge/xin1.h
index c5b0ae49b76..0e8a7813c9f 100644
--- a/src/devices/bus/coleco/xin1.h
+++ b/src/devices/bus/coleco/cartridge/xin1.h
@@ -34,7 +34,7 @@ protected:
virtual void device_reset() override;
// device_colecovision_expansion_card_interface overrides
- virtual uint8_t bd_r(address_space &space, offs_t offset, uint8_t data, int _8000, int _a000, int _c000, int _e000) override;
+ virtual uint8_t bd_r(offs_t offset, uint8_t data, int _8000, int _a000, int _c000, int _e000) override;
private:
uint32_t m_current_offset;
diff --git a/src/devices/bus/coleco/ctrl.cpp b/src/devices/bus/coleco/controller/ctrl.cpp
index 330c7c71551..330c7c71551 100644
--- a/src/devices/bus/coleco/ctrl.cpp
+++ b/src/devices/bus/coleco/controller/ctrl.cpp
diff --git a/src/devices/bus/coleco/ctrl.h b/src/devices/bus/coleco/controller/ctrl.h
index 3460dec0b7d..3460dec0b7d 100644
--- a/src/devices/bus/coleco/ctrl.h
+++ b/src/devices/bus/coleco/controller/ctrl.h
diff --git a/src/devices/bus/coleco/hand.cpp b/src/devices/bus/coleco/controller/hand.cpp
index b8410183b68..b8410183b68 100644
--- a/src/devices/bus/coleco/hand.cpp
+++ b/src/devices/bus/coleco/controller/hand.cpp
diff --git a/src/devices/bus/coleco/hand.h b/src/devices/bus/coleco/controller/hand.h
index f65ad709106..f65ad709106 100644
--- a/src/devices/bus/coleco/hand.h
+++ b/src/devices/bus/coleco/controller/hand.h
diff --git a/src/devices/bus/coleco/sac.cpp b/src/devices/bus/coleco/controller/sac.cpp
index 7b3cef9b114..7b3cef9b114 100644
--- a/src/devices/bus/coleco/sac.cpp
+++ b/src/devices/bus/coleco/controller/sac.cpp
diff --git a/src/devices/bus/coleco/sac.h b/src/devices/bus/coleco/controller/sac.h
index 20078e33ef7..20078e33ef7 100644
--- a/src/devices/bus/coleco/sac.h
+++ b/src/devices/bus/coleco/controller/sac.h
diff --git a/src/devices/bus/compis/graphics.h b/src/devices/bus/compis/graphics.h
index c5b414d1fab..0f3f2b104b1 100644
--- a/src/devices/bus/compis/graphics.h
+++ b/src/devices/bus/compis/graphics.h
@@ -24,16 +24,16 @@ class compis_graphics_slot_device;
class device_compis_graphics_card_interface : public device_slot_card_interface
{
public:
- virtual uint8_t mcs0_r(address_space &space, offs_t offset) { return 0xff; }
- virtual void mcs0_w(address_space &space, offs_t offset, uint8_t data) { }
- virtual uint8_t mcs1_r(address_space &space, offs_t offset) { return 0xff; }
- virtual void mcs1_w(address_space &space, offs_t offset, uint8_t data) { }
- virtual uint16_t pcs3_r(address_space &space, offs_t offset) { return 0xff; }
- virtual void pcs3_w(address_space &space, offs_t offset, uint16_t data) { }
- virtual uint8_t pcs6_6_r(address_space &space, offs_t offset) { return 0xff; }
- virtual void pcs6_6_w(address_space &space, offs_t offset, uint8_t data) { }
- virtual uint8_t dma_ack_r(address_space &space, offs_t offset) { return 0xff; }
- virtual void dma_ack_w(address_space &space, offs_t offset, uint8_t data) { }
+ virtual uint8_t mcs0_r(offs_t offset) { return 0xff; }
+ virtual void mcs0_w(offs_t offset, uint8_t data) { }
+ virtual uint8_t mcs1_r(offs_t offset) { return 0xff; }
+ virtual void mcs1_w(offs_t offset, uint8_t data) { }
+ virtual uint16_t pcs3_r(offs_t offset) { return 0xff; }
+ virtual void pcs3_w(offs_t offset, uint16_t data) { }
+ virtual uint8_t pcs6_6_r(offs_t offset) { return 0xff; }
+ virtual void pcs6_6_w(offs_t offset, uint8_t data) { }
+ virtual uint8_t dma_ack_r(offs_t offset) { return 0xff; }
+ virtual void dma_ack_w(offs_t offset, uint8_t data) { }
protected:
// construction/destruction
@@ -64,16 +64,16 @@ public:
auto drq() { return m_write_dma_request.bind(); }
// computer interface
- DECLARE_READ8_MEMBER( mcs0_r ) { return m_card ? m_card->mcs0_r(space, offset) : 0xff; }
- DECLARE_WRITE8_MEMBER( mcs0_w ) { if (m_card) m_card->mcs0_w(space, offset, data); }
- DECLARE_READ8_MEMBER( mcs1_r ) { return m_card ? m_card->mcs1_r(space, offset) : 0xff; }
- DECLARE_WRITE8_MEMBER( mcs1_w ) { if (m_card) m_card->mcs1_w(space, offset, data); }
- DECLARE_READ16_MEMBER( pcs3_r ) { return m_card ? m_card->pcs3_r(space, offset) : 0xff; }
- DECLARE_WRITE16_MEMBER( pcs3_w ) { if (m_card) m_card->pcs3_w(space, offset, data); }
- DECLARE_READ8_MEMBER( pcs6_6_r ) { return m_card ? m_card->pcs6_6_r(space, offset) : 0xff; }
- DECLARE_WRITE8_MEMBER( pcs6_6_w ) { if (m_card) m_card->pcs6_6_w(space, offset, data); }
- DECLARE_READ8_MEMBER( dma_ack_r ) { return m_card ? m_card->dma_ack_r(space, offset) : 0xff; }
- DECLARE_WRITE8_MEMBER( dma_ack_w ) { if (m_card) m_card->dma_ack_w(space, offset, data); }
+ uint8_t mcs0_r(offs_t offset) { return m_card ? m_card->mcs0_r(offset) : 0xff; }
+ void mcs0_w(offs_t offset, uint8_t data) { if (m_card) m_card->mcs0_w(offset, data); }
+ uint8_t mcs1_r(offs_t offset) { return m_card ? m_card->mcs1_r(offset) : 0xff; }
+ void mcs1_w(offs_t offset, uint8_t data) { if (m_card) m_card->mcs1_w(offset, data); }
+ uint8_t pcs3_r(offs_t offset) { return m_card ? m_card->pcs3_r(offset) : 0xff; }
+ void pcs3_w(offs_t offset, uint8_t data) { if (m_card) m_card->pcs3_w(offset, data); }
+ uint8_t pcs6_6_r(offs_t offset) { return m_card ? m_card->pcs6_6_r(offset) : 0xff; }
+ void pcs6_6_w(offs_t offset, uint8_t data) { if (m_card) m_card->pcs6_6_w(offset, data); }
+ uint8_t dma_ack_r(offs_t offset) { return m_card ? m_card->dma_ack_r(offset) : 0xff; }
+ void dma_ack_w(offs_t offset, uint8_t data) { if (m_card) m_card->dma_ack_w(offset, data); }
// card interface
DECLARE_WRITE_LINE_MEMBER( dma_request_w ) { m_write_dma_request(state); }
diff --git a/src/devices/bus/compis/hrg.cpp b/src/devices/bus/compis/hrg.cpp
index fc1665107fa..7aa8aa72f7e 100644
--- a/src/devices/bus/compis/hrg.cpp
+++ b/src/devices/bus/compis/hrg.cpp
@@ -77,40 +77,42 @@ UPD7220_DISPLAY_PIXELS_MEMBER( compis_uhrg_device::display_pixels )
// device_add_mconfig - add device configuration
//-------------------------------------------------
-MACHINE_CONFIG_START(compis_hrg_device::device_add_mconfig)
- MCFG_SCREEN_ADD_MONOCHROME(SCREEN_TAG, RASTER, rgb_t::green())
- MCFG_SCREEN_VIDEO_ATTRIBUTES(VIDEO_UPDATE_BEFORE_VBLANK)
- MCFG_SCREEN_REFRESH_RATE(50)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) // not accurate
- MCFG_SCREEN_SIZE(640, 400)
- MCFG_SCREEN_VISIBLE_AREA(0, 640-1, 0, 400-1)
- MCFG_SCREEN_UPDATE_DEVICE(UPD7220_TAG, upd7220_device, screen_update)
+void compis_hrg_device::device_add_mconfig(machine_config &config)
+{
+ screen_device &screen(SCREEN(config, SCREEN_TAG, SCREEN_TYPE_RASTER, rgb_t::green()));
+ screen.set_video_attributes(VIDEO_UPDATE_BEFORE_VBLANK);
+ screen.set_refresh_hz(50);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500)); // not accurate
+ screen.set_size(640, 400);
+ screen.set_visarea(0, 640-1, 0, 400-1);
+ screen.set_screen_update(UPD7220_TAG, FUNC(upd7220_device::screen_update));
UPD7220(config, m_crtc, 2252500); // unknown clock
m_crtc->set_addrmap(0, &compis_hrg_device::hrg_map);
- m_crtc->set_display_pixels_callback(FUNC(compis_hrg_device::display_pixels), this);
+ m_crtc->set_display_pixels(FUNC(compis_hrg_device::display_pixels));
m_crtc->set_screen(SCREEN_TAG);
PALETTE(config, m_palette, palette_device::MONOCHROME);
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(compis_uhrg_device::device_add_mconfig)
- MCFG_SCREEN_ADD_MONOCHROME(SCREEN_TAG, RASTER, rgb_t::green())
- MCFG_SCREEN_VIDEO_ATTRIBUTES(VIDEO_UPDATE_BEFORE_VBLANK)
- MCFG_SCREEN_REFRESH_RATE(50)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) // not accurate
- MCFG_SCREEN_SIZE(1280, 800)
- MCFG_SCREEN_VISIBLE_AREA(0, 1280-1, 0, 800-1)
- MCFG_SCREEN_UPDATE_DEVICE(UPD7220_TAG, upd7220_device, screen_update)
+void compis_uhrg_device::device_add_mconfig(machine_config &config)
+{
+ screen_device &screen(SCREEN(config, SCREEN_TAG, SCREEN_TYPE_RASTER, rgb_t::green()));
+ screen.set_video_attributes(VIDEO_UPDATE_BEFORE_VBLANK);
+ screen.set_refresh_hz(50);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500)); // not accurate
+ screen.set_size(1280, 800);
+ screen.set_visarea(0, 1280-1, 0, 800-1);
+ screen.set_screen_update(UPD7220_TAG, FUNC(upd7220_device::screen_update));
UPD7220(config, m_crtc, 2252500*2); // unknown clock
m_crtc->set_addrmap(0, &compis_uhrg_device::uhrg_map);
- m_crtc->set_display_pixels_callback(FUNC(compis_uhrg_device::display_pixels), this);
+ m_crtc->set_display_pixels(FUNC(compis_uhrg_device::display_pixels));
m_crtc->set_screen(SCREEN_TAG);
PALETTE(config, m_palette, palette_device::MONOCHROME);
-MACHINE_CONFIG_END
+}
//**************************************************************************
@@ -163,12 +165,12 @@ void compis_hrg_device::device_reset()
// pcs6_6_r -
//-------------------------------------------------
-uint8_t compis_hrg_device::pcs6_6_r(address_space &space, offs_t offset)
+uint8_t compis_hrg_device::pcs6_6_r(offs_t offset)
{
uint8_t data = 0xff;
if (offset < 2)
- data = m_crtc->read(space, offset & 0x01);
+ data = m_crtc->read(offset & 0x01);
else
// monochrome only, hblank? vblank?
if(offset == 2)
@@ -200,10 +202,10 @@ uint8_t compis_hrg_device::pcs6_6_r(address_space &space, offs_t offset)
// pcs6_6_w -
//-------------------------------------------------
-void compis_hrg_device::pcs6_6_w(address_space &space, offs_t offset, uint8_t data)
+void compis_hrg_device::pcs6_6_w(offs_t offset, uint8_t data)
{
//logerror("%s PCS 6:6 write %04x : %02x\n", machine().describe_context(), offset, data);
// 0x336 is likely the color plane register
- if (offset < 2) m_crtc->write(space, offset & 0x01, data);
+ if (offset < 2) m_crtc->write(offset & 0x01, data);
}
diff --git a/src/devices/bus/compis/hrg.h b/src/devices/bus/compis/hrg.h
index c48830be10c..98ef784df14 100644
--- a/src/devices/bus/compis/hrg.h
+++ b/src/devices/bus/compis/hrg.h
@@ -41,8 +41,8 @@ protected:
virtual void device_add_mconfig(machine_config &config) override;
// device_compis_graphics_card_interface overrides
- virtual uint8_t pcs6_6_r(address_space &space, offs_t offset) override;
- virtual void pcs6_6_w(address_space &space, offs_t offset, uint8_t data) override;
+ virtual uint8_t pcs6_6_r(offs_t offset) override;
+ virtual void pcs6_6_w(offs_t offset, uint8_t data) override;
required_device<upd7220_device> m_crtc;
required_device<palette_device> m_palette;
diff --git a/src/devices/bus/compucolor/floppy.cpp b/src/devices/bus/compucolor/floppy.cpp
index f454a4f092a..fbe7912f6b6 100644
--- a/src/devices/bus/compucolor/floppy.cpp
+++ b/src/devices/bus/compucolor/floppy.cpp
@@ -52,9 +52,10 @@ static void compucolor_floppies(device_slot_interface &device)
// device_add_mconfig - add device configuration
//-------------------------------------------------
-MACHINE_CONFIG_START(compucolor_floppy_device::device_add_mconfig)
- MCFG_FLOPPY_DRIVE_ADD_FIXED("floppy", compucolor_floppies, "525sssd", compucolor_floppy_device::floppy_formats)
-MACHINE_CONFIG_END
+void compucolor_floppy_device::device_add_mconfig(machine_config &config)
+{
+ FLOPPY_CONNECTOR(config, m_floppy, compucolor_floppies, "525sssd", compucolor_floppy_device::floppy_formats);
+}
@@ -89,7 +90,7 @@ compucolor_floppy_port_device::compucolor_floppy_port_device(const machine_confi
compucolor_floppy_device::compucolor_floppy_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
: device_t(mconfig, COMPUCOLOR_FLOPPY, tag, owner, clock)
, device_compucolor_floppy_port_interface(mconfig, *this)
- , m_floppy(*this, "floppy:525sssd")
+ , m_floppy(*this, "floppy")
, m_rw(1)
, m_stp(0)
, m_sel(1)
@@ -183,19 +184,23 @@ void compucolor_floppy_device::stepper_w(uint8_t data)
{
if (!m_sel)
{
+ floppy_image_device *floppy = m_floppy->get_device();
+ if (floppy == nullptr)
+ return;
+
if ((m_stp == 1 && data == 4) || (m_stp == 2 && data == 1) || (m_stp == 4 && data == 2))
{
// step in
- m_floppy->dir_w(1);
- m_floppy->stp_w(0);
- m_floppy->stp_w(1);
+ floppy->dir_w(1);
+ floppy->stp_w(0);
+ floppy->stp_w(1);
}
else if ((m_stp == 1 && data == 2) || (m_stp == 2 && data == 4) || (m_stp == 4 && data == 1))
{
// step out
- m_floppy->dir_w(0);
- m_floppy->stp_w(0);
- m_floppy->stp_w(1);
+ floppy->dir_w(0);
+ floppy->stp_w(0);
+ floppy->stp_w(1);
}
}
@@ -209,7 +214,9 @@ void compucolor_floppy_device::stepper_w(uint8_t data)
void compucolor_floppy_device::select_w(int state)
{
- m_floppy->mon_w(state);
+ floppy_image_device *floppy = m_floppy->get_device();
+ if (floppy != nullptr)
+ floppy->mon_w(state);
if (!m_sel && state)
{
@@ -226,8 +233,10 @@ void compucolor_floppy_device::select_w(int state)
bool compucolor_floppy_device::read_bit()
{
+ floppy_image_device *floppy = m_floppy->get_device();
+
attotime when = machine().time();
- attotime edge = m_floppy->get_next_transition(when);
+ attotime edge = (floppy == nullptr) ? attotime::never : floppy->get_next_transition(when);
attotime next = when + m_period;
return (edge.is_never() || edge >= next) ? 0 : 1;
diff --git a/src/devices/bus/compucolor/floppy.h b/src/devices/bus/compucolor/floppy.h
index 63e9c78782a..a4e476eb152 100644
--- a/src/devices/bus/compucolor/floppy.h
+++ b/src/devices/bus/compucolor/floppy.h
@@ -91,7 +91,7 @@ protected:
private:
DECLARE_FLOPPY_FORMATS( floppy_formats );
- required_device<floppy_image_device> m_floppy;
+ required_device<floppy_connector> m_floppy;
bool read_bit();
void write_bit(bool bit);
diff --git a/src/devices/bus/comx35/clm.cpp b/src/devices/bus/comx35/clm.cpp
index 333566eda1a..745606875f0 100644
--- a/src/devices/bus/comx35/clm.cpp
+++ b/src/devices/bus/comx35/clm.cpp
@@ -137,15 +137,16 @@ GFXDECODE_END
// device_add_mconfig - add device configuration
//-------------------------------------------------
-MACHINE_CONFIG_START(comx_clm_device::device_add_mconfig)
- MCFG_SCREEN_ADD_MONOCHROME(MC6845_SCREEN_TAG, RASTER, rgb_t::white())
- MCFG_SCREEN_UPDATE_DEVICE(MC6845_TAG, mc6845_device, screen_update)
- MCFG_SCREEN_SIZE(80*8, 24*8)
- MCFG_SCREEN_VISIBLE_AREA(0, 80*8-1, 0, 24*8-1)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500))
- MCFG_SCREEN_REFRESH_RATE(50)
-
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_comx_clm)
+void comx_clm_device::device_add_mconfig(machine_config &config)
+{
+ screen_device &screen(SCREEN(config, MC6845_SCREEN_TAG, SCREEN_TYPE_RASTER, rgb_t::white()));
+ screen.set_screen_update(MC6845_TAG, FUNC(mc6845_device::screen_update));
+ screen.set_size(80*8, 24*8);
+ screen.set_visarea(0, 80*8-1, 0, 24*8-1);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500));
+ screen.set_refresh_hz(50);
+
+ GFXDECODE(config, "gfxdecode", m_palette, gfx_comx_clm);
PALETTE(config, m_palette, palette_device::MONOCHROME);
MC6845(config, m_crtc, XTAL(14'318'181)/7);
@@ -153,7 +154,7 @@ MACHINE_CONFIG_START(comx_clm_device::device_add_mconfig)
m_crtc->set_show_border_area(true);
m_crtc->set_char_width(8);
m_crtc->set_update_row_callback(FUNC(comx_clm_device::crtc_update_row), this);
-MACHINE_CONFIG_END
+}
//**************************************************************************
@@ -214,7 +215,7 @@ int comx_clm_device::comx_ef4_r()
// comx_mrd_r - memory read
//-------------------------------------------------
-uint8_t comx_clm_device::comx_mrd_r(address_space &space, offs_t offset, int *extrom)
+uint8_t comx_clm_device::comx_mrd_r(offs_t offset, int *extrom)
{
uint8_t data = 0xff;
@@ -228,7 +229,7 @@ uint8_t comx_clm_device::comx_mrd_r(address_space &space, offs_t offset, int *ex
}
else if (offset == 0xd801)
{
- data = m_crtc->register_r(space, 0);
+ data = m_crtc->register_r();
}
return data;
@@ -239,7 +240,7 @@ uint8_t comx_clm_device::comx_mrd_r(address_space &space, offs_t offset, int *ex
// comx_mwr_w - memory write
//-------------------------------------------------
-void comx_clm_device::comx_mwr_w(address_space &space, offs_t offset, uint8_t data)
+void comx_clm_device::comx_mwr_w(offs_t offset, uint8_t data)
{
if (offset >= 0xd000 && offset < 0xd800)
{
@@ -247,10 +248,10 @@ void comx_clm_device::comx_mwr_w(address_space &space, offs_t offset, uint8_t da
}
else if (offset == 0xd800)
{
- m_crtc->address_w(space, 0, data);
+ m_crtc->address_w(data);
}
else if (offset == 0xd801)
{
- m_crtc->register_w(space, 0, data);
+ m_crtc->register_w(data);
}
}
diff --git a/src/devices/bus/comx35/clm.h b/src/devices/bus/comx35/clm.h
index 0784ae7bab2..9c4845cbbe0 100644
--- a/src/devices/bus/comx35/clm.h
+++ b/src/devices/bus/comx35/clm.h
@@ -42,8 +42,8 @@ protected:
// device_comx_expansion_card_interface overrides
virtual int comx_ef4_r() override;
- virtual uint8_t comx_mrd_r(address_space &space, offs_t offset, int *extrom) override;
- virtual void comx_mwr_w(address_space &space, offs_t offset, uint8_t data) override;
+ virtual uint8_t comx_mrd_r(offs_t offset, int *extrom) override;
+ virtual void comx_mwr_w(offs_t offset, uint8_t data) override;
private:
MC6845_UPDATE_ROW( crtc_update_row );
diff --git a/src/devices/bus/comx35/eprom.cpp b/src/devices/bus/comx35/eprom.cpp
index 5fda7492dd5..0267d7c5b62 100644
--- a/src/devices/bus/comx35/eprom.cpp
+++ b/src/devices/bus/comx35/eprom.cpp
@@ -91,7 +91,7 @@ void comx_epr_device::device_reset()
// comx_mrd_r - memory read
//-------------------------------------------------
-uint8_t comx_epr_device::comx_mrd_r(address_space &space, offs_t offset, int *extrom)
+uint8_t comx_epr_device::comx_mrd_r(offs_t offset, int *extrom)
{
uint8_t data = 0;
@@ -113,7 +113,7 @@ uint8_t comx_epr_device::comx_mrd_r(address_space &space, offs_t offset, int *ex
// comx_io_w - I/O write
//-------------------------------------------------
-void comx_epr_device::comx_io_w(address_space &space, offs_t offset, uint8_t data)
+void comx_epr_device::comx_io_w(offs_t offset, uint8_t data)
{
if (offset == 1)
{
diff --git a/src/devices/bus/comx35/eprom.h b/src/devices/bus/comx35/eprom.h
index c6489dfa774..90f57e52d3d 100644
--- a/src/devices/bus/comx35/eprom.h
+++ b/src/devices/bus/comx35/eprom.h
@@ -37,8 +37,8 @@ protected:
virtual void device_reset() override;
// device_comx_expansion_card_interface overrides
- virtual uint8_t comx_mrd_r(address_space &space, offs_t offset, int *extrom) override;
- virtual void comx_io_w(address_space &space, offs_t offset, uint8_t data) override;
+ virtual uint8_t comx_mrd_r(offs_t offset, int *extrom) override;
+ virtual void comx_io_w(offs_t offset, uint8_t data) override;
private:
required_memory_region m_rom;
diff --git a/src/devices/bus/comx35/exp.cpp b/src/devices/bus/comx35/exp.cpp
index eb5917dccbf..75036fb6ea8 100644
--- a/src/devices/bus/comx35/exp.cpp
+++ b/src/devices/bus/comx35/exp.cpp
@@ -68,12 +68,12 @@ void comx_expansion_slot_device::device_start()
// mrd_r - memory read
//-------------------------------------------------
-uint8_t comx_expansion_slot_device::mrd_r(address_space &space, offs_t offset, int *extrom)
+uint8_t comx_expansion_slot_device::mrd_r(offs_t offset, int *extrom)
{
uint8_t data = 0;
if (m_card != nullptr)
- data = m_card->comx_mrd_r(space, offset, extrom);
+ data = m_card->comx_mrd_r(offset, extrom);
return data;
}
@@ -83,10 +83,10 @@ uint8_t comx_expansion_slot_device::mrd_r(address_space &space, offs_t offset, i
// mwr_w - memory write
//-------------------------------------------------
-void comx_expansion_slot_device::mwr_w(address_space &space, offs_t offset, uint8_t data)
+void comx_expansion_slot_device::mwr_w(offs_t offset, uint8_t data)
{
if (m_card != nullptr)
- m_card->comx_mwr_w(space, offset, data);
+ m_card->comx_mwr_w(offset, data);
}
@@ -94,12 +94,12 @@ void comx_expansion_slot_device::mwr_w(address_space &space, offs_t offset, uint
// io_r - I/O read
//-------------------------------------------------
-uint8_t comx_expansion_slot_device::io_r(address_space &space, offs_t offset)
+uint8_t comx_expansion_slot_device::io_r(offs_t offset)
{
uint8_t data = 0;
if (m_card != nullptr)
- data = m_card->comx_io_r(space, offset);
+ data = m_card->comx_io_r(offset);
return data;
}
@@ -109,10 +109,10 @@ uint8_t comx_expansion_slot_device::io_r(address_space &space, offs_t offset)
// sout_w - I/O write
//-------------------------------------------------
-void comx_expansion_slot_device::io_w(address_space &space, offs_t offset, uint8_t data)
+void comx_expansion_slot_device::io_w(offs_t offset, uint8_t data)
{
if (m_card != nullptr)
- m_card->comx_io_w(space, offset, data);
+ m_card->comx_io_w(offset, data);
}
diff --git a/src/devices/bus/comx35/exp.h b/src/devices/bus/comx35/exp.h
index 0629db0a1ac..dea67184e06 100644
--- a/src/devices/bus/comx35/exp.h
+++ b/src/devices/bus/comx35/exp.h
@@ -62,11 +62,11 @@ public:
template <class Object> devcb_base &set_irq_wr_callback(Object &&cb) { return m_write_irq.set_callback(std::forward<Object>(cb)); }
auto irq_callback() { return m_write_irq.bind(); }
- uint8_t mrd_r(address_space &space, offs_t offset, int *extrom);
- void mwr_w(address_space &space, offs_t offset, uint8_t data);
+ uint8_t mrd_r(offs_t offset, int *extrom);
+ void mwr_w(offs_t offset, uint8_t data);
- uint8_t io_r(address_space &space, offs_t offset);
- void io_w(address_space &space, offs_t offset, uint8_t data);
+ uint8_t io_r(offs_t offset);
+ void io_w(offs_t offset, uint8_t data);
DECLARE_READ_LINE_MEMBER(ef4_r);
@@ -107,12 +107,12 @@ protected:
virtual void comx_tpb_w(int state) { }
// memory access
- virtual uint8_t comx_mrd_r(address_space &space, offs_t offset, int *extrom) { return 0; }
- virtual void comx_mwr_w(address_space &space, offs_t offset, uint8_t data) { }
+ virtual uint8_t comx_mrd_r(offs_t offset, int *extrom) { return 0; }
+ virtual void comx_mwr_w(offs_t offset, uint8_t data) { }
// I/O access
- virtual uint8_t comx_io_r(address_space &space, offs_t offset) { return 0; }
- virtual void comx_io_w(address_space &space, offs_t offset, uint8_t data) { }
+ virtual uint8_t comx_io_r(offs_t offset) { return 0; }
+ virtual void comx_io_w(offs_t offset, uint8_t data) { }
comx_expansion_slot_device *m_slot;
diff --git a/src/devices/bus/comx35/expbox.cpp b/src/devices/bus/comx35/expbox.cpp
index f7c693d4ecf..65c945274f1 100644
--- a/src/devices/bus/comx35/expbox.cpp
+++ b/src/devices/bus/comx35/expbox.cpp
@@ -200,7 +200,7 @@ void comx_eb_device::comx_q_w(int state)
// comx_mrd_r - memory read
//-------------------------------------------------
-uint8_t comx_eb_device::comx_mrd_r(address_space &space, offs_t offset, int *extrom)
+uint8_t comx_eb_device::comx_mrd_r(offs_t offset, int *extrom)
{
uint8_t data = 0;
@@ -219,7 +219,7 @@ uint8_t comx_eb_device::comx_mrd_r(address_space &space, offs_t offset, int *ext
{
if (BIT(m_select, slot) && m_expansion_slot[slot] != nullptr)
{
- data |= m_expansion_slot[slot]->mrd_r(space, offset, extrom);
+ data |= m_expansion_slot[slot]->mrd_r(offset, extrom);
}
}
}
@@ -232,13 +232,13 @@ uint8_t comx_eb_device::comx_mrd_r(address_space &space, offs_t offset, int *ext
// comx_mwr_w - memory write
//-------------------------------------------------
-void comx_eb_device::comx_mwr_w(address_space &space, offs_t offset, uint8_t data)
+void comx_eb_device::comx_mwr_w(offs_t offset, uint8_t data)
{
for (int slot = 0; slot < MAX_EB_SLOTS; slot++)
{
if (BIT(m_select, slot) && m_expansion_slot[slot] != nullptr)
{
- m_expansion_slot[slot]->mwr_w(space, offset, data);
+ m_expansion_slot[slot]->mwr_w(offset, data);
}
}
}
@@ -248,7 +248,7 @@ void comx_eb_device::comx_mwr_w(address_space &space, offs_t offset, uint8_t dat
// comx_io_r - I/O read
//-------------------------------------------------
-uint8_t comx_eb_device::comx_io_r(address_space &space, offs_t offset)
+uint8_t comx_eb_device::comx_io_r(offs_t offset)
{
uint8_t data = 0;
@@ -256,7 +256,7 @@ uint8_t comx_eb_device::comx_io_r(address_space &space, offs_t offset)
{
if (BIT(m_select, slot) && m_expansion_slot[slot] != nullptr)
{
- data |= m_expansion_slot[slot]->io_r(space, offset);
+ data |= m_expansion_slot[slot]->io_r(offset);
}
}
@@ -268,7 +268,7 @@ uint8_t comx_eb_device::comx_io_r(address_space &space, offs_t offset)
// comx_io_w - I/O write
//-------------------------------------------------
-void comx_eb_device::comx_io_w(address_space &space, offs_t offset, uint8_t data)
+void comx_eb_device::comx_io_w(offs_t offset, uint8_t data)
{
if (offset == 1 && !(BIT(data, 0)))
{
@@ -287,7 +287,7 @@ void comx_eb_device::comx_io_w(address_space &space, offs_t offset, uint8_t data
{
if (BIT(m_select, slot) && m_expansion_slot[slot] != nullptr)
{
- m_expansion_slot[slot]->io_w(space, offset, data);
+ m_expansion_slot[slot]->io_w(offset, data);
}
}
}
diff --git a/src/devices/bus/comx35/expbox.h b/src/devices/bus/comx35/expbox.h
index 4c806a79b92..c4c89b4f2bc 100644
--- a/src/devices/bus/comx35/expbox.h
+++ b/src/devices/bus/comx35/expbox.h
@@ -48,10 +48,10 @@ protected:
// device_comx_expansion_card_interface overrides
virtual int comx_ef4_r() override;
virtual void comx_q_w(int state) override;
- virtual uint8_t comx_mrd_r(address_space &space, offs_t offset, int *extrom) override;
- virtual void comx_mwr_w(address_space &space, offs_t offset, uint8_t data) override;
- virtual uint8_t comx_io_r(address_space &space, offs_t offset) override;
- virtual void comx_io_w(address_space &space, offs_t offset, uint8_t data) override;
+ virtual uint8_t comx_mrd_r(offs_t offset, int *extrom) override;
+ virtual void comx_mwr_w(offs_t offset, uint8_t data) override;
+ virtual uint8_t comx_io_r(offs_t offset) override;
+ virtual void comx_io_w(offs_t offset, uint8_t data) override;
void set_irq() { m_slot->irq_w(m_irq[0] || m_irq[1] || m_irq[2] || m_irq[3]); }
diff --git a/src/devices/bus/comx35/fdc.cpp b/src/devices/bus/comx35/fdc.cpp
index 27246c37333..da1b6dcc028 100644
--- a/src/devices/bus/comx35/fdc.cpp
+++ b/src/devices/bus/comx35/fdc.cpp
@@ -188,7 +188,7 @@ void comx_fd_device::comx_q_w(int state)
// comx_mrd_r - memory read
//-------------------------------------------------
-uint8_t comx_fd_device::comx_mrd_r(address_space &space, offs_t offset, int *extrom)
+uint8_t comx_fd_device::comx_mrd_r(offs_t offset, int *extrom)
{
uint8_t data = 0xff;
@@ -210,7 +210,7 @@ uint8_t comx_fd_device::comx_mrd_r(address_space &space, offs_t offset, int *ext
// comx_io_r - I/O read
//-------------------------------------------------
-uint8_t comx_fd_device::comx_io_r(address_space &space, offs_t offset)
+uint8_t comx_fd_device::comx_io_r(offs_t offset)
{
uint8_t data = 0xff;
@@ -235,7 +235,7 @@ uint8_t comx_fd_device::comx_io_r(address_space &space, offs_t offset)
// comx_io_w - I/O write
//-------------------------------------------------
-void comx_fd_device::comx_io_w(address_space &space, offs_t offset, uint8_t data)
+void comx_fd_device::comx_io_w(offs_t offset, uint8_t data)
{
if (offset == 2)
{
diff --git a/src/devices/bus/comx35/fdc.h b/src/devices/bus/comx35/fdc.h
index ad682e97718..45617bb8580 100644
--- a/src/devices/bus/comx35/fdc.h
+++ b/src/devices/bus/comx35/fdc.h
@@ -43,9 +43,9 @@ protected:
// device_comx_expansion_card_interface overrides
virtual int comx_ef4_r() override;
virtual void comx_q_w(int state) override;
- virtual uint8_t comx_mrd_r(address_space &space, offs_t offset, int *extrom) override;
- virtual uint8_t comx_io_r(address_space &space, offs_t offset) override;
- virtual void comx_io_w(address_space &space, offs_t offset, uint8_t data) override;
+ virtual uint8_t comx_mrd_r(offs_t offset, int *extrom) override;
+ virtual uint8_t comx_io_r(offs_t offset) override;
+ virtual void comx_io_w(offs_t offset, uint8_t data) override;
private:
DECLARE_FLOPPY_FORMATS( floppy_formats );
diff --git a/src/devices/bus/comx35/joycard.cpp b/src/devices/bus/comx35/joycard.cpp
index 4c6e46ff06e..e76f20a5be8 100644
--- a/src/devices/bus/comx35/joycard.cpp
+++ b/src/devices/bus/comx35/joycard.cpp
@@ -98,7 +98,7 @@ void comx_joy_device::device_reset()
// comx_mrd_r - I/O read
//-------------------------------------------------
-uint8_t comx_joy_device::comx_io_r(address_space &space, offs_t offset)
+uint8_t comx_joy_device::comx_io_r(offs_t offset)
{
uint8_t data = 0;
diff --git a/src/devices/bus/comx35/joycard.h b/src/devices/bus/comx35/joycard.h
index e2d6bb40151..92c41431961 100644
--- a/src/devices/bus/comx35/joycard.h
+++ b/src/devices/bus/comx35/joycard.h
@@ -37,7 +37,7 @@ protected:
virtual void device_reset() override;
// device_comx_expansion_card_interface overrides
- virtual uint8_t comx_io_r(address_space &space, offs_t offset) override;
+ virtual uint8_t comx_io_r(offs_t offset) override;
private:
required_ioport m_joy1;
diff --git a/src/devices/bus/comx35/printer.cpp b/src/devices/bus/comx35/printer.cpp
index 24a50e7ed53..6858d687c0b 100644
--- a/src/devices/bus/comx35/printer.cpp
+++ b/src/devices/bus/comx35/printer.cpp
@@ -55,16 +55,19 @@ const tiny_rom_entry *comx_prn_device::device_rom_region() const
// device_add_mconfig - add device configuration
//-------------------------------------------------
-MACHINE_CONFIG_START(comx_prn_device::device_add_mconfig)
- MCFG_DEVICE_ADD(m_centronics, CENTRONICS, centronics_devices, "printer")
- MCFG_CENTRONICS_ACK_HANDLER(WRITELINE("cent_status_in", input_buffer_device, write_bit0))
- MCFG_CENTRONICS_BUSY_HANDLER(WRITELINE("cent_status_in", input_buffer_device, write_bit1))
- MCFG_CENTRONICS_PERROR_HANDLER(WRITELINE("cent_status_in", input_buffer_device, write_bit2))
- MCFG_CENTRONICS_SELECT_HANDLER(WRITELINE("cent_status_in", input_buffer_device, write_bit3))
- MCFG_CENTRONICS_OUTPUT_LATCH_ADD("cent_data_out", "centronics")
+void comx_prn_device::device_add_mconfig(machine_config &config)
+{
+ CENTRONICS(config, m_centronics, centronics_devices, "printer");
+ m_centronics->ack_handler().set(m_cent_status_in, FUNC(input_buffer_device::write_bit0));
+ m_centronics->busy_handler().set(m_cent_status_in, FUNC(input_buffer_device::write_bit1));
+ m_centronics->perror_handler().set(m_cent_status_in, FUNC(input_buffer_device::write_bit2));
+ m_centronics->select_handler().set(m_cent_status_in, FUNC(input_buffer_device::write_bit3));
+
+ OUTPUT_LATCH(config, m_cent_data_out);
+ m_centronics->set_output_latch(*m_cent_data_out);
- MCFG_DEVICE_ADD("cent_status_in", INPUT_BUFFER, 0)
-MACHINE_CONFIG_END
+ INPUT_BUFFER(config, m_cent_status_in);
+}
@@ -109,7 +112,7 @@ void comx_prn_device::device_reset()
// comx_mrd_r - memory read
//-------------------------------------------------
-uint8_t comx_prn_device::comx_mrd_r(address_space &space, offs_t offset, int *extrom)
+uint8_t comx_prn_device::comx_mrd_r(offs_t offset, int *extrom)
{
uint8_t data = 0;
@@ -126,7 +129,7 @@ uint8_t comx_prn_device::comx_mrd_r(address_space &space, offs_t offset, int *ex
// comx_io_r - I/O read
//-------------------------------------------------
-uint8_t comx_prn_device::comx_io_r(address_space &space, offs_t offset)
+uint8_t comx_prn_device::comx_io_r(offs_t offset)
{
/*
Parallel:
@@ -165,7 +168,7 @@ uint8_t comx_prn_device::comx_io_r(address_space &space, offs_t offset)
// comx_io_w - I/O write
//-------------------------------------------------
-void comx_prn_device::comx_io_w(address_space &space, offs_t offset, uint8_t data)
+void comx_prn_device::comx_io_w(offs_t offset, uint8_t data)
{
/*
Parallel:
diff --git a/src/devices/bus/comx35/printer.h b/src/devices/bus/comx35/printer.h
index dcfd27a7cd1..1ffa3f66046 100644
--- a/src/devices/bus/comx35/printer.h
+++ b/src/devices/bus/comx35/printer.h
@@ -39,9 +39,9 @@ protected:
virtual void device_add_mconfig(machine_config &config) override;
// device_comx_expansion_card_interface overrides
- virtual uint8_t comx_mrd_r(address_space &space, offs_t offset, int *extrom) override;
- virtual uint8_t comx_io_r(address_space &space, offs_t offset) override;
- virtual void comx_io_w(address_space &space, offs_t offset, uint8_t data) override;
+ virtual uint8_t comx_mrd_r(offs_t offset, int *extrom) override;
+ virtual uint8_t comx_io_r(offs_t offset) override;
+ virtual void comx_io_w(offs_t offset, uint8_t data) override;
private:
required_device<centronics_device> m_centronics;
diff --git a/src/devices/bus/comx35/ram.cpp b/src/devices/bus/comx35/ram.cpp
index c09ef729225..b468b6366ff 100644
--- a/src/devices/bus/comx35/ram.cpp
+++ b/src/devices/bus/comx35/ram.cpp
@@ -66,7 +66,7 @@ void comx_ram_device::device_reset()
// comx_mrd_r - memory read
//-------------------------------------------------
-uint8_t comx_ram_device::comx_mrd_r(address_space &space, offs_t offset, int *extrom)
+uint8_t comx_ram_device::comx_mrd_r(offs_t offset, int *extrom)
{
uint8_t data = 0;
@@ -83,7 +83,7 @@ uint8_t comx_ram_device::comx_mrd_r(address_space &space, offs_t offset, int *ex
// comx_mwr_w - memory write
//-------------------------------------------------
-void comx_ram_device::comx_mwr_w(address_space &space, offs_t offset, uint8_t data)
+void comx_ram_device::comx_mwr_w(offs_t offset, uint8_t data)
{
if (offset >= 0xc000 && offset < 0xd000)
{
@@ -96,7 +96,7 @@ void comx_ram_device::comx_mwr_w(address_space &space, offs_t offset, uint8_t da
// comx_io_w - I/O write
//-------------------------------------------------
-void comx_ram_device::comx_io_w(address_space &space, offs_t offset, uint8_t data)
+void comx_ram_device::comx_io_w(offs_t offset, uint8_t data)
{
if (offset == 1)
{
diff --git a/src/devices/bus/comx35/ram.h b/src/devices/bus/comx35/ram.h
index 251e47e2097..3a75e208eb6 100644
--- a/src/devices/bus/comx35/ram.h
+++ b/src/devices/bus/comx35/ram.h
@@ -34,9 +34,9 @@ protected:
virtual void device_reset() override;
// device_comx_expansion_card_interface overrides
- virtual uint8_t comx_mrd_r(address_space &space, offs_t offset, int *extrom) override;
- virtual void comx_mwr_w(address_space &space, offs_t offset, uint8_t data) override;
- virtual void comx_io_w(address_space &space, offs_t offset, uint8_t data) override;
+ virtual uint8_t comx_mrd_r(offs_t offset, int *extrom) override;
+ virtual void comx_mwr_w(offs_t offset, uint8_t data) override;
+ virtual void comx_io_w(offs_t offset, uint8_t data) override;
private:
optional_shared_ptr<uint8_t> m_ram;
diff --git a/src/devices/bus/comx35/thermal.cpp b/src/devices/bus/comx35/thermal.cpp
index e1d4f0ed8d3..badd1beb8c1 100644
--- a/src/devices/bus/comx35/thermal.cpp
+++ b/src/devices/bus/comx35/thermal.cpp
@@ -82,7 +82,7 @@ void comx_thm_device::device_reset()
// comx_mrd_r - memory read
//-------------------------------------------------
-uint8_t comx_thm_device::comx_mrd_r(address_space &space, offs_t offset, int *extrom)
+uint8_t comx_thm_device::comx_mrd_r(offs_t offset, int *extrom)
{
uint8_t data = 0;
@@ -99,7 +99,7 @@ uint8_t comx_thm_device::comx_mrd_r(address_space &space, offs_t offset, int *ex
// comx_io_r - I/O read
//-------------------------------------------------
-uint8_t comx_thm_device::comx_io_r(address_space &space, offs_t offset)
+uint8_t comx_thm_device::comx_io_r(offs_t offset)
{
/*
INP 2 is used for the printer status, where:
@@ -116,7 +116,7 @@ uint8_t comx_thm_device::comx_io_r(address_space &space, offs_t offset)
// comx_io_w - I/O write
//-------------------------------------------------
-void comx_thm_device::comx_io_w(address_space &space, offs_t offset, uint8_t data)
+void comx_thm_device::comx_io_w(offs_t offset, uint8_t data)
{
/*
OUT 2 is used to control the thermal printer where:
diff --git a/src/devices/bus/comx35/thermal.h b/src/devices/bus/comx35/thermal.h
index feb92f7bc45..645f6bf0213 100644
--- a/src/devices/bus/comx35/thermal.h
+++ b/src/devices/bus/comx35/thermal.h
@@ -37,9 +37,9 @@ protected:
virtual void device_reset() override;
// device_comx_expansion_card_interface overrides
- virtual uint8_t comx_mrd_r(address_space &space, offs_t offset, int *extrom) override;
- virtual uint8_t comx_io_r(address_space &space, offs_t offset) override;
- virtual void comx_io_w(address_space &space, offs_t offset, uint8_t data) override;
+ virtual uint8_t comx_mrd_r(offs_t offset, int *extrom) override;
+ virtual uint8_t comx_io_r(offs_t offset) override;
+ virtual void comx_io_w(offs_t offset, uint8_t data) override;
private:
required_memory_region m_rom;
diff --git a/src/devices/bus/cpc/amdrum.cpp b/src/devices/bus/cpc/amdrum.cpp
index b0c0610b607..587577edf52 100644
--- a/src/devices/bus/cpc/amdrum.cpp
+++ b/src/devices/bus/cpc/amdrum.cpp
@@ -20,13 +20,15 @@
DEFINE_DEVICE_TYPE(CPC_AMDRUM, cpc_amdrum_device, "cpc_amdrum", "Amdrum")
-MACHINE_CONFIG_START(cpc_amdrum_device::device_add_mconfig)
+void cpc_amdrum_device::device_add_mconfig(machine_config &config)
+{
SPEAKER(config, "speaker").front_center();
- MCFG_DEVICE_ADD("dac", DAC_8BIT_R2R, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 0.5) // unknown DAC
- MCFG_DEVICE_ADD("vref", VOLTAGE_REGULATOR, 0) MCFG_VOLTAGE_REGULATOR_OUTPUT(5.0)
- MCFG_SOUND_ROUTE(0, "dac", 1.0, DAC_VREF_POS_INPUT) MCFG_SOUND_ROUTE(0, "dac", -1.0, DAC_VREF_NEG_INPUT)
+ ZN428E(config, m_dac, 0).add_route(ALL_OUTPUTS, "speaker", 0.5);
+ voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref"));
+ vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT);
+ vref.add_route(0, "dac", -1.0, DAC_VREF_NEG_INPUT);
// no pass-through
-MACHINE_CONFIG_END
+}
//**************************************************************************
diff --git a/src/devices/bus/cpc/cpc_rom.cpp b/src/devices/bus/cpc/cpc_rom.cpp
index a3fedd575bc..69bd7f80035 100644
--- a/src/devices/bus/cpc/cpc_rom.cpp
+++ b/src/devices/bus/cpc/cpc_rom.cpp
@@ -18,22 +18,23 @@ void cpc_exp_cards(device_slot_interface &device);
//**************************************************************************
// device machine config
-MACHINE_CONFIG_START(cpc_rom_device::device_add_mconfig)
- MCFG_CPC_ROMSLOT_ADD("rom1")
- MCFG_CPC_ROMSLOT_ADD("rom2")
- MCFG_CPC_ROMSLOT_ADD("rom3")
- MCFG_CPC_ROMSLOT_ADD("rom4")
- MCFG_CPC_ROMSLOT_ADD("rom5")
- MCFG_CPC_ROMSLOT_ADD("rom6")
- MCFG_CPC_ROMSLOT_ADD("rom7")
- MCFG_CPC_ROMSLOT_ADD("rom8")
+void cpc_rom_device::device_add_mconfig(machine_config &config)
+{
+ CPC_ROMSLOT(config, m_rom[0], 0);
+ CPC_ROMSLOT(config, m_rom[1], 0);
+ CPC_ROMSLOT(config, m_rom[2], 0);
+ CPC_ROMSLOT(config, m_rom[3], 0);
+ CPC_ROMSLOT(config, m_rom[4], 0);
+ CPC_ROMSLOT(config, m_rom[5], 0);
+ CPC_ROMSLOT(config, m_rom[6], 0);
+ CPC_ROMSLOT(config, m_rom[7], 0);
// pass-through
cpc_expansion_slot_device &exp(CPC_EXPANSION_SLOT(config, "exp", DERIVED_CLOCK(1, 1), cpc_exp_cards, nullptr));
exp.irq_callback().set(DEVICE_SELF_OWNER, FUNC(cpc_expansion_slot_device::irq_w));
exp.nmi_callback().set(DEVICE_SELF_OWNER, FUNC(cpc_expansion_slot_device::nmi_w));
exp.romdis_callback().set(DEVICE_SELF_OWNER, FUNC(cpc_expansion_slot_device::romdis_w)); // ROMDIS
-MACHINE_CONFIG_END
+}
//**************************************************************************
diff --git a/src/devices/bus/cpc/cpc_rom.h b/src/devices/bus/cpc/cpc_rom.h
index 0128dc79337..67e88cf6137 100644
--- a/src/devices/bus/cpc/cpc_rom.h
+++ b/src/devices/bus/cpc/cpc_rom.h
@@ -53,9 +53,6 @@ private:
DECLARE_DEVICE_TYPE(CPC_ROMSLOT, cpc_rom_image_device)
-#define MCFG_CPC_ROMSLOT_ADD(_tag) \
- MCFG_DEVICE_ADD(_tag, CPC_ROMSLOT, 0)
-
/*** ROM box device ***/
class cpc_rom_device : public device_t,
diff --git a/src/devices/bus/cpc/cpcexp.cpp b/src/devices/bus/cpc/cpcexp.cpp
index ab92c31a4df..3f9f04e89ea 100644
--- a/src/devices/bus/cpc/cpcexp.cpp
+++ b/src/devices/bus/cpc/cpcexp.cpp
@@ -83,7 +83,7 @@ void cpc_expansion_slot_device::device_start()
void cpc_expansion_slot_device::device_config_complete()
{
// for passthrough connectors, use the parent slot's CPU tag
- if (strcmp(m_cpu.finder_tag(), finder_base::DUMMY_TAG) == 0 && dynamic_cast<device_cpc_expansion_card_interface *>(owner()) != nullptr)
+ if ((m_cpu.finder_tag() == finder_base::DUMMY_TAG) && (dynamic_cast<device_cpc_expansion_card_interface *>(owner()) != nullptr))
{
auto parent = dynamic_cast<cpc_expansion_slot_device *>(owner()->owner());
if (parent != nullptr)
diff --git a/src/devices/bus/cpc/ddi1.cpp b/src/devices/bus/cpc/ddi1.cpp
index 0202f9374ae..76e09d36f34 100644
--- a/src/devices/bus/cpc/ddi1.cpp
+++ b/src/devices/bus/cpc/ddi1.cpp
@@ -116,7 +116,7 @@ WRITE8_MEMBER(cpc_ddi1_device::fdc_w)
switch(offset)
{
case 0x01:
- m_fdc->fifo_w(space, 0,data);
+ m_fdc->fifo_w(data);
break;
}
}
@@ -128,10 +128,10 @@ READ8_MEMBER(cpc_ddi1_device::fdc_r)
switch(offset)
{
case 0x00:
- data = m_fdc->msr_r(space, 0);
+ data = m_fdc->msr_r();
break;
case 0x01:
- data = m_fdc->fifo_r(space, 0);
+ data = m_fdc->fifo_r();
break;
}
return data;
diff --git a/src/devices/bus/cpc/doubler.cpp b/src/devices/bus/cpc/doubler.cpp
index ce89c0819dd..e9ed2e5b5f4 100644
--- a/src/devices/bus/cpc/doubler.cpp
+++ b/src/devices/bus/cpc/doubler.cpp
@@ -16,14 +16,15 @@
DEFINE_DEVICE_TYPE(CPC_DOUBLER, cpc_doubler_device, "cpc_doubler", "Draysoft Doubler")
-MACHINE_CONFIG_START(cpc_doubler_device::device_add_mconfig)
- MCFG_CASSETTE_ADD( "doubler_tape" )
- MCFG_CASSETTE_FORMATS(cdt_cassette_formats)
- MCFG_CASSETTE_DEFAULT_STATE(CASSETTE_STOPPED | CASSETTE_MOTOR_ENABLED)
- MCFG_CASSETTE_INTERFACE("cpc_cass")
+void cpc_doubler_device::device_add_mconfig(machine_config &config)
+{
+ CASSETTE(config, m_tape);
+ m_tape->set_formats(cdt_cassette_formats);
+ m_tape->set_default_state(CASSETTE_STOPPED | CASSETTE_MOTOR_ENABLED);
+ m_tape->set_interface("cpc_cass");
// no pass-through seen on remake PCBs, unknown if actual hardware had a pass-through port or not
-MACHINE_CONFIG_END
+}
//**************************************************************************
diff --git a/src/devices/bus/cpc/hd20.cpp b/src/devices/bus/cpc/hd20.cpp
index 3ad082ee90d..c13ffca6b4b 100644
--- a/src/devices/bus/cpc/hd20.cpp
+++ b/src/devices/bus/cpc/hd20.cpp
@@ -15,12 +15,13 @@
DEFINE_DEVICE_TYPE(CPC_HD20, cpc_hd20_device, "cpc_hd20", "Dobbertin HD20")
-MACHINE_CONFIG_START(cpc_hd20_device::device_add_mconfig)
- MCFG_DEVICE_ADD("hdc",ST11M_HDC,0)
- MCFG_XTHDC_IRQ_HANDLER(WRITELINE(*this, cpc_hd20_device, irq_w))
- MCFG_HARDDISK_ADD("hdc:primary")
+void cpc_hd20_device::device_add_mconfig(machine_config &config)
+{
+ ST11M_HDC(config, m_hdc,0);
+ m_hdc->irq_handler().set(FUNC(cpc_hd20_device::irq_w));
+ HARDDISK(config, "hdc:primary");
// no pass-through (?)
-MACHINE_CONFIG_END
+}
ROM_START( cpc_hd20 )
diff --git a/src/devices/bus/cpc/magicsound.cpp b/src/devices/bus/cpc/magicsound.cpp
index f1a940a72c3..1a85915dca1 100644
--- a/src/devices/bus/cpc/magicsound.cpp
+++ b/src/devices/bus/cpc/magicsound.cpp
@@ -20,7 +20,8 @@
DEFINE_DEVICE_TYPE(AL_MAGICSOUND, al_magicsound_device, "al_magicsound", "Aleste Magic Sound Board")
-MACHINE_CONFIG_START(al_magicsound_device::device_add_mconfig)
+void al_magicsound_device::device_add_mconfig(machine_config &config)
+{
AM9517A(config, m_dmac, DERIVED_CLOCK(1, 1)); // CLK from expansion port
// According to the schematics, the TC pin (EOP on western chips) is connected to NMI on the expansion port.
// NMIs seem to occur too quickly when this is active, so either EOP is not triggered at the correct time, or
@@ -57,11 +58,12 @@ MACHINE_CONFIG_START(al_magicsound_device::device_add_mconfig)
m_timer2->set_clk<2>(4000000);
SPEAKER(config, "speaker").front_center();
- MCFG_DEVICE_ADD("dac", DAC_8BIT_R2R, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 0.5) // unknown DAC
- MCFG_DEVICE_ADD("vref", VOLTAGE_REGULATOR, 0) MCFG_VOLTAGE_REGULATOR_OUTPUT(5.0)
- MCFG_SOUND_ROUTE(0, "dac", 1.0, DAC_VREF_POS_INPUT) MCFG_SOUND_ROUTE(0, "dac", -1.0, DAC_VREF_NEG_INPUT)
+ DAC_8BIT_R2R(config, m_dac, 0).add_route(ALL_OUTPUTS, "speaker", 0.5); // unknown DAC
+ voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref"));
+ vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT);
+ vref.add_route(0, "dac", -1.0, DAC_VREF_NEG_INPUT);
// no pass-through(?)
-MACHINE_CONFIG_END
+}
//**************************************************************************
@@ -113,12 +115,12 @@ void al_magicsound_device::device_reset()
READ8_MEMBER(al_magicsound_device::dmac_r)
{
- return m_dmac->read(space,offset);
+ return m_dmac->read(offset);
}
WRITE8_MEMBER(al_magicsound_device::dmac_w)
{
- m_dmac->write(space,offset,data);
+ m_dmac->write(offset,data);
}
WRITE8_MEMBER(al_magicsound_device::timer_w)
diff --git a/src/devices/bus/cpc/playcity.cpp b/src/devices/bus/cpc/playcity.cpp
index f9d225ef7b6..1e6f3b0cfa6 100644
--- a/src/devices/bus/cpc/playcity.cpp
+++ b/src/devices/bus/cpc/playcity.cpp
@@ -99,32 +99,32 @@ WRITE8_MEMBER(cpc_playcity_device::ctc_w)
WRITE8_MEMBER(cpc_playcity_device::ymz1_address_w)
{
- m_ymz1->address_w(space,offset,data);
+ m_ymz1->address_w(data);
}
WRITE8_MEMBER(cpc_playcity_device::ymz2_address_w)
{
- m_ymz2->address_w(space,offset,data);
+ m_ymz2->address_w(data);
}
WRITE8_MEMBER(cpc_playcity_device::ymz1_data_w)
{
- m_ymz1->data_w(space,offset,data);
+ m_ymz1->data_w(data);
}
WRITE8_MEMBER(cpc_playcity_device::ymz2_data_w)
{
- m_ymz2->data_w(space,offset,data);
+ m_ymz2->data_w(data);
}
READ8_MEMBER(cpc_playcity_device::ymz1_data_r)
{
- return m_ymz1->data_r(space,offset);
+ return m_ymz1->data_r();
}
READ8_MEMBER(cpc_playcity_device::ymz2_data_r)
{
- return m_ymz2->data_r(space,offset);
+ return m_ymz2->data_r();
}
void cpc_playcity_device::update_ymz_clock()
diff --git a/src/devices/bus/cpc/smartwatch.cpp b/src/devices/bus/cpc/smartwatch.cpp
index bd039c40735..272b7ca953e 100644
--- a/src/devices/bus/cpc/smartwatch.cpp
+++ b/src/devices/bus/cpc/smartwatch.cpp
@@ -71,15 +71,18 @@ void cpc_smartwatch_device::device_reset()
READ8_MEMBER(cpc_smartwatch_device::rtc_w)
{
uint8_t* bank = (uint8_t*)m_bank->base();
- if(offset & 1)
- m_rtc->read_1(space,0);
- else
- m_rtc->read_0(space,0);
+ if (!machine().side_effects_disabled())
+ {
+ if(offset & 1)
+ m_rtc->read_1();
+ else
+ m_rtc->read_0();
+ }
return bank[offset & 1];
}
READ8_MEMBER(cpc_smartwatch_device::rtc_r)
{
uint8_t* bank = (uint8_t*)m_bank->base();
- return ((bank[(offset & 1)+4]) & 0xfe) | (m_rtc->read_data(space,0) & 0x01);
+ return ((bank[(offset & 1)+4]) & 0xfe) | (m_rtc->read_data() & 0x01);
}
diff --git a/src/devices/bus/cpc/symbfac2.cpp b/src/devices/bus/cpc/symbfac2.cpp
index a68ecdbd900..fbdb67f5085 100644
--- a/src/devices/bus/cpc/symbfac2.cpp
+++ b/src/devices/bus/cpc/symbfac2.cpp
@@ -161,27 +161,12 @@ WRITE8_MEMBER(cpc_symbiface2_device::ide_cs1_w)
// #FD14 (read/write) read from or write into selected register
READ8_MEMBER(cpc_symbiface2_device::rtc_r)
{
- switch(offset & 0x01)
- {
- case 0x00:
- return m_rtc->read(space,1);
- case 0x01:
- return m_rtc->read(space,0);
- }
- return 0;
+ return m_rtc->read(~offset & 0x01);
}
WRITE8_MEMBER(cpc_symbiface2_device::rtc_w)
{
- switch(offset & 0x01)
- {
- case 0x00:
- m_rtc->write(space,1,data);
- break;
- case 0x01:
- m_rtc->write(space,0,data);
- break;
- }
+ m_rtc->write(~offset & 0x01, data);
}
// PS/2 Mouse connector
diff --git a/src/devices/bus/dmv/dmvbus.cpp b/src/devices/bus/dmv/dmvbus.cpp
index 80cb8ae748c..7ad4ae3a2bb 100644
--- a/src/devices/bus/dmv/dmvbus.cpp
+++ b/src/devices/bus/dmv/dmvbus.cpp
@@ -201,7 +201,10 @@ dmvcart_slot_device::dmvcart_slot_device(const machine_config &mconfig, const ch
m_prog_write_cb(*this),
m_out_int_cb(*this),
m_out_irq_cb(*this),
- m_out_thold_cb(*this), m_cart(nullptr)
+ m_out_thold_cb(*this),
+ m_memspace(*this, finder_base::DUMMY_TAG, -1),
+ m_iospace(*this, finder_base::DUMMY_TAG, -1),
+ m_cart(nullptr)
{
}
@@ -276,10 +279,10 @@ void dmvcart_slot_device::ram_write(uint8_t cas, offs_t offset, uint8_t data)
IO read
-------------------------------------------------*/
-void dmvcart_slot_device::io_read(address_space &space, int ifsel, offs_t offset, uint8_t &data)
+void dmvcart_slot_device::io_read(int ifsel, offs_t offset, uint8_t &data)
{
if (m_cart)
- m_cart->io_read(space, ifsel, offset, data);
+ m_cart->io_read(ifsel, offset, data);
}
@@ -287,10 +290,10 @@ void dmvcart_slot_device::io_read(address_space &space, int ifsel, offs_t offset
IO write
-------------------------------------------------*/
-void dmvcart_slot_device::io_write(address_space &space, int ifsel, offs_t offset, uint8_t data)
+void dmvcart_slot_device::io_write(int ifsel, offs_t offset, uint8_t data)
{
if (m_cart)
- m_cart->io_write(space, ifsel, offset, data);
+ m_cart->io_write(ifsel, offset, data);
}
/*-------------------------------------------------
diff --git a/src/devices/bus/dmv/dmvbus.h b/src/devices/bus/dmv/dmvbus.h
index a10eab52bc0..22c81767151 100644
--- a/src/devices/bus/dmv/dmvbus.h
+++ b/src/devices/bus/dmv/dmvbus.h
@@ -25,8 +25,8 @@ public:
virtual bool read(offs_t offset, uint8_t &data) { return false; }
virtual bool write(offs_t offset, uint8_t data) { return false; }
- virtual void io_read(address_space &space, int ifsel, offs_t offset, uint8_t &data) { }
- virtual void io_write(address_space &space, int ifsel, offs_t offset, uint8_t data) { }
+ virtual void io_read(int ifsel, offs_t offset, uint8_t &data) { }
+ virtual void io_write(int ifsel, offs_t offset, uint8_t data) { }
// slot 1
virtual void ram_read(uint8_t cas, offs_t offset, uint8_t &data) { }
@@ -59,14 +59,25 @@ class dmvcart_slot_device : public device_t,
{
public:
// construction/destruction
+ template <typename T>
+ dmvcart_slot_device(machine_config const &mconfig, char const *tag, device_t *owner, T &&opts, char const *dflt)
+ : dmvcart_slot_device(mconfig, tag, owner, (uint32_t)0)
+ {
+ option_reset();
+ opts(*this);
+ set_default_option(dflt);
+ set_fixed(false);
+ }
dmvcart_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
virtual ~dmvcart_slot_device();
- template <class Object> devcb_base &set_prog_read_callback(Object &&cb) { return m_prog_read_cb.set_callback(std::forward<Object>(cb)); }
- template <class Object> devcb_base &set_prog_write_callback(Object &&cb) { return m_prog_write_cb.set_callback(std::forward<Object>(cb)); }
- template <class Object> devcb_base &set_out_int_callback(Object &&cb) { return m_out_int_cb.set_callback(std::forward<Object>(cb)); }
- template <class Object> devcb_base &set_out_irq_callback(Object &&cb) { return m_out_irq_cb.set_callback(std::forward<Object>(cb)); }
- template <class Object> devcb_base &set_out_thold_callback(Object &&cb) { return m_out_thold_cb.set_callback(std::forward<Object>(cb)); }
+ auto prog_read() { return m_prog_read_cb.bind(); }
+ auto prog_write() { return m_prog_write_cb.bind(); }
+ auto out_int() { return m_out_int_cb.bind(); }
+ auto out_irq() { return m_out_irq_cb.bind(); }
+ auto out_thold() { return m_out_thold_cb.bind(); }
+ template <typename T> void set_memspace(T &&tag, int spacenum) { m_memspace.set_tag(std::forward<T>(tag), spacenum); }
+ template <typename T> void set_iospace(T &&tag, int spacenum) { m_iospace.set_tag(std::forward<T>(tag), spacenum); }
// device-level overrides
virtual void device_start() override;
@@ -76,8 +87,8 @@ public:
virtual bool write(offs_t offset, uint8_t data);
virtual void ram_read(uint8_t cas, offs_t offset, uint8_t &data);
virtual void ram_write(uint8_t cas, offs_t offset, uint8_t data);
- virtual void io_read(address_space &space, int ifsel, offs_t offset, uint8_t &data);
- virtual void io_write(address_space &space, int ifsel, offs_t offset, uint8_t data);
+ virtual void io_read(int ifsel, offs_t offset, uint8_t &data);
+ virtual void io_write(int ifsel, offs_t offset, uint8_t data);
virtual void hold_w(int state);
virtual void switch16_w(int state);
virtual void timint_w(int state);
@@ -98,6 +109,10 @@ public:
devcb_write_line m_out_int_cb;
devcb_write_line m_out_irq_cb;
devcb_write_line m_out_thold_cb;
+
+ required_address_space m_memspace;
+ required_address_space m_iospace;
+
device_dmvslot_interface* m_cart;
};
@@ -105,22 +120,4 @@ public:
// device type definition
DECLARE_DEVICE_TYPE(DMVCART_SLOT, dmvcart_slot_device)
-
-/***************************************************************************
- DEVICE CONFIGURATION MACROS
-***************************************************************************/
-
-#define MCFG_DMVCART_SLOT_PROGRAM_READWRITE_CB(_read_devcb, _write_devcb) \
- downcast<dmvcart_slot_device &>(*device).set_prog_read_callback(DEVCB_##_read_devcb); \
- downcast<dmvcart_slot_device &>(*device).set_prog_write_callback(DEVCB_##_write_devcb);
-
-#define MCFG_DMVCART_SLOT_OUT_INT_CB(_devcb) \
- downcast<dmvcart_slot_device &>(*device).set_out_int_callback(DEVCB_##_devcb);
-
-#define MCFG_DMVCART_SLOT_OUT_IRQ_CB(_devcb) \
- downcast<dmvcart_slot_device &>(*device).set_out_irq_callback(DEVCB_##_devcb);
-
-#define MCFG_DMVCART_SLOT_OUT_THOLD_CB(_devcb) \
- downcast<dmvcart_slot_device &>(*device).set_out_thold_callback(DEVCB_##_devcb);
-
#endif // MAME_BUS_DMV_DMVBUS_H
diff --git a/src/devices/bus/dmv/k210.cpp b/src/devices/bus/dmv/k210.cpp
index df16006f19b..d73f2dfb9a9 100644
--- a/src/devices/bus/dmv/k210.cpp
+++ b/src/devices/bus/dmv/k210.cpp
@@ -73,7 +73,8 @@ void dmv_k210_device::device_timer(emu_timer &timer, device_timer_id tid, int pa
// device_add_mconfig - add device configuration
//-------------------------------------------------
-MACHINE_CONFIG_START(dmv_k210_device::device_add_mconfig)
+void dmv_k210_device::device_add_mconfig(machine_config &config)
+{
I8255(config, m_ppi, 0);
m_ppi->in_pa_callback().set(FUNC(dmv_k210_device::porta_r));
m_ppi->in_pb_callback().set(FUNC(dmv_k210_device::portb_r));
@@ -93,16 +94,18 @@ MACHINE_CONFIG_START(dmv_k210_device::device_add_mconfig)
m_centronics->init_handler().set(FUNC(dmv_k210_device::cent_init_w));
INPUT_BUFFER(config, m_cent_data_in);
- MCFG_CENTRONICS_OUTPUT_LATCH_ADD("cent_data_out", "centronics")
-MACHINE_CONFIG_END
-void dmv_k210_device::io_read(address_space &space, int ifsel, offs_t offset, uint8_t &data)
+ OUTPUT_LATCH(config, m_cent_data_out);
+ m_centronics->set_output_latch(*m_cent_data_out);
+}
+
+void dmv_k210_device::io_read(int ifsel, offs_t offset, uint8_t &data)
{
if (ifsel == 0)
data = m_ppi->read(offset & 0x03);
}
-void dmv_k210_device::io_write(address_space &space, int ifsel, offs_t offset, uint8_t data)
+void dmv_k210_device::io_write(int ifsel, offs_t offset, uint8_t data)
{
if (ifsel == 0)
m_ppi->write(offset & 0x03, data);
diff --git a/src/devices/bus/dmv/k210.h b/src/devices/bus/dmv/k210.h
index dcc51a374ed..501178f6fcf 100644
--- a/src/devices/bus/dmv/k210.h
+++ b/src/devices/bus/dmv/k210.h
@@ -33,8 +33,8 @@ protected:
virtual void device_add_mconfig(machine_config &config) override;
// dmvcart_interface overrides
- virtual void io_read(address_space &space, int ifsel, offs_t offset, uint8_t &data) override;
- virtual void io_write(address_space &space, int ifsel, offs_t offset, uint8_t data) override;
+ virtual void io_read(int ifsel, offs_t offset, uint8_t &data) override;
+ virtual void io_write(int ifsel, offs_t offset, uint8_t data) override;
private:
DECLARE_READ8_MEMBER(porta_r);
diff --git a/src/devices/bus/dmv/k220.cpp b/src/devices/bus/dmv/k220.cpp
index 4fff4f5b2bf..4ad0667f689 100644
--- a/src/devices/bus/dmv/k220.cpp
+++ b/src/devices/bus/dmv/k220.cpp
@@ -122,6 +122,7 @@ DEFINE_DEVICE_TYPE(DMV_K220, dmv_k220_device, "dmv_k220", "K220 diagnostic")
dmv_k220_device::dmv_k220_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
: device_t(mconfig, DMV_K220, tag, owner, clock)
, device_dmvslot_interface(mconfig, *this)
+ , m_bus(*this, DEVICE_SELF_OWNER)
, m_pit(*this, "pit8253")
, m_ppi(*this, "ppi8255")
, m_ram(*this, "ram")
@@ -137,7 +138,7 @@ dmv_k220_device::dmv_k220_device(const machine_config &mconfig, const char *tag,
void dmv_k220_device::device_start()
{
- address_space &space = machine().device<cpu_device>("maincpu")->space(AS_IO);
+ address_space &space = *m_bus->m_iospace;
space.install_readwrite_handler(0x08, 0x0b, read8sm_delegate(FUNC(pit8253_device::read), &(*m_pit)), write8sm_delegate(FUNC(pit8253_device::write), &(*m_pit)), 0);
space.install_readwrite_handler(0x0c, 0x0f, read8sm_delegate(FUNC(i8255_device::read), &(*m_ppi)), write8sm_delegate(FUNC(i8255_device::write), &(*m_ppi)), 0);
diff --git a/src/devices/bus/dmv/k220.h b/src/devices/bus/dmv/k220.h
index 453b3e49f78..60edad3b5f3 100644
--- a/src/devices/bus/dmv/k220.h
+++ b/src/devices/bus/dmv/k220.h
@@ -44,6 +44,7 @@ private:
DECLARE_WRITE_LINE_MEMBER(write_out1);
DECLARE_WRITE_LINE_MEMBER(write_out2);
+ required_device<dmvcart_slot_device> m_bus;
required_device<pit8253_device> m_pit;
required_device<i8255_device> m_ppi;
required_memory_region m_ram;
diff --git a/src/devices/bus/dmv/k230.cpp b/src/devices/bus/dmv/k230.cpp
index 9104abe2f7b..b5454fa78db 100644
--- a/src/devices/bus/dmv/k230.cpp
+++ b/src/devices/bus/dmv/k230.cpp
@@ -98,7 +98,10 @@ dmv_k230_device::dmv_k230_device(const machine_config &mconfig, device_type type
: device_t(mconfig, type, tag, owner, clock)
, device_dmvslot_interface(mconfig, *this)
, m_maincpu(*this, "maincpu")
- , m_rom(*this, "rom"), m_bus(nullptr), m_io(nullptr), m_switch16(0), m_hold(0)
+ , m_rom(*this, "rom")
+ , m_bus(*this, DEVICE_SELF_OWNER)
+ , m_switch16(0)
+ , m_hold(0)
{
}
@@ -136,14 +139,12 @@ dmv_k235_device::dmv_k235_device(const machine_config &mconfig, const char *tag,
void dmv_k230_device::device_start()
{
- m_bus = static_cast<dmvcart_slot_device*>(owner());
- m_io = &machine().device<cpu_device>("maincpu")->space(AS_IO);
}
void dmv_k234_device::device_start()
{
dmv_k230_device::device_start();
- m_io->install_readwrite_handler(0xd8, 0xdf, read8_delegate(FUNC(dmv_k234_device::snr_r), this), write8_delegate(FUNC(dmv_k234_device::snr_w), this), 0);
+ m_bus->m_iospace->install_readwrite_handler(0xd8, 0xdf, read8_delegate(FUNC(dmv_k234_device::snr_r), this), write8_delegate(FUNC(dmv_k234_device::snr_w), this), 0);
}
//-------------------------------------------------
@@ -247,12 +248,12 @@ READ8_MEMBER(dmv_k230_device::rom_r)
READ8_MEMBER( dmv_k230_device::io_r )
{
- return m_io->read_byte(offset);
+ return m_bus->m_iospace->read_byte(offset);
}
WRITE8_MEMBER( dmv_k230_device::io_w )
{
- m_io->write_byte(offset, data);
+ m_bus->m_iospace->write_byte(offset, data);
}
READ8_MEMBER( dmv_k230_device::program_r )
diff --git a/src/devices/bus/dmv/k230.h b/src/devices/bus/dmv/k230.h
index 7021a4a8987..e8e70fd878a 100644
--- a/src/devices/bus/dmv/k230.h
+++ b/src/devices/bus/dmv/k230.h
@@ -51,8 +51,7 @@ protected:
required_device<cpu_device> m_maincpu;
optional_memory_region m_rom;
- dmvcart_slot_device * m_bus;
- address_space * m_io;
+ required_device<dmvcart_slot_device> m_bus;
int m_switch16;
int m_hold;
diff --git a/src/devices/bus/dmv/k233.cpp b/src/devices/bus/dmv/k233.cpp
index 2ba68d3f53f..2c8b13cff00 100644
--- a/src/devices/bus/dmv/k233.cpp
+++ b/src/devices/bus/dmv/k233.cpp
@@ -54,7 +54,7 @@ void dmv_k233_device::device_reset()
m_enabled = false;
}
-void dmv_k233_device::io_write(address_space &space, int ifsel, offs_t offset, uint8_t data)
+void dmv_k233_device::io_write(int ifsel, offs_t offset, uint8_t data)
{
if (ifsel == 1)
m_enabled = !m_enabled;
diff --git a/src/devices/bus/dmv/k233.h b/src/devices/bus/dmv/k233.h
index 8aa2f0d235b..e73ae71a9df 100644
--- a/src/devices/bus/dmv/k233.h
+++ b/src/devices/bus/dmv/k233.h
@@ -27,7 +27,7 @@ protected:
virtual void device_reset() override;
// dmvcart_interface overrides
- virtual void io_write(address_space &space, int ifsel, offs_t offset, uint8_t data) override;
+ virtual void io_write(int ifsel, offs_t offset, uint8_t data) override;
virtual bool read(offs_t offset, uint8_t &data) override;
virtual bool write(offs_t offset, uint8_t data) override;
diff --git a/src/devices/bus/dmv/k801.cpp b/src/devices/bus/dmv/k801.cpp
index 64098400288..7c4892f4fb0 100644
--- a/src/devices/bus/dmv/k801.cpp
+++ b/src/devices/bus/dmv/k801.cpp
@@ -206,7 +206,7 @@ WRITE_LINE_MEMBER(dmv_k801_device::epci_irq_w)
m_bus->m_out_irq_cb(state);
}
-void dmv_k801_device::io_read(address_space &space, int ifsel, offs_t offset, uint8_t &data)
+void dmv_k801_device::io_read(int ifsel, offs_t offset, uint8_t &data)
{
uint8_t dsw = m_dsw->read() & 0x0f;
if ((dsw >> 1) == ifsel && BIT(offset, 3) == BIT(dsw, 0))
@@ -218,7 +218,7 @@ void dmv_k801_device::io_read(address_space &space, int ifsel, offs_t offset, ui
}
}
-void dmv_k801_device::io_write(address_space &space, int ifsel, offs_t offset, uint8_t data)
+void dmv_k801_device::io_write(int ifsel, offs_t offset, uint8_t data)
{
uint8_t dsw = m_dsw->read() & 0x0f;
if ((dsw >> 1) == ifsel && BIT(offset, 3) == BIT(dsw, 0))
@@ -230,7 +230,7 @@ void dmv_k801_device::io_write(address_space &space, int ifsel, offs_t offset, u
}
}
-void dmv_k211_device::io_read(address_space &space, int ifsel, offs_t offset, uint8_t &data)
+void dmv_k211_device::io_read(int ifsel, offs_t offset, uint8_t &data)
{
uint8_t jumpers = m_dsw->read() & 0x03;
if ((BIT(jumpers, 0) && ifsel == 0) || (BIT(jumpers, 1) && ifsel == 1))
@@ -242,7 +242,7 @@ void dmv_k211_device::io_read(address_space &space, int ifsel, offs_t offset, ui
}
}
-void dmv_k211_device::io_write(address_space &space, int ifsel, offs_t offset, uint8_t data)
+void dmv_k211_device::io_write(int ifsel, offs_t offset, uint8_t data)
{
uint8_t jumpers = m_dsw->read() & 0x03;
if ((BIT(jumpers, 0) && ifsel == 0) || (BIT(jumpers, 1) && ifsel == 1))
diff --git a/src/devices/bus/dmv/k801.h b/src/devices/bus/dmv/k801.h
index 26f314b2149..db4b557bbb1 100644
--- a/src/devices/bus/dmv/k801.h
+++ b/src/devices/bus/dmv/k801.h
@@ -36,8 +36,8 @@ protected:
virtual void device_add_mconfig(machine_config &config) override;
// dmvcart_interface overrides
- virtual void io_read(address_space &space, int ifsel, offs_t offset, uint8_t &data) override;
- virtual void io_write(address_space &space, int ifsel, offs_t offset, uint8_t data) override;
+ virtual void io_read(int ifsel, offs_t offset, uint8_t &data) override;
+ virtual void io_write(int ifsel, offs_t offset, uint8_t data) override;
required_device<mc2661_device> m_epci;
required_device<rs232_port_device> m_rs232;
@@ -67,8 +67,8 @@ protected:
virtual void device_add_mconfig(machine_config &config) override;
// dmvcart_interface overrides
- virtual void io_read(address_space &space, int ifsel, offs_t offset, uint8_t &data) override;
- virtual void io_write(address_space &space, int ifsel, offs_t offset, uint8_t data) override;
+ virtual void io_read(int ifsel, offs_t offset, uint8_t &data) override;
+ virtual void io_write(int ifsel, offs_t offset, uint8_t data) override;
};
// ======================> dmv_k212_device
diff --git a/src/devices/bus/dmv/k803.cpp b/src/devices/bus/dmv/k803.cpp
index 04ed7445b0e..d0cf9cff336 100644
--- a/src/devices/bus/dmv/k803.cpp
+++ b/src/devices/bus/dmv/k803.cpp
@@ -75,10 +75,11 @@ void dmv_k803_device::device_reset()
// device_add_mconfig - add device configuration
//-------------------------------------------------
-MACHINE_CONFIG_START(dmv_k803_device::device_add_mconfig)
- MCFG_DEVICE_ADD("rtc", MM58167, XTAL(32'768))
- MCFG_MM58167_IRQ_CALLBACK(WRITELINE(*this, dmv_k803_device, rtc_irq_w))
-MACHINE_CONFIG_END
+void dmv_k803_device::device_add_mconfig(machine_config &config)
+{
+ MM58167(config, m_rtc, XTAL(32'768));
+ m_rtc->irq().set(FUNC(dmv_k803_device::rtc_irq_w));
+}
//-------------------------------------------------
// input_ports - device-specific input ports
@@ -89,23 +90,23 @@ ioport_constructor dmv_k803_device::device_input_ports() const
return INPUT_PORTS_NAME( dmv_k803 );
}
-void dmv_k803_device::io_read(address_space &space, int ifsel, offs_t offset, uint8_t &data)
+void dmv_k803_device::io_read(int ifsel, offs_t offset, uint8_t &data)
{
uint8_t dsw = m_dsw->read() & 0x0f;
if ((dsw >> 1) == ifsel && BIT(offset, 3) == BIT(dsw, 0))
{
if (offset & 0x04)
- data = m_rtc->read(space, ((m_latch & 0x07) << 2) | (offset & 0x03));
+ data = m_rtc->read(((m_latch & 0x07) << 2) | (offset & 0x03));
}
}
-void dmv_k803_device::io_write(address_space &space, int ifsel, offs_t offset, uint8_t data)
+void dmv_k803_device::io_write(int ifsel, offs_t offset, uint8_t data)
{
uint8_t dsw = m_dsw->read() & 0x0f;
if ((dsw >> 1) == ifsel && BIT(offset, 3) == BIT(dsw, 0))
{
if (offset & 0x04)
- m_rtc->write(space, ((m_latch & 0x07) << 2) | (offset & 0x03), data);
+ m_rtc->write(((m_latch & 0x07) << 2) | (offset & 0x03), data);
else
{
m_latch = data;
diff --git a/src/devices/bus/dmv/k803.h b/src/devices/bus/dmv/k803.h
index 0e1e190e89f..e8455646d1e 100644
--- a/src/devices/bus/dmv/k803.h
+++ b/src/devices/bus/dmv/k803.h
@@ -31,8 +31,8 @@ protected:
virtual ioport_constructor device_input_ports() const override;
virtual void device_add_mconfig(machine_config &config) override;
- virtual void io_read(address_space &space, int ifsel, offs_t offset, uint8_t &data) override;
- virtual void io_write(address_space &space, int ifsel, offs_t offset, uint8_t data) override;
+ virtual void io_read(int ifsel, offs_t offset, uint8_t &data) override;
+ virtual void io_write(int ifsel, offs_t offset, uint8_t data) override;
void update_int();
diff --git a/src/devices/bus/dmv/k806.cpp b/src/devices/bus/dmv/k806.cpp
index 62cf3f97ea4..a747efa24f4 100644
--- a/src/devices/bus/dmv/k806.cpp
+++ b/src/devices/bus/dmv/k806.cpp
@@ -128,19 +128,19 @@ const tiny_rom_entry *dmv_k806_device::device_rom_region() const
return ROM_NAME( dmv_k806 );
}
-void dmv_k806_device::io_read(address_space &space, int ifsel, offs_t offset, uint8_t &data)
+void dmv_k806_device::io_read(int ifsel, offs_t offset, uint8_t &data)
{
uint8_t jumpers = m_jumpers->read();
if (BIT(jumpers, ifsel) && ((!BIT(offset, 3) && BIT(jumpers, 5)) || (BIT(offset, 3) && BIT(jumpers, 6))))
- data = m_mcu->upi41_master_r(space, offset & 1);
+ data = m_mcu->upi41_master_r(machine().dummy_space(), offset & 1);
}
-void dmv_k806_device::io_write(address_space &space, int ifsel, offs_t offset, uint8_t data)
+void dmv_k806_device::io_write(int ifsel, offs_t offset, uint8_t data)
{
uint8_t jumpers = m_jumpers->read();
if (BIT(jumpers, ifsel) && ((!BIT(offset, 3) && BIT(jumpers, 5)) || (BIT(offset, 3) && BIT(jumpers, 6))))
{
- m_mcu->upi41_master_w(space, offset & 1, data);
+ m_mcu->upi41_master_w(machine().dummy_space(), offset & 1, data);
m_bus->m_out_int_cb(CLEAR_LINE);
}
}
diff --git a/src/devices/bus/dmv/k806.h b/src/devices/bus/dmv/k806.h
index da178a2945d..082d56b11a6 100644
--- a/src/devices/bus/dmv/k806.h
+++ b/src/devices/bus/dmv/k806.h
@@ -35,8 +35,8 @@ protected:
virtual ioport_constructor device_input_ports() const override;
virtual void device_add_mconfig(machine_config &config) override;
- virtual void io_read(address_space &space, int ifsel, offs_t offset, uint8_t &data) override;
- virtual void io_write(address_space &space, int ifsel, offs_t offset, uint8_t data) override;
+ virtual void io_read(int ifsel, offs_t offset, uint8_t &data) override;
+ virtual void io_write(int ifsel, offs_t offset, uint8_t data) override;
private:
DECLARE_READ_LINE_MEMBER(portt1_r);
diff --git a/src/devices/bus/ecbbus/ecbbus.h b/src/devices/bus/ecbbus/ecbbus.h
index f4d53b5cc9a..c14f1c53de4 100644
--- a/src/devices/bus/ecbbus/ecbbus.h
+++ b/src/devices/bus/ecbbus/ecbbus.h
@@ -56,27 +56,6 @@
#define ECBBUS_TAG "ecbbus"
-
-//**************************************************************************
-// INTERFACE CONFIGURATION MACROS
-//**************************************************************************
-
-#define MCFG_ECBBUS_ADD() \
- MCFG_DEVICE_ADD(ECBBUS_TAG, ECBBUS, 0)
-#define MCFG_ECBBUS_SLOT_ADD(_num, _tag, _slot_intf, _def_slot) \
- MCFG_DEVICE_ADD(_tag, ECBBUS_SLOT, 0) \
- MCFG_DEVICE_SLOT_INTERFACE(_slot_intf, _def_slot, false) \
- downcast<ecbbus_slot_device &>(*device).set_ecbbus_slot(ECBBUS_TAG, _num);
-
-
-#define MCFG_ECBBUS_IRQ_CALLBACK(_write) \
- downcast<ecbbus_device &>(*device).set_irq_wr_callback(DEVCB_##_write);
-
-#define MCFG_ECBBUS_NMI_CALLBACK(_write) \
- downcast<ecbbus_device &>(*device).set_nmi_wr_callback(DEVCB_##_write);
-
-
-
//**************************************************************************
// TYPE DEFINITIONS
//**************************************************************************
@@ -90,6 +69,17 @@ class ecbbus_slot_device : public device_t,
{
public:
// construction/destruction
+ template <typename T>
+ ecbbus_slot_device(machine_config const &mconfig, char const *tag, device_t *owner, int num, T &&opts, char const *dflt)
+ : ecbbus_slot_device(mconfig, tag, owner, 0)
+ {
+ option_reset();
+ opts(*this);
+ set_default_option(dflt);
+ set_fixed(false);
+ set_ecbbus_slot(ECBBUS_TAG, num);
+ }
+
ecbbus_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
// device-level overrides
@@ -121,10 +111,10 @@ class ecbbus_device : public device_t
{
public:
// construction/destruction
- ecbbus_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+ ecbbus_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock = 0);
- template <class Object> devcb_base &set_irq_wr_callback(Object &&cb) { return m_write_irq.set_callback(std::forward<Object>(cb)); }
- template <class Object> devcb_base &set_nmi_wr_callback(Object &&cb) { return m_write_nmi.set_callback(std::forward<Object>(cb)); }
+ auto irq_wr_callback() { return m_write_irq.bind(); }
+ auto nmi_wr_callback() { return m_write_nmi.bind(); }
void add_card(device_ecbbus_card_interface *card, int pos);
diff --git a/src/devices/bus/econet/e01.cpp b/src/devices/bus/econet/e01.cpp
index cb1f385aa86..fca4c189033 100644
--- a/src/devices/bus/econet/e01.cpp
+++ b/src/devices/bus/econet/e01.cpp
@@ -647,7 +647,7 @@ WRITE8_MEMBER( econet_e01_device::hdc_irq_enable_w )
READ8_MEMBER( econet_e01_device::rtc_address_r )
{
- return m_rtc->read(space, 0);
+ return m_rtc->read(0);
}
@@ -657,7 +657,7 @@ READ8_MEMBER( econet_e01_device::rtc_address_r )
WRITE8_MEMBER( econet_e01_device::rtc_address_w )
{
- m_rtc->write(space, 0, data);
+ m_rtc->write(0, data);
}
@@ -667,7 +667,7 @@ WRITE8_MEMBER( econet_e01_device::rtc_address_w )
READ8_MEMBER( econet_e01_device::rtc_data_r )
{
- return m_rtc->read(space, 1);
+ return m_rtc->read(1);
}
@@ -677,7 +677,7 @@ READ8_MEMBER( econet_e01_device::rtc_data_r )
WRITE8_MEMBER( econet_e01_device::rtc_data_w )
{
- m_rtc->write(space, 1, data);
+ m_rtc->write(1, data);
}
diff --git a/src/devices/bus/econet/econet.h b/src/devices/bus/econet/econet.h
index bbe4167cfa9..dd92811e28b 100644
--- a/src/devices/bus/econet/econet.h
+++ b/src/devices/bus/econet/econet.h
@@ -21,28 +21,6 @@
#define ECONET_TAG "econet"
-
-//**************************************************************************
-// INTERFACE CONFIGURATION MACROS
-//**************************************************************************
-
-#define MCFG_ECONET_ADD() \
- MCFG_DEVICE_ADD(ECONET_TAG, ECONET, 0)
-
-#define MCFG_ECONET_SLOT_ADD(_tag, _num, _slot_intf, _def_slot) \
- MCFG_DEVICE_ADD(_tag, ECONET_SLOT, 0) \
- MCFG_DEVICE_SLOT_INTERFACE(_slot_intf, _def_slot, false) \
- downcast<econet_slot_device &>(*device).set_slot(_num);
-
-
-#define MCFG_ECONET_CLK_CALLBACK(_write) \
- downcast<econet_device &>(*device).set_clk_wr_callback(DEVCB_##_write);
-
-#define MCFG_ECONET_DATA_CALLBACK(_write) \
- downcast<econet_device &>(*device).set_data_wr_callback(DEVCB_##_write);
-
-
-
//**************************************************************************
// TYPE DEFINITIONS
//**************************************************************************
@@ -57,8 +35,6 @@ public:
// construction/destruction
econet_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- template <class Object> devcb_base &set_clk_wr_callback(Object &&cb) { return m_write_clk.set_callback(std::forward<Object>(cb)); }
- template <class Object> devcb_base &set_data_wr_callback(Object &&cb) { return m_write_data.set_callback(std::forward<Object>(cb)); }
auto clk_wr_callback() { return m_write_clk.bind(); }
auto data_wr_callback() { return m_write_data.bind(); }
diff --git a/src/devices/bus/einstein/pipe/pipe.cpp b/src/devices/bus/einstein/pipe/pipe.cpp
index b40038e650b..d521d146325 100644
--- a/src/devices/bus/einstein/pipe/pipe.cpp
+++ b/src/devices/bus/einstein/pipe/pipe.cpp
@@ -33,8 +33,8 @@ DEFINE_DEVICE_TYPE(TATUNG_PIPE, tatung_pipe_device, "tatung_pipe", "Tatung Pipe
tatung_pipe_device::tatung_pipe_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) :
device_t(mconfig, TATUNG_PIPE, tag, owner, clock),
device_slot_interface(mconfig, *this),
- m_program(nullptr),
- m_io(nullptr),
+ m_program(*this, finder_base::DUMMY_TAG, -1),
+ m_io(*this, finder_base::DUMMY_TAG, -1),
m_card(nullptr),
m_int_handler(*this),
m_nmi_handler(*this),
@@ -51,6 +51,28 @@ tatung_pipe_device::~tatung_pipe_device()
}
//-------------------------------------------------
+// device_config_complete - perform any
+// operations now that the configuration is
+// complete
+//-------------------------------------------------
+
+void tatung_pipe_device::device_config_complete()
+{
+ // for passthrough connectors, use the parent slot's spaces
+ if (dynamic_cast<device_tatung_pipe_interface *>(owner()) != nullptr)
+ {
+ auto parent = dynamic_cast<tatung_pipe_device *>(owner()->owner());
+ if (parent != nullptr)
+ {
+ if (m_program.finder_tag() == finder_base::DUMMY_TAG)
+ m_program.set_tag(parent->m_program, parent->m_program.spacenum());
+ if (m_io.finder_tag() == finder_base::DUMMY_TAG)
+ m_io.set_tag(parent->m_io, parent->m_io.spacenum());
+ }
+ }
+}
+
+//-------------------------------------------------
// device_start - device-specific startup
//-------------------------------------------------
@@ -83,24 +105,6 @@ WRITE_LINE_MEMBER( tatung_pipe_device::host_int_w )
m_card->int_w(state);
}
-//-------------------------------------------------
-// set_program_space - set address space we are attached to
-//-------------------------------------------------
-
-void tatung_pipe_device::set_program_space(address_space *program)
-{
- m_program = program;
-}
-
-//-------------------------------------------------
-// set_io_space - set address space we are attached to
-//-------------------------------------------------
-
-void tatung_pipe_device::set_io_space(address_space *io)
-{
- m_io = io;
-}
-
//**************************************************************************
// CARD INTERFACE
diff --git a/src/devices/bus/einstein/pipe/pipe.h b/src/devices/bus/einstein/pipe/pipe.h
index e0ce7e9a6f7..f0c32bd0043 100644
--- a/src/devices/bus/einstein/pipe/pipe.h
+++ b/src/devices/bus/einstein/pipe/pipe.h
@@ -68,8 +68,8 @@ public:
}
virtual ~tatung_pipe_device();
- void set_program_space(address_space *program);
- void set_io_space(address_space *io);
+ template <typename T> void set_program_space(T &&tag, int spacenum) { m_program.set_tag(std::forward<T>(tag), spacenum); }
+ template <typename T> void set_io_space(T &&tag, int spacenum) { m_io.set_tag(std::forward<T>(tag), spacenum); }
// callbacks
auto int_handler() { return m_int_handler.bind(); }
@@ -86,11 +86,12 @@ public:
protected:
// device-level overrides
+ virtual void device_config_complete() override;
virtual void device_start() override;
virtual void device_reset() override;
- address_space *m_program;
- address_space *m_io;
+ required_address_space m_program;
+ required_address_space m_io;
device_tatung_pipe_interface *m_card;
diff --git a/src/devices/bus/einstein/pipe/speculator.cpp b/src/devices/bus/einstein/pipe/speculator.cpp
index 75519847e16..ed35973ab12 100644
--- a/src/devices/bus/einstein/pipe/speculator.cpp
+++ b/src/devices/bus/einstein/pipe/speculator.cpp
@@ -25,7 +25,8 @@ DEFINE_DEVICE_TYPE(EINSTEIN_SPECULATOR, einstein_speculator_device, "einstein_sp
// device_add_mconfig - add device configuration
//-------------------------------------------------
-MACHINE_CONFIG_START(einstein_speculator_device::device_add_mconfig)
+void einstein_speculator_device::device_add_mconfig(machine_config &config)
+{
TTL74123(config, m_ic5a, 0);
m_ic5a->set_connection_type(TTL74123_NOT_GROUNDED_NO_DIODE);
m_ic5a->set_resistor_value(RES_K(47));
@@ -48,11 +49,11 @@ MACHINE_CONFIG_START(einstein_speculator_device::device_add_mconfig)
WAVE(config, "wave", m_cassette).add_route(ALL_OUTPUTS, "mono", 0.25);
SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.50);
- MCFG_CASSETTE_ADD(m_cassette)
- MCFG_CASSETTE_FORMATS(tzx_cassette_formats)
- MCFG_CASSETTE_DEFAULT_STATE(CASSETTE_STOPPED | CASSETTE_SPEAKER_ENABLED | CASSETTE_MOTOR_ENABLED)
- MCFG_CASSETTE_INTERFACE("spectrum_cass")
-MACHINE_CONFIG_END
+ CASSETTE(config, m_cassette);
+ m_cassette->set_formats(tzx_cassette_formats);
+ m_cassette->set_default_state(CASSETTE_STOPPED | CASSETTE_SPEAKER_ENABLED | CASSETTE_MOTOR_ENABLED);
+ m_cassette->set_interface("spectrum_cass");
+}
//**************************************************************************
diff --git a/src/devices/bus/einstein/pipe/tk02.cpp b/src/devices/bus/einstein/pipe/tk02.cpp
index d0926f2e320..311c3099011 100644
--- a/src/devices/bus/einstein/pipe/tk02.cpp
+++ b/src/devices/bus/einstein/pipe/tk02.cpp
@@ -159,9 +159,6 @@ void tk02_device::device_start()
void tk02_device::device_reset()
{
- m_pipe->set_io_space(&io_space());
- m_pipe->set_program_space(&program_space());
-
io_space().install_device(0x40, 0x4f, *this, &tk02_device::map);
io_space().install_readwrite_handler(0x40, 0x47, 0, 0, 0xff00, read8_delegate(FUNC(tk02_device::ram_r), this), write8_delegate(FUNC(tk02_device::ram_w), this));
}
diff --git a/src/devices/bus/einstein/userport/userport.h b/src/devices/bus/einstein/userport/userport.h
index 4bdbaed36d2..f5bd8dcfeb3 100644
--- a/src/devices/bus/einstein/userport/userport.h
+++ b/src/devices/bus/einstein/userport/userport.h
@@ -24,32 +24,32 @@
//**************************************************************************
-// INTERFACE CONFIGURATION MACROS
-//**************************************************************************
-
-#define MCFG_EINSTEIN_USERPORT_ADD(_tag) \
- MCFG_DEVICE_ADD(_tag, EINSTEIN_USERPORT, 0) \
- MCFG_DEVICE_SLOT_INTERFACE(einstein_userport_cards, nullptr, false)
-
-#define MCFG_EINSTEIN_USERPORT_BSTB_HANDLER(_devcb) \
- downcast<einstein_userport_device &>(*device).set_bstb_handler(DEVCB_##_devcb);
-
-
-//**************************************************************************
// TYPE DEFINITIONS
//**************************************************************************
class device_einstein_userport_interface;
+// supported devices
+void einstein_userport_cards(device_slot_interface &device);
+
class einstein_userport_device : public device_t, public device_slot_interface
{
public:
// construction/destruction
+ einstein_userport_device(machine_config const &mconfig, char const *tag, device_t *owner)
+ : einstein_userport_device(mconfig, tag, owner, (uint32_t)0)
+ {
+ option_reset();
+ einstein_userport_cards(*this);
+ set_default_option(nullptr);
+ set_fixed(false);
+ }
+
einstein_userport_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
virtual ~einstein_userport_device();
// callbacks
- template <class Object> devcb_base &set_bstb_handler(Object &&cb) { return m_bstb_handler.set_callback(std::forward<Object>(cb)); }
+ auto bstb_handler() { return m_bstb_handler.bind(); }
// called from card device
DECLARE_WRITE_LINE_MEMBER( bstb_w ) { m_bstb_handler(state); }
@@ -89,7 +89,4 @@ protected:
// device type definition
DECLARE_DEVICE_TYPE(EINSTEIN_USERPORT, einstein_userport_device)
-// supported devices
-void einstein_userport_cards(device_slot_interface &device);
-
#endif // MAME_BUS_EINSTEIN_USERPORT_USERPORT_H
diff --git a/src/devices/bus/ekara/rom.cpp b/src/devices/bus/ekara/rom.cpp
index 7ba557b0917..f55fd325d2a 100644
--- a/src/devices/bus/ekara/rom.cpp
+++ b/src/devices/bus/ekara/rom.cpp
@@ -10,8 +10,10 @@
DEFINE_DEVICE_TYPE(EKARA_ROM_PLAIN, ekara_rom_plain_device, "ekara_rom_plain", "EKARA Cartridge")
DEFINE_DEVICE_TYPE(EKARA_ROM_I2C_BASE, ekara_rom_i2c_base_device, "ekara_rom_i2c_base", "EKARA Cartridge with I2C")
+DEFINE_DEVICE_TYPE(EKARA_ROM_I2C_24C08_EPITCH, ekara_rom_i2c_24c08_epitch_device, "ekara_rom_i2c_24c08", "EKARA Cartridge with I2C 24C08 (e-pitch)")
DEFINE_DEVICE_TYPE(EKARA_ROM_I2C_24LC04, ekara_rom_i2c_24lc04_device, "ekara_rom_i2c_24lc04", "EKARA Cartridge with I2C 24LC04")
DEFINE_DEVICE_TYPE(EKARA_ROM_I2C_24LC02, ekara_rom_i2c_24lc02_device, "ekara_rom_i2c_24lc02", "EKARA Cartridge with I2C 24LC02")
+DEFINE_DEVICE_TYPE(EKARA_ROM_I2C_24LC02_GC0010, ekara_rom_i2c_24lc02_gc0010_device, "ekara_rom_i2c_24lc02_gc0010", "EKARA Cartridge with I2C 24LC02 (GC0010 direct access)")
ekara_rom_plain_device::ekara_rom_plain_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock) :
@@ -24,18 +26,24 @@ ekara_rom_plain_device::ekara_rom_plain_device(const machine_config &mconfig, co
{
}
-ekara_rom_i2c_base_device::ekara_rom_i2c_base_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) :
- ekara_rom_plain_device(mconfig, EKARA_ROM_I2C_BASE, tag, owner, clock),
- m_i2cmem(*this, "i2cmem")
-{
-}
+
ekara_rom_i2c_base_device::ekara_rom_i2c_base_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock) :
ekara_rom_plain_device(mconfig, type, tag, owner, clock),
m_i2cmem(*this, "i2cmem")
{
+ m_buscontrol[0] = m_buscontrol[1] = m_buscontrol[2] = 0x00;
}
+ekara_rom_i2c_base_device::ekara_rom_i2c_base_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) :
+ ekara_rom_i2c_base_device(mconfig, EKARA_ROM_I2C_BASE, tag, owner, clock)
+{
+}
+
+ekara_rom_i2c_24c08_epitch_device::ekara_rom_i2c_24c08_epitch_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) :
+ ekara_rom_i2c_base_device(mconfig, EKARA_ROM_I2C_24C08_EPITCH, tag, owner, clock)
+{
+}
ekara_rom_i2c_24lc04_device::ekara_rom_i2c_24lc04_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) :
ekara_rom_i2c_base_device(mconfig, EKARA_ROM_I2C_24LC04, tag, owner, clock)
@@ -47,6 +55,11 @@ ekara_rom_i2c_24lc02_device::ekara_rom_i2c_24lc02_device(const machine_config &m
{
}
+ekara_rom_i2c_24lc02_gc0010_device::ekara_rom_i2c_24lc02_gc0010_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) :
+ ekara_rom_i2c_base_device(mconfig, EKARA_ROM_I2C_24LC02_GC0010, tag, owner, clock)
+{
+}
+
/*-------------------------------------------------
mapper specific handlers
-------------------------------------------------*/
@@ -75,6 +88,22 @@ WRITE8_MEMBER(ekara_rom_plain_device::write_rom)
// i2c base
+bool ekara_rom_i2c_base_device::is_read_access_not_rom(void)
+{
+ return (m_buscontrol[1] & 0x08) ? true : false;
+}
+
+bool ekara_rom_i2c_base_device::is_write_access_not_rom(void)
+{
+ return (m_buscontrol[0] & 0x08) ? true : false;
+}
+
+WRITE8_MEMBER(ekara_rom_i2c_base_device::write_bus_control)
+{
+ logerror("ekara_rom_i2c_base_device::write_bus_control %08x %02x\n", offset, data);
+ m_buscontrol[offset] = data;
+}
+
WRITE8_MEMBER(ekara_rom_i2c_base_device::write_rom)
{
logerror("ekara_rom_i2c_base_device::write_rom %08x %02x\n", offset, data);
@@ -100,18 +129,85 @@ WRITE8_MEMBER(ekara_rom_i2c_base_device::write_extra)
m_i2cmem->write_scl((data & 0x02) >> 1);
}
+// i2c 24c08 (for epitch carts)
+
+bool ekara_rom_i2c_24c08_epitch_device::is_read_access_not_rom(void)
+{
+ // write 0x08 before reading from SEEPROM
+ // reads from 005fffff, cart does no accress decoding
+ return (m_buscontrol[1] & 0x08) ? true : false;
+}
+
+bool ekara_rom_i2c_24c08_epitch_device::is_write_access_not_rom(void)
+{
+ // writes 0x05 before writing to SEEPROM
+ // actually writes to address 3fffff which is where a mirror of the base ROM sits, but clearly all signals route through the cartridge too
+ // cart does no accress decoding
+ return (m_buscontrol[1] & 0x04) ? true : false;
+}
+
+void ekara_rom_i2c_24c08_epitch_device::device_add_mconfig(machine_config &config)
+{
+ I2CMEM(config, "i2cmem", 0).set_page_size(16).set_data_size(0x400); // 24C08
+}
// i2c 24lc04
-MACHINE_CONFIG_START(ekara_rom_i2c_24lc04_device::device_add_mconfig)
- I2CMEM(config, "i2cmem", 0)/*.set_page_size(16)*/.set_data_size(0x200); // 24LC04
-MACHINE_CONFIG_END
+void ekara_rom_i2c_24lc04_device::device_add_mconfig(machine_config &config)
+{
+ I2CMEM(config, "i2cmem", 0).set_page_size(16).set_data_size(0x200); // 24LC04
+}
// i2c 24lc02
-MACHINE_CONFIG_START(ekara_rom_i2c_24lc02_device::device_add_mconfig)
+void ekara_rom_i2c_24lc02_device::device_add_mconfig(machine_config &config)
+{
+ I2CMEM(config, "i2cmem", 0).set_page_size(16).set_data_size(0x100); // 24LC02
+}
+
+// i2c 24lc02 with direct IO port access
+
+bool ekara_rom_i2c_24lc02_gc0010_device::is_read_access_not_rom(void)
+{
+ return false;
+}
+
+bool ekara_rom_i2c_24lc02_gc0010_device::is_write_access_not_rom(void)
+{
+ return false;
+}
+
+READ8_MEMBER(ekara_rom_i2c_24lc02_gc0010_device::read_extra)
+{
+ return 0;
+}
+
+WRITE8_MEMBER(ekara_rom_i2c_24lc02_gc0010_device::write_extra)
+{
+}
+
+
+WRITE_LINE_MEMBER(ekara_rom_i2c_24lc02_gc0010_device::write_sda)
+{
+ m_i2cmem->write_sda(state);
+}
+
+WRITE_LINE_MEMBER(ekara_rom_i2c_24lc02_gc0010_device::write_scl)
+{
+ m_i2cmem->write_scl(state);
+}
+
+READ_LINE_MEMBER(ekara_rom_i2c_24lc02_gc0010_device::read_sda )
+{
+ return m_i2cmem->read_sda();
+}
+
+
+
+void ekara_rom_i2c_24lc02_gc0010_device::device_add_mconfig(machine_config &config)
+{
I2CMEM(config, "i2cmem", 0)/*.set_page_size(16)*/.set_data_size(0x100); // 24LC02
-MACHINE_CONFIG_END
+}
/*-------------------------------------------------
@@ -121,6 +217,9 @@ MACHINE_CONFIG_END
void ekara_cart(device_slot_interface &device)
{
device.option_add_internal("plain", EKARA_ROM_PLAIN);
+ device.option_add_internal("rom_24c08_epitch", EKARA_ROM_I2C_24C08_EPITCH);
device.option_add_internal("rom_24lc04", EKARA_ROM_I2C_24LC04);
- device.option_add_internal("rom_24lc02", EKARA_ROM_I2C_24LC02);
+ device.option_add_internal("rom_24lc02", EKARA_ROM_I2C_24LC02);
+ device.option_add_internal("rom_24lc02_gc0010", EKARA_ROM_I2C_24LC02_GC0010);
+
}
diff --git a/src/devices/bus/ekara/rom.h b/src/devices/bus/ekara/rom.h
index a765f28d6d3..76c5ed45e46 100644
--- a/src/devices/bus/ekara/rom.h
+++ b/src/devices/bus/ekara/rom.h
@@ -54,8 +54,32 @@ protected:
virtual DECLARE_READ8_MEMBER(read_extra) override;
virtual DECLARE_WRITE8_MEMBER(write_extra) override;
+
+ virtual DECLARE_WRITE8_MEMBER(write_bus_control) override;
+
+ virtual bool is_read_access_not_rom(void) override;
+ virtual bool is_write_access_not_rom(void) override;
+
+ uint8_t m_buscontrol[3];
};
+
+// ======================> ekara_rom_i2c_24c08_epitch_device
+
+class ekara_rom_i2c_24c08_epitch_device : public ekara_rom_i2c_base_device
+{
+public:
+ // construction/destruction
+ ekara_rom_i2c_24c08_epitch_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+
+protected:
+ virtual bool is_read_access_not_rom(void) override;
+ virtual bool is_write_access_not_rom(void) override;
+
+ virtual void device_add_mconfig(machine_config &config) override;
+};
+
+
// ======================> ekara_rom_i2c_24lc04_device
class ekara_rom_i2c_24lc04_device : public ekara_rom_i2c_base_device
@@ -81,10 +105,32 @@ protected:
};
+// ======================> ekara_rom_i2c_24lc02_gc0010_device
+
+class ekara_rom_i2c_24lc02_gc0010_device : public ekara_rom_i2c_base_device
+{
+public:
+ // construction/destruction
+ ekara_rom_i2c_24lc02_gc0010_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+
+protected:
+ virtual void device_add_mconfig(machine_config &config) override;
+
+ bool is_read_access_not_rom(void) override;
+ bool is_write_access_not_rom(void) override;
+ DECLARE_READ8_MEMBER(read_extra) override;
+ DECLARE_WRITE8_MEMBER(write_extra) override;
+ DECLARE_WRITE_LINE_MEMBER(write_sda) override;
+ DECLARE_WRITE_LINE_MEMBER(write_scl) override;
+ DECLARE_READ_LINE_MEMBER(read_sda ) override;
+};
+
// device type definition
DECLARE_DEVICE_TYPE(EKARA_ROM_PLAIN, ekara_rom_plain_device)
DECLARE_DEVICE_TYPE(EKARA_ROM_I2C_BASE, ekara_rom_i2c_base_device)
+DECLARE_DEVICE_TYPE(EKARA_ROM_I2C_24C08_EPITCH, ekara_rom_i2c_24c08_epitch_device)
DECLARE_DEVICE_TYPE(EKARA_ROM_I2C_24LC04, ekara_rom_i2c_24lc04_device)
DECLARE_DEVICE_TYPE(EKARA_ROM_I2C_24LC02, ekara_rom_i2c_24lc02_device)
+DECLARE_DEVICE_TYPE(EKARA_ROM_I2C_24LC02_GC0010, ekara_rom_i2c_24lc02_gc0010_device)
#endif // MAME_BUS_EKARA_ROM_H
diff --git a/src/devices/bus/ekara/slot.cpp b/src/devices/bus/ekara/slot.cpp
index 0569bb49a6c..5140e3f28ab 100644
--- a/src/devices/bus/ekara/slot.cpp
+++ b/src/devices/bus/ekara/slot.cpp
@@ -95,6 +95,7 @@ static const ekara_slot slot_list[] =
{
{ EKARA_PLAIN, "plain" },
{ EKARA_I2C_BASE, "i2c_base" },
+ { EKARA_I2C_24C08, "rom_24c08" },
{ EKARA_I2C_24LC04, "rom_24lc04" },
{ EKARA_I2C_24LC02, "rom_24lc02" },
};
@@ -237,3 +238,40 @@ WRITE8_MEMBER(ekara_cart_slot_device::write_extra)
m_cart->write_extra(space, offset, data);
}
+/*-------------------------------------------------
+ write control
+ -------------------------------------------------*/
+
+WRITE8_MEMBER(ekara_cart_slot_device::write_bus_control)
+{
+ m_cart->write_bus_control(space, offset, data);
+}
+
+bool ekara_cart_slot_device::is_read_access_not_rom(void)
+{
+ return m_cart->is_read_access_not_rom();
+}
+
+bool ekara_cart_slot_device::is_write_access_not_rom(void)
+{
+ return m_cart->is_write_access_not_rom();
+}
+
+/*-------------------------------------------------
+ direct seeprom access (popira2, gc0010)
+ -------------------------------------------------*/
+
+WRITE_LINE_MEMBER(ekara_cart_slot_device::write_sda)
+{
+ m_cart->write_sda(state);
+}
+
+WRITE_LINE_MEMBER(ekara_cart_slot_device::write_scl)
+{
+ m_cart->write_scl(state);
+}
+
+READ_LINE_MEMBER(ekara_cart_slot_device::read_sda )
+{
+ return m_cart->read_sda();
+}
diff --git a/src/devices/bus/ekara/slot.h b/src/devices/bus/ekara/slot.h
index 5f871aa1dfc..945a5175d4b 100644
--- a/src/devices/bus/ekara/slot.h
+++ b/src/devices/bus/ekara/slot.h
@@ -16,6 +16,7 @@ enum
{
EKARA_PLAIN = 0,
EKARA_I2C_BASE,
+ EKARA_I2C_24C08,
EKARA_I2C_24LC04,
EKARA_I2C_24LC02,
};
@@ -35,6 +36,16 @@ public:
virtual DECLARE_READ8_MEMBER(read_extra) { return 0xff; }
virtual DECLARE_WRITE8_MEMBER(write_extra) { }
+ virtual DECLARE_WRITE_LINE_MEMBER(write_sda) { }
+ virtual DECLARE_WRITE_LINE_MEMBER(write_scl) { }
+ //virtual DECLARE_WRITE_LINE_MEMBER( write_wc )
+ virtual DECLARE_READ_LINE_MEMBER( read_sda ) { return 0; }
+
+ virtual DECLARE_WRITE8_MEMBER(write_bus_control) { }
+
+ virtual bool is_read_access_not_rom(void) { return false; }
+ virtual bool is_write_access_not_rom(void) { return false; }
+
void rom_alloc(uint32_t size, const char *tag);
uint8_t* get_rom_base() { return m_rom; }
uint32_t get_rom_size() { return m_rom_size; }
@@ -96,6 +107,16 @@ public:
virtual DECLARE_READ8_MEMBER(read_extra);
virtual DECLARE_WRITE8_MEMBER(write_extra);
+ virtual DECLARE_WRITE_LINE_MEMBER(write_sda);
+ virtual DECLARE_WRITE_LINE_MEMBER(write_scl);
+ //virtual DECLARE_WRITE_LINE_MEMBER( write_wc );
+ virtual DECLARE_READ_LINE_MEMBER( read_sda );
+
+ virtual DECLARE_WRITE8_MEMBER(write_bus_control);
+
+ virtual bool is_read_access_not_rom(void);
+ virtual bool is_write_access_not_rom(void);
+
bool has_cart() { return m_cart ? true : false; }
protected:
diff --git a/src/devices/bus/electron/cart/abr.cpp b/src/devices/bus/electron/cart/abr.cpp
index c894d5e9c71..1d2455e56c1 100644
--- a/src/devices/bus/electron/cart/abr.cpp
+++ b/src/devices/bus/electron/cart/abr.cpp
@@ -46,16 +46,13 @@ void electron_abr_device::device_start()
// read - cartridge data read
//-------------------------------------------------
-uint8_t electron_abr_device::read(address_space &space, offs_t offset, int infc, int infd, int romqa)
+uint8_t electron_abr_device::read(offs_t offset, int infc, int infd, int romqa, int oe, int oe2)
{
uint8_t data = 0xff;
- if (!infc && !infd)
+ if (oe)
{
- if (offset >= 0x0000 && offset < 0x4000)
- {
- data = m_nvram[(offset & 0x3fff) | (romqa << 14)];
- }
+ data = m_nvram[(offset & 0x3fff) | (romqa << 14)];
}
return data;
@@ -65,7 +62,7 @@ uint8_t electron_abr_device::read(address_space &space, offs_t offset, int infc,
// write - cartridge data write
//-------------------------------------------------
-void electron_abr_device::write(address_space &space, offs_t offset, uint8_t data, int infc, int infd, int romqa)
+void electron_abr_device::write(offs_t offset, uint8_t data, int infc, int infd, int romqa, int oe, int oe2)
{
if (infc)
{
@@ -85,10 +82,9 @@ void electron_abr_device::write(address_space &space, offs_t offset, uint8_t dat
break;
}
}
-
- if (!infc && !infd)
+ else if (oe)
{
- if (offset >= 0x0000 && offset < 0x4000 && !m_bank_locked[romqa])
+ if (!m_bank_locked[romqa])
{
m_nvram[(offset & 0x3fff) | (romqa << 14)] = data;
}
diff --git a/src/devices/bus/electron/cart/abr.h b/src/devices/bus/electron/cart/abr.h
index b985db0a44d..3ef92c95a8d 100644
--- a/src/devices/bus/electron/cart/abr.h
+++ b/src/devices/bus/electron/cart/abr.h
@@ -32,8 +32,8 @@ protected:
virtual void device_start() override;
// electron_cart_interface overrides
- virtual uint8_t read(address_space &space, offs_t offset, int infc, int infd, int romqa) override;
- virtual void write(address_space &space, offs_t offset, uint8_t data, int infc, int infd, int romqa) override;
+ virtual uint8_t read(offs_t offset, int infc, int infd, int romqa, int oe, int oe2) override;
+ virtual void write(offs_t offset, uint8_t data, int infc, int infd, int romqa, int oe, int oe2) override;
private:
bool m_bank_locked[2];
diff --git a/src/devices/bus/electron/cart/ap34.cpp b/src/devices/bus/electron/cart/ap34.cpp
index 30847c55aa4..694df390266 100644
--- a/src/devices/bus/electron/cart/ap34.cpp
+++ b/src/devices/bus/electron/cart/ap34.cpp
@@ -47,7 +47,7 @@ void ap34_floppies(device_slot_interface &device)
void electron_ap34_device::device_add_mconfig(machine_config &config)
{
/* fdc */
- WD1770(config, m_fdc, 16_MHz_XTAL / 2);
+ WD1770(config, m_fdc, DERIVED_CLOCK(1, 2));
FLOPPY_CONNECTOR(config, m_floppy0, ap34_floppies, "525qd", electron_ap34_device::floppy_formats).enable_sound(true);
FLOPPY_CONNECTOR(config, m_floppy1, ap34_floppies, nullptr, electron_ap34_device::floppy_formats).enable_sound(true);
}
@@ -81,9 +81,9 @@ void electron_ap34_device::device_start()
// read - cartridge data read
//-------------------------------------------------
-uint8_t electron_ap34_device::read(address_space &space, offs_t offset, int infc, int infd, int romqa)
+uint8_t electron_ap34_device::read(offs_t offset, int infc, int infd, int romqa, int oe, int oe2)
{
- uint8_t data = 0xfe;
+ uint8_t data = 0xff;
if (infc)
{
@@ -97,18 +97,16 @@ uint8_t electron_ap34_device::read(address_space &space, offs_t offset, int infc
break;
}
}
-
- if (!infc && !infd)
+ else if (oe)
{
- if (offset >= 0x0000 && offset < 0x4000)
- {
- data = m_rom[(offset & 0x3fff) + (romqa * 0x4000)];
- }
-
if (m_ram.size() != 0 && romqa == 0 && offset >= 0x3000)
{
data = m_ram[offset & 0x0fff];
}
+ else
+ {
+ data = m_rom[(offset & 0x3fff) | (romqa << 14)];
+ }
}
return data;
@@ -118,14 +116,14 @@ uint8_t electron_ap34_device::read(address_space &space, offs_t offset, int infc
// write - cartridge data write
//-------------------------------------------------
-void electron_ap34_device::write(address_space &space, offs_t offset, uint8_t data, int infc, int infd, int romqa)
+void electron_ap34_device::write(offs_t offset, uint8_t data, int infc, int infd, int romqa, int oe, int oe2)
{
if (infc)
{
switch (offset & 0xff)
{
case 0xc0:
- wd1770_control_w(space, 0, data);
+ wd1770_control_w(data);
break;
case 0xc4:
case 0xc5:
@@ -135,8 +133,7 @@ void electron_ap34_device::write(address_space &space, offs_t offset, uint8_t da
break;
}
}
-
- if (!infc && !infd)
+ else if (oe)
{
if (m_ram.size() != 0 && romqa == 0 && offset >= 0x3000)
{
@@ -150,7 +147,7 @@ void electron_ap34_device::write(address_space &space, offs_t offset, uint8_t da
// IMPLEMENTATION
//**************************************************************************
-WRITE8_MEMBER(electron_ap34_device::wd1770_control_w)
+void electron_ap34_device::wd1770_control_w(uint8_t data)
{
floppy_image_device *floppy = nullptr;
@@ -167,6 +164,7 @@ WRITE8_MEMBER(electron_ap34_device::wd1770_control_w)
m_fdc->dden_w(BIT(data, 3));
// bit 4: NMI - not connected
+ //m_slot->nmi_w(!BIT(data, 4));
// bit 5: reset
if (!BIT(data, 5)) m_fdc->soft_reset();
diff --git a/src/devices/bus/electron/cart/ap34.h b/src/devices/bus/electron/cart/ap34.h
index b3fb911b8f6..69b47514487 100644
--- a/src/devices/bus/electron/cart/ap34.h
+++ b/src/devices/bus/electron/cart/ap34.h
@@ -36,11 +36,11 @@ protected:
virtual void device_add_mconfig(machine_config &config) override;
// electron_cart_interface overrides
- virtual uint8_t read(address_space &space, offs_t offset, int infc, int infd, int romqa) override;
- virtual void write(address_space &space, offs_t offset, uint8_t data, int infc, int infd, int romqa) override;
+ virtual uint8_t read(offs_t offset, int infc, int infd, int romqa, int oe, int oe2) override;
+ virtual void write(offs_t offset, uint8_t data, int infc, int infd, int romqa, int oe, int oe2) override;
private:
- DECLARE_WRITE8_MEMBER(wd1770_control_w);
+ void wd1770_control_w(uint8_t data);
DECLARE_FLOPPY_FORMATS(floppy_formats);
required_device<wd1770_device> m_fdc;
diff --git a/src/devices/bus/electron/cart/ap5.cpp b/src/devices/bus/electron/cart/ap5.cpp
new file mode 100644
index 00000000000..660587c7642
--- /dev/null
+++ b/src/devices/bus/electron/cart/ap5.cpp
@@ -0,0 +1,171 @@
+// license:BSD-3-Clause
+// copyright-holders:Nigel Barnes
+/**********************************************************************
+
+ ACP Advanced Plus 5
+
+**********************************************************************/
+
+
+#include "emu.h"
+#include "ap5.h"
+
+
+//**************************************************************************
+// DEVICE DEFINITIONS
+//**************************************************************************
+
+DEFINE_DEVICE_TYPE(ELECTRON_AP5, electron_ap5_device, "electron_ap5", "P.R.E.S. Advanced Plus 5")
+
+
+//-------------------------------------------------
+// device_add_mconfig - add device configuration
+//-------------------------------------------------
+
+void electron_ap5_device::device_add_mconfig(machine_config &config)
+{
+ /* rom sockets */
+ GENERIC_SOCKET(config, m_romslot[0], generic_plain_slot, "electron_rom", "bin,rom"); // ROM SLOT 14
+ m_romslot[0]->set_device_load(device_image_load_delegate(&electron_ap5_device::device_image_load_rom1_load, this));
+ GENERIC_SOCKET(config, m_romslot[1], generic_plain_slot, "electron_rom", "bin,rom"); // ROM SLOT 15
+ m_romslot[1]->set_device_load(device_image_load_delegate(&electron_ap5_device::device_image_load_rom2_load, this));
+
+ /* via */
+ VIA6522(config, m_via, DERIVED_CLOCK(1, 16));
+ m_via->readpb_handler().set(m_userport, FUNC(bbc_userport_slot_device::pb_r));
+ m_via->writepb_handler().set(m_userport, FUNC(bbc_userport_slot_device::pb_w));
+ m_via->irq_handler().set(DEVICE_SELF_OWNER, FUNC(electron_cartslot_device::irq_w));
+
+ /* user port */
+ BBC_USERPORT_SLOT(config, m_userport, bbc_userport_devices, nullptr);
+ m_userport->cb1_handler().set(m_via, FUNC(via6522_device::write_cb1));
+ m_userport->cb2_handler().set(m_via, FUNC(via6522_device::write_cb2));
+
+ /* 1mhz bus port */
+ BBC_1MHZBUS_SLOT(config, m_1mhzbus, DERIVED_CLOCK(1, 16), bbc_1mhzbus_devices, nullptr);
+ m_1mhzbus->irq_handler().set(DEVICE_SELF_OWNER, FUNC(electron_cartslot_device::irq_w));
+ m_1mhzbus->nmi_handler().set(DEVICE_SELF_OWNER, FUNC(electron_cartslot_device::nmi_w));
+
+ /* tube port */
+ BBC_TUBE_SLOT(config, m_tube, electron_tube_devices, nullptr);
+ m_tube->irq_handler().set(DEVICE_SELF_OWNER, FUNC(electron_cartslot_device::irq_w));
+}
+
+//**************************************************************************
+// LIVE DEVICE
+//**************************************************************************
+
+//-------------------------------------------------
+// electron_ap5_device - constructor
+//-------------------------------------------------
+
+electron_ap5_device::electron_ap5_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+ : device_t(mconfig, ELECTRON_AP5, tag, owner, clock)
+ , device_electron_cart_interface(mconfig, *this)
+ , m_via(*this, "via6522")
+ , m_tube(*this, "tube")
+ , m_1mhzbus(*this, "1mhzbus")
+ , m_userport(*this, "userport")
+ , m_romslot(*this, "rom%u", 1)
+{
+}
+
+//-------------------------------------------------
+// device_start - device-specific startup
+//-------------------------------------------------
+
+void electron_ap5_device::device_start()
+{
+}
+
+//-------------------------------------------------
+// read - cartridge data read
+//-------------------------------------------------
+
+uint8_t electron_ap5_device::read(offs_t offset, int infc, int infd, int romqa, int oe, int oe2)
+{
+ uint8_t data = 0xff;
+
+ if (infc)
+ {
+ data = m_1mhzbus->fred_r(offset);
+
+ switch (offset & 0xf0)
+ {
+ case 0xb0:
+ data &= m_via->read(offset & 0x0f);
+ break;
+
+ case 0xe0:
+ data &= m_tube->host_r(offset & 0x0f);
+ break;
+ }
+ }
+ else if (infd)
+ {
+ data = m_1mhzbus->jim_r(offset);
+ }
+ else if (oe)
+ {
+ data = m_romslot[romqa]->read_rom(offset & 0x3fff);
+ }
+ else if (oe2)
+ {
+ data = m_rom[offset & 0x1fff];
+ }
+
+ return data;
+}
+
+//-------------------------------------------------
+// write - cartridge data write
+//-------------------------------------------------
+
+void electron_ap5_device::write(offs_t offset, uint8_t data, int infc, int infd, int romqa, int oe, int oe2)
+{
+ if (infc)
+ {
+ m_1mhzbus->fred_w(offset, data);
+
+ switch (offset & 0xf0)
+ {
+ case 0xb0:
+ m_via->write(offset & 0x0f, data);
+ break;
+
+ case 0xe0:
+ m_tube->host_w(offset & 0x0f, data);
+ break;
+ }
+ }
+ else if (infd)
+ {
+ m_1mhzbus->jim_w(offset, data);
+ }
+}
+
+
+//**************************************************************************
+// IMPLEMENTATION
+//**************************************************************************
+
+image_init_result electron_ap5_device::load_rom(device_image_interface &image, generic_slot_device *slot)
+{
+ uint32_t size = slot->common_get_size("rom");
+
+ // socket accepts 8K and 16K ROM only
+ if (size != 0x2000 && size != 0x4000)
+ {
+ image.seterror(IMAGE_ERROR_UNSPECIFIED, "Invalid size: Only 8K/16K is supported");
+ return image_init_result::FAIL;
+ }
+
+ slot->rom_alloc(0x4000, GENERIC_ROM8_WIDTH, ENDIANNESS_LITTLE);
+ slot->common_load_rom(slot->get_rom_base(), size, "rom");
+
+ // mirror 8K ROMs
+ uint8_t *crt = slot->get_rom_base();
+ if (size <= 0x2000) memcpy(crt + 0x2000, crt, 0x2000);
+
+ return image_init_result::PASS;
+}
diff --git a/src/devices/bus/electron/cart/ap5.h b/src/devices/bus/electron/cart/ap5.h
new file mode 100644
index 00000000000..846f3fbc649
--- /dev/null
+++ b/src/devices/bus/electron/cart/ap5.h
@@ -0,0 +1,60 @@
+// license:BSD-3-Clause
+// copyright-holders:Nigel Barnes
+/**********************************************************************
+
+ ACP Advanced Plus 5
+
+**********************************************************************/
+
+#ifndef MAME_BUS_ELECTRON_CART_AP5_H
+#define MAME_BUS_ELECTRON_CART_AP5_H
+
+#include "slot.h"
+#include "machine/6522via.h"
+#include "bus/bbc/1mhzbus/1mhzbus.h"
+#include "bus/bbc/tube/tube.h"
+#include "bus/bbc/userport/userport.h"
+#include "bus/generic/slot.h"
+#include "bus/generic/carts.h"
+
+//**************************************************************************
+// TYPE DEFINITIONS
+//**************************************************************************
+
+class electron_ap5_device :
+ public device_t,
+ public device_electron_cart_interface
+{
+public:
+ // construction/destruction
+ electron_ap5_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+
+protected:
+ // device-level overrides
+ virtual void device_start() override;
+
+ // optional information overrides
+ virtual void device_add_mconfig(machine_config &config) override;
+
+ // electron_cart_interface overrides
+ virtual uint8_t read(offs_t offset, int infc, int infd, int romqa, int oe, int oe2) override;
+ virtual void write(offs_t offset, uint8_t data, int infc, int infd, int romqa, int oe, int oe2) override;
+
+private:
+ image_init_result load_rom(device_image_interface &image, generic_slot_device *slot);
+ DECLARE_DEVICE_IMAGE_LOAD_MEMBER(rom1_load) { return load_rom(image, m_romslot[0]); }
+ DECLARE_DEVICE_IMAGE_LOAD_MEMBER(rom2_load) { return load_rom(image, m_romslot[1]); }
+
+ required_device<via6522_device> m_via;
+ required_device<bbc_tube_slot_device> m_tube;
+ required_device<bbc_1mhzbus_slot_device> m_1mhzbus;
+ required_device<bbc_userport_slot_device> m_userport;
+ required_device_array<generic_slot_device, 2> m_romslot;
+};
+
+
+// device type definition
+DECLARE_DEVICE_TYPE(ELECTRON_AP5, electron_ap5_device)
+
+
+#endif // MAME_BUS_ELECTRON_CART_AP5_H
diff --git a/src/devices/bus/electron/cart/aqr.cpp b/src/devices/bus/electron/cart/aqr.cpp
index 8a3edebd194..8be0176efc4 100644
--- a/src/devices/bus/electron/cart/aqr.cpp
+++ b/src/devices/bus/electron/cart/aqr.cpp
@@ -48,16 +48,13 @@ void electron_aqr_device::device_start()
// read - cartridge data read
//-------------------------------------------------
-uint8_t electron_aqr_device::read(address_space &space, offs_t offset, int infc, int infd, int romqa)
+uint8_t electron_aqr_device::read(offs_t offset, int infc, int infd, int romqa, int oe, int oe2)
{
uint8_t data = 0xff;
- if (!infc && !infd)
+ if (oe)
{
- if (offset >= 0x0000 && offset < 0x4000)
- {
- data = m_ram[(offset & 0x3fff) | (m_page_register << 14)];
- }
+ data = m_ram[(offset & 0x3fff) | (m_page_register << 14)];
}
return data;
@@ -67,7 +64,7 @@ uint8_t electron_aqr_device::read(address_space &space, offs_t offset, int infc,
// write - cartridge data write
//-------------------------------------------------
-void electron_aqr_device::write(address_space &space, offs_t offset, uint8_t data, int infc, int infd, int romqa)
+void electron_aqr_device::write(offs_t offset, uint8_t data, int infc, int infd, int romqa, int oe, int oe2)
{
if (infc)
{
@@ -84,12 +81,8 @@ void electron_aqr_device::write(address_space &space, offs_t offset, uint8_t dat
break;
}
}
-
- if (!infc && !infd)
+ else if (oe)
{
- if (offset >= 0x0000 && offset < 0x4000 && !m_lock_register)
- {
- m_ram[(offset & 0x3fff) | (m_page_register << 14)] = data;
- }
+ m_ram[(offset & 0x3fff) | (m_page_register << 14)] = data;
}
}
diff --git a/src/devices/bus/electron/cart/aqr.h b/src/devices/bus/electron/cart/aqr.h
index 6ede0b8144d..820f967b5cf 100644
--- a/src/devices/bus/electron/cart/aqr.h
+++ b/src/devices/bus/electron/cart/aqr.h
@@ -32,8 +32,8 @@ protected:
virtual void device_start() override;
// electron_cart_interface overrides
- virtual uint8_t read(address_space &space, offs_t offset, int infc, int infd, int romqa) override;
- virtual void write(address_space &space, offs_t offset, uint8_t data, int infc, int infd, int romqa) override;
+ virtual uint8_t read(offs_t offset, int infc, int infd, int romqa, int oe, int oe2) override;
+ virtual void write(offs_t offset, uint8_t data, int infc, int infd, int romqa, int oe, int oe2) override;
private:
uint8_t m_page_register;
diff --git a/src/devices/bus/electron/cart/click.cpp b/src/devices/bus/electron/cart/click.cpp
index a4a0bfd5af2..bdeebeba79b 100644
--- a/src/devices/bus/electron/cart/click.cpp
+++ b/src/devices/bus/electron/cart/click.cpp
@@ -27,7 +27,7 @@ void electron_click_device::device_add_mconfig(machine_config &config)
{
/* rtc */
MC146818(config, m_rtc, 32.768_kHz_XTAL);
- m_rtc->irq().set(FUNC(electron_click_device::irq_w));
+ m_rtc->irq().set(DEVICE_SELF_OWNER, FUNC(electron_cartslot_device::irq_w));
}
//-------------------------------------------------
@@ -88,7 +88,7 @@ void electron_click_device::device_reset()
// read - cartridge data read
//-------------------------------------------------
-uint8_t electron_click_device::read(address_space &space, offs_t offset, int infc, int infd, int romqa)
+uint8_t electron_click_device::read(offs_t offset, int infc, int infd, int romqa, int oe, int oe2)
{
uint8_t data = 0xff;
@@ -98,15 +98,14 @@ uint8_t electron_click_device::read(address_space &space, offs_t offset, int inf
{
case 0xf8:
case 0xf9:
- data = m_rtc->read(space, offset & 0x01);
+ data = m_rtc->read(offset & 0x01);
break;
case 0xfc:
data = m_page_register;
break;
}
}
-
- if (!infc && !infd)
+ else if (oe)
{
offs_t rom_page_offset = (m_page_register & 0x03) * 0x2000;
offs_t ram_page_offset = ((m_page_register & 0x0c) >> 2) * 0x2000;
@@ -128,7 +127,7 @@ uint8_t electron_click_device::read(address_space &space, offs_t offset, int inf
// write - cartridge data write
//-------------------------------------------------
-void electron_click_device::write(address_space &space, offs_t offset, uint8_t data, int infc, int infd, int romqa)
+void electron_click_device::write(offs_t offset, uint8_t data, int infc, int infd, int romqa, int oe, int oe2)
{
if (infc)
{
@@ -136,15 +135,14 @@ void electron_click_device::write(address_space &space, offs_t offset, uint8_t d
{
case 0xf8:
case 0xf9:
- m_rtc->write(space, offset & 0x01, data);
+ m_rtc->write(offset & 0x01, data);
break;
case 0xfc:
m_page_register = data;
break;
}
}
-
- if (!infc && !infd)
+ else if (oe)
{
offs_t ram_page_offset = ((m_page_register & 0x0c) >> 2) * 0x2000;
@@ -166,8 +164,3 @@ INPUT_CHANGED_MEMBER(electron_click_device::click_button)
m_slot->irq_w(CLEAR_LINE);
}
}
-
-WRITE_LINE_MEMBER(electron_click_device::irq_w)
-{
- m_slot->irq_w(state);
-}
diff --git a/src/devices/bus/electron/cart/click.h b/src/devices/bus/electron/cart/click.h
index 5fbc18d4759..cb7dd114687 100644
--- a/src/devices/bus/electron/cart/click.h
+++ b/src/devices/bus/electron/cart/click.h
@@ -41,12 +41,10 @@ protected:
virtual void device_reset() override;
// electron_cart_interface overrides
- virtual uint8_t read(address_space &space, offs_t offset, int infc, int infd, int romqa) override;
- virtual void write(address_space &space, offs_t offset, uint8_t data, int infc, int infd, int romqa) override;
+ virtual uint8_t read(offs_t offset, int infc, int infd, int romqa, int oe, int oe2) override;
+ virtual void write(offs_t offset, uint8_t data, int infc, int infd, int romqa, int oe, int oe2) override;
private:
- DECLARE_WRITE_LINE_MEMBER(irq_w);
-
required_device<mc146818_device> m_rtc;
uint8_t m_page_register;
diff --git a/src/devices/bus/electron/cart/cumana.cpp b/src/devices/bus/electron/cart/cumana.cpp
index 80ebeab394b..8792395b503 100644
--- a/src/devices/bus/electron/cart/cumana.cpp
+++ b/src/devices/bus/electron/cart/cumana.cpp
@@ -48,12 +48,13 @@ void cumana_floppies(device_slot_interface &device)
void electron_cumana_device::device_add_mconfig(machine_config &config)
{
/* fdc */
- FD1793(config, m_fdc, 16_MHz_XTAL / 16); // TODO: Not known whether DRQ and INTRQ are connected
+ FD1793(config, m_fdc, DERIVED_CLOCK(1, 16)); // TODO: Not known whether DRQ and INTRQ are connected
FLOPPY_CONNECTOR(config, m_floppy0, cumana_floppies, "525qd", electron_cumana_device::floppy_formats).enable_sound(true);
FLOPPY_CONNECTOR(config, m_floppy1, cumana_floppies, nullptr, electron_cumana_device::floppy_formats).enable_sound(true);
/* rtc */
MC146818(config, m_rtc, 32.768_kHz_XTAL);
+ m_rtc->irq().set(DEVICE_SELF_OWNER, FUNC(electron_cartslot_device::irq_w));
}
//**************************************************************************
@@ -86,7 +87,7 @@ void electron_cumana_device::device_start()
// read - cartridge data read
//-------------------------------------------------
-uint8_t electron_cumana_device::read(address_space &space, offs_t offset, int infc, int infd, int romqa)
+uint8_t electron_cumana_device::read(offs_t offset, int infc, int infd, int romqa, int oe, int oe2)
{
uint8_t data = 0xff;
@@ -102,12 +103,11 @@ uint8_t electron_cumana_device::read(address_space &space, offs_t offset, int in
break;
case 0x98:
case 0x9c:
- data = m_rtc->read(space, BIT(offset, 2));
+ data = m_rtc->read(BIT(offset, 2));
break;
}
}
-
- if (!infc && !infd)
+ else if (oe)
{
switch (romqa)
{
@@ -134,7 +134,7 @@ uint8_t electron_cumana_device::read(address_space &space, offs_t offset, int in
// write - cartridge data write
//-------------------------------------------------
-void electron_cumana_device::write(address_space &space, offs_t offset, uint8_t data, int infc, int infd, int romqa)
+void electron_cumana_device::write(offs_t offset, uint8_t data, int infc, int infd, int romqa, int oe, int oe2)
{
if (infc)
{
@@ -147,17 +147,15 @@ void electron_cumana_device::write(address_space &space, offs_t offset, uint8_t
m_fdc->write(offset & 0x03, data);
break;
case 0x94:
- wd1793_control_w(space, 0, data);
+ wd1793_control_w(data);
break;
case 0x98:
case 0x9c:
- m_rtc->write(space, BIT(offset, 2), data);
- break;
+ m_rtc->write(BIT(offset, 2), data);
break;
}
}
-
- if (!infc && !infd)
+ else if (oe)
{
if (romqa == 0 && offset >= 0x3800)
{
@@ -171,7 +169,7 @@ void electron_cumana_device::write(address_space &space, offs_t offset, uint8_t
// IMPLEMENTATION
//**************************************************************************
-WRITE8_MEMBER(electron_cumana_device::wd1793_control_w)
+void electron_cumana_device::wd1793_control_w(uint8_t data)
{
floppy_image_device *floppy = nullptr;
diff --git a/src/devices/bus/electron/cart/cumana.h b/src/devices/bus/electron/cart/cumana.h
index 9092f82bd65..9a3bc2ab834 100644
--- a/src/devices/bus/electron/cart/cumana.h
+++ b/src/devices/bus/electron/cart/cumana.h
@@ -37,11 +37,11 @@ protected:
virtual void device_add_mconfig(machine_config &config) override;
// electron_cart_interface overrides
- virtual uint8_t read(address_space &space, offs_t offset, int infc, int infd, int romqa) override;
- virtual void write(address_space &space, offs_t offset, uint8_t data, int infc, int infd, int romqa) override;
+ virtual uint8_t read(offs_t offset, int infc, int infd, int romqa, int oe, int oe2) override;
+ virtual void write(offs_t offset, uint8_t data, int infc, int infd, int romqa, int oe, int oe2) override;
private:
- DECLARE_WRITE8_MEMBER(wd1793_control_w);
+ void wd1793_control_w(uint8_t data);
DECLARE_FLOPPY_FORMATS(floppy_formats);
required_device<fd1793_device> m_fdc;
diff --git a/src/devices/bus/electron/cart/mgc.cpp b/src/devices/bus/electron/cart/mgc.cpp
index 41cc29dfbfb..5f80559c47a 100644
--- a/src/devices/bus/electron/cart/mgc.cpp
+++ b/src/devices/bus/electron/cart/mgc.cpp
@@ -65,17 +65,14 @@ void electron_mgc_device::device_reset()
// read - cartridge data read
//-------------------------------------------------
-uint8_t electron_mgc_device::read(address_space &space, offs_t offset, int infc, int infd, int romqa)
+uint8_t electron_mgc_device::read(offs_t offset, int infc, int infd, int romqa, int oe, int oe2)
{
uint8_t data = 0xff;
- if (!infc && !infd)
+ if (oe)
{
- if (offset >= 0x0000 && offset < 0x4000)
- {
- int m_page_mode = BIT(m_control_latch, 2) ? BIT(m_control_latch, 1) : !romqa;
- data = m_nvram[(offset & 0x3fff) | (m_page_latch << 14) | (m_page_mode << 21)];
- }
+ int m_page_mode = BIT(m_control_latch, 2) ? BIT(m_control_latch, 1) : !romqa;
+ data = m_nvram[(offset & 0x3fff) | (m_page_latch << 14) | (m_page_mode << 21)];
}
return data;
@@ -85,7 +82,7 @@ uint8_t electron_mgc_device::read(address_space &space, offs_t offset, int infc,
// write - cartridge data write
//-------------------------------------------------
-void electron_mgc_device::write(address_space &space, offs_t offset, uint8_t data, int infc, int infd, int romqa)
+void electron_mgc_device::write(offs_t offset, uint8_t data, int infc, int infd, int romqa, int oe, int oe2)
{
if (infc)
{
@@ -100,13 +97,9 @@ void electron_mgc_device::write(address_space &space, offs_t offset, uint8_t dat
break;
}
}
-
- if (!infc && !infd)
+ else if (oe)
{
- if (offset >= 0x0000 && offset < 0x4000 && BIT(m_control_latch, 0))
- {
- int m_page_mode = BIT(m_control_latch, 2) ? BIT(m_control_latch, 1) : !romqa;
- m_nvram[(offset & 0x3fff) | (m_page_latch << 14) | (m_page_mode << 21)] = data;
- }
+ int m_page_mode = BIT(m_control_latch, 2) ? BIT(m_control_latch, 1) : !romqa;
+ m_nvram[(offset & 0x3fff) | (m_page_latch << 14) | (m_page_mode << 21)] = data;
}
}
diff --git a/src/devices/bus/electron/cart/mgc.h b/src/devices/bus/electron/cart/mgc.h
index 8835a703107..bf23aa34391 100644
--- a/src/devices/bus/electron/cart/mgc.h
+++ b/src/devices/bus/electron/cart/mgc.h
@@ -33,8 +33,8 @@ protected:
virtual void device_reset() override;
// electron_cart_interface overrides
- virtual uint8_t read(address_space &space, offs_t offset, int infc, int infd, int romqa) override;
- virtual void write(address_space &space, offs_t offset, uint8_t data, int infc, int infd, int romqa) override;
+ virtual uint8_t read(offs_t offset, int infc, int infd, int romqa, int oe, int oe2) override;
+ virtual void write(offs_t offset, uint8_t data, int infc, int infd, int romqa, int oe, int oe2) override;
private:
uint8_t m_page_latch;
diff --git a/src/devices/bus/electron/cart/peg400.cpp b/src/devices/bus/electron/cart/peg400.cpp
index 8d92131aa04..abca703474a 100644
--- a/src/devices/bus/electron/cart/peg400.cpp
+++ b/src/devices/bus/electron/cart/peg400.cpp
@@ -44,7 +44,7 @@ void peg400_floppies(device_slot_interface &device)
void electron_peg400_device::device_add_mconfig(machine_config &config)
{
/* fdc */
- WD1770(config, m_fdc, 16_MHz_XTAL / 2);
+ WD1770(config, m_fdc, DERIVED_CLOCK(1, 2));
m_fdc->drq_wr_callback().set(FUNC(electron_peg400_device::fdc_drq_w));
FLOPPY_CONNECTOR(config, m_floppy0, peg400_floppies, "525qd", electron_peg400_device::floppy_formats).enable_sound(true);
FLOPPY_CONNECTOR(config, m_floppy1, peg400_floppies, nullptr, electron_peg400_device::floppy_formats).enable_sound(true);
@@ -79,7 +79,7 @@ void electron_peg400_device::device_start()
// read - cartridge data read
//-------------------------------------------------
-uint8_t electron_peg400_device::read(address_space &space, offs_t offset, int infc, int infd, int romqa)
+uint8_t electron_peg400_device::read(offs_t offset, int infc, int infd, int romqa, int oe, int oe2)
{
uint8_t data = 0xff;
@@ -95,15 +95,14 @@ uint8_t electron_peg400_device::read(address_space &space, offs_t offset, int in
break;
}
}
-
- if (!infc && !infd)
+ else if (oe)
{
switch (romqa)
{
case 0:
if (offset < 0x3800)
{
- data = m_rom[(offset & 0x3fff) + (romqa * 0x4000)];
+ data = m_rom[(offset & 0x3fff) | (romqa << 14)];
}
else
{
@@ -111,7 +110,7 @@ uint8_t electron_peg400_device::read(address_space &space, offs_t offset, int in
}
break;
case 1:
- data = m_rom[(offset & 0x3fff) + (romqa * 0x4000)];
+ data = m_rom[(offset & 0x3fff) | (romqa << 14)];
break;
}
}
@@ -123,14 +122,14 @@ uint8_t electron_peg400_device::read(address_space &space, offs_t offset, int in
// write - cartridge data write
//-------------------------------------------------
-void electron_peg400_device::write(address_space &space, offs_t offset, uint8_t data, int infc, int infd, int romqa)
+void electron_peg400_device::write(offs_t offset, uint8_t data, int infc, int infd, int romqa, int oe, int oe2)
{
if (infc)
{
switch (offset & 0xff)
{
case 0xc0:
- wd1770_control_w(space, 0, data);
+ wd1770_control_w(data);
break;
case 0xc4:
case 0xc5:
@@ -140,8 +139,7 @@ void electron_peg400_device::write(address_space &space, offs_t offset, uint8_t
break;
}
}
-
- if (!infc && !infd)
+ else if (oe)
{
if (romqa == 0 && offset >= 0x3800)
{
@@ -155,7 +153,7 @@ void electron_peg400_device::write(address_space &space, offs_t offset, uint8_t
// IMPLEMENTATION
//**************************************************************************
-WRITE8_MEMBER(electron_peg400_device::wd1770_control_w)
+void electron_peg400_device::wd1770_control_w(uint8_t data)
{
floppy_image_device *floppy = nullptr;
diff --git a/src/devices/bus/electron/cart/peg400.h b/src/devices/bus/electron/cart/peg400.h
index 8b7a7af9b44..035947a1e59 100644
--- a/src/devices/bus/electron/cart/peg400.h
+++ b/src/devices/bus/electron/cart/peg400.h
@@ -34,11 +34,11 @@ protected:
virtual void device_add_mconfig(machine_config &config) override;
// electron_cart_interface overrides
- virtual uint8_t read(address_space &space, offs_t offset, int infc, int infd, int romqa) override;
- virtual void write(address_space &space, offs_t offset, uint8_t data, int infc, int infd, int romqa) override;
+ virtual uint8_t read(offs_t offset, int infc, int infd, int romqa, int oe, int oe2) override;
+ virtual void write(offs_t offset, uint8_t data, int infc, int infd, int romqa, int oe, int oe2) override;
private:
- DECLARE_WRITE8_MEMBER(wd1770_control_w);
+ void wd1770_control_w(uint8_t data);
DECLARE_FLOPPY_FORMATS(floppy_formats);
DECLARE_WRITE_LINE_MEMBER(fdc_drq_w);
diff --git a/src/devices/bus/electron/cart/romp144.cpp b/src/devices/bus/electron/cart/romp144.cpp
new file mode 100644
index 00000000000..6e4eb96bd84
--- /dev/null
+++ b/src/devices/bus/electron/cart/romp144.cpp
@@ -0,0 +1,162 @@
+// license:BSD-3-Clause
+// copyright-holders:Nigel Barnes
+/**********************************************************************
+
+ JAFA Systems ROMPlus-144
+
+**********************************************************************/
+
+
+#include "emu.h"
+#include "romp144.h"
+
+
+//**************************************************************************
+// DEVICE DEFINITIONS
+//**************************************************************************
+
+DEFINE_DEVICE_TYPE(ELECTRON_ROMP144, electron_romp144_device, "electron_romp144", "JAFA Systems ROMPlus-144")
+
+
+//-------------------------------------------------
+// device_add_mconfig - add device configuration
+//-------------------------------------------------
+
+void electron_romp144_device::device_add_mconfig(machine_config &config)
+{
+ /* rom sockets */
+ GENERIC_SOCKET(config, m_romslot[0], generic_plain_slot, "electron_rom", "bin,rom");
+ m_romslot[0]->set_device_load(device_image_load_delegate(&electron_romp144_device::device_image_load_rom0, this));
+ GENERIC_SOCKET(config, m_romslot[1], generic_plain_slot, "electron_rom", "bin,rom");
+ m_romslot[1]->set_device_load(device_image_load_delegate(&electron_romp144_device::device_image_load_rom1, this));
+ GENERIC_SOCKET(config, m_romslot[2], generic_plain_slot, "electron_rom", "bin,rom");
+ m_romslot[2]->set_device_load(device_image_load_delegate(&electron_romp144_device::device_image_load_rom2, this));
+ GENERIC_SOCKET(config, m_romslot[3], generic_plain_slot, "electron_rom", "bin,rom");
+ m_romslot[3]->set_device_load(device_image_load_delegate(&electron_romp144_device::device_image_load_rom3, this));
+ GENERIC_SOCKET(config, m_romslot[4], generic_plain_slot, "electron_rom", "bin,rom");
+ m_romslot[4]->set_device_load(device_image_load_delegate(&electron_romp144_device::device_image_load_rom4, this));
+ GENERIC_SOCKET(config, m_romslot[5], generic_plain_slot, "electron_rom", "bin,rom");
+ m_romslot[5]->set_device_load(device_image_load_delegate(&electron_romp144_device::device_image_load_rom5, this));
+ GENERIC_SOCKET(config, m_romslot[6], generic_plain_slot, "electron_rom", "bin,rom");
+ m_romslot[6]->set_device_load(device_image_load_delegate(&electron_romp144_device::device_image_load_rom6, this));
+}
+
+//**************************************************************************
+// LIVE DEVICE
+//**************************************************************************
+
+//-------------------------------------------------
+// electron_romp144_device - constructor
+//-------------------------------------------------
+
+electron_romp144_device::electron_romp144_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+ : device_t(mconfig, ELECTRON_ROMP144, tag, owner, clock)
+ , device_electron_cart_interface(mconfig, *this)
+ , m_romslot(*this, "rom%u", 7)
+{
+}
+
+//-------------------------------------------------
+// device_start - device-specific startup
+//-------------------------------------------------
+
+void electron_romp144_device::device_start()
+{
+ m_rom_select = 0xff;
+ m_rom_latch = 0xff;
+
+ save_item(NAME(m_rom_select));
+ save_item(NAME(m_rom_latch));
+}
+
+//-------------------------------------------------
+// read - cartridge data read
+//-------------------------------------------------
+
+uint8_t electron_romp144_device::read(offs_t offset, int infc, int infd, int romqa, int oe, int oe2)
+{
+ uint8_t data = 0xff;
+
+ if (oe)
+ {
+ if (romqa)
+ {
+ if ((m_rom_select & 0x07) == 0x00)
+ data = m_ram[offset & 0x3fff];
+ else
+ data = m_romslot[(m_rom_select & 0x07) - 1]->read_rom(offset & 0x3fff);
+ }
+ else
+ {
+ if ((m_rom_select & 0x0f) == 0x08)
+ data = m_ram[(offset & 0x3fff) | 0x4000];
+ else
+ data = m_rom[offset & 0x1fff];
+
+ /* roms selected with a read to latch */
+ if ((offset & 0x3f00) == 0x3f00)
+ {
+ m_rom_latch = offset & 0x0f;
+ }
+ }
+ }
+
+ return data;
+}
+
+//-------------------------------------------------
+// write - cartridge data write
+//-------------------------------------------------
+
+void electron_romp144_device::write(offs_t offset, uint8_t data, int infc, int infd, int romqa, int oe, int oe2)
+{
+ if (oe)
+ {
+ if (romqa)
+ {
+ if ((m_rom_select & 0x07) == 0x00)
+ m_ram[offset & 0x3fff] = data;
+ }
+ else
+ {
+ if ((m_rom_select & 0x0f) == 0x08)
+ m_ram[(offset & 0x3fff) | 0x4000] = data;
+
+ /* roms selected with a write to select */
+ if ((offset & 0x3f00) == 0x3f00)
+ {
+ /* does the write match the read (upper RAM cannot be de-selected to protect *RSUBSTITUTE) */
+ if (m_rom_latch == (offset & 0x0f) && m_rom_select != 0x08)
+ {
+ m_rom_select = m_rom_latch;
+ }
+ }
+ }
+ }
+}
+
+
+//**************************************************************************
+// IMPLEMENTATION
+//**************************************************************************
+
+image_init_result electron_romp144_device::load_rom(device_image_interface &image, generic_slot_device *slot)
+{
+ uint32_t size = slot->common_get_size("rom");
+
+ // socket accepts 8K and 16K ROM only
+ if (size != 0x2000 && size != 0x4000)
+ {
+ image.seterror(IMAGE_ERROR_UNSPECIFIED, "Invalid size: Only 8K/16K is supported");
+ return image_init_result::FAIL;
+ }
+
+ slot->rom_alloc(0x4000, GENERIC_ROM8_WIDTH, ENDIANNESS_LITTLE);
+ slot->common_load_rom(slot->get_rom_base(), size, "rom");
+
+ // mirror 8K ROMs
+ uint8_t *crt = slot->get_rom_base();
+ if (size <= 0x2000) memcpy(crt + 0x2000, crt, 0x2000);
+
+ return image_init_result::PASS;
+}
diff --git a/src/devices/bus/electron/cart/romp144.h b/src/devices/bus/electron/cart/romp144.h
new file mode 100644
index 00000000000..45916a3ab38
--- /dev/null
+++ b/src/devices/bus/electron/cart/romp144.h
@@ -0,0 +1,60 @@
+// license:BSD-3-Clause
+// copyright-holders:Nigel Barnes
+/**********************************************************************
+
+ JAFA Systems ROMPlus-144
+
+**********************************************************************/
+
+#ifndef MAME_BUS_ELECTRON_CART_ROMP144_H
+#define MAME_BUS_ELECTRON_CART_ROMP144_H
+
+#include "slot.h"
+#include "bus/generic/slot.h"
+#include "bus/generic/carts.h"
+
+//**************************************************************************
+// TYPE DEFINITIONS
+//**************************************************************************
+
+class electron_romp144_device :
+ public device_t,
+ public device_electron_cart_interface
+{
+public:
+ // construction/destruction
+ electron_romp144_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+
+protected:
+ // device-level overrides
+ virtual void device_start() override;
+
+ // optional information overrides
+ virtual void device_add_mconfig(machine_config &config) override;
+
+ // electron_cart_interface overrides
+ virtual uint8_t read(offs_t offset, int infc, int infd, int romqa, int oe, int oe2) override;
+ virtual void write(offs_t offset, uint8_t data, int infc, int infd, int romqa, int oe, int oe2) override;
+
+private:
+ image_init_result load_rom(device_image_interface &image, generic_slot_device *slot);
+ DECLARE_DEVICE_IMAGE_LOAD_MEMBER(rom0) { return load_rom(image, m_romslot[0]); }
+ DECLARE_DEVICE_IMAGE_LOAD_MEMBER(rom1) { return load_rom(image, m_romslot[1]); }
+ DECLARE_DEVICE_IMAGE_LOAD_MEMBER(rom2) { return load_rom(image, m_romslot[2]); }
+ DECLARE_DEVICE_IMAGE_LOAD_MEMBER(rom3) { return load_rom(image, m_romslot[3]); }
+ DECLARE_DEVICE_IMAGE_LOAD_MEMBER(rom4) { return load_rom(image, m_romslot[4]); }
+ DECLARE_DEVICE_IMAGE_LOAD_MEMBER(rom5) { return load_rom(image, m_romslot[5]); }
+ DECLARE_DEVICE_IMAGE_LOAD_MEMBER(rom6) { return load_rom(image, m_romslot[6]); }
+
+ required_device_array<generic_slot_device, 7> m_romslot;
+
+ uint8_t m_rom_select;
+ uint8_t m_rom_latch;
+};
+
+
+// device type definition
+DECLARE_DEVICE_TYPE(ELECTRON_ROMP144, electron_romp144_device)
+
+
+#endif // MAME_BUS_ELECTRON_CART_ROMP144_H
diff --git a/src/devices/bus/electron/cart/slot.cpp b/src/devices/bus/electron/cart/slot.cpp
index aae2f65594d..f8682b9c654 100644
--- a/src/devices/bus/electron/cart/slot.cpp
+++ b/src/devices/bus/electron/cart/slot.cpp
@@ -100,14 +100,6 @@ electron_cartslot_device::electron_cartslot_device(const machine_config &mconfig
}
//-------------------------------------------------
-// electron_cartslot_device - destructor
-//-------------------------------------------------
-
-electron_cartslot_device::~electron_cartslot_device()
-{
-}
-
-//-------------------------------------------------
// device_start - device-specific startup
//-------------------------------------------------
@@ -237,13 +229,13 @@ std::string electron_cartslot_device::get_default_card_software(get_default_card
// read - cartridge read
//-------------------------------------------------
-uint8_t electron_cartslot_device::read(address_space &space, offs_t offset, int infc, int infd, int romqa)
+uint8_t electron_cartslot_device::read(offs_t offset, int infc, int infd, int romqa, int oe, int oe2)
{
uint8_t data = 0xff;
if (m_cart != nullptr)
{
- data = m_cart->read(space, offset, infc, infd, romqa);
+ data = m_cart->read(offset, infc, infd, romqa, oe, oe2);
}
return data;
@@ -253,11 +245,11 @@ uint8_t electron_cartslot_device::read(address_space &space, offs_t offset, int
// write - cartridge write
//-------------------------------------------------
-void electron_cartslot_device::write(address_space &space, offs_t offset, uint8_t data, int infc, int infd, int romqa)
+void electron_cartslot_device::write(offs_t offset, uint8_t data, int infc, int infd, int romqa, int oe, int oe2)
{
if (m_cart != nullptr)
{
- m_cart->write(space, offset, data, infc, infd, romqa);
+ m_cart->write(offset, data, infc, infd, romqa, oe, oe2);
}
}
@@ -268,15 +260,20 @@ void electron_cartslot_device::write(address_space &space, offs_t offset, uint8_
#include "abr.h"
#include "ap34.h"
+#include "ap5.h"
#include "aqr.h"
#include "click.h"
#include "cumana.h"
#include "mgc.h"
#include "peg400.h"
+//#include "pmse2p.h"
+#include "romp144.h"
+//#include "rs423.h"
#include "sndexp.h"
#include "sndexp3.h"
#include "sp64.h"
#include "stlefs.h"
+#include "tube.h"
#include "std.h"
@@ -285,13 +282,18 @@ void electron_cart(device_slot_interface &device)
device.option_add_internal("std", ELECTRON_STDCART);
device.option_add_internal("abr", ELECTRON_ABR);
device.option_add_internal("ap34", ELECTRON_AP34);
+ device.option_add_internal("ap5", ELECTRON_AP5);
device.option_add_internal("aqr", ELECTRON_AQR);
device.option_add_internal("click", ELECTRON_CLICK);
device.option_add_internal("cumana", ELECTRON_CUMANA);
device.option_add_internal("mgc", ELECTRON_MGC);
device.option_add_internal("peg400", ELECTRON_PEG400);
+ //device.option_add_internal("pmse2p", ELECTRON_PMSE2P);
+ device.option_add_internal("romp144", ELECTRON_ROMP144);
+ //device.option_add_internal("rs423", ELECTRON_RS423);
device.option_add_internal("sndexp", ELECTRON_SNDEXP);
device.option_add_internal("sndexp3", ELECTRON_SNDEXP3);
device.option_add_internal("sp64", ELECTRON_SP64);
device.option_add_internal("stlefs", ELECTRON_STLEFS);
+ device.option_add_internal("tube", ELECTRON_TUBE);
}
diff --git a/src/devices/bus/electron/cart/slot.h b/src/devices/bus/electron/cart/slot.h
index 9e4b66182f1..d31bc16258c 100644
--- a/src/devices/bus/electron/cart/slot.h
+++ b/src/devices/bus/electron/cart/slot.h
@@ -105,16 +105,6 @@
#define ELECTRON_CART_ROM_REGION_TAG ":cart:rom"
-#define MCFG_ELECTRON_CARTSLOT_ADD(_tag, _slot_intf, _def_slot) \
- MCFG_DEVICE_ADD(_tag, ELECTRON_CARTSLOT, 0) \
- MCFG_DEVICE_SLOT_INTERFACE(_slot_intf, _def_slot, false)
-
-#define MCFG_ELECTRON_CARTSLOT_IRQ_HANDLER(_devcb) \
- downcast<electron_cartslot_device &>(*device).set_irq_handler(DEVCB_##_devcb);
-
-#define MCFG_ELECTRON_CARTSLOT_NMI_HANDLER(_devcb) \
- downcast<electron_cartslot_device &>(*device).set_nmi_handler(DEVCB_##_devcb);
-
//**************************************************************************
// TYPE DEFINITIONS
@@ -130,12 +120,21 @@ class electron_cartslot_device : public device_t,
{
public:
// construction/destruction
+ template <typename T>
+ electron_cartslot_device(machine_config const &mconfig, char const *tag, device_t *owner, uint32_t clock, T &&slot_options, const char *default_option)
+ : electron_cartslot_device(mconfig, tag, owner, clock)
+ {
+ option_reset();
+ slot_options(*this);
+ set_default_option(default_option);
+ set_fixed(false);
+ }
+
electron_cartslot_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- virtual ~electron_cartslot_device();
// callbacks
- template <class Object> devcb_base &set_irq_handler(Object &&cb) { return m_irq_handler.set_callback(std::forward<Object>(cb)); }
- template <class Object> devcb_base &set_nmi_handler(Object &&cb) { return m_nmi_handler.set_callback(std::forward<Object>(cb)); }
+ auto irq_handler() { return m_irq_handler.bind(); }
+ auto nmi_handler() { return m_nmi_handler.bind(); }
// device-level overrides
virtual void device_start() override;
@@ -159,8 +158,8 @@ public:
virtual std::string get_default_card_software(get_default_card_software_hook &hook) const override;
// reading and writing
- virtual uint8_t read(address_space &space, offs_t offset, int infc, int infd, int romqa);
- virtual void write(address_space &space, offs_t offset, uint8_t data, int infc, int infd, int romqa);
+ virtual uint8_t read(offs_t offset, int infc, int infd, int romqa, int oe, int oe2);
+ virtual void write(offs_t offset, uint8_t data, int infc, int infd, int romqa, int oe, int oe2);
DECLARE_WRITE_LINE_MEMBER(irq_w) { m_irq_handler(state); }
DECLARE_WRITE_LINE_MEMBER(nmi_w) { m_nmi_handler(state); }
@@ -183,8 +182,8 @@ public:
virtual ~device_electron_cart_interface();
// reading and writing
- virtual uint8_t read(address_space &space, offs_t offset, int infc, int infd, int romqa) { return 0xff; }
- virtual void write(address_space &space, offs_t offset, uint8_t data, int infc, int infd, int romqa) { }
+ virtual uint8_t read(offs_t offset, int infc, int infd, int romqa, int oe, int oe2) { return 0xff; }
+ virtual void write(offs_t offset, uint8_t data, int infc, int infd, int romqa, int oe, int oe2) { }
void rom_alloc(uint32_t size, const char *tag);
void ram_alloc(uint32_t size);
diff --git a/src/devices/bus/electron/cart/sndexp.cpp b/src/devices/bus/electron/cart/sndexp.cpp
index de0c7704020..4ba27cb4825 100644
--- a/src/devices/bus/electron/cart/sndexp.cpp
+++ b/src/devices/bus/electron/cart/sndexp.cpp
@@ -27,11 +27,13 @@ DEFINE_DEVICE_TYPE(ELECTRON_SNDEXP, electron_sndexp_device, "electron_sndexp", "
// device_add_mconfig - add device configuration
//-------------------------------------------------
-MACHINE_CONFIG_START(electron_sndexp_device::device_add_mconfig)
+void electron_sndexp_device::device_add_mconfig(machine_config &config)
+{
+ /* sound hardware */
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("sn76489", SN76489, 16_MHz_XTAL / 4)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
-MACHINE_CONFIG_END
+ SN76489(config, m_sn, DERIVED_CLOCK(1, 4));
+ m_sn->add_route(ALL_OUTPUTS, "mono", 1.0);
+}
//-------------------------------------------------
// INPUT_PORTS( sndexp )
@@ -87,11 +89,11 @@ void electron_sndexp_device::device_start()
// read - cartridge data read
//-------------------------------------------------
-uint8_t electron_sndexp_device::read(address_space &space, offs_t offset, int infc, int infd, int romqa)
+uint8_t electron_sndexp_device::read(offs_t offset, int infc, int infd, int romqa, int oe, int oe2)
{
uint8_t data = 0xff;
- if (!infc && !infd)
+ if (oe)
{
if (m_jumper->read())
{
@@ -124,7 +126,7 @@ uint8_t electron_sndexp_device::read(address_space &space, offs_t offset, int in
// write - cartridge data write
//-------------------------------------------------
-void electron_sndexp_device::write(address_space &space, offs_t offset, uint8_t data, int infc, int infd, int romqa)
+void electron_sndexp_device::write(offs_t offset, uint8_t data, int infc, int infd, int romqa, int oe, int oe2)
{
if (infc)
{
@@ -142,8 +144,7 @@ void electron_sndexp_device::write(address_space &space, offs_t offset, uint8_t
break;
}
}
-
- if (!infc && !infd)
+ else if (oe)
{
if (m_jumper->read())
{
diff --git a/src/devices/bus/electron/cart/sndexp.h b/src/devices/bus/electron/cart/sndexp.h
index 87d94ba84a2..5627c2ff734 100644
--- a/src/devices/bus/electron/cart/sndexp.h
+++ b/src/devices/bus/electron/cart/sndexp.h
@@ -33,8 +33,8 @@ protected:
virtual ioport_constructor device_input_ports() const override;
// electron_cart_interface overrides
- virtual uint8_t read(address_space &space, offs_t offset, int infc, int infd, int romqa) override;
- virtual void write(address_space &space, offs_t offset, uint8_t data, int infc, int infd, int romqa) override;
+ virtual uint8_t read(offs_t offset, int infc, int infd, int romqa, int oe, int oe2) override;
+ virtual void write(offs_t offset, uint8_t data, int infc, int infd, int romqa, int oe, int oe2) override;
private:
required_device<sn76489_device> m_sn;
diff --git a/src/devices/bus/electron/cart/sndexp3.cpp b/src/devices/bus/electron/cart/sndexp3.cpp
index 1bf32aa2fb4..afaf927e443 100644
--- a/src/devices/bus/electron/cart/sndexp3.cpp
+++ b/src/devices/bus/electron/cart/sndexp3.cpp
@@ -23,12 +23,13 @@ DEFINE_DEVICE_TYPE(ELECTRON_SNDEXP3, electron_sndexp3_device, "electron_sndexp3"
// device_add_mconfig - add device configuration
//-------------------------------------------------
-MACHINE_CONFIG_START(electron_sndexp3_device::device_add_mconfig)
+void electron_sndexp3_device::device_add_mconfig(machine_config &config)
+{
/* sound hardware */
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("sn76489", SN76489, 16_MHz_XTAL / 4)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
-MACHINE_CONFIG_END
+ SN76489(config, m_sn, DERIVED_CLOCK(1, 4));
+ m_sn->add_route(ALL_OUTPUTS, "mono", 1.0);
+}
//**************************************************************************
// LIVE DEVICE
@@ -61,11 +62,11 @@ void electron_sndexp3_device::device_start()
// read - cartridge data read
//-------------------------------------------------
-uint8_t electron_sndexp3_device::read(address_space &space, offs_t offset, int infc, int infd, int romqa)
+uint8_t electron_sndexp3_device::read(offs_t offset, int infc, int infd, int romqa, int oe, int oe2)
{
uint8_t data = 0xff;
- if (!infc && !infd && romqa)
+ if (oe && romqa)
{
if (offset < 0x2000)
{
@@ -84,7 +85,7 @@ uint8_t electron_sndexp3_device::read(address_space &space, offs_t offset, int i
// write - cartridge data write
//-------------------------------------------------
-void electron_sndexp3_device::write(address_space &space, offs_t offset, uint8_t data, int infc, int infd, int romqa)
+void electron_sndexp3_device::write(offs_t offset, uint8_t data, int infc, int infd, int romqa, int oe, int oe2)
{
if (infc)
{
@@ -102,8 +103,7 @@ void electron_sndexp3_device::write(address_space &space, offs_t offset, uint8_t
break;
}
}
-
- if (!infc && !infd && romqa)
+ else if (oe && romqa)
{
if (offset >= 0x2000)
{
diff --git a/src/devices/bus/electron/cart/sndexp3.h b/src/devices/bus/electron/cart/sndexp3.h
index 2ad0869ca65..95d437b63e2 100644
--- a/src/devices/bus/electron/cart/sndexp3.h
+++ b/src/devices/bus/electron/cart/sndexp3.h
@@ -32,8 +32,8 @@ protected:
virtual void device_add_mconfig(machine_config &config) override;
// electron_cart_interface overrides
- virtual uint8_t read(address_space &space, offs_t offset, int infc, int infd, int romqa) override;
- virtual void write(address_space &space, offs_t offset, uint8_t data, int infc, int infd, int romqa) override;
+ virtual uint8_t read(offs_t offset, int infc, int infd, int romqa, int oe, int oe2) override;
+ virtual void write(offs_t offset, uint8_t data, int infc, int infd, int romqa, int oe, int oe2) override;
private:
required_device<sn76489_device> m_sn;
diff --git a/src/devices/bus/electron/cart/sp64.cpp b/src/devices/bus/electron/cart/sp64.cpp
index 11db24fbba6..9b5d497999e 100644
--- a/src/devices/bus/electron/cart/sp64.cpp
+++ b/src/devices/bus/electron/cart/sp64.cpp
@@ -55,7 +55,7 @@ void electron_sp64_device::device_reset()
// read - cartridge data read
//-------------------------------------------------
-uint8_t electron_sp64_device::read(address_space &space, offs_t offset, int infc, int infd, int romqa)
+uint8_t electron_sp64_device::read(offs_t offset, int infc, int infd, int romqa, int oe, int oe2)
{
uint8_t data = 0xff;
@@ -68,15 +68,14 @@ uint8_t electron_sp64_device::read(address_space &space, offs_t offset, int infc
break;
}
}
-
- if (!infc && !infd)
+ else if (oe)
{
- offs_t rom_page_offset = m_page_register * 0x4000;
+ offs_t rom_page_offset = m_page_register << 14;
switch (romqa)
{
case 0:
- data = m_rom[rom_page_offset + (offset & 0x3fff)];
+ data = m_rom[rom_page_offset | (offset & 0x3fff)];
break;
case 1:
data = m_ram[offset & 0x1fff];
@@ -91,7 +90,7 @@ uint8_t electron_sp64_device::read(address_space &space, offs_t offset, int infc
// write - cartridge data write
//-------------------------------------------------
-void electron_sp64_device::write(address_space &space, offs_t offset, uint8_t data, int infc, int infd, int romqa)
+void electron_sp64_device::write(offs_t offset, uint8_t data, int infc, int infd, int romqa, int oe, int oe2)
{
if (infc)
{
@@ -102,8 +101,7 @@ void electron_sp64_device::write(address_space &space, offs_t offset, uint8_t da
break;
}
}
-
- if (!infc && !infd)
+ else if (oe)
{
if (romqa == 1)
{
diff --git a/src/devices/bus/electron/cart/sp64.h b/src/devices/bus/electron/cart/sp64.h
index 7e5de9f18f6..68954fc9d30 100644
--- a/src/devices/bus/electron/cart/sp64.h
+++ b/src/devices/bus/electron/cart/sp64.h
@@ -33,8 +33,8 @@ protected:
virtual void device_reset() override;
// electron_cart_interface overrides
- virtual uint8_t read(address_space &space, offs_t offset, int infc, int infd, int romqa) override;
- virtual void write(address_space &space, offs_t offset, uint8_t data, int infc, int infd, int romqa) override;
+ virtual uint8_t read(offs_t offset, int infc, int infd, int romqa, int oe, int oe2) override;
+ virtual void write(offs_t offset, uint8_t data, int infc, int infd, int romqa, int oe, int oe2) override;
private:
uint8_t m_page_register;
diff --git a/src/devices/bus/electron/cart/std.cpp b/src/devices/bus/electron/cart/std.cpp
index b66e3b2ce0d..f2b7333f347 100644
--- a/src/devices/bus/electron/cart/std.cpp
+++ b/src/devices/bus/electron/cart/std.cpp
@@ -43,13 +43,13 @@ void electron_stdcart_device::device_start()
// read - cartridge data read
//-------------------------------------------------
-uint8_t electron_stdcart_device::read(address_space &space, offs_t offset, int infc, int infd, int romqa)
+uint8_t electron_stdcart_device::read(offs_t offset, int infc, int infd, int romqa, int oe, int oe2)
{
uint8_t data = 0xff;
- if (!infc && !infd)
+ if (oe)
{
- data = m_rom[(offset & 0x3fff) + (romqa * 0x4000)];
+ data = m_rom[(offset & 0x3fff) | (romqa << 14)];
}
return data;
diff --git a/src/devices/bus/electron/cart/std.h b/src/devices/bus/electron/cart/std.h
index e81e5684ee2..3fc9cefbcd9 100644
--- a/src/devices/bus/electron/cart/std.h
+++ b/src/devices/bus/electron/cart/std.h
@@ -31,7 +31,7 @@ protected:
virtual void device_start() override;
// electron_cart_interface overrides
- virtual uint8_t read(address_space &space, offs_t offset, int infc, int infd, int romqa) override;
+ virtual uint8_t read(offs_t offset, int infc, int infd, int romqa, int oe, int oe2) override;
};
// device type definition
diff --git a/src/devices/bus/electron/cart/stlefs.cpp b/src/devices/bus/electron/cart/stlefs.cpp
index 83dbf998f2a..47566871a9d 100644
--- a/src/devices/bus/electron/cart/stlefs.cpp
+++ b/src/devices/bus/electron/cart/stlefs.cpp
@@ -47,9 +47,9 @@ void stlefs_floppies(device_slot_interface &device)
void electron_stlefs_device::device_add_mconfig(machine_config &config)
{
/* fdc */
- WD1770(config, m_fdc, 16_MHz_XTAL / 2);
- m_fdc->intrq_wr_callback().set(FUNC(electron_stlefs_device::fdc_intrq_w));
- m_fdc->drq_wr_callback().set(FUNC(electron_stlefs_device::fdc_drq_w));
+ WD1770(config, m_fdc, DERIVED_CLOCK(1, 2));
+ m_fdc->intrq_wr_callback().set(DEVICE_SELF_OWNER, FUNC(electron_cartslot_device::irq_w));
+ m_fdc->drq_wr_callback().set(DEVICE_SELF_OWNER, FUNC(electron_cartslot_device::nmi_w));
FLOPPY_CONNECTOR(config, m_floppy0, stlefs_floppies, "525qd", electron_stlefs_device::floppy_formats).enable_sound(true);
FLOPPY_CONNECTOR(config, m_floppy1, stlefs_floppies, nullptr, electron_stlefs_device::floppy_formats).enable_sound(true);
}
@@ -83,7 +83,7 @@ void electron_stlefs_device::device_start()
// read - cartridge data read
//-------------------------------------------------
-uint8_t electron_stlefs_device::read(address_space &space, offs_t offset, int infc, int infd, int romqa)
+uint8_t electron_stlefs_device::read(offs_t offset, int infc, int infd, int romqa, int oe, int oe2)
{
uint8_t data = 0xff;
@@ -99,13 +99,9 @@ uint8_t electron_stlefs_device::read(address_space &space, offs_t offset, int in
break;
}
}
-
- if (!infc && !infd)
+ else if (oe)
{
- if (offset >= 0x0000 && offset < 0x4000)
- {
- data = m_rom[(offset & 0x3fff) + (romqa * 0x4000)];
- }
+ data = m_rom[(offset & 0x3fff) | (romqa << 14)];
}
return data;
@@ -115,14 +111,14 @@ uint8_t electron_stlefs_device::read(address_space &space, offs_t offset, int in
// write - cartridge data write
//-------------------------------------------------
-void electron_stlefs_device::write(address_space &space, offs_t offset, uint8_t data, int infc, int infd, int romqa)
+void electron_stlefs_device::write(offs_t offset, uint8_t data, int infc, int infd, int romqa, int oe, int oe2)
{
if (infc)
{
switch (offset & 0xff)
{
case 0xc0:
- wd1770_control_w(space, 0, data);
+ wd1770_control_w(data);
break;
case 0xc4:
case 0xc5:
@@ -141,7 +137,7 @@ void electron_stlefs_device::write(address_space &space, offs_t offset, uint8_t
// IMPLEMENTATION
//**************************************************************************
-WRITE8_MEMBER(electron_stlefs_device::wd1770_control_w)
+void electron_stlefs_device::wd1770_control_w(uint8_t data)
{
floppy_image_device *floppy = nullptr;
@@ -160,13 +156,3 @@ WRITE8_MEMBER(electron_stlefs_device::wd1770_control_w)
// bit 5: reset
if (!BIT(data, 5)) m_fdc->soft_reset();
}
-
-void electron_stlefs_device::fdc_intrq_w(int state)
-{
- m_slot->irq_w(state);
-}
-
-void electron_stlefs_device::fdc_drq_w(int state)
-{
- m_slot->nmi_w(state);
-}
diff --git a/src/devices/bus/electron/cart/stlefs.h b/src/devices/bus/electron/cart/stlefs.h
index 2123261907a..421850943e2 100644
--- a/src/devices/bus/electron/cart/stlefs.h
+++ b/src/devices/bus/electron/cart/stlefs.h
@@ -36,13 +36,11 @@ protected:
virtual void device_add_mconfig(machine_config &config) override;
// electron_cart_interface overrides
- virtual uint8_t read(address_space &space, offs_t offset, int infc, int infd, int romqa) override;
- virtual void write(address_space &space, offs_t offset, uint8_t data, int infc, int infd, int romqa) override;
+ virtual uint8_t read(offs_t offset, int infc, int infd, int romqa, int oe, int oe2) override;
+ virtual void write(offs_t offset, uint8_t data, int infc, int infd, int romqa, int oe, int oe2) override;
private:
- DECLARE_WRITE8_MEMBER(wd1770_control_w);
- DECLARE_WRITE_LINE_MEMBER(fdc_intrq_w);
- DECLARE_WRITE_LINE_MEMBER(fdc_drq_w);
+ void wd1770_control_w(uint8_t data);
DECLARE_FLOPPY_FORMATS(floppy_formats);
required_device<wd1770_device> m_fdc;
diff --git a/src/devices/bus/electron/cart/tube.cpp b/src/devices/bus/electron/cart/tube.cpp
new file mode 100644
index 00000000000..02dcd00275d
--- /dev/null
+++ b/src/devices/bus/electron/cart/tube.cpp
@@ -0,0 +1,91 @@
+// license:BSD-3-Clause
+// copyright-holders:Nigel Barnes
+/**********************************************************************
+
+ Acorn Electron Tube Interface
+
+**********************************************************************/
+
+
+#include "emu.h"
+#include "tube.h"
+
+
+//**************************************************************************
+// DEVICE DEFINITIONS
+//**************************************************************************
+
+DEFINE_DEVICE_TYPE(ELECTRON_TUBE, electron_tube_device, "electron_tube", "Acorn Electron Tube Interface")
+
+
+//-------------------------------------------------
+// device_add_mconfig - add device configuration
+//-------------------------------------------------
+
+void electron_tube_device::device_add_mconfig(machine_config &config)
+{
+ /* tube port */
+ BBC_TUBE_SLOT(config, m_tube, electron_tube_devices, nullptr);
+ m_tube->irq_handler().set(DEVICE_SELF_OWNER, FUNC(electron_cartslot_device::irq_w));
+}
+
+//**************************************************************************
+// LIVE DEVICE
+//**************************************************************************
+
+//-------------------------------------------------
+// electron_tube_device - constructor
+//-------------------------------------------------
+
+electron_tube_device::electron_tube_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+ : device_t(mconfig, ELECTRON_TUBE, tag, owner, clock)
+ , device_electron_cart_interface(mconfig, *this)
+ , m_tube(*this, "tube")
+{
+}
+
+//-------------------------------------------------
+// device_start - device-specific startup
+//-------------------------------------------------
+
+void electron_tube_device::device_start()
+{
+}
+
+//-------------------------------------------------
+// read - cartridge data read
+//-------------------------------------------------
+
+uint8_t electron_tube_device::read(offs_t offset, int infc, int infd, int romqa, int oe, int oe2)
+{
+ uint8_t data = 0xff;
+
+ if (infc)
+ {
+ if (offset >= 0xe0 && offset < 0xf0)
+ {
+ data = m_tube->host_r(offset & 0x0f);
+ }
+ }
+ else if (oe2)
+ {
+ data = m_rom[offset & 0x1fff];
+ }
+
+ return data;
+}
+
+//-------------------------------------------------
+// write - cartridge data write
+//-------------------------------------------------
+
+void electron_tube_device::write(offs_t offset, uint8_t data, int infc, int infd, int romqa, int oe, int oe2)
+{
+ if (infc)
+ {
+ if (offset >= 0xe0 && offset < 0xf0)
+ {
+ m_tube->host_w(offset & 0x0f, data);
+ }
+ }
+}
diff --git a/src/devices/bus/electron/cart/tube.h b/src/devices/bus/electron/cart/tube.h
new file mode 100644
index 00000000000..1d239ef5215
--- /dev/null
+++ b/src/devices/bus/electron/cart/tube.h
@@ -0,0 +1,47 @@
+// license:BSD-3-Clause
+// copyright-holders:Nigel Barnes
+/**********************************************************************
+
+ Acorn Electron Tube Interface
+
+**********************************************************************/
+
+#ifndef MAME_BUS_ELECTRON_CART_TUBE_H
+#define MAME_BUS_ELECTRON_CART_TUBE_H
+
+#include "slot.h"
+#include "bus/bbc/tube/tube.h"
+
+//**************************************************************************
+// TYPE DEFINITIONS
+//**************************************************************************
+
+class electron_tube_device :
+ public device_t,
+ public device_electron_cart_interface
+{
+public:
+ // construction/destruction
+ electron_tube_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+
+protected:
+ // device-level overrides
+ virtual void device_start() override;
+
+ // optional information overrides
+ virtual void device_add_mconfig(machine_config &config) override;
+
+ // electron_cart_interface overrides
+ virtual uint8_t read(offs_t offset, int infc, int infd, int romqa, int oe, int oe2) override;
+ virtual void write(offs_t offset, uint8_t data, int infc, int infd, int romqa, int oe, int oe2) override;
+
+private:
+ required_device<bbc_tube_slot_device> m_tube;
+};
+
+
+// device type definition
+DECLARE_DEVICE_TYPE(ELECTRON_TUBE, electron_tube_device)
+
+
+#endif // MAME_BUS_ELECTRON_CART_TUBE_H
diff --git a/src/devices/bus/electron/exp.cpp b/src/devices/bus/electron/exp.cpp
index 9d78af460a9..d2cd0abc824 100644
--- a/src/devices/bus/electron/exp.cpp
+++ b/src/devices/bus/electron/exp.cpp
@@ -32,15 +32,6 @@ device_electron_expansion_interface::device_electron_expansion_interface(const m
}
-//-------------------------------------------------
-// ~device_electron_expansion_interface - destructor
-//-------------------------------------------------
-
-device_electron_expansion_interface::~device_electron_expansion_interface()
-{
-}
-
-
//**************************************************************************
// LIVE DEVICE
//**************************************************************************
@@ -60,15 +51,6 @@ electron_expansion_slot_device::electron_expansion_slot_device(const machine_con
//-------------------------------------------------
-// expansion_slot_device - destructor
-//-------------------------------------------------
-
-electron_expansion_slot_device::~electron_expansion_slot_device()
-{
-}
-
-
-//-------------------------------------------------
// device_start - device-specific startup
//-------------------------------------------------
@@ -93,11 +75,13 @@ void electron_expansion_slot_device::device_reset()
// expbus_r - expansion data read
//-------------------------------------------------
-uint8_t electron_expansion_slot_device::expbus_r(address_space &space, offs_t offset, uint8_t data)
+uint8_t electron_expansion_slot_device::expbus_r(offs_t offset)
{
+ uint8_t data = 0xff;
+
if (m_card != nullptr)
{
- data = m_card->expbus_r(space, offset, data);
+ data = m_card->expbus_r(offset);
}
return data;
@@ -107,11 +91,11 @@ uint8_t electron_expansion_slot_device::expbus_r(address_space &space, offs_t of
// expbus_w - expansion data write
//-------------------------------------------------
-void electron_expansion_slot_device::expbus_w(address_space &space, offs_t offset, uint8_t data)
+void electron_expansion_slot_device::expbus_w(offs_t offset, uint8_t data)
{
if (m_card != nullptr)
{
- m_card->expbus_w(space, offset, data);
+ m_card->expbus_w(offset, data);
}
}
@@ -126,6 +110,7 @@ void electron_expansion_slot_device::expbus_w(address_space &space, offs_t offse
//#include "fbprint.h"
//#include "jafamode7.h"
#include "plus1.h"
+#include "plus2.h"
#include "plus3.h"
#include "pwrjoy.h"
#include "rombox.h"
@@ -140,6 +125,7 @@ void electron_expansion_devices(device_slot_interface &device)
//device.option_add("fbprint", ELECTRON_FBPRINT);
//device.option_add("jafamode7", ELECTRON_JAFAMODE7);
device.option_add("plus1", ELECTRON_PLUS1);
+ device.option_add("plus2", ELECTRON_PLUS2);
device.option_add("plus3", ELECTRON_PLUS3);
device.option_add("pwrjoy", ELECTRON_PWRJOY);
device.option_add("rombox", ELECTRON_ROMBOX);
diff --git a/src/devices/bus/electron/exp.h b/src/devices/bus/electron/exp.h
index ddac72c4d2b..a3bfc045b3a 100644
--- a/src/devices/bus/electron/exp.h
+++ b/src/devices/bus/electron/exp.h
@@ -91,33 +91,6 @@ AC RETURNS (pins 3,4) - adaptor. A total of 6W may be drawn from these lines as
//**************************************************************************
-// CONSTANTS
-//**************************************************************************
-
-#define ELECTRON_EXPANSION_SLOT_TAG "exp"
-
-
-//**************************************************************************
-// INTERFACE CONFIGURATION MACROS
-//**************************************************************************
-
-#define MCFG_ELECTRON_EXPANSION_SLOT_ADD(_tag, _slot_intf, _def_slot, _fixed) \
- MCFG_DEVICE_ADD(_tag, ELECTRON_EXPANSION_SLOT, 0) \
- MCFG_DEVICE_SLOT_INTERFACE(_slot_intf, _def_slot, _fixed)
-
-#define MCFG_ELECTRON_PASSTHRU_EXPANSION_SLOT_ADD(_def_slot) \
- MCFG_ELECTRON_EXPANSION_SLOT_ADD(ELECTRON_EXPANSION_SLOT_TAG, electron_expansion_devices, _def_slot, false) \
- MCFG_ELECTRON_EXPANSION_SLOT_IRQ_HANDLER(WRITELINE(DEVICE_SELF_OWNER, electron_expansion_slot_device, irq_w)) \
- MCFG_ELECTRON_EXPANSION_SLOT_NMI_HANDLER(WRITELINE(DEVICE_SELF_OWNER, electron_expansion_slot_device, nmi_w))
-
-#define MCFG_ELECTRON_EXPANSION_SLOT_IRQ_HANDLER(_devcb) \
- downcast<electron_expansion_slot_device &>(*device).set_irq_handler(DEVCB_##_devcb);
-
-#define MCFG_ELECTRON_EXPANSION_SLOT_NMI_HANDLER(_devcb) \
- downcast<electron_expansion_slot_device &>(*device).set_nmi_handler(DEVCB_##_devcb);
-
-
-//**************************************************************************
// TYPE DEFINITIONS
//**************************************************************************
@@ -129,15 +102,23 @@ class electron_expansion_slot_device : public device_t, public device_slot_inter
{
public:
// construction/destruction
+ template <typename T>
+ electron_expansion_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock, T &&opts, const char *dflt)
+ : electron_expansion_slot_device(mconfig, tag, owner, clock)
+ {
+ option_reset();
+ opts(*this);
+ set_default_option(dflt);
+ set_fixed(false);
+ }
electron_expansion_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- virtual ~electron_expansion_slot_device();
// callbacks
- template <class Object> devcb_base &set_irq_handler(Object &&cb) { return m_irq_handler.set_callback(std::forward<Object>(cb)); }
- template <class Object> devcb_base &set_nmi_handler(Object &&cb) { return m_nmi_handler.set_callback(std::forward<Object>(cb)); }
+ auto irq_handler() { return m_irq_handler.bind(); }
+ auto nmi_handler() { return m_nmi_handler.bind(); }
- uint8_t expbus_r(address_space &space, offs_t offset, uint8_t data);
- void expbus_w(address_space &space, offs_t offset, uint8_t data);
+ uint8_t expbus_r(offs_t offset);
+ void expbus_w(offs_t offset, uint8_t data);
DECLARE_WRITE_LINE_MEMBER( irq_w ) { m_irq_handler(state); }
DECLARE_WRITE_LINE_MEMBER( nmi_w ) { m_nmi_handler(state); }
@@ -160,11 +141,8 @@ private:
class device_electron_expansion_interface : public device_slot_card_interface
{
public:
- // construction/destruction
- virtual ~device_electron_expansion_interface();
-
- virtual uint8_t expbus_r(address_space &space, offs_t offset, uint8_t data) { return data; }
- virtual void expbus_w(address_space &space, offs_t offset, uint8_t data) { }
+ virtual uint8_t expbus_r(offs_t offset) { return 0xff; }
+ virtual void expbus_w(offs_t offset, uint8_t data) { }
protected:
device_electron_expansion_interface(const machine_config &mconfig, device_t &device);
diff --git a/src/devices/bus/electron/fbjoy.cpp b/src/devices/bus/electron/fbjoy.cpp
index 6c4939edbf5..e5a4042cfeb 100644
--- a/src/devices/bus/electron/fbjoy.cpp
+++ b/src/devices/bus/electron/fbjoy.cpp
@@ -67,8 +67,10 @@ void electron_fbjoy_device::device_start()
// expbus_r - expansion data read
//-------------------------------------------------
-uint8_t electron_fbjoy_device::expbus_r(address_space &space, offs_t offset, uint8_t data)
+uint8_t electron_fbjoy_device::expbus_r(offs_t offset)
{
+ uint8_t data = 0xff;
+
if (offset == 0xfcc0)
{
data = m_joy->read() | 0xe0;
diff --git a/src/devices/bus/electron/fbjoy.h b/src/devices/bus/electron/fbjoy.h
index b45c242d907..d9faaa6cd15 100644
--- a/src/devices/bus/electron/fbjoy.h
+++ b/src/devices/bus/electron/fbjoy.h
@@ -33,7 +33,7 @@ public:
// optional information overrides
virtual ioport_constructor device_input_ports() const override;
- virtual uint8_t expbus_r(address_space &space, offs_t offset, uint8_t data) override;
+ virtual uint8_t expbus_r(offs_t offset) override;
protected:
// device-level overrides
diff --git a/src/devices/bus/electron/m2105.cpp b/src/devices/bus/electron/m2105.cpp
index abc652d6fdf..a5edb8e3232 100644
--- a/src/devices/bus/electron/m2105.cpp
+++ b/src/devices/bus/electron/m2105.cpp
@@ -59,27 +59,27 @@ void electron_m2105_device::device_add_mconfig(machine_config &config)
/* sound hardware */
SPEAKER(config, "mono").front_center();
- INPUT_MERGER_ANY_HIGH(config, m_irqs);
- m_irqs->output_handler().set(FUNC(electron_m2105_device::intrq_w));
+ INPUT_MERGER_ANY_HIGH(config, m_irqs).output_handler().set(DEVICE_SELF_OWNER, FUNC(electron_expansion_slot_device::irq_w));
+
+ /* nvram */
+ RAM(config, m_ram).set_default_size("64K");
/* system via */
- VIA6522(config, m_via6522_0, 1000000);
- /*m_via6522_0->readpa_handler().set(FUNC(electron_m2105_device::m2105_via_system_read_porta));
- m_via6522_0->readpb_handler().set(FUNC(electron_m2105_device::m2105_via_system_read_portb));
- m_via6522_0->writepa_handler().set(FUNC(electron_m2105_device::m2105_via_system_write_porta));
- m_via6522_0->writepb_handler().set(FUNC(electron_m2105_device::m2105_via_system_write_portb));*/
+ VIA6522(config, m_via6522_0, DERIVED_CLOCK(1, 16));
+ //m_via6522_0->readpa_handler().set(FUNC(electron_m2105_device::m2105_via_system_read_porta));
+ m_via6522_0->readpb_handler().set(m_tms, FUNC(tms5220_device::status_r));
+ //m_via6522_0->writepa_handler().set(FUNC(electron_m2105_device::m2105_via_system_write_porta));
+ m_via6522_0->writepb_handler().set(m_tms, FUNC(tms5220_device::data_w));
m_via6522_0->irq_handler().set(m_irqs, FUNC(input_merger_device::in_w<0>));
/* user via */
- VIA6522(config, m_via6522_1, 1000000);
- //m_via6522_1->readpb_handler().set(FUNC(electron_m2105_device::m2105_via_user_read_portb));
- m_via6522_1->writepa_handler().set("cent_data_out", FUNC(output_latch_device::bus_w));
- //m_via6522_1->writepb_handler().set(FUNC(electron_m2105_device::m2105_via_user_write_portb));
+ VIA6522(config, m_via6522_1, DERIVED_CLOCK(1, 16));
+ m_via6522_1->writepb_handler().set("cent_data_out", FUNC(output_latch_device::bus_w));
m_via6522_1->ca2_handler().set(m_centronics, FUNC(centronics_device::write_strobe));
m_via6522_1->irq_handler().set(m_irqs, FUNC(input_merger_device::in_w<1>));
- /* duart */
- SCN2681(config, m_duart, XTAL(3'686'400));
+ /* duart */
+ SCN2681(config, m_duart, XTAL(3'686'400)); // TODO: confirm clock
m_duart->irq_cb().set(m_irqs, FUNC(input_merger_device::in_w<2>));
m_duart->a_tx_cb().set("rs232", FUNC(rs232_port_device::write_txd));
//m_duart->outport_cb().set(FUNC(electron_m2105_device::sio_out_w));
@@ -93,10 +93,14 @@ void electron_m2105_device::device_add_mconfig(machine_config &config)
output_latch_device &latch(OUTPUT_LATCH(config, "cent_data_out"));
m_centronics->set_output_latch(latch);
+ /* AM7910 modem */
+
/* speech hardware */
SPEECHROM(config, "vsm", 0);
TMS5220(config, m_tms, 640000);
m_tms->set_speechrom_tag("vsm");
+ //m_tms->irq_handler().set(m_via6522_0, FUNC(via6522_device::write_cb1));
+ //m_tms->readyq_handler().set(m_via6522_0, FUNC(via6522_device::write_cb2));
m_tms->add_route(ALL_OUTPUTS, "mono", 1.0);
}
@@ -117,12 +121,14 @@ electron_m2105_device::electron_m2105_device(const machine_config &mconfig, cons
: device_t(mconfig, ELECTRON_M2105, tag, owner, clock)
, device_electron_expansion_interface(mconfig, *this)
, m_exp_rom(*this, "exp_rom")
+ , m_ram(*this, RAM_TAG)
, m_via6522_0(*this, "via6522_0")
, m_via6522_1(*this, "via6522_1")
, m_duart(*this, "duart")
, m_tms(*this, "tms5220")
, m_centronics(*this, "centronics")
, m_irqs(*this, "irqs")
+ , m_ram_page(0)
, m_romsel(0)
{
}
@@ -133,7 +139,7 @@ electron_m2105_device::electron_m2105_device(const machine_config &mconfig, cons
void electron_m2105_device::device_start()
{
- m_slot = dynamic_cast<electron_expansion_slot_device *>(owner());
+ save_item(NAME(m_ram_page));
}
//-------------------------------------------------
@@ -148,37 +154,57 @@ void electron_m2105_device::device_reset()
// expbus_r - expansion data read
//-------------------------------------------------
-uint8_t electron_m2105_device::expbus_r(address_space &space, offs_t offset, uint8_t data)
+uint8_t electron_m2105_device::expbus_r(offs_t offset)
{
- if (offset >= 0x8000 && offset < 0xc000)
+ uint8_t data = 0xff;
+
+ switch (offset >> 12)
{
+ case 0x8:
+ case 0x9:
+ case 0xa:
+ case 0xb:
switch (m_romsel)
{
case 0:
- data = m_exp_rom->base()[0x8000 + (offset & 0x3fff)];
+ data = m_exp_rom->base()[0x8000 | (offset & 0x3fff)];
break;
case 2:
- data = m_exp_rom->base()[0xc000 + (offset & 0x3fff)];
+ data = m_exp_rom->base()[0xc000 | (offset & 0x3fff)];
break;
case 12:
- data = m_exp_rom->base()[0x0000 + (offset & 0x3fff)];
+ data = m_exp_rom->base()[0x0000 | (offset & 0x3fff)];
break;
case 13:
- data = m_exp_rom->base()[0x4000 + (offset & 0x3fff)];
+ data = m_exp_rom->base()[0x4000 | (offset & 0x3fff)];
+ break;
+ }
+ break;
+
+ case 0xf:
+ switch (offset >> 8)
+ {
+ case 0xfc:
+ logerror("read %04x\n", offset);
+ if (offset >= 0xfc50 && offset < 0xfc60)
+ {
+ data = m_duart->read(offset & 0x0f);
+ }
+ else if (offset >= 0xfc60 && offset < 0xfc70)
+ {
+ data = m_via6522_1->read(offset & 0x0f);
+ }
+ else if (offset >= 0xfc70 && offset < 0xfc80)
+ {
+ data = m_via6522_0->read(offset & 0x0f);
+ }
+ break;
+
+ case 0xfd:
+ //if (m_ram_page < 0x80)
+ data = m_ram->pointer()[(m_ram_page << 8) | (offset & 0xff)];
break;
}
- }
- else if (offset >= 0xfc40 && offset < 0xfc60)
- {
- data = m_via6522_1->read(offset);
- }
- else if (offset >= 0xfc60 && offset < 0xfc70)
- {
- data = m_duart->read(offset & 0x0f);
- }
- else if (offset >= 0xfc70 && offset < 0xfc90)
- {
- data = m_via6522_0->read(offset);
}
return data;
@@ -188,36 +214,44 @@ uint8_t electron_m2105_device::expbus_r(address_space &space, offs_t offset, uin
// expbus_w - expansion data write
//-------------------------------------------------
-void electron_m2105_device::expbus_w(address_space &space, offs_t offset, uint8_t data)
+void electron_m2105_device::expbus_w(offs_t offset, uint8_t data)
{
- if (offset >= 0x8000 && offset < 0xc000)
- {
- logerror("write ram bank %d\n", m_romsel);
- }
- else if (offset >= 0xfc40 && offset < 0xfc60)
+ switch (offset >> 12)
{
- m_via6522_1->write(offset, data);
- }
- else if (offset >= 0xfc60 && offset < 0xfc70)
- {
- m_duart->write(offset & 0x0f, data);
- }
- else if (offset >= 0xfc70 && offset < 0xfc90)
- {
- m_via6522_0->write(offset, data);
- }
- else if (offset == 0xfe05)
- {
- m_romsel = data & 0x0f;
- }
-}
-
+ case 0xf:
+ switch (offset >> 8)
+ {
+ case 0xfc:
+ logerror("write %04x %02x\n", offset, data);
+ if (offset >= 0xfc50 && offset < 0xfc60)
+ {
+ m_duart->write(offset & 0x0f, data);
+ }
+ else if (offset >= 0xfc60 && offset < 0xfc70)
+ {
+ m_via6522_1->write(offset & 0x0f, data);
+ }
+ else if (offset >= 0xfc70 && offset < 0xfc80)
+ {
+ m_via6522_0->write(offset & 0x0f, data);
+ }
+ else if (offset == 0xfcff)
+ {
+ m_ram_page = data;
+ }
+ break;
-//**************************************************************************
-// IMPLEMENTATION
-//**************************************************************************
+ case 0xfd:
+ //if (m_ram_page < 0x80)
+ m_ram->pointer()[(m_ram_page << 8) | (offset & 0xff)] = data;
+ break;
-WRITE_LINE_MEMBER(electron_m2105_device::intrq_w)
-{
- m_slot->irq_w(state);
+ case 0xfe:
+ if (offset == 0xfe05)
+ {
+ m_romsel = data & 0x0f;
+ }
+ break;
+ }
+ }
}
diff --git a/src/devices/bus/electron/m2105.h b/src/devices/bus/electron/m2105.h
index 3fab3b52128..c09f4722eab 100644
--- a/src/devices/bus/electron/m2105.h
+++ b/src/devices/bus/electron/m2105.h
@@ -12,6 +12,7 @@
#pragma once
#include "exp.h"
+#include "machine/ram.h"
#include "machine/6522via.h"
#include "machine/mc68681.h"
#include "machine/input_merger.h"
@@ -40,13 +41,12 @@ protected:
virtual void device_add_mconfig(machine_config &config) override;
virtual const tiny_rom_entry *device_rom_region() const override;
- virtual uint8_t expbus_r(address_space &space, offs_t offset, uint8_t data) override;
- virtual void expbus_w(address_space &space, offs_t offset, uint8_t data) override;
+ virtual uint8_t expbus_r(offs_t offset) override;
+ virtual void expbus_w(offs_t offset, uint8_t data) override;
private:
- DECLARE_WRITE_LINE_MEMBER(intrq_w);
-
required_memory_region m_exp_rom;
+ required_device<ram_device> m_ram;
required_device<via6522_device> m_via6522_0;
required_device<via6522_device> m_via6522_1;
required_device<scn2681_device> m_duart;
@@ -54,6 +54,7 @@ private:
required_device<centronics_device> m_centronics;
required_device<input_merger_device> m_irqs;
+ uint8_t m_ram_page;
uint8_t m_romsel;
};
diff --git a/src/devices/bus/electron/plus1.cpp b/src/devices/bus/electron/plus1.cpp
index 9bb500b586d..a96ad20c656 100644
--- a/src/devices/bus/electron/plus1.cpp
+++ b/src/devices/bus/electron/plus1.cpp
@@ -90,11 +90,13 @@ ioport_constructor electron_plus1_device::device_input_ports() const
// device_add_mconfig - add device configuration
//-------------------------------------------------
-MACHINE_CONFIG_START(electron_plus1_device::device_add_mconfig)
+void electron_plus1_device::device_add_mconfig(machine_config &config)
+{
/* printer */
- MCFG_DEVICE_ADD(m_centronics, CENTRONICS, centronics_devices, "printer")
- MCFG_CENTRONICS_BUSY_HANDLER(WRITELINE(*this, electron_plus1_device, busy_w))
- MCFG_CENTRONICS_OUTPUT_LATCH_ADD("cent_data_out", "centronics")
+ CENTRONICS(config, m_centronics, centronics_devices, "printer");
+ m_centronics->busy_handler().set(FUNC(electron_plus1_device::busy_w));
+ output_latch_device &latch(OUTPUT_LATCH(config, "cent_data_out"));
+ m_centronics->set_output_latch(latch);
/* adc */
ADC0844(config, m_adc);
@@ -105,13 +107,13 @@ MACHINE_CONFIG_START(electron_plus1_device::device_add_mconfig)
m_adc->ch4_callback().set_ioport("JOY4");
/* cartridges */
- MCFG_ELECTRON_CARTSLOT_ADD("cart_sk1", electron_cart, nullptr)
- MCFG_ELECTRON_CARTSLOT_IRQ_HANDLER(WRITELINE(*this, electron_plus1_device, irq_w))
- MCFG_ELECTRON_CARTSLOT_NMI_HANDLER(WRITELINE(*this, electron_plus1_device, nmi_w))
- MCFG_ELECTRON_CARTSLOT_ADD("cart_sk2", electron_cart, nullptr)
- MCFG_ELECTRON_CARTSLOT_IRQ_HANDLER(WRITELINE(*this, electron_plus1_device, irq_w))
- MCFG_ELECTRON_CARTSLOT_NMI_HANDLER(WRITELINE(*this, electron_plus1_device, nmi_w))
-MACHINE_CONFIG_END
+ ELECTRON_CARTSLOT(config, m_cart_sk1, DERIVED_CLOCK(1, 1), electron_cart, nullptr);
+ m_cart_sk1->irq_handler().set(DEVICE_SELF_OWNER, FUNC(electron_expansion_slot_device::irq_w));
+ m_cart_sk1->nmi_handler().set(DEVICE_SELF_OWNER, FUNC(electron_expansion_slot_device::nmi_w));
+ ELECTRON_CARTSLOT(config, m_cart_sk2, DERIVED_CLOCK(1, 1), electron_cart, nullptr);
+ m_cart_sk2->irq_handler().set(DEVICE_SELF_OWNER, FUNC(electron_expansion_slot_device::irq_w));
+ m_cart_sk2->nmi_handler().set(DEVICE_SELF_OWNER, FUNC(electron_expansion_slot_device::nmi_w));
+}
//-------------------------------------------------
// rom_region - device-specific ROM region
@@ -154,7 +156,6 @@ electron_plus1_device::electron_plus1_device(const machine_config &mconfig, cons
void electron_plus1_device::device_start()
{
- m_slot = dynamic_cast<electron_expansion_slot_device *>(owner());
}
@@ -162,8 +163,10 @@ void electron_plus1_device::device_start()
// expbus_r - expansion data read
//-------------------------------------------------
-uint8_t electron_plus1_device::expbus_r(address_space &space, offs_t offset, uint8_t data)
+uint8_t electron_plus1_device::expbus_r(offs_t offset)
{
+ uint8_t data = 0xff;
+
switch (offset >> 12)
{
case 0x8:
@@ -174,15 +177,19 @@ uint8_t electron_plus1_device::expbus_r(address_space &space, offs_t offset, uin
{
case 0:
case 1:
- data = m_cart_sk2->read(space, offset & 0x3fff, 0, 0, m_romsel & 0x01);
+ data = m_cart_sk2->read(offset & 0x3fff, 0, 0, m_romsel & 0x01, 1, 0);
break;
case 2:
case 3:
- data = m_cart_sk1->read(space, offset & 0x3fff, 0, 0, m_romsel & 0x01);
+ data = m_cart_sk1->read(offset & 0x3fff, 0, 0, m_romsel & 0x01, 1, 0);
break;
case 12:
data = m_exp_rom->base()[offset & 0x1fff];
break;
+ case 13:
+ data &= m_cart_sk1->read(offset & 0x3fff, 0, 0, m_romsel & 0x01, 0, 1);
+ data &= m_cart_sk2->read(offset & 0x3fff, 0, 0, m_romsel & 0x01, 0, 1);
+ break;
}
break;
@@ -190,22 +197,22 @@ uint8_t electron_plus1_device::expbus_r(address_space &space, offs_t offset, uin
switch (offset >> 8)
{
case 0xfc:
- data &= m_cart_sk1->read(space, offset & 0xff, 1, 0, m_romsel & 0x01);
- data &= m_cart_sk2->read(space, offset & 0xff, 1, 0, m_romsel & 0x01);
+ data &= m_cart_sk1->read(offset & 0xff, 1, 0, m_romsel & 0x01, 0, 0);
+ data &= m_cart_sk2->read(offset & 0xff, 1, 0, m_romsel & 0x01, 0, 0);
if (offset == 0xfc70)
{
- data &= m_adc->read(space, offset);
+ data &= m_adc->read();
}
else if (offset == 0xfc72)
{
- data &= status_r(space, offset);
+ data &= status_r();
}
break;
case 0xfd:
- data &= m_cart_sk1->read(space, offset & 0xff, 0, 1, m_romsel & 0x01);
- data &= m_cart_sk2->read(space, offset & 0xff, 0, 1, m_romsel & 0x01);
+ data &= m_cart_sk1->read(offset & 0xff, 0, 1, m_romsel & 0x01, 0, 0);
+ data &= m_cart_sk2->read(offset & 0xff, 0, 1, m_romsel & 0x01, 0, 0);
break;
}
}
@@ -218,7 +225,7 @@ uint8_t electron_plus1_device::expbus_r(address_space &space, offs_t offset, uin
// expbus_w - expansion data write
//-------------------------------------------------
-void electron_plus1_device::expbus_w(address_space &space, offs_t offset, uint8_t data)
+void electron_plus1_device::expbus_w(offs_t offset, uint8_t data)
{
switch (offset >> 12)
{
@@ -230,11 +237,11 @@ void electron_plus1_device::expbus_w(address_space &space, offs_t offset, uint8_
{
case 0:
case 1:
- m_cart_sk2->write(space, offset & 0x3fff, data, 0, 0, m_romsel & 0x01);
+ m_cart_sk2->write(offset & 0x3fff, data, 0, 0, m_romsel & 0x01, 1, 0);
break;
case 2:
case 3:
- m_cart_sk1->write(space, offset & 0x3fff, data, 0, 0, m_romsel & 0x01);
+ m_cart_sk1->write(offset & 0x3fff, data, 0, 0, m_romsel & 0x01, 1, 0);
break;
}
break;
@@ -243,12 +250,12 @@ void electron_plus1_device::expbus_w(address_space &space, offs_t offset, uint8_
switch (offset >> 8)
{
case 0xfc:
- m_cart_sk1->write(space, offset & 0xff, data, 1, 0, m_romsel & 0x01);
- m_cart_sk2->write(space, offset & 0xff, data, 1, 0, m_romsel & 0x01);
+ m_cart_sk1->write(offset & 0xff, data, 1, 0, m_romsel & 0x01, 0, 0);
+ m_cart_sk2->write(offset & 0xff, data, 1, 0, m_romsel & 0x01, 0, 0);
if (offset == 0xfc70)
{
- m_adc->write(space, offset, data);
+ m_adc->write(data);
}
else if (offset == 0xfc71)
{
@@ -257,8 +264,8 @@ void electron_plus1_device::expbus_w(address_space &space, offs_t offset, uint8_
break;
case 0xfd:
- m_cart_sk1->write(space, offset & 0xff, data, 0, 1, m_romsel & 0x01);
- m_cart_sk2->write(space, offset & 0xff, data, 0, 1, m_romsel & 0x01);
+ m_cart_sk1->write(offset & 0xff, data, 0, 1, m_romsel & 0x01, 0, 0);
+ m_cart_sk2->write(offset & 0xff, data, 0, 1, m_romsel & 0x01, 0, 0);
break;
case 0xfe:
@@ -276,9 +283,9 @@ void electron_plus1_device::expbus_w(address_space &space, offs_t offset, uint8_
// IMPLEMENTATION
//**************************************************************************
-READ8_MEMBER(electron_plus1_device::status_r)
+u8 electron_plus1_device::status_r()
{
- uint8_t data = 0x0f;
+ u8 data = 0x0f;
// Status: b7: printer Busy
// b6: ADC conversion end
// b5: Fire Button 1
@@ -299,13 +306,3 @@ WRITE_LINE_MEMBER(electron_plus1_device::ready_w)
{
m_adc_ready = !state;
}
-
-WRITE_LINE_MEMBER(electron_plus1_device::irq_w)
-{
- m_slot->irq_w(state);
-}
-
-WRITE_LINE_MEMBER(electron_plus1_device::nmi_w)
-{
- m_slot->nmi_w(state);
-}
diff --git a/src/devices/bus/electron/plus1.h b/src/devices/bus/electron/plus1.h
index 415797905fd..e211594a2c6 100644
--- a/src/devices/bus/electron/plus1.h
+++ b/src/devices/bus/electron/plus1.h
@@ -37,15 +37,13 @@ protected:
virtual const tiny_rom_entry *device_rom_region() const override;
virtual ioport_constructor device_input_ports() const override;
- virtual uint8_t expbus_r(address_space &space, offs_t offset, uint8_t data) override;
- virtual void expbus_w(address_space &space, offs_t offset, uint8_t data) override;
+ virtual uint8_t expbus_r(offs_t offset) override;
+ virtual void expbus_w(offs_t offset, uint8_t data) override;
private:
- DECLARE_READ8_MEMBER(status_r);
+ u8 status_r();
DECLARE_WRITE_LINE_MEMBER(busy_w);
DECLARE_WRITE_LINE_MEMBER(ready_w);
- DECLARE_WRITE_LINE_MEMBER(irq_w);
- DECLARE_WRITE_LINE_MEMBER(nmi_w);
required_memory_region m_exp_rom;
required_device<electron_cartslot_device> m_cart_sk1;
diff --git a/src/devices/bus/electron/plus2.cpp b/src/devices/bus/electron/plus2.cpp
new file mode 100644
index 00000000000..040ec58eb35
--- /dev/null
+++ b/src/devices/bus/electron/plus2.cpp
@@ -0,0 +1,236 @@
+// license:BSD-3-Clause
+// copyright-holders:Nigel Barnes
+/**********************************************************************
+
+ Slogger Plus 2
+
+ The Plus 2 interface from Slogger has been designed to compliment
+ the Slogger Rombox Plus and Acorn Plus 1 by offering further
+ expansion capabilities. This has been achieved by providing two
+ extra cartridge slots, three ROM sockets and connections for a
+ Usr Port and even further expansion via two expansion points.
+
+**********************************************************************/
+
+
+#include "emu.h"
+#include "plus2.h"
+
+
+//**************************************************************************
+// DEVICE DEFINITIONS
+//**************************************************************************
+
+DEFINE_DEVICE_TYPE(ELECTRON_PLUS2, electron_plus2_device, "electron_plus2", "Slogger Plus 2 Expansion")
+
+
+
+//-------------------------------------------------
+// device_add_mconfig - add device configuration
+//-------------------------------------------------
+
+void electron_plus2_device::device_add_mconfig(machine_config &config)
+{
+ /* rom sockets */
+ GENERIC_SOCKET(config, m_rom[0], generic_plain_slot, "electron_rom", "bin,rom"); // ROM SLOT 13
+ m_rom[0]->set_device_load(device_image_load_delegate(&electron_plus2_device::device_image_load_rom1_load, this));
+ GENERIC_SOCKET(config, m_rom[1], generic_plain_slot, "electron_rom", "bin,rom"); // ROM SLOT 14
+ m_rom[1]->set_device_load(device_image_load_delegate(&electron_plus2_device::device_image_load_rom2_load, this));
+ GENERIC_SOCKET(config, m_rom[2], generic_plain_slot, "electron_rom", "bin,rom"); // ROM SLOT 15
+ m_rom[2]->set_device_load(device_image_load_delegate(&electron_plus2_device::device_image_load_rom3_load, this));
+
+ /* cartridges */
+ ELECTRON_CARTSLOT(config, m_cart[0], DERIVED_CLOCK(1, 1), electron_cart, nullptr);
+ m_cart[0]->irq_handler().set(DEVICE_SELF_OWNER, FUNC(electron_expansion_slot_device::irq_w));
+ m_cart[0]->nmi_handler().set(DEVICE_SELF_OWNER, FUNC(electron_expansion_slot_device::nmi_w));
+ ELECTRON_CARTSLOT(config, m_cart[1], DERIVED_CLOCK(1, 1), electron_cart, nullptr);
+ m_cart[1]->irq_handler().set(DEVICE_SELF_OWNER, FUNC(electron_expansion_slot_device::irq_w));
+ m_cart[1]->nmi_handler().set(DEVICE_SELF_OWNER, FUNC(electron_expansion_slot_device::nmi_w));
+
+ /* via */
+ VIA6522(config, m_via, DERIVED_CLOCK(1, 16));
+ m_via->readpb_handler().set(m_userport, FUNC(bbc_userport_slot_device::pb_r));
+ m_via->writepb_handler().set(m_userport, FUNC(bbc_userport_slot_device::pb_w));
+ m_via->irq_handler().set(DEVICE_SELF_OWNER, FUNC(electron_expansion_slot_device::irq_w));
+
+ /* user port */
+ BBC_USERPORT_SLOT(config, m_userport, bbc_userport_devices, nullptr);
+ m_userport->cb1_handler().set(m_via, FUNC(via6522_device::write_cb1));
+ m_userport->cb2_handler().set(m_via, FUNC(via6522_device::write_cb2));
+
+ /* pass-through */
+ ELECTRON_EXPANSION_SLOT(config, m_exp, DERIVED_CLOCK(1, 1), electron_expansion_devices, nullptr);
+ m_exp->irq_handler().set(DEVICE_SELF_OWNER, FUNC(electron_expansion_slot_device::irq_w));
+ m_exp->nmi_handler().set(DEVICE_SELF_OWNER, FUNC(electron_expansion_slot_device::nmi_w));
+}
+
+//**************************************************************************
+// LIVE DEVICE
+//**************************************************************************
+
+//-------------------------------------------------
+// electron_plus2_device - constructor
+//-------------------------------------------------
+
+electron_plus2_device::electron_plus2_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+ : device_t(mconfig, ELECTRON_PLUS2, tag, owner, clock)
+ , device_electron_expansion_interface(mconfig, *this)
+ , m_exp(*this, "exp")
+ , m_via(*this, "via6522")
+ , m_rom(*this, "rom%u", 1)
+ , m_cart(*this, "cart%u", 1)
+ , m_userport(*this, "userport")
+ , m_romsel(0)
+{
+}
+
+
+//-------------------------------------------------
+// device_start - device-specific startup
+//-------------------------------------------------
+
+void electron_plus2_device::device_start()
+{
+}
+
+
+//-------------------------------------------------
+// expbus_r - expansion data read
+//-------------------------------------------------
+
+uint8_t electron_plus2_device::expbus_r(offs_t offset)
+{
+ uint8_t data = 0xff;
+
+ switch (offset >> 12)
+ {
+ case 0x8:
+ case 0x9:
+ case 0xa:
+ case 0xb:
+ switch (m_romsel)
+ {
+ case 4:
+ case 5:
+ data = m_cart[1]->read(offset & 0x3fff, 0, 0, m_romsel & 0x01, 1, 0);
+ break;
+ case 6:
+ case 7:
+ data = m_cart[0]->read(offset & 0x3fff, 0, 0, m_romsel & 0x01, 1, 0);
+ break;
+ case 13:
+ data &= m_cart[0]->read(offset & 0x3fff, 0, 0, m_romsel & 0x01, 0, 1);
+ data &= m_cart[1]->read(offset & 0x3fff, 0, 0, m_romsel & 0x01, 0, 1);
+ case 14:
+ case 15:
+ data &= m_rom[m_romsel - 13]->read_rom(offset & 0x3fff);
+ break;
+ }
+ break;
+
+ case 0xf:
+ switch (offset >> 8)
+ {
+ case 0xfc:
+ data &= m_cart[0]->read(offset & 0xff, 1, 0, m_romsel & 0x01, 0, 0);
+ data &= m_cart[1]->read(offset & 0xff, 1, 0, m_romsel & 0x01, 0, 0);
+
+ if (offset >= 0xfcb0 && offset < 0xfcc0)
+ {
+ data &= m_via->read(offset & 0x0f);
+ }
+ break;
+
+ case 0xfd:
+ data &= m_cart[0]->read(offset & 0xff, 0, 1, m_romsel & 0x01, 0, 0);
+ data &= m_cart[1]->read(offset & 0xff, 0, 1, m_romsel & 0x01, 0, 0);
+ break;
+ }
+ }
+
+ data &= m_exp->expbus_r(offset);
+
+ return data;
+}
+
+
+//-------------------------------------------------
+// expbus_w - expansion data write
+//-------------------------------------------------
+
+void electron_plus2_device::expbus_w(offs_t offset, uint8_t data)
+{
+ switch (offset >> 12)
+ {
+ case 0x8:
+ case 0x9:
+ case 0xa:
+ case 0xb:
+ switch (m_romsel)
+ {
+ case 4:
+ case 5:
+ m_cart[1]->write(offset & 0x3fff, data, 0, 0, m_romsel & 0x01, 1, 0);
+ break;
+ case 6:
+ case 7:
+ m_cart[0]->write(offset & 0x3fff, data, 0, 0, m_romsel & 0x01, 1, 0);
+ break;
+ }
+ break;
+
+ case 0xf:
+ switch (offset >> 8)
+ {
+ case 0xfc:
+ m_cart[0]->write(offset & 0xff, data, 1, 0, m_romsel & 0x01, 0, 0);
+ m_cart[1]->write(offset & 0xff, data, 1, 0, m_romsel & 0x01, 0, 0);
+
+ if (offset >= 0xfcb0 && offset < 0xfcc0)
+ {
+ m_via->write(offset & 0x0f, data);
+ }
+ break;
+
+ case 0xfd:
+ m_cart[0]->write(offset & 0xff, data, 0, 1, m_romsel & 0x01, 0, 0);
+ m_cart[1]->write(offset & 0xff, data, 0, 1, m_romsel & 0x01, 0, 0);
+ break;
+
+ case 0xfe:
+ if (offset == 0xfe05)
+ {
+ m_romsel = data & 0x0f;
+ }
+ break;
+ }
+ }
+
+ m_exp->expbus_w(offset, data);
+}
+
+
+//**************************************************************************
+// IMPLEMENTATION
+//**************************************************************************
+
+image_init_result electron_plus2_device::load_rom(device_image_interface &image, generic_slot_device *slot)
+{
+ uint32_t size = slot->common_get_size("rom");
+
+ // socket accepts 8K and 16K ROM only
+ if (size != 0x2000 && size != 0x4000)
+ {
+ image.seterror(IMAGE_ERROR_UNSPECIFIED, "Invalid size: Only 8K/16K is supported");
+ return image_init_result::FAIL;
+ }
+
+ slot->rom_alloc(0x4000, GENERIC_ROM8_WIDTH, ENDIANNESS_LITTLE);
+ slot->common_load_rom(slot->get_rom_base(), size, "rom");
+
+ // mirror 8K ROMs
+ uint8_t *crt = slot->get_rom_base();
+ if (size <= 0x2000) memcpy(crt + 0x2000, crt, 0x2000);
+
+ return image_init_result::PASS;
+}
diff --git a/src/devices/bus/electron/plus2.h b/src/devices/bus/electron/plus2.h
new file mode 100644
index 00000000000..235ecd4f218
--- /dev/null
+++ b/src/devices/bus/electron/plus2.h
@@ -0,0 +1,62 @@
+// license:BSD-3-Clause
+// copyright-holders:Nigel Barnes
+/**********************************************************************
+
+ Slogger Plus 2
+
+**********************************************************************/
+
+
+#ifndef MAME_BUS_ELECTRON_PLUS2_H
+#define MAME_BUS_ELECTRON_PLUS2_H
+
+#include "exp.h"
+#include "machine/6522via.h"
+#include "bus/electron/cart/slot.h"
+#include "bus/bbc/userport/userport.h"
+#include "bus/generic/slot.h"
+#include "bus/generic/carts.h"
+
+//**************************************************************************
+// TYPE DEFINITIONS
+//**************************************************************************
+
+class electron_plus2_device:
+ public device_t,
+ public device_electron_expansion_interface
+{
+public:
+ // construction/destruction
+ electron_plus2_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+
+protected:
+ // device-level overrides
+ virtual void device_start() override;
+
+ // optional information overrides
+ virtual void device_add_mconfig(machine_config &config) override;
+
+ virtual uint8_t expbus_r(offs_t offset) override;
+ virtual void expbus_w(offs_t offset, uint8_t data) override;
+
+private:
+ image_init_result load_rom(device_image_interface &image, generic_slot_device *slot);
+ DECLARE_DEVICE_IMAGE_LOAD_MEMBER(rom1_load) { return load_rom(image, m_rom[0]); }
+ DECLARE_DEVICE_IMAGE_LOAD_MEMBER(rom2_load) { return load_rom(image, m_rom[1]); }
+ DECLARE_DEVICE_IMAGE_LOAD_MEMBER(rom3_load) { return load_rom(image, m_rom[2]); }
+
+ required_device<electron_expansion_slot_device> m_exp;
+ required_device<via6522_device> m_via;
+ required_device_array<generic_slot_device, 3> m_rom;
+ required_device_array<electron_cartslot_device, 2> m_cart;
+ required_device<bbc_userport_slot_device> m_userport;
+
+ uint8_t m_romsel;
+};
+
+
+// device type definition
+DECLARE_DEVICE_TYPE(ELECTRON_PLUS2, electron_plus2_device)
+
+
+#endif /* MAME_BUS_ELECTRON_PLUS2_H */
diff --git a/src/devices/bus/electron/plus3.cpp b/src/devices/bus/electron/plus3.cpp
index 532594eb5cf..5996e357389 100644
--- a/src/devices/bus/electron/plus3.cpp
+++ b/src/devices/bus/electron/plus3.cpp
@@ -65,15 +65,20 @@ ROM_END
// device_add_mconfig - add device configuration
//-------------------------------------------------
-MACHINE_CONFIG_START(electron_plus3_device::device_add_mconfig)
+void electron_plus3_device::device_add_mconfig(machine_config &config)
+{
/* fdc */
- WD1770(config, m_fdc, 16_MHz_XTAL / 2);
- FLOPPY_CONNECTOR(config, m_floppy0, electron_floppies, "35dd", floppy_formats, true).enable_sound(true);
- FLOPPY_CONNECTOR(config, m_floppy1, electron_floppies, nullptr, floppy_formats).enable_sound(true);
+ WD1770(config, m_fdc, DERIVED_CLOCK(1, 2));
+ FLOPPY_CONNECTOR(config, m_floppy0, electron_floppies, "35dd", floppy_formats).set_fixed(true);
+ m_floppy0->enable_sound(true);
+ FLOPPY_CONNECTOR(config, m_floppy1, electron_floppies, nullptr, floppy_formats);
+ m_floppy1->enable_sound(true);
/* pass-through */
- MCFG_ELECTRON_PASSTHRU_EXPANSION_SLOT_ADD(nullptr)
-MACHINE_CONFIG_END
+ ELECTRON_EXPANSION_SLOT(config, m_exp, DERIVED_CLOCK(1, 1), electron_expansion_devices, nullptr);
+ m_exp->irq_handler().set(DEVICE_SELF_OWNER, FUNC(electron_expansion_slot_device::irq_w));
+ m_exp->nmi_handler().set(DEVICE_SELF_OWNER, FUNC(electron_expansion_slot_device::nmi_w));
+}
const tiny_rom_entry *electron_plus3_device::device_rom_region() const
{
@@ -112,8 +117,10 @@ void electron_plus3_device::device_start()
// expbus_r - expansion data read
//-------------------------------------------------
-uint8_t electron_plus3_device::expbus_r(address_space &space, offs_t offset, uint8_t data)
+uint8_t electron_plus3_device::expbus_r(offs_t offset)
{
+ uint8_t data = 0xff;
+
if (offset >= 0x8000 && offset < 0xc000)
{
if (m_romsel == 4)
@@ -130,7 +137,7 @@ uint8_t electron_plus3_device::expbus_r(address_space &space, offs_t offset, uin
data = m_fdc->read(offset & 0x03);
}
- data &= m_exp->expbus_r(space, offset, data);
+ data &= m_exp->expbus_r(offset);
return data;
}
@@ -139,13 +146,13 @@ uint8_t electron_plus3_device::expbus_r(address_space &space, offs_t offset, uin
// expbus_w - expansion data write
//-------------------------------------------------
-void electron_plus3_device::expbus_w(address_space &space, offs_t offset, uint8_t data)
+void electron_plus3_device::expbus_w(offs_t offset, uint8_t data)
{
- m_exp->expbus_w(space, offset, data);
+ m_exp->expbus_w(offset, data);
if (offset == 0xfcc0)
{
- wd1770_status_w(space, offset, data);
+ wd1770_status_w(data);
}
else if (offset >= 0xfcc4 && offset < 0xfcc8)
{
@@ -162,7 +169,7 @@ void electron_plus3_device::expbus_w(address_space &space, offs_t offset, uint8_
// IMPLEMENTATION
//**************************************************************************
-WRITE8_MEMBER(electron_plus3_device::wd1770_status_w)
+void electron_plus3_device::wd1770_status_w(uint8_t data)
{
floppy_image_device *floppy = nullptr;
diff --git a/src/devices/bus/electron/plus3.h b/src/devices/bus/electron/plus3.h
index c6a53805783..44de595a3db 100644
--- a/src/devices/bus/electron/plus3.h
+++ b/src/devices/bus/electron/plus3.h
@@ -34,11 +34,11 @@ protected:
virtual void device_add_mconfig(machine_config &config) override;
virtual const tiny_rom_entry *device_rom_region() const override;
- virtual uint8_t expbus_r(address_space &space, offs_t offset, uint8_t data) override;
- virtual void expbus_w(address_space &space, offs_t offset, uint8_t data) override;
+ virtual uint8_t expbus_r(offs_t offset) override;
+ virtual void expbus_w(offs_t offset, uint8_t data) override;
private:
- DECLARE_WRITE8_MEMBER(wd1770_status_w);
+ void wd1770_status_w(uint8_t data);
DECLARE_FLOPPY_FORMATS(floppy_formats);
required_device<electron_expansion_slot_device> m_exp;
diff --git a/src/devices/bus/electron/pwrjoy.cpp b/src/devices/bus/electron/pwrjoy.cpp
index 2791f700372..1ff7ab79566 100644
--- a/src/devices/bus/electron/pwrjoy.cpp
+++ b/src/devices/bus/electron/pwrjoy.cpp
@@ -78,8 +78,10 @@ void electron_pwrjoy_device::device_start()
// expbus_r - expansion data read
//-------------------------------------------------
-uint8_t electron_pwrjoy_device::expbus_r(address_space &space, offs_t offset, uint8_t data)
+uint8_t electron_pwrjoy_device::expbus_r(offs_t offset)
{
+ uint8_t data = 0xff;
+
if (offset >= 0x8000 && offset < 0xc000)
{
if (m_romsel == 15)
@@ -100,7 +102,7 @@ uint8_t electron_pwrjoy_device::expbus_r(address_space &space, offs_t offset, ui
// expbus_w - expansion data write
//-------------------------------------------------
-void electron_pwrjoy_device::expbus_w(address_space &space, offs_t offset, uint8_t data)
+void electron_pwrjoy_device::expbus_w(offs_t offset, uint8_t data)
{
if (offset == 0xfe05)
{
diff --git a/src/devices/bus/electron/pwrjoy.h b/src/devices/bus/electron/pwrjoy.h
index be392a1c622..abc91cf3e2b 100644
--- a/src/devices/bus/electron/pwrjoy.h
+++ b/src/devices/bus/electron/pwrjoy.h
@@ -32,8 +32,8 @@ public:
virtual const tiny_rom_entry *device_rom_region() const override;
virtual ioport_constructor device_input_ports() const override;
- virtual uint8_t expbus_r(address_space &space, offs_t offset, uint8_t data) override;
- virtual void expbus_w(address_space &space, offs_t offset, uint8_t data) override;
+ virtual uint8_t expbus_r(offs_t offset) override;
+ virtual void expbus_w(offs_t offset, uint8_t data) override;
protected:
// device-level overrides
diff --git a/src/devices/bus/electron/rombox.cpp b/src/devices/bus/electron/rombox.cpp
index 2ae1967c743..35f94b08d13 100644
--- a/src/devices/bus/electron/rombox.cpp
+++ b/src/devices/bus/electron/rombox.cpp
@@ -51,36 +51,31 @@ ioport_constructor electron_rombox_device::device_input_ports() const
// device_add_mconfig - add device configuration
//-------------------------------------------------
-MACHINE_CONFIG_START(electron_rombox_device::device_add_mconfig)
+void electron_rombox_device::device_add_mconfig(machine_config &config)
+{
/* rom sockets */
- MCFG_GENERIC_SOCKET_ADD("rom1", generic_plain_slot, "electron_rom")
- MCFG_GENERIC_EXTENSIONS("bin,rom")
- MCFG_GENERIC_LOAD(electron_rombox_device, rom1_load)
- MCFG_GENERIC_SOCKET_ADD("rom2", generic_plain_slot, "electron_rom")
- MCFG_GENERIC_EXTENSIONS("bin,rom")
- MCFG_GENERIC_LOAD(electron_rombox_device, rom2_load)
- MCFG_GENERIC_SOCKET_ADD("rom3", generic_plain_slot, "electron_rom")
- MCFG_GENERIC_EXTENSIONS("bin,rom")
- MCFG_GENERIC_LOAD(electron_rombox_device, rom3_load)
- MCFG_GENERIC_SOCKET_ADD("rom4", generic_plain_slot, "electron_rom")
- MCFG_GENERIC_EXTENSIONS("bin,rom")
- MCFG_GENERIC_LOAD(electron_rombox_device, rom4_load)
- MCFG_GENERIC_SOCKET_ADD("rom5", generic_plain_slot, "electron_rom")
- MCFG_GENERIC_EXTENSIONS("bin,rom")
- MCFG_GENERIC_LOAD(electron_rombox_device, rom5_load)
- MCFG_GENERIC_SOCKET_ADD("rom6", generic_plain_slot, "electron_rom")
- MCFG_GENERIC_EXTENSIONS("bin,rom")
- MCFG_GENERIC_LOAD(electron_rombox_device, rom6_load)
- MCFG_GENERIC_SOCKET_ADD("rom7", generic_plain_slot, "electron_rom")
- MCFG_GENERIC_EXTENSIONS("bin,rom")
- MCFG_GENERIC_LOAD(electron_rombox_device, rom7_load)
- MCFG_GENERIC_SOCKET_ADD("rom8", generic_plain_slot, "electron_rom")
- MCFG_GENERIC_EXTENSIONS("bin,rom")
- MCFG_GENERIC_LOAD(electron_rombox_device, rom8_load)
+ GENERIC_SOCKET(config, m_rom[0], generic_plain_slot, "electron_rom", "bin,rom");
+ m_rom[0]->set_device_load(device_image_load_delegate(&electron_rombox_device::device_image_load_rom1_load, this));
+ GENERIC_SOCKET(config, m_rom[1], generic_plain_slot, "electron_rom", "bin,rom");
+ m_rom[1]->set_device_load(device_image_load_delegate(&electron_rombox_device::device_image_load_rom2_load, this));
+ GENERIC_SOCKET(config, m_rom[2], generic_plain_slot, "electron_rom", "bin,rom");
+ m_rom[2]->set_device_load(device_image_load_delegate(&electron_rombox_device::device_image_load_rom3_load, this));
+ GENERIC_SOCKET(config, m_rom[3], generic_plain_slot, "electron_rom", "bin,rom");
+ m_rom[3]->set_device_load(device_image_load_delegate(&electron_rombox_device::device_image_load_rom4_load, this));
+ GENERIC_SOCKET(config, m_rom[4], generic_plain_slot, "electron_rom", "bin,rom");
+ m_rom[4]->set_device_load(device_image_load_delegate(&electron_rombox_device::device_image_load_rom5_load, this));
+ GENERIC_SOCKET(config, m_rom[5], generic_plain_slot, "electron_rom", "bin,rom");
+ m_rom[5]->set_device_load(device_image_load_delegate(&electron_rombox_device::device_image_load_rom6_load, this));
+ GENERIC_SOCKET(config, m_rom[6], generic_plain_slot, "electron_rom", "bin,rom");
+ m_rom[6]->set_device_load(device_image_load_delegate(&electron_rombox_device::device_image_load_rom7_load, this));
+ GENERIC_SOCKET(config, m_rom[7], generic_plain_slot, "electron_rom", "bin,rom");
+ m_rom[7]->set_device_load(device_image_load_delegate(&electron_rombox_device::device_image_load_rom8_load, this));
/* pass-through */
- MCFG_ELECTRON_PASSTHRU_EXPANSION_SLOT_ADD(nullptr)
-MACHINE_CONFIG_END
+ ELECTRON_EXPANSION_SLOT(config, m_exp, DERIVED_CLOCK(1, 1), electron_expansion_devices, nullptr);
+ m_exp->irq_handler().set(DEVICE_SELF_OWNER, FUNC(electron_expansion_slot_device::irq_w));
+ m_exp->nmi_handler().set(DEVICE_SELF_OWNER, FUNC(electron_expansion_slot_device::nmi_w));
+}
//**************************************************************************
// LIVE DEVICE
@@ -122,8 +117,10 @@ void electron_rombox_device::device_reset()
// expbus_r - expansion data read
//-------------------------------------------------
-uint8_t electron_rombox_device::expbus_r(address_space &space, offs_t offset, uint8_t data)
+uint8_t electron_rombox_device::expbus_r(offs_t offset)
{
+ uint8_t data = 0xff;
+
if (offset >= 0x8000 && offset < 0xc000)
{
switch (m_romsel)
@@ -134,7 +131,7 @@ uint8_t electron_rombox_device::expbus_r(address_space &space, offs_t offset, ui
case 3:
if (m_rom_base == 0 && m_rom[m_romsel + 4]->exists())
{
- data = m_rom[m_romsel + 4]->read_rom(space, offset & 0x3fff);
+ data = m_rom[m_romsel + 4]->read_rom(offset & 0x3fff);
}
break;
case 4:
@@ -143,7 +140,7 @@ uint8_t electron_rombox_device::expbus_r(address_space &space, offs_t offset, ui
case 7:
if (m_rom[m_romsel - 4]->exists())
{
- data = m_rom[m_romsel - 4]->read_rom(space, offset & 0x3fff);
+ data = m_rom[m_romsel - 4]->read_rom(offset & 0x3fff);
}
break;
case 12:
@@ -152,13 +149,13 @@ uint8_t electron_rombox_device::expbus_r(address_space &space, offs_t offset, ui
case 15:
if (m_rom_base == 12 && m_rom[m_romsel - 8]->exists())
{
- data = m_rom[m_romsel - 8]->read_rom(space, offset & 0x3fff);
+ data = m_rom[m_romsel - 8]->read_rom(offset & 0x3fff);
}
break;
}
}
- data &= m_exp->expbus_r(space, offset, data);
+ data &= m_exp->expbus_r(offset);
return data;
}
@@ -167,9 +164,9 @@ uint8_t electron_rombox_device::expbus_r(address_space &space, offs_t offset, ui
// expbus_w - expansion data write
//-------------------------------------------------
-void electron_rombox_device::expbus_w(address_space &space, offs_t offset, uint8_t data)
+void electron_rombox_device::expbus_w(offs_t offset, uint8_t data)
{
- m_exp->expbus_w(space, offset, data);
+ m_exp->expbus_w(offset, data);
if (offset == 0xfe05)
{
diff --git a/src/devices/bus/electron/rombox.h b/src/devices/bus/electron/rombox.h
index 045db388838..65ed2fa80d8 100644
--- a/src/devices/bus/electron/rombox.h
+++ b/src/devices/bus/electron/rombox.h
@@ -35,8 +35,8 @@ protected:
virtual void device_add_mconfig(machine_config &config) override;
virtual ioport_constructor device_input_ports() const override;
- virtual uint8_t expbus_r(address_space &space, offs_t offset, uint8_t data) override;
- virtual void expbus_w(address_space &space, offs_t offset, uint8_t data) override;
+ virtual uint8_t expbus_r(offs_t offset) override;
+ virtual void expbus_w(offs_t offset, uint8_t data) override;
private:
image_init_result load_rom(device_image_interface &image, generic_slot_device *slot);
diff --git a/src/devices/bus/electron/romboxp.cpp b/src/devices/bus/electron/romboxp.cpp
index d3ca80d43f4..7917ae3d539 100644
--- a/src/devices/bus/electron/romboxp.cpp
+++ b/src/devices/bus/electron/romboxp.cpp
@@ -84,34 +84,32 @@ ioport_constructor electron_romboxp_device::device_input_ports() const
// device_add_mconfig - add device configuration
//-------------------------------------------------
-MACHINE_CONFIG_START(electron_romboxp_device::device_add_mconfig)
+void electron_romboxp_device::device_add_mconfig(machine_config &config)
+{
/* printer */
- MCFG_DEVICE_ADD(m_centronics, CENTRONICS, centronics_devices, "printer")
- MCFG_CENTRONICS_BUSY_HANDLER(WRITELINE(*this, electron_romboxp_device, busy_w))
- MCFG_CENTRONICS_OUTPUT_LATCH_ADD("cent_data_out", "centronics")
+ CENTRONICS(config, m_centronics, centronics_devices, "printer");
+ m_centronics->busy_handler().set(FUNC(electron_romboxp_device::busy_w));
+ output_latch_device &latch(OUTPUT_LATCH(config, "cent_data_out"));
+ m_centronics->set_output_latch(latch);
/* rom sockets */
- MCFG_GENERIC_SOCKET_ADD("rom1", generic_plain_slot, "electron_rom") // ROM SLOT 4/12
- MCFG_GENERIC_EXTENSIONS("bin,rom")
- MCFG_GENERIC_LOAD(electron_romboxp_device, rom1_load)
- MCFG_GENERIC_SOCKET_ADD("rom2", generic_plain_slot, "electron_rom") // ROM SLOT 5/13
- MCFG_GENERIC_EXTENSIONS("bin,rom")
- MCFG_GENERIC_LOAD(electron_romboxp_device, rom2_load)
- MCFG_GENERIC_SOCKET_ADD("rom3", generic_plain_slot, "electron_rom") // ROM SLOT 6/14 also ROM/RAM
- MCFG_GENERIC_EXTENSIONS("bin,rom")
- MCFG_GENERIC_LOAD(electron_romboxp_device, rom3_load)
- MCFG_GENERIC_SOCKET_ADD("rom4", generic_plain_slot, "electron_rom") // ROM SLOT 7/15
- MCFG_GENERIC_EXTENSIONS("bin,rom")
- MCFG_GENERIC_LOAD(electron_romboxp_device, rom4_load)
+ GENERIC_SOCKET(config, m_rom[0], generic_plain_slot, "electron_rom", "bin,rom"); // ROM SLOT 4/12
+ m_rom[0]->set_device_load(device_image_load_delegate(&electron_romboxp_device::device_image_load_rom1_load, this));
+ GENERIC_SOCKET(config, m_rom[1], generic_plain_slot, "electron_rom", "bin,rom"); // ROM SLOT 5/13
+ m_rom[1]->set_device_load(device_image_load_delegate(&electron_romboxp_device::device_image_load_rom2_load, this));
+ GENERIC_SOCKET(config, m_rom[2], generic_plain_slot, "electron_rom", "bin,rom"); // ROM SLOT 6/14 also ROM/RAM
+ m_rom[2]->set_device_load(device_image_load_delegate(&electron_romboxp_device::device_image_load_rom3_load, this));
+ GENERIC_SOCKET(config, m_rom[3], generic_plain_slot, "electron_rom", "bin,rom"); // ROM SLOT 7/15
+ m_rom[3]->set_device_load(device_image_load_delegate(&electron_romboxp_device::device_image_load_rom4_load, this));
/* cartridges */
- MCFG_ELECTRON_CARTSLOT_ADD("cart1", electron_cart, nullptr) // ROM SLOT 0/1
- MCFG_ELECTRON_CARTSLOT_IRQ_HANDLER(WRITELINE(*this, electron_romboxp_device, irq_w))
- MCFG_ELECTRON_CARTSLOT_NMI_HANDLER(WRITELINE(*this, electron_romboxp_device, nmi_w))
- MCFG_ELECTRON_CARTSLOT_ADD("cart2", electron_cart, nullptr) // ROM SLOT 2/3
- MCFG_ELECTRON_CARTSLOT_IRQ_HANDLER(WRITELINE(*this, electron_romboxp_device, irq_w))
- MCFG_ELECTRON_CARTSLOT_NMI_HANDLER(WRITELINE(*this, electron_romboxp_device, nmi_w))
-MACHINE_CONFIG_END
+ ELECTRON_CARTSLOT(config, m_cart[0], DERIVED_CLOCK(1, 1), electron_cart, nullptr); // ROM SLOT 0/1
+ m_cart[0]->irq_handler().set(DEVICE_SELF_OWNER, FUNC(electron_expansion_slot_device::irq_w));
+ m_cart[0]->nmi_handler().set(DEVICE_SELF_OWNER, FUNC(electron_expansion_slot_device::nmi_w));
+ ELECTRON_CARTSLOT(config, m_cart[1], DERIVED_CLOCK(1, 1), electron_cart, nullptr); // ROM SLOT 2/3
+ m_cart[1]->irq_handler().set(DEVICE_SELF_OWNER, FUNC(electron_expansion_slot_device::irq_w));
+ m_cart[1]->nmi_handler().set(DEVICE_SELF_OWNER, FUNC(electron_expansion_slot_device::nmi_w));
+}
const tiny_rom_entry *electron_romboxp_device::device_rom_region() const
{
@@ -147,7 +145,6 @@ electron_romboxp_device::electron_romboxp_device(const machine_config &mconfig,
void electron_romboxp_device::device_start()
{
- m_slot = dynamic_cast<electron_expansion_slot_device *>(owner());
}
//-------------------------------------------------
@@ -163,8 +160,10 @@ void electron_romboxp_device::device_reset()
// expbus_r - expansion data read
//-------------------------------------------------
-uint8_t electron_romboxp_device::expbus_r(address_space &space, offs_t offset, uint8_t data)
+uint8_t electron_romboxp_device::expbus_r(offs_t offset)
{
+ uint8_t data = 0xff;
+
switch (offset >> 12)
{
case 0x8:
@@ -175,11 +174,11 @@ uint8_t electron_romboxp_device::expbus_r(address_space &space, offs_t offset, u
{
case 0:
case 1:
- data = m_cart[1]->read(space, offset & 0x3fff, 0, 0, m_romsel & 0x01);
+ data = m_cart[1]->read(offset & 0x3fff, 0, 0, m_romsel & 0x01, 1, 0);
break;
case 2:
case 3:
- data = m_cart[0]->read(space, offset & 0x3fff, 0, 0, m_romsel & 0x01);
+ data = m_cart[0]->read(offset & 0x3fff, 0, 0, m_romsel & 0x01, 1, 0);
break;
case 4:
case 5:
@@ -187,18 +186,20 @@ uint8_t electron_romboxp_device::expbus_r(address_space &space, offs_t offset, u
case 7:
if (m_rom_base == 4)
{
- data = m_rom[m_romsel - 4]->read_rom(space, offset & 0x3fff);
+ data = m_rom[m_romsel - 4]->read_rom(offset & 0x3fff);
}
break;
case 12:
data = m_exp_rom->base()[offset & 0x1fff];
break;
case 13:
+ data &= m_cart[0]->read(offset & 0x3fff, 0, 0, m_romsel & 0x01, 0, 1);
+ data &= m_cart[1]->read(offset & 0x3fff, 0, 0, m_romsel & 0x01, 0, 1);
case 14:
case 15:
if (m_rom_base == 12)
{
- data = m_rom[m_romsel - 12]->read_rom(space, offset & 0x3fff);
+ data = m_rom[m_romsel - 12]->read_rom(offset & 0x3fff);
}
break;
}
@@ -208,18 +209,18 @@ uint8_t electron_romboxp_device::expbus_r(address_space &space, offs_t offset, u
switch (offset >> 8)
{
case 0xfc:
- data &= m_cart[0]->read(space, offset & 0xff, 1, 0, m_romsel & 0x01);
- data &= m_cart[1]->read(space, offset & 0xff, 1, 0, m_romsel & 0x01);
+ data &= m_cart[0]->read(offset & 0xff, 1, 0, m_romsel & 0x01, 0, 0);
+ data &= m_cart[1]->read(offset & 0xff, 1, 0, m_romsel & 0x01, 0, 0);
if (offset == 0xfc72)
{
- data &= status_r(space, offset);
+ data &= status_r();
}
break;
case 0xfd:
- data &= m_cart[0]->read(space, offset & 0xff, 0, 1, m_romsel & 0x01);
- data &= m_cart[1]->read(space, offset & 0xff, 0, 1, m_romsel & 0x01);
+ data &= m_cart[0]->read(offset & 0xff, 0, 1, m_romsel & 0x01, 0, 0);
+ data &= m_cart[1]->read(offset & 0xff, 0, 1, m_romsel & 0x01, 0, 0);
break;
}
}
@@ -231,7 +232,7 @@ uint8_t electron_romboxp_device::expbus_r(address_space &space, offs_t offset, u
// expbus_w - expansion data write
//-------------------------------------------------
-void electron_romboxp_device::expbus_w(address_space &space, offs_t offset, uint8_t data)
+void electron_romboxp_device::expbus_w(offs_t offset, uint8_t data)
{
switch (offset >> 12)
{
@@ -243,11 +244,11 @@ void electron_romboxp_device::expbus_w(address_space &space, offs_t offset, uint
{
case 0:
case 1:
- m_cart[1]->write(space, offset & 0x3fff, data, 0, 0, m_romsel & 0x01);
+ m_cart[1]->write(offset & 0x3fff, data, 0, 0, m_romsel & 0x01, 1, 0);
break;
case 2:
case 3:
- m_cart[0]->write(space, offset & 0x3fff, data, 0, 0, m_romsel & 0x01);
+ m_cart[0]->write(offset & 0x3fff, data, 0, 0, m_romsel & 0x01, 1, 0);
break;
}
break;
@@ -256,8 +257,8 @@ void electron_romboxp_device::expbus_w(address_space &space, offs_t offset, uint
switch (offset >> 8)
{
case 0xfc:
- m_cart[0]->write(space, offset & 0xff, data, 1, 0, m_romsel & 0x01);
- m_cart[1]->write(space, offset & 0xff, data, 1, 0, m_romsel & 0x01);
+ m_cart[0]->write(offset & 0xff, data, 1, 0, m_romsel & 0x01, 0, 0);
+ m_cart[1]->write(offset & 0xff, data, 1, 0, m_romsel & 0x01, 0, 0);
if (offset == 0xfc71)
{
@@ -266,8 +267,8 @@ void electron_romboxp_device::expbus_w(address_space &space, offs_t offset, uint
break;
case 0xfd:
- m_cart[0]->write(space, offset & 0xff, data, 0, 1, m_romsel & 0x01);
- m_cart[1]->write(space, offset & 0xff, data, 0, 1, m_romsel & 0x01);
+ m_cart[0]->write(offset & 0xff, data, 0, 1, m_romsel & 0x01, 0, 0);
+ m_cart[1]->write(offset & 0xff, data, 0, 1, m_romsel & 0x01, 0, 0);
break;
case 0xfe:
@@ -284,7 +285,7 @@ void electron_romboxp_device::expbus_w(address_space &space, offs_t offset, uint
// IMPLEMENTATION
//**************************************************************************
-READ8_MEMBER(electron_romboxp_device::status_r)
+uint8_t electron_romboxp_device::status_r()
{
// Status: b7: printer Busy
return (m_centronics_busy << 7) | 0x7f;
@@ -317,13 +318,3 @@ image_init_result electron_romboxp_device::load_rom(device_image_interface &imag
return image_init_result::PASS;
}
-
-WRITE_LINE_MEMBER(electron_romboxp_device::irq_w)
-{
- m_slot->irq_w(state);
-}
-
-WRITE_LINE_MEMBER(electron_romboxp_device::nmi_w)
-{
- m_slot->nmi_w(state);
-}
diff --git a/src/devices/bus/electron/romboxp.h b/src/devices/bus/electron/romboxp.h
index e350954eb18..f5905bc47bf 100644
--- a/src/devices/bus/electron/romboxp.h
+++ b/src/devices/bus/electron/romboxp.h
@@ -40,14 +40,12 @@ protected:
virtual const tiny_rom_entry *device_rom_region() const override;
virtual ioport_constructor device_input_ports() const override;
- virtual uint8_t expbus_r(address_space &space, offs_t offset, uint8_t data) override;
- virtual void expbus_w(address_space &space, offs_t offset, uint8_t data) override;
+ virtual uint8_t expbus_r(offs_t offset) override;
+ virtual void expbus_w(offs_t offset, uint8_t data) override;
private:
- DECLARE_READ8_MEMBER(status_r);
+ uint8_t status_r();
DECLARE_WRITE_LINE_MEMBER(busy_w);
- DECLARE_WRITE_LINE_MEMBER(irq_w);
- DECLARE_WRITE_LINE_MEMBER(nmi_w);
image_init_result load_rom(device_image_interface &image, generic_slot_device *slot);
DECLARE_DEVICE_IMAGE_LOAD_MEMBER(rom1_load) { return load_rom(image, m_rom[0]); }
diff --git a/src/devices/bus/ep64/exp.cpp b/src/devices/bus/ep64/exp.cpp
index 32ef220519d..c241fb68c08 100644
--- a/src/devices/bus/ep64/exp.cpp
+++ b/src/devices/bus/ep64/exp.cpp
@@ -49,7 +49,8 @@ ep64_expansion_bus_slot_device::ep64_expansion_bus_slot_device(const machine_con
, m_write_irq(*this)
, m_write_nmi(*this)
, m_write_wait(*this)
- , m_dave(*this, finder_base::DUMMY_TAG)
+ , m_program_space(*this, finder_base::DUMMY_TAG, -1)
+ , m_io_space(*this, finder_base::DUMMY_TAG, -1)
, m_card(nullptr)
{
}
diff --git a/src/devices/bus/ep64/exp.h b/src/devices/bus/ep64/exp.h
index cb29bab5049..88d3b4e61b9 100644
--- a/src/devices/bus/ep64/exp.h
+++ b/src/devices/bus/ep64/exp.h
@@ -47,40 +47,10 @@
#pragma once
-#include "sound/dave.h"
-
void ep64_expansion_bus_cards(device_slot_interface &device);
//**************************************************************************
-// MACROS / CONSTANTS
-//**************************************************************************
-
-#define EP64_EXPANSION_BUS_TAG "exp"
-
-//**************************************************************************
-// INTERFACE CONFIGURATION MACROS
-//**************************************************************************
-
-#define MCFG_EP64_EXPANSION_BUS_SLOT_ADD(_tag, _def_slot) \
- MCFG_DEVICE_ADD(_tag, EP64_EXPANSION_BUS_SLOT, 0) \
- MCFG_DEVICE_SLOT_INTERFACE(ep64_expansion_bus_cards, _def_slot, false)
-
-#define MCFG_EP64_EXPANSION_BUS_SLOT_DAVE(_tag) \
- downcast<ep64_expansion_bus_slot_device &>(*device).set_dave_tag(_tag);
-
-#define MCFG_EP64_EXPANSION_BUS_SLOT_IRQ_CALLBACK(_write) \
- downcast<ep64_expansion_bus_slot_device &>(*device).set_irq_wr_callback(DEVCB_##_write);
-
-#define MCFG_EP64_EXPANSION_BUS_SLOT_NMI_CALLBACK(_write) \
- downcast<ep64_expansion_bus_slot_device &>(*device).set_nmi_wr_callback(DEVCB_##_write);
-
-#define MCFG_EP64_EXPANSION_BUS_SLOT_WAIT_CALLBACK(_write) \
- downcast<ep64_expansion_bus_slot_device &>(*device).set_wait_wr_callback(DEVCB_##_write);
-
-
-
-//**************************************************************************
// TYPE DEFINITIONS
//**************************************************************************
@@ -105,7 +75,8 @@ public:
}
ep64_expansion_bus_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- template <typename T> void set_dave_tag(T &&dave_tag) { m_dave.set_tag(std::forward<T>(dave_tag)); }
+ template <typename T> void set_program_space(T &&tag, int spacenum) { m_program_space.set_tag(std::forward<T>(tag), spacenum); }
+ template <typename T> void set_io_space(T &&tag, int spacenum) { m_io_space.set_tag(std::forward<T>(tag), spacenum); }
auto irq_wr() { return m_write_irq.bind(); }
auto nmi_wr() { return m_write_nmi.bind(); }
auto wait_wr() { return m_write_wait.bind(); }
@@ -114,8 +85,8 @@ public:
DECLARE_WRITE_LINE_MEMBER( nmi_w ) { m_write_nmi(state); }
DECLARE_WRITE_LINE_MEMBER( wait_w ) { m_write_wait(state); }
- address_space& program() { return m_dave->space(AS_PROGRAM); }
- address_space& io() { return m_dave->space(AS_IO); }
+ address_space &program() { return *m_program_space; }
+ address_space &io() { return *m_io_space; }
protected:
// device-level overrides
@@ -128,7 +99,8 @@ private:
devcb_write_line m_write_nmi;
devcb_write_line m_write_wait;
- required_device<dave_device> m_dave;
+ required_address_space m_program_space;
+ required_address_space m_io_space;
device_ep64_expansion_bus_card_interface *m_card;
};
diff --git a/src/devices/bus/epson_sio/epson_sio.h b/src/devices/bus/epson_sio/epson_sio.h
index 189e36c5bdf..5d93c42ba74 100644
--- a/src/devices/bus/epson_sio/epson_sio.h
+++ b/src/devices/bus/epson_sio/epson_sio.h
@@ -12,40 +12,35 @@
#pragma once
-
-//**************************************************************************
-// INTERFACE CONFIGURATION MACROS
-//**************************************************************************
-
-#define MCFG_EPSON_SIO_ADD(_tag, _def_slot) \
- MCFG_DEVICE_ADD(_tag, EPSON_SIO, 0) \
- MCFG_DEVICE_SLOT_INTERFACE(epson_sio_devices, _def_slot, false)
-
-#define MCFG_EPSON_SIO_RX(_rx) \
- downcast<epson_sio_device *>(device)->set_rx_callback(DEVCB_##_rx);
-
-#define MCFG_EPSON_SIO_PIN(_pin) \
- downcast<epson_sio_device *>(device)->set_pin_callback(DEVCB_##_pin);
-
-
//**************************************************************************
// TYPE DEFINITIONS
//**************************************************************************
class device_epson_sio_interface;
+// supported devices
+void epson_sio_devices(device_slot_interface &device);
class epson_sio_device : public device_t,
public device_slot_interface
{
public:
// construction/destruction
- epson_sio_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+ epson_sio_device(machine_config const &mconfig, char const *tag, device_t *owner, char const *dflt)
+ : epson_sio_device(mconfig, tag, owner, (uint32_t)0)
+ {
+ option_reset();
+ epson_sio_devices(*this);
+ set_default_option(dflt);
+ set_fixed(false);
+ }
+
+ epson_sio_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock = 0);
virtual ~epson_sio_device();
// callbacks
- template <class Object> devcb_base &set_rx_callback(Object &&rx) { return m_write_rx.set_callback(std::forward<Object>(rx)); }
- template <class Object> devcb_base &set_pin_callback(Object &&pin) { return m_write_pin.set_callback(std::forward<Object>(pin)); }
+ auto rx_callback() { return m_write_rx.bind(); }
+ auto pin_callback() { return m_write_pin.bind(); }
// called from owner
DECLARE_WRITE_LINE_MEMBER( tx_w );
@@ -88,9 +83,4 @@ protected:
// device type definition
DECLARE_DEVICE_TYPE(EPSON_SIO, epson_sio_device)
-
-// supported devices
-void epson_sio_devices(device_slot_interface &device);
-
-
#endif // MAME_BUS_EPSON_SIO_EPSON_SIO_H
diff --git a/src/devices/bus/epson_sio/pf10.cpp b/src/devices/bus/epson_sio/pf10.cpp
index 462de5ecaa3..f986bb5d4c2 100644
--- a/src/devices/bus/epson_sio/pf10.cpp
+++ b/src/devices/bus/epson_sio/pf10.cpp
@@ -12,7 +12,6 @@
#include "emu.h"
#include "pf10.h"
-#include "imagedev/floppy.h"
//**************************************************************************
@@ -61,7 +60,8 @@ static void pf10_floppies(device_slot_interface &device)
device.option_add("smd165", EPSON_SMD_165);
}
-MACHINE_CONFIG_START(epson_pf10_device::device_add_mconfig)
+void epson_pf10_device::device_add_mconfig(machine_config &config)
+{
HD6303Y(config, m_cpu, XTAL(4'915'200)); // HD63A03XF
m_cpu->set_addrmap(AS_PROGRAM, &epson_pf10_device::cpu_mem);
m_cpu->in_p1_cb().set(FUNC(epson_pf10_device::port1_r));
@@ -71,12 +71,12 @@ MACHINE_CONFIG_START(epson_pf10_device::device_add_mconfig)
m_cpu->out_ser_tx_cb().set(FUNC(epson_pf10_device::hd6303_tx_w));
UPD765A(config, m_fdc, 4'000'000, false, true);
- MCFG_FLOPPY_DRIVE_ADD("upd765a:0", pf10_floppies, "smd165", floppy_image_device::default_floppy_formats)
+ FLOPPY_CONNECTOR(config, m_floppy, pf10_floppies, "smd165", floppy_image_device::default_floppy_formats);
- MCFG_EPSON_SIO_ADD("sio", nullptr)
- MCFG_EPSON_SIO_RX(WRITELINE(DEVICE_SELF, epson_pf10_device, rxc_w))
- MCFG_EPSON_SIO_PIN(WRITELINE(DEVICE_SELF, epson_pf10_device, pinc_w))
-MACHINE_CONFIG_END
+ EPSON_SIO(config, m_sio_output, nullptr);
+ m_sio_output->rx_callback().set(DEVICE_SELF, FUNC(epson_pf10_device::rxc_w));
+ m_sio_output->pin_callback().set(DEVICE_SELF, FUNC(epson_pf10_device::pinc_w));
+}
//**************************************************************************
@@ -92,7 +92,9 @@ epson_pf10_device::epson_pf10_device(const machine_config &mconfig, const char *
device_epson_sio_interface(mconfig, *this),
m_cpu(*this, "maincpu"),
m_fdc(*this, "upd765a"),
- m_sio_output(*this, "sio"), m_floppy(nullptr), m_timer(nullptr),
+ m_sio_output(*this, "sio"),
+ m_floppy(*this, "upd765a:0"),
+ m_timer(nullptr),
m_port1(0xff),
m_port2(0xff),
m_rxc(1), m_hd6303_tx(0), m_pinc(0)
@@ -108,7 +110,6 @@ epson_pf10_device::epson_pf10_device(const machine_config &mconfig, const char *
void epson_pf10_device::device_start()
{
m_timer = timer_alloc(0, nullptr);
- m_floppy = subdevice<floppy_connector>("upd765a:0")->get_device();
}
//-------------------------------------------------
@@ -158,7 +159,8 @@ READ8_MEMBER( epson_pf10_device::port2_r )
WRITE8_MEMBER( epson_pf10_device::port2_w )
{
- m_floppy->mon_w(data & PORT2_MON);
+ if (m_floppy->get_device() != nullptr)
+ m_floppy->get_device()->mon_w(data & PORT2_MON);
logerror("%s: port2_w(%02x)\n", tag(), data);
}
diff --git a/src/devices/bus/epson_sio/pf10.h b/src/devices/bus/epson_sio/pf10.h
index b75f596b615..7f305bed8c9 100644
--- a/src/devices/bus/epson_sio/pf10.h
+++ b/src/devices/bus/epson_sio/pf10.h
@@ -15,6 +15,7 @@
#include "epson_sio.h"
#include "cpu/m6800/m6801.h"
+#include "imagedev/floppy.h"
#include "machine/upd765.h"
@@ -67,9 +68,9 @@ private:
required_device<hd6303y_cpu_device> m_cpu;
required_device<upd765a_device> m_fdc;
required_device<epson_sio_device> m_sio_output;
+ required_device<floppy_connector> m_floppy;
epson_sio_device *m_sio_input;
- floppy_image_device *m_floppy;
emu_timer *m_timer;
diff --git a/src/devices/bus/epson_sio/tf20.cpp b/src/devices/bus/epson_sio/tf20.cpp
index 22959af2730..1fb12a66c0e 100644
--- a/src/devices/bus/epson_sio/tf20.cpp
+++ b/src/devices/bus/epson_sio/tf20.cpp
@@ -14,7 +14,6 @@
#include "emu.h"
#include "tf20.h"
-#include "imagedev/floppy.h"
#define XTAL_CR1 XTAL(8'000'000)
#define XTAL_CR2 XTAL(4'915'200)
@@ -87,11 +86,12 @@ static void tf20_floppies(device_slot_interface &device)
device.option_add("sd320", EPSON_SD_320);
}
-MACHINE_CONFIG_START(epson_tf20_device::device_add_mconfig)
- MCFG_DEVICE_ADD("19b", Z80, XTAL_CR1 / 2) /* uPD780C */
- MCFG_DEVICE_PROGRAM_MAP(cpu_mem)
- MCFG_DEVICE_IO_MAP(cpu_io)
- MCFG_DEVICE_IRQ_ACKNOWLEDGE_DEVICE(DEVICE_SELF, epson_tf20_device, irq_callback)
+void epson_tf20_device::device_add_mconfig(machine_config &config)
+{
+ Z80(config, m_cpu, XTAL_CR1 / 2); /* uPD780C */
+ m_cpu->set_addrmap(AS_PROGRAM, &epson_tf20_device::cpu_mem);
+ m_cpu->set_addrmap(AS_IO, &epson_tf20_device::cpu_io);
+ m_cpu->set_irq_acknowledge_callback(FUNC(epson_tf20_device::irq_callback));
// 64k internal ram
RAM(config, "ram").set_default_size("64K");
@@ -106,14 +106,14 @@ MACHINE_CONFIG_START(epson_tf20_device::device_add_mconfig)
m_fdc->intrq_wr_callback().set_inputline(m_cpu, INPUT_LINE_IRQ0);
// floppy drives
- MCFG_FLOPPY_DRIVE_ADD("5a:0", tf20_floppies, "sd320", floppy_image_device::default_floppy_formats)
- MCFG_FLOPPY_DRIVE_ADD("5a:1", tf20_floppies, "sd320", floppy_image_device::default_floppy_formats)
+ for (auto &fd : m_fd)
+ FLOPPY_CONNECTOR(config, fd, tf20_floppies, "sd320", floppy_image_device::default_floppy_formats);
// serial interface to another device
- MCFG_EPSON_SIO_ADD("sio", nullptr)
- MCFG_EPSON_SIO_RX(WRITELINE(DEVICE_SELF, epson_tf20_device, rxc_w))
- MCFG_EPSON_SIO_PIN(WRITELINE(DEVICE_SELF, epson_tf20_device, pinc_w))
-MACHINE_CONFIG_END
+ EPSON_SIO(config, m_sio_output, nullptr);
+ m_sio_output->rx_callback().set(DEVICE_SELF, FUNC(epson_tf20_device::rxc_w));
+ m_sio_output->pin_callback().set(DEVICE_SELF, FUNC(epson_tf20_device::pinc_w));
+}
//**************************************************************************
@@ -131,7 +131,9 @@ epson_tf20_device::epson_tf20_device(const machine_config &mconfig, const char *
m_ram(*this, "ram"),
m_fdc(*this, "5a"),
m_mpsc(*this, "3a"),
- m_sio_output(*this, "sio"), m_fd0(nullptr), m_fd1(nullptr), m_timer_serial(nullptr), m_timer_tc(nullptr),
+ m_sio_output(*this, "sio"),
+ m_fd(*this, "5a:%u", 0U),
+ m_timer_serial(nullptr), m_timer_tc(nullptr),
m_rxc(1), m_txda(0), m_dtra(0), m_pinc(0)
{
m_sio_input = dynamic_cast<epson_sio_device *>(owner);
@@ -150,9 +152,6 @@ void epson_tf20_device::device_start()
m_timer_serial = timer_alloc(0, nullptr);
m_timer_tc = timer_alloc(1, nullptr);
- m_fd0 = subdevice<floppy_connector>("5a:0")->get_device();
- m_fd1 = subdevice<floppy_connector>("5a:1")->get_device();
-
// enable second half of ram
m_cpu->space(AS_PROGRAM).install_ram(0x8000, 0xffff, m_ram->pointer() + 0x8000);
@@ -248,8 +247,9 @@ WRITE8_MEMBER( epson_tf20_device::fdc_control_w )
logerror("%s: tf20_fdc_control_w(%02x)\n", machine().describe_context(), data);
// bit 0, motor on signal
- m_fd0->mon_w(!BIT(data, 0));
- m_fd1->mon_w(!BIT(data, 0));
+ for (auto &fd : m_fd)
+ if (fd->get_device() != nullptr)
+ fd->get_device()->mon_w(!BIT(data, 0));
}
diff --git a/src/devices/bus/epson_sio/tf20.h b/src/devices/bus/epson_sio/tf20.h
index 0a9023f51d5..236cd2e9059 100644
--- a/src/devices/bus/epson_sio/tf20.h
+++ b/src/devices/bus/epson_sio/tf20.h
@@ -15,6 +15,7 @@
#include "epson_sio.h"
#include "cpu/z80/z80.h"
+#include "imagedev/floppy.h"
#include "machine/ram.h"
#include "machine/upd765.h"
#include "machine/z80dart.h"
@@ -67,9 +68,7 @@ private:
required_device<upd765a_device> m_fdc;
required_device<upd7201_device> m_mpsc;
required_device<epson_sio_device> m_sio_output;
-
- floppy_image_device *m_fd0;
- floppy_image_device *m_fd1;
+ required_device_array<floppy_connector, 2> m_fd;
emu_timer *m_timer_serial;
emu_timer *m_timer_tc;
diff --git a/src/devices/bus/gamate/rom.cpp b/src/devices/bus/gamate/rom.cpp
index cda37716b5f..74af9e76160 100644
--- a/src/devices/bus/gamate/rom.cpp
+++ b/src/devices/bus/gamate/rom.cpp
@@ -168,9 +168,10 @@ WRITE8_MEMBER(gamate_rom_4in1_device::write_rom)
}
}
-MACHINE_CONFIG_START(gamate_rom_plain_device::device_add_mconfig)
- MCFG_DEVICE_ADD("protection", GAMATE_PROT, 0)
-MACHINE_CONFIG_END
+void gamate_rom_plain_device::device_add_mconfig(machine_config &config)
+{
+ GAMATE_PROT(config, m_protection, 0);
+}
/*-------------------------------------------------
diff --git a/src/devices/bus/gamate/slot.h b/src/devices/bus/gamate/slot.h
index 0f48c490478..3606ac32c69 100644
--- a/src/devices/bus/gamate/slot.h
+++ b/src/devices/bus/gamate/slot.h
@@ -51,7 +51,17 @@ class gamate_cart_slot_device : public device_t,
{
public:
// construction/destruction
- gamate_cart_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+ template <typename T>
+ gamate_cart_slot_device(machine_config const &mconfig, char const *tag, device_t *owner, T &&opts, char const *dflt)
+ : gamate_cart_slot_device(mconfig, tag, owner, 0)
+ {
+ option_reset();
+ opts(*this);
+ set_default_option(dflt);
+ set_fixed(false);
+ }
+
+ gamate_cart_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock = 0);
virtual ~gamate_cart_slot_device();
// image-level overrides
@@ -95,10 +105,6 @@ DECLARE_DEVICE_TYPE(GAMATE_CART_SLOT, gamate_cart_slot_device)
#define GAMATESLOT_ROM_REGION_TAG ":cart:rom"
-#define MCFG_GAMATE_CARTRIDGE_ADD(_tag,_slot_intf,_def_slot) \
- MCFG_DEVICE_ADD(_tag, GAMATE_CART_SLOT, 0) \
- MCFG_DEVICE_SLOT_INTERFACE(_slot_intf, _def_slot, false)
-
void gamate_cart(device_slot_interface &device);
#endif // MAME_BUS_GAMATE_SLOT_H
diff --git a/src/devices/bus/gameboy/gb_slot.cpp b/src/devices/bus/gameboy/gb_slot.cpp
index 7ce626e67c7..a72eedc24d5 100644
--- a/src/devices/bus/gameboy/gb_slot.cpp
+++ b/src/devices/bus/gameboy/gb_slot.cpp
@@ -624,18 +624,18 @@ std::string megaduck_cart_slot_device::get_default_card_software(get_default_car
read
-------------------------------------------------*/
-READ8_MEMBER(gb_cart_slot_device_base::read_rom)
+uint8_t gb_cart_slot_device_base::read_rom(offs_t offset)
{
if (m_cart)
- return m_cart->read_rom(space, offset);
+ return m_cart->read_rom(offset);
else
return 0xff;
}
-READ8_MEMBER(gb_cart_slot_device_base::read_ram)
+uint8_t gb_cart_slot_device_base::read_ram(offs_t offset)
{
if (m_cart)
- return m_cart->read_ram(space, offset);
+ return m_cart->read_ram(offset);
else
return 0xff;
}
@@ -645,16 +645,16 @@ READ8_MEMBER(gb_cart_slot_device_base::read_ram)
write
-------------------------------------------------*/
-WRITE8_MEMBER(gb_cart_slot_device_base::write_bank)
+void gb_cart_slot_device_base::write_bank(offs_t offset, uint8_t data)
{
if (m_cart)
- m_cart->write_bank(space, offset, data);
+ m_cart->write_bank(offset, data);
}
-WRITE8_MEMBER(gb_cart_slot_device_base::write_ram)
+void gb_cart_slot_device_base::write_ram(offs_t offset, uint8_t data)
{
if (m_cart)
- m_cart->write_ram(space, offset, data);
+ m_cart->write_ram(offset, data);
}
diff --git a/src/devices/bus/gameboy/gb_slot.h b/src/devices/bus/gameboy/gb_slot.h
index ef734e6f99e..5f420c60823 100644
--- a/src/devices/bus/gameboy/gb_slot.h
+++ b/src/devices/bus/gameboy/gb_slot.h
@@ -58,10 +58,10 @@ public:
virtual ~device_gb_cart_interface();
// reading and writing
- virtual DECLARE_READ8_MEMBER(read_rom) { return 0xff; }
- virtual DECLARE_WRITE8_MEMBER(write_bank) {}
- virtual DECLARE_READ8_MEMBER(read_ram) { return 0xff; }
- virtual DECLARE_WRITE8_MEMBER(write_ram) {}
+ virtual uint8_t read_rom(offs_t offset) { return 0xff; }
+ virtual void write_bank(offs_t offset, uint8_t data) {}
+ virtual uint8_t read_ram(offs_t offset) { return 0xff; }
+ virtual void write_ram(offs_t offset, uint8_t data) {}
void rom_alloc(uint32_t size, const char *tag);
void ram_alloc(uint32_t size);
@@ -145,10 +145,10 @@ public:
virtual std::string get_default_card_software(get_default_card_software_hook &hook) const override;
// reading and writing
- virtual DECLARE_READ8_MEMBER(read_rom);
- virtual DECLARE_WRITE8_MEMBER(write_bank);
- virtual DECLARE_READ8_MEMBER(read_ram);
- virtual DECLARE_WRITE8_MEMBER(write_ram);
+ virtual uint8_t read_rom(offs_t offset);
+ virtual void write_bank(offs_t offset, uint8_t data);
+ virtual uint8_t read_ram(offs_t offset);
+ virtual void write_ram(offs_t offset, uint8_t data);
protected:
diff --git a/src/devices/bus/gameboy/mbc.cpp b/src/devices/bus/gameboy/mbc.cpp
index 286c2d90a1e..bd57a4da23b 100644
--- a/src/devices/bus/gameboy/mbc.cpp
+++ b/src/devices/bus/gameboy/mbc.cpp
@@ -347,12 +347,12 @@ void gb_rom_camera_device::device_reset()
mapper specific handlers
-------------------------------------------------*/
-READ8_MEMBER(gb_rom_mbc_device::read_rom)
+uint8_t gb_rom_mbc_device::read_rom(offs_t offset)
{
return m_rom[rom_bank_map[m_latch_bank] + offset];
}
-READ8_MEMBER(gb_rom_mbc_device::read_ram)
+uint8_t gb_rom_mbc_device::read_ram(offs_t offset)
{
if (!m_ram.empty())
return m_ram[ram_bank_map[m_ram_bank] * 0x2000 + offset];
@@ -360,7 +360,7 @@ READ8_MEMBER(gb_rom_mbc_device::read_ram)
return 0xff;
}
-WRITE8_MEMBER(gb_rom_mbc_device::write_ram)
+void gb_rom_mbc_device::write_ram(offs_t offset, uint8_t data)
{
if (!m_ram.empty())
m_ram[ram_bank_map[m_ram_bank] * 0x2000 + offset] = data;
@@ -369,7 +369,7 @@ WRITE8_MEMBER(gb_rom_mbc_device::write_ram)
// MBC1
-READ8_MEMBER(gb_rom_mbc1_device::read_rom)
+uint8_t gb_rom_mbc1_device::read_rom(offs_t offset)
{
if (offset & 0x4000) /* RB1 */
return m_rom[rom_bank_map[(m_ram_bank << (5 + m_shift)) | m_latch_bank2] * 0x4000 + (offset & 0x3fff)];
@@ -380,7 +380,7 @@ READ8_MEMBER(gb_rom_mbc1_device::read_rom)
}
}
-WRITE8_MEMBER(gb_rom_mbc1_device::write_bank)
+void gb_rom_mbc1_device::write_bank(offs_t offset, uint8_t data)
{
// the mapper only uses inputs A15..A13
switch (offset & 0xe000)
@@ -402,7 +402,7 @@ WRITE8_MEMBER(gb_rom_mbc1_device::write_bank)
}
}
-READ8_MEMBER(gb_rom_mbc1_device::read_ram)
+uint8_t gb_rom_mbc1_device::read_ram(offs_t offset)
{
if (!m_ram.empty() && m_ram_enable)
{
@@ -413,7 +413,7 @@ READ8_MEMBER(gb_rom_mbc1_device::read_ram)
return 0xff;
}
-WRITE8_MEMBER(gb_rom_mbc1_device::write_ram)
+void gb_rom_mbc1_device::write_ram(offs_t offset, uint8_t data)
{
if (!m_ram.empty() && m_ram_enable)
{
@@ -425,7 +425,7 @@ WRITE8_MEMBER(gb_rom_mbc1_device::write_ram)
// MBC2
-READ8_MEMBER(gb_rom_mbc2_device::read_rom)
+uint8_t gb_rom_mbc2_device::read_rom(offs_t offset)
{
if (offset & 0x4000) /* RB1 */
return m_rom[rom_bank_map[m_latch_bank2] * 0x4000 + (offset & 0x3fff)];
@@ -433,7 +433,7 @@ READ8_MEMBER(gb_rom_mbc2_device::read_rom)
return m_rom[rom_bank_map[m_latch_bank] * 0x4000 + (offset & 0x3fff)];
}
-WRITE8_MEMBER(gb_rom_mbc2_device::write_bank)
+void gb_rom_mbc2_device::write_bank(offs_t offset, uint8_t data)
{
// the mapper only has data lines D3..D0
data &= 0x0f;
@@ -450,7 +450,7 @@ WRITE8_MEMBER(gb_rom_mbc2_device::write_bank)
}
}
-READ8_MEMBER(gb_rom_mbc2_device::read_ram)
+uint8_t gb_rom_mbc2_device::read_ram(offs_t offset)
{
if (!m_ram.empty() && m_ram_enable)
return m_ram[ram_bank_map[m_ram_bank] * 0x2000 + (offset & 0x01ff)] | 0xf0;
@@ -458,7 +458,7 @@ READ8_MEMBER(gb_rom_mbc2_device::read_ram)
return 0xff;
}
-WRITE8_MEMBER(gb_rom_mbc2_device::write_ram)
+void gb_rom_mbc2_device::write_ram(offs_t offset, uint8_t data)
{
if (!m_ram.empty() && m_ram_enable)
m_ram[ram_bank_map[m_ram_bank] * 0x2000 + (offset & 0x01ff)] = data & 0x0f;
@@ -479,7 +479,7 @@ void gb_rom_mbc3_device::update_rtc()
m_rtc_regs[4] = (m_rtc_regs[4] & 0xf0) | (curtime.local_time.day >> 8);
}
-READ8_MEMBER(gb_rom_mbc3_device::read_rom)
+uint8_t gb_rom_mbc3_device::read_rom(offs_t offset)
{
if (offset < 0x4000)
return m_rom[rom_bank_map[m_latch_bank] * 0x4000 + (offset & 0x3fff)];
@@ -487,7 +487,7 @@ READ8_MEMBER(gb_rom_mbc3_device::read_rom)
return m_rom[rom_bank_map[m_latch_bank2] * 0x4000 + (offset & 0x3fff)];
}
-WRITE8_MEMBER(gb_rom_mbc3_device::write_bank)
+void gb_rom_mbc3_device::write_bank(offs_t offset, uint8_t data)
{
if (offset < 0x2000)
m_ram_enable = ((data & 0x0f) == 0x0a) ? 1 : 0;
@@ -517,7 +517,7 @@ WRITE8_MEMBER(gb_rom_mbc3_device::write_bank)
}
}
-READ8_MEMBER(gb_rom_mbc3_device::read_ram)
+uint8_t gb_rom_mbc3_device::read_ram(offs_t offset)
{
if (m_ram_bank < 4 && m_ram_enable)
{
@@ -534,7 +534,7 @@ READ8_MEMBER(gb_rom_mbc3_device::read_ram)
return 0xff;
}
-WRITE8_MEMBER(gb_rom_mbc3_device::write_ram)
+void gb_rom_mbc3_device::write_ram(offs_t offset, uint8_t data)
{
if (m_ram_bank < 4 && m_ram_enable)
{
@@ -552,7 +552,7 @@ WRITE8_MEMBER(gb_rom_mbc3_device::write_ram)
// MBC5
-READ8_MEMBER(gb_rom_mbc5_device::read_rom)
+uint8_t gb_rom_mbc5_device::read_rom(offs_t offset)
{
if (offset < 0x4000)
return m_rom[rom_bank_map[m_latch_bank] * 0x4000 + (offset & 0x3fff)];
@@ -560,7 +560,7 @@ READ8_MEMBER(gb_rom_mbc5_device::read_rom)
return m_rom[rom_bank_map[m_latch_bank2] * 0x4000 + (offset & 0x3fff)];
}
-WRITE8_MEMBER(gb_rom_mbc5_device::write_bank)
+void gb_rom_mbc5_device::write_bank(offs_t offset, uint8_t data)
{
if (offset < 0x2000)
m_ram_enable = ((data & 0x0f) == 0x0a) ? 1 : 0;
@@ -588,7 +588,7 @@ WRITE8_MEMBER(gb_rom_mbc5_device::write_bank)
}
}
-READ8_MEMBER(gb_rom_mbc5_device::read_ram)
+uint8_t gb_rom_mbc5_device::read_ram(offs_t offset)
{
if (!m_ram.empty() && m_ram_enable)
return m_ram[ram_bank_map[m_ram_bank] * 0x2000 + (offset & 0x1fff)];
@@ -596,7 +596,7 @@ READ8_MEMBER(gb_rom_mbc5_device::read_ram)
return 0xff;
}
-WRITE8_MEMBER(gb_rom_mbc5_device::write_ram)
+void gb_rom_mbc5_device::write_ram(offs_t offset, uint8_t data)
{
if (!m_ram.empty() && m_ram_enable)
m_ram[ram_bank_map[m_ram_bank] * 0x2000 + (offset & 0x1fff)] = data;
@@ -604,7 +604,7 @@ WRITE8_MEMBER(gb_rom_mbc5_device::write_ram)
// MBC6
-READ8_MEMBER(gb_rom_mbc6_device::read_rom)
+uint8_t gb_rom_mbc6_device::read_rom(offs_t offset)
{
if (offset < 0x4000)
return m_rom[rom_bank_map[m_latch_bank] * 0x4000 + (offset & 0x3fff)];
@@ -614,7 +614,7 @@ READ8_MEMBER(gb_rom_mbc6_device::read_rom)
return m_rom[rom_bank_map[m_bank_6000 >> 1] * 0x4000 + (m_bank_6000 & 0x01) * 0x2000 + (offset & 0x1fff)];
}
-WRITE8_MEMBER(gb_rom_mbc6_device::write_bank)
+void gb_rom_mbc6_device::write_bank(offs_t offset, uint8_t data)
{
if (offset < 0x2000)
{
@@ -636,7 +636,7 @@ WRITE8_MEMBER(gb_rom_mbc6_device::write_bank)
}
}
-READ8_MEMBER(gb_rom_mbc6_device::read_ram)
+uint8_t gb_rom_mbc6_device::read_ram(offs_t offset)
{
if (!m_ram.empty())
return m_ram[ram_bank_map[m_ram_bank] * 0x2000 + (offset & 0x1fff)];
@@ -644,7 +644,7 @@ READ8_MEMBER(gb_rom_mbc6_device::read_ram)
return 0xff;
}
-WRITE8_MEMBER(gb_rom_mbc6_device::write_ram)
+void gb_rom_mbc6_device::write_ram(offs_t offset, uint8_t data)
{
if (!m_ram.empty())
m_ram[ram_bank_map[m_ram_bank] * 0x2000 + (offset & 0x1fff)] = data;
@@ -652,7 +652,7 @@ WRITE8_MEMBER(gb_rom_mbc6_device::write_ram)
// MBC7
-READ8_MEMBER(gb_rom_mbc7_device::read_rom)
+uint8_t gb_rom_mbc7_device::read_rom(offs_t offset)
{
if (offset < 0x4000)
return m_rom[rom_bank_map[m_latch_bank] * 0x4000 + (offset & 0x3fff)];
@@ -660,7 +660,7 @@ READ8_MEMBER(gb_rom_mbc7_device::read_rom)
return m_rom[rom_bank_map[m_latch_bank2] * 0x4000 + (offset & 0x3fff)];
}
-WRITE8_MEMBER(gb_rom_mbc7_device::write_bank)
+void gb_rom_mbc7_device::write_bank(offs_t offset, uint8_t data)
{
if (offset < 0x2000)
{
@@ -693,7 +693,7 @@ WRITE8_MEMBER(gb_rom_mbc7_device::write_bank)
}
}
-READ8_MEMBER(gb_rom_mbc7_device::read_ram)
+uint8_t gb_rom_mbc7_device::read_ram(offs_t offset)
{
if (!m_ram.empty())
return m_ram[ram_bank_map[m_ram_bank] * 0x2000 + (offset & 0x1fff)];
@@ -701,7 +701,7 @@ READ8_MEMBER(gb_rom_mbc7_device::read_ram)
return 0xff;
}
-WRITE8_MEMBER(gb_rom_mbc7_device::write_ram)
+void gb_rom_mbc7_device::write_ram(offs_t offset, uint8_t data)
{
if (!m_ram.empty())
m_ram[ram_bank_map[m_ram_bank] * 0x2000 + (offset & 0x1fff)] = data;
@@ -710,12 +710,12 @@ WRITE8_MEMBER(gb_rom_mbc7_device::write_ram)
// M161
-READ8_MEMBER(gb_rom_m161_device::read_rom)
+uint8_t gb_rom_m161_device::read_rom(offs_t offset)
{
return m_rom[rom_bank_map[m_base_bank] * 0x4000 + (offset & 0x7fff)];
}
-WRITE8_MEMBER(gb_rom_m161_device::write_bank)
+void gb_rom_m161_device::write_bank(offs_t offset, uint8_t data)
{
// the mapper (74HC161A) only has data lines D2..D0
data &= 0x07;
@@ -736,7 +736,7 @@ WRITE8_MEMBER(gb_rom_m161_device::write_bank)
// MMM01
-READ8_MEMBER(gb_rom_mmm01_device::read_rom)
+uint8_t gb_rom_mmm01_device::read_rom(offs_t offset)
{
uint16_t romb = m_romb & ~(0x1e0 | m_romb_nwe);
uint16_t romb_base = m_romb & (0x1e0 | m_romb_nwe);
@@ -765,7 +765,7 @@ READ8_MEMBER(gb_rom_mmm01_device::read_rom)
return m_rom[rom_bank_map[romb] * 0x4000 + (offset & 0x3fff)];
}
-WRITE8_MEMBER(gb_rom_mmm01_device::write_bank)
+void gb_rom_mmm01_device::write_bank(offs_t offset, uint8_t data)
{
// the mapper only has data lines D6..D0
data &= 0x7f;
@@ -810,7 +810,7 @@ WRITE8_MEMBER(gb_rom_mmm01_device::write_bank)
}
}
-READ8_MEMBER(gb_rom_mmm01_device::read_ram)
+uint8_t gb_rom_mmm01_device::read_ram(offs_t offset)
{
uint8_t ramb_masked = ((offset & 0x4000) | m_mode ? m_ramb : m_ramb & ~0x03);
uint8_t ramb = ramb_masked;
@@ -827,7 +827,7 @@ READ8_MEMBER(gb_rom_mmm01_device::read_ram)
return 0xff;
}
-WRITE8_MEMBER(gb_rom_mmm01_device::write_ram)
+void gb_rom_mmm01_device::write_ram(offs_t offset, uint8_t data)
{
uint8_t ramb_masked = ((offset & 0x4000) | m_mode ? m_ramb : m_ramb & ~0x03);
uint8_t ramb = ramb_masked;
@@ -844,7 +844,7 @@ WRITE8_MEMBER(gb_rom_mmm01_device::write_ram)
// Sachen MMC1
-READ8_MEMBER(gb_rom_sachen_mmc1_device::read_rom)
+uint8_t gb_rom_sachen_mmc1_device::read_rom(offs_t offset)
{
uint16_t off_edit = offset;
@@ -875,7 +875,7 @@ READ8_MEMBER(gb_rom_sachen_mmc1_device::read_rom)
return m_rom[rom_bank_map[(m_base_bank & m_mask) | (m_latch_bank & ~m_mask)] * 0x4000 + (off_edit & 0x3fff)];
}
-WRITE8_MEMBER(gb_rom_sachen_mmc1_device::write_bank)
+void gb_rom_sachen_mmc1_device::write_bank(offs_t offset, uint8_t data)
{
/* Only A15..A6, A4, A1..A0 are connected */
/* We only decode upper three bits */
@@ -916,7 +916,7 @@ WRITE8_MEMBER(gb_rom_sachen_mmc1_device::write_bank)
// Sachen MMC2
-READ8_MEMBER(gb_rom_sachen_mmc2_device::read_rom)
+uint8_t gb_rom_sachen_mmc2_device::read_rom(offs_t offset)
{
uint16_t off_edit = offset;
@@ -954,7 +954,7 @@ READ8_MEMBER(gb_rom_sachen_mmc2_device::read_rom)
return m_rom[rom_bank_map[(m_base_bank & m_mask) | (m_latch_bank & ~m_mask)] * 0x4000 + (off_edit & 0x3fff)];
}
-READ8_MEMBER(gb_rom_sachen_mmc2_device::read_ram)
+uint8_t gb_rom_sachen_mmc2_device::read_ram(offs_t offset)
{
if (m_mode == MODE_LOCKED_DMG) {
m_unlock_cnt = 0x00;
@@ -964,7 +964,7 @@ READ8_MEMBER(gb_rom_sachen_mmc2_device::read_ram)
}
-WRITE8_MEMBER(gb_rom_sachen_mmc2_device::write_ram)
+void gb_rom_sachen_mmc2_device::write_ram(offs_t offset, uint8_t data)
{
if (m_mode == MODE_LOCKED_DMG) {
m_unlock_cnt = 0x00;
@@ -976,7 +976,7 @@ WRITE8_MEMBER(gb_rom_sachen_mmc2_device::write_ram)
// 188 in 1 pirate (only preliminary)
-READ8_MEMBER(gb_rom_188in1_device::read_rom)
+uint8_t gb_rom_188in1_device::read_rom(offs_t offset)
{
if (offset < 0x4000)
return m_rom[m_game_base + rom_bank_map[m_latch_bank] * 0x4000 + (offset & 0x3fff)];
@@ -984,7 +984,7 @@ READ8_MEMBER(gb_rom_188in1_device::read_rom)
return m_rom[m_game_base + rom_bank_map[m_latch_bank2] * 0x4000 + (offset & 0x3fff)];
}
-WRITE8_MEMBER(gb_rom_188in1_device::write_bank)
+void gb_rom_188in1_device::write_bank(offs_t offset, uint8_t data)
{
if (offset == 0x7b00)
{
@@ -1003,24 +1003,24 @@ WRITE8_MEMBER(gb_rom_188in1_device::write_bank)
printf("write to 0x%X data 0x%X\n", offset, data);
}
else
- gb_rom_mbc1_device::write_bank(space, offset, data);
+ gb_rom_mbc1_device::write_bank(offset, data);
}
// MBC5 variant used by Li Cheng / Niutoude games
-WRITE8_MEMBER(gb_rom_licheng_device::write_bank)
+void gb_rom_licheng_device::write_bank(offs_t offset, uint8_t data)
{
if (offset > 0x2100 && offset < 0x3000)
return;
- gb_rom_mbc5_device::write_bank(space, offset, data);
+ gb_rom_mbc5_device::write_bank(offset, data);
}
// MBC5 variant used by Chong Wu Xiao Jing Ling (this appears to be a re-release of a Li Cheng / Niutoude game,
// given that it contains the Niutoude logo, with most protection checks patched out)
-READ8_MEMBER(gb_rom_chongwu_device::read_rom)
+uint8_t gb_rom_chongwu_device::read_rom(offs_t offset)
{
// protection check at the first read here...
if (offset == 0x41c3 && !m_protection_checked)
@@ -1056,7 +1056,7 @@ void gb_rom_sintax_device::set_xor_for_bank(uint8_t bank)
}
}
-READ8_MEMBER(gb_rom_sintax_device::read_rom)
+uint8_t gb_rom_sintax_device::read_rom(offs_t offset)
{
if (offset < 0x4000)
return m_rom[rom_bank_map[m_latch_bank] * 0x4000 + (offset & 0x3fff)];
@@ -1064,7 +1064,7 @@ READ8_MEMBER(gb_rom_sintax_device::read_rom)
return m_rom[rom_bank_map[m_latch_bank2] * 0x4000 + (offset & 0x3fff)] ^ m_currentxor;
}
-WRITE8_MEMBER(gb_rom_sintax_device::write_bank)
+void gb_rom_sintax_device::write_bank(offs_t offset, uint8_t data)
{
if (offset < 0x2000)
m_ram_enable = ((data & 0x0f) == 0x0a) ? 1 : 0;
@@ -1113,7 +1113,7 @@ WRITE8_MEMBER(gb_rom_sintax_device::write_bank)
if (!m_sintax_mode)
{
m_sintax_mode = data;
- write_bank(space, 0x2000, 1); //force a fake bank switch
+ write_bank(0x2000, 1); //force a fake bank switch
}
// printf("sintax mode %x\n", m_sintax_mode & 0xf);
}
@@ -1141,7 +1141,7 @@ WRITE8_MEMBER(gb_rom_sintax_device::write_bank)
}
-READ8_MEMBER(gb_rom_sintax_device::read_ram)
+uint8_t gb_rom_sintax_device::read_ram(offs_t offset)
{
if (!m_ram.empty() && m_ram_enable)
return m_ram[ram_bank_map[m_ram_bank] * 0x2000 + (offset & 0x1fff)];
@@ -1149,7 +1149,7 @@ READ8_MEMBER(gb_rom_sintax_device::read_ram)
return 0xff;
}
-WRITE8_MEMBER(gb_rom_sintax_device::write_ram)
+void gb_rom_sintax_device::write_ram(offs_t offset, uint8_t data)
{
if (!m_ram.empty() && m_ram_enable)
m_ram[ram_bank_map[m_ram_bank] * 0x2000 + (offset & 0x1fff)] = data;
@@ -1169,7 +1169,7 @@ WRITE8_MEMBER(gb_rom_sintax_device::write_ram)
// MBC5 variant used by Digimon 2 (and maybe 4?)
-READ8_MEMBER(gb_rom_digimon_device::read_rom)
+uint8_t gb_rom_digimon_device::read_rom(offs_t offset)
{
if (offset < 0x4000)
return m_rom[rom_bank_map[m_latch_bank] * 0x4000 + (offset & 0x3fff)];
@@ -1177,7 +1177,7 @@ READ8_MEMBER(gb_rom_digimon_device::read_rom)
return m_rom[rom_bank_map[m_latch_bank2] * 0x4000 + (offset & 0x3fff)];
}
-WRITE8_MEMBER(gb_rom_digimon_device::write_bank)
+void gb_rom_digimon_device::write_bank(offs_t offset, uint8_t data)
{
if (offset < 0x2000)
m_ram_enable = ((data & 0x0f) == 0x0a) ? 1 : 0;
@@ -1206,7 +1206,7 @@ WRITE8_MEMBER(gb_rom_digimon_device::write_bank)
// printf("written $07 %X at %X\n", data, offset);
}
-READ8_MEMBER(gb_rom_digimon_device::read_ram)
+uint8_t gb_rom_digimon_device::read_ram(offs_t offset)
{
if (!m_ram.empty() && m_ram_enable)
return m_ram[ram_bank_map[m_ram_bank] * 0x2000 + (offset & 0x1fff)];
@@ -1214,7 +1214,7 @@ READ8_MEMBER(gb_rom_digimon_device::read_ram)
return 0xff;
}
-WRITE8_MEMBER(gb_rom_digimon_device::write_ram)
+void gb_rom_digimon_device::write_ram(offs_t offset, uint8_t data)
{
if (!m_ram.empty() && m_ram_enable)
m_ram[ram_bank_map[m_ram_bank] * 0x2000 + (offset & 0x1fff)] = data;
@@ -1223,7 +1223,7 @@ WRITE8_MEMBER(gb_rom_digimon_device::write_ram)
// MBC1 variant used by Yong Yong for Rockman 8
-READ8_MEMBER(gb_rom_rockman8_device::read_rom)
+uint8_t gb_rom_rockman8_device::read_rom(offs_t offset)
{
if (offset < 0x4000)
return m_rom[m_latch_bank * 0x4000 + (offset & 0x3fff)];
@@ -1231,7 +1231,7 @@ READ8_MEMBER(gb_rom_rockman8_device::read_rom)
return m_rom[m_latch_bank2 * 0x4000 + (offset & 0x3fff)];
}
-WRITE8_MEMBER(gb_rom_rockman8_device::write_bank)
+void gb_rom_rockman8_device::write_bank(offs_t offset, uint8_t data)
{
if (offset < 0x2000)
return;
@@ -1248,7 +1248,7 @@ WRITE8_MEMBER(gb_rom_rockman8_device::write_bank)
}
}
-READ8_MEMBER(gb_rom_rockman8_device::read_ram)
+uint8_t gb_rom_rockman8_device::read_ram(offs_t offset)
{
if (!m_ram.empty())
return m_ram[offset];
@@ -1256,7 +1256,7 @@ READ8_MEMBER(gb_rom_rockman8_device::read_ram)
return 0xff;
}
-WRITE8_MEMBER(gb_rom_rockman8_device::write_ram)
+void gb_rom_rockman8_device::write_ram(offs_t offset, uint8_t data)
{
if (!m_ram.empty())
m_ram[offset] = data;
@@ -1291,7 +1291,7 @@ static uint8_t smb3_table1[0x20] =
// however, no such a write ever happen (only bit4 is written, but changing mode with
// bit4 breaks the gfx...)
-READ8_MEMBER(gb_rom_sm3sp_device::read_rom)
+uint8_t gb_rom_sm3sp_device::read_rom(offs_t offset)
{
if (offset < 0x4000)
return m_rom[rom_bank_map[0] * 0x4000 + (offset & 0x3fff)];
@@ -1299,7 +1299,7 @@ READ8_MEMBER(gb_rom_sm3sp_device::read_rom)
return m_rom[m_latch_bank2 * 0x4000 + (offset & 0x3fff)];
}
-WRITE8_MEMBER(gb_rom_sm3sp_device::write_bank)
+void gb_rom_sm3sp_device::write_bank(offs_t offset, uint8_t data)
{
// printf("write 0x%x at %x\n", data, offset);
if (offset < 0x2000)
@@ -1352,11 +1352,11 @@ WRITE8_MEMBER(gb_rom_sm3sp_device::write_bank)
{
// printf("write mode %x\n", data);
m_mode = BIT(data, 5);
-// write_bank(space, 0x2000, 1);
+// write_bank(0x2000, 1);
}
}
-READ8_MEMBER(gb_rom_sm3sp_device::read_ram)
+uint8_t gb_rom_sm3sp_device::read_ram(offs_t offset)
{
if (!m_ram.empty())
return m_ram[offset];
@@ -1364,7 +1364,7 @@ READ8_MEMBER(gb_rom_sm3sp_device::read_ram)
return 0xff;
}
-WRITE8_MEMBER(gb_rom_sm3sp_device::write_ram)
+void gb_rom_sm3sp_device::write_ram(offs_t offset, uint8_t data)
{
if (!m_ram.empty())
m_ram[offset] = data;
@@ -1375,7 +1375,7 @@ void gb_rom_camera_device::update_camera()
m_camera_regs[0] &= ~0x1;
}
-READ8_MEMBER(gb_rom_camera_device::read_rom)
+uint8_t gb_rom_camera_device::read_rom(offs_t offset)
{
if (offset < 0x4000)
return m_rom[rom_bank_map[m_latch_bank] * 0x4000 + (offset & 0x3fff)];
@@ -1383,7 +1383,7 @@ READ8_MEMBER(gb_rom_camera_device::read_rom)
return m_rom[rom_bank_map[m_latch_bank2] * 0x4000 + (offset & 0x3fff)];
}
-WRITE8_MEMBER(gb_rom_camera_device::write_bank)
+void gb_rom_camera_device::write_bank(offs_t offset, uint8_t data)
{
if (offset < 0x2000)
m_ram_enable = ((data & 0x0f) == 0x0a) ? 1 : 0;
@@ -1403,7 +1403,7 @@ WRITE8_MEMBER(gb_rom_camera_device::write_bank)
}
}
-READ8_MEMBER(gb_rom_camera_device::read_ram)
+uint8_t gb_rom_camera_device::read_ram(offs_t offset)
{
if ((m_ram_bank & 0x10) != 0)
return (offset == 0) ? (m_camera_regs[0] & 0x7) : 0;
@@ -1417,7 +1417,7 @@ READ8_MEMBER(gb_rom_camera_device::read_ram)
return 0;
}
-WRITE8_MEMBER(gb_rom_camera_device::write_ram)
+void gb_rom_camera_device::write_ram(offs_t offset, uint8_t data)
{
if ((m_ram_bank & 0x10) != 0)
{
diff --git a/src/devices/bus/gameboy/mbc.h b/src/devices/bus/gameboy/mbc.h
index 4bc169488bf..9658369d6fb 100644
--- a/src/devices/bus/gameboy/mbc.h
+++ b/src/devices/bus/gameboy/mbc.h
@@ -13,9 +13,9 @@ class gb_rom_mbc_device : public device_t,
{
public:
// reading and writing
- virtual DECLARE_READ8_MEMBER(read_rom) override;
- virtual DECLARE_READ8_MEMBER(read_ram) override;
- virtual DECLARE_WRITE8_MEMBER(write_ram) override;
+ virtual uint8_t read_rom(offs_t offset) override;
+ virtual uint8_t read_ram(offs_t offset) override;
+ virtual void write_ram(offs_t offset, uint8_t data) override;
protected:
// construction/destruction
@@ -40,10 +40,10 @@ public:
// construction/destruction
gb_rom_mbc1_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- virtual DECLARE_READ8_MEMBER(read_rom) override;
- virtual DECLARE_WRITE8_MEMBER(write_bank) override;
- virtual DECLARE_READ8_MEMBER(read_ram) override;
- virtual DECLARE_WRITE8_MEMBER(write_ram) override;
+ virtual uint8_t read_rom(offs_t offset) override;
+ virtual void write_bank(offs_t offset, uint8_t data) override;
+ virtual uint8_t read_ram(offs_t offset) override;
+ virtual void write_ram(offs_t offset, uint8_t data) override;
protected:
enum {
@@ -70,10 +70,10 @@ public:
// construction/destruction
gb_rom_mbc2_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- virtual DECLARE_READ8_MEMBER(read_rom) override;
- virtual DECLARE_WRITE8_MEMBER(write_bank) override;
- virtual DECLARE_READ8_MEMBER(read_ram) override;
- virtual DECLARE_WRITE8_MEMBER(write_ram) override;
+ virtual uint8_t read_rom(offs_t offset) override;
+ virtual void write_bank(offs_t offset, uint8_t data) override;
+ virtual uint8_t read_ram(offs_t offset) override;
+ virtual void write_ram(offs_t offset, uint8_t data) override;
protected:
// device-level overrides
@@ -89,10 +89,10 @@ public:
// construction/destruction
gb_rom_mbc3_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- virtual DECLARE_READ8_MEMBER(read_rom) override;
- virtual DECLARE_WRITE8_MEMBER(write_bank) override;
- virtual DECLARE_READ8_MEMBER(read_ram) override;
- virtual DECLARE_WRITE8_MEMBER(write_ram) override;
+ virtual uint8_t read_rom(offs_t offset) override;
+ virtual void write_bank(offs_t offset, uint8_t data) override;
+ virtual uint8_t read_ram(offs_t offset) override;
+ virtual void write_ram(offs_t offset, uint8_t data) override;
protected:
// device-level overrides
@@ -113,10 +113,10 @@ public:
// construction/destruction
gb_rom_mbc5_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- virtual DECLARE_READ8_MEMBER(read_rom) override;
- virtual DECLARE_WRITE8_MEMBER(write_bank) override;
- virtual DECLARE_READ8_MEMBER(read_ram) override;
- virtual DECLARE_WRITE8_MEMBER(write_ram) override;
+ virtual uint8_t read_rom(offs_t offset) override;
+ virtual void write_bank(offs_t offset, uint8_t data) override;
+ virtual uint8_t read_ram(offs_t offset) override;
+ virtual void write_ram(offs_t offset, uint8_t data) override;
protected:
gb_rom_mbc5_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock);
@@ -134,10 +134,10 @@ public:
// construction/destruction
gb_rom_mbc6_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- virtual DECLARE_READ8_MEMBER(read_rom) override;
- virtual DECLARE_WRITE8_MEMBER(write_bank) override;
- virtual DECLARE_READ8_MEMBER(read_ram) override;
- virtual DECLARE_WRITE8_MEMBER(write_ram) override;
+ virtual uint8_t read_rom(offs_t offset) override;
+ virtual void write_bank(offs_t offset, uint8_t data) override;
+ virtual uint8_t read_ram(offs_t offset) override;
+ virtual void write_ram(offs_t offset, uint8_t data) override;
protected:
// device-level overrides
@@ -156,10 +156,10 @@ public:
// construction/destruction
gb_rom_mbc7_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- virtual DECLARE_READ8_MEMBER(read_rom) override;
- virtual DECLARE_WRITE8_MEMBER(write_bank) override;
- virtual DECLARE_READ8_MEMBER(read_ram) override;
- virtual DECLARE_WRITE8_MEMBER(write_ram) override;
+ virtual uint8_t read_rom(offs_t offset) override;
+ virtual void write_bank(offs_t offset, uint8_t data) override;
+ virtual uint8_t read_ram(offs_t offset) override;
+ virtual void write_ram(offs_t offset, uint8_t data) override;
protected:
// device-level overrides
@@ -175,10 +175,10 @@ public:
// construction/destruction
gb_rom_m161_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- virtual DECLARE_READ8_MEMBER(read_rom) override;
- virtual DECLARE_WRITE8_MEMBER(write_bank) override;
- virtual DECLARE_READ8_MEMBER(read_ram) override { return 0xff; }
- virtual DECLARE_WRITE8_MEMBER(write_ram) override { }
+ virtual uint8_t read_rom(offs_t offset) override;
+ virtual void write_bank(offs_t offset, uint8_t data) override;
+ virtual uint8_t read_ram(offs_t offset) override { return 0xff; }
+ virtual void write_ram(offs_t offset, uint8_t data) override { }
protected:
// device-level overrides
@@ -197,10 +197,10 @@ public:
gb_rom_mmm01_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
// reading and writing
- virtual DECLARE_READ8_MEMBER(read_rom) override;
- virtual DECLARE_WRITE8_MEMBER(write_bank) override;
- virtual DECLARE_READ8_MEMBER(read_ram) override;
- virtual DECLARE_WRITE8_MEMBER(write_ram) override;
+ virtual uint8_t read_rom(offs_t offset) override;
+ virtual void write_bank(offs_t offset, uint8_t data) override;
+ virtual uint8_t read_ram(offs_t offset) override;
+ virtual void write_ram(offs_t offset, uint8_t data) override;
protected:
// device-level overrides
@@ -225,10 +225,10 @@ public:
// construction/destruction
gb_rom_sachen_mmc1_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- virtual DECLARE_READ8_MEMBER(read_rom) override;
- virtual DECLARE_WRITE8_MEMBER(write_bank) override;
- virtual DECLARE_READ8_MEMBER(read_ram) override { return 0xff; }
- virtual DECLARE_WRITE8_MEMBER(write_ram) override { }
+ virtual uint8_t read_rom(offs_t offset) override;
+ virtual void write_bank(offs_t offset, uint8_t data) override;
+ virtual uint8_t read_ram(offs_t offset) override { return 0xff; }
+ virtual void write_ram(offs_t offset, uint8_t data) override { }
protected:
enum {
@@ -253,9 +253,9 @@ public:
// construction/destruction
gb_rom_sachen_mmc2_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- virtual DECLARE_READ8_MEMBER(read_rom) override;
- virtual DECLARE_READ8_MEMBER(read_ram) override;
- virtual DECLARE_WRITE8_MEMBER(write_ram) override;
+ virtual uint8_t read_rom(offs_t offset) override;
+ virtual uint8_t read_ram(offs_t offset) override;
+ virtual void write_ram(offs_t offset, uint8_t data) override;
protected:
enum {
@@ -277,8 +277,8 @@ public:
gb_rom_188in1_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
// reading and writing
- virtual DECLARE_READ8_MEMBER(read_rom) override;
- virtual DECLARE_WRITE8_MEMBER(write_bank) override;
+ virtual uint8_t read_rom(offs_t offset) override;
+ virtual void write_bank(offs_t offset, uint8_t data) override;
protected:
// device-level overrides
@@ -297,10 +297,10 @@ public:
gb_rom_sintax_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
// reading and writing
- virtual DECLARE_READ8_MEMBER(read_rom) override;
- virtual DECLARE_WRITE8_MEMBER(write_bank) override;
- virtual DECLARE_READ8_MEMBER(read_ram) override;
- virtual DECLARE_WRITE8_MEMBER(write_ram) override;
+ virtual uint8_t read_rom(offs_t offset) override;
+ virtual void write_bank(offs_t offset, uint8_t data) override;
+ virtual uint8_t read_ram(offs_t offset) override;
+ virtual void write_ram(offs_t offset, uint8_t data) override;
protected:
// device-level overrides
@@ -321,7 +321,7 @@ public:
// construction/destruction
gb_rom_chongwu_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- virtual DECLARE_READ8_MEMBER(read_rom) override;
+ virtual uint8_t read_rom(offs_t offset) override;
protected:
// device-level overrides
@@ -339,7 +339,7 @@ public:
// construction/destruction
gb_rom_licheng_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- virtual DECLARE_WRITE8_MEMBER(write_bank) override;
+ virtual void write_bank(offs_t offset, uint8_t data) override;
};
// ======================> gb_rom_digimon_device
@@ -350,15 +350,15 @@ public:
// construction/destruction
gb_rom_digimon_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- virtual DECLARE_READ8_MEMBER(read_rom) override;
- virtual DECLARE_WRITE8_MEMBER(write_bank) override;
- virtual DECLARE_READ8_MEMBER(read_ram) override;
+ virtual uint8_t read_rom(offs_t offset) override;
+ virtual void write_bank(offs_t offset, uint8_t data) override;
+ virtual uint8_t read_ram(offs_t offset) override;
protected:
// device-level overrides
virtual void device_start() override { shared_start(); }
virtual void device_reset() override { shared_reset(); }
- virtual DECLARE_WRITE8_MEMBER(write_ram) override;
+ virtual void write_ram(offs_t offset, uint8_t data) override;
};
// ======================> gb_rom_rockman8_device
@@ -369,10 +369,10 @@ public:
gb_rom_rockman8_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
// reading and writing
- virtual DECLARE_READ8_MEMBER(read_rom) override;
- virtual DECLARE_WRITE8_MEMBER(write_bank) override;
- virtual DECLARE_READ8_MEMBER(read_ram) override;
- virtual DECLARE_WRITE8_MEMBER(write_ram) override;
+ virtual uint8_t read_rom(offs_t offset) override;
+ virtual void write_bank(offs_t offset, uint8_t data) override;
+ virtual uint8_t read_ram(offs_t offset) override;
+ virtual void write_ram(offs_t offset, uint8_t data) override;
protected:
// device-level overrides
@@ -390,10 +390,10 @@ public:
gb_rom_sm3sp_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
// reading and writing
- virtual DECLARE_READ8_MEMBER(read_rom) override;
- virtual DECLARE_WRITE8_MEMBER(write_bank) override;
- virtual DECLARE_READ8_MEMBER(read_ram) override;
- virtual DECLARE_WRITE8_MEMBER(write_ram) override;
+ virtual uint8_t read_rom(offs_t offset) override;
+ virtual void write_bank(offs_t offset, uint8_t data) override;
+ virtual uint8_t read_ram(offs_t offset) override;
+ virtual void write_ram(offs_t offset, uint8_t data) override;
protected:
// device-level overrides
@@ -410,10 +410,10 @@ public:
// construction/destruction
gb_rom_camera_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- virtual DECLARE_READ8_MEMBER(read_rom) override;
- virtual DECLARE_WRITE8_MEMBER(write_bank) override;
- virtual DECLARE_READ8_MEMBER(read_ram) override;
- virtual DECLARE_WRITE8_MEMBER(write_ram) override;
+ virtual uint8_t read_rom(offs_t offset) override;
+ virtual void write_bank(offs_t offset, uint8_t data) override;
+ virtual uint8_t read_ram(offs_t offset) override;
+ virtual void write_ram(offs_t offset, uint8_t data) override;
protected:
// device-level overrides
diff --git a/src/devices/bus/gameboy/rom.cpp b/src/devices/bus/gameboy/rom.cpp
index 47049bcd836..d3e90d73f51 100644
--- a/src/devices/bus/gameboy/rom.cpp
+++ b/src/devices/bus/gameboy/rom.cpp
@@ -145,13 +145,13 @@ void megaduck_rom_device::device_reset()
mapper specific handlers
-------------------------------------------------*/
-READ8_MEMBER(gb_rom_device::read_rom)
+uint8_t gb_rom_device::read_rom(offs_t offset)
{
m_latch_bank = offset / 0x4000;
return m_rom[rom_bank_map[m_latch_bank] * 0x4000 + (offset & 0x3fff)];
}
-READ8_MEMBER(gb_rom_device::read_ram)
+uint8_t gb_rom_device::read_ram(offs_t offset)
{
if (!m_ram.empty())
return m_ram[ram_bank_map[m_ram_bank] * 0x2000 + offset];
@@ -159,7 +159,7 @@ READ8_MEMBER(gb_rom_device::read_ram)
return 0xff;
}
-WRITE8_MEMBER(gb_rom_device::write_ram)
+void gb_rom_device::write_ram(offs_t offset, uint8_t data)
{
if (!m_ram.empty())
m_ram[ram_bank_map[m_ram_bank] * 0x2000 + offset] = data;
@@ -168,7 +168,7 @@ WRITE8_MEMBER(gb_rom_device::write_ram)
// Tamagotchi
-READ8_MEMBER(gb_rom_tama5_device::read_rom)
+uint8_t gb_rom_tama5_device::read_rom(offs_t offset)
{
if (offset < 0x4000)
return m_rom[rom_bank_map[m_latch_bank] * 0x4000 + (offset & 0x3fff)];
@@ -176,12 +176,12 @@ READ8_MEMBER(gb_rom_tama5_device::read_rom)
return m_rom[rom_bank_map[m_latch_bank2] * 0x4000 + (offset & 0x3fff)];
}
-READ8_MEMBER(gb_rom_tama5_device::read_ram)
+uint8_t gb_rom_tama5_device::read_ram(offs_t offset)
{
return m_rtc_reg;
}
-WRITE8_MEMBER(gb_rom_tama5_device::write_ram)
+void gb_rom_tama5_device::write_ram(offs_t offset, uint8_t data)
{
switch (offset & 0x0001)
{
@@ -259,12 +259,12 @@ WRITE8_MEMBER(gb_rom_tama5_device::write_ram)
// Wisdom Tree
-READ8_MEMBER(gb_rom_wisdom_device::read_rom)
+uint8_t gb_rom_wisdom_device::read_rom(offs_t offset)
{
return m_rom[rom_bank_map[m_latch_bank] * 0x4000 + offset];
}
-WRITE8_MEMBER(gb_rom_wisdom_device::write_bank)
+void gb_rom_wisdom_device::write_bank(offs_t offset, uint8_t data)
{
if (offset < 0x4000)
m_latch_bank = (offset << 1) & 0x1ff;
@@ -273,7 +273,7 @@ WRITE8_MEMBER(gb_rom_wisdom_device::write_bank)
// Yong Yong pirate
-READ8_MEMBER(gb_rom_yong_device::read_rom)
+uint8_t gb_rom_yong_device::read_rom(offs_t offset)
{
if (offset < 0x4000)
return m_rom[rom_bank_map[m_latch_bank] * 0x4000 + (offset & 0x3fff)];
@@ -281,7 +281,7 @@ READ8_MEMBER(gb_rom_yong_device::read_rom)
return m_rom[rom_bank_map[m_latch_bank2] * 0x4000 + (offset & 0x3fff)];
}
-WRITE8_MEMBER(gb_rom_yong_device::write_bank)
+void gb_rom_yong_device::write_bank(offs_t offset, uint8_t data)
{
if (offset == 0x2000)
m_latch_bank2 = data;
@@ -290,7 +290,7 @@ WRITE8_MEMBER(gb_rom_yong_device::write_bank)
// ATV Racin pirate (incomplete)
-READ8_MEMBER(gb_rom_atvrac_device::read_rom)
+uint8_t gb_rom_atvrac_device::read_rom(offs_t offset)
{
if (offset < 0x4000)
return m_rom[rom_bank_map[m_latch_bank] * 0x4000 + (offset & 0x3fff)];
@@ -298,7 +298,7 @@ READ8_MEMBER(gb_rom_atvrac_device::read_rom)
return m_rom[rom_bank_map[m_latch_bank2] * 0x4000 + (offset & 0x3fff)];
}
-WRITE8_MEMBER(gb_rom_atvrac_device::write_bank)
+void gb_rom_atvrac_device::write_bank(offs_t offset, uint8_t data)
{
if (offset == 0x3f00)
{
@@ -312,7 +312,7 @@ WRITE8_MEMBER(gb_rom_atvrac_device::write_bank)
// La Sa Ma pirate (incomplete)
-READ8_MEMBER(gb_rom_lasama_device::read_rom)
+uint8_t gb_rom_lasama_device::read_rom(offs_t offset)
{
if (offset < 0x4000)
return m_rom[rom_bank_map[m_latch_bank] * 0x4000 + (offset & 0x3fff)];
@@ -320,7 +320,7 @@ READ8_MEMBER(gb_rom_lasama_device::read_rom)
return m_rom[rom_bank_map[m_latch_bank2] * 0x4000 + (offset & 0x3fff)];
}
-WRITE8_MEMBER(gb_rom_lasama_device::write_bank)
+void gb_rom_lasama_device::write_bank(offs_t offset, uint8_t data)
{
if (offset == 0x2080)
{
@@ -341,7 +341,7 @@ WRITE8_MEMBER(gb_rom_lasama_device::write_bank)
// MegaDuck carts
-READ8_MEMBER(megaduck_rom_device::read_rom)
+uint8_t megaduck_rom_device::read_rom(offs_t offset)
{
if (offset < 0x4000)
return m_rom[rom_bank_map[m_latch_bank] * 0x4000 + (offset & 0x3fff)];
@@ -349,13 +349,13 @@ READ8_MEMBER(megaduck_rom_device::read_rom)
return m_rom[rom_bank_map[m_latch_bank2] * 0x4000 + (offset & 0x3fff)];
}
-WRITE8_MEMBER(megaduck_rom_device::write_bank)
+void megaduck_rom_device::write_bank(offs_t offset, uint8_t data)
{
if (offset == 0x0001)
m_latch_bank2 = data;
}
-WRITE8_MEMBER(megaduck_rom_device::write_ram)
+void megaduck_rom_device::write_ram(offs_t offset, uint8_t data)
{
m_latch_bank = data * 2;
m_latch_bank2 = data * 2 + 1;
diff --git a/src/devices/bus/gameboy/rom.h b/src/devices/bus/gameboy/rom.h
index a5439fba598..f2388446863 100644
--- a/src/devices/bus/gameboy/rom.h
+++ b/src/devices/bus/gameboy/rom.h
@@ -16,9 +16,9 @@ public:
gb_rom_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
// reading and writing
- virtual DECLARE_READ8_MEMBER(read_rom) override;
- virtual DECLARE_READ8_MEMBER(read_ram) override;
- virtual DECLARE_WRITE8_MEMBER(write_ram) override;
+ virtual uint8_t read_rom(offs_t offset) override;
+ virtual uint8_t read_ram(offs_t offset) override;
+ virtual void write_ram(offs_t offset, uint8_t data) override;
protected:
gb_rom_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock);
@@ -39,9 +39,9 @@ public:
gb_rom_tama5_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
// reading and writing
- virtual DECLARE_READ8_MEMBER(read_rom) override;
- virtual DECLARE_READ8_MEMBER(read_ram) override;
- virtual DECLARE_WRITE8_MEMBER(write_ram) override;
+ virtual uint8_t read_rom(offs_t offset) override;
+ virtual uint8_t read_ram(offs_t offset) override;
+ virtual void write_ram(offs_t offset, uint8_t data) override;
protected:
// device-level overrides
@@ -61,8 +61,8 @@ public:
gb_rom_wisdom_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
// reading and writing
- virtual DECLARE_READ8_MEMBER(read_rom) override;
- virtual DECLARE_WRITE8_MEMBER(write_bank) override;
+ virtual uint8_t read_rom(offs_t offset) override;
+ virtual void write_bank(offs_t offset, uint8_t data) override;
protected:
// device-level overrides
@@ -78,8 +78,8 @@ public:
gb_rom_yong_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
// reading and writing
- virtual DECLARE_READ8_MEMBER(read_rom) override;
- virtual DECLARE_WRITE8_MEMBER(write_bank) override;
+ virtual uint8_t read_rom(offs_t offset) override;
+ virtual void write_bank(offs_t offset, uint8_t data) override;
protected:
// device-level overrides
@@ -95,8 +95,8 @@ public:
gb_rom_atvrac_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
// reading and writing
- virtual DECLARE_READ8_MEMBER(read_rom) override;
- virtual DECLARE_WRITE8_MEMBER(write_bank) override;
+ virtual uint8_t read_rom(offs_t offset) override;
+ virtual void write_bank(offs_t offset, uint8_t data) override;
protected:
// device-level overrides
@@ -112,8 +112,8 @@ public:
gb_rom_lasama_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
// reading and writing
- virtual DECLARE_READ8_MEMBER(read_rom) override;
- virtual DECLARE_WRITE8_MEMBER(write_bank) override;
+ virtual uint8_t read_rom(offs_t offset) override;
+ virtual void write_bank(offs_t offset, uint8_t data) override;
protected:
// device-level overrides
@@ -131,9 +131,9 @@ public:
megaduck_rom_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
// reading and writing
- virtual DECLARE_READ8_MEMBER(read_rom) override;
- virtual DECLARE_WRITE8_MEMBER(write_bank) override;
- virtual DECLARE_WRITE8_MEMBER(write_ram) override;
+ virtual uint8_t read_rom(offs_t offset) override;
+ virtual void write_bank(offs_t offset, uint8_t data) override;
+ virtual void write_ram(offs_t offset, uint8_t data) override;
protected:
megaduck_rom_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock);
diff --git a/src/devices/bus/gamegear/ggext.h b/src/devices/bus/gamegear/ggext.h
index 71d6ecfcf72..1eed1545bed 100644
--- a/src/devices/bus/gamegear/ggext.h
+++ b/src/devices/bus/gamegear/ggext.h
@@ -16,28 +16,6 @@
#pragma once
-
-
-//**************************************************************************
-// INTERFACE CONFIGURATION MACROS
-//**************************************************************************
-
-#define MCFG_GG_EXT_PORT_ADD(_tag, _slot_intf, _def_slot) \
- MCFG_DEVICE_ADD(_tag, GG_EXT_PORT, 0) \
- MCFG_DEVICE_SLOT_INTERFACE(_slot_intf, _def_slot, false)
-#define MCFG_GG_EXT_PORT_MODIFY(_tag) \
- MCFG_DEVICE_MODIFY(_tag)
-
-
-#define MCFG_GG_EXT_PORT_TH_INPUT_HANDLER(_devcb) \
- downcast<gg_ext_port_device &>(*device).set_th_input_handler(DEVCB_##_devcb);
-
-
-#define MCFG_GG_EXT_PORT_PIXEL_HANDLER(_devcb) \
- downcast<gg_ext_port_device &>(*device).set_pixel_handler(DEVCB_##_devcb);
-
-
-
//**************************************************************************
// TYPE DEFINITIONS
//**************************************************************************
@@ -50,13 +28,23 @@ class gg_ext_port_device : public device_t, public device_slot_interface
{
public:
// construction/destruction
- gg_ext_port_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+ template <typename T>
+ gg_ext_port_device(machine_config const &mconfig, char const *tag, device_t *owner, T &&opts, char const *dflt)
+ : gg_ext_port_device(mconfig, tag, owner, 0)
+ {
+ option_reset();
+ opts(*this);
+ set_default_option(dflt);
+ set_fixed(false);
+ }
+
+ gg_ext_port_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock = 0);
virtual ~gg_ext_port_device();
// static configuration helpers
- template <class Object> devcb_base &set_th_input_handler(Object &&cb) { return m_th_pin_handler.set_callback(std::forward<Object>(cb)); }
+ auto th_input_handler() { return m_th_pin_handler.bind(); }
- template <class Object> devcb_base &set_pixel_handler(Object &&cb) { return m_pixel_handler.set_callback(std::forward<Object>(cb)); }
+ auto pixel_handler() { return m_pixel_handler.bind(); }
// Currently, only the support for SMS Controller Adaptor is emulated,
// for when SMS Compatibility mode is enabled. In that mode, the 10 pins
diff --git a/src/devices/bus/gamegear/smsctrladp.cpp b/src/devices/bus/gamegear/smsctrladp.cpp
index 7a5eee4ba4b..0b380cba8a0 100644
--- a/src/devices/bus/gamegear/smsctrladp.cpp
+++ b/src/devices/bus/gamegear/smsctrladp.cpp
@@ -80,9 +80,10 @@ READ32_MEMBER( sms_ctrl_adaptor_device::pixel_r )
// device_add_mconfig - add device configuration
//-------------------------------------------------
-MACHINE_CONFIG_START(sms_ctrl_adaptor_device::device_add_mconfig)
- MCFG_SMS_CONTROL_PORT_ADD("ctrl", sms_control_port_devices, "joypad")
- MCFG_SMS_CONTROL_PORT_TH_INPUT_HANDLER(WRITELINE(*this, sms_ctrl_adaptor_device, th_pin_w))
- MCFG_SMS_CONTROL_PORT_PIXEL_HANDLER(READ32(*this, sms_ctrl_adaptor_device, pixel_r))
-MACHINE_CONFIG_END
+void sms_ctrl_adaptor_device::device_add_mconfig(machine_config &config)
+{
+ SMS_CONTROL_PORT(config, m_subctrl_port, sms_control_port_devices, "joypad");
+ m_subctrl_port->th_input_handler().set(FUNC(sms_ctrl_adaptor_device::th_pin_w));
+ m_subctrl_port->pixel_handler().set(FUNC(sms_ctrl_adaptor_device::pixel_r));
+}
diff --git a/src/devices/bus/gba/gba_slot.h b/src/devices/bus/gba/gba_slot.h
index c946fd71c57..b26891c6589 100644
--- a/src/devices/bus/gba/gba_slot.h
+++ b/src/devices/bus/gba/gba_slot.h
@@ -84,7 +84,17 @@ class gba_cart_slot_device : public device_t,
{
public:
// construction/destruction
- gba_cart_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+ template <typename T>
+ gba_cart_slot_device(machine_config const &mconfig, char const *tag, device_t *owner, T &&opts, char const *dflt)
+ : gba_cart_slot_device(mconfig, tag, owner, 0)
+ {
+ option_reset();
+ opts(*this);
+ set_default_option(dflt);
+ set_fixed(false);
+ }
+
+ gba_cart_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock = 0);
virtual ~gba_cart_slot_device();
// device-level overrides
@@ -143,11 +153,6 @@ DECLARE_DEVICE_TYPE(GBA_CART_SLOT, gba_cart_slot_device)
#define GBASLOT_ROM_REGION_TAG ":cart:rom"
#define GBAHELP_ROM_REGION_TAG ":cart:romhlp"
-#define MCFG_GBA_CARTRIDGE_ADD(_tag,_slot_intf,_def_slot) \
- MCFG_DEVICE_ADD(_tag, GBA_CART_SLOT, 0) \
- MCFG_DEVICE_SLOT_INTERFACE(_slot_intf, _def_slot, false)
-
-
//------------------------------------------------------------------------
//
diff --git a/src/devices/bus/gba/rom.cpp b/src/devices/bus/gba/rom.cpp
index 1471d43a430..e1c61ec0f49 100644
--- a/src/devices/bus/gba/rom.cpp
+++ b/src/devices/bus/gba/rom.cpp
@@ -417,13 +417,13 @@ READ32_MEMBER(gba_rom_flash_device::read_ram)
offset &= m_flash_mask;
if (mem_mask & 0xff)
- rv |= m_flash->read(space, offset * 4);
+ rv |= m_flash->read(offset * 4);
if (mem_mask & 0xff00)
- rv |= m_flash->read(space, (offset * 4) + 1) << 8;
+ rv |= m_flash->read((offset * 4) + 1) << 8;
if (mem_mask & 0xff0000)
- rv |= m_flash->read(space, (offset * 4) + 2) << 16;
+ rv |= m_flash->read((offset * 4) + 2) << 16;
if (mem_mask & 0xff000000)
- rv |= m_flash->read(space, (offset * 4) + 3) << 24;
+ rv |= m_flash->read((offset * 4) + 3) << 24;
return rv;
}
@@ -435,16 +435,16 @@ WRITE32_MEMBER(gba_rom_flash_device::write_ram)
switch (mem_mask)
{
case 0xff:
- m_flash->write(space, offset * 4, data & 0xff);
+ m_flash->write(offset * 4, data & 0xff);
break;
case 0xff00:
- m_flash->write(space, (offset * 4) + 1, (data >> 8) & 0xff);
+ m_flash->write((offset * 4) + 1, (data >> 8) & 0xff);
break;
case 0xff0000:
- m_flash->write(space, (offset * 4) + 2, (data >> 16) & 0xff);
+ m_flash->write((offset * 4) + 2, (data >> 16) & 0xff);
break;
case 0xff000000:
- m_flash->write(space, (offset * 4) + 3, (data >> 24) & 0xff);
+ m_flash->write((offset * 4) + 3, (data >> 24) & 0xff);
break;
default:
fatalerror("Unknown mem_mask for GBA flash write %x\n", mem_mask);
@@ -464,13 +464,13 @@ READ32_MEMBER(gba_rom_flash1m_device::read_ram)
offset &= m_flash_mask;
if (mem_mask & 0xff)
- rv |= m_flash->read(space, offset * 4);
+ rv |= m_flash->read(offset * 4);
if (mem_mask & 0xff00)
- rv |= m_flash->read(space, (offset * 4) + 1) << 8;
+ rv |= m_flash->read((offset * 4) + 1) << 8;
if (mem_mask & 0xff0000)
- rv |= m_flash->read(space, (offset * 4) + 2) << 16;
+ rv |= m_flash->read((offset * 4) + 2) << 16;
if (mem_mask & 0xff000000)
- rv |= m_flash->read(space, (offset * 4) + 3) << 24;
+ rv |= m_flash->read((offset * 4) + 3) << 24;
return rv;
}
@@ -482,16 +482,16 @@ WRITE32_MEMBER(gba_rom_flash1m_device::write_ram)
switch (mem_mask)
{
case 0xff:
- m_flash->write(space, offset * 4, data & 0xff);
+ m_flash->write(offset * 4, data & 0xff);
break;
case 0xff00:
- m_flash->write(space, (offset * 4) + 1, (data >> 8) & 0xff);
+ m_flash->write((offset * 4) + 1, (data >> 8) & 0xff);
break;
case 0xff0000:
- m_flash->write(space, (offset * 4) + 2, (data >> 16) & 0xff);
+ m_flash->write((offset * 4) + 2, (data >> 16) & 0xff);
break;
case 0xff000000:
- m_flash->write(space, (offset * 4) + 3, (data >> 24) & 0xff);
+ m_flash->write((offset * 4) + 3, (data >> 24) & 0xff);
break;
default:
fatalerror("Unknown mem_mask for GBA flash write %x\n", mem_mask);
diff --git a/src/devices/bus/generic/ram.cpp b/src/devices/bus/generic/ram.cpp
index 601db4d0470..1c9a63d7306 100644
--- a/src/devices/bus/generic/ram.cpp
+++ b/src/devices/bus/generic/ram.cpp
@@ -97,7 +97,7 @@ void generic_ram_linear_device::device_start()
mapper specific handlers
-------------------------------------------------*/
-READ8_MEMBER(generic_ram_plain_device::read_ram)
+uint8_t generic_ram_plain_device::read_ram(offs_t offset)
{
if (offset < m_ram.size())
return m_ram[offset];
@@ -105,19 +105,19 @@ READ8_MEMBER(generic_ram_plain_device::read_ram)
return 0xff;
}
-WRITE8_MEMBER(generic_ram_plain_device::write_ram)
+void generic_ram_plain_device::write_ram(offs_t offset, uint8_t data)
{
if (offset < m_ram.size())
m_ram[offset] = data;
}
-READ8_MEMBER(generic_ram_linear_device::read_ram)
+uint8_t generic_ram_linear_device::read_ram(offs_t offset)
{
return m_ram[offset % m_ram.size()];
}
-WRITE8_MEMBER(generic_ram_linear_device::write_ram)
+void generic_ram_linear_device::write_ram(offs_t offset, uint8_t data)
{
m_ram[offset % m_ram.size()] = data;
}
diff --git a/src/devices/bus/generic/ram.h b/src/devices/bus/generic/ram.h
index aa8323ba8af..5cd8c8092b0 100644
--- a/src/devices/bus/generic/ram.h
+++ b/src/devices/bus/generic/ram.h
@@ -14,8 +14,8 @@ class generic_ram_plain_device : public device_t, public device_generic_cart_int
{
public:
// reading and writing
- virtual DECLARE_READ8_MEMBER(read_ram) override;
- virtual DECLARE_WRITE8_MEMBER(write_ram) override;
+ virtual uint8_t read_ram(offs_t offset) override;
+ virtual void write_ram(offs_t offset, uint8_t data) override;
protected:
// construction/destruction
@@ -35,8 +35,8 @@ class generic_ram_linear_device : public device_t, public device_generic_cart_in
{
public:
// reading and writing
- virtual DECLARE_READ8_MEMBER(read_ram) override;
- virtual DECLARE_WRITE8_MEMBER(write_ram) override;
+ virtual uint8_t read_ram(offs_t offset) override;
+ virtual void write_ram(offs_t offset, uint8_t data) override;
protected:
// construction/destruction
diff --git a/src/devices/bus/generic/rom.cpp b/src/devices/bus/generic/rom.cpp
index 3a63b1f90dc..e52854d5b64 100644
--- a/src/devices/bus/generic/rom.cpp
+++ b/src/devices/bus/generic/rom.cpp
@@ -61,7 +61,7 @@ generic_romram_plain_device::generic_romram_plain_device(const machine_config &m
mapper specific handlers
-------------------------------------------------*/
-READ8_MEMBER(generic_rom_plain_device::read_rom)
+uint8_t generic_rom_plain_device::read_rom(offs_t offset)
{
if (offset < m_rom_size)
return m_rom[offset];
@@ -69,7 +69,7 @@ READ8_MEMBER(generic_rom_plain_device::read_rom)
return 0xff;
}
-READ16_MEMBER(generic_rom_plain_device::read16_rom)
+uint16_t generic_rom_plain_device::read16_rom(offs_t offset, uint16_t mem_mask)
{
uint16_t *ROM = (uint16_t *)m_rom;
if (offset < m_rom_size/2)
@@ -78,7 +78,7 @@ READ16_MEMBER(generic_rom_plain_device::read16_rom)
return 0xffff;
}
-READ32_MEMBER(generic_rom_plain_device::read32_rom)
+uint32_t generic_rom_plain_device::read32_rom(offs_t offset, uint32_t mem_mask)
{
uint32_t *ROM = (uint32_t *)m_rom;
if (offset < m_rom_size/4)
@@ -88,25 +88,25 @@ READ32_MEMBER(generic_rom_plain_device::read32_rom)
}
-READ8_MEMBER(generic_rom_linear_device::read_rom)
+uint8_t generic_rom_linear_device::read_rom(offs_t offset)
{
return m_rom[offset % m_rom_size];
}
-READ16_MEMBER(generic_rom_linear_device::read16_rom)
+uint16_t generic_rom_linear_device::read16_rom(offs_t offset, uint16_t mem_mask)
{
uint16_t *ROM = (uint16_t *)m_rom;
return ROM[offset % (m_rom_size/2)];
}
-READ32_MEMBER(generic_rom_linear_device::read32_rom)
+uint32_t generic_rom_linear_device::read32_rom(offs_t offset, uint32_t mem_mask)
{
uint32_t *ROM = (uint32_t *)m_rom;
return ROM[offset % (m_rom_size/4)];
}
-READ8_MEMBER(generic_romram_plain_device::read_ram)
+uint8_t generic_romram_plain_device::read_ram(offs_t offset)
{
if (offset < m_ram.size())
return m_ram[offset];
@@ -114,7 +114,7 @@ READ8_MEMBER(generic_romram_plain_device::read_ram)
return 0xff;
}
-WRITE8_MEMBER(generic_romram_plain_device::write_ram)
+void generic_romram_plain_device::write_ram(offs_t offset, uint8_t data)
{
if (offset < m_ram.size())
m_ram[offset] = data;
diff --git a/src/devices/bus/generic/rom.h b/src/devices/bus/generic/rom.h
index 2fc1011c25b..6c5df5d4bf4 100644
--- a/src/devices/bus/generic/rom.h
+++ b/src/devices/bus/generic/rom.h
@@ -30,9 +30,9 @@ public:
generic_rom_plain_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
// reading and writing
- virtual DECLARE_READ8_MEMBER(read_rom) override;
- virtual DECLARE_READ16_MEMBER(read16_rom) override;
- virtual DECLARE_READ32_MEMBER(read32_rom) override;
+ virtual uint8_t read_rom(offs_t offset) override;
+ virtual uint16_t read16_rom(offs_t offset, uint16_t mem_mask) override;
+ virtual uint32_t read32_rom(offs_t offset, uint32_t mem_mask) override;
protected:
generic_rom_plain_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock);
@@ -48,8 +48,8 @@ public:
generic_romram_plain_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
// reading and writing
- virtual DECLARE_READ8_MEMBER(read_ram) override;
- virtual DECLARE_WRITE8_MEMBER(write_ram) override;
+ virtual uint8_t read_ram(offs_t offset) override;
+ virtual void write_ram(offs_t offset, uint8_t data) override;
};
@@ -62,9 +62,9 @@ public:
generic_rom_linear_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
// reading and writing
- virtual DECLARE_READ8_MEMBER(read_rom) override;
- virtual DECLARE_READ16_MEMBER(read16_rom) override;
- virtual DECLARE_READ32_MEMBER(read32_rom) override;
+ virtual uint8_t read_rom(offs_t offset) override;
+ virtual uint16_t read16_rom(offs_t offset, uint16_t mem_mask) override;
+ virtual uint32_t read32_rom(offs_t offset, uint32_t mem_mask) override;
};
diff --git a/src/devices/bus/generic/slot.cpp b/src/devices/bus/generic/slot.cpp
index 8e7e3a4cdab..557e1d8dcef 100644
--- a/src/devices/bus/generic/slot.cpp
+++ b/src/devices/bus/generic/slot.cpp
@@ -216,10 +216,10 @@ void generic_slot_device::common_load_rom(uint8_t *ROM, uint32_t len, const char
read_rom
-------------------------------------------------*/
-READ8_MEMBER(generic_slot_device::read_rom)
+uint8_t generic_slot_device::read_rom(offs_t offset)
{
if (m_cart)
- return m_cart->read_rom(space, offset);
+ return m_cart->read_rom(offset);
else
return 0xff;
}
@@ -228,10 +228,10 @@ READ8_MEMBER(generic_slot_device::read_rom)
read16_rom
-------------------------------------------------*/
-READ16_MEMBER(generic_slot_device::read16_rom)
+uint16_t generic_slot_device::read16_rom(offs_t offset, uint16_t mem_mask)
{
if (m_cart)
- return m_cart->read16_rom(space, offset, mem_mask);
+ return m_cart->read16_rom(offset, mem_mask);
else
return 0xffff;
}
@@ -240,10 +240,10 @@ READ16_MEMBER(generic_slot_device::read16_rom)
read32_rom
-------------------------------------------------*/
-READ32_MEMBER(generic_slot_device::read32_rom)
+uint32_t generic_slot_device::read32_rom(offs_t offset, uint32_t mem_mask)
{
if (m_cart)
- return m_cart->read32_rom(space, offset, mem_mask);
+ return m_cart->read32_rom(offset, mem_mask);
else
return 0xffffffff;
}
@@ -252,10 +252,10 @@ READ32_MEMBER(generic_slot_device::read32_rom)
read_ram
-------------------------------------------------*/
-READ8_MEMBER(generic_slot_device::read_ram)
+uint8_t generic_slot_device::read_ram(offs_t offset)
{
if (m_cart)
- return m_cart->read_ram(space, offset);
+ return m_cart->read_ram(offset);
else
return 0xff;
}
@@ -264,8 +264,8 @@ READ8_MEMBER(generic_slot_device::read_ram)
write_ram
-------------------------------------------------*/
-WRITE8_MEMBER(generic_slot_device::write_ram)
+void generic_slot_device::write_ram(offs_t offset, uint8_t data)
{
if (m_cart)
- m_cart->write_ram(space, offset, data);
+ m_cart->write_ram(offset, data);
}
diff --git a/src/devices/bus/generic/slot.h b/src/devices/bus/generic/slot.h
index d0c0d84a053..3fac098afb7 100644
--- a/src/devices/bus/generic/slot.h
+++ b/src/devices/bus/generic/slot.h
@@ -22,12 +22,12 @@ public:
virtual ~device_generic_cart_interface();
// reading and writing
- virtual DECLARE_READ8_MEMBER(read_rom) { return 0xff; }
- virtual DECLARE_READ16_MEMBER(read16_rom) { return 0xffff; }
- virtual DECLARE_READ32_MEMBER(read32_rom) { return 0xffffffff; }
+ virtual uint8_t read_rom(offs_t offset) { return 0xff; }
+ virtual uint16_t read16_rom(offs_t offset, uint16_t mem_mask) { return 0xffff; }
+ virtual uint32_t read32_rom(offs_t offset, uint32_t mem_mask) { return 0xffffffff; }
- virtual DECLARE_READ8_MEMBER(read_ram) { return 0xff; }
- virtual DECLARE_WRITE8_MEMBER(write_ram) {};
+ virtual uint8_t read_ram(offs_t offset) { return 0xff; }
+ virtual void write_ram(offs_t offset, uint8_t data) {}
virtual void rom_alloc(size_t size, int width, endianness_t end, const char *tag);
virtual void ram_alloc(uint32_t size);
@@ -138,12 +138,12 @@ public:
virtual std::string get_default_card_software(get_default_card_software_hook &hook) const override;
// reading and writing
- virtual DECLARE_READ8_MEMBER(read_rom);
- virtual DECLARE_READ16_MEMBER(read16_rom);
- virtual DECLARE_READ32_MEMBER(read32_rom);
+ virtual uint8_t read_rom(offs_t offset);
+ virtual uint16_t read16_rom(offs_t offset, uint16_t mem_mask = 0xffff);
+ virtual uint32_t read32_rom(offs_t offset, uint32_t mem_mask = 0xffffffff);
- virtual DECLARE_READ8_MEMBER(read_ram);
- virtual DECLARE_WRITE8_MEMBER(write_ram);
+ virtual uint8_t read_ram(offs_t offset);
+ virtual void write_ram(offs_t offset, uint8_t data);
virtual void rom_alloc(size_t size, int width, endianness_t end) { if (m_cart) m_cart->rom_alloc(size, width, end, tag()); }
virtual void ram_alloc(uint32_t size) { if (m_cart) m_cart->ram_alloc(size); }
diff --git a/src/devices/bus/hexbus/hx5102.cpp b/src/devices/bus/hexbus/hx5102.cpp
index bf0f9d541cb..0cfd70c7dac 100644
--- a/src/devices/bus/hexbus/hx5102.cpp
+++ b/src/devices/bus/hexbus/hx5102.cpp
@@ -121,8 +121,7 @@ void hx5102_device::memmap(address_map &map)
*/
void hx5102_device::crumap(address_map &map)
{
- map(0x17e0>>4, 0x17fe>>4).r(FUNC(hx5102_device::cruread));
- map(0x17e0>>1, 0x17fe>>1).w(FUNC(hx5102_device::cruwrite));
+ map(0x17e0, 0x17ff).rw(FUNC(hx5102_device::cruread), FUNC(hx5102_device::cruwrite));
}
hx5102_device::hx5102_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock):
@@ -374,12 +373,12 @@ READ8_MEMBER(hx5102_device::fdc_read)
{
case 0:
// Main status register
- val = m_floppy_ctrl->read_msr();
+ val = m_floppy_ctrl->msr_r();
LOGMASKED(LOG_STATUS, "i8272A.msr -> %02x\n", val);
break;
case 4:
// FIFO read
- val = m_floppy_ctrl->read_fifo();
+ val = m_floppy_ctrl->fifo_r();
LOGMASKED(LOG_FIFO, "i8272A.fifo -> %02x\n", val);
break;
}
@@ -398,7 +397,7 @@ WRITE8_MEMBER(hx5102_device::fdc_write)
case 0x08:
// Command register (FIFO write)
LOGMASKED(LOG_STATUS, "i8272A.fifo <- %02x\n", data);
- m_floppy_ctrl->write_fifo(data);
+ m_floppy_ctrl->fifo_w(data);
break;
case 0x0c:
// DMA lock
@@ -475,7 +474,7 @@ READ8_MEMBER(hx5102_device::cruread)
crubits |= ((ioport("HXDIP")->read())<<4);
- return crubits;
+ return BIT(crubits, offset);
}
/*
diff --git a/src/devices/bus/hp80_io/hp80_io.h b/src/devices/bus/hp80_io/hp80_io.h
index 11025d30d03..886e7ce414a 100644
--- a/src/devices/bus/hp80_io/hp80_io.h
+++ b/src/devices/bus/hp80_io/hp80_io.h
@@ -13,16 +13,6 @@
#pragma once
-#define MCFG_HP80_IO_SLOT_ADD(_tag , _idx) \
- MCFG_DEVICE_ADD(_tag, HP80_IO_SLOT, 0) \
- MCFG_DEVICE_SLOT_INTERFACE(hp80_io_slot_devices, nullptr, false) \
- downcast<hp80_io_slot_device &>(*device).set_slot_no(_idx);
-
-#define MCFG_HP80_IO_IRL_CB(_devcb) \
- downcast<hp80_io_slot_device &>(*device).set_irl_cb_func(DEVCB_##_devcb);
-
-#define MCFG_HP80_IO_HALT_CB(_devcb) \
- downcast<hp80_io_slot_device &>(*device).set_halt_cb_func(DEVCB_##_devcb);
#define HP80_IO_FIRST_SC 3 // Lowest SC used by I/O cards
@@ -38,11 +28,22 @@
PORT_CONFSETTING(6 , "9")\
PORT_CONFSETTING(7 , "10")
+void hp80_io_slot_devices(device_slot_interface &device);
+
class hp80_io_slot_device : public device_t,
public device_slot_interface
{
public:
// construction/destruction
+ hp80_io_slot_device(machine_config const &mconfig, char const *tag, device_t *owner)
+ : hp80_io_slot_device(mconfig, tag, owner, (uint32_t)0)
+ {
+ option_reset();
+ hp80_io_slot_devices(*this);
+ set_default_option(nullptr);
+ set_fixed(false);
+ }
+
hp80_io_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
virtual ~hp80_io_slot_device();
@@ -53,8 +54,8 @@ public:
virtual void device_start() override;
// Callback setups
- template <class Object> devcb_base &set_irl_cb_func(Object &&cb) { return m_irl_cb_func.set_callback(std::forward<Object>(cb)); }
- template <class Object> devcb_base &set_halt_cb_func(Object &&cb) { return m_halt_cb_func.set_callback(std::forward<Object>(cb)); }
+ auto irl_cb() { return m_irl_cb_func.bind(); }
+ auto halt_cb() { return m_halt_cb_func.bind(); }
// SC getter
uint8_t get_sc() const;
@@ -102,6 +103,4 @@ protected:
// device type definition
DECLARE_DEVICE_TYPE(HP80_IO_SLOT, hp80_io_slot_device)
-void hp80_io_slot_devices(device_slot_interface &device);
-
#endif // MAME_BUS_HP80_IO_HP80_IO_H
diff --git a/src/devices/bus/hp80_optroms/hp80_optrom.h b/src/devices/bus/hp80_optroms/hp80_optrom.h
index cb8dbd4903b..33bd800027c 100644
--- a/src/devices/bus/hp80_optroms/hp80_optrom.h
+++ b/src/devices/bus/hp80_optroms/hp80_optrom.h
@@ -18,6 +18,8 @@
// Size of optional ROMs (8k)
static constexpr offs_t HP80_OPTROM_SIZE = 0x2000;
+void hp80_optrom_slot_devices(device_slot_interface &device);
+
class hp80_optrom_cart_device : public device_t,
public device_slot_card_interface
{
@@ -38,6 +40,15 @@ class hp80_optrom_slot_device : public device_t,
{
public:
// construction/destruction
+ hp80_optrom_slot_device(machine_config const &mconfig, char const *tag, device_t *owner)
+ : hp80_optrom_slot_device(mconfig, tag, owner, (uint32_t)0)
+ {
+ option_reset();
+ hp80_optrom_slot_devices(*this);
+ set_default_option(nullptr);
+ set_fixed(false);
+ }
+
hp80_optrom_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
virtual ~hp80_optrom_slot_device();
@@ -72,6 +83,4 @@ protected:
DECLARE_DEVICE_TYPE(HP80_OPTROM_SLOT, hp80_optrom_slot_device)
DECLARE_DEVICE_TYPE(HP80_OPTROM_CART, hp80_optrom_cart_device)
-void hp80_optrom_slot_devices(device_slot_interface &device);
-
#endif // MAME_BUS_HP80_OPTROMS_HP80_OPTROM_H
diff --git a/src/devices/bus/hp9845_io/98032.cpp b/src/devices/bus/hp9845_io/98032.cpp
index c4838331b87..fc55a786fe2 100644
--- a/src/devices/bus/hp9845_io/98032.cpp
+++ b/src/devices/bus/hp9845_io/98032.cpp
@@ -13,6 +13,7 @@
#include "emu.h"
#include "98032.h"
+#include "hp9885.h"
// Debugging
#define VERBOSE 0
@@ -55,12 +56,13 @@ hp98032_io_card_device::~hp98032_io_card_device()
{
}
-MACHINE_CONFIG_START(hp98032_io_card_device::device_add_mconfig)
+void hp98032_io_card_device::device_add_mconfig(machine_config &config)
+{
HP98032_GPIO_SLOT(config , m_gpio , 0);
m_gpio->pflg_cb().set(FUNC(hp98032_io_card_device::pflg_w));
m_gpio->psts_cb().set(FUNC(hp98032_io_card_device::psts_w));
m_gpio->eir_cb().set(FUNC(hp98032_io_card_device::eir_w));
-MACHINE_CONFIG_END
+}
static INPUT_PORTS_START(hp98032_port)
MCFG_HP9845_IO_SC(2)
@@ -353,6 +355,7 @@ hp98032_gpio_slot_device::hp98032_gpio_slot_device(const machine_config &mconfig
{
option_reset();
option_add("loopback" , HP98032_GPIO_LOOPBACK);
+ option_add("hp9885" , HP9885);
set_default_option(nullptr);
set_fixed(false);
}
diff --git a/src/devices/bus/hp9845_io/98034.cpp b/src/devices/bus/hp9845_io/98034.cpp
index b82935a9762..ab2985db6e2 100644
--- a/src/devices/bus/hp9845_io/98034.cpp
+++ b/src/devices/bus/hp9845_io/98034.cpp
@@ -363,9 +363,10 @@ const tiny_rom_entry *hp98034_io_card_device::device_rom_region() const
return ROM_NAME(hp98034);
}
-MACHINE_CONFIG_START(hp98034_io_card_device::device_add_mconfig)
-// Clock for NP is generated by a RC oscillator. Manual says its typical frequency
-// is around 2 MHz.
+void hp98034_io_card_device::device_add_mconfig(machine_config &config)
+{
+ // Clock for NP is generated by a RC oscillator. Manual says its typical frequency
+ // is around 2 MHz.
HP_NANOPROCESSOR(config, m_cpu, 2000000);
m_cpu->set_addrmap(AS_PROGRAM, &hp98034_io_card_device::np_program_map);
m_cpu->set_addrmap(AS_IO, &hp98034_io_card_device::np_io_map);
@@ -373,12 +374,12 @@ MACHINE_CONFIG_START(hp98034_io_card_device::device_add_mconfig)
m_cpu->read_dc().set(FUNC(hp98034_io_card_device::dc_r));
m_cpu->set_irq_acknowledge_callback(FUNC(hp98034_io_card_device::irq_callback));
- MCFG_IEEE488_SLOT_ADD("ieee_dev" , 0 , hp_ieee488_devices , nullptr)
- MCFG_IEEE488_SLOT_ADD("ieee_rem" , 0 , remote488_devices , nullptr)
- MCFG_IEEE488_BUS_ADD()
- MCFG_IEEE488_IFC_CALLBACK(WRITELINE(*this, hp98034_io_card_device , ieee488_ctrl_w))
- MCFG_IEEE488_ATN_CALLBACK(WRITELINE(*this, hp98034_io_card_device , ieee488_ctrl_w))
-MACHINE_CONFIG_END
+ IEEE488_SLOT(config , "ieee_dev" , 0 , hp_ieee488_devices , nullptr);
+ IEEE488_SLOT(config , "ieee_rem" , 0 , remote488_devices , nullptr);
+ IEEE488(config, m_ieee488);
+ m_ieee488->ifc_callback().set(FUNC(hp98034_io_card_device::ieee488_ctrl_w));
+ m_ieee488->atn_callback().set(FUNC(hp98034_io_card_device::ieee488_ctrl_w));
+}
// device type definition
DEFINE_DEVICE_TYPE(HP98034_IO_CARD, hp98034_io_card_device, "hp98034", "HP98034 card")
diff --git a/src/devices/bus/hp9845_io/hp9885.cpp b/src/devices/bus/hp9845_io/hp9885.cpp
new file mode 100644
index 00000000000..e4a2fc9f33c
--- /dev/null
+++ b/src/devices/bus/hp9845_io/hp9885.cpp
@@ -0,0 +1,974 @@
+// license:BSD-3-Clause
+// copyright-holders: F. Ulivi
+/*********************************************************************
+
+ hp9885.cpp
+
+ HP9885M 8" floppy drive
+ =======================
+
+ This driver implements HLE of HP9885 floppy drive.
+ The HP9885M is a single-disk 8" floppy drive. It connects to
+ main system through a HP98032 GPIO module. The controller in a
+ HP9885M can drive 3 more external HP9885S drives. The "M" or "S"
+ in the name stand for master and slave, respectively.
+ The enclosure of HP9885M contains the floppy drive, the controller
+ electronics and the power supply whereas the HP9885S only has the
+ drive and the power supply. A master unit interfaces to slave units
+ through a standard daisy-chained Shugart bus.
+ The controller is based on a HP Nanoprocessor with a 2 kB FW ROM.
+ Unfortunately no dumps are available of the ROM, AFAIK, so the HLE
+ is needed.
+ The HP9885 supports a single disk format having these characteristics:
+ - Single side
+ - HP MMFM modulation
+ - 30 256-byte sectors per track
+ - 77 tracks (only 67 are actually used)
+ - 360 RPM
+ - A total capacity of 514560 bytes per disk.
+
+ Summary of the command words I identified
+ =========================================
+
+ *READ*
+
+ +-----------------------------------------------+
+ |15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0|
+ +-----+-----+-----------------------------------+
+ | 0 X|Unit#| Sector count |
+ +-----+-----+-----------------------------------+
+
+ Bit 14 selects tighter margin for data reading (not emulated here)
+
+ *WRITE*
+
+ +-----------------------------------------------+
+ |15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0|
+ +-----+-----+-----------------------------------+
+ | 1 0|Unit#| Sector count |
+ +-----+-----+-----------------------------------+
+
+ *SEEK*
+
+ +-----------------------------------------------+
+ |15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0|
+ +-----+-----+--------------------+--------------+
+ | 1 1|Unit#| Track # [0..76] |Sector#[0..29]|
+ +-----+-----+--------------------+--------------+
+
+ *FORMAT TRACK* (not implemented yet)
+
+ +-----------------------------------------------+
+ |15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0|
+ +-----+-----+--------------------+--------------+
+ | 1 1|Unit#| Track # [0..76] | 0x1e |
+ +-----+-----+--------------------+--------------+
+
+ *STEP IN*
+
+ +-----------------------------------------------+
+ |15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0|
+ +-----+-----+--------------------+--------------+
+ | 1 1|Unit#| 0x7c | 0x1f |
+ +-----+-----+--------------------+--------------+
+
+ *ERASE TRACK* (not implemented yet)
+
+ +-----------------------------------------------+
+ |15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0|
+ +-----+-----+--------------------+--------------+
+ | 1 1|Unit#| 0x7d | 0x1f |
+ +-----+-----+--------------------+--------------+
+
+ *READ STATUS*
+
+ +-----------------------------------------------+
+ |15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0|
+ +-----+-----+--------------------+--------------+
+ | 1 1|Unit#| 0x7f | 0x1f |
+ +-----+-----+--------------------+--------------+
+
+ This is the structure of the status word:
+
+ +-----------------------------------------------+
+ |15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0|
+ +-----------------------+--+--+--+--+--+--+-----+
+ | Error code (0=OK) |--|XC|SC|NR|WP|DC|Unit#|
+ +-----------------------+--+--+--+--+--+--+-----+
+
+ DC: Disk changed
+ WP: Write protection
+ NR: Not ready
+ SC: Seek completed
+ XC: Transfer completed
+
+ Usage on HP9825
+ ===============
+
+ -slot0 98032_gpio -slot0:98032_gpio:gpio hp9885 -flop <floppy image>
+
+ Usage on HP9845
+ ===============
+
+ -slot0 98032_gpio -slot0:98032_gpio:gpio hp9885 -rom1 massd -flop <floppy image>
+
+ Note on floppy images
+ =====================
+
+ Images can be in two formats: MFI & HPI.
+ A pre-formatted image must be used as formatting is not supported.
+ It's not possible to format images for two reasons: the format
+ command is not implemented yet and no dump of the disk system tape
+ cartridge (HP part no. 09885-90035) is available.
+ The latter is needed during format operation to create the so-called
+ bootstraps on disk, which in turn are needed by 9825 systems.
+ A pre-formatted image (9825_empty.hpi) is available here:
+ http://www.hpmuseum.net/software/9825_discs.zip
+
+ TODO
+ ====
+
+ + Implement missing commands
+ + PRESET
+
+ Acknowledgments
+ ===============
+
+ Thanks to Dyke Shaffer for publishing a lot of HP internal docs
+ and source files regarding the HP9885.
+
+ Fun fact: data I/O between disk and 98032 module is not buffered
+ as there is no RAM in the controller. DMA must be used to keep
+ data flow at disk speed and avoid underruns. The nominal disk
+ data rate is one word every 32 µs.
+
+*********************************************************************/
+
+#include "emu.h"
+#include "hp9885.h"
+#include "formats/hpi_dsk.h"
+
+// Debugging
+#include "logmacro.h"
+#define LOG_TIMER_MASK (LOG_GENERAL << 1)
+#define LOG_TIMER(...) LOGMASKED(LOG_TIMER_MASK, __VA_ARGS__)
+#define LOG_HS_MASK (LOG_TIMER_MASK << 1)
+#define LOG_HS(...) LOGMASKED(LOG_HS_MASK, __VA_ARGS__)
+#define LOG_HEAD_MASK (LOG_HS_MASK << 1)
+#define LOG_HEAD(...) LOGMASKED(LOG_HEAD_MASK, __VA_ARGS__)
+#define LOG_DISK_MASK (LOG_HEAD_MASK << 1)
+#define LOG_DISK(...) LOGMASKED(LOG_DISK_MASK, __VA_ARGS__)
+
+#undef VERBOSE
+//#define VERBOSE (LOG_GENERAL | LOG_HS_MASK | LOG_HEAD_MASK)
+#define VERBOSE 0
+
+// Bit manipulation
+namespace {
+ template<typename T> constexpr T BIT_MASK(unsigned n)
+ {
+ return (T)1U << n;
+ }
+
+ template<typename T> void BIT_CLR(T& w , unsigned n)
+ {
+ w &= ~BIT_MASK<T>(n);
+ }
+
+ template<typename T> void BIT_SET(T& w , unsigned n)
+ {
+ w |= BIT_MASK<T>(n);
+ }
+}
+
+// device type definition
+DEFINE_DEVICE_TYPE(HP9885, hp9885_device, "hp9885" , "HP9885 floppy drive")
+
+// Timers
+enum {
+ FSM_TMR_ID,
+ HEAD_TMR_ID,
+ BIT_BYTE_TMR_ID
+};
+
+// Constants
+constexpr unsigned MAX_TRACK = 76; // Maximum valid track
+constexpr unsigned MAX_SECTOR = 29; // Maximum valid sector
+constexpr unsigned UNKNOWN_TRACK= 0xff; // Current track unknown
+constexpr unsigned STEP_MS = 8; // Step time (ms)
+constexpr unsigned SETTLING_MS = 8; // Settling time (ms)
+constexpr unsigned HEAD_TO_MS = 415; // Head unload timeout (ms)
+constexpr unsigned HD_SETTLE_MS = 50; // Head settling time (ms)
+constexpr uint16_t PASSWORD = 0xae87; // "Password" to enable commands
+constexpr unsigned HALF_CELL_US = 1; // Half bit cell duration (µs)
+constexpr unsigned STATUS_DELAY_US = 100; // Status delay (µs)
+constexpr unsigned MISSED_ID_REVS = 2; // Disk rotations to stop ID search
+
+// Bits in status word
+constexpr unsigned STS_DISK_CHANGED = 2; // Disk changed
+constexpr unsigned STS_WRITE_PROTECT= 3; // Write protection
+constexpr unsigned STS_NOT_RDY = 4; // Drive not ready
+constexpr unsigned STS_SEEK_COMPLETE= 5; // Seek completed
+constexpr unsigned STS_XFER_COMPLETE= 6; // Data transfer completed
+
+// Error codes
+enum : unsigned {
+ ERR_NONE = 0,
+ ERR_NOT_POWERED = 1,
+ ERR_DOOR_OPEN = 2,
+ ERR_NO_DISK = 3,
+ ERR_WR_DISABLED = 4,
+ ERR_ID_ERROR = 5,
+ ERR_TRACK_ERROR = 6,
+ ERR_CRC_ERROR = 7,
+ ERR_HW_FAILURE = 8
+};
+
+hp9885_device::hp9885_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+ : hp98032_gpio_card_device(mconfig , HP9885 , tag , owner , clock)
+ , m_drive_connector{*this , "floppy"}
+{
+}
+
+hp9885_device::~hp9885_device()
+{
+}
+
+uint16_t hp9885_device::get_jumpers() const
+{
+ return hp98032_gpio_slot_device::JUMPER_2 |
+ hp98032_gpio_slot_device::JUMPER_7 |
+ hp98032_gpio_slot_device::JUMPER_8 |
+ hp98032_gpio_slot_device::JUMPER_B |
+ hp98032_gpio_slot_device::JUMPER_E |
+ hp98032_gpio_slot_device::JUMPER_F;
+}
+
+uint16_t hp9885_device::input_r() const
+{
+ uint16_t tmp = m_input;
+ if (m_obf) {
+ tmp |= m_output;
+ LOG_HS("DATA OUT %04x\n" , tmp);
+ }
+ return tmp;
+}
+
+uint8_t hp9885_device::ext_status_r() const
+{
+ return 0;
+}
+
+void hp9885_device::output_w(uint16_t data)
+{
+ m_input = data;
+}
+
+void hp9885_device::ext_control_w(uint8_t data)
+{
+ LOG_HS("EXT CTRL %u\n" , data);
+ if (BIT(data , 0) &&
+ !BIT(m_status , STS_XFER_COMPLETE) &&
+ (m_op == OP_READ || m_op == OP_WRITE)) {
+ // CTL0 terminates current data transfer
+ LOG("xfer terminated\n");
+ BIT_SET(m_status , STS_XFER_COMPLETE);
+ // Prepare to output status
+ set_output();
+ }
+}
+
+WRITE_LINE_MEMBER(hp9885_device::pctl_w)
+{
+ m_pctl = state;
+ if (m_pctl) {
+ if (!m_outputting) {
+ set_ibf(true);
+ }
+ } else {
+ LOG_HS("DATA IN %04x\n" , m_input);
+ new_word();
+ }
+ update_busy();
+}
+
+WRITE_LINE_MEMBER(hp9885_device::io_w)
+{
+ LOG_HS("I/O = %d\n" , state);
+}
+
+WRITE_LINE_MEMBER(hp9885_device::preset_w)
+{
+ LOG("PRESET = %d\n" , state);
+}
+
+static const floppy_format_type hp9885_floppy_formats[] = {
+ FLOPPY_MFI_FORMAT,
+ FLOPPY_HPI_FORMAT,
+ nullptr
+};
+
+void hp9885_device::device_add_mconfig(machine_config &config)
+{
+ FLOPPY_CONNECTOR(config , "floppy" , "8ssdd" , FLOPPY_8_SSDD , true , hp9885_floppy_formats).set_fixed(true);
+}
+
+void hp9885_device::device_start()
+{
+ save_item(NAME(m_input));
+ save_item(NAME(m_output));
+ save_item(NAME(m_status));
+ save_item(NAME(m_fsm_state));
+ save_item(NAME(m_head_state));
+ save_item(NAME(m_op));
+ save_item(NAME(m_pctl));
+ save_item(NAME(m_ibf));
+ save_item(NAME(m_obf));
+ save_item(NAME(m_outputting));
+ save_item(NAME(m_had_transition));
+ save_item(NAME(m_dskchg));
+ save_item(NAME(m_track));
+ save_item(NAME(m_seek_track));
+ save_item(NAME(m_seek_sector));
+ save_item(NAME(m_sector_cnt));
+ save_item(NAME(m_word_cnt));
+ save_item(NAME(m_rev_cnt));
+ save_item(NAME(m_am_detector));
+ save_item(NAME(m_crc));
+
+ m_fsm_timer = timer_alloc(FSM_TMR_ID);
+ m_head_timer = timer_alloc(HEAD_TMR_ID);
+ m_bit_byte_timer = timer_alloc(BIT_BYTE_TMR_ID);
+
+ m_drive = m_drive_connector->get_device();
+
+ m_drive->setup_ready_cb(floppy_image_device::ready_cb(&hp9885_device::floppy_ready_cb , this));
+ m_drive->setup_index_pulse_cb(floppy_image_device::index_pulse_cb(&hp9885_device::floppy_index_cb , this));
+}
+
+void hp9885_device::device_reset()
+{
+ eir_w(0);
+ psts_w(1);
+ m_dskchg = true;
+ m_obf = false;
+ recalibrate();
+ m_seek_track = 0;
+ m_seek_sector = 0;
+ m_fsm_state = FSM_RECALIBRATING;
+ set_state(FSM_IDLE);
+}
+
+void hp9885_device::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr)
+{
+ LOG_TIMER("Tmr %.06f ID %d FSM %d HD %d\n" , machine().time().as_double() , id , m_fsm_state , m_head_state);
+
+ switch (id) {
+ case FSM_TMR_ID:
+ do_FSM();
+ break;
+
+ case HEAD_TMR_ID:
+ if (m_head_state == HEAD_SETTLING) {
+ LOG_HEAD("%.06f Head loaded\n" , machine().time().as_double());
+ m_head_state = HEAD_LOADED;
+ // Trigger actions to be done on head loading
+ do_FSM();
+ m_head_timer->adjust(attotime::from_msec(HEAD_TO_MS - HD_SETTLE_MS));
+ } else {
+ LOG_HEAD("%.06f Head unloaded\n" , machine().time().as_double());
+ m_head_state = HEAD_UNLOADED;
+ }
+ break;
+
+ case BIT_BYTE_TMR_ID:
+ {
+ switch (m_fsm_state) {
+ case FSM_WAIT_ID_AM:
+ case FSM_WAIT_DATA_AM:
+ {
+ attotime edge;
+ attotime tm;
+ edge = m_drive->get_next_transition(m_pll.ctime);
+ bool half_bit = m_pll.feed_read_data(tm , edge , attotime::never);
+ m_am_detector <<= 1;
+ m_am_detector |= half_bit;
+ if (m_am_detector == 0x55552a54) {
+ // ID AM
+ // CDCDCDCDCDCDCDCD
+ // 0 0 0 0 1 1 1 0
+ // 0 1 1 1 0 0 0 0
+ LOG_DISK("Got ID AM\n");
+ preset_crc();
+ m_word_cnt = 2;
+ set_state(FSM_RD_ID);
+ } else if (m_am_detector == 0x55552a44) {
+ // DATA AM
+ // CDCDCDCDCDCDCDCD
+ // 0 0 0 0 1 0 1 0
+ // 0 1 1 1 0 0 0 0
+ LOG_DISK("Got Data AM\n");
+ if (m_fsm_state == FSM_WAIT_DATA_AM) {
+ m_rev_cnt = 0;
+ if (BIT(m_status , STS_XFER_COMPLETE)) {
+ output_status();
+ return;
+ } else {
+ preset_crc();
+ m_word_cnt = 129;
+ if (m_op == OP_READ) {
+ set_state(FSM_RD_DATA);
+ } else {
+ set_state(FSM_WR_DATA);
+ m_pll.start_writing(m_pll.ctime);
+ m_had_transition = false;
+ wr_word(m_input);
+ set_ibf(false);
+ }
+ }
+ }
+ }
+ }
+ break;
+
+ case FSM_RD_ID:
+ {
+ // This is needed when state is switched to one of the AM waiting states
+ m_am_detector = 0;
+ auto word = rd_word();
+ m_word_cnt--;
+ LOG_DISK("W %04x C %u\n" , word , m_word_cnt);
+ if (m_word_cnt && word != ((m_seek_sector << 8) | m_track)) {
+ set_state(FSM_WAIT_ID_AM);
+ } else if (m_word_cnt == 0) {
+ if (m_crc) {
+ LOG_DISK("Wrong CRC in ID\n");
+ set_state(FSM_WAIT_ID_AM);
+ } else {
+ LOG_DISK("Sector found\n");
+ set_state(FSM_WAIT_DATA_AM);
+ }
+ }
+ }
+ break;
+
+ case FSM_RD_DATA:
+ {
+ auto word = rd_word();
+ m_word_cnt--;
+ LOG_DISK("W %04x C %u\n" , word , m_word_cnt);
+ if (m_word_cnt >= 1) {
+ if (!BIT(m_status , STS_XFER_COMPLETE)) {
+ m_output = word;
+ m_obf = true;
+ update_busy();
+ }
+ } else if (m_word_cnt == 0) {
+ if (m_crc) {
+ LOG_DISK("Wrong CRC in data\n");
+ }
+ // Move to next sector
+ adv_sector();
+ if (BIT(m_status , STS_XFER_COMPLETE) || m_sector_cnt == 0) {
+ BIT_SET(m_status , STS_XFER_COMPLETE);
+ output_status();
+ } else {
+ set_state(FSM_POSITIONING);
+ do_FSM();
+ }
+ return;
+ }
+ }
+ break;
+
+ case FSM_WR_DATA:
+ {
+ m_word_cnt--;
+ if (m_word_cnt > 1) {
+ if (BIT(m_status , STS_XFER_COMPLETE)) {
+ wr_word(0);
+ } else {
+ wr_word(m_input);
+ if (m_word_cnt > 2) {
+ set_ibf(false);
+ }
+ }
+ } else if (m_word_cnt == 1) {
+ wr_word(m_crc);
+ } else {
+ m_pll.stop_writing(m_drive , m_pll.ctime);
+ // Move to next sector
+ adv_sector();
+ if (BIT(m_status , STS_XFER_COMPLETE) || m_sector_cnt == 0) {
+ BIT_SET(m_status , STS_XFER_COMPLETE);
+ output_status();
+ } else {
+ set_ibf(false);
+ set_state(FSM_POSITIONING);
+ do_FSM();
+ }
+ return;
+ }
+ }
+ break;
+
+ default:
+ LOG("Invalid FSM state %d\n" , m_fsm_state);
+ set_state(FSM_IDLE);
+ return;
+ }
+ timer.adjust(m_pll.ctime - machine().time());
+ }
+ break;
+ }
+}
+
+void hp9885_device::floppy_ready_cb(floppy_image_device *floppy , int state)
+{
+ LOG("ready %d\n" , state);
+ if (state) {
+ // drive not ready
+ m_dskchg = true;
+ }
+}
+
+void hp9885_device::floppy_index_cb(floppy_image_device *floppy , int state)
+{
+ if (state && m_rev_cnt && --m_rev_cnt == 0) {
+ // Sector not found
+ LOG("Sector not found\n");
+ stop_rdwr();
+ set_error(ERR_ID_ERROR);
+ output_status(true);
+ }
+}
+
+void hp9885_device::set_state(int new_state)
+{
+ if (m_fsm_state != new_state) {
+ LOG("%.06f FSM %d->%d\n" , machine().time().as_double() , m_fsm_state , new_state);
+ m_fsm_state = new_state;
+ if (m_fsm_state == FSM_IDLE) {
+ m_op = OP_NONE;
+ m_outputting = false;
+ set_ibf(false);
+ m_fsm_timer->reset();
+ stop_rdwr();
+ m_rev_cnt = 0;
+ }
+ }
+}
+
+void hp9885_device::init_status(unsigned unit_no)
+{
+ m_status = unit_no & 3;
+ if (unit_no == 0) {
+ if (m_drive->ready_r()) {
+ BIT_SET(m_status , STS_NOT_RDY);
+ }
+ if (m_dskchg) {
+ BIT_SET(m_status , STS_DISK_CHANGED);
+ }
+ if (m_drive->wpt_r()) {
+ BIT_SET(m_status , STS_WRITE_PROTECT);
+ }
+ } else {
+ // Units 1,2,3 are not present
+ BIT_SET(m_status , STS_NOT_RDY);
+ }
+}
+
+void hp9885_device::encode_error(bool writing)
+{
+ if (m_status & 3) {
+ set_error(ERR_NOT_POWERED);
+ } else if (writing && BIT(m_status , STS_WRITE_PROTECT)) {
+ set_error(ERR_WR_DISABLED);
+ } else if (BIT(m_status , STS_NOT_RDY)) {
+ set_error(ERR_NO_DISK);
+ }
+}
+
+void hp9885_device::set_error(unsigned error_code)
+{
+ m_status = (m_status & 0xff) | (error_code << 8);
+ if (error_code != ERR_NONE) {
+ LOG_HS("EIR 1\n");
+ eir_w(1);
+ psts_w(0);
+ } else {
+ LOG_HS("EIR 0\n");
+ eir_w(0);
+ psts_w(1);
+ }
+}
+
+void hp9885_device::new_word()
+{
+ unsigned unit_no = (m_input >> 12) & 3;
+
+ switch (m_fsm_state) {
+ case FSM_IDLE:
+ if (m_input == PASSWORD) {
+ LOG("Got PW\n");
+ set_state(FSM_GOT_PW);
+ } else {
+ LOG("Wrong sequence\n");
+ // TODO:
+ // It probably does nothing IRL
+ }
+ set_ibf(false);
+ break;
+
+ case FSM_GOT_PW:
+ // Decode new command
+ switch (m_input & 0xc000) {
+ case 0x0000:
+ case 0x4000:
+ // Read
+ init_status(unit_no);
+ if (!BIT(m_status , STS_NOT_RDY)) {
+ m_sector_cnt = m_input & 0x0fff;
+ LOG("Read %u sectors @%u:%u\n" , m_sector_cnt , m_seek_track , m_seek_sector);
+ m_op = OP_READ;
+ set_state(FSM_POSITIONING);
+ if (load_head()) {
+ m_fsm_timer->adjust(attotime::zero);
+ }
+ set_output();
+ } else {
+ encode_error(false);
+ output_status();
+ }
+ break;
+
+ case 0x8000:
+ // Write
+ init_status(unit_no);
+ if (!BIT(m_status , STS_NOT_RDY) && !BIT(m_status , STS_WRITE_PROTECT)) {
+ m_sector_cnt = m_input & 0x0fff;
+ LOG("Write %u sectors @%u:%u\n" , m_sector_cnt , m_seek_track , m_seek_sector);
+ m_op = OP_WRITE;
+ set_state(FSM_POSITIONING);
+ if (load_head()) {
+ m_fsm_timer->adjust(attotime::zero);
+ }
+ set_ibf(false);
+ } else {
+ encode_error(true);
+ output_status(true);
+ }
+ break;
+
+ case 0xc000:
+ {
+ // Seek & other commands
+ uint8_t track_no = (m_input >> 5) & 0x7f;
+ uint8_t sect_no = m_input & 0x1f;
+ if (sect_no == 0x1e) {
+ // Format
+ LOG("Format\n");
+ // TODO:
+ } else if (sect_no == 0x1f) {
+ switch (track_no) {
+ case 0x7c:
+ // Step in
+ init_status(unit_no);
+ if (!BIT(m_status , STS_NOT_RDY)) {
+ LOG("Step in\n");
+ m_seek_track = m_track + 1;
+ m_op = OP_STEP_IN;
+ set_state(FSM_SEEKING);
+ if (load_head()) {
+ m_fsm_timer->adjust(attotime::zero);
+ }
+ } else {
+ encode_error(false);
+ output_status();
+ }
+ break;
+
+ case 0x7d:
+ // Write all track
+ LOG("Write all track\n");
+ // TODO:
+ break;
+
+ case 0x7f:
+ // Read status
+ init_status(unit_no);
+ if (!BIT(m_status , STS_NOT_RDY) && BIT(m_status , STS_DISK_CHANGED)) {
+ LOG("Get status DSKCHG\n");
+ m_op = OP_GET_STATUS;
+ set_state(FSM_POSITIONING);
+ if (load_head()) {
+ m_fsm_timer->adjust(attotime::zero);
+ }
+ } else {
+ LOG("Get status !DSKCHG\n");
+ encode_error(false);
+ output_status();
+ }
+ break;
+
+ default:
+ LOG("Unknown command %02x\n" , track_no);
+ }
+ } else {
+ // Plain seek
+ LOG("Seek to %u:%u\n" , track_no , sect_no);
+ m_seek_track = track_no;
+ m_seek_sector = sect_no;
+ set_state(FSM_IDLE);
+ }
+ }
+ break;
+ }
+ break;
+
+ case FSM_RD_STATUS1:
+ set_error(ERR_NONE);
+ set_state(FSM_RD_STATUS2);
+ m_outputting = false;
+ m_obf = false;
+ break;
+
+ case FSM_RD_STATUS2:
+ set_state(FSM_IDLE);
+ break;
+
+ case FSM_RD_DATA:
+ m_obf = false;
+ break;
+
+ default:
+ if (m_op != OP_WRITE) {
+ LOG("Got data in state %d!\n" , m_fsm_state);
+ }
+ }
+}
+
+void hp9885_device::do_FSM()
+{
+ switch (m_fsm_state) {
+ case FSM_RECALIBRATING:
+ // Keep head loaded
+ load_head();
+ if (m_drive->trk00_r()) {
+ one_step(true);
+ } else {
+ set_state(FSM_POSITIONING);
+ m_fsm_timer->adjust(attotime::from_msec(SETTLING_MS));
+ m_track = 0;
+ }
+ break;
+
+ case FSM_SETTLING:
+ if (m_op == OP_READ || m_op == OP_WRITE) {
+ // Set seek complete
+ BIT_SET(m_status , STS_SEEK_COMPLETE);
+ if (m_sector_cnt--) {
+ m_rev_cnt = MISSED_ID_REVS;
+ set_state(FSM_WAIT_ID_AM);
+ start_rd();
+ } else {
+ output_status();
+ }
+ } else if (m_op == OP_STEP_IN) {
+ // Step IN
+ // Set seek complete
+ BIT_SET(m_status , STS_SEEK_COMPLETE);
+ output_status();
+ } else {
+ // Get status
+ output_status();
+ }
+ break;
+
+ case FSM_POSITIONING:
+ case FSM_SEEKING:
+ // Keep head loaded
+ load_head();
+ // Need recalibration?
+ if (m_track == UNKNOWN_TRACK) {
+ set_state(FSM_RECALIBRATING);
+ m_fsm_timer->adjust(attotime::zero);
+ } else if (m_seek_track != m_track) {
+ set_state(FSM_SEEKING);
+ one_step(m_seek_track < m_track);
+ } else {
+ if (m_fsm_state == FSM_SEEKING) {
+ m_fsm_timer->adjust(attotime::from_msec(SETTLING_MS));
+ } else {
+ m_fsm_timer->adjust(attotime::zero);
+ }
+ set_state(FSM_SETTLING);
+ }
+ break;
+
+ case FSM_STATUS_DELAY:
+ output_status();
+ break;
+
+ default:
+ LOG("Invalid state=%d\n" , m_fsm_state);
+ set_state(FSM_IDLE);
+ }
+ update_busy();
+}
+
+bool hp9885_device::load_head()
+{
+ m_dskchg = false;
+
+ switch (m_head_state) {
+ case HEAD_UNLOADED:
+ case HEAD_SETTLING:
+ LOG_HEAD("%.06f Loading head..\n" , machine().time().as_double());
+ m_head_state = HEAD_SETTLING;
+ m_head_timer->adjust(attotime::from_msec(HD_SETTLE_MS));
+ return false;
+
+ case HEAD_LOADED:
+ LOG_HEAD("%.06f Keep head loaded\n" , machine().time().as_double());
+ m_head_timer->adjust(attotime::from_msec(HEAD_TO_MS));
+ return true;
+
+ default:
+ LOG("Invalid head state %d\n" , m_head_state);
+ m_head_state = HEAD_UNLOADED;
+ return false;
+ }
+}
+
+void hp9885_device::recalibrate()
+{
+ m_track = UNKNOWN_TRACK;
+}
+
+void hp9885_device::one_step(bool outward)
+{
+ if (outward) {
+ if (m_track > 0) {
+ m_track--;
+ }
+ } else {
+ if (m_track < MAX_TRACK) {
+ m_track++;
+ }
+ }
+ LOG_HEAD("%.06f Step to trk %u\n" , machine().time().as_double() , m_track);
+ m_drive->dir_w(outward);
+ m_drive->stp_w(0);
+ m_drive->stp_w(1);
+ m_fsm_timer->adjust(attotime::from_msec(STEP_MS));
+}
+
+void hp9885_device::adv_sector()
+{
+ if (++m_seek_sector > MAX_SECTOR) {
+ m_seek_sector = 0;
+ if (m_seek_track < MAX_TRACK) {
+ m_seek_track++;
+ }
+ }
+}
+
+void hp9885_device::start_rd()
+{
+ m_pll.set_clock(attotime::from_usec(HALF_CELL_US));
+ m_pll.read_reset(machine().time());
+ m_bit_byte_timer->adjust(attotime::zero);
+ m_am_detector = 0;
+}
+
+void hp9885_device::stop_rdwr()
+{
+ m_bit_byte_timer->reset();
+}
+
+uint16_t hp9885_device::rd_word()
+{
+ uint16_t word = 0;
+ for (unsigned i = 0; i < 16; ++i) {
+ attotime edge;
+ attotime tm;
+ edge = m_drive->get_next_transition(m_pll.ctime);
+ // Read & discard clock bit
+ m_pll.feed_read_data(tm , edge , attotime::never);
+ edge = m_drive->get_next_transition(m_pll.ctime);
+ bool data_bit = m_pll.feed_read_data(tm , edge , attotime::never);
+ word >>= 1;
+ if (data_bit) {
+ BIT_SET(word , 15);
+ }
+ update_crc(data_bit);
+ }
+ return word;
+}
+
+void hp9885_device::wr_word(uint16_t word)
+{
+ for (unsigned i = 0; i < 16; ++i) {
+ bool data_bit = BIT(word , i);
+ bool clock_bit = !data_bit && !m_had_transition;
+ m_had_transition = data_bit || clock_bit;
+ attotime dummy;
+
+ m_pll.write_next_bit(clock_bit , dummy , nullptr , attotime::never);
+ m_pll.write_next_bit(data_bit , dummy , nullptr , attotime::never);
+ update_crc(data_bit);
+ }
+ m_pll.commit(m_drive , m_pll.ctime);
+}
+
+void hp9885_device::preset_crc()
+{
+ m_crc = ~0;
+}
+
+void hp9885_device::update_crc(bool bit)
+{
+ bool crc_x15 = BIT(m_crc , 0);
+ m_crc >>= 1;
+ if (bit ^ crc_x15) {
+ m_crc ^= 0x8408;
+ }
+}
+
+void hp9885_device::set_ibf(bool state)
+{
+ m_ibf = state;
+ update_busy();
+}
+
+void hp9885_device::set_output()
+{
+ m_outputting = true;
+ m_obf = false;
+ set_ibf(false);
+}
+
+void hp9885_device::output_status(bool delayed)
+{
+ stop_rdwr();
+ if (delayed) {
+ set_output();
+ set_state(FSM_STATUS_DELAY);
+ m_fsm_timer->adjust(attotime::from_usec(STATUS_DELAY_US));
+ } else {
+ set_state(FSM_RD_STATUS1);
+ m_outputting = true;
+ m_obf = true;
+ // Set status in output buffer
+ m_output = m_status;
+ set_ibf(false);
+ }
+}
+
+void hp9885_device::update_busy()
+{
+ bool busy = (!m_outputting && m_ibf) || (m_outputting && m_pctl && m_obf);
+ LOG_HS("PCTL %d BUSY %d OUT %d IBF %d OBF %d\n" , m_pctl , busy , m_outputting , m_ibf , m_obf);
+ pflg_w(!busy);
+}
diff --git a/src/devices/bus/hp9845_io/hp9885.h b/src/devices/bus/hp9845_io/hp9885.h
new file mode 100644
index 00000000000..edb705c2504
--- /dev/null
+++ b/src/devices/bus/hp9845_io/hp9885.h
@@ -0,0 +1,136 @@
+// license:BSD-3-Clause
+// copyright-holders: F. Ulivi
+/*********************************************************************
+
+ hp9885.h
+
+ HP9885M 8" floppy drive
+
+*********************************************************************/
+
+#ifndef MAME_BUS_HP9845_IO_HP9885_H
+#define MAME_BUS_HP9845_IO_HP9885_H
+
+#pragma once
+
+#include "98032.h"
+#include "imagedev/floppy.h"
+#include "machine/fdc_pll.h"
+
+class hp9885_device : public hp98032_gpio_card_device
+{
+public:
+ hp9885_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+ virtual ~hp9885_device();
+
+ // hp98032_gpio_card_device overrides
+ virtual uint16_t get_jumpers() const override;
+ virtual uint16_t input_r() const override;
+ virtual uint8_t ext_status_r() const override;
+ virtual void output_w(uint16_t data) override;
+ virtual void ext_control_w(uint8_t data) override;
+ virtual DECLARE_WRITE_LINE_MEMBER(pctl_w) override;
+ virtual DECLARE_WRITE_LINE_MEMBER(io_w) override;
+ virtual DECLARE_WRITE_LINE_MEMBER(preset_w) override;
+
+protected:
+ // device-level overrides
+ virtual void device_add_mconfig(machine_config &config) override;
+ virtual void device_start() override;
+ virtual void device_reset() override;
+ virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override;
+
+private:
+ // FSM states
+ enum {
+ FSM_IDLE,
+ FSM_RECALIBRATING,
+ FSM_SETTLING,
+ FSM_GOT_PW,
+ FSM_POSITIONING,
+ FSM_SEEKING,
+ FSM_STATUS_DELAY,
+ FSM_RD_STATUS1,
+ FSM_RD_STATUS2,
+ FSM_WAIT_ID_AM,
+ FSM_RD_ID,
+ FSM_WAIT_DATA_AM,
+ FSM_RD_DATA,
+ FSM_WR_DATA
+ };
+
+ // Head states
+ enum {
+ HEAD_UNLOADED,
+ HEAD_SETTLING,
+ HEAD_LOADED
+ };
+
+ // Operations
+ enum {
+ OP_NONE,
+ OP_READ,
+ OP_WRITE,
+ OP_STEP_IN,
+ OP_GET_STATUS
+ };
+
+ required_device<floppy_connector> m_drive_connector;
+ floppy_image_device *m_drive;
+ uint16_t m_input;
+ uint16_t m_output;
+ uint16_t m_status;
+ int m_fsm_state;
+ int m_head_state;
+ int m_op;
+ bool m_pctl;
+ bool m_ibf;
+ bool m_obf;
+ bool m_outputting;
+ bool m_had_transition;
+ bool m_dskchg;
+ unsigned m_track;
+ unsigned m_seek_track;
+ unsigned m_seek_sector;
+ unsigned m_sector_cnt;
+ unsigned m_word_cnt;
+ unsigned m_rev_cnt;
+ uint32_t m_am_detector;
+ uint16_t m_crc; // x^15 is stored in LSB
+
+ // Timers
+ emu_timer *m_fsm_timer;
+ emu_timer *m_head_timer;
+ emu_timer *m_bit_byte_timer;
+
+ // PLL
+ fdc_pll_t m_pll;
+
+ void floppy_ready_cb(floppy_image_device *floppy , int state);
+ void floppy_index_cb(floppy_image_device *floppy , int state);
+
+ void set_state(int new_state);
+ void init_status(unsigned unit_no);
+ void encode_error(bool writing);
+ void set_error(unsigned error_code);
+ void new_word();
+ void do_FSM();
+ bool load_head();
+ void recalibrate();
+ void one_step(bool outward);
+ void adv_sector();
+ void start_rd();
+ void stop_rdwr();
+ uint16_t rd_word();
+ void wr_word(uint16_t word);
+ void preset_crc();
+ void update_crc(bool bit);
+ void set_ibf(bool state);
+ void set_output();
+ void output_status(bool delayed = false);
+ void update_busy();
+};
+
+DECLARE_DEVICE_TYPE(HP9885 , hp9885_device)
+
+#endif /* MAME_BUS_HP9845_IO_HP9885_H */
diff --git a/src/devices/bus/hp_dio/hp98265a.cpp b/src/devices/bus/hp_dio/hp98265a.cpp
index baafc4e14eb..c5c28eeda6b 100644
--- a/src/devices/bus/hp_dio/hp98265a.cpp
+++ b/src/devices/bus/hp_dio/hp98265a.cpp
@@ -168,12 +168,12 @@ void dio16_98265a_device::device_reset()
code &= REG_SW1_SELECT_CODE_MASK;
if (!m_installed_io) {
- program_space()->install_readwrite_handler(
+ program_space().install_readwrite_handler(
0x600000 + (code * 0x10000),
0x6007ff + (code * 0x10000),
read16_delegate(FUNC(dio16_98265a_device::io_r), this),
write16_delegate(FUNC(dio16_98265a_device::io_w), this));
- program_space()->install_device(0x6e0020, 0x6e003f, *m_spc, &mb87030_device::map, 0x00ff00ff);
+ program_space().install_device(0x6e0020, 0x6e003f, *m_spc, &mb87030_device::map, 0x00ff00ff);
m_installed_io = true;
}
m_control = 0;
diff --git a/src/devices/bus/hp_dio/hp98603a.cpp b/src/devices/bus/hp_dio/hp98603a.cpp
index bcd5fe3536c..ac04f7479bd 100644
--- a/src/devices/bus/hp_dio/hp98603a.cpp
+++ b/src/devices/bus/hp_dio/hp98603a.cpp
@@ -39,8 +39,9 @@ ROM_START(hp98603a)
ROM_LOAD16_BYTE("98603_80016.bin", 0x70000, 32768, CRC(d887acab) SHA1(a9cbbaa5f053f374d6cbda614b727df35a61ace1))
ROM_END
-MACHINE_CONFIG_START(dio16_98603a_device::device_add_mconfig)
-MACHINE_CONFIG_END
+void dio16_98603a_device::device_add_mconfig(machine_config &config)
+{
+}
const tiny_rom_entry *dio16_98603a_device::device_rom_region() const
{
diff --git a/src/devices/bus/hp_dio/hp98603b.cpp b/src/devices/bus/hp_dio/hp98603b.cpp
index 4da45470d0e..6c8cff6b95a 100644
--- a/src/devices/bus/hp_dio/hp98603b.cpp
+++ b/src/devices/bus/hp_dio/hp98603b.cpp
@@ -34,8 +34,9 @@ ROM_START(hp98603b)
ROM_LOAD16_BYTE("u14.bin", 0xa0001, 65536, CRC(96527d4e) SHA1(6706ab97eab4465ea4fa2d6b07e8107468e83818))
ROM_END
-MACHINE_CONFIG_START(dio16_98603b_device::device_add_mconfig)
-MACHINE_CONFIG_END
+void dio16_98603b_device::device_add_mconfig(machine_config &config)
+{
+}
const tiny_rom_entry *dio16_98603b_device::device_rom_region() const
{
diff --git a/src/devices/bus/hp_dio/hp98620.cpp b/src/devices/bus/hp_dio/hp98620.cpp
index 2fdc8e0f932..fcd0e9d95aa 100644
--- a/src/devices/bus/hp_dio/hp98620.cpp
+++ b/src/devices/bus/hp_dio/hp98620.cpp
@@ -74,7 +74,7 @@ void dio16_98620_device::device_reset()
{
if (!m_installed_io)
{
- program_space()->install_readwrite_handler(0x500000, 0x50020f,
+ program_space().install_readwrite_handler(0x500000, 0x50020f,
read16_delegate(FUNC(dio16_98620_device::dma_r), this),
write16_delegate(FUNC(dio16_98620_device::dma_w), this));
m_installed_io = true;
@@ -343,9 +343,9 @@ void dio16_98620_device::dma_transfer(int channel)
if (m_regs[channel].dma_out) {
- dmack_w_out(channel, program_space()->read_byte(m_regs[channel].address++));
+ dmack_w_out(channel, program_space().read_byte(m_regs[channel].address++));
} else {
- program_space()->write_byte(m_regs[channel].address++, dmack_r_out(channel));
+ program_space().write_byte(m_regs[channel].address++, dmack_r_out(channel));
}
diff --git a/src/devices/bus/hp_dio/hp98643.cpp b/src/devices/bus/hp_dio/hp98643.cpp
index 5a439144d6d..57bc4d1a283 100644
--- a/src/devices/bus/hp_dio/hp98643.cpp
+++ b/src/devices/bus/hp_dio/hp98643.cpp
@@ -105,7 +105,7 @@ void dio16_98643_device::device_reset()
uint32_t baseaddr = 0x600000 + (code << 16);
- program_space()->install_device(baseaddr, baseaddr + 0xffff,
+ program_space().install_device(baseaddr, baseaddr + 0xffff,
*this, &dio16_98643_device::addrmap);
m_installed_io = true;
}
diff --git a/src/devices/bus/hp_dio/hp_dio.cpp b/src/devices/bus/hp_dio/hp_dio.cpp
index dfa228dc8af..c2cbfa8e941 100644
--- a/src/devices/bus/hp_dio/hp_dio.cpp
+++ b/src/devices/bus/hp_dio/hp_dio.cpp
@@ -104,8 +104,7 @@ dio16_device::dio16_device(const machine_config &mconfig, const char *tag, devic
dio16_device::dio16_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock) :
device_t(mconfig, type, tag, owner, clock),
- m_maincpu(*this, finder_base::DUMMY_TAG),
- m_prgspace(nullptr),
+ m_prgspace(*this, finder_base::DUMMY_TAG, -1),
m_irq1_out_cb(*this),
m_irq2_out_cb(*this),
m_irq3_out_cb(*this),
@@ -136,8 +135,7 @@ void dio16_device::device_start()
m_dmar0_out_cb.resolve_safe();
m_dmar1_out_cb.resolve_safe();
- m_prgspace = &m_maincpu->space(AS_PROGRAM);
- m_prgwidth = m_maincpu->space_config(AS_PROGRAM)->data_width();
+ m_prgwidth = m_prgspace->data_width();
save_item(NAME(m_irq));
save_item(NAME(m_dmar));
diff --git a/src/devices/bus/hp_dio/hp_dio.h b/src/devices/bus/hp_dio/hp_dio.h
index ddf95e9570c..ee680b08d4b 100644
--- a/src/devices/bus/hp_dio/hp_dio.h
+++ b/src/devices/bus/hp_dio/hp_dio.h
@@ -65,7 +65,7 @@ public:
// construction/destruction
dio16_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
// inline configuration
- template <typename T> void set_cputag(T &&tag) { m_maincpu.set_tag(std::forward<T>(tag)); }
+ template <typename T> void set_program_space(T &&tag, int spacenum) { m_prgspace.set_tag(std::forward<T>(tag), spacenum); }
// callback configuration
auto dmar0_out_cb() { return m_dmar0_out_cb.bind(); }
@@ -89,7 +89,7 @@ public:
void unmap_bank(offs_t start, offs_t end);
void unmap_rom(offs_t start, offs_t end);
- address_space *program_space() { return m_prgspace; }
+ address_space &program_space() { return *m_prgspace; }
// IRQs 1, 2, and 7 are reserved for non-bus usage.
@@ -137,11 +137,10 @@ protected:
virtual void device_reset() override;
// internal state
- required_device<cpu_device> m_maincpu;
std::list<device_dio16_card_interface *> m_cards;
// address spaces
- address_space *m_prgspace;
+ required_address_space m_prgspace;
int m_bus_index;
// packed line states
@@ -187,7 +186,7 @@ protected:
virtual void interface_pre_start() override;
int get_index() { return m_index; };
- address_space *program_space() { return m_dio_dev->program_space(); }
+ address_space &program_space() { return m_dio_dev->program_space(); }
DECLARE_WRITE_LINE_MEMBER(irq1_out) { m_dio_dev->set_irq(m_index, 0, state); }
DECLARE_WRITE_LINE_MEMBER(irq2_out) { m_dio_dev->set_irq(m_index, 1, state); }
diff --git a/src/devices/bus/hp_dio/human_interface.cpp b/src/devices/bus/hp_dio/human_interface.cpp
index 9c58672e11d..d7cfad37d50 100644
--- a/src/devices/bus/hp_dio/human_interface.cpp
+++ b/src/devices/bus/hp_dio/human_interface.cpp
@@ -114,11 +114,11 @@ human_interface_device::human_interface_device(const machine_config &mconfig, de
void human_interface_device::device_start()
{
- program_space()->install_readwrite_handler(0x420000, 0x420003, 0x0003, 0xfffc, 0,
+ program_space().install_readwrite_handler(0x420000, 0x420003, 0x0003, 0xfffc, 0,
read8_delegate(FUNC(upi41_cpu_device::upi41_master_r), &(*m_iocpu)),
write8_delegate(FUNC(upi41_cpu_device::upi41_master_w), &(*m_iocpu)), 0x00ff00ff);
- program_space()->install_readwrite_handler(0x470000, 0x47001f, 0x1f, 0xffe0, 0,
+ program_space().install_readwrite_handler(0x470000, 0x47001f, 0x1f, 0xffe0, 0,
read8_delegate(FUNC(human_interface_device::gpib_r), this),
write8_delegate(FUNC(human_interface_device::gpib_w), this), 0x00ff00ff);
@@ -194,7 +194,7 @@ WRITE8_MEMBER(human_interface_device::ieee488_dio_w)
WRITE8_MEMBER(human_interface_device::gpib_w)
{
if (offset & 0x08) {
- m_tms9914->reg8_w(space, offset & 0x07, data);
+ m_tms9914->write(offset & 0x07, data);
return;
}
@@ -234,7 +234,7 @@ READ8_MEMBER(human_interface_device::gpib_r)
uint8_t data = 0xff;
if (offset & 0x8) {
- data = m_tms9914->reg8_r(space, offset & 0x07);
+ data = m_tms9914->read(offset & 0x07);
return data;
}
@@ -360,14 +360,14 @@ void human_interface_device::dmack_w_in(int channel, uint8_t data)
{
if (channel)
return;
- m_tms9914->reg8_w(*program_space(), 7, data);
+ m_tms9914->write(7, data);
}
uint8_t human_interface_device::dmack_r_in(int channel)
{
if (channel || !m_gpib_dma_enable)
return 0xff;
- return m_tms9914->reg8_r(machine().dummy_space(), 7);
+ return m_tms9914->read(7);
}
} // namespace bus::hp_dio
diff --git a/src/devices/bus/ieee488/c2040fdc.h b/src/devices/bus/ieee488/c2040fdc.h
index c73e9826fbf..64239991222 100644
--- a/src/devices/bus/ieee488/c2040fdc.h
+++ b/src/devices/bus/ieee488/c2040fdc.h
@@ -18,22 +18,6 @@
#include "imagedev/floppy.h"
-
-//**************************************************************************
-// INTERFACE CONFIGURATION MACROS
-//**************************************************************************
-
-#define MCFG_C2040_SYNC_CALLBACK(_write) \
- downcast<c2040_fdc_device &>(*device).set_sync_wr_callback(DEVCB_##_write);
-
-#define MCFG_C2040_READY_CALLBACK(_write) \
- downcast<c2040_fdc_device &>(*device).set_ready_wr_callback(DEVCB_##_write);
-
-#define MCFG_C2040_ERROR_CALLBACK(_write) \
- downcast<c2040_fdc_device &>(*device).set_error_wr_callback(DEVCB_##_write);
-
-
-
//**************************************************************************
// TYPE DEFINITIONS
//**************************************************************************
@@ -46,9 +30,6 @@ public:
// construction/destruction
c2040_fdc_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- template <class Object> devcb_base &set_sync_wr_callback(Object &&cb) { return m_write_sync.set_callback(std::forward<Object>(cb)); }
- template <class Object> devcb_base &set_ready_wr_callback(Object &&cb) { return m_write_ready.set_callback(std::forward<Object>(cb)); }
- template <class Object> devcb_base &set_error_wr_callback(Object &&cb) { return m_write_error.set_callback(std::forward<Object>(cb)); }
auto sync_wr_callback() { return m_write_sync.bind(); }
auto ready_wr_callback() { return m_write_ready.bind(); }
auto error_wr_callback() { return m_write_error.bind(); }
diff --git a/src/devices/bus/ieee488/c8280.cpp b/src/devices/bus/ieee488/c8280.cpp
index 51293bda1d7..63b5cbe2506 100644
--- a/src/devices/bus/ieee488/c8280.cpp
+++ b/src/devices/bus/ieee488/c8280.cpp
@@ -293,30 +293,31 @@ FLOPPY_FORMATS_END
// device_add_mconfig - add device configuration
//-------------------------------------------------
-MACHINE_CONFIG_START(c8280_device::device_add_mconfig)
- MCFG_DEVICE_ADD(M6502_DOS_TAG, M6502, XTAL(12'000'000)/8)
- MCFG_DEVICE_PROGRAM_MAP(c8280_main_mem)
+void c8280_device::device_add_mconfig(machine_config &config)
+{
+ M6502(config, m_maincpu, XTAL(12'000'000)/8);
+ m_maincpu->set_addrmap(AS_PROGRAM, &c8280_device::c8280_main_mem);
- MCFG_DEVICE_ADD(M6532_0_TAG, MOS6532_NEW, XTAL(12'000'000)/8)
- MCFG_MOS6530n_IN_PA_CB(READ8(*this, c8280_device, dio_r))
- MCFG_MOS6530n_OUT_PB_CB(WRITE8(*this, c8280_device, dio_w))
+ MOS6532_NEW(config, m_riot0, XTAL(12'000'000)/8);
+ m_riot0->pa_rd_callback().set(FUNC(c8280_device::dio_r));
+ m_riot0->pb_wr_callback().set(FUNC(c8280_device::dio_w));
- MCFG_DEVICE_ADD(M6532_1_TAG, MOS6532_NEW, XTAL(12'000'000)/8)
- MCFG_MOS6530n_IN_PA_CB(READ8(*this, c8280_device, riot1_pa_r))
- MCFG_MOS6530n_OUT_PA_CB(WRITE8(*this, c8280_device, riot1_pa_w))
- MCFG_MOS6530n_IN_PB_CB(READ8(*this, c8280_device, riot1_pb_r))
- MCFG_MOS6530n_OUT_PB_CB(WRITE8(*this, c8280_device, riot1_pb_w))
- MCFG_MOS6530n_IRQ_CB(INPUTLINE(M6502_DOS_TAG, INPUT_LINE_IRQ0))
+ MOS6532_NEW(config, m_riot1, XTAL(12'000'000)/8);
+ m_riot1->pa_rd_callback().set(FUNC(c8280_device::riot1_pa_r));
+ m_riot1->pa_wr_callback().set(FUNC(c8280_device::riot1_pa_w));
+ m_riot1->pb_rd_callback().set(FUNC(c8280_device::riot1_pb_r));
+ m_riot1->pb_wr_callback().set(FUNC(c8280_device::riot1_pb_w));
+ m_riot1->irq_wr_callback().set_inputline(m_maincpu, INPUT_LINE_IRQ0);
- MCFG_DEVICE_ADD(M6502_FDC_TAG, M6502, XTAL(12'000'000)/8)
- MCFG_DEVICE_PROGRAM_MAP(c8280_fdc_mem)
+ M6502(config, m_fdccpu, XTAL(12'000'000)/8);
+ m_fdccpu->set_addrmap(AS_PROGRAM, &c8280_device::c8280_fdc_mem);
FD1797(config, m_fdc, XTAL(12'000'000)/6);
m_fdc->intrq_wr_callback().set_inputline(m_fdccpu, M6502_IRQ_LINE);
m_fdc->drq_wr_callback().set_inputline(m_fdccpu, M6502_SET_OVERFLOW);
FLOPPY_CONNECTOR(config, m_floppy0, c8280_floppies, "8dsdd", c8280_device::floppy_formats);
FLOPPY_CONNECTOR(config, m_floppy1, c8280_floppies, "8dsdd", c8280_device::floppy_formats);
-MACHINE_CONFIG_END
+}
//-------------------------------------------------
diff --git a/src/devices/bus/ieee488/hardbox.cpp b/src/devices/bus/ieee488/hardbox.cpp
index 677037c5ba7..0b982ee772d 100644
--- a/src/devices/bus/ieee488/hardbox.cpp
+++ b/src/devices/bus/ieee488/hardbox.cpp
@@ -267,11 +267,12 @@ WRITE8_MEMBER( hardbox_device::ppi1_pc_w )
// device_add_mconfig - add device configuration
//-------------------------------------------------
-MACHINE_CONFIG_START(hardbox_device::device_add_mconfig)
+void hardbox_device::device_add_mconfig(machine_config &config)
+{
// basic machine hardware
- MCFG_DEVICE_ADD(Z80_TAG, Z80, XTAL(8'000'000)/2)
- MCFG_DEVICE_PROGRAM_MAP(hardbox_mem)
- MCFG_DEVICE_IO_MAP(hardbox_io)
+ Z80(config, m_maincpu, XTAL(8'000'000)/2);
+ m_maincpu->set_addrmap(AS_PROGRAM, &hardbox_device::hardbox_mem);
+ m_maincpu->set_addrmap(AS_IO, &hardbox_device::hardbox_io);
// devices
i8255_device &ppi0(I8255A(config, I8255_0_TAG));
@@ -285,16 +286,12 @@ MACHINE_CONFIG_START(hardbox_device::device_add_mconfig)
ppi1.in_pc_callback().set(FUNC(hardbox_device::ppi1_pc_r));
ppi1.out_pc_callback().set(FUNC(hardbox_device::ppi1_pc_w));
- MCFG_DEVICE_ADD(CORVUS_HDC_TAG, CORVUS_HDC, 0)
- MCFG_HARDDISK_ADD("harddisk1")
- MCFG_HARDDISK_INTERFACE("corvus_hdd")
- MCFG_HARDDISK_ADD("harddisk2")
- MCFG_HARDDISK_INTERFACE("corvus_hdd")
- MCFG_HARDDISK_ADD("harddisk3")
- MCFG_HARDDISK_INTERFACE("corvus_hdd")
- MCFG_HARDDISK_ADD("harddisk4")
- MCFG_HARDDISK_INTERFACE("corvus_hdd")
-MACHINE_CONFIG_END
+ CORVUS_HDC(config, m_hdc, 0);
+ HARDDISK(config, "harddisk1", "corvus_hdd");
+ HARDDISK(config, "harddisk2", "corvus_hdd");
+ HARDDISK(config, "harddisk3", "corvus_hdd");
+ HARDDISK(config, "harddisk4", "corvus_hdd");
+}
//-------------------------------------------------
diff --git a/src/devices/bus/ieee488/hp9122c.cpp b/src/devices/bus/ieee488/hp9122c.cpp
index 9d7f77fed51..808deae2069 100644
--- a/src/devices/bus/ieee488/hp9122c.cpp
+++ b/src/devices/bus/ieee488/hp9122c.cpp
@@ -376,13 +376,14 @@ void hp9122c_device::cpu_map(address_map &map)
map(0xc000, 0xffff).rom().region("cpu", 0);
}
-MACHINE_CONFIG_START(hp9122c_device::device_add_mconfig)
- MCFG_DEVICE_ADD("cpu" , MC6809 , XTAL(8'000'000))
- MCFG_DEVICE_PROGRAM_MAP(cpu_map)
+void hp9122c_device::device_add_mconfig(machine_config &config)
+{
+ MC6809(config, m_cpu, XTAL(8'000'000));
+ m_cpu->set_addrmap(AS_PROGRAM, &hp9122c_device::cpu_map);
// without this flag, 'DMA' transfer via SYNC instruction
// will not work
- MCFG_QUANTUM_PERFECT_CPU("cpu")
+ config.m_perfect_cpu_quantum = subtag("cpu");
MB8876(config, m_fdc, 8_MHz_XTAL / 4);
m_fdc->intrq_wr_callback().set(FUNC(hp9122c_device::fdc_intrq_w));
@@ -399,11 +400,7 @@ MACHINE_CONFIG_START(hp9122c_device::device_add_mconfig)
m_i8291a->int_write().set(FUNC(hp9122c_device::i8291a_int_w));
m_i8291a->dreq_write().set(FUNC(hp9122c_device::i8291a_dreq_w));
- MCFG_FLOPPY_DRIVE_ADD("floppy0" , hp9122c_floppies , "35hd" , hp9122c_floppy_formats)
- MCFG_FLOPPY_DRIVE_SOUND(true)
- MCFG_SLOT_FIXED(true)
- MCFG_FLOPPY_DRIVE_ADD("floppy1" , hp9122c_floppies , "35hd" , hp9122c_floppy_formats)
- MCFG_FLOPPY_DRIVE_SOUND(true)
- MCFG_SLOT_FIXED(true)
+ FLOPPY_CONNECTOR(config, "floppy0" , hp9122c_floppies , "35hd" , hp9122c_floppy_formats, true).enable_sound(true);
+ FLOPPY_CONNECTOR(config, "floppy1" , hp9122c_floppies , "35hd" , hp9122c_floppy_formats, true).enable_sound(true);
config.set_default_layout(layout_hp9122c);
-MACHINE_CONFIG_END
+}
diff --git a/src/devices/bus/ieee488/ieee488.h b/src/devices/bus/ieee488/ieee488.h
index e734b356d5b..cb29783d294 100644
--- a/src/devices/bus/ieee488/ieee488.h
+++ b/src/devices/bus/ieee488/ieee488.h
@@ -12,8 +12,12 @@
#pragma once
+void cbm_ieee488_devices(device_slot_interface &device);
+void hp_ieee488_devices(device_slot_interface &device);
+void remote488_devices(device_slot_interface &device);
-
+DECLARE_DEVICE_TYPE(IEEE488, ieee488_device)
+DECLARE_DEVICE_TYPE(IEEE488_SLOT, ieee488_slot_device)
//**************************************************************************
// MACROS / CONSTANTS
@@ -24,65 +28,6 @@
//**************************************************************************
-// INTERFACE CONFIGURATION MACROS
-//**************************************************************************
-
-#define MCFG_IEEE488_BUS_ADD() \
- MCFG_DEVICE_ADD(IEEE488_TAG, IEEE488, 0)
-
-
-#define MCFG_IEEE488_EOI_CALLBACK(_write) \
- downcast<ieee488_device *>(device)->set_eoi_callback(DEVCB_##_write);
-
-#define MCFG_IEEE488_DAV_CALLBACK(_write) \
- downcast<ieee488_device *>(device)->set_dav_callback(DEVCB_##_write);
-
-#define MCFG_IEEE488_NRFD_CALLBACK(_write) \
- downcast<ieee488_device *>(device)->set_nrfd_callback(DEVCB_##_write);
-
-#define MCFG_IEEE488_NDAC_CALLBACK(_write) \
- downcast<ieee488_device *>(device)->set_ndac_callback(DEVCB_##_write);
-
-#define MCFG_IEEE488_IFC_CALLBACK(_write) \
- downcast<ieee488_device *>(device)->set_ifc_callback(DEVCB_##_write);
-
-#define MCFG_IEEE488_SRQ_CALLBACK(_write) \
- downcast<ieee488_device *>(device)->set_srq_callback(DEVCB_##_write);
-
-#define MCFG_IEEE488_ATN_CALLBACK(_write) \
- downcast<ieee488_device *>(device)->set_atn_callback(DEVCB_##_write);
-
-#define MCFG_IEEE488_REN_CALLBACK(_write) \
- downcast<ieee488_device *>(device)->set_ren_callback(DEVCB_##_write);
-
-// This CB reports changes to the DIO lines on the bus (whose value comes from
-// ANDing the DIO lines of each device on the bus)
-// This CB is needed by those controllers that start a parallel poll and wait
-// for some condition to be set by devices on the DIO lines (e.g. PHI controller).
-#define MCFG_IEEE488_DIO_CALLBACK(_write) \
- downcast<ieee488_device *>(device)->set_dio_callback(DEVCB_##_write);
-
-#define MCFG_IEEE488_SLOT_ADD(_tag, _address, _slot_intf, _def_slot) \
- MCFG_DEVICE_ADD(_tag, IEEE488_SLOT, 0) \
- MCFG_DEVICE_SLOT_INTERFACE(_slot_intf, _def_slot, false) \
- downcast<ieee488_slot_device *>(device)->set_address(_address);
-
-
-#define MCFG_CBM_IEEE488_ADD(_default_drive) \
- MCFG_IEEE488_SLOT_ADD("ieee4", 4, cbm_ieee488_devices, nullptr) \
- MCFG_IEEE488_SLOT_ADD("ieee8", 8, cbm_ieee488_devices, _default_drive) \
- MCFG_IEEE488_SLOT_ADD("ieee9", 9, cbm_ieee488_devices, nullptr) \
- MCFG_IEEE488_SLOT_ADD("ieee10", 10, cbm_ieee488_devices, nullptr) \
- MCFG_IEEE488_SLOT_ADD("ieee11", 11, cbm_ieee488_devices, nullptr) \
- MCFG_IEEE488_SLOT_ADD("ieee12", 12, cbm_ieee488_devices, nullptr) \
- MCFG_IEEE488_SLOT_ADD("ieee13", 13, cbm_ieee488_devices, nullptr) \
- MCFG_IEEE488_SLOT_ADD("ieee14", 14, cbm_ieee488_devices, nullptr) \
- MCFG_IEEE488_SLOT_ADD("ieee15", 15, cbm_ieee488_devices, nullptr) \
- MCFG_IEEE488_BUS_ADD()
-
-
-
-//**************************************************************************
// TYPE DEFINITIONS
//**************************************************************************
@@ -95,17 +40,7 @@ class ieee488_device : public device_t
{
public:
// construction/destruction
- ieee488_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
-
- template <class Object> devcb_base &set_eoi_callback(Object &&cb) { return m_write_eoi.set_callback(std::forward<Object>(cb)); }
- template <class Object> devcb_base &set_dav_callback(Object &&cb) { return m_write_dav.set_callback(std::forward<Object>(cb)); }
- template <class Object> devcb_base &set_nrfd_callback(Object &&cb) { return m_write_nrfd.set_callback(std::forward<Object>(cb)); }
- template <class Object> devcb_base &set_ndac_callback(Object &&cb) { return m_write_ndac.set_callback(std::forward<Object>(cb)); }
- template <class Object> devcb_base &set_ifc_callback(Object &&cb) { return m_write_ifc.set_callback(std::forward<Object>(cb)); }
- template <class Object> devcb_base &set_srq_callback(Object &&cb) { return m_write_srq.set_callback(std::forward<Object>(cb)); }
- template <class Object> devcb_base &set_atn_callback(Object &&cb) { return m_write_atn.set_callback(std::forward<Object>(cb)); }
- template <class Object> devcb_base &set_ren_callback(Object &&cb) { return m_write_ren.set_callback(std::forward<Object>(cb)); }
- template <class Object> devcb_base &set_dio_callback(Object &&cb) { return m_write_dio.set_callback(std::forward<Object>(cb)); }
+ ieee488_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock = 0);
auto eoi_callback() { return m_write_eoi.bind(); }
auto dav_callback() { return m_write_dav.bind(); }
@@ -115,6 +50,11 @@ public:
auto srq_callback() { return m_write_srq.bind(); }
auto atn_callback() { return m_write_atn.bind(); }
auto ren_callback() { return m_write_ren.bind(); }
+
+ // This CB reports changes to the DIO lines on the bus (whose value comes from
+ // ANDing the DIO lines of each device on the bus)
+ // This CB is needed by those controllers that start a parallel poll and wait
+ // for some condition to be set by devices on the DIO lines (e.g. PHI controller).
auto dio_callback() { return m_write_dio.bind(); }
void add_device(ieee488_slot_device *slot, device_t *target);
@@ -154,6 +94,20 @@ public:
void atn_w(device_t *device, int state) { set_signal(device, ATN, state); }
void ren_w(device_t *device, int state) { set_signal(device, REN, state); }
+ // helper functions
+ static void add_cbm_devices(machine_config &config, const char *_default_drive)
+ {
+ IEEE488_SLOT(config, "ieee4", 4, cbm_ieee488_devices, nullptr);
+ IEEE488_SLOT(config, "ieee8", 8, cbm_ieee488_devices, _default_drive);
+ IEEE488_SLOT(config, "ieee9", 9, cbm_ieee488_devices, nullptr);
+ IEEE488_SLOT(config, "ieee10", 10, cbm_ieee488_devices, nullptr);
+ IEEE488_SLOT(config, "ieee11", 11, cbm_ieee488_devices, nullptr);
+ IEEE488_SLOT(config, "ieee12", 12, cbm_ieee488_devices, nullptr);
+ IEEE488_SLOT(config, "ieee13", 13, cbm_ieee488_devices, nullptr);
+ IEEE488_SLOT(config, "ieee14", 14, cbm_ieee488_devices, nullptr);
+ IEEE488_SLOT(config, "ieee15", 15, cbm_ieee488_devices, nullptr);
+ IEEE488(config, IEEE488_TAG);
+ }
protected:
enum
{
@@ -208,8 +162,6 @@ private:
uint8_t m_dio;
};
-DECLARE_DEVICE_TYPE(IEEE488, ieee488_device)
-
// ======================> ieee488_slot_device
@@ -218,6 +170,16 @@ class ieee488_slot_device : public device_t,
{
public:
// construction/destruction
+ template <typename T>
+ ieee488_slot_device(machine_config const &mconfig, char const *tag, device_t *owner, int address, T &&opts, char const *dflt)
+ : ieee488_slot_device(mconfig, tag, owner, (uint32_t)0)
+ {
+ option_reset();
+ opts(*this);
+ set_default_option(dflt);
+ set_fixed(false);
+ set_address(address);
+ }
ieee488_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
static void add_cbm_slot(machine_config &config, const char *_tag, int _address, const char *_def_slot);
@@ -244,8 +206,6 @@ protected:
int m_address;
};
-DECLARE_DEVICE_TYPE(IEEE488_SLOT, ieee488_slot_device)
-
// ======================> device_ieee488_interface
@@ -280,10 +240,4 @@ private:
device_ieee488_interface *m_next;
};
-
-void cbm_ieee488_devices(device_slot_interface &device);
-void hp_ieee488_devices(device_slot_interface &device);
-void remote488_devices(device_slot_interface &device);
-
-
#endif // MAME_BUS_IEEE488_IEEE488_H
diff --git a/src/devices/bus/ieee488/remote488.cpp b/src/devices/bus/ieee488/remote488.cpp
index a9baafc9320..b5eb0041632 100644
--- a/src/devices/bus/ieee488/remote488.cpp
+++ b/src/devices/bus/ieee488/remote488.cpp
@@ -249,9 +249,10 @@ remote488_device::remote488_device(const machine_config &mconfig, const char *ta
{
}
-MACHINE_CONFIG_START(remote488_device::device_add_mconfig)
- MCFG_DEVICE_ADD("stream", BITBANGER, 0)
-MACHINE_CONFIG_END
+void remote488_device::device_add_mconfig(machine_config &config)
+{
+ BITBANGER(config, m_stream, 0);
+}
void remote488_device::ieee488_eoi(int state)
{
diff --git a/src/devices/bus/ieee488/softbox.cpp b/src/devices/bus/ieee488/softbox.cpp
index 63208f7ce9e..e2041d3e4e2 100644
--- a/src/devices/bus/ieee488/softbox.cpp
+++ b/src/devices/bus/ieee488/softbox.cpp
@@ -232,11 +232,12 @@ DEVICE_INPUT_DEFAULTS_END
// device_add_mconfig - add device configuration
//-------------------------------------------------
-MACHINE_CONFIG_START(softbox_device::device_add_mconfig)
+void softbox_device::device_add_mconfig(machine_config &config)
+{
// basic machine hardware
- MCFG_DEVICE_ADD(Z80_TAG, Z80, XTAL(8'000'000)/2)
- MCFG_DEVICE_PROGRAM_MAP(softbox_mem)
- MCFG_DEVICE_IO_MAP(softbox_io)
+ Z80(config, m_maincpu, XTAL(8'000'000)/2);
+ m_maincpu->set_addrmap(AS_PROGRAM, &softbox_device::softbox_mem);
+ m_maincpu->set_addrmap(AS_IO, &softbox_device::softbox_io);
// devices
i8251_device &i8251(I8251(config, I8251_TAG, 0));
@@ -264,17 +265,13 @@ MACHINE_CONFIG_START(softbox_device::device_add_mconfig)
m_dbrg->fr_handler().set(I8251_TAG, FUNC(i8251_device::write_rxc));
m_dbrg->ft_handler().set(I8251_TAG, FUNC(i8251_device::write_txc));
- MCFG_DEVICE_ADD(m_hdc, CORVUS_HDC, 0)
- MCFG_HARDDISK_ADD("harddisk1")
- MCFG_HARDDISK_INTERFACE("corvus_hdd")
- MCFG_HARDDISK_ADD("harddisk2")
- MCFG_HARDDISK_INTERFACE("corvus_hdd")
- MCFG_HARDDISK_ADD("harddisk3")
- MCFG_HARDDISK_INTERFACE("corvus_hdd")
- MCFG_HARDDISK_ADD("harddisk4")
- MCFG_HARDDISK_INTERFACE("corvus_hdd")
- //MCFG_IMI7000_BUS_ADD("imi5000h", nullptr, nullptr, nullptr)
-MACHINE_CONFIG_END
+ CORVUS_HDC(config, m_hdc, 0);
+ HARDDISK(config, "harddisk1", "corvus_hdd");
+ HARDDISK(config, "harddisk2", "corvus_hdd");
+ HARDDISK(config, "harddisk3", "corvus_hdd");
+ HARDDISK(config, "harddisk4", "corvus_hdd");
+ //imi7000_bus_device::add_config(config, "imi5000h", nullptr, nullptr, nullptr);
+}
//-------------------------------------------------
@@ -381,6 +378,6 @@ void softbox_device::ieee488_ifc(int state)
WRITE8_MEMBER( softbox_device::dbrg_w )
{
- m_dbrg->write_str(data & 0x0f);
- m_dbrg->write_stt(data >> 4);
+ m_dbrg->str_w(data & 0x0f);
+ m_dbrg->stt_w(data >> 4);
}
diff --git a/src/devices/bus/imi7000/imi7000.h b/src/devices/bus/imi7000/imi7000.h
index 0559a565285..38de3341ae5 100644
--- a/src/devices/bus/imi7000/imi7000.h
+++ b/src/devices/bus/imi7000/imi7000.h
@@ -31,8 +31,10 @@
#pragma once
+void imi7000_devices(device_slot_interface &device);
-
+DECLARE_DEVICE_TYPE(IMI7000_BUS, imi7000_bus_device)
+DECLARE_DEVICE_TYPE(IMI7000_SLOT, imi7000_slot_device)
//**************************************************************************
// CONSTANTS
@@ -43,23 +45,6 @@
//**************************************************************************
-// INTERFACE CONFIGURATION MACROS
-//**************************************************************************
-
-#define MCFG_IMI7000_BUS_ADD(_def_slot1, _def_slot2, _def_slot3, _def_slot4) \
- MCFG_DEVICE_ADD(IMI7000_BUS_TAG, IMI7000_BUS, 0) \
- MCFG_DEVICE_ADD(IMI7000_BUS_TAG":0", IMI7000_SLOT, 0) \
- MCFG_DEVICE_SLOT_INTERFACE(imi7000_devices, _def_slot1, false) \
- MCFG_DEVICE_ADD(IMI7000_BUS_TAG":1", IMI7000_SLOT, 0) \
- MCFG_DEVICE_SLOT_INTERFACE(imi7000_devices, _def_slot2, false) \
- MCFG_DEVICE_ADD(IMI7000_BUS_TAG":2", IMI7000_SLOT, 0) \
- MCFG_DEVICE_SLOT_INTERFACE(imi7000_devices, _def_slot3, false) \
- MCFG_DEVICE_ADD(IMI7000_BUS_TAG":3", IMI7000_SLOT, 0) \
- MCFG_DEVICE_SLOT_INTERFACE(imi7000_devices, _def_slot4, false)
-
-
-
-//**************************************************************************
// TYPE DEFINITIONS
//**************************************************************************
@@ -73,7 +58,17 @@ class imi7000_bus_device : public device_t
{
public:
// construction/destruction
- imi7000_bus_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+ imi7000_bus_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock = 0);
+
+ template <typename T, typename U, typename V, typename W>
+ static void add_config(machine_config &config, T &&_def_slot1, U &&_def_slot2, V &&_def_slot3, W &&_def_slot4)
+ {
+ IMI7000_BUS(config, IMI7000_BUS_TAG);
+ IMI7000_SLOT(config, IMI7000_BUS_TAG":0", imi7000_devices, std::forward<T>(_def_slot1));
+ IMI7000_SLOT(config, IMI7000_BUS_TAG":1", imi7000_devices, std::forward<U>(_def_slot2));
+ IMI7000_SLOT(config, IMI7000_BUS_TAG":2", imi7000_devices, std::forward<V>(_def_slot3));
+ IMI7000_SLOT(config, IMI7000_BUS_TAG":3", imi7000_devices, std::forward<W>(_def_slot4));
+ }
protected:
// device-level overrides
@@ -90,6 +85,15 @@ class imi7000_slot_device : public device_t,
{
public:
// construction/destruction
+ template <typename T>
+ imi7000_slot_device(machine_config const &mconfig, char const *tag, device_t *owner, T &&opts, char const *dflt)
+ : imi7000_slot_device(mconfig, tag, owner, (uint32_t)0)
+ {
+ option_reset();
+ opts(*this);
+ set_default_option(dflt);
+ set_fixed(false);
+ }
imi7000_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
protected:
@@ -113,13 +117,4 @@ protected:
imi7000_slot_device *m_slot;
};
-
-// device type definition
-DECLARE_DEVICE_TYPE(IMI7000_BUS, imi7000_bus_device)
-DECLARE_DEVICE_TYPE(IMI7000_SLOT, imi7000_slot_device)
-
-
-// slot interface
-void imi7000_devices(device_slot_interface &device);
-
#endif // MAME_BUS_IMI7000_IMI7000_H
diff --git a/src/devices/bus/intellec4/intellec4.cpp b/src/devices/bus/intellec4/intellec4.cpp
index 82cf6702144..c3742062454 100644
--- a/src/devices/bus/intellec4/intellec4.cpp
+++ b/src/devices/bus/intellec4/intellec4.cpp
@@ -58,16 +58,11 @@ void univ_slot_device::device_start()
univ_bus_device::univ_bus_device(machine_config const &mconfig, char const *tag, device_t *owner, uint32_t clock)
: device_t(mconfig, INTELLEC4_UNIV_BUS, tag, owner, clock)
- , m_rom_device(*this, finder_base::DUMMY_TAG)
- , m_rom_ports_device(*this, finder_base::DUMMY_TAG)
- , m_memory_device(*this, finder_base::DUMMY_TAG)
- , m_status_device(*this, finder_base::DUMMY_TAG)
- , m_ram_ports_device(*this, finder_base::DUMMY_TAG)
- , m_rom_space(-1)
- , m_rom_ports_space(-1)
- , m_memory_space(-1)
- , m_status_space(-1)
- , m_ram_ports_space(-1)
+ , m_rom_space(*this, finder_base::DUMMY_TAG, -1)
+ , m_rom_ports_space(*this, finder_base::DUMMY_TAG, -1)
+ , m_memory_space(*this, finder_base::DUMMY_TAG, -1)
+ , m_status_space(*this, finder_base::DUMMY_TAG, -1)
+ , m_ram_ports_space(*this, finder_base::DUMMY_TAG, -1)
, m_test_out_cb(*this)
, m_stop_out_cb(*this)
, m_reset_4002_out_cb(*this)
@@ -123,20 +118,6 @@ WRITE_LINE_MEMBER(univ_bus_device::cpu_reset_in)
device_t implementation
----------------------------------*/
-void univ_bus_device::device_validity_check(validity_checker &valid) const
-{
- if (m_rom_device && !m_rom_device->space_config(m_rom_space))
- osd_printf_error("ROM space device %s (%s) lacks address space %d config\n", m_rom_device->device().tag(), m_rom_device->device().name(), m_rom_space);
- if (m_rom_ports_device && !m_rom_ports_device->space_config(m_rom_ports_space))
- osd_printf_error("ROM ports space device %s (%s) lacks address space %d config\n", m_rom_ports_device->device().tag(), m_rom_ports_device->device().name(), m_rom_ports_space);
- if (m_memory_device && !m_memory_device->space_config(m_memory_space))
- osd_printf_error("Memory space device %s (%s) lacks address space %d config\n", m_memory_device->device().tag(), m_memory_device->device().name(), m_memory_space);
- if (m_status_device && !m_status_device->space_config(m_status_space))
- osd_printf_error("Status space device %s (%s) lacks address space %d config\n", m_status_device->device().tag(), m_status_device->device().name(), m_status_space);
- if (m_ram_ports_device && !m_ram_ports_device->space_config(m_ram_ports_space))
- osd_printf_error("RAM ports space device %s (%s) lacks address space %d config\n", m_ram_ports_device->device().tag(), m_ram_ports_device->device().name(), m_ram_ports_space);
-}
-
void univ_bus_device::device_start()
{
m_test_out_cb.resolve_safe();
diff --git a/src/devices/bus/intellec4/intellec4.h b/src/devices/bus/intellec4/intellec4.h
index 55cc06a263a..68fa8a8080a 100644
--- a/src/devices/bus/intellec4/intellec4.h
+++ b/src/devices/bus/intellec4/intellec4.h
@@ -153,11 +153,11 @@ public:
friend class device_univ_card_interface;
// address space configuration
- template <typename T> void set_rom_space(T &&tag, int space) { m_rom_device.set_tag(std::forward<T>(tag)); m_rom_space = space; }
- template <typename T> void set_rom_ports_space(T &&tag, int space) { m_rom_ports_device.set_tag(std::forward<T>(tag)); m_rom_ports_space = space; }
- template <typename T> void set_memory_space(T &&tag, int space) { m_memory_device.set_tag(std::forward<T>(tag)); m_memory_space = space; }
- template <typename T> void set_status_space(T &&tag, int space) { m_status_device.set_tag(std::forward<T>(tag)); m_status_space = space; }
- template <typename T> void set_ram_ports_space(T &&tag, int space) { m_ram_ports_device.set_tag(std::forward<T>(tag)); m_ram_ports_space = space; }
+ template <typename T> void set_rom_space(T &&tag, int space) { m_rom_space.set_tag(std::forward<T>(tag), space); }
+ template <typename T> void set_rom_ports_space(T &&tag, int space) { m_rom_ports_space.set_tag(std::forward<T>(tag), space); }
+ template <typename T> void set_memory_space(T &&tag, int space) { m_memory_space.set_tag(std::forward<T>(tag), space); }
+ template <typename T> void set_status_space(T &&tag, int space) { m_status_space.set_tag(std::forward<T>(tag), space); }
+ template <typename T> void set_ram_ports_space(T &&tag, int space) { m_ram_ports_space.set_tag(std::forward<T>(tag), space); }
// callback configuration
auto stop_out_cb() { return m_stop_out_cb.bind(); }
@@ -183,7 +183,6 @@ public:
protected:
// device_t implementation
- virtual void device_validity_check(validity_checker &valid) const override ATTR_COLD;
virtual void device_start() override;
private:
@@ -195,10 +194,8 @@ private:
void set_user_reset(unsigned index, int state);
// finding address spaces
- required_device<device_memory_interface> m_rom_device, m_rom_ports_device;
- required_device<device_memory_interface> m_memory_device, m_status_device, m_ram_ports_device;
- int m_rom_space, m_rom_ports_space;
- int m_memory_space, m_status_space, m_ram_ports_space;
+ required_address_space m_rom_space, m_rom_ports_space;
+ required_address_space m_memory_space, m_status_space, m_ram_ports_space;
// output line callbacks
devcb_write_line m_test_out_cb;
@@ -225,11 +222,11 @@ protected:
// device_interface implementation
void interface_pre_start() override;
- address_space &rom_space() { return m_bus->m_rom_device->space(m_bus->m_rom_space); }
- address_space &rom_ports_space() { return m_bus->m_rom_ports_device->space(m_bus->m_rom_ports_space); }
- address_space &memory_space() { return m_bus->m_memory_device->space(m_bus->m_memory_space); }
- address_space &status_space() { return m_bus->m_status_device->space(m_bus->m_status_space); }
- address_space &ram_ports_space() { return m_bus->m_ram_ports_device->space(m_bus->m_ram_ports_space); }
+ address_space &rom_space() { return *m_bus->m_rom_space; }
+ address_space &rom_ports_space() { return *m_bus->m_rom_ports_space; }
+ address_space &memory_space() { return *m_bus->m_memory_space; }
+ address_space &status_space() { return *m_bus->m_status_space; }
+ address_space &ram_ports_space() { return *m_bus->m_ram_ports_space; }
DECLARE_WRITE_LINE_MEMBER(test_out) { m_bus->set_test(m_index, state); }
DECLARE_WRITE_LINE_MEMBER(stop_out) { m_bus->set_stop(m_index, state); }
diff --git a/src/devices/bus/interpro/keyboard/hle.cpp b/src/devices/bus/interpro/keyboard/hle.cpp
index 670e5bd975c..15dd262eddf 100644
--- a/src/devices/bus/interpro/keyboard/hle.cpp
+++ b/src/devices/bus/interpro/keyboard/hle.cpp
@@ -277,11 +277,11 @@ WRITE_LINE_MEMBER(hle_device_base::input_txd)
device_buffered_serial_interface::rx_w(state);
}
-MACHINE_CONFIG_START(hle_device_base::device_add_mconfig)
+void hle_device_base::device_add_mconfig(machine_config &config)
+{
SPEAKER(config, "bell").front_center();
- MCFG_DEVICE_ADD("beeper", BEEP, ATTOSECONDS_TO_HZ(480 * ATTOSECONDS_PER_MICROSECOND))
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "bell", 1.0)
-MACHINE_CONFIG_END
+ BEEP(config, m_beeper, ATTOSECONDS_TO_HZ(480 * ATTOSECONDS_PER_MICROSECOND)).add_route(ALL_OUTPUTS, "bell", 1.0);
+}
void hle_device_base::device_start()
{
diff --git a/src/devices/bus/interpro/sr/edge.cpp b/src/devices/bus/interpro/sr/edge.cpp
index eb680532d3b..390b3459079 100644
--- a/src/devices/bus/interpro/sr/edge.cpp
+++ b/src/devices/bus/interpro/sr/edge.cpp
@@ -475,7 +475,7 @@ void mpcb828_device::device_add_mconfig(machine_config &config)
TMS32030(config, m_dsp, 30_MHz_XTAL);
m_dsp->holda().set(FUNC(mpcb828_device::holda));
m_dsp->set_disable();
- //MCFG_DEVICE_ADDRESS_MAP(0, map_dynamic<2>)
+ //m_dsp->set_addrmap(0, map_dynamic<2>);
BT458(config, "ramdac", 83'020'800);
@@ -484,7 +484,7 @@ void mpcb828_device::device_add_mconfig(machine_config &config)
m_scc->out_txda_callback().set("kbd", FUNC(interpro_keyboard_port_device::write_txd));
INTERPRO_KEYBOARD_PORT(config, "kbd", interpro_keyboard_devices, "hle_en_us").rxd_handler_cb().set(m_scc, FUNC(z80scc_device::rxa_w));
-MACHINE_CONFIG_END
+}
/*
* MPCB849: EDGE-1 graphics, 2 megapixels, single screen, 60Hz refresh.
diff --git a/src/devices/bus/interpro/sr/sr.cpp b/src/devices/bus/interpro/sr/sr.cpp
index 6d6d76bee42..82071af86d2 100644
--- a/src/devices/bus/interpro/sr/sr.cpp
+++ b/src/devices/bus/interpro/sr/sr.cpp
@@ -267,9 +267,6 @@ DEFINE_DEVICE_TYPE(SRX_SLOT, srx_slot_device, "srx_slot", "InterPro SRX slot")
void interpro_bus_device::device_resolve_objects()
{
- m_main_space = &m_maincpu->space(0);
- m_io_space = &m_maincpu->space(1);
-
// resolve callbacks
m_out_irq0_cb.resolve_safe();
m_out_irq1_cb.resolve_safe();
diff --git a/src/devices/bus/interpro/sr/sr.h b/src/devices/bus/interpro/sr/sr.h
index 0fcecc086f8..858590f5075 100644
--- a/src/devices/bus/interpro/sr/sr.h
+++ b/src/devices/bus/interpro/sr/sr.h
@@ -9,6 +9,10 @@
class interpro_bus_device : public device_t
{
public:
+ // space configuration
+ template <typename T> void set_main_space(T &&tag, int spacenum) { m_main_space.set_tag(std::forward<T>(tag), spacenum); }
+ template <typename T> void set_io_space(T &&tag, int spacenum) { m_io_space.set_tag(std::forward<T>(tag), spacenum); }
+
// callback configuration
auto out_irq0_cb() { return m_out_irq0_cb.bind(); }
auto out_irq1_cb() { return m_out_irq1_cb.bind(); }
@@ -24,9 +28,8 @@ protected:
// construction/destruction
interpro_bus_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock)
: device_t(mconfig, type, tag, owner, clock)
- , m_maincpu(*this, finder_base::DUMMY_TAG)
- , m_main_space(nullptr)
- , m_io_space(nullptr)
+ , m_main_space(*this, finder_base::DUMMY_TAG, -1)
+ , m_io_space(*this, finder_base::DUMMY_TAG, -1)
, m_out_irq0_cb(*this)
, m_out_irq1_cb(*this)
, m_out_irq2_cb(*this)
@@ -38,9 +41,8 @@ protected:
virtual void device_resolve_objects() override;
// internal state
- required_device<cpu_device> m_maincpu;
- address_space *m_main_space;
- address_space *m_io_space;
+ required_address_space m_main_space;
+ required_address_space m_io_space;
private:
devcb_write_line m_out_irq0_cb;
@@ -55,12 +57,6 @@ class cbus_bus_device : public interpro_bus_device
{
public:
// construction/destruction
- template <typename T>
- cbus_bus_device(machine_config const &mconfig, char const *tag, device_t *owner, u32 clock, T &&cpu_device)
- : cbus_bus_device(mconfig, tag, owner, clock)
- {
- m_maincpu.set_tag(std::forward<T>(cpu_device));
- }
cbus_bus_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
static const u32 CBUS_BASE = 0x87000000;
@@ -158,12 +154,6 @@ class srx_bus_device : public interpro_bus_device
{
public:
// construction/destruction
- template <typename T>
- srx_bus_device(machine_config const &mconfig, char const *tag, device_t *owner, u32 clock, T &&cpu_device)
- : srx_bus_device(mconfig, tag, owner, clock)
- {
- m_maincpu.set_tag(std::forward<T>(cpu_device));
- }
srx_bus_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
static const u32 SRX_BASE = 0x8f000000;
diff --git a/src/devices/bus/intv/ecs.cpp b/src/devices/bus/intv/ecs.cpp
index e1d7f9b0b98..6fd321af36b 100644
--- a/src/devices/bus/intv/ecs.cpp
+++ b/src/devices/bus/intv/ecs.cpp
@@ -94,7 +94,8 @@ void intv_ecs_device::late_subslot_setup()
//-------------------------------------------------
-MACHINE_CONFIG_START(intv_ecs_device::device_add_mconfig)
+void intv_ecs_device::device_add_mconfig(machine_config &config)
+{
SPEAKER(config, "mono_ecs").front_center();
AY8914(config, m_snd, XTAL(3'579'545)/2);
@@ -103,9 +104,9 @@ MACHINE_CONFIG_START(intv_ecs_device::device_add_mconfig)
m_snd->port_a_write_callback().set("ctrl_port", FUNC(intvecs_control_port_device::portA_w));
m_snd->add_route(ALL_OUTPUTS, "mono_ecs", 0.33);
- MCFG_INTVECS_CONTROL_PORT_ADD("ctrl_port", intvecs_control_port_devices, "keybd")
- MCFG_INTV_CARTRIDGE_ADD("subslot", intv_cart, nullptr)
-MACHINE_CONFIG_END
+ INTVECS_CONTROL_PORT(config, "ctrl_port", intvecs_control_port_devices, "keybd");
+ INTV_CART_SLOT(config, m_subslot, intv_cart, nullptr);
+}
ROM_START( ecs )
@@ -125,7 +126,7 @@ const tiny_rom_entry *intv_ecs_device::device_rom_region() const
Paged ROM handling
-------------------------------------------------*/
-READ16_MEMBER(intv_ecs_device::read_rom20)
+uint16_t intv_ecs_device::read_rom20(offs_t offset)
{
if (m_bank_base[2])
return INTV_ROM16_READ(offset + 0x2000);
@@ -133,7 +134,7 @@ READ16_MEMBER(intv_ecs_device::read_rom20)
return 0xffff;
}
-READ16_MEMBER(intv_ecs_device::read_rom70)
+uint16_t intv_ecs_device::read_rom70(offs_t offset)
{
if (m_bank_base[7])
return 0xffff;
@@ -141,21 +142,21 @@ READ16_MEMBER(intv_ecs_device::read_rom70)
return INTV_ROM16_READ(offset + 0x7000);
}
-READ16_MEMBER(intv_ecs_device::read_rome0)
+uint16_t intv_ecs_device::read_rome0(offs_t offset)
{
if (m_bank_base[14])
return INTV_ROM16_READ(offset + 0xe000);
else // if WSMLB is loaded, it shall go here, otherwise 0xffff
- return m_subslot->read_rome0(space, offset, mem_mask);
+ return m_subslot->read_rome0(offset);
}
-READ16_MEMBER(intv_ecs_device::read_romf0)
+uint16_t intv_ecs_device::read_romf0(offs_t offset)
{
// only WSMLB should come here with bank_base = 1
if (m_bank_base[15])
- return m_subslot->read_romf0(space, offset + 0x1000, mem_mask);
+ return m_subslot->read_romf0(offset + 0x1000);
else
- return m_subslot->read_romf0(space, offset, mem_mask);
+ return m_subslot->read_romf0(offset);
}
@@ -163,44 +164,40 @@ READ16_MEMBER(intv_ecs_device::read_romf0)
read_audio
-------------------------------------------------*/
-READ16_MEMBER(intv_ecs_device::read_ay)
+uint16_t intv_ecs_device::read_ay(offs_t offset)
{
- if (ACCESSING_BITS_0_7)
- return m_snd->read(space, offset, mem_mask);
- else
- return 0xffff;
+ return 0xff00 | m_snd->read(offset);
}
/*-------------------------------------------------
write_audio
-------------------------------------------------*/
-WRITE16_MEMBER(intv_ecs_device::write_ay)
+void intv_ecs_device::write_ay(offs_t offset, uint16_t data)
{
- if (ACCESSING_BITS_0_7)
- return m_snd->write(space, offset, data, mem_mask);
+ return m_snd->write(offset, data & 0x00ff);
}
-READ16_MEMBER(intv_ecs_device::read_rom80)
+uint16_t intv_ecs_device::read_rom80(offs_t offset)
{
if (m_ram88_enabled && offset >= 0x800)
- return m_subslot->read_ram(space, offset & 0x7ff, mem_mask);
+ return m_subslot->read_ram(offset & 0x7ff);
else
- return m_subslot->read_rom80(space, offset, mem_mask);
+ return m_subslot->read_rom80(offset);
}
-READ16_MEMBER(intv_ecs_device::read_romd0)
+uint16_t intv_ecs_device::read_romd0(offs_t offset)
{
if (m_ramd0_enabled && offset < 0x800)
- return m_subslot->read_ram(space, offset, mem_mask);
+ return m_subslot->read_ram(offset);
else
- return m_subslot->read_romd0(space, offset, mem_mask);
+ return m_subslot->read_romd0(offset);
}
-WRITE16_MEMBER(intv_ecs_device::write_rom20)
+void intv_ecs_device::write_rom20(offs_t offset, uint16_t data)
{
if (offset == 0xfff)
{
@@ -211,7 +208,7 @@ WRITE16_MEMBER(intv_ecs_device::write_rom20)
}
}
-WRITE16_MEMBER(intv_ecs_device::write_rom70)
+void intv_ecs_device::write_rom70(offs_t offset, uint16_t data)
{
if (offset == 0xfff)
{
@@ -222,7 +219,7 @@ WRITE16_MEMBER(intv_ecs_device::write_rom70)
}
}
-WRITE16_MEMBER(intv_ecs_device::write_rome0)
+void intv_ecs_device::write_rome0(offs_t offset, uint16_t data)
{
if (offset == 0xfff)
{
@@ -233,7 +230,7 @@ WRITE16_MEMBER(intv_ecs_device::write_rome0)
}
}
-WRITE16_MEMBER(intv_ecs_device::write_romf0)
+void intv_ecs_device::write_romf0(offs_t offset, uint16_t data)
{
if (offset == 0xfff)
{
diff --git a/src/devices/bus/intv/ecs.h b/src/devices/bus/intv/ecs.h
index 943a768fe03..68911831c0a 100644
--- a/src/devices/bus/intv/ecs.h
+++ b/src/devices/bus/intv/ecs.h
@@ -23,41 +23,41 @@ public:
// actual ECS accesses
// paged ROMs
- virtual DECLARE_READ16_MEMBER(read_rom20) override;
- virtual DECLARE_READ16_MEMBER(read_rom70) override;
- virtual DECLARE_READ16_MEMBER(read_rome0) override;
- virtual DECLARE_READ16_MEMBER(read_romf0) override;
+ virtual uint16_t read_rom20(offs_t offset) override;
+ virtual uint16_t read_rom70(offs_t offset) override;
+ virtual uint16_t read_rome0(offs_t offset) override;
+ virtual uint16_t read_romf0(offs_t offset) override;
// RAM
- virtual DECLARE_READ16_MEMBER(read_ram) override { return (int)m_ram[offset & (m_ram.size() - 1)]; }
- virtual DECLARE_WRITE16_MEMBER(write_ram) override { m_ram[offset & (m_ram.size() - 1)] = data & 0xff; }
+ virtual uint16_t read_ram(offs_t offset) override { return (int)m_ram[offset & (m_ram.size() - 1)]; }
+ virtual void write_ram(offs_t offset, uint16_t data) override { m_ram[offset & (m_ram.size() - 1)] = data & 0xff; }
// AY8914
- virtual DECLARE_READ16_MEMBER(read_ay) override;
- virtual DECLARE_WRITE16_MEMBER(write_ay) override;
+ virtual uint16_t read_ay(offs_t offset) override;
+ virtual void write_ay(offs_t offset, uint16_t data) override;
// passthru accesses
- virtual DECLARE_READ16_MEMBER(read_rom04) override { return m_subslot->read_rom04(space, offset, mem_mask); }
- virtual DECLARE_READ16_MEMBER(read_rom40) override { return m_subslot->read_rom40(space, offset, mem_mask); }
- virtual DECLARE_READ16_MEMBER(read_rom48) override { return m_subslot->read_rom48(space, offset, mem_mask); }
- virtual DECLARE_READ16_MEMBER(read_rom50) override { return m_subslot->read_rom50(space, offset, mem_mask); }
- virtual DECLARE_READ16_MEMBER(read_rom60) override { return m_subslot->read_rom60(space, offset, mem_mask); }
- virtual DECLARE_READ16_MEMBER(read_rom80) override;
- virtual DECLARE_READ16_MEMBER(read_rom90) override { return m_subslot->read_rom90(space, offset, mem_mask); }
- virtual DECLARE_READ16_MEMBER(read_roma0) override { return m_subslot->read_roma0(space, offset, mem_mask); }
- virtual DECLARE_READ16_MEMBER(read_romb0) override { return m_subslot->read_romb0(space, offset, mem_mask); }
- virtual DECLARE_READ16_MEMBER(read_romc0) override { return m_subslot->read_romc0(space, offset, mem_mask); }
- virtual DECLARE_READ16_MEMBER(read_romd0) override;
+ virtual uint16_t read_rom04(offs_t offset) override { return m_subslot->read_rom04(offset); }
+ virtual uint16_t read_rom40(offs_t offset) override { return m_subslot->read_rom40(offset); }
+ virtual uint16_t read_rom48(offs_t offset) override { return m_subslot->read_rom48(offset); }
+ virtual uint16_t read_rom50(offs_t offset) override { return m_subslot->read_rom50(offset); }
+ virtual uint16_t read_rom60(offs_t offset) override { return m_subslot->read_rom60(offset); }
+ virtual uint16_t read_rom80(offs_t offset) override;
+ virtual uint16_t read_rom90(offs_t offset) override { return m_subslot->read_rom90(offset); }
+ virtual uint16_t read_roma0(offs_t offset) override { return m_subslot->read_roma0(offset); }
+ virtual uint16_t read_romb0(offs_t offset) override { return m_subslot->read_romb0(offset); }
+ virtual uint16_t read_romc0(offs_t offset) override { return m_subslot->read_romc0(offset); }
+ virtual uint16_t read_romd0(offs_t offset) override;
// paged ROM banking
- virtual DECLARE_WRITE16_MEMBER(write_rom20) override;
- virtual DECLARE_WRITE16_MEMBER(write_rom70) override;
- virtual DECLARE_WRITE16_MEMBER(write_rome0) override;
- virtual DECLARE_WRITE16_MEMBER(write_romf0) override;
+ virtual void write_rom20(offs_t offset, uint16_t data) override;
+ virtual void write_rom70(offs_t offset, uint16_t data) override;
+ virtual void write_rome0(offs_t offset, uint16_t data) override;
+ virtual void write_romf0(offs_t offset, uint16_t data) override;
// RAM passthru write
- virtual DECLARE_WRITE16_MEMBER(write_88) override { if (m_ram88_enabled) m_subslot->write_ram(space, offset, data, mem_mask); }
- virtual DECLARE_WRITE16_MEMBER(write_d0) override { if (m_ramd0_enabled) m_subslot->write_ram(space, offset, data, mem_mask); }
+ virtual void write_88(offs_t offset, uint16_t data) override { if (m_ram88_enabled) m_subslot->write_ram(offset, data); }
+ virtual void write_d0(offs_t offset, uint16_t data) override { if (m_ramd0_enabled) m_subslot->write_ram(offset, data); }
// IntelliVoice passthru
- virtual DECLARE_READ16_MEMBER(read_speech) override { if (m_voice_enabled) return m_subslot->read_speech(space, offset, mem_mask); else return 0xffff; }
- virtual DECLARE_WRITE16_MEMBER(write_speech) override { if (m_voice_enabled) m_subslot->write_speech(space, offset, data, mem_mask); }
+ virtual uint16_t read_speech(offs_t offset) override { if (m_voice_enabled) return m_subslot->read_speech(offset); else return 0xffff; }
+ virtual void write_speech(offs_t offset, uint16_t data) override { if (m_voice_enabled) m_subslot->write_speech(offset, data); }
virtual void late_subslot_setup() override;
diff --git a/src/devices/bus/intv/rom.h b/src/devices/bus/intv/rom.h
index 7b83b2709fe..5266220e1ec 100644
--- a/src/devices/bus/intv/rom.h
+++ b/src/devices/bus/intv/rom.h
@@ -16,21 +16,21 @@ public:
intv_rom_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
// reading and writing
- virtual DECLARE_READ16_MEMBER(read_rom04) override { return INTV_ROM16_READ(offset + 0x0400); }
- virtual DECLARE_READ16_MEMBER(read_rom20) override { return INTV_ROM16_READ(offset + 0x2000); }
- virtual DECLARE_READ16_MEMBER(read_rom40) override { return INTV_ROM16_READ(offset + 0x4000); }
- virtual DECLARE_READ16_MEMBER(read_rom48) override { return INTV_ROM16_READ(offset + 0x4800); }
- virtual DECLARE_READ16_MEMBER(read_rom50) override { return INTV_ROM16_READ(offset + 0x5000); }
- virtual DECLARE_READ16_MEMBER(read_rom60) override { return INTV_ROM16_READ(offset + 0x6000); }
- virtual DECLARE_READ16_MEMBER(read_rom70) override { return INTV_ROM16_READ(offset + 0x7000); }
- virtual DECLARE_READ16_MEMBER(read_rom80) override { return INTV_ROM16_READ(offset + 0x8000); }
- virtual DECLARE_READ16_MEMBER(read_rom90) override { return INTV_ROM16_READ(offset + 0x9000); }
- virtual DECLARE_READ16_MEMBER(read_roma0) override { return INTV_ROM16_READ(offset + 0xa000); }
- virtual DECLARE_READ16_MEMBER(read_romb0) override { return INTV_ROM16_READ(offset + 0xb000); }
- virtual DECLARE_READ16_MEMBER(read_romc0) override { return INTV_ROM16_READ(offset + 0xc000); }
- virtual DECLARE_READ16_MEMBER(read_romd0) override { return INTV_ROM16_READ(offset + 0xd000); }
- virtual DECLARE_READ16_MEMBER(read_rome0) override { return INTV_ROM16_READ(offset + 0xe000); }
- virtual DECLARE_READ16_MEMBER(read_romf0) override { return INTV_ROM16_READ(offset + 0xf000); }
+ virtual uint16_t read_rom04(offs_t offset) override { return INTV_ROM16_READ(offset + 0x0400); }
+ virtual uint16_t read_rom20(offs_t offset) override { return INTV_ROM16_READ(offset + 0x2000); }
+ virtual uint16_t read_rom40(offs_t offset) override { return INTV_ROM16_READ(offset + 0x4000); }
+ virtual uint16_t read_rom48(offs_t offset) override { return INTV_ROM16_READ(offset + 0x4800); }
+ virtual uint16_t read_rom50(offs_t offset) override { return INTV_ROM16_READ(offset + 0x5000); }
+ virtual uint16_t read_rom60(offs_t offset) override { return INTV_ROM16_READ(offset + 0x6000); }
+ virtual uint16_t read_rom70(offs_t offset) override { return INTV_ROM16_READ(offset + 0x7000); }
+ virtual uint16_t read_rom80(offs_t offset) override { return INTV_ROM16_READ(offset + 0x8000); }
+ virtual uint16_t read_rom90(offs_t offset) override { return INTV_ROM16_READ(offset + 0x9000); }
+ virtual uint16_t read_roma0(offs_t offset) override { return INTV_ROM16_READ(offset + 0xa000); }
+ virtual uint16_t read_romb0(offs_t offset) override { return INTV_ROM16_READ(offset + 0xb000); }
+ virtual uint16_t read_romc0(offs_t offset) override { return INTV_ROM16_READ(offset + 0xc000); }
+ virtual uint16_t read_romd0(offs_t offset) override { return INTV_ROM16_READ(offset + 0xd000); }
+ virtual uint16_t read_rome0(offs_t offset) override { return INTV_ROM16_READ(offset + 0xe000); }
+ virtual uint16_t read_romf0(offs_t offset) override { return INTV_ROM16_READ(offset + 0xf000); }
protected:
intv_rom_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock);
@@ -49,8 +49,8 @@ public:
intv_ram_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
// reading and writing
- virtual DECLARE_READ16_MEMBER(read_ram) override { return (int)m_ram[offset & (m_ram.size() - 1)]; }
- virtual DECLARE_WRITE16_MEMBER(write_ram) override { m_ram[offset & (m_ram.size() - 1)] = data & 0xff; }
+ virtual uint16_t read_ram(offs_t offset) override { return (int)m_ram[offset & (m_ram.size() - 1)]; }
+ virtual void write_ram(offs_t offset, uint16_t data) override { m_ram[offset & (m_ram.size() - 1)] = data & 0xff; }
};
// ======================> intv_gfact_device
@@ -62,8 +62,8 @@ public:
intv_gfact_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
// reading and writing
- virtual DECLARE_READ16_MEMBER(read_ram) override { return (int)m_ram[offset & (m_ram.size() - 1)]; }
- virtual DECLARE_WRITE16_MEMBER(write_ram) override { m_ram[offset & (m_ram.size() - 1)] = data & 0xff; }
+ virtual uint16_t read_ram(offs_t offset) override { return (int)m_ram[offset & (m_ram.size() - 1)]; }
+ virtual void write_ram(offs_t offset, uint16_t data) override { m_ram[offset & (m_ram.size() - 1)] = data & 0xff; }
};
// ======================> intv_wsmlb_device
diff --git a/src/devices/bus/intv/slot.cpp b/src/devices/bus/intv/slot.cpp
index 0161c90b258..0c4ddae593a 100644
--- a/src/devices/bus/intv/slot.cpp
+++ b/src/devices/bus/intv/slot.cpp
@@ -488,10 +488,10 @@ std::string intv_cart_slot_device::get_default_card_software(get_default_card_so
read_ay
-------------------------------------------------*/
-READ16_MEMBER(intv_cart_slot_device::read_ay)
+uint16_t intv_cart_slot_device::read_ay(offs_t offset)
{
if (m_cart)
- return m_cart->read_ay(space, offset, mem_mask);
+ return m_cart->read_ay(offset);
else
return 0xffff;
}
@@ -500,20 +500,20 @@ READ16_MEMBER(intv_cart_slot_device::read_ay)
write_ay
-------------------------------------------------*/
-WRITE16_MEMBER(intv_cart_slot_device::write_ay)
+void intv_cart_slot_device::write_ay(offs_t offset, uint16_t data)
{
if (m_cart)
- m_cart->write_ay(space, offset, data, mem_mask);
+ m_cart->write_ay(offset, data);
}
/*-------------------------------------------------
read_speech
-------------------------------------------------*/
-READ16_MEMBER(intv_cart_slot_device::read_speech)
+uint16_t intv_cart_slot_device::read_speech(offs_t offset)
{
if (m_cart)
- return m_cart->read_speech(space, offset, mem_mask);
+ return m_cart->read_speech(offset);
else
return 0xffff;
}
@@ -522,10 +522,10 @@ READ16_MEMBER(intv_cart_slot_device::read_speech)
write_speech
-------------------------------------------------*/
-WRITE16_MEMBER(intv_cart_slot_device::write_speech)
+void intv_cart_slot_device::write_speech(offs_t offset, uint16_t data)
{
if (m_cart)
- m_cart->write_speech(space, offset, data, mem_mask);
+ m_cart->write_speech(offset, data);
}
diff --git a/src/devices/bus/intv/slot.h b/src/devices/bus/intv/slot.h
index bdec54dab76..ec79b148375 100644
--- a/src/devices/bus/intv/slot.h
+++ b/src/devices/bus/intv/slot.h
@@ -39,36 +39,36 @@ public:
virtual ~device_intv_cart_interface();
// reading and writing
- virtual DECLARE_READ16_MEMBER(read_rom04) { return 0xffff; }
- virtual DECLARE_READ16_MEMBER(read_rom20) { return 0xffff; }
- virtual DECLARE_READ16_MEMBER(read_rom40) { return 0xffff; }
- virtual DECLARE_READ16_MEMBER(read_rom48) { return 0xffff; }
- virtual DECLARE_READ16_MEMBER(read_rom50) { return 0xffff; }
- virtual DECLARE_READ16_MEMBER(read_rom60) { return 0xffff; }
- virtual DECLARE_READ16_MEMBER(read_rom70) { return 0xffff; }
- virtual DECLARE_READ16_MEMBER(read_rom80) { return 0xffff; }
- virtual DECLARE_READ16_MEMBER(read_rom90) { return 0xffff; }
- virtual DECLARE_READ16_MEMBER(read_roma0) { return 0xffff; }
- virtual DECLARE_READ16_MEMBER(read_romb0) { return 0xffff; }
- virtual DECLARE_READ16_MEMBER(read_romc0) { return 0xffff; }
- virtual DECLARE_READ16_MEMBER(read_romd0) { return 0xffff; }
- virtual DECLARE_READ16_MEMBER(read_rome0) { return 0xffff; }
- virtual DECLARE_READ16_MEMBER(read_romf0) { return 0xffff; }
-
- virtual DECLARE_READ16_MEMBER(read_ram) { return 0xffff; }
- virtual DECLARE_WRITE16_MEMBER(write_ram) {}
+ virtual uint16_t read_rom04(offs_t offset) { return 0xffff; }
+ virtual uint16_t read_rom20(offs_t offset) { return 0xffff; }
+ virtual uint16_t read_rom40(offs_t offset) { return 0xffff; }
+ virtual uint16_t read_rom48(offs_t offset) { return 0xffff; }
+ virtual uint16_t read_rom50(offs_t offset) { return 0xffff; }
+ virtual uint16_t read_rom60(offs_t offset) { return 0xffff; }
+ virtual uint16_t read_rom70(offs_t offset) { return 0xffff; }
+ virtual uint16_t read_rom80(offs_t offset) { return 0xffff; }
+ virtual uint16_t read_rom90(offs_t offset) { return 0xffff; }
+ virtual uint16_t read_roma0(offs_t offset) { return 0xffff; }
+ virtual uint16_t read_romb0(offs_t offset) { return 0xffff; }
+ virtual uint16_t read_romc0(offs_t offset) { return 0xffff; }
+ virtual uint16_t read_romd0(offs_t offset) { return 0xffff; }
+ virtual uint16_t read_rome0(offs_t offset) { return 0xffff; }
+ virtual uint16_t read_romf0(offs_t offset) { return 0xffff; }
+
+ virtual uint16_t read_ram(offs_t offset) { return 0xffff; }
+ virtual void write_ram(offs_t offset, uint16_t data) {}
// Used by IntelliVoice & ECS
- virtual DECLARE_READ16_MEMBER(read_ay) { return 0xffff; }
- virtual DECLARE_WRITE16_MEMBER(write_ay) {}
- virtual DECLARE_READ16_MEMBER(read_speech) { return 0xffff; }
- virtual DECLARE_WRITE16_MEMBER(write_speech) {}
- virtual DECLARE_WRITE16_MEMBER(write_d0) {}
- virtual DECLARE_WRITE16_MEMBER(write_88) {}
- virtual DECLARE_WRITE16_MEMBER(write_rom20) {}
- virtual DECLARE_WRITE16_MEMBER(write_rom70) {}
- virtual DECLARE_WRITE16_MEMBER(write_rome0) {}
- virtual DECLARE_WRITE16_MEMBER(write_romf0) {}
+ virtual uint16_t read_ay(offs_t offset) { return 0xffff; }
+ virtual void write_ay(offs_t offset, uint16_t data) {}
+ virtual uint16_t read_speech(offs_t offset) { return 0xffff; }
+ virtual void write_speech(offs_t offset, uint16_t data) {}
+ virtual void write_d0(offs_t offset, uint16_t data) {}
+ virtual void write_88(offs_t offset, uint16_t data) {}
+ virtual void write_rom20(offs_t offset, uint16_t data) {}
+ virtual void write_rom70(offs_t offset, uint16_t data) {}
+ virtual void write_rome0(offs_t offset, uint16_t data) {}
+ virtual void write_romf0(offs_t offset, uint16_t data) {}
void rom_alloc(uint32_t size, const char *tag);
void ram_alloc(uint32_t size);
@@ -98,7 +98,17 @@ class intv_cart_slot_device : public device_t,
{
public:
// construction/destruction
- intv_cart_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+ template <typename T>
+ intv_cart_slot_device(machine_config const &mconfig, char const *tag, device_t *owner, T &&opts, char const *dflt)
+ : intv_cart_slot_device(mconfig, tag, owner, 0)
+ {
+ option_reset();
+ opts(*this);
+ set_default_option(dflt);
+ set_fixed(false);
+ }
+
+ intv_cart_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock = 0);
virtual ~intv_cart_slot_device();
// image-level overrides
@@ -124,40 +134,40 @@ public:
virtual std::string get_default_card_software(get_default_card_software_hook &hook) const override;
// reading and writing
- virtual DECLARE_READ16_MEMBER(read_rom04) { if (m_cart) return m_cart->read_rom04(space, offset, mem_mask); else return 0xffff; }
- virtual DECLARE_READ16_MEMBER(read_rom20) { if (m_cart) return m_cart->read_rom20(space, offset, mem_mask); else return 0xffff; }
- virtual DECLARE_READ16_MEMBER(read_rom40) { if (m_cart) return m_cart->read_rom40(space, offset, mem_mask); else return 0xffff; }
- virtual DECLARE_READ16_MEMBER(read_rom48) { if (m_cart) return m_cart->read_rom48(space, offset, mem_mask); else return 0xffff; }
- virtual DECLARE_READ16_MEMBER(read_rom50) { if (m_cart) return m_cart->read_rom50(space, offset, mem_mask); else return 0xffff; }
- virtual DECLARE_READ16_MEMBER(read_rom60) { if (m_cart) return m_cart->read_rom60(space, offset, mem_mask); else return 0xffff; }
- virtual DECLARE_READ16_MEMBER(read_rom70) { if (m_cart) return m_cart->read_rom70(space, offset, mem_mask); else return 0xffff; }
- virtual DECLARE_READ16_MEMBER(read_rom80) { if (m_cart) return m_cart->read_rom80(space, offset, mem_mask); else return 0xffff; }
- virtual DECLARE_READ16_MEMBER(read_rom90) { if (m_cart) return m_cart->read_rom90(space, offset, mem_mask); else return 0xffff; }
- virtual DECLARE_READ16_MEMBER(read_roma0) { if (m_cart) return m_cart->read_roma0(space, offset, mem_mask); else return 0xffff; }
- virtual DECLARE_READ16_MEMBER(read_romb0) { if (m_cart) return m_cart->read_romb0(space, offset, mem_mask); else return 0xffff; }
- virtual DECLARE_READ16_MEMBER(read_romc0) { if (m_cart) return m_cart->read_romc0(space, offset, mem_mask); else return 0xffff; }
- virtual DECLARE_READ16_MEMBER(read_romd0) { if (m_cart) return m_cart->read_romd0(space, offset, mem_mask); else return 0xffff; }
- virtual DECLARE_READ16_MEMBER(read_rome0) { if (m_cart) return m_cart->read_rome0(space, offset, mem_mask); else return 0xffff; }
- virtual DECLARE_READ16_MEMBER(read_romf0) { if (m_cart) return m_cart->read_romf0(space, offset, mem_mask); else return 0xffff; }
-
- virtual DECLARE_READ16_MEMBER(read_ay);
- virtual DECLARE_WRITE16_MEMBER(write_ay);
- virtual DECLARE_READ16_MEMBER(read_speech);
- virtual DECLARE_WRITE16_MEMBER(write_speech);
- virtual DECLARE_READ16_MEMBER(read_ram) { if (m_cart) return m_cart->read_ram(space, offset, mem_mask); else return 0xffff; }
- virtual DECLARE_WRITE16_MEMBER(write_ram) { if (m_cart) m_cart->write_ram(space, offset, data, mem_mask); }
+ uint16_t read_rom04(offs_t offset) { if (m_cart) return m_cart->read_rom04(offset); else return 0xffff; }
+ uint16_t read_rom20(offs_t offset) { if (m_cart) return m_cart->read_rom20(offset); else return 0xffff; }
+ uint16_t read_rom40(offs_t offset) { if (m_cart) return m_cart->read_rom40(offset); else return 0xffff; }
+ uint16_t read_rom48(offs_t offset) { if (m_cart) return m_cart->read_rom48(offset); else return 0xffff; }
+ uint16_t read_rom50(offs_t offset) { if (m_cart) return m_cart->read_rom50(offset); else return 0xffff; }
+ uint16_t read_rom60(offs_t offset) { if (m_cart) return m_cart->read_rom60(offset); else return 0xffff; }
+ uint16_t read_rom70(offs_t offset) { if (m_cart) return m_cart->read_rom70(offset); else return 0xffff; }
+ uint16_t read_rom80(offs_t offset) { if (m_cart) return m_cart->read_rom80(offset); else return 0xffff; }
+ uint16_t read_rom90(offs_t offset) { if (m_cart) return m_cart->read_rom90(offset); else return 0xffff; }
+ uint16_t read_roma0(offs_t offset) { if (m_cart) return m_cart->read_roma0(offset); else return 0xffff; }
+ uint16_t read_romb0(offs_t offset) { if (m_cart) return m_cart->read_romb0(offset); else return 0xffff; }
+ uint16_t read_romc0(offs_t offset) { if (m_cart) return m_cart->read_romc0(offset); else return 0xffff; }
+ uint16_t read_romd0(offs_t offset) { if (m_cart) return m_cart->read_romd0(offset); else return 0xffff; }
+ uint16_t read_rome0(offs_t offset) { if (m_cart) return m_cart->read_rome0(offset); else return 0xffff; }
+ uint16_t read_romf0(offs_t offset) { if (m_cart) return m_cart->read_romf0(offset); else return 0xffff; }
+
+ uint16_t read_ay(offs_t offset);
+ void write_ay(offs_t offset, uint16_t data);
+ uint16_t read_speech(offs_t offset);
+ void write_speech(offs_t offset, uint16_t data);
+ uint16_t read_ram(offs_t offset) { if (m_cart) return m_cart->read_ram(offset); else return 0xffff; }
+ void write_ram(offs_t offset, uint16_t data) { if (m_cart) m_cart->write_ram(offset, data); }
virtual void late_subslot_setup() { if (m_cart) return m_cart->late_subslot_setup(); }
// these RAM accessors are needed to deal with IntelliVoice and ECS mounting RAM-equipped carts
- virtual DECLARE_WRITE16_MEMBER(write_d0) { if (m_cart) m_cart->write_d0(space, offset, data, mem_mask); }
- virtual DECLARE_WRITE16_MEMBER(write_88) { if (m_cart) m_cart->write_88(space, offset, data, mem_mask); }
+ void write_d0(offs_t offset, uint16_t data) { if (m_cart) m_cart->write_d0(offset, data); }
+ void write_88(offs_t offset, uint16_t data) { if (m_cart) m_cart->write_88(offset, data); }
// ECS paged roms need these
- virtual DECLARE_WRITE16_MEMBER(write_rom20) { if (m_cart) m_cart->write_rom20(space, offset, data, mem_mask); }
- virtual DECLARE_WRITE16_MEMBER(write_rom70) { if (m_cart) m_cart->write_rom70(space, offset, data, mem_mask); }
- virtual DECLARE_WRITE16_MEMBER(write_rome0) { if (m_cart) m_cart->write_rome0(space, offset, data, mem_mask); }
- virtual DECLARE_WRITE16_MEMBER(write_romf0) { if (m_cart) m_cart->write_romf0(space, offset, data, mem_mask); }
+ void write_rom20(offs_t offset, uint16_t data) { if (m_cart) m_cart->write_rom20(offset, data); }
+ void write_rom70(offs_t offset, uint16_t data) { if (m_cart) m_cart->write_rom70(offset, data); }
+ void write_rome0(offs_t offset, uint16_t data) { if (m_cart) m_cart->write_rome0(offset, data); }
+ void write_romf0(offs_t offset, uint16_t data) { if (m_cart) m_cart->write_romf0(offset, data); }
protected:
// device-level overrides
@@ -179,10 +189,6 @@ DECLARE_DEVICE_TYPE(INTV_CART_SLOT, intv_cart_slot_device)
#define INTVSLOT_ROM_REGION_TAG ":cart:rom"
-#define MCFG_INTV_CARTRIDGE_ADD(_tag,_slot_intf,_def_slot) \
- MCFG_DEVICE_ADD(_tag, INTV_CART_SLOT, 0) \
- MCFG_DEVICE_SLOT_INTERFACE(_slot_intf, _def_slot, false)
-
void intv_cart(device_slot_interface &device);
#endif // MAME_BUS_INTV_SLOT_H
diff --git a/src/devices/bus/intv/voice.cpp b/src/devices/bus/intv/voice.cpp
index 7cc62da7856..b8b07d84d34 100644
--- a/src/devices/bus/intv/voice.cpp
+++ b/src/devices/bus/intv/voice.cpp
@@ -69,15 +69,16 @@ void intv_voice_device::late_subslot_setup()
// device_add_mconfig - add device configuration
//-------------------------------------------------
-MACHINE_CONFIG_START(intv_voice_device::device_add_mconfig)
+void intv_voice_device::device_add_mconfig(machine_config &config)
+{
SPEAKER(config, "mono_voice").front_center();
SP0256(config, m_speech, 3120000);
/* The Intellivoice uses a speaker with its own volume control so the relative volumes to use are subjective */
m_speech->add_route(ALL_OUTPUTS, "mono_voice", 1.00);
- MCFG_INTV_CARTRIDGE_ADD("subslot", intv_cart, nullptr)
-MACHINE_CONFIG_END
+ INTV_CART_SLOT(config, m_subslot, intv_cart, nullptr);
+}
ROM_START( intellivoice )
@@ -95,37 +96,33 @@ const tiny_rom_entry *intv_voice_device::device_rom_region() const
read_audio
-------------------------------------------------*/
-READ16_MEMBER(intv_voice_device::read_speech)
+uint16_t intv_voice_device::read_speech(offs_t offset)
{
- if (ACCESSING_BITS_0_7)
- return m_speech->spb640_r(offset);
- else
- return 0xff;
+ return 0xff00 | m_speech->spb640_r(offset);
}
/*-------------------------------------------------
write_audio
-------------------------------------------------*/
-WRITE16_MEMBER(intv_voice_device::write_speech)
+void intv_voice_device::write_speech(offs_t offset, uint16_t data)
{
- if (ACCESSING_BITS_0_7)
- return m_speech->spb640_w(offset, data);
+ m_speech->spb640_w(offset, data & 0x00ff);
}
-READ16_MEMBER(intv_voice_device::read_rom80)
+uint16_t intv_voice_device::read_rom80(offs_t offset)
{
if (m_ram88_enabled && offset >= 0x800)
- return m_subslot->read_ram(space, offset & 0x7ff, mem_mask);
+ return m_subslot->read_ram(offset & 0x7ff);
else
- return m_subslot->read_rom80(space, offset, mem_mask);
+ return m_subslot->read_rom80(offset);
}
-READ16_MEMBER(intv_voice_device::read_romd0)
+uint16_t intv_voice_device::read_romd0(offs_t offset)
{
if (m_ramd0_enabled && offset < 0x800)
- return m_subslot->read_ram(space, offset, mem_mask);
+ return m_subslot->read_ram(offset);
else
- return m_subslot->read_romd0(space, offset, mem_mask);
+ return m_subslot->read_romd0(offset);
}
diff --git a/src/devices/bus/intv/voice.h b/src/devices/bus/intv/voice.h
index d99b31573a3..7369058c435 100644
--- a/src/devices/bus/intv/voice.h
+++ b/src/devices/bus/intv/voice.h
@@ -18,31 +18,31 @@ public:
// reading and writing
// actual IntelliVoice access
- virtual DECLARE_READ16_MEMBER(read_speech) override;
- virtual DECLARE_WRITE16_MEMBER(write_speech) override;
+ virtual uint16_t read_speech(offs_t offset) override;
+ virtual void write_speech(offs_t offset, uint16_t data) override;
// passthru access
- virtual DECLARE_READ16_MEMBER(read_rom04) override { return m_subslot->read_rom04(space, offset, mem_mask); }
- virtual DECLARE_READ16_MEMBER(read_rom20) override { return m_subslot->read_rom20(space, offset, mem_mask); }
- virtual DECLARE_READ16_MEMBER(read_rom40) override { return m_subslot->read_rom40(space, offset, mem_mask); }
- virtual DECLARE_READ16_MEMBER(read_rom48) override { return m_subslot->read_rom48(space, offset, mem_mask); }
- virtual DECLARE_READ16_MEMBER(read_rom50) override { return m_subslot->read_rom50(space, offset, mem_mask); }
- virtual DECLARE_READ16_MEMBER(read_rom60) override { return m_subslot->read_rom60(space, offset, mem_mask); }
- virtual DECLARE_READ16_MEMBER(read_rom70) override { return m_subslot->read_rom70(space, offset, mem_mask); }
- virtual DECLARE_READ16_MEMBER(read_rom80) override;
- virtual DECLARE_READ16_MEMBER(read_rom90) override { return m_subslot->read_rom90(space, offset, mem_mask); }
- virtual DECLARE_READ16_MEMBER(read_roma0) override { return m_subslot->read_roma0(space, offset, mem_mask); }
- virtual DECLARE_READ16_MEMBER(read_romb0) override { return m_subslot->read_romb0(space, offset, mem_mask); }
- virtual DECLARE_READ16_MEMBER(read_romc0) override { return m_subslot->read_romc0(space, offset, mem_mask); }
- virtual DECLARE_READ16_MEMBER(read_romd0) override;
- virtual DECLARE_READ16_MEMBER(read_rome0) override { return m_subslot->read_rome0(space, offset, mem_mask); }
- virtual DECLARE_READ16_MEMBER(read_romf0) override { return m_subslot->read_romf0(space, offset, mem_mask); }
+ virtual uint16_t read_rom04(offs_t offset) override { return m_subslot->read_rom04(offset); }
+ virtual uint16_t read_rom20(offs_t offset) override { return m_subslot->read_rom20(offset); }
+ virtual uint16_t read_rom40(offs_t offset) override { return m_subslot->read_rom40(offset); }
+ virtual uint16_t read_rom48(offs_t offset) override { return m_subslot->read_rom48(offset); }
+ virtual uint16_t read_rom50(offs_t offset) override { return m_subslot->read_rom50(offset); }
+ virtual uint16_t read_rom60(offs_t offset) override { return m_subslot->read_rom60(offset); }
+ virtual uint16_t read_rom70(offs_t offset) override { return m_subslot->read_rom70(offset); }
+ virtual uint16_t read_rom80(offs_t offset) override;
+ virtual uint16_t read_rom90(offs_t offset) override { return m_subslot->read_rom90(offset); }
+ virtual uint16_t read_roma0(offs_t offset) override { return m_subslot->read_roma0(offset); }
+ virtual uint16_t read_romb0(offs_t offset) override { return m_subslot->read_romb0(offset); }
+ virtual uint16_t read_romc0(offs_t offset) override { return m_subslot->read_romc0(offset); }
+ virtual uint16_t read_romd0(offs_t offset) override;
+ virtual uint16_t read_rome0(offs_t offset) override { return m_subslot->read_rome0(offset); }
+ virtual uint16_t read_romf0(offs_t offset) override { return m_subslot->read_romf0(offset); }
// RAM passthru write
- virtual DECLARE_WRITE16_MEMBER(write_88) override { if (m_ram88_enabled) m_subslot->write_ram(space, offset, data, mem_mask); }
- virtual DECLARE_WRITE16_MEMBER(write_d0) override { if (m_ramd0_enabled) m_subslot->write_ram(space, offset, data, mem_mask); }
- virtual DECLARE_READ16_MEMBER(read_ram) override { return m_subslot->read_ram(space, offset, mem_mask); }
- virtual DECLARE_WRITE16_MEMBER(write_ram) override { m_subslot->write_ram(space, offset, data, mem_mask); }
+ virtual void write_88(offs_t offset, uint16_t data) override { if (m_ram88_enabled) m_subslot->write_ram(offset, data); }
+ virtual void write_d0(offs_t offset, uint16_t data) override { if (m_ramd0_enabled) m_subslot->write_ram(offset, data); }
+ virtual uint16_t read_ram(offs_t offset) override { return m_subslot->read_ram(offset); }
+ virtual void write_ram(offs_t offset, uint16_t data) override { m_subslot->write_ram(offset, data); }
virtual void late_subslot_setup() override;
diff --git a/src/devices/bus/intv_ctrl/ctrl.h b/src/devices/bus/intv_ctrl/ctrl.h
index 4a3ce67a688..1cf3968f933 100644
--- a/src/devices/bus/intv_ctrl/ctrl.h
+++ b/src/devices/bus/intv_ctrl/ctrl.h
@@ -41,7 +41,17 @@ class intv_control_port_device : public device_t,
{
public:
// construction/destruction
- intv_control_port_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+ template <typename T>
+ intv_control_port_device(machine_config const &mconfig, char const *tag, device_t *owner, T &&opts, char const *dflt)
+ : intv_control_port_device(mconfig, tag, owner, 0)
+ {
+ option_reset();
+ opts(*this);
+ set_default_option(dflt);
+ set_fixed(false);
+ }
+
+ intv_control_port_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock = 0);
virtual ~intv_control_port_device();
DECLARE_READ8_MEMBER( ctrl_r ) { return read_ctrl(); }
@@ -58,17 +68,6 @@ protected:
// device type definition
DECLARE_DEVICE_TYPE(INTV_CONTROL_PORT, intv_control_port_device)
-
-//**************************************************************************
-// INTERFACE CONFIGURATION MACROS
-//**************************************************************************
-
-#define MCFG_INTV_CONTROL_PORT_ADD(_tag, _slot_intf, _def_slot) \
- MCFG_DEVICE_ADD(_tag, INTV_CONTROL_PORT, 0) \
- MCFG_DEVICE_SLOT_INTERFACE(_slot_intf, _def_slot, false)
-
-
-
void intv_control_port_devices(device_slot_interface &device);
diff --git a/src/devices/bus/intv_ctrl/ecs_ctrl.cpp b/src/devices/bus/intv_ctrl/ecs_ctrl.cpp
index e90292de645..3f6afda5f4b 100644
--- a/src/devices/bus/intv_ctrl/ecs_ctrl.cpp
+++ b/src/devices/bus/intv_ctrl/ecs_ctrl.cpp
@@ -145,10 +145,11 @@ static void intvecs_controller(device_slot_interface &device)
device.option_add("handctrl", INTV_HANDCTRL);
}
-MACHINE_CONFIG_START(intvecs_ctrls_device::device_add_mconfig)
- MCFG_INTV_CONTROL_PORT_ADD("port1", intvecs_controller, "handctrl")
- MCFG_INTV_CONTROL_PORT_ADD("port2", intvecs_controller, "handctrl")
-MACHINE_CONFIG_END
+void intvecs_ctrls_device::device_add_mconfig(machine_config &config)
+{
+ INTV_CONTROL_PORT(config, m_hand1, intvecs_controller, "handctrl");
+ INTV_CONTROL_PORT(config, m_hand2, intvecs_controller, "handctrl");
+}
intvecs_ctrls_device::intvecs_ctrls_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) :
diff --git a/src/devices/bus/intv_ctrl/ecs_ctrl.h b/src/devices/bus/intv_ctrl/ecs_ctrl.h
index 923b5785358..8a723c64949 100644
--- a/src/devices/bus/intv_ctrl/ecs_ctrl.h
+++ b/src/devices/bus/intv_ctrl/ecs_ctrl.h
@@ -46,7 +46,17 @@ class intvecs_control_port_device : public device_t,
{
public:
// construction/destruction
- intvecs_control_port_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+ template <typename T>
+ intvecs_control_port_device(machine_config const &mconfig, char const *tag, device_t *owner, T &&opts, char const *dflt)
+ : intvecs_control_port_device(mconfig, tag, owner, 0)
+ {
+ option_reset();
+ opts(*this);
+ set_default_option(dflt);
+ set_fixed(false);
+ }
+
+ intvecs_control_port_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock = 0);
virtual ~intvecs_control_port_device();
DECLARE_READ8_MEMBER( portA_r ) { return read_portA(); }
@@ -68,16 +78,6 @@ protected:
DECLARE_DEVICE_TYPE(INTVECS_CONTROL_PORT, intvecs_control_port_device)
-//**************************************************************************
-// INTERFACE CONFIGURATION MACROS
-//**************************************************************************
-
-#define MCFG_INTVECS_CONTROL_PORT_ADD(_tag, _slot_intf, _def_slot) \
- MCFG_DEVICE_ADD(_tag, INTVECS_CONTROL_PORT, 0) \
- MCFG_DEVICE_SLOT_INTERFACE(_slot_intf, _def_slot, false)
-
-
-
void intvecs_control_port_devices(device_slot_interface &device);
diff --git a/src/devices/bus/iq151/disc2.cpp b/src/devices/bus/iq151/disc2.cpp
index db9919ef516..0fde6792d40 100644
--- a/src/devices/bus/iq151/disc2.cpp
+++ b/src/devices/bus/iq151/disc2.cpp
@@ -95,7 +95,7 @@ const tiny_rom_entry *iq151_disc2_device::device_rom_region() const
void iq151_disc2_device::read(offs_t offset, uint8_t &data)
{
- // interal ROM is mapped at 0xe000-0xe7ff
+ // internal ROM is mapped at 0xe000-0xe7ff
if (offset >= 0xe000 && offset < 0xe800 && m_rom_enabled)
data = m_rom[offset & 0x7ff];
}
@@ -107,12 +107,10 @@ void iq151_disc2_device::read(offs_t offset, uint8_t &data)
void iq151_disc2_device::io_read(offs_t offset, uint8_t &data)
{
- /* This is gross */
- address_space *space = nullptr;
if (offset == 0xaa)
- data = m_fdc->msr_r(*space, 0, 0xff);
+ data = m_fdc->msr_r();
else if (offset == 0xab)
- data = m_fdc->fifo_r(*space, 0, 0xff);
+ data = m_fdc->fifo_r();
}
//-------------------------------------------------
@@ -121,9 +119,8 @@ void iq151_disc2_device::io_read(offs_t offset, uint8_t &data)
void iq151_disc2_device::io_write(offs_t offset, uint8_t data)
{
- address_space *space = nullptr;
if (offset == 0xab)
- m_fdc->fifo_w(*space, 0, data, 0xff);
+ m_fdc->fifo_w(data);
else if (offset == 0xac)
m_rom_enabled = (data == 0x01);
}
diff --git a/src/devices/bus/iq151/iq151.h b/src/devices/bus/iq151/iq151.h
index e68d27a007d..306fef47ee6 100644
--- a/src/devices/bus/iq151/iq151.h
+++ b/src/devices/bus/iq151/iq151.h
@@ -87,16 +87,26 @@ class iq151cart_slot_device : public device_t,
{
public:
// construction/destruction
- iq151cart_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+ template <typename T>
+ iq151cart_slot_device(machine_config const &mconfig, char const *tag, device_t *owner, T &&opts, char const *dflt)
+ : iq151cart_slot_device(mconfig, tag, owner, 0)
+ {
+ option_reset();
+ opts(*this);
+ set_default_option(dflt);
+ set_fixed(false);
+ }
+
+ iq151cart_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock = 0);
virtual ~iq151cart_slot_device();
- void set_screen_tag(const char *tag) { m_screen.set_tag(tag); }
- template <class Object> devcb_base &set_out_irq0_callback(Object &&cb) { return m_out_irq0_cb.set_callback(std::forward<Object>(cb)); }
- template <class Object> devcb_base &set_out_irq1_callback(Object &&cb) { return m_out_irq1_cb.set_callback(std::forward<Object>(cb)); }
- template <class Object> devcb_base &set_out_irq2_callback(Object &&cb) { return m_out_irq2_cb.set_callback(std::forward<Object>(cb)); }
- template <class Object> devcb_base &set_out_irq3_callback(Object &&cb) { return m_out_irq3_cb.set_callback(std::forward<Object>(cb)); }
- template <class Object> devcb_base &set_out_irq4_callback(Object &&cb) { return m_out_irq4_cb.set_callback(std::forward<Object>(cb)); }
- template <class Object> devcb_base &set_out_drq_callback(Object &&cb) { return m_out_drq_cb.set_callback(std::forward<Object>(cb)); }
+ template <typename T> void set_screen_tag(T &&tag) { m_screen.set_tag(std::forward<T>(tag)); }
+ auto out_irq0_callback() { return m_out_irq0_cb.bind(); }
+ auto out_irq1_callback() { return m_out_irq1_cb.bind(); }
+ auto out_irq2_callback() { return m_out_irq2_cb.bind(); }
+ auto out_irq3_callback() { return m_out_irq3_cb.bind(); }
+ auto out_irq4_callback() { return m_out_irq4_cb.bind(); }
+ auto out_drq_callback() { return m_out_drq_cb.bind(); }
// device-level overrides
virtual void device_start() override;
@@ -139,30 +149,4 @@ public:
// device type definition
DECLARE_DEVICE_TYPE(IQ151CART_SLOT, iq151cart_slot_device)
-
-/***************************************************************************
- DEVICE CONFIGURATION MACROS
-***************************************************************************/
-
-#define MCFG_IQ151CART_SLOT_OUT_IRQ0_CB(_devcb) \
- downcast<iq151cart_slot_device &>(*device).set_out_irq0_callback(DEVCB_##_devcb);
-
-#define MCFG_IQ151CART_SLOT_OUT_IRQ1_CB(_devcb) \
- downcast<iq151cart_slot_device &>(*device).set_out_irq1_callback(DEVCB_##_devcb);
-
-#define MCFG_IQ151CART_SLOT_OUT_IRQ2_CB(_devcb) \
- downcast<iq151cart_slot_device &>(*device).set_out_irq2_callback(DEVCB_##_devcb);
-
-#define MCFG_IQ151CART_SLOT_OUT_IRQ3_CB(_devcb) \
- downcast<iq151cart_slot_device &>(*device).set_out_irq3_callback(DEVCB_##_devcb);
-
-#define MCFG_IQ151CART_SLOT_OUT_IRQ4_CB(_devcb) \
- downcast<iq151cart_slot_device &>(*device).set_out_irq4_callback(DEVCB_##_devcb);
-
-#define MCFG_IQ151CART_SLOT_OUT_DRQ_CB(_devcb) \
- downcast<iq151cart_slot_device &>(*device).set_out_drq_callback(DEVCB_##_devcb);
-
-#define MCFG_IQ151CART_SLOT_SCREEN_TAG(screen_tag) \
- downcast<iq151cart_slot_device &>(*device).set_screen_tag(screen_tag);
-
#endif // MAME_BUS_IQ151_IQ151_H
diff --git a/src/devices/bus/isa/3c503.cpp b/src/devices/bus/isa/3c503.cpp
index 424ce8bb082..34202e2246d 100644
--- a/src/devices/bus/isa/3c503.cpp
+++ b/src/devices/bus/isa/3c503.cpp
@@ -5,12 +5,13 @@
#define SADDR 0xcc000
-MACHINE_CONFIG_START(el2_3c503_device::device_add_mconfig)
- MCFG_DEVICE_ADD("dp8390d", DP8390D, 0)
- MCFG_DP8390D_IRQ_CB(WRITELINE(*this, el2_3c503_device, el2_3c503_irq_w))
- MCFG_DP8390D_MEM_READ_CB(READ8(*this, el2_3c503_device, el2_3c503_mem_r))
- MCFG_DP8390D_MEM_WRITE_CB(WRITE8(*this, el2_3c503_device, el2_3c503_mem_w))
-MACHINE_CONFIG_END
+void el2_3c503_device::device_add_mconfig(machine_config &config)
+{
+ DP8390D(config, m_dp8390, 0);
+ m_dp8390->irq_callback().set(FUNC(el2_3c503_device::el2_3c503_irq_w));
+ m_dp8390->mem_read_callback().set(FUNC(el2_3c503_device::el2_3c503_mem_r));
+ m_dp8390->mem_write_callback().set(FUNC(el2_3c503_device::el2_3c503_mem_w));
+}
DEFINE_DEVICE_TYPE(EL2_3C503, el2_3c503_device, "el2_3c503", "3C503 Network Adapter")
diff --git a/src/devices/bus/isa/3c505.cpp b/src/devices/bus/isa/3c505.cpp
index 71548dcbdaa..37cd5ef346a 100644
--- a/src/devices/bus/isa/3c505.cpp
+++ b/src/devices/bus/isa/3c505.cpp
@@ -1644,7 +1644,9 @@ READ16_MEMBER(threecom3c505_device::read)
// omit excessive logging
if (data == last_data)
{
- uint32_t pc = space.device().state().pcbase();
+ // FIXME: space.device().state().pcbase() will crash mame with SIGSEGV (since mame0197)
+ uint32_t pc = 0; // space.device().state().pcbase();
+
if (pc == last_pc)
{
return data;
diff --git a/src/devices/bus/isa/adlib.cpp b/src/devices/bus/isa/adlib.cpp
index 814fdeaaf58..6a900b0e09d 100644
--- a/src/devices/bus/isa/adlib.cpp
+++ b/src/devices/bus/isa/adlib.cpp
@@ -20,7 +20,7 @@ READ8_MEMBER( isa8_adlib_device::ym3812_16_r )
uint8_t retVal = 0xff;
switch(offset)
{
- case 0 : retVal = m_ym3812->status_port_r( space, offset ); break;
+ case 0 : retVal = m_ym3812->status_port_r(); break;
}
return retVal;
}
@@ -29,8 +29,8 @@ WRITE8_MEMBER( isa8_adlib_device::ym3812_16_w )
{
switch(offset)
{
- case 0 : m_ym3812->control_port_w( space, offset, data ); break;
- case 1 : m_ym3812->write_port_w( space, offset, data ); break;
+ case 0 : m_ym3812->control_port_w(data); break;
+ case 1 : m_ym3812->write_port_w(data); break;
}
}
@@ -44,11 +44,11 @@ DEFINE_DEVICE_TYPE(ISA8_ADLIB, isa8_adlib_device, "isa_adlib", "Ad Lib Sound Car
// device_add_mconfig - add device configuration
//-------------------------------------------------
-MACHINE_CONFIG_START(isa8_adlib_device::device_add_mconfig)
+void isa8_adlib_device::device_add_mconfig(machine_config &config)
+{
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("ym3812", YM3812, ym3812_StdClock)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 3.00)
-MACHINE_CONFIG_END
+ YM3812(config, m_ym3812, ym3812_StdClock).add_route(ALL_OUTPUTS, "mono", 3.00);
+}
//**************************************************************************
// LIVE DEVICE
diff --git a/src/devices/bus/isa/aga.cpp b/src/devices/bus/isa/aga.cpp
index 9aa2810431b..e1c26328c44 100644
--- a/src/devices/bus/isa/aga.cpp
+++ b/src/devices/bus/isa/aga.cpp
@@ -273,12 +273,13 @@ MC6845_UPDATE_ROW( isa8_aga_device::aga_update_row )
}
-MACHINE_CONFIG_START(isa8_aga_device::device_add_mconfig)
- MCFG_SCREEN_ADD( AGA_SCREEN_NAME, RASTER )
- MCFG_SCREEN_RAW_PARAMS( XTAL(14'318'181),912,0,640,262,0,200 )
- MCFG_SCREEN_UPDATE_DEVICE( AGA_MC6845_NAME, mc6845_device, screen_update )
+void isa8_aga_device::device_add_mconfig(machine_config &config)
+{
+ screen_device &screen(SCREEN(config, AGA_SCREEN_NAME, SCREEN_TYPE_RASTER));
+ screen.set_raw(XTAL(14'318'181), 912, 0, 640, 262, 0, 200);
+ screen.set_screen_update(AGA_MC6845_NAME, FUNC(mc6845_device::screen_update));
- MCFG_PALETTE_ADD( "palette", /* CGA_PALETTE_SETS * 16*/ 65536 )
+ PALETTE(config, m_palette).set_entries(/* CGA_PALETTE_SETS * 16*/ 65536);
MC6845(config, m_mc6845, XTAL(14'318'181)/8);
m_mc6845->set_screen(AGA_SCREEN_NAME);
@@ -287,7 +288,7 @@ MACHINE_CONFIG_START(isa8_aga_device::device_add_mconfig)
m_mc6845->set_update_row_callback(FUNC(isa8_aga_device::aga_update_row), this);
m_mc6845->out_hsync_callback().set(FUNC(isa8_aga_device::hsync_changed));
m_mc6845->out_vsync_callback().set(FUNC(isa8_aga_device::vsync_changed));
-MACHINE_CONFIG_END
+}
/*************************************
@@ -689,7 +690,7 @@ READ8_MEMBER ( isa8_aga_device::pc_aga_mda_r )
/* return last written mc6845 address value here? */
break;
case 1: case 3: case 5: case 7:
- data = m_mc6845->register_r(space, offset);
+ data = m_mc6845->register_r();
break;
case 10:
data = m_vsync | 0x08 | m_hsync;
@@ -706,10 +707,10 @@ WRITE8_MEMBER ( isa8_aga_device::pc_aga_mda_w )
switch( offset )
{
case 0: case 2: case 4: case 6:
- m_mc6845->address_w( space, offset, data );
+ m_mc6845->address_w(data);
break;
case 1: case 3: case 5: case 7:
- m_mc6845->register_w( space, offset, data );
+ m_mc6845->register_w(data);
break;
case 8:
m_mda_mode_control = data;
@@ -740,7 +741,7 @@ READ8_MEMBER ( isa8_aga_device::pc_aga_cga_r )
/* return last written mc6845 address value here? */
break;
case 1: case 3: case 5: case 7:
- data = m_mc6845->register_r( space, offset);
+ data = m_mc6845->register_r();
break;
case 10:
data = m_vsync | ( ( data & 0x40 ) >> 4 ) | m_hsync;
@@ -791,10 +792,10 @@ WRITE8_MEMBER (isa8_aga_device:: pc_aga_cga_w )
if ( m_mode == AGA_COLOR ) {
switch(offset) {
case 0: case 2: case 4: case 6:
- m_mc6845->address_w( space, offset, data );
+ m_mc6845->address_w(data);
break;
case 1: case 3: case 5: case 7:
- m_mc6845->register_w( space, offset, data );
+ m_mc6845->register_w(data);
break;
case 8:
m_cga_mode_control = data;
diff --git a/src/devices/bus/isa/aha1542.cpp b/src/devices/bus/isa/aha1542.cpp
deleted file mode 100644
index 8e260347eee..00000000000
--- a/src/devices/bus/isa/aha1542.cpp
+++ /dev/null
@@ -1,200 +0,0 @@
-// license:BSD-3-Clause
-// copyright-holders:Darkstar
-/**********************************************************************
- *
- * Adaptec AHA-1542{,C,CF} SCSI Controller
- *
- **********************************************************************/
-
-/*
- PCB layout
- ----------
- Floppy SCSI
- +-----------+ +------------------+ +-
- +-----+-----------+-+------------------+--+
- | |
- | DIPSW DS1 |\
- | +-----+ | |
- | | | Y1 +---+ TRM TRM | |
- | | U3 | |U5 | |S|
- | U8 +-----+ +---+ |C|
- | +---+ +------+ +-------+ |S|
- | |U13| |U15 | Y2 | | |I|
- | +---+ +------+ | | | |
- | |U16 | |U17 | | |
- | +------+ +-------+ |/
- +-----------------------------------------+
- ||||||||| ||||||||||||||||||||||||| |
-
-
- DIPSW sw1 - sw8
- U3 Intel chip labelled "AHA-1542CF/552800-01 D/9346", probably FDC (82077)
- U5 Z84C0010VEC
- U8 EEPROM(?) labelled 545120A
- U13 CXK5864CM-10LL (64kbit SRAM)
- U15 M27C256B labelled "ADAPTEC INC/553801-00 C/MCODE 563D/(C) 1993"
- U16 M27C256B labelled "ADAPTEC INC/553601-00 C/BIOS C38D/(C) 1993"
- U17 AIC-7970Q
- Y1 XTAL SRX4054 93-38
- Y2 XTAL SRX4053 93-40
- TRM Dallas DS2107AS (SCSI termination)
- DS1 LED
-
-*/
-
-/*
- * The PCB has a couple of DIP switches:
- *
- * sw1 on enable termination
- * off software-controlled termination
- *
- * sw2 sw3 sw4 I/O Port
- * off off off 0x330 - 0x333 (default)
- * on off off 0x334 - 0x337
- * off on off 0x230 - 0x233
- * on on off 0x234 - 0x237
- * off off on 0x130 - 0x133
- * on off on 0x134 - 0x137
- * off on on reserved
- * on on on reserved
- *
- * sw5 on disable floppy interface
- * off enable floppy interface
- *
- * sw6 sw7 sw8 BIOS base address
- * off off off 0xdc000 (default)
- * on off off 0xd8000
- * off on off 0xd4000
- * on on off 0xd0000
- * off off on 0xcc000
- * on off on 0xc8000
- * off on on reserved
- * on on on BIOS disabled
- *
- * source: http://download.adaptec.com/pdfs/installation_guides/1540cfig.pdf
- */
-
-#include "emu.h"
-#include "aha1542.h"
-#include "cpu/z80/z80.h"
-
-// I/O Port interface
-// READ Port x+0: STATUS
-// WRITE Port x+0: CONTROL
-//
-// READ Port x+1: DATA
-// WRITE Port x+1: COMMAND
-//
-// READ Port x+2: INTERRUPT STATUS
-// WRITE Port x+2: (undefined?)
-//
-// R/W Port x+3: (undefined)
-
-// READ STATUS flags
-#define STAT_STST 0x80 // self-test in progress
-#define STAT_DIAGF 0x40 // internal diagnostic failure
-#define STAT_INIT 0x20 // mailbox initialization required
-#define STAT_IDLE 0x10 // HBA is idle
-#define STAT_CDFULL 0x08 // Command/Data output port is full
-#define STAT_DFULL 0x04 // Data input port is full
-#define STAT_INVCMD 0x01 // Invalid command
-
-// READ INTERRUPT STATUS flags
-#define INTR_ANY 0x80 // any interrupt
-#define INTR_SRCD 0x08 // SCSI reset detected
-#define INTR_HACC 0x04 // HA command complete
-#define INTR_MBOA 0x02 // MBO empty
-#define INTR_MBIF 0x01 // MBI full
-
-// WRITE CONTROL commands
-#define CTRL_HRST 0x80 // Hard reset
-#define CTRL_SRST 0x40 // Soft reset
-#define CTRL_IRST 0x20 // interrupt reset
-#define CTRL_SCRST 0x10 // SCSI bus reset
-
-// READ/WRITE DATA commands
-#define CMD_NOP 0x00 // No operation
-#define CMD_MBINIT 0x01 // mailbox initialization
-#define CMD_START_SCSI 0x02 // Start SCSI command
-#define CMD_BIOSCMD 0x03 // undocumented BIOS conmmand (shadow RAM etc.)
-#define CMD_INQUIRY 0x04 // Adapter inquiry
-#define CMD_EMBOI 0x05 // enable Mailbox Out Interrupt
-#define CMD_SELTIMEOUT 0x06 // Set SEL timeout
-#define CMD_BUSON_TIME 0x07 // set bus-On time
-#define CMD_BUSOFF_TIME 0x08 // set bus-off time
-#define CMD_DMASPEED 0x09 // set ISA DMA speed
-#define CMD_RETDEVS 0x0a // return installed devices
-#define CMD_RETCONF 0x0b // return configuration data
-#define CMD_TARGET 0x0c // set HBA to target mode
-#define CMD_RETSETUP 0x0d // return setup data
-#define CMD_ECHO 0x1f // ECHO command data (NetBSD says it is 0x1e)
-
-// these are for 1541C only:
-#define CMD_RETDEVSHI 0x23 // return devices 8-15 (from NetBSD)
-#define CMD_EXTBIOS 0x28 // return extended BIOS information
-#define CMD_MBENABLE 0x29 // set mailbox interface enable
-
-DEFINE_DEVICE_TYPE(AHA1542, aha1542_device, "aha1542", "AHA1542 SCSI Controller")
-
-#define Z84C0010_TAG "u5"
-
-READ8_MEMBER( aha1542_device::aha1542_r )
-{
- logerror("%s aha1542_r(): offset=%d\n", machine().describe_context(), offset);
- return 0xff;
-}
-
-WRITE8_MEMBER( aha1542_device::aha1542_w )
-{
- logerror("%s aha1542_w(): offset=%d data=0x%02x\n", machine().describe_context(), offset, data);
-}
-
-//-------------------------------------------------
-// ROM( aha1542 )
-//-------------------------------------------------
-
-ROM_START( aha1542 )
- ROM_REGION( 0x8000, "aha1542", 0 )
- ROM_LOAD( "553601-00.u16", 0x0000, 0x8000, CRC(ab22fc02) SHA1(f9f783e0272fc14ba3de32316997f1f6cadc67d0) ) /* Adaptec 1540CF/1542CF BIOS v2.01 */
-
- ROM_REGION( 0x8000, Z84C0010_TAG, 0 )
- ROM_LOAD( "553801-00.u15", 0x0000, 0x8000, CRC(7824397e) SHA1(35bc2c8fab31aad3190a478f2dc8f3a72958cf04) ) /* ADAPTEC, INC MCODE */
-ROM_END
-
-void aha1542_device::z84c0010_mem(address_map &map)
-{
- map(0x0000, 0x7fff).rom().region(Z84C0010_TAG, 0);
- map(0x8000, 0x800f).noprw(); // something is mapped there
- map(0x9000, 0xafff).ram(); // 2kb RAM chip
- map(0xe000, 0xe0ff).ram(); // probably PC<->Z80 communication area
- map(0xb000, 0xb000).noprw(); // something?
-}
-
-const tiny_rom_entry *aha1542_device::device_rom_region() const
-{
- return ROM_NAME( aha1542 );
-}
-
-MACHINE_CONFIG_START(aha1542_device::device_add_mconfig)
- MCFG_DEVICE_ADD(Z84C0010_TAG, Z80, XTAL(12'000'000))
- MCFG_DEVICE_PROGRAM_MAP( z84c0010_mem )
-MACHINE_CONFIG_END
-
-aha1542_device::aha1542_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) :
- device_t(mconfig, AHA1542, tag, owner, clock),
- device_isa16_card_interface(mconfig, *this)
-{
-}
-
-void aha1542_device::device_start()
-{
- set_isa_device();
- m_isa->install_rom(this, 0xdc000, 0xdffff, "aha1542", "aha1542");
- m_isa->install_device(0x330, 0x333, read8_delegate(FUNC( aha1542_device::aha1542_r ), this),
- write8_delegate(FUNC( aha1542_device::aha1542_w ), this) );
-}
-
-
-void aha1542_device::device_reset()
-{
-}
diff --git a/src/devices/bus/isa/aha1542.h b/src/devices/bus/isa/aha1542.h
deleted file mode 100644
index cc84c2ea55b..00000000000
--- a/src/devices/bus/isa/aha1542.h
+++ /dev/null
@@ -1,54 +0,0 @@
-// license:BSD-3-Clause
-// copyright-holders:Darkstar
-/**********************************************************************
- *
- * Adaptec AHA-1542{,C,CF} SCSI Controller
- *
- **********************************************************************
-
-
-
- **********************************************************************/
-
-#ifndef MAME_BUS_AHA1542_H
-#define MAME_BUS_AHA1542_H
-
-#pragma once
-
-
-#include "isa.h"
-
-//*********************************************************************
-// TYPE DEFINITIONS
-//*********************************************************************
-
-// ====================> aha1542_device
-
-class aha1542_device : public device_t,
- public device_isa16_card_interface
-{
-public:
- static constexpr feature_type unemulated_features() { return feature::DISK; }
- // construction/destruction
- aha1542_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
-
- DECLARE_READ8_MEMBER( aha1542_r );
- DECLARE_WRITE8_MEMBER( aha1542_w );
-
-protected:
- // device-level overrides
- virtual void device_start() override;
- virtual void device_reset() override;
-
- // optional information overrides
- virtual const tiny_rom_entry *device_rom_region() const override;
- virtual void device_add_mconfig(machine_config &config) override;
-
-private:
- void z84c0010_mem(address_map &map);
-};
-
-// device type definition
-DECLARE_DEVICE_TYPE(AHA1542, aha1542_device)
-
-#endif // MAME_BUS_AHA1542_H
diff --git a/src/devices/bus/isa/aha1542b.cpp b/src/devices/bus/isa/aha1542b.cpp
new file mode 100644
index 00000000000..e0073cbbd68
--- /dev/null
+++ b/src/devices/bus/isa/aha1542b.cpp
@@ -0,0 +1,126 @@
+// license:BSD-3-Clause
+// copyright-holders:AJR
+/***************************************************************************
+
+ Adaptec AHA-1540/42A and AHA-1540/42B SCSI controllers
+
+ The alternate BIOSes using port 334h instead of 330h are provided due
+ to certain MIDI cards requiring the 330h port.
+
+***************************************************************************/
+
+#include "emu.h"
+#include "aha1542b.h"
+
+#include "cpu/i8085/i8085.h"
+#include "machine/aic6250.h"
+#include "machine/nscsi_bus.h"
+#include "machine/nscsi_hd.h"
+
+
+DEFINE_DEVICE_TYPE(AHA1542A, aha1542a_device, "aha1542a", "AHA-1542A SCSI Controller")
+DEFINE_DEVICE_TYPE(AHA1542B, aha1542b_device, "aha1542b", "AHA-1542B SCSI Controller")
+
+
+aha154x_device::aha154x_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock)
+ : device_t(mconfig, type, tag, owner, clock)
+ , device_isa16_card_interface(mconfig, *this)
+ , m_fdc(*this, "fdc")
+ , m_bios(*this, "bios")
+{
+}
+
+aha1542a_device::aha1542a_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
+ : aha154x_device(mconfig, AHA1542A, tag, owner, clock)
+{
+}
+
+aha1542b_device::aha1542b_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
+ : aha154x_device(mconfig, AHA1542B, tag, owner, clock)
+{
+}
+
+void aha154x_device::device_start()
+{
+}
+
+void aha154x_device::i8085_map(address_map &map)
+{
+ map(0x0000, 0x3fff).rom().region("mcode", 0);
+ map(0x8000, 0x800f).m("scsi:7:scsic", FUNC(aic6250_device::map));
+ map(0xe000, 0xe7ff).ram();
+}
+
+static void aha154x_scsi_devices(device_slot_interface &device)
+{
+ device.option_add("harddisk", NSCSI_HARDDISK);
+ device.option_add_internal("scsic", AIC6250);
+}
+
+void aha154x_device::scsic_config(device_t *device)
+{
+ device->set_clock(20'000'000);
+ downcast<aic6250_device &>(*device).int_cb().set_inputline("^^localcpu", I8085_RST65_LINE);
+}
+
+void aha154x_device::device_add_mconfig(machine_config &config)
+{
+ i8085a_cpu_device &localcpu(I8085A(config, "localcpu", 10'000'000));
+ localcpu.set_addrmap(AS_PROGRAM, &aha154x_device::i8085_map);
+
+ NSCSI_BUS(config, "scsi");
+ NSCSI_CONNECTOR(config, "scsi:0", aha154x_scsi_devices, nullptr);
+ NSCSI_CONNECTOR(config, "scsi:1", aha154x_scsi_devices, nullptr);
+ NSCSI_CONNECTOR(config, "scsi:2", aha154x_scsi_devices, nullptr);
+ NSCSI_CONNECTOR(config, "scsi:3", aha154x_scsi_devices, nullptr);
+ NSCSI_CONNECTOR(config, "scsi:4", aha154x_scsi_devices, nullptr);
+ NSCSI_CONNECTOR(config, "scsi:5", aha154x_scsi_devices, nullptr);
+ NSCSI_CONNECTOR(config, "scsi:6", aha154x_scsi_devices, nullptr);
+ NSCSI_CONNECTOR(config, "scsi:7", aha154x_scsi_devices, "scsic", true)
+ .set_option_machine_config("scsic", [this] (device_t *device) { scsic_config(device); });
+
+ DP8473(config, m_fdc, 24_MHz_XTAL);
+}
+
+
+ROM_START(aha1542a)
+ ROM_REGION(0x4000, "bios", 0)
+ ROM_LOAD("b_9700.bin", 0x0000, 0x4000, CRC(35f546e9) SHA1(f559b08f52044f53836021a83f56f628e32216bd))
+
+ ROM_REGION(0x4000, "mcode", 0)
+ ROM_LOAD("m_e7bc.bin", 0x0000, 0x4000, CRC(985b7a31) SHA1(bba0d84fa1b67ea71905953c25201fa2020cf465))
+ROM_END
+
+ROM_START(aha1542b)
+ ROM_REGION(0x4000, "bios", 0)
+ ROM_SYSTEM_BIOS(0, "v310", "AT/SCSI BIOS Version 3.10")
+ ROMX_LOAD("adaptec_inc_420412-00_b_bios_bc00_1990.bin", 0x0000, 0x4000, CRC(bd3f74e7) SHA1(c38d82fd50e5439812fa093e0d4f5fd136c63844), ROM_BIOS(0))
+ ROM_SYSTEM_BIOS(1, "v310a", "AT/SCSI BIOS Version 3.10A (port 334h)")
+ ROMX_LOAD("154xp334.bin", 0x0000, 0x4000, CRC(4911f232) SHA1(2e24ce380c6f7694c45484019857cb919e2a9965), ROM_BIOS(1))
+ ROM_SYSTEM_BIOS(2, "v311", "AT/SCSI BIOS Version 3.11")
+ ROMX_LOAD("bios_c900.u13", 0x0000, 0x4000, CRC(4660d0c1) SHA1(a581291de96836b6f6cc0b6244b8fa1ee333346a), ROM_BIOS(2))
+ ROM_SYSTEM_BIOS(3, "v320g", "AT/SCSI BIOS Version 3.20 (> 1 GB support)")
+ ROMX_LOAD("b_bd00.bin", 0x0000, 0x4000, CRC(2387197b) SHA1(703e1fe1ba924c02d617ac37ec7a20e12bef1cc7), ROM_BIOS(3))
+ ROM_SYSTEM_BIOS(4, "v320gt", "AT/SCSI BIOS Version 3.20 (extended timeout)")
+ ROMX_LOAD("b_b300.bin", 0x0000, 0x4000, CRC(4c5b07d8) SHA1(692e824f916f55519c9905839f5f6609f5e8c0a5), ROM_BIOS(4))
+ ROM_SYSTEM_BIOS(5, "v320a", "AT/SCSI BIOS Version 3.20Alt (port 334h)")
+ ROMX_LOAD("b_ac00.bin", 0x0000, 0x4000, CRC(becd6d08) SHA1(b5e7cbdeb241c1ff57602291e87c58ac0ee72d54), ROM_BIOS(5))
+
+ ROM_REGION(0x4000, "mcode", 0)
+ ROMX_LOAD("adaptec_inc_434108-00_a_mcode_fc8a_1990.bin", 0x0000, 0x4000, CRC(6801f89e) SHA1(33d36bc93734105b950414e7c433a283032838e9), ROM_BIOS(0))
+ ROMX_LOAD("adaptec_inc_434108-00_a_mcode_fc8a_1990.bin", 0x0000, 0x4000, CRC(6801f89e) SHA1(33d36bc93734105b950414e7c433a283032838e9), ROM_BIOS(1)) // assumed compatible with v310a BIOS
+ ROMX_LOAD("firmware_62d3.u12", 0x0000, 0x4000, CRC(6056ca33) SHA1(8dd4aaffcb107dbcc85ac87d878fa6093b904a20), ROM_BIOS(2))
+ ROMX_LOAD("m_3054.bin", 0x0000, 0x4000, CRC(461b1885) SHA1(50dc49b0fd88b116b83e3c71f58c758b618d1ddf), ROM_BIOS(3))
+ ROMX_LOAD("m_5d98.bin", 0x0000, 0x4000, CRC(f7d51536) SHA1(5ad1bb4bde3e8c30380b05d32ac273c781ab12a8), ROM_BIOS(4)) // also provided with v320g BIOS
+ ROMX_LOAD("m_3054.bin", 0x0000, 0x4000, CRC(461b1885) SHA1(50dc49b0fd88b116b83e3c71f58c758b618d1ddf), ROM_BIOS(5))
+ROM_END
+
+const tiny_rom_entry *aha1542a_device::device_rom_region() const
+{
+ return ROM_NAME(aha1542a);
+}
+
+const tiny_rom_entry *aha1542b_device::device_rom_region() const
+{
+ return ROM_NAME(aha1542b);
+}
diff --git a/src/devices/bus/isa/aha1542b.h b/src/devices/bus/isa/aha1542b.h
new file mode 100644
index 00000000000..95e379cb137
--- /dev/null
+++ b/src/devices/bus/isa/aha1542b.h
@@ -0,0 +1,57 @@
+// license:BSD-3-Clause
+// copyright-holders:AJR
+/***************************************************************************
+
+ Adaptec AHA-1540/42A and AHA-1540/42B SCSI controllers
+
+***************************************************************************/
+
+#ifndef MAME_BUS_ISA_AHA1542B_H
+#define MAME_BUS_ISA_AHA1542B_H
+
+#pragma once
+
+#include "isa.h"
+#include "machine/upd765.h"
+
+class aha154x_device : public device_t, public device_isa16_card_interface
+{
+protected:
+ aha154x_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock);
+
+ virtual void device_start() override;
+ virtual void device_add_mconfig(machine_config &config) override;
+
+ void i8085_map(address_map &map);
+ void scsic_config(device_t *device);
+
+ required_device<upd765_family_device> m_fdc;
+ required_region_ptr<u8> m_bios;
+};
+
+class aha1542a_device : public aha154x_device
+{
+public:
+ aha1542a_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
+
+ static constexpr feature_type unemulated_features() { return feature::DISK; }
+
+protected:
+ virtual const tiny_rom_entry *device_rom_region() const override;
+};
+
+class aha1542b_device : public aha154x_device
+{
+public:
+ aha1542b_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
+
+ static constexpr feature_type unemulated_features() { return feature::DISK; }
+
+protected:
+ virtual const tiny_rom_entry *device_rom_region() const override;
+};
+
+DECLARE_DEVICE_TYPE(AHA1542A, aha1542a_device)
+DECLARE_DEVICE_TYPE(AHA1542B, aha1542b_device)
+
+#endif // MAME_BUS_ISA_AHA1542B_H
diff --git a/src/devices/bus/isa/aha1542c.cpp b/src/devices/bus/isa/aha1542c.cpp
new file mode 100644
index 00000000000..efb8181061c
--- /dev/null
+++ b/src/devices/bus/isa/aha1542c.cpp
@@ -0,0 +1,323 @@
+// license:BSD-3-Clause
+// copyright-holders:Darkstar
+/**********************************************************************
+ *
+ * Adaptec AHA-1542{C,CF,CP} SCSI Controller
+ *
+ **********************************************************************/
+
+/*
+Hardware info by Guru
+
+Adaptec 1993
+
+PCB Layout
+----------
+
+Adaptec AHA-1542CF/1542CF
+FCC ID: FGT1542CF
+FAB 545107-00 REV C
+ASSY 545106-00
+
+|-------|---------------|---|-------------------|--|
+| J1 | FLOPPY34 | | SCSI50 | |
+| |---------------| |-------------------| |
+| S1 DS1 |
+| |
+| |------| DS2107AS DS2107AS |--|
+| |PC8477| 24MHz Z84C0010 | |
+| PAL |BV-1 | |S |
+| | | |----------| | |
+| |------| | | |C |
+| 93C46.U11 20MHz | | | |
+| UM6264 MCODE.U15 |ADAPTEC | |S |
+| |AIC-7970Q | | |
+| BIOS.U16 | | |I |
+| | | | |
+| |----------| |--|
+| |
+|-| |--| |----|
+ |--------------| |-------------------------|
+
+Notes:
+ J1 - 4-position header for drive activity external LED connection
+ S1 - 8-position DIP Switch (See Table A)
+ PC8477BV-1 - National Semiconductor PC8477BV-1 'SuperFDC' Advanced Floppy Disk Controller (PLCC68)
+ This is software compatible with NEC uPD765 and pin compatible with Intel 82077AA
+ Labelled "AHA-1542CF/552800-01 F/9513"
+ Clock input 24.000MHz
+ SCSI - 50-pin Centronics style external SCSI connector (DDK 57AE-40500-21D)
+ Z84C0010 - Zilog Z84C0010VEC Z80 CPU. Clock input 20/2 [10.000MHz] sourced from AIC-7970Q (PLCC44)
+ 93C46.U11 - Atmel 93C46 128b x8-bit / 64b x16-bit (1kB) EEPROM labelled '545120A' (SOIC8)
+ 6264 - Unicorn Microelectronics UM6264BM-10L 8k x8-bit Static RAM (SOJ28)
+ MCODE.U15 - ST Microelectronics M27C256B 32k x8-bit EPROM labelled 'ADAPTEC INC 553801-00 E MCODE 4B81' (DIP28)
+ BIOS.U16 - ST Microelectronics M27C256B 32k x8-bit EPROM labelled 'ADAPTEC INC 553601-00 E BIOS 7600' (DIP28)
+ BIOS 0x7600h is revision 2.10
+ PAL - AMD PALCE16V8H-15JC/4 PAL (SOJ20)
+ AIC-7970Q - Adaptec AIC-7970Q Fast SCSI Controller IC. Clock input 20.000MHz (QFP144)
+ DS2107AS - Dallas DS2107AS SCSI Active Terminator (SOIC16)
+ DS1 - Internal Drive Activity LED
+ SCSI50 - 50-pin Right Angled Flat Cable Connector With Support For Up To 7 SCSI Drives
+ FLOPPY34 - 34-pin Right Angled Flat Cable Connector With Support For Up To 2 Floppy Drives (360kb,720kb,1.2MB,1.44MB)
+
+
+Table A - S1 DIP Switch Description
+-----------------------------------
+
+Default: All DIP Switches OFF (i.e. Settings changed via BIOS and saved in EEPROM)
+Software Defaults = *
+----------------------+-----+-----+-----+-----+-----+-----+-----+-----+
+ | SW1 | SW2 | SW3 | SW4 | SW5 | SW6 | SW7 | SW8 |
+----------------------|-----+-----+-----+-----+-----+-----+-----+-----+
+Termination Enabled | ON | | | | | | | |
+ Set In BIOS*| OFF | | | | | | | |
+----------------------+-----+-----+-----+-----+ | | | |
+I/O Port 330H*| | OFF | OFF | OFF | | | | |
+ 334H | | ON | OFF | OFF | | | | |
+ 230H | | OFF | ON | OFF | | | | |
+ 234H | | ON | ON | OFF | | | | |
+ 130H | | OFF | OFF | ON | | | | |
+ 134H | | ON | OFF | ON | | | | |
+ Reserved | | OFF | ON | ON | | | | |
+ Reserved | | ON | ON | ON | | | | |
+----------------------+-----+-----+-----+-----+-----+ | | |
+Enable Floppy Yes*| | OFF | | | |
+ No | | ON | | | |
+----------------------+-----------------------+-----+-----+-----+-----+
+BIOS Address DC000H*| | OFF | OFF | OFF |
+ D8000H | | ON | OFF | OFF |
+ D4000H | | OFF | ON | OFF |
+ D0000H | | ON | ON | OFF |
+ CC000H | | OFF | OFF | ON |
+ C8000H | | ON | OFF | ON |
+ Reserved | | OFF | ON | ON |
+ BIOS Disabled | | ON | ON | ON |
+----------------------+-----------------------------+-----+-----+-----+
+
+Documentation:
+Adaptec AHA-1540CF/1542CF Installation Guide
+http://download.adaptec.com/pdfs/installation_guides/aha1540cf_ig.pdf
+ */
+
+#include "emu.h"
+#include "aha1542c.h"
+#include "cpu/z80/z80.h"
+
+// I/O Port interface
+// READ Port x+0: STATUS
+// WRITE Port x+0: CONTROL
+//
+// READ Port x+1: DATA
+// WRITE Port x+1: COMMAND
+//
+// READ Port x+2: INTERRUPT STATUS
+// WRITE Port x+2: (undefined?)
+//
+// R/W Port x+3: (undefined)
+
+// READ STATUS flags
+#define STAT_STST 0x80 // self-test in progress
+#define STAT_DIAGF 0x40 // internal diagnostic failure
+#define STAT_INIT 0x20 // mailbox initialization required
+#define STAT_IDLE 0x10 // HBA is idle
+#define STAT_CDFULL 0x08 // Command/Data output port is full
+#define STAT_DFULL 0x04 // Data input port is full
+#define STAT_INVCMD 0x01 // Invalid command
+
+// READ INTERRUPT STATUS flags
+#define INTR_ANY 0x80 // any interrupt
+#define INTR_SRCD 0x08 // SCSI reset detected
+#define INTR_HACC 0x04 // HA command complete
+#define INTR_MBOA 0x02 // MBO empty
+#define INTR_MBIF 0x01 // MBI full
+
+// WRITE CONTROL commands
+#define CTRL_HRST 0x80 // Hard reset
+#define CTRL_SRST 0x40 // Soft reset
+#define CTRL_IRST 0x20 // interrupt reset
+#define CTRL_SCRST 0x10 // SCSI bus reset
+
+// READ/WRITE DATA commands
+#define CMD_NOP 0x00 // No operation
+#define CMD_MBINIT 0x01 // mailbox initialization
+#define CMD_START_SCSI 0x02 // Start SCSI command
+#define CMD_BIOSCMD 0x03 // undocumented BIOS conmmand (shadow RAM etc.)
+#define CMD_INQUIRY 0x04 // Adapter inquiry
+#define CMD_EMBOI 0x05 // enable Mailbox Out Interrupt
+#define CMD_SELTIMEOUT 0x06 // Set SEL timeout
+#define CMD_BUSON_TIME 0x07 // set bus-On time
+#define CMD_BUSOFF_TIME 0x08 // set bus-off time
+#define CMD_DMASPEED 0x09 // set ISA DMA speed
+#define CMD_RETDEVS 0x0a // return installed devices
+#define CMD_RETCONF 0x0b // return configuration data
+#define CMD_TARGET 0x0c // set HBA to target mode
+#define CMD_RETSETUP 0x0d // return setup data
+#define CMD_ECHO 0x1f // ECHO command data (NetBSD says it is 0x1e)
+
+// these are for 1541C only:
+#define CMD_RETDEVSHI 0x23 // return devices 8-15 (from NetBSD)
+#define CMD_EXTBIOS 0x28 // return extended BIOS information
+#define CMD_MBENABLE 0x29 // set mailbox interface enable
+
+DEFINE_DEVICE_TYPE(AHA1542C, aha1542c_device, "aha1542c", "AHA-1542C SCSI Controller")
+DEFINE_DEVICE_TYPE(AHA1542CF, aha1542cf_device, "aha1542cf", "AHA-1542CF SCSI Controller")
+DEFINE_DEVICE_TYPE(AHA1542CP, aha1542cp_device, "aha1542cp", "AHA-1542CP SCSI Controller")
+
+#define Z84C0010_TAG "z84c0010"
+
+READ8_MEMBER( aha1542c_device::aha1542_r )
+{
+ logerror("%s aha1542_r(): offset=%d\n", machine().describe_context(), offset);
+ return 0xff;
+}
+
+WRITE8_MEMBER( aha1542c_device::aha1542_w )
+{
+ logerror("%s aha1542_w(): offset=%d data=0x%02x\n", machine().describe_context(), offset, data);
+}
+
+
+ROM_START( aha1542c )
+ ROM_REGION( 0x8000, "aha1542", 0 )
+ ROM_SYSTEM_BIOS( 0, "v101", "AHA-1540C/1542C BIOS v1.01" )
+ ROMX_LOAD( "adaptec_inc_534201-00_d_bios_144c_1993.u15", 0x0000, 0x8000, CRC(35178004) SHA1(2b38f2e40cd02a1b32966ead7b202b0fca130cb8), ROM_BIOS(0) )
+ ROM_SYSTEM_BIOS( 1, "v102", "AHA-1540C/1542C BIOS v1.02" )
+ ROMX_LOAD( "b_91c5.bin", 0x0000, 0x8000, CRC(076ac252) SHA1(d640b980e85d07029d8ce11a52fa26ba0f93c5de), ROM_BIOS(1) )
+
+ ROM_REGION( 0x8000, Z84C0010_TAG, 0 )
+ ROMX_LOAD( "adaptec_inc_534001-00_d_mcode_a3c2_1993.u5", 0x0000, 0x8000, CRC(220dd5a2) SHA1(4fc51c9dd63b45a50edcd56baa706d61decbef38), ROM_BIOS(0) )
+ ROMX_LOAD( "m_866a.bin", 0x0000, 0x8000, CRC(ef09053a) SHA1(ae7900653357d5f32a2734bc13d9ec63bd805597), ROM_BIOS(1) )
+ROM_END
+
+ROM_START( aha1542cf )
+ ROM_REGION( 0x8000, "aha1542", 0 )
+ ROM_SYSTEM_BIOS( 0, "v201", "Adaptec 1540CF/1542CF BIOS v2.01" )
+ ROMX_LOAD( "adaptec_inc_553601-00_c_bios_c38d_1993.u16", 0x0000, 0x8000, CRC(ab22fc02) SHA1(f9f783e0272fc14ba3de32316997f1f6cadc67d0), ROM_BIOS(0) )
+ ROM_SYSTEM_BIOS( 1, "v210", "Adaptec 1540CF/1542CF BIOS v2.10" )
+ ROMX_LOAD( "adaptec_inc_553601-00_e_bios_7600_1994.u16", 0x0000, 0x8000, CRC(8f3a2692) SHA1(b9dbd49baeec55098195131d0ed1a9bfe8463640), ROM_BIOS(1) )
+ ROM_SYSTEM_BIOS( 2, "v211", "Adaptec 1540CF/1542CF BIOS v2.11" )
+ ROMX_LOAD( "adaptec_inc_553601-00_g_bios_b402_1995.u16", 0x0000, 0x8000, CRC(fddd0b83) SHA1(aabd227cb338d8812e0bb5c17c08ea06c5aedd36), ROM_BIOS(2) )
+
+ ROM_REGION( 0x8000, Z84C0010_TAG, 0 )
+ ROMX_LOAD( "adaptec_inc_553801-00_c_mcode_563d_1993.u15", 0x0000, 0x8000, CRC(7824397e) SHA1(35bc2c8fab31aad3190a478f2dc8f3a72958cf04), ROM_BIOS(0) )
+ ROMX_LOAD( "adaptec_inc_553801-00_e_mcode_4b81_1994.u15", 0x0000, 0x8000, CRC(dd651476) SHA1(cda508281302be53ebdcf8daa61754c89ad12111), ROM_BIOS(1) )
+ ROMX_LOAD( "adaptec_inc_553801-00_g_mcode_2cde_1995.u15", 0x0000, 0x8000, CRC(896873cd) SHA1(6edbdd9b0b15ef31ca0741cac31556d2d5266b6e), ROM_BIOS(2) )
+ROM_END
+
+ROM_START( aha1542cp )
+ ROM_REGION( 0x8000, "aha1542", 0 )
+ ROM_LOAD( "adaptec_inc_908501-00_d_bios_a91e_1995.u7", 0x0000, 0x8000, CRC(0646c35e) SHA1(3a7c2731abd8295438cfa1f2a525be53e9512b1a) )
+
+ ROM_REGION( 0x8000, Z84C0010_TAG, 0 )
+ ROM_LOAD( "908301-00_f_mcode_17c9.u12", 0x0000, 0x8000, CRC(04494022) SHA1(431dfc26312556ddd24fccc429b2b3e93bac5c2f) )
+ROM_END
+
+
+u8 aha1542c_device::local_status_r()
+{
+ return m_eeprom->do_read() << 7;
+}
+
+void aha1542c_device::local_latch_w(u8 data)
+{
+ m_eeprom->cs_write(BIT(data, 2));
+ m_eeprom->clk_write(BIT(data, 1));
+ m_eeprom->di_write(BIT(data, 0));
+ // TODO: several other bits are used
+}
+
+void aha1542c_device::z84c0010_mem(address_map &map)
+{
+ map(0x0000, 0x7fff).rom().region(Z84C0010_TAG, 0);
+ map(0x8000, 0x9fff).ram(); // 2kb RAM chip
+ map(0xa000, 0xa000).r(FUNC(aha1542c_device::local_status_r));
+ map(0xb000, 0xb000).w(FUNC(aha1542c_device::local_latch_w));
+ map(0xe000, 0xe0ff).ram(); // probably PC<->Z80 communication area
+ map(0xe003, 0xe003).lr8("e003_r", []() { return 0x20; });
+}
+
+u8 aha1542cp_device::eeprom_r()
+{
+ return m_eeprom->do_read();
+}
+
+void aha1542cp_device::eeprom_w(u8 data)
+{
+ m_eeprom->cs_write(BIT(data, 2));
+ m_eeprom->clk_write(BIT(data, 1));
+ m_eeprom->di_write(BIT(data, 0));
+}
+
+void aha1542cp_device::local_mem(address_map &map)
+{
+ map(0x0000, 0x7fff).rom().region(Z84C0010_TAG, 0);
+ map(0x8000, 0x9fff).ram();
+ map(0xc001, 0xc001).rw(FUNC(aha1542cp_device::eeprom_r), FUNC(aha1542cp_device::eeprom_w));
+ map(0xe003, 0xe003).nopr();
+}
+
+const tiny_rom_entry *aha1542c_device::device_rom_region() const
+{
+ return ROM_NAME( aha1542c );
+}
+
+const tiny_rom_entry *aha1542cf_device::device_rom_region() const
+{
+ return ROM_NAME( aha1542cf );
+}
+
+const tiny_rom_entry *aha1542cp_device::device_rom_region() const
+{
+ return ROM_NAME( aha1542cp );
+}
+
+void aha1542c_device::device_add_mconfig(machine_config &config)
+{
+ z80_device &cpu(Z80(config, Z84C0010_TAG, 10'000'000));
+ cpu.set_addrmap(AS_PROGRAM, &aha1542c_device::z84c0010_mem);
+
+ EEPROM_93C46_16BIT(config, m_eeprom);
+}
+
+void aha1542cp_device::device_add_mconfig(machine_config &config)
+{
+ z80_device &cpu(Z80(config, Z84C0010_TAG, 10'000'000));
+ cpu.set_addrmap(AS_PROGRAM, &aha1542cp_device::local_mem);
+
+ EEPROM_93C46_16BIT(config, m_eeprom);
+}
+
+aha1542c_device::aha1542c_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock)
+ : device_t(mconfig, type, tag, owner, clock)
+ , device_isa16_card_interface(mconfig, *this)
+ , m_eeprom(*this, "eeprom")
+{
+}
+
+aha1542c_device::aha1542c_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
+ : aha1542c_device(mconfig, AHA1542C, tag, owner, clock)
+{
+}
+
+aha1542cf_device::aha1542cf_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
+ : aha1542c_device(mconfig, AHA1542CF, tag, owner, clock)
+{
+}
+
+aha1542cp_device::aha1542cp_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
+ : aha1542c_device(mconfig, AHA1542CP, tag, owner, clock)
+{
+}
+
+void aha1542c_device::device_start()
+{
+ set_isa_device();
+ m_isa->install_rom(this, 0xdc000, 0xdffff, "aha1542", "aha1542");
+ m_isa->install_device(0x330, 0x333, read8_delegate(FUNC( aha1542cf_device::aha1542_r ), this),
+ write8_delegate(FUNC( aha1542cf_device::aha1542_w ), this) );
+}
+
+
+void aha1542c_device::device_reset()
+{
+}
diff --git a/src/devices/bus/isa/aha1542c.h b/src/devices/bus/isa/aha1542c.h
new file mode 100644
index 00000000000..2294096bde7
--- /dev/null
+++ b/src/devices/bus/isa/aha1542c.h
@@ -0,0 +1,95 @@
+// license:BSD-3-Clause
+// copyright-holders:Darkstar
+/**********************************************************************
+ *
+ * Adaptec AHA-1542{C,CF,CP} SCSI Controller
+ *
+ **********************************************************************
+
+
+
+ **********************************************************************/
+
+#ifndef MAME_BUS_AHA1542C_H
+#define MAME_BUS_AHA1542C_H
+
+#pragma once
+
+
+#include "isa.h"
+#include "machine/eepromser.h"
+
+//*********************************************************************
+// TYPE DEFINITIONS
+//*********************************************************************
+
+// ====================> aha1542cf_device
+
+class aha1542c_device : public device_t,
+ public device_isa16_card_interface
+{
+public:
+ static constexpr feature_type unemulated_features() { return feature::DISK; }
+ // construction/destruction
+ aha1542c_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
+
+ DECLARE_READ8_MEMBER( aha1542_r );
+ DECLARE_WRITE8_MEMBER( aha1542_w );
+
+protected:
+ aha1542c_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock);
+
+ u8 local_status_r();
+ void local_latch_w(u8 data);
+
+ // device-level overrides
+ virtual void device_start() override;
+ virtual void device_reset() override;
+
+ // optional information overrides
+ virtual const tiny_rom_entry *device_rom_region() const override;
+ virtual void device_add_mconfig(machine_config &config) override;
+
+ required_device<eeprom_serial_93cxx_device> m_eeprom;
+
+private:
+ void z84c0010_mem(address_map &map);
+};
+
+// ====================> aha1542cf_device
+
+class aha1542cf_device : public aha1542c_device
+{
+public:
+ // construction/destruction
+ aha1542cf_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
+
+protected:
+ virtual const tiny_rom_entry *device_rom_region() const override;
+};
+
+// ====================> aha1542cp_device
+
+class aha1542cp_device : public aha1542c_device
+{
+public:
+ // construction/destruction
+ aha1542cp_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
+
+protected:
+ virtual void device_add_mconfig(machine_config &config) override;
+ virtual const tiny_rom_entry *device_rom_region() const override;
+
+private:
+ u8 eeprom_r();
+ void eeprom_w(u8 data);
+
+ void local_mem(address_map &map);
+};
+
+// device type definitions
+DECLARE_DEVICE_TYPE(AHA1542C, aha1542c_device)
+DECLARE_DEVICE_TYPE(AHA1542CF, aha1542cf_device)
+DECLARE_DEVICE_TYPE(AHA1542CP, aha1542cp_device)
+
+#endif // MAME_BUS_AHA1542C_H
diff --git a/src/devices/bus/isa/aha174x.cpp b/src/devices/bus/isa/aha174x.cpp
new file mode 100644
index 00000000000..06b6ddf5f62
--- /dev/null
+++ b/src/devices/bus/isa/aha174x.cpp
@@ -0,0 +1,160 @@
+// license:BSD-3-Clause
+// copyright-holders:AJR
+/***************************************************************************
+
+ Adaptec AHA-1740/44 and AHA-1740A/42A Fast SCSI host adapters
+
+ These are actually EISA cards, though they also have a compatibility
+ mode that provides an interface like the older ISA AHA-154X series.
+
+ On the AHA-1740 and AHA-1744, the HPC microcode is stored in an EEPROM
+ (of unknown type), allowing it to be reprogrammed by the host. This is
+ not possible on the AHA-1740A and AHA-1744A, which use a conventional
+ 27C256 EPROM for the microcode. In both cases the HPC copies the code
+ to and then executes it out of RAM.
+
+ Though the AHA-1740 and AHA-1740A have different board layouts, they
+ share the following ICs:
+
+ AIC-565 Bus Auxiliary Interface Chip
+ AIC-575 EISA Configuration Chip
+ AIC-4600 HPC (HPC46003V20)
+ AIC-6251A SCSI Interface and Protocol Chip
+ IDT7201 512x9 FIFO (2 on board)
+ Intel 82355 Bus Master Interface Controller
+
+ AHA-1742A is the same as AHA-1740A, only with the FDC populated.
+
+ AHA-1744 uses the same layout as AHA-1740, but populates the area
+ around the SCSI port with DS36F95J differential drivers.
+
+***************************************************************************/
+
+#include "emu.h"
+#include "aha174x.h"
+
+#include "machine/aic6250.h"
+//#include "machine/i82355.h"
+#include "machine/nscsi_bus.h"
+#include "machine/nscsi_hd.h"
+
+DEFINE_DEVICE_TYPE(AHA1740, aha1740_device, "aha1740", "AHA-1740 Fast SCSI Host Adapter")
+DEFINE_DEVICE_TYPE(AHA1742A, aha1742a_device, "aha1742a", "AHA-1742A Fast SCSI Host Adapter")
+
+
+aha174x_device::aha174x_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock)
+ : device_t(mconfig, type, tag, owner, clock)
+ , device_isa16_card_interface(mconfig, *this)
+ , m_hpc(*this, "hpc")
+ , m_bios(*this, "bios")
+{
+}
+
+aha1740_device::aha1740_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
+ : aha174x_device(mconfig, AHA1740, tag, owner, clock)
+{
+}
+
+aha1742a_device::aha1742a_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
+ : aha174x_device(mconfig, AHA1742A, tag, owner, clock)
+ , m_fdc(*this, "fdc")
+{
+}
+
+void aha174x_device::device_start()
+{
+}
+
+
+void aha174x_device::hpc_map(address_map &map)
+{
+ map(0x5000, 0x500f).m("scsi:7:scsic", FUNC(aic6251a_device::map));
+ map(0x8000, 0xffff).rom().region("mcode", 0);
+}
+
+static void aha174x_scsi_devices(device_slot_interface &device)
+{
+ device.option_add("harddisk", NSCSI_HARDDISK);
+ device.option_add_internal("scsic", AIC6251A);
+}
+
+void aha174x_device::scsic_config(device_t *device)
+{
+ device->set_clock(40_MHz_XTAL / 2); // divider not verified
+}
+
+void aha1740_device::device_add_mconfig(machine_config &config)
+{
+ HPC46003(config, m_hpc, 40_MHz_XTAL / 2);
+ m_hpc->set_addrmap(AS_PROGRAM, &aha1740_device::hpc_map);
+
+ NSCSI_BUS(config, "scsi");
+ NSCSI_CONNECTOR(config, "scsi:0", aha174x_scsi_devices, nullptr);
+ NSCSI_CONNECTOR(config, "scsi:1", aha174x_scsi_devices, nullptr);
+ NSCSI_CONNECTOR(config, "scsi:2", aha174x_scsi_devices, nullptr);
+ NSCSI_CONNECTOR(config, "scsi:3", aha174x_scsi_devices, nullptr);
+ NSCSI_CONNECTOR(config, "scsi:4", aha174x_scsi_devices, nullptr);
+ NSCSI_CONNECTOR(config, "scsi:5", aha174x_scsi_devices, nullptr);
+ NSCSI_CONNECTOR(config, "scsi:6", aha174x_scsi_devices, nullptr);
+ NSCSI_CONNECTOR(config, "scsi:7", aha174x_scsi_devices, "scsic", true)
+ .set_option_machine_config("scsic", [this] (device_t *device) { scsic_config(device); });
+}
+
+void aha1742a_device::device_add_mconfig(machine_config &config)
+{
+ HPC46003(config, m_hpc, 40_MHz_XTAL / 2);
+ m_hpc->set_addrmap(AS_PROGRAM, &aha1742a_device::hpc_map);
+
+ NSCSI_BUS(config, "scsi");
+ NSCSI_CONNECTOR(config, "scsi:0", aha174x_scsi_devices, nullptr);
+ NSCSI_CONNECTOR(config, "scsi:1", aha174x_scsi_devices, nullptr);
+ NSCSI_CONNECTOR(config, "scsi:2", aha174x_scsi_devices, nullptr);
+ NSCSI_CONNECTOR(config, "scsi:3", aha174x_scsi_devices, nullptr);
+ NSCSI_CONNECTOR(config, "scsi:4", aha174x_scsi_devices, nullptr);
+ NSCSI_CONNECTOR(config, "scsi:5", aha174x_scsi_devices, nullptr);
+ NSCSI_CONNECTOR(config, "scsi:6", aha174x_scsi_devices, nullptr);
+ NSCSI_CONNECTOR(config, "scsi:7", aha174x_scsi_devices, "scsic", true)
+ .set_option_machine_config("scsic", [this] (device_t *device) { scsic_config(device); });
+
+ N82077AA(config, m_fdc, 24_MHz_XTAL);
+}
+
+
+ROM_START(aha1740)
+ ROM_REGION(0x4000, "bios", 0)
+ ROM_LOAD("b_dc00.bin", 0x0000, 0x4000, CRC(056d75ec) SHA1(8ca143adfc7d20ad5d49f14dedabc8276454bf9e))
+
+ ROM_REGION16_LE(0x8000, "mcode", 0)
+ ROM_SYSTEM_BIOS(0, "v140st", "BIOS v1.40 (Standard Mode)")
+ ROMX_LOAD("standard.bin", 0x0000, 0x8000, CRC(8c15c6a2) SHA1(77e15b0244e3a814f53f957270e6474a8a839955), ROM_BIOS(0))
+ ROM_SYSTEM_BIOS(1, "v140en", "BIOS v1.40 (Enhanced Mode)")
+ ROMX_LOAD("enhanced.bin", 0x0000, 0x8000, CRC(84b3df89) SHA1(a718c3ea5443a609b4b20bfe48be18193737ad25), ROM_BIOS(1))
+ // Adaptec's help file claims that "the EEPROM on the board can hold firmware for both modes simultaneously."
+ // The AHA-174XA firmware images obviously have this, but the files provided here do not agree.
+ROM_END
+
+ROM_START(aha1742a)
+ ROM_REGION(0x4000, "bios", 0)
+ ROM_DEFAULT_BIOS("v140")
+ ROM_SYSTEM_BIOS(0, "v134", "BIOS v1.34")
+ ROMX_LOAD("adaptec_inc_450214-00_a_bios_8800_1991.u47", 0x0000, 0x4000, CRC(6cf06151) SHA1(0da45634b12b33fc886920d065cc8ffb2cf376b8), ROM_BIOS(0))
+ ROM_SYSTEM_BIOS(1, "v140", "BIOS v1.40")
+ ROMX_LOAD("adaptec_inc_450216-00_a_bios_dc00_1992.u47", 0x0000, 0x4000, CRC(056d75ec) SHA1(8ca143adfc7d20ad5d49f14dedabc8276454bf9e), ROM_BIOS(1))
+ ROM_SYSTEM_BIOS(2, "v140s", "BIOS v1.40 (Extended Timeout)")
+ ROMX_LOAD("b_f100.bin", 0x0000, 0x4000, CRC(b695acc0) SHA1(683112fafdf83d5eb89237d9215f7d6eacc6eeaf), ROM_BIOS(2))
+
+ ROM_REGION16_LE(0x8000, "mcode", 0)
+ ROMX_LOAD("adaptec_inc_450117-00_c_mcode_23a8_1991.u10", 0x0000, 0x8000, NO_DUMP, ROM_BIOS(0))
+ ROMX_LOAD("adaptec_inc_450113-00_d_mcode_b7d6_1992.u10", 0x0000, 0x8000, CRC(0a55a555) SHA1(ff400f56b33f0ad94e34564d7715a0773b335844), ROM_BIOS(1))
+ ROMX_LOAD("m_c7b8.bin", 0x0000, 0x8000, CRC(21282e86) SHA1(18cb3960dc47f2c14beb88f9680c1f66c4652b04), ROM_BIOS(2))
+ROM_END
+
+const tiny_rom_entry *aha1740_device::device_rom_region() const
+{
+ return ROM_NAME(aha1740);
+}
+
+const tiny_rom_entry *aha1742a_device::device_rom_region() const
+{
+ return ROM_NAME(aha1742a);
+}
diff --git a/src/devices/bus/isa/aha174x.h b/src/devices/bus/isa/aha174x.h
new file mode 100644
index 00000000000..f65ee7de93a
--- /dev/null
+++ b/src/devices/bus/isa/aha174x.h
@@ -0,0 +1,61 @@
+// license:BSD-3-Clause
+// copyright-holders:AJR
+/***************************************************************************
+
+ Adaptec AHA-1540/42A and AHA-1540/42B SCSI controllers
+
+***************************************************************************/
+
+#ifndef MAME_BUS_ISA_AHA174X_H
+#define MAME_BUS_ISA_AHA174X_H
+
+#pragma once
+
+#include "isa.h"
+#include "cpu/hpc/hpc.h"
+#include "machine/upd765.h"
+
+class aha174x_device : public device_t, public device_isa16_card_interface
+{
+protected:
+ aha174x_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock);
+
+ virtual void device_start() override;
+
+ void hpc_map(address_map &map);
+ void scsic_config(device_t *device);
+
+ required_device<hpc46003_device> m_hpc;
+ required_region_ptr<u8> m_bios;
+};
+
+class aha1740_device : public aha174x_device
+{
+public:
+ aha1740_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
+
+ static constexpr feature_type unemulated_features() { return feature::DISK; }
+
+protected:
+ virtual void device_add_mconfig(machine_config &config) override;
+ virtual const tiny_rom_entry *device_rom_region() const override;
+};
+
+class aha1742a_device : public aha174x_device
+{
+public:
+ aha1742a_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
+
+ static constexpr feature_type unemulated_features() { return feature::DISK; }
+
+protected:
+ virtual void device_add_mconfig(machine_config &config) override;
+ virtual const tiny_rom_entry *device_rom_region() const override;
+
+ required_device<upd765_family_device> m_fdc;
+};
+
+DECLARE_DEVICE_TYPE(AHA1740, aha1740_device)
+DECLARE_DEVICE_TYPE(AHA1742A, aha1742a_device)
+
+#endif // MAME_BUS_ISA_AHA174X_H
diff --git a/src/devices/bus/isa/bt54x.cpp b/src/devices/bus/isa/bt54x.cpp
new file mode 100644
index 00000000000..d8ef31a848f
--- /dev/null
+++ b/src/devices/bus/isa/bt54x.cpp
@@ -0,0 +1,201 @@
+// license:BSD-3-Clause
+// copyright-holders:AJR
+/***************************************************************************
+
+ BusTek/BusLogic BT-54x series PC/AT SCSI host adapters
+
+ The earlier version of the BT-542B, with BusTek labels, has a NCR 86C05
+ bus controller where a later version has the 80C20 ASIC instead. It is
+ believed that these chips are largely compatible with each other, as
+ are the NCR 53CF94 and Emulex FAS216 SCSI controllers.
+
+ 2.41/2.21 is the last BIOS version compatible with revisions A-G of
+ the BT-542B.
+
+***************************************************************************/
+
+#include "emu.h"
+#include "bt54x.h"
+
+#include "machine/ncr5390.h"
+//#include "machine/ncr86c05.h"
+#include "machine/nscsi_cd.h"
+#include "machine/nscsi_hd.h"
+
+DEFINE_DEVICE_TYPE(BT542B, bt542b_device, "bt542b", "BusTek BT-542B SCSI Host Adapter") // Rev. G or earlier
+DEFINE_DEVICE_TYPE(BT542BH, bt542bh_device, "bt542bh", "BusLogic BT-542B SCSI Host Adapter (Rev. H)")
+DEFINE_DEVICE_TYPE(BT545S, bt545s_device, "bt545s", "BusLogic BT-545S Fast SCSI Host Adapter")
+
+bt54x_device::bt54x_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock)
+ : device_t(mconfig, type, tag, owner, clock)
+ , device_isa16_card_interface(mconfig, *this)
+ , m_mpu(*this, "mpu")
+ , m_fdc(*this, "fdc")
+ , m_bios(*this, "bios")
+{
+}
+
+bt542b_device::bt542b_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
+ : bt54x_device(mconfig, BT542B, tag, owner, clock)
+{
+}
+
+bt542bh_device::bt542bh_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
+ : bt54x_device(mconfig, BT542BH, tag, owner, clock)
+{
+}
+
+bt545s_device::bt545s_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
+ : bt54x_device(mconfig, BT545S, tag, owner, clock)
+{
+}
+
+void bt54x_device::device_start()
+{
+}
+
+u8 bt54x_device::local_status_r()
+{
+ return 0;
+}
+
+void bt54x_device::local_map(address_map &map)
+{
+ map(0x00000, 0x01fff).ram();
+ //map(0x02000, 0x0201f).rw("busintf", FUNC(ncr86c05_device::local_read), FUNC(ncr86c05_device::local_write));
+ map(0x02080, 0x0208f).m("scsi:7:scsic", FUNC(ncr53cf94_device::map));
+ map(0x02180, 0x02180).r(FUNC(bt54x_device::local_status_r));
+ map(0xf8000, 0xfffff).rom().region("mpu", 0);
+}
+
+static void scsi_devices(device_slot_interface &device)
+{
+ device.option_add("cdrom", NSCSI_CDROM);
+ device.option_add("harddisk", NSCSI_HARDDISK);
+ device.option_add_internal("scsic", NCR53C94);
+}
+
+static void fast_scsi_devices(device_slot_interface &device)
+{
+ device.option_add("cdrom", NSCSI_CDROM);
+ device.option_add("harddisk", NSCSI_HARDDISK);
+ device.option_add_internal("scsic", NCR53CF94); // FAS216
+}
+
+void bt54x_device::asc_config(device_t *device)
+{
+ ncr53c94_device &asc = downcast<ncr53c94_device &>(*device);
+
+ asc.set_clock(25_MHz_XTAL); // not verified; perhaps selectable? (40 MHz XTAL also on board)
+
+ asc.irq_handler_cb().set(m_mpu, FUNC(i80188_cpu_device::int0_w));
+ //asc.drq_handler_cb().set("busintf", FUNC(ncr86c05_device::dma_req_w));
+}
+
+void bt54x_device::fsc_config(device_t *device)
+{
+ ncr53cf94_device &fsc = downcast<ncr53cf94_device &>(*device);
+
+ fsc.set_clock(40_MHz_XTAL);
+
+ fsc.irq_handler_cb().set(m_mpu, FUNC(i80188_cpu_device::int0_w)); // mostly polled on BT-545S
+ //fsc.drq_handler_cb().set("busintf", FUNC(ncr86c05_device::dma_req_w));
+}
+
+void bt54x_device::fsc_base(machine_config &config)
+{
+ //ncr86c05_device &busintf(NCR86C05(config, "busintf", 0));
+ //busintf.mint_callback().set(m_mpu, FUNC(i80188_cpu_device::int1_w));
+ //busintf.dma_ack_callback().set("scsi:7:scsic", FUNC(ncr53cf94_device::dma_w));
+
+ NSCSI_BUS(config, "scsi");
+ NSCSI_CONNECTOR(config, "scsi:0", fast_scsi_devices, nullptr);
+ NSCSI_CONNECTOR(config, "scsi:1", fast_scsi_devices, nullptr);
+ NSCSI_CONNECTOR(config, "scsi:2", fast_scsi_devices, nullptr);
+ NSCSI_CONNECTOR(config, "scsi:3", fast_scsi_devices, nullptr);
+ NSCSI_CONNECTOR(config, "scsi:4", fast_scsi_devices, nullptr);
+ NSCSI_CONNECTOR(config, "scsi:5", fast_scsi_devices, nullptr);
+ NSCSI_CONNECTOR(config, "scsi:6", fast_scsi_devices, nullptr);
+ NSCSI_CONNECTOR(config, "scsi:7", fast_scsi_devices, "scsic", true).set_option_machine_config("scsic", [this] (device_t *device) { fsc_config(device); });
+}
+
+void bt542b_device::device_add_mconfig(machine_config &config)
+{
+ I80188(config, m_mpu, 16_MHz_XTAL);
+ m_mpu->set_addrmap(AS_PROGRAM, &bt542b_device::local_map);
+
+ //ncr86c05_device &busintf(NCR86C05(config, "busintf", 0));
+ //busintf.mint_callback().set(m_mpu, FUNC(i80188_cpu_device::int1_w));
+ //busintf.dma_ack_callback().set("scsi:7:scsic", FUNC(ncr53c94_device::dma_w));
+
+ NSCSI_BUS(config, "scsi");
+ NSCSI_CONNECTOR(config, "scsi:0", scsi_devices, nullptr);
+ NSCSI_CONNECTOR(config, "scsi:1", scsi_devices, nullptr);
+ NSCSI_CONNECTOR(config, "scsi:2", scsi_devices, nullptr);
+ NSCSI_CONNECTOR(config, "scsi:3", scsi_devices, nullptr);
+ NSCSI_CONNECTOR(config, "scsi:4", scsi_devices, nullptr);
+ NSCSI_CONNECTOR(config, "scsi:5", scsi_devices, nullptr);
+ NSCSI_CONNECTOR(config, "scsi:6", scsi_devices, nullptr);
+ NSCSI_CONNECTOR(config, "scsi:7", scsi_devices, "scsic", true).set_option_machine_config("scsic", [this] (device_t *device) { asc_config(device); });
+
+ DP8473(config, m_fdc, 24_MHz_XTAL);
+}
+
+void bt542bh_device::device_add_mconfig(machine_config &config)
+{
+ I80188(config, m_mpu, 40_MHz_XTAL / 2); // clock guessed
+ m_mpu->set_addrmap(AS_PROGRAM, &bt542bh_device::local_map);
+
+ fsc_base(config);
+
+ DP8473(config, m_fdc, 24_MHz_XTAL);
+}
+
+void bt545s_device::device_add_mconfig(machine_config &config)
+{
+ I80188(config, m_mpu, 40_MHz_XTAL / 2); // SAB80188-1-N; clock guessed
+ m_mpu->set_addrmap(AS_PROGRAM, &bt545s_device::local_map);
+
+ fsc_base(config);
+
+ PC8477A(config, m_fdc, 24_MHz_XTAL); // actually PC8477BV
+}
+
+ROM_START(bt542b)
+ ROM_REGION(0x4000, "bios", 0) // "(C) Copyright 1991 BIOS Version 2.41"
+ ROM_LOAD("1000006-2.41_bustek.u15", 0x0000, 0x4000, CRC(5eb00d0f) SHA1(74a8bbae1c2b42f0c605b0ac98660f1e16ac5c4e))
+
+ ROM_REGION(0x8000, "mpu", 0) // "(C) Copyright 1991 BusTek Corporation 542B 91/12/14"
+ ROM_LOAD("1000005-2.21_bustek.u2", 0x0000, 0x8000, CRC(c2c66653) SHA1(054ba1ea71b2aaab31ab9dd5aca955d861f5333b))
+ROM_END
+
+ROM_START(bt542bh)
+ ROM_REGION(0x8000, "bios", 0) // "(C) Copyright 1992 BIOS Version 4.70M"
+ ROM_LOAD("5000006-4.70_buslogic.u15", 0x0000, 0x8000, CRC(f5a5e116) SHA1(d7b73015532838dc694edf24308ebbab6f4dd5bb))
+
+ ROM_REGION(0x8000, "mpu", 0) // "(C) Copyright 1992 BusLogic Inc. 542BH93/05/23"
+ ROM_LOAD("5000005-3.35_buslogic.u2", 0x0000, 0x8000, CRC(181966c3) SHA1(b9b327d50cd13f3e5b5b53892b18f233aff065b7))
+ROM_END
+
+ROM_START(bt545s)
+ ROM_REGION(0x4000, "bios", 0) // "(C) Copyright 1992 BIOS Version 4.50"
+ ROM_LOAD("u15_27128_5002026-4.50.bin", 0x0000, 0x4000, CRC(1bd3247b) SHA1(9d46a99f4b3057e94ef422f387218de2c4553c1a))
+
+ ROM_REGION(0x8000, "mpu", 0) // "(C) Copyright 1992 BusLogic Inc. 542BH92/10/05"
+ ROM_LOAD("u2_27256_5002005-3.31.bin", 0x0000, 0x8000, CRC(20473714) SHA1(797a8dba182049949f7a5c14d8bef4b4e908305b))
+ROM_END
+
+const tiny_rom_entry *bt542b_device::device_rom_region() const
+{
+ return ROM_NAME(bt542b);
+}
+
+const tiny_rom_entry *bt542bh_device::device_rom_region() const
+{
+ return ROM_NAME(bt542bh);
+}
+
+const tiny_rom_entry *bt545s_device::device_rom_region() const
+{
+ return ROM_NAME(bt545s);
+}
diff --git a/src/devices/bus/isa/bt54x.h b/src/devices/bus/isa/bt54x.h
new file mode 100644
index 00000000000..dfdd0009416
--- /dev/null
+++ b/src/devices/bus/isa/bt54x.h
@@ -0,0 +1,74 @@
+// license:BSD-3-Clause
+// copyright-holders:AJR
+/***************************************************************************
+
+ BusTek/BusLogic BT-54x series PC/AT SCSI host adapters
+
+***************************************************************************/
+
+#ifndef MAME_BUS_ISA_BT54X_H
+#define MAME_BUS_ISA_BT54X_H
+
+#pragma once
+
+#include "isa.h"
+#include "cpu/i86/i186.h"
+#include "machine/upd765.h"
+
+class bt54x_device : public device_t, public device_isa16_card_interface
+{
+public:
+ static constexpr feature_type unemulated_features() { return feature::DISK; }
+
+protected:
+ bt54x_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock);
+
+ virtual void device_start() override;
+
+ u8 local_status_r();
+
+ void local_map(address_map &map);
+ void asc_config(device_t *device);
+ void fsc_config(device_t *device);
+ void fsc_base(machine_config &config);
+
+ required_device<i80188_cpu_device> m_mpu;
+ required_device<upd765_family_device> m_fdc;
+ required_region_ptr<u8> m_bios;
+};
+
+class bt542b_device : public bt54x_device
+{
+public:
+ bt542b_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
+
+protected:
+ virtual void device_add_mconfig(machine_config &config) override;
+ virtual const tiny_rom_entry *device_rom_region() const override;
+};
+
+class bt542bh_device : public bt54x_device
+{
+public:
+ bt542bh_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
+
+protected:
+ virtual void device_add_mconfig(machine_config &config) override;
+ virtual const tiny_rom_entry *device_rom_region() const override;
+};
+
+class bt545s_device : public bt54x_device
+{
+public:
+ bt545s_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
+
+protected:
+ virtual void device_add_mconfig(machine_config &config) override;
+ virtual const tiny_rom_entry *device_rom_region() const override;
+};
+
+DECLARE_DEVICE_TYPE(BT542B, bt542b_device)
+DECLARE_DEVICE_TYPE(BT542BH, bt542bh_device)
+DECLARE_DEVICE_TYPE(BT545S, bt545s_device)
+
+#endif // MAME_BUS_ISA_BT54X_H
diff --git a/src/devices/bus/isa/cga.cpp b/src/devices/bus/isa/cga.cpp
index f5fb8f185d7..eac981b4100 100644
--- a/src/devices/bus/isa/cga.cpp
+++ b/src/devices/bus/isa/cga.cpp
@@ -261,12 +261,13 @@ DEFINE_DEVICE_TYPE(ISA8_CGA, isa8_cga_device, "cga", "IBM Color/Graphics Monitor
// device_add_mconfig - add device configuration
//-------------------------------------------------
-MACHINE_CONFIG_START(isa8_cga_device::device_add_mconfig)
- MCFG_SCREEN_ADD(CGA_SCREEN_NAME, RASTER)
- MCFG_SCREEN_RAW_PARAMS(XTAL(14'318'181),912,0,640,262,0,200)
- MCFG_SCREEN_UPDATE_DEVICE( DEVICE_SELF, isa8_cga_device, screen_update )
+void isa8_cga_device::device_add_mconfig(machine_config &config)
+{
+ screen_device &screen(SCREEN(config, CGA_SCREEN_NAME, SCREEN_TYPE_RASTER));
+ screen.set_raw(XTAL(14'318'181), 912, 0, 640, 262, 0, 200);
+ screen.set_screen_update(FUNC(isa8_cga_device::screen_update));
- MCFG_PALETTE_ADD("palette", /* CGA_PALETTE_SETS * 16*/ 65536 )
+ PALETTE(config, m_palette).set_entries(/* CGA_PALETTE_SETS * 16*/ 65536);
MC6845(config, m_crtc, XTAL(14'318'181)/16);
m_crtc->set_screen(nullptr);
@@ -276,7 +277,7 @@ MACHINE_CONFIG_START(isa8_cga_device::device_add_mconfig)
m_crtc->out_hsync_callback().set(FUNC(isa8_cga_device::hsync_changed));
m_crtc->out_vsync_callback().set(FUNC(isa8_cga_device::vsync_changed));
m_crtc->set_reconfigure_callback(FUNC(isa8_cga_device::reconfigure), this);
-MACHINE_CONFIG_END
+}
ioport_constructor isa8_cga_device::device_input_ports() const
{
@@ -912,7 +913,7 @@ READ8_MEMBER( isa8_cga_device::io_read )
/* return last written mc6845 address value here? */
break;
case 1: case 3: case 5: case 7:
- data = m_crtc->register_r( space, offset );
+ data = m_crtc->register_r();
break;
case 10:
data = m_vsync | ( ( data & 0x40 ) >> 4 ) | m_hsync;
@@ -927,10 +928,10 @@ WRITE8_MEMBER( isa8_cga_device::io_write )
{
switch(offset) {
case 0: case 2: case 4: case 6:
- m_crtc->address_w( space, offset, data );
+ m_crtc->address_w(data);
break;
case 1: case 3: case 5: case 7:
- m_crtc->register_w( space, offset, data );
+ m_crtc->register_w(data);
break;
case 8:
mode_control_w(data);
@@ -1169,14 +1170,14 @@ WRITE8_MEMBER( isa8_cga_pc1512_device::io_write )
{
case 0: case 2: case 4: case 6:
data &= 0x1F;
- m_crtc->address_w( space, offset, data );
+ m_crtc->address_w(data);
m_mc6845_address = data;
break;
case 1: case 3: case 5: case 7:
if ( ! m_mc6845_locked_register[m_mc6845_address] )
{
- m_crtc->register_w( space, offset, data );
+ m_crtc->register_w(data);
if ( isa8_cga_pc1512_device::mc6845_writeonce_register[m_mc6845_address] )
{
m_mc6845_locked_register[m_mc6845_address] = 1;
@@ -1693,13 +1694,13 @@ const tiny_rom_entry *isa8_cga_mc1502_device::device_rom_region() const
DEFINE_DEVICE_TYPE(ISA8_CGA_M24, isa8_cga_m24_device, "cga_m24", "Olivetti M24 CGA")
-MACHINE_CONFIG_START(isa8_cga_m24_device::device_add_mconfig)
+void isa8_cga_m24_device::device_add_mconfig(machine_config &config)
+{
isa8_cga_device::device_add_mconfig(config);
- MCFG_DEVICE_MODIFY(CGA_SCREEN_NAME)
- MCFG_SCREEN_RAW_PARAMS(XTAL(14'318'181),912,0,640,462,0,400)
+ subdevice<screen_device>(CGA_SCREEN_NAME)->set_raw(XTAL(14'318'181), 912, 0, 640, 462, 0, 400);
m_crtc->set_reconfigure_callback(FUNC(isa8_cga_m24_device::reconfigure), this);
-MACHINE_CONFIG_END
+}
isa8_cga_m24_device::isa8_cga_m24_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) :
isa8_cga_m24_device(mconfig, ISA8_CGA_M24, tag, owner, clock)
@@ -1746,7 +1747,7 @@ WRITE8_MEMBER( isa8_cga_m24_device::io_write )
{
case 0: case 2: case 4: case 6:
m_index = data;
- m_crtc->address_w( space, offset, data );
+ m_crtc->address_w(data);
break;
case 1: case 3: case 5: case 7:
switch(m_index & 0x1f) // TODO: this is handled by a pal and prom
@@ -1765,7 +1766,7 @@ WRITE8_MEMBER( isa8_cga_m24_device::io_write )
data <<= 1;
break;
}
- m_crtc->register_w( space, offset, data );
+ m_crtc->register_w(data);
break;
case 0x0e:
m_mode2 = data;
@@ -1886,12 +1887,12 @@ MC6845_UPDATE_ROW( isa8_cga_m24_device::m24_gfx_1bpp_m24_update_row )
DEFINE_DEVICE_TYPE(ISA8_CGA_CPORTIII, isa8_cga_cportiii_device, "cga_cportiii", "Compaq Portable III CGA")
-MACHINE_CONFIG_START(isa8_cga_cportiii_device::device_add_mconfig)
+void isa8_cga_cportiii_device::device_add_mconfig(machine_config &config)
+{
isa8_cga_m24_device::device_add_mconfig(config);
- MCFG_DEVICE_MODIFY(CGA_SCREEN_NAME)
- MCFG_SCREEN_COLOR(rgb_t(255, 125, 0))
-MACHINE_CONFIG_END
+ subdevice<screen_device>(CGA_SCREEN_NAME)->set_color(rgb_t(255, 125, 0));
+}
isa8_cga_cportiii_device::isa8_cga_cportiii_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) :
isa8_cga_m24_device(mconfig, ISA8_CGA_CPORTIII, tag, owner, clock)
diff --git a/src/devices/bus/isa/cl_sh260.cpp b/src/devices/bus/isa/cl_sh260.cpp
new file mode 100644
index 00000000000..f8fb39249f5
--- /dev/null
+++ b/src/devices/bus/isa/cl_sh260.cpp
@@ -0,0 +1,93 @@
+// license:BSD-3-Clause
+// copyright-holders:AJR
+/***************************************************************************
+
+ ISA 16-bit disk controllers based on the Cirrus Logic CL-SH260-15PC-D
+ * Everex EV-346
+ * Joincom Electronic JC-1310
+
+***************************************************************************/
+
+#include "emu.h"
+#include "cl_sh260.h"
+
+#include "cpu/mcs51/mcs51.h"
+
+DEFINE_DEVICE_TYPE(EV346, isa16_ev346_device, "ev346", "Everex EV-346 disk controller")
+DEFINE_DEVICE_TYPE(JC1310, isa16_jc1310_device, "jc1310", "Joincom JC-1310 disk controller")
+
+isa16_cl_sh260_device::isa16_cl_sh260_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock)
+ : device_t(mconfig, type, tag, owner, clock)
+ , device_isa16_card_interface(mconfig, *this)
+ , m_fdc(*this, "fdc")
+{
+}
+
+isa16_ev346_device::isa16_ev346_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
+ : isa16_cl_sh260_device(mconfig, EV346, tag, owner, clock)
+{
+}
+
+isa16_jc1310_device::isa16_jc1310_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
+ : isa16_cl_sh260_device(mconfig, JC1310, tag, owner, clock)
+{
+}
+
+void isa16_cl_sh260_device::device_start()
+{
+}
+
+void isa16_cl_sh260_device::i8031_map(address_map &map)
+{
+ map(0x0000, 0x1fff).rom().region("mcu", 0);
+}
+
+void isa16_ev346_device::ext_map(address_map &map)
+{
+ map.global_mask(0xff);
+ map(0x00, 0xff).noprw(); // CL-SH260 interface
+}
+
+void isa16_jc1310_device::ext_map(address_map &map)
+{
+ map(0xc000, 0xc0ff).noprw(); // CL-SH260 interface
+}
+
+void isa16_ev346_device::device_add_mconfig(machine_config &config)
+{
+ i8031_device &mcu(I8031(config, "mcu", 12_MHz_XTAL)); // SCN8031HCCN40
+ mcu.set_addrmap(AS_PROGRAM, &isa16_ev346_device::i8031_map);
+ mcu.set_addrmap(AS_IO, &isa16_ev346_device::ext_map);
+
+ DP8473(config, m_fdc, 24_MHz_XTAL);
+}
+
+void isa16_jc1310_device::device_add_mconfig(machine_config &config)
+{
+ i8031_device &mcu(I8031(config, "mcu", 10_MHz_XTAL)); // P8031AH
+ mcu.set_addrmap(AS_PROGRAM, &isa16_jc1310_device::i8031_map);
+ mcu.set_addrmap(AS_IO, &isa16_jc1310_device::ext_map);
+
+ WD37C65C(config, m_fdc, 16_MHz_XTAL); // WD37C65B-PL
+ //m_fdc->set_clock2(9.6_MHz_XTAL);
+}
+
+ROM_START(ev346)
+ ROM_REGION(0x2000, "mcu", 0)
+ ROM_LOAD("everex_ev346_vers_3.2.bin", 0x0000, 0x2000, CRC(49b10ca7) SHA1(ef31b62f5ac38db7cacfc4d30e203a4cc1414913))
+ROM_END
+
+ROM_START(jc1310)
+ ROM_REGION(0x2000, "mcu", 0) // "(C) COPYRIGHT JOINCOM ELECTRONIC CORP. 9/16/1988 JC1310"
+ ROM_LOAD("jc-1310 - apr-c 89.u3", 0x0000, 0x2000, CRC(e044f5e1) SHA1(5a32d2001bb1a489657f9488136b5d621f803703)) // TMS 2764-20JL
+ROM_END
+
+const tiny_rom_entry *isa16_ev346_device::device_rom_region() const
+{
+ return ROM_NAME(ev346);
+}
+
+const tiny_rom_entry *isa16_jc1310_device::device_rom_region() const
+{
+ return ROM_NAME(jc1310);
+}
diff --git a/src/devices/bus/isa/cl_sh260.h b/src/devices/bus/isa/cl_sh260.h
new file mode 100644
index 00000000000..18612ab6456
--- /dev/null
+++ b/src/devices/bus/isa/cl_sh260.h
@@ -0,0 +1,64 @@
+// license:BSD-3-Clause
+// copyright-holders:AJR
+/***************************************************************************
+
+ ISA 16-bit disk controllers based on the Cirrus Logic CL-SH260-15PC-D
+ * Everex EV-346
+ * Joincom Electronic JC-1310
+
+***************************************************************************/
+
+#ifndef MAME_BUS_ISA_CL_SH260_H
+#define MAME_BUS_ISA_CL_SH260_H
+
+#pragma once
+
+#include "isa.h"
+#include "machine/upd765.h"
+
+class isa16_cl_sh260_device : public device_t, public device_isa16_card_interface
+{
+protected:
+ isa16_cl_sh260_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock);
+
+ virtual void device_start() override;
+
+ void i8031_map(address_map &map);
+
+ required_device<upd765_family_device> m_fdc;
+};
+
+class isa16_ev346_device : public isa16_cl_sh260_device
+{
+public:
+ isa16_ev346_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
+
+ static constexpr feature_type unemulated_features() { return feature::DISK; }
+
+protected:
+ virtual void device_add_mconfig(machine_config &config) override;
+ virtual const tiny_rom_entry *device_rom_region() const override;
+
+private:
+ void ext_map(address_map &map);
+};
+
+class isa16_jc1310_device : public isa16_cl_sh260_device
+{
+public:
+ isa16_jc1310_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
+
+ static constexpr feature_type unemulated_features() { return feature::DISK; }
+
+protected:
+ virtual void device_add_mconfig(machine_config &config) override;
+ virtual const tiny_rom_entry *device_rom_region() const override;
+
+private:
+ void ext_map(address_map &map);
+};
+
+DECLARE_DEVICE_TYPE(EV346, isa16_ev346_device)
+DECLARE_DEVICE_TYPE(JC1310, isa16_jc1310_device)
+
+#endif // MAME_BUS_ISA_CL_SH260_H
diff --git a/src/devices/bus/isa/dcb.cpp b/src/devices/bus/isa/dcb.cpp
new file mode 100644
index 00000000000..db5768d6758
--- /dev/null
+++ b/src/devices/bus/isa/dcb.cpp
@@ -0,0 +1,70 @@
+// license:BSD-3-Clause
+// copyright-holders:AJR
+/***************************************************************************
+
+ Novell Disk Coprocessor Board (DCB)
+
+ This special SCSI host adapter, later acquired by ADIC, was designed
+ for use with Novell NetWare.
+
+***************************************************************************/
+
+#include "emu.h"
+#include "dcb.h"
+
+DEFINE_DEVICE_TYPE(NOVELL_DCB, novell_dcb_device, "novell_dcb", "Novell Disk Coprocessor Board (#738-133-001)")
+
+novell_dcb_device::novell_dcb_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
+ : device_t(mconfig, NOVELL_DCB, tag, owner, clock)
+ , device_isa16_card_interface(mconfig, *this)
+ , m_localcpu(*this, "localcpu")
+ , m_eeprom(*this, "eeprom")
+{
+}
+
+void novell_dcb_device::device_start()
+{
+}
+
+void novell_dcb_device::eeprom_w(u8 data)
+{
+ m_eeprom->cs_write(BIT(data, 5));
+ m_eeprom->clk_write(BIT(data, 6));
+ m_eeprom->di_write(BIT(data, 7));
+}
+
+u8 novell_dcb_device::misc_r()
+{
+ return m_eeprom->do_read() << 7;
+}
+
+void novell_dcb_device::mem_map(address_map &map)
+{
+ map(0x00000, 0x03fff).ram();
+ map(0xfe000, 0xfffff).rom().region("localcpu", 0);
+}
+
+void novell_dcb_device::io_map(address_map &map)
+{
+ map(0x0100, 0x0100).w(FUNC(novell_dcb_device::eeprom_w));
+ map(0x0180, 0x0180).r(FUNC(novell_dcb_device::misc_r));
+}
+
+void novell_dcb_device::device_add_mconfig(machine_config &config)
+{
+ I80188(config, m_localcpu, 16_MHz_XTAL);
+ m_localcpu->set_addrmap(AS_PROGRAM, &novell_dcb_device::mem_map);
+ m_localcpu->set_addrmap(AS_IO, &novell_dcb_device::io_map);
+
+ EEPROM_93C06_16BIT(config, m_eeprom); // NMC9306
+}
+
+ROM_START(novell_dcb)
+ ROM_REGION(0x2000, "localcpu", 0)
+ ROM_LOAD("817-186-001_rev_e_5800_11-04-86.bin", 0x0000, 0x2000, CRC(2e2037f4) SHA1(a13c0aab46084a0805256f1d2b8b8beaccc9e253))
+ROM_END
+
+const tiny_rom_entry *novell_dcb_device::device_rom_region() const
+{
+ return ROM_NAME(novell_dcb);
+}
diff --git a/src/devices/bus/isa/dcb.h b/src/devices/bus/isa/dcb.h
new file mode 100644
index 00000000000..fbca0303978
--- /dev/null
+++ b/src/devices/bus/isa/dcb.h
@@ -0,0 +1,43 @@
+// license:BSD-3-Clause
+// copyright-holders:AJR
+/***************************************************************************
+
+ Novell Disk Coprocessor Board (DCB)
+
+***************************************************************************/
+
+#ifndef MAME_BUS_ISA_DCB_H
+#define MAME_BUS_ISA_DCB_H
+
+#pragma once
+
+#include "isa.h"
+#include "cpu/i86/i186.h"
+#include "machine/eepromser.h"
+
+class novell_dcb_device : public device_t, public device_isa16_card_interface
+{
+public:
+ novell_dcb_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
+
+ static constexpr feature_type unemulated_features() { return feature::DISK; }
+
+protected:
+ virtual void device_add_mconfig(machine_config &config) override;
+ virtual const tiny_rom_entry *device_rom_region() const override;
+ virtual void device_start() override;
+
+private:
+ void eeprom_w(u8 data);
+ u8 misc_r();
+
+ void mem_map(address_map &map);
+ void io_map(address_map &map);
+
+ required_device<i80188_cpu_device> m_localcpu;
+ required_device<eeprom_serial_93cxx_device> m_eeprom;
+};
+
+DECLARE_DEVICE_TYPE(NOVELL_DCB, novell_dcb_device)
+
+#endif // MAME_BUS_ISA_DCB_H
diff --git a/src/devices/bus/isa/dectalk.cpp b/src/devices/bus/isa/dectalk.cpp
index d8ad57d57d3..da45a2ec18b 100644
--- a/src/devices/bus/isa/dectalk.cpp
+++ b/src/devices/bus/isa/dectalk.cpp
@@ -172,7 +172,6 @@ void dectalk_isa_device::device_add_mconfig(machine_config &config)
SPEAKER(config, "speaker").front_center();
DAC_12BIT_R2R(config, m_dac, 0).add_route(0, "speaker", 1.0); // unknown DAC
voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref", 0));
- vref.set_output(5.0);
vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT);
vref.add_route(0, "dac", -1.0, DAC_VREF_NEG_INPUT);
}
diff --git a/src/devices/bus/isa/ega.cpp b/src/devices/bus/isa/ega.cpp
index 01c73066088..5da3c263384 100644
--- a/src/devices/bus/isa/ega.cpp
+++ b/src/devices/bus/isa/ega.cpp
@@ -528,23 +528,24 @@ DEFINE_DEVICE_TYPE(ISA8_EGA, isa8_ega_device, "ega", "IBM Enhanced Graphics Adap
// device_add_mconfig - add device configuration
//-------------------------------------------------
-MACHINE_CONFIG_START(isa8_ega_device::device_add_mconfig)
- MCFG_SCREEN_ADD(EGA_SCREEN_NAME, RASTER)
- MCFG_SCREEN_RAW_PARAMS(16257000,912,0,640,262,0,200)
- MCFG_SCREEN_UPDATE_DEVICE(EGA_CRTC_NAME, crtc_ega_device, screen_update)
- MCFG_SCREEN_PALETTE("palette")
-
- MCFG_PALETTE_ADD( "palette", 64 )
-
- MCFG_DEVICE_ADD(EGA_CRTC_NAME, CRTC_EGA, 16257000/8)
- MCFG_CRTC_EGA_SET_SCREEN(EGA_SCREEN_NAME)
- MCFG_CRTC_EGA_HPIXELS_PER_COLUMN(8)
- MCFG_CRTC_EGA_ROW_UPDATE_CB(isa8_ega_device, ega_update_row)
- MCFG_CRTC_EGA_RES_OUT_DE_CB(WRITELINE(*this, isa8_ega_device, de_changed))
- MCFG_CRTC_EGA_RES_OUT_HSYNC_CB(WRITELINE(*this, isa8_ega_device, hsync_changed))
- MCFG_CRTC_EGA_RES_OUT_VSYNC_CB(WRITELINE(*this, isa8_ega_device, vsync_changed))
- MCFG_CRTC_EGA_RES_OUT_VBLANK_CB(WRITELINE(*this, isa8_ega_device, vblank_changed))
-MACHINE_CONFIG_END
+void isa8_ega_device::device_add_mconfig(machine_config &config)
+{
+ screen_device &screen(SCREEN(config, EGA_SCREEN_NAME, SCREEN_TYPE_RASTER));
+ screen.set_raw(16.257_MHz_XTAL, 912, 0, 640, 262, 0, 200);
+ screen.set_screen_update(EGA_CRTC_NAME, FUNC(crtc_ega_device::screen_update));
+ screen.set_palette(m_palette);
+
+ PALETTE(config, m_palette).set_entries(64);
+
+ CRTC_EGA(config, m_crtc_ega, 16.257_MHz_XTAL/8);
+ m_crtc_ega->set_screen(EGA_SCREEN_NAME);
+ m_crtc_ega->config_set_hpixels_per_column(8);
+ m_crtc_ega->set_row_update_callback(FUNC(isa8_ega_device::ega_update_row), this);
+ m_crtc_ega->res_out_de_callback().set(FUNC(isa8_ega_device::de_changed));
+ m_crtc_ega->res_out_hsync_callback().set(FUNC(isa8_ega_device::hsync_changed));
+ m_crtc_ega->res_out_vsync_callback().set(FUNC(isa8_ega_device::vsync_changed));
+ m_crtc_ega->res_out_vblank_callback().set(FUNC(isa8_ega_device::vblank_changed));
+}
//-------------------------------------------------
// rom_region - device-specific ROM region
@@ -576,7 +577,7 @@ isa8_ega_device::isa8_ega_device(const machine_config &mconfig, const char *tag,
isa8_ega_device::isa8_ega_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock) :
device_t(mconfig, type, tag, owner, clock),
device_isa8_card_interface(mconfig, *this),
- m_crtc_ega(nullptr), m_videoram(nullptr), m_charA(nullptr), m_charB(nullptr),
+ m_crtc_ega(*this, EGA_CRTC_NAME), m_videoram(nullptr), m_charA(nullptr), m_charB(nullptr),
m_misc_output(0), m_feature_control(0), m_frame_cnt(0), m_hsync(0), m_vsync(0), m_vblank(0), m_display_enable(0), m_video_mode(0),
m_palette(*this, "palette")
{
@@ -626,8 +627,6 @@ void isa8_ega_device::device_start()
m_plane[2] = m_videoram + 0x20000;
m_plane[3] = m_videoram + 0x30000;
- m_crtc_ega = subdevice<crtc_ega_device>(EGA_CRTC_NAME);
-
m_isa->install_rom(this, 0xc0000, 0xc3fff, "ega", "user2");
m_isa->install_device(0x3b0, 0x3bf, read8_delegate(FUNC(isa8_ega_device::pc_ega8_3b0_r), this), write8_delegate(FUNC(isa8_ega_device::pc_ega8_3b0_w), this));
m_isa->install_device(0x3c0, 0x3cf, read8_delegate(FUNC(isa8_ega_device::pc_ega8_3c0_r), this), write8_delegate(FUNC(isa8_ega_device::pc_ega8_3c0_w), this));
@@ -1170,7 +1169,7 @@ READ8_MEMBER( isa8_ega_device::pc_ega8_3X0_r )
/* CRT Controller - data register */
case 1: case 3: case 5: case 7:
- data = m_crtc_ega->register_r( space, offset );
+ data = m_crtc_ega->register_r();
break;
/* Input Status Register 1 */
@@ -1205,12 +1204,12 @@ WRITE8_MEMBER( isa8_ega_device::pc_ega8_3X0_w )
{
/* CRT Controller - address register */
case 0: case 2: case 4: case 6:
- m_crtc_ega->address_w( space, offset, data );
+ m_crtc_ega->address_w(data);
break;
/* CRT Controller - data register */
case 1: case 3: case 5: case 7:
- m_crtc_ega->register_w( space, offset, data );
+ m_crtc_ega->register_w(data);
break;
/* Set Light Pen Flip Flop */
diff --git a/src/devices/bus/isa/ega.h b/src/devices/bus/isa/ega.h
index 4e7bc4394a3..4334604b9a8 100644
--- a/src/devices/bus/isa/ega.h
+++ b/src/devices/bus/isa/ega.h
@@ -58,7 +58,7 @@ private:
CRTC_EGA_ROW_UPDATE(ega_update_row);
public:
- crtc_ega_device *m_crtc_ega;
+ required_device<crtc_ega_device> m_crtc_ega;
void install_banks();
void change_mode();
diff --git a/src/devices/bus/isa/eis_sad8852.cpp b/src/devices/bus/isa/eis_sad8852.cpp
index 4f2b5a0c856..f4d634d1033 100644
--- a/src/devices/bus/isa/eis_sad8852.cpp
+++ b/src/devices/bus/isa/eis_sad8852.cpp
@@ -199,13 +199,14 @@ ioport_constructor isa16_sad8852_device::device_input_ports() const
//-------------------------------------------------
// Board configuration
//-------------------------------------------------
-MACHINE_CONFIG_START(isa16_sad8852_device::device_add_mconfig)
- MCFG_DEVICE_ADD(I80188_TAG, I80188, XTAL(12'000'000) / 2) // Chip revision is 6 MHz
- MCFG_DEVICE_PROGRAM_MAP( sad8852_mem )
- MCFG_DEVICE_IO_MAP(sad8852_io)
+void isa16_sad8852_device::device_add_mconfig(machine_config &config)
+{
+ i80188_cpu_device &cpu(I80188(config, I80188_TAG, XTAL(12'000'000) / 2)); // Chip revision is 6 MHz
+ cpu.set_addrmap(AS_PROGRAM, &isa16_sad8852_device::sad8852_mem);
+ cpu.set_addrmap(AS_IO, &isa16_sad8852_device::sad8852_io);
I8274_NEW(config, "terminal", XTAL(12'000'000) / 3); // Needs verification
-MACHINE_CONFIG_END
+}
isa16_sad8852_device::isa16_sad8852_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) :
device_t(mconfig, ISA16_SAD8852, tag, owner, clock)
diff --git a/src/devices/bus/isa/fdc.cpp b/src/devices/bus/isa/fdc.cpp
index f31b0f5f9dd..9c9f52d7a1d 100644
--- a/src/devices/bus/isa/fdc.cpp
+++ b/src/devices/bus/isa/fdc.cpp
@@ -72,6 +72,11 @@ void isa8_fdc_device::dack_w(int line, uint8_t data)
return m_fdc->dma_w(data);
}
+void isa8_fdc_device::dack_line_w(int line, int state)
+{
+ //m_fdc->dack_w(state);
+}
+
void isa8_fdc_device::eop_w(int state)
{
m_fdc->tc_w(state == ASSERT_LINE);
diff --git a/src/devices/bus/isa/fdc.h b/src/devices/bus/isa/fdc.h
index 7a1781cdc69..cec5f7dd06e 100644
--- a/src/devices/bus/isa/fdc.h
+++ b/src/devices/bus/isa/fdc.h
@@ -40,6 +40,7 @@ protected:
virtual uint8_t dack_r(int line) override;
virtual void dack_w(int line, uint8_t data) override;
+ virtual void dack_line_w(int line, int state) override;
virtual void eop_w(int state) override;
required_device<pc_fdc_interface> m_fdc;
diff --git a/src/devices/bus/isa/finalchs.cpp b/src/devices/bus/isa/finalchs.cpp
index e79dee39686..f9e6f37dc8f 100644
--- a/src/devices/bus/isa/finalchs.cpp
+++ b/src/devices/bus/isa/finalchs.cpp
@@ -71,10 +71,11 @@ DEFINE_DEVICE_TYPE(ISA8_FINALCHS, isa8_finalchs_device, "isa_finalchs", "Final C
// device_add_mconfig - add device configuration
//-------------------------------------------------
-MACHINE_CONFIG_START(isa8_finalchs_device::device_add_mconfig)
- MCFG_DEVICE_ADD("maincpu",M65C02,5000000)
- MCFG_DEVICE_PROGRAM_MAP(finalchs_mem)
-MACHINE_CONFIG_END
+void isa8_finalchs_device::device_add_mconfig(machine_config &config)
+{
+ m65c02_device &cpu(M65C02(config, "maincpu", 5000000));
+ cpu.set_addrmap(AS_PROGRAM, &isa8_finalchs_device::finalchs_mem);
+}
//**************************************************************************
// LIVE DEVICE
diff --git a/src/devices/bus/isa/gus.cpp b/src/devices/bus/isa/gus.cpp
index 99404470140..423c1e3629f 100644
--- a/src/devices/bus/isa/gus.cpp
+++ b/src/devices/bus/isa/gus.cpp
@@ -1250,7 +1250,8 @@ INPUT_PORTS_END
// device_add_mconfig - add device configuration
//-------------------------------------------------
-MACHINE_CONFIG_START(isa16_gus_device::device_add_mconfig)
+void isa16_gus_device::device_add_mconfig(machine_config &config)
+{
SPEAKER(config, "lspeaker").front_left();
SPEAKER(config, "rspeaker").front_right();
GGF1(config, m_gf1, GF1_CLOCK);
@@ -1270,14 +1271,13 @@ MACHINE_CONFIG_START(isa16_gus_device::device_add_mconfig)
m_gf1->drq2_handler().set(FUNC(isa16_gus_device::drq2_w));
m_gf1->nmi_handler().set(FUNC(isa16_gus_device::nmi_w));
- MCFG_MIDI_PORT_ADD("mdin", midiin_slot, "midiin")
- MCFG_MIDI_RX_HANDLER(WRITELINE("gf1", acia6850_device, write_rxd))
+ MIDI_PORT(config, "mdin", midiin_slot, "midiin").rxd_handler().set(m_gf1, FUNC(acia6850_device::write_rxd));
- MCFG_MIDI_PORT_ADD("mdout", midiout_slot, "midiout")
+ MIDI_PORT(config, "mdout", midiout_slot, "midiout");
- MCFG_DEVICE_ADD("acia_clock", CLOCK, 31250*16)
- MCFG_CLOCK_SIGNAL_HANDLER(WRITELINE(*this, isa16_gus_device, write_acia_clock))
-MACHINE_CONFIG_END
+ clock_device &acia_clock(CLOCK(config, "acia_clock", 31250*16));
+ acia_clock.signal_handler().set(FUNC(isa16_gus_device::write_acia_clock));
+}
ioport_constructor isa16_gus_device::device_input_ports() const
{
@@ -1384,9 +1384,9 @@ READ8_MEMBER(isa16_gus_device::synth_r)
switch(offset)
{
case 0x00:
- return m_gf1->status_r(space,0);
+ return m_gf1->status_r();
case 0x01:
- return m_gf1->data_r(space,0);
+ return m_gf1->data_r();
case 0x02:
case 0x03:
return m_gf1->global_reg_select_r(space,offset-2);
@@ -1407,10 +1407,10 @@ WRITE8_MEMBER(isa16_gus_device::synth_w)
switch(offset)
{
case 0x00:
- m_gf1->control_w(space,0,data);
+ m_gf1->control_w(data);
break;
case 0x01:
- m_gf1->data_w(space,0,data);
+ m_gf1->data_w(data);
break;
case 0x02:
case 0x03:
diff --git a/src/devices/bus/isa/gus.h b/src/devices/bus/isa/gus.h
index 493893a62e0..0009510b81f 100644
--- a/src/devices/bus/isa/gus.h
+++ b/src/devices/bus/isa/gus.h
@@ -45,38 +45,6 @@
#include "isa.h"
#include "machine/6850acia.h"
-#define MCFG_GF1_TXIRQ_HANDLER(_devcb) \
- downcast<gf1_device &>(*device).set_txirq_handler(DEVCB_##_devcb);
-
-#define MCFG_GF1_RXIRQ_HANDLER(_devcb) \
- downcast<gf1_device &>(*device).set_rxirq_handler(DEVCB_##_devcb);
-
-#define MCFG_GF1_WAVE_IRQ_HANDLER(_devcb) \
- downcast<gf1_device &>(*device).set_wave_irq_handler(DEVCB_##_devcb);
-
-#define MCFG_GF1_RAMP_IRQ_HANDLER(_devcb) \
- downcast<gf1_device &>(*device).set_ramp_irq_handler(DEVCB_##_devcb);
-
-#define MCFG_GF1_TIMER1_IRQ_HANDLER(_devcb) \
- downcast<gf1_device &>(*device).set_timer1_irq_handler(DEVCB_##_devcb);
-
-#define MCFG_GF1_TIMER2_IRQ_HANDLER(_devcb) \
- downcast<gf1_device &>(*device).set_timer2_irq_handler(DEVCB_##_devcb);
-
-#define MCFG_GF1_SB_IRQ_HANDLER(_devcb) \
- downcast<gf1_device &>(*device).set_sb_irq_handler(DEVCB_##_devcb);
-
-#define MCFG_GF1_DMA_IRQ_HANDLER(_devcb) \
- downcast<gf1_device &>(*device).set_dma_irq_handler(DEVCB_##_devcb);
-
-#define MCFG_GF1_DRQ1_HANDLER(_devcb) \
- downcast<gf1_device &>(*device).set_drq1_handler(DEVCB_##_devcb);
-
-#define MCFG_GF1_DRQ2_HANDLER(_devcb) \
- downcast<gf1_device &>(*device).set_drq2_handler(DEVCB_##_devcb);
-
-#define MCFG_GF1_NMI_HANDLER(_devcb) \
- downcast<gf1_device &>(*device).set_nmi_handler(DEVCB_##_devcb);
//**************************************************************************
// TYPE DEFINITIONS
@@ -112,17 +80,6 @@ public:
// construction/destruction
gf1_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- template <class Object> devcb_base &set_txirq_handler(Object &&cb) { return m_txirq_handler.set_callback(std::forward<Object>(cb)); }
- template <class Object> devcb_base &set_rxirq_handler(Object &&cb) { return m_rxirq_handler.set_callback(std::forward<Object>(cb)); }
- template <class Object> devcb_base &set_wave_irq_handler(Object &&cb) { return m_wave_irq_handler.set_callback(std::forward<Object>(cb)); }
- template <class Object> devcb_base &set_ramp_irq_handler(Object &&cb) { return m_ramp_irq_handler.set_callback(std::forward<Object>(cb)); }
- template <class Object> devcb_base &set_timer1_irq_handler(Object &&cb) { return m_timer1_irq_handler.set_callback(std::forward<Object>(cb)); }
- template <class Object> devcb_base &set_timer2_irq_handler(Object &&cb) { return m_timer2_irq_handler.set_callback(std::forward<Object>(cb)); }
- template <class Object> devcb_base &set_sb_irq_handler(Object &&cb) { return m_sb_irq_handler.set_callback(std::forward<Object>(cb)); }
- template <class Object> devcb_base &set_dma_irq_handler(Object &&cb) { return m_dma_irq_handler.set_callback(std::forward<Object>(cb)); }
- template <class Object> devcb_base &set_drq1_handler(Object &&cb) { return m_drq1_handler.set_callback(std::forward<Object>(cb)); }
- template <class Object> devcb_base &set_drq2_handler(Object &&cb) { return m_drq2_handler.set_callback(std::forward<Object>(cb)); }
- template <class Object> devcb_base &set_nmi_handler(Object &&cb) { return m_nmi_handler.set_callback(std::forward<Object>(cb)); }
auto txirq_handler() { return m_txirq_handler.bind(); }
auto rxirq_handler() { return m_rxirq_handler.bind(); }
auto wave_irq_handler() { return m_wave_irq_handler.bind(); }
diff --git a/src/devices/bus/isa/hdc.cpp b/src/devices/bus/isa/hdc.cpp
index 040f72f98c3..2492d0eaa89 100644
--- a/src/devices/bus/isa/hdc.cpp
+++ b/src/devices/bus/isa/hdc.cpp
@@ -918,21 +918,23 @@ DEFINE_DEVICE_TYPE(ISA8_HDC_EC1841, isa8_hdc_ec1841_device, "isa_hdc_ec1841", "E
// device_add_mconfig - add device configuration
//-------------------------------------------------
-MACHINE_CONFIG_START(isa8_hdc_device::device_add_mconfig)
- MCFG_DEVICE_ADD("hdc",XT_HDC,0)
- MCFG_XTHDC_IRQ_HANDLER(WRITELINE(*this, isa8_hdc_device,irq_w))
- MCFG_XTHDC_DRQ_HANDLER(WRITELINE(*this, isa8_hdc_device,drq_w))
- MCFG_HARDDISK_ADD("hdc:primary")
- MCFG_HARDDISK_ADD("hdc:slave")
-MACHINE_CONFIG_END
-
-MACHINE_CONFIG_START(isa8_hdc_ec1841_device::device_add_mconfig)
- MCFG_DEVICE_ADD("hdc",EC1841_HDC,0)
- MCFG_XTHDC_IRQ_HANDLER(WRITELINE(*this, isa8_hdc_ec1841_device,irq_w))
- MCFG_XTHDC_DRQ_HANDLER(WRITELINE(*this, isa8_hdc_ec1841_device,drq_w))
- MCFG_HARDDISK_ADD("hdc:primary")
- MCFG_HARDDISK_ADD("hdc:slave")
-MACHINE_CONFIG_END
+void isa8_hdc_device::device_add_mconfig(machine_config &config)
+{
+ XT_HDC(config, m_hdc,0);
+ m_hdc->irq_handler().set(FUNC(isa8_hdc_device::irq_w));
+ m_hdc->drq_handler().set(FUNC(isa8_hdc_device::drq_w));
+ HARDDISK(config, "hdc:primary");
+ HARDDISK(config, "hdc:slave");
+}
+
+void isa8_hdc_ec1841_device::device_add_mconfig(machine_config &config)
+{
+ EC1841_HDC(config, m_hdc,0);
+ m_hdc->irq_handler().set(FUNC(isa8_hdc_ec1841_device::irq_w));
+ m_hdc->drq_handler().set(FUNC(isa8_hdc_ec1841_device::drq_w));
+ HARDDISK(config, "hdc:primary");
+ HARDDISK(config, "hdc:slave");
+}
//-------------------------------------------------
// rom_region - device-specific ROM region
diff --git a/src/devices/bus/isa/hdc.h b/src/devices/bus/isa/hdc.h
index 3e91c57d063..7d60d40b7a5 100644
--- a/src/devices/bus/isa/hdc.h
+++ b/src/devices/bus/isa/hdc.h
@@ -19,11 +19,6 @@
// XT HD controller device
-#define MCFG_XTHDC_IRQ_HANDLER(_devcb) \
- downcast<xt_hdc_device &>(*device).set_irq_handler(DEVCB_##_devcb);
-
-#define MCFG_XTHDC_DRQ_HANDLER(_devcb) \
- downcast<xt_hdc_device &>(*device).set_drq_handler(DEVCB_##_devcb);
class xt_hdc_device :
public device_t
@@ -32,8 +27,8 @@ public:
// construction/destruction
xt_hdc_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- template <class Object> devcb_base &set_irq_handler(Object &&cb) { return m_irq_handler.set_callback(std::forward<Object>(cb)); }
- template <class Object> devcb_base &set_drq_handler(Object &&cb) { return m_drq_handler.set_callback(std::forward<Object>(cb)); }
+ auto irq_handler() { return m_irq_handler.bind(); }
+ auto drq_handler() { return m_drq_handler.bind(); }
int dack_r();
int dack_rs();
diff --git a/src/devices/bus/isa/ibm_mfc.cpp b/src/devices/bus/isa/ibm_mfc.cpp
index 30a638d1c27..40ce54ff6fc 100644
--- a/src/devices/bus/isa/ibm_mfc.cpp
+++ b/src/devices/bus/isa/ibm_mfc.cpp
@@ -374,10 +374,11 @@ ROM_END
// device_add_mconfig - add device configuration
//-------------------------------------------------
-MACHINE_CONFIG_START(isa8_ibm_mfc_device::device_add_mconfig)
- MCFG_DEVICE_ADD("ibm_mfc", Z80, XTAL(11'800'000) / 2)
- MCFG_DEVICE_PROGRAM_MAP(prg_map)
- MCFG_DEVICE_IO_MAP(io_map)
+void isa8_ibm_mfc_device::device_add_mconfig(machine_config &config)
+{
+ Z80(config, m_cpu, XTAL(11'800'000) / 2);
+ m_cpu->set_addrmap(AS_PROGRAM, &isa8_ibm_mfc_device::prg_map);
+ m_cpu->set_addrmap(AS_IO, &isa8_ibm_mfc_device::io_map);
I8255(config, m_d71055c_0);
m_d71055c_0->in_pa_callback().set(FUNC(isa8_ibm_mfc_device::ppi0_i_a));
@@ -390,10 +391,10 @@ MACHINE_CONFIG_START(isa8_ibm_mfc_device::device_add_mconfig)
m_d71055c_1->in_pb_callback().set(FUNC(isa8_ibm_mfc_device::ppi1_i_b));
m_d71055c_1->out_pc_callback().set(FUNC(isa8_ibm_mfc_device::ppi1_o_c));
- I8251(config, "d71051", 0);
+ I8251(config, m_d71051, 0);
- MCFG_DEVICE_ADD("usart_clock", CLOCK, XTAL(4'000'000) / 8) // 500KHz
- MCFG_CLOCK_SIGNAL_HANDLER(WRITELINE(*this, isa8_ibm_mfc_device, write_usart_clock))
+ clock_device &usart_clock(CLOCK(config, "usart_clock", XTAL(4'000'000) / 8)); // 500KHz
+ usart_clock.signal_handler().set(FUNC(isa8_ibm_mfc_device::write_usart_clock));
PIT8253(config, m_d8253, 0);
m_d8253->set_clk<0>(XTAL(4'000'000) / 8);
@@ -409,7 +410,7 @@ MACHINE_CONFIG_START(isa8_ibm_mfc_device::device_add_mconfig)
m_ym2151->irq_handler().set(FUNC(isa8_ibm_mfc_device::ibm_mfc_ym_irq));
m_ym2151->add_route(0, "ymleft", 1.00);
m_ym2151->add_route(1, "ymright", 1.00);
-MACHINE_CONFIG_END
+}
//-------------------------------------------------
diff --git a/src/devices/bus/isa/isa.cpp b/src/devices/bus/isa/isa.cpp
index 417e354180c..92ead5df95b 100644
--- a/src/devices/bus/isa/isa.cpp
+++ b/src/devices/bus/isa/isa.cpp
@@ -111,11 +111,10 @@ isa8_device::isa8_device(const machine_config &mconfig, device_type type, const
m_io_config("ISA 8-bit I/O", ENDIANNESS_LITTLE, 8, 16, 0, address_map_constructor()),
m_mem16_config("ISA 16-bit mem", ENDIANNESS_LITTLE, 16, 24, 0, address_map_constructor()),
m_io16_config("ISA 16-bit I/O", ENDIANNESS_LITTLE, 16, 16, 0, address_map_constructor()),
- m_maincpu(*this, finder_base::DUMMY_TAG),
- m_iospace(nullptr),
- m_memspace(nullptr),
- m_iowidth(0),
+ m_memspace(*this, finder_base::DUMMY_TAG, -1),
+ m_iospace(*this, finder_base::DUMMY_TAG, -1),
m_memwidth(0),
+ m_iowidth(0),
m_allocspaces(false),
m_out_irq2_cb(*this),
m_out_irq3_cb(*this),
@@ -126,7 +125,6 @@ isa8_device::isa8_device(const machine_config &mconfig, device_type type, const
m_out_drq1_cb(*this),
m_out_drq2_cb(*this),
m_out_drq3_cb(*this),
- m_nmi_enabled(false),
m_write_iochck(*this)
{
std::fill(std::begin(m_dma_device), std::end(m_dma_device), nullptr);
@@ -202,10 +200,27 @@ void isa8_device::remap(int space_id, offs_t start, offs_t end)
}
//-------------------------------------------------
-// device_start - device-specific startup
+// device_config_complete - - perform any
+// operations now that the configuration is
+// complete
//-------------------------------------------------
-void isa8_device::device_start()
+void isa8_device::device_config_complete()
+{
+ if (m_allocspaces)
+ {
+ m_memspace.set_tag(*this, DEVICE_SELF, AS_ISA_MEM);
+ m_iospace.set_tag(*this, DEVICE_SELF, AS_ISA_IO);
+ }
+}
+
+//-------------------------------------------------
+// device_resolve_objects - resolve objects that
+// may be needed for other devices to set
+// initial conditions at start time
+//-------------------------------------------------
+
+void isa8_device::device_resolve_objects()
{
// resolve callbacks
m_write_iochck.resolve_safe();
@@ -220,20 +235,16 @@ void isa8_device::device_start()
m_out_drq2_cb.resolve_safe();
m_out_drq3_cb.resolve_safe();
- if (m_allocspaces)
- {
- m_iospace = &space(AS_ISA_IO);
- m_memspace = &space(AS_ISA_MEM);
- m_iowidth = m_iospace->data_width();
- m_memwidth = m_memspace->data_width();
- }
- else // use host CPU's program and I/O spaces directly
- {
- m_iospace = &m_maincpu->space(AS_IO);
- m_iowidth = m_maincpu->space_config(AS_IO)->data_width();
- m_memspace = &m_maincpu->space(AS_PROGRAM);
- m_memwidth = m_maincpu->space_config(AS_PROGRAM)->data_width();
- }
+ m_iowidth = m_iospace->data_width();
+ m_memwidth = m_memspace->data_width();
+}
+
+//-------------------------------------------------
+// device_start - device-specific startup
+//-------------------------------------------------
+
+void isa8_device::device_start()
+{
}
//-------------------------------------------------
@@ -252,12 +263,12 @@ template<typename R, typename W> void isa8_device::install_space(int spacenum, o
if (spacenum == AS_ISA_IO)
{
- space = m_iospace;
+ space = m_iospace.target();
buswidth = m_iowidth;
}
else if (spacenum == AS_ISA_MEM)
{
- space = m_memspace;
+ space = m_memspace.target();
buswidth = m_memwidth;
}
else
@@ -378,12 +389,18 @@ uint8_t isa8_device::dack_r(int line)
return 0xff;
}
-void isa8_device::dack_w(int line,uint8_t data)
+void isa8_device::dack_w(int line, uint8_t data)
{
if (m_dma_device[line])
return m_dma_device[line]->dack_w(line,data);
}
+void isa8_device::dack_line_w(int line, int state)
+{
+ if (m_dma_device[line])
+ m_dma_device[line]->dack_line_w(line, state);
+}
+
void isa8_device::eop_w(int channel, int state)
{
if (m_dma_eop[channel] && m_dma_device[channel])
@@ -392,18 +409,9 @@ void isa8_device::eop_w(int channel, int state)
void isa8_device::nmi()
{
- if (m_write_iochck.isnull())
- {
- if (m_nmi_enabled)
- {
- m_maincpu->pulse_input_line(INPUT_LINE_NMI, attotime::zero);
- }
- }
- else
- {
- m_write_iochck(0);
- m_write_iochck(1);
- }
+ // active low pulse
+ m_write_iochck(0);
+ m_write_iochck(1);
}
//**************************************************************************
@@ -438,9 +446,15 @@ uint8_t device_isa8_card_interface::dack_r(int line)
{
return 0;
}
-void device_isa8_card_interface::dack_w(int line,uint8_t data)
+
+void device_isa8_card_interface::dack_w(int line, uint8_t data)
{
}
+
+void device_isa8_card_interface::dack_line_w(int line, int state)
+{
+}
+
void device_isa8_card_interface::eop_w(int state)
{
}
@@ -593,7 +607,7 @@ uint16_t isa16_device::dack16_r(int line)
return 0xffff;
}
-void isa16_device::dack16_w(int line,uint16_t data)
+void isa16_device::dack16_w(int line, uint16_t data)
{
if (m_dma_device[line])
return dynamic_cast<device_isa16_card_interface *>(m_dma_device[line])->dack16_w(line,data);
@@ -647,6 +661,6 @@ uint16_t device_isa16_card_interface::dack16_r(int line)
return 0;
}
-void device_isa16_card_interface::dack16_w(int line,uint16_t data)
+void device_isa16_card_interface::dack16_w(int line, uint16_t data)
{
}
diff --git a/src/devices/bus/isa/isa.h b/src/devices/bus/isa/isa.h
index 3dc15c9df59..fff65de82f6 100644
--- a/src/devices/bus/isa/isa.h
+++ b/src/devices/bus/isa/isa.h
@@ -123,7 +123,8 @@ public:
isa8_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
// inline configuration
- template <typename T> void set_cputag(T &&tag) { m_maincpu.set_tag(std::forward<T>(tag)); }
+ template <typename T> void set_memspace(T &&tag, int spacenum) { m_memspace.set_tag(std::forward<T>(tag), spacenum); }
+ template <typename T> void set_iospace(T &&tag, int spacenum) { m_iospace.set_tag(std::forward<T>(tag), spacenum); }
auto iochck_callback() { return m_write_iochck.bind(); }
auto irq2_callback() { return m_out_irq2_cb.bind(); }
auto irq3_callback() { return m_out_irq3_cb.bind(); }
@@ -156,7 +157,7 @@ public:
bool is_option_rom_space_available(offs_t start, int size);
// FIXME: shouldn't need to expose this
- address_space &memspace() const { return m_maincpu->space(AS_PROGRAM); }
+ address_space &memspace() const { return *m_memspace; }
DECLARE_WRITE_LINE_MEMBER( irq2_w );
DECLARE_WRITE_LINE_MEMBER( irq3_w );
@@ -176,11 +177,11 @@ public:
DECLARE_WRITE8_MEMBER(io_w);
uint8_t dack_r(int line);
- void dack_w(int line,uint8_t data);
+ void dack_w(int line, uint8_t data);
+ void dack_line_w(int line, int state);
void eop_w(int channels, int state);
void nmi();
- void set_nmi_state(bool enabled) { m_nmi_enabled = enabled; }
virtual void set_dma_channel(uint8_t channel, device_isa8_card_interface *dev, bool do_eop);
@@ -196,15 +197,14 @@ protected:
template<typename R, typename W> void install_space(int spacenum, offs_t start, offs_t end, R rhandler, W whandler);
// device-level overrides
+ virtual void device_config_complete() override;
+ virtual void device_resolve_objects() override;
virtual void device_start() override;
virtual void device_reset() override;
- // internal state
- required_device<cpu_device> m_maincpu;
-
// address spaces
- address_space *m_iospace, *m_memspace;
- int m_iowidth, m_memwidth;
+ required_address_space m_memspace, m_iospace;
+ int m_memwidth, m_iowidth;
bool m_allocspaces;
devcb_write_line m_out_irq2_cb;
@@ -219,7 +219,6 @@ protected:
device_isa8_card_interface *m_dma_device[8];
bool m_dma_eop[8];
- bool m_nmi_enabled;
std::forward_list<device_slot_interface *> m_slot_list;
private:
@@ -246,7 +245,8 @@ public:
void set_isa_device();
// configuration access
virtual uint8_t dack_r(int line);
- virtual void dack_w(int line,uint8_t data);
+ virtual void dack_w(int line, uint8_t data);
+ virtual void dack_line_w(int line, int state);
virtual void eop_w(int state);
virtual void remap(int space_id, offs_t start, offs_t end) {}
@@ -325,7 +325,7 @@ public:
DECLARE_WRITE_LINE_MEMBER( drq7_w );
uint16_t dack16_r(int line);
- void dack16_w(int line,uint16_t data);
+ void dack16_w(int line, uint16_t data);
virtual void remap(int space_id, offs_t start, offs_t end) override;
// 16 bit accessors for ISA-defined address spaces
@@ -370,7 +370,7 @@ public:
// construction/destruction
virtual ~device_isa16_card_interface();
virtual uint16_t dack16_r(int line);
- virtual void dack16_w(int line,uint16_t data);
+ virtual void dack16_w(int line, uint16_t data);
void set_isa_device();
diff --git a/src/devices/bus/isa/isa_cards.cpp b/src/devices/bus/isa/isa_cards.cpp
index fbbafc0bc69..8ab0832c03d 100644
--- a/src/devices/bus/isa/isa_cards.cpp
+++ b/src/devices/bus/isa/isa_cards.cpp
@@ -31,11 +31,16 @@
#include "ide.h"
#include "xtide.h"
#include "side116.h"
-#include "aha1542.h"
+#include "aha1542b.h"
+#include "aha1542c.h"
+#include "aha174x.h"
#include "wd1002a_wx1.h"
#include "wd1007a.h"
#include "mcd.h"
#include "lbaenhancer.h"
+#include "cl_sh260.h"
+#include "bt54x.h"
+#include "dcb.h"
// sound
#include "adlib.h"
@@ -55,6 +60,7 @@
#include "ne2000.h"
#include "3c505.h"
#include "eis_sad8852.h"
+#include "np600.h"
// communication ports
#include "lpt.h"
@@ -150,7 +156,13 @@ void pc_isa16_cards(device_slot_interface &device)
// 16-bit
device.option_add("ide", ISA16_IDE);
device.option_add("ne2000", NE2000);
- device.option_add("aha1542", AHA1542);
+ device.option_add("aha1542a", AHA1542A);
+ device.option_add("aha1542b", AHA1542B);
+ device.option_add("aha1542c", AHA1542C);
+ device.option_add("aha1542cf", AHA1542CF);
+ device.option_add("aha1542cp", AHA1542CP);
+ device.option_add("aha1740", AHA1740); // actually an EISA card
+ device.option_add("aha1742a", AHA1742A); // actually an EISA card
device.option_add("gus",ISA16_GUS);
device.option_add("sblaster_16", ISA16_SOUND_BLASTER_16);
device.option_add("svga_s3", ISA16_SVGA_S3);
@@ -167,5 +179,12 @@ void pc_isa16_cards(device_slot_interface &device)
device.option_add("sb16_lle", ISA16_SB16);
device.option_add("mcd", ISA16_MCD);
device.option_add("sad8852", ISA16_SAD8852);
+ device.option_add("np600a3", NP600A3);
device.option_add("wd1007a", WD1007A);
+ device.option_add("ev346", EV346);
+ device.option_add("jc1310", JC1310);
+ device.option_add("bt542b", BT542B);
+ device.option_add("bt542bh", BT542BH);
+ device.option_add("bt545s", BT545S);
+ device.option_add("dcb", NOVELL_DCB);
}
diff --git a/src/devices/bus/isa/lbaenhancer.cpp b/src/devices/bus/isa/lbaenhancer.cpp
index 14bd28826ef..f8ebedb130c 100644
--- a/src/devices/bus/isa/lbaenhancer.cpp
+++ b/src/devices/bus/isa/lbaenhancer.cpp
@@ -84,9 +84,10 @@ const tiny_rom_entry *lba_enhancer_device::device_rom_region() const
//-------------------------------------------------
// device_add_mconfig - add device configuration
//-------------------------------------------------
-MACHINE_CONFIG_START( lba_enhancer_device::device_add_mconfig )
-// MCFG_DEVICE_ADD("lba_enhancer", lba_enhancer, 0)
-MACHINE_CONFIG_END
+void lba_enhancer_device::device_add_mconfig(machine_config &config)
+{
+// lba_enhancer(config, "lba_enhancer", 0);
+}
//-------------------------------------------------
diff --git a/src/devices/bus/isa/mc1502_fdc.cpp b/src/devices/bus/isa/mc1502_fdc.cpp
index 1b04c6be91e..3f85534a72b 100644
--- a/src/devices/bus/isa/mc1502_fdc.cpp
+++ b/src/devices/bus/isa/mc1502_fdc.cpp
@@ -12,18 +12,6 @@
#include "cpu/i86/i86.h"
#include "formats/pc_dsk.h"
-#define VERBOSE_DBG 0
-
-#define DBG_LOG(N,M,A) \
- do { \
- if(VERBOSE_DBG>=N) \
- { \
- if( M ) \
- logerror("%11.6f: %-24s",machine().time().as_double(),(char*)M ); \
- logerror A; \
- } \
- } while (0)
-
//**************************************************************************
// DEVICE DEFINITIONS
diff --git a/src/devices/bus/isa/mda.cpp b/src/devices/bus/isa/mda.cpp
index 35e382cc981..f1f6cae6257 100644
--- a/src/devices/bus/isa/mda.cpp
+++ b/src/devices/bus/isa/mda.cpp
@@ -22,7 +22,7 @@
#define VERBOSE_MDA 0 /* MDA (Monochrome Display Adapter) */
-#define MDA_CLOCK 16257000
+#define MDA_CLOCK 16.257_MHz_XTAL
#define MDA_LOG(N,M,A) \
do { \
@@ -107,12 +107,13 @@ DEFINE_DEVICE_TYPE(ISA8_MDA, isa8_mda_device, "isa_ibm_mda", "IBM Monochrome Dis
// device_add_mconfig - add device configuration
//-------------------------------------------------
-MACHINE_CONFIG_START(isa8_mda_device::device_add_mconfig)
- MCFG_SCREEN_ADD( MDA_SCREEN_NAME, RASTER)
- MCFG_SCREEN_RAW_PARAMS(MDA_CLOCK, 882, 0, 720, 370, 0, 350 )
- MCFG_SCREEN_UPDATE_DEVICE( MC6845_NAME, mc6845_device, screen_update )
+void isa8_mda_device::device_add_mconfig(machine_config &config)
+{
+ screen_device &screen(SCREEN(config, MDA_SCREEN_NAME, SCREEN_TYPE_RASTER));
+ screen.set_raw(MDA_CLOCK, 882, 0, 720, 370, 0, 350);
+ screen.set_screen_update(MC6845_NAME, FUNC(mc6845_device::screen_update));
- MCFG_PALETTE_ADD( "palette", 4 )
+ PALETTE(config, m_palette).set_entries(4);
MC6845(config, m_crtc, MDA_CLOCK/9);
m_crtc->set_screen(MDA_SCREEN_NAME);
@@ -122,11 +123,11 @@ MACHINE_CONFIG_START(isa8_mda_device::device_add_mconfig)
m_crtc->out_hsync_callback().set(FUNC(isa8_mda_device::hsync_changed));
m_crtc->out_vsync_callback().set(FUNC(isa8_mda_device::vsync_changed));
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_pcmda)
+ GFXDECODE(config, "gfxdecode", m_palette, gfx_pcmda);
PC_LPT(config, m_lpt);
m_lpt->irq_handler().set(FUNC(isa8_mda_device::pc_cpu_line));
-MACHINE_CONFIG_END
+}
//-------------------------------------------------
// rom_region - device-specific ROM region
@@ -462,10 +463,10 @@ WRITE8_MEMBER( isa8_mda_device::io_write)
switch( offset )
{
case 0: case 2: case 4: case 6:
- m_crtc->address_w( space, offset, data );
+ m_crtc->address_w(data);
break;
case 1: case 3: case 5: case 7:
- m_crtc->register_w( space, offset, data );
+ m_crtc->register_w(data);
break;
case 8:
mode_control_w(space, offset, data);
@@ -485,7 +486,7 @@ READ8_MEMBER( isa8_mda_device::io_read)
/* return last written mc6845 address value here? */
break;
case 1: case 3: case 5: case 7:
- data = m_crtc->register_r( space, offset );
+ data = m_crtc->register_r();
break;
case 10:
data = status_r(space, offset);
@@ -532,12 +533,13 @@ DEFINE_DEVICE_TYPE(ISA8_HERCULES, isa8_hercules_device, "isa_hercules", "Hercule
// device_add_mconfig - add device configuration
//-------------------------------------------------
-MACHINE_CONFIG_START(isa8_hercules_device::device_add_mconfig)
- MCFG_SCREEN_ADD( HERCULES_SCREEN_NAME, RASTER)
- MCFG_SCREEN_RAW_PARAMS(MDA_CLOCK, 882, 0, 720, 370, 0, 350 )
- MCFG_SCREEN_UPDATE_DEVICE( MC6845_NAME, mc6845_device, screen_update )
+void isa8_hercules_device::device_add_mconfig(machine_config &config)
+{
+ screen_device &screen(SCREEN(config, HERCULES_SCREEN_NAME, SCREEN_TYPE_RASTER));
+ screen.set_raw(MDA_CLOCK, 882, 0, 720, 370, 0, 350);
+ screen.set_screen_update(MC6845_NAME, FUNC(mc6845_device::screen_update));
- MCFG_PALETTE_ADD( "palette", 4 )
+ PALETTE(config, m_palette).set_entries(4);
MC6845(config, m_crtc, MDA_CLOCK/9);
m_crtc->set_screen(HERCULES_SCREEN_NAME);
@@ -547,11 +549,11 @@ MACHINE_CONFIG_START(isa8_hercules_device::device_add_mconfig)
m_crtc->out_hsync_callback().set(FUNC(isa8_mda_device::hsync_changed));
m_crtc->out_vsync_callback().set(FUNC(isa8_mda_device::vsync_changed));
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_pcherc)
+ GFXDECODE(config, "gfxdecode", m_palette, gfx_pcherc);
PC_LPT(config, m_lpt);
m_lpt->irq_handler().set(FUNC(isa8_mda_device::pc_cpu_line));
-MACHINE_CONFIG_END
+}
//-------------------------------------------------
// rom_region - device-specific ROM region
@@ -677,10 +679,10 @@ WRITE8_MEMBER( isa8_hercules_device::io_write )
switch( offset )
{
case 0: case 2: case 4: case 6:
- m_crtc->address_w( space, offset, data );
+ m_crtc->address_w(data);
break;
case 1: case 3: case 5: case 7:
- m_crtc->register_w( space, offset, data );
+ m_crtc->register_w(data);
break;
case 8:
mode_control_w(space, offset, data);
@@ -724,7 +726,7 @@ READ8_MEMBER( isa8_hercules_device::io_read )
/* return last written mc6845 address value here? */
break;
case 1: case 3: case 5: case 7:
- data = m_crtc->register_r( space, offset );
+ data = m_crtc->register_r();
break;
case 10:
data = status_r(space, offset);
@@ -745,12 +747,13 @@ DEFINE_DEVICE_TYPE(ISA8_EC1840_0002, isa8_ec1840_0002_device, "ec1840_0002", "EC
//-------------------------------------------------
// XXX
-MACHINE_CONFIG_START(isa8_ec1840_0002_device::device_add_mconfig)
- MCFG_SCREEN_ADD( MDA_SCREEN_NAME, RASTER)
- MCFG_SCREEN_RAW_PARAMS(MDA_CLOCK, 792, 0, 640, 370, 0, 350 )
- MCFG_SCREEN_UPDATE_DEVICE( MC6845_NAME, mc6845_device, screen_update )
+void isa8_ec1840_0002_device::device_add_mconfig(machine_config &config)
+{
+ screen_device &screen(SCREEN(config, MDA_SCREEN_NAME, SCREEN_TYPE_RASTER));
+ screen.set_raw(MDA_CLOCK, 792, 0, 640, 370, 0, 350);
+ screen.set_screen_update(MC6845_NAME, FUNC(mc6845_device::screen_update));
- MCFG_PALETTE_ADD( "palette", 4 )
+ PALETTE(config, m_palette).set_entries(4);
MC6845(config, m_crtc, MDA_CLOCK/8);
m_crtc->set_screen(MDA_SCREEN_NAME);
@@ -759,7 +762,7 @@ MACHINE_CONFIG_START(isa8_ec1840_0002_device::device_add_mconfig)
m_crtc->set_update_row_callback(FUNC(isa8_mda_device::crtc_update_row), this);
m_crtc->out_hsync_callback().set(FUNC(isa8_mda_device::hsync_changed));
m_crtc->out_vsync_callback().set(FUNC(isa8_mda_device::vsync_changed));
-MACHINE_CONFIG_END
+}
//-------------------------------------------------
// isa8_ec1840_0002_device - constructor
diff --git a/src/devices/bus/isa/mufdc.cpp b/src/devices/bus/isa/mufdc.cpp
index 8930a080d8f..3e40653e175 100644
--- a/src/devices/bus/isa/mufdc.cpp
+++ b/src/devices/bus/isa/mufdc.cpp
@@ -195,6 +195,11 @@ void mufdc_device::dack_w(int line, uint8_t data)
return m_fdc->dma_w(data);
}
+void mufdc_device::dack_line_w(int line, int state)
+{
+ //m_fdc->dack_w(state);
+}
+
void mufdc_device::eop_w(int state)
{
m_fdc->tc_w(state == ASSERT_LINE);
diff --git a/src/devices/bus/isa/mufdc.h b/src/devices/bus/isa/mufdc.h
index 4d042a58834..2fa000757e4 100644
--- a/src/devices/bus/isa/mufdc.h
+++ b/src/devices/bus/isa/mufdc.h
@@ -47,6 +47,7 @@ protected:
// device_isa8_card_interface
virtual uint8_t dack_r(int line) override;
virtual void dack_w(int line, uint8_t data) override;
+ virtual void dack_line_w(int line, int state) override;
virtual void eop_w(int state) override;
private:
diff --git a/src/devices/bus/isa/ne1000.cpp b/src/devices/bus/isa/ne1000.cpp
index 7723ad75a88..1eaef942105 100644
--- a/src/devices/bus/isa/ne1000.cpp
+++ b/src/devices/bus/isa/ne1000.cpp
@@ -6,12 +6,13 @@
DEFINE_DEVICE_TYPE(NE1000, ne1000_device, "ne1000", "NE1000 Network Adapter")
-MACHINE_CONFIG_START(ne1000_device::device_add_mconfig)
- MCFG_DEVICE_ADD("dp8390d", DP8390D, 0)
- MCFG_DP8390D_IRQ_CB(WRITELINE(*this, ne1000_device, ne1000_irq_w))
- MCFG_DP8390D_MEM_READ_CB(READ8(*this, ne1000_device, ne1000_mem_read))
- MCFG_DP8390D_MEM_WRITE_CB(WRITE8(*this, ne1000_device, ne1000_mem_write))
-MACHINE_CONFIG_END
+void ne1000_device::device_add_mconfig(machine_config &config)
+{
+ DP8390D(config, m_dp8390, 0);
+ m_dp8390->irq_callback().set(FUNC(ne1000_device::ne1000_irq_w));
+ m_dp8390->mem_read_callback().set(FUNC(ne1000_device::ne1000_mem_read));
+ m_dp8390->mem_write_callback().set(FUNC(ne1000_device::ne1000_mem_write));
+}
ne1000_device::ne1000_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
: device_t(mconfig, NE1000, tag, owner, clock),
diff --git a/src/devices/bus/isa/ne2000.cpp b/src/devices/bus/isa/ne2000.cpp
index 5de941accc2..3ad2cc592ef 100644
--- a/src/devices/bus/isa/ne2000.cpp
+++ b/src/devices/bus/isa/ne2000.cpp
@@ -6,12 +6,13 @@
DEFINE_DEVICE_TYPE(NE2000, ne2000_device, "ne2000", "NE2000 Network Adapter")
-MACHINE_CONFIG_START(ne2000_device::device_add_mconfig)
- MCFG_DEVICE_ADD("dp8390d", DP8390D, 0)
- MCFG_DP8390D_IRQ_CB(WRITELINE(*this, ne2000_device, ne2000_irq_w))
- MCFG_DP8390D_MEM_READ_CB(READ8(*this, ne2000_device, ne2000_mem_read))
- MCFG_DP8390D_MEM_WRITE_CB(WRITE8(*this, ne2000_device, ne2000_mem_write))
-MACHINE_CONFIG_END
+void ne2000_device::device_add_mconfig(machine_config &config)
+{
+ DP8390D(config, m_dp8390, 0);
+ m_dp8390->irq_callback().set(FUNC(ne2000_device::ne2000_irq_w));
+ m_dp8390->mem_read_callback().set(FUNC(ne2000_device::ne2000_mem_read));
+ m_dp8390->mem_write_callback().set(FUNC(ne2000_device::ne2000_mem_write));
+}
ne2000_device::ne2000_device(const machine_config& mconfig, const char* tag, device_t* owner, uint32_t clock)
: device_t(mconfig, NE2000, tag, owner, clock),
diff --git a/src/devices/bus/isa/np600.cpp b/src/devices/bus/isa/np600.cpp
new file mode 100644
index 00000000000..064c1d40191
--- /dev/null
+++ b/src/devices/bus/isa/np600.cpp
@@ -0,0 +1,76 @@
+// license:BSD-3-Clause
+// copyright-holders:AJR
+/*********************************************************************
+
+ InterLan NP600 Intelligent Protocol Processor
+
+*********************************************************************/
+
+#include "emu.h"
+#include "np600.h"
+
+#include "cpu/i86/i186.h"
+#include "machine/74259.h"
+//#include "machine/i82586.h"
+
+DEFINE_DEVICE_TYPE(NP600A3, np600a3_device, "np600a3", "InterLan NP600A-3 Intelligent Protocol Processor")
+
+np600a3_device::np600a3_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
+ : device_t(mconfig, NP600A3, tag, owner, clock)
+ , device_isa16_card_interface(mconfig, *this)
+ , m_npcpu(*this, "npcpu")
+{
+}
+
+void np600a3_device::device_start()
+{
+}
+
+u16 np600a3_device::status_r()
+{
+ return 0;
+}
+
+void np600a3_device::mem_map(address_map &map)
+{
+ map(0x00000, 0x7ffff).ram(); // GM71256-12 x16
+ map(0xfc000, 0xfffff).rom().region("npcpu", 0);
+}
+
+void np600a3_device::io_map(address_map &map)
+{
+ map(0x0070, 0x007f).w("latch70", FUNC(ls259_device::write_a0));
+ map(0x0080, 0x0081).r(FUNC(np600a3_device::status_r));
+}
+
+void np600a3_device::device_add_mconfig(machine_config &config)
+{
+ I80186(config, m_npcpu, 16_MHz_XTAL);
+ m_npcpu->set_addrmap(AS_PROGRAM, &np600a3_device::mem_map);
+ m_npcpu->set_addrmap(AS_IO, &np600a3_device::io_map);
+
+ LS259(config, "latch70"); // U28
+
+ //I82586(config, "enet", 20_MHz_XTAL);
+}
+
+ROM_START(np600a3)
+ ROM_REGION(0x4000, "npcpu", 0)
+ ROM_LOAD16_BYTE("258-0032-00_rev_ba.u38", 0x0000, 0x2000, CRC(84ccb317) SHA1(3ecc8e265336f5d3b0f276f18dd1b7001778f2c3))
+ ROM_LOAD16_BYTE("258-0033-00_rev_ba.u39", 0x0001, 0x2000, CRC(0e0f726c) SHA1(520773e235a826438b025381cd3861df86d4965d))
+
+ // Undumped small devices (mostly or all PLDs):
+ // 258-0037-00 REV AA (U17, 20 pins)
+ // 258-0027-01 REV AB (U20, 20 pins)
+ // 020701079BFA (U29, 16 pins)
+ // 258-0031-00 REV AC (U34, PAL20xx, 24 pins)
+ // 258-0030-00 REV AA (U36, 20 pins)
+ // 258-0028-01 REV AA (U44, 20 pins)
+ // 258-0029-01 REV AA (U46, 20 pins)
+ // 258-0089-00 REV AA (U48, 20 pins)
+ROM_END
+
+const tiny_rom_entry *np600a3_device::device_rom_region() const
+{
+ return ROM_NAME(np600a3);
+}
diff --git a/src/devices/bus/isa/np600.h b/src/devices/bus/isa/np600.h
new file mode 100644
index 00000000000..7831d804922
--- /dev/null
+++ b/src/devices/bus/isa/np600.h
@@ -0,0 +1,39 @@
+// license:BSD-3-Clause
+// copyright-holders:AJR
+/*********************************************************************
+
+ InterLan NP600 Intelligent Protocol Processor
+
+*********************************************************************/
+
+#ifndef MAME_BUS_ISA_NP600_H
+#define MAME_BUS_ISA_NP600_H
+
+#pragma once
+
+#include "isa.h"
+
+class np600a3_device : public device_t, public device_isa16_card_interface
+{
+public:
+ np600a3_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
+
+ static constexpr feature_type unemulated_features() { return feature::LAN; }
+
+protected:
+ virtual void device_start() override;
+ virtual void device_add_mconfig(machine_config &config) override;
+ virtual const tiny_rom_entry *device_rom_region() const override;
+
+private:
+ u16 status_r();
+
+ void mem_map(address_map &map);
+ void io_map(address_map &map);
+
+ required_device<cpu_device> m_npcpu;
+};
+
+DECLARE_DEVICE_TYPE(NP600A3, np600a3_device)
+
+#endif // MAME_BUS_ISA_NP600_H
diff --git a/src/devices/bus/isa/num9rev.cpp b/src/devices/bus/isa/num9rev.cpp
index baf30cca586..ebe44a379f4 100644
--- a/src/devices/bus/isa/num9rev.cpp
+++ b/src/devices/bus/isa/num9rev.cpp
@@ -53,19 +53,20 @@ UPD7220_DISPLAY_PIXELS_MEMBER( isa8_number_9_rev_device::hgdc_display_pixels )
// device_add_mconfig - add device configuration
//-------------------------------------------------
-MACHINE_CONFIG_START(isa8_number_9_rev_device::device_add_mconfig)
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_SIZE(512, 448)
- MCFG_SCREEN_VISIBLE_AREA(0, 512-1, 0, 448-1)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_UPDATE_DRIVER(isa8_number_9_rev_device, screen_update)
- MCFG_PALETTE_ADD("palette", 4096)
+void isa8_number_9_rev_device::device_add_mconfig(machine_config &config)
+{
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_size(512, 448);
+ screen.set_visarea(0, 512-1, 0, 448-1);
+ screen.set_refresh_hz(60);
+ screen.set_screen_update(FUNC(isa8_number_9_rev_device::screen_update));
+ PALETTE(config, m_palette).set_entries(4096);
UPD7220(config, m_upd7220, XTAL(4'433'619)/2); // unknown clock
m_upd7220->set_addrmap(0, &isa8_number_9_rev_device::upd7220_map);
- m_upd7220->set_display_pixels_callback(FUNC(isa8_number_9_rev_device::hgdc_display_pixels), this);
+ m_upd7220->set_display_pixels(FUNC(isa8_number_9_rev_device::hgdc_display_pixels));
m_upd7220->set_screen("screen");
-MACHINE_CONFIG_END
+}
//**************************************************************************
// LIVE DEVICE
@@ -93,7 +94,7 @@ void isa8_number_9_rev_device::device_start()
{
set_isa_device();
- m_isa->install_memory(0xc0000, 0xc0001, read8_delegate(FUNC(upd7220_device::read), (upd7220_device *)m_upd7220), write8_delegate(FUNC(upd7220_device::write), (upd7220_device *)m_upd7220));
+ m_isa->install_memory(0xc0000, 0xc0001, read8sm_delegate(FUNC(upd7220_device::read), (upd7220_device *)m_upd7220), write8sm_delegate(FUNC(upd7220_device::write), (upd7220_device *)m_upd7220));
m_isa->install_memory(0xc0100, 0xc03ff, read8_delegate(FUNC(isa8_number_9_rev_device::pal8_r), this), write8_delegate(FUNC(isa8_number_9_rev_device::pal8_w), this));
m_isa->install_memory(0xc0400, 0xc0401, read8_delegate(FUNC(isa8_number_9_rev_device::bank_r), this), write8_delegate(FUNC(isa8_number_9_rev_device::bank_w), this));
m_isa->install_memory(0xc0500, 0xc06ff, read8_delegate(FUNC(isa8_number_9_rev_device::overlay_r), this), write8_delegate(FUNC(isa8_number_9_rev_device::overlay_w), this));
diff --git a/src/devices/bus/isa/omti8621.cpp b/src/devices/bus/isa/omti8621.cpp
index 9eebabb188f..bea87f420ee 100644
--- a/src/devices/bus/isa/omti8621.cpp
+++ b/src/devices/bus/isa/omti8621.cpp
@@ -1285,6 +1285,11 @@ void omti8621_device::dack_w(int line, uint8_t data)
return m_fdc->dma_w(data);
}
+void omti8621_device::dack_line_w(int line, int state)
+{
+ //m_fdc->dack_w(state);
+}
+
void omti8621_device::eop_w(int state)
{
m_fdc->tc_w(state == ASSERT_LINE);
diff --git a/src/devices/bus/isa/omti8621.h b/src/devices/bus/isa/omti8621.h
index 070ae2dbe70..1258af71854 100644
--- a/src/devices/bus/isa/omti8621.h
+++ b/src/devices/bus/isa/omti8621.h
@@ -56,6 +56,7 @@ protected:
virtual uint8_t dack_r(int line) override;
virtual void dack_w(int line, uint8_t data) override;
+ virtual void dack_line_w(int line, int state) override;
virtual void eop_w(int state) override;
void set_interrupt(enum line_state line_state);
diff --git a/src/devices/bus/isa/p1_fdc.cpp b/src/devices/bus/isa/p1_fdc.cpp
index df53cdb7629..9b62451e65a 100644
--- a/src/devices/bus/isa/p1_fdc.cpp
+++ b/src/devices/bus/isa/p1_fdc.cpp
@@ -12,18 +12,6 @@
#include "cpu/i86/i86.h"
#include "formats/pc_dsk.h"
-#define VERBOSE_DBG 0
-
-#define DBG_LOG(N,M,A) \
- do { \
- if(VERBOSE_DBG>=N) \
- { \
- if( M ) \
- logerror("%11.6f: %-24s",machine().time().as_double(),(char*)M ); \
- logerror A; \
- } \
- } while (0)
-
//**************************************************************************
// DEVICE DEFINITIONS
@@ -87,7 +75,6 @@ const tiny_rom_entry *p1_fdc_device::device_rom_region() const
uint8_t p1_fdc_device::p1_wd17xx_motor_r()
{
- DBG_LOG(1, "p1_fdc_motor_r", ("R = $%02x\n", 0));
// XXX always on for now
return 0;
}
@@ -118,8 +105,6 @@ uint8_t p1_fdc_device::p1_wd17xx_aux_r()
*/
void p1_fdc_device::p1_wd17xx_aux_w(int data)
{
- DBG_LOG(1, "p1_fdc_aux_w", ("W $%02x\n", data));
-
floppy_image_device *floppy0 = m_fdc->subdevice<floppy_connector>("0")->get_device();
floppy_image_device *floppy1 = m_fdc->subdevice<floppy_connector>("1")->get_device();
floppy_image_device *floppy = ((data & 2) ? floppy1 : floppy0);
diff --git a/src/devices/bus/isa/p1_hdc.cpp b/src/devices/bus/isa/p1_hdc.cpp
index d0971e6c3c6..129c7a6ce37 100644
--- a/src/devices/bus/isa/p1_hdc.cpp
+++ b/src/devices/bus/isa/p1_hdc.cpp
@@ -14,17 +14,14 @@
// MACROS / CONSTANTS
//**************************************************************************
-#define VERBOSE_DBG 1
+//#define LOG_GENERAL (1U << 0) //defined in logmacro.h already
+#define LOG_DEBUG (1U << 1)
-#define DBG_LOG(N,M,A) \
- do { \
- if(VERBOSE_DBG>=N) \
- { \
- if( M ) \
- logerror("%11.6f: %-24s",machine().time().as_double(),(char*)M ); \
- logerror A; \
- } \
- } while (0)
+//#define VERBOSE (LOG_DEBUG)
+//#define LOG_OUTPUT_FUNC printf
+#include "logmacro.h"
+
+#define LOGDBG(...) LOGMASKED(LOG_DEBUG, __VA_ARGS__)
//**************************************************************************
@@ -92,20 +89,21 @@ READ8_MEMBER(p1_hdc_device::p1_HDC_r)
switch (offset >> 8)
{
case 8:
- data = m_hdc->read(space, offset & 255);
+ data = m_hdc->read(offset & 255);
}
- DBG_LOG(1, "hdc", ("R $%04x == $%02x\n", offset, data));
+ LOG("hdc R $%04x == $%02x\n", offset, data);
return data;
}
WRITE8_MEMBER(p1_hdc_device::p1_HDC_w)
{
- DBG_LOG(1, "hdc", ("W $%04x <- $%02x\n", offset, data));
+ LOG("hdc W $%04x <- $%02x\n", offset, data);
+
switch (offset >> 8)
{
case 8:
- m_hdc->write(space, offset & 255, data, 0);
+ m_hdc->write(offset & 255, data);
}
}
diff --git a/src/devices/bus/isa/p1_sound.cpp b/src/devices/bus/isa/p1_sound.cpp
index 485dca5205e..b8e37a57368 100644
--- a/src/devices/bus/isa/p1_sound.cpp
+++ b/src/devices/bus/isa/p1_sound.cpp
@@ -29,15 +29,15 @@ DEFINE_DEVICE_TYPE(P1_SOUND, p1_sound_device, "p1_sound", "Poisk-1 sound card (B
// device_add_mconfig - add device configuration
//-------------------------------------------------
-MACHINE_CONFIG_START(p1_sound_device::device_add_mconfig)
+void p1_sound_device::device_add_mconfig(machine_config &config)
+{
I8251(config, m_midi, 0);
m_midi->txd_handler().set("mdout", FUNC(midi_port_device::write_txd));
m_midi->rxrdy_handler().set(":isa", FUNC(isa8_device::irq3_w));
- MCFG_MIDI_PORT_ADD("mdin", midiin_slot, "midiin")
- MCFG_MIDI_RX_HANDLER(WRITELINE("midi", i8251_device, write_rxd))
+ MIDI_PORT(config, "mdin", midiin_slot, "midiin").rxd_handler().set(m_midi, FUNC(i8251_device::write_rxd));
- MCFG_MIDI_PORT_ADD("mdout", midiout_slot, "midiout")
+ MIDI_PORT(config, "mdout", midiout_slot, "midiout");
PIT8253(config, m_d14, 0);
m_d14->set_clk<0>(XTAL(12'500'000)/10);
@@ -65,12 +65,12 @@ MACHINE_CONFIG_START(p1_sound_device::device_add_mconfig)
// m_d17->out_handler<2>().set(FUNC(XXX));
SPEAKER(config, "speaker").front_center();
- MCFG_DEVICE_ADD("filter", FILTER_RC)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 1.0)
- MCFG_DEVICE_ADD("dac", DAC_8BIT_R2R, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "filter", 0.5) // unknown DAC
- MCFG_DEVICE_ADD("vref", VOLTAGE_REGULATOR, 0) MCFG_VOLTAGE_REGULATOR_OUTPUT(5.0)
- MCFG_SOUND_ROUTE(0, "dac", 1.0, DAC_VREF_POS_INPUT) MCFG_SOUND_ROUTE(0, "dac", -1.0, DAC_VREF_NEG_INPUT)
-MACHINE_CONFIG_END
+ FILTER_RC(config, m_filter).add_route(ALL_OUTPUTS, "speaker", 1.0);
+ DAC_8BIT_R2R(config, m_dac, 0).add_route(ALL_OUTPUTS, "filter", 0.5); // unknown DAC
+ voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref"));
+ vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT);
+ vref.add_route(0, "dac", -1.0, DAC_VREF_NEG_INPUT);
+}
//**************************************************************************
diff --git a/src/devices/bus/isa/pc1640_iga.cpp b/src/devices/bus/isa/pc1640_iga.cpp
index 04ef54c2d42..dfab59f2e76 100644
--- a/src/devices/bus/isa/pc1640_iga.cpp
+++ b/src/devices/bus/isa/pc1640_iga.cpp
@@ -28,8 +28,6 @@
//**************************************************************************
#define PEGA1A_TAG "ic910"
-#define EGA_CRTC_NAME "crtc_ega_ega"
-
//**************************************************************************
@@ -103,8 +101,6 @@ void isa8_pc1640_iga_device::device_start()
m_plane[2] = m_videoram + 0x20000;
m_plane[3] = m_videoram + 0x30000;
- m_crtc_ega = subdevice<crtc_ega_device>(EGA_CRTC_NAME);
-
m_isa->install_rom(this, 0xc0000, 0xc7fff, "ega", "iga");
m_isa->install_device(0x3b0, 0x3bf, read8_delegate(FUNC(isa8_ega_device::pc_ega8_3b0_r), this), write8_delegate(FUNC(isa8_ega_device::pc_ega8_3b0_w), this));
m_isa->install_device(0x3c0, 0x3cf, read8_delegate(FUNC(isa8_ega_device::pc_ega8_3c0_r), this), write8_delegate(FUNC(isa8_ega_device::pc_ega8_3c0_w), this));
diff --git a/src/devices/bus/isa/pds.cpp b/src/devices/bus/isa/pds.cpp
index 45dffd9904e..65a35db2b14 100644
--- a/src/devices/bus/isa/pds.cpp
+++ b/src/devices/bus/isa/pds.cpp
@@ -56,6 +56,7 @@ void isa8_pds_device::device_stop()
{
}
-MACHINE_CONFIG_START(isa8_pds_device::device_add_mconfig)
- MCFG_DEVICE_ADD("pds_ppi", I8255, 0)
-MACHINE_CONFIG_END
+void isa8_pds_device::device_add_mconfig(machine_config &config)
+{
+ I8255(config, m_ppi);
+}
diff --git a/src/devices/bus/isa/pgc.cpp b/src/devices/bus/isa/pgc.cpp
index ab242877e01..d90badaeae7 100644
--- a/src/devices/bus/isa/pgc.cpp
+++ b/src/devices/bus/isa/pgc.cpp
@@ -151,30 +151,31 @@ DEFINE_DEVICE_TYPE(ISA8_PGC, isa8_pgc_device, "isa_ibm_pgc", "IBM Professional G
// device_add_mconfig - add device configuration
//-------------------------------------------------
-MACHINE_CONFIG_START(isa8_pgc_device::device_add_mconfig)
- MCFG_DEVICE_ADD("maincpu", I8088, XTAL(24'000'000)/3)
- MCFG_DEVICE_PROGRAM_MAP(pgc_map)
+void isa8_pgc_device::device_add_mconfig(machine_config &config)
+{
+ I8088(config, m_cpu, XTAL(24'000'000)/3);
+ m_cpu->set_addrmap(AS_PROGRAM, &isa8_pgc_device::pgc_map);
#if 0
- MCFG_DEVICE_IRQ_ACKNOWLEDGE_DRIVER(isa8_pgc_device, irq_callback)
+ m_cpu->set_irq_acknowledge_callback(FUNC(isa8_pgc_device::irq_callback));
#endif
- MCFG_TIMER_DRIVER_ADD_PERIODIC("scantimer", isa8_pgc_device, scanline_callback,
- attotime::from_hz(60*PGC_TOTAL_VERT))
- MCFG_TIMER_START_DELAY(attotime::from_hz(XTAL(50'000'000)/(2*PGC_HORZ_START)))
+ timer_device &scantimer(TIMER(config, "scantimer"));
+ scantimer.configure_periodic(FUNC(isa8_pgc_device::scanline_callback), attotime::from_hz(60*PGC_TOTAL_VERT));
+ scantimer.set_start_delay(attotime::from_hz(XTAL(50'000'000)/(2*PGC_HORZ_START)));
- MCFG_SCREEN_ADD(PGC_SCREEN_NAME, RASTER)
- MCFG_SCREEN_RAW_PARAMS(XTAL(50'000'000)/2,
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_raw(XTAL(50'000'000)/2,
PGC_TOTAL_HORZ, PGC_HORZ_START, PGC_HORZ_START+PGC_DISP_HORZ,
- PGC_TOTAL_VERT, PGC_VERT_START, PGC_VERT_START+PGC_DISP_VERT)
- MCFG_SCREEN_UPDATE_DRIVER(isa8_pgc_device, screen_update)
- MCFG_SCREEN_PALETTE("palette")
+ PGC_TOTAL_VERT, PGC_VERT_START, PGC_VERT_START+PGC_DISP_VERT);
+ m_screen->set_screen_update(FUNC(isa8_pgc_device::screen_update));
+ m_screen->set_palette(m_palette);
#if 0
- MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE(*this, isa8_pgc_device, vblank_irq))
+ m_screen->screen_vblank().set(FUNC(isa8_pgc_device::vblank_irq));
#endif
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_pgc)
- MCFG_PALETTE_ADD( "palette", 256 )
-MACHINE_CONFIG_END
+ GFXDECODE(config, "gfxdecode", m_palette, gfx_pgc);
+ PALETTE(config, m_palette).set_entries(256);
+}
//-------------------------------------------------
// rom_region - device-specific ROM region
diff --git a/src/devices/bus/isa/sb16.cpp b/src/devices/bus/isa/sb16.cpp
index be8cce9c644..6bce4b4198c 100644
--- a/src/devices/bus/isa/sb16.cpp
+++ b/src/devices/bus/isa/sb16.cpp
@@ -711,9 +711,9 @@ void sb16_lle_device::device_start()
m_isa->install_device(0x022c, 0x022d, read8_delegate(FUNC(sb16_lle_device::dsp_wbuf_status_r), this), write8_delegate(FUNC(sb16_lle_device::host_cmd_w), this) );
m_isa->install_device(0x022e, 0x022f, read8_delegate(FUNC(sb16_lle_device::dsp_rbuf_status_r), this), write8_delegate(FUNC(sb16_lle_device::invalid_w), this) );
m_isa->install_device(0x0330, 0x0331, read8_delegate(FUNC(sb16_lle_device::mpu401_r), this), write8_delegate(FUNC(sb16_lle_device::mpu401_w), this));
- m_isa->install_device(0x0388, 0x0389, read8_delegate(FUNC(ymf262_device::read), ymf262), write8_delegate(FUNC(ymf262_device::write), ymf262));
- m_isa->install_device(0x0220, 0x0223, read8_delegate(FUNC(ymf262_device::read), ymf262), write8_delegate(FUNC(ymf262_device::write), ymf262));
- m_isa->install_device(0x0228, 0x0229, read8_delegate(FUNC(ymf262_device::read), ymf262), write8_delegate(FUNC(ymf262_device::write), ymf262));
+ m_isa->install_device(0x0388, 0x0389, read8sm_delegate(FUNC(ymf262_device::read), ymf262), write8sm_delegate(FUNC(ymf262_device::write), ymf262));
+ m_isa->install_device(0x0220, 0x0223, read8sm_delegate(FUNC(ymf262_device::read), ymf262), write8sm_delegate(FUNC(ymf262_device::write), ymf262));
+ m_isa->install_device(0x0228, 0x0229, read8sm_delegate(FUNC(ymf262_device::read), ymf262), write8sm_delegate(FUNC(ymf262_device::write), ymf262));
m_isa->set_dma_channel(1, this, false);
m_isa->set_dma_channel(5, this, false);
m_timer = timer_alloc();
diff --git a/src/devices/bus/isa/sblaster.cpp b/src/devices/bus/isa/sblaster.cpp
index 74f1e0f8dd4..d8a47349918 100644
--- a/src/devices/bus/isa/sblaster.cpp
+++ b/src/devices/bus/isa/sblaster.cpp
@@ -66,7 +66,7 @@ static const int m_cmd_fifo_length[256] =
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 6x */
-1, -1, -1, -1, 3, 3, 3, 3, -1, -1, -1, -1, -1, 1, -1, 1, /* 7x */
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 8x */
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 9x */
+ 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 9x */
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* Ax */
4, -1, -1, -1, -1, -1, 4, -1, 4, -1, -1, -1, -1, -1, 4, -1, /* Bx */
4, -1, -1, -1, -1, -1, 4, -1, 4, -1, -1, -1, -1, -1, 4, -1, /* Cx */
@@ -82,7 +82,7 @@ READ8_MEMBER( sb8_device::ym3812_16_r )
uint8_t retVal = 0xff;
switch(offset)
{
- case 0 : retVal = m_ym3812->status_port_r( space, offset ); break;
+ case 0 : retVal = m_ym3812->status_port_r(); break;
}
return retVal;
}
@@ -91,8 +91,8 @@ WRITE8_MEMBER( sb8_device::ym3812_16_w )
{
switch(offset)
{
- case 0 : m_ym3812->control_port_w( space, offset, data ); break;
- case 1 : m_ym3812->write_port_w( space, offset, data ); break;
+ case 0 : m_ym3812->control_port_w(data); break;
+ case 1 : m_ym3812->write_port_w(data); break;
}
}
@@ -356,6 +356,7 @@ void sb_device::process_fifo(uint8_t cmd)
break;
case 0x1c: // 8-bit DMA with autoinit
+ case 0x90: // 8-bit DMA with autoinit, high speed. XXX only on DSP 3.xx
// printf("Start DMA (autoinit, size = %x)\n", m_dsp.dma_length);
m_dsp.dma_transferred = 0;
m_dsp.dma_autoinit = 1;
@@ -583,23 +584,20 @@ void sb_device::process_fifo(uint8_t cmd)
mode = m_dsp.fifo[1];
m_dsp.flags = 0;
m_dsp.dma_length = (m_dsp.fifo[2] + (m_dsp.fifo[3]<<8)) + 1;
- if((cmd & 0xf0) == 0xb0)
- {
- m_dsp.flags |= SIXTEENBIT;
- m_dsp.dma_length <<= 1;
- drq16_w(1);
- }
- else
- drq_w(1);
if(cmd & 0x04)
m_dsp.dma_autoinit = 1;
if(mode & 0x10)
m_dsp.flags |= SIGNED;
if(mode & 0x20)
- {
m_dsp.flags |= STEREO;
+ if((cmd & 0xf0) == 0xb0)
+ {
+ m_dsp.flags |= SIXTEENBIT;
m_dsp.dma_length <<= 1;
+ drq16_w(1);
}
+ else
+ drq_w(1);
m_dsp.dma_transferred = 0;
m_dsp.dma_timer_started = false;
m_dsp.dma_throttled = false;
@@ -1149,7 +1147,6 @@ void sb_device::common(machine_config &config)
DAC_16BIT_R2R(config, m_ldac, 0).add_route(ALL_OUTPUTS, "lspeaker", 0.5); // unknown DAC
DAC_16BIT_R2R(config, m_rdac, 0).add_route(ALL_OUTPUTS, "rspeaker", 0.5); // unknown DAC
voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref", 0));
- vref.set_output(5.0);
vref.add_route(0, "ldac", 1.0, DAC_VREF_POS_INPUT);
vref.add_route(0, "ldac", -1.0, DAC_VREF_NEG_INPUT);
vref.add_route(0, "rdac", 1.0, DAC_VREF_POS_INPUT);
@@ -1263,9 +1260,9 @@ void sb8_device::device_start()
{
ymf262_device *ymf262 = subdevice<ymf262_device>("ymf262");
- m_isa->install_device(0x0388, 0x038b, read8_delegate(FUNC(ymf262_device::read), ymf262), write8_delegate(FUNC(ymf262_device::write), ymf262));
- m_isa->install_device(0x0220, 0x0223, read8_delegate(FUNC(ymf262_device::read), ymf262), write8_delegate(FUNC(ymf262_device::write), ymf262));
- m_isa->install_device(0x0228, 0x0229, read8_delegate(FUNC(ymf262_device::read), ymf262), write8_delegate(FUNC(ymf262_device::write), ymf262));
+ m_isa->install_device(0x0388, 0x038b, read8sm_delegate(FUNC(ymf262_device::read), ymf262), write8sm_delegate(FUNC(ymf262_device::write), ymf262));
+ m_isa->install_device(0x0220, 0x0223, read8sm_delegate(FUNC(ymf262_device::read), ymf262), write8sm_delegate(FUNC(ymf262_device::write), ymf262));
+ m_isa->install_device(0x0228, 0x0229, read8sm_delegate(FUNC(ymf262_device::read), ymf262), write8sm_delegate(FUNC(ymf262_device::write), ymf262));
}
else
{
@@ -1306,9 +1303,9 @@ void sb16_device::device_start()
m_isa->install_device(0x022e, 0x022f, read8_delegate(FUNC(sb_device::dsp_rbuf_status_r), this), write8_delegate(FUNC(sb_device::dsp_rbuf_status_w), this) );
m_isa->install_device(0x0224, 0x0225, read8_delegate(FUNC(sb16_device::mixer_r), this), write8_delegate(FUNC(sb16_device::mixer_w), this));
m_isa->install_device(0x0330, 0x0331, read8_delegate(FUNC(sb16_device::mpu401_r), this), write8_delegate(FUNC(sb16_device::mpu401_w), this));
- m_isa->install_device(0x0388, 0x038b, read8_delegate(FUNC(ymf262_device::read), ymf262), write8_delegate(FUNC(ymf262_device::write), ymf262));
- m_isa->install_device(0x0220, 0x0223, read8_delegate(FUNC(ymf262_device::read), ymf262), write8_delegate(FUNC(ymf262_device::write), ymf262));
- m_isa->install_device(0x0228, 0x0229, read8_delegate(FUNC(ymf262_device::read), ymf262), write8_delegate(FUNC(ymf262_device::write), ymf262));
+ m_isa->install_device(0x0388, 0x038b, read8sm_delegate(FUNC(ymf262_device::read), ymf262), write8sm_delegate(FUNC(ymf262_device::write), ymf262));
+ m_isa->install_device(0x0220, 0x0223, read8sm_delegate(FUNC(ymf262_device::read), ymf262), write8sm_delegate(FUNC(ymf262_device::write), ymf262));
+ m_isa->install_device(0x0228, 0x0229, read8sm_delegate(FUNC(ymf262_device::read), ymf262), write8sm_delegate(FUNC(ymf262_device::write), ymf262));
save_item(NAME(m_mixer.data));
save_item(NAME(m_mixer.status));
diff --git a/src/devices/bus/isa/sc499.cpp b/src/devices/bus/isa/sc499.cpp
index e9ace1ddb83..92f049f0402 100644
--- a/src/devices/bus/isa/sc499.cpp
+++ b/src/devices/bus/isa/sc499.cpp
@@ -177,9 +177,10 @@ static INPUT_PORTS_START( sc499_port )
INPUT_PORTS_END
-MACHINE_CONFIG_START(sc499_device::device_add_mconfig)
- MCFG_DEVICE_ADD(SC499_CTAPE_TAG, SC499_CTAPE, 0)
-MACHINE_CONFIG_END
+void sc499_device::device_add_mconfig(machine_config &config)
+{
+ SC499_CTAPE(config, m_image, 0);
+}
//**************************************************************************
diff --git a/src/devices/bus/isa/ssi2001.cpp b/src/devices/bus/isa/ssi2001.cpp
index 55adf04b0a2..2c433321847 100644
--- a/src/devices/bus/isa/ssi2001.cpp
+++ b/src/devices/bus/isa/ssi2001.cpp
@@ -30,7 +30,7 @@ void ssi2001_device::device_start()
{
set_isa_device();
m_isa->install_device(0x0200, 0x0207, read8_delegate(FUNC(pc_joy_device::joy_port_r), subdevice<pc_joy_device>("pc_joy")), write8_delegate(FUNC(pc_joy_device::joy_port_w), subdevice<pc_joy_device>("pc_joy")));
- m_isa->install_device(0x0280, 0x029F, read8_delegate(FUNC(mos6581_device::read), subdevice<mos6581_device>("sid6581")), write8_delegate(FUNC(mos6581_device::write), subdevice<mos6581_device>("sid6581")));
+ m_isa->install_device(0x0280, 0x029F, read8sm_delegate(FUNC(mos6581_device::read), subdevice<mos6581_device>("sid6581")), write8sm_delegate(FUNC(mos6581_device::write), subdevice<mos6581_device>("sid6581")));
}
diff --git a/src/devices/bus/isa/stereo_fx.cpp b/src/devices/bus/isa/stereo_fx.cpp
index c38d3aace80..b23a0dbe454 100644
--- a/src/devices/bus/isa/stereo_fx.cpp
+++ b/src/devices/bus/isa/stereo_fx.cpp
@@ -134,7 +134,6 @@ void stereo_fx_device::device_add_mconfig(machine_config &config)
DAC_8BIT_R2R(config, "ldac", 0).add_route(ALL_OUTPUTS, "lspeaker", 0.5); // unknown DAC
DAC_8BIT_R2R(config, "rdac", 0).add_route(ALL_OUTPUTS, "rspeaker", 0.5); // unknown DAC
voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref", 0));
- vref.set_output(5.0);
vref.add_route(0, "ldac", 1.0, DAC_VREF_POS_INPUT);
vref.add_route(0, "ldac", -1.0, DAC_VREF_NEG_INPUT);
vref.add_route(0, "rdac", 1.0, DAC_VREF_POS_INPUT);
@@ -216,8 +215,8 @@ void stereo_fx_device::device_start()
m_isa->install_device(0x022a, 0x022b, read8_delegate(FUNC(stereo_fx_device::dsp_data_r), this), write8_delegate(FUNC(stereo_fx_device::invalid_w), this) );
m_isa->install_device(0x022c, 0x022d, read8_delegate(FUNC(stereo_fx_device::dsp_wbuf_status_r), this), write8_delegate(FUNC(stereo_fx_device::dsp_cmd_w), this) );
m_isa->install_device(0x022e, 0x022f, read8_delegate(FUNC(stereo_fx_device::dsp_rbuf_status_r), this), write8_delegate(FUNC(stereo_fx_device::invalid_w), this) );
- m_isa->install_device(0x0388, 0x0389, read8_delegate(FUNC(ym3812_device::read), ym3812), write8_delegate(FUNC(ym3812_device::write), ym3812));
- m_isa->install_device(0x0228, 0x0229, read8_delegate(FUNC(ym3812_device::read), ym3812), write8_delegate(FUNC(ym3812_device::write), ym3812));
+ m_isa->install_device(0x0388, 0x0389, read8sm_delegate(FUNC(ym3812_device::read), ym3812), write8sm_delegate(FUNC(ym3812_device::write), ym3812));
+ m_isa->install_device(0x0228, 0x0229, read8sm_delegate(FUNC(ym3812_device::read), ym3812), write8sm_delegate(FUNC(ym3812_device::write), ym3812));
m_timer = timer_alloc();
m_timer->adjust(attotime::from_hz(2000000), 0, attotime::from_hz(2000000));
m_isa->set_dma_channel(1, this, false);
diff --git a/src/devices/bus/isa/svga_cirrus.cpp b/src/devices/bus/isa/svga_cirrus.cpp
index 444acac7c1a..bcb6b4995a1 100644
--- a/src/devices/bus/isa/svga_cirrus.cpp
+++ b/src/devices/bus/isa/svga_cirrus.cpp
@@ -30,14 +30,14 @@ DEFINE_DEVICE_TYPE(ISA16_SVGA_CIRRUS_GD542X, isa16_svga_cirrus_gd542x_device, "c
// device_add_mconfig - add device configuration
//-------------------------------------------------
-MACHINE_CONFIG_START(isa16_svga_cirrus_device::device_add_mconfig)
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_RAW_PARAMS(XTAL(25'174'800),900,0,640,526,0,480)
- MCFG_SCREEN_UPDATE_DEVICE("vga", cirrus_gd5430_device, screen_update)
+void isa16_svga_cirrus_device::device_add_mconfig(machine_config &config)
+{
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_raw(XTAL(25'174'800), 900, 0, 640, 526, 0, 480);
+ screen.set_screen_update("vga", FUNC(cirrus_gd5430_device::screen_update));
- MCFG_DEVICE_ADD("vga", CIRRUS_GD5430, 0)
- MCFG_VIDEO_SET_SCREEN("screen")
-MACHINE_CONFIG_END
+ CIRRUS_GD5430(config, "vga", 0).set_screen("screen");
+}
//-------------------------------------------------
// rom_region - device-specific ROM region
@@ -110,14 +110,14 @@ ROM_END
// device_add_mconfig - add device configuration
//-------------------------------------------------
-MACHINE_CONFIG_START(isa16_svga_cirrus_gd542x_device::device_add_mconfig)
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_RAW_PARAMS(XTAL(25'174'800),900,0,640,526,0,480)
- MCFG_SCREEN_UPDATE_DEVICE("vga", cirrus_gd5428_device, screen_update)
+void isa16_svga_cirrus_gd542x_device::device_add_mconfig(machine_config &config)
+{
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_raw(XTAL(25'174'800), 900, 0, 640, 526, 0, 480);
+ screen.set_screen_update("vga", FUNC(cirrus_gd5428_device::screen_update));
- MCFG_DEVICE_ADD("vga", CIRRUS_GD5428, 0)
- MCFG_VIDEO_SET_SCREEN("screen")
-MACHINE_CONFIG_END
+ CIRRUS_GD5428(config, "vga", 0).set_screen("screen");
+}
//-------------------------------------------------
// rom_region - device-specific ROM region
diff --git a/src/devices/bus/isa/svga_s3.cpp b/src/devices/bus/isa/svga_s3.cpp
index 1c97abc3b62..d5a2cde30bf 100644
--- a/src/devices/bus/isa/svga_s3.cpp
+++ b/src/devices/bus/isa/svga_s3.cpp
@@ -40,14 +40,14 @@ DEFINE_DEVICE_TYPE(ISA16_SVGA_S3, isa16_svga_s3_device, "s3_764", "Number Nine 9
// device_add_mconfig - add device configuration
//-------------------------------------------------
-MACHINE_CONFIG_START(isa16_svga_s3_device::device_add_mconfig)
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_RAW_PARAMS(XTAL(25'174'800),900,0,640,526,0,480)
- MCFG_SCREEN_UPDATE_DEVICE("vga", s3_vga_device, screen_update)
+void isa16_svga_s3_device::device_add_mconfig(machine_config &config)
+{
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_raw(XTAL(25'174'800), 900, 0, 640, 526, 0, 480);
+ screen.set_screen_update("vga", FUNC(s3_vga_device::screen_update));
- MCFG_DEVICE_ADD("vga", S3_VGA, 0)
- MCFG_VIDEO_SET_SCREEN("screen")
-MACHINE_CONFIG_END
+ S3_VGA(config, "vga", 0).set_screen("screen");
+}
//-------------------------------------------------
// rom_region - device-specific ROM region
@@ -146,14 +146,14 @@ DEFINE_DEVICE_TYPE(ISA16_S3VIRGE, isa16_s3virge_device, "s3virge", "S3 ViRGE Gra
// device_add_mconfig - add device configuration
//-------------------------------------------------
-MACHINE_CONFIG_START(isa16_s3virge_device::device_add_mconfig)
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_RAW_PARAMS(XTAL(25'174'800),900,0,640,526,0,480)
- MCFG_SCREEN_UPDATE_DEVICE("vga", s3virge_vga_device, screen_update)
+void isa16_s3virge_device::device_add_mconfig(machine_config &config)
+{
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_raw(XTAL(25'174'800), 900, 0, 640, 526, 0, 480);
+ screen.set_screen_update("vga", FUNC(s3virge_vga_device::screen_update));
- MCFG_DEVICE_ADD("vga", S3VIRGE, 0)
- MCFG_VIDEO_SET_SCREEN("screen")
-MACHINE_CONFIG_END
+ S3VIRGE(config, "vga", 0).set_screen("screen");
+}
//-------------------------------------------------
// rom_region - device-specific ROM region
@@ -227,14 +227,14 @@ DEFINE_DEVICE_TYPE(ISA16_S3VIRGEDX, isa16_s3virgedx_device, "s3virgedx", "S3 ViR
// device_add_mconfig - add device configuration
//-------------------------------------------------
-MACHINE_CONFIG_START(isa16_s3virgedx_device::device_add_mconfig)
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_RAW_PARAMS(XTAL(25'174'800),900,0,640,526,0,480)
- MCFG_SCREEN_UPDATE_DEVICE("vga", s3virgedx_vga_device, screen_update)
+void isa16_s3virgedx_device::device_add_mconfig(machine_config &config)
+{
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_raw(XTAL(25'174'800), 900, 0, 640, 526, 0, 480);
+ screen.set_screen_update("vga", FUNC(s3virgedx_vga_device::screen_update));
- MCFG_DEVICE_ADD("vga", S3VIRGEDX, 0)
- MCFG_VIDEO_SET_SCREEN("screen")
-MACHINE_CONFIG_END
+ S3VIRGEDX(config, "vga", 0).set_screen("screen");
+}
//-------------------------------------------------
// rom_region - device-specific ROM region
@@ -309,14 +309,14 @@ DEFINE_DEVICE_TYPE(ISA16_DMS3D2KPRO, isa16_stealth3d2kpro_device, "dms3d2kp", "D
// device_add_mconfig - add device configuration
//-------------------------------------------------
-MACHINE_CONFIG_START(isa16_stealth3d2kpro_device::device_add_mconfig)
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_RAW_PARAMS(XTAL(25'174'800),900,0,640,526,0,480)
- MCFG_SCREEN_UPDATE_DEVICE("vga", s3virgedx_rev1_vga_device, screen_update)
+void isa16_stealth3d2kpro_device::device_add_mconfig(machine_config &config)
+{
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_raw(XTAL(25'174'800), 900, 0, 640, 526, 0, 480);
+ screen.set_screen_update("vga", FUNC(s3virgedx_rev1_vga_device::screen_update));
- MCFG_DEVICE_ADD("vga", S3VIRGEDX1, 0)
- MCFG_VIDEO_SET_SCREEN("screen")
-MACHINE_CONFIG_END
+ S3VIRGEDX1(config, "vga", 0).set_screen("screen");
+}
//-------------------------------------------------
// rom_region - device-specific ROM region
diff --git a/src/devices/bus/isa/svga_trident.cpp b/src/devices/bus/isa/svga_trident.cpp
index 79aa1dfd55f..aa7fc90b489 100644
--- a/src/devices/bus/isa/svga_trident.cpp
+++ b/src/devices/bus/isa/svga_trident.cpp
@@ -30,14 +30,14 @@ DEFINE_DEVICE_TYPE(ISA16_SVGA_TGUI9680, isa16_svga_tgui9680_device, "tgui9680",
// device_add_mconfig - add device configuration
//-------------------------------------------------
-MACHINE_CONFIG_START(isa16_svga_tgui9680_device::device_add_mconfig)
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_RAW_PARAMS(XTAL(25'174'800),900,0,640,526,0,480)
- MCFG_SCREEN_UPDATE_DEVICE("vga", trident_vga_device, screen_update)
-
- MCFG_DEVICE_ADD("vga", TRIDENT_VGA, 0)
- MCFG_VIDEO_SET_SCREEN("screen")
-MACHINE_CONFIG_END
+void isa16_svga_tgui9680_device::device_add_mconfig(machine_config &config)
+{
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_raw(XTAL(25'174'800), 900, 0, 640, 526, 0, 480);
+ screen.set_screen_update("vga", FUNC(trident_vga_device::screen_update));
+
+ TRIDENT_VGA(config, "vga", 0).set_screen("screen");
+}
//-------------------------------------------------
// rom_region - device-specific ROM region
diff --git a/src/devices/bus/isa/svga_tseng.cpp b/src/devices/bus/isa/svga_tseng.cpp
index fd232b01d8d..dfe39a39d8e 100644
--- a/src/devices/bus/isa/svga_tseng.cpp
+++ b/src/devices/bus/isa/svga_tseng.cpp
@@ -29,14 +29,14 @@ DEFINE_DEVICE_TYPE(ISA8_SVGA_ET4K, isa8_svga_et4k_device, "et4000", "SVGA Tseng
// device_add_mconfig - add device configuration
//-------------------------------------------------
-MACHINE_CONFIG_START(isa8_svga_et4k_device::device_add_mconfig)
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_RAW_PARAMS(XTAL(25'174'800),900,0,640,526,0,480)
- MCFG_SCREEN_UPDATE_DEVICE("vga", tseng_vga_device, screen_update)
-
- MCFG_DEVICE_ADD("vga", TSENG_VGA, 0)
- MCFG_VIDEO_SET_SCREEN("screen")
-MACHINE_CONFIG_END
+void isa8_svga_et4k_device::device_add_mconfig(machine_config &config)
+{
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_raw(XTAL(25'174'800), 900, 0, 640, 526, 0, 480);
+ screen.set_screen_update("vga", FUNC(tseng_vga_device::screen_update));
+
+ TSENG_VGA(config, "vga", 0).set_screen("screen");
+}
//-------------------------------------------------
// rom_region - device-specific ROM region
diff --git a/src/devices/bus/isa/vga.cpp b/src/devices/bus/isa/vga.cpp
index b8a86adbfe3..0419ecdd255 100644
--- a/src/devices/bus/isa/vga.cpp
+++ b/src/devices/bus/isa/vga.cpp
@@ -27,14 +27,14 @@ DEFINE_DEVICE_TYPE(ISA8_VGA, isa8_vga_device, "ibm_vga", "IBM VGA Graphics Card"
// device_add_mconfig - add device configuration
//-------------------------------------------------
-MACHINE_CONFIG_START(isa8_vga_device::device_add_mconfig)
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_RAW_PARAMS(XTAL(25'174'800),900,0,640,526,0,480)
- MCFG_SCREEN_UPDATE_DEVICE("vga", vga_device, screen_update)
-
- MCFG_DEVICE_ADD("vga", VGA, 0)
- MCFG_VIDEO_SET_SCREEN("screen")
-MACHINE_CONFIG_END
+void isa8_vga_device::device_add_mconfig(machine_config &config)
+{
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_raw(XTAL(25'174'800), 900, 0, 640, 526, 0, 480);
+ screen.set_screen_update("vga", FUNC(vga_device::screen_update));
+
+ VGA(config, "vga", 0).set_screen("screen");
+}
//-------------------------------------------------
// rom_region - device-specific ROM region
diff --git a/src/devices/bus/isa/vga_ati.cpp b/src/devices/bus/isa/vga_ati.cpp
index 650a686d4fc..bad1a47a479 100644
--- a/src/devices/bus/isa/vga_ati.cpp
+++ b/src/devices/bus/isa/vga_ati.cpp
@@ -76,32 +76,33 @@ DEFINE_DEVICE_TYPE(ISA16_SVGA_MACH64, isa16_vga_mach64_device, "mach64
// device_add_mconfig - add device configuration
//-------------------------------------------------
-MACHINE_CONFIG_START(isa16_vga_gfxultra_device::device_add_mconfig)
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_RAW_PARAMS(XTAL(25'174'800),900,0,640,526,0,480)
- MCFG_SCREEN_UPDATE_DEVICE("vga", ati_vga_device, screen_update)
-
- MCFG_DEVICE_ADD("vga", ATI_VGA, 0)
- MCFG_VIDEO_SET_SCREEN("screen")
-MACHINE_CONFIG_END
-
-MACHINE_CONFIG_START(isa16_vga_gfxultrapro_device::device_add_mconfig)
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_RAW_PARAMS(XTAL(25'174'800),900,0,640,526,0,480)
- MCFG_SCREEN_UPDATE_DEVICE("vga", mach32_device, screen_update)
-
- MCFG_DEVICE_ADD("vga", ATIMACH32, 0)
- MCFG_VIDEO_SET_SCREEN("screen")
-MACHINE_CONFIG_END
-
-MACHINE_CONFIG_START(isa16_vga_mach64_device::device_add_mconfig)
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_RAW_PARAMS(XTAL(25'174'800),900,0,640,526,0,480)
- MCFG_SCREEN_UPDATE_DEVICE("vga", mach64_device, screen_update)
-
- MCFG_DEVICE_ADD("vga", ATIMACH64, 0)
- MCFG_VIDEO_SET_SCREEN("screen")
-MACHINE_CONFIG_END
+void isa16_vga_gfxultra_device::device_add_mconfig(machine_config &config)
+{
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_raw(XTAL(25'174'800), 900, 0, 640, 526, 0, 480);
+ screen.set_screen_update("vga", FUNC(ati_vga_device::screen_update));
+
+ ATI_VGA(config, "vga", 0).set_screen("screen");
+}
+
+void isa16_vga_gfxultrapro_device::device_add_mconfig(machine_config &config)
+{
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_raw(XTAL(25'174'800), 900, 0, 640, 526, 0, 480);
+ screen.set_screen_update("vga", FUNC(mach32_device::screen_update));
+
+ ATIMACH32(config, "vga", 0).set_screen("screen");
+}
+
+void isa16_vga_mach64_device::device_add_mconfig(machine_config &config)
+{
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_raw(XTAL(25'174'800), 900, 0, 640, 526, 0, 480);
+ screen.set_screen_update("vga", FUNC(mach64_device::screen_update));
+
+ ATIMACH64(config, "vga", 0).set_screen("screen");
+}
+
//-------------------------------------------------
// rom_region - device-specific ROM region
diff --git a/src/devices/bus/isa/wd1007a.cpp b/src/devices/bus/isa/wd1007a.cpp
index 3db2db1d776..22d9863e392 100644
--- a/src/devices/bus/isa/wd1007a.cpp
+++ b/src/devices/bus/isa/wd1007a.cpp
@@ -45,9 +45,10 @@ wd1007a_device::wd1007a_device(const machine_config &mconfig, const char *tag, d
// device_add_mconfig - add device configuration
//-------------------------------------------------
-MACHINE_CONFIG_START(wd1007a_device::device_add_mconfig)
- MCFG_DEVICE_ADD("mcu", AM8753, 10_MHz_XTAL)
-MACHINE_CONFIG_END
+void wd1007a_device::device_add_mconfig(machine_config &config)
+{
+ AM8753(config, "mcu", 10_MHz_XTAL);
+}
//-------------------------------------------------
diff --git a/src/devices/bus/isa/wdxt_gen.cpp b/src/devices/bus/isa/wdxt_gen.cpp
index 690bc161f7f..57dec00af89 100644
--- a/src/devices/bus/isa/wdxt_gen.cpp
+++ b/src/devices/bus/isa/wdxt_gen.cpp
@@ -237,6 +237,16 @@ void wdxt_gen_device::dack_w(int line, uint8_t data)
//-------------------------------------------------
+// dack_line_w -
+//-------------------------------------------------
+
+void wdxt_gen_device::dack_line_w(int line, int state)
+{
+ m_host->dack3_w(state);
+}
+
+
+//-------------------------------------------------
// wd1015_t1_r -
//-------------------------------------------------
diff --git a/src/devices/bus/isa/wdxt_gen.h b/src/devices/bus/isa/wdxt_gen.h
index 89d3aa5774f..d909b7bd155 100644
--- a/src/devices/bus/isa/wdxt_gen.h
+++ b/src/devices/bus/isa/wdxt_gen.h
@@ -52,6 +52,7 @@ protected:
// device_isa8_card_interface
virtual uint8_t dack_r(int line) override;
virtual void dack_w(int line, uint8_t data) override;
+ virtual void dack_line_w(int line, int state) override;
private:
DECLARE_WRITE_LINE_MEMBER( irq5_w );
diff --git a/src/devices/bus/isbx/compis_fdc.cpp b/src/devices/bus/isbx/compis_fdc.cpp
index e1d464a37c2..fea0e7f59b5 100644
--- a/src/devices/bus/isbx/compis_fdc.cpp
+++ b/src/devices/bus/isbx/compis_fdc.cpp
@@ -106,14 +106,14 @@ void compis_fdc_device::device_reset()
// mcs0_r - chip select 0 read
//-------------------------------------------------
-uint8_t compis_fdc_device::mcs0_r(address_space &space, offs_t offset)
+uint8_t compis_fdc_device::mcs0_r(offs_t offset)
{
uint8_t data = 0xff;
switch (BIT(offset, 0))
{
- case 0: data = m_fdc->msr_r(space, 0); break;
- case 1: data = m_fdc->fifo_r(space, 0); break;
+ case 0: data = m_fdc->msr_r(); break;
+ case 1: data = m_fdc->fifo_r(); break;
}
return data;
@@ -124,11 +124,11 @@ uint8_t compis_fdc_device::mcs0_r(address_space &space, offs_t offset)
// mcs0_w - chip select 0 write
//-------------------------------------------------
-void compis_fdc_device::mcs0_w(address_space &space, offs_t offset, uint8_t data)
+void compis_fdc_device::mcs0_w(offs_t offset, uint8_t data)
{
switch (BIT(offset, 0))
{
- case 1: m_fdc->fifo_w(space, 0, data); break;
+ case 1: m_fdc->fifo_w(data); break;
}
}
@@ -137,7 +137,7 @@ void compis_fdc_device::mcs0_w(address_space &space, offs_t offset, uint8_t data
// mdack_r - DMA acknowledge read
//-------------------------------------------------
-uint8_t compis_fdc_device::mdack_r(address_space &space, offs_t offset)
+uint8_t compis_fdc_device::mdack_r(offs_t offset)
{
return m_fdc->dma_r();
}
@@ -147,7 +147,7 @@ uint8_t compis_fdc_device::mdack_r(address_space &space, offs_t offset)
// mdack_w - DMA acknowledge write
//-------------------------------------------------
-void compis_fdc_device::mdack_w(address_space &space, offs_t offset, uint8_t data)
+void compis_fdc_device::mdack_w(offs_t offset, uint8_t data)
{
m_fdc->dma_w(data);
}
diff --git a/src/devices/bus/isbx/compis_fdc.h b/src/devices/bus/isbx/compis_fdc.h
index 7f33cdd1160..af1d71a3af2 100644
--- a/src/devices/bus/isbx/compis_fdc.h
+++ b/src/devices/bus/isbx/compis_fdc.h
@@ -40,10 +40,10 @@ protected:
virtual void device_add_mconfig(machine_config &config) override;
// device_isbx_card_interface overrides
- virtual uint8_t mcs0_r(address_space &space, offs_t offset) override;
- virtual void mcs0_w(address_space &space, offs_t offset, uint8_t data) override;
- virtual uint8_t mdack_r(address_space &space, offs_t offset) override;
- virtual void mdack_w(address_space &space, offs_t offset, uint8_t data) override;
+ virtual uint8_t mcs0_r(offs_t offset) override;
+ virtual void mcs0_w(offs_t offset, uint8_t data) override;
+ virtual uint8_t mdack_r(offs_t offset) override;
+ virtual void mdack_w(offs_t offset, uint8_t data) override;
virtual void opt0_w(int state) override;
virtual void opt1_w(int state) override;
diff --git a/src/devices/bus/isbx/isbc_218a.cpp b/src/devices/bus/isbx/isbc_218a.cpp
index 9b142fa95ae..0a1cff5f235 100644
--- a/src/devices/bus/isbx/isbc_218a.cpp
+++ b/src/devices/bus/isbx/isbc_218a.cpp
@@ -111,14 +111,14 @@ void isbc_218a_device::device_reset()
// mcs0_r - chip select 0 read
//-------------------------------------------------
-uint8_t isbc_218a_device::mcs0_r(address_space &space, offs_t offset)
+uint8_t isbc_218a_device::mcs0_r(offs_t offset)
{
uint8_t data = 0xff;
switch (BIT(offset, 0))
{
- case 0: data = m_fdc->msr_r(space, 0); break;
- case 1: data = m_fdc->fifo_r(space, 0); break;
+ case 0: data = m_fdc->msr_r(); break;
+ case 1: data = m_fdc->fifo_r(); break;
}
return data;
@@ -129,11 +129,11 @@ uint8_t isbc_218a_device::mcs0_r(address_space &space, offs_t offset)
// mcs0_w - chip select 0 write
//-------------------------------------------------
-void isbc_218a_device::mcs0_w(address_space &space, offs_t offset, uint8_t data)
+void isbc_218a_device::mcs0_w(offs_t offset, uint8_t data)
{
switch (BIT(offset, 0))
{
- case 1: m_fdc->fifo_w(space, 0, data); break;
+ case 1: m_fdc->fifo_w(data); break;
}
}
@@ -142,7 +142,7 @@ void isbc_218a_device::mcs0_w(address_space &space, offs_t offset, uint8_t data)
// mcs1_r - chip select 1 read
//-------------------------------------------------
-uint8_t isbc_218a_device::mcs1_r(address_space &space, offs_t offset)
+uint8_t isbc_218a_device::mcs1_r(offs_t offset)
{
uint8_t data = 0xff;
@@ -159,7 +159,7 @@ uint8_t isbc_218a_device::mcs1_r(address_space &space, offs_t offset)
// mcs1_w - chip select 1 write
//-------------------------------------------------
-void isbc_218a_device::mcs1_w(address_space &space, offs_t offset, uint8_t data)
+void isbc_218a_device::mcs1_w(offs_t offset, uint8_t data)
{
switch (offset)
{
@@ -182,7 +182,7 @@ void isbc_218a_device::mcs1_w(address_space &space, offs_t offset, uint8_t data)
// mdack_r - DMA acknowledge read
//-------------------------------------------------
-uint8_t isbc_218a_device::mdack_r(address_space &space, offs_t offset)
+uint8_t isbc_218a_device::mdack_r(offs_t offset)
{
return m_fdc->dma_r();
}
@@ -192,7 +192,7 @@ uint8_t isbc_218a_device::mdack_r(address_space &space, offs_t offset)
// mdack_w - DMA acknowledge write
//-------------------------------------------------
-void isbc_218a_device::mdack_w(address_space &space, offs_t offset, uint8_t data)
+void isbc_218a_device::mdack_w(offs_t offset, uint8_t data)
{
m_fdc->dma_w(data);
}
diff --git a/src/devices/bus/isbx/isbc_218a.h b/src/devices/bus/isbx/isbc_218a.h
index 5d0a617e989..bdf37c52806 100644
--- a/src/devices/bus/isbx/isbc_218a.h
+++ b/src/devices/bus/isbx/isbc_218a.h
@@ -40,12 +40,12 @@ protected:
virtual void device_add_mconfig(machine_config &config) override;
// device_isbx_card_interface overrides
- virtual uint8_t mcs0_r(address_space &space, offs_t offset) override;
- virtual void mcs0_w(address_space &space, offs_t offset, uint8_t data) override;
- virtual uint8_t mcs1_r(address_space &space, offs_t offset) override;
- virtual void mcs1_w(address_space &space, offs_t offset, uint8_t data) override;
- virtual uint8_t mdack_r(address_space &space, offs_t offset) override;
- virtual void mdack_w(address_space &space, offs_t offset, uint8_t data) override;
+ virtual uint8_t mcs0_r(offs_t offset) override;
+ virtual void mcs0_w(offs_t offset, uint8_t data) override;
+ virtual uint8_t mcs1_r(offs_t offset) override;
+ virtual void mcs1_w(offs_t offset, uint8_t data) override;
+ virtual uint8_t mdack_r(offs_t offset) override;
+ virtual void mdack_w(offs_t offset, uint8_t data) override;
virtual void opt0_w(int state) override;
private:
diff --git a/src/devices/bus/isbx/isbx.h b/src/devices/bus/isbx/isbx.h
index d62d9515fe1..0535e461cd7 100644
--- a/src/devices/bus/isbx/isbx.h
+++ b/src/devices/bus/isbx/isbx.h
@@ -47,12 +47,12 @@ class isbx_slot_device;
class device_isbx_card_interface : public device_slot_card_interface
{
public:
- virtual uint8_t mcs0_r(address_space &space, offs_t offset) { return 0xff; }
- virtual void mcs0_w(address_space &space, offs_t offset, uint8_t data) { }
- virtual uint8_t mcs1_r(address_space &space, offs_t offset) { return 0xff; }
- virtual void mcs1_w(address_space &space, offs_t offset, uint8_t data) { }
- virtual uint8_t mdack_r(address_space &space, offs_t offset) { return 0xff; }
- virtual void mdack_w(address_space &space, offs_t offset, uint8_t data) { }
+ virtual uint8_t mcs0_r(offs_t offset) { return 0xff; }
+ virtual void mcs0_w(offs_t offset, uint8_t data) { }
+ virtual uint8_t mcs1_r(offs_t offset) { return 0xff; }
+ virtual void mcs1_w(offs_t offset, uint8_t data) { }
+ virtual uint8_t mdack_r(offs_t offset) { return 0xff; }
+ virtual void mdack_w(offs_t offset, uint8_t data) { }
virtual int opt0_r() { return 1; }
virtual void opt0_w(int state) { }
virtual int opt1_r() { return 1; }
@@ -92,12 +92,12 @@ public:
auto mwait() { return m_write_mwait.bind(); }
// computer interface
- DECLARE_READ8_MEMBER( mcs0_r ) { return m_card ? m_card->mcs0_r(space, offset) : 0xff; }
- DECLARE_WRITE8_MEMBER( mcs0_w ) { if (m_card) m_card->mcs0_w(space, offset, data); }
- DECLARE_READ8_MEMBER( mcs1_r ) { return m_card ? m_card->mcs1_r(space, offset) : 0xff; }
- DECLARE_WRITE8_MEMBER( mcs1_w ) { if (m_card) m_card->mcs1_w(space, offset, data); }
- DECLARE_READ8_MEMBER( mdack_r ) { return m_card ? m_card->mdack_r(space, offset) : 0xff; }
- DECLARE_WRITE8_MEMBER( mdack_w ) { if (m_card) m_card->mdack_w(space, offset, data); }
+ uint8_t mcs0_r(offs_t offset) { return m_card ? m_card->mcs0_r(offset) : 0xff; }
+ void mcs0_w(offs_t offset, uint8_t data) { if (m_card) m_card->mcs0_w(offset, data); }
+ uint8_t mcs1_r(offs_t offset) { return m_card ? m_card->mcs1_r(offset) : 0xff; }
+ void mcs1_w(offs_t offset, uint8_t data) { if (m_card) m_card->mcs1_w(offset, data); }
+ uint8_t mdack_r(offs_t offset) { return m_card ? m_card->mdack_r(offset) : 0xff; }
+ void mdack_w(offs_t offset, uint8_t data) { if (m_card) m_card->mdack_w(offset, data); }
DECLARE_READ_LINE_MEMBER( mpst_r ) { return m_card == nullptr; }
DECLARE_READ_LINE_MEMBER( opt0_r ) { return m_card ? m_card->opt0_r() : 1; }
DECLARE_WRITE_LINE_MEMBER( opt0_w ) { if (m_card) m_card->opt0_w(state); }
diff --git a/src/devices/bus/jakks_gamekey/rom.cpp b/src/devices/bus/jakks_gamekey/rom.cpp
new file mode 100644
index 00000000000..0ca9b7024d9
--- /dev/null
+++ b/src/devices/bus/jakks_gamekey/rom.cpp
@@ -0,0 +1,111 @@
+// license:BSD-3-Clause
+// copyright-holders:David Haywood
+
+#include "emu.h"
+#include "rom.h"
+
+//-------------------------------------------------
+// jakks_gamekey_rom_device - constructor
+//-------------------------------------------------
+
+DEFINE_DEVICE_TYPE(JAKKS_GAMEKEY_ROM_PLAIN, jakks_gamekey_rom_plain_device, "jakks_gamekey_rom_plain", "JAKKS Pacific GameKey")
+DEFINE_DEVICE_TYPE(JAKKS_GAMEKEY_ROM_I2C_BASE, jakks_gamekey_rom_i2c_base_device, "jakks_gamekey_rom_i2c_base", "JAKKS Pacific GameKey with I2C")
+DEFINE_DEVICE_TYPE(JAKKS_GAMEKEY_ROM_I2C_24LC04, jakks_gamekey_rom_i2c_24lc04_device, "jakks_gamekey_rom_i2c_24lc04", "JAKKS Pacific GameKey with I2C 24LC04")
+
+
+jakks_gamekey_rom_plain_device::jakks_gamekey_rom_plain_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock) :
+ device_t(mconfig, type, tag, owner, clock), device_jakks_gamekey_interface(mconfig, *this)
+{
+}
+
+jakks_gamekey_rom_plain_device::jakks_gamekey_rom_plain_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) :
+ jakks_gamekey_rom_plain_device(mconfig, JAKKS_GAMEKEY_ROM_PLAIN, tag, owner, clock)
+{
+}
+
+jakks_gamekey_rom_i2c_base_device::jakks_gamekey_rom_i2c_base_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock) :
+ jakks_gamekey_rom_plain_device(mconfig, type, tag, owner, clock),
+ m_i2cmem(*this, "i2cmem")
+{
+}
+
+jakks_gamekey_rom_i2c_base_device::jakks_gamekey_rom_i2c_base_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) :
+ jakks_gamekey_rom_i2c_base_device(mconfig, JAKKS_GAMEKEY_ROM_I2C_BASE, tag, owner, clock)
+{
+}
+
+jakks_gamekey_rom_i2c_24lc04_device::jakks_gamekey_rom_i2c_24lc04_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) :
+ jakks_gamekey_rom_i2c_base_device(mconfig, JAKKS_GAMEKEY_ROM_I2C_24LC04, tag, owner, clock)
+{
+}
+
+/*-------------------------------------------------
+ mapper specific handlers
+ -------------------------------------------------*/
+
+// plain
+
+READ16_MEMBER(jakks_gamekey_rom_plain_device::read_cart)
+{
+ return read_rom(space, offset, mem_mask);
+}
+
+READ16_MEMBER(jakks_gamekey_rom_plain_device::read_rom)
+{
+ return m_rom[offset & (m_rom_size-1)];
+}
+
+WRITE16_MEMBER(jakks_gamekey_rom_plain_device::write_cart)
+{
+ write_rom(space, offset, data, mem_mask);
+}
+
+WRITE16_MEMBER(jakks_gamekey_rom_plain_device::write_rom)
+{
+ logerror("jakks_gamekey_rom_plain_device::write_rom %08x %02x\n", offset, data);
+}
+
+// i2c base
+
+WRITE16_MEMBER(jakks_gamekey_rom_i2c_base_device::write_rom)
+{
+ logerror("jakks_gamekey_rom_i2c_base_device::write_rom %08x %02x\n", offset, data);
+}
+
+READ16_MEMBER(jakks_gamekey_rom_i2c_base_device::read_rom)
+{
+ return m_rom[offset & (m_rom_size - 1)];
+}
+
+uint8_t jakks_gamekey_rom_i2c_base_device::read_cart_seeprom(void)
+{
+ logerror("jakks_gamekey_rom_i2c_base_device::read_cart_seeprom\n");
+
+ return m_i2cmem->read_sda();
+}
+
+WRITE16_MEMBER(jakks_gamekey_rom_i2c_base_device::write_cart_seeprom)
+{
+ if (BIT(mem_mask, 1))
+ m_i2cmem->write_scl(BIT(data, 1));
+ if (BIT(mem_mask, 0))
+ m_i2cmem->write_sda(BIT(data, 0));
+}
+
+// i2c 24lc04
+
+void jakks_gamekey_rom_i2c_24lc04_device::device_add_mconfig(machine_config &config)
+{
+ I2CMEM(config, "i2cmem", 0)/*.set_page_size(16)*/.set_data_size(0x200); // 24LC04
+}
+
+
+/*-------------------------------------------------
+ slot interface
+ -------------------------------------------------*/
+
+void jakks_gamekey(device_slot_interface &device)
+{
+ device.option_add_internal("plain", JAKKS_GAMEKEY_ROM_PLAIN);
+ device.option_add_internal("rom_24lc04", JAKKS_GAMEKEY_ROM_I2C_24LC04);
+}
diff --git a/src/devices/bus/jakks_gamekey/rom.h b/src/devices/bus/jakks_gamekey/rom.h
new file mode 100644
index 00000000000..7f85e9f21fb
--- /dev/null
+++ b/src/devices/bus/jakks_gamekey/rom.h
@@ -0,0 +1,77 @@
+// license:BSD-3-Clause
+// copyright-holders:David Haywood
+#ifndef MAME_BUS_JAKKS_GAMEKEY_ROM_H
+#define MAME_BUS_JAKKS_GAMEKEY_ROM_H
+
+#pragma once
+
+#include "slot.h"
+#include "machine/i2cmem.h"
+
+// ======================> jakks_gamekey_rom_plain_device
+
+class jakks_gamekey_rom_plain_device : public device_t,
+ public device_jakks_gamekey_interface
+{
+public:
+ // construction/destruction
+ jakks_gamekey_rom_plain_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+
+ // reading and writing
+ virtual DECLARE_READ16_MEMBER(read_cart) override;
+ virtual DECLARE_WRITE16_MEMBER(write_cart) override;
+
+ virtual uint8_t read_cart_seeprom(void) override { return 1; };
+ virtual DECLARE_WRITE16_MEMBER(write_cart_seeprom) override { };
+
+ virtual READ16_MEMBER(read_rom);
+ virtual WRITE16_MEMBER(write_rom);
+
+protected:
+ jakks_gamekey_rom_plain_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock);
+
+ // device-level overrides
+ virtual void device_start() override { }
+ virtual void device_reset() override { }
+};
+
+// ======================> jakks_gamekey_rom_i2c_base_device
+
+class jakks_gamekey_rom_i2c_base_device : public jakks_gamekey_rom_plain_device
+{
+public:
+ // construction/destruction
+ jakks_gamekey_rom_i2c_base_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+
+protected:
+ jakks_gamekey_rom_i2c_base_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock);
+
+ // reading and writing
+ virtual READ16_MEMBER(read_rom) override;
+ virtual WRITE16_MEMBER(write_rom) override;
+
+ optional_device<i2cmem_device> m_i2cmem;
+
+ virtual uint8_t read_cart_seeprom(void) override;
+ virtual DECLARE_WRITE16_MEMBER(write_cart_seeprom) override;
+};
+
+
+// ======================> jakks_gamekey_rom_i2c_24lc04_device
+
+class jakks_gamekey_rom_i2c_24lc04_device : public jakks_gamekey_rom_i2c_base_device
+{
+public:
+ // construction/destruction
+ jakks_gamekey_rom_i2c_24lc04_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+
+protected:
+ virtual void device_add_mconfig(machine_config &config) override;
+};
+
+// device type definition
+DECLARE_DEVICE_TYPE(JAKKS_GAMEKEY_ROM_PLAIN, jakks_gamekey_rom_plain_device)
+DECLARE_DEVICE_TYPE(JAKKS_GAMEKEY_ROM_I2C_BASE, jakks_gamekey_rom_i2c_base_device)
+DECLARE_DEVICE_TYPE(JAKKS_GAMEKEY_ROM_I2C_24LC04, jakks_gamekey_rom_i2c_24lc04_device)
+
+#endif // MAME_BUS_JAKKS_GAMEKEY_ROM_H
diff --git a/src/devices/bus/jakks_gamekey/slot.cpp b/src/devices/bus/jakks_gamekey/slot.cpp
new file mode 100644
index 00000000000..6a5196875b1
--- /dev/null
+++ b/src/devices/bus/jakks_gamekey/slot.cpp
@@ -0,0 +1,237 @@
+// license:BSD-3-Clause
+// copyright-holders:David Haywood
+
+#include "emu.h"
+#include "slot.h"
+
+//**************************************************************************
+// GLOBAL VARIABLES
+//**************************************************************************
+
+DEFINE_DEVICE_TYPE(JAKKS_GAMEKEY_SLOT, jakks_gamekey_slot_device, "jakks_gamekey_slot", "JAKKS Pacific Gamekey Slot")
+
+//**************************************************************************
+// JAKKS GAMEKEY cartridges Interface
+//**************************************************************************
+
+//-------------------------------------------------
+// device_jakks_gamekey_interface - constructor
+//-------------------------------------------------
+
+device_jakks_gamekey_interface::device_jakks_gamekey_interface(const machine_config &mconfig, device_t &device)
+ : device_slot_card_interface(mconfig, device),
+ m_rom(nullptr),
+ m_rom_size(0)
+{
+}
+
+
+//-------------------------------------------------
+// ~device_jakks_gamekey_interface - destructor
+//-------------------------------------------------
+
+device_jakks_gamekey_interface::~device_jakks_gamekey_interface()
+{
+}
+
+//-------------------------------------------------
+// rom_alloc - alloc the space for the cart
+//-------------------------------------------------
+
+void device_jakks_gamekey_interface::rom_alloc(uint32_t size, const char *tag)
+{
+ if (m_rom == nullptr)
+ {
+ m_rom = device().machine().memory().region_alloc(std::string(tag).append(JAKKSSLOT_ROM_REGION_TAG).c_str(), size, 1, ENDIANNESS_BIG)->base();
+ m_rom_size = size;
+ }
+}
+
+//**************************************************************************
+// LIVE DEVICE
+//**************************************************************************
+
+//-------------------------------------------------
+// jakks_gamekey_slot_device - constructor
+//-------------------------------------------------
+jakks_gamekey_slot_device::jakks_gamekey_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) :
+ device_t(mconfig, JAKKS_GAMEKEY_SLOT, tag, owner, clock),
+ device_image_interface(mconfig, *this),
+ device_slot_interface(mconfig, *this),
+ m_type(JAKKS_GAMEKEY_PLAIN),
+ m_cart(nullptr)
+{
+}
+
+//-------------------------------------------------
+// jakks_gamekey_slot_device - destructor
+//-------------------------------------------------
+
+jakks_gamekey_slot_device::~jakks_gamekey_slot_device()
+{
+}
+
+//-------------------------------------------------
+// device_start - device-specific startup
+//-------------------------------------------------
+
+void jakks_gamekey_slot_device::device_start()
+{
+ m_cart = dynamic_cast<device_jakks_gamekey_interface *>(get_card_device());
+}
+
+//-------------------------------------------------
+// JAKKS GAMEKEY PCB
+//-------------------------------------------------
+
+struct jakks_gamekey_slot
+{
+ int pcb_id;
+ const char *slot_option;
+};
+
+// Here, we take the feature attribute from .xml (i.e. the PCB name) and we assign a unique ID to it
+static const jakks_gamekey_slot slot_list[] =
+{
+ { JAKKS_GAMEKEY_PLAIN, "plain" },
+ { JAKKS_GAMEKEY_I2C_BASE, "i2c_base" },
+ { JAKKS_GAMEKEY_I2C_24LC04, "rom_24lc04" },
+};
+
+static int jakks_gamekey_get_pcb_id(const char *slot)
+{
+ for (auto & elem : slot_list)
+ {
+ if (!core_stricmp(elem.slot_option, slot))
+ return elem.pcb_id;
+ }
+
+ return 0;
+}
+
+static const char *jakks_gamekey_get_slot(int type)
+{
+ for (auto & elem : slot_list)
+ {
+ if (elem.pcb_id == type)
+ return elem.slot_option;
+ }
+
+ return "plain";
+}
+
+
+/*-------------------------------------------------
+ call load
+ -------------------------------------------------*/
+
+image_init_result jakks_gamekey_slot_device::call_load()
+{
+ if (m_cart)
+ {
+ uint8_t *ROM;
+ uint32_t len = !loaded_through_softlist() ? length() : get_software_region_length("rom");
+
+ m_cart->rom_alloc(len, tag());
+
+ ROM = m_cart->get_rom_base();
+
+ if (!loaded_through_softlist())
+ fread(ROM, len);
+ else
+ memcpy(ROM, get_software_region("rom"), len);
+
+ if (!loaded_through_softlist())
+ {
+ // attempt to detect cart type without softlist assistance
+ m_type = get_cart_type(ROM, len);
+ }
+ else
+ {
+ // or for softlist loading, use the type specified
+ const char *pcb_name = get_feature("slot");
+ if (pcb_name)
+ m_type = jakks_gamekey_get_pcb_id(pcb_name);
+ }
+
+ return image_init_result::PASS;
+ }
+
+ return image_init_result::PASS;
+}
+
+
+/*-------------------------------------------------
+ get_cart_type - code to detect cart type from
+ fullpath
+ -------------------------------------------------*/
+
+int jakks_gamekey_slot_device::get_cart_type(const uint8_t *ROM, uint32_t len)
+{
+ // without code analysis we have no way of knowing.
+ int type = JAKKS_GAMEKEY_PLAIN;
+ return type;
+}
+
+
+/*-------------------------------------------------
+ get default card software
+ -------------------------------------------------*/
+
+std::string jakks_gamekey_slot_device::get_default_card_software(get_default_card_software_hook &hook) const
+{
+ if (hook.image_file())
+ {
+ const char *slot_string;
+ uint32_t len = hook.image_file()->size();
+ std::vector<uint8_t> rom(len);
+ int type;
+
+ hook.image_file()->read(&rom[0], len);
+
+ type = get_cart_type(&rom[0], len);
+ slot_string = jakks_gamekey_get_slot(type);
+
+ printf("type: %s\n", slot_string);
+
+ return std::string(slot_string);
+ }
+
+ return software_get_default_slot("plain");
+}
+
+/*-------------------------------------------------
+ read
+ -------------------------------------------------*/
+
+READ16_MEMBER(jakks_gamekey_slot_device::read_cart)
+{
+ return m_cart->read_cart(space, offset);
+}
+
+/*-------------------------------------------------
+ write
+ -------------------------------------------------*/
+
+WRITE16_MEMBER(jakks_gamekey_slot_device::write_cart)
+{
+ m_cart->write_cart(space, offset, data);
+}
+
+/*-------------------------------------------------
+ read seeprom
+ -------------------------------------------------*/
+
+uint8_t jakks_gamekey_slot_device::read_cart_seeprom(void)
+{
+ return m_cart->read_cart_seeprom();
+}
+
+/*-------------------------------------------------
+ write seeprom
+ -------------------------------------------------*/
+
+WRITE16_MEMBER(jakks_gamekey_slot_device::write_cart_seeprom)
+{
+ m_cart->write_cart_seeprom(space, offset, data);
+}
diff --git a/src/devices/bus/jakks_gamekey/slot.h b/src/devices/bus/jakks_gamekey/slot.h
new file mode 100644
index 00000000000..8fd0961aad8
--- /dev/null
+++ b/src/devices/bus/jakks_gamekey/slot.h
@@ -0,0 +1,119 @@
+// license:BSD-3-Clause
+// copyright-holders:David Haywood
+#ifndef MAME_BUS_JAKKS_GAMEKEY_SLOT_H
+#define MAME_BUS_JAKKS_GAMEKEY_SLOT_H
+
+#pragma once
+
+#include "softlist_dev.h"
+
+/***************************************************************************
+ TYPE DEFINITIONS
+ ***************************************************************************/
+
+/* PCB */
+enum
+{
+ JAKKS_GAMEKEY_PLAIN = 0,
+ JAKKS_GAMEKEY_I2C_BASE,
+ JAKKS_GAMEKEY_I2C_24LC04,
+};
+
+// ======================> device_jakks_gamekey_interface
+
+class device_jakks_gamekey_interface : public device_slot_card_interface
+{
+public:
+ // construction/destruction
+ virtual ~device_jakks_gamekey_interface();
+
+ // reading and writing
+ virtual DECLARE_READ16_MEMBER(read_cart) { return 0xffff; }
+ virtual DECLARE_WRITE16_MEMBER(write_cart) { }
+
+ virtual uint8_t read_cart_seeprom(void) { return 1; }
+ virtual DECLARE_WRITE16_MEMBER(write_cart_seeprom) { }
+
+ void rom_alloc(uint32_t size, const char *tag);
+ uint8_t* get_rom_base() { return m_rom; }
+ uint32_t get_rom_size() { return m_rom_size; }
+
+protected:
+ device_jakks_gamekey_interface(const machine_config &mconfig, device_t &device);
+
+ // internal state
+ uint8_t *m_rom;
+ uint32_t m_rom_size;
+};
+
+// ======================> jakks_gamekey_slot_device
+
+class jakks_gamekey_slot_device : public device_t,
+ public device_image_interface,
+ public device_slot_interface
+{
+public:
+ // construction/destruction
+ jakks_gamekey_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+
+ template <typename T>
+ jakks_gamekey_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock, T &&opts, const char *dflt)
+ : jakks_gamekey_slot_device(mconfig, tag, owner, clock)
+ {
+ option_reset();
+ opts(*this);
+ set_default_option(dflt);
+ set_fixed(false);
+ }
+
+ virtual ~jakks_gamekey_slot_device();
+
+ // image-level overrides
+ virtual image_init_result call_load() override;
+ virtual void call_unload() override {}
+ virtual const software_list_loader &get_software_list_loader() const override { return rom_software_list_loader::instance(); }
+
+ int get_type() { return m_type; }
+ static int get_cart_type(const uint8_t *ROM, uint32_t len);
+
+ virtual iodevice_t image_type() const override { return IO_CARTSLOT; }
+ virtual bool is_readable() const override { return 1; }
+ virtual bool is_writeable() const override { return 0; }
+ virtual bool is_creatable() const override { return 0; }
+ virtual bool must_be_loaded() const override { return 0; }
+ virtual bool is_reset_on_load() const override { return 1; }
+ virtual const char *image_interface() const override { return "jakks_gamekey"; }
+ virtual const char *file_extensions() const override { return "bin,u1"; }
+
+ // slot interface overrides
+ virtual std::string get_default_card_software(get_default_card_software_hook &hook) const override;
+
+ // reading and writing
+ virtual DECLARE_READ16_MEMBER(read_cart);
+ virtual DECLARE_WRITE16_MEMBER(write_cart);
+
+ virtual uint8_t read_cart_seeprom(void);
+ virtual DECLARE_WRITE16_MEMBER(write_cart_seeprom);
+
+ bool has_cart() { return m_cart ? true : false; }
+
+protected:
+ // device-level overrides
+ virtual void device_start() override;
+
+ int m_type;
+ device_jakks_gamekey_interface* m_cart;
+};
+
+// device type definition
+DECLARE_DEVICE_TYPE(JAKKS_GAMEKEY_SLOT, jakks_gamekey_slot_device)
+
+/***************************************************************************
+ DEVICE CONFIGURATION MACROS
+ ***************************************************************************/
+
+#define JAKKSSLOT_ROM_REGION_TAG ":cart:rom"
+
+void jakks_gamekey(device_slot_interface &device);
+
+#endif // MAME_BUS_JAKKS_GAMEKEY_SLOT_H
diff --git a/src/devices/bus/kc/d002.cpp b/src/devices/bus/kc/d002.cpp
index 24a361a8f2d..03dc9fb8f3b 100644
--- a/src/devices/bus/kc/d002.cpp
+++ b/src/devices/bus/kc/d002.cpp
@@ -109,40 +109,36 @@ void kc_d002_device::device_reset()
// device_add_mconfig - add device configuration
//-------------------------------------------------
-MACHINE_CONFIG_START(kc_d002_device::device_add_mconfig)
- MCFG_DEVICE_ADD("m0", KCCART_SLOT, 0)
- MCFG_DEVICE_SLOT_INTERFACE(kc85_cart, nullptr, false)
- MCFG_KCCART_SLOT_NEXT_SLOT("m4")
- MCFG_KCCART_SLOT_OUT_IRQ_CB(WRITELINE(*this, kc_d002_device, out_irq_w))
- MCFG_KCCART_SLOT_OUT_NMI_CB(WRITELINE(*this, kc_d002_device, out_nmi_w))
- MCFG_KCCART_SLOT_OUT_HALT_CB(WRITELINE(*this, kc_d002_device, out_halt_w))
- MCFG_DEVICE_ADD("m4", KCCART_SLOT, 0)
- MCFG_DEVICE_SLOT_INTERFACE(kc85_cart, nullptr, false)
- MCFG_KCCART_SLOT_NEXT_SLOT("m8")
- MCFG_KCCART_SLOT_OUT_IRQ_CB(WRITELINE(*this, kc_d002_device, out_irq_w))
- MCFG_KCCART_SLOT_OUT_NMI_CB(WRITELINE(*this, kc_d002_device, out_nmi_w))
- MCFG_KCCART_SLOT_OUT_HALT_CB(WRITELINE(*this, kc_d002_device, out_halt_w))
- MCFG_DEVICE_ADD("m8", KCCART_SLOT, 0)
- MCFG_DEVICE_SLOT_INTERFACE(kc85_cart, nullptr, false)
- MCFG_KCCART_SLOT_NEXT_SLOT("mc")
- MCFG_KCCART_SLOT_OUT_IRQ_CB(WRITELINE(*this, kc_d002_device, out_irq_w))
- MCFG_KCCART_SLOT_OUT_NMI_CB(WRITELINE(*this, kc_d002_device, out_nmi_w))
- MCFG_KCCART_SLOT_OUT_HALT_CB(WRITELINE(*this, kc_d002_device, out_halt_w))
- MCFG_DEVICE_ADD("mc", KCCART_SLOT, 0)
- MCFG_DEVICE_SLOT_INTERFACE(kc85_cart, nullptr, false)
- MCFG_KCCART_SLOT_NEXT_SLOT("exp")
- MCFG_KCCART_SLOT_OUT_IRQ_CB(WRITELINE(*this, kc_d002_device, out_irq_w))
- MCFG_KCCART_SLOT_OUT_NMI_CB(WRITELINE(*this, kc_d002_device, out_nmi_w))
- MCFG_KCCART_SLOT_OUT_HALT_CB(WRITELINE(*this, kc_d002_device, out_halt_w))
+void kc_d002_device::device_add_mconfig(machine_config &config)
+{
+ KCCART_SLOT(config, m_expansions[0], kc85_cart, nullptr);
+ m_expansions[0]->set_next_slot("m4");
+ m_expansions[0]->irq().set(FUNC(kc_d002_device::out_irq_w));
+ m_expansions[0]->nmi().set(FUNC(kc_d002_device::out_nmi_w));
+ m_expansions[0]->halt().set(FUNC(kc_d002_device::out_halt_w));
+ KCCART_SLOT(config, m_expansions[1], kc85_cart, nullptr);
+ m_expansions[1]->set_next_slot("m8");
+ m_expansions[1]->irq().set(FUNC(kc_d002_device::out_irq_w));
+ m_expansions[1]->nmi().set(FUNC(kc_d002_device::out_nmi_w));
+ m_expansions[1]->halt().set(FUNC(kc_d002_device::out_halt_w));
+ KCCART_SLOT(config, m_expansions[2], kc85_cart, nullptr);
+ m_expansions[2]->set_next_slot("mc");
+ m_expansions[2]->irq().set(FUNC(kc_d002_device::out_irq_w));
+ m_expansions[2]->nmi().set(FUNC(kc_d002_device::out_nmi_w));
+ m_expansions[2]->halt().set(FUNC(kc_d002_device::out_halt_w));
+ KCCART_SLOT(config, m_expansions[3], kc85_cart, nullptr);
+ m_expansions[3]->set_next_slot("exp");
+ m_expansions[3]->irq().set(FUNC(kc_d002_device::out_irq_w));
+ m_expansions[3]->nmi().set(FUNC(kc_d002_device::out_nmi_w));
+ m_expansions[3]->halt().set(FUNC(kc_d002_device::out_halt_w));
// expansion interface
- MCFG_DEVICE_ADD("exp", KCCART_SLOT, 0)
- MCFG_DEVICE_SLOT_INTERFACE(kc85_exp, nullptr, false)
- MCFG_KCEXP_SLOT_NEXT_SLOT(nullptr)
- MCFG_KCEXP_SLOT_OUT_IRQ_CB(WRITELINE(*this, kc_d002_device, out_irq_w))
- MCFG_KCEXP_SLOT_OUT_NMI_CB(WRITELINE(*this, kc_d002_device, out_nmi_w))
- MCFG_KCEXP_SLOT_OUT_HALT_CB(WRITELINE(*this, kc_d002_device, out_halt_w))
-MACHINE_CONFIG_END
+ KCCART_SLOT(config, m_expansions[4], kc85_exp, nullptr);
+ m_expansions[4]->set_next_slot(nullptr);
+ m_expansions[4]->irq().set(FUNC(kc_d002_device::out_irq_w));
+ m_expansions[4]->nmi().set(FUNC(kc_d002_device::out_nmi_w));
+ m_expansions[4]->halt().set(FUNC(kc_d002_device::out_halt_w));
+}
//-------------------------------------------------
// input_ports - device-specific input ports
diff --git a/src/devices/bus/kc/d004.cpp b/src/devices/bus/kc/d004.cpp
index 188166640cd..f07b6de1695 100644
--- a/src/devices/bus/kc/d004.cpp
+++ b/src/devices/bus/kc/d004.cpp
@@ -33,7 +33,7 @@ void kc_d004_device::kc_d004_io(address_map &map)
map.unmap_value_high();
map.global_mask(0xff);
map(0xf0, 0xf1).m(UPD765_TAG, FUNC(upd765a_device::map));
- map(0xf2, 0xf3).rw(UPD765_TAG, FUNC(upd765a_device::mdma_r), FUNC(upd765a_device::mdma_w));
+ map(0xf2, 0xf3).rw(UPD765_TAG, FUNC(upd765a_device::dma_r), FUNC(upd765a_device::dma_w));
map(0xf4, 0xf4).r(FUNC(kc_d004_device::hw_input_gate_r));
map(0xf6, 0xf7).w(FUNC(kc_d004_device::fdd_select_w));
map(0xf8, 0xf9).w(FUNC(kc_d004_device::hw_terminal_count_w));
@@ -45,7 +45,7 @@ void kc_d004_gide_device::kc_d004_gide_io(address_map &map)
map.unmap_value_high();
map(0x0000, 0xffff).rw(FUNC(kc_d004_gide_device::gide_r), FUNC(kc_d004_gide_device::gide_w));
map(0x00f0, 0x00f1).mirror(0xff00).m(UPD765_TAG, FUNC(upd765a_device::map));
- map(0x00f2, 0x00f3).mirror(0xff00).rw(UPD765_TAG, FUNC(upd765a_device::mdma_r), FUNC(upd765a_device::mdma_w));
+ map(0x00f2, 0x00f3).mirror(0xff00).rw(UPD765_TAG, FUNC(upd765a_device::dma_r), FUNC(upd765a_device::dma_w));
map(0x00f4, 0x00f4).mirror(0xff00).r(FUNC(kc_d004_gide_device::hw_input_gate_r));
map(0x00f6, 0x00f7).mirror(0xff00).w(FUNC(kc_d004_gide_device::fdd_select_w));
map(0x00f8, 0x00f9).mirror(0xff00).w(FUNC(kc_d004_gide_device::hw_terminal_count_w));
diff --git a/src/devices/bus/kc/kc.h b/src/devices/bus/kc/kc.h
index 0689169c5ee..0c14a8ef5d3 100644
--- a/src/devices/bus/kc/kc.h
+++ b/src/devices/bus/kc/kc.h
@@ -48,12 +48,21 @@ class kcexp_slot_device : public device_t,
{
public:
// construction/destruction
+ template <typename T>
+ kcexp_slot_device(machine_config const &mconfig, char const *tag, device_t *owner, T &&opts, char const *dflt)
+ : kcexp_slot_device(mconfig, tag, owner, (uint32_t)0)
+ {
+ option_reset();
+ opts(*this);
+ set_default_option(dflt);
+ set_fixed(false);
+ }
kcexp_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
virtual ~kcexp_slot_device();
- template <class Object> devcb_base &set_out_irq_callback(Object &&cb) { return m_out_irq_cb.set_callback(std::forward<Object>(cb)); }
- template <class Object> devcb_base &set_out_nmi_callback(Object &&cb) { return m_out_nmi_cb.set_callback(std::forward<Object>(cb)); }
- template <class Object> devcb_base &set_out_halt_callback(Object &&cb) { return m_out_halt_cb.set_callback(std::forward<Object>(cb)); }
+ auto irq() { return m_out_irq_cb.bind(); }
+ auto nmi() { return m_out_nmi_cb.bind(); }
+ auto halt() { return m_out_halt_cb.bind(); }
// inline configuration
void set_next_slot(const char *next_module_tag) { m_next_slot_tag = next_module_tag; }
@@ -91,6 +100,15 @@ class kccart_slot_device : public kcexp_slot_device,
{
public:
// construction/destruction
+ template <typename T>
+ kccart_slot_device(machine_config const &mconfig, char const *tag, device_t *owner, T &&opts, char const *dflt)
+ : kccart_slot_device(mconfig, tag, owner, (uint32_t)0)
+ {
+ option_reset();
+ opts(*this);
+ set_default_option(dflt);
+ set_fixed(false);
+ }
kccart_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
virtual ~kccart_slot_device();
@@ -115,42 +133,4 @@ public:
DECLARE_DEVICE_TYPE(KCEXP_SLOT, kcexp_slot_device)
DECLARE_DEVICE_TYPE(KCCART_SLOT, kccart_slot_device)
-
-/***************************************************************************
- DEVICE CONFIGURATION MACROS
-***************************************************************************/
-
-#define MCFG_KCEXP_SLOT_OUT_IRQ_CB(_devcb) \
- downcast<kcexp_slot_device &>(*device).set_out_irq_callback(DEVCB_##_devcb);
-
-#define MCFG_KCEXP_SLOT_OUT_NMI_CB(_devcb) \
- downcast<kcexp_slot_device &>(*device).set_out_nmi_callback(DEVCB_##_devcb);
-
-#define MCFG_KCEXP_SLOT_OUT_HALT_CB(_devcb) \
- downcast<kcexp_slot_device &>(*device).set_out_halt_callback(DEVCB_##_devcb);
-
-#define MCFG_KCEXP_SLOT_NEXT_SLOT(_next_slot_tag) \
- downcast<kcexp_slot_device &>(*device).set_next_slot(_next_slot_tag);
-
-
-#define MCFG_KCCART_SLOT_OUT_IRQ_CB(_devcb) \
- downcast<kccart_slot_device &>(*device).set_out_irq_callback(DEVCB_##_devcb);
-
-#define MCFG_KCCART_SLOT_OUT_NMI_CB(_devcb) \
- downcast<kccart_slot_device &>(*device).set_out_nmi_callback(DEVCB_##_devcb);
-
-#define MCFG_KCCART_SLOT_OUT_HALT_CB(_devcb) \
- downcast<kccart_slot_device &>(*device).set_out_halt_callback(DEVCB_##_devcb);
-
-#define MCFG_KCCART_SLOT_NEXT_SLOT(_next_slot_tag) \
- downcast<kccart_slot_device &>(*device).set_next_slot(_next_slot_tag);
-
-// #define MCFG_KC85_EXPANSION_ADD(_tag,_next_slot_tag,_config,_slot_intf,_def_slot)
-// MCFG_DEVICE_ADD(_tag, KCEXP_SLOT, 0)
-// MCFG_DEVICE_SLOT_INTERFACE(_slot_intf, _def_slot, false)
-
-// #define MCFG_KC85_CARTRIDGE_ADD(_tag,_next_slot_tag,_config,_slot_intf,_def_slot)
-// MCFG_DEVICE_ADD(_tag, KCCART_SLOT, 0)
-// MCFG_DEVICE_SLOT_INTERFACE(_slot_intf, _def_slot, false)
-
#endif // MAME_BUS_KC_KC_H
diff --git a/src/devices/bus/lpci/mpc105.cpp b/src/devices/bus/lpci/mpc105.cpp
index bf1583add8d..5816153f134 100644
--- a/src/devices/bus/lpci/mpc105.cpp
+++ b/src/devices/bus/lpci/mpc105.cpp
@@ -32,11 +32,10 @@ DEFINE_DEVICE_TYPE(MPC105, mpc105_device, "mpc105", "Motorola MPC105")
mpc105_device::mpc105_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
: device_t(mconfig, MPC105, tag, owner, clock),
pci_device_interface( mconfig, *this ),
- m_cpu_tag(nullptr),
m_bank_base_default(0),
m_bank_base(0),
m_bank_enable(0),
- m_maincpu(nullptr)
+ m_maincpu(*this, finder_base::DUMMY_TAG)
{
}
@@ -46,7 +45,6 @@ mpc105_device::mpc105_device(const machine_config &mconfig, const char *tag, dev
void mpc105_device::device_start()
{
- m_maincpu = machine().device<cpu_device>(m_cpu_tag);
}
//-------------------------------------------------
diff --git a/src/devices/bus/lpci/mpc105.h b/src/devices/bus/lpci/mpc105.h
index 65ab5a59637..94f9181a2d7 100644
--- a/src/devices/bus/lpci/mpc105.h
+++ b/src/devices/bus/lpci/mpc105.h
@@ -17,11 +17,6 @@
#define MPC105_MEMORYBANK_COUNT 8
-#define MCFG_MPC105_CPU( _tag ) \
- downcast<mpc105_device &>(*device).set_cpu(_tag);
-
-#define MCFG_MPC105_BANK_BASE_DEFAULT( bank_base_default ) \
- downcast<mpc105_device &>(*device).set_bank_base_default(bank_base_default);
// ======================> mpc105_device
@@ -32,7 +27,7 @@ public:
// construction/destruction
mpc105_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- void set_cpu(const char *tag) { m_cpu_tag = tag; }
+ template <typename T> void set_cpu(T &&tag) { m_maincpu.set_tag(std::forward<T>(tag)); }
void set_bank_base_default(int bank_base_default) { m_bank_base_default = bank_base_default; }
virtual uint32_t pci_read(pci_bus_device *pcibus, int function, int offset, uint32_t mem_mask) override;
@@ -46,13 +41,12 @@ protected:
void update_memory();
private:
- const char *m_cpu_tag;
int m_bank_base_default;
int m_bank_base;
uint8_t m_bank_enable;
uint32_t m_bank_registers[8];
- cpu_device* m_maincpu;
+ required_device<cpu_device> m_maincpu;
};
diff --git a/src/devices/bus/lpci/pci.h b/src/devices/bus/lpci/pci.h
index 6f7da915176..7f93875fcfb 100644
--- a/src/devices/bus/lpci/pci.h
+++ b/src/devices/bus/lpci/pci.h
@@ -114,20 +114,4 @@ private:
// device type definition
DECLARE_DEVICE_TYPE(PCI_BUS, pci_bus_device)
-
-/***************************************************************************
- DEVICE CONFIGURATION MACROS
-***************************************************************************/
-
-#define MCFG_PCI_BUS_ADD(_tag, _busnum) \
- MCFG_DEVICE_ADD(_tag, PCI_BUS, 0) \
- downcast<pci_bus_device *>(device)->set_busnum(_busnum);
-#define MCFG_PCI_BUS_DEVICE(_tag, _slot_intf, _def_slot, _fixed) \
- MCFG_DEVICE_ADD(_tag, PCI_CONNECTOR, 0) \
- MCFG_DEVICE_SLOT_INTERFACE(_slot_intf, _def_slot, _fixed)
-
-#define MCFG_PCI_BUS_SIBLING(_father_tag) \
- downcast<pci_bus_device *>(device)->set_father(_father_tag);
-
-
#endif // MAME_BUS_LPCI_PCI_H
diff --git a/src/devices/bus/lpci/southbridge.cpp b/src/devices/bus/lpci/southbridge.cpp
index 01228cddc3b..c4ce2257ed1 100644
--- a/src/devices/bus/lpci/southbridge.cpp
+++ b/src/devices/bus/lpci/southbridge.cpp
@@ -90,7 +90,8 @@ void southbridge_device::device_add_mconfig(machine_config &config)
SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.50);
ISA16(config, m_isabus, 0);
- m_isabus->set_cputag(":maincpu");
+ m_isabus->set_memspace(":maincpu", AS_PROGRAM);
+ m_isabus->set_iospace(":maincpu", AS_IO);
m_isabus->irq3_callback().set("pic8259_master", FUNC(pic8259_device::ir3_w));
m_isabus->irq4_callback().set("pic8259_master", FUNC(pic8259_device::ir4_w));
m_isabus->irq5_callback().set("pic8259_master", FUNC(pic8259_device::ir5_w));
@@ -109,6 +110,7 @@ void southbridge_device::device_add_mconfig(machine_config &config)
m_isabus->drq5_callback().set("dma8237_2", FUNC(am9517a_device::dreq1_w));
m_isabus->drq6_callback().set("dma8237_2", FUNC(am9517a_device::dreq2_w));
m_isabus->drq7_callback().set("dma8237_2", FUNC(am9517a_device::dreq3_w));
+ m_isabus->iochck_callback().set(FUNC(southbridge_device::iochck_w));
}
southbridge_device::southbridge_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock) :
@@ -215,9 +217,9 @@ WRITE8_MEMBER(southbridge_device::eisa_irq_write)
void southbridge_device::device_start()
{
- spaceio = &machine().device(":maincpu")->memory().space(AS_IO);
+ spaceio = &m_maincpu->space(AS_IO);
- spaceio->install_readwrite_handler(0x0000, 0x001f, read8_delegate(FUNC(am9517a_device::read), &(*m_dma8237_1)), write8_delegate(FUNC(am9517a_device::write), &(*m_dma8237_1)), 0xffffffff);
+ spaceio->install_readwrite_handler(0x0000, 0x001f, read8sm_delegate(FUNC(am9517a_device::read), &(*m_dma8237_1)), write8sm_delegate(FUNC(am9517a_device::write), &(*m_dma8237_1)), 0xffffffff);
spaceio->install_readwrite_handler(0x0020, 0x003f, read8sm_delegate(FUNC(pic8259_device::read), &(*m_pic8259_master)), write8sm_delegate(FUNC(pic8259_device::write), &(*m_pic8259_master)), 0xffffffff);
spaceio->install_readwrite_handler(0x0040, 0x005f, read8sm_delegate(FUNC(pit8254_device::read), &(*m_pit8254)), write8sm_delegate(FUNC(pit8254_device::write), &(*m_pit8254)), 0xffffffff);
spaceio->install_readwrite_handler(0x0060, 0x0063, read8_delegate(FUNC(southbridge_device::at_portb_r), this), write8_delegate(FUNC(southbridge_device::at_portb_w), this), 0x0000ff00);
@@ -479,17 +481,24 @@ WRITE8_MEMBER( southbridge_device::at_portb_w )
m_pit8254->write_gate2(BIT(data, 0));
at_speaker_set_spkrdata( BIT(data, 1));
m_channel_check = BIT(data, 3);
- m_isabus->set_nmi_state((m_nmi_enabled==0) && (m_channel_check==0));
+ if (m_channel_check)
+ m_maincpu->set_input_line(INPUT_LINE_NMI, CLEAR_LINE);
+}
+
+WRITE_LINE_MEMBER( southbridge_device::iochck_w )
+{
+ if (!state && !m_channel_check && m_nmi_enabled)
+ m_maincpu->set_input_line(INPUT_LINE_NMI, ASSERT_LINE);
}
READ8_MEMBER( southbridge_device::at_dma8237_2_r )
{
- return m_dma8237_2->read( space, offset / 2);
+ return m_dma8237_2->read(offset / 2);
}
WRITE8_MEMBER( southbridge_device::at_dma8237_2_w )
{
- m_dma8237_2->write( space, offset / 2, data);
+ m_dma8237_2->write(offset / 2, data);
}
/***************************************************************************
@@ -507,7 +516,8 @@ static void pc_isa_onboard(device_slot_interface &device)
// device_add_mconfig - add device configuration
//-------------------------------------------------
-MACHINE_CONFIG_START(southbridge_extended_device::device_add_mconfig)
+void southbridge_extended_device::device_add_mconfig(machine_config &config)
+{
southbridge_device::device_add_mconfig(config);
at_keyboard_controller_device &keybc(AT_KEYBOARD_CONTROLLER(config, "keybc", XTAL(12'000'000)));
@@ -517,20 +527,20 @@ MACHINE_CONFIG_START(southbridge_extended_device::device_add_mconfig)
keybc.kbd_clk().set("pc_kbdc", FUNC(pc_kbdc_device::clock_write_from_mb));
keybc.kbd_data().set("pc_kbdc", FUNC(pc_kbdc_device::data_write_from_mb));
- MCFG_DEVICE_ADD("pc_kbdc", PC_KBDC, 0)
- MCFG_PC_KBDC_OUT_CLOCK_CB(WRITELINE("keybc", at_keyboard_controller_device, kbd_clk_w))
- MCFG_PC_KBDC_OUT_DATA_CB(WRITELINE("keybc", at_keyboard_controller_device, kbd_data_w))
- MCFG_PC_KBDC_SLOT_ADD("pc_kbdc", "kbd", pc_at_keyboards, STR_KBD_MICROSOFT_NATURAL)
+ PC_KBDC(config, m_pc_kbdc, 0);
+ m_pc_kbdc->out_clock_cb().set(m_keybc, FUNC(at_keyboard_controller_device::kbd_clk_w));
+ m_pc_kbdc->out_data_cb().set(m_keybc, FUNC(at_keyboard_controller_device::kbd_data_w));
+ PC_KBDC_SLOT(config, "kbd", pc_at_keyboards, STR_KBD_MICROSOFT_NATURAL).set_pc_kbdc_slot(m_pc_kbdc);
ds12885_device &rtc(DS12885(config, "rtc"));
rtc.irq().set("pic8259_slave", FUNC(pic8259_device::ir0_w));
rtc.set_century_index(0x32);
// on board devices
- MCFG_DEVICE_ADD("board1", ISA16_SLOT, 0, "isabus", pc_isa_onboard, "fdcsmc", true) // FIXME: determine ISA bus clock
- MCFG_DEVICE_ADD("board2", ISA16_SLOT, 0, "isabus", pc_isa_onboard, "comat", true)
- MCFG_DEVICE_ADD("board3", ISA16_SLOT, 0, "isabus", pc_isa_onboard, "lpt", true)
-MACHINE_CONFIG_END
+ ISA16_SLOT(config, "board1", 0, "isabus", pc_isa_onboard, "fdcsmc", true); // FIXME: determine ISA bus clock
+ ISA16_SLOT(config, "board2", 0, "isabus", pc_isa_onboard, "comat", true);
+ ISA16_SLOT(config, "board3", 0, "isabus", pc_isa_onboard, "lpt", true);
+}
southbridge_extended_device::southbridge_extended_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock)
: southbridge_device(mconfig, type, tag, owner, clock),
@@ -546,13 +556,13 @@ southbridge_extended_device::southbridge_extended_device(const machine_config &m
void southbridge_extended_device::device_start()
{
- address_space& spaceio = machine().device(":maincpu")->memory().space(AS_IO);
+ address_space& spaceio = m_maincpu->space(AS_IO);
southbridge_device::device_start();
- spaceio.install_readwrite_handler(0x0060, 0x0063, read8_delegate(FUNC(at_keyboard_controller_device::data_r), &(*m_keybc)), write8_delegate(FUNC(at_keyboard_controller_device::data_w), &(*m_keybc)), 0x000000ff);
- spaceio.install_readwrite_handler(0x0064, 0x0067, read8_delegate(FUNC(at_keyboard_controller_device::status_r), &(*m_keybc)), write8_delegate(FUNC(at_keyboard_controller_device::command_w), &(*m_keybc)), 0xffffffff);
- spaceio.install_readwrite_handler(0x0070, 0x007f, read8_delegate(FUNC(ds12885_device::read), &(*m_ds12885)), write8_delegate(FUNC(ds12885_device::write), &(*m_ds12885)), 0xffffffff);
+ spaceio.install_readwrite_handler(0x0060, 0x0063, read8smo_delegate(FUNC(at_keyboard_controller_device::data_r), &(*m_keybc)), write8smo_delegate(FUNC(at_keyboard_controller_device::data_w), &(*m_keybc)), 0x000000ff);
+ spaceio.install_readwrite_handler(0x0064, 0x0067, read8smo_delegate(FUNC(at_keyboard_controller_device::status_r), &(*m_keybc)), write8smo_delegate(FUNC(at_keyboard_controller_device::command_w), &(*m_keybc)), 0xffffffff);
+ spaceio.install_readwrite_handler(0x0070, 0x007f, read8sm_delegate(FUNC(ds12885_device::read), &(*m_ds12885)), write8sm_delegate(FUNC(ds12885_device::write), &(*m_ds12885)), 0xffffffff);
}
//-------------------------------------------------
@@ -568,10 +578,11 @@ WRITE8_MEMBER( southbridge_extended_device::write_rtc )
{
if (offset==0) {
m_nmi_enabled = BIT(data,7);
- m_isabus->set_nmi_state((m_nmi_enabled==0) && (m_channel_check==0));
- m_ds12885->write(space,0,data);
+ if (!m_nmi_enabled)
+ m_maincpu->set_input_line(INPUT_LINE_NMI, CLEAR_LINE);
+ m_ds12885->write(0,data);
}
else {
- m_ds12885->write(space,offset,data);
+ m_ds12885->write(offset,data);
}
}
diff --git a/src/devices/bus/lpci/southbridge.h b/src/devices/bus/lpci/southbridge.h
index 0e25c8392f4..7c2c8f3760f 100644
--- a/src/devices/bus/lpci/southbridge.h
+++ b/src/devices/bus/lpci/southbridge.h
@@ -87,6 +87,7 @@ private:
DECLARE_WRITE8_MEMBER(at_page8_w);
DECLARE_READ8_MEMBER(at_portb_r);
DECLARE_WRITE8_MEMBER(at_portb_w);
+ DECLARE_WRITE_LINE_MEMBER(iochck_w);
DECLARE_READ8_MEMBER(get_slave_ack);
DECLARE_WRITE_LINE_MEMBER(at_pit8254_out0_changed);
DECLARE_WRITE_LINE_MEMBER(at_pit8254_out1_changed);
diff --git a/src/devices/bus/m5/slot.h b/src/devices/bus/m5/slot.h
index 48cb4d15124..e2a835238b9 100644
--- a/src/devices/bus/m5/slot.h
+++ b/src/devices/bus/m5/slot.h
@@ -66,7 +66,17 @@ class m5_cart_slot_device : public device_t,
{
public:
// construction/destruction
- m5_cart_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+ template <typename T>
+ m5_cart_slot_device(machine_config const &mconfig, char const *tag, device_t *owner, T &&opts, char const *dflt)
+ : m5_cart_slot_device(mconfig, tag, owner, 0)
+ {
+ option_reset();
+ opts(*this);
+ set_default_option(dflt);
+ set_fixed(false);
+ }
+
+ m5_cart_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock = 0);
virtual ~m5_cart_slot_device();
// device-level overrides
@@ -116,9 +126,4 @@ DECLARE_DEVICE_TYPE(M5_CART_SLOT, m5_cart_slot_device)
#define M5SLOT_ROM_REGION_TAG ":cart:rom"
-#define MCFG_M5_CARTRIDGE_ADD(_tag,_slot_intf,_def_slot) \
- MCFG_DEVICE_ADD(_tag, M5_CART_SLOT, 0) \
- MCFG_DEVICE_SLOT_INTERFACE(_slot_intf, _def_slot, false)
-
-
#endif // MAME_BUS_M5_SLOT_H
diff --git a/src/devices/bus/macpds/macpds.h b/src/devices/bus/macpds/macpds.h
index d37a393a78a..2354549afd5 100644
--- a/src/devices/bus/macpds/macpds.h
+++ b/src/devices/bus/macpds/macpds.h
@@ -14,22 +14,6 @@
#pragma once
-
-//**************************************************************************
-// INTERFACE CONFIGURATION MACROS
-//**************************************************************************
-
-#define MCFG_MACPDS_SLOT_REMOVE(_tag) \
- MCFG_DEVICE_REMOVE(_tag)
-
-#define MCFG_MACPDS_ONBOARD_ADD(_nbtag, _tag, _dev_type, _def_inp) \
- MCFG_DEVICE_ADD(_tag, _dev_type, 0) \
- MCFG_DEVICE_INPUT_DEFAULTS(_def_inp) \
- downcast<device_macpds_card_interface &>(*device).set_macpds_tag(_nbtag, _tag);
-
-#define MCFG_MACPDS_BUS_REMOVE(_tag) \
- MCFG_DEVICE_REMOVE(_tag)
-
//**************************************************************************
// TYPE DEFINITIONS
//**************************************************************************
diff --git a/src/devices/bus/macpds/pds_tpdfpd.cpp b/src/devices/bus/macpds/pds_tpdfpd.cpp
index aba55746cc2..1a3f2671e5c 100644
--- a/src/devices/bus/macpds/pds_tpdfpd.cpp
+++ b/src/devices/bus/macpds/pds_tpdfpd.cpp
@@ -58,13 +58,12 @@ DEFINE_DEVICE_TYPE(PDS_SEDISPLAY, macpds_sedisplay_device, "pds_sefp", "Radius S
// device_add_mconfig - add device configuration
//-------------------------------------------------
-MACHINE_CONFIG_START(macpds_sedisplay_device::device_add_mconfig)
- MCFG_SCREEN_ADD( SEDISPLAY_SCREEN_NAME, RASTER)
- MCFG_SCREEN_UPDATE_DEVICE(DEVICE_SELF, macpds_sedisplay_device, screen_update)
- MCFG_SCREEN_SIZE(1280, 960)
- MCFG_SCREEN_REFRESH_RATE(70)
- MCFG_SCREEN_VISIBLE_AREA(0, 640-1, 0, 870-1)
-MACHINE_CONFIG_END
+void macpds_sedisplay_device::device_add_mconfig(machine_config &config)
+{
+ screen_device &screen(SCREEN(config, SEDISPLAY_SCREEN_NAME, SCREEN_TYPE_RASTER));
+ screen.set_screen_update(FUNC(macpds_sedisplay_device::screen_update));
+ screen.set_raw(55_MHz_XTAL, 800, 0, 640, 1024, 0, 870);
+}
//-------------------------------------------------
// rom_region - device-specific ROM region
diff --git a/src/devices/bus/megadrive/eeprom.cpp b/src/devices/bus/megadrive/eeprom.cpp
index a39daf4fb52..32787dec152 100644
--- a/src/devices/bus/megadrive/eeprom.cpp
+++ b/src/devices/bus/megadrive/eeprom.cpp
@@ -107,33 +107,40 @@ md_eeprom_blara_device::md_eeprom_blara_device(const machine_config &mconfig, co
// device_add_mconfig - add device configuration
//-------------------------------------------------
-MACHINE_CONFIG_START(md_std_eeprom_device::device_add_mconfig)
- MCFG_24C01_ADD("i2cmem")
-MACHINE_CONFIG_END
+void md_std_eeprom_device::device_add_mconfig(machine_config &config)
+{
+ I2C_24C01(config, m_i2cmem);
+}
-MACHINE_CONFIG_START(md_eeprom_nbajam_device::device_add_mconfig)
- MCFG_24C02_ADD("i2cmem")
-MACHINE_CONFIG_END
+void md_eeprom_nbajam_device::device_add_mconfig(machine_config &config)
+{
+ I2C_24C02(config, m_i2cmem);
+}
-MACHINE_CONFIG_START(md_eeprom_nbajamte_device::device_add_mconfig)
- MCFG_24C02_ADD("i2cmem")
-MACHINE_CONFIG_END
+void md_eeprom_nbajamte_device::device_add_mconfig(machine_config &config)
+{
+ I2C_24C01(config, m_i2cmem);
+}
-MACHINE_CONFIG_START(md_eeprom_cslam_device::device_add_mconfig)
- MCFG_24C64_ADD("i2cmem")
-MACHINE_CONFIG_END
+void md_eeprom_cslam_device::device_add_mconfig(machine_config &config)
+{
+ I2C_24C64(config, m_i2cmem);
+}
-MACHINE_CONFIG_START(md_eeprom_nflqb_device::device_add_mconfig)
- MCFG_24C16_ADD("i2cmem")
-MACHINE_CONFIG_END
+void md_eeprom_nflqb_device::device_add_mconfig(machine_config &config)
+{
+ I2C_24C16(config, m_i2cmem);
+}
-MACHINE_CONFIG_START(md_eeprom_nhlpa_device::device_add_mconfig)
- MCFG_24C01_ADD("i2cmem")
-MACHINE_CONFIG_END
+void md_eeprom_nhlpa_device::device_add_mconfig(machine_config &config)
+{
+ I2C_24C01(config, m_i2cmem);
+}
-MACHINE_CONFIG_START(md_eeprom_blara_device::device_add_mconfig)
- MCFG_24C64_ADD("i2cmem")
-MACHINE_CONFIG_END
+void md_eeprom_blara_device::device_add_mconfig(machine_config &config)
+{
+ I2C_24C64(config, m_i2cmem);
+}
void md_std_eeprom_device::device_start()
{
diff --git a/src/devices/bus/megadrive/ggenie.cpp b/src/devices/bus/megadrive/ggenie.cpp
index a6001971529..17dbb78fc1d 100644
--- a/src/devices/bus/megadrive/ggenie.cpp
+++ b/src/devices/bus/megadrive/ggenie.cpp
@@ -172,7 +172,8 @@ static void ggenie_sub_cart(device_slot_interface &device)
// device_add_mconfig - add device configuration
//-------------------------------------------------
-MACHINE_CONFIG_START(md_rom_ggenie_device::device_add_mconfig)
- MCFG_MD_CARTRIDGE_ADD("subslot", ggenie_sub_cart, nullptr)
- MCFG_MD_CARTRIDGE_NOT_MANDATORY
-MACHINE_CONFIG_END
+void md_rom_ggenie_device::device_add_mconfig(machine_config &config)
+{
+ MD_CART_SLOT(config, m_exp, ggenie_sub_cart, nullptr);
+ m_exp->set_must_be_loaded(false);
+}
diff --git a/src/devices/bus/megadrive/jcart.cpp b/src/devices/bus/megadrive/jcart.cpp
index aa6d763e517..76f38ff0dd3 100644
--- a/src/devices/bus/megadrive/jcart.cpp
+++ b/src/devices/bus/megadrive/jcart.cpp
@@ -81,13 +81,15 @@ md_seprom_mm96_device::md_seprom_mm96_device(const machine_config &mconfig, cons
// device_add_mconfig - add device configuration
//-------------------------------------------------
-MACHINE_CONFIG_START(md_seprom_codemast_device::device_add_mconfig)
- MCFG_24C08_ADD("i2cmem")
-MACHINE_CONFIG_END
+void md_seprom_codemast_device::device_add_mconfig(machine_config &config)
+{
+ I2C_24C08(config, m_i2cmem);
+}
-MACHINE_CONFIG_START(md_seprom_mm96_device::device_add_mconfig)
- MCFG_24C16A_ADD("i2cmem")
-MACHINE_CONFIG_END
+void md_seprom_mm96_device::device_add_mconfig(machine_config &config)
+{
+ I2C_24C16A(config, m_i2cmem);
+}
static INPUT_PORTS_START( jcart_ipt )
diff --git a/src/devices/bus/megadrive/md_slot.h b/src/devices/bus/megadrive/md_slot.h
index c9372ada7df..42fd2503f76 100644
--- a/src/devices/bus/megadrive/md_slot.h
+++ b/src/devices/bus/megadrive/md_slot.h
@@ -211,6 +211,16 @@ class md_cart_slot_device : public base_md_cart_slot_device
{
public:
// construction/destruction
+ template <typename T>
+ md_cart_slot_device(machine_config const &mconfig, char const *tag, device_t *owner, T &&opts, char const *dflt)
+ : md_cart_slot_device(mconfig, tag, owner, (uint32_t)0)
+ {
+ option_reset();
+ opts(*this);
+ set_default_option(dflt);
+ set_fixed(false);
+ }
+
md_cart_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
virtual const char *image_interface() const override { return "megadriv_cart"; }
virtual const char *file_extensions() const override { return "smd,bin,md,gen"; }
@@ -269,12 +279,4 @@ DECLARE_DEVICE_TYPE(COPERA_CART_SLOT, copera_cart_slot_device)
#define MDSLOT_ROM_REGION_TAG ":cart:rom"
-#define MCFG_MD_CARTRIDGE_ADD(_tag,_slot_intf,_def_slot) \
- MCFG_DEVICE_ADD(_tag, MD_CART_SLOT, 0) \
- MCFG_DEVICE_SLOT_INTERFACE(_slot_intf, _def_slot, false)
-
-#define MCFG_MD_CARTRIDGE_NOT_MANDATORY \
- static_cast<md_cart_slot_device *>(device)->set_must_be_loaded(false);
-
-
#endif // MAME_BUS_MEGADRIVE_MD_SLOT_H
diff --git a/src/devices/bus/megadrive/sk.cpp b/src/devices/bus/megadrive/sk.cpp
index b48163e9b94..c45574ff1a3 100644
--- a/src/devices/bus/megadrive/sk.cpp
+++ b/src/devices/bus/megadrive/sk.cpp
@@ -79,7 +79,8 @@ static void sk_sub_cart(device_slot_interface &device)
// device_add_mconfig - add device configuration
//-------------------------------------------------
-MACHINE_CONFIG_START(md_rom_sk_device::device_add_mconfig)
- MCFG_MD_CARTRIDGE_ADD("subslot", sk_sub_cart, nullptr)
- MCFG_MD_CARTRIDGE_NOT_MANDATORY
-MACHINE_CONFIG_END
+void md_rom_sk_device::device_add_mconfig(machine_config &config)
+{
+ MD_CART_SLOT(config, m_exp, sk_sub_cart, nullptr);
+ m_exp->set_must_be_loaded(false);
+}
diff --git a/src/devices/bus/megadrive/svp.cpp b/src/devices/bus/megadrive/svp.cpp
index 2ed4e40ba1f..fe4ae33536e 100644
--- a/src/devices/bus/megadrive/svp.cpp
+++ b/src/devices/bus/megadrive/svp.cpp
@@ -347,11 +347,12 @@ void md_rom_svp_device::md_svp_ext_map(address_map &map)
// device_add_mconfig - add device configuration
//-------------------------------------------------
-MACHINE_CONFIG_START(md_rom_svp_device::device_add_mconfig)
- MCFG_DEVICE_ADD("svp", SSP1601, MASTER_CLOCK_NTSC / 7 * 3) /* ~23 MHz (guessed) */
- MCFG_DEVICE_PROGRAM_MAP(md_svp_ssp_map)
- MCFG_DEVICE_IO_MAP(md_svp_ext_map)
-MACHINE_CONFIG_END
+void md_rom_svp_device::device_add_mconfig(machine_config &config)
+{
+ SSP1601(config, m_svp, MASTER_CLOCK_NTSC / 7 * 3); /* ~23 MHz (guessed) */
+ m_svp->set_addrmap(AS_PROGRAM, &md_rom_svp_device::md_svp_ssp_map);
+ m_svp->set_addrmap(AS_IO, &md_rom_svp_device::md_svp_ext_map);
+}
ioport_constructor md_rom_svp_device::device_input_ports() const
{
diff --git a/src/devices/bus/midi/midi.h b/src/devices/bus/midi/midi.h
index e85a69b9b35..162d2d7545e 100644
--- a/src/devices/bus/midi/midi.h
+++ b/src/devices/bus/midi/midi.h
@@ -6,13 +6,6 @@
#pragma once
-#define MCFG_MIDI_PORT_ADD(_tag, _slot_intf, _def_slot) \
- MCFG_DEVICE_ADD(_tag, MIDI_PORT, 0) \
- MCFG_DEVICE_SLOT_INTERFACE(_slot_intf, _def_slot, false)
-
-#define MCFG_MIDI_RX_HANDLER(_devcb) \
- downcast<midi_port_device &>(*device).set_rx_handler(DEVCB_##_devcb);
-
class device_midi_port_interface;
class midi_port_device : public device_t,
@@ -34,7 +27,6 @@ public:
virtual ~midi_port_device();
// static configuration helpers
- template <class Object> devcb_base &set_rx_handler(Object &&cb) { return m_rxd_handler.set_callback(std::forward<Object>(cb)); }
auto rxd_handler() { return m_rxd_handler.bind(); }
DECLARE_WRITE_LINE_MEMBER( write_txd );
diff --git a/src/devices/bus/midi/midiinport.cpp b/src/devices/bus/midi/midiinport.cpp
index 81bbeb80f1c..bad75b6959e 100644
--- a/src/devices/bus/midi/midiinport.cpp
+++ b/src/devices/bus/midi/midiinport.cpp
@@ -20,7 +20,8 @@ midiin_port_device::midiin_port_device(const machine_config &mconfig, const char
{
}
-MACHINE_CONFIG_START(midiin_port_device::device_add_mconfig)
- MCFG_DEVICE_ADD("midiinimg", MIDIIN, 0)
- MCFG_MIDIIN_INPUT_CB(WRITELINE(*this, midiin_port_device, read))
-MACHINE_CONFIG_END
+void midiin_port_device::device_add_mconfig(machine_config &config)
+{
+ MIDIIN(config, m_midiin, 0);
+ m_midiin->input_callback().set(FUNC(midiin_port_device::read));
+}
diff --git a/src/devices/bus/midi/midioutport.cpp b/src/devices/bus/midi/midioutport.cpp
index 449b85b4649..7f15c79fc70 100644
--- a/src/devices/bus/midi/midioutport.cpp
+++ b/src/devices/bus/midi/midioutport.cpp
@@ -20,6 +20,7 @@ midiout_port_device::midiout_port_device(const machine_config &mconfig, const ch
{
}
-MACHINE_CONFIG_START(midiout_port_device::device_add_mconfig)
- MCFG_MIDIOUT_ADD("midioutimg")
-MACHINE_CONFIG_END
+void midiout_port_device::device_add_mconfig(machine_config &config)
+{
+ MIDIOUT(config, m_midiout, 0);
+}
diff --git a/src/devices/bus/msx_cart/arc.cpp b/src/devices/bus/msx_cart/arc.cpp
index 3504071ec4c..406ec8f4de3 100644
--- a/src/devices/bus/msx_cart/arc.cpp
+++ b/src/devices/bus/msx_cart/arc.cpp
@@ -18,9 +18,8 @@ msx_cart_arc_device::msx_cart_arc_device(const machine_config &mconfig, const ch
void msx_cart_arc_device::device_start()
{
// Install IO read/write handlers
- address_space &space = machine().device<cpu_device>("maincpu")->space(AS_IO);
- space.install_write_handler(0x7f, 0x7f, write8_delegate(FUNC(msx_cart_arc_device::io_7f_w), this));
- space.install_read_handler(0x7f, 0x7f, read8_delegate(FUNC(msx_cart_arc_device::io_7f_r), this));
+ io_space().install_write_handler(0x7f, 0x7f, write8smo_delegate(FUNC(msx_cart_arc_device::io_7f_w), this));
+ io_space().install_read_handler(0x7f, 0x7f, read8smo_delegate(FUNC(msx_cart_arc_device::io_7f_r), this));
}
@@ -39,7 +38,7 @@ void msx_cart_arc_device::initialize_cartridge()
}
-READ8_MEMBER(msx_cart_arc_device::read_cart)
+uint8_t msx_cart_arc_device::read_cart(offs_t offset)
{
if (offset >= 0x4000 && offset < 0xc000)
{
@@ -49,7 +48,7 @@ READ8_MEMBER(msx_cart_arc_device::read_cart)
}
-WRITE8_MEMBER(msx_cart_arc_device::io_7f_w)
+void msx_cart_arc_device::io_7f_w(uint8_t data)
{
if (data == 0x35)
{
@@ -58,7 +57,7 @@ WRITE8_MEMBER(msx_cart_arc_device::io_7f_w)
}
-READ8_MEMBER(msx_cart_arc_device::io_7f_r)
+uint8_t msx_cart_arc_device::io_7f_r()
{
return ((m_7f & 0x03) == 0x03) ? 0xda : 0xff;
}
diff --git a/src/devices/bus/msx_cart/arc.h b/src/devices/bus/msx_cart/arc.h
index 308589961fd..69f4427a01f 100644
--- a/src/devices/bus/msx_cart/arc.h
+++ b/src/devices/bus/msx_cart/arc.h
@@ -18,10 +18,7 @@ public:
virtual void initialize_cartridge() override;
- virtual DECLARE_READ8_MEMBER(read_cart) override;
-
- DECLARE_WRITE8_MEMBER(io_7f_w);
- DECLARE_READ8_MEMBER(io_7f_r);
+ virtual uint8_t read_cart(offs_t offset) override;
protected:
// device-level overrides
@@ -29,6 +26,9 @@ protected:
virtual void device_reset() override;
private:
+ void io_7f_w(uint8_t data);
+ uint8_t io_7f_r();
+
uint8_t m_7f;
};
diff --git a/src/devices/bus/msx_cart/ascii.cpp b/src/devices/bus/msx_cart/ascii.cpp
index c7598a8ccc0..7d1b354b404 100644
--- a/src/devices/bus/msx_cart/ascii.cpp
+++ b/src/devices/bus/msx_cart/ascii.cpp
@@ -27,8 +27,12 @@ msx_cart_ascii8_device::msx_cart_ascii8_device(const machine_config &mconfig, co
void msx_cart_ascii8_device::device_start()
{
save_item(NAME(m_selected_bank));
+}
+
- machine().save().register_postload(save_prepost_delegate(FUNC(msx_cart_ascii8_device::restore_banks), this));
+void msx_cart_ascii8_device::device_post_load()
+{
+ restore_banks();
}
@@ -72,7 +76,7 @@ void msx_cart_ascii8_device::initialize_cartridge()
}
-READ8_MEMBER(msx_cart_ascii8_device::read_cart)
+uint8_t msx_cart_ascii8_device::read_cart(offs_t offset)
{
if ( offset >= 0x4000 && offset < 0xC000 )
{
@@ -82,7 +86,7 @@ READ8_MEMBER(msx_cart_ascii8_device::read_cart)
}
-WRITE8_MEMBER(msx_cart_ascii8_device::write_cart)
+void msx_cart_ascii8_device::write_cart(offs_t offset, uint8_t data)
{
if (offset >= 0x6000 && offset < 0x8000)
{
@@ -111,8 +115,12 @@ msx_cart_ascii16_device::msx_cart_ascii16_device(const machine_config &mconfig,
void msx_cart_ascii16_device::device_start()
{
save_item(NAME(m_selected_bank));
+}
- machine().save().register_postload(save_prepost_delegate(FUNC(msx_cart_ascii16_device::restore_banks), this));
+
+void msx_cart_ascii16_device::device_post_load()
+{
+ restore_banks();
}
@@ -156,7 +164,7 @@ void msx_cart_ascii16_device::initialize_cartridge()
}
-READ8_MEMBER(msx_cart_ascii16_device::read_cart)
+uint8_t msx_cart_ascii16_device::read_cart(offs_t offset)
{
if ( offset >= 0x4000 && offset < 0xC000 )
{
@@ -166,7 +174,7 @@ READ8_MEMBER(msx_cart_ascii16_device::read_cart)
}
-WRITE8_MEMBER(msx_cart_ascii16_device::write_cart)
+void msx_cart_ascii16_device::write_cart(offs_t offset, uint8_t data)
{
if (offset >= 0x6000 && offset < 0x6800)
{
@@ -202,8 +210,12 @@ msx_cart_ascii8_sram_device::msx_cart_ascii8_sram_device(const machine_config &m
void msx_cart_ascii8_sram_device::device_start()
{
save_item(NAME(m_selected_bank));
+}
+
- machine().save().register_postload(save_prepost_delegate(FUNC(msx_cart_ascii8_sram_device::restore_banks), this));
+void msx_cart_ascii8_sram_device::device_post_load()
+{
+ restore_banks();
}
@@ -272,7 +284,7 @@ void msx_cart_ascii8_sram_device::initialize_cartridge()
}
-READ8_MEMBER(msx_cart_ascii8_sram_device::read_cart)
+uint8_t msx_cart_ascii8_sram_device::read_cart(offs_t offset)
{
if ( offset >= 0x4000 && offset < 0xC000 )
{
@@ -287,7 +299,7 @@ READ8_MEMBER(msx_cart_ascii8_sram_device::read_cart)
}
-WRITE8_MEMBER(msx_cart_ascii8_sram_device::write_cart)
+void msx_cart_ascii8_sram_device::write_cart(offs_t offset, uint8_t data)
{
if (offset >= 0x6000 && offset < 0x8000)
{
@@ -327,8 +339,12 @@ msx_cart_ascii16_sram_device::msx_cart_ascii16_sram_device(const machine_config
void msx_cart_ascii16_sram_device::device_start()
{
save_item(NAME(m_selected_bank));
+}
- machine().save().register_postload(save_prepost_delegate(FUNC(msx_cart_ascii16_sram_device::restore_banks), this));
+
+void msx_cart_ascii16_sram_device::device_post_load()
+{
+ restore_banks();
}
@@ -397,7 +413,7 @@ void msx_cart_ascii16_sram_device::initialize_cartridge()
}
-READ8_MEMBER(msx_cart_ascii16_sram_device::read_cart)
+uint8_t msx_cart_ascii16_sram_device::read_cart(offs_t offset)
{
if ( offset >= 0x4000 && offset < 0xC000 )
{
@@ -419,7 +435,7 @@ READ8_MEMBER(msx_cart_ascii16_sram_device::read_cart)
}
-WRITE8_MEMBER(msx_cart_ascii16_sram_device::write_cart)
+void msx_cart_ascii16_sram_device::write_cart(offs_t offset, uint8_t data)
{
if (offset >= 0x6000 && offset < 0x6800)
{
@@ -461,8 +477,12 @@ msx_cart_msxwrite_device::msx_cart_msxwrite_device(const machine_config &mconfig
void msx_cart_msxwrite_device::device_start()
{
save_item(NAME(m_selected_bank));
+}
+
- machine().save().register_postload(save_prepost_delegate(FUNC(msx_cart_msxwrite_device::restore_banks), this));
+void msx_cart_msxwrite_device::device_post_load()
+{
+ restore_banks();
}
@@ -506,7 +526,7 @@ void msx_cart_msxwrite_device::initialize_cartridge()
}
-READ8_MEMBER(msx_cart_msxwrite_device::read_cart)
+uint8_t msx_cart_msxwrite_device::read_cart(offs_t offset)
{
if ( offset >= 0x4000 && offset < 0xC000 )
{
@@ -516,7 +536,7 @@ READ8_MEMBER(msx_cart_msxwrite_device::read_cart)
}
-WRITE8_MEMBER(msx_cart_msxwrite_device::write_cart)
+void msx_cart_msxwrite_device::write_cart(offs_t offset, uint8_t data)
{
// The rom writes to 6fff and 7fff for banking, unknown whether
// other locations also trigger banking.
diff --git a/src/devices/bus/msx_cart/ascii.h b/src/devices/bus/msx_cart/ascii.h
index 2df178dc31d..0c5898fed40 100644
--- a/src/devices/bus/msx_cart/ascii.h
+++ b/src/devices/bus/msx_cart/ascii.h
@@ -22,13 +22,14 @@ public:
virtual void initialize_cartridge() override;
- virtual DECLARE_READ8_MEMBER(read_cart) override;
- virtual DECLARE_WRITE8_MEMBER(write_cart) override;
+ virtual uint8_t read_cart(offs_t offset) override;
+ virtual void write_cart(offs_t offset, uint8_t data) override;
protected:
// device-level overrides
virtual void device_start() override;
virtual void device_reset() override;
+ virtual void device_post_load() override;
void restore_banks();
@@ -46,13 +47,14 @@ public:
virtual void initialize_cartridge() override;
- virtual DECLARE_READ8_MEMBER(read_cart) override;
- virtual DECLARE_WRITE8_MEMBER(write_cart) override;
+ virtual uint8_t read_cart(offs_t offset) override;
+ virtual void write_cart(offs_t offset, uint8_t data) override;
protected:
// device-level overrides
virtual void device_start() override;
virtual void device_reset() override;
+ virtual void device_post_load() override;
void restore_banks();
@@ -70,13 +72,14 @@ public:
virtual void initialize_cartridge() override;
- virtual DECLARE_READ8_MEMBER(read_cart) override;
- virtual DECLARE_WRITE8_MEMBER(write_cart) override;
+ virtual uint8_t read_cart(offs_t offset) override;
+ virtual void write_cart(offs_t offset, uint8_t data) override;
protected:
// device-level overrides
virtual void device_start() override;
virtual void device_reset() override;
+ virtual void device_post_load() override;
void restore_banks();
@@ -97,13 +100,14 @@ public:
virtual void initialize_cartridge() override;
- virtual DECLARE_READ8_MEMBER(read_cart) override;
- virtual DECLARE_WRITE8_MEMBER(write_cart) override;
+ virtual uint8_t read_cart(offs_t offset) override;
+ virtual void write_cart(offs_t offset, uint8_t data) override;
protected:
// device-level overrides
virtual void device_start() override;
virtual void device_reset() override;
+ virtual void device_post_load() override;
void restore_banks();
@@ -124,13 +128,14 @@ public:
virtual void initialize_cartridge() override;
- virtual DECLARE_READ8_MEMBER(read_cart) override;
- virtual DECLARE_WRITE8_MEMBER(write_cart) override;
+ virtual uint8_t read_cart(offs_t offset) override;
+ virtual void write_cart(offs_t offset, uint8_t data) override;
protected:
// device-level overrides
virtual void device_start() override;
virtual void device_reset() override;
+ virtual void device_post_load() override;
void restore_banks();
diff --git a/src/devices/bus/msx_cart/bm_012.cpp b/src/devices/bus/msx_cart/bm_012.cpp
index db354b1e65c..f38215ac6cc 100644
--- a/src/devices/bus/msx_cart/bm_012.cpp
+++ b/src/devices/bus/msx_cart/bm_012.cpp
@@ -39,7 +39,8 @@ void msx_cart_bm_012_device::bm_012_memory_map(address_map &map)
}
-MACHINE_CONFIG_START(msx_cart_bm_012_device::device_add_mconfig)
+void msx_cart_bm_012_device::device_add_mconfig(machine_config &config)
+{
// 12MHz XTAL @ X1
// Toshiba TMPZ84C015AF-6 (@U5) components:
// - Z80
@@ -69,13 +70,12 @@ MACHINE_CONFIG_START(msx_cart_bm_012_device::device_add_mconfig)
m_bm012_pio->out_brdy_callback().set("tmpz84c015af", FUNC(tmpz84c015_device::strobe_b));
// MIDI ports
- MCFG_MIDI_PORT_ADD("mdin", midiin_slot, "midiin")
- MCFG_MIDI_RX_HANDLER(WRITELINE(*this, msx_cart_bm_012_device, midi_in))
+ MIDI_PORT(config, "mdin", midiin_slot, "midiin").rxd_handler().set(FUNC(msx_cart_bm_012_device::midi_in));
- MCFG_MIDI_PORT_ADD("mdthru", midiout_slot, "midiout")
+ MIDI_PORT(config, "mdthru", midiout_slot, "midiout");
- MCFG_MIDI_PORT_ADD("mdout", midiout_slot, "midiout")
-MACHINE_CONFIG_END
+ MIDI_PORT(config, "mdout", midiout_slot, "midiout");
+}
ROM_START( msx_cart_bm_012 )
@@ -94,9 +94,8 @@ const tiny_rom_entry *msx_cart_bm_012_device::device_rom_region() const
void msx_cart_bm_012_device::device_start()
{
// Install IO read/write handlers
- address_space &space = machine().device<cpu_device>("maincpu")->space(AS_IO);
- space.install_write_handler(0x70, 0x73, write8_delegate(FUNC(z80pio_device::write_alt), m_bm012_pio.target()));
- space.install_read_handler(0x70, 0x73, read8_delegate(FUNC(z80pio_device::read_alt), m_bm012_pio.target()));
+ io_space().install_write_handler(0x70, 0x73, write8_delegate(FUNC(z80pio_device::write_alt), m_bm012_pio.target()));
+ io_space().install_read_handler(0x70, 0x73, read8_delegate(FUNC(z80pio_device::read_alt), m_bm012_pio.target()));
}
diff --git a/src/devices/bus/msx_cart/cartridge.cpp b/src/devices/bus/msx_cart/cartridge.cpp
index 9c722e74872..3a3af30d191 100644
--- a/src/devices/bus/msx_cart/cartridge.cpp
+++ b/src/devices/bus/msx_cart/cartridge.cpp
@@ -26,6 +26,8 @@
#include "super_swangi.h"
#include "yamaha.h"
+#include "bus/msx_slot/cartridge.h"
+
void msx_cart(device_slot_interface &device)
{
@@ -72,7 +74,7 @@ void msx_cart(device_slot_interface &device)
msx_cart_interface::msx_cart_interface(const machine_config &mconfig, device_t &device)
: device_slot_card_interface(mconfig, device)
- , m_out_irq_cb(*this)
+ , m_exp(nullptr)
{
}
@@ -100,6 +102,21 @@ void msx_cart_interface::sram_alloc(uint32_t size)
std::fill_n(m_sram.begin(), size, 0x00);
}
+WRITE_LINE_MEMBER(msx_cart_interface::irq_out)
+{
+ m_exp->irq_out(state);
+}
+
+address_space &msx_cart_interface::memory_space() const
+{
+ return m_exp->memory_space();
+}
+
+address_space &msx_cart_interface::io_space() const
+{
+ return m_exp->io_space();
+}
+
// Several yamaha machines had 60 pin expansion slots. The pinouts of these slots was
// exactly the same as the regular 50 pin cartridge slots. The lowest 10 pins are simply
diff --git a/src/devices/bus/msx_cart/cartridge.h b/src/devices/bus/msx_cart/cartridge.h
index 381ec09e566..529d2f0a081 100644
--- a/src/devices/bus/msx_cart/cartridge.h
+++ b/src/devices/bus/msx_cart/cartridge.h
@@ -10,19 +10,26 @@ void msx_cart(device_slot_interface &device);
void msx_yamaha_60pin(device_slot_interface &device); // 60 pin expansion slots as found in yamaha machines
+class msx_slot_cartridge_device;
+
class msx_cart_interface : public device_slot_card_interface
{
-public:
- template <class Object> void set_out_irq_cb(Object &&cb) { m_out_irq_cb.set_callback(std::forward<Object>(cb)); }
+ friend class msx_slot_cartridge_device;
+public:
// This is called after loading cartridge contents and allows the cartridge
// implementation to perform some additional initialization based on the
// cartridge contents.
virtual void initialize_cartridge() { }
+ virtual void interface_pre_start() override { assert(m_exp != nullptr); }
// reading and writing
- virtual DECLARE_READ8_MEMBER(read_cart) { return 0xff; }
- virtual DECLARE_WRITE8_MEMBER(write_cart) { }
+ virtual uint8_t read_cart(offs_t offset) { return 0xff; }
+ virtual void write_cart(offs_t offset, uint8_t data) { }
+
+ DECLARE_WRITE_LINE_MEMBER(irq_out);
+ address_space &memory_space() const;
+ address_space &io_space() const;
// ROM/RAM/SRAM management
// Mainly used by the cartridge slot when loading images
@@ -43,13 +50,13 @@ public:
protected:
msx_cart_interface(const machine_config &mconfig, device_t &device);
- virtual void interface_pre_start() override { m_out_irq_cb.resolve_safe(); }
-
std::vector<uint8_t> m_rom;
std::vector<uint8_t> m_ram;
std::vector<uint8_t> m_rom_vlm5030;
std::vector<uint8_t> m_sram;
- devcb_write_line m_out_irq_cb;
+
+private:
+ msx_slot_cartridge_device *m_exp;
};
diff --git a/src/devices/bus/msx_cart/crossblaim.cpp b/src/devices/bus/msx_cart/crossblaim.cpp
index dfd7907ac46..6494e492f5b 100644
--- a/src/devices/bus/msx_cart/crossblaim.cpp
+++ b/src/devices/bus/msx_cart/crossblaim.cpp
@@ -21,8 +21,12 @@ msx_cart_crossblaim_device::msx_cart_crossblaim_device(const machine_config &mco
void msx_cart_crossblaim_device::device_start()
{
save_item(NAME(m_selected_bank));
+}
+
- machine().save().register_postload(save_prepost_delegate(FUNC(msx_cart_crossblaim_device::restore_banks), this));
+void msx_cart_crossblaim_device::device_post_load()
+{
+ restore_banks();
}
@@ -58,7 +62,7 @@ void msx_cart_crossblaim_device::initialize_cartridge()
}
-READ8_MEMBER(msx_cart_crossblaim_device::read_cart)
+uint8_t msx_cart_crossblaim_device::read_cart(offs_t offset)
{
uint8_t *bank_base = m_bank_base[offset >> 14];
@@ -71,7 +75,7 @@ READ8_MEMBER(msx_cart_crossblaim_device::read_cart)
}
-WRITE8_MEMBER(msx_cart_crossblaim_device::write_cart)
+void msx_cart_crossblaim_device::write_cart(offs_t offset, uint8_t data)
{
m_selected_bank = data & 3;
if (m_selected_bank == 0)
diff --git a/src/devices/bus/msx_cart/crossblaim.h b/src/devices/bus/msx_cart/crossblaim.h
index a1321dd06df..04a44c1d905 100644
--- a/src/devices/bus/msx_cart/crossblaim.h
+++ b/src/devices/bus/msx_cart/crossblaim.h
@@ -18,13 +18,14 @@ public:
virtual void initialize_cartridge() override;
- virtual DECLARE_READ8_MEMBER(read_cart) override;
- virtual DECLARE_WRITE8_MEMBER(write_cart) override;
+ virtual uint8_t read_cart(offs_t offset) override;
+ virtual void write_cart(offs_t offset, uint8_t data) override;
protected:
// device-level overrides
virtual void device_start() override;
virtual void device_reset() override;
+ virtual void device_post_load() override;
void restore_banks();
diff --git a/src/devices/bus/msx_cart/disk.cpp b/src/devices/bus/msx_cart/disk.cpp
index a0e03e54920..7bbbdd292c0 100644
--- a/src/devices/bus/msx_cart/disk.cpp
+++ b/src/devices/bus/msx_cart/disk.cpp
@@ -197,7 +197,8 @@ void msx_cart_disk_device::initialize_cartridge()
}
-MACHINE_CONFIG_START(msx_cart_vy0010_device::device_add_mconfig)
+void msx_cart_vy0010_device::device_add_mconfig(machine_config &config)
+{
// From VY-0010 schematic:
// HLT pulled high
// SSO/-ENMF + -DDEN + ENP + -5/8 - pulled low
@@ -206,60 +207,63 @@ MACHINE_CONFIG_START(msx_cart_vy0010_device::device_add_mconfig)
m_fdc->set_force_ready(true);
// Single sided 3.5" floppy drive
- MCFG_FLOPPY_DRIVE_ADD("fdc:0", msx_floppies, "35ssdd", msx_cart_disk_device::floppy_formats)
+ FLOPPY_CONNECTOR(config, "fdc:0", msx_floppies, "35ssdd", msx_cart_disk_device::floppy_formats);
// Attach software lists
// We do not know in what kind of machine the user has inserted the floppy interface
// so we list all msx floppy software lists.
//
- MCFG_SOFTWARE_LIST_ADD("flop_list","msx2_flop")
- MCFG_SOFTWARE_LIST_COMPATIBLE_ADD("msx1_flop_list","msx1_flop")
-MACHINE_CONFIG_END
+ SOFTWARE_LIST(config, "flop_list").set_original("msx2_flop");
+ SOFTWARE_LIST(config, "msx1_flop_list").set_compatible("msx1_flop");
+}
-MACHINE_CONFIG_START(msx_cart_fsfd1_device::device_add_mconfig)
+void msx_cart_fsfd1_device::device_add_mconfig(machine_config &config)
+{
WD2793(config, m_fdc, 4_MHz_XTAL / 4);
// Double sided 3.5" floppy drive
- MCFG_FLOPPY_DRIVE_ADD("fdc:0", msx_floppies, "35dd", msx_cart_disk_device::floppy_formats)
+ FLOPPY_CONNECTOR(config, "fdc:0", msx_floppies, "35dd", msx_cart_disk_device::floppy_formats);
// Attach software lists
// We do not know in what kind of machine the user has inserted the floppy interface
// so we list all msx floppy software lists.
//
- MCFG_SOFTWARE_LIST_ADD("flop_list","msx2_flop")
- MCFG_SOFTWARE_LIST_COMPATIBLE_ADD("msx1_flop_list","msx1_flop")
-MACHINE_CONFIG_END
+ SOFTWARE_LIST(config, "flop_list").set_original("msx2_flop");
+ SOFTWARE_LIST(config, "msx1_flop_list").set_compatible("msx1_flop");
+}
-MACHINE_CONFIG_START(msx_cart_fsfd1a_device::device_add_mconfig)
+void msx_cart_fsfd1a_device::device_add_mconfig(machine_config &config)
+{
TC8566AF(config, m_fdc, 16'000'000);
// Double sided 3.5" floppy drive
- MCFG_FLOPPY_DRIVE_ADD("fdc:0", msx_floppies, "35dd", msx_cart_disk_device::floppy_formats)
+ FLOPPY_CONNECTOR(config, "fdc:0", msx_floppies, "35dd", msx_cart_disk_device::floppy_formats);
// Attach software lists
// We do not know in what kind of machine the user has inserted the floppy interface
// so we list all msx floppy software lists.
//
- MCFG_SOFTWARE_LIST_ADD("flop_list","msx2_flop")
- MCFG_SOFTWARE_LIST_COMPATIBLE_ADD("msx1_flop_list","msx1_flop")
-MACHINE_CONFIG_END
+ SOFTWARE_LIST(config, "flop_list").set_original("msx2_flop");
+ SOFTWARE_LIST(config, "msx1_flop_list").set_compatible("msx1_flop");
+}
-MACHINE_CONFIG_START(msx_cart_fscf351_device::device_add_mconfig)
+void msx_cart_fscf351_device::device_add_mconfig(machine_config &config)
+{
MB8877(config, m_fdc, 4_MHz_XTAL / 4);
m_fdc->set_force_ready(true);
// Double sided 3.5" floppy drive
- MCFG_FLOPPY_DRIVE_ADD("fdc:0", msx_floppies, "35dd", msx_cart_disk_device::floppy_formats)
+ FLOPPY_CONNECTOR(config, "fdc:0", msx_floppies, "35dd", msx_cart_disk_device::floppy_formats);
// Attach software lists
// We do not know in what kind of machine the user has inserted the floppy interface
// so we list all msx floppy software lists.
//
- MCFG_SOFTWARE_LIST_ADD("flop_list","msx2_flop")
- MCFG_SOFTWARE_LIST_COMPATIBLE_ADD("msx1_flop_list","msx1_flop")
-MACHINE_CONFIG_END
+ SOFTWARE_LIST(config, "flop_list").set_original("msx2_flop");
+ SOFTWARE_LIST(config, "msx1_flop_list").set_compatible("msx1_flop");
+}
void msx_cart_disk_type1_device::device_start()
@@ -268,12 +272,10 @@ void msx_cart_disk_type1_device::device_start()
save_item(NAME(m_side_control));
save_item(NAME(m_control));
-
- machine().save().register_postload(save_prepost_delegate(FUNC(msx_cart_disk_type1_device::post_load), this));
}
-void msx_cart_disk_type1_device::post_load()
+void msx_cart_disk_type1_device::device_post_load()
{
uint8_t data = m_control;
@@ -338,7 +340,7 @@ void msx_cart_disk_type1_device::device_reset()
}
-READ8_MEMBER(msx_cart_disk_type1_device::read_cart)
+uint8_t msx_cart_disk_type1_device::read_cart(offs_t offset)
{
switch (offset)
{
@@ -379,7 +381,7 @@ READ8_MEMBER(msx_cart_disk_type1_device::read_cart)
}
-WRITE8_MEMBER(msx_cart_disk_type1_device::write_cart)
+void msx_cart_disk_type1_device::write_cart(offs_t offset, uint8_t data)
{
switch (offset)
{
@@ -425,8 +427,6 @@ void msx_cart_disk_type2_device::device_start()
m_led.resolve();
save_item(NAME(m_control));
-
- machine().save().register_postload(save_prepost_delegate(FUNC(msx_cart_disk_type2_device::post_load), this));
}
@@ -436,7 +436,7 @@ void msx_cart_disk_type2_device::device_reset()
}
-void msx_cart_disk_type2_device::post_load()
+void msx_cart_disk_type2_device::device_post_load()
{
uint8_t data = m_control;
@@ -483,7 +483,7 @@ void msx_cart_disk_type2_device::set_control(uint8_t data)
}
-READ8_MEMBER(msx_cart_disk_type2_device::read_cart)
+uint8_t msx_cart_disk_type2_device::read_cart(offs_t offset)
{
switch (offset)
{
@@ -516,7 +516,7 @@ READ8_MEMBER(msx_cart_disk_type2_device::read_cart)
}
-WRITE8_MEMBER(msx_cart_disk_type2_device::write_cart)
+void msx_cart_disk_type2_device::write_cart(offs_t offset, uint8_t data)
{
switch (offset)
{
@@ -564,17 +564,17 @@ void msx_cart_fsfd1a_device::device_reset()
}
-READ8_MEMBER(msx_cart_fsfd1a_device::read_cart)
+uint8_t msx_cart_fsfd1a_device::read_cart(offs_t offset)
{
switch (offset)
{
case 0x7ffa:
case 0xbffa:
- return m_fdc->msr_r(space, 4);
+ return m_fdc->msr_r();
case 0x7ffb:
case 0xbffb:
- return m_fdc->fifo_r(space, 5);
+ return m_fdc->fifo_r();
}
if (offset >= 0x4000 && offset < 0x8000)
@@ -585,23 +585,23 @@ READ8_MEMBER(msx_cart_fsfd1a_device::read_cart)
}
-WRITE8_MEMBER(msx_cart_fsfd1a_device::write_cart)
+void msx_cart_fsfd1a_device::write_cart(offs_t offset, uint8_t data)
{
switch (offset)
{
case 0x7ff8:
case 0xbff8:
- m_fdc->dor_w(space, 2, data);
+ m_fdc->dor_w(data);
break;
case 0x7ff9:
case 0xbff9:
- m_fdc->cr1_w(space, 3, data);
+ m_fdc->cr1_w(data);
break;
case 0x7ffb:
case 0xbffb:
- m_fdc->fifo_w(space, 5, data);
+ m_fdc->fifo_w(data);
break;
default:
diff --git a/src/devices/bus/msx_cart/disk.h b/src/devices/bus/msx_cart/disk.h
index 908f2ef7229..ce238992349 100644
--- a/src/devices/bus/msx_cart/disk.h
+++ b/src/devices/bus/msx_cart/disk.h
@@ -45,8 +45,8 @@ protected:
class msx_cart_disk_type1_device : public msx_cart_disk_wd_device
{
public:
- virtual DECLARE_READ8_MEMBER(read_cart) override;
- virtual DECLARE_WRITE8_MEMBER(write_cart) override;
+ virtual uint8_t read_cart(offs_t offset) override;
+ virtual void write_cart(offs_t offset, uint8_t data) override;
protected:
msx_cart_disk_type1_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock);
@@ -54,8 +54,7 @@ protected:
// device-level overrides
virtual void device_start() override;
virtual void device_reset() override;
-
- void post_load();
+ virtual void device_post_load() override;
output_finder<> m_led;
uint8_t m_side_control;
@@ -69,8 +68,8 @@ protected:
class msx_cart_disk_type2_device : public msx_cart_disk_wd_device
{
public:
- virtual DECLARE_READ8_MEMBER(read_cart) override;
- virtual DECLARE_WRITE8_MEMBER(write_cart) override;
+ virtual uint8_t read_cart(offs_t offset) override;
+ virtual void write_cart(offs_t offset, uint8_t data) override;
protected:
msx_cart_disk_type2_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock);
@@ -78,8 +77,7 @@ protected:
// device-level overrides
virtual void device_start() override;
virtual void device_reset() override;
-
- void post_load();
+ virtual void device_post_load() override;
output_finder<> m_led;
uint8_t m_control;
@@ -139,8 +137,8 @@ protected:
// device-level overrides
virtual void device_add_mconfig(machine_config &config) override;
- virtual DECLARE_READ8_MEMBER(read_cart) override;
- virtual DECLARE_WRITE8_MEMBER(write_cart) override;
+ virtual uint8_t read_cart(offs_t offset) override;
+ virtual void write_cart(offs_t offset, uint8_t data) override;
};
diff --git a/src/devices/bus/msx_cart/dooly.cpp b/src/devices/bus/msx_cart/dooly.cpp
index d1d3ad9ff39..a0c4c7b4f83 100644
--- a/src/devices/bus/msx_cart/dooly.cpp
+++ b/src/devices/bus/msx_cart/dooly.cpp
@@ -36,7 +36,7 @@ void msx_cart_dooly_device::initialize_cartridge()
}
-READ8_MEMBER(msx_cart_dooly_device::read_cart)
+uint8_t msx_cart_dooly_device::read_cart(offs_t offset)
{
if (offset >= 0x4000 && offset < 0xc000)
{
@@ -54,7 +54,7 @@ READ8_MEMBER(msx_cart_dooly_device::read_cart)
}
-WRITE8_MEMBER(msx_cart_dooly_device::write_cart)
+void msx_cart_dooly_device::write_cart(offs_t offset, uint8_t data)
{
if (offset >= 0x4000 && offset < 0xc000)
{
diff --git a/src/devices/bus/msx_cart/dooly.h b/src/devices/bus/msx_cart/dooly.h
index 3ef7b365c82..76f58ae762d 100644
--- a/src/devices/bus/msx_cart/dooly.h
+++ b/src/devices/bus/msx_cart/dooly.h
@@ -18,8 +18,8 @@ public:
virtual void initialize_cartridge() override;
- virtual DECLARE_READ8_MEMBER(read_cart) override;
- virtual DECLARE_WRITE8_MEMBER(write_cart) override;
+ virtual uint8_t read_cart(offs_t offset) override;
+ virtual void write_cart(offs_t offset, uint8_t data) override;
protected:
// device-level overrides
diff --git a/src/devices/bus/msx_cart/fmpac.cpp b/src/devices/bus/msx_cart/fmpac.cpp
index 7054c8c366a..a5229a6c61e 100644
--- a/src/devices/bus/msx_cart/fmpac.cpp
+++ b/src/devices/bus/msx_cart/fmpac.cpp
@@ -29,12 +29,12 @@ msx_cart_fmpac_device::msx_cart_fmpac_device(const machine_config &mconfig, cons
}
-MACHINE_CONFIG_START(msx_cart_fmpac_device::device_add_mconfig)
+void msx_cart_fmpac_device::device_add_mconfig(machine_config &config)
+{
// This is actually incorrect. The sound output is passed back into the MSX machine where it is mixed internally and output through the system 'speaker'.
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("ym2413", YM2413, XTAL(10'738'635)/3)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.40)
-MACHINE_CONFIG_END
+ YM2413(config, m_ym2413, XTAL(10'738'635)/3).add_route(ALL_OUTPUTS, "mono", 0.40);
+}
void msx_cart_fmpac_device::device_start()
@@ -46,11 +46,14 @@ void msx_cart_fmpac_device::device_start()
save_item(NAME(m_1fff));
save_item(NAME(m_7ff6));
- machine().save().register_postload(save_prepost_delegate(FUNC(msx_cart_fmpac_device::restore_banks), this));
-
// Install IO read/write handlers
- address_space &space = machine().device<cpu_device>("maincpu")->space(AS_IO);
- space.install_write_handler(0x7c, 0x7d, write8_delegate(FUNC(msx_cart_fmpac_device::write_ym2413), this));
+ io_space().install_write_handler(0x7c, 0x7d, write8sm_delegate(FUNC(msx_cart_fmpac_device::write_ym2413), this));
+}
+
+
+void msx_cart_fmpac_device::device_post_load()
+{
+ restore_banks();
}
@@ -87,7 +90,7 @@ void msx_cart_fmpac_device::initialize_cartridge()
}
-READ8_MEMBER(msx_cart_fmpac_device::read_cart)
+uint8_t msx_cart_fmpac_device::read_cart(offs_t offset)
{
if (offset >= 0x4000 && offset < 0x8000)
{
@@ -116,7 +119,7 @@ READ8_MEMBER(msx_cart_fmpac_device::read_cart)
}
-WRITE8_MEMBER(msx_cart_fmpac_device::write_cart)
+void msx_cart_fmpac_device::write_cart(offs_t offset, uint8_t data)
{
if (offset >= 0x4000 && offset < 0x6000)
{
@@ -141,7 +144,7 @@ WRITE8_MEMBER(msx_cart_fmpac_device::write_cart)
case 0x7ff5:
if (m_opll_active)
{
- m_ym2413->write(space, offset & 1, data);
+ m_ym2413->write(offset & 1, data);
}
break;
@@ -159,10 +162,10 @@ WRITE8_MEMBER(msx_cart_fmpac_device::write_cart)
}
-WRITE8_MEMBER(msx_cart_fmpac_device::write_ym2413)
+void msx_cart_fmpac_device::write_ym2413(offs_t offset, uint8_t data)
{
if (m_opll_active)
{
- m_ym2413->write(space, offset & 1, data);
+ m_ym2413->write(offset & 1, data);
}
}
diff --git a/src/devices/bus/msx_cart/fmpac.h b/src/devices/bus/msx_cart/fmpac.h
index 7100fe4a07c..a0f660b1620 100644
--- a/src/devices/bus/msx_cart/fmpac.h
+++ b/src/devices/bus/msx_cart/fmpac.h
@@ -19,14 +19,13 @@ public:
virtual void initialize_cartridge() override;
- virtual DECLARE_READ8_MEMBER(read_cart) override;
- virtual DECLARE_WRITE8_MEMBER(write_cart) override;
-
- DECLARE_WRITE8_MEMBER(write_ym2413);
+ virtual uint8_t read_cart(offs_t offset) override;
+ virtual void write_cart(offs_t offset, uint8_t data) override;
protected:
virtual void device_start() override;
virtual void device_reset() override;
+ virtual void device_post_load() override;
// device-level overrides
virtual void device_add_mconfig(machine_config &config) override;
@@ -34,6 +33,8 @@ protected:
void restore_banks();
private:
+ void write_ym2413(offs_t offset, uint8_t data);
+
required_device<ym2413_device> m_ym2413;
uint8_t m_selected_bank;
diff --git a/src/devices/bus/msx_cart/fs_sr022.cpp b/src/devices/bus/msx_cart/fs_sr022.cpp
index 7e0eac793df..bb84a759214 100644
--- a/src/devices/bus/msx_cart/fs_sr022.cpp
+++ b/src/devices/bus/msx_cart/fs_sr022.cpp
@@ -38,7 +38,7 @@ void msx_cart_fs_sr022_device::initialize_cartridge()
}
-READ8_MEMBER(msx_cart_fs_sr022_device::read_cart)
+uint8_t msx_cart_fs_sr022_device::read_cart(offs_t offset)
{
if (offset >= 0x4000 && offset < 0xc000)
{
@@ -52,7 +52,7 @@ READ8_MEMBER(msx_cart_fs_sr022_device::read_cart)
}
-WRITE8_MEMBER(msx_cart_fs_sr022_device::write_cart)
+void msx_cart_fs_sr022_device::write_cart(offs_t offset, uint8_t data)
{
switch (offset)
{
diff --git a/src/devices/bus/msx_cart/fs_sr022.h b/src/devices/bus/msx_cart/fs_sr022.h
index bf3259090e1..2456b90a101 100644
--- a/src/devices/bus/msx_cart/fs_sr022.h
+++ b/src/devices/bus/msx_cart/fs_sr022.h
@@ -18,8 +18,8 @@ public:
virtual void initialize_cartridge() override;
- virtual DECLARE_READ8_MEMBER(read_cart) override;
- virtual DECLARE_WRITE8_MEMBER(write_cart) override;
+ virtual uint8_t read_cart(offs_t offset) override;
+ virtual void write_cart(offs_t offset, uint8_t data) override;
protected:
// device-level overrides
diff --git a/src/devices/bus/msx_cart/halnote.cpp b/src/devices/bus/msx_cart/halnote.cpp
index 013d2b83680..43f7947ec2c 100644
--- a/src/devices/bus/msx_cart/halnote.cpp
+++ b/src/devices/bus/msx_cart/halnote.cpp
@@ -19,8 +19,12 @@ msx_cart_halnote_device::msx_cart_halnote_device(const machine_config &mconfig,
void msx_cart_halnote_device::device_start()
{
save_item(NAME(m_selected_bank));
+}
+
- machine().save().register_postload(save_prepost_delegate(FUNC(msx_cart_halnote_device::restore_banks), this));
+void msx_cart_halnote_device::device_post_load()
+{
+ restore_banks();
}
@@ -84,7 +88,7 @@ void msx_cart_halnote_device::initialize_cartridge()
}
-READ8_MEMBER(msx_cart_halnote_device::read_cart)
+uint8_t msx_cart_halnote_device::read_cart(offs_t offset)
{
if (offset >= 0xc000)
{
@@ -106,7 +110,7 @@ READ8_MEMBER(msx_cart_halnote_device::read_cart)
}
-WRITE8_MEMBER(msx_cart_halnote_device::write_cart)
+void msx_cart_halnote_device::write_cart(offs_t offset, uint8_t data)
{
if (offset < 0x4000)
{
diff --git a/src/devices/bus/msx_cart/halnote.h b/src/devices/bus/msx_cart/halnote.h
index ad64d2539ee..a9c1972afeb 100644
--- a/src/devices/bus/msx_cart/halnote.h
+++ b/src/devices/bus/msx_cart/halnote.h
@@ -18,13 +18,14 @@ public:
virtual void initialize_cartridge() override;
- virtual DECLARE_READ8_MEMBER(read_cart) override;
- virtual DECLARE_WRITE8_MEMBER(write_cart) override;
+ virtual uint8_t read_cart(offs_t offset) override;
+ virtual void write_cart(offs_t offset, uint8_t data) override;
protected:
// device-level overrides
virtual void device_start() override;
virtual void device_reset() override;
+ virtual void device_post_load() override;
void restore_banks();
diff --git a/src/devices/bus/msx_cart/hfox.cpp b/src/devices/bus/msx_cart/hfox.cpp
index d7fb793e42d..181d9710fcc 100644
--- a/src/devices/bus/msx_cart/hfox.cpp
+++ b/src/devices/bus/msx_cart/hfox.cpp
@@ -19,8 +19,12 @@ msx_cart_hfox_device::msx_cart_hfox_device(const machine_config &mconfig, const
void msx_cart_hfox_device::device_start()
{
save_item(NAME(m_selected_bank));
+}
+
- machine().save().register_postload(save_prepost_delegate(FUNC(msx_cart_hfox_device::restore_banks), this));
+void msx_cart_hfox_device::device_post_load()
+{
+ restore_banks();
}
@@ -48,7 +52,7 @@ void msx_cart_hfox_device::initialize_cartridge()
}
-READ8_MEMBER(msx_cart_hfox_device::read_cart)
+uint8_t msx_cart_hfox_device::read_cart(offs_t offset)
{
if (offset >= 0x4000 && offset < 0xc000)
{
@@ -58,7 +62,7 @@ READ8_MEMBER(msx_cart_hfox_device::read_cart)
}
-WRITE8_MEMBER(msx_cart_hfox_device::write_cart)
+void msx_cart_hfox_device::write_cart(offs_t offset, uint8_t data)
{
switch (offset)
{
diff --git a/src/devices/bus/msx_cart/hfox.h b/src/devices/bus/msx_cart/hfox.h
index debcbc31308..6254bae3610 100644
--- a/src/devices/bus/msx_cart/hfox.h
+++ b/src/devices/bus/msx_cart/hfox.h
@@ -16,13 +16,14 @@ public:
virtual void initialize_cartridge() override;
- virtual DECLARE_READ8_MEMBER(read_cart) override;
- virtual DECLARE_WRITE8_MEMBER(write_cart) override;
+ virtual uint8_t read_cart(offs_t offset) override;
+ virtual void write_cart(offs_t offset, uint8_t data) override;
protected:
// device-level overrides
virtual void device_start() override;
virtual void device_reset() override;
+ virtual void device_post_load() override;
void restore_banks();
diff --git a/src/devices/bus/msx_cart/holy_quran.cpp b/src/devices/bus/msx_cart/holy_quran.cpp
index 4c44656a9e3..046ed194502 100644
--- a/src/devices/bus/msx_cart/holy_quran.cpp
+++ b/src/devices/bus/msx_cart/holy_quran.cpp
@@ -30,8 +30,12 @@ void msx_cart_holy_quran_device::device_start()
{
save_item(NAME(m_selected_bank));
save_item(NAME(m_decrypt));
+}
+
- machine().save().register_postload(save_prepost_delegate(FUNC(msx_cart_holy_quran_device::restore_banks), this));
+void msx_cart_holy_quran_device::device_post_load()
+{
+ restore_banks();
}
@@ -64,7 +68,7 @@ void msx_cart_holy_quran_device::initialize_cartridge()
}
-READ8_MEMBER(msx_cart_holy_quran_device::read_cart)
+uint8_t msx_cart_holy_quran_device::read_cart(offs_t offset)
{
if (offset >= 0x4000 && offset < 0xc000)
{
@@ -88,7 +92,7 @@ READ8_MEMBER(msx_cart_holy_quran_device::read_cart)
}
-WRITE8_MEMBER(msx_cart_holy_quran_device::write_cart)
+void msx_cart_holy_quran_device::write_cart(offs_t offset, uint8_t data)
{
switch (offset)
{
diff --git a/src/devices/bus/msx_cart/holy_quran.h b/src/devices/bus/msx_cart/holy_quran.h
index b805282790c..8d63a8271d9 100644
--- a/src/devices/bus/msx_cart/holy_quran.h
+++ b/src/devices/bus/msx_cart/holy_quran.h
@@ -18,13 +18,14 @@ public:
virtual void initialize_cartridge() override;
- virtual DECLARE_READ8_MEMBER(read_cart) override;
- virtual DECLARE_WRITE8_MEMBER(write_cart) override;
+ virtual uint8_t read_cart(offs_t offset) override;
+ virtual void write_cart(offs_t offset, uint8_t data) override;
protected:
// device-level overrides
virtual void device_start() override;
virtual void device_reset() override;
+ virtual void device_post_load() override;
void restore_banks();
diff --git a/src/devices/bus/msx_cart/konami.cpp b/src/devices/bus/msx_cart/konami.cpp
index e1d4e35321f..f5ac42be362 100644
--- a/src/devices/bus/msx_cart/konami.cpp
+++ b/src/devices/bus/msx_cart/konami.cpp
@@ -35,8 +35,12 @@ msx_cart_konami_device::msx_cart_konami_device(const machine_config &mconfig, co
void msx_cart_konami_device::device_start()
{
save_item(NAME(m_selected_bank));
+}
+
- machine().save().register_postload(save_prepost_delegate(FUNC(msx_cart_konami_device::restore_banks), this));
+void msx_cart_konami_device::device_post_load()
+{
+ restore_banks();
}
@@ -84,13 +88,13 @@ void msx_cart_konami_device::initialize_cartridge()
}
-READ8_MEMBER(msx_cart_konami_device::read_cart)
+uint8_t msx_cart_konami_device::read_cart(offs_t offset)
{
return m_bank_base[offset >> 13][offset & 0x1fff];
}
-WRITE8_MEMBER(msx_cart_konami_device::write_cart)
+void msx_cart_konami_device::write_cart(offs_t offset, uint8_t data)
{
switch (offset & 0xe000)
{
@@ -141,20 +145,24 @@ msx_cart_konami_scc_device::msx_cart_konami_scc_device(const machine_config &mco
}
-MACHINE_CONFIG_START(msx_cart_konami_scc_device::device_add_mconfig)
+void msx_cart_konami_scc_device::device_add_mconfig(machine_config &config)
+{
// This is actually incorrect. The sound output is passed back into the MSX machine where it is mixed internally and output through the system 'speaker'.
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("k051649", K051649, XTAL(10'738'635)/3/2)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.15)
-MACHINE_CONFIG_END
+ K051649(config, m_k051649, XTAL(10'738'635)/3/2).add_route(ALL_OUTPUTS, "mono", 0.15);
+}
void msx_cart_konami_scc_device::device_start()
{
save_item(NAME(m_selected_bank));
save_item(NAME(m_scc_active));
+}
+
- machine().save().register_postload(save_prepost_delegate(FUNC(msx_cart_konami_scc_device::restore_banks), this));
+void msx_cart_konami_scc_device::device_post_load()
+{
+ restore_banks();
}
@@ -203,7 +211,7 @@ void msx_cart_konami_scc_device::initialize_cartridge()
}
-READ8_MEMBER(msx_cart_konami_scc_device::read_cart)
+uint8_t msx_cart_konami_scc_device::read_cart(offs_t offset)
{
if ( m_scc_active && offset >= 0x9800 && offset < 0xa000 )
{
@@ -211,13 +219,13 @@ READ8_MEMBER(msx_cart_konami_scc_device::read_cart)
{
if ((offset & 0xff) >= 0xe0)
{
- return m_k051649->k051649_test_r(space, offset & 0xff);
+ return m_k051649->k051649_test_r();
}
return 0xff;
}
else
{
- return m_k051649->k051649_waveform_r(space, offset & 0x7f);
+ return m_k051649->k051649_waveform_r(offset & 0x7f);
}
}
@@ -225,7 +233,7 @@ READ8_MEMBER(msx_cart_konami_scc_device::read_cart)
}
-WRITE8_MEMBER(msx_cart_konami_scc_device::write_cart)
+void msx_cart_konami_scc_device::write_cart(offs_t offset, uint8_t data)
{
switch (offset & 0xf800)
{
@@ -255,27 +263,27 @@ WRITE8_MEMBER(msx_cart_konami_scc_device::write_cart)
if (offset < 0x80)
{
- m_k051649->k051649_waveform_w(space, offset, data);
+ m_k051649->k051649_waveform_w(offset, data);
}
else if (offset < 0xa0)
{
offset &= 0x0f;
if (offset < 0x0a)
{
- m_k051649->k051649_frequency_w(space, offset, data);
+ m_k051649->k051649_frequency_w(offset, data);
}
else if (offset < 0x0f)
{
- m_k051649->k051649_volume_w(space, offset - 0xa, data);
+ m_k051649->k051649_volume_w(offset - 0xa, data);
}
else
{
- m_k051649->k051649_keyonoff_w(space, 0, data);
+ m_k051649->k051649_keyonoff_w(data);
}
}
else if (offset >= 0xe0)
{
- m_k051649->k051649_test_w(space, offset, data);
+ m_k051649->k051649_test_w(data);
}
}
break;
@@ -311,8 +319,12 @@ msx_cart_gamemaster2_device::msx_cart_gamemaster2_device(const machine_config &m
void msx_cart_gamemaster2_device::device_start()
{
save_item(NAME(m_selected_bank));
+}
+
- machine().save().register_postload(save_prepost_delegate(FUNC(msx_cart_gamemaster2_device::restore_banks), this));
+void msx_cart_gamemaster2_device::device_post_load()
+{
+ restore_banks();
}
@@ -397,7 +409,7 @@ void msx_cart_gamemaster2_device::initialize_cartridge()
}
-READ8_MEMBER(msx_cart_gamemaster2_device::read_cart)
+uint8_t msx_cart_gamemaster2_device::read_cart(offs_t offset)
{
uint8_t bank = offset >> 13;
@@ -431,7 +443,7 @@ READ8_MEMBER(msx_cart_gamemaster2_device::read_cart)
}
-WRITE8_MEMBER(msx_cart_gamemaster2_device::write_cart)
+void msx_cart_gamemaster2_device::write_cart(offs_t offset, uint8_t data)
{
switch (offset & 0xf000)
{
@@ -472,13 +484,15 @@ msx_cart_synthesizer_device::msx_cart_synthesizer_device(const machine_config &m
}
-MACHINE_CONFIG_START(msx_cart_synthesizer_device::device_add_mconfig)
+void msx_cart_synthesizer_device::device_add_mconfig(machine_config &config)
+{
// This is actually incorrect. The sound output is passed back into the MSX machine where it is mixed internally and output through the system 'speaker'.
SPEAKER(config, "speaker").front_center();
- MCFG_DEVICE_ADD("dac", DAC_8BIT_R2R, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 0.1) // unknown DAC
- MCFG_DEVICE_ADD("vref", VOLTAGE_REGULATOR, 0) MCFG_VOLTAGE_REGULATOR_OUTPUT(5.0)
- MCFG_SOUND_ROUTE(0, "dac", 1.0, DAC_VREF_POS_INPUT) MCFG_SOUND_ROUTE(0, "dac", -1.0, DAC_VREF_NEG_INPUT)
-MACHINE_CONFIG_END
+ DAC_8BIT_R2R(config, m_dac, 0).add_route(ALL_OUTPUTS, "speaker", 0.1); // unknown DAC
+ voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref"));
+ vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT);
+ vref.add_route(0, "dac", -1.0, DAC_VREF_NEG_INPUT);
+}
void msx_cart_synthesizer_device::device_start()
@@ -497,7 +511,7 @@ void msx_cart_synthesizer_device::initialize_cartridge()
}
-READ8_MEMBER(msx_cart_synthesizer_device::read_cart)
+uint8_t msx_cart_synthesizer_device::read_cart(offs_t offset)
{
if (offset >= 0x4000 && offset < 0xc000 )
{
@@ -507,7 +521,7 @@ READ8_MEMBER(msx_cart_synthesizer_device::read_cart)
}
-WRITE8_MEMBER(msx_cart_synthesizer_device::write_cart)
+void msx_cart_synthesizer_device::write_cart(offs_t offset, uint8_t data)
{
if ((offset & 0xc010) == 0x4000)
{
@@ -545,12 +559,12 @@ msx_cart_konami_sound_device::msx_cart_konami_sound_device(const machine_config
}
-MACHINE_CONFIG_START(msx_cart_konami_sound_device::device_add_mconfig)
+void msx_cart_konami_sound_device::device_add_mconfig(machine_config &config)
+{
// This is actually incorrect. The sound output is passed back into the MSX machine where it is mixed internally and output through the system 'speaker'.
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("k052539", K051649, XTAL(10'738'635)/3/2)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.15)
-MACHINE_CONFIG_END
+ K051649(config, m_k052539, XTAL(10'738'635)/3/2).add_route(ALL_OUTPUTS, "mono", 0.15);
+}
void msx_cart_konami_sound_device::device_start()
@@ -559,8 +573,12 @@ void msx_cart_konami_sound_device::device_start()
save_item(NAME(m_scc_active));
save_item(NAME(m_sccplus_active));
save_item(NAME(m_ram_enabled));
+}
+
- machine().save().register_postload(save_prepost_delegate(FUNC(msx_cart_konami_sound_device::restore_banks), this));
+void msx_cart_konami_sound_device::device_post_load()
+{
+ restore_banks();
}
@@ -618,14 +636,14 @@ void msx_cart_konami_sound_device::initialize_cartridge()
}
-READ8_MEMBER(msx_cart_konami_sound_device::read_cart)
+uint8_t msx_cart_konami_sound_device::read_cart(offs_t offset)
{
if ( m_scc_active && offset >= 0x9800 && offset < 0x9fe0 )
{
offset &= 0xff;
if (offset < 0x80)
{
- return m_k052539->k051649_waveform_r(space, offset);
+ return m_k052539->k051649_waveform_r(offset);
}
if (offset < 0xa0)
{
@@ -633,11 +651,11 @@ READ8_MEMBER(msx_cart_konami_sound_device::read_cart)
}
if (offset < 0xc0)
{
- return m_k052539->k051649_waveform_r(space, offset & 0x9f);
+ return m_k052539->k051649_waveform_r(offset & 0x9f);
}
if (offset < 0xe0)
{
- return m_k052539->k051649_test_r(space, offset & 0xff);
+ return m_k052539->k051649_test_r();
}
return 0xff;
}
@@ -647,11 +665,11 @@ READ8_MEMBER(msx_cart_konami_sound_device::read_cart)
if (offset < 0xa0)
{
- return m_k052539->k052539_waveform_r(space, offset);
+ return m_k052539->k052539_waveform_r(offset);
}
if (offset >= 0xc0 && offset < 0xe0)
{
- return m_k052539->k051649_test_r(space, offset);
+ return m_k052539->k051649_test_r();
}
return 0xff;
}
@@ -666,7 +684,7 @@ READ8_MEMBER(msx_cart_konami_sound_device::read_cart)
}
-WRITE8_MEMBER(msx_cart_konami_sound_device::write_cart)
+void msx_cart_konami_sound_device::write_cart(offs_t offset, uint8_t data)
{
switch (offset & 0xe000)
{
@@ -714,27 +732,27 @@ WRITE8_MEMBER(msx_cart_konami_sound_device::write_cart)
if (offset < 0x80)
{
- m_k052539->k051649_waveform_w(space, offset, data);
+ m_k052539->k051649_waveform_w(offset, data);
}
else if (offset < 0xa0)
{
offset &= 0x0f;
if (offset < 0x0a)
{
- m_k052539->k051649_frequency_w(space, offset, data);
+ m_k052539->k051649_frequency_w(offset, data);
}
else if (offset < 0x0f)
{
- m_k052539->k051649_volume_w(space, offset - 0xa, data);
+ m_k052539->k051649_volume_w(offset - 0xa, data);
}
else
{
- m_k052539->k051649_keyonoff_w(space, 0, data);
+ m_k052539->k051649_keyonoff_w(data);
}
}
else if (offset >= 0xe0)
{
- m_k052539->k051649_test_w(space, offset, data);
+ m_k052539->k051649_test_w(data);
}
}
break;
@@ -777,27 +795,27 @@ WRITE8_MEMBER(msx_cart_konami_sound_device::write_cart)
offset &= 0xff;
if (offset < 0xa0)
{
- m_k052539->k052539_waveform_w(space, offset, data);
+ m_k052539->k052539_waveform_w(offset, data);
}
else if (offset < 0xc0)
{
offset &= 0x0f;
if (offset < 0x0a)
{
- m_k052539->k051649_frequency_w(space, offset, data);
+ m_k052539->k051649_frequency_w(offset, data);
}
else if (offset < 0x0f)
{
- m_k052539->k051649_volume_w(space, offset - 0x0a, data);
+ m_k052539->k051649_volume_w(offset - 0x0a, data);
}
else if (offset == 0x0f)
{
- m_k052539->k051649_keyonoff_w(space, 0, data);
+ m_k052539->k051649_keyonoff_w(data);
}
}
else if (offset < 0xe0)
{
- m_k052539->k051649_test_w(space, offset, data);
+ m_k052539->k051649_test_w(data);
}
}
}
@@ -872,22 +890,22 @@ void msx_cart_keyboard_master_device::vlm_map(address_map &map)
}
-MACHINE_CONFIG_START(msx_cart_keyboard_master_device::device_add_mconfig)
+void msx_cart_keyboard_master_device::device_add_mconfig(machine_config &config)
+{
// This is actually incorrect. The sound output is passed back into the MSX machine where it is mixed internally and output through the system 'speaker'.
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("vlm5030", VLM5030, XTAL(3'579'545))
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.40)
- MCFG_DEVICE_ADDRESS_MAP(0, vlm_map)
-MACHINE_CONFIG_END
+ VLM5030(config, m_vlm5030, XTAL(3'579'545));
+ m_vlm5030->add_route(ALL_OUTPUTS, "mono", 0.40);
+ m_vlm5030->set_addrmap(0, &msx_cart_keyboard_master_device::vlm_map);
+}
void msx_cart_keyboard_master_device::device_start()
{
// Install IO read/write handlers
- address_space &space = machine().device<cpu_device>("maincpu")->space(AS_IO);
- space.install_write_handler(0x00, 0x00, write8_delegate(FUNC(vlm5030_device::data_w), m_vlm5030.target()));
- space.install_write_handler(0x20, 0x20, write8_delegate(FUNC(msx_cart_keyboard_master_device::io_20_w), this));
- space.install_read_handler(0x00, 0x00, read8_delegate(FUNC(msx_cart_keyboard_master_device::io_00_r), this));
+ io_space().install_write_handler(0x00, 0x00, write8smo_delegate(FUNC(vlm5030_device::data_w), m_vlm5030.target()));
+ io_space().install_write_handler(0x20, 0x20, write8smo_delegate(FUNC(msx_cart_keyboard_master_device::io_20_w), this));
+ io_space().install_read_handler(0x00, 0x00, read8smo_delegate(FUNC(msx_cart_keyboard_master_device::io_00_r), this));
}
@@ -900,7 +918,7 @@ void msx_cart_keyboard_master_device::initialize_cartridge()
}
-READ8_MEMBER(msx_cart_keyboard_master_device::read_cart)
+uint8_t msx_cart_keyboard_master_device::read_cart(offs_t offset)
{
if (offset >= 0x4000 && offset < 0x8000)
{
@@ -910,13 +928,13 @@ READ8_MEMBER(msx_cart_keyboard_master_device::read_cart)
}
-READ8_MEMBER(msx_cart_keyboard_master_device::read_vlm)
+uint8_t msx_cart_keyboard_master_device::read_vlm(offs_t offset)
{
return m_rom_vlm5030[offset];
}
-WRITE8_MEMBER(msx_cart_keyboard_master_device::io_20_w)
+void msx_cart_keyboard_master_device::io_20_w(uint8_t data)
{
m_vlm5030->rst((data & 0x01) ? 1 : 0);
m_vlm5030->vcu((data & 0x04) ? 1 : 0);
@@ -924,7 +942,7 @@ WRITE8_MEMBER(msx_cart_keyboard_master_device::io_20_w)
}
-READ8_MEMBER(msx_cart_keyboard_master_device::io_00_r)
+uint8_t msx_cart_keyboard_master_device::io_00_r()
{
return m_vlm5030->bsy() ? 0x10 : 0x00;
}
diff --git a/src/devices/bus/msx_cart/konami.h b/src/devices/bus/msx_cart/konami.h
index 3985884f568..58ad4f3cfb7 100644
--- a/src/devices/bus/msx_cart/konami.h
+++ b/src/devices/bus/msx_cart/konami.h
@@ -25,13 +25,14 @@ public:
virtual void initialize_cartridge() override;
- virtual DECLARE_READ8_MEMBER(read_cart) override;
- virtual DECLARE_WRITE8_MEMBER(write_cart) override;
+ virtual uint8_t read_cart(offs_t offset) override;
+ virtual void write_cart(offs_t offset, uint8_t data) override;
protected:
// device-level overrides
virtual void device_start() override;
virtual void device_reset() override;
+ virtual void device_post_load() override;
void restore_banks();
@@ -49,13 +50,14 @@ public:
virtual void initialize_cartridge() override;
- virtual DECLARE_READ8_MEMBER(read_cart) override;
- virtual DECLARE_WRITE8_MEMBER(write_cart) override;
+ virtual uint8_t read_cart(offs_t offset) override;
+ virtual void write_cart(offs_t offset, uint8_t data) override;
protected:
// device-level overrides
virtual void device_start() override;
virtual void device_reset() override;
+ virtual void device_post_load() override;
virtual void device_add_mconfig(machine_config &config) override;
@@ -78,13 +80,14 @@ public:
virtual void initialize_cartridge() override;
- virtual DECLARE_READ8_MEMBER(read_cart) override;
- virtual DECLARE_WRITE8_MEMBER(write_cart) override;
+ virtual uint8_t read_cart(offs_t offset) override;
+ virtual void write_cart(offs_t offset, uint8_t data) override;
protected:
// device-level overrides
virtual void device_start() override;
virtual void device_reset() override;
+ virtual void device_post_load() override;
void restore_banks();
@@ -103,8 +106,8 @@ public:
virtual void initialize_cartridge() override;
- virtual DECLARE_READ8_MEMBER(read_cart) override;
- virtual DECLARE_WRITE8_MEMBER(write_cart) override;
+ virtual uint8_t read_cart(offs_t offset) override;
+ virtual void write_cart(offs_t offset, uint8_t data) override;
protected:
// device-level overrides
@@ -123,8 +126,8 @@ class msx_cart_konami_sound_device : public device_t, public msx_cart_interface
public:
virtual void initialize_cartridge() override;
- virtual DECLARE_READ8_MEMBER(read_cart) override;
- virtual DECLARE_WRITE8_MEMBER(write_cart) override;
+ virtual uint8_t read_cart(offs_t offset) override;
+ virtual void write_cart(offs_t offset, uint8_t data) override;
protected:
msx_cart_konami_sound_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock);
@@ -132,6 +135,7 @@ protected:
// device-level overrides
virtual void device_start() override;
virtual void device_reset() override;
+ virtual void device_post_load() override;
virtual void device_add_mconfig(machine_config &config) override;
@@ -186,14 +190,14 @@ protected:
virtual void initialize_cartridge() override;
- virtual DECLARE_READ8_MEMBER(read_cart) override;
+ virtual uint8_t read_cart(offs_t offset) override;
private:
required_device<vlm5030_device> m_vlm5030;
- DECLARE_READ8_MEMBER(read_vlm);
- DECLARE_WRITE8_MEMBER(io_20_w);
- DECLARE_READ8_MEMBER(io_00_r);
+ uint8_t read_vlm(offs_t offset);
+ void io_20_w(uint8_t data);
+ uint8_t io_00_r();
void vlm_map(address_map &map);
};
diff --git a/src/devices/bus/msx_cart/korean.cpp b/src/devices/bus/msx_cart/korean.cpp
index cfa96ecb7aa..1906a5eb51b 100644
--- a/src/devices/bus/msx_cart/korean.cpp
+++ b/src/devices/bus/msx_cart/korean.cpp
@@ -21,8 +21,12 @@ msx_cart_korean_80in1_device::msx_cart_korean_80in1_device(const machine_config
void msx_cart_korean_80in1_device::device_start()
{
save_item(NAME(m_selected_bank));
+}
+
- machine().save().register_postload(save_prepost_delegate(FUNC(msx_cart_korean_80in1_device::restore_banks), this));
+void msx_cart_korean_80in1_device::device_post_load()
+{
+ restore_banks();
}
@@ -72,7 +76,7 @@ void msx_cart_korean_80in1_device::initialize_cartridge()
}
-READ8_MEMBER(msx_cart_korean_80in1_device::read_cart)
+uint8_t msx_cart_korean_80in1_device::read_cart(offs_t offset)
{
if (offset >= 0x4000 && offset < 0xc000)
{
@@ -83,7 +87,7 @@ READ8_MEMBER(msx_cart_korean_80in1_device::read_cart)
}
-WRITE8_MEMBER(msx_cart_korean_80in1_device::write_cart)
+void msx_cart_korean_80in1_device::write_cart(offs_t offset, uint8_t data)
{
if (offset >= 0x4000 && offset < 0x4004)
{
@@ -112,11 +116,14 @@ void msx_cart_korean_90in1_device::device_start()
{
save_item(NAME(m_selected_bank));
- machine().save().register_postload(save_prepost_delegate(FUNC(msx_cart_korean_90in1_device::restore_banks), this));
-
// Install IO read/write handlers
- address_space &space = machine().device<cpu_device>("maincpu")->space(AS_IO);
- space.install_write_handler(0x77, 0x77, write8_delegate(FUNC(msx_cart_korean_90in1_device::banking), this));
+ io_space().install_write_handler(0x77, 0x77, write8smo_delegate(FUNC(msx_cart_korean_90in1_device::banking), this));
+}
+
+
+void msx_cart_korean_90in1_device::device_post_load()
+{
+ restore_banks();
}
@@ -181,7 +188,7 @@ void msx_cart_korean_90in1_device::initialize_cartridge()
}
-READ8_MEMBER(msx_cart_korean_90in1_device::read_cart)
+uint8_t msx_cart_korean_90in1_device::read_cart(offs_t offset)
{
if (offset >= 0x4000 && offset < 0xc000)
{
@@ -192,7 +199,7 @@ READ8_MEMBER(msx_cart_korean_90in1_device::read_cart)
}
-WRITE8_MEMBER(msx_cart_korean_90in1_device::banking)
+void msx_cart_korean_90in1_device::banking(uint8_t data)
{
m_selected_bank = data;
restore_banks();
@@ -215,8 +222,12 @@ msx_cart_korean_126in1_device::msx_cart_korean_126in1_device(const machine_confi
void msx_cart_korean_126in1_device::device_start()
{
save_item(NAME(m_selected_bank));
+}
- machine().save().register_postload(save_prepost_delegate(FUNC(msx_cart_korean_126in1_device::restore_banks), this));
+
+void msx_cart_korean_126in1_device::device_post_load()
+{
+ restore_banks();
}
@@ -266,7 +277,7 @@ void msx_cart_korean_126in1_device::initialize_cartridge()
}
-READ8_MEMBER(msx_cart_korean_126in1_device::read_cart)
+uint8_t msx_cart_korean_126in1_device::read_cart(offs_t offset)
{
if (offset >= 0x4000 && offset < 0xc000)
{
@@ -277,7 +288,7 @@ READ8_MEMBER(msx_cart_korean_126in1_device::read_cart)
}
-WRITE8_MEMBER(msx_cart_korean_126in1_device::write_cart)
+void msx_cart_korean_126in1_device::write_cart(offs_t offset, uint8_t data)
{
if (offset >= 0x4000 && offset < 0x4002)
{
diff --git a/src/devices/bus/msx_cart/korean.h b/src/devices/bus/msx_cart/korean.h
index b34438da13e..62c5a6ba82b 100644
--- a/src/devices/bus/msx_cart/korean.h
+++ b/src/devices/bus/msx_cart/korean.h
@@ -20,13 +20,14 @@ public:
virtual void initialize_cartridge() override;
- virtual DECLARE_READ8_MEMBER(read_cart) override;
- virtual DECLARE_WRITE8_MEMBER(write_cart) override;
+ virtual uint8_t read_cart(offs_t offset) override;
+ virtual void write_cart(offs_t offset, uint8_t data) override;
protected:
// device-level overrides
virtual void device_start() override;
virtual void device_reset() override;
+ virtual void device_post_load() override;
private:
void restore_banks();
@@ -45,16 +46,17 @@ public:
virtual void initialize_cartridge() override;
- virtual DECLARE_READ8_MEMBER(read_cart) override;
-
- DECLARE_WRITE8_MEMBER(banking);
+ virtual uint8_t read_cart(offs_t offset) override;
protected:
// device-level overrides
virtual void device_start() override;
virtual void device_reset() override;
+ virtual void device_post_load() override;
private:
+ void banking(uint8_t data);
+
void restore_banks();
uint8_t m_bank_mask;
@@ -70,13 +72,14 @@ public:
virtual void initialize_cartridge() override;
- virtual DECLARE_READ8_MEMBER(read_cart) override;
- virtual DECLARE_WRITE8_MEMBER(write_cart) override;
+ virtual uint8_t read_cart(offs_t offset) override;
+ virtual void write_cart(offs_t offset, uint8_t data) override;
protected:
// device-level overrides
virtual void device_start() override;
virtual void device_reset() override;
+ virtual void device_post_load() override;
private:
void restore_banks();
diff --git a/src/devices/bus/msx_cart/majutsushi.cpp b/src/devices/bus/msx_cart/majutsushi.cpp
index ef76b62af2a..66efee9188f 100644
--- a/src/devices/bus/msx_cart/majutsushi.cpp
+++ b/src/devices/bus/msx_cart/majutsushi.cpp
@@ -26,20 +26,26 @@ msx_cart_majutsushi_device::msx_cart_majutsushi_device(const machine_config &mco
}
-MACHINE_CONFIG_START(msx_cart_majutsushi_device::device_add_mconfig)
+void msx_cart_majutsushi_device::device_add_mconfig(machine_config &config)
+{
// This is actually incorrect. The sound output is passed back into the MSX machine where it is mixed internally and output through the system 'speaker'.
SPEAKER(config, "speaker").front_center();
- MCFG_DEVICE_ADD("dac", DAC_8BIT_R2R, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 0.05) // unknown DAC
- MCFG_DEVICE_ADD("vref", VOLTAGE_REGULATOR, 0) MCFG_VOLTAGE_REGULATOR_OUTPUT(5.0)
- MCFG_SOUND_ROUTE(0, "dac", 1.0, DAC_VREF_POS_INPUT) MCFG_SOUND_ROUTE(0, "dac", -1.0, DAC_VREF_NEG_INPUT)
-MACHINE_CONFIG_END
+ DAC_8BIT_R2R(config, m_dac, 0).add_route(ALL_OUTPUTS, "speaker", 0.05); // unknown DAC
+ voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref"));
+ vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT);
+ vref.add_route(0, "dac", -1.0, DAC_VREF_NEG_INPUT);
+}
void msx_cart_majutsushi_device::device_start()
{
save_item(NAME(m_selected_bank));
+}
- machine().save().register_postload(save_prepost_delegate(FUNC(msx_cart_majutsushi_device::restore_banks), this));
+
+void msx_cart_majutsushi_device::device_post_load()
+{
+ restore_banks();
}
@@ -76,13 +82,13 @@ void msx_cart_majutsushi_device::initialize_cartridge()
}
-READ8_MEMBER(msx_cart_majutsushi_device::read_cart)
+uint8_t msx_cart_majutsushi_device::read_cart(offs_t offset)
{
return m_bank_base[offset >> 13][offset & 0x1fff];
}
-WRITE8_MEMBER(msx_cart_majutsushi_device::write_cart)
+void msx_cart_majutsushi_device::write_cart(offs_t offset, uint8_t data)
{
switch (offset & 0xe000)
{
diff --git a/src/devices/bus/msx_cart/majutsushi.h b/src/devices/bus/msx_cart/majutsushi.h
index 596fac47050..ebdf549272e 100644
--- a/src/devices/bus/msx_cart/majutsushi.h
+++ b/src/devices/bus/msx_cart/majutsushi.h
@@ -19,13 +19,14 @@ public:
virtual void initialize_cartridge() override;
- virtual DECLARE_READ8_MEMBER(read_cart) override;
- virtual DECLARE_WRITE8_MEMBER(write_cart) override;
+ virtual uint8_t read_cart(offs_t offset) override;
+ virtual void write_cart(offs_t offset, uint8_t data) override;
protected:
// device-level overrides
virtual void device_start() override;
virtual void device_reset() override;
+ virtual void device_post_load() override;
virtual void device_add_mconfig(machine_config &config) override;
diff --git a/src/devices/bus/msx_cart/moonsound.cpp b/src/devices/bus/msx_cart/moonsound.cpp
index d8b1fda9a5e..e01498c57bc 100644
--- a/src/devices/bus/msx_cart/moonsound.cpp
+++ b/src/devices/bus/msx_cart/moonsound.cpp
@@ -67,13 +67,10 @@ const tiny_rom_entry *msx_cart_moonsound_device::device_rom_region() const
void msx_cart_moonsound_device::device_start()
{
- m_out_irq_cb.resolve_safe();
-
// Install IO read/write handlers
- address_space &space = machine().device<cpu_device>("maincpu")->space(AS_IO);
- space.install_readwrite_handler(0x7e, 0x7f, read8_delegate(FUNC(msx_cart_moonsound_device::read_ymf278b_pcm), this), write8_delegate(FUNC(msx_cart_moonsound_device::write_ymf278b_pcm), this));
- space.install_readwrite_handler(0xc4, 0xc7, read8_delegate(FUNC(msx_cart_moonsound_device::read_ymf278b_fm), this), write8_delegate(FUNC(msx_cart_moonsound_device::write_ymf278b_fm), this));
- space.install_read_handler(0xc0, 0xc0, read8_delegate(FUNC(msx_cart_moonsound_device::read_c0), this));
+ io_space().install_readwrite_handler(0x7e, 0x7f, read8sm_delegate(FUNC(msx_cart_moonsound_device::read_ymf278b_pcm), this), write8sm_delegate(FUNC(msx_cart_moonsound_device::write_ymf278b_pcm), this));
+ io_space().install_readwrite_handler(0xc4, 0xc7, read8sm_delegate(FUNC(msx_cart_moonsound_device::read_ymf278b_fm), this), write8sm_delegate(FUNC(msx_cart_moonsound_device::write_ymf278b_fm), this));
+ io_space().install_read_handler(0xc0, 0xc0, read8smo_delegate(FUNC(msx_cart_moonsound_device::read_c0), this));
}
@@ -85,40 +82,40 @@ void msx_cart_moonsound_device::device_reset()
WRITE_LINE_MEMBER(msx_cart_moonsound_device::irq_w)
{
LOG("moonsound: irq state %d\n", state);
- m_out_irq_cb(state);
+ irq_out(state);
}
-WRITE8_MEMBER(msx_cart_moonsound_device::write_ymf278b_fm)
+void msx_cart_moonsound_device::write_ymf278b_fm(offs_t offset, uint8_t data)
{
LOG("moonsound: write 0x%02x, data 0x%02x\n", 0xc4 + offset, data);
- m_ymf278b->write(space, offset, data);
+ m_ymf278b->write(offset, data);
}
-READ8_MEMBER(msx_cart_moonsound_device::read_ymf278b_fm)
+uint8_t msx_cart_moonsound_device::read_ymf278b_fm(offs_t offset)
{
LOG("moonsound: read 0x%02x\n", 0xc4 + offset);
- return m_ymf278b->read(space, offset);
+ return m_ymf278b->read(offset);
}
-WRITE8_MEMBER(msx_cart_moonsound_device::write_ymf278b_pcm)
+void msx_cart_moonsound_device::write_ymf278b_pcm(offs_t offset, uint8_t data)
{
LOG("moonsound: write 0x%02x, data 0x%02x\n", 0x7e + offset, data);
- m_ymf278b->write(space, 4 + offset, data);
+ m_ymf278b->write(4 + offset, data);
}
-READ8_MEMBER(msx_cart_moonsound_device::read_ymf278b_pcm)
+uint8_t msx_cart_moonsound_device::read_ymf278b_pcm(offs_t offset)
{
LOG("moonsound: read 0x%02x\n", 0x7e + offset);
- return m_ymf278b->read(space, 4 + offset);
+ return m_ymf278b->read(4 + offset);
}
// For detecting presence of moonsound cartridge
-READ8_MEMBER(msx_cart_moonsound_device::read_c0)
+uint8_t msx_cart_moonsound_device::read_c0()
{
LOG("moonsound: read 0xc0\n");
return 0x00;
diff --git a/src/devices/bus/msx_cart/moonsound.h b/src/devices/bus/msx_cart/moonsound.h
index 02f16c94ed3..ca30dfb5c35 100644
--- a/src/devices/bus/msx_cart/moonsound.h
+++ b/src/devices/bus/msx_cart/moonsound.h
@@ -27,11 +27,11 @@ protected:
private:
DECLARE_WRITE_LINE_MEMBER(irq_w);
- DECLARE_WRITE8_MEMBER(write_ymf278b_fm);
- DECLARE_READ8_MEMBER(read_ymf278b_fm);
- DECLARE_WRITE8_MEMBER(write_ymf278b_pcm);
- DECLARE_READ8_MEMBER(read_ymf278b_pcm);
- DECLARE_READ8_MEMBER(read_c0);
+ void write_ymf278b_fm(offs_t offset, uint8_t data);
+ uint8_t read_ymf278b_fm(offs_t offset);
+ void write_ymf278b_pcm(offs_t offset, uint8_t data);
+ uint8_t read_ymf278b_pcm(offs_t offset);
+ uint8_t read_c0();
void ymf278b_map(address_map &map);
diff --git a/src/devices/bus/msx_cart/msx_audio.cpp b/src/devices/bus/msx_cart/msx_audio.cpp
index 61f96ff1eaa..679c035b014 100644
--- a/src/devices/bus/msx_cart/msx_audio.cpp
+++ b/src/devices/bus/msx_cart/msx_audio.cpp
@@ -96,9 +96,8 @@ void msx_cart_msx_audio_hxmu900_device::device_add_mconfig(machine_config &confi
void msx_cart_msx_audio_hxmu900_device::device_start()
{
// Install IO read/write handlers
- address_space &space = machine().device<cpu_device>("maincpu")->space(AS_IO);
- space.install_write_handler(0xc0, 0xc1, write8_delegate(FUNC(y8950_device::write), m_y8950.target()));
- space.install_read_handler(0xc0, 0xc1, read8_delegate(FUNC(y8950_device::read), m_y8950.target()));
+ io_space().install_write_handler(0xc0, 0xc1, write8sm_delegate(FUNC(y8950_device::write), m_y8950.target()));
+ io_space().install_read_handler(0xc0, 0xc1, read8sm_delegate(FUNC(y8950_device::read), m_y8950.target()));
}
@@ -111,7 +110,7 @@ void msx_cart_msx_audio_hxmu900_device::initialize_cartridge()
}
-READ8_MEMBER(msx_cart_msx_audio_hxmu900_device::read_cart)
+uint8_t msx_cart_msx_audio_hxmu900_device::read_cart(offs_t offset)
{
if (offset >= 0x4000 && offset < 0xC000)
{
@@ -201,11 +200,10 @@ WRITE_LINE_MEMBER(msx_cart_msx_audio_nms1205_device::midi_in)
void msx_cart_msx_audio_nms1205_device::device_start()
{
// Install IO read/write handlers
- address_space &space = machine().device<cpu_device>("maincpu")->space(AS_IO);
- space.install_write_handler(0xc0, 0xc1, write8_delegate(FUNC(y8950_device::write), m_y8950.target()));
- space.install_read_handler(0xc0, 0xc1, read8_delegate(FUNC(y8950_device::read), m_y8950.target()));
- space.install_write_handler(0x00, 0x01, write8_delegate(FUNC(acia6850_device::write), m_acia6850.target()));
- space.install_read_handler(0x04, 0x05, read8_delegate(FUNC(acia6850_device::read), m_acia6850.target()));
+ io_space().install_write_handler(0xc0, 0xc1, write8sm_delegate(FUNC(y8950_device::write), m_y8950.target()));
+ io_space().install_read_handler(0xc0, 0xc1, read8sm_delegate(FUNC(y8950_device::read), m_y8950.target()));
+ io_space().install_write_handler(0x00, 0x01, write8sm_delegate(FUNC(acia6850_device::write), m_acia6850.target()));
+ io_space().install_read_handler(0x04, 0x05, read8sm_delegate(FUNC(acia6850_device::read), m_acia6850.target()));
}
@@ -218,7 +216,7 @@ void msx_cart_msx_audio_nms1205_device::initialize_cartridge()
}
-READ8_MEMBER(msx_cart_msx_audio_nms1205_device::read_cart)
+uint8_t msx_cart_msx_audio_nms1205_device::read_cart(offs_t offset)
{
if (offset >= 0x4000 && offset < 0xC000)
{
@@ -289,9 +287,8 @@ const tiny_rom_entry *msx_cart_msx_audio_fsca1_device::device_rom_region() const
void msx_cart_msx_audio_fsca1_device::device_start()
{
// Install IO read/write handlers
- address_space &space = machine().device<cpu_device>("maincpu")->space(AS_IO);
- space.install_write_handler(0xc0, 0xc3, write8_delegate(FUNC(msx_cart_msx_audio_fsca1_device::write_y8950), this));
- space.install_read_handler(0xc0, 0xc3, read8_delegate(FUNC(msx_cart_msx_audio_fsca1_device::read_y8950), this));
+ io_space().install_write_handler(0xc0, 0xc3, write8sm_delegate(FUNC(msx_cart_msx_audio_fsca1_device::write_y8950), this));
+ io_space().install_read_handler(0xc0, 0xc3, read8sm_delegate(FUNC(msx_cart_msx_audio_fsca1_device::read_y8950), this));
}
@@ -304,7 +301,7 @@ void msx_cart_msx_audio_fsca1_device::initialize_cartridge()
}
-READ8_MEMBER(msx_cart_msx_audio_fsca1_device::read_cart)
+uint8_t msx_cart_msx_audio_fsca1_device::read_cart(offs_t offset)
{
if (m_7ffe == 0 && (offset & 0xB000) == 0x3000)
{
@@ -314,7 +311,7 @@ READ8_MEMBER(msx_cart_msx_audio_fsca1_device::read_cart)
}
-WRITE8_MEMBER(msx_cart_msx_audio_fsca1_device::write_cart)
+void msx_cart_msx_audio_fsca1_device::write_cart(offs_t offset, uint8_t data)
{
if (offset == 0x7ffe)
{
@@ -338,45 +335,45 @@ WRITE8_MEMBER(msx_cart_msx_audio_fsca1_device::write_cart)
}
-WRITE8_MEMBER(msx_cart_msx_audio_fsca1_device::write_y8950)
+void msx_cart_msx_audio_fsca1_device::write_y8950(offs_t offset, uint8_t data)
{
if (offset & 2)
{
if (m_7fff & 0x02)
{
- m_y8950->write(space, offset, data);
+ m_y8950->write(offset, data);
}
}
else
{
if (m_7fff & 0x01)
{
- m_y8950->write(space, offset, data);
+ m_y8950->write(offset, data);
}
}
}
-READ8_MEMBER(msx_cart_msx_audio_fsca1_device::read_y8950)
+uint8_t msx_cart_msx_audio_fsca1_device::read_y8950(offs_t offset)
{
if (offset & 2)
{
- return (m_7fff & 0x02) ? m_y8950->read(space, offset) : 0xff;
+ return (m_7fff & 0x02) ? m_y8950->read(offset) : 0xff;
}
else
{
- return (m_7fff & 0x01) ? m_y8950->read(space, offset) : 0xff;
+ return (m_7fff & 0x01) ? m_y8950->read(offset) : 0xff;
}
}
-WRITE8_MEMBER(msx_cart_msx_audio_fsca1_device::y8950_io_w)
+void msx_cart_msx_audio_fsca1_device::y8950_io_w(uint8_t data)
{
logerror("msx_fsca1::y8950_io_w: %02x\n", data);
}
-READ8_MEMBER(msx_cart_msx_audio_fsca1_device::y8950_io_r)
+uint8_t msx_cart_msx_audio_fsca1_device::y8950_io_r()
{
return m_io_config->read();
}
diff --git a/src/devices/bus/msx_cart/msx_audio.h b/src/devices/bus/msx_cart/msx_audio.h
index d9fc89baa8c..3aeee7cddf1 100644
--- a/src/devices/bus/msx_cart/msx_audio.h
+++ b/src/devices/bus/msx_cart/msx_audio.h
@@ -23,7 +23,7 @@ public:
virtual void initialize_cartridge() override;
- virtual DECLARE_READ8_MEMBER(read_cart) override;
+ virtual uint8_t read_cart(offs_t offset) override;
protected:
virtual void device_start() override;
@@ -44,7 +44,7 @@ public:
virtual void initialize_cartridge() override;
- virtual DECLARE_READ8_MEMBER(read_cart) override;
+ virtual uint8_t read_cart(offs_t offset) override;
protected:
virtual void device_start() override;
@@ -71,8 +71,8 @@ public:
virtual void initialize_cartridge() override;
- virtual DECLARE_READ8_MEMBER(read_cart) override;
- virtual DECLARE_WRITE8_MEMBER(write_cart) override;
+ virtual uint8_t read_cart(offs_t offset) override;
+ virtual void write_cart(offs_t offset, uint8_t data) override;
protected:
virtual void device_start() override;
@@ -82,12 +82,12 @@ protected:
virtual ioport_constructor device_input_ports() const override;
virtual const tiny_rom_entry *device_rom_region() const override;
- DECLARE_WRITE8_MEMBER(write_y8950);
- DECLARE_READ8_MEMBER(read_y8950);
-
private:
- DECLARE_WRITE8_MEMBER(y8950_io_w);
- DECLARE_READ8_MEMBER(y8950_io_r);
+ void write_y8950(offs_t offset, uint8_t data);
+ uint8_t read_y8950(offs_t offset);
+
+ void y8950_io_w(uint8_t data);
+ uint8_t y8950_io_r();
required_device<y8950_device> m_y8950;
required_ioport m_io_config;
diff --git a/src/devices/bus/msx_cart/msx_audio_kb.cpp b/src/devices/bus/msx_cart/msx_audio_kb.cpp
index 9bbae0aab93..68303c56667 100644
--- a/src/devices/bus/msx_cart/msx_audio_kb.cpp
+++ b/src/devices/bus/msx_cart/msx_audio_kb.cpp
@@ -21,20 +21,20 @@ void msx_audio_kbdc_port_device::device_start()
}
-WRITE8_MEMBER(msx_audio_kbdc_port_device::write)
+void msx_audio_kbdc_port_device::write(uint8_t data)
{
if (m_keyboard)
{
- m_keyboard->write(space, offset, data);
+ m_keyboard->write(data);
}
}
-READ8_MEMBER(msx_audio_kbdc_port_device::read)
+uint8_t msx_audio_kbdc_port_device::read()
{
if (m_keyboard)
{
- return m_keyboard->read(space, offset);
+ return m_keyboard->read();
}
return 0xff;
}
@@ -57,7 +57,7 @@ public:
virtual ioport_constructor device_input_ports() const override;
- virtual DECLARE_READ8_MEMBER(read) override
+ virtual uint8_t read() override
{
uint8_t result = 0xff;
@@ -71,7 +71,7 @@ public:
return result;
}
- virtual DECLARE_WRITE8_MEMBER(write) override
+ virtual void write(uint8_t data) override
{
m_row = data;
}
@@ -187,7 +187,7 @@ public:
virtual ioport_constructor device_input_ports() const override;
- virtual DECLARE_READ8_MEMBER(read) override
+ virtual uint8_t read() override
{
uint8_t result = 0xff;
@@ -201,7 +201,7 @@ public:
return result;
}
- virtual DECLARE_WRITE8_MEMBER(write) override
+ virtual void write(uint8_t data) override
{
logerror("msx_nms1160::write %02x\n", data);
m_row = data;
diff --git a/src/devices/bus/msx_cart/msx_audio_kb.h b/src/devices/bus/msx_cart/msx_audio_kb.h
index 25f0a2d24f8..93a2d026214 100644
--- a/src/devices/bus/msx_cart/msx_audio_kb.h
+++ b/src/devices/bus/msx_cart/msx_audio_kb.h
@@ -10,9 +10,8 @@ DECLARE_DEVICE_TYPE(MSX_AUDIO_KBDC_PORT, msx_audio_kbdc_port_device)
class msx_audio_kb_port_interface : public device_slot_card_interface
{
public:
-
- virtual DECLARE_READ8_MEMBER(read) { return 0xff; }
- virtual DECLARE_WRITE8_MEMBER(write) { }
+ virtual uint8_t read() { return 0xff; }
+ virtual void write(uint8_t data) { }
protected:
// construction/destruction
@@ -39,8 +38,8 @@ public:
virtual void device_start() override;
// Physical connection simply consists of 8 input and 8 output lines split across 2 connectors
- DECLARE_WRITE8_MEMBER(write);
- DECLARE_READ8_MEMBER(read);
+ void write(uint8_t data);
+ uint8_t read();
protected:
diff --git a/src/devices/bus/msx_cart/msxdos2.cpp b/src/devices/bus/msx_cart/msxdos2.cpp
index f4e391f66e9..7f3e506b007 100644
--- a/src/devices/bus/msx_cart/msxdos2.cpp
+++ b/src/devices/bus/msx_cart/msxdos2.cpp
@@ -18,8 +18,12 @@ msx_cart_msxdos2_device::msx_cart_msxdos2_device(const machine_config &mconfig,
void msx_cart_msxdos2_device::device_start()
{
save_item(NAME(m_selected_bank));
+}
+
- machine().save().register_postload(save_prepost_delegate(FUNC(msx_cart_msxdos2_device::restore_banks), this));
+void msx_cart_msxdos2_device::device_post_load()
+{
+ restore_banks();
}
@@ -46,7 +50,7 @@ void msx_cart_msxdos2_device::initialize_cartridge()
}
-READ8_MEMBER(msx_cart_msxdos2_device::read_cart)
+uint8_t msx_cart_msxdos2_device::read_cart(offs_t offset)
{
if (offset >= 0x4000 && offset < 0x8000)
{
@@ -57,7 +61,7 @@ READ8_MEMBER(msx_cart_msxdos2_device::read_cart)
}
-WRITE8_MEMBER(msx_cart_msxdos2_device::write_cart)
+void msx_cart_msxdos2_device::write_cart(offs_t offset, uint8_t data)
{
if (offset == 0x6000)
{
diff --git a/src/devices/bus/msx_cart/msxdos2.h b/src/devices/bus/msx_cart/msxdos2.h
index b30fbb70bd8..dd5eb51d245 100644
--- a/src/devices/bus/msx_cart/msxdos2.h
+++ b/src/devices/bus/msx_cart/msxdos2.h
@@ -18,13 +18,14 @@ public:
virtual void initialize_cartridge() override;
- virtual DECLARE_READ8_MEMBER(read_cart) override;
- virtual DECLARE_WRITE8_MEMBER(write_cart) override;
+ virtual uint8_t read_cart(offs_t offset) override;
+ virtual void write_cart(offs_t offset, uint8_t data) override;
protected:
// device-level overrides
virtual void device_start() override;
virtual void device_reset() override;
+ virtual void device_post_load() override;
void restore_banks();
diff --git a/src/devices/bus/msx_cart/nomapper.cpp b/src/devices/bus/msx_cart/nomapper.cpp
index 5152464cbc4..24ebbb38e0d 100644
--- a/src/devices/bus/msx_cart/nomapper.cpp
+++ b/src/devices/bus/msx_cart/nomapper.cpp
@@ -84,7 +84,7 @@ void msx_cart_nomapper_device::initialize_cartridge()
m_end_address = std::min<uint32_t>(m_start_address + size, 0x10000);
}
-READ8_MEMBER(msx_cart_nomapper_device::read_cart)
+uint8_t msx_cart_nomapper_device::read_cart(offs_t offset)
{
if ( offset >= m_start_address && offset < m_end_address )
{
diff --git a/src/devices/bus/msx_cart/nomapper.h b/src/devices/bus/msx_cart/nomapper.h
index 7b29b6a69b3..eb5e40e1d08 100644
--- a/src/devices/bus/msx_cart/nomapper.h
+++ b/src/devices/bus/msx_cart/nomapper.h
@@ -21,7 +21,7 @@ public:
virtual void initialize_cartridge() override;
- virtual DECLARE_READ8_MEMBER(read_cart) override;
+ virtual uint8_t read_cart(offs_t offset) override;
private:
uint32_t m_start_address;
diff --git a/src/devices/bus/msx_cart/rtype.cpp b/src/devices/bus/msx_cart/rtype.cpp
index 3853cfeed9a..6cda0efb4e8 100644
--- a/src/devices/bus/msx_cart/rtype.cpp
+++ b/src/devices/bus/msx_cart/rtype.cpp
@@ -21,8 +21,12 @@ msx_cart_rtype_device::msx_cart_rtype_device(const machine_config &mconfig, cons
void msx_cart_rtype_device::device_start()
{
save_item(NAME(m_selected_bank));
+}
+
- machine().save().register_postload(save_prepost_delegate(FUNC(msx_cart_rtype_device::restore_banks), this));
+void msx_cart_rtype_device::device_post_load()
+{
+ restore_banks();
}
@@ -54,7 +58,7 @@ void msx_cart_rtype_device::initialize_cartridge()
}
-READ8_MEMBER(msx_cart_rtype_device::read_cart)
+uint8_t msx_cart_rtype_device::read_cart(offs_t offset)
{
if (offset >= 0x4000 && offset < 0xc000)
{
@@ -64,7 +68,7 @@ READ8_MEMBER(msx_cart_rtype_device::read_cart)
}
-WRITE8_MEMBER(msx_cart_rtype_device::write_cart)
+void msx_cart_rtype_device::write_cart(offs_t offset, uint8_t data)
{
if (offset >= 0x7000 && offset < 0x8000)
{
diff --git a/src/devices/bus/msx_cart/rtype.h b/src/devices/bus/msx_cart/rtype.h
index 435d8666273..31583455a0a 100644
--- a/src/devices/bus/msx_cart/rtype.h
+++ b/src/devices/bus/msx_cart/rtype.h
@@ -18,13 +18,14 @@ public:
virtual void initialize_cartridge() override;
- virtual DECLARE_READ8_MEMBER(read_cart) override;
- virtual DECLARE_WRITE8_MEMBER(write_cart) override;
+ virtual uint8_t read_cart(offs_t offset) override;
+ virtual void write_cart(offs_t offset, uint8_t data) override;
protected:
// device-level overrides
virtual void device_start() override;
virtual void device_reset() override;
+ virtual void device_post_load() override;
void restore_banks();
diff --git a/src/devices/bus/msx_cart/super_swangi.cpp b/src/devices/bus/msx_cart/super_swangi.cpp
index 75ee75be6a0..a64b0648195 100644
--- a/src/devices/bus/msx_cart/super_swangi.cpp
+++ b/src/devices/bus/msx_cart/super_swangi.cpp
@@ -19,8 +19,12 @@ msx_cart_super_swangi_device::msx_cart_super_swangi_device(const machine_config
void msx_cart_super_swangi_device::device_start()
{
save_item(NAME(m_selected_bank));
+}
+
- machine().save().register_postload(save_prepost_delegate(FUNC(msx_cart_super_swangi_device::restore_banks), this));
+void msx_cart_super_swangi_device::device_post_load()
+{
+ restore_banks();
}
@@ -48,7 +52,7 @@ void msx_cart_super_swangi_device::initialize_cartridge()
}
-READ8_MEMBER(msx_cart_super_swangi_device::read_cart)
+uint8_t msx_cart_super_swangi_device::read_cart(offs_t offset)
{
if (offset >= 0x4000 && offset < 0xc000)
{
@@ -58,7 +62,7 @@ READ8_MEMBER(msx_cart_super_swangi_device::read_cart)
}
-WRITE8_MEMBER(msx_cart_super_swangi_device::write_cart)
+void msx_cart_super_swangi_device::write_cart(offs_t offset, uint8_t data)
{
if (offset == 0x8000)
{
diff --git a/src/devices/bus/msx_cart/super_swangi.h b/src/devices/bus/msx_cart/super_swangi.h
index cf3b9f3b7c9..f0f5ee216bd 100644
--- a/src/devices/bus/msx_cart/super_swangi.h
+++ b/src/devices/bus/msx_cart/super_swangi.h
@@ -18,13 +18,14 @@ public:
virtual void initialize_cartridge() override;
- virtual DECLARE_READ8_MEMBER(read_cart) override;
- virtual DECLARE_WRITE8_MEMBER(write_cart) override;
+ virtual uint8_t read_cart(offs_t offset) override;
+ virtual void write_cart(offs_t offset, uint8_t data) override;
protected:
// device-level overrides
virtual void device_start() override;
virtual void device_reset() override;
+ virtual void device_post_load() override;
void restore_banks();
diff --git a/src/devices/bus/msx_cart/superloderunner.cpp b/src/devices/bus/msx_cart/superloderunner.cpp
index 51289c24f10..b846a935953 100644
--- a/src/devices/bus/msx_cart/superloderunner.cpp
+++ b/src/devices/bus/msx_cart/superloderunner.cpp
@@ -19,11 +19,14 @@ void msx_cart_superloderunner_device::device_start()
{
save_item(NAME(m_selected_bank));
- machine().save().register_postload(save_prepost_delegate(FUNC(msx_cart_superloderunner_device::restore_banks), this));
-
// Install evil memory write handler
- address_space &space = machine().device<cpu_device>("maincpu")->space(AS_PROGRAM);
- space.install_write_handler(0x0000, 0x0000, write8_delegate(FUNC(msx_cart_superloderunner_device::banking), this));
+ memory_space().install_write_handler(0x0000, 0x0000, write8smo_delegate(FUNC(msx_cart_superloderunner_device::banking), this));
+}
+
+
+void msx_cart_superloderunner_device::device_post_load()
+{
+ restore_banks();
}
@@ -44,7 +47,7 @@ void msx_cart_superloderunner_device::initialize_cartridge()
}
-READ8_MEMBER(msx_cart_superloderunner_device::read_cart)
+uint8_t msx_cart_superloderunner_device::read_cart(offs_t offset)
{
if (offset >= 0x8000 && offset < 0xc000)
{
@@ -55,7 +58,7 @@ READ8_MEMBER(msx_cart_superloderunner_device::read_cart)
}
-WRITE8_MEMBER(msx_cart_superloderunner_device::banking)
+void msx_cart_superloderunner_device::banking(uint8_t data)
{
m_selected_bank = data;
restore_banks();
diff --git a/src/devices/bus/msx_cart/superloderunner.h b/src/devices/bus/msx_cart/superloderunner.h
index b8e73535ebf..bd763ca2c08 100644
--- a/src/devices/bus/msx_cart/superloderunner.h
+++ b/src/devices/bus/msx_cart/superloderunner.h
@@ -18,17 +18,18 @@ public:
virtual void initialize_cartridge() override;
- virtual DECLARE_READ8_MEMBER(read_cart) override;
-
- DECLARE_WRITE8_MEMBER(banking);
+ virtual uint8_t read_cart(offs_t offset) override;
protected:
// device-level overrides
virtual void device_start() override;
+ virtual void device_post_load() override;
void restore_banks();
private:
+ void banking(uint8_t data);
+
uint8_t m_selected_bank;
uint8_t *m_bank_base;
};
diff --git a/src/devices/bus/msx_cart/yamaha.cpp b/src/devices/bus/msx_cart/yamaha.cpp
index e6f7dc844fe..9296779f1b3 100644
--- a/src/devices/bus/msx_cart/yamaha.cpp
+++ b/src/devices/bus/msx_cart/yamaha.cpp
@@ -131,22 +131,22 @@ void msx_cart_sfg_device::check_irq()
{
if (m_ym2151_irq_state != CLEAR_LINE || m_ym2148_irq_state != CLEAR_LINE)
{
- m_out_irq_cb(ASSERT_LINE);
+ irq_out(ASSERT_LINE);
}
else
{
- m_out_irq_cb(CLEAR_LINE);
+ irq_out(CLEAR_LINE);
}
}
-READ8_MEMBER(msx_cart_sfg_device::read_cart)
+uint8_t msx_cart_sfg_device::read_cart(offs_t offset)
{
switch (offset & 0x3fff)
{
case 0x3ff0: // YM-2151 status read
case 0x3ff1: // YM-2151 status read mirror?
- return m_ym2151->status_r(space, 0);
+ return m_ym2151->status_r();
case 0x3ff2: // YM-2148 keyboard column read
case 0x3ff3: // YM-2148 --
@@ -155,7 +155,7 @@ READ8_MEMBER(msx_cart_sfg_device::read_cart)
case 0x3ff6: // YM-2148 MIDI UART status register
// ------x- - 1 = received a byte/receive buffer full?
// -------x - 1 = ready to send next byte/send buffer empty?
- return m_ym2148->read(space, offset & 7);
+ return m_ym2148->read(offset & 7);
}
if (offset < 0x8000)
@@ -167,16 +167,16 @@ READ8_MEMBER(msx_cart_sfg_device::read_cart)
}
-WRITE8_MEMBER(msx_cart_sfg_device::write_cart)
+void msx_cart_sfg_device::write_cart(offs_t offset, uint8_t data)
{
switch (offset & 0x3fff)
{
case 0x3ff0: // YM-2151 register
- m_ym2151->register_w(space, 0, data);
+ m_ym2151->register_w(data);
break;
case 0x3ff1: // YM-2151 data
- m_ym2151->data_w(space, 0, data);
+ m_ym2151->data_w(data);
break;
case 0x3ff2: // YM-2148 write keyboard row
@@ -191,7 +191,7 @@ WRITE8_MEMBER(msx_cart_sfg_device::write_cart)
// x------- - 1 = reset
// -----x-- - 1 = enable receiving / sending midi data
// -------x - 1 = enable receiving / sending midi data
- m_ym2148->write(space, offset & 7, data);
+ m_ym2148->write(offset & 7, data);
break;
default:
diff --git a/src/devices/bus/msx_cart/yamaha.h b/src/devices/bus/msx_cart/yamaha.h
index b8f30bf057f..e5072dc5dcf 100644
--- a/src/devices/bus/msx_cart/yamaha.h
+++ b/src/devices/bus/msx_cart/yamaha.h
@@ -18,8 +18,9 @@ DECLARE_DEVICE_TYPE(MSX_CART_SFG05, msx_cart_sfg05_device)
class msx_cart_sfg_device : public device_t, public msx_cart_interface
{
public:
- virtual DECLARE_READ8_MEMBER(read_cart) override;
- virtual DECLARE_WRITE8_MEMBER(write_cart) override;
+ virtual uint8_t read_cart(offs_t offset) override;
+ virtual void write_cart(offs_t offset, uint8_t data) override;
+
protected:
msx_cart_sfg_device(const machine_config &mconfig, const device_type type, const char *tag, device_t *owner, uint32_t clock);
diff --git a/src/devices/bus/msx_slot/bunsetsu.cpp b/src/devices/bus/msx_slot/bunsetsu.cpp
index a2f8a131a54..79a07b2e53a 100644
--- a/src/devices/bus/msx_slot/bunsetsu.cpp
+++ b/src/devices/bus/msx_slot/bunsetsu.cpp
@@ -25,17 +25,17 @@ void msx_slot_bunsetsu_device::device_reset()
}
-READ8_MEMBER(msx_slot_bunsetsu_device::read)
+uint8_t msx_slot_bunsetsu_device::read(offs_t offset)
{
if (offset == 0xbfff)
{
return m_bunsetsu_region[m_bunsetsu_address++ & 0x1ffff];
}
- return msx_slot_rom_device::read(space, offset);
+ return msx_slot_rom_device::read(offset);
}
-WRITE8_MEMBER(msx_slot_bunsetsu_device::write)
+void msx_slot_bunsetsu_device::write(offs_t offset, uint8_t data)
{
switch (offset)
{
diff --git a/src/devices/bus/msx_slot/bunsetsu.h b/src/devices/bus/msx_slot/bunsetsu.h
index 70649340824..df0bcedb32f 100644
--- a/src/devices/bus/msx_slot/bunsetsu.h
+++ b/src/devices/bus/msx_slot/bunsetsu.h
@@ -12,11 +12,6 @@
DECLARE_DEVICE_TYPE(MSX_SLOT_BUNSETSU, msx_slot_bunsetsu_device)
-#define MCFG_MSX_SLOT_BUNSETSU_ADD(_tag, _startpage, _numpages, _region, _offset, _bunsetsu_region_tag) \
- MCFG_MSX_INTERNAL_SLOT_ADD(_tag, MSX_SLOT_BUNSETSU, _startpage, _numpages) \
- downcast<msx_slot_rom_device &>(*device).set_rom_start(_region, _offset); \
- downcast<msx_slot_bunsetsu_device &>(*device).set_bunsetsu_region_tag(_bunsetsu_region_tag);
-
class msx_slot_bunsetsu_device : public msx_slot_rom_device
{
public:
@@ -25,8 +20,8 @@ public:
// configuration helpers
void set_bunsetsu_region_tag(const char *tag) { m_bunsetsu_region.set_tag(tag); }
- virtual DECLARE_READ8_MEMBER(read) override;
- virtual DECLARE_WRITE8_MEMBER(write) override;
+ virtual uint8_t read(offs_t offset) override;
+ virtual void write(offs_t offset, uint8_t data) override;
protected:
virtual void device_reset() override;
diff --git a/src/devices/bus/msx_slot/cartridge.cpp b/src/devices/bus/msx_slot/cartridge.cpp
index 522ea6f4548..87b89f93c78 100644
--- a/src/devices/bus/msx_slot/cartridge.cpp
+++ b/src/devices/bus/msx_slot/cartridge.cpp
@@ -43,7 +43,7 @@ msx_slot_cartridge_device::msx_slot_cartridge_device(const machine_config &mconf
: device_t(mconfig, type, tag, owner, clock)
, device_image_interface(mconfig, *this)
, device_slot_interface(mconfig, *this)
- , msx_internal_slot_interface()
+ , msx_internal_slot_interface(mconfig, *this)
, m_irq_handler(*this)
, m_cartridge(nullptr)
{
@@ -90,10 +90,17 @@ static const char *msx_cart_get_slot_option(int type)
}
-void msx_slot_cartridge_device::device_start()
+void msx_slot_cartridge_device::device_resolve_objects()
{
m_irq_handler.resolve_safe();
m_cartridge = dynamic_cast<msx_cart_interface *>(get_card_device());
+ if (m_cartridge)
+ m_cartridge->m_exp = this;
+}
+
+
+void msx_slot_cartridge_device::device_start()
+{
}
@@ -169,7 +176,7 @@ image_init_result msx_slot_cartridge_device::call_load()
}
}
- m_cartridge->set_out_irq_cb(DEVCB_WRITELINE(*this, msx_slot_cartridge_device, irq_out));
+ m_cartridge->m_exp = this;
m_cartridge->initialize_cartridge();
if (m_cartridge->get_sram_size() > 0)
@@ -331,21 +338,21 @@ std::string msx_slot_cartridge_device::get_default_card_software(get_default_car
}
-READ8_MEMBER(msx_slot_cartridge_device::read)
+uint8_t msx_slot_cartridge_device::read(offs_t offset)
{
if ( m_cartridge )
{
- return m_cartridge->read_cart(space, offset);
+ return m_cartridge->read_cart(offset);
}
return 0xFF;
}
-WRITE8_MEMBER(msx_slot_cartridge_device::write)
+void msx_slot_cartridge_device::write(offs_t offset, uint8_t data)
{
if ( m_cartridge )
{
- m_cartridge->write_cart(space, offset, data);
+ m_cartridge->write_cart(offset, data);
}
}
@@ -360,8 +367,4 @@ msx_slot_yamaha_expansion_device::msx_slot_yamaha_expansion_device(const machine
void msx_slot_yamaha_expansion_device::device_start()
{
- m_irq_handler.resolve_safe();
- m_cartridge = dynamic_cast<msx_cart_interface *>(get_card_device());
- if (m_cartridge)
- m_cartridge->set_out_irq_cb(DEVCB_WRITELINE(*this, msx_slot_cartridge_device, irq_out));
}
diff --git a/src/devices/bus/msx_slot/cartridge.h b/src/devices/bus/msx_slot/cartridge.h
index be0856e8d82..faabf394042 100644
--- a/src/devices/bus/msx_slot/cartridge.h
+++ b/src/devices/bus/msx_slot/cartridge.h
@@ -14,18 +14,6 @@ DECLARE_DEVICE_TYPE(MSX_SLOT_CARTRIDGE, msx_slot_cartridge_device)
DECLARE_DEVICE_TYPE(MSX_SLOT_YAMAHA_EXPANSION, msx_slot_yamaha_expansion_device)
-#define MCFG_MSX_SLOT_CARTRIDGE_ADD(_tag, _devcb) \
- MCFG_DEVICE_ADD(_tag, MSX_SLOT_CARTRIDGE, 0) \
- MCFG_DEVICE_SLOT_INTERFACE(msx_cart, nullptr, false) \
- downcast<msx_slot_cartridge_device &>(*device).set_irq_handler(DEVCB_##_devcb);
-
-
-#define MCFG_MSX_SLOT_YAMAHA_EXPANSION_ADD(_tag, _devcb, _default) \
- MCFG_DEVICE_ADD(_tag, MSX_SLOT_YAMAHA_EXPANSION, 0) \
- MCFG_DEVICE_SLOT_INTERFACE(msx_yamaha_60pin, _default, false) \
- downcast<msx_slot_cartridge_device &>(*device).set_irq_handler(DEVCB_##_devcb);
-
-
class msx_slot_cartridge_device : public device_t
, public device_image_interface
, public device_slot_interface
@@ -35,8 +23,8 @@ public:
// construction/destruction
msx_slot_cartridge_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- // static configuration helpers
- template <class Object> devcb_base &set_irq_handler(Object &&cb) { return m_irq_handler.set_callback(std::forward<Object>(cb)); }
+ // configuration helpers
+ auto irq_handler() { return m_irq_handler.bind(); }
// image-level overrides
virtual image_init_result call_load() override;
@@ -57,8 +45,8 @@ public:
virtual std::string get_default_card_software(get_default_card_software_hook &hook) const override;
// msx_internal_slot-level overrides
- virtual DECLARE_READ8_MEMBER(read) override;
- virtual DECLARE_WRITE8_MEMBER(write) override;
+ virtual uint8_t read(offs_t offset) override;
+ virtual void write(offs_t offset, uint8_t data) override;
DECLARE_WRITE_LINE_MEMBER(irq_out);
@@ -66,6 +54,7 @@ protected:
msx_slot_cartridge_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock);
// device-level overrides
+ virtual void device_resolve_objects() override;
virtual void device_start() override;
devcb_write_line m_irq_handler;
diff --git a/src/devices/bus/msx_slot/disk.cpp b/src/devices/bus/msx_slot/disk.cpp
index 39ec248e3f2..309b7f2d80f 100644
--- a/src/devices/bus/msx_slot/disk.cpp
+++ b/src/devices/bus/msx_slot/disk.cpp
@@ -137,8 +137,6 @@ void msx_slot_disk1_device::device_start()
save_item(NAME(m_side_control));
save_item(NAME(m_control));
-
- machine().save().register_postload(save_prepost_delegate(FUNC(msx_slot_disk1_device::post_load), this));
}
@@ -148,7 +146,7 @@ void msx_slot_disk1_device::device_reset()
}
-void msx_slot_disk1_device::post_load()
+void msx_slot_disk1_device::device_post_load()
{
uint8_t data = m_control;
@@ -207,7 +205,7 @@ void msx_slot_disk1_device::set_control(uint8_t data)
}
-READ8_MEMBER(msx_slot_disk1_device::read)
+uint8_t msx_slot_disk1_device::read(offs_t offset)
{
switch (offset)
{
@@ -240,11 +238,11 @@ READ8_MEMBER(msx_slot_disk1_device::read)
return 0x3f | (m_fdc->intrq_r() ? 0 : 0x40) | (m_fdc->drq_r() ? 0 : 0x80);
}
- return msx_slot_rom_device::read(space, offset);
+ return msx_slot_rom_device::read(offset);
}
-WRITE8_MEMBER(msx_slot_disk1_device::write)
+void msx_slot_disk1_device::write(offs_t offset, uint8_t data)
{
switch (offset)
{
@@ -298,8 +296,6 @@ void msx_slot_disk2_device::device_start()
msx_slot_wd_disk_device::device_start();
save_item(NAME(m_control));
-
- machine().save().register_postload(save_prepost_delegate(FUNC(msx_slot_disk2_device::post_load), this));
}
@@ -309,7 +305,7 @@ void msx_slot_disk2_device::device_reset()
}
-void msx_slot_disk2_device::post_load()
+void msx_slot_disk2_device::device_post_load()
{
uint8_t data = m_control;
@@ -356,7 +352,7 @@ void msx_slot_disk2_device::set_control(uint8_t data)
}
-READ8_MEMBER(msx_slot_disk2_device::read)
+uint8_t msx_slot_disk2_device::read(offs_t offset)
{
switch (offset)
{
@@ -381,11 +377,11 @@ READ8_MEMBER(msx_slot_disk2_device::read)
return 0x3f | (m_fdc->drq_r() ? 0 : 0x40) | (m_fdc->intrq_r() ? 0x80 : 0);
}
- return msx_slot_rom_device::read(space, offset);
+ return msx_slot_rom_device::read(offset);
}
-WRITE8_MEMBER(msx_slot_disk2_device::write)
+void msx_slot_disk2_device::write(offs_t offset, uint8_t data)
{
switch (offset)
{
@@ -431,20 +427,20 @@ msx_slot_disk3_device::msx_slot_disk3_device(const machine_config &mconfig, cons
}
-WRITE8_MEMBER(msx_slot_disk3_device::write)
+void msx_slot_disk3_device::write(offs_t offset, uint8_t data)
{
switch (offset)
{
case 0x7ff8: // CR0 : 0 - 0 - MEN1 - MEN0 - 0 - -FRST - 0 - DSA
- m_fdc->dor_w(space, 2, data);
+ m_fdc->dor_w(data);
break;
case 0x7ff9: // CR1 : 0 - 0 - C4E - C4 - SBME - SBM - TCE - FDCTC
- m_fdc->cr1_w(space, 3, data);
+ m_fdc->cr1_w(data);
break;
case 0x7ffb: // Data Register
- m_fdc->fifo_w(space, 5, data);
+ m_fdc->fifo_w(data);
break;
default:
@@ -454,17 +450,17 @@ WRITE8_MEMBER(msx_slot_disk3_device::write)
}
-READ8_MEMBER(msx_slot_disk3_device::read)
+uint8_t msx_slot_disk3_device::read(offs_t offset)
{
switch (offset)
{
case 0x7ffa: // Status Register
- return m_fdc->msr_r(space, 4);
+ return m_fdc->msr_r();
case 0x7ffb: // Data Register
- return m_fdc->fifo_r(space, 5);
+ return m_fdc->fifo_r();
}
- return msx_slot_rom_device::read(space, offset);
+ return msx_slot_rom_device::read(offset);
}
@@ -477,7 +473,7 @@ msx_slot_disk4_device::msx_slot_disk4_device(const machine_config &mconfig, cons
}
-WRITE8_MEMBER(msx_slot_disk4_device::write)
+void msx_slot_disk4_device::write(offs_t offset, uint8_t data)
{
switch (offset)
{
@@ -485,15 +481,15 @@ WRITE8_MEMBER(msx_slot_disk4_device::write)
break;
case 0x7ff2: // CR0 : 0 - 0 - MEN1 - MEN0 - 0 - -FRST - 0 - DSA
- m_fdc->dor_w(space, 2, data);
+ m_fdc->dor_w(data);
break;
case 0x7ff3: // CR1 : 0 - 0 - C4E - C4 - SBME - SBM - TCE - FDCTC
- m_fdc->cr1_w(space, 3, data);
+ m_fdc->cr1_w(data);
break;
case 0x7ff5: // Data Register
- m_fdc->fifo_w(space, 5, data);
+ m_fdc->fifo_w(data);
break;
default:
@@ -503,7 +499,7 @@ WRITE8_MEMBER(msx_slot_disk4_device::write)
}
-READ8_MEMBER(msx_slot_disk4_device::read)
+uint8_t msx_slot_disk4_device::read(offs_t offset)
{
switch (offset)
{
@@ -512,12 +508,12 @@ READ8_MEMBER(msx_slot_disk4_device::read)
break;
case 0x7ff4: // Status Register
- return m_fdc->msr_r(space, 4);
+ return m_fdc->msr_r();
case 0x7ff5: // Data Register
- return m_fdc->fifo_r(space, 5);
+ return m_fdc->fifo_r();
}
- return msx_slot_rom_device::read(space, offset);
+ return msx_slot_rom_device::read(offset);
}
@@ -536,12 +532,9 @@ void msx_slot_disk5_device::device_start()
save_item(NAME(m_control));
- machine().save().register_postload(save_prepost_delegate(FUNC(msx_slot_disk5_device::post_load), this));
-
// Install IO read/write handlers
- address_space &space = machine().device<cpu_device>("maincpu")->space(AS_IO);
- space.install_write_handler(0xd0, 0xd4, write8_delegate(FUNC(msx_slot_disk5_device::io_write), this));
- space.install_read_handler(0xd0, 0xd4, read8_delegate(FUNC(msx_slot_disk5_device::io_read), this));
+ io_space().install_write_handler(0xd0, 0xd4, write8sm_delegate(FUNC(msx_slot_disk5_device::io_write), this));
+ io_space().install_read_handler(0xd0, 0xd4, read8sm_delegate(FUNC(msx_slot_disk5_device::io_read), this));
}
@@ -551,7 +544,7 @@ void msx_slot_disk5_device::device_reset()
}
-void msx_slot_disk5_device::post_load()
+void msx_slot_disk5_device::device_post_load()
{
set_control(m_control);
}
@@ -594,7 +587,7 @@ void msx_slot_disk5_device::set_control(uint8_t control)
}
-READ8_MEMBER(msx_slot_disk5_device::io_read)
+uint8_t msx_slot_disk5_device::io_read(offs_t offset)
{
switch (offset)
{
@@ -618,7 +611,7 @@ READ8_MEMBER(msx_slot_disk5_device::io_read)
}
-WRITE8_MEMBER(msx_slot_disk5_device::io_write)
+void msx_slot_disk5_device::io_write(offs_t offset, uint8_t data)
{
switch (offset)
{
@@ -662,8 +655,6 @@ void msx_slot_disk6_device::device_start()
save_item(NAME(m_side_motor));
save_item(NAME(m_drive_select0));
save_item(NAME(m_drive_select1));
-
- machine().save().register_postload(save_prepost_delegate(FUNC(msx_slot_disk6_device::post_load), this));
}
@@ -673,7 +664,7 @@ void msx_slot_disk6_device::device_reset()
}
-void msx_slot_disk6_device::post_load()
+void msx_slot_disk6_device::device_post_load()
{
select_drive();
}
@@ -715,7 +706,7 @@ void msx_slot_disk6_device::set_side_motor()
}
-READ8_MEMBER(msx_slot_disk6_device::read)
+uint8_t msx_slot_disk6_device::read(offs_t offset)
{
switch (offset)
{
@@ -757,11 +748,11 @@ READ8_MEMBER(msx_slot_disk6_device::read)
return 0x3f | (m_fdc->intrq_r() ? 0 : 0x40) | (m_fdc->drq_r() ? 0 : 0x80);
}
- return msx_slot_rom_device::read(space, offset);
+ return msx_slot_rom_device::read(offset);
}
-WRITE8_MEMBER(msx_slot_disk6_device::write)
+void msx_slot_disk6_device::write(offs_t offset, uint8_t data)
{
switch (offset)
{
diff --git a/src/devices/bus/msx_slot/disk.h b/src/devices/bus/msx_slot/disk.h
index 3b949f159e2..184ea2caf66 100644
--- a/src/devices/bus/msx_slot/disk.h
+++ b/src/devices/bus/msx_slot/disk.h
@@ -26,51 +26,6 @@ DECLARE_DEVICE_TYPE(MSX_SLOT_DISK5, msx_slot_disk5_device)
DECLARE_DEVICE_TYPE(MSX_SLOT_DISK6, msx_slot_disk6_device)
-#define MCFG_MSX_SLOT_DISK1_ADD(_tag, _startpage, _numpages, _region, _offset, _fdc_tag, _floppy0_tag, _floppy1_tag) \
- MCFG_MSX_INTERNAL_SLOT_ADD(_tag, MSX_SLOT_DISK1, _startpage, _numpages) \
- downcast<msx_slot_rom_device &>(*device).set_rom_start(_region, _offset); \
- downcast<msx_slot_disk_device &>(*device).set_fdc_tag(_fdc_tag); \
- downcast<msx_slot_disk_device &>(*device).set_floppy0_tag(_floppy0_tag); \
- downcast<msx_slot_disk_device &>(*device).set_floppy1_tag(_floppy1_tag);
-
-#define MCFG_MSX_SLOT_DISK2_ADD(_tag, _startpage, _numpages, _region, _offset, _fdc_tag, _floppy0_tag, _floppy1_tag) \
- MCFG_MSX_INTERNAL_SLOT_ADD(_tag, MSX_SLOT_DISK2, _startpage, _numpages) \
- downcast<msx_slot_rom_device &>(*device).set_rom_start(_region, _offset); \
- downcast<msx_slot_disk_device &>(*device).set_fdc_tag(_fdc_tag); \
- downcast<msx_slot_disk_device &>(*device).set_floppy0_tag(_floppy0_tag); \
- downcast<msx_slot_disk_device &>(*device).set_floppy1_tag(_floppy1_tag);
-
-#define MCFG_MSX_SLOT_DISK3_ADD(_tag, _startpage, _numpages, _region, _offset, _fdc_tag, _floppy0_tag, _floppy1_tag) \
- MCFG_MSX_INTERNAL_SLOT_ADD(_tag, MSX_SLOT_DISK3, _startpage, _numpages) \
- downcast<msx_slot_rom_device &>(*device).set_rom_start(_region, _offset); \
- downcast<msx_slot_disk_device &>(*device).set_fdc_tag(_fdc_tag); \
- downcast<msx_slot_disk_device &>(*device).set_floppy0_tag(_floppy0_tag); \
- downcast<msx_slot_disk_device &>(*device).set_floppy1_tag(_floppy1_tag);
-
-#define MCFG_MSX_SLOT_DISK4_ADD(_tag, _startpage, _numpages, _region, _offset, _fdc_tag, _floppy0_tag, _floppy1_tag) \
- MCFG_MSX_INTERNAL_SLOT_ADD(_tag, MSX_SLOT_DISK4, _startpage, _numpages) \
- downcast<msx_slot_rom_device &>(*device).set_rom_start(_region, _offset); \
- downcast<msx_slot_disk_device &>(*device).set_fdc_tag(_fdc_tag); \
- downcast<msx_slot_disk_device &>(*device).set_floppy0_tag(_floppy0_tag); \
- downcast<msx_slot_disk_device &>(*device).set_floppy1_tag(_floppy1_tag);
-
-#define MCFG_MSX_SLOT_DISK5_ADD(_tag, _startpage, _numpages, _region, _offset, _fdc_tag, _floppy0_tag, _floppy1_tag, _floppy2_tag, _floppy3_tag) \
- MCFG_MSX_INTERNAL_SLOT_ADD(_tag, MSX_SLOT_DISK5, _startpage, _numpages) \
- downcast<msx_slot_rom_device &>(*device).set_rom_start(_region, _offset); \
- downcast<msx_slot_disk_device &>(*device).set_fdc_tag(_fdc_tag); \
- downcast<msx_slot_disk_device &>(*device).set_floppy0_tag(_floppy0_tag); \
- downcast<msx_slot_disk_device &>(*device).set_floppy1_tag(_floppy1_tag); \
- downcast<msx_slot_disk_device &>(*device).set_floppy2_tag(_floppy2_tag); \
- downcast<msx_slot_disk_device &>(*device).set_floppy3_tag(_floppy3_tag);
-
-#define MCFG_MSX_SLOT_DISK6_ADD(_tag, _startpage, _numpages, _region, _offset, _fdc_tag, _floppy0_tag, _floppy1_tag) \
- MCFG_MSX_INTERNAL_SLOT_ADD(_tag, MSX_SLOT_DISK6, _startpage, _numpages) \
- downcast<msx_slot_rom_device &>(*device).set_rom_start(_region, _offset); \
- downcast<msx_slot_disk_device &>(*device).set_fdc_tag(_fdc_tag); \
- downcast<msx_slot_disk_device &>(*device).set_floppy0_tag(_floppy0_tag); \
- downcast<msx_slot_disk_device &>(*device).set_floppy1_tag(_floppy1_tag);
-
-
class msx_slot_disk_device : public msx_slot_rom_device
{
public:
@@ -81,6 +36,21 @@ public:
void set_floppy2_tag(const char *tag) { m_floppy2_tag = tag; }
void set_floppy3_tag(const char *tag) { m_floppy3_tag = tag; }
+ void set_tags(const char *fdc_tag, const char *floppy0_tag, const char *floppy1_tag)
+ {
+ m_fdc_tag = fdc_tag;
+ m_floppy0_tag = floppy0_tag;
+ m_floppy1_tag = floppy1_tag;
+ }
+ void set_tags(const char *fdc_tag, const char *floppy0_tag, const char *floppy1_tag, const char *floppy2_tag, const char *floppy3_tag)
+ {
+ m_fdc_tag = fdc_tag;
+ m_floppy0_tag = floppy0_tag;
+ m_floppy1_tag = floppy1_tag;
+ m_floppy2_tag = floppy2_tag;
+ m_floppy3_tag = floppy3_tag;
+ }
+
protected:
msx_slot_disk_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock);
@@ -128,14 +98,13 @@ class msx_slot_disk1_device : public msx_slot_wd_disk_device
public:
msx_slot_disk1_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- virtual DECLARE_READ8_MEMBER(read) override;
- virtual DECLARE_WRITE8_MEMBER(write) override;
+ virtual uint8_t read(offs_t offset) override;
+ virtual void write(offs_t offset, uint8_t data) override;
protected:
virtual void device_start() override;
virtual void device_reset() override;
-
- void post_load();
+ virtual void device_post_load() override;
private:
uint8_t m_side_control;
@@ -151,14 +120,13 @@ class msx_slot_disk2_device : public msx_slot_wd_disk_device
public:
msx_slot_disk2_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- virtual DECLARE_READ8_MEMBER(read) override;
- virtual DECLARE_WRITE8_MEMBER(write) override;
+ virtual uint8_t read(offs_t offset) override;
+ virtual void write(offs_t offset, uint8_t data) override;
protected:
virtual void device_start() override;
virtual void device_reset() override;
-
- void post_load();
+ virtual void device_post_load() override;
private:
uint8_t m_control;
@@ -172,8 +140,8 @@ class msx_slot_disk3_device : public msx_slot_tc8566_disk_device
public:
msx_slot_disk3_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- virtual DECLARE_READ8_MEMBER(read) override;
- virtual DECLARE_WRITE8_MEMBER(write) override;
+ virtual uint8_t read(offs_t offset) override;
+ virtual void write(offs_t offset, uint8_t data) override;
};
@@ -182,8 +150,8 @@ class msx_slot_disk4_device : public msx_slot_tc8566_disk_device
public:
msx_slot_disk4_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- virtual DECLARE_READ8_MEMBER(read) override;
- virtual DECLARE_WRITE8_MEMBER(write) override;
+ virtual uint8_t read(offs_t offset) override;
+ virtual void write(offs_t offset, uint8_t data) override;
};
@@ -192,16 +160,15 @@ class msx_slot_disk5_device : public msx_slot_wd_disk_device
public:
msx_slot_disk5_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- DECLARE_READ8_MEMBER(io_read);
- DECLARE_WRITE8_MEMBER(io_write);
-
protected:
virtual void device_start() override;
virtual void device_reset() override;
-
- void post_load();
+ virtual void device_post_load() override;
private:
+ uint8_t io_read(offs_t offset);
+ void io_write(offs_t offset, uint8_t data);
+
uint8_t m_control;
void set_control(uint8_t control);
@@ -213,14 +180,13 @@ class msx_slot_disk6_device : public msx_slot_wd_disk_device
public:
msx_slot_disk6_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- virtual DECLARE_READ8_MEMBER(read) override;
- virtual DECLARE_WRITE8_MEMBER(write) override;
+ virtual uint8_t read(offs_t offset) override;
+ virtual void write(offs_t offset, uint8_t data) override;
protected:
virtual void device_start() override;
virtual void device_reset() override;
-
- void post_load();
+ virtual void device_post_load() override;
private:
uint8_t m_side_motor;
diff --git a/src/devices/bus/msx_slot/fs4600.cpp b/src/devices/bus/msx_slot/fs4600.cpp
index dc975cdd4ba..a7470fc2a78 100644
--- a/src/devices/bus/msx_slot/fs4600.cpp
+++ b/src/devices/bus/msx_slot/fs4600.cpp
@@ -13,7 +13,7 @@ DEFINE_DEVICE_TYPE(MSX_SLOT_FS4600, msx_slot_fs4600_device, "msx_slot_fs4600", "
msx_slot_fs4600_device::msx_slot_fs4600_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
: device_t(mconfig, MSX_SLOT_FS4600, tag, owner, clock)
- , msx_internal_slot_interface()
+ , msx_internal_slot_interface(mconfig, *this)
, m_nvram(*this, "nvram")
, m_rom_region(*this, finder_base::DUMMY_TAG)
, m_region_offset(0)
@@ -48,8 +48,12 @@ void msx_slot_fs4600_device::device_start()
save_item(NAME(m_sram_address));
save_item(NAME(m_control));
- machine().save().register_postload(save_prepost_delegate(FUNC(msx_slot_fs4600_device::restore_banks), this));
+ restore_banks();
+}
+
+void msx_slot_fs4600_device::device_post_load()
+{
restore_banks();
}
@@ -63,7 +67,7 @@ void msx_slot_fs4600_device::restore_banks()
}
-READ8_MEMBER(msx_slot_fs4600_device::read)
+uint8_t msx_slot_fs4600_device::read(offs_t offset)
{
if ((m_control & 0x02) && ((offset & 0x3fff) == 0x3ffd))
{
@@ -77,7 +81,7 @@ READ8_MEMBER(msx_slot_fs4600_device::read)
}
-WRITE8_MEMBER(msx_slot_fs4600_device::write)
+void msx_slot_fs4600_device::write(offs_t offset, uint8_t data)
{
if (offset == 0x7ff9)
{
diff --git a/src/devices/bus/msx_slot/fs4600.h b/src/devices/bus/msx_slot/fs4600.h
index c92bd7a3a1f..4b571c2ef56 100644
--- a/src/devices/bus/msx_slot/fs4600.h
+++ b/src/devices/bus/msx_slot/fs4600.h
@@ -12,10 +12,6 @@
DECLARE_DEVICE_TYPE(MSX_SLOT_FS4600, msx_slot_fs4600_device)
-#define MCFG_MSX_SLOT_FS4600_ADD(_tag, _startpage, _numpages, _region, _offset) \
- MCFG_MSX_INTERNAL_SLOT_ADD(_tag, MSX_SLOT_FS4600, _startpage, _numpages) \
- downcast<msx_slot_fs4600_device &>(*device).set_rom_start(_region, _offset);
-
class msx_slot_fs4600_device : public device_t, public msx_internal_slot_interface
{
public:
@@ -24,11 +20,12 @@ public:
// configuration helpers
void set_rom_start(const char *region, uint32_t offset) { m_rom_region.set_tag(region); m_region_offset = offset; }
- virtual DECLARE_READ8_MEMBER(read) override;
- virtual DECLARE_WRITE8_MEMBER(write) override;
+ virtual uint8_t read(offs_t offset) override;
+ virtual void write(offs_t offset, uint8_t data) override;
protected:
virtual void device_start() override;
+ virtual void device_post_load() override;
virtual void device_add_mconfig(machine_config &config) override;
diff --git a/src/devices/bus/msx_slot/music.cpp b/src/devices/bus/msx_slot/music.cpp
index 1e526dab7eb..0e3ae00b0f3 100644
--- a/src/devices/bus/msx_slot/music.cpp
+++ b/src/devices/bus/msx_slot/music.cpp
@@ -32,18 +32,17 @@ void msx_slot_music_device::device_start()
}
// Install IO read/write handlers
- address_space &space = machine().device<cpu_device>("maincpu")->space(AS_IO);
- space.install_write_handler(0x7c, 0x7d, write8_delegate(FUNC(msx_slot_music_device::write_ym2413), this));
+ io_space().install_write_handler(0x7c, 0x7d, write8sm_delegate(FUNC(msx_slot_music_device::write_ym2413), this));
}
-READ8_MEMBER(msx_slot_music_device::read)
+uint8_t msx_slot_music_device::read(offs_t offset)
{
- return msx_slot_rom_device::read(space, offset);
+ return msx_slot_rom_device::read(offset);
}
-WRITE8_MEMBER(msx_slot_music_device::write_ym2413)
+void msx_slot_music_device::write_ym2413(offs_t offset, uint8_t data)
{
- m_ym2413->write(space, offset & 1, data);
+ m_ym2413->write(offset & 1, data);
}
diff --git a/src/devices/bus/msx_slot/music.h b/src/devices/bus/msx_slot/music.h
index ae2ddc979d0..385e568c4e5 100644
--- a/src/devices/bus/msx_slot/music.h
+++ b/src/devices/bus/msx_slot/music.h
@@ -13,11 +13,6 @@
DECLARE_DEVICE_TYPE(MSX_SLOT_MUSIC, msx_slot_music_device)
-#define MCFG_MSX_SLOT_MUSIC_ADD(_tag, _startpage, _numpages, _region, _offset, _ym2413_tag) \
- MCFG_MSX_INTERNAL_SLOT_ADD(_tag, MSX_SLOT_MUSIC, _startpage, _numpages) \
- downcast<msx_slot_rom_device &>(*device).set_rom_start(_region, _offset); \
- downcast<msx_slot_music_device &>(*device).set_ym2413_tag(_ym2413_tag);
-
class msx_slot_music_device : public msx_slot_rom_device
{
public:
@@ -26,14 +21,14 @@ public:
// configuration helpers
void set_ym2413_tag(const char *tag) { m_ym2413_tag = tag; }
- virtual DECLARE_READ8_MEMBER(read) override;
-
- DECLARE_WRITE8_MEMBER(write_ym2413);
+ virtual uint8_t read(offs_t offset) override;
protected:
virtual void device_start() override;
private:
+ void write_ym2413(offs_t offset, uint8_t data);
+
ym2413_device *m_ym2413;
const char *m_ym2413_tag;
};
diff --git a/src/devices/bus/msx_slot/panasonic08.cpp b/src/devices/bus/msx_slot/panasonic08.cpp
index 450f4fce1de..0c46350051e 100644
--- a/src/devices/bus/msx_slot/panasonic08.cpp
+++ b/src/devices/bus/msx_slot/panasonic08.cpp
@@ -18,7 +18,7 @@ DEFINE_DEVICE_TYPE(MSX_SLOT_PANASONIC08, msx_slot_panasonic08_device, "msx_slot_
msx_slot_panasonic08_device::msx_slot_panasonic08_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
: device_t(mconfig, MSX_SLOT_PANASONIC08, tag, owner, clock)
- , msx_internal_slot_interface()
+ , msx_internal_slot_interface(mconfig, *this)
, m_nvram(*this, "nvram")
, m_rom_region(*this, finder_base::DUMMY_TAG)
, m_region_offset(0)
@@ -56,8 +56,12 @@ void msx_slot_panasonic08_device::device_start()
save_item(NAME(m_selected_bank));
save_item(NAME(m_control));
- machine().save().register_postload(save_prepost_delegate(FUNC(msx_slot_panasonic08_device::restore_banks), this));
+ restore_banks();
+}
+
+void msx_slot_panasonic08_device::device_post_load()
+{
restore_banks();
}
@@ -85,7 +89,7 @@ void msx_slot_panasonic08_device::restore_banks()
}
-READ8_MEMBER(msx_slot_panasonic08_device::read)
+uint8_t msx_slot_panasonic08_device::read(offs_t offset)
{
if (m_control & 0x04)
{
@@ -104,7 +108,7 @@ READ8_MEMBER(msx_slot_panasonic08_device::read)
}
-WRITE8_MEMBER(msx_slot_panasonic08_device::write)
+void msx_slot_panasonic08_device::write(offs_t offset, uint8_t data)
{
if ((offset & 0xc000) == 0x8000 || (offset & 0xc000) == 0x0000)
{
diff --git a/src/devices/bus/msx_slot/panasonic08.h b/src/devices/bus/msx_slot/panasonic08.h
index 33da0b6620b..b21a4964e3b 100644
--- a/src/devices/bus/msx_slot/panasonic08.h
+++ b/src/devices/bus/msx_slot/panasonic08.h
@@ -12,10 +12,6 @@
DECLARE_DEVICE_TYPE(MSX_SLOT_PANASONIC08, msx_slot_panasonic08_device)
-#define MCFG_MSX_SLOT_PANASONIC08_ADD(_tag, _startpage, _numpages, _region, _offset) \
- MCFG_MSX_INTERNAL_SLOT_ADD(_tag, MSX_SLOT_PANASONIC08, _startpage, _numpages) \
- downcast<msx_slot_panasonic08_device &>(*device).set_rom_start(_region, _offset);
-
class msx_slot_panasonic08_device : public device_t, public msx_internal_slot_interface
{
public:
@@ -24,11 +20,12 @@ public:
// configuration helpers
void set_rom_start(const char *region, uint32_t offset) { m_rom_region.set_tag(region); m_region_offset = offset; }
- virtual DECLARE_READ8_MEMBER(read) override;
- virtual DECLARE_WRITE8_MEMBER(write) override;
+ virtual uint8_t read(offs_t offset) override;
+ virtual void write(offs_t offset, uint8_t data) override;
protected:
virtual void device_start() override;
+ virtual void device_post_load() override;
virtual void device_add_mconfig(machine_config &config) override;
diff --git a/src/devices/bus/msx_slot/ram.cpp b/src/devices/bus/msx_slot/ram.cpp
index a113dab1d39..835a5551b92 100644
--- a/src/devices/bus/msx_slot/ram.cpp
+++ b/src/devices/bus/msx_slot/ram.cpp
@@ -8,7 +8,7 @@ DEFINE_DEVICE_TYPE(MSX_SLOT_RAM, msx_slot_ram_device, "msx_slot_ram", "MSX Inter
msx_slot_ram_device::msx_slot_ram_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
: device_t(mconfig, MSX_SLOT_RAM, tag, owner, clock)
- , msx_internal_slot_interface()
+ , msx_internal_slot_interface(mconfig, *this)
{
}
@@ -18,7 +18,7 @@ void msx_slot_ram_device::device_start()
save_item(NAME(m_ram));
}
-READ8_MEMBER(msx_slot_ram_device::read)
+uint8_t msx_slot_ram_device::read(offs_t offset)
{
if ( offset >= m_start_address && offset < m_end_address )
{
@@ -27,7 +27,7 @@ READ8_MEMBER(msx_slot_ram_device::read)
return 0xFF;
}
-WRITE8_MEMBER(msx_slot_ram_device::write)
+void msx_slot_ram_device::write(offs_t offset, uint8_t data)
{
if ( offset >= m_start_address && offset < m_end_address )
{
diff --git a/src/devices/bus/msx_slot/ram.h b/src/devices/bus/msx_slot/ram.h
index 17bff978148..f96271ad066 100644
--- a/src/devices/bus/msx_slot/ram.h
+++ b/src/devices/bus/msx_slot/ram.h
@@ -5,23 +5,17 @@
#include "slot.h"
-#define MCFG_MSX_SLOT_RAM_ADD(_tag, _startpage, _numpages) \
- MCFG_MSX_INTERNAL_SLOT_ADD(_tag, MSX_SLOT_RAM, _startpage, _numpages)
-
-#define MCFG_MSX_SLOT_RAM_8KB \
- downcast<msx_slot_ram_device &>(*device).force_start_address(0xe000);
-
-
class msx_slot_ram_device : public device_t,
public msx_internal_slot_interface
{
public:
msx_slot_ram_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+ // Set to 0xe000 for 8KB RAM
void force_start_address(uint16_t start) { m_start_address = start; }
- virtual DECLARE_READ8_MEMBER(read) override;
- virtual DECLARE_WRITE8_MEMBER(write) override;
+ virtual uint8_t read(offs_t offset) override;
+ virtual void write(offs_t offset, uint8_t data) override;
protected:
virtual void device_start() override;
diff --git a/src/devices/bus/msx_slot/ram_mm.cpp b/src/devices/bus/msx_slot/ram_mm.cpp
index 1b765c832f2..ade67f6eb66 100644
--- a/src/devices/bus/msx_slot/ram_mm.cpp
+++ b/src/devices/bus/msx_slot/ram_mm.cpp
@@ -7,7 +7,7 @@ DEFINE_DEVICE_TYPE(MSX_SLOT_RAM_MM, msx_slot_ram_mm_device, "msx_slot_ram_mm", "
msx_slot_ram_mm_device::msx_slot_ram_mm_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
: device_t(mconfig, MSX_SLOT_RAM_MM, tag, owner, clock)
- , msx_internal_slot_interface()
+ , msx_internal_slot_interface(mconfig, *this)
, m_total_size(0)
, m_bank_mask(0)
, m_ramio_set_bits(0)
@@ -40,12 +40,14 @@ void msx_slot_ram_mm_device::device_start()
save_item(NAME(m_ram));
save_item(NAME(m_bank_selected));
- machine().save().register_postload(save_prepost_delegate(FUNC(msx_slot_ram_mm_device::restore_banks), this));
-
// Install IO read/write handlers
- address_space &space = machine().device<cpu_device>("maincpu")->space(AS_IO);
- space.install_read_handler(0xFC, 0xFF, read8_delegate(FUNC(msx_slot_ram_mm_device::read_mapper_bank), this));
- space.install_write_handler(0xFC, 0xFF, write8_delegate(FUNC(msx_slot_ram_mm_device::write_mapper_bank), this));
+ io_space().install_read_handler(0xFC, 0xFF, read8sm_delegate(FUNC(msx_slot_ram_mm_device::read_mapper_bank), this));
+ io_space().install_write_handler(0xFC, 0xFF, write8sm_delegate(FUNC(msx_slot_ram_mm_device::write_mapper_bank), this));
+}
+
+void msx_slot_ram_mm_device::device_post_load()
+{
+ restore_banks();
}
void msx_slot_ram_mm_device::restore_banks()
@@ -56,22 +58,22 @@ void msx_slot_ram_mm_device::restore_banks()
}
}
-READ8_MEMBER(msx_slot_ram_mm_device::read)
+uint8_t msx_slot_ram_mm_device::read(offs_t offset)
{
return m_bank_base[offset >> 14][offset & 0x3fff];
}
-WRITE8_MEMBER(msx_slot_ram_mm_device::write)
+void msx_slot_ram_mm_device::write(offs_t offset, uint8_t data)
{
m_bank_base[offset >> 14][offset & 0x3fff] = data;
}
-READ8_MEMBER(msx_slot_ram_mm_device::read_mapper_bank)
+uint8_t msx_slot_ram_mm_device::read_mapper_bank(offs_t offset)
{
return m_bank_selected[offset & 3] | m_ramio_set_bits;
}
-WRITE8_MEMBER(msx_slot_ram_mm_device::write_mapper_bank)
+void msx_slot_ram_mm_device::write_mapper_bank(offs_t offset, uint8_t data)
{
offset &= 3;
diff --git a/src/devices/bus/msx_slot/ram_mm.h b/src/devices/bus/msx_slot/ram_mm.h
index 87837909b2d..55f13659a4c 100644
--- a/src/devices/bus/msx_slot/ram_mm.h
+++ b/src/devices/bus/msx_slot/ram_mm.h
@@ -5,33 +5,27 @@
#include "slot.h"
-#define MCFG_MSX_SLOT_RAM_MM_ADD(_tag, _total_size) \
- MCFG_MSX_INTERNAL_SLOT_ADD(_tag, MSX_SLOT_RAM_MM, 0, 4) \
- downcast<msx_slot_ram_mm_device &>(*device).set_total_size(_total_size);
-
-#define MCFG_MSX_SLOT_RAMM_SET_RAMIO_BITS(_ramio_set_bits) \
- downcast<msx_slot_ram_mm_device &>(*device).set_ramio_set_bits(_ramio_set_bits);
-
class msx_slot_ram_mm_device : public device_t, public msx_internal_slot_interface
{
public:
msx_slot_ram_mm_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- void set_total_size(uint32_t total_size) { m_total_size = total_size; }
- void set_ramio_set_bits(uint8_t ramio_set_bits) { m_ramio_set_bits = ramio_set_bits; }
+ msx_slot_ram_mm_device &set_total_size(uint32_t total_size) { m_total_size = total_size; return *this; }
+ msx_slot_ram_mm_device &set_ramio_bits(uint8_t ramio_set_bits) { m_ramio_set_bits = ramio_set_bits; return *this; }
- virtual DECLARE_READ8_MEMBER(read) override;
- virtual DECLARE_WRITE8_MEMBER(write) override;
-
- DECLARE_READ8_MEMBER(read_mapper_bank);
- DECLARE_WRITE8_MEMBER(write_mapper_bank);
+ virtual uint8_t read(offs_t offset) override;
+ virtual void write(offs_t offset, uint8_t data) override;
protected:
virtual void device_start() override;
+ virtual void device_post_load() override;
void restore_banks();
private:
+ uint8_t read_mapper_bank(offs_t offset);
+ void write_mapper_bank(offs_t offset, uint8_t data);
+
std::vector<uint8_t> m_ram;
uint32_t m_total_size;
uint8_t m_bank_mask;
diff --git a/src/devices/bus/msx_slot/rom.cpp b/src/devices/bus/msx_slot/rom.cpp
index 186077edb55..aafc37b345b 100644
--- a/src/devices/bus/msx_slot/rom.cpp
+++ b/src/devices/bus/msx_slot/rom.cpp
@@ -15,7 +15,7 @@ msx_slot_rom_device::msx_slot_rom_device(const machine_config &mconfig, const ch
msx_slot_rom_device::msx_slot_rom_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock)
: device_t(mconfig, type, tag, owner, clock)
- , msx_internal_slot_interface()
+ , msx_internal_slot_interface(mconfig, *this)
, m_rom_region(*this, finder_base::DUMMY_TAG)
, m_region_offset(0)
, m_rom(nullptr)
@@ -35,7 +35,7 @@ void msx_slot_rom_device::device_start()
}
-READ8_MEMBER(msx_slot_rom_device::read)
+uint8_t msx_slot_rom_device::read(offs_t offset)
{
if (offset >= m_start_address && offset < m_end_address)
{
diff --git a/src/devices/bus/msx_slot/rom.h b/src/devices/bus/msx_slot/rom.h
index eee554a362a..6bcd480a5a3 100644
--- a/src/devices/bus/msx_slot/rom.h
+++ b/src/devices/bus/msx_slot/rom.h
@@ -7,10 +7,6 @@
#include "slot.h"
-#define MCFG_MSX_SLOT_ROM_ADD(_tag, _startpage, _numpages, _region, _offset) \
- MCFG_MSX_INTERNAL_SLOT_ADD(_tag, MSX_SLOT_ROM, _startpage, _numpages) \
- downcast<msx_slot_rom_device &>(*device).set_rom_start(_region, _offset);
-
class msx_slot_rom_device : public device_t,
public msx_internal_slot_interface
{
@@ -20,7 +16,7 @@ public:
// configuration helpers
void set_rom_start(const char *region, uint32_t offset) { m_rom_region.set_tag(region); m_region_offset = offset; }
- virtual DECLARE_READ8_MEMBER(read) override;
+ virtual uint8_t read(offs_t offset) override;
protected:
msx_slot_rom_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock);
diff --git a/src/devices/bus/msx_slot/slot.cpp b/src/devices/bus/msx_slot/slot.cpp
index 3b826c87fa2..345cf6e0a5c 100644
--- a/src/devices/bus/msx_slot/slot.cpp
+++ b/src/devices/bus/msx_slot/slot.cpp
@@ -13,9 +13,12 @@ pages; and multiple pieces of rom/ram/components can occur in a single slot.
#include "emu.h"
#include "slot.h"
-msx_internal_slot_interface::msx_internal_slot_interface()
- : m_start_address(0)
+msx_internal_slot_interface::msx_internal_slot_interface(const machine_config &mconfig, device_t &device)
+ : m_mem_space(device, finder_base::DUMMY_TAG, -1)
+ , m_io_space(device, finder_base::DUMMY_TAG, -1)
+ , m_start_address(0)
, m_size(0)
, m_end_address(0)
{
+ (void)mconfig;
}
diff --git a/src/devices/bus/msx_slot/slot.h b/src/devices/bus/msx_slot/slot.h
index ad51f0c4f9d..3a95c7b6b75 100644
--- a/src/devices/bus/msx_slot/slot.h
+++ b/src/devices/bus/msx_slot/slot.h
@@ -15,25 +15,29 @@ pages; and multiple pieces of rom/ram/components can occur in a single slot.
#pragma once
-#define MCFG_MSX_INTERNAL_SLOT_ADD(_tag, _type, _startpage, _numpages) \
- MCFG_DEVICE_ADD(_tag, _type, 0) \
- dynamic_cast<msx_internal_slot_interface &>(*device).set_start_address(_startpage * 0x4000); \
- dynamic_cast<msx_internal_slot_interface &>(*device).set_size(_numpages * 0x4000);
-
class msx_internal_slot_interface
{
public:
- msx_internal_slot_interface();
+ msx_internal_slot_interface(const machine_config &mconfig, device_t &device);
+ msx_internal_slot_interface(const msx_internal_slot_interface &device) = delete;
virtual ~msx_internal_slot_interface() { }
// configuration helpers
+ template <typename T> void set_memory_space(T &&tag, int spacenum) { m_mem_space.set_tag(std::forward<T>(tag), spacenum); }
+ template <typename T> void set_io_space(T &&tag, int spacenum) { m_io_space.set_tag(std::forward<T>(tag), spacenum); }
void set_start_address(uint32_t start_address) { m_start_address = start_address; m_end_address = m_start_address + m_size; }
void set_size(uint32_t size) { m_size = size; m_end_address = m_start_address + m_size; }
- virtual DECLARE_READ8_MEMBER(read) { return 0xFF; }
- virtual DECLARE_WRITE8_MEMBER(write) { }
+ virtual uint8_t read(offs_t offset) { return 0xFF; }
+ virtual void write(offs_t offset, uint8_t data) { }
+
+ address_space &memory_space() const { return *m_mem_space; }
+ address_space &io_space() const { return *m_io_space; }
protected:
+ required_address_space m_mem_space;
+ required_address_space m_io_space;
+
uint32_t m_start_address;
uint32_t m_size;
uint32_t m_end_address;
diff --git a/src/devices/bus/msx_slot/sony08.cpp b/src/devices/bus/msx_slot/sony08.cpp
index 96f3f0fdedc..652ed134457 100644
--- a/src/devices/bus/msx_slot/sony08.cpp
+++ b/src/devices/bus/msx_slot/sony08.cpp
@@ -15,7 +15,7 @@ DEFINE_DEVICE_TYPE(MSX_SLOT_SONY08, msx_slot_sony08_device, "msx_slot_sony08", "
msx_slot_sony08_device::msx_slot_sony08_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
: device_t(mconfig, MSX_SLOT_SONY08, tag, owner, clock)
- , msx_internal_slot_interface()
+ , msx_internal_slot_interface(mconfig, *this)
, m_nvram(*this, "nvram")
, m_rom_region(*this, finder_base::DUMMY_TAG)
, m_region_offset(0)
@@ -50,8 +50,12 @@ void msx_slot_sony08_device::device_start()
save_item(NAME(m_selected_bank));
- machine().save().register_postload(save_prepost_delegate(FUNC(msx_slot_sony08_device::restore_banks), this));
+ restore_banks();
+}
+
+void msx_slot_sony08_device::device_post_load()
+{
restore_banks();
}
@@ -96,7 +100,7 @@ void msx_slot_sony08_device::restore_banks()
}
-READ8_MEMBER(msx_slot_sony08_device::read)
+uint8_t msx_slot_sony08_device::read(offs_t offset)
{
if (offset >= 0xc000)
{
@@ -118,7 +122,7 @@ READ8_MEMBER(msx_slot_sony08_device::read)
}
-WRITE8_MEMBER(msx_slot_sony08_device::write)
+void msx_slot_sony08_device::write(offs_t offset, uint8_t data)
{
if (offset < 0x4000)
{
diff --git a/src/devices/bus/msx_slot/sony08.h b/src/devices/bus/msx_slot/sony08.h
index 8dfd0297951..74c8fd95f35 100644
--- a/src/devices/bus/msx_slot/sony08.h
+++ b/src/devices/bus/msx_slot/sony08.h
@@ -12,10 +12,6 @@
DECLARE_DEVICE_TYPE(MSX_SLOT_SONY08, msx_slot_sony08_device)
-#define MCFG_MSX_SLOT_SONY08_ADD(_tag, _startpage, _numpages, _region, _offset) \
- MCFG_MSX_INTERNAL_SLOT_ADD(_tag, MSX_SLOT_SONY08, _startpage, _numpages) \
- downcast<msx_slot_sony08_device &>(*device).set_rom_start(_region, _offset);
-
class msx_slot_sony08_device : public device_t, public msx_internal_slot_interface
{
public:
@@ -24,11 +20,12 @@ public:
// configuration helpers
void set_rom_start(const char *region, uint32_t offset) { m_rom_region.set_tag(region); m_region_offset = offset; }
- virtual DECLARE_READ8_MEMBER(read) override;
- virtual DECLARE_WRITE8_MEMBER(write) override;
+ virtual uint8_t read(offs_t offset) override;
+ virtual void write(offs_t offset, uint8_t data) override;
protected:
virtual void device_start() override;
+ virtual void device_post_load() override;
virtual void device_add_mconfig(machine_config &config) override;
diff --git a/src/devices/bus/mtx/exp.cpp b/src/devices/bus/mtx/exp.cpp
new file mode 100644
index 00000000000..1bfd5068679
--- /dev/null
+++ b/src/devices/bus/mtx/exp.cpp
@@ -0,0 +1,109 @@
+// license:BSD-3-Clause
+// copyright-holders:Nigel Barnes
+/**********************************************************************
+
+ MTX expansion emulation
+
+**********************************************************************/
+
+#include "emu.h"
+#include "exp.h"
+
+
+//**************************************************************************
+// DEVICE DEFINITIONS
+//**************************************************************************
+
+DEFINE_DEVICE_TYPE(MTX_EXP_SLOT, mtx_exp_slot_device, "mtx_exp_slot", "MTX expansion slot")
+
+
+//**************************************************************************
+// DEVICE MTX_BUS PORT INTERFACE
+//**************************************************************************
+
+//-------------------------------------------------
+// device_mtx_exp_interface - constructor
+//-------------------------------------------------
+
+device_mtx_exp_interface::device_mtx_exp_interface(const machine_config &mconfig, device_t &device)
+ : device_slot_card_interface(mconfig, device)
+{
+ m_slot = dynamic_cast<mtx_exp_slot_device *>(device.owner());
+}
+
+
+//**************************************************************************
+// LIVE DEVICE
+//**************************************************************************
+
+//-------------------------------------------------
+// mtx_exp_slot_device - constructor
+//-------------------------------------------------
+
+mtx_exp_slot_device::mtx_exp_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+ : device_t(mconfig, MTX_EXP_SLOT, tag, owner, clock)
+ , device_slot_interface(mconfig, *this)
+ , m_program(*this, finder_base::DUMMY_TAG, -1)
+ , m_io(*this, finder_base::DUMMY_TAG, -1)
+ , m_card(nullptr)
+ , m_busreq_handler(*this)
+ , m_int_handler(*this)
+ , m_nmi_handler(*this)
+{
+}
+
+
+//-------------------------------------------------
+// device_validity_check -
+//-------------------------------------------------
+
+void mtx_exp_slot_device::device_validity_check(validity_checker &valid) const
+{
+ device_t *const carddev = get_card_device();
+ if (carddev && !dynamic_cast<device_mtx_exp_interface *>(carddev))
+ osd_printf_error("Card device %s (%s) does not implement device_mtx_exp_interface\n", carddev->tag(), carddev->name());
+}
+
+
+//-------------------------------------------------
+// device_start - device-specific startup
+//-------------------------------------------------
+
+void mtx_exp_slot_device::device_start()
+{
+ device_t *const carddev = get_card_device();
+ if (carddev && !dynamic_cast<device_mtx_exp_interface *>(carddev))
+ osd_printf_error("Card device %s (%s) does not implement device_mtx_exp_interface\n", carddev->tag(), carddev->name());
+
+ // resolve callbacks
+ m_busreq_handler.resolve_safe();
+ m_int_handler.resolve_safe();
+ m_nmi_handler.resolve_safe();
+}
+
+
+//-------------------------------------------------
+// device_reset - device-specific reset
+//-------------------------------------------------
+
+void mtx_exp_slot_device::device_reset()
+{
+}
+
+
+//-------------------------------------------------
+// SLOT_INTERFACE( mtx_exp_devices )
+//-------------------------------------------------
+
+
+// slot devices
+//#include "fdx.h"
+#include "sdx.h"
+
+
+void mtx_expansion_devices(device_slot_interface &device)
+{
+ //device.option_add("fdx", MTX_FDX); /* FDX Floppy Disc System */
+ device.option_add("sdxbas", MTX_SDXBAS); /* SDX Floppy Disc System (SDX ROM)*/
+ device.option_add("sdxcpm", MTX_SDXCPM); /* SDX Floppy Disc System (CP/M ROM and 80 column card) */
+}
diff --git a/src/devices/bus/mtx/exp.h b/src/devices/bus/mtx/exp.h
new file mode 100644
index 00000000000..d4e05f2f9c9
--- /dev/null
+++ b/src/devices/bus/mtx/exp.h
@@ -0,0 +1,93 @@
+// license:BSD-3-Clause
+// copyright-holders:Nigel Barnes
+/**********************************************************************
+
+ MTX expansion emulation
+
+**********************************************************************/
+
+
+#ifndef MAME_BUS_MTX_EXP_H
+#define MAME_BUS_MTX_EXP_H
+
+#pragma once
+
+
+//**************************************************************************
+// TYPE DEFINITIONS
+//**************************************************************************
+
+// ======================> mtx_exp_slot_device
+
+class device_mtx_exp_interface;
+
+class mtx_exp_slot_device : public device_t, public device_slot_interface
+{
+public:
+ // construction/destruction
+ template <typename T>
+ mtx_exp_slot_device(machine_config const &mconfig, char const *tag, device_t *owner, T &&slot_options, const char *default_option)
+ : mtx_exp_slot_device(mconfig, tag, owner)
+ {
+ option_reset();
+ slot_options(*this);
+ set_default_option(default_option);
+ set_fixed(false);
+ }
+
+ mtx_exp_slot_device(machine_config const &mconfig, char const *tag, device_t *owner, uint32_t clock = 0);
+
+ template <typename T> void set_program_space(T &&tag, int spacenum) { m_program.set_tag(std::forward<T>(tag), spacenum); }
+ template <typename T> void set_io_space(T &&tag, int spacenum) { m_io.set_tag(std::forward<T>(tag), spacenum); }
+
+ // callbacks
+ auto busreq_handler() { return m_busreq_handler.bind(); }
+ auto int_handler() { return m_int_handler.bind(); }
+ auto nmi_handler() { return m_nmi_handler.bind(); }
+
+ DECLARE_WRITE_LINE_MEMBER( busreq_w ) { m_busreq_handler(state); }
+ DECLARE_WRITE_LINE_MEMBER( int_w ) { m_int_handler(state); }
+ DECLARE_WRITE_LINE_MEMBER( nmi_w ) { m_nmi_handler(state); }
+
+ // address spaces we are attached to
+ required_address_space m_program;
+ required_address_space m_io;
+
+protected:
+ // device-level overrides
+ virtual void device_validity_check(validity_checker &valid) const override;
+ virtual void device_start() override;
+ virtual void device_reset() override;
+
+ device_mtx_exp_interface *m_card;
+
+private:
+ devcb_write_line m_busreq_handler;
+ devcb_write_line m_int_handler;
+ devcb_write_line m_nmi_handler;
+};
+
+
+// ======================> device_mtx_exp_interface
+
+class device_mtx_exp_interface : public device_slot_card_interface
+{
+public:
+ // construction/destruction
+ device_mtx_exp_interface(const machine_config &mconfig, device_t &device);
+
+protected:
+ address_space &program_space() { return *m_slot->m_program; }
+ address_space &io_space() { return *m_slot->m_io; }
+
+ mtx_exp_slot_device *m_slot;
+};
+
+
+// device type definition
+DECLARE_DEVICE_TYPE(MTX_EXP_SLOT, mtx_exp_slot_device)
+
+void mtx_expansion_devices(device_slot_interface &device);
+
+
+#endif // MAME_BUS_MTX_EXP_H
diff --git a/src/devices/bus/mtx/sdx.cpp b/src/devices/bus/mtx/sdx.cpp
new file mode 100644
index 00000000000..44687e09f08
--- /dev/null
+++ b/src/devices/bus/mtx/sdx.cpp
@@ -0,0 +1,425 @@
+// license:BSD-3-Clause
+// copyright-holders:Nigel Barnes
+/**********************************************************************
+
+ MTX SDX Controller
+
+**********************************************************************/
+
+
+#include "emu.h"
+#include "sdx.h"
+
+
+//**************************************************************************
+// DEVICE DEFINITIONS
+//**************************************************************************
+
+DEFINE_DEVICE_TYPE(MTX_SDXBAS, mtx_sdxbas_device, "mtx_sdxbas", "MTX SDX Controller (BASIC)")
+DEFINE_DEVICE_TYPE(MTX_SDXCPM, mtx_sdxcpm_device, "mtx_sdxcpm", "MTX SDX Controller (CP/M)")
+
+
+//-------------------------------------------------
+// SLOT_INTERFACE( sdx_floppies )
+//-------------------------------------------------
+
+static void sdx_floppies(device_slot_interface &device)
+{
+ device.option_add("35dd", FLOPPY_35_DD);
+ device.option_add("525qd", FLOPPY_525_QD);
+}
+
+FLOPPY_FORMATS_MEMBER(mtx_sdx_device::floppy_formats)
+ FLOPPY_MTX_FORMAT
+FLOPPY_FORMATS_END
+
+//-------------------------------------------------
+// ROM( sdx )
+//-------------------------------------------------
+
+ROM_START( sdxbas )
+ ROM_REGION(0x2000, "sdx_rom", ROMREGION_ERASE00)
+ ROM_DEFAULT_BIOS("sdx07")
+ ROM_SYSTEM_BIOS(0, "sdx07", "Type 07")
+ ROMX_LOAD("sdxbas07.rom", 0x0000, 0x2000, CRC(db88b245) SHA1(05c89db8e39ec3165b4620432f48e1d59abe10dd), ROM_BIOS(0))
+ ROM_SYSTEM_BIOS(1, "sdx03", "Type 03")
+ ROMX_LOAD("sdxbas03.rom", 0x0000, 0x2000, CRC(2fc46a46) SHA1(f08e6a8cffbb3ca39633be6e9958bec85d1e5981), ROM_BIOS(1))
+ROM_END
+
+ROM_START( sdxcpm )
+ ROM_REGION(0x2000, "sdx_rom", ROMREGION_ERASE00)
+ ROM_DEFAULT_BIOS("sdx07")
+ ROM_SYSTEM_BIOS(0, "sdx07", "SDX07 CP/M")
+ ROMX_LOAD("sdxcpm07.rom", 0x0000, 0x2000, CRC(622a04ea) SHA1(c633ce1054b45afda53116e0c6e272a1ae6a2155), ROM_BIOS(0))
+
+ ROM_REGION(0x2000, "chargen", 0)
+ ROM_LOAD("80z_7a.bin", 0x0000, 0x1000, CRC(ea6fe865) SHA1(f84883f79bed34501e5828336894fad929bddbb5)) // alpha
+ ROM_LOAD("80z_9a.bin", 0x1000, 0x1000, NO_DUMP) // graphic
+ROM_END
+
+//-------------------------------------------------
+// INPUT_PORTS( sdx )
+//-------------------------------------------------
+
+INPUT_PORTS_START( sdx )
+ PORT_START("DSW0")
+ PORT_DIPNAME(0x01, 0x00, "Drive A: Head-load solenoid present") PORT_DIPLOCATION("SW1:1")
+ PORT_DIPSETTING(0x00, DEF_STR(Yes))
+ PORT_DIPSETTING(0x01, DEF_STR(No))
+ PORT_DIPNAME(0x02, 0x00, "Drive A: Double-sided drive") PORT_DIPLOCATION("SW1:2")
+ PORT_DIPSETTING(0x00, DEF_STR(Yes))
+ PORT_DIPSETTING(0x02, DEF_STR(No))
+ PORT_DIPNAME(0x04, 0x00, "Drive A: 96 TPI drive") PORT_DIPLOCATION("SW1:3")
+ PORT_DIPSETTING(0x00, DEF_STR(Yes))
+ PORT_DIPSETTING(0x04, DEF_STR(No))
+ PORT_DIPNAME(0x08, 0x00, "Drive A: Stepping rate") PORT_DIPLOCATION("SW1:4")
+ PORT_DIPSETTING(0x00, "Stepping rate 6ms")
+ PORT_DIPSETTING(0x08, "Stepping rate 12ms")
+
+ PORT_START("DSW1")
+ PORT_DIPNAME(0x01, 0x00, "Drive B: Head-load solenoid present") PORT_DIPLOCATION("SW2:1")
+ PORT_DIPSETTING(0x00, DEF_STR(Yes))
+ PORT_DIPSETTING(0x01, DEF_STR(No))
+ PORT_DIPNAME(0x02, 0x00, "Drive B: Double-sided drive") PORT_DIPLOCATION("SW2:2")
+ PORT_DIPSETTING(0x00, DEF_STR(Yes))
+ PORT_DIPSETTING(0x02, DEF_STR(No))
+ PORT_DIPNAME(0x04, 0x00, "Drive B: 96 TPI drive") PORT_DIPLOCATION("SW2:3")
+ PORT_DIPSETTING(0x00, DEF_STR(Yes))
+ PORT_DIPSETTING(0x04, DEF_STR(No))
+ PORT_DIPNAME(0x08, 0x00, "Drive B: Stepping rate") PORT_DIPLOCATION("SW2:4")
+ PORT_DIPSETTING(0x00, "Stepping rate 6ms")
+ PORT_DIPSETTING(0x08, "Stepping rate 12ms")
+INPUT_PORTS_END
+
+//-------------------------------------------------
+// input_ports - device-specific input ports
+//-------------------------------------------------
+
+ioport_constructor mtx_sdx_device::device_input_ports() const
+{
+ return INPUT_PORTS_NAME(sdx);
+}
+
+//-------------------------------------------------
+// gfx_layout mtx_sdx_charlayout
+//-------------------------------------------------
+
+static const gfx_layout mtx_sdx_charlayout =
+{
+ 8, 10, /* 8 x 10 characters */
+ 256, /* 256 characters */
+ 1, /* 1 bits per pixel */
+ { 0 }, /* no bitplanes */
+ /* x offsets */
+ { 0, 1, 2, 3, 4, 5, 6, 7 },
+ /* y offsets */
+ { 0 * 8, 1 * 8, 2 * 8, 3 * 8, 4 * 8, 5 * 8, 6 * 8, 7 * 8, 8 * 8, 9 * 8 },
+ 8 * 16 /* every char takes 16 bytes */
+};
+
+//-------------------------------------------------
+// GFXDECODE( gfx_mtx_sdx )
+//-------------------------------------------------
+
+static GFXDECODE_START(gfx_mtx_sdx)
+ GFXDECODE_ENTRY("chargen", 0, mtx_sdx_charlayout, 0, 8)
+GFXDECODE_END
+
+//-------------------------------------------------
+// device_add_mconfig - add device configuration
+//-------------------------------------------------
+
+void mtx_sdxbas_device::device_add_mconfig(machine_config &config)
+{
+ /* fdc */
+ MB8877(config, m_fdc, 8_MHz_XTAL / 8);
+ m_fdc->hld_wr_callback().set(FUNC(mtx_sdx_device::motor_w));
+
+ FLOPPY_CONNECTOR(config, "fdc:0", sdx_floppies, "525qd", mtx_sdx_device::floppy_formats).enable_sound(true);
+ FLOPPY_CONNECTOR(config, "fdc:1", sdx_floppies, "525qd", mtx_sdx_device::floppy_formats).enable_sound(true);
+}
+
+void mtx_sdxcpm_device::device_add_mconfig(machine_config &config)
+{
+ /* fdc */
+ MB8877(config, m_fdc, 8_MHz_XTAL / 8);
+ m_fdc->hld_wr_callback().set(FUNC(mtx_sdx_device::motor_w));
+
+ FLOPPY_CONNECTOR(config, "fdc:0", sdx_floppies, "525qd", mtx_sdx_device::floppy_formats).enable_sound(true);
+ FLOPPY_CONNECTOR(config, "fdc:1", sdx_floppies, "525qd", mtx_sdx_device::floppy_formats).enable_sound(true);
+
+ /* 80 column video card - required to be installed in MTX internally */
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */
+ m_screen->set_refresh_hz(50);
+ m_screen->set_size(960, 313);
+ m_screen->set_visarea(00, 640 - 1, 0, 240 - 1);
+ m_screen->set_screen_update("crtc", FUNC(hd6845_device::screen_update));
+
+ GFXDECODE(config, "gfxdecode", "palette", gfx_mtx_sdx);
+ PALETTE(config, "palette", palette_device::RGB_3BIT);
+
+ HD6845(config, m_crtc, 15_MHz_XTAL / 8);
+ m_crtc->set_screen("screen");
+ m_crtc->set_show_border_area(false);
+ m_crtc->set_char_width(8);
+ m_crtc->set_update_row_callback(FUNC(mtx_sdxcpm_device::crtc_update_row), this);
+}
+
+
+const tiny_rom_entry *mtx_sdxbas_device::device_rom_region() const
+{
+ return ROM_NAME( sdxbas );
+}
+
+const tiny_rom_entry *mtx_sdxcpm_device::device_rom_region() const
+{
+ return ROM_NAME( sdxcpm );
+}
+
+//**************************************************************************
+// LIVE DEVICE
+//**************************************************************************
+
+//-------------------------------------------------
+// mtx_sdx_device - constructor
+//-------------------------------------------------
+
+mtx_sdx_device::mtx_sdx_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock)
+ : device_t(mconfig, type, tag, owner, clock)
+ , device_mtx_exp_interface(mconfig, *this)
+ , m_sdx_rom(*this, "sdx_rom")
+ , m_fdc(*this, "fdc")
+ , m_floppy0(*this, "fdc:0")
+ , m_floppy1(*this, "fdc:1")
+ , m_dsw(*this, "DSW%u", 0)
+{
+}
+
+mtx_sdxbas_device::mtx_sdxbas_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+ : mtx_sdx_device(mconfig, MTX_SDXBAS, tag, owner, clock)
+{
+}
+
+mtx_sdxcpm_device::mtx_sdxcpm_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+ : mtx_sdx_device(mconfig, MTX_SDXCPM, tag, owner, clock)
+ , m_screen(*this, "screen")
+ , m_palette(*this, "palette")
+ , m_crtc(*this, "crtc")
+ , m_char_rom(*this, "chargen")
+{
+}
+
+//-------------------------------------------------
+// device_start - device-specific startup
+//-------------------------------------------------
+
+void mtx_sdxbas_device::device_start()
+{
+ save_item(NAME(m_control));
+}
+
+void mtx_sdxcpm_device::device_start()
+{
+ save_item(NAME(m_control));
+ save_item(NAME(m_80col_ascii));
+ save_item(NAME(m_80col_attr));
+ save_item(NAME(m_80col_addr));
+ save_item(NAME(m_80col_char_ram));
+ save_item(NAME(m_80col_attr_ram));
+}
+
+
+//-------------------------------------------------
+// device_reset - device-specific reset
+//-------------------------------------------------
+
+void mtx_sdxbas_device::device_reset()
+{
+ machine().root_device().membank("rommap_bank1")->configure_entry(3, m_sdx_rom->base());
+
+ /* SDX FDC */
+ io_space().install_readwrite_handler(0x10, 0x13, read8sm_delegate(FUNC(mb8877_device::read), m_fdc.target()), write8sm_delegate(FUNC(mb8877_device::write), m_fdc.target()));
+ io_space().install_readwrite_handler(0x14, 0x14, read8_delegate(FUNC(mtx_sdx_device::sdx_status_r), this), write8_delegate(FUNC(mtx_sdx_device::sdx_control_w), this));
+}
+
+void mtx_sdxcpm_device::device_reset()
+{
+ machine().root_device().membank("rommap_bank1")->configure_entry(3, m_sdx_rom->base());
+
+ /* SDX FDC */
+ io_space().install_readwrite_handler(0x10, 0x13, read8sm_delegate(FUNC(mb8877_device::read), m_fdc.target()), write8sm_delegate(FUNC(mb8877_device::write), m_fdc.target()));
+ io_space().install_readwrite_handler(0x14, 0x14, read8_delegate(FUNC(mtx_sdx_device::sdx_status_r), this), write8_delegate(FUNC(mtx_sdx_device::sdx_control_w), this));
+
+ /* 80 column */
+ io_space().install_readwrite_handler(0x30, 0x33, read8_delegate(FUNC(mtx_sdxcpm_device::mtx_80col_r), this), write8_delegate(FUNC(mtx_sdxcpm_device::mtx_80col_w), this));
+ io_space().install_readwrite_handler(0x38, 0x38, read8smo_delegate(FUNC(mc6845_device::status_r), m_crtc.target()), write8smo_delegate(FUNC(mc6845_device::address_w), m_crtc.target()));
+ io_space().install_readwrite_handler(0x39, 0x39, read8smo_delegate(FUNC(mc6845_device::register_r), m_crtc.target()), write8smo_delegate(FUNC(mc6845_device::register_w), m_crtc.target()));
+
+ memset(m_80col_char_ram, 0, sizeof(m_80col_char_ram));
+ memset(m_80col_attr_ram, 0, sizeof(m_80col_attr_ram));
+}
+
+
+//**************************************************************************
+// IMPLEMENTATION
+//**************************************************************************
+
+READ8_MEMBER(mtx_sdx_device::sdx_status_r)
+{
+ /*
+ bit description
+ 0 Head load: 1 - head load on drive
+ 1 Double-sided: 1 if drive double-sided
+ 2 TPI: 0 - 48 TPI drive. 1 - 96 TPI drive
+ 3 Track stepping rate: 0 - 12ms, 1 - 6ms
+ 4 No. of drives: 0 - 1 drive, 1 - 2 drives
+ 5 Ready: 1 - drive ready
+ 6 Interrupt: 1 - FDC interrupt request
+ 7 Data request: 1 - FDC data request
+ */
+
+ uint8_t data = 0x00;
+
+ data |= m_dsw[BIT(m_control, 0)].read_safe(0x0f) & 0x0f;
+
+ data |= (m_floppy0->get_device() && m_floppy1->get_device()) ? 0x10 : 0x00;
+
+ if (m_floppy)
+ data |= m_floppy->ready_r() ? 0x00 : 0x20;
+
+ data |= m_fdc->intrq_r() ? 0x40 : 0x00;
+ data |= m_fdc->drq_r() ? 0x80 : 0x00;
+
+ return data;
+}
+
+WRITE8_MEMBER(mtx_sdx_device::sdx_control_w)
+{
+ /*
+ bit description
+ 0 Drive select: 0 - drive A, 1 - drive B
+ 1 Side select: 0 - side 0, 1 - side 1
+ 2 Motor on: 1 - turns drive motor on
+ 3 Motor ready: 1 - drive motor ready
+ 4 Density: 0 - FM, 1 - MFM
+ */
+
+ m_control = data;
+
+ /* bit 0: drive select */
+ m_floppy = BIT(data, 0) ? m_floppy1->get_device() : m_floppy0->get_device();
+
+ m_fdc->set_floppy(m_floppy);
+
+ if (m_floppy)
+ {
+ /* bit 1: side select */
+ m_floppy->ss_w(BIT(data, 1));
+ logerror("motor on %d\n", BIT(data, 2));
+ /* bit 2: motor on */
+ m_floppy->mon_w(!(BIT(data, 2) || m_fdc->hld_r()));
+ logerror("head load %d\n", m_fdc->hld_r());
+ /* bit 3: motor ready */
+ //if (BIT(data, 3))
+ //m_floppy->mon_w(!BIT(data, 2));
+ //m_floppy->mon_w(!BIT(data, 3));
+ logerror("motor ready %d\n", BIT(data, 3));
+ }
+
+ /* bit 4: density */
+ m_fdc->dden_w(!BIT(data, 4));
+}
+
+WRITE_LINE_MEMBER(mtx_sdx_device::motor_w)
+{
+ if (m_floppy0->get_device()) m_floppy0->get_device()->mon_w(0);
+ if (m_floppy1->get_device()) m_floppy1->get_device()->mon_w(0);
+}
+
+//-------------------------------------------------
+// 80 column video board
+//-------------------------------------------------
+
+READ8_MEMBER(mtx_sdxcpm_device::mtx_80col_r)
+{
+ uint8_t data = 0xff;
+
+ switch (offset)
+ {
+ case 0:
+ /* ring the bell */
+ break;
+ case 2:
+ if (!BIT(m_80col_addr, 15))
+ data = m_80col_char_ram[m_80col_addr & 0x07ff];
+ break;
+ case 3:
+ if (!BIT(m_80col_addr, 15))
+ data = m_80col_attr_ram[m_80col_addr & 0x07ff];
+ break;
+ }
+ return data;
+}
+
+WRITE8_MEMBER(mtx_sdxcpm_device::mtx_80col_w)
+{
+ switch (offset)
+ {
+ case 0:
+ m_80col_addr = (m_80col_addr & 0xff00) | data;
+ /* write to ram */
+ if (BIT(m_80col_addr, 15))
+ {
+ /* write enable ascii ram */
+ if (BIT(m_80col_addr, 14))
+ m_80col_char_ram[m_80col_addr & 0x07ff] = m_80col_ascii;
+
+ /* write enable attribute ram */
+ if (BIT(m_80col_addr, 13))
+ m_80col_attr_ram[m_80col_addr & 0x07ff] = m_80col_attr;
+ }
+ break;
+ case 1:
+ m_80col_addr = (data << 8) | (m_80col_addr & 0x00ff);
+ break;
+ case 2:
+ m_80col_ascii = data;
+ break;
+ case 3:
+ m_80col_attr = data;
+ break;
+ }
+}
+
+MC6845_UPDATE_ROW(mtx_sdxcpm_device::crtc_update_row)
+{
+ const pen_t *pen = m_palette->pens();
+
+ for (int column = 0; column < x_count; column++)
+ {
+ uint8_t code = m_80col_char_ram[(ma + column) & 0x7ff];
+ uint8_t attr = m_80col_attr_ram[(ma + column) & 0x7ff];
+ offs_t addr = (code << 4) | (ra & 0x0f);
+ uint8_t data = m_char_rom->base()[addr];
+
+ if (column == cursor_x)
+ {
+ data = 0xff;
+ attr = 0x07;
+ }
+
+ for (int bit = 0; bit < 8; bit++)
+ {
+ int x = (column * 8) + bit;
+ int fg = attr & 0x07;
+ int bg = attr & 0x38;
+
+ int color = BIT(data, 7) ? fg : bg;
+
+ bitmap.pix32(y, x) = pen[de ? color : 0];
+
+ data <<= 1;
+ }
+ }
+}
diff --git a/src/devices/bus/mtx/sdx.h b/src/devices/bus/mtx/sdx.h
new file mode 100644
index 00000000000..dff83358dd4
--- /dev/null
+++ b/src/devices/bus/mtx/sdx.h
@@ -0,0 +1,105 @@
+// license:BSD-3-Clause
+// copyright-holders:Nigel Barnes
+/**********************************************************************
+
+ MTX SDX Controller
+
+**********************************************************************/
+
+
+#ifndef MAME_BUS_MTX_EXP_SDX_H
+#define MAME_BUS_MTX_EXP_SDX_H
+
+#include "exp.h"
+#include "imagedev/floppy.h"
+#include "machine/wd_fdc.h"
+#include "video/mc6845.h"
+#include "formats/mtx_dsk.h"
+#include "emupal.h"
+#include "screen.h"
+
+//**************************************************************************
+// TYPE DEFINITIONS
+//**************************************************************************
+
+class mtx_sdx_device :
+ public device_t,
+ public device_mtx_exp_interface
+{
+public:
+ DECLARE_FLOPPY_FORMATS(floppy_formats);
+
+ // optional information overrides
+ virtual ioport_constructor device_input_ports() const override;
+
+ DECLARE_READ8_MEMBER(sdx_status_r);
+ DECLARE_WRITE8_MEMBER(sdx_control_w);
+ DECLARE_WRITE_LINE_MEMBER(motor_w);
+
+protected:
+ // construction/destruction
+ mtx_sdx_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock);
+
+ required_memory_region m_sdx_rom;
+ required_device<mb8877_device> m_fdc;
+ required_device<floppy_connector> m_floppy0;
+ required_device<floppy_connector> m_floppy1;
+ required_ioport_array<2> m_dsw;
+ floppy_image_device *m_floppy;
+ uint8_t m_control;
+};
+
+class mtx_sdxbas_device : public mtx_sdx_device
+{
+public:
+ // construction/destruction
+ mtx_sdxbas_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+
+protected:
+ // optional information overrides
+ virtual void device_add_mconfig(machine_config &config) override;
+ virtual const tiny_rom_entry *device_rom_region() const override;
+
+ // device-level overrides
+ virtual void device_start() override;
+ virtual void device_reset() override;
+};
+
+class mtx_sdxcpm_device : public mtx_sdx_device
+{
+public:
+ // construction/destruction
+ mtx_sdxcpm_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+
+protected:
+ // optional information overrides
+ virtual void device_add_mconfig(machine_config &config) override;
+ virtual const tiny_rom_entry *device_rom_region() const override;
+
+ // device-level overrides
+ virtual void device_start() override;
+ virtual void device_reset() override;
+
+private:
+ DECLARE_READ8_MEMBER(mtx_80col_r);
+ DECLARE_WRITE8_MEMBER(mtx_80col_w);
+ MC6845_UPDATE_ROW(crtc_update_row);
+
+ required_device<screen_device> m_screen;
+ required_device<palette_device> m_palette;
+ required_device<mc6845_device> m_crtc;
+ required_memory_region m_char_rom;
+ uint8_t m_80col_char_ram[0x800];
+ uint8_t m_80col_attr_ram[0x800];
+ uint8_t m_80col_ascii, m_80col_attr;
+ uint16_t m_80col_addr;
+};
+
+
+
+// device type definition
+DECLARE_DEVICE_TYPE(MTX_SDXBAS, mtx_sdxbas_device)
+DECLARE_DEVICE_TYPE(MTX_SDXCPM, mtx_sdxcpm_device)
+
+
+#endif // MAME_BUS_MTX_EXP_SDX_H
diff --git a/src/devices/bus/nasbus/avc.cpp b/src/devices/bus/nasbus/avc.cpp
index a0a71da3666..4aacc354567 100644
--- a/src/devices/bus/nasbus/avc.cpp
+++ b/src/devices/bus/nasbus/avc.cpp
@@ -22,10 +22,11 @@ DEFINE_DEVICE_TYPE(NASCOM_AVC, nascom_avc_device, "nascom_avc", "Nascom Advanced
// device_add_mconfig - add device configuration
//-------------------------------------------------
-MACHINE_CONFIG_START(nascom_avc_device::device_add_mconfig)
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_RAW_PARAMS(16250000, 1024, 0, 768, 320, 0, 256)
- MCFG_SCREEN_UPDATE_DEVICE("mc6845", mc6845_device, screen_update)
+void nascom_avc_device::device_add_mconfig(machine_config &config)
+{
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_raw(16250000, 1024, 0, 768, 320, 0, 256);
+ screen.set_screen_update("mc6845", FUNC(mc6845_device::screen_update));
PALETTE(config, m_palette, palette_device::RGB_3BIT);
@@ -34,7 +35,7 @@ MACHINE_CONFIG_START(nascom_avc_device::device_add_mconfig)
m_crtc->set_show_border_area(false);
m_crtc->set_char_width(6);
m_crtc->set_update_row_callback(FUNC(nascom_avc_device::crtc_update_row), this);
-MACHINE_CONFIG_END
+}
//**************************************************************************
@@ -77,8 +78,8 @@ void nascom_avc_device::device_start()
void nascom_avc_device::device_reset()
{
- io_space().install_write_handler(0xb0, 0xb0, write8_delegate(FUNC(mc6845_device::address_w), m_crtc.target()));
- io_space().install_readwrite_handler(0xb1, 0xb1, read8_delegate(FUNC(mc6845_device::register_r), m_crtc.target()), write8_delegate(FUNC(mc6845_device::register_w), m_crtc.target()));
+ io_space().install_write_handler(0xb0, 0xb0, write8smo_delegate(FUNC(mc6845_device::address_w), m_crtc.target()));
+ io_space().install_readwrite_handler(0xb1, 0xb1, read8smo_delegate(FUNC(mc6845_device::register_r), m_crtc.target()), write8smo_delegate(FUNC(mc6845_device::register_w), m_crtc.target()));
io_space().install_write_handler(0xb2, 0xb2, write8_delegate(FUNC(nascom_avc_device::control_w), this));
}
diff --git a/src/devices/bus/nasbus/nasbus.cpp b/src/devices/bus/nasbus/nasbus.cpp
index 585b1043c07..ed6cf27bc7a 100644
--- a/src/devices/bus/nasbus/nasbus.cpp
+++ b/src/devices/bus/nasbus/nasbus.cpp
@@ -22,15 +22,14 @@ DEFINE_DEVICE_TYPE(NASBUS_SLOT, nasbus_slot_device, "nasbus_slot", "NASBUS Slot"
// nasbus_slot_device - constructor
//-------------------------------------------------
-nasbus_slot_device::nasbus_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) :
- nasbus_slot_device(mconfig, NASBUS_SLOT, tag, owner, clock)
+nasbus_slot_device::nasbus_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+ : nasbus_slot_device(mconfig, NASBUS_SLOT, tag, owner, clock)
{
}
-nasbus_slot_device::nasbus_slot_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock) :
- device_t(mconfig, type, tag, owner, clock),
- device_slot_interface(mconfig, *this),
- m_nasbus_tag(nullptr)
+nasbus_slot_device::nasbus_slot_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock)
+ : device_t(mconfig, type, tag, owner, clock)
+ , device_slot_interface(mconfig, *this)
{
}
@@ -44,7 +43,7 @@ void nasbus_slot_device::device_start()
if (dev)
{
- nasbus_device *m_nasbus = downcast<nasbus_device *>(m_owner->subdevice(m_nasbus_tag));
+ nasbus_device *m_nasbus = downcast<nasbus_device *>(owner()->subdevice(NASBUS_TAG));
m_nasbus->add_card(dev);
}
}
@@ -62,8 +61,8 @@ DEFINE_DEVICE_TYPE(NASBUS, nasbus_device, "nasbus", "NASBUS Backplane")
nasbus_device::nasbus_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) :
device_t(mconfig, NASBUS, tag, owner, clock),
- m_program(nullptr),
- m_io(nullptr),
+ m_program(*this, finder_base::DUMMY_TAG, -1),
+ m_io(*this, finder_base::DUMMY_TAG, -1),
m_ram_disable_handler(*this)
{
}
@@ -105,24 +104,6 @@ void nasbus_device::add_card(device_nasbus_card_interface *card)
m_dev.append(*card);
}
-//-------------------------------------------------
-// set_program_space - set address space we are attached to
-//-------------------------------------------------
-
-void nasbus_device::set_program_space(address_space *program)
-{
- m_program = program;
-}
-
-//-------------------------------------------------
-// set_io_space - set address space we are attached to
-//-------------------------------------------------
-
-void nasbus_device::set_io_space(address_space *io)
-{
- m_io = io;
-}
-
// callbacks from slot device to the host
WRITE_LINE_MEMBER( nasbus_device::ram_disable_w ) { m_ram_disable_handler(state); }
diff --git a/src/devices/bus/nasbus/nasbus.h b/src/devices/bus/nasbus/nasbus.h
index 8a0a1d3775f..c2c11e2db9a 100644
--- a/src/devices/bus/nasbus/nasbus.h
+++ b/src/devices/bus/nasbus/nasbus.h
@@ -102,22 +102,6 @@
//**************************************************************************
-// INTERFACE CONFIGURATION MACROS
-//**************************************************************************
-
-#define MCFG_NASBUS_ADD(_tag) \
- MCFG_DEVICE_ADD(_tag, NASBUS, 0)
-
-#define MCFG_NASBUS_SLOT_ADD(_tag, _slot_intf, _def_slot) \
- MCFG_DEVICE_ADD(_tag, NASBUS_SLOT, 0) \
- MCFG_DEVICE_SLOT_INTERFACE(_slot_intf, _def_slot, false) \
- downcast<nasbus_slot_device &>(*device).set_nasbus_slot(this, NASBUS_TAG);
-
-#define MCFG_NASBUS_RAM_DISABLE_HANDLER(_devcb) \
- downcast<nasbus_device &>(*device).set_ram_disable_handler(DEVCB_##_devcb);
-
-
-//**************************************************************************
// TYPE DEFINITIONS
//**************************************************************************
@@ -130,18 +114,22 @@ class nasbus_slot_device : public device_t, public device_slot_interface
{
public:
// construction/destruction
+ template <typename T>
+ nasbus_slot_device(machine_config const &mconfig, char const *tag, device_t *owner, T &&opts, char const *dflt)
+ : nasbus_slot_device(mconfig, tag, owner, (uint32_t)0)
+ {
+ option_reset();
+ opts(*this);
+ set_default_option(dflt);
+ set_fixed(false);
+ }
nasbus_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- // inline configuration
- void set_nasbus_slot(device_t *owner, const char *nasbus_tag) { m_owner = owner; m_nasbus_tag = nasbus_tag; }
protected:
nasbus_slot_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock);
// device-level overrides
virtual void device_start() override;
-
- // configuration
- const char *m_nasbus_tag;
};
// device type definition
@@ -154,15 +142,15 @@ class nasbus_device : public device_t
friend class device_nasbus_card_interface;
public:
// construction/destruction
- nasbus_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+ nasbus_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock = 0);
virtual ~nasbus_device();
- template <class Object> devcb_base &set_ram_disable_handler(Object &&cb) { return m_ram_disable_handler.set_callback(std::forward<Object>(cb)); }
+ auto ram_disable() { return m_ram_disable_handler.bind(); }
void add_card(device_nasbus_card_interface *card);
- void set_program_space(address_space *program);
- void set_io_space(address_space *io);
+ template <typename T> void set_program_space(T &&tag, int spacenum) { m_program.set_tag(std::forward<T>(tag), spacenum); }
+ template <typename T> void set_io_space(T &&tag, int spacenum) { m_io.set_tag(std::forward<T>(tag), spacenum); }
// from cards
DECLARE_WRITE_LINE_MEMBER( ram_disable_w );
@@ -173,8 +161,8 @@ protected:
virtual void device_reset() override;
private:
- address_space *m_program;
- address_space *m_io;
+ required_address_space m_program;
+ required_address_space m_io;
simple_list<device_nasbus_card_interface> m_dev;
diff --git a/src/devices/bus/neogeo/boot_cthd.cpp b/src/devices/bus/neogeo/boot_cthd.cpp
index 2f6659fddbe..70c4d891ad5 100644
--- a/src/devices/bus/neogeo/boot_cthd.cpp
+++ b/src/devices/bus/neogeo/boot_cthd.cpp
@@ -48,9 +48,10 @@ void neogeo_cthd2k3_cart_device::device_reset()
mapper specific handlers
-------------------------------------------------*/
-MACHINE_CONFIG_START(neogeo_cthd2k3_cart_device::device_add_mconfig)
- MCFG_CTHD_PROT_ADD("cthd_prot")
-MACHINE_CONFIG_END
+void neogeo_cthd2k3_cart_device::device_add_mconfig(machine_config &config)
+{
+ NG_CTHD_PROT(config, m_prot);
+}
/*************************************************
@@ -122,8 +123,9 @@ void neogeo_matrimbl_cart_device::decrypt_all(DECRYPT_ALL_PARAMS)
}
- MACHINE_CONFIG_START(neogeo_matrimbl_cart_device::device_add_mconfig)
- MCFG_KOF2002_PROT_ADD("kof2k2_prot")
- MCFG_CMC_PROT_ADD("cmc_prot")
- MCFG_CTHD_PROT_ADD("cthd_prot")
-MACHINE_CONFIG_END
+void neogeo_matrimbl_cart_device::device_add_mconfig(machine_config &config)
+{
+ NG_KOF2002_PROT(config, m_kof2k2_prot);
+ NG_CMC_PROT(config, m_cmc_prot);
+ NG_CTHD_PROT(config, m_prot);
+}
diff --git a/src/devices/bus/neogeo/boot_kof10th.cpp b/src/devices/bus/neogeo/boot_kof10th.cpp
index 1fa9aeb1d84..d1dd9c925f5 100644
--- a/src/devices/bus/neogeo/boot_kof10th.cpp
+++ b/src/devices/bus/neogeo/boot_kof10th.cpp
@@ -48,9 +48,10 @@ void neogeo_kof10th_cart_device::device_reset()
mapper specific handlers
-------------------------------------------------*/
-MACHINE_CONFIG_START(neogeo_kof10th_cart_device::device_add_mconfig)
- MCFG_NEOBOOT_PROT_ADD("bootleg_prot")
-MACHINE_CONFIG_END
+void neogeo_kof10th_cart_device::device_add_mconfig(machine_config &config)
+{
+ NEOBOOT_PROT(config, m_prot);
+}
void neogeo_kof10th_cart_device::decrypt_all(DECRYPT_ALL_PARAMS)
diff --git a/src/devices/bus/neogeo/boot_kof2k2.cpp b/src/devices/bus/neogeo/boot_kof2k2.cpp
index 611ff47a382..8bbf3ab0962 100644
--- a/src/devices/bus/neogeo/boot_kof2k2.cpp
+++ b/src/devices/bus/neogeo/boot_kof2k2.cpp
@@ -12,24 +12,27 @@
#include "boot_kof2k2.h"
-MACHINE_CONFIG_START(neogeo_kof2002b_cart_device::device_add_mconfig)
- MCFG_NEOBOOT_PROT_ADD("bootleg_prot")
- MCFG_CMC_PROT_ADD("cmc_prot")
- MCFG_PCM2_PROT_ADD("pcm2_prot")
- MCFG_KOF2002_PROT_ADD("kof2k2_prot")
-MACHINE_CONFIG_END
-
-MACHINE_CONFIG_START(neogeo_kf2k2mp_cart_device::device_add_mconfig)
- MCFG_NEOBOOT_PROT_ADD("bootleg_prot")
- MCFG_CMC_PROT_ADD("cmc_prot")
- MCFG_PCM2_PROT_ADD("pcm2_prot")
-MACHINE_CONFIG_END
-
-MACHINE_CONFIG_START(neogeo_kf2k2mp2_cart_device::device_add_mconfig)
- MCFG_NEOBOOT_PROT_ADD("bootleg_prot")
- MCFG_CMC_PROT_ADD("cmc_prot")
- MCFG_PCM2_PROT_ADD("pcm2_prot")
-MACHINE_CONFIG_END
+void neogeo_kof2002b_cart_device::device_add_mconfig(machine_config &config)
+{
+ NEOBOOT_PROT(config, m_prot);
+ NG_CMC_PROT(config, m_cmc_prot);
+ NG_PCM2_PROT(config, m_pcm2_prot);
+ NG_KOF2002_PROT(config, m_kof2k2_prot);
+}
+
+void neogeo_kf2k2mp_cart_device::device_add_mconfig(machine_config &config)
+{
+ NEOBOOT_PROT(config, m_prot);
+ NG_CMC_PROT(config, m_cmc_prot);
+ NG_PCM2_PROT(config, m_pcm2_prot);
+}
+
+void neogeo_kf2k2mp2_cart_device::device_add_mconfig(machine_config &config)
+{
+ NEOBOOT_PROT(config, m_prot);
+ NG_CMC_PROT(config, m_cmc_prot);
+ NG_PCM2_PROT(config, m_pcm2_prot);
+}
/*************************************************
kof2002b
diff --git a/src/devices/bus/neogeo/boot_kof2k3.cpp b/src/devices/bus/neogeo/boot_kof2k3.cpp
index 2c0f4f375a3..172a0ad56db 100644
--- a/src/devices/bus/neogeo/boot_kof2k3.cpp
+++ b/src/devices/bus/neogeo/boot_kof2k3.cpp
@@ -12,26 +12,29 @@
#include "boot_kof2k3.h"
-MACHINE_CONFIG_START(neogeo_kf2k3bl_cart_device::device_add_mconfig)
- MCFG_NEOBOOT_PROT_ADD("bootleg_prot")
- MCFG_CMC_PROT_ADD("cmc_prot")
- MCFG_PCM2_PROT_ADD("pcm2_prot")
- MCFG_KOF2K3BL_PROT_ADD("kof2k3bl_prot")
-MACHINE_CONFIG_END
-
-MACHINE_CONFIG_START(neogeo_kf2k3pl_cart_device::device_add_mconfig)
- MCFG_NEOBOOT_PROT_ADD("bootleg_prot")
- MCFG_CMC_PROT_ADD("cmc_prot")
- MCFG_PCM2_PROT_ADD("pcm2_prot")
- MCFG_KOF2K3BL_PROT_ADD("kof2k3bl_prot")
-MACHINE_CONFIG_END
-
-MACHINE_CONFIG_START(neogeo_kf2k3upl_cart_device::device_add_mconfig)
- MCFG_NEOBOOT_PROT_ADD("bootleg_prot")
- MCFG_CMC_PROT_ADD("cmc_prot")
- MCFG_PCM2_PROT_ADD("pcm2_prot")
- MCFG_KOF2K3BL_PROT_ADD("kof2k3bl_prot")
-MACHINE_CONFIG_END
+void neogeo_kf2k3bl_cart_device::device_add_mconfig(machine_config &config)
+{
+ NEOBOOT_PROT(config, m_prot);
+ NG_CMC_PROT(config, m_cmc_prot);
+ NG_PCM2_PROT(config, m_pcm2_prot);
+ NG_KOF2K3BL_PROT(config, m_kof2k3bl_prot);
+}
+
+void neogeo_kf2k3pl_cart_device::device_add_mconfig(machine_config &config)
+{
+ NEOBOOT_PROT(config, m_prot);
+ NG_CMC_PROT(config, m_cmc_prot);
+ NG_PCM2_PROT(config, m_pcm2_prot);
+ NG_KOF2K3BL_PROT(config, m_kof2k3bl_prot);
+}
+
+void neogeo_kf2k3upl_cart_device::device_add_mconfig(machine_config &config)
+{
+ NEOBOOT_PROT(config, m_prot);
+ NG_CMC_PROT(config, m_cmc_prot);
+ NG_PCM2_PROT(config, m_pcm2_prot);
+ NG_KOF2K3BL_PROT(config, m_kof2k3bl_prot);
+}
/*************************************************
kf2k3bl
diff --git a/src/devices/bus/neogeo/boot_misc.cpp b/src/devices/bus/neogeo/boot_misc.cpp
index f22a0236ebf..b544fa93976 100644
--- a/src/devices/bus/neogeo/boot_misc.cpp
+++ b/src/devices/bus/neogeo/boot_misc.cpp
@@ -48,9 +48,10 @@ void neogeo_bootleg_cart_device::device_reset()
mapper specific handlers
-------------------------------------------------*/
-MACHINE_CONFIG_START(neogeo_bootleg_cart_device::device_add_mconfig)
- MCFG_NEOBOOT_PROT_ADD("bootleg_prot")
-MACHINE_CONFIG_END
+void neogeo_bootleg_cart_device::device_add_mconfig(machine_config &config)
+{
+ NEOBOOT_PROT(config, m_prot);
+}
/*************************************************
@@ -207,10 +208,11 @@ void neogeo_mslug3b6_cart_device::decrypt_all(DECRYPT_ALL_PARAMS)
m_cmc_prot->cmc42_gfx_decrypt(spr_region, spr_region_size, MSLUG3_GFX_KEY);
}
-MACHINE_CONFIG_START(neogeo_mslug3b6_cart_device::device_add_mconfig)
- MCFG_CMC_PROT_ADD("cmc_prot")
- MCFG_NEOBOOT_PROT_ADD("bootleg_prot")
-MACHINE_CONFIG_END
+void neogeo_mslug3b6_cart_device::device_add_mconfig(machine_config &config)
+{
+ NG_CMC_PROT(config, m_cmc_prot);
+ NEOBOOT_PROT(config, m_prot);
+}
/*************************************************
@@ -234,11 +236,12 @@ void neogeo_ms5plus_cart_device::decrypt_all(DECRYPT_ALL_PARAMS)
m_prot->sx_decrypt(fix_region, fix_region_size, 1);
}
-MACHINE_CONFIG_START(neogeo_ms5plus_cart_device::device_add_mconfig)
- MCFG_NEOBOOT_PROT_ADD("bootleg_prot")
- MCFG_CMC_PROT_ADD("cmc_prot")
- MCFG_PCM2_PROT_ADD("pcm2_prot")
-MACHINE_CONFIG_END
+void neogeo_ms5plus_cart_device::device_add_mconfig(machine_config &config)
+{
+ NEOBOOT_PROT(config, m_prot);
+ NG_CMC_PROT(config, m_cmc_prot);
+ NG_PCM2_PROT(config, m_pcm2_prot);
+}
/*************************************************
diff --git a/src/devices/bus/neogeo/boot_svc.cpp b/src/devices/bus/neogeo/boot_svc.cpp
index dac4a8aedad..aac306be5ce 100644
--- a/src/devices/bus/neogeo/boot_svc.cpp
+++ b/src/devices/bus/neogeo/boot_svc.cpp
@@ -30,10 +30,11 @@ void neogeo_svcboot_cart_device::decrypt_all(DECRYPT_ALL_PARAMS)
m_prot->svcboot_cx_decrypt(spr_region, spr_region_size);
}
-MACHINE_CONFIG_START(neogeo_svcboot_cart_device::device_add_mconfig)
- MCFG_NEOBOOT_PROT_ADD("bootleg_prot")
- MCFG_PVC_PROT_ADD("pvc_prot")
-MACHINE_CONFIG_END
+void neogeo_svcboot_cart_device::device_add_mconfig(machine_config &config)
+{
+ NEOBOOT_PROT(config, m_prot);
+ NG_PVC_PROT(config, m_pvc_prot);
+}
/*************************************************
@@ -96,7 +97,8 @@ void neogeo_svcsplus_cart_device::decrypt_all(DECRYPT_ALL_PARAMS)
}
-MACHINE_CONFIG_START(neogeo_svcsplus_cart_device::device_add_mconfig)
- MCFG_NEOBOOT_PROT_ADD("bootleg_prot")
- MCFG_PVC_PROT_ADD("pvc_prot")
-MACHINE_CONFIG_END
+void neogeo_svcsplus_cart_device::device_add_mconfig(machine_config &config)
+{
+ NEOBOOT_PROT(config, m_prot);
+ NG_PVC_PROT(config, m_pvc_prot);
+}
diff --git a/src/devices/bus/neogeo/cmc.cpp b/src/devices/bus/neogeo/cmc.cpp
index 841244c478e..d1fb1b699f8 100644
--- a/src/devices/bus/neogeo/cmc.cpp
+++ b/src/devices/bus/neogeo/cmc.cpp
@@ -44,9 +44,10 @@ void neogeo_cmc_cart_device::device_reset()
}
-MACHINE_CONFIG_START(neogeo_cmc_cart_device::device_add_mconfig)
- MCFG_CMC_PROT_ADD("cmc_prot")
-MACHINE_CONFIG_END
+void neogeo_cmc_cart_device::device_add_mconfig(machine_config &config)
+{
+ NG_CMC_PROT(config, m_prot);
+}
/*************************************************
@@ -251,19 +252,23 @@ void neogeo_cmc_kof2000n_cart_device::decrypt_all(DECRYPT_ALL_PARAMS)
DEFINE_DEVICE_TYPE(NEOGEO_CMC_JOCKEYGP_CART, neogeo_cmc_jockeygp_cart_device, "neocart_jockeygp", "Neo Geo Jockey GP CMC50 Cart")
neogeo_cmc_jockeygp_cart_device::neogeo_cmc_jockeygp_cart_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) :
- neogeo_cmc_cart_device(mconfig, NEOGEO_CMC_JOCKEYGP_CART, tag, owner, clock)
+ neogeo_cmc_cart_device(mconfig, NEOGEO_CMC_JOCKEYGP_CART, tag, owner, clock),
+ m_nvram(*this, "nvram")
{
}
void neogeo_cmc_jockeygp_cart_device::device_start()
{
- save_item(NAME(m_ram));
+ m_ram = make_unique_clear<uint16_t[]>(0x2000/2);
+ m_nvram->set_base(m_ram.get(), 0x2000);
+ save_pointer(NAME(m_ram), 0x2000/2);
}
-void neogeo_cmc_jockeygp_cart_device::device_reset()
+void neogeo_cmc_jockeygp_cart_device::device_add_mconfig(machine_config &config)
{
- memset(m_ram, 0, 0x2000);
+ neogeo_cmc_cart_device::device_add_mconfig(config);
+ NVRAM(config, m_nvram);
}
void neogeo_cmc_jockeygp_cart_device::decrypt_all(DECRYPT_ALL_PARAMS)
diff --git a/src/devices/bus/neogeo/cmc.h b/src/devices/bus/neogeo/cmc.h
index 88b1c27cd9f..bba8251d2e5 100644
--- a/src/devices/bus/neogeo/cmc.h
+++ b/src/devices/bus/neogeo/cmc.h
@@ -8,6 +8,7 @@
#include "slot.h"
#include "rom.h"
#include "prot_cmc.h"
+#include "machine/nvram.h"
// ======================> neogeo_cmc_cart_device
@@ -218,10 +219,13 @@ public:
protected:
virtual void device_start() override;
- virtual void device_reset() override;
+
+ virtual void device_add_mconfig(machine_config &config) override;
private:
- uint16_t m_ram[0x1000];
+ std::unique_ptr<uint16_t[]> m_ram;
+
+ required_device<nvram_device> m_nvram;
};
DECLARE_DEVICE_TYPE(NEOGEO_CMC_JOCKEYGP_CART, neogeo_cmc_jockeygp_cart_device)
diff --git a/src/devices/bus/neogeo/fatfury2.cpp b/src/devices/bus/neogeo/fatfury2.cpp
index b3c9dea575e..66fcfdc98a1 100644
--- a/src/devices/bus/neogeo/fatfury2.cpp
+++ b/src/devices/bus/neogeo/fatfury2.cpp
@@ -43,6 +43,7 @@ void neogeo_fatfury2_cart_device::device_reset()
mapper specific handlers
-------------------------------------------------*/
-MACHINE_CONFIG_START(neogeo_fatfury2_cart_device::device_add_mconfig)
- MCFG_FATFURY2_PROT_ADD("fatfury2_prot")
-MACHINE_CONFIG_END
+void neogeo_fatfury2_cart_device::device_add_mconfig(machine_config &config)
+{
+ NG_FATFURY2_PROT(config, m_prot);
+}
diff --git a/src/devices/bus/neogeo/kof2k2.cpp b/src/devices/bus/neogeo/kof2k2.cpp
index e313c93034a..8ff5f040d3a 100644
--- a/src/devices/bus/neogeo/kof2k2.cpp
+++ b/src/devices/bus/neogeo/kof2k2.cpp
@@ -3,7 +3,7 @@
/***********************************************************************************************************
Neo Geo cart emulation
- The King of Fighers 2002 cart type (CMC + PCM2 + Additional CPU encryption)
+ The King of Fighters 2002 cart type (CMC + PCM2 + Additional CPU encryption)
***********************************************************************************************************/
@@ -50,11 +50,12 @@ void neogeo_kof2k2type_cart_device::device_reset()
mapper specific handlers
-------------------------------------------------*/
-MACHINE_CONFIG_START(neogeo_kof2k2type_cart_device::device_add_mconfig)
- MCFG_CMC_PROT_ADD("cmc_prot")
- MCFG_PCM2_PROT_ADD("pcm2_prot")
- MCFG_KOF2002_PROT_ADD("kof2002_prot")
-MACHINE_CONFIG_END
+void neogeo_kof2k2type_cart_device::device_add_mconfig(machine_config &config)
+{
+ NG_CMC_PROT(config, m_cmc_prot);
+ NG_PCM2_PROT(config, m_pcm2_prot);
+ NG_KOF2002_PROT(config, m_kof2k2_prot);
+}
/*************************************************
diff --git a/src/devices/bus/neogeo/kof98.cpp b/src/devices/bus/neogeo/kof98.cpp
index bc53a930bac..52f6b5fe523 100644
--- a/src/devices/bus/neogeo/kof98.cpp
+++ b/src/devices/bus/neogeo/kof98.cpp
@@ -43,9 +43,10 @@ void neogeo_kof98_cart_device::device_reset()
mapper specific handlers
-------------------------------------------------*/
-MACHINE_CONFIG_START(neogeo_kof98_cart_device::device_add_mconfig)
- MCFG_KOF98_PROT_ADD("kof98_prot")
-MACHINE_CONFIG_END
+void neogeo_kof98_cart_device::device_add_mconfig(machine_config &config)
+{
+ NG_KOF98_PROT(config, m_prot);
+}
void neogeo_kof98_cart_device::decrypt_all(DECRYPT_ALL_PARAMS)
{
diff --git a/src/devices/bus/neogeo/mslugx.cpp b/src/devices/bus/neogeo/mslugx.cpp
index 521f5636a1b..2917841cac3 100644
--- a/src/devices/bus/neogeo/mslugx.cpp
+++ b/src/devices/bus/neogeo/mslugx.cpp
@@ -43,6 +43,7 @@ void neogeo_mslugx_cart_device::device_reset()
mapper specific handlers
-------------------------------------------------*/
-MACHINE_CONFIG_START(neogeo_mslugx_cart_device::device_add_mconfig)
- MCFG_MSLUGX_PROT_ADD("mslugx_prot")
-MACHINE_CONFIG_END
+void neogeo_mslugx_cart_device::device_add_mconfig(machine_config &config)
+{
+ NG_MSLUGX_PROT(config, m_prot);
+}
diff --git a/src/devices/bus/neogeo/pcm2.cpp b/src/devices/bus/neogeo/pcm2.cpp
index e098d796229..521c796d59a 100644
--- a/src/devices/bus/neogeo/pcm2.cpp
+++ b/src/devices/bus/neogeo/pcm2.cpp
@@ -49,10 +49,11 @@ void neogeo_pcm2_cart_device::device_reset()
mapper specific handlers
-------------------------------------------------*/
-MACHINE_CONFIG_START(neogeo_pcm2_cart_device::device_add_mconfig)
- MCFG_CMC_PROT_ADD("cmc_prot")
- MCFG_PCM2_PROT_ADD("pcm2_prot")
-MACHINE_CONFIG_END
+void neogeo_pcm2_cart_device::device_add_mconfig(machine_config &config)
+{
+ NG_CMC_PROT(config, m_cmc_prot);
+ NG_PCM2_PROT(config, m_pcm2_prot);
+}
/*************************************************
diff --git a/src/devices/bus/neogeo/prot_cmc.h b/src/devices/bus/neogeo/prot_cmc.h
index 46a6a6c6766..2853c71aa8f 100644
--- a/src/devices/bus/neogeo/prot_cmc.h
+++ b/src/devices/bus/neogeo/prot_cmc.h
@@ -9,9 +9,6 @@
DECLARE_DEVICE_TYPE(NG_CMC_PROT, cmc_prot_device)
-#define MCFG_CMC_PROT_ADD(_tag) \
- MCFG_DEVICE_ADD(_tag, NG_CMC_PROT, 0)
-
// cmc42
#define KOF99_GFX_KEY (0x00)
#define GAROU_GFX_KEY (0x06)
@@ -44,7 +41,7 @@ class cmc_prot_device : public device_t
{
public:
// construction/destruction
- cmc_prot_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+ cmc_prot_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock = 0);
void decrypt(uint8_t *r0, uint8_t *r1,
uint8_t c0, uint8_t c1,
diff --git a/src/devices/bus/neogeo/prot_cthd.h b/src/devices/bus/neogeo/prot_cthd.h
index 455674a56c8..95ae38289b3 100644
--- a/src/devices/bus/neogeo/prot_cthd.h
+++ b/src/devices/bus/neogeo/prot_cthd.h
@@ -8,15 +8,11 @@
DECLARE_DEVICE_TYPE(NG_CTHD_PROT, cthd_prot_device)
-#define MCFG_CTHD_PROT_ADD(_tag) \
- MCFG_DEVICE_ADD(_tag, NG_CTHD_PROT, 0)
-
-
class cthd_prot_device : public device_t
{
public:
// construction/destruction
- cthd_prot_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+ cthd_prot_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock = 0);
void fix_do(uint8_t* sprrom, uint32_t sprrom_size, int start, int end, int bit3shift, int bit2shift, int bit1shift, int bit0shift);
void gfx_address_fix(uint8_t* sprrom, uint32_t sprrom_size, int start, int end);
diff --git a/src/devices/bus/neogeo/prot_fatfury2.h b/src/devices/bus/neogeo/prot_fatfury2.h
index 8c75e7f5d46..bb33d1c10c1 100644
--- a/src/devices/bus/neogeo/prot_fatfury2.h
+++ b/src/devices/bus/neogeo/prot_fatfury2.h
@@ -8,15 +8,12 @@
DECLARE_DEVICE_TYPE(NG_FATFURY2_PROT, fatfury2_prot_device)
-#define MCFG_FATFURY2_PROT_ADD(_tag) \
- MCFG_DEVICE_ADD(_tag, NG_FATFURY2_PROT, 0)
-
class fatfury2_prot_device : public device_t
{
public:
// construction/destruction
- fatfury2_prot_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+ fatfury2_prot_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock = 0);
DECLARE_READ16_MEMBER( protection_r );
DECLARE_WRITE16_MEMBER( protection_w );
diff --git a/src/devices/bus/neogeo/prot_kof2k2.h b/src/devices/bus/neogeo/prot_kof2k2.h
index 4eb764f006d..324da5a8918 100644
--- a/src/devices/bus/neogeo/prot_kof2k2.h
+++ b/src/devices/bus/neogeo/prot_kof2k2.h
@@ -9,15 +9,12 @@
DECLARE_DEVICE_TYPE(NG_KOF2002_PROT, kof2002_prot_device)
-#define MCFG_KOF2002_PROT_ADD(_tag) \
- MCFG_DEVICE_ADD(_tag, NG_KOF2002_PROT, 0)
-
class kof2002_prot_device : public device_t
{
public:
// construction/destruction
- kof2002_prot_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+ kof2002_prot_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock = 0);
void kof2002_decrypt_68k(uint8_t* cpurom, uint32_t cpurom_size);
void matrim_decrypt_68k(uint8_t* cpurom, uint32_t cpurom_size);
diff --git a/src/devices/bus/neogeo/prot_kof2k3bl.h b/src/devices/bus/neogeo/prot_kof2k3bl.h
index 8520bd90716..52d87e87bfe 100644
--- a/src/devices/bus/neogeo/prot_kof2k3bl.h
+++ b/src/devices/bus/neogeo/prot_kof2k3bl.h
@@ -8,15 +8,12 @@
DECLARE_DEVICE_TYPE(NG_KOF2K3BL_PROT, kof2k3bl_prot_device)
-#define MCFG_KOF2K3BL_PROT_ADD(_tag) \
- MCFG_DEVICE_ADD(_tag, NG_KOF2K3BL_PROT, 0)
-
class kof2k3bl_prot_device : public device_t
{
public:
// construction/destruction
- kof2k3bl_prot_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+ kof2k3bl_prot_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock = 0);
DECLARE_READ16_MEMBER(protection_r);
DECLARE_WRITE16_MEMBER(kof2003_w);
diff --git a/src/devices/bus/neogeo/prot_kof98.h b/src/devices/bus/neogeo/prot_kof98.h
index ff0783e29ad..652e098898a 100644
--- a/src/devices/bus/neogeo/prot_kof98.h
+++ b/src/devices/bus/neogeo/prot_kof98.h
@@ -9,15 +9,12 @@
DECLARE_DEVICE_TYPE(NG_KOF98_PROT, kof98_prot_device)
-#define MCFG_KOF98_PROT_ADD(_tag) \
- MCFG_DEVICE_ADD(_tag, NG_KOF98_PROT, 0)
-
class kof98_prot_device : public device_t
{
public:
// construction/destruction
- kof98_prot_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+ kof98_prot_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock = 0);
void decrypt_68k(uint8_t* cpurom, uint32_t cpurom_size);
DECLARE_WRITE16_MEMBER(protection_w);
diff --git a/src/devices/bus/neogeo/prot_misc.h b/src/devices/bus/neogeo/prot_misc.h
index f2b0c1f06d6..e1525fc44f6 100644
--- a/src/devices/bus/neogeo/prot_misc.h
+++ b/src/devices/bus/neogeo/prot_misc.h
@@ -8,15 +8,12 @@
DECLARE_DEVICE_TYPE(NEOBOOT_PROT, neoboot_prot_device)
-#define MCFG_NEOBOOT_PROT_ADD(_tag) \
- MCFG_DEVICE_ADD(_tag, NEOBOOT_PROT, 0)
-
class neoboot_prot_device : public device_t
{
public:
// construction/destruction
- neoboot_prot_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+ neoboot_prot_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock = 0);
void cx_decrypt(uint8_t* sprrom, uint32_t sprrom_size);
void sx_decrypt(uint8_t* fixed, uint32_t fixed_size, int value);
diff --git a/src/devices/bus/neogeo/prot_mslugx.h b/src/devices/bus/neogeo/prot_mslugx.h
index 91ab71e463d..106bce3ad84 100644
--- a/src/devices/bus/neogeo/prot_mslugx.h
+++ b/src/devices/bus/neogeo/prot_mslugx.h
@@ -9,15 +9,12 @@
DECLARE_DEVICE_TYPE(NG_MSLUGX_PROT, mslugx_prot_device)
-#define MCFG_MSLUGX_PROT_ADD(_tag) \
- MCFG_DEVICE_ADD(_tag, NG_MSLUGX_PROT, 0)
-
class mslugx_prot_device : public device_t
{
public:
// construction/destruction
- mslugx_prot_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+ mslugx_prot_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock = 0);
DECLARE_WRITE16_MEMBER( protection_w );
DECLARE_READ16_MEMBER( protection_r );
diff --git a/src/devices/bus/neogeo/prot_pcm2.h b/src/devices/bus/neogeo/prot_pcm2.h
index 666b38b4bee..707e9ab94b4 100644
--- a/src/devices/bus/neogeo/prot_pcm2.h
+++ b/src/devices/bus/neogeo/prot_pcm2.h
@@ -9,15 +9,12 @@
DECLARE_DEVICE_TYPE(NG_PCM2_PROT, pcm2_prot_device)
-#define MCFG_PCM2_PROT_ADD(_tag) \
- MCFG_DEVICE_ADD(_tag, NG_PCM2_PROT, 0)
-
class pcm2_prot_device : public device_t
{
public:
// construction/destruction
- pcm2_prot_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+ pcm2_prot_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock = 0);
void decrypt(uint8_t* ymrom, uint32_t ymsize, int value);
void swap(uint8_t* ymrom, uint32_t ymsize, int value);
diff --git a/src/devices/bus/neogeo/prot_pvc.h b/src/devices/bus/neogeo/prot_pvc.h
index 4f7d73f4020..d2855808331 100644
--- a/src/devices/bus/neogeo/prot_pvc.h
+++ b/src/devices/bus/neogeo/prot_pvc.h
@@ -8,15 +8,12 @@
DECLARE_DEVICE_TYPE(NG_PVC_PROT, pvc_prot_device)
-#define MCFG_PVC_PROT_ADD(_tag) \
- MCFG_DEVICE_ADD(_tag, NG_PVC_PROT, 0)
-
class pvc_prot_device : public device_t
{
public:
// construction/destruction
- pvc_prot_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+ pvc_prot_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock = 0);
void pvc_write_unpack_color();
void pvc_write_pack_color();
diff --git a/src/devices/bus/neogeo/prot_sma.h b/src/devices/bus/neogeo/prot_sma.h
index f0ee9733bd0..c36af941132 100644
--- a/src/devices/bus/neogeo/prot_sma.h
+++ b/src/devices/bus/neogeo/prot_sma.h
@@ -9,15 +9,12 @@
DECLARE_DEVICE_TYPE(NG_SMA_PROT, sma_prot_device)
-#define MCFG_SMA_PROT_ADD(_tag) \
- MCFG_DEVICE_ADD(_tag, NG_SMA_PROT, 0)
-
class sma_prot_device : public device_t
{
public:
// construction/destruction
- sma_prot_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+ sma_prot_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock = 0);
//DECLARE_WRITE16_MEMBER( kof99_bankswitch_w );
//DECLARE_WRITE16_MEMBER( garou_bankswitch_w );
diff --git a/src/devices/bus/neogeo/pvc.cpp b/src/devices/bus/neogeo/pvc.cpp
index bb9d0098159..26987ab33dc 100644
--- a/src/devices/bus/neogeo/pvc.cpp
+++ b/src/devices/bus/neogeo/pvc.cpp
@@ -50,11 +50,12 @@ void neogeo_pvc_cart_device::device_reset()
mapper specific handlers
-------------------------------------------------*/
-MACHINE_CONFIG_START(neogeo_pvc_cart_device::device_add_mconfig)
- MCFG_CMC_PROT_ADD("cmc_prot")
- MCFG_PCM2_PROT_ADD("pcm2_prot")
- MCFG_PVC_PROT_ADD("pvc_prot")
-MACHINE_CONFIG_END
+void neogeo_pvc_cart_device::device_add_mconfig(machine_config &config)
+{
+ NG_CMC_PROT(config, m_cmc_prot);
+ NG_PCM2_PROT(config, m_pcm2_prot);
+ NG_PVC_PROT(config, m_pvc_prot);
+}
/*************************************************
diff --git a/src/devices/bus/neogeo/rom.cpp b/src/devices/bus/neogeo/rom.cpp
index 10c61858386..0f54a808cef 100644
--- a/src/devices/bus/neogeo/rom.cpp
+++ b/src/devices/bus/neogeo/rom.cpp
@@ -73,17 +73,19 @@ WRITE16_MEMBER(neogeo_rom_device::banksel_w)
DEFINE_DEVICE_TYPE(NEOGEO_VLINER_CART, neogeo_vliner_cart_device, "neocart_vliner", "Neo Geo V-Liner Cart")
neogeo_vliner_cart_device::neogeo_vliner_cart_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) :
- neogeo_rom_device(mconfig, NEOGEO_VLINER_CART, tag, owner, clock)
+ neogeo_rom_device(mconfig, NEOGEO_VLINER_CART, tag, owner, clock),
+ m_nvram(*this, "nvram")
{
}
-
void neogeo_vliner_cart_device::device_start()
{
- save_item(NAME(m_cart_ram));
+ m_cart_ram = make_unique_clear<uint16_t[]>(0x2000/2);
+ m_nvram->set_base(m_cart_ram.get(), 0x2000);
+ save_pointer(NAME(m_cart_ram), 0x2000/2);
}
-void neogeo_vliner_cart_device::device_reset()
+void neogeo_vliner_cart_device::device_add_mconfig(machine_config &config)
{
- memset(m_cart_ram, 0, 0x2000);
+ NVRAM(config, m_nvram);
}
diff --git a/src/devices/bus/neogeo/rom.h b/src/devices/bus/neogeo/rom.h
index 17efc4da4a7..1f62a890859 100644
--- a/src/devices/bus/neogeo/rom.h
+++ b/src/devices/bus/neogeo/rom.h
@@ -6,6 +6,7 @@
#pragma once
#include "slot.h"
+#include "machine/nvram.h"
// ======================> neogeo_rom_device
@@ -50,10 +51,13 @@ public:
protected:
virtual void device_start() override;
- virtual void device_reset() override;
+
+ virtual void device_add_mconfig(machine_config &config) override;
private:
- uint16_t m_cart_ram[0x1000];
+ std::unique_ptr<uint16_t[]> m_cart_ram;
+
+ required_device<nvram_device> m_nvram;
};
DECLARE_DEVICE_TYPE(NEOGEO_VLINER_CART, neogeo_vliner_cart_device)
diff --git a/src/devices/bus/neogeo/slot.h b/src/devices/bus/neogeo/slot.h
index edeb2452a1d..b5be4c5e901 100644
--- a/src/devices/bus/neogeo/slot.h
+++ b/src/devices/bus/neogeo/slot.h
@@ -190,6 +190,15 @@ class neogeo_cart_slot_device : public device_t,
{
public:
// construction/destruction
+ template <typename T>
+ neogeo_cart_slot_device(machine_config const &mconfig, char const *tag, device_t *owner, T &&opts, char const *dflt)
+ : neogeo_cart_slot_device(mconfig, tag, owner, (uint16_t)0)
+ {
+ option_reset();
+ opts(*this);
+ set_default_option(dflt);
+ set_fixed(false);
+ }
neogeo_cart_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, uint16_t clock);
virtual ~neogeo_cart_slot_device();
@@ -338,15 +347,4 @@ private:
// device type definition
DECLARE_DEVICE_TYPE(NEOGEO_CART_SLOT, neogeo_cart_slot_device)
-
-/***************************************************************************
- DEVICE CONFIGURATION MACROS
- ***************************************************************************/
-
-
-#define MCFG_NEOGEO_CARTRIDGE_ADD(_tag,_slot_intf,_def_slot) \
- MCFG_DEVICE_ADD(_tag, NEOGEO_CART_SLOT, 0) \
- MCFG_DEVICE_SLOT_INTERFACE(_slot_intf, _def_slot, false)
-
-
#endif // MAME_BUS_NEOGEO_SLOT_H
diff --git a/src/devices/bus/neogeo/sma.cpp b/src/devices/bus/neogeo/sma.cpp
index 70b03aa0a28..ee031e4f44f 100644
--- a/src/devices/bus/neogeo/sma.cpp
+++ b/src/devices/bus/neogeo/sma.cpp
@@ -55,10 +55,11 @@ void neogeo_sma_cart_device::device_reset()
mapper specific handlers
-------------------------------------------------*/
-MACHINE_CONFIG_START(neogeo_sma_cart_device::device_add_mconfig)
- MCFG_SMA_PROT_ADD("sma_prot")
- MCFG_CMC_PROT_ADD("cmc_prot")
-MACHINE_CONFIG_END
+void neogeo_sma_cart_device::device_add_mconfig(machine_config &config)
+{
+ NG_SMA_PROT(config, m_sma_prot);
+ NG_CMC_PROT(config, m_cmc_prot);
+}
/*************************************************
diff --git a/src/devices/bus/neogeo_ctrl/ctrl.h b/src/devices/bus/neogeo_ctrl/ctrl.h
index aee534d61ad..bfe568d9b7e 100644
--- a/src/devices/bus/neogeo_ctrl/ctrl.h
+++ b/src/devices/bus/neogeo_ctrl/ctrl.h
@@ -42,6 +42,15 @@ class neogeo_control_port_device : public device_t, public device_slot_interface
{
public:
// construction/destruction
+ template <typename T>
+ neogeo_control_port_device(machine_config const &mconfig, char const *tag, device_t *owner, T &&opts, char const *dflt, bool const fixed)
+ : neogeo_control_port_device(mconfig, tag, owner, (uint32_t)0)
+ {
+ option_reset();
+ opts(*this);
+ set_default_option(dflt);
+ set_fixed(fixed);
+ }
neogeo_control_port_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
virtual ~neogeo_control_port_device();
@@ -83,6 +92,15 @@ class neogeo_ctrl_edge_port_device : public device_t, public device_slot_interfa
{
public:
// construction/destruction
+ template <typename T>
+ neogeo_ctrl_edge_port_device(machine_config const &mconfig, char const *tag, device_t *owner, T &&opts, char const *dflt, bool const fixed)
+ : neogeo_ctrl_edge_port_device(mconfig, tag, owner, (uint32_t)0)
+ {
+ option_reset();
+ opts(*this);
+ set_default_option(dflt);
+ set_fixed(fixed);
+ }
neogeo_ctrl_edge_port_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
virtual ~neogeo_ctrl_edge_port_device();
@@ -104,20 +122,6 @@ DECLARE_DEVICE_TYPE(NEOGEO_CONTROL_PORT, neogeo_control_port_device)
DECLARE_DEVICE_TYPE(NEOGEO_CTRL_EDGE_CONNECTOR, neogeo_ctrl_edge_port_device)
-//**************************************************************************
-// INTERFACE CONFIGURATION MACROS
-//**************************************************************************
-
-#define MCFG_NEOGEO_CONTROL_PORT_ADD(_tag, _slot_intf, _def_slot, _fixed) \
- MCFG_DEVICE_ADD(_tag, NEOGEO_CONTROL_PORT, 0) \
- MCFG_DEVICE_SLOT_INTERFACE(_slot_intf, _def_slot, _fixed)
-
-#define MCFG_NEOGEO_CONTROL_EDGE_CONNECTOR_ADD(_tag, _slot_intf, _def_slot, _fixed) \
- MCFG_DEVICE_ADD(_tag, NEOGEO_CTRL_EDGE_CONNECTOR, 0) \
- MCFG_DEVICE_SLOT_INTERFACE(_slot_intf, _def_slot, _fixed)
-
-
-
void neogeo_controls(device_slot_interface &device);
void neogeo_arc_edge(device_slot_interface &device);
void neogeo_arc_edge_fixed(device_slot_interface &device);
diff --git a/src/devices/bus/nes/2a03pur.cpp b/src/devices/bus/nes/2a03pur.cpp
index ddb3820770d..87e364b1638 100644
--- a/src/devices/bus/nes/2a03pur.cpp
+++ b/src/devices/bus/nes/2a03pur.cpp
@@ -91,7 +91,7 @@ void nes_2a03pur_device::pcb_reset()
This has been assigned to iNES mapper 31.
-------------------------------------------------*/
-WRITE8_MEMBER(nes_2a03pur_device::write_l)
+void nes_2a03pur_device::write_l(offs_t offset, uint8_t data)
{
LOG_MMC(("2a03 puritans write_l, offset: %04x, data: %02x\n", offset, data));
offset += 0x100;
@@ -99,7 +99,7 @@ WRITE8_MEMBER(nes_2a03pur_device::write_l)
m_reg[offset & 7] = data & ((m_prg_chunks << 2) - 1);
}
-READ8_MEMBER(nes_2a03pur_device::read_h)
+uint8_t nes_2a03pur_device::read_h(offs_t offset)
{
LOG_MMC(("2a03 puritans read_h, offset: %04x\n", offset));
diff --git a/src/devices/bus/nes/2a03pur.h b/src/devices/bus/nes/2a03pur.h
index 2ec647ccc4a..970898ff128 100644
--- a/src/devices/bus/nes/2a03pur.h
+++ b/src/devices/bus/nes/2a03pur.h
@@ -16,8 +16,8 @@ public:
// construction/destruction
nes_2a03pur_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- virtual DECLARE_READ8_MEMBER(read_h) override;
- virtual DECLARE_WRITE8_MEMBER(write_l) override;
+ virtual uint8_t read_h(offs_t offset) override;
+ virtual void write_l(offs_t offset, uint8_t data) override;
virtual void pcb_reset() override;
diff --git a/src/devices/bus/nes/act53.cpp b/src/devices/bus/nes/act53.cpp
index f163be268fd..2a441c36153 100644
--- a/src/devices/bus/nes/act53.cpp
+++ b/src/devices/bus/nes/act53.cpp
@@ -158,7 +158,7 @@ void nes_action53_device::update_mirr()
}
}
-WRITE8_MEMBER(nes_action53_device::write_l)
+void nes_action53_device::write_l(offs_t offset, uint8_t data)
{
LOG_MMC(("action 53 write_l, offset: %04x, data: %02x\n", offset, data));
offset += 0x100;
@@ -167,7 +167,7 @@ WRITE8_MEMBER(nes_action53_device::write_l)
}
-WRITE8_MEMBER(nes_action53_device::write_h)
+void nes_action53_device::write_h(offs_t offset, uint8_t data)
{
LOG_MMC(("action 53 write_h, offset: %04x, data: %02x\n", offset, data));
diff --git a/src/devices/bus/nes/act53.h b/src/devices/bus/nes/act53.h
index 1f299a5a5da..8e4b1c3b073 100644
--- a/src/devices/bus/nes/act53.h
+++ b/src/devices/bus/nes/act53.h
@@ -14,8 +14,8 @@ public:
// construction/destruction
nes_action53_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- virtual DECLARE_WRITE8_MEMBER(write_l) override;
- virtual DECLARE_WRITE8_MEMBER(write_h) override;
+ virtual void write_l(offs_t offset, uint8_t data) override;
+ virtual void write_h(offs_t offset, uint8_t data) override;
virtual void pcb_reset() override;
diff --git a/src/devices/bus/nes/aladdin.cpp b/src/devices/bus/nes/aladdin.cpp
index e9d81555a72..db57b61ff00 100644
--- a/src/devices/bus/nes/aladdin.cpp
+++ b/src/devices/bus/nes/aladdin.cpp
@@ -52,7 +52,7 @@ aladdin_cart_interface::~aladdin_cart_interface()
{
}
-READ8_MEMBER(aladdin_cart_interface::read)
+uint8_t aladdin_cart_interface::read(offs_t offset)
{
if (offset < 0x4000)
return m_rom[(m_lobank * 0x4000) + (offset & 0x3fff)];
@@ -84,10 +84,10 @@ void nes_aladdin_slot_device::device_start()
m_cart = dynamic_cast<aladdin_cart_interface *>(get_card_device());
}
-READ8_MEMBER(nes_aladdin_slot_device::read)
+uint8_t nes_aladdin_slot_device::read(offs_t offset)
{
if (m_cart)
- return m_cart->read(space, offset, mem_mask);
+ return m_cart->read(offset);
return 0xff;
}
@@ -296,19 +296,19 @@ void nes_aladdin_device::pcb_reset()
-------------------------------------------------*/
-READ8_MEMBER(nes_aladdin_device::read_h)
+uint8_t nes_aladdin_device::read_h(offs_t offset)
{
LOG_MMC(("aladdin read_h, offset: %04x\n", offset));
// this shall be the proper code, but it's a bit slower, so we access directly the subcart below
- //return m_subslot->read(space, offset, mem_mask);
+ //return m_subslot->read(offset);
if (m_subslot->m_cart)
- return m_subslot->m_cart->read(space, offset, mem_mask);
+ return m_subslot->m_cart->read(offset);
else // this is "fake" in the sense that we fill CPU space with 0xff if no Aladdin cart is loaded
return hi_access_rom(offset);
}
-WRITE8_MEMBER(nes_aladdin_device::write_h)
+void nes_aladdin_device::write_h(offs_t offset, uint8_t data)
{
LOG_MMC(("aladdin write_h, offset: %04x, data: %02x\n", offset, data));
m_subslot->write_prg(offset, data);
@@ -325,6 +325,7 @@ static void ade_cart(device_slot_interface &device)
}
-MACHINE_CONFIG_START(nes_aladdin_device::device_add_mconfig)
- MCFG_ALADDIN_MINICART_ADD("ade_slot", ade_cart)
-MACHINE_CONFIG_END
+void nes_aladdin_device::device_add_mconfig(machine_config &config)
+{
+ NES_ALADDIN_SLOT(config, m_subslot, ade_cart);
+}
diff --git a/src/devices/bus/nes/aladdin.h b/src/devices/bus/nes/aladdin.h
index de6725bb9f1..9014bf6969a 100644
--- a/src/devices/bus/nes/aladdin.h
+++ b/src/devices/bus/nes/aladdin.h
@@ -24,7 +24,7 @@ public:
virtual ~aladdin_cart_interface();
// reading and writing
- virtual DECLARE_READ8_MEMBER(read);
+ virtual uint8_t read(offs_t offset);
uint8_t *get_cart_base() { return m_rom; }
void set_cart_size(uint32_t size) { m_rom_size = size; m_rom_mask = (size / 0x4000) - 1; }
@@ -50,6 +50,16 @@ class nes_aladdin_slot_device : public device_t,
friend class nes_aladdin_device;
public:
// construction/destruction
+ template <typename T>
+ nes_aladdin_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, T &&opts)
+ : nes_aladdin_slot_device(mconfig, tag, owner, (uint32_t)0)
+ {
+ option_reset();
+ opts(*this);
+ set_default_option(nullptr);
+ set_fixed(false);
+ }
+
nes_aladdin_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
virtual ~nes_aladdin_slot_device();
@@ -72,7 +82,7 @@ public:
// slot interface overrides
virtual std::string get_default_card_software(get_default_card_software_hook &hook) const override;
- virtual DECLARE_READ8_MEMBER(read);
+ uint8_t read(offs_t offset);
void write_prg(uint32_t offset, uint8_t data) { if (m_cart) m_cart->write_prg(offset, data); }
protected:
@@ -83,11 +93,6 @@ protected:
DECLARE_DEVICE_TYPE(NES_ALADDIN_SLOT, nes_aladdin_slot_device)
-#define MCFG_ALADDIN_MINICART_ADD(_tag, _slot_intf) \
- MCFG_DEVICE_ADD(_tag, NES_ALADDIN_SLOT, 0) \
- MCFG_DEVICE_SLOT_INTERFACE(_slot_intf, nullptr, false)
-
-
//----------------------------------
//
// Aladdin Minicart implementation
@@ -155,8 +160,8 @@ public:
// construction/destruction
nes_aladdin_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- virtual DECLARE_READ8_MEMBER(read_h) override;
- virtual DECLARE_WRITE8_MEMBER(write_h) override;
+ virtual uint8_t read_h(offs_t offset) override;
+ virtual void write_h(offs_t offset, uint8_t data) override;
virtual void pcb_reset() override;
diff --git a/src/devices/bus/nes/ave.cpp b/src/devices/bus/nes/ave.cpp
index 823d66e2e57..2e93ea17501 100644
--- a/src/devices/bus/nes/ave.cpp
+++ b/src/devices/bus/nes/ave.cpp
@@ -122,7 +122,7 @@ void nes_maxi15_device::pcb_reset()
-------------------------------------------------*/
-WRITE8_MEMBER(nes_nina001_device::write_m)
+void nes_nina001_device::write_m(offs_t offset, uint8_t data)
{
LOG_MMC(("nina-001 write_m, offset: %04x, data: %02x\n", offset, data));
@@ -155,7 +155,7 @@ WRITE8_MEMBER(nes_nina001_device::write_m)
-------------------------------------------------*/
-WRITE8_MEMBER(nes_nina006_device::write_l)
+void nes_nina006_device::write_l(offs_t offset, uint8_t data)
{
LOG_MMC(("nina-006 write_l, offset: %04x, data: %02x\n", offset, data));
@@ -192,7 +192,7 @@ void nes_maxi15_device::update_banks()
}
}
-READ8_MEMBER(nes_maxi15_device::read_h)
+uint8_t nes_maxi15_device::read_h(offs_t offset)
{
LOG_MMC(("Maxi 15 read_h, offset: %04x\n", offset));
diff --git a/src/devices/bus/nes/ave.h b/src/devices/bus/nes/ave.h
index 5fdd233b3c3..b40d2ed6d9d 100644
--- a/src/devices/bus/nes/ave.h
+++ b/src/devices/bus/nes/ave.h
@@ -16,7 +16,7 @@ public:
// construction/destruction
nes_nina001_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- virtual DECLARE_WRITE8_MEMBER(write_m) override;
+ virtual void write_m(offs_t offset, uint8_t data) override;
virtual void pcb_reset() override;
@@ -34,7 +34,7 @@ public:
// construction/destruction
nes_nina006_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- virtual DECLARE_WRITE8_MEMBER(write_l) override;
+ virtual void write_l(offs_t offset, uint8_t data) override;
virtual void pcb_reset() override;
@@ -52,7 +52,7 @@ public:
// construction/destruction
nes_maxi15_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- virtual DECLARE_READ8_MEMBER(read_h) override;
+ virtual uint8_t read_h(offs_t offset) override;
virtual void pcb_reset() override;
diff --git a/src/devices/bus/nes/bandai.cpp b/src/devices/bus/nes/bandai.cpp
index ff87be980d5..1dd82f1747d 100644
--- a/src/devices/bus/nes/bandai.cpp
+++ b/src/devices/bus/nes/bandai.cpp
@@ -205,7 +205,7 @@ void nes_fjump2_device::pcb_reset()
-------------------------------------------------*/
-WRITE8_MEMBER(nes_oekakids_device::nt_w)
+void nes_oekakids_device::nt_w(offs_t offset, uint8_t data)
{
int page = ((offset & 0xc00) >> 10);
@@ -220,7 +220,7 @@ WRITE8_MEMBER(nes_oekakids_device::nt_w)
m_nt_access[page][offset & 0x3ff] = data;
}
-READ8_MEMBER(nes_oekakids_device::nt_r)
+uint8_t nes_oekakids_device::nt_r(offs_t offset)
{
int page = ((offset & 0xc00) >> 10);
@@ -253,7 +253,7 @@ void nes_oekakids_device::ppu_latch(offs_t offset)
#endif
}
-WRITE8_MEMBER(nes_oekakids_device::write_h)
+void nes_oekakids_device::write_h(offs_t offset, uint8_t data)
{
LOG_MMC(("oeka kids write_h, offset: %04x, data: %02x\n", offset, data));
@@ -308,7 +308,7 @@ void nes_fcg_device::device_timer(emu_timer &timer, device_timer_id id, int para
}
}
-WRITE8_MEMBER(nes_fcg_device::fcg_write)
+void nes_fcg_device::fcg_write(offs_t offset, uint8_t data)
{
LOG_MMC(("lz93d50_write, offset: %04x, data: %02x\n", offset, data));
@@ -346,12 +346,12 @@ WRITE8_MEMBER(nes_fcg_device::fcg_write)
}
}
-WRITE8_MEMBER(nes_fcg_device::write_m)
+void nes_fcg_device::write_m(offs_t offset, uint8_t data)
{
LOG_MMC(("lz93d50 write_m, offset: %04x, data: %02x\n", offset, data));
if (m_battery.empty() && m_prgram.empty())
- fcg_write(space, offset & 0x0f, data, mem_mask);
+ fcg_write(offset & 0x0f, data);
else if (!m_battery.empty())
m_battery[offset] = data;
else
@@ -361,7 +361,7 @@ WRITE8_MEMBER(nes_fcg_device::write_m)
// FCG board does not access regs in 0x8000-0xffff space!
// only later design lz93d50 (and its variants do)!
-WRITE8_MEMBER(nes_lz93d50_24c01_device::write_h)
+void nes_lz93d50_24c01_device::write_h(offs_t offset, uint8_t data)
{
LOG_MMC(("lz93d50_24c01 write_h, offset: %04x, data: %02x\n", offset, data));
@@ -373,12 +373,12 @@ WRITE8_MEMBER(nes_lz93d50_24c01_device::write_h)
m_i2c_dir = BIT(data, 7);
break;
default:
- fcg_write(space, offset & 0x0f, data, mem_mask);
+ fcg_write(offset & 0x0f, data);
break;
}
}
-READ8_MEMBER(nes_lz93d50_24c01_device::read_m)
+uint8_t nes_lz93d50_24c01_device::read_m(offs_t offset)
{
LOG_MMC(("lz93d50 EEPROM read, offset: %04x\n", offset));
if (m_i2c_dir)
@@ -391,13 +391,15 @@ READ8_MEMBER(nes_lz93d50_24c01_device::read_m)
// SERIAL I2C DEVICE
//-------------------------------------------------
-MACHINE_CONFIG_START(nes_lz93d50_24c01_device::device_add_mconfig)
- MCFG_24C01_ADD("i2cmem")
-MACHINE_CONFIG_END
+void nes_lz93d50_24c01_device::device_add_mconfig(machine_config &config)
+{
+ I2C_24C01(config, m_i2cmem);
+}
-MACHINE_CONFIG_START(nes_lz93d50_24c02_device::device_add_mconfig)
- MCFG_24C02_ADD("i2cmem")
-MACHINE_CONFIG_END
+void nes_lz93d50_24c02_device::device_add_mconfig(machine_config &config)
+{
+ I2C_24C02(config, m_i2cmem);
+}
/*-------------------------------------------------
@@ -428,19 +430,19 @@ void nes_fjump2_device::set_prg()
prg16_cdef(prg_base | 0x0f);
}
-READ8_MEMBER(nes_fjump2_device::read_m)
+uint8_t nes_fjump2_device::read_m(offs_t offset)
{
LOG_MMC(("fjump2 read_m, offset: %04x\n", offset));
return m_battery[offset & (m_battery.size() - 1)];
}
-WRITE8_MEMBER(nes_fjump2_device::write_m)
+void nes_fjump2_device::write_m(offs_t offset, uint8_t data)
{
LOG_MMC(("fjump2 write_m, offset: %04x, data: %02x\n", offset, data));
m_battery[offset & (m_battery.size() - 1)] = data;
}
-WRITE8_MEMBER(nes_fjump2_device::write_h)
+void nes_fjump2_device::write_h(offs_t offset, uint8_t data)
{
LOG_MMC(("fjump2 write_h, offset: %04x, data: %02x\n", offset, data));
@@ -458,7 +460,7 @@ WRITE8_MEMBER(nes_fjump2_device::write_h)
set_prg();
break;
default:
- fcg_write(space, offset & 0x0f, data, mem_mask);
+ fcg_write(offset & 0x0f, data);
break;
}
}
diff --git a/src/devices/bus/nes/bandai.h b/src/devices/bus/nes/bandai.h
index e44ff99de20..e7cb0a1d0cd 100644
--- a/src/devices/bus/nes/bandai.h
+++ b/src/devices/bus/nes/bandai.h
@@ -17,9 +17,9 @@ public:
// construction/destruction
nes_oekakids_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- virtual DECLARE_WRITE8_MEMBER(write_h) override;
- virtual DECLARE_READ8_MEMBER(nt_r) override;
- virtual DECLARE_WRITE8_MEMBER(nt_w) override;
+ virtual void write_h(offs_t offset, uint8_t data) override;
+ virtual uint8_t nt_r(offs_t offset) override;
+ virtual void nt_w(offs_t offset, uint8_t data) override;
virtual void pcb_reset() override;
@@ -46,8 +46,8 @@ public:
nes_fcg_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override;
- virtual DECLARE_WRITE8_MEMBER(fcg_write);
- virtual DECLARE_WRITE8_MEMBER(write_m) override;
+ void fcg_write(offs_t offset, uint8_t data);
+ virtual void write_m(offs_t offset, uint8_t data) override;
virtual void pcb_reset() override;
@@ -75,7 +75,7 @@ public:
nes_lz93d50_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
// device-level overrides
- virtual DECLARE_WRITE8_MEMBER(write_h) override { fcg_write(space, offset, data, mem_mask); }
+ virtual void write_h(offs_t offset, uint8_t data) override { fcg_write(offset, data); }
protected:
nes_lz93d50_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock);
@@ -90,8 +90,8 @@ public:
// construction/destruction
nes_lz93d50_24c01_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- virtual DECLARE_READ8_MEMBER(read_m) override;
- virtual DECLARE_WRITE8_MEMBER(write_h) override;
+ virtual uint8_t read_m(offs_t offset) override;
+ virtual void write_h(offs_t offset, uint8_t data) override;
virtual void pcb_reset() override;
@@ -131,9 +131,9 @@ public:
// construction/destruction
nes_fjump2_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- virtual DECLARE_READ8_MEMBER(read_m) override;
- virtual DECLARE_WRITE8_MEMBER(write_m) override;
- virtual DECLARE_WRITE8_MEMBER(write_h) override;
+ virtual uint8_t read_m(offs_t offset) override;
+ virtual void write_m(offs_t offset, uint8_t data) override;
+ virtual void write_h(offs_t offset, uint8_t data) override;
virtual void pcb_reset() override;
diff --git a/src/devices/bus/nes/benshieng.cpp b/src/devices/bus/nes/benshieng.cpp
index 921d7c5b56f..2b3c7818f58 100644
--- a/src/devices/bus/nes/benshieng.cpp
+++ b/src/devices/bus/nes/benshieng.cpp
@@ -86,7 +86,7 @@ void nes_benshieng_device::update_banks()
chr2_6(m_mmc_vrom_bank[3], CHRROM);
}
-WRITE8_MEMBER(nes_benshieng_device::write_h)
+void nes_benshieng_device::write_h(offs_t offset, uint8_t data)
{
uint8_t helper = (offset & 0xc00) >> 10;
LOG_MMC(("benshieng write_h, offset: %04x, data: %02x\n", offset, data));
diff --git a/src/devices/bus/nes/benshieng.h b/src/devices/bus/nes/benshieng.h
index c25aba92508..599de5a6e9c 100644
--- a/src/devices/bus/nes/benshieng.h
+++ b/src/devices/bus/nes/benshieng.h
@@ -16,7 +16,7 @@ public:
// construction/destruction
nes_benshieng_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- virtual DECLARE_WRITE8_MEMBER(write_h) override;
+ virtual void write_h(offs_t offset, uint8_t data) override;
virtual void pcb_reset() override;
diff --git a/src/devices/bus/nes/bootleg.cpp b/src/devices/bus/nes/bootleg.cpp
index 49cccaa6a3b..d585a8df9de 100644
--- a/src/devices/bus/nes/bootleg.cpp
+++ b/src/devices/bus/nes/bootleg.cpp
@@ -570,7 +570,7 @@ void nes_ax5705_device::set_prg()
prg8_ab(m_mmc_prg_bank[1]);
}
-WRITE8_MEMBER(nes_ax5705_device::write_h)
+void nes_ax5705_device::write_h(offs_t offset, uint8_t data)
{
uint8_t bank;
LOG_MMC(("ax5705 write_h, offset: %04x, data: %02x\n", offset, data));
@@ -652,7 +652,7 @@ void nes_sc127_device::hblank_irq(int scanline, int vblank, int blanked)
}
}
-WRITE8_MEMBER(nes_sc127_device::write_h)
+void nes_sc127_device::write_h(offs_t offset, uint8_t data)
{
LOG_MMC(("sc127 write_h, offset: %04x, data: %02x\n", offset, data));
@@ -715,7 +715,7 @@ void nes_mbaby_device::device_timer(emu_timer &timer, device_timer_id id, int pa
}
}
-WRITE8_MEMBER(nes_mbaby_device::write_h)
+void nes_mbaby_device::write_h(offs_t offset, uint8_t data)
{
LOG_MMC(("Mario Baby write_h, offset: %04x, data: %02x\n", offset, data));
@@ -746,7 +746,7 @@ WRITE8_MEMBER(nes_mbaby_device::write_h)
}
}
-READ8_MEMBER(nes_mbaby_device::read_m)
+uint8_t nes_mbaby_device::read_m(offs_t offset)
{
LOG_MMC(("Mario Baby read_m, offset: %04x\n", offset));
return m_prg[(m_latch * 0x2000) + (offset & 0x1fff)];
@@ -764,7 +764,7 @@ READ8_MEMBER(nes_mbaby_device::read_m)
-------------------------------------------------*/
-WRITE8_MEMBER(nes_asn_device::write_h)
+void nes_asn_device::write_h(offs_t offset, uint8_t data)
{
LOG_MMC(("Ai Senshi Nicol write_h, offset: %04x, data: %02x\n", offset, data));
@@ -775,7 +775,7 @@ WRITE8_MEMBER(nes_asn_device::write_h)
m_latch = data;
}
-READ8_MEMBER(nes_asn_device::read_m)
+uint8_t nes_asn_device::read_m(offs_t offset)
{
LOG_MMC(("Ai Senshi Nicol read_m, offset: %04x\n", offset));
return m_prg[((m_latch * 0x2000) + (offset & 0x1fff)) & (m_prg_size - 1)];
@@ -811,7 +811,7 @@ void nes_smb3p_device::device_timer(emu_timer &timer, device_timer_id id, int pa
}
}
-WRITE8_MEMBER(nes_smb3p_device::write_h)
+void nes_smb3p_device::write_h(offs_t offset, uint8_t data)
{
LOG_MMC(("btl_smb3_w, offset: %04x, data: %02x\n", offset, data));
switch (offset & 0x0f)
@@ -879,7 +879,7 @@ void nes_btl_dn_device::hblank_irq(int scanline, int vblank, int blanked )
hold_irq_line();
}
-WRITE8_MEMBER(nes_btl_dn_device::write_h)
+void nes_btl_dn_device::write_h(offs_t offset, uint8_t data)
{
uint8_t bank;
LOG_MMC(("btl_dn write_h, offset: %04x, data: %02x\n", offset, data));
@@ -933,13 +933,13 @@ WRITE8_MEMBER(nes_btl_dn_device::write_h)
-------------------------------------------------*/
-WRITE8_MEMBER(nes_whirl2706_device::write_h)
+void nes_whirl2706_device::write_h(offs_t offset, uint8_t data)
{
LOG_MMC(("whirl2706 write_h, offset: %04x, data: %02x\n", offset, data));
m_latch = data;
}
-READ8_MEMBER(nes_whirl2706_device::read_m)
+uint8_t nes_whirl2706_device::read_m(offs_t offset)
{
LOG_MMC(("whirl2706 read_m, offset: %04x\n", offset));
return m_prg[(m_latch * 0x2000 + (offset & 0x1fff)) & (m_prg_size - 1)];
@@ -975,7 +975,7 @@ void nes_smb2j_device::device_timer(emu_timer &timer, device_timer_id id, int pa
}
}
-WRITE8_MEMBER(nes_smb2j_device::write_l)
+void nes_smb2j_device::write_l(offs_t offset, uint8_t data)
{
LOG_MMC(("smb2j write_l, offset: %04x, data: %02x\n", offset, data));
offset += 0x100;
@@ -984,7 +984,7 @@ WRITE8_MEMBER(nes_smb2j_device::write_l)
m_irq_enable = data & 3; // maybe also m_irq_count = 0?!?
}
-WRITE8_MEMBER(nes_smb2j_device::write_h)
+void nes_smb2j_device::write_h(offs_t offset, uint8_t data)
{
LOG_MMC(("smb2j write_h, offset: %04x, data: %02x\n", offset, data));
@@ -992,7 +992,7 @@ WRITE8_MEMBER(nes_smb2j_device::write_h)
m_irq_enable = data & 3;
}
-WRITE8_MEMBER(nes_smb2j_device::write_ex)
+void nes_smb2j_device::write_ex(offs_t offset, uint8_t data)
{
LOG_MMC(("smb2j write_ex, offset: %04x, data: %02x\n", offset, data));
@@ -1010,7 +1010,7 @@ WRITE8_MEMBER(nes_smb2j_device::write_ex)
}
}
-READ8_MEMBER(nes_smb2j_device::read_l)
+uint8_t nes_smb2j_device::read_l(offs_t offset)
{
LOG_MMC(("smb2j read_l, offset: %04x\n", offset));
offset += 0x100;
@@ -1018,10 +1018,10 @@ READ8_MEMBER(nes_smb2j_device::read_l)
if (offset >= 0x1000)
return m_prg[0x10000 + (offset & 0x0fff)];
- return m_open_bus; // open bus
+ return get_open_bus(); // open bus
}
-READ8_MEMBER(nes_smb2j_device::read_m)
+uint8_t nes_smb2j_device::read_m(offs_t offset)
{
LOG_MMC(("smb2j read_m, offset: %04x\n", offset));
return m_prg[0x4000 + offset];
@@ -1057,7 +1057,7 @@ void nes_smb2ja_device::device_timer(emu_timer &timer, device_timer_id id, int p
}
}
-WRITE8_MEMBER(nes_smb2ja_device::write_h)
+void nes_smb2ja_device::write_h(offs_t offset, uint8_t data)
{
LOG_MMC(("smb2ja write_h, offset: %04x, data: %02x\n", offset, data));
@@ -1076,7 +1076,7 @@ WRITE8_MEMBER(nes_smb2ja_device::write_h)
}
}
-READ8_MEMBER(nes_smb2ja_device::read_m)
+uint8_t nes_smb2ja_device::read_m(offs_t offset)
{
LOG_MMC(("smb2ja read_m, offset: %04x\n", offset));
return m_prg[(0xfe * 0x2000 + (offset & 0x1fff)) & (m_prg_size - 1)];
@@ -1114,7 +1114,7 @@ void nes_smb2jb_device::device_timer(emu_timer &timer, device_timer_id id, int p
}
}
-WRITE8_MEMBER(nes_smb2jb_device::write_l)
+void nes_smb2jb_device::write_l(offs_t offset, uint8_t data)
{
uint8_t prg;
LOG_MMC(("smb2jb write_l, offset: %04x, data: %02x\n", offset, data));
@@ -1134,14 +1134,14 @@ WRITE8_MEMBER(nes_smb2jb_device::write_l)
}
}
-READ8_MEMBER(nes_smb2jb_device::read_m)
+uint8_t nes_smb2jb_device::read_m(offs_t offset)
{
LOG_MMC(("smb2jb read_m, offset: %04x\n", offset));
return m_prg[((0x0f * 0x2000) + (offset & 0x1fff)) & (m_prg_size - 1)];
}
/* This goes to 0x4020-0x403f & 0x40a0-0x40bf */
-WRITE8_MEMBER(nes_smb2jb_device::write_ex)
+void nes_smb2jb_device::write_ex(offs_t offset, uint8_t data)
{
uint8_t prg;
LOG_MMC(("smb2jb write_ex, offset: %04x, data: %02x\n", offset, data));
@@ -1169,7 +1169,7 @@ WRITE8_MEMBER(nes_smb2jb_device::write_ex)
-------------------------------------------------*/
-WRITE8_MEMBER(nes_09034a_device::write_ex)
+void nes_09034a_device::write_ex(offs_t offset, uint8_t data)
{
LOG_MMC(("09-034a write_ex, offset: %04x, data: %02x\n", offset, data));
@@ -1177,7 +1177,7 @@ WRITE8_MEMBER(nes_09034a_device::write_ex)
m_reg = data & 1;
}
-READ8_MEMBER(nes_09034a_device::read_m)
+uint8_t nes_09034a_device::read_m(offs_t offset)
{
LOG_MMC(("09-034a read_m, offset: %04x\n", offset));
// in 0x6000-0x7fff is mapped the 2nd PRG chip which starts after 32K (hence the +4)
@@ -1198,7 +1198,7 @@ READ8_MEMBER(nes_09034a_device::read_m)
-------------------------------------------------*/
-WRITE8_MEMBER(nes_tobidase_device::write_l)
+void nes_tobidase_device::write_l(offs_t offset, uint8_t data)
{
LOG_MMC(("tobidase write_h, offset: %04x, data: %02x\n", offset, data));
offset += 0x4100;
@@ -1207,7 +1207,7 @@ WRITE8_MEMBER(nes_tobidase_device::write_l)
m_latch = data & 0x0f;
}
-READ8_MEMBER(nes_tobidase_device::read_m)
+uint8_t nes_tobidase_device::read_m(offs_t offset)
{
LOG_MMC(("tobidase read_m, offset: %04x\n", offset));
if (m_latch >= 0x0c)
@@ -1229,13 +1229,13 @@ READ8_MEMBER(nes_tobidase_device::read_m)
-------------------------------------------------*/
-READ8_MEMBER(nes_lh32_device::read_m)
+uint8_t nes_lh32_device::read_m(offs_t offset)
{
LOG_MMC(("lh32 read_m, offset: %04x\n", offset));
return m_prg[(m_latch * 0x2000) + (offset & 0x1fff)];
}
-READ8_MEMBER(nes_lh32_device::read_h)
+uint8_t nes_lh32_device::read_h(offs_t offset)
{
// LOG_MMC(("lh32 read_h, offset: %04x\n", offset));
@@ -1245,7 +1245,7 @@ READ8_MEMBER(nes_lh32_device::read_h)
return hi_access_rom(offset);
}
-WRITE8_MEMBER(nes_lh32_device::write_m)
+void nes_lh32_device::write_m(offs_t offset, uint8_t data)
{
LOG_MMC(("lh32 write_m, offset: %04x, data: %02x\n", offset, data));
@@ -1256,7 +1256,7 @@ WRITE8_MEMBER(nes_lh32_device::write_m)
}
}
-WRITE8_MEMBER(nes_lh32_device::write_h)
+void nes_lh32_device::write_h(offs_t offset, uint8_t data)
{
LOG_MMC(("lh32 write_h, offset: %04x, data: %02x\n", offset, data));
@@ -1285,13 +1285,13 @@ void nes_lh10_device::update_prg()
prg8_ab(m_reg[7]);
}
-READ8_MEMBER(nes_lh10_device::read_m)
+uint8_t nes_lh10_device::read_m(offs_t offset)
{
LOG_MMC(("lh10 read_m, offset: %04x\n", offset));
return m_prg[(0x0e * 0x2000) + (offset & 0x1fff)];
}
-READ8_MEMBER(nes_lh10_device::read_h)
+uint8_t nes_lh10_device::read_h(offs_t offset)
{
// LOG_MMC(("lh10 read_h, offset: %04x\n", offset));
@@ -1301,7 +1301,7 @@ READ8_MEMBER(nes_lh10_device::read_h)
return hi_access_rom(offset);
}
-WRITE8_MEMBER(nes_lh10_device::write_h)
+void nes_lh10_device::write_h(offs_t offset, uint8_t data)
{
LOG_MMC(("lh10 write_h, offset: %04x, data: %02x\n", offset, data));
@@ -1354,13 +1354,13 @@ void nes_lh53_device::device_timer(emu_timer &timer, device_timer_id id, int par
}
}
-READ8_MEMBER(nes_lh53_device::read_m)
+uint8_t nes_lh53_device::read_m(offs_t offset)
{
LOG_MMC(("lh53 read_m, offset: %04x\n", offset));
return m_prg[(m_reg * 0x2000) + (offset & 0x1fff)];
}
-READ8_MEMBER(nes_lh53_device::read_h)
+uint8_t nes_lh53_device::read_h(offs_t offset)
{
// LOG_MMC(("lh53 read_h, offset: %04x\n", offset));
@@ -1370,7 +1370,7 @@ READ8_MEMBER(nes_lh53_device::read_h)
return hi_access_rom(offset);
}
-WRITE8_MEMBER(nes_lh53_device::write_h)
+void nes_lh53_device::write_h(offs_t offset, uint8_t data)
{
LOG_MMC(("lh53 write_h, offset: %04x, data: %02x\n", offset, data));
@@ -1412,7 +1412,7 @@ WRITE8_MEMBER(nes_lh53_device::write_h)
-------------------------------------------------*/
-READ8_MEMBER(nes_2708_device::read_m)
+uint8_t nes_2708_device::read_m(offs_t offset)
{
LOG_MMC(("btl-2708 read_m, offset: %04x\n", offset));
if (!m_reg[1])
@@ -1421,14 +1421,14 @@ READ8_MEMBER(nes_2708_device::read_m)
return m_prg[(m_reg[0] * 0x2000) + (offset & 0x1fff)];
}
-WRITE8_MEMBER(nes_2708_device::write_m)
+void nes_2708_device::write_m(offs_t offset, uint8_t data)
{
LOG_MMC(("btl-2708 write_m, offset: %04x, data: %02x\n", offset, data));
// if (!m_reg[1])
m_prgram[offset] = data; // lower 8K of WRAM
}
-READ8_MEMBER(nes_2708_device::read_h)
+uint8_t nes_2708_device::read_h(offs_t offset)
{
// LOG_MMC(("btl-2708 read_h, offset: %04x\n", offset));
@@ -1438,7 +1438,7 @@ READ8_MEMBER(nes_2708_device::read_h)
return hi_access_rom(offset);
}
-WRITE8_MEMBER(nes_2708_device::write_h)
+void nes_2708_device::write_h(offs_t offset, uint8_t data)
{
LOG_MMC(("btl-2708 write_h, offset: %04x, data: %02x\n", offset, data));
@@ -1475,20 +1475,20 @@ WRITE8_MEMBER(nes_2708_device::write_h)
-------------------------------------------------*/
-WRITE8_MEMBER(nes_ac08_device::write_ex)
+void nes_ac08_device::write_ex(offs_t offset, uint8_t data)
{
LOG_MMC(("AC-08 write_ex, offset: %04x, data: %02x\n", offset, data));
if (offset == 5) // $4025
set_nt_mirroring(!BIT(data, 3) ? PPU_MIRROR_VERT : PPU_MIRROR_HORZ);
}
-READ8_MEMBER(nes_ac08_device::read_m)
+uint8_t nes_ac08_device::read_m(offs_t offset)
{
LOG_MMC(("AC-08 read_m, offset: %04x\n", offset));
return m_prg[(m_latch * 0x2000) + (offset & 0x1fff)];
}
-WRITE8_MEMBER(nes_ac08_device::write_h)
+void nes_ac08_device::write_h(offs_t offset, uint8_t data)
{
LOG_MMC(("AC-08 write_h, offset: %04x, data: %02x\n", offset, data));
@@ -1511,13 +1511,13 @@ WRITE8_MEMBER(nes_ac08_device::write_h)
-------------------------------------------------*/
-READ8_MEMBER(nes_unl_bb_device::read_m)
+uint8_t nes_unl_bb_device::read_m(offs_t offset)
{
LOG_MMC(("unl-bb read_m, offset: %04x\n", offset));
return m_prg[(((m_reg[0] & 3 & m_prg_mask) * 0x2000) + (offset & 0x1fff))];
}
-WRITE8_MEMBER(nes_unl_bb_device::write_h)
+void nes_unl_bb_device::write_h(offs_t offset, uint8_t data)
{
LOG_MMC(("unl-bb write_h, offset: %04x, data: %02x\n", offset, data));
@@ -1549,7 +1549,7 @@ WRITE8_MEMBER(nes_unl_bb_device::write_h)
-------------------------------------------------*/
-READ8_MEMBER(nes_mmalee_device::read_m)
+uint8_t nes_mmalee_device::read_m(offs_t offset)
{
LOG_MMC(("mmalee read_m, offset: %04x\n", offset));
@@ -1561,7 +1561,7 @@ READ8_MEMBER(nes_mmalee_device::read_m)
return ((offset + 0x6000) & 0xff00) >> 8;
}
-WRITE8_MEMBER(nes_mmalee_device::write_m)
+void nes_mmalee_device::write_m(offs_t offset, uint8_t data)
{
LOG_MMC(("mmalee write_m, offset: %04x, data: %02x\n", offset, data));
@@ -1594,7 +1594,7 @@ void nes_shuiguan_device::device_timer(emu_timer &timer, device_timer_id id, int
}
}
-WRITE8_MEMBER(nes_shuiguan_device::write_h)
+void nes_shuiguan_device::write_h(offs_t offset, uint8_t data)
{
int bank;
LOG_MMC(("shuiguan write_h, offset: %04x, data: %02x\n", offset, data));
@@ -1646,7 +1646,7 @@ WRITE8_MEMBER(nes_shuiguan_device::write_h)
}
}
-READ8_MEMBER(nes_shuiguan_device::read_m)
+uint8_t nes_shuiguan_device::read_m(offs_t offset)
{
// always first bank??
LOG_MMC(("shuiguan read_m, offset: %04x\n", offset));
@@ -1670,7 +1670,7 @@ READ8_MEMBER(nes_shuiguan_device::read_m)
-------------------------------------------------*/
-READ8_MEMBER(nes_rt01_device::read_h)
+uint8_t nes_rt01_device::read_h(offs_t offset)
{
// LOG_MMC(("rt01 read_h, offset: %04x\n", offset));
diff --git a/src/devices/bus/nes/bootleg.h b/src/devices/bus/nes/bootleg.h
index a048f0955d4..42213b131b8 100644
--- a/src/devices/bus/nes/bootleg.h
+++ b/src/devices/bus/nes/bootleg.h
@@ -14,7 +14,7 @@ public:
// construction/destruction
nes_ax5705_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- virtual DECLARE_WRITE8_MEMBER(write_h) override;
+ virtual void write_h(offs_t offset, uint8_t data) override;
virtual void pcb_reset() override;
@@ -36,7 +36,7 @@ class nes_sc127_device : public nes_nrom_device
public:
// construction/destruction
nes_sc127_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- virtual DECLARE_WRITE8_MEMBER(write_h) override;
+ virtual void write_h(offs_t offset, uint8_t data) override;
virtual void hblank_irq(int scanline, int vblank, int blanked) override;
virtual void pcb_reset() override;
@@ -58,8 +58,8 @@ class nes_mbaby_device : public nes_nrom_device
public:
// construction/destruction
nes_mbaby_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- virtual DECLARE_READ8_MEMBER(read_m) override;
- virtual DECLARE_WRITE8_MEMBER(write_h) override;
+ virtual uint8_t read_m(offs_t offset) override;
+ virtual void write_h(offs_t offset, uint8_t data) override;
virtual void pcb_reset() override;
@@ -87,8 +87,8 @@ public:
// construction/destruction
nes_asn_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- virtual DECLARE_READ8_MEMBER(read_m) override;
- virtual DECLARE_WRITE8_MEMBER(write_h) override;
+ virtual uint8_t read_m(offs_t offset) override;
+ virtual void write_h(offs_t offset, uint8_t data) override;
virtual void pcb_reset() override;
@@ -109,7 +109,7 @@ public:
// construction/destruction
nes_smb3p_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- virtual DECLARE_WRITE8_MEMBER(write_h) override;
+ virtual void write_h(offs_t offset, uint8_t data) override;
virtual void pcb_reset() override;
@@ -134,7 +134,7 @@ class nes_btl_dn_device : public nes_nrom_device
public:
// construction/destruction
nes_btl_dn_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- virtual DECLARE_WRITE8_MEMBER(write_h) override;
+ virtual void write_h(offs_t offset, uint8_t data) override;
virtual void hblank_irq(int scanline, int vblank, int blanked) override;
virtual void pcb_reset() override;
@@ -156,8 +156,8 @@ public:
// construction/destruction
nes_whirl2706_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- virtual DECLARE_READ8_MEMBER(read_m) override;
- virtual DECLARE_WRITE8_MEMBER(write_h) override;
+ virtual uint8_t read_m(offs_t offset) override;
+ virtual void write_h(offs_t offset, uint8_t data) override;
virtual void pcb_reset() override;
@@ -178,11 +178,11 @@ public:
// construction/destruction
nes_smb2j_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- virtual DECLARE_READ8_MEMBER(read_l) override;
- virtual DECLARE_READ8_MEMBER(read_m) override;
- virtual DECLARE_WRITE8_MEMBER(write_ex) override;
- virtual DECLARE_WRITE8_MEMBER(write_l) override;
- virtual DECLARE_WRITE8_MEMBER(write_h) override;
+ virtual uint8_t read_l(offs_t offset) override;
+ virtual uint8_t read_m(offs_t offset) override;
+ virtual void write_ex(offs_t offset, uint8_t data) override;
+ virtual void write_l(offs_t offset, uint8_t data) override;
+ virtual void write_h(offs_t offset, uint8_t data) override;
virtual void pcb_reset() override;
@@ -207,8 +207,8 @@ class nes_smb2ja_device : public nes_nrom_device
public:
// construction/destruction
nes_smb2ja_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- virtual DECLARE_READ8_MEMBER(read_m) override;
- virtual DECLARE_WRITE8_MEMBER(write_h) override;
+ virtual uint8_t read_m(offs_t offset) override;
+ virtual void write_h(offs_t offset, uint8_t data) override;
virtual void pcb_reset() override;
@@ -233,9 +233,9 @@ class nes_smb2jb_device : public nes_nrom_device
public:
// construction/destruction
nes_smb2jb_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- virtual DECLARE_READ8_MEMBER(read_m) override;
- virtual DECLARE_WRITE8_MEMBER(write_l) override;
- virtual DECLARE_WRITE8_MEMBER(write_ex) override;
+ virtual uint8_t read_m(offs_t offset) override;
+ virtual void write_l(offs_t offset, uint8_t data) override;
+ virtual void write_ex(offs_t offset, uint8_t data) override;
virtual void pcb_reset() override;
@@ -261,8 +261,8 @@ public:
// construction/destruction
nes_09034a_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- virtual DECLARE_WRITE8_MEMBER(write_ex) override;
- virtual DECLARE_READ8_MEMBER(read_m) override;
+ virtual void write_ex(offs_t offset, uint8_t data) override;
+ virtual uint8_t read_m(offs_t offset) override;
virtual void pcb_reset() override;
@@ -283,8 +283,8 @@ public:
// construction/destruction
nes_tobidase_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- virtual DECLARE_READ8_MEMBER(read_m) override;
- virtual DECLARE_WRITE8_MEMBER(write_l) override;
+ virtual uint8_t read_m(offs_t offset) override;
+ virtual void write_l(offs_t offset, uint8_t data) override;
virtual void pcb_reset() override;
@@ -305,10 +305,10 @@ public:
// construction/destruction
nes_lh32_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- virtual DECLARE_READ8_MEMBER(read_m) override;
- virtual DECLARE_READ8_MEMBER(read_h) override;
- virtual DECLARE_WRITE8_MEMBER(write_m) override;
- virtual DECLARE_WRITE8_MEMBER(write_h) override;
+ virtual uint8_t read_m(offs_t offset) override;
+ virtual uint8_t read_h(offs_t offset) override;
+ virtual void write_m(offs_t offset, uint8_t data) override;
+ virtual void write_h(offs_t offset, uint8_t data) override;
virtual void pcb_reset() override;
@@ -329,9 +329,9 @@ public:
// construction/destruction
nes_lh10_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- virtual DECLARE_READ8_MEMBER(read_h) override;
- virtual DECLARE_READ8_MEMBER(read_m) override;
- virtual DECLARE_WRITE8_MEMBER(write_h) override;
+ virtual uint8_t read_h(offs_t offset) override;
+ virtual uint8_t read_m(offs_t offset) override;
+ virtual void write_h(offs_t offset, uint8_t data) override;
virtual void pcb_reset() override;
@@ -354,10 +354,10 @@ public:
// construction/destruction
nes_lh53_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- virtual DECLARE_READ8_MEMBER(read_m) override;
- virtual DECLARE_READ8_MEMBER(read_h) override;
- virtual DECLARE_WRITE8_MEMBER(write_m) override {}
- virtual DECLARE_WRITE8_MEMBER(write_h) override;
+ virtual uint8_t read_m(offs_t offset) override;
+ virtual uint8_t read_h(offs_t offset) override;
+ virtual void write_m(offs_t offset, uint8_t data) override {}
+ virtual void write_h(offs_t offset, uint8_t data) override;
virtual void pcb_reset() override;
@@ -385,10 +385,10 @@ public:
// construction/destruction
nes_2708_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- virtual DECLARE_READ8_MEMBER(read_m) override;
- virtual DECLARE_READ8_MEMBER(read_h) override;
- virtual DECLARE_WRITE8_MEMBER(write_m) override;
- virtual DECLARE_WRITE8_MEMBER(write_h) override;
+ virtual uint8_t read_m(offs_t offset) override;
+ virtual uint8_t read_h(offs_t offset) override;
+ virtual void write_m(offs_t offset, uint8_t data) override;
+ virtual void write_h(offs_t offset, uint8_t data) override;
virtual void pcb_reset() override;
@@ -408,9 +408,9 @@ public:
// nes_ac08_device/destruction
nes_ac08_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- virtual DECLARE_READ8_MEMBER(read_m) override;
- virtual DECLARE_WRITE8_MEMBER(write_ex) override;
- virtual DECLARE_WRITE8_MEMBER(write_h) override;
+ virtual uint8_t read_m(offs_t offset) override;
+ virtual void write_ex(offs_t offset, uint8_t data) override;
+ virtual void write_h(offs_t offset, uint8_t data) override;
virtual void pcb_reset() override;
@@ -429,8 +429,8 @@ class nes_unl_bb_device : public nes_nrom_device
public:
// construction/destruction
nes_unl_bb_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- virtual DECLARE_READ8_MEMBER(read_m) override;
- virtual DECLARE_WRITE8_MEMBER(write_h) override;
+ virtual uint8_t read_m(offs_t offset) override;
+ virtual void write_h(offs_t offset, uint8_t data) override;
virtual void pcb_reset() override;
@@ -450,8 +450,8 @@ public:
// construction/destruction
nes_mmalee_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- virtual DECLARE_READ8_MEMBER(read_m) override;
- virtual DECLARE_WRITE8_MEMBER(write_m) override;
+ virtual uint8_t read_m(offs_t offset) override;
+ virtual void write_m(offs_t offset, uint8_t data) override;
virtual void pcb_reset() override;
@@ -468,8 +468,8 @@ public:
// construction/destruction
nes_shuiguan_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- virtual DECLARE_READ8_MEMBER(read_m) override;
- virtual DECLARE_WRITE8_MEMBER(write_h) override;
+ virtual uint8_t read_m(offs_t offset) override;
+ virtual void write_h(offs_t offset, uint8_t data) override;
virtual void pcb_reset() override;
@@ -496,7 +496,7 @@ public:
// construction/destruction
nes_rt01_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- virtual DECLARE_READ8_MEMBER(read_h) override;
+ virtual uint8_t read_h(offs_t offset) override;
virtual void pcb_reset() override;
diff --git a/src/devices/bus/nes/camerica.cpp b/src/devices/bus/nes/camerica.cpp
index 7b9d413f6c9..5870b2911ab 100644
--- a/src/devices/bus/nes/camerica.cpp
+++ b/src/devices/bus/nes/camerica.cpp
@@ -136,7 +136,7 @@ void nes_golden5_device::pcb_reset()
-------------------------------------------------*/
-WRITE8_MEMBER(nes_bf9093_device::write_h)
+void nes_bf9093_device::write_h(offs_t offset, uint8_t data)
{
LOG_MMC(("bf9093 write_h, offset: %04x, data: %02x\n", offset, data));
@@ -174,7 +174,7 @@ WRITE8_MEMBER(nes_bf9093_device::write_h)
-------------------------------------------------*/
-WRITE8_MEMBER(nes_bf9096_device::write_h)
+void nes_bf9096_device::write_h(offs_t offset, uint8_t data)
{
LOG_MMC(("bf9096 write_h, offset: %04x, data: %02x\n", offset, data));
@@ -203,7 +203,7 @@ WRITE8_MEMBER(nes_bf9096_device::write_h)
-------------------------------------------------*/
-WRITE8_MEMBER(nes_golden5_device::write_h)
+void nes_golden5_device::write_h(offs_t offset, uint8_t data)
{
LOG_MMC(("golden5 write_h, offset: %04x, data: %02x\n", offset, data));
diff --git a/src/devices/bus/nes/camerica.h b/src/devices/bus/nes/camerica.h
index b7a4782c342..7688249a64c 100644
--- a/src/devices/bus/nes/camerica.h
+++ b/src/devices/bus/nes/camerica.h
@@ -16,7 +16,7 @@ public:
// construction/destruction
nes_bf9093_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- virtual DECLARE_WRITE8_MEMBER(write_h) override;
+ virtual void write_h(offs_t offset, uint8_t data) override;
virtual void pcb_reset() override;
@@ -34,8 +34,8 @@ public:
// construction/destruction
nes_bf9096_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- virtual DECLARE_WRITE8_MEMBER(write_h) override;
- virtual DECLARE_WRITE8_MEMBER(write_m) override { write_h(space, offset, data, mem_mask); }
+ virtual void write_h(offs_t offset, uint8_t data) override;
+ virtual void write_m(offs_t offset, uint8_t data) override { write_h(offset, data); }
virtual void pcb_reset() override;
@@ -56,7 +56,7 @@ public:
// construction/destruction
nes_golden5_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- virtual DECLARE_WRITE8_MEMBER(write_h) override;
+ virtual void write_h(offs_t offset, uint8_t data) override;
virtual void pcb_reset() override;
diff --git a/src/devices/bus/nes/cne.cpp b/src/devices/bus/nes/cne.cpp
index 1f0ad793937..c81e7a2bdc8 100644
--- a/src/devices/bus/nes/cne.cpp
+++ b/src/devices/bus/nes/cne.cpp
@@ -112,7 +112,7 @@ void nes_cne_shlz_device::pcb_reset()
-------------------------------------------------*/
-WRITE8_MEMBER(nes_cne_decathl_device::write_h)
+void nes_cne_decathl_device::write_h(offs_t offset, uint8_t data)
{
LOG_MMC(("cne_decathl_w, offset: %04x, data: %02x\n", offset, data));
@@ -146,7 +146,7 @@ WRITE8_MEMBER(nes_cne_decathl_device::write_h)
-------------------------------------------------*/
-WRITE8_MEMBER(nes_cne_fsb_device::write_m)
+void nes_cne_fsb_device::write_m(offs_t offset, uint8_t data)
{
LOG_MMC(("cne_fsb write_m, offset: %04x, data: %02x\n", offset, data));
@@ -184,7 +184,7 @@ WRITE8_MEMBER(nes_cne_fsb_device::write_m)
m_battery[offset] = data;
}
-READ8_MEMBER(nes_cne_fsb_device::read_m)
+uint8_t nes_cne_fsb_device::read_m(offs_t offset)
{
LOG_MMC(("cne_fsb read_m, offset: %04x\n", offset));
@@ -211,7 +211,7 @@ READ8_MEMBER(nes_cne_fsb_device::read_m)
-------------------------------------------------*/
-WRITE8_MEMBER(nes_cne_shlz_device::write_l)
+void nes_cne_shlz_device::write_l(offs_t offset, uint8_t data)
{
LOG_MMC(("cne_shlz write_l, offset: %04x, data: %02x\n", offset, data));
diff --git a/src/devices/bus/nes/cne.h b/src/devices/bus/nes/cne.h
index d5e117c791a..da0623cbde3 100644
--- a/src/devices/bus/nes/cne.h
+++ b/src/devices/bus/nes/cne.h
@@ -16,7 +16,7 @@ public:
// construction/destruction
nes_cne_decathl_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- virtual DECLARE_WRITE8_MEMBER(write_h) override;
+ virtual void write_h(offs_t offset, uint8_t data) override;
virtual void pcb_reset() override;
@@ -34,8 +34,8 @@ public:
// construction/destruction
nes_cne_fsb_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- virtual DECLARE_READ8_MEMBER(read_m) override;
- virtual DECLARE_WRITE8_MEMBER(write_m) override;
+ virtual uint8_t read_m(offs_t offset) override;
+ virtual void write_m(offs_t offset, uint8_t data) override;
virtual void pcb_reset() override;
@@ -53,7 +53,7 @@ public:
// construction/destruction
nes_cne_shlz_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- virtual DECLARE_WRITE8_MEMBER(write_l) override;
+ virtual void write_l(offs_t offset, uint8_t data) override;
virtual void pcb_reset() override;
diff --git a/src/devices/bus/nes/cony.cpp b/src/devices/bus/nes/cony.cpp
index 78c89a57141..e42ae833f82 100644
--- a/src/devices/bus/nes/cony.cpp
+++ b/src/devices/bus/nes/cony.cpp
@@ -174,7 +174,7 @@ void nes_cony_device::device_timer(emu_timer &timer, device_timer_id id, int par
}
}
-WRITE8_MEMBER(nes_cony_device::write_l)
+void nes_cony_device::write_l(offs_t offset, uint8_t data)
{
LOG_MMC(("cony write_l, offset: %04x, data: %02x\n", offset, data));
@@ -182,7 +182,7 @@ WRITE8_MEMBER(nes_cony_device::write_l)
m_low_reg[offset & 0x03] = data;
}
-READ8_MEMBER(nes_cony_device::read_l)
+uint8_t nes_cony_device::read_l(offs_t offset)
{
LOG_MMC(("cony read_l, offset: %04x\n", offset));
@@ -229,7 +229,7 @@ void nes_cony_device::set_chr()
}
}
-WRITE8_MEMBER(nes_cony_device::write_h)
+void nes_cony_device::write_h(offs_t offset, uint8_t data)
{
LOG_MMC(("cony write_h, offset: %04x, data: %02x\n", offset, data));
@@ -310,7 +310,7 @@ WRITE8_MEMBER(nes_cony_device::write_h)
-------------------------------------------------*/
-WRITE8_MEMBER(nes_yoko_device::write_l)
+void nes_yoko_device::write_l(offs_t offset, uint8_t data)
{
LOG_MMC(("yoko write_l, offset: %04x, data: %02x\n", offset, data));
@@ -318,7 +318,7 @@ WRITE8_MEMBER(nes_yoko_device::write_l)
m_low_reg[offset & 0x03] = data;
}
-READ8_MEMBER(nes_yoko_device::read_l)
+uint8_t nes_yoko_device::read_l(offs_t offset)
{
LOG_MMC(("yoko read_l, offset: %04x\n", offset));
@@ -359,7 +359,7 @@ void nes_yoko_device::set_chr()
chr2_6(m_reg[7], CHRROM);
}
-WRITE8_MEMBER(nes_yoko_device::write_h)
+void nes_yoko_device::write_h(offs_t offset, uint8_t data)
{
LOG_MMC(("yoko write_h, offset: %04x, data: %02x\n", offset, data));
diff --git a/src/devices/bus/nes/cony.h b/src/devices/bus/nes/cony.h
index b7b759a7fe1..aa767a88c13 100644
--- a/src/devices/bus/nes/cony.h
+++ b/src/devices/bus/nes/cony.h
@@ -16,9 +16,9 @@ public:
// construction/destruction
nes_cony_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- virtual DECLARE_READ8_MEMBER(read_l) override;
- virtual DECLARE_WRITE8_MEMBER(write_l) override;
- virtual DECLARE_WRITE8_MEMBER(write_h) override;
+ virtual uint8_t read_l(offs_t offset) override;
+ virtual void write_l(offs_t offset, uint8_t data) override;
+ virtual void write_h(offs_t offset, uint8_t data) override;
virtual void pcb_reset() override;
@@ -54,9 +54,9 @@ public:
// construction/destruction
nes_yoko_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- virtual DECLARE_READ8_MEMBER(read_l) override;
- virtual DECLARE_WRITE8_MEMBER(write_l) override;
- virtual DECLARE_WRITE8_MEMBER(write_h) override;
+ virtual uint8_t read_l(offs_t offset) override;
+ virtual void write_l(offs_t offset, uint8_t data) override;
+ virtual void write_h(offs_t offset, uint8_t data) override;
virtual void pcb_reset() override;
diff --git a/src/devices/bus/nes/datach.cpp b/src/devices/bus/nes/datach.cpp
index c8549924f68..5262b6d927a 100644
--- a/src/devices/bus/nes/datach.cpp
+++ b/src/devices/bus/nes/datach.cpp
@@ -52,7 +52,7 @@ datach_cart_interface::~datach_cart_interface()
{
}
-READ8_MEMBER(datach_cart_interface::read)
+uint8_t datach_cart_interface::read(offs_t offset)
{
if (offset < 0x4000)
return m_rom[(m_bank * 0x4000) + (offset & 0x3fff)];
@@ -84,10 +84,10 @@ void nes_datach_slot_device::device_start()
m_cart = dynamic_cast<datach_cart_interface *>(get_card_device());
}
-READ8_MEMBER(nes_datach_slot_device::read)
+uint8_t nes_datach_slot_device::read(offs_t offset)
{
if (m_cart)
- return m_cart->read(space, offset, mem_mask);
+ return m_cart->read(offset);
return 0xff;
}
@@ -201,9 +201,10 @@ uint8_t *nes_datach_rom_device::get_cart_base()
}
-MACHINE_CONFIG_START(nes_datach_24c01_device::device_add_mconfig)
- MCFG_24C01_ADD("i2cmem")
-MACHINE_CONFIG_END
+void nes_datach_24c01_device::device_add_mconfig(machine_config &config)
+{
+ I2C_24C01(config, m_i2cmem);
+}
//---------------------------------
@@ -283,7 +284,7 @@ void nes_datach_device::pcb_reset()
-------------------------------------------------*/
-READ8_MEMBER(nes_datach_device::read_m)
+uint8_t nes_datach_device::read_m(offs_t offset)
{
LOG_MMC(("Datach read_m, offset: %04x\n", offset));
uint8_t i2c_val = 0;
@@ -300,19 +301,19 @@ READ8_MEMBER(nes_datach_device::read_m)
}
-READ8_MEMBER(nes_datach_device::read_h)
+uint8_t nes_datach_device::read_h(offs_t offset)
{
LOG_MMC(("Datach read_h, offset: %04x\n", offset));
// this shall be the proper code, but it's a bit slower, so we access directly the subcart below
- //return m_subslot->read(space, offset, mem_mask);
+ //return m_subslot->read(offset);
if (m_subslot->m_cart)
- return m_subslot->m_cart->read(space, offset, mem_mask);
+ return m_subslot->m_cart->read(offset);
else // this is "fake" in the sense that we fill CPU space with 0xff if no Datach cart is loaded
return hi_access_rom(offset);
}
-WRITE8_MEMBER(nes_datach_device::write_h)
+void nes_datach_device::write_h(offs_t offset, uint8_t data)
{
LOG_MMC(("Datach write_h, offset: %04x, data: %02x\n", offset, data));
@@ -352,7 +353,7 @@ WRITE8_MEMBER(nes_datach_device::write_h)
#endif
break;
default:
- fcg_write(space, offset & 0x0f, data, mem_mask);
+ fcg_write(offset & 0x0f, data);
break;
}
}
@@ -368,11 +369,12 @@ static void datach_cart(device_slot_interface &device)
}
-MACHINE_CONFIG_START(nes_datach_device::device_add_mconfig)
- BARCODE_READER(config, "datach", 0);
- MCFG_DATACH_MINICART_ADD("datach_slot", datach_cart)
- MCFG_24C02_ADD("i2cmem")
-MACHINE_CONFIG_END
+void nes_datach_device::device_add_mconfig(machine_config &config)
+{
+ BARCODE_READER(config, m_reader, 0);
+ NES_DATACH_SLOT(config, m_subslot, 0, datach_cart);
+ I2C_24C02(config, m_i2cmem);
+}
//-------------------------------------------------
diff --git a/src/devices/bus/nes/datach.h b/src/devices/bus/nes/datach.h
index 5d4decd64fa..81865baa69f 100644
--- a/src/devices/bus/nes/datach.h
+++ b/src/devices/bus/nes/datach.h
@@ -25,7 +25,7 @@ public:
virtual ~datach_cart_interface();
// reading and writing
- virtual DECLARE_READ8_MEMBER(read);
+ virtual uint8_t read(offs_t offset);
uint8_t *get_cart_base() { return m_rom; }
void write_prg_bank(uint8_t bank) { m_bank = bank; }
@@ -52,6 +52,15 @@ class nes_datach_slot_device : public device_t,
friend class nes_datach_device;
public:
// construction/destruction
+ template <typename T>
+ nes_datach_slot_device(machine_config const &mconfig, char const *tag, device_t *owner, uint32_t clock, T &&opts)
+ : nes_datach_slot_device(mconfig, tag, owner, clock)
+ {
+ option_reset();
+ opts(*this);
+ set_default_option(nullptr);
+ set_fixed(false);
+ }
nes_datach_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
virtual ~nes_datach_slot_device();
@@ -74,7 +83,7 @@ public:
// slot interface overrides
virtual std::string get_default_card_software(get_default_card_software_hook &hook) const override;
- virtual DECLARE_READ8_MEMBER(read);
+ uint8_t read(offs_t offset);
void write_prg_bank(uint8_t bank) { if (m_cart) m_cart->write_prg_bank(bank); }
protected:
@@ -85,11 +94,6 @@ protected:
DECLARE_DEVICE_TYPE(NES_DATACH_SLOT, nes_datach_slot_device)
-#define MCFG_DATACH_MINICART_ADD(_tag, _slot_intf) \
- MCFG_DEVICE_ADD(_tag, NES_DATACH_SLOT, 0) \
- MCFG_DEVICE_SLOT_INTERFACE(_slot_intf, nullptr, false)
-
-
//--------------------------------
//
// Datach Minicart implementation
@@ -148,9 +152,9 @@ public:
// construction/destruction
nes_datach_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- virtual DECLARE_READ8_MEMBER(read_m) override;
- virtual DECLARE_READ8_MEMBER(read_h) override;
- virtual DECLARE_WRITE8_MEMBER(write_h) override;
+ virtual uint8_t read_m(offs_t offset) override;
+ virtual uint8_t read_h(offs_t offset) override;
+ virtual void write_h(offs_t offset, uint8_t data) override;
virtual void pcb_reset() override;
diff --git a/src/devices/bus/nes/discrete.cpp b/src/devices/bus/nes/discrete.cpp
index 2e1f6a4c81b..2fb7883d063 100644
--- a/src/devices/bus/nes/discrete.cpp
+++ b/src/devices/bus/nes/discrete.cpp
@@ -134,7 +134,7 @@ void nes_74x161x138_device::pcb_reset()
-------------------------------------------------*/
// there are two 'variants' depending on hardwired or mapper ctrl mirroring
-WRITE8_MEMBER(nes_74x161x161x32_device::write_h)
+void nes_74x161x161x32_device::write_h(offs_t offset, uint8_t data)
{
LOG_MMC(("74x161x161x32 write_h, offset: %04x, data: %02x\n", offset, data));
@@ -155,7 +155,7 @@ WRITE8_MEMBER(nes_74x161x161x32_device::write_h)
-------------------------------------------------*/
-WRITE8_MEMBER(nes_74x139x74_device::write_m)
+void nes_74x139x74_device::write_m(offs_t offset, uint8_t data)
{
LOG_MMC(("74x139x74 write_m, offset: %04x, data: %02x\n", offset, data));
@@ -179,7 +179,7 @@ WRITE8_MEMBER(nes_74x139x74_device::write_m)
-------------------------------------------------*/
-WRITE8_MEMBER(nes_74x377_device::write_h)
+void nes_74x377_device::write_h(offs_t offset, uint8_t data)
{
LOG_MMC(("74x377 write_h, offset: %04x, data: %02x\n", offset, data));
@@ -200,7 +200,7 @@ WRITE8_MEMBER(nes_74x377_device::write_h)
-------------------------------------------------*/
-WRITE8_MEMBER(nes_74x161x138_device::write_m)
+void nes_74x161x138_device::write_m(offs_t offset, uint8_t data)
{
LOG_MMC(("74x161x138 write_m, offset: %04x, data: %02x\n", offset, data));
diff --git a/src/devices/bus/nes/discrete.h b/src/devices/bus/nes/discrete.h
index 51576a77e41..861b8b643bf 100644
--- a/src/devices/bus/nes/discrete.h
+++ b/src/devices/bus/nes/discrete.h
@@ -16,7 +16,7 @@ public:
// construction/destruction
nes_74x161x161x32_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- virtual DECLARE_WRITE8_MEMBER(write_h) override;
+ virtual void write_h(offs_t offset, uint8_t data) override;
virtual void pcb_reset() override;
@@ -34,7 +34,7 @@ public:
// construction/destruction
nes_74x139x74_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- virtual DECLARE_WRITE8_MEMBER(write_m) override;
+ virtual void write_m(offs_t offset, uint8_t data) override;
virtual void pcb_reset() override;
@@ -52,7 +52,7 @@ public:
// construction/destruction
nes_74x377_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- virtual DECLARE_WRITE8_MEMBER(write_h) override;
+ virtual void write_h(offs_t offset, uint8_t data) override;
virtual void pcb_reset() override;
@@ -70,7 +70,7 @@ public:
// construction/destruction
nes_74x161x138_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- virtual DECLARE_WRITE8_MEMBER(write_m) override;
+ virtual void write_m(offs_t offset, uint8_t data) override;
virtual void pcb_reset() override;
diff --git a/src/devices/bus/nes/disksys.cpp b/src/devices/bus/nes/disksys.cpp
index 0f350fb7922..71101492822 100644
--- a/src/devices/bus/nes/disksys.cpp
+++ b/src/devices/bus/nes/disksys.cpp
@@ -51,9 +51,10 @@ static const floppy_interface nes_floppy_interface =
// device_add_mconfig - add device configuration
//-------------------------------------------------
-MACHINE_CONFIG_START(nes_disksys_device::device_add_mconfig)
- MCFG_LEGACY_FLOPPY_DRIVE_ADD(FLOPPY_0, nes_floppy_interface)
-MACHINE_CONFIG_END
+void nes_disksys_device::device_add_mconfig(machine_config &config)
+{
+ LEGACY_FLOPPY(config, FLOPPY_0, 0, &nes_floppy_interface);
+}
ROM_START( disksys )
@@ -172,7 +173,7 @@ void nes_disksys_device::pcb_reset()
-------------------------------------------------*/
-WRITE8_MEMBER(nes_disksys_device::write_h)
+void nes_disksys_device::write_h(offs_t offset, uint8_t data)
{
LOG_MMC(("Famicom Disk System write_h, offset %04x, data: %02x\n", offset, data));
@@ -180,7 +181,7 @@ WRITE8_MEMBER(nes_disksys_device::write_h)
m_prgram[offset + 0x2000] = data;
}
-READ8_MEMBER(nes_disksys_device::read_h)
+uint8_t nes_disksys_device::read_h(offs_t offset)
{
LOG_MMC(("Famicom Disk System read_h, offset: %04x\n", offset));
@@ -190,13 +191,13 @@ READ8_MEMBER(nes_disksys_device::read_h)
return m_2c33_rom[offset & 0x1fff];
}
-WRITE8_MEMBER(nes_disksys_device::write_m)
+void nes_disksys_device::write_m(offs_t offset, uint8_t data)
{
LOG_MMC(("Famicom Disk System write_m, offset: %04x, data: %02x\n", offset, data));
m_prgram[offset] = data;
}
-READ8_MEMBER(nes_disksys_device::read_m)
+uint8_t nes_disksys_device::read_m(offs_t offset)
{
LOG_MMC(("Famicom Disk System read_m, offset: %04x\n", offset));
return m_prgram[offset];
@@ -208,7 +209,7 @@ void nes_disksys_device::hblank_irq(int scanline, int vblank, int blanked)
hold_irq_line();
}
-WRITE8_MEMBER(nes_disksys_device::write_ex)
+void nes_disksys_device::write_ex(offs_t offset, uint8_t data)
{
LOG_MMC(("Famicom Disk System write_ex, offset: %04x, data: %02x\n", offset, data));
@@ -280,7 +281,7 @@ WRITE8_MEMBER(nes_disksys_device::write_ex)
}
}
-READ8_MEMBER(nes_disksys_device::read_ex)
+uint8_t nes_disksys_device::read_ex(offs_t offset)
{
LOG_MMC(("Famicom Disk System read_ex, offset: %04x\n", offset));
uint8_t ret;
diff --git a/src/devices/bus/nes/disksys.h b/src/devices/bus/nes/disksys.h
index 907ee06abef..1e3e45afb1e 100644
--- a/src/devices/bus/nes/disksys.h
+++ b/src/devices/bus/nes/disksys.h
@@ -17,12 +17,12 @@ public:
// construction/destruction
nes_disksys_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- virtual DECLARE_READ8_MEMBER(read_ex) override;
- virtual DECLARE_READ8_MEMBER(read_m) override;
- virtual DECLARE_READ8_MEMBER(read_h) override;
- virtual DECLARE_WRITE8_MEMBER(write_ex) override;
- virtual DECLARE_WRITE8_MEMBER(write_m) override;
- virtual DECLARE_WRITE8_MEMBER(write_h) override;
+ virtual uint8_t read_ex(offs_t offset) override;
+ virtual uint8_t read_m(offs_t offset) override;
+ virtual uint8_t read_h(offs_t offset) override;
+ virtual void write_ex(offs_t offset, uint8_t data) override;
+ virtual void write_m(offs_t offset, uint8_t data) override;
+ virtual void write_h(offs_t offset, uint8_t data) override;
virtual void disk_flip_side() override;
diff --git a/src/devices/bus/nes/ggenie.cpp b/src/devices/bus/nes/ggenie.cpp
index 462c9c5da37..bb5866feac7 100644
--- a/src/devices/bus/nes/ggenie.cpp
+++ b/src/devices/bus/nes/ggenie.cpp
@@ -80,7 +80,7 @@ void nes_ggenie_device::pcb_reset()
-------------------------------------------------*/
-WRITE8_MEMBER(nes_ggenie_device::write_h)
+void nes_ggenie_device::write_h(offs_t offset, uint8_t data)
{
// LOG_MMC(("axrom write_h, offset: %04x, data: %02x\n", offset, data));
if (!m_gg_bypass)
@@ -150,22 +150,22 @@ WRITE8_MEMBER(nes_ggenie_device::write_h)
}
}
else
- m_ggslot->write_h(space, offset, data, mem_mask);
+ m_ggslot->write_h(offset, data);
}
-WRITE8_MEMBER(nes_ggenie_device::write_m)
+void nes_ggenie_device::write_m(offs_t offset, uint8_t data)
{
if (m_gg_bypass && m_ggslot)
- m_ggslot->write_m(space, offset, data, mem_mask);
+ m_ggslot->write_m(offset, data);
}
-WRITE8_MEMBER(nes_ggenie_device::write_l)
+void nes_ggenie_device::write_l(offs_t offset, uint8_t data)
{
if (m_gg_bypass && m_ggslot)
- m_ggslot->write_l(space, offset, data, mem_mask);
+ m_ggslot->write_l(offset, data);
}
-READ8_MEMBER(nes_ggenie_device::read_h)
+uint8_t nes_ggenie_device::read_h(offs_t offset)
{
if (m_gg_bypass && m_ggslot->m_cart)
{
@@ -186,29 +186,29 @@ READ8_MEMBER(nes_ggenie_device::read_h)
return hi_access_rom(offset);
}
-READ8_MEMBER(nes_ggenie_device::read_m)
+uint8_t nes_ggenie_device::read_m(offs_t offset)
{
if (m_gg_bypass && m_ggslot->m_cart)
- return m_ggslot->m_cart->read_m(space, offset, mem_mask);
+ return m_ggslot->m_cart->read_m(offset);
return 0xff;
}
-READ8_MEMBER(nes_ggenie_device::read_l)
+uint8_t nes_ggenie_device::read_l(offs_t offset)
{
if (m_gg_bypass && m_ggslot->m_cart)
- return m_ggslot->m_cart->read_l(space, offset, mem_mask);
+ return m_ggslot->m_cart->read_l(offset);
return 0xff;
}
-WRITE8_MEMBER(nes_ggenie_device::chr_w)
+void nes_ggenie_device::chr_w(offs_t offset, uint8_t data)
{
int bank = offset >> 10;
if (m_gg_bypass && m_ggslot->m_cart)
{
- m_ggslot->m_cart->chr_w(space, offset, data, mem_mask);
+ m_ggslot->m_cart->chr_w(offset, data);
return;
}
@@ -216,24 +216,24 @@ WRITE8_MEMBER(nes_ggenie_device::chr_w)
m_chr_access[bank][offset & 0x3ff] = data;
}
-READ8_MEMBER(nes_ggenie_device::chr_r)
+uint8_t nes_ggenie_device::chr_r(offs_t offset)
{
int bank = offset >> 10;
if (m_gg_bypass && m_ggslot->m_cart)
- return m_ggslot->m_cart->chr_r(space, offset, mem_mask);
+ return m_ggslot->m_cart->chr_r(offset);
return m_chr_access[bank][offset & 0x3ff];
}
-WRITE8_MEMBER(nes_ggenie_device::nt_w)
+void nes_ggenie_device::nt_w(offs_t offset, uint8_t data)
{
int page = ((offset & 0xc00) >> 10);
if (m_gg_bypass && m_ggslot->m_cart)
{
- m_ggslot->m_cart->nt_w(space, offset, data, mem_mask);
+ m_ggslot->m_cart->nt_w(offset, data);
return;
}
@@ -243,12 +243,12 @@ WRITE8_MEMBER(nes_ggenie_device::nt_w)
m_nt_access[page][offset & 0x3ff] = data;
}
-READ8_MEMBER(nes_ggenie_device::nt_r)
+uint8_t nes_ggenie_device::nt_r(offs_t offset)
{
int page = ((offset & 0xc00) >> 10);
if (m_gg_bypass && m_ggslot->m_cart)
- return m_ggslot->m_cart->nt_r(space, offset, mem_mask);
+ return m_ggslot->m_cart->nt_r(offset);
return m_nt_access[page][offset & 0x3ff];
}
diff --git a/src/devices/bus/nes/ggenie.h b/src/devices/bus/nes/ggenie.h
index 1ca577ec7b0..2d6974be849 100644
--- a/src/devices/bus/nes/ggenie.h
+++ b/src/devices/bus/nes/ggenie.h
@@ -16,17 +16,17 @@ public:
// construction/destruction
nes_ggenie_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- virtual DECLARE_READ8_MEMBER(read_l) override;
- virtual DECLARE_READ8_MEMBER(read_m) override;
- virtual DECLARE_READ8_MEMBER(read_h) override;
- virtual DECLARE_WRITE8_MEMBER(write_l) override;
- virtual DECLARE_WRITE8_MEMBER(write_m) override;
- virtual DECLARE_WRITE8_MEMBER(write_h) override;
-
- virtual DECLARE_READ8_MEMBER(chr_r) override;
- virtual DECLARE_WRITE8_MEMBER(chr_w) override;
- virtual DECLARE_READ8_MEMBER(nt_r) override;
- virtual DECLARE_WRITE8_MEMBER(nt_w) override;
+ virtual uint8_t read_l(offs_t offset) override;
+ virtual uint8_t read_m(offs_t offset) override;
+ virtual uint8_t read_h(offs_t offset) override;
+ virtual void write_l(offs_t offset, uint8_t data) override;
+ virtual void write_m(offs_t offset, uint8_t data) override;
+ virtual void write_h(offs_t offset, uint8_t data) override;
+
+ virtual uint8_t chr_r(offs_t offset) override;
+ virtual void chr_w(offs_t offset, uint8_t data) override;
+ virtual uint8_t nt_r(offs_t offset) override;
+ virtual void nt_w(offs_t offset, uint8_t data) override;
void hblank_irq(int scanline, int vblank, int blanked) override { if (m_gg_bypass && m_ggslot->m_cart) m_ggslot->m_cart->hblank_irq(scanline, vblank, blanked); }
void scanline_irq(int scanline, int vblank, int blanked) override { if (m_gg_bypass && m_ggslot->m_cart) m_ggslot->m_cart->scanline_irq(scanline, vblank, blanked); }
diff --git a/src/devices/bus/nes/henggedianzi.cpp b/src/devices/bus/nes/henggedianzi.cpp
index 5d75850a0c8..0f9acd05d45 100644
--- a/src/devices/bus/nes/henggedianzi.cpp
+++ b/src/devices/bus/nes/henggedianzi.cpp
@@ -135,7 +135,7 @@ void nes_hengg_shjy3_device::pcb_reset()
-------------------------------------------------*/
-WRITE8_MEMBER(nes_hengg_srich_device::write_h)
+void nes_hengg_srich_device::write_h(offs_t offset, uint8_t data)
{
LOG_MMC(("hengg_srich write_h, offset: %04x, data: %02x\n", offset, data));
@@ -162,7 +162,7 @@ WRITE8_MEMBER(nes_hengg_srich_device::write_h)
-------------------------------------------------*/
-WRITE8_MEMBER(nes_hengg_xhzs_device::write_l)
+void nes_hengg_xhzs_device::write_l(offs_t offset, uint8_t data)
{
LOG_MMC(("hengg_xhzs write_l, offset: %04x, data: %02x\n", offset, data));
offset += 0x4100;
@@ -171,7 +171,7 @@ WRITE8_MEMBER(nes_hengg_xhzs_device::write_l)
prg32(data >> 1);
}
-WRITE8_MEMBER(nes_hengg_xhzs_device::write_h)
+void nes_hengg_xhzs_device::write_h(offs_t offset, uint8_t data)
{
LOG_MMC(("hengg_xhzs write_h, offset: %04x, data: %02x\n", offset, data));
@@ -225,7 +225,7 @@ void nes_hengg_shjy3_device::update_banks()
}
}
-WRITE8_MEMBER(nes_hengg_shjy3_device::write_h)
+void nes_hengg_shjy3_device::write_h(offs_t offset, uint8_t data)
{
LOG_MMC(("shjy3 write_h, offset: %04x, data: %02x\n", offset, data));
diff --git a/src/devices/bus/nes/henggedianzi.h b/src/devices/bus/nes/henggedianzi.h
index d74da743425..0bf0b2faebc 100644
--- a/src/devices/bus/nes/henggedianzi.h
+++ b/src/devices/bus/nes/henggedianzi.h
@@ -16,7 +16,7 @@ public:
// construction/destruction
nes_hengg_srich_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- virtual DECLARE_WRITE8_MEMBER(write_h) override;
+ virtual void write_h(offs_t offset, uint8_t data) override;
virtual void pcb_reset() override;
@@ -34,8 +34,8 @@ public:
// construction/destruction
nes_hengg_xhzs_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- virtual DECLARE_WRITE8_MEMBER(write_l) override;
- virtual DECLARE_WRITE8_MEMBER(write_h) override;
+ virtual void write_l(offs_t offset, uint8_t data) override;
+ virtual void write_h(offs_t offset, uint8_t data) override;
virtual void pcb_reset() override;
@@ -53,7 +53,7 @@ public:
// construction/destruction
nes_hengg_shjy3_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- virtual DECLARE_WRITE8_MEMBER(write_h) override;
+ virtual void write_h(offs_t offset, uint8_t data) override;
virtual void hblank_irq(int scanline, int vblank, int blanked) override;
virtual void pcb_reset() override;
diff --git a/src/devices/bus/nes/hes.cpp b/src/devices/bus/nes/hes.cpp
index 8d1d3a7a590..946ea1f9585 100644
--- a/src/devices/bus/nes/hes.cpp
+++ b/src/devices/bus/nes/hes.cpp
@@ -73,7 +73,7 @@ void nes_hes_device::pcb_reset()
-------------------------------------------------*/
-WRITE8_MEMBER(nes_hes_device::write_l)
+void nes_hes_device::write_l(offs_t offset, uint8_t data)
{
LOG_MMC(("hes write_l, offset: %04x, data: %02x\n", offset, data));
diff --git a/src/devices/bus/nes/hes.h b/src/devices/bus/nes/hes.h
index d45d20a1a3f..ea72578ad98 100644
--- a/src/devices/bus/nes/hes.h
+++ b/src/devices/bus/nes/hes.h
@@ -16,7 +16,7 @@ public:
// construction/destruction
nes_hes_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- virtual DECLARE_WRITE8_MEMBER(write_l) override;
+ virtual void write_l(offs_t offset, uint8_t data) override;
virtual void pcb_reset() override;
diff --git a/src/devices/bus/nes/hosenkan.cpp b/src/devices/bus/nes/hosenkan.cpp
index 4200655897e..ae7749b7e9a 100644
--- a/src/devices/bus/nes/hosenkan.cpp
+++ b/src/devices/bus/nes/hosenkan.cpp
@@ -105,7 +105,7 @@ void nes_hosenkan_device::hblank_irq( int scanline, int vblank, int blanked )
m_irq_clear = 0;
}
-WRITE8_MEMBER(nes_hosenkan_device::write_h)
+void nes_hosenkan_device::write_h(offs_t offset, uint8_t data)
{
LOG_MMC(("hosenkan write_h, offset: %04x, data: %02x\n", offset, data));
diff --git a/src/devices/bus/nes/hosenkan.h b/src/devices/bus/nes/hosenkan.h
index 153638a9cbe..163aef76edc 100644
--- a/src/devices/bus/nes/hosenkan.h
+++ b/src/devices/bus/nes/hosenkan.h
@@ -16,7 +16,7 @@ public:
// construction/destruction
nes_hosenkan_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- virtual DECLARE_WRITE8_MEMBER(write_h) override;
+ virtual void write_h(offs_t offset, uint8_t data) override;
virtual void hblank_irq(int scanline, int vblank, int blanked) override;
virtual void pcb_reset() override;
diff --git a/src/devices/bus/nes/irem.cpp b/src/devices/bus/nes/irem.cpp
index 15ef687dbea..c55cb588506 100644
--- a/src/devices/bus/nes/irem.cpp
+++ b/src/devices/bus/nes/irem.cpp
@@ -166,7 +166,7 @@ void nes_h3001_device::pcb_reset()
-------------------------------------------------*/
-WRITE8_MEMBER(nes_lrog017_device::write_h)
+void nes_lrog017_device::write_h(offs_t offset, uint8_t data)
{
LOG_MMC(("lrog017 write_h, offset: %04x, data: %02x\n", offset, data));
@@ -185,7 +185,7 @@ WRITE8_MEMBER(nes_lrog017_device::write_h)
-------------------------------------------------*/
-WRITE8_MEMBER(nes_holydivr_device::write_h)
+void nes_holydivr_device::write_h(offs_t offset, uint8_t data)
{
LOG_MMC(("holy diver write_h, offset: %04x, data: %02x\n", offset, data));
@@ -209,7 +209,7 @@ WRITE8_MEMBER(nes_holydivr_device::write_h)
-------------------------------------------------*/
-WRITE8_MEMBER(nes_tam_s1_device::write_h)
+void nes_tam_s1_device::write_h(offs_t offset, uint8_t data)
{
LOG_MMC(("tam s1 write_h, offset: %04x, data: %02x\n", offset, data));
@@ -233,7 +233,7 @@ WRITE8_MEMBER(nes_tam_s1_device::write_h)
-------------------------------------------------*/
-WRITE8_MEMBER(nes_g101_device::write_h)
+void nes_g101_device::write_h(offs_t offset, uint8_t data)
{
LOG_MMC(("g101 write_h, offset: %04x, data: %02x\n", offset, data));
@@ -299,7 +299,7 @@ void nes_h3001_device::device_timer(emu_timer &timer, device_timer_id id, int pa
}
}
-WRITE8_MEMBER(nes_h3001_device::write_h)
+void nes_h3001_device::write_h(offs_t offset, uint8_t data)
{
LOG_MMC(("h3001 write_h, offset %04x, data: %02x\n", offset, data));
diff --git a/src/devices/bus/nes/irem.h b/src/devices/bus/nes/irem.h
index a50077e70a3..82fd0815c38 100644
--- a/src/devices/bus/nes/irem.h
+++ b/src/devices/bus/nes/irem.h
@@ -16,7 +16,7 @@ public:
// construction/destruction
nes_lrog017_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- virtual DECLARE_WRITE8_MEMBER(write_h) override;
+ virtual void write_h(offs_t offset, uint8_t data) override;
virtual void pcb_reset() override;
@@ -34,7 +34,7 @@ public:
// construction/destruction
nes_holydivr_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- virtual DECLARE_WRITE8_MEMBER(write_h) override;
+ virtual void write_h(offs_t offset, uint8_t data) override;
virtual void pcb_reset() override;
@@ -52,7 +52,7 @@ public:
// construction/destruction
nes_tam_s1_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- virtual DECLARE_WRITE8_MEMBER(write_h) override;
+ virtual void write_h(offs_t offset, uint8_t data) override;
virtual void pcb_reset() override;
@@ -70,7 +70,7 @@ public:
// construction/destruction
nes_g101_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- virtual DECLARE_WRITE8_MEMBER(write_h) override;
+ virtual void write_h(offs_t offset, uint8_t data) override;
virtual void pcb_reset() override;
@@ -90,7 +90,7 @@ public:
// construction/destruction
nes_h3001_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- virtual DECLARE_WRITE8_MEMBER(write_h) override;
+ virtual void write_h(offs_t offset, uint8_t data) override;
virtual void pcb_reset() override;
diff --git a/src/devices/bus/nes/jaleco.cpp b/src/devices/bus/nes/jaleco.cpp
index 907580d6a1e..740c3c799b8 100644
--- a/src/devices/bus/nes/jaleco.cpp
+++ b/src/devices/bus/nes/jaleco.cpp
@@ -253,7 +253,7 @@ void nes_ss88006_device::pcb_reset()
-------------------------------------------------*/
-WRITE8_MEMBER(nes_jf11_device::write_m)
+void nes_jf11_device::write_m(offs_t offset, uint8_t data)
{
LOG_MMC(("jf11 write_m, offset: %04x, data: %02x\n", offset, data));
chr8(data, CHRROM);
@@ -274,7 +274,7 @@ WRITE8_MEMBER(nes_jf11_device::write_m)
-------------------------------------------------*/
-WRITE8_MEMBER(nes_jf13_device::write_m)
+void nes_jf13_device::write_m(offs_t offset, uint8_t data)
{
LOG_MMC(("jf13 write_m, offset: %04x, data: %02x\n", offset, data));
@@ -301,7 +301,7 @@ WRITE8_MEMBER(nes_jf13_device::write_m)
-------------------------------------------------*/
-WRITE8_MEMBER(nes_jf16_device::write_h)
+void nes_jf16_device::write_h(offs_t offset, uint8_t data)
{
LOG_MMC(("jf16 write_h, offset: %04x, data: %02x\n", offset, data));
@@ -330,7 +330,7 @@ WRITE8_MEMBER(nes_jf16_device::write_h)
-------------------------------------------------*/
-WRITE8_MEMBER(nes_jf17_device::write_h)
+void nes_jf17_device::write_h(offs_t offset, uint8_t data)
{
LOG_MMC(("jf17 write_h, offset: %04x, data: %02x\n", offset, data));
@@ -345,7 +345,7 @@ WRITE8_MEMBER(nes_jf17_device::write_h)
m_latch = data;
}
-WRITE8_MEMBER(nes_jf17_adpcm_device::write_h)
+void nes_jf17_adpcm_device::write_h(offs_t offset, uint8_t data)
{
LOG_MMC(("jf17 + ADPCM write_h, offset: %04x, data: %02x\n", offset, data));
@@ -379,7 +379,7 @@ WRITE8_MEMBER(nes_jf17_adpcm_device::write_h)
-------------------------------------------------*/
-WRITE8_MEMBER(nes_jf19_device::write_h)
+void nes_jf19_device::write_h(offs_t offset, uint8_t data)
{
LOG_MMC(("jf19 write_h, offset: %04x, data: %02x\n", offset, data));
@@ -392,7 +392,7 @@ WRITE8_MEMBER(nes_jf19_device::write_h)
chr8(data & 0x0f, CHRROM);
}
-WRITE8_MEMBER(nes_jf19_adpcm_device::write_h)
+void nes_jf19_adpcm_device::write_h(offs_t offset, uint8_t data)
{
LOG_MMC(("jf19 + ADPCM write_h, offset: %04x, data: %02x\n", offset, data));
@@ -474,7 +474,7 @@ void nes_ss88006_device::device_timer(emu_timer &timer, device_timer_id id, int
}
}
-WRITE8_MEMBER(nes_ss88006_device::ss88006_write)
+void nes_ss88006_device::ss88006_write(offs_t offset, uint8_t data)
{
uint8_t bank;
LOG_MMC(("ss88006 write_h, offset: %04x, data: %02x\n", offset, data));
@@ -564,7 +564,7 @@ WRITE8_MEMBER(nes_ss88006_device::ss88006_write)
// bits2-bits6 are sample number, bit1 is setup/enable/disable
// program first write sample # + bit1 set to 'init' the sample
// then it writes sample # + bit1 clear to 'start' the sample
-void nes_ss88006_adpcm_device::ss88006_adpcm_write(address_space &space, offs_t offset, uint8_t data, samples_device *dev)
+void nes_ss88006_adpcm_device::ss88006_adpcm_write(offs_t offset, uint8_t data, samples_device &dev)
{
LOG_MMC(("ss88006 write_h, offset: %04x, data: %02x\n", offset, data));
@@ -575,13 +575,13 @@ void nes_ss88006_adpcm_device::ss88006_adpcm_write(address_space &space, offs_t
{
// printf("sample write: data: %02x\n", data);
if ((m_latch & 2) && !(data & 2))
- dev->start((data >> 2) & 0x1f, (data >> 2) & 0x1f);
+ dev.start((data >> 2) & 0x1f, (data >> 2) & 0x1f);
}
m_latch = data;
break;
default:
- ss88006_write(space, offset, data);
+ ss88006_write(offset, data);
break;
}
}
diff --git a/src/devices/bus/nes/jaleco.h b/src/devices/bus/nes/jaleco.h
index ed8c04da7a0..53cc5716ce3 100644
--- a/src/devices/bus/nes/jaleco.h
+++ b/src/devices/bus/nes/jaleco.h
@@ -17,7 +17,7 @@ public:
// construction/destruction
nes_jf11_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- virtual DECLARE_WRITE8_MEMBER(write_m) override;
+ virtual void write_m(offs_t offset, uint8_t data) override;
virtual void pcb_reset() override;
@@ -35,7 +35,7 @@ public:
// construction/destruction
nes_jf13_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- virtual DECLARE_WRITE8_MEMBER(write_m) override;
+ virtual void write_m(offs_t offset, uint8_t data) override;
virtual void pcb_reset() override;
@@ -58,7 +58,7 @@ public:
// construction/destruction
nes_jf16_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- virtual DECLARE_WRITE8_MEMBER(write_h) override;
+ virtual void write_h(offs_t offset, uint8_t data) override;
virtual void pcb_reset() override;
@@ -76,7 +76,7 @@ public:
// construction/destruction
nes_jf17_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- virtual DECLARE_WRITE8_MEMBER(write_h) override;
+ virtual void write_h(offs_t offset, uint8_t data) override;
virtual void pcb_reset() override;
@@ -98,7 +98,7 @@ public:
// construction/destruction
nes_jf17_adpcm_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- virtual DECLARE_WRITE8_MEMBER(write_h) override;
+ virtual void write_h(offs_t offset, uint8_t data) override;
protected:
virtual void device_add_mconfig(machine_config &config) override;
@@ -116,7 +116,7 @@ public:
// construction/destruction
nes_jf19_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- virtual DECLARE_WRITE8_MEMBER(write_h) override;
+ virtual void write_h(offs_t offset, uint8_t data) override;
virtual void pcb_reset() override;
@@ -136,7 +136,7 @@ public:
// construction/destruction
nes_jf19_adpcm_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- virtual DECLARE_WRITE8_MEMBER(write_h) override;
+ virtual void write_h(offs_t offset, uint8_t data) override;
protected:
virtual void device_add_mconfig(machine_config &config) override;
@@ -154,8 +154,8 @@ public:
// construction/destruction
nes_ss88006_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- virtual DECLARE_WRITE8_MEMBER(ss88006_write);
- virtual DECLARE_WRITE8_MEMBER(write_h) override { ss88006_write(space, offset, data, mem_mask); }
+ void ss88006_write(offs_t offset, uint8_t data);
+ virtual void write_h(offs_t offset, uint8_t data) override { ss88006_write(offset, data); }
virtual void pcb_reset() override;
@@ -188,7 +188,7 @@ protected:
// construction/destruction
nes_ss88006_adpcm_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock);
- void ss88006_adpcm_write(address_space &space, offs_t offset, uint8_t data, samples_device *dev);
+ void ss88006_adpcm_write(offs_t offset, uint8_t data, samples_device &dev);
};
@@ -204,7 +204,7 @@ protected:
virtual void device_add_mconfig(machine_config &config) override;
private:
- virtual DECLARE_WRITE8_MEMBER(write_h) override { ss88006_adpcm_write(space, offset, data, m_samples); }
+ virtual void write_h(offs_t offset, uint8_t data) override { ss88006_adpcm_write(offset, data, *m_samples); }
required_device<samples_device> m_samples;
};
@@ -222,7 +222,7 @@ protected:
virtual void device_add_mconfig(machine_config &config) override;
private:
- virtual DECLARE_WRITE8_MEMBER(write_h) override { ss88006_adpcm_write(space, offset, data, m_samples); }
+ virtual void write_h(offs_t offset, uint8_t data) override { ss88006_adpcm_write(offset, data, *m_samples); }
required_device<samples_device> m_samples;
};
@@ -240,7 +240,7 @@ protected:
virtual void device_add_mconfig(machine_config &config) override;
private:
- virtual DECLARE_WRITE8_MEMBER(write_h) override { ss88006_adpcm_write(space, offset, data, m_samples); }
+ virtual void write_h(offs_t offset, uint8_t data) override { ss88006_adpcm_write(offset, data, *m_samples); }
required_device<samples_device> m_samples;
};
@@ -258,7 +258,7 @@ protected:
virtual void device_add_mconfig(machine_config &config) override;
private:
- virtual DECLARE_WRITE8_MEMBER(write_h) override { ss88006_adpcm_write(space, offset, data, m_samples); }
+ virtual void write_h(offs_t offset, uint8_t data) override { ss88006_adpcm_write(offset, data, *m_samples); }
required_device<samples_device> m_samples;
};
diff --git a/src/devices/bus/nes/jy.cpp b/src/devices/bus/nes/jy.cpp
index 33c1e6e6cac..8a54624cd5a 100644
--- a/src/devices/bus/nes/jy.cpp
+++ b/src/devices/bus/nes/jy.cpp
@@ -144,14 +144,14 @@ void nes_jy_typea_device::pcb_reset()
-------------------------------------------------*/
-READ8_MEMBER(nes_jy_typea_device::nt_r)
+uint8_t nes_jy_typea_device::nt_r(offs_t offset)
{
int page = ((offset & 0xc00) >> 10);
irq_clock(0, 2);
return m_nt_access[page][offset & 0x3ff];
}
-READ8_MEMBER(nes_jy_typea_device::chr_r)
+uint8_t nes_jy_typea_device::chr_r(offs_t offset)
{
int bank = offset >> 10;
irq_clock(0, 2);
@@ -241,7 +241,7 @@ void nes_jy_typea_device::scanline_irq(int scanline, int vblank, int blanked)
// 0x5000-0x5fff : sort of protection?
-READ8_MEMBER(nes_jy_typea_device::read_l)
+uint8_t nes_jy_typea_device::read_l(offs_t offset)
{
LOG_MMC(("JY Company write_m, offset: %04x\n", offset));
offset += 0x100;
@@ -249,7 +249,7 @@ READ8_MEMBER(nes_jy_typea_device::read_l)
if (offset >= 0x1000 && offset < 0x1800)
{
// bit6/bit7 DSW read
- return m_open_bus & 0x3f;
+ return get_open_bus() & 0x3f;
}
if (offset >= 0x1800)
@@ -262,10 +262,10 @@ READ8_MEMBER(nes_jy_typea_device::read_l)
return m_latch;
}
- return m_open_bus; // open bus
+ return get_open_bus(); // open bus
}
-WRITE8_MEMBER(nes_jy_typea_device::write_l)
+void nes_jy_typea_device::write_l(offs_t offset, uint8_t data)
{
LOG_MMC(("JY Company write_m, offset: %04x, data: %02x\n", offset, data));
offset += 0x100;
@@ -282,14 +282,14 @@ WRITE8_MEMBER(nes_jy_typea_device::write_l)
}
// 0x6000-0x7fff : WRAM or open bus
-READ8_MEMBER(nes_jy_typea_device::read_m)
+uint8_t nes_jy_typea_device::read_m(offs_t offset)
{
LOG_MMC(("JY Company write_m, offset: %04x\n", offset));
if (m_reg[0] & 0x80)
return m_prg[(m_bank_6000 & m_prg_mask) * 0x2000 + (offset & 0x1fff)];
- return m_open_bus; // open bus
+ return get_open_bus(); // open bus
}
@@ -425,7 +425,7 @@ void nes_jy_typea_device::update_banks(int reg)
}
-WRITE8_MEMBER(nes_jy_typea_device::write_h)
+void nes_jy_typea_device::write_h(offs_t offset, uint8_t data)
{
LOG_MMC(("JY Company write_m, offset: %04x, data: %02x\n", offset, data));
@@ -569,7 +569,7 @@ void nes_jy_typec_device::update_mirror_typec()
update_mirror_typea();
}
-READ8_MEMBER(nes_jy_typec_device::chr_r)
+uint8_t nes_jy_typec_device::chr_r(offs_t offset)
{
int bank = offset >> 10;
diff --git a/src/devices/bus/nes/jy.h b/src/devices/bus/nes/jy.h
index 80be5d98631..d318bfae60a 100644
--- a/src/devices/bus/nes/jy.h
+++ b/src/devices/bus/nes/jy.h
@@ -16,13 +16,13 @@ public:
// construction/destruction
nes_jy_typea_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- virtual DECLARE_READ8_MEMBER(read_l) override;
- virtual DECLARE_READ8_MEMBER(read_m) override;
- virtual DECLARE_WRITE8_MEMBER(write_l) override;
- virtual DECLARE_WRITE8_MEMBER(write_h) override;
+ virtual uint8_t read_l(offs_t offset) override;
+ virtual uint8_t read_m(offs_t offset) override;
+ virtual void write_l(offs_t offset, uint8_t data) override;
+ virtual void write_h(offs_t offset, uint8_t data) override;
- virtual DECLARE_READ8_MEMBER(chr_r) override;
- virtual DECLARE_READ8_MEMBER(nt_r) override;
+ virtual uint8_t chr_r(offs_t offset) override;
+ virtual uint8_t nt_r(offs_t offset) override;
virtual void scanline_irq(int scanline, int vblank, int blanked) override;
virtual void pcb_reset() override;
@@ -90,7 +90,7 @@ public:
// construction/destruction
nes_jy_typec_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- virtual DECLARE_READ8_MEMBER(chr_r) override;
+ virtual uint8_t chr_r(offs_t offset) override;
protected:
void update_mirror_typec();
diff --git a/src/devices/bus/nes/kaiser.cpp b/src/devices/bus/nes/kaiser.cpp
index 2e228782785..52690376e4b 100644
--- a/src/devices/bus/nes/kaiser.cpp
+++ b/src/devices/bus/nes/kaiser.cpp
@@ -295,7 +295,7 @@ void nes_ks7037_device::pcb_reset()
-------------------------------------------------*/
-WRITE8_MEMBER(nes_ks7058_device::write_h)
+void nes_ks7058_device::write_h(offs_t offset, uint8_t data)
{
LOG_MMC(("ks7058 write_h, offset: %04x, data: %02x\n", offset, data));
@@ -322,7 +322,7 @@ WRITE8_MEMBER(nes_ks7058_device::write_h)
-------------------------------------------------*/
-WRITE8_MEMBER(nes_ks7022_device::write_h)
+void nes_ks7022_device::write_h(offs_t offset, uint8_t data)
{
LOG_MMC(("ks7022 write_h, offset: %04x, data: %02x\n", offset, data));
@@ -333,7 +333,7 @@ WRITE8_MEMBER(nes_ks7022_device::write_h)
m_latch = data & 0x0f;
}
-READ8_MEMBER(nes_ks7022_device::read_h)
+uint8_t nes_ks7022_device::read_h(offs_t offset)
{
LOG_MMC(("ks7022 read_h, offset: %04x\n", offset));
@@ -388,7 +388,7 @@ void nes_ks7032_device::prg_update()
prg8_cd(m_reg[3]);
}
-WRITE8_MEMBER(nes_ks7032_device::ks7032_write)
+void nes_ks7032_device::ks7032_write(offs_t offset, uint8_t data)
{
LOG_MMC(("ks7032_write, offset: %04x, data: %02x\n", offset, data));
@@ -419,7 +419,7 @@ WRITE8_MEMBER(nes_ks7032_device::ks7032_write)
}
}
-READ8_MEMBER(nes_ks7032_device::read_m)
+uint8_t nes_ks7032_device::read_m(offs_t offset)
{
LOG_MMC(("ks7032 read_m, offset: %04x\n", offset));
return m_prg[((m_reg[4] * 0x2000) + (offset & 0x1fff)) & (m_prg_size - 1)];
@@ -438,7 +438,7 @@ READ8_MEMBER(nes_ks7032_device::read_m)
-------------------------------------------------*/
-WRITE8_MEMBER(nes_ks202_device::write_h)
+void nes_ks202_device::write_h(offs_t offset, uint8_t data)
{
LOG_MMC(("ks202 write_h, offset: %04x, data: %02x\n", offset, data));
@@ -458,12 +458,12 @@ WRITE8_MEMBER(nes_ks202_device::write_h)
}
break;
default:
- ks7032_write(space, offset, data, mem_mask);
+ ks7032_write(offset, data);
break;
}
}
-READ8_MEMBER(nes_ks202_device::read_m)
+uint8_t nes_ks202_device::read_m(offs_t offset)
{
LOG_MMC(("ks202 read_m, offset: %04x\n", offset));
return m_prgram[offset & 0x1fff];
@@ -499,7 +499,7 @@ void nes_ks7017_device::device_timer(emu_timer &timer, device_timer_id id, int p
}
}
-WRITE8_MEMBER(nes_ks7017_device::write_l)
+void nes_ks7017_device::write_l(offs_t offset, uint8_t data)
{
LOG_MMC(("ks7017 write_l, offset: %04x, data: %02x\n", offset, data));
@@ -512,7 +512,7 @@ WRITE8_MEMBER(nes_ks7017_device::write_l)
prg16_89ab(m_latch);
}
-WRITE8_MEMBER(nes_ks7017_device::write_ex)
+void nes_ks7017_device::write_ex(offs_t offset, uint8_t data)
{
LOG_MMC(("ks7017 write_ex, offset: %04x, data: %02x\n", offset, data));
offset += 0x20;
@@ -530,7 +530,7 @@ WRITE8_MEMBER(nes_ks7017_device::write_ex)
set_nt_mirroring(BIT(data, 3) ? PPU_MIRROR_HORZ : PPU_MIRROR_VERT);
}
-READ8_MEMBER(nes_ks7017_device::read_ex)
+uint8_t nes_ks7017_device::read_ex(offs_t offset)
{
LOG_MMC(("ks7017 read_ex, offset: %04x\n", offset));
offset += 0x20;
@@ -542,7 +542,7 @@ READ8_MEMBER(nes_ks7017_device::read_ex)
return temp;
}
- return m_open_bus; // open bus
+ return get_open_bus(); // open bus
}
/*-------------------------------------------------
@@ -557,7 +557,7 @@ READ8_MEMBER(nes_ks7017_device::read_ex)
-------------------------------------------------*/
-WRITE8_MEMBER(nes_ks7012_device::write_h)
+void nes_ks7012_device::write_h(offs_t offset, uint8_t data)
{
LOG_MMC(("ks7012 write_h, offset: %04x, data: %02x\n", offset, data));
@@ -580,13 +580,13 @@ WRITE8_MEMBER(nes_ks7012_device::write_h)
-------------------------------------------------*/
-WRITE8_MEMBER(nes_ks7013b_device::write_m)
+void nes_ks7013b_device::write_m(offs_t offset, uint8_t data)
{
LOG_MMC(("ks7013b write_l, offset: %04x, data: %02x\n", offset, data));
prg16_89ab(data);
}
-WRITE8_MEMBER(nes_ks7013b_device::write_h)
+void nes_ks7013b_device::write_h(offs_t offset, uint8_t data)
{
LOG_MMC(("ks7013b write_h, offset: %04x, data: %02x\n", offset, data));
set_nt_mirroring((data & 1) ? PPU_MIRROR_HORZ : PPU_MIRROR_VERT);
@@ -613,20 +613,20 @@ WRITE8_MEMBER(nes_ks7013b_device::write_h)
-------------------------------------------------*/
-READ8_MEMBER(nes_ks7031_device::read_m)
+uint8_t nes_ks7031_device::read_m(offs_t offset)
{
// LOG_MMC(("ks7031 read_m, offset: %04x\n", offset));
return m_prg[(m_reg[(offset >> 11) & 3] * 0x0800) + (offset & 0x7ff)];
}
-READ8_MEMBER(nes_ks7031_device::read_h)
+uint8_t nes_ks7031_device::read_h(offs_t offset)
{
// here the first 32K are accessed, but in 16x2K blocks loaded in reverse order
int accessed_2k = (offset >> 11) & 0x0f;
return m_prg[((0x0f - accessed_2k) * 0x0800) + (offset & 0x7ff)];
}
-WRITE8_MEMBER(nes_ks7031_device::write_h)
+void nes_ks7031_device::write_h(offs_t offset, uint8_t data)
{
LOG_MMC(("ks7031 write_h, offset: %04x, data: %02x\n", offset, data));
m_reg[(offset >> 11) & 3] = data & 0x3f;
@@ -646,13 +646,13 @@ WRITE8_MEMBER(nes_ks7031_device::write_h)
-------------------------------------------------*/
-READ8_MEMBER(nes_ks7016_device::read_m)
+uint8_t nes_ks7016_device::read_m(offs_t offset)
{
// LOG_MMC(("ks7016 read_m, offset: %04x\n", offset));
return m_prg[((m_reg * 0x2000) + (offset & 0x1fff)) & (m_prg_size - 1)];
}
-WRITE8_MEMBER(nes_ks7016_device::write_h)
+void nes_ks7016_device::write_h(offs_t offset, uint8_t data)
{
LOG_MMC(("ks7016 write_h, offset: %04x, data: %02x\n", offset, data));
uint8_t mask = offset & 0x30;
@@ -692,7 +692,7 @@ void nes_ks7037_device::update_prg()
set_nt_page(3, CIRAM, m_reg[5] & 1, 1);
}
-READ8_MEMBER(nes_ks7037_device::read_m)
+uint8_t nes_ks7037_device::read_m(offs_t offset)
{
// LOG_MMC(("ks7037 read_m, offset: %04x\n", offset));
if (offset < 0x1000)
@@ -701,14 +701,14 @@ READ8_MEMBER(nes_ks7037_device::read_m)
return m_prg[(0x1e * 0x1000) + (offset & 0x0fff)];
}
-WRITE8_MEMBER(nes_ks7037_device::write_m)
+void nes_ks7037_device::write_m(offs_t offset, uint8_t data)
{
LOG_MMC(("ks7037 write_m, offset: %04x, data: %02x\n", offset, data));
if (offset < 0x1000)
m_prgram[offset & 0x0fff] = data;
}
-READ8_MEMBER(nes_ks7037_device::read_h)
+uint8_t nes_ks7037_device::read_h(offs_t offset)
{
// LOG_MMC(("ks7037 read_h, offset: %04x\n", offset));
@@ -718,7 +718,7 @@ READ8_MEMBER(nes_ks7037_device::read_h)
return hi_access_rom(offset);
}
-WRITE8_MEMBER(nes_ks7037_device::write_h)
+void nes_ks7037_device::write_h(offs_t offset, uint8_t data)
{
LOG_MMC(("ks7037 write_h, offset: %04x, data: %02x\n", offset, data));
diff --git a/src/devices/bus/nes/kaiser.h b/src/devices/bus/nes/kaiser.h
index 8c544059aa9..e0e31658cdb 100644
--- a/src/devices/bus/nes/kaiser.h
+++ b/src/devices/bus/nes/kaiser.h
@@ -16,7 +16,7 @@ public:
// construction/destruction
nes_ks7058_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- virtual DECLARE_WRITE8_MEMBER(write_h) override;
+ virtual void write_h(offs_t offset, uint8_t data) override;
virtual void pcb_reset() override;
@@ -34,8 +34,8 @@ public:
// construction/destruction
nes_ks7022_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- virtual DECLARE_READ8_MEMBER(read_h) override;
- virtual DECLARE_WRITE8_MEMBER(write_h) override;
+ virtual uint8_t read_h(offs_t offset) override;
+ virtual void write_h(offs_t offset, uint8_t data) override;
virtual void pcb_reset() override;
@@ -56,9 +56,9 @@ public:
// construction/destruction
nes_ks7032_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- virtual DECLARE_READ8_MEMBER(read_m) override;
- virtual DECLARE_WRITE8_MEMBER(ks7032_write);
- virtual DECLARE_WRITE8_MEMBER(write_h) override { ks7032_write(space, offset, data, mem_mask); }
+ virtual uint8_t read_m(offs_t offset) override;
+ void ks7032_write(offs_t offset, uint8_t data);
+ virtual void write_h(offs_t offset, uint8_t data) override { ks7032_write(offset, data); }
virtual void pcb_reset() override;
@@ -91,8 +91,8 @@ public:
nes_ks202_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
// device-level overrides
- virtual DECLARE_READ8_MEMBER(read_m) override;
- virtual DECLARE_WRITE8_MEMBER(write_h) override;
+ virtual uint8_t read_m(offs_t offset) override;
+ virtual void write_h(offs_t offset, uint8_t data) override;
};
@@ -104,9 +104,9 @@ public:
// construction/destruction
nes_ks7017_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- virtual DECLARE_READ8_MEMBER(read_ex) override;
- virtual DECLARE_WRITE8_MEMBER(write_ex) override;
- virtual DECLARE_WRITE8_MEMBER(write_l) override;
+ virtual uint8_t read_ex(offs_t offset) override;
+ virtual void write_ex(offs_t offset, uint8_t data) override;
+ virtual void write_l(offs_t offset, uint8_t data) override;
virtual void pcb_reset() override;
@@ -135,7 +135,7 @@ public:
// construction/destruction
nes_ks7012_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- virtual DECLARE_WRITE8_MEMBER(write_h) override;
+ virtual void write_h(offs_t offset, uint8_t data) override;
virtual void pcb_reset() override;
@@ -152,8 +152,8 @@ public:
// construction/destruction
nes_ks7013b_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- virtual DECLARE_WRITE8_MEMBER(write_m) override;
- virtual DECLARE_WRITE8_MEMBER(write_h) override;
+ virtual void write_m(offs_t offset, uint8_t data) override;
+ virtual void write_h(offs_t offset, uint8_t data) override;
virtual void pcb_reset() override;
@@ -171,9 +171,9 @@ public:
// construction/destruction
nes_ks7031_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- virtual DECLARE_READ8_MEMBER(read_m) override;
- virtual DECLARE_READ8_MEMBER(read_h) override;
- virtual DECLARE_WRITE8_MEMBER(write_h) override;
+ virtual uint8_t read_m(offs_t offset) override;
+ virtual uint8_t read_h(offs_t offset) override;
+ virtual void write_h(offs_t offset, uint8_t data) override;
virtual void pcb_reset() override;
@@ -194,8 +194,8 @@ public:
// construction/destruction
nes_ks7016_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- virtual DECLARE_READ8_MEMBER(read_m) override;
- virtual DECLARE_WRITE8_MEMBER(write_h) override;
+ virtual uint8_t read_m(offs_t offset) override;
+ virtual void write_h(offs_t offset, uint8_t data) override;
virtual void pcb_reset() override;
@@ -215,10 +215,10 @@ public:
// construction/destruction
nes_ks7037_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- virtual DECLARE_READ8_MEMBER(read_m) override;
- virtual DECLARE_READ8_MEMBER(read_h) override;
- virtual DECLARE_WRITE8_MEMBER(write_m) override;
- virtual DECLARE_WRITE8_MEMBER(write_h) override;
+ virtual uint8_t read_m(offs_t offset) override;
+ virtual uint8_t read_h(offs_t offset) override;
+ virtual void write_m(offs_t offset, uint8_t data) override;
+ virtual void write_h(offs_t offset, uint8_t data) override;
virtual void pcb_reset() override;
diff --git a/src/devices/bus/nes/karastudio.cpp b/src/devices/bus/nes/karastudio.cpp
index 1b828001078..fc98a658213 100644
--- a/src/devices/bus/nes/karastudio.cpp
+++ b/src/devices/bus/nes/karastudio.cpp
@@ -60,7 +60,7 @@ kstudio_cart_interface::~kstudio_cart_interface()
{
}
-READ8_MEMBER(kstudio_cart_interface::read)
+uint8_t kstudio_cart_interface::read(offs_t offset)
{
return m_rom[(m_bank * 0x4000) + (offset & 0x3fff)];
}
@@ -89,10 +89,10 @@ void nes_kstudio_slot_device::device_start()
m_cart = dynamic_cast<kstudio_cart_interface *>(get_card_device());
}
-READ8_MEMBER(nes_kstudio_slot_device::read)
+uint8_t nes_kstudio_slot_device::read(offs_t offset)
{
if (m_cart)
- return m_cart->read(space, offset, mem_mask);
+ return m_cart->read(offset);
return 0xff;
}
@@ -225,29 +225,29 @@ void nes_karaokestudio_device::pcb_reset()
-------------------------------------------------*/
-READ8_MEMBER(nes_karaokestudio_device::read_m)
+uint8_t nes_karaokestudio_device::read_m(offs_t offset)
{
LOG_MMC(("karaoke studio read_m, offset: %04x\n", offset));
return m_mic_ipt->read();
}
-READ8_MEMBER(nes_karaokestudio_device::read_h)
+uint8_t nes_karaokestudio_device::read_h(offs_t offset)
{
LOG_MMC(("karaoke studio read_h, offset: %04x\n", offset));
// this shall be the proper code, but it's a bit slower, so we access directly the subcart below
- //return m_subslot->read(space, offset, mem_mask);
+ //return m_subslot->read(offset);
// access expansion cart only if all of the followings are verified
// * we are in $8000-$bfff range
// * there has been a bankswitch write to map the expansion to such range
// * there actually is an expansion cart mounted
if (offset < 0x4000 && m_exp_active && m_subslot->m_cart)
- return m_subslot->m_cart->read(space, offset, mem_mask);
+ return m_subslot->m_cart->read(offset);
else
return hi_access_rom(offset);
}
-WRITE8_MEMBER(nes_karaokestudio_device::write_h)
+void nes_karaokestudio_device::write_h(offs_t offset, uint8_t data)
{
LOG_MMC(("karaoke studio write_h, offset: %04x, data: %02x\n", offset, data));
// bit3 1 = M ROM (main unit), 0=E ROM (expansion)
@@ -296,6 +296,7 @@ static void karaoke_studio_cart(device_slot_interface &device)
}
-MACHINE_CONFIG_START(nes_karaokestudio_device::device_add_mconfig)
- MCFG_KSTUDIO_MINICART_ADD("exp_slot", karaoke_studio_cart)
-MACHINE_CONFIG_END
+void nes_karaokestudio_device::device_add_mconfig(machine_config &config)
+{
+ NES_KSEXPANSION_SLOT(config, m_subslot, karaoke_studio_cart);
+}
diff --git a/src/devices/bus/nes/karastudio.h b/src/devices/bus/nes/karastudio.h
index bd712722fe9..fcb481f046e 100644
--- a/src/devices/bus/nes/karastudio.h
+++ b/src/devices/bus/nes/karastudio.h
@@ -24,7 +24,7 @@ public:
virtual ~kstudio_cart_interface();
// reading and writing
- virtual DECLARE_READ8_MEMBER(read);
+ virtual uint8_t read(offs_t offset);
uint8_t *get_cart_base() { return m_rom; }
void write_prg_bank(uint8_t bank) { m_bank = bank; }
@@ -49,6 +49,16 @@ class nes_kstudio_slot_device : public device_t,
friend class nes_karaokestudio_device;
public:
// construction/destruction
+ template <typename T>
+ nes_kstudio_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, T &&opts)
+ : nes_kstudio_slot_device(mconfig, tag, owner, (uint32_t)0)
+ {
+ option_reset();
+ opts(*this);
+ set_default_option(nullptr);
+ set_fixed(false);
+ }
+
nes_kstudio_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
virtual ~nes_kstudio_slot_device();
@@ -68,7 +78,7 @@ public:
// slot interface overrides
virtual std::string get_default_card_software(get_default_card_software_hook &hook) const override;
- virtual DECLARE_READ8_MEMBER(read);
+ uint8_t read(offs_t offset);
void write_prg_bank(uint8_t bank) { if (m_cart) m_cart->write_prg_bank(bank); }
protected:
@@ -82,11 +92,6 @@ protected:
DECLARE_DEVICE_TYPE(NES_KSEXPANSION_SLOT, nes_kstudio_slot_device)
-#define MCFG_KSTUDIO_MINICART_ADD(_tag, _slot_intf) \
- MCFG_DEVICE_ADD(_tag, NES_KSEXPANSION_SLOT, 0) \
-MCFG_DEVICE_SLOT_INTERFACE(_slot_intf, nullptr, false)
-
-
//-----------------------------------------------
//
// Karaoke Studio Expansion cart implementation
@@ -130,9 +135,9 @@ public:
// construction/destruction
nes_karaokestudio_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- virtual DECLARE_READ8_MEMBER(read_m) override;
- virtual DECLARE_READ8_MEMBER(read_h) override;
- virtual DECLARE_WRITE8_MEMBER(write_h) override;
+ virtual uint8_t read_m(offs_t offset) override;
+ virtual uint8_t read_h(offs_t offset) override;
+ virtual void write_h(offs_t offset, uint8_t data) override;
virtual void pcb_reset() override;
diff --git a/src/devices/bus/nes/konami.cpp b/src/devices/bus/nes/konami.cpp
index 320ceb1eb9b..2d3f20863cb 100644
--- a/src/devices/bus/nes/konami.cpp
+++ b/src/devices/bus/nes/konami.cpp
@@ -81,7 +81,7 @@ nes_konami_vrc6_device::nes_konami_vrc6_device(const machine_config &mconfig, co
}
nes_konami_vrc7_device::nes_konami_vrc7_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
- : nes_konami_vrc4_device(mconfig, NES_VRC7, tag, owner, clock), m_ym2413(*this, "ym")
+ : nes_konami_vrc4_device(mconfig, NES_VRC7, tag, owner, clock), m_vrc7snd(*this, "vrc7snd")
{
}
@@ -239,7 +239,7 @@ void nes_konami_vrc7_device::pcb_reset()
-------------------------------------------------*/
-WRITE8_MEMBER(nes_konami_vrc1_device::write_h)
+void nes_konami_vrc1_device::write_h(offs_t offset, uint8_t data)
{
LOG_MMC(("VRC-1 write_h, offset: %04x, data: %02x\n", offset, data));
@@ -280,7 +280,7 @@ WRITE8_MEMBER(nes_konami_vrc1_device::write_h)
-------------------------------------------------*/
-READ8_MEMBER(nes_konami_vrc2_device::read_m)
+uint8_t nes_konami_vrc2_device::read_m(offs_t offset)
{
LOG_MMC(("VRC-2 read_m, offset: %04x\n", offset));
@@ -289,10 +289,10 @@ READ8_MEMBER(nes_konami_vrc2_device::read_m)
else if (!m_prgram.empty())
return m_prgram[offset & (m_prgram.size() - 1)];
else // sort of protection? it returns open bus in $7000-$7fff and (open bus & 0xfe) | m_latch in $6000-$6fff
- return (offset < 0x1000) ? ((m_open_bus & 0xfe) | (m_latch & 1)) : m_open_bus;
+ return (offset < 0x1000) ? ((get_open_bus() & 0xfe) | (m_latch & 1)) : get_open_bus();
}
-WRITE8_MEMBER(nes_konami_vrc2_device::write_m)
+void nes_konami_vrc2_device::write_m(offs_t offset, uint8_t data)
{
LOG_MMC(("VRC-2 write_m, offset: %04x, data: %02x\n", offset, data));
@@ -304,7 +304,7 @@ WRITE8_MEMBER(nes_konami_vrc2_device::write_m)
m_latch = data;
}
-WRITE8_MEMBER(nes_konami_vrc2_device::write_h)
+void nes_konami_vrc2_device::write_h(offs_t offset, uint8_t data)
{
uint8_t bank, shift, mask;
uint16_t add_lines = ((offset << (9 - m_vrc_ls_prg_a)) & 0x200) | ((offset << (8 - m_vrc_ls_prg_b)) & 0x100);
@@ -385,7 +385,7 @@ void nes_konami_vrc3_device::device_timer(emu_timer &timer, device_timer_id id,
}
}
-WRITE8_MEMBER(nes_konami_vrc3_device::write_h)
+void nes_konami_vrc3_device::write_h(offs_t offset, uint8_t data)
{
LOG_MMC(("VRC-3 write_h, offset: %04x, data: %02x\n", offset, data));
@@ -482,7 +482,7 @@ void nes_konami_vrc4_device::set_prg()
}
}
-WRITE8_MEMBER(nes_konami_vrc4_device::write_h)
+void nes_konami_vrc4_device::write_h(offs_t offset, uint8_t data)
{
uint8_t bank, shift, mask;
uint16_t add_lines = ((offset << (9 - m_vrc_ls_prg_a)) & 0x200) | ((offset << (8 - m_vrc_ls_prg_b)) & 0x100);
@@ -564,7 +564,7 @@ WRITE8_MEMBER(nes_konami_vrc4_device::write_h)
-------------------------------------------------*/
-WRITE8_MEMBER(nes_konami_vrc6_device::write_h)
+void nes_konami_vrc6_device::write_h(offs_t offset, uint8_t data)
{
uint8_t bank;
uint16_t add_lines = ((offset << (9 - m_vrc_ls_prg_a)) & 0x200) | ((offset << (8 - m_vrc_ls_prg_b)) & 0x100);
@@ -579,10 +579,10 @@ WRITE8_MEMBER(nes_konami_vrc6_device::write_h)
prg8_cd(data);
break;
case 0x1000: // pulse 1 & global control
- m_vrc6snd->write(space, add_lines>>8, data);
+ m_vrc6snd->write(add_lines>>8, data);
break;
case 0x2000: // pulse 2
- m_vrc6snd->write(space, (add_lines>>8) | 0x100, data);
+ m_vrc6snd->write((add_lines>>8) | 0x100, data);
break;
case 0x3000:
if (add_lines == 0x300)
@@ -596,7 +596,7 @@ WRITE8_MEMBER(nes_konami_vrc6_device::write_h)
}
}
else // saw
- m_vrc6snd->write(space, (add_lines>>8) | 0x200, data);
+ m_vrc6snd->write((add_lines>>8) | 0x200, data);
break;
case 0x5000:
case 0x6000:
@@ -637,16 +637,15 @@ WRITE8_MEMBER(nes_konami_vrc6_device::write_h)
// device_add_mconfig - add device configuration
//-------------------------------------------------
-MACHINE_CONFIG_START(nes_konami_vrc6_device::device_add_mconfig)
-
+void nes_konami_vrc6_device::device_add_mconfig(machine_config &config)
+{
// additional sound hardware
SPEAKER(config, "addon").front_center();
// TODO: this is not how VRC6 clock signaling works!
// The board uses the CLK pin in reality, not hardcoded NTSC values!
- MCFG_DEVICE_ADD("vrc6snd", VRC6, XTAL(21'477'272)/12)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "addon", 0.5)
-MACHINE_CONFIG_END
+ VRC6(config, m_vrc6snd, XTAL(21'477'272)/12).add_route(ALL_OUTPUTS, "addon", 0.5);
+}
/*-------------------------------------------------
@@ -660,7 +659,7 @@ MACHINE_CONFIG_END
-------------------------------------------------*/
-WRITE8_MEMBER(nes_konami_vrc7_device::write_h)
+void nes_konami_vrc7_device::write_h(offs_t offset, uint8_t data)
{
uint8_t bank;
LOG_MMC(("VRC-7 write_h, offset: %04x, data: %02x\n", offset, data));
@@ -682,11 +681,11 @@ WRITE8_MEMBER(nes_konami_vrc7_device::write_h)
case 0x1010:
case 0x1018:
- m_ym2413->register_port_w(space, 0, data);
+ m_vrc7snd->register_port_w(data);
break;
case 0x1030:
case 0x1038:
- m_ym2413->data_port_w(space, 0, data);
+ m_vrc7snd->data_port_w(data);
break;
case 0x2000:
@@ -759,15 +758,12 @@ WRITE8_MEMBER(nes_konami_vrc7_device::write_h)
// and has one output pin for audio, multiplexed for all 6 channels; OPLL has two output pins, one for
// FM and one for Rhythm, and has no special status pin.
-// FIXME: we currently emulate this as a base YM2413!
-
-MACHINE_CONFIG_START(nes_konami_vrc7_device::device_add_mconfig)
-
+void nes_konami_vrc7_device::device_add_mconfig(machine_config &config)
+{
// additional sound hardware
SPEAKER(config, "addon").front_center();
// TODO: this is not how VRC7 clock signaling works!
// The board uses the CLK pin in reality, not hardcoded NTSC values!
- MCFG_DEVICE_ADD("ym", YM2413, XTAL(21'477'272)/12)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "addon", 0.5)
-MACHINE_CONFIG_END
+ VRC7(config, m_vrc7snd, XTAL(21'477'272)/6).add_route(0, "addon", 1.0).add_route(1, "addon", 0.0);
+}
diff --git a/src/devices/bus/nes/konami.h b/src/devices/bus/nes/konami.h
index db269170f53..86afa1832e1 100644
--- a/src/devices/bus/nes/konami.h
+++ b/src/devices/bus/nes/konami.h
@@ -18,7 +18,7 @@ public:
// construction/destruction
nes_konami_vrc1_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- virtual DECLARE_WRITE8_MEMBER(write_h) override;
+ virtual void write_h(offs_t offset, uint8_t data) override;
virtual void pcb_reset() override;
@@ -39,9 +39,9 @@ public:
// construction/destruction
nes_konami_vrc2_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- virtual DECLARE_READ8_MEMBER(read_m) override;
- virtual DECLARE_WRITE8_MEMBER(write_m) override;
- virtual DECLARE_WRITE8_MEMBER(write_h) override;
+ virtual uint8_t read_m(offs_t offset) override;
+ virtual void write_m(offs_t offset, uint8_t data) override;
+ virtual void write_h(offs_t offset, uint8_t data) override;
virtual void pcb_reset() override;
@@ -63,7 +63,7 @@ public:
// construction/destruction
nes_konami_vrc3_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- virtual DECLARE_WRITE8_MEMBER(write_h) override;
+ virtual void write_h(offs_t offset, uint8_t data) override;
virtual void pcb_reset() override;
@@ -91,7 +91,7 @@ public:
// construction/destruction
nes_konami_vrc4_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- virtual DECLARE_WRITE8_MEMBER(write_h) override;
+ virtual void write_h(offs_t offset, uint8_t data) override;
virtual void pcb_reset() override;
@@ -126,7 +126,7 @@ public:
// construction/destruction
nes_konami_vrc6_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- virtual DECLARE_WRITE8_MEMBER(write_h) override;
+ virtual void write_h(offs_t offset, uint8_t data) override;
protected:
// device-level overrides
@@ -146,7 +146,7 @@ public:
// construction/destruction
nes_konami_vrc7_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- virtual DECLARE_WRITE8_MEMBER(write_h) override;
+ virtual void write_h(offs_t offset, uint8_t data) override;
virtual void pcb_reset() override;
@@ -157,7 +157,7 @@ protected:
virtual void device_add_mconfig(machine_config &config) override;
private:
- required_device<ym2413_device> m_ym2413;
+ required_device<vrc7snd_device> m_vrc7snd;
};
diff --git a/src/devices/bus/nes/legacy.cpp b/src/devices/bus/nes/legacy.cpp
index d2b1c697296..a3ab9377082 100644
--- a/src/devices/bus/nes/legacy.cpp
+++ b/src/devices/bus/nes/legacy.cpp
@@ -136,7 +136,7 @@ void nes_ffe8_device::pcb_reset()
-------------------------------------------------*/
-WRITE8_MEMBER(nes_ffe3_device::write_h)
+void nes_ffe3_device::write_h(offs_t offset, uint8_t data)
{
LOG_MMC(("mapper8 write_h, offset: %04x, data: %02x\n", offset, data));
@@ -174,7 +174,7 @@ void nes_ffe4_device::device_timer(emu_timer &timer, device_timer_id id, int par
}
}
-WRITE8_MEMBER(nes_ffe4_device::write_l)
+void nes_ffe4_device::write_l(offs_t offset, uint8_t data)
{
LOG_MMC(("mapper6 write_l, offset: %04x, data: %02x\n", offset, data));
@@ -202,7 +202,7 @@ WRITE8_MEMBER(nes_ffe4_device::write_l)
}
}
-WRITE8_MEMBER(nes_ffe4_device::chr_w)
+void nes_ffe4_device::chr_w(offs_t offset, uint8_t data)
{
int bank = offset >> 10;
if (m_exram_enabled)
@@ -212,7 +212,7 @@ WRITE8_MEMBER(nes_ffe4_device::chr_w)
m_chr_access[bank][offset & 0x3ff] = data;
}
-READ8_MEMBER(nes_ffe4_device::chr_r)
+uint8_t nes_ffe4_device::chr_r(offs_t offset)
{
int bank = offset >> 10;
if (m_exram_enabled)
@@ -222,7 +222,7 @@ READ8_MEMBER(nes_ffe4_device::chr_r)
}
-WRITE8_MEMBER(nes_ffe4_device::write_h)
+void nes_ffe4_device::write_h(offs_t offset, uint8_t data)
{
LOG_MMC(("mapper6 write_h, offset: %04x, data: %02x\n", offset, data));
@@ -257,7 +257,7 @@ WRITE8_MEMBER(nes_ffe4_device::write_h)
-------------------------------------------------*/
-WRITE8_MEMBER(nes_ffe8_device::write_l)
+void nes_ffe8_device::write_l(offs_t offset, uint8_t data)
{
LOG_MMC(("mapper17 write_l, offset: %04x, data: %02x\n", offset, data));
diff --git a/src/devices/bus/nes/legacy.h b/src/devices/bus/nes/legacy.h
index 91b44e108c0..92722c0591c 100644
--- a/src/devices/bus/nes/legacy.h
+++ b/src/devices/bus/nes/legacy.h
@@ -16,7 +16,7 @@ public:
// construction/destruction
nes_ffe3_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- virtual DECLARE_WRITE8_MEMBER(write_h) override;
+ virtual void write_h(offs_t offset, uint8_t data) override;
virtual void pcb_reset() override;
@@ -34,10 +34,10 @@ public:
// construction/destruction
nes_ffe4_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- virtual DECLARE_WRITE8_MEMBER(write_l) override;
- virtual DECLARE_WRITE8_MEMBER(write_h) override;
- virtual DECLARE_READ8_MEMBER(chr_r) override;
- virtual DECLARE_WRITE8_MEMBER(chr_w) override;
+ virtual void write_l(offs_t offset, uint8_t data) override;
+ virtual void write_h(offs_t offset, uint8_t data) override;
+ virtual uint8_t chr_r(offs_t offset) override;
+ virtual void chr_w(offs_t offset, uint8_t data) override;
virtual void pcb_reset() override;
@@ -71,8 +71,8 @@ public:
nes_ffe8_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
// device-level overrides
- virtual DECLARE_WRITE8_MEMBER(write_l) override;
- virtual DECLARE_WRITE8_MEMBER(write_h) override {}
+ virtual void write_l(offs_t offset, uint8_t data) override;
+ virtual void write_h(offs_t offset, uint8_t data) override {}
virtual void pcb_reset() override;
};
diff --git a/src/devices/bus/nes/mmc1.cpp b/src/devices/bus/nes/mmc1.cpp
index d324c153782..9a27c601b4c 100644
--- a/src/devices/bus/nes/mmc1.cpp
+++ b/src/devices/bus/nes/mmc1.cpp
@@ -219,7 +219,7 @@ void nes_sxrom_device::update_regs(int reg)
}
}
-WRITE8_MEMBER( nes_sxrom_device::write_h )
+void nes_sxrom_device::write_h(offs_t offset, uint8_t data)
{
LOG_MMC(("sxrom write_h, offset: %04x, data: %02x\n", offset, data));
@@ -265,7 +265,7 @@ WRITE8_MEMBER( nes_sxrom_device::write_h )
}
}
-WRITE8_MEMBER(nes_sxrom_device::write_m)
+void nes_sxrom_device::write_m(offs_t offset, uint8_t data)
{
uint8_t bank = (m_reg[1] >> 2) & 3;
LOG_MMC(("sxrom write_m, offset: %04x, data: %02x\n", offset, data));
@@ -279,7 +279,7 @@ WRITE8_MEMBER(nes_sxrom_device::write_m)
}
}
-READ8_MEMBER(nes_sxrom_device::read_m)
+uint8_t nes_sxrom_device::read_m(offs_t offset)
{
uint8_t bank = (m_reg[1] >> 2) & 3;
LOG_MMC(("sxrom read_m, offset: %04x\n", offset));
@@ -292,11 +292,11 @@ READ8_MEMBER(nes_sxrom_device::read_m)
return m_prgram[((bank * 0x2000) + offset) & (m_prgram.size() - 1)];
}
- return m_open_bus; // open bus
+ return get_open_bus(); // open bus
}
// SOROM has two RAM banks, the first is not battery backed up, the second is.
-WRITE8_MEMBER(nes_sorom_device::write_m)
+void nes_sorom_device::write_m(offs_t offset, uint8_t data)
{
uint8_t type = BIT(m_reg[0], 4) ? BIT(m_reg[1], 4) : BIT(m_reg[1], 3);
LOG_MMC(("sorom write_m, offset: %04x, data: %02x\n", offset, data));
@@ -310,7 +310,7 @@ WRITE8_MEMBER(nes_sorom_device::write_m)
}
}
-READ8_MEMBER(nes_sorom_device::read_m)
+uint8_t nes_sorom_device::read_m(offs_t offset)
{
uint8_t type = BIT(m_reg[0], 4) ? BIT(m_reg[1], 4) : BIT(m_reg[1], 3);
LOG_MMC(("sorom read_m, offset: %04x\n", offset));
@@ -323,11 +323,11 @@ READ8_MEMBER(nes_sorom_device::read_m)
return m_prgram[offset & (m_prgram.size() - 1)];
}
- return m_open_bus; // open bus
+ return get_open_bus(); // open bus
}
// MMC1A boards have no wram enable/disable bit
-WRITE8_MEMBER(nes_sxrom_a_device::write_m)
+void nes_sxrom_a_device::write_m(offs_t offset, uint8_t data)
{
uint8_t bank = (m_reg[1] >> 2) & 3;
LOG_MMC(("sxrom_a write_m, offset: %04x, data: %02x\n", offset, data));
@@ -338,7 +338,7 @@ WRITE8_MEMBER(nes_sxrom_a_device::write_m)
m_prgram[((bank * 0x2000) + offset) & (m_prgram.size() - 1)] = data;
}
-READ8_MEMBER(nes_sxrom_a_device::read_m)
+uint8_t nes_sxrom_a_device::read_m(offs_t offset)
{
uint8_t bank = (m_reg[1] >> 2) & 3;
LOG_MMC(("sxrom_a read_m, offset: %04x\n", offset));
@@ -348,10 +348,10 @@ READ8_MEMBER(nes_sxrom_a_device::read_m)
if (!m_prgram.empty())
return m_prgram[((bank * 0x2000) + offset) & (m_prgram.size() - 1)];
- return m_open_bus; // open bus
+ return get_open_bus(); // open bus
}
-WRITE8_MEMBER(nes_sorom_a_device::write_m)
+void nes_sorom_a_device::write_m(offs_t offset, uint8_t data)
{
uint8_t type = BIT(m_reg[0], 4) ? BIT(m_reg[1], 4) : BIT(m_reg[1], 3);
LOG_MMC(("sorom_a write_m, offset: %04x, data: %02x\n", offset, data));
@@ -362,7 +362,7 @@ WRITE8_MEMBER(nes_sorom_a_device::write_m)
m_prgram[offset & (m_prgram.size() - 1)] = data;
}
-READ8_MEMBER(nes_sorom_a_device::read_m)
+uint8_t nes_sorom_a_device::read_m(offs_t offset)
{
uint8_t type = BIT(m_reg[0], 4) ? BIT(m_reg[1], 4) : BIT(m_reg[1], 3);
LOG_MMC(("sorom_a read_m, offset: %04x\n", offset));
diff --git a/src/devices/bus/nes/mmc1.h b/src/devices/bus/nes/mmc1.h
index dd9ecccac75..c8ccb835d76 100644
--- a/src/devices/bus/nes/mmc1.h
+++ b/src/devices/bus/nes/mmc1.h
@@ -16,9 +16,9 @@ public:
// construction/destruction
nes_sxrom_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- virtual DECLARE_READ8_MEMBER(read_m) override;
- virtual DECLARE_WRITE8_MEMBER(write_m) override;
- virtual DECLARE_WRITE8_MEMBER(write_h) override;
+ virtual uint8_t read_m(offs_t offset) override;
+ virtual void write_m(offs_t offset, uint8_t data) override;
+ virtual void write_h(offs_t offset, uint8_t data) override;
virtual void pcb_reset() override;
@@ -46,8 +46,8 @@ public:
// construction/destruction
nes_sorom_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- virtual DECLARE_READ8_MEMBER(read_m) override;
- virtual DECLARE_WRITE8_MEMBER(write_m) override;
+ virtual uint8_t read_m(offs_t offset) override;
+ virtual void write_m(offs_t offset, uint8_t data) override;
virtual void pcb_reset() override;
};
@@ -58,8 +58,8 @@ public:
// construction/destruction
nes_sxrom_a_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- virtual DECLARE_READ8_MEMBER(read_m) override;
- virtual DECLARE_WRITE8_MEMBER(write_m) override;
+ virtual uint8_t read_m(offs_t offset) override;
+ virtual void write_m(offs_t offset, uint8_t data) override;
};
class nes_sorom_a_device : public nes_sxrom_device
@@ -68,8 +68,8 @@ public:
// construction/destruction
nes_sorom_a_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- virtual DECLARE_READ8_MEMBER(read_m) override;
- virtual DECLARE_WRITE8_MEMBER(write_m) override;
+ virtual uint8_t read_m(offs_t offset) override;
+ virtual void write_m(offs_t offset, uint8_t data) override;
virtual void pcb_reset() override;
};
diff --git a/src/devices/bus/nes/mmc2.cpp b/src/devices/bus/nes/mmc2.cpp
index 1055ce98921..8be7b04d2d7 100644
--- a/src/devices/bus/nes/mmc2.cpp
+++ b/src/devices/bus/nes/mmc2.cpp
@@ -130,7 +130,7 @@ void nes_pxrom_device::ppu_latch(offs_t offset)
}
}
-WRITE8_MEMBER( nes_pxrom_device::pxrom_write )
+void nes_pxrom_device::pxrom_write(offs_t offset, uint8_t data)
{
LOG_MMC(("pxrom write_h, offset: %04x, data: %02x\n", offset, data));
switch (offset & 0x7000)
@@ -182,7 +182,7 @@ WRITE8_MEMBER( nes_pxrom_device::pxrom_write )
-------------------------------------------------*/
-WRITE8_MEMBER( nes_fxrom_device::write_h )
+void nes_fxrom_device::write_h(offs_t offset, uint8_t data)
{
LOG_MMC(("fxrom write_h, offset: %04x, data: %02x\n", offset, data));
switch (offset & 0x7000)
@@ -191,7 +191,7 @@ WRITE8_MEMBER( nes_fxrom_device::write_h )
prg16_89ab(data);
break;
default:
- pxrom_write(space, offset, data, mem_mask);
+ pxrom_write(offset, data);
break;
}
}
diff --git a/src/devices/bus/nes/mmc2.h b/src/devices/bus/nes/mmc2.h
index cfd81aa87d3..9f4d100d2f6 100644
--- a/src/devices/bus/nes/mmc2.h
+++ b/src/devices/bus/nes/mmc2.h
@@ -16,8 +16,8 @@ public:
// construction/destruction
nes_pxrom_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- virtual DECLARE_WRITE8_MEMBER(pxrom_write);
- virtual DECLARE_WRITE8_MEMBER(write_h) override { pxrom_write(space, offset, data, mem_mask); }
+ virtual void pxrom_write(offs_t offset, uint8_t data);
+ virtual void write_h(offs_t offset, uint8_t data) override { pxrom_write(offset, data); }
virtual void ppu_latch(offs_t offset) override;
virtual void pcb_reset() override;
@@ -42,7 +42,7 @@ public:
nes_fxrom_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
// device-level overrides
- virtual DECLARE_WRITE8_MEMBER(write_h) override;
+ virtual void write_h(offs_t offset, uint8_t data) override;
virtual void pcb_reset() override;
};
diff --git a/src/devices/bus/nes/mmc3.cpp b/src/devices/bus/nes/mmc3.cpp
index f8497dbd42d..d6f7f37dc4a 100644
--- a/src/devices/bus/nes/mmc3.cpp
+++ b/src/devices/bus/nes/mmc3.cpp
@@ -244,7 +244,7 @@ void nes_txrom_device::set_chr( uint8_t chr, int chr_base, int chr_mask )
chr_cb(chr_page ^ 7, chr_base | (m_mmc_vrom_bank[5] & chr_mask), chr);
}
-WRITE8_MEMBER(nes_txrom_device::txrom_write)
+void nes_txrom_device::txrom_write(offs_t offset, uint8_t data)
{
uint8_t mmc_helper, cmd;
@@ -313,7 +313,7 @@ WRITE8_MEMBER(nes_txrom_device::txrom_write)
}
}
-WRITE8_MEMBER(nes_txrom_device::write_m)
+void nes_txrom_device::write_m(offs_t offset, uint8_t data)
{
LOG_MMC(("txrom write_m, offset: %04x, data: %02x\n", offset, data));
@@ -326,7 +326,7 @@ WRITE8_MEMBER(nes_txrom_device::write_m)
}
}
-READ8_MEMBER(nes_txrom_device::read_m)
+uint8_t nes_txrom_device::read_m(offs_t offset)
{
LOG_MMC(("txrom read_m, offset: %04x\n", offset));
@@ -338,7 +338,7 @@ READ8_MEMBER(nes_txrom_device::read_m)
return m_prgram[offset & (m_prgram.size() - 1)];
}
- return m_open_bus; // open bus
+ return get_open_bus(); // open bus
}
@@ -350,7 +350,7 @@ READ8_MEMBER(nes_txrom_device::read_m)
-------------------------------------------------*/
-WRITE8_MEMBER(nes_hkrom_device::write_m)
+void nes_hkrom_device::write_m(offs_t offset, uint8_t data)
{
uint8_t write_hi, write_lo;
LOG_MMC(("hkrom write_m, offset: %04x, data: %02x\n", offset, data));
@@ -369,15 +369,15 @@ WRITE8_MEMBER(nes_hkrom_device::write_m)
m_mmc6_ram[offset & 0x3ff] = data;
}
-READ8_MEMBER(nes_hkrom_device::read_m)
+uint8_t nes_hkrom_device::read_m(offs_t offset)
{
LOG_MMC(("hkrom read_m, offset: %04x\n", offset));
if (offset < 0x1000)
- return m_open_bus; // open bus
+ return get_open_bus(); // open bus
if (!(m_mmc6_reg & 0xa0))
- return m_open_bus; // open bus
+ return get_open_bus(); // open bus
if (BIT(offset, 9) && BIT(m_mmc6_reg, 7)) // access to upper half of 1k when upper read is enabled
return m_mmc6_ram[offset & 0x3ff];
@@ -389,7 +389,7 @@ READ8_MEMBER(nes_hkrom_device::read_m)
return 0x00;
}
-WRITE8_MEMBER(nes_hkrom_device::write_h)
+void nes_hkrom_device::write_h(offs_t offset, uint8_t data)
{
uint8_t mmc6_helper;
LOG_MMC(("hkrom write_h, offset: %04x, data: %02x\n", offset, data));
@@ -423,7 +423,7 @@ WRITE8_MEMBER(nes_hkrom_device::write_h)
break;
default:
- txrom_write(space, offset, data, mem_mask);
+ txrom_write(offset, data);
break;
}
}
@@ -465,7 +465,7 @@ void nes_txsrom_device::chr_cb( int start, int bank, int source )
chr1_x(start, bank, source);
}
-WRITE8_MEMBER(nes_txsrom_device::write_h)
+void nes_txsrom_device::write_h(offs_t offset, uint8_t data)
{
LOG_MMC(("txsrom write_h, offset: %04x, data: %02x\n", offset, data));
@@ -475,7 +475,7 @@ WRITE8_MEMBER(nes_txsrom_device::write_h)
break;
default:
- txrom_write(space, offset, data, mem_mask);
+ txrom_write(offset, data);
break;
}
}
@@ -524,7 +524,7 @@ void nes_tqrom_device::set_chr( uint8_t chr, int chr_base, int chr_mask )
-------------------------------------------------*/
-WRITE8_MEMBER(nes_qj_device::write_m)
+void nes_qj_device::write_m(offs_t offset, uint8_t data)
{
LOG_MMC(("qj write_m, offset: %04x, data: %02x\n", offset, data));
@@ -546,7 +546,7 @@ WRITE8_MEMBER(nes_qj_device::write_m)
-------------------------------------------------*/
-WRITE8_MEMBER(nes_zz_device::write_m)
+void nes_zz_device::write_m(offs_t offset, uint8_t data)
{
uint8_t mmc_helper = data & 0x07;
LOG_MMC(("zz write_m, offset: %04x, data: %02x\n", offset, data));
diff --git a/src/devices/bus/nes/mmc3.h b/src/devices/bus/nes/mmc3.h
index d16a0000268..5ef9e8dbdaa 100644
--- a/src/devices/bus/nes/mmc3.h
+++ b/src/devices/bus/nes/mmc3.h
@@ -16,10 +16,10 @@ public:
// construction/destruction
nes_txrom_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- virtual DECLARE_READ8_MEMBER(read_m) override;
- virtual DECLARE_WRITE8_MEMBER(write_m) override;
- virtual DECLARE_WRITE8_MEMBER(txrom_write);
- virtual DECLARE_WRITE8_MEMBER(write_h) override { txrom_write(space, offset, data, mem_mask); }
+ virtual uint8_t read_m(offs_t offset) override;
+ virtual void write_m(offs_t offset, uint8_t data) override;
+ virtual void txrom_write(offs_t offset, uint8_t data);
+ virtual void write_h(offs_t offset, uint8_t data) override { txrom_write(offset, data); }
virtual void prg_cb(int start, int bank);
virtual void chr_cb(int start, int bank, int source);
@@ -62,9 +62,9 @@ public:
// construction/destruction
nes_hkrom_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- virtual DECLARE_READ8_MEMBER(read_m) override;
- virtual DECLARE_WRITE8_MEMBER(write_m) override;
- virtual DECLARE_WRITE8_MEMBER(write_h) override;
+ virtual uint8_t read_m(offs_t offset) override;
+ virtual void write_m(offs_t offset, uint8_t data) override;
+ virtual void write_h(offs_t offset, uint8_t data) override;
virtual void pcb_reset() override;
@@ -89,7 +89,7 @@ public:
nes_txsrom_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
// device-level overrides
- virtual DECLARE_WRITE8_MEMBER(write_h) override;
+ virtual void write_h(offs_t offset, uint8_t data) override;
virtual void chr_cb(int start, int bank, int source) override;
protected:
@@ -119,7 +119,7 @@ public:
nes_qj_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
// device-level overrides
- virtual DECLARE_WRITE8_MEMBER(write_m) override;
+ virtual void write_m(offs_t offset, uint8_t data) override;
virtual void pcb_reset() override;
};
@@ -133,7 +133,7 @@ public:
nes_zz_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
// device-level overrides
- virtual DECLARE_WRITE8_MEMBER(write_m) override;
+ virtual void write_m(offs_t offset, uint8_t data) override;
virtual void pcb_reset() override;
};
diff --git a/src/devices/bus/nes/mmc3_clones.cpp b/src/devices/bus/nes/mmc3_clones.cpp
index 5c578c0fcbd..9be591c7d9f 100644
--- a/src/devices/bus/nes/mmc3_clones.cpp
+++ b/src/devices/bus/nes/mmc3_clones.cpp
@@ -637,11 +637,11 @@ void nes_pjoy84_device::pcb_reset()
-------------------------------------------------*/
-WRITE8_MEMBER(nes_nitra_device::write_h)
+void nes_nitra_device::write_h(offs_t offset, uint8_t data)
{
LOG_MMC(("nitra write_h, offset: %04x, data: %02x\n", offset, data));
- txrom_write(space, (offset & 0x6000) | ((offset & 0x400) >> 10), offset & 0xff, mem_mask);
+ txrom_write((offset & 0x6000) | ((offset & 0x400) >> 10), offset & 0xff);
}
/*-------------------------------------------------
@@ -656,12 +656,12 @@ WRITE8_MEMBER(nes_nitra_device::write_h)
-------------------------------------------------*/
-WRITE8_MEMBER(nes_ks7057_device::write_h)
+void nes_ks7057_device::write_h(offs_t offset, uint8_t data)
{
LOG_MMC(("ks7057 write_h, offset: %04x, data: %02x\n", offset, data));
offset = (BIT(offset, 0) << 1) | BIT(offset, 1) | (offset & ~0x03);
- txrom_write(space, offset, data, mem_mask);
+ txrom_write(offset, data);
}
/*-------------------------------------------------
@@ -679,11 +679,11 @@ WRITE8_MEMBER(nes_ks7057_device::write_h)
-------------------------------------------------*/
-WRITE8_MEMBER(nes_sbros11_device::write_h)
+void nes_sbros11_device::write_h(offs_t offset, uint8_t data)
{
LOG_MMC(("smb11 write_h, offset: %04x, data: %02x\n", offset, data));
- txrom_write(space, (offset & 0x6000) | ((offset & 0x04) >> 2), data, mem_mask);
+ txrom_write((offset & 0x6000) | ((offset & 0x04) >> 2), data);
}
/*-------------------------------------------------
@@ -711,14 +711,14 @@ void nes_malisb_device::chr_cb(int start, int bank, int source)
chr1_x(start, bank, source);
}
-WRITE8_MEMBER(nes_malisb_device::write_h)
+void nes_malisb_device::write_h(offs_t offset, uint8_t data)
{
LOG_MMC(("malisb write_h, offset: %04x, data: %02x\n", offset, data));
if (offset > 0x4000)
- txrom_write(space, (offset & 0xfffe) | ((offset & 0x04) >> 2) | ((offset & 0x08) >> 3), data, mem_mask);
+ txrom_write((offset & 0xfffe) | ((offset & 0x04) >> 2) | ((offset & 0x08) >> 3), data);
else
- txrom_write(space, (offset & 0xfffe) | ((offset & 0x08) >> 3), data, mem_mask);
+ txrom_write((offset & 0xfffe) | ((offset & 0x08) >> 3), data);
}
/*-------------------------------------------------
@@ -736,7 +736,7 @@ WRITE8_MEMBER(nes_malisb_device::write_h)
-------------------------------------------------*/
-WRITE8_MEMBER(nes_family4646_device::write_m)
+void nes_family4646_device::write_m(offs_t offset, uint8_t data)
{
LOG_MMC(("family4646 write_m, offset: %04x, data: %02x\n", offset, data));
@@ -763,7 +763,7 @@ WRITE8_MEMBER(nes_family4646_device::write_m)
-------------------------------------------------*/
-WRITE8_MEMBER(nes_pikay2k_device::write_h)
+void nes_pikay2k_device::write_h(offs_t offset, uint8_t data)
{
LOG_MMC(("pikay2k write_h, offset: %04x, data: %02x\n", offset, data));
@@ -776,20 +776,20 @@ WRITE8_MEMBER(nes_pikay2k_device::write_h)
case 0x2000:
m_reg[0] = 0;
default:
- txrom_write(space, offset, data, mem_mask);
+ txrom_write(offset, data);
break;
}
}
// strange WRAM usage: it is protected at start, and gets unprotected after the first write to 0xa000
-WRITE8_MEMBER(nes_pikay2k_device::write_m)
+void nes_pikay2k_device::write_m(offs_t offset, uint8_t data)
{
LOG_MMC(("pikay2k write_m, offset: %04x, data: %02x\n", offset, data));
m_prgram[offset & 0x1fff] = data;
}
-READ8_MEMBER(nes_pikay2k_device::read_m)
+uint8_t nes_pikay2k_device::read_m(offs_t offset)
{
LOG_MMC(("pikay2k read_m, offset: %04x\n", offset));
@@ -820,7 +820,7 @@ void nes_8237_device::chr_cb(int start, int bank, int source)
chr1_x(start, bank, source);
}
-WRITE8_MEMBER(nes_8237_device::write_l)
+void nes_8237_device::write_l(offs_t offset, uint8_t data)
{
LOG_MMC(("unl_8237 write_l, offset: %04x, data: %02x\n", offset, data));
offset += 0x100;
@@ -854,7 +854,7 @@ WRITE8_MEMBER(nes_8237_device::write_l)
}
}
-WRITE8_MEMBER(nes_8237_device::write_h)
+void nes_8237_device::write_h(offs_t offset, uint8_t data)
{
static const uint8_t conv_table[8] = {0, 2, 6, 1, 7, 3, 4, 5};
LOG_MMC(("unl_8237 write_h, offset: %04x, data: %02x\n", offset, data));
@@ -870,7 +870,7 @@ WRITE8_MEMBER(nes_8237_device::write_h)
case 0x3000:
m_cd_enable = 1;
data = (data & 0xc0) | conv_table[data & 0x07];
- txrom_write(space, 0x0000, data, mem_mask);
+ txrom_write(0x0000, data);
break;
case 0x4000:
@@ -878,7 +878,7 @@ WRITE8_MEMBER(nes_8237_device::write_h)
if (m_cd_enable)
{
m_cd_enable = 0;
- txrom_write(space, 0x0001, data, mem_mask);
+ txrom_write(0x0001, data);
}
break;
@@ -886,9 +886,9 @@ WRITE8_MEMBER(nes_8237_device::write_h)
break;
case 0x7000:
- txrom_write(space, 0x6001, data, mem_mask);
- txrom_write(space, 0x4000, data, mem_mask);
- txrom_write(space, 0x4001, data, mem_mask);
+ txrom_write(0x6001, data);
+ txrom_write(0x4000, data);
+ txrom_write(0x4001, data);
break;
}
}
@@ -907,7 +907,7 @@ WRITE8_MEMBER(nes_8237_device::write_h)
-------------------------------------------------*/
-WRITE8_MEMBER(nes_sglionk_device::write_m)
+void nes_sglionk_device::write_m(offs_t offset, uint8_t data)
{
LOG_MMC(("sglionk write_m, offset: %04x, data: %02x\n", offset, data));
@@ -923,7 +923,7 @@ WRITE8_MEMBER(nes_sglionk_device::write_m)
}
-WRITE8_MEMBER(nes_sglionk_device::write_h)
+void nes_sglionk_device::write_h(offs_t offset, uint8_t data)
{
static const uint8_t conv_table[8] = {0, 3, 1, 5, 6, 7, 2, 4};
LOG_MMC(("sglionk write_h, offset: %04x, data: %02x\n", offset, data));
@@ -938,13 +938,13 @@ WRITE8_MEMBER(nes_sglionk_device::write_h)
case 0x2000:
m_reg_enabled = 1;
data = (data & 0xc0) | conv_table[data & 0x07];
- txrom_write(space, 0x0000, data, mem_mask);
+ txrom_write(0x0000, data);
break;
case 0x4000:
if (m_reg_enabled && (m_reg & 0x80) == 0)
{
m_reg_enabled = 0;
- txrom_write(space, 0x0001, data, mem_mask);
+ txrom_write(0x0001, data);
}
break;
}
@@ -954,12 +954,12 @@ WRITE8_MEMBER(nes_sglionk_device::write_h)
switch (offset & 0x03)
{
case 0x02:
- txrom_write(space, 0x6000, data, mem_mask);
+ txrom_write(0x6000, data);
break;
case 0x03:
- txrom_write(space, 0x6001, data, mem_mask);
- txrom_write(space, 0x4000, data, mem_mask);
- txrom_write(space, 0x4001, data, mem_mask);
+ txrom_write(0x6001, data);
+ txrom_write(0x4000, data);
+ txrom_write(0x4001, data);
break;
}
}
@@ -1022,7 +1022,7 @@ void nes_sgboog_device::set_prg(int prg_base, int prg_mask)
}
}
-WRITE8_MEMBER(nes_sgboog_device::write_l)
+void nes_sgboog_device::write_l(offs_t offset, uint8_t data)
{
LOG_MMC(("sgboog write_l, offset: %04x, data: %02x\n", offset, data));
offset += 0x100;
@@ -1046,7 +1046,7 @@ WRITE8_MEMBER(nes_sgboog_device::write_l)
}
}
-WRITE8_MEMBER(nes_sgboog_device::write_m)
+void nes_sgboog_device::write_m(offs_t offset, uint8_t data)
{
LOG_MMC(("sgboog write_m, offset: %04x, data: %02x\n", offset, data));
@@ -1069,7 +1069,7 @@ WRITE8_MEMBER(nes_sgboog_device::write_m)
}
}
-WRITE8_MEMBER(nes_sgboog_device::write_h)
+void nes_sgboog_device::write_h(offs_t offset, uint8_t data)
{
static const uint8_t conv_table[8] = {0,2,5,3,6,1,7,4};
LOG_MMC(("sgboog write_h, offset: %04x, data: %02x\n", offset, data));
@@ -1085,14 +1085,14 @@ WRITE8_MEMBER(nes_sgboog_device::write_h)
if (m_reg[2] && ((m_reg[0] & 0x80) == 0 || (m_latch & 0x07) < 6)) // if we use the prg16 banks and cmd=6,7 DON'T enter!
{
m_reg[2] = 0;
- txrom_write(space, 0x0001, data, mem_mask);
+ txrom_write(0x0001, data);
}
break;
case 0x2000:
data = (data & 0xc0) | conv_table[data & 0x07];
m_reg[2] = 1;
- txrom_write(space, 0x0000, data, mem_mask);
+ txrom_write(0x0000, data);
break;
case 0x4000:
@@ -1100,21 +1100,21 @@ WRITE8_MEMBER(nes_sgboog_device::write_h)
break;
case 0x4001:
- txrom_write(space, 0x6001, data, mem_mask);
+ txrom_write(0x6001, data);
break;
case 0x6001:
- txrom_write(space, 0x4000, data, mem_mask);
- txrom_write(space, 0x4001, data, mem_mask);
+ txrom_write(0x4000, data);
+ txrom_write(0x4001, data);
break;
default:
- txrom_write(space, offset, data, mem_mask);
+ txrom_write(offset, data);
break;
}
}
else
- txrom_write(space, offset, data, mem_mask);
+ txrom_write(offset, data);
}
/*-------------------------------------------------
@@ -1140,7 +1140,7 @@ void nes_kasing_device::prg_cb(int start, int bank)
prg8_x(start, bank);
}
-WRITE8_MEMBER(nes_kasing_device::write_m)
+void nes_kasing_device::write_m(offs_t offset, uint8_t data)
{
LOG_MMC(("kasing write_m, offset: %04x, data: %02x\n", offset, data));
@@ -1172,7 +1172,7 @@ WRITE8_MEMBER(nes_kasing_device::write_m)
-------------------------------------------------*/
-WRITE8_MEMBER(nes_kay_device::write_l)
+void nes_kay_device::write_l(offs_t offset, uint8_t data)
{
LOG_MMC(("kay write_l, offset: %04x, data: %02x\n", offset, data));
offset += 0x100;
@@ -1195,7 +1195,7 @@ WRITE8_MEMBER(nes_kay_device::write_l)
}
}
-READ8_MEMBER(nes_kay_device::read_l)
+uint8_t nes_kay_device::read_l(offs_t offset)
{
LOG_MMC(("kay read_l, offset: %04x\n", offset));
offset += 0x100;
@@ -1269,14 +1269,14 @@ void nes_kay_device::chr_cb(int start, int bank, int source)
chr1_x(start, bank, source);
}
-WRITE8_MEMBER(nes_kay_device::write_h)
+void nes_kay_device::write_h(offs_t offset, uint8_t data)
{
LOG_MMC(("kay write_h, offset: %04x, data: %02x\n", offset, data));
switch (offset & 0x6003)
{
case 0x0000:
- txrom_write(space, offset, data, mem_mask);
+ txrom_write(offset, data);
set_prg(m_prg_base, m_prg_mask);
break;
@@ -1285,19 +1285,19 @@ WRITE8_MEMBER(nes_kay_device::write_h)
| (BIT(data, 3) << 2) | (BIT(data, 4) << 1) | BIT(data, 5);
if (!m_reg[7])
update_regs();
- txrom_write(space, offset, data, mem_mask);
+ txrom_write(offset, data);
set_prg(m_prg_base, m_prg_mask);
break;
case 0x0003:
m_reg[5] = data;
update_regs();
- txrom_write(space, 0x0000, data, mem_mask);
+ txrom_write(0x0000, data);
set_prg(m_prg_base, m_prg_mask);
break;
default:
- txrom_write(space, offset, data, mem_mask);
+ txrom_write(offset, data);
break;
}
}
@@ -1314,7 +1314,7 @@ void nes_h2288_device::prg_cb(int start, int bank)
prg8_x(start, bank);
}
-WRITE8_MEMBER(nes_h2288_device::write_l)
+void nes_h2288_device::write_l(offs_t offset, uint8_t data)
{
LOG_MMC(("h2288 write_l, offset: %04x, data: %02x\n", offset, data));
offset += 0x100;
@@ -1334,7 +1334,7 @@ WRITE8_MEMBER(nes_h2288_device::write_l)
}
}
-READ8_MEMBER(nes_h2288_device::read_l)
+uint8_t nes_h2288_device::read_l(offs_t offset)
{
LOG_MMC(("h2288 read_l, offset: %04x\n", offset));
offset += 0x100;
@@ -1351,7 +1351,7 @@ READ8_MEMBER(nes_h2288_device::read_l)
return 0;
}
-WRITE8_MEMBER(nes_h2288_device::write_h)
+void nes_h2288_device::write_h(offs_t offset, uint8_t data)
{
static const uint8_t conv_table[8] = {0, 3, 1, 5, 6, 7, 2, 4};
LOG_MMC(("h2288 write_h, offset: %04x, data: %02x\n", offset, data));
@@ -1359,11 +1359,11 @@ WRITE8_MEMBER(nes_h2288_device::write_h)
switch (offset & 0x6001)
{
case 0x0000:
- txrom_write(space, 0x0000, (data & 0xc0) | conv_table[data & 0x07], mem_mask);
+ txrom_write(0x0000, (data & 0xc0) | conv_table[data & 0x07]);
break;
default:
- txrom_write(space, offset, data, mem_mask);
+ txrom_write(offset, data);
break;
}
}
@@ -1378,7 +1378,7 @@ WRITE8_MEMBER(nes_h2288_device::write_h)
-------------------------------------------------*/
-WRITE8_MEMBER(nes_6035052_device::write_ex)
+void nes_6035052_device::write_ex(offs_t offset, uint8_t data)
{
LOG_MMC(("6035052 write_ex, offset: %04x, data: %02x\n", offset, data));
m_prot = data & 0x03;
@@ -1386,7 +1386,7 @@ WRITE8_MEMBER(nes_6035052_device::write_ex)
m_prot = 2;
}
-READ8_MEMBER(nes_6035052_device::read_ex)
+uint8_t nes_6035052_device::read_ex(offs_t offset)
{
LOG_MMC(("6035052 read_ex, offset: %04x\n", offset));
return m_prot;
@@ -1406,7 +1406,7 @@ READ8_MEMBER(nes_6035052_device::read_ex)
-------------------------------------------------*/
-WRITE8_MEMBER(nes_txc_tw_device::write_l)
+void nes_txc_tw_device::write_l(offs_t offset, uint8_t data)
{
LOG_MMC(("txc_tw write_l, offset: %04x, data: %02x\n", offset, data));
@@ -1436,22 +1436,22 @@ inline uint8_t kof97_unscramble( uint8_t data )
return ((data >> 1) & 0x01) | ((data >> 4) & 0x02) | ((data << 2) & 0x04) | ((data >> 0) & 0xd8) | ((data << 3) & 0x20);
}
-WRITE8_MEMBER(nes_kof97_device::write_h)
+void nes_kof97_device::write_h(offs_t offset, uint8_t data)
{
LOG_MMC(("kof97 write_h, offset: %04x, data: %02x\n", offset, data));
/* Addresses 0x9000, 0xa000, 0xd000 & 0xf000 behaves differently than MMC3 */
if (offset == 0x1000)
- txrom_write(space, 0x0001, kof97_unscramble(data), mem_mask);
+ txrom_write(0x0001, kof97_unscramble(data));
else if (offset == 0x2000)
- txrom_write(space, 0x0000, kof97_unscramble(data), mem_mask);
+ txrom_write(0x0000, kof97_unscramble(data));
else if (offset == 0x5000)
- txrom_write(space, 0x4001, kof97_unscramble(data), mem_mask);
+ txrom_write(0x4001, kof97_unscramble(data));
else if (offset == 0x7000)
- txrom_write(space, 0x6001, kof97_unscramble(data), mem_mask);
+ txrom_write(0x6001, kof97_unscramble(data));
/* Other addresses behaves like MMC3, up to unscrambling data */
else
- txrom_write(space, offset, kof97_unscramble(data), mem_mask);
+ txrom_write(offset, kof97_unscramble(data));
}
/*-------------------------------------------------
@@ -1485,7 +1485,7 @@ void nes_kof96_device::chr_cb(int start, int bank, int source)
chr1_x(start, bank, source);
}
-WRITE8_MEMBER(nes_kof96_device::write_l)
+void nes_kof96_device::write_l(offs_t offset, uint8_t data)
{
uint8_t new_bank;
LOG_MMC(("kof96 write_l, offset: %04x, data: %02x\n", offset, data));
@@ -1532,11 +1532,11 @@ WRITE8_MEMBER(nes_kof96_device::write_l)
if (!m_reg[3] && offset > 0x1000)
{
m_reg[3] = 1;
- space.write_byte(0x4017, 0x40);
+ poke(0x4017, 0x40); // FIXME
}
}
-READ8_MEMBER(nes_kof96_device::read_l)
+uint8_t nes_kof96_device::read_l(offs_t offset)
{
LOG_MMC(("kof96 read_l, offset: %04x\n", offset));
offset += 0x100;
@@ -1547,7 +1547,7 @@ READ8_MEMBER(nes_kof96_device::read_l)
return 0;
}
-WRITE8_MEMBER(nes_kof96_device::write_h)
+void nes_kof96_device::write_h(offs_t offset, uint8_t data)
{
LOG_MMC(("kof96 write_h, offset: %04x, data: %02x\n", offset, data));
@@ -1555,12 +1555,12 @@ WRITE8_MEMBER(nes_kof96_device::write_h)
{
case 0x0000:
m_reg[2] = 1;
- txrom_write(space, 0x0000, data, mem_mask);
+ txrom_write(0x0000, data);
break;
case 0x0001:
if (m_reg[2])
- txrom_write(space, 0x0001, data, mem_mask);
+ txrom_write(0x0001, data);
break;
case 0x0002:
@@ -1576,7 +1576,7 @@ WRITE8_MEMBER(nes_kof96_device::write_h)
break;
default:
- txrom_write(space, offset, data, mem_mask);
+ txrom_write(offset, data);
break;
}
}
@@ -1600,7 +1600,7 @@ void nes_sf3_device::set_chr(uint8_t chr_source, int chr_base, int chr_mask)
chr2_6(chr_base | (m_mmc_vrom_bank[2] & chr_mask), chr_source);
}
-WRITE8_MEMBER(nes_sf3_device::write_h)
+void nes_sf3_device::write_h(offs_t offset, uint8_t data)
{
uint8_t cmd;
LOG_MMC(("sf3 write_h, offset: %04x, data: %02x\n", offset, data));
@@ -1624,7 +1624,7 @@ WRITE8_MEMBER(nes_sf3_device::write_h)
break;
default:
- txrom_write(space, offset, data, mem_mask);
+ txrom_write(offset, data);
break;
}
}
@@ -1643,7 +1643,7 @@ WRITE8_MEMBER(nes_sf3_device::write_h)
-------------------------------------------------*/
-WRITE8_MEMBER(nes_gouder_device::write_l)
+void nes_gouder_device::write_l(offs_t offset, uint8_t data)
{
static const uint8_t conv_table[256] =
{
@@ -1675,7 +1675,7 @@ WRITE8_MEMBER(nes_gouder_device::write_l)
prg32(((data >> 3) & 0x02) | (data & 0x01));
}
-READ8_MEMBER(nes_gouder_device::read_l)
+uint8_t nes_gouder_device::read_l(offs_t offset)
{
LOG_MMC(("gouder read_l, offset: %04x\n", offset));
@@ -1722,7 +1722,7 @@ void nes_sa9602b_device::prg_cb(int start, int bank)
}
-WRITE8_MEMBER( nes_sa9602b_device::write_h )
+void nes_sa9602b_device::write_h(offs_t offset, uint8_t data)
{
LOG_MMC(("sa9602b write_h, offset: %04x, data: %02x\n", offset, data));
@@ -1738,7 +1738,7 @@ WRITE8_MEMBER( nes_sa9602b_device::write_h )
break;
}
- txrom_write(space, offset, data, mem_mask);
+ txrom_write(offset, data);
}
/*-------------------------------------------------
@@ -1762,7 +1762,7 @@ void nes_sachen_shero_device::chr_cb( int start, int bank, int source )
}
-WRITE8_MEMBER( nes_sachen_shero_device::write_l )
+void nes_sachen_shero_device::write_l(offs_t offset, uint8_t data)
{
LOG_MMC(("shero write_l, offset: %04x, data: %02x\n", offset, data));
offset += 0x4100;
@@ -1777,7 +1777,7 @@ WRITE8_MEMBER( nes_sachen_shero_device::write_l )
}
}
-READ8_MEMBER( nes_sachen_shero_device::read_l )
+uint8_t nes_sachen_shero_device::read_l(offs_t offset)
{
LOG_MMC(("shero read_l, offset: %04x\n", offset));
offset += 0x4100;
@@ -1786,7 +1786,7 @@ READ8_MEMBER( nes_sachen_shero_device::read_l )
{
// DSW read!
}
- return m_open_bus; // open bus
+ return get_open_bus(); // open bus
}
@@ -1886,7 +1886,7 @@ void nes_fk23c_device::fk23c_set_chr()
}
}
-WRITE8_MEMBER(nes_fk23c_device::write_l)
+void nes_fk23c_device::write_l(offs_t offset, uint8_t data)
{
LOG_MMC(("fk23c write_l, offset: %04x, data: %02x\n", offset, data));
offset += 0x100;
@@ -1903,7 +1903,7 @@ WRITE8_MEMBER(nes_fk23c_device::write_l)
}
}
-WRITE8_MEMBER(nes_fk23c_device::write_h)
+void nes_fk23c_device::write_h(offs_t offset, uint8_t data)
{
LOG_MMC(("fk23c write_h, offset: %04x, data: %02x\n", offset, data));
@@ -1929,7 +1929,7 @@ WRITE8_MEMBER(nes_fk23c_device::write_h)
fk23c_set_chr();
}
else
- txrom_write(space, offset, data, mem_mask);
+ txrom_write(offset, data);
break;
case 0x2000:
@@ -1937,7 +1937,7 @@ WRITE8_MEMBER(nes_fk23c_device::write_h)
break;
default:
- txrom_write(space, offset, data, mem_mask);
+ txrom_write(offset, data);
break;
}
}
@@ -1971,7 +1971,7 @@ void nes_s24in1sc03_device::chr_cb(int start, int bank, int source)
chr1_x(start, chr_base | bank, chr);
}
-WRITE8_MEMBER(nes_s24in1sc03_device::write_l)
+void nes_s24in1sc03_device::write_l(offs_t offset, uint8_t data)
{
LOG_MMC(("s24in1sc03 write_l, offset: %04x, data: %02x\n", offset, data));
offset += 0x100;
@@ -2009,7 +2009,7 @@ WRITE8_MEMBER(nes_s24in1sc03_device::write_l)
-------------------------------------------------*/
-WRITE8_MEMBER(nes_bmc_15in1_device::write_m)
+void nes_bmc_15in1_device::write_m(offs_t offset, uint8_t data)
{
LOG_MMC(("bmc_15in1 write_m, offset: %04x, data: %02x\n", offset, data));
@@ -2037,7 +2037,7 @@ WRITE8_MEMBER(nes_bmc_15in1_device::write_m)
-------------------------------------------------*/
-WRITE8_MEMBER(nes_bmc_sbig7_device::write_h)
+void nes_bmc_sbig7_device::write_h(offs_t offset, uint8_t data)
{
uint8_t page;
LOG_MMC(("bmc_sbig7 write_h, offset: %04x, data: %02x\n", offset, data));
@@ -2058,7 +2058,7 @@ WRITE8_MEMBER(nes_bmc_sbig7_device::write_h)
break;
default:
- txrom_write(space, offset, data, mem_mask);
+ txrom_write(offset, data);
break;
}
}
@@ -2076,7 +2076,7 @@ WRITE8_MEMBER(nes_bmc_sbig7_device::write_h)
-------------------------------------------------*/
-WRITE8_MEMBER(nes_bmc_hik8_device::write_m)
+void nes_bmc_hik8_device::write_m(offs_t offset, uint8_t data)
{
LOG_MMC(("bmc_hik8 write_m, offset: %04x, data: %02x\n", offset, data));
@@ -2123,7 +2123,7 @@ WRITE8_MEMBER(nes_bmc_hik8_device::write_m)
-------------------------------------------------*/
-WRITE8_MEMBER(nes_bmc_hik4_device::write_m)
+void nes_bmc_hik4_device::write_m(offs_t offset, uint8_t data)
{
LOG_MMC(("bmc_hik4 write_m, offset: %04x, data: %02x\n", offset, data));
@@ -2162,7 +2162,7 @@ WRITE8_MEMBER(nes_bmc_hik4_device::write_m)
-------------------------------------------------*/
-WRITE8_MEMBER(nes_bmc_mario7in1_device::write_m)
+void nes_bmc_mario7in1_device::write_m(offs_t offset, uint8_t data)
{
uint8_t helper1, helper2;
LOG_MMC(("bmc_mario7in1 write_m, offset: %04x, data: %02x\n", offset, data));
@@ -2204,7 +2204,7 @@ WRITE8_MEMBER(nes_bmc_mario7in1_device::write_m)
-------------------------------------------------*/
-WRITE8_MEMBER(nes_bmc_gold7in1_device::write_m)
+void nes_bmc_gold7in1_device::write_m(offs_t offset, uint8_t data)
{
uint8_t helper1, helper2;
LOG_MMC(("bmc_gold7in1 write_m, offset: %04x, data: %02x\n", offset, data));
@@ -2265,7 +2265,7 @@ void nes_bmc_gc6in1_device::chr_cb(int start, int bank, int source)
chr1_x(start, ((m_reg[1] & 0x03) << 8) | bank, source);
}
-WRITE8_MEMBER(nes_bmc_gc6in1_device::write_l)
+void nes_bmc_gc6in1_device::write_l(offs_t offset, uint8_t data)
{
uint8_t bank;
LOG_MMC(("bmc_gc6in1 write_l, offset: %04x, data: %02x\n", offset, data));
@@ -2294,7 +2294,7 @@ WRITE8_MEMBER(nes_bmc_gc6in1_device::write_l)
}
}
-WRITE8_MEMBER(nes_bmc_gc6in1_device::write_h)
+void nes_bmc_gc6in1_device::write_h(offs_t offset, uint8_t data)
{
uint8_t cmd;
static const uint8_t conv_table[8] = {0, 6, 3, 7, 5, 2, 4, 1};
@@ -2303,20 +2303,20 @@ WRITE8_MEMBER(nes_bmc_gc6in1_device::write_h)
if (!m_reg[2])
{
// in this case we act like MMC3, only with alt prg/chr handlers
- txrom_write(space, offset, data, mem_mask);
+ txrom_write(offset, data);
}
else
{
switch (offset & 0x6001)
{
case 0x0000:
- txrom_write(space, 0x4000, data, mem_mask);
+ txrom_write(0x4000, data);
break;
case 0x0001:
data = (data & 0xc0) | conv_table[data & 0x07];
m_reg[3] = 1;
- txrom_write(space, 0x0000, data, mem_mask);
+ txrom_write(0x0000, data);
break;
case 0x2000:
@@ -2346,7 +2346,7 @@ WRITE8_MEMBER(nes_bmc_gc6in1_device::write_h)
break;
default:
- txrom_write(space, offset, data, mem_mask);
+ txrom_write(offset, data);
break;
}
}
@@ -2377,7 +2377,7 @@ void nes_bmc_411120c_device::chr_cb(int start, int bank, int source)
chr1_x(start, bank | ((m_reg & 3) << 7), source);
}
-WRITE8_MEMBER(nes_bmc_411120c_device::write_m)
+void nes_bmc_411120c_device::write_m(offs_t offset, uint8_t data)
{
LOG_MMC(("bmc_411120c write_m, offset: %04x, data: %02x\n", offset, data));
@@ -2422,7 +2422,7 @@ void nes_bmc_830118c_device::chr_cb(int start, int bank, int source)
chr1_x(start, (bank & 0x7f) | ((m_reg & 0x0c) << 5), source);
}
-WRITE8_MEMBER(nes_bmc_830118c_device::write_m)
+void nes_bmc_830118c_device::write_m(offs_t offset, uint8_t data)
{
LOG_MMC(("bmc_830118c write_m, offset: %04x, data: %02x\n", offset, data));
@@ -2478,7 +2478,7 @@ inline void nes_pjoy84_device::set_base_mask()
m_chr_mask = BIT(m_reg[0], 7) ? 0x7f : 0xff;
}
-WRITE8_MEMBER(nes_pjoy84_device::write_m)
+void nes_pjoy84_device::write_m(offs_t offset, uint8_t data)
{
LOG_MMC(("pjoy84 write_m, offset: %04x, data: %02x\n", offset, data));
@@ -2523,7 +2523,7 @@ void nes_coolboy_device::chr_cb(int start, int bank, int source)
chr1_x(start, bank, source);
}
-WRITE8_MEMBER(nes_coolboy_device::write_m)
+void nes_coolboy_device::write_m(offs_t offset, uint8_t data)
{
LOG_MMC(("coolboy write_m, offset: %04x, data: %02x\n", offset, data));
@@ -2593,7 +2593,7 @@ void nes_a9746_device::update_banks(uint8_t value)
}
}
-WRITE8_MEMBER(nes_a9746_device::write_h)
+void nes_a9746_device::write_h(offs_t offset, uint8_t data)
{
LOG_MMC(("unl_a9746 write_h, offset: %04x, data: %02x\n", offset, data));
@@ -2619,7 +2619,7 @@ WRITE8_MEMBER(nes_a9746_device::write_h)
break;
default:
- txrom_write(space, offset, data, mem_mask);
+ txrom_write(offset, data);
break;
}
}
diff --git a/src/devices/bus/nes/mmc3_clones.h b/src/devices/bus/nes/mmc3_clones.h
index b6102e8fd62..680e86b4c9c 100644
--- a/src/devices/bus/nes/mmc3_clones.h
+++ b/src/devices/bus/nes/mmc3_clones.h
@@ -17,7 +17,7 @@ public:
nes_nitra_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
// device-level overrides
- virtual DECLARE_WRITE8_MEMBER(write_h) override;
+ virtual void write_h(offs_t offset, uint8_t data) override;
};
@@ -30,7 +30,7 @@ public:
nes_ks7057_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
// device-level overrides
- virtual DECLARE_WRITE8_MEMBER(write_h) override;
+ virtual void write_h(offs_t offset, uint8_t data) override;
};
@@ -43,7 +43,7 @@ public:
nes_sbros11_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
// device-level overrides
- virtual DECLARE_WRITE8_MEMBER(write_h) override;
+ virtual void write_h(offs_t offset, uint8_t data) override;
};
@@ -56,7 +56,7 @@ public:
nes_malisb_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
// device-level overrides
- virtual DECLARE_WRITE8_MEMBER(write_h) override;
+ virtual void write_h(offs_t offset, uint8_t data) override;
virtual void prg_cb(int start, int bank) override;
virtual void chr_cb(int start, int bank, int source) override;
};
@@ -71,7 +71,7 @@ public:
nes_family4646_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
// device-level overrides
- virtual DECLARE_WRITE8_MEMBER(write_m) override;
+ virtual void write_m(offs_t offset, uint8_t data) override;
virtual void pcb_reset() override;
};
@@ -85,9 +85,9 @@ public:
// construction/destruction
nes_pikay2k_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- virtual DECLARE_READ8_MEMBER(read_m) override;
- virtual DECLARE_WRITE8_MEMBER(write_m) override;
- virtual DECLARE_WRITE8_MEMBER(write_h) override;
+ virtual uint8_t read_m(offs_t offset) override;
+ virtual void write_m(offs_t offset, uint8_t data) override;
+ virtual void write_h(offs_t offset, uint8_t data) override;
virtual void pcb_reset() override;
@@ -110,8 +110,8 @@ public:
// device-level overrides
virtual void device_start() override;
- virtual DECLARE_WRITE8_MEMBER(write_l) override;
- virtual DECLARE_WRITE8_MEMBER(write_h) override;
+ virtual void write_l(offs_t offset, uint8_t data) override;
+ virtual void write_h(offs_t offset, uint8_t data) override;
virtual void prg_cb(int start, int bank) override;
virtual void chr_cb(int start, int bank, int source) override;
@@ -131,8 +131,8 @@ public:
// construction/destruction
nes_sglionk_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- virtual DECLARE_WRITE8_MEMBER(write_m) override;
- virtual DECLARE_WRITE8_MEMBER(write_h) override;
+ virtual void write_m(offs_t offset, uint8_t data) override;
+ virtual void write_h(offs_t offset, uint8_t data) override;
virtual void pcb_reset() override;
@@ -154,9 +154,9 @@ public:
// construction/destruction
nes_sgboog_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- virtual DECLARE_WRITE8_MEMBER(write_l) override;
- virtual DECLARE_WRITE8_MEMBER(write_m) override;
- virtual DECLARE_WRITE8_MEMBER(write_h) override;
+ virtual void write_l(offs_t offset, uint8_t data) override;
+ virtual void write_m(offs_t offset, uint8_t data) override;
+ virtual void write_h(offs_t offset, uint8_t data) override;
virtual void prg_cb(int start, int bank) override;
virtual void chr_cb(int start, int bank, int source) override;
@@ -181,7 +181,7 @@ public:
// construction/destruction
nes_kasing_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- virtual DECLARE_WRITE8_MEMBER(write_m) override;
+ virtual void write_m(offs_t offset, uint8_t data) override;
virtual void prg_cb(int start, int bank) override;
virtual void pcb_reset() override;
@@ -203,9 +203,9 @@ public:
// construction/destruction
nes_kay_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- virtual DECLARE_READ8_MEMBER(read_l) override;
- virtual DECLARE_WRITE8_MEMBER(write_l) override;
- virtual DECLARE_WRITE8_MEMBER(write_h) override;
+ virtual uint8_t read_l(offs_t offset) override;
+ virtual void write_l(offs_t offset, uint8_t data) override;
+ virtual void write_h(offs_t offset, uint8_t data) override;
virtual void prg_cb(int start, int bank) override;
virtual void chr_cb(int start, int bank, int source) override;
@@ -230,9 +230,9 @@ public:
// construction/destruction
nes_h2288_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- virtual DECLARE_READ8_MEMBER(read_l) override;
- virtual DECLARE_WRITE8_MEMBER(write_l) override;
- virtual DECLARE_WRITE8_MEMBER(write_h) override;
+ virtual uint8_t read_l(offs_t offset) override;
+ virtual void write_l(offs_t offset, uint8_t data) override;
+ virtual void write_h(offs_t offset, uint8_t data) override;
virtual void prg_cb(int start, int bank) override;
virtual void pcb_reset() override;
@@ -254,12 +254,12 @@ public:
// construction/destruction
nes_6035052_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- virtual DECLARE_READ8_MEMBER(read_ex) override;
- virtual DECLARE_WRITE8_MEMBER(write_ex) override;
- virtual DECLARE_READ8_MEMBER(read_l) override { return read_ex(space, offset, mem_mask); }
- virtual DECLARE_READ8_MEMBER(read_m) override { return read_ex(space, offset, mem_mask); }
- virtual DECLARE_WRITE8_MEMBER(write_l) override { write_ex(space, offset, data, mem_mask); }
- virtual DECLARE_WRITE8_MEMBER(write_m) override { write_ex(space, offset, data, mem_mask); }
+ virtual uint8_t read_ex(offs_t offset) override;
+ virtual void write_ex(offs_t offset, uint8_t data) override;
+ virtual uint8_t read_l(offs_t offset) override { return read_ex(offset); }
+ virtual uint8_t read_m(offs_t offset) override { return read_ex(offset); }
+ virtual void write_l(offs_t offset, uint8_t data) override { write_ex(offset, data); }
+ virtual void write_m(offs_t offset, uint8_t data) override { write_ex(offset, data); }
virtual void pcb_reset() override;
@@ -281,8 +281,8 @@ public:
nes_txc_tw_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
// device-level overrides
- virtual DECLARE_WRITE8_MEMBER(write_l) override;
- virtual DECLARE_WRITE8_MEMBER(write_m) override { write_l(space, offset & 0xff, data, mem_mask); } // offset does not really count for this mapper }
+ virtual void write_l(offs_t offset, uint8_t data) override;
+ virtual void write_m(offs_t offset, uint8_t data) override { write_l(offset & 0xff, data); } // offset does not really count for this mapper }
virtual void prg_cb(int start, int bank) override;
};
@@ -296,7 +296,7 @@ public:
nes_kof97_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
// device-level overrides
- virtual DECLARE_WRITE8_MEMBER(write_h) override;
+ virtual void write_h(offs_t offset, uint8_t data) override;
};
@@ -308,9 +308,9 @@ public:
// construction/destruction
nes_kof96_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- virtual DECLARE_READ8_MEMBER(read_l) override;
- virtual DECLARE_WRITE8_MEMBER(write_l) override;
- virtual DECLARE_WRITE8_MEMBER(write_h) override; // offset does not really count for this mapper
+ virtual uint8_t read_l(offs_t offset) override;
+ virtual void write_l(offs_t offset, uint8_t data) override;
+ virtual void write_h(offs_t offset, uint8_t data) override; // offset does not really count for this mapper
virtual void prg_cb(int start, int bank) override;
virtual void chr_cb(int start, int bank, int source) override;
@@ -334,7 +334,7 @@ public:
nes_sf3_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
// device-level overrides
- virtual DECLARE_WRITE8_MEMBER(write_h) override;
+ virtual void write_h(offs_t offset, uint8_t data) override;
protected:
virtual void set_chr(uint8_t chr, int chr_base, int chr_mask) override;
@@ -349,8 +349,8 @@ public:
// construction/destruction
nes_gouder_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- virtual DECLARE_READ8_MEMBER(read_l) override;
- virtual DECLARE_WRITE8_MEMBER(write_l) override;
+ virtual uint8_t read_l(offs_t offset) override;
+ virtual void write_l(offs_t offset, uint8_t data) override;
virtual void prg_cb(int start, int bank) override;
virtual void pcb_reset() override;
@@ -372,7 +372,7 @@ public:
// construction/destruction
nes_sa9602b_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- virtual DECLARE_WRITE8_MEMBER(write_h) override;
+ virtual void write_h(offs_t offset, uint8_t data) override;
virtual void prg_cb(int start, int bank) override;
virtual void pcb_reset() override;
@@ -395,8 +395,8 @@ public:
// construction/destruction
nes_sachen_shero_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- virtual DECLARE_READ8_MEMBER(read_l) override;
- virtual DECLARE_WRITE8_MEMBER(write_l) override;
+ virtual uint8_t read_l(offs_t offset) override;
+ virtual void write_l(offs_t offset, uint8_t data) override;
virtual void chr_cb(int start, int bank, int source) override;
virtual void pcb_reset() override;
@@ -418,7 +418,7 @@ public:
// construction/destruction
nes_a9746_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- virtual DECLARE_WRITE8_MEMBER(write_h) override;
+ virtual void write_h(offs_t offset, uint8_t data) override;
virtual void pcb_reset();
@@ -441,8 +441,8 @@ public:
// construction/destruction
nes_fk23c_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- virtual DECLARE_WRITE8_MEMBER(write_l) override;
- virtual DECLARE_WRITE8_MEMBER(write_h) override;
+ virtual void write_l(offs_t offset, uint8_t data) override;
+ virtual void write_h(offs_t offset, uint8_t data) override;
virtual void prg_cb(int start, int bank) override;
virtual void chr_cb(int start, int bank, int source) override;
@@ -481,7 +481,7 @@ public:
// construction/destruction
nes_s24in1sc03_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- virtual DECLARE_WRITE8_MEMBER(write_l) override;
+ virtual void write_l(offs_t offset, uint8_t data) override;
virtual void prg_cb(int start, int bank) override;
virtual void chr_cb(int start, int bank, int source) override;
@@ -505,7 +505,7 @@ public:
nes_bmc_15in1_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
// device-level overrides
- virtual DECLARE_WRITE8_MEMBER(write_m) override;
+ virtual void write_m(offs_t offset, uint8_t data) override;
virtual void pcb_reset() override;
};
@@ -520,7 +520,7 @@ public:
nes_bmc_sbig7_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
// device-level overrides
- virtual DECLARE_WRITE8_MEMBER(write_h) override;
+ virtual void write_h(offs_t offset, uint8_t data) override;
virtual void pcb_reset() override;
};
@@ -534,7 +534,7 @@ public:
// construction/destruction
nes_bmc_hik8_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- virtual DECLARE_WRITE8_MEMBER(write_m) override;
+ virtual void write_m(offs_t offset, uint8_t data) override;
virtual void pcb_reset() override;
@@ -557,7 +557,7 @@ public:
nes_bmc_hik4_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
// device-level overrides
- virtual DECLARE_WRITE8_MEMBER(write_m) override;
+ virtual void write_m(offs_t offset, uint8_t data) override;
virtual void pcb_reset() override;
};
@@ -571,7 +571,7 @@ public:
// construction/destruction
nes_bmc_mario7in1_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- virtual DECLARE_WRITE8_MEMBER(write_m) override;
+ virtual void write_m(offs_t offset, uint8_t data) override;
virtual void pcb_reset() override;
@@ -592,7 +592,7 @@ public:
// construction/destruction
nes_bmc_gold7in1_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- virtual DECLARE_WRITE8_MEMBER(write_m) override;
+ virtual void write_m(offs_t offset, uint8_t data) override;
virtual void pcb_reset() override;
@@ -613,8 +613,8 @@ public:
// construction/destruction
nes_bmc_gc6in1_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- virtual DECLARE_WRITE8_MEMBER(write_l) override;
- virtual DECLARE_WRITE8_MEMBER(write_h) override;
+ virtual void write_l(offs_t offset, uint8_t data) override;
+ virtual void write_h(offs_t offset, uint8_t data) override;
virtual void prg_cb(int start, int bank) override;
virtual void chr_cb(int start, int bank, int source) override;
@@ -637,7 +637,7 @@ public:
// construction/destruction
nes_bmc_411120c_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- virtual DECLARE_WRITE8_MEMBER(write_m) override;
+ virtual void write_m(offs_t offset, uint8_t data) override;
virtual void prg_cb(int start, int bank) override;
virtual void chr_cb(int start, int bank, int source) override;
@@ -660,7 +660,7 @@ public:
// construction/destruction
nes_bmc_830118c_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- virtual DECLARE_WRITE8_MEMBER(write_m) override;
+ virtual void write_m(offs_t offset, uint8_t data) override;
virtual void prg_cb(int start, int bank) override;
virtual void chr_cb(int start, int bank, int source) override;
@@ -683,7 +683,7 @@ public:
// construction/destruction
nes_pjoy84_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- virtual DECLARE_WRITE8_MEMBER(write_m) override;
+ virtual void write_m(offs_t offset, uint8_t data) override;
virtual void prg_cb(int start, int bank) override;
virtual void chr_cb(int start, int bank, int source) override;
@@ -707,7 +707,7 @@ public:
nes_coolboy_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
// device-level overrides
- virtual DECLARE_WRITE8_MEMBER(write_m) override;
+ virtual void write_m(offs_t offset, uint8_t data) override;
virtual void prg_cb(int start, int bank) override;
virtual void chr_cb(int start, int bank, int source) override;
diff --git a/src/devices/bus/nes/mmc5.cpp b/src/devices/bus/nes/mmc5.cpp
index 681b9491ef2..b512f914e8b 100644
--- a/src/devices/bus/nes/mmc5.cpp
+++ b/src/devices/bus/nes/mmc5.cpp
@@ -287,7 +287,7 @@ inline bool nes_exrom_device::in_split()
return false;
}
-READ8_MEMBER(nes_exrom_device::nt_r)
+uint8_t nes_exrom_device::nt_r(offs_t offset)
{
int page = ((offset & 0xc00) >> 10);
@@ -339,7 +339,7 @@ READ8_MEMBER(nes_exrom_device::nt_r)
}
}
-WRITE8_MEMBER(nes_exrom_device::nt_w)
+void nes_exrom_device::nt_w(offs_t offset, uint8_t data)
{
int page = ((offset & 0xc00) >> 10);
@@ -397,7 +397,7 @@ inline uint8_t nes_exrom_device::bg_ex1_chr_r(uint32_t offset)
return m_vrom[helper & (m_vrom_size - 1)];
}
-READ8_MEMBER(nes_exrom_device::chr_r)
+uint8_t nes_exrom_device::chr_r(offs_t offset)
{
int bank = offset >> 10;
@@ -425,7 +425,7 @@ READ8_MEMBER(nes_exrom_device::chr_r)
}
-READ8_MEMBER(nes_exrom_device::read_l)
+uint8_t nes_exrom_device::read_l(offs_t offset)
{
int value;
LOG_MMC(("exrom read_l, offset: %04x\n", offset));
@@ -437,7 +437,7 @@ READ8_MEMBER(nes_exrom_device::read_l)
if (BIT(m_exram_control, 1)) // Modes 2,3 = read
return m_exram[offset - 0x1c00];
else
- return m_open_bus; // Modes 0,1 = open bus
+ return get_open_bus(); // Modes 0,1 = open bus
}
switch (offset)
@@ -455,12 +455,12 @@ READ8_MEMBER(nes_exrom_device::read_l)
default:
logerror("MMC5 uncaught read, offset: %04x\n", offset + 0x4100);
- return m_open_bus;
+ return get_open_bus();
}
}
-WRITE8_MEMBER(nes_exrom_device::write_l)
+void nes_exrom_device::write_l(offs_t offset, uint8_t data)
{
LOG_MMC(("exrom write_l, offset: %04x, data: %02x\n", offset, data));
offset += 0x100;
@@ -618,7 +618,7 @@ WRITE8_MEMBER(nes_exrom_device::write_l)
// bit3 select the chip (2 of them can be accessed, each up to 32KB)
// bit1 & bit2 select the 8KB banks inside the chip
// same mechanism is used also when "WRAM" is mapped in higher banks
-READ8_MEMBER(nes_exrom_device::read_m)
+uint8_t nes_exrom_device::read_m(offs_t offset)
{
LOG_MMC(("exrom read_m, offset: %04x\n", offset));
if (!m_battery.empty() && !m_prgram.empty()) // 2 chips present: first is BWRAM, second is WRAM
@@ -633,10 +633,10 @@ READ8_MEMBER(nes_exrom_device::read_m)
else if (!m_battery.empty()) // 1 chip, BWRAM
return m_battery[(offset + (m_wram_base & 0x03) * 0x2000) & (m_battery.size() - 1)];
else
- return m_open_bus;
+ return get_open_bus();
}
-WRITE8_MEMBER(nes_exrom_device::write_m)
+void nes_exrom_device::write_m(offs_t offset, uint8_t data)
{
LOG_MMC(("exrom write_m, offset: %04x, data: %02x\n", offset, data));
if (m_wram_protect_1 != 0x02 || m_wram_protect_2 != 0x01)
@@ -649,7 +649,7 @@ WRITE8_MEMBER(nes_exrom_device::write_m)
}
// some games (e.g. Bandit Kings of Ancient China) write to PRG-RAM through 0x8000-0xdfff
-READ8_MEMBER(nes_exrom_device::read_h)
+uint8_t nes_exrom_device::read_h(offs_t offset)
{
LOG_MMC(("exrom read_h, offset: %04x\n", offset));
int bank = offset / 0x2000;
@@ -665,7 +665,7 @@ READ8_MEMBER(nes_exrom_device::read_h)
return hi_access_rom(offset);
}
-WRITE8_MEMBER(nes_exrom_device::write_h)
+void nes_exrom_device::write_h(offs_t offset, uint8_t data)
{
LOG_MMC(("exrom write_h, offset: %04x, data: %02x\n", offset, data));
int bank = offset / 0x2000;
diff --git a/src/devices/bus/nes/mmc5.h b/src/devices/bus/nes/mmc5.h
index c0c07cb07a9..093a64471d0 100644
--- a/src/devices/bus/nes/mmc5.h
+++ b/src/devices/bus/nes/mmc5.h
@@ -20,16 +20,16 @@ public:
nes_exrom_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
~nes_exrom_device();
- virtual DECLARE_READ8_MEMBER(read_l) override;
- virtual DECLARE_READ8_MEMBER(read_m) override;
- virtual DECLARE_READ8_MEMBER(read_h) override;
- virtual DECLARE_WRITE8_MEMBER(write_l) override;
- virtual DECLARE_WRITE8_MEMBER(write_m) override;
- virtual DECLARE_WRITE8_MEMBER(write_h) override;
-
- virtual DECLARE_READ8_MEMBER(chr_r) override;
- virtual DECLARE_READ8_MEMBER(nt_r) override;
- virtual DECLARE_WRITE8_MEMBER(nt_w) override;
+ virtual uint8_t read_l(offs_t offset) override;
+ virtual uint8_t read_m(offs_t offset) override;
+ virtual uint8_t read_h(offs_t offset) override;
+ virtual void write_l(offs_t offset, uint8_t data) override;
+ virtual void write_m(offs_t offset, uint8_t data) override;
+ virtual void write_h(offs_t offset, uint8_t data) override;
+
+ virtual uint8_t chr_r(offs_t offset) override;
+ virtual uint8_t nt_r(offs_t offset) override;
+ virtual void nt_w(offs_t offset, uint8_t data) override;
virtual void hblank_irq(int scanline, int vblank, int blanked) override;
virtual void pcb_reset() override;
diff --git a/src/devices/bus/nes/multigame.cpp b/src/devices/bus/nes/multigame.cpp
index 6971e68ac61..c117520afe5 100644
--- a/src/devices/bus/nes/multigame.cpp
+++ b/src/devices/bus/nes/multigame.cpp
@@ -1016,7 +1016,7 @@ void nes_bmc_42in1reset_device::pcb_reset()
-------------------------------------------------*/
-WRITE8_MEMBER(nes_action52_device::write_h)
+void nes_action52_device::write_h(offs_t offset, uint8_t data)
{
uint8_t pmode = offset & 0x20;
int pbank = (offset & 0x1fc0) >> 6;
@@ -1048,7 +1048,7 @@ WRITE8_MEMBER(nes_action52_device::write_h)
-------------------------------------------------*/
-WRITE8_MEMBER(nes_caltron_device::write_m)
+void nes_caltron_device::write_m(offs_t offset, uint8_t data)
{
LOG_MMC(("caltron write_m, offset: %04x, data: %02x\n", offset, data));
@@ -1057,7 +1057,7 @@ WRITE8_MEMBER(nes_caltron_device::write_m)
prg32(offset & 0x07);
}
-WRITE8_MEMBER(nes_caltron_device::write_h)
+void nes_caltron_device::write_h(offs_t offset, uint8_t data)
{
LOG_MMC(("caltron write_h, offset: %04x, data: %02x\n", offset, data));
@@ -1077,7 +1077,7 @@ WRITE8_MEMBER(nes_caltron_device::write_h)
-------------------------------------------------*/
-WRITE8_MEMBER(nes_rumblestat_device::write_m)
+void nes_rumblestat_device::write_m(offs_t offset, uint8_t data)
{
LOG_MMC(("rumblestation write_m, offset: %04x, data: %02x\n", offset, data));
@@ -1087,7 +1087,7 @@ WRITE8_MEMBER(nes_rumblestat_device::write_m)
chr8(m_chr, CHRROM);
}
-WRITE8_MEMBER(nes_rumblestat_device::write_h)
+void nes_rumblestat_device::write_h(offs_t offset, uint8_t data)
{
LOG_MMC(("rumblestation write_h, offset: %04x, data: %02x\n", offset, data));
@@ -1129,14 +1129,14 @@ void nes_svision16_device::update_prg()
}
-READ8_MEMBER(nes_svision16_device::read_m)
+uint8_t nes_svision16_device::read_m(offs_t offset)
{
int bank = (((m_latch1 & 0x0f) << 4) | 0x0f) + 4 ; // +4 due to the eeprom
LOG_MMC(("svision16 read_m, offset: %04x\n", offset));
return m_prg[((bank * 0x2000) + (offset & 0x1fff)) & m_prg_mask];
}
-WRITE8_MEMBER(nes_svision16_device::write_m)
+void nes_svision16_device::write_m(offs_t offset, uint8_t data)
{
LOG_MMC(("svision16 write_m, offset: %04x, data: %02x\n", offset, data));
@@ -1145,7 +1145,7 @@ WRITE8_MEMBER(nes_svision16_device::write_m)
set_nt_mirroring(BIT(data, 5) ? PPU_MIRROR_HORZ : PPU_MIRROR_VERT);
}
-WRITE8_MEMBER(nes_svision16_device::write_h)
+void nes_svision16_device::write_h(offs_t offset, uint8_t data)
{
LOG_MMC(("svision16 write_h, offset: %04x, data: %02x\n", offset, data));
m_latch2 = data;
@@ -1175,7 +1175,7 @@ void nes_n625092_device::set_prg(uint8_t reg1, uint8_t reg2)
prg16_cdef(helper2 | ((reg1 & 0x70) >> 1));
}
-WRITE8_MEMBER(nes_n625092_device::write_h)
+void nes_n625092_device::write_h(offs_t offset, uint8_t data)
{
LOG_MMC(("n625092 write_h, offset: %04x, data: %02x\n", offset, data));
@@ -1213,7 +1213,7 @@ WRITE8_MEMBER(nes_n625092_device::write_h)
-------------------------------------------------*/
-WRITE8_MEMBER(nes_a65as_device::write_h)
+void nes_a65as_device::write_h(offs_t offset, uint8_t data)
{
uint8_t helper = (data & 0x30) >> 1;
LOG_MMC(("a65as write_h, offset: %04x, data: %02x\n", offset, data));
@@ -1242,7 +1242,7 @@ WRITE8_MEMBER(nes_a65as_device::write_h)
-------------------------------------------------*/
-WRITE8_MEMBER(nes_t262_device::write_h)
+void nes_t262_device::write_h(offs_t offset, uint8_t data)
{
uint8_t mmc_helper;
LOG_MMC(("t262 write_h, offset: %04x, data: %02x\n", offset, data));
@@ -1281,7 +1281,7 @@ WRITE8_MEMBER(nes_t262_device::write_h)
-------------------------------------------------*/
// Are this correct or should they work the same?
-WRITE8_MEMBER(nes_novel1_device::write_h)
+void nes_novel1_device::write_h(offs_t offset, uint8_t data)
{
LOG_MMC(("novel1 write_h, offset: %04x, data: %02x\n", offset, data));
@@ -1289,7 +1289,7 @@ WRITE8_MEMBER(nes_novel1_device::write_h)
chr8(offset & 0x07, CHRROM);
}
-WRITE8_MEMBER(nes_novel2_device::write_h)
+void nes_novel2_device::write_h(offs_t offset, uint8_t data)
{
LOG_MMC(("novel2 write_h, offset: %04x, data: %02x\n", offset, data));
@@ -1311,7 +1311,7 @@ WRITE8_MEMBER(nes_novel2_device::write_h)
-------------------------------------------------*/
-WRITE8_MEMBER(nes_studyngame_device::write_h)
+void nes_studyngame_device::write_h(offs_t offset, uint8_t data)
{
LOG_MMC(("studyngame write_h, offset: %04x, data: %02x\n", offset, data));
prg32(data);
@@ -1330,7 +1330,7 @@ WRITE8_MEMBER(nes_studyngame_device::write_h)
-------------------------------------------------*/
-WRITE8_MEMBER(nes_sgun20in1_device::write_h)
+void nes_sgun20in1_device::write_h(offs_t offset, uint8_t data)
{
LOG_MMC(("supergun20in1 write_h, offset: %04x, data: %02x\n", offset, data));
@@ -1345,7 +1345,7 @@ WRITE8_MEMBER(nes_sgun20in1_device::write_h)
-------------------------------------------------*/
-WRITE8_MEMBER(nes_vt5201_device::write_h)
+void nes_vt5201_device::write_h(offs_t offset, uint8_t data)
{
LOG_MMC(("vt5201 wirte_h, offset: %04x, data: %02x\n", offset, data));
@@ -1364,7 +1364,7 @@ WRITE8_MEMBER(nes_vt5201_device::write_h)
chr8(offset, CHRROM);
}
-READ8_MEMBER(nes_vt5201_device::read_h)
+uint8_t nes_vt5201_device::read_h(offs_t offset)
{
LOG_MMC(("bmc_vt5201 read_h, offset: %04x\n", offset));
// m_dipsetting = ioport("CARTDIPS")->read();
@@ -1383,7 +1383,7 @@ READ8_MEMBER(nes_vt5201_device::read_h)
-------------------------------------------------*/
-WRITE8_MEMBER(nes_810544c_device::write_h)
+void nes_810544c_device::write_h(offs_t offset, uint8_t data)
{
uint8_t bank = (offset >> 7);
LOG_MMC(("810544 write_h, offset: %04x, data: %02x\n", offset, data));
@@ -1407,7 +1407,7 @@ WRITE8_MEMBER(nes_810544c_device::write_h)
-------------------------------------------------*/
-WRITE8_MEMBER(nes_ntd03_device::write_h)
+void nes_ntd03_device::write_h(offs_t offset, uint8_t data)
{
uint8_t pbank = (offset >> 10) & 0x1e;
uint8_t cbank = ((offset & 0x300) >> 5) | (offset & 0x07);
@@ -1434,7 +1434,7 @@ WRITE8_MEMBER(nes_ntd03_device::write_h)
-------------------------------------------------*/
-WRITE8_MEMBER(nes_bmc_gb63_device::chr_w)
+void nes_bmc_gb63_device::chr_w(offs_t offset, uint8_t data)
{
int bank = offset >> 10;
@@ -1459,7 +1459,7 @@ void nes_bmc_gb63_device::update_banks()
// m_vram_disable = BIT(m_reg[1], 1) ? 0 : 1;
}
-WRITE8_MEMBER(nes_bmc_gb63_device::write_h)
+void nes_bmc_gb63_device::write_h(offs_t offset, uint8_t data)
{
LOG_MMC(("bmc_gb63 write_h, offset: %04x, data: %02x\n", offset, data));
@@ -1468,13 +1468,13 @@ WRITE8_MEMBER(nes_bmc_gb63_device::write_h)
update_banks();
}
-READ8_MEMBER(nes_bmc_gb63_device::read_h)
+uint8_t nes_bmc_gb63_device::read_h(offs_t offset)
{
LOG_MMC(("bmc_gb63 read_h, offset: %04x\n", offset));
// m_dipsetting = ioport("CARTDIPS")->read();
if (m_latch == 1)
- return m_open_bus; // open bus
+ return get_open_bus(); // open bus
else
return hi_access_rom(offset);
}
@@ -1493,7 +1493,7 @@ READ8_MEMBER(nes_bmc_gb63_device::read_h)
-------------------------------------------------*/
-WRITE8_MEMBER(nes_bmc_gka_device::write_h)
+void nes_bmc_gka_device::write_h(offs_t offset, uint8_t data)
{
LOG_MMC(("bmc_gka write_h, offset: %04x, data: %02x\n", offset, data));
@@ -1529,7 +1529,7 @@ WRITE8_MEMBER(nes_bmc_gka_device::write_h)
-------------------------------------------------*/
-WRITE8_MEMBER(nes_bmc_gkb_device::write_h)
+void nes_bmc_gkb_device::write_h(offs_t offset, uint8_t data)
{
uint8_t bank = (offset & 0x40) ? 0 : 1;
LOG_MMC(("bmc_gkb write_h, offset: %04x, data: %02x\n", offset, data));
@@ -1551,7 +1551,7 @@ WRITE8_MEMBER(nes_bmc_gkb_device::write_h)
-------------------------------------------------*/
-WRITE8_MEMBER(nes_bmc_ws_device::write_m)
+void nes_bmc_ws_device::write_m(offs_t offset, uint8_t data)
{
uint8_t mmc_helper;
LOG_MMC(("bmc_ws write_m, offset: %04x, data: %02x\n", offset, data));
@@ -1588,7 +1588,7 @@ WRITE8_MEMBER(nes_bmc_ws_device::write_m)
-------------------------------------------------*/
-WRITE8_MEMBER(nes_bmc_11160_device::write_h)
+void nes_bmc_11160_device::write_h(offs_t offset, uint8_t data)
{
LOG_MMC(("bmc_11160 write_h, offset: %04x, data: %02x\n", offset, data));
@@ -1607,7 +1607,7 @@ WRITE8_MEMBER(nes_bmc_11160_device::write_h)
-------------------------------------------------*/
-WRITE8_MEMBER(nes_bmc_g146_device::write_h)
+void nes_bmc_g146_device::write_h(offs_t offset, uint8_t data)
{
LOG_MMC(("bmc_g146 write_h, offset: %04x, data: %02x\n", offset, data));
@@ -1640,7 +1640,7 @@ WRITE8_MEMBER(nes_bmc_g146_device::write_h)
-------------------------------------------------*/
-WRITE8_MEMBER(nes_bmc_8157_device::write_h)
+void nes_bmc_8157_device::write_h(offs_t offset, uint8_t data)
{
LOG_MMC(("bmc_8157 write_h, offset: %04x, data: %02x\n", offset, data));
@@ -1653,7 +1653,7 @@ WRITE8_MEMBER(nes_bmc_8157_device::write_h)
set_nt_mirroring(!BIT(offset, 1) ? PPU_MIRROR_HORZ : PPU_MIRROR_VERT);
}
-READ8_MEMBER(nes_bmc_8157_device::read_h)
+uint8_t nes_bmc_8157_device::read_h(offs_t offset)
{
LOG_MMC(("bmc_8157 read_h, offset: %04x\n", offset));
// m_dipsetting = ioport("CARTDIPS")->read();
@@ -1678,7 +1678,7 @@ READ8_MEMBER(nes_bmc_8157_device::read_h)
-------------------------------------------------*/
-WRITE8_MEMBER(nes_bmc_hik300_device::write_h)
+void nes_bmc_hik300_device::write_h(offs_t offset, uint8_t data)
{
LOG_MMC(("bmc_hik300 write_h, offset: %04x, data: %02x\n", offset, data));
@@ -1707,7 +1707,7 @@ WRITE8_MEMBER(nes_bmc_hik300_device::write_h)
-------------------------------------------------*/
-WRITE8_MEMBER(nes_bmc_s700_device::write_h)
+void nes_bmc_s700_device::write_h(offs_t offset, uint8_t data)
{
LOG_MMC(("bmc_s700 write_h, offset :%04x, data: %02x\n", offset, data));
@@ -1754,7 +1754,7 @@ void nes_bmc_ball11_device::set_banks()
}
}
-WRITE8_MEMBER(nes_bmc_ball11_device::write_m)
+void nes_bmc_ball11_device::write_m(offs_t offset, uint8_t data)
{
LOG_MMC(("bmc_ball11 write_m, offset: %04x, data: %02x\n", offset, data));
@@ -1762,7 +1762,7 @@ WRITE8_MEMBER(nes_bmc_ball11_device::write_m)
set_banks();
}
-WRITE8_MEMBER(nes_bmc_ball11_device::write_h)
+void nes_bmc_ball11_device::write_h(offs_t offset, uint8_t data)
{
LOG_MMC(("bmc_ball11 write_h, offset: %04x, data: %02x\n", offset, data));
@@ -1793,7 +1793,7 @@ WRITE8_MEMBER(nes_bmc_ball11_device::write_h)
-------------------------------------------------*/
-WRITE8_MEMBER(nes_bmc_22games_device::write_h)
+void nes_bmc_22games_device::write_h(offs_t offset, uint8_t data)
{
LOG_MMC(("bmc_22games write_h, offset: %04x, data: %02x\n", offset, data));
@@ -1846,7 +1846,7 @@ void nes_bmc_64y2k_device::set_prg()
prg16_cdef(helper2);
}
-WRITE8_MEMBER(nes_bmc_64y2k_device::write_l)
+void nes_bmc_64y2k_device::write_l(offs_t offset, uint8_t data)
{
LOG_MMC(("bmc64y2k write_l, offset: %04x, data: %02x\n", offset, data));
offset += 0x100;
@@ -1866,7 +1866,7 @@ WRITE8_MEMBER(nes_bmc_64y2k_device::write_l)
set_nt_mirroring(BIT(data, 5) ? PPU_MIRROR_HORZ : PPU_MIRROR_VERT);
}
-WRITE8_MEMBER(nes_bmc_64y2k_device::write_h)
+void nes_bmc_64y2k_device::write_h(offs_t offset, uint8_t data)
{
LOG_MMC(("bmc64y2k write_h, offset: %04x, data: %02x\n", offset, data));
@@ -1904,7 +1904,7 @@ void nes_bmc_12in1_device::update_banks()
set_nt_mirroring(BIT(m_reg[2], 2) ? PPU_MIRROR_HORZ : PPU_MIRROR_VERT);
}
-WRITE8_MEMBER(nes_bmc_12in1_device::write_h)
+void nes_bmc_12in1_device::write_h(offs_t offset, uint8_t data)
{
LOG_MMC(("bmc_12in1 write_h, offset: %04x, data: %02x\n", offset, data));
@@ -1930,7 +1930,7 @@ WRITE8_MEMBER(nes_bmc_12in1_device::write_h)
-------------------------------------------------*/
-WRITE8_MEMBER(nes_bmc_20in1_device::write_h)
+void nes_bmc_20in1_device::write_h(offs_t offset, uint8_t data)
{
LOG_MMC(("bmc_20in1 write_h, offset: %04x, data: %02x\n", offset, data));
@@ -1953,7 +1953,7 @@ WRITE8_MEMBER(nes_bmc_20in1_device::write_h)
-------------------------------------------------*/
-WRITE8_MEMBER(nes_bmc_21in1_device::write_h)
+void nes_bmc_21in1_device::write_h(offs_t offset, uint8_t data)
{
LOG_MMC(("bmc_21in1 write_h, offset: %04x, data: %02x\n", offset, data));
@@ -1974,7 +1974,7 @@ WRITE8_MEMBER(nes_bmc_21in1_device::write_h)
-------------------------------------------------*/
-WRITE8_MEMBER(nes_bmc_31in1_device::write_h)
+void nes_bmc_31in1_device::write_h(offs_t offset, uint8_t data)
{
LOG_MMC(("bmc_31in1 write_h, offset: %04x, data: %02x\n", offset, data));
@@ -2006,7 +2006,7 @@ WRITE8_MEMBER(nes_bmc_31in1_device::write_h)
-------------------------------------------------*/
-WRITE8_MEMBER(nes_bmc_35in1_device::write_h)
+void nes_bmc_35in1_device::write_h(offs_t offset, uint8_t data)
{
LOG_MMC(("bmc_35in1 write_h, offset: %04x, data: %02x\n", offset, data));
@@ -2028,7 +2028,7 @@ WRITE8_MEMBER(nes_bmc_35in1_device::write_h)
-------------------------------------------------*/
-WRITE8_MEMBER(nes_bmc_36in1_device::write_h)
+void nes_bmc_36in1_device::write_h(offs_t offset, uint8_t data)
{
LOG_MMC(("bmc_36in1 write_h, offset: %04x, data: %02x\n", offset, data));
@@ -2052,7 +2052,7 @@ WRITE8_MEMBER(nes_bmc_36in1_device::write_h)
-------------------------------------------------*/
-WRITE8_MEMBER(nes_bmc_64in1_device::write_h)
+void nes_bmc_64in1_device::write_h(offs_t offset, uint8_t data)
{
int bank = (offset >> 1) & (offset >> 2) & 0x01;
@@ -2082,7 +2082,7 @@ WRITE8_MEMBER(nes_bmc_64in1_device::write_h)
-------------------------------------------------*/
-WRITE8_MEMBER(nes_bmc_70in1_device::write_h)
+void nes_bmc_70in1_device::write_h(offs_t offset, uint8_t data)
{
LOG_MMC(("bmc70in1 write_h, offset: %04x, data: %02x\n", offset, data));
@@ -2105,7 +2105,7 @@ WRITE8_MEMBER(nes_bmc_70in1_device::write_h)
}
}
-READ8_MEMBER(nes_bmc_70in1_device::read_h)
+uint8_t nes_bmc_70in1_device::read_h(offs_t offset)
{
LOG_MMC(("bmc70in1 read_h, offset: %04x\n", offset));
@@ -2128,7 +2128,7 @@ READ8_MEMBER(nes_bmc_70in1_device::read_h)
-------------------------------------------------*/
-WRITE8_MEMBER(nes_bmc_72in1_device::write_h)
+void nes_bmc_72in1_device::write_h(offs_t offset, uint8_t data)
{
int hi_bank = offset & 0x40;
int size_16 = offset & 0x1000;
@@ -2165,7 +2165,7 @@ WRITE8_MEMBER(nes_bmc_72in1_device::write_h)
-------------------------------------------------*/
// does this work for super42in1 as well?!?
-WRITE8_MEMBER(nes_bmc_76in1_device::write_h)
+void nes_bmc_76in1_device::write_h(offs_t offset, uint8_t data)
{
int hi_bank;
int size_16;
@@ -2210,7 +2210,7 @@ WRITE8_MEMBER(nes_bmc_76in1_device::write_h)
-------------------------------------------------*/
-WRITE8_MEMBER(nes_bmc_110in1_device::write_h)
+void nes_bmc_110in1_device::write_h(offs_t offset, uint8_t data)
{
uint8_t helper1 = (offset >> 12) ? 0 : 1;
uint8_t helper2 = ((offset >> 8) & 0x40) | ((offset >> 6) & 0x3f);
@@ -2237,7 +2237,7 @@ WRITE8_MEMBER(nes_bmc_110in1_device::write_h)
-------------------------------------------------*/
-WRITE8_MEMBER(nes_bmc_150in1_device::write_h)
+void nes_bmc_150in1_device::write_h(offs_t offset, uint8_t data)
{
int bank = (offset >> 1) & 0x07;
@@ -2261,7 +2261,7 @@ WRITE8_MEMBER(nes_bmc_150in1_device::write_h)
-------------------------------------------------*/
-WRITE8_MEMBER(nes_bmc_190in1_device::write_h)
+void nes_bmc_190in1_device::write_h(offs_t offset, uint8_t data)
{
LOG_MMC(("bmc190in1 write_h, offset: %04x, data: %02x\n", offset, data));
@@ -2287,7 +2287,7 @@ WRITE8_MEMBER(nes_bmc_190in1_device::write_h)
-------------------------------------------------*/
-WRITE8_MEMBER(nes_bmc_800in1_device::write_h)
+void nes_bmc_800in1_device::write_h(offs_t offset, uint8_t data)
{
LOG_MMC(("bmc800in1 write_h, offset: %04x, data: %02x\n", offset, data));
@@ -2312,7 +2312,7 @@ WRITE8_MEMBER(nes_bmc_800in1_device::write_h)
prg16_cdef(m_reg[1]);
}
-READ8_MEMBER(nes_bmc_800in1_device::read_h)
+uint8_t nes_bmc_800in1_device::read_h(offs_t offset)
{
LOG_MMC(("bmc800in1 read_h, offset: %04x\n", offset));
@@ -2335,7 +2335,7 @@ READ8_MEMBER(nes_bmc_800in1_device::read_h)
-------------------------------------------------*/
-WRITE8_MEMBER(nes_bmc_1200in1_device::chr_w)
+void nes_bmc_1200in1_device::chr_w(offs_t offset, uint8_t data)
{
int bank = offset >> 10;
@@ -2344,7 +2344,7 @@ WRITE8_MEMBER(nes_bmc_1200in1_device::chr_w)
}
-WRITE8_MEMBER(nes_bmc_1200in1_device::write_h)
+void nes_bmc_1200in1_device::write_h(offs_t offset, uint8_t data)
{
int bank = ((offset >> 2) & 0x1f) | ((offset & 0x0100) >> 3);
@@ -2390,7 +2390,7 @@ WRITE8_MEMBER(nes_bmc_1200in1_device::write_h)
-------------------------------------------------*/
-WRITE8_MEMBER(nes_bmc_gold260_device::write_h)
+void nes_bmc_gold260_device::write_h(offs_t offset, uint8_t data)
{
int bank = (offset & 0x1f) | ((offset & 0x0300) >> 3);
LOG_MMC(("bmc_gold260 write_h, offset: %04x, data: %02x\n", offset, data));
@@ -2428,7 +2428,7 @@ WRITE8_MEMBER(nes_bmc_gold260_device::write_h)
-------------------------------------------------*/
-WRITE8_MEMBER(nes_bmc_gold150_device::write_h)
+void nes_bmc_gold150_device::write_h(offs_t offset, uint8_t data)
{
int bank = (offset & 0x1f) | ((offset & 0x0200) >> 4);
LOG_MMC(("bmc_gold150 write_h, offset: %04x, data: %02x\n", offset, data));
@@ -2450,12 +2450,12 @@ WRITE8_MEMBER(nes_bmc_gold150_device::write_h)
prg32(bank);
}
-READ8_MEMBER(nes_bmc_gold150_device::read_h)
+uint8_t nes_bmc_gold150_device::read_h(offs_t offset)
{
LOG_MMC(("bmc_gold150 read_h, offset: %04x\n", offset));
if (m_latch) // open bus
- return m_open_bus;
+ return get_open_bus();
else
return hi_access_rom(offset);
}
@@ -2475,7 +2475,7 @@ READ8_MEMBER(nes_bmc_gold150_device::read_h)
-------------------------------------------------*/
-WRITE8_MEMBER(nes_bmc_ch001_device::write_h)
+void nes_bmc_ch001_device::write_h(offs_t offset, uint8_t data)
{
int bank = ((offset >> 1) & 0x1fc);
LOG_MMC(("bmc_ch001 write_h, offset: %04x, data: %02x\n", offset, data));
@@ -2503,12 +2503,12 @@ WRITE8_MEMBER(nes_bmc_ch001_device::write_h)
prg8_ef((offset & 0x07c ) | ((offset & 0x6) ? 0x3 : 0x1));
}
-READ8_MEMBER(nes_bmc_ch001_device::read_h)
+uint8_t nes_bmc_ch001_device::read_h(offs_t offset)
{
LOG_MMC(("bmc_ch001 read_h, offset: %04x\n", offset));
if (m_latch && offset < 0x4000) // open bus
- return m_open_bus;
+ return get_open_bus();
else
return hi_access_rom(offset);
}
@@ -2528,7 +2528,7 @@ READ8_MEMBER(nes_bmc_ch001_device::read_h)
-------------------------------------------------*/
-WRITE8_MEMBER(nes_bmc_super22_device::write_h)
+void nes_bmc_super22_device::write_h(offs_t offset, uint8_t data)
{
LOG_MMC(("bmc_super22 write_h, offset: %04x, data: %02x\n", offset, data));
@@ -2581,7 +2581,7 @@ WRITE8_MEMBER(nes_bmc_super22_device::write_h)
-------------------------------------------------*/
-WRITE8_MEMBER(nes_bmc_42in1reset_device::write_h)
+void nes_bmc_42in1reset_device::write_h(offs_t offset, uint8_t data)
{
int bank;
LOG_MMC(("bmc_42in1reset write_h, offset: %04x, data: %02x\n", offset, data));
diff --git a/src/devices/bus/nes/multigame.h b/src/devices/bus/nes/multigame.h
index e88ec21be58..51db3e9f821 100644
--- a/src/devices/bus/nes/multigame.h
+++ b/src/devices/bus/nes/multigame.h
@@ -16,7 +16,7 @@ public:
// construction/destruction
nes_action52_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- virtual DECLARE_WRITE8_MEMBER(write_h) override;
+ virtual void write_h(offs_t offset, uint8_t data) override;
virtual void pcb_reset() override;
@@ -34,8 +34,8 @@ public:
// construction/destruction
nes_caltron_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- virtual DECLARE_WRITE8_MEMBER(write_m) override;
- virtual DECLARE_WRITE8_MEMBER(write_h) override;
+ virtual void write_m(offs_t offset, uint8_t data) override;
+ virtual void write_h(offs_t offset, uint8_t data) override;
virtual void pcb_reset() override;
@@ -56,8 +56,8 @@ public:
// construction/destruction
nes_rumblestat_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- virtual DECLARE_WRITE8_MEMBER(write_m) override;
- virtual DECLARE_WRITE8_MEMBER(write_h) override;
+ virtual void write_m(offs_t offset, uint8_t data) override;
+ virtual void write_h(offs_t offset, uint8_t data) override;
virtual void pcb_reset() override;
@@ -78,9 +78,9 @@ public:
// construction/destruction
nes_svision16_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- virtual DECLARE_READ8_MEMBER(read_m) override;
- virtual DECLARE_WRITE8_MEMBER(write_m) override;
- virtual DECLARE_WRITE8_MEMBER(write_h) override;
+ virtual uint8_t read_m(offs_t offset) override;
+ virtual void write_m(offs_t offset, uint8_t data) override;
+ virtual void write_h(offs_t offset, uint8_t data) override;
virtual void pcb_reset() override;
@@ -102,7 +102,7 @@ public:
// construction/destruction
nes_n625092_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- virtual DECLARE_WRITE8_MEMBER(write_h) override;
+ virtual void write_h(offs_t offset, uint8_t data) override;
virtual void pcb_reset() override;
@@ -124,7 +124,7 @@ public:
// construction/destruction
nes_a65as_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- virtual DECLARE_WRITE8_MEMBER(write_h) override;
+ virtual void write_h(offs_t offset, uint8_t data) override;
virtual void pcb_reset() override;
@@ -142,7 +142,7 @@ public:
// construction/destruction
nes_t262_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- virtual DECLARE_WRITE8_MEMBER(write_h) override;
+ virtual void write_h(offs_t offset, uint8_t data) override;
virtual void pcb_reset() override;
@@ -163,7 +163,7 @@ public:
// construction/destruction
nes_novel1_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- virtual DECLARE_WRITE8_MEMBER(write_h) override;
+ virtual void write_h(offs_t offset, uint8_t data) override;
virtual void pcb_reset() override;
@@ -181,7 +181,7 @@ public:
// construction/destruction
nes_novel2_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- virtual DECLARE_WRITE8_MEMBER(write_h) override;
+ virtual void write_h(offs_t offset, uint8_t data) override;
virtual void pcb_reset() override;
@@ -199,7 +199,7 @@ public:
// construction/destruction
nes_studyngame_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- virtual DECLARE_WRITE8_MEMBER(write_h) override;
+ virtual void write_h(offs_t offset, uint8_t data) override;
virtual void pcb_reset() override;
@@ -217,7 +217,7 @@ public:
// construction/destruction
nes_sgun20in1_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- virtual DECLARE_WRITE8_MEMBER(write_h) override;
+ virtual void write_h(offs_t offset, uint8_t data) override;
virtual void pcb_reset() override;
@@ -235,8 +235,8 @@ public:
// construction/destruction
nes_vt5201_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- virtual DECLARE_READ8_MEMBER(read_h) override;
- virtual DECLARE_WRITE8_MEMBER(write_h) override;
+ virtual uint8_t read_h(offs_t offset) override;
+ virtual void write_h(offs_t offset, uint8_t data) override;
virtual void pcb_reset() override;
@@ -257,7 +257,7 @@ public:
// construction/destruction
nes_810544c_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- virtual DECLARE_WRITE8_MEMBER(write_h) override;
+ virtual void write_h(offs_t offset, uint8_t data) override;
virtual void pcb_reset() override;
@@ -275,7 +275,7 @@ public:
// construction/destruction
nes_ntd03_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- virtual DECLARE_WRITE8_MEMBER(write_h) override;
+ virtual void write_h(offs_t offset, uint8_t data) override;
virtual void pcb_reset() override;
@@ -293,9 +293,9 @@ public:
// construction/destruction
nes_bmc_gb63_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- virtual DECLARE_READ8_MEMBER(read_h) override;
- virtual DECLARE_WRITE8_MEMBER(write_h) override;
- virtual DECLARE_WRITE8_MEMBER(chr_w) override;
+ virtual uint8_t read_h(offs_t offset) override;
+ virtual void write_h(offs_t offset, uint8_t data) override;
+ virtual void chr_w(offs_t offset, uint8_t data) override;
virtual void pcb_reset() override;
@@ -318,7 +318,7 @@ public:
// construction/destruction
nes_bmc_gka_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- virtual DECLARE_WRITE8_MEMBER(write_h) override;
+ virtual void write_h(offs_t offset, uint8_t data) override;
virtual void pcb_reset() override;
@@ -339,7 +339,7 @@ public:
// construction/destruction
nes_bmc_gkb_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- virtual DECLARE_WRITE8_MEMBER(write_h) override;
+ virtual void write_h(offs_t offset, uint8_t data) override;
virtual void pcb_reset() override;
@@ -357,7 +357,7 @@ public:
// construction/destruction
nes_bmc_ws_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- virtual DECLARE_WRITE8_MEMBER(write_m) override;
+ virtual void write_m(offs_t offset, uint8_t data) override;
virtual void pcb_reset() override;
@@ -378,7 +378,7 @@ public:
// construction/destruction
nes_bmc_11160_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- virtual DECLARE_WRITE8_MEMBER(write_h) override;
+ virtual void write_h(offs_t offset, uint8_t data) override;
virtual void pcb_reset() override;
@@ -396,7 +396,7 @@ public:
// construction/destruction
nes_bmc_g146_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- virtual DECLARE_WRITE8_MEMBER(write_h) override;
+ virtual void write_h(offs_t offset, uint8_t data) override;
virtual void pcb_reset() override;
@@ -414,8 +414,8 @@ public:
// construction/destruction
nes_bmc_8157_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- virtual DECLARE_READ8_MEMBER(read_h) override;
- virtual DECLARE_WRITE8_MEMBER(write_h) override;
+ virtual uint8_t read_h(offs_t offset) override;
+ virtual void write_h(offs_t offset, uint8_t data) override;
virtual void pcb_reset() override;
@@ -433,7 +433,7 @@ public:
// construction/destruction
nes_bmc_hik300_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- virtual DECLARE_WRITE8_MEMBER(write_h) override;
+ virtual void write_h(offs_t offset, uint8_t data) override;
virtual void pcb_reset() override;
@@ -451,7 +451,7 @@ public:
// construction/destruction
nes_bmc_s700_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- virtual DECLARE_WRITE8_MEMBER(write_h) override;
+ virtual void write_h(offs_t offset, uint8_t data) override;
virtual void pcb_reset() override;
@@ -469,8 +469,8 @@ public:
// construction/destruction
nes_bmc_ball11_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- virtual DECLARE_WRITE8_MEMBER(write_m) override;
- virtual DECLARE_WRITE8_MEMBER(write_h) override;
+ virtual void write_m(offs_t offset, uint8_t data) override;
+ virtual void write_h(offs_t offset, uint8_t data) override;
virtual void pcb_reset() override;
@@ -492,7 +492,7 @@ public:
// construction/destruction
nes_bmc_22games_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- virtual DECLARE_WRITE8_MEMBER(write_h) override;
+ virtual void write_h(offs_t offset, uint8_t data) override;
virtual void pcb_reset() override;
@@ -510,8 +510,8 @@ public:
// construction/destruction
nes_bmc_64y2k_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- virtual DECLARE_WRITE8_MEMBER(write_l) override;
- virtual DECLARE_WRITE8_MEMBER(write_h) override;
+ virtual void write_l(offs_t offset, uint8_t data) override;
+ virtual void write_h(offs_t offset, uint8_t data) override;
virtual void pcb_reset() override;
@@ -533,7 +533,7 @@ public:
// construction/destruction
nes_bmc_12in1_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- virtual DECLARE_WRITE8_MEMBER(write_h) override;
+ virtual void write_h(offs_t offset, uint8_t data) override;
virtual void pcb_reset() override;
@@ -555,7 +555,7 @@ public:
// construction/destruction
nes_bmc_20in1_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- virtual DECLARE_WRITE8_MEMBER(write_h) override;
+ virtual void write_h(offs_t offset, uint8_t data) override;
virtual void pcb_reset() override;
@@ -573,7 +573,7 @@ public:
// construction/destruction
nes_bmc_21in1_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- virtual DECLARE_WRITE8_MEMBER(write_h) override;
+ virtual void write_h(offs_t offset, uint8_t data) override;
virtual void pcb_reset() override;
@@ -591,7 +591,7 @@ public:
// construction/destruction
nes_bmc_31in1_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- virtual DECLARE_WRITE8_MEMBER(write_h) override;
+ virtual void write_h(offs_t offset, uint8_t data) override;
virtual void pcb_reset() override;
@@ -609,7 +609,7 @@ public:
// construction/destruction
nes_bmc_35in1_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- virtual DECLARE_WRITE8_MEMBER(write_h) override;
+ virtual void write_h(offs_t offset, uint8_t data) override;
virtual void pcb_reset() override;
@@ -627,7 +627,7 @@ public:
// construction/destruction
nes_bmc_36in1_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- virtual DECLARE_WRITE8_MEMBER(write_h) override;
+ virtual void write_h(offs_t offset, uint8_t data) override;
virtual void pcb_reset() override;
@@ -645,7 +645,7 @@ public:
// construction/destruction
nes_bmc_64in1_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- virtual DECLARE_WRITE8_MEMBER(write_h) override;
+ virtual void write_h(offs_t offset, uint8_t data) override;
virtual void pcb_reset() override;
@@ -663,8 +663,8 @@ public:
// construction/destruction
nes_bmc_70in1_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- virtual DECLARE_READ8_MEMBER(read_h) override;
- virtual DECLARE_WRITE8_MEMBER(write_h) override;
+ virtual uint8_t read_h(offs_t offset) override;
+ virtual void write_h(offs_t offset, uint8_t data) override;
virtual void pcb_reset() override;
@@ -686,7 +686,7 @@ public:
// construction/destruction
nes_bmc_72in1_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- virtual DECLARE_WRITE8_MEMBER(write_h) override;
+ virtual void write_h(offs_t offset, uint8_t data) override;
virtual void pcb_reset() override;
@@ -704,7 +704,7 @@ public:
// construction/destruction
nes_bmc_76in1_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- virtual DECLARE_WRITE8_MEMBER(write_h) override;
+ virtual void write_h(offs_t offset, uint8_t data) override;
virtual void pcb_reset() override;
@@ -725,7 +725,7 @@ public:
// construction/destruction
nes_bmc_110in1_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- virtual DECLARE_WRITE8_MEMBER(write_h) override;
+ virtual void write_h(offs_t offset, uint8_t data) override;
virtual void pcb_reset() override;
@@ -743,7 +743,7 @@ public:
// construction/destruction
nes_bmc_150in1_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- virtual DECLARE_WRITE8_MEMBER(write_h) override;
+ virtual void write_h(offs_t offset, uint8_t data) override;
virtual void pcb_reset() override;
@@ -761,7 +761,7 @@ public:
// construction/destruction
nes_bmc_190in1_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- virtual DECLARE_WRITE8_MEMBER(write_h) override;
+ virtual void write_h(offs_t offset, uint8_t data) override;
virtual void pcb_reset() override;
@@ -779,8 +779,8 @@ public:
// construction/destruction
nes_bmc_800in1_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- virtual DECLARE_READ8_MEMBER(read_h) override;
- virtual DECLARE_WRITE8_MEMBER(write_h) override;
+ virtual uint8_t read_h(offs_t offset) override;
+ virtual void write_h(offs_t offset, uint8_t data) override;
virtual void pcb_reset() override;
@@ -802,8 +802,8 @@ public:
// construction/destruction
nes_bmc_1200in1_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- virtual DECLARE_WRITE8_MEMBER(write_h) override;
- virtual DECLARE_WRITE8_MEMBER(chr_w) override;
+ virtual void write_h(offs_t offset, uint8_t data) override;
+ virtual void chr_w(offs_t offset, uint8_t data) override;
virtual void pcb_reset() override;
@@ -824,8 +824,8 @@ public:
// construction/destruction
nes_bmc_gold150_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- virtual DECLARE_READ8_MEMBER(read_h) override;
- virtual DECLARE_WRITE8_MEMBER(write_h) override;
+ virtual uint8_t read_h(offs_t offset) override;
+ virtual void write_h(offs_t offset, uint8_t data) override;
virtual void pcb_reset() override;
@@ -846,7 +846,7 @@ public:
// construction/destruction
nes_bmc_gold260_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- virtual DECLARE_WRITE8_MEMBER(write_h) override;
+ virtual void write_h(offs_t offset, uint8_t data) override;
virtual void pcb_reset() override;
@@ -864,8 +864,8 @@ public:
// construction/destruction
nes_bmc_ch001_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- virtual DECLARE_READ8_MEMBER(read_h) override;
- virtual DECLARE_WRITE8_MEMBER(write_h) override;
+ virtual uint8_t read_h(offs_t offset) override;
+ virtual void write_h(offs_t offset, uint8_t data) override;
virtual void pcb_reset() override;
@@ -886,7 +886,7 @@ public:
// construction/destruction
nes_bmc_super22_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- virtual DECLARE_WRITE8_MEMBER(write_h) override;
+ virtual void write_h(offs_t offset, uint8_t data) override;
virtual void pcb_reset() override;
@@ -922,7 +922,7 @@ public:
// construction/destruction
nes_bmc_42in1reset_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- virtual DECLARE_WRITE8_MEMBER(write_h) override;
+ virtual void write_h(offs_t offset, uint8_t data) override;
virtual void pcb_reset() override;
diff --git a/src/devices/bus/nes/namcot.cpp b/src/devices/bus/nes/namcot.cpp
index 84b41996272..e2898d6b9ba 100644
--- a/src/devices/bus/nes/namcot.cpp
+++ b/src/devices/bus/nes/namcot.cpp
@@ -246,7 +246,7 @@ void nes_namcot163_device::pcb_reset()
-------------------------------------------------*/
-WRITE8_MEMBER(nes_namcot3433_device::dxrom_write)
+void nes_namcot3433_device::dxrom_write(offs_t offset, uint8_t data)
{
LOG_MMC(("dxrom_write, offset: %04x, data: %02x\n", offset, data));
@@ -290,7 +290,7 @@ WRITE8_MEMBER(nes_namcot3433_device::dxrom_write)
-------------------------------------------------*/
-WRITE8_MEMBER(nes_namcot3446_device::write_h)
+void nes_namcot3446_device::write_h(offs_t offset, uint8_t data)
{
LOG_MMC(("namcot3446 write_h, offset: %04x, data: %02x\n", offset, data));
@@ -334,7 +334,7 @@ WRITE8_MEMBER(nes_namcot3446_device::write_h)
-------------------------------------------------*/
-WRITE8_MEMBER(nes_namcot3425_device::write_h)
+void nes_namcot3425_device::write_h(offs_t offset, uint8_t data)
{
uint8_t mode;
LOG_MMC(("namcot3425 write_h, offset: %04x, data: %02x\n", offset, data));
@@ -407,7 +407,7 @@ void nes_namcot340_device::device_timer(emu_timer &timer, device_timer_id id, in
}
}
-WRITE8_MEMBER(nes_namcot340_device::n340_lowrite)
+void nes_namcot340_device::n340_lowrite(offs_t offset, uint8_t data)
{
LOG_MMC(("n340_lowrite, offset: %04x, data: %02x\n", offset, data));
offset += 0x100;
@@ -426,7 +426,7 @@ WRITE8_MEMBER(nes_namcot340_device::n340_lowrite)
}
}
-READ8_MEMBER(nes_namcot340_device::n340_loread)
+uint8_t nes_namcot340_device::n340_loread(offs_t offset)
{
LOG_MMC(("n340_loread, offset: %04x\n", offset));
offset += 0x100;
@@ -444,7 +444,7 @@ READ8_MEMBER(nes_namcot340_device::n340_loread)
}
}
-WRITE8_MEMBER(nes_namcot340_device::n340_hiwrite)
+void nes_namcot340_device::n340_hiwrite(offs_t offset, uint8_t data)
{
LOG_MMC(("n340_hiwrite, offset: %04x, data: %02x\n", offset, data));
@@ -505,17 +505,17 @@ WRITE8_MEMBER(nes_namcot340_device::n340_hiwrite)
-------------------------------------------------*/
-READ8_MEMBER(nes_namcot175_device::read_m)
+uint8_t nes_namcot175_device::read_m(offs_t offset)
{
// the only game supporting this is Family Circuit '91, and it has 2KB of battery
// but it's mirrored up to 8KB (see Sprint Race -> Back Up menu breakage if not)
if (!m_battery.empty() && !m_wram_protect)
return m_battery[offset & (m_battery.size() - 1)];
- return m_open_bus; // open bus
+ return get_open_bus(); // open bus
}
-WRITE8_MEMBER(nes_namcot175_device::write_m)
+void nes_namcot175_device::write_m(offs_t offset, uint8_t data)
{
// the only game supporting this is Family Circuit '91, and it has 2KB of battery
// but it's mirrored up to 8KB (see Sprint Race -> Back Up menu breakage if not)
@@ -523,7 +523,7 @@ WRITE8_MEMBER(nes_namcot175_device::write_m)
m_battery[offset & (m_battery.size() - 1)] = data;
}
-WRITE8_MEMBER(nes_namcot175_device::write_h)
+void nes_namcot175_device::write_h(offs_t offset, uint8_t data)
{
LOG_MMC(("namcot175 write_h, offset: %04x, data: %02x\n", offset, data));
@@ -536,7 +536,7 @@ WRITE8_MEMBER(nes_namcot175_device::write_h)
prg8_89(data & 0x3f);
break;
default:
- n340_hiwrite(space, offset, data, mem_mask);
+ n340_hiwrite(offset, data);
break;
}
}
@@ -560,7 +560,7 @@ WRITE8_MEMBER(nes_namcot175_device::write_h)
-------------------------------------------------*/
-WRITE8_MEMBER(nes_namcot163_device::chr_w)
+void nes_namcot163_device::chr_w(offs_t offset, uint8_t data)
{
int bank = offset >> 10;
@@ -576,7 +576,7 @@ WRITE8_MEMBER(nes_namcot163_device::chr_w)
// or ROM, so no write
}
-READ8_MEMBER(nes_namcot163_device::chr_r)
+uint8_t nes_namcot163_device::chr_r(offs_t offset)
{
int bank = offset >> 10;
if (!(m_latch & 0x40) && m_chr_bank >= 0xe0)
@@ -590,15 +590,15 @@ READ8_MEMBER(nes_namcot163_device::chr_r)
}
-READ8_MEMBER(nes_namcot163_device::read_m)
+uint8_t nes_namcot163_device::read_m(offs_t offset)
{
if (!m_battery.empty() && offset < m_battery.size())
return m_battery[offset & (m_battery.size() - 1)];
- return m_open_bus; // open bus
+ return get_open_bus(); // open bus
}
-WRITE8_MEMBER(nes_namcot163_device::write_m)
+void nes_namcot163_device::write_m(offs_t offset, uint8_t data)
{
// the pcb can separately protect each 2KB chunk of the external wram from writes
int bank = (offset & 0x1800) >> 11;
@@ -606,7 +606,7 @@ WRITE8_MEMBER(nes_namcot163_device::write_m)
m_battery[offset & (m_battery.size() - 1)] = data;
}
-WRITE8_MEMBER(nes_namcot163_device::write_l)
+void nes_namcot163_device::write_l(offs_t offset, uint8_t data)
{
LOG_MMC(("namcot163 write_l, offset: %04x, data: %02x\n", offset, data));
offset += 0x100;
@@ -617,12 +617,12 @@ WRITE8_MEMBER(nes_namcot163_device::write_l)
LOG_MMC(("Namcot-163 sound reg write, data: %02x\n", data));
break;
default:
- n340_lowrite(space, offset, data, mem_mask);
+ n340_lowrite(offset, data);
break;
}
}
-READ8_MEMBER(nes_namcot163_device::read_l)
+uint8_t nes_namcot163_device::read_l(offs_t offset)
{
LOG_MMC(("namcot163 read_l, offset: %04x\n", offset));
offset += 0x100;
@@ -633,7 +633,7 @@ READ8_MEMBER(nes_namcot163_device::read_l)
LOG_MMC(("Namcot-163 sound reg read\n"));
return 0;
default:
- return n340_loread(space, offset, mem_mask);
+ return n340_loread(offset);
}
}
@@ -645,7 +645,7 @@ void nes_namcot163_device::set_mirror(uint8_t page, uint8_t data)
set_nt_page(page, CIRAM, data & 0x01, 1);
}
-WRITE8_MEMBER(nes_namcot163_device::write_h)
+void nes_namcot163_device::write_h(offs_t offset, uint8_t data)
{
int page;
LOG_MMC(("namcot163 write_h, offset: %04x, data: %02x\n", offset, data));
@@ -680,7 +680,7 @@ WRITE8_MEMBER(nes_namcot163_device::write_h)
LOG_MMC(("Namcot-163 sound address write, data: %02x\n", data));
break;
default:
- n340_hiwrite(space, offset, data, mem_mask);
+ n340_hiwrite(offset, data);
break;
}
}
diff --git a/src/devices/bus/nes/namcot.h b/src/devices/bus/nes/namcot.h
index a4ab64084e1..bcf72f5bad4 100644
--- a/src/devices/bus/nes/namcot.h
+++ b/src/devices/bus/nes/namcot.h
@@ -16,8 +16,8 @@ public:
// construction/destruction
nes_namcot3433_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- virtual DECLARE_WRITE8_MEMBER(dxrom_write);
- virtual DECLARE_WRITE8_MEMBER(write_h) override { dxrom_write(space, offset, data, mem_mask); }
+ void dxrom_write(offs_t offset, uint8_t data);
+ virtual void write_h(offs_t offset, uint8_t data) override { dxrom_write(offset, data); }
virtual void pcb_reset() override;
@@ -40,7 +40,7 @@ public:
// construction/destruction
nes_namcot3446_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- virtual DECLARE_WRITE8_MEMBER(write_h) override;
+ virtual void write_h(offs_t offset, uint8_t data) override;
virtual void pcb_reset() override;
@@ -61,7 +61,7 @@ public:
// construction/destruction
nes_namcot3425_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- virtual DECLARE_WRITE8_MEMBER(write_h) override;
+ virtual void write_h(offs_t offset, uint8_t data) override;
virtual void pcb_reset() override;
@@ -83,12 +83,12 @@ public:
// construction/destruction
nes_namcot340_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- virtual DECLARE_READ8_MEMBER(n340_loread);
- virtual DECLARE_WRITE8_MEMBER(n340_lowrite);
- virtual DECLARE_WRITE8_MEMBER(n340_hiwrite);
- virtual DECLARE_READ8_MEMBER(read_l) override { return n340_loread(space, offset, mem_mask); }
- virtual DECLARE_WRITE8_MEMBER(write_l) override { n340_lowrite(space, offset, data, mem_mask); }
- virtual DECLARE_WRITE8_MEMBER(write_h) override { n340_hiwrite(space, offset, data, mem_mask); }
+ uint8_t n340_loread(offs_t offset);
+ void n340_lowrite(offs_t offset, uint8_t data);
+ void n340_hiwrite(offs_t offset, uint8_t data);
+ virtual uint8_t read_l(offs_t offset) override { return n340_loread(offset); }
+ virtual void write_l(offs_t offset, uint8_t data) override { n340_lowrite(offset, data); }
+ virtual void write_h(offs_t offset, uint8_t data) override { n340_hiwrite(offset, data); }
virtual void pcb_reset() override;
@@ -122,9 +122,9 @@ public:
// device-level overrides
virtual void device_start() override;
- virtual DECLARE_READ8_MEMBER(read_m) override;
- virtual DECLARE_WRITE8_MEMBER(write_m) override;
- virtual DECLARE_WRITE8_MEMBER(write_h) override;
+ virtual uint8_t read_m(offs_t offset) override;
+ virtual void write_m(offs_t offset, uint8_t data) override;
+ virtual void write_h(offs_t offset, uint8_t data) override;
virtual void pcb_reset() override;
@@ -141,15 +141,15 @@ public:
// construction/destruction
nes_namcot163_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- virtual DECLARE_READ8_MEMBER(read_l) override;
- virtual DECLARE_READ8_MEMBER(read_m) override;
- virtual DECLARE_WRITE8_MEMBER(write_l) override;
- virtual DECLARE_WRITE8_MEMBER(write_m) override;
- virtual DECLARE_WRITE8_MEMBER(write_h) override;
+ virtual uint8_t read_l(offs_t offset) override;
+ virtual uint8_t read_m(offs_t offset) override;
+ virtual void write_l(offs_t offset, uint8_t data) override;
+ virtual void write_m(offs_t offset, uint8_t data) override;
+ virtual void write_h(offs_t offset, uint8_t data) override;
// we have to overwrite these to allow CIRAM to be used for VRAM, even if it's not clear which game(s) use this
- virtual DECLARE_READ8_MEMBER(chr_r) override;
- virtual DECLARE_WRITE8_MEMBER(chr_w) override;
+ virtual uint8_t chr_r(offs_t offset) override;
+ virtual void chr_w(offs_t offset, uint8_t data) override;
virtual void pcb_reset() override;
diff --git a/src/devices/bus/nes/nanjing.cpp b/src/devices/bus/nes/nanjing.cpp
index 26a7e20f97c..9719816beb2 100644
--- a/src/devices/bus/nes/nanjing.cpp
+++ b/src/devices/bus/nes/nanjing.cpp
@@ -111,7 +111,7 @@ void nes_nanjing_device::hblank_irq(int scanline, int vblank, int blanked)
}
-WRITE8_MEMBER(nes_nanjing_device::write_l)
+void nes_nanjing_device::write_l(offs_t offset, uint8_t data)
{
LOG_MMC(("nanjing write_l, offset: %04x, data: %02x\n", offset, data));
@@ -154,7 +154,7 @@ WRITE8_MEMBER(nes_nanjing_device::write_l)
prg32((m_reg[0] & 0x0f) | ((m_reg[1] & 0x0f) << 4));
}
-READ8_MEMBER(nes_nanjing_device::read_l)
+uint8_t nes_nanjing_device::read_l(offs_t offset)
{
uint8_t value = 0;
LOG_MMC(("nanjing read_l, offset: %04x\n", offset));
diff --git a/src/devices/bus/nes/nanjing.h b/src/devices/bus/nes/nanjing.h
index a231872a124..c5a71032573 100644
--- a/src/devices/bus/nes/nanjing.h
+++ b/src/devices/bus/nes/nanjing.h
@@ -19,8 +19,8 @@ public:
nes_nanjing_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
~nes_nanjing_device();
- virtual DECLARE_READ8_MEMBER(read_l) override;
- virtual DECLARE_WRITE8_MEMBER(write_l) override;
+ virtual uint8_t read_l(offs_t offset) override;
+ virtual void write_l(offs_t offset, uint8_t data) override;
virtual void hblank_irq(int scanline, int vblank, int blanked) override;
virtual void pcb_reset() override;
diff --git a/src/devices/bus/nes/nes_slot.cpp b/src/devices/bus/nes/nes_slot.cpp
index c3d036b8493..ab8235ccc55 100644
--- a/src/devices/bus/nes/nes_slot.cpp
+++ b/src/devices/bus/nes/nes_slot.cpp
@@ -592,6 +592,12 @@ void device_nes_cart_interface::reset_cpu()
m_maincpu->set_pc(0xfffc);
}
+void device_nes_cart_interface::poke(offs_t offset, uint8_t data)
+{
+ // even worse hack
+ m_maincpu->space(AS_PROGRAM).write_byte(offset, data);
+}
+
//-------------------------------------------------
// Other helpers
//-------------------------------------------------
@@ -624,7 +630,7 @@ uint8_t device_nes_cart_interface::account_bus_conflict(uint32_t offset, uint8_t
// PPU accessors
//-------------------------------------------------
-WRITE8_MEMBER(device_nes_cart_interface::chr_w)
+void device_nes_cart_interface::chr_w(offs_t offset, uint8_t data)
{
int bank = offset >> 10;
@@ -632,14 +638,14 @@ WRITE8_MEMBER(device_nes_cart_interface::chr_w)
m_chr_access[bank][offset & 0x3ff] = data;
}
-READ8_MEMBER(device_nes_cart_interface::chr_r)
+uint8_t device_nes_cart_interface::chr_r(offs_t offset)
{
int bank = offset >> 10;
return m_chr_access[bank][offset & 0x3ff];
}
-WRITE8_MEMBER(device_nes_cart_interface::nt_w)
+void device_nes_cart_interface::nt_w(offs_t offset, uint8_t data)
{
int page = ((offset & 0xc00) >> 10);
@@ -649,7 +655,7 @@ WRITE8_MEMBER(device_nes_cart_interface::nt_w)
m_nt_access[page][offset & 0x3ff] = data;
}
-READ8_MEMBER(device_nes_cart_interface::nt_r)
+uint8_t device_nes_cart_interface::nt_r(offs_t offset)
{
int page = ((offset & 0xc00) >> 10);
return m_nt_access[page][offset & 0x3ff];
@@ -665,26 +671,26 @@ READ8_MEMBER(device_nes_cart_interface::nt_r)
// source)
//-------------------------------------------------
-READ8_MEMBER(device_nes_cart_interface::read_l)
+uint8_t device_nes_cart_interface::read_l(offs_t offset)
{
- return m_open_bus;
+ return get_open_bus();
}
-READ8_MEMBER(device_nes_cart_interface::read_m)
+uint8_t device_nes_cart_interface::read_m(offs_t offset)
{
if (!m_battery.empty())
return m_battery[offset & (m_battery.size() - 1)];
if (!m_prgram.empty())
return m_prgram[offset & (m_prgram.size() - 1)];
- return m_open_bus;
+ return get_open_bus();
}
-WRITE8_MEMBER(device_nes_cart_interface::write_l)
+void device_nes_cart_interface::write_l(offs_t offset, uint8_t data)
{
}
-WRITE8_MEMBER(device_nes_cart_interface::write_m)
+void device_nes_cart_interface::write_m(offs_t offset, uint8_t data)
{
if (!m_battery.empty())
m_battery[offset & (m_battery.size() - 1)] = data;
@@ -692,7 +698,7 @@ WRITE8_MEMBER(device_nes_cart_interface::write_m)
m_prgram[offset & (m_prgram.size() - 1)] = data;
}
-WRITE8_MEMBER(device_nes_cart_interface::write_h)
+void device_nes_cart_interface::write_h(offs_t offset, uint8_t data)
{
}
@@ -740,6 +746,9 @@ void device_nes_cart_interface::pcb_start(running_machine &machine, uint8_t *cir
device().save_item(NAME(m_vram));
if (!m_battery.empty())
device().save_item(NAME(m_battery));
+
+ // open bus
+ device().save_item(NAME(m_open_bus));
}
void device_nes_cart_interface::pcb_reg_postload(running_machine &machine)
@@ -943,11 +952,11 @@ std::string nes_cart_slot_device::get_default_card_software(get_default_card_sof
read
-------------------------------------------------*/
-READ8_MEMBER(nes_cart_slot_device::read_l)
+uint8_t nes_cart_slot_device::read_l(offs_t offset)
{
if (m_cart)
{
- uint8_t val = m_cart->read_l(space, offset);
+ uint8_t val = m_cart->read_l(offset);
// update open bus
m_cart->set_open_bus(((offset + 0x4100) & 0xff00) >> 8);
return val;
@@ -956,11 +965,11 @@ READ8_MEMBER(nes_cart_slot_device::read_l)
return 0xff;
}
-READ8_MEMBER(nes_cart_slot_device::read_m)
+uint8_t nes_cart_slot_device::read_m(offs_t offset)
{
if (m_cart)
{
- uint8_t val = m_cart->read_m(space, offset);
+ uint8_t val = m_cart->read_m(offset);
// update open bus
m_cart->set_open_bus(((offset + 0x6000) & 0xff00) >> 8);
return val;
@@ -969,11 +978,11 @@ READ8_MEMBER(nes_cart_slot_device::read_m)
return 0xff;
}
-READ8_MEMBER(nes_cart_slot_device::read_h)
+uint8_t nes_cart_slot_device::read_h(offs_t offset)
{
if (m_cart)
{
- uint8_t val = m_cart->read_h(space, offset);
+ uint8_t val = m_cart->read_h(offset);
// update open bus
m_cart->set_open_bus(((offset + 0x8000) & 0xff00) >> 8);
return val;
@@ -982,11 +991,11 @@ READ8_MEMBER(nes_cart_slot_device::read_h)
return 0xff;
}
-READ8_MEMBER(nes_cart_slot_device::read_ex)
+uint8_t nes_cart_slot_device::read_ex(offs_t offset)
{
if (m_cart)
{
- uint8_t val = m_cart->read_ex(space, offset);
+ uint8_t val = m_cart->read_ex(offset);
// update open bus
m_cart->set_open_bus(((offset + 0x4020) & 0xff00) >> 8);
return val;
@@ -1000,41 +1009,41 @@ READ8_MEMBER(nes_cart_slot_device::read_ex)
write
-------------------------------------------------*/
-WRITE8_MEMBER(nes_cart_slot_device::write_l)
+void nes_cart_slot_device::write_l(offs_t offset, uint8_t data)
{
if (m_cart)
{
- m_cart->write_l(space, offset, data);
+ m_cart->write_l(offset, data);
// update open bus
m_cart->set_open_bus(((offset + 0x4100) & 0xff00) >> 8);
}
}
-WRITE8_MEMBER(nes_cart_slot_device::write_m)
+void nes_cart_slot_device::write_m(offs_t offset, uint8_t data)
{
if (m_cart)
{
- m_cart->write_m(space, offset, data);
+ m_cart->write_m(offset, data);
// update open bus
m_cart->set_open_bus(((offset + 0x6000) & 0xff00) >> 8);
}
}
-WRITE8_MEMBER(nes_cart_slot_device::write_h)
+void nes_cart_slot_device::write_h(offs_t offset, uint8_t data)
{
if (m_cart)
{
- m_cart->write_h(space, offset, data);
+ m_cart->write_h(offset, data);
// update open bus
m_cart->set_open_bus(((offset + 0x8000) & 0xff00) >> 8);
}
}
-WRITE8_MEMBER(nes_cart_slot_device::write_ex)
+void nes_cart_slot_device::write_ex(offs_t offset, uint8_t data)
{
if (m_cart)
{
- m_cart->write_ex(space, offset, data);
+ m_cart->write_ex(offset, data);
// update open bus
m_cart->set_open_bus(((offset + 0x4020) & 0xff00) >> 8);
}
diff --git a/src/devices/bus/nes/nes_slot.h b/src/devices/bus/nes/nes_slot.h
index b86dbfb1e41..952ffd74b1f 100644
--- a/src/devices/bus/nes/nes_slot.h
+++ b/src/devices/bus/nes/nes_slot.h
@@ -166,19 +166,19 @@ public:
virtual ~device_nes_cart_interface();
// reading and writing
- virtual DECLARE_READ8_MEMBER(read_l);
- virtual DECLARE_READ8_MEMBER(read_m);
- virtual DECLARE_READ8_MEMBER(read_h) { return 0xff; }
- virtual DECLARE_READ8_MEMBER(read_ex) { return 0xff; }
- virtual DECLARE_WRITE8_MEMBER(write_l);
- virtual DECLARE_WRITE8_MEMBER(write_m);
- virtual DECLARE_WRITE8_MEMBER(write_h);
- virtual DECLARE_WRITE8_MEMBER(write_ex) { }
-
- virtual DECLARE_READ8_MEMBER(chr_r);
- virtual DECLARE_WRITE8_MEMBER(chr_w);
- virtual DECLARE_READ8_MEMBER(nt_r);
- virtual DECLARE_WRITE8_MEMBER(nt_w);
+ virtual uint8_t read_l(offs_t offset);
+ virtual uint8_t read_m(offs_t offset);
+ virtual uint8_t read_h(offs_t offset) { return 0xff; }
+ virtual uint8_t read_ex(offs_t offset) { return 0xff; }
+ virtual void write_l(offs_t offset, uint8_t data);
+ virtual void write_m(offs_t offset, uint8_t data);
+ virtual void write_h(offs_t offset, uint8_t data);
+ virtual void write_ex(offs_t offset, uint8_t data) { }
+
+ virtual uint8_t chr_r(offs_t offset);
+ virtual void chr_w(offs_t offset, uint8_t data);
+ virtual uint8_t nt_r(offs_t offset);
+ virtual void nt_w(offs_t offset, uint8_t data);
// hack until disk system is made modern!
virtual void disk_flip_side() { }
@@ -202,6 +202,7 @@ public:
void set_vrc_lines(int PRG_A, int PRG_B, int CHR) { m_vrc_ls_prg_a = PRG_A; m_vrc_ls_prg_b = PRG_B; m_vrc_ls_chr = CHR; }
void set_x1_005_alt(bool val) { m_x1_005_alt_mirroring = val; }
void set_bus_conflict(bool val) { m_bus_conflict = val; }
+ uint8_t get_open_bus() { return m_open_bus; }
void set_open_bus(uint8_t val) { m_open_bus = val; }
uint8_t *get_prg_base() { return m_prg; }
@@ -237,6 +238,7 @@ protected:
DECLARE_WRITE_LINE_MEMBER(set_irq_line);
void hold_irq_line();
void reset_cpu();
+ void poke(offs_t offset, uint8_t data);
// internal state
uint8_t *m_prg;
@@ -270,8 +272,10 @@ protected:
bool m_pcb_ctrl_mirror, m_four_screen_vram, m_has_trainer;
bool m_x1_005_alt_mirroring; // temp hack for two kind of mirroring in Taito X1-005 boards (to be replaced with pin checking)
bool m_bus_conflict;
+private:
uint8_t m_open_bus;
+public:
// PRG
inline int prg_8k_bank_num(int bank);
inline void update_prg_banks(int prg_bank_start, int prg_bank_end);
@@ -388,14 +392,14 @@ public:
int nes_get_pcb_id(const char *slot);
// reading and writing
- virtual DECLARE_READ8_MEMBER(read_l);
- virtual DECLARE_READ8_MEMBER(read_m);
- virtual DECLARE_READ8_MEMBER(read_h);
- virtual DECLARE_READ8_MEMBER(read_ex);
- virtual DECLARE_WRITE8_MEMBER(write_l);
- virtual DECLARE_WRITE8_MEMBER(write_m);
- virtual DECLARE_WRITE8_MEMBER(write_h);
- virtual DECLARE_WRITE8_MEMBER(write_ex);
+ virtual uint8_t read_l(offs_t offset);
+ virtual uint8_t read_m(offs_t offset);
+ virtual uint8_t read_h(offs_t offset);
+ virtual uint8_t read_ex(offs_t offset);
+ virtual void write_l(offs_t offset, uint8_t data);
+ virtual void write_m(offs_t offset, uint8_t data);
+ virtual void write_h(offs_t offset, uint8_t data);
+ virtual void write_ex(offs_t offset, uint8_t data);
// hack until disk system is made modern!
virtual void disk_flip_side() { if (m_cart) m_cart->disk_flip_side(); }
@@ -429,9 +433,4 @@ DECLARE_DEVICE_TYPE(NES_CART_SLOT, nes_cart_slot_device)
#define NESSLOT_PRGROM_REGION_TAG ":cart:prg_rom"
#define NESSLOT_CHRROM_REGION_TAG ":cart:chr_rom"
-
-#define MCFG_NES_CARTRIDGE_NOT_MANDATORY \
- static_cast<nes_cart_slot_device *>(device)->set_must_be_loaded(false);
-
-
#endif // MAME_BUS_NES_NES_SLOT_H
diff --git a/src/devices/bus/nes/ntdec.cpp b/src/devices/bus/nes/ntdec.cpp
index 5ea3458e8f3..6fbcd6f31ef 100644
--- a/src/devices/bus/nes/ntdec.cpp
+++ b/src/devices/bus/nes/ntdec.cpp
@@ -102,7 +102,7 @@ void nes_ntdec_fh_device::pcb_reset()
-------------------------------------------------*/
-WRITE8_MEMBER(nes_ntdec_asder_device::write_h)
+void nes_ntdec_asder_device::write_h(offs_t offset, uint8_t data)
{
LOG_MMC(("ntdec_asder write_h, offset: %04x, data: %02x\n", offset, data));
@@ -165,7 +165,7 @@ WRITE8_MEMBER(nes_ntdec_asder_device::write_h)
-------------------------------------------------*/
-WRITE8_MEMBER(nes_ntdec_fh_device::write_m)
+void nes_ntdec_fh_device::write_m(offs_t offset, uint8_t data)
{
LOG_MMC(("ntdec_fh write_m, offset: %04x, data: %02x\n", offset, data));
diff --git a/src/devices/bus/nes/ntdec.h b/src/devices/bus/nes/ntdec.h
index 1e5e8ef6cbb..062c5d7dcec 100644
--- a/src/devices/bus/nes/ntdec.h
+++ b/src/devices/bus/nes/ntdec.h
@@ -16,7 +16,7 @@ public:
// construction/destruction
nes_ntdec_asder_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- virtual DECLARE_WRITE8_MEMBER(write_h) override;
+ virtual void write_h(offs_t offset, uint8_t data) override;
virtual void pcb_reset() override;
@@ -37,7 +37,7 @@ public:
// construction/destruction
nes_ntdec_fh_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- virtual DECLARE_WRITE8_MEMBER(write_m) override;
+ virtual void write_m(offs_t offset, uint8_t data) override;
virtual void pcb_reset() override;
diff --git a/src/devices/bus/nes/nxrom.cpp b/src/devices/bus/nes/nxrom.cpp
index e78fd6d1527..352b7534250 100644
--- a/src/devices/bus/nes/nxrom.cpp
+++ b/src/devices/bus/nes/nxrom.cpp
@@ -145,9 +145,6 @@ void nes_nrom_device::common_start()
save_item(NAME(m_nt_src));
save_item(NAME(m_nt_orig));
save_item(NAME(m_nt_writable));
-
- // open bus
- save_item(NAME(m_open_bus));
}
void nes_nrom_device::pcb_reset()
@@ -291,23 +288,23 @@ void nes_un1rom_device::pcb_reset()
-------------------------------------------------*/
-READ8_MEMBER(nes_nrom368_device::read_l)
+uint8_t nes_nrom368_device::read_l(offs_t offset)
{
LOG_MMC(("nrom368 read_l, offset: %04x\n", offset));
offset += 0x100;
if (offset >= 0x800)
return m_prg[offset - 0x800];
else
- return m_open_bus;
+ return get_open_bus();
}
-READ8_MEMBER(nes_nrom368_device::read_m)
+uint8_t nes_nrom368_device::read_m(offs_t offset)
{
LOG_MMC(("nrom368 read_m, offset: %04x\n", offset));
return m_prg[0x1800 + (offset & 0x1fff)];
}
-READ8_MEMBER(nes_nrom368_device::read_h)
+uint8_t nes_nrom368_device::read_h(offs_t offset)
{
LOG_MMC(("nrom368 read_h, offset: %04x\n", offset));
return m_prg[0x3800 + (offset & 0x7fff)];
@@ -334,7 +331,7 @@ READ8_MEMBER(nes_nrom368_device::read_h)
-------------------------------------------------*/
-WRITE8_MEMBER(nes_axrom_device::write_h)
+void nes_axrom_device::write_h(offs_t offset, uint8_t data)
{
LOG_MMC(("axrom write_h, offset: %04x, data: %02x\n", offset, data));
@@ -355,7 +352,7 @@ WRITE8_MEMBER(nes_axrom_device::write_h)
-------------------------------------------------*/
-WRITE8_MEMBER(nes_bxrom_device::write_h)
+void nes_bxrom_device::write_h(offs_t offset, uint8_t data)
{
/* This portion of the mapper is nearly identical to Mapper 7, except no one-screen mirroring */
/* Deadly Towers is really a BxROM game - the demo screens look wrong using mapper 7. */
@@ -391,7 +388,7 @@ WRITE8_MEMBER(nes_bxrom_device::write_h)
-------------------------------------------------*/
-WRITE8_MEMBER(nes_cnrom_device::write_h)
+void nes_cnrom_device::write_h(offs_t offset, uint8_t data)
{
LOG_MMC(("cxrom write_h, offset: %04x, data: %02x\n", offset, data));
@@ -412,7 +409,7 @@ WRITE8_MEMBER(nes_cnrom_device::write_h)
chr8(data, CHRROM);
}
-READ8_MEMBER(nes_cnrom_device::chr_r)
+uint8_t nes_cnrom_device::chr_r(offs_t offset)
{
int bank = offset >> 10;
@@ -421,7 +418,7 @@ READ8_MEMBER(nes_cnrom_device::chr_r)
// give actual VROM content or open bus values.
// For most boards, chr_open_bus remains always zero.
if (m_chr_open_bus)
- return m_open_bus;
+ return get_open_bus();
return m_chr_access[bank][offset & 0x3ff];
}
@@ -441,7 +438,7 @@ READ8_MEMBER(nes_cnrom_device::chr_r)
-------------------------------------------------*/
-WRITE8_MEMBER(nes_cprom_device::write_h)
+void nes_cprom_device::write_h(offs_t offset, uint8_t data)
{
LOG_MMC(("cprom write_h, offset: %04x, data: %02x\n", offset, data));
@@ -462,7 +459,7 @@ WRITE8_MEMBER(nes_cprom_device::write_h)
-------------------------------------------------*/
-WRITE8_MEMBER(nes_gxrom_device::write_h)
+void nes_gxrom_device::write_h(offs_t offset, uint8_t data)
{
LOG_MMC(("gxrom write_h, offset %04x, data: %02x\n", offset, data));
@@ -488,7 +485,7 @@ WRITE8_MEMBER(nes_gxrom_device::write_h)
-------------------------------------------------*/
-WRITE8_MEMBER(nes_uxrom_device::write_h)
+void nes_uxrom_device::write_h(offs_t offset, uint8_t data)
{
LOG_MMC(("uxrom write_h, offset: %04x, data: %02x\n", offset, data));
@@ -514,7 +511,7 @@ WRITE8_MEMBER(nes_uxrom_device::write_h)
-------------------------------------------------*/
-WRITE8_MEMBER(nes_uxrom_cc_device::write_h)
+void nes_uxrom_cc_device::write_h(offs_t offset, uint8_t data)
{
LOG_MMC(("uxrom_cc write_h, offset: %04x, data: %02x\n", offset, data));
@@ -535,7 +532,7 @@ WRITE8_MEMBER(nes_uxrom_cc_device::write_h)
-------------------------------------------------*/
-WRITE8_MEMBER(nes_un1rom_device::write_h)
+void nes_un1rom_device::write_h(offs_t offset, uint8_t data)
{
LOG_MMC(("un1rom write_h, offset: %04x, data: %02x\n", offset, data));
@@ -558,7 +555,7 @@ WRITE8_MEMBER(nes_un1rom_device::write_h)
-------------------------------------------------*/
-WRITE8_MEMBER(nes_nochr_device::chr_w)
+void nes_nochr_device::chr_w(offs_t offset, uint8_t data)
{
int mirr = get_mirroring();
if (mirr == PPU_MIRROR_HIGH)
@@ -569,7 +566,7 @@ WRITE8_MEMBER(nes_nochr_device::chr_w)
m_ciram[offset & 0x7ff] = data; // not sure here, since there is no software to test...
}
-READ8_MEMBER(nes_nochr_device::chr_r)
+uint8_t nes_nochr_device::chr_r(offs_t offset)
{
int mirr = get_mirroring();
if (mirr == PPU_MIRROR_HIGH)
diff --git a/src/devices/bus/nes/nxrom.h b/src/devices/bus/nes/nxrom.h
index 721ed5b5e98..382abf05390 100644
--- a/src/devices/bus/nes/nxrom.h
+++ b/src/devices/bus/nes/nxrom.h
@@ -36,9 +36,9 @@ public:
// construction/destruction
nes_nrom368_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- virtual DECLARE_READ8_MEMBER(read_l) override;
- virtual DECLARE_READ8_MEMBER(read_m) override;
- virtual DECLARE_READ8_MEMBER(read_h) override;
+ virtual uint8_t read_l(offs_t offset) override;
+ virtual uint8_t read_m(offs_t offset) override;
+ virtual uint8_t read_h(offs_t offset) override;
};
@@ -62,7 +62,7 @@ public:
// construction/destruction
nes_axrom_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- virtual DECLARE_WRITE8_MEMBER(write_h) override;
+ virtual void write_h(offs_t offset, uint8_t data) override;
virtual void pcb_reset() override;
@@ -80,7 +80,7 @@ public:
// construction/destruction
nes_bxrom_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- virtual DECLARE_WRITE8_MEMBER(write_h) override;
+ virtual void write_h(offs_t offset, uint8_t data) override;
virtual void pcb_reset() override;
@@ -98,8 +98,8 @@ public:
// construction/destruction
nes_cnrom_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- virtual DECLARE_READ8_MEMBER(chr_r) override;
- virtual DECLARE_WRITE8_MEMBER(write_h) override;
+ virtual uint8_t chr_r(offs_t offset) override;
+ virtual void write_h(offs_t offset, uint8_t data) override;
virtual void pcb_reset() override;
@@ -122,7 +122,7 @@ public:
// construction/destruction
nes_cprom_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- virtual DECLARE_WRITE8_MEMBER(write_h) override;
+ virtual void write_h(offs_t offset, uint8_t data) override;
virtual void pcb_reset() override;
@@ -140,7 +140,7 @@ public:
// construction/destruction
nes_gxrom_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- virtual DECLARE_WRITE8_MEMBER(write_h) override;
+ virtual void write_h(offs_t offset, uint8_t data) override;
virtual void pcb_reset() override;
@@ -158,7 +158,7 @@ public:
// construction/destruction
nes_uxrom_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- virtual DECLARE_WRITE8_MEMBER(write_h) override;
+ virtual void write_h(offs_t offset, uint8_t data) override;
virtual void pcb_reset() override;
@@ -176,7 +176,7 @@ public:
// construction/destruction
nes_uxrom_cc_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- virtual DECLARE_WRITE8_MEMBER(write_h) override;
+ virtual void write_h(offs_t offset, uint8_t data) override;
virtual void pcb_reset() override;
@@ -194,7 +194,7 @@ public:
// construction/destruction
nes_un1rom_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- virtual DECLARE_WRITE8_MEMBER(write_h) override;
+ virtual void write_h(offs_t offset, uint8_t data) override;
virtual void pcb_reset() override;
@@ -213,8 +213,8 @@ public:
nes_nochr_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
// device-level overrides
- virtual DECLARE_READ8_MEMBER(chr_r) override;
- virtual DECLARE_WRITE8_MEMBER(chr_w) override;
+ virtual uint8_t chr_r(offs_t offset) override;
+ virtual void chr_w(offs_t offset, uint8_t data) override;
};
diff --git a/src/devices/bus/nes/pirate.cpp b/src/devices/bus/nes/pirate.cpp
index 1d2035a9b91..acda901ecca 100644
--- a/src/devices/bus/nes/pirate.cpp
+++ b/src/devices/bus/nes/pirate.cpp
@@ -423,7 +423,7 @@ void nes_cityfight_device::pcb_reset()
-------------------------------------------------*/
-WRITE8_MEMBER(nes_agci_device::write_h)
+void nes_agci_device::write_h(offs_t offset, uint8_t data)
{
LOG_MMC(("agci write_h, offset: %04x, data: %02x\n", offset, data));
@@ -445,7 +445,7 @@ WRITE8_MEMBER(nes_agci_device::write_h)
-------------------------------------------------*/
-WRITE8_MEMBER(nes_dreamtech_device::write_l)
+void nes_dreamtech_device::write_l(offs_t offset, uint8_t data)
{
LOG_MMC(("dreamtech write_l, offset: %04x, data: %02x\n", offset, data));
offset += 0x100;
@@ -467,7 +467,7 @@ WRITE8_MEMBER(nes_dreamtech_device::write_l)
-------------------------------------------------*/
-WRITE8_MEMBER(nes_fukutake_device::write_l)
+void nes_fukutake_device::write_l(offs_t offset, uint8_t data)
{
LOG_MMC(("fukutake write_l, offset: %04x, data: %02x\n", offset, data));
offset += 0x100;
@@ -483,7 +483,7 @@ WRITE8_MEMBER(nes_fukutake_device::write_l)
m_ram[offset - 0x400] = data;
}
-READ8_MEMBER(nes_fukutake_device::read_l)
+uint8_t nes_fukutake_device::read_l(offs_t offset)
{
LOG_MMC(("fukutake read_l, offset: %04x\n", offset));
offset += 0x100;
@@ -503,13 +503,13 @@ READ8_MEMBER(nes_fukutake_device::read_l)
return 0;
}
-WRITE8_MEMBER(nes_fukutake_device::write_m)
+void nes_fukutake_device::write_m(offs_t offset, uint8_t data)
{
LOG_MMC(("fukutake write_m, offset: %04x, data: %02x\n", offset, data));
m_prgram[((m_latch * 0x2000) + offset) & (m_prgram.size() - 1)] = data;
}
-READ8_MEMBER(nes_fukutake_device::read_m)
+uint8_t nes_fukutake_device::read_m(offs_t offset)
{
LOG_MMC(("fukutake read_m, offset: %04x\n", offset));
return m_prgram[((m_latch * 0x2000) + offset) & (m_prgram.size() - 1)];
@@ -540,7 +540,7 @@ void nes_futuremedia_device::hblank_irq(int scanline, int vblank, int blanked)
}
}
-WRITE8_MEMBER(nes_futuremedia_device::write_h)
+void nes_futuremedia_device::write_h(offs_t offset, uint8_t data)
{
LOG_MMC(("futuremedia write_h, offset: %04x, data: %02x\n", offset, data));
@@ -603,7 +603,7 @@ WRITE8_MEMBER(nes_futuremedia_device::write_h)
-------------------------------------------------*/
-WRITE8_MEMBER(nes_magseries_device::write_h)
+void nes_magseries_device::write_h(offs_t offset, uint8_t data)
{
LOG_MMC(("magseries write_h, offset: %04x, data: %02x\n", offset, data));
@@ -626,7 +626,7 @@ WRITE8_MEMBER(nes_magseries_device::write_h)
-------------------------------------------------*/
-WRITE8_MEMBER(nes_daou306_device::write_h)
+void nes_daou306_device::write_h(offs_t offset, uint8_t data)
{
LOG_MMC(("daou306 write_h, offset: %04x, data: %02x\n", offset, data));
int reg = BIT(offset, 2) ? 8 : 0;
@@ -695,7 +695,7 @@ WRITE8_MEMBER(nes_daou306_device::write_h)
-------------------------------------------------*/
-WRITE8_MEMBER(nes_cc21_device::write_h)
+void nes_cc21_device::write_h(offs_t offset, uint8_t data)
{
LOG_MMC(("cc21 write_h, offset: %04x, data: %02x\n", offset, data));
@@ -718,7 +718,7 @@ WRITE8_MEMBER(nes_cc21_device::write_h)
-------------------------------------------------*/
-WRITE8_MEMBER(nes_xiaozy_device::write_l)
+void nes_xiaozy_device::write_l(offs_t offset, uint8_t data)
{
LOG_MMC(("xiaozy write_l, offset: %04x, data: %02x\n", offset, data));
@@ -739,7 +739,7 @@ WRITE8_MEMBER(nes_xiaozy_device::write_l)
-------------------------------------------------*/
-WRITE8_MEMBER(nes_edu2k_device::write_h)
+void nes_edu2k_device::write_h(offs_t offset, uint8_t data)
{
LOG_MMC(("edu2k write_h, offset: %04x, data: %02x\n", offset, data));
@@ -747,13 +747,13 @@ WRITE8_MEMBER(nes_edu2k_device::write_h)
m_latch = (data & 0xc0) >> 6;
}
-WRITE8_MEMBER(nes_edu2k_device::write_m)
+void nes_edu2k_device::write_m(offs_t offset, uint8_t data)
{
LOG_MMC(("edu2k write_m, offset: %04x, data: %02x\n", offset, data));
m_prgram[((m_latch * 0x2000) + offset) & (m_prgram.size() - 1)] = data;
}
-READ8_MEMBER(nes_edu2k_device::read_m)
+uint8_t nes_edu2k_device::read_m(offs_t offset)
{
LOG_MMC(("edu2k read_m, offset: %04x\n", offset));
return m_prgram[((m_latch * 0x2000) + offset) & (m_prgram.size() - 1)];
@@ -787,7 +787,7 @@ void nes_t230_device::hblank_irq(int scanline, int vblank, int blanked)
}
}
-WRITE8_MEMBER(nes_t230_device::write_h)
+void nes_t230_device::write_h(offs_t offset, uint8_t data)
{
LOG_MMC(("t230 write_h, offset: %04x, data: %02x\n", offset, data));
@@ -869,7 +869,7 @@ void nes_mk2_device::hblank_irq( int scanline, int vblank, int blanked )
m_irq_clear = 0;
}
-WRITE8_MEMBER(nes_mk2_device::write_m)
+void nes_mk2_device::write_m(offs_t offset, uint8_t data)
{
LOG_MMC(("mk2 write_m, offset: %04x, data: %02x\n", offset, data));
@@ -921,7 +921,7 @@ void nes_whero_device::hblank_irq(int scanline, int vblank, int blanked)
}
}
-WRITE8_MEMBER(nes_whero_device::write_h)
+void nes_whero_device::write_h(offs_t offset, uint8_t data)
{
int bank, shift, mask1, mask2;
LOG_MMC(("World Hero write_h, offset: %04x, data: %02x\n", offset, data));
@@ -1005,7 +1005,7 @@ WRITE8_MEMBER(nes_whero_device::write_h)
-------------------------------------------------*/
-WRITE8_MEMBER(nes_43272_device::write_h)
+void nes_43272_device::write_h(offs_t offset, uint8_t data)
{
LOG_MMC(("unl_43272 write_h, offset: %04x, data: %02x\n", offset, data));
@@ -1016,7 +1016,7 @@ WRITE8_MEMBER(nes_43272_device::write_h)
}
-READ8_MEMBER(nes_43272_device::read_h)
+uint8_t nes_43272_device::read_h(offs_t offset)
{
uint8_t mask = (m_latch & 0x400) ? 0xfe : 0xff;
LOG_MMC(("unl_43272 read_h, offset: %04x\n", offset));
@@ -1054,7 +1054,7 @@ void nes_tf1201_device::update_prg()
prg8_cd(m_swap ? m_prg : 0xff );
}
-WRITE8_MEMBER(nes_tf1201_device::write_h)
+void nes_tf1201_device::write_h(offs_t offset, uint8_t data)
{
int bank;
LOG_MMC(("unl_tf1201 write_h, offset: %04x, data: %02x\n", offset, data));
@@ -1139,7 +1139,7 @@ void nes_cityfight_device::update_prg()
prg8_cd(m_prg_reg);
}
-WRITE8_MEMBER(nes_cityfight_device::write_h)
+void nes_cityfight_device::write_h(offs_t offset, uint8_t data)
{
int bank;
LOG_MMC(("unl_cityfight write_h, offset: %04x, data: %02x\n", offset, data));
@@ -1244,7 +1244,7 @@ void nes_fujiya_device::pcb_reset()
m_latch = 0;
}
-WRITE8_MEMBER(nes_fujiya_device::write_m)
+void nes_fujiya_device::write_m(offs_t offset, uint8_t data)
{
LOG_MMC(("fujiya write_m, offset: %04x, data: %02x\n", offset, data));
offset += 0x6000;
@@ -1253,7 +1253,7 @@ WRITE8_MEMBER(nes_fujiya_device::write_m)
m_latch = (data & 0x40) << 1;
}
-READ8_MEMBER(nes_fujiya_device::read_m)
+uint8_t nes_fujiya_device::read_m(offs_t offset)
{
LOG_MMC(("fujiya read_m, offset: %04x\n", offset));
offset += 0x6000;
@@ -1261,6 +1261,6 @@ READ8_MEMBER(nes_fujiya_device::read_m)
if (offset == 0x7001 || offset == 0x7777)
return m_latch | ((offset >> 8) & 0x7f);
- return m_open_bus; // open bus
+ return get_open_bus(); // open bus
}
#endif
diff --git a/src/devices/bus/nes/pirate.h b/src/devices/bus/nes/pirate.h
index 91424d32e25..e99bd703aec 100644
--- a/src/devices/bus/nes/pirate.h
+++ b/src/devices/bus/nes/pirate.h
@@ -16,7 +16,7 @@ public:
// construction/destruction
nes_agci_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- virtual DECLARE_WRITE8_MEMBER(write_h) override;
+ virtual void write_h(offs_t offset, uint8_t data) override;
virtual void pcb_reset() override;
@@ -34,7 +34,7 @@ public:
// construction/destruction
nes_dreamtech_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- virtual DECLARE_WRITE8_MEMBER(write_l) override;
+ virtual void write_l(offs_t offset, uint8_t data) override;
virtual void pcb_reset() override;
@@ -52,10 +52,10 @@ public:
// construction/destruction
nes_fukutake_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- virtual DECLARE_READ8_MEMBER(read_l) override;
- virtual DECLARE_READ8_MEMBER(read_m) override;
- virtual DECLARE_WRITE8_MEMBER(write_l) override;
- virtual DECLARE_WRITE8_MEMBER(write_m) override;
+ virtual uint8_t read_l(offs_t offset) override;
+ virtual uint8_t read_m(offs_t offset) override;
+ virtual void write_l(offs_t offset, uint8_t data) override;
+ virtual void write_m(offs_t offset, uint8_t data) override;
virtual void pcb_reset() override;
@@ -77,7 +77,7 @@ public:
// construction/destruction
nes_futuremedia_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- virtual DECLARE_WRITE8_MEMBER(write_h) override;
+ virtual void write_h(offs_t offset, uint8_t data) override;
virtual void hblank_irq(int scanline, int vblank, int blanked) override;
virtual void pcb_reset() override;
@@ -101,7 +101,7 @@ public:
// construction/destruction
nes_magseries_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- virtual DECLARE_WRITE8_MEMBER(write_h) override;
+ virtual void write_h(offs_t offset, uint8_t data) override;
virtual void pcb_reset() override;
@@ -119,7 +119,7 @@ public:
// construction/destruction
nes_daou306_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- virtual DECLARE_WRITE8_MEMBER(write_h) override;
+ virtual void write_h(offs_t offset, uint8_t data) override;
virtual void pcb_reset() override;
@@ -140,7 +140,7 @@ public:
// construction/destruction
nes_cc21_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- virtual DECLARE_WRITE8_MEMBER(write_h) override;
+ virtual void write_h(offs_t offset, uint8_t data) override;
virtual void pcb_reset() override;
@@ -158,7 +158,7 @@ public:
// construction/destruction
nes_xiaozy_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- virtual DECLARE_WRITE8_MEMBER(write_l) override;
+ virtual void write_l(offs_t offset, uint8_t data) override;
virtual void pcb_reset() override;
@@ -176,9 +176,9 @@ public:
// construction/destruction
nes_edu2k_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- virtual DECLARE_READ8_MEMBER(read_m) override;
- virtual DECLARE_WRITE8_MEMBER(write_m) override;
- virtual DECLARE_WRITE8_MEMBER(write_h) override;
+ virtual uint8_t read_m(offs_t offset) override;
+ virtual void write_m(offs_t offset, uint8_t data) override;
+ virtual void write_h(offs_t offset, uint8_t data) override;
virtual void pcb_reset() override;
@@ -199,7 +199,7 @@ public:
// construction/destruction
nes_t230_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- virtual DECLARE_WRITE8_MEMBER(write_h) override;
+ virtual void write_h(offs_t offset, uint8_t data) override;
virtual void hblank_irq(int scanline, int vblank, int blanked) override;
virtual void pcb_reset() override;
@@ -225,7 +225,7 @@ public:
// construction/destruction
nes_mk2_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- virtual DECLARE_WRITE8_MEMBER(write_m) override;
+ virtual void write_m(offs_t offset, uint8_t data) override;
virtual void hblank_irq(int scanline, int vblank, int blanked) override;
virtual void pcb_reset() override;
@@ -249,7 +249,7 @@ public:
// construction/destruction
nes_whero_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- virtual DECLARE_WRITE8_MEMBER(write_h) override;
+ virtual void write_h(offs_t offset, uint8_t data) override;
virtual void hblank_irq(int scanline, int vblank, int blanked) override;
virtual void pcb_reset() override;
@@ -276,8 +276,8 @@ public:
// construction/destruction
nes_43272_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- virtual DECLARE_READ8_MEMBER(read_h) override;
- virtual DECLARE_WRITE8_MEMBER(write_h) override;
+ virtual uint8_t read_h(offs_t offset) override;
+ virtual void write_h(offs_t offset, uint8_t data) override;
virtual void pcb_reset() override;
@@ -298,7 +298,7 @@ public:
// construction/destruction
nes_tf1201_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- virtual DECLARE_WRITE8_MEMBER(write_h) override;
+ virtual void write_h(offs_t offset, uint8_t data) override;
virtual void hblank_irq(int scanline, int vblank, int blanked) override;
virtual void pcb_reset() override;
@@ -325,7 +325,7 @@ public:
// construction/destruction
nes_cityfight_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- virtual DECLARE_WRITE8_MEMBER(write_h) override;
+ virtual void write_h(offs_t offset, uint8_t data) override;
virtual void pcb_reset() override;
@@ -359,8 +359,8 @@ public:
// construction/destruction
nes_fujiya_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- virtual DECLARE_WRITE8_MEMBER(read_m) override;
- virtual DECLARE_WRITE8_MEMBER(write_m) override;
+ virtual uint8_t read_m(offs_t offset) override;
+ virtual void write_m(offs_t offset, uint8_t data) override;
virtual void pcb_reset() override;
diff --git a/src/devices/bus/nes/pt554.cpp b/src/devices/bus/nes/pt554.cpp
index 98524a04bc7..db16ca42e37 100644
--- a/src/devices/bus/nes/pt554.cpp
+++ b/src/devices/bus/nes/pt554.cpp
@@ -59,7 +59,7 @@ nes_bandai_pt554_device::nes_bandai_pt554_device(const machine_config &mconfig,
-------------------------------------------------*/
-WRITE8_MEMBER(nes_bandai_pt554_device::write_m)
+void nes_bandai_pt554_device::write_m(offs_t offset, uint8_t data)
{
LOG_MMC(("Bandai PT-554 Sound write, data: %02x\n", data));
diff --git a/src/devices/bus/nes/pt554.h b/src/devices/bus/nes/pt554.h
index f25281ea4f0..746750c52ed 100644
--- a/src/devices/bus/nes/pt554.h
+++ b/src/devices/bus/nes/pt554.h
@@ -16,7 +16,7 @@ public:
// construction/destruction
nes_bandai_pt554_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- virtual DECLARE_WRITE8_MEMBER(write_m) override;
+ virtual void write_m(offs_t offset, uint8_t data) override;
protected:
// device-level overrides
diff --git a/src/devices/bus/nes/racermate.cpp b/src/devices/bus/nes/racermate.cpp
index 5b578da0e09..111cb997dd0 100644
--- a/src/devices/bus/nes/racermate.cpp
+++ b/src/devices/bus/nes/racermate.cpp
@@ -81,7 +81,7 @@ void nes_racermate_device::update_banks()
prg16_89ab(m_latch >> 6);
}
-WRITE8_MEMBER(nes_racermate_device::write_h)
+void nes_racermate_device::write_h(offs_t offset, uint8_t data)
{
LOG_MMC(("racermate write_h, offset: %04x, data: %02x\n", offset, data));
diff --git a/src/devices/bus/nes/racermate.h b/src/devices/bus/nes/racermate.h
index 5366ec1a6ea..cb74a06a6b0 100644
--- a/src/devices/bus/nes/racermate.h
+++ b/src/devices/bus/nes/racermate.h
@@ -16,7 +16,7 @@ public:
// device-level overrides
virtual void device_start() override;
- virtual DECLARE_WRITE8_MEMBER(write_h) override;
+ virtual void write_h(offs_t offset, uint8_t data) override;
virtual void pcb_reset() override;
diff --git a/src/devices/bus/nes/rcm.cpp b/src/devices/bus/nes/rcm.cpp
index 5c861922afb..fdd07830381 100644
--- a/src/devices/bus/nes/rcm.cpp
+++ b/src/devices/bus/nes/rcm.cpp
@@ -161,7 +161,7 @@ void nes_3dblock_device::pcb_reset()
-------------------------------------------------*/
-WRITE8_MEMBER(nes_gs2015_device::write_h)
+void nes_gs2015_device::write_h(offs_t offset, uint8_t data)
{
LOG_MMC(("gs2015 write_h, offset: %04x, data: %02x\n", offset, data));
@@ -169,7 +169,7 @@ WRITE8_MEMBER(nes_gs2015_device::write_h)
chr8(offset >> 1, m_chr_source);
}
-READ8_MEMBER(nes_gs2015_device::read_m)
+uint8_t nes_gs2015_device::read_m(offs_t offset)
{
LOG_MMC(("gs2015 read_m, offset: %04x\n", offset));
return 0; // Videopoker Bonza needs this (sort of protection? or related to inputs?)
@@ -186,7 +186,7 @@ READ8_MEMBER(nes_gs2015_device::read_m)
-------------------------------------------------*/
-WRITE8_MEMBER(nes_gs2004_device::write_h)
+void nes_gs2004_device::write_h(offs_t offset, uint8_t data)
{
LOG_MMC(("gs2004 write_h, offset: %04x, data: %02x\n", offset, data));
@@ -204,7 +204,7 @@ WRITE8_MEMBER(nes_gs2004_device::write_h)
-------------------------------------------------*/
-WRITE8_MEMBER(nes_gs2013_device::write_h)
+void nes_gs2013_device::write_h(offs_t offset, uint8_t data)
{
LOG_MMC(("gs2013 write_h, offset: %04x, data: %02x\n", offset, data));
@@ -232,7 +232,7 @@ WRITE8_MEMBER(nes_gs2013_device::write_h)
-------------------------------------------------*/
-WRITE8_MEMBER(nes_tf9_device::write_h)
+void nes_tf9_device::write_h(offs_t offset, uint8_t data)
{
LOG_MMC(("tetrisfam write_h, offset: %04x, data: %02x\n", offset, data));
@@ -279,7 +279,7 @@ void nes_3dblock_device::hblank_irq(int scanline, int vblank, int blanked)
}
}
-WRITE8_MEMBER(nes_3dblock_device::write_l)
+void nes_3dblock_device::write_l(offs_t offset, uint8_t data)
{
LOG_MMC(("3dblock write_l, offset: %04x, data: %02x\n", offset, data));
offset += 0x100;
diff --git a/src/devices/bus/nes/rcm.h b/src/devices/bus/nes/rcm.h
index f37a6074432..005869fe09c 100644
--- a/src/devices/bus/nes/rcm.h
+++ b/src/devices/bus/nes/rcm.h
@@ -16,9 +16,9 @@ public:
// construction/destruction
nes_gs2015_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- virtual DECLARE_READ8_MEMBER(read_l) override { return read_m(space, offset, mem_mask); }
- virtual DECLARE_READ8_MEMBER(read_m) override;
- virtual DECLARE_WRITE8_MEMBER(write_h) override;
+ virtual uint8_t read_l(offs_t offset) override { return read_m(offset); }
+ virtual uint8_t read_m(offs_t offset) override;
+ virtual void write_h(offs_t offset, uint8_t data) override;
virtual void pcb_reset() override;
@@ -36,7 +36,7 @@ public:
// construction/destruction
nes_gs2004_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- virtual DECLARE_WRITE8_MEMBER(write_h) override;
+ virtual void write_h(offs_t offset, uint8_t data) override;
virtual void pcb_reset() override;
@@ -54,7 +54,7 @@ public:
// construction/destruction
nes_gs2013_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- virtual DECLARE_WRITE8_MEMBER(write_h) override;
+ virtual void write_h(offs_t offset, uint8_t data) override;
virtual void pcb_reset() override;
@@ -72,7 +72,7 @@ public:
// construction/destruction
nes_tf9_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- virtual DECLARE_WRITE8_MEMBER(write_h) override;
+ virtual void write_h(offs_t offset, uint8_t data) override;
virtual void pcb_reset() override;
@@ -90,7 +90,7 @@ public:
// construction/destruction
nes_3dblock_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- virtual DECLARE_WRITE8_MEMBER(write_l) override;
+ virtual void write_l(offs_t offset, uint8_t data) override;
virtual void hblank_irq(int scanline, int vblank, int blanked) override;
virtual void pcb_reset() override;
diff --git a/src/devices/bus/nes/rexsoft.cpp b/src/devices/bus/nes/rexsoft.cpp
index 3d868a0c970..c10b88afe01 100644
--- a/src/devices/bus/nes/rexsoft.cpp
+++ b/src/devices/bus/nes/rexsoft.cpp
@@ -112,7 +112,7 @@ void nes_rex_sl1632_device::pcb_reset()
-------------------------------------------------*/
-WRITE8_MEMBER(nes_rex_dbz5_device::write_l)
+void nes_rex_dbz5_device::write_l(offs_t offset, uint8_t data)
{
LOG_MMC(("rex_dbz write_l, offset: %04x, data: %02x\n", offset, data));
@@ -121,7 +121,7 @@ WRITE8_MEMBER(nes_rex_dbz5_device::write_l)
}
/* we would need to use this read handler in 0x6000-0x7fff as well */
-READ8_MEMBER(nes_rex_dbz5_device::read_l)
+uint8_t nes_rex_dbz5_device::read_l(offs_t offset)
{
LOG_MMC(("rex_dbz read_l, offset: %04x\n", offset));
return 0x01;
@@ -208,7 +208,7 @@ void nes_rex_sl1632_device::set_chr(uint8_t chr, int chr_base, int chr_mask)
chr1_x(chr_page ^ 7, chr_base2[7] | (bank[7] & chr_mask), chr);
}
-WRITE8_MEMBER(nes_rex_sl1632_device::write_h)
+void nes_rex_sl1632_device::write_h(offs_t offset, uint8_t data)
{
uint8_t helper1, helper2;
LOG_MMC(("rex_sl1632 write_h, offset: %04x, data: %02x\n", offset, data));
@@ -232,7 +232,7 @@ WRITE8_MEMBER(nes_rex_sl1632_device::write_h)
break;
default:
- txrom_write(space, offset, data, mem_mask);
+ txrom_write(offset, data);
break;
}
}
diff --git a/src/devices/bus/nes/rexsoft.h b/src/devices/bus/nes/rexsoft.h
index 61fe876633a..0c44c73139d 100644
--- a/src/devices/bus/nes/rexsoft.h
+++ b/src/devices/bus/nes/rexsoft.h
@@ -16,10 +16,10 @@ public:
// construction/destruction
nes_rex_dbz5_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- virtual DECLARE_READ8_MEMBER(read_l) override;
- virtual DECLARE_READ8_MEMBER(read_m) override { return read_l(space, offset, mem_mask); }
- virtual DECLARE_WRITE8_MEMBER(write_l) override;
- virtual void chr_cb( int start, int bank, int source ) override;
+ virtual uint8_t read_l(offs_t offset) override;
+ virtual uint8_t read_m(offs_t offset) override { return read_l(offset); }
+ virtual void write_l(offs_t offset, uint8_t data) override;
+ virtual void chr_cb(int start, int bank, int source) override;
virtual void pcb_reset() override;
@@ -40,7 +40,7 @@ public:
// construction/destruction
nes_rex_sl1632_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- virtual DECLARE_WRITE8_MEMBER(write_h) override;
+ virtual void write_h(offs_t offset, uint8_t data) override;
virtual void pcb_reset() override;
diff --git a/src/devices/bus/nes/sachen.cpp b/src/devices/bus/nes/sachen.cpp
index 369c4cde885..0622bfec8d4 100644
--- a/src/devices/bus/nes/sachen.cpp
+++ b/src/devices/bus/nes/sachen.cpp
@@ -308,7 +308,7 @@ void nes_sachen_8259d_device::pcb_reset()
-------------------------------------------------*/
-WRITE8_MEMBER(nes_sachen_sa009_device::write_l)
+void nes_sachen_sa009_device::write_l(offs_t offset, uint8_t data)
{
LOG_MMC(("SA009 write_l, offset: %04x, data: %02x\n", offset, data));
@@ -327,7 +327,7 @@ WRITE8_MEMBER(nes_sachen_sa009_device::write_l)
-------------------------------------------------*/
-WRITE8_MEMBER(nes_sachen_sa0036_device::write_h)
+void nes_sachen_sa0036_device::write_h(offs_t offset, uint8_t data)
{
LOG_MMC(("sa0036 write_h, offset: %04x, data: %02x\n", offset, data));
@@ -346,7 +346,7 @@ WRITE8_MEMBER(nes_sachen_sa0036_device::write_h)
-------------------------------------------------*/
-WRITE8_MEMBER(nes_sachen_sa0037_device::write_h)
+void nes_sachen_sa0037_device::write_h(offs_t offset, uint8_t data)
{
LOG_MMC(("sa0037 write_h, offset: %04x, data: %02x\n", offset, data));
@@ -369,7 +369,7 @@ WRITE8_MEMBER(nes_sachen_sa0037_device::write_h)
-------------------------------------------------*/
-WRITE8_MEMBER(nes_sachen_sa72007_device::write_l)
+void nes_sachen_sa72007_device::write_l(offs_t offset, uint8_t data)
{
LOG_MMC(("SA72007 write_l, offset: %04x, data: %02x\n", offset, data));
@@ -390,7 +390,7 @@ WRITE8_MEMBER(nes_sachen_sa72007_device::write_l)
-------------------------------------------------*/
-WRITE8_MEMBER(nes_sachen_sa72008_device::write_l)
+void nes_sachen_sa72008_device::write_l(offs_t offset, uint8_t data)
{
LOG_MMC(("SA72008 write_l, offset: %04x, data: %02x\n", offset, data));
@@ -410,7 +410,7 @@ WRITE8_MEMBER(nes_sachen_sa72008_device::write_l)
-------------------------------------------------*/
-READ8_MEMBER(nes_sachen_tca01_device::read_l)
+uint8_t nes_sachen_tca01_device::read_l(offs_t offset)
{
LOG_MMC(("TCA-01 read_l, offset: %04x\n", offset));
@@ -433,7 +433,7 @@ READ8_MEMBER(nes_sachen_tca01_device::read_l)
-------------------------------------------------*/
-WRITE8_MEMBER(nes_sachen_tcu01_device::write_l)
+void nes_sachen_tcu01_device::write_l(offs_t offset, uint8_t data)
{
LOG_MMC(("TCU-01 write_l, offset: %04x, data: %02x\n", offset, data));
@@ -456,7 +456,7 @@ WRITE8_MEMBER(nes_sachen_tcu01_device::write_l)
-------------------------------------------------*/
-WRITE8_MEMBER(nes_sachen_tcu02_device::write_l)
+void nes_sachen_tcu02_device::write_l(offs_t offset, uint8_t data)
{
LOG_MMC(("TCU-02 write_l, offset: %04x, data: %02x\n", offset, data));
@@ -467,7 +467,7 @@ WRITE8_MEMBER(nes_sachen_tcu02_device::write_l)
}
}
-READ8_MEMBER(nes_sachen_tcu02_device::read_l)
+uint8_t nes_sachen_tcu02_device::read_l(offs_t offset)
{
LOG_MMC(("TCU-02 read_l, offset: %04x\n", offset));
@@ -512,7 +512,7 @@ void nes_sachen_74x374_device::set_mirror(uint8_t nt) // also used by mappers 13
}
-WRITE8_MEMBER(nes_sachen_74x374_device::write_l)
+void nes_sachen_74x374_device::write_l(offs_t offset, uint8_t data)
{
LOG_MMC(("Sachen 74*374 write_l, offset: %04x, data: %02x\n", offset, data));
@@ -551,7 +551,7 @@ WRITE8_MEMBER(nes_sachen_74x374_device::write_l)
}
}
-READ8_MEMBER(nes_sachen_74x374_device::read_l)
+uint8_t nes_sachen_74x374_device::read_l(offs_t offset)
{
LOG_MMC(("Sachen 74*374 read_l, offset: %04x", offset));
@@ -562,7 +562,7 @@ READ8_MEMBER(nes_sachen_74x374_device::read_l)
return 0;
}
-WRITE8_MEMBER(nes_sachen_74x374_alt_device::write_l)
+void nes_sachen_74x374_alt_device::write_l(offs_t offset, uint8_t data)
{
LOG_MMC(("Sachen 74*374 Alt write_l, offset: %04x, data: %02x\n", offset, data));
@@ -626,7 +626,7 @@ void nes_sachen_8259a_device::chr_update()
}
}
-WRITE8_MEMBER(nes_sachen_8259a_device::write_l)
+void nes_sachen_8259a_device::write_l(offs_t offset, uint8_t data)
{
LOG_MMC(("Sachen 8259 write_l, offset: %04x, data: %02x\n", offset, data));
diff --git a/src/devices/bus/nes/sachen.h b/src/devices/bus/nes/sachen.h
index cfec9363bdc..b23599345b3 100644
--- a/src/devices/bus/nes/sachen.h
+++ b/src/devices/bus/nes/sachen.h
@@ -16,7 +16,7 @@ public:
// construction/destruction
nes_sachen_sa009_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- virtual DECLARE_WRITE8_MEMBER(write_l) override;
+ virtual void write_l(offs_t offset, uint8_t data) override;
virtual void pcb_reset() override;
@@ -34,7 +34,7 @@ public:
// construction/destruction
nes_sachen_sa0036_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- virtual DECLARE_WRITE8_MEMBER(write_h) override;
+ virtual void write_h(offs_t offset, uint8_t data) override;
virtual void pcb_reset() override;
@@ -52,7 +52,7 @@ public:
// construction/destruction
nes_sachen_sa0037_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- virtual DECLARE_WRITE8_MEMBER(write_h) override;
+ virtual void write_h(offs_t offset, uint8_t data) override;
virtual void pcb_reset() override;
@@ -70,7 +70,7 @@ public:
// construction/destruction
nes_sachen_sa72007_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- virtual DECLARE_WRITE8_MEMBER(write_l) override;
+ virtual void write_l(offs_t offset, uint8_t data) override;
virtual void pcb_reset() override;
@@ -88,7 +88,7 @@ public:
// construction/destruction
nes_sachen_sa72008_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- virtual DECLARE_WRITE8_MEMBER(write_l) override;
+ virtual void write_l(offs_t offset, uint8_t data) override;
virtual void pcb_reset() override;
@@ -106,7 +106,7 @@ public:
// construction/destruction
nes_sachen_tca01_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- virtual DECLARE_READ8_MEMBER(read_l) override;
+ virtual uint8_t read_l(offs_t offset) override;
virtual void pcb_reset() override;
@@ -124,9 +124,9 @@ public:
// construction/destruction
nes_sachen_tcu01_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- virtual DECLARE_WRITE8_MEMBER(write_l) override;
- virtual DECLARE_WRITE8_MEMBER(write_m) override { write_l(space, (offset + 0x100) & 0xfff, data, mem_mask); }
- virtual DECLARE_WRITE8_MEMBER(write_h) override { write_l(space, (offset + 0x100) & 0xfff, data, mem_mask); }
+ virtual void write_l(offs_t offset, uint8_t data) override;
+ virtual void write_m(offs_t offset, uint8_t data) override { write_l((offset + 0x100) & 0xfff, data); }
+ virtual void write_h(offs_t offset, uint8_t data) override { write_l((offset + 0x100) & 0xfff, data); }
virtual void pcb_reset() override;
@@ -144,8 +144,8 @@ public:
// construction/destruction
nes_sachen_tcu02_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- virtual DECLARE_READ8_MEMBER(read_l) override;
- virtual DECLARE_WRITE8_MEMBER(write_l) override;
+ virtual uint8_t read_l(offs_t offset) override;
+ virtual void write_l(offs_t offset, uint8_t data) override;
virtual void pcb_reset() override;
@@ -166,8 +166,8 @@ public:
// construction/destruction
nes_sachen_74x374_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- virtual DECLARE_READ8_MEMBER(read_l) override;
- virtual DECLARE_WRITE8_MEMBER(write_l) override;
+ virtual uint8_t read_l(offs_t offset) override;
+ virtual void write_l(offs_t offset, uint8_t data) override;
virtual void pcb_reset() override;
@@ -191,8 +191,8 @@ public:
nes_sachen_74x374_alt_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
// device-level overrides
- virtual DECLARE_READ8_MEMBER(read_l) override { return 0xff; } // no read_l here
- virtual DECLARE_WRITE8_MEMBER(write_l) override;
+ virtual uint8_t read_l(offs_t offset) override { return 0xff; } // no read_l here
+ virtual void write_l(offs_t offset, uint8_t data) override;
};
@@ -204,8 +204,8 @@ public:
// construction/destruction
nes_sachen_8259a_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- virtual DECLARE_WRITE8_MEMBER(write_l) override;
- virtual DECLARE_WRITE8_MEMBER(write_m) override { write_l(space, (offset + 0x100) & 0xfff, data, mem_mask); }
+ virtual void write_l(offs_t offset, uint8_t data) override;
+ virtual void write_m(offs_t offset, uint8_t data) override { write_l((offset + 0x100) & 0xfff, data); }
virtual void pcb_reset() override;
diff --git a/src/devices/bus/nes/somari.cpp b/src/devices/bus/nes/somari.cpp
index f4a5c2e7f40..c517a4fae16 100644
--- a/src/devices/bus/nes/somari.cpp
+++ b/src/devices/bus/nes/somari.cpp
@@ -157,7 +157,7 @@ void nes_somari_device::pcb_reset()
-------------------------------------------------*/
// MMC1 Mode emulation
-WRITE8_MEMBER(nes_somari_device::mmc1_w)
+void nes_somari_device::mmc1_w(offs_t offset, uint8_t data)
{
assert(m_board_mode == 2);
@@ -191,7 +191,7 @@ WRITE8_MEMBER(nes_somari_device::mmc1_w)
}
// MMC3 Mode emulation
-WRITE8_MEMBER(nes_somari_device::mmc3_w)
+void nes_somari_device::mmc3_w(offs_t offset, uint8_t data)
{
uint8_t mmc_helper, cmd;
@@ -240,7 +240,7 @@ WRITE8_MEMBER(nes_somari_device::mmc3_w)
}
// VRC2 Mode emulation
-WRITE8_MEMBER(nes_somari_device::vrc2_w)
+void nes_somari_device::vrc2_w(offs_t offset, uint8_t data)
{
uint8_t bank, shift;
@@ -381,15 +381,15 @@ void nes_somari_device::update_mirror()
}
-WRITE8_MEMBER(nes_somari_device::write_h)
+void nes_somari_device::write_h(offs_t offset, uint8_t data)
{
LOG_MMC(("somari write_h, mode %d, offset: %04x, data: %02x\n", m_board_mode, offset, data));
switch (m_board_mode)
{
- case SOMARI_VRC2_MODE: vrc2_w(space, offset, data, mem_mask); break;
- case SOMARI_MMC3_MODE: mmc3_w(space, offset, data, mem_mask); break;
- case SOMARI_MMC1_MODE: mmc1_w(space, offset, data, mem_mask); break;
+ case SOMARI_VRC2_MODE: vrc2_w(offset, data); break;
+ case SOMARI_MMC3_MODE: mmc3_w(offset, data); break;
+ case SOMARI_MMC1_MODE: mmc1_w(offset, data); break;
}
}
@@ -409,7 +409,7 @@ void nes_somari_device::bank_update_switchmode()
update_chr();
}
-WRITE8_MEMBER(nes_somari_device::write_m)
+void nes_somari_device::write_m(offs_t offset, uint8_t data)
{
LOG_MMC(("somari write_m, offset: %04x, data: %02x\n", offset, data));
diff --git a/src/devices/bus/nes/somari.h b/src/devices/bus/nes/somari.h
index 7b5d2920923..dda299b3a99 100644
--- a/src/devices/bus/nes/somari.h
+++ b/src/devices/bus/nes/somari.h
@@ -16,12 +16,12 @@ public:
// construction/destruction
nes_somari_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- virtual DECLARE_WRITE8_MEMBER(write_l) override { write_m(space, offset + 0x100, data, mem_mask); }
- virtual DECLARE_WRITE8_MEMBER(write_m) override;
- virtual DECLARE_WRITE8_MEMBER(mmc1_w);
- virtual DECLARE_WRITE8_MEMBER(mmc3_w);
- virtual DECLARE_WRITE8_MEMBER(vrc2_w);
- virtual DECLARE_WRITE8_MEMBER(write_h) override;
+ virtual void write_l(offs_t offset, uint8_t data) override { write_m(offset + 0x100, data); }
+ virtual void write_m(offs_t offset, uint8_t data) override;
+ void mmc1_w(offs_t offset, uint8_t data);
+ void mmc3_w(offs_t offset, uint8_t data);
+ void vrc2_w(offs_t offset, uint8_t data);
+ virtual void write_h(offs_t offset, uint8_t data) override;
virtual void pcb_reset() override;
diff --git a/src/devices/bus/nes/subor.cpp b/src/devices/bus/nes/subor.cpp
index c15e8761112..0fa25b2b5bb 100644
--- a/src/devices/bus/nes/subor.cpp
+++ b/src/devices/bus/nes/subor.cpp
@@ -183,7 +183,7 @@ void nes_subor2_device::ppu_latch(offs_t offset)
nt
-------------------------------------------------*/
-READ8_MEMBER(nes_subor2_device::nt_r)
+uint8_t nes_subor2_device::nt_r(offs_t offset)
{
int page = ((offset & 0xc00) >> 10);
@@ -234,7 +234,7 @@ void nes_subor2_device::update_banks()
read
-------------------------------------------------*/
-READ8_MEMBER(nes_subor2_device::read_l)
+uint8_t nes_subor2_device::read_l(offs_t offset)
{
LOG_MMC("subor2 read_l, offset: %04x\n", offset);
@@ -242,14 +242,14 @@ READ8_MEMBER(nes_subor2_device::read_l)
{
return 0x8F;
}
- return m_open_bus;
+ return get_open_bus();
}
/*-------------------------------------------------
write
-------------------------------------------------*/
-WRITE8_MEMBER(nes_subor0_device::write_h)
+void nes_subor0_device::write_h(offs_t offset, uint8_t data)
{
uint8_t subor_helper1, subor_helper2;
LOG_MMC("subor0 write_h, offset: %04x, data: %02x\n", offset, data);
@@ -279,7 +279,7 @@ WRITE8_MEMBER(nes_subor0_device::write_h)
prg16_cdef(subor_helper2);
}
-WRITE8_MEMBER(nes_subor1_device::write_h)
+void nes_subor1_device::write_h(offs_t offset, uint8_t data)
{
uint8_t subor_helper1, subor_helper2;
LOG_MMC("subor1 write_h, offset: %04x, data: %02x\n", offset, data);
@@ -309,7 +309,7 @@ WRITE8_MEMBER(nes_subor1_device::write_h)
prg16_cdef(subor_helper2);
}
-WRITE8_MEMBER(nes_subor2_device::write_l)
+void nes_subor2_device::write_l(offs_t offset, uint8_t data)
{
LOG_MMC("subor2 write_l, offset: %04x, data: %02x\n", offset, data);
diff --git a/src/devices/bus/nes/subor.h b/src/devices/bus/nes/subor.h
index 93e542cf481..a4ffc13a553 100644
--- a/src/devices/bus/nes/subor.h
+++ b/src/devices/bus/nes/subor.h
@@ -20,7 +20,7 @@ public:
// construction/destruction
nes_subor0_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- virtual DECLARE_WRITE8_MEMBER(write_h) override;
+ virtual void write_h(offs_t offset, uint8_t data) override;
virtual void pcb_reset() override;
@@ -41,7 +41,7 @@ public:
// construction/destruction
nes_subor1_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- virtual DECLARE_WRITE8_MEMBER(write_h) override;
+ virtual void write_h(offs_t offset, uint8_t data) override;
virtual void pcb_reset() override;
@@ -62,9 +62,9 @@ public:
// construction/destruction
nes_subor2_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- virtual DECLARE_READ8_MEMBER(nt_r) override;
- virtual DECLARE_WRITE8_MEMBER(write_l) override;
- virtual DECLARE_READ8_MEMBER(read_l) override;
+ virtual uint8_t nt_r(offs_t offset) override;
+ virtual void write_l(offs_t offset, uint8_t data) override;
+ virtual uint8_t read_l(offs_t offset) override;
virtual void ppu_latch(offs_t offset) override;
virtual void pcb_reset() override;
diff --git a/src/devices/bus/nes/sunsoft.cpp b/src/devices/bus/nes/sunsoft.cpp
index f62fa24e67d..be90e36e535 100644
--- a/src/devices/bus/nes/sunsoft.cpp
+++ b/src/devices/bus/nes/sunsoft.cpp
@@ -209,7 +209,7 @@ void nes_sunsoft_fme7_device::pcb_reset()
-------------------------------------------------*/
-WRITE8_MEMBER(nes_sunsoft_1_device::write_m)
+void nes_sunsoft_1_device::write_m(offs_t offset, uint8_t data)
{
LOG_MMC(("Sunsoft 1 write_m, offset: %04x, data: %02x\n", offset, data));
@@ -235,7 +235,7 @@ WRITE8_MEMBER(nes_sunsoft_1_device::write_m)
// there are two 'variants' depending on hardwired or mapper ctrl mirroring
-WRITE8_MEMBER(nes_sunsoft_2_device::write_h)
+void nes_sunsoft_2_device::write_h(offs_t offset, uint8_t data)
{
uint8_t helper = (data & 0x07) | ((data & 0x80) ? 0x08 : 0x00);
LOG_MMC(("Sunsoft 2 write_h, offset: %04x, data: %02x\n", offset, data));
@@ -282,7 +282,7 @@ void nes_sunsoft_3_device::device_timer(emu_timer &timer, device_timer_id id, in
}
}
-WRITE8_MEMBER(nes_sunsoft_3_device::write_h)
+void nes_sunsoft_3_device::write_h(offs_t offset, uint8_t data)
{
LOG_MMC(("Sunsoft 3 write_h, offset %04x, data: %02x\n", offset, data));
@@ -384,7 +384,7 @@ void nes_sunsoft_4_device::sun4_mirror( int mirror, int mirr0, int mirr1 )
}
}
-WRITE8_MEMBER(nes_sunsoft_4_device::sun4_write)
+void nes_sunsoft_4_device::sun4_write(offs_t offset, uint8_t data)
{
LOG_MMC(("Sunsoft 4 write_h, offset %04x, data: %02x\n", offset, data));
@@ -424,7 +424,7 @@ WRITE8_MEMBER(nes_sunsoft_4_device::sun4_write)
}
}
-WRITE8_MEMBER(nes_sunsoft_4_device::write_m)
+void nes_sunsoft_4_device::write_m(offs_t offset, uint8_t data)
{
LOG_MMC(("Sunsoft 4 write_m, offset: %04x, data: %02x\n", offset, data));
@@ -434,7 +434,7 @@ WRITE8_MEMBER(nes_sunsoft_4_device::write_m)
m_prgram[offset & (m_prgram.size() - 1)] = data;
}
-READ8_MEMBER(nes_sunsoft_4_device::read_m)
+uint8_t nes_sunsoft_4_device::read_m(offs_t offset)
{
LOG_MMC(("Sunsoft 4 read_m, offset: %04x\n", offset));
@@ -443,7 +443,7 @@ READ8_MEMBER(nes_sunsoft_4_device::read_m)
if (!m_prgram.empty() && m_wram_enable)
return m_prgram[offset & (m_prgram.size() - 1)];
- return m_open_bus; // open bus
+ return get_open_bus(); // open bus
}
/*-------------------------------------------------
@@ -475,7 +475,7 @@ void nes_sunsoft_fme7_device::device_timer(emu_timer &timer, device_timer_id id,
}
}
-WRITE8_MEMBER(nes_sunsoft_fme7_device::fme7_write)
+void nes_sunsoft_fme7_device::fme7_write(offs_t offset, uint8_t data)
{
LOG_MMC(("fme7_write, offset %04x, data: %02x\n", offset, data));
@@ -533,7 +533,7 @@ WRITE8_MEMBER(nes_sunsoft_fme7_device::fme7_write)
}
}
-WRITE8_MEMBER(nes_sunsoft_fme7_device::write_m)
+void nes_sunsoft_fme7_device::write_m(offs_t offset, uint8_t data)
{
uint8_t bank = m_wram_bank & 0x3f;
LOG_MMC(("Sunsoft FME7 write_m, offset: %04x, data: %02x\n", offset, data));
@@ -549,7 +549,7 @@ WRITE8_MEMBER(nes_sunsoft_fme7_device::write_m)
}
}
-READ8_MEMBER(nes_sunsoft_fme7_device::read_m)
+uint8_t nes_sunsoft_fme7_device::read_m(offs_t offset)
{
uint8_t bank = m_wram_bank & 0x3f;
LOG_MMC(("Sunsoft FME7 read_m, offset: %04x\n", offset));
@@ -564,7 +564,7 @@ READ8_MEMBER(nes_sunsoft_fme7_device::read_m)
return m_prgram[((bank * 0x2000) + offset) & (m_prgram.size() - 1)];
}
- return m_open_bus; // open bus
+ return get_open_bus(); // open bus
}
@@ -578,20 +578,20 @@ READ8_MEMBER(nes_sunsoft_fme7_device::read_m)
-------------------------------------------------*/
-WRITE8_MEMBER(nes_sunsoft_5_device::write_h)
+void nes_sunsoft_5_device::write_h(offs_t offset, uint8_t data)
{
LOG_MMC(("sunsoft 5 write_h, offset %04x, data: %02x\n", offset, data));
switch (offset & 0x6000)
{
case 0x4000:
- m_ym2149->address_w(space, 0, data & 0x0f);
+ m_ym2149->address_w(data & 0x0f);
break;
case 0x6000:
- m_ym2149->data_w(space, 0, data);
+ m_ym2149->data_w(data);
break;
default:
- fme7_write(space, offset, data, mem_mask);
+ fme7_write(offset, data);
break;
}
}
diff --git a/src/devices/bus/nes/sunsoft.h b/src/devices/bus/nes/sunsoft.h
index b4b035d515d..c02b94647cf 100644
--- a/src/devices/bus/nes/sunsoft.h
+++ b/src/devices/bus/nes/sunsoft.h
@@ -17,7 +17,7 @@ public:
// construction/destruction
nes_sunsoft_1_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- virtual DECLARE_WRITE8_MEMBER(write_m) override;
+ virtual void write_m(offs_t offset, uint8_t data) override;
virtual void pcb_reset() override;
@@ -35,7 +35,7 @@ public:
// construction/destruction
nes_sunsoft_2_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- virtual DECLARE_WRITE8_MEMBER(write_h) override;
+ virtual void write_h(offs_t offset, uint8_t data) override;
virtual void pcb_reset() override;
@@ -53,7 +53,7 @@ public:
// construction/destruction
nes_sunsoft_3_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- virtual DECLARE_WRITE8_MEMBER(write_h) override;
+ virtual void write_h(offs_t offset, uint8_t data) override;
virtual void pcb_reset() override;
@@ -78,10 +78,10 @@ public:
// construction/destruction
nes_sunsoft_4_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- virtual DECLARE_READ8_MEMBER(read_m) override;
- virtual DECLARE_WRITE8_MEMBER(write_m) override;
- virtual DECLARE_WRITE8_MEMBER(sun4_write);
- virtual DECLARE_WRITE8_MEMBER(write_h) override { sun4_write(space, offset, data, mem_mask); }
+ virtual uint8_t read_m(offs_t offset) override;
+ virtual void write_m(offs_t offset, uint8_t data) override;
+ void sun4_write(offs_t offset, uint8_t data);
+ virtual void write_h(offs_t offset, uint8_t data) override { sun4_write(offset, data); }
virtual void pcb_reset() override;
@@ -104,10 +104,10 @@ public:
// construction/destruction
nes_sunsoft_fme7_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- virtual DECLARE_READ8_MEMBER(read_m) override;
- virtual DECLARE_WRITE8_MEMBER(write_m) override;
- virtual DECLARE_WRITE8_MEMBER(fme7_write);
- virtual DECLARE_WRITE8_MEMBER(write_h) override { fme7_write(space, offset, data, mem_mask); }
+ virtual uint8_t read_m(offs_t offset) override;
+ virtual void write_m(offs_t offset, uint8_t data) override;
+ void fme7_write(offs_t offset, uint8_t data);
+ virtual void write_h(offs_t offset, uint8_t data) override { fme7_write(offset, data); }
virtual void pcb_reset() override;
@@ -138,7 +138,7 @@ public:
// construction/destruction
nes_sunsoft_5_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- virtual DECLARE_WRITE8_MEMBER(write_h) override;
+ virtual void write_h(offs_t offset, uint8_t data) override;
protected:
virtual void device_add_mconfig(machine_config &config) override;
diff --git a/src/devices/bus/nes/sunsoft_dcs.cpp b/src/devices/bus/nes/sunsoft_dcs.cpp
index 5df2c6557d2..23c81894666 100644
--- a/src/devices/bus/nes/sunsoft_dcs.cpp
+++ b/src/devices/bus/nes/sunsoft_dcs.cpp
@@ -68,10 +68,10 @@ void nes_ntb_slot_device::device_start()
m_cart = dynamic_cast<ntb_cart_interface *>(get_card_device());
}
-READ8_MEMBER(nes_ntb_slot_device::read)
+uint8_t nes_ntb_slot_device::read(offs_t offset)
{
if (m_cart)
- return m_cart->read(space, offset, mem_mask);
+ return m_cart->read(offset);
return 0xff;
}
@@ -212,7 +212,7 @@ void nes_sunsoft_dcs_device::pcb_reset()
-------------------------------------------------*/
-WRITE8_MEMBER(nes_sunsoft_dcs_device::write_h)
+void nes_sunsoft_dcs_device::write_h(offs_t offset, uint8_t data)
{
LOG_MMC(("Sunsoft DCS write_h, offset %04x, data: %02x\n", offset, data));
@@ -224,27 +224,27 @@ WRITE8_MEMBER(nes_sunsoft_dcs_device::write_h)
m_wram_enable = BIT(data, 4);
break;
default:
- sun4_write(space, offset, data, mem_mask);
+ sun4_write(offset, data);
break;
}
}
-READ8_MEMBER(nes_sunsoft_dcs_device::read_h)
+uint8_t nes_sunsoft_dcs_device::read_h(offs_t offset)
{
LOG_MMC(("Sunsoft DCS read_h, offset: %04x\n", offset));
if (m_exrom_enable && m_subslot->m_cart && offset < 0x4000)
{
if (m_timer_on)
- return m_subslot->m_cart->read(space, offset, mem_mask);
+ return m_subslot->m_cart->read(offset);
else
- return m_open_bus; // after the timer is off, this returns open bus...
+ return get_open_bus(); // after the timer is off, this returns open bus...
}
else
return hi_access_rom(offset);
}
-WRITE8_MEMBER(nes_sunsoft_dcs_device::write_m)
+void nes_sunsoft_dcs_device::write_m(offs_t offset, uint8_t data)
{
LOG_MMC(("Sunsoft DCS write_m, offset: %04x, data: %02x\n", offset, data));
@@ -260,7 +260,7 @@ WRITE8_MEMBER(nes_sunsoft_dcs_device::write_m)
}
}
-READ8_MEMBER(nes_sunsoft_dcs_device::read_m)
+uint8_t nes_sunsoft_dcs_device::read_m(offs_t offset)
{
LOG_MMC(("Sunsoft DCS read_m, offset: %04x\n", offset));
@@ -269,7 +269,7 @@ READ8_MEMBER(nes_sunsoft_dcs_device::read_m)
if (!m_prgram.empty() && m_wram_enable)
return m_prgram[offset & (m_prgram.size() - 1)];
- return m_open_bus; // open bus
+ return get_open_bus(); // open bus
}
@@ -285,9 +285,10 @@ static void ntb_cart(device_slot_interface &device)
// device_add_mconfig - add device configuration
//-------------------------------------------------
-MACHINE_CONFIG_START(nes_sunsoft_dcs_device::device_add_mconfig)
- MCFG_NTB_MINICART_ADD("ntb_slot", ntb_cart)
-MACHINE_CONFIG_END
+void nes_sunsoft_dcs_device::device_add_mconfig(machine_config &config)
+{
+ NES_NTB_SLOT(config, m_subslot, ntb_cart);
+}
//-------------------------------------------------
diff --git a/src/devices/bus/nes/sunsoft_dcs.h b/src/devices/bus/nes/sunsoft_dcs.h
index f14d9f9c8c1..51a11b22ae4 100644
--- a/src/devices/bus/nes/sunsoft_dcs.h
+++ b/src/devices/bus/nes/sunsoft_dcs.h
@@ -24,7 +24,7 @@ public:
virtual ~ntb_cart_interface();
// reading and writing
- virtual DECLARE_READ8_MEMBER(read) { return m_rom[offset]; }
+ virtual uint8_t read(offs_t offset) { return m_rom[offset]; }
uint8_t *get_cart_base() { return m_rom; }
@@ -46,6 +46,16 @@ class nes_ntb_slot_device : public device_t,
friend class nes_sunsoft_dcs_device;
public:
// construction/destruction
+ template <typename T>
+ nes_ntb_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, T &&opts)
+ : nes_ntb_slot_device(mconfig, tag, owner, (uint32_t)0)
+ {
+ option_reset();
+ opts(*this);
+ set_default_option(nullptr);
+ set_fixed(false);
+ }
+
nes_ntb_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
virtual ~nes_ntb_slot_device();
@@ -68,7 +78,7 @@ public:
// slot interface overrides
virtual std::string get_default_card_software(get_default_card_software_hook &hook) const override;
- virtual DECLARE_READ8_MEMBER(read);
+ virtual uint8_t read(offs_t offset);
protected:
ntb_cart_interface* m_cart;
@@ -78,11 +88,6 @@ protected:
DECLARE_DEVICE_TYPE(NES_NTB_SLOT, nes_ntb_slot_device)
-#define MCFG_NTB_MINICART_ADD(_tag, _slot_intf) \
- MCFG_DEVICE_ADD(_tag, NES_NTB_SLOT, 0) \
- MCFG_DEVICE_SLOT_INTERFACE(_slot_intf, nullptr, false)
-
-
//-----------------------------------------------
//
// Nantettate!! Baseball Minicart implementation
@@ -128,10 +133,10 @@ public:
// construction/destruction
nes_sunsoft_dcs_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- virtual DECLARE_READ8_MEMBER(read_m) override;
- virtual DECLARE_READ8_MEMBER(read_h) override;
- virtual DECLARE_WRITE8_MEMBER(write_m) override;
- virtual DECLARE_WRITE8_MEMBER(write_h) override;
+ virtual uint8_t read_m(offs_t offset) override;
+ virtual uint8_t read_h(offs_t offset) override;
+ virtual void write_m(offs_t offset, uint8_t data) override;
+ virtual void write_h(offs_t offset, uint8_t data) override;
virtual void pcb_reset() override;
diff --git a/src/devices/bus/nes/taito.cpp b/src/devices/bus/nes/taito.cpp
index 2868bfea1dc..28c37b6109c 100644
--- a/src/devices/bus/nes/taito.cpp
+++ b/src/devices/bus/nes/taito.cpp
@@ -172,7 +172,7 @@ void nes_x1_017_device::pcb_reset()
-------------------------------------------------*/
-WRITE8_MEMBER(nes_tc0190fmc_device::tc0190fmc_write)
+void nes_tc0190fmc_device::tc0190fmc_write(offs_t offset, uint8_t data)
{
LOG_MMC(("tc0190fmc_write, offset: %04x, data: %02x\n", offset, data));
@@ -240,7 +240,7 @@ void nes_tc0190fmc_pal16r4_device::hblank_irq( int scanline, int vblank, int bla
}
}
-WRITE8_MEMBER(nes_tc0190fmc_pal16r4_device::write_h)
+void nes_tc0190fmc_pal16r4_device::write_h(offs_t offset, uint8_t data)
{
LOG_MMC(("tc0190fmc pal16r4 write_h, offset: %04x, data: %02x\n", offset, data));
@@ -256,7 +256,7 @@ WRITE8_MEMBER(nes_tc0190fmc_pal16r4_device::write_h)
case 0x2001:
case 0x2002:
case 0x2003:
- tc0190fmc_write(space, offset, data, mem_mask);
+ tc0190fmc_write(offset, data);
break;
case 0x4000:
m_irq_count_latch = (0x100 - data) & 0xff;
@@ -291,7 +291,7 @@ WRITE8_MEMBER(nes_tc0190fmc_pal16r4_device::write_h)
-------------------------------------------------*/
-WRITE8_MEMBER(nes_x1_005_device::write_m)
+void nes_x1_005_device::write_m(offs_t offset, uint8_t data)
{
LOG_MMC(("x1_005 write_m, offset: %04x, data: %02x\n", offset, data));
@@ -355,14 +355,14 @@ WRITE8_MEMBER(nes_x1_005_device::write_m)
m_x1_005_ram[offset & 0x7f] = data;
}
-READ8_MEMBER(nes_x1_005_device::read_m)
+uint8_t nes_x1_005_device::read_m(offs_t offset)
{
LOG_MMC(("x1_005 read_m, offset: %04x\n", offset));
if (offset >= 0x1f00 && m_latch == 0xa3)
return m_x1_005_ram[offset & 0x7f];
- return m_open_bus; // open bus
+ return get_open_bus(); // open bus
}
/*-------------------------------------------------
@@ -399,7 +399,7 @@ void nes_x1_017_device::set_chr()
chr1_x(7 ^ m_latch, m_mmc_vrom_bank[5], CHRROM);
}
-WRITE8_MEMBER(nes_x1_017_device::write_m)
+void nes_x1_017_device::write_m(offs_t offset, uint8_t data)
{
LOG_MMC(("x1017 write_m, offset: %04x, data: %02x\n", offset, data));
@@ -453,7 +453,7 @@ WRITE8_MEMBER(nes_x1_017_device::write_m)
m_x1_017_ram[0x1000 + (offset & 0x3ff)] = data;
}
-READ8_MEMBER(nes_x1_017_device::read_m)
+uint8_t nes_x1_017_device::read_m(offs_t offset)
{
LOG_MMC(("x1017 read_m, offset: %04x\n", offset));
@@ -465,5 +465,5 @@ READ8_MEMBER(nes_x1_017_device::read_m)
if (offset < 0x1400 && m_reg[2] == 0x84)
return m_x1_017_ram[0x1000 + (offset & 0x3ff)];
- return m_open_bus; // open bus
+ return get_open_bus(); // open bus
}
diff --git a/src/devices/bus/nes/taito.h b/src/devices/bus/nes/taito.h
index 8f3ccb2a8ee..b4efa553c86 100644
--- a/src/devices/bus/nes/taito.h
+++ b/src/devices/bus/nes/taito.h
@@ -16,8 +16,8 @@ public:
// construction/destruction
nes_tc0190fmc_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- virtual DECLARE_WRITE8_MEMBER(tc0190fmc_write);
- virtual DECLARE_WRITE8_MEMBER(write_h) override { tc0190fmc_write(space, offset, data, mem_mask); }
+ void tc0190fmc_write(offs_t offset, uint8_t data);
+ virtual void write_h(offs_t offset, uint8_t data) override { tc0190fmc_write(offset, data); }
virtual void pcb_reset() override;
@@ -37,7 +37,7 @@ public:
// construction/destruction
nes_tc0190fmc_pal16r4_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- virtual DECLARE_WRITE8_MEMBER(write_h) override;
+ virtual void write_h(offs_t offset, uint8_t data) override;
virtual void hblank_irq(int scanline, int vblank, int blanked) override;
virtual void pcb_reset() override;
@@ -60,8 +60,8 @@ public:
// construction/destruction
nes_x1_005_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- virtual DECLARE_READ8_MEMBER(read_m) override;
- virtual DECLARE_WRITE8_MEMBER(write_m) override;
+ virtual uint8_t read_m(offs_t offset) override;
+ virtual void write_m(offs_t offset, uint8_t data) override;
virtual void pcb_reset() override;
@@ -84,8 +84,8 @@ public:
// construction/destruction
nes_x1_017_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- virtual DECLARE_READ8_MEMBER(read_m) override;
- virtual DECLARE_WRITE8_MEMBER(write_m) override;
+ virtual uint8_t read_m(offs_t offset) override;
+ virtual void write_m(offs_t offset, uint8_t data) override;
virtual void pcb_reset() override;
diff --git a/src/devices/bus/nes/tengen.cpp b/src/devices/bus/nes/tengen.cpp
index 9cef09434a0..f6228685796 100644
--- a/src/devices/bus/nes/tengen.cpp
+++ b/src/devices/bus/nes/tengen.cpp
@@ -126,7 +126,7 @@ void nes_tengen032_device::pcb_reset()
-------------------------------------------------*/
-WRITE8_MEMBER(nes_tengen008_device::write_h)
+void nes_tengen008_device::write_h(offs_t offset, uint8_t data)
{
LOG_MMC(("tengen008 write_h, offset: %04x, data: %02x\n", offset, data));
@@ -240,7 +240,7 @@ void nes_tengen032_device::set_chr()
chr_cb(7 ^ chr_page, m_mmc_vrom_bank[5], CHRROM);
}
-WRITE8_MEMBER(nes_tengen032_device::tengen032_write)
+void nes_tengen032_device::tengen032_write(offs_t offset, uint8_t data)
{
uint8_t helper, cmd;
LOG_MMC(("tengen032_write, offset: %04x, data: %02x\n", offset, data));
@@ -359,7 +359,7 @@ void nes_tengen037_device::chr_cb( int start, int bank, int source )
}
-WRITE8_MEMBER(nes_tengen037_device::write_h)
+void nes_tengen037_device::write_h(offs_t offset, uint8_t data)
{
LOG_MMC(("tengen037 write_h, offset: %04x, data: %02x\n", offset, data));
@@ -369,7 +369,7 @@ WRITE8_MEMBER(nes_tengen037_device::write_h)
break;
default:
- tengen032_write(space, offset, data, mem_mask);
+ tengen032_write(offset, data);
break;
}
}
diff --git a/src/devices/bus/nes/tengen.h b/src/devices/bus/nes/tengen.h
index dce41f4fbb4..6d651339f86 100644
--- a/src/devices/bus/nes/tengen.h
+++ b/src/devices/bus/nes/tengen.h
@@ -14,7 +14,7 @@ public:
// construction/destruction
nes_tengen008_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- virtual DECLARE_WRITE8_MEMBER(write_h) override;
+ virtual void write_h(offs_t offset, uint8_t data) override;
virtual void pcb_reset() override;
@@ -32,8 +32,8 @@ public:
// construction/destruction
nes_tengen032_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- virtual DECLARE_WRITE8_MEMBER(tengen032_write);
- virtual DECLARE_WRITE8_MEMBER(write_h) override { tengen032_write(space, offset, data, mem_mask); }
+ void tengen032_write(offs_t offset, uint8_t data);
+ virtual void write_h(offs_t offset, uint8_t data) override { tengen032_write(offset, data); }
virtual void hblank_irq(int scanline, int vblank, int blanked) override;
virtual void pcb_reset() override;
@@ -74,7 +74,7 @@ public:
nes_tengen037_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
// device-level overrides
- virtual DECLARE_WRITE8_MEMBER(write_h) override;
+ virtual void write_h(offs_t offset, uint8_t data) override;
virtual void chr_cb(int start, int bank, int source) override;
protected:
diff --git a/src/devices/bus/nes/txc.cpp b/src/devices/bus/nes/txc.cpp
index f3ab8efc5f9..4149c6262a3 100644
--- a/src/devices/bus/nes/txc.cpp
+++ b/src/devices/bus/nes/txc.cpp
@@ -139,7 +139,7 @@ void nes_txc_commandos_device::pcb_reset()
-------------------------------------------------*/
-WRITE8_MEMBER(nes_txc_22211_device::write_l)
+void nes_txc_22211_device::write_l(offs_t offset, uint8_t data)
{
LOG_MMC(("TXC 22111 write_l, offset: %04x, data: %02x\n", offset, data));
@@ -147,7 +147,7 @@ WRITE8_MEMBER(nes_txc_22211_device::write_l)
m_reg[offset & 0x03] = data;
}
-READ8_MEMBER(nes_txc_22211_device::read_l)
+uint8_t nes_txc_22211_device::read_l(offs_t offset)
{
LOG_MMC(("TXC 22111 read_l, offset: %04x\n", offset));
@@ -157,7 +157,7 @@ READ8_MEMBER(nes_txc_22211_device::read_l)
return 0x00;
}
-WRITE8_MEMBER(nes_txc_22211_device::write_h)
+void nes_txc_22211_device::write_h(offs_t offset, uint8_t data)
{
LOG_MMC(("TXC 22111 write_h, offset: %04x, data: %02x\n", offset, data));
@@ -180,7 +180,7 @@ WRITE8_MEMBER(nes_txc_22211_device::write_h)
-------------------------------------------------*/
-WRITE8_MEMBER(nes_txc_dumarc_device::write_h)
+void nes_txc_dumarc_device::write_h(offs_t offset, uint8_t data)
{
LOG_MMC(("TXC Du Ma Racing write_h, offset: %04x, data: %02x\n", offset, data));
@@ -203,7 +203,7 @@ WRITE8_MEMBER(nes_txc_dumarc_device::write_h)
-------------------------------------------------*/
-READ8_MEMBER(nes_txc_mjblock_device::read_l)
+uint8_t nes_txc_mjblock_device::read_l(offs_t offset)
{
LOG_MMC(("TXC mjblock read_l, offset: %04x\n", offset));
@@ -226,7 +226,7 @@ READ8_MEMBER(nes_txc_mjblock_device::read_l)
-------------------------------------------------*/
-WRITE8_MEMBER(nes_txc_strikew_device::write_h)
+void nes_txc_strikew_device::write_h(offs_t offset, uint8_t data)
{
LOG_MMC(("TXC Strike Wolf write_h, offset: %04x, data: %02x\n", offset, data));
@@ -256,12 +256,12 @@ WRITE8_MEMBER(nes_txc_strikew_device::write_h)
-------------------------------------------------*/
-READ8_MEMBER(nes_txc_commandos_device::read_l)
+uint8_t nes_txc_commandos_device::read_l(offs_t offset)
{
return 0x50;
}
-WRITE8_MEMBER(nes_txc_commandos_device::write_h)
+void nes_txc_commandos_device::write_h(offs_t offset, uint8_t data)
{
LOG_MMC(("TXC Commandos write_h, offset: %04x, data: %02x\n", offset, data));
diff --git a/src/devices/bus/nes/txc.h b/src/devices/bus/nes/txc.h
index f4b875b51ba..9ad5e2807dc 100644
--- a/src/devices/bus/nes/txc.h
+++ b/src/devices/bus/nes/txc.h
@@ -16,9 +16,9 @@ public:
// construction/destruction
nes_txc_22211_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- virtual DECLARE_READ8_MEMBER(read_l) override;
- virtual DECLARE_WRITE8_MEMBER(write_l) override;
- virtual DECLARE_WRITE8_MEMBER(write_h) override;
+ virtual uint8_t read_l(offs_t offset) override;
+ virtual void write_l(offs_t offset, uint8_t data) override;
+ virtual void write_h(offs_t offset, uint8_t data) override;
virtual void pcb_reset() override;
@@ -41,7 +41,7 @@ public:
nes_txc_dumarc_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
// device-level overrides
- virtual DECLARE_WRITE8_MEMBER(write_h) override;
+ virtual void write_h(offs_t offset, uint8_t data) override;
};
@@ -54,7 +54,7 @@ public:
nes_txc_mjblock_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
// device-level overrides
- virtual DECLARE_READ8_MEMBER(read_l) override;
+ virtual uint8_t read_l(offs_t offset) override;
};
@@ -66,7 +66,7 @@ public:
// construction/destruction
nes_txc_strikew_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- virtual DECLARE_WRITE8_MEMBER(write_h) override;
+ virtual void write_h(offs_t offset, uint8_t data) override;
virtual void pcb_reset() override;
@@ -84,8 +84,8 @@ public:
// construction/destruction
nes_txc_commandos_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- virtual DECLARE_READ8_MEMBER(read_l) override;
- virtual DECLARE_WRITE8_MEMBER(write_h) override;
+ virtual uint8_t read_l(offs_t offset) override;
+ virtual void write_h(offs_t offset, uint8_t data) override;
virtual void pcb_reset() override;
diff --git a/src/devices/bus/nes/waixing.cpp b/src/devices/bus/nes/waixing.cpp
index 791779f0a76..3706d64b26e 100644
--- a/src/devices/bus/nes/waixing.cpp
+++ b/src/devices/bus/nes/waixing.cpp
@@ -433,7 +433,7 @@ void nes_waixing_a1_device::chr_cb(int start, int bank, int source)
chr1_x(start, bank, chr_src);
}
-WRITE8_MEMBER(nes_waixing_a_device::waixing_write)
+void nes_waixing_a_device::waixing_write(offs_t offset, uint8_t data)
{
LOG_MMC(("waixing_write, offset: %04x, data: %02x\n", offset, data));
@@ -447,12 +447,12 @@ WRITE8_MEMBER(nes_waixing_a_device::waixing_write)
break;
default:
- txrom_write(space, offset, data, mem_mask);
+ txrom_write(offset, data);
break;
}
}
-READ8_MEMBER(nes_waixing_a_device::read_l)
+uint8_t nes_waixing_a_device::read_l(offs_t offset)
{
LOG_MMC(("waixing read_l, offset: %04x\n", offset));
offset += 0x100;
@@ -462,7 +462,7 @@ READ8_MEMBER(nes_waixing_a_device::read_l)
return 0xff;
}
-WRITE8_MEMBER(nes_waixing_a_device::write_l)
+void nes_waixing_a_device::write_l(offs_t offset, uint8_t data)
{
LOG_MMC(("waixing write_l, offset: %04x, data: %02x\n", offset, data));
offset += 0x100;
@@ -597,7 +597,7 @@ void nes_waixing_f_device::set_prg( int prg_base, int prg_mask )
prg_cb(3, m_mmc_prg_bank[3]);
}
-WRITE8_MEMBER(nes_waixing_f_device::write_h)
+void nes_waixing_f_device::write_h(offs_t offset, uint8_t data)
{
uint8_t cmd;
LOG_MMC(("waixing_f write_h, offset: %04x, data: %02x\n", offset, data));
@@ -628,7 +628,7 @@ WRITE8_MEMBER(nes_waixing_f_device::write_h)
break;
default:
- waixing_write(space, offset, data, mem_mask);
+ waixing_write(offset, data);
break;
}
}
@@ -668,7 +668,7 @@ void nes_waixing_g_device::set_chr(uint8_t chr, int chr_base, int chr_mask)
chr_cb(chr_page ^ 7, chr_base | (m_mmc_vrom_bank[5] & chr_mask), chr);
}
-WRITE8_MEMBER(nes_waixing_g_device::write_h)
+void nes_waixing_g_device::write_h(offs_t offset, uint8_t data)
{
uint8_t cmd;
LOG_MMC(("waixing_g write_h, offset: %04x, data: %02x\n", offset, data));
@@ -699,7 +699,7 @@ WRITE8_MEMBER(nes_waixing_g_device::write_h)
break;
default:
- waixing_write(space, offset, data, mem_mask);
+ waixing_write(offset, data);
break;
}
}
@@ -731,7 +731,7 @@ void nes_waixing_h_device::chr_cb(int start, int bank, int source)
chr1_x(start, bank, source);
}
-WRITE8_MEMBER(nes_waixing_h_device::write_h)
+void nes_waixing_h_device::write_h(offs_t offset, uint8_t data)
{
uint8_t cmd;
LOG_MMC(("waixing_h write_h, offset: %04x, data: %02x\n", offset, data));
@@ -767,12 +767,12 @@ WRITE8_MEMBER(nes_waixing_h_device::write_h)
break;
default:
- txrom_write(space, offset, data, mem_mask);
+ txrom_write(offset, data);
break;
}
}
-WRITE8_MEMBER(nes_waixing_h1_device::write_h)
+void nes_waixing_h1_device::write_h(offs_t offset, uint8_t data)
{
uint8_t cmd;
LOG_MMC(("waixing_h1 write_h, offset: %04x, data: %02x\n", offset, data));
@@ -805,7 +805,7 @@ WRITE8_MEMBER(nes_waixing_h1_device::write_h)
break;
default:
- txrom_write(space, offset, data, mem_mask);
+ txrom_write(offset, data);
break;
}
}
@@ -832,7 +832,7 @@ void nes_waixing_j_device::set_prg( int prg_base, int prg_mask )
prg_cb(3, m_reg[3]);
}
-WRITE8_MEMBER(nes_waixing_j_device::write_h)
+void nes_waixing_j_device::write_h(offs_t offset, uint8_t data)
{
uint8_t cmd;
LOG_MMC(("waixing_f write_h, offset: %04x, data: %02x\n", offset, data));
@@ -862,7 +862,7 @@ WRITE8_MEMBER(nes_waixing_j_device::write_h)
// break;
default:
- waixing_write(space, offset, data, mem_mask);
+ waixing_write(offset, data);
break;
}
}
@@ -887,7 +887,7 @@ void nes_waixing_sh2_device::chr_cb(int start, int bank, int source)
chr4_4(m_reg[1], m_reg[1] ? CHRRAM : CHRROM);
}
-READ8_MEMBER(nes_waixing_sh2_device::chr_r)
+uint8_t nes_waixing_sh2_device::chr_r(offs_t offset)
{
int bank = offset >> 10;
uint8_t val = m_chr_access[bank][offset & 0x3ff]; // this would be usual return value
@@ -940,7 +940,7 @@ void nes_waixing_sec_device::chr_cb(int start, int bank, int source)
chr1_x(start, bank, source);
}
-WRITE8_MEMBER(nes_waixing_sec_device::write_l)
+void nes_waixing_sec_device::write_l(offs_t offset, uint8_t data)
{
LOG_MMC(("waixing_sec write_l, offset: %04x, data: %02x\n", offset, data));
offset += 0x100;
@@ -979,7 +979,7 @@ void nes_waixing_sgz_device::hblank_irq(int scanline, int vblank, int blanked)
}
}
-WRITE8_MEMBER(nes_waixing_sgz_device::write_h)
+void nes_waixing_sgz_device::write_h(offs_t offset, uint8_t data)
{
uint8_t helper, bank;
LOG_MMC(("waixing_sgz write_h, offset: %04x, data: %02x\n", offset, data));
@@ -1047,7 +1047,7 @@ WRITE8_MEMBER(nes_waixing_sgz_device::write_h)
-------------------------------------------------*/
-WRITE8_MEMBER(nes_waixing_sgzlz_device::write_l)
+void nes_waixing_sgzlz_device::write_l(offs_t offset, uint8_t data)
{
LOG_MMC(("waixing_sgzlz write_l, offset: %04x, data: %02x\n", offset, data));
if (offset >= 0x700 && offset <= 0xEFF)
@@ -1112,7 +1112,7 @@ WRITE8_MEMBER(nes_waixing_sgzlz_device::write_l)
-------------------------------------------------*/
-WRITE8_MEMBER(nes_waixing_ffv_device::write_l)
+void nes_waixing_ffv_device::write_l(offs_t offset, uint8_t data)
{
uint8_t helper;
LOG_MMC(("waixing_ffv write_l, offset: %04x, data: %02x\n", offset, data));
@@ -1161,7 +1161,7 @@ WRITE8_MEMBER(nes_waixing_ffv_device::write_l)
-------------------------------------------------*/
-WRITE8_MEMBER(nes_waixing_wxzs_device::write_h)
+void nes_waixing_wxzs_device::write_h(offs_t offset, uint8_t data)
{
LOG_MMC(("waixing_zs write_h, offset: %04x, data: %02x\n", offset, data));
@@ -1191,7 +1191,7 @@ WRITE8_MEMBER(nes_waixing_wxzs_device::write_h)
-------------------------------------------------*/
-WRITE8_MEMBER(nes_waixing_dq8_device::write_h)
+void nes_waixing_dq8_device::write_h(offs_t offset, uint8_t data)
{
LOG_MMC(("waixing_dq8 write_h, offset: %04x, data: %02x\n", offset, data));
@@ -1212,7 +1212,7 @@ WRITE8_MEMBER(nes_waixing_dq8_device::write_h)
-------------------------------------------------*/
-WRITE8_MEMBER(nes_waixing_wxzs2_device::write_h)
+void nes_waixing_wxzs2_device::write_h(offs_t offset, uint8_t data)
{
uint8_t flip = (data & 0x80) >> 7;
uint8_t helper = (data & 0x7f) << 1;
@@ -1265,7 +1265,7 @@ WRITE8_MEMBER(nes_waixing_wxzs2_device::write_h)
-------------------------------------------------*/
-WRITE8_MEMBER(nes_waixing_fs304_device::write_l)
+void nes_waixing_fs304_device::write_l(offs_t offset, uint8_t data)
{
LOG_MMC(("fs304 write_l, offset: %04x, data: %02x\n", offset, data));
int bank;
diff --git a/src/devices/bus/nes/waixing.h b/src/devices/bus/nes/waixing.h
index 5488973a14c..bb6fcaf831a 100644
--- a/src/devices/bus/nes/waixing.h
+++ b/src/devices/bus/nes/waixing.h
@@ -16,10 +16,10 @@ public:
// construction/destruction
nes_waixing_a_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- virtual DECLARE_READ8_MEMBER(read_l) override;
- virtual DECLARE_WRITE8_MEMBER(write_l) override;
- virtual DECLARE_WRITE8_MEMBER(waixing_write);
- virtual DECLARE_WRITE8_MEMBER(write_h) override { waixing_write(space, offset, data, mem_mask); }
+ virtual uint8_t read_l(offs_t offset) override;
+ virtual void write_l(offs_t offset, uint8_t data) override;
+ virtual void waixing_write(offs_t offset, uint8_t data);
+ virtual void write_h(offs_t offset, uint8_t data) override { waixing_write(offset, data); }
virtual void chr_cb(int start, int bank, int source) override;
virtual void pcb_reset() override;
@@ -109,7 +109,7 @@ public:
nes_waixing_f_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
// device-level overrides
- virtual DECLARE_WRITE8_MEMBER(write_h) override;
+ virtual void write_h(offs_t offset, uint8_t data) override;
virtual void prg_cb(int start, int bank) override;
virtual void chr_cb(int start, int bank, int source) override;
@@ -129,7 +129,7 @@ public:
nes_waixing_g_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
// device-level overrides
- virtual DECLARE_WRITE8_MEMBER(write_h) override;
+ virtual void write_h(offs_t offset, uint8_t data) override;
virtual void chr_cb(int start, int bank, int source) override;
virtual void pcb_reset() override;
@@ -155,7 +155,7 @@ protected:
nes_waixing_h_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock);
// device-level overrides
- virtual DECLARE_WRITE8_MEMBER(write_h) override;
+ virtual void write_h(offs_t offset, uint8_t data) override;
};
@@ -168,7 +168,7 @@ public:
nes_waixing_h1_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
// device-level overrides
- virtual DECLARE_WRITE8_MEMBER(write_h) override;
+ virtual void write_h(offs_t offset, uint8_t data) override;
// This variant does not ignore the wram protect!
};
@@ -194,7 +194,7 @@ public:
// construction/destruction
nes_waixing_j_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- virtual DECLARE_WRITE8_MEMBER(write_h) override;
+ virtual void write_h(offs_t offset, uint8_t data) override;
virtual void pcb_reset() override;
@@ -217,7 +217,7 @@ public:
// device-level overrides
virtual void device_start() override;
- virtual DECLARE_READ8_MEMBER(chr_r) override;
+ virtual uint8_t chr_r(offs_t offset) override;
virtual void chr_cb(int start, int bank, int source) override;
virtual void pcb_reset() override;
@@ -235,7 +235,7 @@ public:
// construction/destruction
nes_waixing_sec_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- virtual DECLARE_WRITE8_MEMBER(write_l) override;
+ virtual void write_l(offs_t offset, uint8_t data) override;
virtual void prg_cb(int start, int bank) override;
virtual void chr_cb(int start, int bank, int source) override;
@@ -257,7 +257,7 @@ public:
// construction/destruction
nes_waixing_sgz_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- virtual DECLARE_WRITE8_MEMBER(write_h) override;
+ virtual void write_h(offs_t offset, uint8_t data) override;
virtual void hblank_irq(int scanline, int vblank, int blanked) override;
virtual void pcb_reset() override;
@@ -281,7 +281,7 @@ public:
// construction/destruction
nes_waixing_sgzlz_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- virtual DECLARE_WRITE8_MEMBER(write_l) override;
+ virtual void write_l(offs_t offset, uint8_t data) override;
virtual void pcb_reset() override;
@@ -301,7 +301,7 @@ public:
// construction/destruction
nes_waixing_ffv_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- virtual DECLARE_WRITE8_MEMBER(write_l) override;
+ virtual void write_l(offs_t offset, uint8_t data) override;
virtual void pcb_reset() override;
@@ -321,7 +321,7 @@ public:
// construction/destruction
nes_waixing_wxzs_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- virtual DECLARE_WRITE8_MEMBER(write_h) override;
+ virtual void write_h(offs_t offset, uint8_t data) override;
virtual void pcb_reset() override;
@@ -339,7 +339,7 @@ public:
// construction/destruction
nes_waixing_dq8_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- virtual DECLARE_WRITE8_MEMBER(write_h) override;
+ virtual void write_h(offs_t offset, uint8_t data) override;
virtual void pcb_reset() override;
@@ -357,7 +357,7 @@ public:
// construction/destruction
nes_waixing_wxzs2_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- virtual DECLARE_WRITE8_MEMBER(write_h) override;
+ virtual void write_h(offs_t offset, uint8_t data) override;
virtual void pcb_reset() override;
@@ -375,7 +375,7 @@ public:
// construction/destruction
nes_waixing_fs304_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- virtual DECLARE_WRITE8_MEMBER(write_l) override;
+ virtual void write_l(offs_t offset, uint8_t data) override;
virtual void pcb_reset() override;
diff --git a/src/devices/bus/nes/zemina.cpp b/src/devices/bus/nes/zemina.cpp
index bb4b3b61bc0..22741967572 100644
--- a/src/devices/bus/nes/zemina.cpp
+++ b/src/devices/bus/nes/zemina.cpp
@@ -80,7 +80,7 @@ void nes_zemina_device::pcb_reset()
write
-------------------------------------------------*/
-WRITE8_MEMBER(nes_zemina_device::write_h)
+void nes_zemina_device::write_h(offs_t offset, uint8_t data)
{
LOG_MMC("zemina write_h, offset: %04x, data: %02x\n", offset, data);
diff --git a/src/devices/bus/nes/zemina.h b/src/devices/bus/nes/zemina.h
index 87d170d053d..752c7f1382d 100644
--- a/src/devices/bus/nes/zemina.h
+++ b/src/devices/bus/nes/zemina.h
@@ -20,7 +20,7 @@ public:
// device-level overrides
virtual void device_start() override;
- virtual DECLARE_WRITE8_MEMBER(write_h) override;
+ virtual void write_h(offs_t offset, uint8_t data) override;
virtual void pcb_reset() override;
};
diff --git a/src/devices/bus/nes_ctrl/fckeybrd.cpp b/src/devices/bus/nes_ctrl/fckeybrd.cpp
index 9c81fbea67e..5633254c8fb 100644
--- a/src/devices/bus/nes_ctrl/fckeybrd.cpp
+++ b/src/devices/bus/nes_ctrl/fckeybrd.cpp
@@ -123,11 +123,12 @@ ioport_constructor nes_fckeybrd_device::device_input_ports() const
// device_add_mconfig - add device configuration
//-------------------------------------------------
-MACHINE_CONFIG_START(nes_fckeybrd_device::device_add_mconfig)
- MCFG_CASSETTE_ADD("tape")
- MCFG_CASSETTE_DEFAULT_STATE(CASSETTE_STOPPED | CASSETTE_MOTOR_ENABLED | CASSETTE_SPEAKER_ENABLED)
- MCFG_CASSETTE_INTERFACE("fc_cass")
-MACHINE_CONFIG_END
+void nes_fckeybrd_device::device_add_mconfig(machine_config &config)
+{
+ CASSETTE(config, m_cassette);
+ m_cassette->set_default_state(CASSETTE_STOPPED | CASSETTE_MOTOR_ENABLED | CASSETTE_SPEAKER_ENABLED);
+ m_cassette->set_interface("fc_cass");
+}
//**************************************************************************
diff --git a/src/devices/bus/nes_ctrl/miracle.cpp b/src/devices/bus/nes_ctrl/miracle.cpp
index 6f41774f1e0..d9f445f58ef 100644
--- a/src/devices/bus/nes_ctrl/miracle.cpp
+++ b/src/devices/bus/nes_ctrl/miracle.cpp
@@ -22,12 +22,12 @@
DEFINE_DEVICE_TYPE(NES_MIRACLE, nes_miracle_device, "nes_miracle", "NES Miracle Piano Controller")
-MACHINE_CONFIG_START(nes_miracle_device::device_add_mconfig)
- MCFG_MIDI_PORT_ADD("mdin", midiin_slot, "midiin")
- MCFG_MIDI_RX_HANDLER(WRITELINE(*this, nes_miracle_device, rx_w))
+void nes_miracle_device::device_add_mconfig(machine_config &config)
+{
+ MIDI_PORT(config, "mdin", midiin_slot, "midiin").rxd_handler().set(FUNC(nes_miracle_device::rx_w));
- MCFG_MIDI_PORT_ADD("mdout", midiout_slot, "midiout")
-MACHINE_CONFIG_END
+ MIDI_PORT(config, "mdout", midiout_slot, "midiout");
+}
//-------------------------------------------------
diff --git a/src/devices/bus/newbrain/eim.cpp b/src/devices/bus/newbrain/eim.cpp
index 2bafd008eb6..3f0b7a19ee0 100644
--- a/src/devices/bus/newbrain/eim.cpp
+++ b/src/devices/bus/newbrain/eim.cpp
@@ -67,14 +67,15 @@ const tiny_rom_entry *newbrain_eim_device::device_rom_region() const
// device_add_mconfig - add device configuration
//-------------------------------------------------
-MACHINE_CONFIG_START(newbrain_eim_device::device_add_mconfig)
+void newbrain_eim_device::device_add_mconfig(machine_config &config)
+{
// devices
Z80CTC(config, m_ctc, XTAL(16'000'000)/8);
m_ctc->zc_callback<0>().set(m_acia, FUNC(acia6850_device::write_rxc));
m_ctc->zc_callback<1>().set(m_acia, FUNC(acia6850_device::write_txc));
m_ctc->zc_callback<2>().set(FUNC(newbrain_eim_device::ctc_z2_w));
- MCFG_TIMER_DRIVER_ADD_PERIODIC("z80ctc_c2", newbrain_eim_device, ctc_c2_tick, attotime::from_hz(XTAL(16'000'000)/4/13))
+ TIMER(config, "z80ctc_c2").configure_periodic(FUNC(newbrain_eim_device::ctc_c2_tick), attotime::from_hz(XTAL(16'000'000)/4/13));
adc0809_device &adc(ADC0809(config, ADC0809_TAG, 500000));
adc.eoc_callback().set(FUNC(newbrain_eim_device::adc_eoc_w));
@@ -92,11 +93,11 @@ MACHINE_CONFIG_START(newbrain_eim_device::device_add_mconfig)
RS232_PORT(config, RS232_TAG, default_rs232_devices, nullptr);
- MCFG_NEWBRAIN_EXPANSION_SLOT_ADD(NEWBRAIN_EXPANSION_SLOT_TAG, XTAL(16'000'000)/8, newbrain_expansion_cards, "fdc")
+ NEWBRAIN_EXPANSION_SLOT(config, m_exp, XTAL(16'000'000)/8, newbrain_expansion_cards, "fdc");
// internal ram
RAM(config, RAM_TAG).set_default_size("96K");
-MACHINE_CONFIG_END
+}
//**************************************************************************
@@ -144,9 +145,9 @@ void newbrain_eim_device::device_reset()
// mreq_r - memory request read
//-------------------------------------------------
-uint8_t newbrain_eim_device::mreq_r(address_space &space, offs_t offset, uint8_t data, bool &romov, int &exrm, bool &raminh)
+uint8_t newbrain_eim_device::mreq_r(offs_t offset, uint8_t data, bool &romov, int &exrm, bool &raminh)
{
- return m_exp->mreq_r(space, offset, data, romov, exrm, raminh);
+ return m_exp->mreq_r(offset, data, romov, exrm, raminh);
}
@@ -154,9 +155,9 @@ uint8_t newbrain_eim_device::mreq_r(address_space &space, offs_t offset, uint8_t
// mreq_w - memory request write
//-------------------------------------------------
-void newbrain_eim_device::mreq_w(address_space &space, offs_t offset, uint8_t data, bool &romov, int &exrm, bool &raminh)
+void newbrain_eim_device::mreq_w(offs_t offset, uint8_t data, bool &romov, int &exrm, bool &raminh)
{
- m_exp->mreq_w(space, offset, data, romov, exrm, raminh);
+ m_exp->mreq_w(offset, data, romov, exrm, raminh);
}
@@ -164,9 +165,9 @@ void newbrain_eim_device::mreq_w(address_space &space, offs_t offset, uint8_t da
// iorq_r - I/O request read
//-------------------------------------------------
-uint8_t newbrain_eim_device::iorq_r(address_space &space, offs_t offset, uint8_t data, bool &prtov)
+uint8_t newbrain_eim_device::iorq_r(offs_t offset, uint8_t data, bool &prtov)
{
- return m_exp->iorq_r(space, offset, data, prtov);
+ return m_exp->iorq_r(offset, data, prtov);
}
@@ -174,9 +175,9 @@ uint8_t newbrain_eim_device::iorq_r(address_space &space, offs_t offset, uint8_t
// iorq_w - I/O request write
//-------------------------------------------------
-void newbrain_eim_device::iorq_w(address_space &space, offs_t offset, uint8_t data, bool &prtov)
+void newbrain_eim_device::iorq_w(offs_t offset, uint8_t data, bool &prtov)
{
- m_exp->iorq_w(space, offset, data, prtov);
+ m_exp->iorq_w(offset, data, prtov);
}
diff --git a/src/devices/bus/newbrain/eim.h b/src/devices/bus/newbrain/eim.h
index 3e83b22112e..19b456338fd 100644
--- a/src/devices/bus/newbrain/eim.h
+++ b/src/devices/bus/newbrain/eim.h
@@ -48,10 +48,10 @@ protected:
virtual void device_add_mconfig(machine_config &config) override;
// device_newbrain_expansion_slot_interface overrides
- virtual uint8_t mreq_r(address_space &space, offs_t offset, uint8_t data, bool &romov, int &exrm, bool &raminh) override;
- virtual void mreq_w(address_space &space, offs_t offset, uint8_t data, bool &romov, int &exrm, bool &raminh) override;
- virtual uint8_t iorq_r(address_space &space, offs_t offset, uint8_t data, bool &prtov) override;
- virtual void iorq_w(address_space &space, offs_t offset, uint8_t data, bool &prtov) override;
+ virtual uint8_t mreq_r(offs_t offset, uint8_t data, bool &romov, int &exrm, bool &raminh) override;
+ virtual void mreq_w(offs_t offset, uint8_t data, bool &romov, int &exrm, bool &raminh) override;
+ virtual uint8_t iorq_r(offs_t offset, uint8_t data, bool &prtov) override;
+ virtual void iorq_w(offs_t offset, uint8_t data, bool &prtov) override;
private:
DECLARE_WRITE_LINE_MEMBER( acia_interrupt );
diff --git a/src/devices/bus/newbrain/exp.cpp b/src/devices/bus/newbrain/exp.cpp
index b4675c3b89f..a1a9e2210ed 100644
--- a/src/devices/bus/newbrain/exp.cpp
+++ b/src/devices/bus/newbrain/exp.cpp
@@ -77,11 +77,11 @@ void newbrain_expansion_slot_device::device_reset()
// mreq_r - memory request read
//-------------------------------------------------
-uint8_t newbrain_expansion_slot_device::mreq_r(address_space &space, offs_t offset, uint8_t data, bool &romov, int &exrm, bool &raminh)
+uint8_t newbrain_expansion_slot_device::mreq_r(offs_t offset, uint8_t data, bool &romov, int &exrm, bool &raminh)
{
if (m_card != nullptr)
{
- data = m_card->mreq_r(space, offset, data, romov, exrm, raminh);
+ data = m_card->mreq_r(offset, data, romov, exrm, raminh);
}
return data;
@@ -92,11 +92,11 @@ uint8_t newbrain_expansion_slot_device::mreq_r(address_space &space, offs_t offs
// mreq_w - memory request write
//-------------------------------------------------
-void newbrain_expansion_slot_device::mreq_w(address_space &space, offs_t offset, uint8_t data, bool &romov, int &exrm, bool &raminh)
+void newbrain_expansion_slot_device::mreq_w(offs_t offset, uint8_t data, bool &romov, int &exrm, bool &raminh)
{
if (m_card != nullptr)
{
- m_card->mreq_w(space, offset, data, romov, exrm, raminh);
+ m_card->mreq_w(offset, data, romov, exrm, raminh);
}
}
@@ -105,11 +105,11 @@ void newbrain_expansion_slot_device::mreq_w(address_space &space, offs_t offset,
// iorq_r - I/O request read
//-------------------------------------------------
-uint8_t newbrain_expansion_slot_device::iorq_r(address_space &space, offs_t offset, uint8_t data, bool &prtov)
+uint8_t newbrain_expansion_slot_device::iorq_r(offs_t offset, uint8_t data, bool &prtov)
{
if (m_card != nullptr)
{
- data = m_card->iorq_r(space, offset, data, prtov);
+ data = m_card->iorq_r(offset, data, prtov);
}
return data;
@@ -120,11 +120,11 @@ uint8_t newbrain_expansion_slot_device::iorq_r(address_space &space, offs_t offs
// iorq_w - I/O request write
//-------------------------------------------------
-void newbrain_expansion_slot_device::iorq_w(address_space &space, offs_t offset, uint8_t data, bool &prtov)
+void newbrain_expansion_slot_device::iorq_w(offs_t offset, uint8_t data, bool &prtov)
{
if (m_card != nullptr)
{
- m_card->iorq_w(space, offset, data, prtov);
+ m_card->iorq_w(offset, data, prtov);
}
}
diff --git a/src/devices/bus/newbrain/exp.h b/src/devices/bus/newbrain/exp.h
index e3ab89a35ef..e9e56c1bd66 100644
--- a/src/devices/bus/newbrain/exp.h
+++ b/src/devices/bus/newbrain/exp.h
@@ -49,17 +49,6 @@
#define NEWBRAIN_EXPANSION_SLOT_TAG "exp"
-
-//**************************************************************************
-// INTERFACE CONFIGURATION MACROS
-//**************************************************************************
-
-#define MCFG_NEWBRAIN_EXPANSION_SLOT_ADD(_tag, _clock, _slot_intf, _def_slot) \
- MCFG_DEVICE_ADD(_tag, NEWBRAIN_EXPANSION_SLOT, _clock) \
- MCFG_DEVICE_SLOT_INTERFACE(_slot_intf, _def_slot, false)
-
-
-
//**************************************************************************
// TYPE DEFINITIONS
//**************************************************************************
@@ -73,14 +62,24 @@ class newbrain_expansion_slot_device : public device_t,
{
public:
// construction/destruction
+ template <typename T>
+ newbrain_expansion_slot_device(machine_config const &mconfig, char const *tag, device_t *owner, uint32_t clock, T &&opts, char const *dflt)
+ : newbrain_expansion_slot_device(mconfig, tag, owner, clock)
+ {
+ option_reset();
+ opts(*this);
+ set_default_option(dflt);
+ set_fixed(false);
+ }
+
newbrain_expansion_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
// computer interface
- uint8_t mreq_r(address_space &space, offs_t offset, uint8_t data, bool &romov, int &exrm, bool &raminh);
- void mreq_w(address_space &space, offs_t offset, uint8_t data, bool &romov, int &exrm, bool &raminh);
+ uint8_t mreq_r(offs_t offset, uint8_t data, bool &romov, int &exrm, bool &raminh);
+ void mreq_w(offs_t offset, uint8_t data, bool &romov, int &exrm, bool &raminh);
- uint8_t iorq_r(address_space &space, offs_t offset, uint8_t data, bool &prtov);
- void iorq_w(address_space &space, offs_t offset, uint8_t data, bool &prtov);
+ uint8_t iorq_r(offs_t offset, uint8_t data, bool &prtov);
+ void iorq_w(offs_t offset, uint8_t data, bool &prtov);
protected:
// device-level overrides
@@ -98,12 +97,12 @@ class device_newbrain_expansion_slot_interface : public device_slot_card_interfa
{
public:
// memory access
- virtual uint8_t mreq_r(address_space &space, offs_t offset, uint8_t data, bool &romov, int &exrm, bool &raminh) { return data; }
- virtual void mreq_w(address_space &space, offs_t offset, uint8_t data, bool &romov, int &exrm, bool &raminh) { }
+ virtual uint8_t mreq_r(offs_t offset, uint8_t data, bool &romov, int &exrm, bool &raminh) { return data; }
+ virtual void mreq_w(offs_t offset, uint8_t data, bool &romov, int &exrm, bool &raminh) { }
// I/O access
- virtual uint8_t iorq_r(address_space &space, offs_t offset, uint8_t data, bool &prtov) { return data; }
- virtual void iorq_w(address_space &space, offs_t offset, uint8_t data, bool &prtov) { }
+ virtual uint8_t iorq_r(offs_t offset, uint8_t data, bool &prtov) { return data; }
+ virtual void iorq_w(offs_t offset, uint8_t data, bool &prtov) { }
protected:
// construction/destruction
diff --git a/src/devices/bus/newbrain/fdc.cpp b/src/devices/bus/newbrain/fdc.cpp
index 597def0509b..7cadbd0bddd 100644
--- a/src/devices/bus/newbrain/fdc.cpp
+++ b/src/devices/bus/newbrain/fdc.cpp
@@ -104,21 +104,22 @@ static void newbrain_floppies(device_slot_interface &device)
// device_add_mconfig - add device configuration
//-------------------------------------------------
-MACHINE_CONFIG_START(newbrain_fdc_device::device_add_mconfig)
- MCFG_DEVICE_ADD(Z80_TAG, Z80, XTAL(4'000'000))
- MCFG_DEVICE_PROGRAM_MAP(newbrain_fdc_mem)
- MCFG_DEVICE_IO_MAP(newbrain_fdc_io)
+void newbrain_fdc_device::device_add_mconfig(machine_config &config)
+{
+ Z80(config, m_maincpu, XTAL(4'000'000));
+ m_maincpu->set_addrmap(AS_PROGRAM, &newbrain_fdc_device::newbrain_fdc_mem);
+ m_maincpu->set_addrmap(AS_IO, &newbrain_fdc_device::newbrain_fdc_io);
UPD765A(config, m_fdc, 8'000'000, false, true);
m_fdc->intrq_wr_callback().set(FUNC(newbrain_fdc_device::fdc_int_w));
- MCFG_FLOPPY_DRIVE_ADD(UPD765_TAG ":0", newbrain_floppies, "525dd", floppy_image_device::default_floppy_formats)
- MCFG_FLOPPY_DRIVE_ADD(UPD765_TAG ":1", newbrain_floppies, "525dd", floppy_image_device::default_floppy_formats)
- MCFG_FLOPPY_DRIVE_ADD(UPD765_TAG ":2", newbrain_floppies, nullptr, floppy_image_device::default_floppy_formats)
- MCFG_FLOPPY_DRIVE_ADD(UPD765_TAG ":3", newbrain_floppies, nullptr, floppy_image_device::default_floppy_formats)
+ FLOPPY_CONNECTOR(config, UPD765_TAG ":0", newbrain_floppies, "525dd", floppy_image_device::default_floppy_formats);
+ FLOPPY_CONNECTOR(config, UPD765_TAG ":1", newbrain_floppies, "525dd", floppy_image_device::default_floppy_formats);
+ FLOPPY_CONNECTOR(config, UPD765_TAG ":2", newbrain_floppies, nullptr, floppy_image_device::default_floppy_formats);
+ FLOPPY_CONNECTOR(config, UPD765_TAG ":3", newbrain_floppies, nullptr, floppy_image_device::default_floppy_formats);
- MCFG_NEWBRAIN_EXPANSION_SLOT_ADD(NEWBRAIN_EXPANSION_SLOT_TAG, XTAL(16'000'000)/8, newbrain_expansion_cards, nullptr)
-MACHINE_CONFIG_END
+ NEWBRAIN_EXPANSION_SLOT(config, m_exp, XTAL(16'000'000)/8, newbrain_expansion_cards, nullptr);
+}
//**************************************************************************
@@ -176,9 +177,9 @@ void newbrain_fdc_device::device_reset()
// mreq_r - memory request read
//-------------------------------------------------
-uint8_t newbrain_fdc_device::mreq_r(address_space &space, offs_t offset, uint8_t data, bool &romov, int &exrm, bool &raminh)
+uint8_t newbrain_fdc_device::mreq_r(offs_t offset, uint8_t data, bool &romov, int &exrm, bool &raminh)
{
- return m_exp->mreq_r(space, offset, data, romov, exrm, raminh);
+ return m_exp->mreq_r(offset, data, romov, exrm, raminh);
}
@@ -186,9 +187,9 @@ uint8_t newbrain_fdc_device::mreq_r(address_space &space, offs_t offset, uint8_t
// mreq_w - memory request write
//-------------------------------------------------
-void newbrain_fdc_device::mreq_w(address_space &space, offs_t offset, uint8_t data, bool &romov, int &exrm, bool &raminh)
+void newbrain_fdc_device::mreq_w(offs_t offset, uint8_t data, bool &romov, int &exrm, bool &raminh)
{
- m_exp->mreq_w(space, offset, data, romov, exrm, raminh);
+ m_exp->mreq_w(offset, data, romov, exrm, raminh);
}
@@ -196,9 +197,9 @@ void newbrain_fdc_device::mreq_w(address_space &space, offs_t offset, uint8_t da
// iorq_r - I/O request read
//-------------------------------------------------
-uint8_t newbrain_fdc_device::iorq_r(address_space &space, offs_t offset, uint8_t data, bool &prtov)
+uint8_t newbrain_fdc_device::iorq_r(offs_t offset, uint8_t data, bool &prtov)
{
- return m_exp->iorq_r(space, offset, data, prtov);
+ return m_exp->iorq_r(offset, data, prtov);
}
@@ -206,13 +207,13 @@ uint8_t newbrain_fdc_device::iorq_r(address_space &space, offs_t offset, uint8_t
// iorq_w - I/O request write
//-------------------------------------------------
-void newbrain_fdc_device::iorq_w(address_space &space, offs_t offset, uint8_t data, bool &prtov)
+void newbrain_fdc_device::iorq_w(offs_t offset, uint8_t data, bool &prtov)
{
- m_exp->iorq_w(space, offset, data, prtov);
+ m_exp->iorq_w(offset, data, prtov);
if ((offset & 0x20f) == 0x20f)
{
- io_dec_w(space, 0, data);
+ io_dec_w(data);
}
}
@@ -244,7 +245,7 @@ WRITE_LINE_MEMBER( newbrain_fdc_device::fdc_int_w )
// fdc_auxiliary_w -
//-------------------------------------------------
-WRITE8_MEMBER( newbrain_fdc_device::fdc_auxiliary_w )
+void newbrain_fdc_device::fdc_auxiliary_w(uint8_t data)
{
/*
@@ -278,7 +279,7 @@ WRITE8_MEMBER( newbrain_fdc_device::fdc_auxiliary_w )
// fdc_control_r -
//-------------------------------------------------
-READ8_MEMBER( newbrain_fdc_device::fdc_control_r )
+uint8_t newbrain_fdc_device::fdc_control_r()
{
/*
@@ -303,7 +304,7 @@ READ8_MEMBER( newbrain_fdc_device::fdc_control_r )
// io_dec_w - 0x20f
//-------------------------------------------------
-WRITE8_MEMBER( newbrain_fdc_device::io_dec_w )
+void newbrain_fdc_device::io_dec_w(uint8_t data)
{
/*
diff --git a/src/devices/bus/newbrain/fdc.h b/src/devices/bus/newbrain/fdc.h
index e5a40ae0748..e5d6665a078 100644
--- a/src/devices/bus/newbrain/fdc.h
+++ b/src/devices/bus/newbrain/fdc.h
@@ -40,17 +40,17 @@ protected:
virtual void device_add_mconfig(machine_config &config) override;
// device_newbrain_expansion_slot_interface overrides
- virtual uint8_t mreq_r(address_space &space, offs_t offset, uint8_t data, bool &romov, int &exrm, bool &raminh) override;
- virtual void mreq_w(address_space &space, offs_t offset, uint8_t data, bool &romov, int &exrm, bool &raminh) override;
- virtual uint8_t iorq_r(address_space &space, offs_t offset, uint8_t data, bool &prtov) override;
- virtual void iorq_w(address_space &space, offs_t offset, uint8_t data, bool &prtov) override;
+ virtual uint8_t mreq_r(offs_t offset, uint8_t data, bool &romov, int &exrm, bool &raminh) override;
+ virtual void mreq_w(offs_t offset, uint8_t data, bool &romov, int &exrm, bool &raminh) override;
+ virtual uint8_t iorq_r(offs_t offset, uint8_t data, bool &prtov) override;
+ virtual void iorq_w(offs_t offset, uint8_t data, bool &prtov) override;
private:
DECLARE_WRITE_LINE_MEMBER( fdc_int_w );
- DECLARE_WRITE8_MEMBER( fdc_auxiliary_w );
- DECLARE_READ8_MEMBER( fdc_control_r );
- DECLARE_WRITE8_MEMBER( io_dec_w );
+ void fdc_auxiliary_w(uint8_t data);
+ uint8_t fdc_control_r();
+ void io_dec_w(uint8_t data);
void newbrain_fdc_io(address_map &map);
void newbrain_fdc_mem(address_map &map);
diff --git a/src/devices/bus/nubus/nubus.cpp b/src/devices/bus/nubus/nubus.cpp
index b0fc2a4667d..dc7db80a2ef 100644
--- a/src/devices/bus/nubus/nubus.cpp
+++ b/src/devices/bus/nubus/nubus.cpp
@@ -70,23 +70,24 @@ nubus_device::nubus_device(const machine_config &mconfig, const char *tag, devic
nubus_device::nubus_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock) :
device_t(mconfig, type, tag, owner, clock),
- m_maincpu(nullptr),
+ m_space(*this, finder_base::DUMMY_TAG, -1),
m_out_irq9_cb(*this),
m_out_irqa_cb(*this),
m_out_irqb_cb(*this),
m_out_irqc_cb(*this),
m_out_irqd_cb(*this),
- m_out_irqe_cb(*this),
- m_cputag(nullptr)
+ m_out_irqe_cb(*this)
{
}
+
//-------------------------------------------------
-// device_start - device-specific startup
+// device_resolve_objects - resolve objects that
+// may be needed for other devices to set
+// initial conditions at start time
//-------------------------------------------------
-void nubus_device::device_start()
+void nubus_device::device_resolve_objects()
{
- m_maincpu = machine().device<cpu_device>(m_cputag);
// resolve callbacks
m_out_irq9_cb.resolve_safe();
m_out_irqa_cb.resolve_safe();
@@ -97,10 +98,10 @@ void nubus_device::device_start()
}
//-------------------------------------------------
-// device_reset - device-specific reset
+// device_start - device-specific startup
//-------------------------------------------------
-void nubus_device::device_reset()
+void nubus_device::device_start()
{
}
@@ -111,15 +112,14 @@ void nubus_device::add_nubus_card(device_nubus_card_interface *card)
void nubus_device::install_device(offs_t start, offs_t end, read8_delegate rhandler, write8_delegate whandler, uint32_t mask)
{
- m_maincpu = machine().device<cpu_device>(m_cputag);
- int buswidth = m_maincpu->space_config(AS_PROGRAM)->data_width();
+ int buswidth = m_space->data_width();
switch(buswidth)
{
case 32:
- m_maincpu->space(AS_PROGRAM).install_readwrite_handler(start, end, rhandler, whandler, mask);
+ m_space->install_readwrite_handler(start, end, rhandler, whandler, mask);
break;
case 64:
- m_maincpu->space(AS_PROGRAM).install_readwrite_handler(start, end, rhandler, whandler, ((uint64_t)mask<<32)|mask);
+ m_space->install_readwrite_handler(start, end, rhandler, whandler, ((uint64_t)mask<<32)|mask);
break;
default:
fatalerror("NUBUS: Bus width %d not supported\n", buswidth);
@@ -128,15 +128,14 @@ void nubus_device::install_device(offs_t start, offs_t end, read8_delegate rhand
void nubus_device::install_device(offs_t start, offs_t end, read16_delegate rhandler, write16_delegate whandler, uint32_t mask)
{
- m_maincpu = machine().device<cpu_device>(m_cputag);
- int buswidth = m_maincpu->space_config(AS_PROGRAM)->data_width();
+ int buswidth = m_space->data_width();
switch(buswidth)
{
case 32:
- m_maincpu->space(AS_PROGRAM).install_readwrite_handler(start, end, rhandler, whandler, mask);
+ m_space->install_readwrite_handler(start, end, rhandler, whandler, mask);
break;
case 64:
- m_maincpu->space(AS_PROGRAM).install_readwrite_handler(start, end, rhandler, whandler, ((uint64_t)mask<<32)|mask);
+ m_space->install_readwrite_handler(start, end, rhandler, whandler, ((uint64_t)mask<<32)|mask);
break;
default:
fatalerror("NUBUS: Bus width %d not supported\n", buswidth);
@@ -145,15 +144,14 @@ void nubus_device::install_device(offs_t start, offs_t end, read16_delegate rhan
void nubus_device::install_device(offs_t start, offs_t end, read32_delegate rhandler, write32_delegate whandler, uint32_t mask)
{
- m_maincpu = machine().device<cpu_device>(m_cputag);
- int buswidth = m_maincpu->space_config(AS_PROGRAM)->data_width();
+ int buswidth = m_space->data_width();
switch(buswidth)
{
case 32:
- m_maincpu->space(AS_PROGRAM).install_readwrite_handler(start, end, rhandler, whandler, mask);
+ m_space->install_readwrite_handler(start, end, rhandler, whandler, mask);
break;
case 64:
- m_maincpu->space(AS_PROGRAM).install_readwrite_handler(start, end, rhandler, whandler, ((uint64_t)mask<<32)|mask);
+ m_space->install_readwrite_handler(start, end, rhandler, whandler, ((uint64_t)mask<<32)|mask);
break;
default:
fatalerror("NUBUS: Bus width %d not supported\n", buswidth);
@@ -162,15 +160,14 @@ void nubus_device::install_device(offs_t start, offs_t end, read32_delegate rhan
void nubus_device::install_readonly_device(offs_t start, offs_t end, read32_delegate rhandler, uint32_t mask)
{
- m_maincpu = machine().device<cpu_device>(m_cputag);
- int buswidth = m_maincpu->space_config(AS_PROGRAM)->data_width();
+ int buswidth = m_space->data_width();
switch(buswidth)
{
case 32:
- m_maincpu->space(AS_PROGRAM).install_read_handler(start, end, rhandler, mask);
+ m_space->install_read_handler(start, end, rhandler, mask);
break;
case 64:
- m_maincpu->space(AS_PROGRAM).install_read_handler(start, end, rhandler, ((uint64_t)mask<<32)|mask);
+ m_space->install_read_handler(start, end, rhandler, ((uint64_t)mask<<32)|mask);
break;
default:
fatalerror("NUBUS: Bus width %d not supported\n", buswidth);
@@ -179,15 +176,14 @@ void nubus_device::install_readonly_device(offs_t start, offs_t end, read32_dele
void nubus_device::install_writeonly_device(offs_t start, offs_t end, write32_delegate whandler, uint32_t mask)
{
- m_maincpu = machine().device<cpu_device>(m_cputag);
- int buswidth = m_maincpu->space_config(AS_PROGRAM)->data_width();
+ int buswidth = m_space->data_width();
switch(buswidth)
{
case 32:
- m_maincpu->space(AS_PROGRAM).install_write_handler(start, end, whandler, mask);
+ m_space->install_write_handler(start, end, whandler, mask);
break;
case 64:
- m_maincpu->space(AS_PROGRAM).install_write_handler(start, end, whandler, ((uint64_t)mask<<32)|mask);
+ m_space->install_write_handler(start, end, whandler, ((uint64_t)mask<<32)|mask);
break;
default:
fatalerror("NUBUS: Bus width %d not supported\n", buswidth);
@@ -197,9 +193,7 @@ void nubus_device::install_writeonly_device(offs_t start, offs_t end, write32_de
void nubus_device::install_bank(offs_t start, offs_t end, const char *tag, uint8_t *data)
{
// printf("install_bank: %s @ %x->%x\n", tag, start, end);
- m_maincpu = machine().device<cpu_device>(m_cputag);
- address_space &space = m_maincpu->space(AS_PROGRAM);
- space.install_readwrite_bank(start, end, 0, tag );
+ m_space->install_readwrite_bank(start, end, 0, tag);
machine().root_device().membank(siblingtag(tag).c_str())->set_base(data);
}
diff --git a/src/devices/bus/nubus/nubus.h b/src/devices/bus/nubus/nubus.h
index 919f989ebfb..a1b9496fcf8 100644
--- a/src/devices/bus/nubus/nubus.h
+++ b/src/devices/bus/nubus/nubus.h
@@ -14,44 +14,6 @@
#pragma once
-
-//**************************************************************************
-// INTERFACE CONFIGURATION MACROS
-//**************************************************************************
-
-#define MCFG_NUBUS_CPU(_cputag) \
- downcast<nubus_device &>(*device).set_cputag(_cputag);
-
-#define MCFG_NUBUS_OUT_IRQ9_CB(_devcb) \
- downcast<nubus_device &>(*device).set_out_irq9_callback(DEVCB_##_devcb);
-
-#define MCFG_NUBUS_OUT_IRQA_CB(_devcb) \
- downcast<nubus_device &>(*device).set_out_irqa_callback(DEVCB_##_devcb);
-
-#define MCFG_NUBUS_OUT_IRQB_CB(_devcb) \
- downcast<nubus_device &>(*device).set_out_irqb_callback(DEVCB_##_devcb);
-
-#define MCFG_NUBUS_OUT_IRQC_CB(_devcb) \
- downcast<nubus_device &>(*device).set_out_irqc_callback(DEVCB_##_devcb);
-
-#define MCFG_NUBUS_OUT_IRQD_CB(_devcb) \
- downcast<nubus_device &>(*device).set_out_irqd_callback(DEVCB_##_devcb);
-
-#define MCFG_NUBUS_OUT_IRQE_CB(_devcb) \
- downcast<nubus_device &>(*device).set_out_irqe_callback(DEVCB_##_devcb);
-
-#define MCFG_NUBUS_SLOT_ADD(_nbtag, _tag, _slot_intf, _def_slot) \
- MCFG_DEVICE_ADD(_tag, NUBUS_SLOT, 0) \
- MCFG_DEVICE_SLOT_INTERFACE(_slot_intf, _def_slot, false) \
- downcast<nubus_slot_device &>(*device).set_nubus_slot(_nbtag, _tag);
-#define MCFG_NUBUS_SLOT_REMOVE(_tag) \
- MCFG_DEVICE_REMOVE(_tag)
-
-#define MCFG_NUBUS_ONBOARD_ADD(_nbtag, _tag, _dev_type, _def_inp) \
- MCFG_DEVICE_ADD(_tag, _dev_type, 0) \
- MCFG_DEVICE_INPUT_DEFAULTS(_def_inp) \
- downcast<device_nubus_card_interface &>(*device).set_nubus_tag(_nbtag, _tag);
-
//**************************************************************************
// TYPE DEFINITIONS
//**************************************************************************
@@ -100,13 +62,7 @@ public:
~nubus_device() { m_device_list.detach_all(); }
// inline configuration
- void set_cputag(const char *tag) { m_cputag = tag; }
- template <class Object> devcb_base &set_out_irq9_callback(Object &&cb) { return m_out_irq9_cb.set_callback(std::forward<Object>(cb)); }
- template <class Object> devcb_base &set_out_irqa_callback(Object &&cb) { return m_out_irqa_cb.set_callback(std::forward<Object>(cb)); }
- template <class Object> devcb_base &set_out_irqb_callback(Object &&cb) { return m_out_irqb_cb.set_callback(std::forward<Object>(cb)); }
- template <class Object> devcb_base &set_out_irqc_callback(Object &&cb) { return m_out_irqc_cb.set_callback(std::forward<Object>(cb)); }
- template <class Object> devcb_base &set_out_irqd_callback(Object &&cb) { return m_out_irqd_cb.set_callback(std::forward<Object>(cb)); }
- template <class Object> devcb_base &set_out_irqe_callback(Object &&cb) { return m_out_irqe_cb.set_callback(std::forward<Object>(cb)); }
+ template <typename T> void set_space(T &&tag, int spacenum) { m_space.set_tag(std::forward<T>(tag), spacenum); }
auto out_irq9_callback() { return m_out_irq9_cb.bind(); }
auto out_irqa_callback() { return m_out_irqa_cb.bind(); }
auto out_irqb_callback() { return m_out_irqb_cb.bind(); }
@@ -134,11 +90,11 @@ protected:
nubus_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock);
// device-level overrides
+ virtual void device_resolve_objects() override;
virtual void device_start() override;
- virtual void device_reset() override;
// internal state
- cpu_device *m_maincpu;
+ required_address_space m_space;
devcb_write_line m_out_irq9_cb;
devcb_write_line m_out_irqa_cb;
@@ -148,7 +104,6 @@ protected:
devcb_write_line m_out_irqe_cb;
simple_list<device_nubus_card_interface> m_device_list;
- const char *m_cputag;
};
diff --git a/src/devices/bus/nubus/nubus_48gc.cpp b/src/devices/bus/nubus/nubus_48gc.cpp
index e089e1986db..86f4fca21ec 100644
--- a/src/devices/bus/nubus/nubus_48gc.cpp
+++ b/src/devices/bus/nubus/nubus_48gc.cpp
@@ -39,15 +39,16 @@ DEFINE_DEVICE_TYPE(NUBUS_824GC, nubus_824gc_device, "nb_824gc", "Apple 8*24 vide
// device_add_mconfig - add device configuration
//-------------------------------------------------
-MACHINE_CONFIG_START(jmfb_device::device_add_mconfig)
- MCFG_SCREEN_ADD(GC48_SCREEN_NAME, RASTER)
- MCFG_SCREEN_UPDATE_DEVICE(DEVICE_SELF, jmfb_device, screen_update)
- MCFG_SCREEN_RAW_PARAMS(25175000, 800, 0, 640, 525, 0, 480)
-// MCFG_SCREEN_SIZE(1152, 870)
-// MCFG_SCREEN_VISIBLE_AREA(0, 1152-1, 0, 870-1)
-// MCFG_SCREEN_REFRESH_RATE(75)
-// MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(1260))
-MACHINE_CONFIG_END
+void jmfb_device::device_add_mconfig(machine_config &config)
+{
+ screen_device &screen(SCREEN(config, GC48_SCREEN_NAME, SCREEN_TYPE_RASTER));
+ screen.set_screen_update(FUNC(jmfb_device::screen_update));
+ screen.set_raw(25175000, 800, 0, 640, 525, 0, 480);
+// screen.set_size(1152, 870);
+// screen.set_visarea(0, 1152-1, 0, 870-1);
+// screen.set_refresh_hz(75);
+// screen.set_vblank_time(ATTOSECONDS_IN_USEC(1260));
+}
//-------------------------------------------------
// rom_region - device-specific ROM region
diff --git a/src/devices/bus/nubus/nubus_asntmc3b.cpp b/src/devices/bus/nubus/nubus_asntmc3b.cpp
index 46f9d382eb8..f6c0135af5f 100644
--- a/src/devices/bus/nubus/nubus_asntmc3b.cpp
+++ b/src/devices/bus/nubus/nubus_asntmc3b.cpp
@@ -41,12 +41,13 @@ DEFINE_DEVICE_TYPE(NUBUS_APPLEENET, nubus_appleenet_device, "nb_aenet", "Apple N
// device_add_mconfig - add device configuration
//-------------------------------------------------
-MACHINE_CONFIG_START(nubus_mac8390_device::device_add_mconfig)
- MCFG_DEVICE_ADD(MAC8390_839X, DP8390D, 0)
- MCFG_DP8390D_IRQ_CB(WRITELINE(*this, nubus_mac8390_device, dp_irq_w))
- MCFG_DP8390D_MEM_READ_CB(READ8(*this, nubus_mac8390_device, dp_mem_read))
- MCFG_DP8390D_MEM_WRITE_CB(WRITE8(*this, nubus_mac8390_device, dp_mem_write))
-MACHINE_CONFIG_END
+void nubus_mac8390_device::device_add_mconfig(machine_config &config)
+{
+ DP8390D(config, m_dp83902, 0);
+ m_dp83902->irq_callback().set(FUNC(nubus_mac8390_device::dp_irq_w));
+ m_dp83902->mem_read_callback().set(FUNC(nubus_mac8390_device::dp_mem_read));
+ m_dp83902->mem_write_callback().set(FUNC(nubus_mac8390_device::dp_mem_write));
+}
//-------------------------------------------------
// rom_region - device-specific ROM region
diff --git a/src/devices/bus/nubus/nubus_cb264.cpp b/src/devices/bus/nubus/nubus_cb264.cpp
index 9efb5e6d088..01bff0877da 100644
--- a/src/devices/bus/nubus/nubus_cb264.cpp
+++ b/src/devices/bus/nubus/nubus_cb264.cpp
@@ -40,13 +40,14 @@ DEFINE_DEVICE_TYPE(NUBUS_CB264, nubus_cb264_device, "nb_c264", "RasterOps ColorB
// device_add_mconfig - add device configuration
//-------------------------------------------------
-MACHINE_CONFIG_START(nubus_cb264_device::device_add_mconfig)
- MCFG_SCREEN_ADD( CB264_SCREEN_NAME, RASTER)
- MCFG_SCREEN_UPDATE_DEVICE(DEVICE_SELF, nubus_cb264_device, screen_update)
- MCFG_SCREEN_RAW_PARAMS(25175000, 800, 0, 640, 525, 0, 480)
- MCFG_SCREEN_SIZE(1024,768)
- MCFG_SCREEN_VISIBLE_AREA(0, 640-1, 0, 480-1)
-MACHINE_CONFIG_END
+void nubus_cb264_device::device_add_mconfig(machine_config &config)
+{
+ screen_device &screen(SCREEN(config, CB264_SCREEN_NAME, SCREEN_TYPE_RASTER));
+ screen.set_screen_update(FUNC(nubus_cb264_device::screen_update));
+ screen.set_raw(25175000, 800, 0, 640, 525, 0, 480);
+ screen.set_size(1024, 768);
+ screen.set_visarea(0, 640-1, 0, 480-1);
+}
//-------------------------------------------------
// rom_region - device-specific ROM region
diff --git a/src/devices/bus/nubus/nubus_image.cpp b/src/devices/bus/nubus/nubus_image.cpp
index 1618bda4da7..8e2d39fb943 100644
--- a/src/devices/bus/nubus/nubus_image.cpp
+++ b/src/devices/bus/nubus/nubus_image.cpp
@@ -130,9 +130,10 @@ DEFINE_DEVICE_TYPE(NUBUS_IMAGE, nubus_image_device, "nb_image", "NuBus Disk Imag
// device_add_mconfig - add device configuration
//-------------------------------------------------
-MACHINE_CONFIG_START(nubus_image_device::device_add_mconfig)
- MCFG_DEVICE_ADD(IMAGE_DISK0_TAG, MESSIMG_DISK, 0)
-MACHINE_CONFIG_END
+void nubus_image_device::device_add_mconfig(machine_config &config)
+{
+ MESSIMG_DISK(config, IMAGE_DISK0_TAG, 0);
+}
//-------------------------------------------------
// rom_region - device-specific ROM region
diff --git a/src/devices/bus/nubus/nubus_m2hires.cpp b/src/devices/bus/nubus/nubus_m2hires.cpp
index 6ac472eeb5b..c575f7d94b1 100644
--- a/src/devices/bus/nubus/nubus_m2hires.cpp
+++ b/src/devices/bus/nubus/nubus_m2hires.cpp
@@ -36,13 +36,14 @@ DEFINE_DEVICE_TYPE(NUBUS_M2HIRES, nubus_m2hires_device, "nb_m2hr", "Macintosh II
// device_add_mconfig - add device configuration
//-------------------------------------------------
-MACHINE_CONFIG_START(nubus_m2hires_device::device_add_mconfig)
- MCFG_SCREEN_ADD( M2HIRES_SCREEN_NAME, RASTER)
- MCFG_SCREEN_UPDATE_DEVICE(DEVICE_SELF, nubus_m2hires_device, screen_update)
- MCFG_SCREEN_RAW_PARAMS(25175000, 800, 0, 640, 525, 0, 480)
- MCFG_SCREEN_SIZE(1024,768)
- MCFG_SCREEN_VISIBLE_AREA(0, 640-1, 0, 480-1)
-MACHINE_CONFIG_END
+void nubus_m2hires_device::device_add_mconfig(machine_config &config)
+{
+ screen_device &screen(SCREEN(config, M2HIRES_SCREEN_NAME, SCREEN_TYPE_RASTER));
+ screen.set_screen_update(FUNC(nubus_m2hires_device::screen_update));
+ screen.set_raw(25175000, 800, 0, 640, 525, 0, 480);
+ screen.set_size(1024, 768);
+ screen.set_visarea(0, 640-1, 0, 480-1);
+}
//-------------------------------------------------
// rom_region - device-specific ROM region
diff --git a/src/devices/bus/nubus/nubus_m2video.cpp b/src/devices/bus/nubus/nubus_m2video.cpp
index d7eea8cf22e..b16391b640d 100644
--- a/src/devices/bus/nubus/nubus_m2video.cpp
+++ b/src/devices/bus/nubus/nubus_m2video.cpp
@@ -38,13 +38,14 @@ DEFINE_DEVICE_TYPE(NUBUS_M2VIDEO, nubus_m2video_device, "nb_m2vc", "Macintosh II
// device_add_mconfig - add device configuration
//-------------------------------------------------
-MACHINE_CONFIG_START(nubus_m2video_device::device_add_mconfig)
- MCFG_SCREEN_ADD(M2VIDEO_SCREEN_NAME, RASTER)
- MCFG_SCREEN_UPDATE_DEVICE(DEVICE_SELF, nubus_m2video_device, screen_update)
- MCFG_SCREEN_RAW_PARAMS(25175000, 800, 0, 640, 525, 0, 480)
- MCFG_SCREEN_SIZE(1024,768)
- MCFG_SCREEN_VISIBLE_AREA(0, 640-1, 0, 480-1)
-MACHINE_CONFIG_END
+void nubus_m2video_device::device_add_mconfig(machine_config &config)
+{
+ screen_device &screen(SCREEN(config, M2VIDEO_SCREEN_NAME, SCREEN_TYPE_RASTER));
+ screen.set_screen_update(FUNC(nubus_m2video_device::screen_update));
+ screen.set_raw(25175000, 800, 0, 640, 525, 0, 480);
+ screen.set_size(1024, 768);
+ screen.set_visarea(0, 640-1, 0, 480-1);
+}
//-------------------------------------------------
// rom_region - device-specific ROM region
diff --git a/src/devices/bus/nubus/nubus_radiustpd.cpp b/src/devices/bus/nubus/nubus_radiustpd.cpp
index 98a3ab3e514..1ee2e0cb7fb 100644
--- a/src/devices/bus/nubus/nubus_radiustpd.cpp
+++ b/src/devices/bus/nubus/nubus_radiustpd.cpp
@@ -37,13 +37,12 @@ DEFINE_DEVICE_TYPE(NUBUS_RADIUSTPD, nubus_radiustpd_device, "nb_rtpd", "Radius T
// device_add_mconfig - add device configuration
//-------------------------------------------------
-MACHINE_CONFIG_START(nubus_radiustpd_device::device_add_mconfig)
- MCFG_SCREEN_ADD( RADIUSTPD_SCREEN_NAME, RASTER)
- MCFG_SCREEN_UPDATE_DEVICE(DEVICE_SELF, nubus_radiustpd_device, screen_update)
- MCFG_SCREEN_SIZE(1280, 960)
- MCFG_SCREEN_REFRESH_RATE(70)
- MCFG_SCREEN_VISIBLE_AREA(0, 1152-1, 0, 880-1)
-MACHINE_CONFIG_END
+void nubus_radiustpd_device::device_add_mconfig(machine_config &config)
+{
+ screen_device &screen(SCREEN(config, RADIUSTPD_SCREEN_NAME, SCREEN_TYPE_RASTER));
+ screen.set_screen_update(FUNC(nubus_radiustpd_device::screen_update));
+ screen.set_raw(99.522_MHz_XTAL, 1536, 0, 1152, 900, 0, 880); // 64.79 kHz horizontal, 72 Hz refresh
+}
//-------------------------------------------------
// rom_region - device-specific ROM region
diff --git a/src/devices/bus/nubus/nubus_spec8.cpp b/src/devices/bus/nubus/nubus_spec8.cpp
index d3d45d9b076..1353d3b9a9d 100644
--- a/src/devices/bus/nubus/nubus_spec8.cpp
+++ b/src/devices/bus/nubus/nubus_spec8.cpp
@@ -40,13 +40,14 @@ DEFINE_DEVICE_TYPE(NUBUS_SPEC8S3, nubus_spec8s3_device, "nb_sp8s3", "SuperMac Sp
// device_add_mconfig - add device configuration
//-------------------------------------------------
-MACHINE_CONFIG_START(nubus_spec8s3_device::device_add_mconfig)
- MCFG_SCREEN_ADD( SPEC8S3_SCREEN_NAME, RASTER)
- MCFG_SCREEN_UPDATE_DEVICE(DEVICE_SELF, nubus_spec8s3_device, screen_update)
- MCFG_SCREEN_RAW_PARAMS(25175000, 800, 0, 640, 525, 0, 480)
- MCFG_SCREEN_SIZE(1024,768)
- MCFG_SCREEN_VISIBLE_AREA(0, 1024-1, 0, 768-1)
-MACHINE_CONFIG_END
+void nubus_spec8s3_device::device_add_mconfig(machine_config &config)
+{
+ screen_device &screen(SCREEN(config, SPEC8S3_SCREEN_NAME, SCREEN_TYPE_RASTER));
+ screen.set_screen_update(FUNC(nubus_spec8s3_device::screen_update));
+ screen.set_raw(25175000, 800, 0, 640, 525, 0, 480);
+ screen.set_size(1024, 768);
+ screen.set_visarea(0, 1024-1, 0, 768-1);
+}
//-------------------------------------------------
// rom_region - device-specific ROM region
diff --git a/src/devices/bus/nubus/nubus_specpdq.cpp b/src/devices/bus/nubus/nubus_specpdq.cpp
index d9e463e7fbf..2e09a258bd2 100644
--- a/src/devices/bus/nubus/nubus_specpdq.cpp
+++ b/src/devices/bus/nubus/nubus_specpdq.cpp
@@ -29,6 +29,9 @@
#include "nubus_specpdq.h"
#include "screen.h"
+//#define VERBOSE 1
+#include "logmacro.h"
+
#define SPECPDQ_SCREEN_NAME "specpdq_screen"
#define SPECPDQ_ROM_REGION "specpdq_rom"
@@ -51,15 +54,16 @@ DEFINE_DEVICE_TYPE(NUBUS_SPECPDQ, nubus_specpdq_device, "nb_spdq", "SuperMac Spe
// device_add_mconfig - add device configuration
//-------------------------------------------------
-MACHINE_CONFIG_START(nubus_specpdq_device::device_add_mconfig)
- MCFG_SCREEN_ADD( SPECPDQ_SCREEN_NAME, RASTER)
- MCFG_SCREEN_UPDATE_DEVICE(DEVICE_SELF, nubus_specpdq_device, screen_update)
- MCFG_SCREEN_RAW_PARAMS(25175000, 800, 0, 640, 525, 0, 480)
- MCFG_SCREEN_SIZE(1280,1024)
- MCFG_SCREEN_VISIBLE_AREA(0, 1152-1, 0, 844-1)
+void nubus_specpdq_device::device_add_mconfig(machine_config &config)
+{
+ screen_device &screen(SCREEN(config, SPECPDQ_SCREEN_NAME, SCREEN_TYPE_RASTER));
+ screen.set_screen_update(FUNC(nubus_specpdq_device::screen_update));
+ screen.set_raw(25175000, 800, 0, 640, 525, 0, 480);
+ screen.set_size(1280, 1024);
+ screen.set_visarea(0, 1152-1, 0, 844-1);
- MCFG_PALETTE_ADD("palette", 256)
-MACHINE_CONFIG_END
+ PALETTE(config, m_palette).set_entries(256);
+}
//-------------------------------------------------
// rom_region - device-specific ROM region
@@ -242,7 +246,7 @@ WRITE32_MEMBER( nubus_specpdq_device::specpdq_w )
switch (offset)
{
case 0xc0054: // mode 1
-// logerror("%x to mode1\n", data);
+ LOG("%x to mode1\n", data);
break;
case 0xc005c: // interrupt control
@@ -261,7 +265,7 @@ WRITE32_MEMBER( nubus_specpdq_device::specpdq_w )
break;
case 0xc007a:
-// logerror("%x to mode2\n", data);
+ LOG("%x to mode2\n", data);
switch (data)
{
@@ -278,11 +282,11 @@ WRITE32_MEMBER( nubus_specpdq_device::specpdq_w )
break;
}
-// logerror("m_mode = %d\n", m_mode);
+ LOG("m_mode = %d\n", m_mode);
break;
case 0x120000: // DAC address
-// logerror("%08x to DAC control %s\n", data,machine().describe_context());
+ LOG("%08x to DAC control %s\n", data,machine().describe_context());
m_clutoffs = ((data>>8)&0xff)^0xff;
break;
@@ -291,7 +295,7 @@ WRITE32_MEMBER( nubus_specpdq_device::specpdq_w )
if (m_count == 3)
{
-// logerror("RAMDAC: color %d = %02x %02x %02x %s\n", m_clutoffs, m_colors[0], m_colors[1], m_colors[2], machine().describe_context());
+ LOG("RAMDAC: color %d = %02x %02x %02x %s\n", m_clutoffs, m_colors[0], m_colors[1], m_colors[2], machine().describe_context());
m_palette->set_pen_color(m_clutoffs, rgb_t(m_colors[0], m_colors[1], m_colors[2]));
m_palette_val[m_clutoffs] = rgb_t(m_colors[0], m_colors[1], m_colors[2]);
m_clutoffs++;
@@ -368,7 +372,10 @@ WRITE32_MEMBER( nubus_specpdq_device::specpdq_w )
case 0x18103d:
case 0x18103e:
case 0x18103f:
-// logerror("Pattern %08x @ %x\n", data ^ 0xffffffff, offset);
+ if(offset == 0x181000) {
+ machine().debug_break();
+ LOG("Pattern %08x @ %x\n", data ^ 0xffffffff, offset);
+ }
m_fillbytes[((offset&0x3f)*4)] = ((data>>24) & 0xff) ^ 0xff;
m_fillbytes[((offset&0x3f)*4)+1] = ((data>>16) & 0xff) ^ 0xff;
m_fillbytes[((offset&0x3f)*4)+2] = ((data>>8) & 0xff) ^ 0xff;
@@ -377,81 +384,107 @@ WRITE32_MEMBER( nubus_specpdq_device::specpdq_w )
// blitter control
case 0x182006:
-// logerror("%08x (%d) to blitter ctrl 1 %s\n", data^0xffffffff, data^0xffffffff, machine().describe_context());
+ LOG("%08x (%d) to blitter ctrl 1 %s rectangle\n", data^0xffffffff, data^0xffffffff, machine().describe_context());
break;
case 0x182008:
-// logerror("%08x (%d) to blitter ctrl 2 %s\n", data^0xffffffff, data^0xffffffff, machine().describe_context());
+ LOG("%08x (%d) to blitter ctrl 2 %s rectangle\n", data^0xffffffff, data^0xffffffff, machine().describe_context());
m_patofsx = (data ^ 0xffffffff) & 7;
m_patofsy = ((data ^ 0xffffffff)>>3) & 7;
break;
case 0x18200e:
-// logerror("%08x (%d) to blitter ctrl 3 %s\n", data^0xffffffff, data^0xffffffff, machine().describe_context());
+ LOG("%08x (%d) to blitter ctrl 3 %s\n", data^0xffffffff, data^0xffffffff, machine().describe_context());
m_width = data ^ 0xffffffff;
break;
case 0x18200b:
-// logerror("%08x (%d) to blitter ctrl 4 %s\n", data^0xffffffff, data^0xffffffff, machine().describe_context());
+ LOG("%08x (%d) to blitter ctrl 4 %s\n", data^0xffffffff, data^0xffffffff, machine().describe_context());
m_height = (data ^ 0xffffffff) & 0xffff;
break;
case 0x18200a:
data ^= 0xffffffff;
-// logerror("%08x to blitter ctrl 5 %s\n", data, machine().describe_context());
+ LOG("%08x to blitter ctrl 5 %s\n", data, machine().describe_context());
m_vram_src = data>>2;
break;
case 0x182009:
data ^= 0xffffffff;
-// logerror("%08x to blitter ctrl 6 %s\n", data, machine().describe_context());
+ LOG("%08x to blitter ctrl 6 %s\n", data, machine().describe_context());
m_vram_addr = data>>2;
break;
case 0x182007:
data ^= 0xffffffff;
-// logerror("%08x to blitter ctrl 7 %s\n", data, machine().describe_context());
+ LOG("%08x to blitter ctrl 7 %s\n", data, machine().describe_context());
// fill rectangle
if (data == 2)
{
int x, y;
- uint8_t *vram = &m_vram[m_vram_addr + m_patofsx]; // m_vram_addr is missing the low 2 bits, we add them back here
+ uint8_t *vram = &m_vram[m_vram_addr & ~3];
-// logerror("Fill rectangle with %02x %02x %02x %02x, width %d height %d\n", m_fillbytes[0], m_fillbytes[1], m_fillbytes[2], m_fillbytes[3], m_width, m_height);
+ int ddx = m_vram_addr & 3;
- for (y = 0; y < m_height; y++)
+ LOG("Fill rectangle with %02x %02x %02x %02x, adr %x (%d, %d) width %d height %d delta %d %d\n", m_fillbytes[0], m_fillbytes[1], m_fillbytes[2], m_fillbytes[3], m_vram_addr, m_vram_addr % 1152, m_vram_addr / 1152, m_width, m_height, m_patofsx, m_patofsy);
+
+ for (y = 0; y <= m_height; y++)
{
- for (x = 0; x < m_width; x++)
+ for (x = 0; x <= m_width; x++)
+ {
+ vram[(y * 1152)+BYTE4_XOR_BE(x + ddx)] = m_fillbytes[((m_patofsx + x) & 0x1f)+(((m_patofsy + y) & 0x7) << 5)];
+ }
+ }
+ }
+ else if (data == 0x100)
+ {
+ int x, y;
+ uint8_t *vram = &m_vram[m_vram_addr & ~3];
+ uint8_t *vramsrc = &m_vram[m_vram_src & ~3];
+
+ int sdx = m_vram_src & 3;
+ int ddx = m_vram_addr & 3;
+
+ LOG("Copy rectangle forwards, width %d height %d dst %x (%d, %d) src %x (%d, %d)\n", m_width, m_height, m_vram_addr, m_vram_addr % 1152, m_vram_addr / 1152, m_vram_src, m_vram_src % 1152, m_vram_src / 1152);
+
+ for (y = 0; y <= m_height; y++)
+ {
+ for (x = 0; x <= m_width; x++)
{
- vram[(y * 1152)+x] = m_fillbytes[((m_patofsx + x) & 0x1f)+(((m_patofsy + y) & 0x7)*32)];
+ vram[(y * 1152)+BYTE4_XOR_BE(x + ddx)] = vramsrc[(y * 1152)+BYTE4_XOR_BE(x + sdx)];
}
}
+ (void)vramsrc; (void)sdx;
}
- else if ((data == 0x101) || (data == 0x100))
+ else if (data == 0x101)
{
int x, y;
- uint8_t *vram = &m_vram[m_vram_addr];
- uint8_t *vramsrc = &m_vram[m_vram_src];
+ uint8_t *vram = &m_vram[m_vram_addr & ~3];
+ uint8_t *vramsrc = &m_vram[m_vram_src & ~3];
+
+ int sdx = m_vram_src & 3;
+ int ddx = m_vram_addr & 3;
-// logerror("Copy rectangle, width %d height %d src %x dst %x\n", m_width, m_height, m_vram_addr, m_vram_src);
+ LOG("Copy rectangle backwards, width %d height %d dst %x (%d, %d) src %x (%d, %d)\n", m_width, m_height, m_vram_addr, m_vram_addr % 1152, m_vram_addr / 1152, m_vram_src, m_vram_src % 1152, m_vram_src / 1152);
for (y = 0; y < m_height; y++)
{
for (x = 0; x < m_width; x++)
{
- vram[(y * 1152)+x] = vramsrc[(y * 1152)+x];
+ vram[(-y * 1152)+BYTE4_XOR_BE(-x + ddx)] = vramsrc[(-y * 1152)+BYTE4_XOR_BE(-x + sdx)];
}
}
+ (void)vramsrc; (void)sdx;
}
else
{
- logerror("Unknown blitter command %08x\n", data);
+ LOG("Unknown blitter command %08x\n", data);
}
break;
default:
-// logerror("specpdq_w: %08x @ %x (mask %08x %s)\n", data^0xffffffff, offset, mem_mask, machine().describe_context());
+ LOG("specpdq_w: %08x @ %x (mask %08x %s)\n", data^0xffffffff, offset, mem_mask, machine().describe_context());
break;
}
}
diff --git a/src/devices/bus/nubus/nubus_vikbw.cpp b/src/devices/bus/nubus/nubus_vikbw.cpp
index 040f452b2d2..ab3af18fe72 100644
--- a/src/devices/bus/nubus/nubus_vikbw.cpp
+++ b/src/devices/bus/nubus/nubus_vikbw.cpp
@@ -36,13 +36,14 @@ DEFINE_DEVICE_TYPE(NUBUS_VIKBW, nubus_vikbw_device, "nb_vikbw", "Moniterm Viking
// device_add_mconfig - add device configuration
//-------------------------------------------------
-MACHINE_CONFIG_START(nubus_vikbw_device::device_add_mconfig)
- MCFG_SCREEN_ADD( VIKBW_SCREEN_NAME, RASTER)
- MCFG_SCREEN_UPDATE_DEVICE(DEVICE_SELF, nubus_vikbw_device, screen_update)
- MCFG_SCREEN_SIZE(1024,768)
- MCFG_SCREEN_VISIBLE_AREA(0, 1024-1, 0, 768-1)
- MCFG_SCREEN_REFRESH_RATE(70)
-MACHINE_CONFIG_END
+void nubus_vikbw_device::device_add_mconfig(machine_config &config)
+{
+ screen_device &screen(SCREEN(config, VIKBW_SCREEN_NAME, SCREEN_TYPE_RASTER));
+ screen.set_screen_update(FUNC(nubus_vikbw_device::screen_update));
+ screen.set_size(1024, 768);
+ screen.set_visarea(0, 1024-1, 0, 768-1);
+ screen.set_refresh_hz(70);
+}
//-------------------------------------------------
// rom_region - device-specific ROM region
diff --git a/src/devices/bus/nubus/nubus_wsportrait.cpp b/src/devices/bus/nubus/nubus_wsportrait.cpp
index 19c25347738..12702c052a6 100644
--- a/src/devices/bus/nubus/nubus_wsportrait.cpp
+++ b/src/devices/bus/nubus/nubus_wsportrait.cpp
@@ -39,13 +39,14 @@ DEFINE_DEVICE_TYPE(NUBUS_WSPORTRAIT, nubus_wsportrait_device, "nb_wspt", "Macint
// device_add_mconfig - add device configuration
//-------------------------------------------------
-MACHINE_CONFIG_START(nubus_wsportrait_device::device_add_mconfig)
- MCFG_SCREEN_ADD( WSPORTRAIT_SCREEN_NAME, RASTER)
- MCFG_SCREEN_UPDATE_DEVICE(DEVICE_SELF, nubus_wsportrait_device, screen_update)
- MCFG_SCREEN_SIZE(1024,960)
- MCFG_SCREEN_REFRESH_RATE(75.0)
- MCFG_SCREEN_VISIBLE_AREA(0, 640-1, 0, 870-1)
-MACHINE_CONFIG_END
+void nubus_wsportrait_device::device_add_mconfig(machine_config &config)
+{
+ screen_device &screen(SCREEN(config, WSPORTRAIT_SCREEN_NAME, SCREEN_TYPE_RASTER));
+ screen.set_screen_update(FUNC(nubus_wsportrait_device::screen_update));
+ screen.set_size(1024, 960);
+ screen.set_refresh_hz(75.0);
+ screen.set_visarea(0, 640-1, 0, 870-1);
+}
//-------------------------------------------------
// rom_region - device-specific ROM region
diff --git a/src/devices/bus/nubus/pds30_30hr.cpp b/src/devices/bus/nubus/pds30_30hr.cpp
index 8888c50b5fa..190872708f6 100644
--- a/src/devices/bus/nubus/pds30_30hr.cpp
+++ b/src/devices/bus/nubus/pds30_30hr.cpp
@@ -39,13 +39,14 @@ DEFINE_DEVICE_TYPE(PDS030_XCEED30HR, nubus_xceed30hr_device, "pd3_30hr", "Micron
// device_add_mconfig - add device configuration
//-------------------------------------------------
-MACHINE_CONFIG_START(nubus_xceed30hr_device::device_add_mconfig)
- MCFG_SCREEN_ADD( XCEED30HR_SCREEN_NAME, RASTER)
- MCFG_SCREEN_UPDATE_DEVICE(DEVICE_SELF, nubus_xceed30hr_device, screen_update)
- MCFG_SCREEN_RAW_PARAMS(25175000, 800, 0, 640, 525, 0, 480)
- MCFG_SCREEN_SIZE(1024,768)
- MCFG_SCREEN_VISIBLE_AREA(0, 640-1, 0, 480-1)
-MACHINE_CONFIG_END
+void nubus_xceed30hr_device::device_add_mconfig(machine_config &config)
+{
+ screen_device &screen(SCREEN(config, XCEED30HR_SCREEN_NAME, SCREEN_TYPE_RASTER));
+ screen.set_screen_update(FUNC(nubus_xceed30hr_device::screen_update));
+ screen.set_raw(25175000, 800, 0, 640, 525, 0, 480);
+ screen.set_size(1024, 768);
+ screen.set_visarea(0, 640-1, 0, 480-1);
+}
//-------------------------------------------------
// rom_region - device-specific ROM region
diff --git a/src/devices/bus/nubus/pds30_cb264.cpp b/src/devices/bus/nubus/pds30_cb264.cpp
index 6ec398a5257..4d153596fe0 100644
--- a/src/devices/bus/nubus/pds30_cb264.cpp
+++ b/src/devices/bus/nubus/pds30_cb264.cpp
@@ -32,13 +32,14 @@ DEFINE_DEVICE_TYPE(PDS030_CB264SE30, nubus_cb264se30_device, "pd3_c264", "Raster
// device_add_mconfig - add device configuration
//-------------------------------------------------
-MACHINE_CONFIG_START(nubus_cb264se30_device::device_add_mconfig)
- MCFG_SCREEN_ADD( CB264SE30_SCREEN_NAME, RASTER)
- MCFG_SCREEN_UPDATE_DEVICE(DEVICE_SELF, nubus_cb264se30_device, screen_update)
- MCFG_SCREEN_RAW_PARAMS(25175000, 800, 0, 640, 525, 0, 480)
- MCFG_SCREEN_SIZE(1024,768)
- MCFG_SCREEN_VISIBLE_AREA(0, 640-1, 0, 480-1)
-MACHINE_CONFIG_END
+void nubus_cb264se30_device::device_add_mconfig(machine_config &config)
+{
+ screen_device &screen(SCREEN(config, CB264SE30_SCREEN_NAME, SCREEN_TYPE_RASTER));
+ screen.set_screen_update(FUNC(nubus_cb264se30_device::screen_update));
+ screen.set_raw(25175000, 800, 0, 640, 525, 0, 480);
+ screen.set_size(1024, 768);
+ screen.set_visarea(0, 640-1, 0, 480-1);
+}
//-------------------------------------------------
// rom_region - device-specific ROM region
diff --git a/src/devices/bus/nubus/pds30_mc30.cpp b/src/devices/bus/nubus/pds30_mc30.cpp
index a314b7f9981..6770b517deb 100644
--- a/src/devices/bus/nubus/pds30_mc30.cpp
+++ b/src/devices/bus/nubus/pds30_mc30.cpp
@@ -35,13 +35,14 @@ DEFINE_DEVICE_TYPE(PDS030_XCEEDMC30, nubus_xceedmc30_device, "pd3_mclr", "Micron
// device_add_mconfig - add device configuration
//-------------------------------------------------
-MACHINE_CONFIG_START(nubus_xceedmc30_device::device_add_mconfig)
- MCFG_SCREEN_ADD( XCEEDMC30_SCREEN_NAME, RASTER)
- MCFG_SCREEN_UPDATE_DEVICE(DEVICE_SELF, nubus_xceedmc30_device, screen_update)
- MCFG_SCREEN_RAW_PARAMS(25175000, 800, 0, 640, 525, 0, 480)
- MCFG_SCREEN_SIZE(1024,768)
- MCFG_SCREEN_VISIBLE_AREA(0, 640-1, 0, 480-1)
-MACHINE_CONFIG_END
+void nubus_xceedmc30_device::device_add_mconfig(machine_config &config)
+{
+ screen_device &screen(SCREEN(config, XCEEDMC30_SCREEN_NAME, SCREEN_TYPE_RASTER));
+ screen.set_screen_update(FUNC(nubus_xceedmc30_device::screen_update));
+ screen.set_raw(25175000, 800, 0, 640, 525, 0, 480);
+ screen.set_size(1024, 768);
+ screen.set_visarea(0, 640-1, 0, 480-1);
+}
//-------------------------------------------------
// rom_region - device-specific ROM region
diff --git a/src/devices/bus/nubus/pds30_procolor816.cpp b/src/devices/bus/nubus/pds30_procolor816.cpp
index db1c02fea31..440ba6c86d7 100644
--- a/src/devices/bus/nubus/pds30_procolor816.cpp
+++ b/src/devices/bus/nubus/pds30_procolor816.cpp
@@ -38,13 +38,14 @@ DEFINE_DEVICE_TYPE(PDS030_PROCOLOR816, nubus_procolor816_device, "pd3_pc16", "La
// device_add_mconfig - add device configuration
//-------------------------------------------------
-MACHINE_CONFIG_START(nubus_procolor816_device::device_add_mconfig)
- MCFG_SCREEN_ADD( PROCOLOR816_SCREEN_NAME, RASTER)
- MCFG_SCREEN_UPDATE_DEVICE(DEVICE_SELF, nubus_procolor816_device, screen_update)
- MCFG_SCREEN_RAW_PARAMS(25175000, 800, 0, 640, 525, 0, 480)
- MCFG_SCREEN_SIZE(1024,768)
- MCFG_SCREEN_VISIBLE_AREA(0, 640-1, 0, 480-1)
-MACHINE_CONFIG_END
+void nubus_procolor816_device::device_add_mconfig(machine_config &config)
+{
+ screen_device &screen(SCREEN(config, PROCOLOR816_SCREEN_NAME, SCREEN_TYPE_RASTER));
+ screen.set_screen_update(FUNC(nubus_procolor816_device::screen_update));
+ screen.set_raw(25175000, 800, 0, 640, 525, 0, 480);
+ screen.set_size(1024, 768);
+ screen.set_visarea(0, 640-1, 0, 480-1);
+}
//-------------------------------------------------
// rom_region - device-specific ROM region
diff --git a/src/devices/bus/nubus/pds30_sigmalview.cpp b/src/devices/bus/nubus/pds30_sigmalview.cpp
index ea05362d8ea..51f27a03713 100644
--- a/src/devices/bus/nubus/pds30_sigmalview.cpp
+++ b/src/devices/bus/nubus/pds30_sigmalview.cpp
@@ -32,13 +32,14 @@ DEFINE_DEVICE_TYPE(PDS030_LVIEW, nubus_lview_device, "pd3_lviw", "Sigma Designs
// device_add_mconfig - add device configuration
//-------------------------------------------------
-MACHINE_CONFIG_START(nubus_lview_device::device_add_mconfig)
- MCFG_SCREEN_ADD( LVIEW_SCREEN_NAME, RASTER)
- MCFG_SCREEN_UPDATE_DEVICE(DEVICE_SELF, nubus_lview_device, screen_update)
- MCFG_SCREEN_SIZE(832,600)
- MCFG_SCREEN_REFRESH_RATE(70)
- MCFG_SCREEN_VISIBLE_AREA(0, 832-1, 0, 600-1)
-MACHINE_CONFIG_END
+void nubus_lview_device::device_add_mconfig(machine_config &config)
+{
+ screen_device &screen(SCREEN(config, LVIEW_SCREEN_NAME, SCREEN_TYPE_RASTER));
+ screen.set_screen_update(FUNC(nubus_lview_device::screen_update));
+ screen.set_size(832, 600);
+ screen.set_refresh_hz(70);
+ screen.set_visarea(0, 832-1, 0, 600-1);
+}
//-------------------------------------------------
// rom_region - device-specific ROM region
diff --git a/src/devices/bus/odyssey2/chess.cpp b/src/devices/bus/odyssey2/chess.cpp
index d2ba5d05f5f..44890a394ce 100644
--- a/src/devices/bus/odyssey2/chess.cpp
+++ b/src/devices/bus/odyssey2/chess.cpp
@@ -45,8 +45,9 @@ void o2_chess_device::chess_io(address_map &map)
// device_add_mconfig - add device configuration
//-------------------------------------------------
-MACHINE_CONFIG_START(o2_chess_device::device_add_mconfig)
- MCFG_DEVICE_ADD("subcpu", NSC800, XTAL(4'000'000))
- MCFG_DEVICE_PROGRAM_MAP(chess_mem)
- MCFG_DEVICE_IO_MAP(chess_io)
-MACHINE_CONFIG_END
+void o2_chess_device::device_add_mconfig(machine_config &config)
+{
+ NSC800(config, m_cpu, XTAL(4'000'000));
+ m_cpu->set_addrmap(AS_PROGRAM, &o2_chess_device::chess_mem);
+ m_cpu->set_addrmap(AS_IO, &o2_chess_device::chess_io);
+}
diff --git a/src/devices/bus/odyssey2/slot.h b/src/devices/bus/odyssey2/slot.h
index 28192aa3457..bfb10c025bd 100644
--- a/src/devices/bus/odyssey2/slot.h
+++ b/src/devices/bus/odyssey2/slot.h
@@ -65,7 +65,17 @@ class o2_cart_slot_device : public device_t,
{
public:
// construction/destruction
- o2_cart_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+ template <typename T>
+ o2_cart_slot_device(machine_config const &mconfig, char const *tag, device_t *owner, T &&opts, char const *dflt)
+ : o2_cart_slot_device(mconfig, tag, owner, 0)
+ {
+ option_reset();
+ opts(*this);
+ set_default_option(dflt);
+ set_fixed(false);
+ }
+
+ o2_cart_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock = 0);
virtual ~o2_cart_slot_device();
// device-level overrides
@@ -114,10 +124,6 @@ DECLARE_DEVICE_TYPE(O2_CART_SLOT, o2_cart_slot_device)
#define O2SLOT_ROM_REGION_TAG ":cart:rom"
-#define MCFG_O2_CARTRIDGE_ADD(_tag,_slot_intf,_def_slot) \
- MCFG_DEVICE_ADD(_tag, O2_CART_SLOT, 0) \
- MCFG_DEVICE_SLOT_INTERFACE(_slot_intf, _def_slot, false)
-
void o2_cart(device_slot_interface &device);
#endif // MAME_BUS_ODYSSEY2_SLOT_H
diff --git a/src/devices/bus/odyssey2/voice.cpp b/src/devices/bus/odyssey2/voice.cpp
index 073b4a83173..83c199f7431 100644
--- a/src/devices/bus/odyssey2/voice.cpp
+++ b/src/devices/bus/odyssey2/voice.cpp
@@ -43,7 +43,8 @@ void o2_voice_device::device_start()
// device_add_mconfig - add device configuration
//-------------------------------------------------
-MACHINE_CONFIG_START(o2_voice_device::device_add_mconfig)
+void o2_voice_device::device_add_mconfig(machine_config &config)
+{
SPEAKER(config, "mono").front_center();
SP0256(config, m_speech, 3120000);
@@ -51,8 +52,8 @@ MACHINE_CONFIG_START(o2_voice_device::device_add_mconfig)
// The Voice uses a speaker with its own volume control so the relative volumes to use are subjective, these sound good
m_speech->add_route(ALL_OUTPUTS, "mono", 1.00);
- MCFG_O2_CARTRIDGE_ADD("subslot", o2_cart, nullptr)
-MACHINE_CONFIG_END
+ O2_CART_SLOT(config, m_subslot, o2_cart, nullptr);
+}
ROM_START( o2voice )
diff --git a/src/devices/bus/pc1512/mouse.h b/src/devices/bus/pc1512/mouse.h
index db432598a98..9c71eb4d89d 100644
--- a/src/devices/bus/pc1512/mouse.h
+++ b/src/devices/bus/pc1512/mouse.h
@@ -32,23 +32,6 @@
#define PC1512_MOUSE_PORT_TAG "mous"
-#define MCFG_PC1512_MOUSE_PORT_ADD(_tag, _slot_intf, _def_slot) \
- MCFG_DEVICE_ADD(_tag, PC1512_MOUSE_PORT, 0) \
- MCFG_DEVICE_SLOT_INTERFACE(_slot_intf, _def_slot, false)
-
-#define MCFG_PC1512_MOUSE_PORT_X_CB(_write) \
- downcast<pc1512_mouse_port_device &>(*device).set_x_wr_callback(DEVCB_##_write);
-
-#define MCFG_PC1512_MOUSE_PORT_Y_CB(_write) \
- downcast<pc1512_mouse_port_device &>(*device).set_y_wr_callback(DEVCB_##_write);
-
-#define MCFG_PC1512_MOUSE_PORT_M1_CB(_write) \
- downcast<pc1512_mouse_port_device &>(*device).set_m1_wr_callback(DEVCB_##_write);
-
-#define MCFG_PC1512_MOUSE_PORT_M2_CB(_write) \
- downcast<pc1512_mouse_port_device &>(*device).set_m2_wr_callback(DEVCB_##_write);
-
-
//**************************************************************************
// TYPE DEFINITIONS
@@ -78,13 +61,23 @@ class pc1512_mouse_port_device : public device_t, public device_slot_interface
{
public:
// construction/destruction
- pc1512_mouse_port_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+ template <typename T>
+ pc1512_mouse_port_device(machine_config const &mconfig, char const *tag, device_t *owner, T &&opts, char const *dflt)
+ : pc1512_mouse_port_device(mconfig, tag, owner, 0)
+ {
+ option_reset();
+ opts(*this);
+ set_default_option(dflt);
+ set_fixed(false);
+ }
+
+ pc1512_mouse_port_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock = 0);
// static configuration helpers
- template <class Object> devcb_base &set_x_wr_callback(Object &&cb) { return m_write_x.set_callback(std::forward<Object>(cb)); }
- template <class Object> devcb_base &set_y_wr_callback(Object &&cb) { return m_write_y.set_callback(std::forward<Object>(cb)); }
- template <class Object> devcb_base &set_m1_wr_callback(Object &&cb) { return m_write_m1.set_callback(std::forward<Object>(cb)); }
- template <class Object> devcb_base &set_m2_wr_callback(Object &&cb) { return m_write_m2.set_callback(std::forward<Object>(cb)); }
+ auto x_wr_callback() { return m_write_x.bind(); }
+ auto y_wr_callback() { return m_write_y.bind(); }
+ auto m1_wr_callback() { return m_write_m1.bind(); }
+ auto m2_wr_callback() { return m_write_m2.bind(); }
// peripheral interface
void x_w(uint8_t data) { m_write_x(data); }
diff --git a/src/devices/bus/pc_kbd/ec1841.cpp b/src/devices/bus/pc_kbd/ec1841.cpp
index 51822723c7e..2a36345e1fa 100644
--- a/src/devices/bus/pc_kbd/ec1841.cpp
+++ b/src/devices/bus/pc_kbd/ec1841.cpp
@@ -34,17 +34,17 @@
#include "emu.h"
#include "ec1841.h"
-#define VERBOSE_DBG 0 /* general debug messages */
-#define DBG_LOG(N,M,A) \
- do { \
- if(VERBOSE_DBG>=N) \
- { \
- logerror("%11.6f at %s: ",machine().time().as_double(),machine().describe_context()); \
- logerror A; \
- } \
- } while (0)
+//#define LOG_GENERAL (1U << 0) //defined in logmacro.h already
+#define LOG_KEYBOARD (1U << 1)
+#define LOG_DEBUG (1U << 2)
+//#define VERBOSE (LOG_DEBUG)
+//#define LOG_OUTPUT_FUNC printf
+#include "logmacro.h"
+
+#define LOGKBD(...) LOGMASKED(LOG_KEYBOARD, __VA_ARGS__)
+#define LOGDBG(...) LOGMASKED(LOG_DEBUG, __VA_ARGS__)
//**************************************************************************
@@ -54,7 +54,6 @@
#define I8048_TAG "i8048"
-
//**************************************************************************
// DEVICE DEFINITIONS
//**************************************************************************
@@ -327,7 +326,7 @@ void ec_1841_keyboard_device::device_reset()
WRITE_LINE_MEMBER( ec_1841_keyboard_device::clock_write )
{
- DBG_LOG(1,0,( "%s: clock write %d\n", tag(), state));
+ LOG("clock write %d\n", state);
}
@@ -337,7 +336,7 @@ WRITE_LINE_MEMBER( ec_1841_keyboard_device::clock_write )
WRITE_LINE_MEMBER( ec_1841_keyboard_device::data_write )
{
- DBG_LOG(1,0,( "%s: data write %d\n", tag(), state));
+ LOG("data write %d\n", state);
}
@@ -347,7 +346,7 @@ WRITE_LINE_MEMBER( ec_1841_keyboard_device::data_write )
WRITE8_MEMBER( ec_1841_keyboard_device::bus_w )
{
- DBG_LOG(2,0,( "%s: bus_w %02x\n", tag(), data));
+ LOGDBG("bus_w %02x\n", data);
m_bus = data;
}
@@ -379,7 +378,7 @@ READ8_MEMBER( ec_1841_keyboard_device::p1_r )
data |= clock_signal();
data |= data_signal() << 1;
- DBG_LOG(1,0,( "%s: p1_r %02x\n", tag(), data));
+ LOG("p1_r %02x\n", data);
return data;
}
@@ -403,7 +402,7 @@ WRITE8_MEMBER( ec_1841_keyboard_device::p1_w )
6 LED XXX
7 LED XXX
*/
- DBG_LOG(1,0,( "%s: p1_w %02x\n", tag(), data));
+ LOG("p1_w %02x\n", data);
m_p1 = data;
}
@@ -427,7 +426,7 @@ WRITE8_MEMBER( ec_1841_keyboard_device::p2_w )
6 XXX CLOCK out 2?
7 XXX
*/
- DBG_LOG(1,0,( "%s: p2_w %02x\n", tag(), data));
+ LOG("p2_w %02x\n", data);
m_pc_kbdc->data_write_from_kb(BIT(data, 2));
m_pc_kbdc->clock_write_from_kb(BIT(data, 1));
@@ -450,7 +449,7 @@ READ_LINE_MEMBER( ec_1841_keyboard_device::t1_r )
m_q = BIT(sense, (m_bus >> 4) & 7);
}
- DBG_LOG(1,0,( "%s: bus %02X t1_r %d\n", tag(), m_bus, m_q));
+ LOG("bus %02X t1_r %d\n", m_bus, m_q);
return m_q;
}
diff --git a/src/devices/bus/pc_kbd/iskr1030.cpp b/src/devices/bus/pc_kbd/iskr1030.cpp
index e55eabcfc20..3f91451d9ab 100644
--- a/src/devices/bus/pc_kbd/iskr1030.cpp
+++ b/src/devices/bus/pc_kbd/iskr1030.cpp
@@ -9,17 +9,17 @@
#include "emu.h"
#include "iskr1030.h"
-#define VERBOSE_DBG 1 /* general debug messages */
-#define DBG_LOG(N,M,A) \
- do { \
- if(VERBOSE_DBG>=N) \
- { \
- logerror("%11.6f at %s: ",machine().time().as_double(),machine().describe_context()); \
- logerror A; \
- } \
- } while (0)
+//#define LOG_GENERAL (1U << 0) //defined in logmacro.h already
+#define LOG_KEYBOARD (1U << 1)
+#define LOG_DEBUG (1U << 2)
+//#define VERBOSE (LOG_DEBUG)
+//#define LOG_OUTPUT_FUNC printf
+#include "logmacro.h"
+
+#define LOGKBD(...) LOGMASKED(LOG_KEYBOARD, __VA_ARGS__)
+#define LOGDBG(...) LOGMASKED(LOG_DEBUG, __VA_ARGS__)
//**************************************************************************
@@ -29,7 +29,6 @@
#define I8048_TAG "i8048"
-
//**************************************************************************
// DEVICE DEFINITIONS
//**************************************************************************
@@ -320,7 +319,7 @@ void iskr_1030_keyboard_device::device_reset()
WRITE_LINE_MEMBER( iskr_1030_keyboard_device::clock_write )
{
- DBG_LOG(1,0,( "%s: clock write %d\n", tag(), state));
+ LOG("clock write %d\n", state);
m_maincpu->set_input_line(MCS48_INPUT_IRQ, state ? CLEAR_LINE : ASSERT_LINE);
}
@@ -331,7 +330,7 @@ WRITE_LINE_MEMBER( iskr_1030_keyboard_device::clock_write )
WRITE_LINE_MEMBER( iskr_1030_keyboard_device::data_write )
{
- DBG_LOG(1,0,( "%s: data write %d\n", tag(), state));
+ LOG("data write %d\n", state);
}
@@ -345,12 +344,12 @@ READ_LINE_MEMBER( iskr_1030_keyboard_device::t1_r )
uint8_t bias = m_p1 & 15;
if (!BIT(m_p1, 7)) {
- DBG_LOG(2,0,( "%s: t1_r (l) %d\n", tag(), data));
+ LOGDBG("t1_r (l) %d\n", data);
return data;
}
if (bias) {
- DBG_LOG(2,0,( "%s: t1_r (b) %d\n", tag(), bias));
+ LOGDBG("t1_r (b) %d\n", bias);
return 1;
}
@@ -384,7 +383,7 @@ READ_LINE_MEMBER( iskr_1030_keyboard_device::t1_r )
}
data = BIT(data, m_bus&3);
- DBG_LOG(2,0,( "%s: t1_r (k r%d c%d) %d\n", tag(), m_bus&3, m_bus>>2, data));
+ LOGDBG("t1_r (k r%d c%d) %d\n", m_bus&3, m_bus>>2, data);
return data;
}
@@ -395,7 +394,7 @@ READ_LINE_MEMBER( iskr_1030_keyboard_device::t1_r )
WRITE8_MEMBER( iskr_1030_keyboard_device::ram_w )
{
- DBG_LOG(2,0,( "%s: ram_w[%02x] <- %02x\n", tag(), offset, data));
+ LOGDBG("ram_w[%02x] <- %02x\n", offset, data);
m_bus = offset;
m_ram[offset] = data;
@@ -408,7 +407,7 @@ WRITE8_MEMBER( iskr_1030_keyboard_device::ram_w )
READ8_MEMBER( iskr_1030_keyboard_device::ram_r )
{
- DBG_LOG(2,0,( "%s: ram_r[%02x] = %02x\n", tag(), offset, m_ram[offset]));
+ LOGDBG("ram_r[%02x] = %02x\n", offset, m_ram[offset]);
return m_ram[offset];
}
@@ -435,7 +434,7 @@ READ8_MEMBER( iskr_1030_keyboard_device::p1_r )
uint8_t data = 0;
- DBG_LOG(1,0,( "%s: p1_r %02x\n", tag(), data));
+ LOG("p1_r %02x\n", data);
return data;
}
@@ -459,7 +458,7 @@ WRITE8_MEMBER( iskr_1030_keyboard_device::p2_w )
6 LED NLK
7 LED CLK
*/
- DBG_LOG(1,0,( "%s: p2_w %02x\n", tag(), data));
+ LOG("p2_w %02x\n", data);
m_p2 = data;
}
@@ -486,7 +485,7 @@ WRITE8_MEMBER( iskr_1030_keyboard_device::p1_w )
m_p1 = data;
- DBG_LOG(1,0,( "%s: p1_w %02x (c %d d %d bias %d)\n", tag(), data, BIT(data, 4), BIT(data, 5), data&15));
+ LOG("p1_w %02x (c %d d %d bias %d)\n", data, BIT(data, 4), BIT(data, 5), data&15);
m_pc_kbdc->data_write_from_kb(BIT(data, 5));
m_pc_kbdc->clock_write_from_kb(BIT(data, 4));
diff --git a/src/devices/bus/pc_kbd/pc_kbdc.cpp b/src/devices/bus/pc_kbd/pc_kbdc.cpp
index 6d28227bca2..5e99056adbe 100644
--- a/src/devices/bus/pc_kbd/pc_kbdc.cpp
+++ b/src/devices/bus/pc_kbd/pc_kbdc.cpp
@@ -118,9 +118,12 @@ void pc_kbdc_device::update_clock_state()
// We first set our state to prevent possible endless loops
m_clock_state = new_clock_state;
+ // Send state to keyboard interface logic on mainboard
+ m_out_clock_cb(m_clock_state);
+
// Send state to keyboard
if (m_keyboard)
- m_keyboard->clock_write( m_clock_state );
+ m_keyboard->clock_write(m_clock_state);
}
}
@@ -134,6 +137,9 @@ void pc_kbdc_device::update_data_state()
// We first set our state to prevent possible endless loops
m_data_state = new_data_state;
+ // Send state to keyboard interface logic on mainboard
+ m_out_data_cb(m_data_state);
+
// Send state to keyboard
if (m_keyboard)
m_keyboard->data_write(m_data_state);
@@ -157,23 +163,15 @@ WRITE_LINE_MEMBER(pc_kbdc_device::data_write_from_mb)
WRITE_LINE_MEMBER(pc_kbdc_device::clock_write_from_kb)
{
- state = state ? 1 : 0;
- if (state != m_kb_clock_state)
- {
- m_out_clock_cb(m_kb_clock_state = state);
- update_clock_state();
- }
+ m_kb_clock_state = state;
+ update_clock_state();
}
WRITE_LINE_MEMBER(pc_kbdc_device::data_write_from_kb)
{
- state = state ? 1 : 0;
- if (state != m_kb_data_state)
- {
- m_out_data_cb(m_kb_data_state = state);
- update_data_state();
- }
+ m_kb_data_state = state;
+ update_data_state();
}
diff --git a/src/devices/bus/pc_kbd/pc_kbdc.h b/src/devices/bus/pc_kbd/pc_kbdc.h
index dac06daf60f..ff1168c314c 100644
--- a/src/devices/bus/pc_kbd/pc_kbdc.h
+++ b/src/devices/bus/pc_kbd/pc_kbdc.h
@@ -17,21 +17,6 @@ set the data line and then set the clock line.
//**************************************************************************
-// INTERFACE CONFIGURATION MACROS
-//**************************************************************************
-
-#define MCFG_PC_KBDC_OUT_CLOCK_CB(_devcb) \
- downcast<pc_kbdc_device &>(*device).set_out_clock_callback(DEVCB_##_devcb);
-
-#define MCFG_PC_KBDC_OUT_DATA_CB(_devcb) \
- downcast<pc_kbdc_device &>(*device).set_out_data_callback(DEVCB_##_devcb);
-
-#define MCFG_PC_KBDC_SLOT_ADD(_kbdc_tag, _tag, _slot_intf, _def_slot) \
- MCFG_DEVICE_ADD(_tag, PC_KBDC_SLOT, 0 ) \
- MCFG_DEVICE_SLOT_INTERFACE(_slot_intf, _def_slot, false) \
- downcast<pc_kbdc_slot_device &>(*device).set_pc_kbdc_slot(subdevice(_kbdc_tag) );
-
-//**************************************************************************
// TYPE DEFINITIONS
//**************************************************************************
@@ -76,8 +61,6 @@ public:
// construction/destruction
pc_kbdc_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- template <class Object> devcb_base &set_out_clock_callback(Object &&cb) { return m_out_clock_cb.set_callback(std::forward<Object>(cb)); }
- template <class Object> devcb_base &set_out_data_callback(Object &&cb) { return m_out_data_cb.set_callback(std::forward<Object>(cb)); }
auto out_clock_cb() { return m_out_clock_cb.bind(); }
auto out_data_cb() { return m_out_data_cb.bind(); }
diff --git a/src/devices/bus/pce/pce_slot.h b/src/devices/bus/pce/pce_slot.h
index 658384cb82b..add982a534b 100644
--- a/src/devices/bus/pce/pce_slot.h
+++ b/src/devices/bus/pce/pce_slot.h
@@ -65,6 +65,17 @@ class pce_cart_slot_device : public device_t,
{
public:
// construction/destruction
+ template <typename T>
+ pce_cart_slot_device(machine_config const &mconfig, char const *tag, device_t *owner, T &&opts, char const *dflt, const char *interface)
+ : pce_cart_slot_device(mconfig, tag, owner, (uint32_t)0)
+ {
+ option_reset();
+ opts(*this);
+ set_default_option(dflt);
+ set_fixed(false);
+ set_intf(interface);
+ }
+
pce_cart_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
virtual ~pce_cart_slot_device();
@@ -115,15 +126,4 @@ DECLARE_DEVICE_TYPE(PCE_CART_SLOT, pce_cart_slot_device)
#define PCESLOT_ROM_REGION_TAG ":cart:rom"
-#define MCFG_PCE_CARTRIDGE_ADD(_tag,_slot_intf,_def_slot) \
- MCFG_DEVICE_ADD(_tag, PCE_CART_SLOT, 0) \
- MCFG_DEVICE_SLOT_INTERFACE(_slot_intf, _def_slot, false) \
- static_cast<pce_cart_slot_device *>(device)->set_intf("pce_cart");
-
-#define MCFG_TG16_CARTRIDGE_ADD(_tag,_slot_intf,_def_slot) \
- MCFG_DEVICE_ADD(_tag, PCE_CART_SLOT, 0) \
- MCFG_DEVICE_SLOT_INTERFACE(_slot_intf, _def_slot, false) \
- static_cast<pce_cart_slot_device *>(device)->set_intf("tg16_cart");
-
-
#endif // MAME_BUS_PCE_PCE_SLOT_H
diff --git a/src/devices/bus/pet/2joysnd.cpp b/src/devices/bus/pet/2joysnd.cpp
index b89ca59f7f8..7bc3915a283 100644
--- a/src/devices/bus/pet/2joysnd.cpp
+++ b/src/devices/bus/pet/2joysnd.cpp
@@ -93,12 +93,13 @@ ioport_constructor pet_userport_joystick_and_sound_device::device_input_ports()
// device_add_mconfig - add device configuration
//-------------------------------------------------
-MACHINE_CONFIG_START(pet_userport_joystick_and_sound_device::device_add_mconfig)
+void pet_userport_joystick_and_sound_device::device_add_mconfig(machine_config &config)
+{
SPEAKER(config, "speaker").front_center();
- MCFG_DEVICE_ADD("dac", DAC_1BIT, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 0.99)
- MCFG_DEVICE_ADD("vref", VOLTAGE_REGULATOR, 0) MCFG_VOLTAGE_REGULATOR_OUTPUT(5.0)
- MCFG_SOUND_ROUTE(0, "dac", 1.0, DAC_VREF_POS_INPUT)
-MACHINE_CONFIG_END
+ DAC_1BIT(config, m_dac, 0).add_route(ALL_OUTPUTS, "speaker", 0.99);
+ voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref"));
+ vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT);
+}
//**************************************************************************
// LIVE DEVICE
diff --git a/src/devices/bus/pet/64k.cpp b/src/devices/bus/pet/64k.cpp
index 34249220f3e..85f91114386 100644
--- a/src/devices/bus/pet/64k.cpp
+++ b/src/devices/bus/pet/64k.cpp
@@ -113,7 +113,7 @@ void pet_64k_expansion_device::device_reset()
// pet_norom_r - NO ROM read
//-------------------------------------------------
-int pet_64k_expansion_device::pet_norom_r(address_space &space, offs_t offset, int sel)
+int pet_64k_expansion_device::pet_norom_r(offs_t offset, int sel)
{
return !BIT(m_ctrl, 7);
}
@@ -123,7 +123,7 @@ int pet_64k_expansion_device::pet_norom_r(address_space &space, offs_t offset, i
// pet_bd_r - buffered data read
//-------------------------------------------------
-uint8_t pet_64k_expansion_device::pet_bd_r(address_space &space, offs_t offset, uint8_t data, int &sel)
+uint8_t pet_64k_expansion_device::pet_bd_r(offs_t offset, uint8_t data, int &sel)
{
if (BIT(m_ctrl, 7))
{
@@ -164,7 +164,7 @@ uint8_t pet_64k_expansion_device::pet_bd_r(address_space &space, offs_t offset,
// pet_bd_w - buffered data write
//-------------------------------------------------
-void pet_64k_expansion_device::pet_bd_w(address_space &space, offs_t offset, uint8_t data, int &sel)
+void pet_64k_expansion_device::pet_bd_w(offs_t offset, uint8_t data, int &sel)
{
if (BIT(m_ctrl, 7))
{
diff --git a/src/devices/bus/pet/64k.h b/src/devices/bus/pet/64k.h
index 82f50cab77a..7cf03cd621b 100644
--- a/src/devices/bus/pet/64k.h
+++ b/src/devices/bus/pet/64k.h
@@ -33,9 +33,9 @@ protected:
virtual void device_reset() override;
// device_pet_expansion_card_interface overrides
- virtual int pet_norom_r(address_space &space, offs_t offset, int sel) override;
- virtual uint8_t pet_bd_r(address_space &space, offs_t offset, uint8_t data, int &sel) override;
- virtual void pet_bd_w(address_space &space, offs_t offset, uint8_t data, int &sel) override;
+ virtual int pet_norom_r(offs_t offset, int sel) override;
+ virtual uint8_t pet_bd_r(offs_t offset, uint8_t data, int &sel) override;
+ virtual void pet_bd_w(offs_t offset, uint8_t data, int &sel) override;
private:
inline uint8_t read_ram(offs_t offset);
diff --git a/src/devices/bus/pet/c2n.cpp b/src/devices/bus/pet/c2n.cpp
index 1212f46c3ca..e7ac6e27c28 100644
--- a/src/devices/bus/pet/c2n.cpp
+++ b/src/devices/bus/pet/c2n.cpp
@@ -24,12 +24,13 @@ DEFINE_DEVICE_TYPE(C1531, c1531_device, "c1531", "Commodore 1531 Datassette")
// device_add_mconfig - add device configuration
//-------------------------------------------------
-MACHINE_CONFIG_START(c2n_device::device_add_mconfig)
- MCFG_CASSETTE_ADD("cassette" )
- MCFG_CASSETTE_FORMATS(cbm_cassette_formats)
- MCFG_CASSETTE_DEFAULT_STATE(CASSETTE_STOPPED | CASSETTE_MOTOR_DISABLED | CASSETTE_SPEAKER_MUTED)
- MCFG_CASSETTE_INTERFACE("cbm_cass")
-MACHINE_CONFIG_END
+void c2n_device::device_add_mconfig(machine_config &config)
+{
+ CASSETTE(config, m_cassette);
+ m_cassette->set_formats(cbm_cassette_formats);
+ m_cassette->set_default_state(CASSETTE_STOPPED | CASSETTE_MOTOR_DISABLED | CASSETTE_SPEAKER_MUTED);
+ m_cassette->set_interface("cbm_cass");
+}
diff --git a/src/devices/bus/pet/cass.h b/src/devices/bus/pet/cass.h
index d5a43fee19c..babfdf2058d 100644
--- a/src/devices/bus/pet/cass.h
+++ b/src/devices/bus/pet/cass.h
@@ -31,18 +31,6 @@
#define PET_DATASSETTE_PORT2_TAG "tape2"
-
-//**************************************************************************
-// INTERFACE CONFIGURATION MACROS
-//**************************************************************************
-
-#define MCFG_PET_DATASSETTE_PORT_ADD(_tag, _slot_intf, _def_slot, _devcb) \
- MCFG_DEVICE_ADD(_tag, PET_DATASSETTE_PORT, 0) \
- MCFG_DEVICE_SLOT_INTERFACE(_slot_intf, _def_slot, false) \
- downcast<pet_datassette_port_device &>(*device).set_read_handler(DEVCB_##_devcb);
-
-
-
//**************************************************************************
// TYPE DEFINITIONS
//**************************************************************************
@@ -68,7 +56,6 @@ public:
virtual ~pet_datassette_port_device();
// static configuration helpers
- template <class Object> devcb_base &set_read_handler(Object &&cb) { return m_read_handler.set_callback(std::forward<Object>(cb)); }
auto read_handler() { return m_read_handler.bind(); }
// computer interface
diff --git a/src/devices/bus/pet/cb2snd.cpp b/src/devices/bus/pet/cb2snd.cpp
index a9f5ccb480a..fffbb70923e 100644
--- a/src/devices/bus/pet/cb2snd.cpp
+++ b/src/devices/bus/pet/cb2snd.cpp
@@ -26,12 +26,13 @@ DEFINE_DEVICE_TYPE(PET_USERPORT_CB2_SOUND_DEVICE, pet_userport_cb2_sound_device,
// device_add_mconfig - add device configuration
//-------------------------------------------------
-MACHINE_CONFIG_START(pet_userport_cb2_sound_device::device_add_mconfig)
+void pet_userport_cb2_sound_device::device_add_mconfig(machine_config &config)
+{
SPEAKER(config, "speaker").front_center();
- MCFG_DEVICE_ADD("dac", DAC_1BIT, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 0.99)
- MCFG_DEVICE_ADD("vref", VOLTAGE_REGULATOR, 0) MCFG_VOLTAGE_REGULATOR_OUTPUT(5.0)
- MCFG_SOUND_ROUTE(0, "dac", 1.0, DAC_VREF_POS_INPUT)
-MACHINE_CONFIG_END
+ DAC_1BIT(config, m_dac, 0).add_route(ALL_OUTPUTS, "speaker", 0.99);
+ voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref"));
+ vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT);
+}
//**************************************************************************
// LIVE DEVICE
diff --git a/src/devices/bus/pet/exp.cpp b/src/devices/bus/pet/exp.cpp
index ab7cc9e04dd..07aa7155b93 100644
--- a/src/devices/bus/pet/exp.cpp
+++ b/src/devices/bus/pet/exp.cpp
@@ -115,9 +115,9 @@ void pet_expansion_slot_device::device_reset()
// norom_r - NO ROM read
//-------------------------------------------------
-int pet_expansion_slot_device::norom_r(address_space &space, offs_t offset, int sel)
+int pet_expansion_slot_device::norom_r(offs_t offset, int sel)
{
- return m_card ? m_card->pet_norom_r(space, offset, sel) : 1;
+ return m_card ? m_card->pet_norom_r(offset, sel) : 1;
}
@@ -125,11 +125,11 @@ int pet_expansion_slot_device::norom_r(address_space &space, offs_t offset, int
// read - buffered data read
//-------------------------------------------------
-uint8_t pet_expansion_slot_device::read(address_space &space, offs_t offset, uint8_t data, int &sel)
+uint8_t pet_expansion_slot_device::read(offs_t offset, uint8_t data, int &sel)
{
if (m_card != nullptr)
{
- data = m_card->pet_bd_r(space, offset, data, sel);
+ data = m_card->pet_bd_r(offset, data, sel);
}
return data;
@@ -140,11 +140,11 @@ uint8_t pet_expansion_slot_device::read(address_space &space, offs_t offset, uin
// write - buffered data write
//-------------------------------------------------
-void pet_expansion_slot_device::write(address_space &space, offs_t offset, uint8_t data, int &sel)
+void pet_expansion_slot_device::write(offs_t offset, uint8_t data, int &sel)
{
if (m_card != nullptr)
{
- m_card->pet_bd_w(space, offset, data, sel);
+ m_card->pet_bd_w(offset, data, sel);
}
}
diff --git a/src/devices/bus/pet/exp.h b/src/devices/bus/pet/exp.h
index d44dcea6d19..39309b65f4c 100644
--- a/src/devices/bus/pet/exp.h
+++ b/src/devices/bus/pet/exp.h
@@ -23,21 +23,6 @@
#define PET_EXPANSION_SLOT_TAG "exp"
-
-//**************************************************************************
-// INTERFACE CONFIGURATION MACROS
-//**************************************************************************
-
-#define MCFG_PET_EXPANSION_SLOT_ADD(_tag, _clock, _slot_intf, _def_slot) \
- MCFG_DEVICE_ADD(_tag, PET_EXPANSION_SLOT, _clock) \
- MCFG_DEVICE_SLOT_INTERFACE(_slot_intf, _def_slot, false)
-
-
-#define MCFG_PET_EXPANSION_SLOT_DMA_CALLBACKS(_read, _write) \
- downcast<pet_expansion_slot_device *>(device)->set_callbacks(DEVCB_##_read, DEVCB_##_write);
-
-
-
//**************************************************************************
// TYPE DEFINITIONS
//**************************************************************************
@@ -63,18 +48,13 @@ public:
pet_expansion_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
virtual ~pet_expansion_slot_device();
- template <class Read, class Write> void set_callbacks(Read &&rd, Write &&wr) {
- m_read_dma.set_callback(std::forward<Read>(rd));
- m_write_dma.set_callback(std::forward<Write>(wr));
- }
-
auto dma_read_callback() { return m_read_dma.bind(); }
auto dma_write_callback() { return m_write_dma.bind(); }
// computer interface
- int norom_r(address_space &space, offs_t offset, int sel);
- uint8_t read(address_space &space, offs_t offset, uint8_t data, int &sel);
- void write(address_space &space, offs_t offset, uint8_t data, int &sel);
+ int norom_r(offs_t offset, int sel);
+ uint8_t read(offs_t offset, uint8_t data, int &sel);
+ void write(offs_t offset, uint8_t data, int &sel);
DECLARE_READ_LINE_MEMBER( diag_r );
DECLARE_WRITE_LINE_MEMBER( irq_w );
@@ -131,9 +111,9 @@ protected:
device_pet_expansion_card_interface(const machine_config &mconfig, device_t &device);
// runtime
- virtual int pet_norom_r(address_space &space, offs_t offset, int sel) { return 1; }
- virtual uint8_t pet_bd_r(address_space &space, offs_t offset, uint8_t data, int &sel) { return data; };
- virtual void pet_bd_w(address_space &space, offs_t offset, uint8_t data, int &sel) { };
+ virtual int pet_norom_r(offs_t offset, int sel) { return 1; }
+ virtual uint8_t pet_bd_r(offs_t offset, uint8_t data, int &sel) { return data; };
+ virtual void pet_bd_w(offs_t offset, uint8_t data, int &sel) { };
virtual int pet_diag_r() { return 1; }
virtual void pet_irq_w(int state) { }
diff --git a/src/devices/bus/pet/hsg.cpp b/src/devices/bus/pet/hsg.cpp
index 5288b632174..7c6e7c657d6 100644
--- a/src/devices/bus/pet/hsg.cpp
+++ b/src/devices/bus/pet/hsg.cpp
@@ -91,37 +91,39 @@ void cbm8000_hsg_b_device::hsg_b_map(address_map &map)
// device_add_mconfig - add device configuration
//-------------------------------------------------
-MACHINE_CONFIG_START(cbm8000_hsg_a_device::device_add_mconfig)
- MCFG_SCREEN_ADD_MONOCHROME(SCREEN_TAG, RASTER, rgb_t::green())
- MCFG_SCREEN_UPDATE_DEVICE(EF9365_TAG, ef9365_device, screen_update)
- MCFG_SCREEN_SIZE(512, 512)
- MCFG_SCREEN_VISIBLE_AREA(0, 512-1, 0, 512-1)
- MCFG_SCREEN_REFRESH_RATE(25)
+void cbm8000_hsg_a_device::device_add_mconfig(machine_config &config)
+{
+ screen_device &screen(SCREEN(config, SCREEN_TAG, SCREEN_TYPE_RASTER, rgb_t::green()));
+ screen.set_screen_update(EF9365_TAG, FUNC(ef9365_device::screen_update));
+ screen.set_size(512, 512);
+ screen.set_visarea(0, 512-1, 0, 512-1);
+ screen.set_refresh_hz(25);
PALETTE(config, "palette", palette_device::MONOCHROME);
- MCFG_DEVICE_ADD(EF9365_TAG, EF9365, 1750000)
- MCFG_VIDEO_SET_SCREEN(SCREEN_TAG)
- MCFG_DEVICE_ADDRESS_MAP(0, hsg_a_map)
- MCFG_EF936X_PALETTE("palette")
- MCFG_EF936X_BITPLANES_CNT(1);
- MCFG_EF936X_DISPLAYMODE(DISPLAY_MODE_512x512);
-MACHINE_CONFIG_END
-
-MACHINE_CONFIG_START(cbm8000_hsg_b_device::device_add_mconfig)
- MCFG_SCREEN_ADD_MONOCHROME(SCREEN_TAG, RASTER, rgb_t::green())
- MCFG_SCREEN_UPDATE_DEVICE(EF9366_TAG, ef9365_device, screen_update)
- MCFG_SCREEN_SIZE(512, 256)
- MCFG_SCREEN_VISIBLE_AREA(0, 512-1, 0, 256-1)
- MCFG_SCREEN_REFRESH_RATE(50)
+ EF9365(config, m_gdc, 1750000);
+ m_gdc->set_screen(SCREEN_TAG);
+ m_gdc->set_addrmap(0, &cbm8000_hsg_a_device::hsg_a_map);
+ m_gdc->set_palette_tag("palette");
+ m_gdc->set_nb_bitplanes(1);
+ m_gdc->set_display_mode(ef9365_device::DISPLAY_MODE_512x512);
+}
+
+void cbm8000_hsg_b_device::device_add_mconfig(machine_config &config)
+{
+ screen_device &screen(SCREEN(config, SCREEN_TAG, SCREEN_TYPE_RASTER, rgb_t::green()));
+ screen.set_screen_update(EF9366_TAG, FUNC(ef9365_device::screen_update));
+ screen.set_size(512, 256);
+ screen.set_visarea(0, 512-1, 0, 256-1);
+ screen.set_refresh_hz(50);
PALETTE(config, "palette", palette_device::MONOCHROME);
- MCFG_DEVICE_ADD(EF9366_TAG, EF9365, 1750000)
- MCFG_VIDEO_SET_SCREEN(SCREEN_TAG)
- MCFG_DEVICE_ADDRESS_MAP(0, hsg_b_map)
- MCFG_EF936X_PALETTE("palette")
- MCFG_EF936X_BITPLANES_CNT(1);
- MCFG_EF936X_DISPLAYMODE(DISPLAY_MODE_512x256);
-MACHINE_CONFIG_END
+ EF9365(config, m_gdc, 1750000); //EF9366
+ m_gdc->set_screen(SCREEN_TAG);
+ m_gdc->set_addrmap(0, &cbm8000_hsg_b_device::hsg_b_map);
+ m_gdc->set_palette_tag("palette");
+ m_gdc->set_nb_bitplanes(1);
+ m_gdc->set_display_mode(ef9365_device::DISPLAY_MODE_512x256);
+}
@@ -176,7 +178,7 @@ void cbm8000_hsg_device::device_reset()
// pet_norom_r - NO ROM read
//-------------------------------------------------
-int cbm8000_hsg_device::pet_norom_r(address_space &space, offs_t offset, int sel)
+int cbm8000_hsg_device::pet_norom_r(offs_t offset, int sel)
{
return !(offset >= 0x9000 && offset < 0xaf00);
}
@@ -186,7 +188,7 @@ int cbm8000_hsg_device::pet_norom_r(address_space &space, offs_t offset, int sel
// pet_bd_r - buffered data read
//-------------------------------------------------
-uint8_t cbm8000_hsg_device::pet_bd_r(address_space &space, offs_t offset, uint8_t data, int &sel)
+uint8_t cbm8000_hsg_device::pet_bd_r(offs_t offset, uint8_t data, int &sel)
{
switch (sel)
{
@@ -222,7 +224,7 @@ uint8_t cbm8000_hsg_device::pet_bd_r(address_space &space, offs_t offset, uint8_
}
else if (offset >= 0xaf70 && offset < 0xaf80)
{
- data = m_gdc->data_r(space, offset & 0x0f);
+ data = m_gdc->data_r(offset & 0x0f);
}
break;
}
@@ -235,7 +237,7 @@ uint8_t cbm8000_hsg_device::pet_bd_r(address_space &space, offs_t offset, uint8_
// pet_bd_w - buffered data write
//-------------------------------------------------
-void cbm8000_hsg_device::pet_bd_w(address_space &space, offs_t offset, uint8_t data, int &sel)
+void cbm8000_hsg_device::pet_bd_w(offs_t offset, uint8_t data, int &sel)
{
if (offset == 0xaf00)
{
@@ -256,6 +258,6 @@ void cbm8000_hsg_device::pet_bd_w(address_space &space, offs_t offset, uint8_t d
}
else if (offset >= 0xaf70 && offset < 0xaf80)
{
- m_gdc->data_w(space, offset & 0x0f, data);
+ m_gdc->data_w(offset & 0x0f, data);
}
}
diff --git a/src/devices/bus/pet/hsg.h b/src/devices/bus/pet/hsg.h
index 44abebbf9ef..e86cb101ac3 100644
--- a/src/devices/bus/pet/hsg.h
+++ b/src/devices/bus/pet/hsg.h
@@ -36,12 +36,13 @@ protected:
virtual const tiny_rom_entry *device_rom_region() const override;
// device_pet_expansion_card_interface overrides
- virtual int pet_norom_r(address_space &space, offs_t offset, int sel) override;
- virtual uint8_t pet_bd_r(address_space &space, offs_t offset, uint8_t data, int &sel) override;
- virtual void pet_bd_w(address_space &space, offs_t offset, uint8_t data, int &sel) override;
+ virtual int pet_norom_r(offs_t offset, int sel) override;
+ virtual uint8_t pet_bd_r(offs_t offset, uint8_t data, int &sel) override;
+ virtual void pet_bd_w(offs_t offset, uint8_t data, int &sel) override;
-private:
required_device<ef9365_device> m_gdc;
+
+private:
required_memory_region m_9000;
required_memory_region m_a000;
};
diff --git a/src/devices/bus/pet/superpet.cpp b/src/devices/bus/pet/superpet.cpp
index 1aa3ed05014..ab518bec49f 100644
--- a/src/devices/bus/pet/superpet.cpp
+++ b/src/devices/bus/pet/superpet.cpp
@@ -225,7 +225,7 @@ void superpet_device::device_reset()
// pet_norom_r - NO ROM read
//-------------------------------------------------
-int superpet_device::pet_norom_r(address_space &space, offs_t offset, int sel)
+int superpet_device::pet_norom_r(offs_t offset, int sel)
{
return BIT(m_system, 0);
}
@@ -235,9 +235,9 @@ int superpet_device::pet_norom_r(address_space &space, offs_t offset, int sel)
// pet_bd_r - buffered data read
//-------------------------------------------------
-uint8_t superpet_device::pet_bd_r(address_space &space, offs_t offset, uint8_t data, int &sel)
+uint8_t superpet_device::pet_bd_r(offs_t offset, uint8_t data, int &sel)
{
- int norom = pet_norom_r(space, offset, sel);
+ int norom = pet_norom_r(offset, sel);
switch (sel)
{
@@ -277,14 +277,14 @@ uint8_t superpet_device::pet_bd_r(address_space &space, offs_t offset, uint8_t d
case 0xefe1:
case 0xefe2:
case 0xefe3:
- data = m_dongle->read(space, offset & 0x03);
+ data = m_dongle->read(offset & 0x03);
break;
case 0xeff0:
case 0xeff1:
case 0xeff2:
case 0xeff3:
- data = m_acia->read(space, offset & 0x03);
+ data = m_acia->read(offset & 0x03);
break;
}
@@ -296,7 +296,7 @@ uint8_t superpet_device::pet_bd_r(address_space &space, offs_t offset, uint8_t d
// pet_bd_w - buffered data write
//-------------------------------------------------
-void superpet_device::pet_bd_w(address_space &space, offs_t offset, uint8_t data, int &sel)
+void superpet_device::pet_bd_w(offs_t offset, uint8_t data, int &sel)
{
switch (sel)
{
@@ -314,7 +314,7 @@ void superpet_device::pet_bd_w(address_space &space, offs_t offset, uint8_t data
case 0xefe1:
case 0xefe2:
case 0xefe3:
- m_dongle->write(space, offset & 0x03, data);
+ m_dongle->write(offset & 0x03, data);
printf("6702 %u %02x\n", offset & 0x03, data);
break;
@@ -322,7 +322,7 @@ void superpet_device::pet_bd_w(address_space &space, offs_t offset, uint8_t data
case 0xeff1:
case 0xeff2:
case 0xeff3:
- m_acia->write(space, offset & 0x03, data);
+ m_acia->write(offset & 0x03, data);
break;
case 0xeff8:
diff --git a/src/devices/bus/pet/superpet.h b/src/devices/bus/pet/superpet.h
index 35c74af8ab0..6a6dfde0889 100644
--- a/src/devices/bus/pet/superpet.h
+++ b/src/devices/bus/pet/superpet.h
@@ -41,9 +41,9 @@ protected:
virtual ioport_constructor device_input_ports() const override;
// device_pet_expansion_card_interface overrides
- virtual int pet_norom_r(address_space &space, offs_t offset, int sel) override;
- virtual uint8_t pet_bd_r(address_space &space, offs_t offset, uint8_t data, int &sel) override;
- virtual void pet_bd_w(address_space &space, offs_t offset, uint8_t data, int &sel) override;
+ virtual int pet_norom_r(offs_t offset, int sel) override;
+ virtual uint8_t pet_bd_r(offs_t offset, uint8_t data, int &sel) override;
+ virtual void pet_bd_w(offs_t offset, uint8_t data, int &sel) override;
virtual int pet_diag_r() override;
virtual void pet_irq_w(int state) override;
diff --git a/src/devices/bus/plus4/c1551.cpp b/src/devices/bus/plus4/c1551.cpp
index 63cda307f2b..333dea55fb0 100644
--- a/src/devices/bus/plus4/c1551.cpp
+++ b/src/devices/bus/plus4/c1551.cpp
@@ -57,7 +57,7 @@ const tiny_rom_entry *c1551_device::device_rom_region() const
// M6510_INTERFACE( cpu_intf )
//-------------------------------------------------
-READ8_MEMBER( c1551_device::port_r )
+uint8_t c1551_device::port_r()
{
/*
@@ -85,7 +85,7 @@ READ8_MEMBER( c1551_device::port_r )
return data;
}
-WRITE8_MEMBER( c1551_device::port_w )
+void c1551_device::port_w(uint8_t data)
{
/*
@@ -120,7 +120,7 @@ WRITE8_MEMBER( c1551_device::port_w )
// tpi6525_interface tpi0_intf
//-------------------------------------------------
-READ8_MEMBER( c1551_device::tcbm_data_r )
+uint8_t c1551_device::tcbm_data_r()
{
/*
@@ -140,7 +140,7 @@ READ8_MEMBER( c1551_device::tcbm_data_r )
return m_tcbm_data;
}
-WRITE8_MEMBER( c1551_device::tcbm_data_w )
+void c1551_device::tcbm_data_w(uint8_t data)
{
/*
@@ -160,9 +160,9 @@ WRITE8_MEMBER( c1551_device::tcbm_data_w )
m_tcbm_data = data;
}
-READ8_MEMBER( c1551_device::tpi0_r )
+uint8_t c1551_device::tpi0_r(offs_t offset)
{
- uint8_t data = m_tpi0->read(space, offset);
+ uint8_t data = m_tpi0->read(offset);
m_ga->ted_w(0);
m_ga->ted_w(1);
@@ -170,15 +170,15 @@ READ8_MEMBER( c1551_device::tpi0_r )
return data;
}
-WRITE8_MEMBER( c1551_device::tpi0_w )
+void c1551_device::tpi0_w(offs_t offset, uint8_t data)
{
- m_tpi0->write(space, offset, data);
+ m_tpi0->write(offset, data);
m_ga->ted_w(0);
m_ga->ted_w(1);
}
-READ8_MEMBER( c1551_device::tpi0_pc_r )
+uint8_t c1551_device::tpi0_pc_r()
{
/*
@@ -209,7 +209,7 @@ READ8_MEMBER( c1551_device::tpi0_pc_r )
return data;
}
-WRITE8_MEMBER( c1551_device::tpi0_pc_w )
+void c1551_device::tpi0_pc_w(uint8_t data)
{
/*
@@ -243,7 +243,7 @@ WRITE8_MEMBER( c1551_device::tpi0_pc_w )
// tpi6525_interface tpi1_intf
//-------------------------------------------------
-READ8_MEMBER( c1551_device::tpi1_pb_r )
+uint8_t c1551_device::tpi1_pb_r()
{
/*
@@ -263,7 +263,7 @@ READ8_MEMBER( c1551_device::tpi1_pb_r )
return m_status & 0x03;
}
-READ8_MEMBER( c1551_device::tpi1_pc_r )
+uint8_t c1551_device::tpi1_pc_r()
{
/*
@@ -288,7 +288,7 @@ READ8_MEMBER( c1551_device::tpi1_pc_r )
return data;
}
-WRITE8_MEMBER( c1551_device::tpi1_pc_w )
+void c1551_device::tpi1_pc_w(uint8_t data)
{
/*
@@ -524,13 +524,13 @@ bool c1551_device::tpi1_selected(offs_t offset)
// plus4_cd_r - cartridge data read
//-------------------------------------------------
-uint8_t c1551_device::plus4_cd_r(address_space &space, offs_t offset, uint8_t data, int ba, int cs0, int c1l, int c2l, int cs1, int c1h, int c2h)
+uint8_t c1551_device::plus4_cd_r(offs_t offset, uint8_t data, int ba, int cs0, int c1l, int c2l, int cs1, int c1h, int c2h)
{
- data = m_exp->cd_r(space, offset, data, ba, cs0, c1l, c2l, cs1, c1h, c2h);
+ data = m_exp->cd_r(offset, data, ba, cs0, c1l, c2l, cs1, c1h, c2h);
if (tpi1_selected(offset))
{
- data = m_tpi1->read(space, offset & 0x07);
+ data = m_tpi1->read(offset & 0x07);
}
return data;
@@ -541,12 +541,12 @@ uint8_t c1551_device::plus4_cd_r(address_space &space, offs_t offset, uint8_t da
// plus4_cd_w - cartridge data write
//-------------------------------------------------
-void c1551_device::plus4_cd_w(address_space &space, offs_t offset, uint8_t data, int ba, int cs0, int c1l, int c2l, int cs1, int c1h, int c2h)
+void c1551_device::plus4_cd_w(offs_t offset, uint8_t data, int ba, int cs0, int c1l, int c2l, int cs1, int c1h, int c2h)
{
if (tpi1_selected(offset))
{
- m_tpi1->write(space, offset & 0x07, data);
+ m_tpi1->write(offset & 0x07, data);
}
- m_exp->cd_w(space, offset, data, ba, cs0, c1l, c2l, cs1, c1h, c2h);
+ m_exp->cd_w(offset, data, ba, cs0, c1l, c2l, cs1, c1h, c2h);
}
diff --git a/src/devices/bus/plus4/c1551.h b/src/devices/bus/plus4/c1551.h
index b108fc94ef1..3fce289461c 100644
--- a/src/devices/bus/plus4/c1551.h
+++ b/src/devices/bus/plus4/c1551.h
@@ -44,24 +44,24 @@ protected:
virtual ioport_constructor device_input_ports() const override;
// device_plus4_expansion_card_interface overrides
- virtual uint8_t plus4_cd_r(address_space &space, offs_t offset, uint8_t data, int ba, int cs0, int c1l, int c2l, int cs1, int c1h, int c2h) override;
- virtual void plus4_cd_w(address_space &space, offs_t offset, uint8_t data, int ba, int cs0, int c1l, int c2l, int cs1, int c1h, int c2h) override;
+ virtual uint8_t plus4_cd_r(offs_t offset, uint8_t data, int ba, int cs0, int c1l, int c2l, int cs1, int c1h, int c2h) override;
+ virtual void plus4_cd_w(offs_t offset, uint8_t data, int ba, int cs0, int c1l, int c2l, int cs1, int c1h, int c2h) override;
private:
- DECLARE_READ8_MEMBER( port_r );
- DECLARE_WRITE8_MEMBER( port_w );
+ uint8_t port_r();
+ void port_w(uint8_t data);
- DECLARE_READ8_MEMBER( tcbm_data_r );
- DECLARE_WRITE8_MEMBER( tcbm_data_w );
- DECLARE_READ8_MEMBER( tpi0_pc_r );
- DECLARE_WRITE8_MEMBER( tpi0_pc_w );
+ uint8_t tcbm_data_r();
+ void tcbm_data_w(uint8_t data);
+ uint8_t tpi0_pc_r();
+ void tpi0_pc_w(uint8_t data);
- DECLARE_READ8_MEMBER( tpi1_pb_r );
- DECLARE_READ8_MEMBER( tpi1_pc_r );
- DECLARE_WRITE8_MEMBER( tpi1_pc_w );
+ uint8_t tpi1_pb_r();
+ uint8_t tpi1_pc_r();
+ void tpi1_pc_w(uint8_t data);
- DECLARE_READ8_MEMBER( tpi0_r );
- DECLARE_WRITE8_MEMBER( tpi0_w );
+ uint8_t tpi0_r(offs_t offset);
+ void tpi0_w(offs_t offset, uint8_t data);
void c1551_mem(address_map &map);
diff --git a/src/devices/bus/plus4/exp.cpp b/src/devices/bus/plus4/exp.cpp
index d9ee8642eba..83e8ad4277a 100644
--- a/src/devices/bus/plus4/exp.cpp
+++ b/src/devices/bus/plus4/exp.cpp
@@ -167,11 +167,11 @@ std::string plus4_expansion_slot_device::get_default_card_software(get_default_c
// cd_r - cartridge data read
//-------------------------------------------------
-uint8_t plus4_expansion_slot_device::cd_r(address_space &space, offs_t offset, uint8_t data, int ba, int cs0, int c1l, int c2l, int cs1, int c1h, int c2h)
+uint8_t plus4_expansion_slot_device::cd_r(offs_t offset, uint8_t data, int ba, int cs0, int c1l, int c2l, int cs1, int c1h, int c2h)
{
if (m_card != nullptr)
{
- data = m_card->plus4_cd_r(space, offset, data, ba, cs0, c1l, c1h, cs1, c2l, c2h);
+ data = m_card->plus4_cd_r(offset, data, ba, cs0, c1l, c1h, cs1, c2l, c2h);
}
return data;
@@ -182,11 +182,11 @@ uint8_t plus4_expansion_slot_device::cd_r(address_space &space, offs_t offset, u
// cd_w - cartridge data write
//-------------------------------------------------
-void plus4_expansion_slot_device::cd_w(address_space &space, offs_t offset, uint8_t data, int ba, int cs0, int c1l, int c2l, int cs1, int c1h, int c2h)
+void plus4_expansion_slot_device::cd_w(offs_t offset, uint8_t data, int ba, int cs0, int c1l, int c2l, int cs1, int c1h, int c2h)
{
if (m_card != nullptr)
{
- m_card->plus4_cd_w(space, offset, data, ba, cs0, c1l, c1h, cs1, c2l, c2h);
+ m_card->plus4_cd_w(offset, data, ba, cs0, c1l, c1h, cs1, c2l, c2h);
}
}
diff --git a/src/devices/bus/plus4/exp.h b/src/devices/bus/plus4/exp.h
index e61755a497e..9f625442d99 100644
--- a/src/devices/bus/plus4/exp.h
+++ b/src/devices/bus/plus4/exp.h
@@ -49,37 +49,6 @@
#define PLUS4_EXPANSION_SLOT_TAG "exp"
-
-//**************************************************************************
-// INTERFACE CONFIGURATION MACROS
-//**************************************************************************
-
-#define MCFG_PLUS4_EXPANSION_SLOT_ADD(_tag, _clock, _slot_intf, _def_slot) \
- MCFG_DEVICE_ADD(_tag, PLUS4_EXPANSION_SLOT, _clock) \
- MCFG_DEVICE_SLOT_INTERFACE(_slot_intf, _def_slot, false)
-
-#define MCFG_PLUS4_PASSTHRU_EXPANSION_SLOT_ADD() \
- MCFG_PLUS4_EXPANSION_SLOT_ADD(PLUS4_EXPANSION_SLOT_TAG, 0, plus4_expansion_cards, nullptr) \
- MCFG_PLUS4_EXPANSION_SLOT_IRQ_CALLBACK(WRITELINE(DEVICE_SELF_OWNER, plus4_expansion_slot_device, irq_w)) \
- MCFG_PLUS4_EXPANSION_SLOT_CD_INPUT_CALLBACK(READ8(DEVICE_SELF_OWNER, plus4_expansion_slot_device, dma_cd_r)) \
- MCFG_PLUS4_EXPANSION_SLOT_CD_OUTPUT_CALLBACK(WRITE8(DEVICE_SELF_OWNER, plus4_expansion_slot_device, dma_cd_w)) \
- MCFG_PLUS4_EXPANSION_SLOT_AEC_CALLBACK(WRITELINE(DEVICE_SELF_OWNER, plus4_expansion_slot_device, aec_w))
-
-
-#define MCFG_PLUS4_EXPANSION_SLOT_IRQ_CALLBACK(_write) \
- downcast<plus4_expansion_slot_device &>(*device).set_irq_wr_callback(DEVCB_##_write);
-
-#define MCFG_PLUS4_EXPANSION_SLOT_CD_INPUT_CALLBACK(_read) \
- downcast<plus4_expansion_slot_device &>(*device).set_cd_rd_callback(DEVCB_##_read);
-
-#define MCFG_PLUS4_EXPANSION_SLOT_CD_OUTPUT_CALLBACK(_write) \
- downcast<plus4_expansion_slot_device &>(*device).set_cd_wr_callback(DEVCB_##_write);
-
-#define MCFG_PLUS4_EXPANSION_SLOT_AEC_CALLBACK(_write) \
- downcast<plus4_expansion_slot_device &>(*device).set_aec_wr_callback(DEVCB_##_write);
-
-
-
//**************************************************************************
// TYPE DEFINITIONS
//**************************************************************************
@@ -111,12 +80,12 @@ public:
auto aec_wr_callback() { return m_write_aec.bind(); }
// computer interface
- uint8_t cd_r(address_space &space, offs_t offset, uint8_t data, int ba, int cs0, int c1l, int c2l, int cs1, int c1h, int c2h);
- void cd_w(address_space &space, offs_t offset, uint8_t data, int ba, int cs0, int c1l, int c2l, int cs1, int c1h, int c2h);
+ uint8_t cd_r(offs_t offset, uint8_t data, int ba, int cs0, int c1l, int c2l, int cs1, int c1h, int c2h);
+ void cd_w(offs_t offset, uint8_t data, int ba, int cs0, int c1l, int c2l, int cs1, int c1h, int c2h);
// cartridge interface
- DECLARE_READ8_MEMBER( dma_cd_r ) { return m_read_dma_cd(offset); }
- DECLARE_WRITE8_MEMBER( dma_cd_w ) { m_write_dma_cd(offset, data); }
+ uint8_t dma_cd_r(offs_t offset) { return m_read_dma_cd(offset); }
+ void dma_cd_w(offs_t offset, uint8_t data) { m_write_dma_cd(offset, data); }
DECLARE_WRITE_LINE_MEMBER( irq_w ) { m_write_irq(state); }
DECLARE_WRITE_LINE_MEMBER( aec_w ) { m_write_aec(state); }
int phi2() { return clock(); }
@@ -164,8 +133,8 @@ public:
virtual ~device_plus4_expansion_card_interface();
// runtime
- virtual uint8_t plus4_cd_r(address_space &space, offs_t offset, uint8_t data, int ba, int cs0, int c1l, int c2l, int cs1, int c1h, int c2h) { return data; }
- virtual void plus4_cd_w(address_space &space, offs_t offset, uint8_t data, int ba, int cs0, int c1l, int c2l, int cs1, int c1h, int c2h) { }
+ virtual uint8_t plus4_cd_r(offs_t offset, uint8_t data, int ba, int cs0, int c1l, int c2l, int cs1, int c1h, int c2h) { return data; }
+ virtual void plus4_cd_w(offs_t offset, uint8_t data, int ba, int cs0, int c1l, int c2l, int cs1, int c1h, int c2h) { }
protected:
device_plus4_expansion_card_interface(const machine_config &mconfig, device_t &device);
diff --git a/src/devices/bus/plus4/sid.cpp b/src/devices/bus/plus4/sid.cpp
index f97deec6310..1ebfdafd657 100644
--- a/src/devices/bus/plus4/sid.cpp
+++ b/src/devices/bus/plus4/sid.cpp
@@ -64,13 +64,13 @@ const tiny_rom_entry *plus4_sid_cartridge_device::device_rom_region() const
// device_add_mconfig - add device configuration
//-------------------------------------------------
-MACHINE_CONFIG_START(plus4_sid_cartridge_device::device_add_mconfig)
+void plus4_sid_cartridge_device::device_add_mconfig(machine_config &config)
+{
SPEAKER(config, "speaker").front_center();
- MCFG_DEVICE_ADD(MOS8580_TAG, MOS8580, XTAL(17'734'470)/20)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 1.0)
+ MOS8580(config, m_sid, XTAL(17'734'470)/20).add_route(ALL_OUTPUTS, "speaker", 1.0);
- MCFG_VCS_CONTROL_PORT_ADD(CONTROL1_TAG, vcs_control_port_devices, nullptr)
-MACHINE_CONFIG_END
+ VCS_CONTROL_PORT(config, m_joy, vcs_control_port_devices, nullptr);
+}
@@ -114,15 +114,15 @@ void plus4_sid_cartridge_device::device_reset()
// plus4_cd_r - cartridge data read
//-------------------------------------------------
-uint8_t plus4_sid_cartridge_device::plus4_cd_r(address_space &space, offs_t offset, uint8_t data, int ba, int cs0, int c1l, int c2l, int cs1, int c1h, int c2h)
+uint8_t plus4_sid_cartridge_device::plus4_cd_r(offs_t offset, uint8_t data, int ba, int cs0, int c1l, int c2l, int cs1, int c1h, int c2h)
{
if ((offset >= 0xfe80 && offset < 0xfea0) || (offset >= 0xfd40 && offset < 0xfd60))
{
- data = m_sid->read(space, offset & 0x1f);
+ data = m_sid->read(offset & 0x1f);
}
else if (offset >= 0xfd80 && offset < 0xfd90)
{
- data = m_joy->joy_r(space, 0);
+ data = m_joy->joy_r(machine().dummy_space(), 0);
}
return data;
@@ -133,11 +133,11 @@ uint8_t plus4_sid_cartridge_device::plus4_cd_r(address_space &space, offs_t offs
// plus4_cd_w - cartridge data write
//-------------------------------------------------
-void plus4_sid_cartridge_device::plus4_cd_w(address_space &space, offs_t offset, uint8_t data, int ba, int cs0, int c1l, int c2l, int cs1, int c1h, int c2h)
+void plus4_sid_cartridge_device::plus4_cd_w(offs_t offset, uint8_t data, int ba, int cs0, int c1l, int c2l, int cs1, int c1h, int c2h)
{
if ((offset >= 0xfe80 && offset < 0xfea0) || (offset >= 0xfd40 && offset < 0xfd60))
{
- m_sid->write(space, offset & 0x1f, data);
+ m_sid->write(offset & 0x1f, data);
}
}
diff --git a/src/devices/bus/plus4/sid.h b/src/devices/bus/plus4/sid.h
index 90a22fa15c8..1566381e6d2 100644
--- a/src/devices/bus/plus4/sid.h
+++ b/src/devices/bus/plus4/sid.h
@@ -40,8 +40,8 @@ protected:
virtual void device_add_mconfig(machine_config &config) override;
// device_plus4_expansion_card_interface overrides
- virtual uint8_t plus4_cd_r(address_space &space, offs_t offset, uint8_t data, int ba, int cs0, int c1l, int c2l, int cs1, int c1h, int c2h) override;
- virtual void plus4_cd_w(address_space &space, offs_t offset, uint8_t data, int ba, int cs0, int c1l, int c2l, int cs1, int c1h, int c2h) override;
+ virtual uint8_t plus4_cd_r(offs_t offset, uint8_t data, int ba, int cs0, int c1l, int c2l, int cs1, int c1h, int c2h) override;
+ virtual void plus4_cd_w(offs_t offset, uint8_t data, int ba, int cs0, int c1l, int c2l, int cs1, int c1h, int c2h) override;
virtual void plus4_breset_w(int state);
private:
diff --git a/src/devices/bus/plus4/std.cpp b/src/devices/bus/plus4/std.cpp
index 835ecac7d4a..c8efe4b679f 100644
--- a/src/devices/bus/plus4/std.cpp
+++ b/src/devices/bus/plus4/std.cpp
@@ -47,7 +47,7 @@ void plus4_standard_cartridge_device::device_start()
// plus4_cd_r - cartridge data read
//-------------------------------------------------
-uint8_t plus4_standard_cartridge_device::plus4_cd_r(address_space &space, offs_t offset, uint8_t data, int ba, int cs0, int c1l, int c2l, int cs1, int c1h, int c2h)
+uint8_t plus4_standard_cartridge_device::plus4_cd_r(offs_t offset, uint8_t data, int ba, int cs0, int c1l, int c2l, int cs1, int c1h, int c2h)
{
if (!c1l && m_c1l.bytes())
{
diff --git a/src/devices/bus/plus4/std.h b/src/devices/bus/plus4/std.h
index d154f0bcadc..f1f3ae75328 100644
--- a/src/devices/bus/plus4/std.h
+++ b/src/devices/bus/plus4/std.h
@@ -33,7 +33,7 @@ protected:
virtual void device_start() override;
// device_plus4_expansion_card_interface overrides
- virtual uint8_t plus4_cd_r(address_space &space, offs_t offset, uint8_t data, int ba, int cs0, int c1l, int c2l, int cs1, int c1h, int c2h) override;
+ virtual uint8_t plus4_cd_r(offs_t offset, uint8_t data, int ba, int cs0, int c1l, int c2l, int cs1, int c1h, int c2h) override;
};
diff --git a/src/devices/bus/pofo/ccm.h b/src/devices/bus/pofo/ccm.h
index b7deab09c69..42bfcb4356d 100644
--- a/src/devices/bus/pofo/ccm.h
+++ b/src/devices/bus/pofo/ccm.h
@@ -60,17 +60,6 @@
#define PORTFOLIO_MEMORY_CARD_SLOT_B_TAG "ccmb"
-
-//**************************************************************************
-// INTERFACE CONFIGURATION MACROS
-//**************************************************************************
-
-#define MCFG_PORTFOLIO_MEMORY_CARD_SLOT_ADD(_tag, _slot_intf, _def_slot) \
- MCFG_DEVICE_ADD(_tag, PORTFOLIO_MEMORY_CARD_SLOT, 0) \
- MCFG_DEVICE_SLOT_INTERFACE(_slot_intf, _def_slot, false)
-
-
-
//**************************************************************************
// TYPE DEFINITIONS
//**************************************************************************
@@ -86,8 +75,8 @@ class device_portfolio_memory_card_slot_interface : public device_slot_card_inte
public:
virtual bool cdet() { return 1; }
- virtual uint8_t nrdi_r(address_space &space, offs_t offset) { return 0xff; }
- virtual void nwri_w(address_space &space, offs_t offset, uint8_t data) { }
+ virtual uint8_t nrdi_r(offs_t offset) { return 0xff; }
+ virtual void nwri_w(offs_t offset, uint8_t data) { }
protected:
// construction/destruction
@@ -108,13 +97,23 @@ class portfolio_memory_card_slot_device : public device_t,
{
public:
// construction/destruction
- portfolio_memory_card_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+ template <typename T>
+ portfolio_memory_card_slot_device(machine_config const &mconfig, char const *tag, device_t *owner, T &&opts, char const *dflt)
+ : portfolio_memory_card_slot_device(mconfig, tag, owner, 0)
+ {
+ option_reset();
+ opts(*this);
+ set_default_option(dflt);
+ set_fixed(false);
+ }
+
+ portfolio_memory_card_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock = 0);
// computer interface
bool cdet_r() { return (m_card != nullptr) ? m_card->cdet() : 1; }
- DECLARE_READ8_MEMBER( nrdi_r ) { return (m_card != nullptr) ? m_card->nrdi_r(space, offset) : 0xff; }
- DECLARE_WRITE8_MEMBER( nwri_w ) { if (m_card != nullptr) m_card->nwri_w(space, offset, data); }
+ uint8_t nrdi_r(offs_t offset) { return (m_card != nullptr) ? m_card->nrdi_r(offset) : 0xff; }
+ void nwri_w(offs_t offset, uint8_t data) { if (m_card != nullptr) m_card->nwri_w(offset, data); }
protected:
// device-level overrides
diff --git a/src/devices/bus/pofo/exp.h b/src/devices/bus/pofo/exp.h
index ab0685d28ca..2206d5af2fe 100644
--- a/src/devices/bus/pofo/exp.h
+++ b/src/devices/bus/pofo/exp.h
@@ -54,26 +54,6 @@
#define PORTFOLIO_EXPANSION_SLOT_TAG "exp"
-
-//**************************************************************************
-// INTERFACE CONFIGURATION MACROS
-//**************************************************************************
-
-#define MCFG_PORTFOLIO_EXPANSION_SLOT_ADD(_tag, _clock, _slot_intf, _def_slot) \
- MCFG_DEVICE_ADD(_tag, PORTFOLIO_EXPANSION_SLOT, _clock) \
- MCFG_DEVICE_SLOT_INTERFACE(_slot_intf, _def_slot, false)
-
-#define MCFG_PORTFOLIO_EXPANSION_SLOT_EINT_CALLBACK(_write) \
- downcast<portfolio_expansion_slot_device &>(*device).set_eint_wr_callback(DEVCB_##_write);
-
-#define MCFG_PORTFOLIO_EXPANSION_SLOT_NMIO_CALLBACK(_write) \
- downcast<portfolio_expansion_slot_device &>(*device).set_nmio_wr_callback(DEVCB_##_write);
-
-#define MCFG_PORTFOLIO_EXPANSION_SLOT_WAKE_CALLBACK(_write) \
- downcast<portfolio_expansion_slot_device &>(*device).set_wake_wr_callback(DEVCB_##_write);
-
-
-
//**************************************************************************
// TYPE DEFINITIONS
//**************************************************************************
@@ -92,8 +72,8 @@ public:
virtual uint8_t iack_r() { return 0xff; }
virtual uint8_t eack_r() { return 0xff; }
- virtual uint8_t nrdi_r(address_space &space, offs_t offset, uint8_t data, bool iom, bool bcom, bool ncc1) { return data; }
- virtual void nwri_w(address_space &space, offs_t offset, uint8_t data, bool iom, bool bcom, bool ncc1) { }
+ virtual uint8_t nrdi_r(offs_t offset, uint8_t data, bool iom, bool bcom, bool ncc1) { return data; }
+ virtual void nwri_w(offs_t offset, uint8_t data, bool iom, bool bcom, bool ncc1) { }
virtual WRITE_LINE_MEMBER( iint_w ) { }
@@ -115,11 +95,21 @@ class portfolio_expansion_slot_device : public device_t, public device_slot_inte
{
public:
// construction/destruction
+ template <typename T>
+ portfolio_expansion_slot_device(machine_config const &mconfig, char const *tag, device_t *owner, uint32_t clock, T &&opts, char const *dflt)
+ : portfolio_expansion_slot_device(mconfig, tag, owner, clock)
+ {
+ option_reset();
+ opts(*this);
+ set_default_option(dflt);
+ set_fixed(false);
+ }
+
portfolio_expansion_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- template <class Object> devcb_base &set_eint_wr_callback(Object &&cb) { return m_write_eint.set_callback(std::forward<Object>(cb)); }
- template <class Object> devcb_base &set_nmio_wr_callback(Object &&cb) { return m_write_nmio.set_callback(std::forward<Object>(cb)); }
- template <class Object> devcb_base &set_wake_wr_callback(Object &&cb) { return m_write_wake.set_callback(std::forward<Object>(cb)); }
+ auto eint_wr_callback() { return m_write_eint.bind(); }
+ auto nmio_wr_callback() { return m_write_nmio.bind(); }
+ auto wake_wr_callback() { return m_write_wake.bind(); }
// computer interface
bool nmd1_r() { return (m_card != nullptr) ? m_card->nmd1() : 1; }
@@ -129,8 +119,8 @@ public:
uint8_t iack_r() { return (m_card != nullptr) ? m_card->iack_r() : 0xff; };
uint8_t eack_r() { return (m_card != nullptr) ? m_card->eack_r() : 0xff; };
- uint8_t nrdi_r(address_space &space, offs_t offset, uint8_t data, bool iom, bool bcom, bool ncc1) { return (m_card != nullptr) ? m_card->nrdi_r(space, offset, data, iom, bcom, ncc1) : data; }
- void nwri_w(address_space &space, offs_t offset, uint8_t data, bool iom, bool bcom, bool ncc1) { if (m_card != nullptr) m_card->nwri_w(space, offset, data, iom, bcom, ncc1); }
+ uint8_t nrdi_r(offs_t offset, uint8_t data, bool iom, bool bcom, bool ncc1) { return (m_card != nullptr) ? m_card->nrdi_r(offset, data, iom, bcom, ncc1) : data; }
+ void nwri_w(offs_t offset, uint8_t data, bool iom, bool bcom, bool ncc1) { if (m_card != nullptr) m_card->nwri_w(offset, data, iom, bcom, ncc1); }
WRITE_LINE_MEMBER( iint_w ) { if (m_card != nullptr) m_card->iint_w(state); }
diff --git a/src/devices/bus/pofo/hpc101.cpp b/src/devices/bus/pofo/hpc101.cpp
index 93268e95bb6..d62f1002f7d 100644
--- a/src/devices/bus/pofo/hpc101.cpp
+++ b/src/devices/bus/pofo/hpc101.cpp
@@ -33,28 +33,31 @@ DEFINE_DEVICE_TYPE(POFO_HPC101, pofo_hpc101_device, "pofo_hpc101", "Atari Portfo
// device_add_mconfig - add device configuration
//-------------------------------------------------
-MACHINE_CONFIG_START(pofo_hpc101_device::device_add_mconfig)
+void pofo_hpc101_device::device_add_mconfig(machine_config &config)
+{
I8255A(config, m_ppi);
m_ppi->out_pa_callback().set("cent_data_out", FUNC(output_latch_device::bus_w));
m_ppi->out_pb_callback().set("cent_ctrl_out", FUNC(output_latch_device::bus_w));
m_ppi->in_pc_callback().set("cent_status_in", FUNC(input_buffer_device::bus_r));
- MCFG_DEVICE_ADD(CENTRONICS_TAG, CENTRONICS, centronics_devices, "printer")
- MCFG_CENTRONICS_ACK_HANDLER(WRITELINE("cent_status_in", input_buffer_device, write_bit5))
- MCFG_CENTRONICS_BUSY_HANDLER(WRITELINE("cent_status_in", input_buffer_device, write_bit4))
- MCFG_CENTRONICS_FAULT_HANDLER(WRITELINE("cent_status_in", input_buffer_device, write_bit3))
- MCFG_CENTRONICS_SELECT_HANDLER(WRITELINE("cent_status_in", input_buffer_device, write_bit1))
- MCFG_CENTRONICS_PERROR_HANDLER(WRITELINE("cent_status_in", input_buffer_device, write_bit0))
+ centronics_device &centronics(CENTRONICS(config, CENTRONICS_TAG, centronics_devices, "printer"));
+ centronics.ack_handler().set("cent_status_in", FUNC(input_buffer_device::write_bit5));
+ centronics.busy_handler().set("cent_status_in", FUNC(input_buffer_device::write_bit4));
+ centronics.fault_handler().set("cent_status_in", FUNC(input_buffer_device::write_bit3));
+ centronics.select_handler().set("cent_status_in", FUNC(input_buffer_device::write_bit1));
+ centronics.perror_handler().set("cent_status_in", FUNC(input_buffer_device::write_bit0));
+
+ output_latch_device &cent_data_out(OUTPUT_LATCH(config, "cent_data_out"));
+ centronics.set_output_latch(cent_data_out);
- MCFG_CENTRONICS_OUTPUT_LATCH_ADD("cent_data_out", CENTRONICS_TAG)
- MCFG_DEVICE_ADD("cent_status_in", INPUT_BUFFER, 0)
+ INPUT_BUFFER(config, "cent_status_in");
- MCFG_DEVICE_ADD("cent_ctrl_out", OUTPUT_LATCH, 0)
- MCFG_OUTPUT_LATCH_BIT0_HANDLER(WRITELINE(CENTRONICS_TAG, centronics_device, write_strobe))
- MCFG_OUTPUT_LATCH_BIT1_HANDLER(WRITELINE(CENTRONICS_TAG, centronics_device, write_autofd))
- MCFG_OUTPUT_LATCH_BIT2_HANDLER(WRITELINE(CENTRONICS_TAG, centronics_device, write_init))
- MCFG_OUTPUT_LATCH_BIT3_HANDLER(WRITELINE(CENTRONICS_TAG, centronics_device, write_select_in))
-MACHINE_CONFIG_END
+ output_latch_device &cent_ctrl_out(OUTPUT_LATCH(config, "cent_ctrl_out"));
+ cent_ctrl_out.bit_handler<0>().set(CENTRONICS_TAG, FUNC(centronics_device::write_strobe));
+ cent_ctrl_out.bit_handler<1>().set(CENTRONICS_TAG, FUNC(centronics_device::write_autofd));
+ cent_ctrl_out.bit_handler<2>().set(CENTRONICS_TAG, FUNC(centronics_device::write_init));
+ cent_ctrl_out.bit_handler<3>().set(CENTRONICS_TAG, FUNC(centronics_device::write_select_in));
+}
//**************************************************************************
@@ -96,7 +99,7 @@ void pofo_hpc101_device::device_reset()
// nrdi_r - read
//-------------------------------------------------
-uint8_t pofo_hpc101_device::nrdi_r(address_space &space, offs_t offset, uint8_t data, bool iom, bool bcom, bool ncc1)
+uint8_t pofo_hpc101_device::nrdi_r(offs_t offset, uint8_t data, bool iom, bool bcom, bool ncc1)
{
if (!bcom)
{
@@ -119,7 +122,7 @@ uint8_t pofo_hpc101_device::nrdi_r(address_space &space, offs_t offset, uint8_t
// nwri_w - write
//-------------------------------------------------
-void pofo_hpc101_device::nwri_w(address_space &space, offs_t offset, uint8_t data, bool iom, bool bcom, bool ncc1)
+void pofo_hpc101_device::nwri_w(offs_t offset, uint8_t data, bool iom, bool bcom, bool ncc1)
{
if (!bcom)
{
diff --git a/src/devices/bus/pofo/hpc101.h b/src/devices/bus/pofo/hpc101.h
index 797f95c32d3..fa18b5d6d4d 100644
--- a/src/devices/bus/pofo/hpc101.h
+++ b/src/devices/bus/pofo/hpc101.h
@@ -40,8 +40,8 @@ protected:
// device_portfolio_expansion_slot_interface overrides
bool pdet() override { return 1; }
- virtual uint8_t nrdi_r(address_space &space, offs_t offset, uint8_t data, bool iom, bool bcom, bool ncc1) override;
- virtual void nwri_w(address_space &space, offs_t offset, uint8_t data, bool iom, bool bcom, bool ncc1) override;
+ virtual uint8_t nrdi_r(offs_t offset, uint8_t data, bool iom, bool bcom, bool ncc1) override;
+ virtual void nwri_w(offs_t offset, uint8_t data, bool iom, bool bcom, bool ncc1) override;
private:
required_device<i8255_device> m_ppi;
diff --git a/src/devices/bus/pofo/hpc102.cpp b/src/devices/bus/pofo/hpc102.cpp
index 298b36c7cbe..42bc8b550fe 100644
--- a/src/devices/bus/pofo/hpc102.cpp
+++ b/src/devices/bus/pofo/hpc102.cpp
@@ -99,7 +99,7 @@ uint8_t pofo_hpc102_device::eack_r()
// nrdi_r - read
//-------------------------------------------------
-uint8_t pofo_hpc102_device::nrdi_r(address_space &space, offs_t offset, uint8_t data, bool iom, bool bcom, bool ncc1)
+uint8_t pofo_hpc102_device::nrdi_r(offs_t offset, uint8_t data, bool iom, bool bcom, bool ncc1)
{
if (!bcom)
{
@@ -110,7 +110,7 @@ uint8_t pofo_hpc102_device::nrdi_r(address_space &space, offs_t offset, uint8_t
if (!(offset & 0x08))
{
- data = m_uart->ins8250_r(space, offset & 0x07);
+ data = m_uart->ins8250_r(machine().dummy_space(), offset & 0x07);
}
}
@@ -122,7 +122,7 @@ uint8_t pofo_hpc102_device::nrdi_r(address_space &space, offs_t offset, uint8_t
// nwri_w - write
//-------------------------------------------------
-void pofo_hpc102_device::nwri_w(address_space &space, offs_t offset, uint8_t data, bool iom, bool bcom, bool ncc1)
+void pofo_hpc102_device::nwri_w(offs_t offset, uint8_t data, bool iom, bool bcom, bool ncc1)
{
if (!bcom)
{
@@ -133,7 +133,7 @@ void pofo_hpc102_device::nwri_w(address_space &space, offs_t offset, uint8_t dat
if (!(offset & 0x08))
{
- m_uart->ins8250_w(space, offset & 0x07, data);
+ m_uart->ins8250_w(machine().dummy_space(), offset & 0x07, data);
}
}
}
diff --git a/src/devices/bus/pofo/hpc102.h b/src/devices/bus/pofo/hpc102.h
index bfe91e9f459..c7168b12787 100644
--- a/src/devices/bus/pofo/hpc102.h
+++ b/src/devices/bus/pofo/hpc102.h
@@ -42,8 +42,8 @@ protected:
virtual uint8_t eack_r() override;
- virtual uint8_t nrdi_r(address_space &space, offs_t offset, uint8_t data, bool iom, bool bcom, bool ncc1) override;
- virtual void nwri_w(address_space &space, offs_t offset, uint8_t data, bool iom, bool bcom, bool ncc1) override;
+ virtual uint8_t nrdi_r(offs_t offset, uint8_t data, bool iom, bool bcom, bool ncc1) override;
+ virtual void nwri_w(offs_t offset, uint8_t data, bool iom, bool bcom, bool ncc1) override;
private:
required_device<ins8250_device> m_uart;
diff --git a/src/devices/bus/pofo/hpc104.cpp b/src/devices/bus/pofo/hpc104.cpp
index a6de6852e78..a6e66f13da8 100644
--- a/src/devices/bus/pofo/hpc104.cpp
+++ b/src/devices/bus/pofo/hpc104.cpp
@@ -31,14 +31,15 @@ DEFINE_DEVICE_TYPE(POFO_HPC104_2, pofo_hpc104_2_device, "pofo_hpc104_2", "Atari
// device_add_mconfig - add device configuration
//-------------------------------------------------
-MACHINE_CONFIG_START(pofo_hpc104_device::device_add_mconfig)
- MCFG_PORTFOLIO_MEMORY_CARD_SLOT_ADD(PORTFOLIO_MEMORY_CARD_SLOT_B_TAG, portfolio_memory_cards, nullptr)
+void pofo_hpc104_device::device_add_mconfig(machine_config &config)
+{
+ PORTFOLIO_MEMORY_CARD_SLOT(config, m_ccm, portfolio_memory_cards, nullptr);
- MCFG_PORTFOLIO_EXPANSION_SLOT_ADD(PORTFOLIO_EXPANSION_SLOT_TAG, XTAL(4'915'200), portfolio_expansion_cards, nullptr)
- MCFG_PORTFOLIO_EXPANSION_SLOT_EINT_CALLBACK(WRITELINE(DEVICE_SELF_OWNER, portfolio_expansion_slot_device, eint_w))
- MCFG_PORTFOLIO_EXPANSION_SLOT_NMIO_CALLBACK(WRITELINE(DEVICE_SELF_OWNER, portfolio_expansion_slot_device, nmio_w))
- MCFG_PORTFOLIO_EXPANSION_SLOT_WAKE_CALLBACK(WRITELINE(DEVICE_SELF_OWNER, portfolio_expansion_slot_device, wake_w))
-MACHINE_CONFIG_END
+ PORTFOLIO_EXPANSION_SLOT(config, m_exp, XTAL(4'915'200), portfolio_expansion_cards, nullptr);
+ m_exp->eint_wr_callback().set(DEVICE_SELF_OWNER, FUNC(portfolio_expansion_slot_device::eint_w));
+ m_exp->nmio_wr_callback().set(DEVICE_SELF_OWNER, FUNC(portfolio_expansion_slot_device::nmio_w));
+ m_exp->wake_wr_callback().set(DEVICE_SELF_OWNER, FUNC(portfolio_expansion_slot_device::wake_w));
+}
//-------------------------------------------------
@@ -146,15 +147,15 @@ void pofo_hpc104_device::device_reset()
// nrdi_r - read
//-------------------------------------------------
-uint8_t pofo_hpc104_device::nrdi_r(address_space &space, offs_t offset, uint8_t data, bool iom, bool bcom, bool ncc1)
+uint8_t pofo_hpc104_device::nrdi_r(offs_t offset, uint8_t data, bool iom, bool bcom, bool ncc1)
{
- data = m_exp->nrdi_r(space, offset, data, iom, bcom, m_ncc1_out || ncc1);
+ data = m_exp->nrdi_r(offset, data, iom, bcom, m_ncc1_out || ncc1);
if (!iom)
{
if (!(!m_ncc1_out || ncc1))
{
- data = m_ccm->nrdi_r(space, offset & 0x1ffff);
+ data = m_ccm->nrdi_r(offset & 0x1ffff);
if (LOG) logerror("%s %s CCM1 read %05x:%02x\n", machine().time().as_string(), machine().describe_context(), offset & 0x1ffff, data);
}
@@ -183,9 +184,9 @@ uint8_t pofo_hpc104_device::nrdi_r(address_space &space, offs_t offset, uint8_t
// nwri_w - write
//-------------------------------------------------
-void pofo_hpc104_device::nwri_w(address_space &space, offs_t offset, uint8_t data, bool iom, bool bcom, bool ncc1)
+void pofo_hpc104_device::nwri_w(offs_t offset, uint8_t data, bool iom, bool bcom, bool ncc1)
{
- m_exp->nwri_w(space, offset, data, iom, bcom, m_ncc1_out || ncc1);
+ m_exp->nwri_w(offset, data, iom, bcom, m_ncc1_out || ncc1);
if (!iom)
{
@@ -193,7 +194,7 @@ void pofo_hpc104_device::nwri_w(address_space &space, offs_t offset, uint8_t dat
{
if (LOG) logerror("%s %s CCM1 write %05x:%02x\n", machine().time().as_string(), machine().describe_context(), offset & 0x1ffff, data);
- m_ccm->nwri_w(space, offset & 0x1ffff, data);
+ m_ccm->nwri_w(offset & 0x1ffff, data);
}
if (m_sw1)
diff --git a/src/devices/bus/pofo/hpc104.h b/src/devices/bus/pofo/hpc104.h
index f863a45f39b..042bece210e 100644
--- a/src/devices/bus/pofo/hpc104.h
+++ b/src/devices/bus/pofo/hpc104.h
@@ -50,8 +50,8 @@ protected:
// device_portfolio_expansion_slot_interface overrides
virtual bool nmd1() override { return m_ccm->cdet_r(); }
- virtual uint8_t nrdi_r(address_space &space, offs_t offset, uint8_t data, bool iom, bool bcom, bool ncc1) override;
- virtual void nwri_w(address_space &space, offs_t offset, uint8_t data, bool iom, bool bcom, bool ncc1) override;
+ virtual uint8_t nrdi_r(offs_t offset, uint8_t data, bool iom, bool bcom, bool ncc1) override;
+ virtual void nwri_w(offs_t offset, uint8_t data, bool iom, bool bcom, bool ncc1) override;
virtual WRITE_LINE_MEMBER( iint_w ) override { m_exp->iint_w(state); }
diff --git a/src/devices/bus/pofo/ram.cpp b/src/devices/bus/pofo/ram.cpp
index 6ef861a0b5d..5498a9b8c32 100644
--- a/src/devices/bus/pofo/ram.cpp
+++ b/src/devices/bus/pofo/ram.cpp
@@ -48,7 +48,7 @@ void portfolio_ram_card_device::device_start()
// nrdi_r - read
//-------------------------------------------------
-uint8_t portfolio_ram_card_device::nrdi_r(address_space &space, offs_t offset)
+uint8_t portfolio_ram_card_device::nrdi_r(offs_t offset)
{
return m_nvram[offset];
}
@@ -58,7 +58,7 @@ uint8_t portfolio_ram_card_device::nrdi_r(address_space &space, offs_t offset)
// nwri_w - write
//-------------------------------------------------
-void portfolio_ram_card_device::nwri_w(address_space &space, offs_t offset, uint8_t data)
+void portfolio_ram_card_device::nwri_w(offs_t offset, uint8_t data)
{
m_nvram[offset] = data;
}
diff --git a/src/devices/bus/pofo/ram.h b/src/devices/bus/pofo/ram.h
index 9d126b51a2c..2c19f807816 100644
--- a/src/devices/bus/pofo/ram.h
+++ b/src/devices/bus/pofo/ram.h
@@ -42,8 +42,8 @@ protected:
// device_portfolio_memory_card_slot_interface overrides
virtual bool cdet() override { return 0; }
- virtual uint8_t nrdi_r(address_space &space, offs_t offset) override;
- virtual void nwri_w(address_space &space, offs_t offset, uint8_t data) override;
+ virtual uint8_t nrdi_r(offs_t offset) override;
+ virtual void nwri_w(offs_t offset, uint8_t data) override;
};
diff --git a/src/devices/bus/pofo/rom.cpp b/src/devices/bus/pofo/rom.cpp
index 8155444783a..ac336eb0b77 100644
--- a/src/devices/bus/pofo/rom.cpp
+++ b/src/devices/bus/pofo/rom.cpp
@@ -46,7 +46,7 @@ void portfolio_rom_card_device::device_start()
// nrdi_r - read
//-------------------------------------------------
-uint8_t portfolio_rom_card_device::nrdi_r(address_space &space, offs_t offset)
+uint8_t portfolio_rom_card_device::nrdi_r(offs_t offset)
{
return m_rom[offset];
}
diff --git a/src/devices/bus/pofo/rom.h b/src/devices/bus/pofo/rom.h
index eab0ff1fde4..6df19402a36 100644
--- a/src/devices/bus/pofo/rom.h
+++ b/src/devices/bus/pofo/rom.h
@@ -35,7 +35,7 @@ protected:
// device_portfolio_memory_card_slot_interface overrides
virtual bool cdet() override { return 0; }
- virtual uint8_t nrdi_r(address_space &space, offs_t offset) override;
+ virtual uint8_t nrdi_r(offs_t offset) override;
};
diff --git a/src/devices/bus/psi_kbd/ergoline.cpp b/src/devices/bus/psi_kbd/ergoline.cpp
index 20c02052221..7b892cf861b 100644
--- a/src/devices/bus/psi_kbd/ergoline.cpp
+++ b/src/devices/bus/psi_kbd/ergoline.cpp
@@ -58,11 +58,12 @@ const tiny_rom_entry *ergoline_keyboard_device::device_rom_region() const
return ROM_NAME(kbd_pcb);
}
-MACHINE_CONFIG_START(ergoline_keyboard_device::device_add_mconfig)
- MCFG_DEVICE_ADD("maincpu", I8031, XTAL(5'529'600))
- MCFG_DEVICE_PROGRAM_MAP(kbd_mem)
- MCFG_DEVICE_IO_MAP(kbd_io)
-MACHINE_CONFIG_END
+void ergoline_keyboard_device::device_add_mconfig(machine_config &config)
+{
+ i8031_device &maincpu(I8031(config, "maincpu", XTAL(5'529'600)));
+ maincpu.set_addrmap(AS_PROGRAM, &ergoline_keyboard_device::kbd_mem);
+ maincpu.set_addrmap(AS_IO, &ergoline_keyboard_device::kbd_io);
+}
//**************************************************************************
diff --git a/src/devices/bus/psi_kbd/psi_kbd.h b/src/devices/bus/psi_kbd/psi_kbd.h
index 8e62b1df17b..39aaa84d9d3 100644
--- a/src/devices/bus/psi_kbd/psi_kbd.h
+++ b/src/devices/bus/psi_kbd/psi_kbd.h
@@ -30,21 +30,8 @@
#pragma once
-
-//**************************************************************************
-// INTERFACE CONFIGURATION MACROS
-//**************************************************************************
-
-#define MCFG_PSI_KEYBOARD_INTERFACE_ADD(_tag, _def_slot) \
- MCFG_DEVICE_ADD(_tag, PSI_KEYBOARD_INTERFACE, 0) \
- MCFG_DEVICE_SLOT_INTERFACE(psi_keyboard_devices, _def_slot, false)
-
-#define MCFG_PSI_KEYBOARD_RX_HANDLER(_devcb) \
- downcast<psi_keyboard_bus_device &>(*device).set_rx_handler(DEVCB_##_devcb);
-
-#define MCFG_PSI_KEYBOARD_KEY_STROBE_HANDLER(_devcb) \
- downcast<psi_keyboard_bus_device &>(*device).set_key_strobe_handler(DEVCB_##_devcb);
-
+// supported devices
+void psi_keyboard_devices(device_slot_interface &device);
//**************************************************************************
// TYPE DEFINITIONS
@@ -58,12 +45,20 @@ class psi_keyboard_bus_device : public device_t, public device_slot_interface
{
public:
// construction/destruction
+ psi_keyboard_bus_device(const machine_config &mconfig, const char *tag, device_t *owner, const char *dflt)
+ : psi_keyboard_bus_device(mconfig, tag, owner, (uint32_t)0)
+ {
+ option_reset();
+ psi_keyboard_devices(*this);
+ set_default_option(dflt);
+ set_fixed(false);
+ }
psi_keyboard_bus_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
virtual ~psi_keyboard_bus_device();
// callbacks
- template <class Object> devcb_base &set_rx_handler(Object &&cb) { return m_rx_handler.set_callback(std::forward<Object>(cb)); }
- template <class Object> devcb_base &set_key_strobe_handler(Object &&cb) { return m_key_strobe_handler.set_callback(std::forward<Object>(cb)); }
+ auto rx() { return m_rx_handler.bind(); }
+ auto key_strobe() { return m_key_strobe_handler.bind(); }
// called from keyboard
DECLARE_WRITE_LINE_MEMBER( rx_w ) { m_rx_handler(state); }
@@ -104,12 +99,7 @@ protected:
psi_keyboard_bus_device *m_host;
};
-
// device type definition
DECLARE_DEVICE_TYPE(PSI_KEYBOARD_INTERFACE, psi_keyboard_bus_device)
-// supported devices
-void psi_keyboard_devices(device_slot_interface &device);
-
-
#endif // MAME_BUS_PSI_KBD_PSI_KBD_H
diff --git a/src/devices/bus/psx/ctlrport.cpp b/src/devices/bus/psx/ctlrport.cpp
index b3c34f8b2b5..05aae5c5b72 100644
--- a/src/devices/bus/psx/ctlrport.cpp
+++ b/src/devices/bus/psx/ctlrport.cpp
@@ -25,9 +25,10 @@ void psx_controller_port_device::device_config_complete()
m_dev = dynamic_cast<device_psx_controller_interface *>(get_card_device());
}
-MACHINE_CONFIG_START(psx_controller_port_device::device_add_mconfig)
- MCFG_PSXCARD_ADD("card")
-MACHINE_CONFIG_END
+void psx_controller_port_device::device_add_mconfig(machine_config &config)
+{
+ PSXCARD(config, m_card, 0);
+}
void psx_controller_port_device::disable_card(bool state)
{
diff --git a/src/devices/bus/psx/ctlrport.h b/src/devices/bus/psx/ctlrport.h
index 718ac8fb35d..2058cf4868c 100644
--- a/src/devices/bus/psx/ctlrport.h
+++ b/src/devices/bus/psx/ctlrport.h
@@ -77,11 +77,6 @@ private:
required_ioport m_pad1;
};
-#define MCFG_PSX_CONTROLLER_PORTS_DSR_HANDLER(_devcb) \
- downcast<psxcontrollerports_device &>(*device).set_dsr_handler(DEVCB_##_devcb);
-
-#define MCFG_PSX_CONTROLLER_PORTS_RXD_HANDLER(_devcb) \
- downcast<psxcontrollerports_device &>(*device).set_rxd_handler(DEVCB_##_devcb);
class psxcontrollerports_device : public device_t
{
diff --git a/src/devices/bus/psx/gamebooster.cpp b/src/devices/bus/psx/gamebooster.cpp
index 3513f7714e2..309ff1949a3 100644
--- a/src/devices/bus/psx/gamebooster.cpp
+++ b/src/devices/bus/psx/gamebooster.cpp
@@ -82,8 +82,8 @@ READ16_MEMBER(psx_gamebooster_device::exp_r)
offset -= 0x20000;
uint16_t retval = 0;;
- if (mem_mask & 0xff00) retval |= (m_cartslot->read_rom(space, (offset*2)+1))<<8;
- if (mem_mask & 0x00ff) retval |= m_cartslot->read_rom(space, (offset*2)+0);
+ if (mem_mask & 0xff00) retval |= (m_cartslot->read_rom((offset*2)+1))<<8;
+ if (mem_mask & 0x00ff) retval |= m_cartslot->read_rom((offset*2)+0);
return retval;
}
@@ -107,8 +107,8 @@ WRITE16_MEMBER(psx_gamebooster_device::exp_w)
offset -= 0x20000;
logerror("%s: psx_gamebooster_device::exp_w %04x %04x\n", machine().describe_context(), offset*2, data);
- if (mem_mask & 0xff00) m_cartslot->write_bank(space, (offset*2)+1, data>>8);
- if (mem_mask & 0x00ff) m_cartslot->write_bank(space, (offset*2)+0, data); // send this 2nd or it erases the bank with the above
+ if (mem_mask & 0xff00) m_cartslot->write_bank((offset*2)+1, data>>8);
+ if (mem_mask & 0x00ff) m_cartslot->write_bank((offset*2)+0, data); // send this 2nd or it erases the bank with the above
}
else
diff --git a/src/devices/bus/psx/memcard.h b/src/devices/bus/psx/memcard.h
index 51ac4f044ba..e292d89e589 100644
--- a/src/devices/bus/psx/memcard.h
+++ b/src/devices/bus/psx/memcard.h
@@ -8,8 +8,6 @@
class psx_controller_port_device;
-#define MCFG_PSXCARD_ADD(_tag) \
- MCFG_DEVICE_ADD(_tag, PSXCARD, 0)
class psxcard_device : public device_t,
public device_image_interface
diff --git a/src/devices/bus/ql/cst_q_plus4.cpp b/src/devices/bus/ql/cst_q_plus4.cpp
index 52f1602ba5b..96269dc6ef5 100644
--- a/src/devices/bus/ql/cst_q_plus4.cpp
+++ b/src/devices/bus/ql/cst_q_plus4.cpp
@@ -50,21 +50,22 @@ const tiny_rom_entry *cst_q_plus4_device::device_rom_region() const
// device_add_mconfig - add device configuration
//-------------------------------------------------
-MACHINE_CONFIG_START(cst_q_plus4_device::device_add_mconfig)
- MCFG_DEVICE_ADD(MC6821_TAG, PIA6821, 0)
+void cst_q_plus4_device::device_add_mconfig(machine_config &config)
+{
+ PIA6821(config, MC6821_TAG, 0);
- MCFG_DEVICE_ADD("exp1", QL_EXPANSION_SLOT, DERIVED_CLOCK(1, 1), ql_expansion_cards, nullptr)
- MCFG_QL_EXPANSION_SLOT_EXTINTL_CALLBACK(WRITELINE(*this, cst_q_plus4_device, exp1_extintl_w))
+ QL_EXPANSION_SLOT(config, m_exp1, DERIVED_CLOCK(1, 1), ql_expansion_cards, nullptr);
+ m_exp1->extintl_wr_callback().set(FUNC(cst_q_plus4_device::exp1_extintl_w));
- MCFG_DEVICE_ADD("exp2", QL_EXPANSION_SLOT, DERIVED_CLOCK(1, 1), ql_expansion_cards, nullptr)
- MCFG_QL_EXPANSION_SLOT_EXTINTL_CALLBACK(WRITELINE(*this, cst_q_plus4_device, exp2_extintl_w))
+ QL_EXPANSION_SLOT(config, m_exp2, DERIVED_CLOCK(1, 1), ql_expansion_cards, nullptr);
+ m_exp2->extintl_wr_callback().set(FUNC(cst_q_plus4_device::exp2_extintl_w));
- MCFG_DEVICE_ADD("exp3", QL_EXPANSION_SLOT, DERIVED_CLOCK(1, 1), ql_expansion_cards, nullptr)
- MCFG_QL_EXPANSION_SLOT_EXTINTL_CALLBACK(WRITELINE(*this, cst_q_plus4_device, exp3_extintl_w))
+ QL_EXPANSION_SLOT(config, m_exp3, DERIVED_CLOCK(1, 1), ql_expansion_cards, nullptr);
+ m_exp3->extintl_wr_callback().set(FUNC(cst_q_plus4_device::exp3_extintl_w));
- MCFG_DEVICE_ADD("exp4", QL_EXPANSION_SLOT, DERIVED_CLOCK(1, 1), ql_expansion_cards, nullptr)
- MCFG_QL_EXPANSION_SLOT_EXTINTL_CALLBACK(WRITELINE(*this, cst_q_plus4_device, exp4_extintl_w))
-MACHINE_CONFIG_END
+ QL_EXPANSION_SLOT(config, m_exp4, DERIVED_CLOCK(1, 1), ql_expansion_cards, nullptr);
+ m_exp4->extintl_wr_callback().set(FUNC(cst_q_plus4_device::exp4_extintl_w));
+}
@@ -105,17 +106,17 @@ void cst_q_plus4_device::device_start()
// read -
//-------------------------------------------------
-uint8_t cst_q_plus4_device::read(address_space &space, offs_t offset, uint8_t data)
+uint8_t cst_q_plus4_device::read(offs_t offset, uint8_t data)
{
if (offset >= 0xc000 && offset < 0xc200)
{
data = m_rom->base()[offset & 0x1fff];
}
- data = m_exp1->read(space, offset, data);
- data = m_exp2->read(space, offset, data);
- data = m_exp3->read(space, offset, data);
- data = m_exp4->read(space, offset, data);
+ data = m_exp1->read(offset, data);
+ data = m_exp2->read(offset, data);
+ data = m_exp3->read(offset, data);
+ data = m_exp4->read(offset, data);
return data;
}
@@ -125,10 +126,10 @@ uint8_t cst_q_plus4_device::read(address_space &space, offs_t offset, uint8_t da
// write -
//-------------------------------------------------
-void cst_q_plus4_device::write(address_space &space, offs_t offset, uint8_t data)
+void cst_q_plus4_device::write(offs_t offset, uint8_t data)
{
- m_exp1->write(space, offset, data);
- m_exp2->write(space, offset, data);
- m_exp3->write(space, offset, data);
- m_exp4->write(space, offset, data);
+ m_exp1->write(offset, data);
+ m_exp2->write(offset, data);
+ m_exp3->write(offset, data);
+ m_exp4->write(offset, data);
}
diff --git a/src/devices/bus/ql/cst_q_plus4.h b/src/devices/bus/ql/cst_q_plus4.h
index 0eff45e3840..4c8ea616f51 100644
--- a/src/devices/bus/ql/cst_q_plus4.h
+++ b/src/devices/bus/ql/cst_q_plus4.h
@@ -37,8 +37,8 @@ protected:
virtual void device_add_mconfig(machine_config &config) override;
// device_ql_expansion_card_interface overrides
- virtual uint8_t read(address_space &space, offs_t offset, uint8_t data) override;
- virtual void write(address_space &space, offs_t offset, uint8_t data) override;
+ virtual uint8_t read(offs_t offset, uint8_t data) override;
+ virtual void write(offs_t offset, uint8_t data) override;
private:
DECLARE_WRITE_LINE_MEMBER( exp1_extintl_w ) { m_exp1_extinl = state; update_extintl(); }
diff --git a/src/devices/bus/ql/cst_qdisc.cpp b/src/devices/bus/ql/cst_qdisc.cpp
index a3940d41b1a..2fe46dc4f5e 100644
--- a/src/devices/bus/ql/cst_qdisc.cpp
+++ b/src/devices/bus/ql/cst_qdisc.cpp
@@ -71,7 +71,7 @@ void cst_ql_disc_interface_device::device_start()
// read -
//-------------------------------------------------
-uint8_t cst_ql_disc_interface_device::read(address_space &space, offs_t offset, uint8_t data)
+uint8_t cst_ql_disc_interface_device::read(offs_t offset, uint8_t data)
{
return data;
}
@@ -81,6 +81,6 @@ uint8_t cst_ql_disc_interface_device::read(address_space &space, offs_t offset,
// write -
//-------------------------------------------------
-void cst_ql_disc_interface_device::write(address_space &space, offs_t offset, uint8_t data)
+void cst_ql_disc_interface_device::write(offs_t offset, uint8_t data)
{
}
diff --git a/src/devices/bus/ql/cst_qdisc.h b/src/devices/bus/ql/cst_qdisc.h
index 4bbcbd0913f..fdd492f1230 100644
--- a/src/devices/bus/ql/cst_qdisc.h
+++ b/src/devices/bus/ql/cst_qdisc.h
@@ -36,8 +36,8 @@ protected:
virtual void device_start() override;
// device_ql_expansion_card_interface overrides
- virtual uint8_t read(address_space &space, offs_t offset, uint8_t data) override;
- virtual void write(address_space &space, offs_t offset, uint8_t data) override;
+ virtual uint8_t read(offs_t offset, uint8_t data) override;
+ virtual void write(offs_t offset, uint8_t data) override;
};
diff --git a/src/devices/bus/ql/cumana_fdi.cpp b/src/devices/bus/ql/cumana_fdi.cpp
index a8d1b7c376b..204dea12608 100644
--- a/src/devices/bus/ql/cumana_fdi.cpp
+++ b/src/devices/bus/ql/cumana_fdi.cpp
@@ -71,7 +71,7 @@ void cumana_floppy_disk_interface_device::device_start()
// read -
//-------------------------------------------------
-uint8_t cumana_floppy_disk_interface_device::read(address_space &space, offs_t offset, uint8_t data)
+uint8_t cumana_floppy_disk_interface_device::read(offs_t offset, uint8_t data)
{
return data;
}
@@ -81,6 +81,6 @@ uint8_t cumana_floppy_disk_interface_device::read(address_space &space, offs_t o
// write -
//-------------------------------------------------
-void cumana_floppy_disk_interface_device::write(address_space &space, offs_t offset, uint8_t data)
+void cumana_floppy_disk_interface_device::write(offs_t offset, uint8_t data)
{
}
diff --git a/src/devices/bus/ql/cumana_fdi.h b/src/devices/bus/ql/cumana_fdi.h
index a0da6952cab..2080251fcf3 100644
--- a/src/devices/bus/ql/cumana_fdi.h
+++ b/src/devices/bus/ql/cumana_fdi.h
@@ -35,8 +35,8 @@ protected:
virtual void device_start() override;
// device_ql_expansion_card_interface overrides
- virtual uint8_t read(address_space &space, offs_t offset, uint8_t data) override;
- virtual void write(address_space &space, offs_t offset, uint8_t data) override;
+ virtual uint8_t read(offs_t offset, uint8_t data) override;
+ virtual void write(offs_t offset, uint8_t data) override;
};
diff --git a/src/devices/bus/ql/exp.h b/src/devices/bus/ql/exp.h
index ed5febc4854..43e8a7b77d5 100644
--- a/src/devices/bus/ql/exp.h
+++ b/src/devices/bus/ql/exp.h
@@ -49,24 +49,6 @@
//**************************************************************************
-// INTERFACE CONFIGURATION MACROS
-//**************************************************************************
-
-#define MCFG_QL_EXPANSION_SLOT_IPL0L_CALLBACK(_write) \
- downcast<ql_expansion_slot_device &>(*device).set_ipl0l_wr_callback(DEVCB_##_write);
-
-#define MCFG_QL_EXPANSION_SLOT_IPL1L_CALLBACK(_write) \
- downcast<ql_expansion_slot_device &>(*device).set_ipl1l_wr_callback(DEVCB_##_write);
-
-#define MCFG_QL_EXPANSION_SLOT_BERRL_CALLBACK(_write) \
- downcast<ql_expansion_slot_device &>(*device).set_berrl_wr_callback(DEVCB_##_write);
-
-#define MCFG_QL_EXPANSION_SLOT_EXTINTL_CALLBACK(_write) \
- downcast<ql_expansion_slot_device &>(*device).set_extintl_wr_callback(DEVCB_##_write);
-
-
-
-//**************************************************************************
// TYPE DEFINITIONS
//**************************************************************************
@@ -80,8 +62,8 @@ class device_ql_expansion_card_interface : public device_slot_card_interface
public:
virtual void romoeh_w(int state) { m_romoeh = state; }
- virtual uint8_t read(address_space &space, offs_t offset, uint8_t data) { return data; }
- virtual void write(address_space &space, offs_t offset, uint8_t data) { }
+ virtual uint8_t read(offs_t offset, uint8_t data) { return data; }
+ virtual void write(offs_t offset, uint8_t data) { }
protected:
// construction/destruction
@@ -112,14 +94,14 @@ public:
}
ql_expansion_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- template <class Object> devcb_base &set_ipl0l_wr_callback(Object &&cb) { return m_write_ipl0l.set_callback(std::forward<Object>(cb)); }
- template <class Object> devcb_base &set_ipl1l_wr_callback(Object &&cb) { return m_write_ipl1l.set_callback(std::forward<Object>(cb)); }
- template <class Object> devcb_base &set_berrl_wr_callback(Object &&cb) { return m_write_berrl.set_callback(std::forward<Object>(cb)); }
- template <class Object> devcb_base &set_extintl_wr_callback(Object &&cb) { return m_write_extintl.set_callback(std::forward<Object>(cb)); }
+ auto ipl0l_wr_callback() { return m_write_ipl0l.bind(); }
+ auto ipl1l_wr_callback() { return m_write_ipl1l.bind(); }
+ auto berrl_wr_callback() { return m_write_berrl.bind(); }
+ auto extintl_wr_callback() { return m_write_extintl.bind(); }
// computer interface
- uint8_t read(address_space &space, offs_t offset, uint8_t data) { if (m_card) data = m_card->read(space, offset, data); return data; }
- void write(address_space &space, offs_t offset, uint8_t data) { if (m_card) m_card->write(space, offset, data); }
+ uint8_t read(offs_t offset, uint8_t data) { if (m_card) data = m_card->read(offset, data); return data; }
+ void write(offs_t offset, uint8_t data) { if (m_card) m_card->write(offset, data); }
DECLARE_WRITE_LINE_MEMBER( romoeh_w ) { if (m_card) m_card->romoeh_w(state); }
// card interface
diff --git a/src/devices/bus/ql/kempston_di.cpp b/src/devices/bus/ql/kempston_di.cpp
index 599e9bebcc7..1535f171ff6 100644
--- a/src/devices/bus/ql/kempston_di.cpp
+++ b/src/devices/bus/ql/kempston_di.cpp
@@ -69,7 +69,7 @@ void kempston_disk_interface_device::device_start()
// read -
//-------------------------------------------------
-uint8_t kempston_disk_interface_device::read(address_space &space, offs_t offset, uint8_t data)
+uint8_t kempston_disk_interface_device::read(offs_t offset, uint8_t data)
{
return data;
}
@@ -79,6 +79,6 @@ uint8_t kempston_disk_interface_device::read(address_space &space, offs_t offset
// write -
//-------------------------------------------------
-void kempston_disk_interface_device::write(address_space &space, offs_t offset, uint8_t data)
+void kempston_disk_interface_device::write(offs_t offset, uint8_t data)
{
}
diff --git a/src/devices/bus/ql/kempston_di.h b/src/devices/bus/ql/kempston_di.h
index e37c3d7f6b7..cc75a5fe0fc 100644
--- a/src/devices/bus/ql/kempston_di.h
+++ b/src/devices/bus/ql/kempston_di.h
@@ -35,8 +35,8 @@ protected:
virtual void device_start() override;
// device_ql_expansion_card_interface overrides
- virtual uint8_t read(address_space &space, offs_t offset, uint8_t data) override;
- virtual void write(address_space &space, offs_t offset, uint8_t data) override;
+ virtual uint8_t read(offs_t offset, uint8_t data) override;
+ virtual void write(offs_t offset, uint8_t data) override;
};
diff --git a/src/devices/bus/ql/miracle_gold_card.cpp b/src/devices/bus/ql/miracle_gold_card.cpp
index a7acd24e2d7..bf6be7fe136 100644
--- a/src/devices/bus/ql/miracle_gold_card.cpp
+++ b/src/devices/bus/ql/miracle_gold_card.cpp
@@ -71,7 +71,7 @@ void miracle_gold_card_device::device_start()
// read -
//-------------------------------------------------
-uint8_t miracle_gold_card_device::read(address_space &space, offs_t offset, uint8_t data)
+uint8_t miracle_gold_card_device::read(offs_t offset, uint8_t data)
{
return data;
}
@@ -81,6 +81,6 @@ uint8_t miracle_gold_card_device::read(address_space &space, offs_t offset, uint
// write -
//-------------------------------------------------
-void miracle_gold_card_device::write(address_space &space, offs_t offset, uint8_t data)
+void miracle_gold_card_device::write(offs_t offset, uint8_t data)
{
}
diff --git a/src/devices/bus/ql/miracle_gold_card.h b/src/devices/bus/ql/miracle_gold_card.h
index feea55de78c..7ed9d0e2eb8 100644
--- a/src/devices/bus/ql/miracle_gold_card.h
+++ b/src/devices/bus/ql/miracle_gold_card.h
@@ -35,8 +35,8 @@ protected:
virtual void device_start() override;
// device_ql_expansion_card_interface overrides
- virtual uint8_t read(address_space &space, offs_t offset, uint8_t data) override;
- virtual void write(address_space &space, offs_t offset, uint8_t data) override;
+ virtual uint8_t read(offs_t offset, uint8_t data) override;
+ virtual void write(offs_t offset, uint8_t data) override;
};
diff --git a/src/devices/bus/ql/miracle_hd.cpp b/src/devices/bus/ql/miracle_hd.cpp
index 146945737a2..f2f16715c72 100644
--- a/src/devices/bus/ql/miracle_hd.cpp
+++ b/src/devices/bus/ql/miracle_hd.cpp
@@ -69,7 +69,7 @@ void miracle_hard_disk_device::device_start()
// read -
//-------------------------------------------------
-uint8_t miracle_hard_disk_device::read(address_space &space, offs_t offset, uint8_t data)
+uint8_t miracle_hard_disk_device::read(offs_t offset, uint8_t data)
{
return data;
}
@@ -79,6 +79,6 @@ uint8_t miracle_hard_disk_device::read(address_space &space, offs_t offset, uint
// write -
//-------------------------------------------------
-void miracle_hard_disk_device::write(address_space &space, offs_t offset, uint8_t data)
+void miracle_hard_disk_device::write(offs_t offset, uint8_t data)
{
}
diff --git a/src/devices/bus/ql/miracle_hd.h b/src/devices/bus/ql/miracle_hd.h
index 0bcd260bb87..983dce66f8b 100644
--- a/src/devices/bus/ql/miracle_hd.h
+++ b/src/devices/bus/ql/miracle_hd.h
@@ -36,8 +36,8 @@ protected:
virtual void device_start() override;
// device_ql_rom_cartridge_card_interface overrides
- virtual uint8_t read(address_space &space, offs_t offset, uint8_t data) override;
- virtual void write(address_space &space, offs_t offset, uint8_t data) override;
+ virtual uint8_t read(offs_t offset, uint8_t data) override;
+ virtual void write(offs_t offset, uint8_t data) override;
};
diff --git a/src/devices/bus/ql/mp_fdi.cpp b/src/devices/bus/ql/mp_fdi.cpp
index 06324a4be67..4e2a90ce52d 100644
--- a/src/devices/bus/ql/mp_fdi.cpp
+++ b/src/devices/bus/ql/mp_fdi.cpp
@@ -69,7 +69,7 @@ void micro_peripherals_floppy_disk_interface_device::device_start()
// read -
//-------------------------------------------------
-uint8_t micro_peripherals_floppy_disk_interface_device::read(address_space &space, offs_t offset, uint8_t data)
+uint8_t micro_peripherals_floppy_disk_interface_device::read(offs_t offset, uint8_t data)
{
return data;
}
@@ -79,6 +79,6 @@ uint8_t micro_peripherals_floppy_disk_interface_device::read(address_space &spac
// write -
//-------------------------------------------------
-void micro_peripherals_floppy_disk_interface_device::write(address_space &space, offs_t offset, uint8_t data)
+void micro_peripherals_floppy_disk_interface_device::write(offs_t offset, uint8_t data)
{
}
diff --git a/src/devices/bus/ql/mp_fdi.h b/src/devices/bus/ql/mp_fdi.h
index 9939e540ba7..3fc9d9d8c83 100644
--- a/src/devices/bus/ql/mp_fdi.h
+++ b/src/devices/bus/ql/mp_fdi.h
@@ -34,8 +34,8 @@ protected:
virtual void device_start() override;
// device_ql_expansion_card_interface overrides
- virtual uint8_t read(address_space &space, offs_t offset, uint8_t data) override;
- virtual void write(address_space &space, offs_t offset, uint8_t data) override;
+ virtual uint8_t read(offs_t offset, uint8_t data) override;
+ virtual void write(offs_t offset, uint8_t data) override;
};
diff --git a/src/devices/bus/ql/opd_basic_master.cpp b/src/devices/bus/ql/opd_basic_master.cpp
index 015fca91a37..b3b6f18dc19 100644
--- a/src/devices/bus/ql/opd_basic_master.cpp
+++ b/src/devices/bus/ql/opd_basic_master.cpp
@@ -67,7 +67,7 @@ void opd_basic_master_device::device_start()
// read -
//-------------------------------------------------
-uint8_t opd_basic_master_device::read(address_space &space, offs_t offset, uint8_t data)
+uint8_t opd_basic_master_device::read(offs_t offset, uint8_t data)
{
return data;
}
@@ -77,6 +77,6 @@ uint8_t opd_basic_master_device::read(address_space &space, offs_t offset, uint8
// write -
//-------------------------------------------------
-void opd_basic_master_device::write(address_space &space, offs_t offset, uint8_t data)
+void opd_basic_master_device::write(offs_t offset, uint8_t data)
{
}
diff --git a/src/devices/bus/ql/opd_basic_master.h b/src/devices/bus/ql/opd_basic_master.h
index d22b50eff8c..3592823dd2b 100644
--- a/src/devices/bus/ql/opd_basic_master.h
+++ b/src/devices/bus/ql/opd_basic_master.h
@@ -35,8 +35,8 @@ protected:
virtual void device_start() override;
// device_ql_expansion_card_interface overrides
- virtual uint8_t read(address_space &space, offs_t offset, uint8_t data) override;
- virtual void write(address_space &space, offs_t offset, uint8_t data) override;
+ virtual uint8_t read(offs_t offset, uint8_t data) override;
+ virtual void write(offs_t offset, uint8_t data) override;
};
diff --git a/src/devices/bus/ql/pcml_qdisk.cpp b/src/devices/bus/ql/pcml_qdisk.cpp
index 7b3d7b25e6c..ed92c569509 100644
--- a/src/devices/bus/ql/pcml_qdisk.cpp
+++ b/src/devices/bus/ql/pcml_qdisk.cpp
@@ -69,7 +69,7 @@ void pcml_q_disk_interface_device::device_start()
// read -
//-------------------------------------------------
-uint8_t pcml_q_disk_interface_device::read(address_space &space, offs_t offset, uint8_t data)
+uint8_t pcml_q_disk_interface_device::read(offs_t offset, uint8_t data)
{
return data;
}
@@ -79,6 +79,6 @@ uint8_t pcml_q_disk_interface_device::read(address_space &space, offs_t offset,
// write -
//-------------------------------------------------
-void pcml_q_disk_interface_device::write(address_space &space, offs_t offset, uint8_t data)
+void pcml_q_disk_interface_device::write(offs_t offset, uint8_t data)
{
}
diff --git a/src/devices/bus/ql/pcml_qdisk.h b/src/devices/bus/ql/pcml_qdisk.h
index e9904df6eb0..cedd3f953f7 100644
--- a/src/devices/bus/ql/pcml_qdisk.h
+++ b/src/devices/bus/ql/pcml_qdisk.h
@@ -35,8 +35,8 @@ protected:
virtual void device_start() override;
// device_ql_expansion_card_interface overrides
- virtual uint8_t read(address_space &space, offs_t offset, uint8_t data) override;
- virtual void write(address_space &space, offs_t offset, uint8_t data) override;
+ virtual uint8_t read(offs_t offset, uint8_t data) override;
+ virtual void write(offs_t offset, uint8_t data) override;
};
diff --git a/src/devices/bus/ql/qubide.cpp b/src/devices/bus/ql/qubide.cpp
index e88493048d9..10583d28023 100644
--- a/src/devices/bus/ql/qubide.cpp
+++ b/src/devices/bus/ql/qubide.cpp
@@ -202,7 +202,7 @@ void qubide_device::device_reset()
// read -
//-------------------------------------------------
-uint8_t qubide_device::read(address_space &space, offs_t offset, uint8_t data)
+uint8_t qubide_device::read(offs_t offset, uint8_t data)
{
if ((offset & 0xfc000) == m_base)
{
@@ -247,7 +247,7 @@ uint8_t qubide_device::read(address_space &space, offs_t offset, uint8_t data)
// write -
//-------------------------------------------------
-void qubide_device::write(address_space &space, offs_t offset, uint8_t data)
+void qubide_device::write(offs_t offset, uint8_t data)
{
if ((offset & 0xfc000) == m_base)
{
diff --git a/src/devices/bus/ql/qubide.h b/src/devices/bus/ql/qubide.h
index 680e5e6b655..5e1ac6d1860 100644
--- a/src/devices/bus/ql/qubide.h
+++ b/src/devices/bus/ql/qubide.h
@@ -39,8 +39,8 @@ protected:
virtual ioport_constructor device_input_ports() const override;
// device_ql_expansion_card_interface overrides
- virtual uint8_t read(address_space &space, offs_t offset, uint8_t data) override;
- virtual void write(address_space &space, offs_t offset, uint8_t data) override;
+ virtual uint8_t read(offs_t offset, uint8_t data) override;
+ virtual void write(offs_t offset, uint8_t data) override;
private:
required_device<ata_interface_device> m_ata;
diff --git a/src/devices/bus/ql/rom.h b/src/devices/bus/ql/rom.h
index e337fb9f096..0c8ec4a6bca 100644
--- a/src/devices/bus/ql/rom.h
+++ b/src/devices/bus/ql/rom.h
@@ -50,8 +50,8 @@ public:
virtual ~device_ql_rom_cartridge_card_interface();
virtual void romoeh_w(int state) { m_romoeh = state; }
- virtual uint8_t read(address_space &space, offs_t offset, uint8_t data) { return data; }
- virtual void write(address_space &space, offs_t offset, uint8_t data) { }
+ virtual uint8_t read(offs_t offset, uint8_t data) { return data; }
+ virtual void write(offs_t offset, uint8_t data) { }
protected:
device_ql_rom_cartridge_card_interface(const machine_config &mconfig, device_t &device);
@@ -86,8 +86,8 @@ public:
ql_rom_cartridge_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock = 0);
// computer interface
- uint8_t read(address_space &space, offs_t offset, uint8_t data) { if (m_card) data = m_card->read(space, offset, data); return data; }
- void write(address_space &space, offs_t offset, uint8_t data) { if (m_card) m_card->write(space, offset, data); }
+ uint8_t read(offs_t offset, uint8_t data) { if (m_card) data = m_card->read(offset, data); return data; }
+ void write(offs_t offset, uint8_t data) { if (m_card) m_card->write(offset, data); }
DECLARE_WRITE_LINE_MEMBER( romoeh_w ) { if (m_card) m_card->romoeh_w(state); }
protected:
diff --git a/src/devices/bus/ql/sandy_superdisk.cpp b/src/devices/bus/ql/sandy_superdisk.cpp
index 19ee4ebbc9c..1af96f2de81 100644
--- a/src/devices/bus/ql/sandy_superdisk.cpp
+++ b/src/devices/bus/ql/sandy_superdisk.cpp
@@ -149,7 +149,7 @@ void sandy_super_disk_device::device_reset()
// read -
//-------------------------------------------------
-uint8_t sandy_super_disk_device::read(address_space &space, offs_t offset, uint8_t data)
+uint8_t sandy_super_disk_device::read(offs_t offset, uint8_t data)
{
if ((offset & 0xf0000) == 0xc0000)
{
@@ -195,7 +195,7 @@ uint8_t sandy_super_disk_device::read(address_space &space, offs_t offset, uint8
// write -
//-------------------------------------------------
-void sandy_super_disk_device::write(address_space &space, offs_t offset, uint8_t data)
+void sandy_super_disk_device::write(offs_t offset, uint8_t data)
{
if ((offset & 0xf0000) == 0xc0000)
{
diff --git a/src/devices/bus/ql/sandy_superdisk.h b/src/devices/bus/ql/sandy_superdisk.h
index 1bc7192aad5..5a264272e12 100644
--- a/src/devices/bus/ql/sandy_superdisk.h
+++ b/src/devices/bus/ql/sandy_superdisk.h
@@ -41,8 +41,8 @@ protected:
virtual void device_add_mconfig(machine_config &config) override;
// device_ql_expansion_card_interface overrides
- virtual uint8_t read(address_space &space, offs_t offset, uint8_t data) override;
- virtual void write(address_space &space, offs_t offset, uint8_t data) override;
+ virtual uint8_t read(offs_t offset, uint8_t data) override;
+ virtual void write(offs_t offset, uint8_t data) override;
private:
WRITE_LINE_MEMBER( busy_w );
diff --git a/src/devices/bus/ql/sandy_superqboard.cpp b/src/devices/bus/ql/sandy_superqboard.cpp
index 05ff550c47d..bc8f4c78478 100644
--- a/src/devices/bus/ql/sandy_superqboard.cpp
+++ b/src/devices/bus/ql/sandy_superqboard.cpp
@@ -285,7 +285,7 @@ void sandy_superqboard_device::device_reset()
// read -
//-------------------------------------------------
-uint8_t sandy_superqboard_device::read(address_space &space, offs_t offset, uint8_t data)
+uint8_t sandy_superqboard_device::read(offs_t offset, uint8_t data)
{
if ((offset & 0xf0000) == 0xc0000)
{
@@ -345,7 +345,7 @@ uint8_t sandy_superqboard_device::read(address_space &space, offs_t offset, uint
// write -
//-------------------------------------------------
-void sandy_superqboard_device::write(address_space &space, offs_t offset, uint8_t data)
+void sandy_superqboard_device::write(offs_t offset, uint8_t data)
{
if ((offset & 0xf0000) == 0xc0000)
{
diff --git a/src/devices/bus/ql/sandy_superqboard.h b/src/devices/bus/ql/sandy_superqboard.h
index 94d2066020b..94bfe0c7dad 100644
--- a/src/devices/bus/ql/sandy_superqboard.h
+++ b/src/devices/bus/ql/sandy_superqboard.h
@@ -46,8 +46,8 @@ protected:
virtual void device_add_mconfig(machine_config &config) override;
// device_ql_expansion_card_interface overrides
- virtual uint8_t read(address_space &space, offs_t offset, uint8_t data) override;
- virtual void write(address_space &space, offs_t offset, uint8_t data) override;
+ virtual uint8_t read(offs_t offset, uint8_t data) override;
+ virtual void write(offs_t offset, uint8_t data) override;
private:
WRITE_LINE_MEMBER( busy_w );
diff --git a/src/devices/bus/ql/std.cpp b/src/devices/bus/ql/std.cpp
index 5e13a0ff32f..b1171c46336 100644
--- a/src/devices/bus/ql/std.cpp
+++ b/src/devices/bus/ql/std.cpp
@@ -47,7 +47,7 @@ void ql_standard_rom_cartridge_device::device_start()
// read - cartridge data read
//-------------------------------------------------
-uint8_t ql_standard_rom_cartridge_device::read(address_space &space, offs_t offset, uint8_t data)
+uint8_t ql_standard_rom_cartridge_device::read(offs_t offset, uint8_t data)
{
if (m_romoeh && m_rom.bytes())
{
diff --git a/src/devices/bus/ql/std.h b/src/devices/bus/ql/std.h
index b1b4e404c4c..823c3a70008 100644
--- a/src/devices/bus/ql/std.h
+++ b/src/devices/bus/ql/std.h
@@ -32,7 +32,7 @@ protected:
virtual void device_start() override;
// device_ql_rom_cartridge_card_interface overrides
- virtual uint8_t read(address_space &space, offs_t offset, uint8_t data) override;
+ virtual uint8_t read(offs_t offset, uint8_t data) override;
};
diff --git a/src/devices/bus/ql/trumpcard.cpp b/src/devices/bus/ql/trumpcard.cpp
index bc515b7da9c..473fc9bb78e 100644
--- a/src/devices/bus/ql/trumpcard.cpp
+++ b/src/devices/bus/ql/trumpcard.cpp
@@ -167,7 +167,7 @@ void ql_trump_card_device::device_reset()
// read -
//-------------------------------------------------
-uint8_t ql_trump_card_device::read(address_space &space, offs_t offset, uint8_t data)
+uint8_t ql_trump_card_device::read(offs_t offset, uint8_t data)
{
if (offset >= 0xc000 && offset < 0x10000)
{
@@ -220,7 +220,7 @@ uint8_t ql_trump_card_device::read(address_space &space, offs_t offset, uint8_t
// write -
//-------------------------------------------------
-void ql_trump_card_device::write(address_space &space, offs_t offset, uint8_t data)
+void ql_trump_card_device::write(offs_t offset, uint8_t data)
{
if (offset >= 0x1c000 && offset <= 0x1c003)
{
diff --git a/src/devices/bus/ql/trumpcard.h b/src/devices/bus/ql/trumpcard.h
index 4dc18ceccd4..d9926160928 100644
--- a/src/devices/bus/ql/trumpcard.h
+++ b/src/devices/bus/ql/trumpcard.h
@@ -42,8 +42,8 @@ protected:
virtual void device_add_mconfig(machine_config &config) override;
// device_ql_expansion_card_interface overrides
- virtual uint8_t read(address_space &space, offs_t offset, uint8_t data) override;
- virtual void write(address_space &space, offs_t offset, uint8_t data) override;
+ virtual uint8_t read(offs_t offset, uint8_t data) override;
+ virtual void write(offs_t offset, uint8_t data) override;
private:
diff --git a/src/devices/bus/rs232/null_modem.cpp b/src/devices/bus/rs232/null_modem.cpp
index def7bd2a315..08366b01df9 100644
--- a/src/devices/bus/rs232/null_modem.cpp
+++ b/src/devices/bus/rs232/null_modem.cpp
@@ -22,9 +22,10 @@ null_modem_device::null_modem_device(const machine_config &mconfig, const char *
{
}
-MACHINE_CONFIG_START(null_modem_device::device_add_mconfig)
- MCFG_DEVICE_ADD("stream", BITBANGER, 0)
-MACHINE_CONFIG_END
+void null_modem_device::device_add_mconfig(machine_config &config)
+{
+ BITBANGER(config, m_stream, 0);
+}
static INPUT_PORTS_START(null_modem)
MCFG_RS232_BAUD("RS232_TXBAUD", RS232_BAUD_9600, "TX Baud", null_modem_device, update_serial)
diff --git a/src/devices/bus/rs232/printer.cpp b/src/devices/bus/rs232/printer.cpp
index b8b1ec87d34..fb87c9ead79 100644
--- a/src/devices/bus/rs232/printer.cpp
+++ b/src/devices/bus/rs232/printer.cpp
@@ -16,10 +16,11 @@ serial_printer_device::serial_printer_device(const machine_config &mconfig, cons
{
}
-MACHINE_CONFIG_START(serial_printer_device::device_add_mconfig)
- MCFG_DEVICE_ADD("printer", PRINTER, 0)
- MCFG_PRINTER_ONLINE_CB(WRITELINE(*this, serial_printer_device, printer_online))
-MACHINE_CONFIG_END
+void serial_printer_device::device_add_mconfig(machine_config &config)
+{
+ PRINTER(config, m_printer, 0);
+ m_printer->online_callback().set(FUNC(serial_printer_device::printer_online));
+}
static INPUT_PORTS_START(serial_printer)
MCFG_RS232_BAUD("RS232_RXBAUD", RS232_BAUD_9600, "RX Baud", serial_printer_device, update_serial)
diff --git a/src/devices/bus/rs232/xvd701.cpp b/src/devices/bus/rs232/xvd701.cpp
index ef9ca09c258..b2635d21c02 100644
--- a/src/devices/bus/rs232/xvd701.cpp
+++ b/src/devices/bus/rs232/xvd701.cpp
@@ -12,8 +12,9 @@ jvc_xvd701_device::jvc_xvd701_device(const machine_config &mconfig, const char *
{
}
-MACHINE_CONFIG_START(jvc_xvd701_device::device_add_mconfig)
-MACHINE_CONFIG_END
+void jvc_xvd701_device::device_add_mconfig(machine_config &config)
+{
+}
static INPUT_PORTS_START(xvd701)
INPUT_PORTS_END
diff --git a/src/devices/bus/s100/dj2db.cpp b/src/devices/bus/s100/dj2db.cpp
index f3cff259db3..7c33182ea5d 100644
--- a/src/devices/bus/s100/dj2db.cpp
+++ b/src/devices/bus/s100/dj2db.cpp
@@ -301,7 +301,7 @@ void s100_dj2db_device::device_reset()
// s100_smemr_r - memory read
//-------------------------------------------------
-uint8_t s100_dj2db_device::s100_smemr_r(address_space &space, offs_t offset)
+uint8_t s100_dj2db_device::s100_smemr_r(offs_t offset)
{
uint8_t data = 0;
@@ -380,7 +380,7 @@ uint8_t s100_dj2db_device::s100_smemr_r(address_space &space, offs_t offset)
// s100_mwrt_w - memory write
//-------------------------------------------------
-void s100_dj2db_device::s100_mwrt_w(address_space &space, offs_t offset, uint8_t data)
+void s100_dj2db_device::s100_mwrt_w(offs_t offset, uint8_t data)
{
// if (!(m_board_enbl & m_phantom)) return;
@@ -473,7 +473,7 @@ void s100_dj2db_device::s100_mwrt_w(address_space &space, offs_t offset, uint8_t
// s100_sinp_r - I/O read
//-------------------------------------------------
-uint8_t s100_dj2db_device::s100_sinp_r(address_space &space, offs_t offset)
+uint8_t s100_dj2db_device::s100_sinp_r(offs_t offset)
{
return 0xff;
}
@@ -483,7 +483,7 @@ uint8_t s100_dj2db_device::s100_sinp_r(address_space &space, offs_t offset)
// s100_sout_w - I/O write
//-------------------------------------------------
-void s100_dj2db_device::s100_sout_w(address_space &space, offs_t offset, uint8_t data)
+void s100_dj2db_device::s100_sout_w(offs_t offset, uint8_t data)
{
if (offset == 0x41)
{
diff --git a/src/devices/bus/s100/dj2db.h b/src/devices/bus/s100/dj2db.h
index e82b4431095..616113bb038 100644
--- a/src/devices/bus/s100/dj2db.h
+++ b/src/devices/bus/s100/dj2db.h
@@ -42,10 +42,10 @@ protected:
virtual ioport_constructor device_input_ports() const override;
// device_s100_card_interface overrides
- virtual uint8_t s100_smemr_r(address_space &space, offs_t offset) override;
- virtual void s100_mwrt_w(address_space &space, offs_t offset, uint8_t data) override;
- virtual uint8_t s100_sinp_r(address_space &space, offs_t offset) override;
- virtual void s100_sout_w(address_space &space, offs_t offset, uint8_t data) override;
+ virtual uint8_t s100_smemr_r(offs_t offset) override;
+ virtual void s100_mwrt_w(offs_t offset, uint8_t data) override;
+ virtual uint8_t s100_sinp_r(offs_t offset) override;
+ virtual void s100_sout_w(offs_t offset, uint8_t data) override;
virtual void s100_phantom_w(int state) override;
private:
diff --git a/src/devices/bus/s100/djdma.cpp b/src/devices/bus/s100/djdma.cpp
index 39522d321b4..0ee7dab0a0c 100644
--- a/src/devices/bus/s100/djdma.cpp
+++ b/src/devices/bus/s100/djdma.cpp
@@ -146,7 +146,7 @@ void s100_djdma_device::device_reset()
// s100_sout_w - I/O write
//-------------------------------------------------
-void s100_djdma_device::s100_sout_w(address_space &space, offs_t offset, uint8_t data)
+void s100_djdma_device::s100_sout_w(offs_t offset, uint8_t data)
{
// O4 = /ATTN (responds to address EF only)
if (!BIT(m_cmdaddr[offset & 0xff], 3))
diff --git a/src/devices/bus/s100/djdma.h b/src/devices/bus/s100/djdma.h
index 29d07c5860f..d9453aef25c 100644
--- a/src/devices/bus/s100/djdma.h
+++ b/src/devices/bus/s100/djdma.h
@@ -34,7 +34,7 @@ protected:
virtual void device_reset() override;
// bus-level overrides;
- virtual void s100_sout_w(address_space &space, offs_t offset, uint8_t data) override;
+ virtual void s100_sout_w(offs_t offset, uint8_t data) override;
// optional information overrides
virtual void device_add_mconfig(machine_config &config) override;
diff --git a/src/devices/bus/s100/mm65k16s.cpp b/src/devices/bus/s100/mm65k16s.cpp
index 27cdc021d39..ae098a2e29c 100644
--- a/src/devices/bus/s100/mm65k16s.cpp
+++ b/src/devices/bus/s100/mm65k16s.cpp
@@ -233,7 +233,7 @@ void s100_mm65k16s_device::device_reset()
// s100_smemr_r - memory read
//-------------------------------------------------
-uint8_t s100_mm65k16s_device::s100_smemr_r(address_space &space, offs_t offset)
+uint8_t s100_mm65k16s_device::s100_smemr_r(offs_t offset)
{
uint8_t data = 0xff;
@@ -250,7 +250,7 @@ uint8_t s100_mm65k16s_device::s100_smemr_r(address_space &space, offs_t offset)
// s100_mwrt_w - memory write
//-------------------------------------------------
-void s100_mm65k16s_device::s100_mwrt_w(address_space &space, offs_t offset, uint8_t data)
+void s100_mm65k16s_device::s100_mwrt_w(offs_t offset, uint8_t data)
{
if (offset < 0xf800)
{
diff --git a/src/devices/bus/s100/mm65k16s.h b/src/devices/bus/s100/mm65k16s.h
index e46d13f955e..10fa1daff7a 100644
--- a/src/devices/bus/s100/mm65k16s.h
+++ b/src/devices/bus/s100/mm65k16s.h
@@ -38,8 +38,8 @@ protected:
virtual void device_reset() override;
// device_s100_card_interface overrides
- virtual uint8_t s100_smemr_r(address_space &space, offs_t offset) override;
- virtual void s100_mwrt_w(address_space &space, offs_t offset, uint8_t data) override;
+ virtual uint8_t s100_smemr_r(offs_t offset) override;
+ virtual void s100_mwrt_w(offs_t offset, uint8_t data) override;
virtual void s100_phantom_w(int state) override;
private:
diff --git a/src/devices/bus/s100/nsmdsa.cpp b/src/devices/bus/s100/nsmdsa.cpp
index 8efa1c9f392..90d19b3fcb3 100644
--- a/src/devices/bus/s100/nsmdsa.cpp
+++ b/src/devices/bus/s100/nsmdsa.cpp
@@ -57,10 +57,11 @@ static void mds_a_floppies(device_slot_interface &device)
// device_add_mconfig - add device configuration
//-------------------------------------------------
-MACHINE_CONFIG_START(s100_mds_a_device::device_add_mconfig)
- MCFG_FLOPPY_DRIVE_ADD("floppy0", mds_a_floppies, "525sd", floppy_image_device::default_floppy_formats)
- MCFG_FLOPPY_DRIVE_ADD("floppy1", mds_a_floppies, "525sd", floppy_image_device::default_floppy_formats)
-MACHINE_CONFIG_END
+void s100_mds_a_device::device_add_mconfig(machine_config &config)
+{
+ for (auto &floppy : m_floppy)
+ FLOPPY_CONNECTOR(config, floppy, mds_a_floppies, "525sd", floppy_image_device::default_floppy_formats);
+}
@@ -75,8 +76,7 @@ MACHINE_CONFIG_END
s100_mds_a_device::s100_mds_a_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) :
device_t(mconfig, S100_MDS_A, tag, owner, clock),
device_s100_card_interface(mconfig, *this),
- m_floppy0(*this, "floppy0"),
- m_floppy1(*this, "floppy1"),
+ m_floppy(*this, "floppy%u", 0U),
m_psel_rom(*this, "psel"),
m_pgm_rom(*this, "pgm")
{
@@ -105,7 +105,7 @@ void s100_mds_a_device::device_reset()
// s100_smemr_r - memory read
//-------------------------------------------------
-uint8_t s100_mds_a_device::s100_smemr_r(address_space &space, offs_t offset)
+uint8_t s100_mds_a_device::s100_smemr_r(offs_t offset)
{
return 0xff;
}
diff --git a/src/devices/bus/s100/nsmdsa.h b/src/devices/bus/s100/nsmdsa.h
index 5bcaf7505c0..a36f39127ec 100644
--- a/src/devices/bus/s100/nsmdsa.h
+++ b/src/devices/bus/s100/nsmdsa.h
@@ -39,11 +39,10 @@ protected:
virtual void device_add_mconfig(machine_config &config) override;
// device_s100_card_interface overrides
- virtual uint8_t s100_smemr_r(address_space &space, offs_t offset) override;
+ virtual uint8_t s100_smemr_r(offs_t offset) override;
private:
- required_device<floppy_connector> m_floppy0;
- required_device<floppy_connector> m_floppy1;
+ required_device_array<floppy_connector, 2> m_floppy;
required_memory_region m_psel_rom;
required_memory_region m_pgm_rom;
};
diff --git a/src/devices/bus/s100/nsmdsad.cpp b/src/devices/bus/s100/nsmdsad.cpp
index d13f6a7f748..d1358e85bf0 100644
--- a/src/devices/bus/s100/nsmdsad.cpp
+++ b/src/devices/bus/s100/nsmdsad.cpp
@@ -58,10 +58,11 @@ static void mds_ad_floppies(device_slot_interface &device)
// device_add_mconfig - add device configuration
//-------------------------------------------------
-MACHINE_CONFIG_START(s100_mds_ad_device::device_add_mconfig)
- MCFG_FLOPPY_DRIVE_ADD("floppy0", mds_ad_floppies, "525dd", floppy_image_device::default_floppy_formats)
- MCFG_FLOPPY_DRIVE_ADD("floppy1", mds_ad_floppies, "525dd", floppy_image_device::default_floppy_formats)
-MACHINE_CONFIG_END
+void s100_mds_ad_device::device_add_mconfig(machine_config &config)
+{
+ for (auto &floppy : m_floppy)
+ FLOPPY_CONNECTOR(config, floppy, mds_ad_floppies, "525dd", floppy_image_device::default_floppy_formats);
+}
@@ -76,8 +77,7 @@ MACHINE_CONFIG_END
s100_mds_ad_device::s100_mds_ad_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) :
device_t(mconfig, S100_MDS_AD, tag, owner, clock),
device_s100_card_interface(mconfig, *this),
- m_floppy0(*this, "floppy0"),
- m_floppy1(*this, "floppy1"),
+ m_floppy(*this, "floppy%u", 0U),
m_dsel_rom(*this, "dsel"),
m_dpgm_rom(*this, "dpgm"),
m_dwe_rom(*this, "dwe")
@@ -107,7 +107,7 @@ void s100_mds_ad_device::device_reset()
// s100_smemr_r - memory read
//-------------------------------------------------
-uint8_t s100_mds_ad_device::s100_smemr_r(address_space &space, offs_t offset)
+uint8_t s100_mds_ad_device::s100_smemr_r(offs_t offset)
{
return 0xff;
}
diff --git a/src/devices/bus/s100/nsmdsad.h b/src/devices/bus/s100/nsmdsad.h
index f10d3c0af23..ce5a248d553 100644
--- a/src/devices/bus/s100/nsmdsad.h
+++ b/src/devices/bus/s100/nsmdsad.h
@@ -39,11 +39,10 @@ protected:
virtual void device_add_mconfig(machine_config &config) override;
// device_s100_card_interface overrides
- virtual uint8_t s100_smemr_r(address_space &space, offs_t offset) override;
+ virtual uint8_t s100_smemr_r(offs_t offset) override;
private:
- required_device<floppy_connector> m_floppy0;
- required_device<floppy_connector> m_floppy1;
+ required_device_array<floppy_connector, 2> m_floppy;
required_memory_region m_dsel_rom;
required_memory_region m_dpgm_rom;
required_memory_region m_dwe_rom;
diff --git a/src/devices/bus/s100/s100.cpp b/src/devices/bus/s100/s100.cpp
index dd28ca385d3..23333ce500f 100644
--- a/src/devices/bus/s100/s100.cpp
+++ b/src/devices/bus/s100/s100.cpp
@@ -135,7 +135,7 @@ void s100_bus_device::add_card(device_s100_card_interface *card)
// smemr_r - memory read
//-------------------------------------------------
-READ8_MEMBER( s100_bus_device::smemr_r )
+uint8_t s100_bus_device::smemr_r(offs_t offset)
{
uint8_t data = 0xff;
@@ -143,7 +143,7 @@ READ8_MEMBER( s100_bus_device::smemr_r )
while (entry)
{
- data &= entry->s100_smemr_r(space, offset);
+ data &= entry->s100_smemr_r(offset);
entry = entry->next();
}
@@ -155,13 +155,13 @@ READ8_MEMBER( s100_bus_device::smemr_r )
// mwrt_w - memory write
//-------------------------------------------------
-WRITE8_MEMBER( s100_bus_device::mwrt_w )
+void s100_bus_device::mwrt_w(offs_t offset, uint8_t data)
{
device_s100_card_interface *entry = m_device_list.first();
while (entry)
{
- entry->s100_mwrt_w(space, offset, data);
+ entry->s100_mwrt_w(offset, data);
entry = entry->next();
}
}
@@ -171,7 +171,7 @@ WRITE8_MEMBER( s100_bus_device::mwrt_w )
// sinp_r - I/O read
//-------------------------------------------------
-READ8_MEMBER( s100_bus_device::sinp_r )
+uint8_t s100_bus_device::sinp_r(offs_t offset)
{
uint8_t data = 0xff;
@@ -179,7 +179,7 @@ READ8_MEMBER( s100_bus_device::sinp_r )
while (entry)
{
- data &= entry->s100_sinp_r(space, offset);
+ data &= entry->s100_sinp_r(offset);
entry = entry->next();
}
@@ -191,13 +191,13 @@ READ8_MEMBER( s100_bus_device::sinp_r )
// sout_w - I/O write
//-------------------------------------------------
-WRITE8_MEMBER( s100_bus_device::sout_w )
+void s100_bus_device::sout_w(offs_t offset, uint8_t data)
{
device_s100_card_interface *entry = m_device_list.first();
while (entry)
{
- entry->s100_sout_w(space, offset, data);
+ entry->s100_sout_w(offset, data);
entry = entry->next();
}
}
diff --git a/src/devices/bus/s100/s100.h b/src/devices/bus/s100/s100.h
index 6336be291e4..f231520f694 100644
--- a/src/devices/bus/s100/s100.h
+++ b/src/devices/bus/s100/s100.h
@@ -68,68 +68,6 @@
//**************************************************************************
-// INTERFACE CONFIGURATION MACROS
-//**************************************************************************
-
-#define MCFG_S100_SLOT_ADD(_tag, _slot_intf, _def_slot) \
- MCFG_DEVICE_ADD(_tag, S100_SLOT, DERIVED_CLOCK(1, 1)) \
- MCFG_DEVICE_SLOT_INTERFACE(_slot_intf, _def_slot, false)
-
-
-#define MCFG_S100_IRQ_CALLBACK(_write) \
- downcast<s100_bus_device &>(*device).set_irq_wr_callback(DEVCB_##_write);
-
-#define MCFG_S100_NMI_CALLBACK(_write) \
- downcast<s100_bus_device &>(*device).set_nmi_wr_callback(DEVCB_##_write);
-
-#define MCFG_S100_VI0_CALLBACK(_write) \
- downcast<s100_bus_device &>(*device).set_vi0_wr_callback(DEVCB_##_write);
-
-#define MCFG_S100_VI1_CALLBACK(_write) \
- downcast<s100_bus_device &>(*device).set_vi1_wr_callback(DEVCB_##_write);
-
-#define MCFG_S100_VI2_CALLBACK(_write) \
- downcast<s100_bus_device &>(*device).set_vi2_wr_callback(DEVCB_##_write);
-
-#define MCFG_S100_VI3_CALLBACK(_write) \
- downcast<s100_bus_device &>(*device).set_vi3_wr_callback(DEVCB_##_write);
-
-#define MCFG_S100_VI4_CALLBACK(_write) \
- downcast<s100_bus_device &>(*device).set_vi4_wr_callback(DEVCB_##_write);
-
-#define MCFG_S100_VI5_CALLBACK(_write) \
- downcast<s100_bus_device &>(*device).set_vi5_wr_callback(DEVCB_##_write);
-
-#define MCFG_S100_VI6_CALLBACK(_write) \
- downcast<s100_bus_device &>(*device).set_vi6_wr_callback(DEVCB_##_write);
-
-#define MCFG_S100_VI7_CALLBACK(_write) \
- downcast<s100_bus_device &>(*device).set_vi7_wr_callback(DEVCB_##_write);
-
-#define MCFG_S100_DMA0_CALLBACK(_write) \
- downcast<s100_bus_device &>(*device).set_dma0_wr_callback(DEVCB_##_write);
-
-#define MCFG_S100_DMA1_CALLBACK(_write) \
- downcast<s100_bus_device &>(*device).set_dma1_wr_callback(DEVCB_##_write);
-
-#define MCFG_S100_DMA2_CALLBACK(_write) \
- downcast<s100_bus_device &>(*device).set_dma2_wr_callback(DEVCB_##_write);
-
-#define MCFG_S100_DMA3_CALLBACK(_write) \
- downcast<s100_bus_device &>(*device).set_dma3_wr_callback(DEVCB_##_write);
-
-#define MCFG_S100_RDY_CALLBACK(_write) \
- downcast<s100_bus_device &>(*device).set_rdy_wr_callback(DEVCB_##_write);
-
-#define MCFG_S100_HOLD_CALLBACK(_write) \
- downcast<s100_bus_device &>(*device).set_hold_wr_callback(DEVCB_##_write);
-
-#define MCFG_S100_ERROR_CALLBACK(_write) \
- downcast<s100_bus_device &>(*device).set_error_wr_callback(DEVCB_##_write);
-
-
-
-//**************************************************************************
// TYPE DEFINITIONS
//**************************************************************************
@@ -161,12 +99,12 @@ public:
virtual void s100_vi7_w(int state) { }
// memory access
- virtual uint8_t s100_smemr_r(address_space &space, offs_t offset) { return 0xff; }
- virtual void s100_mwrt_w(address_space &space, offs_t offset, uint8_t data) { }
+ virtual uint8_t s100_smemr_r(offs_t offset) { return 0xff; }
+ virtual void s100_mwrt_w(offs_t offset, uint8_t data) { }
// I/O access
- virtual uint8_t s100_sinp_r(address_space &space, offs_t offset) { return 0xff; }
- virtual void s100_sout_w(address_space &space, offs_t offset, uint8_t data) { }
+ virtual uint8_t s100_sinp_r(offs_t offset) { return 0xff; }
+ virtual void s100_sout_w(offs_t offset, uint8_t data) { }
// configuration access
virtual void s100_phlda_w(int state) { }
@@ -201,31 +139,31 @@ public:
s100_bus_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
~s100_bus_device() { m_device_list.detach_all(); }
- template <class Object> devcb_base &set_irq_wr_callback(Object &&cb) { return m_write_irq.set_callback(std::forward<Object>(cb)); }
- template <class Object> devcb_base &set_nmi_wr_callback(Object &&cb) { return m_write_nmi.set_callback(std::forward<Object>(cb)); }
- template <class Object> devcb_base &set_vi0_wr_callback(Object &&cb) { return m_write_vi0.set_callback(std::forward<Object>(cb)); }
- template <class Object> devcb_base &set_vi1_wr_callback(Object &&cb) { return m_write_vi1.set_callback(std::forward<Object>(cb)); }
- template <class Object> devcb_base &set_vi2_wr_callback(Object &&cb) { return m_write_vi2.set_callback(std::forward<Object>(cb)); }
- template <class Object> devcb_base &set_vi3_wr_callback(Object &&cb) { return m_write_vi3.set_callback(std::forward<Object>(cb)); }
- template <class Object> devcb_base &set_vi4_wr_callback(Object &&cb) { return m_write_vi4.set_callback(std::forward<Object>(cb)); }
- template <class Object> devcb_base &set_vi5_wr_callback(Object &&cb) { return m_write_vi5.set_callback(std::forward<Object>(cb)); }
- template <class Object> devcb_base &set_vi6_wr_callback(Object &&cb) { return m_write_vi6.set_callback(std::forward<Object>(cb)); }
- template <class Object> devcb_base &set_vi7_wr_callback(Object &&cb) { return m_write_vi7.set_callback(std::forward<Object>(cb)); }
- template <class Object> devcb_base &set_dma0_wr_callback(Object &&cb) { return m_write_dma0.set_callback(std::forward<Object>(cb)); }
- template <class Object> devcb_base &set_dma1_wr_callback(Object &&cb) { return m_write_dma1.set_callback(std::forward<Object>(cb)); }
- template <class Object> devcb_base &set_dma2_wr_callback(Object &&cb) { return m_write_dma2.set_callback(std::forward<Object>(cb)); }
- template <class Object> devcb_base &set_dma3_wr_callback(Object &&cb) { return m_write_dma3.set_callback(std::forward<Object>(cb)); }
- template <class Object> devcb_base &set_rdy_wr_callback(Object &&cb) { return m_write_rdy.set_callback(std::forward<Object>(cb)); }
- template <class Object> devcb_base &set_hold_wr_callback(Object &&cb) { return m_write_hold.set_callback(std::forward<Object>(cb)); }
- template <class Object> devcb_base &set_error_wr_callback(Object &&cb) { return m_write_error.set_callback(std::forward<Object>(cb)); }
+ auto irq() { return m_write_irq.bind(); }
+ auto nmi() { return m_write_nmi.bind(); }
+ auto vi0() { return m_write_vi0.bind(); }
+ auto vi1() { return m_write_vi1.bind(); }
+ auto vi2() { return m_write_vi2.bind(); }
+ auto vi3() { return m_write_vi3.bind(); }
+ auto vi4() { return m_write_vi4.bind(); }
+ auto vi5() { return m_write_vi5.bind(); }
+ auto vi6() { return m_write_vi6.bind(); }
+ auto vi7() { return m_write_vi7.bind(); }
+ auto dma0() { return m_write_dma0.bind(); }
+ auto dma1() { return m_write_dma1.bind(); }
+ auto dma2() { return m_write_dma2.bind(); }
+ auto dma3() { return m_write_dma3.bind(); }
+ auto rdy() { return m_write_rdy.bind(); }
+ auto hold() { return m_write_hold.bind(); }
+ auto error() { return m_write_error.bind(); }
void add_card(device_s100_card_interface *card);
- DECLARE_READ8_MEMBER( smemr_r );
- DECLARE_WRITE8_MEMBER( mwrt_w );
+ uint8_t smemr_r(offs_t offset);
+ void mwrt_w(offs_t offset, uint8_t data);
- DECLARE_READ8_MEMBER( sinp_r );
- DECLARE_WRITE8_MEMBER( sout_w );
+ uint8_t sinp_r(offs_t offset);
+ void sout_w(offs_t offset, uint8_t data);
DECLARE_WRITE_LINE_MEMBER( irq_w ) { m_write_irq(state); }
DECLARE_WRITE_LINE_MEMBER( nmi_w ) { m_write_nmi(state); }
@@ -279,6 +217,15 @@ class s100_slot_device : public device_t, public device_slot_interface
{
public:
// construction/destruction
+ template <typename T>
+ s100_slot_device(machine_config const &mconfig, char const *tag, device_t *owner, T &&opts, char const *dflt)
+ : s100_slot_device(mconfig, tag, owner, DERIVED_CLOCK(1, 1))
+ {
+ option_reset();
+ opts(*this);
+ set_default_option(dflt);
+ set_fixed(false);
+ }
s100_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
// device-level overrides
diff --git a/src/devices/bus/s100/seals8k.cpp b/src/devices/bus/s100/seals8k.cpp
index 9191f8566df..949c7d6d2c5 100644
--- a/src/devices/bus/s100/seals8k.cpp
+++ b/src/devices/bus/s100/seals8k.cpp
@@ -51,8 +51,8 @@ protected:
virtual void device_start() override;
// S-100 memory access handlers
- virtual u8 s100_smemr_r(address_space &space, offs_t offset) override;
- virtual void s100_mwrt_w(address_space &space, offs_t offset, u8 data) override;
+ virtual u8 s100_smemr_r(offs_t offset) override;
+ virtual void s100_mwrt_w(offs_t offset, u8 data) override;
// internal state
std::unique_ptr<u8[]> m_ram;
@@ -203,7 +203,7 @@ bool s100_8k_sc_device::board_selected(offs_t offset) const
// s100_smemr_r - memory read
//-------------------------------------------------
-u8 s100_8k_sc_device::s100_smemr_r(address_space &space, offs_t offset)
+u8 s100_8k_sc_device::s100_smemr_r(offs_t offset)
{
if (board_selected(offset))
return m_ram[offset & 0x1fff];
@@ -216,7 +216,7 @@ u8 s100_8k_sc_device::s100_smemr_r(address_space &space, offs_t offset)
// s100_mwrt_w - memory write
//-------------------------------------------------
-void s100_8k_sc_device::s100_mwrt_w(address_space &space, offs_t offset, u8 data)
+void s100_8k_sc_device::s100_mwrt_w(offs_t offset, u8 data)
{
if (board_selected(offset))
m_ram[offset & 0x1fff] = data;
diff --git a/src/devices/bus/s100/wunderbus.cpp b/src/devices/bus/s100/wunderbus.cpp
index 9d307d9053b..c7db4417dcb 100644
--- a/src/devices/bus/s100/wunderbus.cpp
+++ b/src/devices/bus/s100/wunderbus.cpp
@@ -300,7 +300,7 @@ void s100_wunderbus_device::s100_vi2_w(int state)
// s100_sinp_r - I/O read
//-------------------------------------------------
-uint8_t s100_wunderbus_device::s100_sinp_r(address_space &space, offs_t offset)
+uint8_t s100_wunderbus_device::s100_sinp_r(offs_t offset)
{
uint8_t address = (m_7c->read() & 0x3e) << 2;
if ((offset & 0xf8) != address) return 0xff;
@@ -388,15 +388,15 @@ uint8_t s100_wunderbus_device::s100_sinp_r(address_space &space, offs_t offset)
break;
case 1:
- data = m_ace1->ins8250_r(space, offset & 0x07);
+ data = m_ace1->ins8250_r(machine().dummy_space(), offset & 0x07);
break;
case 2:
- data = m_ace2->ins8250_r(space, offset & 0x07);
+ data = m_ace2->ins8250_r(machine().dummy_space(), offset & 0x07);
break;
case 3:
- data = m_ace3->ins8250_r(space, offset & 0x07);
+ data = m_ace3->ins8250_r(machine().dummy_space(), offset & 0x07);
break;
}
}
@@ -409,7 +409,7 @@ uint8_t s100_wunderbus_device::s100_sinp_r(address_space &space, offs_t offset)
// s100_sout_w - I/O write
//-------------------------------------------------
-void s100_wunderbus_device::s100_sout_w(address_space &space, offs_t offset, uint8_t data)
+void s100_wunderbus_device::s100_sout_w(offs_t offset, uint8_t data)
{
uint8_t address = (m_7c->read() & 0x3e) << 2;
if ((offset & 0xf8) != address) return;
@@ -511,15 +511,15 @@ void s100_wunderbus_device::s100_sout_w(address_space &space, offs_t offset, uin
break;
case 1:
- m_ace1->ins8250_w(space, offset & 0x07, data);
+ m_ace1->ins8250_w(machine().dummy_space(), offset & 0x07, data);
break;
case 2:
- m_ace2->ins8250_w(space, offset & 0x07, data);
+ m_ace2->ins8250_w(machine().dummy_space(), offset & 0x07, data);
break;
case 3:
- m_ace3->ins8250_w(space, offset & 0x07, data);
+ m_ace3->ins8250_w(machine().dummy_space(), offset & 0x07, data);
break;
}
}
diff --git a/src/devices/bus/s100/wunderbus.h b/src/devices/bus/s100/wunderbus.h
index 540c5cd8b6c..ca9a6d0e641 100644
--- a/src/devices/bus/s100/wunderbus.h
+++ b/src/devices/bus/s100/wunderbus.h
@@ -44,8 +44,8 @@ protected:
virtual void s100_vi0_w(int state) override;
virtual void s100_vi1_w(int state) override;
virtual void s100_vi2_w(int state) override;
- virtual uint8_t s100_sinp_r(address_space &space, offs_t offset) override;
- virtual void s100_sout_w(address_space &space, offs_t offset, uint8_t data) override;
+ virtual uint8_t s100_sinp_r(offs_t offset) override;
+ virtual void s100_sout_w(offs_t offset, uint8_t data) override;
private:
DECLARE_WRITE_LINE_MEMBER( pic_int_w );
diff --git a/src/devices/bus/saturn/sat_slot.h b/src/devices/bus/saturn/sat_slot.h
index 4d94ea472d6..63a9ae0dbca 100644
--- a/src/devices/bus/saturn/sat_slot.h
+++ b/src/devices/bus/saturn/sat_slot.h
@@ -67,7 +67,16 @@ class sat_cart_slot_device : public device_t,
{
public:
// construction/destruction
- sat_cart_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+ template <typename T>
+ sat_cart_slot_device(machine_config const &mconfig, char const *tag, device_t *owner, T &&opts, char const *dflt)
+ : sat_cart_slot_device(mconfig, tag, owner, 0)
+ {
+ option_reset();
+ opts(*this);
+ set_default_option(dflt);
+ set_fixed(false);
+ }
+ sat_cart_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock = 0);
virtual ~sat_cart_slot_device();
// image-level overrides
@@ -117,9 +126,4 @@ DECLARE_DEVICE_TYPE(SATURN_CART_SLOT, sat_cart_slot_device)
#define SATSLOT_ROM_REGION_TAG ":cart:rom"
-#define MCFG_SATURN_CARTRIDGE_ADD(_tag,_slot_intf,_def_slot) \
- MCFG_DEVICE_ADD(_tag, SATURN_CART_SLOT, 0) \
- MCFG_DEVICE_SLOT_INTERFACE(_slot_intf, _def_slot, false)
-
-
#endif // MAME_BUS_SATURN_SAT_SLOT_H
diff --git a/src/devices/bus/sbus/cgthree.cpp b/src/devices/bus/sbus/cgthree.cpp
index 02ddaba688f..091efef3b21 100644
--- a/src/devices/bus/sbus/cgthree.cpp
+++ b/src/devices/bus/sbus/cgthree.cpp
@@ -36,9 +36,7 @@ void sbus_cgthree_device::device_add_mconfig(machine_config &config)
{
SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
m_screen->set_screen_update(FUNC(sbus_cgthree_device::screen_update));
- m_screen->set_size(1152, 900);
- m_screen->set_visarea(0, 1152-1, 0, 900-1);
- m_screen->set_refresh_hz(72);
+ m_screen->set_raw(92.9405_MHz_XTAL, 1504, 0, 1152, 937, 0, 900);
BT458(config, m_ramdac, 0);
}
diff --git a/src/devices/bus/scsi/omti5100.cpp b/src/devices/bus/scsi/omti5100.cpp
index 415b68bb4ed..519aa723a0b 100644
--- a/src/devices/bus/scsi/omti5100.cpp
+++ b/src/devices/bus/scsi/omti5100.cpp
@@ -176,7 +176,8 @@ void omti5100_device::WriteData( uint8_t *data, int dataLength )
}
}
-MACHINE_CONFIG_START(omti5100_device::device_add_mconfig)
- MCFG_HARDDISK_ADD("image0")
- MCFG_HARDDISK_ADD("image1")
-MACHINE_CONFIG_END
+void omti5100_device::device_add_mconfig(machine_config &config)
+{
+ HARDDISK(config, m_image0);
+ HARDDISK(config, m_image1);
+}
diff --git a/src/devices/bus/scsi/s1410.cpp b/src/devices/bus/scsi/s1410.cpp
index e05cfe73014..5416089fd9d 100644
--- a/src/devices/bus/scsi/s1410.cpp
+++ b/src/devices/bus/scsi/s1410.cpp
@@ -165,14 +165,15 @@ void s1410_device::s1410_io(address_map &map)
// device_add_mconfig - add device configuration
//-------------------------------------------------
-MACHINE_CONFIG_START(s1410_device::device_add_mconfig)
- MCFG_DEVICE_ADD(Z8400A_TAG, Z80, XTAL(16'000'000)/4)
- MCFG_DEVICE_PROGRAM_MAP(s1410_mem)
- MCFG_DEVICE_IO_MAP(s1410_io)
- MCFG_DEVICE_DISABLE()
-
- MCFG_HARDDISK_ADD("image")
-MACHINE_CONFIG_END
+void s1410_device::device_add_mconfig(machine_config &config)
+{
+ z80_device &z8400a(Z80(config, Z8400A_TAG, XTAL(16'000'000)/4));
+ z8400a.set_addrmap(AS_PROGRAM, &s1410_device::s1410_mem);
+ z8400a.set_addrmap(AS_IO, &s1410_device::s1410_io);
+ z8400a.set_disable();
+
+ HARDDISK(config, "image");
+}
diff --git a/src/devices/bus/scsi/sa1403d.cpp b/src/devices/bus/scsi/sa1403d.cpp
index 902b69f5b63..5ab22288835 100644
--- a/src/devices/bus/scsi/sa1403d.cpp
+++ b/src/devices/bus/scsi/sa1403d.cpp
@@ -57,9 +57,10 @@ const tiny_rom_entry *sa1403d_device::device_rom_region() const
// device_add_mconfig - add device configuration
//-------------------------------------------------
-MACHINE_CONFIG_START(sa1403d_device::device_add_mconfig)
- MCFG_HARDDISK_ADD("image")
-MACHINE_CONFIG_END
+void sa1403d_device::device_add_mconfig(machine_config &config)
+{
+ HARDDISK(config, "image");
+}
//-------------------------------------------------
diff --git a/src/devices/bus/scsi/scsi.h b/src/devices/bus/scsi/scsi.h
index e5995f970ab..66ddae370d6 100644
--- a/src/devices/bus/scsi/scsi.h
+++ b/src/devices/bus/scsi/scsi.h
@@ -17,77 +17,6 @@
#define SCSI_PORT_DEVICE6 "6"
#define SCSI_PORT_DEVICE7 "7"
-#define MCFG_SCSI_BSY_HANDLER(_devcb) \
- downcast<scsi_port_device &>(*device).set_bsy_handler(DEVCB_##_devcb);
-
-#define MCFG_SCSI_SEL_HANDLER(_devcb) \
- downcast<scsi_port_device &>(*device).set_sel_handler(DEVCB_##_devcb);
-
-#define MCFG_SCSI_CD_HANDLER(_devcb) \
- downcast<scsi_port_device &>(*device).set_cd_handler(DEVCB_##_devcb);
-
-#define MCFG_SCSI_IO_HANDLER(_devcb) \
- downcast<scsi_port_device &>(*device).set_io_handler(DEVCB_##_devcb);
-
-#define MCFG_SCSI_MSG_HANDLER(_devcb) \
- downcast<scsi_port_device &>(*device).set_msg_handler(DEVCB_##_devcb);
-
-#define MCFG_SCSI_REQ_HANDLER(_devcb) \
- downcast<scsi_port_device &>(*device).set_req_handler(DEVCB_##_devcb);
-
-#define MCFG_SCSI_ACK_HANDLER(_devcb) \
- downcast<scsi_port_device &>(*device).set_ack_handler(DEVCB_##_devcb);
-
-#define MCFG_SCSI_ATN_HANDLER(_devcb) \
- downcast<scsi_port_device &>(*device).set_atn_handler(DEVCB_##_devcb);
-
-#define MCFG_SCSI_RST_HANDLER(_devcb) \
- downcast<scsi_port_device &>(*device).set_rst_handler(DEVCB_##_devcb);
-
-#define MCFG_SCSI_DATA0_HANDLER(_devcb) \
- downcast<scsi_port_device &>(*device).set_data0_handler(DEVCB_##_devcb);
-
-#define MCFG_SCSI_DATA1_HANDLER(_devcb) \
- downcast<scsi_port_device &>(*device).set_data1_handler(DEVCB_##_devcb);
-
-#define MCFG_SCSI_DATA2_HANDLER(_devcb) \
- downcast<scsi_port_device &>(*device).set_data2_handler(DEVCB_##_devcb);
-
-#define MCFG_SCSI_DATA3_HANDLER(_devcb) \
- downcast<scsi_port_device &>(*device).set_data3_handler(DEVCB_##_devcb);
-
-#define MCFG_SCSI_DATA4_HANDLER(_devcb) \
- downcast<scsi_port_device &>(*device).set_data4_handler(DEVCB_##_devcb);
-
-#define MCFG_SCSI_DATA5_HANDLER(_devcb) \
- downcast<scsi_port_device &>(*device).set_data5_handler(DEVCB_##_devcb);
-
-#define MCFG_SCSI_DATA6_HANDLER(_devcb) \
- downcast<scsi_port_device &>(*device).set_data6_handler(DEVCB_##_devcb);
-
-#define MCFG_SCSI_DATA7_HANDLER(_devcb) \
- downcast<scsi_port_device &>(*device).set_data7_handler(DEVCB_##_devcb);
-
-#define MCFG_SCSI_OUTPUT_LATCH_ADD(_tag, scsi_port_tag) \
- MCFG_DEVICE_ADD(_tag, OUTPUT_LATCH, 0) \
- MCFG_OUTPUT_LATCH_BIT0_HANDLER(WRITELINE(scsi_port_tag, scsi_port_device, write_data0)) \
- MCFG_OUTPUT_LATCH_BIT1_HANDLER(WRITELINE(scsi_port_tag, scsi_port_device, write_data1)) \
- MCFG_OUTPUT_LATCH_BIT2_HANDLER(WRITELINE(scsi_port_tag, scsi_port_device, write_data2)) \
- MCFG_OUTPUT_LATCH_BIT3_HANDLER(WRITELINE(scsi_port_tag, scsi_port_device, write_data3)) \
- MCFG_OUTPUT_LATCH_BIT4_HANDLER(WRITELINE(scsi_port_tag, scsi_port_device, write_data4)) \
- MCFG_OUTPUT_LATCH_BIT5_HANDLER(WRITELINE(scsi_port_tag, scsi_port_device, write_data5)) \
- MCFG_OUTPUT_LATCH_BIT6_HANDLER(WRITELINE(scsi_port_tag, scsi_port_device, write_data6)) \
- MCFG_OUTPUT_LATCH_BIT7_HANDLER(WRITELINE(scsi_port_tag, scsi_port_device, write_data7))
-
-#define MCFG_SCSI_DATA_INPUT_BUFFER(_tag) \
- MCFG_SCSI_DATA0_HANDLER(WRITELINE(_tag, input_buffer_device, write_bit0)) \
- MCFG_SCSI_DATA1_HANDLER(WRITELINE(_tag, input_buffer_device, write_bit1)) \
- MCFG_SCSI_DATA2_HANDLER(WRITELINE(_tag, input_buffer_device, write_bit2)) \
- MCFG_SCSI_DATA3_HANDLER(WRITELINE(_tag, input_buffer_device, write_bit3)) \
- MCFG_SCSI_DATA4_HANDLER(WRITELINE(_tag, input_buffer_device, write_bit4)) \
- MCFG_SCSI_DATA5_HANDLER(WRITELINE(_tag, input_buffer_device, write_bit5)) \
- MCFG_SCSI_DATA6_HANDLER(WRITELINE(_tag, input_buffer_device, write_bit6)) \
- MCFG_SCSI_DATA7_HANDLER(WRITELINE(_tag, input_buffer_device, write_bit7))
class scsi_port_slot_device;
class scsi_port_interface;
@@ -100,23 +29,6 @@ public:
// construction/destruction
scsi_port_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock = 0);
- template <class Object> devcb_base &set_bsy_handler(Object &&cb) { return m_bsy_handler.set_callback(std::forward<Object>(cb)); }
- template <class Object> devcb_base &set_sel_handler(Object &&cb) { return m_sel_handler.set_callback(std::forward<Object>(cb)); }
- template <class Object> devcb_base &set_cd_handler(Object &&cb) { return m_cd_handler.set_callback(std::forward<Object>(cb)); }
- template <class Object> devcb_base &set_io_handler(Object &&cb) { return m_io_handler.set_callback(std::forward<Object>(cb)); }
- template <class Object> devcb_base &set_msg_handler(Object &&cb) { return m_msg_handler.set_callback(std::forward<Object>(cb)); }
- template <class Object> devcb_base &set_req_handler(Object &&cb) { return m_req_handler.set_callback(std::forward<Object>(cb)); }
- template <class Object> devcb_base &set_ack_handler(Object &&cb) { return m_ack_handler.set_callback(std::forward<Object>(cb)); }
- template <class Object> devcb_base &set_atn_handler(Object &&cb) { return m_atn_handler.set_callback(std::forward<Object>(cb)); }
- template <class Object> devcb_base &set_rst_handler(Object &&cb) { return m_rst_handler.set_callback(std::forward<Object>(cb)); }
- template <class Object> devcb_base &set_data0_handler(Object &&cb) { return m_data0_handler.set_callback(std::forward<Object>(cb)); }
- template <class Object> devcb_base &set_data1_handler(Object &&cb) { return m_data1_handler.set_callback(std::forward<Object>(cb)); }
- template <class Object> devcb_base &set_data2_handler(Object &&cb) { return m_data2_handler.set_callback(std::forward<Object>(cb)); }
- template <class Object> devcb_base &set_data3_handler(Object &&cb) { return m_data3_handler.set_callback(std::forward<Object>(cb)); }
- template <class Object> devcb_base &set_data4_handler(Object &&cb) { return m_data4_handler.set_callback(std::forward<Object>(cb)); }
- template <class Object> devcb_base &set_data5_handler(Object &&cb) { return m_data5_handler.set_callback(std::forward<Object>(cb)); }
- template <class Object> devcb_base &set_data6_handler(Object &&cb) { return m_data6_handler.set_callback(std::forward<Object>(cb)); }
- template <class Object> devcb_base &set_data7_handler(Object &&cb) { return m_data7_handler.set_callback(std::forward<Object>(cb)); }
auto bsy_handler() { return m_bsy_handler.bind(); }
auto sel_handler() { return m_sel_handler.bind(); }
auto cd_handler() { return m_cd_handler.bind(); }
diff --git a/src/devices/bus/scsi/scsicd.cpp b/src/devices/bus/scsi/scsicd.cpp
index 1a5e6f8002d..0f577ea44d3 100644
--- a/src/devices/bus/scsi/scsicd.cpp
+++ b/src/devices/bus/scsi/scsicd.cpp
@@ -30,8 +30,8 @@ void scsicd_device::device_start()
scsihle_device::device_start();
}
-MACHINE_CONFIG_START(scsicd_device::device_add_mconfig)
- MCFG_CDROM_ADD("image")
- MCFG_CDROM_INTERFACE("cdrom")
- MCFG_DEVICE_ADD("cdda", CDDA)
-MACHINE_CONFIG_END
+void scsicd_device::device_add_mconfig(machine_config &config)
+{
+ CDROM(config, "image").set_interface("cdrom");
+ CDDA(config, "cdda");
+}
diff --git a/src/devices/bus/scsi/scsihd.cpp b/src/devices/bus/scsi/scsihd.cpp
index b63bafeb098..4fb01e02130 100644
--- a/src/devices/bus/scsi/scsihd.cpp
+++ b/src/devices/bus/scsi/scsihd.cpp
@@ -29,7 +29,7 @@ void scsihd_device::device_start()
scsihle_device::device_start();
}
-MACHINE_CONFIG_START(scsihd_device::device_add_mconfig)
- MCFG_HARDDISK_ADD("image")
- MCFG_HARDDISK_INTERFACE("scsi_hdd")
-MACHINE_CONFIG_END
+void scsihd_device::device_add_mconfig(machine_config &config)
+{
+ HARDDISK(config, "image", "scsi_hdd");
+}
diff --git a/src/devices/bus/scsi/scsihle.h b/src/devices/bus/scsi/scsihle.h
index bce047ae474..e98e38122e7 100644
--- a/src/devices/bus/scsi/scsihle.h
+++ b/src/devices/bus/scsi/scsihle.h
@@ -84,10 +84,4 @@ extern const input_device_default DEVICE_INPUT_DEFAULTS_NAME(SCSI_ID_5)[];
extern const input_device_default DEVICE_INPUT_DEFAULTS_NAME(SCSI_ID_6)[];
extern const input_device_default DEVICE_INPUT_DEFAULTS_NAME(SCSI_ID_7)[];
-#define MCFG_SCSIDEV_ADD(_tag, _option, _type, _id) \
- MCFG_DEVICE_MODIFY(_tag ) \
- MCFG_SLOT_OPTION_ADD( _option, _type ) \
- MCFG_SLOT_OPTION_DEVICE_INPUT_DEFAULTS( _option, _id ) \
- MCFG_SLOT_DEFAULT_OPTION( _option )
-
#endif // MAME_BUS_SCSI_SCSIHLE_H
diff --git a/src/devices/bus/scv/slot.h b/src/devices/bus/scv/slot.h
index 5dc3ec6e5b7..357c593c404 100644
--- a/src/devices/bus/scv/slot.h
+++ b/src/devices/bus/scv/slot.h
@@ -66,7 +66,17 @@ class scv_cart_slot_device : public device_t,
{
public:
// construction/destruction
- scv_cart_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+ template <typename T>
+ scv_cart_slot_device(machine_config const &mconfig, char const *tag, device_t *owner, T &&opts, char const *dflt)
+ : scv_cart_slot_device(mconfig, tag, owner, 0)
+ {
+ option_reset();
+ opts(*this);
+ set_default_option(dflt);
+ set_fixed(false);
+ }
+
+ scv_cart_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock = 0);
virtual ~scv_cart_slot_device();
// image-level overrides
@@ -116,8 +126,4 @@ DECLARE_DEVICE_TYPE(SCV_CART_SLOT, scv_cart_slot_device)
#define SCVSLOT_ROM_REGION_TAG ":cart:rom"
-#define MCFG_SCV_CARTRIDGE_ADD(_tag,_slot_intf,_def_slot) \
- MCFG_DEVICE_ADD(_tag, SCV_CART_SLOT, 0) \
- MCFG_DEVICE_SLOT_INTERFACE(_slot_intf, _def_slot, false)
-
#endif // MAME_BUS_SCV_SLOT_H
diff --git a/src/devices/bus/sega8/ccatch.cpp b/src/devices/bus/sega8/ccatch.cpp
index cbe9840bae7..1180e7a793b 100644
--- a/src/devices/bus/sega8/ccatch.cpp
+++ b/src/devices/bus/sega8/ccatch.cpp
@@ -53,6 +53,7 @@ static void sg1000_card(device_slot_interface &device)
device.option_add_internal("rom", SEGA8_ROM_STD);
}
-MACHINE_CONFIG_START(sega8_cardcatch_device::device_add_mconfig)
- MCFG_SG1000_CARD_ADD("cardslot", sg1000_card, nullptr)
-MACHINE_CONFIG_END
+void sega8_cardcatch_device::device_add_mconfig(machine_config &config)
+{
+ SG1000_CARD_SLOT(config, "cardslot", sg1000_card, nullptr);
+}
diff --git a/src/devices/bus/sega8/mgear.cpp b/src/devices/bus/sega8/mgear.cpp
index 977ea1f18e7..46fb6a4ad52 100644
--- a/src/devices/bus/sega8/mgear.cpp
+++ b/src/devices/bus/sega8/mgear.cpp
@@ -38,7 +38,8 @@ void sega8_mgear_device::device_reset()
}
-MACHINE_CONFIG_START(sega8_mgear_device::device_add_mconfig)
- MCFG_SMS_CARTRIDGE_ADD("subslot", sms_cart, nullptr)
- MCFG_SOFTWARE_LIST_ADD("cart_list","sms")
-MACHINE_CONFIG_END
+void sega8_mgear_device::device_add_mconfig(machine_config &config)
+{
+ SMS_CART_SLOT(config, "subslot", sms_cart, nullptr);
+ SOFTWARE_LIST(config, "cart_list").set_original("sms");
+}
diff --git a/src/devices/bus/sega8/rom.cpp b/src/devices/bus/sega8/rom.cpp
index 72017b5c795..1f039361a12 100644
--- a/src/devices/bus/sega8/rom.cpp
+++ b/src/devices/bus/sega8/rom.cpp
@@ -42,6 +42,9 @@ DEFINE_DEVICE_TYPE(SEGA8_ROM_KOREAN, sega8_korean_device, "sega8_kor
DEFINE_DEVICE_TYPE(SEGA8_ROM_KOREAN_NB, sega8_korean_nb_device, "sega8_korean_nb", "SMS Korean No-Bank Mapper Carts")
DEFINE_DEVICE_TYPE(SEGA8_ROM_SEOJIN, sega8_seojin_device, "sega8_seojin", "SMS Seo Jin Multi-cart")
+// Specific SC-3000 cart types
+DEFINE_DEVICE_TYPE(SEGA8_ROM_MULTICART, sega8_multicart_device, "sega8_multicart", "SC-3000 MkII Multicart Cart")
+DEFINE_DEVICE_TYPE(SEGA8_ROM_MEGACART, sega8_megacart_device, "sega8_megacart", "SC-3000 Megacart Cart")
sega8_rom_device::sega8_rom_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock)
@@ -185,6 +188,18 @@ sega8_seojin_device::sega8_seojin_device(const machine_config &mconfig, const ch
}
+sega8_multicart_device::sega8_multicart_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+ : sega8_rom_device(mconfig, SEGA8_ROM_MULTICART, tag, owner, clock)
+{
+}
+
+
+sega8_megacart_device::sega8_megacart_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+ : sega8_rom_device(mconfig, SEGA8_ROM_MEGACART, tag, owner, clock)
+{
+}
+
+
void sega8_rom_device::device_start()
{
save_item(NAME(m_rom_bank_base));
@@ -268,6 +283,28 @@ void sega8_zemina_device::device_reset()
}
+void sega8_multicart_device::device_start()
+{
+ save_item(NAME(m_block));
+}
+
+void sega8_multicart_device::device_reset()
+{
+ m_block = 0xff;
+}
+
+
+void sega8_megacart_device::device_start()
+{
+ save_item(NAME(m_block));
+}
+
+void sega8_megacart_device::device_reset()
+{
+ m_block = 0xff;
+}
+
+
// initial bank setup needs to know how many 16K banks are available, so it needs to be called during cart loading...
void sega8_rom_device::late_bank_setup()
@@ -1023,3 +1060,78 @@ READ8_MEMBER(sega8_seojin_device::read_ram)
return m_ram[offset & 0x3fff];
}
+/*-------------------------------------------------
+
+ SC-3000 Survivors MkII Multicart
+
+-------------------------------------------------*/
+
+READ8_MEMBER(sega8_multicart_device::read_cart)
+{
+ // 16K of RAM sits in 0x8000-0xbfff
+ if (offset >= 0x8000)
+ return m_ram[offset & 0x3fff];
+
+ return m_rom[(offset & 0x7fff) | (m_block << 15) % m_rom_size];
+}
+
+WRITE8_MEMBER(sega8_multicart_device::write_cart)
+{
+ // 16K of RAM sits in 0x8000-0xbfff
+ if (offset >= 0x8000)
+ m_ram[offset & 0x3fff] = data;
+}
+
+READ8_MEMBER(sega8_multicart_device::read_ram)
+{
+ return m_ram[0x4000 + (offset & 0x3fff)];
+}
+
+WRITE8_MEMBER(sega8_multicart_device::write_ram)
+{
+ m_ram[0x4000 + (offset & 0x3fff)] = data;
+}
+
+WRITE8_MEMBER(sega8_multicart_device::write_io)
+{
+ if ((offset & 0xe0) == 0xe0)
+ m_block = (data & 0x80) ? ((data & 0x1f) | ((data & 0x40) ? 0x20 : 0x00)) : 0x3f;
+}
+
+/*-------------------------------------------------
+
+ SC-3000 Survivors Megacart
+
+-------------------------------------------------*/
+
+READ8_MEMBER(sega8_megacart_device::read_cart)
+{
+ // 16K of RAM sits in 0x8000-0xbfff
+ if (offset >= 0x8000)
+ return m_ram[offset & 0x3fff];
+
+ return m_rom[(offset & 0x7fff) | (m_block << 15) % m_rom_size];
+}
+
+WRITE8_MEMBER(sega8_megacart_device::write_cart)
+{
+ // 16K of RAM sits in 0x8000-0xbfff
+ if (offset >= 0x8000)
+ m_ram[offset & 0x3fff] = data;
+}
+
+READ8_MEMBER(sega8_megacart_device::read_ram)
+{
+ return m_ram[0x4000 + (offset & 0x3fff)];
+}
+
+WRITE8_MEMBER(sega8_megacart_device::write_ram)
+{
+ m_ram[0x4000 + (offset & 0x3fff)] = data;
+}
+
+WRITE8_MEMBER(sega8_megacart_device::write_io)
+{
+ if ((offset & 0xe0) == 0xe0)
+ m_block = (data & 0x1f) | (data & 0xc0) >> 1;
+}
diff --git a/src/devices/bus/sega8/rom.h b/src/devices/bus/sega8/rom.h
index c299ff261c5..4f9dc80d967 100644
--- a/src/devices/bus/sega8/rom.h
+++ b/src/devices/bus/sega8/rom.h
@@ -397,6 +397,60 @@ protected:
};
+// ======================> sega8_multicart_device
+
+class sega8_multicart_device : public sega8_rom_device
+{
+public:
+ // construction/destruction
+ sega8_multicart_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+
+ // reading and writing
+ virtual DECLARE_READ8_MEMBER(read_cart) override;
+ virtual DECLARE_WRITE8_MEMBER(write_cart) override;
+ virtual DECLARE_WRITE8_MEMBER(write_io) override;
+
+ // has internal RAM which overwrites the system one!
+ virtual DECLARE_READ8_MEMBER(read_ram) override;
+ virtual DECLARE_WRITE8_MEMBER(write_ram) override;
+
+protected:
+ // device-level overrides
+ virtual void device_start() override;
+ virtual void device_reset() override;
+
+private:
+ uint8_t m_block;
+};
+
+
+// ======================> sega8_megacart_device
+
+class sega8_megacart_device : public sega8_rom_device
+{
+public:
+ // construction/destruction
+ sega8_megacart_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+
+ // reading and writing
+ virtual DECLARE_READ8_MEMBER(read_cart) override;
+ virtual DECLARE_WRITE8_MEMBER(write_cart) override;
+ virtual DECLARE_WRITE8_MEMBER(write_io) override;
+
+ // has internal RAM which overwrites the system one!
+ virtual DECLARE_READ8_MEMBER(read_ram) override;
+ virtual DECLARE_WRITE8_MEMBER(write_ram) override;
+
+protected:
+ // device-level overrides
+ virtual void device_start() override;
+ virtual void device_reset() override;
+
+private:
+ uint8_t m_block;
+};
+
+
// device type definition
DECLARE_DEVICE_TYPE(SEGA8_ROM_STD, sega8_rom_device)
DECLARE_DEVICE_TYPE(SEGA8_ROM_OTHELLO, sega8_othello_device)
@@ -416,5 +470,7 @@ DECLARE_DEVICE_TYPE(SEGA8_ROM_HICOM, sega8_hicom_device)
DECLARE_DEVICE_TYPE(SEGA8_ROM_KOREAN, sega8_korean_device)
DECLARE_DEVICE_TYPE(SEGA8_ROM_KOREAN_NB, sega8_korean_nb_device)
DECLARE_DEVICE_TYPE(SEGA8_ROM_SEOJIN, sega8_seojin_device)
+DECLARE_DEVICE_TYPE(SEGA8_ROM_MULTICART, sega8_multicart_device)
+DECLARE_DEVICE_TYPE(SEGA8_ROM_MEGACART, sega8_megacart_device)
#endif // MAME_BUS_SEGA8_ROM_H
diff --git a/src/devices/bus/sega8/sega8_slot.cpp b/src/devices/bus/sega8/sega8_slot.cpp
index 3242654b829..e897f6c53e8 100644
--- a/src/devices/bus/sega8/sega8_slot.cpp
+++ b/src/devices/bus/sega8/sega8_slot.cpp
@@ -40,6 +40,16 @@
DEFINE_DEVICE_TYPE(SEGA8_CART_SLOT, sega8_cart_slot_device, "sega8_cart_slot", "Sega Master System / Game Gear / SG-1000 Cartridge Slot")
DEFINE_DEVICE_TYPE(SEGA8_CARD_SLOT, sega8_card_slot_device, "sega8_card_slot", "Sega Master System / Game Gear / SG-1000 Card Slot")
+DEFINE_DEVICE_TYPE(SG1000_CART_SLOT, sg1000_cart_slot_device, "sg1000_cart_slot", "Sega SG-1000 Cartridge Slot")
+DEFINE_DEVICE_TYPE(OMV_CART_SLOT, omv_cart_slot_device, "omv_cart_slot", "Tsukuda Original Othello Multivision FG-1000 / FG-2000 Cartridge Slot")
+DEFINE_DEVICE_TYPE(SC3000_CART_SLOT, sc3000_cart_slot_device, "sc3000_cart_slot", "Sega SC-3000 Cartridge Slot")
+DEFINE_DEVICE_TYPE(SG1000MK3_CART_SLOT, sg1000mk3_cart_slot_device, "sg1000mk3_cart_slot", "Sega SG-1000 Mark III Cartridge Slot")
+DEFINE_DEVICE_TYPE(SMS_CART_SLOT, sms_cart_slot_device, "sms_cart_slot", "Sega Master System Cartridge Slot")
+DEFINE_DEVICE_TYPE(GAMEGEAR_CART_SLOT, gamegear_cart_slot_device, "gamegear_cart_slot", "Sega Game Gear Cartridge Slot")
+
+DEFINE_DEVICE_TYPE(SMS_CARD_SLOT, sms_card_slot_device, "sms_card_slot", "Sega Master System Card Slot")
+DEFINE_DEVICE_TYPE(SG1000_CARD_SLOT, sg1000_card_slot_device, "sg1000_card_slot", "Sega SG-1000 Card Slot")
+
//**************************************************************************
// SMS cartridges Interface
@@ -112,10 +122,7 @@ sega8_cart_slot_device::sega8_cart_slot_device(const machine_config &mconfig, de
, device_image_interface(mconfig, *this)
, device_slot_interface(mconfig, *this)
, m_type(SEGA8_BASE_ROM)
- , m_must_be_loaded(false)
, m_is_card(is_card)
- , m_interface("sms_cart")
- , m_extensions("bin")
, m_cart(nullptr)
{
}
@@ -125,11 +132,57 @@ sega8_cart_slot_device::sega8_cart_slot_device(const machine_config &mconfig, co
{
}
+sega8_card_slot_device::sega8_card_slot_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock)
+ : sega8_cart_slot_device(mconfig, type, tag, owner, clock, true)
+{
+}
+
sega8_card_slot_device::sega8_card_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
- : sega8_cart_slot_device(mconfig, SEGA8_CARD_SLOT, tag, owner, clock, true)
+ : sega8_card_slot_device(mconfig, SEGA8_CARD_SLOT, tag, owner, clock)
+{
+}
+
+
+sg1000_cart_slot_device::sg1000_cart_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+ : sega8_cart_slot_device(mconfig, SG1000_CART_SLOT, tag, owner, clock)
+{
+}
+
+omv_cart_slot_device::omv_cart_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+ : sega8_cart_slot_device(mconfig, OMV_CART_SLOT, tag, owner, clock)
+{
+}
+
+sc3000_cart_slot_device::sc3000_cart_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+ : sega8_cart_slot_device(mconfig, SC3000_CART_SLOT, tag, owner, clock)
+{
+}
+
+sg1000mk3_cart_slot_device::sg1000mk3_cart_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+ : sega8_cart_slot_device(mconfig, SG1000MK3_CART_SLOT, tag, owner, clock)
+{
+}
+
+sms_cart_slot_device::sms_cart_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+ : sega8_cart_slot_device(mconfig, SMS_CART_SLOT, tag, owner, clock)
{
}
+gamegear_cart_slot_device::gamegear_cart_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+ : sega8_cart_slot_device(mconfig, GAMEGEAR_CART_SLOT, tag, owner, clock)
+{
+}
+
+
+sms_card_slot_device::sms_card_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+ : sega8_card_slot_device(mconfig, SMS_CARD_SLOT, tag, owner, clock)
+{
+}
+
+sg1000_card_slot_device::sg1000_card_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+ : sega8_card_slot_device(mconfig, SG1000_CARD_SLOT, tag, owner, clock)
+{
+}
//-------------------------------------------------
// sega8_cart_slot_device - destructor
@@ -178,7 +231,9 @@ static const sega8_slot slot_list[] =
{ SEGA8_MUSIC_EDITOR, "music_editor" },
{ SEGA8_DAHJEE_TYPEA, "dahjee_typea" },
{ SEGA8_DAHJEE_TYPEB, "dahjee_typeb" },
- { SEGA8_SEOJIN, "seojin" }
+ { SEGA8_SEOJIN, "seojin" },
+ { SEGA8_MULTICART, "multicart" },
+ { SEGA8_MEGACART, "megacart" }
};
static int sega8_get_pcb_id(const char *slot)
@@ -277,7 +332,7 @@ void sega8_cart_slot_device::setup_ram()
m_cart->ram_alloc(0x800);
m_cart->set_has_battery(false);
}
- else if (m_type == SEGA8_BASIC_L3)
+ else if (m_type == SEGA8_BASIC_L3 || m_type == SEGA8_MULTICART || m_type == SEGA8_MEGACART)
{
m_cart->ram_alloc(0x8000);
m_cart->set_has_battery(false);
@@ -584,6 +639,14 @@ int sega8_cart_slot_device::get_cart_type(const uint8_t *ROM, uint32_t len) cons
type = SEGA8_MUSIC_EDITOR;
}
+ // SC-3000 Survivors Multicart
+ if (len == 0x200000)
+ type = SEGA8_MULTICART;
+
+ // SC-3000 Survivors Megacart
+ if (len == 0x400000)
+ type = SEGA8_MEGACART;
+
return type;
}
@@ -638,6 +701,14 @@ READ8_MEMBER(sega8_cart_slot_device::read_ram)
return 0xff;
}
+READ8_MEMBER(sega8_cart_slot_device::read_io)
+{
+ if (m_cart)
+ return m_cart->read_io(space, offset);
+ else
+ return 0xff;
+}
+
/*-------------------------------------------------
write
@@ -661,6 +732,12 @@ WRITE8_MEMBER(sega8_cart_slot_device::write_ram)
m_cart->write_ram(space, offset, data);
}
+WRITE8_MEMBER(sega8_cart_slot_device::write_io)
+{
+ if (m_cart)
+ m_cart->write_io(space, offset, data);
+}
+
/*-------------------------------------------------
Internal header logging
@@ -817,6 +894,8 @@ void sg1000_cart(device_slot_interface &device)
device.option_add_internal("dahjee_typea", SEGA8_ROM_DAHJEE_TYPEA);
device.option_add_internal("dahjee_typeb", SEGA8_ROM_DAHJEE_TYPEB);
device.option_add_internal("cardcatcher", SEGA8_ROM_CARDCATCH);
+ device.option_add_internal("multicart", SEGA8_ROM_MULTICART);
+ device.option_add_internal("megacart", SEGA8_ROM_MEGACART);
}
void sg1000mk3_cart(device_slot_interface &device)
diff --git a/src/devices/bus/sega8/sega8_slot.h b/src/devices/bus/sega8/sega8_slot.h
index 9b653d4887b..ca3ebdc6172 100644
--- a/src/devices/bus/sega8/sega8_slot.h
+++ b/src/devices/bus/sega8/sega8_slot.h
@@ -32,7 +32,9 @@ enum
SEGA8_MUSIC_EDITOR,
SEGA8_DAHJEE_TYPEA,
SEGA8_DAHJEE_TYPEB,
- SEGA8_SEOJIN
+ SEGA8_SEOJIN,
+ SEGA8_MULTICART,
+ SEGA8_MEGACART
};
@@ -56,6 +58,9 @@ public:
// a few carts (for SG1000) acts as a RAM expansion, taking control of the system RAM in 0xc000-0xffff
virtual DECLARE_READ8_MEMBER(read_ram) { return 0xff; }
virtual DECLARE_WRITE8_MEMBER(write_ram) { }
+ // the SC3000 has I/OR, I/OW lines connected
+ virtual DECLARE_READ8_MEMBER(read_io) { return 0xff; }
+ virtual DECLARE_WRITE8_MEMBER(write_io) { }
void rom_alloc(uint32_t size, const char *tag);
void ram_alloc(uint32_t size);
@@ -126,18 +131,14 @@ public:
void save_ram() { if (m_cart && m_cart->get_ram_size()) m_cart->save_ram(); }
- void set_mandatory(bool val) { m_must_be_loaded = val; }
- void set_intf(const char * interface) { m_interface = interface; }
- void set_ext(const char * extensions) { m_extensions = extensions; }
-
virtual iodevice_t image_type() const override { return IO_CARTSLOT; }
virtual bool is_readable() const override { return 1; }
virtual bool is_writeable() const override { return 0; }
virtual bool is_creatable() const override { return 0; }
- virtual bool must_be_loaded() const override { return m_must_be_loaded; }
virtual bool is_reset_on_load() const override { return 1; }
- virtual const char *image_interface() const override { return m_interface; }
- virtual const char *file_extensions() const override { return m_extensions; }
+ virtual bool must_be_loaded() const override { return false; }
+ virtual const char *image_interface() const override { return "sms_cart"; }
+ virtual const char *file_extensions() const override { return "bin"; }
// slot interface overrides
virtual std::string get_default_card_software(get_default_card_software_hook &hook) const override;
@@ -148,20 +149,20 @@ public:
virtual DECLARE_WRITE8_MEMBER(write_mapper);
virtual DECLARE_READ8_MEMBER(read_ram);
virtual DECLARE_WRITE8_MEMBER(write_ram);
+ virtual DECLARE_READ8_MEMBER(read_io);
+ virtual DECLARE_WRITE8_MEMBER(write_io);
int get_lphaser_xoffs() { return m_cart ? m_cart->get_lphaser_xoffs() : -1; }
int get_sms_mode() { return m_cart->get_sms_mode(); }
protected:
- sega8_cart_slot_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock, bool is_card);
+ sega8_cart_slot_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock, bool is_card = false);
// device-level overrides
virtual void device_start() override;
int m_type;
- bool m_must_be_loaded, m_is_card;
- const char *m_interface;
- const char *m_extensions;
+ bool m_is_card;
device_sega8_cart_interface* m_cart;
};
@@ -175,8 +176,188 @@ public:
virtual const char *custom_instance_name() const override { return "card"; }
virtual const char *custom_brief_instance_name() const override { return "card"; }
+
+protected:
+ // construction/destruction
+ sega8_card_slot_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock);
+};
+
+// ======================> sg1000_cart_slot_device
+
+class sg1000_cart_slot_device : public sega8_cart_slot_device
+{
+public:
+ // construction/destruction
+ template <typename T>
+ sg1000_cart_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, T &&opts, const char *dflt)
+ : sg1000_cart_slot_device(mconfig, tag, owner, u32(0))
+ {
+ option_reset();
+ opts(*this);
+ set_default_option(dflt);
+ set_fixed(false);
+ }
+ sg1000_cart_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+ virtual bool must_be_loaded() const override { return true; }
+ virtual const char *image_interface() const override { return "sg1000_cart"; }
+ virtual const char *file_extensions() const override { return "bin,sg"; }
+};
+
+// ======================> omv_cart_slot_device
+
+class omv_cart_slot_device : public sega8_cart_slot_device
+{
+public:
+ // construction/destruction
+ template <typename T>
+ omv_cart_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, T &&opts, const char *dflt)
+ : omv_cart_slot_device(mconfig, tag, owner, u32(0))
+ {
+ option_reset();
+ opts(*this);
+ set_default_option(dflt);
+ set_fixed(false);
+ }
+ omv_cart_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+ virtual bool must_be_loaded() const override { return false; }
+ virtual const char *image_interface() const override { return "sg1000_cart"; }
+ virtual const char *file_extensions() const override { return "bin,sg"; }
+};
+
+// ======================> sc3000_cart_slot_device
+
+class sc3000_cart_slot_device : public sega8_cart_slot_device
+{
+public:
+ // construction/destruction
+ template <typename T>
+ sc3000_cart_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, T &&opts, const char *dflt)
+ : sc3000_cart_slot_device(mconfig, tag, owner, u32(0))
+ {
+ option_reset();
+ opts(*this);
+ set_default_option(dflt);
+ set_fixed(false);
+ }
+ sc3000_cart_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+ virtual bool must_be_loaded() const override { return true; }
+ virtual const char *image_interface() const override { return "sg1000_cart"; }
+ virtual const char *file_extensions() const override { return "bin,sg,sc"; }
+};
+
+// ======================> sg1000mk3_cart_slot_device
+
+class sg1000mk3_cart_slot_device : public sega8_cart_slot_device
+{
+public:
+ // construction/destruction
+ template <typename T>
+ sg1000mk3_cart_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, T &&opts, const char *dflt)
+ : sg1000mk3_cart_slot_device(mconfig, tag, owner, u32(0))
+ {
+ option_reset();
+ opts(*this);
+ set_default_option(dflt);
+ set_fixed(false);
+ }
+ sg1000mk3_cart_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+ virtual bool must_be_loaded() const override { return false; }
+ virtual const char *image_interface() const override { return "sms_cart,sg1000_cart"; }
+ virtual const char *file_extensions() const override { return "bin,sms,sg"; }
};
+// ======================> sms_cart_slot_device
+
+class sms_cart_slot_device : public sega8_cart_slot_device
+{
+public:
+ // construction/destruction
+ template <typename T>
+ sms_cart_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, T &&opts, const char *dflt)
+ : sms_cart_slot_device(mconfig, tag, owner, u32(0))
+ {
+ option_reset();
+ opts(*this);
+ set_default_option(dflt);
+ set_fixed(false);
+ }
+ sms_cart_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+ virtual bool must_be_loaded() const override { return false; }
+ virtual const char *image_interface() const override { return "sms_cart"; }
+ virtual const char *file_extensions() const override { return "bin,sms"; }
+};
+
+// ======================> gamegear_cart_slot_device
+
+class gamegear_cart_slot_device : public sega8_cart_slot_device
+{
+public:
+ // construction/destruction
+ template <typename T>
+ gamegear_cart_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, T &&opts, const char *dflt)
+ : gamegear_cart_slot_device(mconfig, tag, owner, u32(0))
+ {
+ option_reset();
+ opts(*this);
+ set_default_option(dflt);
+ set_fixed(false);
+ }
+ gamegear_cart_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+ virtual bool must_be_loaded() const override { return true; }
+ virtual const char *image_interface() const override { return "gamegear_cart"; }
+ virtual const char *file_extensions() const override { return "bin,gg"; }
+};
+
+
+// ======================> sms_card_slot_device
+
+class sms_card_slot_device : public sega8_card_slot_device
+{
+public:
+ // construction/destruction
+ template <typename T>
+ sms_card_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, T &&opts, const char *dflt)
+ : sms_card_slot_device(mconfig, tag, owner, u32(0))
+ {
+ option_reset();
+ opts(*this);
+ set_default_option(dflt);
+ set_fixed(false);
+ }
+ sms_card_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+ virtual bool must_be_loaded() const override { return false; }
+ virtual const char *image_interface() const override { return "sms_card"; }
+ virtual const char *file_extensions() const override { return "bin"; }
+};
+
+// ======================> sg1000_card_slot_device
+
+class sg1000_card_slot_device : public sega8_card_slot_device
+{
+public:
+ // construction/destruction
+ template <typename T>
+ sg1000_card_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, T &&opts, const char *dflt)
+ : sg1000_card_slot_device(mconfig, tag, owner, u32(0))
+ {
+ option_reset();
+ opts(*this);
+ set_default_option(dflt);
+ set_fixed(false);
+ }
+ sg1000_card_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+ virtual const char *image_interface() const override { return "sg1000_cart"; }
+ virtual const char *file_extensions() const override { return "bin,sg"; }
+};
+
+DECLARE_DEVICE_TYPE(SG1000_CART_SLOT, sg1000_cart_slot_device)
+DECLARE_DEVICE_TYPE(OMV_CART_SLOT, omv_cart_slot_device)
+DECLARE_DEVICE_TYPE(SC3000_CART_SLOT, sc3000_cart_slot_device)
+DECLARE_DEVICE_TYPE(SG1000MK3_CART_SLOT, sg1000mk3_cart_slot_device)
+DECLARE_DEVICE_TYPE(SMS_CART_SLOT, sms_cart_slot_device)
+DECLARE_DEVICE_TYPE(GAMEGEAR_CART_SLOT, gamegear_cart_slot_device)
+DECLARE_DEVICE_TYPE(SMS_CARD_SLOT, sms_card_slot_device)
+DECLARE_DEVICE_TYPE(SG1000_CARD_SLOT, sg1000_card_slot_device)
/***************************************************************************
DEVICE CONFIGURATION MACROS
@@ -185,63 +366,6 @@ public:
#define S8SLOT_ROM_REGION_TAG ":cart:rom"
-#define MCFG_SG1000_CARTRIDGE_ADD(_tag,_slot_intf,_def_slot) \
- MCFG_DEVICE_ADD(_tag, SEGA8_CART_SLOT, 0) \
- MCFG_DEVICE_SLOT_INTERFACE(_slot_intf, _def_slot, false) \
- static_cast<sega8_cart_slot_device *>(device)->set_mandatory(true); \
- static_cast<sega8_cart_slot_device *>(device)->set_intf("sg1000_cart"); \
- static_cast<sega8_cart_slot_device *>(device)->set_ext("bin,sg");
-
-#define MCFG_OMV_CARTRIDGE_ADD(_tag,_slot_intf,_def_slot) \
- MCFG_DEVICE_ADD(_tag, SEGA8_CART_SLOT, 0) \
- MCFG_DEVICE_SLOT_INTERFACE(_slot_intf, _def_slot, false) \
- static_cast<sega8_cart_slot_device *>(device)->set_mandatory(false); \
- static_cast<sega8_cart_slot_device *>(device)->set_intf("sg1000_cart"); \
- static_cast<sega8_cart_slot_device *>(device)->set_ext("bin,sg");
-
-#define MCFG_SC3000_CARTRIDGE_ADD(_tag,_slot_intf,_def_slot) \
- MCFG_DEVICE_ADD(_tag, SEGA8_CART_SLOT, 0) \
- MCFG_DEVICE_SLOT_INTERFACE(_slot_intf, _def_slot, false) \
- static_cast<sega8_cart_slot_device *>(device)->set_mandatory(true); \
- static_cast<sega8_cart_slot_device *>(device)->set_intf("sg1000_cart"); \
- static_cast<sega8_cart_slot_device *>(device)->set_ext("bin,sg,sc");
-
-#define MCFG_SG1000MK3_CARTRIDGE_ADD(_tag,_slot_intf,_def_slot) \
- MCFG_DEVICE_ADD(_tag, SEGA8_CART_SLOT, 0) \
- MCFG_DEVICE_SLOT_INTERFACE(_slot_intf, _def_slot, false) \
- static_cast<sega8_cart_slot_device *>(device)->set_mandatory(false); \
- static_cast<sega8_cart_slot_device *>(device)->set_intf("sms_cart,sg1000_cart"); \
- static_cast<sega8_cart_slot_device *>(device)->set_ext("bin,sms,sg");
-
-#define MCFG_SMS_CARTRIDGE_ADD(_tag,_slot_intf,_def_slot) \
- MCFG_DEVICE_ADD(_tag, SEGA8_CART_SLOT, 0) \
- MCFG_DEVICE_SLOT_INTERFACE(_slot_intf, _def_slot, false) \
- static_cast<sega8_cart_slot_device *>(device)->set_mandatory(false); \
- static_cast<sega8_cart_slot_device *>(device)->set_intf("sms_cart"); \
- static_cast<sega8_cart_slot_device *>(device)->set_ext("bin,sms");
-
-#define MCFG_GG_CARTRIDGE_ADD(_tag,_slot_intf,_def_slot) \
- MCFG_DEVICE_ADD(_tag, SEGA8_CART_SLOT, 0) \
- MCFG_DEVICE_SLOT_INTERFACE(_slot_intf, _def_slot, false) \
- static_cast<sega8_cart_slot_device *>(device)->set_mandatory(true); \
- static_cast<sega8_cart_slot_device *>(device)->set_intf("gamegear_cart"); \
- static_cast<sega8_cart_slot_device *>(device)->set_ext("bin,gg");
-
-
-
-#define MCFG_SMS_CARD_ADD(_tag,_slot_intf,_def_slot) \
- MCFG_DEVICE_ADD(_tag, SEGA8_CARD_SLOT, 0) \
- MCFG_DEVICE_SLOT_INTERFACE(_slot_intf, _def_slot, false) \
- static_cast<sega8_card_slot_device *>(device)->set_mandatory(false); \
- static_cast<sega8_card_slot_device *>(device)->set_intf("sms_card"); \
- static_cast<sega8_card_slot_device *>(device)->set_ext("bin");
-#define MCFG_SG1000_CARD_ADD(_tag,_slot_intf,_def_slot) \
- MCFG_DEVICE_ADD(_tag, SEGA8_CARD_SLOT, 0) \
- MCFG_DEVICE_SLOT_INTERFACE(_slot_intf, _def_slot, false) \
- static_cast<sega8_card_slot_device *>(device)->set_intf("sg1000_cart"); \
- static_cast<sega8_card_slot_device *>(device)->set_ext("bin,sg");
-
-
// slot interfaces
void sg1000_cart(device_slot_interface &device);
void sg1000mk3_cart(device_slot_interface &device);
diff --git a/src/devices/bus/sg1000_exp/fm_unit.cpp b/src/devices/bus/sg1000_exp/fm_unit.cpp
index ab759994f30..a7bdc4bcc5d 100644
--- a/src/devices/bus/sg1000_exp/fm_unit.cpp
+++ b/src/devices/bus/sg1000_exp/fm_unit.cpp
@@ -50,12 +50,13 @@ SMS version is not playing PSG sound on his Mark III with the FM unit.
DEFINE_DEVICE_TYPE(SEGA_FM_UNIT, sega_fm_unit_device, "sega_fm_unit", "SG-1000 FM Sound Unit")
-MACHINE_CONFIG_START(sega_fm_unit_device::device_add_mconfig)
- MCFG_DEVICE_ADD("ym2413", YM2413, XTAL(10'738'635)/3)
+void sega_fm_unit_device::device_add_mconfig(machine_config &config)
+{
+ YM2413(config, m_ym, XTAL(10'738'635)/3);
// if this output gain is changed, the gain set when unmute the output need
// to be changed too, probably along the gain set for SMSJ/SMSKRFM drivers.
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, ":mono", 1.00)
-MACHINE_CONFIG_END
+ m_ym->add_route(ALL_OUTPUTS, ":mono", 1.00);
+}
//**************************************************************************
@@ -122,10 +123,10 @@ WRITE8_MEMBER(sega_fm_unit_device::peripheral_w)
switch (offset)
{
case 0: // register port
- m_ym->write(space, 0, data & 0x3f);
+ m_ym->write(0, data & 0x3f);
break;
case 1: // data port
- m_ym->write(space, 1, data);
+ m_ym->write(1, data);
break;
case 2: // control port
case 3: // mirror
diff --git a/src/devices/bus/sg1000_exp/kblink.cpp b/src/devices/bus/sg1000_exp/kblink.cpp
new file mode 100644
index 00000000000..039c7f91196
--- /dev/null
+++ b/src/devices/bus/sg1000_exp/kblink.cpp
@@ -0,0 +1,179 @@
+// license:BSD-3-Clause
+// copyright-holders:Enik Land
+/**********************************************************************
+
+ Sega SK-1100 keyboard link cable emulation
+
+The cable is used only to link two Mark III's through keyboard, what
+is supported by the game F-16 Fighting Falcon for its 2 players mode.
+
+Keyboard link cable info (originally from http://homepage3.nifty.com/st-2/,
+but taken from http://www.smspower.org/Games/F16FightingFalcon-SMS-Talk):
+
+- Cable is 7-pin DIN.
+- Crossover scheme of the cable to connect pins
+
+ From To
+ 1 1
+ 2 6
+ 3 3
+ 4 5
+ 5 4
+ 6 2
+ 7 7
+
+Pinout of the printer port (from Charles MacDonald's sc3000h-20040729.txt
+document, with the function of pin 6 corrected to /FAULT).
+Numbering in counterclockwise/anticlockwise direction:
+
+ 1 : Unused (not connected to anything)
+ 2 : PPI PC5 (DATA output)
+ 3 : PPI PC7 (/FEED output)
+ 4 : PPI PB6 (BUSY input)
+ 5 : PPI PC6 (/RESET output)
+ 6 : PPI PB5 (/FAULT input)
+ 7 : GND
+
+**********************************************************************/
+
+#include "emu.h"
+#include "kblink.h"
+
+
+
+//**************************************************************************
+// DEVICE DEFINITIONS
+//**************************************************************************
+
+DEFINE_DEVICE_TYPE(SK1100_LINK_CABLE, sk1100_link_cable_device, "sk1100_link_cable", "SK-1100 Link Cable")
+
+
+//**************************************************************************
+// LIVE DEVICE
+//**************************************************************************
+
+//-------------------------------------------------
+// sk1100_link_cable_device - constructor
+//-------------------------------------------------
+
+sk1100_link_cable_device::sk1100_link_cable_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock) :
+ device_t(mconfig, SK1100_LINK_CABLE, tag, owner, clock),
+ device_sk1100_printer_port_interface(mconfig, *this),
+ m_stream(*this, "stream"),
+ m_input_count(0),
+ m_input_index(0),
+ m_timer_poll(nullptr),
+ m_timer_send(nullptr),
+ m_timer_read(nullptr),
+ m_update_received_data(true),
+ m_data(0),
+ m_reset(0),
+ m_feed(0),
+ m_busy(0),
+ m_fault(0)
+{
+}
+
+
+//-------------------------------------------------
+// device_start - device-specific startup
+//-------------------------------------------------
+
+void sk1100_link_cable_device::device_start()
+{
+ m_timer_poll = timer_alloc(TIMER_POLL);
+ m_timer_send = timer_alloc(TIMER_SEND);
+ m_timer_read = timer_alloc(TIMER_READ);
+
+ /* register for state saving */
+ save_item(NAME(m_data));
+ save_item(NAME(m_reset));
+ save_item(NAME(m_feed));
+ save_item(NAME(m_busy));
+ save_item(NAME(m_fault));
+ save_item(NAME(m_update_received_data));
+ save_item(NAME(m_input_count));
+ save_item(NAME(m_input_index));
+ save_pointer(NAME(m_input_buffer), sizeof(m_input_buffer));
+}
+
+//-------------------------------------------------
+// device_reset - device-specific reset
+//-------------------------------------------------
+
+void sk1100_link_cable_device::device_reset()
+{
+ queue();
+}
+
+
+//-------------------------------------------------
+// device_add_mconfig - add device configuration
+//-------------------------------------------------
+
+void sk1100_link_cable_device::device_add_mconfig(machine_config &config)
+{
+ BITBANGER(config, m_stream, 0);
+}
+
+
+void sk1100_link_cable_device::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr)
+{
+ switch (id)
+ {
+ case TIMER_POLL:
+ queue();
+ break;
+
+ case TIMER_SEND:
+ m_stream->output(u8(param));
+ break;
+
+ case TIMER_READ:
+ m_update_received_data = true;
+ break;
+
+ default:
+ break;
+ }
+}
+
+void sk1100_link_cable_device::queue()
+{
+ if (m_input_index == m_input_count)
+ {
+ m_input_index = 0;
+ m_input_count = m_stream->input(m_input_buffer, sizeof(m_input_buffer));
+ if (!m_input_count)
+ {
+ m_timer_poll->adjust(attotime::from_hz(XTAL(10'738'635)/3));
+ }
+ }
+}
+
+void sk1100_link_cable_device::set_data_read()
+{
+ // Check if a new byte from the input buffer was read for this timeslice.
+ if (m_update_received_data == true)
+ {
+ if (m_input_count != 0)
+ {
+ u8 byte = m_input_buffer[m_input_index++];
+ // there is no way to read what was sent from peer as feed bit.
+ m_fault = BIT(byte, 0); // sent from peer as data bit
+ m_busy = BIT(byte, 1); // sent from peer as reset bit
+ queue();
+ }
+ // Set to read next byte only after the end of this timeslice.
+ m_update_received_data = false;
+ m_timer_read->adjust(attotime::zero);
+ }
+}
+
+void sk1100_link_cable_device::set_data_transfer()
+{
+ u8 byte = (m_feed << 2) | (m_reset << 1) | m_data;
+ m_timer_send->adjust(attotime::zero, byte);
+}
+
+
diff --git a/src/devices/bus/sg1000_exp/kblink.h b/src/devices/bus/sg1000_exp/kblink.h
new file mode 100644
index 00000000000..65e5782f4a2
--- /dev/null
+++ b/src/devices/bus/sg1000_exp/kblink.h
@@ -0,0 +1,82 @@
+// license:BSD-3-Clause
+// copyright-holders:Enik Land
+/**********************************************************************
+
+ Sega SK-1100 keyboard link cable emulation
+
+The cable is used only to link two Mark III's through keyboard, what
+is supported by the game F-16 Fighting Falcon for its 2 players mode.
+
+**********************************************************************/
+
+#ifndef MAME_BUS_SG1000_EXP_SK1100_KBLINK_H
+#define MAME_BUS_SG1000_EXP_SK1100_KBLINK_H
+
+#pragma once
+
+
+#include "sk1100prn.h"
+#include "imagedev/bitbngr.h"
+
+
+
+//**************************************************************************
+// TYPE DEFINITIONS
+//**************************************************************************
+
+// ======================> sk1100_link_cable_device
+
+class sk1100_link_cable_device : public device_t,
+ public device_sk1100_printer_port_interface
+{
+public:
+ // construction/destruction
+ sk1100_link_cable_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
+
+protected:
+ // device-level overrides
+ virtual void device_start() override;
+ virtual void device_reset() override;
+ virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override;
+ virtual void device_add_mconfig(machine_config &config) override;
+
+ // device_sk1100_link_cable_interface overrides
+
+ virtual DECLARE_WRITE_LINE_MEMBER( input_data ) override { m_data = state; set_data_transfer(); }
+ virtual DECLARE_WRITE_LINE_MEMBER( input_reset ) override { m_reset = state; set_data_transfer(); }
+ virtual DECLARE_WRITE_LINE_MEMBER( input_feed ) override { m_feed = state; set_data_transfer(); }
+
+ virtual DECLARE_READ_LINE_MEMBER( output_fault ) override { set_data_read(); return m_fault; }
+ virtual DECLARE_READ_LINE_MEMBER( output_busy ) override { set_data_read(); return m_busy; }
+
+private:
+ static constexpr int TIMER_POLL = 1;
+ static constexpr int TIMER_SEND = 2;
+ static constexpr int TIMER_READ = 3;
+
+ void queue();
+ void set_data_transfer();
+ void set_data_read();
+
+ required_device<bitbanger_device> m_stream;
+
+ u8 m_input_buffer[1000];
+ u32 m_input_count;
+ u32 m_input_index;
+ emu_timer *m_timer_poll;
+ emu_timer *m_timer_send;
+ emu_timer *m_timer_read;
+ bool m_update_received_data;
+ int m_data;
+ int m_reset;
+ int m_feed;
+ int m_busy;
+ int m_fault;
+};
+
+
+// device type definition
+DECLARE_DEVICE_TYPE(SK1100_LINK_CABLE, sk1100_link_cable_device)
+
+
+#endif // MAME_BUS_SG1000_EXP_SK1100_KBLINK_H
diff --git a/src/devices/bus/sg1000_exp/sg1000exp.h b/src/devices/bus/sg1000_exp/sg1000exp.h
index 9a21c263407..c132b48d9dd 100644
--- a/src/devices/bus/sg1000_exp/sg1000exp.h
+++ b/src/devices/bus/sg1000_exp/sg1000exp.h
@@ -15,20 +15,6 @@
#pragma once
-
-
-//**************************************************************************
-// INTERFACE CONFIGURATION MACROS
-//**************************************************************************
-
-#define MCFG_SG1000_EXPANSION_ADD(_tag, _slot_intf, _def_slot, _fixed) \
- MCFG_DEVICE_ADD(_tag, SG1000_EXPANSION_SLOT, 0) \
- MCFG_DEVICE_SLOT_INTERFACE(_slot_intf, _def_slot, _fixed)
-#define MCFG_SG1000_EXPANSION_MODIFY(_tag) \
- MCFG_DEVICE_MODIFY(_tag)
-
-
-
//**************************************************************************
// TYPE DEFINITIONS
//**************************************************************************
@@ -41,7 +27,17 @@ class sg1000_expansion_slot_device : public device_t, public device_slot_interfa
{
public:
// construction/destruction
- sg1000_expansion_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+ template <typename T>
+ sg1000_expansion_slot_device(machine_config const &mconfig, char const *tag, device_t *owner, T &&opts, char const *dflt, bool const fixed)
+ : sg1000_expansion_slot_device(mconfig, tag, owner, 0)
+ {
+ option_reset();
+ opts(*this);
+ set_default_option(dflt);
+ set_fixed(fixed);
+ }
+
+ sg1000_expansion_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock = 0);
virtual ~sg1000_expansion_slot_device();
DECLARE_READ8_MEMBER(read);
diff --git a/src/devices/bus/sg1000_exp/sk1100.cpp b/src/devices/bus/sg1000_exp/sk1100.cpp
index e23fe34caed..1bb0a01adfd 100644
--- a/src/devices/bus/sg1000_exp/sk1100.cpp
+++ b/src/devices/bus/sg1000_exp/sk1100.cpp
@@ -12,7 +12,6 @@ Release data from the Sega Retro project:
TODO:
- SP-400 serial printer
-- Link between two Mark III's through keyboard, supported by F-16 Fighting Falcon
**********************************************************************/
@@ -110,23 +109,23 @@ static INPUT_PORTS_START( sk1100_keys )
PORT_START("PB0")
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_8) PORT_CHAR('8') PORT_CHAR('(')
- PORT_BIT( 0x06, IP_ACTIVE_LOW, IPT_UNUSED )
+ PORT_BIT( 0x0e, IP_ACTIVE_LOW, IPT_UNUSED )
PORT_START("PB1")
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_9) PORT_CHAR('9') PORT_CHAR(')')
- PORT_BIT( 0x06, IP_ACTIVE_LOW, IPT_UNUSED )
+ PORT_BIT( 0x0e, IP_ACTIVE_LOW, IPT_UNUSED )
PORT_START("PB2")
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_0) PORT_CHAR('0')
- PORT_BIT( 0x06, IP_ACTIVE_LOW, IPT_UNUSED )
+ PORT_BIT( 0x0e, IP_ACTIVE_LOW, IPT_UNUSED )
PORT_START("PB3")
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_MINUS) PORT_CHAR('-') PORT_CHAR('=')
- PORT_BIT( 0x06, IP_ACTIVE_LOW, IPT_UNUSED )
+ PORT_BIT( 0x0e, IP_ACTIVE_LOW, IPT_UNUSED )
PORT_START("PB4")
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_BACKSLASH2) PORT_CHAR('^')
- PORT_BIT( 0x06, IP_ACTIVE_LOW, IPT_UNUSED )
+ PORT_BIT( 0x0e, IP_ACTIVE_LOW, IPT_UNUSED )
PORT_START("PB5")
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("\xc2\xa5") PORT_CODE(KEYCODE_TILDE) PORT_CHAR(0x00a5)
@@ -154,24 +153,25 @@ ioport_constructor sega_sk1100_device::device_input_ports() const
}
-MACHINE_CONFIG_START(sega_sk1100_device::device_add_mconfig)
+void sega_sk1100_device::device_add_mconfig(machine_config &config)
+{
/* devices */
I8255(config, m_ppi);
m_ppi->in_pa_callback().set(FUNC(sega_sk1100_device::ppi_pa_r));
m_ppi->in_pb_callback().set(FUNC(sega_sk1100_device::ppi_pb_r));
m_ppi->out_pc_callback().set(FUNC(sega_sk1100_device::ppi_pc_w));
-// MCFG_PRINTER_ADD("sp400") /* serial printer */
+ CASSETTE(config, m_cassette);
+ m_cassette->set_formats(sc3000_cassette_formats);
+ m_cassette->set_default_state(CASSETTE_STOPPED | CASSETTE_MOTOR_ENABLED | CASSETTE_SPEAKER_ENABLED);
+ m_cassette->set_interface("sc3000_cass");
- MCFG_CASSETTE_ADD("cassette")
- MCFG_CASSETTE_FORMATS(sc3000_cassette_formats)
- MCFG_CASSETTE_DEFAULT_STATE(CASSETTE_STOPPED | CASSETTE_MOTOR_ENABLED | CASSETTE_SPEAKER_ENABLED)
- MCFG_CASSETTE_INTERFACE("sc3000_cass")
+ SK1100_PRINTER_PORT(config, m_printer_port, sk1100_printer_port_devices, nullptr);
/* software lists */
- MCFG_SOFTWARE_LIST_ADD("sc3k_cart_list","sc3000_cart")
- MCFG_SOFTWARE_LIST_ADD("cass_list","sc3000_cass")
-MACHINE_CONFIG_END
+ SOFTWARE_LIST(config, "sc3k_cart_list").set_original("sc3000_cart");
+ SOFTWARE_LIST(config, "cass_list").set_original("sc3000_cass");
+}
//**************************************************************************
// LIVE DEVICE
@@ -186,6 +186,7 @@ sega_sk1100_device::sega_sk1100_device(const machine_config &mconfig, const char
device_sg1000_expansion_slot_interface(mconfig, *this),
m_cassette(*this, "cassette"),
m_ppi(*this, UPD9255_0_TAG),
+ m_printer_port(*this, "printer"),
m_pa(*this, {"PA0", "PA1", "PA2", "PA3", "PA4", "PA5", "PA6", "PA7"}),
m_pb(*this, {"PB0", "PB1", "PB2", "PB3", "PB4", "PB5", "PB6", "PB7"}),
m_keylatch(0)
@@ -262,7 +263,7 @@ READ8_MEMBER( sega_sk1100_device::ppi_pb_r )
PB2 Keyboard input
PB3 Keyboard input
PB4 /CONT input from cartridge terminal B-11
- PB5 FAULT input from printer
+ PB5 /FAULT input from printer
PB6 BUSY input from printer
PB7 Cassette tape input
*/
@@ -273,8 +274,9 @@ READ8_MEMBER( sega_sk1100_device::ppi_pb_r )
/* cartridge contact */
data |= 0x10;
- /* printer */
- data |= 0x60;
+ /* printer port */
+ data |= m_printer_port->fault_r() << 5;
+ data |= m_printer_port->busy_r() << 6;
/* tape input */
if (m_cassette->input() > +0.0) data |= 0x80;
@@ -301,7 +303,10 @@ WRITE8_MEMBER( sega_sk1100_device::ppi_pc_w )
m_keylatch = data & 0x07;
/* cassette */
- m_cassette->output( BIT(data, 4) ? +1.0 : -1.0);
+ m_cassette->output(BIT(data, 4) ? +1.0 : -1.0);
- /* TODO printer */
+ /* printer port */
+ m_printer_port->data_w(BIT(data, 5));
+ m_printer_port->reset_w(BIT(data, 6));
+ m_printer_port->feed_w(BIT(data, 7));
}
diff --git a/src/devices/bus/sg1000_exp/sk1100.h b/src/devices/bus/sg1000_exp/sk1100.h
index 4845fe09e1c..13ff5780f64 100644
--- a/src/devices/bus/sg1000_exp/sk1100.h
+++ b/src/devices/bus/sg1000_exp/sk1100.h
@@ -13,9 +13,9 @@
#include "sg1000exp.h"
+#include "sk1100prn.h"
#include "formats/sc3000_bit.h"
#include "imagedev/cassette.h"
-#include "imagedev/printer.h"
#include "machine/i8255.h"
@@ -55,6 +55,7 @@ private:
required_device<cassette_image_device> m_cassette;
required_device<i8255_device> m_ppi;
+ required_device<sk1100_printer_port_device> m_printer_port;
required_ioport_array<8> m_pa;
required_ioport_array<8> m_pb;
diff --git a/src/devices/bus/sg1000_exp/sk1100prn.cpp b/src/devices/bus/sg1000_exp/sk1100prn.cpp
new file mode 100644
index 00000000000..b902ce3992f
--- /dev/null
+++ b/src/devices/bus/sg1000_exp/sk1100prn.cpp
@@ -0,0 +1,125 @@
+// license:BSD-3-Clause
+// copyright-holders:Enik Land
+/**********************************************************************
+
+ Sega SK-1100 keyboard printer port emulation
+
+**********************************************************************/
+
+#include "emu.h"
+#include "sk1100prn.h"
+// slot devices
+//#include "sp400.h"
+#include "kblink.h"
+
+
+
+//**************************************************************************
+// GLOBAL VARIABLES
+//**************************************************************************
+
+DEFINE_DEVICE_TYPE(SK1100_PRINTER_PORT, sk1100_printer_port_device, "sk1100_printer_port", "Sega SK-1100 Printer Port")
+
+
+
+//**************************************************************************
+// CARD INTERFACE
+//**************************************************************************
+
+//-------------------------------------------------
+// device_sk1100_printer_port_interface - constructor
+//-------------------------------------------------
+
+device_sk1100_printer_port_interface::device_sk1100_printer_port_interface(const machine_config &mconfig, device_t &device)
+ : device_slot_card_interface(mconfig,device)
+{
+}
+
+
+//-------------------------------------------------
+// ~device_sk1100_printer_port_interface - destructor
+//-------------------------------------------------
+
+device_sk1100_printer_port_interface::~device_sk1100_printer_port_interface()
+{
+}
+
+
+
+//**************************************************************************
+// LIVE DEVICE
+//**************************************************************************
+
+//-------------------------------------------------
+// sk1100_printer_port_device - constructor
+//-------------------------------------------------
+
+sk1100_printer_port_device::sk1100_printer_port_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock) :
+ device_t(mconfig, SK1100_PRINTER_PORT, tag, owner, clock),
+ device_slot_interface(mconfig, *this),
+ m_device(nullptr)
+{
+}
+
+
+//-------------------------------------------------
+// sk1100_printer_port_device - destructor
+//-------------------------------------------------
+
+sk1100_printer_port_device::~sk1100_printer_port_device()
+{
+}
+
+
+//-------------------------------------------------
+// device_start - device-specific startup
+//-------------------------------------------------
+
+void sk1100_printer_port_device::device_start()
+{
+ m_device = dynamic_cast<device_sk1100_printer_port_interface *>(get_card_device());
+}
+
+WRITE_LINE_MEMBER(sk1100_printer_port_device::data_w)
+{
+ if (m_device)
+ m_device->input_data(state);
+}
+
+WRITE_LINE_MEMBER(sk1100_printer_port_device::reset_w)
+{
+ if (m_device)
+ m_device->input_reset(state);
+}
+
+WRITE_LINE_MEMBER(sk1100_printer_port_device::feed_w)
+{
+ if (m_device)
+ m_device->input_feed(state);
+}
+
+READ_LINE_MEMBER(sk1100_printer_port_device::fault_r)
+{
+ if (m_device)
+ return m_device->output_fault();
+ else
+ return 1;
+}
+
+READ_LINE_MEMBER(sk1100_printer_port_device::busy_r)
+{
+ if (m_device)
+ return m_device->output_busy();
+ else
+ return 1;
+}
+
+//-------------------------------------------------
+// SLOT_INTERFACE( sk1100_printer_port_devices )
+//-------------------------------------------------
+
+void sk1100_printer_port_devices(device_slot_interface &device)
+{
+ //device.option_add("sp400", SP400_PRINTER); /* serial printer */
+ device.option_add("kblink", SK1100_LINK_CABLE);
+}
diff --git a/src/devices/bus/sg1000_exp/sk1100prn.h b/src/devices/bus/sg1000_exp/sk1100prn.h
new file mode 100644
index 00000000000..b926f311f29
--- /dev/null
+++ b/src/devices/bus/sg1000_exp/sk1100prn.h
@@ -0,0 +1,88 @@
+// license:BSD-3-Clause
+// copyright-holders:Enik Land
+/**********************************************************************
+
+ Sega SK-1100 keyboard printer port emulation
+
+**********************************************************************
+
+
+**********************************************************************/
+
+#ifndef MAME_BUS_SG1000_EXP_SK1100_PRN_H
+#define MAME_BUS_SG1000_EXP_SK1100_PRN_H
+
+#pragma once
+
+
+//**************************************************************************
+// TYPE DEFINITIONS
+//**************************************************************************
+
+// ======================> sk1100_printer_port_device
+
+class device_sk1100_printer_port_interface;
+
+class sk1100_printer_port_device : public device_t, public device_slot_interface
+{
+public:
+ // construction/destruction
+ template <typename T>
+ sk1100_printer_port_device(machine_config const &mconfig, char const *tag, device_t *owner, T &&opts, char const *dflt)
+ : sk1100_printer_port_device(mconfig, tag, owner, 0)
+ {
+ option_reset();
+ opts(*this);
+ set_default_option(dflt);
+ set_fixed(false);
+ }
+
+ sk1100_printer_port_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock = 0);
+ virtual ~sk1100_printer_port_device();
+
+ DECLARE_READ_LINE_MEMBER(fault_r);
+ DECLARE_READ_LINE_MEMBER(busy_r);
+
+ DECLARE_WRITE_LINE_MEMBER(data_w);
+ DECLARE_WRITE_LINE_MEMBER(reset_w);
+ DECLARE_WRITE_LINE_MEMBER(feed_w);
+
+protected:
+ // device-level overrides
+ virtual void device_start() override;
+
+private:
+ device_sk1100_printer_port_interface *m_device;
+};
+
+
+// ======================> device_sk1100_printer_port_interface
+
+// class representing interface-specific live sk1100_printer_port peripheral
+class device_sk1100_printer_port_interface : public device_slot_card_interface
+{
+ friend class sk1100_printer_port_device;
+public:
+ // construction/destruction
+ virtual ~device_sk1100_printer_port_interface();
+
+protected:
+ device_sk1100_printer_port_interface(const machine_config &mconfig, device_t &device);
+
+ virtual DECLARE_WRITE_LINE_MEMBER( input_data ) { }
+ virtual DECLARE_WRITE_LINE_MEMBER( input_reset ) { }
+ virtual DECLARE_WRITE_LINE_MEMBER( input_feed ) { }
+
+ virtual DECLARE_READ_LINE_MEMBER( output_fault ) { return 1; }
+ virtual DECLARE_READ_LINE_MEMBER( output_busy ) { return 1; }
+};
+
+
+// device type definition
+DECLARE_DEVICE_TYPE(SK1100_PRINTER_PORT, sk1100_printer_port_device)
+
+
+void sk1100_printer_port_devices(device_slot_interface &device);
+
+
+#endif // MAME_BUS_SG1000_EXP_SK1100_PRN_H
diff --git a/src/devices/bus/sms_ctrl/multitap.cpp b/src/devices/bus/sms_ctrl/multitap.cpp
index 56e7144cbd5..88dbe01acf4 100644
--- a/src/devices/bus/sms_ctrl/multitap.cpp
+++ b/src/devices/bus/sms_ctrl/multitap.cpp
@@ -129,15 +129,16 @@ READ32_MEMBER( sms_multitap_device::pixel_r )
}
-MACHINE_CONFIG_START(sms_multitap_device::device_add_mconfig)
+void sms_multitap_device::device_add_mconfig(machine_config &config)
+{
// Controller subports setup, without the TH callback declaration,
// because the circuit scheme shows TH of subports without connection.
- MCFG_SMS_CONTROL_PORT_ADD("ctrl1", sms_control_port_devices, "joypad")
- MCFG_SMS_CONTROL_PORT_PIXEL_HANDLER(READ32(*this, sms_multitap_device, pixel_r))
- MCFG_SMS_CONTROL_PORT_ADD("ctrl2", sms_control_port_devices, "joypad")
- MCFG_SMS_CONTROL_PORT_PIXEL_HANDLER(READ32(*this, sms_multitap_device, pixel_r))
- MCFG_SMS_CONTROL_PORT_ADD("ctrl3", sms_control_port_devices, "joypad")
- MCFG_SMS_CONTROL_PORT_PIXEL_HANDLER(READ32(*this, sms_multitap_device, pixel_r))
- MCFG_SMS_CONTROL_PORT_ADD("ctrl4", sms_control_port_devices, "joypad")
- MCFG_SMS_CONTROL_PORT_PIXEL_HANDLER(READ32(*this, sms_multitap_device, pixel_r))
-MACHINE_CONFIG_END
+ SMS_CONTROL_PORT(config, m_subctrl1_port, sms_control_port_devices, "joypad");
+ m_subctrl1_port->pixel_handler().set(FUNC(sms_multitap_device::pixel_r));
+ SMS_CONTROL_PORT(config, m_subctrl2_port, sms_control_port_devices, "joypad");
+ m_subctrl2_port->pixel_handler().set(FUNC(sms_multitap_device::pixel_r));
+ SMS_CONTROL_PORT(config, m_subctrl3_port, sms_control_port_devices, "joypad");
+ m_subctrl3_port->pixel_handler().set(FUNC(sms_multitap_device::pixel_r));
+ SMS_CONTROL_PORT(config, m_subctrl4_port, sms_control_port_devices, "joypad");
+ m_subctrl4_port->pixel_handler().set(FUNC(sms_multitap_device::pixel_r));
+}
diff --git a/src/devices/bus/sms_ctrl/rfu.cpp b/src/devices/bus/sms_ctrl/rfu.cpp
index 7b51da5983a..36a081abcd1 100644
--- a/src/devices/bus/sms_ctrl/rfu.cpp
+++ b/src/devices/bus/sms_ctrl/rfu.cpp
@@ -138,8 +138,9 @@ READ32_MEMBER( sms_rapid_fire_device::pixel_r )
}
-MACHINE_CONFIG_START(sms_rapid_fire_device::device_add_mconfig)
- MCFG_SMS_CONTROL_PORT_ADD("ctrl", sms_control_port_devices, "joypad")
- MCFG_SMS_CONTROL_PORT_TH_INPUT_HANDLER(WRITELINE(*this, sms_rapid_fire_device, th_pin_w))
- MCFG_SMS_CONTROL_PORT_PIXEL_HANDLER(READ32(*this, sms_rapid_fire_device, pixel_r))
-MACHINE_CONFIG_END
+void sms_rapid_fire_device::device_add_mconfig(machine_config &config)
+{
+ SMS_CONTROL_PORT(config, m_subctrl_port, sms_control_port_devices, "joypad");
+ m_subctrl_port->th_input_handler().set(FUNC(sms_rapid_fire_device::th_pin_w));
+ m_subctrl_port->pixel_handler().set(FUNC(sms_rapid_fire_device::pixel_r));
+}
diff --git a/src/devices/bus/sms_ctrl/smsctrl.h b/src/devices/bus/sms_ctrl/smsctrl.h
index d116f2c769d..3d11b4e60bd 100644
--- a/src/devices/bus/sms_ctrl/smsctrl.h
+++ b/src/devices/bus/sms_ctrl/smsctrl.h
@@ -16,26 +16,6 @@
//**************************************************************************
-// INTERFACE CONFIGURATION MACROS
-//**************************************************************************
-
-#define MCFG_SMS_CONTROL_PORT_ADD(_tag, _slot_intf, _def_slot) \
- MCFG_DEVICE_ADD(_tag, SMS_CONTROL_PORT, 0) \
- MCFG_DEVICE_SLOT_INTERFACE(_slot_intf, _def_slot, false)
-#define MCFG_SMS_CONTROL_PORT_MODIFY(_tag) \
- MCFG_DEVICE_MODIFY(_tag)
-
-
-#define MCFG_SMS_CONTROL_PORT_TH_INPUT_HANDLER(_devcb) \
- downcast<sms_control_port_device &>(*device).set_th_input_handler(DEVCB_##_devcb);
-
-
-#define MCFG_SMS_CONTROL_PORT_PIXEL_HANDLER(_devcb) \
- downcast<sms_control_port_device &>(*device).set_pixel_handler(DEVCB_##_devcb);
-
-
-
-//**************************************************************************
// TYPE DEFINITIONS
//**************************************************************************
@@ -48,13 +28,23 @@ class sms_control_port_device : public device_t,
{
public:
// construction/destruction
+ template <typename T>
+ sms_control_port_device(machine_config const &mconfig, char const *tag, device_t *owner, T &&opts, char const *dflt)
+ : sms_control_port_device(mconfig, tag, owner, 0)
+ {
+ option_reset();
+ opts(*this);
+ set_default_option(dflt);
+ set_fixed(false);
+ }
+
sms_control_port_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
virtual ~sms_control_port_device();
// static configuration helpers
- template <class Object> devcb_base &set_th_input_handler(Object &&cb) { return m_th_pin_handler.set_callback(std::forward<Object>(cb)); }
+ auto th_input_handler() { return m_th_pin_handler.bind(); }
- template <class Object> devcb_base &set_pixel_handler(Object &&cb) { return m_pixel_handler.set_callback(std::forward<Object>(cb)); }
+ auto pixel_handler() { return m_pixel_handler.bind(); }
// Physical DE-9 connector interface
diff --git a/src/devices/bus/sms_exp/gender.cpp b/src/devices/bus/sms_exp/gender.cpp
index b6279fb8dff..227aae8a1da 100644
--- a/src/devices/bus/sms_exp/gender.cpp
+++ b/src/devices/bus/sms_exp/gender.cpp
@@ -95,6 +95,7 @@ WRITE8_MEMBER(sms_gender_adapter_device::write_ram)
// device_add_mconfig - add device configuration
//-------------------------------------------------
-MACHINE_CONFIG_START(sms_gender_adapter_device::device_add_mconfig)
- MCFG_SMS_CARTRIDGE_ADD("subslot", sms_cart, nullptr)
-MACHINE_CONFIG_END
+void sms_gender_adapter_device::device_add_mconfig(machine_config &config)
+{
+ SMS_CART_SLOT(config, "subslot", sms_cart, nullptr);
+}
diff --git a/src/devices/bus/sms_exp/smsexp.h b/src/devices/bus/sms_exp/smsexp.h
index b53027af51e..6933b9a9df8 100644
--- a/src/devices/bus/sms_exp/smsexp.h
+++ b/src/devices/bus/sms_exp/smsexp.h
@@ -15,18 +15,6 @@
#pragma once
-
-
-//**************************************************************************
-// INTERFACE CONFIGURATION MACROS
-//**************************************************************************
-
-#define MCFG_SMS_EXPANSION_ADD(_tag, _slot_intf, _def_slot) \
- MCFG_DEVICE_ADD(_tag, SMS_EXPANSION_SLOT, 0) \
- MCFG_DEVICE_SLOT_INTERFACE(_slot_intf, _def_slot, false)
-
-
-
//**************************************************************************
// TYPE DEFINITIONS
//**************************************************************************
@@ -61,7 +49,16 @@ class sms_expansion_slot_device : public device_t,
{
public:
// construction/destruction
- sms_expansion_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+ template <typename T>
+ sms_expansion_slot_device(machine_config const &mconfig, char const *tag, device_t *owner, T &&opts, char const *dflt)
+ : sms_expansion_slot_device(mconfig, tag, owner, 0)
+ {
+ option_reset();
+ opts(*this);
+ set_default_option(dflt);
+ set_fixed(false);
+ }
+ sms_expansion_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock = 0);
virtual ~sms_expansion_slot_device();
// reading and writing
diff --git a/src/devices/bus/snes/bsx.cpp b/src/devices/bus/snes/bsx.cpp
index 1f6efc1af6c..6aacaa3ed2c 100644
--- a/src/devices/bus/snes/bsx.cpp
+++ b/src/devices/bus/snes/bsx.cpp
@@ -283,13 +283,13 @@ void sns_rom_bsx_device::access_update()
}
}
-READ8_MEMBER(sns_rom_bsx_device::read_l)
+uint8_t sns_rom_bsx_device::read_l(offs_t offset)
{
if (offset < 0x200000 && access_00_1f)
{
// 0x00-0x1f:0x8000-0xffff -> CART
if (m_slot->m_cart && m_slot->m_cart->get_rom_size())
- return m_slot->m_cart->read_l(space, offset);
+ return m_slot->m_cart->read_l(offset);
}
if (offset >= 0x200000 && offset < 0x400000)
{
@@ -334,13 +334,13 @@ READ8_MEMBER(sns_rom_bsx_device::read_l)
}
-READ8_MEMBER(sns_rom_bsx_device::read_h)
+uint8_t sns_rom_bsx_device::read_h(offs_t offset)
{
if (offset < 0x200000 && access_80_9f)
{
// 0x80-0x9f:0x8000-0xffff -> CART
if (m_slot->m_cart && m_slot->m_cart->get_rom_size())
- return m_slot->m_cart->read_l(space, offset);
+ return m_slot->m_cart->read_l(offset);
}
// if not in any of the cases above...
@@ -358,7 +358,7 @@ READ8_MEMBER(sns_rom_bsx_device::read_h)
//return 0x00;
}
-WRITE8_MEMBER(sns_rom_bsx_device::write_l)
+void sns_rom_bsx_device::write_l(offs_t offset, uint8_t data)
{
if (offset < 0x200000 && access_00_1f)
{
@@ -400,7 +400,7 @@ WRITE8_MEMBER(sns_rom_bsx_device::write_l)
}
-WRITE8_MEMBER(sns_rom_bsx_device::write_h)
+void sns_rom_bsx_device::write_h(offs_t offset, uint8_t data)
{
if (offset < 0x200000 && access_80_9f)
{
@@ -416,7 +416,7 @@ WRITE8_MEMBER(sns_rom_bsx_device::write_h)
}
-READ8_MEMBER(sns_rom_bsx_device::chip_read)
+uint8_t sns_rom_bsx_device::chip_read(offs_t offset)
{
if ((offset & 0xffff) >= 0x2188 && (offset & 0xffff) < 0x21a0)
return m_base_unit->read(offset & 0xffff);
@@ -435,7 +435,7 @@ READ8_MEMBER(sns_rom_bsx_device::chip_read)
return 0x00;
}
-WRITE8_MEMBER(sns_rom_bsx_device::chip_write)
+void sns_rom_bsx_device::chip_write(offs_t offset, uint8_t data)
{
if ((offset & 0xffff) >= 0x2188 && (offset & 0xffff) < 0x21a0)
m_base_unit->write(offset & 0xffff, data);
@@ -457,7 +457,7 @@ WRITE8_MEMBER(sns_rom_bsx_device::chip_write)
// LoROM cart w/BS-X slot
-READ8_MEMBER(sns_rom_bsxlo_device::read_l)
+uint8_t sns_rom_bsxlo_device::read_l(offs_t offset)
{
if (offset < 0x400000)
{
@@ -469,7 +469,7 @@ READ8_MEMBER(sns_rom_bsxlo_device::read_l)
return 0x00;
}
-READ8_MEMBER(sns_rom_bsxlo_device::read_h)
+uint8_t sns_rom_bsxlo_device::read_h(offs_t offset)
{
if (offset < 0x400000)
{
@@ -481,7 +481,7 @@ READ8_MEMBER(sns_rom_bsxlo_device::read_h)
else if (offset < 0x700000)
{
if (m_slot->m_cart && m_slot->m_cart->get_rom_size())
- return m_slot->m_cart->read_h(space, offset);
+ return m_slot->m_cart->read_h(offset);
}
// RAM [70-7f]
return 0x00;
@@ -490,12 +490,12 @@ READ8_MEMBER(sns_rom_bsxlo_device::read_h)
// HiROM cart w/BS-X slot
-READ8_MEMBER(sns_rom_bsxhi_device::read_l)
+uint8_t sns_rom_bsxhi_device::read_l(offs_t offset)
{
- return read_h(space, offset);
+ return read_h(offset);
}
-READ8_MEMBER(sns_rom_bsxhi_device::read_h)
+uint8_t sns_rom_bsxhi_device::read_h(offs_t offset)
{
if (offset < 0x200000 && (offset & 0xffff) >= 0x8000)
{
@@ -505,7 +505,7 @@ READ8_MEMBER(sns_rom_bsxhi_device::read_h)
if (offset >= 0x200000 && offset < 0x400000)
{
if (m_slot->m_cart && m_slot->m_cart->get_rom_size() && (offset & 0xffff) >= 0x8000)
- return m_slot->m_cart->read_h(space, offset);
+ return m_slot->m_cart->read_h(offset);
}
if (offset >= 0x400000 && offset < 0x600000)
{
@@ -516,7 +516,7 @@ READ8_MEMBER(sns_rom_bsxhi_device::read_h)
if (offset >= 0x600000)
{
if (m_slot->m_cart && m_slot->m_cart->get_rom_size())
- return m_slot->m_cart->read_h(space, offset);
+ return m_slot->m_cart->read_h(offset);
}
return 0xff;
}
@@ -530,18 +530,18 @@ READ8_MEMBER(sns_rom_bsxhi_device::read_h)
// Hence, we use low read handler for ROM access in the 0x8000-0xffff range (i.e. mempack mapped as LoROM) and
// hi read handler for ROM access in the 0x0000-0xffff range (i.e. mempack mapped as HiROM)...
-READ8_MEMBER(sns_rom_bsmempak_device::read_l)
+uint8_t sns_rom_bsmempak_device::read_l(offs_t offset)
{
int bank = offset / 0x10000;
return m_rom[rom_bank_map[bank] * 0x8000 + (offset & 0x7fff)];
}
-READ8_MEMBER(sns_rom_bsmempak_device::read_h)
+uint8_t sns_rom_bsmempak_device::read_h(offs_t offset)
{
int bank = offset / 0x8000;
return m_rom[rom_bank_map[bank] * 0x8000 + (offset & 0x7fff)];
}
-WRITE8_MEMBER(sns_rom_bsmempak_device::write_l)
+void sns_rom_bsmempak_device::write_l(offs_t offset, uint8_t data)
{
}
diff --git a/src/devices/bus/snes/bsx.h b/src/devices/bus/snes/bsx.h
index 24ce7b9f691..e144ff118ff 100644
--- a/src/devices/bus/snes/bsx.h
+++ b/src/devices/bus/snes/bsx.h
@@ -18,12 +18,12 @@ public:
sns_rom_bsx_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
// additional reading and writing
- virtual DECLARE_READ8_MEMBER(read_l) override;
- virtual DECLARE_READ8_MEMBER(read_h) override;
- virtual DECLARE_WRITE8_MEMBER(write_l) override;
- virtual DECLARE_WRITE8_MEMBER(write_h) override;
- virtual DECLARE_READ8_MEMBER(chip_read) override;
- virtual DECLARE_WRITE8_MEMBER(chip_write) override;
+ virtual uint8_t read_l(offs_t offset) override;
+ virtual uint8_t read_h(offs_t offset) override;
+ virtual void write_l(offs_t offset, uint8_t data) override;
+ virtual void write_h(offs_t offset, uint8_t data) override;
+ virtual uint8_t chip_read(offs_t offset) override;
+ virtual void chip_write(offs_t offset, uint8_t data) override;
protected:
class bsx_base
@@ -84,8 +84,8 @@ public:
sns_rom_bsxlo_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
// additional reading and writing
- virtual DECLARE_READ8_MEMBER(read_l) override;
- virtual DECLARE_READ8_MEMBER(read_h) override;
+ virtual uint8_t read_l(offs_t offset) override;
+ virtual uint8_t read_h(offs_t offset) override;
protected:
// device-level overrides
@@ -106,8 +106,8 @@ public:
sns_rom_bsxhi_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
// additional reading and writing
- virtual DECLARE_READ8_MEMBER(read_l) override;
- virtual DECLARE_READ8_MEMBER(read_h) override;
+ virtual uint8_t read_l(offs_t offset) override;
+ virtual uint8_t read_h(offs_t offset) override;
protected:
// device-level overrides
@@ -129,12 +129,12 @@ public:
sns_rom_bsmempak_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
// additional reading and writing
- virtual DECLARE_READ8_MEMBER(read_l) override;
- virtual DECLARE_READ8_MEMBER(read_h) override;
- virtual DECLARE_WRITE8_MEMBER(write_l) override;
-// virtual DECLARE_WRITE8_MEMBER(write_h);
-// virtual DECLARE_READ8_MEMBER(chip_read);
-// virtual DECLARE_WRITE8_MEMBER(chip_write);
+ virtual uint8_t read_l(offs_t offset) override;
+ virtual uint8_t read_h(offs_t offset) override;
+ virtual void write_l(offs_t offset, uint8_t data) override;
+// virtual void write_h(offs_t offset, uint8_t data) override;
+// virtual uint8_t chip_read(offs_t offset) override;
+// virtual void chip_write(offs_t offset, uint8_t data) override;
protected:
// device-level overrides
diff --git a/src/devices/bus/snes/event.cpp b/src/devices/bus/snes/event.cpp
index 7131807edab..3591a2a679a 100644
--- a/src/devices/bus/snes/event.cpp
+++ b/src/devices/bus/snes/event.cpp
@@ -60,7 +60,7 @@ void sns_pfest94_device::device_reset()
mapper specific handlers
-------------------------------------------------*/
-READ8_MEMBER(sns_pfest94_device::read_l)
+uint8_t sns_pfest94_device::read_l(offs_t offset)
{
// menu
if ((offset & 0x208000) == 0x208000)
@@ -77,7 +77,7 @@ READ8_MEMBER(sns_pfest94_device::read_l)
}
}
-READ8_MEMBER(sns_pfest94_device::read_h)
+uint8_t sns_pfest94_device::read_h(offs_t offset)
{
// menu
if ((offset & 0x208000) == 0x208000)
@@ -103,7 +103,7 @@ READ8_MEMBER(sns_pfest94_device::read_h)
// these are used for two diff effects: both to select game from menu and to access the DSP when running SMK!
-READ8_MEMBER( sns_pfest94_device::chip_read )
+uint8_t sns_pfest94_device::chip_read(offs_t offset)
{
if (offset & 0x8000)
{
@@ -119,7 +119,7 @@ READ8_MEMBER( sns_pfest94_device::chip_read )
}
-WRITE8_MEMBER( sns_pfest94_device::chip_write )
+void sns_pfest94_device::chip_write(offs_t offset, uint8_t data)
{
if (offset & 0x8000)
{
@@ -186,12 +186,12 @@ void sns_pfest94_device::speedup_addon_bios_access()
// DSP dump contains prg at offset 0 and data at offset 0x2000
-READ32_MEMBER( sns_pfest94_device::necdsp_prg_r )
+uint32_t sns_pfest94_device::necdsp_prg_r(offs_t offset)
{
return get_prg(&m_bios[0], offset);
}
-READ16_MEMBER( sns_pfest94_device::necdsp_data_r )
+uint16_t sns_pfest94_device::necdsp_data_r(offs_t offset)
{
return get_data(&m_bios[0], offset + 0x2000/2);
}
@@ -221,11 +221,12 @@ void sns_pfest94_device::dsp_data_map_lorom(address_map &map)
// device_add_mconfig - add device configuration
//-------------------------------------------------
-MACHINE_CONFIG_START(sns_pfest94_device::device_add_mconfig)
- MCFG_DEVICE_ADD("dsp", UPD7725, 8000000)
- MCFG_DEVICE_PROGRAM_MAP(dsp_prg_map_lorom)
- MCFG_DEVICE_DATA_MAP(dsp_data_map_lorom)
-MACHINE_CONFIG_END
+void sns_pfest94_device::device_add_mconfig(machine_config &config)
+{
+ UPD7725(config, m_upd7725, 8000000);
+ m_upd7725->set_addrmap(AS_PROGRAM, &sns_pfest94_device::dsp_prg_map_lorom);
+ m_upd7725->set_addrmap(AS_DATA, &sns_pfest94_device::dsp_data_map_lorom);
+}
//-------------------------------------------------
// Dipswitch
diff --git a/src/devices/bus/snes/event.h b/src/devices/bus/snes/event.h
index 812022b3799..dedd18f921a 100644
--- a/src/devices/bus/snes/event.h
+++ b/src/devices/bus/snes/event.h
@@ -32,13 +32,13 @@ protected:
virtual void speedup_addon_bios_access() override;
// reading and writing
- virtual DECLARE_READ8_MEMBER(read_l) override;
- virtual DECLARE_READ8_MEMBER(read_h) override;
- virtual DECLARE_READ8_MEMBER(chip_read) override;
- virtual DECLARE_WRITE8_MEMBER(chip_write) override;
+ virtual uint8_t read_l(offs_t offset) override;
+ virtual uint8_t read_h(offs_t offset) override;
+ virtual uint8_t chip_read(offs_t offset) override;
+ virtual void chip_write(offs_t offset, uint8_t data) override;
- virtual DECLARE_READ32_MEMBER(necdsp_prg_r);
- virtual DECLARE_READ16_MEMBER(necdsp_data_r);
+ virtual uint32_t necdsp_prg_r(offs_t offset);
+ virtual uint16_t necdsp_data_r(offs_t offset);
private:
required_device<upd7725_device> m_upd7725;
diff --git a/src/devices/bus/snes/rom.cpp b/src/devices/bus/snes/rom.cpp
index bae27f21fad..3308808a008 100644
--- a/src/devices/bus/snes/rom.cpp
+++ b/src/devices/bus/snes/rom.cpp
@@ -174,12 +174,12 @@ void sns_rom_20col_device::device_start()
mapper specific handlers
-------------------------------------------------*/
-READ8_MEMBER(sns_rom_device::read_l)
+uint8_t sns_rom_device::read_l(offs_t offset)
{
- return read_h(space, offset);
+ return read_h(offset);
}
-READ8_MEMBER(sns_rom_device::read_h)
+uint8_t sns_rom_device::read_h(offs_t offset)
{
int bank = offset / 0x10000;
return m_rom[rom_bank_map[bank] * 0x8000 + (offset & 0x7fff)];
@@ -200,7 +200,7 @@ READ8_MEMBER(sns_rom_device::read_h)
***********************************************************************************************************/
-READ8_MEMBER( sns_rom_obc1_device::chip_read )
+uint8_t sns_rom_obc1_device::chip_read(offs_t offset)
{
uint16_t address = offset & 0x1fff;
uint8_t value;
@@ -236,7 +236,7 @@ READ8_MEMBER( sns_rom_obc1_device::chip_read )
}
-WRITE8_MEMBER( sns_rom_obc1_device::chip_write )
+void sns_rom_obc1_device::chip_write(offs_t offset, uint8_t data)
{
uint16_t address = offset & 0x1fff;
uint8_t temp;
@@ -289,12 +289,12 @@ WRITE8_MEMBER( sns_rom_obc1_device::chip_write )
// Pokemon (and many others): a byte is written and a permutation of its bits must be returned.
// Address range for read/write depends on the game (check snes.xml)
-READ8_MEMBER( sns_rom_pokemon_device::chip_read )
+uint8_t sns_rom_pokemon_device::chip_read(offs_t offset)
{
return bitswap<8>(m_latch,0,6,7,1,2,3,4,5);
}
-WRITE8_MEMBER( sns_rom_pokemon_device::chip_write )
+void sns_rom_pokemon_device::chip_write(offs_t offset, uint8_t data)
{
m_latch = data;
}
@@ -340,7 +340,7 @@ void sns_rom_tekken2_device::update_prot(uint32_t offset)
}
}
-READ8_MEMBER( sns_rom_tekken2_device::chip_read )
+uint8_t sns_rom_tekken2_device::chip_read(offs_t offset)
{
update_prot(offset);
@@ -362,10 +362,10 @@ READ8_MEMBER( sns_rom_tekken2_device::chip_read )
}
}
- return 0xff; // should be open_bus
+ return read_open_bus();
}
-WRITE8_MEMBER( sns_rom_tekken2_device::chip_write )
+void sns_rom_tekken2_device::chip_write(offs_t offset, uint8_t data)
{
update_prot(offset);
}
@@ -373,7 +373,7 @@ WRITE8_MEMBER( sns_rom_tekken2_device::chip_write )
// Soul Blade: Adresses $xxx0-$xxx3 in banks $80-$bf always read $55, $0f, $aa, $f0.
// Banks $c0-$ff return open bus.
-READ8_MEMBER( sns_rom_soulblad_device::chip_read )
+uint8_t sns_rom_soulblad_device::chip_read(offs_t offset)
{
uint8_t value;
offset &= 3;
@@ -401,36 +401,36 @@ READ8_MEMBER( sns_rom_soulblad_device::chip_read )
// The actual banks depends on the last 8bits of the address accessed.
// Type 1: bits0-4 of the address are used as base bank (256KB chunks)
-READ8_MEMBER(sns_rom_mcpirate1_device::read_l)
+uint8_t sns_rom_mcpirate1_device::read_l(offs_t offset)
{
- return read_h(space, offset);
+ return read_h(offset);
}
-READ8_MEMBER(sns_rom_mcpirate1_device::read_h)
+uint8_t sns_rom_mcpirate1_device::read_h(offs_t offset)
{
int bank = (offset / 0x10000) + (m_base_bank * 8);
return m_rom[rom_bank_map[bank] * 0x8000 + (offset & 0x7fff)];
}
-WRITE8_MEMBER( sns_rom_mcpirate1_device::chip_write )
+void sns_rom_mcpirate1_device::chip_write(offs_t offset, uint8_t data)
{
m_base_bank = offset & 0x1f;
// printf("offset %X data %X bank %X\n", offset, data, m_base_bank);
}
// Type 2: bits0-3 & bit5 of the address are used as base bank (256KB chunks)
-READ8_MEMBER(sns_rom_mcpirate2_device::read_l)
+uint8_t sns_rom_mcpirate2_device::read_l(offs_t offset)
{
- return read_h(space, offset);
+ return read_h(offset);
}
-READ8_MEMBER(sns_rom_mcpirate2_device::read_h)
+uint8_t sns_rom_mcpirate2_device::read_h(offs_t offset)
{
int bank = (offset / 0x10000) + (m_base_bank * 8);
return m_rom[rom_bank_map[bank] * 0x8000 + (offset & 0x7fff)];
}
-WRITE8_MEMBER( sns_rom_mcpirate2_device::chip_write )
+void sns_rom_mcpirate2_device::chip_write(offs_t offset, uint8_t data)
{
m_base_bank = (offset & 0x0f) | ((offset & 0x20) >> 1);
// printf("offset %X data %X bank %X\n", offset, data, m_base_bank);
@@ -443,19 +443,19 @@ WRITE8_MEMBER( sns_rom_mcpirate2_device::chip_write )
// accesses in [01-3f] don't go to the only 32KB bank)
// - bit 5 is always 0
// it's worth to notice that for FC games size of bank is twice the size of original FC PRG
-READ8_MEMBER(sns_rom_20col_device::read_l)
+uint8_t sns_rom_20col_device::read_l(offs_t offset)
{
- return read_h(space, offset);
+ return read_h(offset);
}
-READ8_MEMBER(sns_rom_20col_device::read_h)
+uint8_t sns_rom_20col_device::read_h(offs_t offset)
{
int prg32k = (!BIT(m_base_bank, 6) && BIT(m_base_bank, 7));
int bank = prg32k ? 0 : (offset / 0x10000);
return m_rom[((m_base_bank & 0x1f) + bank) * 0x8000 + (offset & 0x7fff)];
}
-WRITE8_MEMBER( sns_rom_20col_device::chip_write )
+void sns_rom_20col_device::chip_write(offs_t offset, uint8_t data)
{
// [#] game - written bank value
// [01] spartan x - c6
@@ -486,23 +486,23 @@ WRITE8_MEMBER( sns_rom_20col_device::chip_write )
// Work in progress (probably very wrong)
-READ8_MEMBER( sns_rom_banana_device::chip_read )
+uint8_t sns_rom_banana_device::chip_read(offs_t offset)
{
return bitswap<8>(m_latch[0xf],0,6,7,1,2,3,4,5);
}
-WRITE8_MEMBER( sns_rom_banana_device::chip_write )
+void sns_rom_banana_device::chip_write(offs_t offset, uint8_t data)
{
// printf("write addr %X data %X\n", offset, data);
m_latch[0xf] = data;
}
-READ8_MEMBER( sns_rom_bugs_device::chip_read )
+uint8_t sns_rom_bugs_device::chip_read(offs_t offset)
{
return bitswap<8>(m_latch[offset & 0xff],0,6,7,1,2,3,4,5);
}
-WRITE8_MEMBER( sns_rom_bugs_device::chip_write )
+void sns_rom_bugs_device::chip_write(offs_t offset, uint8_t data)
{
m_latch[offset & 0xff] = data;
}
diff --git a/src/devices/bus/snes/rom.h b/src/devices/bus/snes/rom.h
index 9e95e4b8e00..d2a09b774c1 100644
--- a/src/devices/bus/snes/rom.h
+++ b/src/devices/bus/snes/rom.h
@@ -17,8 +17,8 @@ public:
sns_rom_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
// reading and writing
- virtual DECLARE_READ8_MEMBER(read_l) override;
- virtual DECLARE_READ8_MEMBER(read_h) override;
+ virtual uint8_t read_l(offs_t offset) override;
+ virtual uint8_t read_h(offs_t offset) override;
protected:
sns_rom_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock);
@@ -36,8 +36,8 @@ public:
sns_rom_obc1_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
// additional reading and writing
- virtual DECLARE_READ8_MEMBER(chip_read) override;
- virtual DECLARE_WRITE8_MEMBER(chip_write) override;
+ virtual uint8_t chip_read(offs_t offset) override;
+ virtual void chip_write(offs_t offset, uint8_t data) override;
protected:
// device-level overrides
@@ -60,9 +60,9 @@ public:
// construction/destruction
sns_rom_pokemon_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- // reading and writing
- virtual DECLARE_READ8_MEMBER(chip_read) override; // protection device
- virtual DECLARE_WRITE8_MEMBER(chip_write) override; // protection device
+ // reading and writing (protection device)
+ virtual uint8_t chip_read(offs_t offset) override;
+ virtual void chip_write(offs_t offset, uint8_t data) override;
protected:
// device-level overrides
@@ -80,9 +80,9 @@ public:
// construction/destruction
sns_rom_tekken2_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- // reading and writing
- virtual DECLARE_READ8_MEMBER(chip_read) override; // protection device
- virtual DECLARE_WRITE8_MEMBER(chip_write) override; // protection device
+ // reading and writing (protection device)
+ virtual uint8_t chip_read(offs_t offset) override;
+ virtual void chip_write(offs_t offset, uint8_t data) override;
protected:
// device-level overrides
@@ -104,8 +104,8 @@ public:
// construction/destruction
sns_rom_soulblad_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- // reading and writing
- virtual DECLARE_READ8_MEMBER(chip_read) override; // protection device
+ // reading and writing (protection device)
+ virtual uint8_t chip_read(offs_t offset) override;
};
// ======================> sns_rom_mcpirate1_device
@@ -117,9 +117,9 @@ public:
sns_rom_mcpirate1_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
// reading and writing
- virtual DECLARE_READ8_MEMBER(read_l) override;
- virtual DECLARE_READ8_MEMBER(read_h) override;
- virtual DECLARE_WRITE8_MEMBER(chip_write) override; // bankswitch device
+ virtual uint8_t read_l(offs_t offset) override;
+ virtual uint8_t read_h(offs_t offset) override;
+ virtual void chip_write(offs_t offset, uint8_t data) override; // bankswitch device
protected:
// device-level overrides
@@ -138,9 +138,9 @@ public:
sns_rom_mcpirate2_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
// reading and writing
- virtual DECLARE_READ8_MEMBER(read_l) override;
- virtual DECLARE_READ8_MEMBER(read_h) override;
- virtual DECLARE_WRITE8_MEMBER(chip_write) override; // bankswitch device
+ virtual uint8_t read_l(offs_t offset) override;
+ virtual uint8_t read_h(offs_t offset) override;
+ virtual void chip_write(offs_t offset, uint8_t data) override; // bankswitch device
protected:
// device-level overrides
@@ -159,9 +159,9 @@ public:
sns_rom_20col_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
// reading and writing
- virtual DECLARE_READ8_MEMBER(read_l) override;
- virtual DECLARE_READ8_MEMBER(read_h) override;
- virtual DECLARE_WRITE8_MEMBER(chip_write) override; // bankswitch device
+ virtual uint8_t read_l(offs_t offset) override;
+ virtual uint8_t read_h(offs_t offset) override;
+ virtual void chip_write(offs_t offset, uint8_t data) override; // bankswitch device
protected:
// device-level overrides
@@ -178,9 +178,9 @@ public:
// construction/destruction
sns_rom_banana_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- // reading and writing
- virtual DECLARE_READ8_MEMBER(chip_read) override; // protection device
- virtual DECLARE_WRITE8_MEMBER(chip_write) override; // protection device
+ // reading and writing (protection device)
+ virtual uint8_t chip_read(offs_t offset) override;
+ virtual void chip_write(offs_t offset, uint8_t data) override;
protected:
// device-level overrides
@@ -198,9 +198,9 @@ public:
// construction/destruction
sns_rom_bugs_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- // reading and writing
- virtual DECLARE_READ8_MEMBER(chip_read) override; // protection device
- virtual DECLARE_WRITE8_MEMBER(chip_write) override; // protection device
+ // reading and writing (protection device)
+ virtual uint8_t chip_read(offs_t offset) override;
+ virtual void chip_write(offs_t offset, uint8_t data) override;
protected:
// device-level overrides
diff --git a/src/devices/bus/snes/rom21.cpp b/src/devices/bus/snes/rom21.cpp
index 91c61394688..8cc1f6fddb6 100644
--- a/src/devices/bus/snes/rom21.cpp
+++ b/src/devices/bus/snes/rom21.cpp
@@ -66,14 +66,14 @@ void sns_rom21_srtc_device::device_reset()
// low and hi reads are not the same! (different ROM banks are accessed)
-READ8_MEMBER(sns_rom21_device::read_l)
+uint8_t sns_rom21_device::read_l(offs_t offset)
{
// here ROM banks from 128 to 255, mirrored twice
int bank = (offset & 0x3fffff) / 0x8000;
return m_rom[rom_bank_map[bank + 0x80] * 0x8000 + (offset & 0x7fff)];
}
-READ8_MEMBER(sns_rom21_device::read_h)
+uint8_t sns_rom21_device::read_h(offs_t offset)
{
// here ROM banks from 0 to 127, mirrored twice
int bank = (offset & 0x3fffff) / 0x8000;
@@ -173,7 +173,7 @@ uint8_t sns_rom21_srtc_device::srtc_weekday( uint32_t year, uint32_t month, uint
// this gets called only for accesses at 0x2800,
// because for 0x2801 open bus gets returned...
-READ8_MEMBER(sns_rom21_srtc_device::chip_read)
+uint8_t sns_rom21_srtc_device::chip_read(offs_t offset)
{
if (m_mode != RTCM_Read)
return 0x00;
@@ -194,7 +194,7 @@ READ8_MEMBER(sns_rom21_srtc_device::chip_read)
}
// this gets called only for accesses at 0x2801
-WRITE8_MEMBER(sns_rom21_srtc_device::chip_write)
+void sns_rom21_srtc_device::chip_write(offs_t offset, uint8_t data)
{
data &= 0x0f; // Only the low four bits are used
diff --git a/src/devices/bus/snes/rom21.h b/src/devices/bus/snes/rom21.h
index 545e2457ef3..fb9b0b6c65a 100644
--- a/src/devices/bus/snes/rom21.h
+++ b/src/devices/bus/snes/rom21.h
@@ -18,8 +18,8 @@ public:
sns_rom21_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
// reading and writing
- virtual DECLARE_READ8_MEMBER(read_l) override;
- virtual DECLARE_READ8_MEMBER(read_h) override;
+ virtual uint8_t read_l(offs_t offset) override;
+ virtual uint8_t read_h(offs_t offset) override;
protected:
sns_rom21_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock);
@@ -38,8 +38,8 @@ public:
sns_rom21_srtc_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
// reading and writing
- virtual DECLARE_READ8_MEMBER(chip_read) override;
- virtual DECLARE_WRITE8_MEMBER(chip_write) override;
+ virtual uint8_t chip_read(offs_t offset) override;
+ virtual void chip_write(offs_t offset, uint8_t data) override;
protected:
// S-RTC specific variables
diff --git a/src/devices/bus/snes/sa1.cpp b/src/devices/bus/snes/sa1.cpp
index aaf7024ce5f..487f176fd86 100644
--- a/src/devices/bus/snes/sa1.cpp
+++ b/src/devices/bus/snes/sa1.cpp
@@ -204,7 +204,7 @@ void sns_sa1_device::recalc_irqs()
// handle this separately to avoid accessing recursively the regs?
-uint8_t sns_sa1_device::var_length_read(address_space &space, uint32_t offset)
+uint8_t sns_sa1_device::var_length_read(uint32_t offset)
{
// handle 0xffea/0xffeb/0xffee/0xffef
if ((offset & 0xffffe0) == 0x00ffe0)
@@ -216,13 +216,13 @@ uint8_t sns_sa1_device::var_length_read(address_space &space, uint32_t offset)
}
if ((offset & 0xc08000) == 0x008000) //$00-3f:8000-ffff
- return read_l(space, (offset & 0x7fffff));
+ return read_l(offset & 0x7fffff);
if ((offset & 0xc08000) == 0x808000) //$80-bf:8000-ffff
- return read_h(space, (offset & 0x7fffff));
+ return read_h(offset & 0x7fffff);
if ((offset & 0xc00000) == 0xc00000) //$c0-ff:0000-ffff
- return read_h(space, (offset & 0x7fffff));
+ return read_h(offset & 0x7fffff);
if ((offset & 0x40e000) == 0x006000) //$00-3f|80-bf:6000-7fff
return read_bwram((m_bwram_snes * 0x2000) + (offset & 0x1fff));
@@ -239,7 +239,7 @@ uint8_t sns_sa1_device::var_length_read(address_space &space, uint32_t offset)
return 0;
}
-void sns_sa1_device::dma_transfer(address_space &space)
+void sns_sa1_device::dma_transfer()
{
// printf("DMA src %08x (%d), dst %08x (%d) cnt %d\n", m_src_addr, m_dma_ctrl & 3, m_dst_addr, m_dma_ctrl & 4, m_dma_cnt);
@@ -260,15 +260,15 @@ void sns_sa1_device::dma_transfer(address_space &space)
case 0: // ROM
if ((dma_src & 0x408000) == 0x008000 && (dma_src & 0x800000) == 0x000000)
{
- data = read_l(space, (dma_src & 0x7fffff));
+ data = read_l(dma_src & 0x7fffff);
}
if ((dma_src & 0x408000) == 0x008000 && (dma_src & 0x800000) == 0x800000)
{
- data = read_h(space, (dma_src & 0x7fffff));
+ data = read_h(dma_src & 0x7fffff);
}
if ((dma_src & 0xc00000) == 0xc00000)
{
- data = read_h(space, (dma_src & 0x7fffff));
+ data = read_h(dma_src & 0x7fffff);
}
break;
@@ -311,17 +311,17 @@ void sns_sa1_device::dma_transfer(address_space &space)
recalc_irqs();
}
-void sns_sa1_device::dma_cctype1_transfer(address_space &space)
+void sns_sa1_device::dma_cctype1_transfer()
{
m_scpu_flags |= SCPU_IRQ_CHARCONV;
recalc_irqs();
}
-void sns_sa1_device::dma_cctype2_transfer(address_space &space)
+void sns_sa1_device::dma_cctype2_transfer()
{
}
-uint8_t sns_sa1_device::read_regs(address_space &space, uint32_t offset)
+uint8_t sns_sa1_device::read_regs(uint32_t offset)
{
uint8_t value = 0xff;
offset &= 0x1ff; // $2200 + offset gives the reg value to compare with docs
@@ -383,8 +383,8 @@ uint8_t sns_sa1_device::read_regs(address_space &space, uint32_t offset)
case 0x10c:
// Var-Length Read Port Low
{
- uint32_t data = (var_length_read(space, m_vda + 0) << 0) | (var_length_read(space, m_vda + 1) << 8)
- | (var_length_read(space, m_vda + 2) << 16);
+ uint32_t data = (var_length_read(m_vda + 0) << 0) | (var_length_read(m_vda + 1) << 8)
+ | (var_length_read(m_vda + 2) << 16);
data >>= m_vbit;
value = (data >> 0) & 0xff;
}
@@ -392,8 +392,8 @@ uint8_t sns_sa1_device::read_regs(address_space &space, uint32_t offset)
case 0x10d:
// Var-Length Read Port High
{
- uint32_t data = (var_length_read(space, m_vda + 0) << 0) | (var_length_read(space, m_vda + 1) << 8)
- | (var_length_read(space, m_vda + 2) << 16);
+ uint32_t data = (var_length_read(m_vda + 0) << 0) | (var_length_read(m_vda + 1) << 8)
+ | (var_length_read(m_vda + 2) << 16);
data >>= m_vbit;
if (m_drm == 1)
@@ -417,7 +417,7 @@ uint8_t sns_sa1_device::read_regs(address_space &space, uint32_t offset)
return value;
}
-void sns_sa1_device::write_regs(address_space &space, uint32_t offset, uint8_t data)
+void sns_sa1_device::write_regs(uint32_t offset, uint8_t data)
{
offset &= 0x1ff; // $2200 + offset gives the reg value to compare with docs
@@ -669,14 +669,14 @@ void sns_sa1_device::write_regs(address_space &space, uint32_t offset, uint8_t d
{
if (!(m_dma_ctrl & 0x20) && !(m_dma_ctrl & 0x04)) // Normal DMA to IRAM
{
- dma_transfer(space);
+ dma_transfer();
// printf("SA-1: normal DMA to IRAM\n");
}
if (m_dma_ctrl & 0x20 && m_dma_ctrl & 0x10) // CC DMA Type 1
{
// printf("SA-1: CC DMA type 1\n");
- dma_cctype1_transfer(space);
+ dma_cctype1_transfer();
}
}
break;
@@ -688,7 +688,7 @@ void sns_sa1_device::write_regs(address_space &space, uint32_t offset, uint8_t d
if (!(m_dma_ctrl & 0x20) && m_dma_ctrl & 0x04) // Normal DMA to BWRAM
{
// printf("SA-1: normal DMA to BWRAM\n");
- dma_transfer(space);
+ dma_transfer();
}
}
break;
@@ -729,7 +729,7 @@ void sns_sa1_device::write_regs(address_space &space, uint32_t offset, uint8_t d
if (m_dma_ctrl & 0x20 && !(m_dma_ctrl & 0x10)) // CC DMA Type 2
{
// printf("SA-1: CC DMA type 2\n");
- dma_cctype2_transfer(space);
+ dma_cctype2_transfer();
}
}
break;
@@ -901,7 +901,7 @@ void sns_sa1_device::write_bwram(uint32_t offset, uint8_t data)
-------------------------------------------------*/
-READ8_MEMBER(sns_sa1_device::read_l)
+uint8_t sns_sa1_device::read_l(offs_t offset)
{
int bank;
@@ -936,7 +936,7 @@ READ8_MEMBER(sns_sa1_device::read_l)
return 0; // this should not happen (the driver should only call read_l in the above case)
}
-READ8_MEMBER(sns_sa1_device::read_h)
+uint8_t sns_sa1_device::read_h(offs_t offset)
{
int bank;
@@ -972,20 +972,20 @@ READ8_MEMBER(sns_sa1_device::read_h)
return m_rom[rom_bank_map[(m_bank_f_rom * 0x20) + ((offset - 0x700000) / 0x8000)] * 0x8000 + (offset & 0x7fff)];
}
-WRITE8_MEMBER(sns_sa1_device::write_l)
+void sns_sa1_device::write_l(offs_t offset, uint8_t data)
{
}
-WRITE8_MEMBER(sns_sa1_device::write_h)
+void sns_sa1_device::write_h(offs_t offset, uint8_t data)
{
}
-READ8_MEMBER( sns_sa1_device::chip_read )
+uint8_t sns_sa1_device::chip_read(offs_t offset)
{
uint16_t address = offset & 0xffff;
if (offset < 0x400000 && address >= 0x2200 && address < 0x2400)
- return read_regs(space, address & 0x1ff); // SA-1 Regs
+ return read_regs(address & 0x1ff); // SA-1 Regs
if (offset < 0x400000 && address >= 0x3000 && address < 0x3800)
return read_iram(address & 0x7ff); // Internal SA-1 RAM (2K)
@@ -1000,12 +1000,12 @@ READ8_MEMBER( sns_sa1_device::chip_read )
}
-WRITE8_MEMBER( sns_sa1_device::chip_write )
+void sns_sa1_device::chip_write(offs_t offset, uint8_t data)
{
uint16_t address = offset & 0xffff;
if (offset < 0x400000 && address >= 0x2200 && address < 0x2400)
- write_regs(space, address & 0x1ff, data); // SA-1 Regs
+ write_regs(address & 0x1ff, data); // SA-1 Regs
if (offset < 0x400000 && address >= 0x3000 && address < 0x3800)
write_iram(address & 0x7ff, data); // Internal SA-1 RAM (2K)
@@ -1026,7 +1026,7 @@ WRITE8_MEMBER( sns_sa1_device::chip_write )
// I/O regs or WRAM, and there are a few additional accesses to IRAM (in [00-3f][0000-07ff])
// and to BWRAM (in [60-6f][0000-ffff], so-called bitmap mode)
-READ8_MEMBER( sns_sa1_device::sa1_hi_r )
+uint8_t sns_sa1_device::sa1_hi_r(offs_t offset)
{
uint16_t address = offset & 0xffff;
@@ -1037,22 +1037,22 @@ READ8_MEMBER( sns_sa1_device::sa1_hi_r )
if (address < 0x0800)
return read_iram(offset); // Internal SA-1 RAM (2K)
else if (address >= 0x2200 && address < 0x2400)
- return read_regs(space, offset & 0x1ff); // SA-1 Regs
+ return read_regs(offset & 0x1ff); // SA-1 Regs
else if (address >= 0x3000 && address < 0x3800)
return read_iram(offset); // Internal SA-1 RAM (2K)
}
else if (address < 0x8000)
return read_bwram((m_bwram_sa1 * 0x2000) + (offset & 0x1fff) + (m_bwram_sa1_source * 0x100000)); // SA-1 BWRAM
else
- return read_h(space, offset); // ROM
+ return read_h(offset); // ROM
return 0xff; // maybe open bus? same as the main system one or diff? (currently not accessible from carts anyway...)
}
else
- return read_h(space, offset); // ROM
+ return read_h(offset); // ROM
}
-READ8_MEMBER( sns_sa1_device::sa1_lo_r )
+uint8_t sns_sa1_device::sa1_lo_r(offs_t offset)
{
uint16_t address = offset & 0xffff;
@@ -1063,7 +1063,7 @@ READ8_MEMBER( sns_sa1_device::sa1_lo_r )
if (address < 0x0800)
return read_iram(offset); // Internal SA-1 RAM (2K)
else if (address >= 0x2200 && address < 0x2400)
- return read_regs(space, offset & 0x1ff); // SA-1 Regs
+ return read_regs(offset & 0x1ff); // SA-1 Regs
else if (address >= 0x3000 && address < 0x3800)
return read_iram(offset); // Internal SA-1 RAM (2K)
}
@@ -1094,7 +1094,7 @@ READ8_MEMBER( sns_sa1_device::sa1_lo_r )
return m_sa1_reset>>8;
}
else
- return read_l(space, offset); // ROM
+ return read_l(offset); // ROM
return 0xff; // maybe open bus? same as the main system one or diff? (currently not accessible from carts anyway...)
}
@@ -1106,7 +1106,7 @@ READ8_MEMBER( sns_sa1_device::sa1_lo_r )
return 0xff; // nothing should be mapped here, so maybe open bus?
}
-WRITE8_MEMBER( sns_sa1_device::sa1_hi_w )
+void sns_sa1_device::sa1_hi_w(offs_t offset, uint8_t data)
{
uint16_t address = offset & 0xffff;
if (offset < 0x400000)
@@ -1116,7 +1116,7 @@ WRITE8_MEMBER( sns_sa1_device::sa1_hi_w )
if (address < 0x0800)
write_iram(offset, data); // Internal SA-1 RAM (2K)
else if (address >= 0x2200 && address < 0x2400)
- write_regs(space, offset & 0x1ff, data); // SA-1 Regs
+ write_regs(offset & 0x1ff, data); // SA-1 Regs
else if (address >= 0x3000 && address < 0x3800)
write_iram(offset, data); // Internal SA-1 RAM (2K)
}
@@ -1125,14 +1125,14 @@ WRITE8_MEMBER( sns_sa1_device::sa1_hi_w )
}
}
-WRITE8_MEMBER( sns_sa1_device::sa1_lo_w )
+void sns_sa1_device::sa1_lo_w(offs_t offset, uint8_t data)
{
if (offset >= 0x400000 && offset < 0x500000)
write_bwram(offset & 0xfffff, data); // SA-1 BWRAM (not mirrored above!)
else if (offset >= 0x600000 && offset < 0x700000)
write_bwram((offset & 0xfffff) + 0x100000, data); // SA-1 BWRAM Bitmap mode
else
- sa1_hi_w(space, offset, data);
+ sa1_hi_w(offset, data);
}
void sns_sa1_device::sa1_map(address_map &map)
@@ -1143,7 +1143,8 @@ void sns_sa1_device::sa1_map(address_map &map)
}
-MACHINE_CONFIG_START(sns_sa1_device::device_add_mconfig)
- MCFG_DEVICE_ADD("sa1cpu", G65816, 10000000)
- MCFG_DEVICE_PROGRAM_MAP(sa1_map)
-MACHINE_CONFIG_END
+void sns_sa1_device::device_add_mconfig(machine_config &config)
+{
+ G65816(config, m_sa1, 10000000);
+ m_sa1->set_addrmap(AS_PROGRAM, &sns_sa1_device::sa1_map);
+}
diff --git a/src/devices/bus/snes/sa1.h b/src/devices/bus/snes/sa1.h
index 6ea8ae9b15a..e4fb646385a 100644
--- a/src/devices/bus/snes/sa1.h
+++ b/src/devices/bus/snes/sa1.h
@@ -26,25 +26,25 @@ protected:
virtual void device_add_mconfig(machine_config &config) override;
// reading and writing
- virtual DECLARE_READ8_MEMBER(read_l) override;
- virtual DECLARE_READ8_MEMBER(read_h) override;
- virtual DECLARE_WRITE8_MEMBER(write_l) override;
- virtual DECLARE_WRITE8_MEMBER(write_h) override;
+ virtual uint8_t read_l(offs_t offset) override;
+ virtual uint8_t read_h(offs_t offset) override;
+ virtual void write_l(offs_t offset, uint8_t data) override;
+ virtual void write_h(offs_t offset, uint8_t data) override;
// additional reading and writing
- virtual DECLARE_READ8_MEMBER(chip_read) override;
- virtual DECLARE_WRITE8_MEMBER(chip_write) override;
+ virtual uint8_t chip_read(offs_t offset) override;
+ virtual void chip_write(offs_t offset, uint8_t data) override;
private:
- uint8_t var_length_read(address_space &space, uint32_t offset);
- void dma_transfer(address_space &space);
- void dma_cctype1_transfer(address_space &space);
- void dma_cctype2_transfer(address_space &space);
+ uint8_t var_length_read(uint32_t offset);
+ void dma_transfer();
+ void dma_cctype1_transfer();
+ void dma_cctype2_transfer();
- uint8_t read_regs(address_space &space, uint32_t offset);
+ uint8_t read_regs(uint32_t offset);
uint8_t read_iram(uint32_t offset);
uint8_t read_bwram(uint32_t offset);
- void write_regs(address_space &space, uint32_t offset, uint8_t data);
+ void write_regs(uint32_t offset, uint8_t data);
void write_iram(uint32_t offset, uint8_t data);
void write_bwram(uint32_t offset, uint8_t data);
void recalc_irqs();
@@ -103,10 +103,10 @@ private:
// $2302-$2305
uint16_t m_hcr, m_vcr;
- DECLARE_READ8_MEMBER(sa1_lo_r);
- DECLARE_READ8_MEMBER(sa1_hi_r);
- DECLARE_WRITE8_MEMBER(sa1_lo_w);
- DECLARE_WRITE8_MEMBER(sa1_hi_w);
+ uint8_t sa1_lo_r(offs_t offset);
+ uint8_t sa1_hi_r(offs_t offset);
+ void sa1_lo_w(offs_t offset, uint8_t data);
+ void sa1_hi_w(offs_t offset, uint8_t data);
void sa1_map(address_map &map);
};
diff --git a/src/devices/bus/snes/sdd1.cpp b/src/devices/bus/snes/sdd1.cpp
index 6d13fcd97a8..94374d07681 100644
--- a/src/devices/bus/snes/sdd1.cpp
+++ b/src/devices/bus/snes/sdd1.cpp
@@ -470,7 +470,7 @@ void sns_rom_sdd1_device::device_reset()
mapper specific handlers
-------------------------------------------------*/
-READ8_MEMBER( sns_rom_sdd1_device::chip_read )
+uint8_t sns_rom_sdd1_device::chip_read(offs_t offset)
{
uint16_t addr = offset & 0xffff;
@@ -491,7 +491,7 @@ READ8_MEMBER( sns_rom_sdd1_device::chip_read )
}
-WRITE8_MEMBER( sns_rom_sdd1_device::chip_write )
+void sns_rom_sdd1_device::chip_write(offs_t offset, uint8_t data)
{
uint16_t addr = offset & 0xffff;
@@ -589,7 +589,7 @@ uint8_t sns_rom_sdd1_device::read_helper(uint32_t addr)
return m_rom[m_mmc[(addr >> 20) & 3] + (addr & 0x0fffff)];
}
-READ8_MEMBER(sns_rom_sdd1_device::read_l)
+uint8_t sns_rom_sdd1_device::read_l(offs_t offset)
{
if (offset < 0x400000)
return m_rom[rom_bank_map[offset / 0x10000] * 0x8000 + (offset & 0x7fff)];
@@ -597,21 +597,21 @@ READ8_MEMBER(sns_rom_sdd1_device::read_l)
return m_rom[rom_bank_map[(offset - 0x400000) / 0x8000] * 0x8000 + (offset & 0x7fff)];
}
-READ8_MEMBER(sns_rom_sdd1_device::read_h)
+uint8_t sns_rom_sdd1_device::read_h(offs_t offset)
{
if (offset >= 0x400000)
return read_helper(offset - 0x400000);
else
- return read_l(space, offset);
+ return read_l(offset);
}
-READ8_MEMBER( sns_rom_sdd1_device::read_ram )
+uint8_t sns_rom_sdd1_device::read_ram(offs_t offset)
{
return m_nvram[offset & 0x1fff];
}
-WRITE8_MEMBER( sns_rom_sdd1_device::write_ram )
+void sns_rom_sdd1_device::write_ram(offs_t offset, uint8_t data)
{
m_nvram[offset & 0x1fff] = data;
}
diff --git a/src/devices/bus/snes/sdd1.h b/src/devices/bus/snes/sdd1.h
index 6265e630bdc..5164a169f65 100644
--- a/src/devices/bus/snes/sdd1.h
+++ b/src/devices/bus/snes/sdd1.h
@@ -19,12 +19,12 @@ public:
sns_rom_sdd1_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
// reading and writing
- virtual DECLARE_READ8_MEMBER(read_l) override;
- virtual DECLARE_READ8_MEMBER(read_h) override;
- virtual DECLARE_READ8_MEMBER(read_ram) override;
- virtual DECLARE_WRITE8_MEMBER(write_ram) override;
- virtual DECLARE_READ8_MEMBER(chip_read) override;
- virtual DECLARE_WRITE8_MEMBER(chip_write) override;
+ virtual uint8_t read_l(offs_t offset) override;
+ virtual uint8_t read_h(offs_t offset) override;
+ virtual uint8_t read_ram(offs_t offset) override;
+ virtual void write_ram(offs_t offset, uint8_t data) override;
+ virtual uint8_t chip_read(offs_t offset) override;
+ virtual void chip_write(offs_t offset, uint8_t data) override;
protected:
sns_rom_sdd1_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock);
diff --git a/src/devices/bus/snes/sfx.cpp b/src/devices/bus/snes/sfx.cpp
index cf9942ada4d..59908b9b06e 100644
--- a/src/devices/bus/snes/sfx.cpp
+++ b/src/devices/bus/snes/sfx.cpp
@@ -40,30 +40,30 @@ void sns_rom_superfx_device::device_reset()
// LoROM + SuperFX (GSU-1,2)
// TODO: mask sfx_ram based on the actual RAM...
-READ8_MEMBER( sns_rom_superfx_device::superfx_r_bank1 )
+uint8_t sns_rom_superfx_device::superfx_r_bank1(offs_t offset)
{
return m_rom[rom_bank_map[offset / 0x10000] * 0x8000 + (offset & 0x7fff)];
}
-READ8_MEMBER( sns_rom_superfx_device::superfx_r_bank2 )
+uint8_t sns_rom_superfx_device::superfx_r_bank2(offs_t offset)
{
return m_rom[rom_bank_map[offset / 0x8000] * 0x8000 + (offset & 0x7fff)];
}
-READ8_MEMBER( sns_rom_superfx_device::superfx_r_bank3 )
+uint8_t sns_rom_superfx_device::superfx_r_bank3(offs_t offset)
{
return sfx_ram[offset & 0xfffff];
}
-WRITE8_MEMBER( sns_rom_superfx_device::superfx_w_bank1 )
+void sns_rom_superfx_device::superfx_w_bank1(offs_t offset, uint8_t data)
{
}
-WRITE8_MEMBER( sns_rom_superfx_device::superfx_w_bank2 )
+void sns_rom_superfx_device::superfx_w_bank2(offs_t offset, uint8_t data)
{
}
-WRITE8_MEMBER( sns_rom_superfx_device::superfx_w_bank3 )
+void sns_rom_superfx_device::superfx_w_bank3(offs_t offset, uint8_t data)
{
sfx_ram[offset & 0xfffff] = data;
}
@@ -92,23 +92,23 @@ void sns_rom_superfx_device::device_add_mconfig(machine_config &config)
m_superfx->irq().set(FUNC(sns_rom_superfx_device::snes_extern_irq_w)); /* IRQ line from cart */
}
-READ8_MEMBER( sns_rom_superfx_device::chip_read )
+uint8_t sns_rom_superfx_device::chip_read(offs_t offset)
{
return m_superfx->mmio_read(offset);
}
-WRITE8_MEMBER( sns_rom_superfx_device::chip_write )
+void sns_rom_superfx_device::chip_write(offs_t offset, uint8_t data)
{
m_superfx->mmio_write(offset, data);
}
-READ8_MEMBER( sns_rom_superfx_device::read_l )
+uint8_t sns_rom_superfx_device::read_l(offs_t offset)
{
- return read_h(space, offset);
+ return read_h(offset);
}
-READ8_MEMBER(sns_rom_superfx_device::read_h)
+uint8_t sns_rom_superfx_device::read_h(offs_t offset)
{
if (offset < 0x400000)
return m_rom[rom_bank_map[offset / 0x10000] * 0x8000 + (offset & 0x7fff)];
@@ -130,14 +130,14 @@ READ8_MEMBER(sns_rom_superfx_device::read_h)
return 0xff; // this handler should never be called for [60-7f]/[e0-ff] ranges
}
-READ8_MEMBER( sns_rom_superfx_device::read_ram )
+uint8_t sns_rom_superfx_device::read_ram(offs_t offset)
{
if (m_superfx->access_ram())
return sfx_ram[offset & 0xfffff];
return 0xff; // should be open bus...
}
-WRITE8_MEMBER( sns_rom_superfx_device::write_ram )
+void sns_rom_superfx_device::write_ram(offs_t offset, uint8_t data)
{
if (m_superfx->access_ram())
sfx_ram[offset & 0xfffff] = data;
diff --git a/src/devices/bus/snes/sfx.h b/src/devices/bus/snes/sfx.h
index 253084be139..7c92e411749 100644
--- a/src/devices/bus/snes/sfx.h
+++ b/src/devices/bus/snes/sfx.h
@@ -26,19 +26,19 @@ protected:
virtual DECLARE_WRITE_LINE_MEMBER(snes_extern_irq_w);
// additional reading and writing
- virtual DECLARE_READ8_MEMBER(read_l) override;
- virtual DECLARE_READ8_MEMBER(read_h) override;
- virtual DECLARE_READ8_MEMBER(read_ram) override;
- virtual DECLARE_WRITE8_MEMBER(write_ram) override;
- virtual DECLARE_READ8_MEMBER(chip_read) override;
- virtual DECLARE_WRITE8_MEMBER(chip_write) override;
-
- virtual DECLARE_READ8_MEMBER(superfx_r_bank1);
- virtual DECLARE_READ8_MEMBER(superfx_r_bank2);
- virtual DECLARE_READ8_MEMBER(superfx_r_bank3);
- virtual DECLARE_WRITE8_MEMBER(superfx_w_bank1);
- virtual DECLARE_WRITE8_MEMBER(superfx_w_bank2);
- virtual DECLARE_WRITE8_MEMBER(superfx_w_bank3);
+ virtual uint8_t read_l(offs_t offset) override;
+ virtual uint8_t read_h(offs_t offset) override;
+ virtual uint8_t read_ram(offs_t offset) override;
+ virtual void write_ram(offs_t offset, uint8_t data) override;
+ virtual uint8_t chip_read(offs_t offset) override;
+ virtual void chip_write(offs_t offset, uint8_t data) override;
+
+ uint8_t superfx_r_bank1(offs_t offset);
+ uint8_t superfx_r_bank2(offs_t offset);
+ uint8_t superfx_r_bank3(offs_t offset);
+ void superfx_w_bank1(offs_t offset, uint8_t data);
+ void superfx_w_bank2(offs_t offset, uint8_t data);
+ void superfx_w_bank3(offs_t offset, uint8_t data);
private:
required_device<superfx_device> m_superfx;
diff --git a/src/devices/bus/snes/sgb.cpp b/src/devices/bus/snes/sgb.cpp
index 1a50f504f01..6c790a1c773 100644
--- a/src/devices/bus/snes/sgb.cpp
+++ b/src/devices/bus/snes/sgb.cpp
@@ -74,55 +74,55 @@ void sns_rom_sgb_device::device_reset()
// ADDRESS_MAP( supergb_map )
//-------------------------------------------------
-READ8_MEMBER(sns_rom_sgb_device::gb_cart_r)
+uint8_t sns_rom_sgb_device::gb_cart_r(offs_t offset)
{
if (offset < 0x100 && !m_bios_disabled)
{
return m_region_bios->base()[offset];
}
- return m_cartslot->read_rom(space, offset);
+ return m_cartslot->read_rom(offset);
}
-WRITE8_MEMBER(sns_rom_sgb_device::gb_bank_w)
+void sns_rom_sgb_device::gb_bank_w(offs_t offset, uint8_t data)
{
- m_cartslot->write_bank(space, offset, data);
+ m_cartslot->write_bank(offset, data);
}
-READ8_MEMBER(sns_rom_sgb_device::gb_ram_r)
+uint8_t sns_rom_sgb_device::gb_ram_r(offs_t offset)
{
- return m_cartslot->read_ram(space, offset);
+ return m_cartslot->read_ram(offset);
}
-WRITE8_MEMBER(sns_rom_sgb_device::gb_ram_w)
+void sns_rom_sgb_device::gb_ram_w(offs_t offset, uint8_t data)
{
- m_cartslot->write_ram(space, offset, data);
+ m_cartslot->write_ram(offset, data);
}
-READ8_MEMBER(sns_rom_sgb_device::gb_echo_r)
+uint8_t sns_rom_sgb_device::gb_echo_r(offs_t offset)
{
- return space.read_byte(0xc000 + offset);
+ return m_sgb_cpu->space(AS_PROGRAM).read_byte(0xc000 + offset);
}
-WRITE8_MEMBER(sns_rom_sgb_device::gb_echo_w)
+void sns_rom_sgb_device::gb_echo_w(offs_t offset, uint8_t data)
{
- return space.write_byte(0xc000 + offset, data);
+ return m_sgb_cpu->space(AS_PROGRAM).write_byte(0xc000 + offset, data);
}
-READ8_MEMBER(sns_rom_sgb_device::gb_io_r)
+uint8_t sns_rom_sgb_device::gb_io_r(offs_t offset)
{
return 0;
}
-WRITE8_MEMBER(sns_rom_sgb_device::gb_io_w)
+void sns_rom_sgb_device::gb_io_w(offs_t offset, uint8_t data)
{
}
-READ8_MEMBER(sns_rom_sgb_device::gb_ie_r)
+uint8_t sns_rom_sgb_device::gb_ie_r(offs_t offset)
{
return m_sgb_cpu->get_ie();
}
-WRITE8_MEMBER(sns_rom_sgb_device::gb_ie_w)
+void sns_rom_sgb_device::gb_ie_w(offs_t offset, uint8_t data)
{
m_sgb_cpu->set_ie(data);
}
@@ -149,7 +149,7 @@ void sns_rom_sgb_device::supergb_map(address_map &map)
-WRITE8_MEMBER( sns_rom_sgb_device::gb_timer_callback )
+void sns_rom_sgb_device::gb_timer_callback(uint8_t data)
{
}
@@ -220,18 +220,18 @@ const tiny_rom_entry *sns_rom_sgb2_device::device_rom_region() const
-------------------------------------------------*/
-READ8_MEMBER(sns_rom_sgb_device::read_l)
+uint8_t sns_rom_sgb_device::read_l(offs_t offset)
{
- return read_h(space, offset);
+ return read_h(offset);
}
-READ8_MEMBER(sns_rom_sgb_device::read_h)
+uint8_t sns_rom_sgb_device::read_h(offs_t offset)
{
int bank = offset / 0x10000;
return m_rom[rom_bank_map[bank] * 0x8000 + (offset & 0x7fff)];
}
-READ8_MEMBER( sns_rom_sgb_device::chip_read )
+uint8_t sns_rom_sgb_device::chip_read(offs_t offset)
{
uint16_t address = offset & 0xffff;
@@ -299,7 +299,7 @@ void sns_rom_sgb_device::lcd_render(uint32_t *source)
}
}
-WRITE8_MEMBER( sns_rom_sgb_device::chip_write )
+void sns_rom_sgb_device::chip_write(offs_t offset, uint8_t data)
{
uint16_t address = offset & 0xffff;
diff --git a/src/devices/bus/snes/sgb.h b/src/devices/bus/snes/sgb.h
index c49ebaa44e3..db6782ddb98 100644
--- a/src/devices/bus/snes/sgb.h
+++ b/src/devices/bus/snes/sgb.h
@@ -21,8 +21,7 @@
class sns_rom_sgb_device : public sns_rom_device
{
public:
-
- virtual DECLARE_WRITE8_MEMBER(gb_timer_callback);
+ void gb_timer_callback(uint8_t data);
protected:
// construction/destruction
@@ -33,21 +32,21 @@ protected:
virtual void device_reset() override;
// reading and writing
- virtual DECLARE_READ8_MEMBER(read_l) override;
- virtual DECLARE_READ8_MEMBER(read_h) override;
- virtual DECLARE_READ8_MEMBER(chip_read) override;
- virtual DECLARE_WRITE8_MEMBER(chip_write) override;
-
- virtual DECLARE_READ8_MEMBER(gb_cart_r);
- virtual DECLARE_WRITE8_MEMBER(gb_bank_w);
- virtual DECLARE_READ8_MEMBER(gb_ram_r);
- virtual DECLARE_WRITE8_MEMBER(gb_ram_w);
- virtual DECLARE_READ8_MEMBER(gb_echo_r);
- virtual DECLARE_WRITE8_MEMBER(gb_echo_w);
- virtual DECLARE_READ8_MEMBER(gb_io_r);
- virtual DECLARE_WRITE8_MEMBER(gb_io_w);
- virtual DECLARE_READ8_MEMBER(gb_ie_r);
- virtual DECLARE_WRITE8_MEMBER(gb_ie_w);
+ virtual uint8_t read_l(offs_t offset) override;
+ virtual uint8_t read_h(offs_t offset) override;
+ virtual uint8_t chip_read(offs_t offset) override;
+ virtual void chip_write(offs_t offset, uint8_t data) override;
+
+ uint8_t gb_cart_r(offs_t offset);
+ void gb_bank_w(offs_t offset, uint8_t data);
+ uint8_t gb_ram_r(offs_t offset);
+ void gb_ram_w(offs_t offset, uint8_t data);
+ uint8_t gb_echo_r(offs_t offset);
+ void gb_echo_w(offs_t offset, uint8_t data);
+ uint8_t gb_io_r(offs_t offset);
+ void gb_io_w(offs_t offset, uint8_t data);
+ uint8_t gb_ie_r(offs_t offset);
+ void gb_ie_w(offs_t offset, uint8_t data);
void supergb_map(address_map &map);
diff --git a/src/devices/bus/snes/snes_slot.cpp b/src/devices/bus/snes/snes_slot.cpp
index f85f198f257..7af674e9f6d 100644
--- a/src/devices/bus/snes/snes_slot.cpp
+++ b/src/devices/bus/snes/snes_slot.cpp
@@ -177,6 +177,18 @@ WRITE_LINE_MEMBER(device_sns_cart_interface::write_irq)
m_slot->write_irq(state);
}
+//-------------------------------------------------
+// read_open_bus - read from the open bus
+//-------------------------------------------------
+
+uint8_t device_sns_cart_interface::read_open_bus()
+{
+ if (m_slot != nullptr)
+ return m_slot->read_open_bus();
+
+ return 0xff;
+}
+
//**************************************************************************
// LIVE DEVICE
//**************************************************************************
@@ -191,7 +203,8 @@ base_sns_cart_slot_device::base_sns_cart_slot_device(const machine_config &mconf
m_addon(ADDON_NONE),
m_type(SNES_MODE20),
m_cart(nullptr),
- m_irq_callback(*this)
+ m_irq_callback(*this),
+ m_open_bus_callback(*this)
{
}
@@ -225,9 +238,11 @@ base_sns_cart_slot_device::~base_sns_cart_slot_device()
void base_sns_cart_slot_device::device_start()
{
m_cart = dynamic_cast<device_sns_cart_interface *>(get_card_device());
- m_cart->m_slot = this;
+ if (m_cart != nullptr)
+ m_cart->m_slot = this;
m_irq_callback.resolve_safe();
+ m_open_bus_callback.resolve_safe(0xff);
}
@@ -1060,34 +1075,34 @@ std::string base_sns_cart_slot_device::get_default_card_software(get_default_car
read
-------------------------------------------------*/
-READ8_MEMBER(base_sns_cart_slot_device::read_l)
+uint8_t base_sns_cart_slot_device::read_l(offs_t offset)
{
if (m_cart)
- return m_cart->read_l(space, offset);
+ return m_cart->read_l(offset);
else
return 0xff;
}
-READ8_MEMBER(base_sns_cart_slot_device::read_h)
+uint8_t base_sns_cart_slot_device::read_h(offs_t offset)
{
if (m_cart)
- return m_cart->read_h(space, offset);
+ return m_cart->read_h(offset);
else
return 0xff;
}
-READ8_MEMBER(base_sns_cart_slot_device::read_ram)
+uint8_t base_sns_cart_slot_device::read_ram(offs_t offset)
{
if (m_cart)
- return m_cart->read_ram(space, offset);
+ return m_cart->read_ram(offset);
else
return 0xff;
}
-READ8_MEMBER(base_sns_cart_slot_device::chip_read)
+uint8_t base_sns_cart_slot_device::chip_read(offs_t offset)
{
if (m_cart)
- return m_cart->chip_read(space, offset);
+ return m_cart->chip_read(offset);
else
return 0xff;
}
@@ -1096,28 +1111,28 @@ READ8_MEMBER(base_sns_cart_slot_device::chip_read)
write
-------------------------------------------------*/
-WRITE8_MEMBER(base_sns_cart_slot_device::write_l)
+void base_sns_cart_slot_device::write_l(offs_t offset, uint8_t data)
{
if (m_cart)
- m_cart->write_l(space, offset, data);
+ m_cart->write_l(offset, data);
}
-WRITE8_MEMBER(base_sns_cart_slot_device::write_h)
+void base_sns_cart_slot_device::write_h(offs_t offset, uint8_t data)
{
if (m_cart)
- m_cart->write_h(space, offset, data);
+ m_cart->write_h(offset, data);
}
-WRITE8_MEMBER(base_sns_cart_slot_device::write_ram)
+void base_sns_cart_slot_device::write_ram(offs_t offset, uint8_t data)
{
if (m_cart)
- m_cart->write_ram(space, offset, data);
+ m_cart->write_ram(offset, data);
}
-WRITE8_MEMBER(base_sns_cart_slot_device::chip_write)
+void base_sns_cart_slot_device::chip_write(offs_t offset, uint8_t data)
{
if (m_cart)
- m_cart->chip_write(space, offset, data);
+ m_cart->chip_write(offset, data);
}
diff --git a/src/devices/bus/snes/snes_slot.h b/src/devices/bus/snes/snes_slot.h
index 91f61e88f4d..9d63a1ba9c2 100644
--- a/src/devices/bus/snes/snes_slot.h
+++ b/src/devices/bus/snes/snes_slot.h
@@ -111,14 +111,14 @@ public:
virtual ~device_sns_cart_interface();
// reading and writing
- virtual DECLARE_READ8_MEMBER(read_l) { return 0xff; } // ROM access in range [00-7f]
- virtual DECLARE_READ8_MEMBER(read_h) { return 0xff; } // ROM access in range [80-ff]
- virtual DECLARE_READ8_MEMBER(read_ram) { if (!m_nvram.empty()) return m_nvram[offset & (m_nvram.size()-1)]; else return 0xff; } // NVRAM access
- virtual DECLARE_WRITE8_MEMBER(write_l) { } // used by carts with subslots
- virtual DECLARE_WRITE8_MEMBER(write_h) { } // used by carts with subslots
- virtual DECLARE_WRITE8_MEMBER(write_ram) { if (!m_nvram.empty()) m_nvram[offset & (m_nvram.size()-1)] = data; } // NVRAM access
- virtual DECLARE_READ8_MEMBER(chip_read) { return 0xff; }
- virtual DECLARE_WRITE8_MEMBER(chip_write) { }
+ virtual uint8_t read_l(offs_t offset) { return 0xff; } // ROM access in range [00-7f]
+ virtual uint8_t read_h(offs_t offset) { return 0xff; } // ROM access in range [80-ff]
+ virtual uint8_t read_ram(offs_t offset) { if (!m_nvram.empty()) return m_nvram[offset & (m_nvram.size()-1)]; else return 0xff; } // NVRAM access
+ virtual void write_l(offs_t offset, uint8_t data) { } // used by carts with subslots
+ virtual void write_h(offs_t offset, uint8_t data) { } // used by carts with subslots
+ virtual void write_ram(offs_t offset, uint8_t data) { if (!m_nvram.empty()) m_nvram[offset & (m_nvram.size()-1)] = data; } // NVRAM access
+ virtual uint8_t chip_read(offs_t offset) { return 0xff; }
+ virtual void chip_write(offs_t offset, uint8_t data) { }
virtual void speedup_addon_bios_access() {}
void rom_alloc(uint32_t size, const char *tag);
@@ -142,6 +142,7 @@ protected:
device_sns_cart_interface(const machine_config &mconfig, device_t &device);
DECLARE_WRITE_LINE_MEMBER(write_irq);
+ uint8_t read_open_bus();
// internal state
uint8_t *m_rom;
@@ -168,6 +169,7 @@ public:
// configuration
auto irq_callback() { return m_irq_callback.bind(); }
+ auto open_bus_callback() { return m_open_bus_callback.bind(); }
// device-level overrides
virtual void device_start() override;
@@ -198,16 +200,17 @@ public:
virtual std::string get_default_card_software(get_default_card_software_hook &hook) const override;
// reading and writing
- DECLARE_READ8_MEMBER(read_l);
- DECLARE_READ8_MEMBER(read_h);
- DECLARE_READ8_MEMBER(read_ram);
- DECLARE_WRITE8_MEMBER(write_l);
- DECLARE_WRITE8_MEMBER(write_h);
- DECLARE_WRITE8_MEMBER(write_ram);
- DECLARE_READ8_MEMBER(chip_read);
- DECLARE_WRITE8_MEMBER(chip_write);
+ uint8_t read_l(offs_t offset);
+ uint8_t read_h(offs_t offset);
+ uint8_t read_ram(offs_t offset);
+ void write_l(offs_t offset, uint8_t data);
+ void write_h(offs_t offset, uint8_t data);
+ void write_ram(offs_t offset, uint8_t data);
+ uint8_t chip_read(offs_t offset);
+ void chip_write(offs_t offset, uint8_t data);
DECLARE_WRITE_LINE_MEMBER(write_irq) { m_irq_callback(state); }
+ uint8_t read_open_bus() { return m_open_bus_callback(); }
// in order to support legacy dumps + add-on CPU dump appended at the end of the file, we
// check if the required data is present and update bank map accordingly
@@ -230,6 +233,7 @@ protected:
private:
devcb_write_line m_irq_callback;
+ devcb_read8 m_open_bus_callback;
};
// ======================> sns_cart_slot_device
diff --git a/src/devices/bus/snes/spc7110.cpp b/src/devices/bus/snes/spc7110.cpp
index a88c06e9250..20d59dc681a 100644
--- a/src/devices/bus/snes/spc7110.cpp
+++ b/src/devices/bus/snes/spc7110.cpp
@@ -1076,7 +1076,7 @@ void sns_rom_spc7110_device::spc7110_update_time(uint8_t offset)
}
}
-READ8_MEMBER(sns_rom_spc7110_device::chip_read)
+uint8_t sns_rom_spc7110_device::chip_read(offs_t offset)
{
uint8_t *ROM = get_rom_base();
uint32_t len = get_rom_size();
@@ -1262,7 +1262,7 @@ READ8_MEMBER(sns_rom_spc7110_device::chip_read)
return 0xff;
}
-WRITE8_MEMBER(sns_rom_spc7110_device::chip_write)
+void sns_rom_spc7110_device::chip_write(offs_t offset, uint8_t data)
{
uint8_t *ROM = get_rom_base();
uint32_t len = get_rom_size();
@@ -1648,7 +1648,7 @@ WRITE8_MEMBER(sns_rom_spc7110_device::chip_write)
}
}
-READ8_MEMBER(sns_rom_spc7110_device::read_l)
+uint8_t sns_rom_spc7110_device::read_l(offs_t offset)
{
if (offset < 0x400000)
return m_rom[rom_bank_map[offset / 0x8000] * 0x8000 + (offset & 0x7fff)];
@@ -1656,7 +1656,7 @@ READ8_MEMBER(sns_rom_spc7110_device::read_l)
return 0xff;
}
-READ8_MEMBER(sns_rom_spc7110_device::read_h)
+uint8_t sns_rom_spc7110_device::read_h(offs_t offset)
{
uint16_t address = offset & 0xfffff;
@@ -1683,12 +1683,12 @@ READ8_MEMBER(sns_rom_spc7110_device::read_h)
}
-READ8_MEMBER( sns_rom_spc7110_device::read_ram )
+uint8_t sns_rom_spc7110_device::read_ram(offs_t offset)
{
return m_nvram[offset & 0x1fff];
}
-WRITE8_MEMBER( sns_rom_spc7110_device::write_ram )
+void sns_rom_spc7110_device::write_ram(offs_t offset, uint8_t data)
{
m_nvram[offset & 0x1fff] = data;
}
diff --git a/src/devices/bus/snes/spc7110.h b/src/devices/bus/snes/spc7110.h
index 249944c8ae7..a7c798244c1 100644
--- a/src/devices/bus/snes/spc7110.h
+++ b/src/devices/bus/snes/spc7110.h
@@ -18,13 +18,13 @@ public:
sns_rom_spc7110_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
// reading and writing
- virtual DECLARE_READ8_MEMBER(read_l) override;
- virtual DECLARE_READ8_MEMBER(read_h) override;
- virtual DECLARE_READ8_MEMBER(read_ram) override;
- virtual DECLARE_WRITE8_MEMBER(write_ram) override;
+ virtual uint8_t read_l(offs_t offset) override;
+ virtual uint8_t read_h(offs_t offset) override;
+ virtual uint8_t read_ram(offs_t offset) override;
+ virtual void write_ram(offs_t offset, uint8_t data) override;
- virtual DECLARE_READ8_MEMBER(chip_read) override;
- virtual DECLARE_WRITE8_MEMBER(chip_write) override;
+ virtual uint8_t chip_read(offs_t offset) override;
+ virtual void chip_write(offs_t offset, uint8_t data) override;
protected:
sns_rom_spc7110_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock);
@@ -199,11 +199,11 @@ public:
// reading and writing
// we just use the spc7110 ones for the moment, pending the split of regs 0x4840-0x4842 (RTC) from the base add-on
-// virtual DECLARE_READ8_MEMBER(read_l);
-// virtual DECLARE_READ8_MEMBER(read_h);
+// virtual uint8_t read_l(offs_t offset);
+// virtual uint8_t read_h(offs_t offset);
-// virtual DECLARE_READ8_MEMBER(chip_read);
-// virtual DECLARE_WRITE8_MEMBER(chip_write);
+// virtual uint8_t chip_read(offs_t offset);
+// virtual void chip_write(offs_t offset, uint8_t data);
protected:
// device-level overrides
diff --git a/src/devices/bus/snes/sufami.cpp b/src/devices/bus/snes/sufami.cpp
index 3e163e150e5..7589fb84fa4 100644
--- a/src/devices/bus/snes/sufami.cpp
+++ b/src/devices/bus/snes/sufami.cpp
@@ -66,12 +66,12 @@ void sns_rom_sufami_device::device_add_mconfig(machine_config &config)
mapper specific handlers
-------------------------------------------------*/
-READ8_MEMBER(sns_rom_sufami_device::read_l)
+uint8_t sns_rom_sufami_device::read_l(offs_t offset)
{
- return read_h(space, offset);
+ return read_h(offset);
}
-READ8_MEMBER(sns_rom_sufami_device::read_h)
+uint8_t sns_rom_sufami_device::read_h(offs_t offset)
{
int bank;
@@ -82,11 +82,11 @@ READ8_MEMBER(sns_rom_sufami_device::read_h)
}
if (offset >= 0x200000 && offset < 0x400000) // SLOT1 STROM
{
- return m_slot1->read_l(space, offset - 0x200000);
+ return m_slot1->read_l(offset - 0x200000);
}
if (offset >= 0x400000 && offset < 0x600000) // SLOT2 STROM
{
- return m_slot2->read_l(space, offset - 0x400000);
+ return m_slot2->read_l(offset - 0x400000);
}
if (offset >= 0x600000 && offset < 0x640000) // SLOT1 RAM
{
@@ -94,7 +94,7 @@ READ8_MEMBER(sns_rom_sufami_device::read_h)
{
offset -= 0x600000;
bank = offset / 0x10000;
- return m_slot1->read_ram(space, bank * 0x8000 + (offset & 0x7fff));
+ return m_slot1->read_ram(bank * 0x8000 + (offset & 0x7fff));
}
}
if (offset >= 0x700000 && offset < 0x740000) // SLOT2 RAM
@@ -103,19 +103,19 @@ READ8_MEMBER(sns_rom_sufami_device::read_h)
{
offset -= 0x700000;
bank = offset / 0x10000;
- return m_slot2->read_ram(space, bank * 0x8000 + (offset & 0x7fff));
+ return m_slot2->read_ram(bank * 0x8000 + (offset & 0x7fff));
}
}
return 0xff;
}
-WRITE8_MEMBER(sns_rom_sufami_device::write_l)
+void sns_rom_sufami_device::write_l(offs_t offset, uint8_t data)
{
- write_h(space, offset, data);
+ write_h(offset, data);
}
-WRITE8_MEMBER(sns_rom_sufami_device::write_h)
+void sns_rom_sufami_device::write_h(offs_t offset, uint8_t data)
{
int bank;
if (offset >= 0x600000 && offset < 0x640000) // SLOT1 RAM
@@ -124,7 +124,7 @@ WRITE8_MEMBER(sns_rom_sufami_device::write_h)
{
offset -= 0x600000;
bank = offset / 0x10000;
- m_slot1->write_ram(space, bank * 0x8000 + (offset & 0x7fff), data);
+ m_slot1->write_ram(bank * 0x8000 + (offset & 0x7fff), data);
}
}
@@ -134,7 +134,7 @@ WRITE8_MEMBER(sns_rom_sufami_device::write_h)
{
offset -= 0x700000;
bank = offset / 0x10000;
- m_slot2->write_ram(space, bank * 0x8000 + (offset & 0x7fff), data);
+ m_slot2->write_ram(bank * 0x8000 + (offset & 0x7fff), data);
}
}
@@ -144,7 +144,7 @@ WRITE8_MEMBER(sns_rom_sufami_device::write_h)
Sufami Turbo 'minicart' emulation
-------------------------------------------------*/
-READ8_MEMBER(sns_rom_strom_device::read_l)
+uint8_t sns_rom_strom_device::read_l(offs_t offset)
{
if (offset < 0x200000)
{
diff --git a/src/devices/bus/snes/sufami.h b/src/devices/bus/snes/sufami.h
index 6b4b3df3bea..1b231131a2b 100644
--- a/src/devices/bus/snes/sufami.h
+++ b/src/devices/bus/snes/sufami.h
@@ -18,10 +18,10 @@ public:
sns_rom_sufami_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
// additional reading and writing
- virtual DECLARE_READ8_MEMBER(read_l) override;
- virtual DECLARE_READ8_MEMBER(read_h) override;
- virtual DECLARE_WRITE8_MEMBER(write_l) override;
- virtual DECLARE_WRITE8_MEMBER(write_h) override;
+ virtual uint8_t read_l(offs_t offset) override;
+ virtual uint8_t read_h(offs_t offset) override;
+ virtual void write_l(offs_t offset, uint8_t data) override;
+ virtual void write_h(offs_t offset, uint8_t data) override;
protected:
// device-level overrides
@@ -43,7 +43,7 @@ public:
sns_rom_strom_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
// additional reading and writing
- virtual DECLARE_READ8_MEMBER(read_l) override;
+ virtual uint8_t read_l(offs_t offset) override;
protected:
// device-level overrides
diff --git a/src/devices/bus/snes/upd.cpp b/src/devices/bus/snes/upd.cpp
index 462ab0faf98..70396938e89 100644
--- a/src/devices/bus/snes/upd.cpp
+++ b/src/devices/bus/snes/upd.cpp
@@ -97,12 +97,12 @@ void sns_rom_setadsp_device::device_start()
// Lo-ROM
// DSP dump contains prg at offset 0 and data at offset 0x2000
-READ32_MEMBER( sns_rom20_necdsp_device::necdsp_prg_r )
+uint32_t sns_rom20_necdsp_device::necdsp_prg_r(offs_t offset)
{
return get_prg(&m_bios[0], offset);
}
-READ16_MEMBER( sns_rom20_necdsp_device::necdsp_data_r )
+uint16_t sns_rom20_necdsp_device::necdsp_data_r(offs_t offset)
{
return get_data(&m_bios[0], offset + 0x2000/2);
}
@@ -132,20 +132,21 @@ void sns_rom20_necdsp_device::dsp_data_map_lorom(address_map &map)
// device_add_mconfig - add device configuration
//-------------------------------------------------
-MACHINE_CONFIG_START(sns_rom20_necdsp_device::device_add_mconfig)
- MCFG_DEVICE_ADD("dsp", UPD7725, 8000000)
- MCFG_DEVICE_PROGRAM_MAP(dsp_prg_map_lorom)
- MCFG_DEVICE_DATA_MAP(dsp_data_map_lorom)
-MACHINE_CONFIG_END
+void sns_rom20_necdsp_device::device_add_mconfig(machine_config &config)
+{
+ UPD7725(config, m_upd7725, 8000000);
+ m_upd7725->set_addrmap(AS_PROGRAM, &sns_rom20_necdsp_device::dsp_prg_map_lorom);
+ m_upd7725->set_addrmap(AS_DATA, &sns_rom20_necdsp_device::dsp_data_map_lorom);
+}
-READ8_MEMBER( sns_rom20_necdsp_device::chip_read )
+uint8_t sns_rom20_necdsp_device::chip_read(offs_t offset)
{
offset &= 0x7fff;
return m_upd7725->snesdsp_read(offset < 0x4000);
}
-WRITE8_MEMBER( sns_rom20_necdsp_device::chip_write )
+void sns_rom20_necdsp_device::chip_write(offs_t offset, uint8_t data)
{
offset &= 0x7fff;
m_upd7725->snesdsp_write(offset < 0x4000, data);
@@ -155,12 +156,12 @@ WRITE8_MEMBER( sns_rom20_necdsp_device::chip_write )
// Hi-ROM
// DSP dump contains prg at offset 0 and data at offset 0x2000
-READ32_MEMBER( sns_rom21_necdsp_device::necdsp_prg_r )
+uint32_t sns_rom21_necdsp_device::necdsp_prg_r(offs_t offset)
{
return get_prg(&m_bios[0], offset);
}
-READ16_MEMBER( sns_rom21_necdsp_device::necdsp_data_r )
+uint16_t sns_rom21_necdsp_device::necdsp_data_r(offs_t offset)
{
return get_data(&m_bios[0], offset + 0x2000/2);
}
@@ -189,20 +190,21 @@ void sns_rom21_necdsp_device::dsp_data_map_hirom(address_map &map)
// device_add_mconfig - add device configuration
//-------------------------------------------------
-MACHINE_CONFIG_START(sns_rom21_necdsp_device::device_add_mconfig)
- MCFG_DEVICE_ADD("dsp", UPD7725, 8000000)
- MCFG_DEVICE_PROGRAM_MAP(dsp_prg_map_hirom)
- MCFG_DEVICE_DATA_MAP(dsp_data_map_hirom)
-MACHINE_CONFIG_END
+void sns_rom21_necdsp_device::device_add_mconfig(machine_config &config)
+{
+ UPD7725(config, m_upd7725, 8000000);
+ m_upd7725->set_addrmap(AS_PROGRAM, &sns_rom21_necdsp_device::dsp_prg_map_hirom);
+ m_upd7725->set_addrmap(AS_DATA, &sns_rom21_necdsp_device::dsp_data_map_hirom);
+}
-READ8_MEMBER( sns_rom21_necdsp_device::chip_read )
+uint8_t sns_rom21_necdsp_device::chip_read(offs_t offset)
{
offset &= 0x1fff;
return m_upd7725->snesdsp_read(offset < 0x1000);
}
-WRITE8_MEMBER( sns_rom21_necdsp_device::chip_write )
+void sns_rom21_necdsp_device::chip_write(offs_t offset, uint8_t data)
{
offset &= 0x1fff;
m_upd7725->snesdsp_write(offset < 0x1000, data);
@@ -215,7 +217,7 @@ WRITE8_MEMBER( sns_rom21_necdsp_device::chip_write )
// same as above but additional read/write handling for the add-on chip
-READ8_MEMBER( sns_rom_setadsp_device::chip_read )
+uint8_t sns_rom_setadsp_device::chip_read(offs_t offset)
{
if (offset >= 0x600000 && offset < 0x680000 && (offset & 0xffff) < 0x4000)
m_upd96050->snesdsp_read((offset & 0x01) ? false : true);
@@ -234,7 +236,7 @@ READ8_MEMBER( sns_rom_setadsp_device::chip_read )
}
-WRITE8_MEMBER( sns_rom_setadsp_device::chip_write )
+void sns_rom_setadsp_device::chip_write(offs_t offset, uint8_t data)
{
if (offset >= 0x600000 && offset < 0x680000 && (offset & 0xffff) < 0x4000)
{
@@ -265,12 +267,12 @@ WRITE8_MEMBER( sns_rom_setadsp_device::chip_write )
// DSP dump contains prg at offset 0 and data at offset 0x10000
-READ32_MEMBER( sns_rom_setadsp_device::setadsp_prg_r )
+uint32_t sns_rom_setadsp_device::setadsp_prg_r(offs_t offset)
{
return get_prg(&m_bios[0], offset);
}
-READ16_MEMBER( sns_rom_setadsp_device::setadsp_data_r )
+uint16_t sns_rom_setadsp_device::setadsp_data_r(offs_t offset)
{
return get_data(&m_bios[0], offset + 0x10000/2);
}
@@ -300,18 +302,20 @@ void sns_rom_setadsp_device::st01x_data_map(address_map &map)
// device_add_mconfig - add device configuration
//-------------------------------------------------
-MACHINE_CONFIG_START(sns_rom_seta10dsp_device::device_add_mconfig)
- MCFG_DEVICE_ADD("dsp", UPD96050, 10000000)
- MCFG_DEVICE_PROGRAM_MAP(st01x_prg_map)
- MCFG_DEVICE_DATA_MAP(st01x_data_map)
-MACHINE_CONFIG_END
+void sns_rom_seta10dsp_device::device_add_mconfig(machine_config &config)
+{
+ UPD96050(config, m_upd96050, 10000000);
+ m_upd96050->set_addrmap(AS_PROGRAM, &sns_rom_seta10dsp_device::st01x_prg_map);
+ m_upd96050->set_addrmap(AS_DATA, &sns_rom_seta10dsp_device::st01x_data_map);
+}
-MACHINE_CONFIG_START(sns_rom_seta11dsp_device::device_add_mconfig)
- MCFG_DEVICE_ADD("dsp", UPD96050, 15000000)
- MCFG_DEVICE_PROGRAM_MAP(st01x_prg_map)
- MCFG_DEVICE_DATA_MAP(st01x_data_map)
-MACHINE_CONFIG_END
+void sns_rom_seta11dsp_device::device_add_mconfig(machine_config &config)
+{
+ UPD96050(config, m_upd96050, 15000000);
+ m_upd96050->set_addrmap(AS_PROGRAM, &sns_rom_seta11dsp_device::st01x_prg_map);
+ m_upd96050->set_addrmap(AS_DATA, &sns_rom_seta11dsp_device::st01x_data_map);
+}
// To make faster DSP access to its internal rom, let's install read banks and map m_bios there with correct byte order
@@ -411,53 +415,61 @@ sns_rom_seta11dsp_legacy_device::sns_rom_seta11dsp_legacy_device(const machine_c
}
-MACHINE_CONFIG_START(sns_rom20_necdsp1_legacy_device::device_add_mconfig)
- MCFG_DEVICE_ADD("dsp", UPD7725, 8000000)
- MCFG_DEVICE_PROGRAM_MAP(dsp_prg_map_lorom)
- MCFG_DEVICE_DATA_MAP(dsp_data_map_lorom)
-MACHINE_CONFIG_END
-
-MACHINE_CONFIG_START(sns_rom20_necdsp1b_legacy_device::device_add_mconfig)
- MCFG_DEVICE_ADD("dsp", UPD7725, 8000000)
- MCFG_DEVICE_PROGRAM_MAP(dsp_prg_map_lorom)
- MCFG_DEVICE_DATA_MAP(dsp_data_map_lorom)
-MACHINE_CONFIG_END
-
-MACHINE_CONFIG_START(sns_rom20_necdsp2_legacy_device::device_add_mconfig)
- MCFG_DEVICE_ADD("dsp", UPD7725, 8000000)
- MCFG_DEVICE_PROGRAM_MAP(dsp_prg_map_lorom)
- MCFG_DEVICE_DATA_MAP(dsp_data_map_lorom)
-MACHINE_CONFIG_END
-
-MACHINE_CONFIG_START(sns_rom20_necdsp3_legacy_device::device_add_mconfig)
- MCFG_DEVICE_ADD("dsp", UPD7725, 8000000)
- MCFG_DEVICE_PROGRAM_MAP(dsp_prg_map_lorom)
- MCFG_DEVICE_DATA_MAP(dsp_data_map_lorom)
-MACHINE_CONFIG_END
-
-MACHINE_CONFIG_START(sns_rom20_necdsp4_legacy_device::device_add_mconfig)
- MCFG_DEVICE_ADD("dsp", UPD7725, 8000000)
- MCFG_DEVICE_PROGRAM_MAP(dsp_prg_map_lorom)
- MCFG_DEVICE_DATA_MAP(dsp_data_map_lorom)
-MACHINE_CONFIG_END
-
-MACHINE_CONFIG_START(sns_rom21_necdsp1_legacy_device::device_add_mconfig)
- MCFG_DEVICE_ADD("dsp", UPD7725, 8000000)
- MCFG_DEVICE_PROGRAM_MAP(dsp_prg_map_hirom)
- MCFG_DEVICE_DATA_MAP(dsp_data_map_hirom)
-MACHINE_CONFIG_END
-
-MACHINE_CONFIG_START(sns_rom_seta10dsp_legacy_device::device_add_mconfig)
- MCFG_DEVICE_ADD("dsp", UPD96050, 10000000)
- MCFG_DEVICE_PROGRAM_MAP(st01x_prg_map)
- MCFG_DEVICE_DATA_MAP(st01x_data_map)
-MACHINE_CONFIG_END
-
-MACHINE_CONFIG_START(sns_rom_seta11dsp_legacy_device::device_add_mconfig)
- MCFG_DEVICE_ADD("dsp", UPD96050, 15000000)
- MCFG_DEVICE_PROGRAM_MAP(st01x_prg_map)
- MCFG_DEVICE_DATA_MAP(st01x_data_map)
-MACHINE_CONFIG_END
+void sns_rom20_necdsp1_legacy_device::device_add_mconfig(machine_config &config)
+{
+ UPD7725(config, m_upd7725, 8000000);
+ m_upd7725->set_addrmap(AS_PROGRAM, &sns_rom20_necdsp1_legacy_device::dsp_prg_map_lorom);
+ m_upd7725->set_addrmap(AS_DATA, &sns_rom20_necdsp1_legacy_device::dsp_data_map_lorom);
+}
+
+void sns_rom20_necdsp1b_legacy_device::device_add_mconfig(machine_config &config)
+{
+ UPD7725(config, m_upd7725, 8000000);
+ m_upd7725->set_addrmap(AS_PROGRAM, &sns_rom20_necdsp1b_legacy_device::dsp_prg_map_lorom);
+ m_upd7725->set_addrmap(AS_DATA, &sns_rom20_necdsp1b_legacy_device::dsp_data_map_lorom);
+}
+
+void sns_rom20_necdsp2_legacy_device::device_add_mconfig(machine_config &config)
+{
+ UPD7725(config, m_upd7725, 8000000);
+ m_upd7725->set_addrmap(AS_PROGRAM, &sns_rom20_necdsp2_legacy_device::dsp_prg_map_lorom);
+ m_upd7725->set_addrmap(AS_DATA, &sns_rom20_necdsp2_legacy_device::dsp_data_map_lorom);
+}
+
+void sns_rom20_necdsp3_legacy_device::device_add_mconfig(machine_config &config)
+{
+ UPD7725(config, m_upd7725, 8000000);
+ m_upd7725->set_addrmap(AS_PROGRAM, &sns_rom20_necdsp3_legacy_device::dsp_prg_map_lorom);
+ m_upd7725->set_addrmap(AS_DATA, &sns_rom20_necdsp3_legacy_device::dsp_data_map_lorom);
+}
+
+void sns_rom20_necdsp4_legacy_device::device_add_mconfig(machine_config &config)
+{
+ UPD7725(config, m_upd7725, 8000000);
+ m_upd7725->set_addrmap(AS_PROGRAM, &sns_rom20_necdsp4_legacy_device::dsp_prg_map_lorom);
+ m_upd7725->set_addrmap(AS_DATA, &sns_rom20_necdsp4_legacy_device::dsp_data_map_lorom);
+}
+
+void sns_rom21_necdsp1_legacy_device::device_add_mconfig(machine_config &config)
+{
+ UPD7725(config, m_upd7725, 8000000);
+ m_upd7725->set_addrmap(AS_PROGRAM, &sns_rom21_necdsp1_legacy_device::dsp_prg_map_hirom);
+ m_upd7725->set_addrmap(AS_DATA, &sns_rom21_necdsp1_legacy_device::dsp_data_map_hirom);
+}
+
+void sns_rom_seta10dsp_legacy_device::device_add_mconfig(machine_config &config)
+{
+ UPD96050(config, m_upd96050, 10000000);
+ m_upd96050->set_addrmap(AS_PROGRAM, &sns_rom_seta10dsp_legacy_device::st01x_prg_map);
+ m_upd96050->set_addrmap(AS_DATA, &sns_rom_seta10dsp_legacy_device::st01x_data_map);
+}
+
+void sns_rom_seta11dsp_legacy_device::device_add_mconfig(machine_config &config)
+{
+ UPD96050(config, m_upd96050, 15000000);
+ m_upd96050->set_addrmap(AS_PROGRAM, &sns_rom_seta11dsp_legacy_device::st01x_prg_map);
+ m_upd96050->set_addrmap(AS_DATA, &sns_rom_seta11dsp_legacy_device::st01x_data_map);
+}
ROM_START( snes_dsp1 )
diff --git a/src/devices/bus/snes/upd.h b/src/devices/bus/snes/upd.h
index dfc55466225..65dd780c725 100644
--- a/src/devices/bus/snes/upd.h
+++ b/src/devices/bus/snes/upd.h
@@ -28,18 +28,18 @@ protected:
virtual void speedup_addon_bios_access() override;
// additional reading and writing
- virtual DECLARE_READ8_MEMBER(chip_read) override;
- virtual DECLARE_WRITE8_MEMBER(chip_write) override;
+ virtual uint8_t chip_read(offs_t offset) override;
+ virtual void chip_write(offs_t offset, uint8_t data) override;
- virtual DECLARE_READ32_MEMBER(necdsp_prg_r);
- virtual DECLARE_READ16_MEMBER(necdsp_data_r);
+ uint32_t necdsp_prg_r(offs_t offset);
+ uint16_t necdsp_data_r(offs_t offset);
void dsp_data_map_lorom(address_map &map);
void dsp_prg_map_lorom(address_map &map);
-private:
required_device<upd7725_device> m_upd7725;
+private:
std::vector<uint32_t> m_dsp_prg;
std::vector<uint16_t> m_dsp_data;
};
@@ -62,18 +62,18 @@ protected:
virtual void speedup_addon_bios_access() override;
// additional reading and writing
- virtual DECLARE_READ8_MEMBER(chip_read) override;
- virtual DECLARE_WRITE8_MEMBER(chip_write) override;
+ virtual uint8_t chip_read(offs_t offset) override;
+ virtual void chip_write(offs_t offset, uint8_t data) override;
- virtual DECLARE_READ32_MEMBER(necdsp_prg_r);
- virtual DECLARE_READ16_MEMBER(necdsp_data_r);
+ uint32_t necdsp_prg_r(offs_t offset);
+ uint16_t necdsp_data_r(offs_t offset);
void dsp_data_map_hirom(address_map &map);
void dsp_prg_map_hirom(address_map &map);
-private:
required_device<upd7725_device> m_upd7725;
+private:
std::vector<uint32_t> m_dsp_prg;
std::vector<uint16_t> m_dsp_data;
};
@@ -93,18 +93,18 @@ protected:
virtual void device_start() override;
// additional reading and writing
- virtual DECLARE_READ8_MEMBER(chip_read) override;
- virtual DECLARE_WRITE8_MEMBER(chip_write) override;
+ virtual uint8_t chip_read(offs_t offset) override;
+ virtual void chip_write(offs_t offset, uint8_t data) override;
- virtual DECLARE_READ32_MEMBER(setadsp_prg_r);
- virtual DECLARE_READ16_MEMBER(setadsp_data_r);
+ virtual uint32_t setadsp_prg_r(offs_t offset);
+ virtual uint16_t setadsp_data_r(offs_t offset);
void st01x_data_map(address_map &map);
void st01x_prg_map(address_map &map);
-private:
required_device<upd96050_device> m_upd96050;
+private:
std::vector<uint32_t> m_dsp_prg;
std::vector<uint16_t> m_dsp_data;
};
diff --git a/src/devices/bus/snes_ctrl/ctrl.h b/src/devices/bus/snes_ctrl/ctrl.h
index 686db2f29e2..37db69537cc 100644
--- a/src/devices/bus/snes_ctrl/ctrl.h
+++ b/src/devices/bus/snes_ctrl/ctrl.h
@@ -51,7 +51,7 @@ public:
// construction/destruction
template <typename T>
snes_control_port_device(machine_config const &mconfig, char const *tag, device_t *owner, T &&opts, char const *dflt)
- : snes_control_port_device(mconfig, tag, owner, (uint32_t)0)
+ : snes_control_port_device(mconfig, tag, owner, 0)
{
option_reset();
opts(*this);
@@ -61,8 +61,8 @@ public:
snes_control_port_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock = 0);
virtual ~snes_control_port_device();
- template <typename Object> void set_onscreen_callback(Object &&cb) { m_onscreen_cb = std::forward<Object>(cb); }
- template <typename Object> void set_gunlatch_callback(Object &&cb) { m_gunlatch_cb = std::forward<Object>(cb); }
+ template <typename... T> void set_onscreen_callback(T &&... args) { m_onscreen_cb = snesctrl_onscreen_delegate(std::forward<T>(args)...); }
+ template <typename... T> void set_gunlatch_callback(T &&... args) { m_gunlatch_cb = snesctrl_gunlatch_delegate(std::forward<T>(args)...); }
uint8_t read_pin4();
uint8_t read_pin5();
@@ -87,22 +87,6 @@ protected:
// device type definition
DECLARE_DEVICE_TYPE(SNES_CONTROL_PORT, snes_control_port_device)
-
-//**************************************************************************
-// INTERFACE CONFIGURATION MACROS
-//**************************************************************************
-
-#define MCFG_SNES_CONTROL_PORT_ADD(_tag, _slot_intf, _def_slot) \
- MCFG_DEVICE_ADD(_tag, SNES_CONTROL_PORT, 0) \
- MCFG_DEVICE_SLOT_INTERFACE(_slot_intf, _def_slot, false)
-
-#define MCFG_SNESCTRL_ONSCREEN_CB(_class, _method) \
- downcast<snes_control_port_device &>(*device).set_onscreen_callback(snesctrl_onscreen_delegate(&_class::_method, #_class "::" #_method, this));
-
-#define MCFG_SNESCTRL_GUNLATCH_CB(_class, _method) \
- downcast<snes_control_port_device &>(*device).set_gunlatch_callback(snesctrl_gunlatch_delegate(&_class::_method, #_class "::" #_method, this));
-
-
void snes_control_port_devices(device_slot_interface &device);
diff --git a/src/devices/bus/snes_ctrl/miracle.cpp b/src/devices/bus/snes_ctrl/miracle.cpp
index a20a6743709..a0d9c70874c 100644
--- a/src/devices/bus/snes_ctrl/miracle.cpp
+++ b/src/devices/bus/snes_ctrl/miracle.cpp
@@ -23,12 +23,12 @@
DEFINE_DEVICE_TYPE(SNES_MIRACLE, snes_miracle_device, "snes_miracle", "Miracle Piano SNES Cable")
-MACHINE_CONFIG_START(snes_miracle_device::device_add_mconfig)
- MCFG_MIDI_PORT_ADD("mdin", midiin_slot, "midiin")
- MCFG_MIDI_RX_HANDLER(WRITELINE(*this, snes_miracle_device, rx_w))
+void snes_miracle_device::device_add_mconfig(machine_config &config)
+{
+ MIDI_PORT(config, "mdin", midiin_slot, "midiin").rxd_handler().set(FUNC(snes_miracle_device::rx_w));
- MCFG_MIDI_PORT_ADD("mdout", midiout_slot, "midiout")
-MACHINE_CONFIG_END
+ MIDI_PORT(config, "mdout", midiout_slot, "midiout");
+}
//-------------------------------------------------
diff --git a/src/devices/bus/snes_ctrl/multitap.cpp b/src/devices/bus/snes_ctrl/multitap.cpp
index 262ef56fd26..ef630439276 100644
--- a/src/devices/bus/snes_ctrl/multitap.cpp
+++ b/src/devices/bus/snes_ctrl/multitap.cpp
@@ -47,12 +47,13 @@ static void snes_multitap(device_slot_interface &device)
// device_add_mconfig - add device configuration
//-------------------------------------------------
-MACHINE_CONFIG_START(snes_multitap_device::device_add_mconfig)
- MCFG_SNES_CONTROL_PORT_ADD("port1", snes_multitap, "joypad")
- MCFG_SNES_CONTROL_PORT_ADD("port2", snes_multitap, "joypad")
- MCFG_SNES_CONTROL_PORT_ADD("port3", snes_multitap, "joypad")
- MCFG_SNES_CONTROL_PORT_ADD("port4", snes_multitap, "joypad")
-MACHINE_CONFIG_END
+void snes_multitap_device::device_add_mconfig(machine_config &config)
+{
+ SNES_CONTROL_PORT(config, m_port1, snes_multitap, "joypad");
+ SNES_CONTROL_PORT(config, m_port2, snes_multitap, "joypad");
+ SNES_CONTROL_PORT(config, m_port3, snes_multitap, "joypad");
+ SNES_CONTROL_PORT(config, m_port4, snes_multitap, "joypad");
+}
//**************************************************************************
diff --git a/src/devices/bus/spc1000/exp.h b/src/devices/bus/spc1000/exp.h
index b281e7a560c..d10fe516401 100644
--- a/src/devices/bus/spc1000/exp.h
+++ b/src/devices/bus/spc1000/exp.h
@@ -28,6 +28,15 @@ class spc1000_exp_device : public device_t, public device_slot_interface
{
public:
// construction/destruction
+ template <typename T>
+ spc1000_exp_device(const machine_config &mconfig, const char *tag, device_t *owner, T &&opts)
+ : spc1000_exp_device(mconfig, tag, owner, (uint32_t)0)
+ {
+ opts(*this);
+ set_default_option(nullptr);
+ set_fixed(false);
+ }
+
spc1000_exp_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
virtual ~spc1000_exp_device();
diff --git a/src/devices/bus/spectrum/beta.cpp b/src/devices/bus/spectrum/beta.cpp
new file mode 100644
index 00000000000..e48bed34e52
--- /dev/null
+++ b/src/devices/bus/spectrum/beta.cpp
@@ -0,0 +1,256 @@
+// license:BSD-3-Clause
+// copyright-holders:Nigel Barnes
+/*********************************************************************
+
+ Technology Research Beta 128 Disk interface
+
+*********************************************************************/
+
+#include "emu.h"
+#include "beta.h"
+
+
+/***************************************************************************
+ DEVICE DEFINITIONS
+***************************************************************************/
+
+DEFINE_DEVICE_TYPE(SPECTRUM_BETA128, spectrum_beta128_device, "spectrum_beta128", "TR Beta 128 Disk Interface")
+
+
+//-------------------------------------------------
+// INPUT_PORTS( beta128 )
+//-------------------------------------------------
+
+INPUT_PORTS_START(beta128)
+ PORT_START("BUTTON")
+ PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_BUTTON1) PORT_NAME("Magic Button") PORT_CODE(KEYCODE_F12) PORT_CHANGED_MEMBER(DEVICE_SELF, spectrum_beta128_device, magic_button, nullptr)
+
+ PORT_START("SWITCH")
+ PORT_CONFNAME(0x03, 0x01, "System Switch") //PORT_CHANGED_MEMBER(DEVICE_SELF, spectrum_beta128_device, switch_changed, 0)
+ PORT_CONFSETTING(0x00, "Off (128)")
+ PORT_CONFSETTING(0x01, "Normal (auto-boot)")
+ //PORT_CONFSETTING(0x02, "Reset") // TODO: implement RESET callback
+INPUT_PORTS_END
+
+//-------------------------------------------------
+// input_ports - device-specific input ports
+//-------------------------------------------------
+
+ioport_constructor spectrum_beta128_device::device_input_ports() const
+{
+ return INPUT_PORTS_NAME(beta128);
+}
+
+//-------------------------------------------------
+// SLOT_INTERFACE( beta_floppies )
+//-------------------------------------------------
+
+static void beta_floppies(device_slot_interface &device)
+{
+ device.option_add("525qd", FLOPPY_525_QD);
+}
+
+//-------------------------------------------------
+// floppy_format_type floppy_formats
+//-------------------------------------------------
+
+FLOPPY_FORMATS_MEMBER(spectrum_beta128_device::floppy_formats)
+ FLOPPY_TRD_FORMAT
+FLOPPY_FORMATS_END
+
+//-------------------------------------------------
+// ROM( beta )
+//-------------------------------------------------
+
+ROM_START(beta128)
+ ROM_REGION(0x4000, "rom", 0)
+ ROM_DEFAULT_BIOS("trd504")
+ ROM_SYSTEM_BIOS(0, "trd501", "TR-DOS v5.01")
+ ROMX_LOAD("trd501.rom", 0x0000, 0x4000, CRC(3e3cdd4c) SHA1(8303ba0cc79daa6c04cd1e6ce27e8b6886a3f0de), ROM_BIOS(0))
+ ROM_SYSTEM_BIOS(1, "trd503", "TR-DOS v5.03")
+ ROMX_LOAD("trd503.rom", 0x0000, 0x4000, CRC(10751aba) SHA1(21695e3f2a8f796386ce66eea8a246b0ac44810c), ROM_BIOS(1))
+ ROM_SYSTEM_BIOS(2, "trd504", "TR-DOS v5.04")
+ ROMX_LOAD("trd504.rom", 0x0000, 0x4000, CRC(ba310874) SHA1(05e55e37df8eee6c68601ba9cf6c92195852ce3f), ROM_BIOS(2))
+ROM_END
+
+//-------------------------------------------------
+// device_add_mconfig - add device configuration
+//-------------------------------------------------
+
+void spectrum_beta128_device::device_add_mconfig(machine_config &config)
+{
+ FD1793(config, m_fdc, 4_MHz_XTAL / 4);
+ FLOPPY_CONNECTOR(config, "fdc:0", beta_floppies, "525qd", spectrum_beta128_device::floppy_formats).enable_sound(true);
+ FLOPPY_CONNECTOR(config, "fdc:1", beta_floppies, "525qd", spectrum_beta128_device::floppy_formats).enable_sound(true);
+ FLOPPY_CONNECTOR(config, "fdc:2", beta_floppies, nullptr, spectrum_beta128_device::floppy_formats).enable_sound(true);
+ FLOPPY_CONNECTOR(config, "fdc:3", beta_floppies, nullptr, spectrum_beta128_device::floppy_formats).enable_sound(true);
+
+ // passthru
+ SPECTRUM_EXPANSION_SLOT(config, m_exp, spectrum_expansion_devices, nullptr);
+ m_exp->irq_handler().set(DEVICE_SELF_OWNER, FUNC(spectrum_expansion_slot_device::irq_w));
+ m_exp->nmi_handler().set(DEVICE_SELF_OWNER, FUNC(spectrum_expansion_slot_device::nmi_w));
+}
+
+const tiny_rom_entry *spectrum_beta128_device::device_rom_region() const
+{
+ return ROM_NAME(beta128);
+}
+
+
+//**************************************************************************
+// LIVE DEVICE
+//**************************************************************************
+
+//-------------------------------------------------
+// spectrum_beta128_device - constructor
+//-------------------------------------------------
+
+spectrum_beta128_device::spectrum_beta128_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+ : device_t(mconfig, SPECTRUM_BETA128, tag, owner, clock)
+ , device_spectrum_expansion_interface(mconfig, *this)
+ , m_rom(*this, "rom")
+ , m_fdc(*this, "fdc")
+ , m_floppy(*this, "fdc:%u", 0)
+ , m_exp(*this, "exp")
+ , m_switch(*this, "SWITCH")
+{
+}
+
+//-------------------------------------------------
+// device_start - device-specific startup
+//-------------------------------------------------
+
+void spectrum_beta128_device::device_start()
+{
+ save_item(NAME(m_romcs));
+}
+
+//-------------------------------------------------
+// device_reset - device-specific reset
+//-------------------------------------------------
+
+void spectrum_beta128_device::device_reset()
+{
+ // Page in the ROM if auto-boot is selected
+ if (m_switch->read() == 0x01)
+ m_romcs = 1;
+ else
+ m_romcs = 0;
+}
+
+//**************************************************************************
+// IMPLEMENTATION
+//**************************************************************************
+
+READ_LINE_MEMBER(spectrum_beta128_device::romcs)
+{
+ return m_romcs | m_exp->romcs();
+}
+
+
+void spectrum_beta128_device::opcode_fetch(offs_t offset)
+{
+ m_exp->opcode_fetch(offset);
+
+ if (!machine().side_effects_disabled())
+ {
+ if ((offset == 0x0066) || (offset & 0xff00) == 0x3d00)
+ m_romcs = 1;
+ else if (offset >= 0x4000)
+ m_romcs = 0;
+ }
+}
+
+uint8_t spectrum_beta128_device::iorq_r(offs_t offset)
+{
+ uint8_t data = m_exp->iorq_r(offset);
+
+ if (m_romcs)
+ {
+ switch (offset & 0xff)
+ {
+ case 0x1f: case 0x3f: case 0x5f: case 0x7f:
+ data = m_fdc->read((offset >> 5) & 0x03);
+ break;
+
+ case 0xff:
+ data &= 0x3f; // actually open bus
+ data |= m_fdc->drq_r() ? 0x40 : 0;
+ data |= m_fdc->intrq_r() ? 0x80 : 0;
+ break;
+ }
+ }
+ return data;
+}
+
+void spectrum_beta128_device::iorq_w(offs_t offset, uint8_t data)
+{
+ if (m_romcs)
+ {
+ switch (offset & 0xff)
+ {
+ case 0x1f: case 0x3f: case 0x5f: case 0x7f:
+ m_fdc->write((offset >> 5) & 0x03, data);
+ break;
+
+ case 0xff:
+ floppy_image_device* floppy = m_floppy[data & 3]->get_device();
+
+ m_fdc->set_floppy(floppy);
+ if (floppy)
+ floppy->ss_w(BIT(data, 4) ? 0 : 1);
+ m_fdc->dden_w(BIT(data, 6));
+
+ // bit 3 connected to pin 23 "HLT" of FDC and via diode to INDEX
+ //m_fdc->hlt_w(BIT(data, 3)); // not handled in current wd_fdc
+
+ if (BIT(data, 2) == 0) // reset
+ {
+ m_fdc->reset();
+ if (floppy)
+ floppy->mon_w(ASSERT_LINE);
+ }
+ else
+ {
+ // TODO: implement correct motor control, FDD motor and RDY FDC pin controlled by HLD pin of FDC
+ if (floppy)
+ floppy->mon_w(CLEAR_LINE);
+ }
+ break;
+ }
+ }
+ m_exp->iorq_w(offset, data);
+}
+
+uint8_t spectrum_beta128_device::mreq_r(offs_t offset)
+{
+ uint8_t data = 0xff;
+
+ if (m_romcs)
+ {
+ data = m_rom->base()[offset & 0x3fff];
+ }
+
+ if (m_exp->romcs())
+ data &= m_exp->mreq_r(offset);
+
+ return data;
+}
+
+void spectrum_beta128_device::mreq_w(offs_t offset, uint8_t data)
+{
+ if (m_exp->romcs())
+ m_exp->mreq_w(offset, data);
+}
+
+INPUT_CHANGED_MEMBER(spectrum_beta128_device::magic_button)
+{
+ if (newval && !oldval)
+ {
+ m_slot->nmi_w(ASSERT_LINE);
+ }
+ else
+ {
+ m_slot->nmi_w(CLEAR_LINE);
+ }
+}
diff --git a/src/devices/bus/spectrum/beta.h b/src/devices/bus/spectrum/beta.h
new file mode 100644
index 00000000000..b759201d35d
--- /dev/null
+++ b/src/devices/bus/spectrum/beta.h
@@ -0,0 +1,64 @@
+// license:BSD-3-Clause
+// copyright-holders:Nigel Barnes
+/*********************************************************************
+
+ Technology Research Beta 128 Disk interface
+
+*********************************************************************/
+#ifndef MAME_BUS_SPECTRUM_BETA_H
+#define MAME_BUS_SPECTRUM_BETA_H
+
+#include "exp.h"
+#include "softlist.h"
+#include "imagedev/floppy.h"
+#include "machine/wd_fdc.h"
+#include "formats/trd_dsk.h"
+
+//**************************************************************************
+// TYPE DEFINITIONS
+//**************************************************************************
+
+class spectrum_beta128_device :
+ public device_t,
+ public device_spectrum_expansion_interface
+
+{
+public:
+ // construction/destruction
+ spectrum_beta128_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+
+ DECLARE_FLOPPY_FORMATS(floppy_formats);
+ DECLARE_INPUT_CHANGED_MEMBER(magic_button);
+
+protected:
+ // device-level overrides
+ virtual void device_start() override;
+ virtual void device_reset() override;
+
+ // optional information overrides
+ virtual void device_add_mconfig(machine_config &config) override;
+ virtual const tiny_rom_entry *device_rom_region() const override;
+ virtual ioport_constructor device_input_ports() const override;
+
+ virtual void opcode_fetch(offs_t offset) override;
+ virtual uint8_t mreq_r(offs_t offset) override;
+ virtual void mreq_w(offs_t offset, uint8_t data) override;
+ virtual uint8_t iorq_r(offs_t offset) override;
+ virtual void iorq_w(offs_t offset, uint8_t data) override;
+ virtual DECLARE_READ_LINE_MEMBER(romcs) override;
+
+ required_memory_region m_rom;
+ required_device<fd1793_device> m_fdc;
+ required_device_array<floppy_connector, 4> m_floppy;
+ required_device<spectrum_expansion_slot_device> m_exp;
+ required_ioport m_switch;
+
+ int m_romcs;
+};
+
+
+// device type definition
+DECLARE_DEVICE_TYPE(SPECTRUM_BETA128, spectrum_beta128_device)
+
+
+#endif // MAME_BUS_SPECTRUM_BETA_H
diff --git a/src/devices/bus/spectrum/exp.cpp b/src/devices/bus/spectrum/exp.cpp
index 73e1d4a3a9a..850b9f88384 100644
--- a/src/devices/bus/spectrum/exp.cpp
+++ b/src/devices/bus/spectrum/exp.cpp
@@ -43,7 +43,6 @@ device_spectrum_expansion_interface::device_spectrum_expansion_interface(const m
spectrum_expansion_slot_device::spectrum_expansion_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) :
device_t(mconfig, SPECTRUM_EXPANSION_SLOT, tag, owner, clock),
device_slot_interface(mconfig, *this),
- m_io(nullptr),
m_card(nullptr),
m_irq_handler(*this),
m_nmi_handler(*this)
@@ -87,46 +86,57 @@ void spectrum_expansion_slot_device::device_reset()
}
//-------------------------------------------------
-// set_io_space - set address space we are attached to
+// romcs
+//-------------------------------------------------
+
+READ_LINE_MEMBER(spectrum_expansion_slot_device::romcs)
+{
+ if (m_card)
+ return m_card->romcs();
+ else
+ return 0;
+}
+
+//-------------------------------------------------
+// fetch_r
//-------------------------------------------------
-void spectrum_expansion_slot_device::set_io_space(address_space *io)
+void spectrum_expansion_slot_device::opcode_fetch(offs_t offset)
{
- m_io = io;
+ if (m_card)
+ m_card->opcode_fetch(offset);
}
//-------------------------------------------------
-// port_fe_r
+// iorq_r
//-------------------------------------------------
-READ8_MEMBER(spectrum_expansion_slot_device::port_fe_r)
+uint8_t spectrum_expansion_slot_device::iorq_r(offs_t offset)
{
if (m_card)
- return m_card->port_fe_r(space, offset);
+ return m_card->iorq_r(offset);
else
return 0xff;
}
//-------------------------------------------------
-// romcs
+// iorq_w
//-------------------------------------------------
-READ_LINE_MEMBER(spectrum_expansion_slot_device::romcs)
+void spectrum_expansion_slot_device::iorq_w(offs_t offset, uint8_t data)
{
if (m_card)
- return m_card->romcs();
- else
- return 0;
+ m_card->iorq_w(offset, data);
}
//-------------------------------------------------
// mreq_r
//-------------------------------------------------
-READ8_MEMBER(spectrum_expansion_slot_device::mreq_r)
+uint8_t spectrum_expansion_slot_device::mreq_r(offs_t offset)
{
if (m_card)
- return m_card->mreq_r(space, offset);
+ return m_card->mreq_r(offset);
else
return 0xff;
}
@@ -135,10 +145,10 @@ READ8_MEMBER(spectrum_expansion_slot_device::mreq_r)
// mreq_w
//-------------------------------------------------
-WRITE8_MEMBER(spectrum_expansion_slot_device::mreq_w)
+void spectrum_expansion_slot_device::mreq_w(offs_t offset, uint8_t data)
{
if (m_card)
- m_card->mreq_w(space, offset, data);
+ m_card->mreq_w(offset, data);
}
@@ -148,14 +158,20 @@ WRITE8_MEMBER(spectrum_expansion_slot_device::mreq_w)
// slot devices
+#include "beta.h"
+//#include "disciple.h"
#include "intf1.h"
#include "intf2.h"
#include "fuller.h"
#include "kempjoy.h"
#include "melodik.h"
+#include "mface.h"
#include "mikroplus.h"
+#include "opus.h"
#include "plus2test.h"
+//#include "plusd.h"
#include "protek.h"
+#include "specdrum.h"
#include "uslot.h"
#include "usource.h"
#include "uspeech.h"
@@ -163,13 +179,21 @@ WRITE8_MEMBER(spectrum_expansion_slot_device::mreq_w)
void spectrum_expansion_devices(device_slot_interface &device)
{
+ device.option_add("beta128", SPECTRUM_BETA128);
+ //device.option_add("disciple", SPECTRUM_DISCIPLE);
device.option_add("intf1", SPECTRUM_INTF1);
device.option_add("intf2", SPECTRUM_INTF2);
device.option_add("fuller", SPECTRUM_FULLER);
device.option_add("kempjoy", SPECTRUM_KEMPJOY);
device.option_add("melodik", SPECTRUM_MELODIK);
+ device.option_add("mface1", SPECTRUM_MFACE1);
+ device.option_add("mface128", SPECTRUM_MFACE128);
device.option_add("mikroplus", SPECTRUM_MIKROPLUS);
+ device.option_add("mprint", SPECTRUM_MPRINT);
+ device.option_add("opus", SPECTRUM_OPUS);
+ //device.option_add("plusd", SPECTRUM_PLUSD);
device.option_add("protek", SPECTRUM_PROTEK);
+ device.option_add("specdrum", SPECTRUM_SPECDRUM);
device.option_add("uslot", SPECTRUM_USLOT);
device.option_add("usource", SPECTRUM_USOURCE);
device.option_add("uspeech", SPECTRUM_USPEECH);
@@ -177,15 +201,22 @@ void spectrum_expansion_devices(device_slot_interface &device)
void spec128_expansion_devices(device_slot_interface &device)
{
+ device.option_add("beta128", SPECTRUM_BETA128);
+ //device.option_add("disciple", SPECTRUM_DISCIPLE);
device.option_add("intf1", SPECTRUM_INTF1);
device.option_add("intf2", SPECTRUM_INTF2);
device.option_add("kempjoy", SPECTRUM_KEMPJOY);
+ device.option_add("mface128", SPECTRUM_MFACE128);
device.option_add("mikroplus", SPECTRUM_MIKROPLUS);
+ device.option_add("mprint", SPECTRUM_MPRINT);
+ device.option_add("opus", SPECTRUM_OPUS);
device.option_add("plus2test", SPECTRUM_PLUS2TEST);
device.option_add("protek", SPECTRUM_PROTEK);
+ device.option_add("specdrum", SPECTRUM_SPECDRUM);
}
void specpls3_expansion_devices(device_slot_interface &device)
{
+ device.option_add("mface3", SPECTRUM_MFACE3);
}
diff --git a/src/devices/bus/spectrum/exp.h b/src/devices/bus/spectrum/exp.h
index 1d8eb5f21f2..aee398d1ab4 100644
--- a/src/devices/bus/spectrum/exp.h
+++ b/src/devices/bus/spectrum/exp.h
@@ -69,22 +69,20 @@ public:
spectrum_expansion_slot_device(machine_config const &mconfig, char const *tag, device_t *owner, uint32_t clock = 0);
- void set_io_space(address_space *io);
-
// callbacks
auto irq_handler() { return m_irq_handler.bind(); }
auto nmi_handler() { return m_nmi_handler.bind(); }
- DECLARE_READ8_MEMBER( mreq_r );
- DECLARE_WRITE8_MEMBER( mreq_w );
- DECLARE_READ8_MEMBER( port_fe_r );
+ void opcode_fetch(offs_t offset);
+ uint8_t mreq_r(offs_t offset);
+ void mreq_w(offs_t offset, uint8_t data);
+ uint8_t iorq_r(offs_t offset);
+ void iorq_w(offs_t offset, uint8_t data);
DECLARE_READ_LINE_MEMBER( romcs );
DECLARE_WRITE_LINE_MEMBER( irq_w ) { m_irq_handler(state); }
DECLARE_WRITE_LINE_MEMBER( nmi_w ) { m_nmi_handler(state); }
- address_space *m_io;
-
protected:
// device-level overrides
virtual void device_validity_check(validity_checker &valid) const override;
@@ -108,14 +106,14 @@ public:
device_spectrum_expansion_interface(const machine_config &mconfig, device_t &device);
// reading and writing
- virtual DECLARE_READ8_MEMBER(mreq_r) { return 0xff; }
- virtual DECLARE_WRITE8_MEMBER(mreq_w) { }
- virtual DECLARE_READ8_MEMBER(port_fe_r) { return 0xff; }
+ virtual void opcode_fetch(offs_t offset) { };
+ virtual uint8_t mreq_r(offs_t offset) { return 0xff; }
+ virtual void mreq_w(offs_t offset, uint8_t data) { }
+ virtual uint8_t iorq_r(offs_t offset) { return 0xff; }
+ virtual void iorq_w(offs_t offset, uint8_t data) { }
virtual DECLARE_READ_LINE_MEMBER(romcs) { return 0; }
protected:
- address_space &io_space() { return *m_slot->m_io; }
-
spectrum_expansion_slot_device *m_slot;
};
diff --git a/src/devices/bus/spectrum/fuller.cpp b/src/devices/bus/spectrum/fuller.cpp
index 36275ccc4cd..636967cbdd6 100644
--- a/src/devices/bus/spectrum/fuller.cpp
+++ b/src/devices/bus/spectrum/fuller.cpp
@@ -84,51 +84,62 @@ void spectrum_fuller_device::device_start()
}
-//-------------------------------------------------
-// device_reset - device-specific reset
-//-------------------------------------------------
-
-void spectrum_fuller_device::device_reset()
-{
- m_exp->set_io_space(&io_space());
-
- io_space().install_write_handler(0x3f, 0x3f, 0, 0xff00, 0, write8_delegate(FUNC(ay8910_device::address_w), m_psg.target()));
- io_space().install_readwrite_handler(0x5f, 0x5f, 0, 0xff00, 0, read8_delegate(FUNC(ay8910_device::data_r), m_psg.target()), write8_delegate(FUNC(ay8910_device::data_w), m_psg.target()));
- io_space().install_read_handler(0x7f, 0x7f, 0, 0xff00, 0, read8_delegate(FUNC(spectrum_fuller_device::joystick_r), this));
-}
-
-
//**************************************************************************
// IMPLEMENTATION
//**************************************************************************
-READ8_MEMBER(spectrum_fuller_device::joystick_r)
-{
- return m_joy->read() | (0xff ^ 0x8f);
-}
-
READ_LINE_MEMBER(spectrum_fuller_device::romcs)
{
return m_exp->romcs();
}
-READ8_MEMBER(spectrum_fuller_device::mreq_r)
+void spectrum_fuller_device::opcode_fetch(offs_t offset)
{
- return m_exp->mreq_r(space, offset);
+ m_exp->opcode_fetch(offset);
}
-WRITE8_MEMBER(spectrum_fuller_device::mreq_w)
+uint8_t spectrum_fuller_device::mreq_r(offs_t offset)
{
+ uint8_t data = 0xff;
+
if (m_exp->romcs())
- m_exp->mreq_w(space, offset, data);
+ data &= m_exp->mreq_r(offset);
+
+ return data;
}
-READ8_MEMBER(spectrum_fuller_device::port_fe_r)
+void spectrum_fuller_device::mreq_w(offs_t offset, uint8_t data)
{
- uint8_t data = 0xff;
-
if (m_exp->romcs())
- data &= m_exp->port_fe_r(space, offset);
+ m_exp->mreq_w(offset, data);
+}
+uint8_t spectrum_fuller_device::iorq_r(offs_t offset)
+{
+ uint8_t data = m_exp->iorq_r(offset);
+
+ switch (offset & 0xff)
+ {
+ case 0x5f:
+ data &= m_psg->data_r();
+ break;
+ case 0x7f:
+ data &= m_joy->read() | (0xff ^ 0x8f);
+ break;
+ }
return data;
}
+
+void spectrum_fuller_device::iorq_w(offs_t offset, uint8_t data)
+{
+ switch (offset & 0xff)
+ {
+ case 0x3f:
+ m_psg->address_w(data);
+ break;
+ case 0x5f:
+ m_psg->data_w(data);
+ break;
+ }
+ m_exp->iorq_w(offset, data);
+}
diff --git a/src/devices/bus/spectrum/fuller.h b/src/devices/bus/spectrum/fuller.h
index b0431121424..12f7805eff0 100644
--- a/src/devices/bus/spectrum/fuller.h
+++ b/src/devices/bus/spectrum/fuller.h
@@ -32,20 +32,19 @@ public:
protected:
// device-level overrides
virtual void device_start() override;
- virtual void device_reset() override;
// optional information overrides
virtual void device_add_mconfig(machine_config &config) override;
virtual ioport_constructor device_input_ports() const override;
- virtual DECLARE_READ8_MEMBER(mreq_r) override;
- virtual DECLARE_WRITE8_MEMBER(mreq_w) override;
- virtual DECLARE_READ8_MEMBER(port_fe_r) override;
+ virtual void opcode_fetch(offs_t offset) override;
+ virtual uint8_t mreq_r(offs_t offset) override;
+ virtual void mreq_w(offs_t offset, uint8_t data) override;
+ virtual uint8_t iorq_r(offs_t offset) override;
+ virtual void iorq_w(offs_t offset, uint8_t data) override;
virtual DECLARE_READ_LINE_MEMBER(romcs) override;
private:
- DECLARE_READ8_MEMBER(joystick_r);
-
required_device<spectrum_expansion_slot_device> m_exp;
required_device<ay8910_device> m_psg;
required_ioport m_joy;
diff --git a/src/devices/bus/spectrum/intf1.cpp b/src/devices/bus/spectrum/intf1.cpp
index d324e931e2c..344aaf61841 100644
--- a/src/devices/bus/spectrum/intf1.cpp
+++ b/src/devices/bus/spectrum/intf1.cpp
@@ -85,6 +85,7 @@ spectrum_intf1_device::spectrum_intf1_device(const machine_config &mconfig, cons
void spectrum_intf1_device::device_start()
{
+ save_item(NAME(m_romcs));
}
//-------------------------------------------------
@@ -93,8 +94,6 @@ void spectrum_intf1_device::device_start()
void spectrum_intf1_device::device_reset()
{
- m_exp->set_io_space(&io_space());
-
m_romcs = 0;
}
@@ -107,45 +106,49 @@ READ_LINE_MEMBER(spectrum_intf1_device::romcs)
return m_romcs | m_exp->romcs();
}
-READ8_MEMBER(spectrum_intf1_device::mreq_r)
+void spectrum_intf1_device::opcode_fetch(offs_t offset)
{
- uint8_t temp;
- uint8_t data = 0xff;
+ m_exp->opcode_fetch(offset);
if (!machine().side_effects_disabled())
{
- if (offset == 0x0008 || offset == 0x1708)
+ switch (offset)
+ {
+ case 0x0008: case 0x1708:
m_romcs = 1;
+ break;
+ case 0x0700:
+ m_romcs = 0;
+ break;
+ }
}
+}
- temp = m_exp->mreq_r(space, offset);
- if (m_exp->romcs())
- data &= temp;
+uint8_t spectrum_intf1_device::mreq_r(offs_t offset)
+{
+ uint8_t data = 0xff;
if (m_romcs)
data &= m_rom->base()[offset & 0x1fff];
- if (!machine().side_effects_disabled())
- {
- if (offset == 0x0700)
- m_romcs = 0;
- }
+ if (m_exp->romcs())
+ data &= m_exp->mreq_r(offset);
return data;
}
-WRITE8_MEMBER(spectrum_intf1_device::mreq_w)
+void spectrum_intf1_device::mreq_w(offs_t offset, uint8_t data)
{
if (m_exp->romcs())
- m_exp->mreq_w(space, offset, data);
+ m_exp->mreq_w(offset, data);
}
-READ8_MEMBER(spectrum_intf1_device::port_fe_r)
+uint8_t spectrum_intf1_device::iorq_r(offs_t offset)
{
- uint8_t data = 0xff;
-
- if (m_exp->romcs())
- data &= m_exp->port_fe_r(space, offset);
+ return m_exp->iorq_r(offset);
+}
- return data;
+void spectrum_intf1_device::iorq_w(offs_t offset, uint8_t data)
+{
+ m_exp->iorq_w(offset, data);
}
diff --git a/src/devices/bus/spectrum/intf1.h b/src/devices/bus/spectrum/intf1.h
index 5a21cd9927d..6b0ddb32804 100644
--- a/src/devices/bus/spectrum/intf1.h
+++ b/src/devices/bus/spectrum/intf1.h
@@ -36,9 +36,11 @@ protected:
virtual void device_add_mconfig(machine_config &config) override;
virtual const tiny_rom_entry *device_rom_region() const override;
- virtual DECLARE_READ8_MEMBER(mreq_r) override;
- virtual DECLARE_WRITE8_MEMBER(mreq_w) override;
- virtual DECLARE_READ8_MEMBER(port_fe_r) override;
+ virtual void opcode_fetch(offs_t offset) override;
+ virtual uint8_t mreq_r(offs_t offset) override;
+ virtual void mreq_w(offs_t offset, uint8_t data) override;
+ virtual uint8_t iorq_r(offs_t offset) override;
+ virtual void iorq_w(offs_t offset, uint8_t data) override;
virtual DECLARE_READ_LINE_MEMBER(romcs) override;
private:
diff --git a/src/devices/bus/spectrum/intf2.cpp b/src/devices/bus/spectrum/intf2.cpp
index 2700c2787d0..789be29717d 100644
--- a/src/devices/bus/spectrum/intf2.cpp
+++ b/src/devices/bus/spectrum/intf2.cpp
@@ -117,7 +117,7 @@ READ_LINE_MEMBER(spectrum_intf2_device::romcs)
return 0;
}
-READ8_MEMBER(spectrum_intf2_device::mreq_r)
+uint8_t spectrum_intf2_device::mreq_r(offs_t offset)
{
if (m_cart && m_cart->exists())
return m_cart->get_rom_base()[offset & 0x3fff];
@@ -125,17 +125,20 @@ READ8_MEMBER(spectrum_intf2_device::mreq_r)
return 0xff;
}
-READ8_MEMBER(spectrum_intf2_device::port_fe_r)
+uint8_t spectrum_intf2_device::iorq_r(offs_t offset)
{
uint8_t data = 0xff;
- uint8_t lines = offset >> 8;
-
- if ((lines & 8) == 0)
- data = m_exp_line3->read() | (0xff ^ 0x1f);
+ switch (offset & 0xff)
+ {
+ case 0xfe:
+ if (((offset >> 8) & 8) == 0)
+ data = m_exp_line3->read() | (0xff ^ 0x1f);
- if ((lines & 16) == 0)
- data = m_exp_line4->read() | (0xff ^ 0x1f);
+ if (((offset >> 8) & 16) == 0)
+ data = m_exp_line4->read() | (0xff ^ 0x1f);
+ break;
+ }
return data;
}
diff --git a/src/devices/bus/spectrum/intf2.h b/src/devices/bus/spectrum/intf2.h
index 826e4b8fb3e..fd131112a3c 100644
--- a/src/devices/bus/spectrum/intf2.h
+++ b/src/devices/bus/spectrum/intf2.h
@@ -35,8 +35,8 @@ protected:
virtual ioport_constructor device_input_ports() const override;
virtual DECLARE_READ_LINE_MEMBER(romcs) override;
- virtual DECLARE_READ8_MEMBER(mreq_r) override;
- virtual DECLARE_READ8_MEMBER(port_fe_r) override;
+ virtual uint8_t mreq_r(offs_t offset) override;
+ virtual uint8_t iorq_r(offs_t offset) override;
private:
image_init_result load_cart(device_image_interface &image, generic_slot_device *slot);
diff --git a/src/devices/bus/spectrum/kempjoy.cpp b/src/devices/bus/spectrum/kempjoy.cpp
index ac7d5698bd7..a433d615e8c 100644
--- a/src/devices/bus/spectrum/kempjoy.cpp
+++ b/src/devices/bus/spectrum/kempjoy.cpp
@@ -65,21 +65,17 @@ void spectrum_kempjoy_device::device_start()
}
-//-------------------------------------------------
-// device_reset - device-specific reset
-//-------------------------------------------------
-
-void spectrum_kempjoy_device::device_reset()
-{
- io_space().install_read_handler(0x1f, 0x1f, 0, 0xff00, 0, read8_delegate(FUNC(spectrum_kempjoy_device::joystick_r), this));
-}
-
-
//**************************************************************************
// IMPLEMENTATION
//**************************************************************************
-READ8_MEMBER(spectrum_kempjoy_device::joystick_r)
+uint8_t spectrum_kempjoy_device::iorq_r(offs_t offset)
{
- return m_joy->read() & 0x1f;
+ uint8_t data = 0xff;
+
+ if (offset == 0x1f)
+ {
+ data = m_joy->read() & 0x1f;
+ }
+ return data;
}
diff --git a/src/devices/bus/spectrum/kempjoy.h b/src/devices/bus/spectrum/kempjoy.h
index 555fb67643a..466dceb7517 100644
--- a/src/devices/bus/spectrum/kempjoy.h
+++ b/src/devices/bus/spectrum/kempjoy.h
@@ -31,14 +31,13 @@ public:
protected:
// device-level overrides
virtual void device_start() override;
- virtual void device_reset() override;
// optional information overrides
virtual ioport_constructor device_input_ports() const override;
-private:
- DECLARE_READ8_MEMBER(joystick_r);
+ virtual uint8_t iorq_r(offs_t offset) override;
+private:
required_ioport m_joy;
};
diff --git a/src/devices/bus/spectrum/melodik.cpp b/src/devices/bus/spectrum/melodik.cpp
index 8303d4c436c..f6abc0f98d6 100644
--- a/src/devices/bus/spectrum/melodik.cpp
+++ b/src/devices/bus/spectrum/melodik.cpp
@@ -60,18 +60,6 @@ void spectrum_melodik_device::device_start()
}
-//-------------------------------------------------
-// device_reset - device-specific reset
-//-------------------------------------------------
-
-void spectrum_melodik_device::device_reset()
-{
- m_exp->set_io_space(&io_space());
-
- io_space().install_write_handler(0x8000, 0x8000, 0, 0x3ffd, 0, write8_delegate(FUNC(ay8910_device::address_w), m_psg.target()));
- io_space().install_readwrite_handler(0xc000, 0xc000, 0, 0x3ffd, 0, read8_delegate(FUNC(ay8910_device::data_r), m_psg.target()), write8_delegate(FUNC(ay8910_device::data_w), m_psg.target()));
-}
-
//**************************************************************************
// IMPLEMENTATION
//**************************************************************************
@@ -81,23 +69,50 @@ READ_LINE_MEMBER(spectrum_melodik_device::romcs)
return m_exp->romcs();
}
-READ8_MEMBER(spectrum_melodik_device::mreq_r)
+void spectrum_melodik_device::opcode_fetch(offs_t offset)
{
- return m_exp->mreq_r(space, offset);
+ m_exp->opcode_fetch(offset);
}
-WRITE8_MEMBER(spectrum_melodik_device::mreq_w)
+uint8_t spectrum_melodik_device::mreq_r(offs_t offset)
{
+ uint8_t data = 0xff;
+
if (m_exp->romcs())
- m_exp->mreq_w(space, offset, data);
+ data &= m_exp->mreq_r(offset);
+
+ return data;
}
-READ8_MEMBER(spectrum_melodik_device::port_fe_r)
+void spectrum_melodik_device::mreq_w(offs_t offset, uint8_t data)
{
- uint8_t data = 0xff;
-
if (m_exp->romcs())
- data &= m_exp->port_fe_r(space, offset);
+ m_exp->mreq_w(offset, data);
+}
+uint8_t spectrum_melodik_device::iorq_r(offs_t offset)
+{
+ uint8_t data = m_exp->iorq_r(offset);
+
+ switch (offset & 0xc002)
+ {
+ case 0xc000:
+ data &= m_psg->data_r();
+ break;
+ }
return data;
}
+
+void spectrum_melodik_device::iorq_w(offs_t offset, uint8_t data)
+{
+ switch (offset & 0xc002)
+ {
+ case 0x8000:
+ m_psg->address_w(data);
+ break;
+ case 0xc000:
+ m_psg->data_w(data);
+ break;
+ }
+ m_exp->iorq_w(offset, data);
+}
diff --git a/src/devices/bus/spectrum/melodik.h b/src/devices/bus/spectrum/melodik.h
index 2dc3c547836..4300d946cd4 100644
--- a/src/devices/bus/spectrum/melodik.h
+++ b/src/devices/bus/spectrum/melodik.h
@@ -32,14 +32,15 @@ public:
protected:
// device-level overrides
virtual void device_start() override;
- virtual void device_reset() override;
// optional information overrides
virtual void device_add_mconfig(machine_config &config) override;
- virtual DECLARE_READ8_MEMBER(mreq_r) override;
- virtual DECLARE_WRITE8_MEMBER(mreq_w) override;
- virtual DECLARE_READ8_MEMBER(port_fe_r) override;
+ virtual void opcode_fetch(offs_t offset) override;
+ virtual uint8_t mreq_r(offs_t offset) override;
+ virtual void mreq_w(offs_t offset, uint8_t data) override;
+ virtual uint8_t iorq_r(offs_t offset) override;
+ virtual void iorq_w(offs_t offset, uint8_t data) override;
virtual DECLARE_READ_LINE_MEMBER(romcs) override;
private:
diff --git a/src/devices/bus/spectrum/mface.cpp b/src/devices/bus/spectrum/mface.cpp
new file mode 100644
index 00000000000..559dd9ae1e6
--- /dev/null
+++ b/src/devices/bus/spectrum/mface.cpp
@@ -0,0 +1,321 @@
+// license:BSD-3-Clause
+// copyright-holders:Nigel Barnes
+/*********************************************************************
+
+ Romantic Robot Multiface One/128/3
+
+*********************************************************************/
+
+#include "emu.h"
+#include "mface.h"
+
+
+/***************************************************************************
+ DEVICE DEFINITIONS
+***************************************************************************/
+
+DEFINE_DEVICE_TYPE(SPECTRUM_MFACE1, spectrum_mface1_device, "spectrum_mface1", "Multiface One")
+DEFINE_DEVICE_TYPE(SPECTRUM_MFACE128, spectrum_mface128_device, "spectrum_mface128", "Multiface 128")
+DEFINE_DEVICE_TYPE(SPECTRUM_MFACE3, spectrum_mface3_device, "spectrum_mface3", "Multiface 3")
+DEFINE_DEVICE_TYPE(SPECTRUM_MPRINT, spectrum_mprint_device, "spectrum_mprint", "MultiPrint")
+
+
+//-------------------------------------------------
+// INPUT_PORTS( mface )
+//-------------------------------------------------
+
+INPUT_PORTS_START(mface)
+ PORT_START("BUTTON")
+ PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_BUTTON1) PORT_NAME("Multiface") PORT_CODE(KEYCODE_F12) PORT_CHANGED_MEMBER(DEVICE_SELF, spectrum_mface1_device, magic_button, nullptr)
+INPUT_PORTS_END
+
+//-------------------------------------------------
+// input_ports - device-specific input ports
+//-------------------------------------------------
+
+ioport_constructor spectrum_mface1_device::device_input_ports() const
+{
+ return INPUT_PORTS_NAME(mface);
+}
+
+//-------------------------------------------------
+// ROM( mface1 )
+//-------------------------------------------------
+
+ROM_START(mface1)
+ ROM_REGION(0x2000, "rom", 0)
+ ROM_DEFAULT_BIOS("mu21e7")
+ ROM_SYSTEM_BIOS(0, "mu20fe", "MU 2.0 FE")
+ ROMX_LOAD("mf1_20_fe.rom", 0x0000, 0x2000, CRC(fa1b8b0d) SHA1(20cd508b0143166558a7238c7a9ccfbe37b90b0d), ROM_BIOS(0))
+ ROM_SYSTEM_BIOS(1, "mu2167", "MU 2.1 67")
+ ROMX_LOAD("mf1_21_67.rom", 0x0000, 0x2000, CRC(d720ec1b) SHA1(91a40d8f503ef825df3e2ed712897dbf4ca3671d), ROM_BIOS(1))
+ ROM_SYSTEM_BIOS(2, "mu21e4", "MU 2.1 E4")
+ ROMX_LOAD("mf1_21_e4.rom", 0x0000, 0x2000, CRC(4b31a971) SHA1(ba28754a3cc31a4ca579829ed4310c313409cf5d), ROM_BIOS(2))
+ ROM_SYSTEM_BIOS(3, "mu21e7", "MU 2.1 E7")
+ ROMX_LOAD("mf1_21_e7.rom", 0x0000, 0x2000, CRC(670f0ec2) SHA1(50fba2d628f3a2e9219f72980e4efd62fc9ec1f8), ROM_BIOS(3))
+ROM_END
+
+ROM_START(mface128)
+ ROM_REGION(0x2000, "rom", 0)
+ ROM_DEFAULT_BIOS("v363c")
+ ROM_SYSTEM_BIOS(0, "v363c", "87.2 V36 3C")
+ ROMX_LOAD("mf128_36_3c.rom", 0x0000, 0x2000, CRC(78ec8cfd) SHA1(8df204ab490b87c389971ce0c7fb5f9cbd281f14), ROM_BIOS(0))
+ROM_END
+
+ROM_START(mface3)
+ ROM_REGION(0x2000, "rom", 0)
+ ROM_DEFAULT_BIOS("v50fe")
+ ROM_SYSTEM_BIOS(0, "v5013", "V50 13")
+ ROMX_LOAD("mf3_50_13.rom", 0x0000, 0x2000, CRC(2d594640) SHA1(5d74d2e2e5a537639da92ff120f8a6d86f474495), ROM_BIOS(0))
+ ROM_SYSTEM_BIOS(1, "v50fe", "V50 FE")
+ ROMX_LOAD("mf3_50_fe.rom", 0x0000, 0x2000, CRC(b5c00f28) SHA1(983699a07665186f498f5827f9b35c442c2178ba), ROM_BIOS(1))
+ROM_END
+
+ROM_START(mprint)
+ ROM_REGION(0x2000, "rom", 0)
+ ROM_DEFAULT_BIOS("mpa8")
+ ROM_SYSTEM_BIOS(0, "mp5a", "MP 5A")
+ ROMX_LOAD("mprint_5a.rom", 0x0000, 0x2000, CRC(3a26e84b) SHA1(4714469bf25f69291f61188f52bfb11fbb8d0b33), ROM_BIOS(0))
+ ROM_SYSTEM_BIOS(1, "mpa8", "MP A8")
+ ROMX_LOAD("mprint_a8.rom", 0x0000, 0x2000, CRC(a5c58022) SHA1(1356bfae3264b952f83a33e25af536c0f13f50e7), ROM_BIOS(1))
+ROM_END
+
+//-------------------------------------------------
+// device_add_mconfig - add device configuration
+//-------------------------------------------------
+
+void spectrum_mface1_device::device_add_mconfig(machine_config &config)
+{
+ /* passthru */
+ SPECTRUM_EXPANSION_SLOT(config, m_exp, spectrum_expansion_devices, nullptr);
+ m_exp->irq_handler().set(DEVICE_SELF_OWNER, FUNC(spectrum_expansion_slot_device::irq_w));
+ m_exp->nmi_handler().set(DEVICE_SELF_OWNER, FUNC(spectrum_expansion_slot_device::nmi_w));
+}
+
+const tiny_rom_entry *spectrum_mface1_device::device_rom_region() const
+{
+ return ROM_NAME(mface1);
+}
+
+const tiny_rom_entry *spectrum_mface128_device::device_rom_region() const
+{
+ return ROM_NAME(mface128);
+}
+
+const tiny_rom_entry *spectrum_mface3_device::device_rom_region() const
+{
+ return ROM_NAME(mface3);
+}
+
+const tiny_rom_entry *spectrum_mprint_device::device_rom_region() const
+{
+ return ROM_NAME(mprint);
+}
+
+
+//**************************************************************************
+// LIVE DEVICE
+//**************************************************************************
+
+//-------------------------------------------------
+// spectrum_opus_device - constructor
+//-------------------------------------------------
+
+spectrum_mface1_device::spectrum_mface1_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock)
+ : device_t(mconfig, type, tag, owner, clock)
+ , device_spectrum_expansion_interface(mconfig, *this)
+ , m_rom(*this, "rom")
+ , m_exp(*this, "exp")
+{
+}
+
+spectrum_mface1_device::spectrum_mface1_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+ : spectrum_mface1_device(mconfig, SPECTRUM_MFACE1, tag, owner, clock)
+{
+}
+
+spectrum_mface128_device::spectrum_mface128_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+ : spectrum_mface1_device(mconfig, SPECTRUM_MFACE128, tag, owner, clock)
+{
+}
+
+spectrum_mface3_device::spectrum_mface3_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+ : spectrum_mface1_device(mconfig, SPECTRUM_MFACE3, tag, owner, clock)
+{
+}
+
+spectrum_mprint_device::spectrum_mprint_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+ : spectrum_mface1_device(mconfig, SPECTRUM_MPRINT, tag, owner, clock)
+{
+}
+
+//-------------------------------------------------
+// device_start - device-specific startup
+//-------------------------------------------------
+
+void spectrum_mface1_device::device_start()
+{
+ save_item(NAME(m_romcs));
+}
+
+//-------------------------------------------------
+// device_reset - device-specific reset
+//-------------------------------------------------
+
+void spectrum_mface1_device::device_reset()
+{
+ m_romcs = 0;
+}
+
+
+//**************************************************************************
+// IMPLEMENTATION
+//**************************************************************************
+
+READ_LINE_MEMBER(spectrum_mface1_device::romcs)
+{
+ return m_romcs | m_exp->romcs();
+}
+
+void spectrum_mface1_device::opcode_fetch(offs_t offset)
+{
+ m_exp->opcode_fetch(offset);
+
+ if (!machine().side_effects_disabled())
+ {
+ if (offset == 0x0066)
+ m_romcs = 1;
+ }
+}
+
+uint8_t spectrum_mface1_device::iorq_r(offs_t offset)
+{
+ uint8_t data = m_exp->iorq_r(offset);
+
+ if (!machine().side_effects_disabled())
+ {
+ switch (offset & 0xff)
+ {
+ case 0x1f:
+ m_romcs = 0;
+ break;
+ case 0x9f:
+ m_romcs = 1;
+ break;
+ }
+ }
+ return data;
+}
+
+uint8_t spectrum_mface128_device::iorq_r(offs_t offset)
+{
+ uint8_t data = m_exp->iorq_r(offset);
+
+ if (!machine().side_effects_disabled())
+ {
+ switch (offset & 0xff)
+ {
+ case 0xbf:
+ m_romcs = 1;
+ break;
+ case 0x3f:
+ m_romcs = 0;
+ break;
+ }
+ }
+ return data;
+}
+
+uint8_t spectrum_mface3_device::iorq_r(offs_t offset)
+{
+ uint8_t data = m_exp->iorq_r(offset);
+
+ if (!machine().side_effects_disabled())
+ {
+ switch (offset & 0xff)
+ {
+ case 0x3f:
+ m_romcs = 1;
+ break;
+ case 0xbf:
+ m_romcs = 0;
+ break;
+ }
+ }
+ return data;
+}
+
+uint8_t spectrum_mprint_device::iorq_r(offs_t offset)
+{
+ uint8_t data = m_exp->iorq_r(offset);
+
+ if (!machine().side_effects_disabled())
+ {
+ switch (offset & 0xff)
+ {
+ case 0xbb:
+ m_romcs = 1;
+ break;
+ case 0xbf:
+ m_romcs = 0;
+ break;
+ }
+ }
+ return data;
+}
+
+void spectrum_mface1_device::iorq_w(offs_t offset, uint8_t data)
+{
+ m_exp->iorq_w(offset, data);
+}
+
+uint8_t spectrum_mface1_device::mreq_r(offs_t offset)
+{
+ uint8_t data = 0xff;
+
+ if (m_romcs)
+ {
+ switch (offset & 0xe000)
+ {
+ case 0x0000:
+ data = m_rom->base()[offset & 0x1fff];
+ break;
+ case 0x2000:
+ data = m_ram[offset & 0x1fff];
+ break;
+ }
+ }
+
+ if (m_exp->romcs())
+ data &= m_exp->mreq_r(offset);
+
+ return data;
+}
+
+void spectrum_mface1_device::mreq_w(offs_t offset, uint8_t data)
+{
+ if (m_romcs)
+ {
+ switch (offset & 0xe000)
+ {
+ case 0x2000:
+ m_ram[offset & 0x1fff] = data;
+ break;
+ }
+ }
+
+ if (m_exp->romcs())
+ m_exp->mreq_w(offset, data);
+}
+
+INPUT_CHANGED_MEMBER(spectrum_mface1_device::magic_button)
+{
+ if (newval && !oldval)
+ {
+ m_slot->nmi_w(ASSERT_LINE);
+ }
+ else
+ {
+ m_slot->nmi_w(CLEAR_LINE);
+ }
+}
diff --git a/src/devices/bus/spectrum/mface.h b/src/devices/bus/spectrum/mface.h
new file mode 100644
index 00000000000..bbe8311808c
--- /dev/null
+++ b/src/devices/bus/spectrum/mface.h
@@ -0,0 +1,100 @@
+// license:BSD-3-Clause
+// copyright-holders:Nigel Barnes
+/*********************************************************************
+
+ Romantic Robot Multiface One/128/3
+
+*********************************************************************/
+#ifndef MAME_BUS_SPECTRUM_MFACE_H
+#define MAME_BUS_SPECTRUM_MFACE_H
+
+#include "exp.h"
+
+
+//**************************************************************************
+// TYPE DEFINITIONS
+//**************************************************************************
+
+class spectrum_mface1_device :
+ public device_t,
+ public device_spectrum_expansion_interface
+
+{
+public:
+ // construction/destruction
+ spectrum_mface1_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+
+ DECLARE_INPUT_CHANGED_MEMBER(magic_button);
+
+protected:
+ spectrum_mface1_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock);
+
+ // device-level overrides
+ virtual void device_start() override;
+ virtual void device_reset() override;
+
+ // optional information overrides
+ virtual void device_add_mconfig(machine_config &config) override;
+ virtual const tiny_rom_entry *device_rom_region() const override;
+ virtual ioport_constructor device_input_ports() const override;
+
+ virtual void opcode_fetch(offs_t offset) override;
+ virtual uint8_t mreq_r(offs_t offset) override;
+ virtual void mreq_w(offs_t offset, uint8_t data) override;
+ virtual uint8_t iorq_r(offs_t offset) override;
+ virtual void iorq_w(offs_t offset, uint8_t data) override;
+ virtual DECLARE_READ_LINE_MEMBER(romcs) override;
+
+ required_memory_region m_rom;
+ required_device<spectrum_expansion_slot_device> m_exp;
+
+ uint8_t m_ram[8 * 1024];
+ int m_romcs;
+};
+
+class spectrum_mface128_device : public spectrum_mface1_device
+{
+public:
+ spectrum_mface128_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+
+protected:
+ // optional information overrides
+ virtual const tiny_rom_entry *device_rom_region() const override;
+
+ virtual uint8_t iorq_r(offs_t offset) override;
+};
+
+class spectrum_mface3_device : public spectrum_mface1_device
+{
+public:
+ spectrum_mface3_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+
+protected:
+ // optional information overrides
+ virtual const tiny_rom_entry *device_rom_region() const override;
+
+ virtual uint8_t iorq_r(offs_t offset) override;
+};
+
+class spectrum_mprint_device : public spectrum_mface1_device
+{
+public:
+ spectrum_mprint_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+
+protected:
+ // optional information overrides
+ virtual const tiny_rom_entry *device_rom_region() const override;
+
+ virtual uint8_t iorq_r(offs_t offset) override;
+};
+
+
+// device type definition
+DECLARE_DEVICE_TYPE(SPECTRUM_MFACE1, spectrum_mface1_device)
+DECLARE_DEVICE_TYPE(SPECTRUM_MFACE128, spectrum_mface128_device)
+DECLARE_DEVICE_TYPE(SPECTRUM_MFACE3, spectrum_mface3_device)
+DECLARE_DEVICE_TYPE(SPECTRUM_MPRINT, spectrum_mprint_device)
+
+
+
+#endif // MAME_BUS_SPECTRUM_MFACE_H
diff --git a/src/devices/bus/spectrum/mikroplus.cpp b/src/devices/bus/spectrum/mikroplus.cpp
index b0f0676aaee..87552f79bf3 100644
--- a/src/devices/bus/spectrum/mikroplus.cpp
+++ b/src/devices/bus/spectrum/mikroplus.cpp
@@ -85,23 +85,19 @@ void spectrum_mikroplus_device::device_start()
}
-//-------------------------------------------------
-// device_reset - device-specific reset
-//-------------------------------------------------
-
-void spectrum_mikroplus_device::device_reset()
-{
- io_space().install_read_handler(0xdf, 0xdf, 0, 0xff00, 0, read8_delegate(FUNC(spectrum_mikroplus_device::joystick_r), this));
-}
-
-
//**************************************************************************
// IMPLEMENTATION
//**************************************************************************
-READ8_MEMBER(spectrum_mikroplus_device::joystick_r)
+uint8_t spectrum_mikroplus_device::iorq_r(offs_t offset)
{
- return m_joy->read() | (0xff ^ 0x1f);
+ uint8_t data = 0xff;
+
+ if (offset == 0xdf)
+ {
+ data = m_joy->read() | (0xff ^ 0x1f);
+ }
+ return data;
}
READ_LINE_MEMBER(spectrum_mikroplus_device::romcs)
@@ -109,7 +105,7 @@ READ_LINE_MEMBER(spectrum_mikroplus_device::romcs)
return 1;
}
-READ8_MEMBER(spectrum_mikroplus_device::mreq_r)
+uint8_t spectrum_mikroplus_device::mreq_r(offs_t offset)
{
return m_rom->base()[offset & 0x3fff];
}
diff --git a/src/devices/bus/spectrum/mikroplus.h b/src/devices/bus/spectrum/mikroplus.h
index 927cff5f56a..e06cb38bb2c 100644
--- a/src/devices/bus/spectrum/mikroplus.h
+++ b/src/devices/bus/spectrum/mikroplus.h
@@ -31,18 +31,16 @@ public:
protected:
// device-level overrides
virtual void device_start() override;
- virtual void device_reset() override;
// optional information overrides
virtual const tiny_rom_entry *device_rom_region() const override;
virtual ioport_constructor device_input_ports() const override;
virtual DECLARE_READ_LINE_MEMBER(romcs) override;
- virtual DECLARE_READ8_MEMBER(mreq_r) override;
+ virtual uint8_t mreq_r(offs_t offset) override;
+ virtual uint8_t iorq_r(offs_t offset) override;
private:
- DECLARE_READ8_MEMBER(joystick_r);
-
required_memory_region m_rom;
required_ioport m_joy;
};
diff --git a/src/devices/bus/spectrum/opus.cpp b/src/devices/bus/spectrum/opus.cpp
new file mode 100644
index 00000000000..be73ef01e92
--- /dev/null
+++ b/src/devices/bus/spectrum/opus.cpp
@@ -0,0 +1,289 @@
+// license:BSD-3-Clause
+// copyright-holders:Nigel Barnes
+/**********************************************************************
+
+ Opus Discovery disc system
+
+**********************************************************************/
+
+
+#include "emu.h"
+#include "opus.h"
+
+
+//**************************************************************************
+// DEVICE DEFINITIONS
+//**************************************************************************
+
+DEFINE_DEVICE_TYPE(SPECTRUM_OPUS, spectrum_opus_device, "spectrum_opus", "Opus Discovery")
+
+
+//-------------------------------------------------
+// INPUT_PORTS( opus )
+//-------------------------------------------------
+
+static INPUT_PORTS_START( opus )
+ PORT_START("JOY")
+ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT) PORT_8WAY
+ PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT) PORT_8WAY
+ PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN) PORT_8WAY
+ PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP) PORT_8WAY
+ PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_BUTTON1)
+INPUT_PORTS_END
+
+//-------------------------------------------------
+// input_ports - device-specific input ports
+//-------------------------------------------------
+
+ioport_constructor spectrum_opus_device::device_input_ports() const
+{
+ return INPUT_PORTS_NAME( opus );
+}
+
+//-------------------------------------------------
+// MACHINE_DRIVER( opus )
+//-------------------------------------------------
+
+FLOPPY_FORMATS_MEMBER( spectrum_opus_device::floppy_formats )
+ FLOPPY_OPD_FORMAT
+FLOPPY_FORMATS_END
+
+static void spectrum_floppies(device_slot_interface &device)
+{
+ device.option_add("35ssdd", FLOPPY_35_SSDD);
+ device.option_add("35dd", FLOPPY_35_DD);
+}
+
+ROM_START(opus)
+ ROM_REGION(0x2000, "rom", 0)
+ ROM_DEFAULT_BIOS("opus22")
+ ROM_SYSTEM_BIOS(0, "opus22", "Opus v2.2")
+ ROMX_LOAD("opus-22.rom", 0x0000, 0x2000, CRC(50f0eae0) SHA1(0eee1c503f71709fce8b7560dadc2d07d15edb80), ROM_BIOS(0))
+ ROM_SYSTEM_BIOS(1, "opus21", "Opus v2.1")
+ ROMX_LOAD("opus-21.rom", 0x0000, 0x2000, CRC(619973f9) SHA1(31999a68901392bba907cf5a15e264b6759f1a29), ROM_BIOS(1))
+ ROM_SYSTEM_BIOS(2, "opus222", "Opus v2.22")
+ ROMX_LOAD("opus-222.rom", 0x0000, 0x2000, CRC(08ce9949) SHA1(71f1c8a8b923f7751d1ff48d30b8e18a15b92591), ROM_BIOS(2))
+ ROM_SYSTEM_BIOS(3, "quickdos", "QuickDOS v2.31") // MegaSoft
+ ROMX_LOAD("quickdos-231.rom", 0x0000, 0x2000, CRC(d042b32a) SHA1(2975f7eb61d44e898cdd6e3196893e95637f17ff), ROM_BIOS(3))
+ ROM_SYSTEM_BIOS(4, "excom", "EXCOM v2.28") // Paul Cheffings
+ ROMX_LOAD("excom-228.rom", 0x0000, 0x2000, CRC(29257418) SHA1(098a812c4707251f647553a2abc1436afa38f43c), ROM_BIOS(4))
+ROM_END
+
+
+//-------------------------------------------------
+// device_add_mconfig - add device configuration
+//-------------------------------------------------
+
+void spectrum_opus_device::device_add_mconfig(machine_config &config)
+{
+ WD1770(config, m_fdc, 16_MHz_XTAL / 2);
+ m_fdc->drq_wr_callback().set(DEVICE_SELF_OWNER, FUNC(spectrum_expansion_slot_device::nmi_w));
+
+ FLOPPY_CONNECTOR(config, "fdc:0", spectrum_floppies, "35dd", spectrum_opus_device::floppy_formats).enable_sound(true);
+ FLOPPY_CONNECTOR(config, "fdc:1", spectrum_floppies, "35dd", spectrum_opus_device::floppy_formats).enable_sound(true);
+
+ /* parallel printer port */
+ CENTRONICS(config, m_centronics, centronics_devices, "printer");
+ m_centronics->ack_handler().set(m_pia, FUNC(pia6821_device::ca2_w));
+ m_centronics->busy_handler().set(FUNC(spectrum_opus_device::busy_w));
+
+ /* pia */
+ PIA6821(config, m_pia, 0);
+ m_pia->writepa_handler().set(FUNC(spectrum_opus_device::pia_out_a));
+ m_pia->writepb_handler().set(FUNC(spectrum_opus_device::pia_out_b));
+ m_pia->cb2_handler().set("centronics", FUNC(centronics_device::write_strobe));
+
+ /* software list */
+ SOFTWARE_LIST(config, "flop_list").set_original("spectrum_flop_opus");
+
+ /* passthru without NMI */
+ SPECTRUM_EXPANSION_SLOT(config, m_exp, spectrum_expansion_devices, nullptr);
+ m_exp->irq_handler().set(DEVICE_SELF_OWNER, FUNC(spectrum_expansion_slot_device::irq_w));
+}
+
+const tiny_rom_entry *spectrum_opus_device::device_rom_region() const
+{
+ return ROM_NAME( opus );
+}
+
+
+//**************************************************************************
+// LIVE DEVICE
+//**************************************************************************
+
+//-------------------------------------------------
+// spectrum_opus_device - constructor
+//-------------------------------------------------
+
+spectrum_opus_device::spectrum_opus_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+ : device_t(mconfig, SPECTRUM_OPUS, tag, owner, clock)
+ , device_spectrum_expansion_interface(mconfig, *this)
+ , m_joy(*this, "JOY")
+ , m_rom(*this, "rom")
+ , m_pia(*this, "pia")
+ , m_fdc(*this, "fdc")
+ , m_floppy0(*this, "fdc:0")
+ , m_floppy1(*this, "fdc:1")
+ , m_centronics(*this, "centronics")
+ , m_exp(*this, "exp")
+{
+}
+
+//-------------------------------------------------
+// device_start - device-specific startup
+//-------------------------------------------------
+
+void spectrum_opus_device::device_start()
+{
+ memset(m_ram, 0, sizeof(m_ram));
+
+ save_item(NAME(m_romcs));
+ save_item(NAME(m_ram));
+ save_item(NAME(m_last_pc));
+}
+
+//-------------------------------------------------
+// device_reset - device-specific reset
+//-------------------------------------------------
+
+void spectrum_opus_device::device_reset()
+{
+ m_romcs = 0;
+ m_last_pc = 0x0000;
+}
+
+
+//**************************************************************************
+// IMPLEMENTATION
+//**************************************************************************
+
+READ_LINE_MEMBER(spectrum_opus_device::romcs)
+{
+ return m_romcs | m_exp->romcs();
+}
+
+void spectrum_opus_device::opcode_fetch(offs_t offset)
+{
+ m_exp->opcode_fetch(offset);
+
+ if (!machine().side_effects_disabled())
+ {
+ switch (m_last_pc)
+ {
+ case 0x0008: case 0x0048: case 0x1708:
+ m_romcs = 1;
+ break;
+ case 0x1748:
+ m_romcs = 0;
+ break;
+ }
+ }
+ m_last_pc = offset;
+}
+
+uint8_t spectrum_opus_device::iorq_r(offs_t offset)
+{
+ uint8_t data = m_exp->iorq_r(offset);
+
+ // PIA bit 7 is enable joystick and selected on A5 only
+ if (!BIT(m_pia->a_output(), 7) && (~offset & 0x20))
+ {
+ data &= m_joy->read() & 0x1f;
+ }
+ return data;
+}
+
+void spectrum_opus_device::iorq_w(offs_t offset, uint8_t data)
+{
+ m_exp->iorq_w(offset, data);
+}
+
+uint8_t spectrum_opus_device::mreq_r(offs_t offset)
+{
+ uint8_t data = 0xff;
+
+ if (m_romcs)
+ {
+ switch (offset & 0xf800)
+ {
+ case 0x0000: case 0x0800: case 0x1000: case 0x1800:
+ data = m_rom->base()[offset & 0x1fff];
+ break;
+ case 0x2000:
+ data = m_ram[offset & 0x7ff];
+ break;
+ case 0x2800:
+ data = m_fdc->read(offset & 0x03);
+ break;
+ case 0x3000:
+ data = m_pia->read(offset & 0x03);
+ break;
+ case 0x3800: // Extra 2K described in QuickDOS manual - not used
+ data = m_ram[offset & 0xfff];
+ break;
+ }
+ }
+
+ if (m_exp->romcs())
+ data &= m_exp->mreq_r(offset);
+
+ return data;
+}
+
+void spectrum_opus_device::mreq_w(offs_t offset, uint8_t data)
+{
+ if (m_romcs)
+ {
+ switch (offset & 0xf800)
+ {
+ case 0x2000:
+ m_ram[offset & 0x7ff] = data;
+ break;
+ case 0x2800:
+ m_fdc->write(offset & 0x03, data);
+ break;
+ case 0x3000:
+ m_pia->write(offset & 0x03, data);
+ break;
+ case 0x3800: // Extra 2K described in QuickDOS manual - not used
+ m_ram[offset & 0xfff] = data;
+ break;
+ }
+ }
+
+ if (m_exp->romcs())
+ m_exp->mreq_w(offset, data);
+}
+
+WRITE8_MEMBER(spectrum_opus_device::pia_out_a)
+{
+ floppy_image_device *floppy = nullptr;
+
+ // bit 0, 1: drive select
+ if (!BIT(data, 0)) floppy = m_floppy1->get_device();
+ if (!BIT(data, 1)) floppy = m_floppy0->get_device();
+ m_fdc->set_floppy(floppy);
+
+ // bit 4: side select
+ if (floppy)
+ floppy->ss_w(BIT(data, 4));
+
+ // bit 5: density
+ m_fdc->dden_w(BIT(data, 5));
+}
+
+WRITE8_MEMBER(spectrum_opus_device::pia_out_b)
+{
+ m_centronics->write_data1(BIT(data, 1));
+ m_centronics->write_data2(BIT(data, 2));
+ m_centronics->write_data3(BIT(data, 3));
+ m_centronics->write_data4(BIT(data, 4));
+ m_centronics->write_data5(BIT(data, 5));
+ m_centronics->write_data6(BIT(data, 6));
+ m_centronics->write_data7(BIT(data, 7));
+}
+
+WRITE_LINE_MEMBER(spectrum_opus_device::busy_w)
+{
+ m_pia->set_a_input(state << 6, 0xbf);
+}
diff --git a/src/devices/bus/spectrum/opus.h b/src/devices/bus/spectrum/opus.h
new file mode 100644
index 00000000000..8d72d8be94b
--- /dev/null
+++ b/src/devices/bus/spectrum/opus.h
@@ -0,0 +1,75 @@
+// license:BSD-3-Clause
+// copyright-holders:Nigel Barnes
+/**********************************************************************
+
+ Opus Discovery disc system
+
+**********************************************************************/
+
+#ifndef MAME_BUS_SPECTRUM_OPUS_H
+#define MAME_BUS_SPECTRUM_OPUS_H
+
+#include "exp.h"
+#include "softlist.h"
+#include "imagedev/floppy.h"
+#include "machine/wd_fdc.h"
+#include "machine/6821pia.h"
+#include "bus/centronics/ctronics.h"
+#include "formats/opd_dsk.h"
+
+//**************************************************************************
+// TYPE DEFINITIONS
+//**************************************************************************
+
+class spectrum_opus_device:
+ public device_t,
+ public device_spectrum_expansion_interface
+
+{
+public:
+ // construction/destruction
+ spectrum_opus_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+
+ DECLARE_FLOPPY_FORMATS(floppy_formats);
+
+protected:
+ // device-level overrides
+ virtual void device_start() override;
+ virtual void device_reset() override;
+
+ // optional information overrides
+ virtual void device_add_mconfig(machine_config &config) override;
+ virtual ioport_constructor device_input_ports() const override;
+ virtual const tiny_rom_entry *device_rom_region() const override;
+
+ virtual void opcode_fetch(offs_t offset) override;
+ virtual uint8_t mreq_r(offs_t offset) override;
+ virtual void mreq_w(offs_t offset, uint8_t data) override;
+ virtual uint8_t iorq_r(offs_t offset) override;
+ virtual void iorq_w(offs_t offset, uint8_t data) override;
+ virtual DECLARE_READ_LINE_MEMBER(romcs) override;
+
+private:
+ DECLARE_WRITE8_MEMBER(pia_out_a);
+ DECLARE_WRITE8_MEMBER(pia_out_b);
+ DECLARE_WRITE_LINE_MEMBER(busy_w);
+
+ required_ioport m_joy;
+ required_memory_region m_rom;
+ required_device<pia6821_device> m_pia;
+ required_device<wd_fdc_device_base> m_fdc;
+ required_device<floppy_connector> m_floppy0;
+ required_device<floppy_connector> m_floppy1;
+ required_device<centronics_device> m_centronics;
+ required_device<spectrum_expansion_slot_device> m_exp;
+
+ int m_romcs;
+ uint8_t m_ram[4 * 1024];
+ offs_t m_last_pc;
+};
+
+
+// device type definition
+DECLARE_DEVICE_TYPE(SPECTRUM_OPUS, spectrum_opus_device)
+
+#endif // MAME_BUS_SPECTRUM_OPUS_H
diff --git a/src/devices/bus/spectrum/plus2test.cpp b/src/devices/bus/spectrum/plus2test.cpp
index a734a76f775..3d90ed4dee3 100644
--- a/src/devices/bus/spectrum/plus2test.cpp
+++ b/src/devices/bus/spectrum/plus2test.cpp
@@ -68,7 +68,7 @@ READ_LINE_MEMBER(spectrum_plus2test_device::romcs)
return 1;
}
-READ8_MEMBER(spectrum_plus2test_device::mreq_r)
+uint8_t spectrum_plus2test_device::mreq_r(offs_t offset)
{
return m_rom->base()[offset & 0x3fff];
}
diff --git a/src/devices/bus/spectrum/plus2test.h b/src/devices/bus/spectrum/plus2test.h
index 234e82a95f0..f8caad2fa26 100644
--- a/src/devices/bus/spectrum/plus2test.h
+++ b/src/devices/bus/spectrum/plus2test.h
@@ -36,7 +36,7 @@ protected:
virtual const tiny_rom_entry *device_rom_region() const override;
virtual DECLARE_READ_LINE_MEMBER(romcs) override;
- virtual DECLARE_READ8_MEMBER(mreq_r) override;
+ virtual uint8_t mreq_r(offs_t offset) override;
private:
required_memory_region m_rom;
diff --git a/src/devices/bus/spectrum/protek.cpp b/src/devices/bus/spectrum/protek.cpp
index a3f3a1838f8..d1e122d8dbb 100644
--- a/src/devices/bus/spectrum/protek.cpp
+++ b/src/devices/bus/spectrum/protek.cpp
@@ -72,17 +72,20 @@ void spectrum_protek_device::device_start()
// IMPLEMENTATION
//**************************************************************************
-READ8_MEMBER(spectrum_protek_device::port_fe_r)
+uint8_t spectrum_protek_device::iorq_r(offs_t offset)
{
uint8_t data = 0xff;
- uint8_t lines = offset >> 8;
+ switch (offset & 0xff)
+ {
+ case 0xfe:
+ if (((offset >> 8) & 8) == 0)
+ data = m_exp_line3->read() | (0xff ^ 0x10);
- if ((lines & 8) == 0)
- data = m_exp_line3->read() | (0xff ^ 0x10);
-
- if ((lines & 16) == 0)
- data = m_exp_line4->read() | (0xff ^ 0x1d);
+ if (((offset >> 8) & 16) == 0)
+ data = m_exp_line4->read() | (0xff ^ 0x1d);
+ break;
+ }
return data;
}
diff --git a/src/devices/bus/spectrum/protek.h b/src/devices/bus/spectrum/protek.h
index 503a041a0d3..9edd5a82f29 100644
--- a/src/devices/bus/spectrum/protek.h
+++ b/src/devices/bus/spectrum/protek.h
@@ -35,7 +35,7 @@ protected:
// optional information overrides
virtual ioport_constructor device_input_ports() const override;
- virtual DECLARE_READ8_MEMBER(port_fe_r) override;
+ virtual uint8_t iorq_r(offs_t offset) override;
private:
required_ioport m_exp_line3;
diff --git a/src/devices/bus/spectrum/specdrum.cpp b/src/devices/bus/spectrum/specdrum.cpp
new file mode 100644
index 00000000000..9c809a1b36a
--- /dev/null
+++ b/src/devices/bus/spectrum/specdrum.cpp
@@ -0,0 +1,73 @@
+// license:BSD-3-Clause
+// copyright-holders:Nigel Barnes
+/**********************************************************************
+
+ Cheetah Marketing SpecDrum emulation
+
+**********************************************************************/
+
+#include "emu.h"
+#include "specdrum.h"
+#include "sound/volt_reg.h"
+#include "speaker.h"
+
+
+//**************************************************************************
+// DEVICE DEFINITIONS
+//**************************************************************************
+
+DEFINE_DEVICE_TYPE(SPECTRUM_SPECDRUM, spectrum_specdrum_device, "spectrum_specdrum", "SpecDrum")
+
+
+//-------------------------------------------------
+// device_add_mconfig - add device configuration
+//-------------------------------------------------
+
+void spectrum_specdrum_device::device_add_mconfig(machine_config &config)
+{
+ SPEAKER(config, "speaker").front_center();
+ ZN428E(config, m_dac, 0).add_route(ALL_OUTPUTS, "speaker", 0.5);
+ voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref"));
+ vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT);
+ vref.add_route(0, "dac", -1.0, DAC_VREF_NEG_INPUT);
+}
+
+
+//**************************************************************************
+// LIVE DEVICE
+//**************************************************************************
+
+//-------------------------------------------------
+// spectrum_specdrum_device - constructor
+//-------------------------------------------------
+
+spectrum_specdrum_device::spectrum_specdrum_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+ : device_t(mconfig, SPECTRUM_SPECDRUM, tag, owner, clock)
+ , device_spectrum_expansion_interface(mconfig, *this)
+ , m_dac(*this, "dac")
+{
+}
+
+
+//-------------------------------------------------
+// device_start - device-specific startup
+//-------------------------------------------------
+
+void spectrum_specdrum_device::device_start()
+{
+}
+
+
+//**************************************************************************
+// IMPLEMENTATION
+//**************************************************************************
+
+void spectrum_specdrum_device::iorq_w(offs_t offset, uint8_t data)
+{
+ switch (offset & 0x00ff)
+ {
+ case 0xdf:
+ m_dac->write(data);
+ break;
+ }
+}
diff --git a/src/devices/bus/spectrum/specdrum.h b/src/devices/bus/spectrum/specdrum.h
new file mode 100644
index 00000000000..7412a8509c0
--- /dev/null
+++ b/src/devices/bus/spectrum/specdrum.h
@@ -0,0 +1,51 @@
+// license:BSD-3-Clause
+// copyright-holders:Nigel Barnes
+/**********************************************************************
+
+ Cheetah Marketing SpecDrum emulation
+
+**********************************************************************/
+
+#ifndef MAME_BUS_SPECTRUM_SPECDRUM_H
+#define MAME_BUS_SPECTRUM_SPECDRUM_H
+
+#pragma once
+
+
+#include "exp.h"
+#include "sound/dac.h"
+
+
+//**************************************************************************
+// TYPE DEFINITIONS
+//**************************************************************************
+
+// ======================> spectrum_specdrum_device
+
+class spectrum_specdrum_device :
+ public device_t,
+ public device_spectrum_expansion_interface
+{
+public:
+ // construction/destruction
+ spectrum_specdrum_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+
+protected:
+ // device-level overrides
+ virtual void device_start() override;
+
+ // optional information overrides
+ virtual void device_add_mconfig(machine_config &config) override;
+
+ virtual void iorq_w(offs_t offset, uint8_t data) override;
+
+private:
+ required_device<dac_byte_interface> m_dac;
+};
+
+
+// device type definition
+DECLARE_DEVICE_TYPE(SPECTRUM_SPECDRUM, spectrum_specdrum_device)
+
+
+#endif // MAME_BUS_SPECTRUM_SPECDRUM_H
diff --git a/src/devices/bus/spectrum/uslot.cpp b/src/devices/bus/spectrum/uslot.cpp
index d2d75d6a72c..d27f1ec572d 100644
--- a/src/devices/bus/spectrum/uslot.cpp
+++ b/src/devices/bus/spectrum/uslot.cpp
@@ -64,8 +64,6 @@ void spectrum_uslot_device::device_start()
void spectrum_uslot_device::device_reset()
{
- m_exp1->set_io_space(&io_space());
- m_exp2->set_io_space(&io_space());
}
@@ -78,41 +76,41 @@ READ_LINE_MEMBER(spectrum_uslot_device::romcs)
return m_exp1->romcs() | m_exp2->romcs();
}
+void spectrum_uslot_device::opcode_fetch(offs_t offset)
+{
+ m_exp1->opcode_fetch(offset);
+ m_exp2->opcode_fetch(offset);
+}
-READ8_MEMBER(spectrum_uslot_device::mreq_r)
+uint8_t spectrum_uslot_device::mreq_r(offs_t offset)
{
- uint8_t temp;
uint8_t data = 0xff;
- temp = m_exp1->mreq_r(space, offset);
if (m_exp1->romcs())
- data &= temp;
+ data &= m_exp1->mreq_r(offset);
- temp = m_exp2->mreq_r(space, offset);
if (m_exp2->romcs())
- data &= temp;
+ data &= m_exp2->mreq_r(offset);
return data;
}
-WRITE8_MEMBER(spectrum_uslot_device::mreq_w)
+void spectrum_uslot_device::mreq_w(offs_t offset, uint8_t data)
{
if (m_exp1->romcs())
- m_exp1->mreq_w(space, offset, data);
+ m_exp1->mreq_w(offset, data);
if (m_exp2->romcs())
- m_exp2->mreq_w(space, offset, data);
+ m_exp2->mreq_w(offset, data);
}
-READ8_MEMBER(spectrum_uslot_device::port_fe_r)
+uint8_t spectrum_uslot_device::iorq_r(offs_t offset)
{
- uint8_t data = 0xff;
-
- if (m_exp1->romcs())
- data &= m_exp1->port_fe_r(space, offset);
-
- if (m_exp2->romcs())
- data &= m_exp2->port_fe_r(space, offset);
+ return m_exp1->iorq_r(offset) & m_exp2->iorq_r(offset);
+}
- return data;
+void spectrum_uslot_device::iorq_w(offs_t offset, uint8_t data)
+{
+ m_exp1->iorq_w(offset, data);
+ m_exp2->iorq_w(offset, data);
}
diff --git a/src/devices/bus/spectrum/uslot.h b/src/devices/bus/spectrum/uslot.h
index 536f7c75bc4..6cfa90c45e9 100644
--- a/src/devices/bus/spectrum/uslot.h
+++ b/src/devices/bus/spectrum/uslot.h
@@ -36,9 +36,11 @@ protected:
// optional information overrides
virtual void device_add_mconfig(machine_config &config) override;
- virtual DECLARE_READ8_MEMBER(mreq_r) override;
- virtual DECLARE_WRITE8_MEMBER(mreq_w) override;
- virtual DECLARE_READ8_MEMBER(port_fe_r) override;
+ virtual void opcode_fetch(offs_t offset) override;
+ virtual uint8_t mreq_r(offs_t offset) override;
+ virtual void mreq_w(offs_t offset, uint8_t data) override;
+ virtual uint8_t iorq_r(offs_t offset) override;
+ virtual void iorq_w(offs_t offset, uint8_t data) override;
virtual DECLARE_READ_LINE_MEMBER(romcs) override;
private:
diff --git a/src/devices/bus/spectrum/usource.cpp b/src/devices/bus/spectrum/usource.cpp
index b4fb9c5797a..13f302b14c5 100644
--- a/src/devices/bus/spectrum/usource.cpp
+++ b/src/devices/bus/spectrum/usource.cpp
@@ -60,6 +60,7 @@ spectrum_usource_device::spectrum_usource_device(const machine_config &mconfig,
void spectrum_usource_device::device_start()
{
+ save_item(NAME(m_romcs));
}
@@ -82,17 +83,15 @@ READ_LINE_MEMBER(spectrum_usource_device::romcs)
return m_romcs;
}
-
-READ8_MEMBER(spectrum_usource_device::mreq_r)
+void spectrum_usource_device::opcode_fetch(offs_t offset)
{
- uint8_t data;
-
if (!machine().side_effects_disabled() && (offset == 0x2bae))
{
m_romcs = !m_romcs;
}
+}
- data = m_rom->base()[offset & 0x1fff];
-
- return data;
+uint8_t spectrum_usource_device::mreq_r(offs_t offset)
+{
+ return m_rom->base()[offset & 0x1fff];
}
diff --git a/src/devices/bus/spectrum/usource.h b/src/devices/bus/spectrum/usource.h
index 607cf0737a6..daf792f076f 100644
--- a/src/devices/bus/spectrum/usource.h
+++ b/src/devices/bus/spectrum/usource.h
@@ -38,8 +38,9 @@ protected:
// optional information overrides
virtual const tiny_rom_entry *device_rom_region() const override;
+ virtual void opcode_fetch(offs_t offset) override;
virtual DECLARE_READ_LINE_MEMBER(romcs) override;
- virtual DECLARE_READ8_MEMBER(mreq_r) override;
+ virtual uint8_t mreq_r(offs_t offset) override;
private:
required_memory_region m_rom;
diff --git a/src/devices/bus/spectrum/uspeech.cpp b/src/devices/bus/spectrum/uspeech.cpp
index 87f66ca0182..60374fd3c2c 100644
--- a/src/devices/bus/spectrum/uspeech.cpp
+++ b/src/devices/bus/spectrum/uspeech.cpp
@@ -76,6 +76,7 @@ spectrum_uspeech_device::spectrum_uspeech_device(const machine_config &mconfig,
void spectrum_uspeech_device::device_start()
{
+ save_item(NAME(m_romcs));
}
@@ -98,46 +99,59 @@ READ_LINE_MEMBER(spectrum_uspeech_device::romcs)
return m_romcs;
}
-
-READ8_MEMBER(spectrum_uspeech_device::mreq_r)
+void spectrum_uspeech_device::opcode_fetch(offs_t offset)
{
- uint8_t data;
+ if (!machine().side_effects_disabled() && (offset == 0x0038))
+ {
+ m_romcs = !m_romcs;
+ }
+}
- if (!machine().side_effects_disabled() && (offset == 0x38))
+uint8_t spectrum_uspeech_device::iorq_r(offs_t offset)
+{
+ if (!machine().side_effects_disabled() && (offset == 0x0038))
{
m_romcs = !m_romcs;
}
- switch (offset)
+ return 0xff;
+}
+
+uint8_t spectrum_uspeech_device::mreq_r(offs_t offset)
+{
+ uint8_t data = 0xff;
+
+ switch (offset & 0xf000)
{
- case 0x1000:
- data = !m_nsp->lrq_r(); // (m_nsp->lrq_r() && (m_nsp->sby_r() != 0)) ? 0x00 : 0x01;
- break;
- default:
+ case 0x0000:
data = m_rom->base()[offset & 0x7ff];
break;
+ case 0x1000:
+ data = !m_nsp->lrq_r();
+ break;
}
return data;
}
-WRITE8_MEMBER(spectrum_uspeech_device::mreq_w)
+void spectrum_uspeech_device::mreq_w(offs_t offset, uint8_t data)
{
- switch (offset)
+ switch (offset & 0xf001)
{
case 0x1000:
+ case 0x1001:
// allophone
m_nsp->ald_w(data & 0x3f);
break;
case 0x3000:
// intonation low
- m_nsp->set_clock(3500000); // CK / 4 ??
+ m_nsp->set_clock(3050000); // oscillator frequency read from hardware
break;
case 0x3001:
// intonation high
- m_nsp->set_clock(3800000); // TODO: the exact frequency is unknown
+ m_nsp->set_clock(3260000); // oscillator frequency read from hardware
break;
}
}
diff --git a/src/devices/bus/spectrum/uspeech.h b/src/devices/bus/spectrum/uspeech.h
index b3209f80331..8013abf9222 100644
--- a/src/devices/bus/spectrum/uspeech.h
+++ b/src/devices/bus/spectrum/uspeech.h
@@ -40,9 +40,11 @@ protected:
virtual const tiny_rom_entry *device_rom_region() const override;
virtual void device_add_mconfig(machine_config &config) override;
+ virtual void opcode_fetch(offs_t offset) override;
virtual DECLARE_READ_LINE_MEMBER(romcs) override;
- virtual DECLARE_READ8_MEMBER(mreq_r) override;
- virtual DECLARE_WRITE8_MEMBER(mreq_w) override;
+ virtual uint8_t mreq_r(offs_t offset) override;
+ virtual void mreq_w(offs_t offset, uint8_t data) override;
+ virtual uint8_t iorq_r(offs_t offset) override;
private:
required_device<sp0256_device> m_nsp;
diff --git a/src/devices/bus/ss50/interface.cpp b/src/devices/bus/ss50/interface.cpp
index b17f54f9c68..a811c790ef9 100644
--- a/src/devices/bus/ss50/interface.cpp
+++ b/src/devices/bus/ss50/interface.cpp
@@ -139,22 +139,22 @@ void ss50_interface_port_device::device_start()
// read - interface read access (pre-decoded)
//-------------------------------------------------
-READ8_MEMBER(ss50_interface_port_device::read)
+u8 ss50_interface_port_device::read(offs_t offset)
{
if (m_card == nullptr)
{
logerror("%s: Read from unspecified interface (RS = %X)\n", machine().describe_context(), offset);
- return space.unmap();
+ return 0xff;
}
- return m_card->register_read(space, offset);
+ return m_card->register_read(offset);
}
//-------------------------------------------------
// write - interface write access (pre-decoded)
//-------------------------------------------------
-WRITE8_MEMBER(ss50_interface_port_device::write)
+void ss50_interface_port_device::write(offs_t offset, u8 data)
{
if (m_card == nullptr)
{
@@ -162,7 +162,7 @@ WRITE8_MEMBER(ss50_interface_port_device::write)
return;
}
- m_card->register_write(space, offset, data);
+ m_card->register_write(offset, data);
}
//-------------------------------------------------
diff --git a/src/devices/bus/ss50/interface.h b/src/devices/bus/ss50/interface.h
index 1865eda6324..0be5f422c98 100644
--- a/src/devices/bus/ss50/interface.h
+++ b/src/devices/bus/ss50/interface.h
@@ -11,19 +11,6 @@
#ifndef MAME_DEVICES_BUS_SS50_INTERFACE_H
#define MAME_DEVICES_BUS_SS50_INTERFACE_H
-//**************************************************************************
-// CONFIGURATION MACROS
-//**************************************************************************
-
-#define MCFG_SS50_INTERFACE_PORT_ADD(_tag, _slot_intf, _def_slot) \
- MCFG_DEVICE_ADD(_tag, SS50_INTERFACE, 0) \
- MCFG_DEVICE_SLOT_INTERFACE(ss50_##_slot_intf, _def_slot, false)
-
-#define MCFG_SS50_INTERFACE_IRQ_CALLBACK(_devcb) \
- downcast<ss50_interface_port_device &>(*device).set_irq_cb(DEVCB_##_devcb);
-
-#define MCFG_SS50_INTERFACE_FIRQ_CALLBACK(_devcb) \
- downcast<ss50_interface_port_device &>(*device).set_firq_cb(DEVCB_##_devcb);
//**************************************************************************
// TYPE DEFINITIONS
@@ -40,15 +27,25 @@ class ss50_interface_port_device : public device_t, public device_slot_interface
public:
// construction/destruction
- ss50_interface_port_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
+ template <typename T>
+ ss50_interface_port_device(machine_config const &mconfig, char const *tag, device_t *owner, T &&opts, char const *dflt)
+ : ss50_interface_port_device(mconfig, tag, owner, 0)
+ {
+ option_reset();
+ opts(*this);
+ set_default_option(dflt);
+ set_fixed(false);
+ }
+
+ ss50_interface_port_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock = 0);
// static configuration
- template<class Object> devcb_base &set_irq_cb(Object &&object) { return m_irq_cb.set_callback(std::forward<Object>(object)); }
- template<class Object> devcb_base &set_firq_cb(Object &&object) { return m_firq_cb.set_callback(std::forward<Object>(object)); }
+ auto irq_cb() { return m_irq_cb.bind(); }
+ auto firq_cb() { return m_firq_cb.bind(); }
// memory accesses
- DECLARE_READ8_MEMBER(read);
- DECLARE_WRITE8_MEMBER(write);
+ u8 read(offs_t offset);
+ void write(offs_t offset, u8 data);
// baud rates
DECLARE_WRITE_LINE_MEMBER(f110_w);
@@ -82,8 +79,8 @@ protected:
ss50_card_interface(const machine_config &mconfig, device_t &device);
// required overrides
- virtual DECLARE_READ8_MEMBER(register_read) = 0;
- virtual DECLARE_WRITE8_MEMBER(register_write) = 0;
+ virtual u8 register_read(offs_t offset) = 0;
+ virtual void register_write(offs_t offset, u8 data) = 0;
// optional overrides
virtual DECLARE_WRITE_LINE_MEMBER(f110_w) { }
diff --git a/src/devices/bus/ss50/mpc.cpp b/src/devices/bus/ss50/mpc.cpp
index eeff1928e92..ba05d80e8e3 100644
--- a/src/devices/bus/ss50/mpc.cpp
+++ b/src/devices/bus/ss50/mpc.cpp
@@ -42,8 +42,8 @@ protected:
virtual void device_start() override;
// interface-specific overrides
- virtual DECLARE_READ8_MEMBER(register_read) override;
- virtual DECLARE_WRITE8_MEMBER(register_write) override;
+ virtual u8 register_read(offs_t offset) override;
+ virtual void register_write(offs_t offset, u8 data) override;
virtual DECLARE_WRITE_LINE_MEMBER(f110_w) override;
virtual DECLARE_WRITE_LINE_MEMBER(f300_w) override;
@@ -100,7 +100,8 @@ DEVICE_INPUT_DEFAULTS_END
// machine configuration
//-------------------------------------------------
-MACHINE_CONFIG_START(ss50_mpc_device::device_add_mconfig)
+void ss50_mpc_device::device_add_mconfig(machine_config &config)
+{
PIA6821(config, m_pia, 0); // actually MC6820
m_pia->writepa_handler().set("outgate", FUNC(input_merger_device::in_w<0>)).bit(0);
m_pia->cb2_handler().set(FUNC(ss50_mpc_device::reader_control_w));
@@ -115,15 +116,13 @@ MACHINE_CONFIG_START(ss50_mpc_device::device_add_mconfig)
rs232.rxd_handler().set(FUNC(ss50_mpc_device::serial_input_w));
rs232.set_option_device_input_defaults("terminal", DEVICE_INPUT_DEFAULTS_NAME(terminal));
- MCFG_INPUT_MERGER_ALL_HIGH("outgate")
- MCFG_INPUT_MERGER_OUTPUT_HANDLER(WRITELINE("rs232", rs232_port_device, write_txd))
+ INPUT_MERGER_ALL_HIGH(config, "outgate").output_handler().set("rs232", FUNC(rs232_port_device::write_txd));
- MCFG_INPUT_MERGER_ANY_HIGH("loopback")
- MCFG_INPUT_MERGER_OUTPUT_HANDLER(WRITELINE("outgate", input_merger_device, in_w<1>))
+ INPUT_MERGER_ANY_HIGH(config, m_loopback).output_handler().set("outgate", FUNC(input_merger_device::in_w<1>));
RIPPLE_COUNTER(config, m_counter); // CD4024AE (IC3)
m_counter->set_stages(7); // only Q5 (÷32) and Q4 (÷16) are actually used
-MACHINE_CONFIG_END
+}
//-------------------------------------------------
@@ -162,18 +161,18 @@ WRITE_LINE_MEMBER(ss50_mpc_device::count_select_w)
// register_read - read from a port register
//-------------------------------------------------
-READ8_MEMBER(ss50_mpc_device::register_read)
+u8 ss50_mpc_device::register_read(offs_t offset)
{
- return m_pia->read(space, offset & 3, 0);
+ return m_pia->read(offset & 3);
}
//-------------------------------------------------
// register_write - write to a port register
//-------------------------------------------------
-WRITE8_MEMBER(ss50_mpc_device::register_write)
+void ss50_mpc_device::register_write(offs_t offset, u8 data)
{
- m_pia->write(space, offset & 3, data);
+ m_pia->write(offset & 3, data);
}
WRITE_LINE_MEMBER(ss50_mpc_device::f110_w)
diff --git a/src/devices/bus/ss50/mps.cpp b/src/devices/bus/ss50/mps.cpp
index dab93db2cd3..d66dd3b767e 100644
--- a/src/devices/bus/ss50/mps.cpp
+++ b/src/devices/bus/ss50/mps.cpp
@@ -38,8 +38,8 @@ protected:
virtual void device_start() override { }
// interface-specific overrides
- virtual DECLARE_READ8_MEMBER(register_read) override;
- virtual DECLARE_WRITE8_MEMBER(register_write) override;
+ virtual u8 register_read(offs_t offset) override;
+ virtual void register_write(offs_t offset, u8 data) override;
virtual DECLARE_WRITE_LINE_MEMBER(f110_w) override;
virtual DECLARE_WRITE_LINE_MEMBER(f150_9600_w) override;
virtual DECLARE_WRITE_LINE_MEMBER(f300_w) override;
@@ -113,18 +113,18 @@ void ss50_mps_device::device_add_mconfig(machine_config &config)
// register_read - read from a port register
//-------------------------------------------------
-READ8_MEMBER(ss50_mps_device::register_read)
+u8 ss50_mps_device::register_read(offs_t offset)
{
- return m_acia->read(space, offset & 1, 0);
+ return m_acia->read(offset & 1);
}
//-------------------------------------------------
// register_write - write to a port register
//-------------------------------------------------
-WRITE8_MEMBER(ss50_mps_device::register_write)
+void ss50_mps_device::register_write(offs_t offset, u8 data)
{
- m_acia->write(space, offset & 1, data);
+ m_acia->write(offset & 1, data);
}
WRITE_LINE_MEMBER(ss50_mps_device::f110_w)
diff --git a/src/devices/bus/sunkbd/hlekbd.cpp b/src/devices/bus/sunkbd/hlekbd.cpp
index 2cb5547947e..21f4de349ed 100644
--- a/src/devices/bus/sunkbd/hlekbd.cpp
+++ b/src/devices/bus/sunkbd/hlekbd.cpp
@@ -789,11 +789,11 @@ WRITE_LINE_MEMBER( hle_device_base::input_txd )
add machine configuration
--------------------------------------------------*/
-MACHINE_CONFIG_START(hle_device_base::device_add_mconfig)
+void hle_device_base::device_add_mconfig(machine_config &config)
+{
SPEAKER(config, "bell").front_center();
- MCFG_DEVICE_ADD("beeper", BEEP, ATTOSECONDS_TO_HZ(480 * ATTOSECONDS_PER_MICROSECOND))
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "bell", 1.0)
-MACHINE_CONFIG_END
+ BEEP(config, m_beeper, ATTOSECONDS_TO_HZ(480 * ATTOSECONDS_PER_MICROSECOND)).add_route(ALL_OUTPUTS, "bell", 1.0);
+}
/*--------------------------------------------------
diff --git a/src/devices/bus/svi3x8/expander/expander.cpp b/src/devices/bus/svi3x8/expander/expander.cpp
index 481789516ff..e9653827fcf 100644
--- a/src/devices/bus/svi3x8/expander/expander.cpp
+++ b/src/devices/bus/svi3x8/expander/expander.cpp
@@ -80,38 +80,38 @@ void svi_expander_device::device_reset()
// host to module interface
//-------------------------------------------------
-READ8_MEMBER( svi_expander_device::mreq_r )
+uint8_t svi_expander_device::mreq_r(offs_t offset)
{
romdis_w(1);
ramdis_w(1);
if (m_module)
- return m_module->mreq_r(space, offset);
+ return m_module->mreq_r(offset);
return 0xff;
}
-WRITE8_MEMBER( svi_expander_device::mreq_w )
+void svi_expander_device::mreq_w(offs_t offset, uint8_t data)
{
romdis_w(1);
ramdis_w(1);
if (m_module)
- m_module->mreq_w(space, offset, data);
+ m_module->mreq_w(offset, data);
}
-READ8_MEMBER( svi_expander_device::iorq_r )
+uint8_t svi_expander_device::iorq_r(offs_t offset)
{
if (m_module)
- return m_module->iorq_r(space, offset);
+ return m_module->iorq_r(offset);
return 0xff;
}
-WRITE8_MEMBER( svi_expander_device::iorq_w )
+void svi_expander_device::iorq_w(offs_t offset, uint8_t data)
{
if (m_module)
- m_module->iorq_w(space, offset, data);
+ m_module->iorq_w(offset, data);
}
WRITE_LINE_MEMBER( svi_expander_device::bk21_w )
diff --git a/src/devices/bus/svi3x8/expander/expander.h b/src/devices/bus/svi3x8/expander/expander.h
index 549a17c5970..cc7e75f6332 100644
--- a/src/devices/bus/svi3x8/expander/expander.h
+++ b/src/devices/bus/svi3x8/expander/expander.h
@@ -40,36 +40,6 @@
#pragma once
-
-//**************************************************************************
-// INTERFACE CONFIGURATION MACROS
-//**************************************************************************
-
-#define MCFG_SVI_EXPANDER_BUS_ADD(_tag) \
- MCFG_DEVICE_ADD(_tag, SVI_EXPANDER, 0) \
- MCFG_DEVICE_SLOT_INTERFACE(svi_expander_modules, nullptr, false)
-#define MCFG_SVI_EXPANDER_INT_HANDLER(_devcb) \
- downcast<svi_expander_device &>(*device).set_int_handler(DEVCB_##_devcb);
-
-#define MCFG_SVI_EXPANDER_ROMDIS_HANDLER(_devcb) \
- downcast<svi_expander_device &>(*device).set_romdis_handler(DEVCB_##_devcb);
-
-#define MCFG_SVI_EXPANDER_RAMDIS_HANDLER(_devcb) \
- downcast<svi_expander_device &>(*device).set_ramdis_handler(DEVCB_##_devcb);
-
-#define MCFG_SVI_EXPANDER_CTRL1_HANDLER(_devcb) \
- downcast<svi_expander_device &>(*device).set_ctrl1_handler(DEVCB_##_devcb);
-
-#define MCFG_SVI_EXPANDER_CTRL2_HANDLER(_devcb) \
- downcast<svi_expander_device &>(*device).set_ctrl2_handler(DEVCB_##_devcb);
-
-#define MCFG_SVI_EXPANDER_EXCSR_HANDLER(_devcb) \
- downcast<svi_expander_device &>(*device).set_excsr_handler(DEVCB_##_devcb);
-
-#define MCFG_SVI_EXPANDER_EXCSW_HANDLER(_devcb) \
- downcast<svi_expander_device &>(*device).set_excsw_handler(DEVCB_##_devcb);
-
-
//**************************************************************************
// TYPE DEFINITIONS
//**************************************************************************
@@ -82,17 +52,27 @@ class svi_expander_device : public device_t, public device_slot_interface
{
public:
// construction/destruction
+ template <typename T>
+ svi_expander_device(machine_config const &mconfig, char const *tag, device_t *owner, T &&opts)
+ : svi_expander_device(mconfig, tag, owner, uint32_t(0))
+ {
+ option_reset();
+ opts(*this);
+ set_default_option(nullptr);
+ set_fixed(false);
+ }
+
svi_expander_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
virtual ~svi_expander_device();
// callbacks
- template <class Object> devcb_base &set_int_handler(Object &&cb) { return m_int_handler.set_callback(std::forward<Object>(cb)); }
- template <class Object> devcb_base &set_romdis_handler(Object &&cb) { return m_romdis_handler.set_callback(std::forward<Object>(cb)); }
- template <class Object> devcb_base &set_ramdis_handler(Object &&cb) { return m_ramdis_handler.set_callback(std::forward<Object>(cb)); }
- template <class Object> devcb_base &set_ctrl1_handler(Object &&cb) { return m_ctrl1_handler.set_callback(std::forward<Object>(cb)); }
- template <class Object> devcb_base &set_ctrl2_handler(Object &&cb) { return m_ctrl2_handler.set_callback(std::forward<Object>(cb)); }
- template <class Object> devcb_base &set_excsr_handler(Object &&cb) { return m_excsr_handler.set_callback(std::forward<Object>(cb)); }
- template <class Object> devcb_base &set_excsw_handler(Object &&cb) { return m_excsw_handler.set_callback(std::forward<Object>(cb)); }
+ auto int_handler() { return m_int_handler.bind(); }
+ auto romdis_handler() { return m_romdis_handler.bind(); }
+ auto ramdis_handler() { return m_ramdis_handler.bind(); }
+ auto ctrl1_handler() { return m_ctrl1_handler.bind(); }
+ auto ctrl2_handler() { return m_ctrl2_handler.bind(); }
+ auto excsr_handler() { return m_excsr_handler.bind(); }
+ auto excsw_handler() { return m_excsw_handler.bind(); }
// called from cart device
DECLARE_WRITE_LINE_MEMBER( int_w ) { m_int_handler(state); }
@@ -101,14 +81,14 @@ public:
DECLARE_WRITE_LINE_MEMBER( ctrl1_w ) { m_ctrl1_handler(state); }
DECLARE_WRITE_LINE_MEMBER( ctrl2_w ) { m_ctrl2_handler(state); }
- DECLARE_READ8_MEMBER( excs_r ) { return m_excsr_handler(space, offset); }
- DECLARE_WRITE8_MEMBER( excs_w ) { m_excsw_handler(space, offset, data); }
+ uint8_t excs_r(offs_t offset) { return m_excsr_handler(offset); }
+ void excs_w(offs_t offset, uint8_t data) { m_excsw_handler(offset, data); }
// called from host
- DECLARE_READ8_MEMBER( mreq_r );
- DECLARE_WRITE8_MEMBER( mreq_w );
- DECLARE_READ8_MEMBER( iorq_r );
- DECLARE_WRITE8_MEMBER( iorq_w );
+ uint8_t mreq_r(offs_t offset);
+ void mreq_w(offs_t offset, uint8_t data);
+ uint8_t iorq_r(offs_t offset);
+ void iorq_w(offs_t offset, uint8_t data);
DECLARE_WRITE_LINE_MEMBER( bk21_w );
DECLARE_WRITE_LINE_MEMBER( bk22_w );
@@ -141,10 +121,10 @@ public:
// construction/destruction
virtual ~device_svi_expander_interface();
- virtual DECLARE_READ8_MEMBER( mreq_r ) { return 0xff; }
- virtual DECLARE_WRITE8_MEMBER( mreq_w ) { }
- virtual DECLARE_READ8_MEMBER( iorq_r ) { return 0xff; }
- virtual DECLARE_WRITE8_MEMBER( iorq_w ) { }
+ virtual uint8_t mreq_r(offs_t offset) { return 0xff; }
+ virtual void mreq_w(offs_t offset, uint8_t data) { }
+ virtual uint8_t iorq_r(offs_t offset) { return 0xff; }
+ virtual void iorq_w(offs_t offset, uint8_t data) { }
virtual void bk21_w(int state) { }
virtual void bk22_w(int state) { }
diff --git a/src/devices/bus/svi3x8/expander/sv601.cpp b/src/devices/bus/svi3x8/expander/sv601.cpp
index 51a51241897..aec81c79ae6 100644
--- a/src/devices/bus/svi3x8/expander/sv601.cpp
+++ b/src/devices/bus/svi3x8/expander/sv601.cpp
@@ -20,19 +20,20 @@ DEFINE_DEVICE_TYPE(SV601, sv601_device, "sv601", "SV-601 Super Expander")
// device_add_mconfig - add device configuration
//-------------------------------------------------
-MACHINE_CONFIG_START(sv601_device::device_add_mconfig)
- MCFG_SVI_SLOT_BUS_ADD
- MCFG_SVI_SLOT_INT_HANDLER(WRITELINE(*this, sv601_device, int_w))
- MCFG_SVI_SLOT_ROMDIS_HANDLER(WRITELINE(*this, sv601_device, romdis_w))
- MCFG_SVI_SLOT_RAMDIS_HANDLER(WRITELINE(*this, sv601_device, ramdis_w))
- MCFG_SVI_SLOT_ADD("0", svi_slot_cards, nullptr)
- MCFG_SVI_SLOT_ADD("1", svi_slot_cards, nullptr)
- MCFG_SVI_SLOT_ADD("2", svi_slot_cards, nullptr)
- MCFG_SVI_SLOT_ADD("3", svi_slot_cards, nullptr)
- MCFG_SVI_SLOT_ADD("4", svi_slot_cards, nullptr)
- MCFG_SVI_SLOT_ADD("5", svi_slot_cards, nullptr)
- MCFG_SVI_SLOT_ADD("6", svi_slot_cards, nullptr)
-MACHINE_CONFIG_END
+void sv601_device::device_add_mconfig(machine_config &config)
+{
+ SVI_SLOT_BUS(config, m_slotbus, 0);
+ m_slotbus->int_handler().set(FUNC(sv601_device::int_w));
+ m_slotbus->romdis_handler().set(FUNC(sv601_device::romdis_w));
+ m_slotbus->ramdis_handler().set(FUNC(sv601_device::ramdis_w));
+ SVI_SLOT(config, "0", svi_slot_cards, nullptr);
+ SVI_SLOT(config, "1", svi_slot_cards, nullptr);
+ SVI_SLOT(config, "2", svi_slot_cards, nullptr);
+ SVI_SLOT(config, "3", svi_slot_cards, nullptr);
+ SVI_SLOT(config, "4", svi_slot_cards, nullptr);
+ SVI_SLOT(config, "5", svi_slot_cards, nullptr);
+ SVI_SLOT(config, "6", svi_slot_cards, nullptr);
+}
//**************************************************************************
@@ -67,10 +68,10 @@ WRITE_LINE_MEMBER( sv601_device::int_w ) { m_expander->int_w(state); }
WRITE_LINE_MEMBER( sv601_device::romdis_w ) { m_expander->romdis_w(state); }
WRITE_LINE_MEMBER( sv601_device::ramdis_w ) { m_expander->ramdis_w(state); }
-READ8_MEMBER( sv601_device::mreq_r ) { return m_slotbus->mreq_r(space, offset); }
-WRITE8_MEMBER( sv601_device::mreq_w ) { m_slotbus->mreq_w(space, offset, data); }
-READ8_MEMBER( sv601_device::iorq_r ) { return m_slotbus->iorq_r(space, offset); }
-WRITE8_MEMBER( sv601_device::iorq_w ) { m_slotbus->iorq_w(space, offset, data); }
+uint8_t sv601_device::mreq_r(offs_t offset) { return m_slotbus->mreq_r(offset); }
+void sv601_device::mreq_w(offs_t offset, uint8_t data) { m_slotbus->mreq_w(offset, data); }
+uint8_t sv601_device::iorq_r(offs_t offset) { return m_slotbus->iorq_r(offset); }
+void sv601_device::iorq_w(offs_t offset, uint8_t data) { m_slotbus->iorq_w(offset, data); }
void sv601_device::bk21_w(int state) { m_slotbus->bk21_w(state); }
void sv601_device::bk22_w(int state) { m_slotbus->bk22_w(state); }
diff --git a/src/devices/bus/svi3x8/expander/sv601.h b/src/devices/bus/svi3x8/expander/sv601.h
index 7918bc82441..692191a7ea9 100644
--- a/src/devices/bus/svi3x8/expander/sv601.h
+++ b/src/devices/bus/svi3x8/expander/sv601.h
@@ -33,10 +33,10 @@ public:
WRITE_LINE_MEMBER( ramdis_w );
// from host
- virtual DECLARE_READ8_MEMBER( mreq_r ) override;
- virtual DECLARE_WRITE8_MEMBER( mreq_w ) override;
- virtual DECLARE_READ8_MEMBER( iorq_r ) override;
- virtual DECLARE_WRITE8_MEMBER( iorq_w ) override;
+ virtual uint8_t mreq_r(offs_t offset) override;
+ virtual void mreq_w(offs_t offset, uint8_t data) override;
+ virtual uint8_t iorq_r(offs_t offset) override;
+ virtual void iorq_w(offs_t offset, uint8_t data) override;
virtual void bk21_w(int state) override;
virtual void bk22_w(int state) override;
diff --git a/src/devices/bus/svi3x8/expander/sv602.cpp b/src/devices/bus/svi3x8/expander/sv602.cpp
index b7c657bddce..25624a83e9a 100644
--- a/src/devices/bus/svi3x8/expander/sv602.cpp
+++ b/src/devices/bus/svi3x8/expander/sv602.cpp
@@ -20,13 +20,14 @@ DEFINE_DEVICE_TYPE(SV602, sv602_device, "sv602", "SV-602 Single Slot Expander")
// device_add_mconfig - add device configuration
//-------------------------------------------------
-MACHINE_CONFIG_START(sv602_device::device_add_mconfig)
- MCFG_SVI_SLOT_BUS_ADD
- MCFG_SVI_SLOT_INT_HANDLER(WRITELINE(*this, sv602_device, int_w))
- MCFG_SVI_SLOT_ROMDIS_HANDLER(WRITELINE(*this, sv602_device, romdis_w))
- MCFG_SVI_SLOT_RAMDIS_HANDLER(WRITELINE(*this, sv602_device, ramdis_w))
- MCFG_SVI_SLOT_ADD("0", sv602_slot_cards, nullptr)
-MACHINE_CONFIG_END
+void sv602_device::device_add_mconfig(machine_config &config)
+{
+ SVI_SLOT_BUS(config, m_slotbus, 0);
+ m_slotbus->int_handler().set(FUNC(sv602_device::int_w));
+ m_slotbus->romdis_handler().set(FUNC(sv602_device::romdis_w));
+ m_slotbus->ramdis_handler().set(FUNC(sv602_device::ramdis_w));
+ SVI_SLOT(config, "0", sv602_slot_cards, nullptr);
+}
//**************************************************************************
@@ -61,10 +62,10 @@ WRITE_LINE_MEMBER( sv602_device::int_w ) { m_expander->int_w(state); }
WRITE_LINE_MEMBER( sv602_device::romdis_w ) { m_expander->romdis_w(state); }
WRITE_LINE_MEMBER( sv602_device::ramdis_w ) { m_expander->ramdis_w(state); }
-READ8_MEMBER( sv602_device::mreq_r ) { return m_slotbus->mreq_r(space, offset); }
-WRITE8_MEMBER( sv602_device::mreq_w ) { m_slotbus->mreq_w(space, offset, data); }
-READ8_MEMBER( sv602_device::iorq_r ) { return m_slotbus->iorq_r(space, offset); }
-WRITE8_MEMBER( sv602_device::iorq_w ) { m_slotbus->iorq_w(space, offset, data); }
+uint8_t sv602_device::mreq_r(offs_t offset) { return m_slotbus->mreq_r(offset); }
+void sv602_device::mreq_w(offs_t offset, uint8_t data) { m_slotbus->mreq_w(offset, data); }
+uint8_t sv602_device::iorq_r(offs_t offset) { return m_slotbus->iorq_r(offset); }
+void sv602_device::iorq_w(offs_t offset, uint8_t data) { m_slotbus->iorq_w(offset, data); }
void sv602_device::bk21_w(int state) { m_slotbus->bk21_w(state); }
void sv602_device::bk22_w(int state) { m_slotbus->bk22_w(state); }
diff --git a/src/devices/bus/svi3x8/expander/sv602.h b/src/devices/bus/svi3x8/expander/sv602.h
index bb59b93c7ee..607d1cf6c17 100644
--- a/src/devices/bus/svi3x8/expander/sv602.h
+++ b/src/devices/bus/svi3x8/expander/sv602.h
@@ -28,10 +28,10 @@ public:
sv602_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
// from host
- virtual DECLARE_READ8_MEMBER( mreq_r ) override;
- virtual DECLARE_WRITE8_MEMBER( mreq_w ) override;
- virtual DECLARE_READ8_MEMBER( iorq_r ) override;
- virtual DECLARE_WRITE8_MEMBER( iorq_w ) override;
+ virtual uint8_t mreq_r(offs_t offset) override;
+ virtual void mreq_w(offs_t offset, uint8_t data) override;
+ virtual uint8_t iorq_r(offs_t offset) override;
+ virtual void iorq_w(offs_t offset, uint8_t data) override;
virtual void bk21_w(int state) override;
virtual void bk22_w(int state) override;
diff --git a/src/devices/bus/svi3x8/expander/sv603.cpp b/src/devices/bus/svi3x8/expander/sv603.cpp
index a35b46e3f84..fc8e8c86d96 100644
--- a/src/devices/bus/svi3x8/expander/sv603.cpp
+++ b/src/devices/bus/svi3x8/expander/sv603.cpp
@@ -8,7 +8,6 @@
#include "emu.h"
#include "sv603.h"
-
#include "softlist.h"
#include "speaker.h"
@@ -37,31 +36,20 @@ const tiny_rom_entry *sv603_device::device_rom_region() const
// device_add_mconfig - add device configuration
//-------------------------------------------------
-MACHINE_CONFIG_START(sv603_device::device_add_mconfig)
- SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("snd", SN76489A, XTAL(10'738'635) / 3)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.00)
-
- // cartridge slot
- MCFG_GENERIC_CARTSLOT_ADD("cartslot", generic_plain_slot, "coleco_cart")
- MCFG_GENERIC_EXTENSIONS("bin,rom,col")
- MCFG_GENERIC_LOAD(sv603_device, cartridge)
- MCFG_SOFTWARE_LIST_ADD("cart_list", "coleco")
-MACHINE_CONFIG_END
-
-
-//**************************************************************************
-// CARTRIDGE
-//**************************************************************************
-
-DEVICE_IMAGE_LOAD_MEMBER( sv603_device, cartridge )
+void sv603_device::device_add_mconfig(machine_config &config)
{
- uint32_t size = m_cart_rom->common_get_size("rom");
+ SPEAKER(config, "mono").front_center();
+ SN76489A(config, m_snd, XTAL(10'738'635) / 3).add_route(ALL_OUTPUTS, "mono", 1.00);
- m_cart_rom->rom_alloc(size, GENERIC_ROM8_WIDTH, ENDIANNESS_LITTLE);
- m_cart_rom->common_load_rom(m_cart_rom->get_rom_base(), size, "rom");
+ // controller ports
+ COLECOVISION_CONTROL_PORT(config, m_joy[0], colecovision_control_port_devices, "hand");
+ m_joy[0]->irq().set(FUNC(sv603_device::joy_irq_w<0>));
+ COLECOVISION_CONTROL_PORT(config, m_joy[1], colecovision_control_port_devices, nullptr);
+ m_joy[1]->irq().set(FUNC(sv603_device::joy_irq_w<1>));
- return image_init_result::PASS;
+ // cartridge slot
+ COLECOVISION_CARTRIDGE_SLOT(config, m_cart, colecovision_cartridges, nullptr);
+ SOFTWARE_LIST(config, "cart_list").set_original("coleco");
}
@@ -78,7 +66,8 @@ sv603_device::sv603_device(const machine_config &mconfig, const char *tag, devic
device_svi_expander_interface(mconfig, *this),
m_bios(*this, "bios"),
m_snd(*this, "snd"),
- m_cart_rom(*this, "cartslot")
+ m_joy{ {*this, "joy1"}, {*this, "joy2"} },
+ m_cart(*this, COLECOVISION_CARTRIDGE_SLOT_TAG)
{
}
@@ -104,40 +93,84 @@ void sv603_device::device_reset()
// IMPLEMENTATION
//**************************************************************************
-READ8_MEMBER( sv603_device::mreq_r )
+template<int N>
+WRITE_LINE_MEMBER( sv603_device::joy_irq_w )
{
+ m_expander->int_w(state);
+}
+
+uint8_t sv603_device::mreq_r(offs_t offset)
+{
+ uint8_t data = 0xff;
+
+ // ls138 (active low)
+ int ccs1 = ((offset >> 13) == 0) ? 0 : 1;
+ int ccs2 = ((offset >> 13) == 1) ? 0 : 1;
+ int ccs3 = ((offset >> 13) == 2) ? 0 : 1;
+ int ccs4 = ((offset >> 13) == 3) ? 0 : 1;
+ int bios = ((offset >> 13) == 4) ? 0 : 1;
+ // 5, 6, 7: not connected
+
m_expander->romdis_w(0);
+ m_expander->ramdis_w(bios);
- if (offset < 0x8000)
- return m_cart_rom->read_rom(space, offset);
+ data &= m_cart->bd_r(offset, data, ccs1, ccs2, ccs3, ccs4);
- if (offset >= 0x8000 && offset < 0xa000)
- {
- m_expander->ramdis_w(0);
- return m_bios->as_u8(offset & 0x1fff);
- }
+ if (bios == 0)
+ data &= m_bios->as_u8(offset & 0x1fff);
- return 0xff;
+ return data;
}
-WRITE8_MEMBER( sv603_device::mreq_w )
+void sv603_device::mreq_w(offs_t offset, uint8_t data)
{
m_expander->romdis_w(0);
}
-READ8_MEMBER( sv603_device::iorq_r )
+uint8_t sv603_device::iorq_r(offs_t offset)
{
- if (offset >= 0xa0 && offset <= 0xbf)
- return m_expander->excs_r(space, offset);
+ uint8_t data = 0xff;
+
+ switch (offset & 0xe0)
+ {
+ case 0xa0:
+ data = m_expander->excs_r(offset);
+ break;
+
+ case 0xe0:
+ data = m_joy[BIT(offset, 1)]->read();
+ break;
+ }
- return 0xff;
+ return data;
}
-WRITE8_MEMBER( sv603_device::iorq_w )
+void sv603_device::iorq_w(offs_t offset, uint8_t data)
{
- if (offset >= 0xa0 && offset <= 0xbf)
- m_expander->excs_w(space, offset, data);
-
- if (offset >= 0xe0 && offset <= 0xff)
+ switch (offset & 0xe0)
+ {
+ case 0x80:
+ // keypad mode
+ m_joy[0]->common0_w(1);
+ m_joy[0]->common1_w(0);
+ m_joy[1]->common0_w(1);
+ m_joy[1]->common1_w(0);
+ break;
+
+ case 0xa0:
+ m_expander->excs_w(offset, data);
+ break;
+
+ case 0xc0:
+ // joystick mode
+ m_joy[0]->common0_w(0);
+ m_joy[0]->common1_w(1);
+ m_joy[1]->common0_w(0);
+ m_joy[1]->common1_w(1);
+ break;
+
+ case 0xe0:
m_snd->write(data);
+ break;
+ }
}
diff --git a/src/devices/bus/svi3x8/expander/sv603.h b/src/devices/bus/svi3x8/expander/sv603.h
index 57d16521c17..a6b3fde21b8 100644
--- a/src/devices/bus/svi3x8/expander/sv603.h
+++ b/src/devices/bus/svi3x8/expander/sv603.h
@@ -13,8 +13,8 @@
#include "expander.h"
#include "sound/sn76496.h"
-#include "bus/generic/slot.h"
-#include "bus/generic/carts.h"
+#include "bus/coleco/cartridge/exp.h"
+#include "bus/coleco/controller/ctrl.h"
//**************************************************************************
@@ -30,12 +30,12 @@ public:
sv603_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
// from host
- virtual DECLARE_READ8_MEMBER( mreq_r ) override;
- virtual DECLARE_WRITE8_MEMBER( mreq_w ) override;
- virtual DECLARE_READ8_MEMBER( iorq_r ) override;
- virtual DECLARE_WRITE8_MEMBER( iorq_w ) override;
+ virtual uint8_t mreq_r(offs_t offset) override;
+ virtual void mreq_w(offs_t offset, uint8_t data) override;
+ virtual uint8_t iorq_r(offs_t offset) override;
+ virtual void iorq_w(offs_t offset, uint8_t data) override;
- DECLARE_DEVICE_IMAGE_LOAD_MEMBER(cartridge);
+ template<int N> DECLARE_WRITE_LINE_MEMBER( joy_irq_w );
protected:
virtual const tiny_rom_entry *device_rom_region() const override;
@@ -46,7 +46,8 @@ protected:
private:
required_memory_region m_bios;
required_device<sn76489a_device> m_snd;
- required_device<generic_slot_device> m_cart_rom;
+ required_device<colecovision_control_port_device> m_joy[2];
+ required_device<colecovision_cartridge_slot_device> m_cart;
};
// device type definition
diff --git a/src/devices/bus/svi3x8/slot/slot.cpp b/src/devices/bus/svi3x8/slot/slot.cpp
index c345d864f4b..eb2137ce629 100644
--- a/src/devices/bus/svi3x8/slot/slot.cpp
+++ b/src/devices/bus/svi3x8/slot/slot.cpp
@@ -20,11 +20,11 @@ DEFINE_DEVICE_TYPE(SVI_SLOT_BUS, svi_slot_bus_device, "svislotbus", "SVI Slot Bu
// svi_slot_bus_device - constructor
//-------------------------------------------------
-svi_slot_bus_device::svi_slot_bus_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) :
- device_t(mconfig, SVI_SLOT_BUS, tag, owner, clock),
- m_int_handler(*this),
- m_romdis_handler(*this),
- m_ramdis_handler(*this)
+svi_slot_bus_device::svi_slot_bus_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+ : device_t(mconfig, SVI_SLOT_BUS, tag, owner, clock)
+ , m_int_handler(*this)
+ , m_romdis_handler(*this)
+ , m_ramdis_handler(*this)
{
}
@@ -71,14 +71,14 @@ void svi_slot_bus_device::add_card(device_svi_slot_interface *card)
// mreq_r - memory read from slot
//-------------------------------------------------
-READ8_MEMBER( svi_slot_bus_device::mreq_r )
+uint8_t svi_slot_bus_device::mreq_r(offs_t offset)
{
device_svi_slot_interface *entry = m_dev.first();
uint8_t data = 0xff;
while (entry)
{
- data &= entry->mreq_r(space, offset);
+ data &= entry->mreq_r(offset);
entry = entry->next();
}
@@ -89,13 +89,13 @@ READ8_MEMBER( svi_slot_bus_device::mreq_r )
// mreq_w - memory write to slot
//-------------------------------------------------
-WRITE8_MEMBER( svi_slot_bus_device::mreq_w )
+void svi_slot_bus_device::mreq_w(offs_t offset, uint8_t data)
{
device_svi_slot_interface *entry = m_dev.first();
while (entry)
{
- entry->mreq_w(space, offset, data);
+ entry->mreq_w(offset, data);
entry = entry->next();
}
}
@@ -104,14 +104,14 @@ WRITE8_MEMBER( svi_slot_bus_device::mreq_w )
// iorq_r - memory read from slot
//-------------------------------------------------
-READ8_MEMBER( svi_slot_bus_device::iorq_r )
+uint8_t svi_slot_bus_device::iorq_r(offs_t offset)
{
device_svi_slot_interface *entry = m_dev.first();
uint8_t data = 0xff;
while (entry)
{
- data &= entry->iorq_r(space, offset);
+ data &= entry->iorq_r(offset);
entry = entry->next();
}
@@ -122,13 +122,13 @@ READ8_MEMBER( svi_slot_bus_device::iorq_r )
// iorq_w - memory write to slot
//-------------------------------------------------
-WRITE8_MEMBER( svi_slot_bus_device::iorq_w )
+void svi_slot_bus_device::iorq_w(offs_t offset, uint8_t data)
{
device_svi_slot_interface *entry = m_dev.first();
while (entry)
{
- entry->iorq_w(space, offset, data);
+ entry->iorq_w(offset, data);
entry = entry->next();
}
}
@@ -204,10 +204,9 @@ DEFINE_DEVICE_TYPE(SVI_SLOT, svi_slot_device, "svislot", "SVI Slot")
// svi_slot_device - constructor
//-------------------------------------------------
-svi_slot_device::svi_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) :
- device_t(mconfig, SVI_SLOT, tag, owner, clock),
- device_slot_interface(mconfig, *this),
- m_bus_tag(nullptr)
+svi_slot_device::svi_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+ : device_t(mconfig, SVI_SLOT, tag, owner, clock)
+ , device_slot_interface(mconfig, *this)
{
}
@@ -221,7 +220,7 @@ void svi_slot_device::device_start()
if (dev)
{
- svi_slot_bus_device *bus = downcast<svi_slot_bus_device *>(m_owner->subdevice(m_bus_tag));
+ svi_slot_bus_device *bus = downcast<svi_slot_bus_device *>(owner()->subdevice(SVIBUS_TAG));
bus->add_card(dev);
}
}
diff --git a/src/devices/bus/svi3x8/slot/slot.h b/src/devices/bus/svi3x8/slot/slot.h
index 702c005b770..756f17658fd 100644
--- a/src/devices/bus/svi3x8/slot/slot.h
+++ b/src/devices/bus/svi3x8/slot/slot.h
@@ -40,27 +40,11 @@
#pragma once
-
//**************************************************************************
-// INTERFACE CONFIGURATION MACROS
+// CONSTANTS / MACROS
//**************************************************************************
-#define MCFG_SVI_SLOT_BUS_ADD \
- MCFG_DEVICE_ADD("slotbus", SVI_SLOT_BUS, 0)
-
-#define MCFG_SVI_SLOT_ADD(_tag, _slot_intf, _def_slot) \
- MCFG_DEVICE_ADD(_tag, SVI_SLOT, 0) \
- MCFG_DEVICE_SLOT_INTERFACE(_slot_intf, _def_slot, false) \
- downcast<svi_slot_device &>(*device).set_bus(this, "slotbus");
-
-#define MCFG_SVI_SLOT_INT_HANDLER(_devcb) \
- downcast<svi_slot_bus_device &>(*device).set_int_handler(DEVCB_##_devcb);
-
-#define MCFG_SVI_SLOT_ROMDIS_HANDLER(_devcb) \
- downcast<svi_slot_bus_device &>(*device).set_romdis_handler(DEVCB_##_devcb);
-
-#define MCFG_SVI_SLOT_RAMDIS_HANDLER(_devcb) \
- downcast<svi_slot_bus_device &>(*device).set_ramdis_handler(DEVCB_##_devcb);
+#define SVIBUS_TAG "slot_bux"
//**************************************************************************
@@ -79,9 +63,9 @@ public:
virtual ~svi_slot_bus_device();
// callbacks
- template <class Object> devcb_base &set_int_handler(Object &&cb) { return m_int_handler.set_callback(std::forward<Object>(cb)); }
- template <class Object> devcb_base &set_romdis_handler(Object &&cb) { return m_romdis_handler.set_callback(std::forward<Object>(cb)); }
- template <class Object> devcb_base &set_ramdis_handler(Object &&cb) { return m_ramdis_handler.set_callback(std::forward<Object>(cb)); }
+ auto int_handler() { return m_int_handler.bind(); }
+ auto romdis_handler() { return m_romdis_handler.bind(); }
+ auto ramdis_handler() { return m_ramdis_handler.bind(); }
void add_card(device_svi_slot_interface *card);
@@ -91,10 +75,10 @@ public:
DECLARE_WRITE_LINE_MEMBER( ramdis_w ) { m_ramdis_handler(state); };
// from host
- DECLARE_READ8_MEMBER( mreq_r );
- DECLARE_WRITE8_MEMBER( mreq_w );
- DECLARE_READ8_MEMBER( iorq_r );
- DECLARE_WRITE8_MEMBER( iorq_w );
+ uint8_t mreq_r(offs_t offset);
+ void mreq_w(offs_t offset, uint8_t data);
+ uint8_t iorq_r(offs_t offset);
+ void iorq_w(offs_t offset, uint8_t data);
DECLARE_WRITE_LINE_MEMBER( bk21_w );
DECLARE_WRITE_LINE_MEMBER( bk22_w );
@@ -122,10 +106,17 @@ class svi_slot_device : public device_t, public device_slot_interface
{
public:
// construction/destruction
- svi_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+ template <typename T>
+ svi_slot_device(machine_config const &mconfig, char const *tag, device_t *owner, T &&opts, char const *dflt)
+ : svi_slot_device(mconfig, tag, owner, 0)
+ {
+ option_reset();
+ opts(*this);
+ set_default_option(dflt);
+ set_fixed(false);
+ }
- // inline configuration
- void set_bus(device_t *owner, const char *bus_tag) { m_owner = owner; m_bus_tag = bus_tag; }
+ svi_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
protected:
// device-level overrides
@@ -152,10 +143,10 @@ public:
device_svi_slot_interface *next() const { return m_next; }
- virtual DECLARE_READ8_MEMBER( mreq_r ) { return 0xff; }
- virtual DECLARE_WRITE8_MEMBER( mreq_w ) { }
- virtual DECLARE_READ8_MEMBER( iorq_r ) { return 0xff; }
- virtual DECLARE_WRITE8_MEMBER( iorq_w ) { }
+ virtual uint8_t mreq_r(offs_t offset) { return 0xff; }
+ virtual void mreq_w(offs_t offset, uint8_t data) { }
+ virtual uint8_t iorq_r(offs_t offset) { return 0xff; }
+ virtual void iorq_w(offs_t offset, uint8_t data) { }
virtual DECLARE_WRITE_LINE_MEMBER( bk21_w ) { }
virtual DECLARE_WRITE_LINE_MEMBER( bk22_w ) { }
diff --git a/src/devices/bus/svi3x8/slot/sv801.cpp b/src/devices/bus/svi3x8/slot/sv801.cpp
index 48881ffc9e1..9d73b62aec1 100644
--- a/src/devices/bus/svi3x8/slot/sv801.cpp
+++ b/src/devices/bus/svi3x8/slot/sv801.cpp
@@ -97,7 +97,7 @@ WRITE_LINE_MEMBER( sv801_device::drq_w )
m_drq = state;
}
-WRITE8_MEMBER( sv801_device::motor_w )
+void sv801_device::motor_w(uint8_t data)
{
m_floppy = nullptr;
@@ -112,7 +112,7 @@ WRITE8_MEMBER( sv801_device::motor_w )
m_floppy1->get_device()->mon_w(!BIT(data, 3));
}
-READ8_MEMBER( sv801_device::iorq_r )
+uint8_t sv801_device::iorq_r(offs_t offset)
{
switch (offset)
{
@@ -126,7 +126,7 @@ READ8_MEMBER( sv801_device::iorq_r )
return 0xff;
}
-WRITE8_MEMBER( sv801_device::iorq_w )
+void sv801_device::iorq_w(offs_t offset, uint8_t data)
{
switch (offset)
{
@@ -134,7 +134,7 @@ WRITE8_MEMBER( sv801_device::iorq_w )
case 0x31: m_fdc->track_w(data); break;
case 0x32: m_fdc->sector_w(data); break;
case 0x33: m_fdc->data_w(data); break;
- case 0x34: motor_w(space, 0, data); break;
+ case 0x34: motor_w(data); break;
case 0x38:
m_fdc->dden_w(BIT(data, 0));
if (m_floppy)
diff --git a/src/devices/bus/svi3x8/slot/sv801.h b/src/devices/bus/svi3x8/slot/sv801.h
index 38dea1e55d0..29c2014b872 100644
--- a/src/devices/bus/svi3x8/slot/sv801.h
+++ b/src/devices/bus/svi3x8/slot/sv801.h
@@ -28,8 +28,8 @@ public:
// construction/destruction
sv801_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- virtual DECLARE_READ8_MEMBER( iorq_r ) override;
- virtual DECLARE_WRITE8_MEMBER( iorq_w ) override;
+ virtual uint8_t iorq_r(offs_t offset) override;
+ virtual void iorq_w(offs_t offset, uint8_t data) override;
protected:
virtual void device_add_mconfig(machine_config &config) override;
@@ -37,7 +37,7 @@ protected:
virtual void device_reset() override;
private:
- DECLARE_WRITE8_MEMBER( motor_w );
+ void motor_w(uint8_t data);
DECLARE_WRITE_LINE_MEMBER( intrq_w );
DECLARE_WRITE_LINE_MEMBER( drq_w );
diff --git a/src/devices/bus/svi3x8/slot/sv802.cpp b/src/devices/bus/svi3x8/slot/sv802.cpp
index 2cc905d472c..909ed2fa712 100644
--- a/src/devices/bus/svi3x8/slot/sv802.cpp
+++ b/src/devices/bus/svi3x8/slot/sv802.cpp
@@ -20,12 +20,14 @@ DEFINE_DEVICE_TYPE(SV802, sv802_device, "sv802", "SV-802 Centronics Printer Inte
// device_add_mconfig - add device configuration
//-------------------------------------------------
-MACHINE_CONFIG_START(sv802_device::device_add_mconfig)
- MCFG_DEVICE_ADD(m_centronics, CENTRONICS, centronics_devices, "printer")
- MCFG_CENTRONICS_BUSY_HANDLER(WRITELINE(*this, sv802_device, busy_w))
+void sv802_device::device_add_mconfig(machine_config &config)
+{
+ CENTRONICS(config, m_centronics, centronics_devices, "printer");
+ m_centronics->busy_handler().set(FUNC(sv802_device::busy_w));
- MCFG_CENTRONICS_OUTPUT_LATCH_ADD("cent_data_out", "centronics")
-MACHINE_CONFIG_END
+ OUTPUT_LATCH(config, m_cent_data_out);
+ m_centronics->set_output_latch(*m_cent_data_out);
+}
//**************************************************************************
@@ -60,7 +62,7 @@ void sv802_device::device_start()
// IMPLEMENTATION
//**************************************************************************
-READ8_MEMBER( sv802_device::iorq_r )
+uint8_t sv802_device::iorq_r(offs_t offset)
{
if (offset == 0x12)
return 0xfe | m_busy;
@@ -68,7 +70,7 @@ READ8_MEMBER( sv802_device::iorq_r )
return 0xff;
}
-WRITE8_MEMBER( sv802_device::iorq_w )
+void sv802_device::iorq_w(offs_t offset, uint8_t data)
{
switch (offset)
{
diff --git a/src/devices/bus/svi3x8/slot/sv802.h b/src/devices/bus/svi3x8/slot/sv802.h
index 2a06329c966..aabea33bbaf 100644
--- a/src/devices/bus/svi3x8/slot/sv802.h
+++ b/src/devices/bus/svi3x8/slot/sv802.h
@@ -28,8 +28,8 @@ public:
// construction/destruction
sv802_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- virtual DECLARE_READ8_MEMBER( iorq_r ) override;
- virtual DECLARE_WRITE8_MEMBER( iorq_w ) override;
+ virtual uint8_t iorq_r(offs_t offset) override;
+ virtual void iorq_w(offs_t offset, uint8_t data) override;
protected:
virtual void device_add_mconfig(machine_config &config) override;
diff --git a/src/devices/bus/svi3x8/slot/sv803.cpp b/src/devices/bus/svi3x8/slot/sv803.cpp
index db79801530c..6adc07fd193 100644
--- a/src/devices/bus/svi3x8/slot/sv803.cpp
+++ b/src/devices/bus/svi3x8/slot/sv803.cpp
@@ -56,7 +56,7 @@ void sv803_device::device_reset()
// IMPLEMENTATION
//**************************************************************************
-READ8_MEMBER( sv803_device::mreq_r )
+uint8_t sv803_device::mreq_r(offs_t offset)
{
if (offset >= 0x8000 && offset <= 0xbfff)
return m_ram[offset - 0x8000];
@@ -64,7 +64,7 @@ READ8_MEMBER( sv803_device::mreq_r )
return 0xff;
}
-WRITE8_MEMBER( sv803_device::mreq_w )
+void sv803_device::mreq_w(offs_t offset, uint8_t data)
{
if (offset >= 0x8000 && offset <= 0xbfff)
m_ram[offset - 0x8000] = data;
diff --git a/src/devices/bus/svi3x8/slot/sv803.h b/src/devices/bus/svi3x8/slot/sv803.h
index 6fd1d2b635a..8cae18acf64 100644
--- a/src/devices/bus/svi3x8/slot/sv803.h
+++ b/src/devices/bus/svi3x8/slot/sv803.h
@@ -26,8 +26,8 @@ public:
// construction/destruction
sv803_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- virtual DECLARE_READ8_MEMBER( mreq_r ) override;
- virtual DECLARE_WRITE8_MEMBER( mreq_w ) override;
+ virtual uint8_t mreq_r(offs_t offset) override;
+ virtual void mreq_w(offs_t offset, uint8_t data) override;
protected:
virtual void device_start() override;
diff --git a/src/devices/bus/svi3x8/slot/sv805.cpp b/src/devices/bus/svi3x8/slot/sv805.cpp
index bc4dc77c19f..cdcaee6f167 100644
--- a/src/devices/bus/svi3x8/slot/sv805.cpp
+++ b/src/devices/bus/svi3x8/slot/sv805.cpp
@@ -65,7 +65,7 @@ void sv805_device::device_start()
// IMPLEMENTATION
//**************************************************************************
-READ8_MEMBER( sv805_device::iorq_r )
+uint8_t sv805_device::iorq_r(offs_t offset)
{
switch (offset)
{
@@ -77,13 +77,13 @@ READ8_MEMBER( sv805_device::iorq_r )
case 0x2d:
case 0x2e:
case 0x2f:
- return m_uart->ins8250_r(space, offset & 0x07);
+ return m_uart->ins8250_r(machine().dummy_space(), offset & 0x07);
}
return 0xff;
}
-WRITE8_MEMBER( sv805_device::iorq_w )
+void sv805_device::iorq_w(offs_t offset, uint8_t data)
{
switch (offset)
{
@@ -95,7 +95,7 @@ WRITE8_MEMBER( sv805_device::iorq_w )
case 0x2d:
case 0x2e:
case 0x2f:
- m_uart->ins8250_w(space, offset & 0x07, data);
+ m_uart->ins8250_w(machine().dummy_space(), offset & 0x07, data);
}
}
diff --git a/src/devices/bus/svi3x8/slot/sv805.h b/src/devices/bus/svi3x8/slot/sv805.h
index 3a6f350a490..892dc23b432 100644
--- a/src/devices/bus/svi3x8/slot/sv805.h
+++ b/src/devices/bus/svi3x8/slot/sv805.h
@@ -28,8 +28,8 @@ public:
// construction/destruction
sv805_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- virtual DECLARE_READ8_MEMBER( iorq_r ) override;
- virtual DECLARE_WRITE8_MEMBER( iorq_w ) override;
+ virtual uint8_t iorq_r(offs_t offset) override;
+ virtual void iorq_w(offs_t offset, uint8_t data) override;
protected:
virtual void device_add_mconfig(machine_config &config) override;
diff --git a/src/devices/bus/svi3x8/slot/sv806.cpp b/src/devices/bus/svi3x8/slot/sv806.cpp
index 5408aa8738c..aed4fb80bda 100644
--- a/src/devices/bus/svi3x8/slot/sv806.cpp
+++ b/src/devices/bus/svi3x8/slot/sv806.cpp
@@ -114,7 +114,7 @@ MC6845_UPDATE_ROW( sv806_device::crtc_update_row )
}
}
-READ8_MEMBER( sv806_device::mreq_r )
+uint8_t sv806_device::mreq_r(offs_t offset)
{
if (offset >= 0xf000 && m_ram_enabled)
{
@@ -125,7 +125,7 @@ READ8_MEMBER( sv806_device::mreq_r )
return 0xff;
}
-WRITE8_MEMBER( sv806_device::mreq_w )
+void sv806_device::mreq_w(offs_t offset, uint8_t data)
{
if (offset >= 0xf000 && m_ram_enabled)
{
@@ -134,20 +134,20 @@ WRITE8_MEMBER( sv806_device::mreq_w )
}
}
-READ8_MEMBER( sv806_device::iorq_r )
+uint8_t sv806_device::iorq_r(offs_t offset)
{
if (offset == 0x51)
- return m_crtc->register_r(space, 0);
+ return m_crtc->register_r();
return 0xff;
}
-WRITE8_MEMBER( sv806_device::iorq_w )
+void sv806_device::iorq_w(offs_t offset, uint8_t data)
{
switch (offset)
{
- case 0x50: m_crtc->address_w(space, 0, data); break;
- case 0x51: m_crtc->register_w(space, 0, data); break;
+ case 0x50: m_crtc->address_w(data); break;
+ case 0x51: m_crtc->register_w(data); break;
case 0x58: m_ram_enabled = data; break;
}
}
diff --git a/src/devices/bus/svi3x8/slot/sv806.h b/src/devices/bus/svi3x8/slot/sv806.h
index 868117b8565..e6af5071c56 100644
--- a/src/devices/bus/svi3x8/slot/sv806.h
+++ b/src/devices/bus/svi3x8/slot/sv806.h
@@ -28,10 +28,10 @@ public:
// construction/destruction
sv806_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- virtual DECLARE_READ8_MEMBER( mreq_r ) override;
- virtual DECLARE_WRITE8_MEMBER( mreq_w ) override;
- virtual DECLARE_READ8_MEMBER( iorq_r ) override;
- virtual DECLARE_WRITE8_MEMBER( iorq_w ) override;
+ virtual uint8_t mreq_r(offs_t offset) override;
+ virtual void mreq_w(offs_t offset, uint8_t data) override;
+ virtual uint8_t iorq_r(offs_t offset) override;
+ virtual void iorq_w(offs_t offset, uint8_t data) override;
protected:
virtual const tiny_rom_entry *device_rom_region() const override;
diff --git a/src/devices/bus/svi3x8/slot/sv807.cpp b/src/devices/bus/svi3x8/slot/sv807.cpp
index 6ea6a77a6bc..281b7845c64 100644
--- a/src/devices/bus/svi3x8/slot/sv807.cpp
+++ b/src/devices/bus/svi3x8/slot/sv807.cpp
@@ -118,7 +118,7 @@ void sv807_device::device_reset()
// test setup: S2 = enabled (22), S3 = enabled (31)
-READ8_MEMBER( sv807_device::mreq_r )
+uint8_t sv807_device::mreq_r(offs_t offset)
{
if ((BK21_ACTIVE || BK31_ACTIVE) && offset < 0x8000)
{
@@ -135,7 +135,7 @@ READ8_MEMBER( sv807_device::mreq_r )
return 0xff;
}
-WRITE8_MEMBER( sv807_device::mreq_w )
+void sv807_device::mreq_w(offs_t offset, uint8_t data)
{
if ((BK21_ACTIVE || BK31_ACTIVE) && offset < 0x8000)
{
diff --git a/src/devices/bus/svi3x8/slot/sv807.h b/src/devices/bus/svi3x8/slot/sv807.h
index e3f12201d37..8d12befff79 100644
--- a/src/devices/bus/svi3x8/slot/sv807.h
+++ b/src/devices/bus/svi3x8/slot/sv807.h
@@ -29,8 +29,8 @@ public:
// optional information overrides
virtual ioport_constructor device_input_ports() const override;
- virtual DECLARE_READ8_MEMBER( mreq_r ) override;
- virtual DECLARE_WRITE8_MEMBER( mreq_w ) override;
+ virtual uint8_t mreq_r(offs_t offset) override;
+ virtual void mreq_w(offs_t offset, uint8_t data) override;
virtual void bk21_w(int state) override;
virtual void bk22_w(int state) override;
diff --git a/src/devices/bus/ti8x/bitsocket.cpp b/src/devices/bus/ti8x/bitsocket.cpp
index e9394788d94..bfe7849aa40 100644
--- a/src/devices/bus/ti8x/bitsocket.cpp
+++ b/src/devices/bus/ti8x/bitsocket.cpp
@@ -25,9 +25,10 @@ bit_socket_device::bit_socket_device(
}
-MACHINE_CONFIG_START(bit_socket_device::device_add_mconfig)
- MCFG_DEVICE_ADD("stream", BITBANGER, 0)
-MACHINE_CONFIG_END
+void bit_socket_device::device_add_mconfig(machine_config &config)
+{
+ BITBANGER(config, m_stream, 0);
+}
void bit_socket_device::device_start()
diff --git a/src/devices/bus/ti8x/teeconn.cpp b/src/devices/bus/ti8x/teeconn.cpp
index a251ee1ca4b..7277d4af93e 100644
--- a/src/devices/bus/ti8x/teeconn.cpp
+++ b/src/devices/bus/ti8x/teeconn.cpp
@@ -61,15 +61,16 @@ WRITE_LINE_MEMBER(tee_connector_device::ring_b_w)
}
-MACHINE_CONFIG_START(tee_connector_device::device_add_mconfig)
- MCFG_DEVICE_ADD(m_port_a, TI8X_LINK_PORT, default_ti8x_link_devices, nullptr)
- MCFG_TI8X_LINK_TIP_HANDLER(WRITELINE(*this, tee_connector_device, tip_a_w))
- MCFG_TI8X_LINK_RING_HANDLER(WRITELINE(*this, tee_connector_device, ring_a_w))
-
- MCFG_DEVICE_ADD(m_port_b, TI8X_LINK_PORT, default_ti8x_link_devices, nullptr)
- MCFG_TI8X_LINK_TIP_HANDLER(WRITELINE(*this, tee_connector_device, tip_b_w))
- MCFG_TI8X_LINK_RING_HANDLER(WRITELINE(*this, tee_connector_device, ring_b_w))
-MACHINE_CONFIG_END
+void tee_connector_device::device_add_mconfig(machine_config &config)
+{
+ TI8X_LINK_PORT(config, m_port_a, default_ti8x_link_devices, nullptr);
+ m_port_a->tip_handler().set(FUNC(tee_connector_device::tip_a_w));
+ m_port_a->ring_handler().set(FUNC(tee_connector_device::ring_a_w));
+
+ TI8X_LINK_PORT(config, m_port_b, default_ti8x_link_devices, nullptr);
+ m_port_b->tip_handler().set(FUNC(tee_connector_device::tip_b_w));
+ m_port_b->ring_handler().set(FUNC(tee_connector_device::ring_b_w));
+}
void tee_connector_device::device_start()
diff --git a/src/devices/bus/ti8x/ti8x.h b/src/devices/bus/ti8x/ti8x.h
index 1a01aeda2e3..e81a4fc5a9e 100644
--- a/src/devices/bus/ti8x/ti8x.h
+++ b/src/devices/bus/ti8x/ti8x.h
@@ -42,13 +42,6 @@
DECLARE_DEVICE_TYPE(TI8X_LINK_PORT, ti8x_link_port_device)
-#define MCFG_TI8X_LINK_TIP_HANDLER(cb) \
- downcast<ti8x_link_port_device &>(*device).set_tip_handler(DEVCB_##cb);
-
-#define MCFG_TI8X_LINK_RING_HANDLER(cb) \
- downcast<ti8x_link_port_device &>(*device).set_ring_handler(DEVCB_##cb);
-
-
class device_ti8x_link_port_interface;
@@ -67,8 +60,8 @@ public:
ti8x_link_port_device(machine_config const &mconfig, char const *tag, device_t *owner, u32 clock = 0);
// static configuration helpers
- template <class Object> devcb_base &set_tip_handler(Object &&cb) { return m_tip_handler.set_callback(std::forward<Object>(cb)); }
- template <class Object> devcb_base &set_ring_handler(Object &&cb) { return m_ring_handler.set_callback(std::forward<Object>(cb)); }
+ auto tip_handler() { return m_tip_handler.bind(); }
+ auto ring_handler() { return m_ring_handler.bind(); }
DECLARE_WRITE_LINE_MEMBER(tip_w);
DECLARE_WRITE_LINE_MEMBER(ring_w);
diff --git a/src/devices/bus/ti8x/tispeaker.cpp b/src/devices/bus/ti8x/tispeaker.cpp
index 17d81fe10b9..ed9ec36a5ec 100644
--- a/src/devices/bus/ti8x/tispeaker.cpp
+++ b/src/devices/bus/ti8x/tispeaker.cpp
@@ -26,16 +26,15 @@ stereo_speaker_device::stereo_speaker_device(
}
-MACHINE_CONFIG_START(stereo_speaker_device::device_add_mconfig)
+void stereo_speaker_device::device_add_mconfig(machine_config &config)
+{
SPEAKER(config, "outl").front_left();
SPEAKER(config, "outr").front_right();
- MCFG_DEVICE_ADD("lspkr", SPEAKER_SOUND, 0)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "outl", 0.50)
+ SPEAKER_SOUND(config, m_left_speaker, 0).add_route(ALL_OUTPUTS, "outl", 0.50);
- MCFG_DEVICE_ADD("rspkr", SPEAKER_SOUND, 0)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "outr", 0.50)
-MACHINE_CONFIG_END
+ SPEAKER_SOUND(config, m_right_speaker, 0).add_route(ALL_OUTPUTS, "outr", 0.50);
+}
void stereo_speaker_device::device_start()
@@ -70,12 +69,12 @@ mono_speaker_device::mono_speaker_device(
}
-MACHINE_CONFIG_START(mono_speaker_device::device_add_mconfig)
+void mono_speaker_device::device_add_mconfig(machine_config &config)
+{
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("spkr", SPEAKER_SOUND, 0)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.50)
-MACHINE_CONFIG_END
+ SPEAKER_SOUND(config, m_speaker, 0).add_route(ALL_OUTPUTS, "mono", 0.50);
+}
void mono_speaker_device::device_start()
diff --git a/src/devices/bus/ti99/gromport/cartridges.cpp b/src/devices/bus/ti99/gromport/cartridges.cpp
index 7e93029f97f..d3f3f75a10a 100644
--- a/src/devices/bus/ti99/gromport/cartridges.cpp
+++ b/src/devices/bus/ti99/gromport/cartridges.cpp
@@ -341,23 +341,23 @@ void ti99_cartridge_device::set_slot(int i)
READ8Z_MEMBER(ti99_cartridge_device::readz)
{
if (m_pcb != nullptr)
- m_pcb->readz(space, offset, value);
+ m_pcb->readz(offset, value);
}
-WRITE8_MEMBER(ti99_cartridge_device::write)
+void ti99_cartridge_device::write(offs_t offset, uint8_t data)
{
if (m_pcb != nullptr)
- m_pcb->write(space, offset, data);
+ m_pcb->write(offset, data);
}
READ8Z_MEMBER(ti99_cartridge_device::crureadz)
{
- if (m_pcb != nullptr) m_pcb->crureadz(space, offset, value);
+ if (m_pcb != nullptr) m_pcb->crureadz(offset, value);
}
-WRITE8_MEMBER(ti99_cartridge_device::cruwrite)
+void ti99_cartridge_device::cruwrite(offs_t offset, uint8_t data)
{
- if (m_pcb != nullptr) m_pcb->cruwrite(space, offset, data);
+ if (m_pcb != nullptr) m_pcb->cruwrite(offset, data);
}
WRITE_LINE_MEMBER( ti99_cartridge_device::ready_line )
@@ -509,7 +509,7 @@ READ8Z_MEMBER(ti99_cartridge_pcb::readz)
}
}
-WRITE8_MEMBER(ti99_cartridge_pcb::write)
+void ti99_cartridge_pcb::write(offs_t offset, uint8_t data)
{
if (m_romspace_selected)
{
@@ -526,7 +526,7 @@ READ8Z_MEMBER(ti99_cartridge_pcb::crureadz)
{
}
-WRITE8_MEMBER(ti99_cartridge_pcb::cruwrite)
+void ti99_cartridge_pcb::cruwrite(offs_t offset, uint8_t data)
{
}
@@ -614,7 +614,7 @@ READ8Z_MEMBER(ti99_paged12k_cartridge::readz)
}
}
-WRITE8_MEMBER(ti99_paged12k_cartridge::write)
+void ti99_paged12k_cartridge::write(offs_t offset, uint8_t data)
{
if (m_romspace_selected)
{
@@ -663,7 +663,7 @@ READ8Z_MEMBER(ti99_paged16k_cartridge::readz)
}
}
-WRITE8_MEMBER(ti99_paged16k_cartridge::write)
+void ti99_paged16k_cartridge::write(offs_t offset, uint8_t data)
{
if (m_romspace_selected)
{
@@ -720,7 +720,7 @@ READ8Z_MEMBER(ti99_minimem_cartridge::readz)
}
/* Write function for the minimem cartridge. */
-WRITE8_MEMBER(ti99_minimem_cartridge::write)
+void ti99_minimem_cartridge::write(offs_t offset, uint8_t data)
{
if (m_romspace_selected)
{
@@ -788,7 +788,7 @@ READ8Z_MEMBER(ti99_super_cartridge::readz)
}
/* Write function for the super cartridge. */
-WRITE8_MEMBER(ti99_super_cartridge::write)
+void ti99_super_cartridge::write(offs_t offset, uint8_t data)
{
if (m_romspace_selected)
{
@@ -826,19 +826,15 @@ READ8Z_MEMBER(ti99_super_cartridge::crureadz)
// SRL R0,1 Restore Bank Number (optional)
// RT
- // Our implementation in MESS always gets 8 bits in one go. Also, the address
- // is twice the bit number. That is, the offset value is always a multiple
- // of 0x10.
-
if ((offset & 0xfff0) == 0x0800)
{
LOGMASKED(LOG_CRU, "CRU accessed at %04x\n", offset);
uint8_t val = 0x02 << (m_ram_page << 1);
- *value = (val >> ((offset - 0x0800)>>1)) & 0xff;
+ *value = BIT(val, (offset & 0x000e) >> 1);
}
}
-WRITE8_MEMBER(ti99_super_cartridge::cruwrite)
+void ti99_super_cartridge::cruwrite(offs_t offset, uint8_t data)
{
if ((offset & 0xfff0) == 0x0800)
{
@@ -923,7 +919,7 @@ READ8Z_MEMBER(ti99_mbx_cartridge::readz)
}
/* Write function for the mbx cartridge. */
-WRITE8_MEMBER(ti99_mbx_cartridge::write)
+void ti99_mbx_cartridge::write(offs_t offset, uint8_t data)
{
if (m_romspace_selected)
{
@@ -999,7 +995,7 @@ READ8Z_MEMBER(ti99_paged7_cartridge::readz)
}
/* Write function for the paged7 cartridge. */
-WRITE8_MEMBER(ti99_paged7_cartridge::write)
+void ti99_paged7_cartridge::write(offs_t offset, uint8_t data)
{
if (m_romspace_selected)
{
@@ -1071,7 +1067,7 @@ READ8Z_MEMBER(ti99_paged379i_cartridge::readz)
}
/* Write function for the paged379i cartridge. Only used to set the bank. */
-WRITE8_MEMBER(ti99_paged379i_cartridge::write)
+void ti99_paged379i_cartridge::write(offs_t offset, uint8_t data)
{
// Bits: 011x xxxx xxxb bbbx
// x = don't care, bbbb = bank
@@ -1122,7 +1118,7 @@ READ8Z_MEMBER(ti99_paged378_cartridge::readz)
}
/* Write function for the paged378 cartridge. Only used to set the bank. */
-WRITE8_MEMBER(ti99_paged378_cartridge::write)
+void ti99_paged378_cartridge::write(offs_t offset, uint8_t data)
{
// Bits: 011x xxxx xbbb bbbx
// x = don't care, bbbb = bank
@@ -1162,7 +1158,7 @@ READ8Z_MEMBER(ti99_paged377_cartridge::readz)
}
/* Write function for the paged377 cartridge. Only used to set the bank. */
-WRITE8_MEMBER(ti99_paged377_cartridge::write)
+void ti99_paged377_cartridge::write(offs_t offset, uint8_t data)
{
// Bits: 011x xxxb bbbb bbbx
// x = don't care, bbbb = bank
@@ -1216,7 +1212,7 @@ READ8Z_MEMBER(ti99_pagedcru_cartridge::readz)
}
/* Write function for the pagedcru cartridge. No effect. */
-WRITE8_MEMBER(ti99_pagedcru_cartridge::write)
+void ti99_pagedcru_cartridge::write(offs_t offset, uint8_t data)
{
return;
}
@@ -1231,11 +1227,11 @@ READ8Z_MEMBER(ti99_pagedcru_cartridge::crureadz)
{
page = page-(bit/2); // 4 page flags per 8 bits
}
- *value = 1 << (page*2+1);
+ *value = (offset & 0x000e) == (page * 4 + 2) ? 1 : 0;
}
}
-WRITE8_MEMBER(ti99_pagedcru_cartridge::cruwrite)
+void ti99_pagedcru_cartridge::cruwrite(offs_t offset, uint8_t data)
{
if ((offset & 0xf800)==0x0800)
{
@@ -1307,7 +1303,7 @@ READ8Z_MEMBER(ti99_gromemu_cartridge::readz)
{
if (m_grom_selected)
{
- if (m_grom_read_mode) gromemureadz(space, offset, value, mem_mask);
+ if (m_grom_read_mode) gromemureadz(offset, value);
}
else
{
@@ -1327,7 +1323,7 @@ READ8Z_MEMBER(ti99_gromemu_cartridge::readz)
}
}
-WRITE8_MEMBER(ti99_gromemu_cartridge::write)
+void ti99_gromemu_cartridge::write(offs_t offset, uint8_t data)
{
if (m_romspace_selected)
{
@@ -1348,7 +1344,7 @@ WRITE8_MEMBER(ti99_gromemu_cartridge::write)
// Will not change anything when not selected (preceding gsq=ASSERT)
if (m_grom_selected)
{
- if (!m_grom_read_mode) gromemuwrite(space, offset, data, mem_mask);
+ if (!m_grom_read_mode) gromemuwrite(offset, data);
}
}
}
@@ -1373,7 +1369,7 @@ READ8Z_MEMBER(ti99_gromemu_cartridge::gromemureadz)
m_waddr_LSB = false;
}
-WRITE8_MEMBER(ti99_gromemu_cartridge::gromemuwrite)
+void ti99_gromemu_cartridge::gromemuwrite(offs_t offset, uint8_t data)
{
// Set GROM address
if (m_grom_address_mode)
diff --git a/src/devices/bus/ti99/gromport/cartridges.h b/src/devices/bus/ti99/gromport/cartridges.h
index b969e65eccf..e2e729f2d59 100644
--- a/src/devices/bus/ti99/gromport/cartridges.h
+++ b/src/devices/bus/ti99/gromport/cartridges.h
@@ -66,9 +66,9 @@ public:
ti99_cartridge_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
DECLARE_READ8Z_MEMBER(readz);
- DECLARE_WRITE8_MEMBER(write);
+ void write(offs_t offset, uint8_t data);
DECLARE_READ8Z_MEMBER(crureadz);
- DECLARE_WRITE8_MEMBER(cruwrite);
+ void cruwrite(offs_t offset, uint8_t data);
DECLARE_WRITE_LINE_MEMBER(ready_line);
DECLARE_WRITE_LINE_MEMBER(romgq_line);
@@ -213,9 +213,9 @@ public:
protected:
virtual DECLARE_READ8Z_MEMBER(readz);
- virtual DECLARE_WRITE8_MEMBER(write);
+ virtual void write(offs_t offset, uint8_t data);
virtual DECLARE_READ8Z_MEMBER(crureadz);
- virtual DECLARE_WRITE8_MEMBER(cruwrite);
+ virtual void cruwrite(offs_t offset, uint8_t data);
DECLARE_WRITE_LINE_MEMBER(romgq_line);
virtual void set_gromlines(line_state mline, line_state moline, line_state gsq);
@@ -263,7 +263,7 @@ class ti99_paged12k_cartridge : public ti99_cartridge_pcb
{
public:
DECLARE_READ8Z_MEMBER(readz) override;
- DECLARE_WRITE8_MEMBER(write) override;
+ void write(offs_t offset, uint8_t data) override;
};
/*********** Paged cartridge (others) ********************/
@@ -272,7 +272,7 @@ class ti99_paged16k_cartridge : public ti99_cartridge_pcb
{
public:
DECLARE_READ8Z_MEMBER(readz) override;
- DECLARE_WRITE8_MEMBER(write) override;
+ void write(offs_t offset, uint8_t data) override;
};
/*********** Paged7 cartridge (late carts) ********************/
@@ -281,7 +281,7 @@ class ti99_paged7_cartridge : public ti99_cartridge_pcb
{
public:
DECLARE_READ8Z_MEMBER(readz) override;
- DECLARE_WRITE8_MEMBER(write) override;
+ void write(offs_t offset, uint8_t data) override;
};
/********************** Mini Memory ***********************************/
@@ -290,7 +290,7 @@ class ti99_minimem_cartridge : public ti99_cartridge_pcb
{
public:
DECLARE_READ8Z_MEMBER(readz) override;
- DECLARE_WRITE8_MEMBER(write) override;
+ void write(offs_t offset, uint8_t data) override;
};
/********************* Super Space II *********************************/
@@ -299,9 +299,9 @@ class ti99_super_cartridge : public ti99_cartridge_pcb
{
public:
DECLARE_READ8Z_MEMBER(readz) override;
- DECLARE_WRITE8_MEMBER(write) override;
+ void write(offs_t offset, uint8_t data) override;
DECLARE_READ8Z_MEMBER(crureadz) override;
- DECLARE_WRITE8_MEMBER(cruwrite) override;
+ void cruwrite(offs_t offset, uint8_t data) override;
};
/************************* MBX ***************************************/
@@ -310,7 +310,7 @@ class ti99_mbx_cartridge : public ti99_cartridge_pcb
{
public:
DECLARE_READ8Z_MEMBER(readz) override;
- DECLARE_WRITE8_MEMBER(write) override;
+ void write(offs_t offset, uint8_t data) override;
};
/********************** Paged 379i ************************************/
@@ -319,7 +319,7 @@ class ti99_paged379i_cartridge : public ti99_cartridge_pcb
{
public:
DECLARE_READ8Z_MEMBER(readz) override;
- DECLARE_WRITE8_MEMBER(write) override;
+ void write(offs_t offset, uint8_t data) override;
private:
int get_paged379i_bank(int rompage);
};
@@ -330,7 +330,7 @@ class ti99_paged378_cartridge : public ti99_cartridge_pcb
{
public:
DECLARE_READ8Z_MEMBER(readz) override;
- DECLARE_WRITE8_MEMBER(write) override;
+ void write(offs_t offset, uint8_t data) override;
};
/********************** Paged 377 ************************************/
@@ -339,7 +339,7 @@ class ti99_paged377_cartridge : public ti99_cartridge_pcb
{
public:
DECLARE_READ8Z_MEMBER(readz) override;
- DECLARE_WRITE8_MEMBER(write) override;
+ void write(offs_t offset, uint8_t data) override;
};
/********************** Paged CRU ************************************/
@@ -348,9 +348,9 @@ class ti99_pagedcru_cartridge : public ti99_cartridge_pcb
{
public:
DECLARE_READ8Z_MEMBER(readz) override;
- DECLARE_WRITE8_MEMBER(write) override;
+ void write(offs_t offset, uint8_t data) override;
DECLARE_READ8Z_MEMBER(crureadz) override;
- DECLARE_WRITE8_MEMBER(cruwrite) override;
+ void cruwrite(offs_t offset, uint8_t data) override;
};
/********************** GROM emulation cartridge ************************************/
@@ -361,9 +361,9 @@ public:
ti99_gromemu_cartridge(): m_waddr_LSB(false), m_grom_selected(false), m_grom_read_mode(false), m_grom_address_mode(false)
{ m_grom_address = 0; }
DECLARE_READ8Z_MEMBER(readz) override;
- DECLARE_WRITE8_MEMBER(write) override;
+ void write(offs_t offset, uint8_t data) override;
DECLARE_READ8Z_MEMBER(gromemureadz);
- DECLARE_WRITE8_MEMBER(gromemuwrite);
+ void gromemuwrite(offs_t offset, uint8_t data);
void set_gromlines(line_state mline, line_state moline, line_state gsq) override;
private:
diff --git a/src/devices/bus/ti99/gromport/gkracker.cpp b/src/devices/bus/ti99/gromport/gkracker.cpp
index d9de20949b2..57ccfbc87e1 100644
--- a/src/devices/bus/ti99/gromport/gkracker.cpp
+++ b/src/devices/bus/ti99/gromport/gkracker.cpp
@@ -227,18 +227,18 @@ READ8Z_MEMBER(ti99_gkracker_device::readz)
uint8_t val1 = *value;
// Read from the guest cartridge.
- m_cartridge->readz(space, offset, value, mem_mask);
+ m_cartridge->readz(offset, value);
if (val1 != *value)
LOGMASKED(LOG_GKRACKER, "Read (from guest) %04x -> %02x\n", offset, *value);
}
}
-WRITE8_MEMBER(ti99_gkracker_device::write)
+void ti99_gkracker_device::write(offs_t offset, uint8_t data)
{
// write to the guest cartridge if present
if (m_cartridge != nullptr)
{
- m_cartridge->write(space, offset, data, mem_mask);
+ m_cartridge->write(offset, data);
}
if (m_grom_selected)
@@ -307,12 +307,12 @@ WRITE8_MEMBER(ti99_gkracker_device::write)
READ8Z_MEMBER( ti99_gkracker_device::crureadz )
{
- if (m_cartridge != nullptr) m_cartridge->crureadz(space, offset, value);
+ if (m_cartridge != nullptr) m_cartridge->crureadz(offset, value);
}
-WRITE8_MEMBER( ti99_gkracker_device::cruwrite )
+void ti99_gkracker_device::cruwrite(offs_t offset, uint8_t data)
{
- if (m_cartridge != nullptr) m_cartridge->cruwrite(space, offset, data);
+ if (m_cartridge != nullptr) m_cartridge->cruwrite(offset, data);
}
INPUT_CHANGED_MEMBER( ti99_gkracker_device::gk_changed )
diff --git a/src/devices/bus/ti99/gromport/gkracker.h b/src/devices/bus/ti99/gromport/gkracker.h
index bb3d278d57a..34b267bf640 100644
--- a/src/devices/bus/ti99/gromport/gkracker.h
+++ b/src/devices/bus/ti99/gromport/gkracker.h
@@ -19,9 +19,9 @@ public:
ti99_gkracker_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
DECLARE_READ8Z_MEMBER(readz) override;
- DECLARE_WRITE8_MEMBER(write) override;
+ void write(offs_t offset, uint8_t data) override;
DECLARE_READ8Z_MEMBER(crureadz) override;
- DECLARE_WRITE8_MEMBER(cruwrite) override;
+ void cruwrite(offs_t offset, uint8_t data) override;
DECLARE_WRITE_LINE_MEMBER(romgq_line) override;
void set_gromlines(line_state mline, line_state moline, line_state gsq) override;
diff --git a/src/devices/bus/ti99/gromport/gromport.cpp b/src/devices/bus/ti99/gromport/gromport.cpp
index b6fa23e1111..5f893aa4423 100644
--- a/src/devices/bus/ti99/gromport/gromport.cpp
+++ b/src/devices/bus/ti99/gromport/gromport.cpp
@@ -143,7 +143,7 @@ READ8Z_MEMBER(gromport_device::readz)
{
if (m_connector != nullptr)
{
- m_connector->readz(space, offset & m_mask, value);
+ m_connector->readz(offset & m_mask, value);
if (m_romgq) LOGMASKED(LOG_READ, "Read %04x -> %02x\n", offset | 0x6000, *value);
}
}
@@ -152,25 +152,25 @@ READ8Z_MEMBER(gromport_device::readz)
Writing via the GROM port. Only 13 address lines are passed through
on the TI-99/4A, and 14 lines on the TI-99/8.
*/
-WRITE8_MEMBER(gromport_device::write)
+void gromport_device::write(offs_t offset, uint8_t data)
{
if (m_connector != nullptr)
{
if (m_romgq) LOGMASKED(LOG_WRITE, "Write %04x <- %02x\n", offset | 0x6000, data);
- m_connector->write(space, offset & m_mask, data);
+ m_connector->write(offset & m_mask, data);
}
}
READ8Z_MEMBER(gromport_device::crureadz)
{
if (m_connector != nullptr)
- m_connector->crureadz(space, offset, value);
+ m_connector->crureadz(offset, value);
}
-WRITE8_MEMBER(gromport_device::cruwrite)
+void gromport_device::cruwrite(offs_t offset, uint8_t data)
{
if (m_connector != nullptr)
- m_connector->cruwrite(space, offset, data);
+ m_connector->cruwrite(offset, data);
}
WRITE_LINE_MEMBER(gromport_device::ready_line)
diff --git a/src/devices/bus/ti99/gromport/gromport.h b/src/devices/bus/ti99/gromport/gromport.h
index 8d5c61ce78d..9c04ef5a8b8 100644
--- a/src/devices/bus/ti99/gromport/gromport.h
+++ b/src/devices/bus/ti99/gromport/gromport.h
@@ -39,10 +39,11 @@ public:
}
gromport_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+
DECLARE_READ8Z_MEMBER(readz);
- DECLARE_WRITE8_MEMBER(write);
+ void write(offs_t offset, uint8_t data);
DECLARE_READ8Z_MEMBER(crureadz);
- DECLARE_WRITE8_MEMBER(cruwrite);
+ void cruwrite(offs_t offset, uint8_t data);
DECLARE_WRITE_LINE_MEMBER(ready_line);
DECLARE_WRITE_LINE_MEMBER(romgq_line);
void set_gromlines(line_state mline, line_state moline, line_state gsq);
@@ -76,11 +77,11 @@ class cartridge_connector_device : public device_t
{
public:
virtual DECLARE_READ8Z_MEMBER(readz) = 0;
- virtual DECLARE_WRITE8_MEMBER(write) = 0;
+ virtual void write(offs_t offset, uint8_t data) = 0;
virtual DECLARE_SETADDRESS_DBIN_MEMBER( setaddress_dbin ) { }
virtual DECLARE_READ8Z_MEMBER(crureadz) = 0;
- virtual DECLARE_WRITE8_MEMBER(cruwrite) = 0;
+ virtual void cruwrite(offs_t offset, uint8_t data) = 0;
virtual DECLARE_WRITE_LINE_MEMBER(romgq_line) = 0;
virtual void set_gromlines(line_state mline, line_state moline, line_state gsq) =0;
diff --git a/src/devices/bus/ti99/gromport/multiconn.cpp b/src/devices/bus/ti99/gromport/multiconn.cpp
index efaf57d649d..191853f1029 100644
--- a/src/devices/bus/ti99/gromport/multiconn.cpp
+++ b/src/devices/bus/ti99/gromport/multiconn.cpp
@@ -195,7 +195,7 @@ READ8Z_MEMBER(ti99_multi_cart_conn_device::readz)
if (m_cartridge[i] != nullptr)
{
uint8_t newval = *value;
- m_cartridge[i]->readz(space, offset, &newval, 0xff);
+ m_cartridge[i]->readz(offset, &newval);
if (i==slot)
{
*value = newval;
@@ -207,12 +207,12 @@ READ8Z_MEMBER(ti99_multi_cart_conn_device::readz)
{
if (slot < NUMBER_OF_CARTRIDGE_SLOTS && m_cartridge[slot] != nullptr)
{
- m_cartridge[slot]->readz(space, offset, value, 0xff);
+ m_cartridge[slot]->readz(offset, value);
}
}
}
-WRITE8_MEMBER(ti99_multi_cart_conn_device::write)
+void ti99_multi_cart_conn_device::write(offs_t offset, uint8_t data)
{
// Same issue as above (read)
// We don't have GRAM cartridges, anyway, so it's just used for setting the address.
@@ -222,7 +222,7 @@ WRITE8_MEMBER(ti99_multi_cart_conn_device::write)
{
if (elem != nullptr)
{
- elem->write(space, offset, data, 0xff);
+ elem->write(offset, data);
}
}
}
@@ -232,7 +232,7 @@ WRITE8_MEMBER(ti99_multi_cart_conn_device::write)
if (slot < NUMBER_OF_CARTRIDGE_SLOTS && m_cartridge[slot] != nullptr)
{
// logerror("writing %04x (slot %d) <- %02x\n", offset, slot, data);
- m_cartridge[slot]->write(space, offset, data, 0xff);
+ m_cartridge[slot]->write(offset, data);
}
}
}
@@ -246,11 +246,11 @@ READ8Z_MEMBER(ti99_multi_cart_conn_device::crureadz)
if (m_cartridge[slot] != nullptr)
{
- m_cartridge[slot]->crureadz(space, offset, value);
+ m_cartridge[slot]->crureadz(offset, value);
}
}
-WRITE8_MEMBER(ti99_multi_cart_conn_device::cruwrite)
+void ti99_multi_cart_conn_device::cruwrite(offs_t offset, uint8_t data)
{
int slot = get_active_slot(true, offset);
@@ -260,7 +260,7 @@ WRITE8_MEMBER(ti99_multi_cart_conn_device::cruwrite)
if (m_cartridge[slot] != nullptr)
{
- m_cartridge[slot]->cruwrite(space, offset, data);
+ m_cartridge[slot]->cruwrite(offset, data);
}
}
diff --git a/src/devices/bus/ti99/gromport/multiconn.h b/src/devices/bus/ti99/gromport/multiconn.h
index 97b9308eb36..56a5915cfb2 100644
--- a/src/devices/bus/ti99/gromport/multiconn.h
+++ b/src/devices/bus/ti99/gromport/multiconn.h
@@ -24,9 +24,9 @@ public:
ti99_multi_cart_conn_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
DECLARE_READ8Z_MEMBER(readz) override;
- DECLARE_WRITE8_MEMBER(write) override;
+ void write(offs_t offset, uint8_t data) override;
DECLARE_READ8Z_MEMBER(crureadz) override;
- DECLARE_WRITE8_MEMBER(cruwrite) override;
+ void cruwrite(offs_t offset, uint8_t data) override;
DECLARE_WRITE_LINE_MEMBER(romgq_line) override;
void set_gromlines(line_state mline, line_state moline, line_state gsq) override;
DECLARE_WRITE_LINE_MEMBER(gclock_in) override;
diff --git a/src/devices/bus/ti99/gromport/singleconn.cpp b/src/devices/bus/ti99/gromport/singleconn.cpp
index c967cf503f2..9a0b905a9e7 100644
--- a/src/devices/bus/ti99/gromport/singleconn.cpp
+++ b/src/devices/bus/ti99/gromport/singleconn.cpp
@@ -22,25 +22,25 @@ ti99_single_cart_conn_device::ti99_single_cart_conn_device(const machine_config
READ8Z_MEMBER(ti99_single_cart_conn_device::readz)
{
// Pass through
- m_cartridge->readz(space, offset, value);
+ m_cartridge->readz(offset, value);
}
-WRITE8_MEMBER(ti99_single_cart_conn_device::write)
+void ti99_single_cart_conn_device::write(offs_t offset, uint8_t data)
{
// Pass through
- m_cartridge->write(space, offset, data);
+ m_cartridge->write(offset, data);
}
READ8Z_MEMBER(ti99_single_cart_conn_device::crureadz)
{
// Pass through
- m_cartridge->crureadz(space, offset, value);
+ m_cartridge->crureadz(offset, value);
}
-WRITE8_MEMBER(ti99_single_cart_conn_device::cruwrite)
+void ti99_single_cart_conn_device::cruwrite(offs_t offset, uint8_t data)
{
// Pass through
- m_cartridge->cruwrite(space, offset, data);
+ m_cartridge->cruwrite(offset, data);
}
WRITE_LINE_MEMBER(ti99_single_cart_conn_device::romgq_line)
diff --git a/src/devices/bus/ti99/gromport/singleconn.h b/src/devices/bus/ti99/gromport/singleconn.h
index 10f1062f223..831d70ffb18 100644
--- a/src/devices/bus/ti99/gromport/singleconn.h
+++ b/src/devices/bus/ti99/gromport/singleconn.h
@@ -20,9 +20,9 @@ public:
ti99_single_cart_conn_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
DECLARE_READ8Z_MEMBER(readz) override;
- DECLARE_WRITE8_MEMBER(write) override;
+ void write(offs_t offset, uint8_t data) override;
DECLARE_READ8Z_MEMBER(crureadz) override;
- DECLARE_WRITE8_MEMBER(cruwrite) override;
+ void cruwrite(offs_t offset, uint8_t data) override;
DECLARE_WRITE_LINE_MEMBER(romgq_line) override;
void set_gromlines(line_state mline, line_state moline, line_state gsq) override;
DECLARE_WRITE_LINE_MEMBER(gclock_in) override;
diff --git a/src/devices/bus/ti99/internal/992board.cpp b/src/devices/bus/ti99/internal/992board.cpp
index 330bcee4566..071526016f2 100644
--- a/src/devices/bus/ti99/internal/992board.cpp
+++ b/src/devices/bus/ti99/internal/992board.cpp
@@ -456,15 +456,15 @@ void io992_device::device_start()
m_set_rom_bank.resolve();
}
-READ8_MEMBER(io992_device::cruread)
+uint8_t io992_device::cruread(offs_t offset)
{
- int address = offset << 4;
+ int address = offset << 1;
uint8_t value = 0x7f; // All Hexbus lines high
double inp = 0;
int i;
uint8_t bit = 1;
- switch (address)
+ switch (address & 0xf800)
{
case 0xe000:
// CRU E000-E7fE: Keyboard
@@ -494,10 +494,10 @@ READ8_MEMBER(io992_device::cruread)
LOGMASKED(LOG_CRU, "CRU %04x -> %02x\n", address, value);
- return value;
+ return BIT(value, offset & 7);
}
-WRITE8_MEMBER(io992_device::cruwrite)
+void io992_device::cruwrite(offs_t offset, uint8_t data)
{
int address = (offset << 1) & 0xf80e;
diff --git a/src/devices/bus/ti99/internal/992board.h b/src/devices/bus/ti99/internal/992board.h
index b9946ebe9c4..5b99519f81f 100644
--- a/src/devices/bus/ti99/internal/992board.h
+++ b/src/devices/bus/ti99/internal/992board.h
@@ -107,8 +107,8 @@ class io992_device : public bus::hexbus::hexbus_chained_device
public:
io992_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- DECLARE_READ8_MEMBER( cruread );
- DECLARE_WRITE8_MEMBER( cruwrite );
+ uint8_t cruread(offs_t offset);
+ void cruwrite(offs_t offset, uint8_t data);
void device_start() override;
ioport_constructor device_input_ports() const override;
auto rombank_cb() { return m_set_rom_bank.bind(); }
diff --git a/src/devices/bus/ti99/internal/998board.cpp b/src/devices/bus/ti99/internal/998board.cpp
index b81eeb01c59..96f1c3d07f3 100644
--- a/src/devices/bus/ti99/internal/998board.cpp
+++ b/src/devices/bus/ti99/internal/998board.cpp
@@ -198,7 +198,7 @@ mainboard8_device::mainboard8_device(const machine_config &mconfig, const char *
// Debugger support
// The memory accesses by the debugger are routed around the custom chip logic
-READ8_MEMBER( mainboard8_device::debugger_read )
+uint8_t mainboard8_device::debugger_read(offs_t offset)
{
int logical_address = offset;
bool compat_mode = (m_crus_debug==ASSERT_LINE);
@@ -243,7 +243,7 @@ READ8_MEMBER( mainboard8_device::debugger_read )
if (m_mofetta->hexbus_access_debug()) return m_rom1[(physical_address & 0x1fff) | 0x6000];
if (m_mofetta->intdsr_access_debug()) return m_rom1[(physical_address & 0x1fff) | 0x4000];
m_ioport->memen_in(ASSERT_LINE);
- m_ioport->readz(space, physical_address & 0xffff, &value);
+ m_ioport->readz(physical_address & 0xffff, &value);
m_ioport->memen_in(CLEAR_LINE);
return value;
}
@@ -251,7 +251,7 @@ READ8_MEMBER( mainboard8_device::debugger_read )
{
// Cartridge space lower 8
m_gromport->romgq_line(ASSERT_LINE);
- m_gromport->readz(space, physical_address & 0x1fff, &value);
+ m_gromport->readz(physical_address & 0x1fff, &value);
m_gromport->romgq_line(CLEAR_LINE);
return value;
}
@@ -259,7 +259,7 @@ READ8_MEMBER( mainboard8_device::debugger_read )
{
// Cartridge space upper 8
m_gromport->romgq_line(ASSERT_LINE);
- m_gromport->readz(space, (physical_address & 0x1fff) | 0x2000, &value);
+ m_gromport->readz((physical_address & 0x1fff) | 0x2000, &value);
m_gromport->romgq_line(CLEAR_LINE);
return value;
}
@@ -276,7 +276,7 @@ READ8_MEMBER( mainboard8_device::debugger_read )
return 0;
}
-WRITE8_MEMBER( mainboard8_device::debugger_write )
+void mainboard8_device::debugger_write(offs_t offset, uint8_t data)
{
int logical_address = offset;
bool compat_mode = (m_crus_debug==ASSERT_LINE);
@@ -324,14 +324,14 @@ WRITE8_MEMBER( mainboard8_device::debugger_write )
if (m_mofetta->hexbus_access_debug()) return;
if (m_mofetta->intdsr_access_debug()) return;
m_ioport->memen_in(ASSERT_LINE);
- m_ioport->write(space, physical_address & 0xffff, data & 0xff);
+ m_ioport->write(physical_address & 0xffff, data & 0xff);
m_ioport->memen_in(CLEAR_LINE); return;
}
if ((physical_address & 0x00ffe000)==0x00ff6000)
{
// Cartridge space lower 8
m_gromport->romgq_line(ASSERT_LINE);
- m_gromport->write(space, physical_address & 0x1fff, data & 0xff);
+ m_gromport->write(physical_address & 0x1fff, data & 0xff);
m_gromport->romgq_line(CLEAR_LINE);
return;
}
@@ -339,7 +339,7 @@ WRITE8_MEMBER( mainboard8_device::debugger_write )
{
// Cartridge space upper 8
m_gromport->romgq_line(ASSERT_LINE);
- m_gromport->write(space, (physical_address & 0x1fff) | 0x2000, data & 0xff);
+ m_gromport->write((physical_address & 0x1fff) | 0x2000, data & 0xff);
m_gromport->romgq_line(CLEAR_LINE);
return;
}
@@ -352,16 +352,16 @@ WRITE8_MEMBER( mainboard8_device::debugger_write )
READ8Z_MEMBER(mainboard8_device::crureadz)
{
- m_ioport->crureadz(space, offset, value);
+ m_ioport->crureadz(offset, value);
}
/*
CRU handling. Mofetta is the only chip that bothers to handle it, beside the PEB
*/
-WRITE8_MEMBER(mainboard8_device::cruwrite)
+void mainboard8_device::cruwrite(offs_t offset, uint8_t data)
{
- m_mofetta->cruwrite(space, offset, data);
- m_ioport->cruwrite(space, offset, data);
+ m_mofetta->cruwrite(offset, data);
+ m_ioport->cruwrite(offset, data);
}
// =============== Memory bus access ==================
@@ -371,7 +371,7 @@ WRITE_LINE_MEMBER( mainboard8_device::dbin_in )
m_dbin_level = (line_state)state;
}
-READ8_MEMBER( mainboard8_device::setoffset )
+uint8_t mainboard8_device::setoffset(offs_t offset)
{
LOGMASKED(LOG_ADDRESS, "set %s %04x\n", (m_dbin_level==ASSERT_LINE)? "R" : "W", offset);
@@ -390,7 +390,7 @@ READ8_MEMBER( mainboard8_device::setoffset )
m_A14_set = ((m_logical_address & 2)!=0); // Needed for clock_in
// Check for match in logical space
- m_vaquerro->set_address(space, m_logical_address, m_dbin_level);
+ m_vaquerro->set_address(m_logical_address, m_dbin_level);
// Select GROMs if addressed
select_groms();
@@ -405,7 +405,7 @@ READ8_MEMBER( mainboard8_device::setoffset )
m_mofetta->lascs_in(lasreq);
// Need to set the address in any case so that the lines can be cleared
- m_amigo->set_address(space, m_logical_address);
+ m_amigo->set_address(m_logical_address);
// AMIGO is the one to control the READY line to the CPU
// MOFETTA does not contribute to READY
@@ -539,7 +539,7 @@ WRITE_LINE_MEMBER( mainboard8_device::clock_in )
if (m_mofetta->alccs_out()==ASSERT_LINE)
{
- m_oso->write(*m_space, m_physical_address>>1, m_latched_data);
+ m_oso->write(m_physical_address>>1, m_latched_data);
m_pending_write = false;
LOGMASKED(LOG_MEM, "Write %04x (phys %06x, OSO) <- %02x\n", m_logical_address, m_physical_address, m_latched_data);
}
@@ -547,7 +547,7 @@ WRITE_LINE_MEMBER( mainboard8_device::clock_in )
if (m_mofetta->cmas_out()==ASSERT_LINE)
{
m_gromport->romgq_line(ASSERT_LINE);
- m_gromport->write(*m_space, m_physical_address & 0x3fff, m_latched_data);
+ m_gromport->write(m_physical_address & 0x3fff, m_latched_data);
m_pending_write = false;
LOGMASKED(LOG_MEM, "Write %04x (phys %06x, cartridge) <- %02x\n", m_logical_address, m_physical_address, m_latched_data);
}
@@ -558,7 +558,7 @@ WRITE_LINE_MEMBER( mainboard8_device::clock_in )
if (m_mofetta->dbc_out()==ASSERT_LINE)
{
- m_ioport->write(*m_space, m_physical_address, m_latched_data);
+ m_ioport->write(m_physical_address, m_latched_data);
m_pending_write = false;
LOGMASKED(LOG_MEM, "Write %04x (phys %06x, PEB) <- %02x\n", m_logical_address, m_physical_address, m_latched_data);
}
@@ -635,7 +635,7 @@ void mainboard8_device::select_groms()
m_sgrom1->write(m_latched_data);
m_sgrom2->write(m_latched_data);
LOGMASKED(LOG_MEM, "Write GS <- %02x\n", m_latched_data);
- m_gromport->write(*m_space, 0, m_latched_data);
+ m_gromport->write(0, m_latched_data);
break;
case TSGSEL:
@@ -682,8 +682,8 @@ void mainboard8_device::set_paddress(int address)
m_physical_address = (m_physical_address << 16) | address;
LOGMASKED(LOG_DETAIL, "Setting physical address %06x\n", m_physical_address);
- m_mofetta->set_address(*m_space, address, m_dbin_level);
- m_ioport->setaddress_dbin(*m_space, address, m_dbin_level);
+ m_mofetta->set_address(address, m_dbin_level);
+ m_ioport->setaddress_dbin(address, m_dbin_level);
}
WRITE_LINE_MEMBER( mainboard8_device::msast_in )
@@ -701,14 +701,14 @@ WRITE_LINE_MEMBER( mainboard8_device::msast_in )
}
-READ8_MEMBER( mainboard8_device::read )
+uint8_t mainboard8_device::read(offs_t offset)
{
uint8_t value = 0;
const char* what;
if (machine().side_effects_disabled())
{
- return debugger_read(space, offset);
+ return debugger_read(offset);
}
// =================================================
@@ -716,7 +716,7 @@ READ8_MEMBER( mainboard8_device::read )
// =================================================
if (m_amigo->mapper_accessed())
{
- value = m_amigo->read(space, 0);
+ value = m_amigo->read();
what = "mapper";
goto readdone;
}
@@ -762,7 +762,7 @@ READ8_MEMBER( mainboard8_device::read )
m_sgrom0->readz(&value);
m_sgrom1->readz(&value);
m_sgrom2->readz(&value);
- m_gromport->readz(space, 0, &value);
+ m_gromport->readz(0, &value);
if (!m_A14_set) LOGMASKED(LOG_GROM, "GS>%04x\n", m_sgrom0->debug_get_address()-1);
what = "system GROM";
goto readdone;
@@ -843,7 +843,7 @@ READ8_MEMBER( mainboard8_device::read )
if (m_mofetta->alccs_out()==ASSERT_LINE)
{
- value = m_oso->read(*m_space, m_physical_address>>1);
+ value = m_oso->read(m_physical_address>>1);
what = "OSO";
goto readdonephys;
}
@@ -858,14 +858,14 @@ READ8_MEMBER( mainboard8_device::read )
if (m_mofetta->cmas_out()==ASSERT_LINE)
{
m_gromport->romgq_line(ASSERT_LINE);
- m_gromport->readz(*m_space, m_physical_address & 0x3fff, &value);
+ m_gromport->readz(m_physical_address & 0x3fff, &value);
what = "Cartridge";
goto readdonephys;
}
if (m_mofetta->dbc_out()==ASSERT_LINE)
{
- m_ioport->readz(*m_space, m_physical_address & 0xffff, &value);
+ m_ioport->readz(m_physical_address & 0xffff, &value);
what = "PEB";
goto readdonephys;
}
@@ -905,14 +905,14 @@ void mainboard8_device::cycle_end()
If the READY line is pulled down due to the mapping process, we must
store the data bus value until the physical address is available.
*/
-WRITE8_MEMBER( mainboard8_device::write )
+void mainboard8_device::write(offs_t offset, uint8_t data)
{
m_latched_data = data;
m_pending_write = true;
if (machine().side_effects_disabled())
{
- return debugger_write(space, offset, data);
+ return debugger_write(offset, data);
}
// Some logical space devices can be written immediately
@@ -920,7 +920,7 @@ WRITE8_MEMBER( mainboard8_device::write )
if (m_amigo->mapper_accessed())
{
LOGMASKED(LOG_MEM, "Write %04x (mapper) <- %02x\n", m_logical_address, data);
- m_amigo->write(space, 0, data);
+ m_amigo->write(data);
m_pending_write = false;
}
@@ -1064,10 +1064,6 @@ void mainboard8_device::device_reset()
m_A14_set = false;
// Configure RAM and AMIGO
m_amigo->connect_sram(m_sram->pointer());
-
- // Get the pointer to the address space; we need it outside of the
- // usual memory functions. TODO: Possibly not anymore.
- m_space = &m_maincpu->space(AS_PROGRAM);
}
void mainboard8_device::device_add_mconfig(machine_config &config)
@@ -1735,7 +1731,7 @@ bool mofetta_device::intdsr_access_debug()
return m_txspg;
}
-WRITE8_MEMBER(mofetta_device::cruwrite)
+void mofetta_device::cruwrite(offs_t offset, uint8_t data)
{
if ((offset & 0xff00)==0x2700)
{
@@ -2000,7 +1996,7 @@ WRITE_LINE_MEMBER( amigo_device::lascs_in )
3. Set the physical address bus with the second 16 bits of the physical
address. Clear the MSAST line. Forward any incoming READY=0 to the CPU.
*/
-READ8_MEMBER( amigo_device::set_address )
+uint8_t amigo_device::set_address(offs_t offset)
{
// Check whether the mapper itself is accessed
int mapaddr = (m_crus==ASSERT_LINE)? 0x8810 : 0xf870;
@@ -2053,7 +2049,7 @@ READ8_MEMBER( amigo_device::set_address )
/*
Read the mapper status bits
*/
-READ8_MEMBER( amigo_device::read )
+uint8_t amigo_device::read()
{
// Read the protection status bits and reset them
uint8_t value = m_protflag;
@@ -2064,7 +2060,7 @@ READ8_MEMBER( amigo_device::read )
/*
Configure the mapper. This is the only reason to write to the AMIGO.
*/
-WRITE8_MEMBER( amigo_device::write )
+void amigo_device::write(uint8_t data)
{
// Load or save map file
if ((data & 0xf0)==0x00)
@@ -2295,7 +2291,7 @@ oso_device::oso_device(const machine_config &mconfig, const char *tag, device_t
m_hexbus_outbound = nullptr;
}
-READ8_MEMBER( oso_device::read )
+uint8_t oso_device::read(offs_t offset)
{
int value = 0;
offset &= 0x03;
@@ -2331,7 +2327,7 @@ READ8_MEMBER( oso_device::read )
return value;
}
-WRITE8_MEMBER( oso_device::write )
+void oso_device::write(offs_t offset, uint8_t data)
{
offset &= 0x03;
switch (offset)
diff --git a/src/devices/bus/ti99/internal/998board.h b/src/devices/bus/ti99/internal/998board.h
index c0baf6589df..227a2dc4a7b 100644
--- a/src/devices/bus/ti99/internal/998board.h
+++ b/src/devices/bus/ti99/internal/998board.h
@@ -101,7 +101,6 @@ public:
line_state ready();
void treset();
- DECLARE_READ8_MEMBER( read );
DECLARE_SETADDRESS_DBIN_MEMBER( set_address );
DECLARE_READ_LINE_MEMBER( sprd_out );
@@ -248,7 +247,7 @@ public:
void device_start() override;
void device_reset() override;
- DECLARE_WRITE8_MEMBER( cruwrite );
+ void cruwrite(offs_t offset, uint8_t data);
DECLARE_SETADDRESS_DBIN_MEMBER( set_address );
// Debugger support
@@ -261,7 +260,6 @@ public:
DECLARE_WRITE_LINE_MEMBER( pmemen_in );
DECLARE_WRITE_LINE_MEMBER( skdrcs_in );
- DECLARE_READ8_MEMBER( rom1cs_out );
DECLARE_READ_LINE_MEMBER( gromclk_out );
DECLARE_READ_LINE_MEMBER( alccs_out );
@@ -335,9 +333,9 @@ public:
void device_start() override;
void device_reset() override;
- DECLARE_READ8_MEMBER( read );
- DECLARE_WRITE8_MEMBER( write );
- DECLARE_READ8_MEMBER( set_address );
+ uint8_t read();
+ void write(uint8_t data);
+ uint8_t set_address(offs_t offset);
// Debugger support
int get_physical_address_debug(offs_t offset);
@@ -453,8 +451,8 @@ class oso_device : public bus::hexbus::hexbus_chained_device
{
public:
oso_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- DECLARE_READ8_MEMBER( read );
- DECLARE_WRITE8_MEMBER( write );
+ uint8_t read(offs_t offset);
+ void write(offs_t offset, uint8_t data);
void device_start() override;
void hexbus_value_changed(uint8_t data) override;
@@ -541,17 +539,17 @@ public:
mainboard8_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
// Memory space
- DECLARE_READ8_MEMBER( read );
- DECLARE_WRITE8_MEMBER( write );
- DECLARE_READ8_MEMBER( setoffset );
+ uint8_t read(offs_t offset);
+ void write(offs_t offset, uint8_t data);
+ uint8_t setoffset(offs_t offset);
// Memory space for debugger access
- DECLARE_READ8_MEMBER( debugger_read );
- DECLARE_WRITE8_MEMBER( debugger_write );
+ uint8_t debugger_read(offs_t offset);
+ void debugger_write(offs_t offset, uint8_t data);
// I/O space
DECLARE_READ8Z_MEMBER( crureadz );
- DECLARE_WRITE8_MEMBER( cruwrite );
+ void cruwrite(offs_t offset, uint8_t data);
// Control lines
DECLARE_WRITE_LINE_MEMBER( clock_in );
@@ -598,9 +596,6 @@ private:
// Mapped physical address.
int m_physical_address;
- // Hold the address space value so that we can use it in other methods.
- address_space* m_space;
-
// Indicates that a byte is waiting on the data bus (see m_latched_data)
bool m_pending_write;
diff --git a/src/devices/bus/ti99/internal/datamux.cpp b/src/devices/bus/ti99/internal/datamux.cpp
index fa1b4de2dad..f6ba06d99b2 100644
--- a/src/devices/bus/ti99/internal/datamux.cpp
+++ b/src/devices/bus/ti99/internal/datamux.cpp
@@ -97,7 +97,6 @@ datamux_device::datamux_device(const machine_config &mconfig, const char *tag, d
m_ram16b(*owner, TI99_EXPRAM_TAG),
m_padram(*owner, TI99_PADRAM_TAG),
m_cpu(*owner, "maincpu"),
- m_spacep(nullptr),
m_ready(*this),
m_addr_buf(0),
m_dbin(CLEAR_LINE),
@@ -118,7 +117,7 @@ datamux_device::datamux_device(const machine_config &mconfig, const char *tag, d
DEVICE ACCESSOR FUNCTIONS
***************************************************************************/
-void datamux_device::read_all(address_space& space, uint16_t addr, uint8_t *value)
+void datamux_device::read_all(uint16_t addr, uint8_t *value)
{
// Valid access
bool validaccess = ((addr & 0x0400)==0);
@@ -136,7 +135,7 @@ void datamux_device::read_all(address_space& space, uint16_t addr, uint8_t *valu
}
}
// GROMport (GROMs)
- m_gromport->readz(space, addr, value);
+ m_gromport->readz(addr, value);
m_grom_idle = false;
}
@@ -144,20 +143,20 @@ void datamux_device::read_all(address_space& space, uint16_t addr, uint8_t *valu
if ((addr & 0xf801)==0x8800)
{
// Forward to VDP unless we have an EVPC
- if (m_video != nullptr) *value = m_video->read(space, addr>>1); // A14 determines data or register read
+ if (m_video != nullptr) *value = m_video->read(addr>>1); // A14 determines data or register read
}
}
// GROMport (ROMs)
- if ((addr & 0xe000)==0x6000) m_gromport->readz(space, addr, value);
+ if ((addr & 0xe000)==0x6000) m_gromport->readz(addr, value);
// I/O port gets all accesses
- m_ioport->readz(space, addr, value);
+ m_ioport->readz(addr, value);
m_ioport->memen_in(CLEAR_LINE);
m_memen_state = CLEAR_LINE;
}
-void datamux_device::write_all(address_space& space, uint16_t addr, uint8_t value)
+void datamux_device::write_all(uint16_t addr, uint8_t value)
{
// GROM access
if ((addr & 0xf801)==0x9800)
@@ -168,12 +167,12 @@ void datamux_device::write_all(address_space& space, uint16_t addr, uint8_t valu
m_grom[i]->write(value);
}
// GROMport
- m_gromport->write(space, addr, value);
+ m_gromport->write(addr, value);
m_grom_idle = false;
}
// Cartridge port and sound
- if ((addr & 0xe000)==0x6000) m_gromport->write(space, addr, value);
+ if ((addr & 0xe000)==0x6000) m_gromport->write(addr, value);
// Only if the sound chip has not been removed
if ((addr & 0xfc01)==0x8400)
@@ -185,16 +184,16 @@ void datamux_device::write_all(address_space& space, uint16_t addr, uint8_t valu
if ((addr & 0xf801)==0x8800)
{
// Forward to VDP unless we have an EVPC
- if (m_video != nullptr) m_video->write(space, addr>>1, value); // A14 determines data or register write
+ if (m_video != nullptr) m_video->write(addr>>1, value); // A14 determines data or register write
}
// I/O port gets all accesses
- m_ioport->write(space, addr, value);
+ m_ioport->write(addr, value);
m_ioport->memen_in(CLEAR_LINE);
m_memen_state = CLEAR_LINE;
}
-void datamux_device::setaddress_all(address_space& space, uint16_t addr)
+void datamux_device::setaddress_all(uint16_t addr)
{
line_state a14 = ((addr & 2)!=0)? ASSERT_LINE : CLEAR_LINE;
@@ -227,7 +226,7 @@ void datamux_device::setaddress_all(address_space& space, uint16_t addr)
// I/O port gets all accesses
m_memen_state = ASSERT_LINE;
m_ioport->memen_in(m_memen_state);
- m_ioport->setaddress_dbin(space, addr, m_dbin);
+ m_ioport->setaddress_dbin(addr, m_dbin);
}
/*
@@ -236,7 +235,7 @@ void datamux_device::setaddress_all(address_space& space, uint16_t addr)
mapped devices are excluded because their state would be changed
unpredictably by the debugger access.
*/
-uint16_t datamux_device::debugger_read(address_space& space, uint16_t addr)
+uint16_t datamux_device::debugger_read(uint16_t addr)
{
uint16_t addrb = addr << 1;
uint16_t value = 0;
@@ -267,13 +266,13 @@ uint16_t datamux_device::debugger_read(address_space& space, uint16_t addr)
if ((addrb & 0xe000)==0x6000)
{
m_gromport->romgq_line(ASSERT_LINE);
- m_gromport->readz(space, addrb+1, &lval);
- m_gromport->readz(space, addrb, &hval);
+ m_gromport->readz(addrb+1, &lval);
+ m_gromport->readz(addrb, &hval);
m_gromport->romgq_line(m_romgq_state); // reset to previous state
}
m_ioport->memen_in(ASSERT_LINE);
- m_ioport->readz(space, addrb+1, &lval);
- m_ioport->readz(space, addrb, &hval);
+ m_ioport->readz(addrb+1, &lval);
+ m_ioport->readz(addrb, &hval);
m_ioport->memen_in(m_memen_state); // reset to previous state
value = ((hval << 8)&0xff00) | (lval & 0xff);
}
@@ -282,7 +281,7 @@ uint16_t datamux_device::debugger_read(address_space& space, uint16_t addr)
return value;
}
-void datamux_device::debugger_write(address_space& space, uint16_t addr, uint16_t data)
+void datamux_device::debugger_write(uint16_t addr, uint16_t data)
{
uint16_t addrb = addr << 1;
@@ -312,14 +311,14 @@ void datamux_device::debugger_write(address_space& space, uint16_t addr, uint16_
if ((addrb & 0xe000)==0x6000)
{
m_gromport->romgq_line(ASSERT_LINE);
- m_gromport->write(space, addr+1, data & 0xff);
- m_gromport->write(space, addr, (data>>8) & 0xff);
+ m_gromport->write(addr+1, data & 0xff);
+ m_gromport->write(addr, (data>>8) & 0xff);
m_gromport->romgq_line(m_romgq_state); // reset to previous state
}
m_ioport->memen_in(ASSERT_LINE);
- m_ioport->write(space, addr+1, data & 0xff);
- m_ioport->write(space, addr, (data>>8) & 0xff);
+ m_ioport->write(addr+1, data & 0xff);
+ m_ioport->write(addr, (data>>8) & 0xff);
m_ioport->memen_in(m_memen_state); // reset to previous state
}
}
@@ -330,16 +329,16 @@ void datamux_device::debugger_write(address_space& space, uint16_t addr, uint16_
accesses must not occur within the loop. So we have one access on the bus,
a delay, and then the second access.
- mem_mask is always ffff on TMS processors (cannot control bus width)
+ mem_mask is irrelevant for TMS processors (cannot control bus width)
*/
-READ16_MEMBER( datamux_device::read )
+uint16_t datamux_device::read(offs_t offset)
{
uint16_t value = 0;
// Care for debugger
if (machine().side_effects_disabled())
{
- return debugger_read(space, offset);
+ return debugger_read(offset);
}
// Addresses below 0x2000 are ROM (no wait states)
@@ -371,7 +370,7 @@ READ16_MEMBER( datamux_device::read )
// The byte from the odd address has already been read into the latch
// Reading the even address now (addr)
uint8_t hbyte = 0;
- read_all(space, m_addr_buf, &hbyte);
+ read_all(m_addr_buf, &hbyte);
LOGMASKED(LOG_ACCESS, "Read even byte from address %04x -> %02x\n", m_addr_buf, hbyte);
value = (hbyte<<8) | m_latch;
@@ -384,11 +383,11 @@ READ16_MEMBER( datamux_device::read )
/*
Write access.
*/
-WRITE16_MEMBER( datamux_device::write )
+void datamux_device::write(offs_t offset, uint16_t data)
{
if (machine().side_effects_disabled())
{
- debugger_write(space, offset, data);
+ debugger_write(offset, data);
return;
}
@@ -420,7 +419,7 @@ WRITE16_MEMBER( datamux_device::write )
// write odd byte
LOGMASKED(LOG_ACCESS, "Write odd byte to address %04x <- %02x\n", m_addr_buf+1, data & 0xff);
- write_all(space, m_addr_buf+1, data & 0xff);
+ write_all(m_addr_buf+1, data & 0xff);
}
}
@@ -428,7 +427,7 @@ WRITE16_MEMBER( datamux_device::write )
Called when the memory access starts by setting the address bus. From that
point on, we suspend the CPU until all operations are done.
*/
-READ8_MEMBER( datamux_device::setoffset )
+uint8_t datamux_device::setoffset(offs_t offset)
{
m_addr_buf = offset;
m_waitcount = 0;
@@ -464,7 +463,7 @@ READ8_MEMBER( datamux_device::setoffset )
{
// propagate the setaddress operation
// First the odd address
- setaddress_all(space, m_addr_buf+1);
+ setaddress_all(m_addr_buf+1);
m_muxready = CLEAR_LINE;
ready_join();
}
@@ -502,10 +501,10 @@ WRITE_LINE_MEMBER( datamux_device::clock_in )
if (m_waitcount==2)
{
// read odd byte
- read_all(*m_spacep, m_addr_buf+1, &m_latch);
+ read_all(m_addr_buf+1, &m_latch);
LOGMASKED(LOG_ACCESS, "Read odd byte from address %04x -> %02x\n", m_addr_buf+1, m_latch);
// do the setaddress for the even address
- setaddress_all(*m_spacep, m_addr_buf);
+ setaddress_all(m_addr_buf);
}
}
}
@@ -524,10 +523,10 @@ WRITE_LINE_MEMBER( datamux_device::clock_in )
if (m_waitcount==2)
{
// do the setaddress for the even address
- setaddress_all(*m_spacep, m_addr_buf);
+ setaddress_all(m_addr_buf);
// write even byte
LOGMASKED(LOG_ACCESS, "Write even byte to address %04x <- %02x\n", m_addr_buf, m_latch);
- write_all(*m_spacep, m_addr_buf, m_latch);
+ write_all(m_addr_buf, m_latch);
}
}
}
@@ -615,10 +614,6 @@ void datamux_device::device_reset(void)
m_latch = 0;
m_dbin = CLEAR_LINE;
-
- // Get the pointer to the address space already here, because we cannot
- // save that pointer to a savestate, and we need it on restore
- m_spacep = &m_cpu->space(AS_PROGRAM);
}
void datamux_device::device_config_complete()
diff --git a/src/devices/bus/ti99/internal/datamux.h b/src/devices/bus/ti99/internal/datamux.h
index 4ddc39e09e6..6c36c7f8963 100644
--- a/src/devices/bus/ti99/internal/datamux.h
+++ b/src/devices/bus/ti99/internal/datamux.h
@@ -33,9 +33,9 @@ class datamux_device : public device_t
{
public:
datamux_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- DECLARE_READ16_MEMBER( read );
- DECLARE_WRITE16_MEMBER( write );
- DECLARE_READ8_MEMBER( setoffset );
+ uint16_t read(offs_t offset);
+ void write(offs_t offset, uint16_t data);
+ uint8_t setoffset(offs_t offset);
DECLARE_WRITE_LINE_MEMBER( clock_in );
DECLARE_WRITE_LINE_MEMBER( dbin_in );
@@ -75,9 +75,6 @@ private:
// Link to the CPU
required_device<cpu_device> m_cpu;
- // Keeps the address space pointer
- address_space* m_spacep;
-
// Console ROM
uint16_t* m_consolerom;
@@ -85,17 +82,17 @@ private:
tmc0430_device* m_grom[3];
// Common read routine
- void read_all(address_space& space, uint16_t addr, uint8_t *target);
+ void read_all(uint16_t addr, uint8_t *target);
// Common write routine
- void write_all(address_space& space, uint16_t addr, uint8_t value);
+ void write_all(uint16_t addr, uint8_t value);
// Common set address method
- void setaddress_all(address_space& space, uint16_t addr);
+ void setaddress_all(uint16_t addr);
// Debugger access
- uint16_t debugger_read(address_space& space, uint16_t addr);
- void debugger_write(address_space& space, uint16_t addr, uint16_t data);
+ uint16_t debugger_read(uint16_t addr);
+ void debugger_write(uint16_t addr, uint16_t data);
// Join own READY and external READY
void ready_join();
diff --git a/src/devices/bus/ti99/internal/genboard.cpp b/src/devices/bus/ti99/internal/genboard.cpp
index 861e0655200..dd9ab0ee3db 100644
--- a/src/devices/bus/ti99/internal/genboard.cpp
+++ b/src/devices/bus/ti99/internal/genboard.cpp
@@ -329,7 +329,7 @@ INPUT_CHANGED_MEMBER( genmod_mapper_device::setgm_changed )
within the gate array. Unlike with real GROMs, no address wrapping occurs,
and the complete 64K space is available.
*/
-READ8_MEMBER( geneve_mapper_device::read_grom )
+uint8_t geneve_mapper_device::read_grom(offs_t offset)
{
uint8_t reply;
if (offset & 0x0002)
@@ -364,7 +364,7 @@ READ8_MEMBER( geneve_mapper_device::read_grom )
Simulates GROM. The real Geneve does not use GROMs but simulates them
within the gate array.
*/
-WRITE8_MEMBER( geneve_mapper_device::write_grom )
+void geneve_mapper_device::write_grom(offs_t offset, uint8_t data)
{
if (offset & 0x0002)
{
@@ -468,7 +468,7 @@ void geneve_mapper_device::set_extra_waitstates(bool wait)
SETOFFSET method, and we re-use the values stored there to quickly
access the appropriate component.
*/
-READ8_MEMBER( geneve_mapper_device::readm )
+uint8_t geneve_mapper_device::readm(offs_t offset)
{
uint8_t value = 0;
@@ -492,7 +492,7 @@ READ8_MEMBER( geneve_mapper_device::readm )
if (dec->function == MBOX)
{
m_peribox->memen_in(ASSERT_LINE);
- m_peribox->setaddress_dbin(space, dec->physaddr, true);
+ m_peribox->setaddress_dbin(dec->physaddr, true);
}
}
else
@@ -509,7 +509,7 @@ READ8_MEMBER( geneve_mapper_device::readm )
case MLVIDEO:
if (!machine().side_effects_disabled())
{
- value = m_video->read(space, dec->offset>>1);
+ value = m_video->read(dec->offset>>1);
LOGMASKED(LOG_READ, "Read video %04x -> %02x\n", dec->offset, value);
// Video wait states are created *after* the access
// Accordingly, they have no effect when execution is in onchip RAM
@@ -538,7 +538,7 @@ READ8_MEMBER( geneve_mapper_device::readm )
// Needs more investigation. We might as well ignore this,
// as the high nibble is obviously undefined and takes some past
// value floating around.
- value = m_clock->read(space, dec->offset & 0x000f);
+ value = m_clock->read(dec->offset & 0x000f);
if (m_geneve_mode) value |= 0xf0;
else value |= ((dec->offset & 0x000f)==0x000f)? 0x20 : 0x10;
LOGMASKED(LOG_READ, "Read clock %04x -> %02x\n", dec->offset, value);
@@ -548,7 +548,7 @@ READ8_MEMBER( geneve_mapper_device::readm )
// grom simulation
// ++++ ++-- ---- ---+
// 1001 1000 0000 00x0
- if (!machine().side_effects_disabled()) value = read_grom(space, dec->offset, 0xff);
+ if (!machine().side_effects_disabled()) value = read_grom(dec->offset);
LOGMASKED(LOG_READ, "Read GROM %04x -> %02x\n", dec->offset, value);
break;
@@ -571,7 +571,7 @@ READ8_MEMBER( geneve_mapper_device::readm )
case MPEPROM:
// 1 111. ..xx xxxx xxxx xxxx on-board eprom (16K)
// mirrored for f0, f2, f4, ...; f1, f3, f5, ...
- value = boot_rom(space, dec->physaddr, 0xff);
+ value = boot_rom(dec->physaddr);
break;
case MPSRAM:
@@ -593,7 +593,7 @@ READ8_MEMBER( geneve_mapper_device::readm )
// 0x000000-0x07ffff for the stock Geneve (AMC,AMB,AMA,A0 ...,A15)
// 0x000000-0x1fffff for the GenMod.(AME,AMD,AMC,AMB,AMA,A0 ...,A15)
- m_peribox->readz(space, dec->physaddr, &value, 0xff);
+ m_peribox->readz(dec->physaddr, &value);
m_peribox->memen_in(CLEAR_LINE);
LOGMASKED(LOG_READ, "Read P-Box %04x (%06x) -> %02x\n", dec->offset, dec->physaddr, value);
break;
@@ -605,7 +605,7 @@ READ8_MEMBER( geneve_mapper_device::readm )
return value;
}
-WRITE8_MEMBER( geneve_mapper_device::writem )
+void geneve_mapper_device::writem(offs_t offset, uint8_t data)
{
decdata *dec;
decdata debug;
@@ -627,7 +627,7 @@ WRITE8_MEMBER( geneve_mapper_device::writem )
if (dec->function == MBOX)
{
m_peribox->memen_in(ASSERT_LINE);
- m_peribox->setaddress_dbin(space, dec->physaddr, false);
+ m_peribox->setaddress_dbin(dec->physaddr, false);
}
}
else
@@ -650,7 +650,7 @@ WRITE8_MEMBER( geneve_mapper_device::writem )
if (!machine().side_effects_disabled())
{
- m_video->write(space, dec->offset>>1, data);
+ m_video->write(dec->offset>>1, data);
LOGMASKED(LOG_WRITE, "Write video %04x <- %02x\n", offset, data);
// See above
if (m_video_waitstates) set_video_waitcount(15);
@@ -666,7 +666,7 @@ WRITE8_MEMBER( geneve_mapper_device::writem )
case MLCLOCK:
// clock
// ++++ ++++ ++++ ----
- m_clock->write(space, dec->offset & 0x000f, data);
+ m_clock->write(dec->offset & 0x000f, data);
LOGMASKED(LOG_WRITE, "Write clock %04x <- %02x\n", offset, data);
break;
@@ -679,7 +679,7 @@ WRITE8_MEMBER( geneve_mapper_device::writem )
case MLGROM:
// The GROM simulator is only available in TI Mode
- write_grom(space, dec->offset, data, 0xff);
+ write_grom(dec->offset, data);
LOGMASKED(LOG_WRITE, "Write GROM %04x <- %02x\n", offset, data);
break;
@@ -700,7 +700,7 @@ WRITE8_MEMBER( geneve_mapper_device::writem )
// 1 111. ..xx xxxx xxxx xxxx on-board eprom (16K)
// mirrored for f0, f2, f4, ...; f1, f3, f5, ...
// Ignore EPROM write (unless PFM)
- if (m_boot_rom != GENEVE_EPROM) write_to_pfm(space, dec->physaddr, data, 0xff);
+ if (m_boot_rom != GENEVE_EPROM) write_to_pfm(dec->physaddr, data);
else
LOGMASKED(LOG_WARN, "Write EPROM %04x (%06x) <- %02x, ignored\n", offset, dec->physaddr, data);
break;
@@ -720,7 +720,7 @@ WRITE8_MEMBER( geneve_mapper_device::writem )
case MBOX:
// Route everything else to the P-Box
LOGMASKED(LOG_WRITE, "Write P-Box %04x (%06x) <- %02x\n", offset, dec->physaddr, data);
- m_peribox->write(space, dec->physaddr, data, 0xff);
+ m_peribox->write(dec->physaddr, data);
m_peribox->memen_in(CLEAR_LINE);
break;
@@ -854,7 +854,7 @@ void genmod_mapper_device::decode_mod(geneve_mapper_device::decdata* dec)
/*
Boot ROM handling, from EPROM or PFM.
*/
-READ8_MEMBER( geneve_mapper_device::boot_rom )
+uint8_t geneve_mapper_device::boot_rom(offs_t offset)
{
uint8_t value;
int pfmaddress = (offset & 0x01ffff) | (m_pfm_bank<<17);
@@ -866,10 +866,10 @@ READ8_MEMBER( geneve_mapper_device::boot_rom )
LOGMASKED(LOG_READ, "Read EPROM %04x -> %02x\n", offset & 0x003fff, value);
return value;
case GENEVE_PFM512:
- value = m_pfm512->read(space, pfmaddress, mem_mask);
+ value = m_pfm512->read(pfmaddress);
break;
case GENEVE_PFM512A:
- value = m_pfm512a->read(space, pfmaddress, mem_mask);
+ value = m_pfm512a->read(pfmaddress);
break;
default:
LOGMASKED(LOG_WARN, "Illegal mode for reading boot ROM: %d\n", m_boot_rom);
@@ -881,7 +881,7 @@ READ8_MEMBER( geneve_mapper_device::boot_rom )
return value;
}
-WRITE8_MEMBER( geneve_mapper_device::write_to_pfm )
+void geneve_mapper_device::write_to_pfm(offs_t offset, uint8_t data)
{
// Nota bene: The PFM must be write protected on startup, or the RESET
// of the 9995 will attempt to write the return vector into the flash EEPROM
@@ -891,10 +891,10 @@ WRITE8_MEMBER( geneve_mapper_device::write_to_pfm )
switch (m_boot_rom)
{
case GENEVE_PFM512:
- m_pfm512->write(space, address, data, mem_mask);
+ m_pfm512->write(address, data);
break;
case GENEVE_PFM512A:
- m_pfm512a->write(space, address, data, mem_mask);
+ m_pfm512a->write(address, data);
break;
default:
LOGMASKED(LOG_WARN, "Illegal mode for writing to PFM: %d\n", m_boot_rom);
@@ -907,7 +907,7 @@ WRITE8_MEMBER( geneve_mapper_device::write_to_pfm )
This decoding will later be used in the READ/WRITE member functions. Also,
we initiate wait state creation here.
*/
-READ8_MEMBER( geneve_mapper_device::setoffset )
+uint8_t geneve_mapper_device::setoffset(offs_t offset)
{
LOGMASKED(LOG_DETAIL, "setoffset = %04x\n", offset);
m_debug_no_ws = false;
@@ -926,7 +926,7 @@ READ8_MEMBER( geneve_mapper_device::setoffset )
if (m_decoded.function == MBOX)
{
m_peribox->memen_in(ASSERT_LINE);
- m_peribox->setaddress_dbin(space, m_decoded.physaddr, m_read_mode);
+ m_peribox->setaddress_dbin(m_decoded.physaddr, m_read_mode);
}
return 0;
}
diff --git a/src/devices/bus/ti99/internal/genboard.h b/src/devices/bus/ti99/internal/genboard.h
index 875f9f8bd51..baccf7463a9 100644
--- a/src/devices/bus/ti99/internal/genboard.h
+++ b/src/devices/bus/ti99/internal/genboard.h
@@ -121,9 +121,9 @@ public:
void set_video_waitstates(bool wait);
void set_extra_waitstates(bool wait);
- DECLARE_READ8_MEMBER( readm );
- DECLARE_WRITE8_MEMBER( writem );
- DECLARE_READ8_MEMBER( setoffset );
+ uint8_t readm(offs_t offset);
+ void writem(offs_t offset, uint8_t data);
+ uint8_t setoffset(offs_t offset);
DECLARE_INPUT_CHANGED_MEMBER( settings_changed );
@@ -147,8 +147,8 @@ protected:
bool m_gromwaddr_LSB;
bool m_gromraddr_LSB;
int m_grom_address;
- DECLARE_READ8_MEMBER( read_grom );
- DECLARE_WRITE8_MEMBER( write_grom );
+ uint8_t read_grom(offs_t offset);
+ void write_grom(offs_t offset, uint8_t data);
// wait states
void set_wait(int min);
@@ -256,8 +256,8 @@ protected:
virtual void decode_mod(decdata* dec) { };
// PFM mod (0 = none, 1 = AT29C040, 2 = AT29C040A)
- DECLARE_READ8_MEMBER( boot_rom );
- DECLARE_WRITE8_MEMBER( write_to_pfm );
+ uint8_t boot_rom(offs_t offset);
+ void write_to_pfm(offs_t offset, uint8_t data);
int m_boot_rom;
int m_pfm_bank;
bool m_pfm_output_enable;
diff --git a/src/devices/bus/ti99/internal/ioport.cpp b/src/devices/bus/ti99/internal/ioport.cpp
index 3e769086141..a855fd3bf41 100644
--- a/src/devices/bus/ti99/internal/ioport.cpp
+++ b/src/devices/bus/ti99/internal/ioport.cpp
@@ -96,31 +96,31 @@ ioport_device::ioport_device(const machine_config &mconfig, const char *tag, dev
READ8Z_MEMBER(ioport_device::readz)
{
if (m_connected != nullptr)
- m_connected->readz(space, offset, value);
+ m_connected->readz(offset, value);
}
-WRITE8_MEMBER(ioport_device::write)
+void ioport_device::write(offs_t offset, uint8_t data)
{
if (m_connected != nullptr)
- m_connected->write(space, offset, data);
+ m_connected->write(offset, data);
}
SETADDRESS_DBIN_MEMBER(ioport_device::setaddress_dbin)
{
if (m_connected != nullptr)
- m_connected->setaddress_dbin(space, offset, state);
+ m_connected->setaddress_dbin(offset, state);
}
READ8Z_MEMBER(ioport_device::crureadz)
{
if (m_connected != nullptr)
- m_connected->crureadz(space, offset, value);
+ m_connected->crureadz(offset, value);
}
-WRITE8_MEMBER(ioport_device::cruwrite)
+void ioport_device::cruwrite(offs_t offset, uint8_t data)
{
if (m_connected != nullptr)
- m_connected->cruwrite(space, offset, data);
+ m_connected->cruwrite(offset, data);
}
WRITE_LINE_MEMBER(ioport_device::memen_in)
diff --git a/src/devices/bus/ti99/internal/ioport.h b/src/devices/bus/ti99/internal/ioport.h
index aa30c51da77..6b468007eda 100644
--- a/src/devices/bus/ti99/internal/ioport.h
+++ b/src/devices/bus/ti99/internal/ioport.h
@@ -29,14 +29,14 @@ public:
{ }
// Methods called from the console / ioport
- virtual DECLARE_READ8Z_MEMBER( readz ) { };
- virtual DECLARE_WRITE8_MEMBER( write ) { };
- virtual DECLARE_SETADDRESS_DBIN_MEMBER( setaddress_dbin ) { };
- virtual DECLARE_READ8Z_MEMBER( crureadz ) { };
- virtual DECLARE_WRITE8_MEMBER( cruwrite ) { };
- virtual DECLARE_WRITE_LINE_MEMBER( memen_in ) { };
- virtual DECLARE_WRITE_LINE_MEMBER( msast_in ) { };
- virtual DECLARE_WRITE_LINE_MEMBER( clock_in ) { };
+ virtual DECLARE_READ8Z_MEMBER( readz ) { }
+ virtual void write(offs_t offset, uint8_t data) { }
+ virtual DECLARE_SETADDRESS_DBIN_MEMBER( setaddress_dbin ) { }
+ virtual DECLARE_READ8Z_MEMBER( crureadz ) { }
+ virtual void cruwrite(offs_t offset, uint8_t data) { }
+ virtual DECLARE_WRITE_LINE_MEMBER( memen_in ) { }
+ virtual DECLARE_WRITE_LINE_MEMBER( msast_in ) { }
+ virtual DECLARE_WRITE_LINE_MEMBER( clock_in ) { }
void set_ioport(ioport_device* ioport) { m_ioport = ioport; }
@@ -71,10 +71,10 @@ public:
// Methods called from the console
DECLARE_READ8Z_MEMBER( readz );
- DECLARE_WRITE8_MEMBER( write );
+ void write(offs_t offset, uint8_t data);
DECLARE_SETADDRESS_DBIN_MEMBER( setaddress_dbin );
DECLARE_READ8Z_MEMBER( crureadz );
- DECLARE_WRITE8_MEMBER( cruwrite );
+ void cruwrite(offs_t offset, uint8_t data);
DECLARE_WRITE_LINE_MEMBER( memen_in );
DECLARE_WRITE_LINE_MEMBER( msast_in );
DECLARE_WRITE_LINE_MEMBER( clock_in );
diff --git a/src/devices/bus/ti99/joyport/handset.cpp b/src/devices/bus/ti99/joyport/handset.cpp
index 304cdffe239..829b5bca087 100644
--- a/src/devices/bus/ti99/joyport/handset.cpp
+++ b/src/devices/bus/ti99/joyport/handset.cpp
@@ -38,7 +38,6 @@
#include "emu.h"
#include "handset.h"
-#include "machine/tms9901.h"
#define LOG_WARN (1U<<1) // Warnings
#define LOG_CONFIG (1U<<2) // Configuration
diff --git a/src/devices/bus/ti99/peb/bwg.cpp b/src/devices/bus/ti99/peb/bwg.cpp
index c7aa2c903b7..f2a23fea518 100644
--- a/src/devices/bus/ti99/peb/bwg.cpp
+++ b/src/devices/bus/ti99/peb/bwg.cpp
@@ -228,7 +228,7 @@ READ8Z_MEMBER(snug_bwg_device::readz)
if (m_RTCsel)
{
// .... ..11 111x xxx0
- *value = m_clock->read(space, (m_address & 0x001e) >> 1);
+ *value = m_clock->read((m_address & 0x001e) >> 1);
LOGMASKED(LOG_RW, "read RTC: %04x -> %02x\n", m_address & 0xffff, *value);
}
else
@@ -275,7 +275,7 @@ READ8Z_MEMBER(snug_bwg_device::readz)
5c00 - 5fdf: RAM
5fe0 - 5fff: Clock (even addr)
*/
-WRITE8_MEMBER(snug_bwg_device::write)
+void snug_bwg_device::write(offs_t offset, uint8_t data)
{
if (machine().side_effects_disabled())
{
@@ -293,7 +293,7 @@ WRITE8_MEMBER(snug_bwg_device::write)
{
// .... ..11 111x xxx0
LOGMASKED(LOG_RW, "write RTC: %04x <- %02x\n", m_address & 0xffff, data);
- m_clock->write(space, (m_address & 0x001e) >> 1, data);
+ m_clock->write((m_address & 0x001e) >> 1, data);
}
else
{
@@ -338,7 +338,7 @@ READ8Z_MEMBER(snug_bwg_device::crureadz)
if ((offset & 0xff00)==m_cru_base)
{
- if ((offset & 0x00ff)==0)
+ if ((offset & 0x00f0)==0)
{
// Check what drives are not connected
reply = ((m_floppy[0] != nullptr)? 0 : 0x02) // DSK1
@@ -355,7 +355,7 @@ READ8Z_MEMBER(snug_bwg_device::crureadz)
reply |= (m_dip34 << 6);
// Invert all
- *value = ~reply;
+ *value = ~BIT(reply, (offset >> 1) & 7);
}
else
*value = 0;
@@ -363,7 +363,7 @@ READ8Z_MEMBER(snug_bwg_device::crureadz)
}
}
-WRITE8_MEMBER(snug_bwg_device::cruwrite)
+void snug_bwg_device::cruwrite(offs_t offset, uint8_t data)
{
// int drive, drivebit;
diff --git a/src/devices/bus/ti99/peb/bwg.h b/src/devices/bus/ti99/peb/bwg.h
index a25d844a563..2a53f45c75b 100644
--- a/src/devices/bus/ti99/peb/bwg.h
+++ b/src/devices/bus/ti99/peb/bwg.h
@@ -30,11 +30,11 @@ public:
snug_bwg_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
DECLARE_READ8Z_MEMBER(readz) override;
- DECLARE_WRITE8_MEMBER(write) override;
+ void write(offs_t offset, uint8_t data) override;
DECLARE_SETADDRESS_DBIN_MEMBER(setaddress_dbin) override;
DECLARE_READ8Z_MEMBER(crureadz) override;
- DECLARE_WRITE8_MEMBER(cruwrite) override;
+ void cruwrite(offs_t offset, uint8_t data) override;
protected:
void device_start() override;
diff --git a/src/devices/bus/ti99/peb/evpc.cpp b/src/devices/bus/ti99/peb/evpc.cpp
index fc5591112d5..6b17d75ef74 100644
--- a/src/devices/bus/ti99/peb/evpc.cpp
+++ b/src/devices/bus/ti99/peb/evpc.cpp
@@ -213,7 +213,7 @@ READ8Z_MEMBER(snug_enhanced_video_device::readz)
if (m_video_accessed)
{
- *value = m_video->read(space, m_address>>1);
+ *value = m_video->read(m_address>>1);
}
}
@@ -223,7 +223,7 @@ READ8Z_MEMBER(snug_enhanced_video_device::readz)
0x5f00 - 0x5fef NOVRAM
0x5ff0 - 0x5fff Palette (5ff8, 5ffa, 5ffc, 5ffe)
*/
-WRITE8_MEMBER(snug_enhanced_video_device::write)
+void snug_enhanced_video_device::write(offs_t offset, uint8_t data)
{
if (m_selected && m_inDsrArea)
{
@@ -296,7 +296,7 @@ WRITE8_MEMBER(snug_enhanced_video_device::write)
if (m_video_accessed)
{
- m_video->write(space, m_address>>1, data);
+ m_video->write(m_address>>1, data);
}
if (m_sound_accessed)
@@ -323,8 +323,9 @@ READ8Z_MEMBER(snug_enhanced_video_device::crureadz)
{
if ((offset & 0x00f0)==0) // offset 0 delivers bits 0-7 (address 00-0f)
{
- *value = ~(ioport("EVPC-SW1")->read() | (ioport("EVPC-SW3")->read()<<2)
+ uint8_t p = ~(ioport("EVPC-SW1")->read() | (ioport("EVPC-SW3")->read()<<2)
| (ioport("EVPC-SW4")->read()<<3) | (ioport("EVPC-SW8")->read()<<7));
+ *value = BIT(p, (offset >> 1) & 7);
}
}
}
@@ -340,7 +341,7 @@ READ8Z_MEMBER(snug_enhanced_video_device::crureadz)
Bit 6: -
Bit 7: -
*/
-WRITE8_MEMBER(snug_enhanced_video_device::cruwrite)
+void snug_enhanced_video_device::cruwrite(offs_t offset, uint8_t data)
{
if ((offset & 0xff00)==EVPC_CRU_BASE)
{
diff --git a/src/devices/bus/ti99/peb/evpc.h b/src/devices/bus/ti99/peb/evpc.h
index a52e73b963c..2e89c2fa405 100644
--- a/src/devices/bus/ti99/peb/evpc.h
+++ b/src/devices/bus/ti99/peb/evpc.h
@@ -32,11 +32,11 @@ class snug_enhanced_video_device : public device_t, public device_ti99_peribox_c
public:
snug_enhanced_video_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
DECLARE_READ8Z_MEMBER(readz) override;
- DECLARE_WRITE8_MEMBER(write) override;
+ void write(offs_t offset, uint8_t data) override;
DECLARE_SETADDRESS_DBIN_MEMBER(setaddress_dbin) override;
DECLARE_READ8Z_MEMBER(crureadz) override;
- DECLARE_WRITE8_MEMBER(cruwrite) override;
+ void cruwrite(offs_t offset, uint8_t data) override;
TIMER_DEVICE_CALLBACK_MEMBER( hblank_interrupt );
diff --git a/src/devices/bus/ti99/peb/hfdc.cpp b/src/devices/bus/ti99/peb/hfdc.cpp
index 97ac8d403ab..6a9a89726b2 100644
--- a/src/devices/bus/ti99/peb/hfdc.cpp
+++ b/src/devices/bus/ti99/peb/hfdc.cpp
@@ -223,14 +223,14 @@ READ8Z_MEMBER(myarc_hfdc_device::readz)
if (m_HDCsel)
{
- *value = m_hdc9234->read(space, (m_address>>2)&1, 0xff);
+ *value = m_hdc9234->read((m_address>>2)&1);
LOGMASKED(LOG_COMP, "%04x[HDC] -> %02x\n", m_address & 0xffff, *value);
return;
}
if (m_RTCsel)
{
- *value = m_clock->read(space, (m_address & 0x001e) >> 1);
+ *value = m_clock->read((m_address & 0x001e) >> 1);
LOGMASKED(LOG_COMP, "%04x[CLK] -> %02x\n", m_address & 0xffff, *value);
return;
}
@@ -278,7 +278,7 @@ READ8Z_MEMBER(myarc_hfdc_device::readz)
0x5800 - 0x5bff static RAM page any of 32 pages
0x5c00 - 0x5fff static RAM page any of 32 pages
*/
-WRITE8_MEMBER( myarc_hfdc_device::write )
+void myarc_hfdc_device::write(offs_t offset, uint8_t data)
{
if (machine().side_effects_disabled())
{
@@ -297,14 +297,14 @@ WRITE8_MEMBER( myarc_hfdc_device::write )
if (m_HDCsel)
{
LOGMASKED(LOG_COMP, "%04x[HDC] <- %02x\n", m_address & 0xffff, data);
- m_hdc9234->write(space, (m_address>>2)&1, data, 0xff);
+ m_hdc9234->write((m_address>>2)&1, data);
return;
}
if (m_RTCsel)
{
LOGMASKED(LOG_COMP, "%04x[CLK] <- %02x\n", m_address & 0xffff, data);
- m_clock->write(space, (m_address & 0x001e) >> 1, data);
+ m_clock->write((m_address & 0x001e) >> 1, data);
return;
}
@@ -376,7 +376,7 @@ READ8Z_MEMBER(myarc_hfdc_device::crureadz)
uint8_t reply;
if ((offset & 0xff00)==m_cru_base)
{
- if ((offset & 0x00ff)==0) // CRU bits 0-7
+ if ((offset & 0x00f0)==0) // CRU bits 0-7
{
if (m_see_switches)
{
@@ -390,7 +390,7 @@ READ8Z_MEMBER(myarc_hfdc_device::crureadz)
if (!m_motor_running) reply |= 0x04;
if (m_wait_for_hd1) reply |= 0x08;
}
- *value = reply;
+ *value = BIT(reply, (offset >> 1) & 7);
}
else // CRU bits 8+
{
@@ -425,7 +425,7 @@ READ8Z_MEMBER(myarc_hfdc_device::crureadz)
HFDC manual p. 43
*/
-WRITE8_MEMBER(myarc_hfdc_device::cruwrite)
+void myarc_hfdc_device::cruwrite(offs_t offset, uint8_t data)
{
if ((offset & 0xff00)==m_cru_base)
{
@@ -627,7 +627,7 @@ void myarc_hfdc_device::signal_drive_status()
(1,0) = OUTPUT1
(1,1) = OUTPUT2
*/
-WRITE8_MEMBER( myarc_hfdc_device::auxbus_out )
+void myarc_hfdc_device::auxbus_out(offs_t offset, uint8_t data)
{
int index;
switch (offset)
@@ -848,7 +848,7 @@ WRITE_LINE_MEMBER( myarc_hfdc_device::dip_w )
/*
Read a byte from the onboard SRAM. This is called from the HDC9234.
*/
-READ8_MEMBER( myarc_hfdc_device::read_buffer )
+uint8_t myarc_hfdc_device::read_buffer()
{
LOGMASKED(LOG_DMA, "Read access to onboard SRAM at %04x\n", m_dma_address);
if (m_dma_address > 0x8000) LOGMASKED(LOG_WARN, "Read access beyond RAM size: %06x\n", m_dma_address);
@@ -860,7 +860,7 @@ READ8_MEMBER( myarc_hfdc_device::read_buffer )
/*
Write a byte to the onboard SRAM. This is called from the HDC9234.
*/
-WRITE8_MEMBER( myarc_hfdc_device::write_buffer )
+void myarc_hfdc_device::write_buffer(uint8_t data)
{
LOGMASKED(LOG_DMA, "Write access to onboard SRAM at %04x: %02x\n", m_dma_address, data);
if (m_dma_address > 0x8000) LOGMASKED(LOG_WARN, "Write access beyond RAM size: %06x\n", m_dma_address);
diff --git a/src/devices/bus/ti99/peb/hfdc.h b/src/devices/bus/ti99/peb/hfdc.h
index 1ac9ec925bd..88648105eb5 100644
--- a/src/devices/bus/ti99/peb/hfdc.h
+++ b/src/devices/bus/ti99/peb/hfdc.h
@@ -38,10 +38,10 @@ public:
myarc_hfdc_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
DECLARE_READ8Z_MEMBER(readz) override;
- DECLARE_WRITE8_MEMBER(write) override;
+ void write(offs_t offset, uint8_t data) override;
DECLARE_SETADDRESS_DBIN_MEMBER(setaddress_dbin) override;
DECLARE_READ8Z_MEMBER(crureadz) override;
- DECLARE_WRITE8_MEMBER(cruwrite) override;
+ void cruwrite(offs_t offset, uint8_t data) override;
protected:
void device_config_complete() override;
@@ -58,9 +58,9 @@ private:
DECLARE_WRITE_LINE_MEMBER( dmarq_w );
DECLARE_WRITE_LINE_MEMBER( intrq_w );
DECLARE_WRITE_LINE_MEMBER( dip_w );
- DECLARE_WRITE8_MEMBER( auxbus_out );
- DECLARE_READ8_MEMBER( read_buffer );
- DECLARE_WRITE8_MEMBER( write_buffer );
+ void auxbus_out(offs_t offset, uint8_t data);
+ uint8_t read_buffer();
+ void write_buffer(uint8_t data);
DECLARE_FLOPPY_FORMATS( floppy_formats );
diff --git a/src/devices/bus/ti99/peb/horizon.cpp b/src/devices/bus/ti99/peb/horizon.cpp
index da5135f70bf..fdf4b5f97c1 100644
--- a/src/devices/bus/ti99/peb/horizon.cpp
+++ b/src/devices/bus/ti99/peb/horizon.cpp
@@ -219,7 +219,7 @@ READ8Z_MEMBER(horizon_ramdisk_device::readz)
}
}
-WRITE8_MEMBER(horizon_ramdisk_device::write)
+void horizon_ramdisk_device::write(offs_t offset, uint8_t data)
{
// 32K expansion
// According to the manual, "this memory is not affected by the HIDE switch"
@@ -303,7 +303,7 @@ void horizon_ramdisk_device::setbit(int& page, int pattern, bool set)
}
}
-WRITE8_MEMBER(horizon_ramdisk_device::cruwrite)
+void horizon_ramdisk_device::cruwrite(offs_t offset, uint8_t data)
{
int size = ioport("HORIZONSIZE")->read();
int split_bit = size + 10;
diff --git a/src/devices/bus/ti99/peb/horizon.h b/src/devices/bus/ti99/peb/horizon.h
index 76895f0c586..f72e9f109fc 100644
--- a/src/devices/bus/ti99/peb/horizon.h
+++ b/src/devices/bus/ti99/peb/horizon.h
@@ -26,10 +26,10 @@ class horizon_ramdisk_device : public device_t, public device_ti99_peribox_card_
public:
horizon_ramdisk_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
DECLARE_READ8Z_MEMBER(readz) override;
- DECLARE_WRITE8_MEMBER(write) override;
+ void write(offs_t offset, uint8_t data) override;
DECLARE_READ8Z_MEMBER(crureadz) override;
- DECLARE_WRITE8_MEMBER(cruwrite) override;
+ void cruwrite(offs_t offset, uint8_t data) override;
DECLARE_INPUT_CHANGED_MEMBER( hs_changed );
diff --git a/src/devices/bus/ti99/peb/hsgpl.cpp b/src/devices/bus/ti99/peb/hsgpl.cpp
index f9f631726e2..11f40c4d1c8 100644
--- a/src/devices/bus/ti99/peb/hsgpl.cpp
+++ b/src/devices/bus/ti99/peb/hsgpl.cpp
@@ -191,7 +191,7 @@ READ8Z_MEMBER(snug_high_speed_gpl_device::crureadz)
/*
Write hsgpl CRU interface
*/
-WRITE8_MEMBER(snug_high_speed_gpl_device::cruwrite)
+void snug_high_speed_gpl_device::cruwrite(offs_t offset, uint8_t data)
{
// SuperCart handling - see gromport.c
if (m_supercart_enabled && ((offset & 0xfff0)==SUPERCART_BASE))
@@ -272,46 +272,46 @@ READ8Z_MEMBER(snug_high_speed_gpl_device::readz)
{
if ((offset & 0x7e000)==0x74000)
{
- dsrspace_readz(space, offset & 0xffff, value, mem_mask);
+ dsrspace_readz(offset & 0xffff, value);
}
if ((offset & 0x7e000)==0x76000)
{
- cartspace_readz(space, offset & 0xffff, value, mem_mask);
+ cartspace_readz(offset & 0xffff, value);
}
// 1001 1wbb bbbb bba0
if ((offset & 0x7fc01)==0x79800)
{
- grom_readz(space, offset & 0xffff, value, mem_mask);
+ grom_readz(offset & 0xffff, value);
}
}
/*
Memory write
*/
-WRITE8_MEMBER(snug_high_speed_gpl_device::write)
+void snug_high_speed_gpl_device::write(offs_t offset, uint8_t data)
{
if ((offset & 0x7e000)==0x76000)
{
- cartspace_write(space, offset & 0xffff, data, mem_mask);
+ cartspace_write(offset & 0xffff, data);
}
// 1001 1wbb bbbb bba0
if ((offset & 0x7fc01)==0x79c00)
{
- grom_write(space, offset & 0xffff, data, mem_mask);
+ grom_write(offset & 0xffff, data);
}
}
/*
Specific read access: dsrspace
*/
-void snug_high_speed_gpl_device::dsrspace_readz(address_space& space, offs_t offset, uint8_t* value, uint8_t mem_mask)
+void snug_high_speed_gpl_device::dsrspace_readz(offs_t offset, uint8_t* value)
{
if (m_dsr_enabled)
{
- *value = m_dsr_eeprom->read(space, (offset & 0x1fff) | (m_dsr_page<<13), mem_mask);
+ *value = m_dsr_eeprom->read((offset & 0x1fff) | (m_dsr_page<<13));
LOGMASKED(LOG_READ, "read dsr %04x[%02x] -> %02x\n", offset, m_dsr_page, *value);
}
}
@@ -319,7 +319,7 @@ void snug_high_speed_gpl_device::dsrspace_readz(address_space& space, offs_t off
/*
Specific read access: cartspace
*/
-void snug_high_speed_gpl_device::cartspace_readz(address_space& space, offs_t offset, uint8_t* value, uint8_t mem_mask)
+void snug_high_speed_gpl_device::cartspace_readz(offs_t offset, uint8_t* value)
{
if (!m_card_enabled || m_flash_mode)
{
@@ -329,7 +329,7 @@ void snug_high_speed_gpl_device::cartspace_readz(address_space& space, offs_t of
if (m_module_bank < 16)
{
- *value = m_rom6_eeprom->read(space, (offset & 0x1fff) | (m_current_bank<<13) | (m_current_grom_port<<15), mem_mask);
+ *value = m_rom6_eeprom->read((offset & 0x1fff) | (m_current_bank<<13) | (m_current_grom_port<<15));
LOGMASKED(LOG_READ, "cartridge space read %04x -> %02x\n", offset, *value);
}
else
@@ -351,7 +351,7 @@ void snug_high_speed_gpl_device::cartspace_readz(address_space& space, offs_t of
it here - which is indeed closer to reality, since the real HSGPL also
emulates GROM instead of using proper ones.
*/
-void snug_high_speed_gpl_device::grom_readz(address_space& space, offs_t offset, uint8_t* value, uint8_t mem_mask)
+void snug_high_speed_gpl_device::grom_readz(offs_t offset, uint8_t* value)
{
if (machine().side_effects_disabled()) return;
@@ -397,7 +397,7 @@ void snug_high_speed_gpl_device::grom_readz(address_space& space, offs_t offset,
{
if (!m_flash_mode)
{
- *value = m_grom_a_eeprom->read(space, m_grom_address | (port<<16), mem_mask);
+ *value = m_grom_a_eeprom->read(m_grom_address | (port<<16));
m_module_bank = port;
if (bNew) LOGMASKED(LOG_PORT, "GROM read access at %04x - switch to bank %d\n", offset & 0xffff, m_module_bank);
}
@@ -406,7 +406,7 @@ void snug_high_speed_gpl_device::grom_readz(address_space& space, offs_t offset,
{
if (port < 16)
{
- *value = m_grom_b_eeprom->read(space, m_grom_address | ((port-8)<<16), mem_mask);
+ *value = m_grom_b_eeprom->read(m_grom_address | ((port-8)<<16));
m_module_bank = port;
if (bNew) LOGMASKED(LOG_PORT, "GROM read access at %04x - switch to bank %d\n", offset & 0xffff, m_module_bank);
}
@@ -416,7 +416,7 @@ void snug_high_speed_gpl_device::grom_readz(address_space& space, offs_t offset,
{
// 9840-985c
// DSR banks 0-63 (8 KiB per bank, 8 banks per port)
- *value = m_dsr_eeprom->read(space, m_grom_address | ((port-16)<<16), mem_mask);
+ *value = m_dsr_eeprom->read(m_grom_address | ((port-16)<<16));
// Don't change the module port
if (bNew) LOGMASKED(LOG_DSR, "read access to DSR bank %d-%d (%04x)\n", (port-16)<<3, ((port-16)<<3)+7, offset);
}
@@ -427,7 +427,7 @@ void snug_high_speed_gpl_device::grom_readz(address_space& space, offs_t offset,
// 9860-987c (ports 24-31)
// Each ROM6 is available as 4 (sub)banks (switchable via 6000, 6002, 6004, 6006)
// Accordingly, each port has two complete sets
- *value = m_rom6_eeprom->read(space, m_grom_address | ((port-24)<<16), mem_mask);
+ *value = m_rom6_eeprom->read(m_grom_address | ((port-24)<<16));
if (bNew) LOGMASKED(LOG_PORT, "ROM6 read access for module bank %d-%d (%04x)\n", (port-24)<<1, ((port-24)<<1)+1, offset & 0xffff);
}
else
@@ -469,7 +469,7 @@ void snug_high_speed_gpl_device::grom_readz(address_space& space, offs_t offset,
/*
Specific write access: cartspace
*/
-void snug_high_speed_gpl_device::cartspace_write(address_space& space, offs_t offset, uint8_t data, uint8_t mem_mask)
+void snug_high_speed_gpl_device::cartspace_write(offs_t offset, uint8_t data)
{
if (!m_card_enabled || m_flash_mode)
{
@@ -537,7 +537,7 @@ void snug_high_speed_gpl_device::cartspace_write(address_space& space, offs_t of
/*
Specific write access: grom_write
*/
-void snug_high_speed_gpl_device::grom_write(address_space& space, offs_t offset, uint8_t data, uint8_t mem_mask)
+void snug_high_speed_gpl_device::grom_write(offs_t offset, uint8_t data)
{
if (machine().side_effects_disabled()) return;
@@ -583,7 +583,7 @@ void snug_high_speed_gpl_device::grom_write(address_space& space, offs_t offset,
{
if (port < 8)
{
- m_grom_a_eeprom->write(space, m_grom_address | (port<<16), data, mem_mask);
+ m_grom_a_eeprom->write(m_grom_address | (port<<16), data);
m_module_bank = port;
if (bNew) LOGMASKED(LOG_PORT, "GROM write access at %04x - switch to bank %d\n", offset & 0xffff, port);
}
@@ -591,7 +591,7 @@ void snug_high_speed_gpl_device::grom_write(address_space& space, offs_t offset,
{
if (port < 16)
{
- m_grom_b_eeprom->write(space, m_grom_address | ((port-8)<<16), data, mem_mask);
+ m_grom_b_eeprom->write(m_grom_address | ((port-8)<<16), data);
m_module_bank = port;
if (bNew) LOGMASKED(LOG_PORT, "GROM write access at %04x - switch to bank %d\n", offset & 0xffff, port);
}
@@ -599,14 +599,14 @@ void snug_high_speed_gpl_device::grom_write(address_space& space, offs_t offset,
{
if (port < 24)
{
- m_dsr_eeprom->write(space, m_grom_address | ((port-16)<<16), data, mem_mask);
+ m_dsr_eeprom->write(m_grom_address | ((port-16)<<16), data);
if (bNew) LOGMASKED(LOG_DSR, "write access to DSR bank %d-%d (%04x)\n", (port-16)<<3, ((port-16)<<3)+7, offset);
}
else
{
if (port < 32)
{
- m_rom6_eeprom->write(space, m_grom_address | ((port-24)<<16), data, mem_mask);
+ m_rom6_eeprom->write(m_grom_address | ((port-24)<<16), data);
if (bNew) LOGMASKED(LOG_PORT, "ROM6 write access for module bank %d-%d (%04x)\n", (port-24)<<1, ((port-24)<<1)+1,offset & 0xffff);
}
else
diff --git a/src/devices/bus/ti99/peb/hsgpl.h b/src/devices/bus/ti99/peb/hsgpl.h
index 65cca91a081..7248436963f 100644
--- a/src/devices/bus/ti99/peb/hsgpl.h
+++ b/src/devices/bus/ti99/peb/hsgpl.h
@@ -29,10 +29,10 @@ class snug_high_speed_gpl_device : public device_t, public device_ti99_peribox_c
public:
snug_high_speed_gpl_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
DECLARE_READ8Z_MEMBER(readz) override;
- DECLARE_WRITE8_MEMBER(write) override;
+ void write(offs_t offset, uint8_t data) override;
DECLARE_READ8Z_MEMBER(crureadz) override;
- DECLARE_WRITE8_MEMBER(cruwrite) override;
+ void cruwrite(offs_t offset, uint8_t data) override;
protected:
virtual void device_start() override;
@@ -51,12 +51,12 @@ private:
required_device<ram_device> m_ram6_memory;
required_device<ram_device> m_gram_memory;
- void dsrspace_readz(address_space& space, offs_t offset, uint8_t* value, uint8_t mem_mask);
- void cartspace_readz(address_space& space, offs_t offset, uint8_t* value, uint8_t mem_mask);
- void grom_readz(address_space& space, offs_t offset, uint8_t* value, uint8_t mem_mask);
+ void dsrspace_readz(offs_t offset, uint8_t* value);
+ void cartspace_readz(offs_t offset, uint8_t* value);
+ void grom_readz(offs_t offset, uint8_t* value);
- void cartspace_write(address_space& space, offs_t offset, uint8_t data, uint8_t mem_mask);
- void grom_write(address_space& space, offs_t offset, uint8_t data, uint8_t mem_mask);
+ void cartspace_write(offs_t offset, uint8_t data);
+ void grom_write(offs_t offset, uint8_t data);
bool m_dsr_enabled;
bool m_gram_enabled;
diff --git a/src/devices/bus/ti99/peb/memex.cpp b/src/devices/bus/ti99/peb/memex.cpp
index 1d770a9b224..3a3116d262d 100644
--- a/src/devices/bus/ti99/peb/memex.cpp
+++ b/src/devices/bus/ti99/peb/memex.cpp
@@ -101,7 +101,7 @@ READ8Z_MEMBER( geneve_memex_device::readz )
/*
Memory write
*/
-WRITE8_MEMBER( geneve_memex_device::write )
+void geneve_memex_device::write(offs_t offset, uint8_t data)
{
/* If not Genmod, add the upper two address bits 10 */
if (!m_genmod) offset |= 0x100000;
@@ -152,11 +152,12 @@ INPUT_PORTS_START( memex )
PORT_DIPSETTING( MDIP8, "Lock out pages FC-FF")
INPUT_PORTS_END
-MACHINE_CONFIG_START(geneve_memex_device::device_add_mconfig)
+void geneve_memex_device::device_add_mconfig(machine_config &config)
+{
RAM(config, m_ram, 0);
m_ram->set_default_size("2M");
m_ram->set_default_value(0);
-MACHINE_CONFIG_END
+}
ioport_constructor geneve_memex_device::device_input_ports() const
{
diff --git a/src/devices/bus/ti99/peb/memex.h b/src/devices/bus/ti99/peb/memex.h
index 3aa44429dc0..fb7ca27a1ad 100644
--- a/src/devices/bus/ti99/peb/memex.h
+++ b/src/devices/bus/ti99/peb/memex.h
@@ -26,10 +26,10 @@ class geneve_memex_device : public device_t, public device_ti99_peribox_card_int
public:
geneve_memex_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
DECLARE_READ8Z_MEMBER(readz) override;
- DECLARE_WRITE8_MEMBER(write) override;
+ void write(offs_t offset, uint8_t data) override;
DECLARE_READ8Z_MEMBER(crureadz) override { }
- DECLARE_WRITE8_MEMBER(cruwrite) override { }
+ void cruwrite(offs_t offset, uint8_t data) override { }
protected:
void device_start() override;
diff --git a/src/devices/bus/ti99/peb/myarcmem.cpp b/src/devices/bus/ti99/peb/myarcmem.cpp
index ccb8f0091cf..79add7a6c72 100644
--- a/src/devices/bus/ti99/peb/myarcmem.cpp
+++ b/src/devices/bus/ti99/peb/myarcmem.cpp
@@ -101,7 +101,7 @@ READ8Z_MEMBER(myarc_memory_expansion_device::readz)
/*
Memory write access. DSRROM does not allow writing.
*/
-WRITE8_MEMBER(myarc_memory_expansion_device::write)
+void myarc_memory_expansion_device::write(offs_t offset, uint8_t data)
{
int base = get_base(offset);
@@ -142,7 +142,7 @@ READ8Z_MEMBER(myarc_memory_expansion_device::crureadz)
1006 = bit 2 of RAM bank value (512K)
1008 = bit 3 of RAM bank value (512K)
*/
-WRITE8_MEMBER(myarc_memory_expansion_device::cruwrite)
+void myarc_memory_expansion_device::cruwrite(offs_t offset, uint8_t data)
{
if (((offset & 0xff00)==MYARCMEM_CRU_BASE1)||((offset & 0xff00)==MYARCMEM_CRU_BASE2))
{
diff --git a/src/devices/bus/ti99/peb/myarcmem.h b/src/devices/bus/ti99/peb/myarcmem.h
index 3ea9d52419a..175b8d60344 100644
--- a/src/devices/bus/ti99/peb/myarcmem.h
+++ b/src/devices/bus/ti99/peb/myarcmem.h
@@ -25,10 +25,10 @@ class myarc_memory_expansion_device : public device_t, public device_ti99_peribo
public:
myarc_memory_expansion_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
DECLARE_READ8Z_MEMBER(readz) override;
- DECLARE_WRITE8_MEMBER(write) override;
+ void write(offs_t offset, uint8_t data) override;
DECLARE_READ8Z_MEMBER(crureadz) override;
- DECLARE_WRITE8_MEMBER(cruwrite) override;
+ void cruwrite(offs_t offset, uint8_t data) override;
protected:
void device_start() override;
diff --git a/src/devices/bus/ti99/peb/pcode.cpp b/src/devices/bus/ti99/peb/pcode.cpp
index f0a24ad1646..dbdd7c9f1a9 100644
--- a/src/devices/bus/ti99/peb/pcode.cpp
+++ b/src/devices/bus/ti99/peb/pcode.cpp
@@ -142,7 +142,7 @@ SETADDRESS_DBIN_MEMBER( ti_pcode_card_device::setaddress_dbin )
}
}
-void ti_pcode_card_device::debugger_read(address_space& space, uint16_t offset, uint8_t& value)
+void ti_pcode_card_device::debugger_read(uint16_t offset, uint8_t& value)
{
// The debuger does not call setaddress
if (m_active && ((offset & m_select_mask)==m_select_value))
@@ -160,7 +160,7 @@ READ8Z_MEMBER( ti_pcode_card_device::readz )
// Care for debugger
if (machine().side_effects_disabled())
{
- debugger_read(space, offset, *value);
+ debugger_read(offset, *value);
}
if (m_active && m_inDsrArea && m_selected)
@@ -200,7 +200,7 @@ READ8Z_MEMBER( ti_pcode_card_device::readz )
Write a byte in P-Code ROM space. This is only used for setting the
GROM address.
*/
-WRITE8_MEMBER( ti_pcode_card_device::write )
+void ti_pcode_card_device::write(offs_t offset, uint8_t data)
{
if (machine().side_effects_disabled()) return;
if (m_active && m_isgrom && m_selected)
@@ -253,7 +253,7 @@ READ8Z_MEMBER(ti_pcode_card_device::crureadz)
A8, A13, and A14 so bit 0 is at 0x1f00, but bit 4 is at 0x1f80. Accordingly,
bit 7 would be 0x1f86 but it is not used.
*/
-WRITE8_MEMBER(ti_pcode_card_device::cruwrite)
+void ti_pcode_card_device::cruwrite(offs_t offset, uint8_t data)
{
if ((offset & 0xff00)==CRU_BASE)
m_crulatch->write_bit((offset & 0x80) >> 5 | (offset & 0x06) >> 1, data);
diff --git a/src/devices/bus/ti99/peb/pcode.h b/src/devices/bus/ti99/peb/pcode.h
index 96462dba527..5e7a2cb6ce0 100644
--- a/src/devices/bus/ti99/peb/pcode.h
+++ b/src/devices/bus/ti99/peb/pcode.h
@@ -28,9 +28,9 @@ class ti_pcode_card_device : public device_t, public device_ti99_peribox_card_in
public:
ti_pcode_card_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
DECLARE_READ8Z_MEMBER(readz) override;
- DECLARE_WRITE8_MEMBER(write) override;
+ void write(offs_t offset, uint8_t data) override;
DECLARE_READ8Z_MEMBER(crureadz) override;
- DECLARE_WRITE8_MEMBER(cruwrite) override;
+ void cruwrite(offs_t offset, uint8_t data) override;
DECLARE_SETADDRESS_DBIN_MEMBER(setaddress_dbin) override;
DECLARE_WRITE_LINE_MEMBER(clock_in) override;
@@ -51,7 +51,7 @@ private:
DECLARE_WRITE_LINE_MEMBER(pcpage_w);
DECLARE_WRITE_LINE_MEMBER(ekrpg_w);
- void debugger_read(address_space& space, uint16_t addr, uint8_t& value);
+ void debugger_read(uint16_t addr, uint8_t& value);
required_device_array<tmc0430_device, 8> m_groms;
diff --git a/src/devices/bus/ti99/peb/peribox.cpp b/src/devices/bus/ti99/peb/peribox.cpp
index 80da29f6dd4..b75a15a49ed 100644
--- a/src/devices/bus/ti99/peb/peribox.cpp
+++ b/src/devices/bus/ti99/peb/peribox.cpp
@@ -272,15 +272,15 @@ READ8Z_MEMBER(peribox_device::readz)
{
for (int i=2; i <= 8; i++)
{
- if (m_slot[i]!=nullptr) m_slot[i]->readz(space, offset | m_address_prefix, value, mem_mask);
+ if (m_slot[i]!=nullptr) m_slot[i]->readz(offset | m_address_prefix, value);
}
}
-WRITE8_MEMBER(peribox_device::write)
+void peribox_device::write(offs_t offset, uint8_t data)
{
for (int i=2; i <= 8; i++)
{
- if (m_slot[i]!=nullptr) m_slot[i]->write(space, offset | m_address_prefix, data, mem_mask);
+ if (m_slot[i]!=nullptr) m_slot[i]->write(offset | m_address_prefix, data);
}
}
@@ -291,7 +291,7 @@ SETADDRESS_DBIN_MEMBER(peribox_device::setaddress_dbin)
for (int i=2; i <= 8; i++)
{
- if (m_slot[i]!=nullptr) m_slot[i]->setaddress_dbin(space, offset | m_address_prefix, state);
+ if (m_slot[i]!=nullptr) m_slot[i]->setaddress_dbin(offset | m_address_prefix, state);
}
}
@@ -299,15 +299,15 @@ READ8Z_MEMBER(peribox_device::crureadz)
{
for (int i=2; i <= 8; i++)
{
- if (m_slot[i]!=nullptr) m_slot[i]->crureadz(space, offset, value);
+ if (m_slot[i]!=nullptr) m_slot[i]->crureadz(offset, value);
}
}
-WRITE8_MEMBER(peribox_device::cruwrite)
+void peribox_device::cruwrite(offs_t offset, uint8_t data)
{
for (int i=2; i <= 8; i++)
{
- if (m_slot[i]!=nullptr) m_slot[i]->cruwrite(space, offset, data);
+ if (m_slot[i]!=nullptr) m_slot[i]->cruwrite(offset, data);
}
}
@@ -647,27 +647,27 @@ peribox_slot_device::peribox_slot_device(const machine_config &mconfig, const ch
READ8Z_MEMBER(peribox_slot_device::readz)
{
- m_card->readz(space, offset, value, mem_mask);
+ m_card->readz(offset, value);
}
-WRITE8_MEMBER(peribox_slot_device::write)
+void peribox_slot_device::write(offs_t offset, uint8_t data)
{
- m_card->write(space, offset, data, mem_mask);
+ m_card->write(offset, data);
}
SETADDRESS_DBIN_MEMBER(peribox_slot_device::setaddress_dbin)
{
- m_card->setaddress_dbin(space, offset, state);
+ m_card->setaddress_dbin(offset, state);
}
READ8Z_MEMBER(peribox_slot_device::crureadz)
{
- m_card->crureadz(space, offset, value);
+ m_card->crureadz(offset, value);
}
-WRITE8_MEMBER(peribox_slot_device::cruwrite)
+void peribox_slot_device::cruwrite(offs_t offset, uint8_t data)
{
- m_card->cruwrite(space, offset, data);
+ m_card->cruwrite(offset, data);
}
WRITE_LINE_MEMBER( peribox_slot_device::senila )
diff --git a/src/devices/bus/ti99/peb/peribox.h b/src/devices/bus/ti99/peb/peribox.h
index a936a5346ef..405ded3338e 100644
--- a/src/devices/bus/ti99/peb/peribox.h
+++ b/src/devices/bus/ti99/peb/peribox.h
@@ -36,11 +36,11 @@ public:
// Next eight methods are called from the console
DECLARE_READ8Z_MEMBER(readz) override;
- DECLARE_WRITE8_MEMBER(write) override;
+ void write(offs_t offset, uint8_t data) override;
DECLARE_SETADDRESS_DBIN_MEMBER(setaddress_dbin) override;
DECLARE_READ8Z_MEMBER(crureadz) override;
- DECLARE_WRITE8_MEMBER(cruwrite) override;
+ void cruwrite(offs_t offset, uint8_t data) override;
DECLARE_WRITE_LINE_MEMBER(senila);
DECLARE_WRITE_LINE_MEMBER(senilb);
@@ -176,9 +176,9 @@ class device_ti99_peribox_card_interface : public device_slot_card_interface
public:
virtual DECLARE_READ8Z_MEMBER(readz) = 0;
- virtual DECLARE_WRITE8_MEMBER(write) = 0;
+ virtual void write(offs_t offset, uint8_t data) = 0;
virtual DECLARE_READ8Z_MEMBER(crureadz) = 0;
- virtual DECLARE_WRITE8_MEMBER(cruwrite) = 0;
+ virtual void cruwrite(offs_t offset, uint8_t data) = 0;
virtual DECLARE_SETADDRESS_DBIN_MEMBER(setaddress_dbin) { };
virtual DECLARE_WRITE_LINE_MEMBER(clock_in) { }
@@ -231,7 +231,7 @@ public:
// Called from the box (direction to card)
DECLARE_READ8Z_MEMBER(readz);
- DECLARE_WRITE8_MEMBER(write);
+ void write(offs_t offset, uint8_t data);
DECLARE_SETADDRESS_DBIN_MEMBER(setaddress_dbin);
DECLARE_WRITE_LINE_MEMBER(senila);
@@ -245,7 +245,7 @@ public:
DECLARE_WRITE_LINE_MEMBER( set_ready );
DECLARE_READ8Z_MEMBER(crureadz);
- DECLARE_WRITE8_MEMBER(cruwrite);
+ void cruwrite(offs_t offset, uint8_t data);
// called from the box itself
void set_genmod(bool set);
diff --git a/src/devices/bus/ti99/peb/samsmem.cpp b/src/devices/bus/ti99/peb/samsmem.cpp
index 1bc315fed1f..dff96b57198 100644
--- a/src/devices/bus/ti99/peb/samsmem.cpp
+++ b/src/devices/bus/ti99/peb/samsmem.cpp
@@ -70,7 +70,7 @@ READ8Z_MEMBER(sams_memory_expansion_device::readz)
}
}
-WRITE8_MEMBER(sams_memory_expansion_device::write)
+void sams_memory_expansion_device::write(offs_t offset, uint8_t data)
{
int base;
@@ -104,7 +104,7 @@ READ8Z_MEMBER(sams_memory_expansion_device::crureadz)
/*
CRU write. Turns on the mapper and allows to change it.
*/
-WRITE8_MEMBER(sams_memory_expansion_device::cruwrite)
+void sams_memory_expansion_device::cruwrite(offs_t offset, uint8_t data)
{
if ((offset & 0xff00)==SAMS_CRU_BASE)
m_crulatch->write_bit((offset & 0x000e) >> 1, data);
diff --git a/src/devices/bus/ti99/peb/samsmem.h b/src/devices/bus/ti99/peb/samsmem.h
index c002252d773..da05b58438e 100644
--- a/src/devices/bus/ti99/peb/samsmem.h
+++ b/src/devices/bus/ti99/peb/samsmem.h
@@ -28,10 +28,10 @@ class sams_memory_expansion_device : public device_t, public device_ti99_peribox
public:
sams_memory_expansion_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
DECLARE_READ8Z_MEMBER(readz) override;
- DECLARE_WRITE8_MEMBER(write) override;
+ void write(offs_t offset, uint8_t data) override;
DECLARE_READ8Z_MEMBER(crureadz) override;
- DECLARE_WRITE8_MEMBER(cruwrite) override;
+ void cruwrite(offs_t offset, uint8_t data) override;
protected:
void device_start() override;
diff --git a/src/devices/bus/ti99/peb/spchsyn.cpp b/src/devices/bus/ti99/peb/spchsyn.cpp
index 0f10eea1f33..b4bcebf3c94 100644
--- a/src/devices/bus/ti99/peb/spchsyn.cpp
+++ b/src/devices/bus/ti99/peb/spchsyn.cpp
@@ -67,14 +67,14 @@ READ8Z_MEMBER( ti_speech_synthesizer_device::readz )
// lines by setting the address bus to a different value, but the
// Geneve may behave differently. This may not 100% reflect the real
// situation, but it ensures a safe processing.
- m_vsp->combined_rsq_wsq_w(space, 0, ~0);
+ m_vsp->combined_rsq_wsq_w(machine().dummy_space(), 0, ~0);
}
}
/*
Memory write
*/
-WRITE8_MEMBER( ti_speech_synthesizer_device::write )
+void ti_speech_synthesizer_device::write(offs_t offset, uint8_t data)
{
if (machine().side_effects_disabled()) return;
@@ -92,7 +92,6 @@ SETADDRESS_DBIN_MEMBER( ti_speech_synthesizer_device::setaddress_dbin )
// 1001 00xx xxxx xxx0 DBIN=1
// 1001 01xx xxxx xxx0 DBIN=0
// 1111 1000 0000 0001 mask
- m_space = &space;
m_reading = (state==ASSERT_LINE);
bool valid = (((offset & 0x0400)==0) == m_reading);
@@ -107,11 +106,11 @@ SETADDRESS_DBIN_MEMBER( ti_speech_synthesizer_device::setaddress_dbin )
// both RS* and WS* are active, which is illegal.
// Alternatively, we'll use the combined settings method
- m_vsp->combined_rsq_wsq_w(space, 0, m_reading ? ~tms5220_device::RS : ~tms5220_device::WS);
+ m_vsp->combined_rsq_wsq_w(machine().dummy_space(), 0, m_reading ? ~tms5220_device::RS : ~tms5220_device::WS);
}
else
// If other address, turn off RS* and WS* (negative logic!)
- m_vsp->combined_rsq_wsq_w(space, 0, ~0);
+ m_vsp->combined_rsq_wsq_w(machine().dummy_space(), 0, ~0);
}
/****************************************************************************/
@@ -126,13 +125,11 @@ WRITE_LINE_MEMBER( ti_speech_synthesizer_device::speech_ready )
if ((state==0) && !m_reading)
// Clear the lines only when we are done with writing.
- m_vsp->combined_rsq_wsq_w(*m_space, 0, ~0);
+ m_vsp->combined_rsq_wsq_w(machine().dummy_space(), 0, ~0);
}
void ti_speech_synthesizer_device::device_start()
{
- // We don't need to save m_space because the calling method
- // combined_rsq_wsq_w only needs the address space formally.
save_item(NAME(m_reading));
save_item(NAME(m_sbe));
}
diff --git a/src/devices/bus/ti99/peb/spchsyn.h b/src/devices/bus/ti99/peb/spchsyn.h
index 35bf0f680e8..8efee71aed7 100644
--- a/src/devices/bus/ti99/peb/spchsyn.h
+++ b/src/devices/bus/ti99/peb/spchsyn.h
@@ -26,11 +26,11 @@ class ti_speech_synthesizer_device : public device_t, public device_ti99_peribox
public:
ti_speech_synthesizer_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
DECLARE_READ8Z_MEMBER(readz) override;
- DECLARE_WRITE8_MEMBER(write) override;
+ void write(offs_t offset, uint8_t data) override;
DECLARE_SETADDRESS_DBIN_MEMBER(setaddress_dbin) override;
DECLARE_READ8Z_MEMBER(crureadz) override { }
- DECLARE_WRITE8_MEMBER(cruwrite) override { }
+ void cruwrite(offs_t offset, uint8_t data) override { }
protected:
virtual void device_start() override;
@@ -41,7 +41,6 @@ protected:
private:
DECLARE_WRITE_LINE_MEMBER( speech_ready );
- address_space* m_space;
required_device<cd2501e_device> m_vsp;
bool m_reading;
bool m_sbe; // Signal "Speech block enable"
diff --git a/src/devices/bus/ti99/peb/ti_32kmem.cpp b/src/devices/bus/ti99/peb/ti_32kmem.cpp
index fce434c70d7..b25c7d65784 100644
--- a/src/devices/bus/ti99/peb/ti_32kmem.cpp
+++ b/src/devices/bus/ti99/peb/ti_32kmem.cpp
@@ -82,7 +82,7 @@ READ8Z_MEMBER(ti_32k_expcard_device::readz)
}
}
-WRITE8_MEMBER(ti_32k_expcard_device::write)
+void ti_32k_expcard_device::write(offs_t offset, uint8_t data)
{
bool select = ((offset & 0xfc000)==0x7c000) | ((offset & 0xf6000)==0x72000); // PAL output pin 14 [1]
@@ -100,10 +100,11 @@ void ti_32k_expcard_device::device_start()
{
}
-MACHINE_CONFIG_START(ti_32k_expcard_device::device_add_mconfig)
+void ti_32k_expcard_device::device_add_mconfig(machine_config &config)
+{
RAM(config, m_ram, 0);
m_ram->set_default_size("32k");
m_ram->set_default_value(0);
-MACHINE_CONFIG_END
+}
} } } // end namespace bus::ti99::peb
diff --git a/src/devices/bus/ti99/peb/ti_32kmem.h b/src/devices/bus/ti99/peb/ti_32kmem.h
index 0ff492ca1c7..5ed0faac87c 100644
--- a/src/devices/bus/ti99/peb/ti_32kmem.h
+++ b/src/devices/bus/ti99/peb/ti_32kmem.h
@@ -26,10 +26,10 @@ class ti_32k_expcard_device : public device_t, public device_ti99_peribox_card_i
public:
ti_32k_expcard_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
DECLARE_READ8Z_MEMBER(readz) override;
- DECLARE_WRITE8_MEMBER(write) override;
+ void write(offs_t offset, uint8_t data) override;
DECLARE_READ8Z_MEMBER(crureadz) override { }
- DECLARE_WRITE8_MEMBER(cruwrite) override { }
+ void cruwrite(offs_t offset, uint8_t data) override { }
protected:
void device_start() override;
diff --git a/src/devices/bus/ti99/peb/ti_fdc.cpp b/src/devices/bus/ti99/peb/ti_fdc.cpp
index 530dc71d987..79d27cd5460 100644
--- a/src/devices/bus/ti99/peb/ti_fdc.cpp
+++ b/src/devices/bus/ti99/peb/ti_fdc.cpp
@@ -160,7 +160,7 @@ READ8Z_MEMBER(ti_fdc_device::readz)
}
}
-WRITE8_MEMBER(ti_fdc_device::write)
+void ti_fdc_device::write(offs_t offset, uint8_t data)
{
if (machine().side_effects_disabled()) return;
@@ -201,7 +201,7 @@ READ8Z_MEMBER(ti_fdc_device::crureadz)
if ((offset & 0xff00)==m_cru_base)
{
uint8_t reply = 0;
- if ((offset & 0x07) == 0)
+ if ((offset & 0x0070) == 0)
{
// Selected drive
reply |= ((m_DSEL)<<1);
@@ -212,12 +212,12 @@ READ8Z_MEMBER(ti_fdc_device::crureadz)
// Selected side
if (m_SIDSEL==ASSERT_LINE) reply |= 0x80;
}
- *value = reply;
+ *value = BIT(reply, (offset >> 1) & 0x07);
LOGMASKED(LOG_CRU, "Read CRU = %02x\n", *value);
}
}
-WRITE8_MEMBER(ti_fdc_device::cruwrite)
+void ti_fdc_device::cruwrite(offs_t offset, uint8_t data)
{
if ((offset & 0xff00)==m_cru_base)
m_crulatch->write_bit((offset >> 1) & 0x07, BIT(data, 0));
diff --git a/src/devices/bus/ti99/peb/ti_fdc.h b/src/devices/bus/ti99/peb/ti_fdc.h
index f7312661080..4c07bcb142e 100644
--- a/src/devices/bus/ti99/peb/ti_fdc.h
+++ b/src/devices/bus/ti99/peb/ti_fdc.h
@@ -28,11 +28,11 @@ class ti_fdc_device : public device_t, public device_ti99_peribox_card_interface
public:
ti_fdc_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
DECLARE_READ8Z_MEMBER(readz) override;
- DECLARE_WRITE8_MEMBER(write) override;
+ void write(offs_t offset, uint8_t data) override;
DECLARE_SETADDRESS_DBIN_MEMBER(setaddress_dbin) override;
DECLARE_READ8Z_MEMBER(crureadz) override;
- DECLARE_WRITE8_MEMBER(cruwrite) override;
+ void cruwrite(offs_t offset, uint8_t data) override;
// bool dvena_r();
diff --git a/src/devices/bus/ti99/peb/ti_rs232.cpp b/src/devices/bus/ti99/peb/ti_rs232.cpp
index 8f2ed3f4c45..cbc164bbcb2 100644
--- a/src/devices/bus/ti99/peb/ti_rs232.cpp
+++ b/src/devices/bus/ti99/peb/ti_rs232.cpp
@@ -254,17 +254,17 @@ READ8Z_MEMBER(ti_rs232_pio_device::crureadz)
if ((m_signals[0] & tms9902_device::CTS)!=0) reply |= 0x20;
if ((m_signals[1] & tms9902_device::CTS)!=0) reply |= 0x40;
if (m_led) reply |= 0x80;
- *value = reply;
+ *value = BIT(reply, (offset>>1) & 7);
return;
}
if ((offset & 0x00c0)==0x0040)
{
- *value = m_uart0->cruread(space, offset>>4, 0xff);
+ *value = m_uart0->cruread(offset>>1);
return;
}
if ((offset & 0x00c0)==0x0080)
{
- *value = m_uart1->cruread(space, offset>>4, 0xff);
+ *value = m_uart1->cruread(offset>>1);
return;
}
}
@@ -273,18 +273,18 @@ READ8Z_MEMBER(ti_rs232_pio_device::crureadz)
/*
CRU write
*/
-WRITE8_MEMBER(ti_rs232_pio_device::cruwrite)
+void ti_rs232_pio_device::cruwrite(offs_t offset, uint8_t data)
{
if ((offset & 0xff00)==m_cru_base)
{
if ((offset & 0x00c0)==0x0040)
{
- m_uart0->cruwrite(space, offset>>1, data, 0xff);
+ m_uart0->cruwrite(offset>>1, data);
return;
}
if ((offset & 0x00c0)==0x0080)
{
- m_uart1->cruwrite(space, offset>>1, data, 0xff);
+ m_uart1->cruwrite(offset>>1, data);
return;
}
@@ -403,7 +403,7 @@ READ8Z_MEMBER( ti_rs232_pio_device::readz )
/*
Memory write
*/
-WRITE8_MEMBER( ti_rs232_pio_device::write )
+void ti_rs232_pio_device::write(offs_t offset, uint8_t data)
{
if (((offset & m_select_mask)==m_select_value) && m_selected)
{
@@ -967,12 +967,12 @@ WRITE_LINE_MEMBER( ti_rs232_pio_device::rcv1_callback )
receive_data_or_line_state(1);
}
-WRITE8_MEMBER( ti_rs232_pio_device::xmit0_callback )
+void ti_rs232_pio_device::xmit0_callback(uint8_t data)
{
transmit_data(0, data);
}
-WRITE8_MEMBER( ti_rs232_pio_device::xmit1_callback )
+void ti_rs232_pio_device::xmit1_callback(uint8_t data)
{
transmit_data(1, data);
}
@@ -998,12 +998,12 @@ void ti_rs232_pio_device::ctrl_callback(int uartind, int offset, uint8_t data)
}
}
-WRITE8_MEMBER( ti_rs232_pio_device::ctrl0_callback )
+void ti_rs232_pio_device::ctrl0_callback(offs_t offset, uint8_t data)
{
ctrl_callback(0, offset, data);
}
-WRITE8_MEMBER( ti_rs232_pio_device::ctrl1_callback )
+void ti_rs232_pio_device::ctrl1_callback(offs_t offset, uint8_t data)
{
ctrl_callback(1, offset, data);
}
@@ -1101,7 +1101,8 @@ INPUT_PORTS_START( ti_rs232 )
PORT_CONFSETTING( 0x02, "5-20" )
INPUT_PORTS_END
-MACHINE_CONFIG_START(ti_rs232_pio_device::device_add_mconfig)
+void ti_rs232_pio_device::device_add_mconfig(machine_config &config)
+{
TMS9902(config, m_uart0, 3000000);
m_uart0->int_cb().set(FUNC(ti_rs232_pio_device::int0_callback));
m_uart0->rcv_cb().set(FUNC(ti_rs232_pio_device::rcv0_callback));
@@ -1128,7 +1129,7 @@ MACHINE_CONFIG_START(ti_rs232_pio_device::device_add_mconfig)
m_crulatch->q_out_cb<5>().set(FUNC(ti_rs232_pio_device::cts0_w));
m_crulatch->q_out_cb<6>().set(FUNC(ti_rs232_pio_device::cts1_w));
m_crulatch->q_out_cb<7>().set(FUNC(ti_rs232_pio_device::led_w));
-MACHINE_CONFIG_END
+}
const tiny_rom_entry *ti_rs232_pio_device::device_rom_region() const
{
diff --git a/src/devices/bus/ti99/peb/ti_rs232.h b/src/devices/bus/ti99/peb/ti_rs232.h
index 75e6ff582df..3c3b1e89d4b 100644
--- a/src/devices/bus/ti99/peb/ti_rs232.h
+++ b/src/devices/bus/ti99/peb/ti_rs232.h
@@ -32,10 +32,10 @@ class ti_rs232_pio_device : public device_t, public device_ti99_peribox_card_int
public:
ti_rs232_pio_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
DECLARE_READ8Z_MEMBER(readz) override;
- DECLARE_WRITE8_MEMBER(write) override;
+ void write(offs_t offset, uint8_t data) override;
DECLARE_READ8Z_MEMBER(crureadz) override;
- DECLARE_WRITE8_MEMBER(cruwrite) override;
+ void cruwrite(offs_t offset, uint8_t data) override;
protected:
void device_start() override;
@@ -50,10 +50,10 @@ private:
DECLARE_WRITE_LINE_MEMBER(int1_callback);
DECLARE_WRITE_LINE_MEMBER(rcv0_callback);
DECLARE_WRITE_LINE_MEMBER(rcv1_callback);
- DECLARE_WRITE8_MEMBER(xmit0_callback);
- DECLARE_WRITE8_MEMBER(xmit1_callback);
- DECLARE_WRITE8_MEMBER(ctrl0_callback);
- DECLARE_WRITE8_MEMBER(ctrl1_callback);
+ void xmit0_callback(uint8_t data);
+ void xmit1_callback(uint8_t data);
+ void ctrl0_callback(offs_t offset, uint8_t data);
+ void ctrl1_callback(offs_t offset, uint8_t data);
DECLARE_WRITE_LINE_MEMBER(selected_w);
DECLARE_WRITE_LINE_MEMBER(pio_direction_in_w);
diff --git a/src/devices/bus/ti99/peb/tn_ide.cpp b/src/devices/bus/ti99/peb/tn_ide.cpp
index 243450fd34f..4654a926791 100644
--- a/src/devices/bus/ti99/peb/tn_ide.cpp
+++ b/src/devices/bus/ti99/peb/tn_ide.cpp
@@ -71,9 +71,7 @@ READ8Z_MEMBER(nouspikel_ide_interface_device::crureadz)
uint8_t reply = 0;
if ((offset & 0xff00)==m_cru_base)
{
- int bit = (offset >> 4) & 7;
-
- if (bit==0)
+ if ((offset & 0x0070) == 0)
{
reply = m_cru_register & 0x30;
reply |= 8; /* IDE bus IORDY always set */
@@ -84,14 +82,14 @@ READ8Z_MEMBER(nouspikel_ide_interface_device::crureadz)
if (!m_ata_irq)
reply |= 1;
}
- *value = reply;
+ *value = BIT(reply, (offset >> 1) & 7);
}
}
/*
CRU write
*/
-WRITE8_MEMBER(nouspikel_ide_interface_device::cruwrite)
+void nouspikel_ide_interface_device::cruwrite(offs_t offset, uint8_t data)
{
if ((offset & 0xff00)==m_cru_base)
{
@@ -146,18 +144,18 @@ READ8Z_MEMBER(nouspikel_ide_interface_device::readz)
case 0: /* RTC RAM */
if (addr & 0x80)
/* RTC RAM page register */
- reply = m_rtc->xram_r(machine().dummy_space(), (addr & 0x1f) | 0x20);
+ reply = m_rtc->xram_r((addr & 0x1f) | 0x20);
else
/* RTC RAM read */
- reply = m_rtc->xram_r(machine().dummy_space(), addr);
+ reply = m_rtc->xram_r(addr);
break;
case 1: /* RTC registers */
if (addr & 0x10)
/* register data */
- reply = m_rtc->rtc_r(machine().dummy_space(), 1);
+ reply = m_rtc->rtc_r(1);
else
/* register select */
- reply = m_rtc->rtc_r(machine().dummy_space(), 0);
+ reply = m_rtc->rtc_r(0);
break;
case 2: /* IDE registers set 1 (CS1Fx) */
if (m_tms9995_mode ? (!(addr & 1)) : (addr & 1))
@@ -197,7 +195,7 @@ READ8Z_MEMBER(nouspikel_ide_interface_device::readz)
/*
Memory write. The controller is 16 bit, so we need to demultiplex again.
*/
-WRITE8_MEMBER(nouspikel_ide_interface_device::write)
+void nouspikel_ide_interface_device::write(offs_t offset, uint8_t data)
{
if (machine().side_effects_disabled()) return;
@@ -217,18 +215,18 @@ WRITE8_MEMBER(nouspikel_ide_interface_device::write)
case 0: /* RTC RAM */
if (addr & 0x80)
/* RTC RAM page register */
- m_rtc->xram_w(machine().dummy_space(), (addr & 0x1f) | 0x20, data);
+ m_rtc->xram_w((addr & 0x1f) | 0x20, data);
else
/* RTC RAM write */
- m_rtc->xram_w(machine().dummy_space(), addr, data);
+ m_rtc->xram_w(addr, data);
break;
case 1: /* RTC registers */
if (addr & 0x10)
/* register data */
- m_rtc->rtc_w(machine().dummy_space(), 1, data);
+ m_rtc->rtc_w(1, data);
else
/* register select */
- m_rtc->rtc_w(machine().dummy_space(), 0, data);
+ m_rtc->rtc_w(0, data);
break;
case 2: /* IDE registers set 1 (CS1Fx) */
/*
diff --git a/src/devices/bus/ti99/peb/tn_ide.h b/src/devices/bus/ti99/peb/tn_ide.h
index b4aa66f2fe3..51d516d5af0 100644
--- a/src/devices/bus/ti99/peb/tn_ide.h
+++ b/src/devices/bus/ti99/peb/tn_ide.h
@@ -28,10 +28,10 @@ class nouspikel_ide_interface_device : public device_t, public device_ti99_perib
public:
nouspikel_ide_interface_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
DECLARE_READ8Z_MEMBER(readz) override;
- DECLARE_WRITE8_MEMBER(write) override;
+ void write(offs_t offset, uint8_t data) override;
DECLARE_READ8Z_MEMBER(crureadz) override;
- DECLARE_WRITE8_MEMBER(cruwrite) override;
+ void cruwrite(offs_t offset, uint8_t data) override;
void do_inta(int state);
bool m_ata_irq;
diff --git a/src/devices/bus/ti99/peb/tn_usbsm.cpp b/src/devices/bus/ti99/peb/tn_usbsm.cpp
index 813ced0eb0d..77f933667e9 100644
--- a/src/devices/bus/ti99/peb/tn_usbsm.cpp
+++ b/src/devices/bus/ti99/peb/tn_usbsm.cpp
@@ -93,9 +93,8 @@ READ8Z_MEMBER(nouspikel_usb_smartmedia_device::crureadz)
if ((offset & 0xff00)==m_cru_base)
{
uint8_t reply = 0;
- offset &= 3;
- if (offset == 0)
+ if ((offset & 0x0030) == 0)
{
// bit
// 0 >1x00 0: USB Host controller requests interrupt.
@@ -117,14 +116,14 @@ READ8Z_MEMBER(nouspikel_usb_smartmedia_device::crureadz)
else if (!m_smartmedia->is_protected())
reply |= 0x80;
}
- *value = reply;
+ *value = BIT(reply, (offset >> 1) & 7);
}
}
/*
CRU write
*/
-WRITE8_MEMBER(nouspikel_usb_smartmedia_device::cruwrite)
+void nouspikel_usb_smartmedia_device::cruwrite(offs_t offset, uint8_t data)
{
if ((offset & 0xff00)==m_cru_base)
{
@@ -212,7 +211,7 @@ READ8Z_MEMBER(nouspikel_usb_smartmedia_device::readz)
{
// FEEPROM
if (!m_write_flash)
- m_input_latch = m_flash->read16(space, (offset>>1)&0xffff);
+ m_input_latch = m_flash->read16((offset>>1)&0xffff);
}
}
else
@@ -240,7 +239,7 @@ READ8Z_MEMBER(nouspikel_usb_smartmedia_device::readz)
/*
Memory write. The controller is 16 bit, so we need to demultiplex again.
*/
-WRITE8_MEMBER(nouspikel_usb_smartmedia_device::write)
+void nouspikel_usb_smartmedia_device::write(offs_t offset, uint8_t data)
{
if (machine().side_effects_disabled()) return;
@@ -280,7 +279,7 @@ WRITE8_MEMBER(nouspikel_usb_smartmedia_device::write)
else
{ // FEEPROM
if (m_write_flash)
- m_flash->write16(space, (offset>>1)&0xffff, m_output_latch);
+ m_flash->write16((offset>>1)&0xffff, m_output_latch);
}
}
else
@@ -366,12 +365,13 @@ INPUT_PORTS_START( tn_usbsm )
PORT_DIPSETTING( 0x01, "Geneve mode")
INPUT_PORTS_END
-MACHINE_CONFIG_START(nouspikel_usb_smartmedia_device::device_add_mconfig)
+void nouspikel_usb_smartmedia_device::device_add_mconfig(machine_config &config)
+{
SMARTMEDIA(config, "smartmedia", 0);
STRATAFLASH(config, STRATA_TAG, 0);
RAM(config, RAM1_TAG).set_default_size("512K").set_default_value(0);
RAM(config, RAM2_TAG).set_default_size("512K").set_default_value(0);
-MACHINE_CONFIG_END
+}
ioport_constructor nouspikel_usb_smartmedia_device::device_input_ports() const
{
diff --git a/src/devices/bus/ti99/peb/tn_usbsm.h b/src/devices/bus/ti99/peb/tn_usbsm.h
index a379d67102c..52c2690f3ed 100644
--- a/src/devices/bus/ti99/peb/tn_usbsm.h
+++ b/src/devices/bus/ti99/peb/tn_usbsm.h
@@ -28,10 +28,10 @@ class nouspikel_usb_smartmedia_device : public device_t, public device_ti99_peri
public:
nouspikel_usb_smartmedia_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
DECLARE_READ8Z_MEMBER(readz) override;
- DECLARE_WRITE8_MEMBER(write) override;
+ void write(offs_t offset, uint8_t data) override;
DECLARE_READ8Z_MEMBER(crureadz) override;
- DECLARE_WRITE8_MEMBER(cruwrite) override;
+ void cruwrite(offs_t offset, uint8_t data) override;
protected:
virtual void device_start() override;
diff --git a/src/devices/bus/ti99/ti99defs.h b/src/devices/bus/ti99/ti99defs.h
index 32d7c88ed38..46bb67aaae9 100644
--- a/src/devices/bus/ti99/ti99defs.h
+++ b/src/devices/bus/ti99/ti99defs.h
@@ -52,8 +52,8 @@
devices as in the real machine, and only the active device changes the bus lines.
*/
-#define READ8Z_MEMBER(name) void name(ATTR_UNUSED address_space &space, ATTR_UNUSED offs_t offset, ATTR_UNUSED uint8_t *value, ATTR_UNUSED uint8_t mem_mask)
-#define DECLARE_READ8Z_MEMBER(name) void name(ATTR_UNUSED address_space &space, ATTR_UNUSED offs_t offset, ATTR_UNUSED uint8_t *value, ATTR_UNUSED uint8_t mem_mask = 0xff)
+#define READ8Z_MEMBER(name) void name(ATTR_UNUSED offs_t offset, ATTR_UNUSED uint8_t *value)
+#define DECLARE_READ8Z_MEMBER(name) void name(ATTR_UNUSED offs_t offset, ATTR_UNUSED uint8_t *value)
/*
For almost all applications of setoffset, we also need the data bus
@@ -61,7 +61,7 @@
that this is a general rule, we use new macros here which contain the
DBIN setting.
*/
-#define SETADDRESS_DBIN_MEMBER(name) void name(ATTR_UNUSED address_space &space, ATTR_UNUSED offs_t offset, ATTR_UNUSED int state)
-#define DECLARE_SETADDRESS_DBIN_MEMBER(name) void name(ATTR_UNUSED address_space &space, ATTR_UNUSED offs_t offset, ATTR_UNUSED int state)
+#define SETADDRESS_DBIN_MEMBER(name) void name(ATTR_UNUSED offs_t offset, ATTR_UNUSED int state)
+#define DECLARE_SETADDRESS_DBIN_MEMBER(name) void name(ATTR_UNUSED offs_t offset, ATTR_UNUSED int state)
#endif // MAME_BUS_TI99_TI99DEFS_H
diff --git a/src/devices/bus/ti99x/990_dk.cpp b/src/devices/bus/ti99x/990_dk.cpp
index 118804ddb2b..a634bba7a24 100644
--- a/src/devices/bus/ti99x/990_dk.cpp
+++ b/src/devices/bus/ti99x/990_dk.cpp
@@ -709,19 +709,16 @@ READ8_MEMBER( fd800_legacy_device::cru_r )
{
int reply = 0;
- switch (offset)
+ offset &= 31;
+ if (offset < 16)
{
- case 0:
- case 1:
// receive buffer
- reply = m_recv_buf >> (offset*8);
- break;
-
- case 2:
- case 3:
+ reply = BIT(m_recv_buf, offset);
+ }
+ else
+ {
// status register
- reply = m_stat_reg >> ((offset-2)*8);
- break;
+ reply = BIT(m_stat_reg, offset - 16);
}
return reply;
diff --git a/src/devices/bus/ti99x/990_hd.cpp b/src/devices/bus/ti99x/990_hd.cpp
index 9bfef6e075b..c17f63b807e 100644
--- a/src/devices/bus/ti99x/990_hd.cpp
+++ b/src/devices/bus/ti99x/990_hd.cpp
@@ -463,7 +463,7 @@ void ti990_hdc_device::store_registers()
if (! (m_w[1] & w1_transfer_inhibit))
for (i=0; i<real_word_count; i++)
{
- machine().device("maincpu")->memory().space(AS_PROGRAM).write_word(dma_address, buffer[i]);
+ m_memory_space->write_word(dma_address, buffer[i]);
dma_address = (dma_address + 2) & 0x1ffffe;
}
@@ -618,7 +618,7 @@ void ti990_hdc_device::read_data()
if (! (m_w[1] & w1_transfer_inhibit))
for (i=0; i<bytes_read; i+=2)
{
- machine().device("maincpu")->memory().space(AS_PROGRAM).write_word(dma_address, (((int) buffer[i]) << 8) | buffer[i+1]);
+ m_memory_space->write_word(dma_address, (((int) buffer[i]) << 8) | buffer[i+1]);
dma_address = (dma_address + 2) & 0x1ffffe;
}
@@ -714,7 +714,7 @@ void ti990_hdc_device::write_data()
/* DMA */
for (i=0; (i<byte_count) && (i<m_d[dsk_sel].bytes_per_sector); i+=2)
{
- word = machine().device("maincpu")->memory().space(AS_PROGRAM).read_word(dma_address);
+ word = m_memory_space->read_word(dma_address);
buffer[i] = word >> 8;
buffer[i+1] = word & 0xff;
@@ -821,7 +821,7 @@ void ti990_hdc_device::unformatted_read()
if (! (m_w[1] & w1_transfer_inhibit))
for (i=0; i<real_word_count; i++)
{
- machine().device("maincpu")->memory().space(AS_PROGRAM).write_word(dma_address, buffer[i]);
+ m_memory_space->write_word(dma_address, buffer[i]);
dma_address = (dma_address + 2) & 0x1ffffe;
}
@@ -962,7 +962,9 @@ WRITE16_MEMBER(ti990_hdc_device::write)
DEFINE_DEVICE_TYPE(TI990_HDC, ti990_hdc_device, "ti990_hdc", "Generic TI-990 Hard Disk Controller")
ti990_hdc_device::ti990_hdc_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
- : device_t(mconfig, TI990_HDC, tag, owner, clock), m_interrupt_callback(*this)
+ : device_t(mconfig, TI990_HDC, tag, owner, clock)
+ , m_memory_space(*this, finder_base::DUMMY_TAG, -1)
+ , m_interrupt_callback(*this)
{
}
diff --git a/src/devices/bus/ti99x/990_hd.h b/src/devices/bus/ti99x/990_hd.h
index 47fe5d947f6..803e9ca7c79 100644
--- a/src/devices/bus/ti99x/990_hd.h
+++ b/src/devices/bus/ti99x/990_hd.h
@@ -23,6 +23,7 @@ public:
DECLARE_DEVICE_IMAGE_LOAD_MEMBER( ti990_hd );
DECLARE_DEVICE_IMAGE_UNLOAD_MEMBER( ti990_hd );
+ template <typename T> void set_memory_space(T &&tag, int spacenum) { m_memory_space.set_tag(std::forward<T>(tag), spacenum); }
auto int_cb() { return m_interrupt_callback.bind(); }
protected:
@@ -72,6 +73,8 @@ private:
uint16_t m_w[8];
+ required_address_space m_memory_space;
+
devcb_write_line m_interrupt_callback;
hd_unit_t m_d[MAX_DISK_UNIT];
diff --git a/src/devices/bus/ti99x/990_tap.cpp b/src/devices/bus/ti99x/990_tap.cpp
index db41dc94c2b..cafefbffda8 100644
--- a/src/devices/bus/ti99x/990_tap.cpp
+++ b/src/devices/bus/ti99x/990_tap.cpp
@@ -257,7 +257,7 @@ void tap_990_device::cmd_read_binary_forward()
/* DMA */
for (i=0; i<bytes_read; i+=2)
{
- machine().device("maincpu")->memory().space(AS_PROGRAM).write_word(dma_address, (((int) buffer[i]) << 8) | buffer[i+1]);
+ m_memory_space->write_word(dma_address, (((int) buffer[i]) << 8) | buffer[i+1]);
dma_address = (dma_address + 2) & 0x1ffffe;
}
@@ -956,14 +956,13 @@ void ti990_tape_image_device::call_unload()
tpc->set_tape(tape_get_id(), this, false, false, true);
}
-#define MCFG_TI990_TAPE_ADD(_tag) \
- MCFG_DEVICE_ADD((_tag), TI990_TAPE, 0)
-
DEFINE_DEVICE_TYPE(TI990_TAPE_CTRL, tap_990_device, "ti990_tap", "Generic TI-900 Tape Controller")
tap_990_device::tap_990_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
- : device_t(mconfig, TI990_TAPE_CTRL, tag, owner, clock), m_int_line(*this)
+ : device_t(mconfig, TI990_TAPE_CTRL, tag, owner, clock)
+ , m_memory_space(*this, finder_base::DUMMY_TAG, -1)
+ , m_int_line(*this)
{
}
@@ -987,9 +986,10 @@ void tap_990_device::device_start()
// device_add_mconfig - add device configuration
//-------------------------------------------------
-MACHINE_CONFIG_START(tap_990_device::device_add_mconfig)
- MCFG_TI990_TAPE_ADD("tape0")
- MCFG_TI990_TAPE_ADD("tape1")
- MCFG_TI990_TAPE_ADD("tape2")
- MCFG_TI990_TAPE_ADD("tape3")
-MACHINE_CONFIG_END
+void tap_990_device::device_add_mconfig(machine_config &config)
+{
+ TI990_TAPE(config, "tape0", 0);
+ TI990_TAPE(config, "tape1", 0);
+ TI990_TAPE(config, "tape2", 0);
+ TI990_TAPE(config, "tape3", 0);
+}
diff --git a/src/devices/bus/ti99x/990_tap.h b/src/devices/bus/ti99x/990_tap.h
index a35a09b26a4..3be370a9f5a 100644
--- a/src/devices/bus/ti99x/990_tap.h
+++ b/src/devices/bus/ti99x/990_tap.h
@@ -26,6 +26,7 @@ public:
m_tape[id].wp = wp;
}
+ template <typename T> void set_memory_space(T &&tag, int spacenum) { m_memory_space.set_tag(std::forward<T>(tag), spacenum); }
auto int_cb() { return m_int_line.bind(); }
protected:
@@ -54,6 +55,8 @@ private:
void read_transport_status();
void execute_command();
+ required_address_space m_memory_space;
+
devcb_write_line m_int_line;
uint16_t m_w[8];
diff --git a/src/devices/bus/tiki100/8088.cpp b/src/devices/bus/tiki100/8088.cpp
index f3a0e5d0dfd..0a940fcbc2c 100644
--- a/src/devices/bus/tiki100/8088.cpp
+++ b/src/devices/bus/tiki100/8088.cpp
@@ -64,14 +64,15 @@ void tiki100_8088_device::i8088_io(address_map &map)
//-------------------------------------------------
-// MACHINE_CONFIG_START( tiki100_8088 )
+// device_add_mconfig()
//-------------------------------------------------
-MACHINE_CONFIG_START(tiki100_8088_device::device_add_mconfig)
- MCFG_DEVICE_ADD(I8088_TAG, I8088, 6000000)
- MCFG_DEVICE_PROGRAM_MAP(i8088_mem)
- MCFG_DEVICE_IO_MAP(i8088_io)
-MACHINE_CONFIG_END
+void tiki100_8088_device::device_add_mconfig(machine_config &config)
+{
+ I8088(config, m_maincpu, 6000000);
+ m_maincpu->set_addrmap(AS_PROGRAM, &tiki100_8088_device::i8088_mem);
+ m_maincpu->set_addrmap(AS_IO, &tiki100_8088_device::i8088_io);
+}
@@ -117,7 +118,7 @@ void tiki100_8088_device::device_reset()
// tiki100bus_iorq_r - I/O read
//-------------------------------------------------
-uint8_t tiki100_8088_device::iorq_r(address_space &space, offs_t offset, uint8_t data)
+uint8_t tiki100_8088_device::iorq_r(offs_t offset, uint8_t data)
{
if ((offset & 0xff) == 0x7f)
{
@@ -132,7 +133,7 @@ uint8_t tiki100_8088_device::iorq_r(address_space &space, offs_t offset, uint8_t
// tiki100bus_iorq_w - I/O write
//-------------------------------------------------
-void tiki100_8088_device::iorq_w(address_space &space, offs_t offset, uint8_t data)
+void tiki100_8088_device::iorq_w(offs_t offset, uint8_t data)
{
if ((offset & 0xff) == 0x7f)
{
diff --git a/src/devices/bus/tiki100/8088.h b/src/devices/bus/tiki100/8088.h
index c9fcca86807..2e4e6966172 100644
--- a/src/devices/bus/tiki100/8088.h
+++ b/src/devices/bus/tiki100/8088.h
@@ -37,8 +37,8 @@ protected:
virtual void device_add_mconfig(machine_config &config) override;
// device_tiki100bus_card_interface overrides
- virtual uint8_t iorq_r(address_space &space, offs_t offset, uint8_t data) override;
- virtual void iorq_w(address_space &space, offs_t offset, uint8_t data) override;
+ virtual uint8_t iorq_r(offs_t offset, uint8_t data) override;
+ virtual void iorq_w(offs_t offset, uint8_t data) override;
private:
required_device<i8088_cpu_device> m_maincpu;
diff --git a/src/devices/bus/tiki100/exp.cpp b/src/devices/bus/tiki100/exp.cpp
index 95aff70d106..2d3dfc22031 100644
--- a/src/devices/bus/tiki100/exp.cpp
+++ b/src/devices/bus/tiki100/exp.cpp
@@ -99,13 +99,13 @@ void tiki100_bus_device::add_card(device_tiki100bus_card_interface *card)
// mrq_r - memory read
//-------------------------------------------------
-uint8_t tiki100_bus_device::mrq_r(address_space &space, offs_t offset, uint8_t data, bool &mdis)
+uint8_t tiki100_bus_device::mrq_r(offs_t offset, uint8_t data, bool &mdis)
{
device_tiki100bus_card_interface *entry = m_device_list.first();
while (entry)
{
- data &= entry->mrq_r(space, offset, data, mdis);
+ data &= entry->mrq_r(offset, data, mdis);
entry = entry->next();
}
@@ -117,13 +117,13 @@ uint8_t tiki100_bus_device::mrq_r(address_space &space, offs_t offset, uint8_t d
// mrq_w - memory write
//-------------------------------------------------
-WRITE8_MEMBER( tiki100_bus_device::mrq_w )
+void tiki100_bus_device::mrq_w(offs_t offset, uint8_t data)
{
device_tiki100bus_card_interface *entry = m_device_list.first();
while (entry)
{
- entry->mrq_w(space, offset, data);
+ entry->mrq_w(offset, data);
entry = entry->next();
}
}
@@ -133,13 +133,13 @@ WRITE8_MEMBER( tiki100_bus_device::mrq_w )
// iorq_r - I/O read
//-------------------------------------------------
-uint8_t tiki100_bus_device::iorq_r(address_space &space, offs_t offset, uint8_t data)
+uint8_t tiki100_bus_device::iorq_r(offs_t offset, uint8_t data)
{
device_tiki100bus_card_interface *entry = m_device_list.first();
while (entry)
{
- data &= entry->iorq_r(space, offset, data);
+ data &= entry->iorq_r(offset, data);
entry = entry->next();
}
@@ -151,13 +151,13 @@ uint8_t tiki100_bus_device::iorq_r(address_space &space, offs_t offset, uint8_t
// iorq_w - I/O write
//-------------------------------------------------
-WRITE8_MEMBER( tiki100_bus_device::iorq_w )
+void tiki100_bus_device::iorq_w(offs_t offset, uint8_t data)
{
device_tiki100bus_card_interface *entry = m_device_list.first();
while (entry)
{
- entry->iorq_w(space, offset, data);
+ entry->iorq_w(offset, data);
entry = entry->next();
}
}
diff --git a/src/devices/bus/tiki100/exp.h b/src/devices/bus/tiki100/exp.h
index fb82a62fdce..9b0375daaa9 100644
--- a/src/devices/bus/tiki100/exp.h
+++ b/src/devices/bus/tiki100/exp.h
@@ -25,36 +25,6 @@
#define TIKI100_BUS_TAG "tiki100bus"
-
-//**************************************************************************
-// INTERFACE CONFIGURATION MACROS
-//**************************************************************************
-
-#define MCFG_TIKI100_BUS_ADD() \
- MCFG_DEVICE_ADD(TIKI100_BUS_TAG, TIKI100_BUS, 0)
-
-#define MCFG_TIKI100_BUS_SLOT_ADD(_tag, _def_slot) \
- MCFG_DEVICE_ADD(_tag, TIKI100_BUS_SLOT, 0) \
- MCFG_DEVICE_SLOT_INTERFACE(tiki100_cards, _def_slot, false)
-
-
-#define MCFG_TIKI100_BUS_IRQ_CALLBACK(_write) \
- downcast<tiki100_bus_device &>(*device).set_irq_wr_callback(DEVCB_##_write);
-
-#define MCFG_TIKI100_BUS_NMI_CALLBACK(_write) \
- downcast<tiki100_bus_device &>(*device).set_nmi_wr_callback(DEVCB_##_write);
-
-#define MCFG_TIKI100_BUS_BUSRQ_CALLBACK(_write) \
- downcast<tiki100_bus_device &>(*device).set_busrq_wr_callback(DEVCB_##_write);
-
-#define MCFG_TIKI100_BUS_IN_MREQ_CALLBACK(_read) \
- downcast<tiki100_bus_device &>(*device).set_mrq_rd_callback(DEVCB_##_read);
-
-#define MCFG_TIKI100_BUS_OUT_MREQ_CALLBACK(_write) \
- downcast<tiki100_bus_device &>(*device).set_mrq_wr_callback(DEVCB_##_write);
-
-
-
//**************************************************************************
// TYPE DEFINITIONS
//**************************************************************************
@@ -76,12 +46,12 @@ public:
device_tiki100bus_card_interface *next() const { return m_next; }
// memory access
- virtual uint8_t mrq_r(address_space &space, offs_t offset, uint8_t data, bool &mdis) { mdis = 1; return data; }
- virtual void mrq_w(address_space &space, offs_t offset, uint8_t data) { }
+ virtual uint8_t mrq_r(offs_t offset, uint8_t data, bool &mdis) { mdis = 1; return data; }
+ virtual void mrq_w(offs_t offset, uint8_t data) { }
// I/O access
- virtual uint8_t iorq_r(address_space &space, offs_t offset, uint8_t data) { return data; }
- virtual void iorq_w(address_space &space, offs_t offset, uint8_t data) { }
+ virtual uint8_t iorq_r(offs_t offset, uint8_t data) { return data; }
+ virtual void iorq_w(offs_t offset, uint8_t data) { }
virtual void busak_w(int state) { m_busak = state; }
@@ -111,7 +81,17 @@ class tiki100_bus_slot_device : public device_t,
{
public:
// construction/destruction
- tiki100_bus_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+ template <typename T>
+ tiki100_bus_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, T &&opts, const char *dflt)
+ : tiki100_bus_slot_device(mconfig, tag, owner, 0)
+ {
+ option_reset();
+ opts(*this);
+ set_default_option(dflt);
+ set_fixed(false);
+ }
+
+ tiki100_bus_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock = 0);
// device-level overrides
virtual void device_start() override;
@@ -142,20 +122,20 @@ public:
tiki100_bus_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
~tiki100_bus_device() { m_device_list.detach_all(); }
- template <class Object> devcb_base &set_irq_wr_callback(Object &&cb) { return m_irq_cb.set_callback(std::forward<Object>(cb)); }
- template <class Object> devcb_base &set_nmi_wr_callback(Object &&cb) { return m_nmi_cb.set_callback(std::forward<Object>(cb)); }
- template <class Object> devcb_base &set_busrq_wr_callback(Object &&cb) { return m_busrq_cb.set_callback(std::forward<Object>(cb)); }
- template <class Object> devcb_base &set_mrq_rd_callback(Object &&cb) { return m_in_mrq_cb.set_callback(std::forward<Object>(cb)); }
- template <class Object> devcb_base &set_mrq_wr_callback(Object &&cb) { return m_out_mrq_cb.set_callback(std::forward<Object>(cb)); }
+ auto irq_wr_callback() { return m_irq_cb.bind(); }
+ auto nmi_wr_callback() { return m_nmi_cb.bind(); }
+ auto busrq_wr_callback() { return m_busrq_cb.bind(); }
+ auto mrq_rd_callback() { return m_in_mrq_cb.bind(); }
+ auto mrq_wr_callback() { return m_out_mrq_cb.bind(); }
void add_card(device_tiki100bus_card_interface *card);
// computer interface
- uint8_t mrq_r(address_space &space, offs_t offset, uint8_t data, bool &mdis);
- DECLARE_WRITE8_MEMBER( mrq_w );
+ uint8_t mrq_r(offs_t offset, uint8_t data, bool &mdis);
+ void mrq_w(offs_t offset, uint8_t data);
- uint8_t iorq_r(address_space &space, offs_t offset, uint8_t data);
- DECLARE_WRITE8_MEMBER( iorq_w );
+ uint8_t iorq_r(offs_t offset, uint8_t data);
+ void iorq_w(offs_t offset, uint8_t data);
DECLARE_WRITE_LINE_MEMBER( busak_w );
@@ -163,8 +143,8 @@ public:
DECLARE_WRITE_LINE_MEMBER( irq_w ) { m_irq_cb(state); }
DECLARE_WRITE_LINE_MEMBER( nmi_w ) { m_nmi_cb(state); }
DECLARE_WRITE_LINE_MEMBER( busrq_w ) { m_busrq_cb(state); }
- DECLARE_READ8_MEMBER( exin_mrq_r ) { return m_in_mrq_cb(offset); }
- DECLARE_WRITE8_MEMBER( exin_mrq_w ) { m_out_mrq_cb(offset, data); }
+ uint8_t exin_mrq_r(offs_t offset) { return m_in_mrq_cb(offset); }
+ void exin_mrq_w(offs_t offset, uint8_t data) { m_out_mrq_cb(offset, data); }
protected:
// device-level overrides
diff --git a/src/devices/bus/tiki100/hdc.cpp b/src/devices/bus/tiki100/hdc.cpp
index 9a997119935..a351d83daca 100644
--- a/src/devices/bus/tiki100/hdc.cpp
+++ b/src/devices/bus/tiki100/hdc.cpp
@@ -85,11 +85,11 @@ void tiki100_hdc_device::device_reset()
// tiki100bus_iorq_r - I/O read
//-------------------------------------------------
-uint8_t tiki100_hdc_device::iorq_r(address_space &space, offs_t offset, uint8_t data)
+uint8_t tiki100_hdc_device::iorq_r(offs_t offset, uint8_t data)
{
if ((offset & 0xf8) == 0x20)
{
- data = m_hdc->read(space, offset & 0x07);
+ data = m_hdc->read(offset & 0x07);
}
return data;
@@ -100,10 +100,10 @@ uint8_t tiki100_hdc_device::iorq_r(address_space &space, offs_t offset, uint8_t
// tiki100bus_iorq_w - I/O write
//-------------------------------------------------
-void tiki100_hdc_device::iorq_w(address_space &space, offs_t offset, uint8_t data)
+void tiki100_hdc_device::iorq_w(offs_t offset, uint8_t data)
{
if ((offset & 0xf8) == 0x20)
{
- m_hdc->write(space, offset, data);
+ m_hdc->write(offset, data);
}
}
diff --git a/src/devices/bus/tiki100/hdc.h b/src/devices/bus/tiki100/hdc.h
index 1c0447acff5..d38927ff004 100644
--- a/src/devices/bus/tiki100/hdc.h
+++ b/src/devices/bus/tiki100/hdc.h
@@ -36,8 +36,8 @@ protected:
virtual void device_add_mconfig(machine_config &config) override;
// device_tiki100bus_card_interface overrides
- virtual uint8_t iorq_r(address_space &space, offs_t offset, uint8_t data) override;
- virtual void iorq_w(address_space &space, offs_t offset, uint8_t data) override;
+ virtual uint8_t iorq_r(offs_t offset, uint8_t data) override;
+ virtual void iorq_w(offs_t offset, uint8_t data) override;
private:
required_device<wd2010_device> m_hdc;
diff --git a/src/devices/bus/tmc600/euro.h b/src/devices/bus/tmc600/euro.h
index 7fe8c3c0ff6..51a4e435f2f 100644
--- a/src/devices/bus/tmc600/euro.h
+++ b/src/devices/bus/tmc600/euro.h
@@ -56,17 +56,6 @@
#define TMC600_EURO_BUS_TAG "bus"
-
-//**************************************************************************
-// INTERFACE CONFIGURATION MACROS
-//**************************************************************************
-
-#define MCFG_TMC600_EURO_BUS_SLOT_ADD(_tag, _slot_intf, _def_slot) \
- MCFG_DEVICE_ADD(_tag, TMC600_EURO_BUS_SLOT, 0) \
- MCFG_DEVICE_SLOT_INTERFACE(_slot_intf, _def_slot, false)
-
-
-
//**************************************************************************
// TYPE DEFINITIONS
//**************************************************************************
@@ -96,7 +85,17 @@ class tmc600_euro_bus_slot_t : public device_t,
{
public:
// construction/destruction
- tmc600_euro_bus_slot_t(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+ template <typename T>
+ tmc600_euro_bus_slot_t(const machine_config &mconfig, const char *tag, device_t *owner, T &&opts, const char *dflt)
+ : tmc600_euro_bus_slot_t(mconfig, tag, owner, 0)
+ {
+ option_reset();
+ opts(*this);
+ set_default_option(dflt);
+ set_fixed(false);
+ }
+
+ tmc600_euro_bus_slot_t(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock = 0);
protected:
// device-level overrides
diff --git a/src/devices/bus/tvc/tvc.h b/src/devices/bus/tvc/tvc.h
index 584e121f428..09ba7b35ffd 100644
--- a/src/devices/bus/tvc/tvc.h
+++ b/src/devices/bus/tvc/tvc.h
@@ -91,11 +91,21 @@ class tvcexp_slot_device : public device_t,
{
public:
// construction/destruction
- tvcexp_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+ template <typename T>
+ tvcexp_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, T &&opts, const char *dflt)
+ : tvcexp_slot_device(mconfig, tag, owner, 0)
+ {
+ option_reset();
+ opts(*this);
+ set_default_option(dflt);
+ set_fixed(false);
+ }
+
+ tvcexp_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock = 0);
virtual ~tvcexp_slot_device();
- template <class Object> devcb_base &set_out_irq_callback(Object &&cb) { return m_out_irq_cb.set_callback(std::forward<Object>(cb)); }
- template <class Object> devcb_base &set_out_nmi_callback(Object &&cb) { return m_out_nmi_cb.set_callback(std::forward<Object>(cb)); }
+ auto out_irq_callback() { return m_out_irq_cb.bind(); }
+ auto out_nmi_callback() { return m_out_nmi_cb.bind(); }
// reading and writing
virtual uint8_t id_r();
@@ -120,14 +130,4 @@ protected:
DECLARE_DEVICE_TYPE(TVCEXP_SLOT, tvcexp_slot_device)
-/***************************************************************************
- DEVICE CONFIGURATION MACROS
-***************************************************************************/
-
-#define MCFG_TVCEXP_SLOT_OUT_IRQ_CB(_devcb) \
- downcast<tvcexp_slot_device &>(*device).set_out_irq_callback(DEVCB_##_devcb);
-
-#define MCFG_TVCEXP_SLOT_OUT_NMI_CB(_devcb) \
- downcast<tvcexp_slot_device &>(*device).set_out_nmi_callback(DEVCB_##_devcb);
-
#endif // MAME_BUS_TVC_TVC_H
diff --git a/src/devices/bus/uts_kbd/400kbd.cpp b/src/devices/bus/uts_kbd/400kbd.cpp
new file mode 100644
index 00000000000..38d35fda607
--- /dev/null
+++ b/src/devices/bus/uts_kbd/400kbd.cpp
@@ -0,0 +1,275 @@
+// license:BSD-3-Clause
+// copyright-holders:AJR
+/***************************************************************************
+
+ Sperry Univac UTS 400-Format Keyboard
+
+ This was called the "400-Mode Keyboard" in the 1981 UTS 20 Single
+ Station Operator's Guide. The 1983 System Description also describes a
+ Katakana/English Keyboard with a similar but not identical layout.
+
+ Of this keyboard's 113 keys, several have no function on the UTS 20,
+ though all but the modifier keys produce codes. It is totally
+ incompatible with the UTS 10, which fails to properly recognize codes
+ corresponding to the top two rows of the alphanumeric layout.
+
+ The presently dumped unit, a 1984 Keytronic product, was obtained with
+ many extra functions labeled (and some incompletely erased) on the tops
+ and sides of the keys, and also identifies the punctuation keys in a
+ way that disagrees with emulated behavior of the UTS 20. The port names
+ are therefore mostly based on those described in UTS 20 manuals, except
+ for two keys which are apparently normally blank.
+
+***************************************************************************/
+
+#include "emu.h"
+#include "bus/uts_kbd/400kbd.h"
+
+#include "cpu/mcs48/mcs48.h"
+
+
+DEFINE_DEVICE_TYPE(UTS_400_KEYBOARD, uts_400_keyboard_device, "uts_400kbd", "UTS 400-Format Keyboard (F3621-04-000)")
+
+uts_400_keyboard_device::uts_400_keyboard_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
+ : device_t(mconfig, UTS_400_KEYBOARD, tag, owner, clock)
+ , device_uts_keyboard_interface(mconfig, *this)
+ , m_keys(*this, "KEY%X", 0U)
+ , m_shift_led(*this, "shift_led")
+ , m_p2_output(0xff)
+ , m_input_select(0)
+ , m_ready_line(true)
+ , m_prog_line(true)
+{
+}
+
+void uts_400_keyboard_device::device_start()
+{
+ m_shift_led.resolve();
+
+ save_item(NAME(m_p2_output));
+ save_item(NAME(m_input_select));
+ save_item(NAME(m_ready_line));
+ save_item(NAME(m_prog_line));
+}
+
+WRITE_LINE_MEMBER(uts_400_keyboard_device::ready_w)
+{
+ m_ready_line = bool(state);
+}
+
+u8 uts_400_keyboard_device::bus_r()
+{
+ return m_keys[m_input_select]->read();
+}
+
+void uts_400_keyboard_device::p1_w(u8 data)
+{
+ write_rxd(BIT(data, 1));
+ m_shift_led = BIT(data, 4);
+
+ // P10 = hysteresis control?
+ // P12 = duplicate of P11?
+}
+
+void uts_400_keyboard_device::p2_w(u8 data)
+{
+ // P22 = ? (lowered and strobed with RD after key is transmitted)
+ m_p2_output = data;
+}
+
+READ_LINE_MEMBER(uts_400_keyboard_device::t1_r)
+{
+ return m_ready_line;
+}
+
+WRITE_LINE_MEMBER(uts_400_keyboard_device::prog_w)
+{
+ if (!m_prog_line && state)
+ m_input_select = m_p2_output & 0x0f;
+
+ m_prog_line = bool(state);
+}
+
+static INPUT_PORTS_START(uts_400kbd)
+ PORT_START("KEY0")
+ PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Right Shift") PORT_CODE(KEYCODE_RSHIFT)
+ PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Left Shift") PORT_CHAR(UCHAR_SHIFT_1) PORT_CODE(KEYCODE_LSHIFT)
+ PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Shift Lock") PORT_CHAR(UCHAR_MAMEKEY(CAPSLOCK)) PORT_CODE(KEYCODE_CAPSLOCK)
+ PORT_BIT(0x78, IP_ACTIVE_LOW, IPT_UNUSED)
+ PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Upper Function") PORT_CHAR(UCHAR_SHIFT_2) PORT_CODE(KEYCODE_LCONTROL)
+
+ PORT_START("KEY1")
+ PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Space")
+ PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_UNUSED)
+ PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR(';') PORT_CHAR('+') PORT_CODE(KEYCODE_COLON)
+ PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR(':') PORT_CHAR('*') PORT_CODE(KEYCODE_QUOTE)
+ PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('o') PORT_CHAR('O') PORT_CODE(KEYCODE_O)
+ PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('p') PORT_CHAR('P') PORT_CODE(KEYCODE_P)
+ PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('9') PORT_CHAR(')') PORT_CODE(KEYCODE_9)
+ PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('0') PORT_CODE(KEYCODE_0)
+
+ PORT_START("KEY2")
+ PORT_BIT(0x03, IP_ACTIVE_LOW, IPT_UNUSED)
+ PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR(']') PORT_CHAR('}') PORT_CODE(KEYCODE_CLOSEBRACE)
+ PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Return") PORT_CHAR(0x0d) PORT_CODE(KEYCODE_ENTER)
+ PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('`') PORT_CHAR('@') PORT_CODE(KEYCODE_EQUALS)
+ PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('[') PORT_CHAR('{') PORT_CODE(KEYCODE_OPENBRACE)
+ PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('-') PORT_CHAR('=') PORT_CODE(KEYCODE_MINUS)
+ PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('^') PORT_CHAR('~') PORT_CODE(KEYCODE_TILDE)
+
+ PORT_START("KEY3")
+ PORT_BIT(0x0f, IP_ACTIVE_LOW, IPT_UNUSED)
+ PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('_') PORT_CODE(KEYCODE_RCONTROL)
+ PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR(UCHAR_MAMEKEY(7_PAD)) PORT_CODE(KEYCODE_7_PAD)
+ PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('\\') PORT_CHAR('|') PORT_CODE(KEYCODE_BACKSLASH)
+ PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Right Back Space") PORT_CHAR(0x08) PORT_CODE(KEYCODE_BACKSPACE)
+
+ PORT_START("KEY4")
+ PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR(UCHAR_MAMEKEY(1_PAD)) PORT_CODE(KEYCODE_1_PAD)
+ PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR(UCHAR_MAMEKEY(2_PAD)) PORT_CODE(KEYCODE_2_PAD)
+ PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR(UCHAR_MAMEKEY(4_PAD)) PORT_CODE(KEYCODE_4_PAD)
+ PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR(UCHAR_MAMEKEY(5_PAD)) PORT_CODE(KEYCODE_5_PAD)
+ PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR(UCHAR_MAMEKEY(8_PAD)) PORT_CODE(KEYCODE_8_PAD)
+ PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR(UCHAR_MAMEKEY(9_PAD)) PORT_CODE(KEYCODE_9_PAD)
+ PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR(UCHAR_MAMEKEY(PLUS_PAD)) PORT_CODE(KEYCODE_PLUS_PAD)
+ PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR(UCHAR_MAMEKEY(MINUS_PAD)) PORT_CODE(KEYCODE_MINUS_PAD)
+
+ PORT_START("KEY5")
+ PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR(UCHAR_MAMEKEY(3_PAD)) PORT_CODE(KEYCODE_3_PAD)
+ PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Tab Back") PORT_CODE(KEYCODE_LALT)
+ PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR(UCHAR_MAMEKEY(6_PAD)) PORT_CODE(KEYCODE_6_PAD)
+ PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Space Bar") PORT_CHAR(' ') PORT_CODE(KEYCODE_SPACE)
+ PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Tab Fwd") PORT_CHAR(0x09) PORT_CODE(KEYCODE_RALT)
+ PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR(UCHAR_MAMEKEY(0_PAD)) PORT_CODE(KEYCODE_0_PAD)
+ PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR(UCHAR_MAMEKEY(DEL_PAD)) PORT_CODE(KEYCODE_DEL_PAD)
+ PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Print")
+
+ PORT_START("KEY6")
+ PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Xmit")
+ PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Keyboard Unlock")
+ PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Control Page") PORT_CODE(KEYCODE_F10)
+ PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Xfer")
+ PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Msg Wait FCC Generate") PORT_CODE(KEYCODE_F9)
+ PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Status FCC Reenable") PORT_CODE(KEYCODE_F8)
+ PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Search FCC Clear") PORT_CODE(KEYCODE_F7)
+ PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Rep Adr FCC Locate") PORT_CODE(KEYCODE_F6)
+
+ PORT_START("KEY7")
+ PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("(Help)")
+ PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("F13 F22")
+ PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("F11 F20")
+ PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("F12 F21")
+ PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("F10 F19")
+ PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("F9 F18")
+ PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("F8 F17")
+ PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("F7 F16")
+
+ PORT_START("KEY8")
+ PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("F6 F15")
+ PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("F5 F14")
+ PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("(Xchg " UTF8_DOWN " Xchg " UTF8_UP ")")
+ PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Disp 1-2")
+ PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Hang Up")
+ PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Ws Mode Sys Mode")
+ PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Insert in Dis Line Dup")
+ PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Delete in Dis Erase Dis")
+
+ PORT_START("KEY9")
+ PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("BOB Clr Chg") PORT_CODE(KEYCODE_F5)
+ PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("FF F4") PORT_CODE(KEYCODE_F4)
+ PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("LF F3") PORT_CODE(KEYCODE_F3)
+ PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Tab Set F2") PORT_CODE(KEYCODE_F2)
+ PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Erase to EOF F1") PORT_CODE(KEYCODE_F1)
+ PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Erase to EOL Erase to EOD")
+ PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Insert in Line Insert Line") PORT_CHAR(UCHAR_MAMEKEY(INSERT))
+ PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Delete in Line Delete Line") PORT_CHAR(UCHAR_MAMEKEY(DEL))
+
+ PORT_START("KEYA")
+ PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('z') PORT_CHAR('Z') PORT_CODE(KEYCODE_Z)
+ PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('x') PORT_CHAR('X') PORT_CODE(KEYCODE_X)
+ PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Cursor to Home") PORT_CHAR(UCHAR_MAMEKEY(HOME)) PORT_CODE(KEYCODE_HOME)
+ PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('a') PORT_CHAR('A') PORT_CODE(KEYCODE_A)
+ PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("(Cursor \xe2\x86\x99)") // ↙
+ PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Left Back Space") PORT_CODE(KEYCODE_TAB)
+ PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("SOE \xe2\x96\xb6") // ▶
+ PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Erase Char") PORT_CODE(KEYCODE_ESC)
+
+ PORT_START("KEYB")
+ PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('c') PORT_CHAR('C') PORT_CODE(KEYCODE_C)
+ PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('v') PORT_CHAR('V') PORT_CODE(KEYCODE_V)
+ PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('s') PORT_CHAR('S') PORT_CODE(KEYCODE_S)
+ PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('d') PORT_CHAR('D') PORT_CODE(KEYCODE_D)
+ PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('q') PORT_CHAR('Q') PORT_CODE(KEYCODE_Q)
+ PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('w') PORT_CHAR('W') PORT_CODE(KEYCODE_W)
+ PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('1') PORT_CHAR('!') PORT_CODE(KEYCODE_1)
+ PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('2') PORT_CHAR('"') PORT_CODE(KEYCODE_2)
+
+ PORT_START("KEYC")
+ PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('b') PORT_CHAR('B') PORT_CODE(KEYCODE_B)
+ PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('n') PORT_CHAR('N') PORT_CODE(KEYCODE_N)
+ PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('f') PORT_CHAR('F') PORT_CODE(KEYCODE_F)
+ PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('g') PORT_CHAR('G') PORT_CODE(KEYCODE_G)
+ PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('e') PORT_CHAR('E') PORT_CODE(KEYCODE_E)
+ PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('r') PORT_CHAR('R') PORT_CODE(KEYCODE_R)
+ PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('3') PORT_CHAR('#') PORT_CODE(KEYCODE_3)
+ PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('4') PORT_CHAR('$') PORT_CODE(KEYCODE_4)
+
+ PORT_START("KEYD")
+ PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('m') PORT_CHAR('M') PORT_CODE(KEYCODE_M)
+ PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR(',') PORT_CHAR('<') PORT_CODE(KEYCODE_COMMA)
+ PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('h') PORT_CHAR('H') PORT_CODE(KEYCODE_H)
+ PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('j') PORT_CHAR('J') PORT_CODE(KEYCODE_J)
+ PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('t') PORT_CHAR('T') PORT_CODE(KEYCODE_T)
+ PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('y') PORT_CHAR('Y') PORT_CODE(KEYCODE_Y)
+ PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('5') PORT_CHAR('%') PORT_CODE(KEYCODE_5)
+ PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('6') PORT_CHAR('&') PORT_CODE(KEYCODE_6)
+
+ PORT_START("KEYE")
+ PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('.') PORT_CHAR('>') PORT_CODE(KEYCODE_STOP)
+ PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('/') PORT_CHAR('?') PORT_CODE(KEYCODE_SLASH)
+ PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('k') PORT_CHAR('K') PORT_CODE(KEYCODE_K)
+ PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('l') PORT_CHAR('L') PORT_CODE(KEYCODE_L)
+ PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('u') PORT_CHAR('U') PORT_CODE(KEYCODE_U)
+ PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('i') PORT_CHAR('I') PORT_CODE(KEYCODE_I)
+ PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('7') PORT_CHAR('\'') PORT_CODE(KEYCODE_7)
+ PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('8') PORT_CHAR('(') PORT_CODE(KEYCODE_8)
+
+ PORT_START("KEYF")
+ PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR(UCHAR_MAMEKEY(RIGHT)) PORT_CODE(KEYCODE_RIGHT)
+ PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR(UCHAR_MAMEKEY(LEFT)) PORT_CODE(KEYCODE_LEFT)
+ PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR(UCHAR_MAMEKEY(DOWN)) PORT_CODE(KEYCODE_DOWN)
+ PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR(UCHAR_MAMEKEY(UP)) PORT_CODE(KEYCODE_UP)
+ PORT_BIT(0xf0, IP_ACTIVE_LOW, IPT_UNUSED)
+INPUT_PORTS_END
+
+ioport_constructor uts_400_keyboard_device::device_input_ports() const
+{
+ return INPUT_PORTS_NAME(uts_400kbd);
+}
+
+void uts_400_keyboard_device::ext_map(address_map &map)
+{
+ map(0x00, 0xff).noprw(); // read as above; written only at reset time
+}
+
+void uts_400_keyboard_device::device_add_mconfig(machine_config &config)
+{
+ mcs48_cpu_device &kbdc(I8048(config, "kbdc", 4.608_MHz_XTAL)); // SCN8048A
+ // XTAL is marked "4608 / 300-007 / KSS39"
+ kbdc.set_addrmap(AS_IO, &uts_400_keyboard_device::ext_map);
+ kbdc.bus_in_cb().set(FUNC(uts_400_keyboard_device::bus_r));
+ kbdc.p1_out_cb().set(FUNC(uts_400_keyboard_device::p1_w));
+ kbdc.p2_out_cb().set(FUNC(uts_400_keyboard_device::p2_w));
+ kbdc.t1_in_cb().set(FUNC(uts_400_keyboard_device::t1_r));
+ kbdc.prog_out_cb().set(FUNC(uts_400_keyboard_device::prog_w));
+}
+
+ROM_START(uts_400kbd)
+ ROM_REGION(0x400, "kbdc", 0)
+ ROM_LOAD("sperry_20-8048-118.bin", 0x000, 0x400, CRC(ae54503e) SHA1(84081e108aa5801047851b435fd4b043922b2f6e))
+ROM_END
+
+const tiny_rom_entry *uts_400_keyboard_device::device_rom_region() const
+{
+ return ROM_NAME(uts_400kbd);
+}
diff --git a/src/devices/bus/uts_kbd/400kbd.h b/src/devices/bus/uts_kbd/400kbd.h
new file mode 100644
index 00000000000..8e73bc10dbd
--- /dev/null
+++ b/src/devices/bus/uts_kbd/400kbd.h
@@ -0,0 +1,44 @@
+// license:BSD-3-Clause
+// copyright-holders:AJR
+
+#ifndef MAME_BUS_UTS_KBD_400KBD_H
+#define MAME_BUS_UTS_KBD_400KBD_H
+
+#pragma once
+
+#include "bus/uts_kbd/uts_kbd.h"
+
+class uts_400_keyboard_device : public device_t, public device_uts_keyboard_interface
+{
+public:
+ uts_400_keyboard_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
+
+protected:
+ virtual DECLARE_WRITE_LINE_MEMBER(ready_w) override;
+
+ virtual ioport_constructor device_input_ports() const override;
+ virtual void device_start() override;
+ virtual void device_add_mconfig(machine_config &config) override;
+ virtual const tiny_rom_entry *device_rom_region() const override;
+
+private:
+ u8 bus_r();
+ void p1_w(u8 data);
+ void p2_w(u8 data);
+ DECLARE_READ_LINE_MEMBER(t1_r);
+ DECLARE_WRITE_LINE_MEMBER(prog_w);
+
+ void ext_map(address_map &map);
+
+ required_ioport_array<16> m_keys;
+ output_finder<> m_shift_led;
+
+ u8 m_p2_output;
+ u8 m_input_select;
+ bool m_ready_line;
+ bool m_prog_line;
+};
+
+DECLARE_DEVICE_TYPE(UTS_400_KEYBOARD, uts_400_keyboard_device)
+
+#endif // MAME_BUS_UTS_KBD_400KBD_H
diff --git a/src/devices/bus/uts_kbd/extw.cpp b/src/devices/bus/uts_kbd/extw.cpp
new file mode 100644
index 00000000000..950d8b244f2
--- /dev/null
+++ b/src/devices/bus/uts_kbd/extw.cpp
@@ -0,0 +1,290 @@
+// license:BSD-3-Clause
+// copyright-holders:AJR
+/***************************************************************************
+
+ Sperry Univac UTS Expanded Typewriter Keyboard
+
+ This is the default keyboard for the UTS 10 and UTS 20, though the
+ latter's manual claims that "SYS MODE" and "WS MODE" have no function.
+
+ User beware: the - and / keys are swapped from their respective
+ positions on most keyboards.
+
+ The LED is located on the LOCK key, but also responds to either shift
+ key being pressed (which also releases the shift lock).
+
+ The keyboard controller is a custom 48-pin DIP marked:
+
+ P60515
+ L7340660
+ 20-90039-000
+ © INTEL '84
+
+ This is likely a hybrid ASIC integrating a high-speed 8035-like core
+ with at least one of the custom drivers/receivers present in other
+ Keytronic keyboards.
+
+ There seems to be a slight timing error in the transmit routine which
+ causes data bits to be shifted out one 64th of a bit time too quickly.
+
+***************************************************************************/
+
+#include "emu.h"
+#include "bus/uts_kbd/extw.h"
+
+#include "cpu/mcs48/mcs48.h"
+
+
+DEFINE_DEVICE_TYPE(UTS_EXTW_KEYBOARD, uts_extw_keyboard_device, "uts_extw", "UTS Expanded Typewriter Keyboard (F4725-25)")
+
+uts_extw_keyboard_device::uts_extw_keyboard_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
+ : device_t(mconfig, UTS_EXTW_KEYBOARD, tag, owner, clock)
+ , device_uts_keyboard_interface(mconfig, *this)
+ , m_keys(*this, "KEY%X", 0U)
+ , m_shift_led(*this, "shift_led")
+ , m_p1_output(0xff)
+ , m_p2_output(0xff)
+ , m_shift_register(0xff)
+ , m_ready_line(true)
+ , m_prog_line(true)
+{
+}
+
+void uts_extw_keyboard_device::device_start()
+{
+ m_shift_led.resolve();
+
+ save_item(NAME(m_p1_output));
+ save_item(NAME(m_p2_output));
+ save_item(NAME(m_shift_register));
+ save_item(NAME(m_ready_line));
+ save_item(NAME(m_prog_line));
+}
+
+WRITE_LINE_MEMBER(uts_extw_keyboard_device::ready_w)
+{
+ m_ready_line = bool(state);
+}
+
+u8 uts_extw_keyboard_device::p1_r()
+{
+ return m_ready_line ? 0xf7 : 0xff;
+}
+
+void uts_extw_keyboard_device::p1_w(u8 data)
+{
+ write_rxd(!BIT(data, 2));
+
+ if (!BIT(m_p1_output, 0) && BIT(data, 0))
+ m_shift_register = (m_shift_register >> 1) | (m_shift_register & 0x01) << 7;
+
+ // P11 = hysteresis control?
+
+ m_p1_output = data;
+}
+
+void uts_extw_keyboard_device::p2_w(u8 data)
+{
+ m_shift_led = !BIT(data, 4);
+ m_p2_output = data;
+}
+
+void uts_extw_keyboard_device::t0_clock(u32 clk)
+{
+}
+
+READ_LINE_MEMBER(uts_extw_keyboard_device::t1_r)
+{
+ return BIT(m_shift_register, 7);
+}
+
+WRITE_LINE_MEMBER(uts_extw_keyboard_device::prog_w)
+{
+ if (!m_prog_line && state)
+ {
+ u8 n = m_p2_output & 0x0f;
+ m_shift_register = m_keys[n]->read();
+ }
+
+ m_prog_line = bool(state);
+}
+
+static INPUT_PORTS_START(uts_extw)
+ PORT_START("KEY0")
+ PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("E F15") PORT_CHAR('e') PORT_CHAR('E') PORT_CHAR(UCHAR_MAMEKEY(F15)) PORT_CODE(KEYCODE_E)
+ PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('3') PORT_CHAR('#') PORT_CHAR(UCHAR_MAMEKEY(F3)) PORT_CODE(KEYCODE_3)
+ PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('2') PORT_CHAR('"') PORT_CHAR(UCHAR_MAMEKEY(F2)) PORT_CODE(KEYCODE_2)
+ PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("W F14") PORT_CHAR('w') PORT_CHAR('W') PORT_CHAR(UCHAR_MAMEKEY(F14)) PORT_CODE(KEYCODE_W)
+ PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("S") PORT_CHAR('s') PORT_CHAR('S') PORT_CODE(KEYCODE_S)
+ PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("A") PORT_CHAR('a') PORT_CHAR('A') PORT_CODE(KEYCODE_A)
+ PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("X") PORT_CHAR('x') PORT_CHAR('X') PORT_CODE(KEYCODE_X)
+ PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Z") PORT_CHAR('z') PORT_CHAR('Z') PORT_CODE(KEYCODE_Z)
+
+ PORT_START("KEY1")
+ PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Tab Back") PORT_CODE(KEYCODE_RCONTROL) // ⇤
+ PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR(0x08) PORT_CODE(KEYCODE_BACKSPACE) // doesn't work on uts10?
+ PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('^') PORT_CHAR('~') PORT_CHAR(UCHAR_MAMEKEY(F12)) PORT_CODE(KEYCODE_EQUALS)
+ PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("[ { Ws Mode") PORT_CHAR('[') PORT_CHAR('{') PORT_CODE(KEYCODE_CLOSEBRACE)
+ PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR(']') PORT_CHAR('}') PORT_CODE(KEYCODE_BACKSLASH) // between : and return key
+ PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR(':') PORT_CHAR('*') PORT_CODE(KEYCODE_QUOTE)
+ PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR(0x0d) PORT_CODE(KEYCODE_ENTER) // ↵
+ PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Right Shift") PORT_CODE(KEYCODE_RSHIFT)
+
+ PORT_START("KEY2")
+ PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("@ \\ Sys Mode") PORT_CHAR('@') PORT_CHAR('\\') PORT_CODE(KEYCODE_OPENBRACE)
+ PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('/') PORT_CHAR('?') PORT_CHAR(UCHAR_MAMEKEY(F11)) PORT_CODE(KEYCODE_MINUS)
+ PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('0') PORT_CHAR('=') PORT_CHAR(UCHAR_MAMEKEY(F10)) PORT_CODE(KEYCODE_0)
+ PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("P F22") PORT_CHAR('p') PORT_CHAR('P') PORT_CODE(KEYCODE_P)
+ PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR(';') PORT_CHAR('+') PORT_CODE(KEYCODE_COLON)
+ PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME(", ,") PORT_CHAR(',') PORT_CODE(KEYCODE_COMMA)
+ PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('-') PORT_CHAR('_') PORT_CODE(KEYCODE_SLASH)
+ PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME(". .") PORT_CHAR('.') PORT_CODE(KEYCODE_STOP)
+
+ PORT_START("KEY3")
+ PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("U F19") PORT_CHAR('u') PORT_CHAR('U') PORT_CHAR(UCHAR_MAMEKEY(F19)) PORT_CODE(KEYCODE_U)
+ PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('7') PORT_CHAR('\'') PORT_CHAR(UCHAR_MAMEKEY(F7)) PORT_CODE(KEYCODE_7)
+ PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('6') PORT_CHAR('&') PORT_CHAR(UCHAR_MAMEKEY(F6)) PORT_CODE(KEYCODE_6)
+ PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Y F18") PORT_CHAR('y') PORT_CHAR('Y') PORT_CHAR(UCHAR_MAMEKEY(F18)) PORT_CODE(KEYCODE_Y)
+ PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("H") PORT_CHAR('h') PORT_CHAR('H') PORT_CODE(KEYCODE_H)
+ PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("G") PORT_CHAR('g') PORT_CHAR('G') PORT_CODE(KEYCODE_G)
+ PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("N") PORT_CHAR('n') PORT_CHAR('N') PORT_CODE(KEYCODE_N)
+ PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("B") PORT_CHAR('b') PORT_CHAR('B') PORT_CODE(KEYCODE_B)
+
+ PORT_START("KEY4")
+ PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("SOE \xe2\x96\xb6 Tab Set") PORT_CODE(KEYCODE_LALT) // ▶
+ PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Insert in Line Insert in Disp") PORT_CHAR(UCHAR_MAMEKEY(INSERT)) PORT_CODE(KEYCODE_INSERT)
+ PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Delete in Line Delete in Disp") PORT_CHAR(UCHAR_MAMEKEY(DEL)) PORT_CODE(KEYCODE_DEL)
+ PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Cursor to Home") PORT_CHAR(UCHAR_MAMEKEY(HOME)) PORT_CODE(KEYCODE_HOME) // ↖
+ PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR(UCHAR_MAMEKEY(UP)) PORT_CODE(KEYCODE_UP)
+ PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR(UCHAR_MAMEKEY(LEFT)) PORT_CODE(KEYCODE_LEFT)
+ PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR(UCHAR_MAMEKEY(RIGHT)) PORT_CODE(KEYCODE_RIGHT)
+ PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR(UCHAR_MAMEKEY(DOWN)) PORT_CODE(KEYCODE_DOWN)
+
+ PORT_START("KEY5")
+ PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR(UCHAR_MAMEKEY(5_PAD)) PORT_CODE(KEYCODE_5_PAD)
+ PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR(UCHAR_MAMEKEY(4_PAD)) PORT_CODE(KEYCODE_4_PAD)
+ PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR(UCHAR_MAMEKEY(7_PAD)) PORT_CODE(KEYCODE_7_PAD)
+ PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR(UCHAR_MAMEKEY(1_PAD)) PORT_CODE(KEYCODE_1_PAD)
+ PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR(UCHAR_MAMEKEY(2_PAD)) PORT_CODE(KEYCODE_2_PAD)
+ PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR(UCHAR_MAMEKEY(8_PAD)) PORT_CODE(KEYCODE_8_PAD)
+ PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_UNUSED)
+ PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR(UCHAR_MAMEKEY(0_PAD)) PORT_CODE(KEYCODE_0_PAD)
+
+ PORT_START("KEY6")
+ PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR(UCHAR_MAMEKEY(PLUS_PAD)) PORT_CODE(KEYCODE_PLUS_PAD)
+ PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR(UCHAR_MAMEKEY(6_PAD)) PORT_CODE(KEYCODE_6_PAD)
+ PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR(UCHAR_MAMEKEY(9_PAD)) PORT_CODE(KEYCODE_9_PAD)
+ PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR(UCHAR_MAMEKEY(3_PAD)) PORT_CODE(KEYCODE_3_PAD)
+ PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_UNUSED)
+ PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR(UCHAR_MAMEKEY(MINUS_PAD)) PORT_CODE(KEYCODE_MINUS_PAD)
+ PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR(UCHAR_MAMEKEY(DEL_PAD)) PORT_CODE(KEYCODE_DEL_PAD)
+ PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR(UCHAR_MAMEKEY(TAB_PAD)) PORT_CODE(KEYCODE_ENTER_PAD) // ⇥
+
+ PORT_START("KEY7")
+ PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Q F13") PORT_CHAR('q') PORT_CHAR('Q') PORT_CHAR(UCHAR_MAMEKEY(F13)) PORT_CODE(KEYCODE_Q)
+ PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('1') PORT_CHAR('!') PORT_CHAR(UCHAR_MAMEKEY(F1)) PORT_CODE(KEYCODE_1)
+ PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('|') PORT_CHAR('`') PORT_CODE(KEYCODE_TILDE)
+ PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Tab Forward") PORT_CHAR(0x09) PORT_CODE(KEYCODE_TAB) // ⇥
+ PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Fctn") PORT_CHAR(UCHAR_SHIFT_2) PORT_CODE(KEYCODE_LCONTROL)
+ PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Lock") PORT_CHAR(UCHAR_MAMEKEY(CAPSLOCK)) PORT_CODE(KEYCODE_CAPSLOCK)
+ PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('<') PORT_CHAR('>') PORT_CODE(KEYCODE_BACKSLASH2)
+ PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Left Shift") PORT_CHAR(UCHAR_SHIFT_1) PORT_CODE(KEYCODE_LSHIFT)
+
+ PORT_START("KEY8")
+ PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("FF Disp 1-2") PORT_CODE(KEYCODE_F3)
+ PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Clr Chg") PORT_CODE(KEYCODE_F4)
+ PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("FCC Locate") PORT_CODE(KEYCODE_F5)
+ PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("LF Hang Up") PORT_CODE(KEYCODE_F2)
+ PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Line Dup") PORT_CODE(KEYCODE_F1)
+ PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Delete Line Insert Line") PORT_CODE(KEYCODE_ESC)
+ PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Erase EOL Erase EOD") PORT_CODE(KEYCODE_END)
+ PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Erase to EOF Erase Display") PORT_CODE(KEYCODE_PGDN)
+
+ PORT_START("KEY9")
+ PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("T F17") PORT_CHAR('t') PORT_CHAR('T') PORT_CHAR(UCHAR_MAMEKEY(F17)) PORT_CODE(KEYCODE_T)
+ PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('5') PORT_CHAR('%') PORT_CHAR(UCHAR_MAMEKEY(F5)) PORT_CODE(KEYCODE_5)
+ PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('4') PORT_CHAR('$') PORT_CHAR(UCHAR_MAMEKEY(F4)) PORT_CODE(KEYCODE_4)
+ PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("R F16") PORT_CHAR('r') PORT_CHAR('R') PORT_CHAR(UCHAR_MAMEKEY(F16)) PORT_CODE(KEYCODE_R)
+ PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("F") PORT_CHAR('f') PORT_CHAR('F') PORT_CODE(KEYCODE_F)
+ PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("D") PORT_CHAR('d') PORT_CHAR('D') PORT_CODE(KEYCODE_D)
+ PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("V") PORT_CHAR('v') PORT_CHAR('V') PORT_CODE(KEYCODE_V)
+ PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("C") PORT_CHAR('c') PORT_CHAR('C') PORT_CODE(KEYCODE_C)
+
+ PORT_START("KEYA")
+ PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Msg Wait Unlock") PORT_CODE(KEYCODE_F11)
+ PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("FCC Clear") PORT_CODE(KEYCODE_F6)
+ PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Xmit") PORT_CODE(KEYCODE_F12)
+ PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Print Ctl Page") PORT_CODE(KEYCODE_F10)
+ PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("FCC Gen") PORT_CODE(KEYCODE_F8)
+ PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("FCC Enable") PORT_CODE(KEYCODE_F7)
+ PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Xfer Char Erase") PORT_CODE(KEYCODE_F9)
+ PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR(' ') PORT_CODE(KEYCODE_SPACE)
+
+ PORT_START("KEYB")
+ PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("O F21") PORT_CHAR('o') PORT_CHAR('O') PORT_CODE(KEYCODE_O)
+ PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('9') PORT_CHAR(')') PORT_CHAR(UCHAR_MAMEKEY(F9)) PORT_CODE(KEYCODE_9)
+ PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('8') PORT_CHAR('(') PORT_CHAR(UCHAR_MAMEKEY(F8)) PORT_CODE(KEYCODE_8)
+ PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("I F20") PORT_CHAR('i') PORT_CHAR('I') PORT_CHAR(UCHAR_MAMEKEY(F20)) PORT_CODE(KEYCODE_I)
+ PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("K") PORT_CHAR('k') PORT_CHAR('K') PORT_CODE(KEYCODE_K)
+ PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("L") PORT_CHAR('l') PORT_CHAR('L') PORT_CODE(KEYCODE_L)
+ PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("J") PORT_CHAR('j') PORT_CHAR('J') PORT_CODE(KEYCODE_J)
+ PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("M") PORT_CHAR('m') PORT_CHAR('M') PORT_CODE(KEYCODE_M)
+
+ PORT_START("KEYC")
+ PORT_BIT(0xff, IP_ACTIVE_LOW, IPT_UNUSED)
+
+ PORT_START("KEYD")
+ PORT_BIT(0xff, IP_ACTIVE_LOW, IPT_UNUSED)
+
+ PORT_START("KEYE")
+ PORT_BIT(0xff, IP_ACTIVE_LOW, IPT_UNUSED)
+
+ PORT_START("KEYF")
+ PORT_DIPNAME(0x0f, 0x0f, "National Layout") // stored as a 4-bit value even though only 7 of the first 8 are valid
+ PORT_DIPSETTING(0x0f, "USA/UK English")
+ PORT_DIPSETTING(0x0d, "German (QWERTZ)")
+ PORT_DIPSETTING(0x0c, "European A")
+ PORT_DIPSETTING(0x0b, "European B") // Swedish/Finnish?
+ PORT_DIPSETTING(0x0a, "European C")
+ PORT_DIPSETTING(0x09, "European D") // Spanish?
+ PORT_DIPSETTING(0x08, "European E")
+ PORT_BIT(0xf0, IP_ACTIVE_LOW, IPT_UNUSED)
+INPUT_PORTS_END
+
+ioport_constructor uts_extw_keyboard_device::device_input_ports() const
+{
+ return INPUT_PORTS_NAME(uts_extw);
+}
+
+void uts_extw_keyboard_device::prog_map(address_map &map)
+{
+ map(0x000, 0x7ff).rom().region("kbdc", 0);
+}
+
+void uts_extw_keyboard_device::ext_map(address_map &map)
+{
+ map(0x00, 0xff).nopr(); // read only once, at reset time
+}
+
+void uts_extw_keyboard_device::device_add_mconfig(machine_config &config)
+{
+ mcs48_cpu_device &kbdc(I8035(config, "kbdc", 9.216_MHz_XTAL)); // not a standard 8035; see notes
+ kbdc.set_addrmap(AS_PROGRAM, &uts_extw_keyboard_device::prog_map);
+ kbdc.set_addrmap(AS_IO, &uts_extw_keyboard_device::ext_map);
+ kbdc.p1_in_cb().set(FUNC(uts_extw_keyboard_device::p1_r));
+ kbdc.p1_out_cb().set(FUNC(uts_extw_keyboard_device::p1_w));
+ kbdc.p2_out_cb().set(FUNC(uts_extw_keyboard_device::p2_w));
+ kbdc.set_t0_clk_cb(FUNC(uts_extw_keyboard_device::t0_clock));
+ kbdc.t1_in_cb().set(FUNC(uts_extw_keyboard_device::t1_r));
+ kbdc.prog_out_cb().set(FUNC(uts_extw_keyboard_device::prog_w));
+}
+
+ROM_START(uts_extw)
+ ROM_REGION(0x800, "kbdc", 0)
+ ROM_LOAD("2716264.bin", 0x000, 0x800, CRC(75e188aa) SHA1(a6486576525f7eec617fd7f9db469063f8c357fc)) // "© 1985 Keytronic"
+ROM_END
+
+const tiny_rom_entry *uts_extw_keyboard_device::device_rom_region() const
+{
+ return ROM_NAME(uts_extw);
+}
diff --git a/src/devices/bus/uts_kbd/extw.h b/src/devices/bus/uts_kbd/extw.h
new file mode 100644
index 00000000000..21599139ec1
--- /dev/null
+++ b/src/devices/bus/uts_kbd/extw.h
@@ -0,0 +1,47 @@
+// license:BSD-3-Clause
+// copyright-holders:AJR
+
+#ifndef MAME_BUS_UTS_KBD_EXTW_H
+#define MAME_BUS_UTS_KBD_EXTW_H
+
+#pragma once
+
+#include "bus/uts_kbd/uts_kbd.h"
+
+class uts_extw_keyboard_device : public device_t, public device_uts_keyboard_interface
+{
+public:
+ uts_extw_keyboard_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
+
+protected:
+ virtual DECLARE_WRITE_LINE_MEMBER(ready_w) override;
+
+ virtual ioport_constructor device_input_ports() const override;
+ virtual void device_start() override;
+ virtual void device_add_mconfig(machine_config &config) override;
+ virtual const tiny_rom_entry *device_rom_region() const override;
+
+private:
+ u8 p1_r();
+ void p1_w(u8 data);
+ void p2_w(u8 data);
+ void t0_clock(u32 clk);
+ DECLARE_READ_LINE_MEMBER(t1_r);
+ DECLARE_WRITE_LINE_MEMBER(prog_w);
+
+ void prog_map(address_map &map);
+ void ext_map(address_map &map);
+
+ required_ioport_array<16> m_keys;
+ output_finder<> m_shift_led;
+
+ u8 m_p1_output;
+ u8 m_p2_output;
+ u8 m_shift_register;
+ bool m_ready_line;
+ bool m_prog_line;
+};
+
+DECLARE_DEVICE_TYPE(UTS_EXTW_KEYBOARD, uts_extw_keyboard_device)
+
+#endif // MAME_BUS_UTS_KBD_EXTW_H
diff --git a/src/devices/bus/uts_kbd/uts_kbd.cpp b/src/devices/bus/uts_kbd/uts_kbd.cpp
new file mode 100644
index 00000000000..d652dbfca80
--- /dev/null
+++ b/src/devices/bus/uts_kbd/uts_kbd.cpp
@@ -0,0 +1,89 @@
+// license:BSD-3-Clause
+// copyright-holders:AJR
+/***************************************************************************
+
+ Sperry Univac UTS series keyboard port
+
+ The UTS 20 System Description presents four types of keyboards that
+ may be connected to the terminal as auxiliary input devices:
+ - Typewriter Keyboard
+ - Expanded Typewriter Keyboard
+ - Katakana/English Keyboard
+ - UTS 400-Format Keyboard
+
+ A Magnetic Stripe Reader which can read ABA or IATA data is another
+ device which can be connected to the keyboard input. This apparently
+ includes a pass-through keyboard connector.
+
+ Keyboard input is transmitted serially at 9600 baud, using 8 data bits,
+ 1 stop bit and odd parity. A two-byte sequence is sent for each key,
+ with the (non-ASCII) keycode being contained in the second byte. The
+ only other active line appears to be a ready signal (assumed to be
+ active high), which the terminal drives to synchronize transmissions.
+ This might even be a single line driven bidirectionally. There appear
+ to be at most four wires attached to the DE-9 connector.
+
+***************************************************************************/
+
+#include "emu.h"
+#include "bus/uts_kbd/uts_kbd.h"
+
+#include "bus/uts_kbd/extw.h"
+#include "bus/uts_kbd/400kbd.h"
+
+//**************************************************************************
+// UTS KEYBOARD PORT DEVICE
+//**************************************************************************
+
+DEFINE_DEVICE_TYPE(UTS_KEYBOARD, uts_keyboard_port_device, "uts_kbd", "UTS Keyboard Port")
+
+uts_keyboard_port_device::uts_keyboard_port_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
+ : device_t(mconfig, UTS_KEYBOARD, tag, owner, clock)
+ , device_slot_interface(mconfig, *this)
+ , m_rxd_callback(*this)
+ , m_kbd(nullptr)
+{
+}
+
+void uts_keyboard_port_device::device_config_complete()
+{
+ m_kbd = dynamic_cast<device_uts_keyboard_interface *>(get_card_device());
+}
+
+void uts_keyboard_port_device::device_resolve_objects()
+{
+ m_rxd_callback.resolve_safe();
+}
+
+void uts_keyboard_port_device::device_start()
+{
+}
+
+//**************************************************************************
+// UTS KEYBOARD INTERFACE
+//**************************************************************************
+
+device_uts_keyboard_interface::device_uts_keyboard_interface(const machine_config &mconfig, device_t &device)
+ : device_slot_card_interface(mconfig, device)
+ , m_port(device, DEVICE_SELF_OWNER)
+{
+}
+
+device_uts_keyboard_interface::~device_uts_keyboard_interface()
+{
+}
+
+//**************************************************************************
+// KEYBOARD OPTIONS
+//**************************************************************************
+
+void uts10_keyboards(device_slot_interface &slot)
+{
+ slot.option_add("extw", UTS_EXTW_KEYBOARD);
+}
+
+void uts20_keyboards(device_slot_interface &slot)
+{
+ uts10_keyboards(slot);
+ slot.option_add("uts400", UTS_400_KEYBOARD);
+}
diff --git a/src/devices/bus/uts_kbd/uts_kbd.h b/src/devices/bus/uts_kbd/uts_kbd.h
new file mode 100644
index 00000000000..7cfff95c0fe
--- /dev/null
+++ b/src/devices/bus/uts_kbd/uts_kbd.h
@@ -0,0 +1,101 @@
+// license:BSD-3-Clause
+// copyright-holders:AJR
+/***************************************************************************
+
+ Sperry Univac UTS series keyboard port
+
+***************************************************************************/
+
+#ifndef MAME_BUS_UTS_KBD_UTS_KBD_H
+#define MAME_BUS_UTS_KBD_UTS_KBD_H
+
+#pragma once
+
+
+//**************************************************************************
+// TYPE DEFINITIONS
+//**************************************************************************
+
+// forward declaration
+class device_uts_keyboard_interface;
+
+// ======================> uts_keyboard_port_device
+
+class uts_keyboard_port_device : public device_t, public device_slot_interface
+{
+ friend class device_uts_keyboard_interface;
+
+public:
+ // construction/destruction
+ uts_keyboard_port_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
+ template <typename T>
+ uts_keyboard_port_device(const machine_config &mconfig, const char *tag, device_t *owner, T &&opts, const char *dflt)
+ : uts_keyboard_port_device(mconfig, tag, owner, 0U)
+ {
+ option_reset();
+ opts(*this);
+ set_default_option(dflt);
+ set_fixed(false);
+ }
+
+ // configuration
+ auto rxd_callback() { return m_rxd_callback.bind(); }
+
+ // line handler
+ inline DECLARE_WRITE_LINE_MEMBER(ready_w);
+
+protected:
+ // device-level overrides
+ virtual void device_config_complete() override;
+ virtual void device_resolve_objects() override;
+ virtual void device_start() override;
+
+ // called from keyboard
+ DECLARE_WRITE_LINE_MEMBER(write_rxd) { m_rxd_callback(state); }
+
+private:
+ // user callback
+ devcb_write_line m_rxd_callback;
+
+ // selected keyboard
+ device_uts_keyboard_interface *m_kbd;
+};
+
+// ======================> device_uts_keyboard_interface
+
+class device_uts_keyboard_interface : public device_slot_card_interface
+{
+ friend class uts_keyboard_port_device;
+
+protected:
+ // construction/destruction
+ device_uts_keyboard_interface(const machine_config &mconfig, device_t &device);
+ virtual ~device_uts_keyboard_interface();
+
+ DECLARE_WRITE_LINE_MEMBER(write_rxd) { m_port->write_rxd(state); }
+
+ virtual DECLARE_WRITE_LINE_MEMBER(ready_w) = 0;
+
+private:
+ // parent port
+ required_device<uts_keyboard_port_device> m_port;
+};
+
+// type definition
+DECLARE_DEVICE_TYPE(UTS_KEYBOARD, uts_keyboard_port_device)
+
+// standard options
+extern void uts20_keyboards(device_slot_interface &slot);
+extern void uts10_keyboards(device_slot_interface &slot);
+
+//**************************************************************************
+// INLINE FUNCTIONS
+//**************************************************************************
+
+WRITE_LINE_MEMBER(uts_keyboard_port_device::ready_w)
+{
+ if (m_kbd != nullptr)
+ m_kbd->ready_w(state);
+}
+
+#endif // MAME_BUS_UTS_KBD_UTS_KBD_H
diff --git a/src/devices/bus/vboy/slot.h b/src/devices/bus/vboy/slot.h
index a81efa07519..547f09b8523 100644
--- a/src/devices/bus/vboy/slot.h
+++ b/src/devices/bus/vboy/slot.h
@@ -62,7 +62,16 @@ class vboy_cart_slot_device : public device_t,
{
public:
// construction/destruction
- vboy_cart_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+ template <typename T>
+ vboy_cart_slot_device(machine_config const &mconfig, char const *tag, device_t *owner, T &&opts, char const *dflt)
+ : vboy_cart_slot_device(mconfig, tag, owner, 0)
+ {
+ option_reset();
+ opts(*this);
+ set_default_option(dflt);
+ set_fixed(false);
+ }
+ vboy_cart_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock = 0);
virtual ~vboy_cart_slot_device();
// image-level overrides
@@ -110,8 +119,4 @@ DECLARE_DEVICE_TYPE(VBOY_CART_SLOT, vboy_cart_slot_device)
#define VBOYSLOT_ROM_REGION_TAG ":cart:rom"
-#define MCFG_VBOY_CARTRIDGE_ADD(_tag,_slot_intf,_def_slot) \
- MCFG_DEVICE_ADD(_tag, VBOY_CART_SLOT, 0) \
- MCFG_DEVICE_SLOT_INTERFACE(_slot_intf, _def_slot, false)
-
#endif // MAME_BUS_VBOY_SLOT_H
diff --git a/src/devices/bus/vc4000/rom.cpp b/src/devices/bus/vc4000/rom.cpp
index 0e41b2638ed..ffd9a21ffb5 100644
--- a/src/devices/bus/vc4000/rom.cpp
+++ b/src/devices/bus/vc4000/rom.cpp
@@ -228,7 +228,7 @@ vc4000_chess2_device::vc4000_chess2_device(const machine_config &mconfig, const
mapper specific handlers
-------------------------------------------------*/
-READ8_MEMBER(vc4000_rom_device::read_rom)
+uint8_t vc4000_rom_device::read_rom(offs_t offset)
{
if (offset < m_rom_size)
return m_rom[offset];
@@ -237,18 +237,18 @@ READ8_MEMBER(vc4000_rom_device::read_rom)
}
-READ8_MEMBER(vc4000_ram1k_device::read_ram)
+uint8_t vc4000_ram1k_device::read_ram(offs_t offset)
{
return m_ram[offset & (m_ram.size() - 1)];
}
-WRITE8_MEMBER(vc4000_ram1k_device::write_ram)
+void vc4000_ram1k_device::write_ram(offs_t offset, uint8_t data)
{
m_ram[offset & (m_ram.size() - 1)] = data;
}
-READ8_MEMBER(vc4000_chess2_device::extra_rom)
+uint8_t vc4000_chess2_device::extra_rom(offs_t offset)
{
if (offset < (m_rom_size - 0x2000))
return m_rom[offset + 0x2000];
@@ -256,12 +256,12 @@ READ8_MEMBER(vc4000_chess2_device::extra_rom)
return 0xff;
}
-READ8_MEMBER(vc4000_chess2_device::read_ram)
+uint8_t vc4000_chess2_device::read_ram(offs_t offset)
{
return m_ram[offset & (m_ram.size() - 1)];
}
-WRITE8_MEMBER(vc4000_chess2_device::write_ram)
+void vc4000_chess2_device::write_ram(offs_t offset, uint8_t data)
{
m_ram[offset & (m_ram.size() - 1)] = data;
}
diff --git a/src/devices/bus/vc4000/rom.h b/src/devices/bus/vc4000/rom.h
index a8d524f2989..623e4c248c9 100644
--- a/src/devices/bus/vc4000/rom.h
+++ b/src/devices/bus/vc4000/rom.h
@@ -16,7 +16,7 @@ public:
vc4000_rom_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
// reading and writing
- virtual DECLARE_READ8_MEMBER(read_rom) override;
+ virtual uint8_t read_rom(offs_t offset) override;
protected:
vc4000_rom_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock);
@@ -44,8 +44,8 @@ public:
vc4000_ram1k_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
// reading and writing
- virtual DECLARE_READ8_MEMBER(read_ram) override;
- virtual DECLARE_WRITE8_MEMBER(write_ram) override;
+ virtual uint8_t read_ram(offs_t offset) override;
+ virtual void write_ram(offs_t offset, uint8_t data) override;
};
// ======================> vc4000_chess2_device
@@ -57,9 +57,9 @@ public:
vc4000_chess2_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
// reading and writing
- virtual DECLARE_READ8_MEMBER(extra_rom) override;
- virtual DECLARE_READ8_MEMBER(read_ram) override;
- virtual DECLARE_WRITE8_MEMBER(write_ram) override;
+ virtual uint8_t extra_rom(offs_t offset) override;
+ virtual uint8_t read_ram(offs_t offset) override;
+ virtual void write_ram(offs_t offset, uint8_t data) override;
};
diff --git a/src/devices/bus/vc4000/slot.cpp b/src/devices/bus/vc4000/slot.cpp
index 68c7ca15f4b..892213c5aef 100644
--- a/src/devices/bus/vc4000/slot.cpp
+++ b/src/devices/bus/vc4000/slot.cpp
@@ -251,10 +251,10 @@ std::string vc4000_cart_slot_device::get_default_card_software(get_default_card_
read
-------------------------------------------------*/
-READ8_MEMBER(vc4000_cart_slot_device::read_rom)
+uint8_t vc4000_cart_slot_device::read_rom(offs_t offset)
{
if (m_cart)
- return m_cart->read_rom(space, offset);
+ return m_cart->read_rom(offset);
else
return 0xff;
}
@@ -263,10 +263,10 @@ READ8_MEMBER(vc4000_cart_slot_device::read_rom)
read
-------------------------------------------------*/
-READ8_MEMBER(vc4000_cart_slot_device::extra_rom)
+uint8_t vc4000_cart_slot_device::extra_rom(offs_t offset)
{
if (m_cart)
- return m_cart->extra_rom(space, offset);
+ return m_cart->extra_rom(offset);
else
return 0xff;
}
@@ -275,10 +275,10 @@ READ8_MEMBER(vc4000_cart_slot_device::extra_rom)
read
-------------------------------------------------*/
-READ8_MEMBER(vc4000_cart_slot_device::read_ram)
+uint8_t vc4000_cart_slot_device::read_ram(offs_t offset)
{
if (m_cart)
- return m_cart->read_ram(space, offset);
+ return m_cart->read_ram(offset);
else
return 0xff;
}
@@ -287,8 +287,8 @@ READ8_MEMBER(vc4000_cart_slot_device::read_ram)
write
-------------------------------------------------*/
-WRITE8_MEMBER(vc4000_cart_slot_device::write_ram)
+void vc4000_cart_slot_device::write_ram(offs_t offset, uint8_t data)
{
if (m_cart)
- m_cart->write_ram(space, offset, data);
+ m_cart->write_ram(offset, data);
}
diff --git a/src/devices/bus/vc4000/slot.h b/src/devices/bus/vc4000/slot.h
index a5015766545..2ad52b2c7e0 100644
--- a/src/devices/bus/vc4000/slot.h
+++ b/src/devices/bus/vc4000/slot.h
@@ -27,10 +27,10 @@ public:
virtual ~device_vc4000_cart_interface();
// reading and writing
- virtual DECLARE_READ8_MEMBER(read_rom) { return 0xff; }
- virtual DECLARE_READ8_MEMBER(extra_rom) { return 0xff; }
- virtual DECLARE_READ8_MEMBER(read_ram) { return 0xff; }
- virtual DECLARE_WRITE8_MEMBER(write_ram) {}
+ virtual uint8_t read_rom(offs_t offset) { return 0xff; }
+ virtual uint8_t extra_rom(offs_t offset) { return 0xff; }
+ virtual uint8_t read_ram(offs_t offset) { return 0xff; }
+ virtual void write_ram(offs_t offset, uint8_t data) {}
void rom_alloc(uint32_t size, const char *tag);
void ram_alloc(uint32_t size);
@@ -93,10 +93,10 @@ public:
virtual std::string get_default_card_software(get_default_card_software_hook &hook) const override;
// reading and writing
- virtual DECLARE_READ8_MEMBER(read_rom);
- virtual DECLARE_READ8_MEMBER(extra_rom);
- virtual DECLARE_READ8_MEMBER(read_ram);
- virtual DECLARE_WRITE8_MEMBER(write_ram);
+ virtual uint8_t read_rom(offs_t offset);
+ virtual uint8_t extra_rom(offs_t offset);
+ virtual uint8_t read_ram(offs_t offset);
+ virtual void write_ram(offs_t offset, uint8_t data);
protected:
// device-level overrides
diff --git a/src/devices/bus/vcs/dpc.cpp b/src/devices/bus/vcs/dpc.cpp
index aa452ba2957..525f9e77085 100644
--- a/src/devices/bus/vcs/dpc.cpp
+++ b/src/devices/bus/vcs/dpc.cpp
@@ -266,9 +266,10 @@ void a26_rom_dpc_device::setup_addon_ptr(uint8_t *ptr)
}
-MACHINE_CONFIG_START(a26_rom_dpc_device::device_add_mconfig)
- MCFG_DEVICE_ADD("dpc", ATARI_DPC, 0)
-MACHINE_CONFIG_END
+void a26_rom_dpc_device::device_add_mconfig(machine_config &config)
+{
+ ATARI_DPC(config, m_dpc, 0);
+}
READ8_MEMBER(a26_rom_dpc_device::read_rom)
{
diff --git a/src/devices/bus/vcs/harmony_melody.cpp b/src/devices/bus/vcs/harmony_melody.cpp
index 38f2b92dd94..a38d0c74fdc 100644
--- a/src/devices/bus/vcs/harmony_melody.cpp
+++ b/src/devices/bus/vcs/harmony_melody.cpp
@@ -82,10 +82,11 @@ void a26_rom_harmony_device::harmony_arm7_map(address_map &map)
{
}
-MACHINE_CONFIG_START(a26_rom_harmony_device::device_add_mconfig)
- MCFG_DEVICE_ADD("arm", LPC2103, 70000000)
- MCFG_DEVICE_PROGRAM_MAP(harmony_arm7_map)
-MACHINE_CONFIG_END
+void a26_rom_harmony_device::device_add_mconfig(machine_config &config)
+{
+ LPC2103(config, m_cpu, 70000000);
+ m_cpu->set_addrmap(AS_PROGRAM, &a26_rom_harmony_device::harmony_arm7_map);
+}
// actually if the ARM code is doing this and providing every opcode to the main CPU based
// on bus activity then we shouldn't be doing and of this here (if the ROM is actually
diff --git a/src/devices/bus/vcs/scharger.cpp b/src/devices/bus/vcs/scharger.cpp
index 36a9ee65acc..7c42fc9003c 100644
--- a/src/devices/bus/vcs/scharger.cpp
+++ b/src/devices/bus/vcs/scharger.cpp
@@ -87,15 +87,15 @@ void a26_rom_ss_device::device_reset()
}
-MACHINE_CONFIG_START(a26_rom_ss_device::device_add_mconfig)
- MCFG_CASSETTE_ADD("cassette")
- MCFG_CASSETTE_FORMATS(a26_cassette_formats)
- MCFG_CASSETTE_DEFAULT_STATE(CASSETTE_STOPPED | CASSETTE_MOTOR_ENABLED | CASSETTE_SPEAKER_ENABLED)
- MCFG_CASSETTE_INTERFACE("a2600_cass")
-
-// MCFG_SOUND_WAVE_ADD("wave", "cassette")
-// MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25)
-MACHINE_CONFIG_END
+void a26_rom_ss_device::device_add_mconfig(machine_config &config)
+{
+ CASSETTE(config, m_cassette);
+ m_cassette->set_formats(a26_cassette_formats);
+ m_cassette->set_default_state(CASSETTE_STOPPED | CASSETTE_MOTOR_ENABLED | CASSETTE_SPEAKER_ENABLED);
+ m_cassette->set_interface("a2600_cass");
+
+// WAVE(config, "wave", m_cassette).add_route(ALL_OUTPUTS, "mono", 0.25);
+}
inline uint8_t a26_rom_ss_device::read_byte(uint32_t offset)
{
diff --git a/src/devices/bus/vcs_ctrl/ctrl.h b/src/devices/bus/vcs_ctrl/ctrl.h
index 31f371d2fa8..574a7dc3ae8 100644
--- a/src/devices/bus/vcs_ctrl/ctrl.h
+++ b/src/devices/bus/vcs_ctrl/ctrl.h
@@ -15,22 +15,6 @@
#pragma once
-
-
-//**************************************************************************
-// INTERFACE CONFIGURATION MACROS
-//**************************************************************************
-
-#define MCFG_VCS_CONTROL_PORT_ADD(_tag, _slot_intf, _def_slot) \
- MCFG_DEVICE_ADD(_tag, VCS_CONTROL_PORT, 0) \
- MCFG_DEVICE_SLOT_INTERFACE(_slot_intf, _def_slot, false)
-
-
-#define MCFG_VCS_CONTROL_PORT_TRIGGER_CALLBACK(_write) \
- downcast<vcs_control_port_device &>(*device).set_trigger_wr_callback(DEVCB_##_write);
-
-
-
//**************************************************************************
// TYPE DEFINITIONS
//**************************************************************************
@@ -79,7 +63,6 @@ public:
vcs_control_port_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock = 0);
// static configuration helpers
- template <class Object> devcb_base &set_trigger_wr_callback(Object &&cb) { return m_write_trigger.set_callback(std::forward<Object>(cb)); }
auto trigger_wr_callback() { return m_write_trigger.bind(); }
// computer interface
diff --git a/src/devices/bus/vectrex/slot.h b/src/devices/bus/vectrex/slot.h
index 605e273875f..f779bf5d514 100644
--- a/src/devices/bus/vectrex/slot.h
+++ b/src/devices/bus/vectrex/slot.h
@@ -112,8 +112,4 @@ DECLARE_DEVICE_TYPE(VECTREX_CART_SLOT, vectrex_cart_slot_device)
#define VECSLOT_ROM_REGION_TAG ":cart:rom"
-#define MCFG_VECTREX_CARTRIDGE_ADD(_tag,_slot_intf,_def_slot) \
- MCFG_DEVICE_ADD(_tag, VECTREX_CART_SLOT, 0) \
- MCFG_DEVICE_SLOT_INTERFACE(_slot_intf, _def_slot, false)
-
#endif // MAME_BUS_VECTREX_SLOT_H
diff --git a/src/devices/bus/vic10/exp.cpp b/src/devices/bus/vic10/exp.cpp
index e3af1609567..26ad1980448 100644
--- a/src/devices/bus/vic10/exp.cpp
+++ b/src/devices/bus/vic10/exp.cpp
@@ -198,11 +198,11 @@ std::string vic10_expansion_slot_device::get_default_card_software(get_default_c
// cd_r - cartridge data read
//-------------------------------------------------
-uint8_t vic10_expansion_slot_device::cd_r(address_space &space, offs_t offset, uint8_t data, int lorom, int uprom, int exram)
+uint8_t vic10_expansion_slot_device::cd_r(offs_t offset, uint8_t data, int lorom, int uprom, int exram)
{
if (m_card != nullptr)
{
- data = m_card->vic10_cd_r(space, offset, data, lorom, uprom, exram);
+ data = m_card->vic10_cd_r(offset, data, lorom, uprom, exram);
}
return data;
@@ -213,11 +213,11 @@ uint8_t vic10_expansion_slot_device::cd_r(address_space &space, offs_t offset, u
// cd_w - cartridge data write
//-------------------------------------------------
-void vic10_expansion_slot_device::cd_w(address_space &space, offs_t offset, uint8_t data, int lorom, int uprom, int exram)
+void vic10_expansion_slot_device::cd_w(offs_t offset, uint8_t data, int lorom, int uprom, int exram)
{
if (m_card != nullptr)
{
- m_card->vic10_cd_w(space, offset, data, lorom, uprom, exram);
+ m_card->vic10_cd_w(offset, data, lorom, uprom, exram);
}
}
diff --git a/src/devices/bus/vic10/exp.h b/src/devices/bus/vic10/exp.h
index 24da3f392dc..710b25bbd49 100644
--- a/src/devices/bus/vic10/exp.h
+++ b/src/devices/bus/vic10/exp.h
@@ -79,8 +79,8 @@ public:
auto sp_callback() { return m_write_sp.bind(); }
// computer interface
- uint8_t cd_r(address_space &space, offs_t offset, uint8_t data, int lorom, int uprom, int exram);
- void cd_w(address_space &space, offs_t offset, uint8_t data, int lorom, int uprom, int exram);
+ uint8_t cd_r(offs_t offset, uint8_t data, int lorom, int uprom, int exram);
+ void cd_w(offs_t offset, uint8_t data, int lorom, int uprom, int exram);
DECLARE_READ_LINE_MEMBER( p0_r );
DECLARE_WRITE_LINE_MEMBER( p0_w );
@@ -133,8 +133,8 @@ public:
// construction/destruction
virtual ~device_vic10_expansion_card_interface();
- virtual uint8_t vic10_cd_r(address_space &space, offs_t offset, uint8_t data, int lorom, int uprom, int exram) { return data; }
- virtual void vic10_cd_w(address_space &space, offs_t offset, uint8_t data, int lorom, int uprom, int exram) { }
+ virtual uint8_t vic10_cd_r(offs_t offset, uint8_t data, int lorom, int uprom, int exram) { return data; }
+ virtual void vic10_cd_w(offs_t offset, uint8_t data, int lorom, int uprom, int exram) { }
virtual int vic10_p0_r() { return 0; }
virtual void vic10_p0_w(int state) { }
virtual void vic10_sp_w(int state) { }
diff --git a/src/devices/bus/vic10/multimax.cpp b/src/devices/bus/vic10/multimax.cpp
index f103ad0ce59..98f67a48187 100644
--- a/src/devices/bus/vic10/multimax.cpp
+++ b/src/devices/bus/vic10/multimax.cpp
@@ -59,7 +59,7 @@ void vic10_multimax_device::device_reset()
// vic10_cd_r - cartridge data read
//-------------------------------------------------
-uint8_t vic10_multimax_device::vic10_cd_r(address_space &space, offs_t offset, uint8_t data, int lorom, int uprom, int exram)
+uint8_t vic10_multimax_device::vic10_cd_r(offs_t offset, uint8_t data, int lorom, int uprom, int exram)
{
if (!lorom)
{
@@ -85,7 +85,7 @@ uint8_t vic10_multimax_device::vic10_cd_r(address_space &space, offs_t offset, u
// vic10_cd_w - cartridge data write
//-------------------------------------------------
-void vic10_multimax_device::vic10_cd_w(address_space &space, offs_t offset, uint8_t data, int lorom, int uprom, int exram)
+void vic10_multimax_device::vic10_cd_w(offs_t offset, uint8_t data, int lorom, int uprom, int exram)
{
if (!exram)
{
diff --git a/src/devices/bus/vic10/multimax.h b/src/devices/bus/vic10/multimax.h
index 170ed34fb22..51175fc7bd8 100644
--- a/src/devices/bus/vic10/multimax.h
+++ b/src/devices/bus/vic10/multimax.h
@@ -33,8 +33,8 @@ protected:
virtual void device_reset() override;
// device_vic10_expansion_card_interface overrides
- virtual uint8_t vic10_cd_r(address_space &space, offs_t offset, uint8_t data, int lorom, int uprom, int exram) override;
- virtual void vic10_cd_w(address_space &space, offs_t offset, uint8_t data, int lorom, int uprom, int exram) override;
+ virtual uint8_t vic10_cd_r(offs_t offset, uint8_t data, int lorom, int uprom, int exram) override;
+ virtual void vic10_cd_w(offs_t offset, uint8_t data, int lorom, int uprom, int exram) override;
private:
uint8_t m_latch;
diff --git a/src/devices/bus/vic10/std.cpp b/src/devices/bus/vic10/std.cpp
index 0257ea11d98..de4ba6ff8b6 100644
--- a/src/devices/bus/vic10/std.cpp
+++ b/src/devices/bus/vic10/std.cpp
@@ -46,7 +46,7 @@ void vic10_standard_cartridge_device::device_start()
// vic10_cd_r - cartridge data read
//-------------------------------------------------
-uint8_t vic10_standard_cartridge_device::vic10_cd_r(address_space &space, offs_t offset, uint8_t data, int lorom, int uprom, int exram)
+uint8_t vic10_standard_cartridge_device::vic10_cd_r(offs_t offset, uint8_t data, int lorom, int uprom, int exram)
{
if (!lorom && m_lorom.bytes())
{
@@ -69,7 +69,7 @@ uint8_t vic10_standard_cartridge_device::vic10_cd_r(address_space &space, offs_t
// vic10_cd_w - cartridge data write
//-------------------------------------------------
-void vic10_standard_cartridge_device::vic10_cd_w(address_space &space, offs_t offset, uint8_t data, int lorom, int uprom, int exram)
+void vic10_standard_cartridge_device::vic10_cd_w(offs_t offset, uint8_t data, int lorom, int uprom, int exram)
{
if (!exram && m_exram.bytes())
{
diff --git a/src/devices/bus/vic10/std.h b/src/devices/bus/vic10/std.h
index 1d1ebf7ae33..3279a58333c 100644
--- a/src/devices/bus/vic10/std.h
+++ b/src/devices/bus/vic10/std.h
@@ -33,8 +33,8 @@ protected:
virtual void device_start() override;
// device_vic10_expansion_card_interface overrides
- virtual uint8_t vic10_cd_r(address_space &space, offs_t offset, uint8_t data, int lorom, int uprom, int exram) override;
- virtual void vic10_cd_w(address_space &space, offs_t offset, uint8_t data, int lorom, int uprom, int exram) override;
+ virtual uint8_t vic10_cd_r(offs_t offset, uint8_t data, int lorom, int uprom, int exram) override;
+ virtual void vic10_cd_w(offs_t offset, uint8_t data, int lorom, int uprom, int exram) override;
};
diff --git a/src/devices/bus/vic20/exp.cpp b/src/devices/bus/vic20/exp.cpp
index 4bc6136553b..c472f7408fd 100644
--- a/src/devices/bus/vic20/exp.cpp
+++ b/src/devices/bus/vic20/exp.cpp
@@ -178,11 +178,11 @@ std::string vic20_expansion_slot_device::get_default_card_software(get_default_c
// cd_r - cartridge data read
//-------------------------------------------------
-uint8_t vic20_expansion_slot_device::cd_r(address_space &space, offs_t offset, uint8_t data, int ram1, int ram2, int ram3, int blk1, int blk2, int blk3, int blk5, int io2, int io3)
+uint8_t vic20_expansion_slot_device::cd_r(offs_t offset, uint8_t data, int ram1, int ram2, int ram3, int blk1, int blk2, int blk3, int blk5, int io2, int io3)
{
if (m_card != nullptr)
{
- data = m_card->vic20_cd_r(space, offset, data, ram1, ram2, ram3, blk1, blk2, blk3, blk5, io2, io3);
+ data = m_card->vic20_cd_r(offset, data, ram1, ram2, ram3, blk1, blk2, blk3, blk5, io2, io3);
}
return data;
@@ -193,11 +193,11 @@ uint8_t vic20_expansion_slot_device::cd_r(address_space &space, offs_t offset, u
// cd_w - cartridge data write
//-------------------------------------------------
-void vic20_expansion_slot_device::cd_w(address_space &space, offs_t offset, uint8_t data, int ram1, int ram2, int ram3, int blk1, int blk2, int blk3, int blk5, int io2, int io3)
+void vic20_expansion_slot_device::cd_w(offs_t offset, uint8_t data, int ram1, int ram2, int ram3, int blk1, int blk2, int blk3, int blk5, int io2, int io3)
{
if (m_card != nullptr)
{
- m_card->vic20_cd_w(space, offset, data, ram1, ram2, ram3, blk1, blk2, blk3, blk5, io2, io3);
+ m_card->vic20_cd_w(offset, data, ram1, ram2, ram3, blk1, blk2, blk3, blk5, io2, io3);
}
}
diff --git a/src/devices/bus/vic20/exp.h b/src/devices/bus/vic20/exp.h
index b6b0dbd1346..f7e51b0ee57 100644
--- a/src/devices/bus/vic20/exp.h
+++ b/src/devices/bus/vic20/exp.h
@@ -79,8 +79,8 @@ public:
auto res_wr_callback() { return m_write_res.bind(); }
// computer interface
- uint8_t cd_r(address_space &space, offs_t offset, uint8_t data, int ram1, int ram2, int ram3, int blk1, int blk2, int blk3, int blk5, int io2, int io3);
- void cd_w(address_space &space, offs_t offset, uint8_t data, int ram1, int ram2, int ram3, int blk1, int blk2, int blk3, int blk5, int io2, int io3);
+ uint8_t cd_r(offs_t offset, uint8_t data, int ram1, int ram2, int ram3, int blk1, int blk2, int blk3, int blk5, int io2, int io3);
+ void cd_w(offs_t offset, uint8_t data, int ram1, int ram2, int ram3, int blk1, int blk2, int blk3, int blk5, int io2, int io3);
// cartridge interface
DECLARE_WRITE_LINE_MEMBER( irq_w ) { m_write_irq(state); }
@@ -129,8 +129,8 @@ public:
// construction/destruction
virtual ~device_vic20_expansion_card_interface();
- virtual uint8_t vic20_cd_r(address_space &space, offs_t offset, uint8_t data, int ram1, int ram2, int ram3, int blk1, int blk2, int blk3, int blk5, int io2, int io3) { return data; };
- virtual void vic20_cd_w(address_space &space, offs_t offset, uint8_t data, int ram1, int ram2, int ram3, int blk1, int blk2, int blk3, int blk5, int io2, int io3) { };
+ virtual uint8_t vic20_cd_r(offs_t offset, uint8_t data, int ram1, int ram2, int ram3, int blk1, int blk2, int blk3, int blk5, int io2, int io3) { return data; };
+ virtual void vic20_cd_w(offs_t offset, uint8_t data, int ram1, int ram2, int ram3, int blk1, int blk2, int blk3, int blk5, int io2, int io3) { };
protected:
device_vic20_expansion_card_interface(const machine_config &mconfig, device_t &device);
diff --git a/src/devices/bus/vic20/fe3.cpp b/src/devices/bus/vic20/fe3.cpp
index 57b7df49e91..f008bec3cb8 100644
--- a/src/devices/bus/vic20/fe3.cpp
+++ b/src/devices/bus/vic20/fe3.cpp
@@ -140,7 +140,7 @@ void vic20_final_expansion_3_device::device_reset()
// vic20_cd_r - cartridge data read
//-------------------------------------------------
-uint8_t vic20_final_expansion_3_device::vic20_cd_r(address_space &space, offs_t offset, uint8_t data, int ram1, int ram2, int ram3, int blk1, int blk2, int blk3, int blk5, int io2, int io3)
+uint8_t vic20_final_expansion_3_device::vic20_cd_r(offs_t offset, uint8_t data, int ram1, int ram2, int ram3, int blk1, int blk2, int blk3, int blk5, int io2, int io3)
{
switch (m_reg1 & REG1_MODE_MASK)
{
@@ -148,7 +148,7 @@ uint8_t vic20_final_expansion_3_device::vic20_cd_r(address_space &space, offs_t
// read from ROM
if (!blk5)
{
- data = m_flash_rom->read(space, get_address(0, 3, offset));
+ data = m_flash_rom->read(get_address(0, 3, offset));
m_lockbit = 1;
}
@@ -170,19 +170,19 @@ uint8_t vic20_final_expansion_3_device::vic20_cd_r(address_space &space, offs_t
// read from ROM
if (!blk1 && !BLK1_HIDDEN)
{
- data = m_flash_rom->read(space, get_address(REG1_BANK, 0, offset));
+ data = m_flash_rom->read(get_address(REG1_BANK, 0, offset));
}
if (!blk2 && !BLK2_HIDDEN)
{
- data = m_flash_rom->read(space, get_address(REG1_BANK, 1, offset));
+ data = m_flash_rom->read(get_address(REG1_BANK, 1, offset));
}
if (!blk3 && !BLK3_HIDDEN)
{
- data = m_flash_rom->read(space, get_address(REG1_BANK, 2, offset));
+ data = m_flash_rom->read(get_address(REG1_BANK, 2, offset));
}
if (!blk5 && !BLK5_HIDDEN)
{
- data = m_flash_rom->read(space, get_address(REG1_BANK, 3, offset));
+ data = m_flash_rom->read(get_address(REG1_BANK, 3, offset));
}
// read from registers
@@ -298,19 +298,19 @@ uint8_t vic20_final_expansion_3_device::vic20_cd_r(address_space &space, offs_t
// read from ROM bank 0 or RAM bank 1
if (!blk1 && !BLK1_HIDDEN)
{
- data = (m_reg1 & REG1_BLK1) ? m_flash_rom->read(space, get_address(0, 0, offset)) : m_ram[get_address(1, 0, offset)];
+ data = (m_reg1 & REG1_BLK1) ? m_flash_rom->read(get_address(0, 0, offset)) : m_ram[get_address(1, 0, offset)];
}
if (!blk2 && !BLK2_HIDDEN)
{
- data = (m_reg1 & REG1_BLK2) ? m_flash_rom->read(space, get_address(0, 1, offset)) : m_ram[get_address(1, 1, offset)];
+ data = (m_reg1 & REG1_BLK2) ? m_flash_rom->read(get_address(0, 1, offset)) : m_ram[get_address(1, 1, offset)];
}
if (!blk3 && !BLK3_HIDDEN)
{
- data = (m_reg1 & REG1_BLK3) ? m_flash_rom->read(space, get_address(0, 2, offset)) : m_ram[get_address(1, 2, offset)];
+ data = (m_reg1 & REG1_BLK3) ? m_flash_rom->read(get_address(0, 2, offset)) : m_ram[get_address(1, 2, offset)];
}
if (!blk5 && !BLK5_HIDDEN)
{
- data = (m_reg1 & REG1_BLK5) ? m_flash_rom->read(space, get_address(0, 3, offset)) : m_ram[get_address(1, 3, offset)];
+ data = (m_reg1 & REG1_BLK5) ? m_flash_rom->read(get_address(0, 3, offset)) : m_ram[get_address(1, 3, offset)];
}
// read from registers
@@ -330,19 +330,19 @@ uint8_t vic20_final_expansion_3_device::vic20_cd_r(address_space &space, offs_t
// read from ROM
if (!blk1 && !BLK1_HIDDEN)
{
- data = m_flash_rom->read(space, get_address(REG1_BANK, 0, offset));
+ data = m_flash_rom->read(get_address(REG1_BANK, 0, offset));
}
if (!blk2 && !BLK2_HIDDEN)
{
- data = m_flash_rom->read(space, get_address(REG1_BANK, 1, offset));
+ data = m_flash_rom->read(get_address(REG1_BANK, 1, offset));
}
if (!blk3 && !BLK3_HIDDEN)
{
- data = m_flash_rom->read(space, get_address(REG1_BANK, 2, offset));
+ data = m_flash_rom->read(get_address(REG1_BANK, 2, offset));
}
if (!blk5 && !BLK5_HIDDEN)
{
- data = m_flash_rom->read(space, get_address(REG1_BANK, 3, offset));
+ data = m_flash_rom->read(get_address(REG1_BANK, 3, offset));
}
// read from registers
@@ -361,7 +361,7 @@ uint8_t vic20_final_expansion_3_device::vic20_cd_r(address_space &space, offs_t
// vic20_cd_w - cartridge data write
//-------------------------------------------------
-void vic20_final_expansion_3_device::vic20_cd_w(address_space &space, offs_t offset, uint8_t data, int ram1, int ram2, int ram3, int blk1, int blk2, int blk3, int blk5, int io2, int io3)
+void vic20_final_expansion_3_device::vic20_cd_w(offs_t offset, uint8_t data, int ram1, int ram2, int ram3, int blk1, int blk2, int blk3, int blk5, int io2, int io3)
{
switch (m_reg1 & REG1_MODE_MASK)
{
@@ -551,19 +551,19 @@ void vic20_final_expansion_3_device::vic20_cd_w(address_space &space, offs_t off
// write to ROM
if (!blk1 && !BLK1_HIDDEN)
{
- m_flash_rom->write(space, get_address(REG1_BANK, 0, offset), data);
+ m_flash_rom->write(get_address(REG1_BANK, 0, offset), data);
}
if (!blk2 && !BLK2_HIDDEN)
{
- m_flash_rom->write(space, get_address(REG1_BANK, 1, offset), data);
+ m_flash_rom->write(get_address(REG1_BANK, 1, offset), data);
}
if (!blk3 && !BLK3_HIDDEN)
{
- m_flash_rom->write(space, get_address(REG1_BANK, 2, offset), data);
+ m_flash_rom->write(get_address(REG1_BANK, 2, offset), data);
}
if (!blk5 && !BLK5_HIDDEN)
{
- m_flash_rom->write(space, get_address(REG1_BANK, 3, offset), data);
+ m_flash_rom->write(get_address(REG1_BANK, 3, offset), data);
}
// write to registers
diff --git a/src/devices/bus/vic20/fe3.h b/src/devices/bus/vic20/fe3.h
index e65a97bfd1f..018ef2617b6 100644
--- a/src/devices/bus/vic20/fe3.h
+++ b/src/devices/bus/vic20/fe3.h
@@ -39,8 +39,8 @@ protected:
virtual void device_add_mconfig(machine_config &config) override;
// device_vic20_expansion_card_interface overrides
- virtual uint8_t vic20_cd_r(address_space &space, offs_t offset, uint8_t data, int ram1, int ram2, int ram3, int blk1, int blk2, int blk3, int blk5, int io2, int io3) override;
- virtual void vic20_cd_w(address_space &space, offs_t offset, uint8_t data, int ram1, int ram2, int ram3, int blk1, int blk2, int blk3, int blk5, int io2, int io3) override;
+ virtual uint8_t vic20_cd_r(offs_t offset, uint8_t data, int ram1, int ram2, int ram3, int blk1, int blk2, int blk3, int blk5, int io2, int io3) override;
+ virtual void vic20_cd_w(offs_t offset, uint8_t data, int ram1, int ram2, int ram3, int blk1, int blk2, int blk3, int blk5, int io2, int io3) override;
private:
enum
diff --git a/src/devices/bus/vic20/megacart.cpp b/src/devices/bus/vic20/megacart.cpp
index fea4153457e..8094adfba2b 100644
--- a/src/devices/bus/vic20/megacart.cpp
+++ b/src/devices/bus/vic20/megacart.cpp
@@ -22,10 +22,9 @@ DEFINE_DEVICE_TYPE(VIC20_MEGACART, vic20_megacart_device, "vic20_megacart", "VIC
// device_add_mconfig - add device configuration
//-------------------------------------------------
-MACHINE_CONFIG_START(vic20_megacart_device::device_add_mconfig)
-
-MACHINE_CONFIG_END
-
+void vic20_megacart_device::device_add_mconfig(machine_config &config)
+{
+}
//**************************************************************************
@@ -71,7 +70,7 @@ void vic20_megacart_device::device_reset()
// vic20_cd_r - cartridge data read
//-------------------------------------------------
-uint8_t vic20_megacart_device::vic20_cd_r(address_space &space, offs_t offset, uint8_t data, int ram1, int ram2, int ram3, int blk1, int blk2, int blk3, int blk5, int io2, int io3)
+uint8_t vic20_megacart_device::vic20_cd_r(offs_t offset, uint8_t data, int ram1, int ram2, int ram3, int blk1, int blk2, int blk3, int blk5, int io2, int io3)
{
if (!ram1 || !ram2 || !ram3 || !io2 || !io3)
{
@@ -95,7 +94,7 @@ uint8_t vic20_megacart_device::vic20_cd_r(address_space &space, offs_t offset, u
// vic20_cd_w - cartridge data write
//-------------------------------------------------
-void vic20_megacart_device::vic20_cd_w(address_space &space, offs_t offset, uint8_t data, int ram1, int ram2, int ram3, int blk1, int blk2, int blk3, int blk5, int io2, int io3)
+void vic20_megacart_device::vic20_cd_w(offs_t offset, uint8_t data, int ram1, int ram2, int ram3, int blk1, int blk2, int blk3, int blk5, int io2, int io3)
{
if (!ram1 || !ram2 || !ram3 || !io2)
{
diff --git a/src/devices/bus/vic20/megacart.h b/src/devices/bus/vic20/megacart.h
index 6e66382b2c7..52f5182fc3c 100644
--- a/src/devices/bus/vic20/megacart.h
+++ b/src/devices/bus/vic20/megacart.h
@@ -43,8 +43,8 @@ protected:
virtual void nvram_write(emu_file &file) override { file.write(m_nvram, m_nvram.bytes()); }
// device_vic20_expansion_card_interface overrides
- virtual uint8_t vic20_cd_r(address_space &space, offs_t offset, uint8_t data, int ram1, int ram2, int ram3, int blk1, int blk2, int blk3, int blk5, int io2, int io3) override;
- virtual void vic20_cd_w(address_space &space, offs_t offset, uint8_t data, int ram1, int ram2, int ram3, int blk1, int blk2, int blk3, int blk5, int io2, int io3) override;
+ virtual uint8_t vic20_cd_r(offs_t offset, uint8_t data, int ram1, int ram2, int ram3, int blk1, int blk2, int blk3, int blk5, int io2, int io3) override;
+ virtual void vic20_cd_w(offs_t offset, uint8_t data, int ram1, int ram2, int ram3, int blk1, int blk2, int blk3, int blk5, int io2, int io3) override;
private:
int m_nvram_en;
diff --git a/src/devices/bus/vic20/speakeasy.cpp b/src/devices/bus/vic20/speakeasy.cpp
index 4a068b2daaf..6128852d540 100644
--- a/src/devices/bus/vic20/speakeasy.cpp
+++ b/src/devices/bus/vic20/speakeasy.cpp
@@ -33,12 +33,12 @@ DEFINE_DEVICE_TYPE(VIC20_SPEAKEASY, vic20_speakeasy_device, "vic20_speakeasy", "
// device_add_mconfig - add device configuration
//-------------------------------------------------
-MACHINE_CONFIG_START(vic20_speakeasy_device::device_add_mconfig)
+void vic20_speakeasy_device::device_add_mconfig(machine_config &config)
+{
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD(SC01A_TAG, VOTRAX_SC01, 720000)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.85)
-MACHINE_CONFIG_END
+ VOTRAX_SC01(config, m_votrax, 720000).add_route(ALL_OUTPUTS, "mono", 0.85);
+}
@@ -71,7 +71,7 @@ void vic20_speakeasy_device::device_start()
// vic20_cd_r - cartridge data read
//-------------------------------------------------
-uint8_t vic20_speakeasy_device::vic20_cd_r(address_space &space, offs_t offset, uint8_t data, int ram1, int ram2, int ram3, int blk1, int blk2, int blk3, int blk5, int io2, int io3)
+uint8_t vic20_speakeasy_device::vic20_cd_r(offs_t offset, uint8_t data, int ram1, int ram2, int ram3, int blk1, int blk2, int blk3, int blk5, int io2, int io3)
{
if (!io2)
{
@@ -86,11 +86,11 @@ uint8_t vic20_speakeasy_device::vic20_cd_r(address_space &space, offs_t offset,
// vic20_cd_w - cartridge data write
//-------------------------------------------------
-void vic20_speakeasy_device::vic20_cd_w(address_space &space, offs_t offset, uint8_t data, int ram1, int ram2, int ram3, int blk1, int blk2, int blk3, int blk5, int io2, int io3)
+void vic20_speakeasy_device::vic20_cd_w(offs_t offset, uint8_t data, int ram1, int ram2, int ram3, int blk1, int blk2, int blk3, int blk5, int io2, int io3)
{
if (!io2)
{
- m_votrax->write(space, 0, data & 0x3f);
- m_votrax->inflection_w(space, 0, data >> 6);
+ m_votrax->write(data & 0x3f);
+ m_votrax->inflection_w(data >> 6);
}
}
diff --git a/src/devices/bus/vic20/speakeasy.h b/src/devices/bus/vic20/speakeasy.h
index 823963804be..6df3880d2df 100644
--- a/src/devices/bus/vic20/speakeasy.h
+++ b/src/devices/bus/vic20/speakeasy.h
@@ -38,8 +38,8 @@ protected:
virtual void device_add_mconfig(machine_config &config) override;
// device_vic20_expansion_card_interface overrides
- virtual uint8_t vic20_cd_r(address_space &space, offs_t offset, uint8_t data, int ram1, int ram2, int ram3, int blk1, int blk2, int blk3, int blk5, int io2, int io3) override;
- virtual void vic20_cd_w(address_space &space, offs_t offset, uint8_t data, int ram1, int ram2, int ram3, int blk1, int blk2, int blk3, int blk5, int io2, int io3) override;
+ virtual uint8_t vic20_cd_r(offs_t offset, uint8_t data, int ram1, int ram2, int ram3, int blk1, int blk2, int blk3, int blk5, int io2, int io3) override;
+ virtual void vic20_cd_w(offs_t offset, uint8_t data, int ram1, int ram2, int ram3, int blk1, int blk2, int blk3, int blk5, int io2, int io3) override;
private:
required_device<votrax_sc01_device> m_votrax;
diff --git a/src/devices/bus/vic20/std.cpp b/src/devices/bus/vic20/std.cpp
index 7b4823dfcdf..988540719d8 100644
--- a/src/devices/bus/vic20/std.cpp
+++ b/src/devices/bus/vic20/std.cpp
@@ -46,7 +46,7 @@ void vic20_standard_cartridge_device::device_start()
// vic20_cd_r - cartridge data read
//-------------------------------------------------
-uint8_t vic20_standard_cartridge_device::vic20_cd_r(address_space &space, offs_t offset, uint8_t data, int ram1, int ram2, int ram3, int blk1, int blk2, int blk3, int blk5, int io2, int io3)
+uint8_t vic20_standard_cartridge_device::vic20_cd_r(offs_t offset, uint8_t data, int ram1, int ram2, int ram3, int blk1, int blk2, int blk3, int blk5, int io2, int io3)
{
if (!blk1 && (m_blk1 != nullptr))
{
diff --git a/src/devices/bus/vic20/std.h b/src/devices/bus/vic20/std.h
index 2362a9c1c4c..0318f80aa54 100644
--- a/src/devices/bus/vic20/std.h
+++ b/src/devices/bus/vic20/std.h
@@ -33,7 +33,7 @@ protected:
virtual void device_start() override;
// device_vic20_expansion_card_interface overrides
- virtual uint8_t vic20_cd_r(address_space &space, offs_t offset, uint8_t data, int ram1, int ram2, int ram3, int blk1, int blk2, int blk3, int blk5, int io2, int io3) override;
+ virtual uint8_t vic20_cd_r(offs_t offset, uint8_t data, int ram1, int ram2, int ram3, int blk1, int blk2, int blk3, int blk5, int io2, int io3) override;
};
diff --git a/src/devices/bus/vic20/vic1010.cpp b/src/devices/bus/vic20/vic1010.cpp
index 3c00365a4bc..651ac37156e 100644
--- a/src/devices/bus/vic20/vic1010.cpp
+++ b/src/devices/bus/vic20/vic1010.cpp
@@ -75,11 +75,11 @@ void vic1010_device::device_reset()
// vic20_cd_r - cartridge data read
//-------------------------------------------------
-uint8_t vic1010_device::vic20_cd_r(address_space &space, offs_t offset, uint8_t data, int ram1, int ram2, int ram3, int blk1, int blk2, int blk3, int blk5, int io2, int io3)
+uint8_t vic1010_device::vic20_cd_r(offs_t offset, uint8_t data, int ram1, int ram2, int ram3, int blk1, int blk2, int blk3, int blk5, int io2, int io3)
{
for (auto elem : m_expansion_slot)
{
- uint8_t slot_data = elem->cd_r(space, offset, data, ram1, ram2, ram3, blk1, blk2, blk3, blk5, io2, io3);
+ uint8_t slot_data = elem->cd_r(offset, data, ram1, ram2, ram3, blk1, blk2, blk3, blk5, io2, io3);
if (data != slot_data)
{
@@ -95,10 +95,10 @@ uint8_t vic1010_device::vic20_cd_r(address_space &space, offs_t offset, uint8_t
// vic20_cd_w - cartridge data write
//-------------------------------------------------
-void vic1010_device::vic20_cd_w(address_space &space, offs_t offset, uint8_t data, int ram1, int ram2, int ram3, int blk1, int blk2, int blk3, int blk5, int io2, int io3)
+void vic1010_device::vic20_cd_w(offs_t offset, uint8_t data, int ram1, int ram2, int ram3, int blk1, int blk2, int blk3, int blk5, int io2, int io3)
{
for (auto & elem : m_expansion_slot)
{
- elem->cd_w(space, offset, data, ram1, ram2, ram3, blk1, blk2, blk3, blk5, io2, io3);
+ elem->cd_w(offset, data, ram1, ram2, ram3, blk1, blk2, blk3, blk5, io2, io3);
}
}
diff --git a/src/devices/bus/vic20/vic1010.h b/src/devices/bus/vic20/vic1010.h
index f2014041f94..af85f4bfc3c 100644
--- a/src/devices/bus/vic20/vic1010.h
+++ b/src/devices/bus/vic20/vic1010.h
@@ -37,8 +37,8 @@ protected:
virtual void device_add_mconfig(machine_config &config) override;
// device_vic20_expansion_card_interface overrides
- virtual uint8_t vic20_cd_r(address_space &space, offs_t offset, uint8_t data, int ram1, int ram2, int ram3, int blk1, int blk2, int blk3, int blk5, int io2, int io3) override;
- virtual void vic20_cd_w(address_space &space, offs_t offset, uint8_t data, int ram1, int ram2, int ram3, int blk1, int blk2, int blk3, int blk5, int io2, int io3) override;
+ virtual uint8_t vic20_cd_r(offs_t offset, uint8_t data, int ram1, int ram2, int ram3, int blk1, int blk2, int blk3, int blk5, int io2, int io3) override;
+ virtual void vic20_cd_w(offs_t offset, uint8_t data, int ram1, int ram2, int ram3, int blk1, int blk2, int blk3, int blk5, int io2, int io3) override;
private:
static constexpr unsigned MAX_SLOTS = 6;
diff --git a/src/devices/bus/vic20/vic1110.cpp b/src/devices/bus/vic20/vic1110.cpp
index 8edd2179bf9..9b2d0c192d9 100644
--- a/src/devices/bus/vic20/vic1110.cpp
+++ b/src/devices/bus/vic20/vic1110.cpp
@@ -90,7 +90,7 @@ void vic1110_device::device_start()
// vic20_cd_r - cartridge data read
//-------------------------------------------------
-uint8_t vic1110_device::vic20_cd_r(address_space &space, offs_t offset, uint8_t data, int ram1, int ram2, int ram3, int blk1, int blk2, int blk3, int blk5, int io2, int io3)
+uint8_t vic1110_device::vic20_cd_r(offs_t offset, uint8_t data, int ram1, int ram2, int ram3, int blk1, int blk2, int blk3, int blk5, int io2, int io3)
{
uint8_t sw = m_sw->read();
@@ -107,7 +107,7 @@ uint8_t vic1110_device::vic20_cd_r(address_space &space, offs_t offset, uint8_t
// vic20_cd_w - cartridge data write
//-------------------------------------------------
-void vic1110_device::vic20_cd_w(address_space &space, offs_t offset, uint8_t data, int ram1, int ram2, int ram3, int blk1, int blk2, int blk3, int blk5, int io2, int io3)
+void vic1110_device::vic20_cd_w(offs_t offset, uint8_t data, int ram1, int ram2, int ram3, int blk1, int blk2, int blk3, int blk5, int io2, int io3)
{
uint8_t sw = m_sw->read();
diff --git a/src/devices/bus/vic20/vic1110.h b/src/devices/bus/vic20/vic1110.h
index d1467c995bc..9ec1ea2791a 100644
--- a/src/devices/bus/vic20/vic1110.h
+++ b/src/devices/bus/vic20/vic1110.h
@@ -36,8 +36,8 @@ protected:
virtual void device_start() override;
// device_vic20_expansion_card_interface overrides
- virtual uint8_t vic20_cd_r(address_space &space, offs_t offset, uint8_t data, int ram1, int ram2, int ram3, int blk1, int blk2, int blk3, int blk5, int io2, int io3) override;
- virtual void vic20_cd_w(address_space &space, offs_t offset, uint8_t data, int ram1, int ram2, int ram3, int blk1, int blk2, int blk3, int blk5, int io2, int io3) override;
+ virtual uint8_t vic20_cd_r(offs_t offset, uint8_t data, int ram1, int ram2, int ram3, int blk1, int blk2, int blk3, int blk5, int io2, int io3) override;
+ virtual void vic20_cd_w(offs_t offset, uint8_t data, int ram1, int ram2, int ram3, int blk1, int blk2, int blk3, int blk5, int io2, int io3) override;
private:
optional_shared_ptr<uint8_t> m_ram;
diff --git a/src/devices/bus/vic20/vic1111.cpp b/src/devices/bus/vic20/vic1111.cpp
index ccfbabccd48..1f8fa215078 100644
--- a/src/devices/bus/vic20/vic1111.cpp
+++ b/src/devices/bus/vic20/vic1111.cpp
@@ -50,7 +50,7 @@ void vic1111_device::device_start()
// vic20_cd_r - cartridge data read
//-------------------------------------------------
-uint8_t vic1111_device::vic20_cd_r(address_space &space, offs_t offset, uint8_t data, int ram1, int ram2, int ram3, int blk1, int blk2, int blk3, int blk5, int io2, int io3)
+uint8_t vic1111_device::vic20_cd_r(offs_t offset, uint8_t data, int ram1, int ram2, int ram3, int blk1, int blk2, int blk3, int blk5, int io2, int io3)
{
if (!blk1)
{
@@ -69,7 +69,7 @@ uint8_t vic1111_device::vic20_cd_r(address_space &space, offs_t offset, uint8_t
// vic20_cd_w - cartridge data write
//-------------------------------------------------
-void vic1111_device::vic20_cd_w(address_space &space, offs_t offset, uint8_t data, int ram1, int ram2, int ram3, int blk1, int blk2, int blk3, int blk5, int io2, int io3)
+void vic1111_device::vic20_cd_w(offs_t offset, uint8_t data, int ram1, int ram2, int ram3, int blk1, int blk2, int blk3, int blk5, int io2, int io3)
{
if (!blk1)
{
diff --git a/src/devices/bus/vic20/vic1111.h b/src/devices/bus/vic20/vic1111.h
index 21f439534e9..eb42db2f149 100644
--- a/src/devices/bus/vic20/vic1111.h
+++ b/src/devices/bus/vic20/vic1111.h
@@ -33,8 +33,8 @@ protected:
virtual void device_start() override;
// device_vic20_expansion_card_interface overrides
- virtual uint8_t vic20_cd_r(address_space &space, offs_t offset, uint8_t data, int ram1, int ram2, int ram3, int blk1, int blk2, int blk3, int blk5, int io2, int io3) override;
- virtual void vic20_cd_w(address_space &space, offs_t offset, uint8_t data, int ram1, int ram2, int ram3, int blk1, int blk2, int blk3, int blk5, int io2, int io3) override;
+ virtual uint8_t vic20_cd_r(offs_t offset, uint8_t data, int ram1, int ram2, int ram3, int blk1, int blk2, int blk3, int blk5, int io2, int io3) override;
+ virtual void vic20_cd_w(offs_t offset, uint8_t data, int ram1, int ram2, int ram3, int blk1, int blk2, int blk3, int blk5, int io2, int io3) override;
private:
optional_shared_ptr<uint8_t> m_ram;
diff --git a/src/devices/bus/vic20/vic1112.cpp b/src/devices/bus/vic20/vic1112.cpp
index e8d55e1e89b..77b421f51d8 100644
--- a/src/devices/bus/vic20/vic1112.cpp
+++ b/src/devices/bus/vic20/vic1112.cpp
@@ -164,7 +164,7 @@ void vic1112_device::device_reset()
// vic20_cd_r - cartridge data read
//-------------------------------------------------
-uint8_t vic1112_device::vic20_cd_r(address_space &space, offs_t offset, uint8_t data, int ram1, int ram2, int ram3, int blk1, int blk2, int blk3, int blk5, int io2, int io3)
+uint8_t vic1112_device::vic20_cd_r(offs_t offset, uint8_t data, int ram1, int ram2, int ram3, int blk1, int blk2, int blk3, int blk5, int io2, int io3)
{
if (!io2)
{
@@ -184,7 +184,7 @@ uint8_t vic1112_device::vic20_cd_r(address_space &space, offs_t offset, uint8_t
// vic20_cd_w - cartridge data write
//-------------------------------------------------
-void vic1112_device::vic20_cd_w(address_space &space, offs_t offset, uint8_t data, int ram1, int ram2, int ram3, int blk1, int blk2, int blk3, int blk5, int io2, int io3)
+void vic1112_device::vic20_cd_w(offs_t offset, uint8_t data, int ram1, int ram2, int ram3, int blk1, int blk2, int blk3, int blk5, int io2, int io3)
{
if (!io2)
{
diff --git a/src/devices/bus/vic20/vic1112.h b/src/devices/bus/vic20/vic1112.h
index 6108a328ca8..5c4e05446a0 100644
--- a/src/devices/bus/vic20/vic1112.h
+++ b/src/devices/bus/vic20/vic1112.h
@@ -42,8 +42,8 @@ protected:
virtual void device_add_mconfig(machine_config &config) override;
// device_vic20_expansion_card_interface overrides
- virtual uint8_t vic20_cd_r(address_space &space, offs_t offset, uint8_t data, int ram1, int ram2, int ram3, int blk1, int blk2, int blk3, int blk5, int io2, int io3) override;
- virtual void vic20_cd_w(address_space &space, offs_t offset, uint8_t data, int ram1, int ram2, int ram3, int blk1, int blk2, int blk3, int blk5, int io2, int io3) override;
+ virtual uint8_t vic20_cd_r(offs_t offset, uint8_t data, int ram1, int ram2, int ram3, int blk1, int blk2, int blk3, int blk5, int io2, int io3) override;
+ virtual void vic20_cd_w(offs_t offset, uint8_t data, int ram1, int ram2, int ram3, int blk1, int blk2, int blk3, int blk5, int io2, int io3) override;
private:
DECLARE_WRITE_LINE_MEMBER( via0_irq_w );
diff --git a/src/devices/bus/vic20/vic1210.cpp b/src/devices/bus/vic20/vic1210.cpp
index 81e5d75cc1d..6fa2a917254 100644
--- a/src/devices/bus/vic20/vic1210.cpp
+++ b/src/devices/bus/vic20/vic1210.cpp
@@ -51,7 +51,7 @@ void vic1210_device::device_start()
// vic20_cd_r - cartridge data read
//-------------------------------------------------
-uint8_t vic1210_device::vic20_cd_r(address_space &space, offs_t offset, uint8_t data, int ram1, int ram2, int ram3, int blk1, int blk2, int blk3, int blk5, int io2, int io3)
+uint8_t vic1210_device::vic20_cd_r(offs_t offset, uint8_t data, int ram1, int ram2, int ram3, int blk1, int blk2, int blk3, int blk5, int io2, int io3)
{
if (!ram1 || !ram2 || !ram3)
{
@@ -70,7 +70,7 @@ uint8_t vic1210_device::vic20_cd_r(address_space &space, offs_t offset, uint8_t
// vic20_cd_w - cartridge data write
//-------------------------------------------------
-void vic1210_device::vic20_cd_w(address_space &space, offs_t offset, uint8_t data, int ram1, int ram2, int ram3, int blk1, int blk2, int blk3, int blk5, int io2, int io3)
+void vic1210_device::vic20_cd_w(offs_t offset, uint8_t data, int ram1, int ram2, int ram3, int blk1, int blk2, int blk3, int blk5, int io2, int io3)
{
if (!ram1 || !ram2 || !ram3)
{
diff --git a/src/devices/bus/vic20/vic1210.h b/src/devices/bus/vic20/vic1210.h
index 9fa0ea48a99..f890d5ad61e 100644
--- a/src/devices/bus/vic20/vic1210.h
+++ b/src/devices/bus/vic20/vic1210.h
@@ -34,8 +34,8 @@ protected:
virtual void device_start() override;
// device_vic20_expansion_card_interface overrides
- virtual uint8_t vic20_cd_r(address_space &space, offs_t offset, uint8_t data, int ram1, int ram2, int ram3, int blk1, int blk2, int blk3, int blk5, int io2, int io3) override;
- virtual void vic20_cd_w(address_space &space, offs_t offset, uint8_t data, int ram1, int ram2, int ram3, int blk1, int blk2, int blk3, int blk5, int io2, int io3) override;
+ virtual uint8_t vic20_cd_r(offs_t offset, uint8_t data, int ram1, int ram2, int ram3, int blk1, int blk2, int blk3, int blk5, int io2, int io3) override;
+ virtual void vic20_cd_w(offs_t offset, uint8_t data, int ram1, int ram2, int ram3, int blk1, int blk2, int blk3, int blk5, int io2, int io3) override;
private:
optional_shared_ptr<uint8_t> m_ram;
diff --git a/src/devices/bus/vic20/videopak.cpp b/src/devices/bus/vic20/videopak.cpp
index 841d4265a1b..849f9a00a3b 100644
--- a/src/devices/bus/vic20/videopak.cpp
+++ b/src/devices/bus/vic20/videopak.cpp
@@ -97,14 +97,15 @@ GFXDECODE_END
// device_add_mconfig - add device configuration
//-------------------------------------------------
-MACHINE_CONFIG_START(vic20_video_pak_device::device_add_mconfig)
- MCFG_SCREEN_ADD_MONOCHROME(MC6845_SCREEN_TAG, RASTER, rgb_t::white())
- MCFG_SCREEN_UPDATE_DEVICE(MC6845_TAG, h46505_device, screen_update)
- MCFG_SCREEN_SIZE(80*8, 24*8)
- MCFG_SCREEN_VISIBLE_AREA(0, 80*8-1, 0, 24*8-1)
- MCFG_SCREEN_REFRESH_RATE(50)
-
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_vic20_video_pak)
+void vic20_video_pak_device::device_add_mconfig(machine_config &config)
+{
+ screen_device &screen(SCREEN(config, MC6845_SCREEN_TAG, SCREEN_TYPE_RASTER, rgb_t::white()));
+ screen.set_screen_update(MC6845_TAG, FUNC(h46505_device::screen_update));
+ screen.set_size(80*8, 24*8);
+ screen.set_visarea(0, 80*8-1, 0, 24*8-1);
+ screen.set_refresh_hz(50);
+
+ GFXDECODE(config, "gfxdecode", m_palette, gfx_vic20_video_pak);
PALETTE(config, m_palette, palette_device::MONOCHROME);
H46505(config, m_crtc, XTAL(14'318'181) / 8);
@@ -112,7 +113,7 @@ MACHINE_CONFIG_START(vic20_video_pak_device::device_add_mconfig)
m_crtc->set_show_border_area(true);
m_crtc->set_char_width(8);
m_crtc->set_update_row_callback(FUNC(vic20_video_pak_device::crtc_update_row), this);
-MACHINE_CONFIG_END
+}
@@ -161,7 +162,7 @@ void vic20_video_pak_device::device_reset()
// vic20_cd_r - cartridge data read
//-------------------------------------------------
-uint8_t vic20_video_pak_device::vic20_cd_r(address_space &space, offs_t offset, uint8_t data, int ram1, int ram2, int ram3, int blk1, int blk2, int blk3, int blk5, int io2, int io3)
+uint8_t vic20_video_pak_device::vic20_cd_r(offs_t offset, uint8_t data, int ram1, int ram2, int ram3, int blk1, int blk2, int blk3, int blk5, int io2, int io3)
{
if (!m_ram_enable)
{
@@ -220,7 +221,7 @@ uint8_t vic20_video_pak_device::vic20_cd_r(address_space &space, offs_t offset,
{
if (offset == 0x1bf9)
{
- data = m_crtc->register_r(space, 0);
+ data = m_crtc->register_r();
}
}
@@ -232,7 +233,7 @@ uint8_t vic20_video_pak_device::vic20_cd_r(address_space &space, offs_t offset,
// vic20_cd_w - cartridge data write
//-------------------------------------------------
-void vic20_video_pak_device::vic20_cd_w(address_space &space, offs_t offset, uint8_t data, int ram1, int ram2, int ram3, int blk1, int blk2, int blk3, int blk5, int io2, int io3)
+void vic20_video_pak_device::vic20_cd_w(offs_t offset, uint8_t data, int ram1, int ram2, int ram3, int blk1, int blk2, int blk3, int blk5, int io2, int io3)
{
if (!m_ram_enable)
{
@@ -292,11 +293,11 @@ void vic20_video_pak_device::vic20_cd_w(address_space &space, offs_t offset, uin
switch (offset)
{
case 0x1bf8:
- m_crtc->address_w(space, 0, data);
+ m_crtc->address_w(data);
break;
case 0x1bf9:
- m_crtc->register_w(space, 0, data);
+ m_crtc->register_w(data);
break;
case 0x1bfc:
diff --git a/src/devices/bus/vic20/videopak.h b/src/devices/bus/vic20/videopak.h
index def121f2c55..084e57689dc 100644
--- a/src/devices/bus/vic20/videopak.h
+++ b/src/devices/bus/vic20/videopak.h
@@ -42,8 +42,8 @@ protected:
virtual void device_add_mconfig(machine_config &config) override;
// device_vic20_expansion_card_interface overrides
- virtual uint8_t vic20_cd_r(address_space &space, offs_t offset, uint8_t data, int ram1, int ram2, int ram3, int blk1, int blk2, int blk3, int blk5, int io2, int io3) override;
- virtual void vic20_cd_w(address_space &space, offs_t offset, uint8_t data, int ram1, int ram2, int ram3, int blk1, int blk2, int blk3, int blk5, int io2, int io3) override;
+ virtual uint8_t vic20_cd_r(offs_t offset, uint8_t data, int ram1, int ram2, int ram3, int blk1, int blk2, int blk3, int blk5, int io2, int io3) override;
+ virtual void vic20_cd_w(offs_t offset, uint8_t data, int ram1, int ram2, int ram3, int blk1, int blk2, int blk3, int blk5, int io2, int io3) override;
private:
MC6845_UPDATE_ROW( crtc_update_row );
diff --git a/src/devices/bus/vidbrain/exp.cpp b/src/devices/bus/vidbrain/exp.cpp
index c490c0605b2..808907678cc 100644
--- a/src/devices/bus/vidbrain/exp.cpp
+++ b/src/devices/bus/vidbrain/exp.cpp
@@ -153,13 +153,13 @@ std::string videobrain_expansion_slot_device::get_default_card_software(get_defa
// bo_r - cartridge data read
//-------------------------------------------------
-uint8_t videobrain_expansion_slot_device::bo_r(address_space &space, offs_t offset, int cs1, int cs2)
+uint8_t videobrain_expansion_slot_device::bo_r(offs_t offset, int cs1, int cs2)
{
uint8_t data = 0;
if (m_cart != nullptr)
{
- data = m_cart->videobrain_bo_r(space, offset, cs1, cs2);
+ data = m_cart->videobrain_bo_r(offset, cs1, cs2);
}
return data;
@@ -170,11 +170,11 @@ uint8_t videobrain_expansion_slot_device::bo_r(address_space &space, offs_t offs
// bo_w - cartridge data write
//-------------------------------------------------
-void videobrain_expansion_slot_device::bo_w(address_space &space, offs_t offset, uint8_t data, int cs1, int cs2)
+void videobrain_expansion_slot_device::bo_w(offs_t offset, uint8_t data, int cs1, int cs2)
{
if (m_cart != nullptr)
{
- m_cart->videobrain_bo_w(space, offset, data, cs1, cs2);
+ m_cart->videobrain_bo_w(offset, data, cs1, cs2);
}
}
diff --git a/src/devices/bus/vidbrain/exp.h b/src/devices/bus/vidbrain/exp.h
index fdb4b6a6ac7..e841df6c32c 100644
--- a/src/devices/bus/vidbrain/exp.h
+++ b/src/devices/bus/vidbrain/exp.h
@@ -49,21 +49,6 @@
#define VIDEOBRAIN_EXPANSION_SLOT_TAG "exp"
-
-//**************************************************************************
-// INTERFACE CONFIGURATION MACROS
-//**************************************************************************
-
-#define MCFG_VIDEOBRAIN_EXPANSION_SLOT_ADD(_tag, _slot_intf, _def_slot) \
- MCFG_DEVICE_ADD(_tag, VIDEOBRAIN_EXPANSION_SLOT, 0) \
- MCFG_DEVICE_SLOT_INTERFACE(_slot_intf, _def_slot, false)
-
-
-#define MCFG_VIDEOBRAIN_EXPANSION_SLOT_EXTRES_CALLBACK(_write) \
- downcast<videobrain_expansion_slot_device &>(*device).set_extres_wr_callback(DEVCB_##_write);
-
-
-
//**************************************************************************
// TYPE DEFINITIONS
//**************************************************************************
@@ -88,8 +73,8 @@ protected:
virtual uint8_t* videobrain_ram_pointer(running_machine &machine, size_t size);
// runtime
- virtual uint8_t videobrain_bo_r(address_space &space, offs_t offset, int cs1, int cs2) { return 0; }
- virtual void videobrain_bo_w(address_space &space, offs_t offset, uint8_t data, int cs1, int cs2) { }
+ virtual uint8_t videobrain_bo_r(offs_t offset, int cs1, int cs2) { return 0; }
+ virtual void videobrain_bo_w(offs_t offset, uint8_t data, int cs1, int cs2) { }
virtual void videobrain_extres_w() { }
videobrain_expansion_slot_device *m_slot;
@@ -110,20 +95,29 @@ class videobrain_expansion_slot_device : public device_t,
{
public:
// construction/destruction
- videobrain_expansion_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
-
- template <class Object> devcb_base &set_extres_wr_callback(Object &&cb) { return m_write_extres.set_callback(std::forward<Object>(cb)); }
+ template <typename T>
+ videobrain_expansion_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, T &&opts, char const* dflt)
+ : videobrain_expansion_slot_device(mconfig, tag, owner, 0)
+ {
+ option_reset();
+ opts(*this);
+ set_default_option(dflt);
+ set_fixed(false);
+ }
+ videobrain_expansion_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock = 0);
+
+ auto extres_wr_callback() { return m_write_extres.bind(); }
// computer interface
- uint8_t bo_r(address_space &space, offs_t offset, int cs1, int cs2);
- void bo_w(address_space &space, offs_t offset, uint8_t data, int cs1, int cs2);
-
- DECLARE_READ8_MEMBER( cs1_r ) { return bo_r(space, offset + 0x1000, 0, 1); }
- DECLARE_WRITE8_MEMBER( cs1_w ) { bo_w(space, offset + 0x1000, data, 0, 1); }
- DECLARE_READ8_MEMBER( cs2_r ) { return bo_r(space, offset + 0x1800, 1, 0); }
- DECLARE_WRITE8_MEMBER( cs2_w ) { bo_w(space, offset + 0x1800, data, 1, 0); }
- DECLARE_READ8_MEMBER( unmap_r ) { return bo_r(space, offset + 0x3000, 1, 0); }
- DECLARE_WRITE8_MEMBER( unmap_w ) { bo_w(space, offset + 0x3000, data, 1, 0); }
+ uint8_t bo_r(offs_t offset, int cs1, int cs2);
+ void bo_w(offs_t offset, uint8_t data, int cs1, int cs2);
+
+ uint8_t cs1_r(offs_t offset) { return bo_r(offset + 0x1000, 0, 1); }
+ void cs1_w(offs_t offset, uint8_t data) { bo_w(offset + 0x1000, data, 0, 1); }
+ uint8_t cs2_r(offs_t offset) { return bo_r(offset + 0x1800, 1, 0); }
+ void cs2_w(offs_t offset, uint8_t data) { bo_w(offset + 0x1800, data, 1, 0); }
+ uint8_t unmap_r(offs_t offset) { return bo_r(offset + 0x3000, 1, 0); }
+ void unmap_w(offs_t offset, uint8_t data) { bo_w(offset + 0x3000, data, 1, 0); }
// cartridge interface
DECLARE_WRITE_LINE_MEMBER( extres_w ) { m_write_extres(state); }
diff --git a/src/devices/bus/vidbrain/money_minder.cpp b/src/devices/bus/vidbrain/money_minder.cpp
index 81220a499b6..b0f4826ca5d 100644
--- a/src/devices/bus/vidbrain/money_minder.cpp
+++ b/src/devices/bus/vidbrain/money_minder.cpp
@@ -47,7 +47,7 @@ void videobrain_money_minder_cartridge_device::device_start()
// videobrain_cd_r - cartridge data read
//-------------------------------------------------
-uint8_t videobrain_money_minder_cartridge_device::videobrain_bo_r(address_space &space, offs_t offset, int cs1, int cs2)
+uint8_t videobrain_money_minder_cartridge_device::videobrain_bo_r(offs_t offset, int cs1, int cs2)
{
uint8_t data = 0;
@@ -68,7 +68,7 @@ uint8_t videobrain_money_minder_cartridge_device::videobrain_bo_r(address_space
// videobrain_bo_w - cartridge data write
//-------------------------------------------------
-void videobrain_money_minder_cartridge_device::videobrain_bo_w(address_space &space, offs_t offset, uint8_t data, int cs1, int cs2)
+void videobrain_money_minder_cartridge_device::videobrain_bo_w(offs_t offset, uint8_t data, int cs1, int cs2)
{
if (offset >= 0x3800)
{
diff --git a/src/devices/bus/vidbrain/money_minder.h b/src/devices/bus/vidbrain/money_minder.h
index 20ead06960e..23f219c4962 100644
--- a/src/devices/bus/vidbrain/money_minder.h
+++ b/src/devices/bus/vidbrain/money_minder.h
@@ -33,8 +33,8 @@ protected:
virtual void device_start() override;
// device_videobrain_expansion_card_interface overrides
- virtual uint8_t videobrain_bo_r(address_space &space, offs_t offset, int cs1, int cs2) override;
- virtual void videobrain_bo_w(address_space &space, offs_t offset, uint8_t data, int cs1, int cs2) override;
+ virtual uint8_t videobrain_bo_r(offs_t offset, int cs1, int cs2) override;
+ virtual void videobrain_bo_w(offs_t offset, uint8_t data, int cs1, int cs2) override;
};
diff --git a/src/devices/bus/vidbrain/std.cpp b/src/devices/bus/vidbrain/std.cpp
index 82a6fc2761e..55b5c3ce22d 100644
--- a/src/devices/bus/vidbrain/std.cpp
+++ b/src/devices/bus/vidbrain/std.cpp
@@ -47,7 +47,7 @@ void videobrain_standard_cartridge_device::device_start()
// videobrain_bo_r - cartridge data read
//-------------------------------------------------
-uint8_t videobrain_standard_cartridge_device::videobrain_bo_r(address_space &space, offs_t offset, int cs1, int cs2)
+uint8_t videobrain_standard_cartridge_device::videobrain_bo_r(offs_t offset, int cs1, int cs2)
{
uint8_t data = 0;
diff --git a/src/devices/bus/vidbrain/std.h b/src/devices/bus/vidbrain/std.h
index 2dbbde3231f..7939501909f 100644
--- a/src/devices/bus/vidbrain/std.h
+++ b/src/devices/bus/vidbrain/std.h
@@ -33,7 +33,7 @@ protected:
virtual void device_start() override;
// device_videobrain_expansion_card_interface overrides
- virtual uint8_t videobrain_bo_r(address_space &space, offs_t offset, int cs1, int cs2) override;
+ virtual uint8_t videobrain_bo_r(offs_t offset, int cs1, int cs2) override;
};
diff --git a/src/devices/bus/vidbrain/timeshare.cpp b/src/devices/bus/vidbrain/timeshare.cpp
index f4997a55ddc..709f16f5c74 100644
--- a/src/devices/bus/vidbrain/timeshare.cpp
+++ b/src/devices/bus/vidbrain/timeshare.cpp
@@ -47,7 +47,7 @@ void videobrain_timeshare_cartridge_device::device_start()
// videobrain_bo_r - cartridge data read
//-------------------------------------------------
-uint8_t videobrain_timeshare_cartridge_device::videobrain_bo_r(address_space &space, offs_t offset, int cs1, int cs2)
+uint8_t videobrain_timeshare_cartridge_device::videobrain_bo_r(offs_t offset, int cs1, int cs2)
{
uint8_t data = 0;
@@ -67,7 +67,7 @@ uint8_t videobrain_timeshare_cartridge_device::videobrain_bo_r(address_space &sp
// videobrain_bo_w - cartridge data write
//-------------------------------------------------
-void videobrain_timeshare_cartridge_device::videobrain_bo_w(address_space &space, offs_t offset, uint8_t data, int cs1, int cs2)
+void videobrain_timeshare_cartridge_device::videobrain_bo_w(offs_t offset, uint8_t data, int cs1, int cs2)
{
if (!cs2)
{
diff --git a/src/devices/bus/vidbrain/timeshare.h b/src/devices/bus/vidbrain/timeshare.h
index 971c5674320..7885772149d 100644
--- a/src/devices/bus/vidbrain/timeshare.h
+++ b/src/devices/bus/vidbrain/timeshare.h
@@ -33,8 +33,8 @@ protected:
virtual void device_start() override;
// device_videobrain_expansion_card_interface overrides
- virtual uint8_t videobrain_bo_r(address_space &space, offs_t offset, int cs1, int cs2) override;
- virtual void videobrain_bo_w(address_space &space, offs_t offset, uint8_t data, int cs1, int cs2) override;
+ virtual uint8_t videobrain_bo_r(offs_t offset, int cs1, int cs2) override;
+ virtual void videobrain_bo_w(offs_t offset, uint8_t data, int cs1, int cs2) override;
};
diff --git a/src/devices/bus/vip/byteio.h b/src/devices/bus/vip/byteio.h
index d2190214a2d..f2b12ca49f2 100644
--- a/src/devices/bus/vip/byteio.h
+++ b/src/devices/bus/vip/byteio.h
@@ -45,18 +45,6 @@
#define VIP_BYTEIO_PORT_TAG "byteio"
-
-//**************************************************************************
-// INTERFACE CONFIGURATION MACROS
-//**************************************************************************
-
-#define MCFG_VIP_BYTEIO_PORT_ADD(_tag, _slot_intf, _def_slot, _inst) \
- MCFG_DEVICE_ADD(_tag, VIP_BYTEIO_PORT, 0) \
- MCFG_DEVICE_SLOT_INTERFACE(_slot_intf, _def_slot, false) \
- downcast<vip_byteio_port_device *>(device)->set_inst_callback(DEVCB_##_inst);
-
-
-
//**************************************************************************
// TYPE DEFINITIONS
//**************************************************************************
@@ -70,9 +58,19 @@ class vip_byteio_port_device : public device_t,
{
public:
// construction/destruction
- vip_byteio_port_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
-
- template <class Object> void set_inst_callback(Object &&inst) { m_write_inst.set_callback(std::forward<Object>(inst)); }
+ template <typename T>
+ vip_byteio_port_device(const machine_config &mconfig, const char *tag, device_t *owner, T &&opts, const char *dflt)
+ : vip_byteio_port_device(mconfig, tag, owner, 0)
+ {
+ option_reset();
+ opts(*this);
+ set_default_option(dflt);
+ set_fixed(false);
+ }
+
+ vip_byteio_port_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock = 0);
+
+ auto inst_callback() { return m_write_inst.bind(); }
// computer interface
uint8_t in_r();
diff --git a/src/devices/bus/vip/exp.cpp b/src/devices/bus/vip/exp.cpp
index 70467c57839..132a4d753ef 100644
--- a/src/devices/bus/vip/exp.cpp
+++ b/src/devices/bus/vip/exp.cpp
@@ -80,13 +80,13 @@ void vip_expansion_slot_device::device_start()
// program_r - program read
//-------------------------------------------------
-uint8_t vip_expansion_slot_device::program_r(address_space &space, offs_t offset, int cs, int cdef, int *minh)
+uint8_t vip_expansion_slot_device::program_r(offs_t offset, int cs, int cdef, int *minh)
{
uint8_t data = 0;
if (m_card != nullptr)
{
- data = m_card->vip_program_r(space, offset, cs, cdef, minh);
+ data = m_card->vip_program_r(offset, cs, cdef, minh);
}
return data;
@@ -97,11 +97,11 @@ uint8_t vip_expansion_slot_device::program_r(address_space &space, offs_t offset
// program_w - program write
//-------------------------------------------------
-void vip_expansion_slot_device::program_w(address_space &space, offs_t offset, uint8_t data, int cdef, int *minh)
+void vip_expansion_slot_device::program_w(offs_t offset, uint8_t data, int cdef, int *minh)
{
if (m_card != nullptr)
{
- m_card->vip_program_w(space, offset, data, cdef, minh);
+ m_card->vip_program_w(offset, data, cdef, minh);
}
}
@@ -110,13 +110,13 @@ void vip_expansion_slot_device::program_w(address_space &space, offs_t offset, u
// io_r - io read
//-------------------------------------------------
-uint8_t vip_expansion_slot_device::io_r(address_space &space, offs_t offset)
+uint8_t vip_expansion_slot_device::io_r(offs_t offset)
{
uint8_t data = 0;
if (m_card != nullptr)
{
- data = m_card->vip_io_r(space, offset);
+ data = m_card->vip_io_r(offset);
}
return data;
@@ -127,11 +127,11 @@ uint8_t vip_expansion_slot_device::io_r(address_space &space, offs_t offset)
// io_w - io write
//-------------------------------------------------
-void vip_expansion_slot_device::io_w(address_space &space, offs_t offset, uint8_t data)
+void vip_expansion_slot_device::io_w(offs_t offset, uint8_t data)
{
if (m_card != nullptr)
{
- m_card->vip_io_w(space, offset, data);
+ m_card->vip_io_w(offset, data);
}
}
@@ -140,13 +140,13 @@ void vip_expansion_slot_device::io_w(address_space &space, offs_t offset, uint8_
// dma_r - dma read
//-------------------------------------------------
-READ8_MEMBER(vip_expansion_slot_device::dma_r)
+uint8_t vip_expansion_slot_device::dma_r(offs_t offset)
{
uint8_t data = 0;
if (m_card != nullptr)
{
- data = m_card->vip_dma_r(space, offset);
+ data = m_card->vip_dma_r(offset);
}
return data;
@@ -157,11 +157,11 @@ READ8_MEMBER(vip_expansion_slot_device::dma_r)
// dma_w - dma write
//-------------------------------------------------
-WRITE8_MEMBER(vip_expansion_slot_device::dma_w)
+void vip_expansion_slot_device::dma_w(offs_t offset, uint8_t data)
{
if (m_card != nullptr)
{
- m_card->vip_dma_w(space, offset, data);
+ m_card->vip_dma_w(offset, data);
}
}
@@ -206,7 +206,7 @@ READ_LINE_MEMBER(vip_expansion_slot_device::ef4_r)
return state;
}
-WRITE8_MEMBER(vip_expansion_slot_device::sc_w)
+void vip_expansion_slot_device::sc_w(offs_t offset, uint8_t data)
{
if (m_card != nullptr)
m_card->vip_sc_w(offset, data);
diff --git a/src/devices/bus/vip/exp.h b/src/devices/bus/vip/exp.h
index dfca23fc038..9073dafee0d 100644
--- a/src/devices/bus/vip/exp.h
+++ b/src/devices/bus/vip/exp.h
@@ -46,27 +46,6 @@
#define VIP_EXPANSION_SLOT_TAG "exp"
-
-//**************************************************************************
-// INTERFACE CONFIGURATION MACROS
-//**************************************************************************
-
-#define MCFG_VIP_EXPANSION_SLOT_ADD(_tag, _clock, _slot_intf, _def_slot) \
- MCFG_DEVICE_ADD(_tag, VIP_EXPANSION_SLOT, _clock) \
- MCFG_DEVICE_SLOT_INTERFACE(_slot_intf, _def_slot, false)
-
-
-#define MCFG_VIP_EXPANSION_SLOT_INT_CALLBACK(_write) \
- downcast<vip_expansion_slot_device &>(*device).set_int_wr_callback(DEVCB_##_write);
-
-#define MCFG_VIP_EXPANSION_SLOT_DMA_OUT_CALLBACK(_write) \
- downcast<vip_expansion_slot_device &>(*device).set_dma_out_wr_callback(DEVCB_##_write);
-
-#define MCFG_VIP_EXPANSION_SLOT_DMA_IN_CALLBACK(_write) \
- downcast<vip_expansion_slot_device &>(*device).set_dma_in_wr_callback(DEVCB_##_write);
-
-
-
//**************************************************************************
// TYPE DEFINITIONS
//**************************************************************************
@@ -80,24 +59,33 @@ class vip_expansion_slot_device : public device_t,
{
public:
// construction/destruction
+ template <typename T>
+ vip_expansion_slot_device(machine_config const &mconfig, char const *tag, device_t *owner, uint32_t clock, T &&opts, char const *dflt)
+ : vip_expansion_slot_device(mconfig, tag, owner, clock)
+ {
+ option_reset();
+ opts(*this);
+ set_default_option(dflt);
+ set_fixed(false);
+ }
vip_expansion_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- template <class Object> devcb_base &set_int_wr_callback(Object &&cb) { return m_write_int.set_callback(std::forward<Object>(cb)); }
- template <class Object> devcb_base &set_dma_out_wr_callback(Object &&cb) { return m_write_dma_out.set_callback(std::forward<Object>(cb)); }
- template <class Object> devcb_base &set_dma_in_wr_callback(Object &&cb) { return m_write_dma_in.set_callback(std::forward<Object>(cb)); }
+ auto int_wr_callback() { return m_write_int.bind(); }
+ auto dma_out_wr_callback() { return m_write_dma_out.bind(); }
+ auto dma_in_wr_callback() { return m_write_dma_in.bind(); }
// computer interface
- uint8_t program_r(address_space &space, offs_t offset, int cs, int cdef, int *minh);
- void program_w(address_space &space, offs_t offset, uint8_t data, int cdef, int *minh);
- uint8_t io_r(address_space &space, offs_t offset);
- void io_w(address_space &space, offs_t offset, uint8_t data);
- DECLARE_READ8_MEMBER(dma_r);
- DECLARE_WRITE8_MEMBER(dma_w);
+ uint8_t program_r(offs_t offset, int cs, int cdef, int *minh);
+ void program_w(offs_t offset, uint8_t data, int cdef, int *minh);
+ uint8_t io_r(offs_t offset);
+ void io_w(offs_t offset, uint8_t data);
+ uint8_t dma_r(offs_t offset);
+ void dma_w(offs_t offset, uint8_t data);
uint32_t screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
DECLARE_READ_LINE_MEMBER(ef1_r);
DECLARE_READ_LINE_MEMBER(ef3_r);
DECLARE_READ_LINE_MEMBER(ef4_r);
- DECLARE_WRITE8_MEMBER(sc_w);
+ void sc_w(offs_t offset, uint8_t data);
DECLARE_WRITE_LINE_MEMBER(q_w);
DECLARE_WRITE_LINE_MEMBER(tpb_w);
DECLARE_WRITE_LINE_MEMBER(run_w);
@@ -130,14 +118,14 @@ protected:
device_vip_expansion_card_interface(const machine_config &mconfig, device_t &device);
// runtime
- virtual uint8_t vip_program_r(address_space &space, offs_t offset, int cs, int cdef, int *minh) { return 0xff; }
- virtual void vip_program_w(address_space &space, offs_t offset, uint8_t data, int cdef, int *minh) { }
+ virtual uint8_t vip_program_r(offs_t offset, int cs, int cdef, int *minh) { return 0xff; }
+ virtual void vip_program_w(offs_t offset, uint8_t data, int cdef, int *minh) { }
- virtual uint8_t vip_io_r(address_space &space, offs_t offset) { return 0xff; }
- virtual void vip_io_w(address_space &space, offs_t offset, uint8_t data) { }
+ virtual uint8_t vip_io_r(offs_t offset) { return 0xff; }
+ virtual void vip_io_w(offs_t offset, uint8_t data) { }
- virtual uint8_t vip_dma_r(address_space &space, offs_t offset) { return 0xff; }
- virtual void vip_dma_w(address_space &space, offs_t offset, uint8_t data) { }
+ virtual uint8_t vip_dma_r(offs_t offset) { return 0xff; }
+ virtual void vip_dma_w(offs_t offset, uint8_t data) { }
virtual uint32_t vip_screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect) { return 0; }
diff --git a/src/devices/bus/vip/vp550.cpp b/src/devices/bus/vip/vp550.cpp
index a8285c53adc..6d1e36f57d7 100644
--- a/src/devices/bus/vip/vp550.cpp
+++ b/src/devices/bus/vip/vp550.cpp
@@ -47,7 +47,7 @@ DEFINE_DEVICE_TYPE(VP550, vp550_device, "vp550", "VP-550 Super Sound")
//-------------------------------------------------
-// MACHINE_CONFIG_START( vp550 )
+// machine_config( vp550 )
//-------------------------------------------------
void vp550_device::device_add_mconfig(machine_config &config)
@@ -112,7 +112,7 @@ void vp550_device::device_timer(emu_timer &timer, device_timer_id id, int param,
// vip_program_w - program write
//-------------------------------------------------
-void vp550_device::vip_program_w(address_space &space, offs_t offset, uint8_t data, int cdef, int *minh)
+void vp550_device::vip_program_w(offs_t offset, uint8_t data, int cdef, int *minh)
{
if (BIT(offset, 15))
{
@@ -122,14 +122,14 @@ void vp550_device::vip_program_w(address_space &space, offs_t offset, uint8_t da
{
case 1: m_pfg_a->write_str(data); break;
case 2: m_pfg_b->write_str(data); break;
- case 3: octave_w(space, offset, data); break;
+ case 3: octave_w(data); break;
}
switch ((offset >> 4) & 0x03)
{
- case 1: vlmna_w(space, offset, data); break;
- case 2: vlmnb_w(space, offset, data); break;
- case 3: sync_w(space, offset, data); break;
+ case 1: vlmna_w(data); break;
+ case 2: vlmnb_w(data); break;
+ case 3: sync_w(data); break;
}
}
}
@@ -179,7 +179,7 @@ void vp550_device::vip_run_w(int state)
// octave_w - octave select write
//-------------------------------------------------
-WRITE8_MEMBER( vp550_device::octave_w )
+void vp550_device::octave_w(uint8_t data)
{
int channel = (data >> 2) & 0x03;
int clock2 = 0;
@@ -209,7 +209,7 @@ WRITE8_MEMBER( vp550_device::octave_w )
// vlmna_w - channel A amplitude write
//-------------------------------------------------
-WRITE8_MEMBER( vp550_device::vlmna_w )
+void vp550_device::vlmna_w(uint8_t data)
{
if (LOG) logerror("VP550 '%s' A Volume: %u\n", tag(), data & 0x0f);
@@ -223,7 +223,7 @@ WRITE8_MEMBER( vp550_device::vlmna_w )
// vlmnb_w - channel B amplitude write
//-------------------------------------------------
-WRITE8_MEMBER( vp550_device::vlmnb_w )
+void vp550_device::vlmnb_w(uint8_t data)
{
if (LOG) logerror("VP550 '%s' B Volume: %u\n", tag(), data & 0x0f);
@@ -237,7 +237,7 @@ WRITE8_MEMBER( vp550_device::vlmnb_w )
// sync_w - interrupt enable write
//-------------------------------------------------
-WRITE8_MEMBER( vp550_device::sync_w )
+void vp550_device::sync_w(uint8_t data)
{
if (LOG) logerror("VP550 '%s' Interrupt Enable: %u\n", tag(), BIT(data, 0));
diff --git a/src/devices/bus/vip/vp550.h b/src/devices/bus/vip/vp550.h
index 20b2cf8e8de..d881063ba2c 100644
--- a/src/devices/bus/vip/vp550.h
+++ b/src/devices/bus/vip/vp550.h
@@ -36,16 +36,16 @@ protected:
virtual void device_add_mconfig(machine_config &config) override;
// device_vip_expansion_card_interface overrides
- virtual void vip_program_w(address_space &space, offs_t offset, uint8_t data, int cdef, int *minh) override;
+ virtual void vip_program_w(offs_t offset, uint8_t data, int cdef, int *minh) override;
virtual void vip_sc_w(int n, int sc) override;
virtual void vip_q_w(int state) override;
virtual void vip_run_w(int state) override;
private:
- DECLARE_WRITE8_MEMBER( octave_w );
- DECLARE_WRITE8_MEMBER( vlmna_w );
- DECLARE_WRITE8_MEMBER( vlmnb_w );
- DECLARE_WRITE8_MEMBER( sync_w );
+ void octave_w(uint8_t data);
+ void vlmna_w(uint8_t data);
+ void vlmnb_w(uint8_t data);
+ void sync_w(uint8_t data);
required_device<cdp1863_device> m_pfg_a;
required_device<cdp1863_device> m_pfg_b;
diff --git a/src/devices/bus/vip/vp570.cpp b/src/devices/bus/vip/vp570.cpp
index e01d427649b..f9473bd2f87 100644
--- a/src/devices/bus/vip/vp570.cpp
+++ b/src/devices/bus/vip/vp570.cpp
@@ -84,7 +84,7 @@ void vp570_device::device_start()
// vip_program_r - program read
//-------------------------------------------------
-uint8_t vp570_device::vip_program_r(address_space &space, offs_t offset, int cs, int cdef, int *minh)
+uint8_t vp570_device::vip_program_r(offs_t offset, int cs, int cdef, int *minh)
{
uint8_t data = 0xff;
@@ -105,7 +105,7 @@ uint8_t vp570_device::vip_program_r(address_space &space, offs_t offset, int cs,
// vip_program_w - program write
//-------------------------------------------------
-void vp570_device::vip_program_w(address_space &space, offs_t offset, uint8_t data, int cdef, int *minh)
+void vp570_device::vip_program_w(offs_t offset, uint8_t data, int cdef, int *minh)
{
offs_t base = m_base->read() << 12;
diff --git a/src/devices/bus/vip/vp570.h b/src/devices/bus/vip/vp570.h
index 004be88a8bf..04ad752d804 100644
--- a/src/devices/bus/vip/vp570.h
+++ b/src/devices/bus/vip/vp570.h
@@ -36,8 +36,8 @@ protected:
virtual void device_start() override;
// device_vip_expansion_card_interface overrides
- virtual uint8_t vip_program_r(address_space &space, offs_t offset, int cs, int cdef, int *minh) override;
- virtual void vip_program_w(address_space &space, offs_t offset, uint8_t data, int cdef, int *minh) override;
+ virtual uint8_t vip_program_r(offs_t offset, int cs, int cdef, int *minh) override;
+ virtual void vip_program_w(offs_t offset, uint8_t data, int cdef, int *minh) override;
private:
optional_shared_ptr<uint8_t> m_ram;
diff --git a/src/devices/bus/vip/vp575.cpp b/src/devices/bus/vip/vp575.cpp
index c69ccc5bade..685c05be7c6 100644
--- a/src/devices/bus/vip/vp575.cpp
+++ b/src/devices/bus/vip/vp575.cpp
@@ -42,35 +42,36 @@ void vp575_device::update_interrupts()
//-------------------------------------------------
-// MACHINE_CONFIG_START( vp575 )
+// machine_config( vp575 )
//-------------------------------------------------
-MACHINE_CONFIG_START(vp575_device::device_add_mconfig)
- MCFG_VIP_EXPANSION_SLOT_ADD("exp1", XTAL(3'521'280)/2, vip_expansion_cards, nullptr)
- MCFG_VIP_EXPANSION_SLOT_INT_CALLBACK(WRITELINE(*this, vp575_device, exp1_int_w))
- MCFG_VIP_EXPANSION_SLOT_DMA_OUT_CALLBACK(WRITELINE(*this, vp575_device, exp1_dma_out_w))
- MCFG_VIP_EXPANSION_SLOT_DMA_IN_CALLBACK(WRITELINE(*this, vp575_device, exp1_dma_in_w))
-
- MCFG_VIP_EXPANSION_SLOT_ADD("exp2", XTAL(3'521'280)/2, vip_expansion_cards, nullptr)
- MCFG_VIP_EXPANSION_SLOT_INT_CALLBACK(WRITELINE(*this, vp575_device, exp2_int_w))
- MCFG_VIP_EXPANSION_SLOT_DMA_OUT_CALLBACK(WRITELINE(*this, vp575_device, exp2_dma_out_w))
- MCFG_VIP_EXPANSION_SLOT_DMA_IN_CALLBACK(WRITELINE(*this, vp575_device, exp2_dma_in_w))
-
- MCFG_VIP_EXPANSION_SLOT_ADD("exp3", XTAL(3'521'280)/2, vip_expansion_cards, nullptr)
- MCFG_VIP_EXPANSION_SLOT_INT_CALLBACK(WRITELINE(*this, vp575_device, exp3_int_w))
- MCFG_VIP_EXPANSION_SLOT_DMA_OUT_CALLBACK(WRITELINE(*this, vp575_device, exp3_dma_out_w))
- MCFG_VIP_EXPANSION_SLOT_DMA_IN_CALLBACK(WRITELINE(*this, vp575_device, exp3_dma_in_w))
-
- MCFG_VIP_EXPANSION_SLOT_ADD("exp4", XTAL(3'521'280)/2, vip_expansion_cards, nullptr)
- MCFG_VIP_EXPANSION_SLOT_INT_CALLBACK(WRITELINE(*this, vp575_device, exp4_int_w))
- MCFG_VIP_EXPANSION_SLOT_DMA_OUT_CALLBACK(WRITELINE(*this, vp575_device, exp4_dma_out_w))
- MCFG_VIP_EXPANSION_SLOT_DMA_IN_CALLBACK(WRITELINE(*this, vp575_device, exp4_dma_in_w))
-
- MCFG_VIP_EXPANSION_SLOT_ADD("exp5", XTAL(3'521'280)/2, vip_expansion_cards, nullptr)
- MCFG_VIP_EXPANSION_SLOT_INT_CALLBACK(WRITELINE(*this, vp575_device, exp5_int_w))
- MCFG_VIP_EXPANSION_SLOT_DMA_OUT_CALLBACK(WRITELINE(*this, vp575_device, exp5_dma_out_w))
- MCFG_VIP_EXPANSION_SLOT_DMA_IN_CALLBACK(WRITELINE(*this, vp575_device, exp5_dma_in_w))
-MACHINE_CONFIG_END
+void vp575_device::device_add_mconfig(machine_config &config)
+{
+ VIP_EXPANSION_SLOT(config, m_expansion_slot[0], XTAL(3'521'280)/2, vip_expansion_cards, nullptr);
+ m_expansion_slot[0]->int_wr_callback().set(FUNC(vp575_device::exp1_int_w));
+ m_expansion_slot[0]->dma_out_wr_callback().set(FUNC(vp575_device::exp1_dma_out_w));
+ m_expansion_slot[0]->dma_in_wr_callback().set(FUNC(vp575_device::exp1_dma_in_w));
+
+ VIP_EXPANSION_SLOT(config, m_expansion_slot[1], XTAL(3'521'280)/2, vip_expansion_cards, nullptr);
+ m_expansion_slot[1]->int_wr_callback().set(FUNC(vp575_device::exp2_int_w));
+ m_expansion_slot[1]->dma_out_wr_callback().set(FUNC(vp575_device::exp2_dma_out_w));
+ m_expansion_slot[1]->dma_in_wr_callback().set(FUNC(vp575_device::exp2_dma_in_w));
+
+ VIP_EXPANSION_SLOT(config, m_expansion_slot[2], XTAL(3'521'280)/2, vip_expansion_cards, nullptr);
+ m_expansion_slot[2]->int_wr_callback().set(FUNC(vp575_device::exp3_int_w));
+ m_expansion_slot[2]->dma_out_wr_callback().set(FUNC(vp575_device::exp3_dma_out_w));
+ m_expansion_slot[2]->dma_in_wr_callback().set(FUNC(vp575_device::exp3_dma_in_w));
+
+ VIP_EXPANSION_SLOT(config, m_expansion_slot[3], XTAL(3'521'280)/2, vip_expansion_cards, nullptr);
+ m_expansion_slot[3]->int_wr_callback().set(FUNC(vp575_device::exp4_int_w));
+ m_expansion_slot[3]->dma_out_wr_callback().set(FUNC(vp575_device::exp4_dma_out_w));
+ m_expansion_slot[3]->dma_in_wr_callback().set(FUNC(vp575_device::exp4_dma_in_w));
+
+ VIP_EXPANSION_SLOT(config, m_expansion_slot[4], XTAL(3'521'280)/2, vip_expansion_cards, nullptr);
+ m_expansion_slot[4]->int_wr_callback().set(FUNC(vp575_device::exp5_int_w));
+ m_expansion_slot[4]->dma_out_wr_callback().set(FUNC(vp575_device::exp5_dma_out_w));
+ m_expansion_slot[4]->dma_in_wr_callback().set(FUNC(vp575_device::exp5_dma_in_w));
+}
@@ -109,13 +110,13 @@ void vp575_device::device_start()
// vip_program_r - program read
//-------------------------------------------------
-uint8_t vp575_device::vip_program_r(address_space &space, offs_t offset, int cs, int cdef, int *minh)
+uint8_t vp575_device::vip_program_r(offs_t offset, int cs, int cdef, int *minh)
{
uint8_t data = 0xff;
for (auto & elem : m_expansion_slot)
{
- data &= elem->program_r(space, offset, cs, cdef, minh);
+ data &= elem->program_r(offset, cs, cdef, minh);
}
return data;
@@ -126,11 +127,11 @@ uint8_t vp575_device::vip_program_r(address_space &space, offs_t offset, int cs,
// vip_program_w - program write
//-------------------------------------------------
-void vp575_device::vip_program_w(address_space &space, offs_t offset, uint8_t data, int cdef, int *minh)
+void vp575_device::vip_program_w(offs_t offset, uint8_t data, int cdef, int *minh)
{
for (auto & elem : m_expansion_slot)
{
- elem->program_w(space, offset, data, cdef, minh);
+ elem->program_w(offset, data, cdef, minh);
}
}
@@ -139,13 +140,13 @@ void vp575_device::vip_program_w(address_space &space, offs_t offset, uint8_t da
// vip_io_r - I/O read
//-------------------------------------------------
-uint8_t vp575_device::vip_io_r(address_space &space, offs_t offset)
+uint8_t vp575_device::vip_io_r(offs_t offset)
{
uint8_t data = 0xff;
for (auto & elem : m_expansion_slot)
{
- data &= elem->io_r(space, offset);
+ data &= elem->io_r(offset);
}
return data;
@@ -156,11 +157,11 @@ uint8_t vp575_device::vip_io_r(address_space &space, offs_t offset)
// vip_io_w - I/O write
//-------------------------------------------------
-void vp575_device::vip_io_w(address_space &space, offs_t offset, uint8_t data)
+void vp575_device::vip_io_w(offs_t offset, uint8_t data)
{
for (auto & elem : m_expansion_slot)
{
- elem->io_w(space, offset, data);
+ elem->io_w(offset, data);
}
}
@@ -169,13 +170,13 @@ void vp575_device::vip_io_w(address_space &space, offs_t offset, uint8_t data)
// vip_dma_r - DMA read
//-------------------------------------------------
-uint8_t vp575_device::vip_dma_r(address_space &space, offs_t offset)
+uint8_t vp575_device::vip_dma_r(offs_t offset)
{
uint8_t data = 0xff;
for (auto & elem : m_expansion_slot)
{
- data &= elem->dma_r(space, offset);
+ data &= elem->dma_r(offset);
}
return data;
@@ -186,11 +187,11 @@ uint8_t vp575_device::vip_dma_r(address_space &space, offs_t offset)
// vip_dma_w - DMA write
//-------------------------------------------------
-void vp575_device::vip_dma_w(address_space &space, offs_t offset, uint8_t data)
+void vp575_device::vip_dma_w(offs_t offset, uint8_t data)
{
for (auto & elem : m_expansion_slot)
{
- elem->dma_w(space, offset, data);
+ elem->dma_w(offset, data);
}
}
@@ -269,10 +270,9 @@ int vp575_device::vip_ef4_r()
void vp575_device::vip_sc_w(int n, int sc)
{
- address_space &space = machine().dummy_space();
for (auto & elem : m_expansion_slot)
{
- elem->sc_w(space, n, sc);
+ elem->sc_w(n, sc);
}
}
diff --git a/src/devices/bus/vip/vp575.h b/src/devices/bus/vip/vp575.h
index 41a18053276..fb5c22f5628 100644
--- a/src/devices/bus/vip/vp575.h
+++ b/src/devices/bus/vip/vp575.h
@@ -34,12 +34,12 @@ protected:
virtual void device_add_mconfig(machine_config &config) override;
// device_vip_expansion_card_interface overrides
- virtual uint8_t vip_program_r(address_space &space, offs_t offset, int cs, int cdef, int *minh) override;
- virtual void vip_program_w(address_space &space, offs_t offset, uint8_t data, int cdef, int *minh) override;
- virtual uint8_t vip_io_r(address_space &space, offs_t offset) override;
- virtual void vip_io_w(address_space &space, offs_t offset, uint8_t data) override;
- virtual uint8_t vip_dma_r(address_space &space, offs_t offset) override;
- virtual void vip_dma_w(address_space &space, offs_t offset, uint8_t data) override;
+ virtual uint8_t vip_program_r(offs_t offset, int cs, int cdef, int *minh) override;
+ virtual void vip_program_w(offs_t offset, uint8_t data, int cdef, int *minh) override;
+ virtual uint8_t vip_io_r(offs_t offset) override;
+ virtual void vip_io_w(offs_t offset, uint8_t data) override;
+ virtual uint8_t vip_dma_r(offs_t offset) override;
+ virtual void vip_dma_w(offs_t offset, uint8_t data) override;
virtual uint32_t vip_screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect) override;
virtual int vip_ef1_r() override;
virtual int vip_ef3_r() override;
diff --git a/src/devices/bus/vip/vp585.cpp b/src/devices/bus/vip/vp585.cpp
index 47a1115097a..2112637ae6b 100644
--- a/src/devices/bus/vip/vp585.cpp
+++ b/src/devices/bus/vip/vp585.cpp
@@ -105,7 +105,7 @@ void vp585_device::device_start()
// vip_io_w - I/O write
//-------------------------------------------------
-void vp585_device::vip_io_w(address_space &space, offs_t offset, uint8_t data)
+void vp585_device::vip_io_w(offs_t offset, uint8_t data)
{
if (offset == 0x02)
{
diff --git a/src/devices/bus/vip/vp585.h b/src/devices/bus/vip/vp585.h
index a3511def5d0..f32bf055e91 100644
--- a/src/devices/bus/vip/vp585.h
+++ b/src/devices/bus/vip/vp585.h
@@ -36,7 +36,7 @@ protected:
virtual void device_start() override;
// device_vip_expansion_card_interface overrides
- virtual void vip_io_w(address_space &space, offs_t offset, uint8_t data) override;
+ virtual void vip_io_w(offs_t offset, uint8_t data) override;
virtual int vip_ef3_r() override;
virtual int vip_ef4_r() override;
diff --git a/src/devices/bus/vip/vp590.cpp b/src/devices/bus/vip/vp590.cpp
index 0f7599f6f99..3fd9185c5d1 100644
--- a/src/devices/bus/vip/vp590.cpp
+++ b/src/devices/bus/vip/vp590.cpp
@@ -50,10 +50,11 @@ READ_LINE_MEMBER( vp590_device::gd_r )
//-------------------------------------------------
-// MACHINE_CONFIG_START( vp590 )
+// machine_config( vp590 )
//-------------------------------------------------
-MACHINE_CONFIG_START(vp590_device::device_add_mconfig)
+void vp590_device::device_add_mconfig(machine_config &config)
+{
CDP1862(config, m_cgc, 7.15909_MHz_XTAL);
m_cgc->rdata_cb().set(FUNC(vp590_device::rd_r));
m_cgc->bdata_cb().set(FUNC(vp590_device::bd_r));
@@ -61,7 +62,7 @@ MACHINE_CONFIG_START(vp590_device::device_add_mconfig)
m_cgc->set_luminance(RES_R(510), RES_R(360), RES_K(1), RES_K(1.5)); // R3, R4, R5, R6
m_cgc->set_chrominance(RES_K(3.9), RES_K(10), RES_K(2), RES_K(3.3)); // R7, R8, R9, R10
m_cgc->set_screen(SCREEN_TAG);
-MACHINE_CONFIG_END
+}
//-------------------------------------------------
@@ -158,7 +159,7 @@ void vp590_device::device_start()
// vip_program_w - program write
//-------------------------------------------------
-void vp590_device::vip_program_w(address_space &space, offs_t offset, uint8_t data, int cdef, int *minh)
+void vp590_device::vip_program_w(offs_t offset, uint8_t data, int cdef, int *minh)
{
if (offset >= 0xc000 && offset < 0xe000)
{
@@ -184,7 +185,7 @@ void vp590_device::vip_program_w(address_space &space, offs_t offset, uint8_t da
// vip_io_w - I/O write
//-------------------------------------------------
-void vp590_device::vip_io_w(address_space &space, offs_t offset, uint8_t data)
+void vp590_device::vip_io_w(offs_t offset, uint8_t data)
{
switch (offset)
{
@@ -204,7 +205,7 @@ void vp590_device::vip_io_w(address_space &space, offs_t offset, uint8_t data)
// vip_dma_w - DMA write
//-------------------------------------------------
-void vp590_device::vip_dma_w(address_space &space, offs_t offset, uint8_t data)
+void vp590_device::vip_dma_w(offs_t offset, uint8_t data)
{
uint8_t mask = 0xff;
@@ -216,7 +217,7 @@ void vp590_device::vip_dma_w(address_space &space, offs_t offset, uint8_t data)
m_color = m_color_ram[offset & mask];
- m_cgc->dma_w(space, offset, data);
+ m_cgc->dma_w(data);
}
diff --git a/src/devices/bus/vip/vp590.h b/src/devices/bus/vip/vp590.h
index 2dfdece5ab7..230b7d8d02d 100644
--- a/src/devices/bus/vip/vp590.h
+++ b/src/devices/bus/vip/vp590.h
@@ -37,9 +37,9 @@ protected:
virtual ioport_constructor device_input_ports() const override;
// device_vip_expansion_card_interface overrides
- virtual void vip_program_w(address_space &space, offs_t offset, uint8_t data, int cdef, int *minh) override;
- virtual void vip_io_w(address_space &space, offs_t offset, uint8_t data) override;
- virtual void vip_dma_w(address_space &space, offs_t offset, uint8_t data) override;
+ virtual void vip_program_w(offs_t offset, uint8_t data, int cdef, int *minh) override;
+ virtual void vip_io_w(offs_t offset, uint8_t data) override;
+ virtual void vip_dma_w(offs_t offset, uint8_t data) override;
virtual uint32_t vip_screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect) override;
virtual int vip_ef3_r() override;
virtual int vip_ef4_r() override;
diff --git a/src/devices/bus/vip/vp595.cpp b/src/devices/bus/vip/vp595.cpp
index 0d8e2306182..1dab7f4a49f 100644
--- a/src/devices/bus/vip/vp595.cpp
+++ b/src/devices/bus/vip/vp595.cpp
@@ -30,7 +30,7 @@ DEFINE_DEVICE_TYPE(VP595, vp595_device, "vp595", "VP-595 Simple Sound")
//-------------------------------------------------
-// MACHINE_CONFIG_START( vp595 )
+// machine_config( vp595 )
//-------------------------------------------------
void vp595_device::device_add_mconfig(machine_config &config)
@@ -73,7 +73,7 @@ void vp595_device::device_start()
// vip_io_w - I/O write
//-------------------------------------------------
-void vp595_device::vip_io_w(address_space &space, offs_t offset, uint8_t data)
+void vp595_device::vip_io_w(offs_t offset, uint8_t data)
{
if (offset == 0x03)
{
diff --git a/src/devices/bus/vip/vp595.h b/src/devices/bus/vip/vp595.h
index 9de9c8a6071..5c98b33fe7c 100644
--- a/src/devices/bus/vip/vp595.h
+++ b/src/devices/bus/vip/vp595.h
@@ -35,7 +35,7 @@ protected:
virtual void device_add_mconfig(machine_config &config) override;
// device_vip_expansion_card_interface overrides
- virtual void vip_io_w(address_space &space, offs_t offset, uint8_t data) override;
+ virtual void vip_io_w(offs_t offset, uint8_t data) override;
virtual void vip_q_w(int state) override;
private:
diff --git a/src/devices/bus/vip/vp620.cpp b/src/devices/bus/vip/vp620.cpp
index 643a8856481..ba6a938f660 100644
--- a/src/devices/bus/vip/vp620.cpp
+++ b/src/devices/bus/vip/vp620.cpp
@@ -33,7 +33,7 @@ void vp620_device::kb_w(uint8_t data)
}
//-------------------------------------------------
-// MACHINE_CONFIG_START( vp620 )
+// machine_config( vp620 )
//-------------------------------------------------
void vp620_device::device_add_mconfig(machine_config &config)
diff --git a/src/devices/bus/vip/vp700.cpp b/src/devices/bus/vip/vp700.cpp
index 4b7dbab2839..f64574a23fc 100644
--- a/src/devices/bus/vip/vp700.cpp
+++ b/src/devices/bus/vip/vp700.cpp
@@ -67,7 +67,7 @@ void vp700_device::device_start()
// vip_program_r - program read
//-------------------------------------------------
-uint8_t vp700_device::vip_program_r(address_space &space, offs_t offset, int cs, int cdef, int *minh)
+uint8_t vp700_device::vip_program_r(offs_t offset, int cs, int cdef, int *minh)
{
uint8_t data = 0xff;
diff --git a/src/devices/bus/vip/vp700.h b/src/devices/bus/vip/vp700.h
index 16e7cd2f78e..4927005742e 100644
--- a/src/devices/bus/vip/vp700.h
+++ b/src/devices/bus/vip/vp700.h
@@ -37,7 +37,7 @@ protected:
virtual void device_start() override;
// device_vip_expansion_card_interface overrides
- virtual uint8_t vip_program_r(address_space &space, offs_t offset, int cs, int cdef, int *minh) override;
+ virtual uint8_t vip_program_r(offs_t offset, int cs, int cdef, int *minh) override;
private:
required_memory_region m_rom;
diff --git a/src/devices/bus/vme/vme.cpp b/src/devices/bus/vme/vme.cpp
index f6254e32366..757874abae2 100644
--- a/src/devices/bus/vme/vme.cpp
+++ b/src/devices/bus/vme/vme.cpp
@@ -329,6 +329,36 @@ void vme_device::install_device(vme_amod_t amod, offs_t start, offs_t end, read8
}
}
+void vme_device::install_device(vme_amod_t amod, offs_t start, offs_t end, read8sm_delegate rhandler, write8sm_delegate whandler, uint32_t mask)
+{
+ LOG("%s %s AM%d D%02x\n", tag(), FUNCNAME, amod, m_prgwidth);
+
+ LOG(" - width:%d\n", m_prgwidth);
+
+ // TODO: support address modifiers and buscycles other than single access cycles
+ switch(amod)
+ {
+ case A16_SC: break;
+ case A24_SC: break;
+ case A32_SC: break;
+ default: fatalerror("VME D8: Non supported Address modifier: AM%02x\n", amod);
+ }
+
+ switch(m_prgwidth)
+ {
+ case 16:
+ m_prgspace->install_readwrite_handler(start, end, rhandler, whandler, (uint16_t)(mask & 0x0000ffff));
+ break;
+ case 24:
+ m_prgspace->install_readwrite_handler(start, end, rhandler, whandler, (uint32_t)(mask & 0x00ffffff));
+ break;
+ case 32:
+ m_prgspace->install_readwrite_handler(start, end, rhandler, whandler, mask);
+ break;
+ default: fatalerror("VME D8: Bus width %d not supported\n", m_prgwidth);
+ }
+}
+
// D16 bit devices in A16, A24 and A32
void vme_device::install_device(vme_amod_t amod, offs_t start, offs_t end, read16_delegate rhandler, write16_delegate whandler, uint32_t mask)
{
diff --git a/src/devices/bus/vme/vme.h b/src/devices/bus/vme/vme.h
index a2b2ab944eb..755330f7689 100644
--- a/src/devices/bus/vme/vme.h
+++ b/src/devices/bus/vme/vme.h
@@ -57,10 +57,6 @@
#define VME_BUS_TAG "vme"
-// Callbacks to the board from the VME bus comes through here
-#define MCFG_VME_J1_CB(_devcb) \
- downcast<vme_slot_device &>(*device).set_vme_j1_callback(DEVCB_##_devcb);
-
//void vme_slot1(device_slot_interface &device); // Disabled until we know how to combine a board driver and a slot device.
void vme_slots(device_slot_interface &device);
@@ -89,9 +85,22 @@ public:
};
// construction/destruction
+ template <typename T>
+ vme_slot_device(machine_config const &mconfig, char const *tag, device_t *owner, T &&opts, char const *dflt, uint32_t slot_nbr, char const *bus_tag)
+ : vme_slot_device(mconfig, tag, owner, 0)
+ {
+ option_reset();
+ opts(*this);
+ set_default_option(dflt);
+ set_fixed(false);
+ set_vme_slot(bus_tag, tag);
+ update_vme_chains(slot_nbr);
+ }
+
vme_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- template <class Object> devcb_base &set_vme_j1_callback(Object &&cb) { return m_vme_j1_callback.set_callback(std::forward<Object>(cb)); }
+ // Callbacks to the board from the VME bus comes through here
+ auto vme_j1_callback() { return m_vme_j1_callback.bind(); }
void set_vme_slot(const char *tag, const char *slottag);
void update_vme_chains(uint32_t slot_nbr);
@@ -116,18 +125,6 @@ protected:
DECLARE_DEVICE_TYPE(VME, vme_device)
-//**************************************************************************
-// INTERFACE CONFIGURATION MACROS
-//**************************************************************************
-
-#define MCFG_VME_DEVICE_ADD(_tag) \
- MCFG_DEVICE_ADD(_tag, VME, 0)
-
-#define MCFG_VME_CPU(_cputag) \
- downcast<vme_device &>(*device).set_cputag(_cputag);
-
-#define MCFG_VME_BUS_OWNER_SPACES() \
- downcast<vme_device &>(*device).use_owner_spaces();
class vme_card_interface;
@@ -185,6 +182,7 @@ public:
AMOD_STANDARD_SUPERVIS_BLK = 0x3F
};
void install_device(vme_amod_t amod, offs_t start, offs_t end, read8_delegate rhandler, write8_delegate whandler, uint32_t mask);
+ void install_device(vme_amod_t amod, offs_t start, offs_t end, read8sm_delegate rhandler, write8sm_delegate whandler, uint32_t mask);
// void install_device(vme_amod_t amod, offs_t start, offs_t end, read8_delegate rhandler, write8_delegate whandler);
void install_device(vme_amod_t amod, offs_t start, offs_t end, read16_delegate rhandler, write16_delegate whandler, uint32_t mask);
void install_device(vme_amod_t amod, offs_t start, offs_t end, read32_delegate rhandler, write32_delegate whandler, uint32_t mask);
@@ -241,15 +239,4 @@ private:
device_vme_card_interface *m_next;
};
-#define MCFG_VME_SLOT_ADD(_tag, _slotnbr, _slot_intf,_def_slot) \
- { std::string stag = "slot" + std::to_string(_slotnbr); \
- MCFG_DEVICE_ADD(stag.c_str(), VME_SLOT, 0); \
- MCFG_DEVICE_SLOT_INTERFACE(_slot_intf, _def_slot, false); \
- downcast<vme_slot_device &>(*device).set_vme_slot(_tag, stag.c_str()); \
- downcast<vme_slot_device &>(*device).update_vme_chains(_slotnbr); \
- }
-
-#define MCFG_VME_SLOT_REMOVE(_tag) \
- MCFG_DEVICE_REMOVE(_tag)
-
#endif // MAME_BUS_VME_VME_H
diff --git a/src/devices/bus/vme/vme_fccpu20.cpp b/src/devices/bus/vme/vme_fccpu20.cpp
index d6e6f075fe8..d6f5ab56d30 100644
--- a/src/devices/bus/vme/vme_fccpu20.cpp
+++ b/src/devices/bus/vme/vme_fccpu20.cpp
@@ -252,11 +252,12 @@ static DEVICE_INPUT_DEFAULTS_START( terminal )
DEVICE_INPUT_DEFAULTS( "RS232_STOPBITS", 0xff, RS232_STOPBITS_2 )
DEVICE_INPUT_DEFAULTS_END
-MACHINE_CONFIG_START(vme_fccpu20_device::device_add_mconfig)
+void vme_fccpu20_device::device_add_mconfig(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M68020, CLOCK50 / 3) /* Crytstal verified from picture HCI */
- MCFG_DEVICE_PROGRAM_MAP (cpu20_mem)
- MCFG_DEVICE_IRQ_ACKNOWLEDGE_DEVICE("bim", bim68153_device, iack)
+ M68020(config, m_maincpu, CLOCK50 / 3); /* Crytstal verified from picture HCI */
+ m_maincpu->set_addrmap(AS_PROGRAM, &vme_fccpu20_device::cpu20_mem);
+ m_maincpu->set_irq_acknowledge_callback("bim", FUNC(bim68153_device::iack));
/* PIT Parallel Interface and Timer device, assumed strapped for on board clock */
PIT68230(config, m_pit, CLOCK32 / 4); /* Crystal not verified */
@@ -312,59 +313,60 @@ MACHINE_CONFIG_START(vme_fccpu20_device::device_add_mconfig)
rs232_port_device &rs232p3(RS232_PORT(config, RS232P3_TAG, default_rs232_devices, nullptr));
rs232p3.rxd_handler().set(m_mpcc3, FUNC(mpcc68561_device::write_rx));
rs232p3.cts_handler().set(m_mpcc3, FUNC(mpcc68561_device::cts_w));
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(vme_fccpu20_card_device::device_add_mconfig)
+void vme_fccpu20_card_device::device_add_mconfig(machine_config &config)
+{
vme_fccpu20_device::device_add_mconfig(config);
-MACHINE_CONFIG_END
+}
// SYS68K/CPU-21S Part No.1 01 041 - 68020 CPU board + FPU 68881 at 12.5 MHz, 512 KB RAM
-MACHINE_CONFIG_START(vme_fccpu21s_card_device::device_add_mconfig)
+void vme_fccpu21s_card_device::device_add_mconfig(machine_config &config)
+{
vme_fccpu20_device::device_add_mconfig(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_CLOCK(CLOCK50 / 4)
-MACHINE_CONFIG_END
+ m_maincpu->set_clock(CLOCK50 / 4);
+}
// SYS68K/CPU-21 Part No.1 01 001 - 68020 CPU board (CPU-20) + FPU 68881 at 16.7 MHz, 512 KB RAM
-MACHINE_CONFIG_START(vme_fccpu21_card_device::device_add_mconfig)
+void vme_fccpu21_card_device::device_add_mconfig(machine_config &config)
+{
vme_fccpu20_device::device_add_mconfig(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_CLOCK(CLOCK50 / 3)
-MACHINE_CONFIG_END
+ m_maincpu->set_clock(CLOCK50 / 3);
+}
// SYS68K/CPU-21A Part No.1 01 011 - 68020 CPU board + FPU 68881 at 20 MHz, 512 KB RAM
-MACHINE_CONFIG_START(vme_fccpu21a_card_device::device_add_mconfig)
+void vme_fccpu21a_card_device::device_add_mconfig(machine_config &config)
+{
vme_fccpu20_device::device_add_mconfig(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_CLOCK(CLOCK40 / 2)
-MACHINE_CONFIG_END
+ m_maincpu->set_clock(CLOCK40 / 2);
+}
// SYS68K/CPU-21YA Part No.1 01 061 - 68020 CPU board + FPU 68881 at 20 MHz, 2048 KB RAM
-MACHINE_CONFIG_START(vme_fccpu21ya_card_device::device_add_mconfig)
+void vme_fccpu21ya_card_device::device_add_mconfig(machine_config &config)
+{
vme_fccpu20_device::device_add_mconfig(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_CLOCK(CLOCK40 / 2)
-MACHINE_CONFIG_END
+ m_maincpu->set_clock(CLOCK40 / 2);
+}
// SYS68K/CPU-21B Part No.1 01 021 - 68020 CPU board + FPU 68881 at 25 MHz, 512 KB RAM
-MACHINE_CONFIG_START(vme_fccpu21b_card_device::device_add_mconfig)
+void vme_fccpu21b_card_device::device_add_mconfig(machine_config &config)
+{
vme_fccpu20_device::device_add_mconfig(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_CLOCK(CLOCK50 / 2)
-MACHINE_CONFIG_END
+ m_maincpu->set_clock(CLOCK50 / 2);
+}
// SYS68K/CPU-21YB Part No.1 01 071 - 68020 CPU board + FPU 68881 at 25 MHz, 2048 KB RAM
-MACHINE_CONFIG_START(vme_fccpu21yb_card_device::device_add_mconfig)
+void vme_fccpu21yb_card_device::device_add_mconfig(machine_config &config)
+{
vme_fccpu20_device::device_add_mconfig(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_CLOCK(CLOCK50 / 2)
-MACHINE_CONFIG_END
+ m_maincpu->set_clock(CLOCK50 / 2);
+}
//**************************************************************************
diff --git a/src/devices/bus/vme/vme_fccpu20.h b/src/devices/bus/vme/vme_fccpu20.h
index bab05fd987f..4be52d07477 100644
--- a/src/devices/bus/vme/vme_fccpu20.h
+++ b/src/devices/bus/vme/vme_fccpu20.h
@@ -54,6 +54,8 @@ protected:
emu_timer *m_arbiter_start; // Need a startup delay because it is hooked up to the sense inputs of the PIT
+ required_device<cpu_device> m_maincpu;
+
private:
DECLARE_WRITE_LINE_MEMBER(bim_irq_callback);
@@ -68,7 +70,6 @@ private:
void cpu20_mem(address_map &map);
- required_device<cpu_device> m_maincpu;
required_device<pit68230_device> m_pit;
required_device<bim68153_device> m_bim;
required_device<mpcc68561_device> m_mpcc;
diff --git a/src/devices/bus/vme/vme_hcpu30.h b/src/devices/bus/vme/vme_hcpu30.h
index 98e0691b6fe..b4e387ace22 100644
--- a/src/devices/bus/vme/vme_hcpu30.h
+++ b/src/devices/bus/vme/vme_hcpu30.h
@@ -11,7 +11,7 @@
#include "machine/68230pit.h"
#include "machine/scnxx562.h"
#include "machine/terminal.h"
-#include "machine/wd33c93.h"
+#include "machine/wd33c9x.h"
DECLARE_DEVICE_TYPE(VME_HCPU30, vme_hcpu30_card_device)
diff --git a/src/devices/bus/vme/vme_mvme350.cpp b/src/devices/bus/vme/vme_mvme350.cpp
index f1bb9d5dc46..b433620b6fe 100644
--- a/src/devices/bus/vme/vme_mvme350.cpp
+++ b/src/devices/bus/vme/vme_mvme350.cpp
@@ -189,13 +189,14 @@ ROM_END
// device_add_mconfig - add device configuration
//-------------------------------------------------
-MACHINE_CONFIG_START(vme_mvme350_card_device::device_add_mconfig)
+void vme_mvme350_card_device::device_add_mconfig(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD (MVME350_CPU_TAG, M68010, XTAL(10'000'000))
- MCFG_DEVICE_PROGRAM_MAP (mvme350_mem)
+ m68010_device &cpu(M68010(config, MVME350_CPU_TAG, XTAL(10'000'000)));
+ cpu.set_addrmap(AS_PROGRAM, &vme_mvme350_card_device::mvme350_mem);
/* PIT Parallel Interface and Timer device, assuming strapped for on board clock */
- MCFG_DEVICE_ADD("pit", PIT68230, XTAL(16'000'000) / 2)
-MACHINE_CONFIG_END
+ PIT68230(config, "pit", XTAL(16'000'000) / 2);
+}
const tiny_rom_entry *vme_mvme350_card_device::device_rom_region() const
{
diff --git a/src/devices/bus/vme/vme_mzr8105.cpp b/src/devices/bus/vme/vme_mzr8105.cpp
index 985f6bad905..fe63e92ee28 100644
--- a/src/devices/bus/vme/vme_mzr8105.cpp
+++ b/src/devices/bus/vme/vme_mzr8105.cpp
@@ -36,13 +36,13 @@ DEFINE_DEVICE_TYPE(VME_MZR8105, vme_mzr8105_card_device, "mzr8105", "Mizar 8105
// device_add_mconfig - add device configuration
//-------------------------------------------------
-MACHINE_CONFIG_START(vme_mzr8105_card_device::device_add_mconfig)
+void vme_mzr8105_card_device::device_add_mconfig(machine_config &config)
{
- MCFG_DEVICE_ADD ("maincpu", M68000, XTAL(10'000'000))
- MCFG_DEVICE_PROGRAM_MAP (mzr8105_mem)
- MCFG_VME_DEVICE_ADD("vme")
- MCFG_VME_BUS_OWNER_SPACES()
- MCFG_VME_SLOT_ADD ("vme", 1, mzr8105_vme_cards, "mzr8300")
+ M68000(config, m_maincpu, XTAL(10'000'000))
+ m_maincpu->set_addrmap(AS_PROGRAM, &vme_mzr8105_card_device::mzr8105_mem);
+
+ VME(config, "vme", 0).use_owner_spaces();
+ VME_SLOT(config, "slot1", mzr8105_vme_cards, "mzr8300", 1, "vme");
}
vme_mzr8105_card_device::vme_mzr8105_card_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) :
diff --git a/src/devices/bus/vme/vme_mzr8300.cpp b/src/devices/bus/vme/vme_mzr8300.cpp
index ca00a00a674..362beef2546 100644
--- a/src/devices/bus/vme/vme_mzr8300.cpp
+++ b/src/devices/bus/vme/vme_mzr8300.cpp
@@ -187,8 +187,8 @@ void vme_mzr8300_card_device::device_start()
read8_delegate(FUNC(z80sio_device::ca_r), subdevice<z80sio_device>("sio0")),
write8_delegate(FUNC(z80sio_device::ca_w), subdevice<z80sio_device>("sio0")), 0x00ff);
m_vme->install_device(vme_device::A16_SC, base + 0x10, base + 0x13, // Am9513
- read8_delegate(FUNC(am9513_device::read8), subdevice<am9513_device>("stc")),
- write8_delegate(FUNC(am9513_device::write8), subdevice<am9513_device>("stc")), 0x00ff);
+ read8sm_delegate(FUNC(am9513_device::read8), subdevice<am9513_device>("stc")),
+ write8sm_delegate(FUNC(am9513_device::write8), subdevice<am9513_device>("stc")), 0x00ff);
}
void vme_mzr8300_card_device::device_reset()
diff --git a/src/devices/bus/vsmile/pad.cpp b/src/devices/bus/vsmile/pad.cpp
new file mode 100644
index 00000000000..a301c65b9e2
--- /dev/null
+++ b/src/devices/bus/vsmile/pad.cpp
@@ -0,0 +1,275 @@
+// license:BSD-3-Clause
+// copyright-holders:Ryan Holtz, Vas Crabb
+
+#include "emu.h"
+#include "pad.h"
+
+#include <algorithm>
+
+//#define VERBOSE 1
+#include "logmacro.h"
+
+
+//**************************************************************************
+// GLOBAL VARIABLES
+//**************************************************************************
+
+DEFINE_DEVICE_TYPE(VSMILE_PAD, vsmile_pad_device, "vsmile_pad", "V.Smile Joystick")
+
+
+//**************************************************************************
+// V.Smile control pad
+//**************************************************************************
+
+DECLARE_ENUM_BITWISE_OPERATORS(vsmile_pad_device::stale_inputs)
+ALLOW_SAVE_TYPE(vsmile_pad_device::stale_inputs);
+
+vsmile_pad_device::vsmile_pad_device(machine_config const &mconfig, char const *tag, device_t *owner, uint32_t clock)
+ : vsmile_ctrl_device_base(mconfig, VSMILE_PAD, tag, owner, clock)
+ , m_io_joy(*this, "JOY")
+ , m_io_colors(*this, "COLORS")
+ , m_io_buttons(*this, "BUTTONS")
+ , m_idle_timer(nullptr)
+ , m_sent_joy(0x00U)
+ , m_sent_colors(0x00U)
+ , m_sent_buttons(0x00U)
+ , m_stale(STALE_ALL)
+ , m_active(false)
+{
+ std::fill(std::begin(m_ctrl_probe_history), std::end(m_ctrl_probe_history), 0U);
+}
+
+vsmile_pad_device::~vsmile_pad_device()
+{
+}
+
+void vsmile_pad_device::device_start()
+{
+ vsmile_ctrl_device_base::device_start();
+
+ m_idle_timer = machine().scheduler().timer_alloc(
+ timer_expired_delegate(FUNC(vsmile_pad_device::handle_idle), this));
+ m_idle_timer->adjust(attotime::from_seconds(1));
+
+ m_sent_joy = 0x00U;
+ m_sent_colors = 0x00U;
+ m_sent_buttons = 0x00U;
+ m_stale = STALE_ALL;
+ m_active = false;
+
+ save_item(NAME(m_sent_joy));
+ save_item(NAME(m_sent_colors));
+ save_item(NAME(m_sent_buttons));
+ save_item(NAME(m_stale));
+ save_item(NAME(m_active));
+ save_item(NAME(m_ctrl_probe_history));
+}
+
+void vsmile_pad_device::tx_complete()
+{
+ // update joystick
+ if ((m_stale & STALE_JOY) != STALE_NONE)
+ {
+ m_sent_joy = m_io_joy->read();
+ if ((m_stale & STALE_UP_DOWN) != STALE_NONE)
+ {
+ if (BIT(m_sent_joy, 0))
+ uart_tx_fifo_push(0x87); // up
+ else if (BIT(m_sent_joy, 1))
+ uart_tx_fifo_push(0x8f); // down
+ else
+ uart_tx_fifo_push(0x80);
+ }
+ if ((m_stale & STALE_LEFT_RIGHT) != STALE_NONE)
+ {
+ if (BIT(m_sent_joy, 2))
+ uart_tx_fifo_push(0xcf); // left
+ else if (BIT(m_sent_joy, 3))
+ uart_tx_fifo_push(0xc7); // right
+ else
+ uart_tx_fifo_push(0xc0);
+ }
+ }
+
+ // update colors
+ if ((m_stale & STALE_COLORS) != STALE_NONE)
+ {
+ m_sent_colors = m_io_colors->read();
+ uart_tx_fifo_push(0x90 | m_sent_colors);
+ }
+
+ // update buttons
+ if ((m_stale & STALE_BUTTONS) != STALE_NONE)
+ {
+ m_sent_buttons = m_io_buttons->read();
+ if (((m_stale & STALE_OK) != STALE_NONE) && BIT(m_sent_buttons, 0))
+ uart_tx_fifo_push(0xa1);
+ if (((m_stale & STALE_QUIT) != STALE_NONE) && BIT(m_sent_buttons, 1))
+ uart_tx_fifo_push(0xa2);
+ if (((m_stale & STALE_HELP) != STALE_NONE) && BIT(m_sent_buttons, 2))
+ uart_tx_fifo_push(0xa3);
+ if (((m_stale & STALE_ABC) != STALE_NONE) && BIT(m_sent_buttons, 3))
+ uart_tx_fifo_push(0xa4);
+ if (!m_sent_buttons)
+ uart_tx_fifo_push(0xa0);
+ }
+
+ // if nothing happens in the next second we'll queue a keep-alive
+ if (!m_active)
+ LOG("entered active state\n");
+ m_idle_timer->adjust(attotime::from_seconds(1));
+ m_active = true;
+ m_stale = STALE_NONE;
+}
+
+void vsmile_pad_device::tx_timeout()
+{
+ if (m_active)
+ {
+ m_idle_timer->reset();
+ m_active = false;
+ m_stale = STALE_ALL;
+ std::fill(std::begin(m_ctrl_probe_history), std::end(m_ctrl_probe_history), 0U);
+ LOG("left active state\n");
+ }
+ uart_tx_fifo_push(0x55);
+}
+
+void vsmile_pad_device::rx_complete(uint8_t data, bool select)
+{
+ if (select)
+ {
+ if (((data & 0xf0) == 0x70) || ((data & 0xf0) == 0xb0))
+ {
+ m_ctrl_probe_history[0] = ((data & 0xf0) == 0x70) ? 0 : m_ctrl_probe_history[1];
+ m_ctrl_probe_history[1] = data;
+ uint8_t const response = ((m_ctrl_probe_history[0] + m_ctrl_probe_history[1] + 0x0f) & 0x0f) ^ 0x05;
+ LOG(
+ "%s: received probe %02X, %02X, sending response %02X\n",
+ machine().describe_context(),
+ m_ctrl_probe_history[0],
+ m_ctrl_probe_history[1],
+ 0xb0 | response);
+ uart_tx_fifo_push(0xb0 | response);
+ }
+ }
+}
+
+void vsmile_pad_device::uart_tx_fifo_push(uint8_t data)
+{
+ m_idle_timer->reset();
+ queue_tx(data);
+}
+
+TIMER_CALLBACK_MEMBER(vsmile_pad_device::handle_idle)
+{
+ LOG("idle timer expired, sending keep-alive 55\n");
+ queue_tx(0x55);
+}
+
+INPUT_CHANGED_MEMBER(vsmile_pad_device::pad_joy_changed)
+{
+ if (m_active)
+ {
+ if (!is_tx_empty())
+ {
+ LOG("joy changed while transmission in progress, marking stale\n");
+ m_stale |= stale_inputs(uintptr_t(param));
+ }
+ else
+ {
+ uint8_t const joy = m_io_joy->read();
+ if ((joy ^ m_sent_joy) & 0x03)
+ {
+ if (BIT(joy, 0))
+ uart_tx_fifo_push(0x87); // up
+ else if (BIT(joy, 1))
+ uart_tx_fifo_push(0x8f); // down
+ else
+ uart_tx_fifo_push(0x80);
+ }
+ if ((joy ^ m_sent_joy) & 0x0c)
+ {
+ if (BIT(joy, 2))
+ uart_tx_fifo_push(0xcf); // left
+ else if (BIT(joy, 3))
+ uart_tx_fifo_push(0xc7); // right
+ else
+ uart_tx_fifo_push(0xc0);
+ }
+ m_sent_joy = joy;
+ }
+ }
+}
+
+INPUT_CHANGED_MEMBER(vsmile_pad_device::pad_color_changed)
+{
+ if (m_active)
+ {
+ if (!is_tx_empty())
+ {
+ LOG("colors changed while transmission in progress, marking stale\n");
+ m_stale |= STALE_COLORS;
+ }
+ else
+ {
+ m_sent_colors = m_io_colors->read();
+ uart_tx_fifo_push(0x90 | m_sent_colors);
+ }
+ }
+}
+
+INPUT_CHANGED_MEMBER(vsmile_pad_device::pad_button_changed)
+{
+ if (m_active)
+ {
+ if (!is_tx_empty())
+ {
+ LOG("buttons changed while transmission in progress, marking stale\n");
+ m_stale |= stale_inputs(uintptr_t(param));
+ }
+ else
+ {
+ uint8_t const buttons = m_io_buttons->read();
+ if (BIT((m_sent_buttons ^ buttons) & buttons, 0))
+ uart_tx_fifo_push(0xa1);
+ if (BIT((m_sent_buttons ^ buttons) & buttons, 1))
+ uart_tx_fifo_push(0xa2);
+ if (BIT((m_sent_buttons ^ buttons) & buttons, 2))
+ uart_tx_fifo_push(0xa3);
+ if (BIT((m_sent_buttons ^ buttons) & buttons, 3))
+ uart_tx_fifo_push(0xa4);
+ if (!buttons)
+ uart_tx_fifo_push(0xa0);
+ m_sent_buttons = buttons;
+ }
+ }
+}
+
+static INPUT_PORTS_START( vsmile_pad )
+ PORT_START("JOY")
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_MEMBER(DEVICE_SELF, vsmile_pad_device, pad_joy_changed, vsmile_pad_device::STALE_UP_DOWN) PORT_NAME("Joypad Up")
+ PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_MEMBER(DEVICE_SELF, vsmile_pad_device, pad_joy_changed, vsmile_pad_device::STALE_UP_DOWN) PORT_NAME("Joypad Down")
+ PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_MEMBER(DEVICE_SELF, vsmile_pad_device, pad_joy_changed, vsmile_pad_device::STALE_LEFT_RIGHT) PORT_NAME("Joypad Left")
+ PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_MEMBER(DEVICE_SELF, vsmile_pad_device, pad_joy_changed, vsmile_pad_device::STALE_LEFT_RIGHT) PORT_NAME("Joypad Right")
+ PORT_BIT( 0xf0, IP_ACTIVE_HIGH, IPT_UNUSED )
+
+ PORT_START("COLORS")
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_MEMBER(DEVICE_SELF, vsmile_pad_device, pad_color_changed, vsmile_pad_device::STALE_COLORS) PORT_NAME("Green")
+ PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_CHANGED_MEMBER(DEVICE_SELF, vsmile_pad_device, pad_color_changed, vsmile_pad_device::STALE_COLORS) PORT_NAME("Blue")
+ PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_CHANGED_MEMBER(DEVICE_SELF, vsmile_pad_device, pad_color_changed, vsmile_pad_device::STALE_COLORS) PORT_NAME("Yellow")
+ PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_CHANGED_MEMBER(DEVICE_SELF, vsmile_pad_device, pad_color_changed, vsmile_pad_device::STALE_COLORS) PORT_NAME("Red")
+ PORT_BIT( 0xf0, IP_ACTIVE_HIGH, IPT_UNUSED )
+
+ PORT_START("BUTTONS")
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON5 ) PORT_CHANGED_MEMBER(DEVICE_SELF, vsmile_pad_device, pad_button_changed, vsmile_pad_device::STALE_OK) PORT_NAME("OK")
+ PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON6 ) PORT_CHANGED_MEMBER(DEVICE_SELF, vsmile_pad_device, pad_button_changed, vsmile_pad_device::STALE_QUIT) PORT_NAME("Quit")
+ PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON7 ) PORT_CHANGED_MEMBER(DEVICE_SELF, vsmile_pad_device, pad_button_changed, vsmile_pad_device::STALE_HELP) PORT_NAME("Help")
+ PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON8 ) PORT_CHANGED_MEMBER(DEVICE_SELF, vsmile_pad_device, pad_button_changed, vsmile_pad_device::STALE_ABC) PORT_NAME("ABC")
+ PORT_BIT( 0xf0, IP_ACTIVE_HIGH, IPT_UNUSED )
+INPUT_PORTS_END
+
+ioport_constructor vsmile_pad_device::device_input_ports() const
+{
+ return INPUT_PORTS_NAME( vsmile_pad );
+}
diff --git a/src/devices/bus/vsmile/pad.h b/src/devices/bus/vsmile/pad.h
new file mode 100644
index 00000000000..5e2515c2b58
--- /dev/null
+++ b/src/devices/bus/vsmile/pad.h
@@ -0,0 +1,78 @@
+// license:BSD-3-Clause
+// copyright-holders:Ryan Holtz, Vas Crabb
+#ifndef MAME_BUS_VSMILE_PAD_H
+#define MAME_BUS_VSMILE_PAD_H
+
+#pragma once
+
+#include "vsmile_ctrl.h"
+
+/***************************************************************************
+ TYPE DEFINITIONS
+ ***************************************************************************/
+
+// ======================> vsmile_pad_device
+
+class vsmile_pad_device : public vsmile_ctrl_device_base
+{
+public:
+ enum stale_inputs : uint8_t
+ {
+ STALE_NONE = 0U,
+ STALE_LEFT_RIGHT = 1U << 0,
+ STALE_UP_DOWN = 1U << 1,
+ STALE_COLORS = 1U << 2,
+ STALE_OK = 1U << 3,
+ STALE_QUIT = 1U << 4,
+ STALE_HELP = 1U << 5,
+ STALE_ABC = 1U << 6,
+
+ STALE_JOY = STALE_LEFT_RIGHT | STALE_UP_DOWN,
+ STALE_BUTTONS = STALE_OK | STALE_QUIT | STALE_HELP | STALE_ABC,
+ STALE_ALL = STALE_JOY | STALE_COLORS | STALE_BUTTONS
+ };
+
+ // construction/destruction
+ vsmile_pad_device(machine_config const &mconfig, char const *tag, device_t *owner, uint32_t clock = 0U);
+ virtual ~vsmile_pad_device();
+
+ // input handlers
+ DECLARE_INPUT_CHANGED_MEMBER(pad_joy_changed);
+ DECLARE_INPUT_CHANGED_MEMBER(pad_color_changed);
+ DECLARE_INPUT_CHANGED_MEMBER(pad_button_changed);
+
+protected:
+ // device_t implementation
+ virtual ioport_constructor device_input_ports() const override;
+ virtual void device_start() override;
+
+ // vsmile_ctrl_device_base implementation
+ virtual void tx_complete() override;
+ virtual void tx_timeout() override;
+ virtual void rx_complete(uint8_t data, bool cts) override;
+
+private:
+ void uart_tx_fifo_push(uint8_t data);
+
+ TIMER_CALLBACK_MEMBER(handle_idle);
+
+ required_ioport m_io_joy;
+ required_ioport m_io_colors;
+ required_ioport m_io_buttons;
+
+ emu_timer *m_idle_timer;
+
+ uint8_t m_sent_joy, m_sent_colors, m_sent_buttons;
+ stale_inputs m_stale;
+ bool m_active;
+ uint8_t m_ctrl_probe_history[2];
+};
+
+
+/***************************************************************************
+ DEVICE TYPES
+ ***************************************************************************/
+
+DECLARE_DEVICE_TYPE(VSMILE_PAD, vsmile_pad_device)
+
+#endif // MAME_BUS_VSMILE_PAD_H
diff --git a/src/devices/bus/vsmile/rom.cpp b/src/devices/bus/vsmile/rom.cpp
new file mode 100644
index 00000000000..584a8cfe058
--- /dev/null
+++ b/src/devices/bus/vsmile/rom.cpp
@@ -0,0 +1,86 @@
+// license:BSD-3-Clause
+// copyright-holders:Ryan Holtz
+/***********************************************************************************************************
+
+ V.Smile cart emulation
+
+ We support standard carts and one with on-board NVRAM
+
+ ***********************************************************************************************************/
+
+
+#include "emu.h"
+#include "rom.h"
+
+
+//-------------------------------------------------
+// vsmile_rom_device - constructor
+//-------------------------------------------------
+
+DEFINE_DEVICE_TYPE(VSMILE_ROM_STD, vsmile_rom_device, "vsmile_rom", "V.Smile Cart")
+DEFINE_DEVICE_TYPE(VSMILE_ROM_NVRAM, vsmile_rom_nvram_device, "vsmile_rom_nvram", "V.Smile Cart + NVRAM")
+
+
+vsmile_rom_device::vsmile_rom_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock)
+ : device_t(mconfig, type, tag, owner, clock)
+ , device_vsmile_cart_interface(mconfig, *this)
+{
+}
+
+vsmile_rom_device::vsmile_rom_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+ : vsmile_rom_device(mconfig, VSMILE_ROM_STD, tag, owner, clock)
+{
+}
+
+vsmile_rom_nvram_device::vsmile_rom_nvram_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock)
+ : vsmile_rom_device(mconfig, type, tag, owner, clock)
+{
+}
+
+vsmile_rom_nvram_device::vsmile_rom_nvram_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+ : vsmile_rom_nvram_device(mconfig, VSMILE_ROM_NVRAM, tag, owner, clock)
+{
+}
+
+
+//-------------------------------------------------
+// mapper specific start/reset
+//-------------------------------------------------
+
+void vsmile_rom_device::device_start()
+{
+ save_item(NAME(m_bank_offset));
+}
+
+void vsmile_rom_device::device_reset()
+{
+ m_bank_offset = 0;
+}
+
+
+/*-------------------------------------------------
+ Cart with NVRAM
+ -------------------------------------------------*/
+
+READ16_MEMBER(vsmile_rom_nvram_device::bank2_r)
+{
+ if (!m_nvram.empty() && offset < m_nvram.size())
+ return m_nvram[offset];
+ else // this cannot actually happen...
+ return 0;
+}
+
+WRITE16_MEMBER(vsmile_rom_nvram_device::bank2_w)
+{
+ if (!m_nvram.empty() && offset < m_nvram.size())
+ COMBINE_DATA(&m_nvram[offset]);
+}
+
+/*-------------------------------------------------
+ CS2 bankswitching
+ -------------------------------------------------*/
+
+void vsmile_rom_device::set_cs2(bool cs2)
+{
+ m_bank_offset = cs2 ? 0x400000 : 0x000000;
+}
diff --git a/src/devices/bus/vsmile/rom.h b/src/devices/bus/vsmile/rom.h
new file mode 100644
index 00000000000..ec39f1f743e
--- /dev/null
+++ b/src/devices/bus/vsmile/rom.h
@@ -0,0 +1,59 @@
+// license:BSD-3-Clause
+// copyright-holders:Ryan Holtz
+#ifndef MAME_BUS_VSMILE_ROM_H
+#define MAME_BUS_VSMILE_ROM_H
+
+#pragma once
+
+#include "vsmile_slot.h"
+
+// ======================> vsmile_rom_device
+
+class vsmile_rom_device : public device_t, public device_vsmile_cart_interface
+{
+public:
+ // construction/destruction
+ vsmile_rom_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+
+ // reading and writing
+ virtual DECLARE_READ16_MEMBER(bank0_r) override { return m_rom[m_bank_offset + 0x000000 + offset]; }
+ virtual DECLARE_READ16_MEMBER(bank1_r) override { return m_rom[m_bank_offset + 0x100000 + offset]; }
+ virtual DECLARE_READ16_MEMBER(bank2_r) override { return m_rom[m_bank_offset + 0x200000 + offset]; }
+ virtual DECLARE_READ16_MEMBER(bank3_r) override { return m_rom[m_bank_offset + 0x300000 + offset]; }
+
+ // banking
+ virtual void set_cs2(bool cs2) override;
+
+protected:
+ vsmile_rom_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock);
+
+ // device-level overrides
+ virtual void device_start() override;
+ virtual void device_reset() override;
+
+ uint32_t m_bank_offset;
+};
+
+
+// ======================> vsmile_rom_nvram_device
+
+class vsmile_rom_nvram_device : public vsmile_rom_device
+{
+public:
+ // construction/destruction
+ vsmile_rom_nvram_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+
+ virtual DECLARE_READ16_MEMBER(bank2_r) override;
+ virtual DECLARE_WRITE16_MEMBER(bank2_w) override;
+
+protected:
+ vsmile_rom_nvram_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock);
+};
+
+
+// device type definition
+DECLARE_DEVICE_TYPE(VSMILE_ROM_STD, vsmile_rom_device)
+DECLARE_DEVICE_TYPE(VSMILE_ROM_NVRAM, vsmile_rom_nvram_device)
+
+
+#endif // MAME_BUS_VSMILE_ROM_H
diff --git a/src/devices/bus/vsmile/vsmile_ctrl.cpp b/src/devices/bus/vsmile/vsmile_ctrl.cpp
new file mode 100644
index 00000000000..a8cbf25278b
--- /dev/null
+++ b/src/devices/bus/vsmile/vsmile_ctrl.cpp
@@ -0,0 +1,315 @@
+// license:BSD-3-Clause
+// copyright-holders:Vas Crabb
+
+#include "emu.h"
+#include "vsmile_ctrl.h"
+
+#include <algorithm>
+#include <cassert>
+
+//#define VERBOSE 1
+#include "logmacro.h"
+
+
+//**************************************************************************
+// GLOBAL VARIABLES
+//**************************************************************************
+
+DEFINE_DEVICE_TYPE(VSMILE_CTRL_PORT, vsmile_ctrl_port_device, "vsmile_ctrl_port", "V.Smile Controller Port")
+
+
+//**************************************************************************
+// V.Smile controller interface
+//**************************************************************************
+
+device_vsmile_ctrl_interface::device_vsmile_ctrl_interface(const machine_config &mconfig, device_t &device)
+ : device_slot_card_interface(mconfig, device)
+ , m_port(dynamic_cast<vsmile_ctrl_port_device *>(device.owner()))
+{
+}
+
+device_vsmile_ctrl_interface::~device_vsmile_ctrl_interface()
+{
+}
+
+void device_vsmile_ctrl_interface::interface_validity_check(validity_checker &valid) const
+{
+ device_slot_card_interface::interface_validity_check(valid);
+
+ if (device().owner() && !m_port)
+ {
+ osd_printf_error(
+ "Owner device %s (%s) is not a vsmile_ctrl_port_device\n",
+ device().owner()->tag(),
+ device().owner()->name());
+ }
+}
+
+void device_vsmile_ctrl_interface::interface_pre_start()
+{
+ device_slot_card_interface::interface_pre_start();
+
+ if (m_port && !m_port->started())
+ throw device_missing_dependencies();
+}
+
+
+//**************************************************************************
+// V.Smile controller port
+//**************************************************************************
+
+vsmile_ctrl_port_device::vsmile_ctrl_port_device(
+ machine_config const &mconfig,
+ char const *tag,
+ device_t *owner,
+ uint32_t clock)
+ : device_t(mconfig, VSMILE_CTRL_PORT, tag, owner, clock)
+ , device_slot_interface(mconfig, *this)
+ , m_rts_cb(*this)
+ , m_data_cb(*this)
+{
+}
+
+vsmile_ctrl_port_device::~vsmile_ctrl_port_device()
+{
+}
+
+void vsmile_ctrl_port_device::device_validity_check(validity_checker &valid) const
+{
+ device_t *const card(get_card_device());
+ if (card && !dynamic_cast<device_vsmile_ctrl_interface *>(card))
+ {
+ osd_printf_error(
+ "Card device %s (%s) does not implement device_vsmile_ctrl_interface\n",
+ card->tag(),
+ card->name());
+ }
+}
+
+void vsmile_ctrl_port_device::device_resolve_objects()
+{
+ device_vsmile_ctrl_interface *const card(dynamic_cast<device_vsmile_ctrl_interface *>(get_card_device()));
+ if (card)
+ m_device = card;
+
+ m_rts_cb.resolve_safe();
+ m_data_cb.resolve_safe();
+}
+
+void vsmile_ctrl_port_device::device_start()
+{
+ device_t *const card(get_card_device());
+ if (card)
+ {
+ if (!m_device)
+ {
+ throw emu_fatalerror(
+ "vsmile_ctrl_port_device: card device %s (%s) does not implement device_vsmile_ctrl_interface\n",
+ card->tag(),
+ card->name());
+ }
+ else
+ {
+ m_device->select_w(0);
+ }
+ }
+}
+
+
+//**************************************************************************
+// V.Smile controller HLE base
+//**************************************************************************
+
+vsmile_ctrl_device_base::vsmile_ctrl_device_base(
+ machine_config const &mconfig,
+ device_type type,
+ char const *tag,
+ device_t *owner,
+ uint32_t clock)
+ : device_t(mconfig, type, tag, owner, clock)
+ , device_vsmile_ctrl_interface(mconfig, *this)
+ , m_tx_timer(nullptr)
+ , m_rts_timer(nullptr)
+ , m_tx_fifo_head(0U)
+ , m_tx_fifo_tail(0U)
+ , m_tx_fifo_empty(true)
+ , m_tx_active(false)
+ , m_select(false)
+{
+ std::fill(std::begin(m_tx_fifo), std::end(m_tx_fifo), 0);
+}
+
+vsmile_ctrl_device_base::~vsmile_ctrl_device_base()
+{
+}
+
+void vsmile_ctrl_device_base::device_start()
+{
+ // allocate a timer to limit transmit rate to something realistic
+ m_tx_timer = machine().scheduler().timer_alloc(
+ timer_expired_delegate(FUNC(vsmile_ctrl_device_base::tx_timer_expired), this));
+
+ // allocate a timer for RTS timeouts
+ m_rts_timer = machine().scheduler().timer_alloc(
+ timer_expired_delegate(FUNC(vsmile_ctrl_device_base::rts_timer_expired), this));
+
+ // start with transmit queue empty
+ m_tx_fifo_head = m_tx_fifo_tail = 0U;
+ m_tx_fifo_empty = true;
+ m_tx_active = false;
+
+ // register for save states
+ save_item(NAME(m_tx_fifo));
+ save_item(NAME(m_tx_fifo_head));
+ save_item(NAME(m_tx_fifo_tail));
+ save_item(NAME(m_tx_fifo_empty));
+ save_item(NAME(m_select));
+}
+
+bool vsmile_ctrl_device_base::queue_tx(uint8_t data)
+{
+ // return false on overrun and drop byte
+ bool const was_empty(m_tx_fifo_empty);
+ if (!was_empty && (m_tx_fifo_head == m_tx_fifo_tail))
+ {
+ LOG(
+ "%s: discarding byte %02X because FIFO is full (length %u, Tx %sactive)\n",
+ machine().describe_context(),
+ data,
+ ARRAY_LENGTH(m_tx_fifo),
+ m_tx_active ? "" : "in");
+ return false;
+ }
+
+ // queue the byte
+ m_tx_fifo[m_tx_fifo_tail] = data;
+ m_tx_fifo_tail = (m_tx_fifo_tail + 1) % ARRAY_LENGTH(m_tx_fifo);
+ m_tx_fifo_empty = false;
+
+ // assert RTS and start transmitting if necessary
+ if (was_empty)
+ {
+ rts_out(1);
+ if (m_select)
+ {
+ LOG("%s: transmitting byte %02X immediately (Tx was %sactive)\n", machine().describe_context(), data, m_tx_active ? "" : "in");
+ m_tx_active = true;
+ m_tx_timer->adjust(attotime::from_hz(9600 / 10));
+ }
+ else
+ {
+ LOG("%s: asserting RTS to transmit byte %02X\n", machine().describe_context(), data);
+ m_rts_timer->adjust(attotime::from_msec(500));
+ }
+ }
+ else
+ {
+ unsigned const fifo_used((m_tx_fifo_tail + ARRAY_LENGTH(m_tx_fifo) - m_tx_fifo_head) % ARRAY_LENGTH(m_tx_fifo));
+ LOG("%s: queued byte %02X (%u bytes queued, Tx %sactive)\n", machine().describe_context(), data, fifo_used, m_tx_active ? "" : "in");
+ }
+
+ // data was queued
+ return true;
+}
+
+void vsmile_ctrl_device_base::select_w(int state)
+{
+ if (bool(state) != m_select)
+ {
+ if (state && !m_tx_fifo_empty && !m_tx_active)
+ {
+ m_rts_timer->reset();
+ unsigned const fifo_used((m_tx_fifo_tail + ARRAY_LENGTH(m_tx_fifo) - m_tx_fifo_head) % ARRAY_LENGTH(m_tx_fifo));
+ LOG("%s: select asserted, starting transmission (%u bytes queued)\n", machine().describe_context(), fifo_used);
+ m_tx_active = true;
+ m_tx_timer->adjust(attotime::from_hz(9600 / 10));
+ }
+ else
+ {
+ LOG("%s: select %sasserted (Tx %sactive)\n", machine().describe_context(), state ? "" : "de", m_tx_active ? "" : "in");
+ }
+ m_select = bool(state);
+ }
+}
+
+void vsmile_ctrl_device_base::data_w(uint8_t data)
+{
+ LOG(
+ "%s: received byte %02X (select %sasserted, Tx %sactive)\n",
+ machine().describe_context(),
+ data,
+ m_select ? "" : "de",
+ m_tx_active ? "" : "in");
+ rx_complete(data, m_select);
+}
+
+TIMER_CALLBACK_MEMBER(vsmile_ctrl_device_base::tx_timer_expired)
+{
+ assert(!m_tx_fifo_empty);
+ assert(m_tx_active);
+
+ // deliver the byte to the host (bits have shifted out now)
+ uint8_t const data(m_tx_fifo[m_tx_fifo_head]);
+ m_tx_fifo_head = (m_tx_fifo_head + 1) % ARRAY_LENGTH(m_tx_fifo);
+ if (m_tx_fifo_head == m_tx_fifo_tail)
+ m_tx_fifo_empty = true;
+ data_out(data);
+
+ // if queue is drained give implmentation a chance to queue more before dropping RTS
+ if (m_tx_fifo_empty)
+ {
+ LOG("transmitted byte %02X, queue empty (select %sasserted)\n", data, m_select ? "" : "de");
+ tx_complete();
+ }
+ else
+ {
+ unsigned const fifo_used((m_tx_fifo_tail + ARRAY_LENGTH(m_tx_fifo) - m_tx_fifo_head) % ARRAY_LENGTH(m_tx_fifo));
+ LOG("transmitted byte %02X (%u bytes queued, select %sasserted)\n", data, fifo_used, m_select ? "" : "de");
+ }
+
+ // drop RTS if no more data, otherwise keep transmitting if CTS is still high
+ if (m_tx_fifo_empty)
+ {
+ LOG("nothing to transmit, deasserting RTS\n");
+ m_tx_active = false;
+ rts_out(0);
+ }
+ else if (m_select)
+ {
+ LOG("select asserted, transmitting next byte %02X\n", m_tx_fifo[m_tx_fifo_head]);
+ m_tx_timer->adjust(attotime::from_hz(9600 / 10));
+ }
+ else
+ {
+ LOG("select deasserted, waiting to transmit\n");
+ m_tx_active = false;
+ m_rts_timer->adjust(attotime::from_msec(500));
+ }
+}
+
+
+TIMER_CALLBACK_MEMBER(vsmile_ctrl_device_base::rts_timer_expired)
+{
+ assert(!m_tx_fifo_empty);
+ assert(!m_tx_active);
+
+ // clear out anything queued and let the implementation deal with it
+ if (!m_tx_fifo_empty)
+ {
+ unsigned const fifo_used((m_tx_fifo_tail + ARRAY_LENGTH(m_tx_fifo) - m_tx_fifo_head) % ARRAY_LENGTH(m_tx_fifo));
+ LOG("timeout waiting for select after asserting RTS (%u bytes queued)\n", fifo_used);
+ m_tx_fifo_head = m_tx_fifo_tail = 0U;
+ m_tx_fifo_empty = true;
+ tx_timeout();
+ if (m_tx_fifo_empty)
+ rts_out(0);
+ }
+}
+
+
+#include "pad.h"
+
+void vsmile_controllers(device_slot_interface &device)
+{
+ device.option_add("joy", VSMILE_PAD);
+}
diff --git a/src/devices/bus/vsmile/vsmile_ctrl.h b/src/devices/bus/vsmile/vsmile_ctrl.h
new file mode 100644
index 00000000000..66921ce817a
--- /dev/null
+++ b/src/devices/bus/vsmile/vsmile_ctrl.h
@@ -0,0 +1,153 @@
+// license:BSD-3-Clause
+// copyright-holders:Vas Crabb
+#ifndef MAME_BUS_VSMILE_VSMILE_CTRL_H
+#define MAME_BUS_VSMILE_VSMILE_CTRL_H
+
+#pragma once
+
+
+/***************************************************************************
+ FORWARD DECLARATIONS
+ ***************************************************************************/
+
+class vsmile_ctrl_port_device;
+
+
+/***************************************************************************
+ TYPE DEFINITIONS
+ ***************************************************************************/
+
+// ======================> device_vsmile_ctrl_interface
+
+class device_vsmile_ctrl_interface : public device_slot_card_interface
+{
+public:
+ virtual ~device_vsmile_ctrl_interface();
+
+protected:
+ device_vsmile_ctrl_interface(machine_config const &mconfig, device_t &device);
+
+ // device_interface implementation
+ virtual void interface_validity_check(validity_checker &valid) const override ATTR_COLD;
+ virtual void interface_pre_start() override;
+
+ // otuput signals
+ void rts_out(int state);
+ void data_out(uint8_t data);
+
+private:
+ // input signal handlers for implementataions to override
+ virtual void select_w(int state) = 0;
+ virtual void data_w(uint8_t data) = 0;
+
+ vsmile_ctrl_port_device *const m_port;
+
+ friend class vsmile_ctrl_port_device;
+};
+
+
+// ======================> vsmile_ctrl_port_device
+
+class vsmile_ctrl_port_device : public device_t, public device_slot_interface
+{
+public:
+ // configuration
+ auto rts_cb() { return m_rts_cb.bind(); }
+ auto data_cb() { return m_data_cb.bind(); }
+
+ // construction/destruction
+ template <typename T>
+ vsmile_ctrl_port_device(machine_config const &mconfig, char const *tag, device_t *owner, T &&opts, char const *dflt)
+ : vsmile_ctrl_port_device(mconfig, tag, owner, 0U)
+ {
+ option_reset();
+ opts(*this);
+ set_default_option(dflt);
+ set_fixed(false);
+ }
+ vsmile_ctrl_port_device(machine_config const &mconfig, char const *tag, device_t *owner, uint32_t clock = 0U);
+ virtual ~vsmile_ctrl_port_device();
+
+ // input signals
+ void select_w(int state) { if (m_device) m_device->select_w(state); }
+ void data_w(uint8_t data) { if (m_device) m_device->data_w(data); }
+
+protected:
+ // device_t implementation
+ virtual void device_validity_check(validity_checker &valid) const override ATTR_COLD;
+ virtual void device_resolve_objects() override;
+ virtual void device_start() override;
+
+private:
+ device_vsmile_ctrl_interface *m_device;
+ devcb_write_line m_rts_cb;
+ devcb_write8 m_data_cb;
+
+ friend class device_vsmile_ctrl_interface;
+};
+
+
+// ======================> vsmile_ctrl_device_base
+
+class vsmile_ctrl_device_base : public device_t, public device_vsmile_ctrl_interface
+{
+public:
+ // destruction
+ virtual ~vsmile_ctrl_device_base();
+
+protected:
+ // construction
+ vsmile_ctrl_device_base(machine_config const &mconfig, device_type type, char const *tag, device_t *owner, uint32_t clock);
+
+ // device_t implementation
+ virtual void device_start() override;
+
+ // UART simulation helpers
+ bool is_tx_empty() const { return m_tx_fifo_empty; }
+ bool queue_tx(uint8_t data);
+
+private:
+ // device_vsmile_ctrl_interfaceA implementation
+ virtual void select_w(int state) override;
+ virtual void data_w(uint8_t data) override;
+
+ // UART simulation handlers
+ virtual void tx_complete() = 0;
+ virtual void tx_timeout() = 0;
+ virtual void rx_complete(uint8_t data, bool select) = 0;
+
+ // internal helpers
+ TIMER_CALLBACK_MEMBER(tx_timer_expired);
+ TIMER_CALLBACK_MEMBER(rts_timer_expired);
+
+ emu_timer *m_tx_timer, *m_rts_timer;
+
+ uint8_t m_tx_fifo[32];
+ uint8_t m_tx_fifo_head, m_tx_fifo_tail;
+ bool m_tx_fifo_empty, m_tx_active;
+ bool m_select;
+};
+
+
+/***************************************************************************
+ INLINE FUNCTIONS
+ ***************************************************************************/
+
+inline void device_vsmile_ctrl_interface::rts_out(int state) { m_port->m_rts_cb(state); }
+inline void device_vsmile_ctrl_interface::data_out(uint8_t data) { m_port->m_data_cb(data); }
+
+
+/***************************************************************************
+ FUNCTIONS
+ ***************************************************************************/
+
+void vsmile_controllers(device_slot_interface &device);
+
+
+/***************************************************************************
+ DEVICE TYPES
+ ***************************************************************************/
+
+DECLARE_DEVICE_TYPE(VSMILE_CTRL_PORT, vsmile_ctrl_port_device)
+
+#endif // MAME_BUS_VSMILE_VSMILE_CTRL_H
diff --git a/src/devices/bus/vsmile/vsmile_slot.cpp b/src/devices/bus/vsmile/vsmile_slot.cpp
new file mode 100644
index 00000000000..61d7873b63f
--- /dev/null
+++ b/src/devices/bus/vsmile/vsmile_slot.cpp
@@ -0,0 +1,254 @@
+// license:BSD-3-Clause
+// copyright-holders:Ryan Holtz
+/***********************************************************************************************************
+
+ V.Smile cart emulation
+ (through slot devices)
+
+ ***********************************************************************************************************/
+
+
+#include "emu.h"
+#include "vsmile_slot.h"
+
+//**************************************************************************
+// GLOBAL VARIABLES
+//**************************************************************************
+
+DEFINE_DEVICE_TYPE(VSMILE_CART_SLOT, vsmile_cart_slot_device, "vsmile_cart_slot", "V.Smile Cartridge Slot")
+
+//**************************************************************************
+// V.Smile cartridge interface
+//**************************************************************************
+
+//-------------------------------------------------
+// device_vsmile_cart_interface - constructor
+//-------------------------------------------------
+
+device_vsmile_cart_interface::device_vsmile_cart_interface(const machine_config &mconfig, device_t &device)
+ : device_slot_card_interface(mconfig, device)
+ , m_rom(nullptr)
+ , m_rom_size(0)
+{
+}
+
+
+//-------------------------------------------------
+// ~device_vsmile_cart_interface - destructor
+//-------------------------------------------------
+
+device_vsmile_cart_interface::~device_vsmile_cart_interface()
+{
+}
+
+//-------------------------------------------------
+// rom_alloc - alloc the space for the cart
+//-------------------------------------------------
+
+void device_vsmile_cart_interface::rom_alloc(uint32_t size, const char *tag)
+{
+ if (m_rom == nullptr)
+ {
+ // We always alloc 8MB of ROM region
+ m_rom = (uint16_t *)device().machine().memory().region_alloc(std::string(tag).append(VSMILE_SLOT_ROM_REGION_TAG).c_str(), size, 2, ENDIANNESS_BIG)->base();
+ m_rom_size = size;
+ }
+}
+
+
+//-------------------------------------------------
+// nvram_alloc - alloc the space for the nvram
+//-------------------------------------------------
+
+void device_vsmile_cart_interface::nvram_alloc(uint32_t size)
+{
+ m_nvram.resize(size / sizeof(uint16_t));
+}
+
+
+//**************************************************************************
+// LIVE DEVICE
+//**************************************************************************
+
+//-------------------------------------------------
+// vsmile_cart_slot_device - constructor
+//-------------------------------------------------
+vsmile_cart_slot_device::vsmile_cart_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) :
+ device_t(mconfig, VSMILE_CART_SLOT, tag, owner, clock),
+ device_image_interface(mconfig, *this),
+ device_slot_interface(mconfig, *this),
+ m_type(VSMILE_STD),
+ m_cart(nullptr)
+{
+}
+
+
+//-------------------------------------------------
+// vsmile_cart_slot_device - destructor
+//-------------------------------------------------
+
+vsmile_cart_slot_device::~vsmile_cart_slot_device()
+{
+}
+
+//-------------------------------------------------
+// device_start - device-specific startup
+//-------------------------------------------------
+
+void vsmile_cart_slot_device::device_start()
+{
+ m_cart = dynamic_cast<device_vsmile_cart_interface *>(get_card_device());
+}
+
+
+//-------------------------------------------------
+// V.Smile PCB
+//-------------------------------------------------
+
+struct vsmile_slot
+{
+ int pcb_id;
+ const char *slot_option;
+};
+
+// Here, we take the feature attribute from .xml (i.e. the PCB name) and we assign a unique ID to it
+static const vsmile_slot slot_list[] =
+{
+ { VSMILE_STD, "vsmile_rom" },
+ { VSMILE_NVRAM, "vsmile_nvram" },
+};
+
+static int vsmile_get_pcb_id(const char *slot)
+{
+ for (auto & elem : slot_list)
+ {
+ if (!core_stricmp(elem.slot_option, slot))
+ return elem.pcb_id;
+ }
+
+ return 0;
+}
+
+/*-------------------------------------------------
+ call load
+ -------------------------------------------------*/
+
+image_init_result vsmile_cart_slot_device::call_load()
+{
+ if (m_cart)
+ {
+ uint32_t size = loaded_through_softlist() ? get_software_region_length("rom") : length();
+ if (size > 0x1000000)
+ {
+ seterror(IMAGE_ERROR_UNSPECIFIED, "Attempted loading a cart larger than 16MB");
+ return image_init_result::FAIL;
+ }
+
+ m_cart->rom_alloc(size, tag());
+ uint8_t *rom = (uint8_t *)m_cart->get_rom_base();
+
+ if (!loaded_through_softlist())
+ {
+ fread(rom, size);
+ m_type = VSMILE_STD;
+ }
+ else
+ {
+ const char *pcb_name = get_feature("slot");
+
+ memcpy(rom, get_software_region("rom"), size);
+
+ if (pcb_name)
+ m_type = vsmile_get_pcb_id(pcb_name);
+
+ osd_printf_info("V.Smile: Detected (XML) %s\n", pcb_name ? pcb_name : "NONE");
+ }
+
+ if (m_type == VSMILE_NVRAM)
+ {
+ m_cart->nvram_alloc(0x200000);
+ }
+
+ if (m_cart->get_nvram_size())
+ {
+ battery_load(m_cart->get_nvram_base(), m_cart->get_nvram_size(), 0x00);
+ }
+
+ return image_init_result::PASS;
+ }
+
+ return image_init_result::PASS;
+}
+
+
+/*-------------------------------------------------
+ call_unload
+ -------------------------------------------------*/
+
+void vsmile_cart_slot_device::call_unload()
+{
+ if (m_cart && m_cart->get_nvram_size())
+ {
+ battery_save(m_cart->get_nvram_base(), m_cart->get_nvram_size());
+ }
+}
+
+
+/*-------------------------------------------------
+ get default card software
+ -------------------------------------------------*/
+
+std::string vsmile_cart_slot_device::get_default_card_software(get_default_card_software_hook &hook) const
+{
+ return software_get_default_slot("vsmile_rom");
+}
+
+
+/*-------------------------------------------------
+ cart accessors
+ -------------------------------------------------*/
+
+READ16_MEMBER(vsmile_cart_slot_device::bank0_r)
+{
+ return m_cart->bank0_r(space, offset, mem_mask);
+}
+
+READ16_MEMBER(vsmile_cart_slot_device::bank1_r)
+{
+ return m_cart->bank1_r(space, offset, mem_mask);
+}
+
+READ16_MEMBER(vsmile_cart_slot_device::bank2_r)
+{
+ return m_cart->bank2_r(space, offset, mem_mask);
+}
+
+READ16_MEMBER(vsmile_cart_slot_device::bank3_r)
+{
+ return m_cart->bank3_r(space, offset, mem_mask);
+}
+
+WRITE16_MEMBER(vsmile_cart_slot_device::bank0_w)
+{
+ m_cart->bank0_w(space, offset, data, mem_mask);
+}
+
+WRITE16_MEMBER(vsmile_cart_slot_device::bank1_w)
+{
+ m_cart->bank1_w(space, offset, data, mem_mask);
+}
+
+WRITE16_MEMBER(vsmile_cart_slot_device::bank2_w)
+{
+ m_cart->bank2_w(space, offset, data, mem_mask);
+}
+
+WRITE16_MEMBER(vsmile_cart_slot_device::bank3_w)
+{
+ m_cart->bank3_w(space, offset, data, mem_mask);
+}
+
+void vsmile_cart_slot_device::set_cs2(bool cs2)
+{
+ m_cart->set_cs2(cs2);
+}
diff --git a/src/devices/bus/vsmile/vsmile_slot.h b/src/devices/bus/vsmile/vsmile_slot.h
new file mode 100644
index 00000000000..7d800677214
--- /dev/null
+++ b/src/devices/bus/vsmile/vsmile_slot.h
@@ -0,0 +1,128 @@
+// license:BSD-3-Clause
+// copyright-holders:Ryan Holtz
+#ifndef MAME_BUS_VSMILE_VSMILE_SLOT_H
+#define MAME_BUS_VSMILE_VSMILE_SLOT_H
+
+#pragma once
+
+#include "softlist_dev.h"
+
+
+/***************************************************************************
+ TYPE DEFINITIONS
+ ***************************************************************************/
+
+#define VSMILE_SLOT_ROM_REGION_TAG ":cart:rom"
+
+enum
+{
+ VSMILE_STD = 0,
+ VSMILE_NVRAM
+};
+
+// ======================> device_vsmile_cart_interface
+
+class device_vsmile_cart_interface : public device_slot_card_interface
+{
+public:
+ // construction/destruction
+ virtual ~device_vsmile_cart_interface();
+
+ // reading and writing
+ virtual DECLARE_READ16_MEMBER(bank0_r) { return 0; }
+ virtual DECLARE_READ16_MEMBER(bank1_r) { return 0; }
+ virtual DECLARE_READ16_MEMBER(bank2_r) { return 0; }
+ virtual DECLARE_READ16_MEMBER(bank3_r) { return 0; }
+ virtual DECLARE_WRITE16_MEMBER(bank0_w) { }
+ virtual DECLARE_WRITE16_MEMBER(bank1_w) { }
+ virtual DECLARE_WRITE16_MEMBER(bank2_w) { }
+ virtual DECLARE_WRITE16_MEMBER(bank3_w) { }
+
+ // banking
+ virtual void set_cs2(bool cs2) = 0;
+
+ void rom_alloc(uint32_t size, const char *tag);
+ void nvram_alloc(uint32_t size);
+ uint16_t* get_rom_base() { return m_rom; }
+ uint16_t* get_nvram_base() { return &m_nvram[0]; }
+ uint32_t get_rom_size() { return m_rom_size; }
+ uint32_t get_nvram_size() { return m_nvram.size() * sizeof(uint16_t); }
+ void set_rom_size(uint32_t val) { m_rom_size = val; }
+
+ void save_nvram() { device().save_item(NAME(m_nvram)); }
+
+protected:
+ device_vsmile_cart_interface(const machine_config &mconfig, device_t &device);
+
+ // internal state
+ uint16_t *m_rom; // this points to the cart rom region
+ uint32_t m_rom_size; // this is the actual game size, not the rom region size!
+ std::vector<uint16_t> m_nvram;
+};
+
+
+// ======================> vsmile_cart_slot_device
+
+class vsmile_cart_slot_device : public device_t,
+ public device_image_interface,
+ public device_slot_interface
+{
+public:
+ // construction/destruction
+ template <typename T>
+ vsmile_cart_slot_device(machine_config const &mconfig, char const *tag, device_t *owner, T &&opts, char const *dflt)
+ : vsmile_cart_slot_device(mconfig, tag, owner, (uint32_t)0)
+ {
+ option_reset();
+ opts(*this);
+ set_default_option(dflt);
+ set_fixed(false);
+ }
+ vsmile_cart_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+ virtual ~vsmile_cart_slot_device();
+
+ // device-level overrides
+ virtual void device_start() override;
+
+ // image-level overrides
+ virtual image_init_result call_load() override;
+ virtual void call_unload() override;
+ virtual const software_list_loader &get_software_list_loader() const override { return rom_software_list_loader::instance(); }
+
+ void save_nvram() { if (m_cart && m_cart->get_nvram_size()) m_cart->save_nvram(); }
+ uint32_t get_rom_size() { if (m_cart) return m_cart->get_rom_size(); return 0; }
+
+ virtual iodevice_t image_type() const override { return IO_CARTSLOT; }
+ virtual bool is_readable() const override { return 1; }
+ virtual bool is_writeable() const override { return 0; }
+ virtual bool is_creatable() const override { return 0; }
+ virtual bool must_be_loaded() const override { return 0; }
+ virtual bool is_reset_on_load() const override { return 1; }
+ virtual const char *image_interface() const override { return "vsmile_cart"; }
+ virtual const char *file_extensions() const override { return "u1,u3,bin"; }
+
+ // slot interface overrides
+ virtual std::string get_default_card_software(get_default_card_software_hook &hook) const override;
+
+ // reading and writing
+ virtual DECLARE_READ16_MEMBER(bank0_r);
+ virtual DECLARE_READ16_MEMBER(bank1_r);
+ virtual DECLARE_READ16_MEMBER(bank2_r);
+ virtual DECLARE_READ16_MEMBER(bank3_r);
+ virtual DECLARE_WRITE16_MEMBER(bank0_w);
+ virtual DECLARE_WRITE16_MEMBER(bank1_w);
+ virtual DECLARE_WRITE16_MEMBER(bank2_w);
+ virtual DECLARE_WRITE16_MEMBER(bank3_w);
+
+ // banking
+ void set_cs2(bool cs2);
+
+protected:
+ int m_type;
+ device_vsmile_cart_interface* m_cart;
+};
+
+// device type definition
+DECLARE_DEVICE_TYPE(VSMILE_CART_SLOT, vsmile_cart_slot_device)
+
+#endif // MAME_BUS_VSMILE_VSMILE_SLOT_H
diff --git a/src/devices/bus/vtech/ioexp/ioexp.cpp b/src/devices/bus/vtech/ioexp/ioexp.cpp
index c2916a0ba14..897b0dba95b 100644
--- a/src/devices/bus/vtech/ioexp/ioexp.cpp
+++ b/src/devices/bus/vtech/ioexp/ioexp.cpp
@@ -30,7 +30,7 @@ DEFINE_DEVICE_TYPE(VTECH_IOEXP_SLOT, vtech_ioexp_slot_device, "vtech_ioexp_slot"
vtech_ioexp_slot_device::vtech_ioexp_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) :
device_t(mconfig, VTECH_IOEXP_SLOT, tag, owner, clock),
device_slot_interface(mconfig, *this),
- m_io(nullptr),
+ m_io(*this, finder_base::DUMMY_TAG, -1),
m_cart(nullptr)
{
}
@@ -59,15 +59,6 @@ void vtech_ioexp_slot_device::device_reset()
{
}
-//-------------------------------------------------
-// set_io_space - set address space we are attached to
-//-------------------------------------------------
-
-void vtech_ioexp_slot_device::set_io_space(address_space *io)
-{
- m_io = io;
-}
-
//**************************************************************************
// CARTRIDGE INTERFACE
diff --git a/src/devices/bus/vtech/ioexp/ioexp.h b/src/devices/bus/vtech/ioexp/ioexp.h
index 0c2a3d2d431..9a78f861478 100644
--- a/src/devices/bus/vtech/ioexp/ioexp.h
+++ b/src/devices/bus/vtech/ioexp/ioexp.h
@@ -54,14 +54,14 @@ public:
vtech_ioexp_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
virtual ~vtech_ioexp_slot_device();
- void set_io_space(address_space *io);
+ template <typename T> void set_io_space(T &&tag, int spacenum) { m_io.set_tag(std::forward<T>(tag), spacenum); }
protected:
// device-level overrides
virtual void device_start() override;
virtual void device_reset() override;
- address_space *m_io;
+ required_address_space m_io;
device_vtech_ioexp_interface *m_cart;
};
diff --git a/src/devices/bus/vtech/ioexp/printer.cpp b/src/devices/bus/vtech/ioexp/printer.cpp
index 66967668703..b927f41d3c4 100644
--- a/src/devices/bus/vtech/ioexp/printer.cpp
+++ b/src/devices/bus/vtech/ioexp/printer.cpp
@@ -23,11 +23,14 @@ DEFINE_DEVICE_TYPE(VTECH_PRINTER_INTERFACE, vtech_printer_interface_device, "vte
// device_add_mconfig - add device configuration
//-------------------------------------------------
-MACHINE_CONFIG_START(vtech_printer_interface_device::device_add_mconfig)
- MCFG_DEVICE_ADD(m_centronics, CENTRONICS, centronics_devices, "printer")
- MCFG_CENTRONICS_BUSY_HANDLER(WRITELINE(*this, vtech_printer_interface_device, busy_w))
- MCFG_CENTRONICS_OUTPUT_LATCH_ADD("latch", "centronics")
-MACHINE_CONFIG_END
+void vtech_printer_interface_device::device_add_mconfig(machine_config &config)
+{
+ CENTRONICS(config, m_centronics, centronics_devices, "printer");
+ m_centronics->busy_handler().set(FUNC(vtech_printer_interface_device::busy_w));
+
+ OUTPUT_LATCH(config, m_latch);
+ m_centronics->set_output_latch(*m_latch);
+}
//**************************************************************************
diff --git a/src/devices/bus/vtech/memexp/floppy.cpp b/src/devices/bus/vtech/memexp/floppy.cpp
index bf7a3175594..5807588ec27 100644
--- a/src/devices/bus/vtech/memexp/floppy.cpp
+++ b/src/devices/bus/vtech/memexp/floppy.cpp
@@ -107,9 +107,6 @@ void vtech_floppy_controller_device::device_start()
void vtech_floppy_controller_device::device_reset()
{
- m_memexp->set_io_space(&io_space());
- m_memexp->set_program_space(&program_space());
-
program_space().install_rom(0x4000, 0x5fff, memregion("software")->base());
io_space().install_device(0x10, 0x1f, *this, &vtech_floppy_controller_device::map);
diff --git a/src/devices/bus/vtech/memexp/memexp.cpp b/src/devices/bus/vtech/memexp/memexp.cpp
index e7f61e5d048..90f51da7345 100644
--- a/src/devices/bus/vtech/memexp/memexp.cpp
+++ b/src/devices/bus/vtech/memexp/memexp.cpp
@@ -30,8 +30,8 @@ DEFINE_DEVICE_TYPE(VTECH_MEMEXP_SLOT, vtech_memexp_slot_device, "vtech_memexp_sl
vtech_memexp_slot_device::vtech_memexp_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) :
device_t(mconfig, VTECH_MEMEXP_SLOT, tag, owner, clock),
device_slot_interface(mconfig, *this),
- m_program(nullptr),
- m_io(nullptr),
+ m_program(*this, finder_base::DUMMY_TAG, -1),
+ m_io(*this, finder_base::DUMMY_TAG, -1),
m_cart(nullptr),
m_int_handler(*this),
m_nmi_handler(*this),
@@ -48,6 +48,28 @@ vtech_memexp_slot_device::~vtech_memexp_slot_device()
}
//-------------------------------------------------
+// device_config_complete - perform any
+// operations now that the configuration is
+// complete
+//-------------------------------------------------
+
+void vtech_memexp_slot_device::device_config_complete()
+{
+ // for passthrough connectors, use the parent slot's spaces
+ if (dynamic_cast<device_vtech_memexp_interface *>(owner()) != nullptr)
+ {
+ auto parent = dynamic_cast<vtech_memexp_slot_device *>(owner()->owner());
+ if (parent != nullptr)
+ {
+ if (m_program.finder_tag() == finder_base::DUMMY_TAG)
+ m_program.set_tag(parent->m_program, parent->m_program.spacenum());
+ if (m_io.finder_tag() == finder_base::DUMMY_TAG)
+ m_io.set_tag(parent->m_io, parent->m_io.spacenum());
+ }
+ }
+}
+
+//-------------------------------------------------
// device_start - device-specific startup
//-------------------------------------------------
@@ -67,24 +89,6 @@ void vtech_memexp_slot_device::device_reset()
{
}
-//-------------------------------------------------
-// set_program_space - set address space we are attached to
-//-------------------------------------------------
-
-void vtech_memexp_slot_device::set_program_space(address_space *program)
-{
- m_program = program;
-}
-
-//-------------------------------------------------
-// set_io_space - set address space we are attached to
-//-------------------------------------------------
-
-void vtech_memexp_slot_device::set_io_space(address_space *io)
-{
- m_io = io;
-}
-
//**************************************************************************
// CARTRIDGE INTERFACE
diff --git a/src/devices/bus/vtech/memexp/memexp.h b/src/devices/bus/vtech/memexp/memexp.h
index 097036bfd92..ca096075e90 100644
--- a/src/devices/bus/vtech/memexp/memexp.h
+++ b/src/devices/bus/vtech/memexp/memexp.h
@@ -61,8 +61,8 @@ public:
vtech_memexp_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
virtual ~vtech_memexp_slot_device();
- void set_program_space(address_space *program);
- void set_io_space(address_space *io);
+ template <typename T> void set_program_space(T &&tag, int spacenum) { m_program.set_tag(std::forward<T>(tag), spacenum); }
+ template <typename T> void set_io_space(T &&tag, int spacenum) { m_io.set_tag(std::forward<T>(tag), spacenum); }
// callbacks
auto int_handler() { return m_int_handler.bind(); }
@@ -76,11 +76,12 @@ public:
protected:
// device-level overrides
+ virtual void device_config_complete() override;
virtual void device_start() override;
virtual void device_reset() override;
- address_space *m_program;
- address_space *m_io;
+ required_address_space m_program;
+ required_address_space m_io;
device_vtech_memexp_interface *m_cart;
diff --git a/src/devices/bus/wangpc/emb.cpp b/src/devices/bus/wangpc/emb.cpp
index 8f555391bea..8a1817d1666 100644
--- a/src/devices/bus/wangpc/emb.cpp
+++ b/src/devices/bus/wangpc/emb.cpp
@@ -85,7 +85,7 @@ void wangpc_emb_device::device_reset()
// wangpcbus_mrdc_r - memory read
//-------------------------------------------------
-uint16_t wangpc_emb_device::wangpcbus_mrdc_r(address_space &space, offs_t offset, uint16_t mem_mask)
+uint16_t wangpc_emb_device::wangpcbus_mrdc_r(offs_t offset, uint16_t mem_mask)
{
uint16_t data = 0xffff;
@@ -105,7 +105,7 @@ uint16_t wangpc_emb_device::wangpcbus_mrdc_r(address_space &space, offs_t offset
// wangpcbus_amwc_w - memory write
//-------------------------------------------------
-void wangpc_emb_device::wangpcbus_amwc_w(address_space &space, offs_t offset, uint16_t mem_mask, uint16_t data)
+void wangpc_emb_device::wangpcbus_amwc_w(offs_t offset, uint16_t mem_mask, uint16_t data)
{
for (int bank = 0; bank < 4; bank++)
{
@@ -121,7 +121,7 @@ void wangpc_emb_device::wangpcbus_amwc_w(address_space &space, offs_t offset, ui
// wangpcbus_iorc_r - I/O read
//-------------------------------------------------
-uint16_t wangpc_emb_device::wangpcbus_iorc_r(address_space &space, offs_t offset, uint16_t mem_mask)
+uint16_t wangpc_emb_device::wangpcbus_iorc_r(offs_t offset, uint16_t mem_mask)
{
uint16_t data = 0xffff;
@@ -149,7 +149,7 @@ uint16_t wangpc_emb_device::wangpcbus_iorc_r(address_space &space, offs_t offset
// wangpcbus_aiowc_w - I/O write
//-------------------------------------------------
-void wangpc_emb_device::wangpcbus_aiowc_w(address_space &space, offs_t offset, uint16_t mem_mask, uint16_t data)
+void wangpc_emb_device::wangpcbus_aiowc_w(offs_t offset, uint16_t mem_mask, uint16_t data)
{
if (sad(offset))
{
diff --git a/src/devices/bus/wangpc/emb.h b/src/devices/bus/wangpc/emb.h
index bdaa7698b51..1e175ae6867 100644
--- a/src/devices/bus/wangpc/emb.h
+++ b/src/devices/bus/wangpc/emb.h
@@ -34,10 +34,10 @@ protected:
virtual void device_reset() override;
// device_wangpcbus_card_interface overrides
- virtual uint16_t wangpcbus_mrdc_r(address_space &space, offs_t offset, uint16_t mem_mask) override;
- virtual void wangpcbus_amwc_w(address_space &space, offs_t offset, uint16_t mem_mask, uint16_t data) override;
- virtual uint16_t wangpcbus_iorc_r(address_space &space, offs_t offset, uint16_t mem_mask) override;
- virtual void wangpcbus_aiowc_w(address_space &space, offs_t offset, uint16_t mem_mask, uint16_t data) override;
+ virtual uint16_t wangpcbus_mrdc_r(offs_t offset, uint16_t mem_mask) override;
+ virtual void wangpcbus_amwc_w(offs_t offset, uint16_t mem_mask, uint16_t data) override;
+ virtual uint16_t wangpcbus_iorc_r(offs_t offset, uint16_t mem_mask) override;
+ virtual void wangpcbus_aiowc_w(offs_t offset, uint16_t mem_mask, uint16_t data) override;
private:
optional_shared_ptr<uint16_t> m_ram;
diff --git a/src/devices/bus/wangpc/lic.cpp b/src/devices/bus/wangpc/lic.cpp
index 30694d7d7c8..f56c673fd26 100644
--- a/src/devices/bus/wangpc/lic.cpp
+++ b/src/devices/bus/wangpc/lic.cpp
@@ -50,9 +50,9 @@ const tiny_rom_entry *wangpc_lic_device::device_rom_region() const
// device_add_mconfig - add device configuration
//-------------------------------------------------
-MACHINE_CONFIG_START(wangpc_lic_device::device_add_mconfig)
-MACHINE_CONFIG_END
-
+void wangpc_lic_device::device_add_mconfig(machine_config &config)
+{
+}
//**************************************************************************
@@ -92,7 +92,7 @@ void wangpc_lic_device::device_reset()
// wangpcbus_mrdc_r - memory read
//-------------------------------------------------
-uint16_t wangpc_lic_device::wangpcbus_mrdc_r(address_space &space, offs_t offset, uint16_t mem_mask)
+uint16_t wangpc_lic_device::wangpcbus_mrdc_r(offs_t offset, uint16_t mem_mask)
{
uint16_t data = 0xffff;
@@ -104,7 +104,7 @@ uint16_t wangpc_lic_device::wangpcbus_mrdc_r(address_space &space, offs_t offset
// wangpcbus_amwc_w - memory write
//-------------------------------------------------
-void wangpc_lic_device::wangpcbus_amwc_w(address_space &space, offs_t offset, uint16_t mem_mask, uint16_t data)
+void wangpc_lic_device::wangpcbus_amwc_w(offs_t offset, uint16_t mem_mask, uint16_t data)
{
}
@@ -113,7 +113,7 @@ void wangpc_lic_device::wangpcbus_amwc_w(address_space &space, offs_t offset, ui
// wangpcbus_iorc_r - I/O read
//-------------------------------------------------
-uint16_t wangpc_lic_device::wangpcbus_iorc_r(address_space &space, offs_t offset, uint16_t mem_mask)
+uint16_t wangpc_lic_device::wangpcbus_iorc_r(offs_t offset, uint16_t mem_mask)
{
uint16_t data = 0xffff;
@@ -135,7 +135,7 @@ uint16_t wangpc_lic_device::wangpcbus_iorc_r(address_space &space, offs_t offset
// wangpcbus_aiowc_w - I/O write
//-------------------------------------------------
-void wangpc_lic_device::wangpcbus_aiowc_w(address_space &space, offs_t offset, uint16_t mem_mask, uint16_t data)
+void wangpc_lic_device::wangpcbus_aiowc_w(offs_t offset, uint16_t mem_mask, uint16_t data)
{
if (sad(offset))
{
diff --git a/src/devices/bus/wangpc/lic.h b/src/devices/bus/wangpc/lic.h
index f3a27f0bc77..8ead2c65f0a 100644
--- a/src/devices/bus/wangpc/lic.h
+++ b/src/devices/bus/wangpc/lic.h
@@ -36,10 +36,10 @@ protected:
virtual void device_add_mconfig(machine_config &config) override;
// device_wangpcbus_card_interface overrides
- virtual uint16_t wangpcbus_mrdc_r(address_space &space, offs_t offset, uint16_t mem_mask) override;
- virtual void wangpcbus_amwc_w(address_space &space, offs_t offset, uint16_t mem_mask, uint16_t data) override;
- virtual uint16_t wangpcbus_iorc_r(address_space &space, offs_t offset, uint16_t mem_mask) override;
- virtual void wangpcbus_aiowc_w(address_space &space, offs_t offset, uint16_t mem_mask, uint16_t data) override;
+ virtual uint16_t wangpcbus_mrdc_r(offs_t offset, uint16_t mem_mask) override;
+ virtual void wangpcbus_amwc_w(offs_t offset, uint16_t mem_mask, uint16_t data) override;
+ virtual uint16_t wangpcbus_iorc_r(offs_t offset, uint16_t mem_mask) override;
+ virtual void wangpcbus_aiowc_w(offs_t offset, uint16_t mem_mask, uint16_t data) override;
};
diff --git a/src/devices/bus/wangpc/lvc.cpp b/src/devices/bus/wangpc/lvc.cpp
index f4d05b8827d..0d316e5b15b 100644
--- a/src/devices/bus/wangpc/lvc.cpp
+++ b/src/devices/bus/wangpc/lvc.cpp
@@ -113,16 +113,17 @@ WRITE_LINE_MEMBER( wangpc_lvc_device::vsync_w )
}
//-------------------------------------------------
-// MACHINE_CONFIG_START( wangpc_lvc )
+// machine_config( wangpc_lvc )
//-------------------------------------------------
-MACHINE_CONFIG_START(wangpc_lvc_device::device_add_mconfig)
- MCFG_SCREEN_ADD(SCREEN_TAG, RASTER)
- MCFG_SCREEN_UPDATE_DEVICE(MC6845_TAG, mc6845_device, screen_update)
- MCFG_SCREEN_SIZE(80*8, 25*9)
- MCFG_SCREEN_VISIBLE_AREA(0, 80*8-1, 0, 25*9-1)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500))
- MCFG_SCREEN_REFRESH_RATE(60)
+void wangpc_lvc_device::device_add_mconfig(machine_config &config)
+{
+ screen_device &screen(SCREEN(config, SCREEN_TAG, SCREEN_TYPE_RASTER));
+ screen.set_screen_update(MC6845_TAG, FUNC(mc6845_device::screen_update));
+ screen.set_size(80*8, 25*9);
+ screen.set_visarea(0, 80*8-1, 0, 25*9-1);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500));
+ screen.set_refresh_hz(60);
MC6845_1(config, m_crtc, XTAL(14'318'181)/16);
m_crtc->set_screen(SCREEN_TAG);
@@ -130,7 +131,7 @@ MACHINE_CONFIG_START(wangpc_lvc_device::device_add_mconfig)
m_crtc->set_char_width(8);
m_crtc->set_update_row_callback(FUNC(wangpc_lvc_device::crtc_update_row), this);
m_crtc->out_vsync_callback().set(FUNC(wangpc_lvc_device::vsync_w));
-MACHINE_CONFIG_END
+}
@@ -202,7 +203,7 @@ void wangpc_lvc_device::device_reset()
// wangpcbus_mrdc_r - memory read
//-------------------------------------------------
-uint16_t wangpc_lvc_device::wangpcbus_mrdc_r(address_space &space, offs_t offset, uint16_t mem_mask)
+uint16_t wangpc_lvc_device::wangpcbus_mrdc_r(offs_t offset, uint16_t mem_mask)
{
uint16_t data = 0xffff;
@@ -221,7 +222,7 @@ uint16_t wangpc_lvc_device::wangpcbus_mrdc_r(address_space &space, offs_t offset
// wangpcbus_amwc_w - memory write
//-------------------------------------------------
-void wangpc_lvc_device::wangpcbus_amwc_w(address_space &space, offs_t offset, uint16_t mem_mask, uint16_t data)
+void wangpc_lvc_device::wangpcbus_amwc_w(offs_t offset, uint16_t mem_mask, uint16_t data)
{
if (OPTION_VRAM && (offset >= 0xe0000/2) && (offset < 0xf0000/2))
{
@@ -236,7 +237,7 @@ void wangpc_lvc_device::wangpcbus_amwc_w(address_space &space, offs_t offset, ui
// wangpcbus_iorc_r - I/O read
//-------------------------------------------------
-uint16_t wangpc_lvc_device::wangpcbus_iorc_r(address_space &space, offs_t offset, uint16_t mem_mask)
+uint16_t wangpc_lvc_device::wangpcbus_iorc_r(offs_t offset, uint16_t mem_mask)
{
uint16_t data = 0xffff;
@@ -245,7 +246,7 @@ uint16_t wangpc_lvc_device::wangpcbus_iorc_r(address_space &space, offs_t offset
switch (offset & 0x7f)
{
case 0x02/2:
- data = 0xff00 | m_crtc->register_r(space, 0);
+ data = 0xff00 | m_crtc->register_r();
break;
case 0x30/2:
@@ -269,7 +270,7 @@ uint16_t wangpc_lvc_device::wangpcbus_iorc_r(address_space &space, offs_t offset
// wangpcbus_aiowc_w - I/O write
//-------------------------------------------------
-void wangpc_lvc_device::wangpcbus_aiowc_w(address_space &space, offs_t offset, uint16_t mem_mask, uint16_t data)
+void wangpc_lvc_device::wangpcbus_aiowc_w(offs_t offset, uint16_t mem_mask, uint16_t data)
{
if (sad(offset))
{
@@ -278,14 +279,14 @@ void wangpc_lvc_device::wangpcbus_aiowc_w(address_space &space, offs_t offset, u
case 0x00/2:
if (ACCESSING_BITS_0_7)
{
- m_crtc->address_w(space, 0, data & 0xff);
+ m_crtc->address_w(data & 0xff);
}
break;
case 0x02/2:
if (ACCESSING_BITS_0_7)
{
- m_crtc->register_w(space, 0, data & 0xff);
+ m_crtc->register_w(data & 0xff);
}
break;
diff --git a/src/devices/bus/wangpc/lvc.h b/src/devices/bus/wangpc/lvc.h
index 7b4f9203007..3fa858adf1c 100644
--- a/src/devices/bus/wangpc/lvc.h
+++ b/src/devices/bus/wangpc/lvc.h
@@ -36,10 +36,10 @@ protected:
virtual void device_add_mconfig(machine_config &config) override;
// device_wangpcbus_card_interface overrides
- virtual uint16_t wangpcbus_mrdc_r(address_space &space, offs_t offset, uint16_t mem_mask) override;
- virtual void wangpcbus_amwc_w(address_space &space, offs_t offset, uint16_t mem_mask, uint16_t data) override;
- virtual uint16_t wangpcbus_iorc_r(address_space &space, offs_t offset, uint16_t mem_mask) override;
- virtual void wangpcbus_aiowc_w(address_space &space, offs_t offset, uint16_t mem_mask, uint16_t data) override;
+ virtual uint16_t wangpcbus_mrdc_r(offs_t offset, uint16_t mem_mask) override;
+ virtual void wangpcbus_amwc_w(offs_t offset, uint16_t mem_mask, uint16_t data) override;
+ virtual uint16_t wangpcbus_iorc_r(offs_t offset, uint16_t mem_mask) override;
+ virtual void wangpcbus_aiowc_w(offs_t offset, uint16_t mem_mask, uint16_t data) override;
private:
MC6845_UPDATE_ROW( crtc_update_row );
diff --git a/src/devices/bus/wangpc/mcc.cpp b/src/devices/bus/wangpc/mcc.cpp
index d5c8bf4b941..5b029ed38d2 100644
--- a/src/devices/bus/wangpc/mcc.cpp
+++ b/src/devices/bus/wangpc/mcc.cpp
@@ -52,7 +52,7 @@ DEFINE_DEVICE_TYPE(WANGPC_MCC, wangpc_mcc_device, "wangpc_mcc", "Wang PC-PM043 M
//-------------------------------------------------
-// MACHINE_CONFIG_START( wangpc_mcc )
+// machine_config( wangpc_mcc )
//-------------------------------------------------
void wangpc_mcc_device::device_add_mconfig(machine_config &config)
@@ -129,7 +129,7 @@ void wangpc_mcc_device::device_reset()
// wangpcbus_iorc_r - I/O read
//-------------------------------------------------
-uint16_t wangpc_mcc_device::wangpcbus_iorc_r(address_space &space, offs_t offset, uint16_t mem_mask)
+uint16_t wangpc_mcc_device::wangpcbus_iorc_r(offs_t offset, uint16_t mem_mask)
{
uint16_t data = 0xffff;
@@ -143,7 +143,7 @@ uint16_t wangpc_mcc_device::wangpcbus_iorc_r(address_space &space, offs_t offset
case 0x06/2:
if (ACCESSING_BITS_0_7)
{
- data = 0xff00 | m_sio->cd_ba_r(space, offset >> 1);
+ data = 0xff00 | m_sio->cd_ba_r(machine().dummy_space(), offset >> 1);
}
break;
@@ -153,7 +153,7 @@ uint16_t wangpc_mcc_device::wangpcbus_iorc_r(address_space &space, offs_t offset
case 0x0e/2:
if (ACCESSING_BITS_0_7)
{
- data = 0xff00 | m_dart->cd_ba_r(space, offset >> 1);
+ data = 0xff00 | m_dart->cd_ba_r(machine().dummy_space(), offset >> 1);
}
break;
@@ -198,7 +198,7 @@ uint16_t wangpc_mcc_device::wangpcbus_iorc_r(address_space &space, offs_t offset
// wangpcbus_aiowc_w - I/O write
//-------------------------------------------------
-void wangpc_mcc_device::wangpcbus_aiowc_w(address_space &space, offs_t offset, uint16_t mem_mask, uint16_t data)
+void wangpc_mcc_device::wangpcbus_aiowc_w(offs_t offset, uint16_t mem_mask, uint16_t data)
{
if (sad(offset) && ACCESSING_BITS_0_7)
{
@@ -208,14 +208,14 @@ void wangpc_mcc_device::wangpcbus_aiowc_w(address_space &space, offs_t offset, u
case 0x02/2:
case 0x04/2:
case 0x06/2:
- m_sio->cd_ba_w(space, offset >> 1, data & 0xff);
+ m_sio->cd_ba_w(machine().dummy_space(), offset >> 1, data & 0xff);
break;
case 0x08/2:
case 0x0a/2:
case 0x0c/2:
case 0x0e/2:
- m_dart->cd_ba_w(space, offset >> 1, data & 0xff);
+ m_dart->cd_ba_w(machine().dummy_space(), offset >> 1, data & 0xff);
break;
case 0x12/2:
diff --git a/src/devices/bus/wangpc/mcc.h b/src/devices/bus/wangpc/mcc.h
index d09f2e23cba..58b8931f5fa 100644
--- a/src/devices/bus/wangpc/mcc.h
+++ b/src/devices/bus/wangpc/mcc.h
@@ -36,8 +36,8 @@ protected:
virtual void device_add_mconfig(machine_config &config) override;
// device_wangpcbus_card_interface overrides
- virtual uint16_t wangpcbus_iorc_r(address_space &space, offs_t offset, uint16_t mem_mask) override;
- virtual void wangpcbus_aiowc_w(address_space &space, offs_t offset, uint16_t mem_mask, uint16_t data) override;
+ virtual uint16_t wangpcbus_iorc_r(offs_t offset, uint16_t mem_mask) override;
+ virtual void wangpcbus_aiowc_w(offs_t offset, uint16_t mem_mask, uint16_t data) override;
private:
inline void set_irq(int state);
diff --git a/src/devices/bus/wangpc/mvc.cpp b/src/devices/bus/wangpc/mvc.cpp
index 79999d72ade..af78d16cc29 100644
--- a/src/devices/bus/wangpc/mvc.cpp
+++ b/src/devices/bus/wangpc/mvc.cpp
@@ -133,16 +133,17 @@ WRITE_LINE_MEMBER( wangpc_mvc_device::vsync_w )
}
//-------------------------------------------------
-// MACHINE_CONFIG_START( wangpc_mvc )
+// machine_config( wangpc_mvc )
//-------------------------------------------------
-MACHINE_CONFIG_START(wangpc_mvc_device::device_add_mconfig)
- MCFG_SCREEN_ADD(SCREEN_TAG, RASTER)
- MCFG_SCREEN_UPDATE_DEVICE(MC6845_TAG, mc6845_device, screen_update)
- MCFG_SCREEN_SIZE(80*10, 25*12)
- MCFG_SCREEN_VISIBLE_AREA(0, 80*10-1, 0, 25*12-1)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500))
- MCFG_SCREEN_REFRESH_RATE(60)
+void wangpc_mvc_device::device_add_mconfig(machine_config &config)
+{
+ screen_device &screen(SCREEN(config, SCREEN_TAG, SCREEN_TYPE_RASTER));
+ screen.set_screen_update(MC6845_TAG, FUNC(mc6845_device::screen_update));
+ screen.set_size(80*10, 25*12);
+ screen.set_visarea(0, 80*10-1, 0, 25*12-1);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500));
+ screen.set_refresh_hz(60);
MC6845_1(config, m_crtc, XTAL(14'318'181)/16);
m_crtc->set_screen(SCREEN_TAG);
@@ -150,7 +151,7 @@ MACHINE_CONFIG_START(wangpc_mvc_device::device_add_mconfig)
m_crtc->set_char_width(10);
m_crtc->set_update_row_callback(FUNC(wangpc_mvc_device::crtc_update_row), this);
m_crtc->out_vsync_callback().set(FUNC(wangpc_mvc_device::vsync_w));
-MACHINE_CONFIG_END
+}
@@ -225,7 +226,7 @@ void wangpc_mvc_device::device_reset()
// wangpcbus_mrdc_r - memory read
//-------------------------------------------------
-uint16_t wangpc_mvc_device::wangpcbus_mrdc_r(address_space &space, offs_t offset, uint16_t mem_mask)
+uint16_t wangpc_mvc_device::wangpcbus_mrdc_r(offs_t offset, uint16_t mem_mask)
{
uint16_t data = 0xffff;
@@ -253,7 +254,7 @@ uint16_t wangpc_mvc_device::wangpcbus_mrdc_r(address_space &space, offs_t offset
// wangpcbus_amwc_w - memory write
//-------------------------------------------------
-void wangpc_mvc_device::wangpcbus_amwc_w(address_space &space, offs_t offset, uint16_t mem_mask, uint16_t data)
+void wangpc_mvc_device::wangpcbus_amwc_w(offs_t offset, uint16_t mem_mask, uint16_t data)
{
if (OPTION_VRAM)
{
@@ -277,7 +278,7 @@ void wangpc_mvc_device::wangpcbus_amwc_w(address_space &space, offs_t offset, ui
// wangpcbus_iorc_r - I/O read
//-------------------------------------------------
-uint16_t wangpc_mvc_device::wangpcbus_iorc_r(address_space &space, offs_t offset, uint16_t mem_mask)
+uint16_t wangpc_mvc_device::wangpcbus_iorc_r(offs_t offset, uint16_t mem_mask)
{
uint16_t data = 0xffff;
@@ -301,18 +302,18 @@ uint16_t wangpc_mvc_device::wangpcbus_iorc_r(address_space &space, offs_t offset
// wangpcbus_aiowc_w - I/O write
//-------------------------------------------------
-void wangpc_mvc_device::wangpcbus_aiowc_w(address_space &space, offs_t offset, uint16_t mem_mask, uint16_t data)
+void wangpc_mvc_device::wangpcbus_aiowc_w(offs_t offset, uint16_t mem_mask, uint16_t data)
{
if (sad(offset) && ACCESSING_BITS_0_7)
{
switch (offset & 0x7f)
{
case 0x00/2:
- m_crtc->address_w(space, 0, data & 0xff);
+ m_crtc->address_w(data & 0xff);
break;
case 0x02/2:
- m_crtc->register_w(space, 0, data & 0xff);
+ m_crtc->register_w(data & 0xff);
break;
case 0x10/2:
diff --git a/src/devices/bus/wangpc/mvc.h b/src/devices/bus/wangpc/mvc.h
index 4620126c04e..aee0cdf51b2 100644
--- a/src/devices/bus/wangpc/mvc.h
+++ b/src/devices/bus/wangpc/mvc.h
@@ -36,10 +36,10 @@ protected:
virtual void device_add_mconfig(machine_config &config) override;
// device_wangpcbus_card_interface overrides
- virtual uint16_t wangpcbus_mrdc_r(address_space &space, offs_t offset, uint16_t mem_mask) override;
- virtual void wangpcbus_amwc_w(address_space &space, offs_t offset, uint16_t mem_mask, uint16_t data) override;
- virtual uint16_t wangpcbus_iorc_r(address_space &space, offs_t offset, uint16_t mem_mask) override;
- virtual void wangpcbus_aiowc_w(address_space &space, offs_t offset, uint16_t mem_mask, uint16_t data) override;
+ virtual uint16_t wangpcbus_mrdc_r(offs_t offset, uint16_t mem_mask) override;
+ virtual void wangpcbus_amwc_w(offs_t offset, uint16_t mem_mask, uint16_t data) override;
+ virtual uint16_t wangpcbus_iorc_r(offs_t offset, uint16_t mem_mask) override;
+ virtual void wangpcbus_aiowc_w(offs_t offset, uint16_t mem_mask, uint16_t data) override;
private:
MC6845_UPDATE_ROW( crtc_update_row );
diff --git a/src/devices/bus/wangpc/rtc.cpp b/src/devices/bus/wangpc/rtc.cpp
index bdf392f9bed..4512939003f 100644
--- a/src/devices/bus/wangpc/rtc.cpp
+++ b/src/devices/bus/wangpc/rtc.cpp
@@ -214,7 +214,7 @@ void wangpc_rtc_device::device_reset()
// wangpcbus_mrdc_r - memory read
//-------------------------------------------------
-uint16_t wangpc_rtc_device::wangpcbus_mrdc_r(address_space &space, offs_t offset, uint16_t mem_mask)
+uint16_t wangpc_rtc_device::wangpcbus_mrdc_r(offs_t offset, uint16_t mem_mask)
{
uint16_t data = 0xffff;
@@ -226,7 +226,7 @@ uint16_t wangpc_rtc_device::wangpcbus_mrdc_r(address_space &space, offs_t offset
// wangpcbus_amwc_w - memory write
//-------------------------------------------------
-void wangpc_rtc_device::wangpcbus_amwc_w(address_space &space, offs_t offset, uint16_t mem_mask, uint16_t data)
+void wangpc_rtc_device::wangpcbus_amwc_w(offs_t offset, uint16_t mem_mask, uint16_t data)
{
}
@@ -235,7 +235,7 @@ void wangpc_rtc_device::wangpcbus_amwc_w(address_space &space, offs_t offset, ui
// wangpcbus_iorc_r - I/O read
//-------------------------------------------------
-uint16_t wangpc_rtc_device::wangpcbus_iorc_r(address_space &space, offs_t offset, uint16_t mem_mask)
+uint16_t wangpc_rtc_device::wangpcbus_iorc_r(offs_t offset, uint16_t mem_mask)
{
uint16_t data = 0xffff;
@@ -257,7 +257,7 @@ uint16_t wangpc_rtc_device::wangpcbus_iorc_r(address_space &space, offs_t offset
// wangpcbus_aiowc_w - I/O write
//-------------------------------------------------
-void wangpc_rtc_device::wangpcbus_aiowc_w(address_space &space, offs_t offset, uint16_t mem_mask, uint16_t data)
+void wangpc_rtc_device::wangpcbus_aiowc_w(offs_t offset, uint16_t mem_mask, uint16_t data)
{
if (sad(offset))
{
diff --git a/src/devices/bus/wangpc/rtc.h b/src/devices/bus/wangpc/rtc.h
index 4f0b22372f2..9233222a4f9 100644
--- a/src/devices/bus/wangpc/rtc.h
+++ b/src/devices/bus/wangpc/rtc.h
@@ -41,10 +41,10 @@ protected:
virtual ioport_constructor device_input_ports() const override;
// device_wangpcbus_card_interface overrides
- virtual uint16_t wangpcbus_mrdc_r(address_space &space, offs_t offset, uint16_t mem_mask) override;
- virtual void wangpcbus_amwc_w(address_space &space, offs_t offset, uint16_t mem_mask, uint16_t data) override;
- virtual uint16_t wangpcbus_iorc_r(address_space &space, offs_t offset, uint16_t mem_mask) override;
- virtual void wangpcbus_aiowc_w(address_space &space, offs_t offset, uint16_t mem_mask, uint16_t data) override;
+ virtual uint16_t wangpcbus_mrdc_r(offs_t offset, uint16_t mem_mask) override;
+ virtual void wangpcbus_amwc_w(offs_t offset, uint16_t mem_mask, uint16_t data) override;
+ virtual uint16_t wangpcbus_iorc_r(offs_t offset, uint16_t mem_mask) override;
+ virtual void wangpcbus_aiowc_w(offs_t offset, uint16_t mem_mask, uint16_t data) override;
private:
required_device<z80_device> m_maincpu;
diff --git a/src/devices/bus/wangpc/tig.cpp b/src/devices/bus/wangpc/tig.cpp
index e9170b420cc..f0c00ed3cc3 100644
--- a/src/devices/bus/wangpc/tig.cpp
+++ b/src/devices/bus/wangpc/tig.cpp
@@ -111,29 +111,30 @@ UPD7220_DISPLAY_PIXELS_MEMBER( wangpc_tig_device::hgdc_display_pixels )
//-------------------------------------------------
-// MACHINE_CONFIG_START( wangpc_tig )
+// machine_config( wangpc_tig )
//-------------------------------------------------
-MACHINE_CONFIG_START(wangpc_tig_device::device_add_mconfig)
- MCFG_SCREEN_ADD_MONOCHROME(SCREEN_TAG, RASTER, rgb_t::green())
- MCFG_SCREEN_UPDATE_DEVICE(DEVICE_SELF, wangpc_tig_device, screen_update)
- MCFG_SCREEN_SIZE(80*10, 25*12)
- MCFG_SCREEN_VISIBLE_AREA(0, 80*10-1, 0, 25*12-1)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500))
- MCFG_SCREEN_REFRESH_RATE(60)
+void wangpc_tig_device::device_add_mconfig(machine_config &config)
+{
+ screen_device &screen(SCREEN(config, SCREEN_TAG, SCREEN_TYPE_RASTER, rgb_t::green()));
+ screen.set_screen_update(FUNC(wangpc_tig_device::screen_update));
+ screen.set_size(80*10, 25*12);
+ screen.set_visarea(0, 80*10-1, 0, 25*12-1);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500));
+ screen.set_refresh_hz(60);
PALETTE(config, m_palette, palette_device::MONOCHROME_HIGHLIGHT);
UPD7220(config, m_hgdc0, XTAL(52'832'000)/28);
m_hgdc0->set_addrmap(0, &wangpc_tig_device::upd7220_0_map);
- m_hgdc0->set_draw_text_callback(FUNC(wangpc_tig_device::hgdc_draw_text), this);
+ m_hgdc0->set_draw_text(FUNC(wangpc_tig_device::hgdc_draw_text));
m_hgdc0->set_screen(SCREEN_TAG);
UPD7220(config, m_hgdc1, XTAL(52'832'000)/28);
m_hgdc1->set_addrmap(0, &wangpc_tig_device::upd7220_1_map);
- m_hgdc1->set_display_pixels_callback(FUNC(wangpc_tig_device::hgdc_display_pixels), this);
+ m_hgdc1->set_display_pixels(FUNC(wangpc_tig_device::hgdc_display_pixels));
m_hgdc1->set_screen(SCREEN_TAG);
-MACHINE_CONFIG_END
+}
//**************************************************************************
@@ -195,7 +196,7 @@ uint32_t wangpc_tig_device::screen_update(screen_device &screen, bitmap_rgb32 &b
// wangpcbus_iorc_r - I/O read
//-------------------------------------------------
-uint16_t wangpc_tig_device::wangpcbus_iorc_r(address_space &space, offs_t offset, uint16_t mem_mask)
+uint16_t wangpc_tig_device::wangpcbus_iorc_r(offs_t offset, uint16_t mem_mask)
{
uint16_t data = 0xffff;
@@ -205,12 +206,12 @@ uint16_t wangpc_tig_device::wangpcbus_iorc_r(address_space &space, offs_t offset
{
case 0x20/2:
case 0x22/2:
- data = m_hgdc0->read(space, offset);
+ data = m_hgdc0->read(offset);
break;
case 0x24/2:
case 0x26/2:
- data = m_hgdc1->read(space, offset);
+ data = m_hgdc1->read(offset);
break;
case 0xfe/2:
@@ -227,7 +228,7 @@ uint16_t wangpc_tig_device::wangpcbus_iorc_r(address_space &space, offs_t offset
// wangpcbus_aiowc_w - I/O write
//-------------------------------------------------
-void wangpc_tig_device::wangpcbus_aiowc_w(address_space &space, offs_t offset, uint16_t mem_mask, uint16_t data)
+void wangpc_tig_device::wangpcbus_aiowc_w(offs_t offset, uint16_t mem_mask, uint16_t data)
{
if (sad(offset) && ACCESSING_BITS_0_7)
{
@@ -242,12 +243,12 @@ void wangpc_tig_device::wangpcbus_aiowc_w(address_space &space, offs_t offset, u
case 0x20/2:
case 0x22/2:
- m_hgdc0->write(space, offset, data);
+ m_hgdc0->write(offset, data);
break;
case 0x24/2:
case 0x26/2:
- m_hgdc1->write(space, offset, data);
+ m_hgdc1->write(offset, data);
break;
case 0x28/2:
@@ -274,17 +275,17 @@ void wangpc_tig_device::wangpcbus_aiowc_w(address_space &space, offs_t offset, u
// wangpcbus_dack_r - DMA read
//-------------------------------------------------
-uint8_t wangpc_tig_device::wangpcbus_dack_r(address_space &space, int line)
+uint8_t wangpc_tig_device::wangpcbus_dack_r(int line)
{
uint8_t data;
if (DMA_GRAPHICS)
{
- data = m_hgdc1->dack_r(space, 0);
+ data = m_hgdc1->dack_r();
}
else
{
- data = m_hgdc0->dack_r(space, 0);
+ data = m_hgdc0->dack_r();
}
return data;
@@ -295,15 +296,15 @@ uint8_t wangpc_tig_device::wangpcbus_dack_r(address_space &space, int line)
// wangpcbus_dack_w - DMA write
//-------------------------------------------------
-void wangpc_tig_device::wangpcbus_dack_w(address_space &space, int line, uint8_t data)
+void wangpc_tig_device::wangpcbus_dack_w(int line, uint8_t data)
{
if (DMA_GRAPHICS)
{
- m_hgdc1->dack_w(space, 0, data);
+ m_hgdc1->dack_w(data);
}
else
{
- m_hgdc0->dack_w(space, 0, data);
+ m_hgdc0->dack_w(data);
}
}
diff --git a/src/devices/bus/wangpc/tig.h b/src/devices/bus/wangpc/tig.h
index 4a86f6ecb40..0e95eb42676 100644
--- a/src/devices/bus/wangpc/tig.h
+++ b/src/devices/bus/wangpc/tig.h
@@ -38,10 +38,10 @@ protected:
virtual void device_add_mconfig(machine_config &config) override;
// device_wangpcbus_card_interface overrides
- virtual uint16_t wangpcbus_iorc_r(address_space &space, offs_t offset, uint16_t mem_mask) override;
- virtual void wangpcbus_aiowc_w(address_space &space, offs_t offset, uint16_t mem_mask, uint16_t data) override;
- virtual uint8_t wangpcbus_dack_r(address_space &space, int line) override;
- virtual void wangpcbus_dack_w(address_space &space, int line, uint8_t data) override;
+ virtual uint16_t wangpcbus_iorc_r(offs_t offset, uint16_t mem_mask) override;
+ virtual void wangpcbus_aiowc_w(offs_t offset, uint16_t mem_mask, uint16_t data) override;
+ virtual uint8_t wangpcbus_dack_r(int line) override;
+ virtual void wangpcbus_dack_w(int line, uint8_t data) override;
virtual bool wangpcbus_have_dack(int line) override;
private:
diff --git a/src/devices/bus/wangpc/wangpc.cpp b/src/devices/bus/wangpc/wangpc.cpp
index 36ed25bfdff..540ed94c1b3 100644
--- a/src/devices/bus/wangpc/wangpc.cpp
+++ b/src/devices/bus/wangpc/wangpc.cpp
@@ -104,7 +104,7 @@ void wangpcbus_device::add_card(device_wangpcbus_card_interface *card, int sid)
// mrdc_r - memory read
//-------------------------------------------------
-READ16_MEMBER( wangpcbus_device::mrdc_r )
+uint16_t wangpcbus_device::mrdc_r(offs_t offset, uint16_t mem_mask)
{
uint16_t data = 0xffff;
@@ -112,7 +112,7 @@ READ16_MEMBER( wangpcbus_device::mrdc_r )
while (entry)
{
- data &= entry->wangpcbus_mrdc_r(space, offset + 0x40000/2, mem_mask);
+ data &= entry->wangpcbus_mrdc_r(offset + 0x40000/2, mem_mask);
entry = entry->next();
}
@@ -124,13 +124,13 @@ READ16_MEMBER( wangpcbus_device::mrdc_r )
// amwc_w - memory write
//-------------------------------------------------
-WRITE16_MEMBER( wangpcbus_device::amwc_w )
+void wangpcbus_device::amwc_w(offs_t offset, uint16_t data, uint16_t mem_mask)
{
device_wangpcbus_card_interface *entry = m_device_list.first();
while (entry)
{
- entry->wangpcbus_amwc_w(space, offset + 0x40000/2, mem_mask, data);
+ entry->wangpcbus_amwc_w(offset + 0x40000/2, mem_mask, data);
entry = entry->next();
}
}
@@ -140,7 +140,7 @@ WRITE16_MEMBER( wangpcbus_device::amwc_w )
// sad_r - I/O read
//-------------------------------------------------
-READ16_MEMBER( wangpcbus_device::sad_r )
+uint16_t wangpcbus_device::sad_r(offs_t offset, uint16_t mem_mask)
{
uint16_t data = 0xffff;
@@ -148,7 +148,7 @@ READ16_MEMBER( wangpcbus_device::sad_r )
while (entry)
{
- data &= entry->wangpcbus_iorc_r(space, offset + 0x1100/2, mem_mask);
+ data &= entry->wangpcbus_iorc_r(offset + 0x1100/2, mem_mask);
entry = entry->next();
}
@@ -160,13 +160,13 @@ READ16_MEMBER( wangpcbus_device::sad_r )
// sad_w - I/O write
//-------------------------------------------------
-WRITE16_MEMBER( wangpcbus_device::sad_w )
+void wangpcbus_device::sad_w(offs_t offset, uint16_t data, uint16_t mem_mask)
{
device_wangpcbus_card_interface *entry = m_device_list.first();
while (entry)
{
- entry->wangpcbus_aiowc_w(space, offset + 0x1100/2, mem_mask, data);
+ entry->wangpcbus_aiowc_w(offset + 0x1100/2, mem_mask, data);
entry = entry->next();
}
}
@@ -176,7 +176,7 @@ WRITE16_MEMBER( wangpcbus_device::sad_w )
// dack_r - DMA read
//-------------------------------------------------
-uint8_t wangpcbus_device::dack_r(address_space &space, int line)
+uint8_t wangpcbus_device::dack_r(int line)
{
uint8_t retVal = 0xff;
device_wangpcbus_card_interface *entry = m_device_list.first();
@@ -185,7 +185,7 @@ uint8_t wangpcbus_device::dack_r(address_space &space, int line)
{
if (entry->wangpcbus_have_dack(line))
{
- retVal = entry->wangpcbus_dack_r(space, line);
+ retVal = entry->wangpcbus_dack_r(line);
break;
}
@@ -200,7 +200,7 @@ uint8_t wangpcbus_device::dack_r(address_space &space, int line)
// dack_w - DMA write
//-------------------------------------------------
-void wangpcbus_device::dack_w(address_space &space, int line, uint8_t data)
+void wangpcbus_device::dack_w(int line, uint8_t data)
{
device_wangpcbus_card_interface *entry = m_device_list.first();
@@ -208,7 +208,7 @@ void wangpcbus_device::dack_w(address_space &space, int line, uint8_t data)
{
if (entry->wangpcbus_have_dack(line))
{
- entry->wangpcbus_dack_w(space, line, data);
+ entry->wangpcbus_dack_w(line, data);
}
entry = entry->next();
diff --git a/src/devices/bus/wangpc/wangpc.h b/src/devices/bus/wangpc/wangpc.h
index 1f10892f7fc..bb8c7a3c4ac 100644
--- a/src/devices/bus/wangpc/wangpc.h
+++ b/src/devices/bus/wangpc/wangpc.h
@@ -24,51 +24,6 @@
#define WANGPC_BUS_TAG "wangpcbus"
-
-//**************************************************************************
-// INTERFACE CONFIGURATION MACROS
-//**************************************************************************
-
-#define MCFG_WANGPC_BUS_ADD() \
- MCFG_DEVICE_ADD(WANGPC_BUS_TAG, WANGPC_BUS, 0)
-
-#define MCFG_WANGPC_BUS_SLOT_ADD(_tag, _sid, _slot_intf, _def_slot) \
- MCFG_DEVICE_ADD(_tag, WANGPC_BUS_SLOT, 0) \
- MCFG_DEVICE_SLOT_INTERFACE(_slot_intf, _def_slot, false) \
- downcast<wangpcbus_slot_device &>(*device).set_wangpcbus_slot(_sid);
-
-
-#define MCFG_WANGPC_BUS_IRQ2_CALLBACK(_write) \
- downcast<wangpcbus_device &>(*device).set_irq2_wr_callback(DEVCB_##_write);
-
-#define MCFG_WANGPC_BUS_IRQ3_CALLBACK(_write) \
- downcast<wangpcbus_device &>(*device).set_irq3_wr_callback(DEVCB_##_write);
-
-#define MCFG_WANGPC_BUS_IRQ4_CALLBACK(_write) \
- downcast<wangpcbus_device &>(*device).set_irq4_wr_callback(DEVCB_##_write);
-
-#define MCFG_WANGPC_BUS_IRQ5_CALLBACK(_write) \
- downcast<wangpcbus_device &>(*device).set_irq5_wr_callback(DEVCB_##_write);
-
-#define MCFG_WANGPC_BUS_IRQ6_CALLBACK(_write) \
- downcast<wangpcbus_device &>(*device).set_irq6_wr_callback(DEVCB_##_write);
-
-#define MCFG_WANGPC_BUS_IRQ7_CALLBACK(_write) \
- downcast<wangpcbus_device &>(*device).set_irq7_wr_callback(DEVCB_##_write);
-
-#define MCFG_WANGPC_BUS_DRQ1_CALLBACK(_write) \
- downcast<wangpcbus_device &>(*device).set_drq1_wr_callback(DEVCB_##_write);
-
-#define MCFG_WANGPC_BUS_DRQ2_CALLBACK(_write) \
- downcast<wangpcbus_device &>(*device).set_drq2_wr_callback(DEVCB_##_write);
-
-#define MCFG_WANGPC_BUS_DRQ3_CALLBACK(_write) \
- downcast<wangpcbus_device &>(*device).set_drq3_wr_callback(DEVCB_##_write);
-
-#define MCFG_WANGPC_BUS_IOERROR_CALLBACK(_write) \
- downcast<wangpcbus_device &>(*device).set_ioerror_wr_callback(DEVCB_##_write);
-
-
//**************************************************************************
// TYPE DEFINITIONS
//**************************************************************************
@@ -81,7 +36,17 @@ class wangpcbus_slot_device : public device_t, public device_slot_interface
{
public:
// construction/destruction
- wangpcbus_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+ template <typename T>
+ wangpcbus_slot_device(machine_config const &mconfig, char const *tag, device_t *owner, T &&opts, char const *dflt, int sid)
+ : wangpcbus_slot_device(mconfig, tag, owner, 0)
+ {
+ option_reset();
+ opts(*this);
+ set_default_option(dflt);
+ set_fixed(false);
+ set_wangpcbus_slot(sid);
+ }
+ wangpcbus_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock = 0);
// inline configuration
void set_wangpcbus_slot(int sid) { m_sid = sid; }
@@ -113,37 +78,37 @@ public:
wangpcbus_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
~wangpcbus_device() { m_device_list.detach_all(); }
- template <class Object> devcb_base &set_irq2_wr_callback(Object &&cb) { return m_write_irq2.set_callback(std::forward<Object>(cb)); }
- template <class Object> devcb_base &set_irq3_wr_callback(Object &&cb) { return m_write_irq3.set_callback(std::forward<Object>(cb)); }
- template <class Object> devcb_base &set_irq4_wr_callback(Object &&cb) { return m_write_irq4.set_callback(std::forward<Object>(cb)); }
- template <class Object> devcb_base &set_irq5_wr_callback(Object &&cb) { return m_write_irq5.set_callback(std::forward<Object>(cb)); }
- template <class Object> devcb_base &set_irq6_wr_callback(Object &&cb) { return m_write_irq6.set_callback(std::forward<Object>(cb)); }
- template <class Object> devcb_base &set_irq7_wr_callback(Object &&cb) { return m_write_irq7.set_callback(std::forward<Object>(cb)); }
- template <class Object> devcb_base &set_drq1_wr_callback(Object &&cb) { return m_write_drq1.set_callback(std::forward<Object>(cb)); }
- template <class Object> devcb_base &set_drq2_wr_callback(Object &&cb) { return m_write_drq2.set_callback(std::forward<Object>(cb)); }
- template <class Object> devcb_base &set_drq3_wr_callback(Object &&cb) { return m_write_drq3.set_callback(std::forward<Object>(cb)); }
- template <class Object> devcb_base &set_ioerror_wr_callback(Object &&cb) { return m_write_ioerror.set_callback(std::forward<Object>(cb)); }
+ auto irq2_wr_callback() { return m_write_irq2.bind(); }
+ auto irq3_wr_callback() { return m_write_irq3.bind(); }
+ auto irq4_wr_callback() { return m_write_irq4.bind(); }
+ auto irq5_wr_callback() { return m_write_irq5.bind(); }
+ auto irq6_wr_callback() { return m_write_irq6.bind(); }
+ auto irq7_wr_callback() { return m_write_irq7.bind(); }
+ auto drq1_wr_callback() { return m_write_drq1.bind(); }
+ auto drq2_wr_callback() { return m_write_drq2.bind(); }
+ auto drq3_wr_callback() { return m_write_drq3.bind(); }
+ auto ioerror_wr_callback() { return m_write_ioerror.bind(); }
void add_card(device_wangpcbus_card_interface *card, int sid);
// computer interface
- DECLARE_READ16_MEMBER( mrdc_r );
- DECLARE_WRITE16_MEMBER( amwc_w );
+ uint16_t mrdc_r(offs_t offset, uint16_t mem_mask = 0xffff);
+ void amwc_w(offs_t offset, uint16_t data, uint16_t mem_mask = 0xffff);
- DECLARE_READ16_MEMBER( sad_r );
- DECLARE_WRITE16_MEMBER( sad_w );
+ uint16_t sad_r(offs_t offset, uint16_t mem_mask = 0xffff);
+ void sad_w(offs_t offset, uint16_t data, uint16_t mem_mask = 0xffff);
- uint8_t dack_r(address_space &space, int line);
- void dack_w(address_space &space, int line, uint8_t data);
+ uint8_t dack_r(int line);
+ void dack_w(int line, uint8_t data);
- DECLARE_READ8_MEMBER( dack0_r ) { return dack_r(space, 0); }
- DECLARE_WRITE8_MEMBER( dack0_w ) { dack_w(space, 0, data); }
- DECLARE_READ8_MEMBER( dack1_r ) { return dack_r(space, 1); }
- DECLARE_WRITE8_MEMBER( dack1_w ) { dack_w(space, 1, data); }
- DECLARE_READ8_MEMBER( dack2_r ) { return dack_r(space, 2); }
- DECLARE_WRITE8_MEMBER( dack2_w ) { dack_w(space, 2, data); }
- DECLARE_READ8_MEMBER( dack3_r ) { return dack_r(space, 3); }
- DECLARE_WRITE8_MEMBER( dack3_w ) { dack_w(space, 3, data); }
+ uint8_t dack0_r() { return dack_r(0); }
+ void dack0_w(uint8_t data) { dack_w(0, data); }
+ uint8_t dack1_r() { return dack_r(1); }
+ void dack1_w(uint8_t data) { dack_w(1, data); }
+ uint8_t dack2_r() { return dack_r(2); }
+ void dack2_w(uint8_t data) { dack_w(2, data); }
+ uint8_t dack3_r() { return dack_r(3); }
+ void dack3_w(uint8_t data) { dack_w(3, data); }
DECLARE_WRITE_LINE_MEMBER( tc_w );
@@ -195,17 +160,17 @@ public:
device_wangpcbus_card_interface *next() const { return m_next; }
// memory access
- virtual uint16_t wangpcbus_mrdc_r(address_space &space, offs_t offset, uint16_t mem_mask) { return 0; }
- virtual void wangpcbus_amwc_w(address_space &space, offs_t offset, uint16_t mem_mask, uint16_t data) { }
+ virtual uint16_t wangpcbus_mrdc_r(offs_t offset, uint16_t mem_mask) { return 0; }
+ virtual void wangpcbus_amwc_w(offs_t offset, uint16_t mem_mask, uint16_t data) { }
// I/O access
- virtual uint16_t wangpcbus_iorc_r(address_space &space, offs_t offset, uint16_t mem_mask) { return 0; }
- virtual void wangpcbus_aiowc_w(address_space &space, offs_t offset, uint16_t mem_mask, uint16_t data) { }
+ virtual uint16_t wangpcbus_iorc_r(offs_t offset, uint16_t mem_mask) { return 0; }
+ virtual void wangpcbus_aiowc_w(offs_t offset, uint16_t mem_mask, uint16_t data) { }
bool sad(offs_t offset) const { return (offset & 0xf80) == (0x800 | (m_sid << 7)); }
// DMA
- virtual uint8_t wangpcbus_dack_r(address_space &space, int line) { return 0; }
- virtual void wangpcbus_dack_w(address_space &space, int line, uint8_t data) { }
+ virtual uint8_t wangpcbus_dack_r(int line) { return 0; }
+ virtual void wangpcbus_dack_w(int line, uint8_t data) { }
virtual void wangpcbus_tc_w(int state) { }
virtual bool wangpcbus_have_dack(int line) { return false; }
diff --git a/src/devices/bus/wangpc/wdc.cpp b/src/devices/bus/wangpc/wdc.cpp
index 6dd36b7d545..2ad74d8c8fd 100644
--- a/src/devices/bus/wangpc/wdc.cpp
+++ b/src/devices/bus/wangpc/wdc.cpp
@@ -89,7 +89,7 @@ void wangpc_wdc_device::wangpc_wdc_io(address_map &map)
//-------------------------------------------------
-// MACHINE_CONFIG_START( wangpc_wdc )
+// machine_config( wangpc_wdc )
//-------------------------------------------------
void wangpc_wdc_device::device_add_mconfig(machine_config &config)
@@ -173,7 +173,7 @@ void wangpc_wdc_device::device_reset()
// wangpcbus_mrdc_r - memory read
//-------------------------------------------------
-uint16_t wangpc_wdc_device::wangpcbus_mrdc_r(address_space &space, offs_t offset, uint16_t mem_mask)
+uint16_t wangpc_wdc_device::wangpcbus_mrdc_r(offs_t offset, uint16_t mem_mask)
{
uint16_t data = 0xffff;
@@ -185,7 +185,7 @@ uint16_t wangpc_wdc_device::wangpcbus_mrdc_r(address_space &space, offs_t offset
// wangpcbus_amwc_w - memory write
//-------------------------------------------------
-void wangpc_wdc_device::wangpcbus_amwc_w(address_space &space, offs_t offset, uint16_t mem_mask, uint16_t data)
+void wangpc_wdc_device::wangpcbus_amwc_w(offs_t offset, uint16_t mem_mask, uint16_t data)
{
}
@@ -194,7 +194,7 @@ void wangpc_wdc_device::wangpcbus_amwc_w(address_space &space, offs_t offset, ui
// wangpcbus_iorc_r - I/O read
//-------------------------------------------------
-uint16_t wangpc_wdc_device::wangpcbus_iorc_r(address_space &space, offs_t offset, uint16_t mem_mask)
+uint16_t wangpc_wdc_device::wangpcbus_iorc_r(offs_t offset, uint16_t mem_mask)
{
uint16_t data = 0xffff;
@@ -228,7 +228,7 @@ uint16_t wangpc_wdc_device::wangpcbus_iorc_r(address_space &space, offs_t offset
// wangpcbus_aiowc_w - I/O write
//-------------------------------------------------
-void wangpc_wdc_device::wangpcbus_aiowc_w(address_space &space, offs_t offset, uint16_t mem_mask, uint16_t data)
+void wangpc_wdc_device::wangpcbus_aiowc_w(offs_t offset, uint16_t mem_mask, uint16_t data)
{
if (sad(offset) && ACCESSING_BITS_0_7)
{
@@ -263,7 +263,7 @@ void wangpc_wdc_device::wangpcbus_aiowc_w(address_space &space, offs_t offset, u
// wangpcbus_dack_r - DMA acknowledge read
//-------------------------------------------------
-uint8_t wangpc_wdc_device::wangpcbus_dack_r(address_space &space, int line)
+uint8_t wangpc_wdc_device::wangpcbus_dack_r(int line)
{
return 0;
}
@@ -273,7 +273,7 @@ uint8_t wangpc_wdc_device::wangpcbus_dack_r(address_space &space, int line)
// wangpcbus_dack_r - DMA acknowledge write
//-------------------------------------------------
-void wangpc_wdc_device::wangpcbus_dack_w(address_space &space, int line, uint8_t data)
+void wangpc_wdc_device::wangpcbus_dack_w(int line, uint8_t data)
{
}
@@ -325,11 +325,11 @@ WRITE8_MEMBER( wangpc_wdc_device::status_w )
}
-READ8_MEMBER( wangpc_wdc_device::ctc_ch0_r ) { return m_ctc->read(space, 0); }
-WRITE8_MEMBER( wangpc_wdc_device::ctc_ch0_w ) { m_ctc->write(space, 0, data); }
-READ8_MEMBER( wangpc_wdc_device::ctc_ch1_r ) { return m_ctc->read(space, 1); }
-WRITE8_MEMBER( wangpc_wdc_device::ctc_ch1_w ) { m_ctc->write(space, 1, data); }
-READ8_MEMBER( wangpc_wdc_device::ctc_ch2_r ) { return m_ctc->read(space, 2); }
-WRITE8_MEMBER( wangpc_wdc_device::ctc_ch2_w ) { m_ctc->write(space, 2, data); }
-READ8_MEMBER( wangpc_wdc_device::ctc_ch3_r ) { return m_ctc->read(space, 3); }
-WRITE8_MEMBER( wangpc_wdc_device::ctc_ch3_w ) { m_ctc->write(space, 3, data); }
+READ8_MEMBER( wangpc_wdc_device::ctc_ch0_r ) { return m_ctc->read(machine().dummy_space(), 0); }
+WRITE8_MEMBER( wangpc_wdc_device::ctc_ch0_w ) { m_ctc->write(machine().dummy_space(), 0, data); }
+READ8_MEMBER( wangpc_wdc_device::ctc_ch1_r ) { return m_ctc->read(machine().dummy_space(), 1); }
+WRITE8_MEMBER( wangpc_wdc_device::ctc_ch1_w ) { m_ctc->write(machine().dummy_space(), 1, data); }
+READ8_MEMBER( wangpc_wdc_device::ctc_ch2_r ) { return m_ctc->read(machine().dummy_space(), 2); }
+WRITE8_MEMBER( wangpc_wdc_device::ctc_ch2_w ) { m_ctc->write(machine().dummy_space(), 2, data); }
+READ8_MEMBER( wangpc_wdc_device::ctc_ch3_r ) { return m_ctc->read(machine().dummy_space(), 3); }
+WRITE8_MEMBER( wangpc_wdc_device::ctc_ch3_w ) { m_ctc->write(machine().dummy_space(), 3, data); }
diff --git a/src/devices/bus/wangpc/wdc.h b/src/devices/bus/wangpc/wdc.h
index e270a961750..c945ba6707d 100644
--- a/src/devices/bus/wangpc/wdc.h
+++ b/src/devices/bus/wangpc/wdc.h
@@ -39,12 +39,12 @@ protected:
virtual void device_add_mconfig(machine_config &config) override;
// device_wangpcbus_card_interface overrides
- virtual uint16_t wangpcbus_mrdc_r(address_space &space, offs_t offset, uint16_t mem_mask) override;
- virtual void wangpcbus_amwc_w(address_space &space, offs_t offset, uint16_t mem_mask, uint16_t data) override;
- virtual uint16_t wangpcbus_iorc_r(address_space &space, offs_t offset, uint16_t mem_mask) override;
- virtual void wangpcbus_aiowc_w(address_space &space, offs_t offset, uint16_t mem_mask, uint16_t data) override;
- virtual uint8_t wangpcbus_dack_r(address_space &space, int line) override;
- virtual void wangpcbus_dack_w(address_space &space, int line, uint8_t data) override;
+ virtual uint16_t wangpcbus_mrdc_r(offs_t offset, uint16_t mem_mask) override;
+ virtual void wangpcbus_amwc_w(offs_t offset, uint16_t mem_mask, uint16_t data) override;
+ virtual uint16_t wangpcbus_iorc_r(offs_t offset, uint16_t mem_mask) override;
+ virtual void wangpcbus_aiowc_w(offs_t offset, uint16_t mem_mask, uint16_t data) override;
+ virtual uint8_t wangpcbus_dack_r(int line) override;
+ virtual void wangpcbus_dack_w(int line, uint8_t data) override;
virtual bool wangpcbus_have_dack(int line) override;
private:
diff --git a/src/devices/bus/wswan/rom.cpp b/src/devices/bus/wswan/rom.cpp
index 4ba57a44fe4..c4c991212b6 100644
--- a/src/devices/bus/wswan/rom.cpp
+++ b/src/devices/bus/wswan/rom.cpp
@@ -205,26 +205,26 @@ void ws_rom_device::device_timer(emu_timer &timer, device_timer_id id, int param
mapper specific handlers
-------------------------------------------------*/
-READ8_MEMBER(ws_rom_device::read_rom20)
+uint8_t ws_rom_device::read_rom20(offs_t offset)
{
return m_rom[offset + m_base20];
}
-READ8_MEMBER(ws_rom_device::read_rom30)
+uint8_t ws_rom_device::read_rom30(offs_t offset)
{
return m_rom[offset + m_base30];
}
-READ8_MEMBER(ws_rom_device::read_rom40)
+uint8_t ws_rom_device::read_rom40(offs_t offset)
{
// we still need to mask in some cases, e.g. when game is 512K
return m_rom[(offset + m_base40) & (m_rom_size - 1)];
}
-READ8_MEMBER(ws_rom_device::read_io)
+uint8_t ws_rom_device::read_io(offs_t offset)
{
uint8_t value = m_io_regs[offset];
@@ -254,7 +254,7 @@ READ8_MEMBER(ws_rom_device::read_io)
return value;
}
-WRITE8_MEMBER(ws_rom_device::write_io)
+void ws_rom_device::write_io(offs_t offset, uint8_t data)
{
switch (offset)
{
@@ -344,30 +344,30 @@ WRITE8_MEMBER(ws_rom_device::write_io)
m_io_regs[offset] = data;
}
-READ8_MEMBER(ws_rom_sram_device::read_ram)
+uint8_t ws_rom_sram_device::read_ram(offs_t offset)
{
return m_nvram[m_nvram_base + offset];
}
-WRITE8_MEMBER(ws_rom_sram_device::write_ram)
+void ws_rom_sram_device::write_ram(offs_t offset, uint8_t data)
{
m_nvram[m_nvram_base + offset] = data;
}
-WRITE8_MEMBER(ws_rom_sram_device::write_io)
+void ws_rom_sram_device::write_io(offs_t offset, uint8_t data)
{
switch (offset)
{
case 0x01: // SRAM bank to select
m_nvram_base = (data * 0x10000) & (m_nvram.size() - 1);
default:
- ws_rom_device::write_io(space, offset, data);
+ ws_rom_device::write_io(offset, data);
break;
}
}
-READ8_MEMBER(ws_rom_eeprom_device::read_io)
+uint8_t ws_rom_eeprom_device::read_io(offs_t offset)
{
uint8_t value = m_io_regs[offset];
@@ -381,14 +381,14 @@ READ8_MEMBER(ws_rom_eeprom_device::read_io)
// EEPROM reads, taken from regs
break;
default:
- value = ws_rom_device::read_io(space, offset);
+ value = ws_rom_device::read_io(offset);
break;
}
return value;
}
-WRITE8_MEMBER(ws_rom_eeprom_device::write_io)
+void ws_rom_eeprom_device::write_io(offs_t offset, uint8_t data)
{
switch (offset)
{
@@ -530,7 +530,7 @@ WRITE8_MEMBER(ws_rom_eeprom_device::write_io)
break;
default:
- ws_rom_device::write_io(space, offset, data);
+ ws_rom_device::write_io(offset, data);
break;
}
diff --git a/src/devices/bus/wswan/rom.h b/src/devices/bus/wswan/rom.h
index ae420667c8f..916562ab6e2 100644
--- a/src/devices/bus/wswan/rom.h
+++ b/src/devices/bus/wswan/rom.h
@@ -16,11 +16,11 @@ public:
ws_rom_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
// reading and writing
- virtual DECLARE_READ8_MEMBER(read_rom20) override;
- virtual DECLARE_READ8_MEMBER(read_rom30) override;
- virtual DECLARE_READ8_MEMBER(read_rom40) override;
- virtual DECLARE_READ8_MEMBER(read_io) override;
- virtual DECLARE_WRITE8_MEMBER(write_io) override;
+ virtual uint8_t read_rom20(offs_t offset) override;
+ virtual uint8_t read_rom30(offs_t offset) override;
+ virtual uint8_t read_rom40(offs_t offset) override;
+ virtual uint8_t read_io(offs_t offset) override;
+ virtual void write_io(offs_t offset, uint8_t data) override;
protected:
static constexpr device_timer_id TIMER_RTC = 0;
@@ -59,9 +59,9 @@ public:
ws_rom_sram_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
// reading and writing
- virtual DECLARE_READ8_MEMBER(read_ram) override;
- virtual DECLARE_WRITE8_MEMBER(write_ram) override;
- virtual DECLARE_WRITE8_MEMBER(write_io) override;
+ virtual uint8_t read_ram(offs_t offset) override;
+ virtual void write_ram(offs_t offset, uint8_t data) override;
+ virtual void write_io(offs_t offset, uint8_t data) override;
protected:
// device-level overrides
@@ -82,8 +82,8 @@ public:
ws_rom_eeprom_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
// reading and writing
- virtual DECLARE_READ8_MEMBER(read_io) override;
- virtual DECLARE_WRITE8_MEMBER(write_io) override;
+ virtual uint8_t read_io(offs_t offset) override;
+ virtual void write_io(offs_t offset, uint8_t data) override;
protected:
// device-level overrides
diff --git a/src/devices/bus/wswan/slot.cpp b/src/devices/bus/wswan/slot.cpp
index 45df7c195bf..731c0967e1e 100644
--- a/src/devices/bus/wswan/slot.cpp
+++ b/src/devices/bus/wswan/slot.cpp
@@ -312,10 +312,10 @@ std::string ws_cart_slot_device::get_default_card_software(get_default_card_soft
read_rom20
-------------------------------------------------*/
-READ8_MEMBER(ws_cart_slot_device::read_rom20)
+uint8_t ws_cart_slot_device::read_rom20(offs_t offset)
{
if (m_cart)
- return m_cart->read_rom20(space, offset);
+ return m_cart->read_rom20(offset);
else
return 0xff;
}
@@ -324,10 +324,10 @@ READ8_MEMBER(ws_cart_slot_device::read_rom20)
read_rom30
-------------------------------------------------*/
-READ8_MEMBER(ws_cart_slot_device::read_rom30)
+uint8_t ws_cart_slot_device::read_rom30(offs_t offset)
{
if (m_cart)
- return m_cart->read_rom30(space, offset);
+ return m_cart->read_rom30(offset);
else
return 0xff;
}
@@ -336,10 +336,10 @@ READ8_MEMBER(ws_cart_slot_device::read_rom30)
read_rom40
-------------------------------------------------*/
-READ8_MEMBER(ws_cart_slot_device::read_rom40)
+uint8_t ws_cart_slot_device::read_rom40(offs_t offset)
{
if (m_cart)
- return m_cart->read_rom40(space, offset);
+ return m_cart->read_rom40(offset);
else
return 0xff;
}
@@ -348,10 +348,10 @@ READ8_MEMBER(ws_cart_slot_device::read_rom40)
read_ram
-------------------------------------------------*/
-READ8_MEMBER(ws_cart_slot_device::read_ram)
+uint8_t ws_cart_slot_device::read_ram(offs_t offset)
{
if (m_cart)
- return m_cart->read_ram(space, offset);
+ return m_cart->read_ram(offset);
else
return 0xff;
}
@@ -360,20 +360,20 @@ READ8_MEMBER(ws_cart_slot_device::read_ram)
write_ram
-------------------------------------------------*/
-WRITE8_MEMBER(ws_cart_slot_device::write_ram)
+void ws_cart_slot_device::write_ram(offs_t offset, uint8_t data)
{
if (m_cart)
- m_cart->write_ram(space, offset, data);
+ m_cart->write_ram(offset, data);
}
/*-------------------------------------------------
read_io
-------------------------------------------------*/
-READ8_MEMBER(ws_cart_slot_device::read_io)
+uint8_t ws_cart_slot_device::read_io(offs_t offset)
{
if (m_cart)
- return m_cart->read_io(space, offset);
+ return m_cart->read_io(offset);
else
return 0xff;
}
@@ -382,10 +382,10 @@ READ8_MEMBER(ws_cart_slot_device::read_io)
write_io
-------------------------------------------------*/
-WRITE8_MEMBER(ws_cart_slot_device::write_io)
+void ws_cart_slot_device::write_io(offs_t offset, uint8_t data)
{
if (m_cart)
- m_cart->write_io(space, offset, data);
+ m_cart->write_io(offset, data);
}
diff --git a/src/devices/bus/wswan/slot.h b/src/devices/bus/wswan/slot.h
index 1992d858553..219a4bb3fe8 100644
--- a/src/devices/bus/wswan/slot.h
+++ b/src/devices/bus/wswan/slot.h
@@ -31,13 +31,13 @@ public:
virtual ~device_ws_cart_interface();
// reading and writing
- virtual DECLARE_READ8_MEMBER(read_rom20) { return 0xff; }
- virtual DECLARE_READ8_MEMBER(read_rom30) { return 0xff; }
- virtual DECLARE_READ8_MEMBER(read_rom40) { return 0xff; }
- virtual DECLARE_READ8_MEMBER(read_ram) { return 0xff; }
- virtual DECLARE_WRITE8_MEMBER(write_ram) {}
- virtual DECLARE_READ8_MEMBER(read_io) { return 0xff; }
- virtual DECLARE_WRITE8_MEMBER(write_io) { }
+ virtual uint8_t read_rom20(offs_t offset) { return 0xff; }
+ virtual uint8_t read_rom30(offs_t offset) { return 0xff; }
+ virtual uint8_t read_rom40(offs_t offset) { return 0xff; }
+ virtual uint8_t read_ram(offs_t offset) { return 0xff; }
+ virtual void write_ram(offs_t offset, uint8_t data) {}
+ virtual uint8_t read_io(offs_t offset) { return 0xff; }
+ virtual void write_io(offs_t offset, uint8_t data) { }
void rom_alloc(uint32_t size, const char *tag);
void nvram_alloc(uint32_t size);
@@ -109,13 +109,13 @@ public:
virtual std::string get_default_card_software(get_default_card_software_hook &hook) const override;
// reading and writing
- virtual DECLARE_READ8_MEMBER(read_rom20);
- virtual DECLARE_READ8_MEMBER(read_rom30);
- virtual DECLARE_READ8_MEMBER(read_rom40);
- virtual DECLARE_READ8_MEMBER(read_ram);
- virtual DECLARE_WRITE8_MEMBER(write_ram);
- virtual DECLARE_READ8_MEMBER(read_io);
- virtual DECLARE_WRITE8_MEMBER(write_io);
+ virtual uint8_t read_rom20(offs_t offset);
+ virtual uint8_t read_rom30(offs_t offset);
+ virtual uint8_t read_rom40(offs_t offset);
+ virtual uint8_t read_ram(offs_t offset);
+ virtual void write_ram(offs_t offset, uint8_t data);
+ virtual uint8_t read_io(offs_t offset);
+ virtual void write_io(offs_t offset, uint8_t data);
protected:
// device-level overrides
diff --git a/src/devices/bus/x68k/x68k_midi.cpp b/src/devices/bus/x68k/x68k_midi.cpp
index b4f27554b70..abcc0b34955 100644
--- a/src/devices/bus/x68k/x68k_midi.cpp
+++ b/src/devices/bus/x68k/x68k_midi.cpp
@@ -1,7 +1,7 @@
// license:BSD-3-Clause
// copyright-holders:Barry Rodewald
/*
- * x68k_midi.c
+ * x68k_midi.cpp
*
* X68000 MIDI interface - YM3802
*
@@ -17,16 +17,16 @@
DEFINE_DEVICE_TYPE(X68K_MIDI, x68k_midi_device, "x68k_midi", "X68000 MIDI Interface")
-MACHINE_CONFIG_START(x68k_midi_device::device_add_mconfig)
+void x68k_midi_device::device_add_mconfig(machine_config &config)
+{
YM3802(config, m_midi, XTAL(1'000'000)); // clock is unknown
m_midi->txd_handler().set("mdout", FUNC(midi_port_device::write_txd));
m_midi->irq_handler().set(FUNC(x68k_midi_device::irq_w));
- MCFG_MIDI_PORT_ADD("mdin", midiin_slot, "midiin")
- MCFG_MIDI_PORT_ADD("mdout", midiout_slot, "midiout")
-// MCFG_MIDI_PORT_ADD("mdthru", midiout_slot, "midiout")
+ MIDI_PORT(config, "mdin", midiin_slot, "midiin");
+ MIDI_PORT(config, "mdout", midiout_slot, "midiout");
+// MIDI_PORT(config, "mdthru", midiout_slot, "midiout");
// TODO: Add serial data handlers
-
-MACHINE_CONFIG_END
+}
x68k_midi_device::x68k_midi_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
@@ -39,10 +39,8 @@ x68k_midi_device::x68k_midi_device(const machine_config &mconfig, const char *ta
void x68k_midi_device::device_start()
{
- device_t* cpu = machine().device("maincpu");
- address_space& space = cpu->memory().space(AS_PROGRAM);
m_slot = dynamic_cast<x68k_expansion_slot_device *>(owner());
- space.install_readwrite_handler(0xeafa00,0xeafa0f,read8_delegate(FUNC(x68k_midi_device::x68k_midi_reg_r),this),write8_delegate(FUNC(x68k_midi_device::x68k_midi_reg_w),this),0x00ff00ff);
+ m_slot->space().install_readwrite_handler(0xeafa00,0xeafa0f,read8_delegate(FUNC(x68k_midi_device::x68k_midi_reg_r),this),write8_delegate(FUNC(x68k_midi_device::x68k_midi_reg_w),this),0x00ff00ff);
}
void x68k_midi_device::device_reset()
diff --git a/src/devices/bus/x68k/x68k_neptunex.cpp b/src/devices/bus/x68k/x68k_neptunex.cpp
index 4c77c32061c..7a7b7c3aaab 100644
--- a/src/devices/bus/x68k/x68k_neptunex.cpp
+++ b/src/devices/bus/x68k/x68k_neptunex.cpp
@@ -17,12 +17,13 @@
DEFINE_DEVICE_TYPE(X68K_NEPTUNEX, x68k_neptune_device, "x68k_neptunex", "Neptune-X")
// device machine config
-MACHINE_CONFIG_START(x68k_neptune_device::device_add_mconfig)
- MCFG_DEVICE_ADD("dp8390d", DP8390D, 0)
- MCFG_DP8390D_IRQ_CB(WRITELINE(*this, x68k_neptune_device, x68k_neptune_irq_w))
- MCFG_DP8390D_MEM_READ_CB(READ8(*this, x68k_neptune_device, x68k_neptune_mem_read))
- MCFG_DP8390D_MEM_WRITE_CB(WRITE8(*this, x68k_neptune_device, x68k_neptune_mem_write))
-MACHINE_CONFIG_END
+void x68k_neptune_device::device_add_mconfig(machine_config &config)
+{
+ DP8390D(config, m_dp8390, 0);
+ m_dp8390->irq_callback().set(FUNC(x68k_neptune_device::x68k_neptune_irq_w));
+ m_dp8390->mem_read_callback().set(FUNC(x68k_neptune_device::x68k_neptune_mem_read));
+ m_dp8390->mem_write_callback().set(FUNC(x68k_neptune_device::x68k_neptune_mem_write));
+}
x68k_neptune_device::x68k_neptune_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
: device_t(mconfig, X68K_NEPTUNEX, tag, owner, clock)
@@ -38,17 +39,15 @@ x68k_neptune_device::x68k_neptune_device(const machine_config &mconfig, const ch
void x68k_neptune_device::device_start()
{
- device_t* cpu = machine().device("maincpu");
char mac[7];
uint32_t num = machine().rand();
- address_space& space = cpu->memory().space(AS_PROGRAM);
m_slot = dynamic_cast<x68k_expansion_slot_device *>(owner());
memset(m_prom, 0x57, 16);
sprintf(mac+2, "\x1b%c%c%c", (num >> 16) & 0xff, (num >> 8) & 0xff, num & 0xff);
mac[0] = 0; mac[1] = 0; // avoid gcc warning
memcpy(m_prom, mac, 6);
m_dp8390->set_mac(mac);
- 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);
+ m_slot->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);
}
void x68k_neptune_device::device_reset() {
diff --git a/src/devices/bus/x68k/x68k_scsiext.cpp b/src/devices/bus/x68k/x68k_scsiext.cpp
index 557d70d3f36..3cf18f9d2ee 100644
--- a/src/devices/bus/x68k/x68k_scsiext.cpp
+++ b/src/devices/bus/x68k/x68k_scsiext.cpp
@@ -37,7 +37,8 @@ const tiny_rom_entry *x68k_scsiext_device::device_rom_region() const
}
// device machine config
-MACHINE_CONFIG_START(x68k_scsiext_device::device_add_mconfig)
+void x68k_scsiext_device::device_add_mconfig(machine_config &config)
+{
SCSI_PORT(config, m_scsibus);
m_scsibus->set_slot_device(1, "harddisk", SCSIHD, DEVICE_INPUT_DEFAULTS_NAME(SCSI_ID_0));
m_scsibus->set_slot_device(2, "harddisk", SCSIHD, DEVICE_INPUT_DEFAULTS_NAME(SCSI_ID_1));
@@ -48,10 +49,10 @@ MACHINE_CONFIG_START(x68k_scsiext_device::device_add_mconfig)
m_scsibus->set_slot_device(7, "harddisk", SCSIHD, DEVICE_INPUT_DEFAULTS_NAME(SCSI_ID_6));
MB89352A(config, m_spc);
- m_spc->set_scsi_port("scsi");
+ m_spc->set_scsi_port(m_scsibus);
m_spc->irq_cb().set(FUNC(x68k_scsiext_device::irq_w));
m_spc->drq_cb().set(FUNC(x68k_scsiext_device::drq_w));
-MACHINE_CONFIG_END
+}
x68k_scsiext_device::x68k_scsiext_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
: device_t(mconfig, X68K_SCSIEXT, tag, owner, clock)
@@ -64,15 +65,14 @@ x68k_scsiext_device::x68k_scsiext_device(const machine_config &mconfig, const ch
void x68k_scsiext_device::device_start()
{
- device_t* cpu = machine().device("maincpu");
- uint8_t* ROM;
- address_space& space = cpu->memory().space(AS_PROGRAM);
m_slot = dynamic_cast<x68k_expansion_slot_device *>(owner());
- space.install_read_bank(0xea0020,0xea1fff,"scsi_ext");
- space.unmap_write(0xea0020,0xea1fff);
- ROM = machine().root_device().memregion(subtag("scsiexrom").c_str())->base();
+ m_slot->space().install_read_bank(0xea0020,0xea1fff,"scsi_ext");
+ m_slot->space().unmap_write(0xea0020,0xea1fff);
+
+ uint8_t *ROM = machine().root_device().memregion(subtag("scsiexrom").c_str())->base();
machine().root_device().membank("scsi_ext")->set_base(ROM);
- space.install_readwrite_handler(0xea0000,0xea001f,read8_delegate(FUNC(x68k_scsiext_device::register_r),this),write8_delegate(FUNC(x68k_scsiext_device::register_w),this),0x00ff00ff);
+
+m_slot->space().install_readwrite_handler(0xea0000,0xea001f,read8_delegate(FUNC(x68k_scsiext_device::register_r),this),write8_delegate(FUNC(x68k_scsiext_device::register_w),this),0x00ff00ff);
}
void x68k_scsiext_device::device_reset()
diff --git a/src/devices/bus/x68k/x68kexp.cpp b/src/devices/bus/x68k/x68kexp.cpp
index 9d9cded5bd8..dc51559d632 100644
--- a/src/devices/bus/x68k/x68kexp.cpp
+++ b/src/devices/bus/x68k/x68kexp.cpp
@@ -36,6 +36,7 @@ device_x68k_expansion_card_interface::~device_x68k_expansion_card_interface()
x68k_expansion_slot_device::x68k_expansion_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) :
device_t(mconfig, X68K_EXPANSION_SLOT, tag, owner, clock),
device_slot_interface(mconfig, *this),
+ m_space(*this, finder_base::DUMMY_TAG, -1),
m_out_irq2_cb(*this),
m_out_irq4_cb(*this),
m_out_nmi_cb(*this),
diff --git a/src/devices/bus/x68k/x68kexp.h b/src/devices/bus/x68k/x68kexp.h
index 56f9feea8a5..26b3ba06ad6 100644
--- a/src/devices/bus/x68k/x68kexp.h
+++ b/src/devices/bus/x68k/x68kexp.h
@@ -73,22 +73,6 @@
#define X68K_EXP_SLOT_TAG "x68kexp"
-//**************************************************************************
-// INTERFACE CONFIGURATION MACROS
-//**************************************************************************
-
-#define MCFG_X68K_EXPANSION_SLOT_OUT_IRQ2_CB(_devcb) \
- downcast<x68k_expansion_slot_device &>(*device).set_out_irq2_callback(DEVCB_##_devcb);
-
-#define MCFG_X68K_EXPANSION_SLOT_OUT_IRQ4_CB(_devcb) \
- downcast<x68k_expansion_slot_device &>(*device).set_out_irq4_callback(DEVCB_##_devcb);
-
-#define MCFG_X68K_EXPANSION_SLOT_OUT_NMI_CB(_devcb) \
- downcast<x68k_expansion_slot_device &>(*device).set_out_nmi_callback(DEVCB_##_devcb);
-
-#define MCFG_X68K_EXPANSION_SLOT_OUT_RESET_CB(_devcb) \
- downcast<x68k_expansion_slot_device &>(*device).set_out_reset_callback(DEVCB_##_devcb);
-
//**************************************************************************
// TYPE DEFINITIONS
@@ -123,14 +107,26 @@ class x68k_expansion_slot_device : public device_t, public device_slot_interface
{
public:
// construction/destruction
- x68k_expansion_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+ template <typename T>
+ x68k_expansion_slot_device(machine_config const &mconfig, char const *tag, device_t *owner, T &&opts, char const *dflt)
+ : x68k_expansion_slot_device(mconfig, tag, owner, 0)
+ {
+ option_reset();
+ opts(*this);
+ set_default_option(dflt);
+ set_fixed(false);
+ }
+ x68k_expansion_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock = 0);
virtual ~x68k_expansion_slot_device();
- template <class Object> devcb_base &set_out_irq2_callback(Object &&cb) { return m_out_irq2_cb.set_callback(std::forward<Object>(cb)); }
- template <class Object> devcb_base &set_out_irq4_callback(Object &&cb) { return m_out_irq4_cb.set_callback(std::forward<Object>(cb)); }
- template <class Object> devcb_base &set_out_nmi_callback(Object &&cb) { return m_out_nmi_cb.set_callback(std::forward<Object>(cb)); }
- template <class Object> devcb_base &set_out_reset_callback(Object &&cb) { return m_out_reset_cb.set_callback(std::forward<Object>(cb)); }
+ template <typename T> void set_space(T &&tag, int spacenum) { m_space.set_tag(std::forward<T>(tag), spacenum); }
+ auto out_irq2_callback() { return m_out_irq2_cb.bind(); }
+ auto out_irq4_callback() { return m_out_irq4_cb.bind(); }
+ auto out_nmi_callback() { return m_out_nmi_cb.bind(); }
+ auto out_reset_callback() { return m_out_reset_cb.bind(); }
+
+ address_space &space() { return *m_space; }
DECLARE_WRITE_LINE_MEMBER( irq2_w );
DECLARE_WRITE_LINE_MEMBER( irq4_w );
@@ -144,6 +140,8 @@ protected:
virtual void device_start() override;
virtual void device_reset() override;
+ required_address_space m_space;
+
devcb_write_line m_out_irq2_cb;
devcb_write_line m_out_irq4_cb;
devcb_write_line m_out_nmi_cb;
diff --git a/src/devices/bus/z88/flash.cpp b/src/devices/bus/z88/flash.cpp
index 1fb8f9b6420..ee92f351ec7 100644
--- a/src/devices/bus/z88/flash.cpp
+++ b/src/devices/bus/z88/flash.cpp
@@ -73,7 +73,7 @@ uint8_t* z88_1024k_flash_device::get_cart_base()
READ8_MEMBER(z88_1024k_flash_device::read)
{
- return m_flash->read(space, offset & (get_cart_size() - 1));
+ return m_flash->read(offset & (get_cart_size() - 1));
}
/*-------------------------------------------------
@@ -82,5 +82,5 @@ READ8_MEMBER(z88_1024k_flash_device::read)
WRITE8_MEMBER(z88_1024k_flash_device::write)
{
- m_flash->write(space, offset & (get_cart_size() - 1), data);
+ m_flash->write(offset & (get_cart_size() - 1), data);
}
diff --git a/src/devices/bus/z88/z88.h b/src/devices/bus/z88/z88.h
index de8ecdc883f..444eeb3c111 100644
--- a/src/devices/bus/z88/z88.h
+++ b/src/devices/bus/z88/z88.h
@@ -90,9 +90,18 @@ class z88cart_slot_device : public device_t,
{
public:
// construction/destruction
+ template <typename T>
+ z88cart_slot_device(machine_config const &mconfig, char const *tag, device_t *owner, T &&opts, char const *dflt)
+ : z88cart_slot_device(mconfig, tag, owner, 0)
+ {
+ option_reset();
+ opts(*this);
+ set_default_option(dflt);
+ set_fixed(false);
+ }
z88cart_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock = 0);
- template <class Object> devcb_base &set_out_flp_callback(Object &&cb) { return m_out_flp_cb.set_callback(std::forward<Object>(cb)); }
+ auto out_flp_callback() { return m_out_flp_cb.bind(); }
// image-level overrides
virtual image_init_result call_load() override;
@@ -133,12 +142,4 @@ private:
// device type definition
DECLARE_DEVICE_TYPE(Z88CART_SLOT, z88cart_slot_device)
-
-/***************************************************************************
- DEVICE CONFIGURATION MACROS
-***************************************************************************/
-
-#define MCFG_Z88CART_SLOT_OUT_FLP_CB(_devcb) \
- downcast<z88cart_slot_device &>(*device).set_out_flp_callback(DEVCB_##_devcb);
-
#endif // MAME_BUS_Z88_Z88_H
diff --git a/src/devices/cpu/8x300/8x300.cpp b/src/devices/cpu/8x300/8x300.cpp
index 130df2dd7e3..a8a9b9dcdad 100644
--- a/src/devices/cpu/8x300/8x300.cpp
+++ b/src/devices/cpu/8x300/8x300.cpp
@@ -34,17 +34,29 @@
// for XEC intruction, which sets the AR, but not PC, so that after the instruction at the relative address is done, execution
// returns back to next instruction after XEC, unless a JMP or successful NZT is there.
#define SET_AR(x) do { m_AR = (x); m_increment_pc = false; } while (0)
-#define SRC_LATCH do { if(SRC_IS_RIGHT_BANK) m_right_IV = READPORT(m_IVR+0x100); else m_left_IV = READPORT(m_IVL); } while (0)
-#define DST_LATCH do { if(DST_IS_RIGHT_BANK) m_right_IV = READPORT(m_IVR+0x100); else m_left_IV = READPORT(m_IVL); } while (0)
+#define SRC_LATCH do { if(SRC_IS_RIGHT_BANK) m_IV_latch = READPORT(m_IVR+0x100); else m_IV_latch = READPORT(m_IVL); } while (0)
+#define DST_LATCH do { if(DST_IS_RIGHT_BANK) m_IV_latch = READPORT(m_IVR+0x100); else m_IV_latch = READPORT(m_IVL); } while (0)
#define SET_OVF do { if(result & 0xff00) m_OVF = 1; else m_OVF = 0; } while (0)
DEFINE_DEVICE_TYPE(N8X300, n8x300_cpu_device, "8x300", "Signetics 8X300")
+DEFINE_DEVICE_TYPE(N8X305, n8x305_cpu_device, "8x305", "Signetics 8X305")
-n8x300_cpu_device::n8x300_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
- : cpu_device(mconfig, N8X300, tag, owner, clock)
- , m_program_config("program", ENDIANNESS_BIG, 16, 14, 0)
+n8x300_cpu_device::n8x300_cpu_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock)
+ : cpu_device(mconfig, type, tag, owner, clock)
+ , m_program_config("program", ENDIANNESS_BIG, 16, 13, -1)
, m_io_config("io", ENDIANNESS_BIG, 8, 9, 0)
+ , m_sc_callback(*this)
+{
+}
+
+n8x300_cpu_device::n8x300_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+ : n8x300_cpu_device(mconfig, N8X300, tag, owner, clock)
+{
+}
+
+n8x305_cpu_device::n8x305_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+ : n8x300_cpu_device(mconfig, N8X305, tag, owner, clock)
{
}
@@ -56,9 +68,21 @@ device_memory_interface::space_config_vector n8x300_cpu_device::memory_space_con
};
}
-void n8x300_cpu_device::set_reg(uint8_t reg, uint8_t val)
+void n8x300_cpu_device::xmit_lb(uint8_t dst, uint8_t mask)
{
- switch(reg)
+ m_IV_latch = (m_IV_latch & ~mask) | (dst & mask);
+ WRITEPORT(m_IVL, m_IV_latch);
+}
+
+void n8x300_cpu_device::xmit_rb(uint8_t dst, uint8_t mask)
+{
+ m_IV_latch = (m_IV_latch & ~mask) | (dst & mask);
+ WRITEPORT(m_IVR + 0x100, m_IV_latch);
+}
+
+void n8x300_cpu_device::set_reg(uint8_t reg, uint8_t val, bool xmit)
+{
+ switch (reg)
{
case 0x00: m_AUX = val; break;
case 0x01: m_R1 = val; break;
@@ -67,17 +91,30 @@ void n8x300_cpu_device::set_reg(uint8_t reg, uint8_t val)
case 0x04: m_R4 = val; break;
case 0x05: m_R5 = val; break;
case 0x06: m_R6 = val; break;
- case 0x07: m_IVL = val; break;
+ case 0x07: m_IVL = val; m_sc_callback(0, val); break;
// OVF is read-only
case 0x09: m_R11 = val; break;
- case 0x0f: m_IVR = val; break;
+ case 0x0f: m_IVR = val; m_sc_callback(1, val); break;
default: logerror("8X300: Invalid register %02x written to.\n",reg); break;
}
}
+void n8x305_cpu_device::set_reg(uint8_t reg, uint8_t val, bool xmit)
+{
+ switch (reg)
+ {
+ case 0x0a: if (xmit) xmit_lb(val, 0xff); else m_R12 = val; break;
+ case 0x0b: if (xmit) xmit_rb(val, 0xff); else m_R13 = val; break;
+ case 0x0c: m_R14 = val; break;
+ case 0x0d: m_R15 = val; break;
+ case 0x0e: m_R16 = val; break;
+ default: n8x300_cpu_device::set_reg(reg, val, xmit); break;
+ }
+}
+
uint8_t n8x300_cpu_device::get_reg(uint8_t reg)
{
- switch(reg)
+ switch (reg)
{
case 0x00: return m_AUX;
case 0x01: return m_R1;
@@ -86,18 +123,38 @@ uint8_t n8x300_cpu_device::get_reg(uint8_t reg)
case 0x04: return m_R4;
case 0x05: return m_R5;
case 0x06: return m_R6;
-// IVL is write-only
+// IVL is write-only on the 8X300
case 0x08: return m_OVF;
case 0x09: return m_R11;
-// IVR is write-only
+// IVR is write-only on the 8X300
default: logerror("8X300: Invalid register %02x read.\n",reg); return 0;
}
}
+uint8_t n8x305_cpu_device::get_reg(uint8_t reg)
+{
+ switch (reg)
+ {
+ case 0x07: return m_IVL;
+ case 0x0a: return m_R12;
+ case 0x0b: return m_R13;
+ case 0x0c: return m_R14;
+ case 0x0d: return m_R15;
+ case 0x0e: return m_R16;
+ case 0x0f: return m_IVR;
+ default: return n8x300_cpu_device::get_reg(reg);
+ }
+}
+
+void n8x300_cpu_device::device_resolve_objects()
+{
+ m_sc_callback.resolve_safe();
+}
+
void n8x300_cpu_device::device_start()
{
m_program = &space(AS_PROGRAM);
- m_cache = m_program->cache<1, 0, ENDIANNESS_BIG>();
+ m_cache = m_program->cache<1, -1, ENDIANNESS_BIG>();
m_io = &space(AS_IO);
save_item(NAME(m_PC));
@@ -110,12 +167,19 @@ void n8x300_cpu_device::device_start()
save_item(NAME(m_R5));
save_item(NAME(m_R6));
save_item(NAME(m_R11));
+ if (type() == N8X305)
+ {
+ save_item(NAME(m_R12));
+ save_item(NAME(m_R13));
+ save_item(NAME(m_R14));
+ save_item(NAME(m_R15));
+ save_item(NAME(m_R16));
+ }
save_item(NAME(m_AUX));
save_item(NAME(m_IVL));
save_item(NAME(m_IVR));
save_item(NAME(m_OVF));
- save_item(NAME(m_left_IV));
- save_item(NAME(m_right_IV));
+ save_item(NAME(m_IV_latch));
save_item(NAME(m_genPC));
save_item(NAME(m_increment_pc));
@@ -127,6 +191,14 @@ void n8x300_cpu_device::device_start()
m_R5 = 0;
m_R6 = 0;
m_R11 = 0;
+ if (type() == N8X305)
+ {
+ m_R12 = 0;
+ m_R13 = 0;
+ m_R14 = 0;
+ m_R15 = 0;
+ m_R16 = 0;
+ }
m_IVL = 0;
m_IVR = 0;
m_AUX = 0;
@@ -146,11 +218,19 @@ void n8x300_cpu_device::device_start()
state_add( _8X300_R5, "R5", m_R5).mask(0xff).formatstr("%02X");
state_add( _8X300_R6, "R6", m_R6).mask(0xff).formatstr("%02X");
state_add( _8X300_R11, "R11", m_R11).mask(0xff).formatstr("%02X");
+ if (type() == N8X305)
+ {
+ state_add( _8X300_R12, "R12", m_R12).mask(0xff).formatstr("%02X");
+ state_add( _8X300_R13, "R13", m_R13).mask(0xff).formatstr("%02X");
+ state_add( _8X300_R14, "R14", m_R14).mask(0xff).formatstr("%02X");
+ state_add( _8X300_R15, "R15", m_R15).mask(0xff).formatstr("%02X");
+ state_add( _8X300_R16, "R16", m_R16).mask(0xff).formatstr("%02X");
+ }
state_add( _8X300_OVF, "OVF", m_OVF).mask(0x01).formatstr("%01X");
state_add( _8X300_IVL, "IVL", m_IVL).mask(0xff).formatstr("%02X");
state_add( _8X300_IVR, "IVR", m_IVR).mask(0xff).formatstr("%02X");
- state_add(STATE_GENPC, "GENPC", m_genPC).mask(0x3ffe).callimport().noshow();
- state_add(STATE_GENPCBASE, "CURPC", m_genPC).mask(0x3ffe).callimport().noshow();
+ state_add(STATE_GENPC, "GENPC", m_genPC).mask(0x1fff).callimport().noshow();
+ state_add(STATE_GENPCBASE, "CURPC", m_genPC).mask(0x1fff).callimport().noshow();
set_icountptr(m_icount);
}
@@ -166,12 +246,12 @@ void n8x300_cpu_device::state_import(const device_state_entry &entry)
{
case _8X300_PC:
m_AR = m_PC;
- m_genPC = m_AR << 1;
+ m_genPC = m_AR;
m_increment_pc = true;
break;
case _8X300_AR:
- m_genPC = m_AR << 1;
+ m_genPC = m_AR;
m_increment_pc = false;
break;
@@ -202,10 +282,9 @@ void n8x300_cpu_device::execute_run()
uint8_t dst;
uint8_t rotlen; // rotate amount or I/O field length
uint8_t mask;
- uint16_t result;
/* fetch the opcode */
- m_genPC = m_AR << 1;
+ m_genPC = m_AR;
debugger_instruction_hook(m_genPC);
opcode = FETCHOP(m_genPC);
@@ -230,7 +309,7 @@ void n8x300_cpu_device::execute_run()
{
src = get_reg(SRC);
dst = rotate(src,rotlen);
- set_reg(DST,dst);
+ set_reg(DST,dst,false);
}
else
{
@@ -243,62 +322,42 @@ void n8x300_cpu_device::execute_run()
src = (get_reg(SRC)) << (7-DST_LSB);
mask <<= (7-DST_LSB);
if(DST_IS_RIGHT_BANK)
- {
- dst = (m_right_IV & ~mask) | (src & mask);
- m_right_IV = dst;
- WRITEPORT(m_IVR+0x100,m_right_IV);
- }
+ xmit_rb(src, mask);
else
- {
- dst = (m_left_IV & ~mask) | (src & mask);
- m_left_IV = dst;
- WRITEPORT(m_IVL,m_left_IV);
- }
+ xmit_lb(src, mask);
}
else if(!(is_src_reg(opcode)) && is_dst_reg(opcode))
{ // MOVE IV,reg
SRC_LATCH;
- if(SRC_IS_RIGHT_BANK)
- src = rotate(m_right_IV,7-SRC_LSB);
- else
- src = rotate(m_left_IV,7-SRC_LSB);
+ src = rotate(m_IV_latch,7-SRC_LSB);
mask = ((1 << rotlen)-1);
dst = src & mask;
- set_reg(DST,dst);
+ set_reg(DST,dst,false);
}
else if(!(is_src_reg(opcode)) && !(is_dst_reg(opcode)))
{ // MOVE IV,IV
SRC_LATCH;
- if(SRC_IS_RIGHT_BANK)
- src = rotate(m_right_IV,7-SRC_LSB);
- else
- src = rotate(m_left_IV,7-SRC_LSB);
+ src = rotate(m_IV_latch,7-SRC_LSB);
mask = ((1 << rotlen)-1);
dst = src & mask;
dst <<= (7-DST_LSB);
mask <<= (7-DST_LSB);
- if(SRC_IS_RIGHT_BANK) // untouched source IV bits are preserved and sent to destination IV
- {
- dst = (m_right_IV & ~mask) | (dst & mask);
- m_right_IV = dst;
- WRITEPORT(m_IVR+0x100,m_right_IV);
- }
+ if(DST_IS_RIGHT_BANK) // untouched source IV bits are preserved and sent to destination IV
+ xmit_rb(dst, mask);
else
- {
- dst = (m_left_IV & ~mask) | (dst & mask);
- m_left_IV = dst;
- WRITEPORT(m_IVL,m_left_IV);
- }
+ xmit_lb(dst, mask);
}
}
break;
case 0x01: // ADD
+ {
+ uint16_t result;
rotlen = ROTLEN;
if(is_rot(opcode))
{ // ADD reg,reg
src = rotate(get_reg(SRC),rotlen);
result = src + m_AUX;
- set_reg(DST,result & 0xff);
+ set_reg(DST,result & 0xff,false);
SET_OVF;
}
else
@@ -314,65 +373,43 @@ void n8x300_cpu_device::execute_run()
mask <<= DST_LSB;
SET_OVF;
if(DST_IS_RIGHT_BANK)
- {
- dst = (m_right_IV & ~mask) | (dst & mask);
- m_right_IV = dst;
- WRITEPORT(m_IVR+0x100,m_right_IV);
- }
+ xmit_rb(dst, mask);
else
- {
- dst = (m_left_IV & ~mask) | (dst & mask);
- m_left_IV = dst;
- WRITEPORT(m_IVL,m_left_IV);
- }
+ xmit_lb(dst, mask);
}
else if(!(is_src_reg(opcode)) && is_dst_reg(opcode))
{ // ADD IV,reg
SRC_LATCH;
mask = ((1 << rotlen)-1);
- if(SRC_IS_RIGHT_BANK)
- src = rotate(m_right_IV,7-SRC_LSB) & mask;
- else
- src = rotate(m_left_IV,7-SRC_LSB) & mask;
+ src = rotate(m_IV_latch,7-SRC_LSB) & mask;
result = src + m_AUX;
SET_OVF;
- set_reg(DST,result & 0xff);
+ set_reg(DST,result & 0xff,false);
}
else if(!(is_src_reg(opcode)) && !(is_dst_reg(opcode)))
{ // ADD IV,IV
SRC_LATCH;
- DST_LATCH;
mask = ((1 << rotlen)-1);
- if(SRC_IS_RIGHT_BANK)
- src = rotate(m_right_IV,7-SRC_LSB) & mask;
- else
- src = rotate(m_left_IV,7-SRC_LSB) & mask;
+ src = rotate(m_IV_latch,7-SRC_LSB) & mask;
result = src + m_AUX;
SET_OVF;
dst = (result << (7-DST_LSB)) & 0xff;
mask <<= (7-DST_LSB);
- if(SRC_IS_RIGHT_BANK) // unused destination IV data is not preserved, is merged with input IV data
- {
- dst = (m_right_IV & ~mask) | (dst & mask);
- m_right_IV = dst;
- WRITEPORT(m_IVR+0x100,m_right_IV);
- }
+ if(DST_IS_RIGHT_BANK) // unused destination IV data is not preserved, is merged with input IV data
+ xmit_rb(dst, mask);
else
- {
- dst = (m_left_IV & ~mask) | (dst & mask);
- m_left_IV = dst;
- WRITEPORT(m_IVL,m_left_IV);
- }
+ xmit_lb(dst, mask);
}
}
break;
+ }
case 0x02: // AND
rotlen = ROTLEN;
if(is_rot(opcode))
{ // AND reg,reg
src = rotate(get_reg(SRC),rotlen);
dst = src & m_AUX;
- set_reg(DST,dst);
+ set_reg(DST,dst,false);
}
else
{
@@ -381,60 +418,36 @@ void n8x300_cpu_device::execute_run()
if(is_src_reg(opcode) && !(is_dst_reg(opcode)))
{ // AND reg,IV
DST_LATCH;
- src = get_reg(SRC) & m_AUX;
+ src = get_reg(SRC);
+ dst = src & m_AUX;
mask = ((1 << rotlen)-1);
- src <<= (7-DST_LSB);
+ dst <<= (7-DST_LSB);
mask <<= (7-DST_LSB);
if(DST_IS_RIGHT_BANK)
- {
- dst = (m_right_IV & ~mask) | (src & mask);
- m_right_IV = dst;
- WRITEPORT(m_IVR+0x100,m_right_IV);
- }
+ xmit_rb(dst, mask);
else
- {
- dst = (m_left_IV & ~mask) | (src & mask);
- m_left_IV = dst;
- WRITEPORT(m_IVL,m_left_IV);
- }
+ xmit_lb(dst, mask);
}
else if(!(is_src_reg(opcode)) && is_dst_reg(opcode))
{ // AND IV,reg
SRC_LATCH;
mask = ((1 << rotlen)-1);
- if(SRC_IS_RIGHT_BANK)
- src = rotate(m_right_IV,7-SRC_LSB) & mask;
- else
- src = rotate(m_left_IV,7-SRC_LSB) & mask;
- src &= mask;
+ src = rotate(m_IV_latch,7-SRC_LSB) & mask;
dst = src & m_AUX;
- set_reg(DST,dst);
+ set_reg(DST,dst,false);
}
else if(!(is_src_reg(opcode)) && !(is_dst_reg(opcode)))
{ // AND IV,IV
SRC_LATCH;
- DST_LATCH;
mask = ((1 << rotlen)-1);
- if(SRC_IS_RIGHT_BANK)
- src = rotate(m_right_IV,7-SRC_LSB) & mask;
- else
- src = rotate(m_left_IV,7-SRC_LSB) & mask;
- src &= mask;
+ src = rotate(m_IV_latch,7-SRC_LSB) & mask;
dst = src & m_AUX;
dst <<= (7-DST_LSB);
mask <<= (7-DST_LSB);
- if(SRC_IS_RIGHT_BANK)
- {
- dst = (m_right_IV & ~mask) | (src & mask);
- m_right_IV = dst;
- WRITEPORT(m_IVR+0x100,m_right_IV);
- }
+ if(DST_IS_RIGHT_BANK)
+ xmit_rb(dst, mask);
else
- {
- dst = (m_left_IV & ~mask) | (src & mask);
- m_left_IV = dst;
- WRITEPORT(m_IVL,m_left_IV);
- }
+ xmit_lb(dst, mask);
}
}
break;
@@ -444,69 +457,45 @@ void n8x300_cpu_device::execute_run()
{ // AND reg,reg
src = rotate(get_reg(SRC),rotlen);
dst = src ^ m_AUX;
- set_reg(DST,dst);
+ set_reg(DST,dst,false);
}
else
{
if(rotlen == 0)
rotlen = 8; // 0 = 8-bit I/O field length
if(is_src_reg(opcode) && !(is_dst_reg(opcode)))
- { // AND reg,IV
+ { // XOR reg,IV
DST_LATCH;
- src = get_reg(SRC) ^ m_AUX;
+ src = get_reg(SRC);
+ dst = src ^ m_AUX;
mask = ((1 << rotlen)-1);
- src <<= (7-DST_LSB);
+ dst <<= (7-DST_LSB);
mask <<= (7-DST_LSB);
if(DST_IS_RIGHT_BANK)
- {
- dst = (m_right_IV & ~mask) | (src & mask);
- m_right_IV = dst;
- WRITEPORT(m_IVR+0x100,m_right_IV);
- }
+ xmit_rb(dst, mask);
else
- {
- dst = (m_left_IV & ~mask) | (src & mask);
- m_left_IV = dst;
- WRITEPORT(m_IVL,m_left_IV);
- }
+ xmit_lb(dst, mask);
}
else if(!(is_src_reg(opcode)) && is_dst_reg(opcode))
- { // AND IV,reg
+ { // XOR IV,reg
SRC_LATCH;
mask = ((1 << rotlen)-1);
- if(SRC_IS_RIGHT_BANK)
- src = rotate(m_right_IV,7-SRC_LSB) & mask;
- else
- src = rotate(m_left_IV,7-SRC_LSB) & mask;
- src &= mask;
+ src = rotate(m_IV_latch,7-SRC_LSB) & mask;
dst = src ^ m_AUX;
- set_reg(DST,dst);
+ set_reg(DST,dst,false);
}
else if(!(is_src_reg(opcode)) && !(is_dst_reg(opcode)))
- { // AND IV,IV
+ { // XOR IV,IV
SRC_LATCH;
- DST_LATCH;
mask = ((1 << rotlen)-1);
- if(SRC_IS_RIGHT_BANK)
- src = rotate(m_right_IV,7-SRC_LSB) & mask;
- else
- src = rotate(m_left_IV,7-SRC_LSB) & mask;
- src &= mask;
+ src = rotate(m_IV_latch,7-SRC_LSB) & mask;
dst = src ^ m_AUX;
dst <<= (7-DST_LSB);
mask <<= (7-DST_LSB);
- if(SRC_IS_RIGHT_BANK)
- {
- dst = (m_right_IV & ~mask) | (src & mask);
- m_right_IV = dst;
- WRITEPORT(m_IVR+0x100,m_right_IV);
- }
+ if(DST_IS_RIGHT_BANK)
+ xmit_rb(dst, mask);
else
- {
- dst = (m_left_IV & ~mask) | (src & mask);
- m_left_IV = dst;
- WRITEPORT(m_IVL,m_left_IV);
- }
+ xmit_lb(dst, mask);
}
}
break;
@@ -524,10 +513,7 @@ void n8x300_cpu_device::execute_run()
if(rotlen == 0)
rotlen = 8; // 0 = 8-bit I/O field length
mask = ((1 << rotlen)-1);
- if(SRC_IS_RIGHT_BANK)
- src = rotate(m_right_IV,7-SRC_LSB);
- else
- src = rotate(m_left_IV,7-SRC_LSB);
+ src = rotate(m_IV_latch,7-SRC_LSB);
src &= mask;
src += IMM5;
SET_AR((m_AR & 0x1fe0) | (src & 0x1f));
@@ -547,11 +533,7 @@ void n8x300_cpu_device::execute_run()
if(rotlen == 0)
rotlen = 8; // 0 = 8-bit I/O field length
mask = ((1 << rotlen)-1);
- if(SRC_IS_RIGHT_BANK)
- src = rotate(m_right_IV,7-SRC_LSB);
- else
- src = rotate(m_left_IV,7-SRC_LSB);
- rotate(src,SRC_LSB);
+ src = rotate(m_IV_latch,7-SRC_LSB);
src &= mask;
if(src != 0)
SET_PC((m_PC & 0x1fe0) | IMM5);
@@ -560,7 +542,7 @@ void n8x300_cpu_device::execute_run()
case 0x06: // XMIT (Transmit)
// the source is actually the destination for this instruction
if(is_src_reg(opcode))
- set_reg(SRC,IMM8);
+ set_reg(SRC,IMM8,true);
else
{
SRC_LATCH;
@@ -572,15 +554,9 @@ void n8x300_cpu_device::execute_run()
mask <<= (7-SRC_LSB);
dst <<= (7-SRC_LSB);
if(SRC_IS_RIGHT_BANK)
- {
- m_right_IV = (m_right_IV & ~mask) | (dst & mask);
- WRITEPORT(m_IVR+0x100,m_right_IV);
- }
+ xmit_rb(dst, mask);
else
- {
- m_left_IV = (m_left_IV & ~mask) | (dst & mask);
- WRITEPORT(m_IVL,m_left_IV);
- }
+ xmit_lb(dst, mask);
}
break;
case 0x07: // JMP
diff --git a/src/devices/cpu/8x300/8x300.h b/src/devices/cpu/8x300/8x300.h
index e3e3d68e7f6..155079d225a 100644
--- a/src/devices/cpu/8x300/8x300.h
+++ b/src/devices/cpu/8x300/8x300.h
@@ -28,11 +28,11 @@ enum
_8X300_IVL,
_8X300_OVF,
_8X300_R11,
- _8X300_UNUSED12,
- _8X300_UNUSED13,
- _8X300_UNUSED14,
- _8X300_UNUSED15,
- _8X300_UNUSED16,
+ _8X300_R12,
+ _8X300_R13,
+ _8X300_R14,
+ _8X300_R15,
+ _8X300_R16,
_8X300_IVR,
_8X300_LIV,
_8X300_RIV,
@@ -45,8 +45,13 @@ public:
// construction/destruction
n8x300_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+ auto sc_callback() { return m_sc_callback.bind(); }
+
protected:
+ n8x300_cpu_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock);
+
// device-level overrides
+ virtual void device_resolve_objects() override;
virtual void device_start() override;
virtual void device_reset() override;
@@ -65,6 +70,12 @@ protected:
// device_disasm_interface overrides
virtual std::unique_ptr<util::disasm_interface> create_disassembler() override;
+ virtual void set_reg(uint8_t reg, uint8_t val, bool xmit);
+ virtual uint8_t get_reg(uint8_t reg);
+
+ void xmit_lb(uint8_t dst, uint8_t mask);
+ void xmit_rb(uint8_t dst, uint8_t mask);
+
address_space_config m_program_config;
address_space_config m_io_config;
@@ -72,9 +83,11 @@ protected:
bool m_increment_pc;
address_space *m_program;
- memory_access_cache<1, 0, ENDIANNESS_BIG> *m_cache;
+ memory_access_cache<1, -1, ENDIANNESS_BIG> *m_cache;
address_space *m_io;
+ devcb_write8 m_sc_callback; // Select Command (address latch)
+
uint16_t m_PC; // Program Counter
uint16_t m_AR; // Address Register
uint16_t m_IR; // Instruction Register
@@ -86,13 +99,17 @@ protected:
uint8_t m_R5;
uint8_t m_R6;
uint8_t m_R11;
+ uint8_t m_R12;
+ uint8_t m_R13;
+ uint8_t m_R14;
+ uint8_t m_R15;
+ uint8_t m_R16;
uint8_t m_IVL; // Interface vector (I/O) left bank (write-only)
uint8_t m_IVR; // Interface vector (I/O) right bank (write-only)
uint8_t m_OVF; // Overflow register (read-only)
uint16_t m_genPC;
- uint8_t m_left_IV; // IV bank contents, these are latched when IVL or IVR are set
- uint8_t m_right_IV;
+ uint8_t m_IV_latch; // IV bank contents, these are latched when IVL or IVR are set
private:
inline bool is_rot(uint16_t opcode)
@@ -120,10 +137,20 @@ private:
{
return ((s & ((uint8_t)0xff << n)) >> n) | ((s & ((uint8_t)0xff >> (8-n))) << (8-n));
}
- void set_reg(uint8_t reg,uint8_t val);
- uint8_t get_reg(uint8_t reg);
+};
+
+class n8x305_cpu_device : public n8x300_cpu_device
+{
+public:
+ // construction/destruction
+ n8x305_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+
+protected:
+ virtual void set_reg(uint8_t reg, uint8_t val, bool xmit) override;
+ virtual uint8_t get_reg(uint8_t reg) override;
};
DECLARE_DEVICE_TYPE(N8X300, n8x300_cpu_device)
+DECLARE_DEVICE_TYPE(N8X305, n8x305_cpu_device)
#endif // MAME_CPU_8X300_8X300_H
diff --git a/src/devices/cpu/8x300/8x300dasm.cpp b/src/devices/cpu/8x300/8x300dasm.cpp
index db231195f04..3f03ed19cfd 100644
--- a/src/devices/cpu/8x300/8x300dasm.cpp
+++ b/src/devices/cpu/8x300/8x300dasm.cpp
@@ -19,7 +19,7 @@
const char *const n8x300_disassembler::reg_names[32] =
{
"AUX", "R1", "R2", "R3", "R4", "R5", "R6", "IVL", "OVF", "R11",
- "Unused12", "Unused13", "Unused14", "Unused15", "Unused16", "IVR",
+ "R12", "R13", "R14", "R15", "R16", "IVR",
"LIV0", "LIV1", "LIV2", "LIV3", "LIV4", "LIV5", "LIV6", "LIV7",
"RIV0", "RIV1", "RIV2", "RIV3", "RIV4", "RIV5", "RIV6", "RIV7"
};
@@ -43,7 +43,7 @@ bool n8x300_disassembler::is_src_rot(uint16_t opcode)
u32 n8x300_disassembler::opcode_alignment() const
{
- return 2;
+ return 1;
}
offs_t n8x300_disassembler::disassemble(std::ostream &stream, offs_t pc, const data_buffer &opcodes, const data_buffer &params)
@@ -51,7 +51,7 @@ offs_t n8x300_disassembler::disassemble(std::ostream &stream, offs_t pc, const d
unsigned startpc = pc;
uint16_t opcode = opcodes.r16(pc);
uint8_t inst = opcode >> 13;
- pc+=2;
+ pc+=1;
// determine instruction
switch (inst)
@@ -127,7 +127,7 @@ offs_t n8x300_disassembler::disassemble(std::ostream &stream, offs_t pc, const d
}
break;
case 0x07:
- util::stream_format(stream, "JMP %04XH", (opcode & 0x1fff) << 1);
+ util::stream_format(stream, "JMP %04XH", (opcode & 0x1fff));
break;
}
diff --git a/src/devices/cpu/alpha/alpha.cpp b/src/devices/cpu/alpha/alpha.cpp
new file mode 100644
index 00000000000..9ebfc6dd09e
--- /dev/null
+++ b/src/devices/cpu/alpha/alpha.cpp
@@ -0,0 +1,995 @@
+// license:BSD-3-Clause
+// copyright-holders:Patrick Mackinlay
+
+/*
+ * An implementation of the Digital Alpha CPU family.
+ *
+ * Sources:
+ *
+ * http://bitsavers.org/pdf/dec/alpha/21064-aa-RISC%20Microprocessor%20Preliminary%20Data%20Sheet-apr92.pdf
+ * http://bitsavers.org/pdf/dec/alpha/Sites_AlphaAXPArchitectureReferenceManual_2ed_1995.pdf
+ * https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;a=blob_plain;f=opcodes/alpha-opc.c;hb=HEAD
+ * http://ftp.twaren.net/NetBSD/misc/dec-docs/
+ *
+ * TODO
+ * - interrupts and exceptions
+ * - address translation
+ * - ibox/abox registers
+ * - floating point instructions
+ * - primary caches
+ * - later cpu implementations
+ * - instruction set extensions
+ * - big-endian mode
+ */
+
+#include "emu.h"
+#include "alpha.h"
+#include "common.h"
+
+#include "debugger.h"
+
+#include "softfloat3/source/include/softfloat.h"
+
+#define LOG_GENERAL (1U << 0)
+#define LOG_EXCEPTION (1U << 1)
+#define LOG_SYSCALLS (1U << 2)
+
+//#define VERBOSE (LOG_GENERAL | LOG_EXCEPTION)
+
+#include "logmacro.h"
+
+DEFINE_DEVICE_TYPE(DEC_21064, dec_21064_device, "21064", "DEC Alpha 21064")
+
+dec_21064_device::dec_21064_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
+ : alpha_ev4_device(mconfig, DEC_21064, tag, owner, clock)
+{
+}
+
+alpha_ev4_device::alpha_ev4_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock)
+ : alpha_device(mconfig, type, tag, owner, clock)
+{
+}
+
+alpha_device::alpha_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock)
+ : cpu_device(mconfig, type, tag, owner, clock)
+ , m_dasm_type(alpha_disassembler::dasm_type::TYPE_UNKNOWN)
+ , m_as_config
+ {
+ address_space_config("0", ENDIANNESS_LITTLE, 64, 32, 0),
+ address_space_config("1", ENDIANNESS_LITTLE, 64, 32, 0),
+ address_space_config("2", ENDIANNESS_LITTLE, 64, 32, 0),
+ address_space_config("3", ENDIANNESS_LITTLE, 64, 32, 0)
+ }
+ , m_srom_oe_cb(*this)
+ , m_srom_data_cb(*this)
+ , m_icount(0)
+{
+}
+
+void alpha_device::device_start()
+{
+ set_icountptr(m_icount);
+
+ save_item(NAME(m_pc));
+ save_item(NAME(m_r));
+ save_item(NAME(m_f));
+
+ save_item(NAME(m_pal_mode));
+
+ state_add(STATE_GENPC, "GENPC", m_pc).noshow();
+ state_add(STATE_GENPCBASE, "CURPC", m_pc).noshow();
+
+ state_add(64, "PC", m_pc);
+
+ // integer registers
+ for (unsigned i = 0; i < 32; i++)
+ state_add(i, util::string_format("R%d", i).c_str(), m_r[i]);
+
+ // floating point registers
+ for (unsigned i = 0; i < 32; i++)
+ state_add(i + 32, util::string_format("F%d", i).c_str(), m_f[i]);
+
+ m_srom_oe_cb.resolve_safe();
+ m_srom_data_cb.resolve_safe(0);
+}
+
+void alpha_device::device_reset()
+{
+ m_pc = 0;
+ m_pal_mode = true;
+}
+
+void alpha_device::execute_run()
+{
+ while (m_icount > 0)
+ {
+ debugger_instruction_hook(m_pc);
+
+ fetch(m_pc,
+ [this](u32 const op)
+ {
+ // update the program counter
+ m_pc += 4;
+
+ // execute an instruction
+ cpu_execute(op);
+
+ // reset always-zero registers
+ m_r[31] = 0;
+ m_f[31] = 0;
+ });
+
+ m_icount--;
+ }
+}
+
+void alpha_device::execute_set_input(int inputnum, int state)
+{
+}
+
+device_memory_interface::space_config_vector alpha_device::memory_space_config() const
+{
+ /*
+ * EV4 devices have a 34-bit physical address space. This is mapped using
+ * the top two bits to select one of four memory spaces with the other 32
+ * bits giving the offset within each space. This approach works out quite
+ * well for the jensen hardware, which uses the first space for memory, and
+ * the others for a variety of I/O memory mapping.
+ *
+ * Note: space numbers are multiplied by two to avoid the special handling
+ * applied to the decrypted opcode space (number 3).
+ */
+ return space_config_vector {
+ std::make_pair(0, &m_as_config[0]),
+ std::make_pair(2, &m_as_config[1]),
+ std::make_pair(4, &m_as_config[2]),
+ std::make_pair(6, &m_as_config[3])
+ };
+}
+
+bool alpha_device::memory_translate(int spacenum, int intention, offs_t &address)
+{
+ u64 placeholder = s64(s32(address));
+
+ if (cpu_translate(placeholder, intention))
+ {
+ address = placeholder;
+
+ return true;
+ }
+
+ return false;
+}
+
+std::unique_ptr<util::disasm_interface> alpha_device::create_disassembler()
+{
+ return std::make_unique<alpha_disassembler>(m_dasm_type);
+}
+
+void alpha_device::cpu_execute(u32 const op)
+{
+ switch ((op >> 26) & 0x3f)
+ {
+ case 0x08: m_r[Ra(op)] = m_r[Rb(op)] + Disp_M(op); break; // lda
+ case 0x09: m_r[Ra(op)] = m_r[Rb(op)] + (Disp_M(op) << 16); break; // ldah
+ case 0x0b: load<u64>((m_r[Rb(op)] + Disp_M(op)) & ~7, [this, op](u64 data) { m_r[Ra(op)] = data; }); break; // ldq_u
+ case 0x0f: store<u64>((m_r[Rb(op)] + Disp_M(op)) & ~7, m_r[Ra(op)]); break; // stq_u
+
+ case 0x10: // INTA* (integer arithmetic)
+ switch ((op >> 5) & 0xff)
+ {
+ // register variants
+ case 0x00: m_r[Rc(op)] = s64(s32(m_r[Ra(op)]) + s32(m_r[Rb(op)])); break; // addl
+ case 0x02: m_r[Rc(op)] = s64(s32(m_r[Ra(op)] << 2) + s32(m_r[Rb(op)])); break; // s4addl
+ case 0x09: m_r[Rc(op)] = s64(s32(m_r[Ra(op)]) - s32(m_r[Rb(op)])); break; // subl
+ case 0x0b: m_r[Rc(op)] = s64(s32(m_r[Ra(op)] << 2) - s32(m_r[Rb(op)])); break; // s4subl
+ case 0x0f: // cmpbge
+ {
+ u8 temp = 0;
+ for (unsigned i = 0; i < 8; i++)
+ if (u8(m_r[Ra(op)] >> (i * 8)) >= u8(m_r[Rb(op)] >> (i * 8)))
+ temp |= (1U << i);
+
+ m_r[Rc(op)] = u64(temp);
+ }
+ break;
+ case 0x12: m_r[Rc(op)] = s64(s32(m_r[Ra(op)] << 3) + s32(m_r[Rb(op)])); break; // s8addl
+ case 0x1b: m_r[Rc(op)] = s64(s32(m_r[Ra(op)] << 3) - s32(m_r[Rb(op)])); break; // s8subl
+ case 0x1d: m_r[Rc(op)] = m_r[Ra(op)] < m_r[Rb(op)]; break; // cmpult
+ case 0x20: m_r[Rc(op)] = m_r[Ra(op)] + m_r[Rb(op)]; break; // addq
+ case 0x22: m_r[Rc(op)] = (m_r[Ra(op)] << 2) + m_r[Rb(op)]; break; // s4addq
+ case 0x29: m_r[Rc(op)] = m_r[Ra(op)] - m_r[Rb(op)]; break; // subq
+ case 0x2b: m_r[Rc(op)] = (m_r[Ra(op)] << 2) - m_r[Rb(op)]; break; // s4subq
+ case 0x2d: m_r[Rc(op)] = m_r[Ra(op)] == m_r[Rb(op)]; break; // cmpeq
+ case 0x32: m_r[Rc(op)] = (m_r[Ra(op)] << 3) + m_r[Rb(op)]; break; // s8addq
+ case 0x3b: m_r[Rc(op)] = (m_r[Ra(op)] << 3) - m_r[Rb(op)]; break; // s8subq
+ case 0x3d: m_r[Rc(op)] = m_r[Ra(op)] <= m_r[Rb(op)]; break; // cmpule
+ case 0x40: m_r[Rc(op)] = s64(s32(m_r[Ra(op)]) + s32(m_r[Rb(op)])); break; // addl/v
+ case 0x49: m_r[Rc(op)] = s64(s32(m_r[Ra(op)]) - s32(m_r[Rb(op)])); break; // subl/v
+ case 0x4d: m_r[Rc(op)] = s64(m_r[Ra(op)]) < s64(m_r[Rb(op)]); break; // cmplt
+ case 0x60: m_r[Rc(op)] = m_r[Ra(op)] + m_r[Rb(op)]; break; // addq/v
+ case 0x69: m_r[Rc(op)] = m_r[Ra(op)] - m_r[Rb(op)]; break; // subq/v
+ case 0x6d: m_r[Rc(op)] = s64(m_r[Ra(op)]) <= s64(m_r[Rb(op)]); break; // cmple
+
+ // immediate variants
+ case 0x80: m_r[Rc(op)] = s64(s32(m_r[Ra(op)]) + s32(Im(op))); break; // addl
+ case 0x82: m_r[Rc(op)] = s64(s32(m_r[Ra(op)] << 2) + s32(Im(op))); break; // s4addl
+ case 0x89: m_r[Rc(op)] = s64(s32(m_r[Ra(op)]) - s32(Im(op))); break; // subl
+ case 0x8b: m_r[Rc(op)] = s64(s32(m_r[Ra(op)] << 2) - s32(Im(op))); break; // s4subl
+ case 0x8f: // cmpbge
+ {
+ u8 temp = 0;
+ for (unsigned i = 0; i < 8; i++)
+ if (u8(m_r[Ra(op)] >> (i * 8)) >= u8(Im(op)))
+ temp |= (1U << i);
+
+ m_r[Rc(op)] = u64(temp);
+ }
+ break;
+ case 0x92: m_r[Rc(op)] = s64(s32(m_r[Ra(op)] << 3) + s32(Im(op))); break; // s4addl
+ case 0x9b: m_r[Rc(op)] = s64(s32(m_r[Ra(op)] << 3) - s32(Im(op))); break; // s8subl
+ case 0x9d: m_r[Rc(op)] = m_r[Ra(op)] < Im(op); break; // cmpult
+ case 0xa0: m_r[Rc(op)] = m_r[Ra(op)] + Im(op); break; // addq
+ case 0xa2: m_r[Rc(op)] = (m_r[Ra(op)] << 2) + Im(op); break; // s4addq
+ case 0xa9: m_r[Rc(op)] = m_r[Ra(op)] - Im(op); break; // subq
+ case 0xab: m_r[Rc(op)] = (m_r[Ra(op)] << 2) - Im(op); break; // s4subq
+ case 0xad: m_r[Rc(op)] = m_r[Ra(op)] == Im(op); break; // cmpeq
+ case 0xb2: m_r[Rc(op)] = (m_r[Ra(op)] << 3) + Im(op); break; // s8addq
+ case 0xbb: m_r[Rc(op)] = (m_r[Ra(op)] << 3) - Im(op); break; // s8subq
+ case 0xbd: m_r[Rc(op)] = m_r[Ra(op)] <= Im(op); break; // cmpule
+ case 0xc0: m_r[Rc(op)] = s64(s32(m_r[Ra(op)]) + s32(Im(op))); break; // addl/v
+ case 0xc9: m_r[Rc(op)] = s64(s32(m_r[Ra(op)]) - s32(Im(op))); break; // subl/v
+ case 0xcd: m_r[Rc(op)] = s64(m_r[Ra(op)]) < s64(Im(op)); break; // cmplt
+ case 0xe0: m_r[Rc(op)] = m_r[Ra(op)] + Im(op); break; // addq/v
+ case 0xe9: m_r[Rc(op)] = m_r[Ra(op)] - Im(op); break; // subq/v
+ case 0xed: m_r[Rc(op)] = s64(m_r[Ra(op)]) <= s64(Im(op)); break; // cmple
+ }
+ break;
+ case 0x11: // INTL* (integer logical)
+ switch ((op >> 5) & 0xff)
+ {
+ // register variants
+ case 0x00: m_r[Rc(op)] = m_r[Ra(op)] & m_r[Rb(op)]; break; // and
+ case 0x08: m_r[Rc(op)] = m_r[Ra(op)] & ~m_r[Rb(op)]; break; // bic
+ case 0x14: // cmovlbs
+ if (BIT(m_r[Ra(op)], 0))
+ m_r[Rc(op)] = m_r[Rb(op)];
+ break;
+ case 0x16: // cmovlbc
+ if (!BIT(m_r[Ra(op)], 0))
+ m_r[Rc(op)] = m_r[Rb(op)];
+ break;
+ case 0x20: m_r[Rc(op)] = m_r[Ra(op)] | m_r[Rb(op)]; break; // bis
+ case 0x24: // cmoveq
+ if (m_r[Ra(op)] == 0)
+ m_r[Rc(op)] = m_r[Rb(op)];
+ break;
+ case 0x26: // cmovne
+ if (m_r[Ra(op)] != 0)
+ m_r[Rc(op)] = m_r[Rb(op)];
+ break;
+ case 0x28: m_r[Rc(op)] = m_r[Ra(op)] | ~m_r[Rb(op)]; break; // ornot
+ case 0x40: m_r[Rc(op)] = m_r[Ra(op)] ^ m_r[Rb(op)]; break; // xor
+ case 0x44: // cmovlt
+ if (s64(m_r[Ra(op)]) < 0)
+ m_r[Rc(op)] = m_r[Rb(op)];
+ break;
+ case 0x46: // cmovge
+ if (s64(m_r[Ra(op)]) >= 0)
+ m_r[Rc(op)] = m_r[Rb(op)];
+ break;
+ case 0x48: m_r[Rc(op)] = m_r[Ra(op)] ^ ~m_r[Rb(op)]; break; // eqv
+ case 0x61: m_r[Rc(op)] = m_r[Rb(op)]; break; // amask
+ case 0x64: // cmovle
+ if (s64(m_r[Ra(op)]) <= 0)
+ m_r[Rc(op)] = m_r[Rb(op)];
+ break;
+ case 0x66: // cmovgt
+ if (s64(m_r[Ra(op)]) > 0)
+ m_r[Rc(op)] = m_r[Rb(op)];
+ break;
+
+ // immediate variants
+ case 0x80: m_r[Rc(op)] = m_r[Ra(op)] & Im(op); break; // and
+ case 0x88: m_r[Rc(op)] = m_r[Ra(op)] & ~Im(op); break; // bic
+ case 0x94: // cmovlbs
+ if (BIT(m_r[Ra(op)], 0))
+ m_r[Rc(op)] = Im(op);
+ break;
+ case 0x96: // cmovlbc
+ if (!BIT(m_r[Ra(op)], 0))
+ m_r[Rc(op)] = Im(op);
+ break;
+ case 0xa0: m_r[Rc(op)] = m_r[Ra(op)] | Im(op); break; // bis
+ case 0xa4: // cmoveq
+ if (m_r[Ra(op)] == 0)
+ m_r[Rc(op)] = Im(op);
+ break;
+ case 0xa6: // cmovne
+ if (m_r[Ra(op)] != 0)
+ m_r[Rc(op)] = Im(op);
+ break;
+ case 0xa8: m_r[Rc(op)] = m_r[Ra(op)] | ~Im(op); break; // ornot
+ case 0xc0: m_r[Rc(op)] = m_r[Ra(op)] ^ Im(op); break; // xor
+ case 0xc4: // cmovlt
+ if (s64(m_r[Ra(op)]) < 0)
+ m_r[Rc(op)] = Im(op);
+ break;
+ case 0xc6: // cmovge
+ if (s64(m_r[Ra(op)]) >= 0)
+ m_r[Rc(op)] = Im(op);
+ break;
+ case 0xc8: m_r[Rc(op)] = m_r[Ra(op)] ^ ~Im(op); break; // eqv
+ case 0xe1: m_r[Rc(op)] = Im(op); break; // amask
+ case 0xe4: // cmovle
+ if (s64(m_r[Ra(op)]) <= 0)
+ m_r[Rc(op)] = Im(op);
+ break;
+ case 0xe6: // cmovgt
+ if (s64(m_r[Ra(op)]) > 0)
+ m_r[Rc(op)] = Im(op);
+ break;
+ case 0xec: m_r[Rc(op)] = 0; break; // implver
+ }
+ break;
+ case 0x12: // INTS* (integer shift)
+ switch ((op >> 5) & 0xff)
+ {
+ // register variants
+ case 0x02: m_r[Rc(op)] = m_r[Ra(op)] & zap_mask(u8(0x01) << (m_r[Rb(op)] & 7)); break; // mskbl
+ case 0x06: m_r[Rc(op)] = (m_r[Ra(op)] >> ((m_r[Rb(op)] & 7) * 8)) & zap_mask(~u8(0x01)); break; // extbl
+ case 0x0b: m_r[Rc(op)] = (m_r[Ra(op)] << ((m_r[Rb(op)] & 7) * 8)) & zap_mask(~(u8(0x01) << (m_r[Rb(op)] & 7))); break; // insbl
+ case 0x12: m_r[Rc(op)] = m_r[Ra(op)] & zap_mask(u8(0x03) << (m_r[Rb(op)] & 7)); break; // mskwl
+ case 0x16: m_r[Rc(op)] = (m_r[Ra(op)] >> ((m_r[Rb(op)] & 7) * 8)) & zap_mask(~u8(0x03)); break; // extwl
+ case 0x1b: m_r[Rc(op)] = (m_r[Ra(op)] << ((m_r[Rb(op)] & 7) * 8)) & zap_mask(~(u8(0x03) << (m_r[Rb(op)] & 7))); break; // inswl
+ case 0x22: m_r[Rc(op)] = m_r[Ra(op)] & zap_mask(u8(0x0f) << (m_r[Rb(op)] & 7)); break; // mskll
+ case 0x26: m_r[Rc(op)] = (m_r[Ra(op)] >> ((m_r[Rb(op)] & 7) * 8)) & zap_mask(~u8(0x0f)); break; // extll
+ case 0x2b: m_r[Rc(op)] = (m_r[Ra(op)] << ((m_r[Rb(op)] & 7) * 8)) & zap_mask(~(u8(0x0f) << (m_r[Rb(op)] & 7))); break; // insll
+ case 0x30: m_r[Rc(op)] = m_r[Ra(op)] & zap_mask(m_r[Rb(op)]); break; // zap
+ case 0x31: m_r[Rc(op)] = m_r[Ra(op)] & ~zap_mask(m_r[Rb(op)]); break; // zapnot
+ case 0x32: m_r[Rc(op)] = m_r[Ra(op)] & zap_mask(u8(0xff) << (m_r[Rb(op)] & 7)); break; // mskql
+ case 0x34: m_r[Rc(op)] = m_r[Ra(op)] >> (m_r[Rb(op)] & 63); break; // srl
+ case 0x36: m_r[Rc(op)] = (m_r[Ra(op)] >> ((m_r[Rb(op)] & 7) * 8)) & zap_mask(u8(~u8(0xff))); break; // extql
+ case 0x39: m_r[Rc(op)] = m_r[Ra(op)] << (m_r[Rb(op)] & 63); break; // sll
+ case 0x3b: m_r[Rc(op)] = (m_r[Ra(op)] << ((m_r[Rb(op)] & 7) * 8)) & zap_mask(~(u8(0xff) << (m_r[Rb(op)] & 7))); break; // insql
+ case 0x3c: m_r[Rc(op)] = s64(m_r[Ra(op)]) >> (m_r[Rb(op)] & 63); break; // sra
+ case 0x52: m_r[Rc(op)] = m_r[Ra(op)] & zap_mask(u8(0x03) >> (8 - (m_r[Rb(op)] & 7))); break; // mskwh
+ case 0x57: m_r[Rc(op)] = (m_r[Ra(op)] >> (64 - ((m_r[Rb(op)] & 7) * 8))) & zap_mask(~(u8(0x03) >> (8 - (m_r[Rb(op)] & 7)))); break; // inswh
+ case 0x5a: m_r[Rc(op)] = (m_r[Ra(op)] << (64 - ((m_r[Rb(op)] & 7) * 8))) & zap_mask(~u8(0x03)); break; // extwh
+ case 0x62: m_r[Rc(op)] = m_r[Ra(op)] & zap_mask(u8(0x0f) >> (8 - (m_r[Rb(op)] & 7))); break; // msklh
+ case 0x67: m_r[Rc(op)] = (m_r[Ra(op)] >> (64 - ((m_r[Rb(op)] & 7) * 8))) & zap_mask(~(u8(0x0f) >> (8 - (m_r[Rb(op)] & 7)))); break; // inslh
+ case 0x6a: m_r[Rc(op)] = (m_r[Ra(op)] << (64 - ((m_r[Rb(op)] & 7) * 8))) & zap_mask(~u8(0x0f)); break; // extlh
+ case 0x72: m_r[Rc(op)] = m_r[Ra(op)] & zap_mask(u8(0xff) >> (8 - (m_r[Rb(op)] & 7))); break; // mskqh
+ case 0x77: m_r[Rc(op)] = (m_r[Ra(op)] >> (64 - ((m_r[Rb(op)] & 7) * 8))) & zap_mask(~(u8(0xff) >> (8 - (m_r[Rb(op)] & 7)))); break; // insqh
+ case 0x7a: m_r[Rc(op)] = (m_r[Ra(op)] << (64 - ((m_r[Rb(op)] & 7) * 8))) & zap_mask(u8(~u8(0xff))); break; // extqh
+
+ // immediate variants
+ case 0x82: m_r[Rc(op)] = m_r[Ra(op)] & zap_mask(u8(0x01) << (Im(op) & 7)); break; // mskbl
+ case 0x86: m_r[Rc(op)] = (m_r[Ra(op)] >> ((Im(op) & 7) * 8)) & zap_mask(~u8(0x01)); break; // extbl
+ case 0x8b: m_r[Rc(op)] = (m_r[Ra(op)] << ((Im(op) & 7) * 8)) & zap_mask(~(u8(0x01) << (Im(op) & 7))); break; // insbl
+ case 0x92: m_r[Rc(op)] = m_r[Ra(op)] & zap_mask(u8(0x03) << (Im(op) & 7)); break; // mskwl
+ case 0x96: m_r[Rc(op)] = (m_r[Ra(op)] >> ((Im(op) & 7) * 8)) & zap_mask(~u8(0x03)); break; // extwl
+ case 0x9b: m_r[Rc(op)] = (m_r[Ra(op)] << ((Im(op) & 7) * 8)) & zap_mask(~(u8(0x03) << (Im(op) & 7))); break; // inswl
+ case 0xa2: m_r[Rc(op)] = m_r[Ra(op)] & zap_mask(u8(0x0f) << (Im(op) & 7)); break; // mskll
+ case 0xa6: m_r[Rc(op)] = (m_r[Ra(op)] >> ((Im(op) & 7) * 8)) & zap_mask(~u8(0x0f)); break; // extll
+ case 0xab: m_r[Rc(op)] = (m_r[Ra(op)] << ((Im(op) & 7) * 8)) & zap_mask(~(u8(0x0f) << (Im(op) & 7))); break; // insll
+ case 0xb0: m_r[Rc(op)] = m_r[Ra(op)] & zap_mask(Im(op)); break; // zap
+ case 0xb1: m_r[Rc(op)] = m_r[Ra(op)] & ~zap_mask(Im(op)); break; // zapnot
+ case 0xb2: m_r[Rc(op)] = m_r[Ra(op)] & zap_mask(u8(0xff) << (Im(op) & 7)); break; // mskql
+ case 0xb4: m_r[Rc(op)] = m_r[Ra(op)] >> (Im(op) & 63); break; // srl
+ case 0xb6: m_r[Rc(op)] = (m_r[Ra(op)] >> ((Im(op) & 7) * 8)) & zap_mask(u8(~u8(0xff))); break; // extql
+ case 0xb9: m_r[Rc(op)] = m_r[Ra(op)] << (Im(op) & 63); break; // sll
+ case 0xbb: m_r[Rc(op)] = (m_r[Ra(op)] << ((Im(op) & 7) * 8)) & zap_mask(~(u8(0xff) << (Im(op) & 7))); break; // insql
+ case 0xbc: m_r[Rc(op)] = s64(m_r[Ra(op)]) >> (Im(op) & 63); break; // sra
+ case 0xd2: m_r[Rc(op)] = m_r[Ra(op)] & zap_mask(u8(0x03) >> (8 - (Im(op) & 7))); break; // mskwh
+ case 0xd7: m_r[Rc(op)] = (m_r[Ra(op)] >> (64 - ((Im(op) & 7) * 8))) & zap_mask(~(u8(0x03) >> (8 - (Im(op) & 7)))); break; // inswh
+ case 0xda: m_r[Rc(op)] = (m_r[Ra(op)] << (64 - ((Im(op) & 7) * 8))) & zap_mask(~u8(0x03)); break; // extwh
+ case 0xe2: m_r[Rc(op)] = m_r[Ra(op)] & zap_mask(u8(0x0f) >> (8 - (Im(op) & 7))); break; // msklh
+ case 0xe7: m_r[Rc(op)] = (m_r[Ra(op)] >> (64 - ((Im(op) & 7) * 8))) & zap_mask(~(u8(0x0f) >> (8 - (Im(op) & 7)))); break; // inslh
+ case 0xea: m_r[Rc(op)] = (m_r[Ra(op)] << (64 - ((Im(op) & 7) * 8))) & zap_mask(~u8(0x0f)); break; // extlh
+ case 0xf2: m_r[Rc(op)] = m_r[Ra(op)] & zap_mask(u8(0xff) >> (8 - (Im(op) & 7))); break; // mskqh
+ case 0xf7: m_r[Rc(op)] = (m_r[Ra(op)] >> (64 - ((Im(op) & 7) * 8))) & zap_mask(~(u8(0xff) >> (8 - (Im(op) & 7)))); break; // insqh
+ case 0xfa: m_r[Rc(op)] = (m_r[Ra(op)] << (64 - ((Im(op) & 7) * 8))) & zap_mask(u8(~u8(0xff))); break; // extqh
+ }
+ break;
+ case 0x13: // INTM* (integer multiply)
+ switch ((op >> 5) & 0xff)
+ {
+ // register variants
+ case 0x00: m_r[Rc(op)] = s64(s32(u32(m_r[Ra(op)]) * u32(m_r[Rb(op)]))); break; // mull
+ case 0x20: m_r[Rc(op)] = m_r[Ra(op)] * m_r[Rb(op)]; break; // mulq
+ case 0x30: mulu_64x64(m_r[Ra(op)], m_r[Rb(op)], &m_r[Rc(op)]); break; // umulh
+ case 0x40: m_r[Rc(op)] = s64(s32(u32(m_r[Ra(op)]) * u32(m_r[Rb(op)]))); break; // mull/v
+ case 0x60: m_r[Rc(op)] = m_r[Ra(op)] * m_r[Rb(op)]; break; // mulq/v
+
+ // immediate variants
+ case 0x80: m_r[Rc(op)] = s64(s32(u32(m_r[Ra(op)]) * u32(Im(op)))); break; // mull
+ case 0xa0: m_r[Rc(op)] = m_r[Ra(op)] * Im(op); break; // mulq
+ case 0xb0: mulu_64x64(m_r[Ra(op)], Im(op), &m_r[Rc(op)]); break; // umulh
+ case 0xc0: m_r[Rc(op)] = s64(s32(u32(m_r[Ra(op)]) * u32(Im(op)))); break; // mull/v
+ case 0xe0: m_r[Rc(op)] = m_r[Ra(op)] * Im(op); break; // mulq/v
+ }
+ break;
+ //case 0x14: // ITFP* (integer to floating)
+ //case 0x15: // FLTV* (vax floating)
+ //case 0x16: // FLTI* (ieee floating)
+ //case 0x17: // FLTL* (floating)
+
+ case 0x18: // MISC* (miscellaneous)
+ // TODO: all of these are effectively no-ops for now
+ switch (u16(op))
+ {
+ case 0x0000: break; // trapb
+ case 0x0400: break; // excb
+ case 0x4000: break; // mb
+ case 0x4400: break; // wmb
+ case 0x8000: break; // fetch
+ case 0xa000: break; // fetch_m
+ case 0xc000: break; // rpcc
+ case 0xe000: break; // rc
+ case 0xe800: break; // ecb
+ case 0xf000: break; // rs
+ case 0xf800: break; // wh64
+ }
+ break;
+
+ case 0x1a: // JSR*
+ m_r[Ra(op)] = m_pc;
+ m_pc = m_r[Rb(op)] & ~3;
+ break;
+
+ case 0x20: load<u32>(m_r[Rb(op)] + Disp_M(op), [this, op](u32 data) { m_f[Ra(op)] = u32_to_f_floating(data); }); break; // ldf
+ case 0x21: load<u64>(m_r[Rb(op)] + Disp_M(op), [this, op](u64 data) { m_f[Ra(op)] = u64_to_g_floating(data); }); break; // ldg
+ case 0x22: load<u32>(m_r[Rb(op)] + Disp_M(op), [this, op](u32 data) { m_f[Ra(op)] = f32_to_f64(float32_t{ data }).v; }); break; // lds
+ case 0x23: load<u64>(m_r[Rb(op)] + Disp_M(op), [this, op](u64 data) { m_f[Ra(op)] = data; }); break; // ldt
+ case 0x24: store<u32>(m_r[Rb(op)] + Disp_M(op), f_floating_to_u32(m_f[Ra(op)])); break; // stf
+ case 0x25: store<u64>(m_r[Rb(op)] + Disp_M(op), u64_to_g_floating(m_f[Ra(op)])); break; // stg
+ case 0x26: store<u32>(m_r[Rb(op)] + Disp_M(op), f64_to_f32(float64_t{ m_f[Ra(op)] }).v); break; // sts
+ case 0x27: store<u64>(m_r[Rb(op)] + Disp_M(op), m_f[Ra(op)]); break; // stt
+ case 0x28: load<u32>(m_r[Rb(op)] + Disp_M(op), [this, op](s32 data) { m_r[Ra(op)] = s64(data); }); break; // ldl
+ case 0x29: load<u64>(m_r[Rb(op)] + Disp_M(op), [this, op](u64 data) { m_r[Ra(op)] = data; }); break; // ldq
+ case 0x2a: // ldl_l
+ load_l<u32>(m_r[Rb(op)] + Disp_M(op),
+ [this, op](address_space &space, u64 address, s32 data)
+ {
+ if (m_lock_watch)
+ m_lock_watch->remove();
+
+ m_r[Ra(op)] = s64(data);
+
+ space.install_write_tap(offs_t(address & ~15), offs_t(address | 15), "ldl_l",
+ [this](offs_t offset, u64 &data, u64 mem_mask)
+ {
+ m_lock_watch->remove();
+ m_lock_watch = nullptr;
+ });
+ });
+ break;
+ case 0x2b: // ldq_l
+ load_l<u64>(m_r[Rb(op)] + Disp_M(op),
+ [this, op](address_space &space, u64 address, u64 data)
+ {
+ if (m_lock_watch)
+ m_lock_watch->remove();
+
+ m_r[Ra(op)] = data;
+
+ space.install_write_tap(offs_t(address & ~15), offs_t(address | 15), "ldq_l",
+ [this](offs_t offset, u64 &data, u64 mem_mask)
+ {
+ m_lock_watch->remove();
+ m_lock_watch = nullptr;
+ });
+ });
+ break;
+ case 0x2c: store<u32>(m_r[Rb(op)] + Disp_M(op), u32(m_r[Ra(op)])); break; // stl
+ case 0x2d: store<u64>(m_r[Rb(op)] + Disp_M(op), m_r[Ra(op)]); break; // stq
+ case 0x2e: // stl_c
+ if (m_lock_watch)
+ {
+ store<u32>(m_r[Rb(op)] + Disp_M(op), u32(m_r[Ra(op)]));
+ m_r[Ra(op)] = 1;
+
+ m_lock_watch->remove();
+ m_lock_watch = nullptr;
+ }
+ else
+ m_r[Ra(op)] = 0;
+ break;
+ case 0x2f: // stq_c
+ if (m_lock_watch)
+ {
+ store<u64>(m_r[Rb(op)] + Disp_M(op), m_r[Ra(op)]);
+ m_r[Ra(op)] = 1;
+
+ m_lock_watch->remove();
+ m_lock_watch = nullptr;
+ }
+ else
+ m_r[Ra(op)] = 0;
+ break;
+
+ // branch format
+ case 0x30: // br
+ m_r[Ra(op)] = m_pc;
+ m_pc += Disp_B(op);
+ break;
+ case 0x31: // fbeq
+ if (!(m_f[Ra(op)] & 0x7fffffff'ffffffffULL))
+ m_pc += Disp_B(op);
+ break;
+ case 0x32: // fblt
+ if (BIT(m_f[Ra(op)], 63) && (m_f[Ra(op)] & 0x7fffffff'ffffffffULL))
+ m_pc += Disp_B(op);
+ break;
+ case 0x33: // fble
+ if (BIT(m_f[Ra(op)], 63) || !(m_f[Ra(op)] & 0x7fffffff'ffffffffULL))
+ m_pc += Disp_B(op);
+ break;
+ case 0x34: // bsr
+ m_r[Ra(op)] = m_pc;
+ m_pc += Disp_B(op);
+ break;
+ case 0x35: // fbne
+ if (m_f[Ra(op)] & 0x7fffffff'ffffffffULL)
+ m_pc += Disp_B(op);
+ break;
+ case 0x36: // fbge
+ if (!BIT(m_f[Ra(op)], 63) || !(m_f[Ra(op)] & 0x7fffffff'ffffffffULL))
+ m_pc += Disp_B(op);
+ break;
+ case 0x37: // fbgt
+ if (!BIT(m_f[Ra(op)], 63) && (m_f[Ra(op)] & 0x7fffffff'ffffffffULL))
+ m_pc += Disp_B(op);
+ break;
+ case 0x38: // blbc
+ if (!BIT(m_r[Ra(op)], 0))
+ m_pc += Disp_B(op);
+ break;
+ case 0x39: // beq
+ if (m_r[Ra(op)] == 0)
+ m_pc += Disp_B(op);
+ break;
+ case 0x3a: // blt
+ if (s64(m_r[Ra(op)]) < 0)
+ m_pc += Disp_B(op);
+ break;
+ case 0x3b: // ble
+ if (s64(m_r[Ra(op)]) <= 0)
+ m_pc += Disp_B(op);
+ break;
+ case 0x3c: // blbs
+ if (BIT(m_r[Ra(op)], 0))
+ m_pc += Disp_B(op);
+ break;
+ case 0x3d: // bne
+ if (m_r[Ra(op)] != 0)
+ m_pc += Disp_B(op);
+ break;
+ case 0x3e: // bge
+ if (s64(m_r[Ra(op)]) >= 0)
+ m_pc += Disp_B(op);
+ break;
+ case 0x3f: // bgt
+ if (s64(m_r[Ra(op)]) > 0)
+ m_pc += Disp_B(op);
+ break;
+ }
+}
+
+u64 alpha_device::zap_mask(u8 const zap_bits)
+{
+ u64 mask = 0;
+
+ for (unsigned i = 0; i < 8; i++)
+ if (!BIT(zap_bits, i))
+ mask |= (0xffULL << (i << 3));
+
+ return mask;
+}
+
+// transform from f_floating memory to register format
+u64 alpha_device::u32_to_f_floating(u32 const data)
+{
+ if (!BIT(data, 14) && (data & 0x00003f80UL))
+ return
+ (u64(data & 0x0000c000UL) << 48) |
+ (u64(7) << 61) |
+ (u64(data & 0x00003fffUL) << 45) |
+ (u64(data & 0xffff0000UL) << 13);
+ else
+ return
+ (u64(data & 0x0000c000UL) << 48) |
+ (u64(data & 0x00003fffUL) << 45) |
+ (u64(data & 0xffff0000UL) << 13);
+}
+
+// transform from f_floating register to memory format
+u32 alpha_device::f_floating_to_u32(u64 const data)
+{
+ return
+ (u32(data >> 48) & 0x0000c000UL) |
+ (u32(data >> 45) & 0x00003fffUL) |
+ (u32(data >> 13) & 0xffff0000UL);
+}
+
+// transform between g_floating register and memory format
+u64 alpha_device::u64_to_g_floating(u64 const data)
+{
+ return
+ ((data & 0x00000000'0000ffffULL) << 48) |
+ ((data & 0x00000000'ffff0000ULL) << 16) |
+ ((data & 0x0000ffff'00000000ULL) >> 16) |
+ ((data & 0xffff0000'00000000ULL) >> 48);
+}
+
+bool alpha_ev4_device::cpu_translate(u64 &address, int intention)
+{
+ // trim virtual address to 43 bits
+ address &= 0x7ff'ffffffff;
+
+ if (intention & TRANSLATE_FETCH)
+ {
+ // instruction superpage mapping
+ if ((m_ibx[IBX_ICCSR] & IBX_ICCSR_R_MAP) && !(m_ibx[IBX_PS] & IBX_PS_R_CM) && (address >> 41) == 2)
+ {
+ address &= 0x3'ffffffff;
+
+ return true;
+ }
+ }
+ else
+ {
+ // data superpage 1 mapping
+ if ((m_abx[ABX_ABOX_CTL] & ABX_ABOX_CTL_SPE_1) && !(m_ibx[IBX_PS] & IBX_PS_R_CM) && (address >> 30) == 0x1ffe)
+ {
+ address &= 0x3fffffff;
+
+ return true;
+ }
+
+ // data superpage 2 mapping
+ if ((m_abx[ABX_ABOX_CTL] & ABX_ABOX_CTL_SPE_2) && !(m_ibx[IBX_PS] & IBX_PS_R_CM) && (address >> 41) == 2)
+ {
+ address &= 0x3'ffffffff;
+
+ return true;
+ }
+ }
+
+ return true;
+}
+
+template <typename T, typename U> std::enable_if_t<std::is_convertible<U, std::function<void(T)>>::value, void> alpha_device::load(u64 address, U &&apply)
+{
+ cpu_translate(address, TRANSLATE_READ);
+
+ unsigned const s = (address >> 31) & 6;
+
+ switch (sizeof(T))
+ {
+ case 1: apply(T(space(s).read_byte(address))); break;
+ case 2: apply(T(space(s).read_word(address))); break;
+ case 4: apply(T(space(s).read_dword(address))); break;
+ case 8: apply(T(space(s).read_qword(address))); break;
+ }
+}
+
+template <typename T, typename U> std::enable_if_t<std::is_convertible<U, std::function<void(address_space &, u64, T)>>::value, void> alpha_device::load_l(u64 address, U &&apply)
+{
+ cpu_translate(address, TRANSLATE_READ);
+
+ unsigned const s = (address >> 31) & 6;
+
+ switch (sizeof(T))
+ {
+ case 4: apply(space(s), address, T(space(s).read_dword(address))); break;
+ case 8: apply(space(s), address, T(space(s).read_qword(address))); break;
+ }
+}
+
+template <typename T, typename U> std::enable_if_t<std::is_convertible<U, T>::value, void> alpha_device::store(u64 address, U data, T mem_mask)
+{
+ cpu_translate(address, TRANSLATE_WRITE);
+
+ unsigned const s = (address >> 31) & 6;
+
+ switch (sizeof(T))
+ {
+ case 1: space(s).write_byte(address, T(data)); break;
+ case 2: space(s).write_word(address, T(data), mem_mask); break;
+ case 4: space(s).write_dword(address, T(data), mem_mask); break;
+ case 8: space(s).write_qword(address, T(data), mem_mask); break;
+ }
+}
+
+void alpha_device::fetch(u64 address, std::function<void(u32)> &&apply)
+{
+ cpu_translate(address, TRANSLATE_FETCH);
+
+ apply(icache_fetch(address));
+}
+
+u32 alpha_device::read_srom(unsigned const bits)
+{
+ u32 data = 0;
+
+ for (unsigned i = 0; i < bits; i++)
+ if (m_srom_data_cb())
+ data |= (1U << i);
+
+ return data;
+}
+
+void alpha_ev4_device::device_start()
+{
+ alpha_device::device_start();
+
+ save_item(NAME(m_ibx));
+ save_item(NAME(m_abx));
+ save_item(NAME(m_pt));
+}
+
+void alpha_ev4_device::device_reset()
+{
+ alpha_device::device_reset();
+
+ m_ibx[IBX_ICCSR] = IBX_ICCSR_R_PC0 | IBX_ICCSR_R_PC1; // FIXME: ASN
+ m_ibx[IBX_PAL_BASE] = 0;
+
+ m_abx[ABX_ABOX_CTL] = 0;
+ m_abx[ABX_BIU_CTL] = 0;
+}
+
+void alpha_ev4_device::cpu_execute(u32 const op)
+{
+ switch (op >> 26)
+ {
+ case 0x00: // call_pal
+ {
+ u16 offset = CALL_PAL | ((op & 0x3f) << 6);
+ if (op & 0x80)
+ {
+ // unprivileged
+ if (op & CALL_PAL_MASK)
+ offset = OPCDEC;
+ else
+ offset |= 0x1000;
+ }
+ else
+ {
+ // privileged
+ if ((op & CALL_PAL_MASK) || (m_ibx[IBX_PS] & IBX_PS_R_CM))
+ offset = OPCDEC;
+ }
+
+ m_ibx[IBX_EXC_ADDR] = m_pc;
+ if (m_pal_mode)
+ m_ibx[IBX_EXC_ADDR] |= 1;
+
+ m_pal_mode = true;
+ m_pc = m_ibx[IBX_PAL_BASE] | offset;
+ }
+ break;
+
+ case 0x19: // hw_mfpr
+ if (op & 0x20)
+ m_r[Ra(op)] = ibx_get(Rc(op));
+ if (op & 0x40)
+ m_r[Ra(op)] = abx_get(Rc(op));
+ if (op & 0x80)
+ m_r[Ra(op)] = m_pt[Rc(op)];
+ break;
+
+ case 0x1d: // hw_mtpr
+ if (op & 0x20)
+ ibx_set(Rc(op), m_r[Ra(op)]);
+ if (op & 0x40)
+ abx_set(Rc(op), m_r[Ra(op)]);
+ if (op & 0x80)
+ m_pt[Rc(op)] = m_r[Ra(op)];
+ break;
+ case 0x1e: // hw_rei
+ m_pc = m_ibx[IBX_EXC_ADDR] & ~3;
+ m_pal_mode = BIT(m_ibx[IBX_EXC_ADDR], 0);
+
+ if (m_lock_watch)
+ {
+ m_lock_watch->remove();
+ m_lock_watch = nullptr;
+ }
+ break;
+
+ default:
+ alpha_device::cpu_execute(op);
+ break;
+ }
+}
+
+u64 alpha_ev4_device::ibx_get(u8 reg)
+{
+ switch (ibx_reg(reg))
+ {
+ // PALmode only
+ case IBX_ITB_PTE:
+ case IBX_ITB_PTE_TEMP:
+ if (m_pal_mode)
+ return m_ibx[reg];
+ else
+ return 0;
+
+ case IBX_ICCSR:
+ case IBX_EXC_ADDR:
+ case IBX_SL_RCV:
+ case IBX_PS:
+ case IBX_EXC_SUM:
+ case IBX_PAL_BASE:
+ case IBX_HIRR:
+ case IBX_SIRR:
+ case IBX_ASTRR:
+ case IBX_HIER:
+ case IBX_SIER:
+ case IBX_ASTER:
+ return m_ibx[reg];
+
+ default:
+ logerror("invalid mfpr/i register %d (%s)\n", reg, machine().describe_context());
+ return 0;
+ }
+}
+
+#define IBX_SET(Reg, Field) if (data & IBX_##Reg##_W_##Field) m_ibx[reg] |= IBX_##Reg##_R_##Field
+#define IBX_SHL(Reg, Field, Shift) m_ibx[reg] |= (data & IBX_##Reg##_W_##Field) << Shift
+#define IBX_SHR(Reg, Field, Shift) m_ibx[reg] |= (data & IBX_##Reg##_W_##Field) >> Shift
+
+void alpha_ev4_device::ibx_set(u8 reg, u64 data)
+{
+ switch (ibx_reg(reg))
+ {
+ // PALmode only
+ case IBX_TB_TAG:
+ case IBX_ITB_PTE:
+ case IBX_ITBZAP:
+ case IBX_ITBASM:
+ case IBX_ITBIS:
+ if (m_pal_mode)
+ {
+ m_ibx[reg] = data;
+ return;
+ }
+ break;
+
+ case IBX_EXC_ADDR:
+ case IBX_EXC_SUM:
+ case IBX_SIRR:
+ case IBX_ASTRR:
+ case IBX_HIER:
+ case IBX_SIER:
+ case IBX_ASTER:
+ case IBX_SL_CLR:
+ case IBX_SL_XMIT:
+ m_ibx[reg] = data;
+ return;
+
+ case IBX_ICCSR:
+ m_ibx[reg] = data & IBX_ICCSR_R_PCE;
+ IBX_SET(ICCSR, PC1);
+ IBX_SET(ICCSR, PC0);
+ IBX_SHL(ICCSR, PCMUX0, 1);
+ IBX_SHR(ICCSR, GRP1, 19);
+ IBX_SHR(ICCSR, ASN, 19);
+ return;
+
+ case IBX_PS:
+ m_ibx[reg] = 0;
+ IBX_SET(PS, CM0);
+ IBX_SET(PS, CM1);
+ return;
+
+ case IBX_PAL_BASE:
+ m_ibx[reg] = data & IBX_PAL_BASE_W;
+ return;
+
+ default:
+ logerror("invalid mtpr/i register %d (%s)\n", reg, machine().describe_context());
+ break;
+ }
+}
+
+u64 alpha_ev4_device::abx_get(u8 reg)
+{
+ switch (abx_reg(reg))
+ {
+ case ABX_DTB_PTE:
+ case ABX_DTB_PTE_TEMP:
+ case ABX_MM_CSR:
+ case ABX_VA:
+ case ABX_BIU_ADDR:
+ case ABX_BIU_STAT:
+ case ABX_DC_STAT:
+ case ABX_FILL_ADDR:
+ return m_abx[reg];
+
+ default:
+ logerror("invalid mfpr/a register %d (%s)\n", reg, machine().describe_context());
+ return 0;
+ }
+}
+
+void alpha_ev4_device::abx_set(u8 reg, u64 data)
+{
+ switch (abx_reg(reg))
+ {
+ case ABX_TB_CTL:
+ case ABX_DTB_PTE:
+ case ABX_DTBZAP:
+ case ABX_DTBASM:
+ case ABX_DTBIS:
+ case ABX_ABOX_CTL:
+ case ABX_ALT_MODE:
+ case ABX_CC:
+ case ABX_CC_CTL:
+ case ABX_BIU_CTL:
+ case ABX_FILL_SYNDROME:
+ case ABX_BC_TAG:
+ case ABX_FLUSH_IC:
+ case ABX_FLUSH_IC_ASM:
+ m_abx[reg] = data;
+ return;
+
+ default:
+ logerror("invalid mtpr/a register %d (%s)\n", reg, machine().describe_context());
+ break;
+ }
+}
+
+void dec_21064_device::device_reset()
+{
+ alpha_ev4_device::device_reset();
+
+ m_srom_oe_cb(0);
+
+ // load icache from srom
+ for (icache_block &block : m_icache)
+ {
+ block.lw[0] = read_srom(32);
+ block.lw[2] = read_srom(32);
+ block.lw[4] = read_srom(32);
+ block.lw[6] = read_srom(32);
+
+ block.tag = read_srom(21);
+ block.aav = read_srom(8);
+
+ block.lw[1] = read_srom(32);
+ block.lw[3] = read_srom(32);
+ block.lw[5] = read_srom(32);
+ block.lw[7] = read_srom(32);
+
+ block.bht = read_srom(8);
+ }
+
+ m_srom_oe_cb(1);
+}
+
+u32 dec_21064_device::icache_fetch(u64 const address)
+{
+ icache_block &block = m_icache[(address >> 5) & 0xff];
+
+ // check tag, valid, and asm or asn
+ if ((block.tag != (address >> 13)) || !(block.aav & AAV_V) || (!(block.aav & AAV_ASM) && ((block.aav & AAV_ASN) != (((m_ibx[IBX_ICCSR] & IBX_ICCSR_R_ASN) >> 28)))))
+ {
+ // fetch a new block
+ block.tag = address >> 13;
+ block.aav = AAV_V | ((m_ibx[IBX_ICCSR] & IBX_ICCSR_R_ASN) >> 28); // TODO: set ASM depending on PTE
+
+ // always set ASM if istream superpage mapping is enabled
+ if (m_ibx[IBX_ICCSR] & IBX_ICCSR_R_MAP)
+ block.aav |= AAV_ASM;
+
+ address_space &s = space((address >> 31) & 6);
+ for (unsigned i = 0; i < 8; i++)
+ block.lw[i] = s.read_dword(address | (i << 2));
+ }
+
+ return block.lw[(address >> 2) & 7];
+}
diff --git a/src/devices/cpu/alpha/alpha.h b/src/devices/cpu/alpha/alpha.h
new file mode 100644
index 00000000000..ac1f5e60e2f
--- /dev/null
+++ b/src/devices/cpu/alpha/alpha.h
@@ -0,0 +1,284 @@
+// license:BSD-3-Clause
+// copyright-holders:Patrick Mackinlay
+
+#ifndef MAME_CPU_ALPHA_ALPHA_H
+#define MAME_CPU_ALPHA_ALPHA_H
+
+#pragma once
+
+#include "alphad.h"
+
+class alpha_device : public cpu_device
+{
+public:
+ void set_dasm_type(alpha_disassembler::dasm_type type) { m_dasm_type = type; }
+
+ // input/output lines
+ auto srom_oe_w() { return m_srom_oe_cb.bind(); }
+ auto srom_data_r() { return m_srom_data_cb.bind(); }
+
+protected:
+ alpha_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock);
+
+ // device_t overrides
+ virtual void device_start() override;
+ virtual void device_reset() override;
+
+ // device_execute_interface overrides
+ virtual u32 execute_min_cycles() const override { return 1; }
+ virtual u32 execute_max_cycles() const override { return 1; }
+ virtual void execute_run() override;
+ virtual void execute_set_input(int inputnum, int state) override;
+
+ // device_memory_interface overrides
+ virtual space_config_vector memory_space_config() const override;
+ virtual bool memory_translate(int spacenum, int intention, offs_t &address) override;
+
+ // device_disasm_interface overrides
+ virtual std::unique_ptr<util::disasm_interface> create_disassembler() override;
+
+ virtual void cpu_execute(u32 const op);
+ virtual bool cpu_translate(u64 &address, int intention) { return false; }
+
+ // execution helpers
+ static u64 zap_mask(u8 const zap_bits);
+ static u64 u64_to_g_floating(u64 const data);
+ static u64 u32_to_f_floating(u32 const data);
+ static u32 f_floating_to_u32(u64 const data);
+
+ // memory access helpers
+ template <typename T, typename U> std::enable_if_t<std::is_convertible<U, std::function<void(T)>>::value, void> load(u64 address, U &&apply);
+ template <typename T, typename U> std::enable_if_t<std::is_convertible<U, std::function<void(address_space &, u64, T)>>::value, void> load_l(u64 address, U &&apply);
+ template <typename T, typename U> std::enable_if_t<std::is_convertible<U, T>::value, void> store(u64 address, U data, T mem_mask = ~T(0));
+ void fetch(u64 address, std::function<void(u32)> &&apply);
+
+ // cache helpers
+ u32 read_srom(unsigned const bits);
+ virtual u32 icache_fetch(u64 const address) = 0;
+
+ // configuration
+ alpha_disassembler::dasm_type m_dasm_type;
+ address_space_config m_as_config[4];
+ devcb_write_line m_srom_oe_cb;
+ devcb_read_line m_srom_data_cb;
+
+ // emulation state
+ int m_icount;
+
+ u64 m_pc;
+ u64 m_r[32];
+ u64 m_f[32];
+
+ bool m_pal_mode;
+ memory_passthrough_handler *m_lock_watch;
+};
+
+class alpha_ev4_device : public alpha_device
+{
+public:
+ alpha_ev4_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock);
+
+protected:
+ // device-level overrides
+ virtual void device_start() override;
+ virtual void device_reset() override;
+
+ // device_execute_interface overrides
+ virtual u32 execute_input_lines() const override { return 6; }
+
+ virtual void cpu_execute(u32 const op) override;
+ virtual bool cpu_translate(u64 &address, int intention) override;
+
+ enum ibx_reg : unsigned
+ {
+ IBX_TB_TAG = 0, // w, PALmode only
+ IBX_ITB_PTE = 1, // r/w, PALmode only
+ IBX_ICCSR = 2, // r/w
+ IBX_ITB_PTE_TEMP = 3, // r, PALmode only
+ IBX_EXC_ADDR = 4, // r/w
+ IBX_SL_RCV = 5, // r
+ IBX_ITBZAP = 6, // w, PALmode only
+ IBX_ITBASM = 7, // w, PALmode only
+ IBX_ITBIS = 8, // w, PALmode only
+ IBX_PS = 9, // r/w
+ IBX_EXC_SUM = 10, // r/w
+ IBX_PAL_BASE = 11, // r/w
+ IBX_HIRR = 12, // r
+ IBX_SIRR = 13, // r/w
+ IBX_ASTRR = 14, // r/w
+ IBX_HIER = 16, // r/w
+ IBX_SIER = 17, // r/w
+ IBX_ASTER = 18, // r/w
+ IBX_SL_CLR = 19, // w
+ IBX_SL_XMIT = 22, // w
+ };
+
+ enum ibx_itb_pte_mask : u64
+ {
+ IBX_ITB_PTE_W_ASM = 0x00000000'00000010, // address space match
+ IBX_ITB_PTE_W_KRE = 0x00000000'00000100, // kernel read-enable
+ IBX_ITB_PTE_W_ERE = 0x00000000'00000200, // executive read-enable
+ IBX_ITB_PTE_W_SRE = 0x00000000'00000400, // supervisor read-enable
+ IBX_ITB_PTE_W_URE = 0x00000000'00000800, // user read-enable
+ IBX_ITB_PTE_W_PFN = 0x001fffff'00000000, // page frame number
+
+ IBX_ITB_PTE_R_KRE = 0x00000000'00000200, // kernel read-enable
+ IBX_ITB_PTE_R_ERE = 0x00000000'00000400, // executive read-enable
+ IBX_ITB_PTE_R_SRE = 0x00000000'00000800, // supervisor read-enable
+ IBX_ITB_PTE_R_URE = 0x00000000'00001000, // user read-enable
+ IBX_ITB_PTE_R_PFN = 0x00000003'ffffe000, // page frame number
+ IBX_ITB_PTE_R_ASM = 0x00000004'00000000, // address space match
+ };
+ enum ibx_iccsr_mask : u64
+ {
+ IBX_ICCSR_W_PC1 = 0x00000000'00000001, // performance counter 1 interrupt enable
+ IBX_ICCSR_W_PC0 = 0x00000000'00000008, // performance counter 0 interrupt enable
+ IBX_ICCSR_W_PCMUX0 = 0x00000000'00000f00,
+ IBX_ICCSR_W_PCMUX1 = 0x00000007'00000000,
+ IBX_ICCSR_W_PIPE = 0x00000008'00000000, // pipeline enable
+ IBX_ICCSR_W_BPE = 0x00000010'00000000,
+ IBX_ICCSR_W_JSE = 0x00000020'00000000, // jsr stack enable
+ IBX_ICCSR_W_BHE = 0x00000040'00000000,
+ IBX_ICCSR_W_DI = 0x00000080'00000000, // dual issue enable
+ IBX_ICCSR_W_HWE = 0x00000100'00000000, // hardware mode enable
+ IBX_ICCSR_W_MAP = 0x00000200'00000000, // i-stream superpage enable
+ IBX_ICCSR_W_FPE = 0x00000400'00000000, // floating-point enable
+ IBX_ICCSR_W_PCE = 0x00003000'00000000, // performance counter enable
+ IBX_ICCSR_W_ASN = 0x001f8000'00000000, // address space number
+
+ IBX_ICCSR_R_PC0 = 0x00000000'00000002, // performance counter 0 interrupt enable
+ IBX_ICCSR_R_PC1 = 0x00000000'00000004, // performance counter 1 interrupt enable
+ IBX_ICCSR_R_PCMUX0 = 0x00000000'00001e00,
+ IBX_ICCSR_R_PCMUX1 = 0x00000000'0000e000,
+ IBX_ICCSR_R_PIPE = 0x00000000'00010000, // pipeline enable
+ IBX_ICCSR_R_BPE = 0x00000000'00020000,
+ IBX_ICCSR_R_JSE = 0x00000000'00040000, // jsr stack enable
+ IBX_ICCSR_R_BHE = 0x00000000'00080000,
+ IBX_ICCSR_R_DI = 0x00000000'00100000, // dual issue enable
+ IBX_ICCSR_R_HWE = 0x00000000'00200000, // hardware mode enable
+ IBX_ICCSR_R_MAP = 0x00000000'00400000, // i-stream superpage enable
+ IBX_ICCSR_R_FPE = 0x00000000'00800000, // floating-point enable
+ IBX_ICCSR_R_ASN = 0x00000003'f0000000, // address space number
+ IBX_ICCSR_R_PCE = 0x00003000'00000000, // performance counter enable
+
+ IBX_ICCSR_W_GRP1 = 0x000007ff'00000000,
+ };
+ enum ibx_ps_mask : u64
+ {
+ IBX_PS_R_CM0 = 0x00000000'00000001,
+ IBX_PS_R_CM1 = 0x00000004'00000000,
+ IBX_PS_R_CM = 0x00000004'00000001,
+
+ IBX_PS_W_CM0 = 0x00000000'00000008,
+ IBX_PS_W_CM1 = 0x00000000'00000010,
+ };
+ enum ibx_pal_base_mask : u64
+ {
+ IBX_PAL_BASE_W = 0x00000003'ffffc000,
+ };
+
+ enum abx_reg : unsigned
+ {
+ ABX_TB_CTL = 0, // w
+ ABX_DTB_PTE = 2, // r/w
+ ABX_DTB_PTE_TEMP = 3, // r
+ ABX_MM_CSR = 4, // r
+ ABX_VA = 5, // r
+ ABX_DTBZAP = 6, // w
+ ABX_DTBASM = 7, // w
+ ABX_DTBIS = 8, // w
+ ABX_BIU_ADDR = 9, // r
+ ABX_BIU_STAT = 10, // r
+ ABX_DC_STAT = 12, // r
+ ABX_FILL_ADDR = 13, // r
+ ABX_ABOX_CTL = 14, // w
+ ABX_ALT_MODE = 15, // w
+ ABX_CC = 16, // w
+ ABX_CC_CTL = 17, // w
+ ABX_BIU_CTL = 18, // w
+ ABX_FILL_SYNDROME = 19, // w
+ ABX_BC_TAG = 20, // w
+ ABX_FLUSH_IC = 21, // w
+ ABX_FLUSH_IC_ASM = 23, // w
+ };
+
+ enum abx_abox_ctl_mask : u64
+ {
+ ABX_ABOX_CTL_WB_DIS = 0x0001, // write buffer unload disable
+ ABX_ABOX_CTL_MCHK_EN = 0x0002, // machine check enable
+ ABX_ABOX_CTL_CRD_EN = 0x0004, // corrected read data interrupt enable
+ ABX_ABOX_CTL_IC_SBUF_EN = 0x0008, // icache stream buffer enable
+ ABX_ABOX_CTL_SPE_1 = 0x0010, // super page enable 1
+ ABX_ABOX_CTL_SPE_2 = 0x0020, // super page enable 2
+ ABX_ABOX_CTL_EMD_EN = 0x0040, // big-endian mode enable
+ ABX_ABOX_CTL_STC_NORESULT = 0x0080, //
+ ABX_ABOX_CTL_NCACHE_NDISTURB = 0x0100, //
+ ABX_ABOX_CTL_DTB_RR = 0x0200, // dtb round-robin replacement
+ ABX_ABOX_CTL_DC_ENA = 0x0400, // dcache enable
+ ABX_ABOX_CTL_DC_FHIT = 0x0800, // dcache force hit
+ ABX_ABOX_CTL_DC_16K = 0x1000, // select 16K dcache (21064A only)
+ ABX_ABOX_CTL_F_TAG_ERR = 0x2000, // generate bad dcache tag parity (21064A only)
+ ABX_ABOX_CTL_NOCHK_PAR = 0x4000, // disable cache parity checks (21064A only)
+ ABX_ABOX_CTL_DOUBLE_INVAL = 0x8000, // (21064A only)
+ };
+
+ enum palcode_entry : u16
+ {
+ RESET = 0x0000,
+ MCHK = 0x0020,
+ ARITH = 0x0060,
+ INTERRUPT = 0x00e0,
+ D_FAULT = 0x01e0,
+ ITB_MISS = 0x03e0,
+ ITB_ACV = 0x07e0,
+ DTB_MISS_NATIVE = 0x08e0,
+ DTB_MISS_PAL = 0x09e0,
+ UNALIGN = 0x11e0,
+ OPCDEC = 0x13e0,
+ FEN = 0x17e0,
+ CALL_PAL = 0x2000,
+ };
+ static constexpr u32 CALL_PAL_MASK = 0x03ffff40;
+
+ u64 ibx_get(u8 reg);
+ void ibx_set(u8 reg, u64 data);
+ u64 abx_get(u8 reg);
+ void abx_set(u8 reg, u64 data);
+
+ u64 m_ibx[32];
+ u64 m_abx[32];
+ u64 m_pt[32];
+};
+
+class dec_21064_device : public alpha_ev4_device
+{
+public:
+ dec_21064_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
+
+protected:
+ virtual void device_reset() override;
+
+ virtual u32 icache_fetch(u64 const address) override;
+
+private:
+ struct icache_block
+ {
+ u32 lw[8]; // instruction longwords
+ u32 tag; // cache tag
+ u8 aav; // asn, asm and v fields
+ u8 bht; // branch history table
+ };
+
+ enum aav_mask : u8
+ {
+ AAV_ASN = 0x3f, // address space number
+ AAV_ASM = 0x40, // address space match
+ AAV_V = 0x80, // valid
+ };
+
+ icache_block m_icache[256];
+};
+
+DECLARE_DEVICE_TYPE(DEC_21064, dec_21064_device)
+
+#endif // MAME_CPU_ALPHA_ALPHA_H
diff --git a/src/devices/cpu/alpha/alphad.cpp b/src/devices/cpu/alpha/alphad.cpp
new file mode 100644
index 00000000000..4bd759e53c3
--- /dev/null
+++ b/src/devices/cpu/alpha/alphad.cpp
@@ -0,0 +1,1245 @@
+// license:BSD-3-Clause
+// copyright-holders:Patrick Mackinlay
+
+/*
+ * TODO
+ * - enforce "should be zero" fields
+ * - enforce "Ra must be R31"
+ * - assembly and register naming preferences
+ * - implementation-dependent instructions for EV5 and EV6
+ */
+
+#include "emu.h"
+#include "alphad.h"
+#include "common.h"
+
+ // instruction formats
+#define OPERATE_RRR(opcode, ra, rb, rc) util::stream_format(stream, "%-10s %s, %s, %s", opcode, R[ra], R[rb], R[rc])
+#define OPERATE_FFF(opcode, ra, rb, rc) util::stream_format(stream, "%-10s %s, %s, %s", opcode, F[ra], F[rb], F[rc])
+#define OPERATE_RIR(opcode, ra, im, rc) util::stream_format(stream, "%-10s %s, #%d, %s", opcode, R[ra], im, R[rc])
+#define OPERATE_RR(opcode, rb, rc) util::stream_format(stream, "%-10s %s, %s", opcode, R[rb], R[rc])
+#define OPERATE_FF(opcode, rb, rc) util::stream_format(stream, "%-10s %s, %s", opcode, F[rb], F[rc])
+#define OPERATE_RF(opcode, ra, rc) util::stream_format(stream, "%-10s %s, %s", opcode, R[ra], F[rc])
+#define OPERATE_FR(opcode, ra, rc) util::stream_format(stream, "%-10s %s, %s", opcode, F[ra], R[rc])
+#define OPERATE_IR(opcode, im, rc) util::stream_format(stream, "%-10s #%d, %s", opcode, im, R[rc])
+#define OPERATE_R(opcode, rc) util::stream_format(stream, "%-10s %s", opcode, R[rc])
+#define OPERATE_F(opcode, rc) util::stream_format(stream, "%-10s %s", opcode, F[rc])
+
+// TODO: verify syntax for multiple register formats
+#define OPERATE_RI(opcode, rb, rc) util::stream_format(stream, "%-10s %s, %s", opcode, R[rb], IBX[rc])
+#define OPERATE_RA(opcode, rb, rc) util::stream_format(stream, "%-10s %s, %s", opcode, R[rb], ABX[rc])
+#define OPERATE_RAI(opcode, rb, rc) util::stream_format(stream, "%-10s %s, %s:%s", opcode, R[rb], ABX[rc], IBX[rc])
+#define OPERATE_RP(opcode, rb, rc) util::stream_format(stream, "%-10s %s, %s", opcode, R[rb], PT[rc])
+#define OPERATE_RPI(opcode, rb, rc) util::stream_format(stream, "%-10s %s, %s:%s", opcode, R[rb], PT[rc], IBX[rc])
+#define OPERATE_RPA(opcode, rb, rc) util::stream_format(stream, "%-10s %s, %s:%s", opcode, R[rb], PT[rc], ABX[rc])
+#define OPERATE_RPAI(opcode, rb, rc) util::stream_format(stream, "%-10s %s, %s:%s:%s", opcode, R[rb], PT[rc], ABX[rc], IBX[rc])
+
+#define MEMORY_R(opcode, ra, disp, rb) util::stream_format(stream, "%-10s %s, %d(%s)", opcode, R[ra], disp, R[rb])
+#define MEMORY_F(opcode, ra, disp, rb) util::stream_format(stream, "%-10s %s, %d(%s)", opcode, F[ra], disp, R[rb])
+#define BRANCH_R(opcode, ra, offset) util::stream_format(stream, "%-10s %s, 0x%x", opcode, R[ra], pc + 4 + offset)
+#define BRANCH_F(opcode, ra, offset) util::stream_format(stream, "%-10s %s, 0x%x", opcode, F[ra], pc + 4 + offset)
+#define BRANCH(opcode, offset) util::stream_format(stream, "%-10s 0x%x", opcode, pc + 4 + offset)
+
+#define JUMP(opcode, ra, rb) util::stream_format(stream, "%-10s %s, (%s)", opcode, R[ra], R[rb])
+
+#define MISC(opcode) util::stream_format(stream, "%-10s", opcode)
+#define MISC_R(opcode, ra) util::stream_format(stream, "%-10s %s", opcode, R[ra])
+#define MISC_M(opcode, rb) util::stream_format(stream, "%-10s (%s)", opcode, R[rb])
+
+#define CALL_PAL(fnc) util::stream_format(stream, "%-10s %s", "call_pal", fnc)
+
+#define RESERVED(opcode) util::stream_format(stream, "%-10s", opcode)
+#define UNKNOWN(type) util::stream_format(stream, "unknown %s", type)
+
+// register names
+const char *const alpha_disassembler::R[] =
+{
+ "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
+ "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
+ "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
+ "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"
+};
+
+const char *const alpha_disassembler::F[] =
+{
+ "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7",
+ "f8", "f9", "f10", "f11", "f12", "f13", "f14", "f15",
+ "f16", "f17", "f18", "f19", "f20", "f21", "f22", "f23",
+ "f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31"
+};
+
+const char *const alpha_disassembler::PT[] =
+{
+ "pt0", "pt1", "pt2", "pt3", "pt4", "pt5", "pt6", "pt7",
+ "pt8", "pt9", "pt10", "pt11", "pt12", "pt13", "pt14", "pt15",
+ "pt16", "pt17", "pt18", "pt19", "pt20", "pt21", "pt22", "pt23",
+ "pt24", "pt25", "pt26", "pt27", "pt28", "pt29", "pt30", "pt31"
+};
+
+// NOTE: ABXn and IBXn are placeholders for undefined/unused registers
+const char *const alpha_disassembler::ABX[] =
+{
+ "TB_CTL", "ABX1", "DTB_PTE", "DTB_PTE_TEMP", "MM_CSR", "VA", "DTBZAP", "DTBASM",
+ "DTBIS", "BIU_ADDR", "BIU_STAT", "ABX12", "DC_STAT", "FILL_ADDR", "ABOX_CTL", "ALT_MODE",
+ "CC", "CC_CTL", "BIU_CTL", "FILL_SYNDROME", "BC_TAG", "FLUSH_IC", "ABX22", "FLUSH_IC_ASM",
+ "ABX24", "ABX25", "ABX26", "ABX27", "ABX28", "ABX29", "ABX30", "ABX31"
+};
+
+const char *const alpha_disassembler::IBX[] =
+{
+ "TB_TAG", "ITB_PTE", "ICCSR", "ITB_PTE_TEMP", "EXC_ADDR", "SL_RCV", "ITBZAP", "ITBASM",
+ "ITBIS", "PS", "EXC_SUM", "PAL_BASE", "HIRR", "SIRR", "ASTRR", "IBX15",
+ "HIERR", "SIER", "ASTER", "SL_CLR", "IBX20", "IBX21", "SL_XMIT", "IBX23",
+ "IBX24", "IBX25", "IBX26", "IBX27", "IBX28", "IBX29", "IBX30", "IBX31"
+};
+
+offs_t alpha_disassembler::disassemble(std::ostream &stream, offs_t pc, const data_buffer &opcodes, const data_buffer &params)
+{
+ offs_t const bytes = 4;
+ u32 flags = SUPPORTED;
+
+ u32 const instruction = opcodes.r32(pc);
+
+ switch (instruction >> 26)
+ {
+ // pal format
+ case 0x00:
+ switch (m_dasm_type)
+ {
+ case TYPE_UNKNOWN:
+ switch (instruction & 0x03ffffff)
+ {
+ case 0x0000: CALL_PAL("halt"); break;
+ case 0x0002: CALL_PAL("draina"); break;
+ case 0x0086: CALL_PAL("imb"); break;
+
+ default: UNKNOWN("call_pal"); break;
+ }
+ break;
+
+ case TYPE_NT:
+ switch (instruction & 0x03ffffff)
+ {
+ // Windows NT unprivileged PALcode
+ case 0x0080: CALL_PAL("bpt"); break; // breakpoint trap
+ case 0x0083: CALL_PAL("callsys"); break; // call system service
+ case 0x0086: CALL_PAL("imb"); break; // instruction memory barrier
+ case 0x00aa: CALL_PAL("gentrap"); break; // generate trap
+ case 0x00ab: CALL_PAL("rdteb"); break; // read TEB internal processor register
+ case 0x00ac: CALL_PAL("kbpt"); break; // kernel breakpoint trap
+ case 0x00ad: CALL_PAL("callkd"); break; // call kernel debugger
+
+ // Windows NT privileged PALcode
+ case 0x0000: CALL_PAL("halt"); break; // trap to illegal instruction
+ case 0x0001: CALL_PAL("restart"); break; // restart the processor
+ case 0x0002: CALL_PAL("draina"); break; // drain aborts
+ case 0x0003: CALL_PAL("reboot"); break; // transfer to console firmware
+ case 0x0004: CALL_PAL("initpal"); break; // initialize the PALcode
+ case 0x0005: CALL_PAL("wrentry"); break; // write system entry
+ case 0x0006: CALL_PAL("swpirql"); break; // swap IRQL
+ case 0x0007: CALL_PAL("rdirql"); break; // read current IRQL
+ case 0x0008: CALL_PAL("di"); break; // disable interrupts
+ case 0x0009: CALL_PAL("ei"); break; // enable interrupts
+ case 0x000a: CALL_PAL("swppal"); break; // swap PALcode
+ case 0x000c: CALL_PAL("ssir"); break; // set software interrupt request
+ case 0x000d: CALL_PAL("csir"); break; // clear software interrupt request
+ case 0x000e: CALL_PAL("rfe"); break; // return from exception
+ case 0x000f: CALL_PAL("retsys"); break; // return from system service call
+ case 0x0010: CALL_PAL("swpctx"); break; // swap privileged thread context
+ case 0x0011: CALL_PAL("swpprocess"); break; // swap privileged process context
+ case 0x0012: CALL_PAL("rdmces"); break; // read machine check error summary
+ case 0x0013: CALL_PAL("wrmces"); break; // write machine check error summary
+ case 0x0014: CALL_PAL("tbia"); break; // translation buffer invalidate all
+ case 0x0015: CALL_PAL("tbis"); break; // translation buffer invalidate single
+ case 0x0016: CALL_PAL("dtbis"); break; // data translation buffer invalidate single
+ case 0x0017: CALL_PAL("tbisasn"); break; // translation buffer invalidate single ASN
+ case 0x0018: CALL_PAL("rdksp"); break; // read initial kernel stack
+ case 0x0019: CALL_PAL("swpksp"); break; // swap initial kernel stack
+ case 0x001a: CALL_PAL("rdpsr"); break; // read processor status register
+ case 0x001c: CALL_PAL("rdpcr"); break; // read PCR (processor control registers)
+ case 0x001e: CALL_PAL("rdthread"); break; // read the current thread value
+ case 0x0020: CALL_PAL("wrperfmon"); break; // write performance monitoring values
+ case 0x0030: CALL_PAL("rdcounters"); break; // read PALcode event counters
+ case 0x0031: CALL_PAL("rdstate"); break; // read internal processor state
+
+ default: UNKNOWN("call_pal"); break;
+ }
+ break;
+
+ case TYPE_UNIX:
+ switch (instruction & 0x03ffffff)
+ {
+ // Digital UNIX unprivileged PALcode
+ case 0x0080: CALL_PAL("bpt"); break; // breakpoint trap
+ case 0x0081: CALL_PAL("bugchk"); break; // bugcheck
+ case 0x0083: CALL_PAL("callsys"); break; // system call
+ case 0x0086: CALL_PAL("imb"); break; // i-stream memory barrier
+ case 0x0092: CALL_PAL("urti"); break; // return from user mode trap
+ case 0x009e: CALL_PAL("rdunique"); break; // read unique value
+ case 0x009f: CALL_PAL("wrunique"); break; // write unique value
+ case 0x00aa: CALL_PAL("gentrap"); break; // generate software trap
+ case 0x00ae: CALL_PAL("clrfen"); break; // clear floating-point enable
+
+ // Digital UNIX privileged PALcode
+ case 0x0000: CALL_PAL("halt"); break; // halt the processor
+ case 0x0001: CALL_PAL("cflush"); break; // cache flush
+ case 0x0002: CALL_PAL("draina"); break; // drain aborts
+ case 0x0009: CALL_PAL("cserve"); break; // console service
+ case 0x000a: CALL_PAL("swppal"); break; // swap PALcode image
+ case 0x000d: CALL_PAL("wripir"); break; // write interprocessor interrupt request
+ case 0x0010: CALL_PAL("rdmces"); break; // read machine check error summary register
+ case 0x0011: CALL_PAL("wrmces"); break; // write machine check error summary register
+ case 0x002b: CALL_PAL("wrfen"); break; // write floating-point enable
+ case 0x002d: CALL_PAL("wrvptptr"); break; // write virtual page table pointer
+ case 0x0030: CALL_PAL("swpctx"); break; // swap privileged context
+ case 0x0031: CALL_PAL("wrval"); break; // write system value
+ case 0x0032: CALL_PAL("rdval"); break; // read system value
+ case 0x0033: CALL_PAL("tbi"); break; // translation buffer invalidate
+ case 0x0034: CALL_PAL("wrent"); break; // write system entry address
+ case 0x0035: CALL_PAL("swpipl"); break; // swap interrupt priority level
+ case 0x0036: CALL_PAL("rdps"); break; // read processor status
+ case 0x0037: CALL_PAL("wrkgp"); break; // write kernel global pointer
+ case 0x0038: CALL_PAL("wrusp"); break; // write user stack pointer
+ case 0x0039: CALL_PAL("wrperfmon"); break; // performance monitoring function
+ case 0x003a: CALL_PAL("rdusp"); break; // read user stack pointer
+ case 0x003c: CALL_PAL("whami"); break; // who am I
+ case 0x003d: CALL_PAL("retsys"); break; // return from system call
+ case 0x003e: CALL_PAL("wtint"); break; // wait for interrupt
+ case 0x003f: CALL_PAL("rti"); break; // return from trap or interrupt
+
+ default: UNKNOWN("call_pal"); break;
+ }
+ break;
+
+ case TYPE_VMS:
+ switch (instruction & 0x03ffffff)
+ {
+ // OpenVMS unprivileged PALcode
+ case 0x0080: CALL_PAL("bpt"); break; // breakpoint
+ case 0x0081: CALL_PAL("bugchk"); break; // bugcheck
+ case 0x0082: CALL_PAL("chme"); break; // change mode to executive
+ case 0x0083: CALL_PAL("chmk"); break; // change mode to kernel
+ case 0x0084: CALL_PAL("chms"); break; // change mode to supervisor
+ case 0x0085: CALL_PAL("chmu"); break; // change mode to user
+ case 0x0086: CALL_PAL("imb"); break; // i-stream memory barrier
+ case 0x0087: CALL_PAL("insqhil"); break; // insert into longword queue at head interlocked
+ case 0x0088: CALL_PAL("insqtil"); break; // insert into longword queue at tail interlocked
+ case 0x0089: CALL_PAL("insqhiq"); break; // insert into quadword queue at head interlocked
+ case 0x008a: CALL_PAL("insqtiq"); break; // insert into quadword queue at tail interlocked
+ case 0x008b: CALL_PAL("insquel"); break; // insert entry into longword queue
+ case 0x008c: CALL_PAL("insqueq"); break; // insert entry into quadword queue
+ case 0x008d: CALL_PAL("insquel/d"); break; // insert entry into longword queue deferred
+ case 0x008e: CALL_PAL("insqueq/d"); break; // insert entry into quadword queue deferred
+ case 0x008f: CALL_PAL("prober"); break; // probe for read access
+ case 0x0090: CALL_PAL("probew"); break; // probe for write access
+ case 0x0091: CALL_PAL("rd_ps"); break; // move processor status
+ case 0x0092: CALL_PAL("rei"); break; // return from exception or interrupt
+ case 0x0093: CALL_PAL("remqhil"); break; // remove from longword queue at head interlocked
+ case 0x0094: CALL_PAL("remqtil"); break; // remove from longword queue at tail interlocked
+ case 0x0095: CALL_PAL("remqhiq"); break; // remove from quadword queue at head interlocked
+ case 0x0096: CALL_PAL("remqtiq"); break; // remove from quadword queue at tail interlocked
+ case 0x0097: CALL_PAL("remquel"); break; // remove entry from longword queue
+ case 0x0098: CALL_PAL("remqueq"); break; // remove entry from quadword queue
+ case 0x0099: CALL_PAL("remquel/d"); break; // remove entry from longword queue deferred
+ case 0x009a: CALL_PAL("remqueq/d"); break; // remove entry from quadword queue deferred
+ case 0x009b: CALL_PAL("swasten"); break; // swap AST enable for current mode
+ case 0x009c: CALL_PAL("wr_ps_sw"); break; // write processor status software field
+ case 0x009d: CALL_PAL("rscc"); break; // read system cycle counter
+ case 0x009e: CALL_PAL("read_unq"); break; // read unique context
+ case 0x009f: CALL_PAL("write_unq"); break; // write unique context
+ case 0x00a0: CALL_PAL("amovrr"); break; // atomic move from register to register
+ case 0x00a1: CALL_PAL("amovrm"); break; // atomic move from register to memory
+ case 0x00a2: CALL_PAL("insqhilr"); break; // insert into longword queue at head interlocked resident
+ case 0x00a3: CALL_PAL("insqtilr"); break; // insert into longword queue at tail interlocked resident
+ case 0x00a4: CALL_PAL("insqhiqr"); break; // insert into quadword queue at head interlocked resident
+ case 0x00a5: CALL_PAL("insqtiqr"); break; // insert into quadword queue at tail interlocked resident
+ case 0x00a6: CALL_PAL("remqhilr"); break; // remove from longword queue at head interlocked resident
+ case 0x00a7: CALL_PAL("remqtilr"); break; // remove from longword queue at tail interlocked resident
+ case 0x00a8: CALL_PAL("remqhiqr"); break; // remove from quadword queue at head interlocked resident
+ case 0x00a9: CALL_PAL("remqtiqr"); break; // remove from quadword queue at tail interlocked resident
+ case 0x00aa: CALL_PAL("gentrap"); break; // generate software trap
+ case 0x00ae: CALL_PAL("clrfen"); break; // clear floating-point enable
+
+ // OpenVMS privileged PALcode
+ case 0x0000: CALL_PAL("halt"); break; // halt processor
+ case 0x0001: CALL_PAL("cflush"); break; // cache flush
+ case 0x0002: CALL_PAL("draina"); break; // drain aborts
+ case 0x0003: CALL_PAL("ldqp"); break; // load quadword physical
+ case 0x0004: CALL_PAL("stqp"); break; // store quadword physical
+ case 0x0005: CALL_PAL("swpctx"); break; // swap privileged context
+ case 0x0006: CALL_PAL("mfpr_asn"); break; // move from processor register ASN
+ case 0x0009: CALL_PAL("cserve"); break; // console service
+ case 0x000a: CALL_PAL("swppal"); break; // swap PALcode image
+ case 0x000b: CALL_PAL("mfpr_fen"); break; // move from processor register FEN
+ case 0x000c: CALL_PAL("mtpr_fen"); break; // move to processor register FEN
+ case 0x000d: CALL_PAL("mtpr_ipir"); break; // move to processor register IPRI
+ case 0x000e: CALL_PAL("mfpr_ipl"); break; // move from processor register IPL
+ case 0x000f: CALL_PAL("mtpr_ipl"); break; // move to processor register IPL
+ case 0x0010: CALL_PAL("mfpr_mces"); break; // move from processor register MCES
+ case 0x0011: CALL_PAL("mtpr_mces"); break; // move to processor register MCES
+ case 0x0012: CALL_PAL("mfpr_pcbb"); break; // move from processor register PCBB
+ case 0x0013: CALL_PAL("mfpr_prbr"); break; // move from processor register PRBR
+ case 0x0014: CALL_PAL("mtpr_prbr"); break; // move to processor register PRBR
+ case 0x0015: CALL_PAL("mfpr_ptbr"); break; // move from processor register PTBR
+ case 0x0016: CALL_PAL("mfpr_scbb"); break; // move from processor register SCBB
+ case 0x0017: CALL_PAL("mtpr_scbb"); break; // move to processor register SCBB
+ case 0x0018: CALL_PAL("mtpr_sirr"); break; // move to processor register SIRR
+ case 0x0019: CALL_PAL("mfpr_sisr"); break; // move from processor register SISR
+ case 0x001a: CALL_PAL("mfpr_tbchk"); break; // move from processor register TBCHK
+ case 0x001b: CALL_PAL("mtpr_tbia"); break; // move to processor register TBIA
+ case 0x001c: CALL_PAL("mtpr_tbiap"); break; // move to processor register TBIAP
+ case 0x001d: CALL_PAL("mtpr_tbis"); break; // move to processor register TBIS
+ case 0x001e: CALL_PAL("mfpr_esp"); break; // move from processor register ESP
+ case 0x001f: CALL_PAL("mtpr_esp"); break; // move to processor register ESP
+ case 0x0020: CALL_PAL("mfpr_ssp"); break; // move from processor register SSP
+ case 0x0021: CALL_PAL("mtpr_ssp"); break; // move to processor register SSP
+ case 0x0022: CALL_PAL("mfpr_usp"); break; // move from processor register USP
+ case 0x0023: CALL_PAL("mtpr_usp"); break; // move to processor register USP
+ case 0x0024: CALL_PAL("mtpr_tbisd"); break; // move to processor register TBISD
+ case 0x0025: CALL_PAL("mtpr_tbisi"); break; // move to processor register TBISI
+ case 0x0026: CALL_PAL("mtpr_asten"); break; // move to processor register ASTEN
+ case 0x0027: CALL_PAL("mtpr_astsr"); break; // move to processor register ASTSR
+ case 0x0029: CALL_PAL("mfpr_vptb"); break; // move from processor register VPTB
+ case 0x002a: CALL_PAL("mtpr_vptb"); break; // move to processor register VPTB
+ case 0x002b: CALL_PAL("mtpr_perfmon"); break; // move to processor register PERFMON
+ case 0x002e: CALL_PAL("mtpr_datfx"); break; // move to processor register DATFX
+ case 0x003e: CALL_PAL("wtint"); break; // wait for interrupt
+ case 0x003f: CALL_PAL("mfpr_whami"); break; // move from processor register WHAMI
+
+ default: UNKNOWN("call_pal"); break;
+ }
+ break;
+ }
+ break;
+
+ // reserved opcodes
+ case 0x01: RESERVED("opc01"); break; // OPC01
+ case 0x02: RESERVED("opc02"); break; // OPC02
+ case 0x03: RESERVED("opc03"); break; // OPC03
+ case 0x04: RESERVED("opc04"); break; // OPC04
+ case 0x05: RESERVED("opc05"); break; // OPC05
+ case 0x06: RESERVED("opc06"); break; // OPC06
+ case 0x07: RESERVED("opc07"); break; // OPC07
+
+ // memory format
+ case 0x08:
+ if (Rb(instruction) == 31)
+ OPERATE_IR("mov", Disp_M(instruction), Ra(instruction));
+ else
+ MEMORY_R("lda", Ra(instruction), Disp_M(instruction), Rb(instruction)); // LDA
+ break;
+ case 0x09: MEMORY_R("ldah", Ra(instruction), Disp_M(instruction), Rb(instruction)); break; // LDAH
+ case 0x0a: MEMORY_R("ldbu", Ra(instruction), Disp_M(instruction), Rb(instruction)); break; // LDBU (BWX)
+ case 0x0b:
+ if (Ra(instruction) == 31 && Disp_M(instruction) == 0)
+ MISC("unop");
+ else
+ MEMORY_R("ldq_u", Ra(instruction), Disp_M(instruction), Rb(instruction)); // LDQ_U
+ break;
+ case 0x0c: MEMORY_R("ldwu", Ra(instruction), Disp_M(instruction), Rb(instruction)); break; // LDWU (BWX)
+ case 0x0d: MEMORY_R("stw", Ra(instruction), Disp_M(instruction), Rb(instruction)); break; // STW (BWX)
+ case 0x0e: MEMORY_R("stb", Ra(instruction), Disp_M(instruction), Rb(instruction)); break; // STB (BWX)
+ case 0x0f: MEMORY_R("stq_u", Ra(instruction), Disp_M(instruction), Rb(instruction)); break; // STQ_U
+
+ // operate format
+ case 0x10: // INTA* (integer arithmetic)
+ switch ((instruction >> 5) & 0xff)
+ {
+ // register variants
+ case 0x00:
+ if (Ra(instruction) == 31)
+ OPERATE_RR("sextl", Rb(instruction), Rc(instruction));
+ else
+ OPERATE_RRR("addl", Ra(instruction), Rb(instruction), Rc(instruction)); // ADDL
+ break;
+ case 0x02: OPERATE_RRR("s4addl", Ra(instruction), Rb(instruction), Rc(instruction)); break; // S4ADDL
+ case 0x09:
+ if (Ra(instruction) == 31)
+ OPERATE_RR("negl", Rb(instruction), Rc(instruction));
+ else
+ OPERATE_RRR("subl", Ra(instruction), Rb(instruction), Rc(instruction)); // SUBL
+ break;
+ case 0x0b: OPERATE_RRR("s4subl", Ra(instruction), Rb(instruction), Rc(instruction)); break; // S4SUBL
+ case 0x0f: OPERATE_RRR("cmpbge", Ra(instruction), Rb(instruction), Rc(instruction)); break; // CMPBGE
+ case 0x12: OPERATE_RRR("s8addl", Ra(instruction), Rb(instruction), Rc(instruction)); break; // S8ADDL
+ case 0x1b: OPERATE_RRR("s8subl", Ra(instruction), Rb(instruction), Rc(instruction)); break; // S8SUBL
+ case 0x1d: OPERATE_RRR("cmpult", Ra(instruction), Rb(instruction), Rc(instruction)); break; // CMPULT
+ case 0x20: OPERATE_RRR("addq", Ra(instruction), Rb(instruction), Rc(instruction)); break; // ADDQ
+ case 0x22: OPERATE_RRR("s4addq", Ra(instruction), Rb(instruction), Rc(instruction)); break; // S4ADDQ
+ case 0x29:
+ if (Ra(instruction) == 31)
+ OPERATE_RR("negq", Rb(instruction), Rc(instruction));
+ else
+ OPERATE_RRR("subq", Ra(instruction), Rb(instruction), Rc(instruction)); // SUBQ
+ break;
+ case 0x2b: OPERATE_RRR("s4subq", Ra(instruction), Rb(instruction), Rc(instruction)); break; // S4SUBQ
+ case 0x2d: OPERATE_RRR("cmpeq", Ra(instruction), Rb(instruction), Rc(instruction)); break; // CMPEQ
+ case 0x32: OPERATE_RRR("s8addq", Ra(instruction), Rb(instruction), Rc(instruction)); break; // S8ADDQ
+ case 0x3b: OPERATE_RRR("s8subq", Ra(instruction), Rb(instruction), Rc(instruction)); break; // S8SUBQ
+ case 0x3d: OPERATE_RRR("cmpule", Ra(instruction), Rb(instruction), Rc(instruction)); break; // CMPULE
+ case 0x40: OPERATE_RRR("addl/v", Ra(instruction), Rb(instruction), Rc(instruction)); break; // ADDL/V
+ case 0x49:
+ if (Ra(instruction) == 31)
+ OPERATE_RR("negl/v", Rb(instruction), Rc(instruction));
+ else
+ OPERATE_RRR("subl/v", Ra(instruction), Rb(instruction), Rc(instruction)); // SUBL/V
+ break;
+ case 0x4d: OPERATE_RRR("cmplt", Ra(instruction), Rb(instruction), Rc(instruction)); break; // CMPLT
+ case 0x60: OPERATE_RRR("addq/v", Ra(instruction), Rb(instruction), Rc(instruction)); break; // ADDQ/V
+ case 0x69:
+ if (Ra(instruction) == 31)
+ OPERATE_RR("negq/v", Rb(instruction), Rc(instruction));
+ else
+ OPERATE_RRR("subq/v", Ra(instruction), Rb(instruction), Rc(instruction)); // SUBQ/V
+ break;
+ case 0x6d: OPERATE_RRR("cmple", Ra(instruction), Rb(instruction), Rc(instruction)); break; // CMPLE
+
+ // immediate variants
+ case 0x80:
+ if (Ra(instruction) == 31)
+ OPERATE_IR("sextl", Im(instruction), Rc(instruction));
+ else
+ OPERATE_RIR("addl", Ra(instruction), Im(instruction), Rc(instruction)); // ADDL
+ break;
+ case 0x82: OPERATE_RIR("s4addl", Ra(instruction), Im(instruction), Rc(instruction)); break; // S4ADDL
+ case 0x89:
+ if (Ra(instruction) == 31)
+ OPERATE_IR("negl", Im(instruction), Rc(instruction));
+ else
+ OPERATE_RIR("subl", Ra(instruction), Im(instruction), Rc(instruction)); // SUBL
+ break;
+ case 0x8b: OPERATE_RIR("s4subl", Ra(instruction), Im(instruction), Rc(instruction)); break; // S4SUBL
+ case 0x8f: OPERATE_RIR("cmpbge", Ra(instruction), Im(instruction), Rc(instruction)); break; // CMPBGE
+ case 0x92: OPERATE_RIR("s8addl", Ra(instruction), Im(instruction), Rc(instruction)); break; // S8ADDL
+ case 0x9b: OPERATE_RIR("s8subl", Ra(instruction), Im(instruction), Rc(instruction)); break; // S8SUBL
+ case 0x9d: OPERATE_RIR("cmpult", Ra(instruction), Im(instruction), Rc(instruction)); break; // CMPULT
+ case 0xa0: OPERATE_RIR("addq", Ra(instruction), Im(instruction), Rc(instruction)); break; // ADDQ
+ case 0xa2: OPERATE_RIR("s4addq", Ra(instruction), Im(instruction), Rc(instruction)); break; // S4ADDQ
+ case 0xa9:
+ if (Ra(instruction) == 31)
+ OPERATE_IR("negq", Im(instruction), Rc(instruction));
+ else
+ OPERATE_RIR("subq", Ra(instruction), Im(instruction), Rc(instruction)); // SUBQ
+ break;
+ case 0xab: OPERATE_RIR("s4subq", Ra(instruction), Im(instruction), Rc(instruction)); break; // S4SUBQ
+ case 0xad: OPERATE_RIR("cmpeq", Ra(instruction), Im(instruction), Rc(instruction)); break; // CMPEQ
+ case 0xb2: OPERATE_RIR("s8addq", Ra(instruction), Im(instruction), Rc(instruction)); break; // S8ADDQ
+ case 0xbb: OPERATE_RIR("s8subq", Ra(instruction), Im(instruction), Rc(instruction)); break; // S8SUBQ
+ case 0xbd: OPERATE_RIR("cmpule", Ra(instruction), Im(instruction), Rc(instruction)); break; // CMPULE
+ case 0xc0: OPERATE_RIR("addl/v", Ra(instruction), Im(instruction), Rc(instruction)); break; // ADDL/V
+ case 0xc9:
+ if (Ra(instruction) == 31)
+ OPERATE_IR("negl/v", Im(instruction), Rc(instruction));
+ else
+ OPERATE_RIR("subl/v", Ra(instruction), Im(instruction), Rc(instruction)); // SUBL/V
+ break;
+ case 0xcd: OPERATE_RIR("cmplt", Ra(instruction), Im(instruction), Rc(instruction)); break; // CMPLT
+ case 0xe0: OPERATE_RIR("addq/v", Ra(instruction), Im(instruction), Rc(instruction)); break; // ADDQ/V
+ case 0xe9:
+ if (Ra(instruction) == 31)
+ OPERATE_IR("negq/v", Im(instruction), Rc(instruction));
+ else
+ OPERATE_RIR("subq/v", Ra(instruction), Im(instruction), Rc(instruction)); // SUBQ/V
+ break;
+ case 0xed: OPERATE_RIR("cmple", Ra(instruction), Im(instruction), Rc(instruction)); break; // CMPLE
+
+ default: UNKNOWN("inta*"); break;
+ }
+ break;
+ case 0x11: // INTL* (integer logical)
+ switch ((instruction >> 5) & 0xff)
+ {
+ // register variants
+ case 0x00: OPERATE_RRR("and", Ra(instruction), Rb(instruction), Rc(instruction)); break; // AND
+ case 0x08: OPERATE_RRR("bic", Ra(instruction), Rb(instruction), Rc(instruction)); break; // BIC
+ case 0x14: OPERATE_RRR("cmovlbs", Ra(instruction), Rb(instruction), Rc(instruction)); break; // CMOVLBS
+ case 0x16: OPERATE_RRR("cmovlbc", Ra(instruction), Rb(instruction), Rc(instruction)); break; // CMOVLBC
+ case 0x20:
+ if (Ra(instruction) == 31 && Rb(instruction) == 31 && Rc(instruction) == 31)
+ MISC("nop");
+ else if (Ra(instruction) == 31 && Rb(instruction) == 31)
+ OPERATE_R("clr", Rc(instruction));
+ else if (Ra(instruction) == Rb(instruction))
+ OPERATE_RR("mov", Rb(instruction), Rc(instruction));
+ else
+ OPERATE_RRR("bis", Ra(instruction), Rb(instruction), Rc(instruction)); // BIS
+ break;
+ case 0x24: OPERATE_RRR("cmoveq", Ra(instruction), Rb(instruction), Rc(instruction)); break; // CMOVEQ
+ case 0x26: OPERATE_RRR("cmovne", Ra(instruction), Rb(instruction), Rc(instruction)); break; // CMOVNE
+ case 0x28:
+ if (Ra(instruction) == 31)
+ OPERATE_RR("not", Rb(instruction), Rc(instruction));
+ else
+ OPERATE_RRR("ornot", Ra(instruction), Rb(instruction), Rc(instruction)); // ORNOT
+ break;
+ case 0x40: OPERATE_RRR("xor", Ra(instruction), Rb(instruction), Rc(instruction)); break; // XOR
+ case 0x44: OPERATE_RRR("cmovlt", Ra(instruction), Rb(instruction), Rc(instruction)); break; // CMOVLT
+ case 0x46: OPERATE_RRR("cmovge", Ra(instruction), Rb(instruction), Rc(instruction)); break; // CMOVGE
+ case 0x48: OPERATE_RRR("eqv", Ra(instruction), Rb(instruction), Rc(instruction)); break; // EQV
+ case 0x61: OPERATE_RR("amask", Rb(instruction), Rc(instruction)); break; // AMASK
+ case 0x64: OPERATE_RRR("cmovle", Ra(instruction), Rb(instruction), Rc(instruction)); break; // CMOVLE
+ case 0x66: OPERATE_RRR("cmovgt", Ra(instruction), Rb(instruction), Rc(instruction)); break; // CMOVGT
+
+ // immediate variants
+ case 0x80: OPERATE_RIR("and", Ra(instruction), Im(instruction), Rc(instruction)); break; // AND
+ case 0x88: OPERATE_RIR("bic", Ra(instruction), Im(instruction), Rc(instruction)); break; // BIC
+ case 0x94: OPERATE_RIR("cmovlbs", Ra(instruction), Im(instruction), Rc(instruction)); break; // CMOVLBS
+ case 0x96: OPERATE_RIR("cmovlbc", Ra(instruction), Im(instruction), Rc(instruction)); break; // CMOVLBC
+ case 0xa0:
+ if (Ra(instruction) == 31)
+ OPERATE_IR("mov", Im(instruction), Rc(instruction));
+ else
+ OPERATE_RIR("bis", Ra(instruction), Im(instruction), Rc(instruction)); // BIS
+ break;
+ case 0xa4: OPERATE_RIR("cmoveq", Ra(instruction), Im(instruction), Rc(instruction)); break; // CMOVEQ
+ case 0xa6: OPERATE_RIR("cmovne", Ra(instruction), Im(instruction), Rc(instruction)); break; // CMOVNE
+ case 0xa8:
+ if (Ra(instruction) == 31)
+ OPERATE_IR("not", Im(instruction), Rc(instruction));
+ else
+ OPERATE_RIR("ornot", Ra(instruction), Im(instruction), Rc(instruction)); // ORNOT
+ break;
+ case 0xc0: OPERATE_RIR("xor", Ra(instruction), Im(instruction), Rc(instruction)); break; // XOR
+ case 0xc4: OPERATE_RIR("cmovlt", Ra(instruction), Im(instruction), Rc(instruction)); break; // CMOVLT
+ case 0xc6: OPERATE_RIR("cmovge", Ra(instruction), Im(instruction), Rc(instruction)); break; // CMOVGE
+ case 0xc8: OPERATE_RIR("eqv", Ra(instruction), Im(instruction), Rc(instruction)); break; // EQV
+ case 0xe1: OPERATE_IR("amask", Im(instruction), Rc(instruction)); break; // AMASK
+ case 0xe4: OPERATE_RIR("cmovle", Ra(instruction), Im(instruction), Rc(instruction)); break; // CMOVLE
+ case 0xe6: OPERATE_RIR("cmovgt", Ra(instruction), Im(instruction), Rc(instruction)); break; // CMOVGT
+
+ // TODO: Rb must be literal #1?
+ case 0xec: OPERATE_R("implver", Rc(instruction)); break; // IMPLVER
+
+ default: UNKNOWN("intl*"); break;
+ }
+ break;
+ case 0x12: // INTS* (integer shift)
+ switch ((instruction >> 5) & 0xff)
+ {
+ // register variants
+ case 0x02: OPERATE_RRR("mskbl", Ra(instruction), Rb(instruction), Rc(instruction)); break; // MSKBL
+ case 0x06: OPERATE_RRR("extbl", Ra(instruction), Rb(instruction), Rc(instruction)); break; // EXTBL
+ case 0x0b: OPERATE_RRR("insbl", Ra(instruction), Rb(instruction), Rc(instruction)); break; // INSBL
+ case 0x12: OPERATE_RRR("mskwl", Ra(instruction), Rb(instruction), Rc(instruction)); break; // MSKWL
+ case 0x16: OPERATE_RRR("extwl", Ra(instruction), Rb(instruction), Rc(instruction)); break; // EXTWL
+ case 0x1b: OPERATE_RRR("inswl", Ra(instruction), Rb(instruction), Rc(instruction)); break; // INSWL
+ case 0x22: OPERATE_RRR("mskll", Ra(instruction), Rb(instruction), Rc(instruction)); break; // MSKLL
+ case 0x26: OPERATE_RRR("extll", Ra(instruction), Rb(instruction), Rc(instruction)); break; // EXTLL
+ case 0x2b: OPERATE_RRR("insll", Ra(instruction), Rb(instruction), Rc(instruction)); break; // INSLL
+ case 0x30: OPERATE_RRR("zap", Ra(instruction), Rb(instruction), Rc(instruction)); break; // ZAP
+ case 0x31: OPERATE_RRR("zapnot", Ra(instruction), Rb(instruction), Rc(instruction)); break; // ZAPNOT
+ case 0x32: OPERATE_RRR("mskql", Ra(instruction), Rb(instruction), Rc(instruction)); break; // MSKQL
+ case 0x34: OPERATE_RRR("srl", Ra(instruction), Rb(instruction), Rc(instruction)); break; // SRL
+ case 0x36: OPERATE_RRR("extql", Ra(instruction), Rb(instruction), Rc(instruction)); break; // EXTQL
+ case 0x39: OPERATE_RRR("sll", Ra(instruction), Rb(instruction), Rc(instruction)); break; // SLL
+ case 0x3b: OPERATE_RRR("insql", Ra(instruction), Rb(instruction), Rc(instruction)); break; // INSQL
+ case 0x3c: OPERATE_RRR("sra", Ra(instruction), Rb(instruction), Rc(instruction)); break; // SRA
+ case 0x52: OPERATE_RRR("mskwh", Ra(instruction), Rb(instruction), Rc(instruction)); break; // MSKWH
+ case 0x57: OPERATE_RRR("inswh", Ra(instruction), Rb(instruction), Rc(instruction)); break; // INSWH
+ case 0x5a: OPERATE_RRR("extwh", Ra(instruction), Rb(instruction), Rc(instruction)); break; // EXTWH
+ case 0x62: OPERATE_RRR("msklh", Ra(instruction), Rb(instruction), Rc(instruction)); break; // MSKLH
+ case 0x67: OPERATE_RRR("inslh", Ra(instruction), Rb(instruction), Rc(instruction)); break; // INSLH
+ case 0x6a: OPERATE_RRR("extlh", Ra(instruction), Rb(instruction), Rc(instruction)); break; // EXTLH
+ case 0x72: OPERATE_RRR("mskqh", Ra(instruction), Rb(instruction), Rc(instruction)); break; // MSKQH
+ case 0x77: OPERATE_RRR("insqh", Ra(instruction), Rb(instruction), Rc(instruction)); break; // INSQH
+ case 0x7a: OPERATE_RRR("extqh", Ra(instruction), Rb(instruction), Rc(instruction)); break; // EXTQH
+
+ // immediate variants
+ case 0x82: OPERATE_RIR("mskbl", Ra(instruction), Im(instruction), Rc(instruction)); break; // MSKBL
+ case 0x86: OPERATE_RIR("extbl", Ra(instruction), Im(instruction), Rc(instruction)); break; // EXTBL
+ case 0x8b: OPERATE_RIR("insbl", Ra(instruction), Im(instruction), Rc(instruction)); break; // INSBL
+ case 0x92: OPERATE_RIR("mskwl", Ra(instruction), Im(instruction), Rc(instruction)); break; // MSKWL
+ case 0x96: OPERATE_RIR("extwl", Ra(instruction), Im(instruction), Rc(instruction)); break; // EXTWL
+ case 0x9b: OPERATE_RIR("inswl", Ra(instruction), Im(instruction), Rc(instruction)); break; // INSWL
+ case 0xa2: OPERATE_RIR("mskll", Ra(instruction), Im(instruction), Rc(instruction)); break; // MSKLL
+ case 0xa6: OPERATE_RIR("extll", Ra(instruction), Im(instruction), Rc(instruction)); break; // EXTLL
+ case 0xab: OPERATE_RIR("insll", Ra(instruction), Im(instruction), Rc(instruction)); break; // INSLL
+ case 0xb0: OPERATE_RIR("zap", Ra(instruction), Im(instruction), Rc(instruction)); break; // ZAP
+ case 0xb1: OPERATE_RIR("zapnot", Ra(instruction), Im(instruction), Rc(instruction)); break; // ZAPNOT
+ case 0xb2: OPERATE_RIR("mskql", Ra(instruction), Im(instruction), Rc(instruction)); break; // MSKQL
+ case 0xb4: OPERATE_RIR("srl", Ra(instruction), Im(instruction), Rc(instruction)); break; // SRL
+ case 0xb6: OPERATE_RIR("extql", Ra(instruction), Im(instruction), Rc(instruction)); break; // EXTQL
+ case 0xb9: OPERATE_RIR("sll", Ra(instruction), Im(instruction), Rc(instruction)); break; // SLL
+ case 0xbb: OPERATE_RIR("insql", Ra(instruction), Im(instruction), Rc(instruction)); break; // INSQL
+ case 0xbc: OPERATE_RIR("sra", Ra(instruction), Im(instruction), Rc(instruction)); break; // SRA
+ case 0xd2: OPERATE_RIR("mskwh", Ra(instruction), Im(instruction), Rc(instruction)); break; // MSKWH
+ case 0xd7: OPERATE_RIR("inswh", Ra(instruction), Im(instruction), Rc(instruction)); break; // INSWH
+ case 0xda: OPERATE_RIR("extwh", Ra(instruction), Im(instruction), Rc(instruction)); break; // EXTWH
+ case 0xe2: OPERATE_RIR("msklh", Ra(instruction), Im(instruction), Rc(instruction)); break; // MSKLH
+ case 0xe7: OPERATE_RIR("inslh", Ra(instruction), Im(instruction), Rc(instruction)); break; // INSLH
+ case 0xea: OPERATE_RIR("extlh", Ra(instruction), Im(instruction), Rc(instruction)); break; // EXTLH
+ case 0xf2: OPERATE_RIR("mskqh", Ra(instruction), Im(instruction), Rc(instruction)); break; // MSKQH
+ case 0xf7: OPERATE_RIR("insqh", Ra(instruction), Im(instruction), Rc(instruction)); break; // INSQH
+ case 0xfa: OPERATE_RIR("extqh", Ra(instruction), Im(instruction), Rc(instruction)); break; // EXTQH
+
+ default: UNKNOWN("ints*"); break;
+ }
+ break;
+ case 0x13: // INTM* (integer multiply)
+ switch ((instruction >> 5) & 0xff)
+ {
+ // register variants
+ case 0x00: OPERATE_RRR("mull", Ra(instruction), Rb(instruction), Rc(instruction)); break; // MULL
+ case 0x20: OPERATE_RRR("mulq", Ra(instruction), Rb(instruction), Rc(instruction)); break; // MULQ
+ case 0x30: OPERATE_RRR("umulh", Ra(instruction), Rb(instruction), Rc(instruction)); break; // UMULH
+ case 0x40: OPERATE_RRR("mull/v", Ra(instruction), Rb(instruction), Rc(instruction)); break; // MULL/V
+ case 0x60: OPERATE_RRR("mulq/v", Ra(instruction), Rb(instruction), Rc(instruction)); break; // MULQ/V
+
+ // immediate variants
+ case 0x80: OPERATE_RIR("mull", Ra(instruction), Im(instruction), Rc(instruction)); break; // MULL
+ case 0xa0: OPERATE_RIR("mulq", Ra(instruction), Im(instruction), Rc(instruction)); break; // MULQ
+ case 0xb0: OPERATE_RIR("umulh", Ra(instruction), Im(instruction), Rc(instruction)); break; // UMULH
+ case 0xc0: OPERATE_RIR("mull/v", Ra(instruction), Im(instruction), Rc(instruction)); break; // MULL/V
+ case 0xe0: OPERATE_RIR("mulq/v", Ra(instruction), Im(instruction), Rc(instruction)); break; // MULQ/V
+
+ default: UNKNOWN("intm*"); break;
+ }
+ case 0x14: // ITFP* (integer to floating)
+ switch ((instruction >> 5) & 0x7ff)
+ {
+ case 0x004: OPERATE_RF("itofs", Ra(instruction), Rc(instruction)); break; // ITOFS
+ case 0x00a: OPERATE_FF("sqrtf/c", Rb(instruction), Rc(instruction)); break; // SQRTF/C
+ case 0x00b: OPERATE_FF("sqrts/c", Rb(instruction), Rc(instruction)); break; // SQRTS/C
+ case 0x014: OPERATE_RF("itoff", Ra(instruction), Rc(instruction)); break; // ITOFF
+ case 0x024: OPERATE_RF("itoft", Ra(instruction), Rc(instruction)); break; // ITOFT
+ case 0x02a: OPERATE_FF("sqrtg/c", Rb(instruction), Rc(instruction)); break; // SQRTG/C
+ case 0x02b: OPERATE_FF("sqrtt/c", Rb(instruction), Rc(instruction)); break; // SQRTT/C
+ case 0x04b: OPERATE_FF("sqrts/m", Rb(instruction), Rc(instruction)); break; // SQRTS/M
+ case 0x06b: OPERATE_FF("sqrtt/m", Rb(instruction), Rc(instruction)); break; // SQRTT/M
+ case 0x08a: OPERATE_FF("sqrtf", Rb(instruction), Rc(instruction)); break; // SQRTF
+ case 0x08b: OPERATE_FF("sqrts", Rb(instruction), Rc(instruction)); break; // SQRTS
+ case 0x0aa: OPERATE_FF("sqrtg", Rb(instruction), Rc(instruction)); break; // SQRTG
+ case 0x0ab: OPERATE_FF("sqrtt", Rb(instruction), Rc(instruction)); break; // SQRTT
+ case 0x0cb: OPERATE_FF("sqrts/d", Rb(instruction), Rc(instruction)); break; // SQRTS/D
+ case 0x0eb: OPERATE_FF("sqrtt/d", Rb(instruction), Rc(instruction)); break; // SQRTT/D
+ case 0x10a: OPERATE_FF("sqrtf/uc", Rb(instruction), Rc(instruction)); break; // SQRTF/UC
+ case 0x10b: OPERATE_FF("sqrts/uc", Rb(instruction), Rc(instruction)); break; // SQRTS/UC
+ case 0x12a: OPERATE_FF("sqrtg/uc", Rb(instruction), Rc(instruction)); break; // SQRTG/UC
+ case 0x12b: OPERATE_FF("sqrtt/uc", Rb(instruction), Rc(instruction)); break; // SQRTT/UC
+ case 0x14b: OPERATE_FF("sqrts/um", Rb(instruction), Rc(instruction)); break; // SQRTS/UM
+ case 0x16b: OPERATE_FF("sqrtt/um", Rb(instruction), Rc(instruction)); break; // SQRTT/UM
+ case 0x18a: OPERATE_FF("sqrtf/u", Rb(instruction), Rc(instruction)); break; // SQRTF/U
+ case 0x1aa: OPERATE_FF("sqrtg/u", Rb(instruction), Rc(instruction)); break; // SQRTG/U
+ case 0x1ab: OPERATE_FF("sqrtt/u", Rb(instruction), Rc(instruction)); break; // SQRTT/U
+ case 0x1cb: OPERATE_FF("sqrts/ud", Rb(instruction), Rc(instruction)); break; // SQRTS/UD
+ case 0x1eb: OPERATE_FF("sqrtt/ud", Rb(instruction), Rc(instruction)); break; // SQRTT/UD
+ case 0x40a: OPERATE_FF("sqrtf/sc", Rb(instruction), Rc(instruction)); break; // SQRTF/SC
+ case 0x42a: OPERATE_FF("sqrtg/sc", Rb(instruction), Rc(instruction)); break; // SQRTG/SC
+ case 0x48a: OPERATE_FF("sqrtf/s", Rb(instruction), Rc(instruction)); break; // SQRTF/S
+ case 0x4aa: OPERATE_FF("sqrtg/s", Rb(instruction), Rc(instruction)); break; // SQRTG/S
+ case 0x50a: OPERATE_FF("sqrtf/suc", Rb(instruction), Rc(instruction)); break; // SQRTF/SUC
+ case 0x50b: OPERATE_FF("sqrts/suc", Rb(instruction), Rc(instruction)); break; // SQRTS/SUC
+ case 0x52a: OPERATE_FF("sqrtg/suc", Rb(instruction), Rc(instruction)); break; // SQRTG/SUC
+ case 0x52b: OPERATE_FF("sqrtt/suc", Rb(instruction), Rc(instruction)); break; // SQRTT/SUC
+ case 0x54b: OPERATE_FF("sqrts/sum", Rb(instruction), Rc(instruction)); break; // SQRTS/SUM
+ case 0x56b: OPERATE_FF("sqrtt/sum", Rb(instruction), Rc(instruction)); break; // SQRTT/SUM
+ case 0x58a: OPERATE_FF("sqrtf/su", Rb(instruction), Rc(instruction)); break; // SQRTF/SU
+ case 0x58b: OPERATE_FF("sqrts/su", Rb(instruction), Rc(instruction)); break; // SQRTS/SU
+ case 0x5aa: OPERATE_FF("sqrtg/su", Rb(instruction), Rc(instruction)); break; // SQRTG/SU
+ case 0x5ab: OPERATE_FF("sqrtt/su", Rb(instruction), Rc(instruction)); break; // SQRTT/SU
+ case 0x5cb: OPERATE_FF("sqrts/sud", Rb(instruction), Rc(instruction)); break; // SQRTS/SUD
+ case 0x5eb: OPERATE_FF("sqrtt/sud", Rb(instruction), Rc(instruction)); break; // SQRTT/SUD
+ case 0x70b: OPERATE_FF("sqrts/suic", Rb(instruction), Rc(instruction)); break; // SQRTS/SUIC
+ case 0x72b: OPERATE_FF("sqrtt/suic", Rb(instruction), Rc(instruction)); break; // SQRTT/SUIC
+ case 0x74b: OPERATE_FF("sqrts/suim", Rb(instruction), Rc(instruction)); break; // SQRTS/SUIM
+ case 0x76b: OPERATE_FF("sqrtt/suim", Rb(instruction), Rc(instruction)); break; // SQRTT/SUIM
+ case 0x78b: OPERATE_FF("sqrts/sui", Rb(instruction), Rc(instruction)); break; // SQRTS/SUI
+ case 0x7ab: OPERATE_FF("sqrtt/sui", Rb(instruction), Rc(instruction)); break; // SQRTT/SUI
+ case 0x7cb: OPERATE_FF("sqrts/suid", Rb(instruction), Rc(instruction)); break; // SQRTS/SUID
+ case 0x7eb: OPERATE_FF("sqrtt/suid", Rb(instruction), Rc(instruction)); break; // SQRTT/SUID
+
+ default: UNKNOWN("itfp*"); break;
+ }
+ break;
+ case 0x15: // FLTV* (vax floating)
+ switch ((instruction >> 5) & 0x7ff)
+ {
+ case 0x000: OPERATE_FFF("addf/c", Ra(instruction), Rb(instruction), Rc(instruction)); break; // ADDF/C
+ case 0x001: OPERATE_FFF("subf/c", Ra(instruction), Rb(instruction), Rc(instruction)); break; // SUBF/C
+ case 0x002: OPERATE_FFF("mulf/c", Ra(instruction), Rb(instruction), Rc(instruction)); break; // MULF/C
+ case 0x003: OPERATE_FFF("divf/c", Ra(instruction), Rb(instruction), Rc(instruction)); break; // DIVF/C
+ case 0x01e: OPERATE_FF("cvtdg/c", Rb(instruction), Rc(instruction)); break; // CVTDG/C
+ case 0x020: OPERATE_FFF("addg/c", Ra(instruction), Rb(instruction), Rc(instruction)); break; // ADDG/C
+ case 0x021: OPERATE_FFF("subg/c", Ra(instruction), Rb(instruction), Rc(instruction)); break; // SUBG/C
+ case 0x022: OPERATE_FFF("mulg/c", Ra(instruction), Rb(instruction), Rc(instruction)); break; // MULG/C
+ case 0x023: OPERATE_FFF("divg/c", Ra(instruction), Rb(instruction), Rc(instruction)); break; // DIVG/C
+ case 0x02c: OPERATE_FF("cvtgf/c", Rb(instruction), Rc(instruction)); break; // CVTGF/C
+ case 0x02d: OPERATE_FF("cvtgd/c", Rb(instruction), Rc(instruction)); break; // CVTGD/C
+ case 0x02f: OPERATE_FF("cvtgq/c", Rb(instruction), Rc(instruction)); break; // CVTGQ/C
+ case 0x03c: OPERATE_FF("cvtqf/c", Rb(instruction), Rc(instruction)); break; // CVTQF/C
+ case 0x03e: OPERATE_FF("cvtqg/c", Rb(instruction), Rc(instruction)); break; // CVTQG/C
+ case 0x080: OPERATE_FFF("addf", Ra(instruction), Rb(instruction), Rc(instruction)); break; // ADDF
+ case 0x081:
+ if (Ra(instruction) == 31)
+ OPERATE_FF("negf", Rb(instruction), Rc(instruction));
+ else
+ OPERATE_FFF("subf", Ra(instruction), Rb(instruction), Rc(instruction)); // SUBF
+ break;
+ case 0x082: OPERATE_FFF("mulf", Ra(instruction), Rb(instruction), Rc(instruction)); break; // MULF
+ case 0x083: OPERATE_FFF("divf", Ra(instruction), Rb(instruction), Rc(instruction)); break; // DIVF
+ case 0x09e: OPERATE_FF("cvtdg", Rb(instruction), Rc(instruction)); break; // CVTDG
+ case 0x0a0: OPERATE_FFF("addg", Ra(instruction), Rb(instruction), Rc(instruction)); break; // ADDG
+ case 0x0a1:
+ if (Ra(instruction) == 31)
+ OPERATE_FF("negg", Rb(instruction), Rc(instruction));
+ else
+ OPERATE_FFF("subg", Ra(instruction), Rb(instruction), Rc(instruction)); // SUBG
+ break;
+ case 0x0a2: OPERATE_FFF("mulg", Ra(instruction), Rb(instruction), Rc(instruction)); break; // MULG
+ case 0x0a3: OPERATE_FFF("divg", Ra(instruction), Rb(instruction), Rc(instruction)); break; // DIVG
+ case 0x0a5: OPERATE_FFF("cmpgeq", Ra(instruction), Rb(instruction), Rc(instruction)); break; // CMPGEQ
+ case 0x0a6: OPERATE_FFF("cmpglt", Ra(instruction), Rb(instruction), Rc(instruction)); break; // CMPGLT
+ case 0x0a7: OPERATE_FFF("cmpgle", Ra(instruction), Rb(instruction), Rc(instruction)); break; // CMPGLE
+ case 0x0ac: OPERATE_FF("cvtgf", Rb(instruction), Rc(instruction)); break; // CVTGF
+ case 0x0ad: OPERATE_FF("cvtgd", Rb(instruction), Rc(instruction)); break; // CVTGD
+ case 0x0af: OPERATE_FF("cvtgq", Rb(instruction), Rc(instruction)); break; // CVTGQ
+ case 0x0bc: OPERATE_FF("cvtqf", Rb(instruction), Rc(instruction)); break; // CVTQF
+ case 0x0be: OPERATE_FF("cvtqg", Rb(instruction), Rc(instruction)); break; // CVTQG
+ case 0x100: OPERATE_FFF("addf/uc", Ra(instruction), Rb(instruction), Rc(instruction)); break; // ADDF/UC
+ case 0x101: OPERATE_FFF("subf/uc", Ra(instruction), Rb(instruction), Rc(instruction)); break; // SUBF/UC
+ case 0x102: OPERATE_FFF("mulf/uc", Ra(instruction), Rb(instruction), Rc(instruction)); break; // MULF/UC
+ case 0x103: OPERATE_FFF("divf/uc", Ra(instruction), Rb(instruction), Rc(instruction)); break; // DIVF/UC
+ case 0x11e: OPERATE_FF("cvtdg/uc", Rb(instruction), Rc(instruction)); break; // CVTDG/UC
+ case 0x120: OPERATE_FFF("addg/uc", Ra(instruction), Rb(instruction), Rc(instruction)); break; // ADDG/UC
+ case 0x121: OPERATE_FFF("subg/uc", Ra(instruction), Rb(instruction), Rc(instruction)); break; // SUBG/UC
+ case 0x122: OPERATE_FFF("mulg/uc", Ra(instruction), Rb(instruction), Rc(instruction)); break; // MULG/UC
+ case 0x123: OPERATE_FFF("divg/uc", Ra(instruction), Rb(instruction), Rc(instruction)); break; // DIVG/UC
+ case 0x12c: OPERATE_FF("cvtgf/uc", Rb(instruction), Rc(instruction)); break; // CVTGF/UC
+ case 0x12d: OPERATE_FF("cvtgd/uc", Rb(instruction), Rc(instruction)); break; // CVTGD/UC
+ case 0x12f: OPERATE_FF("cvtgq/vc", Rb(instruction), Rc(instruction)); break; // CVTGQ/VC
+ case 0x180: OPERATE_FFF("addf/u", Ra(instruction), Rb(instruction), Rc(instruction)); break; // ADDF/U
+ case 0x181: OPERATE_FFF("subf/u", Ra(instruction), Rb(instruction), Rc(instruction)); break; // SUBF/U
+ case 0x182: OPERATE_FFF("mulf/u", Ra(instruction), Rb(instruction), Rc(instruction)); break; // MULF/U
+ case 0x183: OPERATE_FFF("divf/u", Ra(instruction), Rb(instruction), Rc(instruction)); break; // DIVF/U
+ case 0x19e: OPERATE_FF("cvtdg/u", Rb(instruction), Rc(instruction)); break; // CVTDG/U
+ case 0x1a0: OPERATE_FFF("addg/u", Ra(instruction), Rb(instruction), Rc(instruction)); break; // ADDG/U
+ case 0x1a1: OPERATE_FFF("subg/u", Ra(instruction), Rb(instruction), Rc(instruction)); break; // SUBG/U
+ case 0x1a2: OPERATE_FFF("mulg/u", Ra(instruction), Rb(instruction), Rc(instruction)); break; // MULG/U
+ case 0x1a3: OPERATE_FFF("divg/u", Ra(instruction), Rb(instruction), Rc(instruction)); break; // DIVG/U
+ case 0x1ac: OPERATE_FF("cvtgf/u", Rb(instruction), Rc(instruction)); break; // CVTGF/U
+ case 0x1ad: OPERATE_FF("cvtgd/u", Rb(instruction), Rc(instruction)); break; // CVTGD/U
+ case 0x1af: OPERATE_FF("cvtgq/v", Rb(instruction), Rc(instruction)); break; // CVTGQ/V
+ case 0x400: OPERATE_FFF("addf/sc", Ra(instruction), Rb(instruction), Rc(instruction)); break; // ADDF/SC
+ case 0x401: OPERATE_FFF("subf/sc", Ra(instruction), Rb(instruction), Rc(instruction)); break; // SUBF/SC
+ case 0x402: OPERATE_FFF("mulf/sc", Ra(instruction), Rb(instruction), Rc(instruction)); break; // MULF/SC
+ case 0x403: OPERATE_FFF("divf/sc", Ra(instruction), Rb(instruction), Rc(instruction)); break; // DIVF/SC
+ case 0x41e: OPERATE_FF("cvtdg/sc", Rb(instruction), Rc(instruction)); break; // CVTDG/SC
+ case 0x420: OPERATE_FFF("addg/sc", Ra(instruction), Rb(instruction), Rc(instruction)); break; // ADDG/SC
+ case 0x421: OPERATE_FFF("subg/sc", Ra(instruction), Rb(instruction), Rc(instruction)); break; // SUBG/SC
+ case 0x422: OPERATE_FFF("mulg/sc", Ra(instruction), Rb(instruction), Rc(instruction)); break; // MULG/SC
+ case 0x423: OPERATE_FFF("divg/sc", Ra(instruction), Rb(instruction), Rc(instruction)); break; // DIVG/SC
+ case 0x42c: OPERATE_FF("cvtgf/sc", Rb(instruction), Rc(instruction)); break; // CVTGF/SC
+ case 0x42d: OPERATE_FF("cvtgd/sc", Rb(instruction), Rc(instruction)); break; // CVTGD/SC
+ case 0x42f: OPERATE_FF("cvtgq/sc", Rb(instruction), Rc(instruction)); break; // CVTGQ/SC
+ case 0x480: OPERATE_FFF("addf/s", Ra(instruction), Rb(instruction), Rc(instruction)); break; // ADDF/S
+ case 0x481:
+ if (Ra(instruction) == 31)
+ OPERATE_FF("negf/s", Rb(instruction), Rc(instruction));
+ else
+ OPERATE_FFF("subf/s", Ra(instruction), Rb(instruction), Rc(instruction)); // SUBF/S
+ break;
+ case 0x482: OPERATE_FFF("mulf/s", Ra(instruction), Rb(instruction), Rc(instruction)); break; // MULF/S
+ case 0x483: OPERATE_FFF("divf/s", Ra(instruction), Rb(instruction), Rc(instruction)); break; // DIVF/S
+ case 0x49e: OPERATE_FF("cvtdg/s", Rb(instruction), Rc(instruction)); break; // CVTDG/S
+ case 0x4a0: OPERATE_FFF("addg/s", Ra(instruction), Rb(instruction), Rc(instruction)); break; // ADDG/S
+ case 0x4a1:
+ if (Ra(instruction) == 31)
+ OPERATE_FF("negg/s", Rb(instruction), Rc(instruction));
+ else
+ OPERATE_FFF("subg/s", Ra(instruction), Rb(instruction), Rc(instruction)); // SUBG/S
+ break;
+ case 0x4a2: OPERATE_FFF("mulg/s", Ra(instruction), Rb(instruction), Rc(instruction)); break; // MULG/S
+ case 0x4a3: OPERATE_FFF("divg/s", Ra(instruction), Rb(instruction), Rc(instruction)); break; // DIVG/S
+ case 0x4a5: OPERATE_FFF("cmpgeq/s", Ra(instruction), Rb(instruction), Rc(instruction)); break; // CMPGEQ/S
+ case 0x4a6: OPERATE_FFF("cmpglt/s", Ra(instruction), Rb(instruction), Rc(instruction)); break; // CMPGLT/S
+ case 0x4a7: OPERATE_FFF("cmpgle/s", Ra(instruction), Rb(instruction), Rc(instruction)); break; // CMPGLE/S
+ case 0x4ac: OPERATE_FF("cvtgf/s", Rb(instruction), Rc(instruction)); break; // CVTGF/S
+ case 0x4ad: OPERATE_FF("cvtgd/s", Rb(instruction), Rc(instruction)); break; // CVTGD/S
+ case 0x4af: OPERATE_FF("cvtgq/s", Rb(instruction), Rc(instruction)); break; // CVTGQ/S
+ case 0x500: OPERATE_FFF("addf/suc", Ra(instruction), Rb(instruction), Rc(instruction)); break; // ADDF/SUC
+ case 0x501: OPERATE_FFF("subf/suc", Ra(instruction), Rb(instruction), Rc(instruction)); break; // SUBF/SUC
+ case 0x502: OPERATE_FFF("mulf/suc", Ra(instruction), Rb(instruction), Rc(instruction)); break; // MULF/SUC
+ case 0x503: OPERATE_FFF("divf/suc", Ra(instruction), Rb(instruction), Rc(instruction)); break; // DIVF/SUC
+ case 0x51e: OPERATE_FF("cvtdg/suc", Rb(instruction), Rc(instruction)); break; // CVTDG/SUC
+ case 0x520: OPERATE_FFF("addg/suc", Ra(instruction), Rb(instruction), Rc(instruction)); break; // ADDG/SUC
+ case 0x521: OPERATE_FFF("subg/suc", Ra(instruction), Rb(instruction), Rc(instruction)); break; // SUBG/SUC
+ case 0x522: OPERATE_FFF("mulg/suc", Ra(instruction), Rb(instruction), Rc(instruction)); break; // MULG/SUC
+ case 0x523: OPERATE_FFF("divg/suc", Ra(instruction), Rb(instruction), Rc(instruction)); break; // DIVG/SUC
+ case 0x52c: OPERATE_FF("cvtgf/suc", Rb(instruction), Rc(instruction)); break; // CVTGF/SUC
+ case 0x52d: OPERATE_FF("cvtgd/suc", Rb(instruction), Rc(instruction)); break; // CVTGD/SUC
+ case 0x52f: OPERATE_FF("cvtgq/svc", Rb(instruction), Rc(instruction)); break; // CVTGQ/SVC
+ case 0x580: OPERATE_FFF("addf/su", Ra(instruction), Rb(instruction), Rc(instruction)); break; // ADDF/SU
+ case 0x581: OPERATE_FFF("subf/su", Ra(instruction), Rb(instruction), Rc(instruction)); break; // SUBF/SU
+ case 0x582: OPERATE_FFF("mulf/su", Ra(instruction), Rb(instruction), Rc(instruction)); break; // MULF/SU
+ case 0x583: OPERATE_FFF("divf/su", Ra(instruction), Rb(instruction), Rc(instruction)); break; // DIVF/SU
+ case 0x59e: OPERATE_FF("cvtdg/su", Rb(instruction), Rc(instruction)); break; // CVTDG/SU
+ case 0x5a0: OPERATE_FFF("addg/su", Ra(instruction), Rb(instruction), Rc(instruction)); break; // ADDG/SU
+ case 0x5a1: OPERATE_FFF("subg/su", Ra(instruction), Rb(instruction), Rc(instruction)); break; // SUBG/SU
+ case 0x5a2: OPERATE_FFF("mulg/su", Ra(instruction), Rb(instruction), Rc(instruction)); break; // MULG/SU
+ case 0x5a3: OPERATE_FFF("divg/su", Ra(instruction), Rb(instruction), Rc(instruction)); break; // DIVG/SU
+ case 0x5ac: OPERATE_FF("cvtgf/su", Rb(instruction), Rc(instruction)); break; // CVTGF/SU
+ case 0x5ad: OPERATE_FF("cvtgd/su", Rb(instruction), Rc(instruction)); break; // CVTGD/SU
+ case 0x5af: OPERATE_FF("cvtgq/sv", Rb(instruction), Rc(instruction)); break; // CVTGQ/SV
+
+ default: UNKNOWN("fltv*"); break;
+ }
+ break;
+ case 0x16: // FLTI* (ieee floating)
+ switch ((instruction >> 5) & 0x7ff)
+ {
+ case 0x000: OPERATE_FFF("adds/c", Ra(instruction), Rb(instruction), Rc(instruction)); break; // ADDS/C
+ case 0x001: OPERATE_FFF("subs/c", Ra(instruction), Rb(instruction), Rc(instruction)); break; // SUBS/C
+ case 0x002: OPERATE_FFF("muls/c", Ra(instruction), Rb(instruction), Rc(instruction)); break; // MULS/C
+ case 0x003: OPERATE_FFF("divs/c", Ra(instruction), Rb(instruction), Rc(instruction)); break; // DIVS/C
+ case 0x020: OPERATE_FFF("addt/c", Ra(instruction), Rb(instruction), Rc(instruction)); break; // ADDT/C
+ case 0x021: OPERATE_FFF("subt/c", Ra(instruction), Rb(instruction), Rc(instruction)); break; // SUBT/C
+ case 0x022: OPERATE_FFF("mult/c", Ra(instruction), Rb(instruction), Rc(instruction)); break; // MULT/C
+ case 0x023: OPERATE_FFF("divt/c", Ra(instruction), Rb(instruction), Rc(instruction)); break; // DIVT/C
+ case 0x02c: OPERATE_FF("cvttts/c", Rb(instruction), Rc(instruction)); break; // CVTTS/C
+ case 0x02f: OPERATE_FF("cvttq/c", Rb(instruction), Rc(instruction)); break; // CVTTQ/C
+ case 0x03c: OPERATE_FF("cvtqs/c", Rb(instruction), Rc(instruction)); break; // CVTQS/C
+ case 0x03e: OPERATE_FF("cvtqt/c", Rb(instruction), Rc(instruction)); break; // CVTQT/C
+ case 0x040: OPERATE_FFF("adds/m", Ra(instruction), Rb(instruction), Rc(instruction)); break; // ADDS/M
+ case 0x041: OPERATE_FFF("subs/m", Ra(instruction), Rb(instruction), Rc(instruction)); break; // SUBS/M
+ case 0x042: OPERATE_FFF("muls/m", Ra(instruction), Rb(instruction), Rc(instruction)); break; // MULS/M
+ case 0x043: OPERATE_FFF("divs/m", Ra(instruction), Rb(instruction), Rc(instruction)); break; // DIVS/M
+ case 0x060: OPERATE_FFF("addt/m", Ra(instruction), Rb(instruction), Rc(instruction)); break; // ADDT/M
+ case 0x061: OPERATE_FFF("subt/m", Ra(instruction), Rb(instruction), Rc(instruction)); break; // SUBT/M
+ case 0x062: OPERATE_FFF("mult/m", Ra(instruction), Rb(instruction), Rc(instruction)); break; // MULT/M
+ case 0x063: OPERATE_FFF("divt/m", Ra(instruction), Rb(instruction), Rc(instruction)); break; // DIVT/M
+ case 0x06c: OPERATE_FF("cvttts/m", Rb(instruction), Rc(instruction)); break; // CVTTS/M
+ case 0x06f: OPERATE_FF("cvttq/m", Rb(instruction), Rc(instruction)); break; // CVTTQ/M
+ case 0x07c: OPERATE_FF("cvtqs/m", Rb(instruction), Rc(instruction)); break; // CVTQS/M
+ case 0x07e: OPERATE_FF("cvtqt/m", Rb(instruction), Rc(instruction)); break; // CVTQT/M
+ case 0x080: OPERATE_FFF("adds", Ra(instruction), Rb(instruction), Rc(instruction)); break; // ADDS
+ case 0x081:
+ if (Ra(instruction) == 31)
+ OPERATE_FF("negs", Rb(instruction), Rc(instruction));
+ else
+ OPERATE_FFF("subs", Ra(instruction), Rb(instruction), Rc(instruction)); // SUBS
+ break;
+ case 0x082: OPERATE_FFF("muls", Ra(instruction), Rb(instruction), Rc(instruction)); break; // MULS
+ case 0x083: OPERATE_FFF("divs", Ra(instruction), Rb(instruction), Rc(instruction)); break; // DIVS
+ case 0x0a0: OPERATE_FFF("addt", Ra(instruction), Rb(instruction), Rc(instruction)); break; // ADDT
+ case 0x0a1:
+ if (Ra(instruction) == 31)
+ OPERATE_FF("negt", Rb(instruction), Rc(instruction));
+ else
+ OPERATE_FFF("subt", Ra(instruction), Rb(instruction), Rc(instruction)); // SUBT
+ break;
+ case 0x0a2: OPERATE_FFF("mult", Ra(instruction), Rb(instruction), Rc(instruction)); break; // MULT
+ case 0x0a3: OPERATE_FFF("divt", Ra(instruction), Rb(instruction), Rc(instruction)); break; // DIVT
+ case 0x0a4: OPERATE_FFF("cmptun", Ra(instruction), Rb(instruction), Rc(instruction)); break; // CMPTUN
+ case 0x0a5: OPERATE_FFF("cmpteq", Ra(instruction), Rb(instruction), Rc(instruction)); break; // CMPTEQ
+ case 0x0a6: OPERATE_FFF("cmptlt", Ra(instruction), Rb(instruction), Rc(instruction)); break; // CMPTLT
+ case 0x0a7: OPERATE_FFF("cmptle", Ra(instruction), Rb(instruction), Rc(instruction)); break; // CMPTLE
+ case 0x0ac: OPERATE_FF("cvttts", Rb(instruction), Rc(instruction)); break; // CVTTS
+ case 0x0af: OPERATE_FF("cvttq", Rb(instruction), Rc(instruction)); break; // CVTTQ
+ case 0x0bc: OPERATE_FF("cvtqs", Rb(instruction), Rc(instruction)); break; // CVTQS
+ case 0x0be: OPERATE_FF("cvtqt", Rb(instruction), Rc(instruction)); break; // CVTQT
+ case 0x0c0: OPERATE_FFF("adds/d", Ra(instruction), Rb(instruction), Rc(instruction)); break; // ADDS/D
+ case 0x0c1: OPERATE_FFF("subs/d", Ra(instruction), Rb(instruction), Rc(instruction)); break; // SUBS/D
+ case 0x0c2: OPERATE_FFF("muls/d", Ra(instruction), Rb(instruction), Rc(instruction)); break; // MULS/D
+ case 0x0c3: OPERATE_FFF("divs/d", Ra(instruction), Rb(instruction), Rc(instruction)); break; // DIVS/D
+ case 0x0e0: OPERATE_FFF("addt/d", Ra(instruction), Rb(instruction), Rc(instruction)); break; // ADDT/D
+ case 0x0e1: OPERATE_FFF("subt/d", Ra(instruction), Rb(instruction), Rc(instruction)); break; // SUBT/D
+ case 0x0e2: OPERATE_FFF("mult/d", Ra(instruction), Rb(instruction), Rc(instruction)); break; // MULT/D
+ case 0x0e3: OPERATE_FFF("divt/d", Ra(instruction), Rb(instruction), Rc(instruction)); break; // DIVT/D
+ case 0x0ec: OPERATE_FF("cvttts/d", Rb(instruction), Rc(instruction)); break; // CVTTS/D
+ case 0x0ef: OPERATE_FF("cvttq/d", Rb(instruction), Rc(instruction)); break; // CVTTQ/D
+ case 0x0fc: OPERATE_FF("cvtqs/d", Rb(instruction), Rc(instruction)); break; // CVTQS/D
+ case 0x0fe: OPERATE_FF("cvtqt/d", Rb(instruction), Rc(instruction)); break; // CVTQT/D
+ case 0x100: OPERATE_FFF("adds/uc", Ra(instruction), Rb(instruction), Rc(instruction)); break; // ADDS/UC
+ case 0x101: OPERATE_FFF("subs/uc", Ra(instruction), Rb(instruction), Rc(instruction)); break; // SUBS/UC
+ case 0x102: OPERATE_FFF("muls/uc", Ra(instruction), Rb(instruction), Rc(instruction)); break; // MULS/UC
+ case 0x103: OPERATE_FFF("divs/uc", Ra(instruction), Rb(instruction), Rc(instruction)); break; // DIVS/UC
+ case 0x120: OPERATE_FFF("addt/uc", Ra(instruction), Rb(instruction), Rc(instruction)); break; // ADDT/UC
+ case 0x121: OPERATE_FFF("subt/uc", Ra(instruction), Rb(instruction), Rc(instruction)); break; // SUBT/UC
+ case 0x122: OPERATE_FFF("mult/uc", Ra(instruction), Rb(instruction), Rc(instruction)); break; // MULT/UC
+ case 0x123: OPERATE_FFF("divt/uc", Ra(instruction), Rb(instruction), Rc(instruction)); break; // DIVT/UC
+ case 0x12c: OPERATE_FF("cvttts/uc", Rb(instruction), Rc(instruction)); break; // CVTTS/UC
+ case 0x12f: OPERATE_FF("cvttq/vc", Rb(instruction), Rc(instruction)); break; // CVTTQ/VC
+ case 0x140: OPERATE_FFF("adds/um", Ra(instruction), Rb(instruction), Rc(instruction)); break; // ADDS/UM
+ case 0x141: OPERATE_FFF("subs/um", Ra(instruction), Rb(instruction), Rc(instruction)); break; // SUBS/UM
+ case 0x142: OPERATE_FFF("muls/um", Ra(instruction), Rb(instruction), Rc(instruction)); break; // MULS/UM
+ case 0x143: OPERATE_FFF("divs/um", Ra(instruction), Rb(instruction), Rc(instruction)); break; // DIVS/UM
+ case 0x160: OPERATE_FFF("addt/um", Ra(instruction), Rb(instruction), Rc(instruction)); break; // ADDT/UM
+ case 0x161: OPERATE_FFF("subt/um", Ra(instruction), Rb(instruction), Rc(instruction)); break; // SUBT/UM
+ case 0x162: OPERATE_FFF("mult/um", Ra(instruction), Rb(instruction), Rc(instruction)); break; // MULT/UM
+ case 0x163: OPERATE_FFF("divt/um", Ra(instruction), Rb(instruction), Rc(instruction)); break; // DIVT/UM
+ case 0x16c: OPERATE_FF("cvttts/um", Rb(instruction), Rc(instruction)); break; // CVTTS/UM
+ case 0x16f: OPERATE_FF("cvttq/vm", Rb(instruction), Rc(instruction)); break; // CVTTQ/VM
+ case 0x180: OPERATE_FFF("adds/u", Ra(instruction), Rb(instruction), Rc(instruction)); break; // ADDS/U
+ case 0x181: OPERATE_FFF("subs/u", Ra(instruction), Rb(instruction), Rc(instruction)); break; // SUBS/U
+ case 0x182: OPERATE_FFF("muls/u", Ra(instruction), Rb(instruction), Rc(instruction)); break; // MULS/U
+ case 0x183: OPERATE_FFF("divs/u", Ra(instruction), Rb(instruction), Rc(instruction)); break; // DIVS/U
+ case 0x1a0: OPERATE_FFF("addt/u", Ra(instruction), Rb(instruction), Rc(instruction)); break; // ADDT/U
+ case 0x1a1: OPERATE_FFF("subt/u", Ra(instruction), Rb(instruction), Rc(instruction)); break; // SUBT/U
+ case 0x1a2: OPERATE_FFF("mult/u", Ra(instruction), Rb(instruction), Rc(instruction)); break; // MULT/U
+ case 0x1a3: OPERATE_FFF("divt/u", Ra(instruction), Rb(instruction), Rc(instruction)); break; // DIVT/U
+ case 0x1ac: OPERATE_FF("cvttts/u", Rb(instruction), Rc(instruction)); break; // CVTTS/U
+ case 0x1af: OPERATE_FF("cvttq/v", Rb(instruction), Rc(instruction)); break; // CVTTQ/V
+ case 0x1c0: OPERATE_FFF("adds/ud", Ra(instruction), Rb(instruction), Rc(instruction)); break; // ADDS/UD
+ case 0x1c1: OPERATE_FFF("subs/ud", Ra(instruction), Rb(instruction), Rc(instruction)); break; // SUBS/UD
+ case 0x1c2: OPERATE_FFF("muls/ud", Ra(instruction), Rb(instruction), Rc(instruction)); break; // MULS/UD
+ case 0x1c3: OPERATE_FFF("divs/ud", Ra(instruction), Rb(instruction), Rc(instruction)); break; // DIVS/UD
+ case 0x1e0: OPERATE_FFF("addt/ud", Ra(instruction), Rb(instruction), Rc(instruction)); break; // ADDT/UD
+ case 0x1e1: OPERATE_FFF("subs/ud", Ra(instruction), Rb(instruction), Rc(instruction)); break; // SUBT/UD
+ case 0x1e2: OPERATE_FFF("mult/ud", Ra(instruction), Rb(instruction), Rc(instruction)); break; // MULT/UD
+ case 0x1e3: OPERATE_FFF("divt/ud", Ra(instruction), Rb(instruction), Rc(instruction)); break; // DIVT/UD
+ case 0x1ec: OPERATE_FF("cvttts/ud", Rb(instruction), Rc(instruction)); break; // CVTTS/UD
+ case 0x1ef: OPERATE_FF("cvttq/vd", Rb(instruction), Rc(instruction)); break; // CVTTQ/VD
+ case 0x2ac: OPERATE_FF("cvtst", Rb(instruction), Rc(instruction)); break; // CVTST
+ case 0x500: OPERATE_FFF("adds/suc", Ra(instruction), Rb(instruction), Rc(instruction)); break; // ADDS/SUC
+ case 0x501: OPERATE_FFF("subs/suc", Ra(instruction), Rb(instruction), Rc(instruction)); break; // SUBS/SUC
+ case 0x502: OPERATE_FFF("muls/suc", Ra(instruction), Rb(instruction), Rc(instruction)); break; // MULS/SUC
+ case 0x503: OPERATE_FFF("divs/suc", Ra(instruction), Rb(instruction), Rc(instruction)); break; // DIVS/SUC
+ case 0x520: OPERATE_FFF("addt/suc", Ra(instruction), Rb(instruction), Rc(instruction)); break; // ADDT/SUC
+ case 0x521: OPERATE_FFF("subt/suc", Ra(instruction), Rb(instruction), Rc(instruction)); break; // SUBT/SUC
+ case 0x522: OPERATE_FFF("mult/suc", Ra(instruction), Rb(instruction), Rc(instruction)); break; // MULT/SUC
+ case 0x523: OPERATE_FFF("divt/suc", Ra(instruction), Rb(instruction), Rc(instruction)); break; // DIVT/SUC
+ case 0x52c: OPERATE_FF("cvttts/suc", Rb(instruction), Rc(instruction)); break; // CVTTS/SUC
+ case 0x52f: OPERATE_FF("cvttq/svc", Rb(instruction), Rc(instruction)); break; // CVTTQ/SVC
+ case 0x540: OPERATE_FFF("adds/sum", Ra(instruction), Rb(instruction), Rc(instruction)); break; // ADDS/SUM
+ case 0x541: OPERATE_FFF("subs/sum", Ra(instruction), Rb(instruction), Rc(instruction)); break; // SUBS/SUM
+ case 0x542: OPERATE_FFF("muls/sum", Ra(instruction), Rb(instruction), Rc(instruction)); break; // MULS/SUM
+ case 0x543: OPERATE_FFF("divs/sum", Ra(instruction), Rb(instruction), Rc(instruction)); break; // DIVS/SUM
+ case 0x560: OPERATE_FFF("addt/sum", Ra(instruction), Rb(instruction), Rc(instruction)); break; // ADDT/SUM
+ case 0x561: OPERATE_FFF("subt/sum", Ra(instruction), Rb(instruction), Rc(instruction)); break; // SUBT/SUM
+ case 0x562: OPERATE_FFF("mult/sum", Ra(instruction), Rb(instruction), Rc(instruction)); break; // MULT/SUM
+ case 0x563: OPERATE_FFF("divt/sum", Ra(instruction), Rb(instruction), Rc(instruction)); break; // DIVT/SUM
+ case 0x56c: OPERATE_FF("cvttts/sum", Rb(instruction), Rc(instruction)); break; // CVTTS/SUM
+ case 0x56f: OPERATE_FF("cvttq/svm", Rb(instruction), Rc(instruction)); break; // CVTTQ/SVM
+ case 0x580: OPERATE_FFF("adds/su", Ra(instruction), Rb(instruction), Rc(instruction)); break; // ADDS/SU
+ case 0x581:
+ if (Ra(instruction) == 31)
+ OPERATE_FF("negs/su", Rb(instruction), Rc(instruction));
+ else
+ OPERATE_FFF("subs/su", Ra(instruction), Rb(instruction), Rc(instruction)); // SUBS/SU
+ break;
+ case 0x582: OPERATE_FFF("muls/su", Ra(instruction), Rb(instruction), Rc(instruction)); break; // MULS/SU
+ case 0x583: OPERATE_FFF("divs/su", Ra(instruction), Rb(instruction), Rc(instruction)); break; // DIVS/SU
+ case 0x5a0: OPERATE_FFF("addt/su", Ra(instruction), Rb(instruction), Rc(instruction)); break; // ADDT/SU
+ case 0x5a1:
+ if (Ra(instruction) == 31)
+ OPERATE_FF("negt/su", Rb(instruction), Rc(instruction));
+ else
+ OPERATE_FFF("subt/su", Ra(instruction), Rb(instruction), Rc(instruction)); // SUBT/SU
+ break;
+ case 0x5a2: OPERATE_FFF("mult/su", Ra(instruction), Rb(instruction), Rc(instruction)); break; // MULT/SU
+ case 0x5a3: OPERATE_FFF("divt/su", Ra(instruction), Rb(instruction), Rc(instruction)); break; // DIVT/SU
+ case 0x5a4: OPERATE_FFF("cmptun/su", Ra(instruction), Rb(instruction), Rc(instruction)); break; // CMPTUN/SU
+ case 0x5a5: OPERATE_FFF("cmpteq/su", Ra(instruction), Rb(instruction), Rc(instruction)); break; // CMPTEQ/SU
+ case 0x5a6: OPERATE_FFF("cmptlt/su", Ra(instruction), Rb(instruction), Rc(instruction)); break; // CMPTLT/SU
+ case 0x5a7: OPERATE_FFF("cmptle/su", Ra(instruction), Rb(instruction), Rc(instruction)); break; // CMPTLE/SU
+ case 0x5ac: OPERATE_FF("cvttts/su", Rb(instruction), Rc(instruction)); break; // CVTTS/SU
+ case 0x5af: OPERATE_FF("cvttq/sv", Rb(instruction), Rc(instruction)); break; // CVTTQ/SV
+ case 0x5c0: OPERATE_FFF("adds/sud", Ra(instruction), Rb(instruction), Rc(instruction)); break; // ADDS/SUD
+ case 0x5c1: OPERATE_FFF("subs/sud", Ra(instruction), Rb(instruction), Rc(instruction)); break; // SUBS/SUD
+ case 0x5c2: OPERATE_FFF("muls/sud", Ra(instruction), Rb(instruction), Rc(instruction)); break; // MULS/SUD
+ case 0x5c3: OPERATE_FFF("divs/sud", Ra(instruction), Rb(instruction), Rc(instruction)); break; // DIVS/SUD
+ case 0x5e0: OPERATE_FFF("addt/sud", Ra(instruction), Rb(instruction), Rc(instruction)); break; // ADDT/SUD
+ case 0x5e1: OPERATE_FFF("subt/sud", Ra(instruction), Rb(instruction), Rc(instruction)); break; // SUBT/SUD
+ case 0x5e2: OPERATE_FFF("mult/sud", Ra(instruction), Rb(instruction), Rc(instruction)); break; // MULT/SUD
+ case 0x5e3: OPERATE_FFF("divt/sud", Ra(instruction), Rb(instruction), Rc(instruction)); break; // DIVT/SUD
+ case 0x5ec: OPERATE_FF("cvttts/sud", Rb(instruction), Rc(instruction)); break; // CVTTS/SUD
+ case 0x5ef: OPERATE_FF("cvttq/svd", Rb(instruction), Rc(instruction)); break; // CVTTQ/SVD
+ case 0x6ac: OPERATE_FF("cvtst/s", Rb(instruction), Rc(instruction)); break; // CVTST/S
+ case 0x700: OPERATE_FFF("adds/suic", Ra(instruction), Rb(instruction), Rc(instruction)); break; // ADDS/SUIC
+ case 0x701: OPERATE_FFF("subs/suic", Ra(instruction), Rb(instruction), Rc(instruction)); break; // SUBS/SUIC
+ case 0x702: OPERATE_FFF("muls/suic", Ra(instruction), Rb(instruction), Rc(instruction)); break; // MULS/SUIC
+ case 0x703: OPERATE_FFF("divs/suic", Ra(instruction), Rb(instruction), Rc(instruction)); break; // DIVS/SUIC
+ case 0x720: OPERATE_FFF("addt/suic", Ra(instruction), Rb(instruction), Rc(instruction)); break; // ADDT/SUIC
+ case 0x721: OPERATE_FFF("subt/suic", Ra(instruction), Rb(instruction), Rc(instruction)); break; // SUBT/SUIC
+ case 0x722: OPERATE_FFF("mult/suic", Ra(instruction), Rb(instruction), Rc(instruction)); break; // MULT/SUIC
+ case 0x723: OPERATE_FFF("divt/suic", Ra(instruction), Rb(instruction), Rc(instruction)); break; // DIVT/SUIC
+ case 0x72c: OPERATE_FF("cvttts/suic", Rb(instruction), Rc(instruction)); break; // CVTTS/SUIC
+ case 0x72f: OPERATE_FF("cvttq/svic", Rb(instruction), Rc(instruction)); break; // CVTTQ/SVIC
+ case 0x73c: OPERATE_FF("cvtqs/suic", Rb(instruction), Rc(instruction)); break; // CVTQS/SUIC
+ case 0x73e: OPERATE_FF("cvtqt/suic", Rb(instruction), Rc(instruction)); break; // CVTQT/SUIC
+ case 0x740: OPERATE_FFF("adds/suim", Ra(instruction), Rb(instruction), Rc(instruction)); break; // ADDS/SUIM
+ case 0x741: OPERATE_FFF("subs/suim", Ra(instruction), Rb(instruction), Rc(instruction)); break; // SUBS/SUIM
+ case 0x742: OPERATE_FFF("muls/suim", Ra(instruction), Rb(instruction), Rc(instruction)); break; // MULS/SUIM
+ case 0x743: OPERATE_FFF("divs/suim", Ra(instruction), Rb(instruction), Rc(instruction)); break; // DIVS/SUIM
+ case 0x760: OPERATE_FFF("addt/suim", Ra(instruction), Rb(instruction), Rc(instruction)); break; // ADDT/SUIM
+ case 0x761: OPERATE_FFF("subt/suim", Ra(instruction), Rb(instruction), Rc(instruction)); break; // SUBT/SUIM
+ case 0x762: OPERATE_FFF("mult/suim", Ra(instruction), Rb(instruction), Rc(instruction)); break; // MULT/SUIM
+ case 0x763: OPERATE_FFF("divt/suim", Ra(instruction), Rb(instruction), Rc(instruction)); break; // DIVT/SUIM
+ case 0x76c: OPERATE_FF("cvttts/suim", Rb(instruction), Rc(instruction)); break; // CVTTS/SUIM
+ case 0x76f: OPERATE_FF("cvttq/svim", Rb(instruction), Rc(instruction)); break; // CVTTQ/SVIM
+ case 0x77c: OPERATE_FF("cvtqs/suim", Rb(instruction), Rc(instruction)); break; // CVTQS/SUIM
+ case 0x77e: OPERATE_FF("cvtqt/suim", Rb(instruction), Rc(instruction)); break; // CVTQT/SUIM
+ case 0x780: OPERATE_FFF("adds/sui", Ra(instruction), Rb(instruction), Rc(instruction)); break; // ADDS/SUI
+ case 0x781:
+ if (Ra(instruction) == 31)
+ OPERATE_FF("negs/sui", Rb(instruction), Rc(instruction));
+ else
+ OPERATE_FFF("subs/sui", Ra(instruction), Rb(instruction), Rc(instruction)); // SUBS/SUI
+ break;
+ case 0x782: OPERATE_FFF("muls/sui", Ra(instruction), Rb(instruction), Rc(instruction)); break; // MULS/SUI
+ case 0x783: OPERATE_FFF("divs/sui", Ra(instruction), Rb(instruction), Rc(instruction)); break; // DIVS/SUI
+ case 0x7a0: OPERATE_FFF("addt/sui", Ra(instruction), Rb(instruction), Rc(instruction)); break; // ADDT/SUI
+ case 0x7a1:
+ if (Ra(instruction) == 31)
+ OPERATE_FF("negt/sui", Rb(instruction), Rc(instruction));
+ else
+ OPERATE_FFF("subt/sui", Ra(instruction), Rb(instruction), Rc(instruction)); // SUBT/SUI
+ break;
+ case 0x7a2: OPERATE_FFF("mult/sui", Ra(instruction), Rb(instruction), Rc(instruction)); break; // MULT/SUI
+ case 0x7a3: OPERATE_FFF("divt/sui", Ra(instruction), Rb(instruction), Rc(instruction)); break; // DIVT/SUI
+ case 0x7ac: OPERATE_FF("cvttts/sui", Rb(instruction), Rc(instruction)); break; // CVTTS/SUI
+ case 0x7af: OPERATE_FF("cvttq/svi", Rb(instruction), Rc(instruction)); break; // CVTTQ/SVI
+ case 0x7bc: OPERATE_FF("cvtqs/sui", Rb(instruction), Rc(instruction)); break; // CVTQS/SUI
+ case 0x7be: OPERATE_FF("cvtqt/sui", Rb(instruction), Rc(instruction)); break; // CVTQT/SUI
+ case 0x7c0: OPERATE_FFF("adds/suid", Ra(instruction), Rb(instruction), Rc(instruction)); break; // ADDS/SUID
+ case 0x7c1: OPERATE_FFF("subs/suid", Ra(instruction), Rb(instruction), Rc(instruction)); break; // SUBS/SUID
+ case 0x7c2: OPERATE_FFF("muls/suid", Ra(instruction), Rb(instruction), Rc(instruction)); break; // MULS/SUID
+ case 0x7c3: OPERATE_FFF("divs/suid", Ra(instruction), Rb(instruction), Rc(instruction)); break; // DIVS/SUID
+ case 0x7e0: OPERATE_FFF("addt/suid", Ra(instruction), Rb(instruction), Rc(instruction)); break; // ADDT/SUID
+ case 0x7e1: OPERATE_FFF("subt/suid", Ra(instruction), Rb(instruction), Rc(instruction)); break; // SUBT/SUID
+ case 0x7e2: OPERATE_FFF("mult/suid", Ra(instruction), Rb(instruction), Rc(instruction)); break; // MULT/SUID
+ case 0x7e3: OPERATE_FFF("divt/suid", Ra(instruction), Rb(instruction), Rc(instruction)); break; // DIVT/SUID
+ case 0x7ec: OPERATE_FF("cvttts/suid", Rb(instruction), Rc(instruction)); break; // CVTTS/SUID
+ case 0x7ef: OPERATE_FF("cvttq/svid", Rb(instruction), Rc(instruction)); break; // CVTTQ/SVID
+ case 0x7fc: OPERATE_FF("cvtqs/suid", Rb(instruction), Rc(instruction)); break; // CVTQS/SUID
+ case 0x7fe: OPERATE_FF("cvtqt/suid", Rb(instruction), Rc(instruction)); break; // CVTQT/SUID
+
+ default: UNKNOWN("flti*"); break;
+ }
+ break;
+ case 0x17: // FLTL* (floating)
+ switch ((instruction >> 5) & 0x7ff)
+ {
+ case 0x010: OPERATE_FF("cvtlq", Rb(instruction), Rc(instruction)); break; // CVTLQ
+ case 0x020:
+ if (Ra(instruction) == 31 && Rb(instruction) == 31 && Rc(instruction) == 31)
+ MISC("fnop");
+ else if (Ra(instruction) == 31 && Rb(instruction) == 31)
+ OPERATE_F("fclr", Rc(instruction));
+ else if (Ra(instruction) == 31)
+ OPERATE_FF("fabs", Rb(instruction), Rc(instruction));
+ else if (Ra(instruction) == Rb(instruction))
+ OPERATE_FF("fmov", Rb(instruction), Rc(instruction));
+ else
+ OPERATE_FFF("cpys", Ra(instruction), Rb(instruction), Rc(instruction)); // CPYS
+ break;
+ case 0x021:
+ if (Ra(instruction) == Rb(instruction))
+ OPERATE_FF("fneg", Rb(instruction), Rc(instruction));
+ else
+ OPERATE_FFF("cpysn", Ra(instruction), Rb(instruction), Rc(instruction)); // CPYSN
+ break;
+ case 0x022: OPERATE_FFF("cpyse", Ra(instruction), Rb(instruction), Rc(instruction)); break; // CPYSE
+ case 0x024:
+ if (Ra(instruction) == Rb(instruction) && Rb(instruction) == Rc(instruction))
+ OPERATE_F("mt_fpcr", Rc(instruction));
+ else
+ OPERATE_FFF("mt_fpcr", Ra(instruction), Rb(instruction), Rc(instruction)); // MT_FPCR
+ break;
+ case 0x025:
+ if (Ra(instruction) == Rb(instruction) && Rb(instruction) == Rc(instruction))
+ OPERATE_F("mf_fpcr", Rc(instruction));
+ else
+ OPERATE_FFF("mf_fpcr", Ra(instruction), Rb(instruction), Rc(instruction)); // MF_FPCR
+ break;
+ case 0x02a: OPERATE_FFF("fcmoveq", Ra(instruction), Rb(instruction), Rc(instruction)); break; // FCMOVEQ
+ case 0x02b: OPERATE_FFF("fcmovne", Ra(instruction), Rb(instruction), Rc(instruction)); break; // FCMOVNE
+ case 0x02c: OPERATE_FFF("fcmovlt", Ra(instruction), Rb(instruction), Rc(instruction)); break; // FCMOVLT
+ case 0x02d: OPERATE_FFF("fcmovge", Ra(instruction), Rb(instruction), Rc(instruction)); break; // FCMOVGE
+ case 0x02e: OPERATE_FFF("fcmovle", Ra(instruction), Rb(instruction), Rc(instruction)); break; // FCMOVLE
+ case 0x02f: OPERATE_FFF("fcmovgt", Ra(instruction), Rb(instruction), Rc(instruction)); break; // FCMOVGT
+ case 0x030: OPERATE_FF("cvtql", Rb(instruction), Rc(instruction)); break; // CVTQL
+ case 0x130: OPERATE_FF("cvtql/v", Rb(instruction), Rc(instruction)); break; // CVTQL/V
+ case 0x530: OPERATE_FF("cvtql/sv", Rb(instruction), Rc(instruction)); break; // CVTQL/SV
+
+ default: UNKNOWN("fltl*"); break;
+ }
+ break;
+ case 0x18: // MISC* (miscellaneous)
+ switch (u16(instruction))
+ {
+ case 0x0000: MISC("trapb"); break; // TRAPB
+ case 0x0400: MISC("excb"); break; // EXCB
+ case 0x4000: MISC("mb"); break; // MB
+ case 0x4400: MISC("wmb"); break; // WMB
+ case 0x8000: MISC_M("fetch", Rb(instruction)); break; // FETCH
+ case 0xa000: MISC_M("fetch_m", Rb(instruction)); break; // FETCH_M
+ case 0xc000: MISC_R("rpcc", Ra(instruction)); break; // RPCC
+ case 0xe000: MISC_R("rc", Ra(instruction)); break; // RC
+ case 0xe800: MISC_M("ecb", Rb(instruction)); break; // ECB
+ case 0xf000: MISC_R("rs", Ra(instruction)); break; // RS
+ case 0xf800: MISC_M("wh64", Rb(instruction)); break; // WH64
+
+ default: UNKNOWN("misc*"); break;
+ }
+ break;
+ case 0x19: // PAL19
+ switch ((instruction >> 5) & 0x7)
+ {
+ case 0x0: MISC("nop"); break;
+ case 0x1: OPERATE_RI("hw_mfpr/i", Rb(instruction), Rc(instruction)); break;
+ case 0x2: OPERATE_RA("hw_mfpr/a", Rb(instruction), Rc(instruction)); break;
+ case 0x3: OPERATE_RAI("hw_mfpr/ai", Rb(instruction), Rc(instruction)); break;
+ case 0x4: OPERATE_RP("hw_mfpr/p", Rb(instruction), Rc(instruction)); break;
+ case 0x5: OPERATE_RPI("hw_mfpr/pi", Rb(instruction), Rc(instruction)); break;
+ case 0x6: OPERATE_RPA("hw_mfpr/pa", Rb(instruction), Rc(instruction)); break;
+ case 0x7: OPERATE_RPAI("hw_mfpr/pai", Rb(instruction), Rc(instruction)); break;
+ }
+ break;
+
+ case 0x1a: // JSR* (jump)
+ switch ((instruction >> 14) & 3)
+ {
+ case 0: JUMP("jmp", Ra(instruction), Rb(instruction)); break; // JMP
+ case 1: JUMP("jsr", Ra(instruction), Rb(instruction)); flags |= STEP_OVER; break; // JSR
+ case 2: JUMP("ret", Ra(instruction), Rb(instruction)); flags |= STEP_OUT; break; // RET
+ case 3: JUMP("jsr_c", Ra(instruction), Rb(instruction)); break; // JSR_COROUTINE
+ }
+ break;
+ case 0x1b: // PAL1B
+ switch ((instruction >> 12) & 0xf)
+ {
+ case 0x0: MEMORY_R("hw_ldl", Ra(instruction), Disp_P(instruction), Rb(instruction)); break;
+ case 0x1: MEMORY_R("hw_ldq", Ra(instruction), Disp_P(instruction), Rb(instruction)); break;
+ case 0x2: MEMORY_R("hw_ldl/r", Ra(instruction), Disp_P(instruction), Rb(instruction)); break;
+ case 0x3: MEMORY_R("hw_ldq/r", Ra(instruction), Disp_P(instruction), Rb(instruction)); break;
+ case 0x4: MEMORY_R("hw_ldl/a", Ra(instruction), Disp_P(instruction), Rb(instruction)); break;
+ case 0x5: MEMORY_R("hw_ldq/a", Ra(instruction), Disp_P(instruction), Rb(instruction)); break;
+ case 0x6: MEMORY_R("hw_ldl/ar", Ra(instruction), Disp_P(instruction), Rb(instruction)); break;
+ case 0x7: MEMORY_R("hw_ldq/ar", Ra(instruction), Disp_P(instruction), Rb(instruction)); break;
+ case 0x8: MEMORY_R("hw_ldl/p", Ra(instruction), Disp_P(instruction), Rb(instruction)); break;
+ case 0x9: MEMORY_R("hw_ldq/p", Ra(instruction), Disp_P(instruction), Rb(instruction)); break;
+ case 0xa: MEMORY_R("hw_ldl/pr", Ra(instruction), Disp_P(instruction), Rb(instruction)); break;
+ case 0xb: MEMORY_R("hw_ldq/pr", Ra(instruction), Disp_P(instruction), Rb(instruction)); break;
+ case 0xc: MEMORY_R("hw_ldl/pa", Ra(instruction), Disp_P(instruction), Rb(instruction)); break;
+ case 0xd: MEMORY_R("hw_ldq/pa", Ra(instruction), Disp_P(instruction), Rb(instruction)); break;
+ case 0xe: MEMORY_R("hw_ldl/par", Ra(instruction), Disp_P(instruction), Rb(instruction)); break;
+ case 0xf: MEMORY_R("hw_ldq/par", Ra(instruction), Disp_P(instruction), Rb(instruction)); break;
+ }
+ break;
+ case 0x1c: // FPTI* (floating to integer)
+ switch ((instruction >> 5) & 0xff)
+ {
+ // register variants
+ case 0x00: OPERATE_RR("sextb", Rb(instruction), Rc(instruction)); break; // SEXTB (BWX)
+ case 0x01: OPERATE_RR("sextw", Rb(instruction), Rc(instruction)); break; // SEXTW (BWX)
+ case 0x30: OPERATE_RR("ctpop", Rb(instruction), Rc(instruction)); break; // CTPOP (CIX)
+ case 0x31: OPERATE_RRR("perr", Ra(instruction), Rb(instruction), Rc(instruction)); break; // PERR (MVI)
+ case 0x32: OPERATE_RR("ctlz", Rb(instruction), Rc(instruction)); break; // CTLZ (CIX)
+ case 0x33: OPERATE_RR("cttz", Rb(instruction), Rc(instruction)); break; // CTTZ (CIX)
+ case 0x34: OPERATE_RR("unpkbw", Rb(instruction), Rc(instruction)); break; // UNPKBW (MVI)
+ case 0x35: OPERATE_RR("unpkbl", Rb(instruction), Rc(instruction)); break; // UNPKBL (MVI)
+ case 0x36: OPERATE_RR("pkwb", Rb(instruction), Rc(instruction)); break; // PKWB (MVI)
+ case 0x37: OPERATE_RR("pklb", Rb(instruction), Rc(instruction)); break; // PKLB (MVI)
+ case 0x38: OPERATE_RRR("minsb8", Ra(instruction), Rb(instruction), Rc(instruction)); break; // MINSB8 (MVI)
+ case 0x39: OPERATE_RRR("minsw4", Ra(instruction), Rb(instruction), Rc(instruction)); break; // MINSW4 (MVI)
+ case 0x3a: OPERATE_RRR("minub8", Ra(instruction), Rb(instruction), Rc(instruction)); break; // MINUB8 (MVI)
+ case 0x3b: OPERATE_RRR("minuw4", Ra(instruction), Rb(instruction), Rc(instruction)); break; // MINUW4 (MVI)
+ case 0x3c: OPERATE_RRR("maxub8", Ra(instruction), Rb(instruction), Rc(instruction)); break; // MAXUB8 (MVI)
+ case 0x3d: OPERATE_RRR("maxuw4", Ra(instruction), Rb(instruction), Rc(instruction)); break; // MAXUW4 (MVI)
+ case 0x3e: OPERATE_RRR("maxsb8", Ra(instruction), Rb(instruction), Rc(instruction)); break; // MAXSB8 (MVI)
+ case 0x3f: OPERATE_RRR("maxsw4", Ra(instruction), Rb(instruction), Rc(instruction)); break; // MAXSW4 (MVI)
+ case 0x70: OPERATE_FR("ftoit", Ra(instruction), Rc(instruction)); break; // FTOIT (FIX)
+ case 0x78: OPERATE_FR("ftois", Ra(instruction), Rc(instruction)); break; // FTOIS (FIX)
+
+ // immediate variants
+ case 0x80: OPERATE_IR("sextb", Im(instruction), Rc(instruction)); break; // SEXTB (BWX)
+ case 0x81: OPERATE_IR("sextw", Im(instruction), Rc(instruction)); break; // SEXTW (BWX)
+ case 0xb8: OPERATE_RIR("minsb8", Ra(instruction), Im(instruction), Rc(instruction)); break; // MINSB8 (MVI)
+ case 0xb9: OPERATE_RIR("minsw4", Ra(instruction), Im(instruction), Rc(instruction)); break; // MINSW4 (MVI)
+ case 0xba: OPERATE_RIR("minub8", Ra(instruction), Im(instruction), Rc(instruction)); break; // MINUB8 (MVI)
+ case 0xbb: OPERATE_RIR("minuw4", Ra(instruction), Im(instruction), Rc(instruction)); break; // MINUW4 (MVI)
+ case 0xbc: OPERATE_RIR("maxub8", Ra(instruction), Im(instruction), Rc(instruction)); break; // MAXUB8 (MVI)
+ case 0xbd: OPERATE_RIR("maxuw4", Ra(instruction), Im(instruction), Rc(instruction)); break; // MAXUW4 (MVI)
+ case 0xbe: OPERATE_RIR("maxsb8", Ra(instruction), Im(instruction), Rc(instruction)); break; // MAXSB8 (MVI)
+ case 0xbf: OPERATE_RIR("maxsw4", Ra(instruction), Im(instruction), Rc(instruction)); break; // MAXSW4 (MVI)
+
+ default: UNKNOWN("fpti*"); break;
+ }
+ break;
+ case 0x1d: // PAL1D
+ switch ((instruction >> 5) & 0x7)
+ {
+ case 0x0: MISC("nop"); break;
+ case 0x1: OPERATE_RI("hw_mtpr/i", Rb(instruction), Rc(instruction)); break;
+ case 0x2: OPERATE_RA("hw_mtpr/a", Rb(instruction), Rc(instruction)); break;
+ case 0x3: OPERATE_RAI("hw_mtpr/ai", Rb(instruction), Rc(instruction)); break;
+ case 0x4: OPERATE_RP("hw_mtpr/p", Rb(instruction), Rc(instruction)); break;
+ case 0x5: OPERATE_RPI("hw_mtpr/pi", Rb(instruction), Rc(instruction)); break;
+ case 0x6: OPERATE_RPA("hw_mtpr/pa", Rb(instruction), Rc(instruction)); break;
+ case 0x7: OPERATE_RPAI("hw_mtpr/pai", Rb(instruction), Rc(instruction)); break;
+ }
+ break;
+ case 0x1e: // PAL1E
+ switch (instruction & 0x03ffffff)
+ {
+ case 0x03ff8000: MISC("hw_rei"); break;
+
+ default: UNKNOWN("pal1e"); break;
+ }
+ break;
+ case 0x1f: // PAL1F
+ switch ((instruction >> 12) & 0xf)
+ {
+ case 0x0: MEMORY_R("hw_stl", Ra(instruction), Disp_P(instruction), Rb(instruction)); break;
+ case 0x1: MEMORY_R("hw_stq", Ra(instruction), Disp_P(instruction), Rb(instruction)); break;
+ case 0x2: MEMORY_R("hw_stl/r", Ra(instruction), Disp_P(instruction), Rb(instruction)); break;
+ case 0x3: MEMORY_R("hw_stq/r", Ra(instruction), Disp_P(instruction), Rb(instruction)); break;
+ case 0x4: MEMORY_R("hw_stl/a", Ra(instruction), Disp_P(instruction), Rb(instruction)); break;
+ case 0x5: MEMORY_R("hw_stq/a", Ra(instruction), Disp_P(instruction), Rb(instruction)); break;
+ case 0x6: MEMORY_R("hw_stl/ar", Ra(instruction), Disp_P(instruction), Rb(instruction)); break;
+ case 0x7: MEMORY_R("hw_stq/ar", Ra(instruction), Disp_P(instruction), Rb(instruction)); break;
+ case 0x8: MEMORY_R("hw_stl/p", Ra(instruction), Disp_P(instruction), Rb(instruction)); break;
+ case 0x9: MEMORY_R("hw_stq/p", Ra(instruction), Disp_P(instruction), Rb(instruction)); break;
+ case 0xa: MEMORY_R("hw_stl/pr", Ra(instruction), Disp_P(instruction), Rb(instruction)); break;
+ case 0xb: MEMORY_R("hw_stq/pr", Ra(instruction), Disp_P(instruction), Rb(instruction)); break;
+ case 0xc: MEMORY_R("hw_stl/pa", Ra(instruction), Disp_P(instruction), Rb(instruction)); break;
+ case 0xd: MEMORY_R("hw_stq/pa", Ra(instruction), Disp_P(instruction), Rb(instruction)); break;
+ case 0xe: MEMORY_R("hw_stl/par", Ra(instruction), Disp_P(instruction), Rb(instruction)); break;
+ case 0xf: MEMORY_R("hw_stq/par", Ra(instruction), Disp_P(instruction), Rb(instruction)); break;
+ }
+ break;
+ // memory format
+ case 0x20: MEMORY_F("ldf", Ra(instruction), Disp_M(instruction), Rb(instruction)); break; // LDF
+ case 0x21: MEMORY_F("ldg", Ra(instruction), Disp_M(instruction), Rb(instruction)); break; // LDG
+ case 0x22: MEMORY_F("lds", Ra(instruction), Disp_M(instruction), Rb(instruction)); break; // LDS
+ case 0x23: MEMORY_F("ldt", Ra(instruction), Disp_M(instruction), Rb(instruction)); break; // LDT
+ case 0x24: MEMORY_F("stf", Ra(instruction), Disp_M(instruction), Rb(instruction)); break; // STF
+ case 0x25: MEMORY_F("stg", Ra(instruction), Disp_M(instruction), Rb(instruction)); break; // STG
+ case 0x26: MEMORY_F("sts", Ra(instruction), Disp_M(instruction), Rb(instruction)); break; // STS
+ case 0x27: MEMORY_F("stt", Ra(instruction), Disp_M(instruction), Rb(instruction)); break; // STT
+ case 0x28: MEMORY_R("ldl", Ra(instruction), Disp_M(instruction), Rb(instruction)); break; // LDL
+ case 0x29: MEMORY_R("ldq", Ra(instruction), Disp_M(instruction), Rb(instruction)); break; // LDQ
+ case 0x2a: MEMORY_R("ldl_l", Ra(instruction), Disp_M(instruction), Rb(instruction)); break; // LDL_L
+ case 0x2b: MEMORY_R("ldq_l", Ra(instruction), Disp_M(instruction), Rb(instruction)); break; // LDQ_L
+ case 0x2c: MEMORY_R("stl", Ra(instruction), Disp_M(instruction), Rb(instruction)); break; // STL
+ case 0x2d: MEMORY_R("stq", Ra(instruction), Disp_M(instruction), Rb(instruction)); break; // STQ
+ case 0x2e: MEMORY_R("stl_c", Ra(instruction), Disp_M(instruction), Rb(instruction)); break; // STL_C
+ case 0x2f: MEMORY_R("stq_c", Ra(instruction), Disp_M(instruction), Rb(instruction)); break; // STQ_C
+
+ // branch format
+ case 0x30:
+ if (Ra(instruction) == 31)
+ BRANCH("br", Disp_B(instruction));
+ else
+ BRANCH_R("br", Ra(instruction), Disp_B(instruction)); // BR
+ break;
+ case 0x31: BRANCH_F("fbeq", Ra(instruction), Disp_B(instruction)); break; // FBEQ
+ case 0x32: BRANCH_F("fblt", Ra(instruction), Disp_B(instruction)); break; // FBLT
+ case 0x33: BRANCH_F("fble", Ra(instruction), Disp_B(instruction)); break; // FBLE
+ case 0x34: BRANCH_R("bsr", Ra(instruction), Disp_B(instruction)); break; // BSR
+ case 0x35: BRANCH_F("fbne", Ra(instruction), Disp_B(instruction)); break; // FBNE
+ case 0x36: BRANCH_F("fbge", Ra(instruction), Disp_B(instruction)); break; // FBGE
+ case 0x37: BRANCH_F("fbgt", Ra(instruction), Disp_B(instruction)); break; // FBGT
+ case 0x38: BRANCH_R("blbc", Ra(instruction), Disp_B(instruction)); break; // BLBC
+ case 0x39: BRANCH_R("beq", Ra(instruction), Disp_B(instruction)); break; // BEQ
+ case 0x3a: BRANCH_R("blt", Ra(instruction), Disp_B(instruction)); break; // BLT
+ case 0x3b: BRANCH_R("ble", Ra(instruction), Disp_B(instruction)); break; // BLE
+ case 0x3c: BRANCH_R("blbs", Ra(instruction), Disp_B(instruction)); break; // BLBS
+ case 0x3d: BRANCH_R("bne", Ra(instruction), Disp_B(instruction)); break; // BNE
+ case 0x3e: BRANCH_R("bge", Ra(instruction), Disp_B(instruction)); break; // BGE
+ case 0x3f: BRANCH_R("bgt", Ra(instruction), Disp_B(instruction)); break; // BGT
+ }
+
+ return bytes | flags;
+}
diff --git a/src/devices/cpu/alpha/alphad.h b/src/devices/cpu/alpha/alphad.h
new file mode 100644
index 00000000000..3c3475e5730
--- /dev/null
+++ b/src/devices/cpu/alpha/alphad.h
@@ -0,0 +1,40 @@
+// license:BSD-3-Clause
+// copyright-holders:Patrick Mackinlay
+
+#ifndef MAME_CPU_ALPHA_ALPHAD_H
+#define MAME_CPU_ALPHA_ALPHAD_H
+
+#pragma once
+
+class alpha_disassembler : public util::disasm_interface
+{
+public:
+ enum dasm_type : unsigned
+ {
+ TYPE_UNKNOWN = 0,
+ TYPE_NT = 1,
+ TYPE_UNIX = 2,
+ TYPE_VMS = 3,
+ };
+
+ alpha_disassembler(alpha_disassembler::dasm_type type = TYPE_UNKNOWN)
+ : m_dasm_type(type)
+ {
+ };
+ virtual ~alpha_disassembler() = default;
+
+ virtual u32 opcode_alignment() const override { return 4; };
+ virtual offs_t disassemble(std::ostream &stream, offs_t pc, const data_buffer &opcodes, const data_buffer &params) override;
+
+private:
+ static char const *const R[];
+ static char const *const F[];
+
+ static char const *const PT[];
+ static char const *const ABX[];
+ static char const *const IBX[];
+
+ dasm_type const m_dasm_type;
+};
+
+#endif // MAME_CPU_ALPHA_ALPHAD_H
diff --git a/src/devices/cpu/alpha/common.h b/src/devices/cpu/alpha/common.h
new file mode 100644
index 00000000000..0c9668f304a
--- /dev/null
+++ b/src/devices/cpu/alpha/common.h
@@ -0,0 +1,19 @@
+// license:BSD-3-Clause
+// copyright-holders:Patrick Mackinlay
+
+#ifndef MAME_CPU_ALPHA_COMMON_H
+#define MAME_CPU_ALPHA_COMMON_H
+
+#pragma once
+
+// instruction field extraction
+#define Ra(x) ((x >> 21) & 31) // 'a' register field
+#define Rb(x) ((x >> 16) & 31) // 'b' register field
+#define Rc(x) (x & 31) // 'c' register field
+#define Im(x) (u64(u8(x >> 13))) // literal immediate field
+
+#define Disp_M(x) (s64(s16(x))) // memory instruction 16-bit signed offset
+#define Disp_P(x) (s64(s16(x << 4)) >> 4) // hardware load/store 12-bit signed offset
+#define Disp_B(x) (s64(s32(x << 11)) >> 9) // branch instruction offset
+
+#endif // MAME_CPU_ALPHA_COMMON_H
diff --git a/src/devices/cpu/alto2/a2ether.cpp b/src/devices/cpu/alto2/a2ether.cpp
index 7af15ffbad0..2c1a3d56a89 100644
--- a/src/devices/cpu/alto2/a2ether.cpp
+++ b/src/devices/cpu/alto2/a2ether.cpp
@@ -522,7 +522,7 @@ void alto2_cpu_device::rx_breath_of_life(void* ptr, int32_t arg)
m_eth.rx_timer->adjust(attotime::from_seconds(m_eth.breath_of_life), 0);
} else {
// receive at a rate of 5.44us per word
- m_eth.rx_timer->adjust(attotime::from_usec(5.44), arg);
+ m_eth.rx_timer->adjust(attotime::from_nsec(5440), arg);
}
eth_wakeup();
}
@@ -557,10 +557,10 @@ void alto2_cpu_device::tx_packet(void* ptr, int32_t arg)
// the FIFO is empty now: clear the OBUSY and WLF flip flops
PUT_ETH_OBUSY(m_eth.status, 0);
PUT_ETH_WLF(m_eth.status, 0);
- m_eth.tx_timer->adjust(attotime::from_usec(5.44), -1);
+ m_eth.tx_timer->adjust(attotime::from_nsec(5440), -1);
} else {
// transmit the next word after 5.44us
- m_eth.tx_timer->adjust(attotime::from_usec(5.44), arg + 1);
+ m_eth.tx_timer->adjust(attotime::from_nsec(5440), arg + 1);
}
eth_wakeup();
}
@@ -722,7 +722,7 @@ void alto2_cpu_device::f2_late_eodfct()
uint8_t a49 = m_ether_a49[16 * m_eth.fifo_wr + m_eth.fifo_rd];
if (0 == BF(a49)) {
m_task_wakeup &= ~(1 << task_ether);
- m_eth.tx_timer->adjust(attotime::from_usec(5.44), 0);
+ m_eth.tx_timer->adjust(attotime::from_nsec(5440), 0);
}
}
@@ -774,7 +774,7 @@ void alto2_cpu_device::f2_late_eefct()
PUT_ETH_OBUSY(m_eth.status, 1);
PUT_ETH_OEOT(m_eth.status, 1);
// end transmitting the packet
- m_eth.tx_timer->adjust(attotime::from_usec(5.44), -1);
+ m_eth.tx_timer->adjust(attotime::from_nsec(5440), -1);
eth_wakeup();
}
diff --git a/src/devices/cpu/amis2000/amis2000.h b/src/devices/cpu/amis2000/amis2000.h
index 2739461b44b..58665c7f6bc 100644
--- a/src/devices/cpu/amis2000/amis2000.h
+++ b/src/devices/cpu/amis2000/amis2000.h
@@ -30,12 +30,13 @@ public:
// S2000 has a hardcoded 7seg table, that (unlike S2200) is officially
// uncustomizable, but wildfire proves to be an exception to that rule.
- void set_7seg_table(const u8 *ptr) { m_7seg_table = ptr; }
+ void set_7seg_table(const u8 *ptr) { m_7seg_table = ptr; } // d0=A, d1=B, etc.
void data_64x4(address_map &map);
void data_80x4(address_map &map);
void program_1_5k(address_map &map);
void program_1k(address_map &map);
+
protected:
// construction/destruction
amis2000_base_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock, u8 bu_bits, u8 callstack_bits, u8 callstack_depth, int prgwidth, address_map_constructor program, int datawidth, address_map_constructor data)
diff --git a/src/devices/cpu/amis2000/amis2000op.cpp b/src/devices/cpu/amis2000/amis2000op.cpp
index e67ee6d153b..92c2eaae3dc 100644
--- a/src/devices/cpu/amis2000/amis2000op.cpp
+++ b/src/devices/cpu/amis2000/amis2000op.cpp
@@ -220,11 +220,13 @@ void amis2000_base_device::op_disn()
// DISN: set D-latch to ACC+carry via on-die segment decoder
static const u8 lut_segment_decoder[0x10] =
{
- // 0-F digits in bit order [DP]abcdefg
- 0x7e, 0x30, 0x6d, 0x79, 0x33, 0x5b, 0x5f, 0x70, 0x7f, 0x7b, 0x77, 0x1f, 0x4e, 0x3d, 0x4f, 0x47
+ 0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, // 0-7
+ 0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71 // 8-F
};
- const u8 *ptr = (m_7seg_table != nullptr) ? m_7seg_table : lut_segment_decoder;
- m_d = ptr[m_acc] | (m_carry ? 0x80 : 0x00);
+ const u8 *lut = (m_7seg_table != nullptr) ? m_7seg_table : lut_segment_decoder;
+
+ // segments are in order [DP]abcdefg
+ m_d = bitswap<7>(lut[m_acc],0,1,2,3,4,5,6) | (m_carry ? 0x80 : 0x00);
d_latch_out(true);
}
@@ -500,7 +502,6 @@ void amis2000_base_device::op_rf2()
}
-
// AMI S2152 specific handlers
void amis2152_cpu_device::d2f_timer_clock()
diff --git a/src/devices/cpu/arm7/lpc210x.cpp b/src/devices/cpu/arm7/lpc210x.cpp
index 19f21ea7b00..d2964589e01 100644
--- a/src/devices/cpu/arm7/lpc210x.cpp
+++ b/src/devices/cpu/arm7/lpc210x.cpp
@@ -2,7 +2,7 @@
// copyright-holders:David Haywood
/***************************************************************************
- NXP (Phillips) LPC2103 series
+ NXP (Philips) LPC2103 series
covering LPC2101, LPC2102, LPC2103*
*currently only LPC2103
@@ -276,5 +276,6 @@ void lpc210x_device::write_timer(address_space &space, int timer, int offset, ui
-MACHINE_CONFIG_START(lpc210x_device::device_add_mconfig)
-MACHINE_CONFIG_END
+void lpc210x_device::device_add_mconfig(machine_config &config)
+{
+}
diff --git a/src/devices/cpu/cosmac/cosmac.cpp b/src/devices/cpu/cosmac/cosmac.cpp
index 0a7bd554d93..e4155a514c7 100644
--- a/src/devices/cpu/cosmac/cosmac.cpp
+++ b/src/devices/cpu/cosmac/cosmac.cpp
@@ -733,10 +733,12 @@ inline void cosmac_device::run_state()
case cosmac_state::STATE_2_DMA_IN:
dma_input();
+ debug();
break;
case cosmac_state::STATE_2_DMA_OUT:
dma_output();
+ debug();
break;
case cosmac_state::STATE_3_INT:
diff --git a/src/devices/cpu/dspp/dspp.h b/src/devices/cpu/dspp/dspp.h
index 9ebf08f6f6e..302d141db13 100644
--- a/src/devices/cpu/dspp/dspp.h
+++ b/src/devices/cpu/dspp/dspp.h
@@ -67,10 +67,10 @@ public:
DECLARE_READ16_MEMBER( noise_r );
void update_fifo_dma();
- void print_sums() { printf("%04x: %04x\n", (uint16_t)m_core->m_arg0, (uint16_t)m_core->m_arg1); }
- void print_branches() { printf("Branch: %d %d %d %d %d\n", m_core->m_arg0 ? 1 : 0, m_core->m_arg1 ? 1 : 0, m_core->m_arg2 ? 1 : 0, m_core->m_arg3 ? 1 : 0, m_core->m_arg4 ? 1 : 0); }
- void print_value() { printf("Value is %08x\n", m_core->m_arg0); }
- void print_addr() { printf("New value is %08x from %08x\n", m_core->m_arg0, m_core->m_arg1); }
+ void print_sums() { printf("%04x: %04x\n", (uint16_t)m_core->m_arg0, (uint16_t)m_core->m_arg1); }
+ void print_branches() { printf("Branch: %d %d %d %d %d\n", m_core->m_arg0 ? 1 : 0, m_core->m_arg1 ? 1 : 0, m_core->m_arg2 ? 1 : 0, m_core->m_arg3 ? 1 : 0, m_core->m_arg4 ? 1 : 0); }
+ void print_value() { printf("Value is %08x\n", m_core->m_arg0); }
+ void print_addr() { printf("New value is %08x from %08x\n", m_core->m_arg0, m_core->m_arg1); }
protected:
// device-level overrides
@@ -232,10 +232,10 @@ private:
const char *m_format;
uint32_t m_arg0;
- uint32_t m_arg1;
- uint32_t m_arg2;
- uint32_t m_arg3;
- uint32_t m_arg4;
+ uint32_t m_arg1;
+ uint32_t m_arg2;
+ uint32_t m_arg3;
+ uint32_t m_arg4;
struct
{
@@ -316,7 +316,7 @@ private:
uint32_t cycles; /* accumulated cycles */
uint8_t checkints; /* need to check interrupts before next instruction */
uint8_t checksoftints; /* need to check software interrupts before next instruction */
- uml::code_label abortlabel; /* label to abort execution of this block */
+ uml::code_label abortlabel; /* label to abort execution of this block */
uml::code_label labelnum; /* index for local labels */
};
diff --git a/src/devices/cpu/dspp/dsppdrc.cpp b/src/devices/cpu/dspp/dsppdrc.cpp
index aefa9b9999c..68b0c3cb741 100644
--- a/src/devices/cpu/dspp/dsppdrc.cpp
+++ b/src/devices/cpu/dspp/dsppdrc.cpp
@@ -22,7 +22,7 @@ using namespace uml;
// map variables
#define MAPVAR_PC M0
-#define MAPVAR_CYCLES M1
+#define MAPVAR_CYCLES M1
// exit codes
#define EXECUTE_OUT_OF_CYCLES 0
@@ -244,12 +244,12 @@ void dspp_device::compile_block(offs_t pc)
if (seqhead->flags & OPFLAG_IS_BRANCH_TARGET)
UML_LABEL(block, seqhead->pc | 0x80000000); // label seqhead->pc
- compiler.abortlabel = compiler.labelnum++;
+ compiler.abortlabel = compiler.labelnum++;
/* iterate over instructions in the sequence and compile them */
for (curdesc = seqhead; curdesc != seqlast->next(); curdesc = curdesc->next())
generate_sequence_instruction(block, &compiler, curdesc);
- UML_LABEL(block, compiler.abortlabel);
+ UML_LABEL(block, compiler.abortlabel);
/* if we need to return to the start, do it */
if (seqlast->flags & OPFLAG_RETURN_TO_START)
@@ -293,11 +293,11 @@ void dspp_device::generate_checksum_block(drcuml_block &block, compiler_state *c
uint32_t sum = seqhead->opptr.w[0];
uint32_t addr = seqhead->physpc;
const void *base = m_codeptr(addr);
- UML_MOV(block, I0, 0);
+ UML_MOV(block, I0, 0);
UML_LOAD(block, I0, base, 0, SIZE_WORD, SCALE_x2); // load i0,base,0,word
- UML_CMP(block, I0, sum); // cmp i0,opptr[0]
- UML_EXHc(block, COND_NE, *m_nocode, seqhead->pc); // exne nocode,seqhead->pc
+ UML_CMP(block, I0, sum); // cmp i0,opptr[0]
+ UML_EXHc(block, COND_NE, *m_nocode, seqhead->pc); // exne nocode,seqhead->pc
}
}
@@ -307,7 +307,7 @@ void dspp_device::generate_checksum_block(drcuml_block &block, compiler_state *c
uint32_t sum = 0;
uint32_t addr = seqhead->physpc;
const void *base = m_codeptr(addr);
- UML_LOAD(block, I0, base, 0, SIZE_WORD, SCALE_x2); // load i0,base,0,dword
+ UML_LOAD(block, I0, base, 0, SIZE_WORD, SCALE_x2); // load i0,base,0,dword
sum += seqhead->opptr.w[0];
for (curdesc = seqhead->next(); curdesc != seqlast->next(); curdesc = curdesc->next())
if (!(curdesc->flags & OPFLAG_VIRTUAL_NOOP))
@@ -315,12 +315,12 @@ void dspp_device::generate_checksum_block(drcuml_block &block, compiler_state *c
addr = curdesc->physpc;
base = m_codeptr(addr);
assert(base != nullptr);
- UML_LOAD(block, I1, base, 0, SIZE_WORD, SCALE_x2); // load i1,base,dword
- UML_ADD(block, I0, I0, I1); // add i0,i0,i1
+ UML_LOAD(block, I1, base, 0, SIZE_WORD, SCALE_x2); // load i1,base,dword
+ UML_ADD(block, I0, I0, I1); // add i0,i0,i1
sum += curdesc->opptr.w[0];
}
- UML_CMP(block, I0, sum); // cmp i0,sum
- UML_EXHc(block, COND_NE, *m_nocode, epc(seqhead)); // exne nocode,seqhead->pc
+ UML_CMP(block, I0, sum); // cmp i0,sum
+ UML_EXHc(block, COND_NE, *m_nocode, epc(seqhead)); // exne nocode,seqhead->pc
}
}
@@ -373,12 +373,12 @@ void dspp_device::static_generate_nocode_handler()
/* generate a hash jump via the current mode and PC */
alloc_handle(m_drcuml.get(), &m_nocode, "nocode");
- UML_HANDLE(block, *m_nocode); // handle nocode
- UML_GETEXP(block, I0); // getexp i0
+ UML_HANDLE(block, *m_nocode); // handle nocode
+ UML_GETEXP(block, I0); // getexp i0
- UML_MOV(block, mem(&m_core->m_pc), I0); // mov [pc],i0
- //save_fast_iregs(block); // <save fastregs>
- UML_EXIT(block, EXECUTE_MISSING_CODE); // exit EXECUTE_MISSING_CODE
+ UML_MOV(block, mem(&m_core->m_pc), I0); // mov [pc],i0
+ //save_fast_iregs(block); // <save fastregs>
+ UML_EXIT(block, EXECUTE_MISSING_CODE); // exit EXECUTE_MISSING_CODE
block.end();
}
@@ -390,11 +390,11 @@ void dspp_device::static_generate_out_of_cycles()
/* generate a hash jump via the current mode and PC */
alloc_handle(m_drcuml.get(), &m_out_of_cycles, "out_of_cycles");
- UML_HANDLE(block, *m_out_of_cycles); // handle out_of_cycles
- UML_GETEXP(block, I0); // getexp i0
- UML_MOV(block, mem(&m_core->m_pc), I0); // mov <pc>,i0
- //save_fast_iregs(block); // <save fastregs>
- UML_EXIT(block, EXECUTE_OUT_OF_CYCLES); // exit EXECUTE_OUT_OF_CYCLES
+ UML_HANDLE(block, *m_out_of_cycles); // handle out_of_cycles
+ UML_GETEXP(block, I0); // getexp i0
+ UML_MOV(block, mem(&m_core->m_pc), I0); // mov <pc>,i0
+ //save_fast_iregs(block); // <save fastregs>
+ UML_EXIT(block, EXECUTE_OUT_OF_CYCLES); // exit EXECUTE_OUT_OF_CYCLES
block.end();
}
@@ -402,28 +402,28 @@ void dspp_device::static_generate_out_of_cycles()
void dspp_device::generate_sequence_instruction(drcuml_block &block, compiler_state *compiler, const opcode_desc *desc)
{
/* set the PC map variable */
- UML_MAPVAR(block, MAPVAR_PC, desc->pc); // mapvar PC,desc->pc
+ UML_MAPVAR(block, MAPVAR_PC, desc->pc); // mapvar PC,desc->pc
/* accumulate total cycles */
compiler->cycles += desc->cycles;
/* update the icount map variable */
- UML_MAPVAR(block, MAPVAR_CYCLES, compiler->cycles); // mapvar CYCLES,compiler->cycles
+ UML_MAPVAR(block, MAPVAR_CYCLES, compiler->cycles); // mapvar CYCLES,compiler->cycles
/* if we are debugging, call the debugger */
if ((machine().debug_flags & DEBUG_FLAG_ENABLED) != 0)
{
- UML_MOV(block, mem(&m_core->m_pc), desc->pc); // mov [pc],desc->pc
- //save_fast_iregs(block); // <save fastregs>
- UML_DEBUG(block, desc->pc); // debug desc->pc
+ UML_MOV(block, mem(&m_core->m_pc), desc->pc); // mov [pc],desc->pc
+ //save_fast_iregs(block); // <save fastregs>
+ UML_DEBUG(block, desc->pc); // debug desc->pc
}
/* if we hit an unmapped address, fatal error */
if (desc->flags & OPFLAG_COMPILER_UNMAPPED)
{
- UML_MOV(block, mem(&m_core->m_pc), desc->pc); // mov [pc],desc->pc
- save_fast_iregs(block); // <save fastregs>
- UML_EXIT(block, EXECUTE_UNMAPPED_CODE); // exit EXECUTE_UNMAPPED_CODE
+ UML_MOV(block, mem(&m_core->m_pc), desc->pc); // mov [pc],desc->pc
+ save_fast_iregs(block); // <save fastregs>
+ UML_EXIT(block, EXECUTE_UNMAPPED_CODE); // exit EXECUTE_UNMAPPED_CODE
}
/* unless this is a virtual no-op, it's a regular instruction */
@@ -438,9 +438,9 @@ void dspp_device::generate_update_cycles(drcuml_block &block, compiler_state *co
/* account for cycles */
if (compiler->cycles > 0)
{
- UML_SUB(block, mem(&m_core->m_icount), mem(&m_core->m_icount), MAPVAR_CYCLES); // sub icount,icount,cycles
- UML_MAPVAR(block, MAPVAR_CYCLES, 0); // mapvar cycles,0
- UML_EXHc(block, COND_S, *m_out_of_cycles, param); // exh out_of_cycles,nextpc
+ UML_SUB(block, mem(&m_core->m_icount), mem(&m_core->m_icount), MAPVAR_CYCLES); // sub icount,icount,cycles
+ UML_MAPVAR(block, MAPVAR_CYCLES, 0); // mapvar cycles,0
+ UML_EXHc(block, COND_S, *m_out_of_cycles, param); // exh out_of_cycles,nextpc
}
compiler->cycles = 0;
}
@@ -458,8 +458,8 @@ void dspp_device::generate_opcode(drcuml_block &block, compiler_state *compiler,
code_label skip = compiler->labelnum++;
UML_TEST(block, mem(&m_core->m_dspx_control), DSPX_CONTROL_GWILLING);
UML_JMPc(block, COND_Z, compiler->abortlabel);
- //UML_TEST(block, mem(&m_core->m_flag_sleep), 1);
- //UML_JMPc(block, COND_NZ, compiler->abortlabel);
+ //UML_TEST(block, mem(&m_core->m_flag_sleep), 1);
+ //UML_JMPc(block, COND_NZ, compiler->abortlabel);
//UML_MOV(block, mem(&m_core->m_arg0), desc->physpc);
//UML_MOV(block, mem(&m_core->m_arg1), op);
@@ -522,7 +522,7 @@ void dspp_device::generate_super_special(drcuml_block &block, compiler_state *co
{
if (m_drcuml.get()->logging())
block.append_comment("BAC");
- UML_SHR(block, mem(&m_core->m_jmpdest), mem(&m_core->m_acc), 4); // m_core->m_pc = m_core->m_acc >> 4;
+ UML_SHR(block, mem(&m_core->m_jmpdest), mem(&m_core->m_acc), 4); // m_core->m_pc = m_core->m_acc >> 4;
generate_branch(block, compiler, desc);
break;
}
@@ -549,8 +549,8 @@ void dspp_device::generate_super_special(drcuml_block &block, compiler_state *co
// TODO: How does sleep work?
if (m_drcuml.get()->logging())
block.append_comment("SLEEP");
- UML_SUB(block, mem(&m_core->m_pc), mem(&m_core->m_pc), 1); // --m_core->m_pc;
- UML_MOV(block, mem(&m_core->m_flag_sleep), 1); // m_core->m_flag_sleep = 1;
+ UML_SUB(block, mem(&m_core->m_pc), mem(&m_core->m_pc), 1); // --m_core->m_pc;
+ UML_MOV(block, mem(&m_core->m_flag_sleep), 1); // m_core->m_flag_sleep = 1;
break;
}
@@ -609,7 +609,7 @@ void dspp_device::generate_special_opcode(drcuml_block &block, compiler_state *c
// Indirect
if (regdi & 0x0010)
{
- UML_CALLH(block, *m_dm_read16); // addr = read_data(addr);
+ UML_CALLH(block, *m_dm_read16); // addr = read_data(addr);
UML_MOV(block, I2, I0);
}
else
@@ -621,7 +621,7 @@ void dspp_device::generate_special_opcode(drcuml_block &block, compiler_state *c
generate_read_next_operand(block, compiler, desc);
UML_MOV(block, I0, I1);
UML_MOV(block, I1, I2);
- UML_CALLH(block, *m_dm_write16); // write_data(addr, read_next_operand());
+ UML_CALLH(block, *m_dm_write16); // write_data(addr, read_next_operand());
break;
}
case 5: // RBASE
@@ -639,7 +639,7 @@ void dspp_device::generate_special_opcode(drcuml_block &block, compiler_state *c
generate_read_next_operand(block, compiler, desc);
UML_MOV(block, I0, I1);
UML_MOV(block, I1, op & 0x3ff);
- UML_CALLH(block, *m_dm_write16); // write_data(op & 0x3ff, read_next_operand());
+ UML_CALLH(block, *m_dm_write16); // write_data(op & 0x3ff, read_next_operand());
break;
}
case 7: // MOVEI
@@ -648,12 +648,12 @@ void dspp_device::generate_special_opcode(drcuml_block &block, compiler_state *c
block.append_comment("MOVEI");
generate_parse_operands(block, compiler, desc, 1);
UML_MOV(block, I1, op & 0x3ff);
- UML_CALLH(block, *m_dm_read16); // uint32_t addr = read_data(op & 0x3ff);
+ UML_CALLH(block, *m_dm_read16); // uint32_t addr = read_data(op & 0x3ff);
UML_MOV(block, I2, I1);
generate_read_next_operand(block, compiler, desc);
UML_MOV(block, I0, I1);
UML_MOV(block, I1, I2);
- UML_CALLH(block, *m_dm_write16); // write_data(addr, read_next_operand());
+ UML_CALLH(block, *m_dm_write16); // write_data(addr, read_next_operand());
break;
}
@@ -669,23 +669,23 @@ void dspp_device::generate_branch(drcuml_block &block, compiler_state *compiler,
/* update the cycles and jump through the hash table to the target */
if (desc->targetpc != BRANCH_TARGET_DYNAMIC)
{
- generate_update_cycles(block, &compiler_temp, desc->targetpc); // <subtract cycles>
+ generate_update_cycles(block, &compiler_temp, desc->targetpc); // <subtract cycles>
if (desc->flags & OPFLAG_INTRABLOCK_BRANCH)
- UML_JMP(block, desc->targetpc | 0x80000000); // jmp desc->targetpc | 0x80000000
+ UML_JMP(block, desc->targetpc | 0x80000000); // jmp desc->targetpc | 0x80000000
else
- UML_HASHJMP(block, 0, desc->targetpc, *m_nocode); // hashjmp <mode>,desc->targetpc,nocode
+ UML_HASHJMP(block, 0, desc->targetpc, *m_nocode); // hashjmp <mode>,desc->targetpc,nocode
}
else
{
- generate_update_cycles(block, &compiler_temp, uml::mem(&m_core->m_jmpdest)); // <subtract cycles>
- UML_HASHJMP(block, 0, mem(&m_core->m_jmpdest), *m_nocode); // hashjmp <mode>,<rsreg>,nocode
+ generate_update_cycles(block, &compiler_temp, uml::mem(&m_core->m_jmpdest)); // <subtract cycles>
+ UML_HASHJMP(block, 0, mem(&m_core->m_jmpdest), *m_nocode); // hashjmp <mode>,<rsreg>,nocode
}
/* update the label */
compiler->labelnum = compiler_temp.labelnum;
/* reset the mapvar to the current cycles */
- UML_MAPVAR(block, MAPVAR_CYCLES, compiler->cycles); // mapvar CYCLES,compiler.cycles
+ UML_MAPVAR(block, MAPVAR_CYCLES, compiler->cycles); // mapvar CYCLES,compiler.cycles
}
void dspp_device::generate_branch_opcode(drcuml_block &block, compiler_state *compiler, const opcode_desc *desc)
@@ -718,10 +718,10 @@ void dspp_device::generate_branch_opcode(drcuml_block &block, compiler_state *co
UML_OR(block, I0, I0, mask0);
UML_OR(block, I1, I1, mask1);
- UML_AND(block, I0, I0, I1); // bool branch = (flag0 || mask0) && (flag1 || mask1);
+ UML_AND(block, I0, I0, I1); // bool branch = (flag0 || mask0) && (flag1 || mask1);
- if (mode == 2) // if (mode == 2)
- UML_SUB(block, I0, 1, I0); // branch = !branch;
+ if (mode == 2) // if (mode == 2)
+ UML_SUB(block, I0, 1, I0); // branch = !branch;
//UML_MOV(block, mem(&m_core->m_arg0), I0);
//UML_MOV(block, mem(&m_core->m_arg2), 1-mask0);
@@ -729,9 +729,9 @@ void dspp_device::generate_branch_opcode(drcuml_block &block, compiler_state *co
//UML_CALLC(block, cfunc_print_branches, this);
code_label skip = compiler->labelnum++;
- UML_TEST(block, I0, 1); // if (branch)
+ UML_TEST(block, I0, 1); // if (branch)
UML_JMPc(block, COND_Z, skip);
- UML_MOV(block, mem(&m_core->m_jmpdest), op & 0x3ff); // m_core->m_pc = op & 0x3ff;
+ UML_MOV(block, mem(&m_core->m_jmpdest), op & 0x3ff); // m_core->m_pc = op & 0x3ff;
generate_branch(block, compiler, desc);
UML_LABEL(block, skip);
}
@@ -745,19 +745,19 @@ void dspp_device::generate_complex_branch_opcode(drcuml_block &block, compiler_s
case 0: // BLT
if (m_drcuml.get()->logging())
block.append_comment("BLT");
- UML_XOR(block, I0, mem(&m_core->m_flag_neg), mem(&m_core->m_flag_over)); // branch = (n && !v) || (!n && v);
+ UML_XOR(block, I0, mem(&m_core->m_flag_neg), mem(&m_core->m_flag_over)); // branch = (n && !v) || (!n && v);
break;
case 1: // BLE
if (m_drcuml.get()->logging())
block.append_comment("BLE");
UML_XOR(block, I0, mem(&m_core->m_flag_neg), mem(&m_core->m_flag_over));
- UML_OR(block, I0, I0, mem(&m_core->m_flag_zero)); // branch = ((n && !v) || (!n && v)) || z;
+ UML_OR(block, I0, I0, mem(&m_core->m_flag_zero)); // branch = ((n && !v) || (!n && v)) || z;
break;
case 2: // BGE
if (m_drcuml.get()->logging())
block.append_comment("BGE");
UML_XOR(block, I0, mem(&m_core->m_flag_neg), mem(&m_core->m_flag_over));
- UML_SUB(block, I0, 1, I0); // branch = ((n && v) || (!n && !v));
+ UML_SUB(block, I0, 1, I0); // branch = ((n && v) || (!n && !v));
break;
case 3: // BGT
if (m_drcuml.get()->logging())
@@ -765,36 +765,36 @@ void dspp_device::generate_complex_branch_opcode(drcuml_block &block, compiler_s
UML_AND(block, I0, mem(&m_core->m_flag_neg), mem(&m_core->m_flag_over));
UML_SUB(block, I0, 1, I0);
UML_SUB(block, I1, 1, mem(&m_core->m_flag_zero));
- UML_AND(block, I0, I0, I1); // branch = ((n && v) || (!n && !v)) && !z;
+ UML_AND(block, I0, I0, I1); // branch = ((n && v) || (!n && !v)) && !z;
break;
case 4: // BHI
if (m_drcuml.get()->logging())
block.append_comment("BHI");
UML_SUB(block, I0, 1, mem(&m_core->m_flag_zero));
- UML_AND(block, I0, I0, mem(&m_core->m_flag_carry)); // branch = c && !z;
+ UML_AND(block, I0, I0, mem(&m_core->m_flag_carry)); // branch = c && !z;
break;
case 5: // BLS
if (m_drcuml.get()->logging())
block.append_comment("BLS");
UML_SUB(block, I0, 1, mem(&m_core->m_flag_carry));
- UML_OR(block, I0, I0, mem(&m_core->m_flag_zero)); // branch = !c || z;
+ UML_OR(block, I0, I0, mem(&m_core->m_flag_zero)); // branch = !c || z;
break;
case 6: // BXS
if (m_drcuml.get()->logging())
block.append_comment("BXS");
- UML_MOV(block, I0, mem(&m_core->m_flag_exact)); // branch = x;
+ UML_MOV(block, I0, mem(&m_core->m_flag_exact)); // branch = x;
break;
case 7: // BXC
if (m_drcuml.get()->logging())
block.append_comment("BXC");
- UML_SUB(block, I0, 1, mem(&m_core->m_flag_exact)); // branch = !x;
+ UML_SUB(block, I0, 1, mem(&m_core->m_flag_exact)); // branch = !x;
break;
}
code_label skip = compiler->labelnum++;
- UML_TEST(block, I0, 1); // if (branch)
+ UML_TEST(block, I0, 1); // if (branch)
UML_JMPc(block, COND_Z, skip);
- UML_MOV(block, mem(&m_core->m_jmpdest), op & 0x3ff); // m_core->m_pc = op & 0x3ff;
+ UML_MOV(block, mem(&m_core->m_jmpdest), op & 0x3ff); // m_core->m_pc = op & 0x3ff;
generate_branch(block, compiler, desc);
UML_LABEL(block, skip);
}
@@ -941,8 +941,8 @@ void dspp_device::generate_read_next_operand(drcuml_block &block, compiler_state
UML_LOAD(block, I0, (void *)&m_core->m_operands[0].value, mem(&m_core->m_opidx), SIZE_DWORD, SCALE_x8);
//if (op == 0x46a0)
//{
- // UML_MOV(block, mem(&m_core->m_arg0), I0);
- // UML_CALLC(block, cfunc_print_value, this);
+ // UML_MOV(block, mem(&m_core->m_arg0), I0);
+ // UML_CALLC(block, cfunc_print_value, this);
//}
UML_TEST(block, I0, 0x80000000U);
@@ -950,13 +950,13 @@ void dspp_device::generate_read_next_operand(drcuml_block &block, compiler_state
UML_LOAD(block, I1, (void *)&m_core->m_operands[0].addr, mem(&m_core->m_opidx), SIZE_DWORD, SCALE_x8);
//if (op == 0x46a0)
//{
- // UML_MOV(block, mem(&m_core->m_arg1), I1);
+ // UML_MOV(block, mem(&m_core->m_arg1), I1);
//}
UML_CALLH(block, *m_dm_read16);
//if (op == 0x46a0)
//{
- // UML_MOV(block, mem(&m_core->m_arg0), I0);
- // UML_CALLC(block, cfunc_print_addr, this);
+ // UML_MOV(block, mem(&m_core->m_arg0), I0);
+ // UML_CALLC(block, cfunc_print_addr, this);
//}
UML_LABEL(block, no_load);
@@ -1071,16 +1071,16 @@ void dspp_device::generate_arithmetic_opcode(drcuml_block &block, compiler_state
if (m_drcuml.get()->logging())
block.append_comment("_TRA");
UML_MOV(block, I0, I2); // alu_res = alu_a;
- UML_MOV(block, mem(&m_core->m_flag_over), 0); // m_core->m_flag_over = 0;
- UML_MOV(block, mem(&m_core->m_flag_carry), 0); // m_core->m_flag_carry = 0;
+ UML_MOV(block, mem(&m_core->m_flag_over), 0); // m_core->m_flag_over = 0;
+ UML_MOV(block, mem(&m_core->m_flag_carry), 0); // m_core->m_flag_carry = 0;
break;
case 1: // _NEG
if (m_drcuml.get()->logging())
block.append_comment("_NEG");
UML_SUB(block, I0, 0, I3); // alu_res = -alu_b;
- UML_MOV(block, mem(&m_core->m_flag_over), 0); // m_core->m_flag_over = 0;
- UML_MOV(block, mem(&m_core->m_flag_carry), 0); // m_core->m_flag_carry = 0;
+ UML_MOV(block, mem(&m_core->m_flag_over), 0); // m_core->m_flag_over = 0;
+ UML_MOV(block, mem(&m_core->m_flag_carry), 0); // m_core->m_flag_carry = 0;
break;
case 2: // _+
@@ -1092,175 +1092,175 @@ void dspp_device::generate_arithmetic_opcode(drcuml_block &block, compiler_state
UML_XOR(block, I3, I2, I3);
UML_TEST(block, I3, 0x80000);
- UML_JMPc(block, COND_NZ, skip_over); // if ((alu_a & 0x80000) == (alu_b & 0x80000) &&
+ UML_JMPc(block, COND_NZ, skip_over); // if ((alu_a & 0x80000) == (alu_b & 0x80000) &&
UML_XOR(block, I3, I2, I0);
- UML_TEST(block, I3, 0x80000); // (alu_a & 0x80000) != (alu_res & 0x80000))
- UML_MOVc(block, COND_NZ, mem(&m_core->m_flag_over), 1); // m_core->m_flag_over = 1;
+ UML_TEST(block, I3, 0x80000); // (alu_a & 0x80000) != (alu_res & 0x80000))
+ UML_MOVc(block, COND_NZ, mem(&m_core->m_flag_over), 1); // m_core->m_flag_over = 1;
UML_LABEL(block, skip_over);
- UML_TEST(block, I0, 0x00100000); // if (alu_res & 0x00100000)
- UML_MOVc(block, COND_NZ, mem(&m_core->m_flag_carry), 1); // m_core->m_flag_carry = 1;
+ UML_TEST(block, I0, 0x00100000); // if (alu_res & 0x00100000)
+ UML_MOVc(block, COND_NZ, mem(&m_core->m_flag_carry), 1); // m_core->m_flag_carry = 1;
// else
- UML_MOVc(block, COND_Z, mem(&m_core->m_flag_carry), 0); // m_core->m_flag_carry = 0;
+ UML_MOVc(block, COND_Z, mem(&m_core->m_flag_carry), 0); // m_core->m_flag_carry = 0;
break;
case 3: // _+C
if (m_drcuml.get()->logging())
block.append_comment("_+C");
UML_SHL(block, I3, mem(&m_core->m_flag_carry), 4);
- UML_ADD(block, I0, I2, I3); // alu_res = alu_a + (m_core->m_flag_carry << 4);
+ UML_ADD(block, I0, I2, I3); // alu_res = alu_a + (m_core->m_flag_carry << 4);
- UML_MOV(block, mem(&m_core->m_flag_over), 0); // m_core->m_flag_over = 0;
+ UML_MOV(block, mem(&m_core->m_flag_over), 0); // m_core->m_flag_over = 0;
- UML_TEST(block, I0, 0x00100000); // if (alu_res & 0x00100000)
- UML_MOVc(block, COND_NZ, mem(&m_core->m_flag_carry), 1); // m_core->m_flag_carry = 1;
+ UML_TEST(block, I0, 0x00100000); // if (alu_res & 0x00100000)
+ UML_MOVc(block, COND_NZ, mem(&m_core->m_flag_carry), 1); // m_core->m_flag_carry = 1;
// else
- UML_MOVc(block, COND_Z, mem(&m_core->m_flag_carry), 0); // m_core->m_flag_carry = 0;
+ UML_MOVc(block, COND_Z, mem(&m_core->m_flag_carry), 0); // m_core->m_flag_carry = 0;
break;
case 4: // _-
if (m_drcuml.get()->logging())
block.append_comment("_-");
- UML_SUB(block, I0, I2, I3); // alu_res = alu_a - alu_b;
+ UML_SUB(block, I0, I2, I3); // alu_res = alu_a - alu_b;
UML_MOV(block, mem(&m_core->m_flag_over), 0);
UML_XOR(block, I3, I3, 0xffffffffU);
UML_XOR(block, I3, I2, I3);
UML_TEST(block, I3, 0x80000);
- UML_JMPc(block, COND_NZ, skip_over); // if ((alu_a & 0x80000) == (~alu_b & 0x80000) &&
+ UML_JMPc(block, COND_NZ, skip_over); // if ((alu_a & 0x80000) == (~alu_b & 0x80000) &&
UML_XOR(block, I3, I2, I0);
- UML_TEST(block, I3, 0x80000); // (alu_a & 0x80000) != (alu_res & 0x80000))
- UML_MOVc(block, COND_NZ, mem(&m_core->m_flag_over), 1); // m_core->m_flag_over = 1;
+ UML_TEST(block, I3, 0x80000); // (alu_a & 0x80000) != (alu_res & 0x80000))
+ UML_MOVc(block, COND_NZ, mem(&m_core->m_flag_over), 1); // m_core->m_flag_over = 1;
UML_LABEL(block, skip_over);
- UML_TEST(block, I0, 0x00100000); // if (alu_res & 0x00100000)
- UML_MOVc(block, COND_NZ, mem(&m_core->m_flag_carry), 1); // m_core->m_flag_carry = 1;
+ UML_TEST(block, I0, 0x00100000); // if (alu_res & 0x00100000)
+ UML_MOVc(block, COND_NZ, mem(&m_core->m_flag_carry), 1); // m_core->m_flag_carry = 1;
// else
- UML_MOVc(block, COND_Z, mem(&m_core->m_flag_carry), 0); // m_core->m_flag_carry = 0;
+ UML_MOVc(block, COND_Z, mem(&m_core->m_flag_carry), 0); // m_core->m_flag_carry = 0;
break;
case 5: // _-B
if (m_drcuml.get()->logging())
block.append_comment("_-B");
UML_SHL(block, I3, mem(&m_core->m_flag_carry), 4);
- UML_SUB(block, I0, I2, I3); // alu_res = alu_a - (m_core->m_flag_carry << 4);
+ UML_SUB(block, I0, I2, I3); // alu_res = alu_a - (m_core->m_flag_carry << 4);
- UML_MOV(block, mem(&m_core->m_flag_over), 0); // m_core->m_flag_over = 0;
+ UML_MOV(block, mem(&m_core->m_flag_over), 0); // m_core->m_flag_over = 0;
- UML_TEST(block, I0, 0x00100000); // if (alu_res & 0x00100000)
- UML_MOVc(block, COND_NZ, mem(&m_core->m_flag_carry), 1); // m_core->m_flag_carry = 1;
+ UML_TEST(block, I0, 0x00100000); // if (alu_res & 0x00100000)
+ UML_MOVc(block, COND_NZ, mem(&m_core->m_flag_carry), 1); // m_core->m_flag_carry = 1;
// else
- UML_MOVc(block, COND_Z, mem(&m_core->m_flag_carry), 0); // m_core->m_flag_carry = 0;
+ UML_MOVc(block, COND_Z, mem(&m_core->m_flag_carry), 0); // m_core->m_flag_carry = 0;
break;
case 6: // _++
if (m_drcuml.get()->logging())
block.append_comment("_++");
- UML_ADD(block, I0, I2, 1); // alu_res = alu_a + 1;
+ UML_ADD(block, I0, I2, 1); // alu_res = alu_a + 1;
UML_XOR(block, I3, I2, 0x80000);
UML_AND(block, I3, I3, I0);
UML_TEST(block, I3, 0x80000);
UML_MOVc(block, COND_NZ, mem(&m_core->m_flag_over), 1);
- UML_MOVc(block, COND_Z, mem(&m_core->m_flag_over), 0); // m_core->m_flag_over = !(alu_a & 0x80000) && (alu_res & 0x80000);
+ UML_MOVc(block, COND_Z, mem(&m_core->m_flag_over), 0); // m_core->m_flag_over = !(alu_a & 0x80000) && (alu_res & 0x80000);
- UML_MOV(block, mem(&m_core->m_flag_carry), 0); // m_core->m_flag_carry = 0;
+ UML_MOV(block, mem(&m_core->m_flag_carry), 0); // m_core->m_flag_carry = 0;
break;
case 7: // _--
if (m_drcuml.get()->logging())
block.append_comment("_--");
- UML_SUB(block, I0, I2, 1); // alu_res = alu_a - 1;
+ UML_SUB(block, I0, I2, 1); // alu_res = alu_a - 1;
UML_XOR(block, I3, I0, 0x80000);
UML_AND(block, I3, I3, I2);
UML_TEST(block, I3, 0x80000);
UML_MOVc(block, COND_NZ, mem(&m_core->m_flag_over), 1);
- UML_MOVc(block, COND_Z, mem(&m_core->m_flag_over), 0); // m_core->m_flag_over = (alu_a & 0x80000) && !(alu_res & 0x80000);
+ UML_MOVc(block, COND_Z, mem(&m_core->m_flag_over), 0); // m_core->m_flag_over = (alu_a & 0x80000) && !(alu_res & 0x80000);
- UML_MOV(block, mem(&m_core->m_flag_carry), 0); // m_core->m_flag_carry = 0;
+ UML_MOV(block, mem(&m_core->m_flag_carry), 0); // m_core->m_flag_carry = 0;
break;
case 8: // _TRL
if (m_drcuml.get()->logging())
block.append_comment("_TRL");
- UML_MOV(block, I0, I2); // alu_res = alu_a;
- UML_MOV(block, mem(&m_core->m_flag_over), 0); // m_core->m_flag_over = 0;
- UML_MOV(block, mem(&m_core->m_flag_carry), 0); // m_core->m_flag_carry = 0;
+ UML_MOV(block, I0, I2); // alu_res = alu_a;
+ UML_MOV(block, mem(&m_core->m_flag_over), 0); // m_core->m_flag_over = 0;
+ UML_MOV(block, mem(&m_core->m_flag_carry), 0); // m_core->m_flag_carry = 0;
break;
case 9: // _NOT
if (m_drcuml.get()->logging())
block.append_comment("_NOT");
- UML_XOR(block, I0, I2, 0xffffffff); // alu_res = ~alu_a;
- UML_MOV(block, mem(&m_core->m_flag_over), 0); // m_core->m_flag_over = 0;
- UML_MOV(block, mem(&m_core->m_flag_carry), 0); // m_core->m_flag_carry = 0;
+ UML_XOR(block, I0, I2, 0xffffffff); // alu_res = ~alu_a;
+ UML_MOV(block, mem(&m_core->m_flag_over), 0); // m_core->m_flag_over = 0;
+ UML_MOV(block, mem(&m_core->m_flag_carry), 0); // m_core->m_flag_carry = 0;
break;
case 10: // _AND
if (m_drcuml.get()->logging())
block.append_comment("_AND");
- UML_AND(block, I0, I2, I3); // alu_res = alu_a & alu_b;
- UML_MOV(block, mem(&m_core->m_flag_over), 0); // m_core->m_flag_over = 0;
- UML_MOV(block, mem(&m_core->m_flag_carry), 0); // m_core->m_flag_carry = 0;
+ UML_AND(block, I0, I2, I3); // alu_res = alu_a & alu_b;
+ UML_MOV(block, mem(&m_core->m_flag_over), 0); // m_core->m_flag_over = 0;
+ UML_MOV(block, mem(&m_core->m_flag_carry), 0); // m_core->m_flag_carry = 0;
break;
case 11: // _NAND
if (m_drcuml.get()->logging())
block.append_comment("_NAND");
UML_AND(block, I0, I2, I3);
- UML_XOR(block, I0, I0, 0xffffffff); // alu_res = ~(alu_a & alu_b);
- UML_MOV(block, mem(&m_core->m_flag_over), 0); // m_core->m_flag_over = 0;
- UML_MOV(block, mem(&m_core->m_flag_carry), 0); // m_core->m_flag_carry = 0;
+ UML_XOR(block, I0, I0, 0xffffffff); // alu_res = ~(alu_a & alu_b);
+ UML_MOV(block, mem(&m_core->m_flag_over), 0); // m_core->m_flag_over = 0;
+ UML_MOV(block, mem(&m_core->m_flag_carry), 0); // m_core->m_flag_carry = 0;
break;
case 12: // _OR
if (m_drcuml.get()->logging())
block.append_comment("_OR");
- UML_OR(block, I0, I2, I3); // alu_res = alu_a | alu_b;
- UML_MOV(block, mem(&m_core->m_flag_over), 0); // m_core->m_flag_over = 0;
- UML_MOV(block, mem(&m_core->m_flag_carry), 0); // m_core->m_flag_carry = 0;
+ UML_OR(block, I0, I2, I3); // alu_res = alu_a | alu_b;
+ UML_MOV(block, mem(&m_core->m_flag_over), 0); // m_core->m_flag_over = 0;
+ UML_MOV(block, mem(&m_core->m_flag_carry), 0); // m_core->m_flag_carry = 0;
break;
case 13: // _NOR
if (m_drcuml.get()->logging())
block.append_comment("_NOR");
UML_OR(block, I0, I2, I3);
- UML_XOR(block, I0, I0, 0xffffffff); // alu_res = ~(alu_a | alu_b);
- UML_MOV(block, mem(&m_core->m_flag_over), 0); // m_core->m_flag_over = 0;
- UML_MOV(block, mem(&m_core->m_flag_carry), 0); // m_core->m_flag_carry = 0;
+ UML_XOR(block, I0, I0, 0xffffffff); // alu_res = ~(alu_a | alu_b);
+ UML_MOV(block, mem(&m_core->m_flag_over), 0); // m_core->m_flag_over = 0;
+ UML_MOV(block, mem(&m_core->m_flag_carry), 0); // m_core->m_flag_carry = 0;
break;
case 14: // _XOR
if (m_drcuml.get()->logging())
block.append_comment("_XOR");
- UML_XOR(block, I0, I2, I3); // alu_res = alu_a ^ alu_b;
- UML_MOV(block, mem(&m_core->m_flag_over), 0); // m_core->m_flag_over = 0;
- UML_MOV(block, mem(&m_core->m_flag_carry), 0); // m_core->m_flag_carry = 0;
+ UML_XOR(block, I0, I2, I3); // alu_res = alu_a ^ alu_b;
+ UML_MOV(block, mem(&m_core->m_flag_over), 0); // m_core->m_flag_over = 0;
+ UML_MOV(block, mem(&m_core->m_flag_carry), 0); // m_core->m_flag_carry = 0;
break;
case 15: // _XNOR
if (m_drcuml.get()->logging())
block.append_comment("_XNOR");
UML_XOR(block, I0, I2, I3);
- UML_XOR(block, I0, I0, 0xffffffff); // alu_res = ~(alu_a ^ alu_b);
- UML_MOV(block, mem(&m_core->m_flag_over), 0); // m_core->m_flag_over = 0;
- UML_MOV(block, mem(&m_core->m_flag_carry), 0); // m_core->m_flag_carry = 0;
+ UML_XOR(block, I0, I0, 0xffffffff); // alu_res = ~(alu_a ^ alu_b);
+ UML_MOV(block, mem(&m_core->m_flag_over), 0); // m_core->m_flag_over = 0;
+ UML_MOV(block, mem(&m_core->m_flag_carry), 0); // m_core->m_flag_carry = 0;
break;
}
UML_TEST(block, I0, 0x00080000);
UML_MOVc(block, COND_NZ, mem(&m_core->m_flag_neg), 1);
- UML_MOVc(block, COND_Z, mem(&m_core->m_flag_neg), 0); // m_core->m_flag_neg = (alu_res & 0x00080000) != 0;
+ UML_MOVc(block, COND_Z, mem(&m_core->m_flag_neg), 0); // m_core->m_flag_neg = (alu_res & 0x00080000) != 0;
UML_TEST(block, I0, 0x000ffff0);
UML_MOVc(block, COND_Z, mem(&m_core->m_flag_zero), 1);
- UML_MOVc(block, COND_NZ, mem(&m_core->m_flag_zero), 0); // m_core->m_flag_zero = (alu_res & 0x000ffff0) == 0;
+ UML_MOVc(block, COND_NZ, mem(&m_core->m_flag_zero), 0); // m_core->m_flag_zero = (alu_res & 0x000ffff0) == 0;
UML_TEST(block, I0, 0x0000000f);
UML_MOVc(block, COND_Z, mem(&m_core->m_flag_exact), 1);
- UML_MOVc(block, COND_NZ, mem(&m_core->m_flag_exact), 0); // m_core->m_flag_exact = (alu_res & 0x0000000f) == 0;
+ UML_MOVc(block, COND_NZ, mem(&m_core->m_flag_exact), 0); // m_core->m_flag_exact = (alu_res & 0x0000000f) == 0;
// ALU_RES = I3
UML_MOV(block, I3, I0);
@@ -1269,9 +1269,9 @@ void dspp_device::generate_arithmetic_opcode(drcuml_block &block, compiler_state
static const int32_t shifts[8] = { 0, 1, 2, 3, 4, 5, 8, 16 };
if (barrel_code == 8)
- generate_read_next_operand(block, compiler, desc); // I0 = barrel_code;
+ generate_read_next_operand(block, compiler, desc); // I0 = barrel_code;
else
- UML_MOV(block, I0, barrel_code); // I0 = barrel_code;
+ UML_MOV(block, I0, barrel_code); // I0 = barrel_code;
code_label left_shift = compiler->labelnum++;
code_label done_shift = compiler->labelnum++;
@@ -1279,57 +1279,57 @@ void dspp_device::generate_arithmetic_opcode(drcuml_block &block, compiler_state
code_label no_clip = compiler->labelnum++;
code_label no_writeback = compiler->labelnum++;
code_label done = compiler->labelnum++;
- UML_TEST(block, I0, 8); // if (barrel_code & 8)
- UML_JMPc(block, COND_Z, left_shift); // {
+ UML_TEST(block, I0, 8); // if (barrel_code & 8)
+ UML_JMPc(block, COND_Z, left_shift); // {
UML_XOR(block, I0, I0, 0xffffffffU);
UML_ADD(block, I0, I0, 1);
UML_AND(block, I0, I0, 7);
- UML_LOAD(block, I0, (void *)shifts, I0, SIZE_DWORD, SCALE_x8); // uint32_t shift = shifts[(~barrel_code + 1) & 7];
- if (alu_op < 8) // if (alu_op < 8)
- { // {
+ UML_LOAD(block, I0, (void *)shifts, I0, SIZE_DWORD, SCALE_x8); // uint32_t shift = shifts[(~barrel_code + 1) & 7];
+ if (alu_op < 8) // if (alu_op < 8)
+ { // {
UML_SHL(block, I3, I3, 12);
- UML_SAR(block, I3, I3, 12); // // Arithmetic
- UML_SAR(block, mem(&m_core->m_acc), I3, I0); // m_core->m_acc = sign_extend20(alu_res) >> shift;
- } // }
- else // else
- { // {
- UML_AND(block, I3, I3, 0x000fffff); // // Logical
- UML_SHR(block, mem(&m_core->m_acc), I3, I0); // m_core->m_acc = (alu_res & 0xfffff) >> shift;
- } // }
- UML_JMP(block, done_shift); // }
- UML_LABEL(block, left_shift); // else
+ UML_SAR(block, I3, I3, 12); // // Arithmetic
+ UML_SAR(block, mem(&m_core->m_acc), I3, I0); // m_core->m_acc = sign_extend20(alu_res) >> shift;
+ } // }
+ else // else
+ { // {
+ UML_AND(block, I3, I3, 0x000fffff); // // Logical
+ UML_SHR(block, mem(&m_core->m_acc), I3, I0); // m_core->m_acc = (alu_res & 0xfffff) >> shift;
+ } // }
+ UML_JMP(block, done_shift); // }
+ UML_LABEL(block, left_shift); // else
// {
- UML_LOAD(block, I0, (void *)shifts, I0, SIZE_DWORD, SCALE_x8); // uint32_t shift = shifts[barrel_code];
- UML_CMP(block, I0, 16); // if (shift != 16)
- UML_JMPc(block, COND_E, no_shift); // {
+ UML_LOAD(block, I0, (void *)shifts, I0, SIZE_DWORD, SCALE_x8); // uint32_t shift = shifts[barrel_code];
+ UML_CMP(block, I0, 16); // if (shift != 16)
+ UML_JMPc(block, COND_E, no_shift); // {
UML_SHL(block, I3, I3, 12);
UML_SAR(block, I3, I3, 12);
- UML_SHL(block, mem(&m_core->m_acc), I3, I0); // m_core->m_acc = sign_extend20(alu_res) << shift;
- UML_JMP(block, done_shift); // }
+ UML_SHL(block, mem(&m_core->m_acc), I3, I0); // m_core->m_acc = sign_extend20(alu_res) << shift;
+ UML_JMP(block, done_shift); // }
// else
- UML_LABEL(block, no_shift); // {
- UML_TEST(block, mem(&m_core->m_flag_over), 1); // // Clip and saturate
- UML_JMPc(block, COND_Z, no_clip); // if (m_core->m_flag_over)
+ UML_LABEL(block, no_shift); // {
+ UML_TEST(block, mem(&m_core->m_flag_over), 1); // // Clip and saturate
+ UML_JMPc(block, COND_Z, no_clip); // if (m_core->m_flag_over)
UML_TEST(block, mem(&m_core->m_flag_neg), 1);
- UML_MOVc(block, COND_NZ, mem(&m_core->m_acc), 0x7ffff); // m_core->m_acc = m_core->m_flag_neg ? 0x7ffff : 0xfff80000;
+ UML_MOVc(block, COND_NZ, mem(&m_core->m_acc), 0x7ffff); // m_core->m_acc = m_core->m_flag_neg ? 0x7ffff : 0xfff80000;
UML_MOVc(block, COND_Z, mem(&m_core->m_acc), 0xfff80000);
- UML_JMP(block, done_shift); // else
+ UML_JMP(block, done_shift); // else
UML_LABEL(block, no_clip);
- UML_SHL(block, I3, I3, 12); // sign_extend20(alu_res);
- UML_SAR(block, mem(&m_core->m_acc), I3, 12); // }
- UML_LABEL(block, done_shift); // }
+ UML_SHL(block, I3, I3, 12); // sign_extend20(alu_res);
+ UML_SAR(block, mem(&m_core->m_acc), I3, 12); // }
+ UML_LABEL(block, done_shift); // }
- UML_CMP(block, mem(&m_core->m_writeback), 0); // if (m_core->m_writeback >= 0)
- UML_JMPc(block, COND_L, no_writeback); // {
+ UML_CMP(block, mem(&m_core->m_writeback), 0); // if (m_core->m_writeback >= 0)
+ UML_JMPc(block, COND_L, no_writeback); // {
UML_SHR(block, I0, mem(&m_core->m_acc), 4);
UML_MOV(block, I1, mem(&m_core->m_writeback));
- UML_CALLH(block, *m_dm_write16); // write_data(m_core->m_writeback, m_core->m_acc >> 4);
- UML_MOV(block, mem(&m_core->m_writeback), 0xffffffffU); // m_core->m_writeback = -1;
- UML_JMP(block, done); // }
+ UML_CALLH(block, *m_dm_write16); // write_data(m_core->m_writeback, m_core->m_acc >> 4);
+ UML_MOV(block, mem(&m_core->m_writeback), 0xffffffffU); // m_core->m_writeback = -1;
+ UML_JMP(block, done); // }
UML_LABEL(block, no_writeback);
- UML_CMP(block, mem(&m_core->m_opidx), numops); // else if (m_core->m_opidx < numops)
- UML_JMPc(block, COND_GE, done); // {
- generate_write_next_operand(block, compiler); // write_next_operand(m_core->m_acc >> 4);
- UML_LABEL(block, done); // }
+ UML_CMP(block, mem(&m_core->m_opidx), numops); // else if (m_core->m_opidx < numops)
+ UML_JMPc(block, COND_GE, done); // {
+ generate_write_next_operand(block, compiler); // write_next_operand(m_core->m_acc >> 4);
+ UML_LABEL(block, done); // }
}
diff --git a/src/devices/cpu/e132xs/e132xs.h b/src/devices/cpu/e132xs/e132xs.h
index ff5e9cb9bdb..335aeab8898 100644
--- a/src/devices/cpu/e132xs/e132xs.h
+++ b/src/devices/cpu/e132xs/e132xs.h
@@ -439,8 +439,6 @@ private:
uint32_t m_drcoptions;
uint8_t m_cache_dirty;
- uml::parameter m_regmap[16];
-
uml::code_handle *m_entry;
uml::code_handle *m_nocode;
uml::code_handle *m_interrupt_checks;
diff --git a/src/devices/cpu/f8/f8.cpp b/src/devices/cpu/f8/f8.cpp
index e0f86369a06..ce09d9ca835 100644
--- a/src/devices/cpu/f8/f8.cpp
+++ b/src/devices/cpu/f8/f8.cpp
@@ -7,6 +7,11 @@
* This work is based on Frank Palazzolo's F8 emulation in a standalone
* Fairchild Channel F emulator and the 'Fairchild F3850 CPU' data sheets.
*
+ * TODO:
+ * - ROMC signals are supposed to be handled externally
+ *
+ *****************************************************************************
+ *
* The 3850 CPU itself does not include the address bus, pointer registers
* or an interrupt controller. Those functions are provided by at least one
* of the following devices:
@@ -14,7 +19,9 @@
* - 3851 Program Storage Unit (PSU)
* - 3852 Dynamic Memory Interface (DMI)
* - 3853 Static Memory Interface (SMI)
+ * - 3854 Direct Memory Access Controller (DMAC)
* - 3856 Program Storage Unit (PSU)
+ * - 38T56 Program Storage Unit (PSU)
* - 3861 Peripheral Input/Output (PIO)
* - 3871 Peripheral Input/Output (PIO)
*
@@ -28,6 +35,12 @@
* devices responding to the same DC0 address and attempting to place their
* bytes on the data bus simultaneously!
*
+ * Combined packages:
+ * - 3859 = 3850 + 3851
+ * - 3870 = 3850 + 38T56
+ * - 3872 = 3870 + extra 2KB ROM
+ * - 3873 = 3870 + extra 64 bytes executable RAM
+ *
*****************************************************************************/
#include "emu.h"
@@ -37,11 +50,11 @@
/* status flags */
-static constexpr u8 S = 0x01;
-static constexpr u8 C = 0x02;
-static constexpr u8 Z = 0x04;
-static constexpr u8 O = 0x08;
-static constexpr u8 I = 0x10;
+static constexpr u8 S = 0x01; // sign
+static constexpr u8 C = 0x02; // carry
+static constexpr u8 Z = 0x04; // zero
+static constexpr u8 O = 0x08; // overflow
+static constexpr u8 I = 0x10; // interrupt control bit (ICB)
/* cycle (short/long) */
static constexpr int cS = 4;
@@ -51,21 +64,11 @@ static constexpr int cL = 6;
DEFINE_DEVICE_TYPE(F8, f8_cpu_device, "f8", "Fairchild F8")
-f8_cpu_device::f8_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
- : cpu_device(mconfig, F8, tag, owner, clock)
- , m_program_config("program", ENDIANNESS_BIG, 8, 16, 0)
- , m_io_config("io", ENDIANNESS_BIG, 8, 8, 0)
- , m_pc0(0)
- , m_pc1(0)
- , m_dc0(0)
- , m_dc1(0)
- , m_a(0)
- , m_w(0)
- , m_is(0)
- , m_debug_pc(0)
-{
- memset(m_r, 0x00, sizeof(m_r));
-}
+f8_cpu_device::f8_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock) :
+ cpu_device(mconfig, F8, tag, owner, clock),
+ m_program_config("program", ENDIANNESS_BIG, 8, 16, 0),
+ m_io_config("io", ENDIANNESS_BIG, 8, 8, 0)
+{ }
device_memory_interface::space_config_vector f8_cpu_device::memory_space_config() const
{
@@ -101,6 +104,22 @@ void f8_cpu_device::device_start()
m_cache = m_program->cache<0, 0, ENDIANNESS_BIG>();
m_iospace = &space(AS_IO);
+ // zerofill
+ m_debug_pc = 0;
+ m_pc0 = 0;
+ m_pc1 = 0;
+ m_dc0 = 0;
+ m_dc1 = 0;
+ m_a = 0;
+ m_w = 0;
+ m_is = 0;
+ m_dbus = 0;
+ m_io = 0;
+ m_irq_vector = 0;
+ memset(m_r, 0, sizeof(m_r));
+ m_irq_request = 0;
+
+ // register for savestates
save_item(NAME(m_debug_pc));
save_item(NAME(m_pc0));
save_item(NAME(m_pc1));
@@ -115,6 +134,7 @@ void f8_cpu_device::device_start()
save_item(NAME(m_irq_request));
save_item(NAME(m_r));
+ // register for debugger
state_add( F8_PC0, "PC0", m_pc0).formatstr("%04X");
state_add( F8_PC1, "PC1", m_pc1).formatstr("%04X");
state_add( F8_DC0, "DC0", m_dc0).formatstr("%04X");
@@ -196,55 +216,18 @@ void f8_cpu_device::device_start()
void f8_cpu_device::device_reset()
{
- m_debug_pc = 0;
- m_pc0 = 0;
- m_pc1 = 0;
- m_dc0 = 0;
- m_dc1 = 0;
- m_a = 0;
- m_w = 0;
- m_is = 0;
- m_dbus = 0;
- m_io = 0;
- m_irq_vector = 0;
- memset(m_r, 0, sizeof(m_r));
- m_irq_request = 0;
-
- m_w&=~I;
-
- /* save PC0 to PC1 and reset PC0 */
+ // save PC0 to PC1 and reset PC0, and clear ICB
ROMC_08();
- /* fetch the first opcode */
- ROMC_00(cS);
-
- /* initialize the timer shift register
- * this is an 8 bit polynomial counter which can be loaded parallel
- * with 0xff the outputs never change and thus the timer is disabled.
- * with 0xfe the shifter starts cycling through 255 states until it
- * reaches 0xfe again (and then issues an interrupt).
- * the counter output values are not sequential, but go like this:
- * 0xfe, 0xfd, 0xfb, 0xf7, 0xee, 0xdc ... etc. :-)
- * We have to build a lookup table to tell how many cycles a write
+ m_w &= ~I;
- */
- u8 data = 0xfe; /* initial value */
- for (int i = 0; i < 256; i++)
- {
- timer_shifter[i] = data;
- if ( (((data >> 3) ^ (data >> 4)) ^ ((data >> 5) ^ (data >> 7))) & 1 )
- {
- data <<= 1;
- }
- else
- {
- data = (data << 1) | 1;
- }
- }
+ // fetch the first opcode
+ ROMC_00(cS);
}
void f8_cpu_device::execute_set_input( int inptnum, int state )
{
+ assert (inptnum == F8_INPUT_LINE_INT_REQ);
m_irq_request = state;
}
@@ -516,7 +499,7 @@ void f8_cpu_device::ROMC_10()
/*
* Inhibit any modification to the interrupt priority logic.
*/
- m_w |= 0x20; /* ???? */
+ // TODO
m_icount -= cL;
}
@@ -1002,7 +985,7 @@ void f8_cpu_device::f8_pop()
void f8_cpu_device::f8_lr_w_j()
{
ROMC_1C(cS);
- m_w = m_r[9];
+ m_w = m_r[9] & 0x1f;
}
/***************************************************
@@ -1331,9 +1314,9 @@ void f8_cpu_device::f8_bt(int e)
{
ROMC_1C(cS);
if (m_w & e)
- ROMC_01(); /* take the relative branch */
+ ROMC_01(); // take the relative branch
else
- ROMC_03(cS); /* just read the argument on the data bus */
+ ROMC_03(cS); // just read the argument on the data bus
}
/***************************************************
@@ -1412,7 +1395,7 @@ void f8_cpu_device::f8_cm()
void f8_cpu_device::f8_adc()
{
m_dbus = m_a;
- ROMC_0A(); /* add data bus value to DC0 */
+ ROMC_0A(); // add data bus value to DC0
}
/***************************************************
@@ -1422,9 +1405,9 @@ void f8_cpu_device::f8_adc()
void f8_cpu_device::f8_br7()
{
if ((m_is & 7) == 7)
- ROMC_03(cS); /* just read the argument on the data bus */
+ ROMC_03(cS); // just read the argument on the data bus
else
- ROMC_01(); /* take the relative branch */
+ ROMC_01(); // take the relative branch
}
/***************************************************
@@ -1435,9 +1418,9 @@ void f8_cpu_device::f8_bf(int t)
{
ROMC_1C(cS);
if (m_w & t)
- ROMC_03(cS); /* just read the argument on the data bus */
+ ROMC_03(cS); // just read the argument on the data bus
else
- ROMC_01(); /* take the relative branch */
+ ROMC_01(); // take the relative branch
}
/***************************************************
@@ -1669,7 +1652,10 @@ void f8_cpu_device::f8_ns_isar_d()
}
-/* Execute cycles - returns number of cycles actually run */
+/***************************************************
+ * Execute cycles
+ ***************************************************/
+
void f8_cpu_device::execute_run()
{
do
@@ -1679,305 +1665,307 @@ void f8_cpu_device::execute_run()
m_debug_pc = (m_pc0 - 1) & 0xffff;
debugger_instruction_hook(m_debug_pc);
- switch( op )
+ switch (op)
{
- /* opcode bitmask */
- case 0x00: /* 0000 0000 */ f8_lr_a_ku(); break;
- case 0x01: /* 0000 0001 */ f8_lr_a_kl(); break;
- case 0x02: /* 0000 0010 */ f8_lr_a_qu(); break;
- case 0x03: /* 0000 0011 */ f8_lr_a_ql(); break;
- case 0x04: /* 0000 0100 */ f8_lr_ku_a(); break;
- case 0x05: /* 0000 0101 */ f8_lr_kl_a(); break;
- case 0x06: /* 0000 0110 */ f8_lr_qu_a(); break;
- case 0x07: /* 0000 0111 */ f8_lr_ql_a(); break;
- case 0x08: /* 0000 1000 */ f8_lr_k_p(); break;
- case 0x09: /* 0000 1001 */ f8_lr_p_k(); break;
- case 0x0a: /* 0000 1010 */ f8_lr_a_is(); break;
- case 0x0b: /* 0000 1011 */ f8_lr_is_a(); break;
- case 0x0c: /* 0000 1100 */ f8_pk(); break;
- case 0x0d: /* 0000 1101 */ f8_lr_p0_q(); break;
- case 0x0e: /* 0000 1110 */ f8_lr_q_dc(); break;
- case 0x0f: /* 0000 1111 */ f8_lr_dc_q(); break;
-
- case 0x10: /* 0001 0000 */ f8_lr_dc_h(); break;
- case 0x11: /* 0001 0001 */ f8_lr_h_dc(); break;
- case 0x12: /* 0001 0010 */ f8_sr_1(); break;
- case 0x13: /* 0001 0011 */ f8_sl_1(); break;
- case 0x14: /* 0001 0100 */ f8_sr_4(); break;
- case 0x15: /* 0001 0101 */ f8_sl_4(); break;
- case 0x16: /* 0001 0110 */ f8_lm(); break;
- case 0x17: /* 0001 0111 */ f8_st(); break;
- case 0x18: /* 0001 1000 */ f8_com(); break;
- case 0x19: /* 0001 1001 */ f8_lnk(); break;
- case 0x1a: /* 0001 1010 */ f8_di(); break;
- case 0x1b: /* 0001 1011 */ f8_ei(); break;
- case 0x1c: /* 0001 1100 */ f8_pop(); break;
- case 0x1d: /* 0001 1101 */ f8_lr_w_j(); break;
- case 0x1e: /* 0001 1110 */ f8_lr_j_w(); break;
- case 0x1f: /* 0001 1111 */ f8_inc(); break;
-
- case 0x20: /* 0010 0000 */ f8_li(); break;
- case 0x21: /* 0010 0001 */ f8_ni(); break;
- case 0x22: /* 0010 0010 */ f8_oi(); break;
- case 0x23: /* 0010 0011 */ f8_xi(); break;
- case 0x24: /* 0010 0100 */ f8_ai(); break;
- case 0x25: /* 0010 0101 */ f8_ci(); break;
- case 0x26: /* 0010 0110 */ f8_in(); break;
- case 0x27: /* 0010 0111 */ f8_out(); break;
- case 0x28: /* 0010 1000 */ f8_pi(); break;
- case 0x29: /* 0010 1001 */ f8_jmp(); break;
- case 0x2a: /* 0010 1010 */ f8_dci(); break;
- case 0x2b: /* 0010 1011 */ f8_nop(); break;
- case 0x2c: /* 0010 1100 */ f8_xdc(); break;
- case 0x2d: /* 0010 1101 */ illegal(); break;
- case 0x2e: /* 0010 1110 */ illegal(); break;
- case 0x2f: /* 0010 1111 */ illegal(); break;
-
- case 0x30: /* 0011 0000 */ f8_ds_r( 0); break;
- case 0x31: /* 0011 0001 */ f8_ds_r( 1); break;
- case 0x32: /* 0011 0010 */ f8_ds_r( 2); break;
- case 0x33: /* 0011 0011 */ f8_ds_r( 3); break;
- case 0x34: /* 0011 0100 */ f8_ds_r( 4); break;
- case 0x35: /* 0011 0101 */ f8_ds_r( 5); break;
- case 0x36: /* 0011 0110 */ f8_ds_r( 6); break;
- case 0x37: /* 0011 0111 */ f8_ds_r( 7); break;
- case 0x38: /* 0011 1000 */ f8_ds_r( 8); break;
- case 0x39: /* 0011 1001 */ f8_ds_r( 9); break;
- case 0x3a: /* 0011 1010 */ f8_ds_r(10); break;
- case 0x3b: /* 0011 1011 */ f8_ds_r(11); break;
- case 0x3c: /* 0011 1100 */ f8_ds_isar(); break;
- case 0x3d: /* 0011 1101 */ f8_ds_isar_i(); break;
- case 0x3e: /* 0011 1110 */ f8_ds_isar_d(); break;
- case 0x3f: /* 0011 1111 */ illegal(); break;
-
- case 0x40: /* 0100 0000 */ f8_lr_a_r( 0); break;
- case 0x41: /* 0100 0001 */ f8_lr_a_r( 1); break;
- case 0x42: /* 0100 0010 */ f8_lr_a_r( 2); break;
- case 0x43: /* 0100 0011 */ f8_lr_a_r( 3); break;
- case 0x44: /* 0100 0100 */ f8_lr_a_r( 4); break;
- case 0x45: /* 0100 0101 */ f8_lr_a_r( 5); break;
- case 0x46: /* 0100 0110 */ f8_lr_a_r( 6); break;
- case 0x47: /* 0100 0111 */ f8_lr_a_r( 7); break;
- case 0x48: /* 0100 1000 */ f8_lr_a_r( 8); break;
- case 0x49: /* 0100 1001 */ f8_lr_a_r( 9); break;
- case 0x4a: /* 0100 1010 */ f8_lr_a_r(10); break;
- case 0x4b: /* 0100 1011 */ f8_lr_a_r(11); break;
- case 0x4c: /* 0100 1100 */ f8_lr_a_isar(); break;
- case 0x4d: /* 0100 1101 */ f8_lr_a_isar_i(); break;
- case 0x4e: /* 0100 1110 */ f8_lr_a_isar_d(); break;
- case 0x4f: /* 0100 1111 */ illegal(); break;
-
- case 0x50: /* 0101 0000 */ f8_lr_r_a( 0); break;
- case 0x51: /* 0101 0001 */ f8_lr_r_a( 1); break;
- case 0x52: /* 0101 0010 */ f8_lr_r_a( 2); break;
- case 0x53: /* 0101 0011 */ f8_lr_r_a( 3); break;
- case 0x54: /* 0101 0100 */ f8_lr_r_a( 4); break;
- case 0x55: /* 0101 0101 */ f8_lr_r_a( 5); break;
- case 0x56: /* 0101 0110 */ f8_lr_r_a( 6); break;
- case 0x57: /* 0101 0111 */ f8_lr_r_a( 7); break;
- case 0x58: /* 0101 1000 */ f8_lr_r_a( 8); break;
- case 0x59: /* 0101 1001 */ f8_lr_r_a( 9); break;
- case 0x5a: /* 0101 1010 */ f8_lr_r_a(10); break;
- case 0x5b: /* 0101 1011 */ f8_lr_r_a(11); break;
- case 0x5c: /* 0101 1100 */ f8_lr_isar_a(); break;
- case 0x5d: /* 0101 1101 */ f8_lr_isar_i_a(); break;
- case 0x5e: /* 0101 1110 */ f8_lr_isar_d_a(); break;
- case 0x5f: /* 0101 1111 */ illegal(); break;
-
- case 0x60: /* 0110 0000 */ f8_lisu(0x00); break;
- case 0x61: /* 0110 0001 */ f8_lisu(0x08); break;
- case 0x62: /* 0110 0010 */ f8_lisu(0x10); break;
- case 0x63: /* 0110 0011 */ f8_lisu(0x18); break;
- case 0x64: /* 0110 0100 */ f8_lisu(0x20); break;
- case 0x65: /* 0110 0101 */ f8_lisu(0x28); break;
- case 0x66: /* 0110 0110 */ f8_lisu(0x30); break;
- case 0x67: /* 0110 0111 */ f8_lisu(0x38); break;
- case 0x68: /* 0110 1000 */ f8_lisl(0x00); break;
- case 0x69: /* 0110 1001 */ f8_lisl(0x01); break;
- case 0x6a: /* 0110 1010 */ f8_lisl(0x02); break;
- case 0x6b: /* 0110 1011 */ f8_lisl(0x03); break;
- case 0x6c: /* 0110 1100 */ f8_lisl(0x04); break;
- case 0x6d: /* 0110 1101 */ f8_lisl(0x05); break;
- case 0x6e: /* 0110 1110 */ f8_lisl(0x06); break;
- case 0x6f: /* 0110 1111 */ f8_lisl(0x07); break;
-
- case 0x70: /* 0111 0000 */ f8_lis(0x0); break;
- case 0x71: /* 0111 0001 */ f8_lis(0x1); break;
- case 0x72: /* 0111 0010 */ f8_lis(0x2); break;
- case 0x73: /* 0111 0011 */ f8_lis(0x3); break;
- case 0x74: /* 0111 0100 */ f8_lis(0x4); break;
- case 0x75: /* 0111 0101 */ f8_lis(0x5); break;
- case 0x76: /* 0111 0110 */ f8_lis(0x6); break;
- case 0x77: /* 0111 0111 */ f8_lis(0x7); break;
- case 0x78: /* 0111 1000 */ f8_lis(0x8); break;
- case 0x79: /* 0111 1001 */ f8_lis(0x9); break;
- case 0x7a: /* 0111 1010 */ f8_lis(0xa); break;
- case 0x7b: /* 0111 1011 */ f8_lis(0xb); break;
- case 0x7c: /* 0111 1100 */ f8_lis(0xc); break;
- case 0x7d: /* 0111 1101 */ f8_lis(0xd); break;
- case 0x7e: /* 0111 1110 */ f8_lis(0xe); break;
- case 0x7f: /* 0111 1111 */ f8_lis(0xf); break;
-
- case 0x80: /* 1000 0000 */ f8_bt(0); break;
- case 0x81: /* 1000 0001 */ f8_bt(1); break;
- case 0x82: /* 1000 0010 */ f8_bt(2); break;
- case 0x83: /* 1000 0011 */ f8_bt(3); break;
- case 0x84: /* 1000 0100 */ f8_bt(4); break;
- case 0x85: /* 1000 0101 */ f8_bt(5); break;
- case 0x86: /* 1000 0110 */ f8_bt(6); break;
- case 0x87: /* 1000 0111 */ f8_bt(7); break;
- case 0x88: /* 1000 1000 */ f8_am(); break;
- case 0x89: /* 1000 1001 */ f8_amd(); break;
- case 0x8a: /* 1000 1010 */ f8_nm(); break;
- case 0x8b: /* 1000 1011 */ f8_om(); break;
- case 0x8c: /* 1000 1100 */ f8_xm(); break;
- case 0x8d: /* 1000 1101 */ f8_cm(); break;
- case 0x8e: /* 1000 1110 */ f8_adc(); break;
- case 0x8f: /* 1000 1111 */ f8_br7(); break;
-
- case 0x90: /* 1001 0000 */ f8_bf(0x0); break;
- case 0x91: /* 1001 0001 */ f8_bf(0x1); break;
- case 0x92: /* 1001 0010 */ f8_bf(0x2); break;
- case 0x93: /* 1001 0011 */ f8_bf(0x3); break;
- case 0x94: /* 1001 0100 */ f8_bf(0x4); break;
- case 0x95: /* 1001 0101 */ f8_bf(0x5); break;
- case 0x96: /* 1001 0110 */ f8_bf(0x6); break;
- case 0x97: /* 1001 0111 */ f8_bf(0x7); break;
- case 0x98: /* 1001 1000 */ f8_bf(0x8); break;
- case 0x99: /* 1001 1001 */ f8_bf(0x9); break;
- case 0x9a: /* 1001 1010 */ f8_bf(0xa); break;
- case 0x9b: /* 1001 1011 */ f8_bf(0xb); break;
- case 0x9c: /* 1001 1100 */ f8_bf(0xc); break;
- case 0x9d: /* 1001 1101 */ f8_bf(0xd); break;
- case 0x9e: /* 1001 1110 */ f8_bf(0xe); break;
- case 0x9f: /* 1001 1111 */ f8_bf(0xf); break;
-
- case 0xa0: /* 1010 0000 */ f8_ins_0(0x0); break;
- case 0xa1: /* 1010 0001 */ f8_ins_0(0x1); break;
- case 0xa2: /* 1010 0010 */ illegal(); break;
- case 0xa3: /* 1010 0011 */ illegal(); break;
- case 0xa4: /* 1010 0100 */ f8_ins_1(0x4); break;
- case 0xa5: /* 1010 0101 */ f8_ins_1(0x5); break;
- case 0xa6: /* 1010 0110 */ f8_ins_1(0x6); break;
- case 0xa7: /* 1010 0111 */ f8_ins_1(0x7); break;
- case 0xa8: /* 1010 1000 */ f8_ins_1(0x8); break;
- case 0xa9: /* 1010 1001 */ f8_ins_1(0x9); break;
- case 0xaa: /* 1010 1010 */ f8_ins_1(0xa); break;
- case 0xab: /* 1010 1011 */ f8_ins_1(0xb); break;
- case 0xac: /* 1010 1100 */ f8_ins_1(0xc); break;
- case 0xad: /* 1010 1101 */ f8_ins_1(0xd); break;
- case 0xae: /* 1010 1110 */ f8_ins_1(0xe); break;
- case 0xaf: /* 1010 1111 */ f8_ins_1(0xf); break;
-
- case 0xb0: /* 1011 0000 */ f8_outs_0(0x0); break;
- case 0xb1: /* 1011 0001 */ f8_outs_0(0x1); break;
- case 0xb2: /* 1011 0010 */ illegal(); break;
- case 0xb3: /* 1011 0011 */ illegal(); break;
- case 0xb4: /* 1011 0100 */ f8_outs_1(0x4); break;
- case 0xb5: /* 1011 0101 */ f8_outs_1(0x5); break;
- case 0xb6: /* 1011 0110 */ f8_outs_1(0x6); break;
- case 0xb7: /* 1011 0111 */ f8_outs_1(0x7); break;
- case 0xb8: /* 1011 1000 */ f8_outs_1(0x8); break;
- case 0xb9: /* 1011 1001 */ f8_outs_1(0x9); break;
- case 0xba: /* 1011 1010 */ f8_outs_1(0xa); break;
- case 0xbb: /* 1011 1011 */ f8_outs_1(0xb); break;
- case 0xbc: /* 1011 1100 */ f8_outs_1(0xc); break;
- case 0xbd: /* 1011 1101 */ f8_outs_1(0xd); break;
- case 0xbe: /* 1011 1110 */ f8_outs_1(0xe); break;
- case 0xbf: /* 1011 1111 */ f8_outs_1(0xf); break;
-
- case 0xc0: /* 1100 0000 */ f8_as(0x0); break;
- case 0xc1: /* 1100 0001 */ f8_as(0x1); break;
- case 0xc2: /* 1100 0010 */ f8_as(0x2); break;
- case 0xc3: /* 1100 0011 */ f8_as(0x3); break;
- case 0xc4: /* 1100 0100 */ f8_as(0x4); break;
- case 0xc5: /* 1100 0101 */ f8_as(0x5); break;
- case 0xc6: /* 1100 0110 */ f8_as(0x6); break;
- case 0xc7: /* 1100 0111 */ f8_as(0x7); break;
- case 0xc8: /* 1100 1000 */ f8_as(0x8); break;
- case 0xc9: /* 1100 1001 */ f8_as(0x9); break;
- case 0xca: /* 1100 1010 */ f8_as(0xa); break;
- case 0xcb: /* 1100 1011 */ f8_as(0xb); break;
- case 0xcc: /* 1100 1100 */ f8_as_isar(); break;
- case 0xcd: /* 1100 1101 */ f8_as_isar_i(); break;
- case 0xce: /* 1100 1110 */ f8_as_isar_d(); break;
- case 0xcf: /* 1100 1111 */ illegal(); break;
-
- case 0xd0: /* 1101 0000 */ f8_asd(0x0); break;
- case 0xd1: /* 1101 0001 */ f8_asd(0x1); break;
- case 0xd2: /* 1101 0010 */ f8_asd(0x2); break;
- case 0xd3: /* 1101 0011 */ f8_asd(0x3); break;
- case 0xd4: /* 1101 0100 */ f8_asd(0x4); break;
- case 0xd5: /* 1101 0101 */ f8_asd(0x5); break;
- case 0xd6: /* 1101 0110 */ f8_asd(0x6); break;
- case 0xd7: /* 1101 0111 */ f8_asd(0x7); break;
- case 0xd8: /* 1101 1000 */ f8_asd(0x8); break;
- case 0xd9: /* 1101 1001 */ f8_asd(0x9); break;
- case 0xda: /* 1101 1010 */ f8_asd(0xa); break;
- case 0xdb: /* 1101 1011 */ f8_asd(0xb); break;
- case 0xdc: /* 1101 1100 */ f8_asd_isar(); break;
- case 0xdd: /* 1101 1101 */ f8_asd_isar_i(); break;
- case 0xde: /* 1101 1110 */ f8_asd_isar_d(); break;
- case 0xdf: /* 1101 1111 */ illegal(); break;
-
- case 0xe0: /* 1110 0000 */ f8_xs(0x0); break;
- case 0xe1: /* 1110 0001 */ f8_xs(0x1); break;
- case 0xe2: /* 1110 0010 */ f8_xs(0x2); break;
- case 0xe3: /* 1110 0011 */ f8_xs(0x3); break;
- case 0xe4: /* 1110 0100 */ f8_xs(0x4); break;
- case 0xe5: /* 1110 0101 */ f8_xs(0x5); break;
- case 0xe6: /* 1110 0110 */ f8_xs(0x6); break;
- case 0xe7: /* 1110 0111 */ f8_xs(0x7); break;
- case 0xe8: /* 1110 1000 */ f8_xs(0x8); break;
- case 0xe9: /* 1110 1001 */ f8_xs(0x9); break;
- case 0xea: /* 1110 1010 */ f8_xs(0xa); break;
- case 0xeb: /* 1110 1011 */ f8_xs(0xb); break;
- case 0xec: /* 1110 1100 */ f8_xs_isar(); break;
- case 0xed: /* 1110 1101 */ f8_xs_isar_i(); break;
- case 0xee: /* 1110 1110 */ f8_xs_isar_d(); break;
- case 0xef: /* 1110 1111 */ illegal(); break;
-
- case 0xf0: /* 1111 0000 */ f8_ns(0x0); break;
- case 0xf1: /* 1111 0001 */ f8_ns(0x1); break;
- case 0xf2: /* 1111 0010 */ f8_ns(0x2); break;
- case 0xf3: /* 1111 0011 */ f8_ns(0x3); break;
- case 0xf4: /* 1111 0100 */ f8_ns(0x4); break;
- case 0xf5: /* 1111 0101 */ f8_ns(0x5); break;
- case 0xf6: /* 1111 0110 */ f8_ns(0x6); break;
- case 0xf7: /* 1111 0111 */ f8_ns(0x7); break;
- case 0xf8: /* 1111 1000 */ f8_ns(0x8); break;
- case 0xf9: /* 1111 1001 */ f8_ns(0x9); break;
- case 0xfa: /* 1111 1010 */ f8_ns(0xa); break;
- case 0xfb: /* 1111 1011 */ f8_ns(0xb); break;
- case 0xfc: /* 1111 1100 */ f8_ns_isar(); break;
- case 0xfd: /* 1111 1101 */ f8_ns_isar_i(); break;
- case 0xfe: /* 1111 1110 */ f8_ns_isar_d(); break;
- case 0xff: /* 1111 1111 */ illegal(); break;
+ case 0x00: f8_lr_a_ku(); break;
+ case 0x01: f8_lr_a_kl(); break;
+ case 0x02: f8_lr_a_qu(); break;
+ case 0x03: f8_lr_a_ql(); break;
+ case 0x04: f8_lr_ku_a(); break;
+ case 0x05: f8_lr_kl_a(); break;
+ case 0x06: f8_lr_qu_a(); break;
+ case 0x07: f8_lr_ql_a(); break;
+ case 0x08: f8_lr_k_p(); break;
+ case 0x09: f8_lr_p_k(); break;
+ case 0x0a: f8_lr_a_is(); break;
+ case 0x0b: f8_lr_is_a(); break;
+ case 0x0c: f8_pk(); break;
+ case 0x0d: f8_lr_p0_q(); break;
+ case 0x0e: f8_lr_q_dc(); break;
+ case 0x0f: f8_lr_dc_q(); break;
+
+ case 0x10: f8_lr_dc_h(); break;
+ case 0x11: f8_lr_h_dc(); break;
+ case 0x12: f8_sr_1(); break;
+ case 0x13: f8_sl_1(); break;
+ case 0x14: f8_sr_4(); break;
+ case 0x15: f8_sl_4(); break;
+ case 0x16: f8_lm(); break;
+ case 0x17: f8_st(); break;
+ case 0x18: f8_com(); break;
+ case 0x19: f8_lnk(); break;
+ case 0x1a: f8_di(); break;
+ case 0x1b: f8_ei(); break;
+ case 0x1c: f8_pop(); break;
+ case 0x1d: f8_lr_w_j(); break;
+ case 0x1e: f8_lr_j_w(); break;
+ case 0x1f: f8_inc(); break;
+
+ case 0x20: f8_li(); break;
+ case 0x21: f8_ni(); break;
+ case 0x22: f8_oi(); break;
+ case 0x23: f8_xi(); break;
+ case 0x24: f8_ai(); break;
+ case 0x25: f8_ci(); break;
+ case 0x26: f8_in(); break;
+ case 0x27: f8_out(); break;
+ case 0x28: f8_pi(); break;
+ case 0x29: f8_jmp(); break;
+ case 0x2a: f8_dci(); break;
+ case 0x2b: f8_nop(); break;
+ case 0x2c: f8_xdc(); break;
+ case 0x2d: illegal(); break;
+ case 0x2e: illegal(); break;
+ case 0x2f: illegal(); break;
+
+ case 0x30: f8_ds_r(0); break;
+ case 0x31: f8_ds_r(1); break;
+ case 0x32: f8_ds_r(2); break;
+ case 0x33: f8_ds_r(3); break;
+ case 0x34: f8_ds_r(4); break;
+ case 0x35: f8_ds_r(5); break;
+ case 0x36: f8_ds_r(6); break;
+ case 0x37: f8_ds_r(7); break;
+ case 0x38: f8_ds_r(8); break;
+ case 0x39: f8_ds_r(9); break;
+ case 0x3a: f8_ds_r(10); break;
+ case 0x3b: f8_ds_r(11); break;
+ case 0x3c: f8_ds_isar(); break;
+ case 0x3d: f8_ds_isar_i(); break;
+ case 0x3e: f8_ds_isar_d(); break;
+ case 0x3f: illegal(); break;
+
+ case 0x40: f8_lr_a_r(0); break;
+ case 0x41: f8_lr_a_r(1); break;
+ case 0x42: f8_lr_a_r(2); break;
+ case 0x43: f8_lr_a_r(3); break;
+ case 0x44: f8_lr_a_r(4); break;
+ case 0x45: f8_lr_a_r(5); break;
+ case 0x46: f8_lr_a_r(6); break;
+ case 0x47: f8_lr_a_r(7); break;
+ case 0x48: f8_lr_a_r(8); break;
+ case 0x49: f8_lr_a_r(9); break;
+ case 0x4a: f8_lr_a_r(10); break;
+ case 0x4b: f8_lr_a_r(11); break;
+ case 0x4c: f8_lr_a_isar(); break;
+ case 0x4d: f8_lr_a_isar_i(); break;
+ case 0x4e: f8_lr_a_isar_d(); break;
+ case 0x4f: illegal(); break;
+
+ case 0x50: f8_lr_r_a(0); break;
+ case 0x51: f8_lr_r_a(1); break;
+ case 0x52: f8_lr_r_a(2); break;
+ case 0x53: f8_lr_r_a(3); break;
+ case 0x54: f8_lr_r_a(4); break;
+ case 0x55: f8_lr_r_a(5); break;
+ case 0x56: f8_lr_r_a(6); break;
+ case 0x57: f8_lr_r_a(7); break;
+ case 0x58: f8_lr_r_a(8); break;
+ case 0x59: f8_lr_r_a(9); break;
+ case 0x5a: f8_lr_r_a(10); break;
+ case 0x5b: f8_lr_r_a(11); break;
+ case 0x5c: f8_lr_isar_a(); break;
+ case 0x5d: f8_lr_isar_i_a(); break;
+ case 0x5e: f8_lr_isar_d_a(); break;
+ case 0x5f: illegal(); break;
+
+ case 0x60: f8_lisu(0x00); break;
+ case 0x61: f8_lisu(0x08); break;
+ case 0x62: f8_lisu(0x10); break;
+ case 0x63: f8_lisu(0x18); break;
+ case 0x64: f8_lisu(0x20); break;
+ case 0x65: f8_lisu(0x28); break;
+ case 0x66: f8_lisu(0x30); break;
+ case 0x67: f8_lisu(0x38); break;
+ case 0x68: f8_lisl(0x00); break;
+ case 0x69: f8_lisl(0x01); break;
+ case 0x6a: f8_lisl(0x02); break;
+ case 0x6b: f8_lisl(0x03); break;
+ case 0x6c: f8_lisl(0x04); break;
+ case 0x6d: f8_lisl(0x05); break;
+ case 0x6e: f8_lisl(0x06); break;
+ case 0x6f: f8_lisl(0x07); break;
+
+ case 0x70: f8_lis(0x0); break;
+ case 0x71: f8_lis(0x1); break;
+ case 0x72: f8_lis(0x2); break;
+ case 0x73: f8_lis(0x3); break;
+ case 0x74: f8_lis(0x4); break;
+ case 0x75: f8_lis(0x5); break;
+ case 0x76: f8_lis(0x6); break;
+ case 0x77: f8_lis(0x7); break;
+ case 0x78: f8_lis(0x8); break;
+ case 0x79: f8_lis(0x9); break;
+ case 0x7a: f8_lis(0xa); break;
+ case 0x7b: f8_lis(0xb); break;
+ case 0x7c: f8_lis(0xc); break;
+ case 0x7d: f8_lis(0xd); break;
+ case 0x7e: f8_lis(0xe); break;
+ case 0x7f: f8_lis(0xf); break;
+
+ case 0x80: f8_bt(0); break;
+ case 0x81: f8_bt(1); break;
+ case 0x82: f8_bt(2); break;
+ case 0x83: f8_bt(3); break;
+ case 0x84: f8_bt(4); break;
+ case 0x85: f8_bt(5); break;
+ case 0x86: f8_bt(6); break;
+ case 0x87: f8_bt(7); break;
+ case 0x88: f8_am(); break;
+ case 0x89: f8_amd(); break;
+ case 0x8a: f8_nm(); break;
+ case 0x8b: f8_om(); break;
+ case 0x8c: f8_xm(); break;
+ case 0x8d: f8_cm(); break;
+ case 0x8e: f8_adc(); break;
+ case 0x8f: f8_br7(); break;
+
+ case 0x90: f8_bf(0x0); break;
+ case 0x91: f8_bf(0x1); break;
+ case 0x92: f8_bf(0x2); break;
+ case 0x93: f8_bf(0x3); break;
+ case 0x94: f8_bf(0x4); break;
+ case 0x95: f8_bf(0x5); break;
+ case 0x96: f8_bf(0x6); break;
+ case 0x97: f8_bf(0x7); break;
+ case 0x98: f8_bf(0x8); break;
+ case 0x99: f8_bf(0x9); break;
+ case 0x9a: f8_bf(0xa); break;
+ case 0x9b: f8_bf(0xb); break;
+ case 0x9c: f8_bf(0xc); break;
+ case 0x9d: f8_bf(0xd); break;
+ case 0x9e: f8_bf(0xe); break;
+ case 0x9f: f8_bf(0xf); break;
+
+ case 0xa0: f8_ins_0(0x0); break;
+ case 0xa1: f8_ins_0(0x1); break;
+ case 0xa2: illegal(); break;
+ case 0xa3: illegal(); break;
+ case 0xa4: f8_ins_1(0x4); break;
+ case 0xa5: f8_ins_1(0x5); break;
+ case 0xa6: f8_ins_1(0x6); break;
+ case 0xa7: f8_ins_1(0x7); break;
+ case 0xa8: f8_ins_1(0x8); break;
+ case 0xa9: f8_ins_1(0x9); break;
+ case 0xaa: f8_ins_1(0xa); break;
+ case 0xab: f8_ins_1(0xb); break;
+ case 0xac: f8_ins_1(0xc); break;
+ case 0xad: f8_ins_1(0xd); break;
+ case 0xae: f8_ins_1(0xe); break;
+ case 0xaf: f8_ins_1(0xf); break;
+
+ case 0xb0: f8_outs_0(0x0); break;
+ case 0xb1: f8_outs_0(0x1); break;
+ case 0xb2: illegal(); break;
+ case 0xb3: illegal(); break;
+ case 0xb4: f8_outs_1(0x4); break;
+ case 0xb5: f8_outs_1(0x5); break;
+ case 0xb6: f8_outs_1(0x6); break;
+ case 0xb7: f8_outs_1(0x7); break;
+ case 0xb8: f8_outs_1(0x8); break;
+ case 0xb9: f8_outs_1(0x9); break;
+ case 0xba: f8_outs_1(0xa); break;
+ case 0xbb: f8_outs_1(0xb); break;
+ case 0xbc: f8_outs_1(0xc); break;
+ case 0xbd: f8_outs_1(0xd); break;
+ case 0xbe: f8_outs_1(0xe); break;
+ case 0xbf: f8_outs_1(0xf); break;
+
+ case 0xc0: f8_as(0x0); break;
+ case 0xc1: f8_as(0x1); break;
+ case 0xc2: f8_as(0x2); break;
+ case 0xc3: f8_as(0x3); break;
+ case 0xc4: f8_as(0x4); break;
+ case 0xc5: f8_as(0x5); break;
+ case 0xc6: f8_as(0x6); break;
+ case 0xc7: f8_as(0x7); break;
+ case 0xc8: f8_as(0x8); break;
+ case 0xc9: f8_as(0x9); break;
+ case 0xca: f8_as(0xa); break;
+ case 0xcb: f8_as(0xb); break;
+ case 0xcc: f8_as_isar(); break;
+ case 0xcd: f8_as_isar_i(); break;
+ case 0xce: f8_as_isar_d(); break;
+ case 0xcf: illegal(); break;
+
+ case 0xd0: f8_asd(0x0); break;
+ case 0xd1: f8_asd(0x1); break;
+ case 0xd2: f8_asd(0x2); break;
+ case 0xd3: f8_asd(0x3); break;
+ case 0xd4: f8_asd(0x4); break;
+ case 0xd5: f8_asd(0x5); break;
+ case 0xd6: f8_asd(0x6); break;
+ case 0xd7: f8_asd(0x7); break;
+ case 0xd8: f8_asd(0x8); break;
+ case 0xd9: f8_asd(0x9); break;
+ case 0xda: f8_asd(0xa); break;
+ case 0xdb: f8_asd(0xb); break;
+ case 0xdc: f8_asd_isar(); break;
+ case 0xdd: f8_asd_isar_i(); break;
+ case 0xde: f8_asd_isar_d(); break;
+ case 0xdf: illegal(); break;
+
+ case 0xe0: f8_xs(0x0); break;
+ case 0xe1: f8_xs(0x1); break;
+ case 0xe2: f8_xs(0x2); break;
+ case 0xe3: f8_xs(0x3); break;
+ case 0xe4: f8_xs(0x4); break;
+ case 0xe5: f8_xs(0x5); break;
+ case 0xe6: f8_xs(0x6); break;
+ case 0xe7: f8_xs(0x7); break;
+ case 0xe8: f8_xs(0x8); break;
+ case 0xe9: f8_xs(0x9); break;
+ case 0xea: f8_xs(0xa); break;
+ case 0xeb: f8_xs(0xb); break;
+ case 0xec: f8_xs_isar(); break;
+ case 0xed: f8_xs_isar_i(); break;
+ case 0xee: f8_xs_isar_d(); break;
+ case 0xef: illegal(); break;
+
+ case 0xf0: f8_ns(0x0); break;
+ case 0xf1: f8_ns(0x1); break;
+ case 0xf2: f8_ns(0x2); break;
+ case 0xf3: f8_ns(0x3); break;
+ case 0xf4: f8_ns(0x4); break;
+ case 0xf5: f8_ns(0x5); break;
+ case 0xf6: f8_ns(0x6); break;
+ case 0xf7: f8_ns(0x7); break;
+ case 0xf8: f8_ns(0x8); break;
+ case 0xf9: f8_ns(0x9); break;
+ case 0xfa: f8_ns(0xa); break;
+ case 0xfb: f8_ns(0xb); break;
+ case 0xfc: f8_ns_isar(); break;
+ case 0xfd: f8_ns_isar_i(); break;
+ case 0xfe: f8_ns_isar_d(); break;
+ case 0xff: illegal(); break;
}
- switch (op) {
- case 0x0d: case 0x1b: case 0x1c: case 0x1d:
+ switch (op)
+ {
+ case 0x0c: case 0x1b: case 0x1c: case 0x1d:
case 0x27: case 0x28: case 0x29:
case 0xb4: case 0xb5: case 0xb6: case 0xb7:
case 0xb8: case 0xb9: case 0xba: case 0xbb:
case 0xbc: case 0xbd: case 0xbe: case 0xbf:
+ // don't handle irq after privileged instruction
ROMC_00(cS);
break;
default:
+ // 'freeze cycle' for handling interrupts
if (m_w&I && m_irq_request)
{
+ ROMC_10();
ROMC_1C(cL);
ROMC_0F();
ROMC_13();
}
- if( ( op >= 0x30 ) && ( op <= 0x3f) ) /* DS is a long cycle inst */
- {
+
+ // fetch next instruction (DS is long cycle)
+ if ((op >= 0x30) && (op <= 0x3f))
ROMC_00(cL);
- }
else
- {
ROMC_00(cS);
- }
+
break;
}
} while( m_icount > 0 );
diff --git a/src/devices/cpu/f8/f8.h b/src/devices/cpu/f8/f8.h
index cdd8f03b862..5185b938a05 100644
--- a/src/devices/cpu/f8/f8.h
+++ b/src/devices/cpu/f8/f8.h
@@ -76,9 +76,6 @@ private:
u8 m_r[64]; /* scratchpad RAM */
int m_irq_request;
- /* timer shifter polynomial values (will be used for timer interrupts) */
- u8 timer_shifter[256];
-
u16 m_debug_pc; // only for the MAME debugger
inline void CLR_OZCS();
diff --git a/src/devices/cpu/g65816/g65816.cpp b/src/devices/cpu/g65816/g65816.cpp
index a65122b6153..93c93f96ed8 100644
--- a/src/devices/cpu/g65816/g65816.cpp
+++ b/src/devices/cpu/g65816/g65816.cpp
@@ -17,6 +17,10 @@ All rights reserved.
/*
Changes:
+ 1.02 (2019-02-02):
+ R. Belmont
+ - Corrected WDM to take 2 bytes and added callback
+
1.01 (2010-04-04):
Angelo Salese
- Added boundary checks for MVP and MVN in M mode.
@@ -115,6 +119,7 @@ g65816_device::g65816_device(const machine_config &mconfig, device_type type, co
, m_data_config("data", ENDIANNESS_LITTLE, 8, 24, 0, internal)
, m_opcode_config("opcodes", ENDIANNESS_LITTLE, 8, 24, 0, internal)
, m_vector_config("vectors", ENDIANNESS_LITTLE, 8, 5, 0)
+ , m_wdm_w(*this)
, m_cpu_type(cpu_type)
{
}
@@ -860,6 +865,8 @@ void g65816_device::device_start()
m_program_cache = program_space.cache<0, 0, ENDIANNESS_LITTLE>();
m_opcode_cache = (has_space(AS_OPCODES) ? space(AS_OPCODES) : program_space).cache<0, 0, ENDIANNESS_LITTLE>();
+ m_wdm_w.resolve_safe();
+
save_item(NAME(m_a));
save_item(NAME(m_b));
save_item(NAME(m_x));
diff --git a/src/devices/cpu/g65816/g65816.h b/src/devices/cpu/g65816/g65816.h
index e53f9eb784b..454dc7fd1b5 100644
--- a/src/devices/cpu/g65816/g65816.h
+++ b/src/devices/cpu/g65816/g65816.h
@@ -56,7 +56,8 @@ public:
// construction/destruction
g65816_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
-protected:
+ auto wdm_handler() { return m_wdm_w.bind(); }
+
/* Registers - used by g65816_set_reg() and g65816_get_reg() */
enum
{
@@ -66,6 +67,7 @@ protected:
_5A22_FASTROM
};
+protected:
g65816_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock, int cpu_type, address_map_constructor internal);
// device-level overrides
@@ -96,6 +98,7 @@ protected:
address_space_config m_data_config;
address_space_config m_opcode_config;
address_space_config m_vector_config;
+ devcb_write8 m_wdm_w; /* WDM callback */
typedef void (g65816_device::*opcode_func) ();
typedef unsigned (g65816_device::*get_reg_func)(int regnum);
@@ -139,8 +142,10 @@ protected:
void g65816_set_pc(unsigned val);
unsigned g65816_get_sp();
void g65816_set_sp(unsigned val);
+public:
unsigned g65816_get_reg(int regnum);
void g65816_set_reg(int regnum, unsigned value);
+protected:
void g65816_restore_state();
unsigned g65816i_read_8_normal(unsigned address);
unsigned g65816i_read_8_immediate(unsigned address);
diff --git a/src/devices/cpu/g65816/g65816ds.cpp b/src/devices/cpu/g65816/g65816ds.cpp
index 0f40b42f5d6..355be140f99 100644
--- a/src/devices/cpu/g65816/g65816ds.cpp
+++ b/src/devices/cpu/g65816/g65816ds.cpp
@@ -101,7 +101,7 @@ const g65816_disassembler::opcode_struct g65816_disassembler::s_opcodes[256] =
{op::BIT, M, DX }, {op::AND, M, DX }, {op::ROL, M, DX }, {op::AND, M, DLIY},
{op::SEC, I, IMP }, {op::AND, M, AY }, {op::DEA, I, IMP }, {op::TSC, I, IMP },
{op::BIT, M, AX }, {op::AND, M, AX }, {op::ROL, M, AX }, {op::AND, M, ALX },
- {op::RTI, I, IMP }, {op::EOR, M, DXI }, {op::WDM, I, IMP }, {op::EOR, M, S },
+ {op::RTI, I, IMP }, {op::EOR, M, DXI }, {op::WDM, I, SIG }, {op::EOR, M, S },
{op::MVP, I, MVP }, {op::EOR, M, D }, {op::LSR, M, D }, {op::EOR, M, DLI },
{op::PHA, I, IMP }, {op::EOR, M, IMM }, {op::LSR, M, ACC }, {op::PHK, I, IMP },
{op::JMP, I, A }, {op::EOR, M, A }, {op::LSR, M, A }, {op::EOR, M, AL },
diff --git a/src/devices/cpu/g65816/g65816op.h b/src/devices/cpu/g65816/g65816op.h
index 97b198e9385..727117c0f29 100644
--- a/src/devices/cpu/g65816/g65816op.h
+++ b/src/devices/cpu/g65816/g65816op.h
@@ -1428,7 +1428,8 @@
#undef OP_WDM
#define OP_WDM() \
CLK(CLK_OP + CLK_IMPLIED); \
- REGISTER_PC++
+ SRC = OPER_8_IMM(); \
+ m_wdm_w(SRC);
/* G65816 Exchange accum high and low bytes */
#undef OP_XBA
diff --git a/src/devices/cpu/h8/h83003.cpp b/src/devices/cpu/h8/h83003.cpp
index 4e3e59c15cf..7b7b468d7b5 100644
--- a/src/devices/cpu/h8/h83003.cpp
+++ b/src/devices/cpu/h8/h83003.cpp
@@ -136,7 +136,9 @@ void h83003_device::map(address_map &map)
map(0xffffd2, 0xffffd2).rw("port9", FUNC(h8_port_device::port_r), FUNC(h8_port_device::dr_w));
map(0xffffd3, 0xffffd3).rw("porta", FUNC(h8_port_device::port_r), FUNC(h8_port_device::dr_w));
map(0xffffd4, 0xffffd4).w("portb", FUNC(h8_port_device::ddr_w));
+ map(0xffffd5, 0xffffd5).w("portc", FUNC(h8_port_device::ddr_w));
map(0xffffd6, 0xffffd6).rw("portb", FUNC(h8_port_device::port_r), FUNC(h8_port_device::dr_w));
+ map(0xffffd7, 0xffffd7).rw("portc", FUNC(h8_port_device::port_r), FUNC(h8_port_device::dr_w));
map(0xffffda, 0xffffda).rw("port4", FUNC(h8_port_device::pcr_r), FUNC(h8_port_device::pcr_w));
map(0xffffe0, 0xffffe7).r("adc", FUNC(h8_adc_device::addr8_r));
@@ -167,6 +169,7 @@ void h83003_device::device_add_mconfig(machine_config &config)
H8_PORT(config, "port9", h8_device::PORT_9, 0x00, 0xc0);
H8_PORT(config, "porta", h8_device::PORT_A, 0x00, 0x00);
H8_PORT(config, "portb", h8_device::PORT_B, 0x00, 0x00);
+ H8_PORT(config, "portc", h8_device::PORT_C, 0x00, 0x00);
H8_TIMER16(config, "timer16", 5, 0xe0);
H8H_TIMER16_CHANNEL(config, "timer16:0", 2, 2, "intc", 24);
H8H_TIMER16_CHANNEL(config, "timer16:1", 2, 2, "intc", 28);
diff --git a/src/devices/cpu/hmcs40/hmcs40.cpp b/src/devices/cpu/hmcs40/hmcs40.cpp
index 795ab3de985..42e1ca45ef8 100644
--- a/src/devices/cpu/hmcs40/hmcs40.cpp
+++ b/src/devices/cpu/hmcs40/hmcs40.cpp
@@ -466,6 +466,7 @@ void hmcs40_cpu_device::do_interrupt()
m_irt = 0;
standard_irq_callback(line);
+ m_prev_pc = m_pc;
}
void hmcs40_cpu_device::execute_set_input(int line, int state)
diff --git a/src/devices/cpu/hpc/hpc.cpp b/src/devices/cpu/hpc/hpc.cpp
new file mode 100644
index 00000000000..399ca9164af
--- /dev/null
+++ b/src/devices/cpu/hpc/hpc.cpp
@@ -0,0 +1,144 @@
+// license:BSD-3-Clause
+// copyright-holders:AJR
+/***************************************************************************
+
+ National Semiconductor High-Performance microController (HPC)
+
+ Currently this device is just a stub with no actual execution core.
+
+****************************************************************************
+
+ HPC feature options by part number
+
+ HPC16xxx Military temperature range (-55°C to +125°C)
+ HPC26xxx Automotive temperature range (-40°C to +105°C)
+ HPC36xxx Industrial temperature range (-40°C to +85°C)
+ HPC46xxx Commercial temperature range (0°C to +75°C)
+
+ HPCxx1xx 8-channel A/D converter
+ HPCxx0xx No A/D converter
+
+ HPCxxx6x 16k bytes of on-chip ROM
+ HPCxxx8x 8k bytes of on-chip ROM
+ HPCxxx0x No on-chip ROM
+
+ HPCxxxx4 512 bytes of on-chip RAM
+ HPCxxxx3 256 bytes of on-chip RAM
+
+***************************************************************************/
+
+#include "emu.h"
+#include "hpc.h"
+#include "hpcdasm.h"
+
+// device type definitions
+DEFINE_DEVICE_TYPE(HPC46003, hpc46003_device, "hpc46003", "HPC46003")
+DEFINE_DEVICE_TYPE(HPC46104, hpc46104_device, "hpc46104", "HPC46104")
+
+
+void hpc46003_device::internal_map(address_map &map)
+{
+ map(0x0000, 0x00bf).ram();
+ map(0x00c0, 0x00c0).rw(FUNC(hpc46003_device::psw_r), FUNC(hpc46003_device::psw_w));
+ map(0x00c4, 0x00cf).ram().share("core_regs");
+ // TODO: many other internal registers
+ map(0x01c0, 0x01ff).ram();
+}
+
+void hpc46104_device::internal_map(address_map &map)
+{
+ map(0x0000, 0x00bf).ram();
+ map(0x00c0, 0x00c0).rw(FUNC(hpc46104_device::psw_r), FUNC(hpc46104_device::psw_w));
+ map(0x00c4, 0x00cf).ram().share("core_regs");
+ // TODO: many other internal registers
+ map(0x01c0, 0x02ff).ram();
+}
+
+std::unique_ptr<util::disasm_interface> hpc46003_device::create_disassembler()
+{
+ return std::make_unique<hpc16083_disassembler>();
+}
+
+std::unique_ptr<util::disasm_interface> hpc46104_device::create_disassembler()
+{
+ return std::make_unique<hpc16164_disassembler>();
+}
+
+
+hpc_device::hpc_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock, address_map_constructor map)
+ : cpu_device(mconfig, type, tag, owner, clock)
+ , m_program_config("program", ENDIANNESS_LITTLE, 16, 16, 0, map)
+ , m_program(nullptr)
+ , m_core_regs(*this, "core_regs")
+ , m_psw(0)
+ , m_icount(0)
+{
+}
+
+hpc46003_device::hpc46003_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
+ : hpc_device(mconfig, HPC46003, tag, owner, clock, address_map_constructor(FUNC(hpc46003_device::internal_map), this))
+{
+}
+
+hpc46104_device::hpc46104_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
+ : hpc_device(mconfig, HPC46104, tag, owner, clock, address_map_constructor(FUNC(hpc46104_device::internal_map), this))
+{
+}
+
+device_memory_interface::space_config_vector hpc_device::memory_space_config() const
+{
+ return space_config_vector {
+ std::make_pair(AS_PROGRAM, &m_program_config),
+ };
+}
+
+
+void hpc_device::device_start()
+{
+ m_program = &space(AS_PROGRAM);
+
+ set_icountptr(m_icount);
+
+ state_add(HPC_PSW, "PSW", m_psw);
+ state_add(HPC_SP, "SP", m_core_regs[0]);
+ state_add(HPC_PC, "PC", m_core_regs[1]);
+ state_add(STATE_GENPC, "GENPC", m_core_regs[1]).callimport().noshow();
+ state_add(STATE_GENPCBASE, "CURPC", m_core_regs[1]).callimport().noshow();
+ state_add(HPC_A, "A", m_core_regs[2]);
+ state_add(HPC_K, "K", m_core_regs[3]);
+ state_add(HPC_B, "B", m_core_regs[4]);
+ state_add(HPC_X, "X", m_core_regs[5]);
+
+ save_item(NAME(m_psw));
+}
+
+void hpc_device::device_reset()
+{
+ m_psw = 0x00;
+ std::fill_n(&m_core_regs[0], 6, 0x0000);
+}
+
+
+u8 hpc_device::psw_r()
+{
+ return m_psw;
+}
+
+void hpc_device::psw_w(u8 data)
+{
+ m_psw = data;
+}
+
+
+void hpc_device::execute_run()
+{
+ m_core_regs[1] = m_program->read_word(0xfffe);
+ debugger_instruction_hook(m_core_regs[1]);
+
+ m_icount = 0;
+}
+
+void hpc_device::execute_set_input(int inputnum, int state)
+{
+ // TODO
+}
diff --git a/src/devices/cpu/hpc/hpc.h b/src/devices/cpu/hpc/hpc.h
new file mode 100644
index 00000000000..5f73a0ee2e6
--- /dev/null
+++ b/src/devices/cpu/hpc/hpc.h
@@ -0,0 +1,88 @@
+// license:BSD-3-Clause
+// copyright-holders:AJR
+
+#ifndef MAME_CPU_HPC_HPC_H
+#define MAME_CPU_HPC_HPC_H
+
+#pragma once
+
+
+class hpc_device : public cpu_device
+{
+public:
+ enum {
+ HPC_PSW,
+ HPC_SP,
+ HPC_PC,
+ HPC_A,
+ HPC_K,
+ HPC_B,
+ HPC_X
+ };
+
+protected:
+ // construction/destruction
+ hpc_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock, address_map_constructor map);
+
+ // device-level overrides
+ virtual void device_start() override;
+ virtual void device_reset() override;
+
+ // device_execute_interface overrides
+ virtual void execute_run() override;
+ virtual void execute_set_input(int inputnum, int state) override;
+
+ // device_memory_interface overrides
+ virtual space_config_vector memory_space_config() const override;
+
+ // internal register access
+ u8 psw_r();
+ void psw_w(u8 data);
+
+private:
+ // address space
+ address_space_config m_program_config;
+ address_space *m_program;
+
+ // internal state
+ required_shared_ptr<u16> m_core_regs;
+ u8 m_psw;
+
+ // execution sequencing
+ s32 m_icount;
+};
+
+class hpc46003_device : public hpc_device
+{
+public:
+ // construction/destruction
+ hpc46003_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
+
+protected:
+ // device_disasm_interface overrides
+ virtual std::unique_ptr<util::disasm_interface> create_disassembler() override;
+
+private:
+ void internal_map(address_map &map);
+};
+
+class hpc46104_device : public hpc_device
+{
+public:
+ // construction/destruction
+ hpc46104_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
+
+protected:
+ // device_disasm_interface overrides
+ virtual std::unique_ptr<util::disasm_interface> create_disassembler() override;
+
+private:
+ void internal_map(address_map &map);
+};
+
+
+// device type declarations
+DECLARE_DEVICE_TYPE(HPC46003, hpc46003_device)
+DECLARE_DEVICE_TYPE(HPC46104, hpc46104_device)
+
+#endif // MAME_CPU_HPC_HPC_H
diff --git a/src/devices/cpu/hpc/hpcdasm.cpp b/src/devices/cpu/hpc/hpcdasm.cpp
new file mode 100644
index 00000000000..86c575a826e
--- /dev/null
+++ b/src/devices/cpu/hpc/hpcdasm.cpp
@@ -0,0 +1,764 @@
+// license:BSD-3-Clause
+// copyright-holders:AJR
+/***************************************************************************
+
+ National Semiconductor HPC disassembler
+
+ Note that though all 16-bit fields in instructions have the MSB first,
+ the HPC's memory organization is in fact little-endian. This is why r16
+ is not used to read them.
+
+***************************************************************************/
+
+#include "util/disasmintf.h"
+#include "hpcdasm.h"
+
+#include "util/strformat.h"
+#include <ctype.h>
+
+using osd::u32;
+using util::BIT;
+using offs_t = u32;
+
+const char *const hpc16083_disassembler::s_regs[128] =
+{
+ "psw", nullptr, "SP", "PC", "A", "K", "B", "X",
+ "enir", "irpd", "ircd", "sio", "porti", nullptr, "halten", nullptr,
+ "porta", "portb", nullptr, "upic", nullptr, nullptr, nullptr, nullptr,
+ "dira", "dirb", "bfun", nullptr, nullptr, nullptr, nullptr, nullptr,
+ nullptr, nullptr, "portd", nullptr, nullptr, nullptr, nullptr, nullptr,
+ nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr,
+ "enu", "enui", "rbuf", "tbuf", "enur", nullptr, nullptr, nullptr,
+ nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr,
+ "t4", "r4", "t5", "r5", "t6", "r6", "t7", "r7",
+ "pwmode", "portp", nullptr, nullptr, nullptr, nullptr, "eicon", "eicr",
+ nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr,
+ nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr,
+ "i4cr", "i3cr", "i2cr", "r2", "t2", "r3", "t3", "divby",
+ "tmmode", "t0con", "watchdog", nullptr, nullptr, nullptr, nullptr, nullptr,
+ nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr,
+ nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr
+};
+
+const char *const hpc16164_disassembler::s_regs[128] =
+{
+ "psw", nullptr, "SP", "PC", "A", "K", "B", "X",
+ "enir", "irpd", "ircd", "sio", "porti", nullptr, "halten", "romdump",
+ "porta", "portb", nullptr, "upic", nullptr, nullptr, nullptr, nullptr,
+ "dira", "dirb", "bfun", nullptr, nullptr, nullptr, nullptr, nullptr,
+ "adcr1", "adcr2", "portd", "adcr3", nullptr, nullptr, nullptr, nullptr,
+ "ad0", "ad1", "ad2", "ad3", "ad4", "ad5", "ad6", "ad7",
+ "enu", "enui", "rbuf", "tbuf", "enur", nullptr, nullptr, nullptr,
+ nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr,
+ "t4", "r4", "t5", "r5", "t6", "r6", "t7", "r7",
+ "pwmode", "portp", nullptr, nullptr, nullptr, nullptr, "eicon", "eicr",
+ nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr,
+ nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr,
+ "i4cr", "i3cr", "i2cr", "r2", "t2", "r3", "t3", "divby",
+ "tmmode", "t0con", "watchdog", nullptr, nullptr, nullptr, nullptr, nullptr,
+ nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr,
+ nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr
+};
+
+hpc_disassembler::hpc_disassembler(const char *const regs[])
+ : util::disasm_interface()
+ , m_regs(regs)
+{
+}
+
+u32 hpc_disassembler::opcode_alignment() const
+{
+ return 1;
+}
+
+void hpc_disassembler::format_register(std::ostream &stream, u16 reg) const
+{
+ if (reg >= 0x00c0 && reg < 0x01c0)
+ {
+ const char *name = m_regs[(reg - 0x00c0) >> 1];
+ if (name != nullptr)
+ {
+ stream << name;
+ if (BIT(reg, 0))
+ stream << "+1";
+ return;
+ }
+ }
+
+ util::stream_format(stream, "0%X", reg);
+}
+
+void hpc_disassembler::format_immediate_byte(std::ostream &stream, u8 data) const
+{
+ stream << "#";
+ if (data >= 0x10)
+ stream << "0";
+ util::stream_format(stream, "%02X", data);
+}
+
+void hpc_disassembler::format_immediate_word(std::ostream &stream, u16 data) const
+{
+ stream << "#";
+ if (data >= 0x1000)
+ stream << "0";
+ util::stream_format(stream, "%04X", data);
+}
+
+void hpc_disassembler::disassemble_op(std::ostream &stream, const char *op, u16 reg, u16 src, bool imm, bool indir, bool idx, bool w) const
+{
+ util::stream_format(stream, "%-8s", op);
+ if (idx)
+ stream << "A";
+ else
+ format_register(stream, reg);
+ stream << ",";
+ if (imm)
+ {
+ if (w)
+ format_immediate_word(stream, src);
+ else
+ format_immediate_byte(stream, src);
+ }
+ else
+ {
+ if (idx)
+ util::stream_format(stream, "0%X", u16(reg));
+
+ if (indir)
+ stream << "[";
+ format_register(stream, src);
+ if (indir)
+ stream << "]";
+
+ if (w)
+ stream << ".w";
+ else
+ stream << ".b";
+ }
+}
+
+void hpc_disassembler::disassemble_unary_op(std::ostream &stream, const char *op, u16 offset, u16 src, bool indir, bool idx, bool w) const
+{
+ util::stream_format(stream, "%-8s", op);
+ if (idx)
+ util::stream_format(stream, "0%X", offset);
+
+ if (indir)
+ stream << "[";
+ format_register(stream, src);
+ if (indir)
+ stream << "]";
+
+ if (w)
+ {
+ if (src < 0x00c4 || src >= 0x00d0 || indir)
+ stream << ".w";
+ }
+ else
+ stream << ".b";
+}
+
+void hpc_disassembler::disassemble_bit_op(std::ostream &stream, const char *op, u8 bit, u16 offset, u16 src, bool indir, bool idx) const
+{
+ if (src >= 0x00c0 && src < 0x01c0 && BIT(src, 0) && !indir && m_regs[(src - 0x00c0) >> 1] != nullptr)
+ {
+ src &= 0xfffe;
+ bit += 8;
+ }
+
+ util::stream_format(stream, "%-8s%d,", op, bit);
+
+ if (idx)
+ util::stream_format(stream, "0%X", offset);
+
+ if (indir)
+ stream << "[";
+ format_register(stream, src);
+ if (indir)
+ stream << "].b";
+}
+
+offs_t hpc_disassembler::disassemble(std::ostream &stream, offs_t pc, const hpc_disassembler::data_buffer &opcodes, const hpc_disassembler::data_buffer &params)
+{
+ u8 opcode = opcodes.r8(pc);
+ u16 reg = REGISTER_A;
+ u16 src = REGISTER_B;
+ bool imm = false;
+ bool dmode = false;
+ bool indir = true;
+ bool idx = false;
+ bool jmp = false;
+ offs_t bytes = 1;
+
+ switch (opcode)
+ {
+ case 0x20: case 0x21: case 0x22: case 0x23:
+ case 0x24: case 0x25: case 0x26: case 0x27:
+ case 0x28: case 0x29: case 0x2a: case 0x2b:
+ case 0x2c: case 0x2d: case 0x2e: case 0x2f:
+ jmp = true;
+ src = 0xffd0 + (opcode & 0x0f) * 2;
+ bytes = 1;
+ break;
+
+ case 0x30: case 0x31: case 0x32: case 0x33:
+ jmp = true;
+ src = pc + 2 + ((opcode & 0x03) << 8 | opcodes.r8(pc + 1));
+ bytes = 2;
+ break;
+
+ case 0x34: case 0x35: case 0x36: case 0x37:
+ jmp = true;
+ src = pc - ((opcode & 0x03) << 8 | opcodes.r8(pc + 1));
+ bytes = 2;
+ break;
+
+ case 0x38: case 0x39: case 0x3a:
+ reg = REGISTER_X;
+ break;
+
+ case 0x3f:
+ case 0x89: case 0x8a:
+ case 0xa9: case 0xaa: case 0xaf:
+ indir = false;
+ src = opcodes.r8(pc + 1);
+ bytes = 2;
+ break;
+
+ case 0x40: case 0x41: case 0x42: case 0x43:
+ case 0x44: case 0x45: case 0x46: case 0x47:
+ case 0x48: case 0x49: case 0x4a: case 0x4b:
+ case 0x4c: case 0x4d: case 0x4e: case 0x4f:
+ case 0x50: case 0x51: case 0x52: case 0x53:
+ case 0x54: case 0x55: case 0x56: case 0x57:
+ case 0x58: case 0x59: case 0x5a: case 0x5b:
+ case 0x5c: case 0x5d: case 0x5e: case 0x5f:
+ jmp = true;
+ src = pc + 1 + (opcode & 0x1f);
+ break;
+
+ case 0x60: case 0x61: case 0x62: case 0x63:
+ case 0x64: case 0x65: case 0x66: case 0x67:
+ case 0x68: case 0x69: case 0x6a: case 0x6b:
+ case 0x6c: case 0x6d: case 0x6e: case 0x6f:
+ case 0x70: case 0x71: case 0x72: case 0x73:
+ case 0x74: case 0x75: case 0x76: case 0x77:
+ case 0x78: case 0x79: case 0x7a: case 0x7b:
+ case 0x7c: case 0x7d: case 0x7e: case 0x7f:
+ jmp = true;
+ src = pc - (opcode & 0x1f);
+ break;
+
+ case 0x80: case 0x82:
+ case 0xa0:
+ dmode = true;
+ indir = false;
+ if (BIT(opcode, 1))
+ imm = true;
+
+ src = opcodes.r8(pc + 1);
+ reg = opcodes.r8(pc + 2);
+ opcode = opcodes.r8(pc + 3);
+ bytes = 4;
+ break;
+
+ case 0x84: case 0x86:
+ case 0xa4:
+ dmode = true;
+ indir = false;
+ if (BIT(opcode, 1))
+ imm = true;
+
+ src = (opcodes.r8(pc + 1) << 8) | opcodes.r8(pc + 2);
+ reg = opcodes.r8(pc + 3);
+ opcode = opcodes.r8(pc + 4);
+ bytes = 5;
+ break;
+
+ case 0x81: case 0x83:
+ case 0xa1:
+ dmode = true;
+ indir = false;
+ if (BIT(opcode, 1))
+ imm = true;
+
+ src = opcodes.r8(pc + 1);
+ reg = (opcodes.r8(pc + 2) << 8) | opcodes.r8(pc + 3);
+ opcode = opcodes.r8(pc + 4);
+ bytes = 5;
+ break;
+
+ case 0xa2:
+ idx = true;
+ reg = opcodes.r8(pc + 1);
+ src = opcodes.r8(pc + 2);
+ opcode = opcodes.r8(pc + 3);
+ bytes = 4;
+ break;
+
+ case 0x85: case 0x87:
+ case 0xa5:
+ dmode = true;
+ indir = false;
+ if (BIT(opcode, 1))
+ imm = true;
+
+ src = (opcodes.r8(pc + 1) << 8) | opcodes.r8(pc + 2);
+ reg = (opcodes.r8(pc + 3) << 8) | opcodes.r8(pc + 4);
+ opcode = opcodes.r8(pc + 5);
+ bytes = 6;
+ break;
+
+ case 0xa6:
+ idx = true;
+ reg = (opcodes.r8(pc + 1) << 8) | opcodes.r8(pc + 2);
+ src = opcodes.r8(pc + 3);
+ opcode = opcodes.r8(pc + 4);
+ bytes = 5;
+ break;
+
+ case 0x88: case 0x8b: case 0x8e:
+ case 0xa8: case 0xab: case 0xae:
+ indir = false;
+ src = opcodes.r8(pc + 1);
+ bytes = 2;
+ break;
+
+ case 0x8c:
+ case 0xac:
+ indir = false;
+ src = opcodes.r8(pc + 1);
+ reg = opcodes.r8(pc + 2);
+ bytes = 3;
+ break;
+
+ case 0x8d:
+ imm = true;
+ src = opcodes.r8(pc + 1);
+ reg = opcodes.r8(pc + 2);
+ bytes = 3;
+ break;
+
+ case 0x8f:
+ src = REGISTER_X;
+ opcode = opcodes.r8(pc + 1);
+ bytes = 2;
+ break;
+
+ case 0x90: case 0x91: case 0x92: case 0x93:
+ imm = true;
+ reg = 0x00c8 | ((opcode & 0x03) << 1);
+ src = opcodes.r8(pc + 1);
+ bytes = 2;
+ break;
+
+ case 0x98: case 0x99: case 0x9a: case 0x9b:
+ case 0x9c: case 0x9d: case 0x9e: case 0x9f:
+ imm = true;
+ src = opcodes.r8(pc + 1);
+ bytes = 2;
+ break;
+
+ case 0x94:
+ jmp = true;
+ src = pc + 2 + opcodes.r8(pc + 1);
+ bytes = 2;
+ break;
+
+ case 0x95:
+ jmp = true;
+ src = pc - opcodes.r8(pc + 1);
+ bytes = 2;
+ break;
+
+ case 0x96:
+ indir = false;
+ src = opcodes.r8(pc + 1);
+ opcode = opcodes.r8(pc + 2);
+ bytes = 3;
+ break;
+
+ case 0x97:
+ indir = false;
+ imm = true;
+ src = opcodes.r8(pc + 1);
+ reg = opcodes.r8(pc + 2);
+ bytes = 3;
+ break;
+
+ case 0xa7:
+ imm = true;
+ src = (opcodes.r8(pc + 1) << 8) | opcodes.r8(pc + 2);
+ reg = (opcodes.r8(pc + 3) << 8) | opcodes.r8(pc + 4);
+ bytes = 5;
+ break;
+
+ case 0xad:
+ src = opcodes.r8(pc + 1);
+ opcode = opcodes.r8(pc + 2);
+ bytes = 3;
+ break;
+
+ case 0xb0: case 0xb1: case 0xb2: case 0xb3:
+ imm = true;
+ reg = 0x00c8 | ((opcode & 0x03) << 1);
+ src = (opcodes.r8(pc + 1) << 8) | opcodes.r8(pc + 2);
+ bytes = 3;
+ break;
+
+ case 0xb8: case 0xb9: case 0xba: case 0xbb:
+ case 0xbc: case 0xbd: case 0xbe: case 0xbf:
+ imm = true;
+ src = (opcodes.r8(pc + 1) << 8) | opcodes.r8(pc + 2);
+ bytes = 3;
+ break;
+
+ case 0xb4: case 0xb5:
+ jmp = true;
+ src = pc + 3 + ((opcodes.r8(pc + 1) << 8) | opcodes.r8(pc + 2));
+ bytes = 3;
+ break;
+
+ case 0xb6:
+ indir = false;
+ src = (opcodes.r8(pc + 1) << 8) | opcodes.r8(pc + 2);
+ opcode = opcodes.r8(pc + 3);
+ bytes = 4;
+ break;
+
+ case 0xb7:
+ imm = true;
+ src = (opcodes.r8(pc + 1) << 8) | opcodes.r8(pc + 2);
+ reg = opcodes.r8(pc + 3);
+ bytes = 4;
+ break;
+
+ case 0xd4: case 0xd5: case 0xd6:
+ case 0xf4: case 0xf5: case 0xf6:
+ src = REGISTER_X;
+ break;
+ }
+
+ switch (opcode)
+ {
+ case 0x00:
+ util::stream_format(stream, "%-8sA", "clr");
+ break;
+
+ case 0x01:
+ util::stream_format(stream, "%-8sA", "comp");
+ break;
+
+ case 0x02:
+ stream << "sc";
+ break;
+
+ case 0x03:
+ stream << "rc";
+ break;
+
+ case 0x04:
+ util::stream_format(stream, "%-8sA", "inc");
+ break;
+
+ case 0x05:
+ util::stream_format(stream, "%-8sA", "dec");
+ break;
+
+ case 0x06:
+ stream << "ifnc";
+ break;
+
+ case 0x07:
+ stream << "ifc";
+ break;
+
+ case 0x08: case 0x09: case 0x0a: case 0x0b:
+ case 0x0c: case 0x0d: case 0x0e: case 0x0f:
+ disassemble_bit_op(stream, "sbit", opcode & 0x07, reg, src, indir, idx);
+ break;
+
+ case 0x10: case 0x11: case 0x12: case 0x13:
+ case 0x14: case 0x15: case 0x16: case 0x17:
+ disassemble_bit_op(stream, "ifbit", opcode & 0x07, reg, src, indir, idx);
+ break;
+
+ case 0x18: case 0x19: case 0x1a: case 0x1b:
+ case 0x1c: case 0x1d: case 0x1e: case 0x1f:
+ disassemble_bit_op(stream, "rbit", opcode & 0x07, reg, src, indir, idx);
+ break;
+
+ case 0x20: case 0x21: case 0x22: case 0x23:
+ case 0x24: case 0x25: case 0x26: case 0x27:
+ case 0x28: case 0x29: case 0x2a: case 0x2b:
+ case 0x2c: case 0x2d: case 0x2e: case 0x2f:
+ util::stream_format(stream, "%-8s", "jsrp");
+ if (jmp)
+ util::stream_format(stream, "[0%X]", src);
+ else
+ stream << "???";
+ bytes |= STEP_OVER;
+ break;
+
+ case 0x30: case 0x31: case 0x32: case 0x33:
+ case 0x34: case 0x35: case 0x36: case 0x37:
+ util::stream_format(stream, "%-8s", "jsr");
+ if (jmp)
+ util::stream_format(stream, "0%X", src);
+ else
+ stream << "???";
+ bytes |= STEP_OVER;
+ break;
+
+ case 0x38:
+ disassemble_op(stream, "rbit", reg, src, imm, indir, idx, false);
+ break;
+
+ case 0x39:
+ disassemble_op(stream, "sbit", reg, src, imm, indir, idx, false);
+ break;
+
+ case 0x3a:
+ disassemble_op(stream, "ifbit", reg, src, imm, indir, idx, false);
+ break;
+
+ case 0x3b:
+ util::stream_format(stream, "%-8sA", "swap");
+ break;
+
+ case 0x3c:
+ stream << "ret";
+ bytes |= STEP_OUT;
+ break;
+
+ case 0x3d:
+ stream << "retsk";
+ bytes |= STEP_OUT;
+ break;
+
+ case 0x3e:
+ stream << "reti";
+ bytes |= STEP_OUT;
+ break;
+
+ case 0x3f:
+ util::stream_format(stream, "%-8s", "pop");
+ format_register(stream, src);
+ break;
+
+ case 0x40:
+ stream << "nop";
+ break;
+
+ case 0x41: case 0x42: case 0x43:
+ case 0x44: case 0x45: case 0x46: case 0x47:
+ case 0x48: case 0x49: case 0x4a: case 0x4b:
+ case 0x4c: case 0x4d: case 0x4e: case 0x4f:
+ case 0x50: case 0x51: case 0x52: case 0x53:
+ case 0x54: case 0x55: case 0x56: case 0x57:
+ case 0x58: case 0x59: case 0x5a: case 0x5b:
+ case 0x5c: case 0x5d: case 0x5e: case 0x5f:
+ case 0x60: case 0x61: case 0x62: case 0x63:
+ case 0x64: case 0x65: case 0x66: case 0x67:
+ case 0x68: case 0x69: case 0x6a: case 0x6b:
+ case 0x6c: case 0x6d: case 0x6e: case 0x6f:
+ case 0x70: case 0x71: case 0x72: case 0x73:
+ case 0x74: case 0x75: case 0x76: case 0x77:
+ case 0x78: case 0x79: case 0x7a: case 0x7b:
+ case 0x7c: case 0x7d: case 0x7e: case 0x7f:
+ util::stream_format(stream, "%-8s", "jp");
+ if (jmp)
+ util::stream_format(stream, "0%X", src);
+ else
+ stream << "???";
+ break;
+
+ case 0x88: case 0x8c:
+ case 0x90: case 0x91: case 0x92: case 0x93:
+ case 0x97:
+ case 0xa8: case 0xac:
+ case 0xb0: case 0xb1: case 0xb2: case 0xb3:
+ case 0xb7:
+ case 0xc4:
+ case 0xd4:
+ case 0xe4:
+ case 0xf4:
+ disassemble_op(stream, "ld", reg, src, imm, indir, idx, BIT(opcode, 5));
+ break;
+
+ case 0x89:
+ case 0xa9:
+ disassemble_unary_op(stream, "inc", reg, src, indir, idx, BIT(opcode, 5));
+ break;
+
+ case 0x8a:
+ case 0xaa:
+ disassemble_unary_op(stream, "decsz", reg, src, indir, idx, BIT(opcode, 5));
+ bytes |= STEP_OVER | (1 << OVERINSTSHIFT);
+ break;
+
+ case 0x8b:
+ case 0xab:
+ case 0xc6:
+ case 0xd6:
+ case 0xe6:
+ case 0xf6:
+ disassemble_op(stream, dmode ? "ld" : "st", reg, src, imm, indir, idx, BIT(opcode, 5));
+ break;
+
+ case 0x8d:
+ util::stream_format(stream, "%-8sBK,", "ld");
+ format_immediate_byte(stream, src);
+ stream << ",";
+ format_immediate_byte(stream, reg);
+ break;
+
+ case 0x8e:
+ case 0xae:
+ case 0xc5:
+ case 0xd5:
+ case 0xe5:
+ case 0xf5:
+ disassemble_op(stream, "x", reg, src, imm, indir, idx, BIT(opcode, 5));
+ break;
+
+ case 0x94: case 0x95:
+ util::stream_format(stream, "%-8s", "jp");
+ if (jmp)
+ util::stream_format(stream, "0%X", src);
+ else
+ stream << "???";
+ break;
+
+ case 0x98: case 0xb8: case 0xd8: case 0xf8:
+ disassemble_op(stream, "add", reg, src, imm, indir, idx, BIT(opcode, 5));
+ break;
+
+ case 0x99: case 0xb9: case 0xd9: case 0xf9:
+ disassemble_op(stream, "and", reg, src, imm, indir, idx, BIT(opcode, 5));
+ break;
+
+ case 0x9a: case 0xba: case 0xda: case 0xfa:
+ disassemble_op(stream, "or", reg, src, imm, indir, idx, BIT(opcode, 5));
+ break;
+
+ case 0x9b: case 0xbb: case 0xdb: case 0xfb:
+ disassemble_op(stream, "xor", reg, src, imm, indir, idx, BIT(opcode, 5));
+ break;
+
+ case 0x9c: case 0xbc: case 0xdc: case 0xfc:
+ disassemble_op(stream, "ifeq", reg, src, imm, indir, idx, BIT(opcode, 5));
+ break;
+
+ case 0x9d: case 0xbd: case 0xdd: case 0xfd:
+ disassemble_op(stream, "ifgt", reg, src, imm, indir, idx, BIT(opcode, 5));
+ break;
+
+ case 0x9e: case 0xbe: case 0xde: case 0xfe:
+ disassemble_op(stream, "mult", reg, src, imm, indir, idx, BIT(opcode, 5));
+ break;
+
+ case 0x9f: case 0xbf: case 0xdf: case 0xff:
+ disassemble_op(stream, "div", reg, src, imm, indir, idx, BIT(opcode, 5));
+ break;
+
+ case 0xa7:
+ util::stream_format(stream, "%-8sBK,", "ld");
+ format_immediate_word(stream, src);
+ stream << ",";
+ format_immediate_word(stream, reg);
+ break;
+
+ case 0xaf:
+ util::stream_format(stream, "%-8s", "push");
+ format_register(stream, src);
+ break;
+
+ case 0xb4:
+ util::stream_format(stream, "%-8s", "jmpl");
+ if (jmp)
+ util::stream_format(stream, "0%X", src);
+ else
+ stream << "???";
+ break;
+
+ case 0xb5:
+ util::stream_format(stream, "%-8s", "jsrl");
+ if (jmp)
+ util::stream_format(stream, "0%X", src);
+ else
+ stream << "???";
+ bytes |= STEP_OVER;
+ break;
+
+ case 0xc0: case 0xc2:
+ case 0xe0: case 0xe2:
+ util::stream_format(stream, "%-8sA,[B%c].%c", "lds",
+ BIT(opcode, 1) ? '-' : '+',
+ BIT(opcode, 5) ? 'w' : 'b');
+ bytes |= STEP_OVER | (1 << OVERINSTSHIFT);
+ break;
+
+ case 0xd0: case 0xd2:
+ case 0xf0: case 0xf2:
+ util::stream_format(stream, "%-8sA,[X%c].%c", "ld",
+ BIT(opcode, 1) ? '-' : '+',
+ BIT(opcode, 5) ? 'w' : 'b');
+ break;
+
+ case 0xc1: case 0xc3:
+ case 0xe1: case 0xe3:
+ util::stream_format(stream, "%-8sA,[B%c].%c", "xs",
+ BIT(opcode, 1) ? '-' : '+',
+ BIT(opcode, 5) ? 'w' : 'b');
+ bytes |= STEP_OVER | (1 << OVERINSTSHIFT);
+ break;
+
+ case 0xd1: case 0xd3:
+ case 0xf1: case 0xf3:
+ util::stream_format(stream, "%-8sA,[X%c].%c", "x",
+ BIT(opcode, 1) ? '-' : '+',
+ BIT(opcode, 5) ? 'w' : 'b');
+ break;
+
+ case 0xc7: case 0xe7:
+ util::stream_format(stream, "%-8sA", BIT(opcode, 5) ? "shl" : "shr");
+ break;
+
+ case 0xd7: case 0xf7:
+ util::stream_format(stream, "%-8sA", BIT(opcode, 5) ? "rlc" : "rrc");
+ break;
+
+ case 0xc8: case 0xe8:
+ disassemble_op(stream, "adc", reg, src, imm, indir, idx, BIT(opcode, 5));
+ break;
+
+ case 0xc9: case 0xe9:
+ disassemble_op(stream, "dadc", reg, src, imm, indir, idx, BIT(opcode, 5));
+ break;
+
+ case 0xca: case 0xea:
+ disassemble_op(stream, "dsubc", reg, src, imm, indir, idx, BIT(opcode, 5));
+ break;
+
+ case 0xcb: case 0xeb:
+ disassemble_op(stream, "subc", reg, src, imm, indir, idx, BIT(opcode, 5));
+ break;
+
+ case 0xcc: case 0xec:
+ stream << "jid";
+ if (BIT(opcode, 5))
+ stream << "w";
+ break;
+
+ case 0xcf: case 0xef:
+ disassemble_op(stream, "divd", reg, src, imm, indir, idx, BIT(opcode, 5));
+ break;
+
+ default:
+ stream << "???";
+ break;
+ }
+
+ return bytes | SUPPORTED;
+}
diff --git a/src/devices/cpu/hpc/hpcdasm.h b/src/devices/cpu/hpc/hpcdasm.h
new file mode 100644
index 00000000000..ed57c6b1a35
--- /dev/null
+++ b/src/devices/cpu/hpc/hpcdasm.h
@@ -0,0 +1,58 @@
+// license:BSD-3-Clause
+// copyright-holders:AJR
+
+#ifndef MAME_CPU_HPC_HPCDASM_H
+#define MAME_CPU_HPC_HPCDASM_H
+
+#pragma once
+
+class hpc_disassembler : public util::disasm_interface
+{
+protected:
+ enum : u16
+ {
+ REGISTER_A = 0x00c8,
+ REGISTER_K = 0x00ca,
+ REGISTER_B = 0x00cc,
+ REGISTER_X = 0x00ce
+ };
+
+ // construction/destruction
+ hpc_disassembler(const char *const regs[]);
+
+ // disassembler overrides
+ virtual u32 opcode_alignment() const override;
+ virtual offs_t disassemble(std::ostream &stream, offs_t pc, const data_buffer &opcodes, const data_buffer &params) override;
+
+private:
+ // internal helpers
+ void format_register(std::ostream &stream, u16 reg) const;
+ void format_immediate_byte(std::ostream &stream, u8 data) const;
+ void format_immediate_word(std::ostream &stream, u16 data) const;
+ void disassemble_op(std::ostream &stream, const char *op, u16 reg, u16 src, bool imm, bool indir, bool idx, bool w) const;
+ void disassemble_unary_op(std::ostream &stream, const char *op, u16 offset, u16 src, bool indir, bool idx, bool w) const;
+ void disassemble_bit_op(std::ostream &stream, const char *op, u8 bit, u16 offset, u16 src, bool indir, bool idx) const;
+
+ // register names
+ const char *const *m_regs;
+};
+
+class hpc16083_disassembler : public hpc_disassembler
+{
+public:
+ hpc16083_disassembler() : hpc_disassembler(s_regs) { }
+
+private:
+ static const char *const s_regs[128];
+};
+
+class hpc16164_disassembler : public hpc_disassembler
+{
+public:
+ hpc16164_disassembler() : hpc_disassembler(s_regs) { }
+
+private:
+ static const char *const s_regs[128];
+};
+
+#endif // MAME_CPU_HPC_HPCDASM_H
diff --git a/src/devices/cpu/hphybrid/hphybrid.cpp b/src/devices/cpu/hphybrid/hphybrid.cpp
index 246804ec468..b9e7da6cc4e 100644
--- a/src/devices/cpu/hphybrid/hphybrid.cpp
+++ b/src/devices/cpu/hphybrid/hphybrid.cpp
@@ -175,6 +175,8 @@ uint8_t hp_hybrid_cpu_device::pa_r() const
hp_hybrid_cpu_device::hp_hybrid_cpu_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock, uint8_t addrwidth)
: cpu_device(mconfig, type, tag, owner, clock)
, m_pa_changed_func(*this)
+ , m_opcode_func(*this)
+ , m_stm_func(*this)
, m_addr_mask((1U << addrwidth) - 1)
, m_relative_mode(true)
, m_r_cycles(DEF_MEM_R_CYCLES)
@@ -241,6 +243,8 @@ void hp_hybrid_cpu_device::device_start()
set_icountptr(m_icount);
m_pa_changed_func.resolve_safe();
+ m_opcode_func.resolve_safe();
+ m_stm_func.resolve();
}
void hp_hybrid_cpu_device::device_reset()
@@ -260,6 +264,7 @@ void hp_hybrid_cpu_device::device_reset()
m_dmapa = 0;
m_dmama = 0;
m_dmac = 0;
+ m_curr_cycle = 0;
m_forced_bsc_25 = m_boot_mode;
m_last_pa = ~0;
@@ -312,7 +317,7 @@ uint16_t hp_hybrid_cpu_device::execute_one(uint16_t opcode)
}
// Indirect addressing in EXE instruction seems to use AEC case A instead of case C
// (because it's an opcode fetch)
- return RM(add_mae(AEC_CASE_A , fetch_addr));
+ return fetch_at(add_mae(AEC_CASE_A , fetch_addr));
} else {
uint16_t next_P;
if (!execute_one_bpc(opcode , next_P) &&
@@ -952,6 +957,11 @@ uint16_t hp_hybrid_cpu_device::RM(uint32_t addr)
// Any access to internal registers removes forcing of BSC 2x
m_forced_bsc_25 = false;
+ if (m_stm_func) {
+ m_stm_func(m_curr_cycle | CYCLE_RAL_MASK | CYCLE_RD_MASK);
+ m_curr_cycle = 0;
+ }
+
// Memory mapped BPC registers
uint16_t tmp;
switch (addr_wo_bsc) {
@@ -1016,6 +1026,10 @@ uint16_t hp_hybrid_cpu_device::RM(uint32_t addr)
return tmp;
} else {
m_icount -= m_r_cycles;
+ if (m_stm_func) {
+ m_stm_func(m_curr_cycle | CYCLE_RD_MASK);
+ m_curr_cycle = 0;
+ }
return m_cache->read_word(addr);
}
}
@@ -1065,6 +1079,11 @@ void hp_hybrid_cpu_device::WM(uint32_t addr , uint16_t v)
// Any access to internal registers removes forcing of BSC 2x
m_forced_bsc_25 = false;
+ if (m_stm_func) {
+ m_stm_func(m_curr_cycle | CYCLE_RAL_MASK | CYCLE_WR_MASK);
+ m_curr_cycle = 0;
+ }
+
// Memory mapped BPC registers
switch (addr_wo_bsc) {
case HP_REG_A_ADDR:
@@ -1130,6 +1149,10 @@ void hp_hybrid_cpu_device::WM(uint32_t addr , uint16_t v)
m_icount -= REGISTER_RW_CYCLES;
} else {
m_icount -= m_w_cycles;
+ if (m_stm_func) {
+ m_stm_func(m_curr_cycle | CYCLE_WR_MASK);
+ m_curr_cycle = 0;
+ }
m_program->write_word(addr , v);
}
}
@@ -1168,7 +1191,15 @@ bool hp_hybrid_cpu_device::write_emc_reg(uint16_t addr , uint16_t v)
uint16_t hp_hybrid_cpu_device::fetch()
{
m_genpc = add_mae(AEC_CASE_A , m_reg_P);
- return RM(m_genpc);
+ return fetch_at(m_genpc);
+}
+
+uint16_t hp_hybrid_cpu_device::fetch_at(uint32_t addr)
+{
+ m_curr_cycle |= CYCLE_IFETCH_MASK;
+ uint16_t opcode = RM(addr);
+ m_opcode_func(opcode);
+ return opcode;
}
uint16_t hp_hybrid_cpu_device::get_indirect_target(uint32_t addr)
@@ -1586,6 +1617,10 @@ bool hp_5061_3011_cpu_device::execute_no_bpc(uint16_t opcode , uint16_t& next_pc
// 16 bits units.
WM(tmp_addr >> 1 , tmp);
} else {
+ if (m_stm_func) {
+ m_stm_func(m_curr_cycle | CYCLE_WR_MASK);
+ m_curr_cycle = 0;
+ }
// Extend address, form byte address
uint16_t mask = BIT(tmp_addr , 0) ? 0x00ff : 0xff00;
tmp_addr = add_mae(AEC_CASE_C , tmp_addr >> 1);
@@ -1674,6 +1709,7 @@ void hp_5061_3011_cpu_device::handle_dma()
bool tc = BIT(--m_dmac , 15) != 0;
uint16_t tmp;
+ m_curr_cycle |= CYCLE_DMA_MASK;
// Timing here assumes that DMA transfers are isolated and not done in bursts
if (BIT(m_flags , HPHYBRID_DMADIR_BIT)) {
// "Outward" DMA: memory -> peripheral
@@ -1955,6 +1991,10 @@ bool hp_09825_67907_cpu_device::execute_no_bpc(uint16_t opcode , uint16_t& next_
// 16 bits units.
WM(tmp_addr , tmp);
} else {
+ if (m_stm_func) {
+ m_stm_func(m_curr_cycle | CYCLE_WR_MASK);
+ m_curr_cycle = 0;
+ }
uint16_t mask = BIT(*ptr_reg , 15) ? 0xff00 : 0x00ff;
m_program->write_word(tmp_addr , tmp , mask);
m_icount -= m_w_cycles;
@@ -2037,6 +2077,7 @@ void hp_09825_67907_cpu_device::handle_dma()
uint16_t tmp;
// Timing here assumes that DMA transfers are isolated and not done in bursts
+ m_curr_cycle |= CYCLE_DMA_MASK;
if (BIT(m_dmama , 15)) {
// "Outward" DMA: memory -> peripheral
tmp = RM(AEC_CASE_D , m_dmama);
diff --git a/src/devices/cpu/hphybrid/hphybrid.h b/src/devices/cpu/hphybrid/hphybrid.h
index 5d29f77b515..5059e114bb7 100644
--- a/src/devices/cpu/hphybrid/hphybrid.h
+++ b/src/devices/cpu/hphybrid/hphybrid.h
@@ -64,6 +64,29 @@ public:
void set_relative_mode(bool rela) { m_relative_mode = rela; }
void set_rw_cycles(unsigned read_cycles , unsigned write_cycles) { m_r_cycles = read_cycles; m_w_cycles = write_cycles; }
+ // Possible combinations:
+ // 00 No r/w cycle in progress
+ // 01 Non-ifetch rd cycle
+ // 05 Ifetch rd cycle
+ // 09 DMA rd cycle
+ // 02 Wr cycle
+ // 0a DMA wr cycle
+ //
+ // CYCLE_RAL_MASK is set when access is into register space [0..1f]
+ enum : uint8_t {
+ CYCLE_RD_MASK = 0x01,
+ CYCLE_WR_MASK = 0x02,
+ CYCLE_IFETCH_MASK = 0x04,
+ CYCLE_DMA_MASK = 0x08,
+ CYCLE_RAL_MASK = 0x10
+ };
+
+ // Called at start of each memory access
+ auto stm_cb() { return m_stm_func.bind(); }
+
+ // Tap into fetched opcodes
+ auto opcode_cb() { return m_opcode_func.bind(); }
+
protected:
hp_hybrid_cpu_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock, uint8_t addrwidth);
@@ -123,6 +146,7 @@ protected:
void WIO(uint8_t pa , uint8_t ic , uint16_t v);
uint16_t fetch();
+ uint16_t fetch_at(uint32_t addr);
virtual uint16_t get_indirect_target(uint32_t addr);
virtual void enter_isr();
virtual void handle_dma() = 0;
@@ -133,6 +157,8 @@ protected:
devcb_write8 m_pa_changed_func;
uint8_t m_last_pa;
+ devcb_write16 m_opcode_func;
+ devcb_write8 m_stm_func;
int m_icount;
uint32_t m_addr_mask;
@@ -159,6 +185,8 @@ protected:
uint16_t m_dmac; // DMA counter
uint16_t m_reg_I; // Instruction register
uint32_t m_genpc; // Full PC
+ uint8_t m_curr_cycle; // Current cycle type
+
// EMC registers
uint16_t m_reg_ar2[ 4 ]; // AR2 register
uint16_t m_reg_se; // SE register (4 bits)
diff --git a/src/devices/cpu/i386/cache.h b/src/devices/cpu/i386/cache.h
new file mode 100644
index 00000000000..a04f2cacf2e
--- /dev/null
+++ b/src/devices/cpu/i386/cache.h
@@ -0,0 +1,258 @@
+// license:BSD-3-Clause
+// copyright-holders:Samuele Zannoli
+
+#ifndef MAME_CPU_I386_CACHE_H
+#define MAME_CPU_I386_CACHE_H
+
+#pragma once
+
+/* To test it outside of Mame
+#include <cstdlib>
+
+typedef unsigned char u8;
+typedef unsigned int u32;
+*/
+
+enum {
+ CacheLineBytes16 = 4,
+ CacheLineBytes32 = 5,
+ CacheLineBytes64 = 6,
+ CacheLineBytes128 = 7,
+ CacheLineBytes256 = 8,
+};
+
+enum {
+ CacheDirectMapped = 0,
+ Cache2Way = 1,
+ Cache4Way = 2,
+ Cache8Way = 3,
+ Cache16Way = 4
+};
+
+enum {
+ CacheRead = 0,
+ CacheWrite = 1
+};
+
+template<int TagBits, int SetBits, int WayBits, int LineBits>
+class cpucache {
+public:
+ // Constructor
+ cpucache();
+ // Reset the cache
+ void reset();
+ // Find the cacheline containing data at address
+ template <int ReadWrite> u8* search(u32 address);
+ // Allocate a cacheline for data at address
+ template <int ReadWrite> bool allocate(u32 address, u8 **data);
+ // Get the address where the cacheline data should be written back to
+ u32 old();
+ // Get the address of the first byte of the cacheline that contains data at address
+ u32 base(u32 address);
+ // Compose the cacheline parameters into an address
+ u32 address(u32 tag, u32 set, u32 offset);
+ // Get the data of the first cacheline marked as dirty
+ u8* first_dirty(u32 &base, bool clean);
+ // Get the data of the next cacheline marked as dirty
+ u8* next_dirty(u32 &base, bool clean);
+
+private:
+ static const int Ways = 1 << WayBits;
+ static const int LineBytes = 1 << LineBits;
+ static const int Sets = 1 << SetBits;
+ static const u32 LineMask = (1 << LineBits) - 1;
+ static const u32 SetMask = ((1 << SetBits) - 1) << LineBits;
+ static const u32 WayMask = (1 << WayBits) - 1;
+ static const int TagShift = LineBits + SetBits;
+
+ struct cacheline {
+ u8 data[LineBytes];
+ bool allocated;
+ bool dirty;
+ u32 tag;
+ u32 debug_address;
+ };
+
+ struct cacheset {
+ cacheline lines[Ways];
+ int nextway;
+ };
+
+ cacheset sets[Sets];
+ u32 writeback_base;
+ int last_set;
+ int last_way;
+};
+
+template<int TagBits, int SetBits, int WayBits, int LineBits>
+cpucache<TagBits, SetBits, WayBits, LineBits>::cpucache()
+{
+ reset();
+}
+
+template<int TagBits, int SetBits, int WayBits, int LineBits>
+void cpucache<TagBits, SetBits, WayBits, LineBits>::reset()
+{
+ for (int s = 0; s < Sets; s++)
+ for (int w = 0; w < Ways; w++)
+ {
+ sets[s].nextway = 0;
+ sets[s].lines[w].allocated = false;
+ sets[s].lines[w].dirty = false;
+ sets[s].lines[w].debug_address = 0;
+ }
+ last_set = -1;
+ last_way = -1;
+}
+
+template<int TagBits, int SetBits, int WayBits, int LineBits>
+template<int ReadWrite>
+u8* cpucache<TagBits, SetBits, WayBits, LineBits>::search(u32 address)
+{
+ const int addresset = (address & SetMask) >> LineBits;
+ const int addrestag = address >> TagShift;
+
+ for (int w = 0; w < Ways; w++)
+ if ((sets[addresset].lines[w].allocated) && (sets[addresset].lines[w].tag == addrestag))
+ {
+ if (ReadWrite != 0)
+ sets[addresset].lines[w].dirty = true;
+ return sets[addresset].lines[w].data;
+ }
+ return nullptr;
+}
+
+template<int TagBits, int SetBits, int WayBits, int LineBits>
+template<int ReadWrite>
+bool cpucache<TagBits, SetBits, WayBits, LineBits>::allocate(u32 address, u8 **data)
+{
+ const int addresset = (address & SetMask) >> LineBits;
+ const int addrestag = address >> TagShift;
+ const int victimway = sets[addresset].nextway;
+ bool old_allocated, old_dirty;
+ bool ret;
+
+ sets[addresset].nextway = (victimway + 1) & WayMask; // decide wich way will be allocated next
+ old_allocated = sets[addresset].lines[victimway].allocated;
+ old_dirty = sets[addresset].lines[victimway].dirty;
+ writeback_base = (sets[addresset].lines[victimway].tag << TagShift) | (address & SetMask);
+ sets[addresset].lines[victimway].tag = addrestag;
+ sets[addresset].lines[victimway].allocated = true;
+ if (ReadWrite == 0)
+ sets[addresset].lines[victimway].dirty = false; // caller must write back the cacheline if told so
+ else
+ sets[addresset].lines[victimway].dirty = true; // line is allocated to write into it
+ *data = sets[addresset].lines[victimway].data;
+ sets[addresset].lines[victimway].debug_address = address;
+ ret = old_allocated; // ret = old_allocated && old_dirty
+ if (!old_dirty)
+ ret = false;
+ return ret; // true if caller must write back the cacheline
+}
+
+template<int TagBits, int SetBits, int WayBits, int LineBits>
+u32 cpucache<TagBits, SetBits, WayBits, LineBits>::old()
+{
+ return writeback_base;
+}
+
+template<int TagBits, int SetBits, int WayBits, int LineBits>
+u32 cpucache<TagBits, SetBits, WayBits, LineBits>::base(u32 address)
+{
+ return address & ~LineMask;
+}
+
+template<int TagBits, int SetBits, int WayBits, int LineBits>
+u32 cpucache<TagBits, SetBits, WayBits, LineBits>::address(u32 tag, u32 set, u32 offset)
+{
+ return (tag << TagShift) | (set << LineBits) | offset;
+}
+
+template<int TagBits, int SetBits, int WayBits, int LineBits>
+u8* cpucache<TagBits, SetBits, WayBits, LineBits>::first_dirty(u32 &base, bool clean)
+{
+ for (int s = 0; s < Sets; s++)
+ for (int w = 0; w < Ways; w++)
+ if (sets[s].lines[w].dirty == true)
+ {
+ if (clean)
+ sets[s].lines[w].dirty = false;
+ last_set = s;
+ last_way = w;
+ base = address(sets[s].lines[w].tag, s, 0);
+ return sets[s].lines[w].data;
+ }
+ return nullptr;
+}
+
+template<int TagBits, int SetBits, int WayBits, int LineBits>
+u8* cpucache<TagBits, SetBits, WayBits, LineBits>::next_dirty(u32 &base, bool clean)
+{
+ if (last_set < 0)
+ return nullptr;
+ while (true)
+ {
+ last_way++;
+ if (last_way == Ways)
+ {
+ last_way = 0;
+ last_set++;
+ if (last_set == Sets)
+ {
+ last_set = -1;
+ last_way = -1;
+ return nullptr;
+ }
+ }
+ if (sets[last_set].lines[last_way].dirty == true)
+ {
+ if (clean)
+ sets[last_set].lines[last_way].dirty = false;
+ base = address(sets[last_set].lines[last_way].tag, last_set, 0);
+ return sets[last_set].lines[last_way].data;
+ }
+ }
+}
+
+#endif
+
+/* To test it outside of Mame
+const int memorysize = 256 * 1024;
+u8 memory[memorysize];
+
+void readline(u8 *data, u32 address)
+{
+ for (int n = 0; n < 64; n++)
+ data[n] = memory[address + n];
+}
+
+void writeline(u8 *data, u32 address)
+{
+ for (int n = 0; n < 64; n++)
+ memory[address + n] = data[n];
+}
+
+void cache_tester()
+{
+ cpucache<18, 8, 6, 2> cache;
+ bool r;
+ u8 *data;
+ int address;
+ u8 value;
+
+ for (int n = 0; n < memorysize; n++)
+ memory[n] = 0xaa ^ n;
+ address = std::rand() & (memorysize - 1);
+ r = cache.search(address, &data);
+ if (r == false)
+ {
+ r = cache.allocate(address, &data);
+ if (r == true)
+ writeline(data, cache.base(address));
+ readline(data, cache.base(address));
+ }
+ value = data[address & 63];
+ if (value != memory[address])
+ printf("Error reading address %d\n\r", address);
+}
+*/
diff --git a/src/devices/cpu/i386/cpuidmsrs.hxx b/src/devices/cpu/i386/cpuidmsrs.hxx
index e7abcf27154..842ff85b4b2 100644
--- a/src/devices/cpu/i386/cpuidmsrs.hxx
+++ b/src/devices/cpu/i386/cpuidmsrs.hxx
@@ -1,3 +1,5 @@
+// license:BSD-3-Clause
+// copyright-holders:Ville Linde, Barry Rodewald, Carl, Philip Bennett, Samuele Zannoli
uint64_t pentium_device::opcode_rdmsr(bool &valid_msr)
{
@@ -253,49 +255,85 @@ void athlonxp_device::opcode_cpuid()
uint64_t athlonxp_device::opcode_rdmsr(bool &valid_msr)
{
+ uint64_t ret;
uint32_t offset = REG32(ECX);
+ ret = 0;
switch (offset)
{
case 0x10: // TSC
break;
case 0x1b: // APIC_BASE
break;
+ case 0xfe: // MTRRcap
+ // 7-0 MTRRCapVCnt - Number of variable range MTRRs (8)
+ // 8 MtrrCapFix - Fixed range MTRRs available (1)
+ // 10 MtrrCapWc - Write combining memory type available (1)
+ ret = 0x508;
+ break;
case 0x17b: // MCG_CTL
break;
case 0x200: // MTRRphysBase0-7
- case 0x201: // MTRRphysMask0-7
case 0x202:
- case 0x203:
case 0x204:
- case 0x205:
case 0x206:
- case 0x207:
case 0x208:
- case 0x209:
case 0x20a:
- case 0x20b:
case 0x20c:
- case 0x20d:
case 0x20e:
+ // 7-0 Type - Memory type for this memory range
+ // 39-12 PhyBase27-0 - Base address for this memory range
+ /* Format of type field:
+ Bits 2-0 specify the memory type with the following encoding
+ 0 UC Uncacheable
+ 1 WC Write Combining
+ 4 WT Write Through
+ 5 WP Write Protect
+ 6 WB Write Back
+ 7 UC Uncacheable used only in PAT register
+ Bit 3 WrMem 1 write to memory 0 write to mmio, present only in fixed range MTRRs
+ Bit 4 RdMem 1 read from memory 0 read from mmio, present only in fixed range MTRRs
+ Other bits are unused
+ */
+ break;
+ case 0x201: // MTRRphysMask0-7
+ case 0x203:
+ case 0x205:
+ case 0x207:
+ case 0x209:
+ case 0x20b:
+ case 0x20d:
case 0x20f:
+ // 11 Valid - Memory range active
+ // 39-12 PhyMask27-0 - Address mask
break;
case 0x2ff: // MTRRdefType
+ // 7-0 MtrrDefMemType - Default memory type
+ // 10 MtrrDefTypeFixEn - Enable fixed range MTRRs
+ // 11 MtrrDefTypeEn - Enable MTRRs
break;
case 0x250: // MTRRfix64K_00000
+ // 8 bits for each 64k block starting at address 0
+ ret = m_msr_mtrrfix[0];
break;
case 0x258: // MTRRfix16K_80000
+ // 8 bits for each 16k block starting at address 0x80000
+ ret = m_msr_mtrrfix[1];
break;
case 0x259: // MTRRfix16K_A0000
- break;
- case 0x268: // MTRRfix4K_C0000-F8000
- case 0x269:
- case 0x26a:
- case 0x26b:
- case 0x26c:
- case 0x26d:
- case 0x26e:
- case 0x26f:
+ // 8 bits for each 16k block starting at address 0xa0000
+ ret = m_msr_mtrrfix[2];
+ break;
+ case 0x268: // MTRRfix4K_C0000
+ case 0x269: // MTRRfix4K_C8000
+ case 0x26a: // MTRRfix4K_D0000
+ case 0x26b: // MTRRfix4K_D8000
+ case 0x26c: // MTRRfix4K_E0000
+ case 0x26d: // MTRRfix4K_E8000
+ case 0x26e: // MTRRfix4K_F0000
+ case 0x26f: // MTRRfix4K_F8000
+ // 8 bits for each 4k block
+ ret = m_msr_mtrrfix[3 + offset - 0x268];
break;
case 0x400: // MC0_CTL
break;
@@ -306,15 +344,25 @@ uint64_t athlonxp_device::opcode_rdmsr(bool &valid_msr)
case 0x40c: // MC3_CTL
break;
case 0xC0010010: // SYS_CFG
+ // 20 MtrrVarDramEn - Enable top of memory address and I/O range registers
+ // 19 MtrrFixDramModEn - Enable modification of RdDram and WrDram bits in fixed MTRRs
+ // 18 MtrrFixDramEn - Enable RdDram and WrDram attributes in fixed MTRRs
break;
case 0xC0010015: // HWCR
break;
- case 0xC0010016: // IORRBase
- case 0xC0010017: // IORRMask
+ case 0xC0010016: // IORRBase0-1
case 0xC0010018:
+ // 39-12 Base27-0 - Base address for this memory range
+ // 4 RdDram - Read from DRAM
+ // 3 WrDram - Write to DRAM
+ break;
+ case 0xC0010017: // IORRMask0-1
case 0xC0010019:
+ // 39-12 Mask27-0 - Address mask
+ // 11 V - Register enabled
break;
case 0xC001001A: // TOP_MEM
+ // 39-23 TOM16-0 - Top of Memory, accesses from this address onward are directed to mmio
break;
case 0xC001001D: // TOP_MEM2
break;
@@ -322,7 +370,7 @@ uint64_t athlonxp_device::opcode_rdmsr(bool &valid_msr)
break;
}
valid_msr = true;
- return 0;
+ return ret;
}
void athlonxp_device::opcode_wrmsr(uint64_t data, bool &valid_msr)
@@ -355,10 +403,16 @@ void athlonxp_device::opcode_wrmsr(uint64_t data, bool &valid_msr)
case 0x2ff: // MTRRdefType
break;
case 0x250: // MTRRfix64K_00000
+ m_msr_mtrrfix[0] = data;
+ parse_mtrrfix(data, 0, 64);
break;
case 0x258: // MTRRfix16K_80000
+ m_msr_mtrrfix[1] = data;
+ parse_mtrrfix(data, 0x80000, 16);
break;
case 0x259: // MTRRfix16K_A0000
+ m_msr_mtrrfix[2] = data;
+ parse_mtrrfix(data, 0xa0000, 16);
break;
case 0x268: // MTRRfix4K_C0000-F8000
case 0x269:
@@ -368,6 +422,8 @@ void athlonxp_device::opcode_wrmsr(uint64_t data, bool &valid_msr)
case 0x26d:
case 0x26e:
case 0x26f:
+ m_msr_mtrrfix[3 + offset - 0x268] = data;
+ parse_mtrrfix(data, 0xc0000 + (offset - 0x268) * 0x8000, 4);
break;
case 0x400: // MC0_CTL
break;
diff --git a/src/devices/cpu/i386/i386.cpp b/src/devices/cpu/i386/i386.cpp
index a4408c69175..f372dba1239 100644
--- a/src/devices/cpu/i386/i386.cpp
+++ b/src/devices/cpu/i386/i386.cpp
@@ -3367,15 +3367,10 @@ void i386_device::i386_common_init()
m_program = &space(AS_PROGRAM);
if(m_program->data_width() == 16) {
- auto cache = m_program->cache<1, 0, ENDIANNESS_LITTLE>();
- m_pr8 = [cache](offs_t address) -> u8 { return cache->read_byte(address); };
- m_pr16 = [cache](offs_t address) -> u16 { return cache->read_word(address); };
- m_pr32 = [cache](offs_t address) -> u32 { return cache->read_dword(address); };
+ // for the 386sx
+ macache16 = m_program->cache<1, 0, ENDIANNESS_LITTLE>();
} else {
- auto cache = m_program->cache<2, 0, ENDIANNESS_LITTLE>();
- m_pr8 = [cache](offs_t address) -> u8 { return cache->read_byte(address); };
- m_pr16 = [cache](offs_t address) -> u16 { return cache->read_word(address); };
- m_pr32 = [cache](offs_t address) -> u32 { return cache->read_dword(address); };
+ macache32 = m_program->cache<2, 0, ENDIANNESS_LITTLE>();
}
m_io = &space(AS_IO);
@@ -4726,6 +4721,10 @@ void athlonxp_device::device_reset()
m_cpuid_id2 = ('D' << 24) | ('M' << 16) | ('A' << 8) | 'c'; // cAMD
memset(m_processor_name_string, 0, 48);
strcpy((char *)m_processor_name_string, "AMD Athlon(tm) Processor");
+ for (int n = 0; n < 11; n++)
+ m_msr_mtrrfix[n] = 0;
+ for (int n = 0; n < (1024 / 4); n++)
+ m_memory_ranges_1m[n] = 0; // change the 0 to 6 to test the cache just after reset
m_cpuid_max_input_value_eax = 0x01;
m_cpu_version = REG32(EDX);
@@ -4736,6 +4735,227 @@ void athlonxp_device::device_reset()
CHANGE_PC(m_eip);
}
+void athlonxp_device::parse_mtrrfix(u64 mtrr, offs_t base, int kblock)
+{
+ int nb = kblock / 4;
+ int range = (int)(base >> 12); // base must never be higher than 1 megabyte
+
+ for (int n = 0; n < 8; n++)
+ {
+ uint8_t type = mtrr & 0xff;
+
+ for (int b = 0; b < nb; b++)
+ {
+ m_memory_ranges_1m[range] = type;
+ range++;
+ }
+ mtrr = mtrr >> 8;
+ }
+}
+
+int athlonxp_device::check_cacheable(offs_t address)
+{
+ offs_t block;
+ int disabled;
+
+ disabled = 0;
+ if (m_cr[0] & (1 << 30))
+ disabled = 128;
+ if (address >= 0x100000)
+ return disabled;
+ block = address >> 12;
+ return m_memory_ranges_1m[block] | disabled;
+}
+
+template <class dt, offs_t xorle>
+dt athlonxp_device::opcode_read_cache(offs_t address)
+{
+ int mode = check_cacheable(address);
+ bool nocache = false;
+ u8 *data;
+
+ if ((mode & 7) == 0)
+ nocache = true;
+ if (mode & 1)
+ nocache = true;
+ if (nocache == false)
+ {
+ int offset = (address & 63) ^ xorle;
+ data = cache.search<CacheRead>(address);
+ if (data)
+ return *(dt *)(data + offset);
+ if (!(mode & 128))
+ {
+ bool dirty = cache.allocate<CacheRead>(address, &data);
+ address = cache.base(address);
+ if (dirty)
+ {
+ offs_t old_address = cache.old();
+
+ for (int w = 0; w < 64; w += 4)
+ macache32->write_dword(old_address + w, *(u32 *)(data + w));
+ }
+ for (int r = 0; r < 64; r += 4)
+ *(u32 *)(data + r) = macache32->read_dword(address + r);
+ return *(dt *)(data + offset);
+ }
+ else
+ {
+ if (sizeof(dt) == 1)
+ return macache32->read_byte(address);
+ else if (sizeof(dt) == 2)
+ return macache32->read_word(address);
+ else
+ return macache32->read_dword(address);
+ }
+ }
+ else
+ {
+ if (sizeof(dt) == 1)
+ return macache32->read_byte(address);
+ else if (sizeof(dt) == 2)
+ return macache32->read_word(address);
+ else
+ return macache32->read_dword(address);
+ }
+}
+
+template <class dt, offs_t xorle>
+dt athlonxp_device::program_read_cache(offs_t address)
+{
+ int mode = check_cacheable(address);
+ bool nocache = false;
+ u8 *data;
+
+ if ((mode & 7) == 0)
+ nocache = true;
+ if (mode & 1)
+ nocache = true;
+ if (nocache == false)
+ {
+ int offset = (address & 63) ^ xorle;
+ data = cache.search<CacheRead>(address);
+ if (data)
+ return *(dt *)(data + offset);
+ if (!(mode & 128))
+ {
+ bool dirty = cache.allocate<CacheRead>(address, &data);
+ address = cache.base(address);
+ if (dirty)
+ {
+ offs_t old_address = cache.old();
+
+ for (int w = 0; w < 64; w += 4)
+ m_program->write_dword(old_address + w, *(u32 *)(data + w));
+ }
+ for (int r = 0; r < 64; r += 4)
+ *(u32 *)(data + r) = m_program->read_dword(address + r);
+ return *(dt *)(data + offset);
+ }
+ else
+ {
+ if (sizeof(dt) == 1)
+ return m_program->read_byte(address);
+ else if (sizeof(dt) == 2)
+ return m_program->read_word(address);
+ else
+ return m_program->read_dword(address);
+ }
+ }
+ else
+ {
+ if (sizeof(dt) == 1)
+ return m_program->read_byte(address);
+ else if (sizeof(dt) == 2)
+ return m_program->read_word(address);
+ else
+ return m_program->read_dword(address);
+ }
+}
+
+template <class dt, offs_t xorle>
+void athlonxp_device::program_write_cache(offs_t address, dt data)
+{
+ int mode = check_cacheable(address);
+ bool nocache = false;
+ u8 *dataw;
+
+ if ((mode & 7) == 0)
+ nocache = true;
+ if (mode & 1)
+ nocache = true;
+ if (nocache == false)
+ {
+ int offset = (address & 63) ^ xorle;
+ dataw = cache.search<CacheWrite>(address);
+ if (dataw)
+ {
+ *(dt *)(dataw + offset) = data;
+ return;
+ }
+ if (!(mode & 128))
+ {
+ bool dirty = cache.allocate<CacheWrite>(address, &dataw);
+ address = cache.base(address);
+ if (dirty)
+ {
+ offs_t old_address = cache.old();
+
+ for (int w = 0; w < 64; w += 4)
+ m_program->write_dword(old_address + w, *(u32 *)(dataw + w));
+ }
+ for (int r = 0; r < 64; r += 4)
+ *(u32 *)(dataw + r) = m_program->read_dword(address + r);
+ *(dt *)(dataw + offset) = data;
+ }
+ else
+ {
+ if (sizeof(dt) == 1)
+ m_program->write_byte(address, data);
+ else if (sizeof(dt) == 2)
+ m_program->write_word(address, data);
+ else
+ m_program->write_dword(address, data);
+ }
+ }
+ else
+ {
+ if (sizeof(dt) == 1)
+ m_program->write_byte(address, data);
+ else if (sizeof(dt) == 2)
+ m_program->write_word(address, data);
+ else
+ m_program->write_dword(address, data);
+ }
+}
+
+void athlonxp_device::invalidate_cache(bool writeback)
+{
+ u32 base;
+ u8 *data;
+
+ data = cache.first_dirty(base, true);
+ while (data != nullptr)
+ {
+ if (writeback)
+ for (int w = 0; w < 64; w += 4)
+ m_program->write_dword(base + w, *(u32 *)(data + w));
+ data = cache.next_dirty(base, true);
+ }
+ cache.reset();
+}
+
+void athlonxp_device::opcode_invd()
+{
+ invalidate_cache(false);
+}
+
+void athlonxp_device::opcode_wbinvd()
+{
+ invalidate_cache(true);
+}
+
+
/*****************************************************************************/
/* Intel Pentium 4 */
diff --git a/src/devices/cpu/i386/i386.h b/src/devices/cpu/i386/i386.h
index e7a460488c0..90aab9f0667 100644
--- a/src/devices/cpu/i386/i386.h
+++ b/src/devices/cpu/i386/i386.h
@@ -16,6 +16,7 @@
#include "divtlb.h"
#include "i386dasm.h"
+#include "cache.h"
#define INPUT_LINE_A20 1
#define INPUT_LINE_SMI 2
@@ -71,10 +72,24 @@ protected:
virtual int get_mode() const override;
// routines for opcodes whose operation can vary between cpu models
- // default implementations just log an error message
+ // default implementations usually just log an error message
virtual void opcode_cpuid();
virtual uint64_t opcode_rdmsr(bool &valid_msr);
virtual void opcode_wrmsr(uint64_t data, bool &valid_msr);
+ virtual void opcode_invd() {}
+ virtual void opcode_wbinvd() {}
+
+ // routine to access memory
+ virtual u8 mem_pr8(offs_t address) { return macache32->read_byte(address); }
+ virtual u16 mem_pr16(offs_t address) { return macache32->read_word(address); }
+ virtual u32 mem_pr32(offs_t address) { return macache32->read_dword(address); }
+
+ virtual u8 mem_prd8(offs_t address) { return m_program->read_byte(address); }
+ virtual u16 mem_prd16(offs_t address) { return m_program->read_word(address); }
+ virtual u32 mem_prd32(offs_t address) { return m_program->read_dword(address); }
+ virtual void mem_pwd8(offs_t address, u8 data) { m_program->write_byte(address, data); }
+ virtual void mem_pwd16(offs_t address, u16 data) { m_program->write_word(address, data); }
+ virtual void mem_pwd32(offs_t address, u32 data) { m_program->write_dword(address, data); }
address_space_config m_program_config;
address_space_config m_io_config;
@@ -280,11 +295,10 @@ protected:
uint8_t m_irq_state;
address_space *m_program;
- std::function<u8 (offs_t)> m_pr8;
- std::function<u16 (offs_t)> m_pr16;
- std::function<u32 (offs_t)> m_pr32;
address_space *m_io;
uint32_t m_a20_mask;
+ memory_access_cache<1, 0, ENDIANNESS_LITTLE> *macache16;
+ memory_access_cache<2, 0, ENDIANNESS_LITTLE> *macache32;
int m_cpuid_max_input_value_eax; // Highest CPUID standard function available
uint32_t m_cpuid_id0, m_cpuid_id1, m_cpuid_id2;
@@ -1495,8 +1509,12 @@ class i386sx_device : public i386_device
public:
// construction/destruction
i386sx_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
-};
+protected:
+ virtual u8 mem_pr8(offs_t address) override { return macache16->read_byte(address); };
+ virtual u16 mem_pr16(offs_t address) override { return macache16->read_word(address); };
+ virtual u32 mem_pr32(offs_t address) override { return macache16->read_dword(address); };
+};
class i486_device : public i386_device
{
@@ -1614,10 +1632,34 @@ protected:
virtual void opcode_cpuid() override;
virtual uint64_t opcode_rdmsr(bool &valid_msr) override;
virtual void opcode_wrmsr(uint64_t data, bool &valid_msr) override;
+ virtual void opcode_invd() override;
+ virtual void opcode_wbinvd() override;
virtual void device_start() override;
virtual void device_reset() override;
+ virtual u8 mem_pr8(offs_t address) override { return opcode_read_cache<u8, NATIVE_ENDIAN_VALUE_LE_BE(0, 3)>(address); }
+ virtual u16 mem_pr16(offs_t address) override { return opcode_read_cache<u16, NATIVE_ENDIAN_VALUE_LE_BE(0, 2)>(address); }
+ virtual u32 mem_pr32(offs_t address) override { return opcode_read_cache<u32, 0>(address); }
+ virtual u8 mem_prd8(offs_t address) override { return program_read_cache<u8, NATIVE_ENDIAN_VALUE_LE_BE(0, 3)>(address); }
+ virtual u16 mem_prd16(offs_t address) override { return program_read_cache<u16, NATIVE_ENDIAN_VALUE_LE_BE(0, 2)>(address); }
+ virtual u32 mem_prd32(offs_t address) override { return program_read_cache<u32, 0>(address); }
+ virtual void mem_pwd8(offs_t address, u8 data) override { program_write_cache<u8, NATIVE_ENDIAN_VALUE_LE_BE(0, 3)>(address, data); }
+ virtual void mem_pwd16(offs_t address, u16 data) override { program_write_cache<u16, NATIVE_ENDIAN_VALUE_LE_BE(0, 2)>(address, data); }
+ virtual void mem_pwd32(offs_t address, u32 data) override { program_write_cache<u32, 0>(address, data); }
+
+private:
+ void parse_mtrrfix(u64 mtrr, offs_t base, int kblock);
+ int check_cacheable(offs_t address);
+ void invalidate_cache(bool writeback);
+
+ template <class dt, offs_t xorle> dt opcode_read_cache(offs_t address);
+ template <class dt, offs_t xorle> dt program_read_cache(offs_t address);
+ template <class dt, offs_t xorle> void program_write_cache(offs_t address, dt data);
+
uint8_t m_processor_name_string[48];
+ uint64_t m_msr_mtrrfix[11];
+ uint8_t m_memory_ranges_1m[1024 / 4];
+ cpucache<17, 9, Cache2Way, CacheLineBytes64> cache; // 512 sets, 2 ways (cachelines per set), 64 bytes per cacheline
};
diff --git a/src/devices/cpu/i386/i386priv.h b/src/devices/cpu/i386/i386priv.h
index 954e49ee6c7..0343cf74ef1 100644
--- a/src/devices/cpu/i386/i386priv.h
+++ b/src/devices/cpu/i386/i386priv.h
@@ -386,7 +386,7 @@ uint8_t i386_device::FETCH()
if(!translate_address(m_CPL,TRANSLATE_FETCH,&address,&error))
PF_THROW(error);
- value = m_pr8(address & m_a20_mask);
+ value = mem_pr8(address & m_a20_mask);
#ifdef DEBUG_MISSING_OPCODE
m_opcode_bytes[m_opcode_bytes_length] = value;
m_opcode_bytes_length = (m_opcode_bytes_length + 1) & 15;
@@ -407,7 +407,7 @@ uint16_t i386_device::FETCH16()
if(!translate_address(m_CPL,TRANSLATE_FETCH,&address,&error))
PF_THROW(error);
address &= m_a20_mask;
- value = m_pr16(address);
+ value = mem_pr16(address);
m_eip += 2;
m_pc += 2;
}
@@ -428,7 +428,7 @@ uint32_t i386_device::FETCH32()
PF_THROW(error);
address &= m_a20_mask;
- value = m_pr32(address);
+ value = mem_pr32(address);
m_eip += 4;
m_pc += 4;
}
@@ -443,7 +443,7 @@ uint8_t i386_device::READ8(uint32_t ea)
PF_THROW(error);
address &= m_a20_mask;
- return m_program->read_byte(address);
+ return mem_prd8(address);
}
uint16_t i386_device::READ16(uint32_t ea)
{
@@ -458,7 +458,7 @@ uint16_t i386_device::READ16(uint32_t ea)
PF_THROW(error);
address &= m_a20_mask;
- value = m_program->read_word( address );
+ value = mem_prd16( address );
}
return value;
}
@@ -477,7 +477,7 @@ uint32_t i386_device::READ32(uint32_t ea)
PF_THROW(error);
address &= m_a20_mask;
- value = m_program->read_dword( address );
+ value = mem_prd32( address );
}
return value;
}
@@ -501,8 +501,8 @@ uint64_t i386_device::READ64(uint32_t ea)
PF_THROW(error);
address &= m_a20_mask;
- value = (((uint64_t) m_program->read_dword( address+0 )) << 0);
- value |= (((uint64_t) m_program->read_dword( address+4 )) << 32);
+ value = (((uint64_t) mem_prd32( address+0 )) << 0);
+ value |= (((uint64_t) mem_prd32( address+4 )) << 32);
}
return value;
}
@@ -514,7 +514,7 @@ uint8_t i386_device::READ8PL0(uint32_t ea)
PF_THROW(error);
address &= m_a20_mask;
- return m_program->read_byte(address);
+ return mem_prd8(address);
}
uint16_t i386_device::READ16PL0(uint32_t ea)
{
@@ -529,7 +529,7 @@ uint16_t i386_device::READ16PL0(uint32_t ea)
PF_THROW(error);
address &= m_a20_mask;
- value = m_program->read_word( address );
+ value = mem_prd16( address );
}
return value;
}
@@ -549,7 +549,7 @@ uint32_t i386_device::READ32PL0(uint32_t ea)
PF_THROW(error);
address &= m_a20_mask;
- value = m_program->read_dword( address );
+ value = mem_prd32( address );
}
return value;
}
@@ -569,7 +569,7 @@ void i386_device::WRITE8(uint32_t ea, uint8_t value)
PF_THROW(error);
address &= m_a20_mask;
- m_program->write_byte(address, value);
+ mem_pwd8(address, value);
}
void i386_device::WRITE16(uint32_t ea, uint16_t value)
{
@@ -583,7 +583,7 @@ void i386_device::WRITE16(uint32_t ea, uint16_t value)
PF_THROW(error);
address &= m_a20_mask;
- m_program->write_word(address, value);
+ mem_pwd16(address, value);
}
}
void i386_device::WRITE32(uint32_t ea, uint32_t value)
@@ -600,7 +600,7 @@ void i386_device::WRITE32(uint32_t ea, uint32_t value)
PF_THROW(error);
ea &= m_a20_mask;
- m_program->write_dword(address, value);
+ mem_pwd32(address, value);
}
}
@@ -622,8 +622,8 @@ void i386_device::WRITE64(uint32_t ea, uint64_t value)
PF_THROW(error);
ea &= m_a20_mask;
- m_program->write_dword(address+0, value & 0xffffffff);
- m_program->write_dword(address+4, (value >> 32) & 0xffffffff);
+ mem_pwd32(address+0, value & 0xffffffff);
+ mem_pwd32(address+4, (value >> 32) & 0xffffffff);
}
}
diff --git a/src/devices/cpu/i386/i486ops.hxx b/src/devices/cpu/i386/i486ops.hxx
index 77e9ee3dd2d..6946e463796 100644
--- a/src/devices/cpu/i386/i486ops.hxx
+++ b/src/devices/cpu/i386/i486ops.hxx
@@ -44,13 +44,15 @@ void i386_device::i486_cpuid() // Opcode 0x0F A2
void i386_device::i486_invd() // Opcode 0x0f 08
{
- // Nothing to do ?
+ // TODO: manage the cache if present
+ opcode_invd();
CYCLES(CYCLES_INVD);
}
void i386_device::i486_wbinvd() // Opcode 0x0f 09
{
- // Nothing to do ?
+ // TODO: manage the cache if present
+ opcode_wbinvd();
}
void i386_device::i486_cmpxchg_rm8_r8() // Opcode 0x0f b0
@@ -233,6 +235,8 @@ void i386_device::i486_group0F01_16() // Opcode 0x0f 01
ea = GetEA(modrm,1);
}
WRITE16(ea, m_gdtr.limit);
+ // Win32s requires all 32 bits to be stored here, despite various Intel docs
+ // claiming that the upper 8 bits are either zeroed or undefined in 16-bit mode
WRITE32(ea + 2, m_gdtr.base);
CYCLES(CYCLES_SGDT);
break;
diff --git a/src/devices/cpu/i386/pentops.hxx b/src/devices/cpu/i386/pentops.hxx
index d5f6f6ca592..b44ce8c40ed 100644
--- a/src/devices/cpu/i386/pentops.hxx
+++ b/src/devices/cpu/i386/pentops.hxx
@@ -203,6 +203,7 @@ void i386_device::pentium_prefetch_m8() // Opcode 0x0f 18
{
uint8_t modrm = FETCH();
uint32_t ea = GetEA(modrm,0);
+ // TODO: manage the cache if present
CYCLES(1+(ea & 1)); // TODO: correct cycle count
}
@@ -1045,7 +1046,7 @@ void i386_device::pentium_movnti_m16_r16() // Opcode 0f c3
// unsupported by cpu
CYCLES(1); // TODO: correct cycle count
} else {
- // since cache is not implemented
+ // TODO: manage the cache if present
uint32_t ea = GetEA(modrm, 0);
WRITE16(ea,LOAD_RM16(modrm));
CYCLES(1); // TODO: correct cycle count
@@ -1059,7 +1060,7 @@ void i386_device::pentium_movnti_m32_r32() // Opcode 0f c3
// unsupported by cpu
CYCLES(1); // TODO: correct cycle count
} else {
- // since cache is not implemented
+ // TODO: manage the cache if present
uint32_t ea = GetEA(modrm, 0);
WRITE32(ea,LOAD_RM32(modrm));
CYCLES(1); // TODO: correct cycle count
@@ -1116,7 +1117,7 @@ void i386_device::pentium_movntq_m64_r64() // Opcode 0f e7
if( modrm >= 0xc0 ) {
CYCLES(1); // unsupported
} else {
- // since cache is not implemented
+ // TODO: manage the cache if present
uint32_t ea = GetEA(modrm, 0);
WRITEMMX(ea, MMX((modrm >> 3) & 0x7));
CYCLES(1); // TODO: correct cycle count
@@ -3317,7 +3318,7 @@ void i386_device::sse_movntps_m128_r128() // Opcode 0f 2b
// unsupported by cpu
CYCLES(1); // TODO: correct cycle count
} else {
- // since cache is not implemented
+ // TODO: manage the cache if present
uint32_t ea = GetEA(modrm, 0);
WRITEXMM(ea, XMM((modrm >> 3) & 0x7));
CYCLES(1); // TODO: correct cycle count
@@ -5962,7 +5963,7 @@ void i386_device::sse_movntdq_m128_r128() // Opcode 66 0f e7
if( modrm >= 0xc0 ) {
CYCLES(1); // unsupported
} else {
- // since cache is not implemented
+ // TODO: manage the cache if present
uint32_t ea = GetEA(modrm, 0);
WRITEXMM(ea, XMM((modrm >> 3) & 0x7));
CYCLES(1); // TODO: correct cycle count
@@ -6276,7 +6277,7 @@ void i386_device::sse_movntpd_m128_r128() // Opcode 66 0f 2b
// unsupported by cpu
CYCLES(1); // TODO: correct cycle count
} else {
- // since cache is not implemented
+ // TODO: manage the cache if present
uint32_t ea = GetEA(modrm, 0);
WRITEXMM(ea, XMM((modrm >> 3) & 0x7));
CYCLES(1); // TODO: correct cycle count
diff --git a/src/devices/cpu/i8089/i8089.cpp b/src/devices/cpu/i8089/i8089.cpp
index cf694d53cfb..7e9371de36c 100644
--- a/src/devices/cpu/i8089/i8089.cpp
+++ b/src/devices/cpu/i8089/i8089.cpp
@@ -16,7 +16,7 @@
// MACROS/CONSTANTS
//**************************************************************************
-#define VERBOSE 1
+#define VERBOSE 0
//**************************************************************************
diff --git a/src/devices/cpu/i8089/i8089_channel.cpp b/src/devices/cpu/i8089/i8089_channel.cpp
index 433a3ca792c..02bb12daa8c 100644
--- a/src/devices/cpu/i8089/i8089_channel.cpp
+++ b/src/devices/cpu/i8089/i8089_channel.cpp
@@ -20,7 +20,7 @@
// MACROS/CONSTANTS
//**************************************************************************
-#define VERBOSE 1
+#define VERBOSE 0
#define VERBOSE_DMA 0
// channel control register fields
@@ -374,11 +374,10 @@ int i8089_channel_device::execute_run()
// do we need to read another byte?
if (BIT(m_r[PSW].w, 1) && !BIT(m_r[PSW].w, 0) && !m_store_hi)
{
+ m_store_hi = true;
+
if (CC_SYNC == 0x02)
- {
- m_store_hi = true;
m_dma_state = DMA_WAIT_FOR_DEST_DRQ;
- }
else
m_dma_state = DMA_STORE_BYTE_HIGH;
}
diff --git a/src/devices/cpu/i86/i186.cpp b/src/devices/cpu/i86/i186.cpp
index 7738ee64d6c..48329288bf5 100644
--- a/src/devices/cpu/i86/i186.cpp
+++ b/src/devices/cpu/i86/i186.cpp
@@ -173,6 +173,22 @@ void i80186_cpu_device::execute_run()
{
while(m_icount > 0 )
{
+ if((m_dma[0].drq_state && (m_dma[0].control & ST_STOP)) || (m_dma[1].drq_state && (m_dma[1].control & ST_STOP)))
+ {
+ int channel = m_last_dma ? 0 : 1;
+ m_last_dma = !m_last_dma;
+ if(!(m_dma[1].drq_state && (m_dma[1].control & ST_STOP)))
+ channel = 0;
+ else if(!(m_dma[0].drq_state && (m_dma[0].control & ST_STOP)))
+ channel = 1;
+ else if((m_dma[0].control & CHANNEL_PRIORITY) && !(m_dma[1].control & CHANNEL_PRIORITY))
+ channel = 0;
+ else if((m_dma[1].control & CHANNEL_PRIORITY) && !(m_dma[0].control & CHANNEL_PRIORITY))
+ channel = 1;
+ m_icount--;
+ drq_callback(channel);
+ continue;
+ }
if ( m_seg_prefix_next )
{
m_seg_prefix = true;
@@ -587,6 +603,18 @@ void i80186_cpu_device::device_start()
state_add( I80186_T_COUNT + 2, "T2_COUNT", m_timer[2].count ).formatstr("%04X");
state_add( I80186_T_MAX_A + 2, "T2_MAX", m_timer[2].maxA ).formatstr("%04X");
state_add( I80186_T_CONTROL + 2, "T2_CONTROL", m_timer[2].control ).formatstr("%04X");
+ state_add( I80186_ISR, "ISR", m_intr.in_service ).formatstr("%04X");
+ state_add( I80186_IRR, "IRR", m_intr.request ).formatstr("%04X");
+ state_add( I80186_PMR, "PMR", m_intr.priority_mask ).formatstr("%04X");
+ state_add( I80186_ICSR, "ICSR", m_intr.status ).formatstr("%04X");
+ state_add( I80186_TMRCR, "TMRCR", m_intr.timer ).formatstr("%04X");
+ state_add( I80186_D0CR, "D0CR", m_intr.dma[0] ).formatstr("%04X");
+ state_add( I80186_D1CR, "D1CR", m_intr.dma[1] ).formatstr("%04X");
+ state_add( I80186_I0CR, "I0CR", m_intr.ext[0] ).formatstr("%04X");
+ state_add( I80186_I1CR, "I1CR", m_intr.ext[1] ).formatstr("%04X");
+ state_add( I80186_I2CR, "I2CR", m_intr.ext[2] ).formatstr("%04X");
+ state_add( I80186_I3CR, "I3CR", m_intr.ext[3] ).formatstr("%04X");
+ state_add( I80186_POLL, "POLL", m_intr.poll_status ).formatstr("%04X");
// register for savestates
save_item(NAME(m_timer[0].control));
@@ -627,6 +655,7 @@ void i80186_cpu_device::device_start()
save_item(NAME(m_mem.middle_size));
save_item(NAME(m_mem.peripheral));
save_item(NAME(m_reloc));
+ save_item(NAME(m_last_dma));
// zerofill
memset(m_timer, 0, sizeof(m_timer));
diff --git a/src/devices/cpu/i86/i186.h b/src/devices/cpu/i86/i186.h
index 01960a619f5..a968f5ef3dd 100644
--- a/src/devices/cpu/i86/i186.h
+++ b/src/devices/cpu/i86/i186.h
@@ -22,8 +22,8 @@ public:
auto tmrout1_handler() { return m_out_tmrout1_func.bind(); }
IRQ_CALLBACK_MEMBER(int_callback);
- DECLARE_WRITE_LINE_MEMBER(drq0_w) { if(state) drq_callback(0); m_dma[0].drq_state = state; }
- DECLARE_WRITE_LINE_MEMBER(drq1_w) { if(state) drq_callback(1); m_dma[1].drq_state = state; }
+ DECLARE_WRITE_LINE_MEMBER(drq0_w) { m_dma[0].drq_state = state; }
+ DECLARE_WRITE_LINE_MEMBER(drq1_w) { m_dma[1].drq_state = state; }
DECLARE_WRITE_LINE_MEMBER(tmrin0_w) { if(state && (m_timer[0].control & 0x8004) == 0x8004) { inc_timer(0); } }
DECLARE_WRITE_LINE_MEMBER(tmrin1_w) { if(state && (m_timer[1].control & 0x8004) == 0x8004) { inc_timer(1); } }
DECLARE_WRITE_LINE_MEMBER(int0_w) { external_int(0, state); }
@@ -46,7 +46,12 @@ protected:
I80186_T_COUNT = I80186_DMA_CR + 2,
I80186_T_MAX_A = I80186_T_COUNT + 3,
I80186_T_MAX_B = I80186_T_MAX_A + 3,
- I80186_T_CONTROL = I80186_T_MAX_B + 2
+ I80186_T_CONTROL = I80186_T_MAX_B + 2,
+ I80186_ISR = I80186_T_CONTROL + 3,
+ I80186_IRR, I80186_PMR, I80186_ICSR,
+ I80186_TMRCR, I80186_D0CR, I80186_D1CR,
+ I80186_I0CR, I80186_I1CR, I80186_I2CR, I80186_I3CR,
+ I80186_POLL
};
i80186_cpu_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock, int data_bus_size);
@@ -132,6 +137,7 @@ private:
dma_state m_dma[2];
intr_state m_intr;
mem_state m_mem;
+ bool m_last_dma;
static const device_timer_id TIMER_INT0 = 0;
static const device_timer_id TIMER_INT1 = 1;
diff --git a/src/devices/cpu/i86/i86.cpp b/src/devices/cpu/i86/i86.cpp
index d578c6f3a2c..4f1d6f07afd 100644
--- a/src/devices/cpu/i86/i86.cpp
+++ b/src/devices/cpu/i86/i86.cpp
@@ -317,7 +317,7 @@ void i8086_cpu_device::execute_run()
case 0xdd:
case 0xde:
case 0xdf:
- m_esc_opcode_handler(m_pc - 1);
+ m_esc_opcode_handler(m_pc);
m_modrm = fetch();
if(m_modrm < 0xc0)
m_esc_data_handler(get_ea(1, I8086_READ));
diff --git a/src/devices/cpu/m6502/dxavix2000.lst b/src/devices/cpu/m6502/dxavix2000.lst
index c96f6987dd5..fc2e7bde133 100644
--- a/src/devices/cpu/m6502/dxavix2000.lst
+++ b/src/devices/cpu/m6502/dxavix2000.lst
@@ -6,7 +6,7 @@ bpl_rel xavora_idy phx_imp orapa_imp asr_zpx ora_zpx asl_zpx
jsr_adr xavand_idx callf_xa3 andj_imp bit_zpg and_zpg rol_zpg andk_imp plp_imp and_imm rol_acc andl_imp bit_aba and_aba rol_aba andm_imp
bmi_rel xavand_idy plx_imp andpa_imp bit_zpx and_zpx rol_zpx andpb_imp sec_imp and_aby bit_imm lpa0_imp bit_abx and_abx rol_abx lpb0_imp
rti_xav_imp xaveor_idx nop_imp eorj_imp nop_imp eor_zpg lsr_zpg eork_imp pha_imp eor_imm lsr_acc eorl_imp jmp_adr eor_aba lsr_aba eorm_imp
-bvc_rel xaveor_idy phy_imp eorpa_imp nop_imp eor_zpx lsr_zpx eorpb_imp cli_imp eor_aby nop_imp spa1_imp callf_aba eor_abx lsr_abx spb1_imp
+bvc_rel xaveor_idy phy_imp eorpa_imp nop_imp eor_zpx lsr_zpx eorpb_imp cli_imp eor_aby nop_imp spa1_imp jmp_xa3 eor_abx lsr_abx spb1_imp
rts_imp xavadc_idx nop_imp adcj_imp nop_imp adc_zpg ror_zpg adck_imp pla_imp adc_imm ror_acc adcl_imp jmp_ind adc_aba ror_aba adcm_imp
bvs_rel xavadc_idy ply_imp adcpa_imp nop_imp adc_zpx ror_zpx adcpb_imp sei_imp adc_aby nop_imp lpa1_imp jmpf_ind adc_abx ror_abx lpb1_imp
retf_imp xavsta_idx stz_zpg staj_imp sty_zpg sta_zpg stx_zpg stak_imp dey_imp sev_imp txa_imp stal_imp sty_aba sta_aba stx_aba stam_imp
diff --git a/src/devices/cpu/m6502/oxavix.lst b/src/devices/cpu/m6502/oxavix.lst
index 38b8eadee1a..437a86ffc5f 100644
--- a/src/devices/cpu/m6502/oxavix.lst
+++ b/src/devices/cpu/m6502/oxavix.lst
@@ -18,6 +18,14 @@ callf_xa3
set_codebank(TMP2);
prefetch();
+jmp_xa3
+ TMP2 = read_pc();
+ TMP = read_pc();
+ TMP = set_h(TMP, read_pc());
+ PC = TMP;
+ set_codebank(TMP2);
+ prefetch();
+
retf_imp
read_pc_noinc();
read(SP);
diff --git a/src/devices/cpu/m6502/oxavix2000.lst b/src/devices/cpu/m6502/oxavix2000.lst
index c51b0263e1a..3341c6eccf2 100644
--- a/src/devices/cpu/m6502/oxavix2000.lst
+++ b/src/devices/cpu/m6502/oxavix2000.lst
@@ -448,8 +448,12 @@ asr_zpg
prefetch();
asr_aba
- fatalerror("unhandled opcode %02x%04x: %02x\n", m_codebank, PPC, inst_state);
- read_pc_noinc();
+ TMP = read_pc();
+ TMP = set_h(TMP, read_pc());
+ TMP2 = read(TMP);
+ write(TMP, TMP2);
+ TMP2 = do_asr(TMP2); // used by xavbox, see 14e8
+ write(TMP, TMP2);
prefetch();
asr_zpx
@@ -476,11 +480,6 @@ sev_imp
P |= F_V;
prefetch();
-callf_aba
- fatalerror("unhandled opcode %02x%04x: %02x\n", m_codebank, PPC, inst_state);
- read_pc_noinc();
- prefetch();
-
jmpf_ind
TMP = read_pc();
TMP = set_h(TMP, read_pc());
diff --git a/src/devices/cpu/m6502/xavix.h b/src/devices/cpu/m6502/xavix.h
index 9b28a429dad..3e20ec8a899 100644
--- a/src/devices/cpu/m6502/xavix.h
+++ b/src/devices/cpu/m6502/xavix.h
@@ -15,7 +15,6 @@
class xavix_device : public m6502_device {
public:
xavix_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- xavix_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock);
virtual std::unique_ptr<util::disasm_interface> create_disassembler() override;
virtual void do_exec_full() override;
@@ -25,6 +24,7 @@ public:
// xaviv opcodes
O(callf_xa3);
+ O(jmp_xa3);
O(retf_imp);
O(brk_xav_imp);
O(rti_xav_imp);
@@ -101,6 +101,8 @@ protected:
uint8_t m_codebank;
uint32_t XPC;
+ xavix_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock);
+
uint32_t adr_with_codebank(uint16_t adr) { return adr | (get_codebank() << 16); }
virtual void device_start() override;
diff --git a/src/devices/cpu/m6502/xavix2000.cpp b/src/devices/cpu/m6502/xavix2000.cpp
index 0c928ce159d..94b56308e0d 100644
--- a/src/devices/cpu/m6502/xavix2000.cpp
+++ b/src/devices/cpu/m6502/xavix2000.cpp
@@ -7,8 +7,8 @@
The dies for these are marked
SSD 2000 NEC 85605-621
- and possibly
- SSD 2002 NEC 85054-611 (although this might use even more opcodes and need it's own file)
+
+ SSD 2002 NEC 85054-611
6502 with custom opcodes
integrated gfx / sound
@@ -17,77 +17,12 @@
see xavix.cpp for basic notes
- the machines using the '2000' series chips seem to have more extra
- opcodes, so presumably these were only available in those models.
- of note, push x / push y and pull x / pull y
-
- Dirt Rebel MX, which is confirmed as 2000 type however seems to require
- some of the documented but 'undocumented' opcodes on the 6502 to have additonal
- meaning for one specific function on startup
-
- this just seems to be some very buggy checksum code where the games don't even care about the result...
- (actually it looks like some games might be using it as a PRNG seed?)
-
- a is 80 when entering here?
-
- 01BC37: A0 3F ldy #$3f
- 01BC39: B2 clr a // clear acculuator
- 01BC3A: 1B spa0 a // store 'accumulator' into byte 0 of PA 'address' register
- 01BC3B: 9B spa2 a // store 'accumulator' into byte 2 of PA 'address' register
-
- -- loop point 2
- 01BC3C: 98 tya // y -> a (3f on first run of loop)
- 01BC3D: 5B spa1 a // store 'accumulator' into byte 1 of PA 'address' register (003f00 on first loop?)
-
- -- loop point 1
- 01BC3E: A3 ldal0 a // read byte 0 of 32-bit 'long' register into accumulator
- 01BC3F: 73 adcpa // adc ($Address PA)
- 01BC40: 83 stal0 a // store accumulator back in byte 0 of 32-bit 'long' register (even byte checksum?)
- 01BC41: FB incpa // increase 'address' register PA
- 01BC42: A7 ldal1 a // read byte 1 of 32-bit 'long' register into accumulator
- 01BC43: 73 adcpa // adc ($Address PA)
- 01BC44: 87 stal1 a // store accumulator back in byte 0 of 32-bit 'long' register (odd byte checksum?)
- 01BC45: FB incpa // increase 'address' register PA
- 01BC46: D0 F6 bne $1bc3e // (branch based on PA increase, so PA must set flags?, probably overflows after 0xffff if upper byte is 'bank'? or at 0xff if this really is a mirror of the function below
-
- 01BC48: 88 dey // decrease y, which contained 3f at the start
- 01BC49: 10 F1 bpl $1bc3c // branch back to loop point 2 to reload counter
-
- // contains the odd byte checksum once we drop out the loop
- 01BC4B: 8D FB 00 sta $00fb // store it in zero page memory
- 01BC4E: A3 ldal0 a // get the even byte checksum from byte 0 of 32-bit 'long' register
- 01BC4F: 8D FA 00 sta $00fa // store it in zero page memory
- 01BC52: 07 oral1 a // why do we want to do this? (routine below does it too)
- 01BC53: D0 03 bne $1bc58
- 01BC55: CE FA 00 dec $00fa
- 01BC58: 80 retf
-
- this is presumably meant to be similar to the function found in Namco
- Nostalgia 2
-
- // A is 80 on entry
- 09FFD8: A9 3F lda #$3f
- 09FFDA: 85 01 sta $01 // set upper bit of pointer at 0x0000 to 3f (it completely fails to initialize the ram at 00, we currently init it to ff, but should probably be 0?)
- 09FFDC: A0 00 ldy #$00 // clear inner loop counter
- -- loop point 1 and 2
- 09FFDE: AD FA 00 lda $00fa // read current even byte checksum value from zero page ram fa (game also completely fails to initialize this)
- 09FFE1: 71 00 adc ($00), y // so 3f00 + y first outer loop, 3e00 + y second outer loop with y increasing in inner loop (add byte read to even checksum byte?)
- 09FFE3: 8D FA 00 sta $00fa // store even checksum at 0xfa in zero page ram
- 09FFE6: C8 iny // increase counter y
- 09FFE7: AD FB 00 lda $00fb // read current odd byte checksum value from zero page ram fb (likewise never initialized!)
- 09FFEA: 71 00 adc ($00), y // 3f00 + y (add byte read to odd checksum byte)
- 09FFEC: 8D FB 00 sta $00fb // store odd checksum byte at 0xfb in zero page ram
- 09FFEF: C8 iny // increase y
- 09FFF0: D0 EC bne $9ffde // branch back if y hasn't overflowed (so work on 0x100 bytes, looping back 0x7f times)
- 09FFF2: C6 01 dec $01 // decrease accumulator (started at 3f) (inner loop counter already 0 because it overflowed)
- 09FFF4: 10 E8 bpl $9ffde // branch back
-
- // checksums are already in place after loop so no need to copy them like in above
- 09FFF6: 0D FA 00 ora $00fa // same weird 'or' call
- --
- 09FFF9: D0 03 bne $9fffe
- 09FFFB: CE FA 00 dec $00fa
- 09FFFE: 80 retf
+ the 2000 chip has more opcodes than the 97/98 chips in xavix.cpp, and
+ is a similar die structure to the 2002 chip, but doesn't seem to have any
+ additional capabilities.
+
+ the 2002 chip seems to be the one that was officially dubbed 'SuperXaviX'
+ and has additional video capabilities on top of the extended opcodes.
***************************************************************************/
@@ -96,10 +31,13 @@
#include "xavix2000.h"
#include "xavix2000d.h"
-DEFINE_DEVICE_TYPE(XAVIX2000, xavix2000_device, "xavix2000", "XaviX (SSD 2000 / 2002)")
+DEFINE_DEVICE_TYPE(XAVIX2000, xavix2000_device, "xavix2000", "XaviX (SSD 2000)")
+DEFINE_DEVICE_TYPE(XAVIX2002, xavix2002_device, "xavix2002", "XaviX (SSD 2002) (SuperXaviX)")
-xavix2000_device::xavix2000_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) :
- xavix_device(mconfig, XAVIX2000, tag, owner, clock)
+
+
+xavix2000_device::xavix2000_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock) :
+ xavix_device(mconfig, type, tag, owner, clock)
{
program_config.m_addr_width = 24;
program_config.m_logaddr_width = 24;
@@ -107,6 +45,17 @@ xavix2000_device::xavix2000_device(const machine_config &mconfig, const char *ta
sprogram_config.m_logaddr_width = 24;
}
+xavix2000_device::xavix2000_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) :
+ xavix2000_device(mconfig, XAVIX2000, tag, owner, clock)
+{
+}
+
+xavix2002_device::xavix2002_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) :
+ xavix2000_device(mconfig, XAVIX2002, tag, owner, clock)
+{
+}
+
+
void xavix2000_device::device_start()
{
xavix_device::device_start();
diff --git a/src/devices/cpu/m6502/xavix2000.h b/src/devices/cpu/m6502/xavix2000.h
index 6eec3db88d5..425c15c8816 100644
--- a/src/devices/cpu/m6502/xavix2000.h
+++ b/src/devices/cpu/m6502/xavix2000.h
@@ -17,6 +17,9 @@ public:
xavix2000_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
virtual std::unique_ptr<util::disasm_interface> create_disassembler() override;
+
+protected:
+ xavix2000_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock);
virtual void do_exec_full() override;
virtual void do_exec_partial() override;
@@ -136,7 +139,6 @@ public:
O(cmc_imp);
O(sev_imp);
- O(callf_aba);
O(jmpf_ind);
#undef O
@@ -160,6 +162,13 @@ enum {
SXAVIX_PB
};
+class xavix2002_device : public xavix2000_device {
+public:
+ xavix2002_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+};
+
+
DECLARE_DEVICE_TYPE(XAVIX2000, xavix2000_device)
+DECLARE_DEVICE_TYPE(XAVIX2002, xavix2002_device)
#endif // MAME_CPU_M6502_XAVIX2000_H
diff --git a/src/devices/cpu/m68000/m68000.h b/src/devices/cpu/m68000/m68000.h
index 0596dd07976..0ee41f348b5 100644
--- a/src/devices/cpu/m68000/m68000.h
+++ b/src/devices/cpu/m68000/m68000.h
@@ -148,6 +148,7 @@ public:
void set_tas_write_callback(write8_delegate callback);
uint16_t get_fc();
void set_hmmu_enable(int enable);
+ int get_pmmu_enable() {return m_pmmu_enabled;};
void set_fpu_enable(int enable);
void set_buserror_details(uint32_t fault_addr, uint8_t rw, uint8_t fc);
@@ -349,6 +350,8 @@ protected:
#include "m68kops.h"
#include "m68kfpu.hxx"
#include "m68kmmu.h"
+
+ virtual void m68k_reset_peripherals() { }
};
@@ -375,21 +378,6 @@ protected:
const device_type type, uint32_t prg_data_width, uint32_t prg_address_bits, address_map_constructor internal_map);
};
-class m68301_device : public m68000_base_device
-{
-public:
- // construction/destruction
- m68301_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
-
- virtual std::unique_ptr<util::disasm_interface> create_disassembler() override;
-
- virtual uint32_t execute_min_cycles() const override { return 4; };
- virtual uint32_t execute_max_cycles() const override { return 158; };
-
- // device-level overrides
- virtual void device_start() override;
-};
-
@@ -647,7 +635,6 @@ public:
DECLARE_DEVICE_TYPE(M68000, m68000_device)
-DECLARE_DEVICE_TYPE(M68301, m68301_device)
DECLARE_DEVICE_TYPE(M68008, m68008_device)
DECLARE_DEVICE_TYPE(M68008PLCC, m68008plcc_device)
DECLARE_DEVICE_TYPE(M68010, m68010_device)
diff --git a/src/devices/cpu/m68000/m68k_in.cpp b/src/devices/cpu/m68000/m68k_in.cpp
index b5751811530..0eed7fbe629 100644
--- a/src/devices/cpu/m68000/m68k_in.cpp
+++ b/src/devices/cpu/m68000/m68k_in.cpp
@@ -8286,6 +8286,7 @@ M68KMAKE_OP(reset, 0, ., .)
{
if (!m_reset_instr_callback.isnull())
(m_reset_instr_callback)(1);
+ m68k_reset_peripherals();
m_remaining_cycles -= m_cyc_reset;
return;
}
diff --git a/src/devices/cpu/m68000/m68kcpu.cpp b/src/devices/cpu/m68000/m68kcpu.cpp
index e875b377af3..851c27163ea 100644
--- a/src/devices/cpu/m68000/m68kcpu.cpp
+++ b/src/devices/cpu/m68000/m68kcpu.cpp
@@ -2019,11 +2019,6 @@ std::unique_ptr<util::disasm_interface> m68000_device::create_disassembler()
return std::make_unique<m68k_disassembler>(m68k_disassembler::TYPE_68000);
}
-std::unique_ptr<util::disasm_interface> m68301_device::create_disassembler()
-{
- return std::make_unique<m68k_disassembler>(m68k_disassembler::TYPE_68000);
-}
-
std::unique_ptr<util::disasm_interface> m68008_device::create_disassembler()
{
return std::make_unique<m68k_disassembler>(m68k_disassembler::TYPE_68008);
@@ -2362,7 +2357,6 @@ device_memory_interface::space_config_vector m68000_base_device::memory_space_co
DEFINE_DEVICE_TYPE(M68000, m68000_device, "m68000", "Motorola MC68000")
-DEFINE_DEVICE_TYPE(M68301, m68301_device, "m68301", "Motorola MC68301")
DEFINE_DEVICE_TYPE(M68008, m68008_device, "m68008", "Motorola MC68008")
DEFINE_DEVICE_TYPE(M68008PLCC, m68008plcc_device, "m68008plcc", "Motorola MC68008PLCC")
DEFINE_DEVICE_TYPE(M68010, m68010_device, "m68010", "Motorola MC68010")
@@ -2405,21 +2399,6 @@ m68000_device::m68000_device(const machine_config &mconfig, const char *tag, dev
-m68301_device::m68301_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
- : m68000_base_device(mconfig, tag, owner, clock, M68301, 16,24)
-{
-}
-
-
-void m68301_device::device_start()
-{
- init_cpu_m68000();
-}
-
-
-
-
-
/* m68008_device */
diff --git a/src/devices/cpu/m68000/m68kmmu.h b/src/devices/cpu/m68000/m68kmmu.h
index 114d89ff5c1..99481039b0f 100644
--- a/src/devices/cpu/m68000/m68kmmu.h
+++ b/src/devices/cpu/m68000/m68kmmu.h
@@ -33,7 +33,7 @@ static constexpr uint32_t M68K_MMU_DF_WP = 0x00000004;
static constexpr uint32_t M68K_MMU_DF_USED = 0x00000008;
static constexpr uint32_t M68K_MMU_DF_MODIFIED = 0x00000010;
static constexpr uint32_t M68K_MMU_DF_CI = 0x00000040;
-static constexpr uint32_t M68K_MMU_DF_SUPERVISOR = 0000000100;
+static constexpr uint32_t M68K_MMU_DF_SUPERVISOR = 0x00000100;
static constexpr uint32_t M68K_MMU_DF_ADDR_MASK = 0xfffffff0;
static constexpr uint32_t M68K_MMU_DF_IND_ADDR_MASK = 0xfffffffc;
diff --git a/src/devices/cpu/m6809/6x09dasm.cpp b/src/devices/cpu/m6809/6x09dasm.cpp
index 9b7721ab268..bc366a567fe 100644
--- a/src/devices/cpu/m6809/6x09dasm.cpp
+++ b/src/devices/cpu/m6809/6x09dasm.cpp
@@ -214,6 +214,10 @@ offs_t m6x09_base_disassembler::disassemble(std::ostream &stream, offs_t pc, con
else if (numoperands == 2)
{
ea = params.r16(ppc);
+ if( !(ea & 0xff00) )
+ {
+ stream << '>'; // need the '>' to force an assembler to use EXT addressing
+ }
util::stream_format(stream, "$%04X", ea);
}
break;
@@ -230,7 +234,7 @@ offs_t m6x09_base_disassembler::disassemble(std::ostream &stream, offs_t pc, con
pb = params.r8(ppc);
}
- indirect(stream, pb, params, p);
+ indexed(stream, pb, params, p);
break;
case IMM:
@@ -810,10 +814,10 @@ m6x09_disassembler::m6x09_disassembler(m6x09_instruction_level level, const char
}
//-------------------------------------------------
-// indirect addressing mode for M6809/HD6309
+// indexed addressing mode for M6809/HD6309
//-------------------------------------------------
-void m6x09_disassembler::indirect(std::ostream &stream, uint8_t pb, const data_buffer &params, offs_t &p)
+void m6x09_disassembler::indexed(std::ostream &stream, uint8_t pb, const data_buffer &params, offs_t &p)
{
uint8_t reg = (pb >> 5) & 3;
uint8_t pbm = pb & 0x8f;
@@ -908,16 +912,14 @@ void m6x09_disassembler::indirect(std::ostream &stream, uint8_t pb, const data_b
break;
case 0x8c: // (+/- 7 bit offset),PC
- offset = (int8_t)params.r8(p);
- util::stream_format(stream, "%s", (offset < 0) ? "-" : "");
- util::stream_format(stream, "$%02X,PC", (offset < 0) ? -offset : offset);
+ offset = (int8_t)params.r8(p++);
+ util::stream_format(stream, "$%04X,PCR", (p+offset)); // PC Relative addressing (assembler computes offset from specified absolute address)
break;
case 0x8d: // (+/- 15 bit offset),PC
offset = (int16_t)params.r16(p);
p += 2;
- util::stream_format(stream, "%s", (offset < 0) ? "-" : "");
- util::stream_format(stream, "$%04X,PC", (offset < 0) ? -offset : offset);
+ util::stream_format(stream, "$%04X,PCR", (p+offset)); // PC Relative addressing (assembler computes offset from specified absolute address)
break;
case 0x8e: // (+/- W),R
@@ -1240,10 +1242,10 @@ konami_disassembler::konami_disassembler() : m6x09_base_disassembler(konami_opco
}
//-------------------------------------------------
-// indirect addressing mode for Konami
+// indexed addressing mode for Konami
//-------------------------------------------------
-void konami_disassembler::indirect(std::ostream &stream, uint8_t mode, const data_buffer &params, offs_t &p)
+void konami_disassembler::indexed(std::ostream &stream, uint8_t mode, const data_buffer &params, offs_t &p)
{
static const char index_reg[8][3] =
{
diff --git a/src/devices/cpu/m6809/6x09dasm.h b/src/devices/cpu/m6809/6x09dasm.h
index a14de7849c9..e6320038b54 100644
--- a/src/devices/cpu/m6809/6x09dasm.h
+++ b/src/devices/cpu/m6809/6x09dasm.h
@@ -101,7 +101,7 @@ protected:
static const char *const hd6309_tfmregs[16];
static const char *const tfm_s[];
- virtual void indirect(std::ostream &stream, uint8_t pb, const data_buffer &params, offs_t &p) = 0;
+ virtual void indexed(std::ostream &stream, uint8_t pb, const data_buffer &params, offs_t &p) = 0;
virtual void register_register(std::ostream &stream, uint8_t pb) = 0;
private:
@@ -123,7 +123,7 @@ public:
m6x09_disassembler(m6x09_instruction_level level, const char teregs[16][4]);
protected:
- virtual void indirect(std::ostream &stream, uint8_t pb, const data_buffer &params, offs_t &p) override;
+ virtual void indexed(std::ostream &stream, uint8_t pb, const data_buffer &params, offs_t &p) override;
virtual void register_register(std::ostream &stream, uint8_t pb) override;
private:
@@ -138,7 +138,7 @@ public:
konami_disassembler();
protected:
- virtual void indirect(std::ostream &stream, uint8_t pb, const data_buffer &params, offs_t &p) override;
+ virtual void indexed(std::ostream &stream, uint8_t pb, const data_buffer &params, offs_t &p) override;
virtual void register_register(std::ostream &stream, uint8_t pb) override;
private:
diff --git a/src/devices/cpu/mcs51/mcs51.cpp b/src/devices/cpu/mcs51/mcs51.cpp
index 60d39a25139..c307c19a611 100644
--- a/src/devices/cpu/mcs51/mcs51.cpp
+++ b/src/devices/cpu/mcs51/mcs51.cpp
@@ -874,6 +874,8 @@ uint8_t mcs51_cpu_device::bit_address_r(uint8_t offset)
int distance; /* distance between bit addressable words */
/* 1 for normal bits, 8 for sfr bit addresses */
+ m_last_bit = offset;
+
//User defined bit addresses 0x20-0x2f (values are 0x0-0x7f)
if (offset < 0x80) {
distance = 1;
@@ -1358,6 +1360,8 @@ void mcs51_cpu_device::execute_op(uint8_t op)
m_recalc_parity = 0;
}
+ m_last_op = op;
+
switch( op )
{
case 0x00: nop(op); break; //NOP
@@ -1777,6 +1781,10 @@ void mcs51_cpu_device::check_irqs()
return;
}
+ // Hack to work around polling latency issue with JB INT0/INT1
+ if (m_last_op == 0x20 && ((int_vec == V_IE0 && m_last_bit == 0xb2) || (int_vec == V_IE1 && m_last_bit == 0xb3)))
+ PC = PPC + 3;
+
//Save current pc to stack, set pc to new interrupt vector
push_pc();
PC = int_vec;
@@ -2126,6 +2134,8 @@ void mcs51_cpu_device::device_start()
save_item(NAME(m_ppc));
save_item(NAME(m_pc));
+ save_item(NAME(m_last_op));
+ save_item(NAME(m_last_bit));
save_item(NAME(m_rwm) );
save_item(NAME(m_cur_irq_prio) );
save_item(NAME(m_last_line_state) );
@@ -2213,6 +2223,8 @@ void mcs51_cpu_device::device_reset()
/* Flag as NO IRQ in Progress */
m_irq_active = 0;
m_cur_irq_prio = -1;
+ m_last_op = 0;
+ m_last_bit = 0;
/* these are all defined reset states */
PC = 0;
diff --git a/src/devices/cpu/mcs51/mcs51.h b/src/devices/cpu/mcs51/mcs51.h
index e0d4028f493..bd7b6d7b085 100644
--- a/src/devices/cpu/mcs51/mcs51.h
+++ b/src/devices/cpu/mcs51/mcs51.h
@@ -122,6 +122,10 @@ protected:
uint8_t m_forced_inputs[4]; /* allow read even if configured as output */
+ // JB-related hacks
+ uint8_t m_last_op;
+ uint8_t m_last_bit;
+
int m_icount;
struct mcs51_uart
diff --git a/src/devices/cpu/mips/mips1.cpp b/src/devices/cpu/mips/mips1.cpp
index 72479a6065d..1ed202c0d63 100644
--- a/src/devices/cpu/mips/mips1.cpp
+++ b/src/devices/cpu/mips/mips1.cpp
@@ -7,8 +7,6 @@
* while those without have hard-wired address translation.
*
* TODO
- * - FPU support
- * - further cleanup on coprocessors
* - R3041 features
* - cache emulation
*
@@ -17,37 +15,32 @@
#include "mips1.h"
#include "mips1dsm.h"
#include "debugger.h"
+#include "softfloat3/source/include/softfloat.h"
#define LOG_GENERAL (1U << 0)
#define LOG_TLB (1U << 1)
+#define LOG_IOP (1U << 2)
+#define LOG_RISCOS (1U << 3)
//#define VERBOSE (LOG_GENERAL|LOG_TLB)
-#include "logmacro.h"
-#define ENABLE_IOP_KPUTS (0)
+#include "logmacro.h"
#define RSREG ((op >> 21) & 31)
#define RTREG ((op >> 16) & 31)
#define RDREG ((op >> 11) & 31)
#define SHIFT ((op >> 6) & 31)
-#define RSVAL m_r[RSREG]
-#define RTVAL m_r[RTREG]
-#define RDVAL m_r[RDREG]
+#define FTREG ((op >> 16) & 31)
+#define FSREG ((op >> 11) & 31)
+#define FDREG ((op >> 6) & 31)
#define SIMMVAL s16(op)
#define UIMMVAL u16(op)
#define LIMMVAL (op & 0x03ffffff)
-#define ADDPC(x) do { m_branch_state = BRANCH; m_branch_target = m_pc + 4 + ((x) << 2); } while (0)
-#define ADDPCL(x,l) do { m_branch_state = BRANCH; m_branch_target = m_pc + 4 + ((x) << 2); m_r[l] = m_pc + 8; } while (0)
-#define ABSPC(x) do { m_branch_state = BRANCH; m_branch_target = ((m_pc + 4) & 0xf0000000) | ((x) << 2); } while (0)
-#define ABSPCL(x,l) do { m_branch_state = BRANCH; m_branch_target = ((m_pc + 4) & 0xf0000000) | ((x) << 2); m_r[l] = m_pc + 8; } while (0)
-#define SETPC(x) do { m_branch_state = BRANCH; m_branch_target = (x); } while (0)
-#define SETPCL(x,l) do { m_branch_state = BRANCH; m_branch_target = (x); m_r[l] = m_pc + 8; } while (0)
-
-#define SR m_cpr[0][COP0_Status]
-#define CAUSE m_cpr[0][COP0_Cause]
+#define SR m_cop0[COP0_Status]
+#define CAUSE m_cop0[COP0_Cause]
DEFINE_DEVICE_TYPE(R2000, r2000_device, "r2000", "MIPS R2000")
DEFINE_DEVICE_TYPE(R2000A, r2000a_device, "r2000a", "MIPS R2000A")
@@ -70,8 +63,6 @@ mips1core_device_base::mips1core_device_base(const machine_config &mconfig, devi
, m_icache_config("icache", ENDIANNESS_BIG, 32, 32)
, m_dcache_config("dcache", ENDIANNESS_BIG, 32, 32)
, m_cpurev(cpurev)
- , m_hasfpu(false)
- , m_fpurev(0)
, m_endianness(ENDIANNESS_BIG)
, m_icount(0)
, m_icache_size(icache_size)
@@ -82,6 +73,7 @@ mips1core_device_base::mips1core_device_base(const machine_config &mconfig, devi
mips1_device_base::mips1_device_base(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock, u32 cpurev, size_t icache_size, size_t dcache_size)
: mips1core_device_base(mconfig, type, tag, owner, clock, cpurev, icache_size, dcache_size)
+ , m_fcr0(0)
{
}
@@ -126,14 +118,14 @@ r3052e_device::r3052e_device(const machine_config &mconfig, const char *tag, dev
}
r3071_device::r3071_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock, size_t icache_size, size_t dcache_size)
- : mips1core_device_base(mconfig, R3071, tag, owner, clock, 0x0200, icache_size, dcache_size)
+ : mips1_device_base(mconfig, R3071, tag, owner, clock, 0x0200, icache_size, dcache_size)
{
}
r3081_device::r3081_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock, size_t icache_size, size_t dcache_size)
- : mips1core_device_base(mconfig, R3081, tag, owner, clock, 0x0200, icache_size, dcache_size)
+ : mips1_device_base(mconfig, R3081, tag, owner, clock, 0x0200, icache_size, dcache_size)
{
- set_fpurev(0x0300);
+ set_fpu(0x0300);
}
iop_device::iop_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
@@ -153,18 +145,6 @@ void mips1core_device_base::device_add_mconfig(machine_config &config)
set_addrmap(2, &mips1core_device_base::dcache_map);
}
-void mips1core_device_base::icache_map(address_map &map)
-{
- if (m_icache_size)
- map(0, m_icache_size - 1).ram().mirror(~(m_icache_size - 1));
-}
-
-void mips1core_device_base::dcache_map(address_map &map)
-{
- if (m_dcache_size)
- map(0, m_dcache_size - 1).ram().mirror(~(m_dcache_size - 1));
-}
-
void mips1core_device_base::device_start()
{
// set our instruction counter
@@ -177,49 +157,32 @@ void mips1core_device_base::device_start()
// register our state for the debugger
state_add(STATE_GENPC, "GENPC", m_pc).noshow();
state_add(STATE_GENPCBASE, "CURPC", m_pc).noshow();
- state_add(STATE_GENSP, "GENSP", m_r[31]).noshow();
- state_add(STATE_GENFLAGS, "GENFLAGS", m_cpr[0][COP0_Status]).noshow();
- state_add(MIPS1_PC, "PC", m_pc);
- state_add(MIPS1_COP0_SR, "SR", m_cpr[0][COP0_Status]);
+ state_add(MIPS1_PC, "PC", m_pc);
+ state_add(MIPS1_COP0 + COP0_Status, "SR", m_cop0[COP0_Status]);
- for (int i = 0; i < 32; i++)
+ for (unsigned i = 0; i < ARRAY_LENGTH(m_r); i++)
state_add(MIPS1_R0 + i, util::string_format("R%d", i).c_str(), m_r[i]);
state_add(MIPS1_HI, "HI", m_hi);
state_add(MIPS1_LO, "LO", m_lo);
- state_add(MIPS1_COP0_BADVADDR, "BadVAddr", m_cpr[0][COP0_BadVAddr]);
- state_add(MIPS1_COP0_CAUSE, "Cause", m_cpr[0][COP0_Cause]);
- state_add(MIPS1_COP0_EPC, "EPC", m_cpr[0][COP0_EPC]);
+
+ // cop0 exception registers
+ state_add(MIPS1_COP0 + COP0_BadVAddr, "BadVAddr", m_cop0[COP0_BadVAddr]);
+ state_add(MIPS1_COP0 + COP0_Cause, "Cause", m_cop0[COP0_Cause]);
+ state_add(MIPS1_COP0 + COP0_EPC, "EPC", m_cop0[COP0_EPC]);
// register our state for saving
save_item(NAME(m_pc));
save_item(NAME(m_hi));
save_item(NAME(m_lo));
save_item(NAME(m_r));
- save_item(NAME(m_cpr));
- save_item(NAME(m_ccr));
+ save_item(NAME(m_cop0));
save_item(NAME(m_branch_state));
save_item(NAME(m_branch_target));
- // initialise cpu and fpu id registers
- m_cpr[0][COP0_PRId] = m_cpurev;
- m_ccr[1][0] = m_fpurev;
-}
-
-void mips1_device_base::device_start()
-{
- mips1core_device_base::device_start();
-
- // cop0 tlb registers
- state_add(MIPS1_COP0_INDEX, "Index", m_cpr[0][COP0_Index]);
- state_add(MIPS1_COP0_RANDOM, "Random", m_cpr[0][COP0_Random]);
- state_add(MIPS1_COP0_ENTRYLO, "EntryLo", m_cpr[0][COP0_EntryLo]);
- state_add(MIPS1_COP0_ENTRYHI, "EntryHi", m_cpr[0][COP0_EntryHi]);
- state_add(MIPS1_COP0_CONTEXT, "Context", m_cpr[0][COP0_Context]);
-
- save_item(NAME(m_reset_time));
- save_item(NAME(m_tlb));
+ // initialise cpu id register
+ m_cop0[COP0_PRId] = m_cpurev;
}
void r3041_device::device_start()
@@ -227,11 +190,11 @@ void r3041_device::device_start()
mips1core_device_base::device_start();
// cop0 r3041 registers
- state_add(MIPS1_COP0_BUSCTRL, "BusCtrl", m_cpr[0][COP0_BusCtrl]);
- state_add(MIPS1_COP0_CONFIG, "Config", m_cpr[0][COP0_Config]);
- state_add(MIPS1_COP0_COUNT, "Count", m_cpr[0][COP0_Count]);
- state_add(MIPS1_COP0_PORTSIZE, "PortSize", m_cpr[0][COP0_PortSize]);
- state_add(MIPS1_COP0_COMPARE, "Compare", m_cpr[0][COP0_Compare]);
+ state_add(MIPS1_COP0 + COP0_BusCtrl, "BusCtrl", m_cop0[COP0_BusCtrl]);
+ state_add(MIPS1_COP0 + COP0_Config, "Config", m_cop0[COP0_Config]);
+ state_add(MIPS1_COP0 + COP0_Count, "Count", m_cop0[COP0_Count]);
+ state_add(MIPS1_COP0 + COP0_PortSize, "PortSize", m_cop0[COP0_PortSize]);
+ state_add(MIPS1_COP0 + COP0_Compare, "Compare", m_cop0[COP0_Compare]);
}
void mips1core_device_base::device_reset()
@@ -241,19 +204,402 @@ void mips1core_device_base::device_reset()
m_branch_state = NONE;
// non-tlb devices have tlb shut down
- m_cpr[0][COP0_Status] = SR_BEV | SR_TS;
+ m_cop0[COP0_Status] = SR_BEV | SR_TS;
m_data_spacenum = 0;
}
-void mips1_device_base::device_reset()
+void mips1core_device_base::execute_run()
{
- mips1core_device_base::device_reset();
+ // check for interrupts
+ check_irqs();
- // tlb is not shut down
- m_cpr[0][COP0_Status] &= ~SR_TS;
+ // core execution loop
+ while (m_icount-- > 0)
+ {
+ // debugging
+ debugger_instruction_hook(m_pc);
- m_reset_time = total_cycles();
+ if (VERBOSE & LOG_IOP)
+ {
+ if ((m_pc & 0x1fffffff) == 0x00012C48 || (m_pc & 0x1fffffff) == 0x0001420C || (m_pc & 0x1fffffff) == 0x0001430C)
+ {
+ u32 ptr = m_r[5];
+ u32 length = m_r[6];
+ if (length >= 4096)
+ length = 4095;
+ while (length)
+ {
+ load<u8>(ptr, [](char c) { printf("%c", c); });
+ ptr++;
+ length--;
+ }
+ fflush(stdout);
+ }
+ }
+
+ // fetch and execute instruction
+ fetch(m_pc, [this](u32 const op)
+ {
+ // parse the instruction
+ switch (op >> 26)
+ {
+ case 0x00: // SPECIAL
+ switch (op & 63)
+ {
+ case 0x00: // SLL
+ m_r[RDREG] = m_r[RTREG] << SHIFT;
+ break;
+ case 0x02: // SRL
+ m_r[RDREG] = m_r[RTREG] >> SHIFT;
+ break;
+ case 0x03: // SRA
+ m_r[RDREG] = s32(m_r[RTREG]) >> SHIFT;
+ break;
+ case 0x04: // SLLV
+ m_r[RDREG] = m_r[RTREG] << (m_r[RSREG] & 31);
+ break;
+ case 0x06: // SRLV
+ m_r[RDREG] = m_r[RTREG] >> (m_r[RSREG] & 31);
+ break;
+ case 0x07: // SRAV
+ m_r[RDREG] = s32(m_r[RTREG]) >> (m_r[RSREG] & 31);
+ break;
+ case 0x08: // JR
+ m_branch_state = BRANCH;
+ m_branch_target = m_r[RSREG];
+ break;
+ case 0x09: // JALR
+ m_branch_state = BRANCH;
+ m_branch_target = m_r[RSREG];
+ m_r[RDREG] = m_pc + 8;
+ break;
+ case 0x0c: // SYSCALL
+ generate_exception(EXCEPTION_SYSCALL);
+ break;
+ case 0x0d: // BREAK
+ generate_exception(EXCEPTION_BREAK);
+ break;
+ case 0x10: // MFHI
+ m_r[RDREG] = m_hi;
+ break;
+ case 0x11: // MTHI
+ m_hi = m_r[RSREG];
+ break;
+ case 0x12: // MFLO
+ m_r[RDREG] = m_lo;
+ break;
+ case 0x13: // MTLO
+ m_lo = m_r[RSREG];
+ break;
+ case 0x18: // MULT
+ {
+ u64 product = mul_32x32(m_r[RSREG], m_r[RTREG]);
+
+ m_lo = product;
+ m_hi = product >> 32;
+ m_icount -= 11;
+ }
+ break;
+ case 0x19: // MULTU
+ {
+ u64 product = mulu_32x32(m_r[RSREG], m_r[RTREG]);
+
+ m_lo = product;
+ m_hi = product >> 32;
+ m_icount -= 11;
+ }
+ break;
+ case 0x1a: // DIV
+ if (m_r[RTREG])
+ {
+ m_lo = s32(m_r[RSREG]) / s32(m_r[RTREG]);
+ m_hi = s32(m_r[RSREG]) % s32(m_r[RTREG]);
+ }
+ m_icount -= 34;
+ break;
+ case 0x1b: // DIVU
+ if (m_r[RTREG])
+ {
+ m_lo = m_r[RSREG] / m_r[RTREG];
+ m_hi = m_r[RSREG] % m_r[RTREG];
+ }
+ m_icount -= 34;
+ break;
+ case 0x20: // ADD
+ {
+ u32 const sum = m_r[RSREG] + m_r[RTREG];
+
+ // overflow: (sign(addend0) == sign(addend1)) && (sign(addend0) != sign(sum))
+ if (!BIT(m_r[RSREG] ^ m_r[RTREG], 31) && BIT(m_r[RSREG] ^ sum, 31))
+ generate_exception(EXCEPTION_OVERFLOW);
+ else
+ m_r[RDREG] = sum;
+ }
+ break;
+ case 0x21: // ADDU
+ m_r[RDREG] = m_r[RSREG] + m_r[RTREG];
+ break;
+ case 0x22: // SUB
+ {
+ u32 const difference = m_r[RSREG] - m_r[RTREG];
+
+ // overflow: (sign(minuend) != sign(subtrahend)) && (sign(minuend) != sign(difference))
+ if (BIT(m_r[RSREG] ^ m_r[RTREG], 31) && BIT(m_r[RSREG] ^ difference, 31))
+ generate_exception(EXCEPTION_OVERFLOW);
+ else
+ m_r[RDREG] = difference;
+ }
+ break;
+ case 0x23: // SUBU
+ m_r[RDREG] = m_r[RSREG] - m_r[RTREG];
+ break;
+ case 0x24: // AND
+ m_r[RDREG] = m_r[RSREG] & m_r[RTREG];
+ break;
+ case 0x25: // OR
+ m_r[RDREG] = m_r[RSREG] | m_r[RTREG];
+ break;
+ case 0x26: // XOR
+ m_r[RDREG] = m_r[RSREG] ^ m_r[RTREG];
+ break;
+ case 0x27: // NOR
+ m_r[RDREG] = ~(m_r[RSREG] | m_r[RTREG]);
+ break;
+ case 0x2a: // SLT
+ m_r[RDREG] = s32(m_r[RSREG]) < s32(m_r[RTREG]);
+ break;
+ case 0x2b: // SLTU
+ m_r[RDREG] = u32(m_r[RSREG]) < u32(m_r[RTREG]);
+ break;
+ default:
+ generate_exception(EXCEPTION_INVALIDOP);
+ break;
+ }
+ break;
+ case 0x01: // REGIMM
+ switch (RTREG)
+ {
+ case 0x00: // BLTZ
+ if (s32(m_r[RSREG]) < 0)
+ {
+ m_branch_state = BRANCH;
+ m_branch_target = m_pc + 4 + (s32(SIMMVAL) << 2);
+ }
+ break;
+ case 0x01: // BGEZ
+ if (s32(m_r[RSREG]) >= 0)
+ {
+ m_branch_state = BRANCH;
+ m_branch_target = m_pc + 4 + (s32(SIMMVAL) << 2);
+ }
+ break;
+ case 0x10: // BLTZAL
+ if (s32(m_r[RSREG]) < 0)
+ {
+ m_branch_state = BRANCH;
+ m_branch_target = m_pc + 4 + (s32(SIMMVAL) << 2);
+ m_r[31] = m_pc + 8;
+ }
+ break;
+ case 0x11: // BGEZAL
+ if (s32(m_r[RSREG]) >= 0)
+ {
+ m_branch_state = BRANCH;
+ m_branch_target = m_pc + 4 + (s32(SIMMVAL) << 2);
+ m_r[31] = m_pc + 8;
+ }
+ break;
+ default:
+ generate_exception(EXCEPTION_INVALIDOP);
+ break;
+ }
+ break;
+ case 0x02: // J
+ m_branch_state = BRANCH;
+ m_branch_target = ((m_pc + 4) & 0xf0000000) | (LIMMVAL << 2);
+ break;
+ case 0x03: // JAL
+ m_branch_state = BRANCH;
+ m_branch_target = ((m_pc + 4) & 0xf0000000) | (LIMMVAL << 2);
+ m_r[31] = m_pc + 8;
+ break;
+ case 0x04: // BEQ
+ if (m_r[RSREG] == m_r[RTREG])
+ {
+ m_branch_state = BRANCH;
+ m_branch_target = m_pc + 4 + (s32(SIMMVAL) << 2);
+ }
+ break;
+ case 0x05: // BNE
+ if (m_r[RSREG] != m_r[RTREG])
+ {
+ m_branch_state = BRANCH;
+ m_branch_target = m_pc + 4 + (s32(SIMMVAL) << 2);
+ }
+ break;
+ case 0x06: // BLEZ
+ if (s32(m_r[RSREG]) <= 0)
+ {
+ m_branch_state = BRANCH;
+ m_branch_target = m_pc + 4 + (s32(SIMMVAL) << 2);
+ }
+ break;
+ case 0x07: // BGTZ
+ if (s32(m_r[RSREG]) > 0)
+ {
+ m_branch_state = BRANCH;
+ m_branch_target = m_pc + 4 + (s32(SIMMVAL) << 2);
+ }
+ break;
+ case 0x08: // ADDI
+ {
+ u32 const sum = m_r[RSREG] + SIMMVAL;
+
+ // overflow: (sign(addend0) == sign(addend1)) && (sign(addend0) != sign(sum))
+ if (!BIT(m_r[RSREG] ^ s32(SIMMVAL), 31) && BIT(m_r[RSREG] ^ sum, 31))
+ generate_exception(EXCEPTION_OVERFLOW);
+ else
+ m_r[RTREG] = sum;
+ }
+ break;
+ case 0x09: // ADDIU
+ m_r[RTREG] = m_r[RSREG] + SIMMVAL;
+ break;
+ case 0x0a: // SLTI
+ m_r[RTREG] = s32(m_r[RSREG]) < s32(SIMMVAL);
+ break;
+ case 0x0b: // SLTIU
+ m_r[RTREG] = u32(m_r[RSREG]) < u32(SIMMVAL);
+ break;
+ case 0x0c: // ANDI
+ m_r[RTREG] = m_r[RSREG] & UIMMVAL;
+ break;
+ case 0x0d: // ORI
+ m_r[RTREG] = m_r[RSREG] | UIMMVAL;
+ break;
+ case 0x0e: // XORI
+ m_r[RTREG] = m_r[RSREG] ^ UIMMVAL;
+ break;
+ case 0x0f: // LUI
+ m_r[RTREG] = UIMMVAL << 16;
+ break;
+ case 0x10: // COP0
+ if (!(SR & SR_KUc) || (SR & SR_COP0))
+ handle_cop0(op);
+ else
+ generate_exception(EXCEPTION_BADCOP0);
+ break;
+ case 0x11: // COP1
+ handle_cop1(op);
+ break;
+ case 0x12: // COP2
+ handle_cop2(op);
+ break;
+ case 0x13: // COP3
+ handle_cop3(op);
+ break;
+ case 0x20: // LB
+ load<u8>(SIMMVAL + m_r[RSREG], [this, op](s8 temp) { m_r[RTREG] = temp; });
+ break;
+ case 0x21: // LH
+ load<u16>(SIMMVAL + m_r[RSREG], [this, op](s16 temp) { m_r[RTREG] = temp; });
+ break;
+ case 0x22: // LWL
+ lwl(op);
+ break;
+ case 0x23: // LW
+ load<u32>(SIMMVAL + m_r[RSREG], [this, op](u32 temp) { m_r[RTREG] = temp; });
+ break;
+ case 0x24: // LBU
+ load<u8>(SIMMVAL + m_r[RSREG], [this, op](u8 temp) { m_r[RTREG] = temp; });
+ break;
+ case 0x25: // LHU
+ load<u16>(SIMMVAL + m_r[RSREG], [this, op](u16 temp) { m_r[RTREG] = temp; });
+ break;
+ case 0x26: // LWR
+ lwr(op);
+ break;
+ case 0x28: // SB
+ store<u8>(SIMMVAL + m_r[RSREG], m_r[RTREG]);
+ break;
+ case 0x29: // SH
+ store<u16>(SIMMVAL + m_r[RSREG], m_r[RTREG]);
+ break;
+ case 0x2a: // SWL
+ swl(op);
+ break;
+ case 0x2b: // SW
+ store<u32>(SIMMVAL + m_r[RSREG], m_r[RTREG]);
+ break;
+ case 0x2e: // SWR
+ swr(op);
+ break;
+ case 0x31: // LWC1
+ handle_cop1(op);
+ break;
+ case 0x32: // LWC2
+ handle_cop2(op);
+ break;
+ case 0x33: // LWC3
+ handle_cop3(op);
+ break;
+ case 0x39: // SWC1
+ handle_cop1(op);
+ break;
+ case 0x3a: // SWC2
+ handle_cop2(op);
+ break;
+ case 0x3b: // SWC3
+ handle_cop3(op);
+ break;
+ default:
+ generate_exception(EXCEPTION_INVALIDOP);
+ break;
+ }
+
+ // update pc and branch state
+ switch (m_branch_state)
+ {
+ case NONE:
+ m_pc += 4;
+ break;
+
+ case DELAY:
+ m_branch_state = NONE;
+ m_pc = m_branch_target;
+ break;
+
+ case BRANCH:
+ m_branch_state = DELAY;
+ m_pc += 4;
+ break;
+
+ case EXCEPTION:
+ m_branch_state = NONE;
+ break;
+ }
+
+ // clear register 0
+ m_r[0] = 0;
+ });
+ }
+}
+
+void mips1core_device_base::execute_set_input(int irqline, int state)
+{
+ if (state != CLEAR_LINE)
+ {
+ CAUSE |= CAUSE_IPEX0 << irqline;
+
+ // enable debugger interrupt breakpoints
+ if ((SR & SR_IEc) && (SR & (SR_IMEX0 << irqline)))
+ standard_irq_callback(irqline);
+ }
+ else
+ CAUSE &= ~(CAUSE_IPEX0 << irqline);
+
+ check_irqs();
}
device_memory_interface::space_config_vector mips1core_device_base::memory_space_config() const
@@ -265,29 +611,228 @@ device_memory_interface::space_config_vector mips1core_device_base::memory_space
};
}
+bool mips1core_device_base::memory_translate(int spacenum, int intention, offs_t &address)
+{
+ // check for kernel memory address
+ if (BIT(address, 31))
+ {
+ // check debug or kernel mode
+ if ((intention & TRANSLATE_DEBUG_MASK) || !(SR & SR_KUc))
+ {
+ switch (address & 0xe0000000)
+ {
+ case 0x80000000: // kseg0: unmapped, cached, privileged
+ case 0xa0000000: // kseg1: unmapped, uncached, privileged
+ address &= ~0xe0000000;
+ break;
+
+ case 0xc0000000: // kseg2: mapped, cached, privileged
+ case 0xe0000000:
+ break;
+ }
+ }
+ else if (SR & SR_KUc)
+ {
+ if (!machine().side_effects_disabled())
+ {
+ // exception
+ m_cop0[COP0_BadVAddr] = address;
+
+ generate_exception((intention & TRANSLATE_WRITE) ? EXCEPTION_ADDRSTORE : EXCEPTION_ADDRLOAD);
+ }
+ return false;
+ }
+ }
+ else
+ // kuseg physical addresses have a 1GB offset
+ address += 0x40000000;
+
+ return true;
+}
+
std::unique_ptr<util::disasm_interface> mips1core_device_base::create_disassembler()
{
return std::make_unique<mips1_disassembler>();
}
-void mips1core_device_base::generate_exception(int exception, bool refill)
+void mips1core_device_base::icache_map(address_map &map)
+{
+ if (m_icache_size)
+ map(0, m_icache_size - 1).ram().mirror(~(m_icache_size - 1));
+}
+
+void mips1core_device_base::dcache_map(address_map &map)
+{
+ if (m_dcache_size)
+ map(0, m_dcache_size - 1).ram().mirror(~(m_dcache_size - 1));
+}
+
+void mips1core_device_base::generate_exception(u32 exception, bool refill)
{
+ if ((VERBOSE & LOG_RISCOS) && (exception == EXCEPTION_SYSCALL))
+ {
+ static char const *const sysv_syscalls[] =
+ {
+ "syscall", "exit", "fork", "read", "write", "open", "close", "wait", "creat", "link",
+ "unlink", "execv", "chdir", "time", "mknod", "chmod", "chown", "brk", "stat", "lseek",
+ "getpid", "mount", "umount", "setuid", "getuid", "stime", "ptrace", "alarm", "fstat", "pause",
+ "utime", "stty", "gtty", "access", "nice", "statfs", "sync", "kill", "fstatfs", "setpgrp",
+ nullptr, "dup", "pipe", "times", "profil", "plock", "setgid", "getgid", "signal", "msgsys",
+ "sysmips", "acct", "shmsys", "semsys", "ioctl", "uadmin", nullptr, "utssys", nullptr, "execve",
+ "umask", "chroot", "ofcntl", "ulimit", nullptr, nullptr, nullptr, nullptr, nullptr, nullptr,
+ "advfs", "unadvfs", "rmount", "rumount", "rfstart", nullptr, "rdebug", "rfstop", "rfsys", "rmdir",
+ "mkdir", "getdents", nullptr, nullptr, "sysfs", "getmsg", "putmsg", "poll", "sigreturn", "accept",
+ "bind", "connect", "gethostid", "getpeername", "getsockname", "getsockopt", "listen", "recv", "recvfrom", "recvmsg",
+ "select", "send", "sendmsg", "sendto", "sethostid", "setsockopt", "shutdown", "socket", "gethostname", "sethostname",
+ "getdomainname","setdomainname","truncate", "ftruncate", "rename", "symlink", "readlink", "lstat", "nfsmount", "nfssvc",
+ "getfh", "async_daemon", "old_exportfs", "mmap", "munmap", "getitimer", "setitimer", nullptr, nullptr, nullptr,
+ nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr,
+ nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr,
+ "cacheflush", "cachectl", "fchown", "fchmod", "wait3", "mmap", "munmap", "madvise", "getpagesize", "setreuid",
+ "setregid", "setpgid", "getgroups", "setgroups", "gettimeofday", "getrusage", "getrlimit", "setrlimit", "exportfs", "fcntl"
+ };
+
+ static char const *const bsd_syscalls[] =
+ {
+ "syscall", "exit", "fork", "read", "write", "open", "close", nullptr, "creat", "link",
+ "unlink", "execv", "chdir", nullptr, "mknod", "chmod", "chown", "brk", nullptr, "lseek",
+ "getpid", "omount", "oumount", nullptr, "getuid", nullptr, "ptrace", nullptr, nullptr, nullptr,
+ nullptr, nullptr, nullptr, "access", nullptr, nullptr, "sync", "kill", "stat", nullptr,
+ "lstat", "dup", "pipe", nullptr, "profil", nullptr, nullptr, "getgid", nullptr, nullptr,
+ nullptr, "acct", nullptr, nullptr, "ioctl", "reboot", nullptr, "symlink", "readlink", "execve",
+ "umask", "chroot", "fstat", nullptr, "getpagesize", "mremap", "vfork", nullptr, nullptr, "sbrk",
+ "sstk", "mmap", "vadvise", "munmap", "mprotec", "madvise", "vhangup", nullptr, "mincore", "getgroups",
+ "setgroups", "getpgrp", "setpgrp", "setitimer", "wait3", "swapon", "getitimer", "gethostname", "sethostname", "getdtablesize",
+ "dup2", "getdopt", "fcntl", "select", "setdopt", "fsync", "setpriority", "socket", "connect", "accept",
+ "getpriority", "send", "recv", "sigreturn", "bind", "setsockopt", "listen", nullptr, "sigvec", "sigblock",
+ "sigsetmask", "sigpause", "sigstack", "recvmsg", "sendmsg", nullptr, "gettimeofday", "getrusage", "getsockopt", nullptr,
+ "readv", "writev", "settimeofday", "fchown", "fchmod", "recvfrom", "setreuid", "setregid", "rename", "truncate",
+ "ftruncate", "flock", nullptr, "sendto", "shutdown", "socketpair", "mkdir", "rmdir", "utimes", "sigcleanup",
+ "adjtime", "getpeername", "gethostid", "sethostid", "getrlimit", "setrlimit", "killpg", nullptr, "setquota", "quota",
+ "getsockname", "sysmips", "cacheflush", "cachectl", "debug", nullptr, nullptr, nullptr, "nfssvc", "getdirentries",
+ "statfs", "fstatfs", "unmount", "async_daemon", "getfh", "getdomainname","setdomainname",nullptr, "quotactl", "old_exportfs",
+ "mount", "hdwconf", "exportfs", "nfsfh_open", "libattach", "libdetach"
+ };
+
+ static char const *const msg_syscalls[] = { "msgget", "msgctl", "msgrcv", "msgsnd" };
+ static char const *const shm_syscalls[] = { "shmat", "shmctl", "shmdt", "shmget" };
+ static char const *const sem_syscalls[] = { "semctl", "semget", "semop" };
+ static char const *const mips_syscalls[] = { "mipskopt", "mipshwconf", "mipsgetrusage", "mipswait", "mipscacheflush", "mipscachectl" };
+
+ unsigned const asid = (m_cop0[COP0_EntryHi] & EH_ASID) >> 6;
+ switch (m_r[2])
+ {
+ case 1000: // indirect
+ switch (m_r[4])
+ {
+ case 1049: // msgsys
+ LOGMASKED(LOG_RISCOS, "asid %d syscall msgsys:%s() (%s)\n",
+ asid, (m_r[5] < ARRAY_LENGTH(msg_syscalls)) ? msg_syscalls[m_r[5]] : "unknown", machine().describe_context());
+ break;
+
+ case 1052: // shmsys
+ LOGMASKED(LOG_RISCOS, "asid %d syscall shmsys:%s() (%s)\n",
+ asid, (m_r[5] < ARRAY_LENGTH(shm_syscalls)) ? shm_syscalls[m_r[5]] : "unknown", machine().describe_context());
+ break;
+
+ case 1053: // semsys
+ LOGMASKED(LOG_RISCOS, "asid %d syscall semsys:%s() (%s)\n",
+ asid, (m_r[5] < ARRAY_LENGTH(sem_syscalls)) ? sem_syscalls[m_r[5]] : "unknown", machine().describe_context());
+ break;
+
+ case 2151: // bsd_sysmips
+ switch (m_r[5])
+ {
+ case 0x100: // mipskopt
+ LOGMASKED(LOG_RISCOS, "asid %d syscall bsd_sysmips:mipskopt(\"%s\") (%s)\n",
+ asid, debug_string(m_r[6]), machine().describe_context());
+ break;
+
+ default:
+ if ((m_r[5] > 0x100) && (m_r[5] - 0x100) < ARRAY_LENGTH(mips_syscalls))
+ LOGMASKED(LOG_RISCOS, "asid %d syscall bsd_sysmips:%s() (%s)\n",
+ asid, mips_syscalls[m_r[5] - 0x100], machine().describe_context());
+ else
+ LOGMASKED(LOG_RISCOS, "asid %d syscall bsd_sysmips:unknown %d (%s)\n",
+ asid, m_r[5], machine().describe_context());
+ break;
+ }
+ break;
+
+ default:
+ if ((m_r[4] > 2000) && (m_r[4] - 2000 < ARRAY_LENGTH(bsd_syscalls)) && bsd_syscalls[m_r[4] - 2000])
+ LOGMASKED(LOG_RISCOS, "asid %d syscall bsd_%s() (%s)\n",
+ asid, bsd_syscalls[m_r[4] - 2000], machine().describe_context());
+ else
+ LOGMASKED(LOG_RISCOS, "asid %d syscall indirect:unknown %d (%s)\n",
+ asid, m_r[4], machine().describe_context());
+ break;
+ }
+ break;
+
+ case 1003: // read
+ case 1006: // close
+ case 1054: // ioctl
+ case 1169: // fcntl
+ LOGMASKED(LOG_RISCOS, "asid %d syscall %s(%d) (%s)\n",
+ asid, sysv_syscalls[m_r[2] - 1000], m_r[4], machine().describe_context());
+ break;
+
+ case 1004: // write
+ if (m_r[4] == 1 || m_r[4] == 2)
+ LOGMASKED(LOG_RISCOS, "asid %d syscall %s(%d, \"%s\") (%s)\n",
+ asid, sysv_syscalls[m_r[2] - 1000], m_r[4], debug_string(m_r[5], m_r[6]), machine().describe_context());
+ else
+ LOGMASKED(LOG_RISCOS, "asid %d syscall %s(%d) (%s)\n",
+ asid, sysv_syscalls[m_r[2] - 1000], m_r[4], machine().describe_context());
+ break;
+
+ case 1005: // open
+ case 1008: // creat
+ case 1009: // link
+ case 1010: // unlink
+ case 1012: // chdir
+ case 1018: // stat
+ case 1033: // access
+ LOGMASKED(LOG_RISCOS, "asid %d syscall %s(\"%s\") (%s)\n",
+ asid, sysv_syscalls[m_r[2] - 1000], debug_string(m_r[4]), machine().describe_context());
+ break;
+
+ case 1059: // execve
+ LOGMASKED(LOG_RISCOS, "asid %d syscall execve(\"%s\", [ %s ], [ %s ]) (%s)\n",
+ asid, debug_string(m_r[4]), debug_string_array(m_r[5]), debug_string_array(m_r[6]), machine().describe_context());
+ break;
+
+ case 1060: // umask
+ LOGMASKED(LOG_RISCOS, "asid %d syscall umask(%#o) (%s)\n",
+ asid, m_r[4] & 0777, machine().describe_context());
+ break;
+
+ default:
+ if ((m_r[2] > 1000) && (m_r[2] - 1000 < ARRAY_LENGTH(sysv_syscalls)) && sysv_syscalls[m_r[2] - 1000])
+ LOGMASKED(LOG_RISCOS, "asid %d syscall %s() (%s)\n", asid, sysv_syscalls[m_r[2] - 1000], machine().describe_context());
+ else
+ LOGMASKED(LOG_RISCOS, "asid %d syscall unknown %d (%s)\n", asid, m_r[2], machine().describe_context());
+ break;
+ }
+ }
+
// set the exception PC
- m_cpr[0][COP0_EPC] = m_pc;
+ m_cop0[COP0_EPC] = m_pc;
- // put the cause in the low 8 bits and clear the branch delay flag
- CAUSE = (CAUSE & ~0x800000ff) | (exception << 2);
+ // load the cause register
+ CAUSE = (CAUSE & CAUSE_IP) | exception;
// if in a branch delay slot, restart the branch
if (m_branch_state == DELAY)
{
- m_cpr[0][COP0_EPC] -= 4;
- CAUSE |= 0x80000000;
+ m_cop0[COP0_EPC] -= 4;
+ CAUSE |= CAUSE_BD;
}
m_branch_state = EXCEPTION;
// shift the exception bits
- SR = (SR & 0xffffffc0) | ((SR << 2) & 0x3c);
+ SR = (SR & ~SR_KUIE) | ((SR << 2) & SR_KUIEop);
if (refill)
m_pc = (SR & SR_BEV) ? 0xbfc00100 : 0x80000000;
@@ -295,109 +840,369 @@ void mips1core_device_base::generate_exception(int exception, bool refill)
m_pc = (SR & SR_BEV) ? 0xbfc00180 : 0x80000080;
debugger_exception_hook(exception);
+
+ if (SR & SR_KUp)
+ debugger_privilege_hook();
}
void mips1core_device_base::check_irqs()
{
- if ((CAUSE & SR & 0xff00) && (SR & SR_IEc))
+ if ((CAUSE & SR & SR_IM) && (SR & SR_IEc))
generate_exception(EXCEPTION_INTERRUPT);
}
-void mips1core_device_base::set_irq_line(int irqline, int state)
-{
- if (state != CLEAR_LINE)
- CAUSE |= 0x400 << irqline;
- else
- CAUSE &= ~(0x400 << irqline);
-
- check_irqs();
-}
-
-u32 mips1core_device_base::get_cop0_reg(int const index)
+void mips1core_device_base::handle_cop0(u32 const op)
{
- return m_cpr[0][index];
+ switch (RSREG)
+ {
+ case 0x00: // MFC0
+ m_r[RTREG] = get_cop0_reg(RDREG);
+ break;
+ case 0x04: // MTC0
+ set_cop0_reg(RDREG, m_r[RTREG]);
+ break;
+ case 0x08: // BC0
+ switch (RTREG)
+ {
+ case 0x00: // BC0F
+ if (!m_in_brcond[0]())
+ {
+ m_branch_state = BRANCH;
+ m_branch_target = m_pc + 4 + (s32(SIMMVAL) << 2);
+ }
+ break;
+ case 0x01: // BC0T
+ if (m_in_brcond[0]())
+ {
+ m_branch_state = BRANCH;
+ m_branch_target = m_pc + 4 + (s32(SIMMVAL) << 2);
+ }
+ break;
+ default:
+ generate_exception(EXCEPTION_INVALIDOP);
+ break;
+ }
+ break;
+ case 0x10: // COP0
+ switch (op & 31)
+ {
+ case 0x10: // RFE
+ SR = (SR & ~SR_KUIEpc) | ((SR >> 2) & SR_KUIEpc);
+ if (bool(SR & SR_KUc) ^ bool(SR & SR_KUp))
+ debugger_privilege_hook();
+ break;
+ default:
+ generate_exception(EXCEPTION_INVALIDOP);
+ break;
+ }
+ break;
+ default:
+ generate_exception(EXCEPTION_INVALIDOP);
+ break;
+ }
}
-u32 mips1_device_base::get_cop0_reg(int const index)
+u32 mips1core_device_base::get_cop0_reg(unsigned const reg)
{
- // assume 64-entry tlb with 8 wired entries
- if (index == COP0_Random)
- m_cpr[0][index] = (63 - ((total_cycles() - m_reset_time) % 56)) << 8;
-
- return m_cpr[0][index];
+ return m_cop0[reg];
}
-void mips1core_device_base::set_cop0_reg(int const index, u32 const data)
+void mips1core_device_base::set_cop0_reg(unsigned const reg, u32 const data)
{
- if (index == COP0_Cause)
+ switch (reg)
{
- CAUSE = (CAUSE & 0xfc00) | (data & ~0xfc00);
-
- // update interrupts -- software ints can occur this way
- check_irqs();
- }
- else if (index == COP0_Status)
+ case COP0_Context:
+ m_cop0[COP0_Context] = (m_cop0[COP0_Context] & ~PTE_BASE) | (data & PTE_BASE);
+ break;
+ case COP0_Status:
{
- m_cpr[0][index] = data;
+ u32 const delta = SR ^ data;
+
+ m_cop0[COP0_Status] = data;
// handle cache isolation and swap
m_data_spacenum = (data & SR_IsC) ? ((data & SR_SwC) ? 1 : 2) : 0;
// update interrupts
+ if (delta & (SR_IEc | SR_IM))
+ check_irqs();
+
+ if ((delta & SR_KUc) && (m_branch_state != EXCEPTION))
+ debugger_privilege_hook();
+ }
+ break;
+ case COP0_Cause:
+ CAUSE = (CAUSE & CAUSE_IPEX) | (data & ~CAUSE_IPEX);
+
+ // update interrupts -- software ints can occur this way
check_irqs();
+ break;
+ case COP0_PRId:
+ // read-only register
+ break;
+
+ default:
+ m_cop0[reg] = data;
+ break;
}
- else if (index == COP0_Context)
- m_cpr[0][index] = (m_cpr[0][index] & ~PTE_BASE) | (data & PTE_BASE);
- else if (index != COP0_PRId)
- m_cpr[0][index] = data;
}
-void mips1core_device_base::handle_cop0(u32 const op)
+void mips1core_device_base::handle_cop1(u32 const op)
{
- switch (RSREG)
+ if (!(SR & SR_COP1))
+ generate_exception(EXCEPTION_BADCOP1);
+}
+
+void mips1core_device_base::handle_cop2(u32 const op)
+{
+ if (SR & SR_COP2)
{
- case 0x00: /* MFCz */ if (RTREG) RTVAL = get_cop0_reg(RDREG); break;
- case 0x02: /* CFCz */ if (RTREG) RTVAL = get_cop_creg<0>(RDREG); break;
- case 0x04: /* MTCz */ set_cop0_reg(RDREG, RTVAL); break;
- case 0x06: /* CTCz */ set_cop_creg<0>(RDREG, RTVAL); break;
- case 0x08: /* BC */
+ switch (RSREG)
+ {
+ case 0x08: // BC2
switch (RTREG)
{
- case 0x00: /* BCzF */ if (!m_in_brcond[0]()) ADDPC(SIMMVAL); break;
- case 0x01: /* BCzT */ if (m_in_brcond[0]()) ADDPC(SIMMVAL); break;
- case 0x02: /* BCzFL */ generate_exception(EXCEPTION_INVALIDOP); break;
- case 0x03: /* BCzTL */ generate_exception(EXCEPTION_INVALIDOP); break;
- default: generate_exception(EXCEPTION_INVALIDOP); break;
+ case 0x00: // BC2F
+ if (!m_in_brcond[2]())
+ {
+ m_branch_state = BRANCH;
+ m_branch_target = m_pc + 4 + (s32(SIMMVAL) << 2);
+ }
+ break;
+ case 0x01: // BC2T
+ if (m_in_brcond[2]())
+ {
+ m_branch_state = BRANCH;
+ m_branch_target = m_pc + 4 + (s32(SIMMVAL) << 2);
+ }
+ break;
+ default:
+ generate_exception(EXCEPTION_INVALIDOP);
+ break;
}
break;
- case 0x10:
- case 0x11:
- case 0x12:
- case 0x13:
- case 0x14:
- case 0x15:
- case 0x16:
- case 0x17:
- case 0x18:
- case 0x19:
- case 0x1a:
- case 0x1b:
- case 0x1c:
- case 0x1d:
- case 0x1e:
- case 0x1f: /* COP */
- switch (op & 0x01ffffff)
+ default:
+ generate_exception(EXCEPTION_INVALIDOP);
+ break;
+ }
+ }
+ else
+ generate_exception(EXCEPTION_BADCOP2);
+}
+
+void mips1core_device_base::handle_cop3(u32 const op)
+{
+ if (SR & SR_COP3)
+ {
+ switch (RSREG)
+ {
+ case 0x08: // BC3
+ switch (RTREG)
{
- case 0x01: /* TLBR */ break;
- case 0x02: /* TLBWI */ break;
- case 0x06: /* TLBWR */ break;
- case 0x08: /* TLBP */ break;
- case 0x10: /* RFE */ SR = (SR & 0xfffffff0) | ((SR >> 2) & 0x0f); break;
- case 0x18: /* ERET */ generate_exception(EXCEPTION_INVALIDOP); break;
- default: generate_exception(EXCEPTION_INVALIDOP); break;
+ case 0x00: // BC3F
+ if (!m_in_brcond[3]())
+ {
+ m_branch_state = BRANCH;
+ m_branch_target = m_pc + 4 + (s32(SIMMVAL) << 2);
+ }
+ break;
+ case 0x01: // BC3T
+ if (m_in_brcond[3]())
+ {
+ m_branch_state = BRANCH;
+ m_branch_target = m_pc + 4 + (s32(SIMMVAL) << 2);
+ }
+ break;
+ default:
+ generate_exception(EXCEPTION_INVALIDOP);
+ break;
}
break;
- default: generate_exception(EXCEPTION_INVALIDOP); break;
+ default:
+ generate_exception(EXCEPTION_INVALIDOP);
+ break;
+ }
+ }
+ else
+ generate_exception(EXCEPTION_BADCOP3);
+}
+
+void mips1core_device_base::lwl(u32 const op)
+{
+ offs_t const offset = SIMMVAL + m_r[RSREG];
+ load<u32>(offset & ~3, [this, op, offset](u32 temp)
+ {
+ unsigned const shift = ((offset & 3) ^ ENDIAN_VALUE_LE_BE(m_endianness, 3, 0)) << 3;
+
+ m_r[RTREG] = (m_r[RTREG] & ~u32(0xffffffffU << shift)) | (temp << shift);
+ });
+}
+
+void mips1core_device_base::lwr(u32 const op)
+{
+ offs_t const offset = SIMMVAL + m_r[RSREG];
+ load<u32>(offset & ~3, [this, op, offset](u32 temp)
+ {
+ unsigned const shift = ((offset & 0x3) ^ ENDIAN_VALUE_LE_BE(m_endianness, 0, 3)) << 3;
+
+ m_r[RTREG] = (m_r[RTREG] & ~u32(0xffffffffU >> shift)) | (temp >> shift);
+ });
+}
+
+void mips1core_device_base::swl(u32 const op)
+{
+ offs_t const offset = SIMMVAL + m_r[RSREG];
+ unsigned const shift = ((offset & 3) ^ ENDIAN_VALUE_LE_BE(m_endianness, 3, 0)) << 3;
+
+ store<u32>(offset & ~3, m_r[RTREG] >> shift, 0xffffffffU >> shift);
+}
+
+void mips1core_device_base::swr(u32 const op)
+{
+ offs_t const offset = SIMMVAL + m_r[RSREG];
+ unsigned const shift = ((offset & 3) ^ ENDIAN_VALUE_LE_BE(m_endianness, 0, 3)) << 3;
+
+ store<u32>(offset & ~3, m_r[RTREG] << shift, 0xffffffffU << shift);
+}
+
+template <typename T, typename U> std::enable_if_t<std::is_convertible<U, std::function<void(T)>>::value, void> mips1core_device_base::load(u32 address, U &&apply)
+{
+ if (memory_translate(m_data_spacenum, TRANSLATE_READ, address))
+ {
+ switch (sizeof(T))
+ {
+ case 1: apply(T(space(m_data_spacenum).read_byte(address))); break;
+ case 2: apply(T(space(m_data_spacenum).read_word(address))); break;
+ case 4: apply(T(space(m_data_spacenum).read_dword(address))); break;
+ }
+ }
+}
+
+template <typename T, typename U> std::enable_if_t<std::is_convertible<U, T>::value, void> mips1core_device_base::store(u32 address, U data, T mem_mask)
+{
+ if (memory_translate(m_data_spacenum, TRANSLATE_WRITE, address))
+ {
+ switch (sizeof(T))
+ {
+ case 1: space(m_data_spacenum).write_byte(address, T(data)); break;
+ case 2: space(m_data_spacenum).write_word(address, T(data), mem_mask); break;
+ case 4: space(m_data_spacenum).write_dword(address, T(data), mem_mask); break;
+ }
+ }
+}
+
+bool mips1core_device_base::fetch(u32 address, std::function<void(u32)> &&apply)
+{
+ if (memory_translate(0, TRANSLATE_FETCH, address))
+ {
+ apply(space(0).read_dword(address));
+
+ return true;
+ }
+ else
+ return false;
+}
+
+std::string mips1core_device_base::debug_string(u32 string_pointer, unsigned const limit)
+{
+ auto const suppressor(machine().disable_side_effects());
+
+ bool done = false;
+ bool mapped = false;
+ std::string result("");
+
+ while (!done)
+ {
+ done = true;
+ load<u8>(string_pointer++, [limit, &done, &mapped, &result](u8 byte)
+ {
+ mapped = true;
+ if (byte != 0)
+ {
+ result += byte;
+
+ done = result.length() == limit;
+ }
+ });
+ }
+
+ if (!mapped)
+ result.assign("[unmapped]");
+
+ return result;
+}
+
+std::string mips1core_device_base::debug_string_array(u32 array_pointer)
+{
+ auto const suppressor(machine().disable_side_effects());
+
+ bool done = false;
+ std::string result("");
+
+ while (!done)
+ {
+ done = true;
+ load<u32>(array_pointer, [this, &done, &result](u32 string_pointer)
+ {
+ if (string_pointer != 0)
+ {
+ if (!result.empty())
+ result += ", ";
+
+ result += '\"' + debug_string(string_pointer) + '\"';
+
+ done = false;
+ }
+ });
+
+ array_pointer += 4;
+ }
+
+ return result;
+}
+
+void mips1_device_base::device_start()
+{
+ mips1core_device_base::device_start();
+
+ // cop0 tlb registers
+ state_add(MIPS1_COP0 + COP0_Index, "Index", m_cop0[COP0_Index]);
+ state_add(MIPS1_COP0 + COP0_Random, "Random", m_cop0[COP0_Random]);
+ state_add(MIPS1_COP0 + COP0_EntryLo, "EntryLo", m_cop0[COP0_EntryLo]);
+ state_add(MIPS1_COP0 + COP0_EntryHi, "EntryHi", m_cop0[COP0_EntryHi]);
+ state_add(MIPS1_COP0 + COP0_Context, "Context", m_cop0[COP0_Context]);
+
+ // cop1 registers
+ if (m_fcr0)
+ {
+ state_add(MIPS1_FCR31, "FCSR", m_fcr31);
+ for (unsigned i = 0; i < ARRAY_LENGTH(m_f); i++)
+ state_add(MIPS1_F0 + i, util::string_format("F%d", i).c_str(), m_f[i]);
+ }
+
+ save_item(NAME(m_reset_time));
+ save_item(NAME(m_tlb));
+
+ save_item(NAME(m_fcr30));
+ save_item(NAME(m_fcr31));
+ save_item(NAME(m_f));
+}
+
+void mips1_device_base::device_reset()
+{
+ mips1core_device_base::device_reset();
+
+ // tlb is not shut down
+ m_cop0[COP0_Status] &= ~SR_TS;
+
+ m_reset_time = total_cycles();
+
+ // initialize tlb mru index with identity mapping
+ for (unsigned i = 0; i < ARRAY_LENGTH(m_tlb); i++)
+ {
+ m_tlb_mru[TRANSLATE_READ][i] = i;
+ m_tlb_mru[TRANSLATE_WRITE][i] = i;
+ m_tlb_mru[TRANSLATE_FETCH][i] = i;
}
}
@@ -407,26 +1212,26 @@ void mips1_device_base::handle_cop0(u32 const op)
{
case 0x42000001: // TLBR - read tlb
{
- u8 const index = (m_cpr[0][COP0_Index] >> 8) & 0x3f;
+ u8 const index = (m_cop0[COP0_Index] >> 8) & 0x3f;
- m_cpr[0][COP0_EntryHi] = m_tlb[index][0];
- m_cpr[0][COP0_EntryLo] = m_tlb[index][1];
+ m_cop0[COP0_EntryHi] = m_tlb[index][0];
+ m_cop0[COP0_EntryLo] = m_tlb[index][1];
}
break;
case 0x42000002: // TLBWI - write tlb (indexed)
{
- u8 const index = (m_cpr[0][COP0_Index] >> 8) & 0x3f;
+ u8 const index = (m_cop0[COP0_Index] >> 8) & 0x3f;
- m_tlb[index][0] = m_cpr[0][COP0_EntryHi];
- m_tlb[index][1] = m_cpr[0][COP0_EntryLo];
+ m_tlb[index][0] = m_cop0[COP0_EntryHi];
+ m_tlb[index][1] = m_cop0[COP0_EntryLo];
LOGMASKED(LOG_TLB, "tlb write index %d asid %d vpn 0x%08x pfn 0x%08x %c%c%c%c (%s)\n",
- index, (m_cpr[0][COP0_EntryHi] & EH_ASID) >> 6, m_cpr[0][COP0_EntryHi] & EH_VPN, m_cpr[0][COP0_EntryLo] & EL_PFN,
- m_cpr[0][COP0_EntryLo] & EL_N ? 'N' : '-',
- m_cpr[0][COP0_EntryLo] & EL_D ? 'D' : '-',
- m_cpr[0][COP0_EntryLo] & EL_V ? 'V' : '-',
- m_cpr[0][COP0_EntryLo] & EL_G ? 'G' : '-',
+ index, (m_cop0[COP0_EntryHi] & EH_ASID) >> 6, m_cop0[COP0_EntryHi] & EH_VPN, m_cop0[COP0_EntryLo] & EL_PFN,
+ m_cop0[COP0_EntryLo] & EL_N ? 'N' : '-',
+ m_cop0[COP0_EntryLo] & EL_D ? 'D' : '-',
+ m_cop0[COP0_EntryLo] & EL_V ? 'V' : '-',
+ m_cop0[COP0_EntryLo] & EL_G ? 'G' : '-',
machine().describe_context());
}
break;
@@ -435,37 +1240,37 @@ void mips1_device_base::handle_cop0(u32 const op)
{
u8 const random = get_cop0_reg(COP0_Random) >> 8;
- m_tlb[random][0] = m_cpr[0][COP0_EntryHi];
- m_tlb[random][1] = m_cpr[0][COP0_EntryLo];
+ m_tlb[random][0] = m_cop0[COP0_EntryHi];
+ m_tlb[random][1] = m_cop0[COP0_EntryLo];
LOGMASKED(LOG_TLB, "tlb write random %d asid %d vpn 0x%08x pfn 0x%08x %c%c%c%c (%s)\n",
- random, (m_cpr[0][COP0_EntryHi] & EH_ASID) >> 6, m_cpr[0][COP0_EntryHi] & EH_VPN, m_cpr[0][COP0_EntryLo] & EL_PFN,
- m_cpr[0][COP0_EntryLo] & EL_N ? 'N' : '-',
- m_cpr[0][COP0_EntryLo] & EL_D ? 'D' : '-',
- m_cpr[0][COP0_EntryLo] & EL_V ? 'V' : '-',
- m_cpr[0][COP0_EntryLo] & EL_G ? 'G' : '-',
+ random, (m_cop0[COP0_EntryHi] & EH_ASID) >> 6, m_cop0[COP0_EntryHi] & EH_VPN, m_cop0[COP0_EntryLo] & EL_PFN,
+ m_cop0[COP0_EntryLo] & EL_N ? 'N' : '-',
+ m_cop0[COP0_EntryLo] & EL_D ? 'D' : '-',
+ m_cop0[COP0_EntryLo] & EL_V ? 'V' : '-',
+ m_cop0[COP0_EntryLo] & EL_G ? 'G' : '-',
machine().describe_context());
}
break;
case 0x42000008: // TLBP - probe tlb
- m_cpr[0][COP0_Index] = 0x80000000;
+ m_cop0[COP0_Index] = 0x80000000;
for (u8 index = 0; index < 64; index++)
{
// test vpn and optionally asid
u32 const mask = (m_tlb[index][1] & EL_G) ? EH_VPN : EH_VPN | EH_ASID;
- if ((m_tlb[index][0] & mask) == (m_cpr[0][COP0_EntryHi] & mask))
+ if ((m_tlb[index][0] & mask) == (m_cop0[COP0_EntryHi] & mask))
{
LOGMASKED(LOG_TLB, "tlb probe hit vpn 0x%08x index %d (%s)\n",
- m_cpr[0][COP0_EntryHi] & mask, index, machine().describe_context());
+ m_cop0[COP0_EntryHi] & mask, index, machine().describe_context());
- m_cpr[0][COP0_Index] = index << 8;
+ m_cop0[COP0_Index] = index << 8;
break;
}
}
- if ((VERBOSE & LOG_TLB) && BIT(m_cpr[0][COP0_Index], 31))
+ if ((VERBOSE & LOG_TLB) && BIT(m_cop0[COP0_Index], 31))
LOGMASKED(LOG_TLB, "tlb probe miss asid %d vpn 0x%08x(%s)\n",
- (m_cpr[0][COP0_EntryHi] & EH_ASID) >> 6, m_cpr[0][COP0_EntryHi] & EH_VPN, machine().describe_context());
+ (m_cop0[COP0_EntryHi] & EH_ASID) >> 6, m_cop0[COP0_EntryHi] & EH_VPN, machine().describe_context());
break;
default:
@@ -473,491 +1278,558 @@ void mips1_device_base::handle_cop0(u32 const op)
}
}
-void mips1core_device_base::set_cop1_creg(int idx, u32 val)
+u32 mips1_device_base::get_cop0_reg(unsigned const reg)
{
- // fpu revision register is read-only
- if (idx)
- m_ccr[1][idx] = val;
+ // assume 64-entry tlb with 8 wired entries
+ if (reg == COP0_Random)
+ m_cop0[reg] = (63 - ((total_cycles() - m_reset_time) % 56)) << 8;
+
+ return m_cop0[reg];
}
-void mips1core_device_base::handle_cop1(u32 const op)
+void mips1_device_base::handle_cop1(u32 const op)
{
- if (!m_hasfpu)
- return;
-
- switch (RSREG)
+ if (!(SR & SR_COP1))
{
- case 0x00: /* MFCz */ if (RTREG) RTVAL = get_cop_reg<1>(RDREG); break;
- case 0x02: /* CFCz */ if (RTREG) RTVAL = get_cop_creg<1>(RDREG); break;
- case 0x04: /* MTCz */ set_cop_reg<1>(RDREG, RTVAL); break;
- case 0x06: /* CTCz */ set_cop1_creg(RDREG, RTVAL); break;
- case 0x08: /* BC */
- switch (RTREG)
- {
- case 0x00: /* BCzF */ if (!m_in_brcond[1]()) ADDPC(SIMMVAL); break;
- case 0x01: /* BCzT */ if (m_in_brcond[1]()) ADDPC(SIMMVAL); break;
- case 0x02: /* BCzFL */ generate_exception(EXCEPTION_INVALIDOP); break;
- case 0x03: /* BCzTL */ generate_exception(EXCEPTION_INVALIDOP); break;
- default: generate_exception(EXCEPTION_INVALIDOP); break;
- }
- break;
- case 0x10:
- case 0x11:
- case 0x12:
- case 0x13:
- case 0x14:
- case 0x15:
- case 0x16:
- case 0x17:
- case 0x18:
- case 0x19:
- case 0x1a:
- case 0x1b:
- case 0x1c:
- case 0x1d:
- case 0x1e:
- case 0x1f: /* COP */ generate_exception(EXCEPTION_INVALIDOP); break;
- default: generate_exception(EXCEPTION_INVALIDOP); break;
+ generate_exception(EXCEPTION_BADCOP1);
+ return;
}
-}
-template <unsigned Coprocessor> void mips1core_device_base::handle_cop(u32 const op)
-{
- switch (RSREG)
+ if (!m_fcr0)
+ return;
+
+ switch (op >> 26)
{
- case 0x00: /* MFCz */ if (RTREG) RTVAL = get_cop_reg<Coprocessor>(RDREG); break;
- case 0x02: /* CFCz */ if (RTREG) RTVAL = get_cop_creg<Coprocessor>(RDREG); break;
- case 0x04: /* MTCz */ set_cop_reg<Coprocessor>(RDREG, RTVAL); break;
- case 0x06: /* CTCz */ set_cop_creg<Coprocessor>(RDREG, RTVAL); break;
- case 0x08: /* BC */
- switch (RTREG)
+ case 0x11: // COP1
+ switch ((op >> 21) & 0x1f)
+ {
+ case 0x00: // MFC1
+ if (FSREG & 1)
+ // move the high half of the floating point register
+ m_r[RTREG] = m_f[FSREG >> 1] >> 32;
+ else
+ // move the low half of the floating point register
+ m_r[RTREG] = m_f[FSREG >> 1] >> 0;
+ break;
+ case 0x02: // CFC1
+ switch (FSREG)
{
- case 0x00: /* BCzF */ if (!m_in_brcond[Coprocessor]()) ADDPC(SIMMVAL); break;
- case 0x01: /* BCzT */ if (m_in_brcond[Coprocessor]()) ADDPC(SIMMVAL); break;
- case 0x02: /* BCzFL */ generate_exception(EXCEPTION_INVALIDOP); break;
- case 0x03: /* BCzTL */ generate_exception(EXCEPTION_INVALIDOP); break;
- default: generate_exception(EXCEPTION_INVALIDOP); break;
+ case 0: m_r[RTREG] = m_fcr0; break;
+ case 30: m_r[RTREG] = m_fcr30; break;
+ case 31: m_r[RTREG] = m_fcr31; break;
+ break;
+
+ default:
+ logerror("cfc1 undefined fpu control register %d (%s)\n", FSREG, machine().describe_context());
+ break;
}
break;
- case 0x10:
- case 0x11:
- case 0x12:
- case 0x13:
- case 0x14:
- case 0x15:
- case 0x16:
- case 0x17:
- case 0x18:
- case 0x19:
- case 0x1a:
- case 0x1b:
- case 0x1c:
- case 0x1d:
- case 0x1e:
- case 0x1f: /* COP */ generate_exception(EXCEPTION_INVALIDOP); break;
- default: generate_exception(EXCEPTION_INVALIDOP); break;
- }
-}
+ case 0x04: // MTC1
+ if (FSREG & 1)
+ // load the high half of the floating point register
+ m_f[FSREG >> 1] = (u64(m_r[RTREG]) << 32) | u32(m_f[FSREG >> 1]);
+ else
+ // load the low half of the floating point register
+ m_f[FSREG >> 1] = (m_f[FSREG >> 1] & ~0xffffffffULL) | m_r[RTREG];
+ break;
+ case 0x06: // CTC1
+ switch (RDREG)
+ {
+ case 0: // register is read-only
+ break;
-void mips1core_device_base::execute_run()
-{
- // check for IRQs
- check_irqs();
+ case 30:
+ m_fcr30 = m_r[RTREG];
+ break;
- // core execution loop
- do
- {
- // debugging
- debugger_instruction_hook(m_pc);
+ case 31:
+ m_fcr31 = m_r[RTREG];
-#if ENABLE_IOP_KPUTS
- if ((m_pc & 0x1fffffff) == 0x00012C48 || (m_pc & 0x1fffffff) == 0x0001420C || (m_pc & 0x1fffffff) == 0x0001430C)
- {
- u32 ptr = m_r[5];
- u32 length = m_r[6];
- if (length >= 4096)
- length = 4095;
- while (length)
- {
- load<u8>(ptr, [this](char c) { printf("%c", c); });
- ptr++;
- length--;
- }
- fflush(stdout);
- }
-#endif
+ // update rounding mode
+ switch (m_fcr31 & FCR31_RM)
+ {
+ case 0: softfloat_roundingMode = softfloat_round_near_even; break;
+ case 1: softfloat_roundingMode = softfloat_round_minMag; break;
+ case 2: softfloat_roundingMode = softfloat_round_max; break;
+ case 3: softfloat_roundingMode = softfloat_round_min; break;
+ }
- // fetch and execute instruction
- fetch(m_pc, [this](u32 const op)
- {
- // parse the instruction
- switch (op >> 26)
+ // exception check
+ if ((m_fcr31 & FCR31_CE) || ((m_fcr31 & FCR31_CM) >> 5) & (m_fcr31 & FCR31_EM))
+ execute_set_input(m_fpu_irq, ASSERT_LINE);
+ break;
+
+ default:
+ logerror("ctc1 undefined fpu control register %d (%s)\n", RDREG, machine().describe_context());
+ break;
+ }
+ break;
+ case 0x08: // BC
+ switch ((op >> 16) & 0x1f)
+ {
+ case 0x00: // BC1F
+ if (!(m_fcr31 & FCR31_C))
{
- case 0x00: /* SPECIAL */
- switch (op & 63)
- {
- case 0x00: /* SLL */ if (RDREG) RDVAL = RTVAL << SHIFT; break;
- case 0x02: /* SRL */ if (RDREG) RDVAL = RTVAL >> SHIFT; break;
- case 0x03: /* SRA */ if (RDREG) RDVAL = s32(RTVAL) >> SHIFT; break;
- case 0x04: /* SLLV */ if (RDREG) RDVAL = RTVAL << (RSVAL & 31); break;
- case 0x06: /* SRLV */ if (RDREG) RDVAL = RTVAL >> (RSVAL & 31); break;
- case 0x07: /* SRAV */ if (RDREG) RDVAL = s32(RTVAL) >> (RSVAL & 31); break;
- case 0x08: /* JR */ SETPC(RSVAL); break;
- case 0x09: /* JALR */ SETPCL(RSVAL, RDREG); break;
- case 0x0c: /* SYSCALL */ generate_exception(EXCEPTION_SYSCALL); break;
- case 0x0d: /* BREAK */ generate_exception(EXCEPTION_BREAK); break;
- case 0x0f: /* SYNC */ generate_exception(EXCEPTION_INVALIDOP); break;
- case 0x10: /* MFHI */ if (RDREG) RDVAL = m_hi; break;
- case 0x11: /* MTHI */ m_hi = RSVAL; break;
- case 0x12: /* MFLO */ if (RDREG) RDVAL = m_lo; break;
- case 0x13: /* MTLO */ m_lo = RSVAL; break;
- case 0x18: /* MULT */
- {
- u64 product = mul_32x32(RSVAL, RTVAL);
+ m_branch_state = BRANCH;
+ m_branch_target = m_pc + 4 + (s32(SIMMVAL) << 2);
+ }
+ break;
+ case 0x01: // BC1T
+ if (m_fcr31 & FCR31_C)
+ {
+ m_branch_state = BRANCH;
+ m_branch_target = m_pc + 4 + (s32(SIMMVAL) << 2);
+ }
+ break;
- m_lo = product;
- m_hi = product >> 32;
- m_icount -= 11;
- }
- break;
- case 0x19: /* MULTU */
- {
- u64 product = mulu_32x32(RSVAL, RTVAL);
+ default:
+ // unimplemented operation
+ m_fcr31 |= FCR31_CE;
+ execute_set_input(m_fpu_irq, ASSERT_LINE);
+ break;
+ }
+ break;
+ case 0x10: // S
+ switch (op & 0x3f)
+ {
+ case 0x00: // ADD.S
+ set_cop1_reg(FDREG >> 1, f32_add(float32_t{ u32(m_f[FSREG >> 1]) }, float32_t{ u32(m_f[FTREG >> 1]) }).v);
+ break;
+ case 0x01: // SUB.S
+ set_cop1_reg(FDREG >> 1, f32_sub(float32_t{ u32(m_f[FSREG >> 1]) }, float32_t{ u32(m_f[FTREG >> 1]) }).v);
+ break;
+ case 0x02: // MUL.S
+ set_cop1_reg(FDREG >> 1, f32_mul(float32_t{ u32(m_f[FSREG >> 1]) }, float32_t{ u32(m_f[FTREG >> 1]) }).v);
+ break;
+ case 0x03: // DIV.S
+ set_cop1_reg(FDREG >> 1, f32_div(float32_t{ u32(m_f[FSREG >> 1]) }, float32_t{ u32(m_f[FTREG >> 1]) }).v);
+ break;
+ case 0x05: // ABS.S
+ if (f32_lt(float32_t{ u32(m_f[FSREG >> 1]) }, float32_t{ 0 }))
+ set_cop1_reg(FDREG >> 1, f32_mul(float32_t{ u32(m_f[FSREG >> 1]) }, i32_to_f32(-1)).v);
+ else
+ set_cop1_reg(FDREG >> 1, m_f[FSREG >> 1]);
+ break;
+ case 0x06: // MOV.S
+ m_f[FDREG >> 1] = m_f[FSREG >> 1];
+ break;
+ case 0x07: // NEG.S
+ set_cop1_reg(FDREG >> 1, f32_mul(float32_t{ u32(m_f[FSREG >> 1]) }, i32_to_f32(-1)).v);
+ break;
- m_lo = product;
- m_hi = product >> 32;
- m_icount -= 11;
- }
- break;
- case 0x1a: /* DIV */
- if (RTVAL)
- {
- m_lo = s32(RSVAL) / s32(RTVAL);
- m_hi = s32(RSVAL) % s32(RTVAL);
- }
- m_icount -= 34;
- break;
- case 0x1b: /* DIVU */
- if (RTVAL)
- {
- m_lo = RSVAL / RTVAL;
- m_hi = RSVAL % RTVAL;
- }
- m_icount -= 34;
- break;
- case 0x20: /* ADD */
- {
- u32 const sum = RSVAL + RTVAL;
-
- // overflow: (sign(addend0) == sign(addend1)) && (sign(addend0) != sign(sum))
- if (!BIT(RSVAL ^ RTVAL, 31) && BIT(RSVAL ^ sum, 31))
- generate_exception(EXCEPTION_OVERFLOW);
- else if (RDREG)
- RDVAL = sum;
- }
- break;
- case 0x21: /* ADDU */ if (RDREG) RDVAL = RSVAL + RTVAL; break;
- case 0x22: /* SUB */
- {
- u32 const difference = RSVAL - RTVAL;
-
- // overflow: (sign(minuend) != sign(subtrahend)) && (sign(minuend) != sign(difference))
- if (BIT(RSVAL ^ RTVAL, 31) && BIT(RSVAL ^ difference, 31))
- generate_exception(EXCEPTION_OVERFLOW);
- else if (RDREG)
- RDVAL = difference;
- }
- break;
- case 0x23: /* SUBU */ if (RDREG) RDVAL = RSVAL - RTVAL; break;
- case 0x24: /* AND */ if (RDREG) RDVAL = RSVAL & RTVAL; break;
- case 0x25: /* OR */ if (RDREG) RDVAL = RSVAL | RTVAL; break;
- case 0x26: /* XOR */ if (RDREG) RDVAL = RSVAL ^ RTVAL; break;
- case 0x27: /* NOR */ if (RDREG) RDVAL = ~(RSVAL | RTVAL); break;
- case 0x2a: /* SLT */ if (RDREG) RDVAL = s32(RSVAL) < s32(RTVAL); break;
- case 0x2b: /* SLTU */ if (RDREG) RDVAL = u32(RSVAL) < u32(RTVAL); break;
- case 0x30: /* TEQ */ generate_exception(EXCEPTION_INVALIDOP); break;
- case 0x31: /* TGEU */ generate_exception(EXCEPTION_INVALIDOP); break;
- case 0x32: /* TLT */ generate_exception(EXCEPTION_INVALIDOP); break;
- case 0x33: /* TLTU */ generate_exception(EXCEPTION_INVALIDOP); break;
- case 0x34: /* TGE */ generate_exception(EXCEPTION_INVALIDOP); break;
- case 0x36: /* TNE */ generate_exception(EXCEPTION_INVALIDOP); break;
- default: /* ??? */ generate_exception(EXCEPTION_INVALIDOP); break;
- }
- break;
+ case 0x21: // CVT.D.S
+ set_cop1_reg(FDREG >> 1, f32_to_f64(float32_t{ u32(m_f[FSREG >> 1]) }).v);
+ break;
+ case 0x24: // CVT.W.S
+ set_cop1_reg(FDREG >> 1, f32_to_i32(float32_t{ u32(m_f[FSREG >> 1]) }, softfloat_roundingMode, true));
+ break;
- case 0x01: /* REGIMM */
- switch (RTREG)
- {
- case 0x00: /* BLTZ */ if (s32(RSVAL) < 0) ADDPC(SIMMVAL); break;
- case 0x01: /* BGEZ */ if (s32(RSVAL) >= 0) ADDPC(SIMMVAL); break;
- case 0x02: /* BLTZL */ generate_exception(EXCEPTION_INVALIDOP); break;
- case 0x03: /* BGEZL */ generate_exception(EXCEPTION_INVALIDOP); break;
- case 0x08: /* TGEI */ generate_exception(EXCEPTION_INVALIDOP); break;
- case 0x09: /* TGEIU */ generate_exception(EXCEPTION_INVALIDOP); break;
- case 0x0a: /* TLTI */ generate_exception(EXCEPTION_INVALIDOP); break;
- case 0x0b: /* TLTIU */ generate_exception(EXCEPTION_INVALIDOP); break;
- case 0x0c: /* TEQI */ generate_exception(EXCEPTION_INVALIDOP); break;
- case 0x0e: /* TNEI */ generate_exception(EXCEPTION_INVALIDOP); break;
- case 0x10: /* BLTZAL */ if (s32(RSVAL) < 0) ADDPCL(SIMMVAL, 31); break;
- case 0x11: /* BGEZAL */ if (s32(RSVAL) >= 0) ADDPCL(SIMMVAL, 31); break;
- case 0x12: /* BLTZALL */ generate_exception(EXCEPTION_INVALIDOP); break;
- case 0x13: /* BGEZALL */ generate_exception(EXCEPTION_INVALIDOP); break;
- default: /* ??? */ generate_exception(EXCEPTION_INVALIDOP); break;
- }
- break;
+ case 0x30: // C.F.S (false)
+ m_fcr31 &= ~FCR31_C;
+ break;
+ case 0x31: // C.UN.S (unordered)
+ f32_eq(float32_t{ u32(m_f[FSREG >> 1]) }, float32_t{ u32(m_f[FTREG >> 1]) });
+ if (softfloat_exceptionFlags & softfloat_flag_invalid)
+ m_fcr31 |= FCR31_C;
+ else
+ m_fcr31 &= ~FCR31_C;
+ break;
+ case 0x32: // C.EQ.S (equal)
+ if (f32_eq(float32_t{ u32(m_f[FSREG >> 1]) }, float32_t{ u32(m_f[FTREG >> 1]) }))
+ m_fcr31 |= FCR31_C;
+ else
+ m_fcr31 &= ~FCR31_C;
+ break;
+ case 0x33: // C.UEQ.S (unordered equal)
+ if (f32_eq(float32_t{ u32(m_f[FSREG >> 1]) }, float32_t{ u32(m_f[FTREG >> 1]) }) || (softfloat_exceptionFlags & softfloat_flag_invalid))
+ m_fcr31 |= FCR31_C;
+ else
+ m_fcr31 &= ~FCR31_C;
+ break;
+ case 0x34: // C.OLT.S (less than)
+ if (f32_lt(float32_t{ u32(m_f[FSREG >> 1]) }, float32_t{ u32(m_f[FTREG >> 1]) }))
+ m_fcr31 |= FCR31_C;
+ else
+ m_fcr31 &= ~FCR31_C;
+ break;
+ case 0x35: // C.ULT.S (unordered less than)
+ if (f32_lt(float32_t{ u32(m_f[FSREG >> 1]) }, float32_t{ u32(m_f[FTREG >> 1]) }) || (softfloat_exceptionFlags & softfloat_flag_invalid))
+ m_fcr31 |= FCR31_C;
+ else
+ m_fcr31 &= ~FCR31_C;
+ break;
+ case 0x36: // C.OLE.S (less than or equal)
+ if (f32_le(float32_t{ u32(m_f[FSREG >> 1]) }, float32_t{ u32(m_f[FTREG >> 1]) }))
+ m_fcr31 |= FCR31_C;
+ else
+ m_fcr31 &= ~FCR31_C;
+ break;
+ case 0x37: // C.ULE.S (unordered less than or equal)
+ if (f32_le(float32_t{ u32(m_f[FSREG >> 1]) }, float32_t{ u32(m_f[FTREG >> 1]) }) || (softfloat_exceptionFlags & softfloat_flag_invalid))
+ m_fcr31 |= FCR31_C;
+ else
+ m_fcr31 &= ~FCR31_C;
+ break;
- case 0x02: /* J */ ABSPC(LIMMVAL); break;
- case 0x03: /* JAL */ ABSPCL(LIMMVAL, 31); break;
- case 0x04: /* BEQ */ if (RSVAL == RTVAL) ADDPC(SIMMVAL); break;
- case 0x05: /* BNE */ if (RSVAL != RTVAL) ADDPC(SIMMVAL); break;
- case 0x06: /* BLEZ */ if (s32(RSVAL) <= 0) ADDPC(SIMMVAL); break;
- case 0x07: /* BGTZ */ if (s32(RSVAL) > 0) ADDPC(SIMMVAL); break;
- case 0x08: /* ADDI */
- {
- u32 const sum = RSVAL + SIMMVAL;
+ case 0x38: // C.SF.S (signalling false)
+ f32_eq(float32_t{ u32(m_f[FSREG >> 1]) }, float32_t{ u32(m_f[FTREG >> 1]) });
- // overflow: (sign(addend0) == sign(addend1)) && (sign(addend0) != sign(sum))
- if (!BIT(RSVAL ^ s32(SIMMVAL), 31) && BIT(RSVAL ^ sum, 31))
- generate_exception(EXCEPTION_OVERFLOW);
- else if (RTREG)
- RTVAL = sum;
- }
- break;
- case 0x09: /* ADDIU */ if (RTREG) RTVAL = RSVAL + SIMMVAL; break;
- case 0x0a: /* SLTI */ if (RTREG) RTVAL = s32(RSVAL) < s32(SIMMVAL); break;
- case 0x0b: /* SLTIU */ if (RTREG) RTVAL = u32(RSVAL) < u32(SIMMVAL); break;
- case 0x0c: /* ANDI */ if (RTREG) RTVAL = RSVAL & UIMMVAL; break;
- case 0x0d: /* ORI */ if (RTREG) RTVAL = RSVAL | UIMMVAL; break;
- case 0x0e: /* XORI */ if (RTREG) RTVAL = RSVAL ^ UIMMVAL; break;
- case 0x0f: /* LUI */ if (RTREG) RTVAL = UIMMVAL << 16; break;
- case 0x10: /* COP0 */
- if (!(SR & SR_KUc) || (SR & SR_COP0))
- handle_cop0(op);
- else
- generate_exception(EXCEPTION_BADCOP);
- break;
- case 0x11: // COP1
- if (SR & SR_COP1)
- handle_cop1(op);
- else
- generate_exception(EXCEPTION_BADCOP);
- break;
- case 0x12: // COP2
- if (SR & SR_COP2)
- handle_cop<2>(op);
- else
- generate_exception(EXCEPTION_BADCOP);
- break;
- case 0x13: // COP3
- if (SR & SR_COP3)
- handle_cop<3>(op);
- else
- generate_exception(EXCEPTION_BADCOP);
- break;
- case 0x14: /* BEQL */ generate_exception(EXCEPTION_INVALIDOP); break;
- case 0x15: /* BNEL */ generate_exception(EXCEPTION_INVALIDOP); break;
- case 0x16: /* BLEZL */ generate_exception(EXCEPTION_INVALIDOP); break;
- case 0x17: /* BGTZL */ generate_exception(EXCEPTION_INVALIDOP); break;
- case 0x20: /* LB */ load<u8>(SIMMVAL + RSVAL, [this, op](s8 temp) { if (RTREG) RTVAL = temp; }); break;
- case 0x21: /* LH */ load<u16>(SIMMVAL + RSVAL, [this, op](s16 temp) { if (RTREG) RTVAL = temp; }); break;
- case 0x22: /* LWL */ lwl(op); break;
- case 0x23: /* LW */ load<u32>(SIMMVAL + RSVAL, [this, op](u32 temp) { if (RTREG) RTVAL = temp; }); break;
- case 0x24: /* LBU */ load<u8>(SIMMVAL + RSVAL, [this, op](u8 temp) { if (RTREG) RTVAL = temp; }); break;
- case 0x25: /* LHU */ load<u16>(SIMMVAL + RSVAL, [this, op](u16 temp) { if (RTREG) RTVAL = temp; }); break;
- case 0x26: /* LWR */ lwr(op); break;
- case 0x28: /* SB */ store<u8>(SIMMVAL + RSVAL, RTVAL); break;
- case 0x29: /* SH */ store<u16>(SIMMVAL + RSVAL, RTVAL); break;
- case 0x2a: /* SWL */ swl(op); break;
- case 0x2b: /* SW */ store<u32>(SIMMVAL + RSVAL, RTVAL); break;
- case 0x2e: /* SWR */ swr(op); break;
- case 0x2f: /* CACHE */ generate_exception(EXCEPTION_INVALIDOP); break;
- case 0x30: /* LL */ generate_exception(EXCEPTION_INVALIDOP); break;
- case 0x31: /* LWC1 */ load<u32>(SIMMVAL + RSVAL, [this, op](u32 temp) { set_cop_reg<1>(RTREG, temp); }); break;
- case 0x32: /* LWC2 */ load<u32>(SIMMVAL + RSVAL, [this, op](u32 temp) { set_cop_reg<2>(RTREG, temp); }); break;
- case 0x33: /* LWC3 */ load<u32>(SIMMVAL + RSVAL, [this, op](u32 temp) { set_cop_reg<3>(RTREG, temp); }); break;
- case 0x34: /* LDC0 */ generate_exception(EXCEPTION_INVALIDOP); break;
- case 0x35: /* LDC1 */ generate_exception(EXCEPTION_INVALIDOP); break;
- case 0x36: /* LDC2 */ generate_exception(EXCEPTION_INVALIDOP); break;
- case 0x37: /* LDC3 */ generate_exception(EXCEPTION_INVALIDOP); break;
- case 0x38: /* SC */ generate_exception(EXCEPTION_INVALIDOP); break;
- case 0x39: /* LWC1 */ store<u32>(SIMMVAL + RSVAL, get_cop_reg<1>(RTREG)); break;
- case 0x3a: /* LWC2 */ store<u32>(SIMMVAL + RSVAL, get_cop_reg<2>(RTREG)); break;
- case 0x3b: /* LWC3 */ store<u32>(SIMMVAL + RSVAL, get_cop_reg<3>(RTREG)); break;
- case 0x3c: /* SDC0 */ generate_exception(EXCEPTION_INVALIDOP); break;
- case 0x3d: /* SDC1 */ generate_exception(EXCEPTION_INVALIDOP); break;
- case 0x3e: /* SDC2 */ generate_exception(EXCEPTION_INVALIDOP); break;
- case 0x3f: /* SDC3 */ generate_exception(EXCEPTION_INVALIDOP); break;
- default: /* ??? */ generate_exception(EXCEPTION_INVALIDOP); break;
+ m_fcr31 &= ~FCR31_C;
+
+ if (softfloat_exceptionFlags & softfloat_flag_invalid)
+ {
+ m_fcr31 |= FCR31_CV;
+ execute_set_input(m_fpu_irq, ASSERT_LINE);
}
+ break;
+ case 0x39: // C.NGLE.S (not greater, less than or equal)
+ f32_eq(float32_t{ u32(m_f[FSREG >> 1]) }, float32_t{ u32(m_f[FTREG >> 1]) });
- // update pc and branch state
- switch (m_branch_state)
- {
- case NONE:
- m_pc += 4;
+ if (softfloat_exceptionFlags & softfloat_flag_invalid)
+ {
+ m_fcr31 |= FCR31_C | FCR31_CV;
+ execute_set_input(m_fpu_irq, ASSERT_LINE);
+ }
+ else
+ m_fcr31 &= ~FCR31_C;
break;
+ case 0x3a: // C.SEQ.S (signalling equal)
+ if (f32_eq(float32_t{ u32(m_f[FSREG >> 1]) }, float32_t{ u32(m_f[FTREG >> 1]) }))
+ m_fcr31 |= FCR31_C;
+ else
+ m_fcr31 &= ~FCR31_C;
- case DELAY:
- m_branch_state = NONE;
- m_pc = m_branch_target;
+ if (softfloat_exceptionFlags & softfloat_flag_invalid)
+ {
+ m_fcr31 |= FCR31_CV;
+ execute_set_input(m_fpu_irq, ASSERT_LINE);
+ }
break;
+ case 0x3b: // C.NGL.S (not greater or less than)
+ if (f32_eq(float32_t{ u32(m_f[FSREG >> 1]) }, float32_t{ u32(m_f[FTREG >> 1]) }) || (softfloat_exceptionFlags & softfloat_flag_invalid))
+ m_fcr31 |= FCR31_C;
+ else
+ m_fcr31 &= ~FCR31_C;
- case BRANCH:
- m_branch_state = DELAY;
- m_pc += 4;
+ if (softfloat_exceptionFlags & softfloat_flag_invalid)
+ {
+ m_fcr31 |= FCR31_CV;
+ execute_set_input(m_fpu_irq, ASSERT_LINE);
+ }
break;
+ case 0x3c: // C.LT.S (less than)
+ if (f32_lt(float32_t{ u32(m_f[FSREG >> 1]) }, float32_t{ u32(m_f[FTREG >> 1]) }))
+ m_fcr31 |= FCR31_C;
+ else
+ m_fcr31 &= ~FCR31_C;
- case EXCEPTION:
- m_branch_state = NONE;
+ if (softfloat_exceptionFlags & softfloat_flag_invalid)
+ {
+ m_fcr31 |= FCR31_CV;
+ execute_set_input(m_fpu_irq, ASSERT_LINE);
+ }
break;
- }
- });
- m_icount--;
+ case 0x3d: // C.NGE.S (not greater or equal)
+ if (f32_lt(float32_t{ u32(m_f[FSREG >> 1]) }, float32_t{ u32(m_f[FTREG >> 1]) }) || (softfloat_exceptionFlags & softfloat_flag_invalid))
+ m_fcr31 |= FCR31_C;
+ else
+ m_fcr31 &= ~FCR31_C;
- } while (m_icount > 0 || m_branch_state);
-}
+ if (softfloat_exceptionFlags & softfloat_flag_invalid)
+ {
+ m_fcr31 |= FCR31_CV;
+ execute_set_input(m_fpu_irq, ASSERT_LINE);
+ }
+ break;
+ case 0x3e: // C.LE.S (less than or equal)
+ if (f32_le(float32_t{ u32(m_f[FSREG >> 1]) }, float32_t{ u32(m_f[FTREG >> 1]) }))
+ m_fcr31 |= FCR31_C;
+ else
+ m_fcr31 &= ~FCR31_C;
-void mips1core_device_base::lwl(u32 const op)
-{
- offs_t const offset = SIMMVAL + RSVAL;
- load<u32>(offset & ~3, [this, op, offset](u32 temp)
- {
- if (RTREG)
- {
- unsigned const shift = ((offset & 3) ^ ENDIAN_VALUE_LE_BE(m_endianness, 3, 0)) << 3;
+ if (softfloat_exceptionFlags & softfloat_flag_invalid)
+ {
+ m_fcr31 |= FCR31_CV;
+ execute_set_input(m_fpu_irq, ASSERT_LINE);
+ }
+ break;
+ case 0x3f: // C.NGT.S (not greater than)
+ if (f32_le(float32_t{ u32(m_f[FSREG >> 1]) }, float32_t{ u32(m_f[FTREG >> 1]) }) || (softfloat_exceptionFlags & softfloat_flag_invalid))
+ m_fcr31 |= FCR31_C;
+ else
+ m_fcr31 &= ~FCR31_C;
- RTVAL = (RTVAL & ~u32(0xffffffffU << shift)) | (temp << shift);
- }
- });
-}
+ if (softfloat_exceptionFlags & softfloat_flag_invalid)
+ {
+ m_fcr31 |= FCR31_CV;
+ execute_set_input(m_fpu_irq, ASSERT_LINE);
+ }
+ break;
-void mips1core_device_base::lwr(u32 const op)
-{
- offs_t const offset = SIMMVAL + RSVAL;
- load<u32>(offset & ~3, [this, op, offset](u32 temp)
- {
- if (RTREG)
- {
- unsigned const shift = ((offset & 0x3) ^ ENDIAN_VALUE_LE_BE(m_endianness, 0, 3)) << 3;
+ default: // unimplemented operation
+ m_fcr31 |= FCR31_CE;
+ execute_set_input(m_fpu_irq, ASSERT_LINE);
+ break;
+ }
+ break;
+ case 0x11: // D
+ switch (op & 0x3f)
+ {
+ case 0x00: // ADD.D
+ set_cop1_reg(FDREG >> 1, f64_add(float64_t{ m_f[FSREG >> 1] }, float64_t{ m_f[FTREG >> 1] }).v);
+ break;
+ case 0x01: // SUB.D
+ set_cop1_reg(FDREG >> 1, f64_sub(float64_t{ m_f[FSREG >> 1] }, float64_t{ m_f[FTREG >> 1] }).v);
+ break;
+ case 0x02: // MUL.D
+ set_cop1_reg(FDREG >> 1, f64_mul(float64_t{ m_f[FSREG >> 1] }, float64_t{ m_f[FTREG >> 1] }).v);
+ break;
+ case 0x03: // DIV.D
+ set_cop1_reg(FDREG >> 1, f64_div(float64_t{ m_f[FSREG >> 1] }, float64_t{ m_f[FTREG >> 1] }).v);
+ break;
- RTVAL = (RTVAL & ~u32(0xffffffffU >> shift)) | (temp >> shift);
- }
- });
-}
+ case 0x05: // ABS.D
+ if (f64_lt(float64_t{ m_f[FSREG >> 1] }, float64_t{ 0 }))
+ set_cop1_reg(FDREG >> 1, f64_mul(float64_t{ m_f[FSREG >> 1] }, i32_to_f64(-1)).v);
+ else
+ set_cop1_reg(FDREG >> 1, m_f[FSREG >> 1]);
+ break;
+ case 0x06: // MOV.D
+ m_f[FDREG >> 1] = m_f[FSREG >> 1];
+ break;
+ case 0x07: // NEG.D
+ set_cop1_reg(FDREG >> 1, f64_mul(float64_t{ m_f[FSREG >> 1] }, i32_to_f64(-1)).v);
+ break;
-void mips1core_device_base::swl(u32 const op)
-{
- offs_t const offset = SIMMVAL + RSVAL;
- unsigned const shift = ((offset & 3) ^ ENDIAN_VALUE_LE_BE(m_endianness, 3, 0)) << 3;
+ case 0x20: // CVT.S.D
+ set_cop1_reg(FDREG >> 1, f64_to_f32(float64_t{ m_f[FSREG >> 1] }).v);
+ break;
+ case 0x24: // CVT.W.D
+ set_cop1_reg(FDREG >> 1, f64_to_i32(float64_t{ m_f[FSREG >> 1] }, softfloat_roundingMode, true));
+ break;
- // only load if necessary
- if (shift)
- {
- load<u32>(offset & ~3, [this, op, offset, shift](u32 temp)
- {
- store<u32>(offset & ~3, (temp & ~u32(0xffffffffU >> shift)) | (RTVAL >> shift));
- });
- }
- else
- store<u32>(offset & ~3, RTVAL);
-}
+ case 0x30: // C.F.D (false)
+ m_fcr31 &= ~FCR31_C;
+ break;
+ case 0x31: // C.UN.D (unordered)
+ f64_eq(float64_t{ m_f[FSREG >> 1] }, float64_t{ m_f[FTREG >> 1] });
+ if (softfloat_exceptionFlags & softfloat_flag_invalid)
+ m_fcr31 |= FCR31_C;
+ else
+ m_fcr31 &= ~FCR31_C;
+ break;
+ case 0x32: // C.EQ.D (equal)
+ if (f64_eq(float64_t{ m_f[FSREG >> 1] }, float64_t{ m_f[FTREG >> 1] }))
+ m_fcr31 |= FCR31_C;
+ else
+ m_fcr31 &= ~FCR31_C;
+ break;
+ case 0x33: // C.UEQ.D (unordered equal)
+ if (f64_eq(float64_t{ m_f[FSREG >> 1] }, float64_t{ m_f[FTREG >> 1] }) || (softfloat_exceptionFlags & softfloat_flag_invalid))
+ m_fcr31 |= FCR31_C;
+ else
+ m_fcr31 &= ~FCR31_C;
+ break;
+ case 0x34: // C.OLT.D (less than)
+ if (f64_lt(float64_t{ m_f[FSREG >> 1] }, float64_t{ m_f[FTREG >> 1] }))
+ m_fcr31 |= FCR31_C;
+ else
+ m_fcr31 &= ~FCR31_C;
+ break;
+ case 0x35: // C.ULT.D (unordered less than)
+ if (f64_lt(float64_t{ m_f[FSREG >> 1] }, float64_t{ m_f[FTREG >> 1] }) || (softfloat_exceptionFlags & softfloat_flag_invalid))
+ m_fcr31 |= FCR31_C;
+ else
+ m_fcr31 &= ~FCR31_C;
+ break;
+ case 0x36: // C.OLE.D (less than or equal)
+ if (f64_le(float64_t{ m_f[FSREG >> 1] }, float64_t{ m_f[FTREG >> 1] }))
+ m_fcr31 |= FCR31_C;
+ else
+ m_fcr31 &= ~FCR31_C;
+ break;
+ case 0x37: // C.ULE.D (unordered less than or equal)
+ if (f64_le(float64_t{ m_f[FSREG >> 1] }, float64_t{ m_f[FTREG >> 1] }) || (softfloat_exceptionFlags & softfloat_flag_invalid))
+ m_fcr31 |= FCR31_C;
+ else
+ m_fcr31 &= ~FCR31_C;
+ break;
+ case 0x38: // C.SF.D (signalling false)
+ f64_eq(float64_t{ m_f[FSREG >> 1] }, float64_t{ m_f[FTREG >> 1] });
-void mips1core_device_base::swr(u32 const op)
-{
- offs_t const offset = SIMMVAL + RSVAL;
- unsigned const shift = ((offset & 3) ^ ENDIAN_VALUE_LE_BE(m_endianness, 0, 3)) << 3;
+ m_fcr31 &= ~FCR31_C;
- // only load if necessary
- if (shift)
- {
- load<u32>(offset & ~3, [this, op, offset, shift](u32 temp)
- {
- store<u32>(offset & ~3, (temp & ~u32(0xffffffffU << shift)) | (RTVAL << shift));
- });
- }
- else
- store<u32>(offset & ~3, RTVAL);
-}
+ if (softfloat_exceptionFlags & softfloat_flag_invalid)
+ {
+ m_fcr31 |= FCR31_CV;
+ execute_set_input(m_fpu_irq, ASSERT_LINE);
+ }
+ break;
+ case 0x39: // C.NGLE.D (not greater, less than or equal)
+ f64_eq(float64_t{ m_f[FSREG >> 1] }, float64_t{ m_f[FTREG >> 1] });
-template <typename T, typename U> std::enable_if_t<std::is_convertible<U, std::function<void(T)>>::value, void> mips1core_device_base::load(u32 program_address, U &&apply)
-{
- offs_t translated_address = program_address;
+ if (softfloat_exceptionFlags & softfloat_flag_invalid)
+ {
+ m_fcr31 |= FCR31_C | FCR31_CV;
+ execute_set_input(m_fpu_irq, ASSERT_LINE);
+ }
+ else
+ m_fcr31 &= ~FCR31_C;
+ break;
+ case 0x3a: // C.SEQ.D (signalling equal)
+ if (f64_eq(float64_t{ m_f[FSREG >> 1] }, float64_t{ m_f[FTREG >> 1] }))
+ m_fcr31 |= FCR31_C;
+ else
+ m_fcr31 &= ~FCR31_C;
- if (memory_translate(m_data_spacenum, TRANSLATE_READ, translated_address))
- {
- switch (sizeof(T))
- {
- case 1: apply(T(space(m_data_spacenum).read_byte(translated_address))); break;
- case 2: apply(T(space(m_data_spacenum).read_word(translated_address))); break;
- case 4: apply(T(space(m_data_spacenum).read_dword(translated_address))); break;
- }
- }
-}
+ if (softfloat_exceptionFlags & softfloat_flag_invalid)
+ {
+ m_fcr31 |= FCR31_CV;
+ execute_set_input(m_fpu_irq, ASSERT_LINE);
+ }
+ break;
+ case 0x3b: // C.NGL.D (not greater or less than)
+ if (f64_eq(float64_t{ m_f[FSREG >> 1] }, float64_t{ m_f[FTREG >> 1] }) || (softfloat_exceptionFlags & softfloat_flag_invalid))
+ m_fcr31 |= FCR31_C;
+ else
+ m_fcr31 &= ~FCR31_C;
-template <typename T, typename U> std::enable_if_t<std::is_convertible<U, T>::value, void> mips1core_device_base::store(u32 program_address, U data)
-{
- offs_t translated_address = program_address;
+ if (softfloat_exceptionFlags & softfloat_flag_invalid)
+ {
+ m_fcr31 |= FCR31_CV;
+ execute_set_input(m_fpu_irq, ASSERT_LINE);
+ }
+ break;
+ case 0x3c: // C.LT.D (less than)
+ if (f64_lt(float64_t{ m_f[FSREG >> 1] }, float64_t{ m_f[FTREG >> 1] }))
+ m_fcr31 |= FCR31_C;
+ else
+ m_fcr31 &= ~FCR31_C;
- if (memory_translate(m_data_spacenum, TRANSLATE_WRITE, translated_address))
- {
- switch (sizeof(T))
- {
- case 1: space(m_data_spacenum).write_byte(translated_address, T(data)); break;
- case 2: space(m_data_spacenum).write_word(translated_address, T(data)); break;
- case 4: space(m_data_spacenum).write_dword(translated_address, T(data)); break;
- }
- }
-}
+ if (softfloat_exceptionFlags & softfloat_flag_invalid)
+ {
+ m_fcr31 |= FCR31_CV;
+ execute_set_input(m_fpu_irq, ASSERT_LINE);
+ }
+ break;
+ case 0x3d: // C.NGE.D (not greater or equal)
+ if (f64_lt(float64_t{ m_f[FSREG >> 1] }, float64_t{ m_f[FTREG >> 1] }) || (softfloat_exceptionFlags & softfloat_flag_invalid))
+ m_fcr31 |= FCR31_C;
+ else
+ m_fcr31 &= ~FCR31_C;
-bool mips1core_device_base::fetch(u32 program_address, std::function<void(u32)> &&apply)
-{
- offs_t translated_address = program_address;
+ if (softfloat_exceptionFlags & softfloat_flag_invalid)
+ {
+ m_fcr31 |= FCR31_CV;
+ execute_set_input(m_fpu_irq, ASSERT_LINE);
+ }
+ break;
+ case 0x3e: // C.LE.D (less than or equal)
+ if (f64_le(float64_t{ m_f[FSREG >> 1] }, float64_t{ m_f[FTREG >> 1] }))
+ m_fcr31 |= FCR31_C;
+ else
+ m_fcr31 &= ~FCR31_C;
- if (memory_translate(0, TRANSLATE_FETCH, translated_address))
- {
- apply(space(0).read_dword(translated_address));
+ if (softfloat_exceptionFlags & softfloat_flag_invalid)
+ {
+ m_fcr31 |= FCR31_CV;
+ execute_set_input(m_fpu_irq, ASSERT_LINE);
+ }
+ break;
+ case 0x3f: // C.NGT.D (not greater than)
+ if (f64_le(float64_t{ m_f[FSREG >> 1] }, float64_t{ m_f[FTREG >> 1] }) || (softfloat_exceptionFlags & softfloat_flag_invalid))
+ m_fcr31 |= FCR31_C;
+ else
+ m_fcr31 &= ~FCR31_C;
- return true;
- }
- else
- return false;
-}
+ if (softfloat_exceptionFlags & softfloat_flag_invalid)
+ {
+ m_fcr31 |= FCR31_CV;
+ execute_set_input(m_fpu_irq, ASSERT_LINE);
+ }
+ break;
-bool mips1core_device_base::memory_translate(int spacenum, int intention, offs_t &address)
-{
- // check for kernel memory address
- if (BIT(address, 31))
- {
- // check debug or kernel mode
- if ((intention & TRANSLATE_DEBUG_MASK) || !(SR & SR_KUc))
- {
- switch (address & 0xe0000000)
+ default: // unimplemented operation
+ m_fcr31 |= FCR31_CE;
+ execute_set_input(m_fpu_irq, ASSERT_LINE);
+ break;
+ }
+ break;
+ case 0x14: // W
+ switch (op & 0x3f)
{
- case 0x80000000: // kseg0: unmapped, cached, privileged
- case 0xa0000000: // kseg1: unmapped, uncached, privileged
- address &= ~0xe0000000;
+ case 0x20: // CVT.S.W
+ set_cop1_reg(FDREG >> 1, i32_to_f32(s32(m_f[FSREG >> 1])).v);
+ break;
+ case 0x21: // CVT.D.W
+ set_cop1_reg(FDREG >> 1, i32_to_f64(s32(m_f[FSREG >> 1])).v);
break;
- case 0xc0000000: // kseg2: mapped, cached, privileged
- case 0xe0000000:
+ default: // unimplemented operation
+ m_fcr31 |= FCR31_CE;
+ execute_set_input(m_fpu_irq, ASSERT_LINE);
break;
}
+ break;
+
+ default: // unimplemented operation
+ m_fcr31 |= FCR31_CE;
+ execute_set_input(m_fpu_irq, ASSERT_LINE);
+ break;
}
- else if (SR & SR_KUc)
+ break;
+ case 0x31: // LWC1
+ load<u32>(SIMMVAL + m_r[RSREG],
+ [this, op](u32 data)
{
- // exception
- m_cpr[0][COP0_BadVAddr] = address;
+ if (FTREG & 1)
+ // load the high half of the floating point register
+ m_f[FTREG >> 1] = (u64(data) << 32) | u32(m_f[FTREG >> 1]);
+ else
+ // load the low half of the floating point register
+ m_f[FTREG >> 1] = (m_f[FTREG >> 1] & ~0xffffffffULL) | data;
+ });
+ break;
+ case 0x39: // SWC1
+ if (FTREG & 1)
+ // store the high half of the floating point register
+ store<u32>(SIMMVAL + m_r[RSREG], m_f[FTREG >> 1] >> 32);
+ else
+ // store the low half of the floating point register
+ store<u32>(SIMMVAL + m_r[RSREG], m_f[FTREG >> 1]);
+ break;
+ }
+}
- generate_exception((intention & TRANSLATE_WRITE) ? EXCEPTION_ADDRSTORE : EXCEPTION_ADDRLOAD);
- return false;
+void mips1_device_base::set_cop1_reg(unsigned const reg, u64 const data)
+{
+ // translate softfloat exception flags to cause register
+ if (softfloat_exceptionFlags)
+ {
+ if (softfloat_exceptionFlags & softfloat_flag_inexact)
+ m_fcr31 |= FCR31_CI;
+ if (softfloat_exceptionFlags & softfloat_flag_underflow)
+ m_fcr31 |= FCR31_CU;
+ if (softfloat_exceptionFlags & softfloat_flag_overflow)
+ m_fcr31 |= FCR31_CO;
+ if (softfloat_exceptionFlags & softfloat_flag_infinite)
+ m_fcr31 |= FCR31_CZ;
+ if (softfloat_exceptionFlags & softfloat_flag_invalid)
+ m_fcr31 |= FCR31_CV;
+
+ // check if exception is enabled
+ if (((m_fcr31 & FCR31_CM) >> 5) & (m_fcr31 & FCR31_EM))
+ {
+ execute_set_input(m_fpu_irq, ASSERT_LINE);
+ return;
}
+
+ // set flags
+ m_fcr31 |= ((m_fcr31 & FCR31_CM) >> 10);
}
- else
- // kuseg physical addresses have a 1GB offset
- address += 0x40000000;
- return true;
+ m_f[reg] = data;
}
bool mips1_device_base::memory_translate(int spacenum, int intention, offs_t &address)
@@ -982,21 +1854,30 @@ bool mips1_device_base::memory_translate(int spacenum, int intention, offs_t &ad
}
else if (SR & SR_KUc)
{
- // exception
- m_cpr[0][COP0_BadVAddr] = address;
+ if (!machine().side_effects_disabled())
+ {
+ // exception
+ m_cop0[COP0_BadVAddr] = address;
- generate_exception((intention & TRANSLATE_WRITE) ? EXCEPTION_ADDRSTORE : EXCEPTION_ADDRLOAD);
+ generate_exception((intention & TRANSLATE_WRITE) ? EXCEPTION_ADDRSTORE : EXCEPTION_ADDRLOAD);
+ }
return false;
}
}
// key is a combination of VPN and ASID
- u32 const key = (address & EH_VPN) | (m_cpr[0][COP0_EntryHi] & EH_ASID);
+ u32 const key = (address & EH_VPN) | (m_cop0[COP0_EntryHi] & EH_ASID);
+
+ unsigned *mru = m_tlb_mru[intention & TRANSLATE_TYPE_MASK];
+
bool refill = !BIT(address, 31);
- bool dirty = false;
+ bool modify = false;
- for (u32 const *entry : m_tlb)
+ for (unsigned i = 0; i < ARRAY_LENGTH(m_tlb); i++)
{
+ unsigned const index = mru[i];
+ u32 const *const entry = m_tlb[index];
+
// test vpn and optionally asid
u32 const mask = (entry[1] & EL_G) ? EH_VPN : EH_VPN | EH_ASID;
if ((entry[0] & mask) != (key & mask))
@@ -1013,28 +1894,39 @@ bool mips1_device_base::memory_translate(int spacenum, int intention, offs_t &ad
if ((intention & TRANSLATE_WRITE) && !(entry[1] & EL_D))
{
refill = false;
- dirty = true;
+ modify = true;
break;
}
// translate the address
address &= ~EH_VPN;
address |= (entry[1] & EL_PFN);
+
+ // promote the entry in the mru index
+ if (i > 0)
+ std::swap(mru[i - 1], mru[i]);
+
return true;
}
- if (!(intention & TRANSLATE_DEBUG_MASK))
+ if (!machine().side_effects_disabled() && !(intention & TRANSLATE_DEBUG_MASK))
{
- if ((VERBOSE & LOG_TLB) && !dirty)
- LOGMASKED(LOG_TLB, "tlb miss %c asid %d address 0x%08x (%s)\n",
- (intention & TRANSLATE_WRITE) ? 'w' : 'r', (m_cpr[0][COP0_EntryHi] & EH_ASID) >> 6, address, machine().describe_context());
+ if (VERBOSE & LOG_TLB)
+ {
+ if (modify)
+ LOGMASKED(LOG_TLB, "tlb modify asid %d address 0x%08x (%s)\n",
+ (m_cop0[COP0_EntryHi] & EH_ASID) >> 6, address, machine().describe_context());
+ else
+ LOGMASKED(LOG_TLB, "tlb miss %c asid %d address 0x%08x (%s)\n",
+ (intention & TRANSLATE_WRITE) ? 'w' : 'r', (m_cop0[COP0_EntryHi] & EH_ASID) >> 6, address, machine().describe_context());
+ }
// load tlb exception registers
- m_cpr[0][COP0_BadVAddr] = address;
- m_cpr[0][COP0_EntryHi] = key;
- m_cpr[0][COP0_Context] = (m_cpr[0][COP0_Context] & PTE_BASE) | ((address >> 10) & BAD_VPN);
+ m_cop0[COP0_BadVAddr] = address;
+ m_cop0[COP0_EntryHi] = key;
+ m_cop0[COP0_Context] = (m_cop0[COP0_Context] & PTE_BASE) | ((address >> 10) & BAD_VPN);
- generate_exception(dirty ? EXCEPTION_TLBMOD : (intention & TRANSLATE_WRITE) ? EXCEPTION_TLBSTORE : EXCEPTION_TLBLOAD, refill);
+ generate_exception(modify ? EXCEPTION_TLBMOD : (intention & TRANSLATE_WRITE) ? EXCEPTION_TLBSTORE : EXCEPTION_TLBLOAD, refill);
}
return false;
diff --git a/src/devices/cpu/mips/mips1.h b/src/devices/cpu/mips/mips1.h
index d77bdef3cdb..3ae34e4b69f 100644
--- a/src/devices/cpu/mips/mips1.h
+++ b/src/devices/cpu/mips/mips1.h
@@ -9,21 +9,8 @@
class mips1core_device_base : public cpu_device
{
public:
- // floating point coprocessor revision numbers recognised by RISC/os 4.52 and IRIX
- enum fpu_rev_t : u32
- {
- MIPS_R2360 = 0x0100, // MIPS R2360 Floating Point Board
- MIPS_R2010 = 0x0200, // MIPS R2010 VLSI Floating Point Chip
- MIPS_R2010A = 0x0310, // MIPS R2010A VLSI Floating Point Chip
- MIPS_R3010 = 0x0320, // MIPS R3010 VLSI Floating Point Chip
- MIPS_R3010A = 0x0330, // MIPS R3010A VLSI Floating Point Chip
- MIPS_R3010Av4 = 0x0340, // MIPS R3010A VLSI Floating Point Chip
- MIPS_R6010 = 0x0400, // MIPS R6010 Floating Point Chip
- };
-
// device configuration
void set_endianness(endianness_t endianness) { m_endianness = endianness; }
- void set_fpurev(u32 revision) { m_hasfpu = true; m_fpurev = revision; }
// input lines
template <unsigned Coprocessor> auto in_brcond() { return m_in_brcond[Coprocessor].bind(); }
@@ -31,53 +18,40 @@ public:
protected:
mips1core_device_base(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock, u32 cpurev, size_t icache_size, size_t dcache_size);
- enum registers
+ enum registers : unsigned
{
- // general purpose cpu registers
- MIPS1_R0, MIPS1_R1, MIPS1_R2, MIPS1_R3, MIPS1_R4, MIPS1_R5, MIPS1_R6, MIPS1_R7,
- MIPS1_R8, MIPS1_R9, MIPS1_R10, MIPS1_R11, MIPS1_R12, MIPS1_R13, MIPS1_R14, MIPS1_R15,
- MIPS1_R16, MIPS1_R17, MIPS1_R18, MIPS1_R19, MIPS1_R20, MIPS1_R21, MIPS1_R22, MIPS1_R23,
- MIPS1_R24, MIPS1_R25, MIPS1_R26, MIPS1_R27, MIPS1_R28, MIPS1_R29, MIPS1_R30, MIPS1_R31,
+ MIPS1_R0 = 0,
+ MIPS1_COP0 = 32,
+ MIPS1_F0 = 64,
- // other cpu registers
+ MIPS1_PC = 80,
MIPS1_HI,
MIPS1_LO,
- MIPS1_PC,
-
- // coprocessor 0 registers
- MIPS1_COP0_INDEX, // reg 0, tlb only
- MIPS1_COP0_RANDOM, // reg 1, tlb only
- MIPS1_COP0_ENTRYLO, // reg 2, tlb only
- MIPS1_COP0_BUSCTRL, // reg 2, r3041 only
- MIPS1_COP0_CONFIG, // reg 3, r3041/r3071/r3081 only
- MIPS1_COP0_CONTEXT, // reg 4, tlb only
- MIPS1_COP0_BADVADDR, // reg 8
- MIPS1_COP0_COUNT, // reg 9, r3041 only
- MIPS1_COP0_ENTRYHI, // reg 10, tlb only
- MIPS1_COP0_PORTSIZE, // reg 10, r3041 only
- MIPS1_COP0_COMPARE, // reg 11, r3041 only
- MIPS1_COP0_SR, // reg 12
- MIPS1_COP0_CAUSE, // reg 13
- MIPS1_COP0_EPC, // reg 14
- MIPS1_COP0_PRID, // reg 15
+ MIPS1_FCR30,
+ MIPS1_FCR31,
};
- enum exception : int
+ enum exception : u32
{
- EXCEPTION_INTERRUPT = 0,
- EXCEPTION_TLBMOD = 1,
- EXCEPTION_TLBLOAD = 2,
- EXCEPTION_TLBSTORE = 3,
- EXCEPTION_ADDRLOAD = 4,
- EXCEPTION_ADDRSTORE = 5,
- EXCEPTION_BUSINST = 6,
- EXCEPTION_BUSDATA = 7,
- EXCEPTION_SYSCALL = 8,
- EXCEPTION_BREAK = 9,
- EXCEPTION_INVALIDOP = 10,
- EXCEPTION_BADCOP = 11,
- EXCEPTION_OVERFLOW = 12,
- EXCEPTION_TRAP = 13,
+ EXCEPTION_INTERRUPT = 0x00000000,
+ EXCEPTION_TLBMOD = 0x00000004,
+ EXCEPTION_TLBLOAD = 0x00000008,
+ EXCEPTION_TLBSTORE = 0x0000000c,
+ EXCEPTION_ADDRLOAD = 0x00000010,
+ EXCEPTION_ADDRSTORE = 0x00000014,
+ EXCEPTION_BUSINST = 0x00000018,
+ EXCEPTION_BUSDATA = 0x0000001c,
+ EXCEPTION_SYSCALL = 0x00000020,
+ EXCEPTION_BREAK = 0x00000024,
+ EXCEPTION_INVALIDOP = 0x00000028,
+ EXCEPTION_BADCOP = 0x0000002c,
+ EXCEPTION_OVERFLOW = 0x00000030,
+ EXCEPTION_TRAP = 0x00000034,
+
+ EXCEPTION_BADCOP0 = 0x0000002c,
+ EXCEPTION_BADCOP1 = 0x1000002c,
+ EXCEPTION_BADCOP2 = 0x2000002c,
+ EXCEPTION_BADCOP3 = 0x3000002c,
};
enum cop0_reg : u8
@@ -127,6 +101,29 @@ protected:
SR_COP1 = 0x20000000, // coprocessor 1 usable
SR_COP2 = 0x40000000, // coprocessor 2 usable
SR_COP3 = 0x80000000, // coprocessor 3 usable
+
+ SR_KUIE = 0x0000003f, // all interrupt enable and user mode bits
+ SR_KUIEpc = 0x0000000f, // previous and current interrupt enable and user mode bits
+ SR_KUIEop = 0x0000003c, // old and previous interrupt enable and user mode bits
+ SR_IM = 0x0000ff00, // all interrupt mask bits
+ };
+
+ enum cause_mask : u32
+ {
+ CAUSE_EXCCODE = 0x0000007c, // exception code
+ CAUSE_IPSW0 = 0x00000100, // software interrupt 0 pending
+ CAUSE_IPSW1 = 0x00000200, // software interrupt 1 pending
+ CAUSE_IPEX0 = 0x00000400, // external interrupt 0 pending
+ CAUSE_IPEX1 = 0x00000800, // external interrupt 1 pending
+ CAUSE_IPEX2 = 0x00001000, // external interrupt 2 pending
+ CAUSE_IPEX3 = 0x00002000, // external interrupt 3 pending
+ CAUSE_IPEX4 = 0x00004000, // external interrupt 4 pending
+ CAUSE_IPEX5 = 0x00008000, // external interrupt 5 pending
+ CAUSE_IP = 0x0000ff00, // interrupt pending
+ CAUSE_CE = 0x30000000, // co-processor error
+ CAUSE_BD = 0x80000000, // branch delay
+
+ CAUSE_IPEX = 0x0000fc00, // external interrupt pending
};
enum entryhi_mask : u32
@@ -158,7 +155,7 @@ protected:
virtual u32 execute_max_cycles() const override { return 40; }
virtual u32 execute_input_lines() const override { return 6; }
virtual void execute_run() override;
- virtual void execute_set_input(int inputnum, int state) override { set_irq_line(inputnum, state); }
+ virtual void execute_set_input(int inputnum, int state) override;
// device_memory_interface overrides
virtual space_config_vector memory_space_config() const override;
@@ -171,25 +168,18 @@ protected:
void dcache_map(address_map &map);
// interrupts
- void generate_exception(int exception, bool refill = false);
+ void generate_exception(u32 exception, bool refill = false);
void check_irqs();
- void set_irq_line(int irqline, int state);
// cop0
- virtual u32 get_cop0_reg(int const index);
- void set_cop0_reg(int const index, u32 const data);
virtual void handle_cop0(u32 const op);
+ virtual u32 get_cop0_reg(unsigned const reg);
+ virtual void set_cop0_reg(unsigned const reg, u32 const data);
- // cop1
- void set_cop1_creg(int const index, u32 const data);
- void handle_cop1(u32 const op);
-
- // generic coprocessor implementation
- template <unsigned Coprocessor> void handle_cop(u32 const op);
- template <unsigned Coprocessor> u32 get_cop_reg(int const index) { return m_cpr[Coprocessor][index]; }
- template <unsigned Coprocessor> void set_cop_reg(int const index, u32 const data) { m_cpr[Coprocessor][index] = data; }
- template <unsigned Coprocessor> u32 get_cop_creg(int const index) { return m_ccr[Coprocessor][index]; }
- template <unsigned Coprocessor> void set_cop_creg(int const index, u32 const data) { m_ccr[Coprocessor][index] = data; }
+ // other coprocessors
+ virtual void handle_cop1(u32 const op);
+ virtual void handle_cop2(u32 const op);
+ virtual void handle_cop3(u32 const op);
// load/store left/right opcodes
void lwl(u32 const op);
@@ -198,9 +188,13 @@ protected:
void swr(u32 const op);
// memory accessors
- template <typename T, typename U> std::enable_if_t<std::is_convertible<U, std::function<void(T)>>::value, void> load(u32 program_address, U &&apply);
- template <typename T, typename U> std::enable_if_t<std::is_convertible<U, T>::value, void> store(u32 program_address, U data);
- bool fetch(u32 program_address, std::function<void(u32)> &&apply);
+ template <typename T, typename U> std::enable_if_t<std::is_convertible<U, std::function<void(T)>>::value, void> load(u32 address, U &&apply);
+ template <typename T, typename U> std::enable_if_t<std::is_convertible<U, T>::value, void> store(u32 address, U data, T mem_mask = ~T(0));
+ bool fetch(u32 address, std::function<void(u32)> &&apply);
+
+ // debug helpers
+ std::string debug_string(u32 string_pointer, unsigned const limit = 0);
+ std::string debug_string_array(u32 array_pointer);
// address spaces
const address_space_config m_program_config_be;
@@ -212,19 +206,16 @@ protected:
// configuration
u32 m_cpurev;
- bool m_hasfpu;
- u32 m_fpurev;
endianness_t m_endianness;
// core registers
u32 m_pc;
+ u32 m_r[32];
u32 m_hi;
u32 m_lo;
- u32 m_r[32];
- // COP registers
- u32 m_cpr[4][32];
- u32 m_ccr[4][32];
+ // cop0 registers
+ u32 m_cop0[32];
// internal stuff
int m_icount;
@@ -248,9 +239,54 @@ protected:
class mips1_device_base : public mips1core_device_base
{
+public:
+ // floating point coprocessor revision numbers recognised by RISC/os 4.52 and IRIX
+ enum fpu_rev_t : u32
+ {
+ MIPS_R2360 = 0x0100, // MIPS R2360 Floating Point Board
+ MIPS_R2010 = 0x0200, // MIPS R2010 VLSI Floating Point Chip
+ MIPS_R2010A = 0x0310, // MIPS R2010A VLSI Floating Point Chip
+ MIPS_R3010 = 0x0320, // MIPS R3010 VLSI Floating Point Chip
+ MIPS_R3010A = 0x0330, // MIPS R3010A VLSI Floating Point Chip
+ MIPS_R3010Av4 = 0x0340, // MIPS R3010A VLSI Floating Point Chip
+ MIPS_R6010 = 0x0400, // MIPS R6010 Floating Point Chip
+ };
+
+ void set_fpu(u32 revision, unsigned interrupt = 3) { m_fcr0 = revision; m_fpu_irq = interrupt; }
+
protected:
mips1_device_base(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock, u32 cpurev, size_t icache_size, size_t dcache_size);
+ enum cp1_fcr31_mask : u32
+ {
+ FCR31_RM = 0x00000003, // rounding mode
+
+ FCR31_FI = 0x00000004, // inexact operation flag
+ FCR31_FU = 0x00000008, // underflow flag
+ FCR31_FO = 0x00000010, // overflow flag
+ FCR31_FZ = 0x00000020, // divide by zero flag
+ FCR31_FV = 0x00000040, // invalid operation flag
+
+ FCR31_EI = 0x00000080, // inexact operation enable
+ FCR31_EU = 0x00000100, // underflow enable
+ FCR31_EO = 0x00000200, // overflow enable
+ FCR31_EZ = 0x00000400, // divide by zero enable
+ FCR31_EV = 0x00000800, // invalid operation enable
+
+ FCR31_CI = 0x00001000, // inexact operation cause
+ FCR31_CU = 0x00002000, // underflow cause
+ FCR31_CO = 0x00004000, // overflow cause
+ FCR31_CZ = 0x00008000, // divide by zero cause
+ FCR31_CV = 0x00010000, // invalid operation cause
+ FCR31_CE = 0x00020000, // unimplemented operation cause
+
+ FCR31_C = 0x00800000, // condition
+
+ FCR31_FM = 0x0000007c, // flag mask
+ FCR31_EM = 0x00000f80, // enable mask
+ FCR31_CM = 0x0001f000, // cause mask (except unimplemented)
+ };
+
// device_t overrides
virtual void device_start() override;
virtual void device_reset() override;
@@ -258,12 +294,24 @@ protected:
// device_memory_interface overrides
virtual bool memory_translate(int spacenum, int intention, offs_t &address) override;
- virtual u32 get_cop0_reg(int idx) override;
virtual void handle_cop0(u32 const op) override;
+ virtual u32 get_cop0_reg(unsigned const reg) override;
+
+ virtual void handle_cop1(u32 const op) override;
+ virtual void set_cop1_reg(unsigned const reg, u64 const data);
private:
u64 m_reset_time;
u32 m_tlb[64][2]; // 0 is hi, 1 is lo
+ unsigned m_tlb_mru[3][64];
+
+ // cop1 registers
+ u64 m_f[16];
+ u32 m_fcr0;
+ u32 m_fcr30;
+ u32 m_fcr31;
+
+ unsigned m_fpu_irq;
};
class r2000_device : public mips1_device_base
@@ -317,13 +365,13 @@ public:
r3052e_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
};
-class r3071_device : public mips1core_device_base
+class r3071_device : public mips1_device_base
{
public:
r3071_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock, size_t icache_size = 16384, size_t dcache_size = 4096);
};
-class r3081_device : public mips1core_device_base
+class r3081_device : public mips1_device_base
{
public:
r3081_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock, size_t icache_size = 16384, size_t dcache_size = 4096);
diff --git a/src/devices/cpu/mips/mips3.cpp b/src/devices/cpu/mips/mips3.cpp
index 8c8816b8e23..178d81fadbd 100644
--- a/src/devices/cpu/mips/mips3.cpp
+++ b/src/devices/cpu/mips/mips3.cpp
@@ -16,9 +16,10 @@
#include "ps2vu.h"
#include <cmath>
-#define ENABLE_OVERFLOWS (0)
-#define ENABLE_EE_ELF_LOADER (0)
-#define ENABLE_EE_DECI2 (0)
+#define ENABLE_OVERFLOWS (0)
+#define ENABLE_EE_ELF_LOADER (0)
+#define ENABLE_EE_DECI2 (0)
+#define DELAY_SLOT_EXCEPTION_HACK (0)
/***************************************************************************
HELPER MACROS
@@ -160,13 +161,15 @@ mips3_device::mips3_device(const machine_config &mconfig, device_type type, cons
, m_pfnmask(flavor == MIPS3_TYPE_VR4300 ? 0x000fffff : 0x00ffffff)
, m_tlbentries(flavor == MIPS3_TYPE_VR4300 ? 32 : MIPS3_MAX_TLB_ENTRIES)
, m_bigendian(endianness == ENDIANNESS_BIG)
- , m_byte_xor(m_bigendian ? BYTE4_XOR_BE(0) : BYTE4_XOR_LE(0))
- , m_word_xor(m_bigendian ? WORD_XOR_BE(0) : WORD_XOR_LE(0))
+ , m_byte_xor(data_bits == 64 ? (m_bigendian ? BYTE8_XOR_BE(0) : BYTE8_XOR_LE(0)) : (m_bigendian ? BYTE4_XOR_BE(0) : BYTE4_XOR_LE(0)))
+ , m_word_xor(data_bits == 64 ? (m_bigendian ? WORD2_XOR_BE(0) : WORD2_XOR_LE(0)) : (m_bigendian ? WORD_XOR_BE(0) : WORD_XOR_LE(0)))
+ , m_dword_xor(data_bits == 64 ? (m_bigendian ? DWORD_XOR_BE(0) : DWORD_XOR_LE(0)) : 0)
, c_icache_size(0)
, c_dcache_size(0)
+ , c_secondary_cache_line_size(0)
, m_fastram_select(0)
, m_debugger_temp(0)
- , m_drc_cache(DRC_CACHE_SIZE + sizeof(internal_mips3_state) + 0x80000)
+ , m_drc_cache(DRC_CACHE_SIZE + sizeof(internal_mips3_state) + 0x800000)
, m_drcuml(nullptr)
, m_drcfe(nullptr)
, m_drcoptions(0)
@@ -313,7 +316,11 @@ void mips3_device::generate_exception(int exception, int backup)
if (!(SR & SR_EXL))
{
/* if we were in a branch delay slot, adjust */
+#if DELAY_SLOT_EXCEPTION_HACK
+ if (((m_nextpc != ~0) || (m_delayslot)) && (m_ppc == m_core->pc - 4))
+#else
if ((m_nextpc != ~0) || (m_delayslot))
+#endif
{
m_delayslot = false;
m_nextpc = ~0;
@@ -336,6 +343,7 @@ void mips3_device::generate_exception(int exception, int backup)
if ((CAUSE & 0x7f) == 0)
logerror("Took interrupt -- Cause = %08X, PC = %08X\n", (uint32_t)CAUSE, m_core->pc);
*/
+ debugger_exception_hook(exception);
}
@@ -1233,7 +1241,7 @@ inline bool mips3_device::RWORD(offs_t address, uint32_t *result, bool insn)
{
continue;
}
- *result = m_fastram[ramnum].offset_base32[tlbaddress >> 2];
+ *result = m_fastram[ramnum].offset_base32[(tlbaddress ^ m_dword_xor) >> 2];
return true;
}
*result = (*m_memory.read_dword)(*m_program, tlbaddress);
@@ -1403,7 +1411,7 @@ inline void mips3_device::WWORD(offs_t address, uint32_t data)
{
continue;
}
- m_fastram[ramnum].offset_base32[tlbaddress >> 2] = data;
+ m_fastram[ramnum].offset_base32[(tlbaddress ^ m_dword_xor) >> 2] = data;
return;
}
(*m_memory.write_dword)(*m_program, tlbaddress, data);
@@ -1772,7 +1780,7 @@ inline void mips3_device::set_cop0_creg(int idx, uint64_t val)
void mips3_device::handle_cop0(uint32_t op)
{
- if ((SR & SR_KSU_MASK) != SR_KSU_KERNEL && !(SR & SR_COP0))
+ if ((SR & SR_KSU_MASK) != SR_KSU_KERNEL && !(SR & SR_COP0) && !(SR & (SR_EXL | SR_ERL)))
{
m_badcop_value = 0;
generate_exception(EXCEPTION_BADCOP, 1);
@@ -1832,7 +1840,13 @@ void mips3_device::handle_cop0(uint32_t op)
break;
case 0x10: /* RFE */ invalid_instruction(op); break;
- case 0x18: /* ERET */ m_core->pc = m_core->cpr[0][COP0_EPC]; SR &= ~SR_EXL; check_irqs(); m_lld_value ^= 0xffffffff; m_ll_value ^= 0xffffffff; break;
+ case 0x18: /* ERET */
+ m_core->pc = m_core->cpr[0][COP0_EPC];
+ SR &= ~SR_EXL;
+ check_irqs();
+ m_lld_value ^= 0xffffffff;
+ m_ll_value ^= 0xffffffff;
+ break;
case 0x20: /* WAIT */ break;
default: handle_extra_cop0(op); break;
}
@@ -3516,47 +3530,13 @@ void mips3_device::handle_special(uint32_t op)
m_core->icount -= 35;
break;
case 0x1c: /* DMULT */
- {
- uint64_t a_hi = (uint32_t)(RSVAL64 >> 32);
- uint64_t b_hi = (uint32_t)(RTVAL64 >> 32);
- uint64_t a_lo = (uint32_t)RSVAL64;
- uint64_t b_lo = (uint32_t)RTVAL64;
- uint64_t p1 = a_lo * b_lo;
- uint64_t p2 = a_hi * b_lo;
- uint64_t p3 = a_lo * b_hi;
- uint64_t p4 = a_hi * b_hi;
- uint64_t carry = (uint32_t)(((p1 >> 32) + (uint32_t)p2 + (uint32_t)p3) >> 32);
-
- LOVAL64 = p1 + (p2 << 32) + (p3 << 32);
- HIVAL64 = p4 + (p2 >> 32) + (p3 >> 32) + carry;
-
- // Adjust for sign
- if (RSVAL64 < 0)
- HIVAL64 -= RTVAL64;
- if (RTVAL64 < 0)
- HIVAL64 -= RSVAL64;
-
+ LOVAL64 = mul_64x64(RSVAL64, RTVAL64, reinterpret_cast<s64 *>(&HIVAL64));
m_core->icount -= 7;
break;
- }
case 0x1d: /* DMULTU */
- {
- uint64_t a_hi = (uint32_t)(RSVAL64 >> 32);
- uint64_t b_hi = (uint32_t)(RTVAL64 >> 32);
- uint64_t a_lo = (uint32_t)RSVAL64;
- uint64_t b_lo = (uint32_t)RTVAL64;
- uint64_t p1 = a_lo * b_lo;
- uint64_t p2 = a_hi * b_lo;
- uint64_t p3 = a_lo * b_hi;
- uint64_t p4 = a_hi * b_hi;
- uint64_t carry = (uint32_t)(((p1 >> 32) + (uint32_t)p2 + (uint32_t)p3) >> 32);
-
- LOVAL64 = p1 + (p2 << 32) + (p3 << 32);
- HIVAL64 = p4 + (p2 >> 32) + (p3 >> 32) + carry;
-
+ LOVAL64 = mulu_64x64(RSVAL64, RTVAL64, &HIVAL64);
m_core->icount -= 7;
break;
- }
case 0x1e: /* DDIV */
if (RTVAL64)
{
@@ -5500,7 +5480,7 @@ void mips3_device::load_elf()
void r5000be_device::handle_cache(uint32_t op)
{
- if ((SR & SR_KSU_MASK) != SR_KSU_KERNEL && !(SR & SR_COP0))
+ if ((SR & SR_KSU_MASK) != SR_KSU_KERNEL && !(SR & SR_COP0) && !(SR & (SR_EXL | SR_ERL)))
{
m_badcop_value = 0;
generate_exception(EXCEPTION_BADCOP, 1);
diff --git a/src/devices/cpu/mips/mips3.h b/src/devices/cpu/mips/mips3.h
index 8d16c6cbd84..0afa4ef610b 100644
--- a/src/devices/cpu/mips/mips3.h
+++ b/src/devices/cpu/mips/mips3.h
@@ -297,6 +297,7 @@ public:
void set_icache_size(size_t icache_size) { c_icache_size = icache_size; }
void set_dcache_size(size_t dcache_size) { c_dcache_size = dcache_size; }
+ void set_secondary_cache_line_size(uint8_t secondary_cache_line_size) { c_secondary_cache_line_size = secondary_cache_line_size; }
void set_system_clock(uint32_t system_clock) { c_system_clock = system_clock; }
TIMER_CALLBACK_MEMBER(compare_int_callback);
@@ -436,11 +437,13 @@ protected:
bool m_bigendian;
uint32_t m_byte_xor;
uint32_t m_word_xor;
+ uint32_t m_dword_xor;
data_accessors m_memory;
/* cache memory */
size_t c_icache_size;
size_t c_dcache_size;
+ uint8_t c_secondary_cache_line_size;
/* MMU */
mips3_tlb_entry m_tlb[MIPS3_MAX_TLB_ENTRIES];
diff --git a/src/devices/cpu/mips/mips3com.cpp b/src/devices/cpu/mips/mips3com.cpp
index 0cab50ca894..04225d86da7 100644
--- a/src/devices/cpu/mips/mips3com.cpp
+++ b/src/devices/cpu/mips/mips3com.cpp
@@ -273,6 +273,13 @@ uint32_t mips3_device::compute_config_register()
else if (c_icache_size <= 0x40000) configreg |= 6 << 9;
else configreg |= 7 << 9;
+ if (c_secondary_cache_line_size != 0) {
+ configreg &= ~((0xf << 20) | (1 << 17));
+ if (c_secondary_cache_line_size <= 0x10) configreg |= 0 << 22;
+ else if (c_secondary_cache_line_size <= 0x20) configreg |= 1 << 22;
+ else if (c_secondary_cache_line_size <= 0x40) configreg |= 2 << 22;
+ else configreg |= 3 << 22;
+ }
/* set the system clock divider */
int divisor = 2;
if (c_system_clock != 0)
diff --git a/src/devices/cpu/mips/mips3drc.cpp b/src/devices/cpu/mips/mips3drc.cpp
index abedfd59a8d..02439727608 100644
--- a/src/devices/cpu/mips/mips3drc.cpp
+++ b/src/devices/cpu/mips/mips3drc.cpp
@@ -318,8 +318,9 @@ void mips3_device::code_compile_block(uint8_t mode, offs_t pc)
/* if we don't have a hash for this mode/pc, or if we are overriding all, add one */
if (override || !m_drcuml->hash_exists(mode, seqhead->pc))
+ {
UML_HASH(block, mode, seqhead->pc); // hash mode,pc
-
+ }
/* if we already have a hash, and this is the first sequence, assume that we */
/* are recompiling due to being out of sync and allow future overrides */
else if (seqhead == desclist)
@@ -332,8 +333,7 @@ void mips3_device::code_compile_block(uint8_t mode, offs_t pc)
else
{
UML_LABEL(block, seqhead->pc | 0x80000000); // label seqhead->pc | 0x80000000
- UML_HASHJMP(block, m_core->mode, seqhead->pc, *m_nocode);
- // hashjmp <mode>,seqhead->pc,nocode
+ UML_HASHJMP(block, m_core->mode, seqhead->pc, *m_nocode); // hashjmp <mode>,seqhead->pc,nocode
continue;
}
@@ -343,11 +343,15 @@ void mips3_device::code_compile_block(uint8_t mode, offs_t pc)
/* label this instruction, if it may be jumped to locally */
if (seqhead->flags & OPFLAG_IS_BRANCH_TARGET)
+ {
UML_LABEL(block, seqhead->pc | 0x80000000); // label seqhead->pc | 0x80000000
+ }
/* iterate over instructions in the sequence and compile them */
for (curdesc = seqhead; curdesc != seqlast->next(); curdesc = curdesc->next())
+ {
generate_sequence_instruction(block, compiler, curdesc);
+ }
/* if we need to return to the start, do it */
if (seqlast->flags & OPFLAG_RETURN_TO_START)
@@ -362,11 +366,13 @@ void mips3_device::code_compile_block(uint8_t mode, offs_t pc)
/* if the last instruction can change modes, use a variable mode; otherwise, assume the same mode */
if (seqlast->flags & OPFLAG_CAN_CHANGE_MODES)
- UML_HASHJMP(block, mem(&m_core->mode), nextpc, *m_nocode);
- // hashjmp <mode>,nextpc,nocode
+ {
+ UML_HASHJMP(block, mem(&m_core->mode), nextpc, *m_nocode); // hashjmp <mode>,nextpc,nocode
+ }
else if (seqlast->next() == nullptr || seqlast->next()->pc != nextpc)
- UML_HASHJMP(block, m_core->mode, nextpc, *m_nocode);
- // hashjmp <mode>,nextpc,nocode
+ {
+ UML_HASHJMP(block, m_core->mode, nextpc, *m_nocode); // hashjmp <mode>,nextpc,nocode
+ }
}
/* end the sequence */
@@ -1058,7 +1064,6 @@ void mips3_device::generate_update_cycles(drcuml_block &block, compiler_state &c
compiler.cycles = 0;
}
-
/*-------------------------------------------------
generate_checksum_block - generate code to
validate a sequence of opcodes
@@ -1077,15 +1082,17 @@ void mips3_device::generate_checksum_block(drcuml_block &block, compiler_state &
{
uint32_t sum = seqhead->opptr.l[0];
const void *base = m_prptr(seqhead->physpc);
- UML_LOAD(block, I0, base, 0, SIZE_DWORD, SCALE_x4); // load i0,base,0,dword
+ uint32_t low_bits = (seqhead->physpc & (m_data_bits == 64 ? 4 : 0)) ^ m_dword_xor;
+ UML_LOAD(block, I0, base, low_bits, SIZE_DWORD, SCALE_x1); // load i0,base,0,dword
if (seqhead->delay.first() != nullptr
&& !(seqhead->delay.first()->flags & OPFLAG_VIRTUAL_NOOP)
&& seqhead->physpc != seqhead->delay.first()->physpc)
{
+ uint32_t low_bits = (seqhead->delay.first()->physpc & (m_data_bits == 64 ? 4 : 0)) ^ m_dword_xor;
base = m_prptr(seqhead->delay.first()->physpc);
assert(base != nullptr);
- UML_LOAD(block, I1, base, 0, SIZE_DWORD, SCALE_x4); // load i1,base,dword
+ UML_LOAD(block, I1, base, low_bits, SIZE_DWORD, SCALE_x1); // load i1,base,dword
UML_ADD(block, I0, I0, I1); // add i0,i0,i1
sum += seqhead->delay.first()->opptr.l[0];
@@ -1104,21 +1111,24 @@ void mips3_device::generate_checksum_block(drcuml_block &block, compiler_state &
if (!(curdesc->flags & OPFLAG_VIRTUAL_NOOP))
{
const void *base = m_prptr(seqhead->physpc);
- UML_LOAD(block, I0, base, 0, SIZE_DWORD, SCALE_x4); // load i0,base,0,dword
+ UML_LOAD(block, I0, base, m_dword_xor, SIZE_DWORD, SCALE_x1); // load i0,base,0,dword
UML_CMP(block, I0, curdesc->opptr.l[0]); // cmp i0,opptr[0]
UML_EXHc(block, COND_NE, *m_nocode, epc(seqhead)); // exne nocode,seqhead->pc
}
#else
uint32_t sum = 0;
const void *base = m_prptr(seqhead->physpc);
- UML_LOAD(block, I0, base, 0, SIZE_DWORD, SCALE_x4); // load i0,base,0,dword
+ uint32_t low_bits = (seqhead->physpc & (m_data_bits == 64 ? 4 : 0)) ^ m_dword_xor;
+ UML_LOAD(block, I0, base, low_bits, SIZE_DWORD, SCALE_x1); // load i0,base,0,dword
sum += seqhead->opptr.l[0];
for (curdesc = seqhead->next(); curdesc != seqlast->next(); curdesc = curdesc->next())
+ {
if (!(curdesc->flags & OPFLAG_VIRTUAL_NOOP))
{
base = m_prptr(curdesc->physpc);
assert(base != nullptr);
- UML_LOAD(block, I1, base, 0, SIZE_DWORD, SCALE_x4); // load i1,base,dword
+ uint32_t low_bits = (curdesc->physpc & (m_data_bits == 64 ? 4 : 0)) ^ m_dword_xor;
+ UML_LOAD(block, I1, base, low_bits, SIZE_DWORD, SCALE_x1); // load i1,base,dword
UML_ADD(block, I0, I0, I1); // add i0,i0,i1
sum += curdesc->opptr.l[0];
@@ -1128,11 +1138,13 @@ void mips3_device::generate_checksum_block(drcuml_block &block, compiler_state &
{
base = m_prptr(curdesc->delay.first()->physpc);
assert(base != nullptr);
- UML_LOAD(block, I1, base, 0, SIZE_DWORD, SCALE_x4); // load i1,base,dword
+ uint32_t low_bits = (curdesc->delay.first()->physpc & (m_data_bits == 64 ? 4 : 0)) ^ m_dword_xor;
+ UML_LOAD(block, I1, base, low_bits, SIZE_DWORD, SCALE_x1); // load i1,base,dword
UML_ADD(block, I0, I0, I1); // add i0,i0,i1
sum += curdesc->delay.first()->opptr.l[0];
}
}
+ }
UML_CMP(block, I0, sum); // cmp i0,sum
UML_EXHc(block, COND_NE, *m_nocode, epc(seqhead)); // exne nocode,seqhead->pc
#endif
@@ -1291,17 +1303,18 @@ void mips3_device::generate_delay_slot_and_branch(drcuml_block &block, compiler_
{
generate_update_cycles(block, compiler_temp, desc->targetpc, true); // <subtract cycles>
if (desc->flags & OPFLAG_INTRABLOCK_BRANCH)
+ {
UML_JMP(block, desc->targetpc | 0x80000000); // jmp desc->targetpc | 0x80000000
+ }
else
- UML_HASHJMP(block, m_core->mode, desc->targetpc, *m_nocode);
- // hashjmp <mode>,desc->targetpc,nocode
+ {
+ UML_HASHJMP(block, m_core->mode, desc->targetpc, *m_nocode); // hashjmp <mode>,desc->targetpc,nocode
+ }
}
else
{
- generate_update_cycles(block, compiler_temp, uml::mem(&m_core->jmpdest), true);
- // <subtract cycles>
- UML_HASHJMP(block, m_core->mode, mem(&m_core->jmpdest), *m_nocode);
- // hashjmp <mode>,<rsreg>,nocode
+ generate_update_cycles(block, compiler_temp, uml::mem(&m_core->jmpdest), true); // <subtract cycles>
+ UML_HASHJMP(block, m_core->mode, mem(&m_core->jmpdest), *m_nocode); // hashjmp <mode>,<rsreg>,nocode
}
/* update the label */
@@ -2615,10 +2628,8 @@ bool mips3_device::generate_cop0(drcuml_block &block, compiler_state &compiler,
UML_MOV(block, CPR032(COP0_Status), I0); // mov [Status],i0
generate_update_mode(block);
compiler.checkints = true;
- generate_update_cycles(block, compiler, CPR032(COP0_ErrorPC), true);
- // <subtract cycles>
- UML_HASHJMP(block, mem(&m_core->mode), CPR032(COP0_ErrorPC), *m_nocode);
- // hashjmp <mode>,[EPC],nocode
+ generate_update_cycles(block, compiler, CPR032(COP0_ErrorPC), true); // <subtract cycles>
+ UML_HASHJMP(block, mem(&m_core->mode), CPR032(COP0_ErrorPC), *m_nocode); // hashjmp <mode>,[EPC],nocode
return true;
case 0x20: /* WAIT */
diff --git a/src/devices/cpu/mips/mips3fe.cpp b/src/devices/cpu/mips/mips3fe.cpp
index ff0c59797d9..77b72c9b48b 100644
--- a/src/devices/cpu/mips/mips3fe.cpp
+++ b/src/devices/cpu/mips/mips3fe.cpp
@@ -316,13 +316,13 @@ bool mips3_frontend::describe_special(uint32_t op, opcode_desc &desc)
return true;
case 0x10: // MFHI
- desc.regin[0] |= REGFLAG_HI;
+ desc.regin[2] |= REGFLAG_HI;
desc.regout[0] |= REGFLAG_R(RDREG);
return true;
case 0x11: // MTHI
desc.regin[0] |= REGFLAG_R(RSREG);
- desc.regout[0] |= REGFLAG_HI;
+ desc.regout[2] |= REGFLAG_HI;
return true;
case 0x12: // MFLO
diff --git a/src/devices/cpu/mips/r4000.cpp b/src/devices/cpu/mips/r4000.cpp
new file mode 100644
index 00000000000..ca95b107c65
--- /dev/null
+++ b/src/devices/cpu/mips/r4000.cpp
@@ -0,0 +1,3067 @@
+// license:BSD-3-Clause
+// copyright-holders:Patrick Mackinlay
+
+/*
+ * This is a stripped-down MIPS-III CPU derived from the main mips3 code. Its
+ * primary purpose is to act as a test-bed to aid in debugging MIPS-based
+ * systems, after which the changes/improvements from here are expected to
+ * be back-ported and incorporated into the original mips3 device.
+ *
+ * Because of this specific approach, no attempt is made to support many of the
+ * current features of the mips3 device at this time. Key differences bewteen
+ * this implementation and mips3 include:
+ *
+ * - only supports MIPS R4000/R4400 and QED R4600
+ * - no dynamic recompilation
+ * - reworked address translation logic, including 64-bit modes
+ * - reworked softfloat3-based floating point
+ * - experimental primary instruction cache
+ * - memory tap based ll/sc
+ * - configurable endianness
+ * - it's very very very slow
+ *
+ * TODO
+ * - try to eliminate mode check in address calculations
+ * - find a better way to deal with software interrupts
+ * - enforce mode checks for cp1
+ * - cache instructions
+ * - check/improve instruction timing
+ *
+ */
+
+#include "emu.h"
+#include "debugger.h"
+#include "r4000.h"
+#include "mips3dsm.h"
+
+#include "softfloat3/source/include/softfloat.h"
+
+#define LOG_GENERAL (1U << 0)
+#define LOG_TLB (1U << 1)
+#define LOG_CACHE (1U << 2)
+#define LOG_EXCEPTION (1U << 3)
+#define LOG_SYSCALL (1U << 4)
+#define LOG_STATS (1U << 5)
+
+#define VERBOSE (LOG_GENERAL)
+
+// operating system specific system call logging
+#define SYSCALL_IRIX53 (1U << 0)
+#define SYSCALL_WINNT4 (1U << 1)
+#if VERBOSE & LOG_SYSCALL
+#define SYSCALL_MASK (SYSCALL_IRIX53)
+#else
+#define SYSCALL_MASK (0)
+#endif
+
+// experimental primary instruction cache
+#define ICACHE 0
+
+#include "logmacro.h"
+
+#define USE_ABI_REG_NAMES 1
+
+// cpu instruction fiels
+#define RSREG ((op >> 21) & 31)
+#define RTREG ((op >> 16) & 31)
+#define RDREG ((op >> 11) & 31)
+#define SHIFT ((op >> 6) & 31)
+
+// cop1 instruction fields
+#define FRREG ((op >> 21) & 31)
+#define FTREG ((op >> 16) & 31)
+#define FSREG ((op >> 11) & 31)
+#define FDREG ((op >> 6) & 31)
+
+#define R4000_ENDIAN_LE_BE(le, be) ((m_cp0[CP0_Config] & CONFIG_BE) ? (be) : (le))
+
+// identify odd-numbered cop1 registers
+#define ODD_REGS 0x00010840U
+
+// address computation
+#define ADDR(r, o) (cp0_64() ? ((r) + (o)) : s64(s32((r) + (o))))
+
+#define SR m_cp0[CP0_Status]
+#define CAUSE m_cp0[CP0_Cause]
+
+DEFINE_DEVICE_TYPE(R4000, r4000_device, "r4000", "MIPS R4000")
+DEFINE_DEVICE_TYPE(R4400, r4400_device, "r4400", "MIPS R4400")
+DEFINE_DEVICE_TYPE(R4600, r4600_device, "r4600", "QED R4600")
+
+r4000_base_device::r4000_base_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock, u32 prid, cache_size_t icache_size, cache_size_t dcache_size)
+ : cpu_device(mconfig, type, tag, owner, clock)
+ , m_program_config_le("program", ENDIANNESS_LITTLE, 64, 32)
+ , m_program_config_be("program", ENDIANNESS_BIG, 64, 32)
+ , m_ll_watch(nullptr)
+ , m_fcr0(0x00000500U)
+{
+ m_cp0[CP0_PRId] = prid;
+
+ // default configuration
+ m_cp0[CP0_Config] = CONFIG_BE | (icache_size << 9) | (dcache_size << 6);
+}
+
+void r4000_base_device::device_start()
+{
+ // TODO: save state
+
+ state_add(STATE_GENPC, "GENPC", m_pc).noshow();
+ state_add(STATE_GENPCBASE, "CURPC", m_pc).noshow();
+ state_add(MIPS3_PC, "PC", m_pc).formatstr("%016X");
+
+ // exception processing
+ state_add(MIPS3_CP0 + CP0_Status, "SR", m_cp0[CP0_Status]).formatstr("%08X");
+ state_add(MIPS3_CP0 + CP0_EPC, "EPC", m_cp0[CP0_EPC]).formatstr("%016X");
+ state_add(MIPS3_CP0 + CP0_Cause, "Cause", m_cp0[CP0_Cause]).formatstr("%08X");
+ state_add(MIPS3_CP0 + CP0_Context, "Context", m_cp0[CP0_Context]).formatstr("%016X");
+ state_add(MIPS3_CP0 + CP0_BadVAddr, "BadVAddr", m_cp0[CP0_BadVAddr]).formatstr("%016X");
+ state_add(MIPS3_CP0 + CP0_Compare, "Compare", m_cp0[CP0_Compare]).formatstr("%08X");
+ state_add(MIPS3_CP0 + CP0_WatchLo, "WatchLo", m_cp0[CP0_WatchLo]).formatstr("%08X");
+ state_add(MIPS3_CP0 + CP0_WatchHi, "WatchHi", m_cp0[CP0_WatchHi]).formatstr("%08X");
+ state_add(MIPS3_CP0 + CP0_XContext, "XContext", m_cp0[CP0_XContext]).formatstr("%016X");
+
+ // memory management
+ state_add(MIPS3_CP0 + CP0_Index, "Index", m_cp0[CP0_Index]).formatstr("%08X");
+ state_add(MIPS3_CP0 + CP0_EntryLo0, "EntryLo0", m_cp0[CP0_EntryLo0]).formatstr("%016X");
+ state_add(MIPS3_CP0 + CP0_EntryLo1, "EntryLo1", m_cp0[CP0_EntryLo1]).formatstr("%016X");
+ state_add(MIPS3_CP0 + CP0_PageMask, "PageMask", m_cp0[CP0_PageMask]).formatstr("%08X");
+ state_add(MIPS3_CP0 + CP0_Wired, "Wired", m_cp0[CP0_Wired]).formatstr("%08X");
+ state_add(MIPS3_CP0 + CP0_EntryHi, "EntryHi", m_cp0[CP0_EntryHi]).formatstr("%016X");
+ state_add(MIPS3_CP0 + CP0_LLAddr, "LLAddr", m_cp0[CP0_LLAddr]).formatstr("%08X");
+
+#if USE_ABI_REG_NAMES
+ state_add(MIPS3_R0 + 0, "zero", m_r[0]).callimport().formatstr("%016X"); // Can't change R0
+ state_add(MIPS3_R0 + 1, "at", m_r[1]).formatstr("%016X");
+ state_add(MIPS3_R0 + 2, "v0", m_r[2]).formatstr("%016X");
+ state_add(MIPS3_R0 + 3, "v1", m_r[3]).formatstr("%016X");
+ state_add(MIPS3_R0 + 4, "a0", m_r[4]).formatstr("%016X");
+ state_add(MIPS3_R0 + 5, "a1", m_r[5]).formatstr("%016X");
+ state_add(MIPS3_R0 + 6, "a2", m_r[6]).formatstr("%016X");
+ state_add(MIPS3_R0 + 7, "a3", m_r[7]).formatstr("%016X");
+ state_add(MIPS3_R0 + 8, "t0", m_r[8]).formatstr("%016X");
+ state_add(MIPS3_R0 + 9, "t1", m_r[9]).formatstr("%016X");
+ state_add(MIPS3_R0 + 10, "t2", m_r[10]).formatstr("%016X");
+ state_add(MIPS3_R0 + 11, "t3", m_r[11]).formatstr("%016X");
+ state_add(MIPS3_R0 + 12, "t4", m_r[12]).formatstr("%016X");
+ state_add(MIPS3_R0 + 13, "t5", m_r[13]).formatstr("%016X");
+ state_add(MIPS3_R0 + 14, "t6", m_r[14]).formatstr("%016X");
+ state_add(MIPS3_R0 + 15, "t7", m_r[15]).formatstr("%016X");
+ state_add(MIPS3_R0 + 16, "s0", m_r[16]).formatstr("%016X");
+ state_add(MIPS3_R0 + 17, "s1", m_r[17]).formatstr("%016X");
+ state_add(MIPS3_R0 + 18, "s2", m_r[18]).formatstr("%016X");
+ state_add(MIPS3_R0 + 19, "s3", m_r[19]).formatstr("%016X");
+ state_add(MIPS3_R0 + 20, "s4", m_r[20]).formatstr("%016X");
+ state_add(MIPS3_R0 + 21, "s5", m_r[21]).formatstr("%016X");
+ state_add(MIPS3_R0 + 22, "s6", m_r[22]).formatstr("%016X");
+ state_add(MIPS3_R0 + 23, "s7", m_r[23]).formatstr("%016X");
+ state_add(MIPS3_R0 + 24, "t8", m_r[24]).formatstr("%016X");
+ state_add(MIPS3_R0 + 25, "t9", m_r[25]).formatstr("%016X");
+ state_add(MIPS3_R0 + 26, "k0", m_r[26]).formatstr("%016X");
+ state_add(MIPS3_R0 + 27, "k1", m_r[27]).formatstr("%016X");
+ state_add(MIPS3_R0 + 28, "gp", m_r[28]).formatstr("%016X");
+ state_add(MIPS3_R0 + 29, "sp", m_r[29]).formatstr("%016X");
+ state_add(MIPS3_R0 + 30, "fp", m_r[30]).formatstr("%016X");
+ state_add(MIPS3_R0 + 31, "ra", m_r[31]).formatstr("%016X");
+#else
+ state_add(MIPS3_R0, "R0", m_r[0]).callimport().formatstr("%016X");
+ for (unsigned i = 1; i < 32; i++)
+ state_add(MIPS3_R0 + i, util::string_format("R%d", i).c_str(), m_r[i]);
+#endif
+
+ state_add(MIPS3_HI, "HI", m_hi).formatstr("%016X");
+ state_add(MIPS3_LO, "LO", m_lo).formatstr("%016X");
+
+ // floating point registers
+ state_add(MIPS3_FCR30, "FCR30", m_fcr30).formatstr("%08X");
+ state_add(MIPS3_FCR31, "FCR31", m_fcr31).formatstr("%08X");
+ for (unsigned i = 0; i < 32; i++)
+ state_add(MIPS3_F0 + i, util::string_format("F%d", i).c_str(), m_f[i]);
+
+ set_icountptr(m_icount);
+
+ m_cp0_timer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(r4000_base_device::cp0_timer_callback), this));
+
+ // compute icache line selection mask and allocate tag and data
+ unsigned const config_ic = (m_cp0[CP0_Config] & CONFIG_IC) >> 9;
+
+ m_icache_mask_hi = (0x1000U << config_ic) - 1;
+ m_icache_tag = std::make_unique<u32[]>(0x100U << config_ic);
+ m_icache_data = std::make_unique<u32 []>((0x1000U << config_ic) >> 2);
+}
+
+void r4000_base_device::device_reset()
+{
+ m_branch_state = NONE;
+ m_pc = s64(s32(0xbfc00000));
+
+ m_cp0[CP0_Status] = SR_BEV | SR_ERL;
+ m_cp0[CP0_Wired] = 0;
+ m_cp0[CP0_Compare] = 0;
+ m_cp0[CP0_Count] = 0;
+
+ m_cp0_timer_zero = total_cycles();
+
+ if (m_ll_watch)
+ {
+ m_ll_watch->remove();
+ m_ll_watch = nullptr;
+ }
+
+ m_cp0[CP0_WatchLo] = 0;
+ m_cp0[CP0_WatchHi] = 0;
+
+ // initialize tlb mru index with identity mapping
+ for (unsigned i = 0; i < ARRAY_LENGTH(m_tlb); i++)
+ {
+ m_tlb_mru[TRANSLATE_READ][i] = i;
+ m_tlb_mru[TRANSLATE_WRITE][i] = i;
+ m_tlb_mru[TRANSLATE_FETCH][i] = i;
+ }
+
+ // initialize statistics
+ m_tlb_scans = 0;
+ m_tlb_loops = 0;
+ m_icache_hits = 0;
+ m_icache_misses = 0;
+}
+
+void r4000_base_device::device_stop()
+{
+ if ((m_icache_hits + m_icache_misses) > 0)
+ LOGMASKED(LOG_STATS, "icache hit ratio %.3f%% (%d hits %d misses)\n",
+ double(m_icache_hits) / double(m_icache_hits + m_icache_misses) * 100.0, m_icache_hits, m_icache_misses);
+
+ if (m_tlb_scans > 0)
+ LOGMASKED(LOG_STATS, "tlb scans %d loops %d average %.3f loops per scan\n", m_tlb_scans, m_tlb_loops, double(m_tlb_loops) / double(m_tlb_scans));
+}
+
+device_memory_interface::space_config_vector r4000_base_device::memory_space_config() const
+{
+ return space_config_vector{
+ std::make_pair(AS_PROGRAM, R4000_ENDIAN_LE_BE(&m_program_config_le, &m_program_config_be))
+ };
+}
+
+bool r4000_base_device::memory_translate(int spacenum, int intention, offs_t &address)
+{
+ // FIXME: address truncation
+ u64 placeholder = s32(address);
+
+ translate_t const t = translate(intention, placeholder);
+
+ if (t == ERROR || t == MISS)
+ return false;
+
+ address = placeholder;
+ return true;
+}
+
+std::unique_ptr<util::disasm_interface> r4000_base_device::create_disassembler()
+{
+ return std::make_unique<mips3_disassembler>();
+}
+
+void r4000_base_device::execute_run()
+{
+ // check interrupts
+ if ((CAUSE & SR & CAUSE_IP) && (SR & SR_IE) && !(SR & (SR_EXL | SR_ERL)))
+ cpu_exception(EXCEPTION_INT);
+
+ while (m_icount > 0)
+ {
+ debugger_instruction_hook(m_pc);
+
+ fetch(m_pc,
+ [this](u32 const op)
+ {
+ cpu_execute(op);
+
+ // zero register zero
+ m_r[0] = 0;
+ });
+
+ // update pc and branch state
+ switch (m_branch_state)
+ {
+ case NONE:
+ m_pc += 4;
+ break;
+
+ case DELAY:
+ m_branch_state = NONE;
+ m_pc = m_branch_target;
+ break;
+
+ case BRANCH:
+ m_branch_state = DELAY;
+ m_pc += 4;
+ break;
+
+ case EXCEPTION:
+ m_branch_state = NONE;
+ break;
+
+ case NULLIFY:
+ m_branch_state = NONE;
+ m_pc += 8;
+ break;
+ }
+
+ m_icount--;
+ }
+}
+
+void r4000_base_device::execute_set_input(int inputnum, int state)
+{
+ if (state)
+ m_cp0[CP0_Cause] |= (CAUSE_IPEX0 << inputnum);
+ else
+ m_cp0[CP0_Cause] &= ~(CAUSE_IPEX0 << inputnum);
+}
+
+void r4000_base_device::cpu_execute(u32 const op)
+{
+ switch (op >> 26)
+ {
+ case 0x00: // SPECIAL
+ switch (op & 0x3f)
+ {
+ case 0x00: // SLL
+ m_r[RDREG] = s64(s32(m_r[RTREG] << SHIFT));
+ break;
+ //case 0x01: // *
+ case 0x02: // SRL
+ m_r[RDREG] = s64(s32(u32(m_r[RTREG]) >> SHIFT));
+ break;
+ case 0x03: // SRA
+ m_r[RDREG] = s64(s32(m_r[RTREG]) >> SHIFT);
+ break;
+ case 0x04: // SLLV
+ m_r[RDREG] = s64(s32(m_r[RTREG] << (m_r[RSREG] & 31)));
+ break;
+ //case 0x05: // *
+ case 0x06: // SRLV
+ m_r[RDREG] = s64(s32(u32(m_r[RTREG]) >> (m_r[RSREG] & 31)));
+ break;
+ case 0x07: // SRAV
+ m_r[RDREG] = s64(s32(m_r[RTREG]) >> (m_r[RSREG] & 31));
+ break;
+ case 0x08: // JR
+ m_branch_state = BRANCH;
+ m_branch_target = ADDR(m_r[RSREG], 0);
+ break;
+ case 0x09: // JALR
+ m_branch_state = BRANCH;
+ m_branch_target = ADDR(m_r[RSREG], 0);
+ m_r[RDREG] = ADDR(m_pc, 8);
+ break;
+ //case 0x0a: // *
+ //case 0x0b: // *
+ case 0x0c: // SYSCALL
+ if (VERBOSE & LOG_SYSCALL)
+ {
+ if (SYSCALL_MASK & SYSCALL_IRIX53)
+ {
+ switch (m_r[2])
+ {
+ case 0x3e9: // 1001 = exit
+ LOGMASKED(LOG_SYSCALL, "exit(%d) (%s)\n", m_r[4], machine().describe_context());
+ break;
+
+ case 0x3ea: // 1002 = fork
+ LOGMASKED(LOG_SYSCALL, "fork() (%s)\n", machine().describe_context());
+ break;
+
+ case 0x3eb: // 1003 = read
+ LOGMASKED(LOG_SYSCALL, "read(%d, 0x%x, %d) (%s)\n", m_r[4], m_r[5], m_r[6], machine().describe_context());
+ break;
+
+ case 0x3ec: // 1004 = write
+ LOGMASKED(LOG_SYSCALL, "write(%d, 0x%x, %d) (%s)\n", m_r[4], m_r[5], m_r[6], machine().describe_context());
+ if (m_r[4] == 1 || m_r[4] == 2)
+ printf("%s", debug_string(m_r[5], m_r[6]).c_str());
+ break;
+
+ case 0x3ed: // 1005 = open
+ LOGMASKED(LOG_SYSCALL, "open(\"%s\", %#o) (%s)\n", debug_string(m_r[4]), m_r[5], machine().describe_context());
+ break;
+
+ case 0x3ee: // 1006 = close
+ LOGMASKED(LOG_SYSCALL, "close(%d) (%s)\n", m_r[4], machine().describe_context());
+ break;
+
+ case 0x3ef: // 1007 = creat
+ LOGMASKED(LOG_SYSCALL, "creat(\"%s\", %#o) (%s)\n", debug_string(m_r[4]), m_r[5], machine().describe_context());
+ break;
+
+ case 0x423: // 1059 = exece
+ LOGMASKED(LOG_SYSCALL, "exece(\"%s\", [ %s ], [ %s ]) (%s)\n", debug_string(m_r[4]), debug_string_array(m_r[5]), debug_string_array(m_r[6]), machine().describe_context());
+ break;
+
+ default:
+ LOGMASKED(LOG_SYSCALL, "syscall 0x%x (%s)\n", m_r[2], machine().describe_context());
+ break;
+ }
+ }
+ else if (SYSCALL_MASK & SYSCALL_WINNT4)
+ {
+ switch (m_r[2])
+ {
+ case 0x4f:
+ load<s32>(m_r[7] + 8,
+ [this](s64 string_pointer)
+ {
+ LOGMASKED(LOG_SYSCALL, "NtOpenFile(%s) (%s)\n", debug_string(string_pointer), machine().describe_context());
+ });
+ break;
+
+ default:
+ LOGMASKED(LOG_SYSCALL, "syscall 0x%x (%s)\n", m_r[2], machine().describe_context());
+ break;
+ }
+ }
+ }
+ cpu_exception(EXCEPTION_SYS);
+ break;
+ case 0x0d: // BREAK
+ cpu_exception(EXCEPTION_BP);
+ break;
+ //case 0x0e: // *
+ case 0x0f: // SYNC
+ break;
+ case 0x10: // MFHI
+ m_r[RDREG] = m_hi;
+ break;
+ case 0x11: // MTHI
+ m_hi = m_r[RSREG];
+ break;
+ case 0x12: // MFLO
+ m_r[RDREG] = m_lo;
+ break;
+ case 0x13: // MTLO
+ m_lo = m_r[RSREG];
+ break;
+ case 0x14: // DSLLV
+ m_r[RDREG] = m_r[RTREG] << (m_r[RSREG] & 63);
+ break;
+ //case 0x15: // *
+ case 0x16: // DSRLV
+ m_r[RDREG] = m_r[RTREG] >> (m_r[RSREG] & 63);
+ break;
+ case 0x17: // DSRAV
+ m_r[RDREG] = s64(m_r[RTREG]) >> (m_r[RSREG] & 63);
+ break;
+ case 0x18: // MULT
+ {
+ u64 const product = mul_32x32(s32(m_r[RSREG]), s32(m_r[RTREG]));
+
+ m_lo = s64(s32(product));
+ m_hi = s64(s32(product >> 32));
+ m_icount -= 3;
+ }
+ break;
+ case 0x19: // MULTU
+ {
+ u64 const product = mulu_32x32(u32(m_r[RSREG]), u32(m_r[RTREG]));
+
+ m_lo = s64(s32(product));
+ m_hi = s64(s32(product >> 32));
+ m_icount -= 3;
+ }
+ break;
+ case 0x1a: // DIV
+ if (m_r[RTREG])
+ {
+ m_lo = s64(s32(m_r[RSREG]) / s32(m_r[RTREG]));
+ m_hi = s64(s32(m_r[RSREG]) % s32(m_r[RTREG]));
+ }
+ m_icount -= 35;
+ break;
+ case 0x1b: // DIVU
+ if (m_r[RTREG])
+ {
+ m_lo = s64(s32(u32(m_r[RSREG]) / u32(m_r[RTREG])));
+ m_hi = s64(s32(u32(m_r[RSREG]) % u32(m_r[RTREG])));
+ }
+ m_icount -= 35;
+ break;
+ case 0x1c: // DMULT
+ m_lo = mul_64x64(m_r[RSREG], m_r[RTREG], reinterpret_cast<s64 *>(&m_hi));
+ m_icount -= 7;
+ break;
+ case 0x1d: // DMULTU
+ m_lo = mulu_64x64(m_r[RSREG], m_r[RTREG], &m_hi);
+ m_icount -= 7;
+ break;
+ case 0x1e: // DDIV
+ if (m_r[RTREG])
+ {
+ m_lo = s64(m_r[RSREG]) / s64(m_r[RTREG]);
+ m_hi = s64(m_r[RSREG]) % s64(m_r[RTREG]);
+ }
+ m_icount -= 67;
+ break;
+ case 0x1f: // DDIVU
+ if (m_r[RTREG])
+ {
+ m_lo = m_r[RSREG] / m_r[RTREG];
+ m_hi = m_r[RSREG] % m_r[RTREG];
+ }
+ m_icount -= 67;
+ break;
+ case 0x20: // ADD
+ {
+ u32 const sum = u32(m_r[RSREG]) + u32(m_r[RTREG]);
+
+ // overflow: (sign(addend0) == sign(addend1)) && (sign(addend0) != sign(sum))
+ if (!BIT(u32(m_r[RSREG]) ^ u32(m_r[RTREG]), 31) && BIT(u32(m_r[RSREG]) ^ sum, 31))
+ cpu_exception(EXCEPTION_OV);
+ else
+ m_r[RDREG] = s64(s32(sum));
+ }
+ break;
+ case 0x21: // ADDU
+ m_r[RDREG] = s64(s32(u32(m_r[RSREG]) + u32(m_r[RTREG])));
+ break;
+ case 0x22: // SUB
+ {
+ u32 const difference = u32(m_r[RSREG]) - u32(m_r[RTREG]);
+
+ // overflow: (sign(minuend) != sign(subtrahend)) && (sign(minuend) != sign(difference))
+ if (BIT(u32(m_r[RSREG]) ^ u32(m_r[RTREG]), 31) && BIT(u32(m_r[RSREG]) ^ difference, 31))
+ cpu_exception(EXCEPTION_OV);
+ else
+ m_r[RDREG] = s64(s32(difference));
+ }
+ break;
+ case 0x23: // SUBU
+ m_r[RDREG] = s64(s32(u32(m_r[RSREG]) - u32(m_r[RTREG])));
+ break;
+ case 0x24: // AND
+ m_r[RDREG] = m_r[RSREG] & m_r[RTREG];
+ break;
+ case 0x25: // OR
+ m_r[RDREG] = m_r[RSREG] | m_r[RTREG];
+ break;
+ case 0x26: // XOR
+ m_r[RDREG] = m_r[RSREG] ^ m_r[RTREG];
+ break;
+ case 0x27: // NOR
+ m_r[RDREG] = ~(m_r[RSREG] | m_r[RTREG]);
+ break;
+ //case 0x28: // *
+ //case 0x29: // *
+ case 0x2a: // SLT
+ m_r[RDREG] = s64(m_r[RSREG]) < s64(m_r[RTREG]);
+ break;
+ case 0x2b: // SLTU
+ m_r[RDREG] = m_r[RSREG] < m_r[RTREG];
+ break;
+ case 0x2c: // DADD
+ {
+ u64 const sum = m_r[RSREG] + m_r[RTREG];
+
+ // overflow: (sign(addend0) == sign(addend1)) && (sign(addend0) != sign(sum))
+ if (!BIT(m_r[RSREG] ^ m_r[RTREG], 63) && BIT(m_r[RSREG] ^ sum, 63))
+ cpu_exception(EXCEPTION_OV);
+ else
+ m_r[RDREG] = sum;
+ }
+ break;
+ case 0x2d: // DADDU
+ m_r[RDREG] = m_r[RSREG] + m_r[RTREG];
+ break;
+ case 0x2e: // DSUB
+ {
+ u64 const difference = m_r[RSREG] - m_r[RTREG];
+
+ // overflow: (sign(minuend) != sign(subtrahend)) && (sign(minuend) != sign(difference))
+ if (BIT(m_r[RSREG] ^ m_r[RTREG], 63) && BIT(m_r[RSREG] ^ difference, 63))
+ cpu_exception(EXCEPTION_OV);
+ else
+ m_r[RDREG] = difference;
+ }
+ break;
+ case 0x2f: // DSUBU
+ m_r[RDREG] = m_r[RSREG] - m_r[RTREG];
+ break;
+ case 0x30: // TGE
+ if (s64(m_r[RSREG]) >= s64(m_r[RTREG]))
+ cpu_exception(EXCEPTION_TR);
+ break;
+ case 0x31: // TGEU
+ if (m_r[RSREG] >= m_r[RTREG])
+ cpu_exception(EXCEPTION_TR);
+ break;
+ case 0x32: // TLT
+ if (s64(m_r[RSREG]) < s64(m_r[RTREG]))
+ cpu_exception(EXCEPTION_TR);
+ break;
+ case 0x33: // TLTU
+ if (m_r[RSREG] < m_r[RTREG])
+ cpu_exception(EXCEPTION_TR);
+ break;
+ case 0x34: // TEQ
+ if (m_r[RSREG] == m_r[RTREG])
+ cpu_exception(EXCEPTION_TR);
+ break;
+ //case 0x35: // *
+ case 0x36: // TNE
+ if (m_r[RSREG] != m_r[RTREG])
+ cpu_exception(EXCEPTION_TR);
+ break;
+ //case 0x37: // *
+ case 0x38: // DSLL
+ m_r[RDREG] = m_r[RTREG] << SHIFT;
+ break;
+ //case 0x39: // *
+ case 0x3a: // DSRL
+ m_r[RDREG] = m_r[RTREG] >> SHIFT;
+ break;
+ case 0x3b: // DSRA
+ m_r[RDREG] = s64(m_r[RTREG]) >> SHIFT;
+ break;
+ case 0x3c: // DSLL32
+ m_r[RDREG] = m_r[RTREG] << (SHIFT + 32);
+ break;
+ //case 0x3d: // *
+ case 0x3e: // DSRL32
+ m_r[RDREG] = m_r[RTREG] >> (SHIFT + 32);
+ break;
+ case 0x3f: // DSRA32
+ m_r[RDREG] = s64(m_r[RTREG]) >> (SHIFT + 32);
+ break;
+
+ default:
+ // * Operation codes marked with an asterisk cause reserved
+ // instruction exceptions in all current implementations and are
+ // reserved for future versions of the architecture.
+ cpu_exception(EXCEPTION_RI);
+ break;
+ }
+ break;
+ case 0x01: // REGIMM
+ switch ((op >> 16) & 0x1f)
+ {
+ case 0x00: // BLTZ
+ if (s64(m_r[RSREG]) < 0)
+ {
+ m_branch_state = BRANCH;
+ m_branch_target = ADDR(m_pc + 4, s32(s16(op)) << 2);
+ }
+ break;
+ case 0x01: // BGEZ
+ if (s64(m_r[RSREG]) >= 0)
+ {
+ m_branch_state = BRANCH;
+ m_branch_target = ADDR(m_pc + 4, s32(s16(op)) << 2);
+ }
+ break;
+ case 0x02: // BLTZL
+ if (s64(m_r[RSREG]) < 0)
+ {
+ m_branch_state = BRANCH;
+ m_branch_target = ADDR(m_pc + 4, s32(s16(op)) << 2);
+ }
+ else
+ m_branch_state = NULLIFY;
+ break;
+ case 0x03: // BGEZL
+ if (s64(m_r[RSREG]) >= 0)
+ {
+ m_branch_state = BRANCH;
+ m_branch_target = ADDR(m_pc + 4, s32(s16(op)) << 2);
+ }
+ else
+ m_branch_state = NULLIFY;
+ break;
+ //case 0x04: // *
+ //case 0x05: // *
+ //case 0x06: // *
+ //case 0x07: // *
+ case 0x08: // TGEI
+ if (s64(m_r[RSREG]) >= s16(op))
+ cpu_exception(EXCEPTION_TR);
+ break;
+ case 0x09: // TGEIU
+ if (m_r[RSREG] >= u64(s64(s16(op))))
+ cpu_exception(EXCEPTION_TR);
+ break;
+ case 0x0a: // TLTI
+ if (s64(m_r[RSREG]) < s16(op))
+ cpu_exception(EXCEPTION_TR);
+ break;
+ case 0x0b: // TLTIU
+ if (m_r[RSREG] >= u64(s64(s16(op))))
+ cpu_exception(EXCEPTION_TR);
+ break;
+ case 0x0c: // TEQI
+ if (m_r[RSREG] == u64(s64(s16(op))))
+ cpu_exception(EXCEPTION_TR);
+ break;
+ //case 0x0d: // *
+ case 0x0e: // TNEI
+ if (m_r[RSREG] != u64(s64(s16(op))))
+ cpu_exception(EXCEPTION_TR);
+ break;
+ //case 0x0f: // *
+ case 0x10: // BLTZAL
+ if (s64(m_r[RSREG]) < 0)
+ {
+ m_branch_state = BRANCH;
+ m_branch_target = ADDR(m_pc + 4, s32(s16(op)) << 2);
+ }
+ m_r[31] = ADDR(m_pc, 8);
+ break;
+ case 0x11: // BGEZAL
+ if (s64(m_r[RSREG]) >= 0)
+ {
+ m_branch_state = BRANCH;
+ m_branch_target = ADDR(m_pc + 4, s32(s16(op)) << 2);
+ }
+ m_r[31] = ADDR(m_pc, 8);
+ break;
+ case 0x12: // BLTZALL
+ if (s64(m_r[RSREG]) < 0)
+ {
+ m_branch_state = BRANCH;
+ m_branch_target = ADDR(m_pc + 4, s32(s16(op)) << 2);
+ }
+ else
+ m_branch_state = NULLIFY;
+ m_r[31] = ADDR(m_pc, 8);
+ break;
+ case 0x13: // BGEZALL
+ if (s64(m_r[RSREG]) >= 0)
+ {
+ m_branch_state = BRANCH;
+ m_branch_target = ADDR(m_pc + 4, s32(s16(op)) << 2);
+ }
+ else
+ m_branch_state = NULLIFY;
+ m_r[31] = ADDR(m_pc, 8);
+ break;
+ //case 0x14: // *
+ //case 0x15: // *
+ //case 0x16: // *
+ //case 0x17: // *
+ //case 0x18: // *
+ //case 0x19: // *
+ //case 0x1a: // *
+ //case 0x1b: // *
+ //case 0x1c: // *
+ //case 0x1d: // *
+ //case 0x1e: // *
+ //case 0x1f: // *
+
+ default:
+ // * Operation codes marked with an asterisk cause reserved
+ // instruction exceptions in all current implementations and are
+ // reserved for future versions of the architecture.
+ cpu_exception(EXCEPTION_RI);
+ break;
+ }
+ break;
+ case 0x02: // J
+ m_branch_state = BRANCH;
+ m_branch_target = (ADDR(m_pc, 4) & ~0x0fffffffULL) | ((op & 0x03ffffffU) << 2);
+ break;
+ case 0x03: // JAL
+ m_branch_state = BRANCH;
+ m_branch_target = (ADDR(m_pc, 4) & ~0x0fffffffULL) | ((op & 0x03ffffffU) << 2);
+ m_r[31] = ADDR(m_pc, 8);
+ break;
+ case 0x04: // BEQ
+ if (m_r[RSREG] == m_r[RTREG])
+ {
+ m_branch_state = BRANCH;
+ m_branch_target = ADDR(m_pc + 4, s32(s16(op)) << 2);
+ }
+ break;
+ case 0x05: // BNE
+ if (m_r[RSREG] != m_r[RTREG])
+ {
+ m_branch_state = BRANCH;
+ m_branch_target = ADDR(m_pc + 4, s32(s16(op)) << 2);
+ }
+ break;
+ case 0x06: // BLEZ
+ if (s64(m_r[RSREG]) <= 0)
+ {
+ m_branch_state = BRANCH;
+ m_branch_target = ADDR(m_pc + 4, s32(s16(op)) << 2);
+ }
+ break;
+ case 0x07: // BGTZ
+ if (s64(m_r[RSREG]) > 0)
+ {
+ m_branch_state = BRANCH;
+ m_branch_target = ADDR(m_pc + 4, s32(s16(op)) << 2);
+ }
+ break;
+ case 0x08: // ADDI
+ {
+ u32 const sum = u32(m_r[RSREG]) + s16(op);
+
+ // overflow: (sign(addend0) == sign(addend1)) && (sign(addend0) != sign(sum))
+ if (!BIT(u32(m_r[RSREG]) ^ s32(s16(op)), 31) && BIT(u32(m_r[RSREG]) ^ sum, 31))
+ cpu_exception(EXCEPTION_OV);
+ else
+ m_r[RTREG] = s64(s32(sum));
+ }
+ break;
+ case 0x09: // ADDIU
+ m_r[RTREG] = s64(s32(u32(m_r[RSREG]) + s16(op)));
+ break;
+ case 0x0a: // SLTI
+ m_r[RTREG] = s64(m_r[RSREG]) < s64(s16(op));
+ break;
+ case 0x0b: // SLTIU
+ m_r[RTREG] = m_r[RSREG] < u64(s64(s16(op)));
+ break;
+ case 0x0c: // ANDI
+ m_r[RTREG] = m_r[RSREG] & u16(op);
+ break;
+ case 0x0d: // ORI
+ m_r[RTREG] = m_r[RSREG] | u16(op);
+ break;
+ case 0x0e: // XORI
+ m_r[RTREG] = m_r[RSREG] ^ u16(op);
+ break;
+ case 0x0f: // LUI
+ m_r[RTREG] = s64(s16(op)) << 16;
+ break;
+ case 0x10: // COP0
+ cp0_execute(op);
+ break;
+ case 0x11: // COP1
+ cp1_execute(op);
+ break;
+ case 0x12: // COP2
+ cp2_execute(op);
+ break;
+ //case 0x13: // *
+ case 0x14: // BEQL
+ if (m_r[RSREG] == m_r[RTREG])
+ {
+ m_branch_state = BRANCH;
+ m_branch_target = ADDR(m_pc + 4, s32(s16(op)) << 2);
+ }
+ else
+ m_branch_state = NULLIFY;
+ break;
+ case 0x15: // BNEL
+ if (m_r[RSREG] != m_r[RTREG])
+ {
+ m_branch_state = BRANCH;
+ m_branch_target = ADDR(m_pc + 4, s32(s16(op)) << 2);
+ }
+ else
+ m_branch_state = NULLIFY;
+ break;
+ case 0x16: // BLEZL
+ if (s64(m_r[RSREG]) <= 0)
+ {
+ m_branch_state = BRANCH;
+ m_branch_target = ADDR(m_pc + 4, s32(s16(op)) << 2);
+ }
+ else
+ m_branch_state = NULLIFY;
+ break;
+ case 0x17: // BGTZL
+ if (s64(m_r[RSREG]) > 0)
+ {
+ m_branch_state = BRANCH;
+ m_branch_target = ADDR(m_pc + 4, s32(s16(op)) << 2);
+ }
+ else
+ m_branch_state = NULLIFY;
+ break;
+ case 0x18: // DADDI
+ {
+ u64 const sum = m_r[RSREG] + s64(s16(op));
+
+ // overflow: (sign(addend0) == sign(addend1)) && (sign(addend0) != sign(sum))
+ if (!BIT(m_r[RSREG] ^ s64(s16(op)), 63) && BIT(m_r[RSREG] ^ sum, 63))
+ cpu_exception(EXCEPTION_OV);
+ else
+ m_r[RTREG] = sum;
+ }
+ break;
+ case 0x19: // DADDIU
+ m_r[RTREG] = m_r[RSREG] + s64(s16(op));
+ break;
+ case 0x1a: // LDL
+ if (!(SR & SR_KSU) || (SR & (SR_EXL | SR_ERL)) || cp0_64())
+ cpu_ldl(op);
+ else
+ cpu_exception(EXCEPTION_RI);
+ break;
+ case 0x1b: // LDR
+ if (!(SR & SR_KSU) || (SR & (SR_EXL | SR_ERL)) || cp0_64())
+ cpu_ldr(op);
+ else
+ cpu_exception(EXCEPTION_RI);
+ break;
+ //case 0x1c: // *
+ //case 0x1d: // *
+ //case 0x1e: // *
+ //case 0x1f: // *
+ case 0x20: // LB
+ load<s8>(ADDR(m_r[RSREG], s16(op)),
+ [this, op](s8 data)
+ {
+ m_r[RTREG] = data;
+ });
+ break;
+ case 0x21: // LH
+ load<s16>(ADDR(m_r[RSREG], s16(op)),
+ [this, op](s16 data)
+ {
+ m_r[RTREG] = data;
+ });
+ break;
+ case 0x22: // LWL
+ cpu_lwl(op);
+ break;
+ case 0x23: // LW
+ load<s32>(ADDR(m_r[RSREG], s16(op)),
+ [this, op](s32 data)
+ {
+ m_r[RTREG] = data;
+ });
+ break;
+ case 0x24: // LBU
+ load<s8>(ADDR(m_r[RSREG], s16(op)),
+ [this, op](u8 data)
+ {
+ m_r[RTREG] = data;
+ });
+ break;
+ case 0x25: // LHU
+ load<u16>(ADDR(m_r[RSREG], s16(op)),
+ [this, op](u16 data)
+ {
+ m_r[RTREG] = data;
+ });
+ break;
+ case 0x26: // LWR
+ cpu_lwr(op);
+ break;
+ case 0x27: // LWU
+ load<u32>(ADDR(m_r[RSREG], s16(op)),
+ [this, op](u32 data)
+ {
+ m_r[RTREG] = data;
+ });
+ break;
+ case 0x28: // SB
+ store<u8>(ADDR(m_r[RSREG], s16(op)), u8(m_r[RTREG]));
+ break;
+ case 0x29: // SH
+ store<u16>(ADDR(m_r[RSREG], s16(op)), u16(m_r[RTREG]));
+ break;
+ case 0x2a: // SWL
+ cpu_swl(op);
+ break;
+ case 0x2b: // SW
+ store<u32>(ADDR(m_r[RSREG], s16(op)), u32(m_r[RTREG]));
+ break;
+ case 0x2c: // SDL
+ if (!(SR & SR_KSU) || (SR & (SR_EXL | SR_ERL)) || cp0_64())
+ cpu_sdl(op);
+ else
+ cpu_exception(EXCEPTION_RI);
+ break;
+ case 0x2d: // SDR
+ if (!(SR & SR_KSU) || (SR & (SR_EXL | SR_ERL)) || cp0_64())
+ cpu_sdr(op);
+ else
+ cpu_exception(EXCEPTION_RI);
+ break;
+ case 0x2e: // SWR
+ cpu_swr(op);
+ break;
+ case 0x2f: // CACHE
+ if ((SR & SR_KSU) && !(SR & SR_CU0) && !(SR & (SR_EXL | SR_ERL)))
+ {
+ cpu_exception(EXCEPTION_CP0);
+ break;
+ }
+
+ switch ((op >> 16) & 0x1f)
+ {
+ case 0x00: // index invalidate (I)
+ if (ICACHE)
+ {
+ m_icache_tag[(ADDR(m_r[RSREG], s16(op)) & m_icache_mask_hi) >> m_icache_shift] &= ~ICACHE_V;
+ break;
+ }
+
+ case 0x04: // index load tag (I)
+ if (ICACHE)
+ {
+ u32 const tag = m_icache_tag[(ADDR(m_r[RSREG], s16(op)) & m_icache_mask_hi) >> m_icache_shift];
+
+ m_cp0[CP0_TagLo] = ((tag & ICACHE_PTAG) << 8) | ((tag & ICACHE_V) >> 18) | ((tag & ICACHE_P) >> 25);
+ m_cp0[CP0_ECC] = 0; // data ecc or parity
+
+ break;
+ }
+
+ case 0x08: // index store tag (I)
+ if (ICACHE)
+ {
+ // FIXME: compute parity
+ m_icache_tag[(ADDR(m_r[RSREG], s16(op)) & m_icache_mask_hi) >> m_icache_shift] =
+ (m_cp0[CP0_TagLo] & TAGLO_PTAGLO) >> 8 | (m_cp0[CP0_TagLo] & TAGLO_PSTATE) << 18;
+
+ break;
+ }
+
+ case 0x01: // index writeback invalidate (D)
+ case 0x02: // index invalidate (SI)
+ case 0x03: // index writeback invalidate (SD)
+
+ case 0x05: // index load tag (D)
+ case 0x06: // index load tag (SI)
+ case 0x07: // index load tag (SI)
+
+ case 0x09: // index store tag (D)
+ case 0x0a: // index store tag (SI)
+ case 0x0b: // index store tag (SD)
+
+ case 0x0d: // create dirty exclusive (D)
+ case 0x0f: // create dirty exclusive (SD)
+
+ case 0x10: // hit invalidate (I)
+ case 0x11: // hit invalidate (D)
+ case 0x12: // hit invalidate (SI)
+ case 0x13: // hit invalidate (SD)
+
+ case 0x14: // fill (I)
+ case 0x15: // hit writeback invalidate (D)
+ case 0x17: // hit writeback invalidate (SD)
+
+ case 0x18: // hit writeback (I)
+ case 0x19: // hit writeback (D)
+ case 0x1b: // hit writeback (SD)
+
+ case 0x1e: // hit set virtual (SI)
+ case 0x1f: // hit set virtual (SD)
+ //LOGMASKED(LOG_CACHE, "cache 0x%08x unimplemented (%s)\n", op, machine().describe_context());
+ break;
+ }
+ break;
+ case 0x30: // LL
+ load_linked<s32>(ADDR(m_r[RSREG], s16(op)),
+ [this, op](u64 address, s32 data)
+ {
+ // remove existing tap
+ if (m_ll_watch)
+ m_ll_watch->remove();
+
+ m_r[RTREG] = data;
+ m_cp0[CP0_LLAddr] = u32(address >> 4);
+
+ // install write tap
+ // FIXME: physical address truncation
+ m_ll_watch = space(0).install_write_tap(offs_t(address & ~7), offs_t(address | 7), "ll",
+ [this, hi(bool(BIT(address, 2)))](offs_t offset, u64 &data, u64 mem_mask)
+ {
+ if (hi ? ACCESSING_BITS_32_63 : ACCESSING_BITS_0_31)
+ {
+ m_ll_watch->remove();
+ m_ll_watch = nullptr;
+ }
+ });
+ });
+ break;
+ case 0x31: // LWC1
+ cp1_execute(op);
+ break;
+ case 0x32: // LWC2
+ cp2_execute(op);
+ break;
+ //case 0x33: // *
+ case 0x34: // LLD
+ load_linked<u64>(ADDR(m_r[RSREG], s16(op)),
+ [this, op](u64 address, u64 data)
+ {
+ // remove existing tap
+ if (m_ll_watch)
+ m_ll_watch->remove();
+
+ m_r[RTREG] = data;
+ m_cp0[CP0_LLAddr] = u32(address >> 4);
+
+ // install write tap
+ // FIXME: address truncation
+ m_ll_watch = space(0).install_write_tap(offs_t(address & ~7), offs_t(address | 7), "lld",
+ [this](offs_t offset, u64 &data, u64 mem_mask)
+ {
+ m_ll_watch->remove();
+ m_ll_watch = nullptr;
+ });
+ });
+ break;
+ case 0x35: // LDC1
+ cp1_execute(op);
+ break;
+ case 0x36: // LDC2
+ cp2_execute(op);
+ break;
+ case 0x37: // LD
+ load<u64>(ADDR(m_r[RSREG], s16(op)),
+ [this, op](u64 data)
+ {
+ m_r[RTREG] = data;
+ });
+ break;
+ case 0x38: // SC
+ if (m_ll_watch)
+ {
+ m_ll_watch->remove();
+ m_ll_watch = nullptr;
+
+ store<u32>(ADDR(m_r[RSREG], s16(op)), u32(m_r[RTREG]));
+ m_r[RTREG] = 1;
+ }
+ else
+ m_r[RTREG] = 0;
+ break;
+ case 0x39: // SWC1
+ cp1_execute(op);
+ break;
+ case 0x3a: // SWC2
+ cp2_execute(op);
+ break;
+ //case 0x3b: // *
+ case 0x3c: // SCD
+ if (m_ll_watch)
+ {
+ m_ll_watch->remove();
+ m_ll_watch = nullptr;
+
+ store<u64>(ADDR(m_r[RSREG], s16(op)), m_r[RTREG]);
+ m_r[RTREG] = 1;
+ }
+ else
+ m_r[RTREG] = 0;
+ break;
+ case 0x3d: // SDC1
+ cp1_execute(op);
+ break;
+ case 0x3e: // SDC2
+ cp2_execute(op);
+ break;
+ case 0x3f: // SD
+ store<u64>(ADDR(m_r[RSREG], s16(op)), m_r[RTREG]);
+ break;
+
+ default:
+ // * Operation codes marked with an asterisk cause reserved instruction
+ // exceptions in all current implementations and are reserved for future
+ // versions of the architecture.
+ cpu_exception(EXCEPTION_RI);
+ break;
+ }
+}
+
+void r4000_base_device::cpu_exception(u32 exception, u16 const vector)
+{
+ if (exception != EXCEPTION_INT)
+ LOGMASKED(LOG_EXCEPTION, "exception 0x%08x\n", exception);
+
+ if (!(SR & SR_EXL))
+ {
+ m_cp0[CP0_EPC] = m_pc;
+
+ CAUSE = (CAUSE & CAUSE_IP) | exception;
+
+ // if in a branch delay slot, restart at the branch instruction
+ if (m_branch_state == DELAY)
+ {
+ m_cp0[CP0_EPC] -= 4;
+ CAUSE |= CAUSE_BD;
+ }
+
+ SR |= SR_EXL;
+ }
+ else
+ CAUSE = (CAUSE & (CAUSE_BD | CAUSE_IP)) | exception;
+
+ m_branch_state = EXCEPTION;
+ m_pc = ((SR & SR_BEV) ? s64(s32(0xbfc00200)) : s64(s32(0x80000000))) + vector;
+
+ if (exception != EXCEPTION_INT)
+ debugger_exception_hook(exception);
+}
+
+void r4000_base_device::cpu_lwl(u32 const op)
+{
+ u64 const offset = ADDR(m_r[RSREG], s16(op));
+ unsigned const shift = ((offset & 3) ^ R4000_ENDIAN_LE_BE(3, 0)) << 3;
+
+ load<u32>(offset & ~3,
+ [this, op, shift](u32 const data)
+ {
+ m_r[RTREG] = s32((m_r[RTREG] & ~u32(~u32(0) << shift)) | (data << shift));
+ });
+}
+
+void r4000_base_device::cpu_lwr(u32 const op)
+{
+ u64 const offset = ADDR(m_r[RSREG], s16(op));
+ unsigned const shift = ((offset & 0x3) ^ R4000_ENDIAN_LE_BE(0, 3)) << 3;
+
+ load<u32>(offset & ~3,
+ [this, op, shift](u32 const data)
+ {
+ m_r[RTREG] = s32((m_r[RTREG] & ~u32(~u32(0) >> shift)) | (data >> shift));
+ });
+}
+
+void r4000_base_device::cpu_swl(u32 const op)
+{
+ u64 const offset = ADDR(m_r[RSREG], s16(op));
+ unsigned const shift = ((offset & 3) ^ R4000_ENDIAN_LE_BE(3, 0)) << 3;
+
+ store<u32>(offset & ~3, u32(m_r[RTREG]) >> shift, ~u32(0) >> shift);
+}
+
+void r4000_base_device::cpu_swr(u32 const op)
+{
+ u64 const offset = ADDR(m_r[RSREG], s16(op));
+ unsigned const shift = ((offset & 3) ^ R4000_ENDIAN_LE_BE(0, 3)) << 3;
+
+ store<u32>(offset & ~3, u32(m_r[RTREG]) << shift, ~u32(0) << shift);
+}
+
+void r4000_base_device::cpu_ldl(u32 const op)
+{
+ u64 const offset = ADDR(m_r[RSREG], s16(op));
+ unsigned const shift = ((offset & 7) ^ R4000_ENDIAN_LE_BE(7, 0)) << 3;
+
+ load<u64>(offset & ~7,
+ [this, op, shift](u64 const data)
+ {
+ m_r[RTREG] = (m_r[RTREG] & ~u64(~u64(0) << shift)) | (data << shift);
+ });
+}
+
+void r4000_base_device::cpu_ldr(u32 const op)
+{
+ u64 const offset = ADDR(m_r[RSREG], s16(op));
+ unsigned const shift = ((offset & 7) ^ R4000_ENDIAN_LE_BE(0, 7)) << 3;
+
+ load<u64>(offset & ~7,
+ [this, op, shift](u64 const data)
+ {
+ m_r[RTREG] = (m_r[RTREG] & ~u64(~u64(0) >> shift)) | (data >> shift);
+ });
+}
+
+void r4000_base_device::cpu_sdl(u32 const op)
+{
+ u64 const offset = ADDR(m_r[RSREG], s16(op));
+ unsigned const shift = ((offset & 7) ^ R4000_ENDIAN_LE_BE(7, 0)) << 3;
+
+ store<u64>(offset & ~7, m_r[RTREG] >> shift, ~u64(0) >> shift);
+}
+
+void r4000_base_device::cpu_sdr(u32 const op)
+{
+ u64 const offset = ADDR(m_r[RSREG], s16(op));
+ unsigned const shift = ((offset & 7) ^ R4000_ENDIAN_LE_BE(0, 7)) << 3;
+
+ store<u64>(offset & ~7, m_r[RTREG] << shift, ~u64(0) << shift);
+}
+
+void r4000_base_device::cp0_execute(u32 const op)
+{
+ if ((SR & SR_KSU) && !(SR & SR_CU0) && !(SR & (SR_EXL | SR_ERL)))
+ {
+ cpu_exception(EXCEPTION_CP0);
+ return;
+ }
+
+ switch ((op >> 21) & 0x1f)
+ {
+ case 0x00: // MFC0
+ m_r[RTREG] = s32(cp0_get(RDREG));
+ break;
+ case 0x01: // DMFC0
+ // ε Operation codes marked with epsilon are valid when the
+ // processor is operating either in the Kernel mode or in the
+ // 64-bit non-Kernel (User or Supervisor) mode. These instructions
+ // cause a reserved instruction exception if 64-bit operation is
+ // not enabled in User or Supervisor mode.
+ if (!(SR & SR_KSU) || (SR & (SR_EXL | SR_ERL)) || cp0_64())
+ m_r[RTREG] = cp0_get(RDREG);
+ else
+ cpu_exception(EXCEPTION_RI);
+ break;
+ case 0x02: // CFC0
+ break;
+
+ case 0x04: // MTC0
+ cp0_set(RDREG, s64(s32(m_r[RTREG])));
+ break;
+ case 0x05: // DMTC0
+ // ε Operation codes marked with epsilon are valid when the
+ // processor is operating either in the Kernel mode or in the
+ // 64-bit non-Kernel (User or Supervisor) mode. These instructions
+ // cause a reserved instruction exception if 64-bit operation is
+ // not enabled in User or Supervisor mode.
+ if (!(SR & SR_KSU) || (SR & (SR_EXL | SR_ERL)) || cp0_64())
+ cp0_set(RDREG, m_r[RTREG]);
+ else
+ cpu_exception(EXCEPTION_RI);
+ break;
+ case 0x06: // CTC0
+ break;
+
+ case 0x08: // BC0
+ switch ((op >> 16) & 0x1f)
+ {
+ case 0x00: // BC0F
+ case 0x01: // BC0T
+ case 0x02: // BC0FL
+ case 0x03: // BC0TL
+ // fall through
+
+ default:
+ // γ Operation codes marked with a gamma cause a reserved
+ // instruction exception. They are reserved for future versions
+ // of the architecture.
+ cpu_exception(EXCEPTION_RI);
+ break;
+ }
+ break;
+
+ case 0x10: case 0x11: case 0x12: case 0x13: case 0x14: case 0x15: case 0x16: case 0x17:
+ case 0x18: case 0x19: case 0x1a: case 0x1b: case 0x1c: case 0x1d: case 0x1e: case 0x1f:
+ // CP0 function
+ switch (op & 0x3f)
+ {
+ case 0x01: // TLBR
+ cp0_tlbr();
+ break;
+ case 0x02: // TLBWI
+ cp0_tlbwi(m_cp0[CP0_Index] & 0x3f);
+ break;
+
+ case 0x06: // TLBWR
+ cp0_tlbwr();
+ break;
+
+ case 0x08: // TLBP
+ cp0_tlbp();
+ break;
+
+ case 0x10: // RFE
+ // ξ Operation codes marked with a xi cause a reserved
+ // instruction exception on R4000 processors.
+ cpu_exception(EXCEPTION_RI);
+ break;
+
+ case 0x18: // ERET
+ if (SR & SR_ERL)
+ {
+ logerror("eret from error\n");
+ m_branch_state = EXCEPTION;
+ m_pc = m_cp0[CP0_ErrorEPC];
+ SR &= ~SR_ERL;
+ }
+ else
+ {
+ m_branch_state = EXCEPTION;
+ m_pc = m_cp0[CP0_EPC];
+ SR &= ~SR_EXL;
+ }
+
+ if (m_ll_watch)
+ {
+ m_ll_watch->remove();
+ m_ll_watch = nullptr;
+ }
+ break;
+
+ default:
+ // Φ Operation codes marked with a phi are invalid but do not
+ // cause reserved instruction exceptions in R4000 implementations.
+ break;
+ }
+ break;
+
+ default:
+ // γ Operation codes marked with a gamma cause a reserved
+ // instruction exception. They are reserved for future versions
+ // of the architecture.
+ cpu_exception(EXCEPTION_RI);
+ break;
+ }
+}
+
+u64 r4000_base_device::cp0_get(unsigned const reg)
+{
+ switch (reg)
+ {
+ case CP0_Count:
+ return u32((total_cycles() - m_cp0_timer_zero) / 2);
+
+ case CP0_Random:
+ {
+ u8 const wired = m_cp0[CP0_Wired] & 0x3f;
+
+ if (wired < ARRAY_LENGTH(m_tlb))
+ return ((total_cycles() - m_cp0_timer_zero) % (ARRAY_LENGTH(m_tlb) - wired) + wired) & 0x3f;
+ else
+ return ARRAY_LENGTH(m_tlb) - 1;
+ }
+ break;
+
+ default:
+ return m_cp0[reg];
+ }
+}
+
+void r4000_base_device::cp0_set(unsigned const reg, u64 const data)
+{
+ switch (reg)
+ {
+ case CP0_Count:
+ m_cp0[CP0_Count] = u32(data);
+ m_cp0_timer_zero = total_cycles() - m_cp0[CP0_Count] * 2;
+
+ cp0_update_timer();
+ break;
+
+ case CP0_EntryHi:
+ m_cp0[CP0_EntryHi] = data & (EH_R | EH_VPN2_64 | EH_ASID);
+ break;
+
+ case CP0_Compare:
+ m_cp0[CP0_Compare] = u32(data);
+ CAUSE &= ~CAUSE_IPEX5;
+
+ cp0_update_timer(true);
+ break;
+
+ case CP0_Status:
+ m_cp0[CP0_Status] = u32(data);
+
+ // FIXME: software interrupt check
+ if (CAUSE & SR & SR_IMSW)
+ m_icount = 0;
+
+ if (data & SR_RE)
+ fatalerror("unimplemented reverse endian mode enabled (%s)\n", machine().describe_context().c_str());
+ break;
+
+ case CP0_Cause:
+ CAUSE = (CAUSE & ~CAUSE_IPSW) | (data & CAUSE_IPSW);
+
+ // FIXME: software interrupt check
+ if (CAUSE & SR & SR_IMSW)
+ m_icount = 0;
+ break;
+
+ case CP0_PRId:
+ // read-only register
+ break;
+
+ case CP0_Config:
+ m_cp0[CP0_Config] = (m_cp0[CP0_Config] & ~CONFIG_WM) | (data & CONFIG_WM);
+
+ if (m_cp0[CP0_Config] & CONFIG_IB)
+ {
+ m_icache_line_size = 32;
+ m_icache_shift = 5;
+ m_icache_mask_lo = ~u32(0x1f);
+ }
+ else
+ {
+ m_icache_line_size = 16;
+ m_icache_shift = 4;
+ m_icache_mask_lo = ~u32(0xf);
+ }
+
+ LOGMASKED(LOG_CACHE, "icache/dcache line sizes %d/%d bytes\n",
+ m_icache_line_size, m_cp0[CP0_Config] & CONFIG_DB ? 32 : 16);
+ break;
+
+ default:
+ m_cp0[reg] = data;
+ break;
+ }
+}
+
+void r4000_base_device::cp0_tlbr()
+{
+ u8 const index = m_cp0[CP0_Index] & 0x3f;
+
+ if (index < ARRAY_LENGTH(m_tlb))
+ {
+ tlb_entry_t const &entry = m_tlb[index];
+
+ m_cp0[CP0_PageMask] = entry.mask;
+ m_cp0[CP0_EntryHi] = entry.vpn;
+ m_cp0[CP0_EntryLo0] = entry.pfn[0];
+ m_cp0[CP0_EntryLo1] = entry.pfn[1];
+ }
+}
+
+void r4000_base_device::cp0_tlbwi(u8 const index)
+{
+ if (index < ARRAY_LENGTH(m_tlb))
+ {
+ tlb_entry_t &entry = m_tlb[index];
+
+ entry.mask = m_cp0[CP0_PageMask];
+ entry.vpn = m_cp0[CP0_EntryHi];
+ if ((m_cp0[CP0_EntryLo0] & EL_G) && (m_cp0[CP0_EntryLo1] & EL_G))
+ entry.vpn |= EH_G;
+ entry.pfn[0] = m_cp0[CP0_EntryLo0];
+ entry.pfn[1] = m_cp0[CP0_EntryLo1];
+
+ entry.low_bit = 32 - count_leading_zeros((entry.mask >> 1) | 0xfff);
+
+ LOGMASKED(LOG_TLB, "tlb write index %02d mask 0x%016x vpn2 0x%016x %c asid 0x%02x pfn0 0x%016x %c%c pfn1 0x%016x %c%c (%s)\n",
+ index, entry.mask,
+ entry.vpn, entry.vpn & EH_G ? 'G' : '-', entry.vpn & EH_ASID,
+ entry.pfn[0] & EL_PFN, entry.pfn[0] & EL_D ? 'D' : '-', entry.pfn[0] & EL_V ? 'V' : '-',
+ entry.pfn[1] & EL_PFN, entry.pfn[1] & EL_D ? 'D' : '-', entry.pfn[1] & EL_V ? 'V' : '-',
+ machine().describe_context());
+ }
+}
+
+void r4000_base_device::cp0_tlbwr()
+{
+ u8 const wired = m_cp0[CP0_Wired] & 0x3f;
+ u8 const unwired = ARRAY_LENGTH(m_tlb) - wired;
+
+ u8 const index = (unwired > 0) ? ((total_cycles() - m_cp0_timer_zero) % unwired + wired) & 0x3f : (ARRAY_LENGTH(m_tlb) - 1);
+
+ cp0_tlbwi(index);
+}
+
+void r4000_base_device::cp0_tlbp()
+{
+ m_cp0[CP0_Index] = 0x80000000;
+ for (u8 index = 0; index < ARRAY_LENGTH(m_tlb); index++)
+ {
+ tlb_entry_t const &entry = m_tlb[index];
+
+ u64 const mask = (cp0_64() ? EH_R | (EH_VPN2_64 & ~entry.mask) : (EH_VPN2_32 & ~entry.mask))
+ | ((entry.vpn & EH_G) ? 0 : EH_ASID);
+
+ if ((entry.vpn & mask) == (m_cp0[CP0_EntryHi] & mask))
+ {
+ m_cp0[CP0_Index] = index;
+ break;
+ }
+ }
+
+ if (m_cp0[CP0_Index] == 0x80000000)
+ LOGMASKED(LOG_TLB, "tlbp miss 0x%08x\n", m_cp0[CP0_EntryHi]);
+ else
+ LOGMASKED(LOG_TLB, "tlbp hit 0x%08x index %02d\n", m_cp0[CP0_EntryHi], m_cp0[CP0_Index]);
+}
+
+void r4000_base_device::cp0_update_timer(bool start)
+{
+ if (start || m_cp0_timer->enabled())
+ {
+ u32 const count = (total_cycles() - m_cp0_timer_zero) / 2;
+ u32 const delta = m_cp0[CP0_Compare] - count;
+
+ m_cp0_timer->adjust(cycles_to_attotime(u64(delta) * 2));
+ }
+}
+
+TIMER_CALLBACK_MEMBER(r4000_base_device::cp0_timer_callback)
+{
+ m_cp0[CP0_Cause] |= CAUSE_IPEX5;
+}
+
+bool r4000_base_device::cp0_64() const
+{
+ switch (SR & (SR_KSU | SR_ERL | SR_EXL))
+ {
+ case SR_KSU_U: return bool(SR & SR_UX);
+ case SR_KSU_S: return bool(SR & SR_SX);
+
+ default:
+ return bool(SR & SR_KX);
+ }
+}
+
+void r4000_base_device::cp1_execute(u32 const op)
+{
+ if (!(SR & SR_CU1))
+ {
+ cpu_exception(EXCEPTION_CP1);
+ return;
+ }
+
+ softfloat_exceptionFlags = 0;
+ switch (op >> 26)
+ {
+ case 0x11: // COP1
+ switch ((op >> 21) & 0x1f)
+ {
+ case 0x00: // MFC1
+ if (SR & SR_FR)
+ m_r[RTREG] = s64(s32(m_f[RDREG]));
+ else
+ if (RDREG & 1)
+ // move the high half of the even floating point register
+ m_r[RTREG] = s64(s32(m_f[RDREG & ~1] >> 32));
+ else
+ // move the low half of the even floating point register
+ m_r[RTREG] = s64(s32(m_f[RDREG & ~1] >> 0));
+ break;
+ case 0x01: // DMFC1
+ // TODO: MIPS3 only
+ if ((SR & SR_FR) || !(RDREG & 1))
+ m_r[RTREG] = m_f[RDREG];
+ break;
+ case 0x02: // CFC1
+ switch (RDREG)
+ {
+ case 0: m_r[RTREG] = m_fcr0; break;
+ case 30: m_r[RTREG] = m_fcr30; break;
+ case 31: m_r[RTREG] = m_fcr31; break;
+
+ default:
+ logerror("cfc1 undefined fpu control register %d (%s)\n", RDREG, machine().describe_context());
+ break;
+ }
+ break;
+ case 0x04: // MTC1
+ if (SR & SR_FR)
+ m_f[RDREG] = u32(m_r[RTREG]);
+ else
+ if (RDREG & 1)
+ // load the high half of the even floating point register
+ m_f[RDREG & ~1] = (m_r[RTREG] << 32) | u32(m_f[RDREG & ~1]);
+ else
+ // load the low half of the even floating point register
+ m_f[RDREG & ~1] = (m_f[RDREG & ~1] & ~0xffffffffULL) | u32(m_r[RTREG]);
+ break;
+ case 0x05: // DMTC1
+ // TODO: MIPS3 only
+ if ((SR & SR_FR) || !(RDREG & 1))
+ m_f[RDREG] = m_r[RTREG];
+ break;
+ case 0x06: // CTC1
+ switch (RDREG)
+ {
+ case 0: // register is read-only
+ break;
+
+ case 30: // unknown
+ m_fcr30 = u32(m_r[RTREG]);
+ break;
+
+ case 31:
+ m_fcr31 = u32(m_r[RTREG]);
+
+ // update rounding mode
+ switch (m_fcr31 & FCR31_RM)
+ {
+ case 0: softfloat_roundingMode = softfloat_round_near_even; break;
+ case 1: softfloat_roundingMode = softfloat_round_minMag; break;
+ case 2: softfloat_roundingMode = softfloat_round_max; break;
+ case 3: softfloat_roundingMode = softfloat_round_min; break;
+ }
+
+ // exception check
+ if ((m_fcr31 & FCR31_CE) || ((m_fcr31 & FCR31_CM) >> 5) & (m_fcr31 & FCR31_EM))
+ cpu_exception(EXCEPTION_FPE);
+
+ break;
+
+ default:
+ logerror("ctc1 undefined fpu control register %d (%s)\n", RDREG, machine().describe_context());
+ break;
+ }
+ break;
+ case 0x08: // BC
+ switch ((op >> 16) & 0x1f)
+ {
+ case 0x00: // BC1F
+ if (!(m_fcr31 & FCR31_C))
+ {
+ m_branch_state = BRANCH;
+ m_branch_target = ADDR(m_pc + 4, s32(s16(op)) << 2);
+ }
+ break;
+ case 0x01: // BC1T
+ if (m_fcr31 & FCR31_C)
+ {
+ m_branch_state = BRANCH;
+ m_branch_target = ADDR(m_pc + 4, s32(s16(op)) << 2);
+ }
+ break;
+ case 0x02: // BC1FL
+ if (!(m_fcr31 & FCR31_C))
+ {
+ m_branch_state = BRANCH;
+ m_branch_target = ADDR(m_pc + 4, s32(s16(op)) << 2);
+ }
+ else
+ m_branch_state = NULLIFY;
+ break;
+ case 0x03: // BC1TL
+ if (m_fcr31 & FCR31_C)
+ {
+ m_branch_state = BRANCH;
+ m_branch_target = ADDR(m_pc + 4, s32(s16(op)) << 2);
+ }
+ else
+ m_branch_state = NULLIFY;
+ break;
+
+ default:
+ // reserved instructions
+ cpu_exception(EXCEPTION_RI);
+ break;
+ }
+ break;
+
+ case 0x10: // S
+ switch (op & 0x3f)
+ {
+ case 0x00: // ADD.S
+ if ((SR & SR_FR) || !(op & ODD_REGS))
+ cp1_set(FDREG, f32_add(float32_t{ u32(m_f[FSREG]) }, float32_t{ u32(m_f[FTREG]) }).v);
+ break;
+ case 0x01: // SUB.S
+ if ((SR & SR_FR) || !(op & ODD_REGS))
+ cp1_set(FDREG, f32_sub(float32_t{ u32(m_f[FSREG]) }, float32_t{ u32(m_f[FTREG]) }).v);
+ break;
+ case 0x02: // MUL.S
+ if ((SR & SR_FR) || !(op & ODD_REGS))
+ cp1_set(FDREG, f32_mul(float32_t{ u32(m_f[FSREG]) }, float32_t{ u32(m_f[FTREG]) }).v);
+ break;
+ case 0x03: // DIV.S
+ if ((SR & SR_FR) || !(op & ODD_REGS))
+ cp1_set(FDREG, f32_div(float32_t{ u32(m_f[FSREG]) }, float32_t{ u32(m_f[FTREG]) }).v);
+ break;
+ case 0x04: // SQRT.S
+ if ((SR & SR_FR) || !(op & ODD_REGS))
+ cp1_set(FDREG, f32_sqrt(float32_t{ u32(m_f[FSREG]) }).v);
+ break;
+ case 0x05: // ABS.S
+ if ((SR & SR_FR) || !(op & ODD_REGS))
+ {
+ if (f32_lt(float32_t{ u32(m_f[FSREG]) }, float32_t{ 0 }))
+ cp1_set(FDREG, f32_mul(float32_t{ u32(m_f[FSREG]) }, i32_to_f32(-1)).v);
+ else
+ cp1_set(FDREG, m_f[FSREG]);
+ }
+ break;
+ case 0x06: // MOV.S
+ if ((SR & SR_FR) || !(op & ODD_REGS))
+ m_f[FDREG] = m_f[FSREG];
+ break;
+ case 0x07: // NEG.S
+ if ((SR & SR_FR) || !(op & ODD_REGS))
+ cp1_set(FDREG, f32_mul(float32_t{ u32(m_f[FSREG]) }, i32_to_f32(-1)).v);
+ break;
+ case 0x08: // ROUND.L.S
+ // TODO: MIPS3 only
+ if ((SR & SR_FR) || !(op & ODD_REGS))
+ cp1_set(FDREG, f32_to_i64(float32_t{ u32(m_f[FSREG]) }, softfloat_round_near_even, true));
+ break;
+ case 0x09: // TRUNC.L.S
+ // TODO: MIPS3 only
+ if ((SR & SR_FR) || !(op & ODD_REGS))
+ cp1_set(FDREG, f32_to_i64(float32_t{ u32(m_f[FSREG]) }, softfloat_round_minMag, true));
+ break;
+ case 0x0a: // CEIL.L.S
+ // TODO: MIPS3 only
+ if ((SR & SR_FR) || !(op & ODD_REGS))
+ cp1_set(FDREG, f32_to_i64(float32_t{ u32(m_f[FSREG]) }, softfloat_round_max, true));
+ break;
+ case 0x0b: // FLOOR.L.S
+ // TODO: MIPS3 only
+ if ((SR & SR_FR) || !(op & ODD_REGS))
+ cp1_set(FDREG, f32_to_i64(float32_t{ u32(m_f[FSREG]) }, softfloat_round_min, true));
+ break;
+ case 0x0c: // ROUND.W.S
+ if ((SR & SR_FR) || !(op & ODD_REGS))
+ cp1_set(FDREG, f32_to_i32(float32_t{ u32(m_f[FSREG]) }, softfloat_round_near_even, true));
+ break;
+ case 0x0d: // TRUNC.W.S
+ if ((SR & SR_FR) || !(op & ODD_REGS))
+ cp1_set(FDREG, f32_to_i32(float32_t{ u32(m_f[FSREG]) }, softfloat_round_minMag, true));
+ break;
+ case 0x0e: // CEIL.W.S
+ if ((SR & SR_FR) || !(op & ODD_REGS))
+ cp1_set(FDREG, f32_to_i32(float32_t{ u32(m_f[FSREG]) }, softfloat_round_max, true));
+ break;
+ case 0x0f: // FLOOR.W.S
+ if ((SR & SR_FR) || !(op & ODD_REGS))
+ cp1_set(FDREG, f32_to_i32(float32_t{ u32(m_f[FSREG]) }, softfloat_round_min, true));
+ break;
+
+ case 0x21: // CVT.D.S
+ if ((SR & SR_FR) || !(op & ODD_REGS))
+ cp1_set(FDREG, f32_to_f64(float32_t{ u32(m_f[FSREG]) }).v);
+ break;
+ case 0x24: // CVT.W.S
+ if ((SR & SR_FR) || !(op & ODD_REGS))
+ cp1_set(FDREG, f32_to_i32(float32_t{ u32(m_f[FSREG]) }, softfloat_roundingMode, true));
+ break;
+ case 0x25: // CVT.L.S
+ // TODO: MIPS3 only
+ if ((SR & SR_FR) || !(op & ODD_REGS))
+ cp1_set(FDREG, f32_to_i64(float32_t{ u32(m_f[FSREG]) }, softfloat_roundingMode, true));
+ break;
+
+ case 0x30: // C.F.S (false)
+ if ((SR & SR_FR) || !(op & ODD_REGS))
+ m_fcr31 &= ~FCR31_C;
+ break;
+ case 0x31: // C.UN.S (unordered)
+ if ((SR & SR_FR) || !(op & ODD_REGS))
+ {
+ // detect unordered
+ f32_eq(float32_t{ u32(m_f[FSREG]) }, float32_t{ u32(m_f[FTREG]) });
+ if (softfloat_exceptionFlags & softfloat_flag_invalid)
+ m_fcr31 |= FCR31_C;
+ else
+ m_fcr31 &= ~FCR31_C;
+ }
+ break;
+ case 0x32: // C.EQ.S (equal)
+ if ((SR & SR_FR) || !(op & ODD_REGS))
+ {
+ if (f32_eq(float32_t{ u32(m_f[FSREG]) }, float32_t{ u32(m_f[FTREG]) }))
+ m_fcr31 |= FCR31_C;
+ else
+ m_fcr31 &= ~FCR31_C;
+ }
+ break;
+ case 0x33: // C.UEQ.S (unordered equal)
+ if ((SR & SR_FR) || !(op & ODD_REGS))
+ {
+ if (f32_eq(float32_t{ u32(m_f[FSREG]) }, float32_t{ u32(m_f[FTREG]) }) || (softfloat_exceptionFlags & softfloat_flag_invalid))
+ m_fcr31 |= FCR31_C;
+ else
+ m_fcr31 &= ~FCR31_C;
+ }
+ break;
+ case 0x34: // C.OLT.S (less than)
+ if ((SR & SR_FR) || !(op & ODD_REGS))
+ {
+ if (f32_lt(float32_t{ u32(m_f[FSREG]) }, float32_t{ u32(m_f[FTREG]) }))
+ m_fcr31 |= FCR31_C;
+ else
+ m_fcr31 &= ~FCR31_C;
+ }
+ break;
+ case 0x35: // C.ULT.S (unordered less than)
+ if ((SR & SR_FR) || !(op & ODD_REGS))
+ {
+ if (f32_lt(float32_t{ u32(m_f[FSREG]) }, float32_t{ u32(m_f[FTREG]) }) || (softfloat_exceptionFlags & softfloat_flag_invalid))
+ m_fcr31 |= FCR31_C;
+ else
+ m_fcr31 &= ~FCR31_C;
+ }
+ break;
+ case 0x36: // C.OLE.S (less than or equal)
+ if ((SR & SR_FR) || !(op & ODD_REGS))
+ {
+ if (f32_le(float32_t{ u32(m_f[FSREG]) }, float32_t{ u32(m_f[FTREG]) }))
+ m_fcr31 |= FCR31_C;
+ else
+ m_fcr31 &= ~FCR31_C;
+ }
+ break;
+ case 0x37: // C.ULE.S (unordered less than or equal)
+ if ((SR & SR_FR) || !(op & ODD_REGS))
+ {
+ if (f32_le(float32_t{ u32(m_f[FSREG]) }, float32_t{ u32(m_f[FTREG]) }) || (softfloat_exceptionFlags & softfloat_flag_invalid))
+ m_fcr31 |= FCR31_C;
+ else
+ m_fcr31 &= ~FCR31_C;
+ }
+ break;
+
+ case 0x38: // C.SF.S (signalling false)
+ if ((SR & SR_FR) || !(op & ODD_REGS))
+ {
+ // detect unordered
+ f32_eq(float32_t{ u32(m_f[FSREG]) }, float32_t{ u32(m_f[FTREG]) });
+
+ m_fcr31 &= ~FCR31_C;
+
+ if (softfloat_exceptionFlags & softfloat_flag_invalid)
+ {
+ m_fcr31 |= FCR31_CV;
+ cpu_exception(EXCEPTION_FPE);
+ }
+ }
+ break;
+ case 0x39: // C.NGLE.S (not greater, less than or equal)
+ if ((SR & SR_FR) || !(op & ODD_REGS))
+ {
+ // detect unordered
+ f32_eq(float32_t{ u32(m_f[FSREG]) }, float32_t{ u32(m_f[FTREG]) });
+
+ if (softfloat_exceptionFlags & softfloat_flag_invalid)
+ {
+ m_fcr31 |= FCR31_C | FCR31_CV;
+ cpu_exception(EXCEPTION_FPE);
+ }
+ else
+ m_fcr31 &= ~FCR31_C;
+ }
+ break;
+ case 0x3a: // C.SEQ.S (signalling equal)
+ if ((SR & SR_FR) || !(op & ODD_REGS))
+ {
+ if (f32_eq(float32_t{ u32(m_f[FSREG]) }, float32_t{ u32(m_f[FTREG]) }))
+ m_fcr31 |= FCR31_C;
+ else
+ m_fcr31 &= ~FCR31_C;
+
+ if (softfloat_exceptionFlags & softfloat_flag_invalid)
+ {
+ m_fcr31 |= FCR31_CV;
+ cpu_exception(EXCEPTION_FPE);
+ }
+ }
+ break;
+ case 0x3b: // C.NGL.S (not greater or less than)
+ if ((SR & SR_FR) || !(op & ODD_REGS))
+ {
+ if (f32_eq(float32_t{ u32(m_f[FSREG]) }, float32_t{ u32(m_f[FTREG]) }) || (softfloat_exceptionFlags & softfloat_flag_invalid))
+ m_fcr31 |= FCR31_C;
+ else
+ m_fcr31 &= ~FCR31_C;
+
+ if (softfloat_exceptionFlags & softfloat_flag_invalid)
+ {
+ m_fcr31 |= FCR31_CV;
+ cpu_exception(EXCEPTION_FPE);
+ }
+ }
+ break;
+ case 0x3c: // C.LT.S (less than)
+ if ((SR & SR_FR) || !(op & ODD_REGS))
+ {
+ if (f32_lt(float32_t{ u32(m_f[FSREG]) }, float32_t{ u32(m_f[FTREG]) }))
+ m_fcr31 |= FCR31_C;
+ else
+ m_fcr31 &= ~FCR31_C;
+
+ if (softfloat_exceptionFlags & softfloat_flag_invalid)
+ {
+ m_fcr31 |= FCR31_CV;
+ cpu_exception(EXCEPTION_FPE);
+ }
+ }
+ break;
+ case 0x3d: // C.NGE.S (not greater or equal)
+ if ((SR & SR_FR) || !(op & ODD_REGS))
+ {
+ if (f32_lt(float32_t{ u32(m_f[FSREG]) }, float32_t{ u32(m_f[FTREG]) }) || (softfloat_exceptionFlags & softfloat_flag_invalid))
+ m_fcr31 |= FCR31_C;
+ else
+ m_fcr31 &= ~FCR31_C;
+
+ if (softfloat_exceptionFlags & softfloat_flag_invalid)
+ {
+ m_fcr31 |= FCR31_CV;
+ cpu_exception(EXCEPTION_FPE);
+ }
+ }
+ break;
+ case 0x3e: // C.LE.S (less than or equal)
+ if ((SR & SR_FR) || !(op & ODD_REGS))
+ {
+ if (f32_le(float32_t{ u32(m_f[FSREG]) }, float32_t{ u32(m_f[FTREG]) }))
+ m_fcr31 |= FCR31_C;
+ else
+ m_fcr31 &= ~FCR31_C;
+
+ if (softfloat_exceptionFlags & softfloat_flag_invalid)
+ {
+ m_fcr31 |= FCR31_CV;
+ cpu_exception(EXCEPTION_FPE);
+ }
+ }
+ break;
+ case 0x3f: // C.NGT.S (not greater than)
+ if ((SR & SR_FR) || !(op & ODD_REGS))
+ {
+ if (f32_le(float32_t{ u32(m_f[FSREG]) }, float32_t{ u32(m_f[FTREG]) }) || (softfloat_exceptionFlags & softfloat_flag_invalid))
+ m_fcr31 |= FCR31_C;
+ else
+ m_fcr31 &= ~FCR31_C;
+
+ if (softfloat_exceptionFlags & softfloat_flag_invalid)
+ {
+ m_fcr31 |= FCR31_CV;
+ cpu_exception(EXCEPTION_FPE);
+ }
+ }
+ break;
+
+ default: // unimplemented operations
+ m_fcr31 |= FCR31_CE;
+ cpu_exception(EXCEPTION_FPE);
+ break;
+ }
+ break;
+ case 0x11: // D
+ switch (op & 0x3f)
+ {
+ case 0x00: // ADD.D
+ if ((SR & SR_FR) || !(op & ODD_REGS))
+ cp1_set(FDREG, f64_add(float64_t{ m_f[FSREG] }, float64_t{ m_f[FTREG] }).v);
+ break;
+ case 0x01: // SUB.D
+ if ((SR & SR_FR) || !(op & ODD_REGS))
+ cp1_set(FDREG, f64_sub(float64_t{ m_f[FSREG] }, float64_t{ m_f[FTREG] }).v);
+ break;
+ case 0x02: // MUL.D
+ if ((SR & SR_FR) || !(op & ODD_REGS))
+ cp1_set(FDREG, f64_mul(float64_t{ m_f[FSREG] }, float64_t{ m_f[FTREG] }).v);
+ break;
+ case 0x03: // DIV.D
+ if ((SR & SR_FR) || !(op & ODD_REGS))
+ cp1_set(FDREG, f64_div(float64_t{ m_f[FSREG] }, float64_t{ m_f[FTREG] }).v);
+ break;
+ case 0x04: // SQRT.D
+ if ((SR & SR_FR) || !(op & ODD_REGS))
+ cp1_set(FDREG, f64_sqrt(float64_t{ m_f[FSREG] }).v);
+ break;
+ case 0x05: // ABS.D
+ if ((SR & SR_FR) || !(op & ODD_REGS))
+ {
+ if (f64_lt(float64_t{ m_f[FSREG] }, float64_t{ 0 }))
+ cp1_set(FDREG, f64_mul(float64_t{ m_f[FSREG] }, i32_to_f64(-1)).v);
+ else
+ cp1_set(FDREG, m_f[FSREG]);
+ }
+ break;
+ case 0x06: // MOV.D
+ if ((SR & SR_FR) || !(op & ODD_REGS))
+ m_f[FDREG] = m_f[FSREG];
+ break;
+ case 0x07: // NEG.D
+ if ((SR & SR_FR) || !(op & ODD_REGS))
+ cp1_set(FDREG, f64_mul(float64_t{ m_f[FSREG] }, i32_to_f64(-1)).v);
+ break;
+ case 0x08: // ROUND.L.D
+ // TODO: MIPS3 only
+ if ((SR & SR_FR) || !(op & ODD_REGS))
+ cp1_set(FDREG, f64_to_i64(float64_t{ m_f[FSREG] }, softfloat_round_near_even, true));
+ break;
+ case 0x09: // TRUNC.L.D
+ // TODO: MIPS3 only
+ if ((SR & SR_FR) || !(op & ODD_REGS))
+ cp1_set(FDREG, f64_to_i64(float64_t{ m_f[FSREG] }, softfloat_round_minMag, true));
+ break;
+ case 0x0a: // CEIL.L.D
+ // TODO: MIPS3 only
+ if ((SR & SR_FR) || !(op & ODD_REGS))
+ cp1_set(FDREG, f64_to_i64(float64_t{ m_f[FSREG] }, softfloat_round_max, true));
+ break;
+ case 0x0b: // FLOOR.L.D
+ // TODO: MIPS3 only
+ if ((SR & SR_FR) || !(op & ODD_REGS))
+ cp1_set(FDREG, f64_to_i64(float64_t{ m_f[FSREG] }, softfloat_round_min, true));
+ break;
+ case 0x0c: // ROUND.W.D
+ if ((SR & SR_FR) || !(op & ODD_REGS))
+ cp1_set(FDREG, f64_to_i32(float64_t{ m_f[FSREG] }, softfloat_round_near_even, true));
+ break;
+ case 0x0d: // TRUNC.W.D
+ if ((SR & SR_FR) || !(op & ODD_REGS))
+ cp1_set(FDREG, f64_to_i32(float64_t{ m_f[FSREG] }, softfloat_round_minMag, true));
+ break;
+ case 0x0e: // CEIL.W.D
+ if ((SR & SR_FR) || !(op & ODD_REGS))
+ cp1_set(FDREG, f64_to_i32(float64_t{ m_f[FSREG] }, softfloat_round_max, true));
+ break;
+ case 0x0f: // FLOOR.W.D
+ if ((SR & SR_FR) || !(op & ODD_REGS))
+ cp1_set(FDREG, f64_to_i32(float64_t{ m_f[FSREG] }, softfloat_round_min, true));
+ break;
+
+ case 0x20: // CVT.S.D
+ if ((SR & SR_FR) || !(op & ODD_REGS))
+ cp1_set(FDREG, f64_to_f32(float64_t{ m_f[FSREG] }).v);
+ break;
+ case 0x24: // CVT.W.D
+ if ((SR & SR_FR) || !(op & ODD_REGS))
+ cp1_set(FDREG, f64_to_i32(float64_t{ m_f[FSREG] }, softfloat_roundingMode, true));
+ break;
+ case 0x25: // CVT.L.D
+ // TODO: MIPS3 only
+ if ((SR & SR_FR) || !(op & ODD_REGS))
+ cp1_set(FDREG, f64_to_i64(float64_t{ m_f[FSREG] }, softfloat_roundingMode, true));
+ break;
+
+ case 0x30: // C.F.D (false)
+ if ((SR & SR_FR) || !(op & ODD_REGS))
+ m_fcr31 &= ~FCR31_C;
+ break;
+ case 0x31: // C.UN.D (unordered)
+ if ((SR & SR_FR) || !(op & ODD_REGS))
+ {
+ // detect unordered
+ f64_eq(float64_t{ m_f[FSREG] }, float64_t{ m_f[FTREG] });
+ if (softfloat_exceptionFlags & softfloat_flag_invalid)
+ m_fcr31 |= FCR31_C;
+ else
+ m_fcr31 &= ~FCR31_C;
+ }
+ break;
+ case 0x32: // C.EQ.D (equal)
+ if ((SR & SR_FR) || !(op & ODD_REGS))
+ {
+ if (f64_eq(float64_t{ m_f[FSREG] }, float64_t{ m_f[FTREG] }))
+ m_fcr31 |= FCR31_C;
+ else
+ m_fcr31 &= ~FCR31_C;
+ }
+ break;
+ case 0x33: // C.UEQ.D (unordered equal)
+ if ((SR & SR_FR) || !(op & ODD_REGS))
+ {
+ if (f64_eq(float64_t{ m_f[FSREG] }, float64_t{ m_f[FTREG] }) || (softfloat_exceptionFlags & softfloat_flag_invalid))
+ m_fcr31 |= FCR31_C;
+ else
+ m_fcr31 &= ~FCR31_C;
+ }
+ break;
+ case 0x34: // C.OLT.D (less than)
+ if ((SR & SR_FR) || !(op & ODD_REGS))
+ {
+ if (f64_lt(float64_t{ m_f[FSREG] }, float64_t{ m_f[FTREG] }))
+ m_fcr31 |= FCR31_C;
+ else
+ m_fcr31 &= ~FCR31_C;
+ }
+ break;
+ case 0x35: // C.ULT.D (unordered less than)
+ if ((SR & SR_FR) || !(op & ODD_REGS))
+ {
+ if (f64_lt(float64_t{ m_f[FSREG] }, float64_t{ m_f[FTREG] }) || (softfloat_exceptionFlags & softfloat_flag_invalid))
+ m_fcr31 |= FCR31_C;
+ else
+ m_fcr31 &= ~FCR31_C;
+ }
+ break;
+ case 0x36: // C.OLE.D (less than or equal)
+ if ((SR & SR_FR) || !(op & ODD_REGS))
+ {
+ if (f64_le(float64_t{ m_f[FSREG] }, float64_t{ m_f[FTREG] }))
+ m_fcr31 |= FCR31_C;
+ else
+ m_fcr31 &= ~FCR31_C;
+ }
+ break;
+ case 0x37: // C.ULE.D (unordered less than or equal)
+ if ((SR & SR_FR) || !(op & ODD_REGS))
+ {
+ if (f64_le(float64_t{ m_f[FSREG] }, float64_t{ m_f[FTREG] }) || (softfloat_exceptionFlags & softfloat_flag_invalid))
+ m_fcr31 |= FCR31_C;
+ else
+ m_fcr31 &= ~FCR31_C;
+ }
+ break;
+
+ case 0x38: // C.SF.D (signalling false)
+ if ((SR & SR_FR) || !(op & ODD_REGS))
+ {
+ // detect unordered
+ f64_eq(float64_t{ m_f[FSREG] }, float64_t{ m_f[FTREG] });
+
+ m_fcr31 &= ~FCR31_C;
+
+ if (softfloat_exceptionFlags & softfloat_flag_invalid)
+ {
+ m_fcr31 |= FCR31_CV;
+ cpu_exception(EXCEPTION_FPE);
+ }
+ }
+ break;
+ case 0x39: // C.NGLE.D (not greater, less than or equal)
+ if ((SR & SR_FR) || !(op & ODD_REGS))
+ {
+ // detect unordered
+ f64_eq(float64_t{ m_f[FSREG] }, float64_t{ m_f[FTREG] });
+
+ if (softfloat_exceptionFlags & softfloat_flag_invalid)
+ {
+ m_fcr31 |= FCR31_C | FCR31_CV;
+ cpu_exception(EXCEPTION_FPE);
+ }
+ else
+ m_fcr31 &= ~FCR31_C;
+ }
+ break;
+ case 0x3a: // C.SEQ.D (signalling equal)
+ if ((SR & SR_FR) || !(op & ODD_REGS))
+ {
+ if (f64_eq(float64_t{ m_f[FSREG] }, float64_t{ m_f[FTREG] }))
+ m_fcr31 |= FCR31_C;
+ else
+ m_fcr31 &= ~FCR31_C;
+
+ if (softfloat_exceptionFlags & softfloat_flag_invalid)
+ {
+ m_fcr31 |= FCR31_CV;
+ cpu_exception(EXCEPTION_FPE);
+ }
+ }
+ break;
+ case 0x3b: // C.NGL.D (not greater or less than)
+ if ((SR & SR_FR) || !(op & ODD_REGS))
+ {
+ if (f64_eq(float64_t{ m_f[FSREG] }, float64_t{ m_f[FTREG] }) || (softfloat_exceptionFlags & softfloat_flag_invalid))
+ m_fcr31 |= FCR31_C;
+ else
+ m_fcr31 &= ~FCR31_C;
+
+ if (softfloat_exceptionFlags & softfloat_flag_invalid)
+ {
+ m_fcr31 |= FCR31_CV;
+ cpu_exception(EXCEPTION_FPE);
+ }
+ }
+ break;
+ case 0x3c: // C.LT.D (less than)
+ if ((SR & SR_FR) || !(op & ODD_REGS))
+ {
+ if (f64_lt(float64_t{ m_f[FSREG] }, float64_t{ m_f[FTREG] }))
+ m_fcr31 |= FCR31_C;
+ else
+ m_fcr31 &= ~FCR31_C;
+
+ if (softfloat_exceptionFlags & softfloat_flag_invalid)
+ {
+ m_fcr31 |= FCR31_CV;
+ cpu_exception(EXCEPTION_FPE);
+ }
+ }
+ break;
+ case 0x3d: // C.NGE.D (not greater or equal)
+ if ((SR & SR_FR) || !(op & ODD_REGS))
+ {
+ if (f64_lt(float64_t{ m_f[FSREG] }, float64_t{ m_f[FTREG] }) || (softfloat_exceptionFlags & softfloat_flag_invalid))
+ m_fcr31 |= FCR31_C;
+ else
+ m_fcr31 &= ~FCR31_C;
+
+ if (softfloat_exceptionFlags & softfloat_flag_invalid)
+ {
+ m_fcr31 |= FCR31_CV;
+ cpu_exception(EXCEPTION_FPE);
+ }
+ }
+ break;
+ case 0x3e: // C.LE.D (less than or equal)
+ if ((SR & SR_FR) || !(op & ODD_REGS))
+ {
+ if (f64_le(float64_t{ m_f[FSREG] }, float64_t{ m_f[FTREG] }))
+ m_fcr31 |= FCR31_C;
+ else
+ m_fcr31 &= ~FCR31_C;
+
+ if (softfloat_exceptionFlags & softfloat_flag_invalid)
+ {
+ m_fcr31 |= FCR31_CV;
+ cpu_exception(EXCEPTION_FPE);
+ }
+ }
+ break;
+ case 0x3f: // C.NGT.D (not greater than)
+ if ((SR & SR_FR) || !(op & ODD_REGS))
+ {
+ if (f64_le(float64_t{ m_f[FSREG] }, float64_t{ m_f[FTREG] }) || (softfloat_exceptionFlags & softfloat_flag_invalid))
+ m_fcr31 |= FCR31_C;
+ else
+ m_fcr31 &= ~FCR31_C;
+
+ if (softfloat_exceptionFlags & softfloat_flag_invalid)
+ {
+ m_fcr31 |= FCR31_CV;
+ cpu_exception(EXCEPTION_FPE);
+ }
+ }
+ break;
+
+ default: // unimplemented operations
+ m_fcr31 |= FCR31_CE;
+ cpu_exception(EXCEPTION_FPE);
+ break;
+ }
+ break;
+ case 0x14: // W
+ switch (op & 0x3f)
+ {
+ case 0x20: // CVT.S.W
+ if ((SR & SR_FR) || !(op & ODD_REGS))
+ cp1_set(FDREG, i32_to_f32(s32(m_f[FSREG])).v);
+ break;
+ case 0x21: // CVT.D.W
+ if ((SR & SR_FR) || !(op & ODD_REGS))
+ cp1_set(FDREG, i32_to_f64(s32(m_f[FSREG])).v);
+ break;
+
+ default: // unimplemented operations
+ m_fcr31 |= FCR31_CE;
+ cpu_exception(EXCEPTION_FPE);
+ break;
+ }
+ break;
+ case 0x15: // L
+ // TODO: MIPS3 only
+ switch (op & 0x3f)
+ {
+ case 0x02a00020: // CVT.S.L
+ if ((SR & SR_FR) || !(op & ODD_REGS))
+ cp1_set(FDREG, i64_to_f32(s64(m_f[FSREG])).v);
+ break;
+ case 0x02a00021: // CVT.D.L
+ if ((SR & SR_FR) || !(op & ODD_REGS))
+ cp1_set(FDREG, i64_to_f64(s64(m_f[FSREG])).v);
+ break;
+
+ default: // unimplemented operations
+ m_fcr31 |= FCR31_CE;
+ cpu_exception(EXCEPTION_FPE);
+ break;
+ }
+ break;
+
+ default: // unimplemented operations
+ m_fcr31 |= FCR31_CE;
+ cpu_exception(EXCEPTION_FPE);
+ break;
+ }
+ break;
+
+ case 0x31: // LWC1
+ load<u32>(ADDR(m_r[RSREG], s16(op)),
+ [this, op](u32 data)
+ {
+ if (SR & SR_FR)
+ m_f[RTREG] = data;
+ else
+ if (RTREG & 1)
+ // load the high half of the even floating point register
+ m_f[RTREG & ~1] = (u64(data) << 32) | u32(m_f[RTREG & ~1]);
+ else
+ // load the low half of the even floating point register
+ m_f[RTREG & ~1] = (m_f[RTREG & ~1] & ~0xffffffffULL) | data;
+ });
+ break;
+
+ case 0x35: // LDC1
+ load<u64>(ADDR(m_r[RSREG], s16(op)),
+ [this, op](u64 data)
+ {
+ if ((SR & SR_FR) || !(RTREG & 1))
+ m_f[RTREG] = data;
+ });
+ break;
+
+ case 0x39: // SWC1
+ if (SR & SR_FR)
+ store<u32>(ADDR(m_r[RSREG], s16(op)), u32(m_f[RTREG]));
+ else
+ if (RTREG & 1)
+ // store the high half of the even floating point register
+ store<u32>(ADDR(m_r[RSREG], s16(op)), u32(m_f[RTREG & ~1] >> 32));
+ else
+ // store the low half of the even floating point register
+ store<u32>(ADDR(m_r[RSREG], s16(op)), u32(m_f[RTREG & ~1]));
+ break;
+
+ case 0x3d: // SDC1
+ if ((SR & SR_FR) || !(RTREG & 1))
+ store<u64>(ADDR(m_r[RSREG], s16(op)), m_f[RTREG]);
+ break;
+ }
+}
+
+void r4000_base_device::cp1_set(unsigned const reg, u64 const data)
+{
+ // translate softfloat exception flags to cause register
+ if (softfloat_exceptionFlags)
+ {
+ if (softfloat_exceptionFlags & softfloat_flag_inexact)
+ m_fcr31 |= FCR31_CI;
+ if (softfloat_exceptionFlags & softfloat_flag_underflow)
+ m_fcr31 |= FCR31_CU;
+ if (softfloat_exceptionFlags & softfloat_flag_overflow)
+ m_fcr31 |= FCR31_CO;
+ if (softfloat_exceptionFlags & softfloat_flag_infinite)
+ m_fcr31 |= FCR31_CZ;
+ if (softfloat_exceptionFlags & softfloat_flag_invalid)
+ m_fcr31 |= FCR31_CV;
+
+ // check if exception is enabled
+ if (((m_fcr31 & FCR31_CM) >> 5) & (m_fcr31 & FCR31_EM))
+ {
+ cpu_exception(EXCEPTION_FPE);
+ return;
+ }
+
+ // set flags
+ m_fcr31 |= ((m_fcr31 & FCR31_CM) >> 10);
+ }
+
+ m_f[reg] = data;
+}
+
+void r4000_base_device::cp2_execute(u32 const op)
+{
+ if (!(SR & SR_CU2))
+ {
+ cpu_exception(EXCEPTION_CP2);
+ return;
+ }
+
+ switch (op >> 26)
+ {
+ case 0x12: // COP2
+ switch ((op >> 21) & 0x1f)
+ {
+ case 0x00: // MFC2
+ logerror("mfc2 unimplemented (%s)\n", machine().describe_context());
+ break;
+ case 0x01: // DMFC2
+ // ε Operation codes marked with epsilon are valid when the
+ // processor is operating either in the Kernel mode or in the
+ // 64-bit non-Kernel (User or Supervisor) mode. These instructions
+ // cause a reserved instruction exception if 64-bit operation is
+ // not enabled in User or Supervisor mode.
+ if (!(SR & SR_KSU) || (SR & (SR_EXL | SR_ERL)) || cp0_64())
+ logerror("dmfc2 unimplemented (%s)\n", machine().describe_context());
+ else
+ cpu_exception(EXCEPTION_RI);
+ break;
+ case 0x02: // CFC2
+ logerror("cfc2 unimplemented (%s)\n", machine().describe_context());
+ break;
+
+ case 0x04: // MTC2
+ logerror("mtc2 unimplemented (%s)\n", machine().describe_context());
+ break;
+ case 0x05: // DMTC2
+ // ε Operation codes marked with epsilon are valid when the
+ // processor is operating either in the Kernel mode or in the
+ // 64-bit non-Kernel (User or Supervisor) mode. These instructions
+ // cause a reserved instruction exception if 64-bit operation is
+ // not enabled in User or Supervisor mode.
+ if (!(SR & SR_KSU) || (SR & (SR_EXL | SR_ERL)) || cp0_64())
+ logerror("dmtc2 unimplemented (%s)\n", machine().describe_context());
+ else
+ cpu_exception(EXCEPTION_RI);
+ break;
+ case 0x06: // CTC2
+ logerror("ctc2 unimplemented (%s)\n", machine().describe_context());
+ break;
+
+ case 0x08: // BC2
+ switch ((op >> 16) & 0x1f)
+ {
+ case 0x00: // BC2F
+ case 0x01: // BC2F
+ case 0x02: // BC2FL
+ case 0x03: // BC2TL
+ logerror("bc2 unimplemented (%s)\n", machine().describe_context());
+ break;
+
+ default:
+ // γ Operation codes marked with a gamma cause a reserved
+ // instruction exception. They are reserved for future versions
+ // of the architecture.
+ cpu_exception(EXCEPTION_RI);
+ break;
+ }
+ break;
+
+ case 0x10: case 0x11: case 0x12: case 0x13: case 0x14: case 0x15: case 0x16: case 0x17:
+ case 0x18: case 0x19: case 0x1a: case 0x1b: case 0x1c: case 0x1d: case 0x1e: case 0x1f:
+ // CP2 function
+ logerror("function unimplemented (%s)\n", machine().describe_context());
+ break;
+
+ default:
+ // γ Operation codes marked with a gamma cause a reserved
+ // instruction exception. They are reserved for future versions
+ // of the architecture.
+ cpu_exception(EXCEPTION_RI);
+ break;
+ }
+ break;
+
+ case 0x32: // LWC2
+ logerror("lwc2 unimplemented (%s)\n", machine().describe_context());
+ break;
+
+ case 0x36: // LDC2
+ logerror("ldc2 unimplemented (%s)\n", machine().describe_context());
+ break;
+
+ case 0x3a: // SWC2
+ logerror("swc2 unimplemented (%s)\n", machine().describe_context());
+ break;
+
+ case 0x3e: // SDC2
+ logerror("sdc2 unimplemented (%s)\n", machine().describe_context());
+ break;
+ }
+}
+
+r4000_base_device::translate_t r4000_base_device::translate(int intention, u64 &address)
+{
+ /*
+ * Decode the program address into one of the following ranges depending on
+ * the active status register bits.
+ *
+ * 32-bit modes
+ * user: 0x0000'0000-0x7fff'ffff (useg, mapped)
+ *
+ * super: 0x0000'0000-0x7fff'ffff (suseg, mapped)
+ * 0xc000'0000-0xdfff'ffff (ssseg, mapped)
+ *
+ * kernel: 0x0000'0000-0x7fff'ffff (kuseg, mapped)
+ * 0x8000'0000-0x9fff'ffff (kseg0, unmapped, cached)
+ * 0xa000'0000-0xbfff'ffff (kseg1, unmapped, uncached)
+ * 0xc000'0000-0xdfff'ffff (ksseg, mapped)
+ * 0xe000'0000-0xffff'ffff (kseg3, mapped)
+ *
+ * 64-bit modes
+ * user: 0x0000'0000'0000'0000-0x0000'00ff'ffff'ffff (xuseg, mapped)
+ *
+ * super: 0x0000'0000'0000'0000-0x0000'00ff'ffff'ffff (xsuseg, mapped)
+ * 0x4000'0000'0000'0000-0x4000'00ff'ffff'ffff (xsseg, mapped)
+ * 0xffff'ffff'c000'0000-0xffff'ffff'dfff'ffff (csseg, mapped)
+ *
+ * kernel: 0x0000'0000'0000'0000-0x0000'00ff'ffff'ffff (xkuseg, mapped)
+ * 0x4000'0000'0000'0000-0x4000'00ff'ffff'ffff (xksseg, mapped)
+ * 0x8000'0000'0000'0000-0xbfff'ffff'ffff'ffff (xkphys, unmapped)
+ * 0xc000'0000'0000'0000-0xc000'00ff'7fff'ffff (xkseg, mapped)
+ * 0xffff'ffff'8000'0000-0xffff'ffff'9fff'ffff (ckseg0, unmapped, cached)
+ * 0xffff'ffff'a000'0000-0xffff'ffff'bfff'ffff (ckseg1, unmapped, uncached)
+ * 0xffff'ffff'c000'0000-0xffff'ffff'dfff'ffff (cksseg, mapped)
+ * 0xffff'ffff'e000'0000-0xffff'ffff'ffff'ffff (ckseg3, mapped)
+ */
+
+ bool extended = false;
+
+ switch (SR & (SR_KSU | SR_ERL | SR_EXL))
+ {
+ case SR_KSU_U:
+ // user mode
+ if (SR & SR_UX)
+ {
+ // 64-bit user mode
+ if (address & 0xffff'ff00'0000'0000)
+ return ERROR; // exception
+ else
+ extended = true; // xuseg
+ }
+ else
+ {
+ // 32-bit user mode
+ if (address & 0xffff'ffff'8000'0000)
+ return ERROR; // exception
+ else
+ extended = false; // useg
+ }
+ break;
+
+ case SR_KSU_S:
+ // supervisor mode
+ if (SR & SR_SX)
+ {
+ // 64-bit supervisor mode
+ if (address & 0xffff'ff00'0000'0000)
+ if ((address & 0xffff'ff00'0000'0000) == 0x4000'0000'0000'0000)
+ extended = true; // xsseg
+ else
+ if ((address & 0xffff'ffff'e000'0000) == 0xffff'ffff'c000'0000)
+ extended = true; // csseg
+ else
+ return ERROR; // exception
+ else
+ extended = true; // xsuseg
+ }
+ else
+ {
+ // 32-bit supervisor mode
+ if (address & 0xffff'ffff'8000'0000)
+ if ((address & 0xffff'ffff'e000'0000) == 0xffff'ffff'c000'0000)
+ extended = false; // sseg
+ else
+ return ERROR; // exception
+ else
+ extended = false; // suseg
+ }
+ break;
+
+ case SR_KSU_U | SR_KSU_S:
+ fatalerror("invalid ksu bits 0x%08x (%s)\n", u32(SR), machine().describe_context().c_str());
+ break;
+
+ default:
+ // kernel mode
+ if (SR & SR_KX)
+ {
+ // 64-bit kernel mode
+ if (address & 0xffff'ff00'0000'0000)
+ if ((address & 0xffff'ff00'0000'0000) == 0x4000'0000'0000'0000)
+ extended = true; // xksseg
+ else
+ if ((address & 0xc000'0000'0000'0000) == 0x8000'0000'0000'0000)
+ {
+ address &= 0x0000'000f'ffff'ffff; // xkphys
+
+ // FIXME: caching depends on top three bits
+ return CACHED;
+ }
+ else
+ if ((address & 0xffff'ff00'0000'0000) == 0xc000'0000'0000'0000)
+ if ((address & 0x0000'00ff'8000'0000) == 0x0000'00ff'8000'0000)
+ return ERROR; // exception
+ else
+ extended = true; // xkseg
+ else
+ // FIXME: ckseg0 caching depends on config regiter
+ switch (address & 0xffff'ffff'e000'0000)
+ {
+ case 0xffff'ffff'8000'0000: address &= 0x7fff'ffff; return CACHED; // ckseg0
+ case 0xffff'ffff'a000'0000: address &= 0x1fff'ffff; return UNCACHED; // ckseg1
+ case 0xffff'ffff'c000'0000: extended = true; break; // cksseg
+ case 0xffff'ffff'e000'0000: extended = true; break; // ckseg3
+ default: return ERROR; // exception
+ }
+ else
+ if (SR & SR_ERL)
+ // FIXME: documentation says 2^31, but assume it should be 2^40
+ return UNCACHED; // xkuseg (unmapped, uncached)
+ else
+ extended = true; // xkuseg
+ }
+ else
+ {
+ // 32-bit kernel mode
+ if (address & 0xffff'ffff'8000'0000)
+ switch (address & 0xffff'ffff'e000'0000)
+ {
+ case 0xffff'ffff'8000'0000: address &= 0x7fff'ffff; return CACHED; // kseg0
+ case 0xffff'ffff'a000'0000: address &= 0x1fff'ffff; return UNCACHED; // kseg1
+ case 0xffff'ffff'c000'0000: extended = false; break; // ksseg
+ case 0xffff'ffff'e000'0000: extended = false; break; // kseg3
+ default: return ERROR; // exception
+ }
+ else
+ if (SR & SR_ERL)
+ return UNCACHED; // kuseg (unmapped, uncached)
+ else
+ extended = false; // kuseg
+ }
+ break;
+ }
+
+ // address needs translation, using a combination of VPN2 and ASID
+ u64 const key = (address & (extended ? (EH_R | EH_VPN2_64) : EH_VPN2_32)) | (m_cp0[CP0_EntryHi] & EH_ASID);
+
+ unsigned *mru = m_tlb_mru[intention & TRANSLATE_TYPE_MASK];
+ if (LOG_STATS)
+ m_tlb_scans++;
+
+ bool invalid = false;
+ bool modify = false;
+ for (unsigned i = 0; i < ARRAY_LENGTH(m_tlb); i++)
+ {
+ unsigned const index = mru[i];
+ tlb_entry_t const &entry = m_tlb[index];
+
+ // test vpn and asid
+ u64 const mask = (extended ? EH_R | (EH_VPN2_64 & ~entry.mask) : (EH_VPN2_32 & ~entry.mask))
+ | ((entry.vpn & EH_G) ? 0 : EH_ASID);
+
+ if ((entry.vpn & mask) != (key & mask))
+ continue;
+
+ if (LOG_STATS)
+ m_tlb_loops += i + 1;
+
+ u64 const pfn = entry.pfn[BIT(address, entry.low_bit)];
+
+ // test valid
+ if (!(pfn & EL_V))
+ {
+ invalid = true;
+ break;
+ }
+
+ // test dirty
+ if ((intention & TRANSLATE_WRITE) && !(pfn & EL_D))
+ {
+ modify = true;
+ break;
+ }
+
+ // translate the address
+ address &= (entry.mask >> 1) | 0xfff;
+ address |= ((pfn & EL_PFN) << 6) & ~(entry.mask >> 1);
+
+ // promote the entry in the mru index
+ if (i > 0)
+ std::swap(mru[i - 1], mru[i]);
+
+ return ((pfn & EL_C) == C_2) ? UNCACHED : CACHED;
+ }
+
+ // tlb miss, invalid entry, or a store to a non-dirty entry
+ if (!machine().side_effects_disabled() && !(intention & TRANSLATE_DEBUG_MASK))
+ {
+ if (VERBOSE & LOG_TLB)
+ {
+ char const mode[] = { 'r', 'w', 'x' };
+
+ if (modify)
+ LOGMASKED(LOG_TLB, "tlb modify asid %d address 0x%016x (%s)\n",
+ m_cp0[CP0_EntryHi] & EH_ASID, address, machine().describe_context());
+ else
+ LOGMASKED(LOG_TLB, "tlb miss %c asid %d address 0x%016x (%s)\n",
+ mode[intention & TRANSLATE_TYPE_MASK], m_cp0[CP0_EntryHi] & EH_ASID, address, machine().describe_context());
+ }
+
+ // load tlb exception registers
+ m_cp0[CP0_BadVAddr] = address;
+ m_cp0[CP0_EntryHi] = key;
+ m_cp0[CP0_Context] = (m_cp0[CP0_Context] & CONTEXT_PTEBASE) | ((address >> 9) & CONTEXT_BADVPN2);
+ m_cp0[CP0_XContext] = (m_cp0[CP0_XContext] & XCONTEXT_PTEBASE) | ((address >> 31) & XCONTEXT_R) | ((address >> 9) & XCONTEXT_BADVPN2);
+
+ if (invalid || modify || (SR & SR_EXL))
+ cpu_exception(modify ? EXCEPTION_MOD : (intention & TRANSLATE_WRITE) ? EXCEPTION_TLBS : EXCEPTION_TLBL);
+ else
+ cpu_exception((intention & TRANSLATE_WRITE) ? EXCEPTION_TLBS : EXCEPTION_TLBL, extended ? 0x000 : 0x080);
+ }
+
+ return MISS;
+}
+
+void r4000_base_device::address_error(int intention, u64 const address)
+{
+ if (!machine().side_effects_disabled() && !(intention & TRANSLATE_DEBUG_MASK))
+ {
+ logerror("address_error 0x%016x (%s)\n", address, machine().describe_context());
+
+ // TODO: check this
+ if (!(SR & SR_EXL))
+ m_cp0[CP0_BadVAddr] = address;
+
+ cpu_exception((intention & TRANSLATE_WRITE) ? EXCEPTION_ADES : EXCEPTION_ADEL);
+
+ // address errors shouldn't typically occur, so a breakpoint is handy
+ machine().debug_break();
+ }
+}
+
+template <typename T, typename U> std::enable_if_t<std::is_convertible<U, std::function<void(T)>>::value, bool> r4000_base_device::load(u64 address, U &&apply)
+{
+ // alignment error
+ if (address & (sizeof(T) - 1))
+ {
+ address_error(TRANSLATE_READ, address);
+ return false;
+ }
+
+ translate_t const t = translate(TRANSLATE_READ, address);
+
+ // address error
+ if (t == ERROR)
+ {
+ address_error(TRANSLATE_READ, address);
+
+ return false;
+ }
+
+ // tlb miss
+ if (t == MISS)
+ return false;
+
+ // watchpoint
+ if ((m_cp0[CP0_WatchLo] & WATCHLO_R) && !(SR & SR_EXL))
+ {
+ u64 const watch_address = ((m_cp0[CP0_WatchHi] & WATCHHI_PADDR1) << 32) | (m_cp0[CP0_WatchLo] & WATCHLO_PADDR0);
+
+ if ((address & ~7) == watch_address)
+ {
+ cpu_exception(EXCEPTION_WATCH);
+ return false;
+ }
+ }
+
+ // TODO: cache lookup
+
+ switch (sizeof(T))
+ {
+ case 1: apply(T(space(0).read_byte(address))); break;
+ case 2: apply(T(space(0).read_word(address))); break;
+ case 4: apply(T(space(0).read_dword(address))); break;
+ case 8: apply(T(space(0).read_qword(address))); break;
+ }
+
+ return true;
+}
+
+template <typename T, typename U> std::enable_if_t<std::is_convertible<U, std::function<void(u64, T)>>::value, bool> r4000_base_device::load_linked(u64 address, U &&apply)
+{
+ // alignment error
+ if (address & (sizeof(T) - 1))
+ {
+ address_error(TRANSLATE_READ, address);
+ return false;
+ }
+
+ translate_t const t = translate(TRANSLATE_READ, address);
+
+ // address error
+ if (t == ERROR)
+ {
+ address_error(TRANSLATE_READ, address);
+ return false;
+ }
+
+ // tlb miss
+ if (t == MISS)
+ return false;
+
+ // watchpoint
+ if ((m_cp0[CP0_WatchLo] & WATCHLO_R) && !(SR & SR_EXL))
+ {
+ u64 const watch_address = ((m_cp0[CP0_WatchHi] & WATCHHI_PADDR1) << 32) | (m_cp0[CP0_WatchLo] & WATCHLO_PADDR0);
+
+ if ((address & ~7) == watch_address)
+ {
+ cpu_exception(EXCEPTION_WATCH);
+ return false;
+ }
+ }
+
+ // TODO: cache lookup
+
+ switch (sizeof(T))
+ {
+ case 4: apply(address, T(space(0).read_dword(address))); break;
+ case 8: apply(address, T(space(0).read_qword(address))); break;
+ }
+
+ return true;
+}
+
+template <typename T, typename U> std::enable_if_t<std::is_convertible<U, T>::value, bool> r4000_base_device::store(u64 address, U data, T mem_mask)
+{
+ // alignment error
+ if (address & (sizeof(T) - 1))
+ {
+ address_error(TRANSLATE_READ, address);
+ return false;
+ }
+
+ translate_t const t = translate(TRANSLATE_WRITE, address);
+
+ // address error
+ if (t == ERROR)
+ {
+ address_error(TRANSLATE_WRITE, address);
+ return false;
+ }
+
+ // tlb miss
+ if (t == MISS)
+ return false;
+
+ // watchpoint
+ if ((m_cp0[CP0_WatchLo] & WATCHLO_W) && !(SR & SR_EXL))
+ {
+ u64 const watch_address = ((m_cp0[CP0_WatchHi] & WATCHHI_PADDR1) << 32) | (m_cp0[CP0_WatchLo] & WATCHLO_PADDR0);
+
+ if ((address & ~7) == watch_address)
+ {
+ cpu_exception(EXCEPTION_WATCH);
+ return false;
+ }
+ }
+
+ // TODO: cache lookup
+
+ switch (sizeof(T))
+ {
+ case 1: space(0).write_byte(address, T(data)); break;
+ case 2: space(0).write_word(address, T(data), mem_mask); break;
+ case 4: space(0).write_dword(address, T(data), mem_mask); break;
+ case 8: space(0).write_qword(address, T(data), mem_mask); break;
+ }
+
+ return true;
+}
+
+bool r4000_base_device::fetch(u64 address, std::function<void(u32)> &&apply)
+{
+ u64 const program_address = address;
+
+ // alignment error
+ if (address & 3)
+ {
+ address_error(TRANSLATE_FETCH, address);
+
+ return false;
+ }
+
+ translate_t const t = translate(TRANSLATE_FETCH, address);
+
+ // address error
+ if (t == ERROR)
+ {
+ address_error(TRANSLATE_FETCH, address);
+
+ return false;
+ }
+
+ // tlb miss
+ if (t == MISS)
+ return false;
+
+ if (ICACHE)
+ {
+ if (t == UNCACHED)
+ {
+ apply(space(0).read_dword(address));
+
+ return true;
+ }
+
+ // look up the tag
+ u32 const cache_address = (program_address & m_icache_mask_hi);
+ u32 &tag = m_icache_tag[cache_address >> m_icache_shift];
+
+ // check for cache miss
+ if (!(tag & ICACHE_V) || (tag & ICACHE_PTAG) != (address >> 12))
+ {
+ // cache miss
+ m_icache_misses++;
+
+ // reload the cache line
+ tag = ICACHE_V | (address >> 12);
+ for (unsigned i = 0; i < m_icache_line_size; i += 8)
+ {
+ u64 const data = space(0).read_qword((address & m_icache_mask_lo) | i);
+
+ m_icache_data[(((cache_address & m_icache_mask_lo) | i) >> 2) + 0] = u32(data);
+ m_icache_data[(((cache_address & m_icache_mask_lo) | i) >> 2) + 1] = data >> 32;
+ }
+ }
+ else
+ m_icache_hits++;
+
+ // apply the result
+ apply(m_icache_data[cache_address >> 2]);
+ }
+ else
+ apply(space(0).read_dword(address));
+
+ return true;
+}
+
+std::string r4000_base_device::debug_string(u64 string_pointer, unsigned limit)
+{
+ auto const suppressor(machine().disable_side_effects());
+
+ bool done = false;
+ bool mapped = false;
+ std::string result("");
+
+ while (!done)
+ {
+ done = true;
+ load<u8>(string_pointer++, [limit, &done, &mapped, &result](u8 byte)
+ {
+ mapped = true;
+ if (byte != 0)
+ {
+ result += byte;
+
+ done = result.length() == limit;
+ }
+ });
+ }
+
+ if (!mapped)
+ result.assign("[unmapped]");
+
+ return result;
+}
+
+std::string r4000_base_device::debug_string_array(u64 array_pointer)
+{
+ auto const suppressor(machine().disable_side_effects());
+
+ bool done = false;
+ std::string result("");
+
+ while (!done)
+ {
+ done = true;
+ load<s32>(array_pointer, [this, &done, &result](u64 string_pointer)
+ {
+ if (string_pointer != 0)
+ {
+ if (!result.empty())
+ result += ", ";
+
+ result += '\"' + debug_string(string_pointer) + '\"';
+
+ done = false;
+ }
+ });
+
+ array_pointer += 4;
+ }
+
+ return result;
+}
+
+std::string r4000_base_device::debug_unicode_string(u64 unicode_string_pointer)
+{
+ auto const suppressor(machine().disable_side_effects());
+
+ std::wstring result(L"");
+
+ if (!load<u16>(unicode_string_pointer,
+ [this, unicode_string_pointer, &result](u16 const length)
+ {
+ if (length)
+ if (!load<u32>(unicode_string_pointer + 4,
+ [this, length, &result](s32 buffer)
+ {
+ for (int i = 0; i < length; i += 2)
+ load<u16>(buffer + i, [&result](wchar_t const character) { result += character; });
+ }))
+ result.assign(L"[unmapped]");
+ }))
+ result.assign(L"[unmapped]");
+
+ return utf8_from_wstring(result);
+}
diff --git a/src/devices/cpu/mips/r4000.h b/src/devices/cpu/mips/r4000.h
new file mode 100644
index 00000000000..8c3a1760ba3
--- /dev/null
+++ b/src/devices/cpu/mips/r4000.h
@@ -0,0 +1,463 @@
+// license:BSD-3-Clause
+// copyright-holders:Patrick Mackinlay
+
+#ifndef MAME_CPU_MIPS_R4000_H
+#define MAME_CPU_MIPS_R4000_H
+
+#pragma once
+
+DECLARE_DEVICE_TYPE(R4000, r4000_device)
+DECLARE_DEVICE_TYPE(R4400, r4400_device)
+DECLARE_DEVICE_TYPE(R4600, r4600_device)
+
+class r4000_base_device : public cpu_device
+{
+public:
+ enum config_mask : u32
+ {
+ CONFIG_K0 = 0x00000007, // kseg0 cache coherency
+ CONFIG_CU = 0x00000080, // store conditional cache coherent
+ CONFIG_DB = 0x00000010, // primary d-cache line 32 bytes
+ CONFIG_IB = 0x00000020, // primary i-cache line 32 bytes
+ CONFIG_DC = 0x000001c0, // primary d-cache size
+ CONFIG_IC = 0x00000e00, // primary i-cache size
+ CONFIG_EB = 0x00002000, // sub-block ordering
+ CONFIG_EM = 0x00004000, // parity mode enable
+ CONFIG_BE = 0x00008000, // big endian
+ CONFIG_SM = 0x00010000, // dirty shared disable
+ CONFIG_SC = 0x00020000, // secondary cache absent
+ CONFIG_EW = 0x000c0000, // system port width
+ CONFIG_SW = 0x00100000, // secondary cache port width
+ CONFIG_SS = 0x00200000, // split secondary cache mode
+ CONFIG_SB = 0x00c00000, // secondary cache line size
+ CONFIG_EP = 0x0f000000, // transmit data pattern
+ CONFIG_EC = 0x70000000, // system clock ratio
+ CONFIG_CM = 0x80000000, // master/checker enable
+
+ CONFIG_WM = 0x0000003f, // runtime-writable bits
+ };
+ void set_config(u32 data, u32 mem_mask = ~u32(0))
+ {
+ if (!configured())
+ COMBINE_DATA(&m_cp0[CP0_Config]);
+ }
+
+protected:
+ enum cache_size_t
+ {
+ CACHE_4K = 0,
+ CACHE_8K = 1,
+ CACHE_16K = 2,
+ CACHE_32K = 3,
+ CACHE_64K = 4,
+ CACHE_128K = 5,
+ CACHE_256K = 6,
+ CACHE_512K = 7,
+ };
+ r4000_base_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock, u32 prid, cache_size_t icache_size, cache_size_t dcache_size);
+
+ enum cp0_reg : int
+ {
+ CP0_Index = 0,
+ CP0_Random = 1,
+ CP0_EntryLo0 = 2,
+ CP0_EntryLo1 = 3,
+ CP0_Context = 4,
+ CP0_PageMask = 5,
+ CP0_Wired = 6,
+ CP0_BadVAddr = 8,
+ CP0_Count = 9,
+ CP0_EntryHi = 10,
+ CP0_Compare = 11,
+ CP0_Status = 12,
+ CP0_Cause = 13,
+ CP0_EPC = 14,
+ CP0_PRId = 15,
+ CP0_Config = 16,
+ CP0_LLAddr = 17,
+ CP0_WatchLo = 18,
+ CP0_WatchHi = 19,
+ CP0_XContext = 20,
+ CP0_ECC = 26,
+ CP0_CacheErr = 27,
+ CP0_TagLo = 28,
+ CP0_TagHi = 29,
+ CP0_ErrorEPC = 30,
+ };
+
+ enum cp0_sr_mask : u32
+ {
+ SR_IE = 0x00000001, // interrupt enable
+ SR_EXL = 0x00000002, // exception level
+ SR_ERL = 0x00000004, // error level
+ SR_KSU = 0x00000018, // kernel/supervisor/user mode
+ SR_UX = 0x00000020, // 64-bit addressing user mode
+ SR_SX = 0x00000040, // 64-bit addressing supervisor mode
+ SR_KX = 0x00000080, // 64-bit addressing kernel mode
+ SR_IMSW0 = 0x00000100, // software interrupt 0 enable
+ SR_IMSW1 = 0x00000200, // software interrupt 1 enable
+ SR_IMEX0 = 0x00000400, // external interrupt 0 enable
+ SR_IMEX1 = 0x00000800, // external interrupt 1 enable
+ SR_IMEX2 = 0x00001000, // external interrupt 2 enable
+ SR_IMEX3 = 0x00002000, // external interrupt 3 enable
+ SR_IMEX4 = 0x00004000, // external interrupt 4 enable
+ SR_IMEX5 = 0x00008000, // external interrupt 5 enable
+ SR_DE = 0x00010000, // disable cache parity/ecc exceptions
+ SR_CE = 0x00020000, // cache ecc check enable
+ SR_CH = 0x00040000, // cache hit
+ SR_SR = 0x00100000, // soft reset
+ SR_TS = 0x00200000, // tlb shutdown (read only)
+ SR_BEV = 0x00400000, // bootstrap exception vectors
+ SR_RE = 0x02000000, // reverse endian
+ SR_FR = 0x04000000, // enable additional floating-point registers
+ SU_RP = 0x08000000, // reduced power
+ SR_CU0 = 0x10000000, // coprocessor usable 0
+ SR_CU1 = 0x20000000, // coprocessor usable 1
+ SR_CU2 = 0x40000000, // coprocessor usable 2
+ SR_CU3 = 0x80000000, // coprocessor usable 3
+
+ SR_IMSW = 0x00000300,
+ SR_IM = 0x0000ff00, // interrupt mask
+ SR_DS = 0x01ff0000, // diagnostic status
+ };
+
+ enum cp0_sr_ksu_mode : u32
+ {
+ SR_KSU_K = 0x00000000, // kernel mode
+ SR_KSU_S = 0x00000008, // supervisor mode
+ SR_KSU_U = 0x00000010, // user mode
+ };
+
+ enum cp0_cause_mask : u32
+ {
+ CAUSE_EXCCODE = 0x0000007c, // exception code
+ CAUSE_IPSW0 = 0x00000100, // software interrupt 0 pending
+ CAUSE_IPSW1 = 0x00000200, // software interrupt 1 pending
+ CAUSE_IPEX0 = 0x00000400, // external interrupt 0 pending
+ CAUSE_IPEX1 = 0x00000800, // external interrupt 1 pending
+ CAUSE_IPEX2 = 0x00001000, // external interrupt 2 pending
+ CAUSE_IPEX3 = 0x00002000, // external interrupt 3 pending
+ CAUSE_IPEX4 = 0x00004000, // external interrupt 4 pending
+ CAUSE_IPEX5 = 0x00008000, // external interrupt 5 pending
+ CAUSE_CE = 0x30000000, // coprocessor unit
+ CAUSE_BD = 0x80000000, // branch delay slot
+
+ CAUSE_IPSW = 0x00000300,
+ CAUSE_IPHW = 0x0000fc00,
+ CAUSE_IP = 0x0000ff00,
+ };
+
+ enum cp0_watchlo_mask : u32
+ {
+ WATCHLO_W = 0x00000001, // trap on store
+ WATCHLO_R = 0x00000002, // trap on load
+ WATCHLO_PADDR0 = 0xfffffff8, // physical address bits 31:3
+ };
+ enum cp0_watchhi_mask : u32
+ {
+ WATCHHI_PADDR1 = 0x0000000f, // physical address bits 35:32
+ };
+
+ enum cp0_tlb_mask : u64
+ {
+ TLB_MASK = 0x0000'0000'01ff'e000,
+ };
+ enum cp0_tlb_eh : u64
+ {
+ EH_ASID = 0x0000'0000'0000'00ff, // address space id
+ EH_G = 0x0000'0000'0000'1000, // global (tlb only)
+ EH_VPN2_32 = 0x0000'0000'ffff'e000, // virtual page number (32-bit mode)
+ EH_VPN2_64 = 0x0000'00ff'ffff'e000, // virtual page number (64-bit mode)
+ EH_R = 0xc000'0000'0000'0000, // region (64-bit mode)
+ };
+ enum cp0_tlb_el : u64
+ {
+ EL_G = 0x0000'0000'0000'0001, // global (entrylo only)
+ EL_V = 0x0000'0000'0000'0002, // valid
+ EL_D = 0x0000'0000'0000'0004, // dirty
+ EL_C = 0x0000'0000'0000'0038, // coherency
+ EL_PFN = 0x0000'0000'3fff'ffc0, // page frame number
+ };
+ enum cp0_tlb_el_c : u64
+ {
+ C_0 = 0x00, // reserved
+ C_1 = 0x08, // reserved
+ C_2 = 0x10, // uncached
+ C_3 = 0x18, // cacheable noncoherent (noncoherent)
+ C_4 = 0x20, // cacheable coherent exclusive (exclusive)
+ C_5 = 0x28, // cacheable coherent exclusive on write (sharable)
+ C_6 = 0x30, // cacheable coherent update on write (update)
+ C_7 = 0x38, // reserved
+ };
+
+ enum cp0_context_mask : u64
+ {
+ CONTEXT_PTEBASE = 0xffff'ffff'ff80'0000,
+ CONTEXT_BADVPN2 = 0x0000'0000'007f'fff0,
+ };
+
+ enum cp0_xcontext_mask : u64
+ {
+ XCONTEXT_PTEBASE = 0xffff'fffe'0000'0000, // page table entry base
+ XCONTEXT_R = 0x0000'0001'8000'0000, // region
+ XCONTEXT_BADVPN2 = 0x0000'0000'7fff'fff0, // bad virtual page number / 2
+ };
+
+ enum cp0_pagemask_mask : u32
+ {
+ PAGEMASK = 0x01ff'e000,
+ };
+
+ enum exception_mask : u32
+ {
+ EXCEPTION_INT = 0x00000000, // interrupt
+ EXCEPTION_MOD = 0x00000004, // tlb modification
+ EXCEPTION_TLBL = 0x00000008, // tlb load
+ EXCEPTION_TLBS = 0x0000000c, // tlb store
+ EXCEPTION_ADEL = 0x00000010, // address error load
+ EXCEPTION_ADES = 0x00000014, // address error store
+ EXCEPTION_IBE = 0x00000018, // bus error (instruction fetch)
+ EXCEPTION_DBE = 0x0000001c, // bus error (data reference: load or store)
+ EXCEPTION_SYS = 0x00000020, // syscall
+ EXCEPTION_BP = 0x00000024, // breakpoint
+ EXCEPTION_RI = 0x00000028, // reserved instruction
+ EXCEPTION_CPU = 0x0000002c, // coprocessor unusable
+ EXCEPTION_OV = 0x00000030, // arithmetic overflow
+ EXCEPTION_TR = 0x00000034, // trap
+ EXCEPTION_VCEI = 0x00000038, // virtual coherency exception instruction
+ EXCEPTION_FPE = 0x0000003c, // floating point
+ EXCEPTION_WATCH = 0x0000005c, // reference to watchhi/watchlo address
+ EXCEPTION_VCED = 0x0000007c, // virtual coherency exception data
+
+ EXCEPTION_CP0 = 0x0000002c, // coprocessor 0 unusable
+ EXCEPTION_CP1 = 0x1000002c, // coprocessor 1 unusable
+ EXCEPTION_CP2 = 0x2000002c, // coprocessor 2 unusable
+ EXCEPTION_CP3 = 0x3000002c, // coprocessor 3 unusable
+ };
+
+ enum cp1_fcr31_mask : u32
+ {
+ FCR31_RM = 0x00000003, // rounding mode
+
+ FCR31_FI = 0x00000004, // inexact operation flag
+ FCR31_FU = 0x00000008, // underflow flag
+ FCR31_FO = 0x00000010, // overflow flag
+ FCR31_FZ = 0x00000020, // divide by zero flag
+ FCR31_FV = 0x00000040, // invalid operation flag
+
+ FCR31_EI = 0x00000080, // inexact operation enable
+ FCR31_EU = 0x00000100, // underflow enable
+ FCR31_EO = 0x00000200, // overflow enable
+ FCR31_EZ = 0x00000400, // divide by zero enable
+ FCR31_EV = 0x00000800, // invalid operation enable
+
+ FCR31_CI = 0x00001000, // inexact operation cause
+ FCR31_CU = 0x00002000, // underflow cause
+ FCR31_CO = 0x00004000, // overflow cause
+ FCR31_CZ = 0x00008000, // divide by zero cause
+ FCR31_CV = 0x00010000, // invalid operation cause
+ FCR31_CE = 0x00020000, // unimplemented operation cause
+
+ FCR31_C = 0x00800000, // condition
+ FCR31_FS = 0x01000000, // flush denormalized results
+
+ FCR31_FM = 0x0000007c, // flag mask
+ FCR31_EM = 0x00000f80, // enable mask
+ FCR31_CM = 0x0001f000, // cause mask (except unimplemented)
+ };
+
+ enum mips3_registers : unsigned
+ {
+ MIPS3_R0 = 0,
+ MIPS3_CP0 = 32,
+ MIPS3_F0 = 64,
+
+ MIPS3_PC = 96,
+ MIPS3_HI,
+ MIPS3_LO,
+ MIPS3_FCR30,
+ MIPS3_FCR31,
+ };
+
+ enum cp0_taglo_mask : u32
+ {
+ TAGLO_PTAGLO = 0xffffff00, // physical adddress bits 35:12
+ TAGLO_PSTATE = 0x000000c0, // primary cache state
+ TAGLO_P = 0x00000001, // primary tag even parity
+ };
+ enum icache_mask : u32
+ {
+ ICACHE_PTAG = 0x00ffffff, // physical tag
+ ICACHE_V = 0x01000000, // valid
+ ICACHE_P = 0x02000000, // even parity
+ };
+ enum dcache_mask : u32
+ {
+ DCACHE_PTAG = 0x00ffffff, // physical tag
+ DCACHE_CS = 0x01000000, // primary cache state
+ DCACHE_P = 0x02000000, // even parity for ptag and cs
+ DCACHE_W = 0x02000000, // write-back
+ DCACHE_WP = 0x02000000, // even parity for write-back
+ };
+
+ // device_t overrides
+ virtual void device_start() override;
+ virtual void device_reset() override;
+ virtual void device_stop() override;
+
+ // device_memory_interface overrides
+ virtual space_config_vector memory_space_config() const override;
+ virtual bool memory_translate(int spacenum, int intention, offs_t &address) override;
+
+ // device_disasm_interface overrides
+ virtual std::unique_ptr<util::disasm_interface> create_disassembler() override;
+
+ // device_execute_interface overrides
+ virtual u32 execute_min_cycles() const override { return 1; }
+ virtual u32 execute_max_cycles() const override { return 40; }
+ virtual u32 execute_input_lines() const override { return 6; }
+ virtual void execute_run() override;
+ virtual void execute_set_input(int inputnum, int state) override;
+
+ // cpu implementation
+ void cpu_execute(u32 const op);
+ void cpu_exception(u32 exception, u16 const vector = 0x180);
+ void cpu_lwl(u32 const op);
+ void cpu_lwr(u32 const op);
+ void cpu_ldl(u32 const op);
+ void cpu_ldr(u32 const op);
+ void cpu_swl(u32 const op);
+ void cpu_swr(u32 const op);
+ void cpu_sdl(u32 const op);
+ void cpu_sdr(u32 const op);
+
+ // cp0 implementation
+ void cp0_execute(u32 const op);
+ u64 cp0_get(unsigned const reg);
+ void cp0_set(unsigned const reg, u64 const data);
+ void cp0_tlbr();
+ void cp0_tlbwi(u8 const index);
+ void cp0_tlbwr();
+ void cp0_tlbp();
+
+ // cp0 helpers
+ TIMER_CALLBACK_MEMBER(cp0_timer_callback);
+ void cp0_update_timer(bool start = false);
+ bool cp0_64() const;
+
+ // cp1 implementation
+ void cp1_execute(u32 const op);
+ void cp1_set(unsigned const reg, u64 const data);
+
+ // cp2 implementation
+ void cp2_execute(u32 const op);
+
+ // address and memory handling
+ enum translate_t { ERROR, MISS, UNCACHED, CACHED };
+ translate_t translate(int intention, u64 &address);
+ void address_error(int intention, u64 const address);
+
+ template <typename T, typename U> std::enable_if_t<std::is_convertible<U, std::function<void(T)>>::value, bool> load(u64 program_address, U &&apply);
+ template <typename T, typename U> std::enable_if_t<std::is_convertible<U, std::function<void(u64, T)>>::value, bool> load_linked(u64 program_address, U &&apply);
+ template <typename T, typename U> std::enable_if_t<std::is_convertible<U, T>::value, bool> store(u64 program_address, U data, T mem_mask = ~T(0));
+ bool fetch(u64 address, std::function<void(u32)> &&apply);
+
+ // debugging helpers
+ std::string debug_string(u64 string_pointer, unsigned limit = 0);
+ std::string debug_string_array(u64 array_pointer);
+ std::string debug_unicode_string(u64 unicode_string_pointer);
+
+ // device configuration state
+ address_space_config m_program_config_le;
+ address_space_config m_program_config_be;
+
+ // runtime state
+ int m_icount;
+
+ // cpu state
+ u64 m_pc;
+ u64 m_r[32];
+ u64 m_hi;
+ u64 m_lo;
+ enum branch_state_t : unsigned
+ {
+ NONE = 0,
+ DELAY = 1, // delay slot instruction active
+ BRANCH = 2, // branch instruction active
+ EXCEPTION = 3, // exception triggered
+ NULLIFY = 4, // next instruction nullified
+ }
+ m_branch_state;
+ u64 m_branch_target;
+
+ // cp0 state
+ u64 m_cp0[32];
+ u64 m_cp0_timer_zero;
+ emu_timer *m_cp0_timer;
+ memory_passthrough_handler *m_ll_watch;
+ struct tlb_entry_t
+ {
+ u64 mask;
+ u64 vpn;
+ u64 pfn[2];
+
+ unsigned low_bit;
+ }
+ m_tlb[48];
+ unsigned m_tlb_mru[3][48];
+
+ // cp1 state
+ u64 m_f[32]; // floating point registers
+ u32 m_fcr0; // implementation and revision register
+ u32 m_fcr30; // unknown
+ u32 m_fcr31; // control/status register
+
+ // experimental icache state
+ u32 m_icache_mask_hi;
+ u32 m_icache_mask_lo;
+ unsigned m_icache_line_size;
+ unsigned m_icache_shift;
+ std::unique_ptr<u32[]> m_icache_tag;
+ std::unique_ptr<u32[]> m_icache_data;
+
+ // statistics
+ u64 m_tlb_scans;
+ u64 m_tlb_loops;
+ u64 m_icache_hits;
+ u64 m_icache_misses;
+};
+
+class r4000_device : public r4000_base_device
+{
+public:
+ // NOTE: R4000 chips prior to 3.0 have an xtlb bug
+ r4000_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
+ : r4000_base_device(mconfig, R4000, tag, owner, clock, 0x0430, CACHE_8K, CACHE_8K)
+ {
+ // no secondary cache
+ m_cp0[CP0_Config] |= CONFIG_SC;
+ }
+};
+
+class r4400_device : public r4000_base_device
+{
+public:
+ r4400_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
+ : r4000_base_device(mconfig, R4400, tag, owner, clock, 0x0440, CACHE_16K, CACHE_16K)
+ {
+ // no secondary cache
+ m_cp0[CP0_Config] |= CONFIG_SC;
+ }
+};
+
+class r4600_device : public r4000_base_device
+{
+public:
+ r4600_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
+ : r4000_base_device(mconfig, R4600, tag, owner, clock, 0x2000, CACHE_16K, CACHE_16K)
+ {
+ // no secondary cache
+ m_cp0[CP0_Config] |= CONFIG_SC;
+ }
+};
+#endif // MAME_CPU_MIPS_R4000_H
diff --git a/src/devices/cpu/nec/v5x.cpp b/src/devices/cpu/nec/v5x.cpp
index 533a112a7a4..bed8b42bc73 100644
--- a/src/devices/cpu/nec/v5x.cpp
+++ b/src/devices/cpu/nec/v5x.cpp
@@ -199,8 +199,8 @@ void v53_device::install_peripheral_io()
}
else // uPD71071 mode
space(AS_IO).install_readwrite_handler(base + 0x00, base + 0x0f,
- read8_delegate(FUNC(v5x_dmau_device::read), m_dmau.target()),
- write8_delegate(FUNC(v5x_dmau_device::write), m_dmau.target()), 0xffff);
+ read8sm_delegate(FUNC(v5x_dmau_device::read), m_dmau.target()),
+ write8sm_delegate(FUNC(v5x_dmau_device::write), m_dmau.target()), 0xffff);
}
if (m_OPSEL & OPSEL_IS)
@@ -264,8 +264,8 @@ void v50_device::install_peripheral_io()
u16 const base = ((m_OPHA << 8) | m_DULA) & 0xfffe;
space(AS_IO).install_readwrite_handler(base + 0x00, base + 0x0f,
- read8_delegate(FUNC(v5x_dmau_device::read), m_dmau.target()),
- write8_delegate(FUNC(v5x_dmau_device::write), m_dmau.target()), 0xffff);
+ read8sm_delegate(FUNC(v5x_dmau_device::read), m_dmau.target()),
+ write8sm_delegate(FUNC(v5x_dmau_device::write), m_dmau.target()), 0xffff);
}
if (m_OPSEL & OPSEL_IS)
diff --git a/src/devices/cpu/ns32000/ns32000.cpp b/src/devices/cpu/ns32000/ns32000.cpp
new file mode 100644
index 00000000000..6bf23e28289
--- /dev/null
+++ b/src/devices/cpu/ns32000/ns32000.cpp
@@ -0,0 +1,160 @@
+// license:BSD-3-Clause
+// copyright-holders:Nigel Barnes
+/*****************************************************************************
+*
+* ns32000.cpp
+*
+* NS32000 CPU family
+*
+*****************************************************************************/
+
+#include "emu.h"
+#include "ns32000.h"
+#include "ns32000dasm.h"
+#include "debugger.h"
+
+//**************************************************************************
+// DEVICE INTERFACE
+//**************************************************************************
+
+DEFINE_DEVICE_TYPE(NS32008, ns32008_cpu_device, "ns32008", "National Semiconductor NS32008")
+DEFINE_DEVICE_TYPE(NS32016, ns32016_cpu_device, "ns32016", "National Semiconductor NS32016")
+DEFINE_DEVICE_TYPE(NS32032, ns32032_cpu_device, "ns32032", "National Semiconductor NS32032")
+
+
+//-------------------------------------------------
+// ns32000_cpu_device - constructor
+//-------------------------------------------------
+
+ns32000_cpu_device::ns32000_cpu_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock, int databits, int addrbits)
+ : cpu_device(mconfig, type, tag, owner, clock)
+ , m_program_config("program", ENDIANNESS_LITTLE, databits, addrbits, 0)
+ , m_icount(0)
+{
+}
+
+ns32008_cpu_device::ns32008_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
+ : ns32000_cpu_device(mconfig, NS32008, tag, owner, clock, 8, 24)
+{
+}
+
+ns32016_cpu_device::ns32016_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
+ : ns32000_cpu_device(mconfig, NS32016, tag, owner, clock, 16, 24)
+{
+}
+
+ns32032_cpu_device::ns32032_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
+ : ns32000_cpu_device(mconfig, NS32032, tag, owner, clock, 32, 24)
+{
+}
+
+//-------------------------------------------------
+// device_start - device-specific startup
+//-------------------------------------------------
+
+void ns32000_cpu_device::device_start()
+{
+ set_icountptr(m_icount);
+
+ save_item(NAME(m_pc));
+ save_item(NAME(m_r));
+ save_item(NAME(m_f));
+
+ state_add(STATE_GENPC, "GENPC", m_pc).noshow();
+ state_add(STATE_GENPCBASE, "CURPC", m_pc).noshow();
+
+ // dedicated registers
+ state_add(NS32000_PC, "PC", m_pc);
+ state_add(NS32000_SB, "SB", m_sb);
+ state_add(NS32000_FP, "FP", m_fp);
+ state_add(NS32000_SP1, "SP1", m_sp1);
+ state_add(NS32000_SP0, "SP0", m_sp0);
+ state_add(NS32000_INTBASE, "INTBASE", m_intbase);
+ state_add(NS32000_PSR, "PSR", m_psr);
+ state_add(NS32000_MOD, "MOD", m_mod);
+
+ // general registers
+ for (unsigned i = 0; i < 8; i++)
+ state_add(NS32000_R0 + i, util::string_format("R%d", i).c_str(), m_r[i]);
+
+ // floating point registers
+ //for (unsigned i = 0; i < 8; i++)
+ // state_add(NS32000_R7 + i, util::string_format("F%d", i).c_str(), m_f[i]);
+
+ // set our instruction counter
+ //set_icountptr(m_icount);
+}
+
+//-------------------------------------------------
+// device_reset - device-specific reset
+//-------------------------------------------------
+
+void ns32000_cpu_device::device_reset()
+{
+ m_nmi_line = false;
+ m_irq_line = false;
+
+ m_pc = 0;
+}
+
+//-------------------------------------------------
+// execute_run - execute a timeslice's worth of
+// opcodes
+//-------------------------------------------------
+
+void ns32000_cpu_device::execute_run()
+{
+ while (m_icount > 0)
+ {
+ debugger_instruction_hook(m_pc);
+
+ m_icount--;
+ }
+}
+
+//-------------------------------------------------
+// execute_set_input - act on a changed input/
+// interrupt line
+//-------------------------------------------------
+
+void ns32000_cpu_device::execute_set_input(int inputnum, int state)
+{
+ switch (inputnum)
+ {
+ case INPUT_LINE_NMI:
+ // NMI is edge triggered
+ m_nmi_line = m_nmi_line || (state == ASSERT_LINE);
+ break;
+
+ case INPUT_LINE_IRQ0:
+ // IRQ is line triggered
+ m_irq_line = state == ASSERT_LINE;
+ break;
+ }
+}
+
+//-------------------------------------------------
+// memory_space_config - return the configuration
+// of the specified address space, or nullptr if
+// the space doesn't exist
+//-------------------------------------------------
+
+device_memory_interface::space_config_vector ns32000_cpu_device::memory_space_config() const
+{
+ return space_config_vector{ std::make_pair(AS_PROGRAM, &m_program_config) };
+}
+
+bool ns32000_cpu_device::memory_translate(int spacenum, int intention, offs_t &address)
+{
+ return true;
+}
+
+//-------------------------------------------------
+// disassemble - call the disassembly
+// helper function
+//-------------------------------------------------
+
+std::unique_ptr<util::disasm_interface> ns32000_cpu_device::create_disassembler()
+{
+ return std::make_unique<ns32000_disassembler>();
+}
diff --git a/src/devices/cpu/ns32000/ns32000.h b/src/devices/cpu/ns32000/ns32000.h
new file mode 100644
index 00000000000..7b17cafba99
--- /dev/null
+++ b/src/devices/cpu/ns32000/ns32000.h
@@ -0,0 +1,149 @@
+// license:BSD-3-Clause
+// copyright-holders:Nigel Barnes
+/*****************************************************************************
+*
+* ns32000.h
+*
+* NS32000 CPU family
+*
+*****************************************************************************/
+
+#ifndef MAME_CPU_NS32016_NS32016_H
+#define MAME_CPU_NS32016_NS32016_H
+
+#pragma once
+
+
+/***********************************************************************
+ CONSTANTS
+***********************************************************************/
+
+
+
+/***********************************************************************
+ TYPE DEFINITIONS
+***********************************************************************/
+
+class ns32000_cpu_device : public cpu_device
+{
+public:
+ // construction/destruction
+ ns32000_cpu_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock);
+
+protected:
+ ns32000_cpu_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock, int databits, int addrbits);
+
+ // device-level overrides
+ virtual void device_start() override;
+ virtual void device_reset() override;
+
+ // device_execute_interface overrides
+ virtual u32 execute_min_cycles() const override { return 1; }
+ virtual u32 execute_max_cycles() const override { return 6; }
+ virtual u32 execute_input_lines() const override { return 2; }
+ virtual void execute_run() override;
+ virtual void execute_set_input(int inputnum, int state) override;
+ virtual bool execute_input_edge_triggered(int inputnum) const override { return inputnum == INPUT_LINE_NMI; }
+
+
+ // device_memory_interface overrides
+ virtual space_config_vector memory_space_config() const override;
+ virtual bool memory_translate(int spacenum, int intention, offs_t &address) override;
+
+ // device_disasm_interface overrides
+ virtual std::unique_ptr<util::disasm_interface> create_disassembler() override;
+
+ // addressing modes
+ enum
+ {
+ ADDRESSING_MODE_REGISTER_0 = 0,
+ ADDRESSING_MODE_REGISTER_1,
+ ADDRESSING_MODE_REGISTER_2,
+ ADDRESSING_MODE_REGISTER_3,
+ ADDRESSING_MODE_REGISTER_4,
+ ADDRESSING_MODE_REGISTER_5,
+ ADDRESSING_MODE_REGISTER_6,
+ ADDRESSING_MODE_REGISTER_7,
+ ADDRESSING_MODE_REGISTER_0_RELATIVE,
+ ADDRESSING_MODE_REGISTER_1_RELATIVE,
+ ADDRESSING_MODE_REGISTER_2_RELATIVE,
+ ADDRESSING_MODE_REGISTER_3_RELATIVE,
+ ADDRESSING_MODE_REGISTER_4_RELATIVE,
+ ADDRESSING_MODE_REGISTER_5_RELATIVE,
+ ADDRESSING_MODE_REGISTER_6_RELATIVE,
+ ADDRESSING_MODE_REGISTER_7_RELATIVE,
+ ADDRESSING_MODE_FRAME_MEMORY_RELATIVE,
+ ADDRESSING_MODE_STACK_MEMORY_RELATIVE,
+ ADDRESSING_MODE_STATIC_MEMORY_RELATIVE,
+ ADDRESSING_MODE_RESERVED,
+ ADDRESSING_MODE_IMMEDIATE,
+ ADDRESSING_MODE_ABSOLUTE,
+ ADDRESSING_MODE_EXTERNAL,
+ ADDRESSING_MODE_TOP_OF_STACK,
+ ADDRESSING_MODE_FRAME_MEMORY,
+ ADDRESSING_MODE_STACK_MEMORY,
+ ADDRESSING_MODE_STATIC_MEMORY,
+ ADDRESSING_MODE_PROGRAM_MEMORY,
+ ADDRESSING_MODE_INDEX_BYTES,
+ ADDRESSING_MODE_INDEX_WORDS,
+ ADDRESSING_MODE_INDEX_DOUBLE_WORDS,
+ ADDRESSING_MODE_INDEX_QUAD_WORDS,
+ };
+
+ // registers
+ enum
+ {
+ NS32000_PC = 1,
+ NS32000_SB, NS32000_FP, NS32000_SP1, NS32000_SP0, NS32000_INTBASE, NS32000_PSR, NS32000_MOD,
+ NS32000_R0, NS32000_R1, NS32000_R2, NS32000_R3, NS32000_R4, NS32000_R5, NS32000_R6, NS32000_R7,
+ };
+
+private:
+ // configuration
+ address_space_config m_program_config;
+
+ // emulation state
+ int m_icount;
+
+ u32 m_pc;
+ u32 m_sb;
+ u32 m_fp;
+ u32 m_sp1;
+ u32 m_sp0;
+ u32 m_intbase;
+ u32 m_psr;
+ u32 m_mod;
+ u32 m_r[8];
+ u32 m_f[8];
+
+ u8 m_irq_line;
+ u8 m_nmi_line;
+};
+
+class ns32008_cpu_device : public ns32000_cpu_device
+{
+public:
+ ns32008_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
+};
+
+class ns32016_cpu_device : public ns32000_cpu_device
+{
+public:
+ ns32016_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
+};
+
+class ns32032_cpu_device : public ns32000_cpu_device
+{
+public:
+ ns32032_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
+};
+
+/***********************************************************************
+ DEVICE TYPE DECLARATIONS
+***********************************************************************/
+
+DECLARE_DEVICE_TYPE(NS32008, ns32008_cpu_device)
+DECLARE_DEVICE_TYPE(NS32016, ns32016_cpu_device)
+DECLARE_DEVICE_TYPE(NS32032, ns32032_cpu_device)
+
+#endif // MAME_CPU_NS32016_NS32016_H
diff --git a/src/devices/cpu/ns32000/ns32000dasm.cpp b/src/devices/cpu/ns32000/ns32000dasm.cpp
new file mode 100644
index 00000000000..8bc25f48c60
--- /dev/null
+++ b/src/devices/cpu/ns32000/ns32000dasm.cpp
@@ -0,0 +1,835 @@
+// license:BSD-3-Clause
+// copyright-holders:Nigel Barnes
+/*****************************************************************************
+*
+* ns32000dasm.cpp
+*
+* NS32000 CPU Disassembly
+*
+*****************************************************************************/
+
+#include "emu.h"
+#include "ns32000dasm.h"
+
+// instruction field extraction
+#define Format0cond(x) ((x >> 4) & 0x0f)
+
+#define Format1op(x) ((x >> 4) & 0x0f)
+
+#define Format2i(x) ((x >> 0) & 0x03)
+#define Format2op(x) ((x >> 4) & 0x07)
+#define Format2short(x) ((x >> 7) & 0x0f)
+#define Format2gen(x) ((x >> 11) & 0x1f)
+
+#define Format3i(x) ((x >> 0) & 0x03)
+#define Format3op(x) ((x >> 7) & 0x0f)
+#define Format3gen(x) ((x >> 11) & 0x1f)
+
+#define Format4i(x) ((x >> 0) & 0x03)
+#define Format4op(x) ((x >> 2) & 0x0f)
+#define Format4gen2(x) ((x >> 6) & 0x1f)
+#define Format4gen1(x) ((x >> 11) & 0x1f)
+
+#define Format5i(x) ((x >> 8) & 0x03)
+#define Format5op(x) ((x >> 10) & 0x07)
+#define Format5short(x) ((x >> 15) & 0x0f)
+
+#define Format6i(x) ((x >> 8) & 0x03)
+#define Format6op(x) ((x >> 10) & 0x0f)
+#define Format6gen2(x) ((x >> 14) & 0x1f)
+#define Format6gen1(x) ((x >> 19) & 0x1f)
+
+#define Format7i(x) ((x >> 8) & 0x03)
+#define Format7op(x) ((x >> 10) & 0x0f)
+#define Format7gen2(x) ((x >> 14) & 0x1f)
+#define Format7gen1(x) ((x >> 19) & 0x1f)
+
+#define Format8i(x) ((x >> 8) & 0x03)
+#define Format8op(x) (((x >> 8) & 0x04) | ((x >> 6) & 0x03))
+#define Format8reg(x) ((x >> 11) & 0x07)
+#define Format8gen2(x) ((x >> 14) & 0x1f)
+#define Format8gen1(x) ((x >> 19) & 0x1f)
+
+#define Format9i(x) ((x >> 8) & 0x03)
+#define Format9f(x) ((x >> 10) & 0x01)
+#define Format9op(x) ((x >> 11) & 0x07)
+#define Format9gen2(x) ((x >> 14) & 0x1f)
+#define Format9gen1(x) ((x >> 19) & 0x1f)
+
+#define Format11f(x) ((x >> 8) & 0x01)
+#define Format11op(x) ((x >> 10) & 0x0f)
+#define Format11gen2(x) ((x >> 14) & 0x1f)
+#define Format11gen1(x) ((x >> 19) & 0x1f)
+
+#define Format14i(x) ((x >> 8) & 0x01)
+#define Format14op(x) ((x >> 10) & 0x0f)
+#define Format14short(x) ((x >> 15) & 0x1f)
+#define Format14gen1(x) ((x >> 19) & 0x1f)
+
+// instructions
+const ns32000_disassembler::NS32000_OPCODE ns32000_disassembler::format0_op[1] =
+{
+ { "Bcond", DISP, 0, 0, 0, 0 }
+};
+const ns32000_disassembler::NS32000_OPCODE ns32000_disassembler::format1_op[16] =
+{
+ { "BSR", DISP, 0, 0, 0, STEP_OVER },
+ { "RET", DISP, 0, 0, 0, STEP_OUT },
+ { "CXP", DISP, 0, 0, 0, STEP_OVER },
+ { "RXP", DISP, 0, 0, 0, STEP_OUT },
+ { "RETT", 0, 0, 0, 0, STEP_OUT },
+ { "RETI", DISP, 0, 0, 0, STEP_OUT },
+ { "SAVE", IMM, 0, 0, 0, 0 },
+ { "RESTORE", IMM, 0, 0, 0, 0 },
+ { "ENTER", IMM, DISP, 0, 0, 0 },
+ { "EXIT", IMM, 0, 0, 0, 0 },
+ { "NOP", 0, 0, 0, 0, 0 },
+ { "WAIT", 0, 0, 0, 0, 0 },
+ { "DIA", 0, 0, 0, 0, 0 },
+ { "FLAG", 0, 0, 0, 0, 0 },
+ { "SVC", 0, 0, 0, 0, 0 },
+ { "BPT", 0, 0, 0, 0, 0 },
+};
+const ns32000_disassembler::NS32000_OPCODE ns32000_disassembler::format2_op[8] =
+{
+ { "ADDQi", QUICK, GEN | RMW | I, 0, 0, 0 },
+ { "CMPQi", QUICK, GEN | READ | I, 0, 0, 0 },
+ { "SPRi", SHORT, GEN | WRITE | I, 0, 0, 0 },
+ { "Scondi", GEN | WRITE | I, 0, 0, 0, 0 },
+ { "ACBi", QUICK, GEN | RMW | I, DISP, 0, 0 },
+ { "MOVQi", QUICK, GEN | WRITE | I, 0, 0, 0 },
+ { "LPRi", SHORT, GEN | READ | I, 0, 0, 0 },
+ { "Trap (UND)", 0, 0, 0, 0, 0 },
+};
+const ns32000_disassembler::NS32000_OPCODE ns32000_disassembler::format3_op[16] =
+{
+ { "CXPD", GEN | ADDR, 0, 0, 0, STEP_OVER },
+ { "Trap (UND)", 0, 0, 0, 0, 0 },
+ { "BICPSRi", GEN | READ | I, 0, 0, 0, 0 },
+ { "Trap (UND)", 0, 0, 0, 0, 0 },
+ { "JUMP", GEN | ADDR, 0, 0, 0, 0 },
+ { "Trap (UND)", 0, 0, 0, 0, 0 },
+ { "BISPSRB", GEN | READ | B, 0, 0, 0, 0 },
+ { "Trap (UND)", 0, 0, 0, 0, 0 },
+ { "Trap (UND)", 0, 0, 0, 0, 0 },
+ { "Trap (UND)", 0, 0, 0, 0, 0 },
+ { "ADJSPi", GEN | READ | I, 0, 0, 0, 0 },
+ { "Trap (UND)", 0, 0, 0, 0, 0 },
+ { "JSR", GEN | ADDR, 0, 0, 0, STEP_OVER },
+ { "Trap (UND)", 0, 0, 0, 0, 0 },
+ { "CASEi", GEN | READ | I, 0, 0, 0, 0 },
+ { "Trap (UND)", 0, 0, 0, 0, 0 },
+};
+const ns32000_disassembler::NS32000_OPCODE ns32000_disassembler::format4_op[16] =
+{
+ { "ADDi", GEN | READ | I, GEN | RMW | I, 0, 0, 0 },
+ { "CMPi", GEN | READ | I, GEN | READ | I, 0, 0, 0 },
+ { "BICi", GEN | READ | I, GEN | RMW | I, 0, 0, 0 },
+ { "Trap (UND)", 0, 0, 0, 0, 0 },
+ { "ADDCi", GEN | READ | I, GEN | RMW | I, 0, 0, 0 },
+ { "MOVi", GEN | READ | I, GEN | WRITE | I, 0, 0, 0 },
+ { "ORi", GEN | READ | I, GEN | RMW | I, 0, 0, 0 },
+ { "Trap (UND)", 0, 0, 0, 0, 0 },
+ { "SUBi", GEN | READ | I, GEN | RMW | I, 0, 0, 0 },
+ { "ADDR", GEN | ADDR, GEN | WRITE | D, 0, 0, 0 },
+ { "ANDi", GEN | READ | I, GEN | RMW | I, 0, 0, 0 },
+ { "Trap (UND)", 0, 0, 0, 0, 0 },
+ { "SUBCi", GEN | READ | I, GEN | RMW | I, 0, 0, 0 },
+ { "TBITi", GEN | READ | I, GEN | REGADDR, 0, 0, 0 },
+ { "XORi", GEN | READ | I, GEN | RMW | I, 0, 0, 0 },
+ { "Trap (UND)", 0, 0, 0, 0, 0 },
+};
+const ns32000_disassembler::NS32000_OPCODE ns32000_disassembler::format5_op[16] =
+{
+ { "MOVSi", OPTIONS, 0, 0, 0, 0 },
+ { "CMPSi", OPTIONS, 0, 0, 0, 0 },
+ { "SETCFG", SHORT, 0, 0, 0, 0 },
+ { "SKPSi", OPTIONS, 0, 0, 0, 0 },
+ { "Trap (UND)", 0, 0, 0, 0, 0 },
+ { "Trap (UND)", 0, 0, 0, 0, 0 },
+ { "Trap (UND)", 0, 0, 0, 0, 0 },
+ { "Trap (UND)", 0, 0, 0, 0, 0 },
+ { "Trap (UND)", 0, 0, 0, 0, 0 },
+ { "Trap (UND)", 0, 0, 0, 0, 0 },
+ { "Trap (UND)", 0, 0, 0, 0, 0 },
+ { "Trap (UND)", 0, 0, 0, 0, 0 },
+ { "Trap (UND)", 0, 0, 0, 0, 0 },
+ { "Trap (UND)", 0, 0, 0, 0, 0 },
+ { "Trap (UND)", 0, 0, 0, 0, 0 },
+ { "Trap (UND)", 0, 0, 0, 0, 0 },
+};
+const ns32000_disassembler::NS32000_OPCODE ns32000_disassembler::format6_op[16] =
+{
+ { "ROTi", GEN | READ | B, GEN | RMW | I, 0, 0, 0 },
+ { "ASHi", GEN | READ | B, GEN | RMW | I, 0, 0, 0 },
+ { "CBITi", GEN | READ | I, GEN | REGADDR, 0, 0, 0 },
+ { "CBITIi", GEN | READ | I, GEN | REGADDR, 0, 0, 0 },
+ { "Trap (UND)", 0, 0, 0, 0, 0 },
+ { "LSHi", GEN | READ | B, GEN | RMW | I, 0, 0, 0 },
+ { "SBITi", GEN | READ | I, GEN | REGADDR, 0, 0, 0 },
+ { "SBITIi", GEN | READ | I, GEN | REGADDR, 0, 0, 0 },
+ { "NEGi", GEN | READ | I, GEN | WRITE | I, 0, 0, 0 },
+ { "NOTi", GEN | READ | I, GEN | WRITE | I, 0, 0, 0 },
+ { "Trap (UND)", 0, 0, 0, 0, 0 },
+ { "SUBPi", GEN | READ | I, GEN | RMW | I, 0, 0, 0 },
+ { "ABSi", GEN | READ | I, GEN | READ | I, 0, 0, 0 },
+ { "COM", GEN | READ | I, GEN | WRITE | I, 0, 0, 0 },
+ { "IBITi", GEN | READ | I, GEN | REGADDR, 0, 0, 0 },
+ { "ADDPi", GEN | READ | I, GEN | RMW | I, 0, 0, 0 },
+};
+const ns32000_disassembler::NS32000_OPCODE ns32000_disassembler::format7_op[16] =
+{
+ { "MOVMi", GEN | ADDR, GEN | ADDR, DISP, 0, 0 },
+ { "CMPMi", GEN | ADDR, GEN | ADDR, DISP, 0, 0 },
+ { "INSSi", GEN | READ | I, GEN | REGADDR, IMM, 0, 0 },
+ { "EXTSi", GEN | REGADDR, GEN | WRITE | I, IMM, 0, 0 },
+ { "MOVXBW", GEN | READ | B, GEN | WRITE | W, 0, 0, 0 },
+ { "MOVZBW", GEN | READ | B, GEN | WRITE | W, 0, 0, 0 },
+ { "MOVZiD", GEN | READ | I, GEN | WRITE | D, 0, 0, 0 },
+ { "MOVXiD", GEN | READ | I, GEN | WRITE | D, 0, 0, 0 },
+ { "MULi", GEN | READ | I, GEN | RMW | I, 0, 0, 0 },
+ { "MEIi", GEN | READ | I, GEN | RMW | I2, 0, 0, 0 },
+ { "Trap (UND)", 0, 0, 0, 0, 0 },
+ { "DEIi", GEN | READ | I, GEN | RMW | I2, 0, 0, 0 },
+ { "QUOi", GEN | READ | I, GEN | RMW | I, 0, 0, 0 },
+ { "REMi", GEN | READ | I, GEN | RMW | I, 0, 0, 0 },
+ { "MODi", GEN | READ | I, GEN | RMW | I, 0, 0, 0 },
+ { "DIVi", GEN | READ | I, GEN | RMW | I, 0, 0, 0 },
+};
+const ns32000_disassembler::NS32000_OPCODE ns32000_disassembler::format8_op[] =
+{
+ { "EXTi", REG, GEN | REGADDR, GEN | WRITE | I, DISP, 0 },
+ { "CVTP", REG, GEN | ADDR, GEN | WRITE | D, 0, 0 },
+ { "INSi", REG, GEN | READ | I, GEN | REGADDR, DISP, 0 },
+ { "CHECKi", REG, GEN | ADDR, GEN | READ | I, 0, 0 },
+ { "INDEXi", REG, GEN | READ | I, GEN | READ | I, 0, 0 },
+ { "FFSi", GEN | READ | I, GEN | RMW | B, 0, 0, 0 },
+ { "MOVSUi", GEN | ADDR, GEN | ADDR, 0, 0, 0 },
+ { "MOVUSi", GEN | ADDR, GEN | ADDR, 0, 0, 0 }
+};
+const ns32000_disassembler::NS32000_OPCODE ns32000_disassembler::format9_op[] =
+{
+ { "MOVif", GEN | READ | I, GEN | WRITE | F, 0, 0, 0 },
+ { "LFSR", GEN | READ | D, 0, 0, 0, 0 },
+ { "MOVLF", GEN | READ | L, GEN | WRITE | F, 0, 0, 0 },
+ { "MOVFL", GEN | READ | F, GEN | WRITE | L, 0, 0, 0 },
+ { "ROUNDfi", GEN | READ | F, GEN | WRITE | I, 0, 0, 0 },
+ { "TRUNCfi", GEN | READ | F, GEN | WRITE | I, 0, 0, 0 },
+ { "SFSR", GEN | WRITE | D, 0, 0, 0, 0 },
+ { "FLOORfi", GEN | READ | F, GEN | WRITE | I, 0, 0, 0 },
+};
+const ns32000_disassembler::NS32000_OPCODE ns32000_disassembler::format11_op[] =
+{
+ { "ADDf", GEN | READ | F, GEN | RMW | F, 0, 0, 0 },
+ { "MOVf", GEN | READ | F, GEN | WRITE | F, 0, 0, 0 },
+ { "CMPf", GEN | READ | F, GEN | READ | F, 0, 0, 0 }, // POLYf
+ { "Trap (SLAVE)", 0, 0, 0, 0, 0 }, // DOTf
+ { "SUBf", GEN | READ | F, GEN | RMW | F, 0, 0, 0 }, // SCALBf
+ { "NEGf", GEN | READ | F, GEN | WRITE | F, 0, 0, 0 }, // LOGBf
+ { "Trap (UND)", 0, 0, 0, 0, 0 },
+ { "Trap (UND)", 0, 0, 0, 0, 0 },
+ { "DIVf", GEN | READ | F, GEN | RMW | F, 0, 0, 0 },
+ { "Trap (SLAVE)", 0, 0, 0, 0, 0 },
+ { "Trap (UND)", 0, 0, 0, 0, 0 },
+ { "Trap (UND)", 0, 0, 0, 0, 0 },
+ { "MULf", GEN | READ | F, GEN | RMW | F, 0, 0, 0 },
+ { "ABSf", GEN | READ | F, GEN | READ | F, 0, 0, 0 },
+ { "Trap (UND)", 0, 0, 0, 0, 0 },
+ { "Trap (UND)", 0, 0, 0, 0, 0 },
+};
+const ns32000_disassembler::NS32000_OPCODE ns32000_disassembler::format14_op[] =
+{
+ { "RDVAL", GEN | ADDR, 0, 0, 0, 0 },
+ { "WRVAL", GEN | ADDR, 0, 0, 0, 0 },
+ { "LMR", SHORT, GEN | READ | D, 0, 0, 0 },
+ { "SMR", SHORT, GEN | WRITE | D, 0, 0, 0 },
+ { "Trap (UND)", 0, 0, 0, 0, 0 },
+ { "Trap (UND)", 0, 0, 0, 0, 0 },
+ { "Trap (UND)", 0, 0, 0, 0, 0 },
+ { "Trap (UND)", 0, 0, 0, 0, 0 },
+ { "Trap (UND)", 0, 0, 0, 0, 0 },
+ { "Trap (UND)", 0, 0, 0, 0, 0 }, // CINV
+ { "Trap (UND)", 0, 0, 0, 0, 0 },
+ { "Trap (UND)", 0, 0, 0, 0, 0 },
+ { "Trap (UND)", 0, 0, 0, 0, 0 },
+ { "Trap (UND)", 0, 0, 0, 0, 0 },
+ { "Trap (UND)", 0, 0, 0, 0, 0 },
+ { "Trap (UND)", 0, 0, 0, 0, 0 },
+};
+
+
+const char *const ns32000_disassembler::Format0[] =
+{
+ "Bcond"
+};
+const char *const ns32000_disassembler::Format1[] =
+{
+ "BSR", "RET", "CXP", "RXP", "RETT", "RETI", "SAVE", "RESTORE", "ENTER", "EXIT", "NOP", "WAIT", "DIA", "FLAG", "SVC", "BPT"
+};
+const char *const ns32000_disassembler::Format2[] =
+{
+ "ADDQi", "CMPQi", "SPRi", "Scondi", "ACBi", "MOVQi", "LPRi"
+};
+const char *const ns32000_disassembler::Format3[] =
+{
+ "CXPD", "Trap (UND)", "BICPSR", "Trap (UND)", "JUMP", "Trap (UND)", "BISPSR", "Trap (UND)", "Trap (UND)", "Trap (UND)", "ADJSPi", "Trap (UND)", "JSR", "Trap (UND)", "CASEi", "Trap (UND)"
+};
+const char *const ns32000_disassembler::Format4[] =
+{
+ "ADDi", "CMPi", "BICi", "Trap (UND)", "ADDCi", "MOVi", "ORi", "Trap (UND)", "SUBi", "ADDR", "ANDi", "Trap (UND)", "SUBCi", "TBITi", "XORi", "Trap (UND)"
+};
+const char *const ns32000_disassembler::Format5[] =
+{
+ "MOVSi", "CMPSi", "SETCFG", "SKPSi", "Trap (UND)", "Trap (UND)", "Trap (UND)", "Trap (UND)", "Trap (UND)", "Trap (UND)", "Trap (UND)", "Trap (UND)", "Trap (UND)", "Trap (UND)", "Trap (UND)", "Trap (UND)"
+};
+const char *const ns32000_disassembler::Format6[] =
+{
+ "ROTi", "ASHi", "CBITi", "CBITIi", "Trap (UND)", "LSHi", "SBITi", "SBITIi", "NEGi", "NOTi", "Trap (UND)", "SUBPi", "ABSi", "COM", "IBITi", "ADDPi"
+};
+const char *const ns32000_disassembler::Format7[] =
+{
+ "MOVMi", "CMPMi", "INSSi", "EXTSi", "MOVXBW", "MOVZBW", "MOVZiD", "MOVXiD", "MULi", "MEIi", "Trap (UND)", "DEIi", "QUOi", "REMi", "MODi", "DIVi"
+};
+const char *const ns32000_disassembler::Format8[] =
+{
+ "EXTi", "CVTP", "INSi", "CHECKi", "INDEXi", "FFSi", "MOVSUi", "MOVUSi"
+};
+const char *const ns32000_disassembler::Format9[] =
+{
+ "MOVif", "LFSR", "MOVLF", "MOVFL", "ROUNDfi", "TRUNCfi", "SFSR", "FLOORfi"
+};
+const char *const ns32000_disassembler::Format11[] =
+{
+ "ADDf", "MOVf", "CMPf", "Trap (SLAVE)", "SUBf", "NEGf", "Trap (UND)", "Trap (UND)", "DIVf", "Trap (SLAVE)", "Trap (UND)", "Trap (UND)", "MULf", "ABSf", "Trap (UND)", "Trap (UND)"
+};
+const char *const ns32000_disassembler::Format14[] =
+{
+ "RDVAL", "WRVAL", "LMR", "SMR", "Trap (UND)", "Trap (UND)", "Trap (UND)", "Trap (UND)", "Trap (UND)", "Trap (UND)", "Trap (UND)", "Trap (UND)", "Trap (UND)", "Trap (UND)", "Trap (UND)", "Trap (UND)"
+};
+
+// types
+const char *const ns32000_disassembler::iType[] =
+{
+ "B", "W", " ", "D"
+};
+const char *const ns32000_disassembler::fType[] =
+{
+ "L", "F"
+};
+const char *const ns32000_disassembler::cType[] =
+{
+ "Q", "D"
+};
+
+// index byte sizes
+const char *const ns32000_disassembler::indexSize[] =
+{
+ "B", "W", "D", "Q"
+};
+
+// short codes
+const char *const ns32000_disassembler::cond[] =
+{
+ "EQ", "NE", "CS", "CC", "HI", "LS", "GT", "LE", "FS", "FC", "LO", "HS", "LT", "GE", "R", "N"
+};
+const char *const ns32000_disassembler::areg[] =
+{
+ "US", "(reserved)", "(reserved)", "(reserved)", "(reserved)", "(reserved)", "(reserved)", "(reserved)", "FP", "SP", "SB", "(reserved)", "(reserved)", "PSR", "INTBASE", "MOD"
+};
+const char *const ns32000_disassembler::mreg[] =
+{
+ "BPR0", "BPR1", "(reserved)", "(reserved)", "(reserved)", "(reserved)", "(reserved)", "(reserved)", "(reserved)", "(reserved)", "MSR", "BCNT", "PTB0", "PTB1", "(reserved)", "EIA"
+};
+
+// register names
+const char *const ns32000_disassembler::R[] =
+{
+ "R0", "R1", "R2", "R3", "R4", "R5", "R6", "R7"
+};
+const char *const ns32000_disassembler::M[] =
+{
+ "FP", "SP", "SB"
+};
+const char *const ns32000_disassembler::PR[] =
+{
+ "UPSR", "DCR", "BPC", "DSR", "CAR", "", "", "", "FP", "SP", "SB", "USP", "CFG", "PSR", "INTBASE", "MOD"
+};
+
+int8_t ns32000_disassembler::short2int(uint8_t val)
+{
+ return (val & 0x08) ? val | 0xf0 : val;
+}
+
+std::string ns32000_disassembler::mnemonic_index(std::string form, std::string itype, std::string ftype)
+{
+ if (itype.size() && form.find('i') != std::string::npos)
+ form.replace(form.find('i'), 1, itype);
+ if (ftype.size() && form.find('f') != std::string::npos)
+ form.replace(form.find('f'), 1, ftype);
+ return form;
+}
+
+uint8_t ns32000_disassembler::opcode_format(uint8_t byte)
+{
+ switch (byte & 0x0f)
+ {
+ case 0x0a: return 0;
+ case 0x02: return 1;
+ case 0x0c:
+ case 0x0d:
+ case 0x0f:
+ if ((byte & 0x70) != 0x70)
+ return 2;
+ else
+ return 3;
+ }
+
+ if ((byte & 0x03) != 0x02) return 4;
+
+ switch (byte)
+ {
+ case 0x0e: return 5;
+ case 0x4e: return 6;
+ case 0xce: return 7;
+ case 0x2e:
+ case 0x6e:
+ case 0xae:
+ case 0xee: return 8;
+ case 0x3e: return 9;
+ case 0x7e: return 10;
+ case 0xbe: return 11;
+ case 0xfe: return 12;
+ case 0x9e: return 13;
+ case 0x1e: return 14;
+ }
+
+ return 99; /* unknown format */
+}
+
+inline std::string ns32000_disassembler::get_option_list(uint8_t cfg)
+{
+ std::string option_list;
+
+ option_list.append("[");
+ if (BIT(cfg, 0)) option_list.append("I,");
+ if (BIT(cfg, 1)) option_list.append("F,");
+ if (BIT(cfg, 2)) option_list.append("M,");
+ if (BIT(cfg, 3)) option_list.append("C,");
+ if (option_list.back() == ',') option_list.pop_back();
+ option_list.append("]");
+
+ return option_list;
+}
+
+inline std::string ns32000_disassembler::get_options(uint8_t opts)
+{
+ std::string options;
+
+ options.append(" ");
+ if ((opts & 0x02) == 0x02) options.append("B,");
+ if ((opts & 0x04) == 0x04) options.append("W,");
+ if ((opts & 0x0c) == 0x0c) options.append("U,");
+ if (options.back() == ',') options.pop_back();
+
+ return options;
+}
+
+inline int32_t ns32000_disassembler::get_disp(offs_t &pc, const data_buffer &opcodes)
+{
+ /* displacement can be upto 3 bytes */
+ uint32_t disp = bitswap<32>(opcodes.r32(pc), 7, 6, 5, 4, 3, 2, 1, 0, 15, 14, 13, 12, 11, 10, 9, 8, 23, 22, 21, 20, 19, 18, 17, 16, 31, 30, 29, 28, 27, 26, 25, 24);
+
+ switch ((disp >> 29) & 0x07)
+ {
+ case 0: case 1: /* 7 bit positive */
+ disp = (disp >> 24);
+ pc += 1;
+ break;
+
+ case 2: case 3: /* 7 bit negative */
+ disp = (disp >> 24) | 0xffffff80;
+ pc += 1;
+ break;
+
+ case 4: /* 14 bit positive */
+ disp = (disp >> 16) & 0x3fff;
+ pc += 2;
+ break;
+
+ case 5: /* 14 bit negative */
+ disp = (disp >> 16) | 0xffffc000;
+ pc += 2;
+ break;
+
+ case 6: /* 30 bit positive */
+ disp = disp & 0x3fffffff;
+ pc += 4;
+ break;
+
+ case 7: /* 30 bit negative */
+ pc += 4;
+ break;
+ }
+
+ return disp;
+}
+
+inline std::string ns32000_disassembler::get_reg_list(offs_t &pc, const data_buffer &opcodes, bool reverse)
+{
+ std::string reg_list;
+
+ uint8_t byte = opcodes.r8(pc++);
+
+ reg_list.append("[");
+ for (int i = 0; i < 8; i++)
+ {
+ if (BIT(byte, i)) reg_list.append(R[reverse ? (~i & 7) : (i & 7)]).append(",");
+ }
+ if (reg_list.back() == ',') reg_list.pop_back();
+ reg_list.append("]");
+
+ return reg_list;
+}
+
+void ns32000_disassembler::stream_gen(std::ostream &stream, u8 gen_addr, u8 op_len, offs_t &pc, const data_buffer &opcodes)
+{
+ uint8_t index_byte;
+ int32_t disp1, disp2;
+
+ switch (gen_addr)
+ {
+ case 0x00: case 0x01: case 0x02: case 0x03: case 0x04: case 0x05: case 0x06: case 0x07:
+ /* Register */
+ util::stream_format(stream, "%s", R[gen_addr & 0x07]);
+ break;
+ case 0x08: case 0x09: case 0x0a: case 0x0b: case 0x0c: case 0x0d: case 0x0e: case 0x0f:
+ /* Register Relative */
+ disp1 = get_disp(pc, opcodes);
+ util::stream_format(stream, "%+d(%s)", disp1, R[gen_addr & 0x07]);
+ break;
+ case 0x10: case 0x11: case 0x12:
+ /* Memory Relative */
+ disp1 = get_disp(pc, opcodes);
+ disp2 = get_disp(pc, opcodes);
+ util::stream_format(stream, "#X%02X(#X%02X(%s))", disp2, disp1, M[gen_addr & 0x03]);
+ break;
+ case 0x13:
+ /* Reserved */
+ util::stream_format(stream, "(reserved)");
+ break;
+ case 0x14:
+ /* Immediate */
+ disp1 = bitswap<32>(opcodes.r32(pc), 7, 6, 5, 4, 3, 2, 1, 0, 15, 14, 13, 12, 11, 10, 9, 8, 23, 22, 21, 20, 19, 18, 17, 16, 31, 30, 29, 28, 27, 26, 25, 24);
+ util::stream_format(stream, "#X%02X", (op_len == 0 ? (disp1 >> 24) : (op_len == 1 ? (disp1 >> 16) : disp1)));
+ pc += op_len + 1;
+ break;
+ case 0x15:
+ /* Absolute */
+ disp1 = get_disp(pc, opcodes);
+ util::stream_format(stream, "@#X%02X", disp1);
+ break;
+ case 0x16:
+ /* External */
+ disp1 = get_disp(pc, opcodes);
+ disp2 = get_disp(pc, opcodes);
+ util::stream_format(stream, "EXT(%d)+%d", disp1, disp2);
+ break;
+ case 0x17:
+ /* Top Of Stack */
+ util::stream_format(stream, "TOS");
+ break;
+ case 0x18: case 0x19: case 0x1a:
+ /* Memory Space */
+ disp1 = get_disp(pc, opcodes);
+ util::stream_format(stream, "#X%02X(%s)", disp1, M[gen_addr & 0x03]);
+ break;
+ case 0x1b:
+ /* Memory Space */
+ disp1 = get_disp(pc, opcodes);
+ util::stream_format(stream, "#X%06X", m_base_pc + disp1);
+ break;
+ case 0x1c:
+ /* Scaled Index */
+ index_byte = opcodes.r8(pc++);
+ stream_gen(stream, index_byte >> 3, op_len, pc, opcodes);
+ util::stream_format(stream, "[%s:%c]", R[index_byte & 0x07], indexSize[gen_addr & 0x03]);
+ break;
+ }
+}
+
+offs_t ns32000_disassembler::disassemble(std::ostream &stream, offs_t pc, const data_buffer &opcodes, const data_buffer &params)
+{
+ uint32_t flags = SUPPORTED;
+
+ uint32_t opcode;
+ std::string mnemonic;
+ uint8_t temp8;
+
+ /* opcode can be upto 3 bytes */
+ opcode = opcodes.r32(pc);
+ m_base_pc = pc;
+
+ switch (opcode_format(opcode))
+ {
+ case 0: /* Format 0 */
+ pc += 1;
+ util::stream_format(stream, "%-8s #X%06X", std::string("B").append(cond[Format0cond(opcode)]), m_base_pc + get_disp(pc, opcodes));
+ break;
+
+ case 0x01: /* Format 1 */
+ pc += 1;
+ switch (Format1op(opcode))
+ {
+ case 0x00:
+ util::stream_format(stream, "%-8s #X%06X", Format1[Format1op(opcode)], m_base_pc + get_disp(pc, opcodes));
+ break;
+ case 0x01:
+ util::stream_format(stream, "%-8s #X%02X", Format1[Format1op(opcode)], get_disp(pc, opcodes) & 0xffffff);
+ break;
+ case 0x02:
+ util::stream_format(stream, "%-8s EXT(%d)", Format1[Format1op(opcode)], get_disp(pc, opcodes));
+ break;
+ case 0x03: case 0x04:
+ util::stream_format(stream, "%-8s #X%02X", Format1[Format1op(opcode)], get_disp(pc, opcodes) & 0xffffff);
+ break;
+ case 0x05:
+ util::stream_format(stream, "%-8s", Format1[Format1op(opcode)]);
+ break;
+ case 0x06:
+ util::stream_format(stream, "%-8s %s", Format1[Format1op(opcode)], get_reg_list(pc, opcodes, false));
+ break;
+ case 0x07: case 0x09:
+ util::stream_format(stream, "%-8s %s", Format1[Format1op(opcode)], get_reg_list(pc, opcodes, true));
+ break;
+ case 0x08:
+ util::stream_format(stream, "%-8s %s, %d", Format1[Format1op(opcode)], get_reg_list(pc, opcodes, false), get_disp(pc, opcodes));
+ break;
+ case 0x0a: case 0x0b: case 0x0c: case 0x0d: case 0x0e: case 0x0f:
+ util::stream_format(stream, "%-8s", Format1[Format1op(opcode)]);
+ break;
+ }
+ break;
+
+ case 0x02: /* Format 2 */
+ pc += 2;
+ mnemonic = mnemonic_index(Format2[Format2op(opcode)], iType[Format2i(opcode)], "");
+ switch (Format2op(opcode))
+ {
+ case 0x00: case 0x01: case 0x05:
+ util::stream_format(stream, "%-8s %+d, ", mnemonic, short2int(Format2short(opcode)));
+ stream_gen(stream, Format2gen(opcode), Format2i(opcode), pc, opcodes);
+ break;
+ case 0x02: case 0x06:
+ util::stream_format(stream, "%-8s %s, ", mnemonic, areg[Format2short(opcode)]);
+ stream_gen(stream, Format2gen(opcode), Format2i(opcode), pc, opcodes);
+ break;
+ case 0x03:
+ util::stream_format(stream, "%-8s ", std::string("S").append(cond[Format2short(opcode)]).append(iType[Format2i(opcode)]));
+ stream_gen(stream, Format2gen(opcode), Format2i(opcode), pc, opcodes);
+ break;
+ case 0x04:
+ util::stream_format(stream, "%-8s %+d, ", mnemonic, short2int(Format2short(opcode)));
+ stream_gen(stream, Format2gen(opcode), Format2i(opcode), pc, opcodes);
+ util::stream_format(stream, ", #X%06x", m_base_pc + get_disp(pc, opcodes));
+ break;
+ }
+ break;
+
+ case 0x03: /* Format 3 */
+ pc += 2;
+ mnemonic = mnemonic_index(Format3[Format3op(opcode)], iType[Format3i(opcode)], "");
+ switch (Format3op(opcode))
+ {
+ case 0x00: case 0x02: case 0x04: case 0x06: case 0x0a: case 0x0c: case 0x0e:
+ util::stream_format(stream, "%-8s ", mnemonic);
+ stream_gen(stream, Format3gen(opcode), Format3i(opcode), pc, opcodes);
+ break;
+ default: /* Trap */
+ util::stream_format(stream, "%-8s ", mnemonic);
+ break;
+ }
+ break;
+
+ case 0x04: /* Format 4 */
+ pc += 2;
+ mnemonic = mnemonic_index(Format4[Format4op(opcode)], iType[Format4i(opcode)], "");
+ util::stream_format(stream, "%-8s ", mnemonic);
+ stream_gen(stream, Format4gen1(opcode), Format4i(opcode), pc, opcodes);
+ util::stream_format(stream, ", ");
+ stream_gen(stream, Format4gen2(opcode), Format4i(opcode), pc, opcodes);
+ break;
+
+ case 0x05: /* Format 5 */
+ pc += 3;
+ mnemonic = mnemonic_index(Format5[Format5op(opcode)], iType[Format5i(opcode)], "");
+ switch ((opcode >> 10) & 0x0f)
+ {
+ case 0x00: case 0x01: case 0x03:
+ if (Format5short(opcode) & 0x01)
+ util::stream_format(stream, "%-8s %s", std::string(Format5[Format5op(opcode)]).append("T"), get_options(Format5short(opcode)));
+ else
+ util::stream_format(stream, "%-8s %s", mnemonic, get_options(Format5short(opcode)));
+ break;
+ case 0x02:
+ util::stream_format(stream, "%-8s %s", Format5[Format5op(opcode)], get_option_list(Format5short(opcode)));
+ break;
+ default: /* Trap */
+ util::stream_format(stream, "%-8s ", mnemonic);
+ break;
+ }
+ break;
+
+ case 0x06: /* Format 6 */
+ pc += 3;
+ mnemonic = mnemonic_index(Format6[Format6op(opcode)], iType[Format6i(opcode)], "");
+ switch ((opcode >> 10) & 0x0f)
+ {
+ case 0x00: case 0x01: case 0x02: case 0x03: case 0x05: case 0x06: case 0x07: case 0x08: case 0x09: case 0x0b: case 0x0c: case 0x0d: case 0x0e: case 0x0f:
+ util::stream_format(stream, "%-8s ", mnemonic);
+ stream_gen(stream, Format6gen1(opcode), Format6i(opcode), pc, opcodes);
+ util::stream_format(stream, ", ");
+ stream_gen(stream, Format6gen2(opcode), Format6i(opcode), pc, opcodes);
+ break;
+ default: /* Trap */
+ util::stream_format(stream, "%-8s ", mnemonic);
+ break;
+ }
+ break;
+
+ case 0x07: /* Format 7 */
+ pc += 3;
+ mnemonic = mnemonic_index(Format7[Format7op(opcode)], iType[Format7i(opcode)], "");
+ switch (Format7op(opcode))
+ {
+ case 0x00: case 0x01:
+ util::stream_format(stream, "%-8s ", mnemonic);
+ stream_gen(stream, Format7gen1(opcode), Format7i(opcode), pc, opcodes);
+ util::stream_format(stream, ", ");
+ stream_gen(stream, Format7gen2(opcode), Format7i(opcode), pc, opcodes);
+ util::stream_format(stream, ", %d", get_disp(pc, opcodes));
+ break;
+ case 0x02: case 0x03:
+ util::stream_format(stream, "%-8s ", mnemonic);
+ stream_gen(stream, Format7gen1(opcode), Format7i(opcode), pc, opcodes);
+ util::stream_format(stream, ", ");
+ stream_gen(stream, Format7gen2(opcode), Format7i(opcode), pc, opcodes);
+ temp8 = opcodes.r8(pc++);
+ util::stream_format(stream, ", %d, %d", temp8 >> 5, temp8 + 1);
+ break;
+ case 0x04: case 0x05: case 0x06: case 0x07: case 0x08: case 0x09: case 0x0b: case 0x0c: case 0x0d: case 0x0e: case 0x0f:
+ util::stream_format(stream, "%-8s ", mnemonic);
+ stream_gen(stream, Format7gen1(opcode), Format7i(opcode), pc, opcodes);
+ util::stream_format(stream, ", ");
+ stream_gen(stream, Format7gen2(opcode), Format7i(opcode), pc, opcodes);
+ break;
+ default: /* Trap */
+ util::stream_format(stream, "%-8s ", mnemonic);
+ break;
+ }
+ break;
+
+ case 0x08: /* Format 8 */
+ pc += 3;
+ mnemonic = mnemonic_index(Format8[Format8op(opcode)], iType[Format8i(opcode)], "");
+ switch (Format8op(opcode))
+ {
+ case 0x00: case 0x02:
+ util::stream_format(stream, "%-8s %s, ", mnemonic, R[Format8reg(opcode)]);
+ stream_gen(stream, Format8gen2(opcode), Format8i(opcode), pc, opcodes);
+ util::stream_format(stream, ", ");
+ stream_gen(stream, Format8gen1(opcode), Format8i(opcode), pc, opcodes);
+ util::stream_format(stream, ", %d", get_disp(pc, opcodes));
+ break;
+ case 0x01: case 0x03: case 0x04:
+ util::stream_format(stream, "%-8s %s, ", mnemonic, R[Format8reg(opcode)]);
+ stream_gen(stream, Format8gen2(opcode), Format8i(opcode), pc, opcodes);
+ util::stream_format(stream, ", ");
+ stream_gen(stream, Format8gen1(opcode), Format8i(opcode), pc, opcodes);
+ break;
+ case 0x05:
+ util::stream_format(stream, "%-8s ", mnemonic);
+ stream_gen(stream, Format8gen2(opcode), Format8i(opcode), pc, opcodes);
+ util::stream_format(stream, ", ");
+ stream_gen(stream, Format8gen1(opcode), Format8i(opcode), pc, opcodes);
+ break;
+ case 0x06:
+ if (Format8reg(opcode) == 0x01)
+ util::stream_format(stream, "%-8s ", std::string(Format8[Format8op(opcode)]).append(iType[Format8i(opcode)]));
+ else
+ util::stream_format(stream, "%-8s ", std::string(Format8[Format8op(opcode) + 1]).append(iType[Format8i(opcode)]));
+ stream_gen(stream, Format8gen2(opcode), Format8i(opcode), pc, opcodes);
+ util::stream_format(stream, ", ");
+ stream_gen(stream, Format8gen1(opcode), Format8i(opcode), pc, opcodes);
+ break;
+ }
+ break;
+
+ case 0x09: /* Format 9 */
+ pc += 3;
+ mnemonic = mnemonic_index(Format9[Format9op(opcode)], iType[Format9i(opcode)], fType[Format9f(opcode)]);
+ switch (Format9op(opcode))
+ {
+ case 0x00: case 0x02: case 0x04: case 0x05: case 0x07:
+ util::stream_format(stream, "%-8s ", mnemonic);
+ stream_gen(stream, Format9gen1(opcode), Format9i(opcode), pc, opcodes);
+ util::stream_format(stream, ", ");
+ stream_gen(stream, Format9gen2(opcode), Format9i(opcode), pc, opcodes);
+ break;
+ case 0x01: case 0x06:
+ util::stream_format(stream, "%-8s ", mnemonic);
+ stream_gen(stream, Format9gen1(opcode), Format9i(opcode), pc, opcodes);
+ break;
+ }
+ break;
+
+ case 0x0b: /* Format 11 */
+ pc += 3;
+ mnemonic = mnemonic_index(Format11[Format11op(opcode)], "", fType[Format11f(opcode)]);
+ switch (Format11op(opcode))
+ {
+ case 0x00: case 0x01: case 0x02: case 0x04: case 0x05 : case 0x08: case 0x0c : case 0x0d:
+ util::stream_format(stream, "%-8s ", mnemonic);
+ stream_gen(stream, Format11gen1(opcode), Format11f(opcode), pc, opcodes);
+ util::stream_format(stream, ",");
+ stream_gen(stream, Format11gen2(opcode), Format11f(opcode), pc, opcodes);
+ break;
+ default: /* Trap */
+ util::stream_format(stream, "%-8s ", mnemonic);
+ break;
+ }
+ break;
+
+ case 0x0a: /* Format 10 */
+ case 0x0c: /* Format 12 */
+ case 0x0d: /* Format 13 */
+ pc += 3;
+ util::stream_format(stream, "Trap (UND)");
+ break;
+
+ case 0x0e: /* Format 14 */
+ pc += 3;
+ mnemonic = mnemonic_index(Format14[Format14op(opcode)], iType[Format14i(opcode)], "");
+ switch (Format14op(opcode))
+ {
+ case 0x00: case 0x01:
+ util::stream_format(stream, "%-8s ", mnemonic);
+ stream_gen(stream, Format14gen1(opcode), Format14i(opcode), pc, opcodes);
+ break;
+ case 0x02: case 0x03:
+ util::stream_format(stream, "%-8s %s, ", mnemonic, mreg[Format14short(opcode)]);
+ stream_gen(stream, Format14gen1(opcode), Format14i(opcode), pc, opcodes);
+ break;
+ default: /* Trap */
+ util::stream_format(stream, "%-8s ", mnemonic);
+ break;
+ }
+ break;
+
+ default:
+ pc += 1;
+ util::stream_format(stream, "unknown instruction format");
+ break;
+ }
+
+ return (pc - m_base_pc) | flags;
+}
diff --git a/src/devices/cpu/ns32000/ns32000dasm.h b/src/devices/cpu/ns32000/ns32000dasm.h
new file mode 100644
index 00000000000..4cbf4cf3bda
--- /dev/null
+++ b/src/devices/cpu/ns32000/ns32000dasm.h
@@ -0,0 +1,117 @@
+// license:BSD-3-Clause
+// copyright-holders:Nigel Barnes
+/*****************************************************************************
+*
+* ns32000dasm.cpp
+*
+* NS32000 CPU Disassembly
+*
+*****************************************************************************/
+
+#ifndef MAME_CPU_NS32000_NS32000DASM_H
+#define MAME_CPU_NS32000_NS32000DASM_H
+
+#pragma once
+
+class ns32000_disassembler : public util::disasm_interface
+{
+public:
+
+ ns32000_disassembler() = default;
+ virtual ~ns32000_disassembler() = default;
+
+ virtual u32 opcode_alignment() const override { return 1; }
+ virtual offs_t disassemble(std::ostream &stream, offs_t pc, const data_buffer &opcodes, const data_buffer &params) override;
+
+private:
+ /* implied operand attributes */
+ enum
+ {
+ REG = 16,
+ QUICK,
+ SHORT,
+ IMM,
+ DISP,
+ GEN,
+ OPTIONS,
+ };
+ /* access classes */
+ enum
+ {
+ READ = 8,
+ WRITE,
+ RMW,
+ ADDR,
+ REGADDR
+ };
+ /* length attributes */
+ enum
+ {
+ B = 0,
+ W = 1,
+ D = 3,
+ I,
+ I2,
+ F,
+ L
+ };
+ struct NS32000_OPCODE {
+ const char *mnemonic;
+ u32 operand1;
+ u32 operand;
+ u32 operand3;
+ u32 operand4;
+ offs_t dasm_flags;
+ };
+
+ static const NS32000_OPCODE format0_op[1];
+ static const NS32000_OPCODE format1_op[16];
+ static const NS32000_OPCODE format2_op[8];
+ static const NS32000_OPCODE format3_op[16];
+ static const NS32000_OPCODE format4_op[16];
+ static const NS32000_OPCODE format5_op[16];
+ static const NS32000_OPCODE format6_op[16];
+ static const NS32000_OPCODE format7_op[16];
+ static const NS32000_OPCODE format8_op[16];
+ static const NS32000_OPCODE format9_op[16];
+ static const NS32000_OPCODE format11_op[16];
+ static const NS32000_OPCODE format14_op[16];
+
+
+ static char const *const Format0[];
+ static char const *const Format1[];
+ static char const *const Format2[];
+ static char const *const Format3[];
+ static char const *const Format4[];
+ static char const *const Format5[];
+ static char const *const Format6[];
+ static char const *const Format7[];
+ static char const *const Format8[];
+ static char const *const Format9[];
+ static char const *const Format11[];
+ static char const *const Format14[];
+ static char const *const iType[];
+ static char const *const fType[];
+ static char const *const cType[];
+ static char const *const indexSize[];
+ static char const *const cond[];
+ static char const *const areg[];
+ static char const *const mreg[];
+ static char const *const R[];
+ static char const *const M[];
+ static char const *const PR[];
+
+ std::string mnemonic_index(std::string form, std::string itype, std::string ftype);
+ uint8_t opcode_format(uint8_t byte);
+ int8_t short2int(uint8_t val);
+ static inline int32_t get_disp(offs_t &pc, const data_buffer &opcodes);
+ static inline std::string get_option_list(uint8_t cfg);
+ static inline std::string get_options(uint8_t opts);
+ static inline std::string get_reg_list(offs_t &pc, const data_buffer &opcodes, bool reverse);
+
+ void stream_gen(std::ostream &stream, u8 gen_addr, u8 op_len, offs_t &pc, const data_buffer &opcodes);
+
+ u32 m_base_pc;
+};
+
+#endif
diff --git a/src/devices/cpu/pic16c5x/pic16c5x.cpp b/src/devices/cpu/pic16c5x/pic16c5x.cpp
index fe1b0280d2a..21907b7d369 100644
--- a/src/devices/cpu/pic16c5x/pic16c5x.cpp
+++ b/src/devices/cpu/pic16c5x/pic16c5x.cpp
@@ -83,8 +83,8 @@ DEFINE_DEVICE_TYPE(PIC16C56, pic16c56_device, "pic16c56", "Microchip PIC16C56")
DEFINE_DEVICE_TYPE(PIC16C57, pic16c57_device, "pic16c57", "Microchip PIC16C57")
DEFINE_DEVICE_TYPE(PIC16C58, pic16c58_device, "pic16c58", "Microchip PIC16C58")
-DEFINE_DEVICE_TYPE(PIC1650, pic1650_device, "pic1650", "Microchip PIC1650")
-DEFINE_DEVICE_TYPE(PIC1655, pic1655_device, "pic1655", "Microchip PIC1655")
+DEFINE_DEVICE_TYPE(PIC1650, pic1650_device, "pic1650", "GI PIC1650")
+DEFINE_DEVICE_TYPE(PIC1655, pic1655_device, "pic1655", "GI PIC1655")
/****************************************************************************
diff --git a/src/devices/cpu/sh/sh2.cpp b/src/devices/cpu/sh/sh2.cpp
index 6eebabea4ac..d3660a52209 100644
--- a/src/devices/cpu/sh/sh2.cpp
+++ b/src/devices/cpu/sh/sh2.cpp
@@ -402,7 +402,7 @@ void sh2_device::execute_run()
{
debugger_instruction_hook(m_sh2_state->pc);
- const uint16_t opcode = m_program->read_word(m_sh2_state->pc & SH12_AM);
+ const uint16_t opcode = m_decrypted_program->read_word(m_sh2_state->pc >= 0x40000000 ? m_sh2_state->pc : m_sh2_state->pc & SH12_AM);
if (m_sh2_state->m_delay)
{
diff --git a/src/devices/cpu/sm510/sm510base.cpp b/src/devices/cpu/sm510/sm510base.cpp
index b3bef1d67b7..919fcea9e17 100644
--- a/src/devices/cpu/sm510/sm510base.cpp
+++ b/src/devices/cpu/sm510/sm510base.cpp
@@ -15,7 +15,6 @@
TODO:
- source organiziation between files is a mess
- - LCD bs pin blink mode via Y register (0.5s off, 0.5s on)
- wake up after CEND doesn't work right
for more, see the *core.cpp file notes
@@ -200,7 +199,8 @@ void sm510_base_device::lcd_update()
m_write_segs(h | SM510_PORT_SEGC, get_lcd_row(h, m_lcd_ram_c), 0xffff);
// bs output from L/X and Y regs
- u8 bs = (m_l >> h & 1) | ((m_x*2) >> h & 2);
+ u8 blink = (m_div & 0x4000) ? m_y : 0;
+ u8 bs = ((m_l & ~blink) >> h & 1) | ((m_x*2) >> h & 2);
m_write_segs(h | SM510_PORT_SEGBS, (m_bc || !m_bp) ? 0 : bs, 0xffff);
}
}
diff --git a/src/devices/cpu/tms1000/tms0270.cpp b/src/devices/cpu/tms1000/tms0270.cpp
index 5d1eb2b14d1..899e3eb1ba3 100644
--- a/src/devices/cpu/tms1000/tms0270.cpp
+++ b/src/devices/cpu/tms1000/tms0270.cpp
@@ -24,9 +24,6 @@ DEFINE_DEVICE_TYPE(TMS0270, tms0270_cpu_device, "tms0270", "Texas Instruments TM
// device definitions
tms0270_cpu_device::tms0270_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
: tms0980_cpu_device(mconfig, TMS0270, tag, owner, clock, 16 /* o pins */, 16 /* r pins */, 7 /* pc bits */, 9 /* byte width */, 4 /* x width */, 11 /* prg width */, address_map_constructor(FUNC(tms0270_cpu_device::program_11bit_9), this), 8 /* data width */, address_map_constructor(FUNC(tms0270_cpu_device::data_144x4), this))
- , m_read_ctl(*this)
- , m_write_ctl(*this)
- , m_write_pdc(*this)
{
}
@@ -47,10 +44,6 @@ void tms0270_cpu_device::device_start()
// common init
tms1k_base_device::device_start();
- m_read_ctl.resolve_safe(0);
- m_write_ctl.resolve_safe();
- m_write_pdc.resolve_safe();
-
// zerofill
m_r_prev = 0;
m_chipsel = 0;
diff --git a/src/devices/cpu/tms1000/tms0270.h b/src/devices/cpu/tms1000/tms0270.h
index 3043119e2aa..45c231a950a 100644
--- a/src/devices/cpu/tms1000/tms0270.h
+++ b/src/devices/cpu/tms1000/tms0270.h
@@ -19,11 +19,6 @@ class tms0270_cpu_device : public tms0980_cpu_device
public:
tms0270_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
- // TMS0270 was designed to interface with TMS5100, set it up at driver level
- auto read_ctl() { return m_read_ctl.bind(); }
- auto write_ctl() { return m_write_ctl.bind(); }
- auto write_pdc() { return m_write_pdc.bind(); }
-
protected:
// overrides
virtual void device_start() override;
@@ -50,10 +45,6 @@ private:
u8 m_o_latch_low;
u8 m_o_latch;
u8 m_o_latch_prev;
-
- devcb_read8 m_read_ctl;
- devcb_write8 m_write_ctl;
- devcb_write_line m_write_pdc;
};
diff --git a/src/devices/cpu/tms1000/tms1000c.cpp b/src/devices/cpu/tms1000/tms1000c.cpp
index defc8482eef..b69a683f280 100644
--- a/src/devices/cpu/tms1000/tms1000c.cpp
+++ b/src/devices/cpu/tms1000/tms1000c.cpp
@@ -52,21 +52,3 @@ u32 tms1000c_cpu_device::decode_micro(u8 sel)
return decode;
}
-
-
-// execute
-void tms1000c_cpu_device::execute_run()
-{
- while (m_icount > 0)
- {
- if (m_halt_pin)
- {
- // not running (output pins remain unchanged)
- m_icount = 0;
- return;
- }
-
- m_icount--;
- execute_one();
- }
-}
diff --git a/src/devices/cpu/tms1000/tms1000c.h b/src/devices/cpu/tms1000/tms1000c.h
index 364dd56879f..7857bf07f0c 100644
--- a/src/devices/cpu/tms1000/tms1000c.h
+++ b/src/devices/cpu/tms1000/tms1000c.h
@@ -23,7 +23,6 @@ protected:
// overrides
virtual void device_add_mconfig(machine_config &config) override;
virtual u32 decode_micro(u8 sel) override;
- virtual void execute_run() override;
virtual void op_br() override { op_br3(); } // 3-level stack
virtual void op_call() override { op_call3(); } // "
diff --git a/src/devices/cpu/tms1000/tms1k_base.cpp b/src/devices/cpu/tms1000/tms1k_base.cpp
index 432e43e0d7b..3f14dba6c5e 100644
--- a/src/devices/cpu/tms1000/tms1k_base.cpp
+++ b/src/devices/cpu/tms1000/tms1k_base.cpp
@@ -90,6 +90,9 @@ tms1k_base_device::tms1k_base_device(const machine_config &mconfig, device_type
, m_write_o(*this)
, m_write_r(*this)
, m_power_off(*this)
+ , m_read_ctl(*this)
+ , m_write_ctl(*this)
+ , m_write_pdc(*this)
{
}
@@ -131,6 +134,9 @@ void tms1k_base_device::device_start()
m_write_o.resolve_safe();
m_write_r.resolve_safe();
m_power_off.resolve_safe();
+ m_read_ctl.resolve_safe(0);
+ m_write_ctl.resolve_safe();
+ m_write_pdc.resolve_safe();
// zerofill
m_pc = 0;
@@ -147,7 +153,6 @@ void tms1k_base_device::device_start()
m_r = 0;
m_o = 0;
m_o_index = 0;
- m_halt_pin = false;
m_cki_bus = 0;
m_c4 = 0;
m_p = 0;
@@ -187,7 +192,6 @@ void tms1k_base_device::device_start()
save_item(NAME(m_r));
save_item(NAME(m_o));
save_item(NAME(m_o_index));
- save_item(NAME(m_halt_pin));
save_item(NAME(m_cki_bus));
save_item(NAME(m_c4));
save_item(NAME(m_p));
@@ -297,7 +301,7 @@ void tms1k_base_device::read_opcode()
{
debugger_instruction_hook(m_rom_address);
m_opcode = m_program->read_byte(m_rom_address);
- m_c4 = bitswap<8>(m_opcode,7,6,5,4,0,1,2,3) & 0xf; // opcode operand is bitswapped for most opcodes
+ m_c4 = bitswap<4>(m_opcode,0,1,2,3); // opcode operand is bitswapped for most opcodes
m_fixed = m_fixed_decode[m_opcode];
m_micro = m_micro_decode[m_opcode];
@@ -311,15 +315,6 @@ void tms1k_base_device::read_opcode()
// i/o handling
//-------------------------------------------------
-void tms1k_base_device::execute_set_input(int line, int state)
-{
- if (line != TMS1XXX_INPUT_LINE_HALT)
- return;
-
- // HALT pin (CMOS only)
- m_halt_pin = bool(state);
-}
-
void tms1k_base_device::write_o_output(u8 index)
{
// a hardcoded table is supported if the output pla is unknown
diff --git a/src/devices/cpu/tms1000/tms1k_base.h b/src/devices/cpu/tms1000/tms1k_base.h
index 7a394b8dfbb..d7681329c93 100644
--- a/src/devices/cpu/tms1000/tms1k_base.h
+++ b/src/devices/cpu/tms1000/tms1k_base.h
@@ -17,10 +17,6 @@
#include "machine/pla.h"
-// HALT input pin on CMOS chips (use set_input_line)
-#define TMS1XXX_INPUT_LINE_HALT 0
-
-
// pinout reference
/*
@@ -78,6 +74,14 @@ public:
// OFF request on TMS0980 and up
auto power_off() { return m_power_off.bind(); }
+ // note: for HALT input pin on CMOS chips, use set_input_line with INPUT_LINE_HALT
+ // similarly with the INIT pin, simply use INPUT_LINE_RESET
+
+ // TMS0270 was designed to interface with TMS5100, set it up at driver level
+ auto read_ctl() { return m_read_ctl.bind(); }
+ auto write_ctl() { return m_write_ctl.bind(); }
+ auto write_pdc() { return m_write_pdc.bind(); }
+
// Use this if the output PLA is unknown:
// If the microinstructions (or other) PLA is unknown, try using one from another romset.
void set_output_pla(const u16 *output_pla) { m_output_pla_table = output_pla; }
@@ -95,8 +99,6 @@ protected:
// device_execute_interface overrides
virtual u32 execute_min_cycles() const override { return 1; }
virtual u32 execute_max_cycles() const override { return 1; }
- virtual u32 execute_input_lines() const override { return 1; }
- virtual void execute_set_input(int line, int state) override;
virtual void execute_run() override;
virtual void execute_one();
@@ -245,7 +247,6 @@ protected:
int m_subcycle;
int m_icount;
u8 m_o_index;
- bool m_halt_pin;
u8 m_o_pins; // how many O pins
u8 m_r_pins; // how many R pins
@@ -261,6 +262,9 @@ protected:
devcb_write16 m_write_o;
devcb_write16 m_write_r;
devcb_write_line m_power_off;
+ devcb_read8 m_read_ctl;
+ devcb_write8 m_write_ctl;
+ devcb_write_line m_write_pdc;
u32 m_o_mask;
u32 m_r_mask;
diff --git a/src/devices/cpu/tms34010/tms34010.cpp b/src/devices/cpu/tms34010/tms34010.cpp
index 3851b16dd37..79e9cf42fb6 100644
--- a/src/devices/cpu/tms34010/tms34010.cpp
+++ b/src/devices/cpu/tms34010/tms34010.cpp
@@ -7,6 +7,9 @@
Copyright Alex Pasadyn/Zsolt Vasvari
Parts based on code by Aaron Giles
+ TMS34020 TODO:
+ - Big endian mode isn't implemented
+
***************************************************************************/
#include "emu.h"
@@ -26,36 +29,80 @@
#define LOGCONTROLREGS(...) LOGMASKED(LOG_CONTROL_REGS, __VA_ARGS__)
#define LOGGRAPHICSOPS(...) LOGMASKED(LOG_GRAPHICS_OPS, __VA_ARGS__)
+void tms34010_device::internal_regs_map(address_map &map)
+{
+ //map(0x00000000, 0xbfffffff); General use
+ map(0xc0000000, 0xc00001ff).rw(FUNC(tms34010_device::io_register_r), FUNC(tms34010_device::io_register_w)); // IO registers
+ //map(0xc0000200, 0xc0001fff).noprw(); Reserved (for IO registers?)
+ //map(0xc0002000, 0xffffdfff); General use
+ //map(0xffffe000, 0xfffffbff).noprw(); Reserved (for interrupt vectors, maybe)
+ //map(0xfffffc00, 0xffffffff); Interrupt Vectors
+}
+
+void tms34020_device::internal_regs_map(address_map &map)
+{
+ //map(0x00000000, 0x000fffff); General use and extended trap vectors
+ //map(0x00100000, 0xbfffffff); General use
+ map(0xc0000000, 0xc00003ff).rw(FUNC(tms34020_device::io_register_r), FUNC(tms34020_device::io_register_w)); // IO registers
+ //map(0xc0000400, 0xc0001fff).noprw(); Reserved for IO registers
+ //map(0xc0002000, 0xffefffff); General use
+ //map(0xfff00000, 0xffffdfff); General use and extended trap vectors
+ //map(0xffffe000, 0xfffffbbf).noprw(); Reserved for interrupt vectors and extended trap vectors
+ //map(0xfffffbc0, 0xffffffff); Interrupt vectors and trap vectors
+}
-DEFINE_DEVICE_TYPE(TMS34010, tms34010_device, "tms34010", "TMS34010")
-DEFINE_DEVICE_TYPE(TMS34020, tms34020_device, "tms34020", "TMS34020")
+DEFINE_DEVICE_TYPE(TMS34010, tms34010_device, "tms34010", "Texas Instruments TMS34010")
+DEFINE_DEVICE_TYPE(TMS34020, tms34020_device, "tms34020", "Texas Instruments TMS34020")
/***************************************************************************
GLOBAL VARIABLES
***************************************************************************/
-tms340x0_device::tms340x0_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock)
+tms340x0_device::tms340x0_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock, address_map_constructor internal_regs_map)
: cpu_device(mconfig, type, tag, owner, clock)
, device_video_interface(mconfig, *this)
- , m_program_config("program", ENDIANNESS_LITTLE, 16, 32, 3), m_pc(0), m_ppc(0), m_st(0), m_pixel_write(nullptr), m_pixel_read(nullptr), m_raster_op(nullptr), m_pixel_op(nullptr), m_pixel_op_timing(0), m_convsp(0), m_convdp(0), m_convmp(0), m_gfxcycles(0), m_pixelshift(0), m_is_34020(0), m_reset_deferred(false)
- , m_halt_on_reset(false), m_hblank_stable(0), m_external_host_access(0), m_executing(0), m_program(nullptr), m_cache(nullptr)
+ , m_program_config("program", ENDIANNESS_LITTLE, 16, 32, 3, internal_regs_map)
+ , m_pc(0)
+ , m_ppc(0)
+ , m_st(0)
+ , m_pixel_write(nullptr)
+ , m_pixel_read(nullptr)
+ , m_raster_op(nullptr)
+ , m_pixel_op(nullptr)
+ , m_pixel_op_timing(0)
+ , m_convsp(0)
+ , m_convdp(0)
+ , m_convmp(0)
+ , m_gfxcycles(0)
+ , m_pixelshift(0)
+ , m_is_34020(0)
+ , m_reset_deferred(false)
+ , m_halt_on_reset(false)
+ , m_hblank_stable(0)
+ , m_external_host_access(0)
+ , m_executing(0)
+ , m_program(nullptr)
+ , m_cache(nullptr)
, m_pixclock(0)
- , m_pixperclock(0), m_scantimer(nullptr), m_icount(0)
+ , m_pixperclock(0)
+ , m_scantimer(nullptr)
+ , m_icount(0)
, m_output_int_cb(*this)
+ , m_ioreg_pre_write_cb(*this)
{
}
tms34010_device::tms34010_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
- : tms340x0_device(mconfig, TMS34010, tag, owner, clock)
+ : tms340x0_device(mconfig, TMS34010, tag, owner, clock, address_map_constructor(FUNC(tms34010_device::internal_regs_map), this))
{
m_is_34020 = 0;
}
tms34020_device::tms34020_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
- : tms340x0_device(mconfig, TMS34020, tag, owner, clock)
+ : tms340x0_device(mconfig, TMS34020, tag, owner, clock, address_map_constructor(FUNC(tms34020_device::internal_regs_map), this))
{
m_is_34020 = 1;
}
@@ -582,6 +629,7 @@ void tms340x0_device::device_start()
m_scanline_ind16_cb.bind_relative_to(*owner());
m_scanline_rgb32_cb.bind_relative_to(*owner());
m_output_int_cb.resolve();
+ m_ioreg_pre_write_cb.resolve();
m_to_shiftreg_cb.bind_relative_to(*owner());
m_from_shiftreg_cb.bind_relative_to(*owner());
@@ -625,7 +673,6 @@ void tms340x0_device::device_start()
save_item(NAME(m_pixelshift));
save_item(NAME(m_gfxcycles));
save_pointer(NAME(&m_regs[0].reg), ARRAY_LENGTH(m_regs));
- machine().save().register_postload(save_prepost_delegate(FUNC(tms340x0_device::tms34010_state_postload), this));
set_icountptr(m_icount);
}
@@ -661,7 +708,7 @@ void tms340x0_device::device_reset()
if (m_reset_deferred)
{
- io_register_w(*m_program, REG_HSTCTLH, 0x8000, 0xffff);
+ io_register_w(REG_HSTCTLH, 0x8000, 0xffff);
}
}
@@ -1089,8 +1136,11 @@ static const char *const ioreg_name[] =
"HCOUNT", "VCOUNT", "DPYADR", "REFCNT"
};
-WRITE16_MEMBER( tms34010_device::io_register_w )
+void tms34010_device::io_register_w(offs_t offset, u16 data, u16 mem_mask)
{
+ if (!m_ioreg_pre_write_cb.isnull())
+ m_ioreg_pre_write_cb(offset, data, mem_mask);
+
int oldreg, newreg;
/* Set register */
@@ -1237,8 +1287,11 @@ static const char *const ioreg020_name[] =
"IHOST3L", "IHOST3H", "IHOST4L", "IHOST4H"
};
-WRITE16_MEMBER( tms34020_device::io_register_w )
+void tms34020_device::io_register_w(offs_t offset, u16 data, u16 mem_mask)
{
+ if (!m_ioreg_pre_write_cb.isnull())
+ m_ioreg_pre_write_cb(offset, data, mem_mask);
+
int oldreg, newreg;
/* Set register */
@@ -1398,7 +1451,7 @@ WRITE16_MEMBER( tms34020_device::io_register_w )
I/O REGISTER READS
***************************************************************************/
-READ16_MEMBER( tms34010_device::io_register_r )
+u16 tms34010_device::io_register_r(offs_t offset)
{
int result, total;
@@ -1439,7 +1492,7 @@ READ16_MEMBER( tms34010_device::io_register_r )
}
-READ16_MEMBER( tms34020_device::io_register_r )
+u16 tms34020_device::io_register_r(offs_t offset)
{
int result, total;
@@ -1479,7 +1532,7 @@ READ16_MEMBER( tms34020_device::io_register_r )
SAVE STATE
***************************************************************************/
-void tms340x0_device::tms34010_state_postload()
+void tms340x0_device::device_post_load()
{
set_raster_op();
set_pixel_function();
@@ -1490,7 +1543,7 @@ void tms340x0_device::tms34010_state_postload()
HOST INTERFACE WRITES
***************************************************************************/
-WRITE16_MEMBER( tms340x0_device::host_w )
+void tms340x0_device::host_w(offs_t offset, u16 data, u16 mem_mask)
{
int reg = offset;
unsigned int addr;
@@ -1527,8 +1580,8 @@ WRITE16_MEMBER( tms340x0_device::host_w )
case TMS34010_HOST_CONTROL:
{
m_external_host_access = true;
- if (mem_mask&0xff00) io_register_w(*m_program, REG_HSTCTLH, data & 0xff00, 0xff00);
- if (mem_mask&0x00ff) io_register_w(*m_program, REG_HSTCTLL, data & 0x00ff, 0x00ff);
+ if (mem_mask&0xff00) io_register_w(REG_HSTCTLH, data & 0xff00, 0xff00);
+ if (mem_mask&0x00ff) io_register_w(REG_HSTCTLL, data & 0x00ff, 0x00ff);
m_external_host_access = false;
break;
}
@@ -1546,7 +1599,7 @@ WRITE16_MEMBER( tms340x0_device::host_w )
HOST INTERFACE READS
***************************************************************************/
-READ16_MEMBER( tms340x0_device::host_r )
+u16 tms340x0_device::host_r(offs_t offset)
{
int reg = offset;
unsigned int addr;
diff --git a/src/devices/cpu/tms34010/tms34010.h b/src/devices/cpu/tms34010/tms34010.h
index 299282fe743..313f94d3503 100644
--- a/src/devices/cpu/tms34010/tms34010.h
+++ b/src/devices/cpu/tms34010/tms34010.h
@@ -135,6 +135,7 @@ public:
void set_pixels_per_clock(int pixperclock) { m_pixperclock = pixperclock; }
auto output_int() { return m_output_int_cb.bind(); }
+ auto ioreg_pre_write() { return m_ioreg_pre_write_cb.bind(); }
// Setters for ind16 scanline callback
template <class FunctionClass>
@@ -205,16 +206,15 @@ public:
}
void get_display_params(display_params *params);
- void tms34010_state_postload();
uint32_t tms340x0_ind16(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
uint32_t tms340x0_rgb32(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
- virtual DECLARE_WRITE16_MEMBER(io_register_w) = 0;
- virtual DECLARE_READ16_MEMBER(io_register_r) = 0;
+ virtual void io_register_w(offs_t offset, u16 data, u16 mem_mask = ~u16(0)) = 0;
+ virtual u16 io_register_r(offs_t offset) = 0;
- DECLARE_WRITE16_MEMBER(host_w);
- DECLARE_READ16_MEMBER(host_r);
+ void host_w(offs_t offset, u16 data, u16 mem_mask = ~u16(0));
+ u16 host_r(offs_t offset);
TIMER_CALLBACK_MEMBER(internal_interrupt_callback);
TIMER_CALLBACK_MEMBER(scanline_callback);
@@ -292,11 +292,12 @@ protected:
};
// construction/destruction
- tms340x0_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock);
+ tms340x0_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock, address_map_constructor internal_regs_map = address_map_constructor());
// device-level overrides
virtual void device_start() override;
virtual void device_reset() override;
+ virtual void device_post_load() override;
// device_execute_interface overrides
virtual uint32_t execute_min_cycles() const override { return 1; }
@@ -367,6 +368,7 @@ protected:
scanline_ind16_cb_delegate m_scanline_ind16_cb;
scanline_rgb32_cb_delegate m_scanline_rgb32_cb;
devcb_write_line m_output_int_cb; /* output interrupt callback */
+ devcb_write16 m_ioreg_pre_write_cb;
shiftreg_in_cb_delegate m_to_shiftreg_cb; /* shift register write */
shiftreg_out_cb_delegate m_from_shiftreg_cb; /* shift register read */
@@ -1050,13 +1052,14 @@ public:
tms34010_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
/* Reads & writes to the 34010 I/O registers; place at 0xc0000000 */
- virtual DECLARE_WRITE16_MEMBER( io_register_w ) override;
- virtual DECLARE_READ16_MEMBER( io_register_r ) override;
+ virtual void io_register_w(offs_t offset, u16 data, u16 mem_mask = ~u16(0)) override;
+ virtual u16 io_register_r(offs_t offset) override;
protected:
virtual uint64_t execute_clocks_to_cycles(uint64_t clocks) const override { return (clocks + 8 - 1) / 8; }
virtual uint64_t execute_cycles_to_clocks(uint64_t cycles) const override { return (cycles * 8); }
virtual std::unique_ptr<util::disasm_interface> create_disassembler() override;
+ void internal_regs_map(address_map &map);
};
DECLARE_DEVICE_TYPE(TMS34010, tms34010_device)
@@ -1066,14 +1069,15 @@ class tms34020_device : public tms340x0_device
public:
tms34020_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- /* Reads & writes to the 34010 I/O registers; place at 0xc0000000 */
- virtual DECLARE_WRITE16_MEMBER( io_register_w ) override;
- virtual DECLARE_READ16_MEMBER( io_register_r ) override;
+ /* Reads & writes to the 34020 I/O registers; place at 0xc0000000 */
+ virtual void io_register_w(offs_t offset, u16 data, u16 mem_mask = ~u16(0)) override;
+ virtual u16 io_register_r(offs_t offset) override;
protected:
virtual uint64_t execute_clocks_to_cycles(uint64_t clocks) const override { return (clocks + 4 - 1) / 4; }
virtual uint64_t execute_cycles_to_clocks(uint64_t cycles) const override { return (cycles * 4); }
virtual std::unique_ptr<util::disasm_interface> create_disassembler() override;
+ void internal_regs_map(address_map &map);
};
DECLARE_DEVICE_TYPE(TMS34020, tms34020_device)
diff --git a/src/devices/cpu/tms9900/tms9900.cpp b/src/devices/cpu/tms9900/tms9900.cpp
index 8f092a3159d..840fd5d631a 100644
--- a/src/devices/cpu/tms9900/tms9900.cpp
+++ b/src/devices/cpu/tms9900/tms9900.cpp
@@ -182,11 +182,11 @@ tms99xx_device::tms99xx_device(const machine_config &mconfig, device_type type,
: cpu_device(mconfig, type, tag, owner, clock),
m_program_config("program", ENDIANNESS_BIG, data_width, prg_addr_bits),
m_setoffset_config("setoffset", ENDIANNESS_BIG, data_width, prg_addr_bits),
- m_io_config("cru", ENDIANNESS_BIG, 8, cru_addr_bits),
+ m_io_config("cru", ENDIANNESS_LITTLE, 8, cru_addr_bits + 1, 1),
m_prgspace(nullptr),
m_cru(nullptr),
m_prgaddr_mask((1<<prg_addr_bits)-1),
- m_cruaddr_mask((1<<cru_addr_bits)-1),
+ m_cruaddr_mask((2<<cru_addr_bits)-2),
m_clock_out_line(*this),
m_wait_line(*this),
m_holda_line(*this),
@@ -1625,67 +1625,70 @@ void tms99xx_device::register_write()
idempotent (i.e. they must not change the state of the queried device).
Read returns the number of consecutive CRU bits, with increasing CRU address
- from the least significant to the most significant bit; right-aligned
+ from the least significant to the most significant bit; right-aligned (in
+ other words, little-endian as opposed to the big-endian order of memory words).
There seems to be no handling of wait states during CRU operations on the
TMS9900. The TMS9995, in contrast, respects wait states during the transmission
of each single bit.
+ The current emulation of the CRU space involves a 1-bit address shift,
+ reflecting the one-to-one correspondence between CRU bits and words (not
+ bytes) in the lower part of the memory space. (On the TMS9980A and TMS9995,
+ CRUOUT is multiplexed with the least significant address line.) Thus, what
+ TI's documentation calls the software address (the R12 base value plus the
+ bit offset multiplied by 2) is used in address maps and CPU-side operations.
+ MAME's memory architecture automatically translates these to right-justified
+ hardware addresses in the process of decoding offsets for read/write handlers,
+ which is more typical of what peripheral devices expect. (Note also that
+ address spaces do not support data widths narrower than 8 bits, so these
+ handlers must specify 8-bit types despite only one bit being useful.)
+
Usage of this method:
CRU write: First bit is at rightmost position of m_value.
*/
void tms99xx_device::cru_input_operation()
{
- int value, value1;
- int offset, location;
-
- location = (m_cru_address >> 4) & (m_cruaddr_mask>>3);
- offset = (m_cru_address>>1) & 0x07;
+ offs_t cruaddr = m_cru_address & m_cruaddr_mask;
+ uint16_t value = 0;
- // Read 8 bits (containing the desired bits)
- value = m_cru->read_byte(location);
-
- if ((offset + m_count) > 8) // spans two 8 bit cluster
+ for (int i = 0; i < m_count; i++)
{
- // Read next 8 bits
- location = (location + 1) & (m_cruaddr_mask>>3);
- value1 = m_cru->read_byte(location);
- value |= (value1 << 8);
+ // Poll one bit at a time
+ bool cruin = BIT(m_cru->read_byte(cruaddr), 0);
+ if (cruin)
+ value |= 1 << i;
- if ((offset + m_count) > 16) // spans three 8 bit cluster
- {
- // Read next 8 bits
- location = (location + 1) & (m_cruaddr_mask>>3);
- value1 = m_cru->read_byte(location);
- value |= (value1 << 16);
- }
- }
+ if (TRACE_CRU) logerror("CRU input operation, address %04x, value %d\n", cruaddr, cruin ? 1 : 0);
- // On each machine cycle (2 clocks) only one CRU bit is transmitted
- pulse_clock(m_count<<1);
+ // Increment the CRU address
+ cruaddr = (cruaddr + 2) & m_cruaddr_mask;
- // Shift back the bits so that the first bit is at the rightmost place
- m_value = (value >> offset);
+ // On each machine cycle (2 clocks) only one CRU bit is transmitted
+ pulse_clock(2);
+ }
- // Mask out what we want
- m_value &= (0x0000ffff >> (16-m_count));
+ m_value = value;
}
void tms99xx_device::cru_output_operation()
{
- int value;
- int location;
- location = (m_cru_address >> 1) & m_cruaddr_mask;
- value = m_value;
+ offs_t cruaddr = m_cru_address & m_cruaddr_mask;
+ uint16_t value = m_value;
// Write m_count bits from cru_address
- for (int i=0; i < m_count; i++)
+ for (int i = 0; i < m_count; i++)
{
- if (TRACE_CRU) logerror("CRU output operation, address %04x, value %d\n", location<<1, value & 0x01);
- m_cru->write_byte(location, (value & 0x01));
+ if (TRACE_CRU) logerror("CRU output operation, address %04x, value %d\n", cruaddr, BIT(value, 0));
+
+ // Write one bit at a time
+ m_cru->write_byte(cruaddr, BIT(value, 0));
value >>= 1;
- location = (location + 1) & m_cruaddr_mask;
+
+ // Increment the CRU address
+ cruaddr = (cruaddr + 2) & m_cruaddr_mask;
+
pulse_clock(2);
}
}
@@ -2164,6 +2167,7 @@ void tms99xx_device::alu_clr_swpb()
bool setstatus = true;
bool check_ov = true;
+ bool check_c = true;
switch (m_command)
{
@@ -2181,6 +2185,7 @@ void tms99xx_device::alu_clr_swpb()
// LAE
dest_new = ~src_val & 0xffff;
check_ov = false;
+ check_c = false;
break;
case NEG:
// LAECO
@@ -2223,7 +2228,7 @@ void tms99xx_device::alu_clr_swpb()
if (setstatus)
{
if (check_ov) set_status_bit(ST_OV, ((src_val & 0x8000)==sign) && ((dest_new & 0x8000)!=sign));
- set_status_bit(ST_C, (dest_new & 0x10000) != 0);
+ if (check_c) set_status_bit(ST_C, (dest_new & 0x10000) != 0);
m_current_value = dest_new & 0xffff;
compare_and_set_lae(m_current_value, 0);
}
@@ -2515,6 +2520,7 @@ void tms99xx_device::alu_shift()
uint16_t sign = 0;
uint32_t value;
int count;
+ bool check_ov = false;
switch (m_state)
{
@@ -2572,6 +2578,7 @@ void tms99xx_device::alu_shift()
case SLA:
carry = ((value & 0x8000)!=0);
value <<= 1;
+ check_ov = true;
if (carry != ((value&0x8000)!=0)) overflow = true;
break;
case SRC:
@@ -2584,7 +2591,7 @@ void tms99xx_device::alu_shift()
m_current_value = value & 0xffff;
set_status_bit(ST_C, carry);
- set_status_bit(ST_OV, overflow);
+ if (check_ov) set_status_bit(ST_OV, overflow); // only SLA
compare_and_set_lae(m_current_value, 0);
m_address = m_address_saved; // Register address
if (TRACE_STATUS) logerror("ST = %04x (val=%04x)\n", ST, m_current_value);
diff --git a/src/devices/cpu/tms9900/tms9995.cpp b/src/devices/cpu/tms9900/tms9995.cpp
index c83f74ac073..09509f4623e 100644
--- a/src/devices/cpu/tms9900/tms9995.cpp
+++ b/src/devices/cpu/tms9900/tms9995.cpp
@@ -170,7 +170,7 @@ tms9995_device::tms9995_device(const machine_config &mconfig, device_type type,
PC_debug(0),
m_program_config("program", ENDIANNESS_BIG, 8, 16),
m_setoffset_config("setoffset", ENDIANNESS_BIG, 8, 16),
- m_io_config("cru", ENDIANNESS_BIG, 8, 16),
+ m_io_config("cru", ENDIANNESS_LITTLE, 8, 16, 1),
m_prgspace(nullptr),
m_sospace(nullptr),
m_cru(nullptr),
@@ -288,8 +288,6 @@ void tms9995_device::device_start()
save_item(NAME(m_cru_address));
save_item(NAME(m_cru_value));
save_item(NAME(m_cru_first_read));
- save_item(NAME(m_cru_bits_left));
- save_item(NAME(m_cru_read));
save_pointer(NAME(m_flag),16);
save_item(NAME(IR));
save_item(NAME(m_pre_IR));
@@ -1510,10 +1508,13 @@ void tms9995_device::int_prefetch_and_decode()
// If the current command is XOP or BLWP, ignore the interrupt
if (m_command != XOP && m_command != BLWP)
{
- if (m_flag[2] && intmask >= 1) m_int_pending |= PENDING_LEVEL1;
+ // The actual interrupt trigger is an OR of the latch and of
+ // the interrupt line (for INT1 and INT4); see [1],
+ // section 2.3.2.1.3
+ if ((m_int1_active || m_flag[2]) && intmask >= 1) m_int_pending |= PENDING_LEVEL1;
if (m_int_overflow && intmask >= 2) m_int_pending |= PENDING_OVERFLOW;
if (m_flag[3] && intmask >= 3) m_int_pending |= PENDING_DECR;
- if (m_flag[4] && intmask >= 4) m_int_pending |= PENDING_LEVEL4;
+ if ((m_int4_active || m_flag[4]) && intmask >= 4) m_int_pending |= PENDING_LEVEL4;
}
if (m_int_pending!=0)
@@ -1562,7 +1563,7 @@ void tms9995_device::prefetch_and_decode()
m_value_copy = m_current_value;
if (!m_iaq_line.isnull()) m_iaq_line(ASSERT_LINE);
m_address = PC;
- LOGMASKED(LOG_DETAIL, "**** Prefetching new instruction at %04x ****\n", PC);
+ LOGMASKED(LOG_DETAIL, "** Prefetching new instruction at %04x **\n", PC);
}
word_read(); // changes m_mem_phase
@@ -1575,7 +1576,7 @@ void tms9995_device::prefetch_and_decode()
m_current_value = m_value_copy; // restore m_current_value
PC = (PC + 2) & 0xfffe; // advance PC
if (!m_iaq_line.isnull()) m_iaq_line(CLEAR_LINE);
- LOGMASKED(LOG_DETAIL, "++++ Prefetch done ++++\n");
+ LOGMASKED(LOG_DETAIL, "++ Prefetch done ++\n");
}
}
@@ -1688,7 +1689,7 @@ void tms9995_device::service_interrupt()
vectorpos = 0x0008;
m_intmask = 0x0001;
PC = (PC + 2) & 0xfffe;
- LOGMASKED(LOG_INT, "***** MID pending\n");
+ LOGMASKED(LOG_INT, "** MID pending\n");
m_mid_active = false;
}
else
@@ -1698,7 +1699,7 @@ void tms9995_device::service_interrupt()
vectorpos = 0xfffc;
m_int_pending &= ~PENDING_NMI;
m_intmask = 0;
- LOGMASKED(LOG_INT, "***** NMI pending\n");
+ LOGMASKED(LOG_INT, "** NMI pending\n");
}
else
{
@@ -1706,9 +1707,12 @@ void tms9995_device::service_interrupt()
{
vectorpos = 0x0004;
m_int_pending &= ~PENDING_LEVEL1;
- if (!m_int1_active) m_flag[2] = false;
+ // Latches must be reset when the interrupt is serviced
+ // Since the latch is edge-triggered, we should be allowed
+ // to clear it right here, without considering the line state
+ m_flag[2] = false;
m_intmask = 0;
- LOGMASKED(LOG_INT, "***** INT1 pending\n");
+ LOGMASKED(LOG_INT, "** INT1 pending\n");
}
else
{
@@ -1717,7 +1721,7 @@ void tms9995_device::service_interrupt()
vectorpos = 0x0008;
m_int_pending &= ~PENDING_OVERFLOW;
m_intmask = 0x0001;
- LOGMASKED(LOG_INT, "***** OVERFL pending\n");
+ LOGMASKED(LOG_INT, "** OVERFL pending\n");
}
else
{
@@ -1727,15 +1731,16 @@ void tms9995_device::service_interrupt()
m_intmask = 0x0002;
m_int_pending &= ~PENDING_DECR;
m_flag[3] = false;
- LOGMASKED(LOG_DEC, "***** DECR pending\n");
+ LOGMASKED(LOG_DEC, "** DECR pending\n");
}
else
{
vectorpos = 0x0010;
m_intmask = 0x0003;
m_int_pending &= ~PENDING_LEVEL4;
- if (!m_int4_active) m_flag[4] = false;
- LOGMASKED(LOG_INT, "***** INT4 pending\n");
+ // See above for clearing the latch
+ m_flag[4] = false;
+ LOGMASKED(LOG_INT, "** INT4 pending\n");
}
}
}
@@ -1743,7 +1748,7 @@ void tms9995_device::service_interrupt()
}
}
- LOGMASKED(LOG_INT, "********* triggered an interrupt with vector %04x/%04x\n", vectorpos, vectorpos+2);
+ LOGMASKED(LOG_INTD, "*** triggered an interrupt with vector %04x/%04x\n", vectorpos, vectorpos+2);
// just for debugging purposes
if (!m_reset) m_log_interrupt = true;
@@ -2080,8 +2085,7 @@ void tms9995_device::return_with_address_copy()
1FDA MID flag (only indication, does not trigger when set)
The TMS9995 allows for wait states during external CRU access. Therefore
- we read one block of 8 bits in one go (as given by the MESS architecture)
- but we do iterations for each bit, checking every time for the READY line
+ we do iterations for each bit, checking every time for the READY line
in the main loop.
(write)
@@ -2092,8 +2096,8 @@ void tms9995_device::return_with_address_copy()
*/
-#define CRUREADMASK 0x0fff
-#define CRUWRITEMASK 0x7fff
+#define CRUREADMASK 0xfffe
+#define CRUWRITEMASK 0xfffe
void tms9995_device::cru_output_operation()
{
@@ -2129,7 +2133,7 @@ void tms9995_device::cru_output_operation()
// of the CPU. However, no wait states are generated for internal
// accesses. ([1], section 2.3.3.2)
- m_cru->write_byte((m_cru_address >> 1)& CRUWRITEMASK, (m_cru_value & 0x01));
+ m_cru->write_byte(m_cru_address & CRUWRITEMASK, (m_cru_value & 0x01));
m_cru_value >>= 1;
m_cru_address = (m_cru_address + 2) & 0xfffe;
m_count--;
@@ -2150,55 +2154,29 @@ void tms9995_device::cru_output_operation()
void tms9995_device::cru_input_operation()
{
- uint16_t crubit;
- uint8_t crubyte;
-
- // Reading is different, since MESS uses 8 bit transfers
- // We read 8 bits in one go, then iterate another min(n-1,7) times to allow
- // for wait states.
-
- // read_byte for CRU delivers the first bit on the rightmost position
-
- int offset = (m_cru_address>>1) & 0x07;
-
- if (m_cru_first_read || m_cru_bits_left == 0)
+ if (m_cru_first_read)
{
- // Read next 8 bits
- // 00000000 0rrrrrrr r
- // v
- // ........ ........ X....... ........
- //
- crubyte = m_cru->read_byte((m_cru_address >> 4)& CRUREADMASK);
- LOGMASKED(LOG_DETAIL, "Need to get next 8 bits (addresses %04x-%04x): %02x\n", (m_cru_address&0xfff0)+14, m_cru_address&0xfff0, crubyte);
- m_cru_read = crubyte << 15;
- m_cru_bits_left = 8;
-
- if (m_cru_first_read)
- {
- m_cru_read >>= offset;
- m_cru_bits_left -= offset;
- m_cru_value = 0;
- m_cru_first_read = false;
- m_pass = m_count;
- }
- LOGMASKED(LOG_DETAIL, "adjusted value for shift: %06x\n", m_cru_read);
+ m_cru_value = 0;
+ m_cru_first_read = false;
+ m_pass = m_count;
}
- crubit = (m_cru_read & 0x8000);
+ // Read a single CRU bit
+ bool crubit = BIT(m_cru->read_byte(m_cru_address & CRUREADMASK), 0);
m_cru_value = (m_cru_value >> 1) & 0x7fff;
// During internal reading, the CRUIN line will be ignored. We emulate this
// by overwriting the bit which we got from outside. Also, READY is ignored.
if (m_cru_address == 0x1fda)
{
- crubit = m_mid_flag? 0x8000 : 0x0000;
+ crubit = m_mid_flag;
m_check_ready = false;
}
else
{
if ((m_cru_address & 0xffe0)==0x1ee0)
{
- crubit = (m_flag[(m_cru_address>>1)&0x000f]==true)? 0x8000 : 0x0000;
+ crubit = m_flag[(m_cru_address>>1)&0x000f];
m_check_ready = false;
}
else
@@ -2207,18 +2185,14 @@ void tms9995_device::cru_input_operation()
}
}
- LOGMASKED(LOG_CRU, "CRU input operation, address %04x, value %d\n", m_cru_address, (crubit & 0x8000)>>15);
+ LOGMASKED(LOG_CRU, "CRU input operation, address %04x, value %d\n", m_cru_address, crubit ? 1 : 0);
- m_cru_value |= crubit;
+ if (crubit)
+ m_cru_value |= 0x8000;
m_cru_address = (m_cru_address + 2) & 0xfffe;
- m_cru_bits_left--;
- if (m_pass > 1)
- {
- m_cru_read >>= 1;
- }
- else
+ if (m_pass == 1)
{
// This is the final shift. For both byte and word length transfers,
// the first bit is always m_cru_value & 0x0001.
@@ -3116,6 +3090,7 @@ void tms9995_device::alu_shift()
uint16_t sign = 0;
uint32_t value;
int count;
+ bool check_ov = false;
switch (m_inst_state)
{
@@ -3164,6 +3139,7 @@ void tms9995_device::alu_shift()
case SLA:
carry = ((value & 0x8000)!=0);
value <<= 1;
+ check_ov = true;
if (carry != ((value&0x8000)!=0)) overflow = true;
break;
case SRC:
@@ -3176,7 +3152,7 @@ void tms9995_device::alu_shift()
m_current_value = value & 0xffff;
set_status_bit(ST_C, carry);
- set_status_bit(ST_OV, overflow);
+ if (check_ov) set_status_bit(ST_OV, overflow); // only SLA
compare_and_set_lae(m_current_value, 0);
m_address = m_address_saved; // Register address
LOGMASKED(LOG_STATUS, "ST = %04x (val=%04x)\n", ST, m_current_value);
@@ -3194,6 +3170,7 @@ void tms9995_device::alu_single_arithm()
uint32_t src_val = m_current_value & 0x0000ffff;
uint16_t sign = 0;
bool check_ov = true;
+ bool check_c = true;
switch (m_command)
{
@@ -3244,6 +3221,7 @@ void tms9995_device::alu_single_arithm()
// LAE
dest_new = ~src_val & 0xffff;
check_ov = false;
+ check_c = false;
break;
case NEG:
// LAECO
@@ -3271,7 +3249,7 @@ void tms9995_device::alu_single_arithm()
}
if (check_ov) set_status_bit(ST_OV, ((src_val & 0x8000)==sign) && ((dest_new & 0x8000)!=sign));
- set_status_bit(ST_C, (dest_new & 0x10000) != 0);
+ if (check_c) set_status_bit(ST_C, (dest_new & 0x10000) != 0);
m_current_value = dest_new & 0xffff;
compare_and_set_lae(m_current_value, 0);
diff --git a/src/devices/cpu/tms9900/tms9995.h b/src/devices/cpu/tms9900/tms9995.h
index 72dfc2960a1..531e5208a41 100644
--- a/src/devices/cpu/tms9900/tms9995.h
+++ b/src/devices/cpu/tms9900/tms9995.h
@@ -245,8 +245,6 @@ private:
uint16_t m_cru_address;
uint16_t m_cru_value;
bool m_cru_first_read;
- int m_cru_bits_left;
- uint32_t m_cru_read;
// CPU-internal CRU flags
bool m_flag[16];
diff --git a/src/devices/cpu/unsp/unsp.cpp b/src/devices/cpu/unsp/unsp.cpp
index af964f713f9..7d1359896af 100644
--- a/src/devices/cpu/unsp/unsp.cpp
+++ b/src/devices/cpu/unsp/unsp.cpp
@@ -14,28 +14,41 @@
#include "emu.h"
#include "unsp.h"
-#include "unspdasm.h"
+#include "unspfe.h"
+
#include "debugger.h"
+#include "unspdefs.h"
+#include "unspdasm.h"
+
DEFINE_DEVICE_TYPE(UNSP, unsp_device, "unsp", "SunPlus u'nSP")
+/* size of the execution code cache */
+#define CACHE_SIZE (64 * 1024 * 1024)
unsp_device::unsp_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
: cpu_device(mconfig, UNSP, tag, owner, clock)
, m_program_config("program", ENDIANNESS_BIG, 16, 23, -1)
- , m_enable_irq(false)
- , m_enable_fiq(false)
- , m_irq(false)
- , m_fiq(false)
- , m_curirq(0)
- , m_sirq(0)
- , m_sb(0)
, m_program(nullptr)
- , m_icount(0)
+ , m_core(nullptr)
, m_debugger_temp(0)
-#if UNSP_LOG_OPCODES
+#if UNSP_LOG_OPCODES || UNSP_LOG_REGS
, m_log_ops(0)
#endif
+ , m_cache(CACHE_SIZE + sizeof(unsp_device))
+ , m_drcuml(nullptr)
+ , m_drcfe(nullptr)
+ , m_drcoptions(0)
+ , m_cache_dirty(0)
+ , m_entry(nullptr)
+ , m_nocode(nullptr)
+ , m_out_of_cycles(nullptr)
+ , m_check_interrupts(nullptr)
+ , m_trigger_fiq(nullptr)
+ , m_trigger_irq(nullptr)
+ , m_mem_read(nullptr)
+ , m_mem_write(nullptr)
+ , m_enable_drc(false)
{
}
@@ -51,29 +64,6 @@ std::unique_ptr<util::disasm_interface> unsp_device::create_disassembler()
return std::make_unique<unsp_disassembler>();
}
-
-/*****************************************************************************/
-
-#define OP0 (op >> 12)
-#define OPA ((op >> 9) & 7)
-#define OP1 ((op >> 6) & 7)
-#define OPN ((op >> 3) & 7)
-#define OPB (op & 7)
-#define OPIMM (op & 0x3f)
-
-#define UNSP_LPC (((UNSP_REG(SR) & 0x3f) << 16) | UNSP_REG(PC))
-
-#define UNSP_REG(reg) m_r[UNSP_##reg - 1]
-#define UNSP_REG_I(reg) m_r[reg]
-#define UNSP_LREG_I(reg) (((UNSP_REG(SR) << 6) & 0x3f0000) | UNSP_REG_I(reg))
-
-#define UNSP_N 0x0200
-#define UNSP_Z 0x0100
-#define UNSP_S 0x0080
-#define UNSP_C 0x0040
-
-/*****************************************************************************/
-
void unsp_device::unimplemented_opcode(uint16_t op)
{
fatalerror("UNSP: unknown opcode %04x at %04x\n", op, UNSP_LPC);
@@ -88,6 +78,9 @@ uint16_t unsp_device::read16(uint32_t address)
void unsp_device::write16(uint32_t address, uint16_t data)
{
+#if UNSP_LOG_REGS
+ log_write(address, data);
+#endif
m_program->write_word(address, data);
}
@@ -95,60 +88,141 @@ void unsp_device::write16(uint32_t address, uint16_t data)
void unsp_device::device_start()
{
- memset(m_r, 0, sizeof(uint16_t) * 16);
- m_enable_irq = false;
- m_enable_fiq = false;
- m_irq = false;
- m_fiq = false;
- m_curirq = 0;
- m_sirq = 0;
- m_sb = 0;
- memset(m_saved_sb, 0, sizeof(uint8_t) * 3);
+ m_core = (internal_unsp_state *)m_cache.alloc_near(sizeof(internal_unsp_state));
+ memset(m_core, 0, sizeof(internal_unsp_state));
+
+#if ENABLE_UNSP_DRC
+ m_enable_drc = allow_drc();
+#else
+ m_enable_drc = false;
+#endif
+
+#if UNSP_LOG_REGS
+ if (m_enable_drc)
+ m_log_file = fopen("unsp_drc.bin", "wb");
+ else
+ m_log_file = fopen("unsp_interp.bin", "wb");
+#endif
+
m_debugger_temp = 0;
m_program = &space(AS_PROGRAM);
-
- state_add(STATE_GENFLAGS, "GENFLAGS", UNSP_REG(SR)).callimport().callexport().formatstr("%4s").noshow();
- state_add(UNSP_SP, "SP", UNSP_REG(SP)).formatstr("%04X");
- state_add(UNSP_R1, "R1", UNSP_REG(R1)).formatstr("%04X");
- state_add(UNSP_R2, "R2", UNSP_REG(R2)).formatstr("%04X");
- state_add(UNSP_R3, "R3", UNSP_REG(R3)).formatstr("%04X");
- state_add(UNSP_R4, "R4", UNSP_REG(R4)).formatstr("%04X");
- state_add(UNSP_BP, "BP", UNSP_REG(BP)).formatstr("%04X");
- state_add(UNSP_SR, "SR", UNSP_REG(SR)).formatstr("%04X");
+ auto cache = m_program->cache<1, -1, ENDIANNESS_BIG>();
+ m_pr16 = [cache](offs_t address) -> u16 { return cache->read_word(address); };
+ m_prptr = [cache](offs_t address) -> const void * { return cache->read_ptr(address); };
+
+ uint32_t umlflags = 0;
+ m_drcuml = std::make_unique<drcuml_state>(*this, m_cache, umlflags, 1, 23, 0);
+
+ // add UML symbols-
+ m_drcuml->symbol_add(&m_core->m_r[REG_SP], sizeof(uint32_t), "SP");
+ m_drcuml->symbol_add(&m_core->m_r[REG_R1], sizeof(uint32_t), "R1");
+ m_drcuml->symbol_add(&m_core->m_r[REG_R2], sizeof(uint32_t), "R2");
+ m_drcuml->symbol_add(&m_core->m_r[REG_R3], sizeof(uint32_t), "R3");
+ m_drcuml->symbol_add(&m_core->m_r[REG_R4], sizeof(uint32_t), "R4");
+ m_drcuml->symbol_add(&m_core->m_r[REG_BP], sizeof(uint32_t), "BP");
+ m_drcuml->symbol_add(&m_core->m_r[REG_SR], sizeof(uint32_t), "SR");
+ m_drcuml->symbol_add(&m_core->m_r[REG_PC], sizeof(uint32_t), "PC");
+ m_drcuml->symbol_add(&m_core->m_enable_irq, sizeof(uint32_t), "IRQE");
+ m_drcuml->symbol_add(&m_core->m_enable_fiq, sizeof(uint32_t), "FIQE");
+ m_drcuml->symbol_add(&m_core->m_irq, sizeof(uint32_t), "IRQ");
+ m_drcuml->symbol_add(&m_core->m_fiq, sizeof(uint32_t), "FIQ");
+ m_drcuml->symbol_add(&m_core->m_sb, sizeof(uint32_t), "SB");
+ m_drcuml->symbol_add(&m_core->m_icount, sizeof(m_core->m_icount), "icount");
+
+ /* initialize the front-end helper */
+ m_drcfe = std::make_unique<unsp_frontend>(this, COMPILE_BACKWARDS_BYTES, COMPILE_FORWARDS_BYTES, SINGLE_INSTRUCTION_MODE ? 1 : COMPILE_MAX_SEQUENCE);
+
+ /* mark the cache dirty so it is updated on next execute */
+ m_cache_dirty = true;
+
+ // register our state for the debugger
+ state_add(STATE_GENFLAGS, "GENFLAGS", m_core->m_r[REG_SR]).callimport().callexport().formatstr("%4s").noshow();
+ state_add(UNSP_SP, "SP", m_core->m_r[REG_SP]).formatstr("%04X");
+ state_add(UNSP_R1, "R1", m_core->m_r[REG_R1]).formatstr("%04X");
+ state_add(UNSP_R2, "R2", m_core->m_r[REG_R2]).formatstr("%04X");
+ state_add(UNSP_R3, "R3", m_core->m_r[REG_R3]).formatstr("%04X");
+ state_add(UNSP_R4, "R4", m_core->m_r[REG_R4]).formatstr("%04X");
+ state_add(UNSP_BP, "BP", m_core->m_r[REG_BP]).formatstr("%04X");
+ state_add(UNSP_SR, "SR", m_core->m_r[REG_SR]).formatstr("%04X");
state_add(UNSP_PC, "PC", m_debugger_temp).callimport().callexport().formatstr("%06X");
- state_add(UNSP_IRQ_EN, "IRQE", m_enable_irq).formatstr("%1u");
- state_add(UNSP_FIQ_EN, "FIQE", m_enable_fiq).formatstr("%1u");
- state_add(UNSP_IRQ, "IRQ", m_irq).formatstr("%1u");
- state_add(UNSP_FIQ, "FIQ", m_fiq).formatstr("%1u");
- state_add(UNSP_SB, "SB", m_sb).formatstr("%1u");
-#if UNSP_LOG_OPCODES
+ state_add(UNSP_IRQ_EN, "IRQE", m_core->m_enable_irq).formatstr("%1u");
+ state_add(UNSP_FIQ_EN, "FIQE", m_core->m_enable_fiq).formatstr("%1u");
+ state_add(UNSP_IRQ, "IRQ", m_core->m_irq).formatstr("%1u");
+ state_add(UNSP_FIQ, "FIQ", m_core->m_fiq).formatstr("%1u");
+ state_add(UNSP_SB, "SB", m_core->m_sb).formatstr("%1u");
+#if UNSP_LOG_OPCODES || UNSP_LOG_REGS
state_add(UNSP_LOG_OPS,"LOG", m_log_ops).formatstr("%1u");
#endif
state_add(STATE_GENPC, "GENPC", m_debugger_temp).callexport().noshow();
state_add(STATE_GENPCBASE, "CURPC", m_debugger_temp).callexport().noshow();
- set_icountptr(m_icount);
-
- save_item(NAME(m_r));
- save_item(NAME(m_enable_irq));
- save_item(NAME(m_enable_fiq));
- save_item(NAME(m_irq));
- save_item(NAME(m_fiq));
- save_item(NAME(m_curirq));
- save_item(NAME(m_sirq));
- save_item(NAME(m_sb));
- save_item(NAME(m_saved_sb));
+ save_item(NAME(m_core->m_r));
+ save_item(NAME(m_core->m_enable_irq));
+ save_item(NAME(m_core->m_enable_fiq));
+ save_item(NAME(m_core->m_irq));
+ save_item(NAME(m_core->m_fiq));
+ save_item(NAME(m_core->m_curirq));
+ save_item(NAME(m_core->m_sirq));
+ save_item(NAME(m_core->m_sb));
+ save_item(NAME(m_core->m_saved_sb));
+
+ set_icountptr(m_core->m_icount);
+}
+
+void unsp_device::device_reset()
+{
+ memset(m_core->m_r, 0, sizeof(uint32_t) * 8);
+
+ m_core->m_r[REG_PC] = read16(0xfff7);
+ m_core->m_enable_irq = 0;
+ m_core->m_enable_fiq = 0;
+ m_core->m_irq = 0;
+ m_core->m_fiq = 0;
}
+void unsp_device::device_stop()
+{
+ if (m_drcfe != nullptr)
+ {
+ m_drcfe = nullptr;
+ }
+ if (m_drcuml != nullptr)
+ {
+ m_drcuml = nullptr;
+ }
+#if UNSP_LOG_REGS
+ fclose(m_log_file);
+#endif
+}
+
+#if UNSP_LOG_REGS
+void unsp_device::log_regs()
+{
+ if (m_log_ops == 0)
+ return;
+ fwrite(m_core->m_r, sizeof(uint32_t), 8, m_log_file);
+ fwrite(&m_core->m_sb, sizeof(uint32_t), 1, m_log_file);
+ fwrite(&m_core->m_icount, sizeof(uint32_t), 1, m_log_file);
+}
+
+void unsp_device::log_write(uint32_t addr, uint32_t data)
+{
+ addr |= 0x80000000;
+ fwrite(&addr, sizeof(uint32_t), 1, m_log_file);
+ fwrite(&data, sizeof(uint32_t), 1, m_log_file);
+}
+
+#endif
+
void unsp_device::state_string_export(const device_state_entry &entry, std::string &str) const
{
switch (entry.index())
{
case STATE_GENFLAGS:
{
- const uint16_t sr = UNSP_REG(SR);
+ const uint16_t sr = m_core->m_r[REG_SR];
str = string_format("%c%c%c%c", (sr & UNSP_N) ? 'N' : ' ', (sr & UNSP_Z) ? 'Z' : ' ', (sr & UNSP_S) ? 'S' : ' ', (sr & UNSP_C) ? 'C' : ' ');
}
}
@@ -171,105 +245,91 @@ void unsp_device::state_import(const device_state_entry &entry)
switch (entry.index())
{
case UNSP_PC:
- UNSP_REG(PC) = m_debugger_temp & 0x0000ffff;
- UNSP_REG(SR) = (UNSP_REG(SR) & 0xffc0) | ((m_debugger_temp & 0x003f0000) >> 16);
+ m_core->m_r[REG_PC] = m_debugger_temp & 0x0000ffff;
+ m_core->m_r[REG_SR] = (m_core->m_r[REG_SR] & 0xffc0) | ((m_debugger_temp & 0x003f0000) >> 16);
break;
}
}
-void unsp_device::device_reset()
-{
- memset(m_r, 0, sizeof(uint16_t) * 16);
-
- UNSP_REG(PC) = read16(0xfff7);
- m_enable_irq = false;
- m_enable_fiq = false;
- m_irq = false;
- m_fiq = false;
-}
-
/*****************************************************************************/
-void unsp_device::update_nz(uint32_t value)
+void unsp_device::update_nzsc(uint32_t value, uint16_t r0, uint16_t r1)
{
- UNSP_REG(SR) &= ~(UNSP_N | UNSP_Z);
- if(value & 0x8000)
- {
- UNSP_REG(SR) |= UNSP_N;
- }
+ m_core->m_r[REG_SR] &= ~(UNSP_N | UNSP_Z | UNSP_S | UNSP_C);
+ if (int16_t(r0) < int16_t(~r1))
+ m_core->m_r[REG_SR] |= UNSP_S;
+ if (BIT(value, 15))
+ m_core->m_r[REG_SR] |= UNSP_N;
if((uint16_t)value == 0)
- {
- UNSP_REG(SR) |= UNSP_Z;
- }
+ m_core->m_r[REG_SR] |= UNSP_Z;
+ if (BIT(value, 16))
+ m_core->m_r[REG_SR] |= UNSP_C;
}
-void unsp_device::update_sc(uint32_t value, uint16_t r0, uint16_t r1)
+void unsp_device::update_nz(uint32_t value)
{
- UNSP_REG(SR) &= ~(UNSP_C | UNSP_S);
- if(value != (uint16_t)value)
- {
- UNSP_REG(SR) |= UNSP_C;
- }
-
- if((int16_t)r0 < (int16_t)r1)
- {
- UNSP_REG(SR) |= UNSP_S;
- }
+ m_core->m_r[REG_SR] &= ~(UNSP_N | UNSP_Z);
+ if(value & 0x8000)
+ m_core->m_r[REG_SR] |= UNSP_N;
+ if((uint16_t)value == 0)
+ m_core->m_r[REG_SR] |= UNSP_Z;
}
-void unsp_device::push(uint16_t value, uint16_t *reg)
+void unsp_device::push(uint32_t value, uint32_t *reg)
{
- write16((*reg)--, value);
+ write16(*reg, (uint16_t)value);
+ *reg = (uint16_t)(*reg - 1);
}
-uint16_t unsp_device::pop(uint16_t *reg)
+uint16_t unsp_device::pop(uint32_t *reg)
{
- return read16(++(*reg));
+ *reg = (uint16_t)(*reg + 1);
+ return (uint16_t)read16(*reg);
}
void unsp_device::trigger_fiq()
{
- if (!m_enable_fiq || m_fiq || m_irq)
+ if (!m_core->m_enable_fiq || m_core->m_fiq || m_core->m_irq)
{
return;
}
- m_fiq = true;
+ m_core->m_fiq = 1;
- m_saved_sb[m_irq ? 1 : 0] = m_sb;
- m_sb = m_saved_sb[2];
+ m_core->m_saved_sb[m_core->m_irq ? 1 : 0] = m_core->m_sb;
+ m_core->m_sb = m_core->m_saved_sb[2];
- push(UNSP_REG(PC), &UNSP_REG(SP));
- push(UNSP_REG(SR), &UNSP_REG(SP));
- UNSP_REG(PC) = read16(0xfff6);
- UNSP_REG(SR) = 0;
+ push(m_core->m_r[REG_PC], &m_core->m_r[REG_SP]);
+ push(m_core->m_r[REG_SR], &m_core->m_r[REG_SP]);
+ m_core->m_r[REG_PC] = read16(0xfff6);
+ m_core->m_r[REG_SR] = 0;
}
void unsp_device::trigger_irq(int line)
{
- if (!m_enable_irq || m_irq || m_fiq)
+ if (!m_core->m_enable_irq || m_core->m_irq || m_core->m_fiq)
return;
- m_irq = true;
+ m_core->m_irq = 1;
- m_saved_sb[0] = m_sb;
- m_sb = m_saved_sb[1];
+ m_core->m_saved_sb[0] = m_core->m_sb;
+ m_core->m_sb = m_core->m_saved_sb[1];
- push(UNSP_REG(PC), &UNSP_REG(SP));
- push(UNSP_REG(SR), &UNSP_REG(SP));
- UNSP_REG(PC) = read16(0xfff8 + line);
- UNSP_REG(SR) = 0;
+ push(m_core->m_r[REG_PC], &m_core->m_r[REG_SP]);
+ push(m_core->m_r[REG_SR], &m_core->m_r[REG_SP]);
+ m_core->m_r[REG_PC] = read16(0xfff8 + line);
+ m_core->m_r[REG_SR] = 0;
}
void unsp_device::check_irqs()
{
- if (!m_sirq)
+ if (!m_core->m_sirq)
return;
int highest_irq = -1;
for (int i = 0; i <= 8; i++)
{
- if (BIT(m_sirq, i))
+ if (BIT(m_core->m_sirq, i))
{
highest_irq = i;
break;
@@ -285,9 +345,9 @@ void unsp_device::check_irqs()
void unsp_device::add_lpc(const int32_t offset)
{
const uint32_t new_lpc = UNSP_LPC + offset;
- UNSP_REG(PC) = (uint16_t)new_lpc;
- UNSP_REG(SR) &= 0xffc0;
- UNSP_REG(SR) |= (new_lpc >> 16) & 0x3f;
+ m_core->m_r[REG_PC] = (uint16_t)new_lpc;
+ m_core->m_r[REG_SR] &= 0xffc0;
+ m_core->m_r[REG_SR] |= (new_lpc >> 16) & 0x3f;
}
inline void unsp_device::execute_one(const uint16_t op)
@@ -297,147 +357,154 @@ inline void unsp_device::execute_one(const uint16_t op)
uint16_t r1 = 0;
uint32_t r2 = 0;
- const uint8_t lower_op = (OP1 << 4) | OP0;
+ const uint16_t op0 = (op >> 12) & 15;
+ const uint16_t opa = (op >> 9) & 7;
+ const uint16_t op1 = (op >> 6) & 7;
+ const uint16_t opn = (op >> 3) & 7;
+ const uint16_t opb = op & 7;
+
+ const uint8_t lower_op = (op1 << 4) | op0;
- if(OP0 < 0xf && OPA == 0x7 && OP1 < 2)
+ if(op0 < 0xf && opa == 0x7 && op1 < 2)
{
- switch(OP0)
+ const uint32_t opimm = op & 0x3f;
+ switch(op0)
{
case 0: // JB
- if(!(UNSP_REG(SR) & UNSP_C))
+ if(!(m_core->m_r[REG_SR] & UNSP_C))
{
- m_icount -= 4;
- add_lpc((OP1 == 0) ? OPIMM : (0 - OPIMM));
+ m_core->m_icount -= 4;
+ add_lpc((op1 == 0) ? opimm : (0 - opimm));
}
else
{
- m_icount -= 2;
+ m_core->m_icount -= 2;
}
return;
case 1: // JAE
- if(UNSP_REG(SR) & UNSP_C)
+ if(m_core->m_r[REG_SR] & UNSP_C)
{
- m_icount -= 4;
- add_lpc((OP1 == 0) ? OPIMM : (0 - OPIMM));
+ m_core->m_icount -= 4;
+ add_lpc((op1 == 0) ? opimm : (0 - opimm));
}
else
{
- m_icount -= 2;
+ m_core->m_icount -= 2;
}
return;
case 2: // JGE
- if(!(UNSP_REG(SR) & UNSP_S))
+ if(!(m_core->m_r[REG_SR] & UNSP_S))
{
- m_icount -= 4;
- add_lpc((OP1 == 0) ? OPIMM : (0 - OPIMM));
+ m_core->m_icount -= 4;
+ add_lpc((op1 == 0) ? opimm : (0 - opimm));
}
else
{
- m_icount -= 2;
+ m_core->m_icount -= 2;
}
return;
case 3: // JL
- if(UNSP_REG(SR) & UNSP_S)
+ if(m_core->m_r[REG_SR] & UNSP_S)
{
- m_icount -= 4;
- add_lpc((OP1 == 0) ? OPIMM : (0 - OPIMM));
+ m_core->m_icount -= 4;
+ add_lpc((op1 == 0) ? opimm : (0 - opimm));
}
else
{
- m_icount -= 2;
+ m_core->m_icount -= 2;
}
return;
case 4: // JNE
- if(!(UNSP_REG(SR) & UNSP_Z))
+ if(!(m_core->m_r[REG_SR] & UNSP_Z))
{
- m_icount -= 4;
- add_lpc((OP1 == 0) ? OPIMM : (0 - OPIMM));
+ m_core->m_icount -= 4;
+ add_lpc((op1 == 0) ? opimm : (0 - opimm));
}
else
{
- m_icount -= 2;
+ m_core->m_icount -= 2;
}
return;
case 5: // JE
- if(UNSP_REG(SR) & UNSP_Z)
+ if(m_core->m_r[REG_SR] & UNSP_Z)
{
- m_icount -= 4;
- add_lpc((OP1 == 0) ? OPIMM : (0 - OPIMM));
+ m_core->m_icount -= 4;
+ add_lpc((op1 == 0) ? opimm : (0 - opimm));
}
else
{
- m_icount -= 2;
+ m_core->m_icount -= 2;
}
return;
case 6: // JPL
- if(!(UNSP_REG(SR) & UNSP_N))
+ if(!(m_core->m_r[REG_SR] & UNSP_N))
{
- m_icount -= 4;
- add_lpc((OP1 == 0) ? OPIMM : (0 - OPIMM));
+ m_core->m_icount -= 4;
+ add_lpc((op1 == 0) ? opimm : (0 - opimm));
}
else
{
- m_icount -= 2;
+ m_core->m_icount -= 2;
}
return;
case 7: // JMI
- if(UNSP_REG(SR) & UNSP_N)
+ if(m_core->m_r[REG_SR] & UNSP_N)
{
- m_icount -= 4;
- add_lpc((OP1 == 0) ? OPIMM : (0 - OPIMM));
+ m_core->m_icount -= 4;
+ add_lpc((op1 == 0) ? opimm : (0 - opimm));
}
else
{
- m_icount -= 2;
+ m_core->m_icount -= 2;
}
return;
case 8: // JBE
- if((UNSP_REG(SR) & (UNSP_Z | UNSP_C)) != UNSP_C)
+ if((m_core->m_r[REG_SR] & (UNSP_Z | UNSP_C)) != UNSP_C) // branch if (!UNSP_Z && !UNSP_C) || UNSP_Z
{
- m_icount -= 4;
- add_lpc((OP1 == 0) ? OPIMM : (0 - OPIMM));
+ m_core->m_icount -= 4;
+ add_lpc((op1 == 0) ? opimm : (0 - opimm));
}
else
{
- m_icount -= 2;
+ m_core->m_icount -= 2;
}
return;
case 9: // JA
- if((UNSP_REG(SR) & (UNSP_Z | UNSP_C)) == UNSP_C)
+ if((m_core->m_r[REG_SR] & (UNSP_Z | UNSP_C)) == UNSP_C) // branch if !UNSP_Z && UNSP_C
{
- m_icount -= 4;
- add_lpc((OP1 == 0) ? OPIMM : (0 - OPIMM));
+ m_core->m_icount -= 4;
+ add_lpc((op1 == 0) ? opimm : (0 - opimm));
}
else
{
- m_icount -= 2;
+ m_core->m_icount -= 2;
}
return;
case 10: // JLE
- if(UNSP_REG(SR) & (UNSP_Z | UNSP_S))
+ if(m_core->m_r[REG_SR] & (UNSP_Z | UNSP_S))
{
- m_icount -= 4;
- add_lpc((OP1 == 0) ? OPIMM : (0 - OPIMM));
+ m_core->m_icount -= 4;
+ add_lpc((op1 == 0) ? opimm : (0 - opimm));
}
else
{
- m_icount -= 2;
+ m_core->m_icount -= 2;
}
return;
case 11: // JG
- if(!(UNSP_REG(SR) & (UNSP_Z | UNSP_S)))
+ if(!(m_core->m_r[REG_SR] & (UNSP_Z | UNSP_S)))
{
- m_icount -= 4;
- add_lpc((OP1 == 0) ? OPIMM : (0 - OPIMM));
+ m_core->m_icount -= 4;
+ add_lpc((op1 == 0) ? opimm : (0 - opimm));
}
else
{
- m_icount -= 2;
+ m_core->m_icount -= 2;
}
return;
case 14: // JMP
- add_lpc((OP1 == 0) ? OPIMM : (0 - OPIMM));
- m_icount -= 4;
+ add_lpc((op1 == 0) ? opimm : (0 - opimm));
+ m_core->m_icount -= 4;
return;
default:
unimplemented_opcode(op);
@@ -446,69 +513,68 @@ inline void unsp_device::execute_one(const uint16_t op)
}
else if (lower_op == 0x2d) // Push
{
- r0 = OPN;
- r1 = OPA;
- m_icount -= 4 + 2 * r0;
+ r0 = opn;
+ r1 = opa;
+ m_core->m_icount -= 4 + 2 * r0;
while (r0--)
{
- push(UNSP_REG_I(r1--), &UNSP_REG_I(OPB));
+ push(m_core->m_r[r1--], &m_core->m_r[opb]);
}
return;
}
- else if (lower_op == 0x29) // Pop
+ else if (lower_op == 0x29)
{
if (op == 0x9a98) // reti
{
- m_icount -= 8;
- UNSP_REG(SR) = pop(&UNSP_REG(SP));
- UNSP_REG(PC) = pop(&UNSP_REG(SP));
+ m_core->m_icount -= 8;
+ m_core->m_r[REG_SR] = pop(&m_core->m_r[REG_SP]);
+ m_core->m_r[REG_PC] = pop(&m_core->m_r[REG_SP]);
- if(m_fiq)
+ if(m_core->m_fiq)
{
- m_fiq = false;
- m_saved_sb[2] = m_sb;
- m_sb = m_saved_sb[m_irq ? 1 : 0];
+ m_core->m_fiq = 0;
+ m_core->m_saved_sb[2] = m_core->m_sb;
+ m_core->m_sb = m_core->m_saved_sb[m_core->m_irq ? 1 : 0];
}
- else if(m_irq)
+ else if(m_core->m_irq)
{
- m_irq = false;
- m_saved_sb[1] = m_sb;
- m_sb = m_saved_sb[0];
+ m_core->m_irq = 0;
+ m_core->m_saved_sb[1] = m_core->m_sb;
+ m_core->m_sb = m_core->m_saved_sb[0];
}
- m_curirq = 0;
-
+ m_core->m_curirq = 0;
check_irqs();
return;
}
- else
+ else // pop
{
- r0 = OPN;
- r1 = OPA;
- m_icount -= 4 + 2 * r0;
+ r0 = opn;
+ r1 = opa;
+ m_core->m_icount -= 4 + 2 * r0;
while (r0--)
{
- UNSP_REG_I(++r1) = pop(&UNSP_REG_I(OPB));
+ m_core->m_r[++r1] = pop(&m_core->m_r[opb]);
}
return;
}
}
- else if (OP0 == 0xf)
+ else if (op0 == 0xf)
{
- switch (OP1)
+ switch (op1)
{
case 0x00: // Multiply, Unsigned * Signed
- if(OPN == 1 && OPA != 7)
+ if(opn == 1 && opa != 7)
{
- m_icount -= 12;
- lres = UNSP_REG_I(OPA) * UNSP_REG_I(OPB);
- if(UNSP_REG_I(OPB) & 0x8000)
+ m_core->m_icount -= 12;
+ lres = m_core->m_r[opa] * m_core->m_r[opb];
+ if(m_core->m_r[opb] & 0x8000)
{
- lres -= UNSP_REG_I(OPA) << 16;
+ lres -= m_core->m_r[opa] << 16;
}
- UNSP_REG(R4) = lres >> 16;
- UNSP_REG(R3) = (uint16_t)lres;
+ m_core->m_r[REG_R4] = lres >> 16;
+ m_core->m_r[REG_R3] = (uint16_t)lres;
}
else
{
@@ -517,16 +583,16 @@ inline void unsp_device::execute_one(const uint16_t op)
return;
case 0x01: // Call
- if(!(OPA & 1))
+ if(!(opa & 1))
{
- m_icount -= 9;
+ m_core->m_icount -= 9;
r1 = read16(UNSP_LPC);
add_lpc(1);
- push(UNSP_REG(PC), &UNSP_REG(SP));
- push(UNSP_REG(SR), &UNSP_REG(SP));
- UNSP_REG(PC) = r1;
- UNSP_REG(SR) &= 0xffc0;
- UNSP_REG(SR) |= OPIMM;
+ push(m_core->m_r[REG_PC], &m_core->m_r[REG_SP]);
+ push(m_core->m_r[REG_SR], &m_core->m_r[REG_SP]);
+ m_core->m_r[REG_PC] = r1;
+ m_core->m_r[REG_SR] &= 0xffc0;
+ m_core->m_r[REG_SR] |= op & 0x3f;
}
else
{
@@ -535,12 +601,12 @@ inline void unsp_device::execute_one(const uint16_t op)
return;
case 0x02: // Far Jump
- if (OPA == 7)
+ if (opa == 7)
{
- m_icount -= 5;
- UNSP_REG(PC) = read16(UNSP_LPC);
- UNSP_REG(SR) &= 0xffc0;
- UNSP_REG(SR) |= OPIMM;
+ m_core->m_icount -= 5;
+ m_core->m_r[REG_PC] = read16(UNSP_LPC);
+ m_core->m_r[REG_SR] &= 0xffc0;
+ m_core->m_r[REG_SR] |= op & 0x3f;
}
else
{
@@ -549,20 +615,20 @@ inline void unsp_device::execute_one(const uint16_t op)
return;
case 0x04: // Multiply, Signed * Signed
- if(OPN == 1 && OPA != 7)
+ if(opn == 1 && opa != 7)
{
- m_icount -= 12;
- lres = UNSP_REG_I(OPA) * UNSP_REG_I(OPB);
- if(UNSP_REG_I(OPB) & 0x8000)
+ m_core->m_icount -= 12;
+ lres = m_core->m_r[opa] * m_core->m_r[opb];
+ if(m_core->m_r[opb] & 0x8000)
{
- lres -= UNSP_REG_I(OPA) << 16;
+ lres -= m_core->m_r[opa] << 16;
}
- if(UNSP_REG_I(OPA) & 0x8000)
+ if(m_core->m_r[opa] & 0x8000)
{
- lres -= UNSP_REG_I(OPB) << 16;
+ lres -= m_core->m_r[opb] << 16;
}
- UNSP_REG(R4) = lres >> 16;
- UNSP_REG(R3) = (uint16_t)lres;
+ m_core->m_r[REG_R4] = lres >> 16;
+ m_core->m_r[REG_R3] = (uint16_t)lres;
}
else
{
@@ -571,36 +637,36 @@ inline void unsp_device::execute_one(const uint16_t op)
return;
case 0x05: // Interrupt flags
- m_icount -= 2;
- switch(OPIMM)
+ m_core->m_icount -= 2;
+ switch(op & 0x3f)
{
case 0:
- m_enable_irq = false;
- m_enable_fiq = false;
+ m_core->m_enable_irq = 0;
+ m_core->m_enable_fiq = 0;
break;
case 1:
- m_enable_irq = true;
- m_enable_fiq = false;
+ m_core->m_enable_irq = 1;
+ m_core->m_enable_fiq = 0;
break;
case 2:
- m_enable_irq = false;
- m_enable_fiq = true;
+ m_core->m_enable_irq = 0;
+ m_core->m_enable_fiq = 1;
break;
case 3:
- m_enable_irq = true;
- m_enable_fiq = true;
+ m_core->m_enable_irq = 1;
+ m_core->m_enable_fiq = 1;
break;
case 8: // irq off
- m_enable_irq = false;
+ m_core->m_enable_irq = 0;
break;
case 9: // irq on
- m_enable_irq = true;
+ m_core->m_enable_irq = 1;
break;
case 12: // fiq off
- m_enable_fiq = false;
+ m_core->m_enable_fiq = 0;
break;
case 14: // fiq on
- m_enable_fiq = true;
+ m_core->m_enable_fiq = 1;
break;
case 37: // nop
break;
@@ -618,65 +684,61 @@ inline void unsp_device::execute_one(const uint16_t op)
// At this point, we should be dealing solely with ALU ops.
- r0 = UNSP_REG_I(OPA);
+ r0 = m_core->m_r[opa];
- switch (OP1)
+ switch (op1)
{
case 0x00: // r, [bp+imm6]
- m_icount -= 6;
+ m_core->m_icount -= 6;
- r2 = (uint16_t)(UNSP_REG(BP) + OPIMM);
- if (OP0 != 0x0d)
+ r2 = (uint16_t)(m_core->m_r[REG_BP] + (op & 0x3f));
+ if (op0 != 0x0d)
r1 = read16(r2);
break;
case 0x01: // r, imm6
- m_icount -= 2;
+ m_core->m_icount -= 2;
- r1 = OPIMM;
+ r1 = op & 0x3f;
break;
case 0x03: // Indirect
{
- m_icount -= 6;
- if (OPA == 7)
- {
- m_icount -= 1;
- }
+ m_core->m_icount -= (opa == 7 ? 7 : 6);
- const uint8_t lsbits = OPN & 3;
- const uint8_t opb = OPB;
- if (OPN & 4)
+ const uint8_t lsbits = opn & 3;
+ if (opn & 4)
{
switch (lsbits)
{
- case 0: // r, [r]
+ case 0: // r, [<ds:>r]
r2 = UNSP_LREG_I(opb);
- if (OP0 != 0x0d)
+ if (op0 != 0x0d)
r1 = read16(r2);
break;
+
case 1: // r, [<ds:>r--]
r2 = UNSP_LREG_I(opb);
- if (OP0 != 0x0d)
+ if (op0 != 0x0d)
r1 = read16(r2);
- UNSP_REG_I(opb)--;
- if (UNSP_REG_I(opb) == 0xffff)
- UNSP_REG(SR) -= 0x0400;
+ m_core->m_r[opb] = (uint16_t)(m_core->m_r[opb] - 1);
+ if (m_core->m_r[opb] == 0xffff)
+ m_core->m_r[REG_SR] -= 0x0400;
break;
case 2: // r, [<ds:>r++]
r2 = UNSP_LREG_I(opb);
- if (OP0 != 0x0d)
+ if (op0 != 0x0d)
r1 = read16(r2);
- UNSP_REG_I(opb)++;
- if (UNSP_REG_I(opb) == 0x0000)
- UNSP_REG(SR) += 0x0400;
+ m_core->m_r[opb] = (uint16_t)(m_core->m_r[opb] + 1);
+ if (m_core->m_r[opb] == 0x0000)
+ m_core->m_r[REG_SR] += 0x0400;
break;
case 3: // r, [<ds:>++r]
- UNSP_REG_I(opb)++;
- if (UNSP_REG_I(opb) == 0x0000)
- UNSP_REG(SR) += 0x0400;
+ m_core->m_r[opb] = (uint16_t)(m_core->m_r[opb] + 1);
+ if (m_core->m_r[opb] == 0x0000)
+ m_core->m_r[REG_SR] += 0x0400;
r2 = UNSP_LREG_I(opb);
- if (OP0 != 0x0d)
+ if (op0 != 0x0d)
r1 = read16(r2);
break;
default:
@@ -688,26 +750,26 @@ inline void unsp_device::execute_one(const uint16_t op)
switch (lsbits)
{
case 0: // r, [r]
- r2 = UNSP_REG_I(opb);
- if (OP0 != 0x0d)
+ r2 = m_core->m_r[opb];
+ if (op0 != 0x0d)
r1 = read16(r2);
break;
case 1: // r, [r--]
- r2 = UNSP_REG_I(opb);
- if (OP0 != 0x0d)
+ r2 = m_core->m_r[opb];
+ if (op0 != 0x0d)
r1 = read16(r2);
- UNSP_REG_I(opb)--;
+ m_core->m_r[opb] = (uint16_t)(m_core->m_r[opb] - 1);
break;
case 2: // r, [r++]
- r2 = UNSP_REG_I(opb);
- if (OP0 != 0x0d)
+ r2 = m_core->m_r[opb];
+ if (op0 != 0x0d)
r1 = read16(r2);
- UNSP_REG_I(opb)++;
+ m_core->m_r[opb] = (uint16_t)(m_core->m_r[opb] + 1);
break;
case 3: // r, [++r]
- UNSP_REG_I(opb)++;
- r2 = UNSP_REG_I(opb);
- if (OP0 != 0x0d)
+ m_core->m_r[opb] = (uint16_t)(m_core->m_r[opb] + 1);
+ r2 = m_core->m_r[opb];
+ if (op0 != 0x0d)
r1 = read16(r2);
break;
default:
@@ -718,73 +780,48 @@ inline void unsp_device::execute_one(const uint16_t op)
}
case 0x04: // 16-bit ops
- switch (OPN)
+ switch (opn)
{
case 0x00: // r
- m_icount -= 3;
- if (OPA == 7)
- {
- m_icount -= 2;
- }
-
- r1 = UNSP_REG_I(OPB);
+ m_core->m_icount -= (opa == 7 ? 5 : 3);
+ r1 = m_core->m_r[opb];
break;
case 0x01: // imm16
- m_icount -= 4;
- if (OPA == 7)
- {
- m_icount -= 1;
- }
-
- r0 = UNSP_REG_I(OPB);
+ m_core->m_icount -= (opa == 7 ? 5 : 4);
+ r0 = m_core->m_r[opb];
r1 = read16(UNSP_LPC);
add_lpc(1);
break;
case 0x02: // [imm16]
- m_icount -= 7;
- if (OPA == 7)
- {
- m_icount -= 1;
- }
-
- r0 = UNSP_REG_I(OPB);
+ m_core->m_icount -= (opa == 7 ? 8 : 7);
+ r0 = m_core->m_r[opb];
r2 = read16(UNSP_LPC);
add_lpc(1);
- if (OP0 != 0x0d)
+ if (op0 != 0x0d)
{
r1 = read16(r2);
}
break;
case 0x03: // store [imm16], r
- m_icount -= 7;
- if (OPA == 7)
- {
- m_icount -= 1;
- }
-
+ m_core->m_icount -= (opa == 7 ? 8 : 7);
r1 = r0;
- r0 = UNSP_REG_I(OPB);
+ r0 = m_core->m_r[opb];
r2 = read16(UNSP_LPC);
add_lpc(1);
break;
default: // Shifted ops
{
- m_icount -= 3;
- if (OPA == 7)
- {
- m_icount -= 2;
- }
-
- uint32_t shift = (UNSP_REG_I(OPB) << 4) | m_sb;
+ m_core->m_icount -= (opa == 7 ? 5 : 3);
+ uint32_t shift = (m_core->m_r[opb] << 4) | m_core->m_sb;
if (shift & 0x80000)
shift |= 0xf00000;
- shift >>= (OPN - 3);
- m_sb = shift & 0x0f;
+ shift >>= (opn - 3);
+ m_core->m_sb = shift & 0x0f;
r1 = (uint16_t)(shift >> 4);
break;
}
@@ -792,99 +829,116 @@ inline void unsp_device::execute_one(const uint16_t op)
break;
case 0x05: // More shifted ops
- m_icount -= 3;
- if (OPA == 7)
- {
- m_icount -= 2;
- }
+ m_core->m_icount -= (opa == 7 ? 5 : 3);
- if (OPN & 4) // Shift right
+ if (opn & 4) // Shift right
{
- const uint32_t shift = ((UNSP_REG_I(OPB) << 4) | m_sb) >> (OPN - 3);
- m_sb = shift & 0x0f;
+ const uint32_t shift = ((m_core->m_r[opb] << 4) | m_core->m_sb) >> (opn - 3);
+ m_core->m_sb = shift & 0x0f;
r1 = (uint16_t)(shift >> 4);
}
else // Shift left
{
- const uint32_t shift = ((m_sb << 16) | UNSP_REG_I(OPB)) << (OPN + 1);
- m_sb = (shift >> 16) & 0x0f;
+ const uint32_t shift = ((m_core->m_sb << 16) | m_core->m_r[opb]) << (opn + 1);
+ m_core->m_sb = (shift >> 16) & 0x0f;
r1 = (uint16_t)shift;
}
break;
case 0x06: // Rotated ops
{
- m_icount -= 3;
- if (OPA == 7)
- {
- m_icount -= 2;
- }
+ m_core->m_icount -= (opa == 7 ? 5 : 3);
- uint32_t shift = (((m_sb << 16) | UNSP_REG_I(OPB)) << 4) | m_sb;
- if (OPN & 4) // Rotate right
+ uint32_t shift = (((m_core->m_sb << 16) | m_core->m_r[opb]) << 4) | m_core->m_sb;
+ if (opn & 4) // Rotate right
{
- shift >>= (OPN - 3);
- m_sb = shift & 0x0f;
+ shift >>= (opn - 3);
+ m_core->m_sb = shift & 0x0f;
}
else
{
- shift <<= (OPN + 1);
- m_sb = (shift >> 20) & 0x0f;
+ shift <<= (opn + 1);
+ m_core->m_sb = (shift >> 20) & 0x0f;
}
r1 = (uint16_t)(shift >> 4);
break;
}
case 0x07: // Direct 8
- m_icount -= 5;
- if (OPA == 7)
- {
- m_icount -= 1;
- }
-
- r2 = OPIMM;
- r1 = read16(OPIMM);
+ m_core->m_icount -= (opa == 7 ? 6 : 5);
+ r2 = op & 0x3f;
+ r1 = read16(r2);
break;
default:
break;
}
- switch (OP0)
+ switch (op0)
{
case 0x00: // Add
+ {
lres = r0 + r1;
+ if (opa != 7)
+ update_nzsc(lres, r0, r1);
break;
+ }
case 0x01: // Add w/ carry
- lres = r0 + r1;
- if(UNSP_REG(SR) & UNSP_C)
- lres++;
+ {
+ uint32_t c = (m_core->m_r[REG_SR] & UNSP_C) ? 1 : 0;
+ lres = r0 + r1 + c;
+ if (opa != 7)
+ update_nzsc(lres, r0, r1);
break;
+ }
case 0x02: // Subtract
- case 0x04: // Compare
- lres = r0 + (uint16_t)(~r1) + 1;
+ lres = r0 + (uint16_t)(~r1) + uint32_t(1);
+ if (opa != 7)
+ update_nzsc(lres, r0, ~r1);
break;
case 0x03: // Subtract w/ carry
- lres = r0 + (uint16_t)(~r1);
- if(UNSP_REG(SR) & UNSP_C)
- lres++;
+ {
+ uint32_t c = (m_core->m_r[REG_SR] & UNSP_C) ? 1 : 0;
+ lres = r0 + (uint16_t)(~r1) + c;
+ if (opa != 7)
+ update_nzsc(lres, r0, ~r1);
break;
+ }
+ case 0x04: // Compare
+ lres = r0 + (uint16_t)(~r1) + uint32_t(1);
+ if (opa != 7)
+ update_nzsc(lres, r0, ~r1);
+ return;
case 0x06: // Negate
lres = -r1;
+ if (opa != 7)
+ update_nz(lres);
break;
case 0x08: // XOR
lres = r0 ^ r1;
+ if (opa != 7)
+ update_nz(lres);
break;
case 0x09: // Load
lres = r1;
+ if (opa != 7)
+ update_nz(lres);
break;
case 0x0a: // OR
lres = r0 | r1;
+ if (opa != 7)
+ update_nz(lres);
break;
case 0x0b: // AND
- case 0x0c: // Test
lres = r0 & r1;
+ if (opa != 7)
+ update_nz(lres);
break;
+ case 0x0c: // Test
+ lres = r0 & r1;
+ if (opa != 7)
+ update_nz(lres);
+ return;
case 0x0d: // Store
write16(r2, r0);
return;
@@ -893,34 +947,33 @@ inline void unsp_device::execute_one(const uint16_t op)
return;
}
- if (OP0 != 0x0d && OPA != 7) // If not a store opcode and not updating the PC, update negative/zero flags.
- {
- update_nz(lres);
- }
-
- if (OP0 < 0x05 && OPA != 7) // If Add, Add w/ Carry, Subtract, Subtract w/ Carry, Compare, and not updating the PC, update sign/carry flags.
- update_sc(lres, r0, r1);
-
- if (OP0 == 0x04 || OP0 == 0x0c) // Compare and Test don't write back results.
- return;
-
- if (OP1 == 0x04 && OPN == 0x03) // store [imm16], r
+ if (op1 == 0x04 && opn == 0x03) // store [imm16], r
write16(r2, lres);
else
- UNSP_REG_I(OPA) = lres;
+ m_core->m_r[opa] = (uint16_t)lres;
}
void unsp_device::execute_run()
{
+ if (m_enable_drc)
+ {
+ execute_run_drc();
+ return;
+ }
+
#if UNSP_LOG_OPCODES
unsp_disassembler dasm;
#endif
- while (m_icount > 0)
+ while (m_core->m_icount >= 0)
{
debugger_instruction_hook(UNSP_LPC);
const uint32_t op = read16(UNSP_LPC);
+#if UNSP_LOG_REGS
+ log_regs();
+#endif
+
#if UNSP_LOG_OPCODES
if (m_log_ops)
{
@@ -941,16 +994,26 @@ void unsp_device::execute_run()
/*****************************************************************************/
-void unsp_device::execute_set_input(int irqline, int state)
+void unsp_device::execute_set_input(int inputnum, int state)
+{
+ set_state_unsynced(inputnum, state);
+}
+
+uint8_t unsp_device::get_csb()
+{
+ return 1 << ((UNSP_LPC >> 20) & 3);
+}
+
+void unsp_device::set_state_unsynced(int inputnum, int state)
{
- m_sirq &= ~(1 << irqline);
+ m_core->m_sirq &= ~(1 << inputnum);
if(!state)
{
return;
}
- switch (irqline)
+ switch (inputnum)
{
case UNSP_IRQ0_LINE:
case UNSP_IRQ1_LINE:
@@ -961,9 +1024,20 @@ void unsp_device::execute_set_input(int irqline, int state)
case UNSP_IRQ6_LINE:
case UNSP_IRQ7_LINE:
case UNSP_FIQ_LINE:
- m_sirq |= (1 << irqline);
+ m_core->m_sirq |= (1 << inputnum);
break;
case UNSP_BRK_LINE:
break;
}
}
+
+uint16_t unsp_device::get_ds()
+{
+ return (m_core->m_r[REG_SR] >> 10) & 0x3f;
+}
+
+void unsp_device::set_ds(uint16_t ds)
+{
+ m_core->m_r[REG_SR] &= 0x03ff;
+ m_core->m_r[REG_SR] |= (ds & 0x3f) << 10;
+}
diff --git a/src/devices/cpu/unsp/unsp.h b/src/devices/cpu/unsp/unsp.h
index ad3f8250785..460198451fa 100644
--- a/src/devices/cpu/unsp/unsp.h
+++ b/src/devices/cpu/unsp/unsp.h
@@ -17,7 +17,32 @@
#pragma once
+#include "cpu/drcfe.h"
+#include "cpu/drcuml.h"
+#include "cpu/drcumlsh.h"
+
+/***************************************************************************
+ CONSTANTS
+***************************************************************************/
+
+/* map variables */
+#define MAPVAR_PC M0
+#define MAPVAR_CYCLES M1
+
+#define SINGLE_INSTRUCTION_MODE (0)
+
+#define ENABLE_UNSP_DRC (1)
+
#define UNSP_LOG_OPCODES (0)
+#define UNSP_LOG_REGS (0)
+
+//**************************************************************************
+// TYPE DEFINITIONS
+//**************************************************************************
+
+class unsp_frontend;
+
+// ======================> unsp_device
enum
{
@@ -36,7 +61,7 @@ enum
UNSP_FIQ_EN,
UNSP_IRQ,
UNSP_FIQ,
-#if UNSP_LOG_OPCODES
+#if UNSP_LOG_OPCODES || UNSP_LOG_REGS
UNSP_SB,
UNSP_LOG_OPS
#else
@@ -62,16 +87,38 @@ enum
class unsp_device : public cpu_device
{
+ friend class unsp_frontend;
+
public:
// construction/destruction
unsp_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- void set_timer_interval(int timer, uint32_t interval);
+ // HACK: IRQ line state can only be modified directly by hardware on-board the SPG SoC itself.
+ // Therefore, to avoid an unnecessary scheduler sync when the external spg2xx_device sets or
+ // clears an interrupt line, we provide this direct accessor.
+ // A more correct but longer-term solution will be to move spg2xx_device to be internal to
+ // a subclass of unsp_device rather than its own standalone device.
+ void set_state_unsynced(int inputnum, int state);
+
+ uint8_t get_csb();
+
+ void set_ds(uint16_t ds);
+ uint16_t get_ds();
+
+ inline void ccfunc_unimplemented();
+ void invalidate_cache();
+
+#if UNSP_LOG_REGS
+ void log_regs();
+ void log_write(uint32_t addr, uint32_t data);
+ void cfunc_log_write();
+#endif
protected:
// device-level overrides
virtual void device_start() override;
virtual void device_reset() override;
+ virtual void device_stop() override;
// device_execute_interface overrides
virtual uint32_t execute_min_cycles() const override { return 5; }
@@ -92,27 +139,69 @@ protected:
virtual std::unique_ptr<util::disasm_interface> create_disassembler() override;
private:
+ // compilation boundaries -- how far back/forward does the analysis extend?
+ enum : uint32_t
+ {
+ COMPILE_BACKWARDS_BYTES = 128,
+ COMPILE_FORWARDS_BYTES = 512,
+ COMPILE_MAX_INSTRUCTIONS = (COMPILE_BACKWARDS_BYTES / 4) + (COMPILE_FORWARDS_BYTES / 4),
+ COMPILE_MAX_SEQUENCE = 64
+ };
+
+ // exit codes
+ enum : int
+ {
+ EXECUTE_OUT_OF_CYCLES = 0,
+ EXECUTE_MISSING_CODE = 1,
+ EXECUTE_UNMAPPED_CODE = 2,
+ EXECUTE_RESET_CACHE = 3
+ };
+
+ enum : uint32_t
+ {
+ REG_SP = 0,
+ REG_R1,
+ REG_R2,
+ REG_R3,
+ REG_R4,
+ REG_BP,
+ REG_SR,
+ REG_PC
+ };
+
void add_lpc(const int32_t offset);
inline void execute_one(const uint16_t op);
- address_space_config m_program_config;
+ struct internal_unsp_state
+ {
+ uint32_t m_r[8];
+ uint32_t m_enable_irq;
+ uint32_t m_enable_fiq;
+ uint32_t m_irq;
+ uint32_t m_fiq;
+ uint32_t m_curirq;
+ uint32_t m_sirq;
+ uint32_t m_sb;
+ uint32_t m_saved_sb[3];
- uint16_t m_r[16];
- bool m_enable_irq;
- bool m_enable_fiq;
- bool m_irq;
- bool m_fiq;
- uint16_t m_curirq;
- uint16_t m_sirq;
- uint8_t m_sb;
- uint8_t m_saved_sb[3];
+ uint32_t m_arg0;
+ uint32_t m_arg1;
+ uint32_t m_jmpdest;
+ int m_icount;
+ };
+
+ address_space_config m_program_config;
address_space *m_program;
- int m_icount;
+ std::function<u16 (offs_t)> m_pr16;
+ std::function<const void * (offs_t)> m_prptr;
+
+ /* core state */
+ internal_unsp_state *m_core;
uint32_t m_debugger_temp;
-#if UNSP_LOG_OPCODES
+#if UNSP_LOG_OPCODES || UNSP_LOG_REGS
uint32_t m_log_ops;
#endif
@@ -120,12 +209,70 @@ private:
inline uint16_t read16(uint32_t address);
inline void write16(uint32_t address, uint16_t data);
inline void update_nz(uint32_t value);
- inline void update_sc(uint32_t value, uint16_t r0, uint16_t r1);
- inline void push(uint16_t value, uint16_t *reg);
- inline uint16_t pop(uint16_t *reg);
+ inline void update_nzsc(uint32_t value, uint16_t r0, uint16_t r1);
+ inline void push(uint32_t value, uint32_t *reg);
+ inline uint16_t pop(uint32_t *reg);
inline void trigger_fiq();
inline void trigger_irq(int line);
inline void check_irqs();
+
+ drc_cache m_cache;
+ std::unique_ptr<drcuml_state> m_drcuml;
+ std::unique_ptr<unsp_frontend> m_drcfe;
+ uint32_t m_drcoptions;
+ uint8_t m_cache_dirty;
+
+ uml::parameter m_regmap[16];
+ uml::code_handle *m_entry;
+ uml::code_handle *m_nocode;
+ uml::code_handle *m_out_of_cycles;
+ uml::code_handle *m_check_interrupts;
+ uml::code_handle *m_trigger_fiq;
+ uml::code_handle *m_trigger_irq;
+
+ uml::code_handle *m_mem_read;
+ uml::code_handle *m_mem_write;
+
+ bool m_enable_drc;
+
+ /* internal compiler state */
+ struct compiler_state
+ {
+ compiler_state(compiler_state const &) = delete;
+ compiler_state &operator=(compiler_state const &) = delete;
+
+ uint32_t m_cycles; /* accumulated cycles */
+ uml::code_label m_labelnum; /* index for local labels */
+ };
+
+ void execute_run_drc();
+ void flush_drc_cache();
+ void code_flush_cache();
+ void code_compile_block(offs_t pc);
+ void load_fast_iregs(drcuml_block &block);
+ void save_fast_iregs(drcuml_block &block);
+
+ void static_generate_entry_point();
+ void static_generate_nocode_handler();
+ void static_generate_out_of_cycles();
+ void static_generate_check_interrupts();
+ void static_generate_trigger_fiq();
+ void static_generate_trigger_irq();
+ void static_generate_memory_accessor(bool iswrite, const char *name, uml::code_handle *&handleptr);
+
+ void generate_branch(drcuml_block &block, compiler_state &compiler, const opcode_desc *desc);
+ void generate_check_cycles(drcuml_block &block, compiler_state &compiler, uml::parameter param);
+ void generate_checksum_block(drcuml_block &block, compiler_state &compiler, const opcode_desc *seqhead, const opcode_desc *seqlast);
+ void generate_sequence_instruction(drcuml_block &block, compiler_state &compiler, const opcode_desc *desc);
+ void generate_add_lpc(drcuml_block &block, int32_t offset);
+ void generate_update_nzsc(drcuml_block &block);
+ void generate_update_nz(drcuml_block &block);
+ void log_add_disasm_comment(drcuml_block &block, uint32_t pc, uint32_t op);
+ bool generate_opcode(drcuml_block &block, compiler_state &compiler, const opcode_desc *desc);
+
+#if UNSP_LOG_REGS
+ FILE *m_log_file;
+#endif
};
diff --git a/src/devices/cpu/unsp/unspdefs.h b/src/devices/cpu/unsp/unspdefs.h
new file mode 100644
index 00000000000..382e25a0dac
--- /dev/null
+++ b/src/devices/cpu/unsp/unspdefs.h
@@ -0,0 +1,22 @@
+// license:BSD-3-Clause
+// copyright-holders:Ryan Holtz
+
+#ifndef MAME_CPU_UNSP_UNSPDEFS_H
+#define MAME_CPU_UNSP_UNSPDEFS_H
+
+#pragma once
+
+#define UNSP_LPC (((m_core->m_r[REG_SR] & 0x3f) << 16) | m_core->m_r[REG_PC])
+#define UNSP_LREG_I(reg) (((m_core->m_r[REG_SR] << 6) & 0x3f0000) | m_core->m_r[reg])
+
+#define UNSP_N 0x0200
+#define UNSP_Z 0x0100
+#define UNSP_S 0x0080
+#define UNSP_C 0x0040
+
+#define UNSP_N_SHIFT 9
+#define UNSP_Z_SHIFT 8
+#define UNSP_S_SHIFT 7
+#define UNSP_C_SHIFT 6
+
+#endif // MAME_CPU_UNSP_UNSPDEFS_H
diff --git a/src/devices/cpu/unsp/unspdrc.cpp b/src/devices/cpu/unsp/unspdrc.cpp
new file mode 100644
index 00000000000..3ee90c8c1c9
--- /dev/null
+++ b/src/devices/cpu/unsp/unspdrc.cpp
@@ -0,0 +1,1316 @@
+// license:BSD-3-Clause
+// copyright-holders:Ryan Holtz
+
+#include "emu.h"
+#include "unsp.h"
+#include "unspfe.h"
+#include "unspdefs.h"
+
+void unsp_device::invalidate_cache()
+{
+ m_cache_dirty = true;
+}
+
+void unsp_device::execute_run_drc()
+{
+ int execute_result;
+
+ /* reset the cache if dirty */
+ if (m_cache_dirty)
+ {
+ code_flush_cache();
+ m_cache_dirty = false;
+ }
+
+
+ /* execute */
+ do
+ {
+ /* run as much as we can */
+ execute_result = m_drcuml->execute(*m_entry);
+
+ /* if we need to recompile, do it */
+ if (execute_result == EXECUTE_MISSING_CODE)
+ {
+ code_compile_block(UNSP_LPC);
+ }
+ else if (execute_result == EXECUTE_UNMAPPED_CODE)
+ {
+ fatalerror("Attempted to execute unmapped code at PC=%08X\n", UNSP_LPC);
+ }
+ else if (execute_result == EXECUTE_RESET_CACHE)
+ {
+ code_flush_cache();
+ }
+ } while (execute_result != EXECUTE_OUT_OF_CYCLES);
+}
+
+
+/***************************************************************************
+ C FUNCTION CALLBACKS
+***************************************************************************/
+
+/*-------------------------------------------------
+ cfunc_unimplemented - handler for
+ unimplemented opcdes
+-------------------------------------------------*/
+
+inline void unsp_device::ccfunc_unimplemented()
+{
+ fatalerror("PC=%08X: Unimplemented op %04x\n", UNSP_LPC, (uint16_t)m_core->m_arg0);
+}
+
+static void cfunc_unimplemented(void *param)
+{
+ ((unsp_device *)param)->ccfunc_unimplemented();
+}
+
+#if UNSP_LOG_REGS
+void unsp_device::cfunc_log_write()
+{
+ log_write(m_core->m_arg0, m_core->m_arg1);
+}
+
+static void cfunc_log_regs(void *param)
+{
+ ((unsp_device *)param)->log_regs();
+}
+
+static void ccfunc_log_write(void *param)
+{
+ ((unsp_device *)param)->cfunc_log_write();
+}
+#endif
+
+/***************************************************************************
+ CACHE MANAGEMENT
+***************************************************************************/
+
+/*-------------------------------------------------
+ flush_drc_cache - outward-facing accessor to
+ code_flush_cache
+-------------------------------------------------*/
+
+void unsp_device::flush_drc_cache()
+{
+ if (!m_enable_drc)
+ return;
+ m_cache_dirty = true;
+}
+
+/*-------------------------------------------------
+ code_flush_cache - flush the cache and
+ regenerate static code
+-------------------------------------------------*/
+
+void unsp_device::code_flush_cache()
+{
+ /* empty the transient cache contents */
+ m_drcuml->reset();
+
+ try
+ {
+ /* generate the entry point and out-of-cycles handlers */
+ static_generate_entry_point();
+ static_generate_nocode_handler();
+ static_generate_out_of_cycles();
+
+ static_generate_memory_accessor(false, "read", m_mem_read);
+ static_generate_memory_accessor(true, "write", m_mem_write);
+ static_generate_trigger_fiq();
+ static_generate_trigger_irq();
+ static_generate_check_interrupts();
+ }
+
+ catch (drcuml_block::abort_compilation &)
+ {
+ fatalerror("Unable to generate static u'nSP code\n"); fflush(stdout);
+ }
+}
+
+/*-------------------------------------------------
+ code_compile_block - compile a block of the
+ given mode at the specified pc
+-------------------------------------------------*/
+
+void unsp_device::code_compile_block(offs_t pc)
+{
+ compiler_state compiler = { 0 };
+ const opcode_desc *seqhead, *seqlast;
+ bool override = false;
+
+ g_profiler.start(PROFILER_DRC_COMPILE);
+
+ /* get a description of this sequence */
+ const opcode_desc *desclist = m_drcfe->describe_code(pc);
+
+ bool succeeded = false;
+ while (!succeeded)
+ {
+ try
+ {
+ /* start the block */
+ drcuml_block &block(m_drcuml->begin_block(1024*8));
+
+ /* loop until we get through all instruction sequences */
+ for (seqhead = desclist; seqhead != nullptr; seqhead = seqlast->next())
+ {
+ const opcode_desc *curdesc;
+ uint32_t nextpc;
+
+ /* add a code log entry */
+ if (m_drcuml->logging())
+ block.append_comment("-------------------------");
+
+ /* determine the last instruction in this sequence */
+ for (seqlast = seqhead; seqlast != nullptr; seqlast = seqlast->next())
+ if (seqlast->flags & OPFLAG_END_SEQUENCE)
+ break;
+ assert(seqlast != nullptr);
+
+ /* if we don't have a hash for this mode/pc, or if we are overriding all, add one */
+ if (override || !m_drcuml->hash_exists(0, seqhead->pc))
+ UML_HASH(block, 0, seqhead->pc);
+
+ /* if we already have a hash, and this is the first sequence, assume that we */
+ /* are recompiling due to being out of sync and allow future overrides */
+ else if (seqhead == desclist)
+ {
+ override = true;
+ UML_HASH(block, 0, seqhead->pc);
+ }
+
+ /* otherwise, redispatch to that fixed PC and skip the rest of the processing */
+ else
+ {
+ UML_LABEL(block, seqhead->pc | 0x80000000);
+ UML_HASHJMP(block, 0, seqhead->pc, *m_nocode);
+ continue;
+ }
+
+ /* validate this code block if we're not pointing into ROM */
+ if (m_program->get_write_ptr(seqhead->physpc) != nullptr)
+ generate_checksum_block(block, compiler, seqhead, seqlast);
+
+ /* label this instruction, if it may be jumped to locally */
+ if (seqhead->flags & OPFLAG_IS_BRANCH_TARGET)
+ UML_LABEL(block, seqhead->pc | 0x80000000);
+
+ /* iterate over instructions in the sequence and compile them */
+ for (curdesc = seqhead; curdesc != seqlast->next(); curdesc = curdesc->next())
+ {
+ generate_check_cycles(block, compiler, curdesc->pc + curdesc->length);
+ generate_sequence_instruction(block, compiler, curdesc);
+ UML_CALLH(block, *m_check_interrupts);
+ }
+
+ nextpc = seqlast->pc + seqlast->length;
+
+ /* if the last instruction can change modes, use a variable mode; otherwise, assume the same mode */
+ if (seqlast->next() == nullptr || seqlast->next()->pc != nextpc)
+ {
+ UML_HASHJMP(block, 0, nextpc, *m_nocode); // hashjmp <mode>,nextpc,nocode
+ }
+ }
+
+ /* end the sequence */
+ block.end();
+ g_profiler.stop();
+ succeeded = true;
+ }
+ catch (drcuml_block::abort_compilation &)
+ {
+ code_flush_cache();
+ }
+ }
+}
+
+/***************************************************************************
+ STATIC CODEGEN
+***************************************************************************/
+
+/*-------------------------------------------------
+ alloc_handle - allocate a handle if not
+ already allocated
+-------------------------------------------------*/
+
+static inline void alloc_handle(drcuml_state &drcuml, uml::code_handle *&handleptr, const char *name)
+{
+ if (!handleptr)
+ handleptr = drcuml.handle_alloc(name);
+}
+
+/*-------------------------------------------------
+ generate_entry_point - generate a
+ static entry point
+-------------------------------------------------*/
+
+void unsp_device::static_generate_entry_point()
+{
+ /* begin generating */
+ drcuml_block &block(m_drcuml->begin_block(32));
+
+ /* forward references */
+ alloc_handle(*m_drcuml, m_nocode, "nocode");
+
+ alloc_handle(*m_drcuml, m_entry, "entry");
+ UML_HANDLE(block, *m_entry);
+
+ /* load fast integer registers */
+ //load_fast_iregs(block);
+
+ /* generate a hash jump via the current mode and PC */
+ UML_ROLAND(block, I1, mem(&m_core->m_r[REG_SR]), 16, 0x003f0000);
+ UML_OR(block, I1, I1, mem(&m_core->m_r[REG_PC]));
+ UML_HASHJMP(block, 0, I1, *m_nocode);
+ block.end();
+}
+
+
+/*-------------------------------------------------
+ static_generate_nocode_handler - generate an
+ exception handler for "out of code"
+-------------------------------------------------*/
+
+void unsp_device::static_generate_nocode_handler()
+{
+ /* begin generating */
+ drcuml_block &block(m_drcuml->begin_block(10));
+
+ /* generate a hash jump via the current mode and PC */
+ alloc_handle(*m_drcuml, m_nocode, "nocode");
+ UML_HANDLE(block, *m_nocode);
+ UML_GETEXP(block, I0);
+
+ UML_ROLINS(block, mem(&m_core->m_r[REG_SR]), I0, 16, 0x3f);
+ UML_AND(block, mem(&m_core->m_r[REG_PC]), I0, 0x0000ffff);
+ //save_fast_iregs(block);
+ UML_EXIT(block, EXECUTE_MISSING_CODE);
+
+ block.end();
+}
+
+
+/*-------------------------------------------------
+ static_generate_out_of_cycles - generate an
+ out of cycles exception handler
+-------------------------------------------------*/
+
+void unsp_device::static_generate_out_of_cycles()
+{
+ /* begin generating */
+ drcuml_block &block(m_drcuml->begin_block(10));
+
+ /* generate a hash jump via the current mode and PC */
+ alloc_handle(*m_drcuml, m_out_of_cycles, "out_of_cycles");
+ UML_HANDLE(block, *m_out_of_cycles);
+ //save_fast_iregs(block);
+ UML_EXIT(block, EXECUTE_OUT_OF_CYCLES);
+
+ block.end();
+}
+
+/*------------------------------------------------------------------
+ static_generate_memory_accessor
+------------------------------------------------------------------*/
+
+void unsp_device::static_generate_memory_accessor(bool iswrite, const char *name, uml::code_handle *&handleptr)
+{
+ /* on entry, address is in I0; data for writes is in I1 */
+ /* on exit, read result is in I1 */
+
+ /* begin generating */
+ drcuml_block &block(m_drcuml->begin_block(32));
+
+ /* add a global entry for this */
+ alloc_handle(*m_drcuml, handleptr, name);
+ UML_HANDLE(block, *handleptr);
+
+ if (iswrite)
+ {
+#if UNSP_LOG_REGS
+ UML_MOV(block, mem(&m_core->m_arg0), I0);
+ UML_MOV(block, mem(&m_core->m_arg1), I1);
+ UML_CALLC(block, ccfunc_log_write, this);
+#endif
+ UML_WRITE(block, I0, I1, SIZE_WORD, SPACE_PROGRAM);
+ }
+ else
+ UML_READ(block, I1, I0, SIZE_WORD, SPACE_PROGRAM);
+ UML_RET(block);
+
+ block.end();
+}
+
+
+
+/***************************************************************************
+ CODE GENERATION
+***************************************************************************/
+
+void unsp_device::static_generate_check_interrupts()
+{
+ uml::code_label test_loop = 1;
+ uml::code_label found = 2;
+ uml::code_label do_irq = 3;
+
+ /* begin generating */
+ drcuml_block &block(m_drcuml->begin_block(256));
+
+ /* generate a hash jump via the current mode and PC */
+ alloc_handle(*m_drcuml, m_check_interrupts, "check_interrupts");
+ UML_HANDLE(block, *m_check_interrupts);
+
+ UML_CMP(block, mem(&m_core->m_sirq), 0);
+ UML_RETc(block, uml::COND_Z);
+
+ UML_MOV(block, I2, 0);
+ UML_MOV(block, I0, 1);
+ UML_MOV(block, I1, mem(&m_core->m_sirq));
+
+ UML_LABEL(block, test_loop);
+ UML_TEST(block, I1, I0);
+ UML_JMPc(block, uml::COND_NZ, found);
+ UML_SHL(block, I0, I0, 1);
+ UML_ADD(block, I2, I2, 1);
+ UML_CMP(block, I0, 1 << 9);
+ UML_JMPc(block, uml::COND_NE, test_loop);
+ UML_RET(block);
+
+ UML_LABEL(block, found);
+ UML_CMP(block, I0, 1);
+ UML_JMPc(block, uml::COND_NE, do_irq);
+ UML_CALLH(block, *m_trigger_fiq);
+ UML_RET(block);
+
+ UML_LABEL(block, do_irq);
+ UML_CALLH(block, *m_trigger_irq);
+ UML_RET(block);
+
+ block.end();
+}
+
+void unsp_device::static_generate_trigger_fiq()
+{
+ /* begin generating */
+ drcuml_block &block(m_drcuml->begin_block(256));
+
+ /* generate a hash jump via the current mode and PC */
+ alloc_handle(*m_drcuml, m_trigger_fiq, "trigger_fiq");
+ UML_HANDLE(block, *m_trigger_fiq);
+
+ UML_OR(block, I0, mem(&m_core->m_fiq), mem(&m_core->m_irq));
+ UML_TEST(block, I0, 1);
+ UML_RETc(block, uml::COND_NZ);
+
+ UML_TEST(block, mem(&m_core->m_enable_fiq), 1);
+ UML_RETc(block, uml::COND_Z);
+
+ UML_MOV(block, mem(&m_core->m_fiq), 1);
+
+ UML_MOV(block, I0, mem(&m_core->m_sb));
+ UML_MOV(block, I1, mem(&m_core->m_irq));
+ UML_STORE(block, (void*)m_core->m_saved_sb, I1, I0, SIZE_DWORD, SCALE_x4);
+ UML_MOV(block, mem(&m_core->m_sb), mem(&m_core->m_saved_sb[2]));
+
+ UML_MOV(block, I0, mem(&m_core->m_r[REG_SP]));
+
+ UML_MOV(block, I1, mem(&m_core->m_r[REG_PC]));
+ UML_CALLH(block, *m_mem_write);
+ UML_SUB(block, I0, I0, 1);
+
+ UML_MOV(block, I1, mem(&m_core->m_r[REG_SR]));
+ UML_CALLH(block, *m_mem_write);
+ UML_SUB(block, I0, I0, 1);
+
+ UML_AND(block, mem(&m_core->m_r[REG_SP]), I0, 0x0000ffff);
+
+ UML_MOV(block, I0, 0x0000fff6);
+ UML_CALLH(block, *m_mem_read);
+ UML_MOV(block, mem(&m_core->m_r[REG_PC]), I1);
+ UML_MOV(block, mem(&m_core->m_r[REG_SR]), 0);
+ UML_HASHJMP(block, 0, I1, *m_nocode);
+ UML_RET(block);
+
+ block.end();
+}
+
+void unsp_device::static_generate_trigger_irq()
+{
+ /* begin generating */
+ drcuml_block &block(m_drcuml->begin_block(256));
+
+ /* generate a hash jump via the current mode and PC */
+ alloc_handle(*m_drcuml, m_trigger_irq, "trigger_irq");
+ UML_HANDLE(block, *m_trigger_irq);
+
+ UML_OR(block, I0, mem(&m_core->m_fiq), mem(&m_core->m_irq));
+ UML_TEST(block, I0, 1);
+ UML_RETc(block, uml::COND_NZ);
+
+ UML_TEST(block, mem(&m_core->m_enable_irq), 1);
+ UML_RETc(block, uml::COND_Z);
+
+ UML_MOV(block, mem(&m_core->m_irq), 1);
+
+ UML_MOV(block, mem(&m_core->m_saved_sb[0]), mem(&m_core->m_sb));
+ UML_MOV(block, mem(&m_core->m_sb), mem(&m_core->m_saved_sb[1]));
+
+ UML_MOV(block, I0, mem(&m_core->m_r[REG_SP]));
+ UML_MOV(block, I1, mem(&m_core->m_r[REG_PC]));
+ UML_CALLH(block, *m_mem_write);
+ UML_SUB(block, I0, I0, 1);
+
+ UML_MOV(block, I1, mem(&m_core->m_r[REG_SR]));
+ UML_CALLH(block, *m_mem_write);
+ UML_SUB(block, I0, I0, 1);
+
+ UML_AND(block, mem(&m_core->m_r[REG_SP]), I0, 0x0000ffff);
+
+ UML_ADD(block, I0, I2, 0x0000fff7);
+
+ UML_CALLH(block, *m_mem_read);
+
+ UML_MOV(block, mem(&m_core->m_r[REG_PC]), I1);
+ UML_MOV(block, mem(&m_core->m_r[REG_SR]), 0);
+ UML_HASHJMP(block, 0, I1, *m_nocode);
+ UML_RET(block);
+
+ block.end();
+}
+
+/*-------------------------------------------------
+ generate_check_cycles - generate code to
+ generate an exception if cycles are out
+-------------------------------------------------*/
+
+void unsp_device::generate_check_cycles(drcuml_block &block, compiler_state &compiler, uml::parameter param)
+{
+ UML_CMP(block, mem(&m_core->m_icount), 0);
+ UML_EXHc(block, uml::COND_L, *m_out_of_cycles, param);
+}
+
+/*-------------------------------------------------
+ generate_checksum_block - generate code to
+ validate a sequence of opcodes
+-------------------------------------------------*/
+
+void unsp_device::generate_checksum_block(drcuml_block &block, compiler_state &compiler, const opcode_desc *seqhead, const opcode_desc *seqlast)
+{
+ const opcode_desc *curdesc;
+ if (m_drcuml->logging())
+ {
+ block.append_comment("[Validation for %08X]", seqhead->pc);
+ }
+
+ /* full verification; sum up everything */
+ void *memptr = m_program->get_write_ptr(seqhead->physpc);
+ UML_LOAD(block, I0, memptr, 0, SIZE_WORD, SCALE_x2);
+ uint32_t sum = seqhead->opptr.w[0];
+ for (int i = 1; i < seqhead->length; i++)
+ {
+ UML_LOAD(block, I1, memptr, i, SIZE_WORD, SCALE_x2);
+ UML_ADD(block, I0, I0, I1);
+ sum += ((uint16_t*)memptr)[i];
+ }
+ for (curdesc = seqhead->next(); curdesc != seqlast->next(); curdesc = curdesc->next())
+ {
+ if (!(curdesc->flags & OPFLAG_VIRTUAL_NOOP))
+ {
+ memptr = m_program->get_write_ptr(curdesc->physpc);
+ UML_LOAD(block, I1, memptr, 0, SIZE_WORD, SCALE_x2);
+ UML_ADD(block, I0, I0, I1);
+ sum += curdesc->opptr.w[0];
+ for (int i = 1; i < curdesc->length; i++)
+ {
+ UML_LOAD(block, I1, memptr, i, SIZE_WORD, SCALE_x2);
+ UML_ADD(block, I0, I0, I1);
+ sum += ((uint16_t*)memptr)[i];
+ }
+ }
+ }
+ UML_CMP(block, I0, sum);
+ UML_EXHc(block, COND_NE, *m_nocode, seqhead->pc);
+}
+
+
+/*-------------------------------------------------
+ log_add_disasm_comment - add a comment
+ including disassembly of a MIPS instruction
+-------------------------------------------------*/
+
+void unsp_device::log_add_disasm_comment(drcuml_block &block, uint32_t pc, uint32_t op)
+{
+ if (m_drcuml->logging())
+ {
+ block.append_comment("%08X: %08x", pc, op);
+ }
+}
+
+
+/*------------------------------------------------------------------
+ generate_branch
+------------------------------------------------------------------*/
+
+void unsp_device::generate_branch(drcuml_block &block, compiler_state &compiler, const opcode_desc *desc)
+{
+ if (desc->targetpc == BRANCH_TARGET_DYNAMIC)
+ {
+ UML_ROLAND(block, I0, mem(&m_core->m_r[REG_SR]), 16, 0x3f0000);
+ UML_OR(block, mem(&m_core->m_jmpdest), I0, mem(&m_core->m_r[REG_PC]));
+ }
+
+ /* update the cycles and jump through the hash table to the target */
+ if (desc->targetpc != BRANCH_TARGET_DYNAMIC)
+ {
+ UML_CALLH(block, *m_check_interrupts);
+ UML_HASHJMP(block, 0, desc->targetpc, *m_nocode);
+ }
+ else
+ {
+ UML_CALLH(block, *m_check_interrupts);
+ UML_HASHJMP(block, 0, mem(&m_core->m_jmpdest), *m_nocode);
+ }
+}
+
+
+/*-------------------------------------------------
+ generate_sequence_instruction - generate code
+ for a single instruction in a sequence
+-------------------------------------------------*/
+
+void unsp_device::generate_sequence_instruction(drcuml_block &block, compiler_state &compiler, const opcode_desc *desc)
+{
+ /* add an entry for the log */
+ if (m_drcuml->logging() && !(desc->flags & OPFLAG_VIRTUAL_NOOP))
+ log_add_disasm_comment(block, desc->pc, desc->opptr.w[0]);
+
+ /* set the PC map variable */
+ UML_MAPVAR(block, MAPVAR_PC, desc->pc);
+
+ /* if we are debugging, call the debugger */
+ if ((machine().debug_flags & DEBUG_FLAG_ENABLED) != 0)
+ {
+ //save_fast_iregs(block);
+ UML_DEBUG(block, desc->pc);
+ }
+
+#if UNSP_LOG_REGS
+ UML_CALLC(block, cfunc_log_regs, this);
+#endif
+
+ if (!(desc->flags & OPFLAG_VIRTUAL_NOOP))
+ {
+ /* compile the instruction */
+ if (!generate_opcode(block, compiler, desc))
+ {
+ UML_ROLINS(block, mem(&m_core->m_r[REG_SR]), desc->pc, 16, 0x3f);
+ UML_AND(block, mem(&m_core->m_r[REG_PC]), desc->pc, 0x0000ffff);
+ UML_MOV(block, mem(&m_core->m_arg0), desc->opptr.w[0]);
+ UML_CALLC(block, cfunc_unimplemented, this);
+ }
+ }
+}
+
+
+/*------------------------------------------------------------------
+ generate_add_lpc - adds an offset to the long program counter
+ comprised of PC and the low 6 bits of SR
+------------------------------------------------------------------*/
+
+void unsp_device::generate_add_lpc(drcuml_block &block, int32_t offset)
+{
+ UML_ROLAND(block, I0, mem(&m_core->m_r[REG_SR]), 16, 0x3f0000);
+ UML_OR(block, I0, I0, mem(&m_core->m_r[REG_PC]));
+ UML_ADD(block, I0, I0, offset);
+ UML_ROLINS(block, mem(&m_core->m_r[REG_SR]), I0, 16, 0x3f);
+ UML_AND(block, mem(&m_core->m_r[REG_PC]), I0, 0x0000ffff);
+}
+
+
+/*------------------------------------------------------------------
+ generate_update_nzsc - perform a full flag update
+------------------------------------------------------------------*/
+
+void unsp_device::generate_update_nzsc(drcuml_block &block)
+{
+ UML_XOR(block, I1, I1, 0x0000ffff);
+ UML_SEXT(block, I1, I1, SIZE_WORD);
+ UML_SEXT(block, I2, I2, SIZE_WORD);
+ UML_CMP(block, I2, I1);
+ UML_SETc(block, uml::COND_L, I1);
+ UML_ROLINS(block, mem(&m_core->m_r[REG_SR]), I1, UNSP_S_SHIFT, UNSP_S);
+
+ UML_TEST(block, I3, 0x8000);
+ UML_SETc(block, uml::COND_NZ, I1);
+ UML_ROLINS(block, mem(&m_core->m_r[REG_SR]), I1, UNSP_N_SHIFT, UNSP_N);
+
+ UML_TEST(block, I3, 0x10000);
+ UML_SETc(block, uml::COND_NZ, I1);
+ UML_ROLINS(block, mem(&m_core->m_r[REG_SR]), I1, UNSP_C_SHIFT, UNSP_C);
+
+ UML_TEST(block, I3, 0x0000ffff);
+ UML_SETc(block, uml::COND_Z, I1);
+ UML_ROLINS(block, mem(&m_core->m_r[REG_SR]), I1, UNSP_Z_SHIFT, UNSP_Z);
+}
+
+
+/*------------------------------------------------------------------
+ generate_update_nz - perform a partial flag update
+------------------------------------------------------------------*/
+
+void unsp_device::generate_update_nz(drcuml_block &block)
+{
+ UML_TEST(block, I3, 0x8000);
+ UML_SETc(block, uml::COND_NZ, I1);
+ UML_ROLINS(block, mem(&m_core->m_r[REG_SR]), I1, UNSP_N_SHIFT, UNSP_N);
+
+ UML_AND(block, I2, I3, 0x0000ffff);
+ UML_CMP(block, I2, 0);
+ UML_SETc(block, uml::COND_E, I1);
+ UML_ROLINS(block, mem(&m_core->m_r[REG_SR]), I1, UNSP_Z_SHIFT, UNSP_Z);
+}
+
+
+/*------------------------------------------------------------------
+ generate_opcode - main handler which generates the UML for a
+ single opcode
+------------------------------------------------------------------*/
+
+bool unsp_device::generate_opcode(drcuml_block &block, compiler_state &compiler, const opcode_desc *desc)
+{
+ uint32_t op = (uint32_t)desc->opptr.w[0];
+
+ generate_add_lpc(block, 1);
+
+ const uint16_t op0 = (op >> 12) & 15;
+ const uint16_t opa = (op >> 9) & 7;
+ const uint16_t op1 = (op >> 6) & 7;
+ const uint16_t opn = (op >> 3) & 7;
+ const uint16_t opb = op & 7;
+
+ const uint8_t lower_op = (op1 << 4) | op0;
+
+ uml::code_label skip_branch = compiler.m_labelnum++;
+ uml::code_label clear_fiq = compiler.m_labelnum++;
+ uml::code_label clear_irq = compiler.m_labelnum++;
+ uml::code_label reti_done = compiler.m_labelnum++;
+ uml::code_label mul_opa_nohi = compiler.m_labelnum++;
+ uml::code_label mul_opb_nohi = compiler.m_labelnum++;
+ uml::code_label shift_no_sign = compiler.m_labelnum++;
+ uml::code_label no_carry = compiler.m_labelnum++;
+
+ if(op0 < 0xf && opa == 0x7 && op1 < 2)
+ {
+ const uint32_t opimm = op & 0x3f;
+ switch(op0)
+ {
+ case 0: // JB
+ UML_TEST(block, mem(&m_core->m_r[REG_SR]), UNSP_C);
+ UML_JMPc(block, uml::COND_NZ, skip_branch);
+ break;
+
+ case 1: // JAE
+ UML_TEST(block, mem(&m_core->m_r[REG_SR]), UNSP_C);
+ UML_JMPc(block, uml::COND_Z, skip_branch);
+ break;
+
+ case 2: // JGE
+ UML_TEST(block, mem(&m_core->m_r[REG_SR]), UNSP_S);
+ UML_JMPc(block, uml::COND_NZ, skip_branch);
+ break;
+
+ case 3: // JL
+ UML_TEST(block, mem(&m_core->m_r[REG_SR]), UNSP_S);
+ UML_JMPc(block, uml::COND_Z, skip_branch);
+ break;
+
+ case 4: // JNE
+ UML_TEST(block, mem(&m_core->m_r[REG_SR]), UNSP_Z);
+ UML_JMPc(block, uml::COND_NZ, skip_branch);
+ break;
+
+ case 5: // JE
+ UML_TEST(block, mem(&m_core->m_r[REG_SR]), UNSP_Z);
+ UML_JMPc(block, uml::COND_Z, skip_branch);
+ break;
+
+ case 6: // JPL
+ UML_TEST(block, mem(&m_core->m_r[REG_SR]), UNSP_N);
+ UML_JMPc(block, uml::COND_NZ, skip_branch);
+ break;
+
+ case 7: // JMI
+ UML_TEST(block, mem(&m_core->m_r[REG_SR]), UNSP_N);
+ UML_JMPc(block, uml::COND_Z, skip_branch);
+ break;
+
+ case 8: // JBE
+ UML_AND(block, I0, mem(&m_core->m_r[REG_SR]), UNSP_Z | UNSP_C);
+ UML_CMP(block, I0, UNSP_C);
+ UML_JMPc(block, uml::COND_E, skip_branch);
+ break;
+
+ case 9: // JA
+ UML_AND(block, I0, mem(&m_core->m_r[REG_SR]), UNSP_Z | UNSP_C);
+ UML_CMP(block, I0, UNSP_C);
+ UML_JMPc(block, uml::COND_NE, skip_branch);
+ break;
+
+ case 10: // JLE
+ UML_TEST(block, mem(&m_core->m_r[REG_SR]), UNSP_Z | UNSP_S);
+ UML_JMPc(block, uml::COND_Z, skip_branch);
+ break;
+
+ case 11: // JG
+ UML_TEST(block, mem(&m_core->m_r[REG_SR]), UNSP_Z);
+ UML_JMPc(block, uml::COND_NZ, skip_branch);
+ UML_TEST(block, mem(&m_core->m_r[REG_SR]), UNSP_S);
+ UML_JMPc(block, uml::COND_NZ, skip_branch);
+ break;
+
+ case 14: // JMP
+ UML_SUB(block, mem(&m_core->m_icount), mem(&m_core->m_icount), 4);
+ UML_MOV(block, I0, desc->targetpc);
+ UML_AND(block, mem(&m_core->m_r[REG_PC]), I0, 0x0000ffff);
+ generate_branch(block, compiler, desc);
+ return true;
+
+ default:
+ return false;
+ }
+ UML_SUB(block, mem(&m_core->m_icount), mem(&m_core->m_icount), 4);
+ generate_add_lpc(block, (op1 == 0) ? opimm : (0 - opimm));
+ generate_branch(block, compiler, desc);
+ UML_LABEL(block, skip_branch);
+ UML_SUB(block, mem(&m_core->m_icount), mem(&m_core->m_icount), 2);
+ return true;
+ }
+
+ UML_SUB(block, mem(&m_core->m_icount), mem(&m_core->m_icount), desc->cycles);
+
+ if (lower_op == 0x2d) // Push
+ {
+ uint32_t r0 = opn;
+ uint32_t r1 = opa;
+ UML_MOV(block, I0, mem(&m_core->m_r[opb]));
+ while (r0)
+ {
+ UML_MOV(block, I1, mem(&m_core->m_r[r1]));
+ UML_CALLH(block, *m_mem_write);
+ UML_SUB(block, I0, I0, 1);
+ UML_AND(block, mem(&m_core->m_r[opb]), I0, 0x0000ffff);
+ r0--;
+ r1--;
+ }
+ return true;
+ }
+ else if (lower_op == 0x29)
+ {
+ if (op == 0x9a98) // reti
+ {
+ UML_ADD(block, I0, mem(&m_core->m_r[REG_SP]), 1);
+ UML_CALLH(block, *m_mem_read);
+ UML_MOV(block, mem(&m_core->m_r[REG_SR]), I1);
+
+ UML_ADD(block, I0, I0, 1);
+ UML_CALLH(block, *m_mem_read);
+ UML_MOV(block, mem(&m_core->m_r[REG_PC]), I1);
+
+ UML_AND(block, mem(&m_core->m_r[REG_SP]), I0, 0x0000ffff);
+
+ UML_TEST(block, mem(&m_core->m_fiq), 1);
+ UML_JMPc(block, uml::COND_NZ, clear_fiq);
+ UML_TEST(block, mem(&m_core->m_irq), 1);
+ UML_JMPc(block, uml::COND_NZ, clear_irq);
+ UML_JMP(block, reti_done);
+
+ UML_LABEL(block, clear_fiq);
+ UML_MOV(block, mem(&m_core->m_fiq), 0);
+ UML_MOV(block, mem(&m_core->m_saved_sb[2]), mem(&m_core->m_sb));
+ UML_LOAD(block, mem(&m_core->m_sb), (void*)m_core->m_saved_sb, mem(&m_core->m_irq), SIZE_DWORD, SCALE_x4);
+ UML_JMP(block, reti_done);
+
+ UML_LABEL(block, clear_irq);
+ UML_MOV(block, mem(&m_core->m_irq), 0);
+ UML_MOV(block, mem(&m_core->m_saved_sb[1]), mem(&m_core->m_sb));
+ UML_MOV(block, mem(&m_core->m_sb), mem(&m_core->m_saved_sb[0]));
+
+ UML_LABEL(block, reti_done);
+ UML_MOV(block, mem(&m_core->m_curirq), 0);
+ generate_branch(block, compiler, desc);
+ }
+ else // pop
+ {
+ uint32_t r0 = opn;
+ uint32_t r1 = opa;
+ bool do_branch = false;
+
+ UML_MOV(block, I0, mem(&m_core->m_r[opb]));
+ while (r0)
+ {
+ r1++;
+ UML_ADD(block, I0, I0, 1);
+ UML_AND(block, mem(&m_core->m_r[opb]), I0, 0x0000ffff);
+ UML_CALLH(block, *m_mem_read);
+ UML_MOV(block, mem(&m_core->m_r[r1]), I1);
+ if (r1 == REG_PC)
+ do_branch = true;
+ r0--;
+ }
+ if (do_branch)
+ generate_branch(block, compiler, desc);
+ }
+ return true;
+ }
+ else if (op0 == 0xf)
+ {
+ switch (op1)
+ {
+ case 0x00: // Multiply, Unsigned * Signed
+ if(opn == 1 && opa != 7)
+ {
+ UML_MOV(block, I0, mem(&m_core->m_r[opa]));
+ UML_MOV(block, I1, mem(&m_core->m_r[opb]));
+ UML_MULU(block, I2, I2, I0, I1);
+
+ UML_TEST(block, I1, 0x00008000);
+ UML_JMPc(block, uml::COND_Z, mul_opb_nohi);
+ UML_SHL(block, I0, I0, 16);
+ UML_SUB(block, I2, I2, I0);
+
+ UML_LABEL(block, mul_opb_nohi);
+ UML_SHR(block, mem(&m_core->m_r[REG_R4]), I2, 16);
+ UML_AND(block, mem(&m_core->m_r[REG_R3]), I2, 0x0000ffff);
+ return true;
+ }
+ return false;
+
+ case 0x01: // Call
+ if(!(opa & 1))
+ {
+ generate_add_lpc(block, 1);
+
+ UML_MOV(block, I0, mem(&m_core->m_r[REG_SP]));
+
+ UML_MOV(block, I1, mem(&m_core->m_r[REG_PC]));
+ UML_CALLH(block, *m_mem_write);
+ UML_SUB(block, I0, I0, 1);
+
+ UML_MOV(block, I1, mem(&m_core->m_r[REG_SR]));
+ UML_CALLH(block, *m_mem_write);
+ UML_SUB(block, I0, I0, 1);
+
+ UML_AND(block, mem(&m_core->m_r[REG_SP]), I0, 0x0000ffff);
+
+ UML_MOV(block, I0, desc->targetpc);
+ UML_AND(block, mem(&m_core->m_r[REG_PC]), I0, 0x0000ffff);
+ UML_ROLINS(block, mem(&m_core->m_r[REG_SR]), I0, 16, 0x3f);
+ generate_branch(block, compiler, desc);
+ return true;
+ }
+ return false;
+
+ case 0x02: // Far Jump
+ if (opa == 7)
+ {
+ UML_MOV(block, I0, desc->targetpc);
+ UML_AND(block, mem(&m_core->m_r[REG_PC]), I0, 0x0000ffff);
+ UML_ROLINS(block, mem(&m_core->m_r[REG_SR]), I0, 16, 0x3f);
+ generate_branch(block, compiler, desc);
+ return true;
+ }
+ return false;
+
+ case 0x04: // Multiply, Signed * Signed
+ if(opn == 1 && opa != 7)
+ {
+ UML_MOV(block, I0, mem(&m_core->m_r[opa]));
+ UML_MOV(block, I1, mem(&m_core->m_r[opb]));
+ UML_MULU(block, I2, I2, I0, I1);
+
+ UML_TEST(block, I1, 0x00008000);
+ UML_JMPc(block, uml::COND_Z, mul_opb_nohi);
+ UML_SHL(block, I0, I0, 16);
+ UML_SUB(block, I2, I2, I0);
+
+ UML_LABEL(block, mul_opb_nohi);
+ UML_TEST(block, I0, 0x00008000);
+ UML_JMPc(block, uml::COND_Z, mul_opa_nohi);
+ UML_SHL(block, I1, I1, 16);
+ UML_SUB(block, I2, I2, I1);
+
+ UML_LABEL(block, mul_opa_nohi);
+ UML_SHR(block, mem(&m_core->m_r[REG_R4]), I2, 16);
+ UML_AND(block, mem(&m_core->m_r[REG_R3]), I2, 0x0000ffff);
+ return true;
+ }
+ return false;
+
+ case 0x05: // Interrupt flags
+ switch(op & 0x3f)
+ {
+ case 0:
+ UML_MOV(block, mem(&m_core->m_enable_irq), 0);
+ UML_MOV(block, mem(&m_core->m_enable_fiq), 0);
+ break;
+
+ case 1:
+ UML_MOV(block, mem(&m_core->m_enable_irq), 1);
+ UML_MOV(block, mem(&m_core->m_enable_fiq), 0);
+ break;
+
+ case 2:
+ UML_MOV(block, mem(&m_core->m_enable_irq), 0);
+ UML_MOV(block, mem(&m_core->m_enable_fiq), 1);
+ break;
+
+ case 3:
+ UML_MOV(block, mem(&m_core->m_enable_irq), 1);
+ UML_MOV(block, mem(&m_core->m_enable_fiq), 1);
+ break;
+
+ case 8:
+ UML_MOV(block, mem(&m_core->m_enable_irq), 0);
+ break;
+
+ case 9:
+ UML_MOV(block, mem(&m_core->m_enable_irq), 1);
+ break;
+
+ case 12:
+ UML_MOV(block, mem(&m_core->m_enable_fiq), 0);
+ break;
+
+ case 14:
+ UML_MOV(block, mem(&m_core->m_enable_fiq), 1);
+ break;
+
+ case 37:
+ // nop
+ break;
+
+ default:
+ return false;
+ }
+ return true;
+
+ default:
+ return false;
+ }
+ }
+
+ // At this point, we should be dealing solely with ALU ops.
+ UML_MOV(block, I2, mem(&m_core->m_r[opa]));
+
+ switch (op1)
+ {
+ case 0x00: // r, [bp+imm6]
+ UML_ADD(block, I0, mem(&m_core->m_r[REG_BP]), op & 0x3f);
+ UML_AND(block, I0, I0, 0x0000ffff);
+ if (op0 != 0x0d)
+ UML_CALLH(block, *m_mem_read);
+ break;
+
+ case 0x01: // r, imm6
+ UML_MOV(block, I1, op & 0x3f);
+ break;
+
+ case 0x03: // Indirect
+ {
+ const uint8_t lsbits = opn & 3;
+ if (opn & 4)
+ {
+ switch (lsbits)
+ {
+ case 0: // r, [<ds:>r]
+ UML_ROLAND(block, I0, mem(&m_core->m_r[REG_SR]), 6, 0x3f0000);
+ UML_OR(block, I0, I0, mem(&m_core->m_r[opb]));
+ if (op0 != 0x0d)
+ UML_CALLH(block, *m_mem_read);
+ break;
+
+ case 1: // r, [<ds:>r--]
+ UML_ROLAND(block, I0, mem(&m_core->m_r[REG_SR]), 6, 0x3f0000);
+ UML_OR(block, I0, I0, mem(&m_core->m_r[opb]));
+ if (op0 != 0x0d)
+ UML_CALLH(block, *m_mem_read);
+ UML_SUB(block, I3, I0, 1);
+ UML_ROLINS(block, mem(&m_core->m_r[REG_SR]), I3, 32-6, 0x0000fc00);
+ UML_AND(block, mem(&m_core->m_r[opb]), I3, 0x0000ffff);
+ break;
+
+ case 2: // r, [<ds:>r++]
+ UML_ROLAND(block, I0, mem(&m_core->m_r[REG_SR]), 6, 0x3f0000);
+ UML_OR(block, I0, I0, mem(&m_core->m_r[opb]));
+ if (op0 != 0x0d)
+ UML_CALLH(block, *m_mem_read);
+ UML_ADD(block, I3, I0, 1);
+ UML_ROLINS(block, mem(&m_core->m_r[REG_SR]), I3, 32-6, 0x0000fc00);
+ UML_AND(block, mem(&m_core->m_r[opb]), I3, 0x0000ffff);
+ break;
+
+ case 3: // r, [<ds:>++r]
+ UML_ROLAND(block, I0, mem(&m_core->m_r[REG_SR]), 6, 0x3f0000);
+ UML_OR(block, I0, I0, mem(&m_core->m_r[opb]));
+ UML_ADD(block, I0, I0, 1);
+ UML_ROLINS(block, mem(&m_core->m_r[REG_SR]), I0, 32-6, 0x0000fc00);
+ UML_AND(block, mem(&m_core->m_r[opb]), I0, 0x0000ffff);
+ if (op0 != 0x0d)
+ UML_CALLH(block, *m_mem_read);
+ break;
+
+ default:
+ // can't happen
+ break;
+ }
+ }
+ else
+ {
+ switch (lsbits)
+ {
+ case 0: // r, [r]
+ UML_MOV(block, I0, mem(&m_core->m_r[opb]));
+ if (op0 != 0x0d)
+ UML_CALLH(block, *m_mem_read);
+ break;
+
+ case 1: // r, [r--]
+ UML_MOV(block, I0, mem(&m_core->m_r[opb]));
+ if (op0 != 0x0d)
+ UML_CALLH(block, *m_mem_read);
+ UML_SUB(block, I3, I0, 1);
+ UML_AND(block, mem(&m_core->m_r[opb]), I3, 0x0000ffff);
+ break;
+
+ case 2: // r, [r++]
+ UML_MOV(block, I0, mem(&m_core->m_r[opb]));
+ if (op0 != 0x0d)
+ UML_CALLH(block, *m_mem_read);
+ UML_ADD(block, I3, I0, 1);
+ UML_AND(block, mem(&m_core->m_r[opb]), I3, 0x0000ffff);
+ break;
+
+ case 3: // r, [++r]
+ UML_ADD(block, I0, mem(&m_core->m_r[opb]), 1);
+ UML_AND(block, I0, I0, 0x0000ffff);
+ UML_MOV(block, mem(&m_core->m_r[opb]), I0);
+ if (op0 != 0x0d)
+ UML_CALLH(block, *m_mem_read);
+ break;
+ default:
+ // can't happen
+ break;
+ }
+ }
+ break;
+ }
+
+ case 0x04: // 16-bit ops
+ switch (opn)
+ {
+ case 0x00: // r
+ UML_MOV(block, I1, mem(&m_core->m_r[opb]));
+ break;
+
+ case 0x01: // imm16
+ {
+ UML_MOV(block, I2, mem(&m_core->m_r[opb]));
+ const uint16_t r1 = m_pr16(desc->pc + 1);
+ generate_add_lpc(block, 1);
+ UML_MOV(block, I1, r1);
+ break;
+ }
+
+ case 0x02: // [imm16]
+ {
+ UML_MOV(block, I2, mem(&m_core->m_r[opb]));
+ const uint16_t r1 = m_pr16(desc->pc + 1);
+ generate_add_lpc(block, 1);
+ UML_MOV(block, I0, r1);
+ if (op0 != 0x0d)
+ UML_CALLH(block, *m_mem_read);
+ break;
+ }
+
+ case 0x03: // store [imm16], r
+ {
+ UML_MOV(block, I1, I2);
+ UML_MOV(block, I2, mem(&m_core->m_r[opb]));
+ const uint16_t r2 = m_pr16(desc->pc + 1);
+ generate_add_lpc(block, 1);
+ UML_MOV(block, I0, r2);
+ break;
+ }
+
+ default: // Shifted ops
+ {
+ UML_SHL(block, I0, mem(&m_core->m_r[opb]), 4);
+ UML_OR(block, I0, I0, mem(&m_core->m_sb));
+ UML_TEST(block, I0, 0x80000);
+ UML_JMPc(block, uml::COND_Z, shift_no_sign);
+ UML_OR(block, I0, I0, 0xf00000);
+
+ UML_LABEL(block, shift_no_sign);
+ UML_SHR(block, I0, I0, opn - 3);
+ UML_AND(block, mem(&m_core->m_sb), I0, 0xf);
+ UML_SHR(block, I1, I0, 4);
+ UML_AND(block, I1, I1, 0x0000ffff);
+ break;
+ }
+ }
+ break;
+
+ case 0x05: // More shifted ops
+ if (opn & 4) // Shift right
+ {
+ UML_SHL(block, I0, mem(&m_core->m_r[opb]), 4);
+ UML_OR(block, I0, I0, mem(&m_core->m_sb));
+ UML_SHR(block, I0, I0, opn - 3);
+ UML_AND(block, mem(&m_core->m_sb), I0, 0xf);
+ UML_SHR(block, I1, I0, 4);
+ UML_AND(block, I1, I1, 0x0000ffff);
+ }
+ else // Shift left
+ {
+ UML_SHL(block, I0, mem(&m_core->m_sb), 16);
+ UML_OR(block, I0, I0, mem(&m_core->m_r[opb]));
+ UML_SHL(block, I0, I0, opn + 1);
+ UML_SHR(block, I1, I0, 16);
+ UML_AND(block, mem(&m_core->m_sb), I1, 0xf);
+ UML_AND(block, I1, I0, 0x0000ffff);
+ }
+ break;
+
+ case 0x06: // Rotated ops
+ {
+ UML_SHL(block, I0, mem(&m_core->m_sb), 16);
+ UML_OR(block, I0, I0, mem(&m_core->m_r[opb]));
+ UML_SHL(block, I0, I0, 4);
+ UML_OR(block, I0, I0, mem(&m_core->m_sb));
+ if (opn & 4) // Rotate right
+ {
+ UML_SHR(block, I0, I0, opn - 3);
+ UML_AND(block, mem(&m_core->m_sb), I0, 0xf);
+ }
+ else // Rotate left
+ {
+ UML_SHL(block, I0, I0, opn + 1);
+ UML_SHR(block, I1, I0, 20);
+ UML_AND(block, mem(&m_core->m_sb), I1, 0xf);
+ }
+ UML_SHR(block, I1, I0, 4);
+ UML_AND(block, I1, I1, 0x0000ffff);
+ break;
+ }
+
+ case 0x07: // Direct 8
+ UML_MOV(block, I0, op & 0x3f);
+ UML_CALLH(block, *m_mem_read);
+ break;
+
+ default:
+ break;
+ }
+
+ switch (op0)
+ {
+ case 0x00: // Add
+ UML_ADD(block, I3, I2, I1);
+ if (opa != 7)
+ generate_update_nzsc(block);
+ break;
+
+ case 0x01: // Add w/ carry
+ UML_ROLAND(block, I3, mem(&m_core->m_r[REG_SR]), 32-UNSP_C_SHIFT, 1);
+ UML_ADD(block, I3, I3, I2);
+ UML_ADD(block, I3, I3, I1);
+ if (opa != 7)
+ generate_update_nzsc(block);
+ break;
+
+ case 0x02: // Subtract
+ UML_XOR(block, I1, I1, 0x0000ffff);
+ UML_ADD(block, I3, I1, I2);
+ UML_ADD(block, I3, I3, 1);
+ if (opa != 7)
+ generate_update_nzsc(block);
+ break;
+
+ case 0x03: // Subtract w/ carry
+ UML_XOR(block, I1, I1, 0x0000ffff);
+ UML_ADD(block, I3, I1, I2);
+ UML_TEST(block, mem(&m_core->m_r[REG_SR]), UNSP_C);
+ UML_JMPc(block, uml::COND_Z, no_carry);
+ UML_ADD(block, I3, I3, 1);
+
+ UML_LABEL(block, no_carry);
+ if (opa != 7)
+ generate_update_nzsc(block);
+ break;
+
+ case 0x04: // Compare
+ UML_XOR(block, I1, I1, 0x0000ffff);
+ UML_ADD(block, I3, I1, I2);
+ UML_ADD(block, I3, I3, 1);
+ if (opa != 7)
+ generate_update_nzsc(block);
+ return true;
+
+ case 0x06: // Negate
+ UML_SUB(block, I3, 0, I1);
+ if (opa != 7)
+ generate_update_nz(block);
+ break;
+
+ case 0x08: // XOR
+ UML_XOR(block, I3, I2, I1);
+ if (opa != 7)
+ generate_update_nz(block);
+ break;
+
+ case 0x09: // Load
+ UML_MOV(block, I3, I1);
+ if (opa != 7)
+ generate_update_nz(block);
+ break;
+
+ case 0x0a: // OR
+ UML_OR(block, I3, I2, I1);
+ if (opa != 7)
+ generate_update_nz(block);
+ break;
+
+ case 0x0b: // AND
+ UML_AND(block, I3, I2, I1);
+ if (opa != 7)
+ generate_update_nz(block);
+ break;
+
+ case 0x0c: // Test
+ UML_AND(block, I3, I2, I1);
+ if (opa != 7)
+ generate_update_nz(block);
+ return true;
+
+ case 0x0d: // Store
+ UML_MOV(block, I1, I2);
+ UML_CALLH(block, *m_mem_write);
+ return true;
+
+ default:
+ return false;
+ }
+
+ if (op1 == 0x04 && opn == 0x03)
+ {
+ UML_MOV(block, I1, I3);
+ UML_CALLH(block, *m_mem_write);
+ return true;
+ }
+
+ UML_AND(block, mem(&m_core->m_r[opa]), I3, 0x0000ffff);
+ if (opa == REG_PC)
+ generate_branch(block, compiler, desc);
+ return true;
+}
diff --git a/src/devices/cpu/unsp/unspfe.cpp b/src/devices/cpu/unsp/unspfe.cpp
new file mode 100644
index 00000000000..3eb38b2198c
--- /dev/null
+++ b/src/devices/cpu/unsp/unspfe.cpp
@@ -0,0 +1,357 @@
+// license:BSD-3-Clause
+// copyright-holders:Ryan Holtz
+/***************************************************************************
+
+ unspfe.cpp
+
+ Front end for u'nSP recompiler
+
+***************************************************************************/
+
+#include "emu.h"
+#include "unspfe.h"
+#include "unspdefs.h"
+
+/***************************************************************************
+ INSTRUCTION PARSERS
+***************************************************************************/
+
+unsp_frontend::unsp_frontend(unsp_device *unsp, uint32_t window_start, uint32_t window_end, uint32_t max_sequence)
+ : drc_frontend(*unsp, window_start, window_end, max_sequence)
+ , m_cpu(unsp)
+{
+}
+
+inline uint16_t unsp_frontend::read_op_word(opcode_desc &desc, int offset)
+{
+ return m_cpu->m_pr16(desc.physpc + offset);
+}
+
+/*-------------------------------------------------
+ describe - build a description of a single
+ instruction
+-------------------------------------------------*/
+
+bool unsp_frontend::describe(opcode_desc &desc, const opcode_desc *prev)
+{
+ uint16_t op = desc.opptr.w[0] = read_op_word(desc, 0);
+
+ /* most instructions are 1 word */
+ desc.length = 1;
+ desc.delayslots = 0;
+
+ const uint16_t op0 = (op >> 12) & 15;
+ const uint16_t opa = (op >> 9) & 7;
+ const uint16_t op1 = (op >> 6) & 7;
+ const uint16_t opn = (op >> 3) & 7;
+ const uint16_t opb = op & 7;
+
+ const uint8_t lower_op = (op1 << 4) | op0;
+
+ if(op0 < 0xf && opa == 0x7 && op1 < 2)
+ {
+ desc.cycles = 2; // cycles for a taken branch will be added at execute time
+
+ const uint32_t opimm = op & 0x3f;
+ switch(op0)
+ {
+ case 0: // JB
+ case 1: // JAE
+ case 2: // JGE
+ case 3: // JL
+ case 4: // JNE
+ case 5: // JE
+ case 6: // JPL
+ case 7: // JMI
+ case 8: // JBE
+ case 9: // JA
+ case 10: // JLE
+ case 11: // JG
+ desc.regin[0] |= 1 << unsp_device::REG_SR;
+ desc.regout[0] |= 1 << unsp_device::REG_SR;
+ desc.regout[0] |= 1 << unsp_device::REG_PC;
+ desc.targetpc = BRANCH_TARGET_DYNAMIC;
+ desc.flags |= OPFLAG_IS_CONDITIONAL_BRANCH | OPFLAG_END_SEQUENCE;
+ return true;
+ case 14: // JMP
+ desc.regout[0] |= 1 << unsp_device::REG_SR;
+ desc.regout[0] |= 1 << unsp_device::REG_PC;
+ desc.targetpc = desc.pc + 1 + ((op1 == 0) ? opimm : (0 - opimm));
+ desc.flags |= OPFLAG_IS_UNCONDITIONAL_BRANCH | OPFLAG_END_SEQUENCE;
+ return true;
+ default:
+ return false;
+ }
+ }
+ else if (lower_op == 0x2d) // Push
+ {
+ uint16_t r0 = opn;
+ uint16_t r1 = opa;
+ desc.cycles = 4 + 2 * r0;
+ desc.regin[0] |= 1 << opb;
+ desc.regout[0] |= 1 << opb;
+ desc.flags |= OPFLAG_WRITES_MEMORY;
+ while (r0--)
+ {
+ desc.regin[0] |= 1 << r1;
+ r1--;
+ }
+ return true;
+ }
+ else if (lower_op == 0x29) // Pop
+ {
+ if (op == 0x9a98) // reti
+ {
+ desc.cycles = 8;
+ desc.regin[0] |= 1 << unsp_device::REG_SP;
+ desc.regout[0] |= 1 << unsp_device::REG_SP;
+ desc.regout[0] |= 1 << unsp_device::REG_SR;
+ desc.regout[0] |= 1 << unsp_device::REG_PC;
+ desc.targetpc = BRANCH_TARGET_DYNAMIC;
+ desc.flags |= OPFLAG_IS_UNCONDITIONAL_BRANCH | OPFLAG_END_SEQUENCE | OPFLAG_READS_MEMORY;
+ return true;
+ }
+ else
+ {
+ uint16_t r0 = opn;
+ uint16_t r1 = opa;
+ desc.cycles = 4 + 2 * r0;
+ desc.regin[0] |= 1 << opb;
+ desc.regout[0] |= 1 << opb;
+ desc.flags |= OPFLAG_READS_MEMORY;
+
+ while (r0--)
+ {
+ r1++;
+ desc.regout[0] |= 1 << r1;
+ }
+ return true;
+ }
+ }
+ else if (op0 == 0xf)
+ {
+ switch (op1)
+ {
+ case 0x00: // Multiply, Unsigned * Signed
+ case 0x04: // Multiply, Signed * Signed
+ if(opn == 1 && opa != 7)
+ {
+ desc.cycles = 12;
+ desc.regin[0] |= 1 << opa;
+ desc.regin[0] |= 1 << opb;
+ desc.regout[0] |= 1 << unsp_device::REG_R3;
+ desc.regout[0] |= 1 << unsp_device::REG_R4;
+ return true;
+ }
+ return false;
+
+ case 0x01: // Call
+ if(!(opa & 1))
+ {
+ desc.cycles = 9;
+ desc.length = 2;
+ desc.targetpc = read_op_word(desc, 1) | ((op & 0x3f) << 16);
+ desc.flags = OPFLAG_READS_MEMORY | OPFLAG_WRITES_MEMORY | OPFLAG_IS_UNCONDITIONAL_BRANCH | OPFLAG_END_SEQUENCE;
+ desc.regin[0] |= 1 << unsp_device::REG_PC;
+ desc.regin[0] |= 1 << unsp_device::REG_SP;
+ desc.regout[0] |= 1 << unsp_device::REG_SP;
+ desc.regout[0] |= 1 << unsp_device::REG_SR;
+ desc.regout[0] |= 1 << unsp_device::REG_PC;
+ return true;
+ }
+ return false;
+
+ case 0x02: // Far Jump
+ if (opa == 7)
+ {
+ desc.cycles = 5;
+ desc.length = 2;
+ desc.targetpc = read_op_word(desc, 1) | ((op & 0x3f) << 16);
+ desc.flags = OPFLAG_READS_MEMORY | OPFLAG_IS_UNCONDITIONAL_BRANCH | OPFLAG_END_SEQUENCE;
+ desc.regin[0] |= 1 << unsp_device::REG_PC;
+ desc.regout[0] |= 1 << unsp_device::REG_SR;
+ desc.regout[0] |= 1 << unsp_device::REG_PC;
+ return true;
+ }
+ return false;
+
+ case 0x05: // Interrupt flags
+ desc.cycles = 2;
+ switch(op & 0x3f)
+ {
+ case 0:
+ case 1:
+ case 2:
+ case 3:
+ case 8:
+ case 9:
+ case 12:
+ case 14:
+ case 37:
+ return true;
+ }
+ return false;
+
+ default:
+ return false;
+ }
+ }
+
+ // At this point, we should be dealing solely with ALU ops.
+
+ desc.regin[0] |= 1 << opa;
+
+ switch (op1)
+ {
+ case 0x00: // r, [bp+imm6]
+ desc.cycles = 6;
+ desc.regin[0] |= 1 << unsp_device::REG_BP;
+ if (op0 != 0x0d)
+ desc.flags |= OPFLAG_READS_MEMORY;
+ break;
+
+ case 0x01: // r, imm6
+ desc.cycles = 2;
+ break;
+
+ case 0x03: // Indirect
+ {
+ desc.cycles = (opa == 7 ? 7 : 6);
+ const uint8_t lsbits = opn & 3;
+ if (opn & 4)
+ {
+ switch (lsbits)
+ {
+ case 0: // r, [r]
+ desc.regin[0] |= 1 << unsp_device::REG_SR;
+ desc.regin[0] |= 1 << opb;
+ if (op0 != 0x0d)
+ desc.flags |= OPFLAG_READS_MEMORY;
+ break;
+
+ case 1: // r, [<ds:>r--]
+ case 2: // r, [<ds:>r++]
+ case 3: // r, [<ds:>++r]
+ desc.regin[0] |= 1 << unsp_device::REG_SR;
+ desc.regin[0] |= 1 << opb;
+ desc.regout[0] |= 1 << unsp_device::REG_SR;
+ desc.regout[0] |= 1 << opb;
+ if (op0 != 0x0d)
+ desc.flags |= OPFLAG_READS_MEMORY;
+ break;
+ }
+ }
+ else
+ {
+ switch (lsbits)
+ {
+ case 0: // r, [r]
+ desc.regin[0] |= 1 << opb;
+ if (op0 != 0x0d)
+ desc.flags |= OPFLAG_READS_MEMORY;
+ break;
+ case 1: // r, [r--]
+ case 2: // r, [r++]
+ case 3: // r, [++r]
+ desc.regin[0] |= 1 << opb;
+ desc.regout[0] |= 1 << opb;
+ if (op0 != 0x0d)
+ desc.flags |= OPFLAG_READS_MEMORY;
+ break;
+ }
+ }
+ break;
+ }
+
+ case 0x04: // 16-bit ops
+ switch (opn)
+ {
+ case 0x00: // r
+ desc.cycles = (opa == 7 ? 5 : 3);
+ desc.regin[0] |= 1 << opb;
+ break;
+
+ case 0x01: // imm16
+ desc.cycles = (opa == 7 ? 5 : 4);
+ desc.length = 2;
+ desc.regin[0] |= 1 << opb;
+ desc.regin[0] |= 1 << unsp_device::REG_SR;
+ desc.regin[0] |= 1 << unsp_device::REG_PC;
+ desc.regout[0] |= 1 << unsp_device::REG_SR;
+ desc.regout[0] |= 1 << unsp_device::REG_PC;
+ desc.flags |= OPFLAG_READS_MEMORY;
+ break;
+
+ case 0x02: // [imm16]
+ case 0x03: // store [imm16], r
+ desc.cycles = (opa == 7 ? 8 : 7);
+ desc.length = 2;
+ desc.regin[0] |= 1 << opb;
+ desc.regin[0] |= 1 << unsp_device::REG_SR;
+ desc.regin[0] |= 1 << unsp_device::REG_PC;
+ desc.regout[0] |= 1 << unsp_device::REG_SR;
+ desc.regout[0] |= 1 << unsp_device::REG_PC;
+ desc.flags |= OPFLAG_READS_MEMORY;
+ break;
+
+ default: // Shifted ops
+ desc.cycles = (opa == 7 ? 5 : 3);
+ desc.regin[0] |= 1 << opb;
+ break;
+ }
+ break;
+
+ case 0x05: // More shifted ops
+ case 0x06: // Rotated ops
+ desc.cycles = (opa == 7 ? 5 : 3);
+ desc.regin[0] |= 1 << opb;
+ break;
+
+ case 0x07: // Direct 8
+ desc.cycles = (opa == 7 ? 6 : 5);
+ desc.flags |= OPFLAG_READS_MEMORY;
+ break;
+
+ default:
+ // Can't happen
+ break;
+ }
+
+ switch (op0)
+ {
+ case 0x00: // Add
+ case 0x01: // Add w/ carry
+ case 0x02: // Subtract
+ case 0x03: // Subtract w/ carry
+ case 0x06: // Negate
+ case 0x08: // XOR
+ case 0x09: // Load
+ case 0x0a: // OR
+ case 0x0b: // AND
+ desc.regout[0] |= 1 << unsp_device::REG_SR;
+ break;
+ case 0x04: // Compare
+ case 0x0c: // Test
+ desc.regout[0] |= 1 << unsp_device::REG_SR;
+ return true;
+ case 0x0d: // Store
+ desc.flags |= OPFLAG_WRITES_MEMORY;
+ return true;
+ }
+
+ if (op1 == 0x04 && opn == 0x03) // store [imm16], r
+ {
+ desc.flags |= OPFLAG_WRITES_MEMORY;
+ }
+ else
+ {
+ desc.regout[0] |= 1 << opa;
+ if (opa == 7)
+ {
+ desc.targetpc = BRANCH_TARGET_DYNAMIC;
+ desc.flags |= OPFLAG_IS_UNCONDITIONAL_BRANCH | OPFLAG_END_SEQUENCE;
+ }
+ }
+
+ return true;
+}
diff --git a/src/devices/cpu/unsp/unspfe.h b/src/devices/cpu/unsp/unspfe.h
new file mode 100644
index 00000000000..c30b2721e0a
--- /dev/null
+++ b/src/devices/cpu/unsp/unspfe.h
@@ -0,0 +1,27 @@
+// license:BSD-3-Clause
+// copyright-holders:Ryan Holtz
+#ifndef MAME_CPU_UNSP_UNSPFE_H
+#define MAME_CPU_UNSP_UNSPFE_H
+
+#pragma once
+
+#include "unsp.h"
+#include "cpu/drcfe.h"
+
+class unsp_frontend : public drc_frontend
+{
+public:
+ unsp_frontend(unsp_device *unsp, uint32_t window_start, uint32_t window_end, uint32_t max_sequence);
+ void flush();
+
+protected:
+ // required overrides
+ virtual bool describe(opcode_desc &desc, const opcode_desc *prev) override;
+
+private:
+ inline uint16_t read_op_word(opcode_desc &desc, int offset);
+
+ unsp_device *m_cpu;
+};
+
+#endif /* MAME_CPU_UNSP_UNSPFE_H */
diff --git a/src/devices/cpu/z8/z8.cpp b/src/devices/cpu/z8/z8.cpp
index d5e19fe831f..1359fea831f 100644
--- a/src/devices/cpu/z8/z8.cpp
+++ b/src/devices/cpu/z8/z8.cpp
@@ -1,5 +1,5 @@
// license:BSD-3-Clause
-// copyright-holders:Curt Coder
+// copyright-holders:Curt Coder, AJR
/**********************************************************************
Zilog Z8 Single-Chip MCU emulation
@@ -11,8 +11,6 @@
TODO:
- strobed I/O
- - timer Tin/Tout modes
- - serial
- instruction pipeline
- internal diagnostic ROM in data space (requires high voltage reset)
@@ -33,14 +31,14 @@
#define Z8_P3_RDY0 0x20 /* not supported */
#define Z8_P3_RDY1 0x10 /* not supported */
#define Z8_P3_RDY2 0x40 /* not supported */
-#define Z8_P3_IRQ0 0x04 /* not supported */
-#define Z8_P3_IRQ1 0x08 /* not supported */
-#define Z8_P3_IRQ2 0x02 /* not supported */
-#define Z8_P3_IRQ3 0x01 /* not supported */
-#define Z8_P3_DI 0x01 /* not supported */
-#define Z8_P3_DO 0x80 /* not supported */
-#define Z8_P3_TIN 0x02 /* not supported */
-#define Z8_P3_TOUT 0x40 /* not supported */
+#define Z8_P3_IRQ0 0x04
+#define Z8_P3_IRQ1 0x08
+#define Z8_P3_IRQ2 0x02
+#define Z8_P3_IRQ3 0x01
+#define Z8_P3_SIN 0x01
+#define Z8_P3_SOUT 0x80
+#define Z8_P3_TIN 0x02
+#define Z8_P3_TOUT 0x40
#define Z8_P3_DM 0x10 /* not supported */
#define Z8_PRE0_COUNT_MODULO_N 0x01
@@ -52,15 +50,15 @@
#define Z8_TMR_ENABLE_T0 0x02
#define Z8_TMR_LOAD_T1 0x04
#define Z8_TMR_ENABLE_T1 0x08
-#define Z8_TMR_TIN_MASK 0x30 /* not supported */
-#define Z8_TMR_TIN_EXTERNAL_CLK 0x00 /* not supported */
-#define Z8_TMR_TIN_GATE 0x10 /* not supported */
-#define Z8_TMR_TIN_TRIGGER 0x20 /* not supported */
-#define Z8_TMR_TIN_RETRIGGER 0x30 /* not supported */
-#define Z8_TMR_TOUT_MASK 0xc0 /* not supported */
-#define Z8_TMR_TOUT_OFF 0x00 /* not supported */
-#define Z8_TMR_TOUT_T0 0x40 /* not supported */
-#define Z8_TMR_TOUT_T1 0x80 /* not supported */
+#define Z8_TMR_TIN_MASK 0x30
+#define Z8_TMR_TIN_EXTERNAL_CLK 0x00
+#define Z8_TMR_TIN_GATE 0x10
+#define Z8_TMR_TIN_TRIGGER 0x20
+#define Z8_TMR_TIN_RETRIGGER 0x30
+#define Z8_TMR_TOUT_MASK 0xc0
+#define Z8_TMR_TOUT_OFF 0x00
+#define Z8_TMR_TOUT_T0 0x40
+#define Z8_TMR_TOUT_T1 0x80
#define Z8_TMR_TOUT_INTERNAL_CLK 0xc0 /* not supported */
#define Z8_P01M_P0L_MODE_MASK 0x03
@@ -119,6 +117,7 @@ DEFINE_DEVICE_TYPE(UB8830D, ub8830d_device, "ub8830d", "UB8830D")
DEFINE_DEVICE_TYPE(Z8611, z8611_device, "z8611", "Zilog Z8611")
DEFINE_DEVICE_TYPE(Z8671, z8671_device, "z8671", "Zilog Z8671")
DEFINE_DEVICE_TYPE(Z8681, z8681_device, "z8681", "Zilog Z8681")
+DEFINE_DEVICE_TYPE(Z8682, z8682_device, "z8682", "Zilog Z8682")
/***************************************************************************
@@ -170,6 +169,7 @@ z8_device::z8_device(const machine_config &mconfig, device_type type, const char
, m_input_cb{{*this}, {*this}, {*this}, {*this}}
, m_output_cb{{*this}, {*this}, {*this}, {*this}}
, m_rom_size(rom_size)
+ , m_input{0xff, 0xff, 0xff, 0x0f}
{
assert(((rom_size - 1) & rom_size) == 0);
}
@@ -215,6 +215,23 @@ z8681_device::z8681_device(const machine_config &mconfig, const char *tag, devic
}
+z8682_device::z8682_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+ : z8_device(mconfig, Z8682, tag, owner, clock, 0x800, true)
+{
+}
+
+ROM_START(z8682)
+ // Zilog admits that this nominally ROMless type uses a "small internal ROM"
+ ROM_REGION(0x0800, "internal", ROMREGION_ERASEFF)
+ ROM_LOAD("testrom.bin", 0x0000, 0x0038, CRC(b2239f28) SHA1(9d27957ba0f15657eac5a7295157af6ee51cb261) BAD_DUMP) // typed in from "Z8 MCU Test Mode" application note
+ROM_END
+
+const tiny_rom_entry *z8682_device::device_rom_region() const
+{
+ return ROM_NAME(z8682);
+}
+
+
std::unique_ptr<util::disasm_interface> z8_device::create_disassembler()
{
return std::make_unique<z8_disassembler>();
@@ -418,43 +435,257 @@ void z8_device::p2_write(uint8_t data)
m_output_cb[2](0, data & mask, mask);
}
+void z8_device::p3_update_output()
+{
+ uint8_t output = m_output[3] & 0xf0;
+
+ if ((m_tmr & Z8_TMR_TOUT_MASK) != Z8_TMR_TOUT_OFF)
+ output = (output & ~Z8_P3_TOUT) | (m_tout ? Z8_P3_TOUT : 0);
+ if ((m_p3m & Z8_P3M_P3_SERIAL) != 0)
+ output = (output & ~Z8_P3_SOUT) | ((m_transmit_sr == 0 || BIT(m_transmit_sr, 0)) ? Z8_P3_SOUT : 0);
+
+ if (m_p3_output != output)
+ {
+ m_output_cb[3](0, output, output ^ m_p3_output);
+ m_p3_output = output;
+ }
+}
+
uint8_t z8_device::p3_read()
{
uint8_t mask = 0x0f;
+ uint8_t inputs = m_input[3] & m_input_cb[3](0, mask);
// TODO: special port 3 modes
//if (!(m_p3m & 0x7c))
//{
//}
- if (mask)
- m_input[3] = m_input_cb[3](0, mask);
-
- return (m_input[3] & mask) | (m_output[3] & ~mask);
+ return (inputs & mask) | (m_p3_output & ~mask);
}
void z8_device::p3_write(uint8_t data)
{
- uint8_t mask = 0xf0;
-
- m_output[3] = data;
+ m_output[3] = data & 0xf0;
// TODO: special port 3 modes
//if (!(m_p3m & 0x7c))
//{
//}
- if (mask)
- m_output_cb[3](0, data & mask, mask);
+ p3_update_output();
+}
+
+bool z8_device::get_serial_in()
+{
+ return (m_input[3] & Z8_P3_SIN) != 0;
+}
+
+void z8_device::sio_receive()
+{
+ if (m_receive_started)
+ {
+ m_receive_count = (m_receive_count + 1) & 15;
+ if (m_receive_count == 8)
+ {
+ if (m_receive_sr == 0)
+ {
+ if (!get_serial_in())
+ {
+ // start bit validated
+ m_receive_sr |= 1 << 9;
+ m_receive_parity = false;
+ }
+ else
+ {
+ // false start bit
+ m_receive_started = false;
+ m_receive_count = 0;
+ }
+ }
+ else
+ {
+ // shift in data, parity or stop bit
+ m_receive_sr >>= 1;
+ if (get_serial_in())
+ m_receive_sr |= 1 << 9;
+
+ if (BIT(m_receive_sr, 0))
+ {
+ // received full character
+ m_receive_buffer = (m_receive_sr & 0x1fe) >> 1;
+ request_interrupt(3);
+ m_receive_started = false;
+ m_receive_count = 0;
+ }
+ else
+ {
+ if (BIT(m_receive_sr, 9))
+ m_receive_parity = !m_receive_parity;
+
+ // parity replaces received bit 7 if selected
+ if (BIT(m_receive_sr, 1) && (m_p3m & Z8_P3M_PARITY) != 0)
+ {
+ if (m_receive_parity)
+ m_receive_sr |= 1 << 9;
+ else
+ m_receive_sr &= ~(1 << 9);
+ }
+ }
+ }
+ }
+ }
+ else
+ {
+ // start bit is high-low transition
+ m_receive_sr >>= 1;
+ if (get_serial_in())
+ m_receive_sr |= 1 << 9;
+ else if (BIT(m_receive_sr, 8))
+ {
+ m_receive_started = true;
+ m_receive_sr = 0;
+ m_receive_count = 0;
+ }
+ }
+}
+
+void z8_device::sio_transmit()
+{
+ if (m_transmit_sr == 0)
+ return;
+
+ m_transmit_count = (m_transmit_count + 1) & 15;
+ if (m_transmit_count == 0)
+ {
+ m_transmit_sr >>= 1;
+ if (m_transmit_sr == 0)
+ request_interrupt(4);
+ else
+ {
+ // parity replaces received bit 7 if selected
+ if ((m_transmit_sr >> 1) == 3 && (m_p3m & Z8_P3M_PARITY) != 0)
+ {
+ if (m_transmit_parity)
+ m_transmit_sr |= 1;
+ else
+ m_transmit_sr &= ~1;
+ }
+ else if (BIT(m_transmit_sr, 0))
+ m_transmit_parity = !m_transmit_parity;
+
+ // serial output
+ p3_update_output();
+ }
+ }
}
uint8_t z8_device::sio_read()
{
- return 0xff;
+ return m_receive_buffer;
}
void z8_device::sio_write(uint8_t data)
{
+ // overwrite shift register with data + 1 start bit + 2 stop bits
+ m_transmit_sr = (m_transmit_sr & 1) | (uint16_t(data) << 2) | (3 << 10);
+ m_transmit_parity = false;
+
+ // synchronize the shift clock
+ m_transmit_count = 15;
+}
+
+template <int T>
+void z8_device::timer_start()
+{
+ unsigned prescaler = (m_pre[T] >> 2) ? (m_pre[T] >> 2) : 64;
+ unsigned full_count = (m_count[T] ? m_count[T] - 1 : 255) * prescaler + (m_pre_count[T] ? m_pre_count[T] : 64);
+ m_internal_timer[T]->adjust(cycles_to_attotime(4 * full_count));
+}
+
+template <int T>
+void z8_device::timer_stop()
+{
+ if (!m_internal_timer[T]->enabled())
+ return;
+
+ unsigned prescaler = (m_pre[T] >> 2) ? (m_pre[T] >> 2) : 64;
+ unsigned remaining = attotime_to_cycles(m_internal_timer[T]->remaining() / 4);
+
+ m_count[T] = remaining / prescaler + 1;
+ m_pre_count[T] = (remaining % prescaler + 1) & 0x3f;
+
+ m_internal_timer[T]->enable(false);
+}
+
+template <int T>
+void z8_device::timer_end()
+{
+ if ((m_tmr & Z8_TMR_TOUT_MASK) == (T == 0 ? Z8_TMR_TOUT_T0 : Z8_TMR_TOUT_T1))
+ tout_toggle();
+
+ if (T == 0 && (m_p3m & Z8_P3M_P3_SERIAL) != 0)
+ {
+ sio_receive();
+ sio_transmit();
+ }
+ else
+ request_interrupt(4 + T);
+
+ m_pre_count[T] = m_pre[T] >> 2;
+ if (m_pre[T] & Z8_PRE0_COUNT_MODULO_N)
+ m_count[T] = m_t[T];
+ else
+ m_tmr &= ~(T == 0 ? Z8_TMR_ENABLE_T0 : Z8_TMR_ENABLE_T1);
+}
+
+void z8_device::t1_trigger()
+{
+ switch (m_tmr & Z8_TMR_TIN_MASK)
+ {
+ case Z8_TMR_TIN_EXTERNAL_CLK:
+ m_pre_count[1]--;
+ if (m_pre_count[1] == 0)
+ {
+ m_pre_count[1] = m_pre[1];
+ if ((m_tmr & Z8_TMR_ENABLE_T1) != 0)
+ {
+ m_count[1]--;
+ if (m_count[1] == 0)
+ timer_end<1>();
+ }
+ }
+ break;
+
+ case Z8_TMR_TIN_GATE:
+ timer_stop<1>();
+ break;
+
+ case Z8_TMR_TIN_TRIGGER:
+ if (m_internal_timer[1]->enabled())
+ break;
+
+ case Z8_TMR_TIN_RETRIGGER:
+ if ((m_tmr & Z8_TMR_ENABLE_T1) != 0)
+ {
+ m_count[1] = m_t[1];
+ m_pre_count[1] = m_pre[1] >> 2;
+ timer_start<1>();
+ }
+ break;
+ }
+}
+
+void z8_device::tout_init()
+{
+ m_tout = true;
+ p3_update_output();
+}
+
+void z8_device::tout_toggle()
+{
+ m_tout = !m_tout;
+ p3_update_output();
}
uint8_t z8_device::tmr_read()
@@ -464,28 +695,80 @@ uint8_t z8_device::tmr_read()
void z8_device::tmr_write(uint8_t data)
{
- m_tmr = data;
+ m_tmr = data & ~(Z8_TMR_LOAD_T0 | Z8_TMR_LOAD_T1); // actually reset on next internal clock
+
+ bool t1_internal = (m_pre[1] & Z8_PRE1_INTERNAL_CLOCK) != 0;
+ bool t0_load = (data & Z8_TMR_LOAD_T0) != 0;
+ bool t1_load = (data & Z8_TMR_LOAD_T1) != 0;
+ bool t0_enable = (data & Z8_TMR_ENABLE_T0) != 0;
+ bool t1_enable = (data & Z8_TMR_ENABLE_T1) != 0;
- if (data & Z8_TMR_LOAD_T0)
+ if (!t1_internal && ((data & Z8_TMR_TIN_MASK) == Z8_TMR_TIN_GATE))
+ {
+ if ((m_input[3] & Z8_P3_TIN) != 0)
+ t1_internal = true;
+ else
+ t1_enable = false;
+ }
+
+ if (t0_load)
{
m_count[0] = m_t[0];
- m_t0_timer->adjust(attotime::zero, 0, cycles_to_attotime(4 * ((m_pre[0] >> 2) + 1)));
+ m_pre_count[0] = m_pre[0] >> 2;
+
+ if ((m_pre[0] & Z8_PRE0_COUNT_MODULO_N) != 0)
+ {
+ unsigned prescaler = (m_pre[0] >> 2) ? (m_pre[0] >> 2) : 64;
+ unsigned count = (m_t[0] ? m_t[0] : 256) * prescaler;
+ logerror("(%04X): Load T0 at %.2f Hz\n", m_ppc, clock() / 8.0 / count);
+ }
+
+ if ((data & Z8_TMR_TOUT_MASK) == Z8_TMR_TOUT_T0)
+ tout_init();
}
- m_t0_timer->enable(data & Z8_TMR_ENABLE_T0);
+ if (t0_enable)
+ {
+ if (t0_load || !m_internal_timer[0]->enabled())
+ timer_start<0>();
+ }
+ else
+ timer_stop<0>();
- if (data & Z8_TMR_LOAD_T1)
+ if (t1_load)
{
m_count[1] = m_t[1];
- m_t1_timer->adjust(attotime::zero, 0, cycles_to_attotime(4 * ((m_pre[1] >> 2) + 1)));
+ m_pre_count[1] = m_pre[1] >> 2;
+
+ if (t1_internal && (m_pre[1] & Z8_PRE0_COUNT_MODULO_N) != 0)
+ {
+ unsigned prescaler = (m_pre[1] >> 2) ? (m_pre[1] >> 2) : 64;
+ unsigned count = (m_t[1] ? m_t[1] : 256) * prescaler;
+ logerror("(%04X): Load T1 at %.2f Hz\n", m_ppc, clock() / 8.0 / count);
+ }
+
+ if ((data & Z8_TMR_TOUT_MASK) == Z8_TMR_TOUT_T1)
+ tout_init();
}
- m_t1_timer->enable(data & Z8_TMR_ENABLE_T1);
+ if (t1_enable)
+ {
+ if (t1_internal && (t1_load || !m_internal_timer[1]->enabled()))
+ timer_start<1>();
+ }
+ else
+ timer_stop<1>();
}
uint8_t z8_device::t0_read()
{
- return m_count[0];
+ if (!m_internal_timer[0]->enabled())
+ return m_count[0];
+
+ unsigned prescaler = (m_pre[0] >> 2) ? (m_pre[0] >> 2) : 64;
+ unsigned remaining = attotime_to_cycles(m_internal_timer[0]->remaining() / 4);
+
+ return remaining / prescaler + 1;
}
void z8_device::t0_write(uint8_t data)
@@ -495,7 +778,13 @@ void z8_device::t0_write(uint8_t data)
uint8_t z8_device::t1_read()
{
- return m_count[1];
+ if (!m_internal_timer[1]->enabled())
+ return m_count[1];
+
+ unsigned prescaler = (m_pre[1] >> 2) ? (m_pre[1] >> 2) : 64;
+ unsigned remaining = attotime_to_cycles(m_internal_timer[1]->remaining() / 4);
+
+ return remaining / prescaler + 1;
}
void z8_device::t1_write(uint8_t data)
@@ -505,12 +794,28 @@ void z8_device::t1_write(uint8_t data)
void z8_device::pre0_write(uint8_t data)
{
- m_pre[0] = data;
+ if (m_internal_timer[0]->enabled())
+ {
+ timer_stop<0>();
+ m_pre[0] = data;
+ timer_start<0>();
+ }
+ else
+ m_pre[0] = data;
}
void z8_device::pre1_write(uint8_t data)
{
+ bool was_enabled = m_internal_timer[1]->enabled();
+ if (was_enabled)
+ timer_stop<1>();
+
m_pre[1] = data;
+
+ if ((data & Z8_PRE1_INTERNAL_CLOCK) != 0
+ ? (m_tmr & Z8_TMR_ENABLE_T1) != 0
+ : was_enabled && (m_tmr & Z8_TMR_TIN_MASK) != Z8_TMR_TIN_EXTERNAL_CLK)
+ timer_start<1>();
}
void z8_device::p01m_write(uint8_t data)
@@ -525,7 +830,16 @@ void z8_device::p2m_write(uint8_t data)
void z8_device::p3m_write(uint8_t data)
{
+ if ((data & Z8_P3M_P3_SERIAL) == 0)
+ {
+ m_transmit_sr = 0;
+ m_transmit_count = 0;
+ m_receive_started = false;
+ m_receive_count = 0;
+ }
+
m_p3m = data;
+ p3_update_output();
}
void z8_device::ipr_write(uint8_t data)
@@ -605,12 +919,12 @@ void z8_device::register_pair_write(uint8_t offset, uint16_t data)
m_regs->write_word_unaligned(offset, data);
}
-uint8_t z8_device::get_working_register(int offset)
+uint8_t z8_device::get_working_register(int offset) const
{
return (m_rp & 0xf0) | (offset & 0x0f);
}
-uint8_t z8_device::get_register(uint8_t offset)
+uint8_t z8_device::get_register(uint8_t offset) const
{
if ((offset & 0xf0) == 0xe0)
return get_working_register(offset & 0x0f);
@@ -838,29 +1152,17 @@ const z8_device::z8_opcode_map z8_device::Z8601_OPCODE_MAP[256] =
TIMER CALLBACKS
***************************************************************************/
-TIMER_CALLBACK_MEMBER( z8_device::t0_tick )
+template <int T>
+TIMER_CALLBACK_MEMBER(z8_device::timeout)
{
- m_count[0]--;
-
- if (m_count[0] == 0)
- {
- m_count[0] = m_t[0];
- m_t0_timer->adjust(attotime::zero, 0, cycles_to_attotime(4 * ((m_pre[0] >> 2) + 1)));
- m_t0_timer->enable(m_pre[0] & Z8_PRE0_COUNT_MODULO_N);
- request_interrupt(4);
- }
-}
+ timer_end<T>();
-TIMER_CALLBACK_MEMBER( z8_device::t1_tick )
-{
- m_count[1]--;
-
- if (m_count[1] == 0)
+ if (m_pre[T] & Z8_PRE0_COUNT_MODULO_N)
+ timer_start<T>();
+ else
{
- m_count[1] = m_t[1];
- m_t1_timer->adjust(attotime::zero, 0, cycles_to_attotime(4 * ((m_pre[1] >> 2) + 1)));
- m_t1_timer->enable(m_pre[1] & Z8_PRE0_COUNT_MODULO_N);
- request_interrupt(5);
+ m_count[T] = 0;
+ m_internal_timer[T]->enable(false);
}
}
@@ -900,6 +1202,7 @@ void z8_device::device_start()
state_add(Z8_PRE1, "PRE1", m_pre[1]);
state_add(Z8_T1, "T1", m_t[1]);
state_add(Z8_TMR, "TMR", m_tmr);
+ state_add(Z8_TOUT, "TOUT", m_tout);
for (int regnum = 0; regnum < 16; regnum++)
state_add(Z8_R0 + regnum, string_format("R%d", regnum).c_str(), m_fake_r[regnum]).callimport().callexport();
@@ -912,16 +1215,16 @@ void z8_device::device_start()
m_regs = &space(AS_IO);
/* allocate timers */
- m_t0_timer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(z8_device::t0_tick), this));
- m_t1_timer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(z8_device::t1_tick), this));
+ m_internal_timer[0] = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(z8_device::timeout<0>), this));
+ m_internal_timer[1] = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(z8_device::timeout<1>), this));
/* Clear state */
std::fill(std::begin(m_irq_line), std::end(m_irq_line), CLEAR_LINE);
- std::fill(std::begin(m_input), std::end(m_input), 0);
std::fill(std::begin(m_output), std::end(m_output), 0);
std::fill(std::begin(m_t), std::end(m_t), 0);
std::fill(std::begin(m_count), std::end(m_count), 0);
std::fill(std::begin(m_pre), std::end(m_pre), 0);
+ std::fill(std::begin(m_pre_count), std::end(m_pre_count), 0);
std::fill(std::begin(m_fake_r), std::end(m_fake_r), 0);
m_pc = 0;
m_ppc = 0;
@@ -931,7 +1234,17 @@ void z8_device::device_start()
m_p01m = 0;
m_p2m = 0;
m_p3m = 0;
+ m_p3_output = 0;
m_tmr = 0;
+ m_tout = true;
+ m_transmit_sr = 0;
+ m_transmit_count = 0;
+ m_transmit_parity = false;
+ m_receive_buffer = 0;
+ m_receive_sr = 0;
+ m_receive_count = 0;
+ m_receive_parity = false;
+ m_receive_started = false;
m_irq_taken = false;
m_irq_initialized = false;
@@ -946,10 +1259,21 @@ void z8_device::device_start()
save_item(NAME(m_p01m));
save_item(NAME(m_p2m));
save_item(NAME(m_p3m));
+ save_item(NAME(m_p3_output));
save_item(NAME(m_tmr));
save_item(NAME(m_t));
+ save_item(NAME(m_tout));
+ save_item(NAME(m_transmit_sr));
+ save_item(NAME(m_transmit_count));
+ save_item(NAME(m_transmit_parity));
+ save_item(NAME(m_receive_buffer));
+ save_item(NAME(m_receive_sr));
+ save_item(NAME(m_receive_count));
+ save_item(NAME(m_receive_parity));
+ save_item(NAME(m_receive_started));
save_item(NAME(m_count));
save_item(NAME(m_pre));
+ save_item(NAME(m_pre_count));
save_item(NAME(m_irq_line));
save_item(NAME(m_irq_taken));
save_item(NAME(m_irq_initialized));
@@ -979,6 +1303,7 @@ void z8_device::take_interrupt(int irq)
// acknowledge the IRQ
m_irq &= ~(1 << irq);
+ standard_irq_callback(irq);
// get the interrupt vector address
uint16_t vector = irq * 2;
@@ -1149,14 +1474,16 @@ void z8_device::device_reset()
m_imr &= ~Z8_IMR_ENABLE;
m_irq_initialized = false;
+ m_pre[0] &= ~Z8_PRE0_COUNT_MODULO_N;
+ m_pre[1] &= ~(Z8_PRE1_COUNT_MODULO_N | Z8_PRE1_INTERNAL_CLOCK);
+ m_tmr = 0x00;
+ timer_stop<0>();
+ timer_stop<1>();
+
+ m_output[3] = 0xf0;
p01m_write(0x4d);
p2m_write(0xff);
p3m_write(0x00);
- p3_write(m_output[3] | 0xf0);
-
- m_pre[0] &= ~Z8_PRE0_COUNT_MODULO_N;
- m_pre[1] &= ~(Z8_PRE1_COUNT_MODULO_N | Z8_PRE1_INTERNAL_CLOCK);
- tmr_write(0x00);
}
@@ -1180,7 +1507,7 @@ void z8_device::state_import(const device_state_entry &entry)
case Z8_R0: case Z8_R1: case Z8_R2: case Z8_R3: case Z8_R4: case Z8_R5: case Z8_R6: case Z8_R7: case Z8_R8: case Z8_R9: case Z8_R10: case Z8_R11: case Z8_R12: case Z8_R13: case Z8_R14: case Z8_R15:
{
auto dis = machine().disable_side_effects();
- register_write(m_rp + (entry.index() - Z8_R0), m_fake_r[entry.index() - Z8_R0]);
+ register_write((m_rp & 0xf0) + (entry.index() - Z8_R0), m_fake_r[entry.index() - Z8_R0]);
break;
}
@@ -1196,7 +1523,7 @@ void z8_device::state_export(const device_state_entry &entry)
case Z8_R0: case Z8_R1: case Z8_R2: case Z8_R3: case Z8_R4: case Z8_R5: case Z8_R6: case Z8_R7: case Z8_R8: case Z8_R9: case Z8_R10: case Z8_R11: case Z8_R12: case Z8_R13: case Z8_R14: case Z8_R15:
{
auto dis = machine().disable_side_effects();
- m_fake_r[entry.index() - Z8_R0] = register_read(m_rp + (entry.index() - Z8_R0));
+ m_fake_r[entry.index() - Z8_R0] = register_read((m_rp & 0xf0) + (entry.index() - Z8_R0));
break;
}
@@ -1224,29 +1551,60 @@ void z8_device::execute_set_input(int inputnum, int state)
{
switch ( inputnum )
{
- case INPUT_LINE_IRQ0:
- if (state != CLEAR_LINE && m_irq_line[0] == CLEAR_LINE)
- request_interrupt(0);
- m_irq_line[0] = state;
- break;
+ case INPUT_LINE_IRQ0:
+ if (state != CLEAR_LINE && m_irq_line[0] == CLEAR_LINE)
+ request_interrupt(0);
+ m_irq_line[0] = state;
- case INPUT_LINE_IRQ1:
- if (state != CLEAR_LINE && m_irq_line[1] == CLEAR_LINE)
- request_interrupt(1);
- m_irq_line[1] = state;
- break;
+ if (state != CLEAR_LINE && (m_input[3] & Z8_P3_IRQ0) != 0)
+ m_input[3] &= ~Z8_P3_IRQ0;
+ else if (state == CLEAR_LINE && (m_input[3] & Z8_P3_IRQ0) == 0)
+ m_input[3] |= Z8_P3_IRQ0;
- case INPUT_LINE_IRQ2:
- if (state != CLEAR_LINE && m_irq_line[2] == CLEAR_LINE)
- request_interrupt(2);
- m_irq_line[2] = state;
- break;
+ break;
- case INPUT_LINE_IRQ3:
- if (state != CLEAR_LINE && m_irq_line[3] == CLEAR_LINE)
- request_interrupt(3);
- m_irq_line[3] = state;
- break;
+ case INPUT_LINE_IRQ1:
+ if (state != CLEAR_LINE && m_irq_line[1] == CLEAR_LINE)
+ request_interrupt(1);
+ m_irq_line[1] = state;
+ if (state != CLEAR_LINE && (m_input[3] & Z8_P3_IRQ1) != 0)
+ m_input[3] &= ~Z8_P3_IRQ1;
+ else if (state == CLEAR_LINE && (m_input[3] & Z8_P3_IRQ1) == 0)
+ m_input[3] |= Z8_P3_IRQ1;
+
+ break;
+
+ case INPUT_LINE_IRQ2:
+ if (state != CLEAR_LINE && m_irq_line[2] == CLEAR_LINE)
+ request_interrupt(2);
+ m_irq_line[2] = state;
+
+ if (state != CLEAR_LINE && (m_input[3] & Z8_P3_IRQ2) != 0)
+ {
+ m_input[3] &= ~Z8_P3_IRQ2;
+ if ((m_pre[1] & Z8_PRE1_INTERNAL_CLOCK) == 0)
+ t1_trigger();
+ }
+ else if (state == CLEAR_LINE && (m_input[3] & Z8_P3_IRQ2) == 0)
+ {
+ m_input[3] |= Z8_P3_IRQ2;
+ if ((m_pre[1] & Z8_PRE1_INTERNAL_CLOCK) == 0 && (m_tmr & Z8_TMR_TIN_MASK) == Z8_TMR_TIN_GATE)
+ timer_start<1>();
+ }
+
+ break;
+
+ case INPUT_LINE_IRQ3:
+ if (state != CLEAR_LINE && m_irq_line[3] == CLEAR_LINE && (m_p3m & Z8_P3M_P3_SERIAL) == 0)
+ request_interrupt(3);
+ m_irq_line[3] = state;
+
+ if (state != CLEAR_LINE && (m_input[3] & Z8_P3_IRQ3) != 0)
+ m_input[3] &= ~Z8_P3_IRQ3;
+ else if (state == CLEAR_LINE && (m_input[3] & Z8_P3_IRQ3) == 0)
+ m_input[3] |= Z8_P3_IRQ3;
+
+ break;
}
}
diff --git a/src/devices/cpu/z8/z8.h b/src/devices/cpu/z8/z8.h
index 0bdd235d7c2..c74f3ec839f 100644
--- a/src/devices/cpu/z8/z8.h
+++ b/src/devices/cpu/z8/z8.h
@@ -1,5 +1,5 @@
// license:BSD-3-Clause
-// copyright-holders:Curt Coder
+// copyright-holders:Curt Coder, AJR
/**********************************************************************
Zilog Z8 Single-Chip MCU emulation
@@ -32,7 +32,7 @@ protected:
Z8_IMR, Z8_IRQ, Z8_IPR,
Z8_P0, Z8_P1, Z8_P2, Z8_P3,
Z8_P01M, Z8_P3M, Z8_P2M,
- Z8_PRE0, Z8_T0, Z8_PRE1, Z8_T1, Z8_TMR,
+ Z8_PRE0, Z8_T0, Z8_PRE1, Z8_T1, Z8_TMR, Z8_TOUT,
Z8_R0, Z8_R1, Z8_R2, Z8_R3, Z8_R4, Z8_R5, Z8_R6, Z8_R7, Z8_R8, Z8_R9, Z8_R10, Z8_R11, Z8_R12, Z8_R13, Z8_R14, Z8_R15
};
@@ -101,18 +101,33 @@ private:
uint8_t m_p01m; // port 0/1 mode
uint8_t m_p2m; // port 2 mode
uint8_t m_p3m; // port 3 mode
+ uint8_t m_p3_output; // port 3 output (alternate functions included)
// timer registers
uint8_t m_tmr; // timer mode
uint8_t m_t[2]; // initial values
uint8_t m_count[2]; // current counts
uint8_t m_pre[2]; // prescalers
+ uint8_t m_pre_count[2]; // prescaler counts
+ bool m_tout; // toggle output
+
+ // serial transmitter registers
+ uint16_t m_transmit_sr; // transmitter shift register
+ uint8_t m_transmit_count; // counter for transmitter timing
+ bool m_transmit_parity; // transmitter parity calculation
+
+ // serial receiver registers
+ uint8_t m_receive_buffer; // received character
+ uint16_t m_receive_sr; // receiver shift register
+ uint8_t m_receive_count; // counter for receiver timing
+ bool m_receive_parity; // receiver parity calculation
+ bool m_receive_started; // true if receiver has seen start bit
// fake registers
uint8_t m_fake_r[16]; // fake working registers
// interrupts
- int m_irq_line[4]; // IRQ line state
+ int m_irq_line[4];
bool m_irq_taken;
bool m_irq_initialized; // IRQ must be unlocked by EI after reset
@@ -120,11 +135,20 @@ private:
int32_t m_icount; // instruction counter
// timers
- emu_timer *m_t0_timer;
- emu_timer *m_t1_timer;
+ emu_timer *m_internal_timer[2];
+
+ bool get_serial_in();
+ void sio_receive();
+ void sio_transmit();
+
+ template <int T> void timer_start();
+ template <int T> void timer_stop();
+ template <int T> void timer_end();
+ void t1_trigger();
+ void tout_init();
+ void tout_toggle();
- TIMER_CALLBACK_MEMBER( t0_tick );
- TIMER_CALLBACK_MEMBER( t1_tick );
+ template <int T> TIMER_CALLBACK_MEMBER(timeout);
void request_interrupt(int irq);
void take_interrupt(int irq);
@@ -138,6 +162,7 @@ private:
void p2_write(uint8_t data);
uint8_t p3_read();
void p3_write(uint8_t data);
+ void p3_update_output();
uint8_t sio_read();
void sio_write(uint8_t data);
uint8_t tmr_read();
@@ -173,8 +198,8 @@ private:
inline uint16_t register_pair_read(uint8_t offset);
inline void register_write(uint8_t offset, uint8_t data) { m_regs->write_byte(offset, data); }
inline void register_pair_write(uint8_t offset, uint16_t data);
- inline uint8_t get_working_register(int offset);
- inline uint8_t get_register(uint8_t offset);
+ inline uint8_t get_working_register(int offset) const;
+ inline uint8_t get_register(uint8_t offset) const;
inline uint8_t get_intermediate_register(int offset);
inline void stack_push_byte(uint8_t src);
inline void stack_push_word(uint16_t src);
@@ -396,6 +421,16 @@ public:
};
+class z8682_device : public z8_device
+{
+public:
+ z8682_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+
+protected:
+ const tiny_rom_entry *device_rom_region() const override;
+};
+
+
// Zilog Z8601
DECLARE_DEVICE_TYPE(Z8601, z8601_device)
@@ -411,4 +446,7 @@ DECLARE_DEVICE_TYPE(Z8671, z8671_device)
// Zilog Z8681 ROMless
DECLARE_DEVICE_TYPE(Z8681, z8681_device)
+// Zilog Z8682 ROMless (boot to 0812H)
+DECLARE_DEVICE_TYPE(Z8682, z8682_device)
+
#endif // MAME_CPU_Z8_Z8_H
diff --git a/src/devices/cpu/z8/z8dasm.cpp b/src/devices/cpu/z8/z8dasm.cpp
index 35d18fab880..08e50ca1eae 100644
--- a/src/devices/cpu/z8/z8dasm.cpp
+++ b/src/devices/cpu/z8/z8dasm.cpp
@@ -39,6 +39,7 @@ const char *const z8_disassembler::CONDITION_CODE[16] =
***************************************************************************/
#define r "R%u"
+#define rr "RR%u"
#define Ir "@R%u"
#define R "%02Xh"
#define RR "%02Xh"
@@ -64,7 +65,7 @@ const char *const z8_disassembler::CONDITION_CODE[16] =
#define arg_Ir(_value) ARG(Ir, _value)
#define arg_Irr(_value) ARG(Irr, _value & 0x0f)
#define arg_R(_value) if ((_value & 0xf0) == 0xe0) ARG(r, _value & 0x0f) else if ((_value < 4) || (_value >= 0xf0)) arg_name(_value) else ARG(R, _value)
-#define arg_RR(_value) if ((_value & 0xf0) == 0xe0) ARG(r, _value & 0x0f) else ARG(R, _value)
+#define arg_RR(_value) if ((_value & 0xf0) == 0xe0) ARG(rr, _value & 0x0f) else ARG(R, _value)
#define arg_IR(_value) if ((_value & 0xf0) == 0xe0) ARG(Ir, _value & 0x0f) else ARG(IR, _value)
#define arg_IRR(_value) if ((_value & 0xf0) == 0xe0) ARG(Irr, _value & 0x0f) else ARG(IRR, _value)
#define arg_IM(_value) ARG(IM, _value)
@@ -366,7 +367,7 @@ offs_t z8_disassembler::disassemble(std::ostream &stream, offs_t pc, const data_
case 0xf2: illegal; break;
case 0xf3: mnemonic("LD"); arg_Ir(B0H); arg_r(B0L); bytes(2); break;
case 0xf4: illegal; break;
- case 0xf5: mnemonic("LD"); arg_IR(B0); arg_R(B1); bytes(3); break;
+ case 0xf5: mnemonic("LD"); arg_IR(B1); arg_R(B0); bytes(3); break;
case 0xf6: illegal; break;
case 0xf7: illegal; break;
case 0xf8: mnemonic("LD"); arg_r(OPH); arg_R(B0); bytes(2); break;
diff --git a/src/devices/cpu/z80/kl5c80a12.cpp b/src/devices/cpu/z80/kl5c80a12.cpp
index 44e1d9256b3..a061f3e7cf3 100644
--- a/src/devices/cpu/z80/kl5c80a12.cpp
+++ b/src/devices/cpu/z80/kl5c80a12.cpp
@@ -46,5 +46,6 @@ void kl5c80a12_device::device_reset()
/* CPU interface */
-MACHINE_CONFIG_START(kl5c80a12_device::device_add_mconfig)
-MACHINE_CONFIG_END
+void kl5c80a12_device::device_add_mconfig(machine_config &config)
+{
+}
diff --git a/src/devices/imagedev/bitbngr.h b/src/devices/imagedev/bitbngr.h
index 5bd7392f1d9..2a2a72dd9a6 100644
--- a/src/devices/imagedev/bitbngr.h
+++ b/src/devices/imagedev/bitbngr.h
@@ -48,10 +48,6 @@ private:
bool m_is_readonly;
};
-#define MCFG_BITBANGER_INTERFACE(_interface) \
- downcast<bitbanger_device &>(*device).set_interface(_interface);
-#define MCFG_BITBANGER_READONLY(_readonly) \
- downcast<bitbanger_device &>(*device).set_readonly(_readonly);
// device type definition
DECLARE_DEVICE_TYPE(BITBANGER, bitbanger_device)
diff --git a/src/devices/imagedev/cassette.h b/src/devices/imagedev/cassette.h
index 830f65c99d2..aac43869d2a 100644
--- a/src/devices/imagedev/cassette.h
+++ b/src/devices/imagedev/cassette.h
@@ -129,25 +129,4 @@ DECLARE_DEVICE_TYPE(CASSETTE, cassette_image_device)
// device iterator
typedef device_type_iterator<cassette_image_device> cassette_device_iterator;
-/***************************************************************************
- DEVICE CONFIGURATION MACROS
-***************************************************************************/
-#define MCFG_CASSETTE_ADD(_tag) \
- MCFG_DEVICE_ADD(_tag, CASSETTE, 0)
-
-#define MCFG_CASSETTE_MODIFY(_tag) \
- MCFG_DEVICE_MODIFY(_tag)
-
-#define MCFG_CASSETTE_FORMATS(_formats) \
- downcast<cassette_image_device &>(*device).set_formats(_formats);
-
-#define MCFG_CASSETTE_CREATE_OPTS(_create_opts) \
- downcast<cassette_image_device &>(*device).set_create_opts(_create_opts);
-
-#define MCFG_CASSETTE_DEFAULT_STATE(_state) \
- downcast<cassette_image_device &>(*device).set_default_state((cassette_state) (_state));
-
-#define MCFG_CASSETTE_INTERFACE(_interface) \
- downcast<cassette_image_device &>(*device).set_interface(_interface);
-
#endif // MAME_DEVICES_IMAGEDEV_CASSETTE_H
diff --git a/src/devices/imagedev/chd_cd.h b/src/devices/imagedev/chd_cd.h
index 0be8a274cac..e3e980d9ea9 100644
--- a/src/devices/imagedev/chd_cd.h
+++ b/src/devices/imagedev/chd_cd.h
@@ -67,15 +67,4 @@ protected:
// device type definition
DECLARE_DEVICE_TYPE(CDROM, cdrom_image_device)
-/***************************************************************************
- DEVICE CONFIGURATION MACROS
-***************************************************************************/
-
-
-#define MCFG_CDROM_ADD(_tag) \
- MCFG_DEVICE_ADD(_tag, CDROM, 0)
-
-#define MCFG_CDROM_INTERFACE(_interface) \
- downcast<cdrom_image_device &>(*device).set_interface(_interface);
-
#endif // MAME_DEVICES_IMAGEDEV_CHD_CD_H
diff --git a/src/devices/imagedev/diablo.h b/src/devices/imagedev/diablo.h
index 2acc293a359..543d89d3438 100644
--- a/src/devices/imagedev/diablo.h
+++ b/src/devices/imagedev/diablo.h
@@ -73,20 +73,4 @@ protected:
// device type definition
DECLARE_DEVICE_TYPE(DIABLO, diablo_image_device)
-/***************************************************************************
- DEVICE CONFIGURATION MACROS
-***************************************************************************/
-
-#define MCFG_DIABLO_ADD(_tag) \
- MCFG_DEVICE_ADD(_tag, DIABLO, 0)
-
-#define MCFG_DIABLO_LOAD(_class,_method) \
- downcast<diablo_image_device &>(*device).set_device_load(device_image_load_delegate(&DEVICE_IMAGE_LOAD_NAME(_class,_method), this));
-
-#define MCFG_DIABLO_UNLOAD(_class,_method) \
- downcast<diablo_image_device &>(*device).set_device_unload(device_image_func_delegate(&DEVICE_IMAGE_UNLOAD_NAME(_class,_method), this));
-
-#define MCFG_DIABLO_INTERFACE(_interface) \
- downcast<diablo_image_device &>(*device).set_interface(_interface);
-
#endif // MAME_DEVICES_IMAGEDEV_DIABLO_H
diff --git a/src/devices/imagedev/flopdrv.h b/src/devices/imagedev/flopdrv.h
index cae694146b7..5751365260d 100644
--- a/src/devices/imagedev/flopdrv.h
+++ b/src/devices/imagedev/flopdrv.h
@@ -92,9 +92,6 @@ struct chrn_id
/* set if index has just occurred */
#define FLOPPY_DRIVE_INDEX 0x0020
-#define MCFG_LEGACY_FLOPPY_IDX_CB(_devcb) \
- downcast<legacy_floppy_image_device &>(*device).set_out_idx_func(DEVCB_##_devcb);
-
class legacy_floppy_image_device : public device_t,
public device_image_interface
{
@@ -110,7 +107,7 @@ public:
~legacy_floppy_image_device();
void set_floppy_config(const floppy_interface *config) { m_config = config; }
- template<class Object> devcb_base &set_out_idx_func(Object &&cb) { return m_out_idx_func.set_callback(std::forward<Object>(cb)); }
+ auto out_idx_cb() { return m_out_idx_func.bind(); }
static void add_4drives(machine_config &mconfig, const floppy_interface *config)
{
@@ -120,6 +117,12 @@ public:
LEGACY_FLOPPY(mconfig, FLOPPY_3, 0, config);
}
+ static void add_2drives(machine_config &mconfig, const floppy_interface *config)
+ {
+ LEGACY_FLOPPY(mconfig, FLOPPY_0, 0, config);
+ LEGACY_FLOPPY(mconfig, FLOPPY_1, 0, config);
+ }
+
virtual image_init_result call_load() override;
virtual const software_list_loader &get_software_list_loader() const override { return image_software_list_loader::instance(); }
virtual image_init_result call_create(int format_type, util::option_resolution *format_options) override;
@@ -250,33 +253,4 @@ legacy_floppy_image_device *floppy_get_device_by_type(running_machine &machine,i
int floppy_get_drive_by_type(legacy_floppy_image_device *image,int ftype);
int floppy_get_count(running_machine &machine);
-
-/***************************************************************************
- DEVICE CONFIGURATION MACROS
-***************************************************************************/
-
-
-#define MCFG_LEGACY_FLOPPY_CONFIG(_config) \
- downcast<legacy_floppy_image_device &>(*device).set_floppy_config(&(_config));
-
-#define MCFG_LEGACY_FLOPPY_DRIVE_ADD(_tag, _config) \
- MCFG_DEVICE_ADD(_tag, LEGACY_FLOPPY, 0) \
- MCFG_LEGACY_FLOPPY_CONFIG(_config)
-
-#define MCFG_LEGACY_FLOPPY_4_DRIVES_ADD(_config) \
- MCFG_DEVICE_ADD(FLOPPY_0, LEGACY_FLOPPY, 0) \
- MCFG_LEGACY_FLOPPY_CONFIG(_config) \
- MCFG_DEVICE_ADD(FLOPPY_1, LEGACY_FLOPPY, 0) \
- MCFG_LEGACY_FLOPPY_CONFIG(_config) \
- MCFG_DEVICE_ADD(FLOPPY_2, LEGACY_FLOPPY, 0) \
- MCFG_LEGACY_FLOPPY_CONFIG(_config) \
- MCFG_DEVICE_ADD(FLOPPY_3, LEGACY_FLOPPY, 0) \
- MCFG_LEGACY_FLOPPY_CONFIG(_config)
-
-#define MCFG_LEGACY_FLOPPY_2_DRIVES_ADD(_config) \
- MCFG_DEVICE_ADD(FLOPPY_0, LEGACY_FLOPPY, 0) \
- MCFG_LEGACY_FLOPPY_CONFIG(_config) \
- MCFG_DEVICE_ADD(FLOPPY_1, LEGACY_FLOPPY, 0) \
- MCFG_LEGACY_FLOPPY_CONFIG(_config)
-
#endif // MAME_DEVICES_IMAGEDV_FLOPDRV_H
diff --git a/src/devices/imagedev/floppy.cpp b/src/devices/imagedev/floppy.cpp
index 70362e876fb..5a7c362f42a 100644
--- a/src/devices/imagedev/floppy.cpp
+++ b/src/devices/imagedev/floppy.cpp
@@ -987,9 +987,8 @@ uint32_t floppy_image_device::get_variant() const
//===================================================================
// Floppy sound
//
-// In order to enable floppy sound you must add the line
-// MCFG_FLOPPY_DRIVE_SOUND(true)
-// after MCFG_FLOPPY_DRIVE_ADD
+// In order to enable floppy sound you must call
+// enable_sound(true)
// and you must put audio samples (44100Hz, mono) with names as
// shown in floppy_sample_names into the directory samples/floppy
// Sound will be disabled when these samples are missing.
diff --git a/src/devices/imagedev/floppy.h b/src/devices/imagedev/floppy.h
index 51b588bfd3a..6223933c74e 100644
--- a/src/devices/imagedev/floppy.h
+++ b/src/devices/imagedev/floppy.h
@@ -25,19 +25,6 @@
#include "sound/samples.h"
#include "softlist_dev.h"
-#define MCFG_FLOPPY_DRIVE_ADD(_tag, _slot_intf, _def_slot, _formats) \
- MCFG_DEVICE_ADD(_tag, FLOPPY_CONNECTOR, 0) \
- MCFG_DEVICE_SLOT_INTERFACE(_slot_intf, _def_slot, false) \
- static_cast<floppy_connector *>(device)->set_formats(_formats);
-
-#define MCFG_FLOPPY_DRIVE_ADD_FIXED(_tag, _slot_intf, _def_slot, _formats) \
- MCFG_DEVICE_ADD(_tag, FLOPPY_CONNECTOR, 0) \
- MCFG_DEVICE_SLOT_INTERFACE(_slot_intf, _def_slot, true) \
- static_cast<floppy_connector *>(device)->set_formats(_formats);
-
-#define MCFG_FLOPPY_DRIVE_SOUND(_doit) \
- static_cast<floppy_connector *>(device)->enable_sound(_doit);
-
#define DECLARE_FLOPPY_FORMATS(_name) \
static const floppy_format_type _name []
diff --git a/src/devices/imagedev/harddriv.h b/src/devices/imagedev/harddriv.h
index 92a6b733275..7b71d13d2c7 100644
--- a/src/devices/imagedev/harddriv.h
+++ b/src/devices/imagedev/harddriv.h
@@ -25,6 +25,11 @@ class harddisk_image_device : public device_t,
{
public:
// construction/destruction
+ harddisk_image_device(const machine_config &mconfig, const char *tag, device_t *owner, const char *intf)
+ : harddisk_image_device(mconfig, tag, owner, (uint32_t)0)
+ {
+ set_interface(intf);
+ }
harddisk_image_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock = 0);
virtual ~harddisk_image_device();
diff --git a/src/devices/imagedev/mfmhd.cpp b/src/devices/imagedev/mfmhd.cpp
index 6e95fcc9e64..1d6d3574c07 100644
--- a/src/devices/imagedev/mfmhd.cpp
+++ b/src/devices/imagedev/mfmhd.cpp
@@ -205,7 +205,7 @@
This means that when we add a slot (the connector), we also have to
pass the desired parameters for the drive.
- MCFG_MFM_HARDDISK_CONN_ADD(_tag, _slot_intf, _def_slot, _enc, _spinupms, _cache, _format)
+ MFM_HD_CONNECTOR(config, _tag, _slot_intf, _def_slot, _enc, _spinupms, _cache, _format);
Specific parameters:
diff --git a/src/devices/imagedev/midiin.h b/src/devices/imagedev/midiin.h
index b429bc4f65f..8254c6965a0 100644
--- a/src/devices/imagedev/midiin.h
+++ b/src/devices/imagedev/midiin.h
@@ -15,9 +15,6 @@
#include "diserial.h"
-#define MCFG_MIDIIN_INPUT_CB(_devcb) \
- downcast<midiin_device &>(*device).set_input_callback(DEVCB_##_devcb);
-
/***************************************************************************
TYPE DEFINITIONS
@@ -31,7 +28,7 @@ public:
// construction/destruction
midiin_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- template <class Object> devcb_base &set_input_callback(Object &&cb) { return m_input_cb.set_callback(std::forward<Object>(cb)); }
+ auto input_callback() { return m_input_cb.bind(); }
// image-level overrides
virtual image_init_result call_load() override;
diff --git a/src/devices/imagedev/midiout.h b/src/devices/imagedev/midiout.h
index 713c783b992..159e71cab17 100644
--- a/src/devices/imagedev/midiout.h
+++ b/src/devices/imagedev/midiout.h
@@ -15,14 +15,6 @@
#include "diserial.h"
-/***************************************************************************
- CONSTANTS
-***************************************************************************/
-
-
-#define MCFG_MIDIOUT_ADD(_tag) \
- MCFG_DEVICE_ADD(_tag, MIDIOUT, 0)
-
/***************************************************************************
TYPE DEFINITIONS
diff --git a/src/devices/imagedev/printer.h b/src/devices/imagedev/printer.h
index 099d19cab9e..359faca8951 100644
--- a/src/devices/imagedev/printer.h
+++ b/src/devices/imagedev/printer.h
@@ -13,8 +13,6 @@
#pragma once
-#define MCFG_PRINTER_ONLINE_CB(_devcb) \
- downcast<printer_image_device &>(*device).set_online_callback(DEVCB_##_devcb);
/***************************************************************************
TYPE DEFINITIONS
@@ -29,7 +27,7 @@ public:
// construction/destruction
printer_image_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- template <class Object> devcb_base &set_online_callback(Object &&cb) { return m_online_cb.set_callback(std::forward<Object>(cb)); }
+ auto online_callback() { return m_online_cb.bind(); }
// image-level overrides
virtual image_init_result call_load() override;
diff --git a/src/devices/imagedev/snapquik.cpp b/src/devices/imagedev/snapquik.cpp
index 0e24b9f81ba..4126077513c 100644
--- a/src/devices/imagedev/snapquik.cpp
+++ b/src/devices/imagedev/snapquik.cpp
@@ -28,8 +28,6 @@ snapshot_image_device::snapshot_image_device(const machine_config &mconfig, devi
device_image_interface(mconfig, *this),
m_file_extensions(nullptr),
m_interface(nullptr),
- m_delay_seconds(0),
- m_delay_attoseconds(0),
m_timer(nullptr)
{
}
@@ -67,7 +65,7 @@ void snapshot_image_device::device_start()
image_init_result snapshot_image_device::call_load()
{
/* adjust the timer */
- m_timer->adjust(attotime(m_delay_seconds, m_delay_attoseconds),0);
+ m_timer->adjust(m_delay,0);
return image_init_result::PASS;
}
diff --git a/src/devices/imagedev/snapquik.h b/src/devices/imagedev/snapquik.h
index 55eb7b703d6..35873ad93e9 100644
--- a/src/devices/imagedev/snapquik.h
+++ b/src/devices/imagedev/snapquik.h
@@ -11,6 +11,8 @@
#ifndef MAME_DEVICES_IMAGEDEV_SNAPQUIK_H
#define MAME_DEVICES_IMAGEDEV_SNAPQUIK_H
+#pragma once
+
#include "softlist_dev.h"
typedef delegate<image_init_result (device_image_interface &,const char *, int)> snapquick_load_delegate;
@@ -21,7 +23,7 @@ class snapshot_image_device : public device_t,
{
public:
// construction/destruction
- snapshot_image_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+ snapshot_image_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock = 0U);
virtual ~snapshot_image_device();
void set_interface(const char *interface) { m_interface = interface; }
@@ -39,8 +41,7 @@ public:
virtual const char *image_interface() const override { return m_interface; }
virtual const char *file_extensions() const override { return m_file_extensions; }
- TIMER_CALLBACK_MEMBER(process_snapshot_or_quickload);
- void set_handler(snapquick_load_delegate load, const char *ext, seconds_t sec) { m_load = load; m_file_extensions = ext; m_delay_seconds = sec; };
+ void set_handler(snapquick_load_delegate load, const char *ext, attotime delay = attotime::from_seconds(0)) { m_load = load; m_file_extensions = ext; m_delay = delay; };
protected:
snapshot_image_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock);
@@ -48,11 +49,12 @@ protected:
// device-level overrides
virtual void device_start() override;
+ TIMER_CALLBACK_MEMBER(process_snapshot_or_quickload);
+
snapquick_load_delegate m_load; /* loading function */
const char * m_file_extensions; /* file extensions */
const char * m_interface;
- seconds_t m_delay_seconds; /* loading delay (seconds) */
- attoseconds_t m_delay_attoseconds; /* loading delay (attoseconds) */
+ attotime m_delay; /* loading delay */
emu_timer *m_timer;
};
@@ -65,7 +67,7 @@ class quickload_image_device : public snapshot_image_device
{
public:
// construction/destruction
- quickload_image_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+ quickload_image_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock = 0U);
virtual iodevice_t image_type() const override { return IO_QUICKLOAD; }
};
@@ -88,16 +90,16 @@ DECLARE_DEVICE_TYPE(QUICKLOAD, quickload_image_device)
#define QUICKLOAD_LOAD_MEMBER(_class,_name) image_init_result QUICKLOAD_LOAD_NAME(_class,_name)(device_image_interface &image, const char *file_type, int quickload_size)
#define QUICKLOAD_LOAD_DELEGATE(_class,_name) snapquick_load_delegate(&QUICKLOAD_LOAD_NAME(_class,_name), downcast<_class *>(device->owner()))
-#define MCFG_SNAPSHOT_ADD(_tag, _class, _load, _file_extensions, _delay) \
+#define MCFG_SNAPSHOT_ADD(_tag, _class, _load, ...) \
MCFG_DEVICE_ADD(_tag, SNAPSHOT, 0) \
- static_cast<snapshot_image_device *>(device)->set_handler(SNAPSHOT_LOAD_DELEGATE(_class,_load), _file_extensions, _delay);
+ static_cast<snapshot_image_device *>(device)->set_handler(SNAPSHOT_LOAD_DELEGATE(_class,_load), __VA_ARGS__);
#define MCFG_SNAPSHOT_INTERFACE(_interface) \
downcast<snapshot_image_device &>(*device).set_interface(_interface);
-#define MCFG_QUICKLOAD_ADD(_tag, _class, _load, _file_extensions, _delay) \
+#define MCFG_QUICKLOAD_ADD(_tag, _class, _load, ...) \
MCFG_DEVICE_ADD(_tag, QUICKLOAD, 0) \
- static_cast<quickload_image_device *>(device)->set_handler(QUICKLOAD_LOAD_DELEGATE(_class,_load), _file_extensions, _delay);
+ static_cast<quickload_image_device *>(device)->set_handler(QUICKLOAD_LOAD_DELEGATE(_class,_load), __VA_ARGS__);
#define MCFG_QUICKLOAD_INTERFACE(_interface) \
downcast<quickload_image_device &>(*device).set_interface(_interface);
diff --git a/src/devices/machine/6525tpi.cpp b/src/devices/machine/6525tpi.cpp
index a82b09d104c..83d28fc0355 100644
--- a/src/devices/machine/6525tpi.cpp
+++ b/src/devices/machine/6525tpi.cpp
@@ -294,12 +294,12 @@ WRITE_LINE_MEMBER( tpi6525_device::i4_w )
}
}
-READ8_MEMBER( tpi6525_device::pa_r )
+uint8_t tpi6525_device::pa_r()
{
uint8_t data = m_in_a;
if (!m_in_pa_cb.isnull())
- data = m_in_pa_cb(offset);
+ data = m_in_pa_cb();
data = (data & ~m_ddr_a) | (m_ddr_a & m_port_a);
@@ -307,18 +307,18 @@ READ8_MEMBER( tpi6525_device::pa_r )
}
-WRITE8_MEMBER( tpi6525_device::pa_w )
+void tpi6525_device::pa_w(uint8_t data)
{
m_in_a = data;
}
-READ8_MEMBER( tpi6525_device::pb_r )
+uint8_t tpi6525_device::pb_r()
{
uint8_t data = m_in_b;
if (!m_in_pb_cb.isnull())
- data = m_in_pb_cb(offset);
+ data = m_in_pb_cb();
data = (data & ~m_ddr_b) | (m_ddr_b & m_port_b);
@@ -326,18 +326,18 @@ READ8_MEMBER( tpi6525_device::pb_r )
}
-WRITE8_MEMBER( tpi6525_device::pb_w )
+void tpi6525_device::pb_w(uint8_t data)
{
m_in_b = data;
}
-READ8_MEMBER( tpi6525_device::pc_r )
+uint8_t tpi6525_device::pc_r()
{
uint8_t data = m_in_c;
if (!m_in_pc_cb.isnull())
- data &= m_in_pc_cb(offset);
+ data &= m_in_pc_cb();
data = (data & ~m_ddr_c) | (m_ddr_c & m_port_c);
@@ -345,13 +345,13 @@ READ8_MEMBER( tpi6525_device::pc_r )
}
-WRITE8_MEMBER( tpi6525_device::pc_w )
+void tpi6525_device::pc_w(uint8_t data)
{
m_in_c = data;
}
-READ8_MEMBER( tpi6525_device::read )
+uint8_t tpi6525_device::read(offs_t offset)
{
uint8_t data = 0xff;
@@ -466,7 +466,7 @@ READ8_MEMBER( tpi6525_device::read )
}
-WRITE8_MEMBER( tpi6525_device::write )
+void tpi6525_device::write(offs_t offset, uint8_t data)
{
DBG_LOG(machine(), 2, "tpi6525", ("%s write %.2x %.2x\n", tag(), offset, data));
diff --git a/src/devices/machine/6525tpi.h b/src/devices/machine/6525tpi.h
index 5e1ec394fe4..4052662d50a 100644
--- a/src/devices/machine/6525tpi.h
+++ b/src/devices/machine/6525tpi.h
@@ -53,8 +53,8 @@ public:
auto out_ca_cb() { return m_out_ca_cb.bind(); }
auto out_cb_cb() { return m_out_cb_cb.bind(); }
- DECLARE_READ8_MEMBER( read );
- DECLARE_WRITE8_MEMBER( write );
+ uint8_t read(offs_t offset);
+ void write(offs_t offset, uint8_t data);
DECLARE_WRITE_LINE_MEMBER( i0_w );
DECLARE_WRITE_LINE_MEMBER( i1_w );
@@ -62,12 +62,12 @@ public:
DECLARE_WRITE_LINE_MEMBER( i3_w );
DECLARE_WRITE_LINE_MEMBER( i4_w );
- DECLARE_READ8_MEMBER( pa_r );
- DECLARE_READ8_MEMBER( pb_r );
- DECLARE_READ8_MEMBER( pc_r );
- DECLARE_WRITE8_MEMBER( pa_w );
- DECLARE_WRITE8_MEMBER( pb_w );
- DECLARE_WRITE8_MEMBER( pc_w );
+ uint8_t pa_r();
+ uint8_t pb_r();
+ uint8_t pc_r();
+ void pa_w(uint8_t data);
+ void pb_w(uint8_t data);
+ void pc_w(uint8_t data);
WRITE_LINE_MEMBER( pb0_w ) { port_line_w(m_in_b, 0, state); }
WRITE_LINE_MEMBER( pb1_w ) { port_line_w(m_in_b, 1, state); }
diff --git a/src/devices/machine/68153bim.cpp b/src/devices/machine/68153bim.cpp
index 30be9ea5e81..8df821a813e 100644
--- a/src/devices/machine/68153bim.cpp
+++ b/src/devices/machine/68153bim.cpp
@@ -67,12 +67,13 @@ DEFINE_DEVICE_TYPE(EI68C153, ei68c153_device, "ei68c153", "EPIC
// device_add_mconfig - add device configuration
//-------------------------------------------------
-MACHINE_CONFIG_START(bim68153_device::device_add_mconfig)
- MCFG_DEVICE_ADD(CHN0_TAG, MC68153_CHANNEL, 0)
- MCFG_DEVICE_ADD(CHN1_TAG, MC68153_CHANNEL, 0)
- MCFG_DEVICE_ADD(CHN2_TAG, MC68153_CHANNEL, 0)
- MCFG_DEVICE_ADD(CHN3_TAG, MC68153_CHANNEL, 0)
-MACHINE_CONFIG_END
+void bim68153_device::device_add_mconfig(machine_config &config)
+{
+ MC68153_CHANNEL(config, m_chn[0], 0);
+ MC68153_CHANNEL(config, m_chn[1], 0);
+ MC68153_CHANNEL(config, m_chn[2], 0);
+ MC68153_CHANNEL(config, m_chn[3], 0);
+}
//**************************************************************************
// LIVE DEVICE
diff --git a/src/devices/machine/6821pia.cpp b/src/devices/machine/6821pia.cpp
index 3bf21c9483b..60efe473f19 100644
--- a/src/devices/machine/6821pia.cpp
+++ b/src/devices/machine/6821pia.cpp
@@ -576,7 +576,7 @@ uint8_t pia6821_device::control_b_r()
// read
//-------------------------------------------------
-uint8_t pia6821_device::reg_r(uint8_t offset)
+uint8_t pia6821_device::read(offs_t offset)
{
uint8_t ret;
@@ -846,7 +846,7 @@ void pia6821_device::control_b_w(uint8_t data)
// write
//-------------------------------------------------
-void pia6821_device::reg_w(uint8_t offset, uint8_t data)
+void pia6821_device::write(offs_t offset, uint8_t data)
{
switch (offset & 0x03)
{
diff --git a/src/devices/machine/6821pia.h b/src/devices/machine/6821pia.h
index b31bf03183c..8457399cf1a 100644
--- a/src/devices/machine/6821pia.h
+++ b/src/devices/machine/6821pia.h
@@ -55,13 +55,10 @@ public:
auto irqa_handler() { return m_irqa_handler.bind(); }
auto irqb_handler() { return m_irqb_handler.bind(); }
- uint8_t reg_r(uint8_t offset);
- void reg_w(uint8_t offset, uint8_t data);
-
- DECLARE_READ8_MEMBER( read ) { return reg_r(offset); }
- DECLARE_WRITE8_MEMBER( write ) { reg_w(offset, data); }
- DECLARE_READ8_MEMBER( read_alt ) { return reg_r(((offset << 1) & 0x02) | ((offset >> 1) & 0x01)); }
- DECLARE_WRITE8_MEMBER( write_alt ) { reg_w(((offset << 1) & 0x02) | ((offset >> 1) & 0x01), data); }
+ uint8_t read(offs_t offset);
+ void write(offs_t offset, uint8_t data);
+ uint8_t read_alt(offs_t offset) { return read(((offset << 1) & 0x02) | ((offset >> 1) & 0x01)); }
+ void write_alt(offs_t offset, uint8_t data) { write(((offset << 1) & 0x02) | ((offset >> 1) & 0x01), data); }
uint8_t port_b_z_mask() const { return ~m_ddr_b; } // see first note in .c
void set_port_a_z_mask(uint8_t data) { m_port_a_z_mask = data; }// see second note in .c
diff --git a/src/devices/machine/68307.cpp b/src/devices/machine/68307.cpp
index 421d5f06da2..ae13e090488 100644
--- a/src/devices/machine/68307.cpp
+++ b/src/devices/machine/68307.cpp
@@ -40,14 +40,15 @@ void m68307_cpu_device::m68307_internal_map(address_map &map)
}
-MACHINE_CONFIG_START(m68307_cpu_device::device_add_mconfig)
- MCFG_DEVICE_ADD("internal68681", MC68681, 16000000/4) // ?? Mhz - should be specified in inline config
- MCFG_MC68681_IRQ_CALLBACK(WRITELINE(*this, m68307_cpu_device, m68307_duart_irq_handler))
- MCFG_MC68681_A_TX_CALLBACK(WRITELINE(*this, m68307_cpu_device, m68307_duart_txa))
- MCFG_MC68681_B_TX_CALLBACK(WRITELINE(*this, m68307_cpu_device, m68307_duart_txb))
- MCFG_MC68681_INPORT_CALLBACK(READ8(*this, m68307_cpu_device, m68307_duart_input_r))
- MCFG_MC68681_OUTPORT_CALLBACK(WRITE8(*this, m68307_cpu_device, m68307_duart_output_w))
-MACHINE_CONFIG_END
+void m68307_cpu_device::device_add_mconfig(machine_config &config)
+{
+ MC68681(config, m_duart, 16000000/4); // ?? Mhz - should be specified in inline config
+ m_duart->irq_cb().set(FUNC(m68307_cpu_device::m68307_duart_irq_handler));
+ m_duart->a_tx_cb().set(FUNC(m68307_cpu_device::m68307_duart_txa));
+ m_duart->b_tx_cb().set(FUNC(m68307_cpu_device::m68307_duart_txb));
+ m_duart->inport_cb().set(FUNC(m68307_cpu_device::m68307_duart_input_r));
+ m_duart->outport_cb().set(FUNC(m68307_cpu_device::m68307_duart_output_w));
+}
m68307_cpu_device::m68307_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
@@ -89,6 +90,14 @@ void m68307_cpu_device::device_reset()
set_ipl(0);
}
+void m68307_cpu_device::m68k_reset_peripherals()
+{
+ m_duart->reset();
+
+ if (m_m68307MBUS) m_m68307MBUS->reset();
+ if (m_m68307TIMER) m_m68307TIMER->reset();
+}
+
/* todo: is it possible to calculate the address map based on CS when they change
and install handlers? Going through this logic for every memory access is
diff --git a/src/devices/machine/68307.h b/src/devices/machine/68307.h
index 591d0c9cced..6d5ef10b61c 100644
--- a/src/devices/machine/68307.h
+++ b/src/devices/machine/68307.h
@@ -44,6 +44,8 @@ protected:
virtual uint32_t execute_min_cycles() const override { return 4; }
virtual uint32_t execute_max_cycles() const override { return 158; }
+ virtual void m68k_reset_peripherals() override;
+
private:
void set_ipl(int level);
DECLARE_WRITE_LINE_MEMBER(timer0_interrupt);
diff --git a/src/devices/machine/68340.cpp b/src/devices/machine/68340.cpp
index e9f8ba7ba8e..bae8be35b62 100644
--- a/src/devices/machine/68340.cpp
+++ b/src/devices/machine/68340.cpp
@@ -262,3 +262,12 @@ void m68340_cpu_device::device_start()
m_int_ack_callback = device_irq_acknowledge_delegate(FUNC(m68340_cpu_device::int_ack), this);
}
+
+void m68340_cpu_device::m68k_reset_peripherals()
+{
+ m_m68340SIM->module_reset();
+ m_m68340DMA->module_reset();
+ m_serial->module_reset();
+ m_timer[0]->module_reset();
+ m_timer[1]->module_reset();
+}
diff --git a/src/devices/machine/68340.h b/src/devices/machine/68340.h
index 12af250c5b2..23f3ed6b147 100644
--- a/src/devices/machine/68340.h
+++ b/src/devices/machine/68340.h
@@ -49,6 +49,8 @@ protected:
virtual void device_reset() override;
virtual void device_add_mconfig(machine_config &config) override;
+ virtual void m68k_reset_peripherals() override;
+
private:
required_device<mc68340_serial_module_device> m_serial;
required_device_array<mc68340_timer_module_device, 2> m_timer;
diff --git a/src/devices/machine/68340dma.cpp b/src/devices/machine/68340dma.cpp
index 6649aeb2a94..4a79a4504fc 100644
--- a/src/devices/machine/68340dma.cpp
+++ b/src/devices/machine/68340dma.cpp
@@ -26,4 +26,9 @@ WRITE32_MEMBER( m68340_cpu_device::m68340_internal_dma_w )
void m68340_dma::reset()
{
+ module_reset();
+}
+
+void m68340_dma::module_reset()
+{
}
diff --git a/src/devices/machine/68340dma.h b/src/devices/machine/68340dma.h
index 3a92b4e9a49..8bec4fb88a7 100644
--- a/src/devices/machine/68340dma.h
+++ b/src/devices/machine/68340dma.h
@@ -10,6 +10,7 @@ class m68340_dma
{
public:
void reset();
+ void module_reset();
};
#endif // MAME_MACHINE_68340DMA_H
diff --git a/src/devices/machine/68340ser.cpp b/src/devices/machine/68340ser.cpp
index fcf6708305e..e0fc3b29fde 100644
--- a/src/devices/machine/68340ser.cpp
+++ b/src/devices/machine/68340ser.cpp
@@ -157,4 +157,9 @@ mc68340_serial_module_device::mc68340_serial_module_device(const machine_config
{
}
+void mc68340_serial_module_device::module_reset()
+{
+ mc68340_duart_device::device_reset();
+}
+
DEFINE_DEVICE_TYPE(MC68340_SERIAL_MODULE, mc68340_serial_module_device, "mc68340sermod", "MC68340 Serial Module")
diff --git a/src/devices/machine/68340ser.h b/src/devices/machine/68340ser.h
index e658d719c05..b9775f2ad86 100644
--- a/src/devices/machine/68340ser.h
+++ b/src/devices/machine/68340ser.h
@@ -7,11 +7,6 @@
#include "machine/mc68681.h"
-// MCFG macros to hide the implementation
-#define MCFG_MC68340SER_IRQ_CALLBACK(_cb) MCFG_MC68681_IRQ_CALLBACK(_cb)
-#define MCFG_MC68340SER_A_TX_CALLBACK(_cb) MCFG_MC68681_A_TX_CALLBACK(_cb)
-#define MCFG_MC68340SER_B_TX_CALLBACK(_cb) MCFG_MC68681_B_TX_CALLBACK(_cb)
-
class m68340_cpu_device;
class mc68340_serial_module_device : public mc68340_duart_device
@@ -32,6 +27,8 @@ public:
uint8_t irq_vector() const { return m_ivr; }
uint8_t arbitrate(uint8_t level) const { return (irq_level() == level) ? (m_mcrl & REG_MCRL_ARBLV) : 0; }
+ void module_reset();
+
protected:
m68340_cpu_device *m_cpu;
diff --git a/src/devices/machine/68340sim.cpp b/src/devices/machine/68340sim.cpp
index cf299ba2b22..3dbbfcb0733 100644
--- a/src/devices/machine/68340sim.cpp
+++ b/src/devices/machine/68340sim.cpp
@@ -493,6 +493,12 @@ void m68340_sim::reset()
m_pit_irq = false;
}
+void m68340_sim::module_reset()
+{
+ // SYS set in RSR, nothing else happens
+ m_avr_rsr = (m_avr_rsr & 0xff00) | 0x02;
+}
+
/* do_tick_pit works on whole clock cycles, no flank support */
void m68340_cpu_device::do_tick_pit()
{
diff --git a/src/devices/machine/68340sim.h b/src/devices/machine/68340sim.h
index 3c839984db2..34358e02eff 100644
--- a/src/devices/machine/68340sim.h
+++ b/src/devices/machine/68340sim.h
@@ -35,6 +35,7 @@ public:
bool m_pit_irq;
void reset();
+ void module_reset();
enum {
REG_MCR = 0x00,
diff --git a/src/devices/machine/68340tmu.cpp b/src/devices/machine/68340tmu.cpp
index 1ceaf65f600..801a9802557 100644
--- a/src/devices/machine/68340tmu.cpp
+++ b/src/devices/machine/68340tmu.cpp
@@ -308,6 +308,16 @@ void mc68340_timer_module_device::device_start()
m_tin_in_cb.resolve_safe();
}
+void mc68340_timer_module_device::device_reset()
+{
+ module_reset();
+}
+
+void mc68340_timer_module_device::module_reset()
+{
+ // TODO
+}
+
void mc68340_timer_module_device::do_timer_irq()
{
assert((m_sr & (REG_SR_TO | REG_SR_TG | REG_SR_TC)) != 0);
diff --git a/src/devices/machine/68340tmu.h b/src/devices/machine/68340tmu.h
index 0582debd475..8952632792b 100644
--- a/src/devices/machine/68340tmu.h
+++ b/src/devices/machine/68340tmu.h
@@ -14,9 +14,6 @@ class mc68340_timer_module_device : public device_t
public:
mc68340_timer_module_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock = 0);
- // device-level overrides
- virtual void device_start() override;
-
READ16_MEMBER( read );
WRITE16_MEMBER( write );
DECLARE_WRITE_LINE_MEMBER( tin_w );
@@ -26,7 +23,13 @@ public:
uint8_t irq_vector() const { return m_ir & REG_IR_INTVEC; }
uint8_t arbitrate(uint8_t level) const { return (irq_level() == level) ? (m_mcr & REG_MCR_ARBLV) : 0; }
- protected:
+ void module_reset();
+
+protected:
+ // device-level overrides
+ virtual void device_start() override;
+ virtual void device_reset() override;
+
m68340_cpu_device *m_cpu;
uint16_t m_mcr;
diff --git a/src/devices/machine/6840ptm.cpp b/src/devices/machine/6840ptm.cpp
index bf1e6f4adb1..36b2cd5002b 100644
--- a/src/devices/machine/6840ptm.cpp
+++ b/src/devices/machine/6840ptm.cpp
@@ -423,7 +423,7 @@ void ptm6840_device::reload_count(int idx)
// read - Read Timer
//-------------------------------------------------
-READ8_MEMBER( ptm6840_device::read )
+uint8_t ptm6840_device::read(offs_t offset)
{
int val;
@@ -487,7 +487,7 @@ READ8_MEMBER( ptm6840_device::read )
// write - Write Timer
//-------------------------------------------------
-WRITE8_MEMBER( ptm6840_device::write )
+void ptm6840_device::write(offs_t offset, uint8_t data)
{
switch ( offset )
{
diff --git a/src/devices/machine/6840ptm.h b/src/devices/machine/6840ptm.h
index ad5859b771b..2c913a97b4c 100644
--- a/src/devices/machine/6840ptm.h
+++ b/src/devices/machine/6840ptm.h
@@ -39,8 +39,8 @@ public:
void set_ext_clock(int counter, double clock); // set clock frequency
int ext_clock(int counter) const { return m_external_clock[counter]; } // get clock frequency
- DECLARE_WRITE8_MEMBER( write );
- DECLARE_READ8_MEMBER( read );
+ void write(offs_t offset, uint8_t data);
+ uint8_t read(offs_t offset);
void set_gate(int idx, int state);
DECLARE_WRITE_LINE_MEMBER( set_g1 );
diff --git a/src/devices/machine/6850acia.cpp b/src/devices/machine/6850acia.cpp
index 6527608bf0f..08e8459fd36 100644
--- a/src/devices/machine/6850acia.cpp
+++ b/src/devices/machine/6850acia.cpp
@@ -150,24 +150,27 @@ void acia6850_device::device_reset()
output_irq(1);
}
-READ8_MEMBER( acia6850_device::status_r )
+uint8_t acia6850_device::status_r()
{
uint8_t status = m_status;
- if (status & SR_CTS)
+ if (!machine().side_effects_disabled())
{
- status &= ~SR_TDRE;
- }
+ if (status & SR_CTS)
+ {
+ status &= ~SR_TDRE;
+ }
- if (m_dcd_irq_pending == DCD_IRQ_READ_STATUS)
- {
- m_dcd_irq_pending = DCD_IRQ_READ_DATA;
+ if (m_dcd_irq_pending == DCD_IRQ_READ_STATUS)
+ {
+ m_dcd_irq_pending = DCD_IRQ_READ_DATA;
+ }
}
return status;
}
-WRITE8_MEMBER( acia6850_device::control_w )
+void acia6850_device::control_w(uint8_t data)
{
LOG("MC6850 '%s' Control: %02x\n", tag(), data);
@@ -237,7 +240,7 @@ void acia6850_device::update_irq()
output_irq(calculate_txirq() && calculate_rxirq());
}
-WRITE8_MEMBER( acia6850_device::data_w )
+void acia6850_device::data_w(uint8_t data)
{
LOG("MC6850 '%s' Data: %02x\n", tag(), data);
@@ -254,40 +257,43 @@ WRITE8_MEMBER( acia6850_device::data_w )
update_irq();
}
-READ8_MEMBER( acia6850_device::data_r )
+uint8_t acia6850_device::data_r()
{
- if (m_overrun_pending)
+ if (!machine().side_effects_disabled())
{
- m_status |= SR_OVRN;
- m_overrun_pending = false;
- }
- else
- {
- m_status &= ~SR_OVRN;
- m_status &= ~SR_RDRF;
- }
+ if (m_overrun_pending)
+ {
+ m_status |= SR_OVRN;
+ m_overrun_pending = false;
+ }
+ else
+ {
+ m_status &= ~SR_OVRN;
+ m_status &= ~SR_RDRF;
+ }
- if (m_dcd_irq_pending == DCD_IRQ_READ_DATA)
- {
- m_dcd_irq_pending = DCD_IRQ_NONE;
- }
+ if (m_dcd_irq_pending == DCD_IRQ_READ_DATA)
+ {
+ m_dcd_irq_pending = DCD_IRQ_NONE;
+ }
- update_irq();
+ update_irq();
+ }
return m_rdr;
}
-WRITE8_MEMBER( acia6850_device::write )
+void acia6850_device::write(offs_t offset, uint8_t data)
{
if (BIT(offset, 0))
- data_w(space, 0, data);
+ data_w(data);
else
- control_w(space, 0, data);
+ control_w(data);
}
-READ8_MEMBER( acia6850_device::read )
+uint8_t acia6850_device::read(offs_t offset)
{
- return BIT(offset, 0) ? data_r(space, 0) : status_r(space, 0);
+ return BIT(offset, 0) ? data_r() : status_r();
}
DECLARE_WRITE_LINE_MEMBER( acia6850_device::write_cts )
diff --git a/src/devices/machine/6850acia.h b/src/devices/machine/6850acia.h
index 4c40e2dc69f..4d99209d519 100644
--- a/src/devices/machine/6850acia.h
+++ b/src/devices/machine/6850acia.h
@@ -24,12 +24,12 @@ public:
auto rts_handler() { return m_rts_handler.bind(); }
auto irq_handler() { return m_irq_handler.bind(); }
- DECLARE_WRITE8_MEMBER( control_w );
- DECLARE_READ8_MEMBER( status_r );
- DECLARE_WRITE8_MEMBER( data_w );
- DECLARE_READ8_MEMBER( data_r );
- DECLARE_WRITE8_MEMBER( write );
- DECLARE_READ8_MEMBER( read );
+ void control_w(uint8_t data);
+ uint8_t status_r();
+ void data_w(uint8_t data);
+ uint8_t data_r();
+ void write(offs_t offset, uint8_t data);
+ uint8_t read(offs_t offset);
DECLARE_WRITE_LINE_MEMBER( write_cts );
DECLARE_WRITE_LINE_MEMBER( write_dcd );
diff --git a/src/devices/machine/74157.cpp b/src/devices/machine/74157.cpp
index f5a68cc4465..1dc7eb1289b 100644
--- a/src/devices/machine/74157.cpp
+++ b/src/devices/machine/74157.cpp
@@ -35,7 +35,7 @@ DEFINE_DEVICE_TYPE(LS157_X2, ls157_x2_device, "ls157_x2", "74LS157 Quad 2-to-1 M
// ls157_device - constructor
//-------------------------------------------------
-ls157_device::ls157_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+ls157_device::ls157_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
: ls157_device(mconfig, LS157, tag, owner, clock, 0x0f)
{
}
@@ -58,7 +58,7 @@ ls157_device::ls157_device(const machine_config &mconfig, device_type type, cons
// ls157_x2_device - constructor
//-------------------------------------------------
-ls157_x2_device::ls157_x2_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+ls157_x2_device::ls157_x2_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
: ls157_device(mconfig, LS157_X2, tag, owner, clock, 0xff)
{
}
@@ -92,7 +92,7 @@ void ls157_device::device_start()
// a_w -- write nibble to A1-A4
//-------------------------------------------------
-void ls157_device::write_a(u8 data)
+void ls157_device::a_w(u8 data)
{
m_a = data & m_data_mask;
update_output();
@@ -103,7 +103,7 @@ void ls157_device::write_a(u8 data)
// b_w -- write nibble to B1-B4
//-------------------------------------------------
-void ls157_device::write_b(u8 data)
+void ls157_device::b_w(u8 data)
{
m_b = data & m_data_mask;
update_output();
@@ -115,7 +115,7 @@ void ls157_device::write_b(u8 data)
// low nibble to B1-B4
//-------------------------------------------------
-void ls157_device::write_ab(u8 data)
+void ls157_device::ab_w(u8 data)
{
assert(m_data_mask == 0x0f);
m_a = data >> 4;
@@ -129,7 +129,7 @@ void ls157_device::write_ab(u8 data)
// low nibble to A1-A4
//-------------------------------------------------
-void ls157_device::write_ba(u8 data)
+void ls157_device::ba_w(u8 data)
{
assert(m_data_mask == 0x0f);
m_b = data >> 4;
@@ -143,7 +143,7 @@ void ls157_device::write_ba(u8 data)
// A1-A4 and write odd-numbered bits to B1-B4
//-------------------------------------------------
-void ls157_device::write_interleave(u8 data)
+void ls157_device::interleave_w(u8 data)
{
assert(m_data_mask == 0x0f);
m_b = bitswap<4>(data, 7, 5, 3, 1);
@@ -260,7 +260,7 @@ void ls157_device::update_output()
// DATA OUTPUTS
//**************************************************************************
-READ8_MEMBER(ls157_device::output_r)
+u8 ls157_device::output_r()
{
if (m_strobe)
return 0;
@@ -277,7 +277,7 @@ READ8_MEMBER(ls157_device::output_r)
DEFINE_DEVICE_TYPE(HC157, hc157_device, "hc157", "74HC157 Quad 2-to-1 Multiplexer")
-hc157_device::hc157_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+hc157_device::hc157_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
: ls157_device(mconfig, HC157, tag, owner, clock, 0x0f)
{
}
@@ -289,7 +289,7 @@ hc157_device::hc157_device(const machine_config &mconfig, const char *tag, devic
DEFINE_DEVICE_TYPE(HCT157, hct157_device, "hct157", "74HCT157 Quad 2-to-1 Multiplexer")
-hct157_device::hct157_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+hct157_device::hct157_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
: ls157_device(mconfig, HCT157, tag, owner, clock, 0x0f)
{
}
diff --git a/src/devices/machine/74157.h b/src/devices/machine/74157.h
index 4bd4685546c..52875cc0a76 100644
--- a/src/devices/machine/74157.h
+++ b/src/devices/machine/74157.h
@@ -42,16 +42,11 @@ public:
auto out_callback() { return m_out_cb.bind(); }
// data writes
- DECLARE_WRITE8_MEMBER(a_w) { write_a(data); }
- void write_a(u8 data);
- DECLARE_WRITE8_MEMBER(b_w) { write_b(data); }
- void write_b(u8 data);
- DECLARE_WRITE8_MEMBER(ab_w) { write_ab(data); }
- void write_ab(u8 data);
- DECLARE_WRITE8_MEMBER(ba_w) { write_ba(data); }
- void write_ba(u8 data);
- DECLARE_WRITE8_MEMBER(interleave_w) { write_interleave(data); }
- void write_interleave(u8 data);
+ void a_w(u8 data);
+ void b_w(u8 data);
+ void ab_w(u8 data);
+ void ba_w(u8 data);
+ void interleave_w(u8 data);
// data line writes
DECLARE_WRITE_LINE_MEMBER(a0_w);
@@ -68,7 +63,7 @@ public:
DECLARE_WRITE_LINE_MEMBER(strobe_w);
// output read
- DECLARE_READ8_MEMBER(output_r);
+ u8 output_r();
protected:
ls157_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock, u8 mask);
diff --git a/src/devices/machine/74165.cpp b/src/devices/machine/74165.cpp
index d33033d5ab7..9ba4415d56c 100644
--- a/src/devices/machine/74165.cpp
+++ b/src/devices/machine/74165.cpp
@@ -22,9 +22,10 @@ DEFINE_DEVICE_TYPE(TTL165, ttl165_device, "ttl165", "SN54/74165")
// device_add_mconfig - add device configuration
//-------------------------------------------------
-MACHINE_CONFIG_START(ttl165_device::device_add_mconfig)
- MCFG_TIMER_DRIVER_ADD("timer", ttl165_device, qh_output)
-MACHINE_CONFIG_END
+void ttl165_device::device_add_mconfig(machine_config &config)
+{
+ TIMER(config, m_timer).configure_generic(FUNC(ttl165_device::qh_output));
+}
//**************************************************************************
diff --git a/src/devices/machine/74166.cpp b/src/devices/machine/74166.cpp
index 07a9de653a5..1611b526762 100644
--- a/src/devices/machine/74166.cpp
+++ b/src/devices/machine/74166.cpp
@@ -22,9 +22,10 @@ DEFINE_DEVICE_TYPE(TTL166, ttl166_device, "ttl166", "SN54/74166")
// device_add_mconfig - add device configuration
//-------------------------------------------------
-MACHINE_CONFIG_START(ttl166_device::device_add_mconfig)
- MCFG_TIMER_DRIVER_ADD("timer", ttl166_device, qh_output)
-MACHINE_CONFIG_END
+void ttl166_device::device_add_mconfig(machine_config &config)
+{
+ TIMER(config, m_timer).configure_generic(FUNC(ttl166_device::qh_output));
+}
//**************************************************************************
diff --git a/src/devices/machine/7474.h b/src/devices/machine/7474.h
index 0a6a678ddfb..0f9d87fa5bf 100644
--- a/src/devices/machine/7474.h
+++ b/src/devices/machine/7474.h
@@ -45,19 +45,6 @@
#pragma once
-
-
-//**************************************************************************
-// INTERFACE CONFIGURATION MACROS
-//**************************************************************************
-
-#define MCFG_7474_OUTPUT_CB(_devcb) \
- downcast<ttl7474_device &>(*device).set_output_cb(DEVCB_##_devcb);
-
-#define MCFG_7474_COMP_OUTPUT_CB(_devcb) \
- downcast<ttl7474_device &>(*device).set_comp_output_cb(DEVCB_##_devcb);
-
-
//**************************************************************************
// TYPE DEFINITIONS
//**************************************************************************
@@ -71,8 +58,6 @@ public:
ttl7474_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
// static configuration helpers
- template <class Object> devcb_base &set_output_cb(Object &&cb) { return m_output_func.set_callback(std::forward<Object>(cb)); }
- template <class Object> devcb_base &set_comp_output_cb(Object &&cb) { return m_comp_output_func.set_callback(std::forward<Object>(cb)); }
auto output_cb() { return m_output_func.bind(); }
auto comp_output_cb() { return m_comp_output_func.bind(); }
diff --git a/src/devices/machine/8042kbdc.cpp b/src/devices/machine/8042kbdc.cpp
index 602435369ab..541e7575b63 100644
--- a/src/devices/machine/8042kbdc.cpp
+++ b/src/devices/machine/8042kbdc.cpp
@@ -45,9 +45,11 @@ kbdc8042_device::kbdc8042_device(const machine_config &mconfig, const char *tag,
{
}
-MACHINE_CONFIG_START(kbdc8042_device::device_add_mconfig)
- MCFG_AT_KEYB_ADD("at_keyboard", 1, WRITELINE(*this, kbdc8042_device, keyboard_w))
-MACHINE_CONFIG_END
+void kbdc8042_device::device_add_mconfig(machine_config &config)
+{
+ AT_KEYB(config, m_keyboard_dev, pc_keyboard_device::KEYBOARD_TYPE::AT, 1);
+ m_keyboard_dev->keypress().set(FUNC(kbdc8042_device::keyboard_w));
+}
/*-------------------------------------------------
@@ -69,6 +71,9 @@ void kbdc8042_device::device_start()
m_sending = 0;
m_last_write_to_control = 0;
m_status_read_mode = 0;
+
+ m_update_timer = timer_alloc(TIMER_UPDATE);
+ m_update_timer->adjust(attotime::never);
}
/*-------------------------------------------------
@@ -86,6 +91,8 @@ void kbdc8042_device::device_reset()
m_mouse_x = 0;
m_mouse_y = 0;
m_mouse_btn = 0;
+
+ m_update_timer->adjust(attotime::from_hz(100), 0, attotime::from_hz(100));
}
void kbdc8042_device::at_8042_set_outport(uint8_t data, int initial)
@@ -195,7 +202,14 @@ void kbdc8042_device::at_8042_clear_keyboard_received()
m_mouse.received = 0;
}
-
+void kbdc8042_device::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr)
+{
+ if (id == TIMER_UPDATE)
+ {
+ at_8042_check_keyboard();
+ at_8042_check_mouse();
+ }
+}
/* **************************************************************************
* Port 0x60 Input and Output Buffer (keyboard and mouse data)
diff --git a/src/devices/machine/8042kbdc.h b/src/devices/machine/8042kbdc.h
index f2e7fdfbf04..38bdbe3814a 100644
--- a/src/devices/machine/8042kbdc.h
+++ b/src/devices/machine/8042kbdc.h
@@ -58,8 +58,11 @@ protected:
virtual void device_start() override;
virtual void device_reset() override;
virtual void device_add_mconfig(machine_config &config) override;
+ virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override;
virtual ioport_constructor device_input_ports() const override;
+ static const device_timer_id TIMER_UPDATE = 0;
+
private:
uint8_t m_inport;
uint8_t m_outport;
@@ -112,6 +115,8 @@ private:
uint16_t m_mouse_y;
uint8_t m_mouse_btn;
+ emu_timer * m_update_timer;
+
DECLARE_WRITE_LINE_MEMBER( keyboard_w );
};
diff --git a/src/devices/machine/8364_paula.h b/src/devices/machine/8364_paula.h
index c889a831b67..412fe7679e6 100644
--- a/src/devices/machine/8364_paula.h
+++ b/src/devices/machine/8364_paula.h
@@ -43,18 +43,6 @@
#pragma once
-
-//**************************************************************************
-// INTERFACE CONFIGURATION MACROS
-//**************************************************************************
-
-#define MCFG_PAULA_MEM_READ_CB(_devcb) \
- downcast<paula_8364_device &>(*device).set_mem_r_callback(DEVCB_##_devcb);
-
-#define MCFG_PAULA_INT_CB(_devcb) \
- downcast<paula_8364_device &>(*device).set_int_w_callback(DEVCB_##_devcb);
-
-
//**************************************************************************
// TYPE DEFINITIONS
//**************************************************************************
@@ -67,8 +55,6 @@ public:
paula_8364_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
// configuration
- template <class Object> devcb_base &set_mem_r_callback(Object &&cb) { return m_mem_r.set_callback(std::forward<Object>(cb)); }
- template <class Object> devcb_base &set_int_w_callback(Object &&cb) { return m_int_w.set_callback(std::forward<Object>(cb)); }
auto mem_read_cb() { return m_mem_r.bind(); }
auto int_cb() { return m_int_w.bind(); }
diff --git a/src/devices/machine/adc0808.cpp b/src/devices/machine/adc0808.cpp
index 5f8aeb8f93c..11aafe276fb 100644
--- a/src/devices/machine/adc0808.cpp
+++ b/src/devices/machine/adc0808.cpp
@@ -156,7 +156,7 @@ void adc0808_device::device_timer(emu_timer &timer, device_timer_id id, int para
// INTERFACE
//**************************************************************************
-READ8_MEMBER( adc0808_device::data_r )
+u8 adc0808_device::data_r()
{
if (!machine().side_effects_disabled())
{
@@ -170,7 +170,7 @@ READ8_MEMBER( adc0808_device::data_r )
return m_sar;
}
-WRITE8_MEMBER( adc0808_device::address_w )
+void adc0808_device::address_w(u8 data)
{
m_address = data & 7;
}
@@ -198,22 +198,22 @@ READ_LINE_MEMBER( adc0808_device::eoc_r )
return m_eoc;
}
-WRITE8_MEMBER( adc0808_device::address_offset_start_w )
+void adc0808_device::address_offset_start_w(offs_t offset, u8 data)
{
if (VERBOSE)
logerror("address_offset_start_w %02x %02x\n", offset, data);
start_w(1);
- address_w(space, 0, offset);
+ address_w(offset);
start_w(0);
}
-WRITE8_MEMBER( adc0808_device::address_data_start_w )
+void adc0808_device::address_data_start_w(u8 data)
{
if (VERBOSE)
- logerror("address_data_start_w %02x %02x\n", offset, data);
+ logerror("address_data_start_w %02x\n", data);
start_w(1);
- address_w(space, 0, data);
+ address_w(data);
start_w(0);
}
diff --git a/src/devices/machine/adc0808.h b/src/devices/machine/adc0808.h
index 46943998dca..1fa97aff47e 100644
--- a/src/devices/machine/adc0808.h
+++ b/src/devices/machine/adc0808.h
@@ -51,14 +51,14 @@ public:
auto eoc_ff_callback() { return m_eoc_ff_cb.bind(); }
template <std::size_t Bit> auto in_callback() { return m_in_cb[Bit].bind(); }
- DECLARE_READ8_MEMBER(data_r);
- DECLARE_WRITE8_MEMBER(address_w);
+ u8 data_r();
+ void address_w(u8 data);
DECLARE_WRITE_LINE_MEMBER(start_w);
DECLARE_READ_LINE_MEMBER(eoc_r);
// common hookups
- DECLARE_WRITE8_MEMBER(address_offset_start_w); // start and ale connected, address to the address bus
- DECLARE_WRITE8_MEMBER(address_data_start_w); // start and ale connected, address to the data bus
+ void address_offset_start_w(offs_t offset, u8 data); // start and ale connected, address to the address bus
+ void address_data_start_w(u8 data); // start and ale connected, address to the data bus
protected:
adc0808_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock);
diff --git a/src/devices/machine/adc0844.cpp b/src/devices/machine/adc0844.cpp
index 103702a8d14..c3616035927 100644
--- a/src/devices/machine/adc0844.cpp
+++ b/src/devices/machine/adc0844.cpp
@@ -182,14 +182,14 @@ void adc0848_device::device_timer(emu_timer &timer, device_timer_id id, int para
// INTERFACE
//**************************************************************************
-READ8_MEMBER( adc0844_device::read )
+u8 adc0844_device::read()
{
m_intr_cb(CLEAR_LINE);
return m_result;
}
-WRITE8_MEMBER( adc0844_device::write )
+void adc0844_device::write(u8 data)
{
m_intr_cb(CLEAR_LINE);
@@ -198,7 +198,7 @@ WRITE8_MEMBER( adc0844_device::write )
m_conversion_timer->adjust(attotime::from_usec(40));
}
-WRITE8_MEMBER( adc0848_device::write )
+void adc0848_device::write(u8 data)
{
m_intr_cb(CLEAR_LINE);
diff --git a/src/devices/machine/adc0844.h b/src/devices/machine/adc0844.h
index d20d9697a09..51dff681f16 100644
--- a/src/devices/machine/adc0844.h
+++ b/src/devices/machine/adc0844.h
@@ -43,8 +43,8 @@ public:
auto ch3_callback() { return m_ch3_cb.bind(); }
auto ch4_callback() { return m_ch4_cb.bind(); }
- DECLARE_READ8_MEMBER(read);
- virtual DECLARE_WRITE8_MEMBER(write);
+ u8 read();
+ virtual void write(u8 data);
protected:
adc0844_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock);
@@ -78,7 +78,7 @@ public:
auto ch7_callback() { return m_ch7_cb.bind(); }
auto ch8_callback() { return m_ch8_cb.bind(); }
- virtual DECLARE_WRITE8_MEMBER(write) override;
+ virtual void write(u8 data) override;
protected:
// device-level overrides
diff --git a/src/devices/machine/aic6250.cpp b/src/devices/machine/aic6250.cpp
index 769968569c8..adf90fe99b5 100644
--- a/src/devices/machine/aic6250.cpp
+++ b/src/devices/machine/aic6250.cpp
@@ -41,13 +41,14 @@
#include "logmacro.h"
-DEFINE_DEVICE_TYPE(AIC6250, aic6250_device, "aic6250", "Adaptec 6250 High-Performance SCSI Protocol Chip")
+DEFINE_DEVICE_TYPE(AIC6250, aic6250_device, "aic6250", "Adaptec AIC-6250 High-Performance SCSI Protocol Chip")
+DEFINE_DEVICE_TYPE(AIC6251A, aic6251a_device, "aic6251a", "Adaptec AIC-6251A Fast SCSI Protocol Chip")
static char const *const nscsi_phase[] = { "DATA OUT", "DATA IN", "COMMAND", "STATUS", "*", "*", "MESSAGE OUT", "MESSAGE IN" };
static char const *const aic6250_phase[] = { "DATA OUT", "*", "DATA IN", "*", "COMMAND", "MESSAGE OUT", "STATUS", "MESSAGE IN" };
-aic6250_device::aic6250_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
- : nscsi_device(mconfig, AIC6250, tag, owner, clock)
+aic6250_device::aic6250_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock)
+ : nscsi_device(mconfig, type, tag, owner, clock)
, m_int_cb(*this)
, m_breq_cb(*this)
, m_port_a_r_cb(*this)
@@ -57,6 +58,16 @@ aic6250_device::aic6250_device(const machine_config &mconfig, const char *tag, d
{
}
+aic6250_device::aic6250_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+ : aic6250_device(mconfig, AIC6250, tag, owner, clock)
+{
+}
+
+aic6251a_device::aic6251a_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+ : aic6250_device(mconfig, AIC6251A, tag, owner, clock)
+{
+}
+
void aic6250_device::map(address_map &map)
{
map(0x0, 0x0).rw(FUNC(aic6250_device::dma_count_l_r), FUNC(aic6250_device::dma_count_l_w));
diff --git a/src/devices/machine/aic6250.h b/src/devices/machine/aic6250.h
index 029c7f72dca..2a4ba02d118 100644
--- a/src/devices/machine/aic6250.h
+++ b/src/devices/machine/aic6250.h
@@ -34,6 +34,8 @@ public:
void dma16_w(u16 data);
protected:
+ aic6250_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock);
+
// standard device_interface overrides
virtual void device_start() override;
virtual void device_reset() override;
@@ -52,11 +54,11 @@ protected:
u8 status_reg_1_r();
u8 scsi_signal_reg_r();
u8 scsi_id_data_r();
- u8 source_dest_id_r() { logerror("source_dest_id_r\n"); return m_source_dest_id; }
+ u8 source_dest_id_r() { return m_source_dest_id; }
u8 memory_data_r();
u8 port_a_r();
u8 port_b_r();
- u8 scsi_latch_data_r() { logerror("scsi_latch_data_r 0x%02x\n", m_scsi_latch_data); return m_scsi_latch_data; }
+ u8 scsi_latch_data_r() { return m_scsi_latch_data; }
void dma_count_l_w(u8 data) { m_dma_count &= ~0x0000ff; m_dma_count |= (data << 0); }
void dma_count_m_w(u8 data) { m_dma_count &= ~0x00ff00; m_dma_count |= (data << 8); }
@@ -277,6 +279,13 @@ private:
util::fifo <u8, 8> m_fifo;
};
+class aic6251a_device : public aic6250_device
+{
+public:
+ aic6251a_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+};
+
DECLARE_DEVICE_TYPE(AIC6250, aic6250_device)
+DECLARE_DEVICE_TYPE(AIC6251A, aic6251a_device)
#endif // MAME_MACHINE_AIC6250_H
diff --git a/src/devices/machine/aicartc.h b/src/devices/machine/aicartc.h
index 757c0a58c1d..71c8cdd55ad 100644
--- a/src/devices/machine/aicartc.h
+++ b/src/devices/machine/aicartc.h
@@ -9,13 +9,6 @@
//**************************************************************************
-// INTERFACE CONFIGURATION MACROS
-//**************************************************************************
-
-#define MCFG_AICARTC_ADD(_tag,_freq) \
- MCFG_DEVICE_ADD(_tag, AICARTC, _freq)
-
-//**************************************************************************
// TYPE DEFINITIONS
//**************************************************************************
diff --git a/src/devices/machine/akiko.cpp b/src/devices/machine/akiko.cpp
index 0394750fe30..eb5fa929059 100644
--- a/src/devices/machine/akiko.cpp
+++ b/src/devices/machine/akiko.cpp
@@ -38,8 +38,9 @@ DEFINE_DEVICE_TYPE(AKIKO, akiko_device, "akiko", "CBM AKIKO")
// device_add_mconfig - add device configuration
//-------------------------------------------------
-MACHINE_CONFIG_START(akiko_device::device_add_mconfig)
-MACHINE_CONFIG_END
+void akiko_device::device_add_mconfig(machine_config &config)
+{
+}
//**************************************************************************
diff --git a/src/devices/machine/am9513.cpp b/src/devices/machine/am9513.cpp
index c17ae1f09fe..6506510369f 100644
--- a/src/devices/machine/am9513.cpp
+++ b/src/devices/machine/am9513.cpp
@@ -1382,7 +1382,7 @@ void am9513_device::data_write(u16 data)
// read8 - 8-bit read access
//-------------------------------------------------
-READ8_MEMBER(am9513_device::read8)
+u8 am9513_device::read8(offs_t offset)
{
if (BIT(offset, 0))
return status_read();
@@ -1395,7 +1395,7 @@ READ8_MEMBER(am9513_device::read8)
// write8 - 8-bit write access
//-------------------------------------------------
-WRITE8_MEMBER(am9513_device::write8)
+void am9513_device::write8(offs_t offset, u8 data)
{
if (BIT(offset, 0))
{
@@ -1412,7 +1412,7 @@ WRITE8_MEMBER(am9513_device::write8)
// read16 - 16-bit read access
//-------------------------------------------------
-READ16_MEMBER(am9513_device::read16)
+u16 am9513_device::read16(offs_t offset)
{
if (BIT(offset, 0))
return status_read() | 0xff00;
@@ -1429,7 +1429,7 @@ READ16_MEMBER(am9513_device::read16)
// write16 - 16-bit write access
//-------------------------------------------------
-WRITE16_MEMBER(am9513_device::write16)
+void am9513_device::write16(offs_t offset, u16 data)
{
if ((!bus_is_16_bit() || BIT(offset, 0)) && (data & 0xff00) != 0xff00)
logerror("Errant write of %02X to upper byte of %s register in %d-bit bus mode\n",
diff --git a/src/devices/machine/am9513.h b/src/devices/machine/am9513.h
index b591294d9b7..ea3fcfe6443 100644
--- a/src/devices/machine/am9513.h
+++ b/src/devices/machine/am9513.h
@@ -55,12 +55,12 @@ public:
auto fout_cb() { return m_fout_cb.bind(); }
// 8-bit data bus interface
- DECLARE_READ8_MEMBER(read8);
- DECLARE_WRITE8_MEMBER(write8);
+ u8 read8(offs_t offset);
+ void write8(offs_t offset, u8 data);
// 16-bit data bus interface
- DECLARE_READ16_MEMBER(read16);
- DECLARE_WRITE16_MEMBER(write16);
+ u16 read16(offs_t offset);
+ void write16(offs_t offset, u16 data);
// Source N inputs
DECLARE_WRITE_LINE_MEMBER(source1_w) { write_source(0, state); }
diff --git a/src/devices/machine/am9517a.cpp b/src/devices/machine/am9517a.cpp
index 463f1c447ef..5fda6ed486c 100644
--- a/src/devices/machine/am9517a.cpp
+++ b/src/devices/machine/am9517a.cpp
@@ -39,6 +39,18 @@
*/
+/*
+ * The EISA_DMA device represents the 82C37A-compatible DMA devices present in
+ * EISA bus systems, in particular those embedded within the i82357 Integrated
+ * System Peripheral. The device supports 32 bit addressing, 32 bit data sizes,
+ * and 24 bit transfer counts, allowing DMA across 64k boundaries. It also adds
+ * stop registers, supporting ring-buffer memory arrangements.
+ *
+ * TODO
+ * - stop registers
+ * - 16/32-bit transfer sizes
+ */
+
#include "emu.h"
#include "am9517a.h"
@@ -54,6 +66,7 @@
DEFINE_DEVICE_TYPE(AM9517A, am9517a_device, "am9517a", "AM9517A")
DEFINE_DEVICE_TYPE(V5X_DMAU, v5x_dmau_device, "v5x_dmau", "V5X DMAU")
DEFINE_DEVICE_TYPE(PCXPORT_DMAC, pcxport_dmac_device, "pcx_dmac", "PC Transporter DMAC")
+DEFINE_DEVICE_TYPE(EISA_DMA, eisa_dma_device, "eisa_dma", "EISA DMA")
//**************************************************************************
@@ -290,8 +303,6 @@ inline void am9517a_device::dma_advance()
{
bool msb_changed = false;
- m_channel[m_current_channel].m_count--;
-
if (m_current_channel || !COMMAND_MEM_TO_MEM || !COMMAND_CH0_ADDRESS_HOLD)
{
if (MODE_ADDRESS_DECREMENT)
@@ -316,7 +327,7 @@ inline void am9517a_device::dma_advance()
}
}
- if (m_channel[m_current_channel].m_count == 0xffff)
+ if (m_channel[m_current_channel].m_count-- == 0)
{
end_of_process();
}
@@ -712,7 +723,7 @@ void am9517a_device::execute_run()
// read -
//-------------------------------------------------
-READ8_MEMBER( am9517a_device::read )
+uint8_t am9517a_device::read(offs_t offset)
{
uint8_t data = 0;
@@ -776,7 +787,7 @@ READ8_MEMBER( am9517a_device::read )
// write -
//-------------------------------------------------
-WRITE8_MEMBER( am9517a_device::write )
+void am9517a_device::write(offs_t offset, uint8_t data)
{
if (!BIT(offset, 3))
{
@@ -1013,7 +1024,7 @@ void v5x_dmau_device::device_reset()
}
-READ8_MEMBER(v5x_dmau_device::read)
+uint8_t v5x_dmau_device::read(offs_t offset)
{
uint8_t ret = 0;
int channel = m_selected_channel;
@@ -1097,7 +1108,7 @@ READ8_MEMBER(v5x_dmau_device::read)
return ret;
}
-WRITE8_MEMBER(v5x_dmau_device::write)
+void v5x_dmau_device::write(offs_t offset, uint8_t data)
{
int channel = m_selected_channel;
@@ -1108,12 +1119,12 @@ WRITE8_MEMBER(v5x_dmau_device::write)
//m_buswidth = data & 0x02;
//if (data & 0x01)
// soft_reset();
- logerror("DMA: Initialise [%02x]\n", data);
+ LOG("DMA: Initialise [%02x]\n", data);
break;
case 0x01: // Channel
m_selected_channel = data & 0x03;
m_base = data & 0x04;
- logerror("DMA: Channel selected [%02x]\n", data);
+ LOG("DMA: Channel selected [%02x]\n", data);
break;
case 0x02: // Count (low)
m_channel[channel].m_base_count =
@@ -1121,7 +1132,7 @@ WRITE8_MEMBER(v5x_dmau_device::write)
if (m_base == 0)
m_channel[channel].m_count =
(m_channel[channel].m_count & 0xff00) | data;
- logerror("DMA: Channel %i Counter set [%04x]\n", m_selected_channel, m_channel[channel].m_base_count);
+ LOG("DMA: Channel %i Counter set [%04x]\n", m_selected_channel, m_channel[channel].m_base_count);
break;
case 0x03: // Count (high)
m_channel[channel].m_base_count =
@@ -1129,7 +1140,7 @@ WRITE8_MEMBER(v5x_dmau_device::write)
if (m_base == 0)
m_channel[channel].m_count =
(m_channel[channel].m_count & 0x00ff) | (data << 8);
- logerror("DMA: Channel %i Counter set [%04x]\n", m_selected_channel, m_channel[channel].m_base_count);
+ LOG("DMA: Channel %i Counter set [%04x]\n", m_selected_channel, m_channel[channel].m_base_count);
break;
case 0x04: // Address (low)
m_channel[channel].m_base_address =
@@ -1137,7 +1148,7 @@ WRITE8_MEMBER(v5x_dmau_device::write)
if (m_base == 0)
m_channel[channel].m_address =
(m_channel[channel].m_address & 0xffffff00) | data;
- logerror("DMA: Channel %i Address set [%08x]\n", m_selected_channel, m_channel[channel].m_base_address);
+ LOG("DMA: Channel %i Address set [%08x]\n", m_selected_channel, m_channel[channel].m_base_address);
break;
case 0x05: // Address (mid)
m_channel[channel].m_base_address =
@@ -1145,7 +1156,7 @@ WRITE8_MEMBER(v5x_dmau_device::write)
if (m_base == 0)
m_channel[channel].m_address =
(m_channel[channel].m_address & 0xffff00ff) | (data << 8);
- logerror("DMA: Channel %i Address set [%08x]\n", m_selected_channel, m_channel[channel].m_base_address);
+ LOG("DMA: Channel %i Address set [%08x]\n", m_selected_channel, m_channel[channel].m_base_address);
break;
case 0x06: // Address (high)
m_channel[channel].m_base_address =
@@ -1153,7 +1164,7 @@ WRITE8_MEMBER(v5x_dmau_device::write)
if (m_base == 0)
m_channel[channel].m_address =
(m_channel[channel].m_address & 0xff00ffff) | (data << 16);
- logerror("DMA: Channel %i Address set [%08x]\n", m_selected_channel, m_channel[channel].m_base_address);
+ LOG("DMA: Channel %i Address set [%08x]\n", m_selected_channel, m_channel[channel].m_base_address);
break;
case 0x07: // Address (highest)
m_channel[channel].m_base_address =
@@ -1161,31 +1172,31 @@ WRITE8_MEMBER(v5x_dmau_device::write)
if (m_base == 0)
m_channel[channel].m_address =
(m_channel[channel].m_address & 0x00ffffff) | (data << 24);
- logerror("DMA: Channel %i Address set [%08x]\n", m_selected_channel, m_channel[channel].m_base_address);
+ LOG("DMA: Channel %i Address set [%08x]\n", m_selected_channel, m_channel[channel].m_base_address);
break;
case 0x0a: // Mode control
m_channel[channel].m_mode = data;
// clear terminal count
m_status &= ~(1 << channel);
- logerror("DMA: Channel %i Mode control set [%02x]\n",m_selected_channel,m_channel[channel].m_mode);
+ LOG("DMA: Channel %i Mode control set [%02x]\n",m_selected_channel,m_channel[channel].m_mode);
break;
case 0x08: // Device control (low)
m_command = data;
- logerror("DMA: Device control low set [%02x]\n",data);
+ LOG("DMA: Device control low set [%02x]\n",data);
break;
case 0x09: // Device control (high)
m_command_high = data;
- logerror("DMA: Device control high set [%02x]\n",data);
+ LOG("DMA: Device control high set [%02x]\n",data);
break;
case 0x0e: // Request
//m_reg.request = data;
- logerror("(invalid) DMA: Request set [%02x]\n",data); // no software requests on the v53 integrated version
+ LOG("(invalid) DMA: Request set [%02x]\n",data); // no software requests on the v53 integrated version
break;
case 0x0f: // Mask
m_mask = data & 0x0f;
- logerror("DMA: Mask set [%02x]\n",data);
+ LOG("DMA: Mask set [%02x]\n",data);
break;
@@ -1298,3 +1309,17 @@ void pcxport_dmac_device::end_of_process()
m_state = STATE_SI;
}
+
+eisa_dma_device::eisa_dma_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+ : am9517a_device(mconfig, EISA_DMA, tag, owner, clock)
+{
+}
+
+void eisa_dma_device::device_start()
+{
+ am9517a_device::device_start();
+
+ m_address_mask = 0xffffffffU;
+
+ save_item(NAME(m_stop));
+}
diff --git a/src/devices/machine/am9517a.h b/src/devices/machine/am9517a.h
index 37390a930d3..a1e9215d125 100644
--- a/src/devices/machine/am9517a.h
+++ b/src/devices/machine/am9517a.h
@@ -61,8 +61,8 @@ public:
template <unsigned C> auto out_iow_callback() { return m_out_iow_cb[C].bind(); }
template <unsigned C> auto out_dack_callback() { return m_out_dack_cb[C].bind(); }
- virtual DECLARE_READ8_MEMBER( read );
- virtual DECLARE_WRITE8_MEMBER( write );
+ virtual uint8_t read(offs_t offset);
+ virtual void write(offs_t offset, uint8_t data);
DECLARE_WRITE_LINE_MEMBER( hack_w );
DECLARE_WRITE_LINE_MEMBER( ready_w );
@@ -95,9 +95,9 @@ protected:
struct
{
uint32_t m_address;
- uint16_t m_count;
+ uint32_t m_count;
uint32_t m_base_address;
- uint16_t m_base_count;
+ uint32_t m_base_count;
uint8_t m_mode;
} m_channel[4];
@@ -149,8 +149,8 @@ public:
template <unsigned C> auto in_io16r_callback() { return m_in_io16r_cb[C].bind(); }
template <unsigned C> auto out_io16w_callback() { return m_out_io16w_cb[C].bind(); }
- virtual DECLARE_READ8_MEMBER( read ) override;
- virtual DECLARE_WRITE8_MEMBER( write ) override;
+ virtual uint8_t read(offs_t offset) override;
+ virtual void write(offs_t offset, uint8_t data) override;
protected:
// device-level overrides
@@ -186,11 +186,50 @@ protected:
virtual void end_of_process() override;
};
+class eisa_dma_device : public am9517a_device
+{
+public:
+ eisa_dma_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+
+ template <unsigned Channel> u8 get_address_page() { return m_channel[Channel].m_address >> 16; }
+ template <unsigned Channel> void set_address_page(u8 data)
+ {
+ m_channel[Channel].m_base_address = (m_channel[Channel].m_base_address & 0x0000ffffU) | (u32(data) << 16);
+ m_channel[Channel].m_address = (m_channel[Channel].m_address & 0x0000ffffU) | (u32(data) << 16);
+ }
+
+ template <unsigned Channel> u8 get_address_page_high() { return m_channel[Channel].m_address >> 24; }
+ template <unsigned Channel> void set_address_page_high(u8 data)
+ {
+ m_channel[Channel].m_base_address = (m_channel[Channel].m_base_address & 0x00ffffffU) | (u32(data) << 24);
+ m_channel[Channel].m_address = (m_channel[Channel].m_address & 0x00ffffffU) | (u32(data) << 24);
+ }
+
+ template <unsigned Channel> u8 get_count_high() { return m_channel[Channel].m_count >> 16; }
+ template <unsigned Channel> void set_count_high(u8 data)
+ {
+ m_channel[Channel].m_base_count = (m_channel[Channel].m_base_count & 0x0000ffffU) | (u32(data) << 16);
+ m_channel[Channel].m_count = (m_channel[Channel].m_count & 0x0000ffffU) | (u32(data) << 16);
+ }
+ template <unsigned Channel> u32 get_stop() { return m_stop[Channel]; }
+ template <unsigned Channel> void set_stop(offs_t offset, u32 data, u32 mem_mask)
+ {
+ mem_mask &= 0x00fffffcU;
+ COMBINE_DATA(&m_stop[Channel]);
+ }
+
+protected:
+ virtual void device_start() override;
+
+private:
+ u32 m_stop[4];
+};
// device type definition
DECLARE_DEVICE_TYPE(AM9517A, am9517a_device)
DECLARE_DEVICE_TYPE(V5X_DMAU, v5x_dmau_device)
DECLARE_DEVICE_TYPE(PCXPORT_DMAC, pcxport_dmac_device)
+DECLARE_DEVICE_TYPE(EISA_DMA, eisa_dma_device)
#endif // MAME_MACHINE_AM9517_H
diff --git a/src/devices/machine/am9519.cpp b/src/devices/machine/am9519.cpp
index b1700b38492..be0b8c3da10 100644
--- a/src/devices/machine/am9519.cpp
+++ b/src/devices/machine/am9519.cpp
@@ -103,7 +103,7 @@ IRQ_CALLBACK_MEMBER(am9519_device::iack_cb)
}
-READ8_MEMBER( am9519_device::stat_r )
+u8 am9519_device::stat_r()
{
u8 stat = 0;
for(int n = 0, irq = m_prio; n < 8; n++, irq = (irq + 1) & 7)
@@ -121,7 +121,7 @@ READ8_MEMBER( am9519_device::stat_r )
return stat;
}
-READ8_MEMBER( am9519_device::data_r )
+u8 am9519_device::data_r()
{
switch((m_mode & 0x60) >> 5)
{
@@ -137,7 +137,7 @@ READ8_MEMBER( am9519_device::data_r )
return 0;
}
-WRITE8_MEMBER( am9519_device::cmd_w )
+void am9519_device::cmd_w(u8 data)
{
m_cmd = data;
switch(data >> 3)
@@ -222,7 +222,7 @@ WRITE8_MEMBER( am9519_device::cmd_w )
set_timer();
}
-WRITE8_MEMBER( am9519_device::data_w )
+void am9519_device::data_w(u8 data)
{
if((m_cmd & 0xf0) >= 0xb0)
{
diff --git a/src/devices/machine/am9519.h b/src/devices/machine/am9519.h
index ddd4925696b..315e0bd890d 100644
--- a/src/devices/machine/am9519.h
+++ b/src/devices/machine/am9519.h
@@ -36,10 +36,10 @@ public:
auto out_int_callback() { return m_out_int_func.bind(); }
- DECLARE_READ8_MEMBER( stat_r );
- DECLARE_READ8_MEMBER( data_r );
- DECLARE_WRITE8_MEMBER( cmd_w );
- DECLARE_WRITE8_MEMBER( data_w );
+ u8 stat_r();
+ u8 data_r();
+ void cmd_w(u8 data);
+ void data_w(u8 data);
u32 acknowledge();
DECLARE_WRITE_LINE_MEMBER( ireq0_w ) { set_irq_line(0, state); }
diff --git a/src/devices/machine/appldriv.h b/src/devices/machine/appldriv.h
index 1a396990167..6d23284f46a 100644
--- a/src/devices/machine/appldriv.h
+++ b/src/devices/machine/appldriv.h
@@ -63,33 +63,4 @@ private:
// device type definition
DECLARE_DEVICE_TYPE(FLOPPY_APPLE, apple525_floppy_image_device)
-#define MCFG_LEGACY_FLOPPY_APPLE_PARAMS(_dividend,_divisor) \
- downcast<apple525_floppy_image_device *>(device)->set_params(_dividend,_divisor);
-
-#define MCFG_LEGACY_FLOPPY_APPLE_2_DRIVES_ADD(_config,_dividend,_divisor) \
- MCFG_DEVICE_ADD(FLOPPY_0, FLOPPY_APPLE, 0) \
- MCFG_LEGACY_FLOPPY_CONFIG(_config) \
- MCFG_LEGACY_FLOPPY_APPLE_PARAMS(_dividend,_divisor) \
- MCFG_DEVICE_ADD(FLOPPY_1, FLOPPY_APPLE, 0) \
- MCFG_LEGACY_FLOPPY_CONFIG(_config) \
- MCFG_LEGACY_FLOPPY_APPLE_PARAMS(_dividend,_divisor)
-
-#define MCFG_LEGACY_FLOPPY_APPLE_4_DRIVES_ADD(_config,_dividend,_divisor) \
- MCFG_DEVICE_ADD(FLOPPY_0, FLOPPY_APPLE, 0) \
- MCFG_LEGACY_FLOPPY_CONFIG(_config) \
- MCFG_LEGACY_FLOPPY_APPLE_PARAMS(_dividend,_divisor) \
- MCFG_DEVICE_ADD(FLOPPY_1, FLOPPY_APPLE, 0) \
- MCFG_LEGACY_FLOPPY_CONFIG(_config) \
- MCFG_LEGACY_FLOPPY_APPLE_PARAMS(_dividend,_divisor) \
- MCFG_DEVICE_ADD(FLOPPY_2, FLOPPY_APPLE, 0) \
- MCFG_LEGACY_FLOPPY_CONFIG(_config) \
- MCFG_LEGACY_FLOPPY_APPLE_PARAMS(_dividend,_divisor) \
- MCFG_DEVICE_ADD(FLOPPY_3, FLOPPY_APPLE, 0) \
- MCFG_LEGACY_FLOPPY_CONFIG(_config) \
- MCFG_LEGACY_FLOPPY_APPLE_PARAMS(_dividend,_divisor)
-
-#define MCFG_LEGACY_FLOPPY_APPLE_2_DRIVES_REMOVE() \
- MCFG_DEVICE_REMOVE(FLOPPY_0) \
- MCFG_DEVICE_REMOVE(FLOPPY_1)
-
#endif // MAME_MACHINE_APPLDRIV_H
diff --git a/src/devices/machine/applefdc.h b/src/devices/machine/applefdc.h
index eede57199f7..87cc89f36dc 100644
--- a/src/devices/machine/applefdc.h
+++ b/src/devices/machine/applefdc.h
@@ -124,6 +124,12 @@ private:
class applefdc_device : public applefdc_base_device
{
public:
+ applefdc_device(const machine_config &mconfig, const char *tag, device_t *owner, const applefdc_interface *intrf)
+ : applefdc_device(mconfig, tag, owner, (uint32_t)0)
+ {
+ set_config(intrf);
+ }
+
applefdc_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
};
@@ -145,30 +151,4 @@ public:
iwm_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
};
-
-
-/***************************************************************************
- DEVICE CONFIGURATION MACROS
-***************************************************************************/
-
-#define MCFG_APPLEFDC_CONFIG(_intrf) \
- downcast<applefdc_base_device &>(*device).set_config(&(_intrf));
-
-#define MCFG_APPLEFDC_ADD(_tag, _intrf) \
- MCFG_DEVICE_ADD(_tag, APPLEFDC, 0) \
- MCFG_APPLEFDC_CONFIG(_intrf)
-
-#define MCFG_APPLEFDC_MODIFY(_tag, _intrf) \
- MCFG_DEVICE_MODIFY(_tag) \
- MCFG_APPLEFDC_CONFIG(_intrf)
-
-#define MCFG_IWM_ADD(_tag, _intrf) \
- MCFG_DEVICE_ADD(_tag, IWM, 0) \
- MCFG_APPLEFDC_CONFIG(_intrf)
-
-#define MCFG_IWM_MODIFY(_tag, _intrf) \
- MCFG_DEVICE_MODIFY(_tag) \
- MCFG_APPLEFDC_CONFIG(_intrf)
-
-
#endif // MAME_MACHINE_APPLEFDC_H
diff --git a/src/devices/machine/at29x.cpp b/src/devices/machine/at29x.cpp
index 482faf24221..3f31e44c0a8 100644
--- a/src/devices/machine/at29x.cpp
+++ b/src/devices/machine/at29x.cpp
@@ -195,7 +195,7 @@ void at29x_device::sync_flags()
/*
read a byte from FEEPROM
*/
-READ8_MEMBER( at29x_device::read )
+uint8_t at29x_device::read(offs_t offset)
{
int reply;
@@ -271,7 +271,7 @@ READ8_MEMBER( at29x_device::read )
/*
Write a byte to FEEPROM
*/
-WRITE8_MEMBER( at29x_device::write )
+void at29x_device::write(offs_t offset, uint8_t data)
{
offset &= m_address_mask;
LOGMASKED(LOG_WRITE, "%05x <- %02x\n", offset, data);
diff --git a/src/devices/machine/at29x.h b/src/devices/machine/at29x.h
index 435bcaafabc..265ef1587c2 100644
--- a/src/devices/machine/at29x.h
+++ b/src/devices/machine/at29x.h
@@ -20,8 +20,8 @@ DECLARE_DEVICE_TYPE(AT29C040A, at29c040a_device)
class at29x_device : public device_t, public device_nvram_interface
{
public:
- DECLARE_READ8_MEMBER( read );
- DECLARE_WRITE8_MEMBER( write );
+ uint8_t read(offs_t offset);
+ void write(offs_t offset, uint8_t data);
protected:
at29x_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock, int memory_size, int device_id, int sector_size);
diff --git a/src/devices/machine/at_keybc.cpp b/src/devices/machine/at_keybc.cpp
index aec9154a38f..5e6ac779569 100644
--- a/src/devices/machine/at_keybc.cpp
+++ b/src/devices/machine/at_keybc.cpp
@@ -74,6 +74,8 @@ ROM_START(at_kbc)
ROMX_LOAD("1503033.bin", 0x0000, 0x0800, CRC(5a81c0d2) SHA1(0100f8789fb4de74706ae7f9473a12ec2b9bd729), ROM_BIOS(0))
ROM_SYSTEM_BIOS(1, "ptl", "PTL 1986") // unknown controller BIOS, (c) 1985, 1986 PTL
ROMX_LOAD("yan25d05.bin", 0x0000, 0x0800, CRC(70c798f1) SHA1(ae9a79c7184a17331b70a50035ff63c757df094c), ROM_BIOS(1))
+ ROM_SYSTEM_BIOS(2, "award15", "Award 1985 V1.5") // MIPS Rx2030 i8742 keyboard controller
+ ROMX_LOAD("keyboard_1.5.bin", 0x0000, 0x0800, CRC(f86ba0f7) SHA1(1ad475451db35a76d929824c035d582279fbe3a3), ROM_BIOS(2))
ROM_END
ROM_START(ps2_kbc)
@@ -108,22 +110,22 @@ DEFINE_DEVICE_TYPE(PS2_KEYBOARD_CONTROLLER, ps2_keyboard_controller_device, "ps2
// KEYBOARD CONTROLLER DEVICE BASE
//**************************************************************************
-READ8_MEMBER(at_kbc_device_base::data_r)
+uint8_t at_kbc_device_base::data_r()
{
- return m_mcu->upi41_master_r(space, 0U);
+ return m_mcu->upi41_master_r(machine().dummy_space(), 0U);
}
-READ8_MEMBER(at_kbc_device_base::status_r)
+uint8_t at_kbc_device_base::status_r()
{
- return m_mcu->upi41_master_r(space, 1U);
+ return m_mcu->upi41_master_r(machine().dummy_space(), 1U);
}
-WRITE8_MEMBER(at_kbc_device_base::data_w)
+void at_kbc_device_base::data_w(uint8_t data)
{
machine().scheduler().synchronize(timer_expired_delegate(FUNC(at_kbc_device_base::write_data), this), unsigned(data));
}
-WRITE8_MEMBER(at_kbc_device_base::command_w)
+void at_kbc_device_base::command_w(uint8_t data)
{
machine().scheduler().synchronize(timer_expired_delegate(FUNC(at_kbc_device_base::write_command), this), unsigned(data));
}
@@ -263,7 +265,7 @@ ioport_constructor at_keyboard_controller_device::device_input_ports() const
return INPUT_PORTS_NAME(at_kbc);
}
-WRITE8_MEMBER(at_keyboard_controller_device::p2_w)
+void at_keyboard_controller_device::p2_w(uint8_t data)
{
set_hot_res(BIT(~data, 0));
set_gate_a20(BIT(data, 1));
@@ -277,11 +279,11 @@ WRITE8_MEMBER(at_keyboard_controller_device::p2_w)
// PS/2 KEYBOARD/MOUSE CONTROLLER DEVICE
//**************************************************************************
-READ8_MEMBER(ps2_keyboard_controller_device::data_r)
+uint8_t ps2_keyboard_controller_device::data_r()
{
set_kbd_irq(0U);
set_mouse_irq(0U);
- return m_mcu->upi41_master_r(space, 0U);
+ return m_mcu->upi41_master_r(machine().dummy_space(), 0U);
}
WRITE_LINE_MEMBER(ps2_keyboard_controller_device::mouse_clk_w)
@@ -383,12 +385,12 @@ TIMER_CALLBACK_MEMBER(ps2_keyboard_controller_device::set_mouse_data_in)
m_mouse_data_in = param ? 1U : 0U;
}
-READ8_MEMBER(ps2_keyboard_controller_device::p1_r)
+uint8_t ps2_keyboard_controller_device::p1_r()
{
return kbd_data_r() | (mouse_data_r() << 1) | 0xfcU;
}
-WRITE8_MEMBER(ps2_keyboard_controller_device::p2_w)
+void ps2_keyboard_controller_device::p2_w(uint8_t data)
{
set_hot_res(BIT(~data, 0));
set_gate_a20(BIT(data, 1));
diff --git a/src/devices/machine/at_keybc.h b/src/devices/machine/at_keybc.h
index 77bf039a7a1..5ff11aa6ba1 100644
--- a/src/devices/machine/at_keybc.h
+++ b/src/devices/machine/at_keybc.h
@@ -30,10 +30,10 @@ public:
auto kbd_data() { return m_kbd_data_cb.bind(); } // open collector with 10kΩ pull-up
// host interface
- virtual DECLARE_READ8_MEMBER(data_r);
- virtual DECLARE_READ8_MEMBER(status_r);
- DECLARE_WRITE8_MEMBER(data_w);
- DECLARE_WRITE8_MEMBER(command_w);
+ virtual uint8_t data_r();
+ virtual uint8_t status_r();
+ void data_w(uint8_t data);
+ void command_w(uint8_t data);
// inputs from keyboard
DECLARE_WRITE_LINE_MEMBER(kbd_clk_w);
@@ -93,7 +93,7 @@ protected:
private:
// MCU I/O handlers
- DECLARE_WRITE8_MEMBER(p2_w);
+ void p2_w(uint8_t data);
};
@@ -112,7 +112,7 @@ public:
auto mouse_data() { return m_mouse_data_cb.bind(); } // open collector with 10kΩ pull-up
// host interface
- virtual DECLARE_READ8_MEMBER(data_r) override;
+ virtual uint8_t data_r() override;
// inputs from mouse
DECLARE_WRITE_LINE_MEMBER(mouse_clk_w);
@@ -143,8 +143,8 @@ private:
TIMER_CALLBACK_MEMBER(set_mouse_data_in);
// MCU I/O handlers
- DECLARE_READ8_MEMBER(p1_r);
- DECLARE_WRITE8_MEMBER(p2_w);
+ uint8_t p1_r();
+ void p2_w(uint8_t data);
devcb_write_line m_mouse_irq_cb;
devcb_write_line m_mouse_clk_cb, m_mouse_data_cb;
diff --git a/src/devices/machine/atapicdr.cpp b/src/devices/machine/atapicdr.cpp
index c13b6ff001e..33cb0cb154e 100644
--- a/src/devices/machine/atapicdr.cpp
+++ b/src/devices/machine/atapicdr.cpp
@@ -30,11 +30,11 @@ atapi_fixed_cdrom_device::atapi_fixed_cdrom_device(const machine_config &mconfig
// device_add_mconfig - add device configuration
//-------------------------------------------------
-MACHINE_CONFIG_START(atapi_cdrom_device::device_add_mconfig)
- MCFG_CDROM_ADD("image")
- MCFG_CDROM_INTERFACE("cdrom")
- MCFG_DEVICE_ADD("cdda", CDDA)
-MACHINE_CONFIG_END
+void atapi_cdrom_device::device_add_mconfig(machine_config &config)
+{
+ CDROM(config, "image").set_interface("cdrom");
+ CDDA(config, "cdda");
+}
void atapi_cdrom_device::device_start()
{
diff --git a/src/devices/machine/ay31015.cpp b/src/devices/machine/ay31015.cpp
index b9cc6c74a9b..6ab1103b28a 100644
--- a/src/devices/machine/ay31015.cpp
+++ b/src/devices/machine/ay31015.cpp
@@ -116,14 +116,10 @@ ay31015_device::ay31015_device(const machine_config &mconfig, device_type type,
m_rx_bit_count(0),
m_rx_parity(0),
m_rx_pulses(0),
- m_rx_clock(0),
- m_rx_timer(nullptr),
m_tx_data(0),
m_tx_buffer(0),
m_tx_parity(0),
m_tx_pulses(0),
- m_tx_clock(0),
- m_tx_timer(nullptr),
m_read_si_cb(*this),
m_write_so_cb(*this),
m_write_pe_cb(*this),
@@ -173,14 +169,6 @@ void ay31015_device::device_resolve_objects()
void ay31015_device::device_start()
{
- m_rx_timer = timer_alloc(TIMER_RX);
- m_rx_timer->adjust(attotime::never);
- update_rx_timer();
-
- m_tx_timer = timer_alloc(TIMER_TX);
- m_tx_timer->adjust(attotime::never);
- update_tx_timer();
-
save_item(NAME(m_pins));
save_item(NAME(m_control_reg));
save_item(NAME(m_status_reg));
@@ -194,14 +182,12 @@ void ay31015_device::device_start()
save_item(NAME(m_rx_bit_count));
save_item(NAME(m_rx_parity));
save_item(NAME(m_rx_pulses));
- save_item(NAME(m_rx_clock));
save_item(NAME(m_tx_state));
save_item(NAME(m_tx_data));
save_item(NAME(m_tx_buffer));
save_item(NAME(m_tx_parity));
save_item(NAME(m_tx_pulses));
- save_item(NAME(m_tx_clock));
}
//-------------------------------------------------
@@ -270,14 +256,6 @@ void ay31015_device::update_status_pins()
update_status_pin(STATUS_EOC, EOC, m_write_eoc_cb);
}
-void ay31015_device::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr)
-{
- if (id == TIMER_RX)
- rx_process();
- else if(id == TIMER_TX)
- tx_process();
-}
-
/*************************************************** RECEIVE CONTROLS *************************************************/
@@ -732,54 +710,6 @@ int ay31015_device::get_output_pin( ay31015_device::output_pin pin )
}
-inline void ay31015_device::update_rx_timer()
-{
- if (m_rx_clock > 0.0)
- {
- m_rx_timer->adjust(attotime::from_hz(m_rx_clock), 0, attotime::from_hz(m_rx_clock));
- }
- else
- {
- m_rx_timer->enable(0);
- }
-}
-
-
-inline void ay31015_device::update_tx_timer()
-{
- if (m_tx_clock > 0.0)
- {
- m_tx_timer->adjust(attotime::from_hz(m_tx_clock), 0, attotime::from_hz(m_tx_clock));
- }
- else
- {
- m_tx_timer->enable(0);
- }
-}
-
-
-/*-------------------------------------------------
- ay31015_set_receiver_clock - set receive clock
--------------------------------------------------*/
-
-void ay31015_device::set_receiver_clock( double new_clock )
-{
- m_rx_clock = new_clock;
- update_rx_timer();
-}
-
-
-/*-------------------------------------------------
- ay31015_set_transmitter_clock - set transmit clock
--------------------------------------------------*/
-
-void ay31015_device::set_transmitter_clock( double new_clock )
-{
- m_tx_clock = new_clock;
- update_tx_timer();
-}
-
-
/*-------------------------------------------------
ay31015_get_received_data - return a byte to the computer
-------------------------------------------------*/
diff --git a/src/devices/machine/ay31015.h b/src/devices/machine/ay31015.h
index 497c6b6a9f9..42518cb9a85 100644
--- a/src/devices/machine/ay31015.h
+++ b/src/devices/machine/ay31015.h
@@ -20,10 +20,6 @@ class ay31015_device : public device_t
public:
ay31015_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock = 0);
- void set_tx_clock(double tx_clock) { m_tx_clock = tx_clock; }
- void set_tx_clock(const XTAL &xtal) { set_tx_clock(xtal.dvalue()); }
- void set_rx_clock(double rx_clock) { m_rx_clock = rx_clock; }
- void set_rx_clock(const XTAL &xtal) { set_rx_clock(xtal.dvalue()); }
void set_auto_rdav(bool auto_rdav) { m_auto_rdav = auto_rdav; }
auto read_si_callback() { return m_read_si_cb.bind(); }
@@ -58,12 +54,6 @@ public:
DECLARE_READ_LINE_MEMBER(eoc_r) { return get_output_pin(EOC); }
DECLARE_READ_LINE_MEMBER(so_r) { return get_output_pin(SO); }
- /* Set a new transmitter clock (new_clock is in Hz) */
- void set_transmitter_clock( double new_clock );
-
- /* Set a new receiver clock (new_clock is in Hz) */
- void set_receiver_clock( double new_clock );
-
/* Reead the received data */
/* The received data is available on RD8-RD1 (pins 5-12) */
uint8_t get_received_data();
@@ -114,16 +104,12 @@ protected:
PREP_TIME
};
- static constexpr device_timer_id TIMER_RX = 0;
- static constexpr device_timer_id TIMER_TX = 1;
-
ay31015_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock);
// device-level overrides
virtual void device_resolve_objects() override;
virtual void device_start() override;
virtual void device_reset() override;
- virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override;
void rx_process();
void tx_process();
@@ -137,8 +123,6 @@ protected:
void transfer_control_pins();
void set_input_pin(input_pin pin, int data);
int get_output_pin(output_pin pin);
- inline void update_rx_timer();
- inline void update_tx_timer();
int m_pins[41];
@@ -154,16 +138,12 @@ protected:
uint8_t m_rx_bit_count;
uint8_t m_rx_parity;
uint16_t m_rx_pulses; // total pulses left
- double m_rx_clock; /* RCP - pin 17 */
- emu_timer *m_rx_timer;
state_t m_tx_state;
uint8_t m_tx_data; // byte being sent
uint8_t m_tx_buffer; // next byte to send
uint8_t m_tx_parity;
uint16_t m_tx_pulses; // total pulses left
- double m_tx_clock; /* TCP - pin 40 */
- emu_timer *m_tx_timer;
devcb_read_line m_read_si_cb; // SI - pin 20 - This will be called whenever the SI pin is sampled. Optional
devcb_write_line m_write_so_cb; // SO - pin 25 - This will be called whenever data is put on the SO pin. Optional
diff --git a/src/devices/machine/bankdev.cpp b/src/devices/machine/bankdev.cpp
index 8c10286ccfa..e8e141ff7e6 100644
--- a/src/devices/machine/bankdev.cpp
+++ b/src/devices/machine/bankdev.cpp
@@ -6,7 +6,7 @@
// device type definition
DEFINE_DEVICE_TYPE(ADDRESS_MAP_BANK, address_map_bank_device, "address_map_bank", "Address Map Bank")
-address_map_bank_device::address_map_bank_device( const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock )
+address_map_bank_device::address_map_bank_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
: device_t(mconfig, ADDRESS_MAP_BANK, tag, owner, clock),
device_memory_interface(mconfig, *this),
m_endianness(ENDIANNESS_NATIVE),
@@ -46,42 +46,42 @@ void address_map_bank_device::amap64(address_map &map)
map(0x00000000, 0xffffffff).rw(FUNC(address_map_bank_device::read64), FUNC(address_map_bank_device::write64));
}
-WRITE8_MEMBER(address_map_bank_device::write8)
+void address_map_bank_device::write8(offs_t offset, u8 data)
{
m_program->write_byte(m_offset + offset, data);
}
-WRITE16_MEMBER(address_map_bank_device::write16)
+void address_map_bank_device::write16(offs_t offset, u16 data, u16 mem_mask)
{
m_program->write_word(m_offset + (offset << (m_shift+1)), data, mem_mask);
}
-WRITE32_MEMBER(address_map_bank_device::write32)
+void address_map_bank_device::write32(offs_t offset, u32 data, u32 mem_mask)
{
m_program->write_dword(m_offset + (offset << (m_shift+2)), data, mem_mask);
}
-WRITE64_MEMBER(address_map_bank_device::write64)
+void address_map_bank_device::write64(offs_t offset, u64 data, u64 mem_mask)
{
m_program->write_qword(m_offset + (offset << (m_shift+3)), data, mem_mask);
}
-READ8_MEMBER(address_map_bank_device::read8)
+u8 address_map_bank_device::read8(offs_t offset)
{
return m_program->read_byte(m_offset + offset);
}
-READ16_MEMBER(address_map_bank_device::read16)
+u16 address_map_bank_device::read16(offs_t offset, u16 mem_mask)
{
return m_program->read_word(m_offset + (offset << (m_shift+1)), mem_mask);
}
-READ32_MEMBER(address_map_bank_device::read32)
+u32 address_map_bank_device::read32(offs_t offset, u32 mem_mask)
{
return m_program->read_dword(m_offset + (offset << (m_shift+2)), mem_mask);
}
-READ64_MEMBER(address_map_bank_device::read64)
+u64 address_map_bank_device::read64(offs_t offset, u64 mem_mask)
{
return m_program->read_qword(m_offset + (offset << (m_shift+3)), mem_mask);
}
diff --git a/src/devices/machine/bankdev.h b/src/devices/machine/bankdev.h
index 39bcfdcf08a..05a3c2eb411 100644
--- a/src/devices/machine/bankdev.h
+++ b/src/devices/machine/bankdev.h
@@ -12,16 +12,16 @@ class address_map_bank_device :
{
public:
// construction/destruction
- address_map_bank_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock = 0);
+ address_map_bank_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock = 0);
// configuration helpers
template <typename... T> address_map_bank_device& set_map(T &&... args) { set_addrmap(0, std::forward<T>(args)...); return *this; }
address_map_bank_device& set_endianness(endianness_t endianness) { m_endianness = endianness; return *this; }
- address_map_bank_device& set_data_width(uint8_t data_width) { m_data_width = data_width; return *this; }
- address_map_bank_device& set_addr_width(uint8_t addr_width) { m_addr_width = addr_width; return *this; }
- address_map_bank_device& set_stride(uint32_t stride) { m_stride = stride; return *this; }
- address_map_bank_device& set_shift(uint32_t shift) { m_shift = shift; return *this; }
- address_map_bank_device& set_options(endianness_t endianness, uint8_t data_width, uint8_t addr_width, uint32_t stride = 1)
+ address_map_bank_device& set_data_width(u8 data_width) { m_data_width = data_width; return *this; }
+ address_map_bank_device& set_addr_width(u8 addr_width) { m_addr_width = addr_width; return *this; }
+ address_map_bank_device& set_stride(u32 stride) { m_stride = stride; return *this; }
+ address_map_bank_device& set_shift(u32 shift) { m_shift = shift; return *this; }
+ address_map_bank_device& set_options(endianness_t endianness, u8 data_width, u8 addr_width, u32 stride = 1)
{
set_endianness(endianness);
set_data_width(data_width);
@@ -32,25 +32,25 @@ public:
template <typename... T> address_map_bank_device& map(T &&... args) { set_addrmap(0, std::forward<T>(args)...); return *this; }
address_map_bank_device& endianness(endianness_t endianness) { m_endianness = endianness; return *this; }
- address_map_bank_device& data_width(uint8_t data_width) { m_data_width = data_width; return *this; }
- address_map_bank_device& addr_width(uint8_t addr_width) { m_addr_width = addr_width; return *this; }
- address_map_bank_device& stride(uint32_t stride) { m_stride = stride; return *this; }
- address_map_bank_device& shift(uint32_t shift) { m_shift = shift; return *this; }
+ address_map_bank_device& data_width(u8 data_width) { m_data_width = data_width; return *this; }
+ address_map_bank_device& addr_width(u8 addr_width) { m_addr_width = addr_width; return *this; }
+ address_map_bank_device& stride(u32 stride) { m_stride = stride; return *this; }
+ address_map_bank_device& shift(u32 shift) { m_shift = shift; return *this; }
void amap8(address_map &map);
void amap16(address_map &map);
void amap32(address_map &map);
void amap64(address_map &map);
- DECLARE_WRITE8_MEMBER(write8);
- DECLARE_WRITE16_MEMBER(write16);
- DECLARE_WRITE32_MEMBER(write32);
- DECLARE_WRITE64_MEMBER(write64);
+ void write8(offs_t offset, u8 data);
+ void write16(offs_t offset, u16 data, u16 mem_mask = 0xffff);
+ void write32(offs_t offset, u32 data, u32 mem_mask = 0xffffffff);
+ void write64(offs_t offset, u64 data, u64 mem_mask = ~u64(0));
- DECLARE_READ8_MEMBER(read8);
- DECLARE_READ16_MEMBER(read16);
- DECLARE_READ32_MEMBER(read32);
- DECLARE_READ64_MEMBER(read64);
+ u8 read8(offs_t offset);
+ u16 read16(offs_t offset, u16 mem_mask = 0xffff);
+ u32 read32(offs_t offset, u32 mem_mask = 0xffffffff);
+ u64 read64(offs_t offset, u64 mem_mask = ~u64(0));
void set_bank(offs_t offset);
@@ -64,9 +64,9 @@ protected:
private:
// internal state
endianness_t m_endianness;
- uint8_t m_data_width;
- uint8_t m_addr_width;
- uint32_t m_stride;
+ u8 m_data_width;
+ u8 m_addr_width;
+ u32 m_stride;
address_space_config m_program_config;
address_space *m_program;
offs_t m_offset;
diff --git a/src/devices/machine/clock.h b/src/devices/machine/clock.h
index 32989a15149..4bf0bed47a0 100644
--- a/src/devices/machine/clock.h
+++ b/src/devices/machine/clock.h
@@ -6,17 +6,11 @@
#pragma once
-#define MCFG_CLOCK_ADD(_tag, _clock) \
- MCFG_DEVICE_ADD(_tag, CLOCK, _clock)
-
-#define MCFG_CLOCK_SIGNAL_HANDLER(_devcb) \
- downcast<clock_device &>(*device).set_signal_handler(DEVCB_##_devcb);
-
class clock_device : public device_t
{
public:
- template <class Object> devcb_base &set_signal_handler(Object &&cb) { return m_signal_handler.set_callback(std::forward<Object>(cb)); }
auto signal_handler() { return m_signal_handler.bind(); }
+ DECLARE_READ_LINE_MEMBER(signal_r) { return m_signal; }
clock_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
diff --git a/src/devices/machine/com8116.cpp b/src/devices/machine/com8116.cpp
index 0a3da24042e..06ebfb2f5b0 100644
--- a/src/devices/machine/com8116.cpp
+++ b/src/devices/machine/com8116.cpp
@@ -25,6 +25,7 @@ DEFINE_DEVICE_TYPE(COM8116, com8116_device, "com8116", "COM8116 Dual BRG")
DEFINE_DEVICE_TYPE(COM8116_003, com8116_003_device, "com8116_003", "COM8116-003 Dual BRG")
DEFINE_DEVICE_TYPE(COM5016_5, com5016_5_device, "com5016_5", "COM5016-5 Dual BRG")
DEFINE_DEVICE_TYPE(COM5016_013, com5016_013_device, "com5016_013", "COM5016-013 Dual BRG")
+DEFINE_DEVICE_TYPE(COM8116_020, com8116_020_device, "com8116_020", "COM8116-020 Dual BRG")
// Parts with T after the number do not have an internal oscillator and require an external clock source
// The SMC/COM 5xxx parts are all dual 5v/12v parts, while the 8xxx parts are 5v only
@@ -40,7 +41,6 @@ const int com8116_device::divisors_16X_5_0688MHz[16] =
// SMC/COM8116-003 and WD WD-1943-03
// from http://www.vintagecomputer.net/fjkraan/comp/divcomp/doc/SMC_BaudGen.pdf page 283 (pdf page 20)
// baud rates are 50, 75, 110, 134.5, 150, 200, 300, 600, 1200, 1800, 2000, 2400, 3600, 4800, 9600, 19200
-// SMC/COM8116T-020 should have similar output rates, but clock is unknown and probably different
const int com8116_device::divisors_16X_6_01835MHz[16] =
{ 7523, 5015, 3420, 2797, 2508, 1881, 1254, 627, 313, 209, 188, 157, 104, 78, 39, 20 };
@@ -63,6 +63,12 @@ const int com8116_device::divisors_32X_5_0688MHz[16] =
const int com8116_device::divisors_16X_2_7648MHz[16] =
{ 3456, 2304, 1571, 1285, 1152, 864, 576, 288, 144, 96, 86, 72, 48, 36, 18, 9 };
+// SMC/COM8116T-020 (corrected from http://bitsavers.org/pdf/visualTechnology/Visual_100/MM-100-001-0A_Visual_100_and_Visual_400_Video_Display_Terminal_Maintenance_Manual_Sep1980.pdf (pdf page 99))
+// (75, 134.5 and 2000 baud divisors given as 1,807, 856 and 57, which do not match stated actual frequencies)
+// baud rates are 50, 75, 110, 134.5, 150, 200, 300, 600, 1200, 1800, 2000, 2400, 3600, 4800, 9600, 19200
+const int com8116_device::divisors_16X_1_8432MHz[16] =
+ { 2304, 1536, 1047, 857, 768, 576, 384, 192, 96, 64, 58, 48, 32, 24, 12, 6 };
+
// SMC/COM5026(T)-030 (non-standard serial rates, from http://bitsavers.informatik.uni-stuttgart.de/pdf/standardMicrosystems/_dataBooks/1979_StandardMicrosystems.pdf page 135)
const int com8116_device::divisors_16X_5_0688MHz_030[16] =
{ 731, 733, 735, 737, 741, 743, 745, 751, 6970, 5569, 5433, 4752, 4269, 1920, 1584, 301 };
@@ -120,6 +126,11 @@ com5016_013_device::com5016_013_device(const machine_config &mconfig, const char
{
}
+com8116_020_device::com8116_020_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) :
+ com8116_device(mconfig, COM8116_020, tag, owner, clock, divisors_16X_1_8432MHz)
+{
+}
+
//-------------------------------------------------
// device_start - device-specific startup
@@ -193,7 +204,7 @@ void com8116_device::device_timer(emu_timer &timer, device_timer_id id, int para
// str_w -
//-------------------------------------------------
-void com8116_device::write_str(uint8_t data)
+void com8116_device::str_w(uint8_t data)
{
int fr_divider = data & 0x0f;
int fr_clock = clock() / m_divisors[fr_divider];
@@ -208,7 +219,7 @@ void com8116_device::write_str(uint8_t data)
// stt_w -
//-------------------------------------------------
-void com8116_device::write_stt(uint8_t data)
+void com8116_device::stt_w(uint8_t data)
{
int ft_divider = data & 0x0f;
int ft_clock = clock() / m_divisors[ft_divider];
@@ -223,10 +234,10 @@ void com8116_device::write_stt(uint8_t data)
// str_stt_w -
//-------------------------------------------------
-WRITE8_MEMBER(com8116_device::str_stt_w)
+void com8116_device::str_stt_w(uint8_t data)
{
- write_str(data >> 4);
- write_stt(data & 0x0f);
+ str_w(data >> 4);
+ stt_w(data & 0x0f);
}
@@ -234,8 +245,8 @@ WRITE8_MEMBER(com8116_device::str_stt_w)
// stt_str_w -
//-------------------------------------------------
-WRITE8_MEMBER(com8116_device::stt_str_w)
+void com8116_device::stt_str_w(uint8_t data)
{
- write_stt(data >> 4);
- write_str(data & 0x0f);
+ stt_w(data >> 4);
+ str_w(data & 0x0f);
}
diff --git a/src/devices/machine/com8116.h b/src/devices/machine/com8116.h
index 50c8849e2ee..d073ceac91f 100644
--- a/src/devices/machine/com8116.h
+++ b/src/devices/machine/com8116.h
@@ -43,12 +43,10 @@ public:
auto fr_handler() { return m_fr_handler.bind(); }
auto ft_handler() { return m_ft_handler.bind(); }
- void write_str(uint8_t data);
- void write_stt(uint8_t data);
- DECLARE_WRITE8_MEMBER(str_w) { write_str(data); }
- DECLARE_WRITE8_MEMBER(stt_w) { write_stt(data); }
- DECLARE_WRITE8_MEMBER(str_stt_w);
- DECLARE_WRITE8_MEMBER(stt_str_w);
+ void str_w(uint8_t data);
+ void stt_w(uint8_t data);
+ void str_stt_w(uint8_t data);
+ void stt_str_w(uint8_t data);
protected:
com8116_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock, const int *divisors);
@@ -58,6 +56,7 @@ protected:
static const int divisors_16X_4_9152MHz[16];
static const int divisors_32X_5_0688MHz[16];
static const int divisors_16X_2_7648MHz[16];
+ static const int divisors_16X_1_8432MHz[16];
static const int divisors_16X_5_0688MHz_030[16];
static const int divisors_16X_4_6080MHz[16];
static const int divisors_16X_4_9152MHz_SY2661_1[16];
@@ -123,10 +122,21 @@ public:
};
+// ======================> com8116_020_device
+
+class com8116_020_device : public com8116_device
+{
+public:
+ // construction/destruction
+ com8116_020_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+};
+
+
// device type definition
DECLARE_DEVICE_TYPE(COM8116, com8116_device)
DECLARE_DEVICE_TYPE(COM8116_003, com8116_003_device)
DECLARE_DEVICE_TYPE(COM5016_5, com5016_5_device)
DECLARE_DEVICE_TYPE(COM5016_013, com5016_013_device)
+DECLARE_DEVICE_TYPE(COM8116_020, com8116_020_device)
#endif // MAME_MACHINE_COM8116_H
diff --git a/src/devices/machine/cr511b.cpp b/src/devices/machine/cr511b.cpp
index 066f08575ac..6a4309f12c9 100644
--- a/src/devices/machine/cr511b.cpp
+++ b/src/devices/machine/cr511b.cpp
@@ -23,13 +23,13 @@ DEFINE_DEVICE_TYPE(CR511B, cr511b_device, "cr511b", "CR-511-B CD-ROM drive")
// device_add_mconfig - add device configuration
//-------------------------------------------------
-MACHINE_CONFIG_START(cr511b_device::device_add_mconfig)
- MCFG_CDROM_ADD("cdrom")
- MCFG_CDROM_INTERFACE("cdrom")
- MCFG_DEVICE_ADD("cdda", CDDA)
- MCFG_SOUND_ROUTE(0, ":lspeaker", 1.0)
- MCFG_SOUND_ROUTE(1, ":rspeaker", 1.0)
-MACHINE_CONFIG_END
+void cr511b_device::device_add_mconfig(machine_config &config)
+{
+ CDROM(config, m_cdrom).set_interface("cdrom");
+ CDDA(config, m_cdda);
+ m_cdda->add_route(0, ":lspeaker", 1.0);
+ m_cdda->add_route(1, ":rspeaker", 1.0);
+}
//**************************************************************************
diff --git a/src/devices/machine/cs4031.cpp b/src/devices/machine/cs4031.cpp
index fb1ac37b698..13ec9b90a6d 100644
--- a/src/devices/machine/cs4031.cpp
+++ b/src/devices/machine/cs4031.cpp
@@ -263,19 +263,19 @@ void cs4031_device::device_start()
m_space->install_rom(0xffff0000, 0xffffffff, m_bios + 0xf0000);
// install i/o accesses
- m_space_io->install_readwrite_handler(0x0000, 0x000f, read8_delegate(FUNC(am9517a_device::read), &(*m_dma1)), write8_delegate(FUNC(am9517a_device::write), &(*m_dma1)), 0xffffffff);
+ m_space_io->install_readwrite_handler(0x0000, 0x000f, read8sm_delegate(FUNC(am9517a_device::read), &(*m_dma1)), write8sm_delegate(FUNC(am9517a_device::write), &(*m_dma1)), 0xffffffff);
m_space_io->install_readwrite_handler(0x0020, 0x0023, read8sm_delegate(FUNC(pic8259_device::read), &(*m_intc1)), write8sm_delegate(FUNC(pic8259_device::write), &(*m_intc1)), 0x0000ffff);
- m_space_io->install_write_handler(0x0020, 0x0023, write8_delegate(FUNC(cs4031_device::config_address_w), this), 0x00ff0000);
- m_space_io->install_readwrite_handler(0x0020, 0x0023, read8_delegate(FUNC(cs4031_device::config_data_r), this), write8_delegate(FUNC(cs4031_device::config_data_w), this), 0xff000000);
+ m_space_io->install_write_handler(0x0020, 0x0023, write8smo_delegate(FUNC(cs4031_device::config_address_w), this), 0x00ff0000);
+ m_space_io->install_readwrite_handler(0x0020, 0x0023, read8smo_delegate(FUNC(cs4031_device::config_data_r), this), write8smo_delegate(FUNC(cs4031_device::config_data_w), this), 0xff000000);
m_space_io->install_readwrite_handler(0x0040, 0x0043, read8sm_delegate(FUNC(pit8254_device::read), &(*m_ctc)), write8sm_delegate(FUNC(pit8254_device::write), &(*m_ctc)), 0xffffffff);
- m_space_io->install_readwrite_handler(0x0060, 0x0063, read8_delegate(FUNC(cs4031_device::keyb_data_r), this), write8_delegate(FUNC(cs4031_device::keyb_data_w), this), 0x000000ff);
- m_space_io->install_readwrite_handler(0x0060, 0x0063, read8_delegate(FUNC(cs4031_device::portb_r), this), write8_delegate(FUNC(cs4031_device::portb_w), this), 0x0000ff00);
- m_space_io->install_readwrite_handler(0x0064, 0x0067, read8_delegate(FUNC(cs4031_device::keyb_status_r), this), write8_delegate(FUNC(cs4031_device::keyb_command_w), this), 0x000000ff);
- m_space_io->install_readwrite_handler(0x0070, 0x0073, read8_delegate(FUNC(mc146818_device::read), &(*m_rtc)), write8_delegate(FUNC(cs4031_device::rtc_w), this), 0x0000ffff);
- m_space_io->install_readwrite_handler(0x0080, 0x008f, read8_delegate(FUNC(cs4031_device::dma_page_r), this), write8_delegate(FUNC(cs4031_device::dma_page_w), this), 0xffffffff);
- m_space_io->install_readwrite_handler(0x0090, 0x0093, read8_delegate(FUNC(cs4031_device::sysctrl_r), this), write8_delegate(FUNC(cs4031_device::sysctrl_w), this), 0x00ff0000);
+ m_space_io->install_readwrite_handler(0x0060, 0x0063, read8smo_delegate(FUNC(cs4031_device::keyb_data_r), this), write8smo_delegate(FUNC(cs4031_device::keyb_data_w), this), 0x000000ff);
+ m_space_io->install_readwrite_handler(0x0060, 0x0063, read8smo_delegate(FUNC(cs4031_device::portb_r), this), write8smo_delegate(FUNC(cs4031_device::portb_w), this), 0x0000ff00);
+ m_space_io->install_readwrite_handler(0x0064, 0x0067, read8smo_delegate(FUNC(cs4031_device::keyb_status_r), this), write8smo_delegate(FUNC(cs4031_device::keyb_command_w), this), 0x000000ff);
+ m_space_io->install_readwrite_handler(0x0070, 0x0073, read8sm_delegate(FUNC(mc146818_device::read), &(*m_rtc)), write8sm_delegate(FUNC(cs4031_device::rtc_w), this), 0x0000ffff);
+ m_space_io->install_readwrite_handler(0x0080, 0x008f, read8sm_delegate(FUNC(cs4031_device::dma_page_r), this), write8sm_delegate(FUNC(cs4031_device::dma_page_w), this), 0xffffffff);
+ m_space_io->install_readwrite_handler(0x0090, 0x0093, read8smo_delegate(FUNC(cs4031_device::sysctrl_r), this), write8smo_delegate(FUNC(cs4031_device::sysctrl_w), this), 0x00ff0000);
m_space_io->install_readwrite_handler(0x00a0, 0x00a3, read8sm_delegate(FUNC(pic8259_device::read), &(*m_intc2)), write8sm_delegate(FUNC(pic8259_device::write), &(*m_intc2)), 0x0000ffff);
- m_space_io->install_readwrite_handler(0x00c0, 0x00df, read8_delegate(FUNC(cs4031_device::dma2_r),this), write8_delegate(FUNC(cs4031_device::dma2_w),this), 0xffffffff);
+ m_space_io->install_readwrite_handler(0x00c0, 0x00df, read8sm_delegate(FUNC(cs4031_device::dma2_r),this), write8sm_delegate(FUNC(cs4031_device::dma2_w),this), 0xffffffff);
}
//-------------------------------------------------
@@ -328,7 +328,7 @@ offs_t cs4031_device::page_offset()
return 0xff0000;
}
-READ8_MEMBER( cs4031_device::dma_read_byte )
+uint8_t cs4031_device::dma_read_byte(offs_t offset)
{
if (m_dma_channel == -1)
return 0xff;
@@ -336,7 +336,7 @@ READ8_MEMBER( cs4031_device::dma_read_byte )
return m_space->read_byte(page_offset() + offset);
}
-WRITE8_MEMBER( cs4031_device::dma_write_byte )
+void cs4031_device::dma_write_byte(offs_t offset, uint8_t data)
{
if (m_dma_channel == -1)
return;
@@ -344,7 +344,7 @@ WRITE8_MEMBER( cs4031_device::dma_write_byte )
m_space->write_byte(page_offset() + offset, data);
}
-READ8_MEMBER( cs4031_device::dma_read_word )
+uint8_t cs4031_device::dma_read_word(offs_t offset)
{
if (m_dma_channel == -1)
return 0xff;
@@ -355,7 +355,7 @@ READ8_MEMBER( cs4031_device::dma_read_word )
return result;
}
-WRITE8_MEMBER( cs4031_device::dma_write_word )
+void cs4031_device::dma_write_word(offs_t offset, uint8_t data)
{
if (m_dma_channel == -1)
return;
@@ -377,6 +377,8 @@ WRITE_LINE_MEMBER( cs4031_device::dma1_eop_w )
void cs4031_device::set_dma_channel(int channel, bool state)
{
+ //m_write_dack(channel, state);
+
if (!state)
{
m_dma_channel = channel;
@@ -429,7 +431,7 @@ void cs4031_device::trigger_nmi()
}
}
-READ8_MEMBER( cs4031_device::intc1_slave_ack_r )
+uint8_t cs4031_device::intc1_slave_ack_r(offs_t offset)
{
if (offset == 2) // IRQ 2
return m_intc2->acknowledge();
@@ -476,13 +478,13 @@ WRITE_LINE_MEMBER( cs4031_device::ctc_out2_w )
// CHIPSET CONFIGURATION
//**************************************************************************
-WRITE8_MEMBER( cs4031_device::config_address_w )
+void cs4031_device::config_address_w(uint8_t data)
{
m_address = data;
m_address_valid = (m_address < 0x20) ? true : false;
}
-READ8_MEMBER( cs4031_device::config_data_r )
+uint8_t cs4031_device::config_data_r()
{
uint8_t result = 0xff;
@@ -499,7 +501,7 @@ READ8_MEMBER( cs4031_device::config_data_r )
return result;
}
-WRITE8_MEMBER( cs4031_device::config_data_w )
+void cs4031_device::config_data_w(uint8_t data)
{
if (m_address_valid)
{
@@ -692,21 +694,21 @@ void cs4031_device::keyboard_gatea20(int state)
update_a20m();
}
-READ8_MEMBER( cs4031_device::keyb_status_r )
+uint8_t cs4031_device::keyb_status_r()
{
LOGKEYBOARD("cs4031_device::keyb_status_r\n");
- return m_keybc->status_r(space, 0);
+ return m_keybc->status_r();
}
-WRITE8_MEMBER( cs4031_device::keyb_command_blocked_w )
+void cs4031_device::keyb_command_blocked_w(uint8_t data)
{
// command is optionally blocked
if (!BIT(m_registers[SOFT_RESET_AND_GATEA20], 7))
- m_keybc->command_w(space, 0, data);
+ m_keybc->command_w(data);
}
-WRITE8_MEMBER( cs4031_device::keyb_command_w )
+void cs4031_device::keyb_command_w(uint8_t data)
{
LOGKEYBOARD("cs4031_device::keyb_command_w: %02x\n", data);
@@ -720,12 +722,12 @@ WRITE8_MEMBER( cs4031_device::keyb_command_w )
emulated_gatea20(1);
// self-test is never blocked
- m_keybc->command_w(space, 0, data);
+ m_keybc->command_w(data);
break;
case 0xd1:
m_keybc_d1_written = true;
- keyb_command_blocked_w(space, 0, data);
+ keyb_command_blocked_w(data);
break;
case 0xf0:
@@ -754,7 +756,7 @@ WRITE8_MEMBER( cs4031_device::keyb_command_w )
emulated_gatea20(1);
}
- keyb_command_blocked_w(space, 0, data);
+ keyb_command_blocked_w(data);
break;
@@ -763,28 +765,28 @@ WRITE8_MEMBER( cs4031_device::keyb_command_w )
if (m_keybc_data_blocked)
{
m_keybc_data_blocked = false;
- keyb_command_blocked_w(space, 0, data);
+ keyb_command_blocked_w(data);
}
else
- m_keybc->command_w(space, 0, data);
+ m_keybc->command_w(data);
break;
// everything else goes directly to the keyboard controller
default:
- m_keybc->command_w(space, 0, data);
+ m_keybc->command_w(data);
break;
}
}
-READ8_MEMBER( cs4031_device::keyb_data_r )
+uint8_t cs4031_device::keyb_data_r()
{
LOGKEYBOARD("cs4031_device::keyb_data_r\n");
- return m_keybc->data_r(space, 0);
+ return m_keybc->data_r();
}
-WRITE8_MEMBER( cs4031_device::keyb_data_w )
+void cs4031_device::keyb_data_w(uint8_t data)
{
LOGKEYBOARD("cs4031_device::keyb_data_w: %02x\n", data);
@@ -798,7 +800,7 @@ WRITE8_MEMBER( cs4031_device::keyb_data_w )
else
{
m_keybc_data_blocked = false;
- m_keybc->data_w(space, 0, data);
+ m_keybc->data_w(data);
}
}
@@ -837,7 +839,7 @@ WRITE_LINE_MEMBER( cs4031_device::kbrst_w )
1 - Fast Gate A20
*/
-WRITE8_MEMBER( cs4031_device::sysctrl_w )
+void cs4031_device::sysctrl_w(uint8_t data)
{
LOGIO("cs4031_device::sysctrl_w: %u\n", data);
@@ -853,7 +855,7 @@ WRITE8_MEMBER( cs4031_device::sysctrl_w )
m_cpureset = BIT(data, 0);
}
-READ8_MEMBER( cs4031_device::sysctrl_r )
+uint8_t cs4031_device::sysctrl_r()
{
uint8_t result = 0; // reserved bits read as 0?
@@ -883,7 +885,7 @@ READ8_MEMBER( cs4031_device::sysctrl_r )
7 - Parity check latch (r) [not emulated]
*/
-READ8_MEMBER( cs4031_device::portb_r )
+uint8_t cs4031_device::portb_r()
{
if (0)
logerror("cs4031_device::portb_r: %02x\n", m_portb);
@@ -891,7 +893,7 @@ READ8_MEMBER( cs4031_device::portb_r )
return m_portb;
}
-WRITE8_MEMBER( cs4031_device::portb_w )
+void cs4031_device::portb_w(uint8_t data)
{
if (0)
logerror("cs4031_device::portb_w: %02x\n", data);
@@ -917,7 +919,7 @@ WRITE8_MEMBER( cs4031_device::portb_w )
7 - NMI mask
6:0 - RTC address
*/
-WRITE8_MEMBER( cs4031_device::rtc_w )
+void cs4031_device::rtc_w(offs_t offset, uint8_t data)
{
if (0)
logerror("cs4031_device::rtc_w: %02x\n", data);
@@ -928,5 +930,5 @@ WRITE8_MEMBER( cs4031_device::rtc_w )
data &= 0x7f;
}
- m_rtc->write(space, offset, data);
+ m_rtc->write(offset, data);
}
diff --git a/src/devices/machine/cs4031.h b/src/devices/machine/cs4031.h
index e8b6e314f93..3e554e91904 100644
--- a/src/devices/machine/cs4031.h
+++ b/src/devices/machine/cs4031.h
@@ -59,23 +59,23 @@ public:
auto spkr() { return m_write_spkr.bind(); }
// internal io
- DECLARE_WRITE8_MEMBER( config_address_w );
- DECLARE_READ8_MEMBER( config_data_r );
- DECLARE_WRITE8_MEMBER( config_data_w );
- DECLARE_READ8_MEMBER( portb_r );
- DECLARE_WRITE8_MEMBER( portb_w );
- DECLARE_WRITE8_MEMBER( rtc_w );
- DECLARE_WRITE8_MEMBER( sysctrl_w );
- DECLARE_READ8_MEMBER( sysctrl_r );
- DECLARE_READ8_MEMBER( dma_page_r ) { return m_dma_page[offset]; }
- DECLARE_WRITE8_MEMBER( dma_page_w ) { m_dma_page[offset] = data; }
- DECLARE_READ8_MEMBER( dma2_r ) { return m_dma2->read(space, offset / 2); }
- DECLARE_WRITE8_MEMBER( dma2_w ) { m_dma2->write(space, offset / 2, data); }
- DECLARE_READ8_MEMBER( keyb_data_r );
- DECLARE_WRITE8_MEMBER( keyb_data_w );
- DECLARE_READ8_MEMBER( keyb_status_r );
- DECLARE_WRITE8_MEMBER( keyb_command_w );
- DECLARE_WRITE8_MEMBER( keyb_command_blocked_w );
+ void config_address_w(uint8_t data);
+ uint8_t config_data_r();
+ void config_data_w(uint8_t data);
+ uint8_t portb_r();
+ void portb_w(uint8_t data);
+ void rtc_w(offs_t offset, uint8_t data);
+ void sysctrl_w(uint8_t data);
+ uint8_t sysctrl_r();
+ uint8_t dma_page_r(offs_t offset) { return m_dma_page[offset]; }
+ void dma_page_w(offs_t offset, uint8_t data) { m_dma_page[offset] = data; }
+ uint8_t dma2_r(offs_t offset) { return m_dma2->read(offset / 2); }
+ void dma2_w(offs_t offset, uint8_t data) { m_dma2->write(offset / 2, data); }
+ uint8_t keyb_data_r();
+ void keyb_data_w(uint8_t data);
+ uint8_t keyb_status_r();
+ void keyb_command_w(uint8_t data);
+ void keyb_command_blocked_w(uint8_t data);
// input lines
DECLARE_WRITE_LINE_MEMBER( irq01_w ) { m_intc1->ir1_w(state); }
@@ -205,25 +205,25 @@ private:
uint8_t m_registers[0x20];
- DECLARE_READ8_MEMBER( dma_read_byte );
- DECLARE_WRITE8_MEMBER( dma_write_byte );
- DECLARE_READ8_MEMBER( dma_read_word );
- DECLARE_WRITE8_MEMBER( dma_write_word );
+ uint8_t dma_read_byte(offs_t offset);
+ void dma_write_byte(offs_t offset, uint8_t data);
+ uint8_t dma_read_word(offs_t offset);
+ void dma_write_word(offs_t offset, uint8_t data);
DECLARE_WRITE_LINE_MEMBER( dma1_eop_w );
- DECLARE_READ8_MEMBER( dma1_ior0_r ) { return m_read_ior(0); }
- DECLARE_READ8_MEMBER( dma1_ior1_r ) { return m_read_ior(1); }
- DECLARE_READ8_MEMBER( dma1_ior2_r ) { return m_read_ior(2); }
- DECLARE_READ8_MEMBER( dma1_ior3_r ) { return m_read_ior(3); }
- DECLARE_READ8_MEMBER( dma2_ior1_r ) { uint16_t const result = m_read_ior(5); m_dma_high_byte = result >> 8; return result; }
- DECLARE_READ8_MEMBER( dma2_ior2_r ) { uint16_t const result = m_read_ior(6); m_dma_high_byte = result >> 8; return result; }
- DECLARE_READ8_MEMBER( dma2_ior3_r ) { uint16_t const result = m_read_ior(7); m_dma_high_byte = result >> 8; return result; }
- DECLARE_WRITE8_MEMBER( dma1_iow0_w ) { m_write_iow(0, data, 0xffff); }
- DECLARE_WRITE8_MEMBER( dma1_iow1_w ) { m_write_iow(1, data, 0xffff); }
- DECLARE_WRITE8_MEMBER( dma1_iow2_w ) { m_write_iow(2, data, 0xffff); }
- DECLARE_WRITE8_MEMBER( dma1_iow3_w ) { m_write_iow(3, data, 0xffff); }
- DECLARE_WRITE8_MEMBER( dma2_iow1_w ) { m_write_iow(5, (m_dma_high_byte << 8) | data, 0xffff); }
- DECLARE_WRITE8_MEMBER( dma2_iow2_w ) { m_write_iow(6, (m_dma_high_byte << 8) | data, 0xffff); }
- DECLARE_WRITE8_MEMBER( dma2_iow3_w ) { m_write_iow(7, (m_dma_high_byte << 8) | data, 0xffff); }
+ uint8_t dma1_ior0_r() { return m_read_ior(0); }
+ uint8_t dma1_ior1_r() { return m_read_ior(1); }
+ uint8_t dma1_ior2_r() { return m_read_ior(2); }
+ uint8_t dma1_ior3_r() { return m_read_ior(3); }
+ uint8_t dma2_ior1_r() { uint16_t const result = m_read_ior(5); m_dma_high_byte = result >> 8; return result; }
+ uint8_t dma2_ior2_r() { uint16_t const result = m_read_ior(6); m_dma_high_byte = result >> 8; return result; }
+ uint8_t dma2_ior3_r() { uint16_t const result = m_read_ior(7); m_dma_high_byte = result >> 8; return result; }
+ void dma1_iow0_w(uint8_t data) { m_write_iow(0, data, 0xffff); }
+ void dma1_iow1_w(uint8_t data) { m_write_iow(1, data, 0xffff); }
+ void dma1_iow2_w(uint8_t data) { m_write_iow(2, data, 0xffff); }
+ void dma1_iow3_w(uint8_t data) { m_write_iow(3, data, 0xffff); }
+ void dma2_iow1_w(uint8_t data) { m_write_iow(5, (m_dma_high_byte << 8) | data, 0xffff); }
+ void dma2_iow2_w(uint8_t data) { m_write_iow(6, (m_dma_high_byte << 8) | data, 0xffff); }
+ void dma2_iow3_w(uint8_t data) { m_write_iow(7, (m_dma_high_byte << 8) | data, 0xffff); }
DECLARE_WRITE_LINE_MEMBER( dma1_dack0_w ) { set_dma_channel(0, state); }
DECLARE_WRITE_LINE_MEMBER( dma1_dack1_w ) { set_dma_channel(1, state); }
DECLARE_WRITE_LINE_MEMBER( dma1_dack2_w ) { set_dma_channel(2, state); }
@@ -234,7 +234,7 @@ private:
DECLARE_WRITE_LINE_MEMBER( dma2_dack3_w ) { set_dma_channel(7, state); }
DECLARE_WRITE_LINE_MEMBER( dma2_hreq_w ) { m_write_hold(state); }
DECLARE_WRITE_LINE_MEMBER( intc1_int_w ) { m_write_intr(state); }
- DECLARE_READ8_MEMBER( intc1_slave_ack_r );
+ uint8_t intc1_slave_ack_r(offs_t offset);
DECLARE_WRITE_LINE_MEMBER( ctc_out1_w );
DECLARE_WRITE_LINE_MEMBER( ctc_out2_w );
};
diff --git a/src/devices/machine/diablo_hd.cpp b/src/devices/machine/diablo_hd.cpp
index 669285ccb08..36c57cbd0d7 100644
--- a/src/devices/machine/diablo_hd.cpp
+++ b/src/devices/machine/diablo_hd.cpp
@@ -1324,11 +1324,9 @@ void diablo_hd_device::device_start()
void diablo_hd_device::device_reset()
{
// free previous page cache
- if (m_cache) {
- for (int page = 0; page < m_pages; page++)
- if (m_cache[page])
- m_cache[page] = nullptr;
- }
+ for (int page = 0; page < m_pages; page++)
+ if (m_cache[page])
+ m_cache[page] = nullptr;
// free previous bits cache
if (m_bits) {
for (int page = 0; page < m_pages; page++)
@@ -1442,9 +1440,10 @@ void diablo_hd_device::device_timer(emu_timer &timer, device_timer_id id, int pa
}
}
-MACHINE_CONFIG_START(diablo_hd_device::device_add_mconfig)
- MCFG_DIABLO_ADD("drive")
-MACHINE_CONFIG_END
+void diablo_hd_device::device_add_mconfig(machine_config &config)
+{
+ DIABLO(config, "drive", 0);
+}
DEFINE_DEVICE_TYPE(DIABLO_HD, diablo_hd_device, "diablo_hd", "Diablo Disk")
diff --git a/src/devices/machine/diablo_hd.h b/src/devices/machine/diablo_hd.h
index 41f206cc531..93915e628e3 100644
--- a/src/devices/machine/diablo_hd.h
+++ b/src/devices/machine/diablo_hd.h
@@ -162,7 +162,4 @@ private:
void sector_mark_0();
};
-#define MCFG_DIABLO_DRIVES_ADD() \
- MCFG_DEVICE_ADD(DIABLO_HD_0, DIABLO_HD, 3333333) \
- MCFG_DEVICE_ADD(DIABLO_HD_1, DIABLO_HD, 3333333)
#endif // !defined(_DIABLO_HD_DEVICE_)
diff --git a/src/devices/machine/dp8390.h b/src/devices/machine/dp8390.h
index 74b57f027d1..c13fe53e1d3 100644
--- a/src/devices/machine/dp8390.h
+++ b/src/devices/machine/dp8390.h
@@ -8,38 +8,13 @@
// device stuff
-#define MCFG_DP8390D_IRQ_CB(_devcb) \
- downcast<dp8390_device &>(*device).set_irq_callback(DEVCB_##_devcb);
-
-#define MCFG_DP8390D_BREQ_CB(_devcb) \
- downcast<dp8390_device &>(*device).set_breq_callback(DEVCB_##_devcb);
-
-#define MCFG_DP8390D_MEM_READ_CB(_devcb) \
- downcast<dp8390_device &>(*device).set_mem_read_callback(DEVCB_##_devcb);
-
-#define MCFG_DP8390D_MEM_WRITE_CB(_devcb) \
- downcast<dp8390_device &>(*device).set_mem_write_callback(DEVCB_##_devcb);
-
-#define MCFG_RTL8019A_IRQ_CB(_devcb) \
- downcast<rtl8019a_device &>(*device).set_irq_callback(DEVCB_##_devcb);
-
-#define MCFG_RTL8019A_BREQ_CB(_devcb) \
- downcast<rtl8019a_device &>(*device).set_breq_callback(DEVCB_##_devcb);
-
-#define MCFG_RTL8019A_MEM_READ_CB(_devcb) \
- downcast<rtl8019a_device &>(*device).set_mem_read_callback(DEVCB_##_devcb);
-
-#define MCFG_RTL8019A_MEM_WRITE_CB(_devcb) \
- downcast<rtl8019a_device &>(*device).set_mem_write_callback(DEVCB_##_devcb);
-
-
class dp8390_device : public device_t, public device_network_interface
{
public:
- template <class Object> devcb_base &set_irq_callback(Object &&cb) { return m_irq_cb.set_callback(std::forward<Object>(cb)); }
- template <class Object> devcb_base &set_breq_callback(Object &&cb) { return m_breq_cb.set_callback(std::forward<Object>(cb)); }
- template <class Object> devcb_base &set_mem_read_callback(Object &&cb) { return m_mem_read_cb.set_callback(std::forward<Object>(cb)); }
- template <class Object> devcb_base &set_mem_write_callback(Object &&cb) { return m_mem_write_cb.set_callback(std::forward<Object>(cb)); }
+ auto irq_callback() { return m_irq_cb.bind(); }
+ auto breq_callback() { return m_breq_cb.bind(); }
+ auto mem_read_callback() { return m_mem_read_cb.bind(); }
+ auto mem_write_callback() { return m_mem_write_cb.bind(); }
DECLARE_WRITE16_MEMBER( dp8390_w );
DECLARE_READ16_MEMBER( dp8390_r );
diff --git a/src/devices/machine/dp83932c.cpp b/src/devices/machine/dp83932c.cpp
index c8c7fcfcd9e..82d70f02797 100644
--- a/src/devices/machine/dp83932c.cpp
+++ b/src/devices/machine/dp83932c.cpp
@@ -20,112 +20,99 @@
#define VERBOSE 0
#include "logmacro.h"
-DEFINE_DEVICE_TYPE(DP83932C_BE, dp83932c_be_device, "dp83932c_be", "National Semiconductor DP83932C SONIC (big)")
-DEFINE_DEVICE_TYPE(DP83932C_LE, dp83932c_le_device, "dp83932c_le", "National Semiconductor DP83932C SONIC (little)")
+DEFINE_DEVICE_TYPE(DP83932C, dp83932c_device, "dp83932c", "National Semiconductor DP83932C SONIC")
-dp83932c_device::dp83932c_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock, endianness_t endian)
- : device_t(mconfig, type, tag, owner, clock)
- , device_memory_interface(mconfig, *this)
+dp83932c_device::dp83932c_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+ : device_t(mconfig, DP83932C, tag, owner, clock)
, device_network_interface(mconfig, *this, 10.0f)
- , m_space_config("shared", endian, 32, 32)
+ , m_ram(*this, finder_base::DUMMY_TAG)
, m_out_int(*this)
{
}
-dp83932c_be_device::dp83932c_be_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
- : dp83932c_device(mconfig, DP83932C_BE, tag, owner, clock, ENDIANNESS_BIG)
-{
-}
-
-dp83932c_le_device::dp83932c_le_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
- : dp83932c_device(mconfig, DP83932C_LE, tag, owner, clock, ENDIANNESS_LITTLE)
-{
-}
-
void dp83932c_device::map(address_map &map)
{
-/*
- // command and status registers
- map(0x00, 0x03).rw(FUNC(dp83932c_device::cr_r), FUNC(dp83932c_device::cr_w));
- map(0x04, 0x07).rw(FUNC(dp83932c_device::dcr_r), FUNC(dp83932c_device::dcr_w));
- map(0x08, 0x0b).rw(FUNC(dp83932c_device::rcr_r), FUNC(dp83932c_device::rcr_w));
- map(0x0c, 0x0f).rw(FUNC(dp83932c_device::tcr_r), FUNC(dp83932c_device::tcr_w));
- map(0x10, 0x13).rw(FUNC(dp83932c_device::imr_r), FUNC(dp83932c_device::imr_w));
- map(0x14, 0x17).rw(FUNC(dp83932c_device::isr_r), FUNC(dp83932c_device::isr_w));
-
- // transmit registers
- map(0x18, 0x1b).rw(FUNC(dp83932c_device::utda_r), FUNC(dp83932c_device::utda_w));
- map(0x1c, 0x1f).rw(FUNC(dp83932c_device::ctda_r), FUNC(dp83932c_device::ctda_w));
-
- // tps
- // tfc
- // tsa0
- // tsa1
- // tfs
-
- // receive registers
- map(0x34, 0x37).rw(FUNC(dp83932c_device::urda_r), FUNC(dp83932c_device::urda_w));
- map(0x38, 0x3b).rw(FUNC(dp83932c_device::crda_r), FUNC(dp83932c_device::crda_w));
-
- // crba0
- // crba1
- // rbwc0
- // rbwc1
- // eobc
- // urra
- // rsa
- // rea
- // rrp
- // rwp
- // trba0
- // trba1
- // tbwc0
- // tbwc1
- // addr0
- // addr1
- // llfa
- // ttda
- // cep
- // cap2
- // cap1
- // cap0
- // ce
- // cdp
- // cdc
- // sr
- // wt0
- // wt1
- // rsc
- // crct
- // faet
- // mpt
- // mdt
-
- // 30-3e internal use registers
-*/
+ // datasheet uses unshifted register addresses
+ int const shift = 1;
+
+ // command and status registers
+ map(0x00 << shift, (0x00 << shift) | 0x01).rw(FUNC(dp83932c_device::cr_r), FUNC(dp83932c_device::cr_w));
+ //map(0x01 << shift, (0x01 << shift) | 0x01).rw(FUNC(dp83932c_device::dcr_r), FUNC(dp83932c_device::dcr_w));
+ //map(0x02 << shift, (0x02 << shift) | 0x01).rw(FUNC(dp83932c_device::rcr_r), FUNC(dp83932c_device::rcr_w));
+ map(0x03 << shift, (0x03 << shift) | 0x01).rw(FUNC(dp83932c_device::tcr_r), FUNC(dp83932c_device::tcr_w));
+ //map(0x04 << shift, (0x04 << shift) | 0x01).rw(FUNC(dp83932c_device::imr_r), FUNC(dp83932c_device::imr_w));
+ map(0x05 << shift, (0x05 << shift) | 0x01).rw(FUNC(dp83932c_device::isr_r), FUNC(dp83932c_device::isr_w));
+
+ // transmit registers
+ map(0x06 << shift, (0x06 << shift) | 0x01).rw(FUNC(dp83932c_device::utda_r), FUNC(dp83932c_device::utda_w));
+ //map(0x07 << shift, (0x07 << shift) | 0x01).rw(FUNC(dp83932c_device::ctda_r), FUNC(dp83932c_device::ctda_w));
+
+ // tps
+ // tfc
+ // tsa0
+ // tsa1
+ // tfs
+
+ // receive registers
+ //map(0x0d << shift, (0x0d << shift) | 0x01).rw(FUNC(dp83932c_device::urda_r), FUNC(dp83932c_device::urda_w));
+ map(0x0e << shift, (0x0e << shift) | 0x01).rw(FUNC(dp83932c_device::crda_r), FUNC(dp83932c_device::crda_w));
+
+ // crba0
+ // crba1
+ // rbwc0
+ // rbwc1
+ // eobc
+ // urra
+ // rsa
+ // rea
+ map(0x17 << shift, (0x17 << shift) | 0x01).rw(FUNC(dp83932c_device::rrp_r), FUNC(dp83932c_device::rrp_w));
+ map(0x18 << shift, (0x18 << shift) | 0x01).rw(FUNC(dp83932c_device::rwp_r), FUNC(dp83932c_device::rwp_w));
+ // trba0
+ // trba1
+ // tbwc0
+ // tbwc1
+ // addr0
+ // addr1
+ // llfa
+ // ttda
+ // cep
+ // cap2
+ // cap1
+ // cap0
+ map(0x25 << shift, (0x25 << shift) | 0x01).rw(FUNC(dp83932c_device::ce_r), FUNC(dp83932c_device::ce_w));
+ // cdp
+ // cdc
+ // sr
+ map(0x29 << shift, (0x29 << shift) | 0x01).rw(FUNC(dp83932c_device::wt0_r), FUNC(dp83932c_device::wt0_w));
+ map(0x2a << shift, (0x2a << shift) | 0x01).rw(FUNC(dp83932c_device::wt1_r), FUNC(dp83932c_device::wt1_w));
+ map(0x2b << shift, (0x2b << shift) | 0x01).rw(FUNC(dp83932c_device::rsc_r), FUNC(dp83932c_device::rsc_w));
+ // crct
+ map(0x2d << shift, (0x2d << shift) | 0x01).rw(FUNC(dp83932c_device::faet_r), FUNC(dp83932c_device::faet_w));
+ // mpt
+ // mdt
+
+ // 30-3e internal use registers
+ // dcr2
}
void dp83932c_device::device_start()
{
- m_space = &space(0);
m_out_int.resolve();
}
void dp83932c_device::device_reset()
{
+ m_cr = RST | STP | RXDIS;
+ m_tcr = NCRS | PTX;
+ m_isr = 0;
+ m_ce = 0;
+ m_rsc = 0;
}
void dp83932c_device::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr)
{
}
-device_memory_interface::space_config_vector dp83932c_device::memory_space_config() const
-{
- return space_config_vector {
- std::make_pair(0, &m_space_config)
- };
-}
-
void dp83932c_device::send_complete_cb(int result)
{
}
diff --git a/src/devices/machine/dp83932c.h b/src/devices/machine/dp83932c.h
index 27f5ae60d85..e608f7508a6 100644
--- a/src/devices/machine/dp83932c.h
+++ b/src/devices/machine/dp83932c.h
@@ -6,54 +6,113 @@
#pragma once
-class dp83932c_device :
- public device_t,
- public device_memory_interface,
- public device_network_interface
+#include "machine/ram.h"
+
+class dp83932c_device
+ : public device_t
+ , public device_network_interface
{
public:
- // callback configuration
+ dp83932c_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+ static constexpr feature_type imperfect_features() { return feature::LAN; }
+
+ // configuration
+ template <typename T> void set_ram(T &&tag) { m_ram.set_tag(std::forward<T>(tag)); }
auto out_int_cb() { return m_out_int.bind(); }
void map(address_map &map);
protected:
- dp83932c_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock, endianness_t endian);
-
// device_t overrides
virtual void device_start() override;
virtual void device_reset() override;
virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override;
- // device_memory_interface overrides
- virtual space_config_vector memory_space_config() const override;
-
// device_network_interface overrides
virtual void send_complete_cb(int result) override;
virtual int recv_start_cb(u8 *buf, int length) override;
virtual void recv_complete_cb(int result) override;
+ enum cr_mask : u16
+ {
+ HTX = 0x0001, // halt transmission
+ TXP = 0x0002, // transmit packets
+ RXDIS = 0x0004, // receiver disable
+ RXEN = 0x0008, // receiver enable
+ STP = 0x0010, // stop timer
+ ST = 0x0020, // start timer
+ RST = 0x0080, // software reset
+ RRRA = 0x0100, // read rra
+ LCAM = 0x0200, // load cam
+
+ CR_WMASK = 0x03bf
+ };
+
+ enum tcr_mask : u16
+ {
+ PTX = 0x0001, // packet transmitted ok
+ BCM = 0x0002, // byte count mismatch
+ FU = 0x0004, // fifo underrun
+ PMB = 0x0008, // packet monitored bad
+ OWC = 0x0020, // out of window collision
+ EXC = 0x0040, // excessive collisions
+ CRSL = 0x0080, // crs lost
+ NCRS = 0x0100, // no crs
+ DEF = 0x0200, // deferred transmission
+ EXD = 0x0400, // excessive deferral
+ EXDIS = 0x1000, // disable excessive deferral timer
+ CRCI = 0x2000, // crc inhibit
+ POWC = 0x4000, // programmed out of window collision timer
+ PINT = 0x8000, // programmable interrupt
+
+ TCR_WMASK = 0xf000
+ };
+
+ u16 cr_r() { return m_cr; }
+ u16 tcr_r() { return m_tcr; }
+ u16 utda_r() { return m_utda; }
+ u16 crda_r() { return m_crda; }
+ u16 rrp_r() { return m_rrp; }
+ u16 rwp_r() { return m_rwp; }
+ u16 isr_r() { return m_isr; }
+ u16 ce_r() { return m_ce; }
+ u16 wt0_r() { return m_wt0; }
+ u16 wt1_r() { return m_wt1; }
+ u16 rsc_r() { return m_rsc; }
+ u16 faet_r() { return m_faet; }
+
+ void cr_w(u16 data) { m_cr = (data & CR_WMASK) | (m_cr & ~CR_WMASK); }
+ void tcr_w(u16 data) { m_tcr = (data & TCR_WMASK) | (m_tcr & ~TCR_WMASK); }
+ void utda_w(u16 data) { m_utda = data; }
+ void crda_w(u16 data) { m_crda = data; }
+ void rrp_w(u16 data) { m_rrp = data; }
+ void rwp_w(u16 data) { m_rwp = data; }
+ void isr_w(u16 data) { m_isr = data; }
+ void ce_w(u16 data) { m_ce = data; }
+ void wt0_w(u16 data) { m_wt0 = data; }
+ void wt1_w(u16 data) { m_wt1 = data; }
+ void rsc_w(u16 data) { m_rsc = data; }
+ void faet_w(u16 data) { m_faet = ~data; }
+
private:
- // device_memory_interface members
- const address_space_config m_space_config;
- address_space *m_space;
+ required_device<ram_device> m_ram;
devcb_write_line m_out_int;
-};
-
-class dp83932c_be_device : public dp83932c_device
-{
-public:
- dp83932c_be_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
-};
-class dp83932c_le_device : public dp83932c_device
-{
-public:
- dp83932c_le_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+ u16 m_cr;
+ u16 m_tcr;
+ u16 m_utda;
+ u16 m_crda;
+ u16 m_rrp;
+ u16 m_rwp;
+ u16 m_isr;
+ u16 m_ce;
+ u16 m_wt0;
+ u16 m_wt1;
+ u16 m_rsc;
+ u16 m_faet;
};
-DECLARE_DEVICE_TYPE(DP83932C_BE, dp83932c_be_device)
-DECLARE_DEVICE_TYPE(DP83932C_LE, dp83932c_le_device)
+DECLARE_DEVICE_TYPE(DP83932C, dp83932c_device)
#endif // MAME_MACHINE_DP83932C_H
diff --git a/src/devices/machine/ds1204.h b/src/devices/machine/ds1204.h
index 12bc61657e4..59dc5718989 100644
--- a/src/devices/machine/ds1204.h
+++ b/src/devices/machine/ds1204.h
@@ -13,9 +13,6 @@
#pragma once
-#define MCFG_DS1204_ADD( _tag ) \
- MCFG_DEVICE_ADD( _tag, DS1204, 0 )
-
class ds1204_device : public device_t, public device_nvram_interface
{
public:
diff --git a/src/devices/machine/ds1205.h b/src/devices/machine/ds1205.h
index 7f854d901fc..ad7432e1ac7 100644
--- a/src/devices/machine/ds1205.h
+++ b/src/devices/machine/ds1205.h
@@ -13,9 +13,6 @@
#pragma once
-#define MCFG_DS1205_ADD( _tag ) \
- MCFG_DEVICE_ADD( _tag, DS1205, 0 )
-
class ds1205_device : public device_t, public device_nvram_interface
{
public:
diff --git a/src/devices/machine/ds128x.cpp b/src/devices/machine/ds128x.cpp
index 7a397aab303..91e022e07e7 100644
--- a/src/devices/machine/ds128x.cpp
+++ b/src/devices/machine/ds128x.cpp
@@ -10,7 +10,12 @@ DEFINE_DEVICE_TYPE(DS12885, ds12885_device, "ds12885", "DS12885 RTC/NVRAM")
//-------------------------------------------------
ds12885_device::ds12885_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
- : mc146818_device(mconfig, DS12885, tag, owner, clock)
+ : ds12885_device(mconfig, DS12885, tag, owner, clock)
+{
+}
+
+ds12885_device::ds12885_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock)
+ : mc146818_device(mconfig, type, tag, owner, clock)
{
}
@@ -23,3 +28,54 @@ int ds12885_device::get_timer_bypass()
return 22; // No tick
}
+
+DEFINE_DEVICE_TYPE(DS12885EXT, ds12885ext_device, "ds12885ext", "DS12885 RTC/NVRAM size 256 bytes")
+
+//-------------------------------------------------
+// ds12885ext_device - constructor
+//-------------------------------------------------
+
+ds12885ext_device::ds12885ext_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+ : ds12885_device(mconfig, DS12885EXT, tag, owner, clock)
+{
+}
+
+//-------------------------------------------------
+// ds12885ext_device - handlers that allow acces to extended memory size
+//-------------------------------------------------
+
+uint8_t ds12885ext_device::read_extended(offs_t offset)
+{
+ switch (offset)
+ {
+ case 0:
+ case 1:
+ return read(offset);
+ break;
+ case 2:
+ case 3:
+ return read(offset - 2);
+ break;
+ default:
+ return 0xff;
+ }
+}
+
+void ds12885ext_device::write_extended(offs_t offset, uint8_t data)
+{
+ switch (offset)
+ {
+ case 0:
+ write(offset, data & 127);
+ break;
+ case 1:
+ write(offset, data);
+ break;
+ case 2:
+ write(offset - 2, data);
+ break;
+ case 3:
+ write(offset - 2, data);
+ break;
+ }
+}
diff --git a/src/devices/machine/ds128x.h b/src/devices/machine/ds128x.h
index 671d3ee0a6f..7ade1bfa431 100644
--- a/src/devices/machine/ds128x.h
+++ b/src/devices/machine/ds128x.h
@@ -5,10 +5,8 @@
#include "mc146818.h"
-#define MCFG_DS12885_ADD(_tag) \
- MCFG_DEVICE_ADD(_tag, DS12885, XTAL(32'768))
-// ======================> mc146818_device
+// ======================> ds12885_device
class ds12885_device : public mc146818_device
{
@@ -17,6 +15,8 @@ public:
ds12885_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock = 32'768);
protected:
+ ds12885_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock);
+
virtual int data_size() override { return 128; }
virtual int get_timer_bypass() override;
};
@@ -24,4 +24,23 @@ protected:
// device type definition
DECLARE_DEVICE_TYPE(DS12885, ds12885_device)
+// ======================> ds12885ext_device
+
+class ds12885ext_device : public ds12885_device
+{
+public:
+ // construction/destruction
+ ds12885ext_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock = 32'768);
+
+ // read/write access to extended ram
+ uint8_t read_extended(offs_t offset);
+ void write_extended(offs_t offset, uint8_t data);
+
+protected:
+ virtual int data_size() override { return 256; }
+};
+
+// device type definition
+DECLARE_DEVICE_TYPE(DS12885EXT, ds12885ext_device)
+
#endif // MAME_MACHINE_DS128X_H
diff --git a/src/devices/machine/ds1315.cpp b/src/devices/machine/ds1315.cpp
index 6b37957f9eb..2a574dca399 100644
--- a/src/devices/machine/ds1315.cpp
+++ b/src/devices/machine/ds1315.cpp
@@ -87,17 +87,17 @@ static const uint8_t ds1315_pattern[] =
***************************************************************************/
// automated read, does all the work the real Dallas chip does
-READ8_MEMBER( ds1315_device::read )
+uint8_t ds1315_device::read(offs_t offset)
{
if (m_mode == DS_SEEK_MATCHING)
{
if (offset & 1)
{
- read_1(space, 0);
+ read_1();
}
else
{
- read_0(space, 0);
+ read_0();
}
if (offset & 4)
@@ -110,7 +110,7 @@ READ8_MEMBER( ds1315_device::read )
}
else if (m_mode == DS_CALENDAR_IO)
{
- return read_data(space, offset);
+ return read_data();
}
return 0xff; // shouldn't happen, but compilers don't know that
@@ -121,7 +121,7 @@ READ8_MEMBER( ds1315_device::read )
read_0 (actual data)
-------------------------------------------------*/
-READ8_MEMBER( ds1315_device::read_0 )
+uint8_t ds1315_device::read_0()
{
if (ds1315_pattern[m_count++] == 0)
{
@@ -145,7 +145,7 @@ READ8_MEMBER( ds1315_device::read_0 )
read_1 (actual data)
-------------------------------------------------*/
-READ8_MEMBER( ds1315_device::read_1 )
+uint8_t ds1315_device::read_1()
{
if (ds1315_pattern[m_count++] == 1)
{
@@ -163,7 +163,7 @@ READ8_MEMBER( ds1315_device::read_1 )
read_data
-------------------------------------------------*/
-READ8_MEMBER( ds1315_device::read_data )
+uint8_t ds1315_device::read_data()
{
uint8_t result;
@@ -228,7 +228,7 @@ void ds1315_device::fill_raw_data()
write_data
-------------------------------------------------*/
-READ8_MEMBER(ds1315_device::write_data)
+uint8_t ds1315_device::write_data(offs_t offset)
{
static int write_count;
if (write_count >= 64)
diff --git a/src/devices/machine/ds1315.h b/src/devices/machine/ds1315.h
index a5b70c38c76..720c4a08202 100644
--- a/src/devices/machine/ds1315.h
+++ b/src/devices/machine/ds1315.h
@@ -24,12 +24,12 @@ public:
auto read_backing() { return m_backing_read.bind(); }
// this handler automates the bits 0/2 stuff
- DECLARE_READ8_MEMBER(read);
+ uint8_t read(offs_t offset);
- DECLARE_READ8_MEMBER(read_0);
- DECLARE_READ8_MEMBER(read_1);
- DECLARE_READ8_MEMBER(read_data);
- DECLARE_READ8_MEMBER(write_data);
+ uint8_t read_0();
+ uint8_t read_1();
+ uint8_t read_data();
+ uint8_t write_data(offs_t offset);
bool chip_enable();
void chip_reset();
diff --git a/src/devices/machine/ds75160a.h b/src/devices/machine/ds75160a.h
index 2f2a2147a5e..bdc03e9dc99 100644
--- a/src/devices/machine/ds75160a.h
+++ b/src/devices/machine/ds75160a.h
@@ -25,18 +25,6 @@
#pragma once
-
-
-///*************************************************************************
-// INTERFACE CONFIGURATION MACROS
-///*************************************************************************
-
-#define MCFG_DS75160A_ADD(_tag, _read, _write) \
- MCFG_DEVICE_ADD(_tag, DS75160A, 0) \
- downcast<ds75160a_device *>(device)->set_callbacks(DEVCB_##_read, DEVCB_##_write);
-
-
-
///*************************************************************************
// TYPE DEFINITIONS
///*************************************************************************
diff --git a/src/devices/machine/f3853.cpp b/src/devices/machine/f3853.cpp
index f4713f3fa3a..45511f334ab 100644
--- a/src/devices/machine/f3853.cpp
+++ b/src/devices/machine/f3853.cpp
@@ -1,19 +1,29 @@
// license:BSD-3-Clause
-// copyright-holders:Wilbert Pol
+// copyright-holders:Wilbert Pol, hap
/**********************************************************************
- Fairchild F3853 SRAM interface with integrated interrupt
- controller and timer (SMI)
+Fairchild F3853 SMI, F3851 PSU, F3856 PSU, F38T56 PSU
- This chip is a timer shift register, basically the same as in the
- F3851.
+This device only emulates the I/O, interrupt, timer functions. Not the
+low-level ROMC signals.
- Based on a datasheet obtained from www.freetradezone.com
+F3853: Static memory interface with integrated interrupt controller and timer.
- 8-bit shift register:
- Feedback in0 = !((out3 ^ out4) ^ (out5 ^ out7))
- Interrupts are at 0xfe
- 0xff stops the register (0xfe is never reached)
+The timer is an 8-bit linear feedback shift register:
+Feedback in0 = !((out3 ^ out4) ^ (out5 ^ out7))
+Interrupts are at 0xfe
+0xff stops the register (0xfe is never reached)
+
+F3851: Program Storage Unit, same timer and interrupt controller as F3853,
+but has 2 I/O ports instead of a programmable interrupt vector.
+
+F3856/F38T56 Program Storage Unit: similar interrupt controller, timer
+is more versatile, a simple downcounter instead of shift register.
+
+TODO:
+- emulate at lower level and place this stuff into devices/cpu/f8 folder
+- interrupt priority pin
+- 3856/38T56 timer pulse counter mode, event counter mode
**********************************************************************/
@@ -21,30 +31,59 @@
#include "f3853.h"
+// device type definition
-/***************************************************************************
- IMPLEMENTATION
-***************************************************************************/
-
-//**************************************************************************
-// LIVE DEVICE
-//**************************************************************************
+DEFINE_DEVICE_TYPE(F3853, f3853_device, "f3853_smi", "Fairchild F3853 SMI")
+DEFINE_DEVICE_TYPE(F3851, f3851_device, "f3851_psu", "Fairchild F3851 PSU")
+DEFINE_DEVICE_TYPE(F3856, f3856_device, "f3856_psu", "Fairchild F3856 PSU")
+DEFINE_DEVICE_TYPE(F38T56, f38t56_device, "f38t56_psu", "Fairchild F38T56 PSU")
-// device type definition
-DEFINE_DEVICE_TYPE(F3853, f3853_device, "f3853_device", "F3853 SMI")
//-------------------------------------------------
-// f3853_device - constructor
+// constructor
//-------------------------------------------------
-f3853_device::f3853_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
- : device_t(mconfig, F3853, tag, owner, clock)
- , m_int_req_callback(*this)
- , m_pri_out_callback(*this)
- , m_priority_line(false)
- , m_external_interrupt_line(true)
-{
-}
+f3853_device::f3853_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock) :
+ device_t(mconfig, type, tag, owner, clock),
+ m_int_req_callback(*this),
+ m_pri_out_callback(*this),
+ m_int_vector(0),
+ m_prescaler(31),
+ m_priority_line(false),
+ m_external_interrupt_line(true)
+{ }
+
+f3853_device::f3853_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock) :
+ f3853_device(mconfig, F3853, tag, owner, clock)
+{ }
+
+f3851_device::f3851_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock) :
+ f3853_device(mconfig, type, tag, owner, clock),
+ m_read_port{{*this}, {*this}},
+ m_write_port{{*this}, {*this}}
+{ }
+
+f3851_device::f3851_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock) :
+ f3851_device(mconfig, F3851, tag, owner, clock)
+{ }
+
+f3856_device::f3856_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock) :
+ f3851_device(mconfig, type, tag, owner, clock)
+{ }
+
+f3856_device::f3856_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock) :
+ f3856_device(mconfig, F3856, tag, owner, clock)
+{ }
+
+f38t56_device::f38t56_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock) :
+ f3856_device(mconfig, F38T56, tag, owner, clock)
+{ }
+
+
+
+//-------------------------------------------------
+// initialisation
+//-------------------------------------------------
void f3853_device::device_resolve_objects()
{
@@ -53,12 +92,20 @@ void f3853_device::device_resolve_objects()
m_int_daisy_chain_callback.bind_relative_to(*owner());
}
-//-------------------------------------------------
-// device_start - device-specific startup
-//-------------------------------------------------
+void f3851_device::device_resolve_objects()
+{
+ f3853_device::device_resolve_objects();
+
+ // 2 I/O ports
+ for (devcb_read8 &cb : m_read_port)
+ cb.resolve_safe(0);
+ for (devcb_write8 &cb : m_write_port)
+ cb.resolve_safe();
+}
void f3853_device::device_start()
{
+ // lookup table for 3851/3853 lfsr timer
uint8_t reg = 0xfe; // Known to get 0xfe after 255 cycles
for(int i = reg; i >= 0; i--)
{
@@ -68,47 +115,62 @@ void f3853_device::device_start()
m_timer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(f3853_device::timer_callback),this));
+ // zerofill (what's not in constructor)
+ m_external_int_enable = false;
+ m_timer_int_enable = false;
+ m_request_flipflop = false;
+
+ // register for savestates
save_item(NAME(m_int_vector));
- save_item(NAME(m_external_enable));
- save_item(NAME(m_timer_enable));
+ save_item(NAME(m_prescaler));
+ save_item(NAME(m_external_int_enable));
+ save_item(NAME(m_timer_int_enable));
save_item(NAME(m_request_flipflop));
save_item(NAME(m_priority_line));
save_item(NAME(m_external_interrupt_line));
}
+void f3856_device::device_start()
+{
+ f3853_device::device_start();
-//-------------------------------------------------
-// device_reset - device-specific reset
-//-------------------------------------------------
+ m_timer_count = 0;
+ m_timer_modulo = 0;
+ m_timer_start = false;
+
+ save_item(NAME(m_timer_count));
+ save_item(NAME(m_timer_modulo));
+ save_item(NAME(m_timer_start));
+}
void f3853_device::device_reset()
{
- m_int_vector = 0;
- m_external_enable = false;
- m_timer_enable = false;
- m_request_flipflop = false;
- m_external_interrupt_line = true;
- set_interrupt_request_line();
+ // note that standalone peripherals don't have a reset pin, but 3870 does
- m_timer->enable(false);
+ // clear ports at power-on
+ for (int i = 0; i < 4; i++)
+ write(machine().dummy_space(), i, 0);
}
+//-------------------------------------------------
+// implementation
+//-------------------------------------------------
+
void f3853_device::set_interrupt_request_line()
{
m_int_req_callback(m_request_flipflop && !m_priority_line ? ASSERT_LINE : CLEAR_LINE);
}
-
IRQ_CALLBACK_MEMBER(f3853_device::int_acknowledge)
{
- if (m_external_enable && !m_priority_line && m_request_flipflop)
+ if (m_external_int_enable && !m_priority_line && m_request_flipflop)
{
m_request_flipflop = false;
set_interrupt_request_line();
return external_interrupt_vector();
}
- else if (m_timer_enable && !m_priority_line && m_request_flipflop)
+ else if (m_timer_int_enable && !m_priority_line && m_request_flipflop)
{
m_request_flipflop = false;
set_interrupt_request_line();
@@ -127,14 +189,14 @@ IRQ_CALLBACK_MEMBER(f3853_device::int_acknowledge)
void f3853_device::timer_start(uint8_t value)
{
- attotime period = (value != 0xff) ? attotime::from_hz(clock()) * (m_value_to_cycle[value]*31) : attotime::never;
+ attotime period = (value != 0xff) ? attotime::from_hz(clock()) * (m_value_to_cycle[value] * m_prescaler) : attotime::never;
m_timer->adjust(period);
}
TIMER_CALLBACK_MEMBER(f3853_device::timer_callback)
{
- if(m_timer_enable)
+ if(m_timer_int_enable)
{
m_request_flipflop = true;
set_interrupt_request_line();
@@ -142,9 +204,10 @@ TIMER_CALLBACK_MEMBER(f3853_device::timer_callback)
timer_start(0xfe);
}
+
WRITE_LINE_MEMBER(f3853_device::ext_int_w)
{
- if(m_external_interrupt_line && !state && m_external_enable)
+ if(m_external_interrupt_line && !state && m_external_int_enable)
{
m_request_flipflop = true;
}
@@ -161,49 +224,201 @@ WRITE_LINE_MEMBER(f3853_device::pri_in_w)
READ8_MEMBER(f3853_device::read)
{
- uint8_t data = 0;
-
- switch (offset)
+ switch (offset & 3)
{
+ // interrupt vector
case 0:
- data = m_int_vector >> 8;
- break;
-
+ return m_int_vector >> 8;
case 1:
- data = m_int_vector & 0xff;
- break;
+ return m_int_vector & 0xff;
- case 2: // Interrupt control; not readable
- case 3: // Timer; not readable
- break;
+ // interrupt control, timer: write-only
+ default:
+ return 0;
}
-
- return data;
}
-
WRITE8_MEMBER(f3853_device::write)
{
- switch(offset)
+ switch (offset & 3)
{
+ // interrupt vector
case 0:
m_int_vector = (data << 8) | (m_int_vector & 0x00ff);
break;
-
case 1:
m_int_vector = data | (m_int_vector & 0xff00);
break;
- case 2: //interrupt control
- m_external_enable = ((data & 3) == 1);
- m_timer_enable = ((data & 3) == 3);
+ // interrupt control
+ case 2:
+ m_external_int_enable = (data & 3) == 1;
+ m_timer_int_enable = (data & 3) == 3;
set_interrupt_request_line();
break;
- case 3: //timer
+ // set timer
+ case 3:
m_request_flipflop = false;
set_interrupt_request_line();
timer_start(data);
break;
}
}
+
+
+//-------------------------------------------------
+// f3851_device-specific handlers
+//-------------------------------------------------
+
+READ8_MEMBER(f3851_device::read)
+{
+ switch (offset & 3)
+ {
+ // I/O ports
+ case 0: case 1:
+ return (m_read_port[offset & 1])(offs_t(offset & 1));
+
+ // interrupt control, timer: write-only
+ default:
+ return 0;
+ }
+}
+
+WRITE8_MEMBER(f3851_device::write)
+{
+ switch (offset & 3)
+ {
+ // I/O ports
+ case 0: case 1:
+ (m_write_port[offset & 1])(offs_t(offset & 1), data);
+ break;
+
+ // interrupt control, timer: same as 3853
+ case 2: case 3:
+ f3853_device::write(space, offset, data);
+ break;
+ }
+}
+
+
+//-------------------------------------------------
+// f3856_device-specific handlers
+//-------------------------------------------------
+
+void f3856_device::timer_start(uint8_t value)
+{
+ m_timer_count = value;
+ attotime period = (m_timer_start) ? (attotime::from_hz(clock()) * m_prescaler) : attotime::never;
+
+ m_timer->adjust(period);
+}
+
+TIMER_CALLBACK_MEMBER(f3856_device::timer_callback)
+{
+ if (--m_timer_count == 0)
+ {
+ m_timer_count = m_timer_modulo;
+ if (m_timer_int_enable)
+ {
+ m_request_flipflop = true;
+ set_interrupt_request_line();
+ }
+ }
+
+ timer_start(m_timer_count);
+}
+
+READ8_MEMBER(f3856_device::read)
+{
+ switch (offset & 3)
+ {
+ // timer: active counter
+ case 3:
+ return m_timer_count;
+
+ // other: same as 3851
+ default:
+ return f3851_device::read(space, offset);
+ }
+}
+
+WRITE8_MEMBER(f3856_device::write)
+{
+ switch (offset & 3)
+ {
+ // I/O ports: same as 3851
+ case 0: case 1:
+ f3851_device::write(space, offset, data);
+ break;
+
+ // interrupt/timer control
+ case 2:
+ {
+ // timer prescaler
+ static const u8 prescaler[8] = { 32, 128, 8, 2 };
+ m_prescaler = prescaler[data >> 5 & 7];
+
+ // start/stop timer
+ bool prev = m_timer_start;
+ m_timer_start = bool(~data & 0x10);
+ if (m_timer_start != prev)
+ timer_start(m_timer_count);
+
+ // enable interrupts
+ m_external_int_enable = (data & 3) == 1 || (data & 3) == 2;
+ m_timer_int_enable = bool(data & 2);
+ set_interrupt_request_line();
+ break;
+ }
+
+ // set timer
+ case 3:
+ f3853_device::write(space, offset, data);
+ break;
+ }
+}
+
+
+//-------------------------------------------------
+// f38t56_device-specific handlers
+//-------------------------------------------------
+
+WRITE8_MEMBER(f38t56_device::write)
+{
+ switch (offset & 3)
+ {
+ // I/O ports: same as 3851
+ case 0: case 1:
+ f3851_device::write(space, offset, data);
+ break;
+
+ // interrupt/timer control
+ case 2:
+ {
+ // timer prescaler
+ m_prescaler = 200;
+ if (~data & 0x80) m_prescaler /= 20;
+ if (~data & 0x40) m_prescaler /= 5;
+ if (~data & 0x20) m_prescaler /= 2;
+
+ // start/stop timer
+ bool prev = m_timer_start;
+ m_timer_start = bool(data & 8);
+ if (m_timer_start != prev)
+ timer_start(m_timer_count);
+
+ // enable interrupts
+ m_external_int_enable = bool(data & 1);
+ m_timer_int_enable = bool(data & 2);
+ set_interrupt_request_line();
+ break;
+ }
+
+ // set timer
+ case 3:
+ m_timer_modulo = data;
+ f3853_device::write(space, offset, data);
+ break;
+ }
+}
diff --git a/src/devices/machine/f3853.h b/src/devices/machine/f3853.h
index 14c922871b1..762f46950fb 100644
--- a/src/devices/machine/f3853.h
+++ b/src/devices/machine/f3853.h
@@ -1,49 +1,67 @@
// license:BSD-3-Clause
-// copyright-holders:Wilbert Pol
-/***************************************************************************
-
- Fairchild F3853 SRAM interface with integrated interrupt
- controller and timer
-
- This chip is a timer shift register, basically the same as in the
- F3851.
-
-****************************************************************************
- _____ _____
- Vgg 1 |* \_/ | 40 Vdd
- PHI 2 | | 39 ROMC4
- WRITE 3 | | 38 ROMC3
- _INT REQ 4 | | 37 ROMC2
- _PRI IN 5 | | 36 ROMC1
- _RAM WRITE 6 | | 35 ROMC0
- _EXT INT 7 | | 34 CPU READ
- ADDR7 8 | | 33 REG DR
- ADDR6 9 | | 32 ADDR15
- ADDR5 10 | F3853 | 31 ADDR14
- ADDR4 11 | | 30 ADDR13
- ADDR3 12 | | 29 ADDR12
- ADDR2 13 | | 28 ADDR11
- ADDR1 14 | | 27 ADDR10
- ADDR0 15 | | 26 ADDR9
- DB0 16 | | 25 ADDR8
- DB1 17 | | 24 DB7
- DB2 18 | | 23 DB6
- DB3 19 | | 22 DB5
- Vss 20 |_____________| 21 DB4
-
-***************************************************************************/
+// copyright-holders:Wilbert Pol, hap
+/*
+
+ Fairchild F3853 SMI, F3851 PSU, F3856 PSU, F38T56 PSU
+
+*/
#ifndef MAME_MACHINE_F3853_H
#define MAME_MACHINE_F3853_H
#pragma once
+// pinout reference
+
+/*
+ _____ _____
+ Vgg 1 |* \_/ | 40 Vdd
+ PHI 2 | | 39 ROMC4
+ WRITE 3 | | 38 ROMC3
+ _INT REQ 4 | | 37 ROMC2
+ _PRI IN 5 | | 36 ROMC1
+ _RAM WRITE 6 | | 35 ROMC0
+ _EXT INT 7 | | 34 CPU READ
+ ADDR7 8 | | 33 REG DR
+ ADDR6 9 | | 32 ADDR15
+ ADDR5 10 | F3853 | 31 ADDR14
+ ADDR4 11 | | 30 ADDR13
+ ADDR3 12 | | 29 ADDR12
+ ADDR2 13 | | 28 ADDR11
+ ADDR1 14 | | 27 ADDR10
+ ADDR0 15 | | 26 ADDR9
+ DB0 16 | | 25 ADDR8
+ DB1 17 | | 24 DB7
+ DB2 18 | | 23 DB6
+ DB3 19 | | 22 DB5
+ Vss 20 |_____________| 21 DB4
+
+ _____ _____
+ _I/O B7 1 |* \_/ | 40 DB7
+ _I/O A7 2 | | 39 DB6
+ Vgg 3 | | 38 _I/O B6
+ Vdd 4 | | 37 _I/O A6
+ _EXT INT 5 | | 36 _I/O A5
+ _PRI OUT 6 | | 35 _I/O B5
+ WRITE 7 | | 34 DB5
+ PHI 8 | | 33 DB4
+ _INT REQ 9 | F3851 | 32 _I/O B4
+ _PRI IN 10 | F3856 | 31 _I/O A4
+ _DBDR 11 | F38T56 | 30 _I/O A3
+ STROBE 12 | | 29 _I/O B3
+ ROMC4 13 | | 28 DB3
+ ROMC3 14 | | 27 DB2
+ ROMC2 15 | | 26 _I/O B2
+ ROMC1 16 | | 25 _I/O A2
+ ROMC0 17 | | 24 _I/O A1
+ Vss 18 | | 23 _I/O B1
+ _I/O A0 19 | | 22 DB1
+ _I/O B0 20 |_____________| 21 DB0
+
+ F38T56 is internal in F3870
+ note: STROBE is N/C on F3851
+*/
-/***************************************************************************
- TYPE DEFINITIONS
-***************************************************************************/
-
-// ======================> f3853_device
class f3853_device : public device_t
{
@@ -55,36 +73,38 @@ public:
auto pri_out_callback() { return m_pri_out_callback.bind(); }
template<typename Object> void set_int_daisy_chain_callback(Object &&cb) { m_int_daisy_chain_callback = std::forward<Object>(cb); }
- DECLARE_READ8_MEMBER(read);
- DECLARE_WRITE8_MEMBER(write);
+ virtual DECLARE_READ8_MEMBER(read);
+ virtual DECLARE_WRITE8_MEMBER(write);
DECLARE_WRITE_LINE_MEMBER(ext_int_w);
DECLARE_WRITE_LINE_MEMBER(pri_in_w);
- TIMER_CALLBACK_MEMBER(timer_callback);
+ virtual TIMER_CALLBACK_MEMBER(timer_callback);
IRQ_CALLBACK_MEMBER(int_acknowledge);
protected:
+ f3853_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock);
+
// device-level overrides
virtual void device_resolve_objects() override;
virtual void device_start() override;
virtual void device_reset() override;
-private:
uint16_t timer_interrupt_vector() const { return m_int_vector & ~uint16_t(0x0080); }
uint16_t external_interrupt_vector() const { return m_int_vector | uint16_t(0x0080); }
void set_interrupt_request_line();
- void timer_start(uint8_t value);
+ virtual void timer_start(uint8_t value);
devcb_write_line m_int_req_callback;
devcb_write_line m_pri_out_callback;
device_irq_acknowledge_delegate m_int_daisy_chain_callback;
uint16_t m_int_vector; // Bit 7 is set to 0 for timer interrupts, 1 for external interrupts
- bool m_external_enable;
- bool m_timer_enable;
+ u8 m_prescaler;
+ bool m_external_int_enable;
+ bool m_timer_int_enable;
bool m_request_flipflop;
@@ -96,8 +116,66 @@ private:
uint8_t m_value_to_cycle[0x100];
};
+class f3851_device : public f3853_device
+{
+public:
+ f3851_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+
+ // interrupt vector is a mask option on 3851 and 3856
+ void set_int_vector(u16 vector) { m_int_vector = vector; }
+
+ // bidirectional I/O ports A and B
+ auto read_a() { return m_read_port[0].bind(); }
+ auto read_b() { return m_read_port[1].bind(); }
+ auto write_a() { return m_write_port[0].bind(); }
+ auto write_b() { return m_write_port[1].bind(); }
+
+ virtual DECLARE_READ8_MEMBER(read) override;
+ virtual DECLARE_WRITE8_MEMBER(write) override;
+
+protected:
+ f3851_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock);
+
+ virtual void device_resolve_objects() override;
+
+ devcb_read8 m_read_port[2];
+ devcb_write8 m_write_port[2];
+};
+
+class f3856_device : public f3851_device
+{
+public:
+ f3856_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+
+ virtual DECLARE_READ8_MEMBER(read) override;
+ virtual DECLARE_WRITE8_MEMBER(write) override;
+
+ virtual TIMER_CALLBACK_MEMBER(timer_callback) override;
+
+protected:
+ f3856_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock);
+
+ virtual void device_start() override;
+
+ virtual void timer_start(uint8_t value) override;
+
+ u8 m_timer_count;
+ u8 m_timer_modulo;
+ bool m_timer_start;
+};
+
+class f38t56_device : public f3856_device
+{
+public:
+ f38t56_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+
+ virtual DECLARE_WRITE8_MEMBER(write) override;
+};
// device type definition
DECLARE_DEVICE_TYPE(F3853, f3853_device)
+DECLARE_DEVICE_TYPE(F3851, f3851_device)
+DECLARE_DEVICE_TYPE(F3856, f3856_device)
+DECLARE_DEVICE_TYPE(F38T56, f38t56_device)
#endif // MAME_MACHINE_F3853_H
diff --git a/src/devices/machine/fdc37c665gt.cpp b/src/devices/machine/fdc37c665gt.cpp
index 4c6f23651db..f2df880d2e8 100644
--- a/src/devices/machine/fdc37c665gt.cpp
+++ b/src/devices/machine/fdc37c665gt.cpp
@@ -49,9 +49,10 @@ void fdc37c665gt_device::device_start()
{
}
-MACHINE_CONFIG_START(fdc37c665gt_device::device_add_mconfig)
- MCFG_DEVICE_ADD("uart1", NS16550, XTAL(24'000'000)/13)
- MCFG_DEVICE_ADD("uart2", NS16550, XTAL(24'000'000)/13)
-MACHINE_CONFIG_END
+void fdc37c665gt_device::device_add_mconfig(machine_config &config)
+{
+ NS16550(config, m_uart1, XTAL(24'000'000)/13);
+ NS16550(config, m_uart2, XTAL(24'000'000)/13);
+}
DEFINE_DEVICE_TYPE(FDC37C665GT, fdc37c665gt_device, "fdc37c665gt", "FDC37C665GT")
diff --git a/src/devices/machine/fdc37c93x.cpp b/src/devices/machine/fdc37c93x.cpp
index 05c87fd38ef..8ff5afc76d4 100644
--- a/src/devices/machine/fdc37c93x.cpp
+++ b/src/devices/machine/fdc37c93x.cpp
@@ -639,12 +639,12 @@ void fdc37c93x_device::map_rtc(address_map &map)
READ8_MEMBER(fdc37c93x_device::rtc_read)
{
- return ds12885_rtcdev->read(space, offset, mem_mask);
+ return ds12885_rtcdev->read(offset);
}
WRITE8_MEMBER(fdc37c93x_device::rtc_write)
{
- ds12885_rtcdev->write(space, offset, data, mem_mask);
+ ds12885_rtcdev->write(offset, data);
}
void fdc37c93x_device::map_rtc_addresses()
diff --git a/src/devices/machine/gen_fifo.h b/src/devices/machine/gen_fifo.h
index 4db8a75d8c1..0ef98fb20c3 100644
--- a/src/devices/machine/gen_fifo.h
+++ b/src/devices/machine/gen_fifo.h
@@ -72,13 +72,6 @@
*/
-#define MCFG_GENERIC_FIFO_EMPTY_CALLBACK(_devcb) \
- downcast<screen_device &>(*device).set_empty_cb(DEVCB_##_devcb);
-
-#define MCFG_GENERIC_FIFO_FULL_CALLBACK(_devcb) \
- downcast<screen_device &>(*device).set_full_cb(DEVCB_##_devcb);
-
-
template<typename T> class generic_fifo_device_base : public device_t {
public:
/* The general setup. Call be called multiple times, clears the fifo. */
@@ -118,8 +111,8 @@ public:
void clear();
/* Callbacks signalling empty (true)/nonempty (false) and full (true)/nonfull (false) */
- template<class Object> devcb_base &set_empty_cb(Object &&object) { return m_empty_cb.set_callback(std::forward<Object>(object)); }
- template<class Object> devcb_base &set_full_cb(Object &&object) { return m_full_cb.set_callback(std::forward<Object>(object)); }
+ auto empty_cb() { return m_empty_cb.bind(); }
+ auto full_cb() { return m_full_cb.bind(); }
/* Get the fifo current size - Note that real hardware usually
can't do that. May be bigger that the fifo size if some extra
diff --git a/src/devices/machine/genpc.cpp b/src/devices/machine/genpc.cpp
index 269c1915bb0..e626bf96b30 100644
--- a/src/devices/machine/genpc.cpp
+++ b/src/devices/machine/genpc.cpp
@@ -135,6 +135,8 @@ WRITE_LINE_MEMBER( ibm5160_mb_device::pc_dma8237_out_eop )
void ibm5160_mb_device::pc_select_dma_channel(int channel, bool state)
{
+ m_isabus->dack_line_w(channel, state);
+
if(!state) {
m_dma_channel = channel;
if(m_cur_eop)
@@ -393,8 +395,16 @@ WRITE8_MEMBER( ibm5160_mb_device::pc_ppi_portb_w )
WRITE8_MEMBER( ibm5160_mb_device::nmi_enable_w )
{
m_nmi_enabled = BIT(data,7);
- m_isabus->set_nmi_state(m_nmi_enabled);
+ if (!m_nmi_enabled)
+ m_maincpu->set_input_line(INPUT_LINE_NMI, CLEAR_LINE);
+}
+
+WRITE_LINE_MEMBER( ibm5160_mb_device::iochck_w )
+{
+ if (m_nmi_enabled && !state)
+ m_maincpu->set_input_line(INPUT_LINE_NMI, ASSERT_LINE);
}
+
//**************************************************************************
// GLOBAL VARIABLES
//**************************************************************************
@@ -410,8 +420,9 @@ DEFINE_DEVICE_TYPE(IBM5160_MOTHERBOARD, ibm5160_mb_device, "ibm5160_mb", "IBM 51
// device_add_mconfig - add device configuration
//-------------------------------------------------
-MACHINE_CONFIG_START(ibm5160_mb_device::device_add_mconfig)
- PIT8253(config, m_pit8253, 0);
+void ibm5160_mb_device::device_add_mconfig(machine_config &config)
+{
+ PIT8253(config, m_pit8253);
m_pit8253->set_clk<0>(XTAL(14'318'181)/12.0); // heartbeat IRQ
m_pit8253->out_handler<0>().set(m_pic8259, FUNC(pic8259_device::ir0_w));
m_pit8253->set_clk<1>(XTAL(14'318'181)/12.0); // DRAM refresh
@@ -436,7 +447,7 @@ MACHINE_CONFIG_START(ibm5160_mb_device::device_add_mconfig)
m_dma8237->out_dack_callback<2>().set(FUNC(ibm5160_mb_device::pc_dack2_w));
m_dma8237->out_dack_callback<3>().set(FUNC(ibm5160_mb_device::pc_dack3_w));
- PIC8259(config, m_pic8259, 0);
+ PIC8259(config, m_pic8259);
m_pic8259->out_int_callback().set(FUNC(ibm5160_mb_device::pic_int_w));
I8255A(config, m_ppi8255, 0);
@@ -445,7 +456,8 @@ MACHINE_CONFIG_START(ibm5160_mb_device::device_add_mconfig)
m_ppi8255->in_pc_callback().set(FUNC(ibm5160_mb_device::pc_ppi_portc_r));
ISA8(config, m_isabus, 0);
- m_isabus->set_cputag(":maincpu");
+ m_isabus->set_memspace(":maincpu", AS_PROGRAM);
+ m_isabus->set_iospace(":maincpu", AS_IO);
m_isabus->irq2_callback().set(m_pic8259, FUNC(pic8259_device::ir2_w));
m_isabus->irq3_callback().set(m_pic8259, FUNC(pic8259_device::ir3_w));
m_isabus->irq4_callback().set(m_pic8259, FUNC(pic8259_device::ir4_w));
@@ -455,15 +467,16 @@ MACHINE_CONFIG_START(ibm5160_mb_device::device_add_mconfig)
m_isabus->drq1_callback().set(m_dma8237, FUNC(am9517a_device::dreq1_w));
m_isabus->drq2_callback().set(m_dma8237, FUNC(am9517a_device::dreq2_w));
m_isabus->drq3_callback().set(m_dma8237, FUNC(am9517a_device::dreq3_w));
+ m_isabus->iochck_callback().set(FUNC(ibm5160_mb_device::iochck_w));
- MCFG_DEVICE_ADD("pc_kbdc", PC_KBDC, 0)
- MCFG_PC_KBDC_OUT_CLOCK_CB(WRITELINE(*this, ibm5160_mb_device, keyboard_clock_w))
- MCFG_PC_KBDC_OUT_DATA_CB(WRITELINE(*this, ibm5160_mb_device, keyboard_data_w))
+ PC_KBDC(config, m_pc_kbdc, 0);
+ m_pc_kbdc->out_clock_cb().set(FUNC(ibm5160_mb_device::keyboard_clock_w));
+ m_pc_kbdc->out_data_cb().set(FUNC(ibm5160_mb_device::keyboard_data_w));
/* sound hardware */
SPEAKER(config, "mono").front_center();
SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 1.00);
-MACHINE_CONFIG_END
+}
static INPUT_PORTS_START( ibm5160_mb )
@@ -595,18 +608,18 @@ DEFINE_DEVICE_TYPE(IBM5150_MOTHERBOARD, ibm5150_mb_device, "ibm5150_mb", "IBM 51
// device_add_mconfig - add device configuration
//-------------------------------------------------
-MACHINE_CONFIG_START(ibm5150_mb_device::device_add_mconfig)
+void ibm5150_mb_device::device_add_mconfig(machine_config &config)
+{
ibm5160_mb_device::device_add_mconfig(config);
- MCFG_DEVICE_MODIFY("pc_kbdc")
- MCFG_PC_KBDC_OUT_CLOCK_CB(WRITELINE(*this, ibm5150_mb_device, keyboard_clock_w))
+ subdevice<pc_kbdc_device>("pc_kbdc")->out_clock_cb().set(FUNC(ibm5150_mb_device::keyboard_clock_w));
m_ppi8255->out_pb_callback().set(FUNC(ibm5150_mb_device::pc_ppi_portb_w));
m_ppi8255->in_pc_callback().set(FUNC(ibm5150_mb_device::pc_ppi_portc_r));
- MCFG_CASSETTE_ADD( "cassette" )
- MCFG_CASSETTE_DEFAULT_STATE(CASSETTE_PLAY | CASSETTE_MOTOR_DISABLED | CASSETTE_SPEAKER_ENABLED)
-MACHINE_CONFIG_END
+ CASSETTE(config, m_cassette);
+ m_cassette->set_default_state(CASSETTE_PLAY | CASSETTE_MOTOR_DISABLED | CASSETTE_SPEAKER_ENABLED);
+}
//**************************************************************************
// LIVE DEVICE
@@ -772,15 +785,15 @@ DEFINE_DEVICE_TYPE(EC1841_MOTHERBOARD, ec1841_mb_device, "ec1841_mb", "EC-1840 m
// device_add_mconfig - add device configuration
//-------------------------------------------------
-MACHINE_CONFIG_START(ec1841_mb_device::device_add_mconfig)
+void ec1841_mb_device::device_add_mconfig(machine_config &config)
+{
ibm5160_mb_device::device_add_mconfig(config);
m_ppi8255->out_pb_callback().set(FUNC(ec1841_mb_device::pc_ppi_portb_w));
m_ppi8255->in_pc_callback().set(FUNC(ec1841_mb_device::pc_ppi_portc_r));
- MCFG_DEVICE_MODIFY("pc_kbdc")
- MCFG_PC_KBDC_OUT_CLOCK_CB(WRITELINE(*this, ec1841_mb_device, keyboard_clock_w))
-MACHINE_CONFIG_END
+ subdevice<pc_kbdc_device>("pc_kbdc")->out_clock_cb().set(FUNC(ec1841_mb_device::keyboard_clock_w));
+}
static INPUT_PORTS_START( ec1841_mb )
PORT_START("DSW0") /* SA1 */
@@ -898,12 +911,13 @@ pc_noppi_mb_device::pc_noppi_mb_device(const machine_config &mconfig, device_typ
// device_add_mconfig - add device configuration
//-------------------------------------------------
-MACHINE_CONFIG_START(pc_noppi_mb_device::device_add_mconfig)
+void pc_noppi_mb_device::device_add_mconfig(machine_config &config)
+{
ibm5160_mb_device::device_add_mconfig(config);
- MCFG_DEVICE_REMOVE("pc_kbdc")
- MCFG_DEVICE_REMOVE("ppi8255")
-MACHINE_CONFIG_END
+ config.device_remove("pc_kbdc");
+ config.device_remove("ppi8255");
+}
static INPUT_PORTS_START( pc_noppi_mb )
INPUT_PORTS_END
diff --git a/src/devices/machine/genpc.h b/src/devices/machine/genpc.h
index 4c412a9a720..e222b975873 100644
--- a/src/devices/machine/genpc.h
+++ b/src/devices/machine/genpc.h
@@ -23,11 +23,6 @@
#include "bus/pc_kbd/pc_kbdc.h"
-#define MCFG_IBM5160_MOTHERBOARD_ADD(_tag, _cputag) \
- MCFG_DEVICE_ADD(_tag, IBM5160_MOTHERBOARD, 0) \
- downcast<ibm5160_mb_device &>(*device).set_cputag(_cputag); \
- (*device->subdevice<isa8_device>("isa")).set_cputag(_cputag);
-
// ======================> ibm5160_mb_device
class ibm5160_mb_device : public device_t
{
@@ -36,7 +31,12 @@ public:
ibm5160_mb_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
// inline configuration
- void set_cputag(const char *tag) { m_maincpu.set_tag(tag); }
+ template <typename T> void set_cputag(T &&tag)
+ {
+ m_maincpu.set_tag(std::forward<T>(tag));
+ subdevice<isa8_device>("isa")->set_memspace(std::forward<T>(tag), AS_PROGRAM);
+ subdevice<isa8_device>("isa")->set_iospace(std::forward<T>(tag), AS_IO);
+ }
void map(address_map &map);
@@ -119,6 +119,7 @@ protected:
DECLARE_WRITE_LINE_MEMBER( pc_dack1_w );
DECLARE_WRITE_LINE_MEMBER( pc_dack2_w );
DECLARE_WRITE_LINE_MEMBER( pc_dack3_w );
+ DECLARE_WRITE_LINE_MEMBER( iochck_w );
void pc_select_dma_channel(int channel, bool state);
};
@@ -128,11 +129,6 @@ protected:
DECLARE_DEVICE_TYPE(IBM5160_MOTHERBOARD, ibm5160_mb_device)
-#define MCFG_IBM5150_MOTHERBOARD_ADD(_tag, _cputag) \
- MCFG_DEVICE_ADD(_tag, IBM5150_MOTHERBOARD, 0) \
- downcast<ibm5150_mb_device &>(*device).set_cputag(_cputag); \
- (*device->subdevice<isa8_device>("isa")).set_cputag(_cputag);
-
// ======================> ibm5150_mb_device
class ibm5150_mb_device : public ibm5160_mb_device
{
@@ -162,12 +158,6 @@ private:
// device type definition
DECLARE_DEVICE_TYPE(IBM5150_MOTHERBOARD, ibm5150_mb_device)
-
-#define MCFG_EC1841_MOTHERBOARD_ADD(_tag, _cputag) \
- MCFG_DEVICE_ADD(_tag, EC1841_MOTHERBOARD, 0) \
- downcast<ec1841_mb_device &>(*device).set_cputag(_cputag); \
- (*device->subdevice<isa8_device>("isa")).set_cputag(_cputag);
-
class ec1841_mb_device : public ibm5160_mb_device
{
public:
@@ -189,16 +179,13 @@ private:
DECLARE_DEVICE_TYPE(EC1841_MOTHERBOARD, ec1841_mb_device)
-#define MCFG_PCNOPPI_MOTHERBOARD_ADD(_tag, _cputag) \
- MCFG_DEVICE_ADD(_tag, PCNOPPI_MOTHERBOARD, 0) \
- downcast<pc_noppi_mb_device &>(*device).set_cputag(_cputag); \
- (*device->subdevice<isa8_device>("isa")).set_cputag(_cputag);
class pc_noppi_mb_device : public ibm5160_mb_device
{
public:
// construction/destruction
pc_noppi_mb_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+
uint8_t pit_out2() { return m_pit_out2; } // helper for near-clones with multifunction ics instead of 8255s
void map(address_map &map);
diff --git a/src/devices/machine/hdc92x4.cpp b/src/devices/machine/hdc92x4.cpp
index e7c42d31452..4354711738f 100644
--- a/src/devices/machine/hdc92x4.cpp
+++ b/src/devices/machine/hdc92x4.cpp
@@ -4265,7 +4265,7 @@ uint16_t hdc92x4_device::encode_a1_hd()
Read a byte of data from the controller
The address (offset) encodes the C/D* line (command and /data)
*/
-READ8_MEMBER( hdc92x4_device::read )
+uint8_t hdc92x4_device::read(offs_t offset)
{
uint8_t reply;
if ((offset & 1) == 0)
@@ -4300,7 +4300,7 @@ READ8_MEMBER( hdc92x4_device::read )
The operation terminates immediately, and the controller picks up the
values stored in this phase at a later time.
*/
-WRITE8_MEMBER( hdc92x4_device::write )
+void hdc92x4_device::write(offs_t offset, uint8_t data)
{
if ((offset & 1) == 0)
{
diff --git a/src/devices/machine/hdc92x4.h b/src/devices/machine/hdc92x4.h
index e0c25d1a524..c4850ffa103 100644
--- a/src/devices/machine/hdc92x4.h
+++ b/src/devices/machine/hdc92x4.h
@@ -45,8 +45,8 @@ public:
};
// Accessors from the CPU side
- DECLARE_READ8_MEMBER( read );
- DECLARE_WRITE8_MEMBER( write );
+ uint8_t read(offs_t offset);
+ void write(offs_t offset, uint8_t data);
DECLARE_WRITE_LINE_MEMBER( reset );
DECLARE_WRITE_LINE_MEMBER( dmaack );
diff --git a/src/devices/machine/i2cmem.cpp b/src/devices/machine/i2cmem.cpp
index 94670ff5326..34e75569a49 100644
--- a/src/devices/machine/i2cmem.cpp
+++ b/src/devices/machine/i2cmem.cpp
@@ -58,8 +58,14 @@ static inline void ATTR_PRINTF( 3, 4 ) verboselog( device_t *device, int n_level
//**************************************************************************
// device type definition
-DEFINE_DEVICE_TYPE(I2CMEM, i2cmem_device, "i2cmem", "I2C Memory")
-DEFINE_DEVICE_TYPE(X2404P, x2404p_device, "x2404p", "X2404P I2C Memory")
+DEFINE_DEVICE_TYPE(I2CMEM, i2cmem_device, "i2cmem", "I2C Memory")
+DEFINE_DEVICE_TYPE(I2C_X2404P, i2c_x2404p_device, "x2404p", "X2404P I2C Memory")
+DEFINE_DEVICE_TYPE(I2C_24C01, i2c_24c01_device, "24c01", "24C01 I2C Memory")
+DEFINE_DEVICE_TYPE(I2C_24C02, i2c_24c02_device, "24c02", "24C02 I2C Memory")
+DEFINE_DEVICE_TYPE(I2C_24C08, i2c_24c08_device, "24c08", "24C08 I2C Memory")
+DEFINE_DEVICE_TYPE(I2C_24C16, i2c_24c16_device, "24c16", "24C16 I2C Memory")
+DEFINE_DEVICE_TYPE(I2C_24C16A, i2c_24c16a_device, "24c16a", "24C16A I2C Memory")
+DEFINE_DEVICE_TYPE(I2C_24C64, i2c_24c64_device, "24c64", "24C64 I2C Memory")
//**************************************************************************
// LIVE DEVICE
@@ -69,36 +75,76 @@ DEFINE_DEVICE_TYPE(X2404P, x2404p_device, "x2404p", "X2404P I2C Memory")
// i2cmem_device - constructor
//-------------------------------------------------
-i2cmem_device::i2cmem_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock)
- : device_t(mconfig, type, tag, owner, clock),
+i2cmem_device::i2cmem_device(
+ const machine_config &mconfig,
+ device_type type,
+ const char *tag,
+ device_t *owner,
+ uint32_t clock,
+ int page_size,
+ int data_size) :
+ device_t(mconfig, type, tag, owner, clock),
device_nvram_interface(mconfig, *this),
m_region(*this, DEVICE_SELF),
- m_slave_address( I2CMEM_SLAVE_ADDRESS ),
- m_page_size( 0 ),
- m_data_size( 0 ),
- m_scl( 0 ),
- m_sdaw( 0 ),
- m_e0( 0 ),
- m_e1( 0 ),
- m_e2( 0 ),
- m_wc( 0 ),
- m_sdar( 1 ),
- m_state( STATE_IDLE ),
- m_shift( 0 ),
- m_byteaddr( 0 )
+ m_slave_address(I2CMEM_SLAVE_ADDRESS),
+ m_page_size(page_size),
+ m_data_size(data_size),
+ m_scl(0),
+ m_sdaw(0),
+ m_e0(0),
+ m_e1(0),
+ m_e2(0),
+ m_wc(0),
+ m_sdar(1),
+ m_state(STATE_IDLE),
+ m_shift(0),
+ m_byteaddr(0),
+ m_page_offset(0),
+ m_page_written_size(0),
+ m_in_write(false)
{
+ // these memories work off the I2C clock only
+ assert(!clock);
}
-i2cmem_device::i2cmem_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
- : i2cmem_device(mconfig, I2CMEM, tag, owner, clock)
+i2cmem_device::i2cmem_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) :
+ i2cmem_device(mconfig, I2CMEM, tag, owner, clock, 0, 0)
{
}
-x2404p_device::x2404p_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
- : i2cmem_device(mconfig, X2404P, tag, owner, clock)
+i2c_x2404p_device::i2c_x2404p_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) :
+ i2cmem_device(mconfig, I2C_X2404P, tag, owner, clock, 8, 0x200)
+{
+}
+
+i2c_24c01_device::i2c_24c01_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) :
+ i2cmem_device(mconfig, I2C_24C01, tag, owner, clock, 4, 0x80)
+{
+}
+
+i2c_24c02_device::i2c_24c02_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) :
+ i2cmem_device(mconfig, I2C_24C02, tag, owner, clock, 4, 0x100)
+{
+}
+
+i2c_24c08_device::i2c_24c08_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) :
+ i2cmem_device(mconfig, I2C_24C08, tag, owner, clock, 0, 0x400)
+{
+}
+
+i2c_24c16_device::i2c_24c16_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) :
+ i2cmem_device(mconfig, I2C_24C16, tag, owner, clock, 8, 0x800)
+{
+}
+
+i2c_24c16a_device::i2c_24c16a_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) :
+ i2cmem_device(mconfig, I2C_24C16A, tag, owner, clock, 0, 0x800)
+{
+}
+
+i2c_24c64_device::i2c_24c64_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) :
+ i2cmem_device(mconfig, I2C_24C64, tag, owner, clock, 8, 0x2000)
{
- set_page_size(8);
- set_data_size(0x200);
}
//-------------------------------------------------
@@ -122,6 +168,9 @@ void i2cmem_device::device_start()
save_item( NAME(m_shift) );
save_item( NAME(m_devsel) );
save_item( NAME(m_byteaddr) );
+ save_item( NAME(m_in_write) );
+ save_item( NAME(m_page_offset) );
+ save_item( NAME(m_page_written_size) );
save_pointer( &m_data[0], "m_data", m_data_size );
if ( m_page_size > 0 )
{
@@ -136,6 +185,7 @@ void i2cmem_device::device_start()
void i2cmem_device::device_reset()
{
+ m_in_write = false;
}
@@ -237,6 +287,15 @@ WRITE_LINE_MEMBER( i2cmem_device::write_sda )
{
if( m_sdaw )
{
+ if( m_in_write )
+ {
+ int base = data_offset();
+ int root = base & ~( m_page_size - 1);
+ for( int i=0; i < m_page_written_size; i++)
+ m_data[root | ((base + i) & (m_page_size - 1))] = m_page[i];
+ m_in_write = false;
+ verboselog( this, 1, "data[ %04x to %04x ] = %x bytes\n", base, root | ((base + m_page_written_size - 1) & (m_page_size - 1)), m_page_written_size );
+ }
verboselog( this, 1, "stop\n" );
m_state = STATE_IDLE;
}
@@ -301,6 +360,7 @@ WRITE_LINE_MEMBER( i2cmem_device::write_scl )
case STATE_BYTEADDR:
m_byteaddr = m_shift;
m_page_offset = 0;
+ m_page_written_size = 0;
verboselog( this, 1, "byteaddr %02x\n", m_byteaddr );
@@ -315,23 +375,16 @@ WRITE_LINE_MEMBER( i2cmem_device::write_scl )
}
else if( m_page_size > 0 )
{
+ m_in_write = true;
m_page[ m_page_offset ] = m_shift;
verboselog( this, 1, "page[ %04x ] <- %02x\n", m_page_offset, m_page[ m_page_offset ] );
m_page_offset++;
if( m_page_offset == m_page_size )
- {
- int offset = data_offset() & ~( m_page_size - 1 );
-
- verboselog( this, 1, "data[ %04x to %04x ] = page\n", offset, offset + m_page_size - 1 );
-
- for( int i = 0; i < m_page_size; i++ )
- {
- m_data[offset + i] = m_page[ i ];
- }
-
m_page_offset = 0;
- }
+ m_page_written_size++;
+ if( m_page_written_size > m_page_size)
+ m_page_written_size = m_page_size;
}
else
{
diff --git a/src/devices/machine/i2cmem.h b/src/devices/machine/i2cmem.h
index d67fa463c2e..c912709871d 100644
--- a/src/devices/machine/i2cmem.h
+++ b/src/devices/machine/i2cmem.h
@@ -23,61 +23,6 @@
//**************************************************************************
-// INTERFACE CONFIGURATION MACROS
-//**************************************************************************
-
-#define MCFG_I2CMEM_ADD( _tag ) \
- MCFG_DEVICE_ADD( _tag, I2CMEM, 0 )
-
-#define MCFG_I2CMEM_ADDRESS( address ) \
- downcast<i2cmem_device &>(*device).set_address(address);
-#define MCFG_I2CMEM_PAGE_SIZE( page_size ) \
- downcast<i2cmem_device &>(*device).set_page_size(page_size);
-#define MCFG_I2CMEM_DATA_SIZE(data_size) \
- downcast<i2cmem_device &>(*device).set_data_size(data_size);
-#define MCFG_I2CMEM_E0(e0) \
- downcast<i2cmem_device &>(*device).set_e0(e0);
-#define MCFG_I2CMEM_E1(e1) \
- downcast<i2cmem_device &>(*device).set_e1(e1);
-#define MCFG_I2CMEM_E2(e2) \
- downcast<i2cmem_device &>(*device).set_e2(e2);
-#define MCFG_I2CMEM_WC(wc) \
- downcast<i2cmem_device &>(*device).set_wc(wc);
-
-#define MCFG_X2404P_ADD( _tag ) \
- MCFG_I2CMEM_ADD( _tag ) \
- MCFG_I2CMEM_PAGE_SIZE(8) \
- MCFG_I2CMEM_DATA_SIZE(0x200)
-
-#define MCFG_24C01_ADD( _tag ) \
- MCFG_I2CMEM_ADD( _tag ) \
- MCFG_I2CMEM_PAGE_SIZE(4) \
- MCFG_I2CMEM_DATA_SIZE(0x80)
-
-#define MCFG_24C02_ADD( _tag ) \
- MCFG_I2CMEM_ADD( _tag ) \
- MCFG_I2CMEM_PAGE_SIZE(4) \
- MCFG_I2CMEM_DATA_SIZE(0x100)
-
-#define MCFG_24C08_ADD( _tag ) \
- MCFG_I2CMEM_ADD( _tag ) \
- MCFG_I2CMEM_DATA_SIZE(0x400)
-
-#define MCFG_24C16_ADD( _tag ) \
- MCFG_I2CMEM_ADD( _tag ) \
- MCFG_I2CMEM_PAGE_SIZE(8) \
- MCFG_I2CMEM_DATA_SIZE(0x800)
-
-#define MCFG_24C16A_ADD( _tag ) \
- MCFG_I2CMEM_ADD( _tag ) \
- MCFG_I2CMEM_DATA_SIZE(0x800)
-
-#define MCFG_24C64_ADD( _tag ) \
- MCFG_I2CMEM_ADD( _tag ) \
- MCFG_I2CMEM_PAGE_SIZE(8) \
- MCFG_I2CMEM_DATA_SIZE(0x2000)
-
-//**************************************************************************
// TYPE DEFINITIONS
//**************************************************************************
@@ -110,7 +55,7 @@ public:
protected:
// construction/destruction
- i2cmem_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock = 0);
+ i2cmem_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock, int page_size, int data_size);
// device-level overrides
virtual void device_start() override;
@@ -147,17 +92,33 @@ protected:
int m_byteaddr;
std::vector<uint8_t> m_page;
int m_page_offset;
+ int m_page_written_size;
+ bool m_in_write;
};
-class x2404p_device : public i2cmem_device
-{
-public:
- // construction/destruction
- x2404p_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock = 0);
-};
+#define DECLARE_I2C_DEVICE(name) \
+ class i2c_##name##_device : public i2cmem_device \
+ { \
+ public: \
+ i2c_##name##_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock = 0); \
+ };
+
+DECLARE_I2C_DEVICE(x2404p)
+DECLARE_I2C_DEVICE(24c01)
+DECLARE_I2C_DEVICE(24c02)
+DECLARE_I2C_DEVICE(24c08)
+DECLARE_I2C_DEVICE(24c16);
+DECLARE_I2C_DEVICE(24c16a);
+DECLARE_I2C_DEVICE(24c64);
// device type definition
-DECLARE_DEVICE_TYPE(I2CMEM, i2cmem_device)
-DECLARE_DEVICE_TYPE(X2404P, x2404p_device)
+DECLARE_DEVICE_TYPE(I2CMEM, i2cmem_device)
+DECLARE_DEVICE_TYPE(I2C_X2404P, i2c_x2404p_device)
+DECLARE_DEVICE_TYPE(I2C_24C01, i2c_24c01_device)
+DECLARE_DEVICE_TYPE(I2C_24C02, i2c_24c02_device)
+DECLARE_DEVICE_TYPE(I2C_24C08, i2c_24c08_device)
+DECLARE_DEVICE_TYPE(I2C_24C16, i2c_24c16_device)
+DECLARE_DEVICE_TYPE(I2C_24C16A, i2c_24c16a_device)
+DECLARE_DEVICE_TYPE(I2C_24C64, i2c_24c64_device)
#endif // MAME_MACHINE_I2CMEM_H
diff --git a/src/devices/machine/i7220.cpp b/src/devices/machine/i7220.cpp
index 8543d9f61f2..0e86dc081bb 100644
--- a/src/devices/machine/i7220.cpp
+++ b/src/devices/machine/i7220.cpp
@@ -29,17 +29,16 @@
#include "i7220.h"
-#define VERBOSE_DBG 2 /* general debug messages */
+//#define LOG_GENERAL (1U << 0) //defined in logmacro.h already
+#define LOG_REGISTER (1U << 1)
+#define LOG_DEBUG (1U << 2)
-#define DBG_LOG(N,M,A) \
- do { \
- if(VERBOSE_DBG>=N) \
- { \
- if( M ) \
- logerror("%11.6f at %s: %-10s",machine().time().as_double(),machine().describe_context(),(char*)M ); \
- logerror A; \
- } \
- } while (0)
+//#define VERBOSE (LOG_DEBUG)
+//#define LOG_OUTPUT_FUNC printf
+#include "logmacro.h"
+
+#define LOGREG(...) LOGMASKED(LOG_REGISTER, __VA_ARGS__)
+#define LOGDBG(...) LOGMASKED(LOG_DEBUG, __VA_ARGS__)
// device type definition
@@ -224,8 +223,8 @@ void i7220_device::start_command(int cmd)
// NFC bits in BLR MSB must be set to 0001 before issuing this command.
// MBM GROUP SELECT bits in the AR must select the last MBM in the system.
case C_INIT:
- DBG_LOG(1, "BMC", ("INIT: BLR %04x (NFC %d pages %d) AR %04x (MBM %d addr %03x) ER %02d\n",
- m_blr, blr_nfc, blr_count, m_ar, ar_mbm, ar_addr, m_regs[R_ER]));
+ LOG("BMC INIT: BLR %04x (NFC %d pages %d) AR %04x (MBM %d addr %03x) ER %02d\n",
+ m_blr, blr_nfc, blr_count, m_ar, ar_mbm, ar_addr, m_regs[R_ER]);
if (blr_nfc != 2)
{
command_fail_start(bi);
@@ -242,8 +241,8 @@ void i7220_device::start_command(int cmd)
// all parametric registers must be properly set up before issuing Read Bubble Data command
case C_READ:
- DBG_LOG(1, "BMC", ("RBD: BLR %04x (NFC %d pages %d) AR %04x (MBM %d addr %03x) ER %02d\n",
- m_blr, blr_nfc, blr_count, m_ar, ar_mbm, ar_addr, m_regs[R_ER]));
+ LOG("BMC RBD: BLR %04x (NFC %d pages %d) AR %04x (MBM %d addr %03x) ER %02d\n",
+ m_blr, blr_nfc, blr_count, m_ar, ar_mbm, ar_addr, m_regs[R_ER]);
if (ar_mbm >= m_data_size || blr_nfc != 2)
{
command_fail_start(bi);
@@ -255,8 +254,8 @@ void i7220_device::start_command(int cmd)
break;
case C_WRITE:
- DBG_LOG(1, "BMC", ("WBD: BLR %04x (NFC %d pages %d) AR %04x (MBM %d addr %03x) ER %02d\n",
- m_blr, blr_nfc, blr_count, m_ar, ar_mbm, ar_addr, m_regs[R_ER]));
+ LOG("BMC WBD: BLR %04x (NFC %d pages %d) AR %04x (MBM %d addr %03x) ER %02d\n",
+ m_blr, blr_nfc, blr_count, m_ar, ar_mbm, ar_addr, m_regs[R_ER]);
if (ar_mbm >= m_data_size || blr_nfc != 2)
{
command_fail_start(bi);
@@ -339,7 +338,7 @@ void i7220_device::general_continue(bubble_info &bi)
break;
default:
- DBG_LOG(1,"BMC",("general_continue on unknown main-state %d\n", bi.main_state));
+ LOG("BMC general_continue on unknown main-state %d\n", bi.main_state);
break;
}
}
@@ -389,7 +388,7 @@ void i7220_device::command_fail_continue(bubble_info &bi)
return;
default:
- DBG_LOG(1,"BMC",("fail unknown sub-state %d\n", bi.sub_state));
+ LOG("BMC fail unknown sub-state %d\n", bi.sub_state);
return;
}
}
@@ -423,7 +422,7 @@ void i7220_device::init_continue(bubble_info &bi)
return;
default:
- DBG_LOG(1,"BMC",("init unknown sub-state %d\n", bi.sub_state));
+ LOG("BMC init unknown sub-state %d\n", bi.sub_state);
return;
}
}
@@ -463,7 +462,7 @@ void i7220_device::read_fsa_continue(bubble_info &bi)
return;
default:
- DBG_LOG(1,"BMC",("read fsa unknown sub-state %d\n", bi.sub_state));
+ LOG("BMC read fsa unknown sub-state %d\n", bi.sub_state);
return;
}
}
@@ -497,7 +496,7 @@ void i7220_device::read_data_continue(bubble_info &bi)
break;
case WAIT_FSA_REPLY:
- DBG_LOG(3,"BMC",("read data: ct %02d limit %02d\n", bi.counter, bi.limit));
+ LOGDBG("BMC read data: ct %02d limit %02d\n", bi.counter, bi.limit);
if (bi.counter < bi.limit)
{
for (int a = 0; a < 32; a++)
@@ -515,7 +514,7 @@ void i7220_device::read_data_continue(bubble_info &bi)
return;
default:
- DBG_LOG(1,"BMC",("read data unknown sub-state %d\n", bi.sub_state));
+ LOG("BMC read data unknown sub-state %d\n", bi.sub_state);
return;
}
}
@@ -543,7 +542,7 @@ void i7220_device::write_data_continue(bubble_info &bi)
return;
case WAIT_FIFO:
- DBG_LOG(3,"BMC",("write data: fifo %02d ct %02d limit %02d\n", m_fifo_size, bi.counter, bi.limit));
+ LOGDBG("BMC write data: fifo %02d ct %02d limit %02d\n", m_fifo_size, bi.counter, bi.limit);
if (m_fifo_size >= 32)
{
for (int a = 0; a < 32; a++)
@@ -565,7 +564,7 @@ void i7220_device::write_data_continue(bubble_info &bi)
return;
default:
- DBG_LOG(1,"BMC",("write data unknown sub-state %d\n", bi.sub_state));
+ LOG("BMC write data unknown sub-state %d\n", bi.sub_state);
return;
}
}
@@ -586,14 +585,14 @@ READ8_MEMBER(i7220_device::read)
if (m_rac)
{
data = m_regs[m_rac];
- DBG_LOG(2, "BMC", ("R reg @ %02x == %02x\n", m_rac, data));
+ LOGREG("BMC R reg @ %02x == %02x\n", m_rac, data);
m_rac++;
m_rac &= 15;
}
else
{
data = fifo_pop();
- DBG_LOG(2, "BMC", ("R fifo == %02x\n", data));
+ LOGREG("BMC R fifo == %02x\n", data);
}
break;
@@ -626,8 +625,8 @@ READ8_MEMBER(i7220_device::read)
data |= SR_FIFO;
}
}
- DBG_LOG(2, "BMC", ("R status == %02x (phase %d state %d:%d fifo %d drq %d)\n",
- data, main_phase, bi.main_state, bi.sub_state, m_fifo_size, drq));
+ LOGREG("BMC R status == %02x (phase %d state %d:%d fifo %d drq %d)\n",
+ data, main_phase, bi.main_state, bi.sub_state, m_fifo_size, drq);
if (main_phase == PHASE_RESULT)
{
main_phase = PHASE_IDLE;
@@ -635,7 +634,7 @@ READ8_MEMBER(i7220_device::read)
break;
}
- DBG_LOG(3, "BMC", ("R @ %d == %02x\n", offset, data));
+ LOGDBG("BMC R @ %d == %02x\n", offset, data);
return data;
}
@@ -665,14 +664,14 @@ WRITE8_MEMBER( i7220_device::write )
"Software Reset"
};
- DBG_LOG(3, "BMC", ("W @ %d <- %02x\n", offset, data));
+ LOGDBG("BMC W @ %d <- %02x\n", offset, data);
switch (offset & 1)
{
case 0:
if (m_rac)
{
- DBG_LOG(2, "BMC", ("W reg @ %02x <- %02x\n", m_rac, data));
+ LOGREG("BMC W reg @ %02x <- %02x\n", m_rac, data);
m_regs[m_rac] = data;
update_regs();
m_rac++;
@@ -680,7 +679,7 @@ WRITE8_MEMBER( i7220_device::write )
}
else
{
- DBG_LOG(2, "BMC", ("W fifo <- %02x\n", data));
+ LOGREG("BMC W fifo <- %02x\n", data);
fifo_push(data);
}
break;
@@ -695,7 +694,7 @@ WRITE8_MEMBER( i7220_device::write )
m_cmdr = data & 15;
if (main_phase == PHASE_IDLE)
{
- DBG_LOG(1, "BMC", ("command %02x '%s'\n", data, commands[m_cmdr]));
+ LOG("BMC command %02x '%s'\n", data, commands[m_cmdr]);
main_phase = PHASE_CMD;
start_command(m_cmdr);
}
diff --git a/src/devices/machine/i8087.cpp b/src/devices/machine/i8087.cpp
index 15d5e51bea2..e137ae105e4 100644
--- a/src/devices/machine/i8087.cpp
+++ b/src/devices/machine/i8087.cpp
@@ -169,7 +169,7 @@ DEFINE_DEVICE_TYPE(I8087, i8087_device, "i8087", "Intel 8087")
i8087_device::i8087_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock) :
device_t(mconfig, type, tag, owner, clock),
- device_memory_interface(mconfig, *this),
+ m_space(*this, finder_base::DUMMY_TAG, -1),
m_int_handler(*this),
m_busy_handler(*this)
{
@@ -180,13 +180,6 @@ i8087_device::i8087_device(const machine_config &mconfig, const char *tag, devic
{
}
-device_memory_interface::space_config_vector i8087_device::memory_space_config() const
-{
- return space_config_vector {
- std::make_pair(AS_PROGRAM, &m_space_config),
- };
-}
-
void i8087_device::device_start()
{
save_item(NAME(m_reg[0].high));
@@ -222,11 +215,6 @@ void i8087_device::device_start()
build_opcode_table();
}
-void i8087_device::device_config_complete()
-{
- m_space_config = address_space_config("program", ENDIANNESS_LITTLE, m_data_width, 20);
-}
-
void i8087_device::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr)
{
m_busy_handler(1);
diff --git a/src/devices/machine/i8087.h b/src/devices/machine/i8087.h
index 290b9a95b16..9344ca2e68e 100644
--- a/src/devices/machine/i8087.h
+++ b/src/devices/machine/i8087.h
@@ -10,12 +10,12 @@
DECLARE_DEVICE_TYPE(I8087, i8087_device)
-class i8087_device : public device_t,
- public device_memory_interface
+class i8087_device : public device_t
{
public:
i8087_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
- void set_data_width(u8 data_width) { m_data_width = data_width; }
+ template <class Object> void set_space_88(Object &&tag, int spacenum) { m_space.set_tag(std::forward<Object>(tag), spacenum); m_space.set_data_width(8); }
+ template <class Object> void set_space_86(Object &&tag, int spacenum) { m_space.set_tag(std::forward<Object>(tag), spacenum); m_space.set_data_width(16); }
auto irq() { return m_int_handler.bind(); }
auto busy() { return m_busy_handler.bind(); }
@@ -26,13 +26,13 @@ protected:
i8087_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock);
virtual void device_start() override;
virtual void device_reset() override;
- virtual void device_config_complete() override;
- virtual space_config_vector memory_space_config() const override;
virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override;
private:
+ address_space &space() { return *m_space; }
+
typedef void (i8087_device::*x87_func)(u8 modrm);
- address_space_config m_space_config;
+ required_address_space m_space;
devcb_write_line m_int_handler;
devcb_write_line m_busy_handler;
emu_timer *m_timer;
@@ -45,7 +45,6 @@ private:
u16 m_cw;
u16 m_sw;
u16 m_tw;
- int m_data_width;
int m_icount;
x87_func m_opcode_table_d8[256];
diff --git a/src/devices/machine/i8155.cpp b/src/devices/machine/i8155.cpp
index 779874a244d..b5027368633 100644
--- a/src/devices/machine/i8155.cpp
+++ b/src/devices/machine/i8155.cpp
@@ -406,7 +406,7 @@ void i8155_device::device_timer(emu_timer &timer, device_timer_id id, int param,
// io_r - register read
//-------------------------------------------------
-READ8_MEMBER( i8155_device::io_r )
+uint8_t i8155_device::io_r(offs_t offset)
{
uint8_t data = 0;
@@ -539,7 +539,7 @@ void i8155_device::register_w(int offset, uint8_t data)
// io_w - register write
//-------------------------------------------------
-WRITE8_MEMBER( i8155_device::io_w )
+void i8155_device::io_w(offs_t offset, uint8_t data)
{
register_w(offset, data);
}
@@ -549,7 +549,7 @@ WRITE8_MEMBER( i8155_device::io_w )
// memory_r - internal RAM read
//-------------------------------------------------
-READ8_MEMBER( i8155_device::memory_r )
+uint8_t i8155_device::memory_r(offs_t offset)
{
return m_ram[offset & 0xff];
}
@@ -559,7 +559,7 @@ READ8_MEMBER( i8155_device::memory_r )
// memory_w - internal RAM write
//-------------------------------------------------
-WRITE8_MEMBER( i8155_device::memory_w )
+void i8155_device::memory_w(offs_t offset, uint8_t data)
{
m_ram[offset & 0xff] = data;
}
@@ -569,7 +569,7 @@ WRITE8_MEMBER( i8155_device::memory_w )
// ale_w - address latch write
//-------------------------------------------------
-WRITE8_MEMBER( i8155_device::ale_w )
+void i8155_device::ale_w(offs_t offset, uint8_t data)
{
// I/O / memory select
m_io_m = BIT(offset, 0);
@@ -580,21 +580,21 @@ WRITE8_MEMBER( i8155_device::ale_w )
//-------------------------------------------------
-// read - memory or I/O read
+// data_r - memory or I/O read
//-------------------------------------------------
-READ8_MEMBER( i8155_device::read )
+uint8_t i8155_device::data_r()
{
uint8_t data = 0;
switch (m_io_m)
{
case MEMORY:
- data = memory_r(space, m_ad);
+ data = memory_r(m_ad);
break;
case IO:
- data = io_r(space, m_ad);
+ data = io_r(m_ad);
break;
}
@@ -603,19 +603,19 @@ READ8_MEMBER( i8155_device::read )
//-------------------------------------------------
-// write - memory or I/O write
+// data_w - memory or I/O write
//-------------------------------------------------
-WRITE8_MEMBER( i8155_device::write )
+void i8155_device::data_w(uint8_t data)
{
switch (m_io_m)
{
case MEMORY:
- memory_w(space, m_ad, data);
+ memory_w(m_ad, data);
break;
case IO:
- io_w(space, m_ad, data);
+ io_w(m_ad, data);
break;
}
}
diff --git a/src/devices/machine/i8155.h b/src/devices/machine/i8155.h
index a17692211e6..2d6e49b2063 100644
--- a/src/devices/machine/i8155.h
+++ b/src/devices/machine/i8155.h
@@ -55,15 +55,15 @@ public:
auto out_pc_callback() { return m_out_pc_cb.bind(); }
auto out_to_callback() { return m_out_to_cb.bind(); }
- DECLARE_READ8_MEMBER( io_r );
- DECLARE_WRITE8_MEMBER( io_w );
+ uint8_t io_r(offs_t offset);
+ void io_w(offs_t offset, uint8_t data);
- DECLARE_READ8_MEMBER( memory_r );
- DECLARE_WRITE8_MEMBER( memory_w );
+ uint8_t memory_r(offs_t offset);
+ void memory_w(offs_t offset, uint8_t data);
- DECLARE_WRITE8_MEMBER( ale_w );
- DECLARE_READ8_MEMBER( read );
- DECLARE_WRITE8_MEMBER( write );
+ void ale_w(offs_t offset, uint8_t data);
+ uint8_t data_r();
+ void data_w(uint8_t data);
protected:
i8155_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock);
diff --git a/src/devices/machine/i82357.cpp b/src/devices/machine/i82357.cpp
new file mode 100644
index 00000000000..9b3be9c0905
--- /dev/null
+++ b/src/devices/machine/i82357.cpp
@@ -0,0 +1,307 @@
+// license:BSD-3-Clause
+// copyright-holders:Patrick Mackinlay
+
+/*
+ * An implementation of the Intel 82357 Integrated System Peripheral.
+ *
+ * This device was one part of the 3-chip Intel 82350 EISA bus chipset.
+ *
+ * Sources:
+ *
+ * http://bitsavers.org/components/intel/_dataBooks/1996_Intel_Peripheral_Components.pdf
+ *
+ * TODO
+ * - expose everything to an actual EISA bus
+ * - 32-bit dma functionality
+ *
+ */
+
+#include "emu.h"
+#include "i82357.h"
+
+#define LOG_GENERAL (1U << 0)
+
+//#define VERBOSE (LOG_GENERAL)
+
+#include "logmacro.h"
+
+DEFINE_DEVICE_TYPE(I82357, i82357_device, "i82357", "Intel 82357 Integrated System Peripheral")
+
+i82357_device::i82357_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
+ : device_t(mconfig, I82357, tag, owner, clock)
+ , m_pic(*this, "pic%u", 0)
+ , m_pit(*this, "pit%u", 0)
+ , m_dma(*this, "dma%u", 0)
+ , m_out_rtc(*this)
+ , m_out_nmi(*this)
+ , m_out_spkr(*this)
+{
+}
+
+void i82357_device::device_add_mconfig(machine_config &config)
+{
+ PIC8259(config, m_pic[0], 0);
+ m_pic[0]->in_sp_callback().set_constant(1);
+ m_pic[0]->read_slave_ack_callback().set(
+ [this](offs_t offset)
+ {
+ if (offset == 2)
+ return m_pic[1]->acknowledge();
+
+ return u32(0);
+ });
+
+ PIC8259(config, m_pic[1], 0);
+ m_pic[1]->out_int_callback().set(m_pic[0], FUNC(pic8259_device::ir2_w));
+ m_pic[1]->in_sp_callback().set_constant(0);
+
+ PIT8254(config, m_pit[0], 0);
+ PIT8254(config, m_pit[1], 0);
+
+ // timer 1 counter 0: system timer
+ m_pit[0]->set_clk<0>(clock() / 12);
+ m_pit[0]->out_handler<0>().set(m_pic[0], FUNC(pic8259_device::ir0_w));
+
+ // timer 1 counter 1: refresh request
+ m_pit[0]->set_clk<1>(clock() / 12);
+ m_pit[0]->out_handler<1>().set(
+ [this](int state)
+ {
+ // FIXME: not accurate, but good enough to pass diagnostic
+ if (state)
+ m_nmi_reg ^= NMI_REFRESH;
+
+ m_pit[1]->write_gate2(state);
+ });
+
+ // timer 1 counter 2: speaker
+ m_pit[0]->set_clk<2>(clock() / 12);
+ m_pit[0]->out_handler<2>().set(
+ [this](int state)
+ {
+ if (state)
+ m_nmi_reg |= NMI_T1C2_STATE;
+ else
+ m_nmi_reg &= ~NMI_T1C2_STATE;
+
+ m_out_spkr((m_nmi_reg & NMI_T1C2_STATE) && (m_nmi_reg & NMI_SPEAKER_DATA));
+ });
+
+ // timer 2 counter 0: fail-safe timer
+ m_pit[1]->set_clk<0>(clock() / 48);
+ m_pit[1]->out_handler<0>().set(
+ [this](int state)
+ {
+ if (state && (m_nmi_ext & NMI_EXT_EN_FAILSAFE))
+ {
+ m_nmi_ext |= NMI_EXT_FAILSAFE;
+
+ m_nmi_check->adjust(attotime::zero);
+ }
+ });
+
+ // timer 2 counter 1: does not exist
+
+ // timer 2 counter 2: cpu speed control
+ m_pit[1]->set_clk<2>(8_MHz_XTAL);
+ //m_pit[1]->out_handler<2>().set();
+
+ EISA_DMA(config, m_dma[0], clock() / 3);
+ EISA_DMA(config, m_dma[1], clock() / 3);
+ m_dma[1]->out_dack_callback<0>().set(m_dma[0], FUNC(eisa_dma_device::hack_w)).invert();
+}
+
+void i82357_device::map(address_map &map)
+{
+ map(0x000, 0x00f).rw(m_dma[0], FUNC(eisa_dma_device::read), FUNC(eisa_dma_device::write));
+ map(0x020, 0x021).rw(m_pic[0], FUNC(pic8259_device::read), FUNC(pic8259_device::write));
+ map(0x040, 0x043).rw(m_pit[0], FUNC(pit8254_device::read), FUNC(pit8254_device::write));
+ map(0x048, 0x04b).rw(m_pit[1], FUNC(pit8254_device::read), FUNC(pit8254_device::write));
+
+ // FIXME: also 0x065 - "NMI Status"
+ map(0x061, 0x061).rw(FUNC(i82357_device::nmi_reg_r), FUNC(i82357_device::nmi_reg_w));
+
+ // NMI Enable Register (0x70, 72, 74, 76)
+ map(0x070, 0x077).lw8("nmi_rtc",
+ [this](address_space &space, offs_t offset, u8 data)
+ {
+ m_nmi_enabled = !BIT(data, 7);
+
+ m_out_rtc(space, 0, data & 0x7f);
+
+ m_nmi_check->adjust(attotime::zero);
+ }).umask64(0xff);
+
+ map(0x081, 0x081).rw(m_dma[0], FUNC(eisa_dma_device::get_address_page<2>), FUNC(eisa_dma_device::set_address_page<2>));
+ map(0x082, 0x082).rw(m_dma[0], FUNC(eisa_dma_device::get_address_page<3>), FUNC(eisa_dma_device::set_address_page<3>));
+ map(0x083, 0x083).rw(m_dma[0], FUNC(eisa_dma_device::get_address_page<1>), FUNC(eisa_dma_device::set_address_page<1>));
+ map(0x087, 0x087).rw(m_dma[0], FUNC(eisa_dma_device::get_address_page<0>), FUNC(eisa_dma_device::set_address_page<0>));
+ map(0x089, 0x089).rw(m_dma[1], FUNC(eisa_dma_device::get_address_page<2>), FUNC(eisa_dma_device::set_address_page<2>));
+ map(0x08a, 0x08a).rw(m_dma[1], FUNC(eisa_dma_device::get_address_page<3>), FUNC(eisa_dma_device::set_address_page<3>));
+ map(0x08b, 0x08b).rw(m_dma[1], FUNC(eisa_dma_device::get_address_page<1>), FUNC(eisa_dma_device::set_address_page<1>));
+ map(0x08f, 0x08f).rw(m_dma[1], FUNC(eisa_dma_device::get_address_page<0>), FUNC(eisa_dma_device::set_address_page<0>));
+
+ // TODO: also 0xa4, a8, ac, b0, b4, b8, bc
+ map(0x0a0, 0x0a1).rw(m_pic[1], FUNC(pic8259_device::read), FUNC(pic8259_device::write));
+ map(0x0c0, 0x0df).rw(m_dma[1], FUNC(eisa_dma_device::read), FUNC(eisa_dma_device::write)).umask16(0x00ff);
+
+ map(0x401, 0x401).rw(m_dma[0], FUNC(eisa_dma_device::get_count_high<0>), FUNC(eisa_dma_device::set_count_high<0>));
+ map(0x403, 0x403).rw(m_dma[0], FUNC(eisa_dma_device::get_count_high<1>), FUNC(eisa_dma_device::set_count_high<1>));
+ map(0x405, 0x405).rw(m_dma[0], FUNC(eisa_dma_device::get_count_high<2>), FUNC(eisa_dma_device::set_count_high<2>));
+ map(0x407, 0x407).rw(m_dma[0], FUNC(eisa_dma_device::get_count_high<3>), FUNC(eisa_dma_device::set_count_high<3>));
+
+ //map(0x40a, 0x40a); // DMA1 Set Chaining Mode (w)/Interrupt Status (r)
+ //map(0x40b, 0x40b); // DMA1 Ext Write Mode (w)
+ //map(0x40c, 0x40c); // Chain Buffer Control
+ //map(0x40d, 0x40d); // Stepping Level Register (ro)
+ //map(0x40e, 0x40e); // ISP Test Register
+ //map(0x40f, 0x40f); // ISP Test Register
+
+ map(0x461, 0x461).rw(FUNC(i82357_device::nmi_ext_r), FUNC(i82357_device::nmi_ext_w));
+ map(0x462, 0x462).lw8("nmi_ioport",
+ [this](u8 data)
+ {
+ if (m_nmi_ext & NMI_EXT_EN_IOPORT)
+ {
+ m_nmi_ext |= NMI_EXT_IOPORT;
+
+ m_nmi_check->adjust(attotime::zero);
+ }
+ });
+ //map(0x464, 0x464); // Last 32-bit bus master granted (L)
+
+ map(0x481, 0x481).rw(m_dma[0], FUNC(eisa_dma_device::get_address_page_high<2>), FUNC(eisa_dma_device::set_address_page_high<2>));
+ map(0x482, 0x482).rw(m_dma[0], FUNC(eisa_dma_device::get_address_page_high<3>), FUNC(eisa_dma_device::set_address_page_high<3>));
+ map(0x483, 0x483).rw(m_dma[0], FUNC(eisa_dma_device::get_address_page_high<1>), FUNC(eisa_dma_device::set_address_page_high<1>));
+ map(0x487, 0x487).rw(m_dma[0], FUNC(eisa_dma_device::get_address_page_high<0>), FUNC(eisa_dma_device::set_address_page_high<0>));
+ map(0x489, 0x489).rw(m_dma[1], FUNC(eisa_dma_device::get_address_page_high<2>), FUNC(eisa_dma_device::set_address_page_high<2>));
+ map(0x48a, 0x48a).rw(m_dma[1], FUNC(eisa_dma_device::get_address_page_high<3>), FUNC(eisa_dma_device::set_address_page_high<3>));
+ map(0x48b, 0x48b).rw(m_dma[1], FUNC(eisa_dma_device::get_address_page_high<1>), FUNC(eisa_dma_device::set_address_page_high<1>));
+ map(0x48f, 0x48f).rw(m_dma[1], FUNC(eisa_dma_device::get_address_page_high<0>), FUNC(eisa_dma_device::set_address_page_high<0>));
+
+ map(0x4c2, 0x4c2).rw(m_dma[1], FUNC(eisa_dma_device::get_count_high<0>), FUNC(eisa_dma_device::set_count_high<0>));
+ map(0x4c6, 0x4c6).rw(m_dma[1], FUNC(eisa_dma_device::get_count_high<1>), FUNC(eisa_dma_device::set_count_high<1>));
+ map(0x4ca, 0x4ca).rw(m_dma[1], FUNC(eisa_dma_device::get_count_high<2>), FUNC(eisa_dma_device::set_count_high<2>));
+ map(0x4ce, 0x4ce).rw(m_dma[1], FUNC(eisa_dma_device::get_count_high<3>), FUNC(eisa_dma_device::set_count_high<3>));
+ map(0x4d0, 0x4d1).lrw8("elcr",
+ [this](offs_t offset) { return m_elcr[offset]; },
+ [this](offs_t offset, u8 data) { m_elcr[offset] = data; });
+
+ //map(0x4d4, 0x4d4); // DMA2 Set Chaining Mode
+ //map(0x4d6, 0x4d6); // DMA2 Ext Write Mode Register
+
+ map(0x4e0, 0x4e3).rw(m_dma[0], FUNC(eisa_dma_device::get_stop<0>), FUNC(eisa_dma_device::set_stop<0>));
+ map(0x4e4, 0x4e7).rw(m_dma[0], FUNC(eisa_dma_device::get_stop<1>), FUNC(eisa_dma_device::set_stop<1>));
+ map(0x4e8, 0x4eb).rw(m_dma[0], FUNC(eisa_dma_device::get_stop<2>), FUNC(eisa_dma_device::set_stop<2>));
+ map(0x4ec, 0x4ef).rw(m_dma[0], FUNC(eisa_dma_device::get_stop<3>), FUNC(eisa_dma_device::set_stop<3>));
+
+ map(0x4f0, 0x4f3).rw(m_dma[1], FUNC(eisa_dma_device::get_stop<0>), FUNC(eisa_dma_device::set_stop<0>)); // reserved
+ map(0x4f4, 0x4f7).rw(m_dma[1], FUNC(eisa_dma_device::get_stop<1>), FUNC(eisa_dma_device::set_stop<1>));
+ map(0x4f8, 0x4fb).rw(m_dma[1], FUNC(eisa_dma_device::get_stop<2>), FUNC(eisa_dma_device::set_stop<2>));
+ map(0x4fc, 0x4ff).rw(m_dma[1], FUNC(eisa_dma_device::get_stop<3>), FUNC(eisa_dma_device::set_stop<3>));
+}
+
+void i82357_device::device_start()
+{
+ m_out_rtc.resolve_safe();
+ m_out_nmi.resolve_safe();
+ m_out_spkr.resolve_safe();
+
+ m_nmi_check = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(i82357_device::nmi_check), this));
+}
+
+void i82357_device::device_reset()
+{
+ m_elcr[0] = 0;
+ m_elcr[1] = 0;
+
+ m_nmi_enabled = true;
+ m_nmi_reg = 0;
+ m_nmi_ext = 0;
+
+ m_nmi_check->adjust(attotime::zero);
+}
+
+void i82357_device::nmi_reg_w(u8 data)
+{
+ m_pit[0]->write_gate2(!!(data & NMI_T1C2_GATE));
+
+ // clear parity nmi
+ if (data & NMI_PARITY_DISABLE)
+ m_nmi_reg &= ~NMI_PARITY;
+
+ // clear iochk nmi
+ if (data & NMI_IOCHK_DISABLE)
+ m_nmi_reg &= ~NMI_IOCHK;
+
+ m_nmi_reg = (m_nmi_reg & ~NMI_WMASK) | (data & NMI_WMASK);
+
+ // update speaker state
+ m_out_spkr((m_nmi_reg & NMI_T1C2_STATE) && (m_nmi_reg & NMI_SPEAKER_DATA));
+
+ m_nmi_check->adjust(attotime::zero);
+}
+
+void i82357_device::nmi_ext_w(u8 data)
+{
+ if (!(data & NMI_EXT_EN_IOPORT))
+ m_nmi_ext &= ~NMI_EXT_IOPORT;
+
+ if (!(data & NMI_EXT_EN_TIMEOUT))
+ m_nmi_ext &= ~NMI_EXT_TIMEOUT;
+
+ if (!(data & NMI_EXT_EN_FAILSAFE))
+ m_nmi_ext &= ~NMI_EXT_FAILSAFE;
+
+ m_nmi_ext = (m_nmi_ext & ~NMI_EXT_WMASK) | (data & NMI_EXT_WMASK);
+
+ m_nmi_check->adjust(attotime::zero);
+}
+
+WRITE_LINE_MEMBER(i82357_device::in_iochk)
+{
+ if (!state && !(m_nmi_reg & NMI_PARITY_DISABLE))
+ {
+ m_nmi_reg |= NMI_IOCHK;
+
+ m_nmi_check->adjust(attotime::zero);
+ }
+ else
+ m_nmi_reg &= ~NMI_IOCHK;
+}
+
+WRITE_LINE_MEMBER(i82357_device::in_parity)
+{
+ if (!state && !(m_nmi_reg & NMI_IOCHK_DISABLE))
+ {
+ m_nmi_reg |= NMI_PARITY;
+
+ m_nmi_check->adjust(attotime::zero);
+ }
+ else
+ m_nmi_reg &= ~NMI_PARITY;
+}
+
+TIMER_CALLBACK_MEMBER(i82357_device::nmi_check)
+{
+ if (m_nmi_enabled)
+ {
+ if ((m_nmi_reg & NMI_NMI) || (m_nmi_ext & NMI_EXT_NMI))
+ {
+ if (!m_out_nmi_asserted)
+ {
+ m_out_nmi_asserted = true;
+ m_out_nmi(1);
+ }
+
+ return;
+ }
+ }
+
+ // disabled or no source
+ if (m_out_nmi_asserted)
+ {
+ m_out_nmi_asserted = false;
+ m_out_nmi(0);
+ }
+}
diff --git a/src/devices/machine/i82357.h b/src/devices/machine/i82357.h
new file mode 100644
index 00000000000..3c5a7756061
--- /dev/null
+++ b/src/devices/machine/i82357.h
@@ -0,0 +1,91 @@
+// license:BSD-3-Clause
+// copyright-holders:Patrick Mackinlay
+
+#ifndef MAME_MACHINE_I82357_H
+#define MAME_MACHINE_I82357_H
+
+#pragma once
+
+#include "machine/pic8259.h"
+#include "machine/pit8253.h"
+#include "machine/am9517a.h"
+
+class i82357_device : public device_t
+{
+public:
+ i82357_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
+
+ auto out_rtc_cb() { return m_out_rtc.bind(); }
+ auto out_int_cb() { return subdevice<pic8259_device>("pic0")->out_int_callback(); }
+ auto out_nmi_cb() { return m_out_nmi.bind(); }
+ auto out_spkr_cb() { return m_out_spkr.bind(); }
+
+ u32 eisa_irq_ack() { return m_pic[0]->acknowledge(); }
+
+ DECLARE_WRITE_LINE_MEMBER(in_iochk);
+ DECLARE_WRITE_LINE_MEMBER(in_parity);
+
+ void map(address_map &map);
+
+protected:
+ // standard device_t overrides
+ virtual void device_add_mconfig(machine_config &config) override;
+ virtual void device_start() override;
+ virtual void device_reset() override;
+
+ void nmi_reg_w(u8 data);
+ void nmi_ext_w(u8 data);
+ u8 nmi_reg_r() { return m_nmi_reg; }
+ u8 nmi_ext_r() { return m_nmi_ext; }
+
+ TIMER_CALLBACK_MEMBER(nmi_check);
+
+private:
+ required_device_array<pic8259_device, 2> m_pic;
+ required_device_array<pit8254_device, 2> m_pit;
+ required_device_array<eisa_dma_device, 2> m_dma;
+
+ devcb_write8 m_out_rtc;
+ devcb_write_line m_out_nmi;
+ devcb_write_line m_out_spkr;
+
+ enum nmi_reg_mask : u8
+ {
+ NMI_T1C2_GATE = 0x01,
+ NMI_SPEAKER_DATA = 0x02,
+ NMI_PARITY_DISABLE = 0x04,
+ NMI_IOCHK_DISABLE = 0x08,
+ NMI_REFRESH = 0x10,
+ NMI_T1C2_STATE = 0x20,
+ NMI_IOCHK = 0x40,
+ NMI_PARITY = 0x80,
+
+ NMI_WMASK = 0x0f,
+ NMI_NMI = 0xc0,
+ };
+ enum nmi_ext_mask : u8
+ {
+ NMI_EXT_BUS_RESET = 0x01, // bus reset (read/write)
+ NMI_EXT_EN_IOPORT = 0x02,
+ NMI_EXT_EN_FAILSAFE = 0x04,
+ NMI_EXT_EN_TIMEOUT = 0x08,
+ NMI_EXT_8US_TIMEOUT = 0x10, // 8us EISA bus master timeout occurred
+ NMI_EXT_IOPORT = 0x20, // NMI I/O port interrupt pending
+ NMI_EXT_TIMEOUT = 0x40, // EISA bus master timeout occurred, NMI requested
+ NMI_EXT_FAILSAFE = 0x80, // Fail-safe timer is active, NMI requested
+
+ NMI_EXT_WMASK = 0x0f,
+ NMI_EXT_NMI = 0xe0,
+ };
+ u8 m_elcr[2];
+
+ emu_timer *m_nmi_check;
+ bool m_out_nmi_asserted;
+ bool m_nmi_enabled;
+ u8 m_nmi_reg;
+ u8 m_nmi_ext;
+};
+
+DECLARE_DEVICE_TYPE(I82357, i82357_device)
+
+#endif // MAME_MACHINE_I82357_H
diff --git a/src/devices/machine/i82371sb.cpp b/src/devices/machine/i82371sb.cpp
index 579d678906a..b149d98a48f 100644
--- a/src/devices/machine/i82371sb.cpp
+++ b/src/devices/machine/i82371sb.cpp
@@ -49,7 +49,7 @@ void i82371sb_isa_device::internal_io_map(address_map &map)
void i82371sb_isa_device::device_add_mconfig(machine_config &config)
{
- PIT8254(config, m_pit8254, 0);
+ PIT8254(config, m_pit8254);
m_pit8254->set_clk<0>(4772720/4); // heartbeat IRQ
m_pit8254->out_handler<0>().set(FUNC(i82371sb_isa_device::at_pit8254_out0_changed));
m_pit8254->set_clk<1>(4772720/4); // DRAM refresh
@@ -90,12 +90,12 @@ void i82371sb_isa_device::device_add_mconfig(machine_config &config)
m_dma8237_2->out_dack_callback<2>().set(FUNC(i82371sb_isa_device::pc_dack6_w));
m_dma8237_2->out_dack_callback<3>().set(FUNC(i82371sb_isa_device::pc_dack7_w));
- PIC8259(config, m_pic8259_master, 0);
+ PIC8259(config, m_pic8259_master);
m_pic8259_master->out_int_callback().set_inputline(m_maincpu, 0);
m_pic8259_master->in_sp_callback().set_constant(1);
m_pic8259_master->read_slave_ack_callback().set(FUNC(i82371sb_isa_device::get_slave_ack));
- PIC8259(config, m_pic8259_slave, 0);
+ PIC8259(config, m_pic8259_slave);
m_pic8259_slave->out_int_callback().set(m_pic8259_master, FUNC(pic8259_device::ir2_w));
m_pic8259_slave->in_sp_callback().set_constant(0);
@@ -104,7 +104,8 @@ void i82371sb_isa_device::device_add_mconfig(machine_config &config)
SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.50);
ISA16(config, m_isabus, 0);
- m_isabus->set_cputag(":maincpu");
+ m_isabus->set_memspace(":maincpu", AS_PROGRAM);
+ m_isabus->set_iospace(":maincpu", AS_IO);
m_isabus->irq3_callback().set(FUNC(i82371sb_isa_device::pc_irq3_w));
m_isabus->irq4_callback().set(FUNC(i82371sb_isa_device::pc_irq4_w));
m_isabus->irq5_callback().set(FUNC(i82371sb_isa_device::pc_irq5_w));
@@ -123,6 +124,7 @@ void i82371sb_isa_device::device_add_mconfig(machine_config &config)
m_isabus->drq5_callback().set(m_dma8237_2, FUNC(am9517a_device::dreq1_w));
m_isabus->drq6_callback().set(m_dma8237_2, FUNC(am9517a_device::dreq2_w));
m_isabus->drq7_callback().set(m_dma8237_2, FUNC(am9517a_device::dreq3_w));
+ m_isabus->iochck_callback().set(FUNC(i82371sb_isa_device::iochck_w));
}
i82371sb_isa_device::i82371sb_isa_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) :
@@ -656,6 +658,8 @@ WRITE_LINE_MEMBER( i82371sb_isa_device::at_dma8237_out_eop )
void i82371sb_isa_device::pc_select_dma_channel(int channel, bool state)
{
+ m_isabus->dack_line_w(channel, state);
+
if(!state) {
m_dma_channel = channel;
if(m_cur_eop)
@@ -818,17 +822,24 @@ WRITE8_MEMBER( i82371sb_isa_device::at_portb_w )
m_pit8254->write_gate2(BIT(data, 0));
at_speaker_set_spkrdata( BIT(data, 1));
m_channel_check = BIT(data, 3);
- m_isabus->set_nmi_state((m_nmi_enabled==0) && (m_channel_check==0));
+ if (m_channel_check)
+ m_maincpu->set_input_line(INPUT_LINE_NMI, CLEAR_LINE);
+}
+
+WRITE_LINE_MEMBER( i82371sb_isa_device::iochck_w )
+{
+ if (!state && !m_channel_check && m_nmi_enabled)
+ m_maincpu->set_input_line(INPUT_LINE_NMI, ASSERT_LINE);
}
READ8_MEMBER( i82371sb_isa_device::at_dma8237_2_r )
{
- return m_dma8237_2->read( space, offset / 2);
+ return m_dma8237_2->read(offset / 2);
}
WRITE8_MEMBER( i82371sb_isa_device::at_dma8237_2_w )
{
- m_dma8237_2->write( space, offset / 2, data);
+ m_dma8237_2->write(offset / 2, data);
}
READ8_MEMBER(i82371sb_isa_device::eisa_irq_read)
diff --git a/src/devices/machine/i82371sb.h b/src/devices/machine/i82371sb.h
index ea7976ad845..5d79eec29ef 100644
--- a/src/devices/machine/i82371sb.h
+++ b/src/devices/machine/i82371sb.h
@@ -146,6 +146,7 @@ private:
DECLARE_WRITE8_MEMBER(at_page8_w);
DECLARE_READ8_MEMBER(at_portb_r);
DECLARE_WRITE8_MEMBER(at_portb_w);
+ DECLARE_WRITE_LINE_MEMBER(iochck_w);
DECLARE_READ8_MEMBER(ide_read_cs1_r);
DECLARE_WRITE8_MEMBER(ide_write_cs1_w);
DECLARE_READ8_MEMBER(ide2_read_cs1_r);
diff --git a/src/devices/machine/i8251.cpp b/src/devices/machine/i8251.cpp
index 773262b617e..1c3189d8f8f 100644
--- a/src/devices/machine/i8251.cpp
+++ b/src/devices/machine/i8251.cpp
@@ -674,9 +674,11 @@ uint8_t i8251_device::data_r()
{
LOG("read data: %02x, STATUS=%02x\n",m_rx_data,m_status);
/* reading clears */
- m_status &= ~I8251_STATUS_RX_READY;
-
- update_rx_ready();
+ if (!machine().side_effects_disabled())
+ {
+ m_status &= ~I8251_STATUS_RX_READY;
+ update_rx_ready();
+ }
return m_rx_data;
}
diff --git a/src/devices/machine/i8251.h b/src/devices/machine/i8251.h
index 4e2773c3e40..f8b92725b05 100644
--- a/src/devices/machine/i8251.h
+++ b/src/devices/machine/i8251.h
@@ -54,10 +54,7 @@ public:
DECLARE_READ_LINE_MEMBER(txrdy_r);
- /// TODO: REMOVE THIS
- void receive_character(uint8_t ch);
-
- /// TODO: this shouldn't be public
+protected:
enum
{
I8251_STATUS_FRAMING_ERROR = 0x20,
@@ -68,7 +65,6 @@ public:
I8251_STATUS_TX_READY = 0x01
};
-protected:
i8251_device(
const machine_config &mconfig,
device_type type,
@@ -83,6 +79,8 @@ protected:
void command_w(uint8_t data);
void mode_w(uint8_t data);
+ void receive_character(uint8_t ch);
+
void update_rx_ready();
void update_tx_ready();
void update_tx_empty();
diff --git a/src/devices/machine/i8271.cpp b/src/devices/machine/i8271.cpp
index 3a309c4ea16..1bac233f955 100644
--- a/src/devices/machine/i8271.cpp
+++ b/src/devices/machine/i8271.cpp
@@ -132,7 +132,7 @@ void i8271_device::set_floppy(floppy_image_device *flop)
flop->setup_index_pulse_cb(floppy_image_device::index_pulse_cb(&i8271_device::index_callback, this));
}
-READ8_MEMBER(i8271_device::sr_r)
+uint8_t i8271_device::sr_r()
{
uint32_t ret = (irq ? SR_IRQ : 0);
switch(main_phase) {
@@ -151,11 +151,13 @@ READ8_MEMBER(i8271_device::sr_r)
return ret;
}
-READ8_MEMBER(i8271_device::rr_r)
+uint8_t i8271_device::rr_r()
{
- if(main_phase == PHASE_RESULT)
- main_phase = PHASE_IDLE;
- set_irq(false);
+ if (!machine().side_effects_disabled()) {
+ if (main_phase == PHASE_RESULT)
+ main_phase = PHASE_IDLE;
+ set_irq(false);
+ }
return rr;
}
@@ -164,31 +166,32 @@ void i8271_device::set_rate(int rate)
cur_rate = rate;
}
-READ8_MEMBER(i8271_device::read)
+uint8_t i8271_device::read(offs_t offset)
{
switch(offset & 0x03) {
- case 0x00: return sr_r(space, 0);
- case 0x01: return rr_r(space, 0);
+ case 0x00: return sr_r();
+ case 0x01: return rr_r();
}
return 0xff;
}
-WRITE8_MEMBER(i8271_device::write)
+void i8271_device::write(offs_t offset, uint8_t data)
{
switch(offset & 0x03) {
- case 0x00: cmd_w(space, 0, data); break;
- case 0x01: param_w(space, 0, data); break;
- case 0x02: reset_w(space, 0, data); break;
+ case 0x00: cmd_w(data); break;
+ case 0x01: param_w(data); break;
+ case 0x02: reset_w(data); break;
}
}
-READ8_MEMBER(i8271_device::data_r)
+uint8_t i8271_device::data_r()
{
- set_drq(false);
+ if (!machine().side_effects_disabled())
+ set_drq(false);
return dma_data;
}
-WRITE8_MEMBER(i8271_device::data_w)
+void i8271_device::data_w(uint8_t data)
{
if(drq) {
set_drq(false);
@@ -196,7 +199,7 @@ WRITE8_MEMBER(i8271_device::data_w)
}
}
-WRITE8_MEMBER(i8271_device::cmd_w)
+void i8271_device::cmd_w(uint8_t data)
{
if(main_phase == PHASE_IDLE) {
command[0] = data;
@@ -211,7 +214,7 @@ WRITE8_MEMBER(i8271_device::cmd_w)
}
}
-WRITE8_MEMBER(i8271_device::param_w)
+void i8271_device::param_w(uint8_t data)
{
if(main_phase == PHASE_CMD) {
command[command_pos++] = data;
diff --git a/src/devices/machine/i8271.h b/src/devices/machine/i8271.h
index 701085f58d4..88e9a6146e6 100644
--- a/src/devices/machine/i8271.h
+++ b/src/devices/machine/i8271.h
@@ -24,10 +24,10 @@ public:
auto hdl_wr_callback() { return hdl_cb.bind(); }
auto opt_wr_callback() { return opt_cb.bind(); }
- DECLARE_READ8_MEMBER(read);
- DECLARE_WRITE8_MEMBER(write);
- DECLARE_READ8_MEMBER (data_r);
- DECLARE_WRITE8_MEMBER(data_w);
+ uint8_t read(offs_t offset);
+ void write(offs_t offset, uint8_t data);
+ uint8_t data_r();
+ void data_w(uint8_t data);
void ready_w(bool val);
@@ -228,11 +228,11 @@ private:
C_INCOMPLETE
};
- DECLARE_READ8_MEMBER (sr_r);
- DECLARE_READ8_MEMBER (rr_r);
- DECLARE_WRITE8_MEMBER(reset_w) { if(data == 1) soft_reset(); }
- DECLARE_WRITE8_MEMBER(cmd_w);
- DECLARE_WRITE8_MEMBER(param_w);
+ uint8_t sr_r();
+ uint8_t rr_r();
+ void reset_w(uint8_t data) { if(data == 1) soft_reset(); }
+ void cmd_w(uint8_t data);
+ void param_w(uint8_t data);
void delay_cycles(emu_timer *tm, int cycles);
void set_drq(bool state);
diff --git a/src/devices/machine/idectrl.cpp b/src/devices/machine/idectrl.cpp
index b8ab541fc8d..45f6ab6f703 100644
--- a/src/devices/machine/idectrl.cpp
+++ b/src/devices/machine/idectrl.cpp
@@ -222,6 +222,7 @@ DEFINE_DEVICE_TYPE(BUS_MASTER_IDE_CONTROLLER, bus_master_ide_controller_device,
bus_master_ide_controller_device::bus_master_ide_controller_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) :
ide_controller_32_device(mconfig, BUS_MASTER_IDE_CONTROLLER, tag, owner, clock),
+ m_dma_space(*this, finder_base::DUMMY_TAG, -1, 32),
m_dma_address(0),
m_dma_bytes_left(0),
m_dma_descriptor(0),
@@ -239,17 +240,7 @@ void bus_master_ide_controller_device::device_start()
ide_controller_32_device::device_start();
/* find the bus master space */
- if (m_bmcpu != nullptr)
- {
- device_t *bmtarget = machine().device(m_bmcpu);
- if (bmtarget == nullptr)
- throw emu_fatalerror("IDE controller '%s' bus master target '%s' doesn't exist!", tag(), m_bmcpu);
- device_memory_interface *memory;
- if (!bmtarget->interface(memory))
- throw emu_fatalerror("IDE controller '%s' bus master target '%s' has no memory!", tag(), m_bmcpu);
- m_dma_space = &memory->space(m_bmspace);
- m_dma_address_xor = (m_dma_space->endianness() == ENDIANNESS_LITTLE) ? 0 : 3;
- }
+ m_dma_address_xor = (m_dma_space->endianness() == ENDIANNESS_LITTLE) ? 0 : 3;
save_item(NAME(m_dma_address));
save_item(NAME(m_dma_bytes_left));
diff --git a/src/devices/machine/idectrl.h b/src/devices/machine/idectrl.h
index 3a0886a5185..c0e84e3c562 100644
--- a/src/devices/machine/idectrl.h
+++ b/src/devices/machine/idectrl.h
@@ -105,7 +105,7 @@ class bus_master_ide_controller_device : public ide_controller_32_device
{
public:
bus_master_ide_controller_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock = 0);
- void set_bus_master_space(const char *bmcpu, uint32_t bmspace) { m_bmcpu = bmcpu; m_bmspace = bmspace; }
+ template <typename T> void set_bus_master_space(T &&bmtag, int bmspace) { m_dma_space.set_tag(std::forward<T>(bmtag), bmspace); }
template <typename T> bus_master_ide_controller_device &master(T &&opts, const char *dflt = nullptr, bool fixed = false)
{
@@ -140,9 +140,7 @@ protected:
private:
void execute_dma();
- const char *m_bmcpu;
- uint32_t m_bmspace;
- address_space *m_dma_space;
+ required_address_space m_dma_space;
uint8_t m_dma_address_xor;
offs_t m_dma_address;
diff --git a/src/devices/machine/idehd.cpp b/src/devices/machine/idehd.cpp
index b9f6ddbbe70..1f4be38d491 100644
--- a/src/devices/machine/idehd.cpp
+++ b/src/devices/machine/idehd.cpp
@@ -869,6 +869,7 @@ uint8_t ide_hdd_device::calculate_status()
// device_add_mconfig - add device configuration
//-------------------------------------------------
-MACHINE_CONFIG_START(ide_hdd_device::device_add_mconfig)
- MCFG_HARDDISK_ADD( "image" )
-MACHINE_CONFIG_END
+void ide_hdd_device::device_add_mconfig(machine_config &config)
+{
+ HARDDISK(config, "image");
+}
diff --git a/src/devices/machine/ie15.cpp b/src/devices/machine/ie15.cpp
index 4f1a8a25bfc..65a71ae23c3 100644
--- a/src/devices/machine/ie15.cpp
+++ b/src/devices/machine/ie15.cpp
@@ -568,25 +568,25 @@ static GFXDECODE_START( gfx_ie15 )
GFXDECODE_ENTRY("chargen", 0x0000, ie15_charlayout, 0, 1)
GFXDECODE_END
-MACHINE_CONFIG_START(ie15_device::ie15core)
+void ie15_device::ie15core(machine_config &config)
+{
/* Basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", IE15_CPU, XTAL(30'800'000)/10)
- MCFG_DEVICE_PROGRAM_MAP(ie15_mem)
- MCFG_DEVICE_IO_MAP(ie15_io)
+ IE15_CPU(config, m_maincpu, XTAL(30'800'000)/10);
+ m_maincpu->set_addrmap(AS_PROGRAM, &ie15_device::ie15_mem);
+ m_maincpu->set_addrmap(AS_IO, &ie15_device::ie15_io);
config.set_default_layout(layout_ie15);
/* Devices */
- IE15_KEYBOARD(config, m_keyboard, 0)
- .keyboard_cb().set(FUNC(ie15_device::kbd_put));
+ IE15_KEYBOARD(config, m_keyboard, 0).keyboard_cb().set(FUNC(ie15_device::kbd_put));
RS232_PORT(config, m_rs232, default_rs232_devices, "null_modem");
m_rs232->rxd_handler().set(FUNC(ie15_device::serial_rx_callback));
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("beeper", BEEP, 2400)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.15)
-MACHINE_CONFIG_END
+ BEEP(config, m_beeper, 2400);
+ m_beeper->add_route(ALL_OUTPUTS, "mono", 0.15);
+}
/* ROM definition */
ROM_START( ie15 )
@@ -603,18 +603,20 @@ ROM_START( ie15 )
ROM_LOAD("chargen-15ie.bin", 0x0000, 0x0800, CRC(ed16bf6b) SHA1(6af9fb75f5375943d5c0ce9ed408e0fb4621b17e))
ROM_END
-MACHINE_CONFIG_START(ie15_device::device_add_mconfig)
- MCFG_SCREEN_ADD_MONOCHROME("screen", RASTER, rgb_t::green())
- MCFG_SCREEN_UPDATE_DRIVER(ie15_device, screen_update)
- MCFG_SCREEN_RAW_PARAMS(XTAL(30'800'000)/2,
+void ie15_device::device_add_mconfig(machine_config &config)
+{
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_color(rgb_t::green());
+ m_screen->set_screen_update(FUNC(ie15_device::screen_update));
+ m_screen->set_raw(XTAL(30'800'000)/2,
IE15_TOTAL_HORZ, IE15_HORZ_START, IE15_HORZ_START+IE15_DISP_HORZ,
IE15_TOTAL_VERT, IE15_VERT_START, IE15_VERT_START+IE15_DISP_VERT);
ie15core(config);
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_ie15)
+ GFXDECODE(config, "gfxdecode", "palette", gfx_ie15);
PALETTE(config, "palette", palette_device::MONOCHROME);
-MACHINE_CONFIG_END
+}
ioport_constructor ie15_device::device_input_ports() const
{
diff --git a/src/devices/machine/ie15_kbd.cpp b/src/devices/machine/ie15_kbd.cpp
index 13ee3ea5744..79a4bb86aad 100644
--- a/src/devices/machine/ie15_kbd.cpp
+++ b/src/devices/machine/ie15_kbd.cpp
@@ -122,8 +122,9 @@ const tiny_rom_entry *ie15_keyboard_device::device_rom_region() const
return ROM_NAME( ie15_keyboard );
}
-MACHINE_CONFIG_START(ie15_keyboard_device::device_add_mconfig)
-MACHINE_CONFIG_END
+void ie15_keyboard_device::device_add_mconfig(machine_config &config)
+{
+}
void ie15_keyboard_device::device_start()
diff --git a/src/devices/machine/input_merger.h b/src/devices/machine/input_merger.h
index 53af1a38cfd..aa5e66cc1f1 100644
--- a/src/devices/machine/input_merger.h
+++ b/src/devices/machine/input_merger.h
@@ -15,27 +15,6 @@
#pragma once
-
-//**************************************************************************
-// INTERFACE CONFIGURATION MACROS
-//**************************************************************************
-
-#define MCFG_INPUT_MERGER_ANY_HIGH(_tag) \
- MCFG_DEVICE_ADD(_tag, INPUT_MERGER_ANY_HIGH, 0)
-
-#define MCFG_INPUT_MERGER_ALL_HIGH(_tag) \
- MCFG_DEVICE_ADD(_tag, INPUT_MERGER_ALL_HIGH, 0)
-
-#define MCFG_INPUT_MERGER_ANY_LOW(_tag) \
- MCFG_DEVICE_ADD(_tag, INPUT_MERGER_ANY_LOW, 0)
-
-#define MCFG_INPUT_MERGER_ALL_LOW(_tag) \
- MCFG_DEVICE_ADD(_tag, INPUT_MERGER_ALL_LOW, 0)
-
-#define MCFG_INPUT_MERGER_OUTPUT_HANDLER(_devcb) \
- downcast<input_merger_device &>(*device).set_output_handler(DEVCB_##_devcb);
-
-
//**************************************************************************
// TYPE DEFINITIONS
//**************************************************************************
@@ -44,7 +23,6 @@ class input_merger_device : public device_t
{
public:
// callback
- template <class Object> devcb_base &set_output_handler(Object &&cb) { return m_output_handler.set_callback(std::forward<Object>(cb)); }
auto output_handler() { return m_output_handler.bind(); }
// input lines
diff --git a/src/devices/machine/ins8154.cpp b/src/devices/machine/ins8154.cpp
index 8a134000f3f..11943cdee2c 100644
--- a/src/devices/machine/ins8154.cpp
+++ b/src/devices/machine/ins8154.cpp
@@ -1,21 +1,24 @@
// license:GPL-2.0+
// copyright-holders:Dirk Best
-/***************************************************************************
+/******************************************************************************
National Semiconductor INS8154
N-Channel 128-by-8 Bit RAM Input/Output (RAM I/O)
TODO: Strobed modes
+ TODO: Check the ODRx register for where to get pin values, _cb() vs m_out_x
-***************************************************************************/
+*******************************************************************************/
#include "emu.h"
#include "ins8154.h"
-#define VERBOSE 1
+#define LOG_BITS (1U << 1)
+//#define VERBOSE (LOG_BITS) // (LOG_GENERAL|LOG_BITS)
#include "logmacro.h"
+#define LOGBITS(...) LOGMASKED(LOG_BITS, __VA_ARGS__)
/***************************************************************************
CONSTANTS
@@ -75,6 +78,7 @@ void ins8154_device::device_start()
save_item(NAME(m_mdr));
save_item(NAME(m_odra));
save_item(NAME(m_odrb));
+ save_item(NAME(m_ram));
}
@@ -94,7 +98,7 @@ void ins8154_device::device_reset()
}
-READ8_MEMBER(ins8154_device::ins8154_r)
+uint8_t ins8154_device::read_io(offs_t offset)
{
uint8_t val = 0xff;
@@ -119,17 +123,23 @@ READ8_MEMBER(ins8154_device::ins8154_r)
break;
default:
- if (offset < 0x08)
+ val = 0;
+ if (offset < 0x08) // Read a bit in Port A
{
if (!m_in_a_cb.isnull())
- val = (m_in_a_cb(0) << (8 - offset)) & 0x80;
- m_in_a = val;
+ {
+ //val = (m_in_a_cb(0) << (8 - offset)) & 0x80;
+ val = (m_in_a_cb(0) & ~m_odra & (1 << (offset & 0x07))) ? 0x80 : 0x00;
+ }
+ LOGBITS("%s: INS8154 Port A read bit %02x: %02x\n", machine().describe_context(), offset & 0x07, val);
}
- else
+ else // Read a bit in Port B
{
if (!m_in_b_cb.isnull())
- val = (m_in_b_cb(0) << (8 - (offset >> 4))) & 0x80;
- m_in_b = val;
+ {
+ val = (m_in_b_cb(0) & ~m_odrb & (1 << (offset & 0x07))) ? 0x80 : 0x00;
+ }
+ LOGBITS("%s: INS8154 Port B read bit %02x: %02x\n", machine().describe_context(), offset & 0x07, val);
}
break;
}
@@ -137,7 +147,12 @@ READ8_MEMBER(ins8154_device::ins8154_r)
return val;
}
-WRITE8_MEMBER(ins8154_device::ins8154_porta_w)
+uint8_t ins8154_device::read_ram(offs_t offset)
+{
+ return m_ram[offset & 0x7f];
+}
+
+void ins8154_device::porta_w(uint8_t data)
{
m_out_a = data;
@@ -146,8 +161,9 @@ WRITE8_MEMBER(ins8154_device::ins8154_porta_w)
m_out_a_cb(offs_t(0), (data & m_odra) | (m_odra ^ 0xff));
}
-WRITE8_MEMBER(ins8154_device::ins8154_portb_w)
+void ins8154_device::portb_w(uint8_t data)
{
+ LOG("%s: INS8154 Write PortB %02x with odrb: %02x\n", machine().describe_context(), data, m_odrb);
m_out_b = data;
/* Test if any pins are set as outputs */
@@ -155,7 +171,7 @@ WRITE8_MEMBER(ins8154_device::ins8154_portb_w)
m_out_b_cb(offs_t(0), (data & m_odrb) | (m_odrb ^ 0xff));
}
-WRITE8_MEMBER(ins8154_device::ins8154_w)
+void ins8154_device::write_io(offs_t offset, uint8_t data)
{
if (offset > 0x24)
{
@@ -166,11 +182,11 @@ WRITE8_MEMBER(ins8154_device::ins8154_w)
switch (offset)
{
case 0x20:
- ins8154_porta_w(space, 0, data);
+ porta_w(data);
break;
case 0x21:
- ins8154_portb_w(space, 0, data);
+ portb_w(data);
break;
case 0x22:
@@ -193,18 +209,35 @@ WRITE8_MEMBER(ins8154_device::ins8154_w)
{
/* Set bit */
if (offset < 0x08)
- ins8154_porta_w(space, 0, m_out_a |= offset & 0x07);
+ {
+ LOGBITS("%s: INS8154 Port A set bit %02x\n", machine().describe_context(), offset & 0x07);
+ porta_w(m_out_a |= (1 << (offset & 0x07)));
+ }
else
- ins8154_portb_w(space, 0, m_out_b |= (offset >> 4) & 0x07);
+ {
+ LOGBITS("%s: INS8154 Port B set bit %02x\n", machine().describe_context(), offset & 0x07);
+ portb_w(m_out_b |= (1 << (offset & 0x07)));
+ }
}
else
{
/* Clear bit */
if (offset < 0x08)
- ins8154_porta_w(space, 0, m_out_a & ~(offset & 0x07));
+ {
+ LOGBITS("%s: INS8154 Port A clear bit %02x\n", machine().describe_context(), offset & 0x07);
+ porta_w(m_out_a & ~(1 << (offset & 0x07)));
+ }
else
- ins8154_portb_w(space, 0, m_out_b & ~((offset >> 4) & 0x07));
+ {
+ LOGBITS("%s: INS8154 Port B clear bit %02x\n", machine().describe_context(), offset & 0x07);
+ portb_w(m_out_b & ~(1 << (offset & 0x07)));
+ }
}
break;
}
}
+
+void ins8154_device::write_ram(offs_t offset, uint8_t data)
+{
+ m_ram[offset & 0x7f] = data;
+}
diff --git a/src/devices/machine/ins8154.h b/src/devices/machine/ins8154.h
index 5ba94ab9cda..2ce40ec9e70 100644
--- a/src/devices/machine/ins8154.h
+++ b/src/devices/machine/ins8154.h
@@ -47,11 +47,13 @@ public:
auto out_b() { return m_out_b_cb.bind(); }
auto out_irq() { return m_out_irq_cb.bind(); }
- DECLARE_READ8_MEMBER( ins8154_r );
- DECLARE_WRITE8_MEMBER( ins8154_w );
+ uint8_t read_io(offs_t offset);
+ void write_io(offs_t offset, uint8_t data);
+ uint8_t read_ram(offs_t offset);
+ void write_ram(offs_t offset, uint8_t data);
- DECLARE_WRITE8_MEMBER( ins8154_porta_w );
- DECLARE_WRITE8_MEMBER( ins8154_portb_w );
+ void porta_w(uint8_t data);
+ void portb_w(uint8_t data);
protected:
// device-level overrides
@@ -77,6 +79,9 @@ private:
uint8_t m_mdr; /* Mode Definition Register */
uint8_t m_odra; /* Output Definition Register Port A */
uint8_t m_odrb; /* Output Definition Register Port B */
+
+ /* on-board RAM */
+ uint8_t m_ram[0x80];
};
diff --git a/src/devices/machine/ins8250.cpp b/src/devices/machine/ins8250.cpp
index 88262cdbac2..d127ce0e40d 100644
--- a/src/devices/machine/ins8250.cpp
+++ b/src/devices/machine/ins8250.cpp
@@ -390,6 +390,8 @@ WRITE8_MEMBER( ins8250_uart_device::ins8250_w )
if ( m_regs.msr & 0x0f )
trigger_int(COM_INT_PENDING_MODEM_STATUS_REGISTER);
+ else
+ clear_int(COM_INT_PENDING_MODEM_STATUS_REGISTER);
break;
case 7:
m_regs.scr = data;
diff --git a/src/devices/machine/intelfsh.h b/src/devices/machine/intelfsh.h
index 7dcf9f7e173..edaa23d69f6 100644
--- a/src/devices/machine/intelfsh.h
+++ b/src/devices/machine/intelfsh.h
@@ -102,8 +102,8 @@ class intelfsh8_device : public intelfsh_device
{
public:
// public interface
- DECLARE_READ8_MEMBER(read) { return read_full(offset); }
- DECLARE_WRITE8_MEMBER(write) { write_full(offset, data); }
+ uint8_t read(offs_t offset) { return read_full(offset); }
+ void write(offs_t offset, uint8_t data) { write_full(offset, data); }
uint8_t read_raw(offs_t offset) { return m_data[offset]; }
void write_raw(offs_t offset, uint8_t data) { m_data[offset] = data; }
@@ -120,8 +120,8 @@ class intelfsh16_device : public intelfsh_device
{
public:
// public interface
- DECLARE_READ16_MEMBER(read) { return read_full(offset); }
- DECLARE_WRITE16_MEMBER(write) { write_full(offset, data); }
+ uint16_t read(offs_t offset) { return read_full(offset); }
+ void write(offs_t offset, uint16_t data) { write_full(offset, data); }
uint16_t read_raw(offs_t offset) { return m_data[offset*2] | (m_data[offset*2+1] << 8); }
void write_raw(offs_t offset, uint16_t data) { m_data[offset*2] = data; m_data[offset*2+1] = data >> 8; }
diff --git a/src/devices/machine/k054321.cpp b/src/devices/machine/k054321.cpp
index 21e02e9042f..592bc74582a 100644
--- a/src/devices/machine/k054321.cpp
+++ b/src/devices/machine/k054321.cpp
@@ -11,7 +11,7 @@
/*
The 054321 is a sound communication latch/volume manager chip, that
- is integrated into the 054544 and 05489A hybrid chips. The hybrid
+ is integrated into the 054544 and 054986A hybrid chips. The hybrid
chips also include the DACs, capacitors, etc needed for the audio
output.
diff --git a/src/devices/machine/keyboard.cpp b/src/devices/machine/keyboard.cpp
index 03e73f3ac05..52502597227 100644
--- a/src/devices/machine/keyboard.cpp
+++ b/src/devices/machine/keyboard.cpp
@@ -9,10 +9,10 @@ or for the case of a computer with an inbuilt (not serial) ascii keyboard.
Example of usage in a driver.
-In MACHINE_CONFIG
+In the machine config function:
- MCFG_DEVICE_ADD(KEYBOARD_TAG, GENERIC_KEYBOARD, 0)
- MCFG_GENERIC_KEYBOARD_CB(WRITE8(*this, xxx_state, kbd_put))
+ generic_keyboard_device &kbd(GENERIC_KEYBOARD(config, KEYBOARD_TAG, 0));
+ kbd.set_keyboard_callback(FUNC(xxx_state::kbd_put));
In the code:
diff --git a/src/devices/machine/ldp1000.h b/src/devices/machine/ldp1000.h
index 1f3140f14e8..b3f420afb6e 100644
--- a/src/devices/machine/ldp1000.h
+++ b/src/devices/machine/ldp1000.h
@@ -15,13 +15,6 @@
//**************************************************************************
-// INTERFACE CONFIGURATION MACROS
-//**************************************************************************
-
-#define MCFG_LASERDISC_LDP1000_ADD(_tag) \
- MCFG_DEVICE_ADD(_tag, SONY_LDP1000, 0)
-
-//**************************************************************************
// TYPE DEFINITIONS
//**************************************************************************
diff --git a/src/devices/machine/ldp1450.h b/src/devices/machine/ldp1450.h
index 3ef9fab0939..67a429845e1 100644
--- a/src/devices/machine/ldp1450.h
+++ b/src/devices/machine/ldp1450.h
@@ -15,13 +15,6 @@
//**************************************************************************
-// INTERFACE CONFIGURATION MACROS
-//**************************************************************************
-
-#define MCFG_LASERDISC_LDP1450_ADD(_tag, clock) \
- MCFG_DEVICE_ADD(_tag, SONY_LDP1450, clock)
-
-//**************************************************************************
// TYPE DEFINITIONS
//**************************************************************************
diff --git a/src/devices/machine/ldpr8210.h b/src/devices/machine/ldpr8210.h
index f142229314c..fc0a28d6d26 100644
--- a/src/devices/machine/ldpr8210.h
+++ b/src/devices/machine/ldpr8210.h
@@ -23,8 +23,6 @@
#define MCFG_LASERDISC_PR8210_ADD(_tag) \
MCFG_DEVICE_ADD(_tag, PIONEER_PR8210, 0)
-#define MCFG_LASERDISC_SIMUTREK_ADD(_tag) \
- MCFG_DEVICE_ADD(_tag, SIMUTREK_SPECIAL, 0)
//**************************************************************************
diff --git a/src/devices/machine/ldstub.cpp b/src/devices/machine/ldstub.cpp
index 9d3dab58ce3..c0c9a7ac05a 100644
--- a/src/devices/machine/ldstub.cpp
+++ b/src/devices/machine/ldstub.cpp
@@ -17,8 +17,8 @@
//**************************************************************************
// device type definition
-DEFINE_DEVICE_TYPE(PIONEER_PR7820, pioneer_pr7820_device, "pr7820", "Pioneer PR-7820")
-DEFINE_DEVICE_TYPE(PHILLIPS_22VP932, phillips_22vp932_device, "22vp932", "Phillips 22VP932")
+DEFINE_DEVICE_TYPE(PIONEER_PR7820, pioneer_pr7820_device, "pr7820", "Pioneer PR-7820")
+DEFINE_DEVICE_TYPE(PHILIPS_22VP932, philips_22vp932_device, "22vp932", "Philips 22VP932")
pioneer_pr7820_device::pioneer_pr7820_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
@@ -27,7 +27,7 @@ pioneer_pr7820_device::pioneer_pr7820_device(const machine_config &mconfig, cons
}
-phillips_22vp932_device::phillips_22vp932_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
- : laserdisc_device(mconfig, PHILLIPS_22VP932, tag, owner, clock)
+philips_22vp932_device::philips_22vp932_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+ : laserdisc_device(mconfig, PHILIPS_22VP932, tag, owner, clock)
{
}
diff --git a/src/devices/machine/ldstub.h b/src/devices/machine/ldstub.h
index 4bf463b897d..9fbc756b240 100644
--- a/src/devices/machine/ldstub.h
+++ b/src/devices/machine/ldstub.h
@@ -17,23 +17,12 @@
//**************************************************************************
-// DEVICE CONFIGURATION MACROS
-//**************************************************************************
-
-#define MCFG_LASERDISC_PR7820_ADD(_tag) \
- MCFG_DEVICE_ADD(_tag, PIONEER_PR7820, 0)
-#define MCFG_LASERDISC_22VP932_ADD(_tag) \
- MCFG_DEVICE_ADD(_tag, PHILLIPS_22VP932, 0)
-
-
-//**************************************************************************
// GLOBAL VARIABLES
//**************************************************************************
// device type definition
-DECLARE_DEVICE_TYPE(PIONEER_PR7820, pioneer_pr7820_device)
-DECLARE_DEVICE_TYPE(PHILLIPS_22VP932, phillips_22vp932_device)
-
+DECLARE_DEVICE_TYPE(PIONEER_PR7820, pioneer_pr7820_device)
+DECLARE_DEVICE_TYPE(PHILIPS_22VP932, philips_22vp932_device)
//**************************************************************************
@@ -63,13 +52,13 @@ protected:
};
-// ======================> phillips_22vp932_device
+// ======================> philips_22vp932_device
-class phillips_22vp932_device : public laserdisc_device
+class philips_22vp932_device : public laserdisc_device
{
public:
// construction/destruction
- phillips_22vp932_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+ philips_22vp932_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
// input/output
uint8_t data_r() { return 0; }
diff --git a/src/devices/machine/ldv1000.cpp b/src/devices/machine/ldv1000.cpp
index 4a9b1295b75..4f7a0196e40 100644
--- a/src/devices/machine/ldv1000.cpp
+++ b/src/devices/machine/ldv1000.cpp
@@ -272,7 +272,8 @@ const tiny_rom_entry *pioneer_ldv1000_device::device_rom_region() const
// device_add_mconfig - add device configuration
//-------------------------------------------------
-MACHINE_CONFIG_START(pioneer_ldv1000_device::device_add_mconfig)
+void pioneer_ldv1000_device::device_add_mconfig(machine_config &config)
+{
Z80(config, m_z80_cpu, XTAL(5'000'000)/2);
m_z80_cpu->set_daisy_config(daisy_chain);
m_z80_cpu->set_addrmap(AS_PROGRAM, &pioneer_ldv1000_device::ldv1000_map);
@@ -291,7 +292,7 @@ MACHINE_CONFIG_START(pioneer_ldv1000_device::device_add_mconfig)
ldvppi1.in_pa_callback().set(FUNC(pioneer_ldv1000_device::ppi1_porta_r));
ldvppi1.out_pb_callback().set(FUNC(pioneer_ldv1000_device::ppi1_portb_w));
ldvppi1.out_pc_callback().set(FUNC(pioneer_ldv1000_device::ppi1_portc_w));
-MACHINE_CONFIG_END
+}
//-------------------------------------------------
diff --git a/src/devices/machine/ldv1000.h b/src/devices/machine/ldv1000.h
index 661d0a44f0b..55516da36fe 100644
--- a/src/devices/machine/ldv1000.h
+++ b/src/devices/machine/ldv1000.h
@@ -26,10 +26,6 @@
#define MCFG_LASERDISC_LDV1000_ADD(_tag) \
MCFG_DEVICE_ADD(_tag, PIONEER_LDV1000, 0)
-#define MCFG_LASERDISC_LDV1000_COMMAND_STROBE_CB(_cb) \
- downcast<pioneer_ldv1000_device *>(device)->set_command_strobe_callback(DEVCB_##_cb);
-
-
//**************************************************************************
// GLOBAL VARIABLES
@@ -53,7 +49,7 @@ public:
// construction/destruction
pioneer_ldv1000_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- template <class cmd_strobe_cb> devcb_base &set_command_strobe_callback(cmd_strobe_cb &&latch) { return m_command_strobe_cb.set_callback(std::forward<cmd_strobe_cb>(latch)); }
+ auto command_strobe_callback() { return m_command_strobe_cb.bind(); }
// input and output
void data_w(uint8_t data);
diff --git a/src/devices/machine/ldvp931.cpp b/src/devices/machine/ldvp931.cpp
index 7a688736a93..4bcb74e1b6a 100644
--- a/src/devices/machine/ldvp931.cpp
+++ b/src/devices/machine/ldvp931.cpp
@@ -45,7 +45,7 @@
//**************************************************************************
// devices
-DEFINE_DEVICE_TYPE(PHILLIPS_22VP931, phillips_22vp931_device, "22vp931", "Phillips 22VP931")
+DEFINE_DEVICE_TYPE(PHILIPS_22VP931, philips_22vp931_device, "22vp931", "Philips 22VP931")
@@ -53,12 +53,12 @@ DEFINE_DEVICE_TYPE(PHILLIPS_22VP931, phillips_22vp931_device, "22vp931", "Philli
// 22VP931 ROM AND MACHINE INTERFACES
//**************************************************************************
-void phillips_22vp931_device::vp931_portmap(address_map &map)
+void philips_22vp931_device::vp931_portmap(address_map &map)
{
- map(0x00, 0x00).mirror(0xcf).rw(FUNC(phillips_22vp931_device::i8049_keypad_r), FUNC(phillips_22vp931_device::i8049_output0_w));
- map(0x10, 0x10).mirror(0xcf).rw(FUNC(phillips_22vp931_device::i8049_unknown_r), FUNC(phillips_22vp931_device::i8049_output1_w));
- map(0x20, 0x20).mirror(0xcf).rw(FUNC(phillips_22vp931_device::i8049_datic_r), FUNC(phillips_22vp931_device::i8049_lcd_w));
- map(0x30, 0x30).mirror(0xcf).rw(FUNC(phillips_22vp931_device::i8049_from_controller_r), FUNC(phillips_22vp931_device::i8049_to_controller_w));
+ map(0x00, 0x00).mirror(0xcf).rw(FUNC(philips_22vp931_device::i8049_keypad_r), FUNC(philips_22vp931_device::i8049_output0_w));
+ map(0x10, 0x10).mirror(0xcf).rw(FUNC(philips_22vp931_device::i8049_unknown_r), FUNC(philips_22vp931_device::i8049_output1_w));
+ map(0x20, 0x20).mirror(0xcf).rw(FUNC(philips_22vp931_device::i8049_datic_r), FUNC(philips_22vp931_device::i8049_lcd_w));
+ map(0x30, 0x30).mirror(0xcf).rw(FUNC(philips_22vp931_device::i8049_from_controller_r), FUNC(philips_22vp931_device::i8049_to_controller_w));
}
@@ -70,15 +70,15 @@ ROM_END
//**************************************************************************
-// PHILLIPS 22VP931 IMPLEMENTATION
+// PHILIPS 22VP931 IMPLEMENTATION
//**************************************************************************
//-------------------------------------------------
-// phillips_22vp931_device - constructor
+// philips_22vp931_device - constructor
//-------------------------------------------------
-phillips_22vp931_device::phillips_22vp931_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
- : laserdisc_device(mconfig, PHILLIPS_22VP931, tag, owner, clock),
+philips_22vp931_device::philips_22vp931_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+ : laserdisc_device(mconfig, PHILIPS_22VP931, tag, owner, clock),
m_i8049_cpu(*this, "vp931"),
m_tracktimer(nullptr),
m_i8049_out0(0),
@@ -103,7 +103,7 @@ phillips_22vp931_device::phillips_22vp931_device(const machine_config &mconfig,
// reset_w - write to the reset line
//-------------------------------------------------
-void phillips_22vp931_device::reset_w(uint8_t data)
+void philips_22vp931_device::reset_w(uint8_t data)
{
// control the CPU state
m_i8049_cpu->set_input_line(INPUT_LINE_RESET, data);
@@ -119,7 +119,7 @@ void phillips_22vp931_device::reset_w(uint8_t data)
// 22VP931
//-------------------------------------------------
-uint8_t phillips_22vp931_device::data_r()
+uint8_t philips_22vp931_device::data_r()
{
// if data is pending, clear the pending flag and notify any callbacks
if (m_tocontroller_pending)
@@ -139,7 +139,7 @@ uint8_t phillips_22vp931_device::data_r()
// device_start - device initialization
//-------------------------------------------------
-void phillips_22vp931_device::device_start()
+void philips_22vp931_device::device_start()
{
// pass through to the parent
laserdisc_device::device_start();
@@ -153,7 +153,7 @@ void phillips_22vp931_device::device_start()
// device_reset - device reset
//-------------------------------------------------
-void phillips_22vp931_device::device_reset()
+void philips_22vp931_device::device_reset()
{
// pass through to the parent
laserdisc_device::device_reset();
@@ -185,7 +185,7 @@ void phillips_22vp931_device::device_reset()
// device
//-------------------------------------------------
-void phillips_22vp931_device::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr)
+void philips_22vp931_device::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr)
{
switch (id)
{
@@ -276,7 +276,7 @@ void phillips_22vp931_device::device_timer(emu_timer &timer, device_timer_id id,
// ROM region definitions
//-------------------------------------------------
-const tiny_rom_entry *phillips_22vp931_device::device_rom_region() const
+const tiny_rom_entry *philips_22vp931_device::device_rom_region() const
{
return ROM_NAME(vp931);
}
@@ -286,16 +286,16 @@ const tiny_rom_entry *phillips_22vp931_device::device_rom_region() const
// device_add_mconfig - add device configuration
//-------------------------------------------------
-void phillips_22vp931_device::device_add_mconfig(machine_config &config)
+void philips_22vp931_device::device_add_mconfig(machine_config &config)
{
I8049(config, m_i8049_cpu, XTAL(11'000'000));
- m_i8049_cpu->set_addrmap(AS_IO, &phillips_22vp931_device::vp931_portmap);
- m_i8049_cpu->p1_in_cb().set(FUNC(phillips_22vp931_device::i8049_port1_r));
- m_i8049_cpu->p1_out_cb().set(FUNC(phillips_22vp931_device::i8049_port1_w));
- m_i8049_cpu->p2_in_cb().set(FUNC(phillips_22vp931_device::i8049_port2_r));
- m_i8049_cpu->p2_out_cb().set(FUNC(phillips_22vp931_device::i8049_port2_w));
- m_i8049_cpu->t0_in_cb().set(FUNC(phillips_22vp931_device::i8049_t0_r));
- m_i8049_cpu->t1_in_cb().set(FUNC(phillips_22vp931_device::i8049_t1_r));
+ m_i8049_cpu->set_addrmap(AS_IO, &philips_22vp931_device::vp931_portmap);
+ m_i8049_cpu->p1_in_cb().set(FUNC(philips_22vp931_device::i8049_port1_r));
+ m_i8049_cpu->p1_out_cb().set(FUNC(philips_22vp931_device::i8049_port1_w));
+ m_i8049_cpu->p2_in_cb().set(FUNC(philips_22vp931_device::i8049_port2_r));
+ m_i8049_cpu->p2_out_cb().set(FUNC(philips_22vp931_device::i8049_port2_w));
+ m_i8049_cpu->t0_in_cb().set(FUNC(philips_22vp931_device::i8049_t0_r));
+ m_i8049_cpu->t1_in_cb().set(FUNC(philips_22vp931_device::i8049_t1_r));
}
@@ -304,7 +304,7 @@ void phillips_22vp931_device::device_add_mconfig(machine_config &config)
// start of the blanking period
//-------------------------------------------------
-void phillips_22vp931_device::player_vsync(const vbi_metadata &vbi, int fieldnum, const attotime &curtime)
+void philips_22vp931_device::player_vsync(const vbi_metadata &vbi, int fieldnum, const attotime &curtime)
{
// reset our command counter (debugging only)
m_cmdcount = 0;
@@ -320,7 +320,7 @@ void phillips_22vp931_device::player_vsync(const vbi_metadata &vbi, int fieldnum
// the first visible line of the frame
//-------------------------------------------------
-int32_t phillips_22vp931_device::player_update(const vbi_metadata &vbi, int fieldnum, const attotime &curtime)
+int32_t philips_22vp931_device::player_update(const vbi_metadata &vbi, int fieldnum, const attotime &curtime)
{
// set the first VBI timer to go at the start of line 16
timer_set(screen().time_until_pos(16*2), TID_VBI_DATA_FETCH, LASERDISC_CODE_LINE16 << 2);
@@ -335,7 +335,7 @@ int32_t phillips_22vp931_device::player_update(const vbi_metadata &vbi, int fiel
// and other bits
//-------------------------------------------------
-WRITE8_MEMBER( phillips_22vp931_device::i8049_output0_w )
+WRITE8_MEMBER( philips_22vp931_device::i8049_output0_w )
{
/*
$80 = n/c
@@ -374,7 +374,7 @@ WRITE8_MEMBER( phillips_22vp931_device::i8049_output0_w )
// i8049_output1_w - controls scanning behaviors
//-------------------------------------------------
-WRITE8_MEMBER( phillips_22vp931_device::i8049_output1_w )
+WRITE8_MEMBER( philips_22vp931_device::i8049_output1_w )
{
/*
$80 = n/c
@@ -418,7 +418,7 @@ WRITE8_MEMBER( phillips_22vp931_device::i8049_output1_w )
// i8049_lcd_w - vestigial LCD frame display
//-------------------------------------------------
-WRITE8_MEMBER( phillips_22vp931_device::i8049_lcd_w )
+WRITE8_MEMBER( philips_22vp931_device::i8049_lcd_w )
{
/*
Frame number is written as 5 digits here; however, it is not actually
@@ -431,7 +431,7 @@ WRITE8_MEMBER( phillips_22vp931_device::i8049_lcd_w )
// i8049_unknown_r - unknown input port
//-------------------------------------------------
-READ8_MEMBER( phillips_22vp931_device::i8049_unknown_r )
+READ8_MEMBER( philips_22vp931_device::i8049_unknown_r )
{
// only bit $80 is checked and its effects are minor
return 0x00;
@@ -443,7 +443,7 @@ READ8_MEMBER( phillips_22vp931_device::i8049_unknown_r )
// controls
//-------------------------------------------------
-READ8_MEMBER( phillips_22vp931_device::i8049_keypad_r )
+READ8_MEMBER( philips_22vp931_device::i8049_keypad_r )
{
/*
From the code, this is apparently a vestigial keypad with basic controls:
@@ -465,7 +465,7 @@ READ8_MEMBER( phillips_22vp931_device::i8049_keypad_r )
// DATIC circuit
//-------------------------------------------------
-READ8_MEMBER( phillips_22vp931_device::i8049_datic_r )
+READ8_MEMBER( philips_22vp931_device::i8049_datic_r )
{
return m_daticval;
}
@@ -476,7 +476,7 @@ READ8_MEMBER( phillips_22vp931_device::i8049_datic_r )
// external controller wrote
//-------------------------------------------------
-READ8_MEMBER( phillips_22vp931_device::i8049_from_controller_r )
+READ8_MEMBER( philips_22vp931_device::i8049_from_controller_r )
{
// clear the pending flag and return the data
m_fromcontroller_pending = false;
@@ -489,7 +489,7 @@ READ8_MEMBER( phillips_22vp931_device::i8049_from_controller_r )
// the external controller
//-------------------------------------------------
-WRITE8_MEMBER( phillips_22vp931_device::i8049_to_controller_w )
+WRITE8_MEMBER( philips_22vp931_device::i8049_to_controller_w )
{
// set the pending flag and stash the data
m_tocontroller_pending = true;
@@ -508,7 +508,7 @@ WRITE8_MEMBER( phillips_22vp931_device::i8049_to_controller_w )
// i8049_port1_r - read the 8048 I/O port 1
//-------------------------------------------------
-READ8_MEMBER( phillips_22vp931_device::i8049_port1_r )
+READ8_MEMBER( philips_22vp931_device::i8049_port1_r )
{
/*
$80 = P17 = (in) unsure
@@ -527,7 +527,7 @@ READ8_MEMBER( phillips_22vp931_device::i8049_port1_r )
// i8049_port1_w - write the 8048 I/O port 1
//-------------------------------------------------
-WRITE8_MEMBER( phillips_22vp931_device::i8049_port1_w )
+WRITE8_MEMBER( philips_22vp931_device::i8049_port1_w )
{
/*
$10 = P14 = (out) D104 -> /SPEED
@@ -598,7 +598,7 @@ WRITE8_MEMBER( phillips_22vp931_device::i8049_port1_w )
// i8049_port2_r - read from the 8048 I/O port 2
//-------------------------------------------------
-READ8_MEMBER( phillips_22vp931_device::i8049_port2_r )
+READ8_MEMBER( philips_22vp931_device::i8049_port2_r )
{
/*
$80 = P27 = (in) set/reset latch; set by FOC LS, reset by IGR
@@ -619,7 +619,7 @@ READ8_MEMBER( phillips_22vp931_device::i8049_port2_r )
// i8049_port2_w - write the 8048 I/O port 2
//-------------------------------------------------
-WRITE8_MEMBER( phillips_22vp931_device::i8049_port2_w )
+WRITE8_MEMBER( philips_22vp931_device::i8049_port2_w )
{
/*
$40 = P26 = (out) cleared while data is sent back & forth; set afterwards
@@ -633,7 +633,7 @@ WRITE8_MEMBER( phillips_22vp931_device::i8049_port2_w )
// connected to the DATIC's data strobe line
//-------------------------------------------------
-READ_LINE_MEMBER( phillips_22vp931_device::i8049_t0_r )
+READ_LINE_MEMBER( philips_22vp931_device::i8049_t0_r )
{
return m_datastrobe;
}
@@ -645,7 +645,7 @@ READ_LINE_MEMBER( phillips_22vp931_device::i8049_t0_r )
// to count the number of tracks advanced
//-------------------------------------------------
-READ_LINE_MEMBER( phillips_22vp931_device::i8049_t1_r )
+READ_LINE_MEMBER( philips_22vp931_device::i8049_t1_r )
{
return m_trackstate;
}
diff --git a/src/devices/machine/ldvp931.h b/src/devices/machine/ldvp931.h
index 0bf2e263558..fd69f52429e 100644
--- a/src/devices/machine/ldvp931.h
+++ b/src/devices/machine/ldvp931.h
@@ -18,19 +18,11 @@
//**************************************************************************
-// DEVICE CONFIGURATION MACROS
-//**************************************************************************
-
-#define MCFG_LASERDISC_22VP931_ADD(_tag) \
- MCFG_DEVICE_ADD(_tag, PHILLIPS_22VP931, 0)
-
-
-//**************************************************************************
// GLOBAL VARIABLES
//**************************************************************************
// device type definition
-DECLARE_DEVICE_TYPE(PHILLIPS_22VP931, phillips_22vp931_device)
+DECLARE_DEVICE_TYPE(PHILIPS_22VP931, philips_22vp931_device)
@@ -38,17 +30,17 @@ DECLARE_DEVICE_TYPE(PHILLIPS_22VP931, phillips_22vp931_device)
// TYPE DEFINITIONS
//**************************************************************************
-// ======================> phillips_22vp931_device
+// ======================> philips_22vp931_device
// base _22vp931 class
-class phillips_22vp931_device : public laserdisc_device
+class philips_22vp931_device : public laserdisc_device
{
public:
// types
- typedef delegate<void (phillips_22vp931_device &, int)> data_ready_delegate;
+ typedef delegate<void (philips_22vp931_device &, int)> data_ready_delegate;
// construction/destruction
- phillips_22vp931_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+ philips_22vp931_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
// input and output
void data_w(uint8_t data) { synchronize(TID_DEFERRED_DATA, data); }
diff --git a/src/devices/machine/legscsi.h b/src/devices/machine/legscsi.h
index fee1b333061..229580bc0bf 100644
--- a/src/devices/machine/legscsi.h
+++ b/src/devices/machine/legscsi.h
@@ -7,8 +7,6 @@
#include "bus/scsi/scsihle.h"
-#define MCFG_LEGACY_SCSI_PORT(_tag) \
- downcast<legacy_scsi_host_adapter &>(*device).set_scsi_port(_tag);
class legacy_scsi_host_adapter : public device_t
{
diff --git a/src/devices/machine/mb8421.cpp b/src/devices/machine/mb8421.cpp
index a5b08f5ea90..e6344843f92 100644
--- a/src/devices/machine/mb8421.cpp
+++ b/src/devices/machine/mb8421.cpp
@@ -129,14 +129,14 @@ void mb8421_master_device::update_intr(offs_t offset)
// (write to 7FF asserts INTR)
//-------------------------------------------------
-WRITE8_MEMBER(mb8421_device::left_w)
+void mb8421_device::left_w(offs_t offset, u8 data)
{
offset &= 0x7ff;
m_ram[offset] = data;
update_intr<read_or_write::WRITE, false>(offset);
}
-WRITE16_MEMBER(mb8421_mb8431_16_device::left_w)
+void mb8421_mb8431_16_device::left_w(offs_t offset, u16 data, u16 mem_mask)
{
offset &= 0x7ff;
COMBINE_DATA(&m_ram[offset]);
@@ -148,14 +148,14 @@ WRITE16_MEMBER(mb8421_mb8431_16_device::left_w)
// (read from 7FE acknowledges INTL)
//-------------------------------------------------
-READ8_MEMBER(mb8421_device::left_r)
+u8 mb8421_device::left_r(offs_t offset)
{
offset &= 0x7ff;
update_intr<read_or_write::READ, false>(offset);
return m_ram[offset];
}
-READ16_MEMBER(mb8421_mb8431_16_device::left_r)
+u16 mb8421_mb8431_16_device::left_r(offs_t offset, u16 mem_mask)
{
offset &= 0x7ff;
update_intr<read_or_write::READ, false>(offset);
@@ -167,14 +167,14 @@ READ16_MEMBER(mb8421_mb8431_16_device::left_r)
// (write to 7FE asserts INTL)
//-------------------------------------------------
-WRITE8_MEMBER(mb8421_device::right_w)
+void mb8421_device::right_w(offs_t offset, u8 data)
{
offset &= 0x7ff;
m_ram[offset] = data;
update_intr<read_or_write::WRITE, true>(offset);
}
-WRITE16_MEMBER(mb8421_mb8431_16_device::right_w)
+void mb8421_mb8431_16_device::right_w(offs_t offset, u16 data, u16 mem_mask)
{
offset &= 0x7ff;
COMBINE_DATA(&m_ram[offset]);
@@ -186,14 +186,14 @@ WRITE16_MEMBER(mb8421_mb8431_16_device::right_w)
// (read from 7FF acknowledges INTR)
//-------------------------------------------------
-READ8_MEMBER(mb8421_device::right_r)
+u8 mb8421_device::right_r(offs_t offset)
{
offset &= 0x7ff;
update_intr<read_or_write::READ, true>(offset);
return m_ram[offset];
}
-READ16_MEMBER(mb8421_mb8431_16_device::right_r)
+u16 mb8421_mb8431_16_device::right_r(offs_t offset, u16 mem_mask)
{
offset &= 0x7ff;
update_intr<read_or_write::READ, true>(offset);
diff --git a/src/devices/machine/mb8421.h b/src/devices/machine/mb8421.h
index 4ef0a010c9b..00e8f8d207f 100644
--- a/src/devices/machine/mb8421.h
+++ b/src/devices/machine/mb8421.h
@@ -108,10 +108,10 @@ public:
u8 peek(offs_t offset) const { return m_ram[offset & 0x7ff]; }
- DECLARE_WRITE8_MEMBER(left_w);
- DECLARE_READ8_MEMBER(left_r);
- DECLARE_WRITE8_MEMBER(right_w);
- DECLARE_READ8_MEMBER(right_r);
+ void left_w(offs_t offset, u8 data);
+ u8 left_r(offs_t offset);
+ void right_w(offs_t offset, u8 data);
+ u8 right_r(offs_t offset);
protected:
mb8421_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock);
@@ -140,10 +140,10 @@ public:
u16 peek(offs_t offset) const { return m_ram[offset & 0x7ff]; }
- DECLARE_WRITE16_MEMBER(left_w);
- DECLARE_READ16_MEMBER(left_r);
- DECLARE_WRITE16_MEMBER(right_w);
- DECLARE_READ16_MEMBER(right_r);
+ void left_w(offs_t offset, u16 data, u16 mem_mask = 0xffff);
+ u16 left_r(offs_t offset, u16 mem_mask = 0xffff);
+ void right_w(offs_t offset, u16 data, u16 mem_mask = 0xffff);
+ u16 right_r(offs_t offset, u16 mem_mask = 0xffff);
protected:
// device-level overrides
diff --git a/src/devices/machine/mc146818.cpp b/src/devices/machine/mc146818.cpp
index 990d6f3ec35..1259e1502ca 100644
--- a/src/devices/machine/mc146818.cpp
+++ b/src/devices/machine/mc146818.cpp
@@ -510,7 +510,7 @@ void mc146818_device::update_irq()
// read - I/O handler for reading
//-------------------------------------------------
-READ8_MEMBER( mc146818_device::read )
+uint8_t mc146818_device::read(offs_t offset)
{
uint8_t data = 0;
switch (offset)
@@ -520,14 +520,14 @@ READ8_MEMBER( mc146818_device::read )
break;
case 1:
- data = read_direct(space, m_index);
+ data = read_direct(m_index);
break;
}
return data;
}
-READ8_MEMBER( mc146818_device::read_direct )
+uint8_t mc146818_device::read_direct(offs_t offset)
{
uint8_t data = 0;
@@ -569,7 +569,7 @@ READ8_MEMBER( mc146818_device::read_direct )
// write - I/O handler for writing
//-------------------------------------------------
-WRITE8_MEMBER( mc146818_device::write )
+void mc146818_device::write(offs_t offset, uint8_t data)
{
switch (offset)
{
@@ -578,12 +578,12 @@ WRITE8_MEMBER( mc146818_device::write )
break;
case 1:
- write_direct(space, m_index, data);
+ write_direct(m_index, data);
break;
}
}
-WRITE8_MEMBER( mc146818_device::write_direct )
+void mc146818_device::write_direct(offs_t offset, uint8_t data)
{
LOG("mc146818_port_w(): offset=0x%02x data=0x%02x\n", offset, data);
diff --git a/src/devices/machine/mc146818.h b/src/devices/machine/mc146818.h
index 499698a84cd..b1431964dde 100644
--- a/src/devices/machine/mc146818.h
+++ b/src/devices/machine/mc146818.h
@@ -39,12 +39,12 @@ public:
void set_binary_year(int bin) { m_binyear = bin; }
// read/write access
- DECLARE_READ8_MEMBER( read );
- DECLARE_WRITE8_MEMBER( write );
+ uint8_t read(offs_t offset);
+ void write(offs_t offset, uint8_t data);
// direct-mapped read/write access
- DECLARE_READ8_MEMBER( read_direct );
- DECLARE_WRITE8_MEMBER( write_direct );
+ uint8_t read_direct(offs_t offset);
+ void write_direct(offs_t offset, uint8_t data);
protected:
mc146818_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock);
diff --git a/src/devices/machine/mc6843.h b/src/devices/machine/mc6843.h
index 29f3b862bda..63052970edb 100644
--- a/src/devices/machine/mc6843.h
+++ b/src/devices/machine/mc6843.h
@@ -15,8 +15,6 @@
#include "imagedev/flopdrv.h"
-#define MCFG_MC6843_IRQ_CALLBACK(_write) \
- downcast<mc6843_device &>(*device).set_irq_wr_callback(DEVCB_##_write);
class mc6843_device : public device_t
{
diff --git a/src/devices/machine/mc6852.cpp b/src/devices/machine/mc6852.cpp
index d2021a450a2..6d5a9876153 100644
--- a/src/devices/machine/mc6852.cpp
+++ b/src/devices/machine/mc6852.cpp
@@ -147,7 +147,7 @@ void mc6852_device::rcv_complete()
// read -
//-------------------------------------------------
-READ8_MEMBER( mc6852_device::read )
+uint8_t mc6852_device::read(offs_t offset)
{
uint8_t data = 0;
@@ -156,7 +156,8 @@ READ8_MEMBER( mc6852_device::read )
if (m_rx_fifo.size() > 0)
{
data = m_rx_fifo.front();
- m_rx_fifo.pop();
+ if (!machine().side_effects_disabled())
+ m_rx_fifo.pop();
}
}
else
@@ -172,7 +173,7 @@ READ8_MEMBER( mc6852_device::read )
// write -
//-------------------------------------------------
-WRITE8_MEMBER( mc6852_device::write )
+void mc6852_device::write(offs_t offset, uint8_t data)
{
if (BIT(offset, 0))
{
diff --git a/src/devices/machine/mc6852.h b/src/devices/machine/mc6852.h
index 798529db3ef..3f05182ed6f 100644
--- a/src/devices/machine/mc6852.h
+++ b/src/devices/machine/mc6852.h
@@ -32,30 +32,6 @@
//**************************************************************************
-// INTERFACE CONFIGURATION MACROS
-//**************************************************************************
-
-#define MCFG_MC6852_RX_CLOCK(_clock) \
- downcast<mc6852_device &>(*device).set_rx_clock(_clock);
-
-#define MCFG_MC6852_TX_CLOCK(_clock) \
- downcast<mc6852_device &>(*device).set_tx_clock(_clock);
-
-#define MCFG_MC6852_TX_DATA_CALLBACK(_write) \
- downcast<mc6852_device &>(*device).set_tx_data_wr_callback(DEVCB_##_write);
-
-#define MCFG_MC6852_IRQ_CALLBACK(_write) \
- downcast<mc6852_device &>(*device).set_irq_wr_callback(DEVCB_##_write);
-
-#define MCFG_MC6852_SM_DTR_CALLBACK(_write) \
- downcast<mc6852_device &>(*device).set_sm_dtr_wr_callback(DEVCB_##_write);
-
-#define MCFG_MC6852_TUF_CALLBACK(_write) \
- downcast<mc6852_device &>(*device).set_tuf_wr_callback(DEVCB_##_write);
-
-
-
-//**************************************************************************
// TYPE DEFINITIONS
//**************************************************************************
@@ -70,18 +46,14 @@ public:
void set_rx_clock(int clock) { m_rx_clock = clock; }
void set_tx_clock(int clock) { m_tx_clock = clock; }
- template <class Object> devcb_base &set_tx_data_wr_callback(Object &&cb) { return m_write_tx_data.set_callback(std::forward<Object>(cb)); }
- template <class Object> devcb_base &set_irq_wr_callback(Object &&cb) { return m_write_irq.set_callback(std::forward<Object>(cb)); }
- template <class Object> devcb_base &set_sm_dtr_wr_callback(Object &&cb) { return m_write_sm_dtr.set_callback(std::forward<Object>(cb)); }
- template <class Object> devcb_base &set_tuf_wr_callback(Object &&cb) { return m_write_tuf.set_callback(std::forward<Object>(cb)); }
auto tx_data_callback() { return m_write_tx_data.bind(); }
auto irq_callback() { return m_write_irq.bind(); }
auto sm_dtr_callback() { return m_write_sm_dtr.bind(); }
auto tuf_callback() { return m_write_tuf.bind(); }
- DECLARE_READ8_MEMBER( read );
- DECLARE_WRITE8_MEMBER( write );
+ uint8_t read(offs_t offset);
+ void write(offs_t offset, uint8_t data);
DECLARE_WRITE_LINE_MEMBER( rx_data_w ) { device_serial_interface::rx_w(state); }
DECLARE_WRITE_LINE_MEMBER( rx_clk_w ) { rx_clock_w(state); }
diff --git a/src/devices/machine/mc6854.cpp b/src/devices/machine/mc6854.cpp
index 43e09eba5d2..acaa74b0cf9 100644
--- a/src/devices/machine/mc6854.cpp
+++ b/src/devices/machine/mc6854.cpp
@@ -809,7 +809,7 @@ void mc6854_device::update_sr1( )
-READ8_MEMBER( mc6854_device::read )
+uint8_t mc6854_device::read(offs_t offset)
{
switch ( offset )
{
@@ -850,7 +850,7 @@ READ8_MEMBER( mc6854_device::read )
-WRITE8_MEMBER( mc6854_device::write )
+void mc6854_device::write(offs_t offset, uint8_t data)
{
switch ( offset )
{
diff --git a/src/devices/machine/mc6854.h b/src/devices/machine/mc6854.h
index 99f09f5d3a7..0f90544336b 100644
--- a/src/devices/machine/mc6854.h
+++ b/src/devices/machine/mc6854.h
@@ -40,8 +40,8 @@ public:
}
/* interface to CPU via address/data bus*/
- DECLARE_READ8_MEMBER( read );
- DECLARE_WRITE8_MEMBER( write );
+ uint8_t read(offs_t offset);
+ void write(offs_t offset, uint8_t data);
/* low-level, bit-based interface */
DECLARE_WRITE_LINE_MEMBER( set_rx );
diff --git a/src/devices/machine/mc68681.cpp b/src/devices/machine/mc68681.cpp
index b60567aa3f7..a3a3b480979 100644
--- a/src/devices/machine/mc68681.cpp
+++ b/src/devices/machine/mc68681.cpp
@@ -268,22 +268,25 @@ void xr68c681_device::device_reset()
m_XTXA = m_XRXA = m_XTXB = m_XRXB = false;
}
-MACHINE_CONFIG_START(duart_base_device::device_add_mconfig)
- MCFG_DEVICE_ADD(CHANA_TAG, DUART_CHANNEL, 0)
- MCFG_DEVICE_ADD(CHANB_TAG, DUART_CHANNEL, 0)
-MACHINE_CONFIG_END
-
-MACHINE_CONFIG_START(sc28c94_device::device_add_mconfig)
- MCFG_DEVICE_ADD(CHANA_TAG, DUART_CHANNEL, 0)
- MCFG_DEVICE_ADD(CHANB_TAG, DUART_CHANNEL, 0)
- MCFG_DEVICE_ADD(CHANC_TAG, DUART_CHANNEL, 0)
- MCFG_DEVICE_ADD(CHAND_TAG, DUART_CHANNEL, 0)
-MACHINE_CONFIG_END
-
-MACHINE_CONFIG_START(mc68340_duart_device::device_add_mconfig)
- MCFG_DEVICE_ADD(CHANA_TAG, DUART_CHANNEL, 0)
- MCFG_DEVICE_ADD(CHANB_TAG, DUART_CHANNEL, 0)
-MACHINE_CONFIG_END
+void duart_base_device::device_add_mconfig(machine_config &config)
+{
+ DUART_CHANNEL(config, CHANA_TAG, 0);
+ DUART_CHANNEL(config, CHANB_TAG, 0);
+}
+
+void sc28c94_device::device_add_mconfig(machine_config &config)
+{
+ DUART_CHANNEL(config, CHANA_TAG, 0);
+ DUART_CHANNEL(config, CHANB_TAG, 0);
+ DUART_CHANNEL(config, CHANC_TAG, 0);
+ DUART_CHANNEL(config, CHAND_TAG, 0);
+}
+
+void mc68340_duart_device::device_add_mconfig(machine_config &config)
+{
+ DUART_CHANNEL(config, CHANA_TAG, 0);
+ DUART_CHANNEL(config, CHANB_TAG, 0);
+}
void duart_base_device::update_interrupts()
{
diff --git a/src/devices/machine/mc68681.h b/src/devices/machine/mc68681.h
index ea4fd63e3af..50e5cdd1489 100644
--- a/src/devices/machine/mc68681.h
+++ b/src/devices/machine/mc68681.h
@@ -7,32 +7,6 @@
#include "diserial.h"
-#define MCFG_MC68681_IRQ_CALLBACK(_cb) \
- downcast<duart_base_device &>(*device).set_irq_cb(DEVCB_##_cb);
-
-#define MCFG_MC68681_A_TX_CALLBACK(_cb) \
- downcast<duart_base_device &>(*device).set_a_tx_cb(DEVCB_##_cb);
-
-#define MCFG_MC68681_B_TX_CALLBACK(_cb) \
- downcast<duart_base_device &>(*device).set_b_tx_cb(DEVCB_##_cb);
-
-// deprecated: use ipX_w() instead
-#define MCFG_MC68681_INPORT_CALLBACK(_cb) \
- downcast<duart_base_device &>(*device).set_inport_cb(DEVCB_##_cb);
-
-#define MCFG_MC68681_OUTPORT_CALLBACK(_cb) \
- downcast<duart_base_device &>(*device).set_outport_cb(DEVCB_##_cb);
-
-#define MCFG_MC68681_SET_EXTERNAL_CLOCKS(_a, _b, _c, _d) \
- downcast<duart_base_device &>(*device).set_clocks(_a, _b, _c, _d);
-
-// SC28C94 specific callbacks
-#define MCFG_SC28C94_C_TX_CALLBACK(_cb) \
- downcast<sc28c94_device &>(*device).set_c_tx_cb(DEVCB_##_cb);
-
-#define MCFG_SC28C94_D_TX_CALLBACK(_cb) \
- downcast<sc28c94_device &>(*device).set_d_tx_cb(DEVCB_##_cb);
-
#define MC68681_RX_FIFO_SIZE 3
// forward declaration
@@ -127,15 +101,10 @@ public:
DECLARE_WRITE_LINE_MEMBER(rx_a_w) { m_chanA->device_serial_interface::rx_w((uint8_t)state); }
DECLARE_WRITE_LINE_MEMBER(rx_b_w) { m_chanB->device_serial_interface::rx_w((uint8_t)state); }
- template <class Object> devcb_base &set_irq_cb(Object &&cb) { return write_irq.set_callback(std::forward<Object>(cb)); }
- template <class Object> devcb_base &set_a_tx_cb(Object &&cb) { return write_a_tx.set_callback(std::forward<Object>(cb)); }
- template <class Object> devcb_base &set_b_tx_cb(Object &&cb) { return write_b_tx.set_callback(std::forward<Object>(cb)); }
- template <class Object> devcb_base &set_inport_cb(Object &&cb) { return read_inport.set_callback(std::forward<Object>(cb)); }
- template <class Object> devcb_base &set_outport_cb(Object &&cb) { return write_outport.set_callback(std::forward<Object>(cb)); }
auto irq_cb() { return write_irq.bind(); }
auto a_tx_cb() { return write_a_tx.bind(); }
auto b_tx_cb() { return write_b_tx.bind(); }
- auto inport_cb() { return read_inport.bind(); }
+ auto inport_cb() { return read_inport.bind(); } // deprecated: use ipX_w() instead
auto outport_cb() { return write_outport.bind(); }
// new-style push handlers for input port bits
@@ -247,8 +216,8 @@ class sc28c94_device : public duart_base_device
public:
sc28c94_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- template <class Object> devcb_base &set_c_tx_cb(Object &&cb) { return write_c_tx.set_callback(std::forward<Object>(cb)); }
- template <class Object> devcb_base &set_d_tx_cb(Object &&cb) { return write_d_tx.set_callback(std::forward<Object>(cb)); }
+ auto c_tx_cb() { return write_c_tx.bind(); }
+ auto d_tx_cb() { return write_d_tx.bind(); }
DECLARE_WRITE_LINE_MEMBER(rx_c_w) { m_chanC->device_serial_interface::rx_w((uint8_t)state); }
DECLARE_WRITE_LINE_MEMBER(rx_d_w) { m_chanD->device_serial_interface::rx_w((uint8_t)state); }
diff --git a/src/devices/machine/mccs1850.h b/src/devices/machine/mccs1850.h
index bd7771bc6a0..62b7f5d5afc 100644
--- a/src/devices/machine/mccs1850.h
+++ b/src/devices/machine/mccs1850.h
@@ -25,22 +25,6 @@
#include "dirtc.h"
-
-//**************************************************************************
-// INTERFACE CONFIGURATION MACROS
-//**************************************************************************
-
-#define MCFG_MCCS1850_INT_CALLBACK(_write) \
- downcast<mccs1850_device &>(*device).set_int_wr_callback(DEVCB_##_write);
-
-#define MCFG_MCCS1850_PSE_CALLBACK(_write) \
- downcast<mccs1850_device &>(*device).set_pse_wr_callback(DEVCB_##_write);
-
-#define MCFG_MCCS1850_NUC_CALLBACK(_write) \
- downcast<mccs1850_device &>(*device).set_nuc_wr_callback(DEVCB_##_write);
-
-
-
//**************************************************************************
// TYPE DEFINITIONS
//**************************************************************************
@@ -55,9 +39,9 @@ public:
// construction/destruction
mccs1850_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- template <class Object> devcb_base &set_int_wr_callback(Object &&cb) { return int_cb.set_callback(std::forward<Object>(cb)); }
- template <class Object> devcb_base &set_pse_wr_callback(Object &&cb) { return pse_cb.set_callback(std::forward<Object>(cb)); }
- template <class Object> devcb_base &set_nuc_wr_callback(Object &&cb) { return nuc_cb.set_callback(std::forward<Object>(cb)); }
+ auto int_wr_callback() { return int_cb.bind(); }
+ auto pse_wr_callback() { return pse_cb.bind(); }
+ auto nuc_wr_callback() { return nuc_cb.bind(); }
DECLARE_WRITE_LINE_MEMBER( ce_w );
DECLARE_WRITE_LINE_MEMBER( sck_w );
diff --git a/src/devices/machine/mcf5206e.cpp b/src/devices/machine/mcf5206e.cpp
index 085afac92ec..cea38ca7f0f 100644
--- a/src/devices/machine/mcf5206e.cpp
+++ b/src/devices/machine/mcf5206e.cpp
@@ -826,7 +826,7 @@ DEFINE_DEVICE_TYPE(MCF5206E_PERIPHERAL, mcf5206e_peripheral_device, "mcf5206e_pe
mcf5206e_peripheral_device::mcf5206e_peripheral_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
: device_t(mconfig, MCF5206E_PERIPHERAL, tag, owner, clock),
device_memory_interface(mconfig, *this),
- m_space_config("coldfire_regs", ENDIANNESS_BIG, 32,10, 0, address_map_constructor(), address_map_constructor(FUNC(mcf5206e_peripheral_device::coldfire_regs_map), this))
+ m_space_config("coldfire_regs", ENDIANNESS_BIG, 32,10, 0, address_map_constructor(FUNC(mcf5206e_peripheral_device::coldfire_regs_map), this))
{
}
diff --git a/src/devices/machine/mcf5206e.h b/src/devices/machine/mcf5206e.h
index 3bf54bbefd5..a910849a25d 100644
--- a/src/devices/machine/mcf5206e.h
+++ b/src/devices/machine/mcf5206e.h
@@ -12,15 +12,6 @@
#pragma once
-
-
-/***************************************************************************
- DEVICE CONFIGURATION MACROS
-***************************************************************************/
-
-#define MCFG_MCF5206E_PERIPHERAL_ADD(_tag) \
- MCFG_DEVICE_ADD(_tag, MCF5206E_PERIPHERAL, 0)
-
/***************************************************************************
TYPE DEFINITIONS
***************************************************************************/
diff --git a/src/devices/machine/meters.h b/src/devices/machine/meters.h
index 1a349f82485..c9a11790931 100644
--- a/src/devices/machine/meters.h
+++ b/src/devices/machine/meters.h
@@ -15,9 +15,6 @@
#pragma once
-#define MCFG_METERS_NUMBER(_number) \
- downcast<meters_device &>(*device).set_number_meters(_number);
-
class meters_device : public device_t
{
public:
@@ -27,7 +24,7 @@ public:
meters_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- void set_number_meters(int number) { m_number_mtr = number; }
+ void set_number(int number) { m_number_mtr = number; }
int update(int id, int state);
int GetActivity(int id);
diff --git a/src/devices/machine/microtch.h b/src/devices/machine/microtch.h
index 592b0a669da..0cb486aa3f1 100644
--- a/src/devices/machine/microtch.h
+++ b/src/devices/machine/microtch.h
@@ -13,15 +13,14 @@ class microtouch_device :
{
public:
microtouch_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- template <class Object> devcb_base &set_stx_callback(Object &&cb) { return m_out_stx_func.set_callback(std::forward<Object>(cb)); }
auto stx() { return m_out_stx_func.bind(); }
virtual ioport_constructor device_input_ports() const override;
DECLARE_WRITE_LINE_MEMBER(rx) { device_serial_interface::rx_w(state); }
DECLARE_INPUT_CHANGED_MEMBER(touch);
- typedef delegate<int (int *, int *)> touch_cb;
- template <typename Object> void set_touch_callback(Object &&cb) { m_out_touch_cb = std::forward<Object>(cb); }
+ typedef device_delegate<int (int *, int *)> touch_cb;
+ template <typename... T> void set_touch_callback(T &&... args) { m_out_touch_cb = touch_cb(std::forward<T>(args)...); }
protected:
virtual void device_start() override;
@@ -73,11 +72,4 @@ private:
DECLARE_DEVICE_TYPE(MICROTOUCH, microtouch_device)
-#define MCFG_MICROTOUCH_ADD(_tag, _clock, _devcb) \
- MCFG_DEVICE_ADD(_tag, MICROTOUCH, _clock) \
- downcast<microtouch_device &>(*device).set_stx_callback(DEVCB_##_devcb);
-
-#define MCFG_MICROTOUCH_TOUCH_CB(_class, _touch_cb) \
- downcast<microtouch_device &>(*device).set_touch_callback(microtouch_device::touch_cb(&_class::_touch_cb, this));
-
#endif // MAME_MACHINE_MICROTCH_H
diff --git a/src/devices/machine/mm5740.h b/src/devices/machine/mm5740.h
index e28fbdc0956..1896f568e4c 100644
--- a/src/devices/machine/mm5740.h
+++ b/src/devices/machine/mm5740.h
@@ -80,23 +80,6 @@ Vgg 18 -12V
//**************************************************************************
-// INTERFACE CONFIGURATION MACROS
-//**************************************************************************
-
-#define MCFG_MM5740_MATRIX_X1(_cb) downcast<mm5740_device &>(*device).set_x_cb<0>(DEVCB_##_cb);
-#define MCFG_MM5740_MATRIX_X2(_cb) downcast<mm5740_device &>(*device).set_x_cb<1>(DEVCB_##_cb);
-#define MCFG_MM5740_MATRIX_X3(_cb) downcast<mm5740_device &>(*device).set_x_cb<2>(DEVCB_##_cb);
-#define MCFG_MM5740_MATRIX_X4(_cb) downcast<mm5740_device &>(*device).set_x_cb<3>(DEVCB_##_cb);
-#define MCFG_MM5740_MATRIX_X5(_cb) downcast<mm5740_device &>(*device).set_x_cb<4>(DEVCB_##_cb);
-#define MCFG_MM5740_MATRIX_X6(_cb) downcast<mm5740_device &>(*device).set_x_cb<5>(DEVCB_##_cb);
-#define MCFG_MM5740_MATRIX_X7(_cb) downcast<mm5740_device &>(*device).set_x_cb<6>(DEVCB_##_cb);
-#define MCFG_MM5740_MATRIX_X8(_cb) downcast<mm5740_device &>(*device).set_x_cb<7>(DEVCB_##_cb);
-#define MCFG_MM5740_MATRIX_X9(_cb) downcast<mm5740_device &>(*device).set_x_cb<8>(DEVCB_##_cb);
-#define MCFG_MM5740_SHIFT_CB(_cb) downcast<mm5740_device &>(*device).set_shift_cb(DEVCB_##_cb);
-#define MCFG_MM5740_CONTROL_CB(_cb) downcast<mm5740_device &>(*device).set_control_cb(DEVCB_##_cb);
-#define MCFG_MM5740_DATA_READY_CB(_cb) downcast<mm5740_device &>(*device).set_data_ready_cb(DEVCB_##_cb);
-
-//**************************************************************************
// TYPE DEFINITIONS
//**************************************************************************
@@ -111,22 +94,11 @@ public:
// public interface
uint16_t b_r();
- template <unsigned N, typename Object> devcb_base &set_x_cb(Object &&cb)
- {
- return m_read_x[N].set_callback(std::forward<Object>(cb));
- }
- template <typename Object> devcb_base &set_shift_cb(Object &&cb)
- {
- return m_read_shift.set_callback(std::forward<Object>(cb));
- }
- template <typename Object> devcb_base &set_control_cb(Object &&cb)
- {
- return m_read_control.set_callback(std::forward<Object>(cb));
- }
- template <typename Object> devcb_base &set_data_ready_cb(Object &&cb)
- {
- return m_write_data_ready.set_callback(std::forward<Object>(cb));
- }
+ template <unsigned N> auto x_cb() { return m_read_x[N].bind(); }
+ auto shift_cb() { return m_read_shift.bind(); }
+ auto control_cb() { return m_read_control.bind(); }
+ auto data_ready_cb() { return m_write_data_ready.bind(); }
+
static uint32_t calc_effective_clock_key_debounce(uint32_t capacitance);
protected:
diff --git a/src/devices/machine/mm58167.cpp b/src/devices/machine/mm58167.cpp
index 22b49f4a7dd..f226590e9d2 100644
--- a/src/devices/machine/mm58167.cpp
+++ b/src/devices/machine/mm58167.cpp
@@ -180,7 +180,7 @@ void mm58167_device::update_rtc()
m_milliseconds = (bcd_to_integer(m_regs[R_CNT_HUNDTENTHS]) * 10) + (bcd_to_integer(m_regs[R_CNT_MILLISECONDS] >> 4) % 10);
}
-READ8_MEMBER(mm58167_device::read)
+uint8_t mm58167_device::read(offs_t offset)
{
// printf("read reg %x = %02x\n", offset, m_regs[offset]);
@@ -196,7 +196,7 @@ READ8_MEMBER(mm58167_device::read)
return m_regs[offset];
}
-WRITE8_MEMBER(mm58167_device::write)
+void mm58167_device::write(offs_t offset, uint8_t data)
{
// printf("%02x to reg %x\n", data, offset);
diff --git a/src/devices/machine/mm58167.h b/src/devices/machine/mm58167.h
index 2c6bb5add34..c12b151b676 100644
--- a/src/devices/machine/mm58167.h
+++ b/src/devices/machine/mm58167.h
@@ -15,14 +15,6 @@
//**************************************************************************
-// INTERFACE CONFIGURATION MACROS
-//**************************************************************************
-
-#define MCFG_MM58167_IRQ_CALLBACK(_cb) \
- downcast<mm58167_device &>(*device).set_irq_cb(DEVCB_##_cb);
-
-
-//**************************************************************************
// TYPE DEFINITIONS
//**************************************************************************
@@ -35,10 +27,9 @@ public:
// construction/destruction
mm58167_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- DECLARE_READ8_MEMBER(read);
- DECLARE_WRITE8_MEMBER(write);
+ uint8_t read(offs_t offset);
+ void write(offs_t offset, uint8_t data);
- template <class Object> devcb_base &set_irq_cb(Object &&wr) { return m_irq_w.set_callback(std::forward<Object>(wr)); }
auto irq() { return m_irq_w.bind(); }
devcb_write_line m_irq_w;
diff --git a/src/devices/machine/mm58274c.cpp b/src/devices/machine/mm58274c.cpp
index 61904923326..c7e7f49a78e 100644
--- a/src/devices/machine/mm58274c.cpp
+++ b/src/devices/machine/mm58274c.cpp
@@ -152,7 +152,7 @@ attotime mm58274c_device::interrupt_period_table(int val)
}
}
-READ8_MEMBER( mm58274c_device::read )
+uint8_t mm58274c_device::read(offs_t offset)
{
int reply;
@@ -242,7 +242,7 @@ READ8_MEMBER( mm58274c_device::read )
}
-WRITE8_MEMBER( mm58274c_device::write )
+void mm58274c_device::write(offs_t offset, uint8_t data)
{
offset &= 0xf;
data &= 0xf;
diff --git a/src/devices/machine/mm58274c.h b/src/devices/machine/mm58274c.h
index cee2df48db9..c6fcbee3c46 100644
--- a/src/devices/machine/mm58274c.h
+++ b/src/devices/machine/mm58274c.h
@@ -16,8 +16,8 @@ public:
void set_day1(int day) { m_day1 = day; }
void set_mode_and_day(int mode, int day) { m_mode24 = mode; m_day1 = day; }
- DECLARE_READ8_MEMBER(read);
- DECLARE_WRITE8_MEMBER(write);
+ uint8_t read(offs_t offset);
+ void write(offs_t offset, uint8_t data);
TIMER_CALLBACK_MEMBER(rtc_increment_cb);
TIMER_CALLBACK_MEMBER(rtc_interrupt_cb);
@@ -30,7 +30,7 @@ protected:
private:
// internal state
- // Initializion the clock chip:
+ // Initialization of the clock chip:
// m_day1 must be set to a value from 0 (sunday), 1 (monday)...
// to 6 (saturday) and is needed to correctly retrieve the
// day-of-week from the host system clock.
@@ -66,15 +66,4 @@ private:
DECLARE_DEVICE_TYPE(MM58274C, mm58274c_device)
-
-/***************************************************************************
- DEVICE CONFIGURATION MACROS
-***************************************************************************/
-
-#define MCFG_MM58274C_MODE24(_mode) \
- downcast<mm58274c_device &>(*device).set_mode24(_mode);
-
-#define MCFG_MM58274C_DAY1(_day) \
- downcast<mm58274c_device &>(*device).set_day1(_day);
-
#endif // MAME_MACHINE_MM58274C_H
diff --git a/src/devices/machine/mm74c922.h b/src/devices/machine/mm74c922.h
index bd448c2eb22..dce81dd40dc 100644
--- a/src/devices/machine/mm74c922.h
+++ b/src/devices/machine/mm74c922.h
@@ -36,38 +36,6 @@
#pragma once
-
-
-//**************************************************************************
-// INTERFACE CONFIGURATION MACROS
-//**************************************************************************
-
-#define MCFG_MM74C922_OSC(_value) \
- downcast<mm74c922_device &>(*device).set_cap_osc(_value);
-
-#define MCFG_MM74C922_DEBOUNCE(_value) \
- downcast<mm74c922_device &>(*device).set_cap_debounce(_value);
-
-#define MCFG_MM74C922_DA_CALLBACK(_write) \
- downcast<mm74c922_device &>(*device).set_da_wr_callback(DEVCB_##_write);
-
-#define MCFG_MM74C922_X1_CALLBACK(_read) \
- downcast<mm74c922_device &>(*device).set_x1_rd_callback(DEVCB_##_read);
-
-#define MCFG_MM74C922_X2_CALLBACK(_read) \
- downcast<mm74c922_device &>(*device).set_x2_rd_callback(DEVCB_##_read);
-
-#define MCFG_MM74C922_X3_CALLBACK(_read) \
- downcast<mm74c922_device &>(*device).set_x3_rd_callback(DEVCB_##_read);
-
-#define MCFG_MM74C922_X4_CALLBACK(_read) \
- downcast<mm74c922_device &>(*device).set_x4_rd_callback(DEVCB_##_read);
-
-#define MCFG_MM74C922_X5_CALLBACK(_read) \
- downcast<mm74c922_device &>(*device).set_x5_rd_callback(DEVCB_##_read);
-
-
-
//**************************************************************************
// TYPE DEFINITIONS
//**************************************************************************
@@ -83,12 +51,12 @@ public:
void set_cap_osc(double value) { m_cap_osc = value; }
void set_cap_debounce(double value) { m_cap_debounce = value; }
- template <class Object> devcb_base &set_da_wr_callback(Object &&cb) { return m_write_da.set_callback(std::forward<Object>(cb)); }
- template <class Object> devcb_base &set_x1_rd_callback(Object &&cb) { return m_read_x1.set_callback(std::forward<Object>(cb)); }
- template <class Object> devcb_base &set_x2_rd_callback(Object &&cb) { return m_read_x2.set_callback(std::forward<Object>(cb)); }
- template <class Object> devcb_base &set_x3_rd_callback(Object &&cb) { return m_read_x3.set_callback(std::forward<Object>(cb)); }
- template <class Object> devcb_base &set_x4_rd_callback(Object &&cb) { return m_read_x4.set_callback(std::forward<Object>(cb)); }
- template <class Object> devcb_base &set_x5_rd_callback(Object &&cb) { return m_read_x5.set_callback(std::forward<Object>(cb)); }
+ auto da_wr_callback() { return m_write_da.bind(); }
+ auto x1_rd_callback() { return m_read_x1.bind(); }
+ auto x2_rd_callback() { return m_read_x2.bind(); }
+ auto x3_rd_callback() { return m_read_x3.bind(); }
+ auto x4_rd_callback() { return m_read_x4.bind(); }
+ auto x5_rd_callback() { return m_read_x5.bind(); }
uint8_t read();
diff --git a/src/devices/machine/mos6526.cpp b/src/devices/machine/mos6526.cpp
index 9df653c4c5f..e1f40b109c1 100644
--- a/src/devices/machine/mos6526.cpp
+++ b/src/devices/machine/mos6526.cpp
@@ -788,7 +788,7 @@ void mos6526_device::execute_run()
// read -
//-------------------------------------------------
-READ8_MEMBER( mos6526_device::read )
+uint8_t mos6526_device::read(offs_t offset)
{
uint8_t data = 0;
@@ -926,7 +926,7 @@ READ8_MEMBER( mos6526_device::read )
return data;
}
-READ8_MEMBER( mos8520_device::read )
+uint8_t mos8520_device::read(offs_t offset)
{
uint8_t data;
@@ -947,7 +947,7 @@ READ8_MEMBER( mos8520_device::read )
break;
default:
- data = mos6526_device::read(space, offset);
+ data = mos6526_device::read(offset);
}
return data;
@@ -957,7 +957,7 @@ READ8_MEMBER( mos8520_device::read )
// write -
//-------------------------------------------------
-WRITE8_MEMBER( mos6526_device::write )
+void mos6526_device::write(offs_t offset, uint8_t data)
{
switch (offset & 0x0f)
{
@@ -1099,12 +1099,12 @@ WRITE8_MEMBER( mos6526_device::write )
}
}
-WRITE8_MEMBER( mos8520_device::write )
+void mos8520_device::write(offs_t offset, uint8_t data)
{
switch (offset & 0x0f)
{
default:
- mos6526_device::write(space, offset, data);
+ mos6526_device::write(offset, data);
break;
case TOD_MIN:
diff --git a/src/devices/machine/mos6526.h b/src/devices/machine/mos6526.h
index 07001edf4d6..33ccc6dd26d 100644
--- a/src/devices/machine/mos6526.h
+++ b/src/devices/machine/mos6526.h
@@ -61,41 +61,6 @@
#pragma once
-
-
-//**************************************************************************
-// INTERFACE CONFIGURATION MACROS
-//**************************************************************************
-
-#define MCFG_MOS6526_TOD(_clock) \
- downcast<mos6526_device &>(*device).set_tod_clock(_clock);
-
-#define MCFG_MOS6526_IRQ_CALLBACK(_write) \
- downcast<mos6526_device &>(*device).set_irq_wr_callback(DEVCB_##_write);
-
-#define MCFG_MOS6526_CNT_CALLBACK(_write) \
- downcast<mos6526_device &>(*device).set_cnt_wr_callback(DEVCB_##_write);
-
-#define MCFG_MOS6526_SP_CALLBACK(_write) \
- downcast<mos6526_device &>(*device).set_sp_wr_callback(DEVCB_##_write);
-
-#define MCFG_MOS6526_PA_INPUT_CALLBACK(_read) \
- downcast<mos6526_device &>(*device).set_pa_rd_callback(DEVCB_##_read);
-
-#define MCFG_MOS6526_PA_OUTPUT_CALLBACK(_write) \
- downcast<mos6526_device &>(*device).set_pa_wr_callback(DEVCB_##_write);
-
-#define MCFG_MOS6526_PB_INPUT_CALLBACK(_read) \
- downcast<mos6526_device &>(*device).set_pb_rd_callback(DEVCB_##_read);
-
-#define MCFG_MOS6526_PB_OUTPUT_CALLBACK(_write) \
- downcast<mos6526_device &>(*device).set_pb_wr_callback(DEVCB_##_write);
-
-#define MCFG_MOS6526_PC_CALLBACK(_write) \
- downcast<mos6526_device &>(*device).set_pc_wr_callback(DEVCB_##_write);
-
-
-
//**************************************************************************
// TYPE DEFINITIONS
//**************************************************************************
@@ -111,14 +76,6 @@ public:
void set_tod_clock(int clock) { m_tod_clock = clock; }
- template <class Object> devcb_base &set_irq_wr_callback(Object &&cb) { return m_write_irq.set_callback(std::forward<Object>(cb)); }
- template <class Object> devcb_base &set_cnt_wr_callback(Object &&cb) { return m_write_cnt.set_callback(std::forward<Object>(cb)); }
- template <class Object> devcb_base &set_sp_wr_callback(Object &&cb) { return m_write_sp.set_callback(std::forward<Object>(cb)); }
- template <class Object> devcb_base &set_pa_rd_callback(Object &&cb) { return m_read_pa.set_callback(std::forward<Object>(cb)); }
- template <class Object> devcb_base &set_pa_wr_callback(Object &&cb) { return m_write_pa.set_callback(std::forward<Object>(cb)); }
- template <class Object> devcb_base &set_pb_rd_callback(Object &&cb) { return m_read_pb.set_callback(std::forward<Object>(cb)); }
- template <class Object> devcb_base &set_pb_wr_callback(Object &&cb) { return m_write_pb.set_callback(std::forward<Object>(cb)); }
- template <class Object> devcb_base &set_pc_wr_callback(Object &&cb) { return m_write_pc.set_callback(std::forward<Object>(cb)); }
auto irq_wr_callback() { return m_write_irq.bind(); }
auto cnt_wr_callback() { return m_write_cnt.bind(); }
auto sp_wr_callback() { return m_write_sp.bind(); }
@@ -128,13 +85,11 @@ public:
auto pb_wr_callback() { return m_write_pb.bind(); }
auto pc_wr_callback() { return m_write_pc.bind(); }
- DECLARE_READ8_MEMBER( read );
- DECLARE_WRITE8_MEMBER( write );
+ uint8_t read(offs_t offset);
+ void write(offs_t offset, uint8_t data);
- uint8_t read_pa() { return m_pa; }
- DECLARE_READ8_MEMBER( pa_r ) { return m_pa; }
- uint8_t read_pb() { return m_pb; }
- DECLARE_READ8_MEMBER( pb_r ) { return m_pb; }
+ uint8_t pa_r() { return m_pa; }
+ uint8_t pb_r() { return m_pb; }
DECLARE_READ_LINE_MEMBER( sp_r ) { return m_sp; }
DECLARE_WRITE_LINE_MEMBER( sp_w );
@@ -273,8 +228,8 @@ class mos8520_device : public mos6526_device
public:
mos8520_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- DECLARE_READ8_MEMBER( read );
- DECLARE_WRITE8_MEMBER( write );
+ uint8_t read(offs_t offset);
+ void write(offs_t offset, uint8_t data);
protected:
virtual inline void clock_tod() override;
@@ -288,8 +243,8 @@ class mos5710_device : public mos6526_device
public:
mos5710_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- //DECLARE_READ8_MEMBER( read );
- //DECLARE_WRITE8_MEMBER( write );
+ //uint8_t read(offs_t offset);
+ //void write(offs_t offset, uint8_t data);
};
diff --git a/src/devices/machine/mos6530.h b/src/devices/machine/mos6530.h
index cc930fa8613..6bbeb8db9de 100644
--- a/src/devices/machine/mos6530.h
+++ b/src/devices/machine/mos6530.h
@@ -48,10 +48,10 @@ class mos6530_device : public device_t
public:
mos6530_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- template <class Object> devcb_base &set_in_pa_callback(Object &&cb) { return m_in_pa_cb.set_callback(std::forward<Object>(cb)); }
- template <class Object> devcb_base &set_out_pa_callback(Object &&cb) { return m_out_pa_cb.set_callback(std::forward<Object>(cb)); }
- template <class Object> devcb_base &set_in_pb_callback(Object &&cb) { return m_in_pb_cb.set_callback(std::forward<Object>(cb)); }
- template <class Object> devcb_base &set_out_pb_callback(Object &&cb) { return m_out_pb_cb.set_callback(std::forward<Object>(cb)); }
+ auto in_pa_callback() { return m_in_pa_cb.bind(); }
+ auto out_pa_callback() { return m_out_pa_cb.bind(); }
+ auto in_pb_callback() { return m_in_pb_cb.bind(); }
+ auto out_pb_callback() { return m_out_pb_cb.bind(); }
DECLARE_READ8_MEMBER( read );
DECLARE_WRITE8_MEMBER( write );
@@ -108,17 +108,4 @@ private:
DECLARE_DEVICE_TYPE(MOS6530, mos6530_device)
-
-#define MCFG_MOS6530_IN_PA_CB(_devcb) \
- downcast<mos6530_device &>(*device).set_in_pa_callback(DEVCB_##_devcb);
-
-#define MCFG_MOS6530_OUT_PA_CB(_devcb) \
- downcast<mos6530_device &>(*device).set_out_pa_callback(DEVCB_##_devcb);
-
-#define MCFG_MOS6530_IN_PB_CB(_devcb) \
- downcast<mos6530_device &>(*device).set_in_pb_callback(DEVCB_##_devcb);
-
-#define MCFG_MOS6530_OUT_PB_CB(_devcb) \
- downcast<mos6530_device &>(*device).set_out_pb_callback(DEVCB_##_devcb);
-
#endif // MAME_MACHINE_MOS6530_H
diff --git a/src/devices/machine/mos6530n.h b/src/devices/machine/mos6530n.h
index a5dfd3ee6fe..0042a73e429 100644
--- a/src/devices/machine/mos6530n.h
+++ b/src/devices/machine/mos6530n.h
@@ -57,125 +57,6 @@
#pragma once
-
-
-//**************************************************************************
-// INTERFACE CONFIGURATION MACROS
-//**************************************************************************
-
-#define MCFG_MOS6530n_IRQ_CB(_write) \
- downcast<mos6530_device_base &>(*device).set_irq_wr_callback(DEVCB_##_write);
-
-#define MCFG_MOS6530n_IN_PA_CB(_read) \
- downcast<mos6530_device_base &>(*device).set_pa_rd_callback(DEVCB_##_read);
-
-#define MCFG_MOS6530n_OUT_PA_CB(_write) \
- downcast<mos6530_device_base &>(*device).set_pa_wr_callback(DEVCB_##_write);
-
-#define MCFG_MOS6530n_IN_PB_CB(_read) \
- downcast<mos6530_device_base &>(*device).set_pb_rd_callback(DEVCB_##_read);
-
-#define MCFG_MOS6530n_OUT_PB_CB(_write) \
- downcast<mos6530_device_base &>(*device).set_pb_wr_callback(DEVCB_##_write);
-
-#define MCFG_MOS6530n_IN_PA0_CB(_read) \
- downcast<mos6530_device_base &>(*device).set_pa_rd_callback<0>(DEVCB_##_read);
-
-#define MCFG_MOS6530n_IN_PA1_CB(_read) \
- downcast<mos6530_device_base &>(*device).set_pa_rd_callback<1>(DEVCB_##_read);
-
-#define MCFG_MOS6530n_IN_PA2_CB(_read) \
- downcast<mos6530_device_base &>(*device).set_pa_rd_callback<2>(DEVCB_##_read);
-
-#define MCFG_MOS6530n_IN_PA3_CB(_read) \
- downcast<mos6530_device_base &>(*device).set_pa_rd_callback<3>(DEVCB_##_read);
-
-#define MCFG_MOS6530n_IN_PA4_CB(_read) \
- downcast<mos6530_device_base &>(*device).set_pa_rd_callback<4>(DEVCB_##_read);
-
-#define MCFG_MOS6530n_IN_PA5_CB(_read) \
- downcast<mos6530_device_base &>(*device).set_pa_rd_callback<5>(DEVCB_##_read);
-
-#define MCFG_MOS6530n_IN_PA6_CB(_read) \
- downcast<mos6530_device_base &>(*device).set_pa_rd_callback<6>(DEVCB_##_read);
-
-#define MCFG_MOS6530n_IN_PA7_CB(_read) \
- downcast<mos6530_device_base &>(*device).set_pa_rd_callback<7>(DEVCB_##_read);
-
-#define MCFG_MOS6530n_OUT_PA0_CB(_write) \
- downcast<mos6530_device_base &>(*device).set_pa_wr_callback<0>(DEVCB_##_write);
-
-#define MCFG_MOS6530n_OUT_PA1_CB(_write) \
- downcast<mos6530_device_base &>(*device).set_pa_wr_callback<1>(DEVCB_##_write);
-
-#define MCFG_MOS6530n_OUT_PA2_CB(_write) \
- downcast<mos6530_device_base &>(*device).set_pa_wr_callback<2>(DEVCB_##_write);
-
-#define MCFG_MOS6530n_OUT_PA3_CB(_write) \
- downcast<mos6530_device_base &>(*device).set_pa_wr_callback<3>(DEVCB_##_write);
-
-#define MCFG_MOS6530n_OUT_PA4_CB(_write) \
- downcast<mos6530_device_base &>(*device).set_pa_wr_callback<4>(DEVCB_##_write);
-
-#define MCFG_MOS6530n_OUT_PA5_CB(_write) \
- downcast<mos6530_device_base &>(*device).set_pa_wr_callback<5>(DEVCB_##_write);
-
-#define MCFG_MOS6530n_OUT_PA6_CB(_write) \
- downcast<mos6530_device_base &>(*device).set_pa_wr_callback<6>(DEVCB_##_write);
-
-#define MCFG_MOS6530n_OUT_PA7_CB(_write) \
- downcast<mos6530_device_base &>(*device).set_pa_wr_callback<7>(DEVCB_##_write);
-
-#define MCFG_MOS6530n_IN_PB0_CB(_read) \
- downcast<mos6530_device_base &>(*device).set_pb_rd_callback<0>(DEVCB_##_read);
-
-#define MCFG_MOS6530n_IN_PB1_CB(_read) \
- downcast<mos6530_device_base &>(*device).set_pb_rd_callback<1>(DEVCB_##_read);
-
-#define MCFG_MOS6530n_IN_PB2_CB(_read) \
- downcast<mos6530_device_base &>(*device).set_pb_rd_callback<2>(DEVCB_##_read);
-
-#define MCFG_MOS6530n_IN_PB3_CB(_read) \
- downcast<mos6530_device_base &>(*device).set_pb_rd_callback<3>(DEVCB_##_read);
-
-#define MCFG_MOS6530n_IN_PB4_CB(_read) \
- downcast<mos6530_device_base &>(*device).set_pb_rd_callback<4>(DEVCB_##_read);
-
-#define MCFG_MOS6530n_IN_PB5_CB(_read) \
- downcast<mos6530_device_base &>(*device).set_pb_rd_callback<5>(DEVCB_##_read);
-
-#define MCFG_MOS6530n_IN_PB6_CB(_read) \
- downcast<mos6530_device_base &>(*device).set_pb_rd_callback<6>(DEVCB_##_read);
-
-#define MCFG_MOS6530n_IN_PB7_CB(_read) \
- downcast<mos6530_device_base &>(*device).set_pb_rd_callback<7>(DEVCB_##_read);
-
-#define MCFG_MOS6530n_OUT_PB0_CB(_write) \
- downcast<mos6530_device_base &>(*device).set_pb_wr_callback<0>(DEVCB_##_write);
-
-#define MCFG_MOS6530n_OUT_PB1_CB(_write) \
- downcast<mos6530_device_base &>(*device).set_pb_wr_callback<1>(DEVCB_##_write);
-
-#define MCFG_MOS6530n_OUT_PB2_CB(_write) \
- downcast<mos6530_device_base &>(*device).set_pb_wr_callback<2>(DEVCB_##_write);
-
-#define MCFG_MOS6530n_OUT_PB3_CB(_write) \
- downcast<mos6530_device_base &>(*device).set_pb_wr_callback<3>(DEVCB_##_write);
-
-#define MCFG_MOS6530n_OUT_PB4_CB(_write) \
- downcast<mos6530_device_base &>(*device).set_pb_wr_callback<4>(DEVCB_##_write);
-
-#define MCFG_MOS6530n_OUT_PB5_CB(_write) \
- downcast<mos6530_device_base &>(*device).set_pb_wr_callback<5>(DEVCB_##_write);
-
-#define MCFG_MOS6530n_OUT_PB6_CB(_write) \
- downcast<mos6530_device_base &>(*device).set_pb_wr_callback<6>(DEVCB_##_write);
-
-#define MCFG_MOS6530n_OUT_PB7_CB(_write) \
- downcast<mos6530_device_base &>(*device).set_pb_wr_callback<7>(DEVCB_##_write);
-
-
-
//**************************************************************************
// TYPE DEFINITIONS
//**************************************************************************
@@ -185,15 +66,6 @@
class mos6530_device_base : public device_t
{
public:
- template <class Object> devcb_base &set_irq_wr_callback(Object &&cb) { return m_irq_cb.set_callback(std::forward<Object>(cb)); }
- template <class Object> devcb_base &set_pa_rd_callback(Object &&cb) { return m_in8_pa_cb.set_callback(std::forward<Object>(cb)); }
- template <class Object> devcb_base &set_pa_wr_callback(Object &&cb) { return m_out8_pa_cb.set_callback(std::forward<Object>(cb)); }
- template <class Object> devcb_base &set_pb_rd_callback(Object &&cb) { return m_in8_pb_cb.set_callback(std::forward<Object>(cb)); }
- template <class Object> devcb_base &set_pb_wr_callback(Object &&cb) { return m_out8_pb_cb.set_callback(std::forward<Object>(cb)); }
- template <unsigned N, class Object> devcb_base &set_pa_rd_callback(Object &&cb) { return m_in_pa_cb[N].set_callback(std::forward<Object>(cb)); }
- template <unsigned N, class Object> devcb_base &set_pa_wr_callback(Object &&cb) { return m_out_pa_cb[N].set_callback(std::forward<Object>(cb)); }
- template <unsigned N, class Object> devcb_base &set_pb_rd_callback(Object &&cb) { return m_in_pb_cb[N].set_callback(std::forward<Object>(cb)); }
- template <unsigned N, class Object> devcb_base &set_pb_wr_callback(Object &&cb) { return m_out_pb_cb[N].set_callback(std::forward<Object>(cb)); }
auto irq_wr_callback() { return m_irq_cb.bind(); }
auto pa_rd_callback() { return m_in8_pa_cb.bind(); }
auto pa_wr_callback() { return m_out8_pa_cb.bind(); }
diff --git a/src/devices/machine/mos6551.cpp b/src/devices/machine/mos6551.cpp
index 37bb874aaf4..f9edbd39cee 100644
--- a/src/devices/machine/mos6551.cpp
+++ b/src/devices/machine/mos6551.cpp
@@ -63,10 +63,11 @@ const int mos6551_device::transmitter_controls[4][3] =
{0, 1, 1}
};
-MACHINE_CONFIG_START(mos6551_device::device_add_mconfig)
- MCFG_DEVICE_ADD("clock", CLOCK, 0)
- MCFG_CLOCK_SIGNAL_HANDLER(WRITELINE(*this, mos6551_device, internal_clock))
-MACHINE_CONFIG_END
+void mos6551_device::device_add_mconfig(machine_config &config)
+{
+ CLOCK(config, m_internal_clock, 0);
+ m_internal_clock->signal_handler().set(FUNC(mos6551_device::internal_clock));
+}
void mos6551_device::device_start()
@@ -270,7 +271,8 @@ void mos6551_device::update_divider()
uint8_t mos6551_device::read_rdr()
{
- m_status &= ~(SR_PARITY_ERROR | SR_FRAMING_ERROR | SR_OVERRUN | SR_RDRF);
+ if (!machine().side_effects_disabled())
+ m_status &= ~(SR_PARITY_ERROR | SR_FRAMING_ERROR | SR_OVERRUN | SR_RDRF);
return m_rdr;
}
@@ -278,15 +280,18 @@ uint8_t mos6551_device::read_status()
{
uint8_t status = m_status;
- if (m_cts)
+ if (!machine().side_effects_disabled())
{
- status &= ~SR_TDRE;
- }
+ if (m_cts)
+ {
+ status &= ~SR_TDRE;
+ }
- if (m_irq_state != 0)
- {
- m_irq_state = 0;
- update_irq();
+ if (m_irq_state != 0)
+ {
+ m_irq_state = 0;
+ update_irq();
+ }
}
return status;
@@ -374,11 +379,8 @@ void mos6551_device::write_command(uint8_t data)
update_divider();
}
-READ8_MEMBER( mos6551_device::read )
+uint8_t mos6551_device::read(offs_t offset)
{
- if (machine().side_effects_disabled())
- return 0xff;
-
switch (offset & 0x03)
{
case 0:
@@ -396,7 +398,7 @@ READ8_MEMBER( mos6551_device::read )
}
}
-WRITE8_MEMBER( mos6551_device::write )
+void mos6551_device::write(offs_t offset, uint8_t data)
{
switch (offset & 0x03)
{
diff --git a/src/devices/machine/mos6551.h b/src/devices/machine/mos6551.h
index 626c17fd0b2..b7afabfa603 100644
--- a/src/devices/machine/mos6551.h
+++ b/src/devices/machine/mos6551.h
@@ -33,7 +33,7 @@
class mos6551_device : public device_t
{
public:
- mos6551_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+ mos6551_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock = 0);
auto irq_handler() { return m_irq_handler.bind(); }
auto txd_handler() { return m_txd_handler.bind(); }
@@ -41,8 +41,8 @@ public:
auto rts_handler() { return m_rts_handler.bind(); }
auto dtr_handler() { return m_dtr_handler.bind(); }
- DECLARE_READ8_MEMBER(read);
- DECLARE_WRITE8_MEMBER(write);
+ uint8_t read(offs_t offset);
+ void write(offs_t offset, uint8_t data);
DECLARE_WRITE_LINE_MEMBER(write_xtal1); // txc
DECLARE_WRITE_LINE_MEMBER(write_rxd);
diff --git a/src/devices/machine/mos6702.cpp b/src/devices/machine/mos6702.cpp
index a5fa3d4c088..1b552054cb4 100644
--- a/src/devices/machine/mos6702.cpp
+++ b/src/devices/machine/mos6702.cpp
@@ -49,7 +49,7 @@ void mos6702_device::device_start()
// read -
//-------------------------------------------------
-READ8_MEMBER( mos6702_device::read )
+uint8_t mos6702_device::read(offs_t offset)
{
return 0;
}
@@ -59,6 +59,6 @@ READ8_MEMBER( mos6702_device::read )
// write -
//-------------------------------------------------
-WRITE8_MEMBER( mos6702_device::write )
+void mos6702_device::write(offs_t offset, uint8_t data)
{
}
diff --git a/src/devices/machine/mos6702.h b/src/devices/machine/mos6702.h
index 4e7ef027b6e..ab1ea945e6e 100644
--- a/src/devices/machine/mos6702.h
+++ b/src/devices/machine/mos6702.h
@@ -25,16 +25,6 @@
#pragma once
-
-//**************************************************************************
-// INTERFACE CONFIGURATION MACROS
-//**************************************************************************
-
-#define MCFG_MOS6702_ADD(tag, clock) \
- MCFG_DEVICE_ADD(tag, MOS6702, clock)
-
-
-
//**************************************************************************
// TYPE DEFINITIONS
//**************************************************************************
@@ -47,8 +37,8 @@ public:
// construction/destruction
mos6702_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- DECLARE_READ8_MEMBER( read );
- DECLARE_WRITE8_MEMBER( write );
+ uint8_t read(offs_t offset);
+ void write(offs_t offset, uint8_t data);
protected:
// device-level overrides
diff --git a/src/devices/machine/mos8706.h b/src/devices/machine/mos8706.h
index 36cb6d55d5d..a3a6247bf5a 100644
--- a/src/devices/machine/mos8706.h
+++ b/src/devices/machine/mos8706.h
@@ -29,17 +29,6 @@
#pragma once
-
-
-//**************************************************************************
-// INTERFACE CONFIGURATION MACROS
-//**************************************************************************
-
-#define MCFG_MOS8706_ADD(tag, clock) \
- MCFG_DEVICE_ADD((tag), MOS8706, (clock))
-
-
-
//**************************************************************************
// TYPE DEFINITIONS
//**************************************************************************
diff --git a/src/devices/machine/mos8722.cpp b/src/devices/machine/mos8722.cpp
index b55d8393a9f..0364460b63e 100644
--- a/src/devices/machine/mos8722.cpp
+++ b/src/devices/machine/mos8722.cpp
@@ -171,7 +171,7 @@ uint8_t mos8722_device::read(offs_t offset, uint8_t data)
// write - register write
//-------------------------------------------------
-WRITE8_MEMBER( mos8722_device::write )
+void mos8722_device::write(offs_t offset, uint8_t data)
{
if (MCR_C64) return;
diff --git a/src/devices/machine/mos8722.h b/src/devices/machine/mos8722.h
index e5d32d4e4ea..2b80aa846c2 100644
--- a/src/devices/machine/mos8722.h
+++ b/src/devices/machine/mos8722.h
@@ -57,7 +57,7 @@ public:
auto sense40() { return m_read_sense40.bind(); }
uint8_t read(offs_t offset, uint8_t data);
- DECLARE_WRITE8_MEMBER( write );
+ void write(offs_t offset, uint8_t data);
DECLARE_READ_LINE_MEMBER( fsdir_r );
diff --git a/src/devices/machine/mos8726.cpp b/src/devices/machine/mos8726.cpp
index 0c2286788a7..e1f167d70d3 100644
--- a/src/devices/machine/mos8726.cpp
+++ b/src/devices/machine/mos8726.cpp
@@ -90,7 +90,7 @@ void mos8726_device::execute_run()
// read -
//-------------------------------------------------
-READ8_MEMBER( mos8726_device::read )
+uint8_t mos8726_device::read(offs_t offset)
{
uint8_t data = 0;
@@ -102,7 +102,7 @@ READ8_MEMBER( mos8726_device::read )
// write -
//-------------------------------------------------
-WRITE8_MEMBER( mos8726_device::write )
+void mos8726_device::write(offs_t offset, uint8_t data)
{
}
diff --git a/src/devices/machine/mos8726.h b/src/devices/machine/mos8726.h
index 8435bf0f544..90b78ec8412 100644
--- a/src/devices/machine/mos8726.h
+++ b/src/devices/machine/mos8726.h
@@ -47,17 +47,6 @@
#pragma once
-
-
-//**************************************************************************
-// INTERFACE CONFIGURATION MACROS
-//**************************************************************************
-
-#define MCFG_MOS8726_ADD(tag) \
- MCFG_DEVICE_ADD((tag), MOS8726, 1000000) // dummy clock
-
-
-
//**************************************************************************
// TYPE DEFINITIONS
//**************************************************************************
@@ -71,8 +60,8 @@ public:
// construction/destruction
mos8726_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- DECLARE_READ8_MEMBER( read );
- DECLARE_WRITE8_MEMBER( write );
+ uint8_t read(offs_t offset);
+ void write(offs_t offset, uint8_t data);
DECLARE_WRITE_LINE_MEMBER( bs_w );
diff --git a/src/devices/machine/mpu401.cpp b/src/devices/machine/mpu401.cpp
index 578ad206721..48cc04b455d 100644
--- a/src/devices/machine/mpu401.cpp
+++ b/src/devices/machine/mpu401.cpp
@@ -81,7 +81,8 @@ DEFINE_DEVICE_TYPE(MPU401, mpu401_device, "mpu401", "Roland MPU-401 I/O box")
// device_add_mconfig - add device configuration
//-------------------------------------------------
-MACHINE_CONFIG_START(mpu401_device::device_add_mconfig)
+void mpu401_device::device_add_mconfig(machine_config &config)
+{
M6801(config, m_ourcpu, 4000000); /* 4 MHz as per schematics */
m_ourcpu->set_addrmap(AS_PROGRAM, &mpu401_device::mpu401_map);
m_ourcpu->in_p1_cb().set(FUNC(mpu401_device::port1_r));
@@ -90,11 +91,10 @@ MACHINE_CONFIG_START(mpu401_device::device_add_mconfig)
m_ourcpu->out_p2_cb().set(FUNC(mpu401_device::port2_w));
m_ourcpu->out_ser_tx_cb().set(MIDIOUT_TAG, FUNC(midi_port_device::write_txd));
- MCFG_MIDI_PORT_ADD(MIDIIN_TAG, midiin_slot, "midiin")
- MCFG_MIDI_RX_HANDLER(WRITELINE(DEVICE_SELF, mpu401_device, midi_rx_w))
+ MIDI_PORT(config, MIDIIN_TAG, midiin_slot, "midiin").rxd_handler().set(DEVICE_SELF, FUNC(mpu401_device::midi_rx_w));
- MCFG_MIDI_PORT_ADD(MIDIOUT_TAG, midiout_slot, "midiout")
-MACHINE_CONFIG_END
+ MIDI_PORT(config, MIDIOUT_TAG, midiout_slot, "midiout");
+}
//-------------------------------------------------
// rom_region - device-specific ROM region
diff --git a/src/devices/machine/msm58321.h b/src/devices/machine/msm58321.h
index 1842b4f2036..d5b7a5d78c3 100644
--- a/src/devices/machine/msm58321.h
+++ b/src/devices/machine/msm58321.h
@@ -39,32 +39,6 @@
#include "dirtc.h"
-
-//**************************************************************************
-// INTERFACE CONFIGURATION MACROS
-//**************************************************************************
-
-#define MCFG_MSM58321_D0_HANDLER(_devcb) \
- downcast<msm58321_device &>(*device).set_d0_handler(DEVCB_##_devcb);
-
-#define MCFG_MSM58321_D1_HANDLER(_devcb) \
- downcast<msm58321_device &>(*device).set_d1_handler(DEVCB_##_devcb);
-
-#define MCFG_MSM58321_D2_HANDLER(_devcb) \
- downcast<msm58321_device &>(*device).set_d2_handler(DEVCB_##_devcb);
-
-#define MCFG_MSM58321_D3_HANDLER(_devcb) \
- downcast<msm58321_device &>(*device).set_d3_handler(DEVCB_##_devcb);
-
-#define MCFG_MSM58321_BUSY_HANDLER(_devcb) \
- downcast<msm58321_device &>(*device).set_busy_handler(DEVCB_##_devcb);
-
-#define MCFG_MSM58321_YEAR0(_year0) \
- downcast<msm58321_device &>(*device).set_year0(_year0);
-
-#define MCFG_MSM58321_DEFAULT_24H(_default_24h) \
- downcast<msm58321_device &>(*device).set_default_24h(_default_24h);
-
// ======================> msm58321_device
class msm58321_device : public device_t,
@@ -76,11 +50,6 @@ public:
msm58321_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
// configuration helpers
- template <class Object> devcb_base &set_d0_handler(Object &&cb) { return m_d0_handler.set_callback(std::forward<Object>(cb)); }
- template <class Object> devcb_base &set_d1_handler(Object &&cb) { return m_d1_handler.set_callback(std::forward<Object>(cb)); }
- template <class Object> devcb_base &set_d2_handler(Object &&cb) { return m_d2_handler.set_callback(std::forward<Object>(cb)); }
- template <class Object> devcb_base &set_d3_handler(Object &&cb) { return m_d3_handler.set_callback(std::forward<Object>(cb)); }
- template <class Object> devcb_base &set_busy_handler(Object &&cb) { return m_busy_handler.set_callback(std::forward<Object>(cb)); }
auto d0_handler() { return m_d0_handler.bind(); }
auto d1_handler() { return m_d1_handler.bind(); }
auto d2_handler() { return m_d2_handler.bind(); }
diff --git a/src/devices/machine/msm6242.h b/src/devices/machine/msm6242.h
index bd6bd89403e..430bbbc10f0 100644
--- a/src/devices/machine/msm6242.h
+++ b/src/devices/machine/msm6242.h
@@ -40,10 +40,6 @@
#include "dirtc.h"
-#define MCFG_MSM6242_OUT_INT_HANDLER(_devcb) \
- downcast<msm6242_device &>(*device).set_out_int_handler(DEVCB_##_devcb);
-
-
// ======================> msm6242_device
class msm6242_device : public device_t, public device_rtc_interface
@@ -52,7 +48,6 @@ public:
// construction/destruction
msm6242_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- template <class Object> devcb_base &set_out_int_handler(Object &&cb) { return m_out_int_handler.set_callback(std::forward<Object>(cb)); }
auto out_int_handler() { return m_out_int_handler.bind(); }
// I/O operations
diff --git a/src/devices/machine/myb3k_kbd.h b/src/devices/machine/myb3k_kbd.h
index 747289a53f1..34c2c5cc414 100644
--- a/src/devices/machine/myb3k_kbd.h
+++ b/src/devices/machine/myb3k_kbd.h
@@ -14,9 +14,6 @@
is responsible for storing the byte into the serial/parallell converter
(that can be read through IN from port 0x04) and then trigger an interrupt.
- MCFG_DEVICE_ADD("myb3k_keyboard", MYB3K_KEYBOARD, 0)
- MCFG_MYB3K_KEYBOARD_CB(PUT(myb3k_state, kbd_set_data_and_interrupt))
-
**********************************************************************/
#ifndef MAME_MACHINE_MYB3K_KBD_H
@@ -24,11 +21,6 @@
#pragma once
-#define MYB3K_KBD_CB_PUT(cls, fnc) myb3k_keyboard_device::output_delegate((&cls::fnc), (#cls "::" #fnc), DEVICE_SELF, ((cls *)nullptr))
-#define MYB3K_KBD_CB_DEVPUT(tag, cls, fnc) myb3k_keyboard_device::output_delegate((&cls::fnc), (#cls "::" #fnc), (tag), ((cls *)nullptr))
-
-#define MCFG_MYB3K_KEYBOARD_CB(cb) downcast<myb3k_keyboard_device &>(*device).set_keyboard_callback((MYB3K_KBD_CB_##cb));
-
DECLARE_DEVICE_TYPE(MYB3K_KEYBOARD, myb3k_keyboard_device)
DECLARE_DEVICE_TYPE(JB3000_KEYBOARD, jb3000_keyboard_device)
DECLARE_DEVICE_TYPE(STEPONE_KEYBOARD, stepone_keyboard_device)
@@ -51,7 +43,18 @@ public:
TIMER_ID_SECOND_BYTE
};
- template <class Object> void set_keyboard_callback(Object &&cb) { m_keyboard_cb = std::forward<Object>(cb); }
+ template <class FunctionClass>
+ void set_keyboard_callback(void (FunctionClass::*callback)(u8 character), const char *name)
+ {
+ set_keyboard_callback(output_delegate(callback, name, nullptr, static_cast<FunctionClass *>(nullptr)));
+ }
+ // FIXME: this should be aware of current device for resolving the tag
+ template <class FunctionClass>
+ void set_keyboard_callback(const char *devname, void (FunctionClass::*callback)(u8 character), const char *name)
+ {
+ set_keyboard_callback(output_delegate(callback, name, devname, static_cast<FunctionClass *>(nullptr)));
+ }
+ void set_keyboard_callback(output_delegate callback) { m_keyboard_cb = callback; }
protected:
myb3k_keyboard_device(
diff --git a/src/devices/machine/ncr5380.h b/src/devices/machine/ncr5380.h
index b2f7e4f2509..9d9d7b96617 100644
--- a/src/devices/machine/ncr5380.h
+++ b/src/devices/machine/ncr5380.h
@@ -36,8 +36,6 @@ enum
// device stuff
-#define MCFG_NCR5380_IRQ_CB(_devcb) \
- downcast<ncr5380_device &>(*device).set_irq_callback(DEVCB_##_devcb);
class ncr5380_device : public legacy_scsi_host_adapter
{
@@ -45,7 +43,6 @@ public:
// construction/destruction
ncr5380_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- template <class Object> devcb_base &set_irq_callback(Object &&cb) { return m_irq_cb.set_callback(std::forward<Object>(cb)); }
auto irq_callback() { return m_irq_cb.bind(); }
// our API
diff --git a/src/devices/machine/ncr5380n.cpp b/src/devices/machine/ncr5380n.cpp
index 4d09a910e46..e5132603609 100644
--- a/src/devices/machine/ncr5380n.cpp
+++ b/src/devices/machine/ncr5380n.cpp
@@ -288,12 +288,12 @@ void ncr5380n_device::delay_cycles(int cycles)
tm->adjust(clocks_to_attotime(cycles));
}
-READ8_MEMBER(ncr5380n_device::scsidata_r)
+uint8_t ncr5380n_device::scsidata_r()
{
return scsi_bus->data_r();
}
-WRITE8_MEMBER(ncr5380n_device::outdata_w)
+void ncr5380n_device::outdata_w(uint8_t data)
{
m_outdata = data;
@@ -304,12 +304,12 @@ WRITE8_MEMBER(ncr5380n_device::outdata_w)
}
}
-READ8_MEMBER(ncr5380n_device::icmd_r)
+uint8_t ncr5380n_device::icmd_r()
{
return m_icommand;
}
-WRITE8_MEMBER(ncr5380n_device::icmd_w)
+void ncr5380n_device::icmd_w(uint8_t data)
{
// asserting to drive the data bus?
if ((data & IC_DBUS) && !(m_icommand & IC_DBUS))
@@ -340,12 +340,12 @@ WRITE8_MEMBER(ncr5380n_device::icmd_w)
delay(2);
}
-READ8_MEMBER(ncr5380n_device::mode_r)
+uint8_t ncr5380n_device::mode_r()
{
return m_mode;
}
-WRITE8_MEMBER(ncr5380n_device::mode_w)
+void ncr5380n_device::mode_w(uint8_t data)
{
// logerror("%s: mode_w %02x (%s)\n", tag(), data, machine().describe_context());
// arbitration bit being set?
@@ -373,13 +373,13 @@ WRITE8_MEMBER(ncr5380n_device::mode_w)
m_mode = data;
}
-READ8_MEMBER(ncr5380n_device::command_r)
+uint8_t ncr5380n_device::command_r()
{
// logerror("%s: command_r %02x (%s)\n", tag(), m_tcommand, machine().describe_context());
return m_tcommand;
}
-WRITE8_MEMBER(ncr5380n_device::command_w)
+void ncr5380n_device::command_w(uint8_t data)
{
// logerror("%s: command_w %02x (%s)\n", tag(), data, machine().describe_context());
m_tcommand = data;
@@ -413,7 +413,7 @@ void ncr5380n_device::check_irq()
#endif
}
-READ8_MEMBER(ncr5380n_device::status_r)
+uint8_t ncr5380n_device::status_r()
{
uint32_t ctrl = scsi_bus->ctrl_r();
uint8_t res = status |
@@ -429,11 +429,11 @@ READ8_MEMBER(ncr5380n_device::status_r)
return res;
}
-WRITE8_MEMBER(ncr5380n_device::selenable_w)
+void ncr5380n_device::selenable_w(uint8_t data)
{
}
-READ8_MEMBER(ncr5380n_device::busandstatus_r)
+uint8_t ncr5380n_device::busandstatus_r()
{
uint32_t ctrl = scsi_bus->ctrl_r();
uint8_t res = m_busstatus |
@@ -445,28 +445,28 @@ READ8_MEMBER(ncr5380n_device::busandstatus_r)
return res;
}
-WRITE8_MEMBER(ncr5380n_device::startdmasend_w)
+void ncr5380n_device::startdmasend_w(uint8_t data)
{
logerror("%02x to start dma send\n", data);
drq_set();
}
-READ8_MEMBER(ncr5380n_device::indata_r)
+uint8_t ncr5380n_device::indata_r()
{
return dma_r();
}
-WRITE8_MEMBER(ncr5380n_device::startdmatargetrx_w)
+void ncr5380n_device::startdmatargetrx_w(uint8_t data)
{
logerror("%02x to start dma target Rx\n", data);
}
-READ8_MEMBER(ncr5380n_device::resetparityirq_r)
+uint8_t ncr5380n_device::resetparityirq_r()
{
return 0;
}
-WRITE8_MEMBER(ncr5380n_device::startdmainitrx_w)
+void ncr5380n_device::startdmainitrx_w(uint8_t data)
{
// logerror("%02x to start dma initiator Rx\n", data);
recv_byte();
@@ -518,73 +518,73 @@ void ncr5380n_device::drq_clear()
}
}
-READ8_MEMBER(ncr5380n_device::read)
+uint8_t ncr5380n_device::read(offs_t offset)
{
switch (offset & 7)
{
- case 0:
- return scsidata_r(space, offset);
+ case 0:
+ return scsidata_r();
- case 1:
- return icmd_r(space, offset);
+ case 1:
+ return icmd_r();
- case 2:
- return mode_r(space, offset);
+ case 2:
+ return mode_r();
- case 3:
- return command_r(space, offset);
+ case 3:
+ return command_r();
- case 4:
- return status_r(space, offset);
+ case 4:
+ return status_r();
- case 5:
- return busandstatus_r(space, offset);
+ case 5:
+ return busandstatus_r();
- case 6:
- return indata_r(space, offset);
+ case 6:
+ return indata_r();
- case 7:
- return resetparityirq_r(space, offset);
+ case 7:
+ return resetparityirq_r();
}
return 0xff;
}
-WRITE8_MEMBER(ncr5380n_device::write)
+void ncr5380n_device::write(offs_t offset, uint8_t data)
{
// logerror("%x to 5380 @ %x\n", data, offset);
switch (offset & 7)
{
- case 0:
- outdata_w(space, offset, data);
- break;
+ case 0:
+ outdata_w(data);
+ break;
- case 1:
- icmd_w(space, offset, data);
- break;
+ case 1:
+ icmd_w(data);
+ break;
- case 2:
- mode_w(space, offset, data);
- break;
+ case 2:
+ mode_w(data);
+ break;
- case 3:
- command_w(space, offset, data);
- break;
+ case 3:
+ command_w(data);
+ break;
- case 4:
- selenable_w(space, offset, data);
- break;
+ case 4:
+ selenable_w(data);
+ break;
- case 5:
- startdmasend_w(space, offset, data);
- break;
+ case 5:
+ startdmasend_w(data);
+ break;
- case 6:
- startdmatargetrx_w(space, offset, data);
- break;
+ case 6:
+ startdmatargetrx_w(data);
+ break;
- case 7:
- startdmainitrx_w(space, offset, data);
- break;
+ case 7:
+ startdmainitrx_w(data);
+ break;
}
}
diff --git a/src/devices/machine/ncr5380n.h b/src/devices/machine/ncr5380n.h
index 973616c65a3..365df032419 100644
--- a/src/devices/machine/ncr5380n.h
+++ b/src/devices/machine/ncr5380n.h
@@ -15,11 +15,6 @@
#include "machine/nscsi_bus.h"
-#define MCFG_NCR5380N_IRQ_HANDLER(_devcb) \
- downcast<ncr5380n_device &>(*device).set_irq_handler(DEVCB_##_devcb);
-
-#define MCFG_NCR5380N_DRQ_HANDLER(_devcb) \
- downcast<ncr5380n_device &>(*device).set_drq_handler(DEVCB_##_devcb);
class ncr5380n_device : public nscsi_device
{
@@ -27,11 +22,11 @@ public:
ncr5380n_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
// configuration helpers
- template <class Object> devcb_base &set_irq_handler(Object &&cb) { return m_irq_handler.set_callback(std::forward<Object>(cb)); }
- template <class Object> devcb_base &set_drq_handler(Object &&cb) { return m_drq_handler.set_callback(std::forward<Object>(cb)); }
+ auto irq_handler() { return m_irq_handler.bind(); }
+ auto drq_handler() { return m_drq_handler.bind(); }
- DECLARE_READ8_MEMBER(read);
- DECLARE_WRITE8_MEMBER(write);
+ uint8_t read(offs_t offset);
+ void write(offs_t offset, uint8_t data);
uint8_t dma_r();
void dma_w(uint8_t val);
@@ -203,22 +198,22 @@ private:
void map(address_map &map);
- DECLARE_READ8_MEMBER(scsidata_r);
- DECLARE_WRITE8_MEMBER(outdata_w);
- DECLARE_READ8_MEMBER(icmd_r);
- DECLARE_WRITE8_MEMBER(icmd_w);
- DECLARE_READ8_MEMBER(mode_r);
- DECLARE_WRITE8_MEMBER(mode_w);
- DECLARE_READ8_MEMBER(command_r);
- DECLARE_WRITE8_MEMBER(command_w);
- DECLARE_READ8_MEMBER(status_r);
- DECLARE_WRITE8_MEMBER(selenable_w);
- DECLARE_READ8_MEMBER(busandstatus_r);
- DECLARE_WRITE8_MEMBER(startdmasend_w);
- DECLARE_READ8_MEMBER(indata_r);
- DECLARE_WRITE8_MEMBER(startdmatargetrx_w);
- DECLARE_READ8_MEMBER(resetparityirq_r);
- DECLARE_WRITE8_MEMBER(startdmainitrx_w);
+ uint8_t scsidata_r();
+ void outdata_w(uint8_t data);
+ uint8_t icmd_r();
+ void icmd_w(uint8_t data);
+ uint8_t mode_r();
+ void mode_w(uint8_t data);
+ uint8_t command_r();
+ void command_w(uint8_t data);
+ uint8_t status_r();
+ void selenable_w(uint8_t data);
+ uint8_t busandstatus_r();
+ void startdmasend_w(uint8_t data);
+ uint8_t indata_r();
+ void startdmatargetrx_w(uint8_t data);
+ uint8_t resetparityirq_r();
+ void startdmainitrx_w(uint8_t data);
devcb_write_line m_irq_handler;
devcb_write_line m_drq_handler;
diff --git a/src/devices/machine/ncr5385.cpp b/src/devices/machine/ncr5385.cpp
index d5cd98a4a5f..6c1f4a3bb4e 100644
--- a/src/devices/machine/ncr5385.cpp
+++ b/src/devices/machine/ncr5385.cpp
@@ -34,7 +34,7 @@ void ncr5385_device::device_reset()
m_diag_status_reg = DIAG_COMPLETE;
}
-WRITE8_MEMBER(ncr5385_device::write)
+void ncr5385_device::write(offs_t offset, uint8_t data)
{
switch (offset)
{
@@ -96,7 +96,7 @@ WRITE8_MEMBER(ncr5385_device::write)
}
}
-READ8_MEMBER(ncr5385_device::read)
+uint8_t ncr5385_device::read(offs_t offset)
{
switch (offset)
{
diff --git a/src/devices/machine/ncr5385.h b/src/devices/machine/ncr5385.h
index 3a60ca0a6c8..a1dec052045 100644
--- a/src/devices/machine/ncr5385.h
+++ b/src/devices/machine/ncr5385.h
@@ -44,14 +44,6 @@
#pragma once
-
-//**************************************************************************
-// INTERFACE CONFIGURATION MACROS
-//**************************************************************************
-
-#define MCFG_NCR5385_INT_CB(_int) \
- downcast<ncr5385_device &>(*device).set_int_callback(DEVCB_##_int);
-
//**************************************************************************
// TYPE DEFINITIONS
//**************************************************************************
@@ -64,11 +56,10 @@ public:
// construction/destruction
ncr5385_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- template <class Object> devcb_base &set_int_callback(Object &&cb) { return m_int.set_callback(std::forward<Object>(cb)); }
auto irq() { return m_int.bind(); }
- DECLARE_WRITE8_MEMBER(write);
- DECLARE_READ8_MEMBER(read);
+ void write(offs_t offset, uint8_t data);
+ uint8_t read(offs_t offset);
protected:
// device-level overrides
diff --git a/src/devices/machine/ncr5390.cpp b/src/devices/machine/ncr5390.cpp
index 62c62a038b6..10b7510d707 100644
--- a/src/devices/machine/ncr5390.cpp
+++ b/src/devices/machine/ncr5390.cpp
@@ -1,6 +1,12 @@
// license:BSD-3-Clause
// copyright-holders:Olivier Galibert
+/*
+ * TODO
+ * - 16 bit dma order, alignment and last byte handling
+ * - clean up variable naming and protection
+ */
+
#include "emu.h"
#include "ncr5390.h"
@@ -14,9 +20,10 @@
#define DELAY_HACK
-DEFINE_DEVICE_TYPE(NCR5390, ncr5390_device, "ncr5390", "NCR 5390 SCSI")
-DEFINE_DEVICE_TYPE(NCR53C90A, ncr53c90a_device, "ncr53c90a", "NCR 53C90A SCSI")
-DEFINE_DEVICE_TYPE(NCR53C94, ncr53c94_device, "ncr53c94", "NCR 53C94 SCSI")
+DEFINE_DEVICE_TYPE(NCR5390, ncr5390_device, "ncr5390", "NCR 5390 SCSI Controller")
+DEFINE_DEVICE_TYPE(NCR53C90A, ncr53c90a_device, "ncr53c90a", "NCR 53C90A Advanced SCSI Controller")
+DEFINE_DEVICE_TYPE(NCR53C94, ncr53c94_device, "ncr53c94", "NCR 53C94 Advanced SCSI Controller")
+DEFINE_DEVICE_TYPE(NCR53CF94, ncr53cf94_device, "ncr53cf94", "NCR 53CF94-2 Fast SCSI Controller") // TODO: differences not emulated
void ncr5390_device::map(address_map &map)
{
@@ -33,38 +40,38 @@ void ncr5390_device::map(address_map &map)
map(0x9, 0x9).w(FUNC(ncr5390_device::clock_w));
}
-READ8_MEMBER(ncr5390_device::read)
+uint8_t ncr5390_device::read(offs_t offset)
{
switch (offset)
{
- case 0: return tcounter_lo_r(space, 0);
- case 1: return tcounter_hi_r(space, 0);
- case 2: return fifo_r(space, 0);
- case 3: return command_r(space, 0);
- case 4: return status_r(space, 0);
- case 5: return istatus_r(space, 0);
- case 6: return seq_step_r(space, 0);
- case 7: return fifo_flags_r(space, 0);
- case 8: return conf_r(space, 0);
- default: return 0;
+ case 0: return tcounter_lo_r();
+ case 1: return tcounter_hi_r();
+ case 2: return fifo_r();
+ case 3: return command_r();
+ case 4: return status_r();
+ case 5: return istatus_r();
+ case 6: return seq_step_r();
+ case 7: return fifo_flags_r();
+ case 8: return conf_r();
+ default: return 0xff;
}
}
-WRITE8_MEMBER(ncr5390_device::write)
+void ncr5390_device::write(offs_t offset, uint8_t data)
{
switch (offset)
{
- case 0: tcount_lo_w(space, 0, data); break;
- case 1: tcount_hi_w(space, 0, data); break;
- case 2: fifo_w(space, 0, data); break;
- case 3: command_w(space, 0, data); break;
- case 4: bus_id_w(space, 0, data); break;
- case 5: timeout_w(space, 0, data); break;
- case 6: sync_period_w(space, 0, data); break;
- case 7: sync_offset_w(space, 0, data); break;
- case 8: conf_w(space, 0, data); break;
- case 9: clock_w(space, 0, data); break;
- case 10: test_w(space, 0, data); break;
+ case 0: tcount_lo_w(data); break;
+ case 1: tcount_hi_w(data); break;
+ case 2: fifo_w(data); break;
+ case 3: command_w(data); break;
+ case 4: bus_id_w(data); break;
+ case 5: timeout_w(data); break;
+ case 6: sync_period_w(data); break;
+ case 7: sync_offset_w(data); break;
+ case 8: conf_w(data); break;
+ case 9: clock_w(data); break;
+ case 10: test_w(data); break;
default: break;
}
}
@@ -76,18 +83,18 @@ void ncr53c90a_device::map(address_map &map)
map(0xb, 0xb).rw(FUNC(ncr53c90a_device::conf2_r), FUNC(ncr53c90a_device::conf2_w));
}
-READ8_MEMBER(ncr53c90a_device::read)
+uint8_t ncr53c90a_device::read(offs_t offset)
{
if (offset == 11)
- return conf2_r(space, 0);
- return ncr5390_device::read(space, offset);
+ return conf2_r();
+ return ncr5390_device::read(offset);
}
-WRITE8_MEMBER(ncr53c90a_device::write)
+void ncr53c90a_device::write(offs_t offset, uint8_t data)
{
if (offset == 11)
- return conf2_w(space, 0, data);
- ncr5390_device::write(space, offset, data);
+ return conf2_w(data);
+ ncr5390_device::write(offset, data);
}
void ncr53c94_device::map(address_map &map)
@@ -98,21 +105,21 @@ void ncr53c94_device::map(address_map &map)
map(0xf, 0xf).w(FUNC(ncr53c94_device::fifo_align_w));
}
-READ8_MEMBER(ncr53c94_device::read)
+uint8_t ncr53c94_device::read(offs_t offset)
{
if (offset == 12)
- return conf3_r(space, 0);
- return ncr53c90a_device::read(space, offset);
+ return conf3_r();
+ return ncr53c90a_device::read(offset);
}
-WRITE8_MEMBER(ncr53c94_device::write)
+void ncr53c94_device::write(offs_t offset, uint8_t data)
{
if (offset == 11)
- conf3_w(space, 0, data);
+ conf3_w(data);
else if (offset == 15)
- fifo_align_w(space, 0, data);
+ fifo_align_w(data);
else
- ncr53c90a_device::write(space, offset, data);
+ ncr53c90a_device::write(offset, data);
}
ncr5390_device::ncr5390_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock)
@@ -141,8 +148,19 @@ ncr53c90a_device::ncr53c90a_device(const machine_config &mconfig, const char *ta
}
ncr53c94_device::ncr53c94_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
- : ncr53c90a_device(mconfig, NCR53C94, tag, owner, clock)
+ : ncr53c94_device(mconfig, NCR53C94, tag, owner, clock)
+{
+}
+
+ncr53c94_device::ncr53c94_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock)
+ : ncr53c90a_device(mconfig, type, tag, owner, clock)
, config3(0)
+ , m_busmd(BUSMD_0)
+{
+}
+
+ncr53cf94_device::ncr53cf94_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+ : ncr53c94_device(mconfig, NCR53CF94, tag, owner, clock)
{
}
@@ -177,10 +195,7 @@ void ncr5390_device::device_start()
m_irq_handler.resolve_safe();
m_drq_handler.resolve_safe();
- tcount = 0;
- tcounter = 0;
config = 0;
- status = 0;
bus_id = 0;
select_timeout = 0;
tm = timer_alloc(0);
@@ -196,26 +211,28 @@ void ncr5390_device::device_reset()
sync_offset = 0;
seq = 0;
config &= 7;
- status &= 0x90;
+ status = 0;
istatus = 0;
irq = false;
m_irq_handler(irq);
- reset_soft();
-}
-void ncr5390_device::reset_soft()
-{
state = IDLE;
scsi_bus->ctrl_wait(scsi_refid, S_SEL|S_BSY|S_RST, S_ALL);
- status &= 0xef;
drq = false;
test_mode = false;
m_drq_handler(drq);
+
+ scsi_bus->ctrl_w(scsi_refid, 0, S_RST);
+ tcount = 0;
+ tcounter = 0;
+
reset_disconnect();
}
void ncr5390_device::reset_disconnect()
{
+ scsi_bus->ctrl_w(scsi_refid, 0, ~S_RST);
+
command_pos = 0;
command_length = 0;
memset(command, 0, sizeof(command));
@@ -258,6 +275,17 @@ void ncr5390_device::step(bool timeout)
case IDLE:
break;
+ case BUSRESET_WAIT_INT:
+ state = IDLE;
+ scsi_bus->ctrl_w(scsi_refid, 0, S_RST);
+ reset_disconnect();
+
+ if (!(config & 0x40)) {
+ istatus |= I_SCSI_RESET;
+ check_irq();
+ }
+ break;
+
case ARB_COMPLETE << SUB_SHIFT: {
if(!timeout)
break;
@@ -267,7 +295,7 @@ void ncr5390_device::step(bool timeout)
if(win != scsi_id) {
scsi_bus->data_w(scsi_refid, 0);
scsi_bus->ctrl_w(scsi_refid, 0, S_ALL);
- fatalerror("need to wait for bus free\n");
+ fatalerror("ncr5390_device::step need to wait for bus free\n");
}
state = (state & STATE_MASK) | (ARB_ASSERT_SEL << SUB_SHIFT);
scsi_bus->ctrl_w(scsi_refid, S_SEL, S_SEL);
@@ -407,15 +435,13 @@ void ncr5390_device::step(bool timeout)
case DISC_SEL_ARBITRATION_INIT:
// wait until a command is in the fifo
- if (!fifo_pos && dma_command && !(status & S_TC0)) {
+ if (!fifo_pos) {
// dma starts after bus arbitration/selection is complete
- dma_set(DMA_OUT);
- step(false);
+ check_drq();
break;
}
- // "with atn" variants have a message byte before the command descriptor
- command_length = (c == CD_SELECT) ? derive_msg_size(fifo[0]) : 1;
+ command_length = fifo_pos + tcounter;
state = DISC_SEL_ARBITRATION;
step(false);
break;
@@ -449,7 +475,6 @@ void ncr5390_device::step(bool timeout)
seq = 1;
function_bus_complete();
} else {
- command_length = derive_msg_size(fifo[0]);
state = DISC_SEL_WAIT_REQ;
}
break;
@@ -460,6 +485,8 @@ void ncr5390_device::step(bool timeout)
if((ctrl & S_PHASE_MASK) != S_PHASE_COMMAND) {
if(!command_length)
seq = 4;
+ else
+ seq = 2;
scsi_bus->ctrl_wait(scsi_refid, 0, S_REQ);
function_bus_complete();
break;
@@ -680,7 +707,7 @@ void ncr5390_device::function_bus_complete()
state = IDLE;
istatus |= I_FUNCTION|I_BUS;
dma_set(DMA_NONE);
- drq_clear();
+ check_drq();
check_irq();
}
@@ -690,7 +717,7 @@ void ncr5390_device::function_complete()
state = IDLE;
istatus |= I_FUNCTION;
dma_set(DMA_NONE);
- drq_clear();
+ check_drq();
check_irq();
}
@@ -700,7 +727,7 @@ void ncr5390_device::bus_complete()
state = IDLE;
istatus |= I_BUS;
dma_set(DMA_NONE);
- drq_clear();
+ check_drq();
check_irq();
}
@@ -717,25 +744,25 @@ void ncr5390_device::delay_cycles(int cycles)
tm->adjust(clocks_to_attotime(cycles));
}
-READ8_MEMBER(ncr5390_device::tcounter_lo_r)
+uint8_t ncr5390_device::tcounter_lo_r()
{
LOG("tcounter_lo_r %02x (%s)\n", tcounter & 0xff, machine().describe_context());
return tcounter;
}
-WRITE8_MEMBER(ncr5390_device::tcount_lo_w)
+void ncr5390_device::tcount_lo_w(uint8_t data)
{
tcount = (tcount & 0xff00) | data;
LOG("tcount_lo_w %02x (%s)\n", data, machine().describe_context());
}
-READ8_MEMBER(ncr5390_device::tcounter_hi_r)
+uint8_t ncr5390_device::tcounter_hi_r()
{
LOG("tcounter_hi_r %02x (%s)\n", tcounter >> 8, machine().describe_context());
return tcounter >> 8;
}
-WRITE8_MEMBER(ncr5390_device::tcount_hi_w)
+void ncr5390_device::tcount_hi_w(uint8_t data)
{
tcount = (tcount & 0x00ff) | (data << 8);
LOG("tcount_hi_w %02x (%s)\n", data, machine().describe_context());
@@ -746,19 +773,17 @@ uint8_t ncr5390_device::fifo_pop()
uint8_t r = fifo[0];
fifo_pos--;
memmove(fifo, fifo+1, fifo_pos);
- if((!fifo_pos) && dma_dir == DMA_OUT && !(status & S_TC0))
- drq_set();
+ check_drq();
return r;
}
void ncr5390_device::fifo_push(uint8_t val)
{
fifo[fifo_pos++] = val;
- if(!drq && dma_dir == DMA_IN && !(status & S_TC0))
- drq_set();
+ check_drq();
}
-READ8_MEMBER(ncr5390_device::fifo_r)
+uint8_t ncr5390_device::fifo_r()
{
uint8_t r;
if(fifo_pos) {
@@ -771,20 +796,20 @@ READ8_MEMBER(ncr5390_device::fifo_r)
return r;
}
-WRITE8_MEMBER(ncr5390_device::fifo_w)
+void ncr5390_device::fifo_w(uint8_t data)
{
LOGMASKED(LOG_FIFO, "fifo_w 0x%02x fifo_pos %d (%s)\n", data, fifo_pos, machine().describe_context());
if(fifo_pos != 16)
fifo[fifo_pos++] = data;
}
-READ8_MEMBER(ncr5390_device::command_r)
+uint8_t ncr5390_device::command_r()
{
LOG("command_r (%s)\n", machine().describe_context());
return command[0];
}
-WRITE8_MEMBER(ncr5390_device::command_w)
+void ncr5390_device::command_w(uint8_t data)
{
LOG("command_w %02x command_pos %d (%s)\n", data, command_pos, machine().describe_context());
if(command_pos == 2) {
@@ -834,6 +859,8 @@ void ncr5390_device::start_command()
// clear transfer count zero flag when counter is reloaded
status &= ~S_TC0;
}
+ else
+ tcounter = 0;
switch(c) {
case CM_NOP:
@@ -854,13 +881,9 @@ void ncr5390_device::start_command()
case CM_RESET_BUS:
LOGMASKED(LOG_COMMAND, "Reset SCSI bus\n");
- reset_soft();
- // FIXME: this interrupt should be generated when the reset is reflected
- // back into the device, and not when the device starts the scsi reset
- if (!(config & 0x40)) {
- istatus = I_SCSI_RESET;
- check_irq();
- }
+ state = BUSRESET_WAIT_INT;
+ scsi_bus->ctrl_w(scsi_refid, S_RST, S_RST);
+ delay(130);
break;
case CD_RESELECT:
@@ -878,6 +901,7 @@ void ncr5390_device::start_command()
"Select with ATN and stop sequence\n");
seq = 0;
state = DISC_SEL_ARBITRATION_INIT;
+ dma_set(dma_command ? DMA_OUT : DMA_NONE);
arbitrate();
break;
@@ -896,6 +920,7 @@ void ncr5390_device::start_command()
state = INIT_XFR;
xfr_phase = scsi_bus->ctrl_r() & S_PHASE_MASK;
dma_set(dma_command ? ((xfr_phase & S_INP) ? DMA_IN : DMA_OUT) : DMA_NONE);
+ check_drq();
step(false);
break;
@@ -936,8 +961,14 @@ void ncr5390_device::start_command()
command_pop_and_chain();
break;
+ case CI_RESET_ATN:
+ LOGMASKED(LOG_COMMAND, "Reset ATN\n");
+ scsi_bus->ctrl_w(scsi_refid, 0, S_ATN);
+ command_pop_and_chain();
+ break;
+
default:
- fatalerror("start unimplemented command %02x\n", c);
+ fatalerror("ncr5390_device::start_command unimplemented command %02x\n", c);
}
}
@@ -953,12 +984,6 @@ bool ncr5390_device::check_valid_command(uint8_t cmd)
return false;
}
-int ncr5390_device::derive_msg_size(uint8_t msg_id)
-{
- const static int sizes[8] = { 6, 10, 6, 6, 6, 12, 6, 10 };
- return sizes[msg_id >> 5];
-}
-
void ncr5390_device::arbitrate()
{
state = (state & STATE_MASK) | (ARB_COMPLETE << SUB_SHIFT);
@@ -976,7 +1001,7 @@ void ncr5390_device::check_irq()
}
-READ8_MEMBER(ncr5390_device::status_r)
+uint8_t ncr5390_device::status_r()
{
uint32_t ctrl = scsi_bus->ctrl_r();
uint8_t res = status | (ctrl & S_MSG ? 4 : 0) | (ctrl & S_CTL ? 2 : 0) | (ctrl & S_INP ? 1 : 0);
@@ -985,13 +1010,13 @@ READ8_MEMBER(ncr5390_device::status_r)
return res;
}
-WRITE8_MEMBER(ncr5390_device::bus_id_w)
+void ncr5390_device::bus_id_w(uint8_t data)
{
bus_id = data & 7;
LOG("bus_id=%d\n", bus_id);
}
-READ8_MEMBER(ncr5390_device::istatus_r)
+uint8_t ncr5390_device::istatus_r()
{
uint8_t res = istatus;
@@ -1009,39 +1034,39 @@ READ8_MEMBER(ncr5390_device::istatus_r)
return res;
}
-WRITE8_MEMBER(ncr5390_device::timeout_w)
+void ncr5390_device::timeout_w(uint8_t data)
{
LOG("timeout_w 0x%02x\n", data);
select_timeout = data;
}
-READ8_MEMBER(ncr5390_device::seq_step_r)
+uint8_t ncr5390_device::seq_step_r()
{
LOG("seq_step_r %d (%s)\n", seq, machine().describe_context());
return seq;
}
-WRITE8_MEMBER(ncr5390_device::sync_period_w)
+void ncr5390_device::sync_period_w(uint8_t data)
{
sync_period = data & 0x1f;
}
-READ8_MEMBER(ncr5390_device::fifo_flags_r)
+uint8_t ncr5390_device::fifo_flags_r()
{
return fifo_pos;
}
-WRITE8_MEMBER(ncr5390_device::sync_offset_w)
+void ncr5390_device::sync_offset_w(uint8_t data)
{
sync_offset = data & 0x0f;
}
-READ8_MEMBER(ncr5390_device::conf_r)
+uint8_t ncr5390_device::conf_r()
{
return config;
}
-WRITE8_MEMBER(ncr5390_device::conf_w)
+void ncr5390_device::conf_w(uint8_t data)
{
config = data;
scsi_id = data & 7;
@@ -1051,13 +1076,13 @@ WRITE8_MEMBER(ncr5390_device::conf_w)
test_mode = true;
}
-WRITE8_MEMBER(ncr5390_device::test_w)
+void ncr5390_device::test_w(uint8_t data)
{
if (test_mode)
logerror("test_w %d (%s) - test mode not implemented\n", data, machine().describe_context());
}
-WRITE8_MEMBER(ncr5390_device::clock_w)
+void ncr5390_device::clock_w(uint8_t data)
{
clock_conv = data & 0x07;
}
@@ -1065,16 +1090,17 @@ WRITE8_MEMBER(ncr5390_device::clock_w)
void ncr5390_device::dma_set(int dir)
{
dma_dir = dir;
- if(dma_dir == DMA_OUT && fifo_pos != 16 && ((tcounter > fifo_pos) || !tcounter))
- drq_set();
+
+ // account for data already in the fifo
+ if (dir == DMA_OUT && fifo_pos)
+ decrement_tcounter(fifo_pos);
}
void ncr5390_device::dma_w(uint8_t val)
{
fifo_push(val);
decrement_tcounter();
- if(fifo_pos == 16 || (status & S_TC0))
- drq_clear();
+ check_drq();
step(false);
}
@@ -1082,34 +1108,41 @@ uint8_t ncr5390_device::dma_r()
{
uint8_t r = fifo_pop();
decrement_tcounter();
- if(!fifo_pos || (status & S_TC0))
- drq_clear();
+ check_drq();
step(false);
return r;
}
-void ncr5390_device::drq_set()
+void ncr5390_device::check_drq()
{
- if(!drq) {
- drq = true;
- m_drq_handler(drq);
+ bool drq_state = drq;
+
+ switch (dma_dir) {
+ case DMA_NONE:
+ drq_state = false;
+ break;
+
+ case DMA_IN: // device to memory
+ drq_state = !(status & S_TC0) && fifo_pos;
+ break;
+
+ case DMA_OUT: // memory to device
+ drq_state = !(status & S_TC0) && fifo_pos < 16;
+ break;
}
-}
-void ncr5390_device::drq_clear()
-{
- if(drq) {
- drq = false;
+ if (drq_state != drq) {
+ drq = drq_state;
m_drq_handler(drq);
}
}
-void ncr5390_device::decrement_tcounter()
+void ncr5390_device::decrement_tcounter(int count)
{
if (!dma_command)
return;
- tcounter--;
+ tcounter -= count;
if (tcounter == 0)
status |= S_TC0;
}
@@ -1142,14 +1175,14 @@ void ncr53c90a_device::device_start()
ncr5390_device::device_start();
}
-void ncr53c90a_device::reset_soft()
+void ncr53c90a_device::device_reset()
{
config2 = 0;
- ncr5390_device::reset_soft();
+ ncr5390_device::device_reset();
}
-READ8_MEMBER(ncr53c90a_device::status_r)
+uint8_t ncr53c90a_device::status_r()
{
uint32_t ctrl = scsi_bus->ctrl_r();
uint8_t res = (irq ? S_INTERRUPT : 0) | status | (ctrl & S_MSG ? 4 : 0) | (ctrl & S_CTL ? 2 : 0) | (ctrl & S_INP ? 1 : 0);
@@ -1180,9 +1213,75 @@ void ncr53c94_device::device_start()
ncr53c90a_device::device_start();
}
-void ncr53c94_device::reset_soft()
+void ncr53c94_device::device_reset()
{
config3 = 0;
- ncr53c90a_device::reset_soft();
+ ncr53c90a_device::device_reset();
+}
+
+u16 ncr53c94_device::dma16_r()
+{
+ // check fifo underflow
+ if (fifo_pos < 2)
+ fatalerror("ncr53c94_device::dma16_r fifo_pos %d\n", fifo_pos);
+
+ // pop two bytes from fifo
+ u16 const data = (fifo[0] << 8) | fifo[1];
+ fifo_pos -= 2;
+ memmove(fifo, fifo + 2, fifo_pos);
+
+ // update drq
+ decrement_tcounter(2);
+ check_drq();
+
+ step(false);
+
+ return data;
+}
+
+void ncr53c94_device::dma16_w(u16 data)
+{
+ // check fifo overflow
+ if (fifo_pos > 14)
+ fatalerror("ncr53c94_device::dma16_w fifo_pos %d\n", fifo_pos);
+
+ // push two bytes into fifo
+ fifo[fifo_pos++] = data >> 8;
+ fifo[fifo_pos++] = data;
+
+ // update drq
+ decrement_tcounter(2);
+ check_drq();
+
+ step(false);
+}
+
+void ncr53c94_device::check_drq()
+{
+ if (m_busmd != BUSMD_0)
+ {
+ bool drq_state = drq;
+
+ switch (dma_dir) {
+ case DMA_NONE:
+ drq_state = false;
+ break;
+
+ case DMA_IN: // device to memory
+ drq_state = !(status & S_TC0) && fifo_pos > 1;
+ break;
+
+ case DMA_OUT: // memory to device
+ drq_state = !(status & S_TC0) && fifo_pos < 15;
+ break;
+ }
+
+ if (drq_state != drq) {
+ drq = drq_state;
+ m_drq_handler(drq);
+ }
+ }
+ else
+ ncr5390_device::check_drq();
}
diff --git a/src/devices/machine/ncr5390.h b/src/devices/machine/ncr5390.h
index bf301bed266..7cc2469bde5 100644
--- a/src/devices/machine/ncr5390.h
+++ b/src/devices/machine/ncr5390.h
@@ -7,59 +7,46 @@
#include "machine/nscsi_bus.h"
-#define MCFG_NCR5390_IRQ_HANDLER(_devcb) \
- downcast<ncr5390_device &>(*device).set_irq_handler(DEVCB_##_devcb);
-
-#define MCFG_NCR5390_DRQ_HANDLER(_devcb) \
- downcast<ncr5390_device &>(*device).set_drq_handler(DEVCB_##_devcb);
-
class ncr5390_device : public nscsi_device
{
public:
ncr5390_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
// configuration helpers
- template <class Object> devcb_base &set_irq_handler(Object &&cb) { return m_irq_handler.set_callback(std::forward<Object>(cb)); }
- template <class Object> devcb_base &set_drq_handler(Object &&cb) { return m_drq_handler.set_callback(std::forward<Object>(cb)); }
-
auto irq_handler_cb() { return m_irq_handler.bind(); }
auto drq_handler_cb() { return m_drq_handler.bind(); }
virtual void map(address_map &map);
- DECLARE_READ8_MEMBER(tcounter_lo_r);
- DECLARE_WRITE8_MEMBER(tcount_lo_w);
- DECLARE_READ8_MEMBER(tcounter_hi_r);
- DECLARE_WRITE8_MEMBER(tcount_hi_w);
- DECLARE_READ8_MEMBER(fifo_r);
- DECLARE_WRITE8_MEMBER(fifo_w);
- DECLARE_READ8_MEMBER(command_r);
- DECLARE_WRITE8_MEMBER(command_w);
- virtual DECLARE_READ8_MEMBER(status_r);
- DECLARE_WRITE8_MEMBER(bus_id_w);
- DECLARE_READ8_MEMBER(istatus_r);
- DECLARE_WRITE8_MEMBER(timeout_w);
- DECLARE_READ8_MEMBER(seq_step_r);
- DECLARE_WRITE8_MEMBER(sync_period_w);
- DECLARE_READ8_MEMBER(fifo_flags_r);
- DECLARE_WRITE8_MEMBER(sync_offset_w);
- DECLARE_READ8_MEMBER(conf_r);
- DECLARE_WRITE8_MEMBER(conf_w);
- DECLARE_WRITE8_MEMBER(test_w);
- DECLARE_WRITE8_MEMBER(clock_w);
-
- virtual DECLARE_READ8_MEMBER(read);
- virtual DECLARE_WRITE8_MEMBER(write);
+ uint8_t tcounter_lo_r();
+ void tcount_lo_w(uint8_t data);
+ uint8_t tcounter_hi_r();
+ void tcount_hi_w(uint8_t data);
+ uint8_t fifo_r();
+ void fifo_w(uint8_t data);
+ uint8_t command_r();
+ void command_w(uint8_t data);
+ virtual uint8_t status_r();
+ void bus_id_w(uint8_t data);
+ uint8_t istatus_r();
+ void timeout_w(uint8_t data);
+ uint8_t seq_step_r();
+ void sync_period_w(uint8_t data);
+ uint8_t fifo_flags_r();
+ void sync_offset_w(uint8_t data);
+ uint8_t conf_r();
+ void conf_w(uint8_t data);
+ void test_w(uint8_t data);
+ void clock_w(uint8_t data);
+
+ virtual uint8_t read(offs_t offset);
+ virtual void write(offs_t offset, uint8_t data);
virtual void scsi_ctrl_changed() override;
uint8_t dma_r();
void dma_w(uint8_t val);
- // memory mapped wrappers for dma read/write
- DECLARE_READ8_MEMBER(mdma_r) { return dma_r(); }
- DECLARE_WRITE8_MEMBER(mdma_w) { dma_w(data); }
-
protected:
ncr5390_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock);
@@ -220,13 +207,11 @@ protected:
bool test_mode;
void dma_set(int dir);
- void drq_set();
- void drq_clear();
+ virtual void check_drq();
void start_command();
void step(bool timeout);
virtual bool check_valid_command(uint8_t cmd);
- int derive_msg_size(uint8_t msg_id);
void function_complete();
void function_bus_complete();
void bus_complete();
@@ -235,10 +220,6 @@ protected:
void command_pop_and_chain();
void check_irq();
-protected:
- virtual void reset_soft();
-
-private:
void reset_disconnect();
uint8_t fifo_pop();
@@ -249,7 +230,7 @@ private:
void delay(int cycles);
void delay_cycles(int cycles);
- void decrement_tcounter();
+ void decrement_tcounter(int count = 1);
devcb_write_line m_irq_handler;
devcb_write_line m_drq_handler;
@@ -262,19 +243,19 @@ public:
virtual void map(address_map &map) override;
- virtual DECLARE_READ8_MEMBER(status_r) override;
+ virtual uint8_t status_r() override;
- DECLARE_READ8_MEMBER(conf2_r) { return config2; };
- DECLARE_WRITE8_MEMBER(conf2_w) { config2 = data; };
+ uint8_t conf2_r() { return config2; };
+ void conf2_w(uint8_t data) { config2 = data; };
- virtual DECLARE_READ8_MEMBER(read) override;
- virtual DECLARE_WRITE8_MEMBER(write) override;
+ virtual uint8_t read(offs_t offset) override;
+ virtual void write(offs_t offset, uint8_t data) override;
protected:
ncr53c90a_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock);
virtual void device_start() override;
- virtual void reset_soft() override;
+ virtual void device_reset() override;
virtual bool check_valid_command(uint8_t cmd) override;
@@ -283,6 +264,18 @@ protected:
S_INTERRUPT = 0x80,
};
+ enum conf2_mask : u8
+ {
+ PGDP = 0x01, // pass through/generate data parity
+ PGRP = 0x02, // pass through/generate register parity
+ ACDPE = 0x04, // abort on command/data parity error
+ S2FE = 0x08, // scsi-2 features enable
+ TSDR = 0x10, // tri-state dma request
+ SBO = 0x20, // select byte order
+ LSP = 0x40, // latch scsi phase
+ DAE = 0x80, // data alignment enable
+ };
+
private:
u8 config2;
};
@@ -292,26 +285,56 @@ class ncr53c94_device : public ncr53c90a_device
public:
ncr53c94_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+ enum busmd_t : u8
+ {
+ BUSMD_0 = 0, // single bus: 8-bit host, 8 bit dma
+ BUSMD_1 = 1, // single bus: 8 bit host, 16 bit dma
+ BUSMD_2 = 2, // two buses: 8 bit multiplexed host, 16 bit dma
+ BUSMD_3 = 3, // two buses: 8 bit host, 16 bit dma
+ };
+ void set_busmd(busmd_t const busmd) { m_busmd = busmd; }
+
virtual void map(address_map &map) override;
- DECLARE_READ8_MEMBER(conf3_r) { return config3; };
- DECLARE_WRITE8_MEMBER(conf3_w) { config3 = data; };
- DECLARE_WRITE8_MEMBER(fifo_align_w) { fifo_align = data; };
+ uint8_t conf3_r() { return config3; };
+ void conf3_w(uint8_t data) { config3 = data; };
+ void fifo_align_w(uint8_t data) { fifo_align = data; };
+
+ virtual uint8_t read(offs_t offset) override;
+ virtual void write(offs_t offset, uint8_t data) override;
- virtual DECLARE_READ8_MEMBER(read) override;
- virtual DECLARE_WRITE8_MEMBER(write) override;
+ u16 dma16_r();
+ void dma16_w(u16 data);
protected:
+ ncr53c94_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock);
+
+ enum conf3_mask : u8
+ {
+ BS8 = 0x01, // burst size 8
+ MDM = 0x02, // modify dma mode
+ LBTM = 0x04, // last byte transfer mode
+ };
+
virtual void device_start() override;
- virtual void reset_soft() override;
+ virtual void device_reset() override;
+ virtual void check_drq() override;
private:
u8 config3;
u8 fifo_align;
+ busmd_t m_busmd;
+};
+
+class ncr53cf94_device : public ncr53c94_device
+{
+public:
+ ncr53cf94_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
};
DECLARE_DEVICE_TYPE(NCR5390, ncr5390_device)
DECLARE_DEVICE_TYPE(NCR53C90A, ncr53c90a_device)
DECLARE_DEVICE_TYPE(NCR53C94, ncr53c94_device)
+DECLARE_DEVICE_TYPE(NCR53CF94, ncr53cf94_device)
#endif // MAME_MACHINE_NCR5390_H
diff --git a/src/devices/machine/ncr539x.cpp b/src/devices/machine/ncr539x.cpp
index 58c69a16ad1..09e0bee9f21 100644
--- a/src/devices/machine/ncr539x.cpp
+++ b/src/devices/machine/ncr539x.cpp
@@ -280,7 +280,7 @@ void ncr539x_device::device_timer(emu_timer &timer, device_timer_id tid, int par
}
}
-READ8_MEMBER( ncr539x_device::read )
+uint8_t ncr539x_device::read(offs_t offset)
{
uint8_t rv = 0;
@@ -412,7 +412,7 @@ READ8_MEMBER( ncr539x_device::read )
return rv;
}
-WRITE8_MEMBER( ncr539x_device::write )
+void ncr539x_device::write(offs_t offset, uint8_t data)
{
//if (offset != 2)
LOG("539x: Write %02x @ %s (%02x) (%s)\n", data, wrregs[offset], offset, machine().describe_context());
diff --git a/src/devices/machine/ncr539x.h b/src/devices/machine/ncr539x.h
index 8caa26c25a1..8172f4ea5f2 100644
--- a/src/devices/machine/ncr539x.h
+++ b/src/devices/machine/ncr539x.h
@@ -14,11 +14,6 @@
// device stuff
-#define MCFG_NCR539X_OUT_IRQ_CB(_devcb) \
- downcast<ncr539x_device &>(*device).set_out_irq_callback(DEVCB_##_devcb);
-
-#define MCFG_NCR539X_OUT_DRQ_CB(_devcb) \
- downcast<ncr539x_device &>(*device).set_out_drq_callback(DEVCB_##_devcb);
class ncr539x_device : public legacy_scsi_host_adapter
{
@@ -26,14 +21,12 @@ public:
// construction/destruction
ncr539x_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- template <class Object> devcb_base &set_out_irq_callback(Object &&cb) { return m_out_irq_cb.set_callback(std::forward<Object>(cb)); }
- template <class Object> devcb_base &set_out_drq_callback(Object &&cb) { return m_out_drq_cb.set_callback(std::forward<Object>(cb)); }
auto irq_callback() { return m_out_irq_cb.bind(); }
auto drq_callback() { return m_out_drq_cb.bind(); }
// our API
- DECLARE_READ8_MEMBER(read);
- DECLARE_WRITE8_MEMBER(write);
+ uint8_t read(offs_t offset);
+ void write(offs_t offset, uint8_t data);
void dma_read_data(int bytes, uint8_t *pData);
void dma_write_data(int bytes, uint8_t *pData);
diff --git a/src/devices/machine/netlist.cpp b/src/devices/machine/netlist.cpp
index 648d435ace8..3e7580be5b9 100644
--- a/src/devices/machine/netlist.cpp
+++ b/src/devices/machine/netlist.cpp
@@ -49,21 +49,16 @@ DEFINE_DEVICE_TYPE(NETLIST_STREAM_OUTPUT, netlist_mame_stream_output_device, "nl
// Special netlist extension devices ....
// ----------------------------------------------------------------------------------------
-class netlist_mame_device::netlist_mame_t : public netlist::netlist_t
+class netlist_mame_device::netlist_mame_callbacks_t : public netlist::callbacks_t
{
public:
- netlist_mame_t(netlist_mame_device &parent, const pstring &aname)
- : netlist::netlist_t(aname)
+ netlist_mame_callbacks_t(netlist_mame_device &parent)
+ : netlist::callbacks_t()
, m_parent(parent)
{
}
- running_machine &machine() { return m_parent.machine(); }
-
-
- netlist_mame_device &parent() { return m_parent; }
-
protected:
void vlog(const plib::plog_level &l, const pstring &ls) const override
{
@@ -95,6 +90,24 @@ private:
};
+class netlist_mame_device::netlist_mame_t : public netlist::netlist_t
+{
+public:
+
+ netlist_mame_t(netlist_mame_device &parent, const pstring &aname)
+ : netlist::netlist_t(aname, plib::make_unique<netlist_mame_device::netlist_mame_callbacks_t>(parent))
+ , m_parent(parent)
+ {
+ }
+
+ running_machine &machine() { return m_parent.machine(); }
+ netlist_mame_device &parent() { return m_parent; }
+
+private:
+ netlist_mame_device &m_parent;
+};
+
+
namespace {
// ----------------------------------------------------------------------------------------
@@ -104,13 +117,13 @@ namespace {
class NETLIB_NAME(analog_callback) : public netlist::device_t
{
public:
- NETLIB_NAME(analog_callback)(netlist::netlist_t &anetlist, const pstring &name)
+ NETLIB_NAME(analog_callback)(netlist::netlist_state_t &anetlist, const pstring &name)
: device_t(anetlist, name)
, m_in(*this, "IN")
, m_cpu_device(nullptr)
, m_last(*this, "m_last", 0)
{
- m_cpu_device = downcast<netlist_mame_cpu_device *>(&downcast<netlist_mame_device::netlist_mame_t &>(netlist()).parent());
+ m_cpu_device = downcast<netlist_mame_cpu_device *>(&static_cast<netlist_mame_device::netlist_mame_t &>(exec()).parent());
}
ATTR_COLD void reset() override
@@ -131,7 +144,7 @@ public:
// avoid calls due to noise
if (std::fabs(cur - m_last) > 1e-6)
{
- m_cpu_device->update_time_x();
+ m_cpu_device->update_icount(exec().time());
m_callback(cur, m_cpu_device->local_time());
m_cpu_device->check_mame_abort_slice();
m_last = cur;
@@ -152,13 +165,13 @@ private:
class NETLIB_NAME(logic_callback) : public netlist::device_t
{
public:
- NETLIB_NAME(logic_callback)(netlist::netlist_t &anetlist, const pstring &name)
+ NETLIB_NAME(logic_callback)(netlist::netlist_state_t &anetlist, const pstring &name)
: device_t(anetlist, name)
, m_in(*this, "IN")
, m_cpu_device(nullptr)
, m_last(*this, "m_last", 0)
{
- m_cpu_device = downcast<netlist_mame_cpu_device *>(&downcast<netlist_mame_device::netlist_mame_t &>(netlist()).parent());
+ m_cpu_device = downcast<netlist_mame_cpu_device *>(&static_cast<netlist_mame_device::netlist_mame_t &>(exec()).parent());
}
ATTR_COLD void reset() override
@@ -173,13 +186,13 @@ public:
NETLIB_UPDATEI()
{
- netlist_sig_t cur = m_in();
+ netlist::netlist_sig_t cur = m_in();
// FIXME: make this a parameter
// avoid calls due to noise
if (cur != m_last)
{
- m_cpu_device->update_time_x();
+ m_cpu_device->update_icount(exec().time());
m_callback(cur, m_cpu_device->local_time());
m_cpu_device->check_mame_abort_slice();
m_last = cur;
@@ -190,9 +203,10 @@ private:
netlist::logic_input_t m_in;
netlist_mame_logic_output_device::output_delegate m_callback;
netlist_mame_cpu_device *m_cpu_device;
- netlist::state_var<netlist_sig_t> m_last;
+ netlist::state_var<netlist::netlist_sig_t> m_last;
};
+
// ----------------------------------------------------------------------------------------
// Extensions to interface netlist with MAME code ....
// ----------------------------------------------------------------------------------------
@@ -200,22 +214,26 @@ private:
class netlist_source_memregion_t : public netlist::source_t
{
public:
- netlist_source_memregion_t(netlist::setup_t &setup, pstring name)
- : netlist::source_t(setup), m_name(name)
+ netlist_source_memregion_t(device_t &dev, pstring name)
+ : netlist::source_t(), m_dev(dev), m_name(name)
{
}
- virtual std::unique_ptr<plib::pistream> stream(const pstring &name) override;
+ virtual plib::unique_ptr<plib::pistream> stream(const pstring &name) override;
private:
+ device_t &m_dev;
pstring m_name;
};
class netlist_data_memregions_t : public netlist::source_t
{
public:
- netlist_data_memregions_t(netlist::setup_t &setup);
+ netlist_data_memregions_t(device_t &dev);
- virtual std::unique_ptr<plib::pistream> stream(const pstring &name) override;
+ virtual plib::unique_ptr<plib::pistream> stream(const pstring &name) override;
+
+private:
+ device_t &m_dev;
};
@@ -223,30 +241,31 @@ public:
// memregion source support
// ----------------------------------------------------------------------------------------
-std::unique_ptr<plib::pistream> netlist_source_memregion_t::stream(const pstring &name)
+plib::unique_ptr<plib::pistream> netlist_source_memregion_t::stream(const pstring &name)
{
- memory_region *mem = downcast<netlist_mame_device::netlist_mame_t &>(setup().netlist()).machine().root_device().memregion(m_name.c_str());
- return plib::make_unique_base<plib::pistream, plib::pimemstream>(mem->base(), mem->bytes());
+ //memory_region *mem = static_cast<netlist_mame_device::netlist_mame_t &>(setup().setup().exec()).machine().root_device().memregion(m_name.c_str());
+ memory_region *mem = m_dev.machine().root_device().memregion(m_name.c_str());
+ return plib::make_unique<plib::pimemstream>(mem->base(), mem->bytes());
}
-netlist_data_memregions_t::netlist_data_memregions_t(netlist::setup_t &setup)
- : netlist::source_t(setup, netlist::source_t::DATA)
+netlist_data_memregions_t::netlist_data_memregions_t(device_t &dev)
+ : netlist::source_t(netlist::source_t::DATA), m_dev(dev)
{
}
-std::unique_ptr<plib::pistream> netlist_data_memregions_t::stream(const pstring &name)
+plib::unique_ptr<plib::pistream> netlist_data_memregions_t::stream(const pstring &name)
{
- memory_region *mem = downcast<netlist_mame_device::netlist_mame_t &>(setup().netlist()).parent().memregion(name.c_str());
- //memory_region *mem = downcast<netlist_mame_t &>(setup().netlist()).machine().root_device().memregion(name.c_str());
+ //memory_region *mem = static_cast<netlist_mame_device::netlist_mame_t &>(setup().setup().exec()).parent().memregion(name.c_str());
+ memory_region *mem = m_dev.memregion(name.c_str());
if (mem != nullptr)
{
- return plib::make_unique_base<plib::pistream, plib::pimemstream>(mem->base(), mem->bytes());
+ return plib::make_unique<plib::pimemstream>(mem->base(), mem->bytes());
}
else
{
// This should be the last data provider being called - last resort
fatalerror("data named %s not found in device rom regions\n", name.c_str());
- return std::unique_ptr<plib::pistream>(nullptr);
+ return plib::unique_ptr<plib::pistream>(nullptr);
}
}
@@ -261,44 +280,55 @@ std::unique_ptr<plib::pistream> netlist_data_memregions_t::stream(const pstring
class NETLIB_NAME(sound_out) : public netlist::device_t
{
public:
- NETLIB_NAME(sound_out)(netlist::netlist_t &anetlist, const pstring &name)
+ NETLIB_NAME(sound_out)(netlist::netlist_state_t &anetlist, const pstring &name)
: netlist::device_t(anetlist, name)
, m_channel(*this, "CHAN", 0)
, m_mult(*this, "MULT", 1000.0)
, m_offset(*this, "OFFSET", 0.0)
, m_buffer(nullptr)
- , m_sample(netlist::netlist_time::from_hz(1)) //sufficiently big enough
+ , m_bufsize(0)
+ , m_sample_time(netlist::netlist_time::from_hz(1)) //sufficiently big enough
, m_in(*this, "IN")
, m_cur(0.0)
, m_last_pos(0)
- , m_last_buffer(*this, "m_last_buffer", netlist::netlist_time::zero())
+ , m_last_buffer_time(*this, "m_last_buffer", netlist::netlist_time::zero())
{
}
- static const int BUFSIZE = 2048;
+ //static const int BUFSIZE = 2048;
ATTR_COLD void reset() override
{
m_cur = 0.0;
m_last_pos = 0;
- m_last_buffer = netlist::netlist_time::zero();
+ m_last_buffer_time = netlist::netlist_time::zero();
}
ATTR_HOT void sound_update(const netlist::netlist_time &upto)
{
- int pos = (upto - m_last_buffer) / m_sample;
- if (pos >= BUFSIZE)
- netlist().log().fatal("sound {1}: exceeded BUFSIZE\n", name().c_str());
+ int pos = (upto - m_last_buffer_time) / m_sample_time;
+ if (pos > m_bufsize)
+ throw emu_fatalerror("sound %s: pos %d exceeded bufsize %d\n", name().c_str(), pos, m_bufsize);
while (m_last_pos < pos )
{
m_buffer[m_last_pos++] = (stream_sample_t) m_cur;
}
}
+ ATTR_HOT void sound_update_fill(int samples)
+ {
+ if (samples > m_bufsize)
+ throw emu_fatalerror("sound %s: pos %d exceeded bufsize %d\n", name().c_str(), samples, m_bufsize);
+ while (m_last_pos < samples )
+ {
+ m_buffer[m_last_pos++] = (stream_sample_t) m_cur;
+ }
+ }
+
NETLIB_UPDATEI()
{
nl_double val = m_in() * m_mult() + m_offset();
- sound_update(netlist().time());
+ sound_update(exec().time());
/* ignore spikes */
if (std::abs(val) < 32767.0)
m_cur = val;
@@ -313,21 +343,22 @@ public:
ATTR_HOT void buffer_reset(const netlist::netlist_time &upto)
{
m_last_pos = 0;
- m_last_buffer = upto;
- m_cur = 0.0;
+ m_last_buffer_time = upto;
}
netlist::param_int_t m_channel;
netlist::param_double_t m_mult;
netlist::param_double_t m_offset;
stream_sample_t *m_buffer;
- netlist::netlist_time m_sample;
+ int m_bufsize;
+
+ netlist::netlist_time m_sample_time;
private:
netlist::analog_input_t m_in;
double m_cur;
int m_last_pos;
- netlist::state_var<netlist::netlist_time> m_last_buffer;
+ netlist::state_var<netlist::netlist_time> m_last_buffer_time;
};
// ----------------------------------------------------------------------------------------
@@ -337,58 +368,57 @@ private:
class NETLIB_NAME(sound_in) : public netlist::device_t
{
public:
- NETLIB_NAME(sound_in)(netlist::netlist_t &anetlist, const pstring &name)
+
+ static const int MAX_INPUT_CHANNELS = 16;
+
+ NETLIB_NAME(sound_in)(netlist::netlist_state_t &anetlist, const pstring &name)
: netlist::device_t(anetlist, name)
+ , m_inc(netlist::netlist_time::from_nsec(1))
, m_feedback(*this, "FB") // clock part
, m_Q(*this, "Q")
, m_pos(0)
- , m_num_channel(0)
+ , m_num_channels(0)
{
connect(m_feedback, m_Q);
- m_inc = netlist::netlist_time::from_nsec(1);
-
for (int i = 0; i < MAX_INPUT_CHANNELS; i++)
{
- m_param_name[i] = std::make_unique<netlist::param_str_t>(*this, plib::pfmt("CHAN{1}")(i), "");
- m_param_mult[i] = std::make_unique<netlist::param_double_t>(*this, plib::pfmt("MULT{1}")(i), 1.0);
- m_param_offset[i] = std::make_unique<netlist::param_double_t>(*this, plib::pfmt("OFFSET{1}")(i), 0.0);
+ m_channels[i].m_param_name = netlist::pool().make_poolptr<netlist::param_str_t>(*this, plib::pfmt("CHAN{1}")(i), "");
+ m_channels[i].m_param_mult = netlist::pool().make_poolptr<netlist::param_double_t>(*this, plib::pfmt("MULT{1}")(i), 1.0);
+ m_channels[i].m_param_offset = netlist::pool().make_poolptr<netlist::param_double_t>(*this, plib::pfmt("OFFSET{1}")(i), 0.0);
}
}
- static const int MAX_INPUT_CHANNELS = 10;
-
ATTR_COLD void reset() override
{
m_pos = 0;
- for (auto & elem : m_buffer)
- elem = nullptr;
+ for (auto & elem : m_channels)
+ elem.m_buffer = nullptr;
}
- ATTR_COLD int resolve()
+ ATTR_COLD void resolve()
{
m_pos = 0;
for (int i = 0; i < MAX_INPUT_CHANNELS; i++)
{
- if ((*m_param_name[i])() != pstring(""))
+ if ((*m_channels[i].m_param_name)() != pstring(""))
{
- if (i != m_num_channel)
- netlist().log().fatal("sound input numbering has to be sequential!");
- m_num_channel++;
- m_param[i] = dynamic_cast<netlist::param_double_t *>(setup().find_param((*m_param_name[i])(), true));
+ if (i != m_num_channels)
+ state().log().fatal("sound input numbering has to be sequential!");
+ m_num_channels++;
+ m_channels[i].m_param = dynamic_cast<netlist::param_double_t *>(setup().find_param((*m_channels[i].m_param_name)(), true));
}
}
- return m_num_channel;
}
NETLIB_UPDATEI()
{
- for (int i=0; i<m_num_channel; i++)
+ for (int i=0; i<m_num_channels; i++)
{
- if (m_buffer[i] == nullptr)
+ if (m_channels[i].m_buffer == nullptr)
break; // stop, called outside of stream_update
- const nl_double v = m_buffer[i][m_pos];
- m_param[i]->setTo(v * (*m_param_mult[i])() + (*m_param_offset[i])());
+ const nl_double v = m_channels[i].m_buffer[m_pos];
+ m_channels[i].m_param->setTo(v * (*m_channels[i].m_param_mult)() + (*m_channels[i].m_param_offset)());
}
m_pos++;
m_Q.net().toggle_and_push_to_queue(m_inc);
@@ -400,19 +430,25 @@ public:
m_pos = 0;
}
- std::unique_ptr<netlist::param_str_t> m_param_name[MAX_INPUT_CHANNELS];
- netlist::param_double_t *m_param[MAX_INPUT_CHANNELS];
- stream_sample_t *m_buffer[MAX_INPUT_CHANNELS];
- std::unique_ptr<netlist::param_double_t> m_param_mult[MAX_INPUT_CHANNELS];
- std::unique_ptr<netlist::param_double_t> m_param_offset[MAX_INPUT_CHANNELS];
+ struct channel
+ {
+ netlist::pool_owned_ptr<netlist::param_str_t> m_param_name;
+ netlist::param_double_t *m_param;
+ stream_sample_t *m_buffer;
+ netlist::pool_owned_ptr<netlist::param_double_t> m_param_mult;
+ netlist::pool_owned_ptr<netlist::param_double_t> m_param_offset;
+ };
+ channel m_channels[MAX_INPUT_CHANNELS];
netlist::netlist_time m_inc;
+ int num_channels() { return m_num_channels; }
+
private:
netlist::logic_input_t m_feedback;
netlist::logic_output_t m_Q;
int m_pos;
- int m_num_channel;
+ int m_num_channels;
};
@@ -431,26 +467,25 @@ private:
netlist::setup_t &netlist_mame_device::setup()
{
- return m_netlist->setup();
+ return m_netlist->nlstate().setup();
}
-void netlist_mame_device::register_memregion_source(netlist::setup_t &setup, const char *name)
+void netlist_mame_device::register_memregion_source(netlist::nlparse_t &setup, device_t &dev, const char *name)
{
- setup.register_source(plib::make_unique_base<netlist::source_t, netlist_source_memregion_t>(setup, pstring(name, pstring::UTF8)));
+ setup.register_source(plib::make_unique<netlist_source_memregion_t>(dev, pstring(name)));
}
void netlist_mame_analog_input_device::write(const double val)
{
- if (is_sound_device())
- {
- update_to_current_time();
- m_param->setTo(val * m_mult + m_offset);
- }
- else
- {
- // FIXME: use device timer ....
- m_param->setTo(val * m_mult + m_offset);
- }
+ m_value_for_device_timer = val * m_mult + m_offset;
+ if (m_value_for_device_timer != (*m_param)())
+ synchronize(0, 0, &m_value_for_device_timer);
+}
+
+void netlist_mame_analog_input_device::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr)
+{
+ update_to_current_time();
+ m_param->setTo(*((double *) ptr));
}
void netlist_mame_int_input_device::write(const uint32_t val)
@@ -469,15 +504,13 @@ void netlist_mame_logic_input_device::write(const uint32_t val)
void netlist_mame_int_input_device::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr)
{
- if (is_sound_device())
- update_to_current_time();
+ update_to_current_time();
m_param->setTo(param);
}
void netlist_mame_logic_input_device::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr)
{
- if (is_sound_device())
- update_to_current_time();
+ update_to_current_time();
m_param->setTo(param);
}
@@ -500,7 +533,7 @@ void netlist_mame_cpu_device::state_string_export(const device_state_entry &entr
if (entry.index() & 1)
str = string_format("%10.6f", *((double *)entry.dataptr()));
else
- str = string_format("%d", *((netlist_sig_t *)entry.dataptr()));
+ str = string_format("%d", *((netlist::netlist_sig_t *)entry.dataptr()));
}
}
@@ -528,7 +561,7 @@ netlist_mame_analog_input_device::netlist_mame_analog_input_device(const machine
void netlist_mame_analog_input_device::device_start()
{
LOGDEVCALLS("start\n");
- netlist::param_t *p = this->nl_owner().setup().find_param(pstring(m_param_name, pstring::UTF8));
+ netlist::param_t *p = this->nl_owner().setup().find_param(pstring(m_param_name));
m_param = dynamic_cast<netlist::param_double_t *>(p);
if (m_param == nullptr)
{
@@ -560,16 +593,17 @@ void netlist_mame_analog_output_device::set_params(const char *in_name, output_d
m_delegate = std::move(adelegate);
}
-void netlist_mame_analog_output_device::custom_netlist_additions(netlist::setup_t &setup)
+void netlist_mame_analog_output_device::custom_netlist_additions(netlist::netlist_state_t &nlstate)
{
- const pstring pin(m_in, pstring::UTF8);
+ const pstring pin(m_in);
pstring dname = pstring("OUT_") + pin;
+ pstring dfqn = nlstate.setup().build_fqn(dname);
m_delegate.bind_relative_to(owner()->machine().root_device());
- plib::owned_ptr<netlist::device_t> dev = plib::owned_ptr<netlist::device_t>::Create<NETLIB_NAME(analog_callback)>(setup.netlist(), setup.build_fqn(dname));
+ auto dev = netlist::pool().make_poolptr<NETLIB_NAME(analog_callback)>(nlstate, dfqn);
static_cast<NETLIB_NAME(analog_callback) *>(dev.get())->register_callback(std::move(m_delegate));
- setup.netlist().register_dev(std::move(dev));
- setup.register_link(dname + ".IN", pin);
+ nlstate.add_dev(dfqn, std::move(dev));
+ nlstate.setup().register_link(dname + ".IN", pin);
}
void netlist_mame_analog_output_device::device_start()
@@ -595,16 +629,18 @@ void netlist_mame_logic_output_device::set_params(const char *in_name, output_de
m_delegate = std::move(adelegate);
}
-void netlist_mame_logic_output_device::custom_netlist_additions(netlist::setup_t &setup)
+void netlist_mame_logic_output_device::custom_netlist_additions(netlist::netlist_state_t &nlstate)
{
- pstring pin(m_in, pstring::UTF8);
+ pstring pin(m_in);
pstring dname = "OUT_" + pin;
+ pstring dfqn = nlstate.setup().build_fqn(dname);
+
m_delegate.bind_relative_to(owner()->machine().root_device());
- plib::owned_ptr<netlist::device_t> dev = plib::owned_ptr<netlist::device_t>::Create<NETLIB_NAME(logic_callback)>(setup.netlist(), setup.build_fqn(dname));
+ auto dev = netlist::pool().make_poolptr<NETLIB_NAME(logic_callback)>(nlstate, dfqn);
static_cast<NETLIB_NAME(logic_callback) *>(dev.get())->register_callback(std::move(m_delegate));
- setup.netlist().register_dev(std::move(dev));
- setup.register_link(dname + ".IN", pin);
+ nlstate.add_dev(dfqn, std::move(dev));
+ nlstate.setup().register_link(dname + ".IN", pin);
}
void netlist_mame_logic_output_device::device_start()
@@ -638,7 +674,7 @@ void netlist_mame_int_input_device::set_params(const char *param_name, const uin
void netlist_mame_int_input_device::device_start()
{
LOGDEVCALLS("start\n");
- netlist::param_t *p = downcast<netlist_mame_device *>(this->owner())->setup().find_param(pstring(m_param_name, pstring::UTF8));
+ netlist::param_t *p = downcast<netlist_mame_device *>(this->owner())->setup().find_param(pstring(m_param_name));
m_param = dynamic_cast<netlist::param_int_t *>(p);
if (m_param == nullptr)
{
@@ -669,7 +705,7 @@ void netlist_mame_logic_input_device::set_params(const char *param_name, const u
void netlist_mame_logic_input_device::device_start()
{
LOGDEVCALLS("start\n");
- netlist::param_t *p = downcast<netlist_mame_device *>(this->owner())->setup().find_param(pstring(m_param_name, pstring::UTF8));
+ netlist::param_t *p = downcast<netlist_mame_device *>(this->owner())->setup().find_param(pstring(m_param_name));
m_param = dynamic_cast<netlist::param_logic_t *>(p);
if (m_param == nullptr)
{
@@ -700,7 +736,7 @@ void netlist_mame_ram_pointer_device::set_params(const char *param_name)
void netlist_mame_ram_pointer_device::device_start()
{
LOGDEVCALLS("start\n");
- netlist::param_t *p = downcast<netlist_mame_device *>(this->owner())->setup().find_param(pstring(m_param_name, pstring::UTF8));
+ netlist::param_t *p = downcast<netlist_mame_device *>(this->owner())->setup().find_param(pstring(m_param_name));
m_param = dynamic_cast<netlist::param_ptr_t *>(p);
if (m_param == nullptr)
{
@@ -733,17 +769,17 @@ void netlist_mame_stream_input_device::device_start()
LOGDEVCALLS("start\n");
}
-void netlist_mame_stream_input_device::custom_netlist_additions(netlist::setup_t &setup)
+void netlist_mame_stream_input_device::custom_netlist_additions(netlist::netlist_state_t &nlstate)
{
- if (!setup.device_exists("STREAM_INPUT"))
- setup.register_dev("NETDEV_SOUND_IN", "STREAM_INPUT");
+ if (!nlstate.setup().device_exists("STREAM_INPUT"))
+ nlstate.setup().register_dev("NETDEV_SOUND_IN", "STREAM_INPUT");
pstring sparam = plib::pfmt("STREAM_INPUT.CHAN{1}")(m_channel);
- setup.register_param(sparam, pstring(m_param_name, pstring::UTF8));
+ nlstate.setup().register_param(sparam, pstring(m_param_name));
sparam = plib::pfmt("STREAM_INPUT.MULT{1}")(m_channel);
- setup.register_param(sparam, m_mult);
+ nlstate.setup().register_param(sparam, m_mult);
sparam = plib::pfmt("STREAM_INPUT.OFFSET{1}")(m_channel);
- setup.register_param(sparam, m_offset);
+ nlstate.setup().register_param(sparam, m_offset);
}
// ----------------------------------------------------------------------------------------
@@ -769,18 +805,18 @@ void netlist_mame_stream_output_device::device_start()
LOGDEVCALLS("start\n");
}
-void netlist_mame_stream_output_device::custom_netlist_additions(netlist::setup_t &setup)
+void netlist_mame_stream_output_device::custom_netlist_additions(netlist::netlist_state_t &nlstate)
{
//NETLIB_NAME(sound_out) *snd_out;
pstring sname = plib::pfmt("STREAM_OUT_{1}")(m_channel);
//snd_out = dynamic_cast<NETLIB_NAME(sound_out) *>(setup.register_dev("nld_sound_out", sname));
- setup.register_dev("NETDEV_SOUND_OUT", sname);
+ nlstate.setup().register_dev("NETDEV_SOUND_OUT", sname);
- setup.register_param(sname + ".CHAN" , m_channel);
- setup.register_param(sname + ".MULT", m_mult);
- setup.register_param(sname + ".OFFSET", m_offset);
- setup.register_link(sname + ".IN", pstring(m_out_name, pstring::UTF8));
+ nlstate.setup().register_param(sname + ".CHAN" , m_channel);
+ nlstate.setup().register_param(sname + ".MULT", m_mult);
+ nlstate.setup().register_param(sname + ".OFFSET", m_offset);
+ nlstate.setup().register_link(sname + ".IN", pstring(m_out_name));
}
@@ -797,7 +833,6 @@ netlist_mame_device::netlist_mame_device(const machine_config &mconfig, device_t
: device_t(mconfig, type, tag, owner, clock)
, m_icount(0)
, m_old(netlist::netlist_time::zero())
- , m_netlist(nullptr)
, m_setup_func(nullptr)
{
}
@@ -807,12 +842,6 @@ netlist_mame_device::~netlist_mame_device()
LOGDEVCALLS("~netlist_mame_device\n");
}
-void netlist_mame_device::set_constructor(void (*setup_func)(netlist::setup_t &))
-{
- if (LOG_DEV_CALLS) logerror("set_constructor\n");
- m_setup_func = setup_func;
-}
-
void netlist_mame_device::device_config_complete()
{
LOGDEVCALLS("device_config_complete %s\n", this->mconfig().gamedrv().name);
@@ -830,7 +859,7 @@ void netlist_mame_device::device_start()
//printf("clock is %d\n", clock());
- m_netlist = global_alloc(netlist_mame_t(*this, "netlist"));
+ m_netlist = netlist::pool().make_poolptr<netlist_mame_t>(*this, "netlist");
// register additional devices
@@ -843,12 +872,12 @@ void netlist_mame_device::device_start()
if( sdev != nullptr )
{
LOGDEVCALLS("Preparse subdevice %s/%s\n", d.name(), d.shortname());
- sdev->pre_parse_action(setup());
+ sdev->pre_parse_action(m_netlist->nlstate());
}
}
/* add default data provider for roms */
- setup().register_source(plib::make_unique_base<netlist::source_t, netlist_data_memregions_t>(setup()));
+ setup().register_source(plib::make_unique<netlist_data_memregions_t>(*this));
m_setup_func(setup());
@@ -859,15 +888,15 @@ void netlist_mame_device::device_start()
if( sdev != nullptr )
{
LOGDEVCALLS("Found subdevice %s/%s\n", d.name(), d.shortname());
- sdev->custom_netlist_additions(setup());
+ sdev->custom_netlist_additions(m_netlist->nlstate());
}
}
- netlist().start();
+ setup().prepare_to_run();
- netlist().save(*this, m_rem, "m_rem");
- netlist().save(*this, m_div, "m_div");
- netlist().save(*this, m_old, "m_old");
+ netlist().nlstate().save(*this, m_rem, this->name(), "m_rem");
+ netlist().nlstate().save(*this, m_div, this->name(), "m_div");
+ netlist().nlstate().save(*this, m_old, this->name(), "m_old");
save_state();
@@ -896,29 +925,26 @@ void netlist_mame_device::device_stop()
{
LOGDEVCALLS("device_stop\n");
netlist().stop();
-
- global_free(m_netlist);
- m_netlist = nullptr;
}
ATTR_COLD void netlist_mame_device::device_post_load()
{
LOGDEVCALLS("device_post_load\n");
- netlist().state().post_load();
- netlist().rebuild_lists();
+ netlist().run_state_manager().post_load();
+ netlist().nlstate().rebuild_lists();
}
ATTR_COLD void netlist_mame_device::device_pre_save()
{
LOGDEVCALLS("device_pre_save\n");
- netlist().state().pre_save();
+ netlist().run_state_manager().pre_save();
}
-void netlist_mame_device::update_time_x()
+void netlist_mame_device::update_icount(netlist::netlist_time time)
{
- const netlist::netlist_time newt(netlist().time());
+ const netlist::netlist_time newt(time);
const netlist::netlist_time delta(newt - m_old + m_rem);
const uint64_t d = delta / m_div;
m_old = newt;
@@ -934,7 +960,7 @@ void netlist_mame_device::check_mame_abort_slice()
ATTR_COLD void netlist_mame_device::save_state()
{
- for (auto const & s : netlist().state().save_list())
+ for (auto const & s : netlist().run_state_manager().save_list())
{
netlist().log().debug("saving state for {1}\n", s->m_name.c_str());
if (s->m_dt.is_float)
@@ -997,17 +1023,18 @@ void netlist_mame_cpu_device::device_start()
state_add(STATE_GENPC, "GENPC", m_genPC).noshow();
state_add(STATE_GENPCBASE, "CURPC", m_genPC).noshow();
- for (int i=0; i < netlist().m_nets.size(); i++)
+ int index = 0;
+ for (auto &n : netlist().nlstate().nets())
{
- netlist::detail::net_t *n = netlist().m_nets[i].get();
if (n->is_logic())
{
- state_add(i*2, n->name().c_str(), *downcast<netlist::logic_net_t *>(n)->Q_state_ptr());
+ state_add(index, n->name().c_str(), *(downcast<netlist::logic_net_t &>(*n).Q_state_ptr()));
}
else
{
- state_add(i*2+1, n->name().c_str(), *downcast<netlist::analog_net_t *>(n)->Q_Analog_state_ptr());
+ state_add(index, n->name().c_str(), *(downcast<netlist::analog_net_t &>(*n).Q_Analog_state_ptr()));
}
+ index++;
}
// set our instruction counter
@@ -1032,10 +1059,8 @@ ATTR_COLD uint64_t netlist_mame_cpu_device::execute_cycles_to_clocks(uint64_t cy
ATTR_HOT void netlist_mame_cpu_device::execute_run()
{
- bool check_debugger = ((device_t::machine().debug_flags & DEBUG_FLAG_ENABLED) != 0);
- // debugging
//m_ppc = m_pc; // copy PC to previous PC
- if (check_debugger)
+ if (debugger_enabled())
{
while (m_icount > 0)
{
@@ -1043,13 +1068,13 @@ ATTR_HOT void netlist_mame_cpu_device::execute_run()
m_genPC &= 255;
debugger_instruction_hook(m_genPC);
netlist().process_queue(m_div);
- update_time_x();
+ update_icount(netlist().time());
}
}
else
{
netlist().process_queue(m_div * m_icount);
- update_time_x();
+ update_icount(netlist().time());
}
}
@@ -1089,11 +1114,8 @@ offs_t netlist_disassembler::disassemble(std::ostream &stream, offs_t pc, const
netlist_mame_sound_device::netlist_mame_sound_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
: netlist_mame_device(mconfig, NETLIST_SOUND, tag, owner, clock)
, device_sound_interface(mconfig, *this)
- , m_out{nullptr}
, m_in(nullptr)
, m_stream(nullptr)
- , m_num_inputs(0)
- , m_num_outputs(0)
{
}
@@ -1105,44 +1127,45 @@ void netlist_mame_sound_device::device_start()
// Configure outputs
- std::vector<nld_sound_out *> outdevs = netlist().get_device_list<nld_sound_out>();
+ std::vector<nld_sound_out *> outdevs = netlist().nlstate().get_device_list<nld_sound_out>();
if (outdevs.size() == 0)
fatalerror("No output devices");
- m_num_outputs = outdevs.size();
+ //m_num_outputs = outdevs.size();
/* resort channels */
- for (int i=0; i < MAX_OUT; i++) m_out[i] = nullptr;
- for (int i=0; i < m_num_outputs; i++)
+ for (auto &outdev : outdevs)
{
- int chan = outdevs[i]->m_channel();
+ int chan = outdev->m_channel();
- netlist().log().verbose("Output %d on channel %d", i, chan);
+ netlist().log().verbose("Output %s on channel %d", outdev->name(), chan);
- if (chan < 0 || chan >= MAX_OUT || chan >= outdevs.size())
+ if (chan < 0 || chan >= outdevs.size())
fatalerror("illegal channel number");
- m_out[chan] = outdevs[i];
- m_out[chan]->m_sample = netlist::netlist_time::from_hz(clock());
+ m_out[chan] = outdev;
+ m_out[chan]->m_sample_time = netlist::netlist_time::from_hz(clock());
m_out[chan]->m_buffer = nullptr;
+ m_out[chan]->m_bufsize = 0;
}
// Configure inputs
+ // FIXME: The limitation to one input device seems artificial.
+ // We should allow multiple devices with one channel each.
- m_num_inputs = 0;
m_in = nullptr;
- std::vector<nld_sound_in *> indevs = netlist().get_device_list<nld_sound_in>();
+ std::vector<nld_sound_in *> indevs = netlist().nlstate().get_device_list<nld_sound_in>();
if (indevs.size() > 1)
fatalerror("A maximum of one input device is allowed!");
if (indevs.size() == 1)
{
m_in = indevs[0];
- m_num_inputs = m_in->resolve();
+ m_in->resolve();
m_in->m_inc = netlist::netlist_time::from_hz(clock());
}
/* initialize the stream(s) */
- m_stream = machine().sound().stream_alloc(*this, m_num_inputs, m_num_outputs, clock());
+ m_stream = machine().sound().stream_alloc(*this, m_in ? m_in->num_channels() : 0, m_out.size(), clock());
}
@@ -1155,17 +1178,21 @@ void netlist_mame_sound_device::nl_register_devices()
void netlist_mame_sound_device::sound_stream_update(sound_stream &stream, stream_sample_t **inputs, stream_sample_t **outputs, int samples)
{
- for (int i=0; i < m_num_outputs; i++)
+
+ for (auto &e : m_out)
{
- m_out[i]->m_buffer = outputs[i];
+ e.second->m_buffer = outputs[e.first];
+ e.second->m_bufsize = samples;
}
- if (m_num_inputs)
- m_in->buffer_reset();
- for (int i=0; i < m_num_inputs; i++)
+ if (m_in)
{
- m_in->m_buffer[i] = inputs[i];
+ m_in->buffer_reset();
+ for (int i=0; i < m_in->num_channels(); i++)
+ {
+ m_in->m_channels[i].m_buffer = inputs[i];
+ }
}
netlist::netlist_time cur(netlist().time());
@@ -1174,9 +1201,9 @@ void netlist_mame_sound_device::sound_stream_update(sound_stream &stream, stream
cur += (m_div * samples);
- for (int i=0; i < m_num_outputs; i++)
+ for (auto &e : m_out)
{
- m_out[i]->sound_update(cur);
- m_out[i]->buffer_reset(cur);
+ e.second->sound_update_fill(samples);
+ e.second->buffer_reset(cur);
}
}
diff --git a/src/devices/machine/netlist.h b/src/devices/machine/netlist.h
index 36bdcb0c415..639223d2842 100644
--- a/src/devices/machine/netlist.h
+++ b/src/devices/machine/netlist.h
@@ -11,16 +11,19 @@
#ifndef MAME_MACHINE_NETLIST_H
#define MAME_MACHINE_NETLIST_H
-#include "netlist/nl_time.h"
+#include <functional>
+
+#include "../../lib/netlist/nltypes.h"
class nld_sound_out;
class nld_sound_in;
namespace netlist {
class setup_t;
- class param_double_t;
- class param_int_t;
- class param_logic_t;
+ class netlist_state_t;
+ class nlparse_t;
+ template <typename T>
+ class param_num_t;
class param_ptr_t;
}
@@ -31,6 +34,9 @@ namespace netlist {
#define MCFG_NETLIST_SETUP(_setup) \
downcast<netlist_mame_device &>(*device).set_constructor(NETLIST_NAME(_setup));
+#define MCFG_NETLIST_SETUP_MEMBER(_obj, _setup) \
+ downcast<netlist_mame_device &>(*device).set_constructor(_obj, _setup);
+
#define MCFG_NETLIST_ANALOG_INPUT(_basetag, _tag, _name) \
MCFG_DEVICE_ADD(_basetag ":" _tag, NETLIST_ANALOG_INPUT, 0) \
downcast<netlist_mame_analog_input_device &>(*device).set_name(_name);
@@ -79,9 +85,10 @@ namespace netlist {
#define NETLIST_ANALOG_PORT_CHANGED(_base, _tag) \
PORT_CHANGED_MEMBER(_base ":" _tag, netlist_mame_analog_input_device, input_changed, 0)
+/* This macro can only be called from device member */
#define MEMREGION_SOURCE(_name) \
- netlist_mame_device::register_memregion_source(setup, _name);
+ netlist_mame_device::register_memregion_source(setup, *this, _name);
#define NETDEV_ANALOG_CALLBACK_MEMBER(_name) \
void _name(const double data, const attotime &time)
@@ -99,21 +106,32 @@ class netlist_mame_device : public device_t
{
public:
class netlist_mame_t;
+ class netlist_mame_callbacks_t;
+
+ using func_type = std::function<void(netlist::nlparse_t &)>;
// construction/destruction
netlist_mame_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
virtual ~netlist_mame_device();
- void set_constructor(void (*setup_func)(netlist::setup_t &));
+ void set_constructor(void (*setup_func)(netlist::nlparse_t &))
+ {
+ m_setup_func = func_type(setup_func);
+ }
+
+ template <typename T, typename F>
+ void set_constructor(T *obj, F && f)
+ {
+ m_setup_func = std::move(std::bind(std::forward<F>(f), obj, std::placeholders::_1));
+ }
ATTR_HOT inline netlist::setup_t &setup();
ATTR_HOT inline netlist_mame_t &netlist() { return *m_netlist; }
- ATTR_HOT inline const netlist::netlist_time last_time_update() { return m_old; }
- ATTR_HOT void update_time_x();
+ ATTR_HOT void update_icount(netlist::netlist_time time);
ATTR_HOT void check_mame_abort_slice();
- static void register_memregion_source(netlist::setup_t &setup, const char *name);
+ static void register_memregion_source(netlist::nlparse_t &setup, device_t &dev, const char *name);
int m_icount;
@@ -142,9 +160,9 @@ private:
netlist::netlist_time m_rem;
netlist::netlist_time m_old;
- netlist_mame_t * m_netlist;
+ netlist::pool_owned_ptr<netlist_mame_t> m_netlist;
- void (*m_setup_func)(netlist::setup_t &);
+ func_type m_setup_func;
};
// ----------------------------------------------------------------------------------------
@@ -231,13 +249,9 @@ protected:
virtual void device_start() override;
private:
- static constexpr int MAX_OUT = 10;
- nld_sound_out *m_out[MAX_OUT];
+ std::map<int, nld_sound_out *> m_out;
nld_sound_in *m_in;
sound_stream *m_stream;
- int m_num_inputs;
- int m_num_outputs;
-
};
// ----------------------------------------------------------------------------------------
@@ -255,14 +269,16 @@ public:
{
}
- virtual void custom_netlist_additions(netlist::setup_t &setup) { }
- virtual void pre_parse_action(netlist::setup_t &setup) { }
+ virtual void custom_netlist_additions(netlist::netlist_state_t &nlstate) { }
+ virtual void pre_parse_action(netlist::netlist_state_t &nlstate) { }
inline netlist_mame_device &nl_owner() const { return *m_owner; }
- inline bool is_sound_device() const { return bool(m_sound); }
-
- inline void update_to_current_time() { m_sound->get_stream()->update(); }
+ inline void update_to_current_time()
+ {
+ if (m_sound != nullptr)
+ m_sound->get_stream()->update();
+ }
void set_mult_offset(const double mult, const double offset);
@@ -306,11 +322,13 @@ public:
protected:
// device-level overrides
virtual void device_start() override;
+ virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override;
private:
- netlist::param_double_t *m_param;
+ netlist::param_num_t<double> *m_param;
bool m_auto_port;
const char *m_param_name;
+ double m_value_for_device_timer;
};
// ----------------------------------------------------------------------------------------
@@ -330,7 +348,7 @@ public:
protected:
// device-level overrides
virtual void device_start() override;
- virtual void custom_netlist_additions(netlist::setup_t &setup) override;
+ virtual void custom_netlist_additions(netlist::netlist_state_t &nlstate) override;
private:
const char *m_in;
@@ -362,7 +380,7 @@ public:
protected:
// device-level overrides
virtual void device_start() override;
- virtual void custom_netlist_additions(netlist::setup_t &setup) override;
+ virtual void custom_netlist_additions(netlist::netlist_state_t &nlstate) override;
private:
const char *m_in;
@@ -402,7 +420,7 @@ protected:
virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override;
private:
- netlist::param_int_t *m_param;
+ netlist::param_num_t<int> *m_param;
uint32_t m_mask;
uint32_t m_shift;
const char *m_param_name;
@@ -441,7 +459,7 @@ protected:
virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override;
private:
- netlist::param_logic_t *m_param;
+ netlist::param_num_t<bool> *m_param;
uint32_t m_shift;
const char *m_param_name;
};
@@ -491,7 +509,7 @@ public:
protected:
// device-level overrides
virtual void device_start() override;
- virtual void custom_netlist_additions(netlist::setup_t &setup) override;
+ virtual void custom_netlist_additions(netlist::netlist_state_t &nlstate) override;
private:
uint32_t m_channel;
const char *m_param_name;
@@ -517,7 +535,7 @@ public:
protected:
// device-level overrides
virtual void device_start() override;
- virtual void custom_netlist_additions(netlist::setup_t &setup) override;
+ virtual void custom_netlist_additions(netlist::netlist_state_t &nlstate) override;
private:
uint32_t m_channel;
diff --git a/src/devices/machine/nmc9306.h b/src/devices/machine/nmc9306.h
index 097742685aa..07aa6b36db0 100644
--- a/src/devices/machine/nmc9306.h
+++ b/src/devices/machine/nmc9306.h
@@ -19,17 +19,6 @@
#pragma once
-
-
-//**************************************************************************
-// INTERFACE CONFIGURATION MACROS
-//**************************************************************************
-
-#define MCFG_NMC9306_ADD(tag) \
- MCFG_DEVICE_ADD((tag), NMC9306, 0)
-
-
-
//**************************************************************************
// TYPE DEFINITIONS
//**************************************************************************
diff --git a/src/devices/machine/nsc810.cpp b/src/devices/machine/nsc810.cpp
index bf06c34d9dc..96a13e7b696 100644
--- a/src/devices/machine/nsc810.cpp
+++ b/src/devices/machine/nsc810.cpp
@@ -118,7 +118,7 @@ void nsc810_device::device_timer(emu_timer &timer, device_timer_id id, int param
}
}
-READ8_MEMBER(nsc810_device::read)
+uint8_t nsc810_device::read(offs_t offset)
{
uint8_t res = 0xff;
@@ -191,7 +191,7 @@ READ8_MEMBER(nsc810_device::read)
return res;
}
-WRITE8_MEMBER(nsc810_device::write)
+void nsc810_device::write(offs_t offset, uint8_t data)
{
uint32_t rate;
diff --git a/src/devices/machine/nsc810.h b/src/devices/machine/nsc810.h
index bebeb8f82a6..520591208f7 100644
--- a/src/devices/machine/nsc810.h
+++ b/src/devices/machine/nsc810.h
@@ -16,24 +16,38 @@ class nsc810_device : public device_t
{
public:
// construction/destruction
+ nsc810_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock, uint32_t clk0, uint32_t clk1)
+ : nsc810_device(mconfig, tag, owner, clock)
+ {
+ set_timer0_clock(clk0);
+ set_timer1_clock(clk1);
+ }
+
+ nsc810_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock, const XTAL &clk0, const XTAL &clk1)
+ : nsc810_device(mconfig, tag, owner, clock)
+ {
+ set_timer0_clock(clk0.value());
+ set_timer1_clock(clk1.value());
+ }
+
nsc810_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- template <class Object> devcb_base &set_portA_read_callback(Object &&cb) { return m_portA_r.set_callback(std::forward<Object>(cb)); }
- template <class Object> devcb_base &set_portB_read_callback(Object &&cb) { return m_portB_r.set_callback(std::forward<Object>(cb)); }
- template <class Object> devcb_base &set_portC_read_callback(Object &&cb) { return m_portC_r.set_callback(std::forward<Object>(cb)); }
- template <class Object> devcb_base &set_portA_write_callback(Object &&cb) { return m_portA_w.set_callback(std::forward<Object>(cb)); }
- template <class Object> devcb_base &set_portB_write_callback(Object &&cb) { return m_portB_w.set_callback(std::forward<Object>(cb)); }
- template <class Object> devcb_base &set_portC_write_callback(Object &&cb) { return m_portC_w.set_callback(std::forward<Object>(cb)); }
- template <class Object> devcb_base &set_timer0_callback(Object &&cb) { return m_timer0_out.set_callback(std::forward<Object>(cb)); }
- template <class Object> devcb_base &set_timer1_callback(Object &&cb) { return m_timer1_out.set_callback(std::forward<Object>(cb)); }
+ auto portA_read_callback() { return m_portA_r.bind(); }
+ auto portB_read_callback() { return m_portB_r.bind(); }
+ auto portC_read_callback() { return m_portC_r.bind(); }
+ auto portA_write_callback() { return m_portA_w.bind(); }
+ auto portB_write_callback() { return m_portB_w.bind(); }
+ auto portC_write_callback() { return m_portC_w.bind(); }
+ auto timer0_callback() { return m_timer0_out.bind(); }
+ auto timer1_callback() { return m_timer1_out.bind(); }
void set_timer0_clock(uint32_t clk) { m_timer0_clock = clk; }
void set_timer0_clock(const XTAL &clk) { set_timer0_clock(clk.value()); }
void set_timer1_clock(uint32_t clk) { m_timer1_clock = clk; }
void set_timer1_clock(const XTAL &clk) { set_timer1_clock(clk.value()); }
- DECLARE_READ8_MEMBER(read);
- DECLARE_WRITE8_MEMBER(write);
+ uint8_t read(offs_t offset);
+ void write(offs_t offset, uint8_t data);
protected:
virtual void device_start() override;
@@ -102,35 +116,6 @@ private:
};
};
-#define MCFG_NSC810_ADD(_tag, _t0clk, _t1clk) \
- MCFG_DEVICE_ADD(_tag, NSC810, 0) \
- downcast<nsc810_device *>(device)->set_timer0_clock(_t0clk); \
- downcast<nsc810_device *>(device)->set_timer1_clock(_t1clk);
-
-#define MCFG_NSC810_PORTA_READ(_read) \
- downcast<nsc810_device &>(*device).set_portA_read_callback(DEVCB_##_read);
-
-#define MCFG_NSC810_PORTB_READ(_read) \
- downcast<nsc810_device &>(*device).set_portB_read_callback(DEVCB_##_read);
-
-#define MCFG_NSC810_PORTC_READ(_read) \
- downcast<nsc810_device &>(*device).set_portC_read_callback(DEVCB_##_read);
-
-#define MCFG_NSC810_PORTA_WRITE(_write) \
- downcast<nsc810_device &>(*device).set_portA_write_callback(DEVCB_##_write);
-
-#define MCFG_NSC810_PORTB_WRITE(_write) \
- downcast<nsc810_device &>(*device).set_portB_write_callback(DEVCB_##_write);
-
-#define MCFG_NSC810_PORTC_WRITE(_write) \
- downcast<nsc810_device &>(*device).set_portC_write_callback(DEVCB_##_write);
-
-#define MCFG_NSC810_TIMER0_OUT(_write) \
- downcast<nsc810_device &>(*device).set_timer0_callback(DEVCB_##_write);
-
-#define MCFG_NSC810_TIMER1_OUT(_write) \
- downcast<nsc810_device &>(*device).set_timer1_callback(DEVCB_##_write);
-
// device type definition
DECLARE_DEVICE_TYPE(NSC810, nsc810_device)
diff --git a/src/devices/machine/nscsi_bus.cpp b/src/devices/machine/nscsi_bus.cpp
index 328dd7239bd..ef3c0dd9f9a 100644
--- a/src/devices/machine/nscsi_bus.cpp
+++ b/src/devices/machine/nscsi_bus.cpp
@@ -3,13 +3,15 @@
#include "emu.h"
#include "nscsi_bus.h"
-#define LOG_GENERAL (1U << 0)
-#define LOG_STATE (1U << 1)
-#define LOG_CONTROL (1U << 2)
-#define LOG_DATA (1U << 3)
+#define LOG_GENERAL (1U << 0)
+#define LOG_UNSUPPORTED (1U << 1)
+#define LOG_STATE (1U << 2)
+#define LOG_CONTROL (1U << 3)
+#define LOG_DATA (1U << 4)
+#define LOG_DATA_SENT (1U << 5)
//#define VERBOSE (LOG_GENERAL | LOG_STATE | LOG_CONTROL | LOG_DATA)
-#define VERBOSE 0
+#define VERBOSE (LOG_UNSUPPORTED | LOG_DATA_SENT)
#include "logmacro.h"
@@ -440,7 +442,7 @@ void nscsi_full_device::step(bool timeout)
break;
}
- if(command_done()) {
+ if(scsi_command_done(scsi_cmdbuf[0], data_buffer_pos)) {
scsi_cmdsize = data_buffer_pos;
scsi_bus->ctrl_wait(scsi_refid, 0, S_ACK);
scsi_command();
@@ -507,18 +509,17 @@ void nscsi_full_device::target_send_buffer_byte()
target_send_byte(scsi_get_data(data_buffer_id, data_buffer_pos++));
}
-bool nscsi_full_device::command_done()
+bool nscsi_full_device::scsi_command_done(uint8_t command, uint8_t length)
{
- if(!data_buffer_pos)
+ if(!length)
return false;
- uint8_t h = scsi_cmdbuf[0];
- switch(h >> 5) {
- case 0: return data_buffer_pos == 6;
- case 1: return data_buffer_pos == 10;
- case 2: return data_buffer_pos == 10;
+ switch(command >> 5) {
+ case 0: return length == 6;
+ case 1: return length == 10;
+ case 2: return length == 10;
case 3: return true;
case 4: return true;
- case 5: return data_buffer_pos == 12;
+ case 5: return length == 12;
case 6: return true;
case 7: return true;
}
@@ -562,6 +563,17 @@ void nscsi_full_device::scsi_status_complete(uint8_t st)
void nscsi_full_device::scsi_data_in(int buf, int size)
{
+ if((VERBOSE & LOG_DATA_SENT) && buf == 0) {
+ std::string dt = "";
+ int sz = size;
+ if(sz > 50)
+ sz = 50;
+ for(int i=0; i<sz; i++)
+ dt += util::string_format(" %02x", scsi_cmdbuf[i]);
+ if(size > sz)
+ dt += " ...";
+ LOGMASKED(LOG_DATA_SENT, "Sending data (%d)%s\n", size, dt);
+ }
control *c;
c = buf_control_push();
c->action = BC_DATA_IN;
@@ -583,31 +595,28 @@ void nscsi_full_device::sense(bool deferred, uint8_t key, uint8_t asc, uint8_t a
memset(scsi_sense_buffer, 0, sizeof(scsi_sense_buffer));
scsi_sense_buffer[0] = deferred ? 0x71 : 0x70;
scsi_sense_buffer[2] = key;
+ scsi_sense_buffer[7] = sizeof(scsi_sense_buffer) - 8;
scsi_sense_buffer[12] = asc;
scsi_sense_buffer[13] = ascq;
}
void nscsi_full_device::scsi_unknown_command()
{
- LOG("Unhandled command %s", command_names[scsi_cmdbuf[0]]);
+ std::string txt = util::string_format("Unhandled command %s (%d):", command_names[scsi_cmdbuf[0]], scsi_cmdsize);
for(int i=0; i != scsi_cmdsize; i++)
- logerror(" %02x", scsi_cmdbuf[i]);
- logerror("\n");
+ txt += util::string_format(" %02x", scsi_cmdbuf[i]);
+ LOGMASKED(LOG_UNSUPPORTED, "%s\n", txt);
scsi_status_complete(SS_CHECK_CONDITION);
- sense(false, 5);
+ sense(false, SK_ILLEGAL_REQUEST);
}
void nscsi_full_device::scsi_command()
{
switch(scsi_cmdbuf[0]) {
case SC_REQUEST_SENSE:
- LOG("command REQUEST SENSE\n");
- /*
- * Targets shall be capable of returning eighteen bytes of data in
- * response to a REQUEST SENSE command.
- */
- scsi_data_in(SBUF_SENSE, 18);
+ LOG("command REQUEST SENSE alloc=%d\n", scsi_cmdbuf[4]);
+ scsi_data_in(SBUF_SENSE, scsi_cmdbuf[4] ? std::min(scsi_cmdbuf[4], u8(sizeof(scsi_sense_buffer))) : 4);
scsi_status_complete(SS_GOOD);
break;
default:
@@ -623,10 +632,10 @@ void nscsi_full_device::scsi_message()
return;
}
- LOG("Unknown message");
+ std::string txt = "Unknown message";
for(int i=0; i != scsi_cmdsize; i++)
- logerror(" %02x", scsi_cmdbuf[i]);
- logerror("\n");
+ txt += util::string_format(" %02x", scsi_cmdbuf[i]);
+ LOGMASKED(LOG_UNSUPPORTED, "%s\n", txt);
}
int nscsi_full_device::get_lun(int def)
@@ -640,9 +649,7 @@ int nscsi_full_device::get_lun(int def)
void nscsi_full_device::bad_lun()
{
scsi_status_complete(SS_CHECK_CONDITION);
-
- // key:illegal request, asc:logical unit not supported
- sense(false, 5, 0x25);
+ sense(false, SK_ILLEGAL_REQUEST, SK_ASC_LOGICAL_UNIT_NOT_SUPPORTED);
}
// Arbitration delay (2.4us)
diff --git a/src/devices/machine/nscsi_bus.h b/src/devices/machine/nscsi_bus.h
index 5e7d7dcecab..244eda94fe8 100644
--- a/src/devices/machine/nscsi_bus.h
+++ b/src/devices/machine/nscsi_bus.h
@@ -6,19 +6,12 @@
#pragma once
-#define MCFG_NSCSI_BUS_ADD(_tag) \
- MCFG_DEVICE_ADD(_tag, NSCSI_BUS, 0)
-
-#define MCFG_NSCSI_ADD(_tag, _slot_intf, _def_slot, _fixed) \
- MCFG_DEVICE_ADD(_tag, NSCSI_CONNECTOR, 0) \
- MCFG_DEVICE_SLOT_INTERFACE(_slot_intf, _def_slot, _fixed)
-
class nscsi_device;
class nscsi_bus_device : public device_t
{
public:
- nscsi_bus_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+ nscsi_bus_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock = 0);
void ctrl_w(int refid, uint32_t lines, uint32_t mask);
void data_w(int refid, uint32_t lines);
@@ -49,10 +42,19 @@ private:
};
class nscsi_connector: public device_t,
- public device_slot_interface
+ public device_slot_interface
{
public:
- nscsi_connector(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+ template <typename T>
+ nscsi_connector(const machine_config &mconfig, const char *tag, device_t *owner, T &&opts, const char *dflt, bool fixed = false)
+ : nscsi_connector(mconfig, tag, owner, 0)
+ {
+ option_reset();
+ opts(*this);
+ set_default_option(dflt);
+ set_fixed(fixed);
+ }
+ nscsi_connector(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock = 0);
virtual ~nscsi_connector();
nscsi_device *get_device();
@@ -167,7 +169,9 @@ protected:
// SCSI addtional sense code qualifiers
enum {
- SK_ASC_MEDIUM_NOT_PRESENT = 0x3a
+ SK_ASC_INVALID_FIELD_IN_CDB = 0x24,
+ SK_ASC_LOGICAL_UNIT_NOT_SUPPORTED = 0x25,
+ SK_ASC_MEDIUM_NOT_PRESENT = 0x3a
};
// SCSI commands
@@ -304,6 +308,7 @@ protected:
virtual void scsi_message();
virtual void scsi_command();
+ virtual bool scsi_command_done(uint8_t command, uint8_t length);
void scsi_unknown_command();
void scsi_status_complete(uint8_t st);
@@ -444,7 +449,6 @@ private:
void target_recv_byte();
void target_send_byte(uint8_t val);
void target_send_buffer_byte();
- bool command_done();
};
diff --git a/src/devices/machine/nscsi_cb.h b/src/devices/machine/nscsi_cb.h
index b5156935a98..575e8f19298 100644
--- a/src/devices/machine/nscsi_cb.h
+++ b/src/devices/machine/nscsi_cb.h
@@ -8,48 +8,20 @@
#include "machine/nscsi_bus.h"
-#define MCFG_NSCSICB_RST_HANDLER(_line) \
- downcast<nscsi_callback_device *>(device)->set_rst_callback(DEVCB_##_line);
-
-#define MCFG_NSCSICB_ATN_HANDLER(_line) \
- downcast<nscsi_callback_device *>(device)->set_atn_callback(DEVCB_##_line);
-
-#define MCFG_NSCSICB_ACK_HANDLER(_line) \
- downcast<nscsi_callback_device *>(device)->set_ack_callback(DEVCB_##_line);
-
-#define MCFG_NSCSICB_REQ_HANDLER(_line) \
- downcast<nscsi_callback_device *>(device)->set_req_callback(DEVCB_##_line);
-
-#define MCFG_NSCSICB_MSG_HANDLER(_line) \
- downcast<nscsi_callback_device *>(device)->set_msg_callback(DEVCB_##_line);
-
-#define MCFG_NSCSICB_IO_HANDLER(_line) \
- downcast<nscsi_callback_device *>(device)->set_io_callback(DEVCB_##_line);
-
-#define MCFG_NSCSICB_CD_HANDLER(_line) \
- downcast<nscsi_callback_device *>(device)->set_cd_callback(DEVCB_##_line);
-
-#define MCFG_NSCSICB_SEL_HANDLER(_line) \
- downcast<nscsi_callback_device *>(device)->set_sel_callback(DEVCB_##_line);
-
-#define MCFG_NSCSICB_BSY_HANDLER(_line) \
- downcast<nscsi_callback_device *>(device)->set_bsy_callback(DEVCB_##_line);
-
-
class nscsi_callback_device : public nscsi_device
{
public:
nscsi_callback_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- template <class Line> devcb_base &set_rst_callback(Line &&cb) { return m_write_rst.set_callback(std::forward<Line>(cb)); }
- template <class Line> devcb_base &set_atn_callback(Line &&cb) { return m_write_atn.set_callback(std::forward<Line>(cb)); }
- template <class Line> devcb_base &set_ack_callback(Line &&cb) { return m_write_ack.set_callback(std::forward<Line>(cb)); }
- template <class Line> devcb_base &set_req_callback(Line &&cb) { return m_write_req.set_callback(std::forward<Line>(cb)); }
- template <class Line> devcb_base &set_msg_callback(Line &&cb) { return m_write_msg.set_callback(std::forward<Line>(cb)); }
- template <class Line> devcb_base &set_io_callback(Line &&cb) { return m_write_io.set_callback(std::forward<Line>(cb)); }
- template <class Line> devcb_base &set_cd_callback(Line &&cb) { return m_write_cd.set_callback(std::forward<Line>(cb)); }
- template <class Line> devcb_base &set_sel_callback(Line &&cb) { return m_write_sel.set_callback(std::forward<Line>(cb)); }
- template <class Line> devcb_base &set_bsy_callback(Line &&cb) { return m_write_bsy.set_callback(std::forward<Line>(cb)); }
+ auto rst_callback() { return m_write_rst.bind(); }
+ auto atn_callback() { return m_write_atn.bind(); }
+ auto ack_callback() { return m_write_ack.bind(); }
+ auto req_callback() { return m_write_req.bind(); }
+ auto msg_callback() { return m_write_msg.bind(); }
+ auto io_callback() { return m_write_io.bind(); }
+ auto cd_callback() { return m_write_cd.bind(); }
+ auto sel_callback() { return m_write_sel.bind(); }
+ auto bsy_callback() { return m_write_bsy.bind(); }
virtual void scsi_ctrl_changed() override;
diff --git a/src/devices/machine/nscsi_cd.cpp b/src/devices/machine/nscsi_cd.cpp
index fc1898eecd5..0446c600e9f 100644
--- a/src/devices/machine/nscsi_cd.cpp
+++ b/src/devices/machine/nscsi_cd.cpp
@@ -7,6 +7,7 @@
#include "logmacro.h"
DEFINE_DEVICE_TYPE(NSCSI_CDROM, nscsi_cdrom_device, "scsi_cdrom", "SCSI CD-ROM")
+DEFINE_DEVICE_TYPE(NSCSI_CDROM_SGI, nscsi_cdrom_sgi_device, "scsi_cdrom_sgi", "SCSI CD-ROM SGI")
DEFINE_DEVICE_TYPE(NSCSI_RRD45, nscsi_dec_rrd45_device, "nrrd45", "RRD45 CD-ROM (New)")
DEFINE_DEVICE_TYPE(NSCSI_XM3301, nscsi_toshiba_xm3301_device, "nxm3301", "XM-3301TA CD-ROM (New)")
DEFINE_DEVICE_TYPE(NSCSI_XM5301SUN, nscsi_toshiba_xm5301_sun_device, "nxm5301sun", "XM-5301B Sun 4x CD-ROM (New)")
@@ -19,6 +20,11 @@ nscsi_cdrom_device::nscsi_cdrom_device(const machine_config &mconfig, const char
{
}
+nscsi_cdrom_sgi_device::nscsi_cdrom_sgi_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) :
+ nscsi_cdrom_device(mconfig, NSCSI_CDROM_SGI, tag, owner, "Sony", "CDU-76S", "1.0", 0x00, 0x05)
+{
+}
+
nscsi_dec_rrd45_device::nscsi_dec_rrd45_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) :
nscsi_cdrom_device(mconfig, NSCSI_RRD45, tag, owner, "DEC ", "RRD45 (C) DEC ", "0436", 0x98, 0x02)
{
@@ -76,10 +82,19 @@ void nscsi_cdrom_device::device_reset()
cur_sector = -1;
}
-MACHINE_CONFIG_START(nscsi_cdrom_device::device_add_mconfig)
- MCFG_CDROM_ADD("image")
- MCFG_CDROM_INTERFACE("cdrom")
-MACHINE_CONFIG_END
+void nscsi_cdrom_device::device_add_mconfig(machine_config &config)
+{
+ CDROM(config, image).set_interface("cdrom");
+}
+
+int nscsi_cdrom_device::to_msf(int frame)
+{
+ int m = frame / (75 * 60);
+ int s = (frame / 75) % 60;
+ int f = frame % 75;
+
+ return (m << 16) | (s << 8) | f;
+}
void nscsi_cdrom_device::set_block_size(u32 block_size)
{
@@ -193,21 +208,16 @@ void nscsi_cdrom_device::scsi_command()
* is returned with sense data ILLEGAL REQUEST and LOGICAL UNIT NOT
* SUPPORTED.
*/
- if(lun) {
- bad_lun();
- return;
- }
-
int page = scsi_cmdbuf[2];
int size = scsi_cmdbuf[4];
switch(page) {
case 0:
std::fill_n(scsi_cmdbuf, 36, 0);
- // vendor and product information must be padded with spaces
- std::fill_n(&scsi_cmdbuf[8], 28, 0x20);
-
- scsi_cmdbuf[0] = 0x05; // device is present, device is CD/DVD (MMC-3)
+ if (lun != 0)
+ scsi_cmdbuf[0] = 0x7f;
+ else
+ scsi_cmdbuf[0] = 0x05; // device is present, device is CD/DVD (MMC-3)
scsi_cmdbuf[1] = 0x80; // media is removable
scsi_cmdbuf[2] = compliance; // device complies with SPC-3 standard
scsi_cmdbuf[3] = 0x02; // response data format = SPC-3 standard
@@ -216,6 +226,12 @@ void nscsi_cdrom_device::scsi_command()
strncpy((char *)&scsi_cmdbuf[8], manufacturer, 8);
strncpy((char *)&scsi_cmdbuf[16], product, 16);
strncpy((char *)&scsi_cmdbuf[32], revision, 4);
+
+ // vendor and product information must be padded with spaces
+ for(int i = 8; i < 36; i++)
+ if(scsi_cmdbuf[i] == 0)
+ scsi_cmdbuf[i] = 0x20;
+
if(size > 36)
size = 36;
scsi_data_in(SBUF_MAIN, size);
@@ -241,6 +257,48 @@ void nscsi_cdrom_device::scsi_command()
scsi_status_complete(SS_GOOD);
break;
+ case SC_RECIEVE_DIAG_RES: {
+ LOG("command RECIEVE DIAGNOSTICS RESULTS");
+ int size = (scsi_cmdbuf[3] << 8) | scsi_cmdbuf[4];
+ int pos = 0;
+ scsi_cmdbuf[pos++] = 0;
+ scsi_cmdbuf[pos++] = 6;
+ scsi_cmdbuf[pos++] = 0; // ROM is OK
+ scsi_cmdbuf[pos++] = 0; // RAM is OK
+ scsi_cmdbuf[pos++] = 0; // Data buffer is OK
+ scsi_cmdbuf[pos++] = 0; // Interface is OK
+ scsi_cmdbuf[pos++] = 0;
+ if(size > pos)
+ size = pos;
+ scsi_data_in(0, size);
+ scsi_status_complete(SS_GOOD);
+ break;
+ }
+
+ case SC_SEND_DIAGNOSTICS: {
+ LOG("command SEND DIAGNOSTICS");
+ int size = (scsi_cmdbuf[3] << 8) | scsi_cmdbuf[4];
+ if(scsi_cmdbuf[1] & 4) {
+ // Self-test
+ scsi_status_complete(SS_GOOD);
+ break;
+ }
+ int pos = 0;
+ scsi_cmdbuf[pos++] = 0;
+ scsi_cmdbuf[pos++] = 6;
+ scsi_cmdbuf[pos++] = 0; // ROM is OK
+ scsi_cmdbuf[pos++] = 0; // RAM is OK
+ scsi_cmdbuf[pos++] = 0; // Data buffer is OK
+ scsi_cmdbuf[pos++] = 0; // Interface is OK
+ scsi_cmdbuf[pos++] = 0;
+ scsi_cmdbuf[pos++] = 0;
+ if(size > pos)
+ size = pos;
+ scsi_data_in(0, size);
+ scsi_status_complete(SS_GOOD);
+ break;
+ }
+
case SC_READ_CAPACITY: {
if(!cdrom) {
return_no_cd();
@@ -250,7 +308,7 @@ void nscsi_cdrom_device::scsi_command()
LOG("command READ CAPACITY\n");
// get the last used block on the disc
- const uint32_t temp = cdrom_get_track_start(cdrom, 0xaa) * (bytes_per_sector / bytes_per_block) - 1;
+ const u32 temp = cdrom_get_track_start(cdrom, 0xaa) * (bytes_per_sector / bytes_per_block) - 1;
scsi_cmdbuf[0] = (temp>>24) & 0xff;
scsi_cmdbuf[1] = (temp>>16) & 0xff;
@@ -267,15 +325,14 @@ void nscsi_cdrom_device::scsi_command()
}
case SC_READ_10:
- if(!cdrom) {
- return_no_cd();
- break;
- }
-
lba = (scsi_cmdbuf[2]<<24) | (scsi_cmdbuf[3]<<16) | (scsi_cmdbuf[4]<<8) | scsi_cmdbuf[5];
blocks = (scsi_cmdbuf[7] << 8) | scsi_cmdbuf[8];
LOG("command READ EXTENDED start=%08x blocks=%04x\n", lba, blocks);
+ if(!cdrom) {
+ return_no_cd();
+ break;
+ }
scsi_data_in(2, blocks*bytes_per_block);
scsi_status_complete(SS_GOOD);
@@ -297,7 +354,7 @@ void nscsi_cdrom_device::scsi_command()
scsi_cmdbuf[pos++] = 0x80; // WP, cache
// get the last used block on the disc
- const uint32_t temp = cdrom_get_track_start(cdrom, 0xaa) * (bytes_per_sector / bytes_per_block) - 1;
+ const u32 temp = cdrom_get_track_start(cdrom, 0xaa) * (bytes_per_sector / bytes_per_block) - 1;
scsi_cmdbuf[pos++] = 0x08; // Block descriptor length
scsi_cmdbuf[pos++] = 0x00; // density code
@@ -309,10 +366,11 @@ void nscsi_cdrom_device::scsi_command()
scsi_cmdbuf[pos++] = (bytes_per_block>>8)&0xff;
scsi_cmdbuf[pos++] = (bytes_per_block & 0xff);
+ bool fail = false;
int pmax = page == 0x3f ? 0x3e : page;
int pmin = page == 0x3f ? 0x00 : page;
- for(int page=pmax; page >= pmin; page--) {
- switch(page) {
+ for(int p=pmax; p >= pmin; p--) {
+ switch(p) {
case 0x00: // Vendor specific (does not require page format)
scsi_cmdbuf[pos++] = 0x80; // PS, page id
scsi_cmdbuf[pos++] = 0x02; // Page length
@@ -340,7 +398,10 @@ void nscsi_cdrom_device::scsi_command()
break;
default:
- LOG("mode sense page %02x unhandled\n", page);
+ if (page != 0x3f) {
+ LOG("mode sense page %02x unhandled\n", p);
+ fail = true;
+ }
break;
}
}
@@ -348,8 +409,13 @@ void nscsi_cdrom_device::scsi_command()
if(pos > size)
pos = size;
- scsi_data_in(0, pos);
- scsi_status_complete(SS_GOOD);
+ if (!fail) {
+ scsi_data_in(0, pos);
+ scsi_status_complete(SS_GOOD);
+ } else {
+ scsi_status_complete(SS_CHECK_CONDITION);
+ sense(false, SK_ILLEGAL_REQUEST, SK_ASC_INVALID_FIELD_IN_CDB);
+ }
break;
}
@@ -359,10 +425,186 @@ void nscsi_cdrom_device::scsi_command()
scsi_status_complete(SS_GOOD);
break;
- default:
- logerror("unhandled command %02x\n", scsi_cmdbuf[0]);
+ case SC_READ_TOC_PMA_ATIP: {
+ /*
+ Track numbers are problematic here: 0 = lead-in, 0xaa = lead-out.
+ That makes sense in terms of how real-world CDs are referred to, but
+ our internal routines for tracks use "0" as track 1. That probably
+ should be fixed...
+ */
+ static const char *const format_names[16] = {
+ "TOC",
+ "Session info",
+ "Full TOC",
+ "PMA",
+ "ATIP"
+ "Reserved 5",
+ "Reserved 6",
+ "Reserved 7",
+ "Reserved 8",
+ "Reserved 9",
+ "Reserved 10",
+ "Reserved 11",
+ "Reserved 12",
+ "Reserved 13",
+ "Reserved 14",
+ "Reserved 15"
+ };
+
+ bool msf = (scsi_cmdbuf[1] & 0x2) != 0;
+ u16 size = (scsi_cmdbuf[7] << 7) | scsi_cmdbuf[8];
+ u8 format = scsi_cmdbuf[2] & 15;
+
+ /// SFF8020 legacy format field (see T10/1836-D Revision 2g page 643)
+ if(!format)
+ format = (scsi_cmdbuf[9] >> 6) & 3;
+
+ LOG("command READ TOC PMA ATIP, format %s msf=%d size=%d\n", format_names[format], msf, size);
+
+ int pos = 0;
+ switch (format) {
+ case 0: {
+ int start_track = scsi_cmdbuf[6];
+ int end_track = cdrom_get_last_track(cdrom);
+
+ int tracks;
+ if(start_track == 0)
+ tracks = end_track + 1;
+ else if(start_track <= end_track)
+ tracks = (end_track - start_track) + 2;
+ else if(start_track <= 0xaa)
+ tracks = 1;
+ else
+ tracks = 0;
+
+ int len = 2 + (tracks * 8);
+
+ // the returned TOC DATA LENGTH must be the full amount,
+ // regardless of how much we're able to pass back due to size
+ scsi_cmdbuf[pos++] = (len>>8) & 0xff;
+ scsi_cmdbuf[pos++] = (len & 0xff);
+ scsi_cmdbuf[pos++] = 1;
+ scsi_cmdbuf[pos++] = cdrom_get_last_track(cdrom);
+
+ if (start_track == 0)
+ start_track = 1;
+
+ for(int i = 0; i < tracks; i++) {
+ int track = start_track + i;
+ int cdrom_track = track - 1;
+ if(i == tracks-1) {
+ track = 0xaa;
+ cdrom_track = 0xaa;
+ }
+
+ scsi_cmdbuf[pos++] = 0;
+ scsi_cmdbuf[pos++] = cdrom_get_adr_control(cdrom, cdrom_track);
+ scsi_cmdbuf[pos++] = track;
+ scsi_cmdbuf[pos++] = 0;
+
+ u32 tstart = cdrom_get_track_start(cdrom, cdrom_track);
+
+ if(msf)
+ tstart = to_msf(tstart+150);
+
+ scsi_cmdbuf[pos++] = (tstart>>24) & 0xff;
+ scsi_cmdbuf[pos++] = (tstart>>16) & 0xff;
+ scsi_cmdbuf[pos++] = (tstart>>8) & 0xff;
+ scsi_cmdbuf[pos++] = (tstart & 0xff);
+ }
+ break;
+ }
+
+ case 1: {
+ int len = 2 + (8 * 1);
+
+ scsi_cmdbuf[pos++] = (len>>8) & 0xff;
+ scsi_cmdbuf[pos++] = (len & 0xff);
+ scsi_cmdbuf[pos++] = 1;
+ scsi_cmdbuf[pos++] = 1;
+
+ scsi_cmdbuf[pos++] = 0;
+ scsi_cmdbuf[pos++] = cdrom_get_adr_control(cdrom, 0);
+ scsi_cmdbuf[pos++] = 1;
+ scsi_cmdbuf[pos++] = 0;
+
+ u32 tstart = cdrom_get_track_start(cdrom, 0);
+
+ if (msf)
+ tstart = to_msf(tstart+150);
+
+ scsi_cmdbuf[pos++] = (tstart>>24) & 0xff;
+ scsi_cmdbuf[pos++] = (tstart>>16) & 0xff;
+ scsi_cmdbuf[pos++] = (tstart>>8) & 0xff;
+ scsi_cmdbuf[pos++] = (tstart & 0xff);
+ break;
+ }
+
+ default:
+ LOG("Unhandled format %d\n", format_names[format]);
+ break;
+ }
+
+ if(pos) {
+ if(pos > size)
+ pos = size;
+
+ scsi_data_in(0, pos);
+ scsi_status_complete(SS_GOOD);
+ } else {
+ // report unit attention condition
+ scsi_status_complete(SS_CHECK_CONDITION);
+ sense(false, SK_ILLEGAL_REQUEST);
+ break;
+ }
+ break;
+ }
+ default:
nscsi_full_device::scsi_command();
break;
}
}
+
+enum sgi_scsi_command_e : uint8_t {
+ /*
+ * The SGI supplied CD-ROM drives (and possibly those from some other vendors)
+ * identify themselves as hard disk drives at poweron, and after SCSI bus resets,
+ * until issued a vendor specific command (0xc9). This is done because older
+ * systems would otherwise be unable to boot and load miniroots from CD, due to
+ * their design (they attempted to protect the user from booting from
+ * "ridiculous" devices, long before CD-ROM drives existed). The SGI drives are
+ * sent a command to "revert" to CD-ROM inquiry information during boot if on
+ * a SCSI bus handled by the PROM, but not all possible buses are handled by all
+ * PROMs; additionally, a SCSI bus reset causes the CD-ROM drives to revert to
+ * the poweron default, and this could happen before the hardware inventory code
+ * in the kernel runs, if there are SCSI problems.
+ */
+ SGI_HD2CDROM = 0xc9,
+};
+
+void nscsi_cdrom_sgi_device::scsi_command()
+{
+ switch (scsi_cmdbuf[0]) {
+ case SGI_HD2CDROM:
+ LOG("command SGI_HD2CDROM");
+ // No need to do anything (yet). Just acknowledge the command.
+ scsi_status_complete(SS_GOOD);
+ break;
+
+ default:
+ nscsi_cdrom_device::scsi_command();
+ break;
+ }
+}
+
+bool nscsi_cdrom_sgi_device::scsi_command_done(uint8_t command, uint8_t length)
+{
+ switch (command) {
+ case SGI_HD2CDROM:
+ return length == 10;
+
+ default:
+ return nscsi_full_device::scsi_command_done(command, length);
+ }
+}
diff --git a/src/devices/machine/nscsi_cd.h b/src/devices/machine/nscsi_cd.h
index f3ce871c70a..48097cea42f 100644
--- a/src/devices/machine/nscsi_cd.h
+++ b/src/devices/machine/nscsi_cd.h
@@ -54,6 +54,17 @@ private:
uint8_t compliance;
void return_no_cd();
+ static int to_msf(int frame);
+};
+
+class nscsi_cdrom_sgi_device : public nscsi_cdrom_device
+{
+public:
+ nscsi_cdrom_sgi_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock = 0);
+
+protected:
+ virtual void scsi_command() override;
+ virtual bool scsi_command_done(uint8_t command, uint8_t length) override;
};
class nscsi_dec_rrd45_device : public nscsi_cdrom_device
@@ -93,6 +104,7 @@ public:
};
DECLARE_DEVICE_TYPE(NSCSI_CDROM, nscsi_cdrom_device)
+DECLARE_DEVICE_TYPE(NSCSI_CDROM_SGI, nscsi_cdrom_sgi_device)
DECLARE_DEVICE_TYPE(NSCSI_RRD45, nscsi_dec_rrd45_device)
DECLARE_DEVICE_TYPE(NSCSI_XM3301, nscsi_toshiba_xm3301_device)
DECLARE_DEVICE_TYPE(NSCSI_XM5301SUN, nscsi_toshiba_xm5301_sun_device)
diff --git a/src/devices/machine/nscsi_hd.cpp b/src/devices/machine/nscsi_hd.cpp
index c83a2c17ef9..6684942c9d6 100644
--- a/src/devices/machine/nscsi_hd.cpp
+++ b/src/devices/machine/nscsi_hd.cpp
@@ -20,7 +20,7 @@ nscsi_harddisk_device::nscsi_harddisk_device(const machine_config &mconfig, cons
}
nscsi_harddisk_device::nscsi_harddisk_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock) :
- nscsi_full_device(mconfig, type, tag, owner, clock), harddisk(nullptr), lba(0), cur_lba(0), blocks(0), bytes_per_sector(0)
+ nscsi_full_device(mconfig, type, tag, owner, clock), image(*this, "image"), harddisk(nullptr), lba(0), cur_lba(0), blocks(0), bytes_per_sector(0)
{
}
@@ -37,8 +37,7 @@ void nscsi_harddisk_device::device_start()
void nscsi_harddisk_device::device_reset()
{
nscsi_full_device::device_reset();
- harddisk_image_device *hd = subdevice<harddisk_image_device>("image");
- harddisk = hd->get_hard_disk_file();
+ harddisk = image->get_hard_disk_file();
if(!harddisk) {
scsi_id = -1;
bytes_per_sector = 0;
@@ -46,18 +45,17 @@ void nscsi_harddisk_device::device_reset()
const hard_disk_info *hdinfo = hard_disk_get_info(harddisk);
bytes_per_sector = hdinfo->sectorbytes;
- chd_file *chd = hd->get_chd_file();
+ chd_file *chd = image->get_chd_file();
if(chd != nullptr)
chd->read_metadata(HARD_DISK_IDENT_METADATA_TAG, 0, m_inquiry_data);
}
cur_lba = -1;
}
-MACHINE_CONFIG_START(nscsi_harddisk_device::device_add_mconfig)
- MCFG_HARDDISK_ADD("image")
- MCFG_HARDDISK_INTERFACE("scsi_hdd")
-MACHINE_CONFIG_END
-
+void nscsi_harddisk_device::device_add_mconfig(machine_config &config)
+{
+ HARDDISK(config, image).set_interface("scsi_hdd");
+}
uint8_t nscsi_harddisk_device::scsi_get_data(int id, int pos)
{
@@ -92,9 +90,9 @@ void nscsi_harddisk_device::scsi_put_data(int id, int pos, uint8_t data)
int offset = pos % bytes_per_sector;
block[offset] = data;
- int clba = lba + pos / bytes_per_sector;
+ cur_lba = lba + pos / bytes_per_sector;
if(offset == bytes_per_sector-1) {
- if(!hard_disk_write(harddisk, clba, block))
+ if(!hard_disk_write(harddisk, cur_lba, block))
LOG("HD WRITE ERROR !\n");
}
}
@@ -168,8 +166,8 @@ void nscsi_harddisk_device::scsi_command()
// Apple HD SC setup utility needs to see this
strcpy((char *)&scsi_cmdbuf[8], " SEAGATE");
- strcpy((char *)&scsi_cmdbuf[15], " ST225N");
- strcpy((char *)&scsi_cmdbuf[31], "1.00");
+ strcpy((char *)&scsi_cmdbuf[16], " ST225N");
+ strcpy((char *)&scsi_cmdbuf[32], "1.00");
scsi_cmdbuf[36] = 0x00; // # of extents high
scsi_cmdbuf[37] = 0x08; // # of extents low
scsi_cmdbuf[38] = 0x00; // group 0 commands 0-1f
@@ -230,8 +228,10 @@ void nscsi_harddisk_device::scsi_command()
int pmax = page == 0x3f ? 0x3e : page;
int pmin = page == 0x3f ? 0x00 : page;
- for(int page=pmax; page >= pmin; page--) {
- switch(page) {
+
+ bool fail = false;
+ for(int p=pmax; p >= pmin; p--) {
+ switch(p) {
case 0x00: // Unit attention parameters page (weird)
scsi_cmdbuf[pos++] = 0x80; // PS, page id
scsi_cmdbuf[pos++] = 0x02; // Page length
@@ -239,6 +239,40 @@ void nscsi_harddisk_device::scsi_command()
scsi_cmdbuf[pos++] = 0x00; // Double meh
break;
+ case 0x01: // read-write error recovery page
+ scsi_cmdbuf[pos++] = 0x01; // !PS, page id
+ scsi_cmdbuf[pos++] = 0x0a; // page length
+ scsi_cmdbuf[pos++] = 0; // various bits
+ scsi_cmdbuf[pos++] = 0; // read retry count
+ scsi_cmdbuf[pos++] = 0; // correction span
+ scsi_cmdbuf[pos++] = 0; // head offset count
+ scsi_cmdbuf[pos++] = 0; // data strobe offset count
+ scsi_cmdbuf[pos++] = 0; // reserved
+ scsi_cmdbuf[pos++] = 0; // write retry count
+ scsi_cmdbuf[pos++] = 0; // reserved
+ scsi_cmdbuf[pos++] = 0; // recovery time limit (msb)
+ scsi_cmdbuf[pos++] = 0; // recovery time limit (lsb)
+ break;
+
+ case 0x02: // disconnect-reconnect page
+ scsi_cmdbuf[pos++] = 0x02; // !PS, page id
+ scsi_cmdbuf[pos++] = 0x0e; // page length
+ scsi_cmdbuf[pos++] = 0; // buffer full ratio
+ scsi_cmdbuf[pos++] = 0; // buffer empty ratio
+ scsi_cmdbuf[pos++] = 0; // bus inactivity limit (msb)
+ scsi_cmdbuf[pos++] = 0; // bus inactivity limit (lsb)
+ scsi_cmdbuf[pos++] = 0; // disconnect time limit (msb)
+ scsi_cmdbuf[pos++] = 0; // disconnect time limit (lsb)
+ scsi_cmdbuf[pos++] = 0; // connect time limit (msb)
+ scsi_cmdbuf[pos++] = 0; // connect time limit (lsb)
+ scsi_cmdbuf[pos++] = 0; // maximum burst size (msb)
+ scsi_cmdbuf[pos++] = 0; // maximum burst size (lsb)
+ scsi_cmdbuf[pos++] = 0; // reserved
+ scsi_cmdbuf[pos++] = 0; // reserved
+ scsi_cmdbuf[pos++] = 0; // reserved
+ scsi_cmdbuf[pos++] = 0; // reserved
+ break;
+
case 0x03: { // Format parameters page
scsi_cmdbuf[pos++] = 0x83; // PS, page id
scsi_cmdbuf[pos++] = 0x16; // Page length
@@ -295,6 +329,21 @@ void nscsi_harddisk_device::scsi_command()
break;
}
+ case 0x08: // caching page
+ scsi_cmdbuf[pos++] = 0x08; // !PS, page id
+ scsi_cmdbuf[pos++] = 0x0a; // page length
+ scsi_cmdbuf[pos++] = 0;
+ scsi_cmdbuf[pos++] = 0;
+ scsi_cmdbuf[pos++] = 0;
+ scsi_cmdbuf[pos++] = 0;
+ scsi_cmdbuf[pos++] = 0;
+ scsi_cmdbuf[pos++] = 0;
+ scsi_cmdbuf[pos++] = 0;
+ scsi_cmdbuf[pos++] = 0;
+ scsi_cmdbuf[pos++] = 0;
+ scsi_cmdbuf[pos++] = 0;
+ break;
+
case 0x30: { // Apple firmware ID page
scsi_cmdbuf[pos++] = 0xb0; // cPS, page id
scsi_cmdbuf[pos++] = 0x16; // Page length
@@ -324,16 +373,25 @@ void nscsi_harddisk_device::scsi_command()
}
default:
- LOG("mode sense page %02x unhandled\n", page);
+ if (page != 0x3f) {
+ LOG("mode sense page %02x unhandled\n", page);
+ fail = true;
+ }
break;
}
}
- scsi_cmdbuf[0] = pos;
- if(pos > size)
- pos = size;
- scsi_data_in(0, pos);
- scsi_status_complete(SS_GOOD);
+ if (!fail) {
+ scsi_cmdbuf[0] = pos;
+ if (pos > size)
+ pos = size;
+
+ scsi_data_in(0, pos);
+ scsi_status_complete(SS_GOOD);
+ } else {
+ scsi_status_complete(SS_CHECK_CONDITION);
+ sense(false, SK_ILLEGAL_REQUEST, SK_ASC_INVALID_FIELD_IN_CDB);
+ }
break;
}
@@ -342,6 +400,48 @@ void nscsi_harddisk_device::scsi_command()
scsi_status_complete(SS_GOOD);
break;
+ case SC_RECIEVE_DIAG_RES: {
+ LOG("command RECIEVE DIAGNOSTICS RESULTS");
+ int size = (scsi_cmdbuf[3] << 8) | scsi_cmdbuf[4];
+ int pos = 0;
+ scsi_cmdbuf[pos++] = 0;
+ scsi_cmdbuf[pos++] = 6;
+ scsi_cmdbuf[pos++] = 0; // ROM is OK
+ scsi_cmdbuf[pos++] = 0; // RAM is OK
+ scsi_cmdbuf[pos++] = 0; // Data buffer is OK
+ scsi_cmdbuf[pos++] = 0; // Interface is OK
+ scsi_cmdbuf[pos++] = 0;
+ if(size > pos)
+ size = pos;
+ scsi_data_in(0, size);
+ scsi_status_complete(SS_GOOD);
+ break;
+ }
+
+ case SC_SEND_DIAGNOSTICS: {
+ LOG("command SEND DIAGNOSTICS");
+ int size = (scsi_cmdbuf[3] << 8) | scsi_cmdbuf[4];
+ if(scsi_cmdbuf[1] & 4) {
+ // Self-test
+ scsi_status_complete(SS_GOOD);
+ break;
+ }
+ int pos = 0;
+ scsi_cmdbuf[pos++] = 0;
+ scsi_cmdbuf[pos++] = 6;
+ scsi_cmdbuf[pos++] = 0; // ROM is OK
+ scsi_cmdbuf[pos++] = 0; // RAM is OK
+ scsi_cmdbuf[pos++] = 0; // Data buffer is OK
+ scsi_cmdbuf[pos++] = 0; // Interface is OK
+ scsi_cmdbuf[pos++] = 0;
+ scsi_cmdbuf[pos++] = 0;
+ if(size > pos)
+ size = pos;
+ scsi_data_in(0, size);
+ scsi_status_complete(SS_GOOD);
+ break;
+ }
+
case SC_READ_CAPACITY: {
LOG("command READ CAPACITY\n");
@@ -403,6 +503,11 @@ void nscsi_harddisk_device::scsi_command()
scsi_status_complete(SS_GOOD);
break;
+ case SC_MODE_SELECT_6:
+ LOG("command MODE SELECT\n");
+ scsi_status_complete(SS_GOOD);
+ break;
+
default:
LOG("command %02x ***UNKNOWN***\n", scsi_cmdbuf[0]);
nscsi_full_device::scsi_command();
diff --git a/src/devices/machine/nscsi_hd.h b/src/devices/machine/nscsi_hd.h
index 19dfe55c0e5..5ddbf3e8519 100644
--- a/src/devices/machine/nscsi_hd.h
+++ b/src/devices/machine/nscsi_hd.h
@@ -6,7 +6,7 @@
#pragma once
#include "machine/nscsi_bus.h"
-#include "harddisk.h"
+#include "imagedev/harddriv.h"
class nscsi_harddisk_device : public nscsi_full_device
{
@@ -24,6 +24,7 @@ protected:
virtual uint8_t scsi_get_data(int id, int pos) override;
virtual void scsi_put_data(int buf, int offset, uint8_t data) override;
+ required_device<harddisk_image_device> image;
uint8_t block[512];
hard_disk_file *harddisk;
int lba, cur_lba, blocks;
diff --git a/src/devices/machine/output_latch.h b/src/devices/machine/output_latch.h
index c915b4c7207..2498be7f63f 100644
--- a/src/devices/machine/output_latch.h
+++ b/src/devices/machine/output_latch.h
@@ -6,36 +6,11 @@
#pragma once
-#define MCFG_OUTPUT_LATCH_BIT0_HANDLER(_devcb) \
- downcast<output_latch_device &>(*device).set_bit_handler<0>(DEVCB_##_devcb);
-
-#define MCFG_OUTPUT_LATCH_BIT1_HANDLER(_devcb) \
- downcast<output_latch_device &>(*device).set_bit_handler<1>(DEVCB_##_devcb);
-
-#define MCFG_OUTPUT_LATCH_BIT2_HANDLER(_devcb) \
- downcast<output_latch_device &>(*device).set_bit_handler<2>(DEVCB_##_devcb);
-
-#define MCFG_OUTPUT_LATCH_BIT3_HANDLER(_devcb) \
- downcast<output_latch_device &>(*device).set_bit_handler<3>(DEVCB_##_devcb);
-
-#define MCFG_OUTPUT_LATCH_BIT4_HANDLER(_devcb) \
- downcast<output_latch_device &>(*device).set_bit_handler<4>(DEVCB_##_devcb);
-
-#define MCFG_OUTPUT_LATCH_BIT5_HANDLER(_devcb) \
- downcast<output_latch_device &>(*device).set_bit_handler<5>(DEVCB_##_devcb);
-
-#define MCFG_OUTPUT_LATCH_BIT6_HANDLER(_devcb) \
- downcast<output_latch_device &>(*device).set_bit_handler<6>(DEVCB_##_devcb);
-
-#define MCFG_OUTPUT_LATCH_BIT7_HANDLER(_devcb) \
- downcast<output_latch_device &>(*device).set_bit_handler<7>(DEVCB_##_devcb);
-
class output_latch_device : public device_t
{
public:
output_latch_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock = 0);
- template <unsigned Bit, class Object> devcb_base &set_bit_handler(Object &&cb) { return m_bit_handlers[Bit].set_callback(std::forward<Object>(cb)); }
template <unsigned Bit> auto bit_handler() { return m_bit_handlers[Bit].bind(); }
void write(uint8_t data);
diff --git a/src/devices/machine/pc_fdc.cpp b/src/devices/machine/pc_fdc.cpp
index 601c4c813c5..8f48da0f505 100644
--- a/src/devices/machine/pc_fdc.cpp
+++ b/src/devices/machine/pc_fdc.cpp
@@ -157,7 +157,7 @@ uint8_t pc_fdc_family_device::do_dir_r()
WRITE8_MEMBER( pc_fdc_xt_device::dor_fifo_w)
{
- fdc->fifo_w(space, 0, data, mem_mask);
+ fdc->fifo_w(data);
dor_w(space, 0, data, mem_mask);
}
diff --git a/src/devices/machine/pc_lpt.cpp b/src/devices/machine/pc_lpt.cpp
index b0f97871e87..0d43fbc6eeb 100644
--- a/src/devices/machine/pc_lpt.cpp
+++ b/src/devices/machine/pc_lpt.cpp
@@ -46,7 +46,8 @@ void pc_lpt_device::device_reset()
m_cent_ctrl_out->write(m_control);
}
-MACHINE_CONFIG_START(pc_lpt_device::device_add_mconfig)
+void pc_lpt_device::device_add_mconfig(machine_config &config)
+{
centronics_device &centronics(CENTRONICS(config, "centronics", centronics_devices, "printer"));
centronics.set_data_input_buffer(m_cent_data_in);
centronics.fault_handler().set(m_cent_status_in, FUNC(input_buffer_device::write_bit3));
@@ -64,7 +65,8 @@ MACHINE_CONFIG_START(pc_lpt_device::device_add_mconfig)
INPUT_BUFFER(config, m_cent_ctrl_in);
INPUT_BUFFER(config, m_cent_status_in);
- MCFG_CENTRONICS_OUTPUT_LATCH_ADD("cent_data_out", "centronics")
+ OUTPUT_LATCH(config, m_cent_data_out);
+ centronics.set_output_latch(*m_cent_data_out);
OUTPUT_LATCH(config, m_cent_ctrl_out);
m_cent_ctrl_out->bit_handler<0>().set("centronics", FUNC(centronics_device::write_strobe));
@@ -72,7 +74,7 @@ MACHINE_CONFIG_START(pc_lpt_device::device_add_mconfig)
m_cent_ctrl_out->bit_handler<2>().set("centronics", FUNC(centronics_device::write_init));
m_cent_ctrl_out->bit_handler<3>().set("centronics", FUNC(centronics_device::write_select_in));
m_cent_ctrl_out->bit_handler<4>().set(FUNC(pc_lpt_device::write_irq_enabled));
-MACHINE_CONFIG_END
+}
READ8_MEMBER( pc_lpt_device::data_r )
diff --git a/src/devices/machine/pckeybrd.h b/src/devices/machine/pckeybrd.h
index 7ee6c5c2c14..42a443226f5 100644
--- a/src/devices/machine/pckeybrd.h
+++ b/src/devices/machine/pckeybrd.h
@@ -20,12 +20,11 @@
class pc_keyboard_device : public device_t
{
public:
- pc_keyboard_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+ pc_keyboard_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock = 0);
DECLARE_READ8_MEMBER(read);
DECLARE_WRITE_LINE_MEMBER(enable);
- template <class Object> devcb_base &set_keypress_callback(Object &&cb) { return m_out_keypress_func.set_callback(std::forward<Object>(cb)); }
auto keypress() { return m_out_keypress_func.bind(); }
enum class KEYBOARD_TYPE
@@ -77,7 +76,13 @@ private:
class at_keyboard_device : public pc_keyboard_device
{
public:
- at_keyboard_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+ at_keyboard_device(const machine_config &mconfig, const char *tag, device_t *owner, KEYBOARD_TYPE type, int default_set)
+ : at_keyboard_device(mconfig, tag, owner, 0)
+ {
+ set_type(type, default_set);
+ }
+
+ at_keyboard_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock = 0);
DECLARE_WRITE8_MEMBER( write );
@@ -114,18 +119,4 @@ INPUT_PORTS_EXTERN( at_keyboard );
DECLARE_DEVICE_TYPE(PC_KEYB, pc_keyboard_device)
DECLARE_DEVICE_TYPE(AT_KEYB, at_keyboard_device)
-#define MCFG_PC_KEYB_ADD(_tag, _cb) \
- MCFG_DEVICE_ADD(_tag, PC_KEYB, 0) \
- downcast<pc_keyboard_device &>(*device).set_keypress_callback(DEVCB_##_cb);
-
-#define MCFG_AT_KEYB_ADD(_tag, _def_set, _cb) \
- MCFG_DEVICE_ADD(_tag, AT_KEYB, 0) \
- downcast<at_keyboard_device &>(*device).set_type(pc_keyboard_device::KEYBOARD_TYPE::AT, _def_set); \
- downcast<pc_keyboard_device &>(*device).set_keypress_callback(DEVCB_##_cb);
-
-#define MCFG_AT_MF2_KEYB_ADD(_tag, _def_set, _cb) \
- MCFG_DEVICE_ADD(_tag, AT_KEYB, 0) \
- downcast<at_keyboard_device &>(*device).set_type(pc_keyboard_device::KEYBOARD_TYPE_MF2, _def_set); \
- downcast<pc_keyboard_device &>(*device).set_keypress_callback(DEVCB_##_cb);
-
#endif // MAME_MACHINE_PCKEYBRD_H
diff --git a/src/devices/machine/pdc.cpp b/src/devices/machine/pdc.cpp
index 99964762548..20b0c627dc5 100644
--- a/src/devices/machine/pdc.cpp
+++ b/src/devices/machine/pdc.cpp
@@ -261,7 +261,7 @@ void pdc_device::device_add_mconfig(machine_config &config)
Z80(config, m_pdccpu, XTAL(10'000'000) / 2);
m_pdccpu->set_addrmap(AS_PROGRAM, &pdc_device::pdc_mem);
m_pdccpu->set_addrmap(AS_IO, &pdc_device::pdc_io);
- //MCFG_QUANTUM_PERFECT_CPU(M6502_TAG)
+ //config.m_perfect_cpu_quantum = subtag(M6502_TAG);
/* Floppy Disk Controller - uPD765a - NEC D765AC-2 */
UPD765A(config, m_fdc, 4'000'000, true, true);
@@ -279,6 +279,7 @@ void pdc_device::device_add_mconfig(machine_config &config)
m_dma8237->out_eop_callback().set(FUNC(pdc_device::i8237_eop_w));
m_dma8237->in_memr_callback().set(FUNC(pdc_device::i8237_dma_mem_r));
m_dma8237->out_memw_callback().set(FUNC(pdc_device::i8237_dma_mem_w));
+ //m_dma8237->out_dack_callback<0>().set(m_fdc, FUNC(upd765a_device::dack_w));
m_dma8237->in_ior_callback<0>().set(FUNC(pdc_device::i8237_fdc_dma_r));
m_dma8237->out_iow_callback<0>().set(FUNC(pdc_device::i8237_fdc_dma_w));
m_dma8237->in_ior_callback<1>().set(FUNC(pdc_device::m68k_dma_r));
diff --git a/src/devices/machine/pic8259.h b/src/devices/machine/pic8259.h
index 0b85efd9ac1..298ef1debea 100644
--- a/src/devices/machine/pic8259.h
+++ b/src/devices/machine/pic8259.h
@@ -31,7 +31,7 @@
class pic8259_device : public device_t
{
public:
- pic8259_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+ pic8259_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock = 0);
auto out_int_callback() { return m_out_int_func.bind(); } // Interrupt request output to CPU or master 8259 (active high)
auto in_sp_callback() { return m_in_sp_func.bind(); } // Slave program select (VCC = master; GND = slave; pin becomes EN output in buffered mode)
@@ -118,7 +118,7 @@ private:
class v5x_icu_device : public pic8259_device
{
public:
- v5x_icu_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+ v5x_icu_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock = 0);
protected:
virtual bool is_x86() const override { return true; }
diff --git a/src/devices/machine/pit8253.cpp b/src/devices/machine/pit8253.cpp
index 6e6f86e5b0e..7d52572ba89 100644
--- a/src/devices/machine/pit8253.cpp
+++ b/src/devices/machine/pit8253.cpp
@@ -74,11 +74,12 @@ fe2010_pit_device::fe2010_pit_device(const machine_config &mconfig, const char *
// device_add_mconfig - add device configuration
//-------------------------------------------------
-MACHINE_CONFIG_START(pit8253_device::device_add_mconfig)
- MCFG_DEVICE_ADD("counter0", PIT_COUNTER, 0)
- MCFG_DEVICE_ADD("counter1", PIT_COUNTER, 0)
- MCFG_DEVICE_ADD("counter2", PIT_COUNTER, 0)
-MACHINE_CONFIG_END
+void pit8253_device::device_add_mconfig(machine_config &config)
+{
+ PIT_COUNTER(config, "counter0", 0);
+ PIT_COUNTER(config, "counter1", 0);
+ PIT_COUNTER(config, "counter2", 0);
+}
//-------------------------------------------------
diff --git a/src/devices/machine/pit8253.h b/src/devices/machine/pit8253.h
index eebee4edbb3..77f0bf552f9 100644
--- a/src/devices/machine/pit8253.h
+++ b/src/devices/machine/pit8253.h
@@ -104,7 +104,7 @@ class pit8253_device : public device_t
public:
// construction/destruction
- pit8253_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+ pit8253_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock = 0);
// configuration helpers
template <unsigned N> void set_clk(double clk) { m_clk[N] = clk; }
@@ -157,7 +157,7 @@ DECLARE_DEVICE_TYPE(PIT8253, pit8253_device)
class pit8254_device : public pit8253_device
{
public:
- pit8254_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+ pit8254_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock = 0);
protected:
virtual void readback_command(uint8_t data) override;
@@ -168,7 +168,7 @@ DECLARE_DEVICE_TYPE(PIT8254, pit8254_device)
class fe2010_pit_device : public pit8253_device
{
public:
- fe2010_pit_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+ fe2010_pit_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock = 0);
};
DECLARE_DEVICE_TYPE(FE2010_PIT, fe2010_pit_device)
diff --git a/src/devices/machine/pla.h b/src/devices/machine/pla.h
index 7e4672b7860..b614a968b36 100644
--- a/src/devices/machine/pla.h
+++ b/src/devices/machine/pla.h
@@ -11,24 +11,6 @@
#pragma once
-///*************************************************************************
-// INTERFACE CONFIGURATION MACROS
-///*************************************************************************
-
-#define MCFG_PLA_ADD(tag, inputs, outputs, terms) \
- MCFG_DEVICE_ADD((tag), PLA, 0) \
- downcast<pla_device &>(*device).set_num_inputs((inputs)); \
- downcast<pla_device &>(*device).set_num_outputs((outputs)); \
- downcast<pla_device &>(*device).set_num_terms((terms));
-
-#define MCFG_PLA_INPUTMASK(mask) \
- downcast<pla_device &>(*device).set_inputmask((mask));
-
-#define MCFG_PLA_FILEFORMAT(format) \
- downcast<pla_device &>(*device).set_format((pla_device::FMT::format));
-
-
-// macros for known (and used) devices
// 82S100, 82S101, PLS100, PLS101
// 16x48x8 PLA, 28-pin:
@@ -48,8 +30,7 @@
F4 13 | | 16 F2
GND 14 |_____________| 15 F3
*/
-#define MCFG_PLS100_ADD(tag) \
- MCFG_DEVICE_ADD((tag), PLS100)
+
///*************************************************************************
// TYPE DEFINITIONS
diff --git a/src/devices/machine/pxa255.cpp b/src/devices/machine/pxa255.cpp
index 0e96fec2b27..5a65f1542ae 100644
--- a/src/devices/machine/pxa255.cpp
+++ b/src/devices/machine/pxa255.cpp
@@ -1222,20 +1222,20 @@ uint32_t pxa255_periphs_device::screen_update(screen_device &screen, bitmap_rgb3
return 0;
}
-MACHINE_CONFIG_START(pxa255_periphs_device::device_add_mconfig)
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(1024, 1024)
- MCFG_SCREEN_VISIBLE_AREA(0, 295, 0, 479)
- MCFG_SCREEN_UPDATE_DEVICE(DEVICE_SELF, pxa255_periphs_device, screen_update)
- MCFG_PALETTE_ADD(m_palette, 256)
+void pxa255_periphs_device::device_add_mconfig(machine_config &config)
+{
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(1024, 1024);
+ screen.set_visarea(0, 295, 0, 479);
+ screen.set_screen_update(FUNC(pxa255_periphs_device::screen_update));
+
+ PALETTE(config, m_palette).set_entries(256);
SPEAKER(config, "lspeaker").front_left();
SPEAKER(config, "rspeaker").front_right();
- MCFG_DEVICE_ADD(m_dmadac[0], DMADAC)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 1.0)
- MCFG_DEVICE_ADD(m_dmadac[1], DMADAC)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 1.0)
-MACHINE_CONFIG_END
+ DMADAC(config, m_dmadac[0]).add_route(ALL_OUTPUTS, "lspeaker", 1.0);
+ DMADAC(config, m_dmadac[1]).add_route(ALL_OUTPUTS, "rspeaker", 1.0);
+}
diff --git a/src/devices/machine/rtc65271.cpp b/src/devices/machine/rtc65271.cpp
index f44cc8255fc..9ccc83997bf 100644
--- a/src/devices/machine/rtc65271.cpp
+++ b/src/devices/machine/rtc65271.cpp
@@ -346,12 +346,12 @@ uint8_t rtc65271_device::read(int xramsel, offs_t offset)
return reply;
}
-READ8_MEMBER( rtc65271_device::rtc_r )
+uint8_t rtc65271_device::rtc_r(offs_t offset)
{
return read(0, offset );
}
-READ8_MEMBER( rtc65271_device::xram_r )
+uint8_t rtc65271_device::xram_r(offs_t offset)
{
return read(1, offset );
}
@@ -436,12 +436,12 @@ void rtc65271_device::write(int xramsel, offs_t offset, uint8_t data)
}
}
-WRITE8_MEMBER( rtc65271_device::rtc_w )
+void rtc65271_device::rtc_w(offs_t offset, uint8_t data)
{
write(0, offset, data );
}
-WRITE8_MEMBER( rtc65271_device::xram_w )
+void rtc65271_device::xram_w(offs_t offset, uint8_t data)
{
write(1, offset, data );
}
diff --git a/src/devices/machine/rtc65271.h b/src/devices/machine/rtc65271.h
index 65ee8233675..1a69b518839 100644
--- a/src/devices/machine/rtc65271.h
+++ b/src/devices/machine/rtc65271.h
@@ -21,10 +21,10 @@ public:
auto interrupt_cb() { return m_interrupt_cb.bind(); }
- DECLARE_READ8_MEMBER( rtc_r );
- DECLARE_READ8_MEMBER( xram_r );
- DECLARE_WRITE8_MEMBER( rtc_w );
- DECLARE_WRITE8_MEMBER( xram_w );
+ uint8_t rtc_r(offs_t offset);
+ uint8_t xram_r(offs_t offset);
+ void rtc_w(offs_t offset, uint8_t data);
+ void xram_w(offs_t offset, uint8_t data);
protected:
// device-level overrides
diff --git a/src/devices/machine/scc2698b.cpp b/src/devices/machine/scc2698b.cpp
index 1f6c537f52d..8a362e26d45 100644
--- a/src/devices/machine/scc2698b.cpp
+++ b/src/devices/machine/scc2698b.cpp
@@ -768,7 +768,8 @@ attotime scc2698b_device::generate_baudrate(int block, int tx, int table_index)
-MACHINE_CONFIG_START(scc2698b_device::device_add_mconfig)
+void scc2698b_device::device_add_mconfig(machine_config &config)
+{
for (required_device<scc2698b_channel> &channel : m_channel)
SCC2698B_CHANNEL(config, channel, 0);
-MACHINE_CONFIG_END
+}
diff --git a/src/devices/machine/scnxx562.cpp b/src/devices/machine/scnxx562.cpp
index 9ccf996782c..c3bfbfacc5d 100644
--- a/src/devices/machine/scnxx562.cpp
+++ b/src/devices/machine/scnxx562.cpp
@@ -126,10 +126,11 @@ DEFINE_DEVICE_TYPE(DUSCC68C562, duscc68c562_device, "duscc68c562", "Philips
//-------------------------------------------------
// device_add_mconfig - add device configuration
//-------------------------------------------------
-MACHINE_CONFIG_START(duscc_device::device_add_mconfig)
- MCFG_DEVICE_ADD(CHANA_TAG, DUSCC_CHANNEL, 0)
- MCFG_DEVICE_ADD(CHANB_TAG, DUSCC_CHANNEL, 0)
-MACHINE_CONFIG_END
+void duscc_device::device_add_mconfig(machine_config &config)
+{
+ DUSCC_CHANNEL(config, CHANA_TAG, 0);
+ DUSCC_CHANNEL(config, CHANB_TAG, 0);
+}
//**************************************************************************
// LIVE DEVICE
diff --git a/src/devices/machine/sis85c496.cpp b/src/devices/machine/sis85c496.cpp
index 186c4894b8d..87b01edf2e6 100644
--- a/src/devices/machine/sis85c496.cpp
+++ b/src/devices/machine/sis85c496.cpp
@@ -45,7 +45,8 @@ void sis85c496_host_device::internal_io_map(address_map &map)
map(0x00e0, 0x00ef).noprw();
}
-MACHINE_CONFIG_START(sis85c496_host_device::device_add_mconfig)
+void sis85c496_host_device::device_add_mconfig(machine_config &config)
+{
PIT8254(config, m_pit8254, 0);
m_pit8254->set_clk<0>(4772720/4); // heartbeat IRQ
m_pit8254->out_handler<0>().set(FUNC(sis85c496_host_device::at_pit8254_out0_changed));
@@ -103,10 +104,10 @@ MACHINE_CONFIG_START(sis85c496_host_device::device_add_mconfig)
m_keybc->kbd_clk().set("pc_kbdc", FUNC(pc_kbdc_device::clock_write_from_mb));
m_keybc->kbd_data().set("pc_kbdc", FUNC(pc_kbdc_device::data_write_from_mb));
- MCFG_DEVICE_ADD("pc_kbdc", PC_KBDC, 0)
- MCFG_PC_KBDC_OUT_CLOCK_CB(WRITELINE("keybc", at_keyboard_controller_device, kbd_clk_w))
- MCFG_PC_KBDC_OUT_DATA_CB(WRITELINE("keybc", at_keyboard_controller_device, kbd_data_w))
- MCFG_PC_KBDC_SLOT_ADD("pc_kbdc", "kbd", pc_at_keyboards, STR_KBD_MICROSOFT_NATURAL)
+ PC_KBDC(config, m_pc_kbdc, 0);
+ m_pc_kbdc->out_clock_cb().set("keybc", FUNC(at_keyboard_controller_device::kbd_clk_w));
+ m_pc_kbdc->out_data_cb().set("keybc", FUNC(at_keyboard_controller_device::kbd_data_w));
+ PC_KBDC_SLOT(config, "kbd", pc_at_keyboards, STR_KBD_MICROSOFT_NATURAL).set_pc_kbdc_slot(subdevice("pc_kbdc"));
DS12885(config, m_ds12885);
m_ds12885->irq().set(m_pic8259_slave, FUNC(pic8259_device::ir0_w));
@@ -115,7 +116,7 @@ MACHINE_CONFIG_START(sis85c496_host_device::device_add_mconfig)
/* sound hardware */
SPEAKER(config, "mono").front_center();
SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.50);
-MACHINE_CONFIG_END
+}
sis85c496_host_device::sis85c496_host_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
@@ -492,6 +493,8 @@ WRITE_LINE_MEMBER( sis85c496_host_device::at_dma8237_out_eop )
void sis85c496_host_device::pc_select_dma_channel(int channel, bool state)
{
+ //m_isabus->dack_line_w(channel, state);
+
if(!state) {
m_dma_channel = channel;
//if(m_cur_eop)
@@ -541,19 +544,19 @@ WRITE8_MEMBER( sis85c496_host_device::at_portb_w )
READ8_MEMBER( sis85c496_host_device::at_dma8237_2_r )
{
- return m_dma8237_2->read( space, offset / 2);
+ return m_dma8237_2->read( offset / 2);
}
WRITE8_MEMBER( sis85c496_host_device::at_dma8237_2_w )
{
- m_dma8237_2->write( space, offset / 2, data);
+ m_dma8237_2->write( offset / 2, data);
}
READ8_MEMBER( sis85c496_host_device::at_keybc_r )
{
switch (offset)
{
- case 0: return m_keybc->data_r(space, 0);
+ case 0: return m_keybc->data_r();
case 1: return at_portb_r(space, 0);
}
@@ -564,7 +567,7 @@ WRITE8_MEMBER( sis85c496_host_device::at_keybc_w )
{
switch (offset)
{
- case 0: m_keybc->data_w(space, 0, data); break;
+ case 0: m_keybc->data_w(data); break;
case 1: at_portb_w(space, 0, data); break;
}
}
@@ -575,10 +578,10 @@ WRITE8_MEMBER( sis85c496_host_device::write_rtc )
if (offset==0) {
m_nmi_enabled = BIT(data,7);
//m_isabus->set_nmi_state((m_nmi_enabled==0) && (m_channel_check==0));
- m_ds12885->write(space,0,data);
+ m_ds12885->write(0,data);
}
else {
- m_ds12885->write(space,offset,data);
+ m_ds12885->write(offset,data);
}
}
diff --git a/src/devices/machine/smc91c9x.cpp b/src/devices/machine/smc91c9x.cpp
index e081c2c6a17..359a69eefdb 100644
--- a/src/devices/machine/smc91c9x.cpp
+++ b/src/devices/machine/smc91c9x.cpp
@@ -4,92 +4,29 @@
SMC91C9X ethernet controller implementation
- by Aaron Giles, Jean-François DEL NERO
+ by Aaron Giles, Ted Green
-***************************************************************************
-
- Notes:
- * Connected mode working
-
-**************************************************************************/
+***************************************************************************/
#include "emu.h"
#include "smc91c9x.h"
-// Needed for netdev_count???
-#include "osdnet.h"
-
+#include <sstream>
+#include <iomanip>
/***************************************************************************
DEBUGGING
***************************************************************************/
-//#define VERBOSE 1
+#define LOG_GENERAL (1U << 0)
+#define LOG_PACKETS (1U << 1)
+#define LOG_TX (1U << 2)
+#define LOG_RX (1U << 3)
+#define LOG_FILTER (1U << 4)
+//#define VERBOSE (LOG_GENERAL | LOG_PACKETS | LOG_TX | LOG_RX | LOG_FILTER)
#include "logmacro.h"
#define DISPLAY_STATS (0)
-
-
-/***************************************************************************
- CONSTANTS
-***************************************************************************/
-
-/* Ethernet registers - bank 0 */
-#define EREG_TCR (0*8 + 0)
-#define EREG_EPH_STATUS (0*8 + 1)
-#define EREG_RCR (0*8 + 2)
-#define EREG_COUNTER (0*8 + 3)
-#define EREG_MIR (0*8 + 4)
-#define EREG_MCR (0*8 + 5)
-#define EREG_BANK (0*8 + 7)
-
-/* Ethernet registers - bank 1 */
-#define EREG_CONFIG (1*8 + 0)
-#define EREG_BASE (1*8 + 1)
-#define EREG_IA0_1 (1*8 + 2)
-#define EREG_IA2_3 (1*8 + 3)
-#define EREG_IA4_5 (1*8 + 4)
-#define EREG_GENERAL_PURP (1*8 + 5)
-#define EREG_CONTROL (1*8 + 6)
-
-/* Ethernet registers - bank 2 */
-#define EREG_MMU_COMMAND (2*8 + 0)
-#define EREG_PNR_ARR (2*8 + 1)
-#define EREG_FIFO_PORTS (2*8 + 2)
-#define EREG_POINTER (2*8 + 3)
-#define EREG_DATA_0 (2*8 + 4)
-#define EREG_DATA_1 (2*8 + 5)
-#define EREG_INTERRUPT (2*8 + 6)
-
-/* Ethernet registers - bank 3 */
-#define EREG_MT0_1 (3*8 + 0)
-#define EREG_MT2_3 (3*8 + 1)
-#define EREG_MT4_5 (3*8 + 2)
-#define EREG_MT6_7 (3*8 + 3)
-#define EREG_MGMT (3*8 + 4)
-#define EREG_REVISION (3*8 + 5)
-#define EREG_ERCV (3*8 + 6)
-
-/* Ethernet MMU commands */
-#define ECMD_NOP 0
-#define ECMD_ALLOCATE 2
-#define ECMD_RESET_MMU 4
-#define ECMD_REMOVE_TOPFRAME_RX 6
-#define ECMD_REMOVE_TOPFRAME_TX 7
-#define ECMD_REMOVE_RELEASE_TOPFRAME_RX 8
-#define ECMD_RELEASE_PACKET 10
-#define ECMD_ENQUEUE_PACKET 12
-#define ECMD_RESET_FIFOS 14
-
-/* Ethernet interrupt bits */
-#define EINT_RCV 0x01
-#define EINT_TX 0x02
-#define EINT_TX_EMPTY 0x04
-#define EINT_ALLOC 0x08
-#define EINT_RX_OVRN 0x10
-#define EINT_EPH 0x20
-#define EINT_ERCV 0x40
-
/* Ethernet register names */
static const char *const ethernet_regname[64] =
{
@@ -107,73 +44,93 @@ static const char *const ethernet_regname[64] =
DEVICE INTERFACE
***************************************************************************/
-smc91c9x_device::smc91c9x_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock)
+DEFINE_DEVICE_TYPE(SMC91C94, smc91c94_device, "smc91c94", "SMC91C94 Ethernet Controller")
+
+smc91c94_device::smc91c94_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+ : smc91c9x_device(mconfig, SMC91C94, tag, owner, clock, dev_type::SMC91C94)
+{
+ m_num_ebuf = 18;
+}
+
+DEFINE_DEVICE_TYPE(SMC91C96, smc91c96_device, "smc91c96", "SMC91C96 Ethernet Controller")
+
+smc91c96_device::smc91c96_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+ : smc91c9x_device(mconfig, SMC91C96, tag, owner, clock, dev_type::SMC91C96)
+{
+ m_num_ebuf = 24;
+}
+
+smc91c9x_device::smc91c9x_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock, dev_type device_type)
: device_t(mconfig, type, tag, owner, clock)
, device_network_interface(mconfig, *this, 10.0f)
+ , m_device_type(device_type)
+ , m_num_ebuf(16)
, m_irq_handler(*this)
, m_link_unconnected(false)
{
}
+const u8 smc91c9x_device::ETH_BROADCAST[] = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff };
+const u8 smc91c9x_device::WMS_OUI[] = { 0x00, 0xA0, 0xAF };
+
//-------------------------------------------------
// device_start - device-specific startup
//-------------------------------------------------
void smc91c9x_device::device_start()
{
+ // Allocate main buffer
+ m_buffer = std::make_unique<u8[]>(ETHER_BUFFER_SIZE * m_num_ebuf);
+
// TX timer
- m_tx_timer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(smc91c9x_device::send_frame), this));
+ m_tx_poll = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(smc91c9x_device::tx_poll), this));
m_irq_handler.resolve_safe();
+ // These registers don't get cleared on reset
+ m_reg[B1_CONFIG] = 0x0030; m_regmask[B1_CONFIG] = 0x17c6;
+ m_reg[B1_BASE] = 0x1866; m_regmask[B1_BASE] = 0xfffe;
+
+ m_reg[B1_IA0_1] = 0x0000; m_regmask[B1_IA0_1] = 0xffff;
+ m_reg[B1_IA2_3] = 0x0000; m_regmask[B1_IA2_3] = 0xffff;
+ m_reg[B1_IA4_5] = 0x0000; m_regmask[B1_IA4_5] = 0xffff;
+
+ // Revision is set based on chip type
+ m_regmask[B3_REVISION] = 0x0000;
+ if (m_device_type == dev_type::SMC91C94)
+ m_reg[B3_REVISION] = 0x3345;
+ else if (m_device_type == dev_type::SMC91C96)
+ m_reg[B3_REVISION] = 0x3346;
+ else
+ fatalerror("device_start: Unknown device type\n");
+
/* register ide states */
save_item(NAME(m_reg));
save_item(NAME(m_regmask));
save_item(NAME(m_irq_state));
- save_item(NAME(m_buffer));
+ save_pointer(NAME(m_buffer), ETHER_BUFFER_SIZE * m_num_ebuf);
save_item(NAME(m_sent));
save_item(NAME(m_recd));
save_item(NAME(m_alloc_rx));
save_item(NAME(m_alloc_tx));
- // Save vector data for proper save state restoration
- save_item(NAME(m_comp_rx_data));
- save_item(NAME(m_comp_tx_data));
- save_item(NAME(m_trans_tx_data));
- // Save vector sizes for proper save state restoration
- save_item(NAME(m_comp_tx_size));
- save_item(NAME(m_comp_rx_size));
- save_item(NAME(m_trans_tx_size));
-}
-
-// Save state presave to save vector sizes
-void smc91c9x_device::device_pre_save()
-{
- m_comp_tx_size = m_comp_tx.size();
- m_comp_rx_size = m_comp_rx.size();
- m_trans_tx_size = m_trans_tx.size();
- memcpy(m_comp_rx_data, m_comp_rx.data(), m_comp_rx_size * sizeof(u32));
- memcpy(m_comp_tx_data, m_comp_tx.data(), m_comp_tx_size * sizeof(u32));
- memcpy(m_trans_tx_data, m_trans_tx.data(), m_trans_tx_size * sizeof(u32));
-
- //osd_printf_info("Save: comp_tx: %d comp_rx: %d trans_tx: %d\n", m_comp_tx_size, m_comp_rx_size, m_trans_tx_size);
- //if (m_comp_tx_size)
- // osd_printf_info("comp_tx packet: %d\n", m_comp_tx.front());
+ save_item(NAME(m_tx_active));
+ save_item(NAME(m_rx_active));
+ save_item(NAME(m_tx_retry_count));
+ save_item(NAME(m_rx_hash));
+ save_item(NAME(m_loopback_result));
+
+ // Circular FIFOs
+ save_item(NAME(m_queued_tx));
+ save_item(NAME(m_queued_tx_h));
+ save_item(NAME(m_queued_tx_t));
+ save_item(NAME(m_completed_tx));
+ save_item(NAME(m_completed_tx_h));
+ save_item(NAME(m_completed_tx_t));
+ save_item(NAME(m_completed_rx));
+ save_item(NAME(m_completed_rx_h));
+ save_item(NAME(m_completed_rx_t));
}
-// Save state preload to restore vector sizes
-void smc91c9x_device::device_post_load()
-{
- m_comp_tx.resize(m_comp_tx_size);
- m_comp_rx.resize(m_comp_rx_size);
- m_trans_tx.resize(m_trans_tx_size);
- memcpy(m_comp_rx.data(), m_comp_rx_data, m_comp_rx_size * sizeof(u32));
- memcpy(m_comp_tx.data(), m_comp_tx_data, m_comp_tx_size * sizeof(u32));
- memcpy(m_trans_tx.data(), m_trans_tx_data, m_trans_tx_size * sizeof(u32));
-
- //osd_printf_info("Restore: comp_tx: %d comp_rx: %d trans_tx: %d\n", m_comp_tx_size, m_comp_rx_size, m_trans_tx_size);
- //if (m_comp_tx_size)
- // osd_printf_info("comp_tx size: %lu comp_tx packet: %d array_data: %d\n", m_comp_tx.size(), m_comp_tx.front(), m_comp_tx_data[0]);
-}
//-------------------------------------------------
// device_reset - device-specific reset
@@ -181,75 +138,43 @@ void smc91c9x_device::device_post_load()
void smc91c9x_device::device_reset()
{
- std::fill(std::begin(m_reg), std::end(m_reg), 0);
-
- std::fill(std::begin(m_regmask), std::end(m_regmask), 0);
-
m_irq_state = 0;
m_sent = 0;
m_recd = 0;
- m_reg[EREG_TCR] = 0x0000; m_regmask[EREG_TCR] = 0x3d87;
- m_reg[EREG_EPH_STATUS] = 0x0000; m_regmask[EREG_EPH_STATUS] = 0x0000;
- m_reg[EREG_RCR] = 0x0000; m_regmask[EREG_RCR] = 0xc307;
- m_reg[EREG_COUNTER] = 0x0000; m_regmask[EREG_COUNTER] = 0x0000;
- m_reg[EREG_MIR] = 0x1212; m_regmask[EREG_MIR] = 0x0000;
- m_reg[EREG_MCR] = 0x3300; m_regmask[EREG_MCR] = 0x00ff;
- m_reg[EREG_BANK] = 0x3300; m_regmask[EREG_BANK] = 0x0007;
-
- m_reg[EREG_CONFIG] = 0x0030; m_regmask[EREG_CONFIG] = 0x17c6;
- m_reg[EREG_BASE] = 0x1866; m_regmask[EREG_BASE] = 0xfffe;
-
- // Default MAC
- m_reg[EREG_IA0_1] = 0x1300; m_regmask[EREG_IA0_1] = 0xffff;
- m_reg[EREG_IA2_3] = 0x12F7; m_regmask[EREG_IA2_3] = 0xffff;
- m_reg[EREG_IA4_5] = 0x5634; m_regmask[EREG_IA4_5] = 0xffff;
-
- m_reg[EREG_GENERAL_PURP] = 0x0000; m_regmask[EREG_GENERAL_PURP] = 0xffff;
- m_reg[EREG_CONTROL] = 0x0100; m_regmask[EREG_CONTROL] = 0x68e7;
-
- m_reg[EREG_MMU_COMMAND] = 0x0000; m_regmask[EREG_MMU_COMMAND] = 0x00e7;
- m_reg[EREG_PNR_ARR] = 0x8000; m_regmask[EREG_PNR_ARR] = 0x00ff;
- m_reg[EREG_FIFO_PORTS] = 0x8080; m_regmask[EREG_FIFO_PORTS] = 0x0000;
- m_reg[EREG_POINTER] = 0x0000; m_regmask[EREG_POINTER] = 0xf7ff;
- m_reg[EREG_DATA_0] = 0x0000; m_regmask[EREG_DATA_0] = 0xffff;
- m_reg[EREG_DATA_1] = 0x0000; m_regmask[EREG_DATA_1] = 0xffff;
- m_reg[EREG_INTERRUPT] = 0x0004; m_regmask[EREG_INTERRUPT] = 0x7f00;
-
- m_reg[EREG_MT0_1] = 0x0000; m_regmask[EREG_MT0_1] = 0xffff;
- m_reg[EREG_MT2_3] = 0x0000; m_regmask[EREG_MT2_3] = 0xffff;
- m_reg[EREG_MT4_5] = 0x0000; m_regmask[EREG_MT4_5] = 0xffff;
- m_reg[EREG_MT6_7] = 0x0000; m_regmask[EREG_MT6_7] = 0xffff;
- m_reg[EREG_MGMT] = 0x3030; m_regmask[EREG_MGMT] = 0x0f0f;
- // TODO: Revision should be set based on chip type
- m_reg[EREG_REVISION] = 0x3345; m_regmask[EREG_REVISION] = 0x0000;
- m_reg[EREG_ERCV] = 0x331f; m_regmask[EREG_ERCV] = 0x009f;
+ m_tx_active = 0;
+ m_rx_active = 0;
+ m_tx_retry_count = 0;
+
+ m_reg[B0_TCR] = 0x0000; m_regmask[B0_TCR] = 0x3d87;
+ m_reg[B0_EPH_STATUS] = 0x0000; m_regmask[B0_EPH_STATUS] = 0x0000;
+ m_reg[B0_RCR] = 0x0000; m_regmask[B0_RCR] = 0xc307;
+ m_reg[B0_COUNTER] = 0x0000; m_regmask[B0_COUNTER] = 0x0000;
+ m_reg[B0_MIR] = 0x1212; m_regmask[B0_MIR] = 0x0000;
+ m_reg[B0_MCR] = 0x3300; m_regmask[B0_MCR] = 0x00ff;
+ m_reg[B0_BANK] = 0x3300; m_regmask[B0_BANK] = 0x0007;
+
+ m_reg[B1_GENERAL_PURP] = 0x0000; m_regmask[B1_GENERAL_PURP] = 0xffff;
+ m_reg[B1_CONTROL] = 0x0100; m_regmask[B1_CONTROL] = 0x68e7;
+
+ m_reg[B2_MMU_COMMAND] = 0x0000; m_regmask[B2_MMU_COMMAND] = 0x00e7;
+ m_reg[B2_PNR_ARR] = 0x8000; m_regmask[B2_PNR_ARR] = 0x00ff;
+ m_reg[B2_FIFO_PORTS] = 0x8080; m_regmask[B2_FIFO_PORTS] = 0x0000;
+ m_reg[B2_POINTER] = 0x0000; m_regmask[B2_POINTER] = 0xf7ff;
+ m_reg[B2_DATA_0] = 0x0000; m_regmask[B2_DATA_0] = 0xffff;
+ m_reg[B2_DATA_1] = 0x0000; m_regmask[B2_DATA_1] = 0xffff;
+ m_reg[B2_INTERRUPT] = 0x0004; m_regmask[B2_INTERRUPT] = 0x7f00;
+
+ m_reg[B3_MT0_1] = 0x0000; m_regmask[B3_MT0_1] = 0xffff;
+ m_reg[B3_MT2_3] = 0x0000; m_regmask[B3_MT2_3] = 0xffff;
+ m_reg[B3_MT4_5] = 0x0000; m_regmask[B3_MT4_5] = 0xffff;
+ m_reg[B3_MT6_7] = 0x0000; m_regmask[B3_MT6_7] = 0xffff;
+ m_reg[B3_MGMT] = 0x3030; m_regmask[B3_MGMT] = 0x0f0f;
+
+ m_reg[B3_ERCV] = 0x331f; m_regmask[B3_ERCV] = 0x009f;
update_ethernet_irq();
- m_tx_timer->reset();
-
- // Setup real network if enabled
- m_network_available = false;
- if (netdev_count()) {
- m_network_available = true;
- osd_list_network_adapters();
- unsigned char const *const mac = (const unsigned char *)get_mac();
- if (VERBOSE & LOG_GENERAL)
- {
- logerror("MAC : ");
- for (int i = 0; i < ETHERNET_ADDR_SIZE; i++)
- logerror("%.2X", mac[i]);
-
- logerror("\n");
- }
-
- set_promisc(true);
- // Interface MAC
- m_reg[EREG_IA0_1] = mac[0] | (mac[1] << 8);
- m_reg[EREG_IA2_3] = mac[2] | (mac[3] << 8);
- m_reg[EREG_IA4_5] = mac[4] | (mac[5] << 8);
- }
// Reset MMU
mmu_reset();
@@ -261,39 +186,36 @@ void smc91c9x_device::mmu_reset()
m_alloc_rx = 0;
m_alloc_tx = 0;
- // Flush fifos.
- clear_tx_fifo();
- clear_rx_fifo();
+ // Reset fifos.
+ reset_tx_fifos();
+ reset_completed_rx();
update_ethernet_irq();
}
-DEFINE_DEVICE_TYPE(SMC91C94, smc91c94_device, "smc91c94", "SMC91C94 Ethernet Controller")
-
-smc91c94_device::smc91c94_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
- : smc91c9x_device(mconfig, SMC91C94, tag, owner, clock)
-{
-}
-
-DEFINE_DEVICE_TYPE(SMC91C96, smc91c96_device, "smc91c96", "SMC91C96 Ethernet Controller")
-
-smc91c96_device::smc91c96_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
- : smc91c9x_device(mconfig, SMC91C96, tag, owner, clock)
+void smc91c9x_device::reset_tx_fifos()
{
+ // Disable transmit timer
+ m_tx_poll->enable(false);
+ // Reset transmit queue
+ reset_queued_tx();
+ // Reset completion FIFOs
+ reset_completed_tx();
}
bool smc91c9x_device::alloc_req(const int tx, int &packet_num)
{
u32 curr_alloc = m_alloc_rx | m_alloc_tx;
- for (int index = 0; index < ETHER_BUFFERS; index++) {
- if (!(curr_alloc & (1 << index))) {
+ for (int index = 0; index < m_num_ebuf; index++)
+ {
+ if (!(curr_alloc & (1 << index)))
+ {
packet_num = index;
- if (tx) {
+ if (tx)
m_alloc_tx |= 1 << index;
- } else {
+ else
m_alloc_rx |= 1 << index;
- }
return true;
}
}
@@ -304,7 +226,8 @@ bool smc91c9x_device::alloc_req(const int tx, int &packet_num)
void smc91c9x_device::alloc_release(const int packet_num)
{
int clear_mask = ~(1 << packet_num);
- if (!((m_alloc_tx | m_alloc_rx) & (1 << packet_num))) {
+ if (!((m_alloc_tx | m_alloc_rx) & (1 << packet_num)))
+ {
logerror("alloc_release: Trying to release a non-allocated packet. packet_num: %02x alloc_tx: %04x alloc_rx: %04x\n",
packet_num, m_alloc_tx, m_alloc_rx);
}
@@ -312,338 +235,448 @@ void smc91c9x_device::alloc_release(const int packet_num)
m_alloc_rx &= clear_mask;
}
-void smc91c9x_device::clear_tx_fifo()
-{
- // Clear transmit timer
- m_tx_timer->reset();
- // Reset transmit queue
- m_trans_tx.clear();
- // Reset completion FIFOs
- m_comp_tx.clear();
-}
+/***************************************************************************
+ INTERNAL HELPERS
+***************************************************************************/
-void smc91c9x_device::clear_rx_fifo()
-{
- // Clear recieve FIFO
- m_comp_rx.clear();
-}
+/*-------------------------------------------------
+ update_ethernet_irq - update the IRQ state
+-------------------------------------------------*/
-int smc91c9x_device::is_broadcast(const uint8_t *mac_address)
+void smc91c9x_device::update_ethernet_irq()
{
- int i;
+ // Check tx completion fifo empty
+ if (empty_completed_tx())
+ m_reg[B2_INTERRUPT] &= ~EINT_TX;
+ else
+ m_reg[B2_INTERRUPT] |= EINT_TX;
+
+ // Check rx completion fifo empty
+ if (empty_completed_rx())
+ m_reg[B2_INTERRUPT] &= ~EINT_RCV;
+ else
+ m_reg[B2_INTERRUPT] |= EINT_RCV;
+
+ uint8_t const mask = m_reg[B2_INTERRUPT] >> 8;
+ uint8_t const state = m_reg[B2_INTERRUPT] & 0xff;
- i = 0;
- while(mac_address[i] == 0xFF)
+ /* update the IRQ state */
+ uint8_t new_state = mask & state;
+ if (m_irq_state ^ new_state)
{
- i++;
+ LOG("update_ethernet_irq: old: %02x new: %02x\n", m_irq_state, new_state);
+ m_irq_state = new_state;
+ m_irq_handler(m_irq_state ? ASSERT_LINE : CLEAR_LINE);
}
+}
- if ( i == 6 )
- return 1;
- return 0;
+/*-------------------------------------------------
+ update_stats - draw statistics
+-------------------------------------------------*/
+
+void smc91c9x_device::update_stats()
+{
+ if ( DISPLAY_STATS )
+ popmessage("Sent:%d Rec'd:%d", m_sent, m_recd);
}
+/*-------------------------------------------------
+dump_bytes - Print packet bytes
+-------------------------------------------------*/
-int smc91c9x_device::ethernet_packet_is_for_me(const uint8_t *mac_address)
+void smc91c9x_device::dump_bytes(u8 *buf, int length)
{
- // tcpdump -i eth0 -q ether host 08:00:1e:01:ae:a5 or ether broadcast or ether dst 09:00:1e:00:00:00 or ether dst 09:00:1e:00:00:01
- // wireshark filter: eth.addr eq 08:00:1e:01:ae:a5 or eth.dst eq ff:ff:ff:ff:ff:ff or eth.dst eq 09:00:1e:00:00:00 or eth.dst eq 09:00:1e:00:00:01
-
- int i;
+ if (VERBOSE & LOG_PACKETS)
+ {
+ std::stringstream ss_bytes;
+ ss_bytes << std::hex << std::setfill('0');
+ for (int i = 0; i < length; i++)
+ {
+ ss_bytes << std::setw(2) << (int) buf[i];
+ // Send newline every 16 bytes and at the end
+ if ((i & 0xf) == 0xf || i == length - 1)
+ {
+ LOGMASKED(LOG_PACKETS, "%s\n", ss_bytes.str());
+ ss_bytes.str("");
+ }
+ else
+ ss_bytes << " ";
+ }
+ }
+}
- LOG("\n");
+/*-------------------------------------------------
+address_filter - Filter the received packet
+-------------------------------------------------*/
- if (VERBOSE & LOG_GENERAL)
+int smc91c9x_device::address_filter(u8 *buf)
+{
+ if (m_reg[B0_RCR] & PRMS)
+ {
+ // TODO: 91C94 doesn't receive it's own transmisson when not in full duplex
+ LOGMASKED(LOG_FILTER, "address_filter accepted (promiscuous mode)\n");
+ return ADDR_UNICAST;
+ }
+ else if (buf[0] & 1)
{
- for ( i = 0 ; i < ETHERNET_ADDR_SIZE ; i++ )
+ // broadcast
+ if (!memcmp(ETH_BROADCAST, buf, 6))
{
- logerror("%.2X", ((u8 *)&m_reg[EREG_IA0_1])[i]);
+ LOGMASKED(LOG_FILTER, "address_filter accepted (broadcast) %02x-%02x-%02x-%02x-%02x-%02x\n",
+ buf[0], buf[1], buf[2], buf[3], buf[4], buf[5]);
+
+ return ADDR_BROADCAST;
}
- logerror("=");
- for ( i = 0 ; i < ETHERNET_ADDR_SIZE ; i++ )
+
+ // multicast
+ /*
+ * Multicast address matching is performed by computing the fcs crc of
+ * the destination address, and then using the upper 6 bits as an index
+ * into the 64-bit logical address filter.
+ */
+ // Check for all multicast bit
+ if (m_reg[B0_RCR] & ALMUL)
+ return ADDR_MULTICAST;
+
+ u32 const crc = util::crc32_creator::simple(buf, 6);
+ // The hash is based on the top 6 MSBs of the CRC
+ // The CRC needs to be inverted and reflected
+ m_rx_hash = 0x0;
+ for (int i = 0; i < 6; i++)
+ m_rx_hash |= (((~crc) >> i) & 1) << (5 - i);
+ u64 multicast_addr = *(u64*)&m_reg[B3_MT0_1];
+ if (BIT(multicast_addr, m_rx_hash))
{
- logerror("%.2X",mac_address[i]);
+ LOGMASKED(LOG_FILTER, "address_filter accepted (multicast address match) %02x-%02x-%02x-%02x-%02x-%02x\n",
+ buf[0], buf[1], buf[2], buf[3], buf[4], buf[5]);
+
+ return ADDR_MULTICAST;
}
- logerror("?");
+ LOGMASKED(LOG_FILTER, "address_filter rejected multicast %02x-%02x-%02x-%02x-%02x-%02x crc: %08x hash: %02x multi: %16ullx\n",
+ buf[0], buf[1], buf[2], buf[3], buf[4], buf[5], crc, m_rx_hash, *(u64*)&m_reg[B3_MT0_1]);
}
-
- // skip Ethernet broadcast packets if RECV_BROAD is not set
- if (is_broadcast(mac_address))
+ else
{
- LOG(" -- Broadcast rx\n");
- return 2;
- }
+ // unicast
+ if (!memcmp(&m_reg[B1_IA0_1], buf, 6))
+ {
+ LOGMASKED(LOG_FILTER, "address_filter accepted (physical address match)\n");
- if (memcmp(mac_address, &m_reg[EREG_IA0_1], ETHERNET_ADDR_SIZE) == 0)
- {
- LOG(" -- Address Match\n");
- return 1;
+ return ADDR_UNICAST;
+ }
}
-
- LOG(" -- Not Matching\n");
-
- return 0;
+ return ADDR_NOMATCH;
}
-/***************************************************************************
- recv_cb - receive callback - receive and process an ethernet packet
- ***************************************************************************/
+/*-------------------------------------------------
+recv_start_cb - Start receiving packet
+ A return value of 0 will stop rx processing in dinetwork device
+ Any other value will be sent to the recv_complete_cb
+-------------------------------------------------*/
-void smc91c9x_device::recv_cb(uint8_t *data, int length)
+int smc91c9x_device::recv_start_cb(u8 *buf, int length)
{
- LOG("recv_cb : %d/0x%x\n",length,length);
+ // check internal loopback
+ if (m_reg[B0_TCR] & (EPH_LOOP | LOOP))
+ {
+ LOGMASKED(LOG_RX, "receive internal loopback mode, external packet discarded\n");
- int const isforme = ethernet_packet_is_for_me( data );
+ return 0;
+ }
- if (isforme==1 && (length >= ETHERNET_ADDR_SIZE) && (VERBOSE & LOG_GENERAL))
+ // discard bad length packets
+ if (length < 64 || length > 256*6 - 6)
{
- logerror("RX: ");
- for (int i = 0; i < ETHERNET_ADDR_SIZE; i++)
- logerror("%.2X", data[i]);
+ LOGMASKED(LOG_RX, "received bad length packet length %d discarded\n", length);
- logerror(" ");
+ return 0;
+ }
- for (int i = 0; i < length-ETHERNET_ADDR_SIZE; i++)
- logerror("%.2X", data[ETHERNET_ADDR_SIZE + i]);
+ // discard packets not from WMS
+ if (memcmp(WMS_OUI, &buf[6], 3))
+ {
+ LOGMASKED(LOG_RX, "received non-WMS packet OUI: %02x:%02x:%02x length %d discarded\n", buf[6], buf[7], buf[8], length);
- logerror(" - IsForMe %d - %d/0x%x bytes\n", isforme, length, length);
+ return 0;
}
- if ( (length < ETHERNET_ADDR_SIZE || !isforme) && !(m_reg[EREG_RCR] & 0x0102) )
+ // Check for active transmission
+ if (m_tx_active)
{
- LOG("\n");
+ // TODO: Update collision counters
+ LOGMASKED(LOG_RX, "transmit active COLLISION, rx packet length %d discarded\n", length);
+
+ return 0;
- // skip packet
- return;
}
- /* signal a receive */
+ return receive(buf, length);
+}
+
+/*-------------------------------------------------
+receive - Receive data into buffer
+ Returns the buffer packet number + 1 if successful
+-------------------------------------------------*/
+
+int smc91c9x_device::receive(u8 *buf, int length)
+{
+ // check receiver enabled
+ if (!(m_reg[B0_RCR] & RXEN))
+ {
+ LOGMASKED(LOG_RX, "receive disabled, external packet discarded\n");
+
+ return -1;
+ }
+
+ // address filter
+ int filter = address_filter(buf);
+ if (filter == ADDR_NOMATCH)
+ return -1;
+
+ LOGMASKED(LOG_RX, "receive packet length %d\n", length);
+ dump_bytes(buf, length);
// Try to request a packet number
int packet_num;
- if (!alloc_req(0, packet_num)) {
- logerror("recv_cb: Couldn't allocate a receive packet\n");
- return;
+ if (!alloc_req(0, packet_num))
+ {
+ logerror("recv_cb: Couldn't allocate memory for receive packet\n");
+ return -2;
}
- /* compute the packet length */
+ m_rx_active = 1;
- if ( ( length < ( ETHER_BUFFER_SIZE - ( 2+2+2 ) ) ) )
- {
- uint8_t *const packet = &m_buffer[ packet_num * ETHER_BUFFER_SIZE];
+ // build up the packet
+ uint8_t *const packet = &m_buffer[packet_num * ETHER_BUFFER_SIZE];
- int dst = 0;
+ // Strip CRC
+ if (m_reg[B0_RCR] & STRIP_CRC)
+ length -= 4;
- // build up the packet
+ // Copy received payload
+ memcpy(&packet[4], buf, length);
- // Status word
- packet[dst++] = 0x00;
+ // Status word
+ u16 *rx_status = (u16*)&packet[0];
+ *rx_status = 0x0000;
- // set the broadcast flag
- if ( isforme == 2 )
- packet[dst++] |= 0x40;
- else
- packet[dst++] = 0x00;
+ // set the broadcast flag
+ if (filter == ADDR_BROADCAST)
+ *rx_status |= BRODCAST;
- //bytes count
- packet[dst++] = 0x00;
- packet[dst++] = 0x00;
+ // set the multicast flag and hash
+ if (filter == ADDR_MULTICAST)
+ {
+ *rx_status |= (m_rx_hash << 1) | MULTCAST;
+ }
- memcpy(&packet[dst], data, length );
- dst += length;
+ // Calculate buffer length and set control byte
+ u16 buf_length;
- if ( dst & 1 )
- {
- // ODD Frame
- packet[dst++] = 0x40 | 0x20; // Control
- }
- else
- {
- packet[dst++] = 0x00; // Pad
- packet[dst++] = 0x40 | 0x00; // Control
- }
+ if (length & 1)
+ {
+ // ODD Frame
+ *rx_status |= ODDFRM;
+ packet[length + 4] = EBUF_RX_ALWAYS | EBUF_ODD; // Control
+ buf_length = length + 5;
+ }
+ else
+ {
+ packet[length + 4] = 0x00; // Pad
+ packet[length + 5] = EBUF_RX_ALWAYS; // Control
+ buf_length = length + 6;
+ }
- //dst += 2;
+ // Set buffer length word
+ *(u16*)&packet[2] = buf_length;
- dst &= 0x7FF;
+ return packet_num + 1;
+}
- packet[2] = (dst&0xFF);
- packet[3] = (dst) >> 8;
+/*-------------------------------------------------
+recv_complete_cb - End of receive
+-------------------------------------------------*/
+void smc91c9x_device::recv_complete_cb(int result)
+{
+ if (result > 0)
+ {
// Push packet number to rx completion fifo
- m_comp_rx.push_back(packet_num);
+ push_completed_rx(result - 1);
}
- else
+ // Couldn't allocate memory
+ else if (result == -2)
{
- LOG("Rejected ! Fifo Full ?");
+ m_reg[B2_INTERRUPT] |= EINT_ALLOC;
}
update_ethernet_irq();
- LOG("\n");
+ m_rx_active = 0;
}
-/***************************************************************************
- INTERNAL HELPERS
-***************************************************************************/
-
/*-------------------------------------------------
- update_ethernet_irq - update the IRQ state
+ tx_poll - Starts transmit
-------------------------------------------------*/
-void smc91c9x_device::update_ethernet_irq()
+TIMER_CALLBACK_MEMBER(smc91c9x_device::tx_poll)
{
- // Check tx completion fifo empty
- if (m_comp_tx.empty())
- m_reg[EREG_INTERRUPT] &= ~EINT_TX;
- else
- m_reg[EREG_INTERRUPT] |= EINT_TX;
-
- // Check rx completion fifo empty
- if (m_comp_rx.empty())
- m_reg[EREG_INTERRUPT] &= ~EINT_RCV;
- else
- m_reg[EREG_INTERRUPT] |= EINT_RCV;
+ // Check for active RX and delay if necessary
+ if (m_rx_active)
+ {
+ // TODO: Implement correct CSMA/CD algorithm
+ m_tx_poll->adjust(attotime::from_usec(40));
+ m_tx_retry_count++;
+ LOGMASKED(LOG_TX, "tx_poll: Delaying TX due to active RX retry_count = %d\n", m_tx_retry_count);
+ }
+ // Check if TX is enabled and packet is queued
+ else if ((m_reg[B0_TCR] & TXENA) && !empty_queued_tx())
+ {
+ // Reset retry count
+ m_tx_retry_count = 0;
- uint8_t const mask = m_reg[EREG_INTERRUPT] >> 8;
- uint8_t const state = m_reg[EREG_INTERRUPT] & 0xff;
+ // Get the packet number from the transmit fifo
+ const int packet_num = curr_queued_tx();
+ uint8_t *const tx_buffer = &m_buffer[packet_num * ETHER_BUFFER_SIZE];
+ // Get the length and control fields from buffer
+ u16 length = (*(u16*)&tx_buffer[2]) & 0x7ff;
+ const u8 control = tx_buffer[length - 1];
- /* update the IRQ state */
- uint8_t new_state = mask & state;
- if (m_irq_state ^ new_state)
- {
- LOG("update_ethernet_irq: old: %02x new: %02x\n", m_irq_state, new_state);
- m_irq_state = new_state;
- m_irq_handler(m_irq_state ? ASSERT_LINE : CLEAR_LINE);
- }
-}
+ // Remove [pad], control
+ if (control & EBUF_ODD)
+ length -= 1;
+ else
+ length -= 2;
+ // Add padding up to CRC area
+ // take into account status & length removal (-4) and crc addtion (+4)
+ while (length < 64 + 4 - 4 && (m_reg[B0_TCR] & PAD_EN))
+ tx_buffer[length++] = 0x00;
-/*-------------------------------------------------
- update_stats - draw statistics
--------------------------------------------------*/
+ // Add CRC
+ // TODO: Calculate CRC
+ if (1 && ((control & EBUF_CRC) || !(m_reg[B0_TCR] & NOCRC)))
+ {
+ tx_buffer[length++] = 0x11;
+ tx_buffer[length++] = 0x22;
+ tx_buffer[length++] = 0x33;
+ tx_buffer[length++] = 0x44;
+ }
-void smc91c9x_device::update_stats()
-{
- if ( DISPLAY_STATS )
- popmessage("Sent:%d Rec'd:%d", m_sent, m_recd);
-}
+ // Remove status, length
+ length -= 4;
+ // Reset the EPH register */
+ m_reg[B0_EPH_STATUS] &= LINK_OK;
-/*-------------------------------------------------
- send_frame - push a frame to the interface
--------------------------------------------------*/
+ // Send the frame
+ m_tx_active = 1;
+ m_tx_poll->enable(false);
-TIMER_CALLBACK_MEMBER(smc91c9x_device::send_frame)
-{
- // Get the packet number from the transmit fifo
- const int packet_num = m_trans_tx.front();
- uint8_t *const tx_buffer = &m_buffer[packet_num * ETHER_BUFFER_SIZE];
+ LOGMASKED(LOG_TX, "Start sending packet %d length = %d time: %s\n", packet_num, length, machine().scheduler().time().as_string());
+ dump_bytes(&tx_buffer[4], length);
- // Pop the transmit fifo
- m_trans_tx.erase(m_trans_tx.begin());
+ // Write loopback data and save result
+ if (m_reg[B0_TCR] & (EPH_LOOP | LOOP | FDUPLX))
+ m_loopback_result = receive(&tx_buffer[4], length);
+ else
+ m_loopback_result = 0;
- /* update the EPH register */
- m_reg[EREG_EPH_STATUS] = 0x0001;
+ // Local loopback isn't sent to cable
+ //if ((m_reg[B0_TCR] & (EPH_LOOP | LOOP) || (get_interface() < 0 && (m_reg[B0_TCR] & FDUPLX))))
+ if (m_reg[B0_TCR] & (EPH_LOOP | LOOP))
+ send_complete_cb(length);
+ else
+ send(&tx_buffer[4], length);
- if (is_broadcast(&tx_buffer[4]))
- m_reg[EREG_EPH_STATUS] |= 0x0040;
+ }
+}
- // Check tx completion fifo empty
- if (m_trans_tx.empty())
- m_reg[EREG_INTERRUPT] |= EINT_TX_EMPTY;
+/*-------------------------------------------------
+send_complete_cb - Called after transmit complete
+-------------------------------------------------*/
+void smc91c9x_device::send_complete_cb(int result)
+{
m_sent++;
-
update_stats();
- int buffer_len = ((tx_buffer[3] << 8) | tx_buffer[2]) & 0x7ff;
- // Remove status, length, [pad], control
- if (tx_buffer[buffer_len - 1] & 0x20)
- buffer_len -= 5;
- else
- buffer_len -= 6;
- // Add padding
- if (buffer_len < 64 && (m_reg[EREG_TCR] & 0x0080)) {
- while (buffer_len < 64)
- tx_buffer[4 + buffer_len++] = 0x00;
- }
- if (VERBOSE & LOG_GENERAL)
- {
- logerror("TX: ");
- for (int i = 0; i < ETHERNET_ADDR_SIZE; i++)
- logerror("%.2X", tx_buffer[4 + i]);
+ // Pop the packet number from the transmit fifo
+ const int packet_num = pop_queued_tx();
+ uint8_t *const tx_buffer = &m_buffer[packet_num * ETHER_BUFFER_SIZE];
- logerror(" ");
+ LOGMASKED(LOG_TX, "End sending packet %d result = %d time: %s\n", packet_num, result, machine().scheduler().time().as_string());
- for (int i = ETHERNET_ADDR_SIZE; i < buffer_len; i++)
- logerror("%.2X", tx_buffer[4 + i]);
+ /* update the EPH register */
+ m_reg[B0_EPH_STATUS] |= TX_SUC;
- logerror("--- %d/0x%x bytes\n", buffer_len, buffer_len);
+ // Set LINK_OK in status
+ if (0 && !(m_reg[B0_EPH_STATUS] & LINK_OK))
+ {
+ m_reg[B0_EPH_STATUS] |= LINK_OK;
+ // Set a ethernet phy status interrupt
+ m_reg[B2_INTERRUPT] |= EINT_EPH;
}
- if (buffer_len > 4)
- {
- if (m_link_unconnected)
- {
- // Set lost carrier
- if (m_reg[EREG_TCR] & 0x0400)
- {
- m_reg[EREG_EPH_STATUS] |= 0x400;
- // Clear Tx Enable on error
- m_reg[EREG_TCR] &= ~0x1;
- }
+ // Set Tx broadcast flag
+ if (!memcmp(ETH_BROADCAST, &tx_buffer[4], 6))
+ m_reg[B0_EPH_STATUS] |= LTX_BRD;
- // Set signal quality error
- if (m_reg[EREG_TCR] & 0x1000)
- {
- m_reg[EREG_EPH_STATUS] |= 0x20;
- // Clear Tx Enable on error
- m_reg[EREG_TCR] &= ~0x1;
- }
+ // Check tx queued fifo empty
+ if (empty_queued_tx())
+ m_reg[B2_INTERRUPT] |= EINT_TX_EMPTY;
- // Set a ethernet phy status interrupt
- m_reg[EREG_INTERRUPT] |= EINT_EPH;
+ // Set no-transmission flags
+ if (m_link_unconnected)
+ {
+ //m_reg[B0_EPH_STATUS] &= ~LINK_OK;
+ //m_reg[B0_EPH_STATUS] &= ~TX_SUC;
- // TODO: Is it necessary to clear FIFOs on error?
- // Flush fifos.
- //clear_tx_fifo();
- //clear_rx_fifo();
- }
- else
+ // Set lost carrier
+ if (m_reg[B0_TCR] & MON_CSN)
{
- // Send the frame
- if (!send(&tx_buffer[4], buffer_len))
- {
- // FIXME: failed to send the Ethernet packet
- //logerror("failed to send Ethernet packet\n");
- //LOG(this,("read_command_port(): !!! failed to send Ethernet packet"));
- }
+ m_reg[B0_EPH_STATUS] |= LOST_CARR;
+ // Clear Tx Enable on error
+ m_reg[B0_TCR] &= ~TXENA;
+ }
- // Loopback if loopback is set or fduplx is set
- // TODO: Figure out correct size
- // TODO: Check for addtional filter options for FDUPLX mode
- if ((m_reg[EREG_TCR] & 0x2002) || (m_network_available && (m_reg[EREG_TCR] & 0x0800)))
- recv_cb(&tx_buffer[4], buffer_len);
+ // Set signal quality error
+ if (m_reg[B0_TCR] & STP_SQET)
+ {
+ m_reg[B0_EPH_STATUS] |= SQET;
+ // Clear Tx Enable on error
+ m_reg[B0_TCR] &= ~TXENA;
}
+
+ // Set a ethernet phy status interrupt
+ m_reg[B2_INTERRUPT] |= EINT_EPH;
}
+
// Update status in the transmit word
- tx_buffer[0] = m_reg[EREG_EPH_STATUS];
- tx_buffer[1] = m_reg[EREG_EPH_STATUS] >> 8;
+ *(u16*)&tx_buffer[0] = m_reg[B0_EPH_STATUS];
// Push the packet number onto the tx completion fifo
- m_comp_tx.push_back(packet_num);
+ push_completed_tx(packet_num);
update_ethernet_irq();
- // If there is more packets to transmit then set the tx timer
- if ((m_reg[EREG_TCR] & 0x1) && !m_trans_tx.empty()) {
- // Shortest packet (64 bytes @ 10Mbps = 50us)
- m_tx_timer->adjust(attotime::from_usec(50));
+ // Loopback if loopback is set or fduplx is set
+ if (m_loopback_result)
+ {
+ //int rx_result = receive(&tx_buffer[4], result);
+ recv_complete_cb(m_loopback_result);
}
+
+ // If there is more packets to transmit then start the tx polling
+ if ((m_reg[B0_TCR] & TXENA) && !empty_queued_tx())
+ {
+ m_tx_poll->adjust(attotime::from_usec(10));
+ }
+
+ m_tx_active = 0;
}
/*-------------------------------------------------
@@ -662,53 +695,48 @@ void smc91c9x_device::process_command(uint16_t data)
LOG(" ALLOCATE MEMORY FOR TX (%d)", (data & 7));
{
int packet_num;
- if (alloc_req(1, packet_num)) {
+ if (alloc_req(1, packet_num))
+ {
LOG(" packet_num = %02x\n", (packet_num));
// Set ARR register
- m_reg[EREG_PNR_ARR] &= ~0xff00;
- m_reg[EREG_PNR_ARR] |= packet_num << 8;
- m_reg[EREG_INTERRUPT] |= EINT_ALLOC;
+ m_reg[B2_PNR_ARR] &= ~0xff00;
+ m_reg[B2_PNR_ARR] |= packet_num << 8;
+ m_reg[B2_INTERRUPT] |= EINT_ALLOC;
update_ethernet_irq();
}
- else {
+ else
+ {
logerror("ECMD_ALLOCATE: Couldn't allocate TX memory\n");
}
}
break;
case ECMD_RESET_MMU:
- /*
- 0100
- - RESET MMU TO INITIAL STATE -
- Frees all memory allocations, clears relevant
- interrupts, resets packet FIFO pointers.
- */
-
LOG(" RESET MMU\n");
mmu_reset();
break;
case ECMD_REMOVE_TOPFRAME_TX:
LOG(" REMOVE FRAME FROM TX FIFO\n");
- if (m_comp_tx.empty())
+ if (empty_completed_tx())
logerror("process_command: Trying to remove entry from empty tx completion fifo\n");
else
- m_comp_tx.erase(m_comp_tx.begin());
+ pop_completed_tx();
break;
case ECMD_REMOVE_RELEASE_TOPFRAME_RX:
- LOG(" REMOVE AND RELEASE FRAME FROM RX FIFO (PACK_NUM=%d)\n", m_comp_rx.front());
+ LOG(" REMOVE AND RELEASE FRAME FROM RX FIFO (PACK_NUM=%d)\n", curr_completed_rx());
// Release memory allocation
- alloc_release(m_comp_rx.front());
+ alloc_release(curr_completed_rx());
// Fall through
case ECMD_REMOVE_TOPFRAME_RX:
LOG(" REMOVE FRAME FROM RX FIFO\n");
// remove entry from rx completion queue
- if (m_comp_rx.empty())
+ if (empty_completed_rx())
logerror("process_command: Trying to remove entry from empty rx completion fifo\n");
else
- m_comp_rx.erase(m_comp_rx.begin());
+ pop_completed_rx();
update_ethernet_irq();
m_recd++;
@@ -717,7 +745,7 @@ void smc91c9x_device::process_command(uint16_t data)
case ECMD_RELEASE_PACKET:
{
- const int packet_number = m_reg[EREG_PNR_ARR] & 0xff;
+ const int packet_number = m_reg[B2_PNR_ARR] & 0xff;
alloc_release(packet_number);
LOG(" RELEASE SPECIFIC PACKET %d\n", packet_number);
}
@@ -726,33 +754,31 @@ void smc91c9x_device::process_command(uint16_t data)
case ECMD_ENQUEUE_PACKET:
LOG(" ENQUEUE TX PACKET ");
- if (m_reg[EREG_TCR] & 0x0001) // TX EN ?
+ if (m_reg[B0_TCR] & TXENA)
{
- const int packet_number = m_reg[EREG_PNR_ARR] & 0xff;
+ const int packet_number = m_reg[B2_PNR_ARR] & 0xff;
LOG("(PACKET_NUM=%d)\n", packet_number);
// Push packet number to tx transmit fifo
- m_trans_tx.push_back(packet_number);
- // Calculate transmit time
- //uint8_t *const tx_buffer = &m_buffer[packet_number * ETHER_BUFFER_SIZE];
- //int buffer_len = ((tx_buffer[3] << 8) | tx_buffer[2]) & 0x7ff;
- //buffer_len -= 6;
- //int usec = ((buffer_len * 8) / 10) + 1;
- // Shortest packet (64 bytes @ 10Mbps = 50us)
- m_tx_timer->adjust(attotime::from_usec(50));
+ push_queued_tx(packet_number);
+ // Start timer to send frame if not already transmitting
+ if (!m_tx_active && !m_tx_poll->enabled())
+ {
+ m_tx_poll->adjust(attotime::from_usec(10));
+ LOG("Start polling time: %s\n", machine().scheduler().time().as_string());
+ }
}
break;
case ECMD_RESET_FIFOS:
LOG(" RESET TX FIFOS\n");
// Flush fifos.
- clear_tx_fifo();
+ reset_tx_fifos();
break;
}
// Set Busy (clear on next read)
- m_reg[EREG_MMU_COMMAND] |= 0x0001;
- //LOG("process_command: TxQ: %d TxComp: %d RxComp: %d TxAlloc: %04x RxAlloc: %04x\n",
- // m_trans_tx.size(), m_comp_tx.size(), m_comp_rx.size(), m_alloc_tx, m_alloc_rx);
+ m_reg[B2_MMU_COMMAND] |= 0x0001;
+
}
@@ -771,60 +797,60 @@ READ16_MEMBER( smc91c9x_device::read )
/* determine the effective register */
offset %= 8;
- if ( offset != EREG_BANK )
- offset += 8 * (m_reg[EREG_BANK] & 7);
+ if ( offset != B0_BANK )
+ offset += 8 * (m_reg[B0_BANK] & 7);
result = m_reg[offset];
switch (offset)
{
- case EREG_MMU_COMMAND:
+ case B2_MMU_COMMAND:
// Clear busy
- m_reg[EREG_MMU_COMMAND] &= ~0x0001;
+ m_reg[B2_MMU_COMMAND] &= ~0x0001;
break;
- case EREG_PNR_ARR:
+ case B2_PNR_ARR:
if ( ACCESSING_BITS_8_15 )
{
- m_reg[EREG_INTERRUPT] &= ~EINT_ALLOC;
+ m_reg[B2_INTERRUPT] &= ~EINT_ALLOC;
update_ethernet_irq();
}
break;
- case EREG_FIFO_PORTS:
+ case B2_FIFO_PORTS:
result = 0;
- if (!m_comp_tx.empty())
- result |= m_comp_tx.front();
+ if (!empty_completed_tx())
+ result |= curr_completed_tx();
else
result |= 0x80;
- if (!m_comp_rx.empty())
- result |= m_comp_rx.front() << 8;
+ if (!empty_completed_rx())
+ result |= curr_completed_rx() << 8;
else
result |= 0x80 << 8;
break;
- case EREG_DATA_0: /* data register */
- case EREG_DATA_1: /* data register */
+ case B2_DATA_0: /* data register */
+ case B2_DATA_1: /* data register */
{
uint8_t *buffer;
- int addr = m_reg[EREG_POINTER] & 0x7ff;
+ int addr = m_reg[B2_POINTER] & 0x7ff;
- if ( m_reg[EREG_POINTER] & 0x8000 )
- buffer = &m_buffer[m_comp_rx.front() * ETHER_BUFFER_SIZE];
+ if ( m_reg[B2_POINTER] & 0x8000 )
+ buffer = &m_buffer[curr_completed_rx() * ETHER_BUFFER_SIZE];
else
- buffer = &m_buffer[(m_reg[EREG_PNR_ARR] & 0x1f) * ETHER_BUFFER_SIZE];;
+ buffer = &m_buffer[(m_reg[B2_PNR_ARR] & 0x1f) * ETHER_BUFFER_SIZE];;
result = buffer[addr++];
if ( ACCESSING_BITS_8_15 )
result |= buffer[addr++] << 8;
- if ( m_reg[EREG_POINTER] & 0x4000 )
- m_reg[EREG_POINTER] = (m_reg[EREG_POINTER] & ~0x7ff) | (addr & 0x7ff);
+ if ( m_reg[B2_POINTER] & 0x4000 )
+ m_reg[B2_POINTER] = (m_reg[B2_POINTER] & ~0x7ff) | (addr & 0x7ff);
break;
}
}
- if (offset != EREG_BANK)
+ if (offset != B0_BANK)
LOG("%s:smc91c9x_r(%s) = %04X & %04X\n", machine().describe_context(), ethernet_regname[offset], result, mem_mask);
return result;
}
@@ -838,12 +864,12 @@ WRITE16_MEMBER( smc91c9x_device::write )
{
/* determine the effective register */
offset %= 8;
- if (offset != EREG_BANK)
- offset += 8 * (m_reg[EREG_BANK] & 7);
+ if (offset != B0_BANK)
+ offset += 8 * (m_reg[B0_BANK] & 7);
/* update the data generically */
- if (offset != EREG_BANK && offset < sizeof(m_reg))
+ if (offset != B0_BANK && offset < sizeof(m_reg))
LOG("%s:smc91c9x_w(%s) = [%04X]<-%04X & (%04X & %04X)\n", machine().describe_context(), ethernet_regname[offset], offset, data, mem_mask , m_regmask[offset]);
mem_mask &= m_regmask[offset];
@@ -852,49 +878,62 @@ WRITE16_MEMBER( smc91c9x_device::write )
/* handle it */
switch (offset)
{
- case EREG_TCR: /* transmit control register */
+ case B0_TCR: /* transmit control register */
// Setting Tx Enable clears some status and interrupts
- if ( data & 0x1 ) {
- m_reg[EREG_EPH_STATUS] &= ~0x420;
- m_reg[EREG_INTERRUPT] &= ~EINT_EPH;
- update_ethernet_irq();
+ if ( data & TXENA )
+ {
+ if (m_reg[B0_EPH_STATUS] & (LOST_CARR | SQET | LATCOL | E16COL))
+ {
+ m_reg[B0_EPH_STATUS] &= ~(LOST_CARR | SQET | LATCOL | E16COL);
+ m_reg[B2_INTERRUPT] &= ~EINT_EPH;
+ update_ethernet_irq();
+ }
+ }
+ if (VERBOSE & LOG_GENERAL)
+ {
+ if (data & FDSE) LOG(" FDSE\n");
+ if (data & EPH_LOOP) LOG(" EPH LOOP\n");
+ if (data & STP_SQET) LOG(" STP SQET\n");
+ if (data & FDUPLX) LOG(" FDUPLX\n");
+ if (data & MON_CSN) LOG(" MON_CSN\n");
+ if (data & NOCRC) LOG(" NOCRC\n");
+ if (data & PAD_EN) LOG(" PAD_EN\n");
+ if (data & FORCOL) LOG(" FORCOL\n");
+ if (data & LOOP) LOG(" LOOP\n");
+ if (data & TXENA) LOG(" TXENA\n");
}
-
- if (data & 0x2000) LOG(" EPH LOOP\n");
- if (data & 0x1000) LOG(" STP SQET\n");
- if (data & 0x0800) LOG(" FDUPLX\n");
- if (data & 0x0400) LOG(" MON_CSN\n");
- if (data & 0x0100) LOG(" NOCRC\n");
- if (data & 0x0080) LOG(" PAD_EN\n");
- if (data & 0x0004) LOG(" FORCOL\n");
- if (data & 0x0002) LOG(" LOOP\n");
- if (data & 0x0001) LOG(" TXENA\n");
break;
- case EREG_RCR: /* receive control register */
+ case B0_RCR: /* receive control register */
- if ( data & 0x8000 )
+ if ( data & SOFT_RST)
{
- clear_rx_fifo();
- clear_tx_fifo();
+ reset();
}
- if ( !(data & 0x0100) )
+ if ( !(data & RXEN) )
+ {
+ reset_completed_rx();
+ }
+ if (data & RXEN)
{
- clear_rx_fifo();
+ // Set LINK_OK in status
+ m_reg[B0_EPH_STATUS] |= LINK_OK;
}
- if (data & 0x8000) reset();
- if (data & 0x8000) LOG(" SOFT RST\n");
- if (data & 0x4000) LOG(" FILT_CAR\n");
- if (data & 0x0200) LOG(" STRIP CRC\n");
- if (data & 0x0100) LOG(" RXEN\n");
- if (data & 0x0004) LOG(" ALMUL\n");
- if (data & 0x0002) LOG(" PRMS\n");
- if (data & 0x0001) LOG(" RX_ABORT\n");
+ if (VERBOSE & LOG_GENERAL)
+ {
+ if (data & SOFT_RST) LOG(" SOFT RST\n");
+ if (data & FILT_CAR) LOG(" FILT_CAR\n");
+ if (data & STRIP_CRC) LOG(" STRIP CRC\n");
+ if (data & RXEN) LOG(" RXEN\n");
+ if (data & ALMUL) LOG(" ALMUL\n");
+ if (data & PRMS) LOG(" PRMS\n");
+ if (data & RX_ABORT) LOG(" RX_ABORT\n");
+ }
break;
- case EREG_CONFIG: /* configuration register */
+ case B1_CONFIG: /* configuration register */
if (data & 0x1000) LOG(" NO WAIT\n");
if (data & 0x0400) LOG(" FULL STEP\n");
if (data & 0x0200) LOG(" SET SQLCH\n");
@@ -905,64 +944,86 @@ WRITE16_MEMBER( smc91c9x_device::write )
if (data & 0x0002) LOG(" INT SEL0\n");
break;
- case EREG_BASE: /* base address register */
+ case B1_BASE: /* base address register */
LOG(" base = $%04X\n", (data & 0xe000) | ((data & 0x1f00) >> 3));
LOG(" romsize = %d\n", ((data & 0xc0) >> 6));
LOG(" romaddr = $%05X\n", ((data & 0x3e) << 13));
break;
- case EREG_CONTROL: /* control register */
- if (data & 0x4000) LOG(" RCV_BAD\n");
- if (data & 0x2000) LOG(" PWRDN\n");
- if (data & 0x0800) LOG(" AUTO RELEASE\n");
- if (data & 0x0080) LOG(" LE ENABLE\n");
- if (data & 0x0040) LOG(" CR ENABLE\n");
- if (data & 0x0020) LOG(" TE ENABLE\n");
- if (data & 0x0004) LOG(" EEPROM SELECT\n");
- if (data & 0x0002) LOG(" RELOAD\n");
- if (data & 0x0001) LOG(" STORE\n");
+ case B1_IA4_5:
+ set_promisc(m_reg[B0_RCR] & PRMS);
+ set_mac((char *)&m_reg[B1_IA0_1]);
+
+ break;
+
+ case B1_CONTROL: /* control register */
+ // Clearing LE_EN clears interrupt from LINK_OK status change
+ if (!(data & LE_ENABLE))
+ {
+ m_reg[B2_INTERRUPT] &= ~EINT_EPH;
+ update_ethernet_irq();
+ }
+ if (0 && (data & LE_ENABLE))
+ {
+ if (m_reg[B0_EPH_STATUS] & LINK_OK)
+ {
+ m_reg[B0_EPH_STATUS] &= ~(LINK_OK);
+ m_reg[B2_INTERRUPT] &= ~EINT_EPH;
+ update_ethernet_irq();
+ }
+ }
+ if (VERBOSE & LOG_GENERAL)
+ {
+ if (data & RCV_BAD) LOG(" RCV_BAD\n");
+ if (data & PWRDN) LOG(" PWRDN\n");
+ if (data & WAKEUP_EN) LOG(" WAKEUP ENABLE\n");
+ if (data & AUTO_RELEASE) LOG(" AUTO RELEASE\n");
+ if (data & LE_ENABLE) LOG(" LE ENABLE\n");
+ if (data & CR_ENABLE) LOG(" CR ENABLE\n");
+ if (data & TE_ENABLE) LOG(" TE ENABLE\n");
+ if (data & EEPROM_SEL) LOG(" EEPROM SELECT\n");
+ if (data & RELOAD) LOG(" RELOAD\n");
+ if (data & STORE) LOG(" STORE\n");
+ }
break;
- case EREG_MMU_COMMAND: /* command register */
+ case B2_MMU_COMMAND: /* command register */
process_command(data);
break;
- case EREG_DATA_0: /* data register */
- case EREG_DATA_1: /* data register */
+ case B2_DATA_0: /* data register */
+ case B2_DATA_1: /* data register */
{
uint8_t *buffer;
- int addr = m_reg[EREG_POINTER] & 0x7ff;
+ int addr = m_reg[B2_POINTER] & PTR;
- if (m_reg[EREG_POINTER] & 0x8000)
- buffer = &m_buffer[m_comp_rx.front() * ETHER_BUFFER_SIZE];
+ if (m_reg[B2_POINTER] & RCV)
+ buffer = &m_buffer[curr_completed_rx() * ETHER_BUFFER_SIZE];
else
- buffer = &m_buffer[(m_reg[EREG_PNR_ARR] & 0x1f) * ETHER_BUFFER_SIZE];;
+ buffer = &m_buffer[(m_reg[B2_PNR_ARR] & 0x1f) * ETHER_BUFFER_SIZE];;
- // TODO: Should be checking if incr is set
buffer[addr++] = data;
if ( ACCESSING_BITS_8_15 )
buffer[addr++] = data >> 8;
- if ( m_reg[EREG_POINTER] & 0x4000 )
- m_reg[EREG_POINTER] = (m_reg[EREG_POINTER] & ~0x7ff) | (addr & 0x7ff);
+ if ( m_reg[B2_POINTER] & AUTO_INCR)
+ m_reg[B2_POINTER] = (m_reg[B2_POINTER] & ~PTR) | (addr & PTR);
break;
}
- case EREG_INTERRUPT:
+ case B2_INTERRUPT:
// Pop tx fifo packet from completion fifo if clear tx int is set
- if (m_reg[EREG_INTERRUPT] & data & EINT_TX) {
- if (m_comp_tx.empty()) {
+ if (m_reg[B2_INTERRUPT] & data & EINT_TX)
+ {
+ if (empty_completed_tx())
logerror("write: Trying to remove an entry from empty tx completion fifo\n");
+ else
+ {
+ LOG("Removing tx completion packet_num = %d\n", curr_completed_tx());
+ pop_completed_tx();
}
- else {
- LOG("Removing tx completion packet_num = %d\n", m_comp_tx.front());
- m_comp_tx.erase(m_comp_tx.begin());
- }
- }
- // Clear TX_EMPTY interrupt if clear tx empty bit is set
- if (m_reg[EREG_INTERRUPT] & data & EINT_TX_EMPTY) {
- m_reg[EREG_INTERRUPT] &= ~EINT_TX_EMPTY;
}
- m_reg[EREG_INTERRUPT] &= ~(data & 0x56);
+ // Clear interrupts
+ m_reg[B2_INTERRUPT] &= ~(data & (EINT_ERCV | EINT_RX_OVRN | EINT_TX_EMPTY | EINT_TX));
update_ethernet_irq();
break;
}
diff --git a/src/devices/machine/smc91c9x.h b/src/devices/machine/smc91c9x.h
index 79fb52fcd0d..b84f6070ef7 100644
--- a/src/devices/machine/smc91c9x.h
+++ b/src/devices/machine/smc91c9x.h
@@ -4,13 +4,15 @@
SMC91C9X ethernet controller implementation
- by Aaron Giles, Jean-François DEL NERO
+ by Aaron Giles, Ted Green
**************************************************************************/
#ifndef MAME_MACHINE_SMC91C9X_H
#define MAME_MACHINE_SMC91C9X_H
+#pragma once
+
/***************************************************************************
TYPE DEFINITIONS
***************************************************************************/
@@ -22,39 +24,206 @@ public:
DECLARE_READ16_MEMBER( read );
DECLARE_WRITE16_MEMBER( write );
- TIMER_CALLBACK_MEMBER(send_frame);
- virtual void recv_cb(uint8_t *data, int length) override;
void set_link_connected(bool connected) { m_link_unconnected = !connected; };
protected:
- smc91c9x_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock);
+ enum class dev_type {
+ SMC91C94,
+ SMC91C96
+ };
+
+ smc91c9x_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock, dev_type device_type);
// device-level overrides
virtual void device_start() override;
virtual void device_reset() override;
- virtual void device_pre_save(void) override;
- virtual void device_post_load(void) override;
+ // device_network_interface overrides
+ virtual void send_complete_cb(int result) override;
+ virtual int recv_start_cb(u8 *buf, int length) override;
+ virtual void recv_complete_cb(int result) override;
-private:
- static constexpr unsigned ETHER_BUFFER_SIZE = 2048;
- // TODO: 96 device is larger
- static constexpr unsigned ETHER_BUFFERS = 16;
- static constexpr unsigned ETHERNET_ADDR_SIZE = 6;
+ void dump_bytes(u8 *buf, int length);
+ int address_filter(u8 *buf);
+ int receive(u8 *buf, int length);
+
+ TIMER_CALLBACK_MEMBER(tx_poll);
- // external network is present
- bool m_network_available;
+ const dev_type m_device_type;
+ unsigned m_num_ebuf;
+
+private:
+ // Ethernet registers - bank 0
+ enum bank0_addr : u8 {
+ B0_TCR = (0 * 8 + 0),
+ B0_EPH_STATUS = (0 * 8 + 1),
+ B0_RCR = (0 * 8 + 2),
+ B0_COUNTER = (0 * 8 + 3),
+ B0_MIR = (0 * 8 + 4),
+ B0_MCR = (0 * 8 + 5),
+ B0_BANK = (0 * 8 + 7)
+ };
+
+ // Ethernet registers - bank 1
+ enum bank1_addr : u8 {
+ B1_CONFIG = (1 * 8 + 0),
+ B1_BASE = (1 * 8 + 1),
+ B1_IA0_1 = (1 * 8 + 2),
+ B1_IA2_3 = (1 * 8 + 3),
+ B1_IA4_5 = (1 * 8 + 4),
+ B1_GENERAL_PURP = (1 * 8 + 5),
+ B1_CONTROL = (1 * 8 + 6)
+ };
+
+ // Ethernet registers - bank 2
+ enum bank2_addr : u8 {
+ B2_MMU_COMMAND = (2 * 8 + 0),
+ B2_PNR_ARR = (2 * 8 + 1),
+ B2_FIFO_PORTS = (2 * 8 + 2),
+ B2_POINTER = (2 * 8 + 3),
+ B2_DATA_0 = (2 * 8 + 4),
+ B2_DATA_1 = (2 * 8 + 5),
+ B2_INTERRUPT = (2 * 8 + 6)
+ };
+
+ // Ethernet registers - bank 3
+ enum bank3_addr : u8 {
+ B3_MT0_1 = (3 * 8 + 0),
+ B3_MT2_3 = (3 * 8 + 1),
+ B3_MT4_5 = (3 * 8 + 2),
+ B3_MT6_7 = (3 * 8 + 3),
+ B3_MGMT = (3 * 8 + 4),
+ B3_REVISION = (3 * 8 + 5),
+ B3_ERCV = (3 * 8 + 6)
+ };
+
+ // Ethernet MMU commands
+ enum mmu_cmd : u8 {
+ ECMD_NOP = 0,
+ ECMD_ALLOCATE = 2,
+ ECMD_RESET_MMU = 4,
+ ECMD_REMOVE_TOPFRAME_RX = 6,
+ ECMD_REMOVE_TOPFRAME_TX = 7,
+ ECMD_REMOVE_RELEASE_TOPFRAME_RX = 8,
+ ECMD_RELEASE_PACKET = 10,
+ ECMD_ENQUEUE_PACKET = 12,
+ ECMD_RESET_FIFOS = 14
+ };
+
+ // Ethernet interrupt bits
+ enum eint_def : u8 {
+ EINT_RCV = 0x01,
+ EINT_TX = 0x02,
+ EINT_TX_EMPTY = 0x04,
+ EINT_ALLOC = 0x08,
+ EINT_RX_OVRN = 0x10,
+ EINT_EPH = 0x20,
+ EINT_ERCV = 0x40, // 91c92 only
+ EINT_TX_IDLE = 0x80 // 91c94 only
+ };
+
+ // Address filter return codes
+ enum addr_filter_def : int {
+ ADDR_NOMATCH = 0,
+ ADDR_UNICAST = 1,
+ ADDR_BROADCAST = 2,
+ ADDR_MULTICAST = 3
+ };
+
+ // Rx/Tx control bits
+ enum control_mask : u8 {
+ EBUF_RX_ALWAYS = 0x40, // Always set on receive buffer control byte
+ EBUF_ODD = 0x20, // Odd number of data payload bytes
+ EBUF_CRC = 0x10 // Tx add CRC
+ };
+
+ // Receive buffer status
+ enum rx_status_mask : u16 {
+ ALGNERR = 0x8000,
+ BRODCAST = 0x4000,
+ BADCRC = 0x2000,
+ ODDFRM = 0x1000,
+ TOOLNG = 0x0800, // Received fram is longer than 1518 bytes on cable
+ TOOSHORT = 0x0400, // Received fram is shorter than 64 bytes on cable
+ HASHVALUE = 0x007e,
+ MULTCAST = 0x0001
+ };
+
+ // EPH Status bits
+ enum eph_mask : u16 {
+ LINK_OK = 0x4000, // State of link integrity test
+ CTR_ROL = 0x1000, // Counter roll Over
+ EXC_DEF = 0x0800, // Excessive deferral
+ LOST_CARR = 0x0400, // Lost carrier sense
+ LATCOL = 0x0200, // Late collisions detected
+ WAKEUP = 0x0100, // Magic packet received
+ TX_DEFER = 0x0080, // Transmit deferred
+ LTX_BRD = 0x0040, // Last transmit frame was a broadcast
+ SQET = 0x0020, // Signal Quality Error Test
+ E16COL = 0x0010, // 16 collisions reached
+ LTX_MULT = 0x0008, // Last transmit frame was a multicast
+ MULCOL = 0x0004, // Multiple collisions detected
+ SNGLCOL = 0x0002, // Single collision detected
+ TX_SUC = 0x0001 // Last transmit frame was successful
+ };
+
+ // CTR register bits
+ enum ctr_mask : u16 {
+ RCV_BAD = 0x4000, // Receive bad CRC packets
+ PWRDN = 0x2000, // Power down ethernet
+ WAKEUP_EN = 0x1000, // Enable magic packet wakeup
+ AUTO_RELEASE = 0x0800, // Release transmit packets on good transmission
+ LE_ENABLE = 0x0080, // Link Error enable
+ CR_ENABLE = 0x0040, // Counter Roll over enable
+ TE_ENABLE = 0x0020, // Transmit Error enable
+ EEPROM_SEL = 0x0004, // EEPROM address
+ RELOAD = 0x0002, // Reload config from EEPROM
+ STORE = 0x0001 // Store config to EEPROM
+ };
+
+ // Transmit Control Register bits
+ enum tcr_mask : u16 {
+ FDSE = 0x8000,
+ EPH_LOOP = 0x2000,
+ STP_SQET = 0x1000,
+ FDUPLX = 0x0800,
+ MON_CSN = 0x0400,
+ NOCRC = 0x0100,
+ PAD_EN = 0x0080,
+ FORCOL = 0x0004,
+ LOOP = 0x0002,
+ TXENA = 0x0001
+ };
+
+ // Receive Control Register bits
+ enum rcr_mask : u16 {
+ SOFT_RST = 0x8000,
+ FILT_CAR = 0x4000,
+ STRIP_CRC = 0x0200,
+ RXEN = 0x0100,
+ ALMUL = 0x0004,
+ PRMS = 0x0002,
+ RX_ABORT = 0x0001
+ };
+
+ // Pointer Register bits
+ enum pointer_mask : u16 {
+ RCV = 0x8000,
+ AUTO_INCR = 0x4000,
+ READ = 0x2000,
+ PTR = 0x07ff
+ };
+
+ static constexpr unsigned ETHER_BUFFER_SIZE = 256 * 6;
+ static const u8 ETH_BROADCAST[];
+ static const u8 WMS_OUI[];
// mmu
+
// The bits in these vectors indicate a packet has been allocated
u32 m_alloc_rx, m_alloc_tx;
- std::vector<u32> m_comp_tx, m_comp_rx;
- // Fifo for allocated (queued) transmit packets
- std::vector<u32> m_trans_tx;
- // Save vector data and sizes for proper save state restoration
- u32 m_comp_tx_data[ETHER_BUFFERS], m_comp_rx_data[ETHER_BUFFERS], m_trans_tx_data[ETHER_BUFFERS];
- u32 m_comp_tx_size, m_comp_rx_size, m_trans_tx_size;
+
// Requests a packet allocation and returns true
// and sets the packet number if successful
bool alloc_req(const int tx, int &packet_num);
@@ -77,23 +246,56 @@ private:
uint8_t m_irq_state;
// Main memory
- uint8_t m_buffer[ETHER_BUFFER_SIZE * ETHER_BUFFERS];
+ std::unique_ptr<u8[]> m_buffer;
/* counters */
uint32_t m_sent;
uint32_t m_recd;
- emu_timer* m_tx_timer;
+ emu_timer* m_tx_poll;
- int ethernet_packet_is_for_me(const uint8_t *mac_address);
- int is_broadcast(const uint8_t *mac_address);
+ int m_tx_active;
+ int m_rx_active;
+ int m_tx_retry_count;
+ u8 m_rx_hash;
+ u8 m_loopback_result;
void update_ethernet_irq();
void update_stats();
void process_command(uint16_t data);
- void clear_tx_fifo();
- void clear_rx_fifo();
+ void reset_tx_fifos();
+
+ // TODO: Make circular fifo a separate device
+ // Simple circular FIFO, power of 2 size, no over/under run checking
+ static constexpr unsigned FIFO_SIZE = 1 << 5;
+
+ // FIFO for allocated (queued) transmit packets
+ u8 m_queued_tx[FIFO_SIZE];
+ int m_queued_tx_h, m_queued_tx_t;
+ void reset_queued_tx() { m_queued_tx_t = m_queued_tx_h = 0; };
+ void push_queued_tx(const u8 &data) { m_queued_tx[m_queued_tx_h++] = data; m_queued_tx_h &= FIFO_SIZE - 1; };
+ u8 pop_queued_tx() { u8 val = m_queued_tx[m_queued_tx_t++]; m_queued_tx_t &= FIFO_SIZE - 1; return val; };
+ bool empty_queued_tx() const { return m_queued_tx_h == m_queued_tx_t; };
+ u8 curr_queued_tx() const { return m_queued_tx[m_queued_tx_t]; };
+
+ // FIFO for completed transmit packets
+ u8 m_completed_tx[FIFO_SIZE];
+ int m_completed_tx_h, m_completed_tx_t;
+ void reset_completed_tx() { m_completed_tx_t = m_completed_tx_h = 0; };
+ void push_completed_tx(const u8 &data) { m_completed_tx[m_completed_tx_h++] = data; m_completed_tx_h &= FIFO_SIZE - 1; };
+ u8 pop_completed_tx() { u8 val = m_completed_tx[m_completed_tx_t++]; m_completed_tx_t &= FIFO_SIZE - 1; return val; };
+ bool empty_completed_tx() const { return m_completed_tx_h == m_completed_tx_t; };
+ u8 curr_completed_tx() const { return m_completed_tx[m_completed_tx_t]; };
+
+ // FIFO for completed receive packets
+ u8 m_completed_rx[FIFO_SIZE];
+ int m_completed_rx_h, m_completed_rx_t;
+ void reset_completed_rx() { m_completed_rx_t = m_completed_rx_h = 0; };
+ void push_completed_rx(const u8 &data) { m_completed_rx[m_completed_rx_h++] = data; m_completed_rx_h &= FIFO_SIZE - 1; };
+ u8 pop_completed_rx() { u8 val = m_completed_rx[m_completed_rx_t++]; m_completed_rx_t &= FIFO_SIZE - 1; return val; };
+ bool empty_completed_rx() const { return m_completed_rx_h == m_completed_rx_t; };
+ u8 curr_completed_rx() const { return m_completed_rx[m_completed_rx_t]; };
};
diff --git a/src/devices/machine/smpc.cpp b/src/devices/machine/smpc.cpp
index 042fc06d590..c62e65e1703 100644
--- a/src/devices/machine/smpc.cpp
+++ b/src/devices/machine/smpc.cpp
@@ -205,7 +205,7 @@ void smpc_hle_device::smpc_regs(address_map &map)
smpc_hle_device::smpc_hle_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
: device_t(mconfig, SMPC_HLE, tag, owner, clock),
device_memory_interface(mconfig, *this),
- m_space_config("regs", ENDIANNESS_LITTLE, 8, 7, 0, address_map_constructor(), address_map_constructor(FUNC(smpc_hle_device::smpc_regs), this)),
+ m_space_config("regs", ENDIANNESS_LITTLE, 8, 7, 0, address_map_constructor(FUNC(smpc_hle_device::smpc_regs), this)),
m_mini_nvram(*this, "smem"),
m_mshres(*this),
m_mshnmi(*this),
diff --git a/src/devices/machine/sonydriv.h b/src/devices/machine/sonydriv.h
index b6e4358eadb..322db3f3342 100644
--- a/src/devices/machine/sonydriv.h
+++ b/src/devices/machine/sonydriv.h
@@ -58,22 +58,4 @@ protected:
// device type definition
DECLARE_DEVICE_TYPE(FLOPPY_SONY, sonydriv_floppy_image_device)
-#define MCFG_LEGACY_FLOPPY_SONY_2_DRIVES_ADD(_config) \
- MCFG_DEVICE_ADD(FLOPPY_0, FLOPPY_SONY, 0) \
- MCFG_LEGACY_FLOPPY_CONFIG(_config) \
- MCFG_DEVICE_ADD(FLOPPY_1, FLOPPY_SONY, 0) \
- MCFG_LEGACY_FLOPPY_CONFIG(_config)
-
-#define MCFG_LEGACY_FLOPPY_SONY_2_DRIVES_ADDITIONAL_ADD(_config) \
- MCFG_DEVICE_ADD(FLOPPY_2, FLOPPY_SONY, 0) \
- MCFG_LEGACY_FLOPPY_CONFIG(_config) \
- MCFG_DEVICE_ADD(FLOPPY_3, FLOPPY_SONY, 0) \
- MCFG_LEGACY_FLOPPY_CONFIG(_config)
-
-#define MCFG_LEGACY_FLOPPY_SONY_2_DRIVES_MODIFY(_config) \
- MCFG_DEVICE_MODIFY(FLOPPY_0) \
- MCFG_LEGACY_FLOPPY_CONFIG(_config) \
- MCFG_DEVICE_MODIFY(FLOPPY_1) \
- MCFG_LEGACY_FLOPPY_CONFIG(_config)
-
#endif // MAME_MACHINE_SONYDRIV_H
diff --git a/src/devices/machine/spg110.cpp b/src/devices/machine/spg110.cpp
new file mode 100644
index 00000000000..9f9256f4b27
--- /dev/null
+++ b/src/devices/machine/spg110.cpp
@@ -0,0 +1,669 @@
+// license:BSD-3-Clause
+// copyright-holders:David Haywood
+/*****************************************************************************
+
+ SunPlus SPG110-series SoC peripheral emulation
+
+ 0032xx looks like it could be the same as 003dxx on spg2xx
+ but the video seems to have differences, and data
+ is fetched from private buffers filled by DMA instead of
+ main space? tile attributes different? palette format different
+
+**********************************************************************/
+
+#include "emu.h"
+#include "spg110.h"
+
+DEFINE_DEVICE_TYPE(SPG110, spg110_device, "spg110", "SPG110 System-on-a-Chip")
+
+spg110_device::spg110_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock)
+ : device_t(mconfig, type, tag, owner, clock)
+ , device_memory_interface(mconfig, *this)
+ , m_space_config("spg110", ENDIANNESS_BIG, 16, 32, 0, address_map_constructor(FUNC(spg110_device::map_video), this))
+ , m_cpu(*this, finder_base::DUMMY_TAG)
+ , m_screen(*this, finder_base::DUMMY_TAG)
+ , m_palette(*this, "palette")
+ , m_gfxdecode(*this, "gfxdecode")
+ , m_palram(*this, "palram")
+ , m_spg_io(*this, "spg_io")
+ , m_porta_out(*this)
+ , m_portb_out(*this)
+ , m_portc_out(*this)
+ , m_porta_in(*this)
+ , m_portb_in(*this)
+ , m_portc_in(*this)
+ , m_adc_in{{*this}, {*this}}
+ , m_chip_sel(*this)
+{
+}
+
+template<spg110_device::flipx_t FlipX>
+void spg110_device::blit(const rectangle &cliprect, uint32_t line, uint32_t xoff, uint32_t yoff, uint32_t attr, uint32_t ctrl, uint32_t bitmap_addr, uint16_t tile)
+{
+ address_space &space = m_cpu->space(AS_PROGRAM);
+
+ int32_t h = 8 << ((attr & PAGE_TILE_HEIGHT_MASK) >> PAGE_TILE_HEIGHT_SHIFT);
+ int32_t w = 8 << ((attr & PAGE_TILE_WIDTH_MASK) >> PAGE_TILE_WIDTH_SHIFT);
+
+ uint32_t yflipmask = attr & TILE_Y_FLIP ? h - 1 : 0;
+
+ uint32_t nc = ((attr & 0x0003) + 1) << 1;
+
+ uint32_t palette_offset = (attr & 0x0f00) >> 4;
+
+ palette_offset >>= nc;
+ palette_offset <<= nc;
+
+ uint32_t bits_per_row = nc * w / 16;
+ uint32_t words_per_tile = bits_per_row * h;
+ uint32_t m = bitmap_addr + words_per_tile * tile + bits_per_row * (line ^ yflipmask);
+ uint32_t bits = 0;
+ uint32_t nbits = 0;
+ uint32_t y = line;
+
+ int yy = (yoff + y) & 0x1ff;
+ if (yy >= 0x01c0)
+ yy -= 0x0200;
+
+ if (yy > 240 || yy < 0)
+ return;
+
+ int y_index = yy * 320;
+
+ for (int32_t x = FlipX ? (w - 1) : 0; FlipX ? x >= 0 : x < w; FlipX ? x-- : x++)
+ {
+ int xx = xoff + x;
+
+ bits <<= nc;
+
+ if (nbits < nc)
+ {
+ uint16_t b = space.read_word(m++ & 0x3fffff);
+ //b = (b << 8) | (b >> 8);
+ bits |= b << (nc - nbits);
+ nbits += 16;
+ }
+ nbits -= nc;
+
+ uint32_t pal = palette_offset + (bits >> 16);
+ bits &= 0xffff;
+
+ xx &= 0x01ff;
+ if (xx >= 0x01c0)
+ xx -= 0x0200;
+
+ if (xx >= 0 && xx < 320)
+ {
+ // TODO, this is completely wrong for this palette system
+ int pix_index = xx + y_index;
+ uint16_t rawpal = m_palram[pal];
+ const pen_t *pens = m_palette->pens();
+ uint32_t paldata = pens[pal];
+
+ if (!(rawpal & 0x8000))
+ {
+ m_screenbuf[pix_index] = paldata;
+ }
+ }
+ }
+}
+
+void spg110_device::blit_page(const rectangle &cliprect, uint32_t scanline, int depth, uint32_t bitmap_addr, uint16_t *regs)
+{
+ uint32_t xscroll = regs[0];
+ uint32_t yscroll = regs[1];
+ uint32_t attr = regs[2];
+ uint32_t ctrl = regs[3];
+ uint32_t tilemap = regs[4];
+ uint32_t palette_map = regs[5];
+ address_space &space2 = this->space(0);
+
+ if (!(ctrl & PAGE_ENABLE_MASK))
+ {
+ return;
+ }
+
+ if (((attr & PAGE_DEPTH_FLAG_MASK) >> PAGE_DEPTH_FLAG_SHIFT) != depth)
+ {
+ return;
+ }
+
+ uint32_t tile_h = 8 << ((attr & PAGE_TILE_HEIGHT_MASK) >> PAGE_TILE_HEIGHT_SHIFT);
+ uint32_t tile_w = 8 << ((attr & PAGE_TILE_WIDTH_MASK) >> PAGE_TILE_WIDTH_SHIFT);
+
+ uint32_t tile_count_x = 512 / tile_w;
+
+ uint32_t bitmap_y = (scanline + yscroll) & 0xff;
+ uint32_t y0 = bitmap_y / tile_h;
+ uint32_t tile_scanline = bitmap_y % tile_h;
+ uint32_t tile_address = tile_count_x * y0;
+
+ for (uint32_t x0 = 0; x0 < tile_count_x; x0++, tile_address++)
+ {
+ uint32_t yy = ((tile_h * y0 - yscroll + 0x10) & 0xff) - 0x10;
+ uint32_t xx = (tile_w * x0 - xscroll) & 0x1ff;
+ uint16_t tile = (ctrl & PAGE_WALLPAPER_MASK) ? space2.read_word(tilemap*2) : space2.read_word((tilemap + tile_address)*2);
+ uint16_t palette = 0;
+
+ if (!tile)
+ continue;
+
+ palette = space2.read_word(palette_map + tile_address / 2);
+ if (x0 & 1)
+ palette = (palette & 0xff00) >> 8;
+ else
+ palette = (palette & 0x00ff);
+
+
+ bool flip_x = 0;//(tileattr & TILE_X_FLIP);
+
+ if (flip_x)
+ blit<FlipXOn>(cliprect, tile_scanline, xx, yy, attr, ctrl, bitmap_addr, tile);
+ else
+ blit<FlipXOff>(cliprect, tile_scanline, xx, yy, attr, ctrl, bitmap_addr, tile);
+
+ }
+}
+
+
+/* correct, 4bpp gfxs */
+static const gfx_layout charlayout =
+{
+ 8,8,
+ RGN_FRAC(1,1),
+ 4,
+ { STEP4(0,1) },
+ { 0*4,1*4,2*4,3*4,4*4,5*4,6*4,7*4 },
+ { STEP8(0,4*8) },
+ 8*8*4
+};
+
+static const gfx_layout charlayout6 =
+{
+ 8,8,
+ RGN_FRAC(1,1),
+ 6,
+ { 0,1,2,3,4,5 },
+ { STEP8(0,6) },
+ { STEP8(0,6*8) },
+ 8*8*6
+};
+
+static const gfx_layout char16layout =
+{
+ 16,16,
+ RGN_FRAC(1,1),
+ 4,
+ { STEP4(0,1) },
+ { 0*4,1*4,2*4,3*4,4*4,5*4,6*4,7*4, 8*4,9*4,10*4,11*4,12*4,13*4,14*4,15*4 },
+ { STEP16(0,4*16) },
+ 16*16*4
+};
+
+static const gfx_layout char32layout =
+{
+ 32,32,
+ RGN_FRAC(1,1),
+ 4,
+ { STEP4(0,1) },
+ { STEP32(0,4) },
+ { STEP32(0,4*32) },
+ 32*32*4
+};
+
+
+
+static GFXDECODE_START( gfx )
+ GFXDECODE_ENTRY( ":maincpu", 0, charlayout, 0, 16 )
+ GFXDECODE_ENTRY( ":maincpu", 0, char16layout, 0, 16 )
+ GFXDECODE_ENTRY( ":maincpu", 0, char32layout, 0, 16 )
+ GFXDECODE_ENTRY( ":maincpu", 0, charlayout6, 0, 16 ) // correct for lots of the tiles inc. startup text
+GFXDECODE_END
+
+void spg110_device::configure_spg_io(spg2xx_io_device* io)
+{
+ io->porta_in().set(FUNC(spg110_device::porta_r));
+ io->portb_in().set(FUNC(spg110_device::portb_r));
+ io->portc_in().set(FUNC(spg110_device::portc_r));
+ io->porta_out().set(FUNC(spg110_device::porta_w));
+ io->portb_out().set(FUNC(spg110_device::portb_w));
+ io->portc_out().set(FUNC(spg110_device::portc_w));
+ io->adc_in<0>().set(FUNC(spg110_device::adc_r<0>));
+ io->adc_in<1>().set(FUNC(spg110_device::adc_r<1>));
+ io->chip_select().set(FUNC(spg110_device::cs_w));
+// io->pal_read_callback().set(FUNC(spg110_device::get_pal_r));
+// io->write_timer_irq_callback().set(FUNC(spg110_device::timerirq_w));
+// io->write_uart_adc_irq_callback().set(FUNC(spg110_device::uartirq_w));
+// io->write_external_irq_callback().set(FUNC(spg110_device::extirq_w));
+// io->write_ffrq_tmr1_irq_callback().set(FUNC(spg110_device::ffreq1_w));
+// io->write_ffrq_tmr2_irq_callback().set(FUNC(spg110_device::ffreq2_w));
+}
+
+void spg110_device::device_add_mconfig(machine_config &config)
+{
+// PALETTE(config, m_palette).set_format(palette_device::xRGB_555, 0x100);
+// PALETTE(config, m_palette).set_format(palette_device::RGB_565, 0x100);
+// PALETTE(config, m_palette).set_format(palette_device::IRGB_4444, 0x100);
+// PALETTE(config, m_palette).set_format(palette_device::RGBI_4444, 0x100);
+// PALETTE(config, m_palette).set_format(palette_device::xRGB_555, 0x100);
+ PALETTE(config, m_palette, palette_device::BLACK, 256);
+
+ GFXDECODE(config, m_gfxdecode, m_palette, gfx);
+
+ SPG24X_IO(config, m_spg_io, DERIVED_CLOCK(1, 1), m_cpu, m_screen);
+ configure_spg_io(m_spg_io);
+
+}
+
+
+device_memory_interface::space_config_vector spg110_device::memory_space_config() const
+{
+ return space_config_vector {
+ std::make_pair(0, &m_space_config)
+ };
+}
+
+spg110_device::spg110_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+ : spg110_device(mconfig, SPG110, tag, owner, clock)
+{
+}
+
+// irq source or similar?
+READ16_MEMBER(spg110_device::spg110_2063_r)
+{
+ // checks for bits 0x20 and 0x08 in the IRQ function (all IRQs point to the same place)
+ return 0x0008;
+}
+
+WRITE16_MEMBER(spg110_device::spg110_2063_w)
+{
+ // writes 0x28, probably clears the IRQ / IRQ sources? 0x63 is the same offset for this in spg2xx but bits used seem to be different
+ m_cpu->set_state_unsynced(UNSP_IRQ0_LINE, CLEAR_LINE);
+}
+
+
+WRITE16_MEMBER(spg110_device::spg110_201c_w) { }
+WRITE16_MEMBER(spg110_device::spg110_2020_w) { }
+WRITE16_MEMBER(spg110_device::spg110_2042_w) { }
+WRITE16_MEMBER(spg110_device::spg110_2031_w) { }
+WRITE16_MEMBER(spg110_device::spg110_2032_w) { }
+WRITE16_MEMBER(spg110_device::spg110_2033_w) { }
+WRITE16_MEMBER(spg110_device::spg110_2034_w) { }
+WRITE16_MEMBER(spg110_device::spg110_2035_w) { }
+WRITE16_MEMBER(spg110_device::spg110_2036_w) { COMBINE_DATA(&m_2036_scroll); }
+WRITE16_MEMBER(spg110_device::spg110_2039_w) { }
+WRITE16_MEMBER(spg110_device::spg110_2037_w) { }
+WRITE16_MEMBER(spg110_device::spg110_203c_w) { }
+WRITE16_MEMBER(spg110_device::spg110_203d_w) { }
+WRITE16_MEMBER(spg110_device::spg110_2045_w) { }
+
+
+WRITE16_MEMBER(spg110_device::spg110_2028_w) { }
+WRITE16_MEMBER(spg110_device::spg110_2029_w) { }
+
+READ16_MEMBER(spg110_device::spg110_2028_r) { return 0x0000; }
+READ16_MEMBER(spg110_device::spg110_2029_r) { return 0x0000; }
+
+
+WRITE16_MEMBER(spg110_device::spg110_2050_w) { }
+WRITE16_MEMBER(spg110_device::spg110_2051_w) { }
+WRITE16_MEMBER(spg110_device::spg110_2052_w) { }
+WRITE16_MEMBER(spg110_device::spg110_2053_w) { }
+WRITE16_MEMBER(spg110_device::spg110_2054_w) { }
+WRITE16_MEMBER(spg110_device::spg110_2055_w) { }
+WRITE16_MEMBER(spg110_device::spg110_2056_w) { }
+WRITE16_MEMBER(spg110_device::spg110_2057_w) { }
+WRITE16_MEMBER(spg110_device::spg110_2058_w) { }
+WRITE16_MEMBER(spg110_device::spg110_2059_w) { }
+WRITE16_MEMBER(spg110_device::spg110_205a_w) { }
+WRITE16_MEMBER(spg110_device::spg110_205b_w) { }
+WRITE16_MEMBER(spg110_device::spg110_205c_w) { }
+WRITE16_MEMBER(spg110_device::spg110_205d_w) { }
+WRITE16_MEMBER(spg110_device::spg110_205e_w) { }
+WRITE16_MEMBER(spg110_device::spg110_205f_w) { }
+
+WRITE16_MEMBER(spg110_device::dma_unk_2061_w) { COMBINE_DATA(&m_dma_unk_2061); }
+WRITE16_MEMBER(spg110_device::dma_dst_step_w) { COMBINE_DATA(&m_dma_dst_step); }
+WRITE16_MEMBER(spg110_device::dma_unk_2067_w) { COMBINE_DATA(&m_dma_unk_2067); }
+WRITE16_MEMBER(spg110_device::dma_src_step_w) { COMBINE_DATA(&m_dma_src_step); }
+
+WRITE16_MEMBER(spg110_device::dma_dst_w) { COMBINE_DATA(&m_dma_dst); }
+WRITE16_MEMBER(spg110_device::dma_src_w) { COMBINE_DATA(&m_dma_src); }
+
+WRITE16_MEMBER(spg110_device::dma_len_trigger_w)
+{
+ int length = data & 0x1fff;
+
+ // this is presumably a counter that underflows to 0x1fff, because that's what the wait loop waits for?
+ logerror("%s: (trigger len) %04x with values (unk) %04x (dststep) %04x (unk) %04x (src step) %04x | (dst) %04x (src) %04x\n", machine().describe_context(), data, m_dma_unk_2061, m_dma_dst_step, m_dma_unk_2067, m_dma_src_step, m_dma_dst, m_dma_src);
+
+ if ((m_dma_unk_2061!=0x0000) || (m_dma_unk_2067 != 0x0000))
+ fatalerror("unknown DMA params are not zero!\n");
+
+ int source = m_dma_src;
+ int dest = m_dma_dst;
+
+ for (int i = 0; i < length; i++)
+ {
+ address_space &mem = m_cpu->space(AS_PROGRAM);
+ uint16_t val = mem.read_word(source);
+
+ this->space(0).write_word(dest * 2, val, 0xffff);
+
+ source+=m_dma_src_step;
+ dest+=m_dma_dst_step;
+ }
+}
+
+READ16_MEMBER(spg110_device::dma_len_status_r)
+{
+ return 0x1fff; // DMA related?
+}
+
+READ16_MEMBER(spg110_device::spg110_2037_r) { return 0x0000; }
+READ16_MEMBER(spg110_device::spg110_2042_r) { return 0x0000; }
+
+
+WRITE16_MEMBER(spg110_device::spg110_3100_w) { }
+WRITE16_MEMBER(spg110_device::spg110_3101_w) { }
+WRITE16_MEMBER(spg110_device::spg110_3102_w) { }
+WRITE16_MEMBER(spg110_device::spg110_3104_w) { }
+WRITE16_MEMBER(spg110_device::spg110_3105_w) { }
+WRITE16_MEMBER(spg110_device::spg110_3106_w) { }
+WRITE16_MEMBER(spg110_device::spg110_3107_w) { }
+WRITE16_MEMBER(spg110_device::spg110_3108_w) { }
+WRITE16_MEMBER(spg110_device::spg110_3109_w) { }
+WRITE16_MEMBER(spg110_device::spg110_310b_w) { }
+WRITE16_MEMBER(spg110_device::spg110_310c_w) { }
+WRITE16_MEMBER(spg110_device::spg110_310d_w) { }
+
+READ16_MEMBER(spg110_device::spg110_310f_r) { return 0x0000; }
+
+READ16_MEMBER(spg110_device::tmap0_regs_r) { return tmap0_regs[offset]; }
+READ16_MEMBER(spg110_device::tmap1_regs_r) { return tmap1_regs[offset]; }
+
+void spg110_device::tilemap_write_regs(int which, uint16_t* regs, int regno, uint16_t data)
+{
+ switch (regno)
+ {
+ case 0x0: // Page X scroll
+ logerror("video_w: Page %d X Scroll = %04x\n", which, data & 0x01ff);
+ regs[regno] = data & 0x01ff;
+ break;
+
+ case 0x1: // Page Y scroll
+ logerror("video_w: Page %d Y Scroll = %04x\n", which, data & 0x00ff);
+ regs[regno] = data & 0x00ff;
+ break;
+
+ case 0x2: // Page Attributes
+ // 'depth' (aka z value) can't be depth here as it is on spg2xx, or the scores in attract will be behind the table, it really seems to be per attribute bit instead
+
+ logerror("video_w: Page %d Attributes = %04x (Depth:%d, Palette:%d, VSize:%d, HSize:%d, FlipY:%d, FlipX:%d, BPP:%d)\n", which, data
+ , (data >> 12) & 3, (data >> 8) & 15, 8 << ((data >> 6) & 3), 8 << ((data >> 4) & 3), BIT(data, 3), BIT(data, 2), 2 * ((data & 3) + 1));
+ regs[regno] = data;
+ break;
+
+ case 0x3: // Page Control
+ logerror("video_w: Page %d Control = %04x (Blend:%d, HiColor:%d, RowScroll:%d, Enable:%d, Wallpaper:%d, RegSet:%d, Bitmap:%d)\n", which, data
+ , BIT(data, 8), BIT(data, 7), BIT(data, 4), BIT(data, 3), BIT(data, 2), BIT(data, 1), BIT(data, 0));
+ regs[regno] = data;
+ break;
+
+ case 0x4: // Page Tile Address
+ logerror("video_w: Page %d Tile Address = %04x\n", which, data);
+ regs[regno] = data;
+ break;
+
+ case 0x5: // Page Attribute Address
+ logerror("video_w: Page %d Attribute Address = %04x\n", which, data);
+ regs[regno] = data;
+ break;
+ }
+}
+
+
+WRITE16_MEMBER(spg110_device::tmap0_regs_w)
+{
+ tilemap_write_regs(0, tmap0_regs,offset,data);
+}
+
+
+WRITE16_MEMBER(spg110_device::tmap1_regs_w)
+{
+ tilemap_write_regs(1, tmap1_regs,offset,data);
+}
+
+void spg110_device::map(address_map &map)
+{
+ map(0x000000, 0x000fff).ram();
+
+
+ // vregs are at 2000?
+ map(0x002010, 0x002015).rw(FUNC(spg110_device::tmap0_regs_r), FUNC(spg110_device::tmap0_regs_w));
+ map(0x002016, 0x00201b).rw(FUNC(spg110_device::tmap1_regs_r), FUNC(spg110_device::tmap1_regs_w));
+
+ map(0x00201c, 0x00201c).w(FUNC(spg110_device::spg110_201c_w));
+
+ map(0x002020, 0x002020).w(FUNC(spg110_device::spg110_2020_w));
+
+ map(0x002028, 0x002028).rw(FUNC(spg110_device::spg110_2028_r), FUNC(spg110_device::spg110_2028_w));
+ map(0x002029, 0x002029).rw(FUNC(spg110_device::spg110_2029_r), FUNC(spg110_device::spg110_2029_w));
+
+ map(0x002031, 0x002031).w(FUNC(spg110_device::spg110_2031_w)); // sometimes 14a?
+ map(0x002032, 0x002032).w(FUNC(spg110_device::spg110_2032_w)); // always 14a?
+ map(0x002033, 0x002033).w(FUNC(spg110_device::spg110_2033_w));
+ map(0x002034, 0x002034).w(FUNC(spg110_device::spg110_2034_w));
+ map(0x002035, 0x002035).w(FUNC(spg110_device::spg110_2035_w));
+ map(0x002036, 0x002036).w(FUNC(spg110_device::spg110_2036_w)); // possible scroll register?
+ map(0x002037, 0x002037).rw(FUNC(spg110_device::spg110_2037_r), FUNC(spg110_device::spg110_2037_w));
+
+ map(0x002039, 0x002039).w(FUNC(spg110_device::spg110_2039_w));
+
+ map(0x00203c, 0x00203c).w(FUNC(spg110_device::spg110_203c_w));
+
+ map(0x00203d, 0x00203d).w(FUNC(spg110_device::spg110_203d_w)); // possible scroll register?
+
+ map(0x002042, 0x002042).rw(FUNC(spg110_device::spg110_2042_r),FUNC(spg110_device::spg110_2042_w));
+
+ map(0x002045, 0x002045).w(FUNC(spg110_device::spg110_2045_w));
+
+ // seems to be 16 entries for.. something?
+ map(0x002050, 0x002050).w(FUNC(spg110_device::spg110_2050_w));
+ map(0x002051, 0x002051).w(FUNC(spg110_device::spg110_2051_w));
+ map(0x002052, 0x002052).w(FUNC(spg110_device::spg110_2052_w));
+ map(0x002053, 0x002053).w(FUNC(spg110_device::spg110_2053_w));
+ map(0x002054, 0x002054).w(FUNC(spg110_device::spg110_2054_w));
+ map(0x002055, 0x002055).w(FUNC(spg110_device::spg110_2055_w));
+ map(0x002056, 0x002056).w(FUNC(spg110_device::spg110_2056_w));
+ map(0x002057, 0x002057).w(FUNC(spg110_device::spg110_2057_w));
+ map(0x002058, 0x002058).w(FUNC(spg110_device::spg110_2058_w));
+ map(0x002059, 0x002059).w(FUNC(spg110_device::spg110_2059_w));
+ map(0x00205a, 0x00205a).w(FUNC(spg110_device::spg110_205a_w));
+ map(0x00205b, 0x00205b).w(FUNC(spg110_device::spg110_205b_w));
+ map(0x00205c, 0x00205c).w(FUNC(spg110_device::spg110_205c_w));
+ map(0x00205d, 0x00205d).w(FUNC(spg110_device::spg110_205d_w));
+ map(0x00205e, 0x00205e).w(FUNC(spg110_device::spg110_205e_w));
+ map(0x00205f, 0x00205f).w(FUNC(spg110_device::spg110_205f_w));
+
+ //map(0x002010, 0x00205f).ram();
+
+ // everything (dma? and interrupt flag?!)
+ map(0x002060, 0x002060).w(FUNC(spg110_device::dma_dst_w));
+ map(0x002061, 0x002061).w(FUNC(spg110_device::dma_unk_2061_w));
+ map(0x002062, 0x002062).rw(FUNC(spg110_device::dma_len_status_r),FUNC(spg110_device::dma_len_trigger_w));
+ map(0x002063, 0x002063).rw(FUNC(spg110_device::spg110_2063_r),FUNC(spg110_device::spg110_2063_w)); // this looks like interrupt stuff and is checked in the irq like an irq source, but why in the middle of what otherwise look like some kind of DMA?
+ map(0x002064, 0x002064).w(FUNC(spg110_device::dma_dst_step_w));
+ map(0x002066, 0x002066).w(FUNC(spg110_device::dma_src_w));
+ map(0x002067, 0x002067).w(FUNC(spg110_device::dma_unk_2067_w));
+ map(0x002068, 0x002068).w(FUNC(spg110_device::dma_src_step_w));
+
+ map(0x002200, 0x0022ff).ram(); // looks like per-pen brightness or similar? strange because palette isn't memory mapped here
+
+ map(0x003000, 0x00307f).ram(); // sound registers? seems to be 8 long entries, only uses up to 0x7f?
+ map(0x003080, 0x0030ff).ram();
+
+ map(0x003100, 0x003100).w(FUNC(spg110_device::spg110_3100_w));
+ map(0x003101, 0x003101).w(FUNC(spg110_device::spg110_3101_w));
+ map(0x003102, 0x003102).w(FUNC(spg110_device::spg110_3102_w));
+
+ map(0x003104, 0x003104).w(FUNC(spg110_device::spg110_3104_w));
+ map(0x003105, 0x003105).w(FUNC(spg110_device::spg110_3105_w));
+ map(0x003106, 0x003106).w(FUNC(spg110_device::spg110_3106_w));
+ map(0x003107, 0x003107).w(FUNC(spg110_device::spg110_3107_w));
+ map(0x003108, 0x003108).w(FUNC(spg110_device::spg110_3108_w));
+ map(0x003109, 0x003109).w(FUNC(spg110_device::spg110_3109_w));
+
+ map(0x00310b, 0x00310b).w(FUNC(spg110_device::spg110_310b_w));
+ map(0x00310c, 0x00310c).w(FUNC(spg110_device::spg110_310c_w));
+ map(0x00310d, 0x00310d).w(FUNC(spg110_device::spg110_310d_w));
+
+ map(0x00310f, 0x00310f).r(FUNC(spg110_device::spg110_310f_r));
+
+ // 0032xx looks like it could be the same as 003d00 on spg2xx
+ map(0x003200, 0x00322f).rw(m_spg_io, FUNC(spg2xx_io_device::io_r), FUNC(spg2xx_io_device::io_w));
+}
+
+// this seems to be a different, non-cpu mapped space only accessible via the DMA?
+void spg110_device::map_video(address_map &map)
+{
+ // are these addresses hardcoded, or can they move (in which case tilemap system isn't really suitable)
+ map(0x00000, 0x03fff).ram(); // 2fff?
+
+ map(0x04000, 0x04fff).ram(); // seems to be 3 blocks, almost certainly spritelist
+
+// map(0x08000, 0x081ff).ram().w(m_palette, FUNC(palette_device::write16)).share("palette"); // probably? format unknown tho
+ map(0x08000, 0x081ff).ram().share("palram");
+}
+
+
+/*
+TIMER_CALLBACK_MEMBER(spg110_device::test_timer)
+{
+ //
+}
+*/
+
+
+
+void spg110_device::device_start()
+{
+// m_test_timer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(spg110_device::test_timer), this));
+ save_item(NAME(m_dma_src_step));
+ save_item(NAME(m_dma_dst_step));
+ save_item(NAME(m_dma_unk_2061));
+ save_item(NAME(m_dma_unk_2067));
+ save_item(NAME(m_dma_dst));
+ save_item(NAME(m_dma_src));
+ save_item(NAME(m_bg_scrollx));
+ save_item(NAME(m_bg_scrolly));
+ save_item(NAME(m_2036_scroll));
+
+ m_porta_out.resolve_safe();
+ m_portb_out.resolve_safe();
+ m_portc_out.resolve_safe();
+ m_porta_in.resolve_safe(0);
+ m_portb_in.resolve_safe(0);
+ m_portc_in.resolve_safe(0);
+ m_adc_in[0].resolve_safe(0x0fff);
+ m_adc_in[1].resolve_safe(0x0fff);
+ m_chip_sel.resolve_safe();
+
+}
+
+void spg110_device::device_reset()
+{
+ m_dma_src_step = 0;
+ m_dma_dst_step = 0;
+ m_dma_unk_2061 = 0;
+ m_dma_unk_2067 = 0;
+ m_dma_dst = 0;
+ m_dma_src = 0;
+ m_bg_scrollx = 0;
+ m_bg_scrolly = 0;
+ m_2036_scroll = 0;
+}
+
+double spg110_device::hue2rgb(double p, double q, double t)
+{
+ if (t < 0) t += 1;
+ if (t > 1) t -= 1;
+ if (t < 1 / 6.0f) return p + (q - p) * 6 * t;
+ if (t < 1 / 2.0f) return q;
+ if (t < 2 / 3.0f) return p + (q - p) * (2 / 3.0f - t) * 6;
+ return p;
+}
+
+uint32_t spg110_device::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect)
+{
+ // Palette, this is still wrong!
+ int offs = 0;
+ for (int index = 0;index < 256; index++)
+ {
+ uint16_t dat = m_palram[offs++];
+
+ // llll lsss sshh hhhh
+ int l_raw = (dat & 0xf800) >> 11;
+ int sl_raw = (dat & 0x07c0) >> 6;
+ int h_raw = (dat & 0x003f) >> 0;
+
+ double l = (double)l_raw / 31.0f;
+ double s = (double)sl_raw / 31.0f;
+ double h = (double)h_raw / 47.0f;
+
+ double r, g, b;
+
+ if (s == 0) {
+ r = g = b = l; // greyscale
+ } else {
+ double q = l < 0.5f ? l * (1 + s) : l + s - l * s;
+ double p = 2 * l - q;
+ r = hue2rgb(p, q, h + 1/3.0f);
+ g = hue2rgb(p, q, h);
+ b = hue2rgb(p, q, h - 1/3.0f);
+ }
+
+ int r_real = r * 255.0f;
+ int g_real = g * 255.0f;
+ int b_real = b * 255.0f;
+
+ m_palette->set_pen_color(index, r_real, g_real, b_real);
+ }
+
+ memset(&m_screenbuf[320 * cliprect.min_y], 0, 4 * 320 * ((cliprect.max_y - cliprect.min_y) + 1));
+
+ const uint32_t page1_addr = 0;//0x40 * m_video_regs[0x20];
+ const uint32_t page2_addr = 0;//0x40 * m_video_regs[0x21];
+ uint16_t *page1_regs = tmap0_regs;
+ uint16_t *page2_regs = tmap1_regs;
+
+ for (uint32_t scanline = (uint32_t)cliprect.min_y; scanline <= (uint32_t)cliprect.max_y; scanline++)
+ {
+ for (int i = 0; i < 4; i++)
+ {
+ blit_page(cliprect, scanline, i, page2_addr, page2_regs);
+ blit_page(cliprect, scanline, i, page1_addr, page1_regs);
+ //blit_sprites(cliprect, scanline, i);
+ }
+ }
+
+ for (int y = cliprect.min_y; y <= cliprect.max_y; y++)
+ {
+ uint32_t *dest = &bitmap.pix32(y, cliprect.min_x);
+ uint32_t *src = &m_screenbuf[cliprect.min_x + 320 * y];
+ memcpy(dest, src, sizeof(uint32_t) * ((cliprect.max_x - cliprect.min_x) + 1));
+ }
+
+ return 0;
+}
+
+WRITE_LINE_MEMBER(spg110_device::vblank)
+{
+ if (!state)
+ {
+ m_cpu->set_state_unsynced(UNSP_IRQ0_LINE, ASSERT_LINE);
+ // m_test_timer->adjust(attotime::from_usec(100), 0);
+ }
+
+ return;
+}
diff --git a/src/devices/machine/spg110.h b/src/devices/machine/spg110.h
new file mode 100644
index 00000000000..64464e1ba9d
--- /dev/null
+++ b/src/devices/machine/spg110.h
@@ -0,0 +1,220 @@
+// license:BSD-3-Clause
+// copyright-holders:David Haywood
+
+#ifndef MAME_MACHINE_SPG110_H
+#define MAME_MACHINE_SPG110_H
+
+#pragma once
+
+//#include "spg2xx.h"
+#include "cpu/unsp/unsp.h"
+#include "emupal.h"
+#include "spg2xx_io.h"
+
+
+class spg110_device : public device_t, public device_memory_interface
+
+{
+public:
+ spg110_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock);
+ spg110_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+
+ template <typename T, typename U>
+ spg110_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock, T &&cpu_tag, U &&screen_tag)
+ : spg110_device(mconfig, tag, owner, clock)
+ {
+ m_cpu.set_tag(std::forward<T>(cpu_tag));
+ m_screen.set_tag(std::forward<U>(screen_tag));
+ }
+
+ void map(address_map &map);
+ void map_video(address_map &map);
+
+ double hue2rgb(double p, double q, double t);
+ uint32_t screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
+ DECLARE_WRITE_LINE_MEMBER(vblank);
+
+ auto porta_out() { return m_porta_out.bind(); }
+ auto portb_out() { return m_portb_out.bind(); }
+ auto portc_out() { return m_portc_out.bind(); }
+ auto porta_in() { return m_porta_in.bind(); }
+ auto portb_in() { return m_portb_in.bind(); }
+ auto portc_in() { return m_portc_in.bind(); }
+
+ template <size_t Line> auto adc_in() { return m_adc_in[Line].bind(); }
+
+ auto chip_select() { return m_chip_sel.bind(); }
+
+protected:
+ virtual void device_start() override;
+ virtual void device_reset() override;
+
+ virtual void device_add_mconfig(machine_config &config) override;
+
+ virtual space_config_vector memory_space_config() const override;
+
+ address_space_config m_space_config;
+
+private:
+ enum
+ {
+ PAGE_ENABLE_MASK = 0x0008,
+ PAGE_WALLPAPER_MASK = 0x0004,
+
+ PAGE_DEPTH_FLAG_MASK = 0x3000,
+ PAGE_DEPTH_FLAG_SHIFT = 12,
+ PAGE_TILE_HEIGHT_MASK = 0x00c0,
+ PAGE_TILE_HEIGHT_SHIFT = 6,
+ PAGE_TILE_WIDTH_MASK = 0x0030,
+ PAGE_TILE_WIDTH_SHIFT = 4,
+
+ TILE_X_FLIP = 0x0004,
+ TILE_Y_FLIP = 0x0008
+ };
+
+ enum flipx_t : bool
+ {
+ FlipXOff = false,
+ FlipXOn = true
+ };
+
+ required_device<unsp_device> m_cpu;
+ required_device<screen_device> m_screen;
+ required_device<palette_device> m_palette;
+ required_device<gfxdecode_device> m_gfxdecode;
+ required_shared_ptr<uint16_t> m_palram;
+ required_device<spg2xx_io_device> m_spg_io;
+
+ //TIMER_CALLBACK_MEMBER(test_timer);
+ //emu_timer *m_test_timer;
+
+
+ DECLARE_WRITE16_MEMBER(spg110_201c_w);
+ DECLARE_WRITE16_MEMBER(spg110_2020_w);
+
+ DECLARE_WRITE16_MEMBER(spg110_2028_w);
+ DECLARE_WRITE16_MEMBER(spg110_2029_w);
+
+ DECLARE_READ16_MEMBER(spg110_2028_r);
+ DECLARE_READ16_MEMBER(spg110_2029_r);
+
+ DECLARE_WRITE16_MEMBER(spg110_2031_w);
+ DECLARE_WRITE16_MEMBER(spg110_2032_w);
+ DECLARE_WRITE16_MEMBER(spg110_2033_w);
+ DECLARE_WRITE16_MEMBER(spg110_2034_w);
+ DECLARE_WRITE16_MEMBER(spg110_2035_w);
+ DECLARE_WRITE16_MEMBER(spg110_2036_w);
+ DECLARE_WRITE16_MEMBER(spg110_2037_w);
+ DECLARE_WRITE16_MEMBER(spg110_2039_w);
+
+ DECLARE_WRITE16_MEMBER(spg110_203c_w);
+ DECLARE_WRITE16_MEMBER(spg110_203d_w);
+
+ DECLARE_WRITE16_MEMBER(spg110_2042_w);
+
+ DECLARE_WRITE16_MEMBER(spg110_2045_w);
+
+ DECLARE_WRITE16_MEMBER(spg110_2050_w);
+ DECLARE_WRITE16_MEMBER(spg110_2051_w);
+ DECLARE_WRITE16_MEMBER(spg110_2052_w);
+ DECLARE_WRITE16_MEMBER(spg110_2053_w);
+ DECLARE_WRITE16_MEMBER(spg110_2054_w);
+ DECLARE_WRITE16_MEMBER(spg110_2055_w);
+ DECLARE_WRITE16_MEMBER(spg110_2056_w);
+ DECLARE_WRITE16_MEMBER(spg110_2057_w);
+ DECLARE_WRITE16_MEMBER(spg110_2058_w);
+ DECLARE_WRITE16_MEMBER(spg110_2059_w);
+ DECLARE_WRITE16_MEMBER(spg110_205a_w);
+ DECLARE_WRITE16_MEMBER(spg110_205b_w);
+ DECLARE_WRITE16_MEMBER(spg110_205c_w);
+ DECLARE_WRITE16_MEMBER(spg110_205d_w);
+ DECLARE_WRITE16_MEMBER(spg110_205e_w);
+ DECLARE_WRITE16_MEMBER(spg110_205f_w);
+
+
+ DECLARE_READ16_MEMBER(spg110_2037_r);
+ DECLARE_READ16_MEMBER(spg110_2042_r);
+
+ DECLARE_WRITE16_MEMBER(dma_dst_w);
+ DECLARE_WRITE16_MEMBER(dma_unk_2061_w);
+ DECLARE_WRITE16_MEMBER(dma_len_trigger_w);
+ DECLARE_WRITE16_MEMBER(spg110_2063_w);
+ DECLARE_WRITE16_MEMBER(dma_dst_step_w);
+ DECLARE_WRITE16_MEMBER(dma_src_w);
+ DECLARE_WRITE16_MEMBER(dma_unk_2067_w);
+ DECLARE_WRITE16_MEMBER(dma_src_step_w);
+
+ DECLARE_READ16_MEMBER(dma_len_status_r);
+ DECLARE_READ16_MEMBER(spg110_2063_r);
+
+ DECLARE_WRITE16_MEMBER(spg110_3100_w);
+
+ DECLARE_WRITE16_MEMBER(spg110_3101_w);
+ DECLARE_WRITE16_MEMBER(spg110_3102_w);
+ DECLARE_WRITE16_MEMBER(spg110_3104_w);
+ DECLARE_WRITE16_MEMBER(spg110_3105_w);
+ DECLARE_WRITE16_MEMBER(spg110_3106_w);
+ DECLARE_WRITE16_MEMBER(spg110_3107_w);
+ DECLARE_WRITE16_MEMBER(spg110_3108_w);
+ DECLARE_WRITE16_MEMBER(spg110_3109_w);
+
+ DECLARE_WRITE16_MEMBER(spg110_310b_w);
+ DECLARE_WRITE16_MEMBER(spg110_310c_w);
+ DECLARE_WRITE16_MEMBER(spg110_310d_w);
+
+ DECLARE_READ16_MEMBER(spg110_310f_r);
+
+ DECLARE_READ16_MEMBER(tmap0_regs_r);
+ DECLARE_READ16_MEMBER(tmap1_regs_r);
+ DECLARE_WRITE16_MEMBER(tmap0_regs_w);
+ DECLARE_WRITE16_MEMBER(tmap1_regs_w);
+
+ uint16_t tmap0_regs[0x6];
+ uint16_t tmap1_regs[0x6];
+
+ uint16_t m_dma_src_step;
+ uint16_t m_dma_dst_step;
+ uint16_t m_dma_unk_2061;
+ uint16_t m_dma_unk_2067;
+
+ uint16_t m_dma_dst;
+ uint16_t m_dma_src;
+
+ uint16_t m_bg_scrollx;
+ uint16_t m_bg_scrolly;
+ uint16_t m_2036_scroll;
+
+ void tilemap_write_regs(int which, uint16_t* regs, int regno, uint16_t data);
+
+ template<flipx_t FlipX>
+ void blit(const rectangle &cliprect, uint32_t line, uint32_t xoff, uint32_t yoff, uint32_t attr, uint32_t ctrl, uint32_t bitmap_addr, uint16_t tile);
+ void blit_page(const rectangle &cliprect, uint32_t scanline, int depth, uint32_t bitmap_addr, uint16_t *regs);
+ uint32_t m_screenbuf[320 * 240];
+
+ devcb_write16 m_porta_out;
+ devcb_write16 m_portb_out;
+ devcb_write16 m_portc_out;
+ devcb_read16 m_porta_in;
+ devcb_read16 m_portb_in;
+ devcb_read16 m_portc_in;
+
+ devcb_read16 m_adc_in[2];
+
+ devcb_write8 m_chip_sel;
+
+ DECLARE_READ16_MEMBER(porta_r) { return m_porta_in(); };
+ DECLARE_READ16_MEMBER(portb_r) { return m_portb_in(); };
+ DECLARE_READ16_MEMBER(portc_r) { return m_portc_in(); };
+ DECLARE_WRITE16_MEMBER(porta_w) { m_porta_out(offset, data, mem_mask); };
+ DECLARE_WRITE16_MEMBER(portb_w) { m_portb_out(offset, data, mem_mask); };
+ DECLARE_WRITE16_MEMBER(portc_w) { m_portc_out(offset, data, mem_mask); };
+ template <size_t Line> DECLARE_READ16_MEMBER(adc_r) { return m_adc_in[Line](); };
+ DECLARE_WRITE8_MEMBER(cs_w) { m_chip_sel(offset, data, mem_mask); };
+ DECLARE_READ16_MEMBER(get_pal_r) { return 0; /*m_pal_flag;*/ };
+ void configure_spg_io(spg2xx_io_device* io);
+
+};
+
+DECLARE_DEVICE_TYPE(SPG110, spg110_device)
+
+#endif // MAME_MACHINE_SPG110_H
diff --git a/src/devices/machine/spg2xx.cpp b/src/devices/machine/spg2xx.cpp
index a325346558d..3a3a22abac3 100644
--- a/src/devices/machine/spg2xx.cpp
+++ b/src/devices/machine/spg2xx.cpp
@@ -17,57 +17,38 @@
DEFINE_DEVICE_TYPE(SPG24X, spg24x_device, "spg24x", "SPG240-series System-on-a-Chip")
DEFINE_DEVICE_TYPE(SPG28X, spg28x_device, "spg28x", "SPG280-series System-on-a-Chip")
-#define LOG_IO_READS (1U << 1)
-#define LOG_IO_WRITES (1U << 2)
#define LOG_UNKNOWN_IO (1U << 3)
#define LOG_IRQS (1U << 4)
#define LOG_VLINES (1U << 5)
-#define LOG_GPIO (1U << 6)
-#define LOG_UART (1U << 7)
-#define LOG_I2C (1U << 8)
#define LOG_DMA (1U << 9)
-#define LOG_SEGMENT (1U << 10)
-#define LOG_WATCHDOG (1U << 11)
-#define LOG_TIMERS (1U << 12)
-#define LOG_SPU_READS (1U << 13)
-#define LOG_SPU_WRITES (1U << 14)
-#define LOG_UNKNOWN_SPU (1U << 15)
-#define LOG_CHANNEL_READS (1U << 16)
-#define LOG_CHANNEL_WRITES (1U << 17)
-#define LOG_ENVELOPES (1U << 18)
-#define LOG_SAMPLES (1U << 19)
-#define LOG_RAMPDOWN (1U << 20)
-#define LOG_BEAT (1U << 21)
#define LOG_PPU_READS (1U << 22)
#define LOG_PPU_WRITES (1U << 23)
#define LOG_UNKNOWN_PPU (1U << 24)
-#define LOG_IO (LOG_IO_READS | LOG_IO_WRITES | LOG_IRQS | LOG_GPIO | LOG_UART | LOG_I2C | LOG_DMA | LOG_TIMERS | LOG_UNKNOWN_IO)
-#define LOG_CHANNELS (LOG_CHANNEL_READS | LOG_CHANNEL_WRITES)
-#define LOG_SPU (LOG_SPU_READS | LOG_SPU_WRITES | LOG_UNKNOWN_SPU | LOG_CHANNEL_READS | LOG_CHANNEL_WRITES \
- | LOG_ENVELOPES | LOG_SAMPLES | LOG_RAMPDOWN | LOG_BEAT)
+#define LOG_IO (LOG_IRQS | LOG_DMA | LOG_UNKNOWN_IO)
#define LOG_PPU (LOG_PPU_READS | LOG_PPU_WRITES | LOG_UNKNOWN_PPU)
-#define LOG_ALL (LOG_IO | LOG_SPU | LOG_PPU | LOG_VLINES | LOG_SEGMENT)
+#define LOG_ALL (LOG_IO | LOG_PPU | LOG_VLINES )
-#define VERBOSE (LOG_UART | LOG_UNKNOWN_IO)
+#define VERBOSE (0)
#include "logmacro.h"
#define SPG_DEBUG_VIDEO (0)
-#define SPG_DEBUG_AUDIO (0)
-#define IO_IRQ_ENABLE m_io_regs[0x21]
-#define IO_IRQ_STATUS m_io_regs[0x22]
#define VIDEO_IRQ_ENABLE m_video_regs[0x62]
#define VIDEO_IRQ_STATUS m_video_regs[0x63]
spg2xx_device::spg2xx_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock)
: device_t(mconfig, type, tag, owner, clock)
- , device_sound_interface(mconfig, *this)
+ , device_mixer_interface(mconfig, *this, 2)
+ , m_spg_audio(*this, "spgaudio")
+ , m_spg_io(*this, "spgio")
+ , m_rowscrolloffset(15)
, m_porta_out(*this)
, m_portb_out(*this)
, m_portc_out(*this)
, m_porta_in(*this)
, m_portb_in(*this)
, m_portc_in(*this)
+ , m_adc_in{{*this}, {*this}}
, m_eeprom_w(*this)
, m_eeprom_r(*this)
, m_uart_tx(*this)
@@ -97,212 +78,234 @@ void spg2xx_device::map(address_map &map)
map(0x002900, 0x002aff).ram().share("scrollram");
map(0x002b00, 0x002bff).ram().share("paletteram");
map(0x002c00, 0x002fff).ram().share("spriteram");
- map(0x003000, 0x0037ff).rw(FUNC(spg2xx_device::audio_r), FUNC(spg2xx_device::audio_w));
- map(0x003d00, 0x003eff).rw(FUNC(spg2xx_device::io_r), FUNC(spg2xx_device::io_w));
+ map(0x003000, 0x0031ff).rw(m_spg_audio, FUNC(spg2xx_audio_device::audio_r), FUNC(spg2xx_audio_device::audio_w));
+ map(0x003200, 0x0033ff).rw(m_spg_audio, FUNC(spg2xx_audio_device::audio_phase_r), FUNC(spg2xx_audio_device::audio_phase_w));
+ map(0x003400, 0x0037ff).rw(m_spg_audio, FUNC(spg2xx_audio_device::audio_ctrl_r), FUNC(spg2xx_audio_device::audio_ctrl_w));
+ map(0x003d00, 0x003d2f).rw(m_spg_io, FUNC(spg2xx_io_device::io_r), FUNC(spg2xx_io_device::io_w));
+ map(0x003d30, 0x003dff).rw(m_spg_io, FUNC(spg2xx_io_device::io_extended_r), FUNC(spg2xx_io_device::io_extended_w));
+ map(0x003e00, 0x003e03).rw(FUNC(spg2xx_device::dma_r), FUNC(spg2xx_device::dma_w));
}
void spg2xx_device::device_start()
{
+ for (uint8_t i = 0; i < 32; i++)
+ {
+ m_rgb5_to_rgb8[i] = (i << 3) | (i >> 2);
+ }
+ for (uint16_t i = 0; i < 0x8000; i++)
+ {
+ m_rgb555_to_rgb888[i] = (m_rgb5_to_rgb8[(i >> 10) & 0x1f] << 16) |
+ (m_rgb5_to_rgb8[(i >> 5) & 0x1f] << 8) |
+ (m_rgb5_to_rgb8[(i >> 0) & 0x1f] << 0);
+ }
m_porta_out.resolve_safe();
m_portb_out.resolve_safe();
m_portc_out.resolve_safe();
m_porta_in.resolve_safe(0);
m_portb_in.resolve_safe(0);
m_portc_in.resolve_safe(0);
+ m_adc_in[0].resolve_safe(0x0fff);
+ m_adc_in[1].resolve_safe(0x0fff);
m_eeprom_w.resolve_safe();
m_eeprom_r.resolve_safe(0);
m_uart_tx.resolve_safe();
m_chip_sel.resolve_safe();
- m_tmb1 = timer_alloc(TIMER_TMB1);
- m_tmb2 = timer_alloc(TIMER_TMB2);
- m_tmb1->adjust(attotime::never);
- m_tmb2->adjust(attotime::never);
-
m_screenpos_timer = timer_alloc(TIMER_SCREENPOS);
m_screenpos_timer->adjust(attotime::never);
- m_audio_beat = timer_alloc(TIMER_BEAT);
- m_audio_beat->adjust(attotime::never);
+ save_item(NAME(m_hide_page0));
+ save_item(NAME(m_hide_page1));
+ save_item(NAME(m_hide_sprites));
+ save_item(NAME(m_debug_sprites));
+ save_item(NAME(m_debug_blit));
+ save_item(NAME(m_debug_palette));
+ save_item(NAME(m_sprite_index_to_debug));
- m_stream = stream_alloc(0, 2, 44100);
+ save_item(NAME(m_dma_regs));
- m_channel_debug = -1;
+ save_item(NAME(m_video_regs));
+ save_item(NAME(m_sprite_limit));
+ save_item(NAME(m_pal_flag));
}
void spg2xx_device::device_reset()
{
- memset(m_audio_regs, 0, 0x800 * sizeof(uint16_t));
- memset(m_sample_shift, 0, 16);
- memset(m_sample_count, 0, sizeof(uint32_t) * 16);
- memset(m_sample_addr, 0, sizeof(uint32_t) * 16);
- memset(m_channel_rate, 0, sizeof(double) * 16);
- memset(m_channel_rate_accum, 0, sizeof(double) * 16);
- memset(m_rampdown_frame, 0, sizeof(uint32_t) * 16);
- memset(m_envclk_frame, 4, sizeof(uint32_t) * 16);
- memset(m_envelope_addr, 0, sizeof(uint32_t) * 16);
-
memset(m_video_regs, 0, 0x100 * sizeof(uint16_t));
- memset(m_io_regs, 0, 0x200 * sizeof(uint16_t));
-
- m_io_regs[0x23] = 0x0028;
- m_uart_rx_available = false;
- memset(m_uart_rx_fifo, 0, ARRAY_LENGTH(m_uart_rx_fifo));
- m_uart_rx_fifo_start = 0;
- m_uart_rx_fifo_end = 0;
- m_uart_rx_fifo_count = 0;
+ memset(m_dma_regs, 0, 0x4 * sizeof(uint16_t));
m_video_regs[0x36] = 0xffff;
m_video_regs[0x37] = 0xffff;
m_video_regs[0x3c] = 0x0020;
+ m_video_regs[0x42] = 0x0001;
m_hide_page0 = false;
m_hide_page1 = false;
m_hide_sprites = false;
m_debug_sprites = false;
m_debug_blit = false;
+ m_debug_palette = false;
m_sprite_index_to_debug = 0;
+}
- m_debug_samples = false;
- m_debug_rates = false;
- m_audio_curr_beat_base_count = 0;
- m_audio_regs[AUDIO_CHANNEL_REPEAT] = 0x3f;
- m_audio_regs[AUDIO_CHANNEL_ENV_MODE] = 0x3f;
+WRITE_LINE_MEMBER(spg2xx_device::audioirq_w)
+{
+ m_cpu->set_state_unsynced(UNSP_IRQ4_LINE, state);
+}
- m_audio_beat->adjust(attotime::from_ticks(4, 281250), 0, attotime::from_ticks(4, 281250));
+WRITE_LINE_MEMBER(spg2xx_device::timerirq_w)
+{
+ m_cpu->set_state_unsynced(UNSP_IRQ2_LINE, state);
}
+WRITE_LINE_MEMBER(spg2xx_device::uartirq_w)
+{
+ m_cpu->set_state_unsynced(UNSP_IRQ3_LINE, state);
+}
-/*************************
-* Video Hardware *
-*************************/
+WRITE_LINE_MEMBER(spg2xx_device::extirq_w)
+{
+ m_cpu->set_state_unsynced(UNSP_IRQ5_LINE, state);
+}
-inline uint8_t spg2xx_device::expand_rgb5_to_rgb8(uint8_t val)
+WRITE_LINE_MEMBER(spg2xx_device::ffreq1_w)
{
- uint8_t temp = val & 0x1f;
- return (temp << 3) | (temp >> 2);
+ m_cpu->set_state_unsynced(UNSP_IRQ6_LINE, state);
}
-// Perform a lerp between a and b
-inline uint8_t spg2xx_device::mix_channel(uint8_t bottom, uint8_t top)
+WRITE_LINE_MEMBER(spg2xx_device::ffreq2_w)
{
- uint8_t alpha = (m_video_regs[0x2a] & 3) << 6;
- return ((256 - alpha) * bottom + alpha * top) >> 8;
+ m_cpu->set_state_unsynced(UNSP_IRQ7_LINE, state);
}
-void spg2xx_device::mix_pixel(uint32_t offset, uint16_t rgb)
+
+
+READ16_MEMBER(spg2xx_device::space_r)
{
- m_screenbuf[offset].r = mix_channel(m_screenbuf[offset].r, expand_rgb5_to_rgb8(rgb >> 10));
- m_screenbuf[offset].g = mix_channel(m_screenbuf[offset].g, expand_rgb5_to_rgb8(rgb >> 5));
- m_screenbuf[offset].b = mix_channel(m_screenbuf[offset].b, expand_rgb5_to_rgb8(rgb));
+ address_space &cpuspace = m_cpu->space(AS_PROGRAM);
+ return cpuspace.read_word(offset);
}
-void spg2xx_device::set_pixel(uint32_t offset, uint16_t rgb)
+/*************************
+* Video Hardware *
+*************************/
+
+// Perform a lerp between a and b
+inline uint8_t spg2xx_device::mix_channel(uint8_t bottom, uint8_t top)
{
- m_screenbuf[offset].r = expand_rgb5_to_rgb8(rgb >> 10);
- m_screenbuf[offset].g = expand_rgb5_to_rgb8(rgb >> 5);
- m_screenbuf[offset].b = expand_rgb5_to_rgb8(rgb);
+ uint8_t alpha = (m_video_regs[0x2a] & 3) << 6;
+ return ((256 - alpha) * bottom + alpha * top) >> 8;
}
-void spg2xx_device::blit(const rectangle &cliprect, uint32_t xoff, uint32_t yoff, uint32_t attr, uint32_t ctrl, uint32_t bitmap_addr, uint16_t tile)
+template<spg2xx_device::blend_enable_t Blend, spg2xx_device::rowscroll_enable_t RowScroll, spg2xx_device::flipx_t FlipX>
+void spg2xx_device::blit(const rectangle &cliprect, uint32_t line, uint32_t xoff, uint32_t yoff, uint32_t attr, uint32_t ctrl, uint32_t bitmap_addr, uint16_t tile)
{
address_space &space = m_cpu->space(AS_PROGRAM);
- uint32_t h = 8 << ((attr & PAGE_TILE_HEIGHT_MASK) >> PAGE_TILE_HEIGHT_SHIFT);
- uint32_t w = 8 << ((attr & PAGE_TILE_WIDTH_MASK) >> PAGE_TILE_WIDTH_SHIFT);
+ int32_t h = 8 << ((attr & PAGE_TILE_HEIGHT_MASK) >> PAGE_TILE_HEIGHT_SHIFT);
+ int32_t w = 8 << ((attr & PAGE_TILE_WIDTH_MASK) >> PAGE_TILE_WIDTH_SHIFT);
uint32_t yflipmask = attr & TILE_Y_FLIP ? h - 1 : 0;
- uint32_t xflipmask = attr & TILE_X_FLIP ? w - 1 : 0;
uint32_t nc = ((attr & 0x0003) + 1) << 1;
uint32_t palette_offset = (attr & 0x0f00) >> 4;
- if (m_debug_blit && SPG_DEBUG_VIDEO)
+ if (SPG_DEBUG_VIDEO && m_debug_blit)
{
- printf("xy:%08x,%08x attr:%08x ctrl:%08x bitmap_addr:%08x tile:%04x\n", xoff, yoff, attr, ctrl, bitmap_addr, tile);
- printf("hw:%d,%d f:%d,%d fm:%d,%d ncols:%d pobs:%02x ", w, h, (attr & TILE_X_FLIP) ? 1 : 0, (attr & TILE_Y_FLIP) ? 1 : 0, xflipmask, yflipmask, nc, palette_offset);
+ printf("s:%d line:%d xy:%08x,%08x attr:%08x ctrl:%08x bitmap_addr:%08x tile:%04x\n", cliprect.min_x, line, xoff, yoff, attr, ctrl, bitmap_addr, tile);
+ printf("hw:%d,%d f:%d,%d yfm:%d ncols:%d pobs:%02x ", w, h, (attr & TILE_X_FLIP) ? 1 : 0, (attr & TILE_Y_FLIP) ? 1 : 0, yflipmask, nc, palette_offset);
}
palette_offset >>= nc;
palette_offset <<= nc;
- if (m_debug_blit && SPG_DEBUG_VIDEO)
+ if (SPG_DEBUG_VIDEO && m_debug_blit)
{
printf("poas:%02x\n", palette_offset);
}
- uint32_t m = bitmap_addr + nc * w*h / 16 * tile;
+ uint32_t bits_per_row = nc * w / 16;
+ uint32_t words_per_tile = bits_per_row * h;
+ uint32_t m = bitmap_addr + words_per_tile * tile + bits_per_row * (line ^ yflipmask);
uint32_t bits = 0;
uint32_t nbits = 0;
+ uint32_t y = line;
- for (uint32_t y = 0; y < h; y++)
- {
- int yy = (yoff + (y ^ yflipmask)) & 0x1ff;
- if (yy >= 0x01c0)
- yy -= 0x0200;
+ int yy = (yoff + y) & 0x1ff;
+ if (yy >= 0x01c0)
+ yy -= 0x0200;
- if (m_debug_blit && SPG_DEBUG_VIDEO)
- printf("%3d:\n", yy);
+ if (yy > 240 || yy < 0)
+ return;
- for (uint32_t x = 0; x < w; x++)
+ if (SPG_DEBUG_VIDEO && m_debug_blit)
+ printf("%3d:\n", yy);
+
+ int y_index = yy * 320;
+
+ for (int32_t x = FlipX ? (w - 1) : 0; FlipX ? x >= 0 : x < w; FlipX ? x-- : x++)
+ {
+ int xx = xoff + x;
+
+ bits <<= nc;
+ if (SPG_DEBUG_VIDEO && m_debug_blit)
+ printf(" %08x:%d ", bits, nbits);
+ if (nbits < nc)
{
- int xx = xoff + (x ^ xflipmask);
+ uint16_t b = space.read_word(m++ & 0x3fffff);
+ b = (b << 8) | (b >> 8);
+ bits |= b << (nc - nbits);
+ nbits += 16;
+ if (SPG_DEBUG_VIDEO && m_debug_blit)
+ printf("(%04x:%08x:%d) ", b, bits, nbits);
+ }
+ nbits -= nc;
- bits <<= nc;
- if (m_debug_blit && SPG_DEBUG_VIDEO)
- printf(" %08x:%d ", bits, nbits);
- if (nbits < nc)
- {
- uint16_t b = space.read_word(m++ & 0x3fffff);
- b = (b << 8) | (b >> 8);
- bits |= b << (nc - nbits);
- nbits += 16;
- if (m_debug_blit && SPG_DEBUG_VIDEO)
- printf("(%04x:%08x:%d) ", b, bits, nbits);
- }
- nbits -= nc;
+ uint32_t pal = palette_offset + (bits >> 16);
+ if (SPG_DEBUG_VIDEO && m_debug_blit)
+ printf("%02x:%02x:%04x ", bits >> 16, pal, bits & 0xffff);
+ bits &= 0xffff;
+
+ if (RowScroll)
+ xx -= (int16_t)m_scrollram[(yy + m_rowscrolloffset) & 0x1ff];
- uint32_t pal = palette_offset + (bits >> 16);
- if (m_debug_blit && SPG_DEBUG_VIDEO)
- printf("%02x:%02x:%04x ", bits >> 16, pal, bits & 0xffff);
- bits &= 0xffff;
+ xx &= 0x01ff;
+ if (xx >= 0x01c0)
+ xx -= 0x0200;
- if ((ctrl & 0x0010) && yy < 240)
- xx -= (int16_t)m_scrollram[yy + 15];
+ if (xx >= 0 && xx < 320)
+ {
+ int pix_index = xx + y_index;
- xx &= 0x01ff;
- if (xx >= 0x01c0)
- xx -= 0x0200;
+ uint16_t rgb = m_paletteram[pal];
+ if (SPG_DEBUG_VIDEO && m_debug_blit)
+ printf("rgb:%04x ", rgb);
- if (xx >= 0 && xx < 320 && yy >= 0 && yy < 240)
+ if (!(rgb & 0x8000))
{
- uint16_t rgb = m_paletteram[pal];
- if (m_debug_blit && SPG_DEBUG_VIDEO)
- printf("rgb:%04x ", rgb);
- if (!(rgb & 0x8000))
+ if (Blend)
{
- if (attr & 0x4000 || ctrl & 0x0100)
- {
- if (m_debug_blit && SPG_DEBUG_VIDEO)
- printf("M\n");
- mix_pixel(xx + 320 * yy, rgb);
- }
- else
- {
- if (m_debug_blit && SPG_DEBUG_VIDEO)
- printf("S\n");
- set_pixel(xx + 320 * yy, rgb);
- }
+ if (SPG_DEBUG_VIDEO && m_debug_blit)
+ printf("M\n");
+ m_screenbuf[pix_index] = (mix_channel((uint8_t)(m_screenbuf[pix_index] >> 16), m_rgb5_to_rgb8[(rgb >> 10) & 0x1f]) << 16) |
+ (mix_channel((uint8_t)(m_screenbuf[pix_index] >> 8), m_rgb5_to_rgb8[(rgb >> 5) & 0x1f]) << 8) |
+ (mix_channel((uint8_t)(m_screenbuf[pix_index] >> 0), m_rgb5_to_rgb8[rgb & 0x1f]));
}
- else if (m_debug_blit && SPG_DEBUG_VIDEO)
+ else
{
- printf("X\n");
+ if (SPG_DEBUG_VIDEO && m_debug_blit)
+ printf("S\n");
+ m_screenbuf[pix_index] = m_rgb555_to_rgb888[rgb];
}
}
+ else if (SPG_DEBUG_VIDEO && m_debug_blit)
+ {
+ printf("X\n");
+ }
}
}
}
-void spg2xx_device::blit_page(const rectangle &cliprect, int depth, uint32_t bitmap_addr, uint16_t *regs)
+void spg2xx_device::blit_page(const rectangle &cliprect, uint32_t scanline, int depth, uint32_t bitmap_addr, uint16_t *regs)
{
uint32_t xscroll = regs[0];
uint32_t yscroll = regs[1];
@@ -322,62 +325,98 @@ void spg2xx_device::blit_page(const rectangle &cliprect, int depth, uint32_t bit
return;
}
- uint32_t h = 8 << ((attr & PAGE_TILE_HEIGHT_MASK) >> PAGE_TILE_HEIGHT_SHIFT);
- uint32_t w = 8 << ((attr & PAGE_TILE_WIDTH_MASK) >> PAGE_TILE_WIDTH_SHIFT);
+ uint32_t tile_h = 8 << ((attr & PAGE_TILE_HEIGHT_MASK) >> PAGE_TILE_HEIGHT_SHIFT);
+ uint32_t tile_w = 8 << ((attr & PAGE_TILE_WIDTH_MASK) >> PAGE_TILE_WIDTH_SHIFT);
+
+ uint32_t tile_count_x = 512 / tile_w;
- uint32_t hn = 256 / h;
- uint32_t wn = 512 / w;
+ uint32_t bitmap_y = (scanline + yscroll) & 0xff;
+ uint32_t y0 = bitmap_y / tile_h;
+ uint32_t tile_scanline = bitmap_y % tile_h;
+ uint32_t tile_address = tile_count_x * y0;
+ if (SPG_DEBUG_VIDEO && machine().input().code_pressed(KEYCODE_H))
+ printf("s:%3d | baddr:%08x | yscr:%3d | bity:%3d | y0:%2d | ts:%2d\n", scanline, bitmap_addr, yscroll, bitmap_y, y0, tile_scanline);
- for (uint32_t y0 = 0; y0 < hn; y0++)
+ if (SPG_DEBUG_VIDEO && machine().input().code_pressed(KEYCODE_EQUALS))
+ m_debug_blit = true;
+ for (uint32_t x0 = 0; x0 < tile_count_x; x0++, tile_address++)
{
- for (uint32_t x0 = 0; x0 < wn; x0++)
- {
- uint16_t tile = (ctrl & PAGE_WALLPAPER_MASK) ? space.read_word(tilemap) : space.read_word(tilemap + x0 + wn * y0);
- uint16_t palette = 0;
- uint32_t xx, yy;
+ uint32_t yy = ((tile_h * y0 - yscroll + 0x10) & 0xff) - 0x10;
+ uint32_t xx = (tile_w * x0 - xscroll) & 0x1ff;
+ uint16_t tile = (ctrl & PAGE_WALLPAPER_MASK) ? space.read_word(tilemap) : space.read_word(tilemap + tile_address);
+ uint16_t palette = 0;
- if (!tile)
- {
- continue;
- }
+ if (!tile)
+ continue;
- palette = space.read_word(palette_map + (x0 + wn * y0) / 2);
- if (x0 & 1)
- {
- palette >>= 8;
- }
+ palette = (ctrl & PAGE_WALLPAPER_MASK) ? space.read_word(palette_map) : space.read_word(palette_map + tile_address / 2);
+ if (x0 & 1)
+ palette >>= 8;
- uint32_t tileattr = attr;
- uint32_t tilectrl = ctrl;
- if ((ctrl & 2) == 0)
- { // -(1) bld(1) flip(2) pal(4)
- tileattr &= ~0x000c;
- tileattr |= (palette >> 2) & 0x000c; // flip
+ uint32_t tileattr = attr;
+ uint32_t tilectrl = ctrl;
+ if ((ctrl & 2) == 0)
+ { // -(1) bld(1) flip(2) pal(4)
+ tileattr &= ~0x000c;
+ tileattr |= (palette >> 2) & 0x000c; // flip
- tileattr &= ~0x0f00;
- tileattr |= (palette << 8) & 0x0f00; // palette
+ tileattr &= ~0x0f00;
+ tileattr |= (palette << 8) & 0x0f00; // palette
- tilectrl &= ~0x0100;
- tilectrl |= (palette << 2) & 0x0100; // blend
- }
+ tilectrl &= ~0x0100;
+ tilectrl |= (palette << 2) & 0x0100; // blend
+ }
- yy = ((h*y0 - yscroll + 0x10) & 0xff) - 0x10;
- xx = (w*x0 - xscroll) & 0x1ff;
+ bool blend = (tileattr & 0x4000 || tilectrl & 0x0100);
+ bool row_scroll = (tilectrl & 0x0010);
+ bool flip_x = (tileattr & TILE_X_FLIP);
- blit(cliprect, xx, yy, tileattr, tilectrl, bitmap_addr, tile);
+ if (blend)
+ {
+ if (row_scroll)
+ {
+ if (flip_x)
+ blit<BlendOn, RowScrollOn, FlipXOn>(cliprect, tile_scanline, xx, yy, tileattr, tilectrl, bitmap_addr, tile);
+ else
+ blit<BlendOn, RowScrollOn, FlipXOff>(cliprect, tile_scanline, xx, yy, tileattr, tilectrl, bitmap_addr, tile);
+ }
+ else
+ {
+ if (flip_x)
+ blit<BlendOn, RowScrollOff, FlipXOn>(cliprect, tile_scanline, xx, yy, tileattr, tilectrl, bitmap_addr, tile);
+ else
+ blit<BlendOn, RowScrollOff, FlipXOff>(cliprect, tile_scanline, xx, yy, tileattr, tilectrl, bitmap_addr, tile);
+ }
+ }
+ else
+ {
+ if (row_scroll)
+ {
+ if (flip_x)
+ blit<BlendOff, RowScrollOn, FlipXOn>(cliprect, tile_scanline, xx, yy, tileattr, tilectrl, bitmap_addr, tile);
+ else
+ blit<BlendOff, RowScrollOn, FlipXOff>(cliprect, tile_scanline, xx, yy, tileattr, tilectrl, bitmap_addr, tile);
+ }
+ else
+ {
+ if (flip_x)
+ blit<BlendOff, RowScrollOff, FlipXOn>(cliprect, tile_scanline, xx, yy, tileattr, tilectrl, bitmap_addr, tile);
+ else
+ blit<BlendOff, RowScrollOff, FlipXOff>(cliprect, tile_scanline, xx, yy, tileattr, tilectrl, bitmap_addr, tile);
+ }
}
}
+ if (SPG_DEBUG_VIDEO && machine().input().code_pressed(KEYCODE_EQUALS))
+ m_debug_blit = false;
}
-void spg2xx_device::blit_sprite(const rectangle &cliprect, int depth, uint32_t base_addr)
+void spg2xx_device::blit_sprite(const rectangle &cliprect, uint32_t scanline, int depth, uint32_t base_addr)
{
- address_space &space = m_cpu->space(AS_PROGRAM);
uint32_t bitmap_addr = 0x40 * m_video_regs[0x22];
-
- uint16_t tile = space.read_word(base_addr + 0);
- int16_t x = space.read_word(base_addr + 1);
- int16_t y = space.read_word(base_addr + 2);
- uint16_t attr = space.read_word(base_addr + 3);
+ uint16_t tile = m_spriteram[base_addr + 0];
+ int16_t x = m_spriteram[base_addr + 1];
+ int16_t y = m_spriteram[base_addr + 2];
+ uint16_t attr = m_spriteram[base_addr + 3];
if (!tile)
{
@@ -389,32 +428,68 @@ void spg2xx_device::blit_sprite(const rectangle &cliprect, int depth, uint32_t b
return;
}
+ const uint32_t h = 8 << ((attr & PAGE_TILE_HEIGHT_MASK) >> PAGE_TILE_HEIGHT_SHIFT);
+ const uint32_t w = 8 << ((attr & PAGE_TILE_WIDTH_MASK) >> PAGE_TILE_WIDTH_SHIFT);
+
if (!(m_video_regs[0x42] & SPRITE_COORD_TL_MASK))
{
- x = 160 + x;
- y = 120 - y;
-
- uint32_t h = 8 << ((attr & PAGE_TILE_HEIGHT_MASK) >> PAGE_TILE_HEIGHT_SHIFT);
- uint32_t w = 8 << ((attr & PAGE_TILE_WIDTH_MASK) >> PAGE_TILE_WIDTH_SHIFT);
-
- x -= (w / 2);
- y -= (h / 2) - 8;
+ x = (160 + x) - w / 2;
+ y = (120 - y) - (h / 2) + 8;
}
x &= 0x01ff;
y &= 0x01ff;
+ uint32_t tile_line = ((scanline - y) + 0x200) % h;
+ int16_t test_y = (y + tile_line) & 0x1ff;
+ if (test_y >= 0x01c0)
+ test_y -= 0x0200;
+
+ if (test_y != scanline)
+ {
+ return;
+ }
+
+ bool blend = (attr & 0x4000);
+ bool flip_x = (attr & TILE_X_FLIP);
+
#if SPG_DEBUG_VIDEO
if (m_debug_sprites && machine().input().code_pressed(KEYCODE_MINUS))
m_debug_blit = true;
- blit(cliprect, x, y, attr, 0, bitmap_addr, tile);
+ if (blend)
+ {
+ if (flip_x)
+ blit<BlendOn, RowScrollOff, FlipXOn>(cliprect, tile_line, x, y, attr, 0, bitmap_addr, tile);
+ else
+ blit<BlendOn, RowScrollOff, FlipXOff>(cliprect, tile_line, x, y, attr, 0, bitmap_addr, tile);
+ }
+ else
+ {
+ if (flip_x)
+ blit<BlendOff, RowScrollOff, FlipXOn>(cliprect, tile_line, x, y, attr, 0, bitmap_addr, tile);
+ else
+ blit<BlendOff, RowScrollOff, FlipXOff>(cliprect, tile_line, x, y, attr, 0, bitmap_addr, tile);
+ }
m_debug_blit = false;
#else
- blit(cliprect, x, y, attr, 0, bitmap_addr, tile);
+ if (blend)
+ {
+ if (flip_x)
+ blit<BlendOn, RowScrollOff, FlipXOn>(cliprect, tile_line, x, y, attr, 0, bitmap_addr, tile);
+ else
+ blit<BlendOn, RowScrollOff, FlipXOff>(cliprect, tile_line, x, y, attr, 0, bitmap_addr, tile);
+ }
+ else
+ {
+ if (flip_x)
+ blit<BlendOff, RowScrollOff, FlipXOn>(cliprect, tile_line, x, y, attr, 0, bitmap_addr, tile);
+ else
+ blit<BlendOff, RowScrollOff, FlipXOff>(cliprect, tile_line, x, y, attr, 0, bitmap_addr, tile);
+ }
#endif
}
-void spg2xx_device::blit_sprites(const rectangle &cliprect, int depth)
+void spg2xx_device::blit_sprites(const rectangle &cliprect, uint32_t scanline, int depth)
{
if (!(m_video_regs[0x42] & SPRITE_ENABLE_MASK))
{
@@ -427,13 +502,13 @@ void spg2xx_device::blit_sprites(const rectangle &cliprect, int depth)
#endif
for (uint32_t n = 0; n < m_sprite_limit; n++)
{
- blit_sprite(cliprect, depth, 0x2c00 + 4 * n);
+ blit_sprite(cliprect, scanline, depth, 4 * n);
}
#if SPG_DEBUG_VIDEO
}
else
{
- blit_sprite(cliprect, depth, 0x2c00 + 4 * m_sprite_index_to_debug);
+ blit_sprite(cliprect, scanline, depth, 4 * m_sprite_index_to_debug);
}
#endif
}
@@ -447,12 +522,13 @@ void spg2xx_device::apply_saturation(const rectangle &cliprect)
const float sat_adjust = (0xff - (m_video_regs[0x3c] & 0x00ff)) / (float)(0xff - 0x20);
for (int y = cliprect.min_y; y <= cliprect.max_y; y++)
{
- rgbtriad_t *src = &m_screenbuf[cliprect.min_x + 320 * y];
+ uint32_t *src = &m_screenbuf[cliprect.min_x + 320 * y];
for (int x = cliprect.min_x; x <= cliprect.max_x; x++)
{
- const float src_r = src->r * s_u8_to_float;
- const float src_g = src->g * s_u8_to_float;
- const float src_b = src->b * s_u8_to_float;
+ const uint32_t src_rgb = *src;
+ const float src_r = (uint8_t)(src_rgb >> 16) * s_u8_to_float;
+ const float src_g = (uint8_t)(src_rgb >> 8) * s_u8_to_float;
+ const float src_b = (uint8_t)(src_rgb >> 0) * s_u8_to_float;
const float luma = src_r * s_gray_r + src_g * s_gray_g + src_b * s_gray_b;
const float adjusted_r = luma + (src_r - luma) * sat_adjust;
const float adjusted_g = luma + (src_g - luma) * sat_adjust;
@@ -460,50 +536,55 @@ void spg2xx_device::apply_saturation(const rectangle &cliprect)
const int integer_r = (int)floor(adjusted_r * 255.0f);
const int integer_g = (int)floor(adjusted_g * 255.0f);
const int integer_b = (int)floor(adjusted_b * 255.0f);
- src->r = integer_r > 255 ? 255 : (integer_r < 0 ? 0 : (uint8_t)integer_r);
- src->g = integer_g > 255 ? 255 : (integer_g < 0 ? 0 : (uint8_t)integer_g);
- src->b = integer_b > 255 ? 255 : (integer_b < 0 ? 0 : (uint8_t)integer_b);
- src++;
+ *src++ = (integer_r > 255 ? 0xff0000 : (integer_r < 0 ? 0 : ((uint8_t)integer_r << 16))) |
+ (integer_g > 255 ? 0x00ff00 : (integer_g < 0 ? 0 : ((uint8_t)integer_g << 8))) |
+ (integer_b > 255 ? 0x0000ff : (integer_b < 0 ? 0 : (uint8_t)integer_b));
}
}
}
void spg2xx_device::apply_fade(const rectangle &cliprect)
{
- const uint16_t fade_offset = m_video_regs[0x30] << 1;
+ const uint16_t fade_offset = m_video_regs[0x30];
for (int y = cliprect.min_y; y <= cliprect.max_y; y++)
{
- rgbtriad_t *src = &m_screenbuf[cliprect.min_x + 320 * y];
+ uint32_t *src = &m_screenbuf[cliprect.min_x + 320 * y];
for (int x = cliprect.min_x; x <= cliprect.max_x; x++)
{
- const uint16_t r = (uint16_t)src->r - fade_offset;
- const uint16_t g = (uint16_t)src->g - fade_offset;
- const uint16_t b = (uint16_t)src->b - fade_offset;
- src->r = (r > src->r ? 0 : r);
- src->g = (g > src->g ? 0 : g);
- src->b = (b > src->b ? 0 : b);
- src++;
+ const uint32_t src_rgb = *src;
+ const uint8_t src_r = (src_rgb >> 16) & 0xff;
+ const uint8_t src_g = (src_rgb >> 8) & 0xff;
+ const uint8_t src_b = (src_rgb >> 0) & 0xff;
+ const uint8_t r = src_r - fade_offset;
+ const uint8_t g = src_g - fade_offset;
+ const uint8_t b = src_b - fade_offset;
+ *src++ = (r > src_r ? 0 : (r << 16)) |
+ (g > src_g ? 0 : (g << 8)) |
+ (b > src_b ? 0 : (b << 0));
}
}
}
uint32_t spg2xx_device::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect)
{
- memset(&m_screenbuf[320 * cliprect.min_y], 0, 3 * 320 * ((cliprect.max_y - cliprect.min_y) + 1));
+ memset(&m_screenbuf[320 * cliprect.min_y], 0, 4 * 320 * ((cliprect.max_y - cliprect.min_y) + 1));
const uint32_t page1_addr = 0x40 * m_video_regs[0x20];
const uint32_t page2_addr = 0x40 * m_video_regs[0x21];
uint16_t *page1_regs = m_video_regs + 0x10;
uint16_t *page2_regs = m_video_regs + 0x16;
- for (int i = 0; i < 4; i++)
+ for (uint32_t scanline = (uint32_t)cliprect.min_y; scanline <= (uint32_t)cliprect.max_y; scanline++)
{
- if (!m_hide_page0)
- blit_page(cliprect, i, page1_addr, page1_regs);
- if (!m_hide_page1)
- blit_page(cliprect, i, page2_addr, page2_regs);
- if (!m_hide_sprites)
- blit_sprites(cliprect, i);
+ for (int i = 0; i < 4; i++)
+ {
+ if (!SPG_DEBUG_VIDEO || !m_hide_page0)
+ blit_page(cliprect, scanline, i, page1_addr, page1_regs);
+ if (!SPG_DEBUG_VIDEO || !m_hide_page1)
+ blit_page(cliprect, scanline, i, page2_addr, page2_regs);
+ if (!SPG_DEBUG_VIDEO || !m_hide_sprites)
+ blit_sprites(cliprect, scanline, i);
+ }
}
if ((m_video_regs[0x3c] & 0x00ff) != 0x0020)
@@ -516,15 +597,30 @@ uint32_t spg2xx_device::screen_update(screen_device &screen, bitmap_rgb32 &bitma
apply_fade(cliprect);
}
- bitmap.fill(0, cliprect);
for (int y = cliprect.min_y; y <= cliprect.max_y; y++)
{
uint32_t *dest = &bitmap.pix32(y, cliprect.min_x);
- rgbtriad_t *src = &m_screenbuf[cliprect.min_x + 320 * y];
- for (int x = cliprect.min_x; x <= cliprect.max_x; x++)
+ uint32_t *src = &m_screenbuf[cliprect.min_x + 320 * y];
+ memcpy(dest, src, sizeof(uint32_t) * ((cliprect.max_x - cliprect.min_x) + 1));
+ }
+
+ if (SPG_DEBUG_VIDEO && m_debug_palette)
+ {
+ for (int y = cliprect.min_y; y <= cliprect.max_y && y < 128; y++)
{
- *dest++ = (src->r << 16) | (src->g << 8) | src->b;
- src++;
+ const uint16_t high_nybble = (y / 8) << 4;
+ uint32_t *dest = &bitmap.pix32(y, cliprect.min_x);
+ for (int x = cliprect.min_x; x <= cliprect.max_x && x < 256; x++)
+ {
+ const uint16_t low_nybble = x / 16;
+ const uint16_t palette_entry = high_nybble | low_nybble;
+ const uint16_t color = m_paletteram[palette_entry];
+ if (!(color & 0x8000))
+ {
+ *dest = m_rgb555_to_rgb888[color & 0x7fff];
+ }
+ dest++;
+ }
}
}
@@ -536,15 +632,22 @@ void spg2xx_device::do_sprite_dma(uint32_t len)
address_space &mem = m_cpu->space(AS_PROGRAM);
uint32_t src = m_video_regs[0x70] & 0x3fff;
- uint32_t dst = (m_video_regs[0x71] & 0x3ff) + 0x2c00;
+ uint32_t dst = m_video_regs[0x71];
for (uint32_t j = 0; j < len; j++)
{
- mem.write_word(dst + j, mem.read_word(src + j));
+ m_spriteram[(dst + j) & 0x3ff] = mem.read_word(src + j);
}
m_video_regs[0x72] = 0;
- VIDEO_IRQ_STATUS |= 4;
+ if (VIDEO_IRQ_ENABLE & 4)
+ {
+ const uint16_t old = VIDEO_IRQ_STATUS;
+ VIDEO_IRQ_STATUS |= 4;
+ const uint16_t changed = old ^ (VIDEO_IRQ_ENABLE & VIDEO_IRQ_STATUS);
+ if (changed)
+ check_video_irq();
+ }
}
READ16_MEMBER(spg2xx_device::video_r)
@@ -738,9 +841,12 @@ WRITE16_MEMBER(spg2xx_device::video_w)
break;
case 0x72: // Sprite DMA Length
+ {
LOGMASKED(LOG_DMA, "video_w: Sprite DMA Length = %04x\n", data & 0x03ff);
- do_sprite_dma(data & 0x3ff);
+ uint16_t length = data & 0x3ff;
+ do_sprite_dma(length ? length : 0x400);
break;
+ }
default:
LOGMASKED(LOG_UNKNOWN_PPU, "video_w: Unknown register %04x = %04x\n", 0x2800 + offset, data);
@@ -752,7 +858,12 @@ WRITE16_MEMBER(spg2xx_device::video_w)
WRITE_LINE_MEMBER(spg2xx_device::vblank)
{
if (!state)
+ {
+ VIDEO_IRQ_STATUS &= ~1;
+ LOGMASKED(LOG_IRQS, "Setting video IRQ status to %04x\n", VIDEO_IRQ_STATUS);
+ check_video_irq();
return;
+ }
#if SPG_DEBUG_VIDEO
if (machine().input().code_pressed_once(KEYCODE_5))
@@ -767,38 +878,22 @@ WRITE_LINE_MEMBER(spg2xx_device::vblank)
m_sprite_index_to_debug--;
if (machine().input().code_pressed_once(KEYCODE_0))
m_sprite_index_to_debug++;
+ if (machine().input().code_pressed_once(KEYCODE_L))
+ m_debug_palette = !m_debug_palette;
#endif
-#if SPG_DEBUG_AUDIO
- if (machine().input().code_pressed_once(KEYCODE_3))
- m_debug_samples = !m_debug_samples;
- if (machine().input().code_pressed_once(KEYCODE_4))
- m_debug_rates = !m_debug_rates;
- if (machine().input().code_pressed_once(KEYCODE_1))
+ if (VIDEO_IRQ_ENABLE & 1)
{
- m_channel_debug--;
- if (m_channel_debug < -1)
- m_channel_debug = 15;
- }
- if (machine().input().code_pressed_once(KEYCODE_2))
- {
- m_channel_debug++;
- if (m_channel_debug == 16)
- m_channel_debug = -1;
- }
-#endif
-
- const uint16_t old = VIDEO_IRQ_ENABLE & VIDEO_IRQ_STATUS;
- VIDEO_IRQ_STATUS |= 1;
- LOGMASKED(LOG_IRQS, "Setting video IRQ status to %04x\n", VIDEO_IRQ_STATUS);
- const uint16_t changed = old ^ (VIDEO_IRQ_ENABLE & VIDEO_IRQ_STATUS);
- if (changed)
+ VIDEO_IRQ_STATUS |= 1;
+ LOGMASKED(LOG_IRQS, "Setting video IRQ status to %04x\n", VIDEO_IRQ_STATUS);
check_video_irq();
+ }
}
void spg2xx_device::check_video_irq()
{
- m_cpu->set_input_line(UNSP_IRQ0_LINE, (VIDEO_IRQ_STATUS & VIDEO_IRQ_ENABLE) ? ASSERT_LINE : CLEAR_LINE);
+ LOGMASKED(LOG_IRQS, "%ssserting IRQ0 (%04x, %04x)\n", (VIDEO_IRQ_STATUS & VIDEO_IRQ_ENABLE) ? "A" : "Dea", VIDEO_IRQ_STATUS, VIDEO_IRQ_ENABLE);
+ m_cpu->set_state_unsynced(UNSP_IRQ0_LINE, (VIDEO_IRQ_STATUS & VIDEO_IRQ_ENABLE) ? ASSERT_LINE : CLEAR_LINE);
}
@@ -806,588 +901,66 @@ void spg2xx_device::check_video_irq()
* Machine Hardware *
*************************/
-void spg2xx_device::uart_rx(uint8_t data)
+READ16_MEMBER(spg2xx_device::dma_r)
{
- if (!m_uart_rx_available)
- {
- if (BIT(m_io_regs[0x30], 6))
- {
- m_io_regs[0x36] = data;
- if (BIT(m_io_regs[0x30], 0))
- {
- IO_IRQ_STATUS |= 0x0100;
- check_irqs(0x0100);
- }
- m_uart_rx_available = true;
- }
- }
- else if (m_uart_rx_fifo_count == ARRAY_LENGTH(m_uart_rx_fifo))
- {
- m_io_regs[0x37] |= 0x4000;
- }
- else
- {
- m_uart_rx_fifo[m_uart_rx_fifo_end] = data;
- m_uart_rx_fifo_end = (m_uart_rx_fifo_end + 1) % ARRAY_LENGTH(m_uart_rx_fifo);
- m_uart_rx_fifo_count++;
- }
-}
-
-READ16_MEMBER(spg2xx_device::io_r)
-{
- static const char *const gpioregs[] = { "GPIO Data Port", "GPIO Buffer Port", "GPIO Direction Port", "GPIO Attribute Port", "GPIO IRQ/Latch Port" };
- static const char gpioports[] = { 'A', 'B', 'C' };
-
- uint16_t val = m_io_regs[offset];
-
+ uint16_t val = m_dma_regs[offset];
switch (offset)
{
- case 0x01: case 0x06: case 0x0b: // GPIO Data Port A/B/C
- do_gpio(offset);
- LOGMASKED(LOG_GPIO, "io_r: %s %c = %04x\n", gpioregs[(offset - 1) % 5], gpioports[(offset - 1) / 5], m_io_regs[offset]);
- val = m_io_regs[offset];
- break;
-
- case 0x02: case 0x03: case 0x04: case 0x05:
- case 0x07: case 0x08: case 0x09: case 0x0a:
- case 0x0c: case 0x0d: case 0x0e: case 0x0f: // Other GPIO regs
- LOGMASKED(LOG_GPIO, "io_r: %s %c = %04x\n", gpioregs[(offset - 1) % 5], gpioports[(offset - 1) / 5], m_io_regs[offset]);
- break;
-
- case 0x10: // Timebase Control
- LOGMASKED(LOG_IO_READS, "io_r: Timebase Control = %04x\n", val);
- break;
- case 0x1c: // Video line counter
- val = m_screen->vpos();
- LOGMASKED(LOG_VLINES, "io_r: Video Line = %04x\n", val);
+ case 0x000: // DMA Source (L)
+ LOGMASKED(LOG_DMA, "dma_r: DMA Source (lo) = %04x\n", val);
break;
- case 0x20: // System Control
- LOGMASKED(LOG_IO_READS, "io_r: System Control = %04x\n", val);
+ case 0x001: // DMA Source (H)
+ LOGMASKED(LOG_DMA, "dma_r: DMA Source (hi) = %04x\n", val);
break;
- case 0x21: // IRQ Control
- LOGMASKED(LOG_IRQS, "io_r: I/O IRQ Control = %04x\n", val);
- break;
-
- case 0x22: // IRQ Status
- LOGMASKED(LOG_IRQS, "io_r: I/O IRQ Status = %04x\n", val);
- break;
-
- case 0x23: // External Memory Control
- LOGMASKED(LOG_IO_READS, "io_r: Ext. Memory Control = %04x\n", val);
- break;
-
- case 0x25: // ADC Control
- LOGMASKED(LOG_IO_READS, "io_r: ADC Control = %04x\n", val);
- break;
-
- case 0x27: // ADC Data
- m_io_regs[0x27] = 0;
- LOGMASKED(LOG_IO_READS, "io_r: ADC Data = %04x\n", val);
- break;
-
- case 0x29: // Wakeup Source
- LOGMASKED(LOG_IO_READS, "io_r: Wakeup Source = %04x\n", val);
- break;
-
- case 0x2b:
- LOGMASKED(LOG_IO_READS, "io_r: NTSC/PAL = %04x\n", m_pal_flag);
- return m_pal_flag;
-
- case 0x2c: case 0x2d: // PRNG 0/1
- val = machine().rand() & 0x0000ffff;
- LOGMASKED(LOG_IO_READS, "io_r: PRNG %d = %04x\n", offset - 0x2c, val);
- break;
-
- case 0x2e: // FIQ Source Select
- LOGMASKED(LOG_IRQS, "io_r: FIQ Source Select = %04x\n", val);
- break;
-
- case 0x2f: // Data Segment
- val = m_cpu->state_int(UNSP_SR) >> 10;
- LOGMASKED(LOG_SEGMENT, "io_r: Data Segment = %04x\n", val);
- break;
-
- case 0x31: // UART Status
- val |= (m_uart_rx_available ? 0x81 : 0);
- LOGMASKED(LOG_UART, "io_r: UART Status = %04x\n", val);
- break;
-
- case 0x36: // UART RX Data
- if (m_uart_rx_available)
- {
- if (m_uart_rx_fifo_count)
- {
- m_io_regs[0x36] = m_uart_rx_fifo[m_uart_rx_fifo_start];
- m_uart_rx_fifo_start = (m_uart_rx_fifo_start + 1) % ARRAY_LENGTH(m_uart_rx_fifo);
- m_uart_rx_fifo_count--;
- }
- else
- {
- m_uart_rx_available = false;
- }
- }
- else
- {
- m_io_regs[0x37] |= 0x2000;
- }
- LOGMASKED(LOG_UART, "%s: io_r: UART Rx Data = %04x\n", machine().describe_context(), val);
- break;
-
- case 0x37: // UART Rx FIFO Control
- val &= ~0x0070;
- val |= (m_uart_rx_available ? 7 : 0) << 4;
- LOGMASKED(LOG_UART, "io_r: UART Rx FIFO Control = %04x\n", val);
- break;
-
- case 0x59: // I2C Status
- LOGMASKED(LOG_I2C, "io_r: I2C Status = %04x\n", val);
- break;
-
- case 0x5e: // I2C Data In
- LOGMASKED(LOG_I2C, "io_r: I2C Data In = %04x\n", val);
- break;
-
- case 0x100: // DMA Source (L)
- LOGMASKED(LOG_DMA, "io_r: DMA Source (lo) = %04x\n", val);
- break;
-
- case 0x101: // DMA Source (H)
- LOGMASKED(LOG_DMA, "io_r: DMA Source (hi) = %04x\n", val);
- break;
-
- case 0x102: // DMA Length
- LOGMASKED(LOG_DMA, "io_r: DMA Length = %04x\n", 0);
+ case 0x002: // DMA Length
+ LOGMASKED(LOG_DMA, "dma_r: DMA Length = %04x\n", 0);
val = 0;
break;
- case 0x103: // DMA Destination
- LOGMASKED(LOG_DMA, "io_r: DMA Dest = %04x\n", val);
+ case 0x003: // DMA Destination
+ LOGMASKED(LOG_DMA, "dma_r: DMA Dest = %04x\n", val);
break;
default:
- LOGMASKED(LOG_UNKNOWN_IO, "io_r: Unknown register %04x\n", 0x3d00 + offset);
+ LOGMASKED(LOG_UNKNOWN_IO, "dma_r: Unknown register %04x\n", 0x3d00 + offset);
break;
}
return val;
}
-void spg2xx_device::update_porta_special_modes()
-{
- static const char* const s_pa_special[4][16] =
- {
- // Input, Special 0
- // Input, Special 1
- // Output, Special 0
- // Output, Special 1
-
- { "LP", "ExtClk2", "ExtClk1", "-", "SDA", "SlvRDY", "-", "-", "SPICLK", "-", "RxD", "SPISSB", "-", "-", "-", "-" },
- { "-", "-", "-", "SCK", "-", "SWS", "-", "-", "-", "-", "-", "-", "IRQ2B", "-", "-", "IRQ1B" },
- { "-", "-", "-", "SCK", "SDA", "SWS", "-", "-", "SPICLK", "TxD", "-", "SPISSB", "TAPWM", "TM1", "TBPWM", "TM2" },
- { "CSB3", "CSB2", "CSB1", "SCK", "SDA", "VSYNC", "HSYNC", "SYSCLK3", "SPICLK", "TxD", "SWS", "SPISSB", "-", "VSYNC", "HSYNC", "CSYNC" },
- };
- for (int bit = 15; bit >= 0; bit--)
- {
- if (!BIT(m_io_regs[0x05], bit))
- continue;
- uint8_t type = (BIT(m_io_regs[0x03], bit) << 1) | BIT(m_io_regs[0x00], 0);
- LOGMASKED(LOG_GPIO, " Bit %2d: %s\n", bit, s_pa_special[type][bit]);
- }
-}
-
-void spg2xx_device::update_portb_special_modes()
-{
- static const char* const s_pb_special[4][8] =
- {
- // Input, Special 0
- // Input, Special 1
- // Output, Special 0
- // Output, Special 1
-
- { "-", "-", "-", "-", "-", "-", "SDA", "SlvRDY" },
- { "-", "-", "-", "-", "-", "-", "SDA", "SlvRDY" },
- { "VSYNC", "HSYNC", "CSYNC", "-", "-", "SCK", "SDA", "SWS" },
- { "CSB3", "CSB2", "CSB1", "TBPWM", "TM2", "-", "-", "SYSCLK2" },
- };
- for (int bit = 7; bit >= 0; bit--)
- {
- if (!BIT(m_io_regs[0x0a], bit))
- continue;
- uint8_t type = (BIT(m_io_regs[0x08], bit) << 1) | BIT(m_io_regs[0x00], 1);
- LOGMASKED(LOG_GPIO, " Bit %2d: %s\n", bit, s_pb_special[type][bit]);
- }
-}
-WRITE16_MEMBER(spg2xx_device::io_w)
+WRITE16_MEMBER(spg2xx_device::dma_w)
{
- static const char *const gpioregs[] = { "GPIO Data Port", "GPIO Buffer Port", "GPIO Direction Port", "GPIO Attribute Port", "GPIO IRQ/Latch Port" };
- static const char gpioports[3] = { 'A', 'B', 'C' };
-
switch (offset)
{
- case 0x00: // GPIO special function select
- {
- LOGMASKED(LOG_GPIO, "io_w: GPIO Configuration = %04x (IOBWake:%d, IOAWake:%d, IOBSpecSel:%d, IOASpecSel:%d)\n", data
- , BIT(data, 4), BIT(data, 3), BIT(data, 1), BIT(data, 0));
- const uint16_t old = m_io_regs[offset];
- m_io_regs[offset] = data;
- const uint16_t changed = old ^ data;
- if (BIT(changed, 0))
- update_porta_special_modes();
- if (BIT(changed, 1))
- update_portb_special_modes();
+ case 0x000: // DMA Source (lo)
+ LOGMASKED(LOG_DMA, "dma_w: DMA Source (lo) = %04x\n", data);
+ m_dma_regs[offset] = data;
break;
- }
- case 0x01: case 0x06: case 0x0b: // GPIO data, port A/B/C
- offset++;
- // Intentional fallthrough - we redirect data register writes to the buffer register.
-
- case 0x02: case 0x04: // Port A
- case 0x07: case 0x09: // Port B
- case 0x0c: case 0x0d: case 0x0e: case 0x0f: // Port C
- LOGMASKED(LOG_GPIO, "io_w: %s %c = %04x\n", gpioregs[(offset - 1) % 5], gpioports[(offset - 1) / 5], data);
- m_io_regs[offset] = data;
- do_gpio(offset);
- break;
-
- case 0x03: // Port A Direction
- LOGMASKED(LOG_GPIO, "io_w: GPIO Direction Port A = %04x\n", data);
- m_io_regs[offset] = data;
- update_porta_special_modes();
- do_gpio(offset);
+ case 0x001: // DMA Source (hi)
+ LOGMASKED(LOG_DMA, "dma_w: DMA Source (hi) = %04x\n", data);
+ m_dma_regs[offset] = data;
break;
- case 0x08: // Port B Direction
- LOGMASKED(LOG_GPIO, "io_w: GPIO Direction Port B = %04x\n", data);
- m_io_regs[offset] = data;
- update_portb_special_modes();
- do_gpio(offset);
+ case 0x002: // DMA Length
+ LOGMASKED(LOG_DMA, "dma_w: DMA Length = %04x\n", data);
+ if (!(data & 0xc000)) // jak_dora writes 0xffff here which ends up trashing registers etc. why? such writes can't be valid
+ do_cpu_dma(data);
break;
- case 0x05: // Port A Special
- LOGMASKED(LOG_GPIO, "io_w: Port A Special Function Select: %04x\n", data);
- m_io_regs[offset] = data;
- update_porta_special_modes();
- break;
-
- case 0x0a: // Port B Special
- LOGMASKED(LOG_GPIO, "io_w: Port B Special Function Select: %04x\n", data);
- m_io_regs[offset] = data;
- update_portb_special_modes();
- break;
-
- case 0x10: // Timebase Control
- {
- static const char* const s_tmb1_sel[2][4] =
- {
- { "8Hz", "16Hz", "32Hz", "64Hz" },
- { "12kHz", "24kHz", "40kHz", "40kHz" }
- };
- static const char* const s_tmb2_sel[2][4] =
- {
- { "128Hz", "256Hz", "512Hz", "1024Hz" },
- { "105kHz", "210kHz", "420kHz", "840kHz" }
- };
- static const uint32_t s_tmb1_freq[2][4] =
- {
- { 8, 16, 32, 64 },
- { 12000, 24000, 40000, 40000 }
- };
- static const uint32_t s_tmb2_freq[2][4] =
- {
- { 128, 256, 512, 1024 },
- { 105000, 210000, 420000, 840000 }
- };
- LOGMASKED(LOG_IO_WRITES, "io_w: Timebase Control = %04x (Source:%s, TMB2:%s, TMB1:%s)\n", data,
- BIT(data, 4) ? "27MHz" : "32768Hz", s_tmb2_sel[BIT(data, 4)][(data >> 2) & 3], s_tmb1_sel[BIT(data, 4)][data & 3]);
- const uint16_t old = m_io_regs[offset];
- m_io_regs[offset] = data;
- const uint16_t changed = old ^ m_io_regs[offset];
- if (changed & 0x001f)
- {
- const uint8_t hifreq = BIT(data, 4);
- if (changed & 0x0013)
- {
- const uint32_t freq = s_tmb1_freq[hifreq][data & 3];
- m_tmb1->adjust(attotime::from_hz(freq), 0, attotime::from_hz(freq));
- }
- if (changed & 0x001c)
- {
- const uint32_t freq = s_tmb2_freq[hifreq][(data >> 2) & 3];
- m_tmb2->adjust(attotime::from_hz(freq), 0, attotime::from_hz(freq));
- }
- }
- break;
- }
-
- case 0x11: // Timebase Clear
- LOGMASKED(LOG_IO_WRITES, "io_w: Timebase Clear = %04x\n", data);
- break;
-
- case 0x20: // System Control
- {
- static const char* const s_sysclk[4] = { "13.5MHz", "27MHz", "27MHz NoICE", "54MHz" };
- static const char* const s_lvd_voltage[4] = { "2.7V", "2.9V", "3.1V", "3.3V" };
- static const char* const s_weak_strong[2] = { "Weak", "Strong" };
- LOGMASKED(LOG_IO_WRITES, "io_w: System Control = %04x (Watchdog:%d, Sleep:%d, SysClk:%s, SysClkInv:%d, LVROutEn:%d, LVREn:%d\n"
- , data, BIT(data, 15), BIT(data, 14), s_sysclk[(data >> 12) & 3], BIT(data, 11), BIT(data, 9), BIT(data, 8));
- LOGMASKED(LOG_IO_WRITES, " LVDEn:%d, LVDVoltSel:%s, 32kHzDisable:%d, StrWkMode:%s, VDACDisable:%d, ADACDisable:%d, ADACOutDisable:%d)\n"
- , BIT(data, 7), s_lvd_voltage[(data >> 5) & 3], BIT(data, 4), s_weak_strong[BIT(data, 3)], BIT(data, 2), BIT(data, 1), BIT(data, 0));
- m_io_regs[offset] = data;
- break;
- }
-
- case 0x21: // IRQ Enable
- {
- LOGMASKED(LOG_IRQS, "io_w: IRQ Enable = %04x\n", data);
- const uint16_t old = IO_IRQ_ENABLE & IO_IRQ_STATUS;
- m_io_regs[offset] = data;
- const uint16_t changed = old ^ (IO_IRQ_ENABLE & IO_IRQ_STATUS);
- if (changed)
- check_irqs(changed);
- break;
- }
-
- case 0x22: // IRQ Acknowledge
- {
- LOGMASKED(LOG_IRQS, "io_w: IRQ Acknowledge = %04x\n", data);
- const uint16_t old = IO_IRQ_STATUS;
- IO_IRQ_STATUS &= ~data;
- const uint16_t changed = old ^ (IO_IRQ_ENABLE & IO_IRQ_STATUS);
- if (changed)
- check_irqs(changed);
- break;
- }
-
- case 0x23: // External Memory Control
- {
- static const char* const s_bus_arb[8] =
- {
- "Forbidden", "Forbidden", "Forbidden", "Forbidden", "Forbidden", "1:SPU/2:PPU/3:CPU", "Forbidden", "1:PPU/2:SPU/3:CPU"
- };
- static const char* const s_addr_decode[4] =
- {
- "ROMCSB: 4000-3fffff, CSB1: ---, CSB2: ---, CSB3: ---",
- "ROMCSB: 4000-1fffff, CSB1: 200000-3fffff, CSB2: ---, CSB3: ---",
- "ROMCSB: 4000-0fffff, CSB1: 100000-1fffff, CSB2: 200000-2fffff, CSB3: 300000-3fffff",
- "ROMCSB: 4000-0fffff, CSB1: 100000-1fffff, CSB2: 200000-2fffff, CSB3: 300000-3fffff"
- };
- static const char* const s_ram_decode[16] =
- {
- "None", "None", "None", "None", "None", "None", "None", "None",
- "4KW, 3ff000-3fffff\n",
- "8KW, 3fe000-3fffff\n",
- "16KW, 3fc000-3fffff\n",
- "32KW, 3f8000-3fffff\n",
- "64KW, 3f0000-3fffff\n",
- "128KW, 3e0000-3fffff\n",
- "256KW, 3c0000-3fffff\n",
- "512KW, 380000-3fffff\n"
- };
- LOGMASKED(LOG_IO_WRITES, "io_w: Ext. Memory Control (not yet implemented) = %04x:\n", data);
- LOGMASKED(LOG_IO_WRITES, " WaitStates:%d, BusArbPrio:%s\n", (data >> 1) & 3, s_bus_arb[(data >> 3) & 7]);
- LOGMASKED(LOG_IO_WRITES, " ROMAddrDecode:%s\n", s_addr_decode[(data >> 6) & 3]);
- LOGMASKED(LOG_IO_WRITES, " RAMAddrDecode:%s\n", s_ram_decode[(data >> 8) & 15]);
- m_chip_sel((data >> 6) & 3);
- m_io_regs[offset] = data;
- break;
- }
-
- case 0x24: // Watchdog
- LOGMASKED(LOG_WATCHDOG, "io_w: Watchdog Pet = %04x\n", data);
- break;
-
- case 0x25: // ADC Control
- {
- LOGMASKED(LOG_IO_WRITES, "io_w: ADC Control = %04x\n", data);
- //const uint16_t changed = m_io_regs[offset] ^ data;
- m_io_regs[offset] = data;
- //if (BIT(changed, 12) && BIT(data, 12) && !BIT(m_io_regs[offset], 1))
- {
- //m_io_regs[0x27] = 0x80ff;
- //const uint16_t old = IO_IRQ_STATUS;
- //IO_IRQ_STATUS |= 0x2000;
- //const uint16_t changed = IO_IRQ_STATUS ^ old;
- //if (changed)
- //check_irqs(changed);
- }
- break;
- }
-
- case 0x28: // Sleep Mode
- LOGMASKED(LOG_IO_WRITES, "io_w: Sleep Mode (%s enter value) = %04x\n", data == 0xaa55 ? "valid" : "invalid", data);
- m_io_regs[offset] = data;
- break;
-
- case 0x29: // Wakeup Source
- {
- m_io_regs[offset] = data;
- static const char* const s_sources[8] =
- {
- "TMB1", "TMB2", "2Hz", "4Hz", "1024Hz", "2048Hz", "4096Hz", "Key"
- };
-
- LOGMASKED(LOG_IO_WRITES, "io_w: Wakeup Source = %04x:\n", data);
- bool comma = false;
- char buf[1024];
- int char_idx = 0;
- for (int i = 7; i >= 0; i--)
- {
- if (BIT(data, i))
- {
- char_idx += sprintf(&buf[char_idx], "%s%s", comma ? ", " : "", s_sources[i]);
- comma = true;
- }
- }
- buf[char_idx] = 0;
- LOGMASKED(LOG_IO_WRITES, " %s\n", buf);
- break;
- }
-
- case 0x2e: // FIQ Source Select
- {
- static const char* const s_fiq_select[8] =
- {
- "PPU", "SPU Channel", "Timer A", "Timer B", "UART/SPI", "External", "Reserved", "None"
- };
- LOGMASKED(LOG_IRQS, "io_w: FIQ Source Select (not yet implemented) = %04x, %s\n", data, s_fiq_select[data & 7]);
- m_io_regs[offset] = data;
- break;
- }
-
- case 0x2f: // Data Segment
- {
- uint16_t ds = m_cpu->state_int(UNSP_SR);
- m_cpu->set_state_int(UNSP_SR, (ds & 0x03ff) | ((data & 0x3f) << 10));
- LOGMASKED(LOG_SEGMENT, "io_w: Data Segment = %04x\n", data);
- break;
- }
-
- case 0x30: // UART Control
- {
- static const char* const s_9th_bit[4] = { "0", "1", "Odd", "Even" };
- LOGMASKED(LOG_UART, "io_w: UART Control = %04x (TxEn:%d, RxEn:%d, Bits:%d, MultiProc:%d, 9thBit:%s, TxIntEn:%d, RxIntEn:%d\n", data
- , BIT(data, 7), BIT(data, 6), BIT(data, 5) ? 9 : 8, BIT(data, 4), s_9th_bit[(data >> 2) & 3], BIT(data, 1), BIT(data, 0));
- const uint16_t changed = m_io_regs[offset] ^ data;
- m_io_regs[offset] = data;
- if (!BIT(data, 6))
- {
- m_uart_rx_available = false;
- m_io_regs[0x36] = 0;
- }
- if (BIT(changed, 7) && BIT(data, 7))
- {
- m_io_regs[0x31] |= 0x0002;
- }
- break;
- }
-
- case 0x31: // UART Status
- LOGMASKED(LOG_UART, "io_w: UART Status = %04x\n", data);
- m_io_regs[offset] &= ~data;
- break;
-
- case 0x33: // UART Baud Rate (low byte)
- case 0x34: // UART Baud Rate (high byte)
- {
- m_io_regs[offset] = data;
- const uint32_t divisor = 16 * (0x10000 - ((m_io_regs[0x34] << 8) | m_io_regs[0x33]));
- LOGMASKED(LOG_UART, "io_w: UART Baud Rate (%s byte): Baud rate = %d\n", offset == 0x33 ? "low" : "high", 27000000 / divisor);
- break;
- }
-
- case 0x35: // UART TX Data
- LOGMASKED(LOG_UART, "io_w: UART Tx Data = %02x\n", data & 0x00ff);
- m_io_regs[offset] = data;
- m_uart_tx((uint8_t)data);
- m_io_regs[0x31] |= 2;
- break;
-
- case 0x36: // UART RX Data
- LOGMASKED(LOG_UART, "io_w: UART Rx Data (read-only) = %04x\n", data);
- break;
-
- case 0x37: // UART Rx FIFO Control
- LOGMASKED(LOG_UART, "io_w: UART Rx FIFO Control = %04x (Reset:%d, Overrun:%d, Underrun:%d, Count:%d, Threshold:%d)\n", data
- , BIT(data, 15), BIT(data, 14), BIT(data, 13), (data >> 4) & 7, data & 7);
- if (data & 0x8000)
- {
- m_uart_rx_available = false;
- m_io_regs[0x36] = 0;
- }
- m_io_regs[offset] &= ~data & 0x6000;
- m_io_regs[offset] &= ~0x0007;
- m_io_regs[offset] |= data & 0x0007;
- break;
-
- case 0x58: // I2C Command
- LOGMASKED(LOG_I2C, "io_w: I2C Command = %04x\n", data);
- m_io_regs[offset] = data;
- do_i2c();
- break;
-
- case 0x59: // I2C Status / Acknowledge
- LOGMASKED(LOG_I2C, "io_w: I2C Acknowledge = %04x\n", data);
- m_io_regs[offset] &= ~data;
- break;
-
- case 0x5a: // I2C Access Mode
- LOGMASKED(LOG_I2C, "io_w: I2C Access Mode = %04x\n", data);
- m_io_regs[offset] = data;
- break;
-
- case 0x5b: // I2C Device Address
- LOGMASKED(LOG_I2C, "io_w: I2C Device Address = %04x\n", data);
- m_io_regs[offset] = data;
- break;
-
- case 0x5c: // I2C Sub-Address
- LOGMASKED(LOG_I2C, "io_w: I2C Sub-Address = %04x\n", data);
- m_io_regs[offset] = data;
- break;
-
- case 0x5d: // I2C Data Out
- LOGMASKED(LOG_I2C, "io_w: I2C Data Out = %04x\n", data);
- m_io_regs[offset] = data;
- break;
-
- case 0x5e: // I2C Data In
- LOGMASKED(LOG_I2C, "io_w: I2C Data In = %04x\n", data);
- m_io_regs[offset] = data;
- break;
-
- case 0x5f: // I2C Controller Mode
- LOGMASKED(LOG_I2C, "io_w: I2C Controller Mode = %04x\n", data);
- m_io_regs[offset] = data;
- break;
-
- case 0x100: // DMA Source (lo)
- LOGMASKED(LOG_DMA, "io_w: DMA Source (lo) = %04x\n", data);
- m_io_regs[offset] = data;
- break;
-
- case 0x101: // DMA Source (hi)
- LOGMASKED(LOG_DMA, "io_w: DMA Source (hi) = %04x\n", data);
- m_io_regs[offset] = data;
- break;
-
- case 0x103: // DMA Destination
- LOGMASKED(LOG_DMA, "io_w: DMA Dest = %04x\n", data);
- m_io_regs[offset] = data;
- break;
-
- case 0x102: // DMA Length
- LOGMASKED(LOG_DMA, "io_w: DMA Length = %04x\n", data);
- do_cpu_dma(data);
+ case 0x003: // DMA Destination
+ LOGMASKED(LOG_DMA, "dma_w: DMA Dest = %04x\n", data);
+ m_dma_regs[offset] = data;
break;
default:
- LOGMASKED(LOG_UNKNOWN_IO, "io_w: Unknown register %04x = %04x\n", 0x3d00 + offset, data);
- m_io_regs[offset] = data;
+ LOGMASKED(LOG_UNKNOWN_IO, "dma_w: Unknown register %04x = %04x\n", 0x3d00 + offset, data);
+ m_dma_regs[offset] = data;
break;
}
}
@@ -1396,145 +969,29 @@ void spg2xx_device::device_timer(emu_timer &timer, device_timer_id id, int param
{
switch (id)
{
- case TIMER_TMB1:
- {
- LOGMASKED(LOG_TIMERS, "TMB1 elapsed, setting IRQ Status bit 0 (old:%04x, new:%04x, enable:%04x)\n", IO_IRQ_STATUS, IO_IRQ_STATUS | 1, IO_IRQ_ENABLE);
- IO_IRQ_STATUS |= 1;
- check_irqs(0x0001);
- break;
- }
-
- case TIMER_TMB2:
- {
- LOGMASKED(LOG_TIMERS, "TMB2 elapsed, setting IRQ Status bit 1 (old:%04x, new:%04x, enable:%04x)\n", IO_IRQ_STATUS, IO_IRQ_STATUS | 2, IO_IRQ_ENABLE);
- IO_IRQ_STATUS |= 2;
- check_irqs(0x0002);
- break;
- }
-
case TIMER_SCREENPOS:
{
- const uint16_t old = VIDEO_IRQ_ENABLE & VIDEO_IRQ_STATUS;
- VIDEO_IRQ_STATUS |= 2;
- const uint16_t changed = old ^ (VIDEO_IRQ_ENABLE & VIDEO_IRQ_STATUS);
- if (changed)
+ if (VIDEO_IRQ_ENABLE & 2)
{
+ VIDEO_IRQ_STATUS |= 2;
check_video_irq();
}
m_screen->update_partial(m_screen->vpos());
- break;
- }
- case TIMER_BEAT:
- {
- audio_frame_tick();
+ // fire again, jak_dbz pinball needs this
+ m_screenpos_timer->adjust(m_screen->time_until_pos(m_video_regs[0x36], m_video_regs[0x37] << 1));
break;
}
}
}
-void spg2xx_device::check_irqs(const uint16_t changed)
-{
- // {
- // m_cpu->set_input_line(UNSP_IRQ1_LINE, ASSERT_LINE);
- // }
-
- if (changed & 0x0c00) // Timer A, Timer B IRQ
- {
- LOGMASKED(LOG_IRQS, "%ssserting IRQ2 (%04x)\n", (IO_IRQ_ENABLE & IO_IRQ_STATUS & 0x008b) ? "A" : "Dea", (IO_IRQ_ENABLE & IO_IRQ_STATUS & 0x008b));
- m_cpu->set_input_line(UNSP_IRQ2_LINE, (IO_IRQ_ENABLE & IO_IRQ_STATUS & 0x0c00) ? ASSERT_LINE : CLEAR_LINE);
- }
-
- if (changed & 0x2100) // UART, ADC IRQ
- {
- LOGMASKED(LOG_IRQS, "%ssserting IRQ3 (%04x)\n", (IO_IRQ_ENABLE & IO_IRQ_STATUS & 0x008b) ? "A" : "Dea", (IO_IRQ_ENABLE & IO_IRQ_STATUS & 0x008b));
- m_cpu->set_input_line(UNSP_IRQ3_LINE, (IO_IRQ_ENABLE & IO_IRQ_STATUS & 0x2100) ? ASSERT_LINE : CLEAR_LINE);
- }
-
- if (changed & (AUDIO_BIS_MASK | AUDIO_BIE_MASK)) // Beat IRQ
- {
- if ((m_audio_regs[AUDIO_BEAT_COUNT] & (AUDIO_BIS_MASK | AUDIO_BIE_MASK)) == (AUDIO_BIS_MASK | AUDIO_BIE_MASK))
- {
- LOGMASKED(LOG_BEAT, "Asserting beat IRQ\n");
- m_cpu->set_input_line(UNSP_IRQ4_LINE, ASSERT_LINE);
- }
- else
- {
- LOGMASKED(LOG_BEAT, "Clearing beat IRQ\n");
- m_cpu->set_input_line(UNSP_IRQ4_LINE, CLEAR_LINE);
- }
- }
-
- if (changed & 0x1200) // External IRQ
- {
- LOGMASKED(LOG_IRQS, "%ssserting IRQ5 (%04x)\n", (IO_IRQ_ENABLE & IO_IRQ_STATUS & 0x008b) ? "A" : "Dea", (IO_IRQ_ENABLE & IO_IRQ_STATUS & 0x008b));
- m_cpu->set_input_line(UNSP_IRQ5_LINE, (IO_IRQ_ENABLE & IO_IRQ_STATUS & 0x1200) ? ASSERT_LINE : CLEAR_LINE);
- }
-
- if (changed & 0x0070) // 1024Hz, 2048Hz, 4096Hz IRQ
- {
- LOGMASKED(LOG_IRQS, "%ssserting IRQ6 (%04x)\n", (IO_IRQ_ENABLE & IO_IRQ_STATUS & 0x008b) ? "A" : "Dea", (IO_IRQ_ENABLE & IO_IRQ_STATUS & 0x008b));
- m_cpu->set_input_line(UNSP_IRQ6_LINE, (IO_IRQ_ENABLE & IO_IRQ_STATUS & 0x0070) ? ASSERT_LINE : CLEAR_LINE);
- }
-
- if (changed & 0x008b) // TMB1, TMB2, 4Hz, key change IRQ
- {
- LOGMASKED(LOG_IRQS, "%ssserting IRQ7 (%04x)\n", (IO_IRQ_ENABLE & IO_IRQ_STATUS & 0x008b) ? "A" : "Dea", (IO_IRQ_ENABLE & IO_IRQ_STATUS & 0x008b));
- m_cpu->set_input_line(UNSP_IRQ7_LINE, (IO_IRQ_ENABLE & IO_IRQ_STATUS & 0x008b) ? ASSERT_LINE : CLEAR_LINE);
- }
-}
-
-void spg2xx_device::do_gpio(uint32_t offset)
-{
- uint32_t index = (offset - 1) / 5;
- uint16_t buffer = m_io_regs[5 * index + 2];
- uint16_t dir = m_io_regs[5 * index + 3];
- uint16_t attr = m_io_regs[5 * index + 4];
- uint16_t special = m_io_regs[5 * index + 5];
-
- uint16_t push = dir;
- uint16_t pull = (~dir) & (~attr);
- uint16_t what = (buffer & (push | pull));
- what ^= (dir & ~attr);
- what &= ~special;
-
- switch (index)
- {
- case 0:
- m_porta_out(0, what, push &~ special);
- what = (what & ~pull) | (m_porta_in(0, pull &~ special) & pull);
- break;
- case 1:
- m_portb_out(0, what, push &~ special);
- what = (what & ~pull) | (m_portb_in(0, pull &~ special) & pull);
- break;
- case 2:
- m_portc_out(0, what, push &~ special);
- what = (what & ~pull) | (m_portc_in(0, pull &~ special) & pull);
- break;
- }
-
- m_io_regs[5 * index + 1] = what;
-}
-
-void spg2xx_device::do_i2c()
-{
- const uint16_t addr = ((m_io_regs[0x5b] & 0x06) << 7) | (uint8_t)m_io_regs[0x5c];
-
- if (m_io_regs[0x58] & 0x40) // Serial EEPROM read
- m_io_regs[0x5e] = m_eeprom_r(addr);
- else
- m_eeprom_w(addr, m_io_regs[0x5d]);
-
- m_io_regs[0x59] |= 1;
-}
void spg2xx_device::do_cpu_dma(uint32_t len)
{
address_space &mem = m_cpu->space(AS_PROGRAM);
- uint32_t src = ((m_io_regs[0x101] & 0x3f) << 16) | m_io_regs[0x100];
- uint32_t dst = m_io_regs[0x103] & 0x3fff;
+ uint32_t src = ((m_dma_regs[0x001] & 0x3f) << 16) | m_dma_regs[0x000];
+ uint32_t dst = m_dma_regs[0x003] & 0x3fff;
for (uint32_t j = 0; j < len; j++)
{
@@ -1542,1128 +999,56 @@ void spg2xx_device::do_cpu_dma(uint32_t len)
}
src += len;
- m_io_regs[0x100] = (uint16_t)src;
- m_io_regs[0x101] = (src >> 16) & 0x3f;
- m_io_regs[0x102] = 0;
- m_io_regs[0x103] = (dst + len) & 0x3fff;
-}
-
-/***********************
-* Audio Hardware *
-***********************/
-
-READ16_MEMBER(spg2xx_device::audio_r)
-{
- const uint16_t channel = (offset & 0x00f0) >> 4;
- uint16_t data = m_audio_regs[offset];
-
- if (offset >= 0x400)
- {
- switch (offset)
- {
- case AUDIO_CHANNEL_ENABLE:
- LOGMASKED(LOG_SPU_READS, "audio_r: Channel Enable: %04x\n", data);
- break;
-
- case AUDIO_MAIN_VOLUME:
- LOGMASKED(LOG_SPU_READS, "audio_r: Main Volume: %04x\n", data);
- break;
-
- case AUDIO_CHANNEL_FIQ_ENABLE:
- LOGMASKED(LOG_SPU_READS | LOG_IRQS, "audio_r: Channel FIQ Enable: %04x\n", data);
- break;
-
- case AUDIO_CHANNEL_FIQ_STATUS:
- LOGMASKED(LOG_SPU_READS | LOG_IRQS, "audio_r: Channel FIQ Acknowledge: %04x\n", data);
- break;
-
- case AUDIO_BEAT_BASE_COUNT:
- LOGMASKED(LOG_SPU_READS | LOG_BEAT, "audio_r: Beat Base Count: %04x\n", data);
- break;
-
- case AUDIO_BEAT_COUNT:
- LOGMASKED(LOG_SPU_READS | LOG_BEAT, "audio_r: Beat Count: %04x\n", data);
- break;
-
- case AUDIO_ENVCLK0:
- case AUDIO_ENVCLK1:
- LOGMASKED(LOG_SPU_READS | LOG_ENVELOPES, "audio_r: Envelope Interval %d (lo): %04x\n", offset == AUDIO_ENVCLK0 ? 0 : 1, data);
- break;
-
- case AUDIO_ENVCLK0_HIGH:
- case AUDIO_ENVCLK1_HIGH:
- LOGMASKED(LOG_SPU_READS | LOG_ENVELOPES, "audio_r: Envelope Interval %d (hi): %04x\n", offset == AUDIO_ENVCLK0_HIGH ? 0 : 1, data);
- break;
-
- case AUDIO_ENV_RAMP_DOWN:
- LOGMASKED(LOG_SPU_READS | LOG_RAMPDOWN, "audio_r: Envelope Fast Ramp Down: %04x\n", data);
- break;
-
- case AUDIO_CHANNEL_STOP:
- LOGMASKED(LOG_SPU_READS, "audio_r: Channel Stop Status: %04x\n", data);
- break;
-
- case AUDIO_CHANNEL_ZERO_CROSS:
- LOGMASKED(LOG_SPU_READS, "audio_r: Channel Zero-Cross Enable: %04x\n", data);
- break;
-
- case AUDIO_CONTROL:
- LOGMASKED(LOG_SPU_READS, "audio_r: Control: %04x\n", data);
- break;
-
- case AUDIO_COMPRESS_CTRL:
- LOGMASKED(LOG_SPU_READS, "audio_r: Compressor Control: %04x\n", data);
- break;
-
- case AUDIO_CHANNEL_STATUS:
- LOGMASKED(LOG_SPU_READS, "audio_r: Channel Status: %04x\n", data);
- break;
-
- case AUDIO_WAVE_IN_L:
- LOGMASKED(LOG_SPU_READS, "audio_r: Wave In (L) / FIFO Write Data: %04x\n", data);
- break;
-
- case AUDIO_WAVE_IN_R:
- LOGMASKED(LOG_SPU_READS, "audio_r: Wave In (R) / Software Channel FIFO IRQ Control: %04x\n", data);
- break;
-
- case AUDIO_WAVE_OUT_L:
- LOGMASKED(LOG_SPU_READS, "audio_r: Wave Out (L): %04x\n", data);
- break;
-
- case AUDIO_WAVE_OUT_R:
- LOGMASKED(LOG_SPU_READS, "audio_r: Wave Out (R): %04x\n", data);
- break;
-
- case AUDIO_CHANNEL_REPEAT:
- LOGMASKED(LOG_SPU_READS, "audio_r: Channel Repeat Enable: %04x\n", data);
- break;
-
- case AUDIO_CHANNEL_ENV_MODE:
- LOGMASKED(LOG_SPU_READS | LOG_ENVELOPES, "audio_r: Channel Envelope Enable: %04x\n", data);
- break;
-
- case AUDIO_CHANNEL_TONE_RELEASE:
- LOGMASKED(LOG_SPU_READS, "audio_r: Channel Tone Release Enable: %04x\n", data);
- break;
-
- case AUDIO_CHANNEL_ENV_IRQ:
- LOGMASKED(LOG_SPU_READS | LOG_IRQS, "audio_r: Channel Envelope IRQ Status: %04x\n", data);
- break;
-
- case AUDIO_CHANNEL_PITCH_BEND:
- LOGMASKED(LOG_SPU_READS, "audio_r: Channel Pitch Bend Enable: %04x\n", data);
- break;
-
- case AUDIO_SOFT_PHASE:
- LOGMASKED(LOG_SPU_READS, "audio_r: Software Channel Phase: %04x\n", data);
- break;
-
- case AUDIO_ATTACK_RELEASE:
- LOGMASKED(LOG_SPU_READS, "audio_r: Attack/Release Time Control: %04x\n", data);
- break;
-
- case AUDIO_EQ_CUTOFF10:
- LOGMASKED(LOG_SPU_READS, "audio_r: EQ Cutoff Frequency 0/1: %04x\n", data);
- break;
-
- case AUDIO_EQ_CUTOFF32:
- LOGMASKED(LOG_SPU_READS, "audio_r: EQ Cutoff Frequency 2/3: %04x\n", data);
- break;
-
- case AUDIO_EQ_GAIN10:
- LOGMASKED(LOG_SPU_READS, "audio_r: EQ Cutoff Gain 0/1: %04x\n", data);
- break;
-
- case AUDIO_EQ_GAIN32:
- LOGMASKED(LOG_SPU_READS, "audio_r: EQ Cutoff Gain 2/3: %04x\n", data);
- break;
-
- default:
- LOGMASKED(LOG_UNKNOWN_SPU, "audio_r: Unknown register %04x = %04x\n", 0x3000 + offset, data);
- break;
- }
- }
- else if (channel < 16)
- {
- switch (offset & AUDIO_CHAN_OFFSET_MASK)
- {
- case AUDIO_WAVE_ADDR:
- LOGMASKED(LOG_CHANNEL_READS, "audio_r: Channel %d: Wave Addr (lo): %04x\n", channel, data);
- break;
-
- case AUDIO_MODE:
- LOGMASKED(LOG_CHANNEL_READS, "audio_r: Channel %d: Mode: %04x (ADPCM:%d, 16M:%d, TONE:%d, LADDR_HI:%04x, WADDR_HI:%04x)\n", channel, data,
- get_adpcm_bit(channel), get_16bit_bit(channel), get_tone_mode(channel), get_loop_addr_high(channel), get_wave_addr_high(channel));
- break;
-
- case AUDIO_LOOP_ADDR:
- LOGMASKED(LOG_CHANNEL_READS, "audio_r: Channel %d: Loop Addr: %04x\n", channel, data);
- break;
-
- case AUDIO_PAN_VOL:
- LOGMASKED(LOG_CHANNEL_READS, "audio_r: Channel %d: Pan/Vol: %04x (PAN:%02x, VOL:%02x)\n", channel, data,
- get_pan(channel), get_volume(channel));
- break;
-
- case AUDIO_ENVELOPE0:
- LOGMASKED(LOG_CHANNEL_READS | LOG_ENVELOPES, "audio_r: Channel %d: Envelope0: %04x (RPTPER:%d, TARGET:%02x, SIGN:%d, INC:%02x)\n", channel, data,
- get_repeat_period_bit(channel), get_envelope_target(channel), get_envelope_sign_bit(channel), get_envelope_inc(channel));
- break;
-
- case AUDIO_ENVELOPE_DATA:
- LOGMASKED(LOG_CHANNEL_READS | LOG_ENVELOPES, "audio_r: Channel %d: Envelope Data: %04x (CNT:%d, EDD:%02x)\n", channel, data,
- get_envelope_count(channel), get_edd(channel));
- break;
-
- case AUDIO_ENVELOPE1:
- LOGMASKED(LOG_CHANNEL_READS | LOG_ENVELOPES, "audio_r: Channel %d: Envelope1 Data: %04x (RPTCNT:%02x, RPT:%d, LOAD:%02x)\n", channel, data,
- get_envelope_repeat_count(channel), get_envelope_repeat_bit(channel), get_envelope_load(channel));
- break;
-
- case AUDIO_ENVELOPE_ADDR_HIGH:
- LOGMASKED(LOG_CHANNEL_READS | LOG_ENVELOPES, "audio_r: Channel %d: Envelope Addr (hi): %04x (IRQADDR:%03x, IRQEN:%d, EADDR_HI:%02x)\n", channel, data,
- get_audio_irq_addr(channel), get_audio_irq_enable_bit(channel), get_envelope_addr_high(channel));
- break;
-
- case AUDIO_ENVELOPE_ADDR:
- LOGMASKED(LOG_CHANNEL_READS | LOG_ENVELOPES, "audio_r: Channel %d: Envelope Addr (lo): %04x \n", channel, data);
- break;
-
- case AUDIO_WAVE_DATA_PREV:
- LOGMASKED(LOG_CHANNEL_READS, "audio_r: Channel %d: Wave Data Prev: %04x \n", channel, data);
- break;
-
- case AUDIO_ENVELOPE_LOOP_CTRL:
- LOGMASKED(LOG_CHANNEL_READS | LOG_ENVELOPES, "audio_r: Channel %d: Envelope Loop Ctrl: %04x (RDOFFS:%02x, EAOFFS:%03x)\n", channel, data,
- get_rampdown_offset(channel), get_envelope_eaoffset(channel));
- break;
-
- case AUDIO_WAVE_DATA:
- LOGMASKED(LOG_CHANNEL_READS, "audio_r: Channel %d: Wave Data: %04x\n", channel, data);
- break;
-
- case AUDIO_ADPCM_SEL:
- LOGMASKED(LOG_CHANNEL_READS, "audio_r: Channel %d: ADPCM Sel: %04x (ADPCM36:%d, POINTNUM:%02x\n", channel, data,
- get_adpcm36_bit(channel), get_point_number(channel));
- break;
-
- case AUDIO_PHASE_HIGH:
- LOGMASKED(LOG_CHANNEL_READS, "audio_r: Channel %d: Phase High: %04x\n", channel, data);
- break;
-
- case AUDIO_PHASE_ACCUM_HIGH:
- LOGMASKED(LOG_CHANNEL_READS, "audio_r: Channel %d: Phase Accum High: %04x\n", channel, data);
- break;
-
- case AUDIO_TARGET_PHASE_HIGH:
- LOGMASKED(LOG_CHANNEL_READS, "audio_r: Channel %d: Target Phase High: %04x\n", channel, data);
- break;
-
- case AUDIO_RAMP_DOWN_CLOCK:
- LOGMASKED(LOG_CHANNEL_READS | LOG_RAMPDOWN, "audio_r: Channel %d: Rampdown Clock: %04x\n", channel, data);
- break;
-
- case AUDIO_PHASE:
- LOGMASKED(LOG_CHANNEL_READS, "audio_r: Channel %d: Phase: %04x\n", channel, data);
- break;
-
- case AUDIO_PHASE_ACCUM:
- LOGMASKED(LOG_CHANNEL_READS, "audio_r: Channel %d: Phase Accum: %04x\n", channel, data);
- break;
-
- case AUDIO_TARGET_PHASE:
- LOGMASKED(LOG_CHANNEL_READS, "audio_r: Channel %d: Target Phase: %04x\n", channel, data);
- break;
-
- case AUDIO_PHASE_CTRL:
- LOGMASKED(LOG_CHANNEL_READS, "audio_r: Channel %d: Phase Ctrl: %04x (TIMESTEP:%d, SIGN:%d, OFFSET:%03x\n", channel, data,
- get_phase_time_step(channel), get_phase_sign_bit(channel), get_phase_offset(channel));
- break;
-
- default:
- LOGMASKED(LOG_UNKNOWN_SPU, "audio_r: Unknown register %04x\n", 0x3000 + offset);
- break;
- }
- }
- else if (channel >= 16)
- {
- LOGMASKED(LOG_UNKNOWN_SPU, "audio_r: Trying to read from channel %d\n", channel);
- }
- return data;
+ m_dma_regs[0x000] = (uint16_t)src;
+ m_dma_regs[0x001] = (src >> 16) & 0x3f;
+ m_dma_regs[0x002] = 0;
+ m_dma_regs[0x003] = (dst + len) & 0x3fff;
}
-WRITE16_MEMBER(spg2xx_device::audio_w)
+void spg2xx_device::configure_spg_io(spg2xx_io_device* io)
{
- const uint16_t channel = (offset & 0x00f0) >> 4;
-
- if (offset >= 0x400)
- {
- switch (offset)
- {
- case AUDIO_CHANNEL_ENABLE:
- {
- LOGMASKED(LOG_SPU_WRITES, "audio_w: Channel Enable: %04x\n", data);
- const uint16_t changed = m_audio_regs[AUDIO_CHANNEL_ENABLE] ^ data;
- for (uint32_t channel_bit = 0; channel_bit < 16; channel_bit++)
- {
- const uint16_t mask = 1 << channel_bit;
- if (!(changed & mask))
- continue;
-
- if (data & mask)
- {
- if (!(m_audio_regs[AUDIO_CHANNEL_STATUS] & mask))
- {
- LOGMASKED(LOG_SPU_WRITES, "Enabling channel %d\n", channel_bit);
- m_audio_regs[offset] |= mask;
- if (!(m_audio_regs[AUDIO_CHANNEL_STOP] & mask))
- {
- LOGMASKED(LOG_SPU_WRITES, "Stop not set, starting playback on channel %d, mask %04x\n", channel_bit, mask);
- m_audio_regs[AUDIO_CHANNEL_STATUS] |= mask;
- m_sample_addr[channel_bit] = get_wave_addr(channel_bit);
- m_envelope_addr[channel_bit] = get_envelope_addr(channel_bit);
- set_envelope_count(channel, get_envelope_load(channel));
- }
- m_adpcm[channel_bit].reset();
- m_sample_shift[channel_bit] = 0;
- m_sample_count[channel_bit] = 0;
- }
- }
- else
- {
- m_audio_regs[offset] &= ~mask;
- m_audio_regs[AUDIO_CHANNEL_STATUS] &= ~mask;
- m_audio_regs[AUDIO_CHANNEL_STOP] |= mask;
- m_audio_regs[AUDIO_CHANNEL_TONE_RELEASE] &= ~mask;
- }
- }
- break;
- }
-
- case AUDIO_MAIN_VOLUME:
- LOGMASKED(LOG_SPU_WRITES, "audio_w: Main Volume: %04x\n", data);
- m_audio_regs[offset] = data & AUDIO_MAIN_VOLUME_MASK;
- break;
-
- case AUDIO_CHANNEL_FIQ_ENABLE:
- LOGMASKED(LOG_SPU_WRITES | LOG_IRQS, "audio_w: Channel FIQ Enable: %04x\n", data);
- m_audio_regs[offset] = data & AUDIO_CHANNEL_FIQ_ENABLE_MASK;
- break;
-
- case AUDIO_CHANNEL_FIQ_STATUS:
- LOGMASKED(LOG_SPU_WRITES | LOG_IRQS, "audio_w: Channel FIQ Acknowledge: %04x\n", data);
- m_audio_regs[offset] &= ~(data & AUDIO_CHANNEL_FIQ_STATUS_MASK);
- break;
-
- case AUDIO_BEAT_BASE_COUNT:
- LOGMASKED(LOG_SPU_WRITES | LOG_BEAT, "audio_w: Beat Base Count: %04x\n", data);
- m_audio_regs[offset] = data & AUDIO_BEAT_BASE_COUNT_MASK;
- m_audio_curr_beat_base_count = m_audio_regs[offset];
- break;
-
- case AUDIO_BEAT_COUNT:
- {
- LOGMASKED(LOG_SPU_WRITES | LOG_BEAT, "audio_w: Beat Count: %04x\n", data);
- const uint16_t old = m_audio_regs[offset];
- m_audio_regs[offset] &= ~(data & AUDIO_BIS_MASK);
- m_audio_regs[offset] &= AUDIO_BIS_MASK;
- m_audio_regs[offset] |= data & ~AUDIO_BIS_MASK;
- const uint16_t changed = old ^ m_audio_regs[offset];
- if (data == 0xc000 && m_audio_regs[offset])
- {
- }
- if (changed & (AUDIO_BIS_MASK | AUDIO_BIE_MASK))
- {
- LOGMASKED(LOG_BEAT, "BIS mask changed, updating IRQ\n");
- check_irqs(changed & (AUDIO_BIS_MASK | AUDIO_BIE_MASK));
- }
- break;
- }
-
- case AUDIO_ENVCLK0:
- case AUDIO_ENVCLK1:
- {
- LOGMASKED(LOG_SPU_WRITES | LOG_ENVELOPES, "audio_w: Envelope Interval %d (lo): %04x\n", offset == AUDIO_ENVCLK0 ? 0 : 1, data);
- const uint16_t old = m_audio_regs[offset];
- m_audio_regs[offset] = data;
- const uint16_t changed = old ^ m_audio_regs[offset];
-
- if (!changed)
- break;
-
- const uint8_t channel_offset = offset == AUDIO_ENVCLK0 ? 0 : 8;
- for (uint8_t channel_bit = 0; channel_bit < 4; channel_bit++)
- {
- const uint8_t shift = channel_bit << 2;
- const uint16_t mask = 0x0f << shift;
- if (changed & mask)
- {
- m_envclk_frame[channel_bit + channel_offset] = get_envclk_frame_count(channel_bit + channel_offset);
- }
- }
- break;
- }
-
- case AUDIO_ENVCLK0_HIGH:
- case AUDIO_ENVCLK1_HIGH:
- {
- LOGMASKED(LOG_SPU_WRITES | LOG_ENVELOPES, "audio_w: Envelope Interval %d (hi): %04x\n", offset == AUDIO_ENVCLK0_HIGH ? 0 : 1, data);
- const uint16_t old = m_audio_regs[offset];
- m_audio_regs[offset] = data;
- const uint16_t changed = old ^ m_audio_regs[offset];
- if (!changed)
- break;
-
- const uint8_t channel_offset = offset == AUDIO_ENVCLK0_HIGH ? 0 : 8;
- for (uint8_t channel_bit = 0; channel_bit < 4; channel_bit++)
- {
- const uint8_t shift = channel_bit << 2;
- const uint16_t mask = 0x0f << shift;
- if (changed & mask)
- {
- m_envclk_frame[channel_bit + channel_offset + 4] = get_envclk_frame_count(channel_bit + channel_offset);
- }
- }
- break;
- }
-
- case AUDIO_ENV_RAMP_DOWN:
- {
- LOGMASKED(LOG_SPU_WRITES | LOG_RAMPDOWN, "audio_w: Envelope Fast Ramp Down: %04x\n", data);
- const uint16_t old = m_audio_regs[offset];
- m_audio_regs[offset] = data & AUDIO_ENV_RAMP_DOWN_MASK;
- const uint16_t changed = old ^ m_audio_regs[offset];
- if (!changed)
- break;
-
- for (uint32_t channel_bit = 0; channel_bit < 16; channel_bit++)
- {
- const uint16_t mask = 1 << channel_bit;
- if ((changed & mask) && (data & mask))
- {
- m_rampdown_frame[channel_bit] = get_rampdown_frame_count(channel_bit);
- LOGMASKED(LOG_RAMPDOWN, "Preparing to ramp down channel %d in %d ticks\n", channel_bit, m_rampdown_frame[channel_bit] / 13);
- }
- }
- break;
- }
-
- case AUDIO_CHANNEL_STOP:
- LOGMASKED(LOG_SPU_WRITES, "audio_w: Channel Stop Status: %04x\n", data);
- m_audio_regs[offset] &= ~data;
- m_audio_regs[AUDIO_CHANNEL_ENABLE] &= ~data;
- break;
-
- case AUDIO_CHANNEL_ZERO_CROSS:
- LOGMASKED(LOG_SPU_WRITES, "audio_w: Channel Zero-Cross Enable: %04x\n", data);
- m_audio_regs[offset] = data & AUDIO_CHANNEL_ZERO_CROSS_MASK;
- break;
-
- case AUDIO_CONTROL:
- LOGMASKED(LOG_SPU_WRITES, "audio_w: Control: %04x (SOFTCH:%d, COMPEN:%d, NOHIGH:%d, NOINT:%d, EQEN:%d\n", data
- , (data & AUDIO_CONTROL_SOFTCH_MASK) ? 1 : 0
- , (data & AUDIO_CONTROL_COMPEN_MASK) ? 1 : 0
- , (data & AUDIO_CONTROL_NOHIGH_MASK) ? 1 : 0
- , (data & AUDIO_CONTROL_NOINT_MASK) ? 1 : 0
- , (data & AUDIO_CONTROL_EQEN_MASK) ? 1 : 0);
- m_audio_regs[offset] = data & AUDIO_CONTROL_MASK;
- break;
-
- case AUDIO_COMPRESS_CTRL:
- LOGMASKED(LOG_SPU_WRITES, "audio_w: Compressor Control: %04x\n", data);
- m_audio_regs[offset] = data;
- break;
-
- case AUDIO_CHANNEL_STATUS:
- LOGMASKED(LOG_SPU_WRITES, "audio_w: Channel Status (read-only): %04x\n", data);
- break;
-
- case AUDIO_WAVE_IN_L:
- LOGMASKED(LOG_SPU_WRITES, "audio_w: Wave In (L) / FIFO Write Data: %04x\n", data);
- m_audio_regs[offset] = data;
- break;
-
- case AUDIO_WAVE_IN_R:
- LOGMASKED(LOG_SPU_WRITES, "audio_w: Wave In (R) / Software Channel FIFO IRQ Control: %04x\n", data);
- m_audio_regs[offset] = data;
- break;
-
- case AUDIO_WAVE_OUT_L:
- LOGMASKED(LOG_SPU_WRITES, "audio_w: Wave Out (L): %04x\n", data);
- m_audio_regs[offset] = data;
- break;
-
- case AUDIO_WAVE_OUT_R:
- LOGMASKED(LOG_SPU_WRITES, "audio_w: Wave Out (R): %04x\n", data);
- m_audio_regs[offset] = data;
- break;
-
- case AUDIO_CHANNEL_REPEAT:
- LOGMASKED(LOG_SPU_WRITES, "audio_w: Channel Repeat Enable: %04x\n", data);
- m_audio_regs[offset] = data & AUDIO_CHANNEL_REPEAT_MASK;
- break;
-
- case AUDIO_CHANNEL_ENV_MODE:
- LOGMASKED(LOG_SPU_WRITES | LOG_ENVELOPES, "audio_w: Channel Envelope Enable: %04x\n", data);
- m_audio_regs[offset] = data & AUDIO_CHANNEL_ENV_MODE_MASK;
- break;
-
- case AUDIO_CHANNEL_TONE_RELEASE:
- LOGMASKED(LOG_SPU_WRITES, "audio_w: Channel Tone Release Enable: %04x\n", data);
- m_audio_regs[offset] = data & AUDIO_CHANNEL_TONE_RELEASE_MASK;
- break;
-
- case AUDIO_CHANNEL_ENV_IRQ:
- LOGMASKED(LOG_SPU_WRITES | LOG_ENVELOPES | LOG_IRQS, "audio_w: Channel Envelope IRQ Acknowledge: %04x\n", data);
- m_audio_regs[offset] &= ~data & AUDIO_CHANNEL_ENV_IRQ_MASK;
- break;
-
- case AUDIO_CHANNEL_PITCH_BEND:
- LOGMASKED(LOG_SPU_WRITES, "audio_w: Channel Pitch Bend Enable: %04x\n", data);
- m_audio_regs[offset] = data & AUDIO_CHANNEL_PITCH_BEND_MASK;
- break;
-
- case AUDIO_SOFT_PHASE:
- LOGMASKED(LOG_SPU_WRITES, "audio_w: Software Channel Phase: %04x\n", data);
- m_audio_regs[offset] = data;
- break;
-
- case AUDIO_ATTACK_RELEASE:
- LOGMASKED(LOG_SPU_WRITES, "audio_w: Attack/Release Time Control: %04x\n", data);
- m_audio_regs[offset] = data;
- break;
-
- case AUDIO_EQ_CUTOFF10:
- LOGMASKED(LOG_SPU_WRITES, "audio_w: EQ Cutoff Frequency 0/1: %04x\n", data);
- m_audio_regs[offset] = data & AUDIO_EQ_CUTOFF10_MASK;
- break;
-
- case AUDIO_EQ_CUTOFF32:
- LOGMASKED(LOG_SPU_WRITES, "audio_w: EQ Cutoff Frequency 2/3: %04x\n", data);
- m_audio_regs[offset] = data & AUDIO_EQ_CUTOFF32_MASK;
- break;
-
- case AUDIO_EQ_GAIN10:
- LOGMASKED(LOG_SPU_WRITES, "audio_w: EQ Cutoff Gain 0/1: %04x\n", data);
- m_audio_regs[offset] = data & AUDIO_EQ_GAIN10_MASK;
- break;
-
- case AUDIO_EQ_GAIN32:
- LOGMASKED(LOG_SPU_WRITES, "audio_w: EQ Cutoff Gain 2/3: %04x\n", data);
- m_audio_regs[offset] = data & AUDIO_EQ_GAIN32_MASK;
- break;
-
- default:
- m_audio_regs[offset] = data;
- LOGMASKED(LOG_UNKNOWN_SPU, "audio_w: Unknown register %04x = %04x\n", 0x3000 + offset, data);
- break;
- }
- }
- else if (channel < 16)
- {
- switch (offset & AUDIO_CHAN_OFFSET_MASK)
- {
- case AUDIO_WAVE_ADDR:
- m_audio_regs[offset] = data;
- LOGMASKED(LOG_CHANNEL_WRITES, "audio_w: Channel %d: Wave Addr (lo): %04x\n", channel, data);
- break;
-
- case AUDIO_MODE:
- m_audio_regs[offset] = data;
- LOGMASKED(LOG_CHANNEL_WRITES, "audio_w: Channel %d: Mode: %04x (ADPCM:%d, 16M:%d, TONE:%d, LADDR_HI:%04x, WADDR_HI:%04x)\n", channel, data,
- get_adpcm_bit(channel), get_16bit_bit(channel), get_tone_mode(channel), get_loop_addr_high(channel), get_wave_addr_high(channel));
- break;
-
- case AUDIO_LOOP_ADDR:
- m_audio_regs[offset] = data;
- LOGMASKED(LOG_CHANNEL_WRITES, "audio_w: Channel %d: Loop Addr: %04x\n", channel, data);
- break;
-
- case AUDIO_PAN_VOL:
- m_audio_regs[offset] = data & AUDIO_PAN_VOL_MASK;
- LOGMASKED(LOG_CHANNEL_WRITES, "audio_w: Channel %d: Pan/Vol: %04x (PAN:%02x, VOL:%02x)\n", channel, data,
- get_pan(channel), get_volume(channel));
- break;
-
- case AUDIO_ENVELOPE0:
- m_audio_regs[offset] = data;
- LOGMASKED(LOG_CHANNEL_WRITES | LOG_ENVELOPES, "audio_w: Channel %d: Envelope0: %04x (RPTPER:%d, TARGET:%02x, SIGN:%d, INC:%02x)\n", channel, data,
- get_repeat_period_bit(channel), get_envelope_target(channel), get_envelope_sign_bit(channel), get_envelope_inc(channel));
- break;
-
- case AUDIO_ENVELOPE_DATA:
- m_audio_regs[offset] = data & AUDIO_ENVELOPE_DATA_MASK;
- LOGMASKED(LOG_CHANNEL_WRITES | LOG_ENVELOPES, "audio_w: Channel %d: Envelope Data: %04x (CNT:%d, EDD:%02x)\n", channel, data,
- get_envelope_count(channel), get_edd(channel));
- break;
-
- case AUDIO_ENVELOPE1:
- m_audio_regs[offset] = data;
- LOGMASKED(LOG_CHANNEL_WRITES | LOG_ENVELOPES, "audio_w: Channel %d: Envelope1 Data: %04x (RPTCNT:%02x, RPT:%d, LOAD:%02x)\n", channel, data,
- get_envelope_repeat_count(channel), get_envelope_repeat_bit(channel), get_envelope_load(channel));
- break;
-
- case AUDIO_ENVELOPE_ADDR_HIGH:
- m_audio_regs[offset] = data;
- LOGMASKED(LOG_CHANNEL_WRITES | LOG_ENVELOPES, "audio_w: Channel %d: Envelope Addr (hi): %04x (IRQADDR:%03x, IRQEN:%d, EADDR_HI:%02x)\n", channel, data,
- get_audio_irq_addr(channel), get_audio_irq_enable_bit(channel), get_envelope_addr_high(channel));
- break;
-
- case AUDIO_ENVELOPE_ADDR:
- m_audio_regs[offset] = data;
- LOGMASKED(LOG_CHANNEL_WRITES | LOG_ENVELOPES, "audio_w: Channel %d: Envelope Addr (lo): %04x\n", channel, data);
- break;
-
- case AUDIO_WAVE_DATA_PREV:
- m_audio_regs[offset] = data;
- LOGMASKED(LOG_CHANNEL_WRITES, "audio_w: Channel %d: Wave Data Prev: %04x \n", channel, data);
- break;
-
- case AUDIO_ENVELOPE_LOOP_CTRL:
- m_audio_regs[offset] = data;
- LOGMASKED(LOG_CHANNEL_WRITES | LOG_ENVELOPES, "audio_w: Channel %d: Envelope Loop Ctrl: %04x (RDOFFS:%02x, EAOFFS:%03x)\n", channel, data,
- get_rampdown_offset(channel), get_envelope_eaoffset(channel));
- break;
-
- case AUDIO_WAVE_DATA:
- m_audio_regs[offset] = data;
- LOGMASKED(LOG_CHANNEL_WRITES, "audio_w: Channel %d: Wave Data: %04x\n", channel, data);
- break;
-
- case AUDIO_ADPCM_SEL:
- m_audio_regs[offset] = data & AUDIO_ADPCM_SEL_MASK;
- LOGMASKED(LOG_CHANNEL_WRITES, "audio_w: Channel %d: ADPCM Sel: %04x (ADPCM36:%d, POINTNUM:%02x\n", channel, data,
- get_adpcm36_bit(channel), get_point_number(channel));
- break;
-
- case AUDIO_PHASE_HIGH:
- m_audio_regs[offset] = data & AUDIO_PHASE_HIGH_MASK;
- m_channel_rate[channel] = ((double)get_phase(channel) * 140625.0 * 2.0) / (double)(1 << 19);
- m_channel_rate_accum[channel] = 0.0;
- LOGMASKED(LOG_CHANNEL_WRITES, "audio_w: Channel %d: Phase High: %04x (rate: %f)\n", channel, data, m_channel_rate[channel]);
- break;
-
- case AUDIO_PHASE_ACCUM_HIGH:
- m_audio_regs[offset] = data & AUDIO_PHASE_ACCUM_HIGH_MASK;
- LOGMASKED(LOG_CHANNEL_WRITES, "audio_w: Channel %d: Phase Accum High: %04x\n", channel, data);
- break;
-
- case AUDIO_TARGET_PHASE_HIGH:
- m_audio_regs[offset] = data & AUDIO_TARGET_PHASE_HIGH_MASK;
- LOGMASKED(LOG_CHANNEL_WRITES, "audio_w: Channel %d: Target Phase High: %04x\n", channel, data);
- break;
-
- case AUDIO_RAMP_DOWN_CLOCK:
- m_audio_regs[offset] = data & AUDIO_RAMP_DOWN_CLOCK_MASK;
- LOGMASKED(LOG_CHANNEL_WRITES | LOG_RAMPDOWN, "audio_w: Channel %d: Rampdown Clock: %04x\n", channel, data);
- break;
-
- case AUDIO_PHASE:
- m_audio_regs[offset] = data;
- m_channel_rate[channel] = ((double)get_phase(channel) * 140625.0 * 2.0) / (double)(1 << 19);
- m_channel_rate_accum[channel] = 0.0;
- LOGMASKED(LOG_CHANNEL_WRITES, "audio_w: Channel %d: Phase: %04x (rate: %f)\n", channel, data, m_channel_rate[channel]);
- break;
-
- case AUDIO_PHASE_ACCUM:
- m_audio_regs[offset] = data;
- LOGMASKED(LOG_CHANNEL_WRITES, "audio_w: Channel %d: Phase Accum: %04x\n", channel, data);
- break;
-
- case AUDIO_TARGET_PHASE:
- m_audio_regs[offset] = data;
- LOGMASKED(LOG_CHANNEL_WRITES, "audio_w: Channel %d: Target Phase: %04x\n", channel, data);
- break;
-
- case AUDIO_PHASE_CTRL:
- m_audio_regs[offset] = data;
- LOGMASKED(LOG_CHANNEL_WRITES, "audio_w: Channel %d: Phase Ctrl: %04x (TIMESTEP:%d, SIGN:%d, OFFSET:%03x\n", channel, data,
- get_phase_time_step(channel), get_phase_sign_bit(channel), get_phase_offset(channel));
- break;
-
- default:
- m_audio_regs[offset] = data;
- LOGMASKED(LOG_UNKNOWN_SPU, "audio_w: Unknown register %04x = %04x\n", 0x3000 + offset, data);
- break;
- }
- }
- else if (channel >= 16)
- {
- LOGMASKED(LOG_UNKNOWN_SPU, "audio_w: Trying to write to channel %d: %04x = %04x\n", channel, 0x3000 + offset, data);
- }
- else
- {
- m_audio_regs[offset] = data;
- }
-}
-
-void spg2xx_device::sound_stream_update(sound_stream &stream, stream_sample_t **inputs, stream_sample_t **outputs, int samples)
-{
- stream_sample_t *out_l = outputs[0];
- stream_sample_t *out_r = outputs[1];
- address_space &space = m_cpu->space(AS_PROGRAM);
-
- for (int i = 0; i < samples; i++)
- {
- int32_t left_total = 0;
- int32_t right_total = 0;
- int32_t active_count = 0;
-
- for (uint32_t ch_index = 0; ch_index < 16; ch_index++)
- {
- if (!get_channel_status(ch_index))
- {
- continue;
- }
-
- if (SPG_DEBUG_AUDIO && m_debug_rates)
- printf("%f:%f ", m_channel_rate[ch_index], m_channel_rate_accum[ch_index]);
- bool playing = advance_channel(space, ch_index);
- if (playing)
- {
- int32_t sample = (int16_t)(m_audio_regs[(ch_index << 4) | AUDIO_WAVE_DATA] ^ 0x8000);
- if (!(m_audio_regs[AUDIO_CONTROL] & AUDIO_CONTROL_NOINT_MASK))
- {
- int32_t prev_sample = (int16_t)(m_audio_regs[(ch_index << 4) | AUDIO_WAVE_DATA_PREV] ^ 0x8000);
- int16_t lerp_factor = (int16_t)((m_channel_rate_accum[ch_index] / 44100.0) * 256.0);
- prev_sample = (prev_sample * (0x100 - lerp_factor)) >> 8;
- sample = (sample * lerp_factor) >> 8;
- sample += prev_sample;
- }
-
- sample = (sample * (int16_t)get_edd(ch_index)) >> 7;
-
- active_count++;
-
- int32_t vol = get_volume(ch_index);
- int32_t pan = get_pan(ch_index);
-
- int32_t pan_left, pan_right;
- if (pan < 0x40)
- {
- pan_left = 0x7f * vol;
- pan_right = pan * 2 * vol;
- }
- else
- {
- pan_left = (0x7f - pan) * 2 * vol;
- pan_right = 0x7f * vol;
- }
-
- left_total += ((int16_t)sample * (int16_t)pan_left) >> 14;
- right_total += ((int16_t)sample * (int16_t)pan_right) >> 14;
- }
- }
-
- if (active_count)
- {
- left_total /= active_count;
- right_total /= active_count;
- *out_l++ = (left_total * (int16_t)m_audio_regs[AUDIO_MAIN_VOLUME]) >> 7;
- *out_r++ = (right_total * (int16_t)m_audio_regs[AUDIO_MAIN_VOLUME]) >> 7;
- }
- else
- {
- *out_l++ = 0;
- *out_r++ = 0;
- }
- }
-}
-
-inline void spg2xx_device::stop_channel(const uint32_t channel)
-{
- // TODO: IRQs
- m_audio_regs[AUDIO_CHANNEL_ENABLE] &= ~(1 << channel);
- m_audio_regs[AUDIO_CHANNEL_STATUS] &= ~(1 << channel);
- m_audio_regs[AUDIO_CHANNEL_STOP] |= (1 << channel);
- m_audio_regs[(channel << 4) | AUDIO_MODE] &= ~AUDIO_ADPCM_MASK;
- m_audio_regs[AUDIO_CHANNEL_TONE_RELEASE] &= ~(1 << channel);
-}
-
-bool spg2xx_device::advance_channel(address_space &space, const uint32_t channel)
-{
- m_channel_rate_accum[channel] += m_channel_rate[channel];
- uint32_t samples_to_advance = 0;
- while (m_channel_rate_accum[channel] >= 44100.0)
- {
- m_channel_rate_accum[channel] -= 44100.0;
- samples_to_advance++;
- }
-
- if (!samples_to_advance)
- return true;
-
- bool playing = true;
-
- if (get_adpcm_bit(channel))
- {
- // ADPCM mode
- for (uint32_t sample = 0; sample < samples_to_advance && playing; sample++)
- {
- playing = fetch_sample(space, channel);
- if (playing)
- {
- m_sample_shift[channel] += 4;
- if (m_sample_shift[channel] == 16)
- {
- m_sample_shift[channel] = 0;
- m_sample_addr[channel]++;
- }
- }
- }
- }
- else if (get_16bit_bit(channel))
- {
- // 16-bit mode
- for (uint32_t sample = 0; sample < samples_to_advance && playing; sample++)
- {
- playing = fetch_sample(space, channel);
- if (playing)
- m_sample_addr[channel]++;
- }
- }
- else
- {
- // 8-bit mode
- for (uint32_t sample = 0; sample < samples_to_advance && playing; sample++)
- {
- playing = fetch_sample(space, channel);
- if (playing)
- {
- m_sample_shift[channel] += 8;
- if (m_sample_shift[channel] == 16)
- {
- m_sample_shift[channel] = 0;
- m_sample_addr[channel]++;
- }
- }
- }
- }
-
- return playing;
-}
-
-bool spg2xx_device::fetch_sample(address_space &space, const uint32_t channel)
-{
- const uint32_t channel_mask = channel << 4;
- m_audio_regs[channel_mask | AUDIO_WAVE_DATA_PREV] = m_audio_regs[channel_mask | AUDIO_WAVE_DATA];
-
- const uint32_t wave_data_reg = channel_mask | AUDIO_WAVE_DATA;
- const uint16_t tone_mode = get_tone_mode(channel);
- const uint16_t raw_sample = tone_mode ? space.read_word(m_sample_addr[channel]) : m_audio_regs[wave_data_reg];
-
- m_audio_regs[wave_data_reg] = raw_sample;
-
- if (get_adpcm_bit(channel))
- {
- // ADPCM mode
- m_audio_regs[wave_data_reg] >>= m_sample_shift[channel];
- m_audio_regs[wave_data_reg] = (uint16_t)(m_adpcm[channel].clock((uint8_t)(m_audio_regs[wave_data_reg] & 0x000f)) * 7) ^ 0x8000;
- if (tone_mode != 0 && raw_sample == 0xffff)
- {
- if (tone_mode == AUDIO_TONE_MODE_HW_ONESHOT)
- {
- LOGMASKED(LOG_SAMPLES, "ADPCM stopped after %d samples\n", m_sample_count[channel]);
- m_sample_count[channel] = 0;
- stop_channel(channel);
- return false;
- }
- else
- {
- LOGMASKED(LOG_SAMPLES, "ADPCM looping after %d samples\n", m_sample_count[channel]);
- m_sample_count[channel] = 0;
- loop_channel(channel);
- }
- }
- m_sample_count[channel]++;
- }
- else if (get_16bit_bit(channel))
- {
- // 16-bit mode
- if (tone_mode != 0 && raw_sample == 0xffff)
- {
- if (tone_mode == AUDIO_TONE_MODE_HW_ONESHOT)
- {
- LOGMASKED(LOG_SAMPLES, "16-bit PCM stopped after %d samples\n", m_sample_count[channel]);
- m_sample_count[channel] = 0;
- stop_channel(channel);
- return false;
- }
- else
- {
- LOGMASKED(LOG_SAMPLES, "16-bit PCM looping after %d samples\n", m_sample_count[channel]);
- m_sample_count[channel] = 0;
- loop_channel(channel);
- }
- }
- m_sample_count[channel]++;
- }
- else
- {
- // 8-bit mode
- if (tone_mode != 0)
- {
- if (m_sample_shift[channel])
- m_audio_regs[wave_data_reg] <<= 8;
- else
- m_audio_regs[wave_data_reg] &= 0xff00;
-
- if (m_audio_regs[wave_data_reg] == 0xff00)
- {
- if (tone_mode == AUDIO_TONE_MODE_HW_ONESHOT)
- {
- LOGMASKED(LOG_SAMPLES, "8-bit PCM stopped after %d samples\n", m_sample_count[channel]);
- m_sample_count[channel] = 0;
- stop_channel(channel);
- return false;
- }
- else
- {
- LOGMASKED(LOG_SAMPLES, "8-bit PCM looping after %d samples\n", m_sample_count[channel]);
- m_sample_count[channel] = 0;
- loop_channel(channel);
- }
- }
- }
- m_sample_count[channel]++;
- }
-
- return true;
+ io->porta_in().set(FUNC(spg2xx_device::porta_r));
+ io->portb_in().set(FUNC(spg2xx_device::portb_r));
+ io->portc_in().set(FUNC(spg2xx_device::portc_r));
+ io->porta_out().set(FUNC(spg2xx_device::porta_w));
+ io->portb_out().set(FUNC(spg2xx_device::portb_w));
+ io->portc_out().set(FUNC(spg2xx_device::portc_w));
+ io->adc_in<0>().set(FUNC(spg2xx_device::adc_r<0>));
+ io->adc_in<1>().set(FUNC(spg2xx_device::adc_r<1>));
+ io->eeprom_w().set(FUNC(spg2xx_device::eepromx_w));
+ io->eeprom_r().set(FUNC(spg2xx_device::eepromx_r));
+ io->uart_tx().set(FUNC(spg2xx_device::tx_w));
+ io->chip_select().set(FUNC(spg2xx_device::cs_w));
+ io->pal_read_callback().set(FUNC(spg2xx_device::get_pal_r));
+ io->write_timer_irq_callback().set(FUNC(spg2xx_device::timerirq_w));
+ io->write_uart_adc_irq_callback().set(FUNC(spg2xx_device::uartirq_w));
+ io->write_external_irq_callback().set(FUNC(spg2xx_device::extirq_w));
+ io->write_ffrq_tmr1_irq_callback().set(FUNC(spg2xx_device::ffreq1_w));
+ io->write_ffrq_tmr2_irq_callback().set(FUNC(spg2xx_device::ffreq2_w));
}
-inline void spg2xx_device::loop_channel(const uint32_t channel)
+void spg24x_device::device_add_mconfig(machine_config &config)
{
- m_sample_addr[channel] = get_loop_addr(channel);
- m_sample_shift[channel] = 0;
-}
+ SPG2XX_AUDIO(config, m_spg_audio, DERIVED_CLOCK(1, 1));
+ m_spg_audio->write_irq_callback().set(FUNC(spg24x_device::audioirq_w));
+ m_spg_audio->space_read_callback().set(FUNC(spg24x_device::space_r));
-void spg2xx_device::audio_frame_tick()
-{
- audio_beat_tick();
+ m_spg_audio->add_route(0, *this, 1.0, AUTO_ALLOC_INPUT, 0);
+ m_spg_audio->add_route(1, *this, 1.0, AUTO_ALLOC_INPUT, 1);
- address_space &space = m_cpu->space(AS_PROGRAM);
- bool any_changed = false;
- for (uint32_t channel = 0; channel < 16; channel++)
- {
- const uint16_t mask = (1 << channel);
- if (!(m_audio_regs[AUDIO_CHANNEL_STATUS] & mask))
- {
- continue;
- }
-
- if (m_audio_regs[AUDIO_ENV_RAMP_DOWN] & mask)
- {
- m_rampdown_frame[channel]--;
- if (m_rampdown_frame[channel] == 0)
- {
- LOGMASKED(LOG_RAMPDOWN, "Ticking rampdown for channel %d\n", channel);
- audio_rampdown_tick(channel);
- any_changed = true;
- }
- continue;
- }
-
- if (!(m_audio_regs[AUDIO_CHANNEL_ENV_MODE] & mask))
- {
- m_envclk_frame[channel]--;
- if (m_envclk_frame[channel] == 0)
- {
- LOGMASKED(LOG_ENVELOPES, "Ticking envelope for channel %d\n", channel);
- any_changed = audio_envelope_tick(space, channel) || any_changed;
- m_envclk_frame[channel] = get_envclk_frame_count(channel);
- }
- }
- }
-
- if (any_changed)
- {
- m_stream->update();
- }
+ SPG24X_IO(config, m_spg_io, DERIVED_CLOCK(1, 1), m_cpu, m_screen);
+ configure_spg_io(m_spg_io);
}
-void spg2xx_device::audio_beat_tick()
+void spg28x_device::device_add_mconfig(machine_config &config)
{
- if (m_audio_curr_beat_base_count == 0)
- {
- LOGMASKED(LOG_BEAT, "Beat base count elapsed, reloading with %d\n", m_audio_regs[AUDIO_BEAT_BASE_COUNT]);
- m_audio_curr_beat_base_count = m_audio_regs[AUDIO_BEAT_BASE_COUNT];
-
- uint16_t beat_count = m_audio_regs[AUDIO_BEAT_COUNT] & AUDIO_BEAT_COUNT_MASK;
- if (beat_count == 0)
- {
- if (m_audio_regs[AUDIO_BEAT_COUNT] & AUDIO_BIE_MASK)
- {
- LOGMASKED(LOG_BEAT, "Beat count elapsed, setting Status bit and checking IRQs\n");
- m_audio_regs[AUDIO_BEAT_COUNT] |= AUDIO_BIS_MASK;
- check_irqs(AUDIO_BIS_MASK);
- }
- else
- {
- LOGMASKED(LOG_BEAT, "Beat count elapsed but IRQ not enabled\n");
- }
- }
- else
- {
- beat_count--;
- m_audio_regs[AUDIO_BEAT_COUNT] = (m_audio_regs[AUDIO_BEAT_COUNT] & ~AUDIO_BEAT_COUNT_MASK) | beat_count;
- }
- }
- else
- {
- m_audio_curr_beat_base_count--;
- }
-}
+ SPG2XX_AUDIO(config, m_spg_audio, DERIVED_CLOCK(1, 1));
+ m_spg_audio->write_irq_callback().set(FUNC(spg28x_device::audioirq_w));
+ m_spg_audio->space_read_callback().set(FUNC(spg28x_device::space_r));
-void spg2xx_device::audio_rampdown_tick(const uint32_t channel)
-{
- const uint8_t old_edd = get_edd(channel);
- uint8_t new_edd = old_edd - get_rampdown_offset(channel);
- if (new_edd > old_edd)
- new_edd = 0;
+ m_spg_audio->add_route(0, *this, 1.0, AUTO_ALLOC_INPUT, 0);
+ m_spg_audio->add_route(1, *this, 1.0, AUTO_ALLOC_INPUT, 1);
- if (new_edd)
- {
- LOGMASKED(LOG_RAMPDOWN, "Channel %d preparing for next rampdown step (%02x)\n", channel, new_edd);
- const uint16_t channel_mask = channel << 4;
- m_audio_regs[channel_mask | AUDIO_ENVELOPE_DATA] &= ~AUDIO_EDD_MASK;
- m_audio_regs[channel_mask | AUDIO_ENVELOPE_DATA] |= new_edd & AUDIO_EDD_MASK;
- m_rampdown_frame[channel] = get_rampdown_frame_count(channel);
- }
- else
- {
- LOGMASKED(LOG_RAMPDOWN, "Stopping channel %d due to rampdown\n", channel);
- const uint16_t channel_mask = 1 << channel;
- m_audio_regs[AUDIO_CHANNEL_ENABLE] &= ~channel_mask;
- m_audio_regs[AUDIO_CHANNEL_STATUS] &= ~channel_mask;
- m_audio_regs[AUDIO_CHANNEL_STOP] |= channel_mask;
- m_audio_regs[AUDIO_ENV_RAMP_DOWN] &= ~channel_mask;
- m_audio_regs[AUDIO_CHANNEL_TONE_RELEASE] &= ~channel_mask;
- }
-}
-
-const uint32_t spg2xx_device::s_rampdown_frame_counts[8] =
-{
- 13*4, 13*16, 13*64, 13*256, 13*1024, 13*4096, 13*8192, 13*8192
-};
-
-uint32_t spg2xx_device::get_rampdown_frame_count(const uint32_t channel)
-{
- return s_rampdown_frame_counts[get_rampdown_clock(channel)];
-}
-
-const uint32_t spg2xx_device::s_envclk_frame_counts[16] =
-{
- 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192, 8192, 8192, 8192, 8192
-};
-
-uint32_t spg2xx_device::get_envclk_frame_count(const uint32_t channel)
-{
- return s_envclk_frame_counts[get_envelope_clock(channel)];
-}
-
-uint32_t spg2xx_device::get_envelope_clock(const offs_t channel) const
-{
- if (channel < 4)
- return (m_audio_regs[AUDIO_ENVCLK0] >> (channel << 2)) & 0x000f;
- else if (channel < 8)
- return (m_audio_regs[AUDIO_ENVCLK0_HIGH] >> ((channel - 4) << 2)) & 0x000f;
- else if (channel < 12)
- return (m_audio_regs[AUDIO_ENVCLK1] >> ((channel - 8) << 2)) & 0x000f;
- else
- return (m_audio_regs[AUDIO_ENVCLK1_HIGH] >> ((channel - 12) << 2)) & 0x000f;
-}
-
-bool spg2xx_device::audio_envelope_tick(address_space &space, const uint32_t channel)
-{
- const uint16_t channel_mask = channel << 4;
- uint16_t new_count = get_envelope_count(channel);
- const uint16_t curr_edd = get_edd(channel);
- LOGMASKED(LOG_ENVELOPES, "envelope %d tick, count is %04x, curr edd is %04x\n", channel, new_count, curr_edd);
- bool edd_changed = false;
- if (new_count == 0)
- {
- const uint16_t target = get_envelope_target(channel);
- uint16_t new_edd = curr_edd;
- const uint16_t inc = get_envelope_inc(channel);
-
- if (new_edd != target)
- {
- if (get_envelope_sign_bit(channel))
- {
- new_edd -= inc;
- LOGMASKED(LOG_ENVELOPES, "Envelope %d new EDD-: %04x (%04x), dec %04x\n", channel, new_edd, target, inc);
- if (new_edd > curr_edd)
- new_edd = 0;
- else if (new_edd < target)
- new_edd = target;
-
- if (new_edd == 0)
- {
- LOGMASKED(LOG_ENVELOPES, "Envelope %d at 0, stopping channel\n", channel);
- stop_channel(channel);
- return true;
- }
- }
- else
- {
- new_edd += inc;
- LOGMASKED(LOG_ENVELOPES, "Envelope %d new EDD+: %04x\n", channel, new_edd);
- if (new_edd >= target)
- new_edd = target;
- }
- }
-
- if (new_edd == target)
- {
- LOGMASKED(LOG_ENVELOPES, "Envelope %d at target %04x\n", channel, target);
- new_edd = target;
-
- if (get_envelope_repeat_bit(channel))
- {
- const uint16_t repeat_count = get_envelope_repeat_count(channel) - 1;
- LOGMASKED(LOG_ENVELOPES, "Repeating envelope, new repeat count %d\n", repeat_count);
- if (repeat_count == 0)
- {
- m_audio_regs[channel_mask | AUDIO_ENVELOPE0] = space.read_word(m_envelope_addr[channel]);
- m_audio_regs[channel_mask | AUDIO_ENVELOPE1] = space.read_word(m_envelope_addr[channel] + 1);
- m_audio_regs[channel_mask | AUDIO_ENVELOPE_LOOP_CTRL] = space.read_word(m_envelope_addr[channel] + 2);
- m_envelope_addr[channel] = get_envelope_addr(channel) + get_envelope_eaoffset(channel);
- LOGMASKED(LOG_ENVELOPES, "Envelope data after repeat: %04x %04x %04x (%08x)\n", m_audio_regs[channel_mask | AUDIO_ENVELOPE0], m_audio_regs[channel_mask | AUDIO_ENVELOPE1], m_audio_regs[channel_mask | AUDIO_ENVELOPE_LOOP_CTRL], m_envelope_addr[channel]);
- }
- else
- {
- set_envelope_repeat_count(channel, repeat_count);
- }
- }
- else
- {
- LOGMASKED(LOG_ENVELOPES, "Fetching envelope for channel %d from %08x\n", channel, m_envelope_addr[channel]);
- m_audio_regs[channel_mask | AUDIO_ENVELOPE0] = space.read_word(m_envelope_addr[channel]);
- m_audio_regs[channel_mask | AUDIO_ENVELOPE1] = space.read_word(m_envelope_addr[channel] + 1);
- LOGMASKED(LOG_ENVELOPES, "Fetched envelopes %04x %04x\n", m_audio_regs[channel_mask | AUDIO_ENVELOPE0], m_audio_regs[channel_mask | AUDIO_ENVELOPE1]);
- m_envelope_addr[channel] += 2;
- }
- new_count = get_envelope_load(channel);
- set_envelope_count(channel, new_count);
- }
- else
- {
- LOGMASKED(LOG_ENVELOPES, "Envelope %d not yet at target %04x (%04x)\n", channel, target, new_edd);
- new_count = get_envelope_load(channel);
- set_envelope_count(channel, new_count);
- }
- LOGMASKED(LOG_ENVELOPES, "Envelope %d new count %04x\n", channel, new_count);
-
- set_edd(channel, new_edd);
- edd_changed = true;
- LOGMASKED(LOG_ENVELOPES, "Setting channel %d edd to %04x, register is %04x\n", channel, new_edd, m_audio_regs[(channel << 4) | AUDIO_ENVELOPE_DATA]);
- }
- else
- {
- new_count--;
- set_envelope_count(channel, new_count);
- }
- LOGMASKED(LOG_ENVELOPES, "envelope %d post-tick, count is now %04x, register is %04x\n", channel, new_count, m_audio_regs[(channel << 4) | AUDIO_ENVELOPE_DATA]);
- return edd_changed;
+ SPG28X_IO(config, m_spg_io, DERIVED_CLOCK(1, 1), m_cpu, m_screen);
+ configure_spg_io(m_spg_io);
}
diff --git a/src/devices/machine/spg2xx.h b/src/devices/machine/spg2xx.h
index 0573daef7ac..859620d9f66 100644
--- a/src/devices/machine/spg2xx.h
+++ b/src/devices/machine/spg2xx.h
@@ -27,12 +27,6 @@
ND - unknown - Wireless Air 60
ND - Likely many more
- Also on this hardware:
-
- name PCB ID ROM width TSOP pads ROM size SEEPROM die markings
- Radica Play TV Football 2 L7278 x16 48 not dumped no Sunplus
- Dream Life ? x16 48 not dumped no Sunplus
-
**********************************************************************/
#ifndef MAME_MACHINE_SPG2XX_H
@@ -41,15 +35,17 @@
#pragma once
#include "cpu/unsp/unsp.h"
-#include "sound/okiadpcm.h"
+#include "spg2xx_audio.h"
+#include "spg2xx_io.h"
#include "screen.h"
-class spg2xx_device : public device_t, public device_sound_interface
+class spg2xx_device : public device_t, public device_mixer_interface
{
public:
spg2xx_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock);
void set_pal(bool pal) { m_pal_flag = pal ? 1 : 0; }
+ void set_rowscroll_offset(int offset) { m_rowscrolloffset = offset; }
void map(address_map &map);
@@ -60,6 +56,8 @@ public:
auto portb_in() { return m_portb_in.bind(); }
auto portc_in() { return m_portc_in.bind(); }
+ template <size_t Line> auto adc_in() { return m_adc_in[Line].bind(); }
+
auto eeprom_w() { return m_eeprom_w.bind(); }
auto eeprom_r() { return m_eeprom_r.bind(); }
@@ -67,21 +65,22 @@ public:
auto chip_select() { return m_chip_sel.bind(); }
- void uart_rx(uint8_t data);
-
uint32_t screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
DECLARE_WRITE_LINE_MEMBER(vblank);
+ required_device<spg2xx_audio_device> m_spg_audio;
+ required_device<spg2xx_io_device> m_spg_io;
+
+ void extint_w(int channel, bool state) { m_spg_io->extint_w(channel, state); };
+ void uart_rx(uint8_t data) { m_spg_io->uart_rx(data); };
+
protected:
- spg2xx_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock, const size_t sprite_limit)
+ spg2xx_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock, const uint32_t sprite_limit)
: spg2xx_device(mconfig, type, tag, owner, clock)
{
m_sprite_limit = sprite_limit;
}
- // sound stream update overrides
- virtual void sound_stream_update(sound_stream &stream, stream_sample_t **inputs, stream_sample_t **outputs, int samples) override;
-
enum
{
PAGE_ENABLE_MASK = 0x0008,
@@ -100,370 +99,82 @@ protected:
TILE_Y_FLIP = 0x0008
};
- void audio_frame_tick();
- void audio_beat_tick();
- void audio_rampdown_tick(const uint32_t channel);
- bool audio_envelope_tick(address_space &space, const uint32_t channel);
- inline uint32_t get_rampdown_frame_count(const uint32_t channel);
- inline uint32_t get_envclk_frame_count(const uint32_t channel);
-
- // Audio getters
- bool get_channel_enable(const offs_t channel) const { return m_audio_regs[AUDIO_CHANNEL_ENABLE] & (1 << channel); }
- bool get_channel_status(const offs_t channel) const { return m_audio_regs[AUDIO_CHANNEL_STATUS] & (1 << channel); }
- bool get_manual_envelope_enable(const offs_t channel) const { return m_audio_regs[AUDIO_CHANNEL_ENV_MODE] & (1 << channel); }
- bool get_auto_envelope_enable(const offs_t channel) const { return !get_manual_envelope_enable(channel); }
- uint32_t get_envelope_clock(const offs_t channel) const;
-
- // Audio Mode getters
- uint16_t get_wave_addr_high(const offs_t channel) const { return m_audio_regs[(channel << 4) | AUDIO_MODE] & AUDIO_WADDR_HIGH_MASK; }
- uint16_t get_loop_addr_high(const offs_t channel) const { return (m_audio_regs[(channel << 4) | AUDIO_MODE] & AUDIO_LADDR_HIGH_MASK) >> AUDIO_LADDR_HIGH_SHIFT; }
- uint16_t get_tone_mode(const offs_t channel) const { return (m_audio_regs[(channel << 4) | AUDIO_MODE] & AUDIO_TONE_MODE_MASK) >> AUDIO_TONE_MODE_SHIFT; }
- uint16_t get_16bit_bit(const offs_t channel) const { return (m_audio_regs[(channel << 4) | AUDIO_MODE] & AUDIO_16M_MASK) ? 1 : 0; }
- uint16_t get_adpcm_bit(const offs_t channel) const { return (m_audio_regs[(channel << 4) | AUDIO_MODE] & AUDIO_ADPCM_MASK) ? 1 : 0; }
-
- // Audio Pan getters
- uint16_t get_volume(const offs_t channel) const { return m_audio_regs[(channel << 4) | AUDIO_PAN_VOL] & AUDIO_VOLUME_MASK; }
- uint16_t get_pan(const offs_t channel) const { return (m_audio_regs[(channel << 4) | AUDIO_PAN_VOL] & AUDIO_PAN_MASK) >> AUDIO_PAN_SHIFT; }
-
- // Audio Envelope0 Data getters
- uint16_t get_envelope_inc(const offs_t channel) const { return m_audio_regs[(channel << 4) | AUDIO_ENVELOPE0] & AUDIO_ENVELOPE_INC_MASK; }
- uint16_t get_envelope_sign_bit(const offs_t channel) const { return (m_audio_regs[(channel << 4) | AUDIO_ENVELOPE0] & AUDIO_ENVELOPE_SIGN_MASK) ? 1 : 0; }
- uint16_t get_envelope_target(const offs_t channel) const { return (m_audio_regs[(channel << 4) | AUDIO_ENVELOPE0] & AUDIO_ENVELOPE_TARGET_MASK) >> AUDIO_ENVELOPE_TARGET_SHIFT; }
- uint16_t get_repeat_period_bit(const offs_t channel) const { return (m_audio_regs[(channel << 4) | AUDIO_ENVELOPE0] & AUDIO_ENVELOPE_REPEAT_PERIOD_MASK) ? 1 : 0; }
-
- // Audio Envelope Data getters
- uint16_t get_edd(const offs_t channel) const { return m_audio_regs[(channel << 4) | AUDIO_ENVELOPE_DATA] & AUDIO_EDD_MASK; }
- uint16_t get_envelope_count(const offs_t channel) const { return (m_audio_regs[(channel << 4) | AUDIO_ENVELOPE_DATA] & AUDIO_ENVELOPE_COUNT_MASK) >> AUDIO_ENVELOPE_COUNT_SHIFT; }
- void set_edd(const offs_t channel, uint8_t edd) { m_audio_regs[(channel << 4) | AUDIO_ENVELOPE_DATA] = (m_audio_regs[(channel << 4) | AUDIO_ENVELOPE_DATA] & ~AUDIO_EDD_MASK) | edd; }
- void set_envelope_count(const offs_t channel, uint16_t count) { m_audio_regs[(channel << 4) | AUDIO_ENVELOPE_DATA] = get_edd(channel) | (count << AUDIO_ENVELOPE_COUNT_SHIFT); }
-
- // Audio Envelope1 Data getters
- uint16_t get_envelope_load(const offs_t channel) const { return m_audio_regs[(channel << 4) | AUDIO_ENVELOPE1] & AUDIO_ENVELOPE_LOAD_MASK; }
- uint16_t get_envelope_repeat_bit(const offs_t channel) const { return (m_audio_regs[(channel << 4) | AUDIO_ENVELOPE1] & AUDIO_ENVELOPE_RPT_MASK) ? 1 : 0; }
- uint16_t get_envelope_repeat_count(const offs_t channel) const { return (m_audio_regs[(channel << 4) | AUDIO_ENVELOPE1] & AUDIO_ENVELOPE_RPCNT_MASK) >> AUDIO_ENVELOPE_RPCNT_SHIFT; }
- inline void set_envelope_repeat_count(const offs_t channel, const uint16_t count) { m_audio_regs[(channel << 4) | AUDIO_ENVELOPE1] = (m_audio_regs[(channel << 4) | AUDIO_ENVELOPE1] & ~AUDIO_ENVELOPE_RPCNT_MASK) | ((count << AUDIO_ENVELOPE_RPCNT_SHIFT) & AUDIO_ENVELOPE_RPCNT_MASK); }
-
- // Audio Envelope Address getters
- uint16_t get_envelope_addr_high(const offs_t channel) const { return m_audio_regs[(channel << 4) | AUDIO_ENVELOPE_ADDR_HIGH] & AUDIO_EADDR_HIGH_MASK; }
- uint16_t get_audio_irq_enable_bit(const offs_t channel) const { return (m_audio_regs[(channel << 4) | AUDIO_ENVELOPE_ADDR_HIGH] & AUDIO_IRQ_EN_MASK) ? 1 : 0; }
- uint16_t get_audio_irq_addr(const offs_t channel) const { return (m_audio_regs[(channel << 4) | AUDIO_ENVELOPE_ADDR_HIGH] & AUDIO_IRQ_ADDR_MASK) >> AUDIO_IRQ_ADDR_SHIFT; }
-
- // Audio Envelope Loop getters
- uint16_t get_envelope_eaoffset(const offs_t channel) const { return m_audio_regs[(channel << 4) | AUDIO_ENVELOPE_LOOP_CTRL] & AUDIO_EAOFFSET_MASK; }
- uint16_t get_rampdown_offset(const offs_t channel) const { return (m_audio_regs[(channel << 4) | AUDIO_ENVELOPE_LOOP_CTRL] & AUDIO_RAMPDOWN_OFFSET_MASK) >> AUDIO_RAMPDOWN_OFFSET_SHIFT; }
- void set_envelope_eaoffset(const offs_t channel, uint16_t eaoffset) { m_audio_regs[(channel << 4) | AUDIO_ENVELOPE_LOOP_CTRL] = (m_audio_regs[(channel << 4) | AUDIO_ENVELOPE_LOOP_CTRL] & ~AUDIO_RAMPDOWN_OFFSET_MASK) | (eaoffset & AUDIO_EAOFFSET_MASK); }
-
- // Audio ADPCM getters
- uint16_t get_point_number(const offs_t channel) const { return (m_audio_regs[(channel << 4) | AUDIO_ADPCM_SEL] & AUDIO_POINT_NUMBER_MASK) >> AUDIO_POINT_NUMBER_SHIFT; }
- uint16_t get_adpcm36_bit(const offs_t channel) const { return (m_audio_regs[(channel << 4) | AUDIO_ADPCM_SEL] & AUDIO_ADPCM36_MASK) ? 1 : 0; }
-
- // Audio high-word getters
- uint16_t get_phase_high(const offs_t channel) const { return m_audio_regs[(channel << 4) | AUDIO_PHASE_HIGH] & AUDIO_PHASE_HIGH_MASK; }
- uint16_t get_phase_accum_high(const offs_t channel) const { return m_audio_regs[(channel << 4) | AUDIO_PHASE_ACCUM_HIGH] & AUDIO_PHASE_ACCUM_HIGH_MASK; }
- uint16_t get_target_phase_high(const offs_t channel) const { return m_audio_regs[(channel << 4) | AUDIO_TARGET_PHASE_HIGH] & AUDIO_TARGET_PHASE_HIGH_MASK; }
- uint16_t get_rampdown_clock(const offs_t channel) const { return m_audio_regs[(channel << 4) | AUDIO_RAMP_DOWN_CLOCK] & AUDIO_RAMP_DOWN_CLOCK_MASK; }
-
- // Audio ADPCM getters
- uint16_t get_phase_offset(const offs_t channel) const { return m_audio_regs[(channel << 4) | AUDIO_PHASE_CTRL] & AUDIO_PHASE_OFFSET_MASK; }
- uint16_t get_phase_sign_bit(const offs_t channel) const { return (m_audio_regs[(channel << 4) | AUDIO_PHASE_CTRL] & AUDIO_PHASE_SIGN_MASK) >> AUDIO_PHASE_SIGN_SHIFT; }
- uint16_t get_phase_time_step(const offs_t channel) const { return (m_audio_regs[(channel << 4) | AUDIO_PHASE_CTRL] & AUDIO_PHASE_TIME_STEP_MASK) >> AUDIO_PHASE_TIME_STEP_SHIFT; }
-
- // Audio combined getters
- uint32_t get_phase(const offs_t channel) const { return ((uint32_t)get_phase_high(channel) << 16) | m_audio_regs[(channel << 4) | AUDIO_PHASE]; }
- uint32_t get_phase_accum(const offs_t channel) const { return ((uint32_t)get_phase_accum_high(channel) << 16) | m_audio_regs[(channel << 4) | AUDIO_PHASE_ACCUM]; }
- uint32_t get_target_phase(const offs_t channel) const { return ((uint32_t)get_target_phase_high(channel) << 16) | m_audio_regs[(channel << 4) | AUDIO_TARGET_PHASE]; }
- uint32_t get_wave_addr(const offs_t channel) const { return ((uint32_t)get_wave_addr_high(channel) << 16) | m_audio_regs[(channel << 4) | AUDIO_WAVE_ADDR]; }
- uint32_t get_loop_addr(const offs_t channel) const { return ((uint32_t)get_loop_addr_high(channel) << 16) | m_audio_regs[(channel << 4) | AUDIO_LOOP_ADDR]; }
- uint32_t get_envelope_addr(const offs_t channel) const { return ((uint32_t)get_envelope_addr_high(channel) << 16) | m_audio_regs[(channel << 4) | AUDIO_ENVELOPE_ADDR]; }
-
- enum
- {
- AUDIO_WAVE_ADDR = 0x000,
-
- AUDIO_MODE = 0x001,
- AUDIO_WADDR_HIGH_MASK = 0x003f,
- AUDIO_LADDR_HIGH_MASK = 0x0fc0,
- AUDIO_LADDR_HIGH_SHIFT = 6,
- AUDIO_TONE_MODE_MASK = 0x3000,
- AUDIO_TONE_MODE_SHIFT = 12,
- AUDIO_TONE_MODE_SW = 0,
- AUDIO_TONE_MODE_HW_ONESHOT = 1,
- AUDIO_TONE_MODE_HW_LOOP = 2,
- AUDIO_16M_MASK = 0x4000,
- AUDIO_ADPCM_MASK = 0x8000,
-
- AUDIO_LOOP_ADDR = 0x002,
-
- AUDIO_PAN_VOL = 0x003,
- AUDIO_PAN_VOL_MASK = 0x7f7f,
- AUDIO_VOLUME_MASK = 0x007f,
- AUDIO_PAN_MASK = 0x7f00,
- AUDIO_PAN_SHIFT = 8,
-
- AUDIO_ENVELOPE0 = 0x004,
- AUDIO_ENVELOPE_INC_MASK = 0x007f,
- AUDIO_ENVELOPE_SIGN_MASK = 0x0080,
- AUDIO_ENVELOPE_TARGET_MASK = 0x7f00,
- AUDIO_ENVELOPE_TARGET_SHIFT = 8,
- AUDIO_ENVELOPE_REPEAT_PERIOD_MASK = 0x8000,
-
- AUDIO_ENVELOPE_DATA = 0x005,
- AUDIO_ENVELOPE_DATA_MASK = 0xff7f,
- AUDIO_EDD_MASK = 0x007f,
- AUDIO_ENVELOPE_COUNT_MASK = 0xff00,
- AUDIO_ENVELOPE_COUNT_SHIFT = 8,
-
- AUDIO_ENVELOPE1 = 0x006,
- AUDIO_ENVELOPE_LOAD_MASK = 0x00ff,
- AUDIO_ENVELOPE_RPT_MASK = 0x0100,
- AUDIO_ENVELOPE_RPCNT_MASK = 0xfe00,
- AUDIO_ENVELOPE_RPCNT_SHIFT = 9,
-
- AUDIO_ENVELOPE_ADDR_HIGH = 0x007,
- AUDIO_EADDR_HIGH_MASK = 0x003f,
- AUDIO_IRQ_EN_MASK = 0x0040,
- AUDIO_IRQ_ADDR_MASK = 0xff80,
- AUDIO_IRQ_ADDR_SHIFT = 7,
-
- AUDIO_ENVELOPE_ADDR = 0x008,
- AUDIO_WAVE_DATA_PREV = 0x009,
-
- AUDIO_ENVELOPE_LOOP_CTRL = 0x00a,
- AUDIO_EAOFFSET_MASK = 0x01ff,
- AUDIO_RAMPDOWN_OFFSET_MASK = 0xfe00,
- AUDIO_RAMPDOWN_OFFSET_SHIFT = 9,
-
- AUDIO_WAVE_DATA = 0x00b,
-
- AUDIO_ADPCM_SEL = 0x00d,
- AUDIO_ADPCM_SEL_MASK = 0xfe00,
- AUDIO_POINT_NUMBER_MASK = 0x7e00,
- AUDIO_POINT_NUMBER_SHIFT = 9,
- AUDIO_ADPCM36_MASK = 0x8000,
-
- AUDIO_PHASE_HIGH = 0x200,
- AUDIO_PHASE_HIGH_MASK = 0x0007,
-
- AUDIO_PHASE_ACCUM_HIGH = 0x201,
- AUDIO_PHASE_ACCUM_HIGH_MASK = 0x0007,
-
- AUDIO_TARGET_PHASE_HIGH = 0x202,
- AUDIO_TARGET_PHASE_HIGH_MASK= 0x0007,
-
- AUDIO_RAMP_DOWN_CLOCK = 0x203,
- AUDIO_RAMP_DOWN_CLOCK_MASK = 0x0007,
-
- AUDIO_PHASE = 0x204,
- AUDIO_PHASE_ACCUM = 0x205,
- AUDIO_TARGET_PHASE = 0x206,
-
- AUDIO_PHASE_CTRL = 0x207,
- AUDIO_PHASE_OFFSET_MASK = 0x0fff,
- AUDIO_PHASE_SIGN_MASK = 0x1000,
- AUDIO_PHASE_SIGN_SHIFT = 12,
- AUDIO_PHASE_TIME_STEP_MASK = 0xe000,
- AUDIO_PHASE_TIME_STEP_SHIFT = 13,
-
- AUDIO_CHAN_OFFSET_MASK = 0xf0f,
-
- AUDIO_CHANNEL_ENABLE = 0x400,
- AUDIO_CHANNEL_ENABLE_MASK = 0xffff,
-
- AUDIO_MAIN_VOLUME = 0x401,
- AUDIO_MAIN_VOLUME_MASK = 0x007f,
-
- AUDIO_CHANNEL_FIQ_ENABLE = 0x402,
- AUDIO_CHANNEL_FIQ_ENABLE_MASK = 0xffff,
-
- AUDIO_CHANNEL_FIQ_STATUS = 0x403,
- AUDIO_CHANNEL_FIQ_STATUS_MASK = 0xffff,
-
- AUDIO_BEAT_BASE_COUNT = 0x404,
- AUDIO_BEAT_BASE_COUNT_MASK = 0x07ff,
-
- AUDIO_BEAT_COUNT = 0x405,
- AUDIO_BEAT_COUNT_MASK = 0x3fff,
- AUDIO_BIS_MASK = 0x4000,
- AUDIO_BIE_MASK = 0x8000,
-
- AUDIO_ENVCLK0 = 0x406,
-
- AUDIO_ENVCLK0_HIGH = 0x407,
- AUDIO_ENVCLK0_HIGH_MASK = 0xffff,
-
- AUDIO_ENVCLK1 = 0x408,
-
- AUDIO_ENVCLK1_HIGH = 0x409,
- AUDIO_ENVCLK1_HIGH_MASK = 0xffff,
-
- AUDIO_ENV_RAMP_DOWN = 0x40a,
- AUDIO_ENV_RAMP_DOWN_MASK = 0xffff,
-
- AUDIO_CHANNEL_STOP = 0x40b,
- AUDIO_CHANNEL_STOP_MASK = 0xffff,
-
- AUDIO_CHANNEL_ZERO_CROSS = 0x40c,
- AUDIO_CHANNEL_ZERO_CROSS_MASK = 0xffff,
-
- AUDIO_CONTROL = 0x40d,
- AUDIO_CONTROL_MASK = 0x9fe8,
- AUDIO_CONTROL_SATURATE_MASK = 0x8000,
- AUDIO_CONTROL_SOFTCH_MASK = 0x1000,
- AUDIO_CONTROL_COMPEN_MASK = 0x0800,
- AUDIO_CONTROL_NOHIGH_MASK = 0x0400,
- AUDIO_CONTROL_NOINT_MASK = 0x0200,
- AUDIO_CONTROL_EQEN_MASK = 0x0100,
- AUDIO_CONTROL_VOLSEL_MASK = 0x00c0,
- AUDIO_CONTROL_VOLSEL_SHIFT = 6,
- AUDIO_CONTROL_FOF_MASK = 0x0020,
- AUDIO_CONTROL_INIT_MASK = 0x0008,
-
- AUDIO_COMPRESS_CTRL = 0x40e,
- AUDIO_COMPRESS_CTRL_PEAK_MASK = 0x8000,
- AUDIO_COMPRESS_CTRL_THRESHOLD_MASK = 0x7f00,
- AUDIO_COMPRESS_CTRL_THRESHOLD_SHIFT = 8,
- AUDIO_COMPRESS_CTRL_ATTSCALE_MASK = 0x00c0,
- AUDIO_COMPRESS_CTRL_ATTSCALE_SHIFT = 6,
- AUDIO_COMPRESS_CTRL_RELSCALE_MASK = 0x0030,
- AUDIO_COMPRESS_CTRL_RELSCALE_SHIFT = 4,
- AUDIO_COMPRESS_CTRL_DISZC_MASK = 0x0008,
- AUDIO_COMPRESS_CTRL_RATIO_MASK = 0x0007,
-
- AUDIO_CHANNEL_STATUS = 0x40f,
- AUDIO_CHANNEL_STATUS_MASK = 0xffff,
-
- AUDIO_WAVE_IN_L = 0x410,
-
- AUDIO_WAVE_IN_R = 0x411,
- AUDIO_SOFTIRQ_MASK = 0x8000,
- AUDIO_SOFTIRQ_EN_MASK = 0x4000,
- AUDIO_SOFT_PHASE_HIGH_MASK = 0x0070,
- AUDIO_SOFT_PHASE_HIGH_SHIFT = 4,
- AUDIO_FIFO_IRQ_THRESHOLD_MASK = 0x000f,
-
- AUDIO_WAVE_OUT_L = 0x412,
- AUDIO_WAVE_OUT_R = 0x413,
-
- AUDIO_CHANNEL_REPEAT = 0x414,
- AUDIO_CHANNEL_REPEAT_MASK = 0xffff,
-
- AUDIO_CHANNEL_ENV_MODE = 0x415,
- AUDIO_CHANNEL_ENV_MODE_MASK = 0xffff,
-
- AUDIO_CHANNEL_TONE_RELEASE = 0x416,
- AUDIO_CHANNEL_TONE_RELEASE_MASK = 0xffff,
-
- AUDIO_CHANNEL_ENV_IRQ = 0x417,
- AUDIO_CHANNEL_ENV_IRQ_MASK = 0xffff,
-
- AUDIO_CHANNEL_PITCH_BEND = 0x418,
- AUDIO_CHANNEL_PITCH_BEND_MASK = 0xffff,
-
- AUDIO_SOFT_PHASE = 0x419,
-
- AUDIO_ATTACK_RELEASE = 0x41a,
- AUDIO_RELEASE_TIME_MASK = 0x00ff,
- AUDIO_ATTACK_TIME_MASK = 0xff00,
- AUDIO_ATTACK_TIME_SHIFT = 8,
-
- AUDIO_EQ_CUTOFF10 = 0x41b,
- AUDIO_EQ_CUTOFF10_MASK = 0x7f7f,
-
- AUDIO_EQ_CUTOFF32 = 0x41c,
- AUDIO_EQ_CUTOFF32_MASK = 0x7f7f,
+ DECLARE_READ16_MEMBER(video_r);
+ DECLARE_WRITE16_MEMBER(video_w);
- AUDIO_EQ_GAIN10 = 0x41d,
- AUDIO_EQ_GAIN10_MASK = 0x7f7f,
+ DECLARE_READ16_MEMBER(dma_r);
+ DECLARE_WRITE16_MEMBER(dma_w);
- AUDIO_EQ_GAIN32 = 0x41e,
- AUDIO_EQ_GAIN32_MASK = 0x7f7f
- };
+ DECLARE_WRITE_LINE_MEMBER(audioirq_w);
+ DECLARE_WRITE_LINE_MEMBER(timerirq_w);
+ DECLARE_WRITE_LINE_MEMBER(uartirq_w);
+ DECLARE_WRITE_LINE_MEMBER(extirq_w);
+ DECLARE_WRITE_LINE_MEMBER(ffreq1_w);
+ DECLARE_WRITE_LINE_MEMBER(ffreq2_w);
- DECLARE_READ16_MEMBER(video_r);
- DECLARE_WRITE16_MEMBER(video_w);
- DECLARE_READ16_MEMBER(audio_r);
- DECLARE_WRITE16_MEMBER(audio_w);
- DECLARE_READ16_MEMBER(io_r);
- DECLARE_WRITE16_MEMBER(io_w);
+ DECLARE_READ16_MEMBER(space_r);
- void check_irqs(const uint16_t changed);
inline void check_video_irq();
void spg2xx_map(address_map &map);
- static const device_timer_id TIMER_TMB1 = 0;
- static const device_timer_id TIMER_TMB2 = 1;
static const device_timer_id TIMER_SCREENPOS = 2;
- static const device_timer_id TIMER_BEAT = 3;
+
virtual void device_start() override;
virtual void device_reset() override;
virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override;
- void update_porta_special_modes();
- void update_portb_special_modes();
- void do_gpio(uint32_t offset);
-
- void do_i2c();
void do_cpu_dma(uint32_t len);
void do_sprite_dma(uint32_t len);
- void apply_saturation(const rectangle &cliprect);
- void apply_fade(const rectangle &cliprect);
- void blit(const rectangle &cliprect, uint32_t xoff, uint32_t yoff, uint32_t attr, uint32_t ctrl, uint32_t bitmap_addr, uint16_t tile);
- void blit_page(const rectangle &cliprect, int depth, uint32_t bitmap_addr, uint16_t *regs);
- void blit_sprite(const rectangle &cliprect, int depth, uint32_t base_addr);
- void blit_sprites(const rectangle &cliprect, int depth);
-
- uint8_t expand_rgb5_to_rgb8(uint8_t val);
- uint8_t mix_channel(uint8_t a, uint8_t b);
- void mix_pixel(uint32_t offset, uint16_t rgb);
- void set_pixel(uint32_t offset, uint16_t rgb);
+ enum blend_enable_t : bool
+ {
+ BlendOff = false,
+ BlendOn = true
+ };
- void stop_channel(const uint32_t channel);
- bool advance_channel(address_space &space, const uint32_t channel);
- bool fetch_sample(address_space &space, const uint32_t channel);
- void loop_channel(const uint32_t channel);
+ enum rowscroll_enable_t : bool
+ {
+ RowScrollOff = false,
+ RowScrollOn = true
+ };
- struct rgbtriad_t
+ enum flipx_t : bool
{
- uint8_t r, g, b;
+ FlipXOff = false,
+ FlipXOn = true
};
- rgbtriad_t m_screenbuf[320 * 240];
+ void apply_saturation(const rectangle &cliprect);
+ void apply_fade(const rectangle &cliprect);
+
+ template<blend_enable_t Blend, rowscroll_enable_t RowScroll, flipx_t FlipX>
+ void blit(const rectangle &cliprect, uint32_t line, uint32_t xoff, uint32_t yoff, uint32_t attr, uint32_t ctrl, uint32_t bitmap_addr, uint16_t tile);
+ void blit_page(const rectangle &cliprect, uint32_t scanline, int depth, uint32_t bitmap_addr, uint16_t *regs);
+ void blit_sprite(const rectangle &cliprect, uint32_t scanline, int depth, uint32_t base_addr);
+ void blit_sprites(const rectangle &cliprect, uint32_t scanline, int depth);
+
+ uint8_t mix_channel(uint8_t a, uint8_t b);
+
+ uint32_t m_screenbuf[320 * 240];
+ uint8_t m_rgb5_to_rgb8[32];
+ uint32_t m_rgb555_to_rgb888[0x8000];
bool m_hide_page0;
bool m_hide_page1;
bool m_hide_sprites;
bool m_debug_sprites;
bool m_debug_blit;
+ bool m_debug_palette;
uint8_t m_sprite_index_to_debug;
- bool m_debug_samples;
- bool m_debug_rates;
-
- uint16_t m_audio_regs[0x800];
- uint8_t m_sample_shift[16];
- uint32_t m_sample_count[16];
- uint32_t m_sample_addr[16];
- double m_channel_rate[16];
- double m_channel_rate_accum[16];
- uint32_t m_rampdown_frame[16];
- uint32_t m_envclk_frame[16];
- uint32_t m_envelope_addr[16];
- int m_channel_debug;
- uint16_t m_audio_curr_beat_base_count;
-
- uint16_t m_io_regs[0x200];
- uint8_t m_uart_rx_fifo[8];
- uint8_t m_uart_rx_fifo_start;
- uint8_t m_uart_rx_fifo_end;
- uint8_t m_uart_rx_fifo_count;
- bool m_uart_rx_available;
+ uint16_t m_dma_regs[0x4];
uint16_t m_video_regs[0x100];
- size_t m_sprite_limit;
+ uint32_t m_sprite_limit;
+ int m_rowscrolloffset; // auto racing in 'zone60' minigames needs this to be 15, the JAKKS games (Star Wars Revenge of the sith - Gunship Battle, Wheel of Fortune, Namco Ms. Pac-Man 5-in-1 Pole Position) need it to be 0, where does it come from?
uint16_t m_pal_flag;
devcb_write16 m_porta_out;
@@ -473,6 +184,8 @@ protected:
devcb_read16 m_portb_in;
devcb_read16 m_portc_in;
+ devcb_read16 m_adc_in[2];
+
devcb_write8 m_eeprom_w;
devcb_read8 m_eeprom_r;
@@ -480,13 +193,7 @@ protected:
devcb_write8 m_chip_sel;
- emu_timer *m_tmb1;
- emu_timer *m_tmb2;
emu_timer *m_screenpos_timer;
- emu_timer *m_audio_beat;
-
- sound_stream *m_stream;
- oki_adpcm_state m_adpcm[16];
required_device<unsp_device> m_cpu;
required_device<screen_device> m_screen;
@@ -494,8 +201,23 @@ protected:
required_shared_ptr<uint16_t> m_paletteram;
required_shared_ptr<uint16_t> m_spriteram;
- static const uint32_t s_rampdown_frame_counts[8];
- static const uint32_t s_envclk_frame_counts[16];
+ void configure_spg_io(spg2xx_io_device* io);
+
+ DECLARE_READ16_MEMBER(porta_r) { return m_porta_in(); };
+ DECLARE_READ16_MEMBER(portb_r) { return m_portb_in(); };
+ DECLARE_READ16_MEMBER(portc_r) { return m_portc_in(); };
+ DECLARE_WRITE16_MEMBER(porta_w) { m_porta_out(offset, data, mem_mask); };
+ DECLARE_WRITE16_MEMBER(portb_w) { m_portb_out(offset, data, mem_mask); };
+ DECLARE_WRITE16_MEMBER(portc_w) { m_portc_out(offset, data, mem_mask); };
+ template <size_t Line> DECLARE_READ16_MEMBER(adc_r) { return m_adc_in[Line](); };
+
+ DECLARE_WRITE8_MEMBER(eepromx_w) { m_eeprom_w(offset, data, mem_mask); };
+ DECLARE_READ8_MEMBER(eepromx_r) { return m_eeprom_r(); };
+
+ DECLARE_WRITE8_MEMBER(tx_w) { m_uart_tx(offset, data, mem_mask); };
+ DECLARE_WRITE8_MEMBER(cs_w) { m_chip_sel(offset, data, mem_mask); };
+ DECLARE_READ16_MEMBER(get_pal_r) { return m_pal_flag; };
+
};
class spg24x_device : public spg2xx_device
@@ -510,6 +232,9 @@ public:
}
spg24x_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+
+ virtual void device_add_mconfig(machine_config &config) override;
+
};
class spg28x_device : public spg2xx_device
@@ -524,6 +249,9 @@ public:
}
spg28x_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+
+ virtual void device_add_mconfig(machine_config &config) override;
+
};
DECLARE_DEVICE_TYPE(SPG24X, spg24x_device)
diff --git a/src/devices/machine/spg2xx_audio.cpp b/src/devices/machine/spg2xx_audio.cpp
new file mode 100644
index 00000000000..a09eb907694
--- /dev/null
+++ b/src/devices/machine/spg2xx_audio.cpp
@@ -0,0 +1,1258 @@
+// license:BSD-3-Clause
+// copyright-holders:Ryan Holtz
+/*****************************************************************************
+
+ SunPlus SPG2xx-series SoC peripheral emulation (Audio)
+
+**********************************************************************/
+
+#include "emu.h"
+#include "spg2xx_audio.h"
+
+DEFINE_DEVICE_TYPE(SPG2XX_AUDIO, spg2xx_audio_device, "spg2xx", "SPG2xx-series System-on-a-Chip Audio")
+
+#define LOG_SPU_READS (1U << 0)
+#define LOG_SPU_WRITES (1U << 1)
+#define LOG_UNKNOWN_SPU (1U << 2)
+#define LOG_CHANNEL_READS (1U << 3)
+#define LOG_CHANNEL_WRITES (1U << 4)
+#define LOG_ENVELOPES (1U << 5)
+#define LOG_SAMPLES (1U << 6)
+#define LOG_RAMPDOWN (1U << 7)
+#define LOG_BEAT (1U << 8)
+
+#define LOG_ALL (LOG_SPU_READS | LOG_SPU_WRITES | LOG_UNKNOWN_SPU | LOG_CHANNEL_READS | LOG_CHANNEL_WRITES \
+ | LOG_ENVELOPES | LOG_SAMPLES | LOG_RAMPDOWN | LOG_BEAT)
+
+#define VERBOSE (0)
+#include "logmacro.h"
+
+#define SPG_DEBUG_AUDIO (0)
+
+
+spg2xx_audio_device::spg2xx_audio_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock)
+ : device_t(mconfig, type, tag, owner, clock)
+ , device_sound_interface(mconfig, *this)
+ , m_space_read_cb(*this)
+ , m_irq_cb(*this)
+{
+}
+
+spg2xx_audio_device::spg2xx_audio_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+ : spg2xx_audio_device(mconfig, SPG2XX_AUDIO, tag, owner, clock)
+{
+}
+
+
+void spg2xx_audio_device::device_start()
+{
+ m_audio_beat = timer_alloc(TIMER_BEAT);
+ m_audio_beat->adjust(attotime::never);
+
+ m_stream = stream_alloc(0, 2, 281250/4);
+
+ m_channel_debug = -1;
+
+ save_item(NAME(m_debug_samples));
+ save_item(NAME(m_debug_rates));
+
+ save_item(NAME(m_audio_regs));
+ save_item(NAME(m_audio_phase_regs));
+ save_item(NAME(m_audio_ctrl_regs));
+
+ save_item(NAME(m_sample_shift));
+ save_item(NAME(m_sample_count));
+ save_item(NAME(m_sample_addr));
+ save_item(NAME(m_channel_rate));
+ save_item(NAME(m_channel_rate_accum));
+ save_item(NAME(m_rampdown_frame));
+ save_item(NAME(m_envclk_frame));
+ save_item(NAME(m_envelope_addr));
+ save_item(NAME(m_channel_debug));
+ save_item(NAME(m_audio_curr_beat_base_count));
+
+
+ for (int i = 0; i < 16; i++)
+ {
+ save_item(NAME(m_adpcm[i].m_signal), i);
+ save_item(NAME(m_adpcm[i].m_step), i);
+ }
+
+ m_space_read_cb.resolve_safe(0);
+ m_irq_cb.resolve();
+}
+
+void spg2xx_audio_device::device_reset()
+{
+ memset(m_audio_regs, 0, 0x200 * sizeof(uint16_t));
+ memset(m_audio_phase_regs, 0, 0x200 * sizeof(uint16_t));
+ memset(m_audio_ctrl_regs, 0, 0x400 * sizeof(uint16_t));
+
+ memset(m_sample_shift, 0, 16);
+ memset(m_sample_count, 0, sizeof(uint32_t) * 16);
+ memset(m_sample_addr, 0, sizeof(uint32_t) * 16);
+ memset(m_channel_rate, 0, sizeof(double) * 16);
+ memset(m_channel_rate_accum, 0, sizeof(double) * 16);
+ memset(m_rampdown_frame, 0, sizeof(uint32_t) * 16);
+ memset(m_envclk_frame, 4, sizeof(uint32_t) * 16);
+ memset(m_envelope_addr, 0, sizeof(uint32_t) * 16);
+
+ m_debug_samples = false;
+ m_debug_rates = false;
+ m_audio_curr_beat_base_count = 0;
+
+ m_audio_ctrl_regs[AUDIO_CHANNEL_REPEAT] = 0x3f;
+ m_audio_ctrl_regs[AUDIO_CHANNEL_ENV_MODE] = 0x3f;
+
+ m_audio_beat->adjust(attotime::from_ticks(4, 281250), 0, attotime::from_ticks(4, 281250));
+}
+
+
+void spg2xx_audio_device::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr)
+{
+ switch (id)
+ {
+ case TIMER_BEAT:
+ audio_beat_tick();
+ break;
+ }
+}
+
+/***********************
+* Audio Hardware *
+***********************/
+void spg2xx_audio_device::check_irqs(const uint16_t changed)
+{
+ if (changed & (AUDIO_BIS_MASK | AUDIO_BIE_MASK)) // Beat IRQ
+ {
+ if ((m_audio_ctrl_regs[AUDIO_BEAT_COUNT] & (AUDIO_BIS_MASK | AUDIO_BIE_MASK)) == (AUDIO_BIS_MASK | AUDIO_BIE_MASK))
+ {
+ LOGMASKED(LOG_BEAT, "Asserting beat IRQ\n");
+ m_irq_cb(true);
+ }
+ else
+ {
+ LOGMASKED(LOG_BEAT, "Clearing beat IRQ\n");
+ m_irq_cb(false);
+ }
+ }
+}
+
+READ16_MEMBER(spg2xx_audio_device::audio_ctrl_r)
+{
+ uint16_t data = m_audio_ctrl_regs[offset];
+
+ switch (offset)
+ {
+ case AUDIO_CHANNEL_ENABLE:
+ LOGMASKED(LOG_SPU_READS, "audio_ctrl_r: Channel Enable: %04x\n", data);
+ break;
+
+ case AUDIO_MAIN_VOLUME:
+ LOGMASKED(LOG_SPU_READS, "audio_ctrl_r: Main Volume: %04x\n", data);
+ break;
+
+ case AUDIO_CHANNEL_FIQ_ENABLE:
+ LOGMASKED(LOG_SPU_READS, "audio_ctrl_r: Channel FIQ Enable: %04x\n", data);
+ break;
+
+ case AUDIO_CHANNEL_FIQ_STATUS:
+ LOGMASKED(LOG_SPU_READS, "audio_ctrl_r: Channel FIQ Acknowledge: %04x\n", data);
+ break;
+
+ case AUDIO_BEAT_BASE_COUNT:
+ LOGMASKED(LOG_SPU_READS | LOG_BEAT, "audio_ctrl_r: Beat Base Count: %04x\n", data);
+ break;
+
+ case AUDIO_BEAT_COUNT:
+ LOGMASKED(LOG_SPU_READS | LOG_BEAT, "audio_ctrl_r: Beat Count: %04x\n", data);
+ break;
+
+ case AUDIO_ENVCLK0:
+ case AUDIO_ENVCLK1:
+ LOGMASKED(LOG_SPU_READS | LOG_ENVELOPES, "audio_ctrl_r: Envelope Interval %d (lo): %04x\n", offset == AUDIO_ENVCLK0 ? 0 : 1, data);
+ break;
+
+ case AUDIO_ENVCLK0_HIGH:
+ case AUDIO_ENVCLK1_HIGH:
+ LOGMASKED(LOG_SPU_READS | LOG_ENVELOPES, "audio_ctrl_r: Envelope Interval %d (hi): %04x\n", offset == AUDIO_ENVCLK0_HIGH ? 0 : 1, data);
+ break;
+
+ case AUDIO_ENV_RAMP_DOWN:
+ LOGMASKED(LOG_SPU_READS | LOG_RAMPDOWN, "audio_ctrl_r: Envelope Fast Ramp Down: %04x\n", data);
+ break;
+
+ case AUDIO_CHANNEL_STOP:
+ LOGMASKED(LOG_SPU_READS, "audio_ctrl_r: Channel Stop Status: %04x\n", data);
+ break;
+
+ case AUDIO_CHANNEL_ZERO_CROSS:
+ LOGMASKED(LOG_SPU_READS, "audio_ctrl_r: Channel Zero-Cross Enable: %04x\n", data);
+ break;
+
+ case AUDIO_CONTROL:
+ LOGMASKED(LOG_SPU_READS, "audio_ctrl_r: Control: %04x\n", data);
+ break;
+
+ case AUDIO_COMPRESS_CTRL:
+ LOGMASKED(LOG_SPU_READS, "audio_ctrl_r: Compressor Control: %04x\n", data);
+ break;
+
+ case AUDIO_CHANNEL_STATUS:
+ LOGMASKED(LOG_SPU_READS, "audio_ctrl_r: Channel Status: %04x\n", data);
+ break;
+
+ case AUDIO_WAVE_IN_L:
+ LOGMASKED(LOG_SPU_READS, "audio_ctrl_r: Wave In (L) / FIFO Write Data: %04x\n", data);
+ break;
+
+ case AUDIO_WAVE_IN_R:
+ LOGMASKED(LOG_SPU_READS, "audio_ctrl_r: Wave In (R) / Software Channel FIFO IRQ Control: %04x\n", data);
+ break;
+
+ case AUDIO_WAVE_OUT_L:
+ LOGMASKED(LOG_SPU_READS, "audio_ctrl_r: Wave Out (L): %04x\n", data);
+ break;
+
+ case AUDIO_WAVE_OUT_R:
+ LOGMASKED(LOG_SPU_READS, "audio_ctrl_r: Wave Out (R): %04x\n", data);
+ break;
+
+ case AUDIO_CHANNEL_REPEAT:
+ LOGMASKED(LOG_SPU_READS, "audio_ctrl_r: Channel Repeat Enable: %04x\n", data);
+ break;
+
+ case AUDIO_CHANNEL_ENV_MODE:
+ LOGMASKED(LOG_SPU_READS | LOG_ENVELOPES, "audio_ctrl_r: Channel Envelope Enable: %04x\n", data);
+ break;
+
+ case AUDIO_CHANNEL_TONE_RELEASE:
+ LOGMASKED(LOG_SPU_READS, "audio_ctrl_r: Channel Tone Release Enable: %04x\n", data);
+ break;
+
+ case AUDIO_CHANNEL_ENV_IRQ:
+ LOGMASKED(LOG_SPU_READS, "audio_ctrl_r: Channel Envelope IRQ Status: %04x\n", data);
+ break;
+
+ case AUDIO_CHANNEL_PITCH_BEND:
+ LOGMASKED(LOG_SPU_READS, "audio_ctrl_r: Channel Pitch Bend Enable: %04x\n", data);
+ break;
+
+ case AUDIO_SOFT_PHASE:
+ LOGMASKED(LOG_SPU_READS, "audio_ctrl_r: Software Channel Phase: %04x\n", data);
+ break;
+
+ case AUDIO_ATTACK_RELEASE:
+ LOGMASKED(LOG_SPU_READS, "audio_ctrl_r: Attack/Release Time Control: %04x\n", data);
+ break;
+
+ case AUDIO_EQ_CUTOFF10:
+ LOGMASKED(LOG_SPU_READS, "audio_ctrl_r: EQ Cutoff Frequency 0/1: %04x\n", data);
+ break;
+
+ case AUDIO_EQ_CUTOFF32:
+ LOGMASKED(LOG_SPU_READS, "audio_ctrl_r: EQ Cutoff Frequency 2/3: %04x\n", data);
+ break;
+
+ case AUDIO_EQ_GAIN10:
+ LOGMASKED(LOG_SPU_READS, "audio_ctrl_r: EQ Cutoff Gain 0/1: %04x\n", data);
+ break;
+
+ case AUDIO_EQ_GAIN32:
+ LOGMASKED(LOG_SPU_READS, "audio_ctrl_r: EQ Cutoff Gain 2/3: %04x\n", data);
+ break;
+
+ default:
+ LOGMASKED(LOG_UNKNOWN_SPU, "audio_ctrl_r: Unknown register %04x = %04x\n", 0x3000 + offset, data);
+ break;
+ }
+
+ return data;
+}
+
+READ16_MEMBER(spg2xx_audio_device::audio_r)
+{
+ const uint16_t channel = (offset & 0x00f0) >> 4;
+ uint16_t data = m_audio_regs[offset];
+
+
+ switch (offset & AUDIO_CHAN_OFFSET_MASK)
+ {
+ case AUDIO_WAVE_ADDR:
+ LOGMASKED(LOG_CHANNEL_READS, "audio_r: Channel %d: Wave Addr (lo): %04x\n", channel, data);
+ break;
+
+ case AUDIO_MODE:
+ LOGMASKED(LOG_CHANNEL_READS, "audio_r: Channel %d: Mode: %04x (ADPCM:%d, 16M:%d, TONE:%d, LADDR_HI:%04x, WADDR_HI:%04x)\n", channel, data,
+ get_adpcm_bit(channel), get_16bit_bit(channel), get_tone_mode(channel), get_loop_addr_high(channel), get_wave_addr_high(channel));
+ break;
+
+ case AUDIO_LOOP_ADDR:
+ LOGMASKED(LOG_CHANNEL_READS, "audio_r: Channel %d: Loop Addr: %04x\n", channel, data);
+ break;
+
+ case AUDIO_PAN_VOL:
+ LOGMASKED(LOG_CHANNEL_READS, "audio_r: Channel %d: Pan/Vol: %04x (PAN:%02x, VOL:%02x)\n", channel, data,
+ get_pan(channel), get_volume(channel));
+ break;
+
+ case AUDIO_ENVELOPE0:
+ LOGMASKED(LOG_CHANNEL_READS | LOG_ENVELOPES, "audio_r: Channel %d: Envelope0: %04x (RPTPER:%d, TARGET:%02x, SIGN:%d, INC:%02x)\n", channel, data,
+ get_repeat_period_bit(channel), get_envelope_target(channel), get_envelope_sign_bit(channel), get_envelope_inc(channel));
+ break;
+
+ case AUDIO_ENVELOPE_DATA:
+ LOGMASKED(LOG_CHANNEL_READS | LOG_ENVELOPES, "audio_r: Channel %d: Envelope Data: %04x (CNT:%d, EDD:%02x)\n", channel, data,
+ get_envelope_count(channel), get_edd(channel));
+ break;
+
+ case AUDIO_ENVELOPE1:
+ LOGMASKED(LOG_CHANNEL_READS | LOG_ENVELOPES, "audio_r: Channel %d: Envelope1 Data: %04x (RPTCNT:%02x, RPT:%d, LOAD:%02x)\n", channel, data,
+ get_envelope_repeat_count(channel), get_envelope_repeat_bit(channel), get_envelope_load(channel));
+ break;
+
+ case AUDIO_ENVELOPE_ADDR_HIGH:
+ LOGMASKED(LOG_CHANNEL_READS | LOG_ENVELOPES, "audio_r: Channel %d: Envelope Addr (hi): %04x (IRQADDR:%03x, IRQEN:%d, EADDR_HI:%02x)\n", channel, data,
+ get_audio_irq_addr(channel), get_audio_irq_enable_bit(channel), get_envelope_addr_high(channel));
+ break;
+
+ case AUDIO_ENVELOPE_ADDR:
+ LOGMASKED(LOG_CHANNEL_READS | LOG_ENVELOPES, "audio_r: Channel %d: Envelope Addr (lo): %04x \n", channel, data);
+ break;
+
+ case AUDIO_WAVE_DATA_PREV:
+ LOGMASKED(LOG_CHANNEL_READS, "audio_r: Channel %d: Wave Data Prev: %04x \n", channel, data);
+ break;
+
+ case AUDIO_ENVELOPE_LOOP_CTRL:
+ LOGMASKED(LOG_CHANNEL_READS | LOG_ENVELOPES, "audio_r: Channel %d: Envelope Loop Ctrl: %04x (RDOFFS:%02x, EAOFFS:%03x)\n", channel, data,
+ get_rampdown_offset(channel), get_envelope_eaoffset(channel));
+ break;
+
+ case AUDIO_WAVE_DATA:
+ LOGMASKED(LOG_CHANNEL_READS, "audio_r: Channel %d: Wave Data: %04x\n", channel, data);
+ break;
+
+ case AUDIO_ADPCM_SEL:
+ LOGMASKED(LOG_CHANNEL_READS, "audio_r: Channel %d: ADPCM Sel: %04x (ADPCM36:%d, POINTNUM:%02x\n", channel, data,
+ get_adpcm36_bit(channel), get_point_number(channel));
+ break;
+
+ default:
+ LOGMASKED(LOG_UNKNOWN_SPU, "audio_r: Unknown register %04x\n", 0x3000 + offset);
+ break;
+
+ }
+
+ return data;
+}
+
+
+READ16_MEMBER(spg2xx_audio_device::audio_phase_r)
+{
+ const uint16_t channel = (offset & 0x00f0) >> 4;
+ uint16_t data = m_audio_phase_regs[offset];
+
+ switch (offset & AUDIO_CHAN_OFFSET_MASK)
+ {
+ case AUDIO_PHASE_HIGH:
+ LOGMASKED(LOG_CHANNEL_READS, "audio_phase_r: Channel %d: Phase High: %04x\n", channel, data);
+ break;
+
+ case AUDIO_PHASE_ACCUM_HIGH:
+ LOGMASKED(LOG_CHANNEL_READS, "audio_phase_r: Channel %d: Phase Accum High: %04x\n", channel, data);
+ break;
+
+ case AUDIO_TARGET_PHASE_HIGH:
+ LOGMASKED(LOG_CHANNEL_READS, "audio_phase_r: Channel %d: Target Phase High: %04x\n", channel, data);
+ break;
+
+ case AUDIO_RAMP_DOWN_CLOCK:
+ LOGMASKED(LOG_CHANNEL_READS | LOG_RAMPDOWN, "audio_phase_r: Channel %d: Rampdown Clock: %04x\n", channel, data);
+ break;
+
+ case AUDIO_PHASE:
+ LOGMASKED(LOG_CHANNEL_READS, "audio_phase_r: Channel %d: Phase: %04x\n", channel, data);
+ break;
+
+ case AUDIO_PHASE_ACCUM:
+ LOGMASKED(LOG_CHANNEL_READS, "audio_phase_r: Channel %d: Phase Accum: %04x\n", channel, data);
+ break;
+
+ case AUDIO_TARGET_PHASE:
+ LOGMASKED(LOG_CHANNEL_READS, "audio_phase_r: Channel %d: Target Phase: %04x\n", channel, data);
+ break;
+
+ case AUDIO_PHASE_CTRL:
+ LOGMASKED(LOG_CHANNEL_READS, "audio_phase_r: Channel %d: Phase Ctrl: %04x (TIMESTEP:%d, SIGN:%d, OFFSET:%03x\n", channel, data,
+ get_phase_time_step(channel), get_phase_sign_bit(channel), get_phase_offset(channel));
+ break;
+
+ default:
+ LOGMASKED(LOG_UNKNOWN_SPU, "audio_phase_r: Unknown register %04x\n", 0x3000 + offset);
+ break;
+ }
+
+ return data;
+}
+
+WRITE16_MEMBER(spg2xx_audio_device::audio_ctrl_w)
+{
+ switch (offset)
+ {
+ case AUDIO_CHANNEL_ENABLE:
+ {
+ LOGMASKED(LOG_SPU_WRITES, "audio_ctrl_w: Channel Enable: %04x\n", data);
+ const uint16_t changed = m_audio_ctrl_regs[AUDIO_CHANNEL_ENABLE] ^ data;
+ for (uint32_t channel_bit = 0; channel_bit < 16; channel_bit++)
+ {
+ const uint16_t mask = 1 << channel_bit;
+ if (!(changed & mask))
+ continue;
+
+ if (data & mask)
+ {
+ if (!(m_audio_ctrl_regs[AUDIO_CHANNEL_STATUS] & mask))
+ {
+ LOGMASKED(LOG_SPU_WRITES, "Enabling channel %d\n", channel_bit);
+ m_audio_ctrl_regs[offset] |= mask;
+ if (!(m_audio_ctrl_regs[AUDIO_CHANNEL_STOP] & mask))
+ {
+ LOGMASKED(LOG_SPU_WRITES, "Stop not set, starting playback on channel %d, mask %04x\n", channel_bit, mask);
+ m_audio_ctrl_regs[AUDIO_CHANNEL_STATUS] |= mask;
+ m_sample_addr[channel_bit] = get_wave_addr(channel_bit);
+ m_envelope_addr[channel_bit] = get_envelope_addr(channel_bit);
+ set_envelope_count(channel_bit, get_envelope_load(channel_bit));
+ }
+ m_adpcm[channel_bit].reset();
+ m_sample_shift[channel_bit] = 0;
+ m_sample_count[channel_bit] = 0;
+ }
+ }
+ else
+ {
+ stop_channel(channel_bit);
+ //m_audio_ctrl_regs[offset] &= ~mask;
+ //m_audio_ctrl_regs[AUDIO_CHANNEL_STATUS] &= ~mask;
+ //m_audio_ctrl_regs[AUDIO_CHANNEL_STOP] |= mask;
+ //m_audio_ctrl_regs[AUDIO_CHANNEL_TONE_RELEASE] &= ~mask;
+ }
+ }
+ break;
+ }
+
+ case AUDIO_MAIN_VOLUME:
+ LOGMASKED(LOG_SPU_WRITES, "audio_ctrl_w: Main Volume: %04x\n", data);
+ m_audio_ctrl_regs[offset] = data & AUDIO_MAIN_VOLUME_MASK;
+ break;
+
+ case AUDIO_CHANNEL_FIQ_ENABLE:
+ LOGMASKED(LOG_SPU_WRITES, "audio_ctrl_w: Channel FIQ Enable: %04x\n", data);
+ m_audio_ctrl_regs[offset] = data & AUDIO_CHANNEL_FIQ_ENABLE_MASK;
+ break;
+
+ case AUDIO_CHANNEL_FIQ_STATUS:
+ LOGMASKED(LOG_SPU_WRITES, "audio_ctrl_w: Channel FIQ Acknowledge: %04x\n", data);
+ m_audio_ctrl_regs[offset] &= ~(data & AUDIO_CHANNEL_FIQ_STATUS_MASK);
+ break;
+
+ case AUDIO_BEAT_BASE_COUNT:
+ LOGMASKED(LOG_SPU_WRITES | LOG_BEAT, "audio_ctrl_w: Beat Base Count: %04x\n", data);
+ m_audio_ctrl_regs[offset] = data & AUDIO_BEAT_BASE_COUNT_MASK;
+ m_audio_curr_beat_base_count = m_audio_ctrl_regs[offset];
+ break;
+
+ case AUDIO_BEAT_COUNT:
+ {
+ LOGMASKED(LOG_SPU_WRITES | LOG_BEAT, "audio_ctrl_w: Beat Count: %04x\n", data);
+ const uint16_t old = m_audio_ctrl_regs[offset];
+ m_audio_ctrl_regs[offset] &= ~(data & AUDIO_BIS_MASK);
+ m_audio_ctrl_regs[offset] &= AUDIO_BIS_MASK;
+ m_audio_ctrl_regs[offset] |= data & ~AUDIO_BIS_MASK;
+ const uint16_t changed = old ^ m_audio_ctrl_regs[offset];
+ if (changed & (AUDIO_BIS_MASK | AUDIO_BIE_MASK))
+ {
+ LOGMASKED(LOG_BEAT, "BIS mask changed, updating IRQ\n");
+ check_irqs(changed & (AUDIO_BIS_MASK | AUDIO_BIE_MASK));
+ }
+ break;
+ }
+
+ case AUDIO_ENVCLK0:
+ case AUDIO_ENVCLK1:
+ {
+ LOGMASKED(LOG_SPU_WRITES | LOG_ENVELOPES, "audio_ctrl_w: Envelope Interval %d (lo): %04x\n", offset == AUDIO_ENVCLK0 ? 0 : 1, data);
+ const uint16_t old = m_audio_ctrl_regs[offset];
+ m_audio_ctrl_regs[offset] = data;
+ const uint16_t changed = old ^ m_audio_ctrl_regs[offset];
+
+ if (!changed)
+ break;
+
+ const uint8_t channel_offset = offset == AUDIO_ENVCLK0 ? 0 : 8;
+ for (uint8_t channel_bit = 0; channel_bit < 4; channel_bit++)
+ {
+ const uint8_t shift = channel_bit << 2;
+ const uint16_t mask = 0x0f << shift;
+ if (changed & mask)
+ {
+ m_envclk_frame[channel_bit + channel_offset] = get_envclk_frame_count(channel_bit + channel_offset);
+ }
+ }
+ break;
+ }
+
+ case AUDIO_ENVCLK0_HIGH:
+ case AUDIO_ENVCLK1_HIGH:
+ {
+ LOGMASKED(LOG_SPU_WRITES | LOG_ENVELOPES, "audio_ctrl_w: Envelope Interval %d (hi): %04x\n", offset == AUDIO_ENVCLK0_HIGH ? 0 : 1, data);
+ const uint16_t old = m_audio_ctrl_regs[offset];
+ m_audio_ctrl_regs[offset] = data;
+ const uint16_t changed = old ^ m_audio_ctrl_regs[offset];
+ if (!changed)
+ break;
+
+ const uint8_t channel_offset = offset == AUDIO_ENVCLK0_HIGH ? 0 : 8;
+ for (uint8_t channel_bit = 0; channel_bit < 4; channel_bit++)
+ {
+ const uint8_t shift = channel_bit << 2;
+ const uint16_t mask = 0x0f << shift;
+ if (changed & mask)
+ {
+ m_envclk_frame[channel_bit + channel_offset + 4] = get_envclk_frame_count(channel_bit + channel_offset);
+ }
+ }
+ break;
+ }
+
+ case AUDIO_ENV_RAMP_DOWN:
+ {
+ LOGMASKED(LOG_SPU_WRITES | LOG_RAMPDOWN, "audio_ctrl_w: Envelope Fast Ramp Down: %04x\n", data);
+ const uint16_t old = m_audio_ctrl_regs[offset];
+ m_audio_ctrl_regs[offset] = (data & AUDIO_ENV_RAMP_DOWN_MASK) & m_audio_ctrl_regs[AUDIO_CHANNEL_STATUS];
+ const uint16_t changed = old ^ m_audio_ctrl_regs[offset];
+ if (!changed)
+ break;
+
+ for (uint32_t channel_bit = 0; channel_bit < 16; channel_bit++)
+ {
+ const uint16_t mask = 1 << channel_bit;
+ if ((changed & mask) && (data & mask))
+ {
+ m_rampdown_frame[channel_bit] = get_rampdown_frame_count(channel_bit);
+ LOGMASKED(LOG_RAMPDOWN, "Preparing to ramp down channel %d in %d ticks\n", channel_bit, m_rampdown_frame[channel_bit] / 13);
+ }
+ }
+ break;
+ }
+
+ case AUDIO_CHANNEL_STOP:
+ LOGMASKED(LOG_SPU_WRITES, "audio_ctrl_w: Channel Stop Status: %04x\n", data);
+ m_audio_ctrl_regs[offset] &= ~data;
+ break;
+
+ case AUDIO_CHANNEL_ZERO_CROSS:
+ LOGMASKED(LOG_SPU_WRITES, "audio_ctrl_w: Channel Zero-Cross Enable: %04x\n", data);
+ m_audio_ctrl_regs[offset] = data & AUDIO_CHANNEL_ZERO_CROSS_MASK;
+ break;
+
+ case AUDIO_CONTROL:
+ LOGMASKED(LOG_SPU_WRITES, "audio_ctrl_w: Control: %04x (SOFTCH:%d, COMPEN:%d, NOHIGH:%d, NOINT:%d, EQEN:%d, VOLSEL:%d)\n", data
+ , (data & AUDIO_CONTROL_SOFTCH_MASK) ? 1 : 0
+ , (data & AUDIO_CONTROL_COMPEN_MASK) ? 1 : 0
+ , (data & AUDIO_CONTROL_NOHIGH_MASK) ? 1 : 0
+ , (data & AUDIO_CONTROL_NOINT_MASK) ? 1 : 0
+ , (data & AUDIO_CONTROL_EQEN_MASK) ? 1 : 0
+ , (data & AUDIO_CONTROL_VOLSEL_MASK) >> AUDIO_CONTROL_VOLSEL_SHIFT);
+ m_audio_ctrl_regs[offset] = data & AUDIO_CONTROL_MASK;
+ break;
+
+ case AUDIO_COMPRESS_CTRL:
+ LOGMASKED(LOG_SPU_WRITES, "audio_ctrl_w: Compressor Control: %04x\n", data);
+ m_audio_ctrl_regs[offset] = data;
+ break;
+
+ case AUDIO_CHANNEL_STATUS:
+ LOGMASKED(LOG_SPU_WRITES, "audio_ctrl_w: Channel Status (read-only): %04x\n", data);
+ break;
+
+ case AUDIO_WAVE_IN_L:
+ LOGMASKED(LOG_SPU_WRITES, "audio_ctrl_w: Wave In (L) / FIFO Write Data: %04x\n", data);
+ m_audio_ctrl_regs[offset] = data;
+ break;
+
+ case AUDIO_WAVE_IN_R:
+ LOGMASKED(LOG_SPU_WRITES, "audio_ctrl_w: Wave In (R) / Software Channel FIFO IRQ Control: %04x\n", data);
+ m_audio_ctrl_regs[offset] = data;
+ break;
+
+ case AUDIO_WAVE_OUT_L:
+ LOGMASKED(LOG_SPU_WRITES, "audio_ctrl_w: Wave Out (L): %04x\n", data);
+ m_audio_ctrl_regs[offset] = data;
+ break;
+
+ case AUDIO_WAVE_OUT_R:
+ LOGMASKED(LOG_SPU_WRITES, "audio_ctrl_w: Wave Out (R): %04x\n", data);
+ m_audio_ctrl_regs[offset] = data;
+ break;
+
+ case AUDIO_CHANNEL_REPEAT:
+ LOGMASKED(LOG_SPU_WRITES, "audio_ctrl_w: Channel Repeat Enable: %04x\n", data);
+ m_audio_ctrl_regs[offset] = data & AUDIO_CHANNEL_REPEAT_MASK;
+ break;
+
+ case AUDIO_CHANNEL_ENV_MODE:
+ LOGMASKED(LOG_SPU_WRITES | LOG_ENVELOPES, "audio_ctrl_w: Channel Envelope Enable: %04x\n", data);
+ m_audio_ctrl_regs[offset] = data & AUDIO_CHANNEL_ENV_MODE_MASK;
+ break;
+
+ case AUDIO_CHANNEL_TONE_RELEASE:
+ LOGMASKED(LOG_SPU_WRITES, "audio_ctrl_w: Channel Tone Release Enable: %04x\n", data);
+ m_audio_ctrl_regs[offset] = data & AUDIO_CHANNEL_TONE_RELEASE_MASK;
+ break;
+
+ case AUDIO_CHANNEL_ENV_IRQ:
+ LOGMASKED(LOG_SPU_WRITES | LOG_ENVELOPES, "audio_ctrl_w: Channel Envelope IRQ Acknowledge: %04x\n", data);
+ m_audio_ctrl_regs[offset] &= ~data & AUDIO_CHANNEL_ENV_IRQ_MASK;
+ break;
+
+ case AUDIO_CHANNEL_PITCH_BEND:
+ LOGMASKED(LOG_SPU_WRITES, "audio_ctrl_w: Channel Pitch Bend Enable: %04x\n", data);
+ m_audio_ctrl_regs[offset] = data & AUDIO_CHANNEL_PITCH_BEND_MASK;
+ break;
+
+ case AUDIO_SOFT_PHASE:
+ LOGMASKED(LOG_SPU_WRITES, "audio_ctrl_w: Software Channel Phase: %04x\n", data);
+ m_audio_ctrl_regs[offset] = data;
+ break;
+
+ case AUDIO_ATTACK_RELEASE:
+ LOGMASKED(LOG_SPU_WRITES, "audio_ctrl_w: Attack/Release Time Control: %04x\n", data);
+ m_audio_ctrl_regs[offset] = data;
+ break;
+
+ case AUDIO_EQ_CUTOFF10:
+ LOGMASKED(LOG_SPU_WRITES, "audio_ctrl_w: EQ Cutoff Frequency 0/1: %04x\n", data);
+ m_audio_ctrl_regs[offset] = data & AUDIO_EQ_CUTOFF10_MASK;
+ break;
+
+ case AUDIO_EQ_CUTOFF32:
+ LOGMASKED(LOG_SPU_WRITES, "audio_ctrl_w: EQ Cutoff Frequency 2/3: %04x\n", data);
+ m_audio_ctrl_regs[offset] = data & AUDIO_EQ_CUTOFF32_MASK;
+ break;
+
+ case AUDIO_EQ_GAIN10:
+ LOGMASKED(LOG_SPU_WRITES, "audio_ctrl_w: EQ Cutoff Gain 0/1: %04x\n", data);
+ m_audio_ctrl_regs[offset] = data & AUDIO_EQ_GAIN10_MASK;
+ break;
+
+ case AUDIO_EQ_GAIN32:
+ LOGMASKED(LOG_SPU_WRITES, "audio_ctrl_w: EQ Cutoff Gain 2/3: %04x\n", data);
+ m_audio_ctrl_regs[offset] = data & AUDIO_EQ_GAIN32_MASK;
+ break;
+
+ default:
+ m_audio_ctrl_regs[offset] = data;
+ LOGMASKED(LOG_UNKNOWN_SPU, "audio_ctrl_w: Unknown register %04x = %04x\n", 0x3000 + offset, data);
+ break;
+ }
+}
+
+WRITE16_MEMBER(spg2xx_audio_device::audio_phase_w)
+{
+ const uint16_t channel = (offset & 0x00f0) >> 4;
+
+ switch (offset & AUDIO_CHAN_OFFSET_MASK)
+ {
+ case AUDIO_PHASE_HIGH:
+ m_audio_phase_regs[offset] = data & AUDIO_PHASE_HIGH_MASK;
+ m_channel_rate[channel] = ((double)get_phase(channel) * 140625.0 * 2.0) / (double)(1 << 19);
+ m_channel_rate_accum[channel] = 0.0;
+ LOGMASKED(LOG_CHANNEL_WRITES, "audio_phase_w: Channel %d: Phase High: %04x (rate: %f)\n", channel, data, m_channel_rate[channel]);
+ break;
+
+ case AUDIO_PHASE_ACCUM_HIGH:
+ m_audio_phase_regs[offset] = data & AUDIO_PHASE_ACCUM_HIGH_MASK;
+ LOGMASKED(LOG_CHANNEL_WRITES, "audio_phase_w: Channel %d: Phase Accum High: %04x\n", channel, data);
+ break;
+
+ case AUDIO_TARGET_PHASE_HIGH:
+ m_audio_phase_regs[offset] = data & AUDIO_TARGET_PHASE_HIGH_MASK;
+ LOGMASKED(LOG_CHANNEL_WRITES, "audio_phase_w: Channel %d: Target Phase High: %04x\n", channel, data);
+ break;
+
+ case AUDIO_RAMP_DOWN_CLOCK:
+ m_audio_phase_regs[offset] = data & AUDIO_RAMP_DOWN_CLOCK_MASK;
+ LOGMASKED(LOG_CHANNEL_WRITES | LOG_RAMPDOWN, "audio_phase_w: Channel %d: Rampdown Clock: %04x\n", channel, data);
+ break;
+
+ case AUDIO_PHASE:
+ m_audio_phase_regs[offset] = data;
+ m_channel_rate[channel] = ((double)get_phase(channel) * 140625.0 * 2.0) / (double)(1 << 19);
+ m_channel_rate_accum[channel] = 0.0;
+ LOGMASKED(LOG_CHANNEL_WRITES, "audio_phase_w: Channel %d: Phase: %04x (rate: %f)\n", channel, data, m_channel_rate[channel]);
+ break;
+
+ case AUDIO_PHASE_ACCUM:
+ m_audio_phase_regs[offset] = data;
+ LOGMASKED(LOG_CHANNEL_WRITES, "audio_phase_w: Channel %d: Phase Accum: %04x\n", channel, data);
+ break;
+
+ case AUDIO_TARGET_PHASE:
+ m_audio_phase_regs[offset] = data;
+ LOGMASKED(LOG_CHANNEL_WRITES, "audio_phase_w: Channel %d: Target Phase: %04x\n", channel, data);
+ break;
+
+ case AUDIO_PHASE_CTRL:
+ m_audio_phase_regs[offset] = data;
+ LOGMASKED(LOG_CHANNEL_WRITES, "audio_phase_w: Channel %d: Phase Ctrl: %04x (TIMESTEP:%d, SIGN:%d, OFFSET:%03x\n", channel, data,
+ get_phase_time_step(channel), get_phase_sign_bit(channel), get_phase_offset(channel));
+ break;
+
+ default:
+ m_audio_phase_regs[offset] = data;
+ LOGMASKED(LOG_UNKNOWN_SPU, "audio_phase_w: Unknown register %04x = %04x\n", 0x3000 + offset, data);
+ break;
+ }
+}
+
+
+WRITE16_MEMBER(spg2xx_audio_device::audio_w)
+{
+ const uint16_t channel = (offset & 0x00f0) >> 4;
+
+ switch (offset & AUDIO_CHAN_OFFSET_MASK)
+ {
+ case AUDIO_WAVE_ADDR:
+ m_audio_regs[offset] = data;
+ LOGMASKED(LOG_CHANNEL_WRITES, "audio_w: Channel %d: Wave Addr (lo): %04x\n", channel, data);
+ break;
+
+ case AUDIO_MODE:
+ m_audio_regs[offset] = data;
+ LOGMASKED(LOG_CHANNEL_WRITES, "audio_w: Channel %d: Mode: %04x (ADPCM:%d, 16M:%d, TONE:%d, LADDR_HI:%04x, WADDR_HI:%04x)\n", channel, data,
+ get_adpcm_bit(channel), get_16bit_bit(channel), get_tone_mode(channel), get_loop_addr_high(channel), get_wave_addr_high(channel));
+ break;
+
+ case AUDIO_LOOP_ADDR:
+ m_audio_regs[offset] = data;
+ LOGMASKED(LOG_CHANNEL_WRITES, "audio_w: Channel %d: Loop Addr: %04x\n", channel, data);
+ break;
+
+ case AUDIO_PAN_VOL:
+ m_audio_regs[offset] = data & AUDIO_PAN_VOL_MASK;
+ LOGMASKED(LOG_CHANNEL_WRITES, "audio_w: Channel %d: Pan/Vol: %04x (PAN:%02x, VOL:%02x)\n", channel, data,
+ get_pan(channel), get_volume(channel));
+ break;
+
+ case AUDIO_ENVELOPE0:
+ m_audio_regs[offset] = data;
+ LOGMASKED(LOG_CHANNEL_WRITES | LOG_ENVELOPES, "audio_w: Channel %d: Envelope0: %04x (RPTPER:%d, TARGET:%02x, SIGN:%d, INC:%02x)\n", channel, data,
+ get_repeat_period_bit(channel), get_envelope_target(channel), get_envelope_sign_bit(channel), get_envelope_inc(channel));
+ break;
+
+ case AUDIO_ENVELOPE_DATA:
+ m_audio_regs[offset] = data & AUDIO_ENVELOPE_DATA_MASK;
+ LOGMASKED(LOG_CHANNEL_WRITES | LOG_ENVELOPES, "audio_w: Channel %d: Envelope Data: %04x (CNT:%d, EDD:%02x)\n", channel, data,
+ get_envelope_count(channel), get_edd(channel));
+ break;
+
+ case AUDIO_ENVELOPE1:
+ m_audio_regs[offset] = data;
+ LOGMASKED(LOG_CHANNEL_WRITES | LOG_ENVELOPES, "audio_w: Channel %d: Envelope1 Data: %04x (RPTCNT:%02x, RPT:%d, LOAD:%02x)\n", channel, data,
+ get_envelope_repeat_count(channel), get_envelope_repeat_bit(channel), get_envelope_load(channel));
+ break;
+
+ case AUDIO_ENVELOPE_ADDR_HIGH:
+ m_audio_regs[offset] = data;
+ LOGMASKED(LOG_CHANNEL_WRITES | LOG_ENVELOPES, "audio_w: Channel %d: Envelope Addr (hi): %04x (IRQADDR:%03x, IRQEN:%d, EADDR_HI:%02x)\n", channel, data,
+ get_audio_irq_addr(channel), get_audio_irq_enable_bit(channel), get_envelope_addr_high(channel));
+ break;
+
+ case AUDIO_ENVELOPE_ADDR:
+ m_audio_regs[offset] = data;
+ LOGMASKED(LOG_CHANNEL_WRITES | LOG_ENVELOPES, "audio_w: Channel %d: Envelope Addr (lo): %04x\n", channel, data);
+ break;
+
+ case AUDIO_WAVE_DATA_PREV:
+ m_audio_regs[offset] = data;
+ LOGMASKED(LOG_CHANNEL_WRITES, "audio_w: Channel %d: Wave Data Prev: %04x \n", channel, data);
+ break;
+
+ case AUDIO_ENVELOPE_LOOP_CTRL:
+ m_audio_regs[offset] = data;
+ LOGMASKED(LOG_CHANNEL_WRITES | LOG_ENVELOPES, "audio_w: Channel %d: Envelope Loop Ctrl: %04x (RDOFFS:%02x, EAOFFS:%03x)\n", channel, data,
+ get_rampdown_offset(channel), get_envelope_eaoffset(channel));
+ break;
+
+ case AUDIO_WAVE_DATA:
+ m_audio_regs[offset] = data;
+ LOGMASKED(LOG_CHANNEL_WRITES, "audio_w: Channel %d: Wave Data: %04x\n", channel, data);
+ break;
+
+ case AUDIO_ADPCM_SEL:
+ m_audio_regs[offset] = data & AUDIO_ADPCM_SEL_MASK;
+ LOGMASKED(LOG_CHANNEL_WRITES, "audio_w: Channel %d: ADPCM Sel: %04x (ADPCM36:%d, POINTNUM:%02x\n", channel, data,
+ get_adpcm36_bit(channel), get_point_number(channel));
+ break;
+
+ default:
+ m_audio_regs[offset] = data;
+ LOGMASKED(LOG_UNKNOWN_SPU, "audio_w: Unknown register %04x = %04x\n", 0x3000 + offset, data);
+ break;
+
+ }
+}
+
+void spg2xx_audio_device::sound_stream_update(sound_stream &stream, stream_sample_t **inputs, stream_sample_t **outputs, int samples)
+{
+ stream_sample_t *out_l = outputs[0];
+ stream_sample_t *out_r = outputs[1];
+
+ for (int i = 0; i < samples; i++)
+ {
+ int32_t left_total = 0;
+ int32_t right_total = 0;
+
+ for (uint32_t channel = 0; channel < 16; channel++)
+ {
+ if (!get_channel_status(channel))
+ {
+ continue;
+ }
+
+ if (SPG_DEBUG_AUDIO && m_debug_rates)
+ printf("%f:%f ", m_channel_rate[channel], m_channel_rate_accum[channel]);
+ bool playing = advance_channel(channel);
+ if (playing)
+ {
+ int32_t sample = (int16_t)(m_audio_regs[(channel << 4) | AUDIO_WAVE_DATA] ^ 0x8000);
+ if (!(m_audio_ctrl_regs[AUDIO_CONTROL] & AUDIO_CONTROL_NOINT_MASK))
+ {
+ int32_t prev_sample = (int16_t)(m_audio_regs[(channel << 4) | AUDIO_WAVE_DATA_PREV] ^ 0x8000);
+ int16_t lerp_factor = (int16_t)((m_channel_rate_accum[channel] / 70312.5) * 256.0);
+ prev_sample = (prev_sample * (0x100 - lerp_factor)) >> 8;
+ sample = (sample * lerp_factor) >> 8;
+ sample += prev_sample;
+ }
+
+ sample = (sample * (int32_t)get_edd(channel)) >> 7;
+
+ int32_t vol = get_volume(channel);
+ int32_t pan = get_pan(channel);
+
+ int32_t pan_left, pan_right;
+ if (pan < 0x40)
+ {
+ pan_left = 0x7f * vol;
+ pan_right = pan * 2 * vol;
+ }
+ else
+ {
+ pan_left = (0x7f - pan) * 2 * vol;
+ pan_right = 0x7f * vol;
+ }
+
+ left_total += ((int16_t)sample * (int16_t)pan_left) >> 14;
+ right_total += ((int16_t)sample * (int16_t)pan_right) >> 14;
+
+ const uint16_t mask = (1 << channel);
+ if (m_audio_ctrl_regs[AUDIO_ENV_RAMP_DOWN] & mask)
+ {
+ if (m_rampdown_frame[channel] == 0)
+ {
+ LOGMASKED(LOG_RAMPDOWN, "Ticking rampdown for channel %d\n", channel);
+ audio_rampdown_tick(channel);
+ }
+ m_rampdown_frame[channel]--;
+ }
+ else if (!(m_audio_ctrl_regs[AUDIO_CHANNEL_ENV_MODE] & mask))
+ {
+ if (m_envclk_frame[channel] == 0)
+ {
+ LOGMASKED(LOG_ENVELOPES, "Ticking envelope for channel %d\n", channel);
+ audio_envelope_tick(channel);
+ m_envclk_frame[channel] = get_envclk_frame_count(channel);
+ }
+ m_envclk_frame[channel]--;
+ }
+ }
+ }
+
+ switch (get_vol_sel())
+ {
+ case 0: // 1/16
+ left_total >>= 4;
+ right_total >>= 4;
+ break;
+ case 1: // 1/4
+ case 2: // 1
+ case 3: // 2 // Both x1 and x2 clip like mad even with only 6 voices. Hack it for now.
+ left_total >>= 2;
+ right_total >>= 2;
+ break;
+ }
+ *out_l++ = (left_total * (int16_t)m_audio_ctrl_regs[AUDIO_MAIN_VOLUME]) >> 7;
+ *out_r++ = (right_total * (int16_t)m_audio_ctrl_regs[AUDIO_MAIN_VOLUME]) >> 7;
+ }
+}
+
+inline void spg2xx_audio_device::stop_channel(const uint32_t channel)
+{
+ // TODO: IRQs
+ m_audio_ctrl_regs[AUDIO_CHANNEL_ENABLE] &= ~(1 << channel);
+ m_audio_ctrl_regs[AUDIO_CHANNEL_STATUS] &= ~(1 << channel);
+ m_audio_regs[(channel << 4) | AUDIO_MODE] &= ~AUDIO_ADPCM_MASK;
+ m_audio_ctrl_regs[AUDIO_CHANNEL_TONE_RELEASE] &= ~(1 << channel);
+ m_audio_ctrl_regs[AUDIO_ENV_RAMP_DOWN] &= ~(1 << channel);
+}
+
+bool spg2xx_audio_device::advance_channel(const uint32_t channel)
+{
+ m_channel_rate_accum[channel] += m_channel_rate[channel];
+ uint32_t samples_to_advance = 0;
+ while (m_channel_rate_accum[channel] >= 70312.5)
+ {
+ m_channel_rate_accum[channel] -= 70312.5;
+ samples_to_advance++;
+ }
+
+ if (!samples_to_advance)
+ return true;
+
+ bool playing = true;
+
+ for (uint32_t sample = 0; sample < samples_to_advance; sample++)
+ {
+ playing = fetch_sample(channel);
+ if (!playing)
+ break;
+
+ if (get_adpcm_bit(channel))
+ {
+ // ADPCM mode
+ m_sample_shift[channel] += 4;
+ if (m_sample_shift[channel] >= 16)
+ {
+ m_sample_shift[channel] = 0;
+ m_sample_addr[channel]++;
+ }
+ }
+ else if (get_16bit_bit(channel))
+ {
+ // 16-bit mode
+ m_sample_addr[channel]++;
+ }
+ else
+ {
+ // 8-bit mode
+ m_sample_shift[channel] += 8;
+ if (m_sample_shift[channel] >= 16)
+ {
+ m_sample_shift[channel] = 0;
+ m_sample_addr[channel]++;
+ }
+ }
+ }
+
+ return playing;
+}
+
+uint16_t spg2xx_audio_device::read_space(offs_t offset)
+{
+ return m_space_read_cb(offset);
+}
+
+bool spg2xx_audio_device::fetch_sample(const uint32_t channel)
+{
+ const uint32_t channel_mask = channel << 4;
+ m_audio_regs[channel_mask | AUDIO_WAVE_DATA_PREV] = m_audio_regs[channel_mask | AUDIO_WAVE_DATA];
+
+ const uint32_t wave_data_reg = channel_mask | AUDIO_WAVE_DATA;
+ const uint16_t tone_mode = get_tone_mode(channel);
+ uint16_t raw_sample = tone_mode ? read_space(m_sample_addr[channel]) : m_audio_regs[wave_data_reg];
+
+ LOGMASKED(LOG_SAMPLES, "Channel %d: Raw sample %04x\n", channel, raw_sample);
+
+ if (get_adpcm_bit(channel))
+ {
+ // ADPCM mode
+ if (tone_mode != 0 && raw_sample == 0xffff)
+ {
+ if (tone_mode == AUDIO_TONE_MODE_HW_ONESHOT)
+ {
+ LOGMASKED(LOG_SAMPLES, "ADPCM stopped after %d samples\n", m_sample_count[channel]);
+ m_sample_count[channel] = 0;
+ stop_channel(channel);
+ return false;
+ }
+ else
+ {
+ LOGMASKED(LOG_SAMPLES, "ADPCM looping after %d samples\n", m_sample_count[channel]);
+ m_sample_count[channel] = 0;
+ loop_channel(channel);
+ m_audio_regs[(channel << 4) | AUDIO_MODE] &= ~AUDIO_ADPCM_MASK;
+ }
+ }
+ else
+ {
+ m_audio_regs[wave_data_reg] = raw_sample;
+ m_audio_regs[wave_data_reg] >>= m_sample_shift[channel];
+ const uint8_t adpcm_sample = (uint8_t)(m_audio_regs[wave_data_reg] & 0x000f);
+ m_audio_regs[wave_data_reg] = (uint16_t)(m_adpcm[channel].clock(adpcm_sample) << 4) ^ 0x8000;
+ }
+ m_sample_count[channel]++;
+ }
+ else if (get_16bit_bit(channel))
+ {
+ // 16-bit mode
+ if (tone_mode != 0 && raw_sample == 0xffff)
+ {
+ if (tone_mode == AUDIO_TONE_MODE_HW_ONESHOT)
+ {
+ LOGMASKED(LOG_SAMPLES, "16-bit PCM stopped after %d samples\n", m_sample_count[channel]);
+ m_sample_count[channel] = 0;
+ stop_channel(channel);
+ return false;
+ }
+ else
+ {
+ LOGMASKED(LOG_SAMPLES, "16-bit PCM looping after %d samples\n", m_sample_count[channel]);
+ m_sample_count[channel] = 0;
+ loop_channel(channel);
+ }
+ }
+ else
+ {
+ m_audio_regs[wave_data_reg] = raw_sample;
+ }
+ m_sample_count[channel]++;
+ }
+ else
+ {
+ // 8-bit mode
+ LOGMASKED(LOG_SAMPLES, "Channel %d: Processing as 8-bit sample, tone_mode is %d, sample_shift is %d\n", channel, tone_mode, m_sample_shift[channel]);
+ if (tone_mode != 0)
+ {
+ if (m_sample_shift[channel])
+ raw_sample &= 0xff00;
+ else
+ raw_sample <<= 8;
+ raw_sample |= raw_sample >> 8;
+
+ if (raw_sample == 0xffff)
+ {
+ if (tone_mode == AUDIO_TONE_MODE_HW_ONESHOT)
+ {
+ LOGMASKED(LOG_SAMPLES, "Channel %d: 8-bit PCM stopped after %d samples\n", channel, m_sample_count[channel]);
+ m_sample_count[channel] = 0;
+ stop_channel(channel);
+ return false;
+ }
+ else
+ {
+ LOGMASKED(LOG_SAMPLES, "Channel %d: 8-bit PCM looping after %d samples\n", channel, m_sample_count[channel]);
+ m_sample_count[channel] = 0;
+ loop_channel(channel);
+ }
+ }
+ else
+ {
+ m_audio_regs[wave_data_reg] = raw_sample;
+ }
+ }
+ m_sample_count[channel]++;
+ }
+
+ return true;
+}
+
+inline void spg2xx_audio_device::loop_channel(const uint32_t channel)
+{
+ m_sample_addr[channel] = get_loop_addr(channel);
+ m_sample_shift[channel] = 0;
+ LOGMASKED(LOG_SAMPLES, "Channel %d: Looping to address %08x\n", channel, m_sample_addr[channel]);
+}
+
+void spg2xx_audio_device::audio_beat_tick()
+{
+ if (m_audio_curr_beat_base_count == 0)
+ {
+ LOGMASKED(LOG_BEAT, "Beat base count elapsed, reloading with %d\n", m_audio_ctrl_regs[AUDIO_BEAT_BASE_COUNT]);
+ m_audio_curr_beat_base_count = m_audio_ctrl_regs[AUDIO_BEAT_BASE_COUNT];
+
+ uint16_t beat_count = m_audio_ctrl_regs[AUDIO_BEAT_COUNT] & AUDIO_BEAT_COUNT_MASK;
+ if (beat_count == 0)
+ {
+ if (m_audio_ctrl_regs[AUDIO_BEAT_COUNT] & AUDIO_BIE_MASK)
+ {
+ LOGMASKED(LOG_BEAT, "Beat count elapsed, setting Status bit and checking IRQs\n");
+ m_audio_ctrl_regs[AUDIO_BEAT_COUNT] |= AUDIO_BIS_MASK;
+ check_irqs(AUDIO_BIS_MASK);
+ }
+ else
+ {
+ LOGMASKED(LOG_BEAT, "Beat count elapsed but IRQ not enabled\n");
+ }
+ }
+ else
+ {
+ beat_count--;
+ m_audio_ctrl_regs[AUDIO_BEAT_COUNT] = (m_audio_ctrl_regs[AUDIO_BEAT_COUNT] & ~AUDIO_BEAT_COUNT_MASK) | beat_count;
+ }
+ }
+ m_audio_curr_beat_base_count--;
+}
+
+void spg2xx_audio_device::audio_rampdown_tick(const uint32_t channel)
+{
+ const uint8_t old_edd = get_edd(channel);
+ uint8_t new_edd = old_edd - get_rampdown_offset(channel);
+ if (new_edd > old_edd)
+ new_edd = 0;
+
+ if (new_edd)
+ {
+ LOGMASKED(LOG_RAMPDOWN, "Channel %d preparing for next rampdown step (%02x)\n", channel, new_edd);
+ const uint16_t channel_mask = channel << 4;
+ m_audio_regs[channel_mask | AUDIO_ENVELOPE_DATA] &= ~AUDIO_EDD_MASK;
+ m_audio_regs[channel_mask | AUDIO_ENVELOPE_DATA] |= new_edd & AUDIO_EDD_MASK;
+ m_rampdown_frame[channel] = get_rampdown_frame_count(channel);
+ }
+ else
+ {
+ LOGMASKED(LOG_RAMPDOWN, "Stopping channel %d due to rampdown\n", channel);
+ const uint16_t channel_mask = 1 << channel;
+ m_audio_ctrl_regs[AUDIO_CHANNEL_ENABLE] &= ~channel_mask;
+ m_audio_ctrl_regs[AUDIO_CHANNEL_STATUS] &= ~channel_mask;
+ m_audio_ctrl_regs[AUDIO_CHANNEL_STOP] |= channel_mask;
+ m_audio_ctrl_regs[AUDIO_ENV_RAMP_DOWN] &= ~channel_mask;
+ m_audio_ctrl_regs[AUDIO_CHANNEL_TONE_RELEASE] &= ~channel_mask;
+ }
+}
+
+const uint32_t spg2xx_audio_device::s_rampdown_frame_counts[8] =
+{
+ 13*4, 13*16, 13*64, 13*256, 13*1024, 13*4096, 13*8192, 13*8192
+};
+
+uint32_t spg2xx_audio_device::get_rampdown_frame_count(const uint32_t channel)
+{
+ return s_rampdown_frame_counts[get_rampdown_clock(channel)];
+}
+
+const uint32_t spg2xx_audio_device::s_envclk_frame_counts[16] =
+{
+ 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192, 8192, 8192, 8192, 8192
+};
+
+uint32_t spg2xx_audio_device::get_envclk_frame_count(const uint32_t channel)
+{
+ return s_envclk_frame_counts[get_envelope_clock(channel)];
+}
+
+uint32_t spg2xx_audio_device::get_envelope_clock(const offs_t channel) const
+{
+ if (channel < 4)
+ return (m_audio_ctrl_regs[AUDIO_ENVCLK0] >> (channel << 2)) & 0x000f;
+ else if (channel < 8)
+ return (m_audio_ctrl_regs[AUDIO_ENVCLK0_HIGH] >> ((channel - 4) << 2)) & 0x000f;
+ else if (channel < 12)
+ return (m_audio_ctrl_regs[AUDIO_ENVCLK1] >> ((channel - 8) << 2)) & 0x000f;
+ else
+ return (m_audio_ctrl_regs[AUDIO_ENVCLK1_HIGH] >> ((channel - 12) << 2)) & 0x000f;
+}
+
+bool spg2xx_audio_device::audio_envelope_tick(const uint32_t channel)
+{
+ const uint16_t channel_mask = channel << 4;
+ uint16_t new_count = get_envelope_count(channel);
+ const uint16_t curr_edd = get_edd(channel);
+ LOGMASKED(LOG_ENVELOPES, "envelope %d tick, count is %04x, curr edd is %04x\n", channel, new_count, curr_edd);
+ bool edd_changed = false;
+ if (new_count == 0)
+ {
+ const uint16_t target = get_envelope_target(channel);
+ uint16_t new_edd = curr_edd;
+ const uint16_t inc = get_envelope_inc(channel);
+
+ if (new_edd != target)
+ {
+ if (get_envelope_sign_bit(channel))
+ {
+ new_edd -= inc;
+ LOGMASKED(LOG_ENVELOPES, "Envelope %d new EDD-: %04x (%04x), dec %04x\n", channel, new_edd, target, inc);
+ if (new_edd > curr_edd)
+ new_edd = 0;
+ else if (new_edd < target)
+ new_edd = target;
+
+ if (new_edd == 0)
+ {
+ LOGMASKED(LOG_ENVELOPES, "Envelope %d at 0, stopping channel\n", channel);
+ stop_channel(channel);
+ return true;
+ }
+ }
+ else
+ {
+ new_edd += inc;
+ LOGMASKED(LOG_ENVELOPES, "Envelope %d new EDD+: %04x (%04x), inc %04x\n", channel, new_edd, target, inc);
+ if (new_edd >= target)
+ new_edd = target;
+ }
+ }
+
+ if (new_edd == target)
+ {
+ LOGMASKED(LOG_ENVELOPES, "Envelope %d at target %04x\n", channel, target);
+ new_edd = target;
+
+ if (get_envelope_repeat_bit(channel))
+ {
+ const uint16_t repeat_count = get_envelope_repeat_count(channel) - 1;
+ LOGMASKED(LOG_ENVELOPES, "Repeating envelope, new repeat count %d\n", repeat_count);
+ if (repeat_count == 0)
+ {
+ m_audio_regs[channel_mask | AUDIO_ENVELOPE0] = read_space(m_envelope_addr[channel]);
+ m_audio_regs[channel_mask | AUDIO_ENVELOPE1] = read_space(m_envelope_addr[channel] + 1);
+ m_audio_regs[channel_mask | AUDIO_ENVELOPE_LOOP_CTRL] = read_space(m_envelope_addr[channel] + 2);
+ m_envelope_addr[channel] = get_envelope_addr(channel) + get_envelope_eaoffset(channel);
+ LOGMASKED(LOG_ENVELOPES, "Envelope data after repeat: %04x %04x %04x (%08x)\n", m_audio_regs[channel_mask | AUDIO_ENVELOPE0], m_audio_regs[channel_mask | AUDIO_ENVELOPE1], m_audio_regs[channel_mask | AUDIO_ENVELOPE_LOOP_CTRL], m_envelope_addr[channel]);
+ }
+ else
+ {
+ set_envelope_repeat_count(channel, repeat_count);
+ }
+ }
+ else
+ {
+ LOGMASKED(LOG_ENVELOPES, "Fetching envelope for channel %d from %08x\n", channel, m_envelope_addr[channel]);
+ m_audio_regs[channel_mask | AUDIO_ENVELOPE0] = read_space(m_envelope_addr[channel]);
+ m_audio_regs[channel_mask | AUDIO_ENVELOPE1] = read_space(m_envelope_addr[channel] + 1);
+ LOGMASKED(LOG_ENVELOPES, "Fetched envelopes %04x %04x\n", m_audio_regs[channel_mask | AUDIO_ENVELOPE0], m_audio_regs[channel_mask | AUDIO_ENVELOPE1]);
+ m_envelope_addr[channel] += 2;
+ }
+ new_count = get_envelope_load(channel);
+ set_envelope_count(channel, new_count);
+ }
+ else
+ {
+ LOGMASKED(LOG_ENVELOPES, "Envelope %d not yet at target %04x (%04x)\n", channel, target, new_edd);
+ new_count = get_envelope_load(channel);
+ set_envelope_count(channel, new_count);
+ }
+ LOGMASKED(LOG_ENVELOPES, "Envelope %d new count %04x\n", channel, new_count);
+
+ set_edd(channel, new_edd);
+ edd_changed = true;
+ LOGMASKED(LOG_ENVELOPES, "Setting channel %d edd to %04x, register is %04x\n", channel, new_edd, m_audio_regs[(channel << 4) | AUDIO_ENVELOPE_DATA]);
+ }
+ else
+ {
+ new_count--;
+ set_envelope_count(channel, new_count);
+ }
+ LOGMASKED(LOG_ENVELOPES, "envelope %d post-tick, count is now %04x, register is %04x\n", channel, new_count, m_audio_regs[(channel << 4) | AUDIO_ENVELOPE_DATA]);
+ return edd_changed;
+}
diff --git a/src/devices/machine/spg2xx_audio.h b/src/devices/machine/spg2xx_audio.h
new file mode 100644
index 00000000000..22f5108e405
--- /dev/null
+++ b/src/devices/machine/spg2xx_audio.h
@@ -0,0 +1,372 @@
+// license:BSD-3-Clause
+// copyright-holders:Ryan Holtz
+/*****************************************************************************
+
+ SunPlus SPG2xx-series SoC peripheral emulation (Audio)
+
+**********************************************************************/
+
+#ifndef MAME_MACHINE_SPG2XX_AUDIO_H
+#define MAME_MACHINE_SPG2XX_AUDIO_H
+
+#pragma once
+
+#include "sound/okiadpcm.h"
+#include "cpu/unsp/unsp.h"
+
+class spg2xx_audio_device : public device_t, public device_sound_interface
+{
+public:
+ spg2xx_audio_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock);
+ spg2xx_audio_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+
+ auto space_read_callback() { return m_space_read_cb.bind(); }
+ auto write_irq_callback() { return m_irq_cb.bind(); }
+
+ DECLARE_READ16_MEMBER(audio_r);
+ DECLARE_WRITE16_MEMBER(audio_w);
+ DECLARE_READ16_MEMBER(audio_ctrl_r);
+ DECLARE_WRITE16_MEMBER(audio_ctrl_w);
+ DECLARE_READ16_MEMBER(audio_phase_r);
+ DECLARE_WRITE16_MEMBER(audio_phase_w);
+
+protected:
+ // sound stream update overrides
+ virtual void sound_stream_update(sound_stream &stream, stream_sample_t **inputs, stream_sample_t **outputs, int samples) override;
+
+ void audio_beat_tick();
+ void audio_rampdown_tick(const uint32_t channel);
+ bool audio_envelope_tick(const uint32_t channel);
+ inline uint32_t get_rampdown_frame_count(const uint32_t channel);
+ inline uint32_t get_envclk_frame_count(const uint32_t channel);
+
+ // Audio getters
+ bool get_channel_enable(const offs_t channel) const { return m_audio_ctrl_regs[AUDIO_CHANNEL_ENABLE] & (1 << channel); }
+ bool get_channel_status(const offs_t channel) const { return m_audio_ctrl_regs[AUDIO_CHANNEL_STATUS] & (1 << channel); }
+ bool get_manual_envelope_enable(const offs_t channel) const { return m_audio_ctrl_regs[AUDIO_CHANNEL_ENV_MODE] & (1 << channel); }
+ bool get_auto_envelope_enable(const offs_t channel) const { return !get_manual_envelope_enable(channel); }
+ uint32_t get_envelope_clock(const offs_t channel) const;
+ uint16_t get_vol_sel() const { return (m_audio_ctrl_regs[AUDIO_CONTROL] & AUDIO_CONTROL_VOLSEL_MASK) >> AUDIO_CONTROL_VOLSEL_SHIFT; }
+
+ // Audio Mode getters
+ uint16_t get_wave_addr_high(const offs_t channel) const { return m_audio_regs[(channel << 4) | AUDIO_MODE] & AUDIO_WADDR_HIGH_MASK; }
+ uint16_t get_loop_addr_high(const offs_t channel) const { return (m_audio_regs[(channel << 4) | AUDIO_MODE] & AUDIO_LADDR_HIGH_MASK) >> AUDIO_LADDR_HIGH_SHIFT; }
+ uint16_t get_tone_mode(const offs_t channel) const { return (m_audio_regs[(channel << 4) | AUDIO_MODE] & AUDIO_TONE_MODE_MASK) >> AUDIO_TONE_MODE_SHIFT; }
+ uint16_t get_16bit_bit(const offs_t channel) const { return (m_audio_regs[(channel << 4) | AUDIO_MODE] & AUDIO_16M_MASK) ? 1 : 0; }
+ uint16_t get_adpcm_bit(const offs_t channel) const { return (m_audio_regs[(channel << 4) | AUDIO_MODE] & AUDIO_ADPCM_MASK) ? 1 : 0; }
+
+ // Audio Pan getters
+ uint16_t get_volume(const offs_t channel) const { return m_audio_regs[(channel << 4) | AUDIO_PAN_VOL] & AUDIO_VOLUME_MASK; }
+ uint16_t get_pan(const offs_t channel) const { return (m_audio_regs[(channel << 4) | AUDIO_PAN_VOL] & AUDIO_PAN_MASK) >> AUDIO_PAN_SHIFT; }
+
+ // Audio Envelope0 Data getters
+ uint16_t get_envelope_inc(const offs_t channel) const { return m_audio_regs[(channel << 4) | AUDIO_ENVELOPE0] & AUDIO_ENVELOPE_INC_MASK; }
+ uint16_t get_envelope_sign_bit(const offs_t channel) const { return (m_audio_regs[(channel << 4) | AUDIO_ENVELOPE0] & AUDIO_ENVELOPE_SIGN_MASK) ? 1 : 0; }
+ uint16_t get_envelope_target(const offs_t channel) const { return (m_audio_regs[(channel << 4) | AUDIO_ENVELOPE0] & AUDIO_ENVELOPE_TARGET_MASK) >> AUDIO_ENVELOPE_TARGET_SHIFT; }
+ uint16_t get_repeat_period_bit(const offs_t channel) const { return (m_audio_regs[(channel << 4) | AUDIO_ENVELOPE0] & AUDIO_ENVELOPE_REPEAT_PERIOD_MASK) ? 1 : 0; }
+
+ // Audio Envelope Data getters
+ uint16_t get_edd(const offs_t channel) const { return m_audio_regs[(channel << 4) | AUDIO_ENVELOPE_DATA] & AUDIO_EDD_MASK; }
+ uint16_t get_envelope_count(const offs_t channel) const { return (m_audio_regs[(channel << 4) | AUDIO_ENVELOPE_DATA] & AUDIO_ENVELOPE_COUNT_MASK) >> AUDIO_ENVELOPE_COUNT_SHIFT; }
+ void set_edd(const offs_t channel, uint8_t edd) { m_audio_regs[(channel << 4) | AUDIO_ENVELOPE_DATA] = (m_audio_regs[(channel << 4) | AUDIO_ENVELOPE_DATA] & ~AUDIO_EDD_MASK) | edd; }
+ void set_envelope_count(const offs_t channel, uint16_t count) { m_audio_regs[(channel << 4) | AUDIO_ENVELOPE_DATA] = get_edd(channel) | (count << AUDIO_ENVELOPE_COUNT_SHIFT); }
+
+ // Audio Envelope1 Data getters
+ uint16_t get_envelope_load(const offs_t channel) const { return m_audio_regs[(channel << 4) | AUDIO_ENVELOPE1] & AUDIO_ENVELOPE_LOAD_MASK; }
+ uint16_t get_envelope_repeat_bit(const offs_t channel) const { return (m_audio_regs[(channel << 4) | AUDIO_ENVELOPE1] & AUDIO_ENVELOPE_RPT_MASK) ? 1 : 0; }
+ uint16_t get_envelope_repeat_count(const offs_t channel) const { return (m_audio_regs[(channel << 4) | AUDIO_ENVELOPE1] & AUDIO_ENVELOPE_RPCNT_MASK) >> AUDIO_ENVELOPE_RPCNT_SHIFT; }
+ inline void set_envelope_repeat_count(const offs_t channel, const uint16_t count) { m_audio_regs[(channel << 4) | AUDIO_ENVELOPE1] = (m_audio_regs[(channel << 4) | AUDIO_ENVELOPE1] & ~AUDIO_ENVELOPE_RPCNT_MASK) | ((count << AUDIO_ENVELOPE_RPCNT_SHIFT) & AUDIO_ENVELOPE_RPCNT_MASK); }
+
+ // Audio Envelope Address getters
+ uint16_t get_envelope_addr_high(const offs_t channel) const { return m_audio_regs[(channel << 4) | AUDIO_ENVELOPE_ADDR_HIGH] & AUDIO_EADDR_HIGH_MASK; }
+ uint16_t get_audio_irq_enable_bit(const offs_t channel) const { return (m_audio_regs[(channel << 4) | AUDIO_ENVELOPE_ADDR_HIGH] & AUDIO_IRQ_EN_MASK) ? 1 : 0; }
+ uint16_t get_audio_irq_addr(const offs_t channel) const { return (m_audio_regs[(channel << 4) | AUDIO_ENVELOPE_ADDR_HIGH] & AUDIO_IRQ_ADDR_MASK) >> AUDIO_IRQ_ADDR_SHIFT; }
+
+ // Audio Envelope Loop getters
+ uint16_t get_envelope_eaoffset(const offs_t channel) const { return m_audio_regs[(channel << 4) | AUDIO_ENVELOPE_LOOP_CTRL] & AUDIO_EAOFFSET_MASK; }
+ uint16_t get_rampdown_offset(const offs_t channel) const { return (m_audio_regs[(channel << 4) | AUDIO_ENVELOPE_LOOP_CTRL] & AUDIO_RAMPDOWN_OFFSET_MASK) >> AUDIO_RAMPDOWN_OFFSET_SHIFT; }
+ void set_envelope_eaoffset(const offs_t channel, uint16_t eaoffset) { m_audio_regs[(channel << 4) | AUDIO_ENVELOPE_LOOP_CTRL] = (m_audio_regs[(channel << 4) | AUDIO_ENVELOPE_LOOP_CTRL] & ~AUDIO_RAMPDOWN_OFFSET_MASK) | (eaoffset & AUDIO_EAOFFSET_MASK); }
+
+ // Audio ADPCM getters
+ uint16_t get_point_number(const offs_t channel) const { return (m_audio_regs[(channel << 4) | AUDIO_ADPCM_SEL] & AUDIO_POINT_NUMBER_MASK) >> AUDIO_POINT_NUMBER_SHIFT; }
+ uint16_t get_adpcm36_bit(const offs_t channel) const { return (m_audio_regs[(channel << 4) | AUDIO_ADPCM_SEL] & AUDIO_ADPCM36_MASK) ? 1 : 0; }
+
+ // Audio high-word getters
+ uint16_t get_phase_high(const offs_t channel) const { return m_audio_phase_regs[(channel << 4) | AUDIO_PHASE_HIGH] & AUDIO_PHASE_HIGH_MASK; }
+ uint16_t get_phase_accum_high(const offs_t channel) const { return m_audio_phase_regs[(channel << 4) | AUDIO_PHASE_ACCUM_HIGH] & AUDIO_PHASE_ACCUM_HIGH_MASK; }
+ uint16_t get_target_phase_high(const offs_t channel) const { return m_audio_phase_regs[(channel << 4) | AUDIO_TARGET_PHASE_HIGH] & AUDIO_TARGET_PHASE_HIGH_MASK; }
+ uint16_t get_rampdown_clock(const offs_t channel) const { return m_audio_phase_regs[(channel << 4) | AUDIO_RAMP_DOWN_CLOCK] & AUDIO_RAMP_DOWN_CLOCK_MASK; }
+
+ // Audio ADPCM getters
+ uint16_t get_phase_offset(const offs_t channel) const { return m_audio_phase_regs[(channel << 4) | AUDIO_PHASE_CTRL] & AUDIO_PHASE_OFFSET_MASK; }
+ uint16_t get_phase_sign_bit(const offs_t channel) const { return (m_audio_phase_regs[(channel << 4) | AUDIO_PHASE_CTRL] & AUDIO_PHASE_SIGN_MASK) >> AUDIO_PHASE_SIGN_SHIFT; }
+ uint16_t get_phase_time_step(const offs_t channel) const { return (m_audio_phase_regs[(channel << 4) | AUDIO_PHASE_CTRL] & AUDIO_PHASE_TIME_STEP_MASK) >> AUDIO_PHASE_TIME_STEP_SHIFT; }
+
+ // Audio combined getters
+ uint32_t get_phase(const offs_t channel) const { return ((uint32_t)get_phase_high(channel) << 16) | m_audio_phase_regs[(channel << 4) | AUDIO_PHASE]; }
+ uint32_t get_phase_accum(const offs_t channel) const { return ((uint32_t)get_phase_accum_high(channel) << 16) | m_audio_phase_regs[(channel << 4) | AUDIO_PHASE_ACCUM]; }
+ uint32_t get_target_phase(const offs_t channel) const { return ((uint32_t)get_target_phase_high(channel) << 16) | m_audio_phase_regs[(channel << 4) | AUDIO_TARGET_PHASE]; }
+
+ uint32_t get_wave_addr(const offs_t channel) const { return ((uint32_t)get_wave_addr_high(channel) << 16) | m_audio_regs[(channel << 4) | AUDIO_WAVE_ADDR]; }
+ uint32_t get_loop_addr(const offs_t channel) const { return ((uint32_t)get_loop_addr_high(channel) << 16) | m_audio_regs[(channel << 4) | AUDIO_LOOP_ADDR]; }
+ uint32_t get_envelope_addr(const offs_t channel) const { return ((uint32_t)get_envelope_addr_high(channel) << 16) | m_audio_regs[(channel << 4) | AUDIO_ENVELOPE_ADDR]; }
+
+ enum // at audio write offset 0x000 in spg2xx
+ {
+ AUDIO_WAVE_ADDR = 0x000,
+
+ AUDIO_MODE = 0x001,
+ AUDIO_WADDR_HIGH_MASK = 0x003f,
+ AUDIO_LADDR_HIGH_MASK = 0x0fc0,
+ AUDIO_LADDR_HIGH_SHIFT = 6,
+ AUDIO_TONE_MODE_MASK = 0x3000,
+ AUDIO_TONE_MODE_SHIFT = 12,
+ AUDIO_TONE_MODE_SW = 0,
+ AUDIO_TONE_MODE_HW_ONESHOT = 1,
+ AUDIO_TONE_MODE_HW_LOOP = 2,
+ AUDIO_16M_MASK = 0x4000,
+ AUDIO_ADPCM_MASK = 0x8000,
+
+ AUDIO_LOOP_ADDR = 0x002,
+
+ AUDIO_PAN_VOL = 0x003,
+ AUDIO_PAN_VOL_MASK = 0x7f7f,
+ AUDIO_VOLUME_MASK = 0x007f,
+ AUDIO_PAN_MASK = 0x7f00,
+ AUDIO_PAN_SHIFT = 8,
+
+ AUDIO_ENVELOPE0 = 0x004,
+ AUDIO_ENVELOPE_INC_MASK = 0x007f,
+ AUDIO_ENVELOPE_SIGN_MASK = 0x0080,
+ AUDIO_ENVELOPE_TARGET_MASK = 0x7f00,
+ AUDIO_ENVELOPE_TARGET_SHIFT = 8,
+ AUDIO_ENVELOPE_REPEAT_PERIOD_MASK = 0x8000,
+
+ AUDIO_ENVELOPE_DATA = 0x005,
+ AUDIO_ENVELOPE_DATA_MASK = 0xff7f,
+ AUDIO_EDD_MASK = 0x007f,
+ AUDIO_ENVELOPE_COUNT_MASK = 0xff00,
+ AUDIO_ENVELOPE_COUNT_SHIFT = 8,
+
+ AUDIO_ENVELOPE1 = 0x006,
+ AUDIO_ENVELOPE_LOAD_MASK = 0x00ff,
+ AUDIO_ENVELOPE_RPT_MASK = 0x0100,
+ AUDIO_ENVELOPE_RPCNT_MASK = 0xfe00,
+ AUDIO_ENVELOPE_RPCNT_SHIFT = 9,
+
+ AUDIO_ENVELOPE_ADDR_HIGH = 0x007,
+ AUDIO_EADDR_HIGH_MASK = 0x003f,
+ AUDIO_IRQ_EN_MASK = 0x0040,
+ AUDIO_IRQ_ADDR_MASK = 0xff80,
+ AUDIO_IRQ_ADDR_SHIFT = 7,
+
+ AUDIO_ENVELOPE_ADDR = 0x008,
+ AUDIO_WAVE_DATA_PREV = 0x009,
+
+ AUDIO_ENVELOPE_LOOP_CTRL = 0x00a,
+ AUDIO_EAOFFSET_MASK = 0x01ff,
+ AUDIO_RAMPDOWN_OFFSET_MASK = 0xfe00,
+ AUDIO_RAMPDOWN_OFFSET_SHIFT = 9,
+
+ AUDIO_WAVE_DATA = 0x00b,
+
+ AUDIO_ADPCM_SEL = 0x00d,
+ AUDIO_ADPCM_SEL_MASK = 0xfe00,
+ AUDIO_POINT_NUMBER_MASK = 0x7e00,
+ AUDIO_POINT_NUMBER_SHIFT = 9,
+ AUDIO_ADPCM36_MASK = 0x8000,
+ };
+
+ enum // at audio write offset 0x200 in spg2xx
+ {
+ AUDIO_PHASE_HIGH = 0x000,
+ AUDIO_PHASE_HIGH_MASK = 0x0007,
+
+ AUDIO_PHASE_ACCUM_HIGH = 0x001,
+ AUDIO_PHASE_ACCUM_HIGH_MASK = 0x0007,
+
+ AUDIO_TARGET_PHASE_HIGH = 0x002,
+ AUDIO_TARGET_PHASE_HIGH_MASK= 0x0007,
+
+ AUDIO_RAMP_DOWN_CLOCK = 0x003,
+ AUDIO_RAMP_DOWN_CLOCK_MASK = 0x0007,
+
+ AUDIO_PHASE = 0x004,
+ AUDIO_PHASE_ACCUM = 0x005,
+ AUDIO_TARGET_PHASE = 0x006,
+
+ AUDIO_PHASE_CTRL = 0x007,
+ AUDIO_PHASE_OFFSET_MASK = 0x0fff,
+ AUDIO_PHASE_SIGN_MASK = 0x1000,
+ AUDIO_PHASE_SIGN_SHIFT = 12,
+ AUDIO_PHASE_TIME_STEP_MASK = 0xe000,
+ AUDIO_PHASE_TIME_STEP_SHIFT = 13,
+
+ AUDIO_CHAN_OFFSET_MASK = 0xf0f,
+ };
+
+ enum // at audio write offset 0x400 in spg2xx
+ {
+
+ AUDIO_CHANNEL_ENABLE = 0x000,
+ AUDIO_CHANNEL_ENABLE_MASK = 0xffff,
+
+ AUDIO_MAIN_VOLUME = 0x001,
+ AUDIO_MAIN_VOLUME_MASK = 0x007f,
+
+ AUDIO_CHANNEL_FIQ_ENABLE = 0x002,
+ AUDIO_CHANNEL_FIQ_ENABLE_MASK = 0xffff,
+
+ AUDIO_CHANNEL_FIQ_STATUS = 0x003,
+ AUDIO_CHANNEL_FIQ_STATUS_MASK = 0xffff,
+
+ AUDIO_BEAT_BASE_COUNT = 0x004,
+ AUDIO_BEAT_BASE_COUNT_MASK = 0x07ff,
+
+ AUDIO_BEAT_COUNT = 0x005,
+ AUDIO_BEAT_COUNT_MASK = 0x3fff,
+ AUDIO_BIS_MASK = 0x4000,
+ AUDIO_BIE_MASK = 0x8000,
+
+ AUDIO_ENVCLK0 = 0x006,
+
+ AUDIO_ENVCLK0_HIGH = 0x007,
+ AUDIO_ENVCLK0_HIGH_MASK = 0xffff,
+
+ AUDIO_ENVCLK1 = 0x008,
+
+ AUDIO_ENVCLK1_HIGH = 0x009,
+ AUDIO_ENVCLK1_HIGH_MASK = 0xffff,
+
+ AUDIO_ENV_RAMP_DOWN = 0x00a,
+ AUDIO_ENV_RAMP_DOWN_MASK = 0xffff,
+
+ AUDIO_CHANNEL_STOP = 0x00b,
+ AUDIO_CHANNEL_STOP_MASK = 0xffff,
+
+ AUDIO_CHANNEL_ZERO_CROSS = 0x00c,
+ AUDIO_CHANNEL_ZERO_CROSS_MASK = 0xffff,
+
+ AUDIO_CONTROL = 0x00d,
+ AUDIO_CONTROL_MASK = 0x9fe8,
+ AUDIO_CONTROL_SATURATE_MASK = 0x8000,
+ AUDIO_CONTROL_SOFTCH_MASK = 0x1000,
+ AUDIO_CONTROL_COMPEN_MASK = 0x0800,
+ AUDIO_CONTROL_NOHIGH_MASK = 0x0400,
+ AUDIO_CONTROL_NOINT_MASK = 0x0200,
+ AUDIO_CONTROL_EQEN_MASK = 0x0100,
+ AUDIO_CONTROL_VOLSEL_MASK = 0x00c0,
+ AUDIO_CONTROL_VOLSEL_SHIFT = 6,
+ AUDIO_CONTROL_FOF_MASK = 0x0020,
+ AUDIO_CONTROL_INIT_MASK = 0x0008,
+
+ AUDIO_COMPRESS_CTRL = 0x00e,
+ AUDIO_COMPRESS_CTRL_PEAK_MASK = 0x8000,
+ AUDIO_COMPRESS_CTRL_THRESHOLD_MASK = 0x7f00,
+ AUDIO_COMPRESS_CTRL_THRESHOLD_SHIFT = 8,
+ AUDIO_COMPRESS_CTRL_ATTSCALE_MASK = 0x00c0,
+ AUDIO_COMPRESS_CTRL_ATTSCALE_SHIFT = 6,
+ AUDIO_COMPRESS_CTRL_RELSCALE_MASK = 0x0030,
+ AUDIO_COMPRESS_CTRL_RELSCALE_SHIFT = 4,
+ AUDIO_COMPRESS_CTRL_DISZC_MASK = 0x0008,
+ AUDIO_COMPRESS_CTRL_RATIO_MASK = 0x0007,
+
+ AUDIO_CHANNEL_STATUS = 0x00f,
+ AUDIO_CHANNEL_STATUS_MASK = 0xffff,
+
+ AUDIO_WAVE_IN_L = 0x010,
+
+ AUDIO_WAVE_IN_R = 0x011,
+ AUDIO_SOFTIRQ_MASK = 0x8000,
+ AUDIO_SOFTIRQ_EN_MASK = 0x4000,
+ AUDIO_SOFT_PHASE_HIGH_MASK = 0x0070,
+ AUDIO_SOFT_PHASE_HIGH_SHIFT = 4,
+ AUDIO_FIFO_IRQ_THRESHOLD_MASK = 0x000f,
+
+ AUDIO_WAVE_OUT_L = 0x012,
+ AUDIO_WAVE_OUT_R = 0x013,
+
+ AUDIO_CHANNEL_REPEAT = 0x014,
+ AUDIO_CHANNEL_REPEAT_MASK = 0xffff,
+
+ AUDIO_CHANNEL_ENV_MODE = 0x015,
+ AUDIO_CHANNEL_ENV_MODE_MASK = 0xffff,
+
+ AUDIO_CHANNEL_TONE_RELEASE = 0x016,
+ AUDIO_CHANNEL_TONE_RELEASE_MASK = 0xffff,
+
+ AUDIO_CHANNEL_ENV_IRQ = 0x017,
+ AUDIO_CHANNEL_ENV_IRQ_MASK = 0xffff,
+
+ AUDIO_CHANNEL_PITCH_BEND = 0x018,
+ AUDIO_CHANNEL_PITCH_BEND_MASK = 0xffff,
+
+ AUDIO_SOFT_PHASE = 0x019,
+
+ AUDIO_ATTACK_RELEASE = 0x01a,
+ AUDIO_RELEASE_TIME_MASK = 0x00ff,
+ AUDIO_ATTACK_TIME_MASK = 0xff00,
+ AUDIO_ATTACK_TIME_SHIFT = 8,
+
+ AUDIO_EQ_CUTOFF10 = 0x01b,
+ AUDIO_EQ_CUTOFF10_MASK = 0x7f7f,
+
+ AUDIO_EQ_CUTOFF32 = 0x01c,
+ AUDIO_EQ_CUTOFF32_MASK = 0x7f7f,
+
+ AUDIO_EQ_GAIN10 = 0x01d,
+ AUDIO_EQ_GAIN10_MASK = 0x7f7f,
+
+ AUDIO_EQ_GAIN32 = 0x01e,
+ AUDIO_EQ_GAIN32_MASK = 0x7f7f
+ };
+
+ static const device_timer_id TIMER_BEAT = 3;
+ void check_irqs(const uint16_t changed);
+
+ virtual void device_start() override;
+ virtual void device_reset() override;
+ virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override;
+
+ uint16_t read_space(offs_t offset);
+
+ void stop_channel(const uint32_t channel);
+ bool advance_channel(const uint32_t channel);
+ bool fetch_sample(const uint32_t channel);
+ void loop_channel(const uint32_t channel);
+
+
+ bool m_debug_samples;
+ bool m_debug_rates;
+
+ uint16_t m_audio_regs[0x200];
+ uint16_t m_audio_phase_regs[0x200];
+ uint16_t m_audio_ctrl_regs[0x400];
+ uint8_t m_sample_shift[16];
+ uint32_t m_sample_count[16];
+ uint32_t m_sample_addr[16];
+ double m_channel_rate[16];
+ double m_channel_rate_accum[16];
+ uint32_t m_rampdown_frame[16];
+ uint32_t m_envclk_frame[16];
+ uint32_t m_envelope_addr[16];
+ int m_channel_debug;
+ uint16_t m_audio_curr_beat_base_count;
+
+ emu_timer *m_audio_beat;
+
+ sound_stream *m_stream;
+ oki_adpcm_state m_adpcm[16];
+
+ static const uint32_t s_rampdown_frame_counts[8];
+ static const uint32_t s_envclk_frame_counts[16];
+
+private:
+ devcb_read16 m_space_read_cb;
+ devcb_write_line m_irq_cb;
+
+};
+
+DECLARE_DEVICE_TYPE(SPG2XX_AUDIO, spg2xx_audio_device)
+
+#endif // MAME_MACHINE_SPG2XX_AUDIO_H
diff --git a/src/devices/machine/spg2xx_io.cpp b/src/devices/machine/spg2xx_io.cpp
new file mode 100644
index 00000000000..404087f6a7f
--- /dev/null
+++ b/src/devices/machine/spg2xx_io.cpp
@@ -0,0 +1,1313 @@
+// license:BSD-3-Clause
+// copyright-holders:Ryan Holtz
+
+/* this is used by the SPG110, SPG24x and SPG28x
+ basic I/O behavior is definitely the same on the SPG110 but
+ the rest needs verifying */
+
+#include "emu.h"
+#include "spg2xx_io.h"
+
+DEFINE_DEVICE_TYPE(SPG24X_IO, spg24x_io_device, "spg24x_io", "SPG240-series System-on-a-Chip I/O")
+DEFINE_DEVICE_TYPE(SPG28X_IO, spg28x_io_device, "spg28x_io", "SPG280-series System-on-a-Chip I/O")
+
+#define LOG_IO_READS (1U << 1)
+#define LOG_IO_WRITES (1U << 2)
+#define LOG_UNKNOWN_IO (1U << 3)
+#define LOG_IRQS (1U << 4)
+#define LOG_VLINES (1U << 5)
+#define LOG_GPIO (1U << 6)
+#define LOG_UART (1U << 7)
+#define LOG_I2C (1U << 8)
+#define LOG_SEGMENT (1U << 10)
+#define LOG_WATCHDOG (1U << 11)
+#define LOG_TIMERS (1U << 12)
+#define LOG_FIQ (1U << 25)
+#define LOG_SIO (1U << 26)
+#define LOG_EXT_MEM (1U << 27)
+#define LOG_EXTINT (1U << 28)
+#define LOG_IO (LOG_IO_READS | LOG_IO_WRITES | LOG_IRQS | LOG_GPIO | LOG_UART | LOG_I2C | LOG_TIMERS | LOG_EXTINT | LOG_UNKNOWN_IO)
+#define LOG_ALL (LOG_IO | LOG_VLINES | LOG_SEGMENT | LOG_FIQ)
+
+#define VERBOSE (0)
+#include "logmacro.h"
+
+
+#define IO_IRQ_ENABLE m_io_regs[0x21]
+#define IO_IRQ_STATUS m_io_regs[0x22]
+
+spg2xx_io_device::spg2xx_io_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock)
+ : device_t(mconfig, type, tag, owner, clock)
+ , m_porta_out(*this)
+ , m_portb_out(*this)
+ , m_portc_out(*this)
+ , m_porta_in(*this)
+ , m_portb_in(*this)
+ , m_portc_in(*this)
+ , m_adc_in{{*this}, {*this}}
+ , m_eeprom_w(*this)
+ , m_eeprom_r(*this)
+ , m_uart_tx(*this)
+ , m_chip_sel(*this)
+ , m_cpu(*this, finder_base::DUMMY_TAG)
+ , m_screen(*this, finder_base::DUMMY_TAG)
+ , m_pal_read_cb(*this)
+ , m_timer_irq_cb(*this)
+ , m_uart_adc_irq_cb(*this)
+ , m_external_irq_cb(*this)
+ , m_ffreq_tmr1_irq_cb(*this)
+ , m_ffreq_tmr2_irq_cb(*this)
+{
+}
+
+spg24x_io_device::spg24x_io_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+ : spg2xx_io_device(mconfig, SPG24X_IO, tag, owner, clock, 256)
+{
+}
+
+spg28x_io_device::spg28x_io_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+ : spg2xx_io_device(mconfig, SPG28X_IO, tag, owner, clock, 64)
+{
+}
+
+
+void spg2xx_io_device::device_start()
+{
+ m_porta_out.resolve_safe();
+ m_portb_out.resolve_safe();
+ m_portc_out.resolve_safe();
+ m_porta_in.resolve_safe(0);
+ m_portb_in.resolve_safe(0);
+ m_portc_in.resolve_safe(0);
+ m_adc_in[0].resolve_safe(0x0fff);
+ m_adc_in[1].resolve_safe(0x0fff);
+ m_eeprom_w.resolve_safe();
+ m_eeprom_r.resolve_safe(0);
+ m_uart_tx.resolve_safe();
+ m_chip_sel.resolve_safe();
+ m_pal_read_cb.resolve_safe(0);
+
+ m_timer_irq_cb.resolve();
+ m_uart_adc_irq_cb.resolve();
+ m_external_irq_cb.resolve();
+ m_ffreq_tmr1_irq_cb.resolve();
+ m_ffreq_tmr2_irq_cb.resolve();
+
+ m_tmb1 = timer_alloc(TIMER_TMB1);
+ m_tmb2 = timer_alloc(TIMER_TMB2);
+ m_tmb1->adjust(attotime::never);
+ m_tmb2->adjust(attotime::never);
+
+ m_uart_tx_timer = timer_alloc(TIMER_UART_TX);
+ m_uart_tx_timer->adjust(attotime::never);
+
+ m_uart_rx_timer = timer_alloc(TIMER_UART_RX);
+ m_uart_rx_timer->adjust(attotime::never);
+
+ m_4khz_timer = timer_alloc(TIMER_4KHZ);
+ m_4khz_timer->adjust(attotime::never);
+
+ m_timer_src_ab = timer_alloc(TIMER_SRC_AB);
+ m_timer_src_ab->adjust(attotime::never);
+
+ m_timer_src_c = timer_alloc(TIMER_SRC_C);
+ m_timer_src_c->adjust(attotime::never);
+
+ save_item(NAME(m_timer_a_preload));
+ save_item(NAME(m_timer_b_preload));
+ save_item(NAME(m_timer_b_divisor));
+ save_item(NAME(m_timer_b_tick_rate));
+
+ save_item(NAME(m_io_regs));
+
+ save_item(NAME(m_extint));
+
+ save_item(NAME(m_2khz_divider));
+ save_item(NAME(m_1khz_divider));
+ save_item(NAME(m_4hz_divider));
+
+ save_item(NAME(m_uart_baud_rate));
+
+}
+
+void spg2xx_io_device::device_reset()
+{
+ memset(m_io_regs, 0, 0x100 * sizeof(uint16_t));
+
+ m_timer_a_preload = 0;
+ m_timer_b_preload = 0;
+ m_timer_b_divisor = 0;
+ m_timer_b_tick_rate = 0;
+
+ m_io_regs[0x23] = 0x0028;
+ m_io_regs[0x2c] = 0x1418;
+ m_io_regs[0x2d] = 0x1658;
+
+ m_uart_rx_available = false;
+ memset(m_uart_rx_fifo, 0, ARRAY_LENGTH(m_uart_rx_fifo));
+ m_uart_rx_fifo_start = 0;
+ m_uart_rx_fifo_end = 0;
+ m_uart_rx_fifo_count = 0;
+ m_uart_tx_irq = false;
+ m_uart_rx_irq = false;
+
+ memset(m_extint, 0, sizeof(bool) * 2);
+
+ m_4khz_timer->adjust(attotime::from_hz(4096), 0, attotime::from_hz(4096));
+
+ m_2khz_divider = 0;
+ m_1khz_divider = 0;
+ m_4hz_divider = 0;
+}
+
+/*************************
+* Machine Hardware *
+*************************/
+
+void spg2xx_io_device::uart_rx(uint8_t data)
+{
+ LOGMASKED(LOG_UART, "uart_rx: Pulling %02x into receive FIFO\n", data);
+ if (BIT(m_io_regs[0x30], 6))
+ {
+ m_uart_rx_fifo[m_uart_rx_fifo_end] = data;
+ m_uart_rx_fifo_end = (m_uart_rx_fifo_end + 1) % ARRAY_LENGTH(m_uart_rx_fifo);
+ m_uart_rx_fifo_count++;
+ if (m_uart_rx_timer->remaining() == attotime::never)
+ m_uart_rx_timer->adjust(attotime::from_ticks(BIT(m_io_regs[0x30], 5) ? 11 : 10, m_uart_baud_rate));
+ }
+}
+
+READ16_MEMBER(spg2xx_io_device::io_r)
+{
+ static const char *const gpioregs[] = { "GPIO Data Port", "GPIO Buffer Port", "GPIO Direction Port", "GPIO Attribute Port", "GPIO IRQ/Latch Port" };
+ static const char gpioports[] = { 'A', 'B', 'C' };
+
+ uint16_t val = m_io_regs[offset];
+
+ switch (offset)
+ {
+ case 0x01: case 0x06: case 0x0b: // GPIO Data Port A/B/C
+ do_gpio(offset, false);
+ LOGMASKED(LOG_GPIO, "%s: io_r: %s %c = %04x\n", machine().describe_context(), gpioregs[(offset - 1) % 5], gpioports[(offset - 1) / 5], m_io_regs[offset]);
+ val = m_io_regs[offset];
+ break;
+
+ case 0x02: case 0x03: case 0x04: case 0x05:
+ case 0x07: case 0x08: case 0x09: case 0x0a:
+ case 0x0c: case 0x0d: case 0x0e: case 0x0f: // Other GPIO regs
+ LOGMASKED(LOG_GPIO, "%s: io_r: %s %c = %04x\n", machine().describe_context(), gpioregs[(offset - 1) % 5], gpioports[(offset - 1) / 5], m_io_regs[offset]);
+ break;
+
+ case 0x10: // Timebase Control
+ LOGMASKED(LOG_IO_READS, "io_r: Timebase Control = %04x\n", val);
+ break;
+
+ case 0x12: // Timer A Data
+ LOGMASKED(LOG_IO_WRITES, "io_r: Timer A Data = %04x\n", val);
+ break;
+
+ case 0x1c: // Video line counter
+ val = m_screen->vpos();
+ LOGMASKED(LOG_VLINES, "io_r: Video Line = %04x\n", val);
+ break;
+
+ case 0x20: // System Control
+ LOGMASKED(LOG_IO_READS, "io_r: System Control = %04x\n", val);
+ break;
+
+ case 0x21: // IRQ Control
+ LOGMASKED(LOG_IRQS, "%s: io_r: I/O IRQ Control = %04x\n", machine().describe_context(), val);
+ break;
+
+ case 0x22: // IRQ Status
+ LOGMASKED(LOG_IRQS, "%s: io_r: I/O IRQ Status = %04x\n", machine().describe_context(), val);
+ break;
+
+ case 0x23: // External Memory Control
+ LOGMASKED(LOG_IO_READS, "%s: io_r: Ext. Memory Control = %04x\n", machine().describe_context(), val);
+ break;
+
+ case 0x25: // ADC Control
+ LOGMASKED(LOG_IO_READS, "io_r: ADC Control = %04x\n", val);
+ break;
+
+ case 0x27: // ADC Data
+ {
+ m_io_regs[0x27] = 0;
+ const uint16_t old = IO_IRQ_STATUS;
+ IO_IRQ_STATUS &= ~0x2000;
+ const uint16_t changed = (old & IO_IRQ_ENABLE) ^ (IO_IRQ_STATUS & IO_IRQ_ENABLE);
+ if (changed)
+ check_irqs(changed);
+ LOGMASKED(LOG_IO_READS, "%s: io_r: ADC Data = %04x\n", machine().describe_context(), val);
+ break;
+ }
+
+ case 0x29: // Wakeup Source
+ LOGMASKED(LOG_IO_READS, "io_r: Wakeup Source = %04x\n", val);
+ break;
+
+ case 0x2b:
+ {
+ uint16_t pal = m_pal_read_cb();
+ LOGMASKED(LOG_IO_READS, "io_r: NTSC/PAL = %04x\n", pal);
+ return pal;
+ }
+
+ case 0x2c: // PRNG 0
+ {
+ const uint16_t value = m_io_regs[0x2c];
+ m_io_regs[0x2c] = ((value << 1) | (BIT(value, 14) ^ BIT(value, 13))) & 0x7fff;
+ return value;
+ }
+
+ case 0x2d: // PRNG 1
+ {
+ const uint16_t value = m_io_regs[0x2d];
+ m_io_regs[0x2d] = ((value << 1) | (BIT(value, 14) ^ BIT(value, 13))) & 0x7fff;
+ return value;
+ }
+
+ case 0x2e: // FIQ Source Select
+ LOGMASKED(LOG_FIQ, "io_r: FIQ Source Select = %04x\n", val);
+ break;
+
+ case 0x2f: // Data Segment
+ val = m_cpu->get_ds();
+ LOGMASKED(LOG_SEGMENT, "io_r: Data Segment = %04x\n", val);
+ break;
+
+ default:
+ LOGMASKED(LOG_UNKNOWN_IO, "io_r: Unknown register %04x\n", 0x3d00 + offset);
+ break;
+ }
+
+ return val;
+}
+
+READ16_MEMBER(spg2xx_io_device::io_extended_r)
+{
+ // this set of registers might only be on the 24x not the 11x
+
+ offset += 0x30;
+
+ uint16_t val = m_io_regs[offset];
+
+ switch (offset)
+ {
+ case 0x30: // UART Control
+ LOGMASKED(LOG_UART, "%s: io_r: UART Control = %04x\n", machine().describe_context(), val);
+ break;
+
+ case 0x31: // UART Status
+ //LOGMASKED(LOG_UART, "%s: io_r: UART Status = %04x\n", machine().describe_context(), val);
+ break;
+
+ case 0x36: // UART RX Data
+ if (m_uart_rx_available)
+ {
+ m_io_regs[0x31] &= ~0x0081;
+ LOGMASKED(LOG_UART, "UART Rx data is available, clearing bits\n");
+ if (m_uart_rx_fifo_count)
+ {
+ LOGMASKED(LOG_UART, "Remaining count %d, value %02x\n", m_uart_rx_fifo_count, m_uart_rx_fifo[m_uart_rx_fifo_start]);
+ m_io_regs[0x36] = m_uart_rx_fifo[m_uart_rx_fifo_start];
+ val = m_io_regs[0x36];
+ m_uart_rx_fifo_start = (m_uart_rx_fifo_start + 1) % ARRAY_LENGTH(m_uart_rx_fifo);
+ m_uart_rx_fifo_count--;
+
+ if (m_uart_rx_fifo_count == 0)
+ {
+ m_uart_rx_available = false;
+ }
+ else
+ {
+ LOGMASKED(LOG_UART, "Remaining count %d, setting up timer\n", m_uart_rx_fifo_count);
+ //uart_receive_tick();
+ if (m_uart_rx_timer->remaining() == attotime::never)
+ m_uart_rx_timer->adjust(attotime::from_ticks(BIT(m_io_regs[0x30], 5) ? 11 : 10, m_uart_baud_rate));
+ }
+ }
+ else
+ {
+ m_uart_rx_available = false;
+ }
+ }
+ else
+ {
+ m_io_regs[0x37] |= 0x2000;
+ }
+ LOGMASKED(LOG_UART, "%s: io_r: UART Rx Data = %04x\n", machine().describe_context(), val);
+ break;
+
+ case 0x37: // UART Rx FIFO Control
+ val &= ~0x0070;
+ val |= (m_uart_rx_available ? 7 : 0) << 4;
+ LOGMASKED(LOG_UART, "io_r: UART Rx FIFO Control = %04x\n", machine().describe_context(), val);
+ break;
+
+ case 0x51: // unknown, polled by ClickStart cartridges ( clikstrt )
+ return 0x8000;
+
+ case 0x59: // I2C Status
+ LOGMASKED(LOG_I2C, "io_r: I2C Status = %04x\n", val);
+ break;
+
+ case 0x5e: // I2C Data In
+ LOGMASKED(LOG_I2C, "io_r: I2C Data In = %04x\n", val);
+ break;
+
+ default:
+ LOGMASKED(LOG_UNKNOWN_IO, "io_r: Unknown register %04x\n", 0x3d00 + offset);
+ break;
+ }
+
+ return val;
+}
+
+void spg2xx_io_device::update_porta_special_modes()
+{
+ static const char* const s_pa_special[4][16] =
+ {
+ // Input, Special 0
+ // Input, Special 1
+ // Output, Special 0
+ // Output, Special 1
+
+ { "LP", "ExtClk2", "ExtClk1", "-", "SDA", "SlvRDY", "-", "-", "SPICLK", "-", "RxD", "SPISSB", "-", "-", "-", "-" },
+ { "-", "-", "-", "SCK", "-", "SWS", "-", "-", "-", "-", "-", "-", "IRQ2B", "-", "-", "IRQ1B" },
+ { "-", "-", "-", "SCK", "SDA", "SWS", "-", "-", "SPICLK", "TxD", "-", "SPISSB", "TAPWM", "TM1", "TBPWM", "TM2" },
+ { "CSB3", "CSB2", "CSB1", "SCK", "SDA", "VSYNC", "HSYNC", "SYSCLK3", "SPICLK", "TxD", "SWS", "SPISSB", "-", "VSYNC", "HSYNC", "CSYNC" },
+ };
+ for (int bit = 15; bit >= 0; bit--)
+ {
+ if (!BIT(m_io_regs[0x05], bit))
+ continue;
+ uint8_t type = (BIT(m_io_regs[0x03], bit) << 1) | BIT(m_io_regs[0x00], 0);
+ LOGMASKED(LOG_GPIO, " Bit %2d: %s\n", bit, s_pa_special[type][bit]);
+ }
+}
+
+void spg2xx_io_device::update_portb_special_modes()
+{
+ static const char* const s_pb_special[4][8] =
+ {
+ // Input, Special 0
+ // Input, Special 1
+ // Output, Special 0
+ // Output, Special 1
+
+ { "-", "-", "-", "-", "-", "-", "SDA", "SlvRDY" },
+ { "-", "-", "-", "-", "-", "-", "SDA", "SlvRDY" },
+ { "VSYNC", "HSYNC", "CSYNC", "-", "-", "SCK", "SDA", "SWS" },
+ { "CSB3", "CSB2", "CSB1", "TBPWM", "TM2", "-", "-", "SYSCLK2" },
+ };
+ for (int bit = 7; bit >= 0; bit--)
+ {
+ if (!BIT(m_io_regs[0x0a], bit))
+ continue;
+ uint8_t type = (BIT(m_io_regs[0x08], bit) << 1) | BIT(m_io_regs[0x00], 1);
+ LOGMASKED(LOG_GPIO, " Bit %2d: %s\n", bit, s_pb_special[type][bit]);
+ }
+}
+
+void spg2xx_io_device::update_timer_b_rate()
+{
+ switch (m_io_regs[0x17] & 7)
+ {
+ case 0:
+ case 1:
+ case 5:
+ case 6:
+ case 7:
+ m_timer_src_c->adjust(attotime::never);
+ break;
+ case 2:
+ m_timer_src_c->adjust(attotime::from_hz(32768), 0, attotime::from_hz(32768));
+ break;
+ case 3:
+ m_timer_src_c->adjust(attotime::from_hz(8192), 0, attotime::from_hz(8192));
+ break;
+ case 4:
+ m_timer_src_c->adjust(attotime::from_hz(4096), 0, attotime::from_hz(4096));
+ break;
+ }
+}
+
+void spg2xx_io_device::update_timer_ab_src()
+{
+ if (m_timer_b_tick_rate == 0)
+ return;
+
+ m_timer_b_divisor++;
+ if (m_timer_b_divisor >= m_timer_b_tick_rate)
+ {
+ m_timer_b_divisor = 0;
+ increment_timer_a();
+ }
+}
+
+void spg2xx_io_device::increment_timer_a()
+{
+ m_io_regs[0x12]++;
+ if (m_io_regs[0x12] == 0)
+ {
+ m_io_regs[0x12] = m_timer_a_preload;
+ const uint16_t old = IO_IRQ_STATUS;
+ IO_IRQ_STATUS |= 0x0800;
+ const uint16_t changed = (old & IO_IRQ_ENABLE) ^ (IO_IRQ_STATUS & IO_IRQ_ENABLE);
+ if (changed)
+ {
+ //printf("Timer A overflow\n");
+ check_irqs(0x0800);
+ }
+ }
+}
+
+void spg2xx_io_device::update_timer_c_src()
+{
+ m_io_regs[0x16]++;
+ if (m_io_regs[0x16] == 0)
+ {
+ m_io_regs[0x16] = m_timer_b_preload;
+ const uint16_t old = IO_IRQ_STATUS;
+ IO_IRQ_STATUS |= 0x0400;
+ const uint16_t changed = (old & IO_IRQ_ENABLE) ^ (IO_IRQ_STATUS & IO_IRQ_ENABLE);
+ if (changed)
+ {
+ printf("Timer B overflow\n");
+ check_irqs(0x0400);
+ }
+ }
+}
+
+
+WRITE16_MEMBER(spg28x_io_device::io_extended_w)
+{
+ offset += 0x30;
+
+ if (offset == 0x33)
+ {
+ m_io_regs[offset] = data;
+ m_uart_baud_rate = 27000000 / (0x10000 - m_io_regs[0x33]);
+ LOGMASKED(LOG_UART, "%s: io_w: UART Baud Rate scaler = %04x (%d baud)\n", machine().describe_context(), data, m_uart_baud_rate);
+ }
+ else
+ {
+ spg2xx_io_device::io_extended_w(space, offset-0x30, data, mem_mask);
+ }
+}
+
+WRITE16_MEMBER(spg2xx_io_device::io_w)
+{
+ static const char *const gpioregs[] = { "GPIO Data Port", "GPIO Buffer Port", "GPIO Direction Port", "GPIO Attribute Port", "GPIO IRQ/Latch Port" };
+ static const char gpioports[3] = { 'A', 'B', 'C' };
+
+ switch (offset)
+ {
+ case 0x00: // GPIO special function select
+ {
+ LOGMASKED(LOG_GPIO, "%s: io_w: GPIO Configuration = %04x (IOBWake:%d, IOAWake:%d, IOBSpecSel:%d, IOASpecSel:%d)\n", machine().describe_context(), data
+ , BIT(data, 4), BIT(data, 3), BIT(data, 1), BIT(data, 0));
+ const uint16_t old = m_io_regs[offset];
+ m_io_regs[offset] = data;
+ const uint16_t changed = old ^ data;
+ if (BIT(changed, 0))
+ update_porta_special_modes();
+ if (BIT(changed, 1))
+ update_portb_special_modes();
+ break;
+ }
+
+ case 0x01: case 0x06: case 0x0b: // GPIO data, port A/B/C
+ offset++;
+ // Intentional fallthrough - we redirect data register writes to the buffer register.
+
+ case 0x02: case 0x04: // Port A
+ case 0x07: case 0x09: // Port B
+ case 0x0c: case 0x0d: case 0x0e: case 0x0f: // Port C
+ LOGMASKED(LOG_GPIO, "%s: io_w: %s %c = %04x\n", machine().describe_context(), gpioregs[(offset - 1) % 5], gpioports[(offset - 1) / 5], data);
+ m_io_regs[offset] = data;
+ do_gpio(offset, true);
+ break;
+
+ case 0x03: // Port A Direction
+ LOGMASKED(LOG_GPIO, "%s: io_w: GPIO Direction Port A = %04x\n", machine().describe_context(), data);
+ m_io_regs[offset] = data;
+ update_porta_special_modes();
+ do_gpio(offset, true);
+ break;
+
+ case 0x08: // Port B Direction
+ LOGMASKED(LOG_GPIO, "%s: io_w: GPIO Direction Port B = %04x\n", machine().describe_context(), data);
+ m_io_regs[offset] = data;
+ update_portb_special_modes();
+ do_gpio(offset, true);
+ break;
+
+ case 0x05: // Port A Special
+ LOGMASKED(LOG_GPIO, "%s: io_w: Port A Special Function Select: %04x\n", machine().describe_context(), data);
+ m_io_regs[offset] = data;
+ update_porta_special_modes();
+ break;
+
+ case 0x0a: // Port B Special
+ LOGMASKED(LOG_GPIO, "%s: io_w: Port B Special Function Select: %04x\n", machine().describe_context(), data);
+ m_io_regs[offset] = data;
+ update_portb_special_modes();
+ break;
+
+ case 0x10: // Timebase Control
+ {
+ static const char* const s_tmb1_sel[2][4] =
+ {
+ { "8Hz", "16Hz", "32Hz", "64Hz" },
+ { "12kHz", "24kHz", "40kHz", "40kHz" }
+ };
+ static const char* const s_tmb2_sel[2][4] =
+ {
+ { "128Hz", "256Hz", "512Hz", "1024Hz" },
+ { "105kHz", "210kHz", "420kHz", "840kHz" }
+ };
+ static const uint32_t s_tmb1_freq[2][4] =
+ {
+ { 8, 16, 32, 64 },
+ { 12000, 24000, 40000, 40000 }
+ };
+ static const uint32_t s_tmb2_freq[2][4] =
+ {
+ { 128, 256, 512, 1024 },
+ { 105000, 210000, 420000, 840000 }
+ };
+ LOGMASKED(LOG_TIMERS, "io_w: Timebase Control = %04x (Source:%s, TMB2:%s, TMB1:%s)\n", data,
+ BIT(data, 4) ? "27MHz" : "32768Hz", s_tmb2_sel[BIT(data, 4)][(data >> 2) & 3], s_tmb1_sel[BIT(data, 4)][data & 3]);
+ m_io_regs[offset] = data;
+ const uint8_t hifreq = BIT(data, 4);
+ const uint32_t tmb1freq = s_tmb1_freq[hifreq][data & 3];
+ m_tmb1->adjust(attotime::from_hz(tmb1freq), 0, attotime::from_hz(tmb1freq));
+ const uint32_t tmb2freq = s_tmb2_freq[hifreq][(data >> 2) & 3];
+ m_tmb2->adjust(attotime::from_hz(tmb2freq), 0, attotime::from_hz(tmb2freq));
+ break;
+ }
+
+ case 0x11: // Timebase Clear
+ LOGMASKED(LOG_TIMERS, "io_w: Timebase Clear = %04x\n", data);
+ break;
+
+ case 0x12: // Timer A Data
+ LOGMASKED(LOG_TIMERS, "io_w: Timer A Data = %04x\n", data);
+ m_io_regs[offset] = data;
+ m_timer_a_preload = data;
+ break;
+
+ case 0x13: // Timer A Control
+ {
+ static const char* const s_source_a[8] = { "0", "0", "32768Hz", "8192Hz", "4096Hz", "1", "0", "ExtClk1" };
+ static const char* const s_source_b[8] = { "2048Hz", "1024Hz", "256Hz", "TMB1", "4Hz", "2Hz", "1", "ExtClk2" };
+ LOGMASKED(LOG_TIMERS, "io_w: Timer A Control = %04x (Source A:%s, Source B:%s)\n", data,
+ s_source_a[data & 7], s_source_b[(data >> 3) & 7]);
+ m_io_regs[offset] = data;
+ int timer_a_rate = 0;
+ switch (data & 7)
+ {
+ case 0:
+ case 1:
+ case 5:
+ case 6:
+ case 7:
+ m_timer_src_ab->adjust(attotime::never);
+ break;
+ case 2:
+ m_timer_src_ab->adjust(attotime::from_hz(32768), 0, attotime::from_hz(32768));
+ timer_a_rate = 32768;
+ break;
+ case 3:
+ m_timer_src_ab->adjust(attotime::from_hz(8192), 0, attotime::from_hz(8192));
+ timer_a_rate = 8192;
+ break;
+ case 4:
+ m_timer_src_ab->adjust(attotime::from_hz(4096), 0, attotime::from_hz(4096));
+ timer_a_rate = 4096;
+ break;
+ }
+ switch ((data >> 3) & 7)
+ {
+ case 0:
+ m_timer_b_tick_rate = timer_a_rate / 2048;
+ break;
+ case 1:
+ m_timer_b_tick_rate = timer_a_rate / 1024;
+ break;
+ case 2:
+ m_timer_b_tick_rate = timer_a_rate / 256;
+ break;
+ case 3:
+ m_timer_b_tick_rate = 0;
+ break;
+ case 4:
+ m_timer_b_tick_rate = timer_a_rate / 4;
+ break;
+ case 5:
+ m_timer_b_tick_rate = timer_a_rate / 2;
+ break;
+ case 6:
+ m_timer_b_tick_rate = 1;
+ break;
+ case 7:
+ m_timer_b_tick_rate = 0;
+ break;
+ }
+ break;
+ }
+
+ case 0x15: // Timer A IRQ Clear
+ {
+ LOGMASKED(LOG_TIMERS, "io_w: Timer A IRQ Clear\n");
+ const uint16_t old = IO_IRQ_STATUS;
+ IO_IRQ_STATUS &= ~0x0800;
+ const uint16_t changed = (old & IO_IRQ_ENABLE) ^ (IO_IRQ_STATUS & IO_IRQ_ENABLE);
+ if (changed)
+ check_irqs(0x0800);
+ break;
+ }
+
+ case 0x16: // Timer B Data
+ LOGMASKED(LOG_TIMERS, "io_w: Timer B Data = %04x\n", data);
+ m_io_regs[offset] = data;
+ m_timer_b_preload = data;
+ break;
+
+ case 0x17: // Timer B Control
+ {
+ static const char* const s_source_c[8] = { "0", "0", "32768Hz", "8192Hz", "4096Hz", "1", "0", "ExtClk1" };
+ LOGMASKED(LOG_TIMERS, "io_w: Timer B Control = %04x (Source C:%s)\n", data, s_source_c[data & 7]);
+ m_io_regs[offset] = data;
+ if (m_io_regs[0x18] == 1)
+ {
+ update_timer_b_rate();
+ }
+ break;
+ }
+
+ case 0x18: // Timer B Enable
+ {
+ LOGMASKED(LOG_TIMERS, "io_w: Timer B Enable = %04x\n", data);
+ m_io_regs[offset] = data & 1;
+ if (data & 1)
+ {
+ update_timer_b_rate();
+ }
+ else
+ {
+ m_timer_src_c->adjust(attotime::never);
+ }
+ break;
+ }
+
+ case 0x19: // Timer B IRQ Clear
+ {
+ LOGMASKED(LOG_TIMERS, "io_w: Timer B IRQ Clear\n");
+ const uint16_t old = IO_IRQ_STATUS;
+ IO_IRQ_STATUS &= ~0x0400;
+ const uint16_t changed = (old & IO_IRQ_ENABLE) ^ (IO_IRQ_STATUS & IO_IRQ_ENABLE);
+ if (changed)
+ check_irqs(0x0400);
+ break;
+ }
+
+ case 0x20: // System Control
+ {
+ static const char* const s_sysclk[4] = { "13.5MHz", "27MHz", "27MHz NoICE", "54MHz" };
+ static const char* const s_lvd_voltage[4] = { "2.7V", "2.9V", "3.1V", "3.3V" };
+ static const char* const s_weak_strong[2] = { "Weak", "Strong" };
+ LOGMASKED(LOG_IO_WRITES, "io_w: System Control = %04x (Watchdog:%d, Sleep:%d, SysClk:%s, SysClkInv:%d, LVROutEn:%d, LVREn:%d\n"
+ , data, BIT(data, 15), BIT(data, 14), s_sysclk[(data >> 12) & 3], BIT(data, 11), BIT(data, 9), BIT(data, 8));
+ LOGMASKED(LOG_IO_WRITES, " LVDEn:%d, LVDVoltSel:%s, 32kHzDisable:%d, StrWkMode:%s, VDACDisable:%d, ADACDisable:%d, ADACOutDisable:%d)\n"
+ , BIT(data, 7), s_lvd_voltage[(data >> 5) & 3], BIT(data, 4), s_weak_strong[BIT(data, 3)], BIT(data, 2), BIT(data, 1), BIT(data, 0));
+ m_io_regs[offset] = data;
+ break;
+ }
+
+ case 0x21: // IRQ Enable
+ {
+ LOGMASKED(LOG_IRQS, "io_w: IRQ Enable = %04x\n", data);
+ const uint16_t old = IO_IRQ_ENABLE;
+ m_io_regs[offset] = data;
+ const uint16_t changed = (old & IO_IRQ_ENABLE) ^ (IO_IRQ_STATUS & IO_IRQ_ENABLE);
+ if (changed)
+ check_irqs(changed);
+ break;
+ }
+
+ case 0x22: // IRQ Acknowledge
+ {
+ LOGMASKED(LOG_IRQS, "io_w: IRQ Acknowledge = %04x\n", data);
+ const uint16_t old = IO_IRQ_STATUS;
+ IO_IRQ_STATUS &= ~data;
+ const uint16_t changed = (old & IO_IRQ_ENABLE) ^ (IO_IRQ_STATUS & IO_IRQ_ENABLE);
+ if (m_uart_rx_irq || m_uart_tx_irq)
+ {
+ LOGMASKED(LOG_IRQS | LOG_UART, "Re-setting UART IRQ due to still-unacknowledged Rx or Tx.\n");
+ IO_IRQ_STATUS |= 0x0100;
+ }
+ if (changed)
+ check_irqs(changed);
+ break;
+ }
+
+ case 0x23: // External Memory Control
+ {
+ static const char* const s_bus_arb[8] =
+ {
+ "Forbidden", "Forbidden", "Forbidden", "Forbidden", "Forbidden", "1:SPU/2:PPU/3:CPU", "Forbidden", "1:PPU/2:SPU/3:CPU"
+ };
+ static const char* const s_addr_decode[4] =
+ {
+ "ROMCSB: 4000-3fffff, CSB1: ---, CSB2: ---, CSB3: ---",
+ "ROMCSB: 4000-1fffff, CSB1: 200000-3fffff, CSB2: ---, CSB3: ---",
+ "ROMCSB: 4000-0fffff, CSB1: 100000-1fffff, CSB2: 200000-2fffff, CSB3: 300000-3fffff",
+ "ROMCSB: 4000-0fffff, CSB1: 100000-1fffff, CSB2: 200000-2fffff, CSB3: 300000-3fffff"
+ };
+ static const char* const s_ram_decode[16] =
+ {
+ "None", "None", "None", "None", "None", "None", "None", "None",
+ "4KW, 3ff000-3fffff\n",
+ "8KW, 3fe000-3fffff\n",
+ "16KW, 3fc000-3fffff\n",
+ "32KW, 3f8000-3fffff\n",
+ "64KW, 3f0000-3fffff\n",
+ "128KW, 3e0000-3fffff\n",
+ "256KW, 3c0000-3fffff\n",
+ "512KW, 380000-3fffff\n"
+ };
+ LOGMASKED(LOG_EXT_MEM, "io_w: Ext. Memory Control (not yet implemented) = %04x:\n", data);
+ LOGMASKED(LOG_EXT_MEM, " WaitStates:%d, BusArbPrio:%s\n", (data >> 1) & 3, s_bus_arb[(data >> 3) & 7]);
+ LOGMASKED(LOG_EXT_MEM, " ROMAddrDecode:%s\n", s_addr_decode[(data >> 6) & 3]);
+ LOGMASKED(LOG_EXT_MEM, " RAMAddrDecode:%s\n", s_ram_decode[(data >> 8) & 15]);
+ m_chip_sel((data >> 6) & 3);
+ m_io_regs[offset] = data;
+ break;
+ }
+
+ case 0x24: // Watchdog
+ LOGMASKED(LOG_WATCHDOG, "io_w: Watchdog Pet = %04x\n", data);
+ break;
+
+ case 0x25: // ADC Control
+ {
+ LOGMASKED(LOG_IO_WRITES, "%s: io_w: ADC Control = %04x\n", machine().describe_context(), data);
+ m_io_regs[offset] = data & ~0x1000;
+ if (BIT(data, 0))
+ {
+ m_io_regs[0x27] = 0x8000 | (m_adc_in[BIT(data, 5)]() & 0x7fff);
+ m_io_regs[0x25] |= 0x2000;
+ }
+ if (BIT(data, 12) && !BIT(m_io_regs[offset], 1))
+ {
+ const uint16_t old = IO_IRQ_STATUS;
+ IO_IRQ_STATUS |= 0x2000;
+ const uint16_t changed = (old & IO_IRQ_ENABLE) ^ (IO_IRQ_STATUS & IO_IRQ_ENABLE);
+ if (changed)
+ {
+ check_irqs(changed);
+ }
+ }
+ break;
+ }
+
+ case 0x28: // Sleep Mode
+ LOGMASKED(LOG_IO_WRITES, "io_w: Sleep Mode (%s enter value) = %04x\n", data == 0xaa55 ? "valid" : "invalid", data);
+ m_io_regs[offset] = data;
+ break;
+
+ case 0x29: // Wakeup Source
+ {
+ m_io_regs[offset] = data;
+ static const char* const s_sources[8] =
+ {
+ "TMB1", "TMB2", "2Hz", "4Hz", "1024Hz", "2048Hz", "4096Hz", "Key"
+ };
+
+ LOGMASKED(LOG_IO_WRITES, "io_w: Wakeup Source = %04x:\n", data);
+ bool comma = false;
+ char buf[1024];
+ int char_idx = 0;
+ for (int i = 7; i >= 0; i--)
+ {
+ if (BIT(data, i))
+ {
+ char_idx += sprintf(&buf[char_idx], "%s%s", comma ? ", " : "", s_sources[i]);
+ comma = true;
+ }
+ }
+ buf[char_idx] = 0;
+ LOGMASKED(LOG_IO_WRITES, " %s\n", buf);
+ break;
+ }
+
+ case 0x2c: // PRNG 0 seed
+ LOGMASKED(LOG_IO_WRITES, "io_w: PRNG 0 seed = %04x\n", data & 0x7fff);
+ m_io_regs[offset] = data & 0x7fff;
+ break;
+
+ case 0x2d: // PRNG 1 seed
+ LOGMASKED(LOG_IO_WRITES, "io_w: PRNG 1 seed = %04x\n", data & 0x7fff);
+ m_io_regs[offset] = data & 0x7fff;
+ break;
+
+ case 0x2e: // FIQ Source Select
+ {
+ static const char* const s_fiq_select[8] =
+ {
+ "PPU", "SPU Channel", "Timer A", "Timer B", "UART/SPI", "External", "Reserved", "None"
+ };
+ LOGMASKED(LOG_FIQ, "io_w: FIQ Source Select (not yet implemented) = %04x, %s\n", data, s_fiq_select[data & 7]);
+ m_io_regs[offset] = data;
+ break;
+ }
+
+ case 0x2f: // Data Segment
+ m_cpu->set_ds(data & 0x3f);
+ LOGMASKED(LOG_SEGMENT, "io_w: Data Segment = %04x\n", data);
+ break;
+
+ default:
+ LOGMASKED(LOG_UNKNOWN_IO, "io_w: Unknown register %04x = %04x\n", 0x3d00 + offset, data);
+ m_io_regs[offset] = data;
+ break;
+ }
+}
+
+
+
+
+WRITE16_MEMBER(spg2xx_io_device::io_extended_w)
+{
+ // this set of registers might only be on the 24x not the 11x
+
+ offset += 0x30;
+
+ switch (offset)
+ {
+
+ case 0x30: // UART Control
+ {
+ static const char* const s_9th_bit[4] = { "0", "1", "Odd", "Even" };
+ LOGMASKED(LOG_UART, "%s: io_w: UART Control = %04x (TxEn:%d, RxEn:%d, Bits:%d, MultiProc:%d, 9thBit:%s, TxIntEn:%d, RxIntEn:%d\n",
+ machine().describe_context(), data, BIT(data, 7), BIT(data, 6), BIT(data, 5) ? 9 : 8, BIT(data, 4), s_9th_bit[(data >> 2) & 3],
+ BIT(data, 1), BIT(data, 0));
+ const uint16_t changed = m_io_regs[offset] ^ data;
+ m_io_regs[offset] = data;
+ if (!BIT(data, 6))
+ {
+ m_uart_rx_available = false;
+ m_io_regs[0x36] = 0;
+ }
+ if (BIT(changed, 7))
+ {
+ if (BIT(data, 7))
+ {
+ m_io_regs[0x31] |= 0x0002;
+ }
+ else
+ {
+ m_io_regs[0x31] &= ~0x0042;
+ m_uart_tx_timer->adjust(attotime::never);
+ }
+ }
+ break;
+ }
+
+ case 0x31: // UART Status
+ LOGMASKED(LOG_UART, "%s: io_w: UART Status = %04x\n", machine().describe_context(), data);
+ if (BIT(data, 0))
+ {
+ m_io_regs[0x31] &= ~1;
+ m_uart_rx_irq = false;
+ }
+ if (BIT(data, 1))
+ {
+ m_io_regs[0x31] &= ~2;
+ m_uart_tx_irq = false;
+ }
+ if (!m_uart_rx_irq && !m_uart_tx_irq)
+ {
+ const uint16_t old = IO_IRQ_STATUS;
+ IO_IRQ_STATUS &= ~0x0100;
+ const uint16_t changed = (old & IO_IRQ_ENABLE) ^ (IO_IRQ_STATUS & IO_IRQ_ENABLE);
+ if (changed)
+ check_irqs(0x0100);
+ }
+ break;
+
+ case 0x33: // UART Baud Rate (low byte)
+ case 0x34: // UART Baud Rate (high byte)
+ {
+ m_io_regs[offset] = data;
+ const uint32_t divisor = 16 * (0x10000 - ((m_io_regs[0x34] << 8) | m_io_regs[0x33]));
+ LOGMASKED(LOG_UART, "%s: io_w: UART Baud Rate (%s byte): Baud rate = %d\n", offset == 0x33 ? "low" : "high", machine().describe_context(), 27000000 / divisor);
+ m_uart_baud_rate = 27000000 / divisor;
+ break;
+ }
+
+ case 0x35: // UART TX Data
+ LOGMASKED(LOG_UART, "%s: io_w: UART Tx Data = %02x\n", machine().describe_context(), data & 0x00ff);
+ m_io_regs[offset] = data;
+ if (BIT(m_io_regs[0x30], 7))
+ {
+ LOGMASKED(LOG_UART, "io_w: UART Tx: Clearing ready bit, setting busy bit, setting up timer\n");
+ m_uart_tx_timer->adjust(attotime::from_ticks(BIT(m_io_regs[0x30], 5) ? 11 : 10, m_uart_baud_rate));
+ m_io_regs[0x31] &= ~0x0002;
+ m_io_regs[0x31] |= 0x0040;
+ }
+ break;
+
+ case 0x36: // UART RX Data
+ LOGMASKED(LOG_UART, "%s: io_w: UART Rx Data (read-only) = %04x\n", machine().describe_context(), data);
+ break;
+
+ case 0x37: // UART Rx FIFO Control
+ LOGMASKED(LOG_UART, "%s: io_w: UART Rx FIFO Control = %04x (Reset:%d, Overrun:%d, Underrun:%d, Count:%d, Threshold:%d)\n",
+ machine().describe_context(), data, BIT(data, 15), BIT(data, 14), BIT(data, 13), (data >> 4) & 7, data & 7);
+ if (data & 0x8000)
+ {
+ m_uart_rx_available = false;
+ m_io_regs[0x36] = 0;
+ }
+ m_io_regs[offset] &= ~data & 0x6000;
+ m_io_regs[offset] &= ~0x0007;
+ m_io_regs[offset] |= data & 0x0007;
+ break;
+
+ case 0x50: // SIO Setup
+ {
+ static const char* const s_addr_mode[4] = { "16-bit", "None", "8-bit", "24-bit" };
+ static const char* const s_baud_rate[4] = { "/16", "/4", "/8", "/32" };
+ LOGMASKED(LOG_SIO, "io_w: SIO Setup (not implemented) = %04x (DS301Ready:%d, Start:%d, Auto:%d, IRQEn:%d, Width:%d, Related:%d\n", data
+ , BIT(data, 11), BIT(data, 10), BIT(data, 9), BIT(data, 8), BIT(data, 7) ? 16 : 8, BIT(data, 6));
+ LOGMASKED(LOG_SIO, " (Mode:%s, RWProtocol:%d, Rate:sysclk%s, AddrMode:%s)\n"
+ , BIT(data, 5), BIT(data, 4), s_baud_rate[(data >> 2) & 3], s_addr_mode[data & 3]);
+ break;
+ }
+
+ case 0x52: // SIO Start Address (low)
+ LOGMASKED(LOG_SIO, "io_w: SIO Stat Address (low) (not implemented) = %04x\n", data);
+ break;
+
+ case 0x53: // SIO Start Address (hi)
+ LOGMASKED(LOG_SIO, "io_w: SIO Stat Address (hi) (not implemented) = %04x\n", data);
+ break;
+
+ case 0x54: // SIO Data
+ LOGMASKED(LOG_SIO, "io_w: SIO Data (not implemented) = %04x\n", data);
+ break;
+
+ case 0x55: // SIO Automatic Transmit Count
+ LOGMASKED(LOG_SIO, "io_w: SIO Auto Transmit Count (not implemented) = %04x\n", data);
+ break;
+
+ case 0x58: // I2C Command
+ LOGMASKED(LOG_I2C, "io_w: I2C Command = %04x\n", data);
+ m_io_regs[offset] = data;
+ do_i2c();
+ break;
+
+ case 0x59: // I2C Status / Acknowledge
+ LOGMASKED(LOG_I2C, "io_w: I2C Acknowledge = %04x\n", data);
+ m_io_regs[offset] &= ~data;
+ break;
+
+ case 0x5a: // I2C Access Mode
+ LOGMASKED(LOG_I2C, "io_w: I2C Access Mode = %04x\n", data);
+ m_io_regs[offset] = data;
+ break;
+
+ case 0x5b: // I2C Device Address
+ LOGMASKED(LOG_I2C, "io_w: I2C Device Address = %04x\n", data);
+ m_io_regs[offset] = data;
+ break;
+
+ case 0x5c: // I2C Sub-Address
+ LOGMASKED(LOG_I2C, "io_w: I2C Sub-Address = %04x\n", data);
+ m_io_regs[offset] = data;
+ break;
+
+ case 0x5d: // I2C Data Out
+ LOGMASKED(LOG_I2C, "io_w: I2C Data Out = %04x\n", data);
+ m_io_regs[offset] = data;
+ break;
+
+ case 0x5e: // I2C Data In
+ LOGMASKED(LOG_I2C, "io_w: I2C Data In = %04x\n", data);
+ m_io_regs[offset] = data;
+ break;
+
+ case 0x5f: // I2C Controller Mode
+ LOGMASKED(LOG_I2C, "io_w: I2C Controller Mode = %04x\n", data);
+ m_io_regs[offset] = data;
+ break;
+
+ default:
+ LOGMASKED(LOG_UNKNOWN_IO, "io_w: Unknown register %04x = %04x\n", 0x3d00 + offset, data);
+ m_io_regs[offset] = data;
+ break;
+ }
+}
+
+void spg2xx_io_device::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr)
+{
+ switch (id)
+ {
+ case TIMER_TMB1:
+ {
+ LOGMASKED(LOG_TIMERS, "TMB1 elapsed, setting IRQ Status bit 0 (old:%04x, new:%04x, enable:%04x)\n", IO_IRQ_STATUS, IO_IRQ_STATUS | 1, IO_IRQ_ENABLE);
+ const uint16_t old = IO_IRQ_STATUS;
+ IO_IRQ_STATUS |= 1;
+ const uint16_t changed = (old & IO_IRQ_ENABLE) ^ (IO_IRQ_STATUS & IO_IRQ_ENABLE);
+ if (changed)
+ check_irqs(0x0001);
+ break;
+ }
+
+ case TIMER_TMB2:
+ {
+ LOGMASKED(LOG_TIMERS, "TMB2 elapsed, setting IRQ Status bit 1 (old:%04x, new:%04x, enable:%04x)\n", IO_IRQ_STATUS, IO_IRQ_STATUS | 2, IO_IRQ_ENABLE);
+ const uint16_t old = IO_IRQ_STATUS;
+ IO_IRQ_STATUS |= 2;
+ const uint16_t changed = (old & IO_IRQ_ENABLE) ^ (IO_IRQ_STATUS & IO_IRQ_ENABLE);
+ if (changed)
+ check_irqs(0x0002);
+ break;
+ }
+
+ case TIMER_UART_TX:
+ uart_transmit_tick();
+ break;
+
+ case TIMER_UART_RX:
+ uart_receive_tick();
+ break;
+
+ case TIMER_4KHZ:
+ system_timer_tick();
+ break;
+
+ case TIMER_SRC_AB:
+ update_timer_ab_src();
+ break;
+
+ case TIMER_SRC_C:
+ update_timer_c_src();
+ break;
+ }
+}
+
+void spg2xx_io_device::system_timer_tick()
+{
+ const uint16_t old = IO_IRQ_STATUS;
+ uint16_t check_mask = 0x0040;
+ IO_IRQ_STATUS |= 0x0040;
+
+ m_2khz_divider++;
+ if (m_2khz_divider == 2)
+ {
+ m_2khz_divider = 0;
+ IO_IRQ_STATUS |= 0x0020;
+ check_mask |= 0x0020;
+
+ m_1khz_divider++;
+ if (m_1khz_divider == 2)
+ {
+ m_1khz_divider = 0;
+ IO_IRQ_STATUS |= 0x0010;
+ check_mask |= 0x0010;
+
+ m_4hz_divider++;
+ if (m_4hz_divider == 256)
+ {
+ m_4hz_divider = 0;
+ IO_IRQ_STATUS |= 0x0008;
+ check_mask |= 0x0008;
+ }
+ }
+ }
+
+ const uint16_t changed = (old & IO_IRQ_ENABLE) ^ (IO_IRQ_STATUS & IO_IRQ_ENABLE);
+ if (changed)
+ check_irqs(check_mask);
+}
+
+void spg2xx_io_device::uart_transmit_tick()
+{
+ LOGMASKED(LOG_UART, "uart_transmit_tick: Transmitting %02x, setting TxReady, clearing TxBusy\n", (uint8_t)m_io_regs[0x35]);
+ m_uart_tx((uint8_t)m_io_regs[0x35]);
+ m_io_regs[0x31] |= 0x0002;
+ m_io_regs[0x31] &= ~0x0040;
+ if (BIT(m_io_regs[0x30], 1))
+ {
+ const uint16_t old = IO_IRQ_STATUS;
+ IO_IRQ_STATUS |= 0x0100;
+ m_uart_tx_irq = true;
+ LOGMASKED(LOG_UART, "uart_transmit_tick: Setting UART IRQ bit\n");
+ if (IO_IRQ_STATUS != old)
+ {
+ LOGMASKED(LOG_UART, "uart_transmit_tick: Bit newly set, checking IRQs\n");
+ check_irqs(0x0100);
+ }
+ }
+}
+
+void spg2xx_io_device::uart_receive_tick()
+{
+ LOGMASKED(LOG_UART, "uart_receive_tick: Setting RBF and RxRDY\n");
+ m_io_regs[0x31] |= 0x81;
+ m_uart_rx_available = true;
+ if (BIT(m_io_regs[0x30], 0))
+ {
+ LOGMASKED(LOG_UART, "uart_receive_tick: RxIntEn is set, setting rx_irq to true and setting UART IRQ\n");
+ m_uart_rx_irq = true;
+ IO_IRQ_STATUS |= 0x0100;
+ check_irqs(0x0100);
+ }
+}
+
+void spg2xx_io_device::extint_w(int channel, bool state)
+{
+ LOGMASKED(LOG_EXTINT, "Setting extint channel %d to %s\n", channel, state ? "true" : "false");
+ bool old = m_extint[channel];
+ m_extint[channel] = state;
+ if (old != state)
+ {
+ check_extint_irq(channel);
+ }
+}
+
+void spg2xx_io_device::check_extint_irq(int channel)
+{
+ LOGMASKED(LOG_EXTINT, "%sing extint %d interrupt\n", m_extint[channel] ? "rais" : "lower", channel + 1);
+ const uint16_t mask = (channel == 0) ? 0x0200 : 0x1000;
+ const uint16_t old_irq = IO_IRQ_STATUS;
+ if (m_extint[channel])
+ IO_IRQ_STATUS |= mask;
+ else
+ IO_IRQ_STATUS &= ~mask;
+
+ if (old_irq != IO_IRQ_STATUS)
+ {
+ LOGMASKED(LOG_EXTINT, "extint IRQ changed, so checking interrupts\n");
+ check_irqs(mask);
+ }
+}
+
+void spg2xx_io_device::check_irqs(const uint16_t changed)
+{
+ if (changed & 0x0c00) // Timer A, Timer B IRQ
+ {
+ LOGMASKED(LOG_TIMERS, "%ssserting IRQ2 (%04x, %04x)\n", (IO_IRQ_ENABLE & IO_IRQ_STATUS & 0x0c00) ? "A" : "Dea", (IO_IRQ_ENABLE & IO_IRQ_STATUS & 0x0c00), changed);
+ m_timer_irq_cb((IO_IRQ_ENABLE & IO_IRQ_STATUS & 0x0c00) ? ASSERT_LINE : CLEAR_LINE);
+ }
+
+ if (changed & 0x2100) // UART, ADC IRQ
+ {
+ LOGMASKED(LOG_UART, "%ssserting IRQ3 (%04x, %04x)\n", (IO_IRQ_ENABLE & IO_IRQ_STATUS & 0x2100) ? "A" : "Dea", (IO_IRQ_ENABLE & IO_IRQ_STATUS & 0x2100), changed);
+ m_uart_adc_irq_cb((IO_IRQ_ENABLE & IO_IRQ_STATUS & 0x2100) ? ASSERT_LINE : CLEAR_LINE);
+ }
+
+ if (changed & 0x1200) // External IRQ
+ {
+ LOGMASKED(LOG_UART, "%ssserting IRQ5 (%04x, %04x)\n", (IO_IRQ_ENABLE & IO_IRQ_STATUS & 0x1200) ? "A" : "Dea", (IO_IRQ_ENABLE & IO_IRQ_STATUS & 0x1200), changed);
+ m_external_irq_cb((IO_IRQ_ENABLE & IO_IRQ_STATUS & 0x1200) ? ASSERT_LINE : CLEAR_LINE);
+ }
+
+ if (changed & 0x0070) // 1024Hz, 2048Hz, 4096Hz IRQ
+ {
+ LOGMASKED(LOG_TIMERS, "%ssserting IRQ6 (%04x, %04x)\n", (IO_IRQ_ENABLE & IO_IRQ_STATUS & 0x0070) ? "A" : "Dea", (IO_IRQ_ENABLE & IO_IRQ_STATUS & 0x0070), changed); //m_cpu->set_state_unsynced(UNSP_IRQ6_LINE, (IO_IRQ_ENABLE & IO_IRQ_STATUS & 0x0070) ? ASSERT_LINE : CLEAR_LINE);
+ m_ffreq_tmr1_irq_cb((IO_IRQ_ENABLE & IO_IRQ_STATUS & 0x0070) ? ASSERT_LINE : CLEAR_LINE);
+ }
+
+ if (changed & 0x008b) // TMB1, TMB2, 4Hz, key change IRQ
+ {
+ LOGMASKED(LOG_IRQS, "%ssserting IRQ7 (%04x, %04x)\n", (IO_IRQ_ENABLE & IO_IRQ_STATUS & 0x008b) ? "A" : "Dea", (IO_IRQ_ENABLE & IO_IRQ_STATUS & 0x008b), changed);
+ m_ffreq_tmr2_irq_cb((IO_IRQ_ENABLE & IO_IRQ_STATUS & 0x008b) ? ASSERT_LINE : CLEAR_LINE);
+ }
+}
+
+uint16_t spg2xx_io_device::do_special_gpio(uint32_t index, uint16_t mask)
+{
+ uint16_t data = 0;
+ switch (index)
+ {
+ case 0: // Port A
+ if (mask & 0xe000)
+ {
+ const uint8_t csel = m_cpu->get_csb() & 0x0e;
+ data = (csel << 12) & mask;
+ }
+ break;
+ case 1: // Port B
+ // To do
+ break;
+ case 2: // Port C
+ // To do
+ break;
+ default:
+ // Can't happen
+ break;
+ }
+ return data;
+}
+
+void spg2xx_io_device::do_gpio(uint32_t offset, bool write)
+{
+ uint32_t index = (offset - 1) / 5;
+ uint16_t buffer = m_io_regs[5 * index + 2];
+ uint16_t dir = m_io_regs[5 * index + 3];
+ uint16_t attr = m_io_regs[5 * index + 4];
+ uint16_t special = m_io_regs[5 * index + 5];
+
+ uint16_t push = dir;
+ uint16_t pull = ~dir;
+ uint16_t what = (buffer & (push | pull));
+ what ^= (dir & ~attr);
+ what &= ~special;
+
+ switch (index)
+ {
+ case 0:
+ if (write)
+ m_porta_out(0, what, push &~ special);
+ what = (what & ~pull);
+ if (!write)
+ what |= m_porta_in(0, pull &~ special) & pull;
+ break;
+ case 1:
+ if (write)
+ m_portb_out(0, what, push &~ special);
+ what = (what & ~pull);
+ if (!write)
+ what |= m_portb_in(0, pull &~ special) & pull;
+ break;
+ case 2:
+ if (write)
+ m_portc_out(0, what, push &~ special);
+ what = (what & ~pull);
+ if (!write)
+ what |= m_portc_in(0, pull &~ special) & pull;
+ break;
+ }
+
+ what |= do_special_gpio(index, special);
+ m_io_regs[5 * index + 1] = what;
+}
+
+void spg2xx_io_device::do_i2c()
+{
+ const uint16_t addr = ((m_io_regs[0x5b] & 0x06) << 7) | (uint8_t)m_io_regs[0x5c];
+
+ if (m_io_regs[0x58] & 0x40) // Serial EEPROM read
+ m_io_regs[0x5e] = m_eeprom_r(addr);
+ else
+ m_eeprom_w(addr, m_io_regs[0x5d]);
+
+ m_io_regs[0x59] |= 1;
+}
diff --git a/src/devices/machine/spg2xx_io.h b/src/devices/machine/spg2xx_io.h
new file mode 100644
index 00000000000..d829915cbec
--- /dev/null
+++ b/src/devices/machine/spg2xx_io.h
@@ -0,0 +1,183 @@
+// license:BSD-3-Clause
+// copyright-holders:Ryan Holtz
+
+#ifndef MAME_MACHINE_SPG2XX_IO_H
+#define MAME_MACHINE_SPG2XX_IO_H
+
+#pragma once
+
+#include "cpu/unsp/unsp.h"
+#include "screen.h"
+
+class spg2xx_io_device : public device_t
+{
+public:
+ spg2xx_io_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock);
+
+ auto porta_out() { return m_porta_out.bind(); }
+ auto portb_out() { return m_portb_out.bind(); }
+ auto portc_out() { return m_portc_out.bind(); }
+ auto porta_in() { return m_porta_in.bind(); }
+ auto portb_in() { return m_portb_in.bind(); }
+ auto portc_in() { return m_portc_in.bind(); }
+
+ template <size_t Line> auto adc_in() { return m_adc_in[Line].bind(); }
+
+ auto eeprom_w() { return m_eeprom_w.bind(); }
+ auto eeprom_r() { return m_eeprom_r.bind(); }
+
+ auto uart_tx() { return m_uart_tx.bind(); }
+
+ auto chip_select() { return m_chip_sel.bind(); }
+
+ void uart_rx(uint8_t data);
+
+ void extint_w(int channel, bool state);
+
+ DECLARE_READ16_MEMBER(io_r);
+ DECLARE_WRITE16_MEMBER(io_w);
+
+ virtual DECLARE_READ16_MEMBER(io_extended_r);
+ virtual DECLARE_WRITE16_MEMBER(io_extended_w);
+
+
+ auto pal_read_callback() { return m_pal_read_cb.bind(); };
+
+ auto write_timer_irq_callback() { return m_timer_irq_cb.bind(); };
+ auto write_uart_adc_irq_callback() { return m_uart_adc_irq_cb.bind(); };
+ auto write_external_irq_callback() { return m_external_irq_cb.bind(); };
+ auto write_ffrq_tmr1_irq_callback() { return m_ffreq_tmr1_irq_cb.bind(); };
+ auto write_ffrq_tmr2_irq_callback() { return m_ffreq_tmr2_irq_cb.bind(); };
+
+protected:
+ spg2xx_io_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock, const uint32_t sprite_limit)
+ : spg2xx_io_device(mconfig, type, tag, owner, clock)
+ {
+ }
+
+ void check_extint_irq(int channel);
+ void check_irqs(const uint16_t changed);
+
+ static const device_timer_id TIMER_TMB1 = 0;
+ static const device_timer_id TIMER_TMB2 = 1;
+
+ static const device_timer_id TIMER_UART_TX = 4;
+ static const device_timer_id TIMER_UART_RX = 5;
+ static const device_timer_id TIMER_4KHZ = 6;
+ static const device_timer_id TIMER_SRC_AB = 7;
+ static const device_timer_id TIMER_SRC_C = 8;
+
+ virtual void device_start() override;
+ virtual void device_reset() override;
+ virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override;
+
+ void update_porta_special_modes();
+ void update_portb_special_modes();
+ void do_gpio(uint32_t offset, bool write);
+ uint16_t do_special_gpio(uint32_t index, uint16_t mask);
+
+ void update_timer_b_rate();
+ void update_timer_ab_src();
+ void update_timer_c_src();
+ void increment_timer_a();
+
+ void uart_transmit_tick();
+ void uart_receive_tick();
+
+ void system_timer_tick();
+
+ void do_i2c();
+
+ uint16_t m_io_regs[0x100];
+
+ uint8_t m_uart_rx_fifo[8];
+ uint8_t m_uart_rx_fifo_start;
+ uint8_t m_uart_rx_fifo_end;
+ uint8_t m_uart_rx_fifo_count;
+ bool m_uart_rx_available;
+ bool m_uart_rx_irq;
+ bool m_uart_tx_irq;
+
+ bool m_extint[2];
+
+ devcb_write16 m_porta_out;
+ devcb_write16 m_portb_out;
+ devcb_write16 m_portc_out;
+ devcb_read16 m_porta_in;
+ devcb_read16 m_portb_in;
+ devcb_read16 m_portc_in;
+
+ devcb_read16 m_adc_in[2];
+
+ devcb_write8 m_eeprom_w;
+ devcb_read8 m_eeprom_r;
+
+ devcb_write8 m_uart_tx;
+
+ devcb_write8 m_chip_sel;
+
+ uint16_t m_timer_a_preload;
+ uint16_t m_timer_b_preload;
+ uint16_t m_timer_b_divisor;
+ uint16_t m_timer_b_tick_rate;
+
+ emu_timer *m_tmb1;
+ emu_timer *m_tmb2;
+ emu_timer *m_timer_src_ab;
+ emu_timer *m_timer_src_c;
+
+ emu_timer *m_4khz_timer;
+ uint32_t m_2khz_divider;
+ uint32_t m_1khz_divider;
+ uint32_t m_4hz_divider;
+
+ uint32_t m_uart_baud_rate;
+ emu_timer *m_uart_tx_timer;
+ emu_timer *m_uart_rx_timer;
+
+ required_device<unsp_device> m_cpu;
+ required_device<screen_device> m_screen;
+
+ devcb_read16 m_pal_read_cb;
+
+ devcb_write_line m_timer_irq_cb;
+ devcb_write_line m_uart_adc_irq_cb;
+ devcb_write_line m_external_irq_cb;
+ devcb_write_line m_ffreq_tmr1_irq_cb;
+ devcb_write_line m_ffreq_tmr2_irq_cb;
+};
+
+class spg24x_io_device : public spg2xx_io_device
+{
+public:
+ template <typename T, typename U>
+ spg24x_io_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock, T &&cpu_tag, U &&screen_tag)
+ : spg24x_io_device(mconfig, tag, owner, clock)
+ {
+ m_cpu.set_tag(std::forward<T>(cpu_tag));
+ m_screen.set_tag(std::forward<U>(screen_tag));
+ }
+
+ spg24x_io_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+};
+
+class spg28x_io_device : public spg2xx_io_device
+{
+public:
+ template <typename T, typename U>
+ spg28x_io_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock, T &&cpu_tag, U &&screen_tag)
+ : spg28x_io_device(mconfig, tag, owner, clock)
+ {
+ m_cpu.set_tag(std::forward<T>(cpu_tag));
+ m_screen.set_tag(std::forward<U>(screen_tag));
+ }
+
+ spg28x_io_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+
+ virtual DECLARE_WRITE16_MEMBER(io_extended_w) override;
+};
+
+DECLARE_DEVICE_TYPE(SPG24X_IO, spg24x_io_device)
+DECLARE_DEVICE_TYPE(SPG28X_IO, spg28x_io_device)
+
+#endif // MAME_MACHINE_SPG2XX_IO_H
diff --git a/src/devices/machine/strata.cpp b/src/devices/machine/strata.cpp
index 3f32b62739f..df434adbd24 100644
--- a/src/devices/machine/strata.cpp
+++ b/src/devices/machine/strata.cpp
@@ -203,7 +203,7 @@ void strataflash_device::device_start()
/*
read a 8/16-bit word from FEEPROM
*/
-uint16_t strataflash_device::read8_16(address_space& space, offs_t offset, bus_width_t bus_width)
+uint16_t strataflash_device::read8_16(offs_t offset, bus_width_t bus_width)
{
switch (bus_width)
{
@@ -393,7 +393,7 @@ uint16_t strataflash_device::read8_16(address_space& space, offs_t offset, bus_w
/*
write a 8/16-bit word to FEEPROM
*/
-void strataflash_device::write8_16(address_space& space, offs_t offset, uint16_t data, bus_width_t bus_width)
+void strataflash_device::write8_16(offs_t offset, uint16_t data, bus_width_t bus_width)
{
switch (bus_width)
{
@@ -634,31 +634,31 @@ void strataflash_device::write8_16(address_space& space, offs_t offset, uint16_t
/*
read a byte from FEEPROM
*/
-READ8_MEMBER( strataflash_device::read8 )
+uint8_t strataflash_device::read8(offs_t offset)
{
- return read8_16(space, offset, bw_8);
+ return read8_16(offset, bw_8);
}
/*
Write a byte to FEEPROM
*/
-WRITE8_MEMBER( strataflash_device::write8 )
+void strataflash_device::write8(offs_t offset, uint8_t data)
{
- write8_16(space, offset, data, bw_8);
+ write8_16(offset, data, bw_8);
}
/*
read a 16-bit word from FEEPROM
*/
-READ16_MEMBER( strataflash_device::read16 )
+uint16_t strataflash_device::read16(offs_t offset)
{
- return read8_16(space, offset, bw_16);
+ return read8_16(offset, bw_16);
}
/*
Write a byte to FEEPROM
*/
-WRITE16_MEMBER( strataflash_device::write16 )
+void strataflash_device::write16(offs_t offset, uint16_t data)
{
- write8_16(space, offset, data, bw_16);
+ write8_16(offset, data, bw_16);
}
diff --git a/src/devices/machine/strata.h b/src/devices/machine/strata.h
index 26d8675f436..1a3acbbd9dd 100644
--- a/src/devices/machine/strata.h
+++ b/src/devices/machine/strata.h
@@ -12,12 +12,12 @@ public:
strataflash_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
// 8-bit access
- DECLARE_READ8_MEMBER( read8 );
- DECLARE_WRITE8_MEMBER( write8 );
+ uint8_t read8(offs_t offset);
+ void write8(offs_t offset, uint8_t data);
// 16-bit access
- DECLARE_READ16_MEMBER( read16 );
- DECLARE_WRITE16_MEMBER( write16 );
+ uint16_t read16(offs_t offset);
+ void write16(offs_t offset, uint16_t data);
protected:
// device-level overrides
@@ -36,8 +36,8 @@ private:
bw_16
};
- uint16_t read8_16(address_space& space, offs_t offset, bus_width_t bus_width);
- void write8_16(address_space& space, offs_t offset, uint16_t data, bus_width_t bus_width);
+ uint16_t read8_16(offs_t offset, bus_width_t bus_width);
+ void write8_16(offs_t offset, uint16_t data, bus_width_t bus_width);
enum fm_mode_t
{
diff --git a/src/devices/machine/stvcd.cpp b/src/devices/machine/stvcd.cpp
index 09323a7deea..c4b7ada9b9f 100644
--- a/src/devices/machine/stvcd.cpp
+++ b/src/devices/machine/stvcd.cpp
@@ -78,17 +78,17 @@ stvcd_device::stvcd_device(const machine_config &mconfig, const char *tag, devic
{
}
-MACHINE_CONFIG_START(stvcd_device::device_add_mconfig)
- MCFG_CDROM_ADD("cdrom")
- MCFG_CDROM_INTERFACE("sat_cdrom")
+void stvcd_device::device_add_mconfig(machine_config &config)
+{
+ CDROM(config, "cdrom").set_interface("sat_cdrom");
- MCFG_TIMER_DRIVER_ADD("sector_timer", stvcd_device, stv_sector_cb)
- MCFG_TIMER_DRIVER_ADD("sh1_cmd", stvcd_device, stv_sh1_sim)
+ TIMER(config, m_sector_timer).configure_generic(FUNC(stvcd_device::stv_sector_cb));
+ TIMER(config, m_sh1_timer).configure_generic(FUNC(stvcd_device::stv_sh1_sim));
- MCFG_DEVICE_ADD("cdda", CDDA)
- MCFG_MIXER_ROUTE(0, *this, 1.0, 0)
- MCFG_MIXER_ROUTE(1, *this, 1.0, 1)
-MACHINE_CONFIG_END
+ CDDA(config, m_cdda);
+ m_cdda->add_route(0, *this, 1.0, AUTO_ALLOC_INPUT, 0);
+ m_cdda->add_route(1, *this, 1.0, AUTO_ALLOC_INPUT, 1);
+}
void stvcd_device::device_start()
{
diff --git a/src/devices/machine/tc009xlvc.cpp b/src/devices/machine/tc009xlvc.cpp
index 4624e3fc79d..a870dee98a6 100644
--- a/src/devices/machine/tc009xlvc.cpp
+++ b/src/devices/machine/tc009xlvc.cpp
@@ -171,7 +171,7 @@ void tc0091lvc_device::tc0091lvc_map8(address_map &map)
tc0091lvc_device::tc0091lvc_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
: device_t(mconfig, TC0091LVC, tag, owner, clock)
, device_memory_interface(mconfig, *this)
- , m_space_config("tc0091lvc", ENDIANNESS_LITTLE, 8,20, 0, address_map_constructor(), address_map_constructor(FUNC(tc0091lvc_device::tc0091lvc_map8), this))
+ , m_space_config("tc0091lvc", ENDIANNESS_LITTLE, 8,20, 0, address_map_constructor(FUNC(tc0091lvc_device::tc0091lvc_map8), this))
, m_gfxdecode(*this, finder_base::DUMMY_TAG)
{
}
diff --git a/src/devices/machine/terminal.cpp b/src/devices/machine/terminal.cpp
index be9b501c687..c2e5c5be205 100644
--- a/src/devices/machine/terminal.cpp
+++ b/src/devices/machine/terminal.cpp
@@ -326,21 +326,22 @@ void generic_terminal_device::kbd_put(u8 data)
VIDEO HARDWARE
***************************************************************************/
-MACHINE_CONFIG_START(generic_terminal_device::device_add_mconfig)
- MCFG_SCREEN_ADD(TERMINAL_SCREEN_TAG, RASTER)
- MCFG_SCREEN_REFRESH_RATE(50)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */
- MCFG_SCREEN_SIZE(generic_terminal_device::TERMINAL_WIDTH*8, generic_terminal_device::TERMINAL_HEIGHT*10)
- MCFG_SCREEN_VISIBLE_AREA(0, generic_terminal_device::TERMINAL_WIDTH*8-1, 0, generic_terminal_device::TERMINAL_HEIGHT*10-1)
- MCFG_SCREEN_UPDATE_DEVICE(DEVICE_SELF, generic_terminal_device, update)
+void generic_terminal_device::device_add_mconfig(machine_config &config)
+{
+ screen_device &screen(SCREEN(config, TERMINAL_SCREEN_TAG, SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(50);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */
+ screen.set_size(generic_terminal_device::TERMINAL_WIDTH*8, generic_terminal_device::TERMINAL_HEIGHT*10);
+ screen.set_visarea(0, generic_terminal_device::TERMINAL_WIDTH*8-1, 0, generic_terminal_device::TERMINAL_HEIGHT*10-1);
+ screen.set_screen_update(FUNC(generic_terminal_device::update));
generic_keyboard_device &keyboard(GENERIC_KEYBOARD(config, KEYBOARD_TAG, 0));
keyboard.set_keyboard_callback(FUNC(generic_terminal_device::kbd_put));
SPEAKER(config, "bell").front_center();
- MCFG_DEVICE_ADD("beeper", BEEP, 2'000)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "bell", 0.25)
-MACHINE_CONFIG_END
+ BEEP(config, m_beeper, 2'000);
+ m_beeper->add_route(ALL_OUTPUTS, "bell", 0.25);
+}
void generic_terminal_device::device_start()
{
diff --git a/src/devices/machine/terminal.h b/src/devices/machine/terminal.h
index bf2f81c07f7..dab8bd40578 100644
--- a/src/devices/machine/terminal.h
+++ b/src/devices/machine/terminal.h
@@ -36,7 +36,7 @@ public:
}
void set_keyboard_callback(generic_keyboard_device::output_delegate callback) { m_keyboard_cb = callback; }
- DECLARE_WRITE8_MEMBER(write) { term_write(data); }
+ void write(u8 data) { term_write(data); }
void kbd_put(u8 data);
diff --git a/src/devices/machine/ticket.h b/src/devices/machine/ticket.h
index 813e27b95c1..7330ad3cb74 100644
--- a/src/devices/machine/ticket.h
+++ b/src/devices/machine/ticket.h
@@ -21,22 +21,6 @@
DECLARE_DEVICE_TYPE(TICKET_DISPENSER, ticket_dispenser_device)
DECLARE_DEVICE_TYPE(HOPPER, hopper_device)
-
-//**************************************************************************
-// DEVICE CONFIGURATION MACROS
-//**************************************************************************
-
-// add/remove dispensers
-#define MCFG_TICKET_DISPENSER_ADD(_tag, _period_in_msec, _motor_sense, _status_sense) \
- MCFG_DEVICE_ADD(_tag, TICKET_DISPENSER, 0) \
- downcast<ticket_dispenser_device &>(*device).set_period(_period_in_msec); \
- downcast<ticket_dispenser_device &>(*device).set_senses(_motor_sense, _status_sense, false);
-
-#define MCFG_HOPPER_ADD(_tag, _period_in_msec, _motor_sense, _status_sense) \
- MCFG_DEVICE_ADD(_tag, TICKET_DISPENSER, 0) \
- downcast<ticket_dispenser_device &>(*device).set_period(_period_in_msec); \
- downcast<ticket_dispenser_device &>(*device).set_senses(_motor_sense, _status_sense, true);
-
//**************************************************************************
// CONSTANTS
//**************************************************************************
diff --git a/src/devices/machine/timekpr.cpp b/src/devices/machine/timekpr.cpp
index 7dddede2c05..f7cfed5451c 100644
--- a/src/devices/machine/timekpr.cpp
+++ b/src/devices/machine/timekpr.cpp
@@ -37,53 +37,47 @@ DEFINE_DEVICE_TYPE(MK48T12, mk48t12_device, "mk48t12", "MK48T12 Timekeeper")
MACROS
***************************************************************************/
-#define MASK_SECONDS ( 0x7f )
-#define MASK_MINUTES ( 0x7f )
-#define MASK_HOURS ( 0x3f )
-#define MASK_DAY ( 0x07 )
-#define MASK_DATE ( 0x3f )
-#define MASK_MONTH ( 0x1f )
-#define MASK_YEAR ( 0xff )
-#define MASK_CENTURY ( 0xff )
+#define MASK_SECONDS (0x7f)
+#define MASK_MINUTES (0x7f)
+#define MASK_HOURS (0x3f)
+#define MASK_DAY (0x07)
+#define MASK_DATE (0x3f)
+#define MASK_MONTH (0x1f)
+#define MASK_YEAR (0xff)
+#define MASK_CENTURY (0xff)
-#define CONTROL_W ( 0x80 )
-#define CONTROL_R ( 0x40 )
-#define CONTROL_S ( 0x20 ) /* not emulated */
-#define CONTROL_CALIBRATION ( 0x1f ) /* not emulated */
+#define CONTROL_W (0x80)
+#define CONTROL_R (0x40)
+#define CONTROL_S (0x20) /* not emulated */
+#define CONTROL_CALIBRATION (0x1f) /* not emulated */
-#define SECONDS_ST ( 0x80 )
+#define SECONDS_ST (0x80)
-#define DAY_FT ( 0x40 ) /* M48T37 - not emulated */
-#define DAY_CEB ( 0x20 ) /* M48T35/M48T58 */
-#define DAY_CB ( 0x10 ) /* M48T35/M48T58 */
+#define DAY_FT (0x40) /* M48T37 - not emulated */
+#define DAY_CEB (0x20) /* M48T35/M48T58 */
+#define DAY_CB (0x10) /* M48T35/M48T58 */
-#define DATE_BLE ( 0x80 ) /* M48T58: not emulated */
-#define DATE_BL ( 0x40 ) /* M48T58: not emulated */
+#define DATE_BLE (0x80) /* M48T58: not emulated */
+#define DATE_BL (0x40) /* M48T58: not emulated */
-#define FLAGS_BL ( 0x10 ) /* MK48T08/M48T37: not emulated */
-#define FLAGS_AF ( 0x40 ) /* M48T37: not emulated */
-#define FLAGS_WDF ( 0x80 ) /* M48T37 */
+#define FLAGS_BL (0x10) /* MK48T08/M48T37: not emulated */
+#define FLAGS_AF (0x40) /* M48T37: not emulated */
+#define FLAGS_WDF (0x80) /* M48T37 */
/***************************************************************************
INLINE FUNCTIONS
***************************************************************************/
-static void counter_to_ram( uint8_t *data, int offset, int counter )
+inline void counter_to_ram(u8 *data, s32 offset, u8 counter)
{
- if( offset >= 0 )
- {
- data[ offset ] = counter;
- }
+ if (offset >= 0)
+ data[offset] = counter;
}
-static int counter_from_ram( uint8_t *data, int offset )
+inline int counter_from_ram(u8 const *data, s32 offset, u8 unmap = 0)
{
- if( offset >= 0 )
- {
- return data[ offset ];
- }
- return 0;
+ return (offset >= 0) ? data[offset] : unmap;
}
//**************************************************************************
@@ -94,7 +88,7 @@ static int counter_from_ram( uint8_t *data, int offset )
// timekeeper_device_config - constructor
//-------------------------------------------------
-timekeeper_device::timekeeper_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock, int size)
+timekeeper_device::timekeeper_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock, u32 size)
: device_t(mconfig, type, tag, owner, clock)
, device_nvram_interface(mconfig, *this)
, m_reset_cb(*this)
@@ -104,7 +98,7 @@ timekeeper_device::timekeeper_device(const machine_config &mconfig, device_type
{
}
-m48t02_device::m48t02_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+m48t02_device::m48t02_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
: timekeeper_device(mconfig, M48T02, tag, owner, clock, 0x800)
{
m_offset_watchdog = -1;
@@ -120,7 +114,7 @@ m48t02_device::m48t02_device(const machine_config &mconfig, const char *tag, dev
m_offset_flags = -1;
}
-m48t35_device::m48t35_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+m48t35_device::m48t35_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
: timekeeper_device(mconfig, M48T35, tag, owner, clock, 0x8000)
{
m_offset_watchdog = -1;
@@ -136,7 +130,7 @@ m48t35_device::m48t35_device(const machine_config &mconfig, const char *tag, dev
m_offset_flags = -1;
}
-m48t37_device::m48t37_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+m48t37_device::m48t37_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
: timekeeper_device(mconfig, M48T37, tag, owner, clock, 0x8000)
{
m_offset_watchdog = 0x7ff7;
@@ -152,7 +146,7 @@ m48t37_device::m48t37_device(const machine_config &mconfig, const char *tag, dev
m_offset_flags = 0x7ff0;
}
-m48t58_device::m48t58_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+m48t58_device::m48t58_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
: timekeeper_device(mconfig, M48T58, tag, owner, clock, 0x2000)
{
m_offset_watchdog = -1;
@@ -168,7 +162,7 @@ m48t58_device::m48t58_device(const machine_config &mconfig, const char *tag, dev
m_offset_flags = -1;
}
-mk48t08_device::mk48t08_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+mk48t08_device::mk48t08_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
: timekeeper_device(mconfig, MK48T08, tag, owner, clock, 0x2000)
{
m_offset_watchdog = -1;
@@ -184,7 +178,7 @@ mk48t08_device::mk48t08_device(const machine_config &mconfig, const char *tag, d
m_offset_flags = 0x1ff0;
}
-mk48t12_device::mk48t12_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+mk48t12_device::mk48t12_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
: timekeeper_device(mconfig, MK48T12, tag, owner, clock, 0x800)
{
m_offset_watchdog = -1;
@@ -214,27 +208,27 @@ void timekeeper_device::device_start()
machine().base_datetime(systime);
m_control = 0;
- m_seconds = time_helper::make_bcd( systime.local_time.second );
- m_minutes = time_helper::make_bcd( systime.local_time.minute );
- m_hours = time_helper::make_bcd( systime.local_time.hour );
- m_day = time_helper::make_bcd( systime.local_time.weekday + 1 );
- m_date = time_helper::make_bcd( systime.local_time.mday );
- m_month = time_helper::make_bcd( systime.local_time.month + 1 );
- m_year = time_helper::make_bcd( systime.local_time.year % 100 );
- m_century = time_helper::make_bcd( systime.local_time.year / 100 );
- m_data.resize( m_size );
-
- save_item( NAME(m_control) );
- save_item( NAME(m_seconds) );
- save_item( NAME(m_minutes) );
- save_item( NAME(m_hours) );
- save_item( NAME(m_day) );
- save_item( NAME(m_date) );
- save_item( NAME(m_month) );
- save_item( NAME(m_year) );
- save_item( NAME(m_century) );
- save_item( NAME(m_data) );
- save_item( NAME(m_watchdog_delay));
+ m_seconds = time_helper::make_bcd(systime.local_time.second);
+ m_minutes = time_helper::make_bcd(systime.local_time.minute);
+ m_hours = time_helper::make_bcd(systime.local_time.hour);
+ m_day = time_helper::make_bcd(systime.local_time.weekday + 1);
+ m_date = time_helper::make_bcd(systime.local_time.mday);
+ m_month = time_helper::make_bcd(systime.local_time.month + 1);
+ m_year = time_helper::make_bcd(systime.local_time.year % 100);
+ m_century = time_helper::make_bcd(systime.local_time.year / 100);
+ m_data.resize(m_size);
+
+ save_item(NAME(m_control));
+ save_item(NAME(m_seconds));
+ save_item(NAME(m_minutes));
+ save_item(NAME(m_hours));
+ save_item(NAME(m_day));
+ save_item(NAME(m_date));
+ save_item(NAME(m_month));
+ save_item(NAME(m_year));
+ save_item(NAME(m_century));
+ save_item(NAME(m_data));
+ save_item(NAME(m_watchdog_delay));
emu_timer *timer = timer_alloc();
timer->adjust(attotime::from_seconds(1), 0, attotime::from_seconds(1));
@@ -254,98 +248,98 @@ void timekeeper_device::device_reset() { }
void timekeeper_device::counters_to_ram()
{
- counter_to_ram( &m_data[0], m_offset_control, m_control );
- counter_to_ram( &m_data[0], m_offset_seconds, m_seconds );
- counter_to_ram( &m_data[0], m_offset_minutes, m_minutes );
- counter_to_ram( &m_data[0], m_offset_hours, m_hours );
- counter_to_ram( &m_data[0], m_offset_day, m_day );
- counter_to_ram( &m_data[0], m_offset_date, m_date );
- counter_to_ram( &m_data[0], m_offset_month, m_month );
- counter_to_ram( &m_data[0], m_offset_year, m_year );
- counter_to_ram( &m_data[0], m_offset_century, m_century );
+ counter_to_ram(&m_data[0], m_offset_control, m_control);
+ counter_to_ram(&m_data[0], m_offset_seconds, m_seconds);
+ counter_to_ram(&m_data[0], m_offset_minutes, m_minutes);
+ counter_to_ram(&m_data[0], m_offset_hours, m_hours);
+ counter_to_ram(&m_data[0], m_offset_day, m_day);
+ counter_to_ram(&m_data[0], m_offset_date, m_date);
+ counter_to_ram(&m_data[0], m_offset_month, m_month);
+ counter_to_ram(&m_data[0], m_offset_year, m_year);
+ counter_to_ram(&m_data[0], m_offset_century, m_century);
}
void timekeeper_device::counters_from_ram()
{
- m_control = counter_from_ram( &m_data[0], m_offset_control );
- m_seconds = counter_from_ram( &m_data[0], m_offset_seconds );
- m_minutes = counter_from_ram( &m_data[0], m_offset_minutes );
- m_hours = counter_from_ram( &m_data[0], m_offset_hours );
- m_day = counter_from_ram( &m_data[0], m_offset_day );
- m_date = counter_from_ram( &m_data[0], m_offset_date );
- m_month = counter_from_ram( &m_data[0], m_offset_month );
- m_year = counter_from_ram( &m_data[0], m_offset_year );
- m_century = counter_from_ram( &m_data[0], m_offset_century );
+ m_control = counter_from_ram(&m_data[0], m_offset_control);
+ m_seconds = counter_from_ram(&m_data[0], m_offset_seconds);
+ m_minutes = counter_from_ram(&m_data[0], m_offset_minutes);
+ m_hours = counter_from_ram(&m_data[0], m_offset_hours);
+ m_day = counter_from_ram(&m_data[0], m_offset_day);
+ m_date = counter_from_ram(&m_data[0], m_offset_date);
+ m_month = counter_from_ram(&m_data[0], m_offset_month);
+ m_year = counter_from_ram(&m_data[0], m_offset_year);
+ m_century = counter_from_ram(&m_data[0], m_offset_century);
}
void timekeeper_device::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr)
{
LOGMASKED(LOG_TICKS, "Tick\n");
- if( ( m_seconds & SECONDS_ST ) != 0 ||
- ( m_control & CONTROL_W ) != 0 )
+ if ((m_seconds & SECONDS_ST) != 0 ||
+ (m_control & CONTROL_W) != 0)
{
logerror("No Tick\n");
return;
}
- int carry = time_helper::inc_bcd( &m_seconds, MASK_SECONDS, 0x00, 0x59 );
- if( carry )
+ int carry = time_helper::inc_bcd(&m_seconds, MASK_SECONDS, 0x00, 0x59);
+ if (carry)
{
- carry = time_helper::inc_bcd( &m_minutes, MASK_MINUTES, 0x00, 0x59 );
+ carry = time_helper::inc_bcd(&m_minutes, MASK_MINUTES, 0x00, 0x59);
}
- if( carry )
+ if (carry)
{
- carry = time_helper::inc_bcd( &m_hours, MASK_HOURS, 0x00, 0x23 );
+ carry = time_helper::inc_bcd(&m_hours, MASK_HOURS, 0x00, 0x23);
}
- if( carry )
+ if (carry)
{
- uint8_t maxdays;
- static const uint8_t daysinmonth[] = { 0x31, 0x28, 0x31, 0x30, 0x31, 0x30, 0x31, 0x31, 0x30, 0x31, 0x30, 0x31 };
+ u8 maxdays;
+ static const u8 daysinmonth[] = { 0x31, 0x28, 0x31, 0x30, 0x31, 0x30, 0x31, 0x31, 0x30, 0x31, 0x30, 0x31 };
- time_helper::inc_bcd( &m_day, MASK_DAY, 0x01, 0x07 );
+ time_helper::inc_bcd(&m_day, MASK_DAY, 0x01, 0x07);
- uint8_t month = time_helper::from_bcd( m_month );
- uint8_t year = time_helper::from_bcd( m_year );
+ u8 month = time_helper::from_bcd(m_month);
+ u8 year = time_helper::from_bcd(m_year);
- if( month == 2 && ( year % 4 ) == 0 )
+ if (month == 2 && (year % 4) == 0)
{
maxdays = 0x29;
}
- else if( month >= 1 && month <= 12 )
+ else if (month >= 1 && month <= 12)
{
- maxdays = daysinmonth[ month - 1 ];
+ maxdays = daysinmonth[month - 1];
}
else
{
maxdays = 0x31;
}
- carry = time_helper::inc_bcd( &m_date, MASK_DATE, 0x01, maxdays );
+ carry = time_helper::inc_bcd(&m_date, MASK_DATE, 0x01, maxdays);
}
- if( carry )
+ if (carry)
{
- carry = time_helper::inc_bcd( &m_month, MASK_MONTH, 0x01, 0x12 );
+ carry = time_helper::inc_bcd(&m_month, MASK_MONTH, 0x01, 0x12);
}
- if( carry )
+ if (carry)
{
- carry = time_helper::inc_bcd( &m_year, MASK_YEAR, 0x00, 0x99 );
+ carry = time_helper::inc_bcd(&m_year, MASK_YEAR, 0x00, 0x99);
}
- if( carry )
+ if (carry)
{
- carry = time_helper::inc_bcd( &m_century, MASK_CENTURY, 0x00, 0x99 );
+ carry = time_helper::inc_bcd(&m_century, MASK_CENTURY, 0x00, 0x99);
- if( type() == M48T35 ||
- type() == M48T58 )
+ if (type() == M48T35 ||
+ type() == M48T58)
{
- if( ( m_day & DAY_CEB ) != 0 )
+ if ((m_day & DAY_CEB) != 0)
{
m_day ^= DAY_CB;
}
}
}
- if( ( m_control & CONTROL_R ) == 0 )
+ if ((m_control & CONTROL_R) == 0)
{
counters_to_ram();
}
@@ -356,57 +350,59 @@ TIMER_CALLBACK_MEMBER(timekeeper_device::watchdog_callback)
// Set Flag
m_data[m_offset_flags] |= FLAGS_WDF;
// WDS (bit 7) selects callback
- if (m_data[m_offset_watchdog] & 0x80) {
+ if (m_data[m_offset_watchdog] & 0x80)
+ {
// Clear watchdog register
m_data[m_offset_watchdog] = 0;
m_reset_cb(ASSERT_LINE);
}
- else {
+ else
m_irq_cb(ASSERT_LINE);
- }
+
logerror("watchdog_callback: WD Control: %02x WD Flags: %02x\n", m_data[m_offset_watchdog], m_data[m_offset_flags]);
}
-WRITE8_MEMBER(timekeeper_device::watchdog_write)
+void timekeeper_device::watchdog_write(u8 data)
{
- if ((m_data[m_offset_watchdog] & 0x7f) != 0) {
+ if ((m_data[m_offset_watchdog] & 0x7f) != 0)
m_watchdog_timer->adjust(m_watchdog_delay);
- }
}
-WRITE8_MEMBER( timekeeper_device::write )
+void timekeeper_device::write(offs_t offset, u8 data)
{
LOGMASKED(LOG_GENERAL, "timekeeper_device::write: %04x = %02x\n", offset, data);
- if( offset == m_offset_control )
+ if (offset == m_offset_control)
{
- if( ( m_control & CONTROL_W ) != 0 &&
- ( data & CONTROL_W ) == 0 )
+ if ((m_control & CONTROL_W) != 0 &&
+ (data & CONTROL_W) == 0)
{
counters_from_ram();
}
- if( ( m_control & CONTROL_R ) != 0 &&
- ( data & CONTROL_W ) == 0 )
+ if ((m_control & CONTROL_R) != 0 &&
+ (data & CONTROL_W) == 0)
{
counters_to_ram();
}
m_control = data;
}
- else if( offset == m_offset_day )
+ else if (offset == m_offset_day)
{
- if( type() == M48T35 ||
- type() == M48T58 )
+ if (type() == M48T35 ||
+ type() == M48T58)
{
- m_day = ( m_day & ~DAY_CEB ) | ( data & DAY_CEB );
+ m_day = (m_day & ~DAY_CEB) | (data & DAY_CEB);
}
}
else if (offset == m_offset_watchdog && type() == M48T37)
{
- if ((data & 0x7f) == 0) {
+ if ((data & 0x7f) == 0)
+ {
m_watchdog_timer->adjust(attotime::never);
}
- else {
+ else
+ {
// Calculate the time unit
m_watchdog_delay = attotime::from_usec(62500 << (2 * (data & 0x3)));
// Adjust by multiplier
@@ -416,17 +412,17 @@ WRITE8_MEMBER( timekeeper_device::write )
}
}
- m_data[ offset ] = data;
+ m_data[offset] = data;
}
-READ8_MEMBER( timekeeper_device::read )
+u8 timekeeper_device::read(offs_t offset)
{
- uint8_t result = m_data[ offset ];
- if( offset == m_offset_date && type() == M48T58 )
+ u8 result = m_data[offset];
+ if (offset == m_offset_date && type() == M48T58)
{
result &= ~DATE_BL;
}
- else if( offset == m_offset_flags && type() == M48T37 )
+ else if (offset == m_offset_flags && type() == M48T37)
{
// Clear the watchdog flag
m_data[m_offset_flags] &= ~FLAGS_WDF;
@@ -447,15 +443,15 @@ void timekeeper_device::nvram_default()
{
if (m_default_data.found())
{
- memcpy( &m_data[0], m_default_data, m_size );
+ memcpy(&m_data[0], m_default_data, m_size);
}
else
{
- memset( &m_data[0], 0xff, m_data.size());
+ memset(&m_data[0], 0xff, m_data.size());
}
- if ( m_offset_flags >= 0 )
- m_data[ m_offset_flags ] = 0;
+ if (m_offset_flags >= 0)
+ m_data[m_offset_flags] = 0;
counters_to_ram();
}
@@ -467,7 +463,7 @@ void timekeeper_device::nvram_default()
void timekeeper_device::nvram_read(emu_file &file)
{
- file.read( &m_data[0], m_size );
+ file.read(&m_data[0], m_size);
counters_to_ram();
}
@@ -480,5 +476,5 @@ void timekeeper_device::nvram_read(emu_file &file)
void timekeeper_device::nvram_write(emu_file &file)
{
- file.write( &m_data[0], m_size );
+ file.write(&m_data[0], m_size);
}
diff --git a/src/devices/machine/timekpr.h b/src/devices/machine/timekpr.h
index 4742a1b1ae8..def60c02059 100644
--- a/src/devices/machine/timekpr.h
+++ b/src/devices/machine/timekpr.h
@@ -32,16 +32,16 @@
class timekeeper_device : public device_t, public device_nvram_interface
{
public:
- DECLARE_WRITE8_MEMBER( write );
- DECLARE_READ8_MEMBER( read );
- DECLARE_WRITE8_MEMBER(watchdog_write);
+ void write(offs_t offset, u8 data);
+ u8 read(offs_t offset);
+ void watchdog_write(u8 data = 0);
auto reset_cb() { return m_reset_cb.bind(); }
auto irq_cb() { return m_irq_cb.bind(); }
protected:
// construction/destruction
- timekeeper_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock, int size);
+ timekeeper_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock, u32 size);
// device-level overrides
virtual void device_start() override;
@@ -62,70 +62,70 @@ private:
void counters_from_ram();
// internal state
- uint8_t m_control;
- uint8_t m_seconds;
- uint8_t m_minutes;
- uint8_t m_hours;
- uint8_t m_day;
- uint8_t m_date;
- uint8_t m_month;
- uint8_t m_year;
- uint8_t m_century;
-
- std::vector<uint8_t> m_data;
- optional_region_ptr<uint8_t> m_default_data;
+ u8 m_control;
+ u8 m_seconds;
+ u8 m_minutes;
+ u8 m_hours;
+ u8 m_day;
+ u8 m_date;
+ u8 m_month;
+ u8 m_year;
+ u8 m_century;
+
+ std::vector<u8> m_data;
+ optional_region_ptr<u8> m_default_data;
emu_timer* m_watchdog_timer;
attotime m_watchdog_delay;
protected:
- int const m_size;
- int m_offset_watchdog;
- int m_offset_control;
- int m_offset_seconds;
- int m_offset_minutes;
- int m_offset_hours;
- int m_offset_day;
- int m_offset_date;
- int m_offset_month;
- int m_offset_year;
- int m_offset_century;
- int m_offset_flags;
+ u32 const m_size;
+ s32 m_offset_watchdog;
+ s32 m_offset_control;
+ s32 m_offset_seconds;
+ s32 m_offset_minutes;
+ s32 m_offset_hours;
+ s32 m_offset_day;
+ s32 m_offset_date;
+ s32 m_offset_month;
+ s32 m_offset_year;
+ s32 m_offset_century;
+ s32 m_offset_flags;
};
class m48t02_device : public timekeeper_device
{
public:
- m48t02_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock = 0);
+ m48t02_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock = 0);
};
class m48t35_device : public timekeeper_device
{
public:
- m48t35_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock = 0);
+ m48t35_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock = 0);
};
class m48t37_device : public timekeeper_device
{
public:
- m48t37_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock = 0);
+ m48t37_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock = 0);
};
class m48t58_device : public timekeeper_device
{
public:
- m48t58_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock = 0);
+ m48t58_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock = 0);
};
class mk48t08_device : public timekeeper_device
{
public:
- mk48t08_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock = 0);
+ mk48t08_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock = 0);
};
class mk48t12_device : public timekeeper_device
{
public:
- mk48t12_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock = 0);
+ mk48t12_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock = 0);
};
// device type definition
diff --git a/src/devices/machine/timer.h b/src/devices/machine/timer.h
index e27c8a8cc53..944db93c1e5 100644
--- a/src/devices/machine/timer.h
+++ b/src/devices/machine/timer.h
@@ -23,44 +23,6 @@
#define TIMER_DEVICE_CALLBACK_MEMBER(name) void name(timer_device &timer, void *ptr, s32 param)
//**************************************************************************
-// TIMER DEVICE CONFIGURATION MACROS
-//**************************************************************************
-
-#define MCFG_TIMER_ADD_NONE(_tag) \
- MCFG_DEVICE_ADD(_tag, TIMER, 0) \
- downcast<timer_device &>(*device).configure_generic(timer_device::expired_delegate());
-#define MCFG_TIMER_DRIVER_ADD(_tag, _class, _callback) \
- MCFG_DEVICE_ADD(_tag, TIMER, 0) \
- downcast<timer_device &>(*device).configure_generic(timer_device::expired_delegate(&_class::_callback, #_class "::" #_callback, nullptr, (_class *)nullptr));
-#define MCFG_TIMER_DEVICE_ADD(_tag, _devtag, _class, _callback) \
- MCFG_DEVICE_ADD(_tag, TIMER, 0) \
- downcast<timer_device &>(*device).configure_generic(timer_device::expired_delegate(&_class::_callback, #_class "::" #_callback, _devtag, (_class *)nullptr));
-#define MCFG_TIMER_DRIVER_ADD_PERIODIC(_tag, _class, _callback, _period) \
- MCFG_DEVICE_ADD(_tag, TIMER, 0) \
- downcast<timer_device &>(*device).configure_periodic(timer_device::expired_delegate(&_class::_callback, #_class "::" #_callback, nullptr, (_class *)nullptr), _period);
-#define MCFG_TIMER_DEVICE_ADD_PERIODIC(_tag, _devtag, _class, _callback, _period) \
- MCFG_DEVICE_ADD(_tag, TIMER, 0) \
- downcast<timer_device &>(*device).configure_periodic(timer_device::expired_delegate(&_class::_callback, #_class "::" #_callback, _devtag, (_class *)nullptr), _period);
-#define MCFG_TIMER_DRIVER_ADD_SCANLINE(_tag, _class, _callback, _screen, _first_vpos, _increment) \
- MCFG_DEVICE_ADD(_tag, TIMER, 0) \
- downcast<timer_device &>(*device).configure_scanline(timer_device::expired_delegate(&_class::_callback, #_class "::" #_callback, nullptr, (_class *)nullptr), _screen, _first_vpos, _increment);
-#define MCFG_TIMER_DEVICE_ADD_SCANLINE(_tag, _devtag, _class, _callback, _screen, _first_vpos, _increment) \
- MCFG_DEVICE_ADD(_tag, TIMER, 0) \
- downcast<timer_device &>(*device).configure_scanline(timer_device::expired_delegate(&_class::_callback, #_class "::" #_callback, _devtag, (_class *)nullptr), _screen, _first_vpos, _increment);
-#define MCFG_TIMER_MODIFY(_tag) \
- MCFG_DEVICE_MODIFY(_tag)
-
-#define MCFG_TIMER_DRIVER_CALLBACK(_class, _callback) \
- downcast<timer_device &>(*device).set_callback(timer_device::expired_delegate(&_class::_callback, #_class "::" #_callback, nullptr, (_class *)nullptr));
-#define MCFG_TIMER_START_DELAY(_start_delay) \
- downcast<timer_device &>(*device).set_start_delay(_start_delay);
-#define MCFG_TIMER_PARAM(_param) \
- downcast<timer_device &>(*device).config_param(_param);
-#define MCFG_TIMER_PTR(_ptr) \
- downcast<timer_device &>(*device).set_ptr((void *)(_ptr));
-
-
-//**************************************************************************
// TYPE DEFINITIONS
//**************************************************************************
@@ -86,6 +48,11 @@ public:
configure_generic(expired_delegate(callback, name, nullptr, static_cast<FunctionClass *>(nullptr)));
}
+ template <class FunctionClass> void configure_generic(const char *devname, void (FunctionClass::*callback)(timer_device &, void *, s32), const char *name)
+ {
+ configure_generic(expired_delegate(callback, name, devname, static_cast<FunctionClass *>(nullptr)));
+ }
+
template <typename Object> void configure_periodic(Object &&cb, const attotime &period)
{
m_type = TIMER_TYPE_PERIODIC;
@@ -98,6 +65,12 @@ public:
configure_periodic(expired_delegate(callback, name, nullptr, static_cast<FunctionClass *>(nullptr)), period);
}
+ template <class FunctionClass> void configure_periodic(const char *devname, void (FunctionClass::*callback)(timer_device &, void *, s32),
+ const char *name, const attotime &period)
+ {
+ configure_periodic(expired_delegate(callback, name, devname, static_cast<FunctionClass *>(nullptr)), period);
+ }
+
template <typename Object> void configure_scanline(Object &&cb, const char *screen, int first_vpos, int increment)
{
m_type = TIMER_TYPE_SCANLINE;
@@ -138,13 +111,18 @@ public:
// adjustments
void reset() { adjust(attotime::never, 0, attotime::never); }
- void adjust(const attotime &duration, s32 param = 0, const attotime &period = attotime::never) const { assert(m_type == TIMER_TYPE_GENERIC); m_timer->adjust(duration, param, period); }
+ void adjust(const attotime &duration, s32 param = 0, const attotime &period = attotime::never) const
+ {
+ assert(m_type == TIMER_TYPE_GENERIC);
+ m_timer->adjust(duration, param, period);
+ }
// timing information
attotime time_elapsed() const { return m_timer->elapsed(); }
attotime time_left() const { return m_timer->remaining(); }
attotime start_time() const { return m_timer->start(); }
attotime fire_time() const { return m_timer->expire(); }
+ attotime period() const { return m_timer ? m_timer->period() : m_period; }
private:
// device-level overrides
@@ -163,7 +141,7 @@ private:
// configuration data
timer_type m_type; // type of timer
- expired_delegate m_callback; // the timer's callback function
+ expired_delegate m_callback; // the timer's callback function
void * m_ptr; // the pointer parameter passed to the timer callback
// periodic timers only
diff --git a/src/devices/machine/tmp68301.cpp b/src/devices/machine/tmp68301.cpp
index 2add964e4e5..1eea072c64a 100644
--- a/src/devices/machine/tmp68301.cpp
+++ b/src/devices/machine/tmp68301.cpp
@@ -23,7 +23,8 @@ DEFINE_DEVICE_TYPE(TMP68301, tmp68301_device, "tmp68301", "Toshiba TMP68301")
void tmp68301_device::tmp68301_regs(address_map &map)
{
-// AM_RANGE(0x000,0x3ff) AM_RAM
+ map(0x000, 0x3ff).rw(FUNC(tmp68301_device::regs_r), FUNC(tmp68301_device::regs_w));
+
map(0x080, 0x093).rw(FUNC(tmp68301_device::icr_r), FUNC(tmp68301_device::icr_w)).umask16(0x00ff);
map(0x094, 0x095).rw(FUNC(tmp68301_device::imr_r), FUNC(tmp68301_device::imr_w));
@@ -134,9 +135,7 @@ WRITE8_MEMBER(tmp68301_device::icr_w)
}
tmp68301_device::tmp68301_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
- : device_t(mconfig, TMP68301, tag, owner, clock),
- device_memory_interface(mconfig, *this),
- m_cpu(*this, finder_base::DUMMY_TAG),
+ : m68000_device(mconfig, TMP68301, tag, owner, clock),
m_in_parallel_cb(*this),
m_out_parallel_cb(*this),
m_ipl(0),
@@ -145,8 +144,7 @@ tmp68301_device::tmp68301_device(const machine_config &mconfig, const char *tag,
m_iisr(0),
m_scr(0),
m_pdir(0),
- m_pdr(0),
- m_space_config("regs", ENDIANNESS_LITTLE, 16, 10, 0, address_map_constructor(), address_map_constructor(FUNC(tmp68301_device::tmp68301_regs), this))
+ m_pdr(0)
{
memset(m_regs, 0, sizeof(m_regs));
memset(m_icr, 0, sizeof(m_icr));
@@ -159,13 +157,17 @@ tmp68301_device::tmp68301_device(const machine_config &mconfig, const char *tag,
void tmp68301_device::device_start()
{
- int i;
- for (i = 0; i < 3; i++)
+ m68000_device::device_start();
+
+ for (int i = 0; i < 3; i++)
m_tmp68301_timer[i] = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(tmp68301_device::timer_callback), this));
m_in_parallel_cb.resolve_safe(0);
m_out_parallel_cb.resolve_safe();
+ m_program->install_device(0xfffc00, 0xffffff, *this, &tmp68301_device::tmp68301_regs);
+ m_int_ack_callback = device_irq_acknowledge_delegate(FUNC(tmp68301_device::irq_callback), this);
+
save_item(NAME(m_regs));
save_item(NAME(m_icr));
save_item(NAME(m_ipl));
@@ -183,6 +185,8 @@ void tmp68301_device::device_start()
void tmp68301_device::device_reset()
{
+ m68000_device::device_reset();
+
m_ipr = 0;
m_iisr = 0;
m_imr = 0x7f7; // mask all irqs
@@ -190,40 +194,10 @@ void tmp68301_device::device_reset()
update_ipl();
}
-//-------------------------------------------------
-// memory_space_config - return a description of
-// any address spaces owned by this device
-//-------------------------------------------------
-
-device_memory_interface::space_config_vector tmp68301_device::memory_space_config() const
-{
- return space_config_vector {
- std::make_pair(0, &m_space_config)
- };
-}
-
//**************************************************************************
// INLINE HELPERS
//**************************************************************************
-//-------------------------------------------------
-// read_byte - read a byte at the given address
-//-------------------------------------------------
-
-inline uint16_t tmp68301_device::read_word(offs_t address)
-{
- return space(0).read_word(address << 1);
-}
-
-//-------------------------------------------------
-// write_byte - write a byte at the given address
-//-------------------------------------------------
-
-inline void tmp68301_device::write_word(offs_t address, uint16_t data)
-{
- space(0).write_word(address << 1, data);
-}
-
IRQ_CALLBACK_MEMBER(tmp68301_device::irq_callback)
{
uint8_t IVNR = m_regs[0x9a/2] & 0xe0; // Interrupt Vector Number Register (IVNR)
@@ -312,7 +286,7 @@ void tmp68301_device::update_timer(int i)
{
int scale = (TCR & 0x3c00)>>10; // P4..1
if (scale > 8) scale = 8;
- duration = attotime::from_hz(m_cpu->unscaled_clock()) * ((1 << scale) * max);
+ duration = attotime::from_hz(unscaled_clock()) * ((1 << scale) * max);
}
break;
}
@@ -343,9 +317,9 @@ void tmp68301_device::update_ipl()
if (new_ipl != m_ipl)
{
if (m_ipl != 0)
- m_cpu->set_input_line(m_ipl, CLEAR_LINE);
+ set_input_line(m_ipl, CLEAR_LINE);
if (new_ipl != 0)
- m_cpu->set_input_line(new_ipl, ASSERT_LINE);
+ set_input_line(new_ipl, ASSERT_LINE);
m_ipl = new_ipl;
}
@@ -366,18 +340,16 @@ uint8_t tmp68301_device::serial_interrupt_cause(int channel)
READ16_MEMBER( tmp68301_device::regs_r )
{
- return read_word(offset);
+ return m_regs[offset];
}
WRITE16_MEMBER( tmp68301_device::regs_w )
{
COMBINE_DATA(&m_regs[offset]);
- write_word(offset,m_regs[offset]);
-
if (!ACCESSING_BITS_0_7) return;
-// logerror("CPU #0 PC %06X: TMP68301 Reg %04X<-%04X & %04X\n", m_cpu->pc(),offset*2,data,mem_mask^0xffff);
+// logerror("CPU #0 PC %06X: TMP68301 Reg %04X<-%04X & %04X\n", >pc(),offset*2,data,mem_mask^0xffff);
switch( offset * 2 )
{
diff --git a/src/devices/machine/tmp68301.h b/src/devices/machine/tmp68301.h
index e019387802b..c350b9b0be6 100644
--- a/src/devices/machine/tmp68301.h
+++ b/src/devices/machine/tmp68301.h
@@ -16,27 +16,19 @@
-class tmp68301_device : public device_t,
- public device_memory_interface
+class tmp68301_device : public m68000_device
{
public:
tmp68301_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- template <typename T> void set_cputag(T &&tag) { m_cpu.set_tag(std::forward<T>(tag)); } // FIXME: M68000 ought to be a parent class, not an external object
auto in_parallel_callback() { return m_in_parallel_cb.bind(); }
auto out_parallel_callback() { return m_out_parallel_cb.bind(); }
- // Hardware Registers
- DECLARE_READ16_MEMBER( regs_r );
- DECLARE_WRITE16_MEMBER( regs_w );
-
// Interrupts
void external_interrupt_0();
void external_interrupt_1();
void external_interrupt_2();
- IRQ_CALLBACK_MEMBER(irq_callback);
-
private:
DECLARE_READ16_MEMBER(imr_r);
DECLARE_WRITE16_MEMBER(imr_w);
@@ -53,13 +45,18 @@ private:
DECLARE_READ8_MEMBER(icr_r);
DECLARE_WRITE8_MEMBER(icr_w);
+ // Hardware Registers
+ DECLARE_READ16_MEMBER( regs_r );
+ DECLARE_WRITE16_MEMBER( regs_w );
+
void tmp68301_regs(address_map &map);
+ IRQ_CALLBACK_MEMBER(irq_callback);
+
protected:
// device-level overrides
virtual void device_start() override;
virtual void device_reset() override;
- virtual space_config_vector memory_space_config() const override;
private:
TIMER_CALLBACK_MEMBER(timer_callback);
@@ -78,11 +75,6 @@ private:
static constexpr uint16_t TIMER1_IRQ = 1 << 9;
static constexpr uint16_t TIMER2_IRQ = 1 << 10;
- inline uint16_t read_word(offs_t address);
- inline void write_word(offs_t address, uint16_t data);
-
- required_device<m68000_base_device> m_cpu;
-
devcb_read16 m_in_parallel_cb;
devcb_write16 m_out_parallel_cb;
@@ -100,8 +92,6 @@ private:
uint16_t m_pdir;
uint16_t m_pdr;
uint8_t m_icr[10];
-
- const address_space_config m_space_config;
};
DECLARE_DEVICE_TYPE(TMP68301, tmp68301_device)
diff --git a/src/devices/machine/tms5501.cpp b/src/devices/machine/tms5501.cpp
index f7581a30a72..d067497567a 100644
--- a/src/devices/machine/tms5501.cpp
+++ b/src/devices/machine/tms5501.cpp
@@ -263,6 +263,9 @@ READ8_MEMBER( tms5501_device::rst_r )
READ8_MEMBER( tms5501_device::sta_r )
{
+ if(is_transmit_register_empty())
+ m_sta |= STA_XBE;
+
uint8_t data = m_sta;
m_sta &= ~STA_OE;
diff --git a/src/devices/machine/tms9901.cpp b/src/devices/machine/tms9901.cpp
index 5282dd6f9f5..4e7341feb61 100644
--- a/src/devices/machine/tms9901.cpp
+++ b/src/devices/machine/tms9901.cpp
@@ -53,6 +53,16 @@ Pins:
(This is mostly obvious, but it implies that you cannot trigger an
interrupt by setting the output state of a pin, which is not SO obvious.)
+Clock mode:
+ The "clock mode" is entered by setting bit 0 to 1. This means that the
+ clock register becomes accessible to changes and inspection. The clock
+ itself runs in the interrupt mode. Accordingly, the typical setup
+ involves first setting bit 0 to 1, then loading some or all of the
+ clock register bits, and then switching to interrupt mode again. From then
+ on, INT3 is asserted whenever the clock reaches 0, and is cleared by
+ writing 0 or 1 to bit 3. The clock can only be stopped by setting the
+ register to 0 or by a reset.
+
Interrupt handling:
After each clock cycle, TMS9901 latches the state of INT1*-INT15* (except
pins which are set as output pins). If the clock is enabled, it replaces
@@ -105,6 +115,9 @@ MZ: According to the description in
MZ: Turned to class (January 2012)
+MZ: Added a synchronous clock input (Phi line) as an alternative to the
+ emu_timer.
+
TODO: Tests on a real machine
- Set an interrupt input (e.g. keyboard for Geneve), trigger RST2*, check whether
interrupt mask has been reset
@@ -124,24 +137,23 @@ TODO: Tests on a real machine
#include <math.h>
-#define LOG_GENERAL (1U << 0)
-#define LOG_PINS (1U << 1)
-#define LOG_CLOCK (1U << 2)
-#define LOG_MODE (1U << 3)
+#define LOG_GENERAL (1U << 0)
+#define LOG_PINS (1U << 1)
+#define LOG_CONFIG (1U << 2)
+#define LOG_MODE (1U << 3)
+#define LOG_INT (1U << 4)
+#define LOG_DECVALUE (1U << 5)
-//#define VERBOSE (LOG_PINS | LOG_CLOCK | LOG_MODE)
+#define VERBOSE ( 0 )
#include "logmacro.h"
-#define LOGPINS(...) LOGMASKED(LOG_PINS, __VA_ARGS__)
-#define LOGCLOCK(...) LOGMASKED(LOG_CLOCK, __VA_ARGS__)
-#define LOGMODE(...) LOGMASKED(LOG_MODE, __VA_ARGS__)
-
-
/*
Constructor
*/
tms9901_device::tms9901_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
: device_t(mconfig, TMS9901, tag, owner, clock),
+ m_clock_active(false),
+ m_clockdiv(0),
m_read_block(*this),
m_write_p{{*this},{*this},{*this},{*this},{*this},{*this},{*this},{*this},{*this},{*this},{*this},{*this},{*this},{*this},{*this},{*this}},
m_interrupt(*this)
@@ -162,12 +174,12 @@ void tms9901_device::field_interrupts()
// if timer is enabled, INT3 pin is overridden by timer
if (m_timer_int_pending)
{
- LOGCLOCK("timer fires\n");
+ LOGMASKED(LOG_INT, "INT3 (timer) asserted\n");
current_ints |= INT3;
}
else
{
- LOGCLOCK("timer clear\n");
+ LOGMASKED(LOG_INT, "INT3 (timer) cleared\n");
current_ints &= ~INT3;
}
}
@@ -197,6 +209,7 @@ void tms9901_device::field_interrupts()
current_ints >>= 1; /* try next bit */
level++;
}
+ LOGMASKED(LOG_INT, "Triggering interrupt, level %d\n", level);
m_int_pending = true;
if (!m_interrupt.isnull())
m_interrupt(level, 1, 0xff); // the offset carries the IC0-3 level
@@ -237,11 +250,11 @@ void tms9901_device::timer_reload()
if (m_clock_register != 0)
{ /* reset clock interval */
m_decrementer_value = m_clock_register;
- m_decrementer->enable(true);
+ m_clock_active = true;
}
else
{ /* clock interval == 0 -> no timer */
- m_decrementer->enable(false);
+ m_clock_active = false;
}
}
@@ -262,13 +275,13 @@ void tms9901_device::timer_reload()
bit 16-31: current status of the P0-P15 pins (quits timer mode, too...)
*/
-READ8_MEMBER( tms9901_device::read )
+uint8_t tms9901_device::read(offs_t offset)
{
int answer = 0;
- offset &= 0x003;
+ offset &= 0x01f;
- switch (offset)
+ switch (offset >> 3)
{
case 0:
if (m_clock_mode)
@@ -291,7 +304,7 @@ READ8_MEMBER( tms9901_device::read )
// Set those bits here
answer |= (m_pio_output_mirror & m_pio_direction_mirror) & 0xFF;
}
- LOGPINS("input on lines INT7..CB = %02x\n", answer);
+ LOGMASKED(LOG_PINS, "Input on lines INT7..CB = %02x\n", answer);
break;
case 1:
if (m_clock_mode)
@@ -311,7 +324,7 @@ READ8_MEMBER( tms9901_device::read )
answer &= ~(m_pio_direction_mirror >> 8);
answer |= (m_pio_output_mirror & m_pio_direction_mirror) >> 8;
}
- LOGPINS("input on lines INT15..INT8 = %02x\n", answer);
+ LOGMASKED(LOG_PINS, "Input on lines INT15..INT8 = %02x\n", answer);
break;
case 2:
/* exit timer mode */
@@ -325,7 +338,7 @@ READ8_MEMBER( tms9901_device::read )
answer &= ~m_pio_direction;
answer |= (m_pio_output & m_pio_direction) & 0xFF;
- LOGPINS("input on lines P7..P0 = %02x\n", answer);
+ LOGMASKED(LOG_PINS, "Input on lines P7..P0 = %02x\n", answer);
break;
case 3:
@@ -338,12 +351,12 @@ READ8_MEMBER( tms9901_device::read )
answer &= ~(m_pio_direction >> 8);
answer |= (m_pio_output & m_pio_direction) >> 8;
- LOGPINS("input on lines P15..P8 = %02x\n", answer);
+ LOGMASKED(LOG_PINS, "Input on lines P15..P8 = %02x\n", answer);
break;
}
- return answer;
+ return BIT(answer, offset & 7);
}
/*
@@ -359,7 +372,7 @@ READ8_MEMBER( tms9901_device::read )
bit 16-31: set output state of P0-P15 (and set them as output pin) (quit timer mode, too...)
*/
-WRITE8_MEMBER ( tms9901_device::write )
+void tms9901_device::write(offs_t offset, uint8_t data)
{
data &= 1; /* clear extra bits */
offset &= 0x01F;
@@ -367,7 +380,7 @@ WRITE8_MEMBER ( tms9901_device::write )
if (offset >= 0x10)
{
int pin = offset & 0x0F;
- LOGPINS("output on P%d = %d\n", pin, data);
+ LOGMASKED(LOG_PINS, "Output on P%d = %d\n", pin, data);
int bit = (1 << pin);
@@ -408,18 +421,20 @@ WRITE8_MEMBER ( tms9901_device::write )
{
// Switch to interrupt mode; quit clock mode
m_clock_mode = false;
- LOGMODE("int mode\n");
+ LOGMASKED(LOG_MODE, "Enter interrupt mode\n");
}
else
{
m_clock_mode = true;
- LOGMODE("clock mode\n");
+ LOGMASKED(LOG_MODE, "Enter clock mode\n");
// we are switching to clock mode: latch the current value of
// the decrementer register
if (m_clock_register != 0)
m_clock_read_register = m_decrementer_value;
else
m_clock_read_register = 0; /* timer inactive... */
+
+ LOGMASKED(LOG_CONFIG, "Clock setting = %d\n", m_clock_read_register);
}
}
else if (offset == 0x0f)
@@ -437,7 +452,7 @@ WRITE8_MEMBER ( tms9901_device::write )
// Spec is not clear on whether the mask bits are also reset by RST2*
// TODO: Check on a real machine. (I'd guess from the text they are not touched)
m_enabled_ints = 0;
- LOGMODE("Soft reset (RST2*)\n");
+ LOGMASKED(LOG_MODE, "Soft reset (RST2*)\n");
}
}
else
@@ -447,7 +462,7 @@ WRITE8_MEMBER ( tms9901_device::write )
else
m_enabled_ints &= ~0x4000; /* unset bit */
- LOGMODE("interrupts = %04x\n", m_enabled_ints);
+ LOGMASKED(LOG_CONFIG, "Enabled interrupts = %04x\n", m_enabled_ints);
field_interrupts(); /* changed interrupt state */
}
}
@@ -469,7 +484,7 @@ WRITE8_MEMBER ( tms9901_device::write )
m_clock_register &= ~bit; /* clear bit */
/* reset clock timer (page 8) */
- LOGCLOCK("clock register = %04x\n", m_clock_register);
+ LOGMASKED(LOG_CONFIG, "Clock register = %04x\n", m_clock_register);
timer_reload();
}
else
@@ -484,7 +499,7 @@ WRITE8_MEMBER ( tms9901_device::write )
if (offset == 3)
m_timer_int_pending = false; /* SBO 3 clears pending timer interrupt (??) */
- LOGMODE("enabled interrupts = %04x\n");
+ LOGMASKED(LOG_CONFIG, "Enabled interrupts = %04x\n", m_enabled_ints);
field_interrupts(); /* changed interrupt state */
}
}
@@ -500,10 +515,20 @@ void tms9901_device::device_timer(emu_timer &timer, device_timer_id id, int para
{
if (id==DECREMENTER) // we have only that one
{
+ clock_in(ASSERT_LINE);
+ clock_in(CLEAR_LINE);
+ }
+}
+
+void tms9901_device::clock_in(line_state clk)
+{
+ if (m_clock_active && clk == ASSERT_LINE)
+ {
m_decrementer_value--;
- LOGCLOCK("decrementer = %d\n", m_decrementer_value);
+ LOGMASKED(LOG_DECVALUE, "Decrementer = %d\n", m_decrementer_value);
if (m_decrementer_value<=0)
{
+ LOGMASKED(LOG_INT, "Timer expired\n");
m_timer_int_pending = true; // decrementer interrupt requested
field_interrupts();
m_decrementer_value = m_clock_register;
@@ -511,6 +536,21 @@ void tms9901_device::device_timer(emu_timer &timer, device_timer_id id, int para
}
}
+/*
+ Synchronous clock input. This may be used for systems which have
+ a CLK line controlled by the CPU, like the TMS99xx systems.
+ In that case, clock is set to 0.
+*/
+WRITE_LINE_MEMBER( tms9901_device::phi_line )
+{
+ // Divider by 64
+ if (state==ASSERT_LINE)
+ m_clockdiv = (m_clockdiv+1) % 0x40;
+
+ if (m_clockdiv==0)
+ clock_in((line_state)state);
+}
+
/*-------------------------------------------------
device_stop - device-specific stop
-------------------------------------------------*/
@@ -565,9 +605,12 @@ void tms9901_device::do_reset()
void tms9901_device::device_start()
{
- m_decrementer = timer_alloc(DECREMENTER);
- m_decrementer->adjust(attotime::from_hz(clock() / 64.), 0, attotime::from_hz(clock() / 64.));
- m_decrementer->enable(false);
+ // Allow for using asynchronous and synchronous clocks
+ if (clock() != 0)
+ {
+ m_decrementer = timer_alloc(DECREMENTER);
+ m_decrementer->adjust(attotime::from_hz(clock() / 64.), 0, attotime::from_hz(clock() / 64.));
+ }
m_read_block.resolve();
for (auto &cb : m_write_p)
diff --git a/src/devices/machine/tms9901.h b/src/devices/machine/tms9901.h
index 86a2c6852e3..eda01f253ad 100644
--- a/src/devices/machine/tms9901.h
+++ b/src/devices/machine/tms9901.h
@@ -60,8 +60,11 @@ public:
DECLARE_WRITE_LINE_MEMBER( rst1_line );
- DECLARE_READ8_MEMBER( read );
- DECLARE_WRITE8_MEMBER( write );
+ // Synchronous clock input
+ DECLARE_WRITE_LINE_MEMBER( phi_line );
+
+ uint8_t read(offs_t offset);
+ void write(offs_t offset, uint8_t data);
auto p_out_cb(int n) { return m_write_p[n].bind(); }
auto read_cb() { return m_read_block.bind(); }
@@ -83,6 +86,9 @@ private:
// Common method for device_reset and rst1_line
void do_reset();
+ // Common clock handling
+ void clock_in(line_state clk);
+
// State of the INT1-INT15 lines (must be inverted when queried)
// Note that the levels must also be delivered when reading the pins, which
// may require to latch the int levels.
@@ -93,6 +99,9 @@ private:
bool m_int_pending; // status of the int* pin (connected to TMS9900)
bool m_timer_int_pending; // timer int pending (overrides int3 pin if timer enabled)
+ bool m_clock_active;
+ int m_clockdiv; // Clock divider counter (for synchronous clock)
+
// PIO registers
int m_pio_direction; // direction register for PIO
@@ -110,7 +119,7 @@ private:
// true = clock mode (read/write clock interval)
bool m_clock_mode;
- // MESS timer, used to emulate the decrementer register
+ // Timer, used to emulate the decrementer register
emu_timer *m_decrementer;
// clock interval, loaded in decrementer when it reaches 0.
diff --git a/src/devices/machine/tms9902.cpp b/src/devices/machine/tms9902.cpp
index 93e48cf03a2..813372f6f22 100644
--- a/src/devices/machine/tms9902.cpp
+++ b/src/devices/machine/tms9902.cpp
@@ -478,48 +478,109 @@ void tms9902_device::initiate_transmit()
bit 13-15: not emulated, normally used for diagnostics
bit 16: RBINT (RBRL&RIENB)
*/
-READ8_MEMBER( tms9902_device::cruread )
+uint8_t tms9902_device::cruread(offs_t offset)
{
uint8_t answer = 0;
- offset &= 0x0003;
-
- switch (offset)
+ switch (offset & 31)
{
- case 3: // Bits 31-24
- if (m_INT) answer |= 0x80;
- if (m_LDCTRL || m_LDIR || m_LRDR || m_LXDR || m_BRKON) answer |= 0x40;
- if (m_DSCH) answer |= 0x20;
- if (m_CTSin) answer |= 0x10;
- if (m_DSRin) answer |= 0x08;
- if (m_RTSout) answer |= 0x04;
- if (m_TIMELP) answer |= 0x02;
- if (m_TIMERR) answer |= 0x01;
+ case 31:
+ answer = m_INT;
+ break;
+
+ case 30:
+ answer = (m_LDCTRL || m_LDIR || m_LRDR || m_LXDR || m_BRKON);
+ break;
+
+ case 29:
+ answer = m_DSCH;
+ break;
+
+ case 28:
+ answer = m_CTSin;
+ break;
+
+ case 27:
+ answer = m_DSRin;
+ break;
+
+ case 26:
+ answer = m_RTSout;
+ break;
+
+ case 25:
+ answer = m_TIMELP;
+ break;
+
+ case 24:
+ answer = m_TIMERR;
+ break;
+
+ case 23:
+ answer = m_XSRE;
+ break;
+
+ case 22:
+ answer = m_XBRE;
+ break;
+
+ case 21:
+ answer = m_RBRL;
+ break;
+
+ case 20:
+ answer = (m_DSCH && m_DSCENB);
+ break;
+
+ case 19:
+ answer = (m_TIMELP && m_TIMENB);
+ break;
+
+ case 17:
+ answer = (m_XBRE && m_XBIENB);
+ break;
+
+ case 16:
+ answer = (m_RBRL && m_RIENB);
+ break;
+
+ case 15:
+ answer = m_RIN;
+ break;
+
+ case 14:
+ answer = m_RSBD;
+ break;
+
+ case 13:
+ answer = m_RFBD;
+ break;
+
+ case 12:
+ answer = m_RFER;
+ break;
+
+ case 11:
+ answer = m_ROVER;
break;
- case 2: // Bits 23-16
- if (m_XSRE) answer |= 0x80;
- if (m_XBRE) answer |= 0x40;
- if (m_RBRL) answer |= 0x20;
- if (m_DSCH && m_DSCENB) answer |= 0x10;
- if (m_TIMELP && m_TIMENB) answer |= 0x08;
- if (m_XBRE && m_XBIENB) answer |= 0x02;
- if (m_RBRL && m_RIENB) answer |= 0x01;
+ case 10:
+ answer = m_RPER;
break;
- case 1: // Bits 15-8
- if (m_RIN) answer |= 0x80;
- if (m_RSBD) answer |= 0x40;
- if (m_RFBD) answer |= 0x20;
- if (m_RFER) answer |= 0x10;
- if (m_ROVER) answer |= 0x08;
- if (m_RPER) answer |= 0x04;
- if (m_RPER || m_RFER || m_ROVER) answer |= 0x02;
+ case 9:
+ answer = (m_RPER || m_RFER || m_ROVER);
break;
- case 0: // Bits 7-0
- LOGCRU("Reading received byte = %02x\n", m_RBR);
- answer = m_RBR;
+ case 7:
+ case 6:
+ case 5:
+ case 4:
+ case 3:
+ case 2:
+ case 1:
+ case 0:
+ answer = BIT(m_RBR, offset & 31);
break;
}
if (VERBOSE & LOG_DETAIL) LOGCRU("Reading flag bits %d - %d = %02x\n", ((offset+1)*8-1), offset*8, answer);
@@ -597,7 +658,7 @@ void tms9902_device::reset_uart()
/*
TMS9902 CRU write
*/
-WRITE8_MEMBER( tms9902_device::cruwrite )
+void tms9902_device::cruwrite(offs_t offset, uint8_t data)
{
data &= 1; /* clear extra bits */
diff --git a/src/devices/machine/tms9902.h b/src/devices/machine/tms9902.h
index 1f96e2ffc17..3d203c59709 100644
--- a/src/devices/machine/tms9902.h
+++ b/src/devices/machine/tms9902.h
@@ -69,8 +69,8 @@ public:
int get_config_value();
- DECLARE_READ8_MEMBER( cruread );
- DECLARE_WRITE8_MEMBER( cruwrite );
+ uint8_t cruread(offs_t offset);
+ void cruwrite(offs_t offset, uint8_t data);
protected:
virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override;
diff --git a/src/devices/machine/tms9914.cpp b/src/devices/machine/tms9914.cpp
index 00fedd5db0c..eef06895493 100644
--- a/src/devices/machine/tms9914.cpp
+++ b/src/devices/machine/tms9914.cpp
@@ -241,7 +241,7 @@ WRITE_LINE_MEMBER(tms9914_device::ren_w)
}
// Register I/O
-WRITE8_MEMBER(tms9914_device::reg8_w)
+void tms9914_device::write(offs_t offset, uint8_t data)
{
LOG_REG("W %u=%02x\n" , offset , data);
@@ -323,7 +323,7 @@ WRITE8_MEMBER(tms9914_device::reg8_w)
}
}
-READ8_MEMBER(tms9914_device::reg8_r)
+uint8_t tms9914_device::read(offs_t offset)
{
uint8_t res;
diff --git a/src/devices/machine/tms9914.h b/src/devices/machine/tms9914.h
index 14df9d80647..9fda5aa2ebb 100644
--- a/src/devices/machine/tms9914.h
+++ b/src/devices/machine/tms9914.h
@@ -83,8 +83,9 @@ public:
DECLARE_WRITE_LINE_MEMBER(atn_w);
DECLARE_WRITE_LINE_MEMBER(ren_w);
- DECLARE_WRITE8_MEMBER(reg8_w);
- DECLARE_READ8_MEMBER(reg8_r);
+ // Register access
+ void write(offs_t offset, uint8_t data);
+ uint8_t read(offs_t offset);
// CONT output: true when 9914 is current controller-in-charge
DECLARE_READ_LINE_MEMBER(cont_r);
diff --git a/src/devices/machine/tube.cpp b/src/devices/machine/tube.cpp
index aac084a3158..a53c05ac38c 100644
--- a/src/devices/machine/tube.cpp
+++ b/src/devices/machine/tube.cpp
@@ -79,7 +79,7 @@ void tube_device::update_interrupts()
m_drq_handler(!BIT(m_r1stat, 4) && ((m_hp3pos > BIT(m_r1stat, 4)) || (m_ph3pos == 0)) ? ASSERT_LINE : CLEAR_LINE);
}
-READ8_MEMBER(tube_device::host_r)
+uint8_t tube_device::host_r(offs_t offset)
{
uint8_t data = 0xfe;
@@ -143,7 +143,7 @@ READ8_MEMBER(tube_device::host_r)
return data;
}
-WRITE8_MEMBER(tube_device::host_w)
+void tube_device::host_w(offs_t offset, uint8_t data)
{
switch (offset & 0x07)
{
@@ -197,7 +197,7 @@ WRITE8_MEMBER(tube_device::host_w)
update_interrupts();
}
-READ8_MEMBER(tube_device::parasite_r)
+uint8_t tube_device::parasite_r(offs_t offset)
{
uint8_t data = 0x00;
@@ -265,7 +265,7 @@ READ8_MEMBER(tube_device::parasite_r)
return data;
}
-WRITE8_MEMBER(tube_device::parasite_w)
+void tube_device::parasite_w(offs_t offset, uint8_t data)
{
switch (offset & 0x07)
{
diff --git a/src/devices/machine/tube.h b/src/devices/machine/tube.h
index c8d94b1c7a7..384cf29b8d9 100644
--- a/src/devices/machine/tube.h
+++ b/src/devices/machine/tube.h
@@ -32,10 +32,10 @@ public:
auto pirq_handler() { return m_pirq_handler.bind(); }
auto drq_handler() { return m_drq_handler.bind(); }
- DECLARE_READ8_MEMBER(host_r);
- DECLARE_WRITE8_MEMBER(host_w);
- DECLARE_READ8_MEMBER(parasite_r);
- DECLARE_WRITE8_MEMBER(parasite_w);
+ uint8_t host_r(offs_t offset);
+ void host_w(offs_t offset, uint8_t data);
+ uint8_t parasite_r(offs_t offset);
+ void parasite_w(offs_t offset, uint8_t data);
protected:
// device-level overrides
diff --git a/src/devices/machine/upd7002.cpp b/src/devices/machine/upd7002.cpp
index 69b9bb262ee..b00d44066e5 100644
--- a/src/devices/machine/upd7002.cpp
+++ b/src/devices/machine/upd7002.cpp
@@ -59,7 +59,7 @@ void upd7002_device::device_reset()
*****************************************************************************/
-READ8_MEMBER( upd7002_device::eoc_r )
+READ_LINE_MEMBER( upd7002_device::eoc_r )
{
return (m_status>>7)&0x01;
}
@@ -94,7 +94,7 @@ void upd7002_device::device_timer(emu_timer &timer, device_timer_id id, int para
}
-READ8_MEMBER( upd7002_device::read )
+uint8_t upd7002_device::read(offs_t offset)
{
switch(offset&0x03)
{
@@ -112,7 +112,7 @@ READ8_MEMBER( upd7002_device::read )
-WRITE8_MEMBER( upd7002_device::write )
+void upd7002_device::write(offs_t offset, uint8_t data)
{
/* logerror("write to uPD7002 $%02X = $%02X\n",offset,data); */
diff --git a/src/devices/machine/upd7002.h b/src/devices/machine/upd7002.h
index 5b62d13dc34..2a68774d435 100644
--- a/src/devices/machine/upd7002.h
+++ b/src/devices/machine/upd7002.h
@@ -30,9 +30,9 @@ public:
template <typename... T> void set_get_analogue_callback(T &&... args) { m_get_analogue_cb = get_analogue_delegate(std::forward<T>(args)...); }
template <typename... T> void set_eoc_callback(T &&... args) { m_eoc_cb = eoc_delegate(std::forward<T>(args)...); }
- DECLARE_READ8_MEMBER(eoc_r);
- DECLARE_READ8_MEMBER(read);
- DECLARE_WRITE8_MEMBER(write);
+ DECLARE_READ_LINE_MEMBER(eoc_r);
+ uint8_t read(offs_t offset);
+ void write(offs_t offset, uint8_t data);
protected:
// device-level overrides
diff --git a/src/devices/machine/upd765.cpp b/src/devices/machine/upd765.cpp
index bfbf277449b..64b844dd222 100644
--- a/src/devices/machine/upd765.cpp
+++ b/src/devices/machine/upd765.cpp
@@ -18,6 +18,7 @@
#define LOG_MATCH (1U << 10) // Sector matching
#define LOG_STATE (1U << 11) // State machine
#define LOG_LIVE (1U << 12) // Live states
+#define LOG_DONE (1U << 13) // Command done
#define VERBOSE (LOG_GENERAL | LOG_WARN )
@@ -38,6 +39,7 @@
#define LOGMATCH(...) LOGMASKED(LOG_MATCH, __VA_ARGS__)
#define LOGSTATE(...) LOGMASKED(LOG_STATE, __VA_ARGS__)
#define LOGLIVE(...) LOGMASKED(LOG_LIVE, __VA_ARGS__)
+#define LOGDONE(...) LOGMASKED(LOG_DONE, __VA_ARGS__)
DEFINE_DEVICE_TYPE(UPD765A, upd765a_device, "upd765a", "NEC uPD765A FDC")
DEFINE_DEVICE_TYPE(UPD765B, upd765b_device, "upd765b", "NEC uPD765B FDC")
@@ -166,7 +168,9 @@ upd765_family_device::upd765_family_device(const machine_config &mconfig, device
pc_fdc_interface(mconfig, type, tag, owner, clock),
intrq_cb(*this),
drq_cb(*this),
- hdl_cb(*this)
+ hdl_cb(*this),
+ idx_cb(*this),
+ us_cb(*this)
{
ready_polled = true;
ready_connected = true;
@@ -191,14 +195,19 @@ void upd765_family_device::set_mode(int _mode)
mode = _mode;
}
-void upd765_family_device::device_start()
+void upd765_family_device::device_resolve_objects()
{
- save_item(NAME(motorcfg));
- save_item(NAME(selected_drive));
-
intrq_cb.resolve_safe();
drq_cb.resolve_safe();
hdl_cb.resolve_safe();
+ idx_cb.resolve_safe();
+ us_cb.resolve_safe();
+}
+
+void upd765_family_device::device_start()
+{
+ save_item(NAME(motorcfg));
+ save_item(NAME(selected_drive));
for(int i=0; i != 4; i++) {
char name[2];
@@ -327,6 +336,7 @@ void upd765_family_device::set_ds(int fid)
for(floppy_info &fi : flopi)
if(fi.dev)
fi.dev->ds_w(fid);
+ us_cb(fid);
// record selected drive
selected_drive = fid;
@@ -341,9 +351,11 @@ void upd765_family_device::set_floppy(floppy_image_device *flop)
}
if(flop)
flop->setup_index_pulse_cb(floppy_image_device::index_pulse_cb(&upd765_family_device::index_callback, this));
+ else
+ idx_cb(0);
}
-READ8_MEMBER(upd765_family_device::sra_r)
+uint8_t upd765_family_device::sra_r()
{
uint8_t sra = 0;
int fid = dor & 3;
@@ -366,17 +378,17 @@ READ8_MEMBER(upd765_family_device::sra_r)
return sra;
}
-READ8_MEMBER(upd765_family_device::srb_r)
+uint8_t upd765_family_device::srb_r()
{
return 0;
}
-READ8_MEMBER(upd765_family_device::dor_r)
+uint8_t upd765_family_device::dor_r()
{
return dor;
}
-WRITE8_MEMBER(upd765_family_device::dor_w)
+void upd765_family_device::dor_w(uint8_t data)
{
LOGREGS("dor = %02x\n", data);
uint8_t diff = dor ^ data;
@@ -392,21 +404,16 @@ WRITE8_MEMBER(upd765_family_device::dor_w)
check_irq();
}
-READ8_MEMBER(upd765_family_device::tdr_r)
+uint8_t upd765_family_device::tdr_r()
{
return 0;
}
-WRITE8_MEMBER(upd765_family_device::tdr_w)
-{
-}
-
-READ8_MEMBER(upd765_family_device::msr_r)
+void upd765_family_device::tdr_w(uint8_t data)
{
- return read_msr();
}
-uint8_t upd765_family_device::read_msr()
+uint8_t upd765_family_device::msr_r()
{
uint32_t msr = 0;
switch(main_phase) {
@@ -437,7 +444,7 @@ uint8_t upd765_family_device::read_msr()
}
msr |= get_drive_busy();
- if(data_irq) {
+ if(data_irq && !machine().side_effects_disabled()) {
data_irq = false;
check_irq();
}
@@ -445,7 +452,7 @@ uint8_t upd765_family_device::read_msr()
return msr;
}
-WRITE8_MEMBER(upd765_family_device::dsr_w)
+void upd765_family_device::dsr_w(uint8_t data)
{
LOGREGS("dsr_w %02x (%s)\n", data, machine().describe_context());
if(data & 0x80)
@@ -459,39 +466,43 @@ void upd765_family_device::set_rate(int rate)
cur_rate = rate;
}
-uint8_t upd765_family_device::read_fifo()
+uint8_t upd765_family_device::fifo_r()
{
uint8_t r = 0xff;
switch(main_phase) {
case PHASE_EXEC:
+ if(machine().side_effects_disabled())
+ return fifo[0];
if(internal_drq)
return fifo_pop(false);
- LOGFIFO("read_fifo in phase %d\n", main_phase);
+ LOGFIFO("fifo_r in phase %d\n", main_phase);
break;
case PHASE_RESULT:
r = result[0];
- result_pos--;
- memmove(result, result+1, result_pos);
- if(!result_pos)
- main_phase = PHASE_CMD;
- else if(result_pos == 1) {
- // clear drive busy bit after the first sense interrupt status result byte is read
- for(floppy_info &fi : flopi)
- if((fi.main_state == RECALIBRATE || fi.main_state == SEEK) && fi.sub_state == IDLE && fi.st0_filled == false)
- fi.main_state = IDLE;
- clr_drive_busy();
+ if(!machine().side_effects_disabled()) {
+ result_pos--;
+ memmove(result, result+1, result_pos);
+ if(!result_pos)
+ main_phase = PHASE_CMD;
+ else if(result_pos == 1) {
+ // clear drive busy bit after the first sense interrupt status result byte is read
+ for(floppy_info &fi : flopi)
+ if((fi.main_state == RECALIBRATE || fi.main_state == SEEK) && fi.sub_state == IDLE && fi.st0_filled == false)
+ fi.main_state = IDLE;
+ clr_drive_busy();
+ }
}
break;
default:
- LOGFIFO("read_fifo in phase %d\n", main_phase);
+ LOGFIFO("fifo_r in phase %d\n", main_phase);
break;
}
return r;
}
-void upd765_family_device::write_fifo(uint8_t data)
+void upd765_family_device::fifo_w(uint8_t data)
{
switch(main_phase) {
case PHASE_CMD: {
@@ -517,11 +528,11 @@ void upd765_family_device::write_fifo(uint8_t data)
fifo_push(data, false);
return;
}
- LOGFIFO("write_fifo in phase %d\n", main_phase);
+ LOGFIFO("fifo_w in phase %d\n", main_phase);
break;
default:
- LOGFIFO("write_fifo in phase %d\n", main_phase);
+ LOGFIFO("fifo_w in phase %d\n", main_phase);
break;
}
}
@@ -534,12 +545,7 @@ uint8_t upd765_family_device::do_dir_r()
return 0x00;
}
-READ8_MEMBER(upd765_family_device::dir_r)
-{
- return do_dir_r();
-}
-
-WRITE8_MEMBER(upd765_family_device::ccr_w)
+void upd765_family_device::ccr_w(uint8_t data)
{
dsr = (dsr & 0xfc) | (data & 3);
cur_rate = rates[data & 3];
@@ -641,18 +647,10 @@ void upd765_family_device::fifo_expect(int size, bool write)
enable_transfer();
}
-READ8_MEMBER(upd765_family_device::mdma_r)
-{
- return dma_r();
-}
-
-WRITE8_MEMBER(upd765_family_device::mdma_w)
-{
- dma_w(data);
-}
-
uint8_t upd765_family_device::dma_r()
{
+ if(machine().side_effects_disabled())
+ return fifo[0];
return fifo_pop(false);
}
@@ -1474,7 +1472,7 @@ void upd765_family_device::execute_command(int cmd)
void upd765_family_device::command_end(floppy_info &fi, bool data_completion)
{
- LOGCOMMAND("command done (%s) - %s\n", data_completion ? "data" : "seek", results());
+ LOGDONE("command done (%s) - %s\n", data_completion ? "data" : "seek", results());
fi.main_state = fi.sub_state = IDLE;
if(data_completion)
data_irq = true;
@@ -1746,7 +1744,16 @@ void upd765_family_device::read_data_continue(floppy_info &fi)
fi.sub_state = COMMAND_DONE;
break;
}
+ // MZ: This st1 handling ensures that both HX5102 floppy and the
+ // Speedlock protection scheme are properly working.
+ // a) HX5102 requires that the ND flag not be set when no address
+ // marks could be found on the track at all (particularly due to
+ // wrong density)
+ // b) Speedlock requires the ND flag be set when there are valid
+ // sectors on the track, but the desired sector is missing, also
+ // when it has no valid address marks
st1 &= ~ST1_MA;
+ st1 |= ST1_ND;
if(!sector_matches()) {
if(cur_live.idbuf[0] != command[2]) {
if(cur_live.idbuf[0] == 0xff)
@@ -1758,6 +1765,7 @@ void upd765_family_device::read_data_continue(floppy_info &fi)
live_start(fi, SEARCH_ADDRESS_MARK_HEADER);
return;
}
+ st1 &= ~ST1_ND;
LOGRW("reading sector %02x %02x %02x %02x\n",
cur_live.idbuf[0],
cur_live.idbuf[1],
@@ -1776,11 +1784,6 @@ void upd765_family_device::read_data_continue(floppy_info &fi)
case SCAN_ID_FAILED:
LOGSTATE("SCAN_ID_FAILED\n");
fi.st0 |= ST0_FAIL;
- // MZ: The HX5102 does not correctly detect a FM/MFM mismatch
- // when the ND bit is set, because in the firmware the ND bit wins
- // against MA, and thus concludes that the format is correct
- // but the sector is missing.
- // st1 |= ST1_ND;
fi.sub_state = COMMAND_DONE;
break;
@@ -1852,7 +1855,7 @@ void upd765_family_device::write_data_start(floppy_info &fi)
fi.main_state = WRITE_DATA;
fi.sub_state = HEAD_LOAD;
mfm = command[0] & 0x40;
- LOGRW("command write%s data%s%s cmd=%02x sel=%x chrn=(%d, %d, %d, %d) eot=%02x gpl=%02x dtl=%02x rate=%d\n",
+ LOGCOMMAND("command write%s data%s%s cmd=%02x sel=%x chrn=(%d, %d, %d, %d) eot=%02x gpl=%02x dtl=%02x rate=%d\n",
command[0] & 0x08 ? " deleted" : "",
command[0] & 0x80 ? " mt" : "",
command[0] & 0x40 ? " mfm" : "",
@@ -1920,6 +1923,11 @@ void upd765_family_device::write_data_continue(floppy_info &fi)
break;
}
st1 &= ~ST1_MA;
+ LOGRW("writing sector %02x %02x %02x %02x\n",
+ cur_live.idbuf[0],
+ cur_live.idbuf[1],
+ cur_live.idbuf[2],
+ cur_live.idbuf[3]);
sector_size = calc_sector_size(cur_live.idbuf[3]);
fifo_expect(sector_size, true);
fi.sub_state = SECTOR_WRITTEN;
@@ -1992,7 +2000,7 @@ void upd765_family_device::read_track_start(floppy_info &fi)
mfm = command[0] & 0x40;
sectors_read = 0;
- LOGRW("command read track%s cmd=%02x sel=%x chrn=(%d, %d, %d, %d) eot=%02x gpl=%02x dtl=%02x rate=%d\n",
+ LOGCOMMAND("command read track%s cmd=%02x sel=%x chrn=(%d, %d, %d, %d) eot=%02x gpl=%02x dtl=%02x rate=%d\n",
command[0] & 0x40 ? " mfm" : "",
command[0],
command[1],
@@ -2284,6 +2292,9 @@ void upd765_family_device::read_id_start(floppy_info &fi)
return;
}
+ for(int i=0; i<4; i++)
+ cur_live.idbuf[i] = command[i+2];
+
read_id_continue(fi);
}
@@ -2316,8 +2327,7 @@ void upd765_family_device::read_id_continue(floppy_info &fi)
case SCAN_ID_FAILED:
LOGSTATE("SCAN_ID_FAILED\n");
fi.st0 |= ST0_FAIL;
- // st1 |= ST1_ND|ST1_MA;
- st1 = ST1_MA;
+ st1 |= ST1_ND|ST1_MA;
fi.sub_state = COMMAND_DONE;
break;
@@ -2443,6 +2453,7 @@ void upd765_family_device::index_callback(floppy_image_device *floppy, int state
if(fi.live)
live_sync();
fi.index = state;
+ idx_cb(state);
if(!state) {
general_continue(fi);
@@ -2955,7 +2966,7 @@ void mcs3201_device::device_start()
m_input_handler.resolve_safe(0);
}
-READ8_MEMBER( mcs3201_device::input_r )
+uint8_t mcs3201_device::input_r()
{
return m_input_handler();
}
@@ -2975,7 +2986,7 @@ void tc8566af_device::device_start()
save_item(NAME(m_cr1));
}
-WRITE8_MEMBER(tc8566af_device::cr1_w)
+void tc8566af_device::cr1_w(uint8_t data)
{
m_cr1 = data;
@@ -2985,7 +2996,7 @@ WRITE8_MEMBER(tc8566af_device::cr1_w)
}
}
-WRITE8_MEMBER(upd72065_device::auxcmd_w)
+void upd72065_device::auxcmd_w(uint8_t data)
{
switch(data) {
case 0x36: // reset
diff --git a/src/devices/machine/upd765.h b/src/devices/machine/upd765.h
index dd2e30ce78a..0a40e4f4b53 100644
--- a/src/devices/machine/upd765.h
+++ b/src/devices/machine/upd765.h
@@ -45,34 +45,29 @@ public:
auto intrq_wr_callback() { return intrq_cb.bind(); }
auto drq_wr_callback() { return drq_cb.bind(); }
auto hdl_wr_callback() { return hdl_cb.bind(); }
+ auto us_wr_callback() { return us_cb.bind(); }
+ auto idx_wr_callback() { return idx_cb.bind(); }
virtual void map(address_map &map) override = 0;
- DECLARE_READ8_MEMBER (sra_r);
- DECLARE_READ8_MEMBER (srb_r);
- DECLARE_READ8_MEMBER (dor_r);
- DECLARE_WRITE8_MEMBER(dor_w);
- DECLARE_READ8_MEMBER (tdr_r);
- DECLARE_WRITE8_MEMBER(tdr_w);
- uint8_t read_msr();
- DECLARE_READ8_MEMBER (msr_r);
- DECLARE_WRITE8_MEMBER(dsr_w);
- uint8_t read_fifo();
- void write_fifo(uint8_t data);
- DECLARE_READ8_MEMBER (fifo_r) { return read_fifo(); }
- DECLARE_WRITE8_MEMBER(fifo_w) { write_fifo(data); }
- DECLARE_READ8_MEMBER (dir_r);
- DECLARE_WRITE8_MEMBER(ccr_w);
+ uint8_t sra_r();
+ uint8_t srb_r();
+ uint8_t dor_r();
+ void dor_w(uint8_t data);
+ uint8_t tdr_r();
+ void tdr_w(uint8_t data);
+ uint8_t msr_r();
+ void dsr_w(uint8_t data);
+ uint8_t fifo_r();
+ void fifo_w(uint8_t data);
+ uint8_t dir_r() { return do_dir_r(); }
+ void ccr_w(uint8_t data);
virtual uint8_t do_dir_r() override;
uint8_t dma_r() override;
void dma_w(uint8_t data) override;
- // Same as the previous ones, but as memory-mappable members
- DECLARE_READ8_MEMBER(mdma_r);
- DECLARE_WRITE8_MEMBER(mdma_w);
-
bool get_irq() const;
bool get_drq() const;
void tc_w(bool val) override;
@@ -91,6 +86,7 @@ public:
protected:
upd765_family_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock);
+ virtual void device_resolve_objects() override;
virtual void device_start() override;
virtual void device_reset() override;
virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override;
@@ -269,7 +265,8 @@ protected:
int main_phase;
live_info cur_live, checkpoint_live;
- devcb_write_line intrq_cb, drq_cb, hdl_cb;
+ devcb_write_line intrq_cb, drq_cb, hdl_cb, idx_cb;
+ devcb_write8 us_cb;
bool cur_irq, other_irq, data_irq, drq, internal_drq, tc, tc_done, locked, mfm, scan_done;
floppy_info flopi[4];
@@ -473,7 +470,7 @@ public:
upd72065_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
virtual void map(address_map &map) override;
- DECLARE_WRITE8_MEMBER(auxcmd_w);
+ void auxcmd_w(uint8_t data);
};
class n82077aa_device : public upd765_family_device {
@@ -524,7 +521,7 @@ public:
auto input_handler() { return m_input_handler.bind(); }
virtual void map(address_map &map) override;
- DECLARE_READ8_MEMBER( input_r );
+ uint8_t input_r();
protected:
virtual void device_start() override;
@@ -539,7 +536,7 @@ public:
virtual void map(address_map &map) override;
- DECLARE_WRITE8_MEMBER(cr1_w);
+ void cr1_w(uint8_t data);
protected:
virtual void device_start() override;
diff --git a/src/devices/machine/wd1010.cpp b/src/devices/machine/wd1010.cpp
new file mode 100644
index 00000000000..16442934352
--- /dev/null
+++ b/src/devices/machine/wd1010.cpp
@@ -0,0 +1,583 @@
+// license:GPL-2.0+
+// copyright-holders:Dirk Best
+/***************************************************************************
+
+ Western Digital WD1010-05 Winchester Disk Controller
+
+***************************************************************************/
+
+#include "emu.h"
+#include "wd1010.h"
+
+//#define LOG_GENERAL (1U << 0)
+#define LOG_CMD (1U << 1)
+#define LOG_INT (1U << 2)
+#define LOG_SEEK (1U << 3)
+#define LOG_REGS (1U << 4)
+#define LOG_DATA (1U << 5)
+
+//#define VERBOSE (LOG_CMD | LOG_INT | LOG_SEEK | LOG_REGS | LOG_DATA)
+//#define LOG_OUTPUT_STREAM std::cout
+
+#include "logmacro.h"
+
+#define LOGCMD(...) LOGMASKED(LOG_CMD, __VA_ARGS__)
+#define LOGINT(...) LOGMASKED(LOG_INT, __VA_ARGS__)
+#define LOGSEEK(...) LOGMASKED(LOG_SEEK, __VA_ARGS__)
+#define LOGREGS(...) LOGMASKED(LOG_REGS, __VA_ARGS__)
+#define LOGDATA(...) LOGMASKED(LOG_DATA, __VA_ARGS__)
+
+
+//**************************************************************************
+// DEVICE DEFINITIONS
+//**************************************************************************
+
+DEFINE_DEVICE_TYPE(WD1010, wd1010_device, "wd1010", "Western Digital WD1010-05")
+
+
+//**************************************************************************
+// LIVE DEVICE
+//**************************************************************************
+
+//-------------------------------------------------
+// wd1010_device - constructor
+//-------------------------------------------------
+
+wd1010_device::wd1010_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) :
+ device_t(mconfig, WD1010, tag, owner, clock),
+ m_out_intrq_cb(*this),
+ m_out_bcr_cb(*this),
+ m_in_data_cb(*this),
+ m_out_data_cb(*this),
+ m_intrq(0),
+ m_brdy(0),
+ m_stepping_rate(0x00),
+ m_command(0x00),
+ m_error(0x00),
+ m_precomp(0x00),
+ m_sector_count(0x00),
+ m_sector_number(0x00),
+ m_cylinder(0x0000),
+ m_sdh(0x00),
+ m_status(0x00)
+{
+}
+
+//-------------------------------------------------
+// device_start - device-specific startup
+//-------------------------------------------------
+
+void wd1010_device::device_start()
+{
+ // get connected drives
+ for (int i = 0; i < 4; i++)
+ {
+ char name[2];
+ name[0] = '0' + i;
+ name[1] = 0;
+ m_drives[i].drive = subdevice<harddisk_image_device>(name);
+ m_drives[i].head = 0;
+ m_drives[i].cylinder = 0;
+ m_drives[i].sector = 0;
+ }
+
+ // resolve callbacks
+ m_out_intrq_cb.resolve_safe();
+ m_out_bcr_cb.resolve_safe();
+ m_in_data_cb.resolve_safe(0);
+ m_out_data_cb.resolve_safe();
+
+ // allocate timer
+ m_seek_timer = timer_alloc(TIMER_SEEK);
+ m_data_timer = timer_alloc(TIMER_DATA);
+
+ // register for save states
+ save_item(NAME(m_intrq));
+ save_item(NAME(m_brdy));
+ save_item(NAME(m_stepping_rate));
+ save_item(NAME(m_command));
+ save_item(NAME(m_error));
+ save_item(NAME(m_precomp));
+ save_item(NAME(m_sector_count));
+ save_item(NAME(m_sector_number));
+ save_item(NAME(m_cylinder));
+ save_item(NAME(m_sdh));
+ save_item(NAME(m_status));
+}
+
+//-------------------------------------------------
+// device_reset - device-specific reset
+//-------------------------------------------------
+
+void wd1010_device::device_reset()
+{
+}
+
+//-------------------------------------------------
+// device_timer - device-specific timer
+//-------------------------------------------------
+
+void wd1010_device::device_timer(emu_timer &timer, device_timer_id tid, int param, void *ptr)
+{
+ switch (tid)
+ {
+ case TIMER_SEEK:
+
+ if ((m_command >> 4) != CMD_SCAN_ID)
+ {
+ LOGSEEK("Seek complete\n");
+ m_drives[drive()].cylinder = param;
+ m_status |= STATUS_SC;
+ }
+
+ switch (m_command >> 4)
+ {
+ case CMD_RESTORE:
+ cmd_restore();
+ break;
+
+ case CMD_SEEK:
+ cmd_seek();
+ break;
+
+ case CMD_READ_SECTOR:
+ cmd_read_sector();
+ break;
+
+ case CMD_WRITE_SECTOR:
+ case CMD_WRITE_FORMAT:
+ cmd_write_sector();
+ break;
+
+ case CMD_SCAN_ID:
+ cmd_scan_id();
+ break;
+ }
+
+ break;
+
+ case TIMER_DATA:
+
+ // check if data is ready or continue waiting
+ if (m_brdy)
+ cmd_write_sector();
+ else
+ m_data_timer->adjust(attotime::from_usec(35));
+
+ break;
+ }
+}
+
+//-------------------------------------------------
+// set_error - set error and adjust status
+//-------------------------------------------------
+
+void wd1010_device::set_error(int error)
+{
+ if (error)
+ {
+ m_error |= error;
+ m_status |= STATUS_ERR;
+ }
+ else
+ {
+ m_error = 0;
+ m_status &= ~STATUS_ERR;
+ }
+}
+
+//-------------------------------------------------
+// set_intrq - set interrupt status
+//-------------------------------------------------
+
+void wd1010_device::set_intrq(int state)
+{
+ if (m_intrq == 0 && state == 1)
+ {
+ LOGINT("INT 1\n");
+ m_intrq = 1;
+ m_out_intrq_cb(1);
+ }
+ else if (m_intrq == 1 && state == 0)
+ {
+ LOGINT("INT 0\n");
+ m_intrq = 0;
+ m_out_intrq_cb(0);
+ }
+}
+
+//-------------------------------------------------
+// get_stepping_rate - calculate stepping rate
+//-------------------------------------------------
+
+attotime wd1010_device::get_stepping_rate()
+{
+ if (m_stepping_rate)
+ return attotime::from_usec(500 * m_stepping_rate);
+ else
+ return attotime::from_usec(35);
+}
+
+//-------------------------------------------------
+// start_command - executed at the start of every command
+//-------------------------------------------------
+
+void wd1010_device::start_command()
+{
+ // now busy and command in progress, clear error
+ m_status |= STATUS_BSY;
+ m_status |= STATUS_CIP;
+ set_error(0);
+
+ switch (m_command >> 4)
+ {
+ case CMD_RESTORE:
+ m_stepping_rate = m_command & 0x0f;
+ LOGCMD("RESTORE\n");
+ break;
+ case CMD_READ_SECTOR:
+ LOGCMD("READ SECTOR\n");
+ break;
+ case CMD_WRITE_SECTOR:
+ LOGCMD("WRITE SECTOR\n");
+ break;
+ case CMD_SCAN_ID:
+ LOGCMD("SCAN ID\n");
+ break;
+ case CMD_WRITE_FORMAT:
+ LOGCMD("WRITE FORMAT ID\n");
+ break;
+ case CMD_SEEK:
+ m_stepping_rate = m_command & 0x0f;
+ LOGCMD("SEEK\n");
+ break;
+ }
+}
+
+//-------------------------------------------------
+// end_command - executed at end of every command
+//-------------------------------------------------
+
+void wd1010_device::end_command()
+{
+ m_out_bcr_cb(1);
+ m_out_bcr_cb(0);
+
+ m_status &= ~(STATUS_BSY | STATUS_CIP);
+
+ set_intrq(1);
+}
+
+//-------------------------------------------------
+// get_lbasector - translate to lba
+//-------------------------------------------------
+
+int wd1010_device::get_lbasector()
+{
+ hard_disk_file *file = m_drives[drive()].drive->get_hard_disk_file();
+ hard_disk_info *info = hard_disk_get_info(file);
+ int lbasector;
+
+ lbasector = m_cylinder;
+ lbasector *= info->heads;
+ lbasector += head();
+ lbasector *= info->sectors;
+ lbasector += m_sector_number;
+
+ return lbasector;
+}
+
+
+//**************************************************************************
+// INTERFACE
+//**************************************************************************
+
+WRITE_LINE_MEMBER( wd1010_device::drdy_w )
+{
+ if (state)
+ m_status |= STATUS_RDY;
+ else
+ m_status &= ~STATUS_RDY;
+}
+
+WRITE_LINE_MEMBER( wd1010_device::brdy_w )
+{
+ m_brdy = state;
+}
+
+READ8_MEMBER( wd1010_device::read )
+{
+ // if the controller is busy all reads return the status register
+ if (m_status & STATUS_BSY)
+ {
+ LOG("Read while busy, return STATUS: %02x\n", m_status);
+ return m_status;
+ }
+
+ switch (offset & 0x07)
+ {
+ case 0:
+ LOGREGS("RD INVALID\n");
+ return 0;
+
+ case 1:
+ LOGREGS("RD ERROR: %02x\n", m_error);
+ return m_error;
+
+ case 2:
+ LOGREGS("RD SECTOR COUNT: %02x\n", m_sector_count);
+ return m_sector_count;
+
+ case 3:
+ LOGREGS("RD SECTOR NUMBER: %02x\n", m_sector_number);
+ return m_sector_number;
+
+ case 4:
+ LOGREGS("RD CYLINDER L: %02x\n", m_cylinder & 0xff);
+ return m_cylinder & 0xff;
+
+ case 5:
+ LOGREGS("RD CYLINDER H: %02x\n", m_cylinder >> 8);
+ return m_cylinder >> 8;
+
+ case 6:
+ LOGREGS("RD SDH: %02x\n", m_sdh);
+ return m_sdh;
+
+ case 7:
+ LOGREGS("RD STATUS: %02x\n", m_status);
+
+ // reading the status register clears the interrupt
+ set_intrq(0);
+
+ return m_status;
+ }
+
+ // should never get here
+ return 0xff;
+}
+
+WRITE8_MEMBER( wd1010_device::write )
+{
+ switch (offset & 0x07)
+ {
+ case 0:
+ LOGREGS("WR INVALID: %02x\n", data);
+ break;
+
+ case 1:
+ LOGREGS("WR PRECOMP: %02x\n", data);
+ m_precomp = data;
+ break;
+
+ case 2:
+ LOGREGS("WR SECTOR COUNT: %02x\n", data);
+ m_sector_count = data;
+ break;
+
+ case 3:
+ LOGREGS("WR SECTOR NUMBER: %02x\n", data);
+ m_sector_number = data;
+ break;
+
+ case 4:
+ LOGREGS("WR CYLINDER L: %02x\n", data);
+ m_cylinder = (m_cylinder & 0xff00) | (data << 0);
+ break;
+
+ case 5:
+ LOGREGS("WR CYLINDER H: %02x\n", data);
+ m_cylinder = (m_cylinder & 0x00ff) | (data << 8);
+ break;
+
+ case 6:
+ LOGREGS("WR SDH: %02x\n", data);
+ m_sdh = data;
+ break;
+
+ case 7:
+ // writes to the command register are ignored when a command is in progress
+ if (m_status & STATUS_CIP)
+ return;
+
+ // writing the command register clears the interrupt
+ set_intrq(0);
+
+ // check drive status
+ if (!(m_status & STATUS_RDY))
+ {
+ // selected drive not ready
+ LOG("--> Drive not ready, aborting\n");
+
+ set_error(ERR_AC);
+ end_command();
+ }
+ else
+ {
+ m_command = data;
+
+ start_command();
+
+ // all other command imply a seek
+ if ((m_command >> 4) != CMD_SCAN_ID)
+ m_status &= ~STATUS_SC;
+
+ int amount = 0;
+ int target = 0;
+
+ switch (m_command >> 4)
+ {
+ case CMD_RESTORE:
+ amount = m_drives[drive()].cylinder;
+ target = 0;
+ break;
+
+ case CMD_SEEK:
+ case CMD_READ_SECTOR:
+ case CMD_WRITE_SECTOR:
+ case CMD_WRITE_FORMAT:
+ amount = abs(m_drives[drive()].cylinder - m_cylinder);
+ target = m_cylinder;
+ break;
+ }
+
+ if ((m_command >> 4) != CMD_SCAN_ID)
+ LOGSEEK("Seeking %d cylinders to %d\n", amount, target);
+
+ m_seek_timer->adjust(get_stepping_rate() * amount, target);
+ }
+
+ break;
+ }
+}
+
+
+//**************************************************************************
+// IMPLEMENTATION
+//**************************************************************************
+
+void wd1010_device::cmd_restore()
+{
+ LOGCMD("--> RESTORE done\n");
+ end_command();
+}
+
+void wd1010_device::cmd_read_sector()
+{
+ hard_disk_file *file = m_drives[drive()].drive->get_hard_disk_file();
+ hard_disk_info *info = hard_disk_get_info(file);
+
+ m_out_bcr_cb(1);
+ m_out_bcr_cb(0);
+
+ // verify that we can read
+ if (head() > info->heads)
+ {
+ // out of range
+ LOG("--> Head out of range, aborting\n");
+
+ set_error(ERR_AC);
+ end_command();
+ }
+ else
+ {
+ uint8_t buffer[512];
+
+ while (m_sector_count > 0)
+ {
+ LOGDATA("--> Transferring sector to buffer (lba = %08x)\n", get_lbasector());
+
+ hard_disk_read(file, get_lbasector(), buffer);
+
+ for (int i = 0; i < 512; i++)
+ m_out_data_cb(buffer[i]);
+
+ m_out_bcr_cb(1);
+ m_out_bcr_cb(0);
+
+ // save last read head and sector number
+ m_drives[drive()].head = head();
+ m_drives[drive()].sector = m_sector_number;
+
+ if (BIT(m_command, 2))
+ {
+ m_sector_number++;
+ m_sector_count--;
+ }
+ else
+ break;
+ }
+
+ end_command();
+ }
+}
+
+void wd1010_device::cmd_write_sector()
+{
+ if (!(m_status & STATUS_DRQ))
+ {
+ LOGDATA("Setting DATA REQUEST\n");
+ m_status |= STATUS_DRQ;
+ m_data_timer->adjust(attotime::from_usec(35));
+ return;
+ }
+
+ if (m_brdy == 0)
+ {
+ m_data_timer->adjust(attotime::from_usec(35));
+ return;
+ }
+
+ LOGDATA("Clearing DATA REQUEST\n");
+ m_status &= ~STATUS_DRQ;
+
+ hard_disk_file *file = m_drives[drive()].drive->get_hard_disk_file();
+ uint8_t buffer[512];
+
+ while (m_sector_count > 0)
+ {
+ if ((m_command >> 4) == CMD_WRITE_FORMAT)
+ {
+ // we ignore the format specification and fill everything with 0xe5
+ std::fill(std::begin(buffer), std::end(buffer), 0xe5);
+ }
+ else
+ {
+ // get data for sector from buffer chip
+ for (int i = 0; i < 512; i++)
+ buffer[i] = m_in_data_cb();
+ }
+
+ hard_disk_write(file, get_lbasector(), buffer);
+
+ // save last read head and sector number
+ m_drives[drive()].head = head();
+ m_drives[drive()].sector = m_sector_number;
+
+ if (BIT(m_command, 2))
+ {
+ m_sector_number++;
+ m_sector_count--;
+ }
+ else
+ break;
+ }
+
+ end_command();
+}
+
+void wd1010_device::cmd_scan_id()
+{
+ // update head, sector size, sector number and cylinder
+ m_sdh = (m_sdh & 0xf8) | (m_drives[drive()].head & 0x07);
+ m_sector_number = m_drives[drive()].sector;
+ m_cylinder = m_drives[drive()].cylinder;
+
+ end_command();
+}
+
+void wd1010_device::cmd_seek()
+{
+ LOGCMD("--> SEEK done\n");
+ end_command();
+}
diff --git a/src/devices/machine/wd1010.h b/src/devices/machine/wd1010.h
new file mode 100644
index 00000000000..b5db9975693
--- /dev/null
+++ b/src/devices/machine/wd1010.h
@@ -0,0 +1,143 @@
+// license:GPL-2.0+
+// copyright-holders:Dirk Best
+/***************************************************************************
+
+ Western Digital WD1010-05 Winchester Disk Controller
+
+***************************************************************************/
+
+#ifndef MAME_MACHINE_WD1010_H
+#define MAME_MACHINE_WD1010_H
+
+#pragma once
+
+#include "imagedev/harddriv.h"
+
+
+//**************************************************************************
+// TYPE DEFINITIONS
+//**************************************************************************
+
+// ======================> wd1010_device
+
+class wd1010_device : public device_t
+{
+public:
+ // construction/destruction
+ wd1010_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+
+ auto out_intrq_callback() { return m_out_intrq_cb.bind(); }
+ auto out_bcr_callback() { return m_out_bcr_cb.bind(); }
+ auto in_data_callback() { return m_in_data_cb.bind(); }
+ auto out_data_callback() { return m_out_data_cb.bind(); }
+
+ DECLARE_READ8_MEMBER(read);
+ DECLARE_WRITE8_MEMBER(write);
+
+ DECLARE_WRITE_LINE_MEMBER(drdy_w);
+ DECLARE_WRITE_LINE_MEMBER(brdy_w);
+
+protected:
+ // device-level overrides
+ virtual void device_start() override;
+ virtual void device_reset() override;
+ virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override;
+
+private:
+ enum
+ {
+ STATUS_ERR = 0x01, // error
+ STATUS_CIP = 0x02, // command in progress
+ STATUS_RSV = 0x04, // reserved
+ STATUS_DRQ = 0x08, // data request
+ STATUS_SC = 0x10, // seek complete
+ STATUS_WF = 0x20, // write fault
+ STATUS_RDY = 0x40, // drive ready
+ STATUS_BSY = 0x80 // controller busy
+ };
+
+ enum
+ {
+ ERR_DM = 0x01, // data address mark not found
+ ERR_TK = 0x02, // track zero error
+ ERR_AC = 0x04, // aborted command
+ ERR_RSV1 = 0x08, // reserved, forced to 0
+ ERR_ID = 0x10, // id not found
+ ERR_RSV2 = 0x20, // reserved, forced to 0
+ ERR_CRC = 0x40, // crc error
+ ERR_BB = 0x80 // bad block
+ };
+
+ enum
+ {
+ CMD_RESTORE = 1,
+ CMD_READ_SECTOR = 2,
+ CMD_WRITE_SECTOR = 3,
+ CMD_SCAN_ID = 4,
+ CMD_WRITE_FORMAT = 5,
+ CMD_SEEK = 7
+ };
+
+ enum
+ {
+ TIMER_SEEK,
+ TIMER_DATA
+ };
+
+ void set_error(int error);
+ void set_intrq(int state);
+ attotime get_stepping_rate();
+ void start_command();
+ void end_command();
+ int get_lbasector();
+
+ // extract values from sdh
+ int head() { return (m_sdh >> 0) & 0x07; }
+ int drive() { return (m_sdh >> 3) & 0x03; }
+ int sector_size()
+ {
+ const int S[4] = { 256, 512, 1024, 128 };
+ return S[(m_sdh >> 5) & 0x03];
+ }
+
+ void cmd_restore();
+ void cmd_read_sector();
+ void cmd_write_sector();
+ void cmd_scan_id();
+ void cmd_seek();
+
+ devcb_write_line m_out_intrq_cb;
+ devcb_write_line m_out_bcr_cb;
+ devcb_read8 m_in_data_cb;
+ devcb_write8 m_out_data_cb;
+
+ struct
+ {
+ harddisk_image_device *drive;
+ uint8_t head;
+ uint16_t cylinder;
+ uint8_t sector;
+ } m_drives[4];
+
+ emu_timer *m_seek_timer;
+ emu_timer *m_data_timer;
+
+ int m_intrq;
+ int m_brdy;
+ uint8_t m_stepping_rate;
+ uint8_t m_command;
+
+ // task file registers
+ uint8_t m_error;
+ uint8_t m_precomp;
+ uint8_t m_sector_count;
+ uint8_t m_sector_number;
+ uint16_t m_cylinder;
+ uint8_t m_sdh;
+ uint8_t m_status;
+};
+
+// device type definition
+DECLARE_DEVICE_TYPE(WD1010, wd1010_device)
+
+#endif // MAME_MACHINE_WD1010_H
diff --git a/src/devices/machine/wd11c00_17.cpp b/src/devices/machine/wd11c00_17.cpp
index 499601c943f..b0d58034f6d 100644
--- a/src/devices/machine/wd11c00_17.cpp
+++ b/src/devices/machine/wd11c00_17.cpp
@@ -301,6 +301,15 @@ WRITE8_MEMBER( wd11c00_17_device::io_w )
//-------------------------------------------------
+// dack3_w -
+//-------------------------------------------------
+
+WRITE_LINE_MEMBER(wd11c00_17_device::dack3_w)
+{
+}
+
+
+//-------------------------------------------------
// dack_r -
//-------------------------------------------------
diff --git a/src/devices/machine/wd11c00_17.h b/src/devices/machine/wd11c00_17.h
index e109c548202..0b375f61e67 100644
--- a/src/devices/machine/wd11c00_17.h
+++ b/src/devices/machine/wd11c00_17.h
@@ -39,6 +39,7 @@ public:
DECLARE_READ8_MEMBER( io_r );
DECLARE_WRITE8_MEMBER( io_w );
+ DECLARE_WRITE_LINE_MEMBER( dack3_w );
uint8_t dack_r();
void dack_w(uint8_t data);
diff --git a/src/devices/machine/wd2010.cpp b/src/devices/machine/wd2010.cpp
index c25aa538df3..95bb4803107 100644
--- a/src/devices/machine/wd2010.cpp
+++ b/src/devices/machine/wd2010.cpp
@@ -28,11 +28,11 @@ UNIMPLEMENTED FEATURES :
the intended instruction flow. Some loops were omitted!
USAGE: tie WF (write fault) to ground if not needed:
- MCFG_WD2010_IN_WF_CB(GND)
+ in_wf_callback().set_constant(0)
Other signals should be set to VCC if not serviced:
- MCFG_WD2010_IN_DRDY_CB(VCC) // DRIVE READY = VCC
- MCFG_WD2010_IN_SC_CB(VCC) // SEEK COMPLETE = VCC
+ in_drdy_callback().set_constant(1) // DRIVE READY = VCC
+ in_sc_callback().set_constant(1) // SEEK COMPLETE = VCC
**********************************************************************/
#include "emu.h"
@@ -233,7 +233,7 @@ void wd2010_device::device_reset()
// read -
//-------------------------------------------------
-READ8_MEMBER(wd2010_device::read)
+uint8_t wd2010_device::read(offs_t offset)
{
uint8_t data;
@@ -273,7 +273,7 @@ READ8_MEMBER(wd2010_device::read)
// write -
//-------------------------------------------------
-WRITE8_MEMBER(wd2010_device::write)
+void wd2010_device::write(offs_t offset, uint8_t data)
{
m_task_file[offset] = data;
diff --git a/src/devices/machine/wd2010.h b/src/devices/machine/wd2010.h
index fdfc2c4462c..1617f886ed6 100644
--- a/src/devices/machine/wd2010.h
+++ b/src/devices/machine/wd2010.h
@@ -40,8 +40,8 @@ public:
auto in_tk000_callback() { return m_in_tk000_cb.bind(); }
auto in_sc_callback() { return m_in_sc_cb.bind(); }
- DECLARE_READ8_MEMBER( read );
- DECLARE_WRITE8_MEMBER( write );
+ uint8_t read(offs_t offset);
+ void write(offs_t offset, uint8_t data);
void buffer_ready(bool state);
diff --git a/src/devices/machine/wd33c93.cpp b/src/devices/machine/wd33c93.cpp
deleted file mode 100644
index fcbb45957af..00000000000
--- a/src/devices/machine/wd33c93.cpp
+++ /dev/null
@@ -1,984 +0,0 @@
-// license:BSD-3-Clause
-// copyright-holders:ElSemi, R. Belmont, Ryan Holtz
-/*
- * wd33c93.c
- *
- * WD/AMD 33c93 SCSI controller, as seen in
- * early PCs, some MSX add-ons, NEC PC-88, and SGI
- * Indigo, Indigo2, and Indy systems.
- *
- * References:
- * WD 33c93 manual
- * NetBSD 33c93 driver
- *
- */
-
-#include "emu.h"
-#include "wd33c93.h"
-
-#define LOG_READS (1 << 0)
-#define LOG_WRITES (1 << 1)
-#define LOG_COMMANDS (1 << 2)
-#define LOG_ERRORS (1 << 3)
-#define LOG_MISC (1 << 4)
-#define LOG_REGS (LOG_READS | LOG_WRITES)
-#define LOG_ALL (LOG_REGS | LOG_COMMANDS | LOG_ERRORS | LOG_MISC)
-
-#define VERBOSE (0)
-#include "logmacro.h"
-
-
-/* WD commands */
-#define WD_CMD_RESET 0x00
-#define WD_CMD_ABORT 0x01
-#define WD_CMD_ASSERT_ATN 0x02
-#define WD_CMD_NEGATE_ACK 0x03
-#define WD_CMD_DISCONNECT 0x04
-#define WD_CMD_RESELECT 0x05
-#define WD_CMD_SEL_ATN 0x06
-#define WD_CMD_SEL 0x07
-#define WD_CMD_SEL_ATN_XFER 0x08
-#define WD_CMD_SEL_XFER 0x09
-#define WD_CMD_RESEL_RECEIVE 0x0a
-#define WD_CMD_RESEL_SEND 0x0b
-#define WD_CMD_WAIT_SEL_RECEIVE 0x0c
-#define WD_CMD_SSCC 0x0d
-#define WD_CMD_SND_DISC 0x0e
-#define WD_CMD_SET_IDI 0x0f
-#define WD_CMD_RCV_CMD 0x10
-#define WD_CMD_RCV_DATA 0x11
-#define WD_CMD_RCV_MSG_OUT 0x12
-#define WD_CMD_RCV 0x13
-#define WD_CMD_SND_STATUS 0x14
-#define WD_CMD_SND_DATA 0x15
-#define WD_CMD_SND_MSG_IN 0x16
-#define WD_CMD_SND 0x17
-#define WD_CMD_TRANS_ADDR 0x18
-#define WD_CMD_XFER_PAD 0x19
-#define WD_CMD_TRANS_INFO 0x20
-#define WD_CMD_TRANSFER_PAD 0x21
-#define WD_CMD_SBT_MODE 0x80
-
-/* ASR register */
-#define ASR_INT 0x80
-#define ASR_LCI 0x40
-#define ASR_BSY 0x20
-#define ASR_CIP 0x10
-#define ASR_PE 0x02
-#define ASR_DBR 0x01
-
-/* SCSI Bus Phases */
-#define PHS_DATA_OUT 0x00
-#define PHS_DATA_IN 0x01
-#define PHS_COMMAND 0x02
-#define PHS_STATUS 0x03
-#define PHS_MESS_OUT 0x06
-#define PHS_MESS_IN 0x07
-
-/* Command Status Register definitions */
-
- /* reset state interrupts */
-#define CSR_RESET 0x00
-#define CSR_RESET_AF 0x01
-
- /* successful completion interrupts */
-#define CSR_RESELECT 0x10
-#define CSR_SELECT 0x11
-#define CSR_SEL_XFER_DONE 0x16
-#define CSR_XFER_DONE 0x18
-
- /* paused or aborted interrupts */
-#define CSR_MSGIN 0x20
-#define CSR_SDP 0x21
-#define CSR_SEL_ABORT 0x22
-#define CSR_RESEL_ABORT 0x25
-#define CSR_RESEL_ABORT_AM 0x27
-#define CSR_ABORT 0x28
-
- /* terminated interrupts */
-#define CSR_INVALID 0x40
-#define CSR_UNEXP_DISC 0x41
-#define CSR_TIMEOUT 0x42
-#define CSR_PARITY 0x43
-#define CSR_PARITY_ATN 0x44
-#define CSR_BAD_STATUS 0x45
-#define CSR_UNEXP 0x48
-
- /* service required interrupts */
-#define CSR_RESEL 0x80
-#define CSR_RESEL_AM 0x81
-#define CSR_DISC 0x85
-#define CSR_SRV_REQ 0x88
-
- /* Own ID/CDB Size register */
-#define OWNID_EAF 0x08
-#define OWNID_EHP 0x10
-#define OWNID_RAF 0x20
-#define OWNID_FS_8 0x00
-#define OWNID_FS_12 0x40
-#define OWNID_FS_16 0x80
-
- /* Control register */
-#define CTRL_HSP 0x01
-#define CTRL_HA 0x02
-#define CTRL_IDI 0x04
-#define CTRL_EDI 0x08
-#define CTRL_HHP 0x10
-#define CTRL_POLLED 0x00
-#define CTRL_BURST 0x20
-#define CTRL_BUS 0x40
-#define CTRL_DMA 0x80
-
- /* Synchronous Transfer Register */
-#define STR_FSS 0x80
-
- /* Destination ID register */
-#define DSTID_DPD 0x40
-#define DATA_OUT_DIR 0
-#define DATA_IN_DIR 1
-#define DSTID_SCC 0x80
-
- /* Source ID register */
-#define SRCID_MASK 0x07
-#define SRCID_SIV 0x08
-#define SRCID_DSP 0x20
-#define SRCID_ES 0x40
-#define SRCID_ER 0x80
-
-/* convernience functions */
-uint8_t wd33c93_device::getunit()
-{
- /* return the destination unit id */
- return m_regs[WD_DESTINATION_ID] & SRCID_MASK;
-}
-
-void wd33c93_device::set_xfer_count( int count )
-{
- /* set the count */
- m_regs[WD_TRANSFER_COUNT_LSB] = count & 0xff;
- m_regs[WD_TRANSFER_COUNT] = (count >> 8) & 0xff;
- m_regs[WD_TRANSFER_COUNT_MSB] = (count >> 16) & 0xff;
-}
-
-int wd33c93_device::get_xfer_count()
-{
- /* get the count */
- int count = m_regs[WD_TRANSFER_COUNT_MSB];
-
- count <<= 8;
- count |= m_regs[WD_TRANSFER_COUNT];
- count <<= 8;
- count |= m_regs[WD_TRANSFER_COUNT_LSB];
-
- return count;
-}
-
-void wd33c93_device::complete_immediate(int status)
-{
- /* reset our timer */
- m_cmd_timer->reset();
-
- /* set the new status */
- m_regs[WD_SCSI_STATUS] = status & 0xff;
-
- /* set interrupt pending */
- m_regs[WD_AUXILIARY_STATUS] |= ASR_INT;
-
- /* check for error conditions */
- if (get_xfer_count() > 0)
- {
- /* set data buffer ready */
- m_regs[WD_AUXILIARY_STATUS] |= ASR_DBR;
- }
- else
- {
- /* clear data buffer ready */
- m_regs[WD_AUXILIARY_STATUS] &= ~ASR_DBR;
- }
-
- /* clear command in progress and bus busy */
- m_regs[WD_AUXILIARY_STATUS] &= ~(ASR_CIP | ASR_BSY);
-
- /* if we have a callback, call it */
- if (!m_irq_cb.isnull())
- {
- m_irq_cb(1);
- }
-}
-
-void wd33c93_device::device_timer(emu_timer &timer, device_timer_id tid, int param, void *ptr)
-{
- switch (tid)
- {
- case 0:
- complete_immediate(param);
- break;
-
- case 1:
- complete_immediate(CSR_SRV_REQ | m_busphase);
- break;
-
- case 2:
- m_regs[WD_AUXILIARY_STATUS] &= ~ASR_CIP;
- break;
- }
-}
-
-void wd33c93_device::complete_cmd(uint8_t status)
-{
- /* fire off a timer to complete the command */
- m_cmd_timer->adjust(attotime::from_usec(1), status);
-}
-
-/* command handlers */
-void wd33c93_device::unimplemented_cmd()
-{
- LOGMASKED(LOG_COMMANDS | LOG_ERRORS, "%s: Unimplemented SCSI controller command: %02x\n", machine().describe_context(), m_regs[WD_COMMAND]);
-
- /* complete the command */
- complete_cmd(CSR_INVALID);
-}
-
-void wd33c93_device::invalid_cmd()
-{
- LOGMASKED(LOG_COMMANDS | LOG_ERRORS, "%s: Invalid SCSI controller command: %02x\n", machine().describe_context(), m_regs[WD_COMMAND]);
-
- /* complete the command */
- complete_cmd(CSR_INVALID);
-}
-
-void wd33c93_device::reset_cmd()
-{
- int advanced = 0;
-
- /* see if it wants us to reset with advanced features */
- if (m_regs[WD_OWN_ID] & OWNID_EAF)
- {
- advanced = 1;
- }
-
- /* clear out all registers */
- memset(m_regs, 0, sizeof(m_regs));
-
- /* complete the command */
- complete_cmd(advanced ? CSR_RESET_AF : CSR_RESET);
-}
-
-void wd33c93_device::abort_cmd()
-{
- /* complete the command */
- complete_cmd(CSR_ABORT);
-}
-
-void wd33c93_device::disconnect_cmd()
-{
- /* complete the command */
- m_regs[WD_AUXILIARY_STATUS] &= ~(ASR_CIP | ASR_BSY);
-}
-
-void wd33c93_device::select_cmd()
-{
- uint8_t unit = getunit();
- uint8_t newstatus;
-
- /* see if we can select that device */
- if (select(unit))
- {
- /* device is available - signal selection done */
- newstatus = CSR_SELECT;
-
- /* determine the next bus phase depending on the command */
- if ((m_regs[WD_COMMAND] & 0x7f) == WD_CMD_SEL_ATN)
- {
- /* /ATN asserted during select: Move to Message Out Phase to read identify */
- m_busphase = PHS_MESS_OUT;
- }
- else
- {
- /* No /ATN asserted: Move to Command Phase */
- m_busphase = PHS_COMMAND;
- }
-
- /* queue up a service request out in the future */
- m_service_req_timer->adjust( attotime::from_usec(50) );
- }
- else
- {
- /* device is not available */
- newstatus = CSR_TIMEOUT;
- }
-
- /* complete the command */
- complete_cmd(newstatus);
-}
-
-void wd33c93_device::selectxfer_cmd()
-{
- uint8_t unit = getunit();
- uint8_t newstatus;
-
- /* see if we can select that device */
- if (select(unit))
- {
- if (m_regs[WD_COMMAND_PHASE] < 0x45)
- {
- /* device is available */
-
- /* do the request */
- send_command(&m_regs[WD_CDB_1], 12);
- int phase = get_phase();
-
- /* set transfer count */
- if (get_xfer_count() > TEMP_INPUT_LEN)
- {
- LOGMASKED(LOG_ERRORS, "WD33C93: Transfer count too big. Please increase TEMP_INPUT_LEN (size=%d)\n", get_xfer_count());
- set_xfer_count(TEMP_INPUT_LEN);
- }
-
- switch (phase)
- {
- case SCSI_PHASE_DATAIN:
- m_read_pending = true;
- break;
- }
- }
-
- if (m_read_pending)
- {
- int len = TEMP_INPUT_LEN;
-
- if (get_xfer_count() < len)
- len = get_xfer_count();
-
- memset(&m_temp_input[0], 0, TEMP_INPUT_LEN);
- read_data(&m_temp_input[0], len);
- m_temp_input_pos = 0;
- m_read_pending = false;
- }
-
- m_regs[WD_TARGET_LUN] = 0;
- m_regs[WD_CONTROL] |= CTRL_EDI;
- m_regs[WD_COMMAND_PHASE] = 0x60;
-
- /* signal transfer ready */
- newstatus = CSR_SEL_XFER_DONE;
-
- /* if allowed disconnect, queue a service request */
- if (m_identify & 0x40)
- {
- /* queue disconnect message in */
- m_busphase = PHS_MESS_IN;
-
- /* queue up a service request out in the future */
- m_service_req_timer->adjust(attotime::from_usec(50));
- }
- }
- else
- {
- /* device is not available */
- newstatus = CSR_TIMEOUT;
-
- set_xfer_count(0);
- }
-
- /* complete the command */
- complete_cmd(newstatus);
-}
-
-void wd33c93_device::negate_ack()
-{
- LOGMASKED(LOG_MISC, "WD33C93: ACK Negated\n");
-
- /* complete the command */
- m_regs[WD_AUXILIARY_STATUS] &= ~(ASR_CIP | ASR_BSY);
-}
-
-void wd33c93_device::xferinfo_cmd()
-{
- /* make the buffer available right away */
- m_regs[WD_AUXILIARY_STATUS] |= ASR_DBR;
- m_regs[WD_AUXILIARY_STATUS] |= ASR_CIP;
-
- /* the command will be completed once the data is transferred */
- m_deassert_cip_timer->adjust(attotime::from_msec(1));
-}
-
-/* Handle pending commands */
-void wd33c93_device::dispatch_command()
-{
- /* get the command */
- uint8_t cmd = m_regs[WD_COMMAND] & 0x7f;
-
- switch (cmd)
- {
- case WD_CMD_RESET:
- LOGMASKED(LOG_COMMANDS, "WD33C93: %s - Reset Command\n", machine().describe_context());
- reset_cmd();
- break;
-
- case WD_CMD_ABORT:
- LOGMASKED(LOG_COMMANDS, "WD33C93: %s - Abort Command\n", machine().describe_context());
- abort_cmd();
- break;
-
- case WD_CMD_NEGATE_ACK:
- LOGMASKED(LOG_COMMANDS, "WD33C93: %s - Negate ACK Command\n", machine().describe_context());
- negate_ack();
- break;
-
- case WD_CMD_DISCONNECT:
- LOGMASKED(LOG_COMMANDS, "WD33C93: %s - Disconnect Command\n", machine().describe_context());
- disconnect_cmd();
- break;
-
- case WD_CMD_SEL_ATN:
- case WD_CMD_SEL:
- LOGMASKED(LOG_COMMANDS, "WD33C93: %s - Select %sCommand\n", machine().describe_context(), cmd == WD_CMD_SEL_ATN ? "w/ ATN " : "");
- select_cmd();
- break;
-
- case WD_CMD_SEL_ATN_XFER:
- case WD_CMD_SEL_XFER:
- LOGMASKED(LOG_COMMANDS, "WD33C93: %s - Select %sand Xfer Command\n", machine().describe_context(), cmd == WD_CMD_SEL_ATN ? "w/ ATN " : "");
- selectxfer_cmd();
- break;
-
- case WD_CMD_TRANS_INFO:
- LOGMASKED(LOG_COMMANDS, "WD33C93: %s - Transfer Info Command\n", machine().describe_context());
- xferinfo_cmd();
- break;
-
- case WD_CMD_ASSERT_ATN:
- case WD_CMD_RESELECT:
- case WD_CMD_RESEL_RECEIVE:
- case WD_CMD_RESEL_SEND:
- case WD_CMD_WAIT_SEL_RECEIVE:
- case WD_CMD_SSCC:
- case WD_CMD_SND_DISC:
- case WD_CMD_SET_IDI:
- case WD_CMD_RCV_CMD:
- case WD_CMD_RCV_DATA:
- case WD_CMD_RCV_MSG_OUT:
- case WD_CMD_RCV:
- case WD_CMD_SND_STATUS:
- case WD_CMD_SND_DATA:
- case WD_CMD_SND_MSG_IN:
- case WD_CMD_SND:
- case WD_CMD_TRANS_ADDR:
- case WD_CMD_XFER_PAD:
- case WD_CMD_TRANSFER_PAD:
- unimplemented_cmd();
- break;
-
- default:
- invalid_cmd();
- break;
- }
-}
-
-WRITE8_MEMBER(wd33c93_device::write)
-{
- switch (offset)
- {
- case 0:
- {
- /* update register select */
- m_sasr = data & 0x1f;
- }
- break;
-
- case 1:
- {
- /* update the register */
- if (m_sasr != WD_SCSI_STATUS && m_sasr <= WD_QUEUE_TAG)
- {
- m_regs[m_sasr] = data;
- }
-
- switch (m_sasr)
- {
- case WD_OWN_ID:
- LOGMASKED(LOG_WRITES, "WD33C93: %s - Write Register %02x, Own ID Register (CDB Size) = %02x\n", machine().describe_context(), m_sasr, data);
- break;
- case WD_CONTROL:
- LOGMASKED(LOG_WRITES, "WD33C93: %s - Write Register %02x, Control Register = %02x\n", machine().describe_context(), m_sasr, data);
- break;
- case WD_TIMEOUT_PERIOD:
- LOGMASKED(LOG_WRITES, "WD33C93: %s - Write Register %02x, Timeout Period Register = %02x\n", machine().describe_context(), m_sasr, data);
- break;
- case WD_CDB_1:
- LOGMASKED(LOG_WRITES, "WD33C93: %s - Write Register %02x, Total Sectors Register (CDB1) = %02x\n", machine().describe_context(), m_sasr, data);
- m_regs[WD_COMMAND_PHASE] = 0;
- break;
- case WD_CDB_2:
- LOGMASKED(LOG_WRITES, "WD33C93: %s - Write Register %02x, Total Heads Register (CDB2) = %02x\n", machine().describe_context(), m_sasr, data);
- break;
- case WD_CDB_3:
- LOGMASKED(LOG_WRITES, "WD33C93: %s - Write Register %02x, Total Cylinders Register MSB (CDB3) = %02x\n", machine().describe_context(), m_sasr, data);
- break;
- case WD_CDB_4:
- LOGMASKED(LOG_WRITES, "WD33C93: %s - Write Register %02x, Total Cylinders Register LSB (CDB4) = %02x\n", machine().describe_context(), m_sasr, data);
- break;
- case WD_CDB_5:
- LOGMASKED(LOG_WRITES, "WD33C93: %s - Write Register %02x, Logical Address Register MSB (CDB5) = %02x\n", machine().describe_context(), m_sasr, data);
- break;
- case WD_CDB_6:
- LOGMASKED(LOG_WRITES, "WD33C93: %s - Write Register %02x, Logical Address Register 2nd (CDB6) = %02x\n", machine().describe_context(), m_sasr, data);
- break;
- case WD_CDB_7:
- LOGMASKED(LOG_WRITES, "WD33C93: %s - Write Register %02x, Logical Address Register 3rd (CDB7) = %02x\n", machine().describe_context(), m_sasr, data);
- break;
- case WD_CDB_8:
- LOGMASKED(LOG_WRITES, "WD33C93: %s - Write Register %02x, Logical Address Register LSB (CDB8) = %02x\n", machine().describe_context(), m_sasr, data);
- break;
- case WD_CDB_9:
- LOGMASKED(LOG_WRITES, "WD33C93: %s - Write Register %02x, Sector Number Register (CDB9) = %02x\n", machine().describe_context(), m_sasr, data);
- break;
- case WD_CDB_10:
- LOGMASKED(LOG_WRITES, "WD33C93: %s - Write Register %02x, Head Number Register (CDB10) = %02x\n", machine().describe_context(), m_sasr, data);
- break;
- case WD_CDB_11:
- LOGMASKED(LOG_WRITES, "WD33C93: %s - Write Register %02x, Cylinder Number Register MSB (CDB11) = %02x\n", machine().describe_context(), m_sasr, data);
- break;
- case WD_CDB_12:
- LOGMASKED(LOG_WRITES, "WD33C93: %s - Write Register %02x, Cylinder Number Register LSB (CDB12) = %02x\n", machine().describe_context(), m_sasr, data);
- break;
- case WD_TARGET_LUN:
- LOGMASKED(LOG_WRITES, "WD33C93: %s - Write Register %02x, Target LUN Register = %02x\n", machine().describe_context(), m_sasr, data);
- break;
- case WD_COMMAND_PHASE:
- LOGMASKED(LOG_WRITES, "WD33C93: %s - Write Register %02x, Command Phase Register = %02x\n", machine().describe_context(), m_sasr, data);
- break;
- case WD_SYNCHRONOUS_TRANSFER:
- LOGMASKED(LOG_WRITES, "WD33C93: %s - Write Register %02x, Synchronous Transfer Register = %02x\n", machine().describe_context(), m_sasr, data);
- break;
- case WD_TRANSFER_COUNT_MSB:
- LOGMASKED(LOG_WRITES, "WD33C93: %s - Write Register %02x, Transfer Count Register MSB = %02x\n", machine().describe_context(), m_sasr, data);
- break;
- case WD_TRANSFER_COUNT:
- LOGMASKED(LOG_WRITES, "WD33C93: %s - Write Register %02x, Transfer Count Register 2nd = %02x\n", machine().describe_context(), m_sasr, data);
- break;
- case WD_TRANSFER_COUNT_LSB:
- LOGMASKED(LOG_WRITES, "WD33C93: %s - Write Register %02x, Transfer Count Register LSB = %02x\n", machine().describe_context(), m_sasr, data);
- break;
- case WD_DESTINATION_ID:
- LOGMASKED(LOG_WRITES, "WD33C93: %s - Write Register %02x, Destination ID Register = %02x\n", machine().describe_context(), m_sasr, data);
- break;
- case WD_SOURCE_ID:
- LOGMASKED(LOG_WRITES, "WD33C93: %s - Write Register %02x, Source ID Register = %02x\n", machine().describe_context(), m_sasr, data);
- break;
- case WD_SCSI_STATUS:
- LOGMASKED(LOG_WRITES, "WD33C93: %s - Write Register %02x, SCSI Status Register (read-only!) = %02x (ignored)\n", machine().describe_context(), m_sasr, data);
- break;
- case WD_COMMAND:
- /* if we receive a command, schedule to process it */
- LOGMASKED(LOG_WRITES, "WD33C93: %s - Write Register %02x, Command Register = %02x - unit %d\n", machine().describe_context(), m_sasr, data, getunit());
-
- /* signal we're processing it */
- m_regs[WD_AUXILIARY_STATUS] |= ASR_CIP;
-
- /* process the command */
- dispatch_command();
- break;
- case WD_DATA:
- {
- LOGMASKED(LOG_WRITES, "WD33C93: %s - Write Register %02x, Data Register = %02x\n", machine().describe_context(), m_sasr, data);
-
- /* if data was written, and we have a count, send to device */
- int count = get_xfer_count();
-
- if (m_regs[WD_COMMAND] & 0x80)
- count = 1;
-
- if (count-- > 0)
- {
- /* write to FIFO */
- if (m_fifo_pos < FIFO_SIZE)
- {
- m_fifo[m_fifo_pos++] = data;
- }
-
- /* update count */
- set_xfer_count(count);
-
- /* if we're done with the write, see where we're at */
- if (count == 0)
- {
- m_regs[WD_AUXILIARY_STATUS] |= ASR_INT;
- m_regs[WD_AUXILIARY_STATUS] &= ~ASR_DBR;
-
- switch (m_busphase)
- {
- case PHS_MESS_OUT:
- {
- /* reset fifo */
- m_fifo_pos = 0;
-
- /* Message out phase. Data is probably SCSI Identify. Move to command phase. */
- m_busphase = PHS_COMMAND;
-
- m_identify = m_fifo[0];
- }
- break;
-
- case PHS_COMMAND:
- {
- /* Execute the command. Depending on the command, we'll move to data in or out */
- send_command(&m_fifo[0], 12);
- int xfercount = get_length();
- int phase = get_phase();
-
- /* reset fifo */
- m_fifo_pos = 0;
-
- /* set the new count */
- set_xfer_count(xfercount);
-
- switch (phase)
- {
- case SCSI_PHASE_STATUS:
- m_busphase = PHS_STATUS;
- break;
-
- case SCSI_PHASE_DATAIN:
- m_busphase = PHS_DATA_IN;
- m_read_pending = true;
- break;
-
- case SCSI_PHASE_DATAOUT:
- m_busphase = PHS_DATA_OUT;
- break;
- }
- }
- break;
-
- case PHS_DATA_OUT:
- {
- /* write data out to device */
- write_data(m_fifo, m_fifo_pos);
-
- /* reset fifo */
- m_fifo_pos = 0;
-
- /* move to status phase */
- m_busphase = PHS_STATUS;
- }
- break;
- }
-
- /* complete the command */
- complete_immediate(CSR_XFER_DONE | m_busphase);
- }
- }
- else
- {
- LOGMASKED(LOG_MISC | LOG_ERRORS, "WD33C93: Sending data to device with transfer count = 0!. Ignoring...\n");
- }
- break;
- }
- case WD_QUEUE_TAG:
- LOGMASKED(LOG_WRITES, "WD33C93: %s - Write Register %02x, Queue Tag Register = %02x\n", machine().describe_context(), m_sasr, data);
- break;
- case WD_AUXILIARY_STATUS:
- LOGMASKED(LOG_WRITES, "WD33C93: %s - Write Register %02x, Auxiliary Status Register (read-only!) = %02x (ignored)\n", machine().describe_context(), m_sasr, data);
- break;
- default:
- LOGMASKED(LOG_WRITES | LOG_ERRORS, "WD33C93: %s - Write Register %02x, Unknown = %02x (ignored)\n", machine().describe_context(), m_sasr, data);
- break;
- }
-
- /* auto-increment register select if not on special registers */
- if (m_sasr != WD_COMMAND && m_sasr != WD_DATA && m_sasr != WD_AUXILIARY_STATUS)
- {
- m_sasr = (m_sasr + 1) & 0x1f;
- }
- }
- break;
-
- default:
- {
- LOGMASKED(LOG_ERRORS, "WD33C93: Write to invalid offset %d (data=%02x)\n", offset, data);
- }
- break;
- }
-}
-
-READ8_MEMBER(wd33c93_device::read)
-{
- switch (offset)
- {
- case 0:
- /* read aux status */
- return m_regs[WD_AUXILIARY_STATUS];
-
- case 1:
- {
- switch (m_sasr)
- {
- case WD_OWN_ID:
- LOGMASKED(LOG_READS, "WD33C93: %s - Read Register %02x, Own ID Register (CDB Size) (%02x)\n", machine().describe_context(), m_sasr, m_regs[m_sasr]);
- break;
- case WD_CONTROL:
- LOGMASKED(LOG_READS, "WD33C93: %s - Read Register %02x, Control Register (%02x)\n", machine().describe_context(), m_sasr, m_regs[m_sasr]);
- break;
- case WD_TIMEOUT_PERIOD:
- LOGMASKED(LOG_READS, "WD33C93: %s - Read Register %02x, Timeout Period Register (%02x)\n", machine().describe_context(), m_sasr, m_regs[m_sasr]);
- break;
- case WD_CDB_1:
- LOGMASKED(LOG_READS, "WD33C93: %s - Read Register %02x, Total Sectors Register (CDB1) (%02x)\n", machine().describe_context(), m_sasr, m_regs[m_sasr]);
- m_regs[WD_COMMAND_PHASE] = 0;
- break;
- case WD_CDB_2:
- LOGMASKED(LOG_READS, "WD33C93: %s - Read Register %02x, Total Heads Register (CDB2) (%02x)\n", machine().describe_context(), m_sasr, m_regs[m_sasr]);
- break;
- case WD_CDB_3:
- LOGMASKED(LOG_READS, "WD33C93: %s - Read Register %02x, Total Cylinders Register MSB (CDB3) (%02x)\n", machine().describe_context(), m_sasr, m_regs[m_sasr]);
- break;
- case WD_CDB_4:
- LOGMASKED(LOG_READS, "WD33C93: %s - Read Register %02x, Total Cylinders Register LSB (CDB4) (%02x)\n", machine().describe_context(), m_sasr, m_regs[m_sasr]);
- break;
- case WD_CDB_5:
- LOGMASKED(LOG_READS, "WD33C93: %s - Read Register %02x, Logical Address Register MSB (CDB5) (%02x)\n", machine().describe_context(), m_sasr, m_regs[m_sasr]);
- break;
- case WD_CDB_6:
- LOGMASKED(LOG_READS, "WD33C93: %s - Read Register %02x, Logical Address Register 2nd (CDB6) (%02x)\n", machine().describe_context(), m_sasr, m_regs[m_sasr]);
- break;
- case WD_CDB_7:
- LOGMASKED(LOG_READS, "WD33C93: %s - Read Register %02x, Logical Address Register 3rd (CDB7) (%02x)\n", machine().describe_context(), m_sasr, m_regs[m_sasr]);
- break;
- case WD_CDB_8:
- LOGMASKED(LOG_READS, "WD33C93: %s - Read Register %02x, Logical Address Register LSB (CDB8) (%02x)\n", machine().describe_context(), m_sasr, m_regs[m_sasr]);
- break;
- case WD_CDB_9:
- LOGMASKED(LOG_READS, "WD33C93: %s - Read Register %02x, Sector Number Register (CDB9) (%02x)\n", machine().describe_context(), m_sasr, m_regs[m_sasr]);
- break;
- case WD_CDB_10:
- LOGMASKED(LOG_READS, "WD33C93: %s - Read Register %02x, Head Number Register (CDB10) (%02x)\n", machine().describe_context(), m_sasr, m_regs[m_sasr]);
- break;
- case WD_CDB_11:
- LOGMASKED(LOG_READS, "WD33C93: %s - Read Register %02x, Cylinder Number Register MSB (CDB11) (%02x)\n", machine().describe_context(), m_sasr, m_regs[m_sasr]);
- break;
- case WD_CDB_12:
- LOGMASKED(LOG_READS, "WD33C93: %s - Read Register %02x, Cylinder Number Register LSB (CDB12) (%02x)\n", machine().describe_context(), m_sasr, m_regs[m_sasr]);
- break;
- case WD_TARGET_LUN:
- LOGMASKED(LOG_READS, "WD33C93: %s - Read Register %02x, Target LUN Register (%02x)\n", machine().describe_context(), m_sasr, m_regs[m_sasr]);
- break;
- case WD_COMMAND_PHASE:
- LOGMASKED(LOG_READS, "WD33C93: %s - Read Register %02x, Command Phase Register (%02x)\n", machine().describe_context(), m_sasr, m_regs[m_sasr]);
- break;
- case WD_SYNCHRONOUS_TRANSFER:
- LOGMASKED(LOG_READS, "WD33C93: %s - Read Register %02x, Synchronous Transfer Register (%02x)\n", machine().describe_context(), m_sasr, m_regs[m_sasr]);
- break;
- case WD_TRANSFER_COUNT_MSB:
- LOGMASKED(LOG_READS, "WD33C93: %s - Read Register %02x, Transfer Count Register MSB (%02x)\n", machine().describe_context(), m_sasr, m_regs[m_sasr]);
- break;
- case WD_TRANSFER_COUNT:
- LOGMASKED(LOG_READS, "WD33C93: %s - Read Register %02x, Transfer Count Register 2nd (%02x)\n", machine().describe_context(), m_sasr, m_regs[m_sasr]);
- break;
- case WD_TRANSFER_COUNT_LSB:
- LOGMASKED(LOG_READS, "WD33C93: %s - Read Register %02x, Transfer Count Register LSB (%02x)\n", machine().describe_context(), m_sasr, m_regs[m_sasr]);
- break;
- case WD_DESTINATION_ID:
- LOGMASKED(LOG_READS, "WD33C93: %s - Read Register %02x, Destination ID Register (%02x)\n", machine().describe_context(), m_sasr, m_regs[m_sasr]);
- break;
- case WD_SOURCE_ID:
- LOGMASKED(LOG_READS, "WD33C93: %s - Read Register %02x, Source ID Register (%02x)\n", machine().describe_context(), m_sasr, m_regs[m_sasr]);
- break;
- case WD_SCSI_STATUS:
- LOGMASKED(LOG_READS, "WD33C93: %s - Read Register %02x, SCSI Status Register (%02x)\n", machine().describe_context(), m_sasr, m_regs[m_sasr]);
- m_regs[WD_AUXILIARY_STATUS] &= ~ASR_INT;
-
- /* if reading status, clear irq flag */
- if (!m_irq_cb.isnull())
- {
- m_irq_cb(0);
- }
- break;
- case WD_COMMAND:
- LOGMASKED(LOG_READS, "WD33C93: %s - Read Register %02x, Command Register (%02x)\n", machine().describe_context(), m_sasr, m_regs[m_sasr]);
- break;
- case WD_DATA:
- {
- /* we're going to be doing synchronous reads */
-
- /* get the transfer count */
- int count = get_xfer_count();
-
- /* initialize the return value */
- m_regs[WD_DATA] = 0;
-
- if (count <= 0 && m_busphase == PHS_MESS_IN)
- {
- /* move to disconnect */
- complete_cmd(CSR_DISC);
- }
- else if (count == 1 && m_busphase == PHS_STATUS)
- {
- /* update the count */
- set_xfer_count(0);
-
- /* move to message in phase */
- m_busphase = PHS_MESS_IN;
-
- /* complete the command */
- complete_cmd(CSR_XFER_DONE | m_busphase);
- }
- else if (count-- > 0) /* make sure we still have data to send */
- {
- if (m_read_pending)
- {
- int len = TEMP_INPUT_LEN;
-
- if ((count + 1) < len )
- len = count + 1;
- read_data(&m_temp_input[0], len);
- m_temp_input_pos = 0;
- m_read_pending = false;
- }
-
- m_regs[WD_AUXILIARY_STATUS] &= ~ASR_INT;
-
- /* read in one byte */
- if (m_temp_input_pos < TEMP_INPUT_LEN)
- m_regs[WD_DATA] = m_temp_input[m_temp_input_pos++];
-
- /* update the count */
- set_xfer_count(count);
-
- /* transfer finished, see where we're at */
- if (count == 0)
- {
- if (m_regs[WD_COMMAND_PHASE] != 0x60)
- {
- /* move to status phase */
- m_busphase = PHS_STATUS;
-
- /* complete the command */
- complete_cmd(CSR_XFER_DONE | m_busphase);
- }
- else
- {
- m_regs[WD_AUXILIARY_STATUS] |= ASR_INT;
- m_regs[WD_AUXILIARY_STATUS] &= ~ASR_DBR;
- }
- }
- LOGMASKED(LOG_READS, "WD33C93: %s - Read Register %02x, Data Register (%02x)\n", machine().describe_context(), WD_DATA, m_regs[WD_DATA]);
- }
- break;
- }
- case WD_QUEUE_TAG:
- LOGMASKED(LOG_READS, "WD33C93: %s - Read Register %02x, Queue Tag Register (%02x)\n", machine().describe_context(), m_sasr, m_regs[m_sasr]);
- break;
- case WD_AUXILIARY_STATUS:
- LOGMASKED(LOG_READS, "WD33C93: %s - Read Register %02x, Auxiliary Status Register (%02x)\n", machine().describe_context(), m_sasr, m_regs[m_sasr]);
- break;
- default:
- LOGMASKED(LOG_READS | LOG_ERRORS, "WD33C93: %s - Read Register %02x, Unknown\n", machine().describe_context(), m_sasr);
- break;
- }
-
- /* get the register value */
- uint8_t ret = 0xff;
- if (m_sasr == WD_AUXILIARY_STATUS || m_sasr <= WD_QUEUE_TAG)
- ret = m_regs[m_sasr];
-
- /* auto-increment register select if not on special registers */
- if (m_sasr != WD_COMMAND && m_sasr != WD_DATA && m_sasr != WD_AUXILIARY_STATUS)
- {
- m_sasr = (m_sasr + 1) & 0x1f;
- }
-
- return ret;
- }
-
- default:
- LOGMASKED(LOG_READS | LOG_ERRORS, "WD33C93: Read from invalid offset %d\n", offset);
- break;
- }
-
- return 0;
-}
-
-wd33c93_device::wd33c93_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) :
- legacy_scsi_host_adapter(mconfig, WD33C93, tag, owner, clock),
- m_irq_cb(*this)
-{
-}
-
-void wd33c93_device::device_start()
-{
- legacy_scsi_host_adapter::device_start();
-
- memset(m_regs, 0, sizeof(m_regs));
- memset(m_fifo, 0, sizeof(m_fifo));
- memset(m_temp_input, 0, sizeof(m_temp_input));
-
- m_sasr = 0;
- m_fifo_pos = 0;
- m_temp_input_pos = 0;
- m_busphase = 0;
- m_identify = 0;
- m_read_pending = 0;
-
- m_irq_cb.resolve();
-
- /* allocate a timer for commands */
- m_cmd_timer = timer_alloc(0);
- m_service_req_timer = timer_alloc(1);
- m_deassert_cip_timer = timer_alloc(2);
-
- save_item(NAME(m_sasr));
- save_item(NAME(m_regs));
- save_item(NAME(m_fifo));
- save_item(NAME(m_fifo_pos));
- save_item(NAME(m_temp_input));
- save_item(NAME(m_temp_input_pos));
- save_item(NAME(m_busphase));
- save_item(NAME(m_identify));
- save_item(NAME(m_read_pending));
-}
-
-int wd33c93_device::dma_read_data(int bytes, uint8_t *data)
-{
- int len = bytes;
-
- if (len >= get_xfer_count())
- len = get_xfer_count();
-
- if (len == 0)
- return 0;
-
- if ((m_temp_input_pos + len) >= TEMP_INPUT_LEN)
- {
- LOGMASKED(LOG_ERRORS, "Reading past end of buffer, increase TEMP_INPUT_LEN size\n");
- len = TEMP_INPUT_LEN - len;
- }
-
- assert(len);
-
- memcpy(data, &m_temp_input[m_temp_input_pos], len);
-
- m_temp_input_pos += len;
- set_xfer_count(get_xfer_count() - len);
- return len;
-}
-
-void wd33c93_device::dma_write_data(int bytes, uint8_t *data)
-{
- write_data(data, bytes);
-}
-
-void wd33c93_device::clear_dma()
-{
- /* indicate DMA completed by clearing the transfer count */
- set_xfer_count(0);
- m_regs[WD_AUXILIARY_STATUS] &= ~ASR_DBR;
-}
-
-int wd33c93_device::get_dma_count()
-{
- return get_xfer_count();
-}
-
-DEFINE_DEVICE_TYPE(WD33C93, wd33c93_device, "wd33c93", "Western Digital WD33C93 SCSI")
diff --git a/src/devices/machine/wd33c93.h b/src/devices/machine/wd33c93.h
deleted file mode 100644
index b4a883afca4..00000000000
--- a/src/devices/machine/wd33c93.h
+++ /dev/null
@@ -1,112 +0,0 @@
-// license:BSD-3-Clause
-// copyright-holders:ElSemi, R. Belmont, Ryan Holtz
-/*
- * wd33c93.h
- *
- */
-
-#ifndef MAME_MACHINE_WD33C93_H
-#define MAME_MACHINE_WD33C93_H
-
-#pragma once
-
-#include "legscsi.h"
-
-class wd33c93_device : public legacy_scsi_host_adapter
-{
-public:
- // construction/destruction
- wd33c93_device(const machine_config &mconfig, const char *tag, device_t *owner)
- : wd33c93_device(mconfig, tag, owner, (uint32_t)0)
- {
- }
-
- wd33c93_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
-
- auto irq_cb() { return m_irq_cb.bind(); }
-
- DECLARE_READ8_MEMBER(read);
- DECLARE_WRITE8_MEMBER(write);
-
- int dma_read_data(int bytes, uint8_t *data);
- void dma_write_data(int bytes, uint8_t *data);
- void clear_dma();
- int get_dma_count();
-
-protected:
- // device-level overrides
- virtual void device_start() override;
- virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override;
-
-private:
- // wd register names
- enum
- {
- WD_OWN_ID = 0x00,
- WD_CONTROL = 0x01,
- WD_TIMEOUT_PERIOD = 0x02,
- WD_CDB_1 = 0x03,
- WD_CDB_2 = 0x04,
- WD_CDB_3 = 0x05,
- WD_CDB_4 = 0x06,
- WD_CDB_5 = 0x07,
- WD_CDB_6 = 0x08,
- WD_CDB_7 = 0x09,
- WD_CDB_8 = 0x0a,
- WD_CDB_9 = 0x0b,
- WD_CDB_10 = 0x0c,
- WD_CDB_11 = 0x0d,
- WD_CDB_12 = 0x0e,
- WD_TARGET_LUN = 0x0f,
- WD_COMMAND_PHASE = 0x10,
- WD_SYNCHRONOUS_TRANSFER = 0x11,
- WD_TRANSFER_COUNT_MSB = 0x12,
- WD_TRANSFER_COUNT = 0x13,
- WD_TRANSFER_COUNT_LSB = 0x14,
- WD_DESTINATION_ID = 0x15,
- WD_SOURCE_ID = 0x16,
- WD_SCSI_STATUS = 0x17,
- WD_COMMAND = 0x18,
- WD_DATA = 0x19,
- WD_QUEUE_TAG = 0x1a,
- WD_AUXILIARY_STATUS = 0x1f
- };
-
- static constexpr int TEMP_INPUT_LEN = 262144;
- static constexpr int FIFO_SIZE = 12;
-
- uint8_t getunit();
- void set_xfer_count(int count);
- int get_xfer_count();
- void complete_immediate(int status);
- void complete_cmd(uint8_t status);
- void unimplemented_cmd();
- void invalid_cmd();
- void reset_cmd();
- void abort_cmd();
- void disconnect_cmd();
- void select_cmd();
- void selectxfer_cmd();
- void negate_ack();
- void xferinfo_cmd();
- void dispatch_command();
-
- uint8_t m_sasr;
- uint8_t m_regs[WD_AUXILIARY_STATUS+1];
- uint8_t m_fifo[FIFO_SIZE];
- int m_fifo_pos;
- uint8_t m_temp_input[TEMP_INPUT_LEN];
- int m_temp_input_pos;
- uint8_t m_busphase;
- uint8_t m_identify;
- bool m_read_pending;
- emu_timer *m_cmd_timer;
- emu_timer *m_service_req_timer;
- emu_timer *m_deassert_cip_timer;
- devcb_write_line m_irq_cb; /* irq callback */
-};
-
-// device type definition
-DECLARE_DEVICE_TYPE(WD33C93, wd33c93_device)
-
-#endif // MAME_MACHINE_WD33C93_H
diff --git a/src/devices/machine/wd33c9x.cpp b/src/devices/machine/wd33c9x.cpp
index 2ef063ad449..d425a9249b9 100644
--- a/src/devices/machine/wd33c9x.cpp
+++ b/src/devices/machine/wd33c9x.cpp
@@ -29,8 +29,7 @@
#define LOG_REGS (LOG_READS | LOG_WRITES)
#define LOG_ALL (LOG_REGS | LOG_COMMANDS | LOG_ERRORS | LOG_MISC | LOG_LINES | LOG_STATE | LOG_STEP)
-#define VERBOSE (LOG_COMMANDS | LOG_ERRORS | LOG_STATE)
-#define LOG_OUTPUT_FUNC printf
+#define VERBOSE (0)
#include "logmacro.h"
enum register_addresses_e : uint8_t {
@@ -279,6 +278,27 @@ enum : uint16_t {
INIT_CPT_RECV_BYTE_NACK
};
+const char *const wd33c9x_base_device::state_names[] = {
+ "-",
+ "IDLE",
+ "FINISHED",
+ "DISC_SEL_ARBITRATION",
+ "INIT_MSG_WAIT_REQ",
+ "INIT_XFR",
+ "INIT_XFR_SEND_PAD_WAIT_REQ",
+ "INIT_XFR_SEND_PAD",
+ "INIT_XFR_RECV_PAD_WAIT_REQ",
+ "INIT_XFR_RECV_PAD",
+ "INIT_XFR_RECV_BYTE_ACK",
+ "INIT_XFR_RECV_BYTE_NACK",
+ "INIT_XFR_FUNCTION_COMPLETE",
+ "INIT_XFR_BUS_COMPLETE",
+ "INIT_XFR_WAIT_REQ",
+ "INIT_CPT_RECV_BYTE_ACK",
+ "INIT_CPT_RECV_WAIT_REQ",
+ "INIT_CPT_RECV_BYTE_NACK",
+};
+
enum : uint16_t {
// Arbitration
ARB_WAIT_BUS_FREE = 1,
@@ -299,6 +319,24 @@ enum : uint16_t {
RECV_WAIT_REQ_0
};
+const char *const wd33c9x_base_device::substate_names[] = {
+ "-",
+ "ARB_WAIT_BUS_FREE",
+ "ARB_CHECK_FREE",
+ "ARB_EXAMINE_BUS",
+ "ARB_ASSERT_SEL",
+ "ARB_SET_DEST",
+ "ARB_RELEASE_BUSY",
+ "ARB_TIMEOUT_BUSY",
+ "ARB_TIMEOUT_ABORT",
+ "ARB_DESKEW_WAIT",
+ "SEND_WAIT_SETTLE",
+ "SEND_WAIT_REQ_0",
+ "RECV_WAIT_REQ_1",
+ "RECV_WAIT_SETTLE",
+ "RECV_WAIT_REQ_0",
+};
+
enum : uint16_t {
STATE_MASK = 0x00ff,
SUB_SHIFT = 8,
@@ -310,8 +348,8 @@ enum : uint16_t {
// LIVE DEVICE
//**************************************************************************
-DEFINE_DEVICE_TYPE(WD33C92, wd33c92_device, "wd33c92", "Western Digital WD33C92 SCSI Controller")
-DEFINE_DEVICE_TYPE(WD33C93N, wd33c93n_device, "wd33c93", "Western Digital WD33C93 SCSI Controller")
+DEFINE_DEVICE_TYPE(WD33C92, wd33c92_device, "wd33c92", "Western Digital WD33C92 SCSI Controller")
+DEFINE_DEVICE_TYPE(WD33C93, wd33c93_device, "wd33c93", "Western Digital WD33C93 SCSI Controller")
DEFINE_DEVICE_TYPE(WD33C93A, wd33c93a_device, "wd33c93a", "Western Digital WD33C93A SCSI Controller")
DEFINE_DEVICE_TYPE(WD33C93B, wd33c93b_device, "wd33c93b", "Western Digital WD33C93B SCSI Controller")
@@ -324,10 +362,10 @@ wd33c9x_base_device::wd33c9x_base_device(const machine_config &mconfig, device_t
, m_addr{ 0 }
, m_regs{ 0 }
, m_command_length{ 0 }
+ , m_last_message{ 0 }
, m_scsi_state{ IDLE }
, m_mode{ MODE_D }
, m_xfr_phase{ 0 }
- , m_step_count{ 0 }
, m_transfer_count{ 0 }
, m_data_fifo{ 0 }
, m_data_fifo_pos{ 0 }
@@ -355,10 +393,10 @@ void wd33c9x_base_device::device_start()
save_item(NAME(m_addr));
save_item(NAME(m_regs));
save_item(NAME(m_command_length));
+ save_item(NAME(m_last_message));
save_item(NAME(m_mode));
save_item(NAME(m_scsi_state));
save_item(NAME(m_xfr_phase));
- save_item(NAME(m_step_count));
save_item(NAME(m_transfer_count));
save_item(NAME(m_data_fifo));
save_item(NAME(m_data_fifo_pos));
@@ -384,10 +422,10 @@ void wd33c9x_base_device::device_reset()
m_regs[reg] = (QUEUE_TAG <= reg && reg <= INVALID_1E) ? 0xff : 0;
}
m_command_length = 0;
+ m_last_message = 0;
set_scsi_state(IDLE);
m_mode = MODE_D;
m_xfr_phase = 0;
- m_step_count = 0;
m_transfer_count = 0;
data_fifo_reset();
irq_fifo_reset();
@@ -432,10 +470,10 @@ void wd33c9x_base_device::scsi_ctrl_changed()
// dir_r
//-------------------------------------------------
-READ8_MEMBER(wd33c9x_base_device::dir_r)
+uint8_t wd33c9x_base_device::dir_r(offs_t offset)
{
m_addr = offset & REGS_MASK;
- return indir_reg_r(space, 0, mem_mask);
+ return indir_reg_r();
}
@@ -443,10 +481,10 @@ READ8_MEMBER(wd33c9x_base_device::dir_r)
// dir_w
//-------------------------------------------------
-WRITE8_MEMBER(wd33c9x_base_device::dir_w)
+void wd33c9x_base_device::dir_w(offs_t offset, uint8_t data)
{
m_addr = offset & REGS_MASK;
- indir_reg_w(space, 0, data, mem_mask);
+ indir_reg_w(data);
}
@@ -454,15 +492,15 @@ WRITE8_MEMBER(wd33c9x_base_device::dir_w)
// indir_r
//-------------------------------------------------
-READ8_MEMBER(wd33c9x_base_device::indir_r)
+uint8_t wd33c9x_base_device::indir_r(offs_t offset)
{
switch (offset) {
case 0:
- return indir_addr_r(space, 0, mem_mask);
+ return indir_addr_r();
case 1:
- return indir_reg_r(space, 0, mem_mask);
+ return indir_reg_r();
default:
- LOGMASKED(LOG_READS | LOG_ERRORS, "%s: Read from invalid offset %d\n", shortname(), offset);
+ LOGMASKED(LOG_READS | LOG_ERRORS, "Read from invalid offset %d\n", offset);
break;
}
return 0;
@@ -473,17 +511,17 @@ READ8_MEMBER(wd33c9x_base_device::indir_r)
// indir_w
//-------------------------------------------------
-WRITE8_MEMBER(wd33c9x_base_device::indir_w)
+void wd33c9x_base_device::indir_w(offs_t offset, uint8_t data)
{
switch (offset) {
case 0:
- indir_addr_w(space, 0, data, mem_mask);
+ indir_addr_w(data);
break;
case 1:
- indir_reg_w(space, 0, data, mem_mask);
+ indir_reg_w(data);
break;
default:
- LOGMASKED(LOG_WRITES | LOG_ERRORS, "%s: Write to invalid offset %d (data=%02x)\n", shortname(), offset, data);
+ LOGMASKED(LOG_WRITES | LOG_ERRORS, "Write to invalid offset %d (data=%02x)\n", offset, data);
break;
}
}
@@ -493,13 +531,10 @@ WRITE8_MEMBER(wd33c9x_base_device::indir_w)
// indir_addr_r
//-------------------------------------------------
-READ8_MEMBER(wd33c9x_base_device::indir_addr_r)
+uint8_t wd33c9x_base_device::indir_addr_r()
{
- if (offset != 0) {
- fatalerror("%s: Read from invalid address offset %d\n", shortname(), offset);
- }
- step(false);
- return m_regs[AUXILIARY_STATUS];
+ // Trick to push the interrupt flag after the fifo is empty to help cps3
+ return m_regs[AUXILIARY_STATUS] & 0x01 ? m_regs[AUXILIARY_STATUS] & 0x7f : m_regs[AUXILIARY_STATUS];
}
@@ -507,11 +542,8 @@ READ8_MEMBER(wd33c9x_base_device::indir_addr_r)
// indir_addr_w
//-------------------------------------------------
-WRITE8_MEMBER(wd33c9x_base_device::indir_addr_w)
+void wd33c9x_base_device::indir_addr_w(uint8_t data)
{
- if (offset != 0) {
- fatalerror("%s: Write to invalid address offset %d (data=%02x)\n", shortname(), offset, data);
- }
m_addr = data & REGS_MASK;
}
@@ -520,15 +552,11 @@ WRITE8_MEMBER(wd33c9x_base_device::indir_addr_w)
// indir_reg_r
//-------------------------------------------------
-READ8_MEMBER(wd33c9x_base_device::indir_reg_r)
+uint8_t wd33c9x_base_device::indir_reg_r()
{
- if (offset != 0) {
- fatalerror("%s: Read from invalid indirect register offset %d\n", shortname(), offset);
- }
-
uint8_t ret;
switch (m_addr) {
- case DATA:
+ case DATA: {
if (!(m_regs[AUXILIARY_STATUS] & AUXILIARY_STATUS_DBR)) {
// The processor, except in one case, should only
// access the Data Register when the DBR bit in the
@@ -539,9 +567,14 @@ READ8_MEMBER(wd33c9x_base_device::indir_reg_r)
// Data Register.
fatalerror("%s: The host should never access the data register without DBR set.\n", shortname());
}
+ bool was_full = data_fifo_full();
ret = data_fifo_pop();
- m_regs[AUXILIARY_STATUS] &= ~AUXILIARY_STATUS_DBR;
+ if (data_fifo_empty())
+ m_regs[AUXILIARY_STATUS] &= ~AUXILIARY_STATUS_DBR;
+ if (was_full)
+ step(false);
break;
+ }
default:
if (m_addr == OWN_ID) {
@@ -571,12 +604,8 @@ READ8_MEMBER(wd33c9x_base_device::indir_reg_r)
// indir_reg_w
//-------------------------------------------------
-WRITE8_MEMBER(wd33c9x_base_device::indir_reg_w)
+void wd33c9x_base_device::indir_reg_w(uint8_t data)
{
- if (offset != 0) {
- fatalerror("%s: Write to invalid indirect register offset %d (data=%02x)\n", shortname(), offset, data);
- }
-
switch (m_addr) {
case SCSI_STATUS:
case QUEUE_TAG: // Only for 92/93 and 93A
@@ -585,7 +614,7 @@ WRITE8_MEMBER(wd33c9x_base_device::indir_reg_w)
case INVALID_1D:
case INVALID_1E:
case AUXILIARY_STATUS:
- LOGMASKED(LOG_WRITES | LOG_ERRORS, "%s: Write to read-only register address %d (data=%02x)\n", shortname(), m_addr, data);
+ LOGMASKED(LOG_WRITES | LOG_ERRORS, "Write to read-only register address %d (data=%02x)\n", m_addr, data);
break;
case COMMAND: {
@@ -637,7 +666,7 @@ WRITE8_MEMBER(wd33c9x_base_device::indir_reg_w)
WRITE_LINE_MEMBER(wd33c9x_base_device::reset_w)
{
if (state) {
- LOGMASKED(LOG_LINES, "%s: Reset via MR line\n", shortname());
+ LOGMASKED(LOG_LINES, "Reset via MR line\n");
device_reset();
}
}
@@ -695,7 +724,7 @@ void wd33c9x_base_device::start_command()
switch (cc) {
case COMMAND_CC_RESET:
- LOGMASKED(LOG_COMMANDS, "%s: Reset Command\n", shortname());
+ LOGMASKED(LOG_COMMANDS, "Reset Command\n");
scsi_bus->ctrl_w(scsi_refid, 0, S_ALL);
scsi_bus->ctrl_wait(scsi_refid, S_SEL|S_BSY|S_RST, S_ALL);
m_regs[OWN_ID] = m_command_length;
@@ -709,17 +738,18 @@ void wd33c9x_base_device::start_command()
set_scsi_state(FINISHED);
irq_fifo_push((m_regs[OWN_ID] & OWN_ID_EAF) ? SCSI_STATUS_RESET_EAF : SCSI_STATUS_RESET);
scsi_id = (m_regs[OWN_ID] & OWN_ID_SCSI_ID);
+ step(false);
break;
case COMMAND_CC_ABORT:
- LOGMASKED(LOG_COMMANDS, "%s: Abort Command\n", shortname());
+ LOGMASKED(LOG_COMMANDS, "Abort Command\n");
set_scsi_state(FINISHED);
// FIXME
irq_fifo_push((m_regs[OWN_ID] & OWN_ID_EAF) ? SCSI_STATUS_RESET_EAF : SCSI_STATUS_RESET);
break;
case COMMAND_CC_ASSERT_ATN:
- LOGMASKED(LOG_COMMANDS, "%s: Assert ATN Command\n", shortname());
+ LOGMASKED(LOG_COMMANDS, "Assert ATN Command\n");
if (m_mode != MODE_I) {
fatalerror("%s: ASSERT_ATN command only valid in the Initiator state.", shortname());
}
@@ -727,7 +757,7 @@ void wd33c9x_base_device::start_command()
return;
case COMMAND_CC_NEGATE_ACK:
- LOGMASKED(LOG_COMMANDS, "%s: Negate ACK Command\n", shortname());
+ LOGMASKED(LOG_COMMANDS, "Negate ACK Command\n");
// FIXME - This is causing problems, so ignore for now.
//if (m_mode != MODE_I) {
// fatalerror("NEGATE_ACK command only valid in the Initiator state.");
@@ -736,26 +766,27 @@ void wd33c9x_base_device::start_command()
return;
case COMMAND_CC_DISCONNECT:
- LOGMASKED(LOG_COMMANDS, "%s: Disconnect Command\n", shortname());
+ LOGMASKED(LOG_COMMANDS, "Disconnect Command\n");
scsi_bus->ctrl_w(scsi_refid, 0, S_ALL);
scsi_bus->ctrl_wait(scsi_refid, S_SEL|S_BSY|S_RST, S_ALL);
m_mode = MODE_D;
- set_scsi_state(FINISHED);
- irq_fifo_push(SCSI_STATUS_DISCONNECT);
+ set_scsi_state(IDLE);
+ m_regs[AUXILIARY_STATUS] &= ~(AUXILIARY_STATUS_CIP | AUXILIARY_STATUS_BSY);
break;
case COMMAND_CC_SELECT:
case COMMAND_CC_SELECT_ATN:
- LOGMASKED(LOG_COMMANDS, "%s: %s Command\n", shortname(), select_strings[cc - COMMAND_CC_SELECT_ATN]);
+ LOGMASKED(LOG_COMMANDS, "%s Command\n", select_strings[cc - COMMAND_CC_SELECT_ATN]);
if (m_mode != MODE_D) {
fatalerror("Select commands only valid in the Disconnected state.");
}
set_scsi_state((ARB_WAIT_BUS_FREE << SUB_SHIFT) | DISC_SEL_ARBITRATION);
+ step(false);
break;
case COMMAND_CC_SELECT_TRANSFER:
case COMMAND_CC_SELECT_ATN_TRANSFER:
- LOGMASKED(LOG_COMMANDS, "%s: %s Command\n", shortname(), select_strings[cc - COMMAND_CC_SELECT_ATN]);
+ LOGMASKED(LOG_COMMANDS, "%s Command\n", select_strings[cc - COMMAND_CC_SELECT_ATN]);
if (m_mode == MODE_D) {
set_scsi_state((ARB_WAIT_BUS_FREE << SUB_SHIFT) | DISC_SEL_ARBITRATION);
m_regs[COMMAND_PHASE] = COMMAND_PHASE_ZERO;
@@ -768,10 +799,11 @@ void wd33c9x_base_device::start_command()
}
set_command_length(cc);
load_transfer_count();
+ step(false);
break;
case COMMAND_CC_TRANSFER_INFO:
- LOGMASKED(LOG_COMMANDS, "%s: Transfer Info Command\n", shortname());
+ LOGMASKED(LOG_COMMANDS, "Transfer Info Command\n");
if (m_mode != MODE_I) {
fatalerror("%s: TRANSFER_INFO command only valid in the Initiator state.", shortname());
}
@@ -787,8 +819,6 @@ void wd33c9x_base_device::start_command()
fatalerror("%s: Unimplemented command: 0x%02x", shortname(), cc);
break;
}
-
- delay(1);
}
@@ -810,563 +840,533 @@ static const char * phase_strings[8] = {
void wd33c9x_base_device::step(bool timeout)
{
- if (++m_step_count > 1) {
- return;
- }
-
const uint8_t cc = (m_regs[COMMAND] & COMMAND_CC);
const bool sat = (cc == COMMAND_CC_SELECT_TRANSFER || cc == COMMAND_CC_SELECT_ATN_TRANSFER);
- uint32_t cycles = 0;
- do {
- const uint32_t ctrl = scsi_bus->ctrl_r();
- const uint32_t data = scsi_bus->data_r();
-
- m_step_count = 1;
-
- LOGMASKED(LOG_STEP,
- "%s: step - PHASE:%s BSY:%x SEL:%x REQ:%x ACK:%x ATN:%x RST:%x DATA:%x (%d.%d) %s\n",
- shortname(),
- phase_strings[ctrl & S_PHASE_MASK],
- (ctrl & S_BSY) ? 1 : 0,
- (ctrl & S_SEL) ? 1 : 0,
- (ctrl & S_REQ) ? 1 : 0,
- (ctrl & S_ACK) ? 1 : 0,
- (ctrl & S_ATN) ? 1 : 0,
- (ctrl & S_RST) ? 1 : 0,
- data,
- m_scsi_state & STATE_MASK, m_scsi_state >> SUB_SHIFT,
- (timeout) ? "timeout" : "change"
- );
-
- if (m_mode == MODE_I) {
- if (ctrl & S_BSY) {
- if (ctrl & S_REQ) {
- uint8_t xfr_phase = (ctrl & S_PHASE_MASK);
- switch (m_scsi_state) {
- case DISC_SEL_ARBITRATION:
- m_xfr_phase = xfr_phase;
- break;
+ const uint32_t ctrl = scsi_bus->ctrl_r();
+ const uint32_t data = scsi_bus->data_r();
+
+ LOGMASKED(LOG_STEP,
+ "%s: step - PHASE:%s BSY:%x SEL:%x REQ:%x ACK:%x ATN:%x RST:%x DATA:%02x (%s.%s) %s\n",
+ shortname(),
+ phase_strings[ctrl & S_PHASE_MASK],
+ (ctrl & S_BSY) ? 1 : 0,
+ (ctrl & S_SEL) ? 1 : 0,
+ (ctrl & S_REQ) ? 1 : 0,
+ (ctrl & S_ACK) ? 1 : 0,
+ (ctrl & S_ATN) ? 1 : 0,
+ (ctrl & S_RST) ? 1 : 0,
+ data,
+ state_names[m_scsi_state & STATE_MASK], substate_names[m_scsi_state >> SUB_SHIFT],
+ (timeout) ? "timeout" : "change"
+ );
+
+ if (m_mode == MODE_I) {
+ if (ctrl & S_BSY) {
+ if (ctrl & S_REQ) {
+ uint8_t xfr_phase = (ctrl & S_PHASE_MASK);
+ switch (m_scsi_state) {
+ case DISC_SEL_ARBITRATION:
+ m_xfr_phase = xfr_phase;
+ break;
- case INIT_XFR_WAIT_REQ:
- break;
+ case INIT_XFR_WAIT_REQ:
+ break;
- default:
- if (m_xfr_phase != xfr_phase) {
- fatalerror("%s: Unexpected phase change during state.\n", shortname());
- }
- break;
+ default:
+ if (m_xfr_phase != xfr_phase) {
+ fatalerror("%s: Unexpected phase change during state.\n", shortname());
}
+ break;
}
}
- else {
- LOGMASKED(LOG_STATE, "%s: Target disconnected\n", shortname());
- if (sat) {
- switch (m_regs[COMMAND_PHASE]) {
- case COMMAND_PHASE_DISCONNECT_MESSAGE:
- set_scsi_state(FINISHED);
- m_regs[COMMAND_PHASE] = COMMAND_PHASE_DISCONNECTED;
- break;
-
- case COMMAND_PHASE_COMMAND_COMPLETE:
- if (m_regs[CONTROL] & CONTROL_EDI) {
- set_scsi_state(FINISHED);
- irq_fifo_push(SCSI_STATUS_SELECT_TRANSFER_SUCCESS);
- }
- break;
+ } else {
+ LOGMASKED(LOG_STATE, "Target disconnected\n");
+ if (sat) {
+ switch (m_regs[COMMAND_PHASE]) {
+ case COMMAND_PHASE_DISCONNECT_MESSAGE:
+ set_scsi_state(FINISHED);
+ m_regs[COMMAND_PHASE] = COMMAND_PHASE_DISCONNECTED;
+ break;
- default:
- fatalerror("%s: Unhandled command phase during Select-and-Transfer disconnect.\n", shortname());
- break;
+ case COMMAND_PHASE_COMMAND_COMPLETE:
+ if (m_regs[CONTROL] & CONTROL_EDI) {
+ set_scsi_state(FINISHED);
+ irq_fifo_push(SCSI_STATUS_SELECT_TRANSFER_SUCCESS);
+ } else {
+ // Makes very little sense, but the previous code did it and warzard seems to need it - XXX
+ m_regs[CONTROL] |= CONTROL_EDI;
}
+ break;
+
+ default:
+ fatalerror("%s: Unhandled command phase during Select-and-Transfer disconnect.\n", shortname());
+ break;
}
- else {
- set_scsi_state(FINISHED);
- irq_fifo_push(SCSI_STATUS_DISCONNECT);
- }
- m_mode = MODE_D;
- scsi_bus->ctrl_w(scsi_refid, 0, S_ALL);
- scsi_bus->ctrl_wait(scsi_refid, S_SEL|S_BSY|S_RST, S_ALL);
- continue;
+ } else {
+ set_scsi_state(FINISHED);
+ irq_fifo_push(SCSI_STATUS_DISCONNECT);
}
+ m_mode = MODE_D;
+ scsi_bus->ctrl_w(scsi_refid, 0, S_ALL);
+ scsi_bus->ctrl_wait(scsi_refid, S_SEL|S_BSY|S_RST, S_ALL);
}
+ }
- switch (m_scsi_state & SUB_MASK ? m_scsi_state & SUB_MASK : m_scsi_state & STATE_MASK) {
- case IDLE:
- break;
+ switch (m_scsi_state & SUB_MASK ? m_scsi_state & SUB_MASK : m_scsi_state & STATE_MASK) {
+ case IDLE:
+ break;
- case FINISHED:
- set_scsi_state(IDLE);
- m_regs[AUXILIARY_STATUS] &= ~(AUXILIARY_STATUS_CIP | AUXILIARY_STATUS_BSY);
- update_irq();
- break;
+ case FINISHED:
+ set_scsi_state(IDLE);
+ m_regs[AUXILIARY_STATUS] &= ~(AUXILIARY_STATUS_CIP | AUXILIARY_STATUS_BSY);
+ update_irq();
+ break;
- case ARB_WAIT_BUS_FREE << SUB_SHIFT:
- if (timeout) {
- if (!(ctrl & (S_BSY | S_SEL))) {
- set_scsi_state_sub(ARB_CHECK_FREE);
- }
- cycles = 1;
- }
- break;
+ case ARB_WAIT_BUS_FREE << SUB_SHIFT:
+ if (!(ctrl & (S_BSY | S_SEL))) {
+ set_scsi_state_sub(ARB_CHECK_FREE);
+ delay(1);
+ }
+ break;
- case ARB_CHECK_FREE << SUB_SHIFT:
- if (timeout) {
- uint8_t next_state;
- if (ctrl & (S_BSY | S_SEL)) {
- next_state = ARB_WAIT_BUS_FREE;
- cycles = 1;
- }
- else {
- scsi_bus->data_w(scsi_refid, 1 << scsi_id);
- scsi_bus->ctrl_w(scsi_refid, S_BSY, S_BSY);
- next_state = ARB_EXAMINE_BUS;
- cycles = 1;
- }
- set_scsi_state_sub(next_state);
- }
+ case ARB_CHECK_FREE << SUB_SHIFT:
+ if (ctrl & (S_BSY | S_SEL)) {
+ set_scsi_state_sub(ARB_CHECK_FREE);
break;
+ }
+ if (timeout) {
+ scsi_bus->data_w(scsi_refid, 1 << scsi_id);
+ scsi_bus->ctrl_w(scsi_refid, S_BSY, S_BSY);
+ set_scsi_state_sub(ARB_EXAMINE_BUS);
+ delay(1);
+ }
+ break;
- case ARB_EXAMINE_BUS << SUB_SHIFT:
- if (timeout) {
- if (ctrl & S_SEL) {
- scsi_bus->ctrl_w(scsi_refid, 0, S_BSY);
+ case ARB_EXAMINE_BUS << SUB_SHIFT:
+ if (timeout) {
+ if (ctrl & S_SEL) {
+ scsi_bus->ctrl_w(scsi_refid, 0, S_BSY);
+ scsi_bus->data_w(scsi_refid, 0);
+ set_scsi_state_sub(ARB_WAIT_BUS_FREE);
+ } else {
+ int win;
+ for (win = 7; win >=0 && !(data & (1 << win)); win--);
+ if (win == scsi_id) {
+ scsi_bus->ctrl_w(scsi_refid, S_SEL, S_SEL);
+ set_scsi_state_sub(ARB_ASSERT_SEL);
+ delay(1);
+ } else {
scsi_bus->data_w(scsi_refid, 0);
- set_scsi_state_sub(ARB_WAIT_BUS_FREE);
- }
- else {
- int win;
- for (win = 7; win >=0 && !(data & (1 << win)); win--) {};
- if (win == scsi_id) {
- scsi_bus->ctrl_w(scsi_refid, S_SEL, S_SEL);
- set_scsi_state_sub(ARB_ASSERT_SEL);
- }
- else {
- scsi_bus->data_w(scsi_refid, 0);
- scsi_bus->ctrl_w(scsi_refid, 0, S_ALL);
- }
+ scsi_bus->ctrl_w(scsi_refid, 0, S_ALL);
+ set_scsi_state_sub(ARB_CHECK_FREE);
}
- cycles = 1;
}
- break;
+ }
+ break;
- case ARB_ASSERT_SEL << SUB_SHIFT:
- if (timeout) {
- scsi_bus->data_w(scsi_refid, (1 << scsi_id) | (1 << (m_regs[DESTINATION_ID] & DESTINATION_ID_DI)));
- set_scsi_state_sub(ARB_SET_DEST);
- cycles = 1;
- }
- break;
+ case ARB_ASSERT_SEL << SUB_SHIFT:
+ if (timeout) {
+ scsi_bus->data_w(scsi_refid, (1 << scsi_id) | (1 << (m_regs[DESTINATION_ID] & DESTINATION_ID_DI)));
+ set_scsi_state_sub(ARB_SET_DEST);
+ delay(1);
+ }
+ break;
- case ARB_SET_DEST << SUB_SHIFT:
- if (timeout) {
- scsi_bus->ctrl_w(scsi_refid, (cc == COMMAND_CC_SELECT_ATN || cc == COMMAND_CC_SELECT_ATN_TRANSFER) ? S_ATN : 0, S_ATN | S_BSY);
- set_scsi_state_sub(ARB_RELEASE_BUSY);
- cycles = 1;
- }
- break;
+ case ARB_SET_DEST << SUB_SHIFT:
+ if (timeout) {
+ scsi_bus->ctrl_w(scsi_refid, (cc == COMMAND_CC_SELECT_ATN || cc == COMMAND_CC_SELECT_ATN_TRANSFER) ? S_ATN : 0, S_ATN | S_BSY);
+ set_scsi_state_sub(ARB_RELEASE_BUSY);
+ delay(1);
+ }
+ break;
- case ARB_RELEASE_BUSY << SUB_SHIFT:
- if (timeout) {
- if (ctrl & S_BSY) {
- set_scsi_state_sub(ARB_DESKEW_WAIT);
- if (cc == COMMAND_CC_RESELECT) {
- scsi_bus->ctrl_w(scsi_refid, S_BSY, S_BSY);
- }
- cycles = 1;
- }
- else {
- set_scsi_state_sub(ARB_TIMEOUT_BUSY);
- cycles = 1;
+ case ARB_RELEASE_BUSY << SUB_SHIFT:
+ if (timeout) {
+ if (ctrl & S_BSY) {
+ set_scsi_state_sub(ARB_DESKEW_WAIT);
+ if (cc == COMMAND_CC_RESELECT) {
+ scsi_bus->ctrl_w(scsi_refid, S_BSY, S_BSY);
}
+ delay(1);
+ } else {
+ set_scsi_state_sub(ARB_TIMEOUT_BUSY);
+ delay(1); // Should be the select timeout...
}
- break;
+ }
+ break;
- case ARB_DESKEW_WAIT << SUB_SHIFT:
- if (timeout) {
- scsi_bus->data_w(scsi_refid, 0);
- scsi_bus->ctrl_w(scsi_refid, 0, S_SEL);
- m_mode = (cc == COMMAND_CC_RESELECT) ? MODE_T : MODE_I;
- set_scsi_state_sub(0);
- ++m_step_count;
- }
- break;
+ case ARB_DESKEW_WAIT << SUB_SHIFT:
+ if (timeout) {
+ scsi_bus->data_w(scsi_refid, 0);
+ scsi_bus->ctrl_w(scsi_refid, 0, S_SEL);
+ m_mode = (cc == COMMAND_CC_RESELECT) ? MODE_T : MODE_I;
+ set_scsi_state_sub(0);
+ step(true);
+ }
+ break;
- case ARB_TIMEOUT_BUSY << SUB_SHIFT:
- if (timeout) {
- scsi_bus->data_w(scsi_refid, 0);
- set_scsi_state_sub(ARB_TIMEOUT_ABORT);
- cycles = 1000;
+ case ARB_TIMEOUT_BUSY << SUB_SHIFT:
+ if (timeout) {
+ scsi_bus->data_w(scsi_refid, 0);
+ set_scsi_state_sub(ARB_TIMEOUT_ABORT);
+ delay(1000);
+ } else if (ctrl & S_BSY) {
+ set_scsi_state_sub(ARB_DESKEW_WAIT);
+ if (cc == COMMAND_CC_RESELECT) {
+ scsi_bus->ctrl_w(scsi_refid, S_BSY, S_BSY);
}
- else if (ctrl & S_BSY) {
+ delay(1);
+ }
+ break;
+
+ case ARB_TIMEOUT_ABORT << SUB_SHIFT:
+ if (timeout) {
+ if (ctrl & S_BSY) {
set_scsi_state_sub(ARB_DESKEW_WAIT);
if (cc == COMMAND_CC_RESELECT) {
scsi_bus->ctrl_w(scsi_refid, S_BSY, S_BSY);
}
- cycles = 1;
- }
- break;
-
- case ARB_TIMEOUT_ABORT << SUB_SHIFT:
- if (timeout) {
- if (ctrl & S_BSY) {
- set_scsi_state_sub(ARB_DESKEW_WAIT);
- if (cc == COMMAND_CC_RESELECT) {
- scsi_bus->ctrl_w(scsi_refid, S_BSY, S_BSY);
- }
- cycles = 1;
- }
- else {
- scsi_bus->ctrl_w(scsi_refid, 0, S_ALL);
- scsi_bus->ctrl_wait(scsi_refid, S_SEL|S_BSY|S_RST, S_ALL);
- m_regs[AUXILIARY_STATUS] &= ~(AUXILIARY_STATUS_CIP | AUXILIARY_STATUS_BSY);
- m_mode = MODE_D;
- set_scsi_state(IDLE);
- irq_fifo_push(SCSI_STATUS_SELECTION_TIMEOUT);
- update_irq();
- }
+ delay(1);
+ } else {
+ scsi_bus->ctrl_w(scsi_refid, 0, S_ALL);
+ scsi_bus->ctrl_wait(scsi_refid, S_SEL|S_BSY|S_RST, S_ALL);
+ m_regs[AUXILIARY_STATUS] &= ~(AUXILIARY_STATUS_CIP | AUXILIARY_STATUS_BSY);
+ m_mode = MODE_D;
+ set_scsi_state(IDLE);
+ irq_fifo_push(SCSI_STATUS_SELECTION_TIMEOUT);
+ update_irq();
}
- break;
+ }
+ break;
- case SEND_WAIT_SETTLE << SUB_SHIFT:
- if (timeout) {
- set_scsi_state_sub(SEND_WAIT_REQ_0);
- ++m_step_count;
- }
- break;
+ case SEND_WAIT_SETTLE << SUB_SHIFT:
+ if (timeout) {
+ set_scsi_state_sub(SEND_WAIT_REQ_0);
+ step(false);
+ }
+ break;
- case SEND_WAIT_REQ_0 << SUB_SHIFT:
- if (!(ctrl & S_REQ)) {
- set_scsi_state_sub(0);
- scsi_bus->data_w(scsi_refid, 0);
- scsi_bus->ctrl_w(scsi_refid, 0, S_ACK);
- if (sat) {
- switch (m_xfr_phase) {
- case S_PHASE_COMMAND:
- ++m_regs[COMMAND_PHASE];
- break;
- }
+ case SEND_WAIT_REQ_0 << SUB_SHIFT:
+ if (!(ctrl & S_REQ)) {
+ set_scsi_state_sub(0);
+ scsi_bus->data_w(scsi_refid, 0);
+ scsi_bus->ctrl_w(scsi_refid, 0, S_ACK);
+ if (sat) {
+ switch (m_xfr_phase) {
+ case S_PHASE_COMMAND:
+ ++m_regs[COMMAND_PHASE];
+ break;
}
- ++m_step_count;
- }
- break;
-
- case RECV_WAIT_REQ_1 << SUB_SHIFT:
- if (ctrl & S_REQ) {
- set_scsi_state_sub(RECV_WAIT_SETTLE);
- cycles = 1;
}
- break;
-
- case RECV_WAIT_SETTLE << SUB_SHIFT:
- if (timeout) {
- if (sat) {
- switch (m_xfr_phase) {
- case S_PHASE_DATA_IN:
- data_fifo_push(data);
- if ((m_regs[CONTROL] & CONTROL_DM) != CONTROL_DM_POLLED) {
- set_drq();
- }
- else {
- decrement_transfer_count();
- m_regs[AUXILIARY_STATUS] |= AUXILIARY_STATUS_DBR;
- }
- break;
-
- case S_PHASE_STATUS:
- m_regs[TARGET_LUN] = data;
- m_regs[COMMAND_PHASE] = COMMAND_PHASE_STATUS_RECEIVED;
- break;
+ step(false);
+ }
+ break;
- case S_PHASE_MSG_IN:
- data_fifo_push(data);
- break;
+ case RECV_WAIT_REQ_1 << SUB_SHIFT:
+ if (ctrl & S_REQ) {
+ set_scsi_state_sub(RECV_WAIT_SETTLE);
+ delay(1);
+ }
+ break;
- default:
- fatalerror("%s: Unexpected phase in RECV_WAIT_SETTLE.\n", shortname());
- break;
- }
- }
- else {
+ case RECV_WAIT_SETTLE << SUB_SHIFT:
+ if (timeout) {
+ if (sat) {
+ switch (m_xfr_phase) {
+ case S_PHASE_DATA_IN:
data_fifo_push(data);
- if (m_xfr_phase == S_PHASE_DATA_IN && (m_regs[CONTROL] & CONTROL_DM) != CONTROL_DM_POLLED) {
+ if ((m_regs[CONTROL] & CONTROL_DM) != CONTROL_DM_POLLED) {
set_drq();
- }
- else {
+ } else {
decrement_transfer_count();
m_regs[AUXILIARY_STATUS] |= AUXILIARY_STATUS_DBR;
}
+ break;
+
+ case S_PHASE_STATUS:
+ m_regs[TARGET_LUN] = data;
+ m_regs[COMMAND_PHASE] = COMMAND_PHASE_STATUS_RECEIVED;
+ break;
+
+ case S_PHASE_MSG_IN:
+ m_last_message = data;
+ break;
+
+ default:
+ fatalerror("%s: Unexpected phase in RECV_WAIT_SETTLE.\n", shortname());
+ break;
+ }
+ } else {
+ data_fifo_push(data);
+ if (m_xfr_phase == S_PHASE_DATA_IN && (m_regs[CONTROL] & CONTROL_DM) != CONTROL_DM_POLLED) {
+ set_drq();
+ } else {
+ decrement_transfer_count();
+ m_regs[AUXILIARY_STATUS] |= AUXILIARY_STATUS_DBR;
}
- set_scsi_state_sub(RECV_WAIT_REQ_0);
- scsi_bus->ctrl_w(scsi_refid, S_ACK, S_ACK);
- ++m_step_count;
}
- break;
+ set_scsi_state_sub(RECV_WAIT_REQ_0);
+ scsi_bus->ctrl_w(scsi_refid, S_ACK, S_ACK);
+ step(false);
+ }
+ break;
- case RECV_WAIT_REQ_0 << SUB_SHIFT:
- if (!(ctrl & S_REQ)) {
- set_scsi_state_sub(0);
- ++m_step_count;
- }
- break;
+ case RECV_WAIT_REQ_0 << SUB_SHIFT:
+ if (!(ctrl & S_REQ)) {
+ set_scsi_state_sub(0);
+ step(false);
+ }
+ break;
- case DISC_SEL_ARBITRATION:
- scsi_bus->ctrl_wait(scsi_refid, S_REQ, S_REQ);
- if (cc == COMMAND_CC_SELECT || cc == COMMAND_CC_SELECT_ATN) {
- set_scsi_state(FINISHED);
- irq_fifo_push(SCSI_STATUS_SELECT_SUCCESS);
- if (ctrl & S_REQ) {
- irq_fifo_push(SCSI_STATUS_REQ | m_xfr_phase);
- }
+ case DISC_SEL_ARBITRATION:
+ scsi_bus->ctrl_wait(scsi_refid, S_REQ, S_REQ);
+ if (cc == COMMAND_CC_SELECT || cc == COMMAND_CC_SELECT_ATN) {
+ set_scsi_state(FINISHED);
+ irq_fifo_push(SCSI_STATUS_SELECT_SUCCESS);
+ if (ctrl & S_REQ) {
+ irq_fifo_push(SCSI_STATUS_REQ | m_xfr_phase);
}
- else {
- set_scsi_state(INIT_XFR);
+ } else {
+ if(cc == COMMAND_CC_SELECT_TRANSFER) {
+ m_regs[COMMAND_PHASE] = COMMAND_PHASE_CP_BYTES_0;
+ std::string cmd;
+ for (uint8_t i = 0; i < m_command_length; ++i) {
+ const uint8_t command_byte = m_regs[CDB_1 + i];
+ cmd += util::string_format(" %02x", command_byte);
+ data_fifo_push(command_byte);
+ }
+ LOGMASKED(LOG_COMMANDS, "Sending command:%s (%d)\n", cmd, m_transfer_count);
+ } else
m_regs[COMMAND_PHASE] = COMMAND_PHASE_SELECTED;
- }
- ++m_step_count;
- break;
+ set_scsi_state(INIT_XFR);
+ }
+ step(false);
+ break;
- case INIT_XFR:
- if (ctrl & S_REQ) {
- switch (m_xfr_phase) {
- case S_PHASE_DATA_OUT:
- if ((m_regs[CONTROL] & CONTROL_DM) != CONTROL_DM_POLLED) {
- while (!data_fifo_full() && m_transfer_count > 0) {
- set_drq();
- }
- }
- if (!data_fifo_empty()) {
- set_scsi_state(INIT_XFR_WAIT_REQ);
- cycles = send_byte();
- }
- else if ((m_regs[CONTROL] & CONTROL_DM) == CONTROL_DM_POLLED) {
- m_regs[AUXILIARY_STATUS] |= AUXILIARY_STATUS_DBR;
- }
- break;
+ case INIT_XFR:
+ if (ctrl & S_REQ) {
+ switch (m_xfr_phase) {
+ case S_PHASE_DATA_OUT:
+ if ((m_regs[CONTROL] & CONTROL_DM) != CONTROL_DM_POLLED) {
+ if(!data_fifo_full() && m_transfer_count > 0)
+ set_drq();
+ }
+ if (!data_fifo_empty()) {
+ set_scsi_state(INIT_XFR_WAIT_REQ);
+ delay(send_byte());
+ } else if ((m_regs[CONTROL] & CONTROL_DM) == CONTROL_DM_POLLED) {
+ m_regs[AUXILIARY_STATUS] |= AUXILIARY_STATUS_DBR;
+ }
+ break;
- case S_PHASE_COMMAND:
- if (!data_fifo_empty()) {
- uint32_t mask;
- if (sat) {
- mask = 0;
- }
- else {
- m_regs[AUXILIARY_STATUS] |= AUXILIARY_STATUS_DBR;
- mask = (m_transfer_count == 0 && m_data_fifo_size == 1) ? S_ATN : 0;
- }
- set_scsi_state(INIT_XFR_WAIT_REQ);
- cycles = send_byte(0, mask);
- }
- else if (!sat) {
+ case S_PHASE_COMMAND:
+ if (!data_fifo_empty()) {
+ uint32_t mask;
+ if (sat) {
+ mask = 0;
+ } else {
m_regs[AUXILIARY_STATUS] |= AUXILIARY_STATUS_DBR;
+ mask = (m_transfer_count == 0 && m_data_fifo_size == 1) ? S_ATN : 0;
}
- break;
+ set_scsi_state(INIT_XFR_WAIT_REQ);
+ delay(send_byte(0, mask));
+ } else if (!sat) {
+ m_regs[AUXILIARY_STATUS] |= AUXILIARY_STATUS_DBR;
+ }
+ break;
- case S_PHASE_MSG_OUT:
+ case S_PHASE_MSG_OUT:
+ if (sat) {
+ data_fifo_push(get_msg_out());
+ }
+ if (!data_fifo_empty()) {
+ uint32_t mask;
if (sat) {
- data_fifo_push(get_msg_out());
- }
- if (!data_fifo_empty()) {
- uint32_t mask;
- if (sat) {
- mask = S_ATN;
- }
- else {
- m_regs[AUXILIARY_STATUS] |= AUXILIARY_STATUS_DBR;
- mask = (m_transfer_count == 0 && m_data_fifo_size == 1) ? S_ATN : 0;
- }
- set_scsi_state(INIT_XFR_WAIT_REQ);
- cycles = send_byte(0, mask);
- }
- else if (!sat) {
+ mask = S_ATN;
+ } else {
m_regs[AUXILIARY_STATUS] |= AUXILIARY_STATUS_DBR;
+ mask = (m_transfer_count == 0 && m_data_fifo_size == 1) ? S_ATN : 0;
}
- break;
-
- case S_PHASE_DATA_IN:
- case S_PHASE_STATUS:
- case S_PHASE_MSG_IN:
- if (!data_fifo_full()) {
- // if it's the last message byte, ACK remains asserted, terminate with function_complete()
- //state = (m_xfr_phase == S_PHASE_MSG_IN && (!dma_command || tcounter == 1)) ? INIT_XFR_RECV_BYTE_NACK : INIT_XFR_RECV_BYTE_ACK;
- scsi_bus->ctrl_wait(scsi_refid, S_REQ, S_REQ);
- set_scsi_state((RECV_WAIT_REQ_1 << SUB_SHIFT) | INIT_XFR_RECV_BYTE_ACK);
- if (ctrl & S_REQ) {
- ++m_step_count;
- }
- }
- break;
+ set_scsi_state(INIT_XFR_WAIT_REQ);
+ delay(send_byte(0, mask));
+ } else if (!sat) {
+ m_regs[AUXILIARY_STATUS] |= AUXILIARY_STATUS_DBR;
+ }
+ break;
- default:
- fatalerror("%s: Invalid phase during INIT_XFR.\n", shortname());
- break;
+ case S_PHASE_DATA_IN:
+ case S_PHASE_STATUS:
+ case S_PHASE_MSG_IN:
+ if (!data_fifo_full()) {
+ // if it's the last message byte, ACK remains asserted, terminate with function_complete()
+ //state = (m_xfr_phase == S_PHASE_MSG_IN && (!dma_command || tcounter == 1)) ? INIT_XFR_RECV_BYTE_NACK : INIT_XFR_RECV_BYTE_ACK;
+ scsi_bus->ctrl_wait(scsi_refid, S_REQ, S_REQ);
+ set_scsi_state((RECV_WAIT_REQ_1 << SUB_SHIFT) | INIT_XFR_RECV_BYTE_ACK);
+ step(false);
}
+ break;
+
+ default:
+ fatalerror("%s: Invalid phase during INIT_XFR.\n", shortname());
+ break;
}
- break;
+ }
+ break;
- case INIT_XFR_WAIT_REQ:
- if (ctrl & S_REQ) {
- uint16_t next_state = m_scsi_state;
+ case INIT_XFR_WAIT_REQ:
+ if (ctrl & S_REQ) {
+ uint16_t next_state = m_scsi_state;
- const uint8_t xfr_phase = (ctrl & S_PHASE_MASK);
+ const uint8_t xfr_phase = (ctrl & S_PHASE_MASK);
- switch ((m_xfr_phase << 3) | xfr_phase) {
- case ((S_PHASE_MSG_OUT << 3) | S_PHASE_MSG_OUT):
- case ((S_PHASE_COMMAND << 3) | S_PHASE_COMMAND):
- case ((S_PHASE_MSG_IN << 3) | S_PHASE_MSG_IN):
- next_state = INIT_XFR;
- break;
+ switch ((m_xfr_phase << 3) | xfr_phase) {
+ case ((S_PHASE_MSG_OUT << 3) | S_PHASE_MSG_OUT):
+ case ((S_PHASE_COMMAND << 3) | S_PHASE_COMMAND):
+ case ((S_PHASE_MSG_IN << 3) | S_PHASE_MSG_IN):
+ next_state = INIT_XFR;
+ break;
- case ((S_PHASE_DATA_IN << 3) | S_PHASE_DATA_IN):
- case ((S_PHASE_DATA_OUT << 3) | S_PHASE_DATA_OUT):
- if (sat || cc == COMMAND_CC_TRANSFER_INFO) {
- if (m_transfer_count > 0 || (m_xfr_phase == S_PHASE_DATA_OUT && !data_fifo_empty())) {
- next_state = INIT_XFR;
- }
- else {
- next_state = FINISHED;
- uint8_t scsi_status;
- if (sat) {
- m_regs[COMMAND_PHASE] = COMMAND_PHASE_TRANSFER_COUNT;
- scsi_status = SCSI_STATUS_UNEXPECTED_PHASE;
- }
- else {
- scsi_status = SCSI_STATUS_TRANSFER_SUCCESS;
- }
- irq_fifo_push(scsi_status | m_xfr_phase);
- }
+ case ((S_PHASE_DATA_IN << 3) | S_PHASE_DATA_IN):
+ case ((S_PHASE_DATA_OUT << 3) | S_PHASE_DATA_OUT):
+ if (sat || cc == COMMAND_CC_TRANSFER_INFO) {
+ if (m_transfer_count > 0 || (m_xfr_phase == S_PHASE_DATA_OUT && !data_fifo_empty())) {
+ next_state = INIT_XFR;
}
else {
- fatalerror("%s: Unhandled command in data phase.\n", shortname());
next_state = FINISHED;
- }
- break;
-
- case ((S_PHASE_MSG_OUT << 3) | S_PHASE_COMMAND):
- case ((S_PHASE_COMMAND << 3) | S_PHASE_DATA_OUT):
- case ((S_PHASE_COMMAND << 3) | S_PHASE_DATA_IN):
- case ((S_PHASE_COMMAND << 3) | S_PHASE_STATUS):
- case ((S_PHASE_COMMAND << 3) | S_PHASE_MSG_IN):
- case ((S_PHASE_DATA_OUT << 3) | S_PHASE_STATUS):
- case ((S_PHASE_DATA_IN << 3) | S_PHASE_STATUS):
- case ((S_PHASE_STATUS << 3) | S_PHASE_MSG_IN):
- if (!(m_xfr_phase & 1) && !data_fifo_empty()) {
- fatalerror("%s: Data FIFO is not empty on phase transition.\n", shortname());
- }
-
- if (sat) {
- switch (xfr_phase) {
- case S_PHASE_MSG_OUT:
- next_state = INIT_XFR;
- break;
-
- case S_PHASE_COMMAND:
- next_state = INIT_XFR;
- m_regs[COMMAND_PHASE] = COMMAND_PHASE_CP_BYTES_0;
- LOGMASKED(LOG_COMMANDS, "%s: Sending Command:", shortname());
- for (uint8_t i = 0; i < m_command_length; ++i) {
- const uint8_t command_byte = m_regs[CDB_1 + i];
- LOGMASKED(LOG_COMMANDS, " %02x", command_byte);
- data_fifo_push(command_byte);
- }
- LOGMASKED(LOG_COMMANDS, " (%d)\n", m_transfer_count);
- break;
-
- case S_PHASE_DATA_OUT:
- case S_PHASE_DATA_IN:
- next_state = INIT_XFR;
- break;
-
- case S_PHASE_STATUS:
- next_state = INIT_XFR;
- m_regs[COMMAND_PHASE] = COMMAND_PHASE_RECEIVE_STATUS;
- break;
-
- case S_PHASE_MSG_IN:
- next_state = INIT_XFR;
- break;
-
- default:
- fatalerror("%s: Unhandled phase in Select-w/Atn-and-Transfer.\n", shortname());
- next_state = FINISHED;
- break;
+ uint8_t scsi_status;
+ if (sat) {
+ m_regs[COMMAND_PHASE] = COMMAND_PHASE_TRANSFER_COUNT;
+ scsi_status = SCSI_STATUS_UNEXPECTED_PHASE;
}
+ else {
+ scsi_status = SCSI_STATUS_TRANSFER_SUCCESS;
+ }
+ irq_fifo_push(scsi_status | m_xfr_phase);
}
- else if (cc == COMMAND_CC_TRANSFER_INFO) {
- next_state = FINISHED;
- irq_fifo_push(SCSI_STATUS_TRANSFER_SUCCESS | xfr_phase);
- }
- else {
- fatalerror("%s: Unhandled command in data phase.\n", shortname());
- next_state = FINISHED;
- }
- break;
-
- default:
- fatalerror("%s: Unhandled phase transition in INIT_XFR_WAIT_REQ.\n", shortname());
+ }
+ else {
+ fatalerror("%s: Unhandled command in data phase.\n", shortname());
next_state = FINISHED;
- break;
}
+ break;
- if (next_state != m_scsi_state) {
- set_scsi_state(next_state);
- ++m_step_count;
- m_xfr_phase = xfr_phase;
+ case ((S_PHASE_MSG_OUT << 3) | S_PHASE_COMMAND):
+ case ((S_PHASE_COMMAND << 3) | S_PHASE_DATA_OUT):
+ case ((S_PHASE_COMMAND << 3) | S_PHASE_DATA_IN):
+ case ((S_PHASE_COMMAND << 3) | S_PHASE_STATUS):
+ case ((S_PHASE_COMMAND << 3) | S_PHASE_MSG_IN):
+ case ((S_PHASE_DATA_OUT << 3) | S_PHASE_STATUS):
+ case ((S_PHASE_DATA_IN << 3) | S_PHASE_STATUS):
+ case ((S_PHASE_STATUS << 3) | S_PHASE_MSG_IN):
+ if (!(m_xfr_phase & 1) && !data_fifo_empty()) {
+ fatalerror("%s: Data FIFO is not empty on phase transition.\n", shortname());
}
- }
- break;
- case INIT_XFR_RECV_BYTE_ACK:
- if (sat && m_xfr_phase == S_PHASE_MSG_IN) {
- const uint8_t msg = data_fifo_pop();
- if (m_regs[COMMAND_PHASE] <= COMMAND_PHASE_CP_BYTES_C) {
- switch (msg) {
- case SM_SAVE_DATA_PTR:
- set_scsi_state(FINISHED);
- irq_fifo_push(SCSI_STATUS_SAVE_DATA_POINTERS);
- m_regs[COMMAND_PHASE] = COMMAND_PHASE_SAVE_DATA_POINTER;
+ if (sat) {
+ switch (xfr_phase) {
+ case S_PHASE_MSG_OUT:
+ next_state = INIT_XFR;
break;
- case SM_DISCONNECT:
- m_regs[COMMAND_PHASE] = COMMAND_PHASE_DISCONNECT_MESSAGE;
+ case S_PHASE_COMMAND: {
+ next_state = INIT_XFR;
+ m_regs[COMMAND_PHASE] = COMMAND_PHASE_CP_BYTES_0;
+ std::string cmd;
+ for (uint8_t i = 0; i < m_command_length; ++i) {
+ const uint8_t command_byte = m_regs[CDB_1 + i];
+ cmd += util::string_format(" %02x", command_byte);
+ data_fifo_push(command_byte);
+ }
+ LOGMASKED(LOG_COMMANDS, "Sending command:%s (%d)\n", cmd, m_transfer_count);
break;
+ }
- default:
- fatalerror("%s: Unhandled MSG_IN.\n", shortname());
+ case S_PHASE_DATA_OUT:
+ case S_PHASE_DATA_IN:
+ next_state = INIT_XFR;
break;
- }
- }
- else if (m_regs[COMMAND_PHASE] < COMMAND_PHASE_COMMAND_COMPLETE) {
- switch (msg) {
- case SM_COMMAND_COMPLETE:
- set_scsi_state(FINISHED);
- irq_fifo_push(SCSI_STATUS_SELECT_TRANSFER_SUCCESS);
- m_regs[COMMAND_PHASE] = COMMAND_PHASE_COMMAND_COMPLETE;
+
+ case S_PHASE_STATUS:
+ next_state = INIT_XFR;
+ m_regs[COMMAND_PHASE] = COMMAND_PHASE_RECEIVE_STATUS;
break;
+
+ case S_PHASE_MSG_IN:
+ next_state = INIT_XFR;
+ break;
+
default:
- fatalerror("%s: Unhandled MSG_IN.\n", shortname());
+ fatalerror("%s: Unhandled phase in Select-w/Atn-and-Transfer.\n", shortname());
+ next_state = FINISHED;
break;
}
}
+ else if (cc == COMMAND_CC_TRANSFER_INFO) {
+ next_state = FINISHED;
+ irq_fifo_push(SCSI_STATUS_TRANSFER_SUCCESS | xfr_phase);
+ }
+ else {
+ fatalerror("%s: Unhandled command in data phase.\n", shortname());
+ next_state = FINISHED;
+ }
+ break;
+
+ default:
+ fatalerror("%s: Unhandled phase transition in INIT_XFR_WAIT_REQ.\n", shortname());
+ next_state = FINISHED;
+ break;
}
- else {
- set_scsi_state(INIT_XFR_WAIT_REQ);
- }
- scsi_bus->ctrl_w(scsi_refid, 0, S_ACK);
- ++m_step_count;
- break;
- default:
- fatalerror("%s: Unhandled state in step.\n", shortname());
- break;
+ if (next_state != m_scsi_state) {
+ set_scsi_state(next_state);
+ m_xfr_phase = xfr_phase;
+ step(false);
+ }
}
+ break;
+
+ case INIT_XFR_RECV_BYTE_ACK:
+ if (sat && m_xfr_phase == S_PHASE_MSG_IN) {
+ if (m_regs[COMMAND_PHASE] <= COMMAND_PHASE_CP_BYTES_C) {
+ switch (m_last_message) {
+ case SM_SAVE_DATA_PTR:
+ set_scsi_state(FINISHED);
+ irq_fifo_push(SCSI_STATUS_SAVE_DATA_POINTERS);
+ m_regs[COMMAND_PHASE] = COMMAND_PHASE_SAVE_DATA_POINTER;
+ break;
- timeout = false;
+ case SM_DISCONNECT:
+ m_regs[COMMAND_PHASE] = COMMAND_PHASE_DISCONNECT_MESSAGE;
+ break;
- } while (--m_step_count);
+ default:
+ fatalerror("%s: Unhandled MSG_IN %02x.\n", shortname(), m_last_message);
+ break;
+ }
+ } else if (m_regs[COMMAND_PHASE] < COMMAND_PHASE_COMMAND_COMPLETE) {
+ switch (m_last_message) {
+ case SM_COMMAND_COMPLETE:
+ set_scsi_state(FINISHED);
+ irq_fifo_push(SCSI_STATUS_SELECT_TRANSFER_SUCCESS);
+ m_regs[COMMAND_PHASE] = COMMAND_PHASE_COMMAND_COMPLETE;
+ break;
+ default:
+ fatalerror("%s: Unhandled MSG_IN %02x.\n", shortname(), m_last_message);
+ break;
+ }
+ }
+ } else {
+ set_scsi_state(INIT_XFR_WAIT_REQ);
+ }
+ scsi_bus->ctrl_w(scsi_refid, 0, S_ACK);
+ step(false);
+ break;
- if (cycles) {
- delay(cycles);
+ default:
+ fatalerror("%s: Unhandled state in step.\n", shortname());
+ break;
}
}
@@ -1390,7 +1390,7 @@ void wd33c9x_base_device::load_transfer_count()
m_transfer_count = 1;
}
}
- LOGMASKED(LOG_COMMANDS, "%s: Transfer Count %d bytes\n", shortname(), m_transfer_count);
+ LOGMASKED(LOG_COMMANDS, "Transfer Count %d bytes\n", m_transfer_count);
}
@@ -1499,7 +1499,9 @@ uint32_t wd33c9x_base_device::send_byte(const uint32_t value, const uint32_t mas
void wd33c9x_base_device::set_scsi_state(uint16_t state)
{
- LOGMASKED(LOG_STEP, "%s: SCSI state change: %x to %x\n", shortname(), m_scsi_state, state);
+ LOGMASKED(LOG_STEP, "SCSI state change: %s.%s to %s.%s\n",
+ state_names[m_scsi_state & STATE_MASK], substate_names[m_scsi_state >> SUB_SHIFT],
+ state_names[state & STATE_MASK], substate_names[state >> SUB_SHIFT]);
m_scsi_state = state;
}
@@ -1588,7 +1590,7 @@ void wd33c9x_base_device::update_irq()
{
if (m_regs[AUXILIARY_STATUS] & AUXILIARY_STATUS_INT) {
m_regs[AUXILIARY_STATUS] &= ~AUXILIARY_STATUS_INT;
- LOGMASKED(LOG_LINES, "%s: Clearing IRQ\n", shortname());
+ LOGMASKED(LOG_LINES, "Clearing IRQ\n");
m_irq_cb(CLEAR_LINE);
}
if (!irq_fifo_empty()) {
@@ -1612,7 +1614,7 @@ void wd33c9x_base_device::update_irq()
}
}
- LOGMASKED(LOG_LINES, "%s: Asserting IRQ - SCSI Status (%02x)\n", shortname(), m_regs[SCSI_STATUS]);
+ LOGMASKED(LOG_LINES, "Asserting IRQ - SCSI Status (%02x)\n", m_regs[SCSI_STATUS]);
m_irq_cb(ASSERT_LINE);
}
}
@@ -1625,7 +1627,7 @@ void wd33c9x_base_device::update_irq()
void wd33c9x_base_device::set_drq()
{
if (!m_drq_state) {
- LOGMASKED(LOG_LINES, "%s: Asserting DRQ\n", shortname());
+ LOGMASKED(LOG_LINES, "Asserting DRQ\n");
m_drq_state = true;
m_drq_cb(ASSERT_LINE);
}
@@ -1639,7 +1641,7 @@ void wd33c9x_base_device::set_drq()
void wd33c9x_base_device::clear_drq()
{
if (m_drq_state) {
- LOGMASKED(LOG_LINES, "%s: Clearing DRQ\n", shortname());
+ LOGMASKED(LOG_LINES, "Clearing DRQ\n");
m_drq_state = false;
m_drq_cb(CLEAR_LINE);
}
@@ -1678,15 +1680,13 @@ bool wd33c9x_base_device::set_command_length(const uint8_t cc)
if (eaf && (cc == COMMAND_CC_SELECT_TRANSFER || cc == COMMAND_CC_SELECT_ATN_TRANSFER)) {
m_command_length &= OWN_ID_CDB_SIZE;
ret = true;
- }
- else if (eaf && cc == COMMAND_CC_WAIT_SELECT_RECEIVE_DATA) {
+ } else if (eaf && cc == COMMAND_CC_WAIT_SELECT_RECEIVE_DATA) {
m_command_length = 6;
m_regs[COMMAND_PHASE] = COMMAND_PHASE_CP_BYTES_1;
irq_fifo_push(SCSI_STATUS_NEED_COMMAND_SIZE);
update_irq();
ret = false;
- }
- else {
+ } else {
switch (m_regs[CDB_1] >> 5) {
default:
case 0: m_command_length = 6; break;
@@ -1695,7 +1695,7 @@ bool wd33c9x_base_device::set_command_length(const uint8_t cc)
}
ret = true;
}
- LOGMASKED(LOG_COMMANDS, "%s: SCSI Command Length %d bytes\n", shortname(), m_command_length);
+ LOGMASKED(LOG_COMMANDS, "SCSI Command Length %d bytes\n", m_command_length);
return ret;
}
@@ -1715,8 +1715,8 @@ wd33c92_device::wd33c92_device(const machine_config &mconfig, const char *tag, d
{
}
-wd33c93n_device::wd33c93n_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
- : wd33c9x_base_device(mconfig, WD33C93N, tag, owner, clock)
+wd33c93_device::wd33c93_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+ : wd33c9x_base_device(mconfig, WD33C93, tag, owner, clock)
{
}
diff --git a/src/devices/machine/wd33c9x.h b/src/devices/machine/wd33c9x.h
index d5f3b5a5da4..65e97852e00 100644
--- a/src/devices/machine/wd33c9x.h
+++ b/src/devices/machine/wd33c9x.h
@@ -18,18 +18,18 @@ public:
auto drq_cb() { return m_drq_cb.bind(); }
// Direct Addressing Interface
- DECLARE_READ8_MEMBER(dir_r);
- DECLARE_WRITE8_MEMBER(dir_w);
+ uint8_t dir_r(offs_t offset);
+ void dir_w(offs_t offset, uint8_t data);
// Indirect Addressing Interface
- DECLARE_READ8_MEMBER(indir_r);
- DECLARE_WRITE8_MEMBER(indir_w);
+ uint8_t indir_r(offs_t offset);
+ void indir_w(offs_t offset, uint8_t data);
// Alternative Indirect Addressing Interface
- DECLARE_READ8_MEMBER(indir_addr_r);
- DECLARE_WRITE8_MEMBER(indir_addr_w);
- DECLARE_READ8_MEMBER(indir_reg_r);
- DECLARE_WRITE8_MEMBER(indir_reg_w);
+ uint8_t indir_addr_r();
+ void indir_addr_w(uint8_t data);
+ uint8_t indir_reg_r();
+ void indir_reg_w(uint8_t data);
// Master Reset (MR) Interface
DECLARE_WRITE_LINE_MEMBER(reset_w);
@@ -48,11 +48,14 @@ protected:
virtual void scsi_ctrl_changed() override;
private:
+ static const char *const state_names[];
+ static const char *const substate_names[];
static constexpr uint8_t NUM_REGS = 0x20;
static constexpr uint8_t REGS_MASK = NUM_REGS - 1;
uint8_t m_addr;
uint8_t m_regs[NUM_REGS];
uint8_t m_command_length;
+ uint8_t m_last_message;
void start_command();
@@ -62,7 +65,6 @@ private:
uint16_t m_scsi_state;
uint8_t m_mode;
uint8_t m_xfr_phase;
- uint8_t m_step_count;
void load_transfer_count();
bool decrement_transfer_count();
@@ -117,15 +119,15 @@ public:
wd33c92_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
};
-class wd33c93n_device : public wd33c9x_base_device
+class wd33c93_device : public wd33c9x_base_device
{
public:
- wd33c93n_device(const machine_config &mconfig, const char *tag, device_t *owner)
- : wd33c93n_device(mconfig, tag, owner, 0)
+ wd33c93_device(const machine_config &mconfig, const char *tag, device_t *owner)
+ : wd33c93_device(mconfig, tag, owner, 0)
{
}
- wd33c93n_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+ wd33c93_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
};
class wd33c93a_device : public wd33c9x_base_device
@@ -151,8 +153,8 @@ public:
};
-DECLARE_DEVICE_TYPE(WD33C92, wd33c92_device)
-DECLARE_DEVICE_TYPE(WD33C93N, wd33c93n_device)
+DECLARE_DEVICE_TYPE(WD33C92, wd33c92_device)
+DECLARE_DEVICE_TYPE(WD33C93, wd33c93_device)
DECLARE_DEVICE_TYPE(WD33C93A, wd33c93a_device)
DECLARE_DEVICE_TYPE(WD33C93B, wd33c93b_device)
diff --git a/src/devices/machine/wd7600.cpp b/src/devices/machine/wd7600.cpp
index 9c018fede8e..373c371cb5f 100644
--- a/src/devices/machine/wd7600.cpp
+++ b/src/devices/machine/wd7600.cpp
@@ -159,46 +159,46 @@ void wd7600_device::device_start()
if (m_space_io->data_width() == 16)
{
// FIXME: are all these address ranges correct?
- m_space_io->install_readwrite_handler(0x0000, 0x000f, read8_delegate(FUNC(am9517a_device::read), &(*m_dma1)), write8_delegate(FUNC(am9517a_device::write), &(*m_dma1)), 0xffff);
+ m_space_io->install_readwrite_handler(0x0000, 0x000f, read8sm_delegate(FUNC(am9517a_device::read), &(*m_dma1)), write8sm_delegate(FUNC(am9517a_device::write), &(*m_dma1)), 0xffff);
m_space_io->install_readwrite_handler(0x0020, 0x003f, read8sm_delegate(FUNC(pic8259_device::read), &(*m_pic1)), write8sm_delegate(FUNC(pic8259_device::write), &(*m_pic1)), 0xffff);
m_space_io->install_readwrite_handler(0x0040, 0x0043, read8sm_delegate(FUNC(pit8254_device::read), &(*m_ctc)), write8sm_delegate(FUNC(pit8254_device::write), &(*m_ctc)), 0xffff);
- m_space_io->install_readwrite_handler(0x0060, 0x0061, read8_delegate(FUNC(wd7600_device::keyb_data_r), this), write8_delegate(FUNC(wd7600_device::keyb_data_w), this), 0x00ff);
- m_space_io->install_readwrite_handler(0x0060, 0x0061, read8_delegate(FUNC(wd7600_device::portb_r), this), write8_delegate(FUNC(wd7600_device::portb_w), this), 0xff00);
- m_space_io->install_readwrite_handler(0x0064, 0x0065, read8_delegate(FUNC(wd7600_device::keyb_status_r), this), write8_delegate(FUNC(wd7600_device::keyb_cmd_w), this), 0x00ff);
- m_space_io->install_readwrite_handler(0x0070, 0x007f, read8_delegate(FUNC(mc146818_device::read), &(*m_rtc)), write8_delegate(FUNC(wd7600_device::rtc_w), this), 0xffff);
- m_space_io->install_readwrite_handler(0x0080, 0x008f, read8_delegate(FUNC(wd7600_device::dma_page_r), this), write8_delegate(FUNC(wd7600_device::dma_page_w), this), 0xffff);
- m_space_io->install_readwrite_handler(0x0092, 0x0093, read8_delegate(FUNC(wd7600_device::a20_reset_r), this), write8_delegate(FUNC(wd7600_device::a20_reset_w), this), 0x00ff);
+ m_space_io->install_readwrite_handler(0x0060, 0x0061, read8smo_delegate(FUNC(wd7600_device::keyb_data_r), this), write8smo_delegate(FUNC(wd7600_device::keyb_data_w), this), 0x00ff);
+ m_space_io->install_readwrite_handler(0x0060, 0x0061, read8smo_delegate(FUNC(wd7600_device::portb_r), this), write8smo_delegate(FUNC(wd7600_device::portb_w), this), 0xff00);
+ m_space_io->install_readwrite_handler(0x0064, 0x0065, read8smo_delegate(FUNC(wd7600_device::keyb_status_r), this), write8smo_delegate(FUNC(wd7600_device::keyb_cmd_w), this), 0x00ff);
+ m_space_io->install_readwrite_handler(0x0070, 0x007f, read8sm_delegate(FUNC(mc146818_device::read), &(*m_rtc)), write8sm_delegate(FUNC(wd7600_device::rtc_w), this), 0xffff);
+ m_space_io->install_readwrite_handler(0x0080, 0x008f, read8sm_delegate(FUNC(wd7600_device::dma_page_r), this), write8sm_delegate(FUNC(wd7600_device::dma_page_w), this), 0xffff);
+ m_space_io->install_readwrite_handler(0x0092, 0x0093, read8smo_delegate(FUNC(wd7600_device::a20_reset_r), this), write8smo_delegate(FUNC(wd7600_device::a20_reset_w), this), 0x00ff);
m_space_io->install_readwrite_handler(0x00a0, 0x00a3, read8sm_delegate(FUNC(pic8259_device::read), &(*m_pic2)), write8sm_delegate(FUNC(pic8259_device::write), &(*m_pic2)), 0xffff);
- m_space_io->install_readwrite_handler(0x00c0, 0x00df, read8_delegate(FUNC(am9517a_device::read), &(*m_dma2)), write8_delegate(FUNC(am9517a_device::write), &(*m_dma2)), 0x00ff);
- m_space_io->install_readwrite_handler(0x2072, 0x2073, read16_delegate(FUNC(wd7600_device::refresh_r), this), write16_delegate(FUNC(wd7600_device::refresh_w), this));
- m_space_io->install_readwrite_handler(0x2872, 0x2873, read16_delegate(FUNC(wd7600_device::chipsel_r), this), write16_delegate(FUNC(wd7600_device::chipsel_w), this));
- m_space_io->install_readwrite_handler(0x3872, 0x3873, read16_delegate(FUNC(wd7600_device::mem_ctrl_r), this), write16_delegate(FUNC(wd7600_device::mem_ctrl_w), this));
- m_space_io->install_readwrite_handler(0x4872, 0x4873, read16_delegate(FUNC(wd7600_device::bank_01_start_r), this), write16_delegate(FUNC(wd7600_device::bank_01_start_w), this));
- m_space_io->install_readwrite_handler(0x5072, 0x5073, read16_delegate(FUNC(wd7600_device::bank_23_start_r), this), write16_delegate(FUNC(wd7600_device::bank_23_start_w), this));
- m_space_io->install_readwrite_handler(0x5872, 0x5873, read16_delegate(FUNC(wd7600_device::split_addr_r), this), write16_delegate(FUNC(wd7600_device::split_addr_w), this));
- m_space_io->install_readwrite_handler(0x9872, 0x9873, read16_delegate(FUNC(wd7600_device::diag_r), this), write16_delegate(FUNC(wd7600_device::diag_w), this));
+ m_space_io->install_readwrite_handler(0x00c0, 0x00df, read8sm_delegate(FUNC(am9517a_device::read), &(*m_dma2)), write8sm_delegate(FUNC(am9517a_device::write), &(*m_dma2)), 0x00ff);
+ m_space_io->install_readwrite_handler(0x2072, 0x2073, read16smo_delegate(FUNC(wd7600_device::refresh_r), this), write16smo_delegate(FUNC(wd7600_device::refresh_w), this));
+ m_space_io->install_readwrite_handler(0x2872, 0x2873, read16smo_delegate(FUNC(wd7600_device::chipsel_r), this), write16smo_delegate(FUNC(wd7600_device::chipsel_w), this));
+ m_space_io->install_readwrite_handler(0x3872, 0x3873, read16smo_delegate(FUNC(wd7600_device::mem_ctrl_r), this), write16smo_delegate(FUNC(wd7600_device::mem_ctrl_w), this));
+ m_space_io->install_readwrite_handler(0x4872, 0x4873, read16s_delegate(FUNC(wd7600_device::bank_01_start_r), this), write16s_delegate(FUNC(wd7600_device::bank_01_start_w), this));
+ m_space_io->install_readwrite_handler(0x5072, 0x5073, read16s_delegate(FUNC(wd7600_device::bank_23_start_r), this), write16s_delegate(FUNC(wd7600_device::bank_23_start_w), this));
+ m_space_io->install_readwrite_handler(0x5872, 0x5873, read16smo_delegate(FUNC(wd7600_device::split_addr_r), this), write16smo_delegate(FUNC(wd7600_device::split_addr_w), this));
+ m_space_io->install_readwrite_handler(0x9872, 0x9873, read16smo_delegate(FUNC(wd7600_device::diag_r), this), write16smo_delegate(FUNC(wd7600_device::diag_w), this));
}
else
{
assert(m_space_io->data_width() == 32);
- m_space_io->install_readwrite_handler(0x0000, 0x000f, read8_delegate(FUNC(am9517a_device::read), &(*m_dma1)), write8_delegate(FUNC(am9517a_device::write), &(*m_dma1)), 0xffffffff);
+ m_space_io->install_readwrite_handler(0x0000, 0x000f, read8sm_delegate(FUNC(am9517a_device::read), &(*m_dma1)), write8sm_delegate(FUNC(am9517a_device::write), &(*m_dma1)), 0xffffffff);
m_space_io->install_readwrite_handler(0x0020, 0x003f, read8sm_delegate(FUNC(pic8259_device::read), &(*m_pic1)), write8sm_delegate(FUNC(pic8259_device::write), &(*m_pic1)), 0x0000ffff);
m_space_io->install_readwrite_handler(0x0040, 0x0043, read8sm_delegate(FUNC(pit8254_device::read), &(*m_ctc)), write8sm_delegate(FUNC(pit8254_device::write), &(*m_ctc)), 0xffffffff);
- m_space_io->install_readwrite_handler(0x0060, 0x0063, read8_delegate(FUNC(wd7600_device::keyb_data_r), this), write8_delegate(FUNC(wd7600_device::keyb_data_w), this), 0x000000ff);
- m_space_io->install_readwrite_handler(0x0060, 0x0063, read8_delegate(FUNC(wd7600_device::portb_r), this), write8_delegate(FUNC(wd7600_device::portb_w), this), 0x0000ff00);
- m_space_io->install_readwrite_handler(0x0064, 0x0067, read8_delegate(FUNC(wd7600_device::keyb_status_r), this), write8_delegate(FUNC(wd7600_device::keyb_cmd_w), this), 0x000000ff);
- m_space_io->install_readwrite_handler(0x0070, 0x007f, read8_delegate(FUNC(mc146818_device::read), &(*m_rtc)), write8_delegate(FUNC(wd7600_device::rtc_w), this), 0x0000ffff);
- m_space_io->install_readwrite_handler(0x0080, 0x008f, read8_delegate(FUNC(wd7600_device::dma_page_r), this), write8_delegate(FUNC(wd7600_device::dma_page_w), this), 0xffffffff);
- m_space_io->install_readwrite_handler(0x0090, 0x0093, read8_delegate(FUNC(wd7600_device::a20_reset_r), this), write8_delegate(FUNC(wd7600_device::a20_reset_w), this), 0x00ff0000);
+ m_space_io->install_readwrite_handler(0x0060, 0x0063, read8smo_delegate(FUNC(wd7600_device::keyb_data_r), this), write8smo_delegate(FUNC(wd7600_device::keyb_data_w), this), 0x000000ff);
+ m_space_io->install_readwrite_handler(0x0060, 0x0063, read8smo_delegate(FUNC(wd7600_device::portb_r), this), write8smo_delegate(FUNC(wd7600_device::portb_w), this), 0x0000ff00);
+ m_space_io->install_readwrite_handler(0x0064, 0x0067, read8smo_delegate(FUNC(wd7600_device::keyb_status_r), this), write8smo_delegate(FUNC(wd7600_device::keyb_cmd_w), this), 0x000000ff);
+ m_space_io->install_readwrite_handler(0x0070, 0x007f, read8sm_delegate(FUNC(mc146818_device::read), &(*m_rtc)), write8sm_delegate(FUNC(wd7600_device::rtc_w), this), 0x0000ffff);
+ m_space_io->install_readwrite_handler(0x0080, 0x008f, read8sm_delegate(FUNC(wd7600_device::dma_page_r), this), write8sm_delegate(FUNC(wd7600_device::dma_page_w), this), 0xffffffff);
+ m_space_io->install_readwrite_handler(0x0090, 0x0093, read8smo_delegate(FUNC(wd7600_device::a20_reset_r), this), write8smo_delegate(FUNC(wd7600_device::a20_reset_w), this), 0x00ff0000);
m_space_io->install_readwrite_handler(0x00a0, 0x00a3, read8sm_delegate(FUNC(pic8259_device::read), &(*m_pic2)), write8sm_delegate(FUNC(pic8259_device::write), &(*m_pic2)), 0x0000ffff);
- m_space_io->install_readwrite_handler(0x00c0, 0x00df, read8_delegate(FUNC(am9517a_device::read), &(*m_dma2)), write8_delegate(FUNC(am9517a_device::write), &(*m_dma2)), 0x00ff00ff);
- m_space_io->install_readwrite_handler(0x2070, 0x2073, read16_delegate(FUNC(wd7600_device::refresh_r), this), write16_delegate(FUNC(wd7600_device::refresh_w), this), 0xffff0000);
- m_space_io->install_readwrite_handler(0x2870, 0x2873, read16_delegate(FUNC(wd7600_device::chipsel_r), this), write16_delegate(FUNC(wd7600_device::chipsel_w), this), 0xffff0000);
- m_space_io->install_readwrite_handler(0x3870, 0x3873, read16_delegate(FUNC(wd7600_device::mem_ctrl_r), this), write16_delegate(FUNC(wd7600_device::mem_ctrl_w), this), 0xffff0000);
- m_space_io->install_readwrite_handler(0x4870, 0x4873, read16_delegate(FUNC(wd7600_device::bank_01_start_r), this), write16_delegate(FUNC(wd7600_device::bank_01_start_w), this), 0xffff0000);
- m_space_io->install_readwrite_handler(0x5070, 0x5073, read16_delegate(FUNC(wd7600_device::bank_23_start_r), this), write16_delegate(FUNC(wd7600_device::bank_23_start_w), this), 0xffff0000);
- m_space_io->install_readwrite_handler(0x5870, 0x5873, read16_delegate(FUNC(wd7600_device::split_addr_r), this), write16_delegate(FUNC(wd7600_device::split_addr_w), this), 0xffff0000);
- m_space_io->install_readwrite_handler(0x9870, 0x9873, read16_delegate(FUNC(wd7600_device::diag_r), this), write16_delegate(FUNC(wd7600_device::diag_w), this), 0xffff0000);
+ m_space_io->install_readwrite_handler(0x00c0, 0x00df, read8sm_delegate(FUNC(am9517a_device::read), &(*m_dma2)), write8sm_delegate(FUNC(am9517a_device::write), &(*m_dma2)), 0x00ff00ff);
+ m_space_io->install_readwrite_handler(0x2070, 0x2073, read16smo_delegate(FUNC(wd7600_device::refresh_r), this), write16smo_delegate(FUNC(wd7600_device::refresh_w), this), 0xffff0000);
+ m_space_io->install_readwrite_handler(0x2870, 0x2873, read16smo_delegate(FUNC(wd7600_device::chipsel_r), this), write16smo_delegate(FUNC(wd7600_device::chipsel_w), this), 0xffff0000);
+ m_space_io->install_readwrite_handler(0x3870, 0x3873, read16smo_delegate(FUNC(wd7600_device::mem_ctrl_r), this), write16smo_delegate(FUNC(wd7600_device::mem_ctrl_w), this), 0xffff0000);
+ m_space_io->install_readwrite_handler(0x4870, 0x4873, read16s_delegate(FUNC(wd7600_device::bank_01_start_r), this), write16s_delegate(FUNC(wd7600_device::bank_01_start_w), this), 0xffff0000);
+ m_space_io->install_readwrite_handler(0x5070, 0x5073, read16s_delegate(FUNC(wd7600_device::bank_23_start_r), this), write16s_delegate(FUNC(wd7600_device::bank_23_start_w), this), 0xffff0000);
+ m_space_io->install_readwrite_handler(0x5870, 0x5873, read16smo_delegate(FUNC(wd7600_device::split_addr_r), this), write16smo_delegate(FUNC(wd7600_device::split_addr_w), this), 0xffff0000);
+ m_space_io->install_readwrite_handler(0x9870, 0x9873, read16smo_delegate(FUNC(wd7600_device::diag_r), this), write16smo_delegate(FUNC(wd7600_device::diag_w), this), 0xffff0000);
}
}
@@ -255,7 +255,7 @@ void wd7600_device::keyboard_gatea20(int state)
a20m();
}
-WRITE8_MEMBER( wd7600_device::rtc_w )
+void wd7600_device::rtc_w(offs_t offset, uint8_t data)
{
if (offset == 0)
{
@@ -263,10 +263,10 @@ WRITE8_MEMBER( wd7600_device::rtc_w )
data &= 0x7f;
}
- m_rtc->write(space, offset, data);
+ m_rtc->write(offset, data);
}
-READ8_MEMBER( wd7600_device::pic1_slave_ack_r )
+uint8_t wd7600_device::pic1_slave_ack_r(offs_t offset)
{
if (offset == 2) // IRQ 2
return m_pic2->acknowledge();
@@ -288,36 +288,36 @@ WRITE_LINE_MEMBER( wd7600_device::ctc_out2_w )
}
// Keyboard
-WRITE8_MEMBER( wd7600_device::keyb_data_w )
+void wd7600_device::keyb_data_w(uint8_t data)
{
// LOG("WD7600: keyboard data write %02x\n", data);
- m_keybc->data_w(space,0,data);
+ m_keybc->data_w(data);
}
-READ8_MEMBER( wd7600_device::keyb_data_r )
+uint8_t wd7600_device::keyb_data_r()
{
- uint8_t ret = m_keybc->data_r(space,0);
+ uint8_t ret = m_keybc->data_r();
// LOG("WD7600: keyboard data read %02x\n", ret);
return ret;
}
-WRITE8_MEMBER( wd7600_device::keyb_cmd_w )
+void wd7600_device::keyb_cmd_w(uint8_t data)
{
// LOG("WD7600: keyboard command %02x\n", data);
- m_keybc->command_w(space,0,data);
+ m_keybc->command_w(data);
}
-READ8_MEMBER( wd7600_device::keyb_status_r )
+uint8_t wd7600_device::keyb_status_r()
{
- return m_keybc->status_r(space,0);
+ return m_keybc->status_r();
}
-READ8_MEMBER( wd7600_device::portb_r )
+uint8_t wd7600_device::portb_r()
{
return m_portb;
}
-WRITE8_MEMBER( wd7600_device::portb_w )
+void wd7600_device::portb_w(uint8_t data)
{
m_portb = (m_portb & 0xf0) | (data & 0x0f);
@@ -352,7 +352,7 @@ offs_t wd7600_device::page_offset()
return 0xff0000;
}
-READ8_MEMBER( wd7600_device::dma_read_byte )
+uint8_t wd7600_device::dma_read_byte(offs_t offset)
{
if (m_dma_channel == -1)
return 0xff;
@@ -360,7 +360,7 @@ READ8_MEMBER( wd7600_device::dma_read_byte )
return m_space->read_byte(page_offset() + offset);
}
-WRITE8_MEMBER( wd7600_device::dma_write_byte )
+void wd7600_device::dma_write_byte(offs_t offset, uint8_t data)
{
if (m_dma_channel == -1)
return;
@@ -368,7 +368,7 @@ WRITE8_MEMBER( wd7600_device::dma_write_byte )
m_space->write_byte(page_offset() + offset, data);
}
-READ8_MEMBER( wd7600_device::dma_read_word )
+uint8_t wd7600_device::dma_read_word(offs_t offset)
{
if (m_dma_channel == -1)
return 0xff;
@@ -379,7 +379,7 @@ READ8_MEMBER( wd7600_device::dma_read_word )
return result;
}
-WRITE8_MEMBER( wd7600_device::dma_write_word )
+void wd7600_device::dma_write_word(offs_t offset, uint8_t data)
{
if (m_dma_channel == -1)
return;
@@ -401,6 +401,8 @@ WRITE_LINE_MEMBER( wd7600_device::dma1_eop_w )
void wd7600_device::set_dma_channel(int channel, bool state)
{
+ //m_write_dack(channel, state);
+
if (!state)
{
m_dma_channel = channel;
@@ -438,7 +440,7 @@ WRITE_LINE_MEMBER( wd7600_device::kbrst_w )
m_kbrst = state;
}
-WRITE8_MEMBER( wd7600_device::a20_reset_w )
+void wd7600_device::a20_reset_w(uint8_t data)
{
m_alt_a20 = BIT(data,1);
a20m();
@@ -451,7 +453,7 @@ WRITE8_MEMBER( wd7600_device::a20_reset_w )
}
}
-READ8_MEMBER( wd7600_device::a20_reset_r )
+uint8_t wd7600_device::a20_reset_r()
{
uint8_t ret = 0;
if(m_alt_a20)
@@ -460,12 +462,12 @@ READ8_MEMBER( wd7600_device::a20_reset_r )
}
// port 0x2072 - Refresh Control, and serial/parallel port address select
-READ16_MEMBER(wd7600_device::refresh_r)
+uint16_t wd7600_device::refresh_r()
{
return m_refresh_ctrl;
}
-WRITE16_MEMBER(wd7600_device::refresh_w)
+void wd7600_device::refresh_w(uint16_t data)
{
// TODO: select serial/parallel I/O port location
m_refresh_ctrl = data;
@@ -473,36 +475,36 @@ WRITE16_MEMBER(wd7600_device::refresh_w)
}
// port 0x2872 - chip select
-READ16_MEMBER(wd7600_device::chipsel_r)
+uint16_t wd7600_device::chipsel_r()
{
return m_chip_sel;
}
-WRITE16_MEMBER(wd7600_device::chipsel_w)
+void wd7600_device::chipsel_w(uint16_t data)
{
m_chip_sel = data;
LOG("WD7600: Chip Select write %04x\n", data);
}
// port 0x3872 - Memory Control
-READ16_MEMBER(wd7600_device::mem_ctrl_r)
+uint16_t wd7600_device::mem_ctrl_r()
{
return m_memory_ctrl;
}
-WRITE16_MEMBER(wd7600_device::mem_ctrl_w)
+void wd7600_device::mem_ctrl_w(uint16_t data)
{
m_memory_ctrl = data;
LOG("WD7600: Memory Control write %04x\n", data);
}
// port 0x4872 - Bank 0 and 1 start address
-READ16_MEMBER(wd7600_device::bank_01_start_r)
+uint16_t wd7600_device::bank_01_start_r(offs_t offset, uint16_t mem_mask)
{
return (m_bank_start[1] << 8) | m_bank_start[0];
}
-WRITE16_MEMBER(wd7600_device::bank_01_start_w)
+void wd7600_device::bank_01_start_w(offs_t offset, uint16_t data, uint16_t mem_mask)
{
if(ACCESSING_BITS_0_7)
{
@@ -517,12 +519,12 @@ WRITE16_MEMBER(wd7600_device::bank_01_start_w)
}
// port 0x5072 - Bank 2 and 3 start address
-READ16_MEMBER(wd7600_device::bank_23_start_r)
+uint16_t wd7600_device::bank_23_start_r(offs_t offset, uint16_t mem_mask)
{
return (m_bank_start[3] << 8) | m_bank_start[2];
}
-WRITE16_MEMBER(wd7600_device::bank_23_start_w)
+void wd7600_device::bank_23_start_w(offs_t offset, uint16_t data, uint16_t mem_mask)
{
if(ACCESSING_BITS_0_7)
{
@@ -537,24 +539,24 @@ WRITE16_MEMBER(wd7600_device::bank_23_start_w)
}
// port 0x5872 - split starting address (used for BIOS shadowing)
-READ16_MEMBER(wd7600_device::split_addr_r)
+uint16_t wd7600_device::split_addr_r()
{
return m_split_start;
}
-WRITE16_MEMBER(wd7600_device::split_addr_w)
+void wd7600_device::split_addr_w(uint16_t data)
{
m_split_start = data;
LOG("WD7600: Split start address write %04x\n", data);
}
// port 0x9872 - Diagnostic
-READ16_MEMBER(wd7600_device::diag_r)
+uint16_t wd7600_device::diag_r()
{
return m_diagnostic | 0xe080;
}
-WRITE16_MEMBER(wd7600_device::diag_w)
+void wd7600_device::diag_w(uint16_t data)
{
m_diagnostic = data;
LOG("WD7600: Diagnostic write %04x\n", data);
diff --git a/src/devices/machine/wd7600.h b/src/devices/machine/wd7600.h
index 8f40ed3116f..43ddb00b038 100644
--- a/src/devices/machine/wd7600.h
+++ b/src/devices/machine/wd7600.h
@@ -75,20 +75,20 @@ public:
DECLARE_WRITE_LINE_MEMBER( gatea20_w );
DECLARE_WRITE_LINE_MEMBER( kbrst_w );
- DECLARE_READ16_MEMBER(refresh_r);
- DECLARE_WRITE16_MEMBER(refresh_w);
- DECLARE_READ16_MEMBER(chipsel_r);
- DECLARE_WRITE16_MEMBER(chipsel_w);
- DECLARE_READ16_MEMBER(mem_ctrl_r);
- DECLARE_WRITE16_MEMBER(mem_ctrl_w);
- DECLARE_READ16_MEMBER(bank_01_start_r);
- DECLARE_WRITE16_MEMBER(bank_01_start_w);
- DECLARE_READ16_MEMBER(bank_23_start_r);
- DECLARE_WRITE16_MEMBER(bank_23_start_w);
- DECLARE_READ16_MEMBER(split_addr_r);
- DECLARE_WRITE16_MEMBER(split_addr_w);
- DECLARE_READ16_MEMBER(diag_r);
- DECLARE_WRITE16_MEMBER(diag_w);
+ uint16_t refresh_r();
+ void refresh_w(uint16_t data);
+ uint16_t chipsel_r();
+ void chipsel_w(uint16_t data);
+ uint16_t mem_ctrl_r();
+ void mem_ctrl_w(uint16_t data);
+ uint16_t bank_01_start_r(offs_t offset, uint16_t mem_mask);
+ void bank_01_start_w(offs_t offset, uint16_t data, uint16_t mem_mask);
+ uint16_t bank_23_start_r(offs_t offset, uint16_t mem_mask);
+ void bank_23_start_w(offs_t offset, uint16_t data, uint16_t mem_mask);
+ uint16_t split_addr_r();
+ void split_addr_w(uint16_t data);
+ uint16_t diag_r();
+ void diag_w(uint16_t data);
IRQ_CALLBACK_MEMBER(intack_cb) { return m_pic1->acknowledge(); }
@@ -101,39 +101,39 @@ protected:
private:
DECLARE_WRITE_LINE_MEMBER( pic1_int_w ) { m_write_intr(state); }
- DECLARE_READ8_MEMBER( pic1_slave_ack_r );
+ uint8_t pic1_slave_ack_r(offs_t offset);
DECLARE_WRITE_LINE_MEMBER( ctc_out1_w );
DECLARE_WRITE_LINE_MEMBER( ctc_out2_w );
- DECLARE_WRITE8_MEMBER( rtc_w );
- DECLARE_WRITE8_MEMBER( keyb_cmd_w );
- DECLARE_WRITE8_MEMBER( keyb_data_w );
- DECLARE_READ8_MEMBER( keyb_data_r );
- DECLARE_READ8_MEMBER( keyb_status_r );
- DECLARE_WRITE8_MEMBER( a20_reset_w );
- DECLARE_READ8_MEMBER( a20_reset_r );
- DECLARE_READ8_MEMBER( portb_r );
- DECLARE_WRITE8_MEMBER( portb_w );
- DECLARE_WRITE8_MEMBER( dma_page_w ) { m_dma_page[offset & 0x0f] = data; }
- DECLARE_READ8_MEMBER( dma_page_r ) { return m_dma_page[offset & 0x0f]; }
- DECLARE_READ8_MEMBER( dma_read_byte );
- DECLARE_WRITE8_MEMBER( dma_write_byte );
- DECLARE_READ8_MEMBER( dma_read_word );
- DECLARE_WRITE8_MEMBER( dma_write_word );
+ void rtc_w(offs_t offset, uint8_t data);
+ void keyb_cmd_w(uint8_t data);
+ void keyb_data_w(uint8_t data);
+ uint8_t keyb_data_r();
+ uint8_t keyb_status_r();
+ void a20_reset_w(uint8_t data);
+ uint8_t a20_reset_r();
+ uint8_t portb_r();
+ void portb_w(uint8_t data);
+ void dma_page_w(offs_t offset, uint8_t data) { m_dma_page[offset & 0x0f] = data; }
+ uint8_t dma_page_r(offs_t offset) { return m_dma_page[offset & 0x0f]; }
+ uint8_t dma_read_byte(offs_t offset);
+ void dma_write_byte(offs_t offset, uint8_t data);
+ uint8_t dma_read_word(offs_t offset);
+ void dma_write_word(offs_t offset, uint8_t data);
DECLARE_WRITE_LINE_MEMBER( dma1_eop_w );
- DECLARE_READ8_MEMBER( dma1_ior0_r ) { return m_read_ior(0); }
- DECLARE_READ8_MEMBER( dma1_ior1_r ) { return m_read_ior(1); }
- DECLARE_READ8_MEMBER( dma1_ior2_r ) { return m_read_ior(2); }
- DECLARE_READ8_MEMBER( dma1_ior3_r ) { return m_read_ior(3); }
- DECLARE_READ8_MEMBER( dma2_ior1_r ) { uint16_t result = m_read_ior(5); m_dma_high_byte = result >> 8; return result; }
- DECLARE_READ8_MEMBER( dma2_ior2_r ) { uint16_t result = m_read_ior(6); m_dma_high_byte = result >> 8; return result; }
- DECLARE_READ8_MEMBER( dma2_ior3_r ) { uint16_t result = m_read_ior(7); m_dma_high_byte = result >> 8; return result; }
- DECLARE_WRITE8_MEMBER( dma1_iow0_w ) { m_write_iow(0, data, 0xffff); }
- DECLARE_WRITE8_MEMBER( dma1_iow1_w ) { m_write_iow(1, data, 0xffff); }
- DECLARE_WRITE8_MEMBER( dma1_iow2_w ) { m_write_iow(2, data, 0xffff); }
- DECLARE_WRITE8_MEMBER( dma1_iow3_w ) { m_write_iow(3, data, 0xffff); }
- DECLARE_WRITE8_MEMBER( dma2_iow1_w ) { m_write_iow(5, (m_dma_high_byte << 8) | data, 0xffff); }
- DECLARE_WRITE8_MEMBER( dma2_iow2_w ) { m_write_iow(6, (m_dma_high_byte << 8) | data, 0xffff); }
- DECLARE_WRITE8_MEMBER( dma2_iow3_w ) { m_write_iow(7, (m_dma_high_byte << 8) | data, 0xffff); }
+ uint8_t dma1_ior0_r() { return m_read_ior(0); }
+ uint8_t dma1_ior1_r() { return m_read_ior(1); }
+ uint8_t dma1_ior2_r() { return m_read_ior(2); }
+ uint8_t dma1_ior3_r() { return m_read_ior(3); }
+ uint8_t dma2_ior1_r() { uint16_t result = m_read_ior(5); m_dma_high_byte = result >> 8; return result; }
+ uint8_t dma2_ior2_r() { uint16_t result = m_read_ior(6); m_dma_high_byte = result >> 8; return result; }
+ uint8_t dma2_ior3_r() { uint16_t result = m_read_ior(7); m_dma_high_byte = result >> 8; return result; }
+ void dma1_iow0_w(uint8_t data) { m_write_iow(0, data, 0xffff); }
+ void dma1_iow1_w(uint8_t data) { m_write_iow(1, data, 0xffff); }
+ void dma1_iow2_w(uint8_t data) { m_write_iow(2, data, 0xffff); }
+ void dma1_iow3_w(uint8_t data) { m_write_iow(3, data, 0xffff); }
+ void dma2_iow1_w(uint8_t data) { m_write_iow(5, (m_dma_high_byte << 8) | data, 0xffff); }
+ void dma2_iow2_w(uint8_t data) { m_write_iow(6, (m_dma_high_byte << 8) | data, 0xffff); }
+ void dma2_iow3_w(uint8_t data) { m_write_iow(7, (m_dma_high_byte << 8) | data, 0xffff); }
DECLARE_WRITE_LINE_MEMBER( dma1_dack0_w ) { set_dma_channel(0, state); }
DECLARE_WRITE_LINE_MEMBER( dma1_dack1_w ) { set_dma_channel(1, state); }
DECLARE_WRITE_LINE_MEMBER( dma1_dack2_w ) { set_dma_channel(2, state); }
diff --git a/src/devices/machine/x2201.cpp b/src/devices/machine/x2201.cpp
index ec252d1b8dd..90d731b7e3e 100644
--- a/src/devices/machine/x2201.cpp
+++ b/src/devices/machine/x2201.cpp
@@ -128,17 +128,6 @@ u8 x2201_device::read(offs_t offset)
//-------------------------------------------------
-// read_byte - read 8 bits of data from RAM
-// (FIXME: remove once CRU reads are 1-bit)
-//-------------------------------------------------
-
-u8 x2201_device::read_byte(offs_t offset)
-{
- return m_ram[offset & 127];
-}
-
-
-//-------------------------------------------------
// write - write one bit of data to RAM
//-------------------------------------------------
diff --git a/src/devices/machine/x2201.h b/src/devices/machine/x2201.h
index 670c69b349c..1d873850df1 100644
--- a/src/devices/machine/x2201.h
+++ b/src/devices/machine/x2201.h
@@ -38,7 +38,6 @@ public:
// read/write handlers
u8 read(offs_t offset);
- u8 read_byte(offs_t offset); // hack
void write(offs_t offset, u8 data);
// control lines
diff --git a/src/devices/machine/xc1700e.cpp b/src/devices/machine/xc1700e.cpp
new file mode 100644
index 00000000000..fe056664b07
--- /dev/null
+++ b/src/devices/machine/xc1700e.cpp
@@ -0,0 +1,91 @@
+// license:BSD-3-Clause
+// copyright-holders:Patrick Mackinlay
+
+/*
+ * An implementation of the Xilinx XC1700E family of serial configuration PROM
+ * devices, including:
+ *
+ * Part Capacity Variants
+ * -------- --------- ----------------
+ * XC1736E 36,288
+ * XC1765E 65,536 XC1765EL
+ * XC17128E 131,072 XC17128EL
+ * XC17256E 262,144 XC17256EL
+ * XC17512L 524,288
+ * XC1701 1,048,576 XC1701L, XQ1701L
+ * XC1702L 2,097,152
+ * XC1704L 4,194,304
+ *
+ * The input C̅E̅ and CLK lines have not been explicitly implemented; these are
+ * assumed to be asserted as expected before/during data read. The effect of
+ * C̅E̅O̅ can be obtained by connecting the cascade_r callback to the data_r of
+ * the cascaded device and resetting all devices when needed.
+ *
+ * This implementation assumes the input data is stored least-significant bit
+ * first; i.e. the first bit read out of the device is held in the LSB of the
+ * first byte of the memory region. This convention matches at least one
+ * dumping device tested.
+ *
+ * Sources:
+ *
+ * http://www.xilinx.com/support/documentation/data_sheets/ds027.pdf
+ *
+ */
+
+#include "emu.h"
+#include "xc1700e.h"
+
+#define VERBOSE 0
+#include "logmacro.h"
+
+DEFINE_DEVICE_TYPE(XC1736E, xc1736e_device, "xc1736e", "Xilinx 36,288 bit Serial PROM")
+DEFINE_DEVICE_TYPE(XC1765E, xc1765e_device, "xc1765e", "Xilinx 65,536 bit Serial PROM")
+DEFINE_DEVICE_TYPE(XC17128E, xc17128e_device, "xc17128e", "Xilinx 131,072 bit Serial PROM")
+DEFINE_DEVICE_TYPE(XC17256E, xc17256e_device, "xc17256e", "Xilinx 262,144 bit Serial PROM")
+DEFINE_DEVICE_TYPE(XC17512L, xc17512l_device, "xc17512l", "Xilinx 524,288 bit Serial PROM")
+DEFINE_DEVICE_TYPE(XC1701, xc1701_device, "xc1701", "Xilinx 1,048,576 bit Serial PROM")
+DEFINE_DEVICE_TYPE(XC1702L, xc1702l_device, "xc1702l", "Xilinx 2,097,152 bit Serial PROM")
+DEFINE_DEVICE_TYPE(XC1704L, xc1704l_device, "xc1704l", "Xilinx 4,194,304 bit Serial PROM")
+
+base_xc1700e_device::base_xc1700e_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock, u32 capacity)
+ : device_t(mconfig, type, tag, owner, clock)
+ , m_capacity(capacity)
+ , m_region(*this, DEVICE_SELF)
+ , m_cascade_cb(*this)
+ , m_reset(true)
+ , m_address(0)
+{
+}
+
+void base_xc1700e_device::device_start()
+{
+ m_cascade_cb.resolve_safe(1);
+
+ save_item(NAME(m_reset));
+ save_item(NAME(m_address));
+}
+
+void base_xc1700e_device::reset_w(int state)
+{
+ if (state)
+ m_address = 0;
+
+ m_reset = bool(state);
+}
+
+int base_xc1700e_device::data_r()
+{
+ if (m_reset)
+ return 1;
+
+ if (m_address < m_capacity)
+ {
+ int const data = BIT(m_region->as_u8(m_address >> 3), m_address & 7);
+
+ m_address++;
+
+ return data;
+ }
+ else
+ return m_cascade_cb();
+}
diff --git a/src/devices/machine/xc1700e.h b/src/devices/machine/xc1700e.h
new file mode 100644
index 00000000000..42a191c73ce
--- /dev/null
+++ b/src/devices/machine/xc1700e.h
@@ -0,0 +1,118 @@
+// license:BSD-3-Clause
+// copyright-holders:Patrick Mackinlay
+
+#ifndef MAME_MACHINE_XC1700E_H
+#define MAME_MACHINE_XC1700E_H
+
+#pragma once
+
+class base_xc1700e_device : public device_t
+{
+public:
+ // configuration
+ auto cascade_r() { return m_cascade_cb.bind(); }
+
+ // input/output lines
+ void reset_w(int state);
+ int data_r();
+
+protected:
+ base_xc1700e_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock, u32 capacity);
+
+ // device_t overrides
+ virtual void device_start() override;
+
+private:
+ // device configuration
+ const u32 m_capacity;
+ required_memory_region m_region;
+
+ devcb_read_line m_cascade_cb;
+
+ // device state
+ bool m_reset;
+ unsigned m_address;
+};
+
+DECLARE_DEVICE_TYPE(XC1736E, xc1736e_device)
+DECLARE_DEVICE_TYPE(XC1765E, xc1765e_device)
+DECLARE_DEVICE_TYPE(XC17128E, xc17128e_device)
+DECLARE_DEVICE_TYPE(XC17256E, xc17256e_device)
+DECLARE_DEVICE_TYPE(XC17512L, xc17512l_device)
+DECLARE_DEVICE_TYPE(XC1701, xc1701_device)
+DECLARE_DEVICE_TYPE(XC1702L, xc1702l_device)
+DECLARE_DEVICE_TYPE(XC1704L, xc1704l_device)
+
+class xc1736e_device : public base_xc1700e_device
+{
+public:
+ xc1736e_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock = 0)
+ : base_xc1700e_device(mconfig, XC1736E, tag, owner, clock, 36'288UL)
+ {
+ }
+};
+
+class xc1765e_device : public base_xc1700e_device
+{
+public:
+ xc1765e_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock = 0)
+ : base_xc1700e_device(mconfig, XC1765E, tag, owner, clock, 65'536UL)
+ {
+ }
+};
+
+class xc17128e_device : public base_xc1700e_device
+{
+public:
+ xc17128e_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock = 0)
+ : base_xc1700e_device(mconfig, XC17128E, tag, owner, clock, 131'072UL)
+ {
+ }
+};
+
+class xc17256e_device : public base_xc1700e_device
+{
+public:
+ xc17256e_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock = 0)
+ : base_xc1700e_device(mconfig, XC17256E, tag, owner, clock, 262'144UL)
+ {
+ }
+};
+
+class xc17512l_device : public base_xc1700e_device
+{
+public:
+ xc17512l_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock = 0)
+ : base_xc1700e_device(mconfig, XC17512L, tag, owner, clock, 524'288UL)
+ {
+ }
+};
+
+class xc1701_device : public base_xc1700e_device
+{
+public:
+ xc1701_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock = 0)
+ : base_xc1700e_device(mconfig, XC1701, tag, owner, clock, 1'048'576UL)
+ {
+ }
+};
+
+class xc1702l_device : public base_xc1700e_device
+{
+public:
+ xc1702l_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock = 0)
+ : base_xc1700e_device(mconfig, XC1702L, tag, owner, clock, 2'097'152UL)
+ {
+ }
+};
+
+class xc1704l_device : public base_xc1700e_device
+{
+public:
+ xc1704l_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock = 0)
+ : base_xc1700e_device(mconfig, XC1704L, tag, owner, clock, 4'194'304UL)
+ {
+ }
+};
+
+#endif // MAME_MACHINE_XC1700E_H
diff --git a/src/devices/machine/ym2148.cpp b/src/devices/machine/ym2148.cpp
index 10eb9c9e6c9..04a3e53e97e 100644
--- a/src/devices/machine/ym2148.cpp
+++ b/src/devices/machine/ym2148.cpp
@@ -143,7 +143,7 @@ void ym2148_device::device_timer(emu_timer &timer, device_timer_id id, int param
}
-READ8_MEMBER(ym2148_device::read)
+uint8_t ym2148_device::read(offs_t offset)
{
switch (offset & 7)
{
@@ -165,7 +165,7 @@ READ8_MEMBER(ym2148_device::read)
}
-WRITE8_MEMBER(ym2148_device::write)
+void ym2148_device::write(offs_t offset, uint8_t data)
{
switch (offset & 7)
{
diff --git a/src/devices/machine/ym2148.h b/src/devices/machine/ym2148.h
index 7f5f45d7066..3cb13bf2058 100644
--- a/src/devices/machine/ym2148.h
+++ b/src/devices/machine/ym2148.h
@@ -31,8 +31,8 @@ public:
auto port_read_handler() { return m_port_read_handler.bind(); }
auto irq_handler() { return m_irq_handler.bind(); }
- DECLARE_READ8_MEMBER(read);
- DECLARE_WRITE8_MEMBER(write);
+ uint8_t read(offs_t offset);
+ void write(offs_t offset, uint8_t data);
DECLARE_WRITE_LINE_MEMBER(write_rxd);
uint8_t get_irq_vector();
diff --git a/src/devices/machine/z80scc.cpp b/src/devices/machine/z80scc.cpp
index 711d58b8b49..b44be5c5873 100644
--- a/src/devices/machine/z80scc.cpp
+++ b/src/devices/machine/z80scc.cpp
@@ -84,9 +84,9 @@ baud rate:
-- in the unlikely case of T == 0, pretend T = 1.
- If the required wr11 bits are set:
-- let's say M = wr4 D7,D6 if 1,1 M = 64; if 1,0 M = 32; if 0,1 M = 16 else M = 1
--- so, the required clock on the MCFG_DEVICE_ADD line = 2*T*B*M.
+-- so, the required device clock = 2*T*B*M.
- If the required wr11 bits are not set:
--- add a line: MCFG_Z80SCC_OFFSETS(X, 0, Y, 0), where X = channel-A-baud * T,
+-- call: configure_channels(X, 0, Y, 0), where X = channel-A-baud * T,
and Y = channel-B-baud * T.
***************************************************************************/
@@ -436,6 +436,7 @@ z80scc_device::z80scc_device(const machine_config &mconfig, device_type type, co
m_out_rxdrq_cb{ { *this }, { *this } },
m_out_txdrq_cb{ { *this }, { *this } },
m_out_int_cb(*this),
+ m_out_int_state(CLEAR_LINE),
m_variant(variant),
m_wr0_ptrbits(0),
m_cputag(nullptr)
@@ -517,6 +518,7 @@ void z80scc_device::device_start()
LOG("%s", FUNCNAME);
// state saving
+ save_item(NAME(m_out_int_state));
save_item(NAME(m_int_state));
save_item(NAME(m_int_source));
save_item(NAME(m_wr9));
@@ -681,8 +683,12 @@ void z80scc_device::z80daisy_irq_reti()
void z80scc_device::check_interrupts()
{
int state = (z80daisy_irq_state() & Z80_DAISY_INT) ? ASSERT_LINE : CLEAR_LINE;
- LOGINT("%s %s \n",tag(), FUNCNAME);
- m_out_int_cb(state);
+ if (m_out_int_state != state)
+ {
+ m_out_int_state = state;
+ LOGINT("%s\n", FUNCNAME);
+ m_out_int_cb(state);
+ }
}
diff --git a/src/devices/machine/z80scc.h b/src/devices/machine/z80scc.h
index e2cad9e660b..3e8812707dc 100644
--- a/src/devices/machine/z80scc.h
+++ b/src/devices/machine/z80scc.h
@@ -467,6 +467,7 @@ protected:
devcb_write_line m_out_int_cb;
+ int m_out_int_state;
int m_int_state[6]; // interrupt state
int m_int_source[6]; // interrupt source
diff --git a/src/devices/machine/z80sio.cpp b/src/devices/machine/z80sio.cpp
index 82997875f46..8337aeafdf6 100644
--- a/src/devices/machine/z80sio.cpp
+++ b/src/devices/machine/z80sio.cpp
@@ -242,15 +242,17 @@ DEFINE_DEVICE_TYPE(UPD7201_NEW, upd7201_new_device, "upd7201_new", "NEC uP
//-------------------------------------------------
// device_add_mconfig - add device configuration
//-------------------------------------------------
-MACHINE_CONFIG_START(z80sio_device::device_add_mconfig)
- MCFG_DEVICE_ADD(CHANA_TAG, Z80SIO_CHANNEL, 0)
- MCFG_DEVICE_ADD(CHANB_TAG, Z80SIO_CHANNEL, 0)
-MACHINE_CONFIG_END
-
-MACHINE_CONFIG_START(i8274_new_device::device_add_mconfig)
- MCFG_DEVICE_ADD(CHANA_TAG, I8274_CHANNEL, 0)
- MCFG_DEVICE_ADD(CHANB_TAG, I8274_CHANNEL, 0)
-MACHINE_CONFIG_END
+void z80sio_device::device_add_mconfig(machine_config &config)
+{
+ Z80SIO_CHANNEL(config, CHANA_TAG, 0);
+ Z80SIO_CHANNEL(config, CHANB_TAG, 0);
+}
+
+void i8274_new_device::device_add_mconfig(machine_config &config)
+{
+ I8274_CHANNEL(config, CHANA_TAG, 0);
+ I8274_CHANNEL(config, CHANB_TAG, 0);
+}
//**************************************************************************
diff --git a/src/devices/sound/2203intf.cpp b/src/devices/sound/2203intf.cpp
index faf3072e94e..02ad8a41579 100644
--- a/src/devices/sound/2203intf.cpp
+++ b/src/devices/sound/2203intf.cpp
@@ -130,34 +130,34 @@ void ym2203_device::device_reset()
}
-READ8_MEMBER( ym2203_device::read )
+u8 ym2203_device::read(offs_t offset)
{
return ym2203_read(m_chip, offset & 1);
}
-WRITE8_MEMBER( ym2203_device::write )
+void ym2203_device::write(offs_t offset, u8 data)
{
ym2203_write(m_chip, offset & 1, data);
}
-READ8_MEMBER( ym2203_device::status_port_r )
+u8 ym2203_device::status_port_r()
{
- return read(space, 0);
+ return read(0);
}
-READ8_MEMBER( ym2203_device::read_port_r )
+u8 ym2203_device::read_port_r()
{
- return read(space, 1);
+ return read(1);
}
-WRITE8_MEMBER( ym2203_device::control_port_w )
+void ym2203_device::control_port_w(u8 data)
{
- write(space, 0, data);
+ write(0, data);
}
-WRITE8_MEMBER( ym2203_device::write_port_w )
+void ym2203_device::write_port_w(u8 data)
{
- write(space, 1, data);
+ write(1, data);
}
DEFINE_DEVICE_TYPE(YM2203, ym2203_device, "ym2203", "YM2203 OPN")
diff --git a/src/devices/sound/2203intf.h b/src/devices/sound/2203intf.h
index 93e09d9a9dc..8dd456f50bd 100644
--- a/src/devices/sound/2203intf.h
+++ b/src/devices/sound/2203intf.h
@@ -20,13 +20,13 @@ public:
template <class Object> devcb_base &set_irq_handler(Object &&cb) { return m_irq_handler.set_callback(std::forward<Object>(cb)); }
auto irq_handler() { return m_irq_handler.bind(); }
- DECLARE_READ8_MEMBER( read );
- DECLARE_WRITE8_MEMBER( write );
+ u8 read(offs_t offset);
+ void write(offs_t offset, u8 data);
- DECLARE_READ8_MEMBER( status_port_r );
- DECLARE_READ8_MEMBER( read_port_r );
- DECLARE_WRITE8_MEMBER( control_port_w );
- DECLARE_WRITE8_MEMBER( write_port_w );
+ u8 status_port_r();
+ u8 read_port_r();
+ void control_port_w(u8 data);
+ void write_port_w(u8 data);
// update request from fm.cpp
static void update_request(device_t *param) { downcast<ym2203_device *>(param)->update_request(); }
diff --git a/src/devices/sound/2608intf.cpp b/src/devices/sound/2608intf.cpp
index 1445de91f37..6c31c2aea0f 100644
--- a/src/devices/sound/2608intf.cpp
+++ b/src/devices/sound/2608intf.cpp
@@ -141,12 +141,12 @@ void ym2608_device::rom_bank_updated()
}
-READ8_MEMBER( ym2608_device::read )
+u8 ym2608_device::read(offs_t offset)
{
return ym2608_read(m_chip, offset & 3);
}
-WRITE8_MEMBER( ym2608_device::write )
+void ym2608_device::write(offs_t offset, u8 data)
{
ym2608_write(m_chip, offset & 3, data);
}
diff --git a/src/devices/sound/2608intf.h b/src/devices/sound/2608intf.h
index 76c69ec3961..23506b66eea 100644
--- a/src/devices/sound/2608intf.h
+++ b/src/devices/sound/2608intf.h
@@ -21,8 +21,8 @@ public:
template <class Object> devcb_base &set_irq_handler(Object &&cb) { return m_irq_handler.set_callback(std::forward<Object>(cb)); }
auto irq_handler() { return m_irq_handler.bind(); }
- DECLARE_READ8_MEMBER( read );
- DECLARE_WRITE8_MEMBER( write );
+ u8 read(offs_t offset);
+ void write(offs_t offset, u8 data);
// update request from fm.cpp
static void update_request(device_t *param) { downcast<ym2608_device *>(param)->update_request(); }
diff --git a/src/devices/sound/2610intf.cpp b/src/devices/sound/2610intf.cpp
index 84598507274..fe4077b2d40 100644
--- a/src/devices/sound/2610intf.cpp
+++ b/src/devices/sound/2610intf.cpp
@@ -164,12 +164,12 @@ device_memory_interface::space_config_vector ym2610_device::memory_space_config(
}
-READ8_MEMBER( ym2610_device::read )
+u8 ym2610_device::read(offs_t offset)
{
return ym2610_read(m_chip, offset & 3);
}
-WRITE8_MEMBER( ym2610_device::write )
+void ym2610_device::write(offs_t offset, u8 data)
{
ym2610_write(m_chip, offset & 3, data);
}
diff --git a/src/devices/sound/2610intf.h b/src/devices/sound/2610intf.h
index ff736e4890e..1a1515e081c 100644
--- a/src/devices/sound/2610intf.h
+++ b/src/devices/sound/2610intf.h
@@ -23,8 +23,8 @@ public:
virtual space_config_vector memory_space_config() const override;
- DECLARE_READ8_MEMBER( read );
- DECLARE_WRITE8_MEMBER( write );
+ u8 read(offs_t offset);
+ void write(offs_t offset, u8 data);
// update request from fm.cpp
static void update_request(device_t *param) { downcast<ym2610_device *>(param)->update_request(); }
diff --git a/src/devices/sound/2612intf.cpp b/src/devices/sound/2612intf.cpp
index 21ca436a004..b8e440666ec 100644
--- a/src/devices/sound/2612intf.cpp
+++ b/src/devices/sound/2612intf.cpp
@@ -129,12 +129,12 @@ void ym2612_device::device_reset()
}
-READ8_MEMBER( ym2612_device::read )
+u8 ym2612_device::read(offs_t offset)
{
return ym2612_read(m_chip, offset & 3);
}
-WRITE8_MEMBER( ym2612_device::write )
+void ym2612_device::write(offs_t offset, u8 data)
{
ym2612_write(m_chip, offset & 3, data);
}
diff --git a/src/devices/sound/2612intf.h b/src/devices/sound/2612intf.h
index 5dc31593685..13255b59e8f 100644
--- a/src/devices/sound/2612intf.h
+++ b/src/devices/sound/2612intf.h
@@ -15,8 +15,8 @@ public:
template <class Object> devcb_base &set_irq_handler(Object &&cb) { return m_irq_handler.set_callback(std::forward<Object>(cb)); }
auto irq_handler() { return m_irq_handler.bind(); }
- DECLARE_READ8_MEMBER( read );
- DECLARE_WRITE8_MEMBER( write );
+ u8 read(offs_t offset);
+ void write(offs_t offset, u8 data);
// update request from fm.cpp
static void update_request(device_t *param) { downcast<ym2612_device *>(param)->update_request(); }
diff --git a/src/devices/sound/262intf.cpp b/src/devices/sound/262intf.cpp
index 905d9afd8b6..0de5e274ca9 100644
--- a/src/devices/sound/262intf.cpp
+++ b/src/devices/sound/262intf.cpp
@@ -121,12 +121,12 @@ void ymf262_device::device_clock_changed()
m_stream->set_sample_rate(rate);
}
-READ8_MEMBER( ymf262_device::read )
+u8 ymf262_device::read(offs_t offset)
{
return ymf262_read(m_chip, offset & 3);
}
-WRITE8_MEMBER( ymf262_device::write )
+void ymf262_device::write(offs_t offset, u8 data)
{
ymf262_write(m_chip, offset & 3, data);
}
diff --git a/src/devices/sound/262intf.h b/src/devices/sound/262intf.h
index 96d819b761b..816b2903831 100644
--- a/src/devices/sound/262intf.h
+++ b/src/devices/sound/262intf.h
@@ -13,8 +13,8 @@ public:
// configuration helpers
auto irq_handler() { return m_irq_handler.bind(); }
- DECLARE_READ8_MEMBER( read );
- DECLARE_WRITE8_MEMBER( write );
+ u8 read(offs_t offset);
+ void write(offs_t offset, u8 data);
protected:
// device-level overrides
diff --git a/src/devices/sound/3526intf.cpp b/src/devices/sound/3526intf.cpp
index 86ee4a5c0b7..2418b9e65a1 100644
--- a/src/devices/sound/3526intf.cpp
+++ b/src/devices/sound/3526intf.cpp
@@ -130,20 +130,20 @@ void ym3526_device::device_reset()
}
-READ8_MEMBER( ym3526_device::read )
+u8 ym3526_device::read(offs_t offset)
{
return ym3526_read(m_chip, offset & 1);
}
-WRITE8_MEMBER( ym3526_device::write )
+void ym3526_device::write(offs_t offset, u8 data)
{
ym3526_write(m_chip, offset & 1, data);
}
-READ8_MEMBER( ym3526_device::status_port_r ) { return read(space, 0); }
-READ8_MEMBER( ym3526_device::read_port_r ) { return read(space, 1); }
-WRITE8_MEMBER( ym3526_device::control_port_w ) { write(space, 0, data); }
-WRITE8_MEMBER( ym3526_device::write_port_w ) { write(space, 1, data); }
+u8 ym3526_device::status_port_r() { return read(0); }
+u8 ym3526_device::read_port_r() { return read(1); }
+void ym3526_device::control_port_w(u8 data) { write(0, data); }
+void ym3526_device::write_port_w(u8 data) { write(1, data); }
DEFINE_DEVICE_TYPE(YM3526, ym3526_device, "ym3526", "YM3526 OPL")
diff --git a/src/devices/sound/3526intf.h b/src/devices/sound/3526intf.h
index 338ffb1f2b4..c880cfcfc51 100644
--- a/src/devices/sound/3526intf.h
+++ b/src/devices/sound/3526intf.h
@@ -15,13 +15,13 @@ public:
template <class Object> devcb_base &set_irq_handler(Object &&cb) { return m_irq_handler.set_callback(std::forward<Object>(cb)); }
auto irq_handler() { return m_irq_handler.bind(); }
- DECLARE_READ8_MEMBER( read );
- DECLARE_WRITE8_MEMBER( write );
+ u8 read(offs_t offset);
+ void write(offs_t offset, u8 data);
- DECLARE_READ8_MEMBER( status_port_r );
- DECLARE_READ8_MEMBER( read_port_r );
- DECLARE_WRITE8_MEMBER( control_port_w );
- DECLARE_WRITE8_MEMBER( write_port_w );
+ u8 status_port_r();
+ u8 read_port_r();
+ void control_port_w(u8 data);
+ void write_port_w(u8 data);
protected:
// device-level overrides
diff --git a/src/devices/sound/3812intf.cpp b/src/devices/sound/3812intf.cpp
index 6818a531371..9b29af0599d 100644
--- a/src/devices/sound/3812intf.cpp
+++ b/src/devices/sound/3812intf.cpp
@@ -131,20 +131,20 @@ void ym3812_device::device_reset()
}
-READ8_MEMBER( ym3812_device::read )
+u8 ym3812_device::read(offs_t offset)
{
return ym3812_read(m_chip, offset & 1);
}
-WRITE8_MEMBER( ym3812_device::write )
+void ym3812_device::write(offs_t offset, u8 data)
{
ym3812_write(m_chip, offset & 1, data);
}
-READ8_MEMBER( ym3812_device::status_port_r ) { return read(space, 0); }
-READ8_MEMBER( ym3812_device::read_port_r ) { return read(space, 1); }
-WRITE8_MEMBER( ym3812_device::control_port_w ) { write(space, 0, data); }
-WRITE8_MEMBER( ym3812_device::write_port_w ) { write(space, 1, data); }
+u8 ym3812_device::status_port_r() { return read(0); }
+u8 ym3812_device::read_port_r() { return read(1); }
+void ym3812_device::control_port_w(u8 data) { write(0, data); }
+void ym3812_device::write_port_w(u8 data) { write(1, data); }
DEFINE_DEVICE_TYPE(YM3812, ym3812_device, "ym3812", "YM3812 OPL2")
diff --git a/src/devices/sound/3812intf.h b/src/devices/sound/3812intf.h
index 5a4f4eeae2e..56a6accb30a 100644
--- a/src/devices/sound/3812intf.h
+++ b/src/devices/sound/3812intf.h
@@ -13,13 +13,13 @@ public:
template <class Object> devcb_base &set_irq_handler(Object &&cb) { return m_irq_handler.set_callback(std::forward<Object>(cb)); }
auto irq_handler() { return m_irq_handler.bind(); }
- DECLARE_READ8_MEMBER( read );
- DECLARE_WRITE8_MEMBER( write );
+ u8 read(offs_t offset);
+ void write(offs_t offset, u8 data);
- DECLARE_READ8_MEMBER( status_port_r );
- DECLARE_READ8_MEMBER( read_port_r );
- DECLARE_WRITE8_MEMBER( control_port_w );
- DECLARE_WRITE8_MEMBER( write_port_w );
+ u8 status_port_r();
+ u8 read_port_r();
+ void control_port_w(u8 data);
+ void write_port_w(u8 data);
protected:
// device-level overrides
diff --git a/src/devices/sound/8950intf.cpp b/src/devices/sound/8950intf.cpp
index f56f34c88f9..601c9861f33 100644
--- a/src/devices/sound/8950intf.cpp
+++ b/src/devices/sound/8950intf.cpp
@@ -138,20 +138,20 @@ void y8950_device::rom_bank_updated()
}
-READ8_MEMBER( y8950_device::read )
+u8 y8950_device::read(offs_t offset)
{
return y8950_read(m_chip, offset & 1);
}
-WRITE8_MEMBER( y8950_device::write )
+void y8950_device::write(offs_t offset, u8 data)
{
y8950_write(m_chip, offset & 1, data);
}
-READ8_MEMBER( y8950_device::status_port_r ) { return read(space, 0); }
-READ8_MEMBER( y8950_device::read_port_r ) { return read(space, 1); }
-WRITE8_MEMBER( y8950_device::control_port_w ) { write(space, 0, data); }
-WRITE8_MEMBER( y8950_device::write_port_w ) { write(space, 1, data); }
+u8 y8950_device::status_port_r() { return read(0); }
+u8 y8950_device::read_port_r() { return read(1); }
+void y8950_device::control_port_w(u8 data) { write(0, data); }
+void y8950_device::write_port_w(u8 data) { write(1, data); }
DEFINE_DEVICE_TYPE(Y8950, y8950_device, "y8950", "Y8950 MSX-Audio")
diff --git a/src/devices/sound/8950intf.h b/src/devices/sound/8950intf.h
index fd65a036ef8..ac4584626e4 100644
--- a/src/devices/sound/8950intf.h
+++ b/src/devices/sound/8950intf.h
@@ -20,13 +20,13 @@ public:
auto io_read() { return m_io_read_handler.bind(); }
auto io_write() { return m_io_write_handler.bind(); }
- DECLARE_READ8_MEMBER( read );
- DECLARE_WRITE8_MEMBER( write );
+ u8 read(offs_t offset);
+ void write(offs_t offset, u8 data);
- DECLARE_READ8_MEMBER( status_port_r );
- DECLARE_READ8_MEMBER( read_port_r );
- DECLARE_WRITE8_MEMBER( control_port_w );
- DECLARE_WRITE8_MEMBER( write_port_w );
+ u8 status_port_r();
+ u8 read_port_r();
+ void control_port_w(u8 data);
+ void write_port_w(u8 data);
protected:
// device-level overrides
diff --git a/src/devices/sound/ad1848.cpp b/src/devices/sound/ad1848.cpp
index 1049a03a177..5db5b3ded2d 100644
--- a/src/devices/sound/ad1848.cpp
+++ b/src/devices/sound/ad1848.cpp
@@ -29,7 +29,6 @@ void ad1848_device::device_add_mconfig(machine_config &config)
DAC_16BIT_R2R(config, m_ldac, 0).add_route(ALL_OUTPUTS, "lspeaker", 0.5); // unknown DAC
DAC_16BIT_R2R(config, m_rdac, 0).add_route(ALL_OUTPUTS, "rspeaker", 0.5); // unknown DAC
voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref", 0));
- vref.set_output(5.0);
vref.add_route(0, "ldac", 1.0, DAC_VREF_POS_INPUT);
vref.add_route(0, "ldac", -1.0, DAC_VREF_NEG_INPUT);
vref.add_route(0, "rdac", 1.0, DAC_VREF_POS_INPUT);
diff --git a/src/devices/sound/astrocde.cpp b/src/devices/sound/astrocde.cpp
index e3600a88286..33ae926f34c 100644
--- a/src/devices/sound/astrocde.cpp
+++ b/src/devices/sound/astrocde.cpp
@@ -86,7 +86,7 @@ astrocade_io_device::astrocade_io_device(const machine_config &mconfig, const ch
, m_c_state(0)
, m_si_callback(*this)
, m_so_callback{{*this}, {*this}, {*this}, {*this}, {*this}, {*this}, {*this}, {*this}}
- , m_pots(*this, {finder_base::DUMMY_TAG, finder_base::DUMMY_TAG, finder_base::DUMMY_TAG, finder_base::DUMMY_TAG})
+ , m_pots{{*this}, {*this}, {*this}, {*this}}
{
memset(m_reg, 0, sizeof(uint8_t)*8);
memset(m_bitswap, 0, sizeof(uint8_t)*256);
@@ -104,6 +104,8 @@ void astrocade_io_device::device_resolve_objects()
m_si_callback.resolve_safe(0);
for (auto &cb : m_so_callback)
cb.resolve_safe();
+ for (auto &pot : m_pots)
+ pot.resolve_safe(0);
}
@@ -323,7 +325,7 @@ READ8_MEMBER(astrocade_io_device::read)
return m_si_callback(space, offset & 7);
}
else if ((offset & 0x0f) >= 0x0c)
- return m_pots[offset & 3].read_safe(0);
+ return m_pots[offset & 3]();
else
return 0xff;
}
diff --git a/src/devices/sound/astrocde.h b/src/devices/sound/astrocde.h
index 7eaae126f4f..eddde3a12bb 100644
--- a/src/devices/sound/astrocde.h
+++ b/src/devices/sound/astrocde.h
@@ -49,7 +49,7 @@ public:
// configuration access
auto si_cb() { return m_si_callback.bind(); }
template <std::size_t Bit> auto so_cb() { return m_so_callback[Bit].bind(); }
- template <std::size_t Pot> void set_pot_tag(const char *tag) { m_pots[Pot].set_tag(tag); }
+ template <std::size_t Pot> auto pot_cb() { return m_pots[Pot].bind(); }
protected:
// device-level overrides
@@ -90,7 +90,7 @@ private:
devcb_read8 m_si_callback;
devcb_write8 m_so_callback[8];
- optional_ioport_array<4> m_pots;
+ devcb_read8 m_pots[4];
};
DECLARE_DEVICE_TYPE(ASTROCADE_IO, astrocade_io_device)
diff --git a/src/devices/sound/ay8910.cpp b/src/devices/sound/ay8910.cpp
index 71dd5854725..9ee02834f67 100644
--- a/src/devices/sound/ay8910.cpp
+++ b/src/devices/sound/ay8910.cpp
@@ -120,7 +120,7 @@
/***************************************************************************
- ay8910.c
+ ay8910.cpp
Emulation of the AY-3-8910 / YM2149 sound chip.
@@ -511,6 +511,56 @@ Yamaha YMZ294: limited info: 0 I/O port
between 4MHz (H) and 6MHz (L), while pin 10 is /TEST.
OKI M5255, Winbond WF19054, JFC 95101, File KC89C72, Toshiba T7766A : differences to be listed
+AY8930 Expanded mode registers :
+ Bank Register Bits
+ A 0 xxxx xxxx Channel A Tone period fine tune
+ A 1 xxxx xxxx Channel A Tone period coarse tune
+ A 2 xxxx xxxx Channel B Tone period fine tune
+ A 3 xxxx xxxx Channel B Tone period coarse tune
+ A 4 xxxx xxxx Channel C Tone period fine tune
+ A 5 xxxx xxxx Channel C Tone period coarse tune
+ A 6 xxxx xxxx Noise period
+ A 7 x--- ---- I/O Port B input(0) / output(1)
+ -x-- ---- I/O Port A input(0) / output(1)
+ --x- ---- Channel C Noise enable(0) / disable(1)
+ ---x ---- Channel B Noise enable(0) / disable(1)
+ ---- x--- Channel A Noise enable(0) / disable(1)
+ ---- -x-- Channel C Tone enable(0) / disable(1)
+ ---- --x- Channel B Tone enable(0) / disable(1)
+ ---- ---x Channel A Tone enable(0) / disable(1)
+ A 8 --x- ---- Channel A Envelope mode
+ ---x xxxx Channel A Tone volume
+ A 9 --x- ---- Channel B Envelope mode
+ ---x xxxx Channel B Tone volume
+ A A --x- ---- Channel C Envelope mode
+ ---x xxxx Channel C Tone volume
+ A B xxxx xxxx Channel A Envelope period fine tune
+ A C xxxx xxxx Channel A Envelope period coarse tune
+ A D 101- ---- 101 = Expanded mode enable, other AY-3-8910A Compatiblity mode
+ ---0 ---- 0 for Register Bank A
+ ---- xxxx Channel A Envelope Shape/Cycle
+ A E xxxx xxxx 8 bit Parallel I/O on Port A
+ A F xxxx xxxx 8 bit Parallel I/O on Port B
+
+ B 0 xxxx xxxx Channel B Envelope period fine tune
+ B 1 xxxx xxxx Channel B Envelope period coarse tune
+ B 2 xxxx xxxx Channel C Envelope period fine tune
+ B 3 xxxx xxxx Channel C Envelope period coarse tune
+ B 4 ---- xxxx Channel B Envelope Shape/Cycle
+ B 5 ---- xxxx Channel C Envelope Shape/Cycle
+ B 6 ---- xxxx Channel A Duty Cycle
+ B 7 ---- xxxx Channel B Duty Cycle
+ B 8 ---- xxxx Channel C Duty Cycle
+ B 9 xxxx xxxx Noise "And" Mask
+ B A xxxx xxxx Noise "Or" Mask
+ B B Reserved (Read as 0)
+ B C Reserved (Read as 0)
+ B D 101- ---- 101 = Expanded mode enable, other AY-3-8910A Compatiblity mode
+ ---1 ---- 1 for Register Bank B
+ ---- xxxx Channel A Envelope Shape
+ B E Reserved (Read as 0)
+ B F Test (Function unknown)
+
Decaps:
AY-3-8914 - http://siliconpr0n.org/map/gi/ay-3-8914/mz_mit20x/
AY-3-8910 - http://privatfrickler.de/blick-auf-den-chip-soundchip-general-instruments-ay-3-8910/
@@ -735,7 +785,7 @@ static const ay8910_device::mosfet_param ay8910_mosfet_param =
*
*************************************/
-static inline void build_3D_table(double rl, const ay8910_device::ay_ym_param *par, const ay8910_device::ay_ym_param *par_env, int normalize, double factor, int zero_is_off, int32_t *tab)
+static inline void build_3D_table(double rl, const ay8910_device::ay_ym_param *par, const ay8910_device::ay_ym_param *par_env, int normalize, double factor, int zero_is_off, s32 *tab)
{
double min = 10.0, max = 0.0;
@@ -794,7 +844,7 @@ static inline void build_3D_table(double rl, const ay8910_device::ay_ym_param *p
/* for (e=0;e<16;e++) printf("%d %d\n",e<<10, tab[e<<10]); */
}
-static inline void build_single_table(double rl, const ay8910_device::ay_ym_param *par, int normalize, int32_t *tab, int zero_is_off)
+static inline void build_single_table(double rl, const ay8910_device::ay_ym_param *par, int normalize, s32 *tab, int zero_is_off)
{
int j;
double rt;
@@ -833,7 +883,7 @@ static inline void build_single_table(double rl, const ay8910_device::ay_ym_para
}
-static inline void build_mosfet_resistor_table(const ay8910_device::mosfet_param &par, const double rd, int32_t *tab)
+static inline void build_mosfet_resistor_table(const ay8910_device::mosfet_param &par, const double rd, s32 *tab)
{
int j;
@@ -857,7 +907,7 @@ static inline void build_mosfet_resistor_table(const ay8910_device::mosfet_param
}
-uint16_t ay8910_device::mix_3D()
+u16 ay8910_device::mix_3D()
{
int indx = 0, chan;
@@ -889,6 +939,7 @@ uint16_t ay8910_device::mix_3D()
void ay8910_device::ay8910_write_reg(int r, int v)
{
//if (r >= 11 && r <= 13 ) printf("%d %x %02x\n", PSG->index, r, v);
+ device_type chip_type = type();
m_regs[r] = v;
switch( r )
@@ -930,6 +981,14 @@ void ay8910_device::ay8910_write_reg(int r, int v)
m_last_enable = m_regs[AY_ENABLE];
break;
case AY_ESHAPE:
+ if (chip_type == AY8930)
+ {
+ m_mode = (v >> 4) & 0xf;
+ if ((m_mode & 0xe) == 0xa) // AY8930 expanded mode
+ logerror("warning: activated unemulated extended mode at %s, bank %02x\n", name(), m_mode & 1);
+ else if (m_mode & 0xf)
+ logerror("warning: activated unknown mode %02x at %s\n", m_mode & 0xf, name());
+ }
if ( (v & 0x0f) > 0)
osd_printf_verbose("EShape\n");
m_attack = (m_regs[AY_ESHAPE] & 0x04) ? m_env_step_mask : 0x00;
@@ -1175,6 +1234,7 @@ void ay8910_device::ay8910_statesave()
save_item(NAME(m_attack));
save_item(NAME(m_holding));
save_item(NAME(m_rng));
+ save_item(NAME(m_mode));
}
//-------------------------------------------------
@@ -1202,7 +1262,7 @@ void ay8910_device::device_start()
m_streams = 1;
}
- m_vol3d_table = make_unique_clear<int32_t[]>(8*32*32*32);
+ m_vol3d_table = make_unique_clear<s32[]>(8*32*32*32);
build_mixer_table();
@@ -1233,7 +1293,7 @@ void ay8910_device::ay8910_reset_ym()
m_count_env = 0;
m_prescale_noise = 0;
m_last_enable = -1; /* force a write */
- for (i = 0;i < AY_PORTA;i++)
+ for (i = 0; i < AY_PORTA; i++)
ay8910_write_reg(i,0);
m_ready = 1;
#if ENABLE_REGISTER_TEST
@@ -1278,7 +1338,7 @@ void ay8910_device::device_clock_changed()
ay_set_clock(clock());
}
-void ay8910_device::ay8910_write_ym(int addr, uint8_t data)
+void ay8910_device::ay8910_write_ym(int addr, u8 data)
{
if (addr & 1)
{
@@ -1309,7 +1369,7 @@ void ay8910_device::ay8910_write_ym(int addr, uint8_t data)
}
}
-uint8_t ay8910_device::ay8910_read_ym()
+u8 ay8910_device::ay8910_read_ym()
{
device_type chip_type = type();
int r = m_register_latch;
@@ -1358,13 +1418,13 @@ uint8_t ay8910_device::ay8910_read_ym()
- YM2149: no anomaly
*/
if (chip_type == AY8910) {
- const uint8_t mask[0x10]={
+ const u8 mask[0x10]={
0xff,0x0f,0xff,0x0f,0xff,0x0f,0x1f,0xff,0x1f,0x1f,0x1f,0xff,0xff,0x0f,0xff,0xff
};
return m_regs[r] & mask[r];
}
else if (chip_type == AY8914) {
- const uint8_t mask[0x10]={
+ const u8 mask[0x10]={
0xff,0x0f,0xff,0x0f,0xff,0x0f,0x1f,0xff,0x3f,0x3f,0x3f,0xff,0xff,0x0f,0xff,0xff
};
return m_regs[r] & mask[r];
@@ -1394,74 +1454,69 @@ void ay8910_device::device_reset()
*
*************************************/
-READ8_MEMBER( ay8910_device::data_r )
-{
- return ay8910_read_ym();
-}
-
-WRITE8_MEMBER( ay8910_device::address_w )
+void ay8910_device::address_w(u8 data)
{
#if ENABLE_REGISTER_TEST
return;
#else
- data_address_w(space, 1, data);
+ ay8910_write_ym(0, data);
#endif
}
-WRITE8_MEMBER( ay8910_device::data_w )
+void ay8910_device::data_w(u8 data)
{
#if ENABLE_REGISTER_TEST
return;
#else
- data_address_w(space, 0, data);
+ ay8910_write_ym(1, data);
#endif
}
// here, BC1 is hooked up to A0 on the host and BC2 is hooked up to A1
-WRITE8_MEMBER( ay8910_device::write_bc1_bc2 )
+void ay8910_device::write_bc1_bc2(offs_t offset, u8 data)
{
switch (offset & 3)
{
case 0: // latch address
- address_w(space, 0, data);
+ address_w(data);
break;
case 1: // inactive
break;
case 2: // write to psg
- data_w(space, 0, data);
+ data_w(data);
break;
case 3: // latch address
- address_w(space, 0, data);
+ address_w(data);
break;
}
}
-static const int mapping8914to8910[16] = { 0, 2, 4, 11, 1, 3, 5, 12, 7, 6, 13, 8, 9, 10, 14, 15 };
+static const u8 mapping8914to8910[16] = { 0, 2, 4, 11, 1, 3, 5, 12, 7, 6, 13, 8, 9, 10, 14, 15 };
-READ8_MEMBER( ay8914_device::read )
+u8 ay8914_device::read(offs_t offset)
{
- uint16_t rv;
- address_w(space, 0, mapping8914to8910[offset & 0xf]);
- rv = (uint16_t) data_r(space, 0);
+ u8 rv;
+ address_w(mapping8914to8910[offset & 0xf]);
+ rv = data_r();
return rv;
}
-WRITE8_MEMBER( ay8914_device::write )
+void ay8914_device::write(offs_t offset, u8 data)
{
- address_w(space, 0, mapping8914to8910[offset & 0xf]);
- data_w(space, 0, data & 0xff);
+ address_w(mapping8914to8910[offset & 0xf]);
+ data_w(data & 0xff);
}
DEFINE_DEVICE_TYPE(AY8910, ay8910_device, "ay8910", "AY-3-8910A PSG")
-ay8910_device::ay8910_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+ay8910_device::ay8910_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
: ay8910_device(mconfig, AY8910, tag, owner, clock, PSG_TYPE_AY, 3, 2)
{
}
-ay8910_device::ay8910_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock,
+ay8910_device::ay8910_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock,
psg_type_t psg_type, int streams, int ioports)
: device_t(mconfig, type, tag, owner, clock),
device_sound_interface(mconfig, *this),
@@ -1483,6 +1538,7 @@ ay8910_device::ay8910_device(const machine_config &mconfig, device_type type, co
m_attack(0),
m_holding(0),
m_rng(0),
+ m_mode(0),
m_env_step_mask(psg_type == PSG_TYPE_AY ? 0x0f : 0x1f),
m_step( psg_type == PSG_TYPE_AY ? 2 : 1),
m_zero_is_off( psg_type == PSG_TYPE_AY ? 1 : 0),
@@ -1528,7 +1584,7 @@ void ay8910_device::set_type(psg_type_t psg_type)
DEFINE_DEVICE_TYPE(AY8912, ay8912_device, "ay8912", "AY-3-8912A PSG")
-ay8912_device::ay8912_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+ay8912_device::ay8912_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
: ay8910_device(mconfig, AY8912, tag, owner, clock, PSG_TYPE_AY, 3, 1)
{
}
@@ -1536,7 +1592,7 @@ ay8912_device::ay8912_device(const machine_config &mconfig, const char *tag, dev
DEFINE_DEVICE_TYPE(AY8913, ay8913_device, "ay8913", "AY-3-8913 PSG")
-ay8913_device::ay8913_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+ay8913_device::ay8913_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
: ay8910_device(mconfig, AY8913, tag, owner, clock, PSG_TYPE_AY, 3, 0)
{
}
@@ -1544,7 +1600,7 @@ ay8913_device::ay8913_device(const machine_config &mconfig, const char *tag, dev
DEFINE_DEVICE_TYPE(AY8914, ay8914_device, "ay8914", "AY-3-8914A PSG")
-ay8914_device::ay8914_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+ay8914_device::ay8914_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
: ay8910_device(mconfig, AY8914, tag, owner, clock, PSG_TYPE_AY, 3, 2)
{
}
@@ -1552,7 +1608,7 @@ ay8914_device::ay8914_device(const machine_config &mconfig, const char *tag, dev
DEFINE_DEVICE_TYPE(AY8930, ay8930_device, "ay8930", "AY8930 EPSG")
-ay8930_device::ay8930_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+ay8930_device::ay8930_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
: ay8910_device(mconfig, AY8930, tag, owner, clock, PSG_TYPE_AY, 3, 2)
{
}
@@ -1560,7 +1616,7 @@ ay8930_device::ay8930_device(const machine_config &mconfig, const char *tag, dev
DEFINE_DEVICE_TYPE(YM2149, ym2149_device, "ym2149", "YM2149 SSG")
-ym2149_device::ym2149_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+ym2149_device::ym2149_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
: ay8910_device(mconfig, YM2149, tag, owner, clock, PSG_TYPE_YM, 3, 2)
{
}
@@ -1568,7 +1624,7 @@ ym2149_device::ym2149_device(const machine_config &mconfig, const char *tag, dev
DEFINE_DEVICE_TYPE(YM3439, ym3439_device, "ym3439", "YM3439 SSGC")
-ym3439_device::ym3439_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+ym3439_device::ym3439_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
: ay8910_device(mconfig, YM3439, tag, owner, clock, PSG_TYPE_YM, 3, 2)
{
}
@@ -1576,7 +1632,7 @@ ym3439_device::ym3439_device(const machine_config &mconfig, const char *tag, dev
DEFINE_DEVICE_TYPE(YMZ284, ymz284_device, "ymz284", "YMZ284 SSGL")
-ymz284_device::ymz284_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+ymz284_device::ymz284_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
: ay8910_device(mconfig, YMZ284, tag, owner, clock, PSG_TYPE_YM, 1, 0)
{
}
@@ -1584,7 +1640,7 @@ ymz284_device::ymz284_device(const machine_config &mconfig, const char *tag, dev
DEFINE_DEVICE_TYPE(YMZ294, ymz294_device, "ymz294", "YMZ294 SSGLP")
-ymz294_device::ymz294_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+ymz294_device::ymz294_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
: ay8910_device(mconfig, YMZ294, tag, owner, clock, PSG_TYPE_YM, 1, 0)
{
}
diff --git a/src/devices/sound/ay8910.h b/src/devices/sound/ay8910.h
index 29a7ae674d4..c1bbf718245 100644
--- a/src/devices/sound/ay8910.h
+++ b/src/devices/sound/ay8910.h
@@ -62,7 +62,7 @@ public:
};
// construction/destruction
- ay8910_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+ ay8910_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
// configuration helpers
void set_flags(int flags) { m_flags = flags; }
@@ -73,24 +73,21 @@ public:
auto port_a_write_callback() { return m_port_a_write_cb.bind(); }
auto port_b_write_callback() { return m_port_b_write_cb.bind(); }
- DECLARE_READ8_MEMBER( data_r );
- DECLARE_WRITE8_MEMBER( address_w );
- DECLARE_WRITE8_MEMBER( data_w );
- u8 read_data() { return ay8910_read_ym(); }
- void write_address(u8 data) { ay8910_write_ym(0, data); }
- void write_data(u8 data) { ay8910_write_ym(1, data); }
+ u8 data_r() { return ay8910_read_ym(); }
+ void address_w(u8 data);
+ void data_w(u8 data);
/* /RES */
- DECLARE_WRITE8_MEMBER( reset_w ) { ay8910_reset_ym(); }
+ void reset_w(u8 data = 0) { ay8910_reset_ym(); }
// use this when BC1 == A0; here, BC1=0 selects 'data' and BC1=1 selects 'latch address'
- DECLARE_WRITE8_MEMBER( data_address_w ) { ay8910_write_ym(~offset & 1, data); } // note that directly connecting BC1 to A0 puts data on 0 and address on 1
+ void data_address_w(offs_t offset, u8 data) { ay8910_write_ym(~offset & 1, data); } // note that directly connecting BC1 to A0 puts data on 0 and address on 1
// use this when BC1 == !A0; here, BC1=0 selects 'latch address' and BC1=1 selects 'data'
- DECLARE_WRITE8_MEMBER( address_data_w ) { ay8910_write_ym(offset & 1, data); }
+ void address_data_w(offs_t offset, u8 data) { ay8910_write_ym(offset & 1, data); }
// bc1=a0, bc2=a1
- DECLARE_WRITE8_MEMBER(write_bc1_bc2);
+ void write_bc1_bc2(offs_t offset, u8 data);
void set_volume(int channel,int volume);
void ay_set_clock(int clock);
@@ -113,13 +110,10 @@ public:
// internal interface for PSG component of YM device
// FIXME: these should be private, but vector06 accesses them directly
- void ay8910_write_ym(int addr, uint8_t data);
- uint8_t ay8910_read_ym();
- void ay8910_reset_ym();
protected:
ay8910_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner,
- uint32_t clock, psg_type_t psg_type, int streams, int ioports);
+ u32 clock, psg_type_t psg_type, int streams, int ioports);
// device-level overrides
virtual void device_start() override;
@@ -140,11 +134,15 @@ private:
// internal helpers
void set_type(psg_type_t psg_type);
- inline uint16_t mix_3D();
+ inline u16 mix_3D();
void ay8910_write_reg(int r, int v);
void build_mixer_table();
void ay8910_statesave();
+ void ay8910_write_ym(int addr, u8 data);
+ u8 ay8910_read_ym();
+ void ay8910_reset_ym();
+
// internal state
psg_type_t m_type;
int m_streams;
@@ -152,28 +150,29 @@ private:
int m_ready;
sound_stream *m_channel;
bool m_active;
- int32_t m_register_latch;
- uint8_t m_regs[16];
- int32_t m_last_enable;
- int32_t m_count[NUM_CHANNELS];
- uint8_t m_output[NUM_CHANNELS];
- uint8_t m_prescale_noise;
- int32_t m_count_noise;
- int32_t m_count_env;
- int8_t m_env_step;
- uint32_t m_env_volume;
- uint8_t m_hold,m_alternate,m_attack,m_holding;
- int32_t m_rng;
- uint8_t m_env_step_mask;
+ s32 m_register_latch;
+ u8 m_regs[16];
+ s32 m_last_enable;
+ s32 m_count[NUM_CHANNELS];
+ u8 m_output[NUM_CHANNELS];
+ u8 m_prescale_noise;
+ s32 m_count_noise;
+ s32 m_count_env;
+ s8 m_env_step;
+ u32 m_env_volume;
+ u8 m_hold,m_alternate,m_attack,m_holding;
+ s32 m_rng;
+ u8 m_mode;
+ u8 m_env_step_mask;
/* init parameters ... */
int m_step;
int m_zero_is_off;
- uint8_t m_vol_enabled[NUM_CHANNELS];
+ u8 m_vol_enabled[NUM_CHANNELS];
const ay_ym_param *m_par;
const ay_ym_param *m_par_env;
- int32_t m_vol_table[NUM_CHANNELS][16];
- int32_t m_env_table[NUM_CHANNELS][32];
- std::unique_ptr<int32_t[]> m_vol3d_table;
+ s32 m_vol_table[NUM_CHANNELS][16];
+ s32 m_env_table[NUM_CHANNELS][32];
+ std::unique_ptr<s32[]> m_vol3d_table;
int m_flags; /* Flags */
int m_res_load[3]; /* Load on channel in ohms */
devcb_read8 m_port_a_read_cb;
@@ -187,7 +186,7 @@ DECLARE_DEVICE_TYPE(AY8910, ay8910_device)
class ay8912_device : public ay8910_device
{
public:
- ay8912_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+ ay8912_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
};
DECLARE_DEVICE_TYPE(AY8912, ay8912_device)
@@ -195,7 +194,7 @@ DECLARE_DEVICE_TYPE(AY8912, ay8912_device)
class ay8913_device : public ay8910_device
{
public:
- ay8913_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+ ay8913_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
};
DECLARE_DEVICE_TYPE(AY8913, ay8913_device)
@@ -203,11 +202,11 @@ DECLARE_DEVICE_TYPE(AY8913, ay8913_device)
class ay8914_device : public ay8910_device
{
public:
- ay8914_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+ ay8914_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
/* AY8914 handlers needed due to different register map */
- DECLARE_READ8_MEMBER( read );
- DECLARE_WRITE8_MEMBER( write );
+ u8 read(offs_t offset);
+ void write(offs_t offset, u8 data);
};
DECLARE_DEVICE_TYPE(AY8914, ay8914_device)
@@ -215,7 +214,7 @@ DECLARE_DEVICE_TYPE(AY8914, ay8914_device)
class ay8930_device : public ay8910_device
{
public:
- ay8930_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+ ay8930_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
};
DECLARE_DEVICE_TYPE(AY8930, ay8930_device)
@@ -223,7 +222,7 @@ DECLARE_DEVICE_TYPE(AY8930, ay8930_device)
class ym2149_device : public ay8910_device
{
public:
- ym2149_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+ ym2149_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
};
DECLARE_DEVICE_TYPE(YM2149, ym2149_device)
@@ -231,7 +230,7 @@ DECLARE_DEVICE_TYPE(YM2149, ym2149_device)
class ym3439_device : public ay8910_device
{
public:
- ym3439_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+ ym3439_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
};
DECLARE_DEVICE_TYPE(YM3439, ym3439_device)
@@ -239,7 +238,7 @@ DECLARE_DEVICE_TYPE(YM3439, ym3439_device)
class ymz284_device : public ay8910_device
{
public:
- ymz284_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+ ymz284_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
};
DECLARE_DEVICE_TYPE(YMZ284, ymz284_device)
@@ -247,7 +246,7 @@ DECLARE_DEVICE_TYPE(YMZ284, ymz284_device)
class ymz294_device : public ay8910_device
{
public:
- ymz294_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+ ymz294_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
};
DECLARE_DEVICE_TYPE(YMZ294, ymz294_device)
diff --git a/src/devices/sound/bsmt2000.cpp b/src/devices/sound/bsmt2000.cpp
index 4104b83a619..f29e429390a 100644
--- a/src/devices/sound/bsmt2000.cpp
+++ b/src/devices/sound/bsmt2000.cpp
@@ -180,8 +180,8 @@ void bsmt2000_device::sound_stream_update(sound_stream &stream, stream_sample_t
// just fill with current left/right values
for (int samp = 0; samp < samples; samp++)
{
- outputs[0][samp] = m_left_data * 16;
- outputs[1][samp] = m_right_data * 16;
+ outputs[0][samp] = m_left_data;
+ outputs[1][samp] = m_right_data;
}
}
@@ -264,8 +264,8 @@ READ16_MEMBER( bsmt2000_device::tms_data_r )
READ16_MEMBER( bsmt2000_device::tms_rom_r )
{
- // underlying logic assumes this is a sign-extended value
- return (int8_t)read_byte((m_rom_bank << 16) + m_rom_address);
+ // DSP code expects a 16-bit value with the data in the high byte
+ return (int16_t)(read_byte((m_rom_bank << 16) + m_rom_address) << 8);
}
diff --git a/src/devices/sound/c140.cpp b/src/devices/sound/c140.cpp
index 0d72ac8be24..b5534959230 100644
--- a/src/devices/sound/c140.cpp
+++ b/src/devices/sound/c140.cpp
@@ -374,14 +374,14 @@ void c140_device::sound_stream_update(sound_stream &stream, stream_sample_t **in
}
-READ8_MEMBER( c140_device::c140_r )
+u8 c140_device::c140_r(offs_t offset)
{
offset&=0x1ff;
return m_REG[offset];
}
-WRITE8_MEMBER( c140_device::c140_w )
+void c140_device::c140_w(offs_t offset, u8 data)
{
m_stream->update();
diff --git a/src/devices/sound/c140.h b/src/devices/sound/c140.h
index cdc84a38fd1..dba89c78089 100644
--- a/src/devices/sound/c140.h
+++ b/src/devices/sound/c140.h
@@ -32,8 +32,8 @@ public:
// configuration
void set_bank_type(C140_TYPE bank) { m_banking_type = bank; }
- DECLARE_READ8_MEMBER( c140_r );
- DECLARE_WRITE8_MEMBER( c140_w );
+ u8 c140_r(offs_t offset);
+ void c140_w(offs_t offset, u8 data);
protected:
// device-level overrides
diff --git a/src/devices/sound/cdp1864.cpp b/src/devices/sound/cdp1864.cpp
index 58697352b8d..de39b3390c8 100644
--- a/src/devices/sound/cdp1864.cpp
+++ b/src/devices/sound/cdp1864.cpp
@@ -470,18 +470,18 @@ void cdp1864_device::initialize_palette()
// foreground colors
uint8_t r = 0, g = 0, b = 0;
- if (m_chr_r != RES_INF) r = combine_1_weights(color_weights_r, BIT(i, 0));
- if (m_chr_b != RES_INF) b = combine_1_weights(color_weights_b, BIT(i, 1));
- if (m_chr_g != RES_INF) g = combine_1_weights(color_weights_g, BIT(i, 2));
+ if (m_chr_r != RES_INF) r = combine_weights(color_weights_r, BIT(i, 0));
+ if (m_chr_b != RES_INF) b = combine_weights(color_weights_b, BIT(i, 1));
+ if (m_chr_g != RES_INF) g = combine_weights(color_weights_g, BIT(i, 2));
m_palette[i] = rgb_t(r, g, b);
// background colors
r = 0, g = 0, b = 0;
- if (m_chr_r != RES_INF) r = combine_1_weights(color_weights_bkg_r, BIT(i, 0));
- if (m_chr_b != RES_INF) b = combine_1_weights(color_weights_bkg_b, BIT(i, 1));
- if (m_chr_g != RES_INF) g = combine_1_weights(color_weights_bkg_g, BIT(i, 2));
+ if (m_chr_r != RES_INF) r = combine_weights(color_weights_bkg_r, BIT(i, 0));
+ if (m_chr_b != RES_INF) b = combine_weights(color_weights_bkg_b, BIT(i, 1));
+ if (m_chr_g != RES_INF) g = combine_weights(color_weights_bkg_g, BIT(i, 2));
m_palette[i + 8] = rgb_t(r, g, b);
}
diff --git a/src/devices/sound/cdp1869.cpp b/src/devices/sound/cdp1869.cpp
index 1347081549a..661611531d8 100644
--- a/src/devices/sound/cdp1869.cpp
+++ b/src/devices/sound/cdp1869.cpp
@@ -88,7 +88,8 @@ void cdp1869_device::page_map(address_map &map)
// default address map
void cdp1869_device::cdp1869(address_map &map)
{
- map(0x000, 0x7ff).ram();
+ if (!has_configured_map(0))
+ map(0x000, 0x7ff).ram();
}
@@ -359,7 +360,7 @@ cdp1869_device::cdp1869_device(const machine_config &mconfig, const char *tag, d
m_color_clock(0),
m_stream(nullptr),
m_palette(*this, "palette"),
- m_space_config("pageram", ENDIANNESS_LITTLE, 8, 11, 0, address_map_constructor(), address_map_constructor(FUNC(cdp1869_device::cdp1869), this))
+ m_space_config("pageram", ENDIANNESS_LITTLE, 8, 11, 0, address_map_constructor(FUNC(cdp1869_device::cdp1869), this))
{
}
diff --git a/src/devices/sound/dac.h b/src/devices/sound/dac.h
index 96ebb2757d7..434f82ba4f9 100644
--- a/src/devices/sound/dac.h
+++ b/src/devices/sound/dac.h
@@ -258,7 +258,7 @@ DECLARE_DEVICE_TYPE(_dac_type, _dac_class) \
class _dac_class : public dac_generator<_dac_interface, _dac_coding> \
{\
public: \
- _dac_class(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : \
+ _dac_class(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock = 0) : \
dac_generator(mconfig, _dac_type, tag, owner, clock, _dac_gain) {} \
}; \
DAC_GENERATOR_EPILOG(_dac_type, _dac_class, _dac_description, _dac_shortname)
diff --git a/src/devices/sound/es1373.cpp b/src/devices/sound/es1373.cpp
index 9279e3558cd..dbc0c6a96d8 100644
--- a/src/devices/sound/es1373.cpp
+++ b/src/devices/sound/es1373.cpp
@@ -71,10 +71,11 @@
#define ES_PCI_READ 0
#define ES_PCI_WRITE 1
-MACHINE_CONFIG_START(es1373_device::device_add_mconfig)
+void es1373_device::device_add_mconfig(machine_config &config)
+{
SPEAKER(config, "lspeaker").front_left();
SPEAKER(config, "rspeaker").front_right();
-MACHINE_CONFIG_END
+}
DEFINE_DEVICE_TYPE(ES1373, es1373_device, "es1373", "Creative Labs Ensoniq AudioPCI97 ES1373")
diff --git a/src/devices/sound/es5506.cpp b/src/devices/sound/es5506.cpp
index f243f0c06e7..2702d58fa25 100644
--- a/src/devices/sound/es5506.cpp
+++ b/src/devices/sound/es5506.cpp
@@ -156,7 +156,8 @@ es550x_device::es550x_device(const machine_config &mconfig, device_type type, co
m_region3(nullptr),
m_channels(0),
m_irq_cb(*this),
- m_read_port_cb(*this)
+ m_read_port_cb(*this),
+ m_sample_rate_changed_cb(*this)
{
for (auto & elem : m_region_base)
{
@@ -230,6 +231,7 @@ void es5506_device::device_start()
m_master_clock = clock();
m_irq_cb.resolve();
m_read_port_cb.resolve();
+ m_sample_rate_changed_cb.resolve();
m_irqv = 0x80;
m_channels = channels;
@@ -309,6 +311,8 @@ void es550x_device::device_clock_changed()
m_master_clock = clock();
m_sample_rate = m_master_clock / (16 * (m_active_voices + 1));
m_stream->set_sample_rate(m_sample_rate);
+ if (!m_sample_rate_changed_cb.isnull())
+ m_sample_rate_changed_cb(m_sample_rate);
}
//-------------------------------------------------
@@ -378,6 +382,7 @@ void es5505_device::device_start()
m_master_clock = clock();
m_irq_cb.resolve();
m_read_port_cb.resolve();
+ m_sample_rate_changed_cb.resolve();
m_irqv = 0x80;
m_channels = channels;
@@ -1215,6 +1220,8 @@ inline void es5506_device::reg_write_low(es550x_voice *voice, offs_t offset, uin
m_active_voices = data & 0x1f;
m_sample_rate = m_master_clock / (16 * (m_active_voices + 1));
m_stream->set_sample_rate(m_sample_rate);
+ if (!m_sample_rate_changed_cb.isnull())
+ m_sample_rate_changed_cb(m_sample_rate);
LOG("active voices=%d, sample_rate=%d\n", m_active_voices, m_sample_rate);
break;
@@ -1749,6 +1756,8 @@ inline void es5505_device::reg_write_low(es550x_voice *voice, offs_t offset, uin
m_active_voices = data & 0x1f;
m_sample_rate = m_master_clock / (16 * (m_active_voices + 1));
m_stream->set_sample_rate(m_sample_rate);
+ if (!m_sample_rate_changed_cb.isnull())
+ m_sample_rate_changed_cb(m_sample_rate);
LOG("active voices=%d, sample_rate=%d\n", m_active_voices, m_sample_rate);
}
@@ -1847,6 +1856,8 @@ inline void es5505_device::reg_write_high(es550x_voice *voice, offs_t offset, ui
m_active_voices = data & 0x1f;
m_sample_rate = m_master_clock / (16 * (m_active_voices + 1));
m_stream->set_sample_rate(m_sample_rate);
+ if (!m_sample_rate_changed_cb.isnull())
+ m_sample_rate_changed_cb(m_sample_rate);
LOG("active voices=%d, sample_rate=%d\n", m_active_voices, m_sample_rate);
}
@@ -1890,6 +1901,8 @@ inline void es5505_device::reg_write_test(es550x_voice *voice, offs_t offset, ui
m_active_voices = data & 0x1f;
m_sample_rate = m_master_clock / (16 * (m_active_voices + 1));
m_stream->set_sample_rate(m_sample_rate);
+ if (!m_sample_rate_changed_cb.isnull())
+ m_sample_rate_changed_cb(m_sample_rate);
LOG("active voices=%d, sample_rate=%d\n", m_active_voices, m_sample_rate);
}
diff --git a/src/devices/sound/es5506.h b/src/devices/sound/es5506.h
index 38a006ea967..ddf38d19fb9 100644
--- a/src/devices/sound/es5506.h
+++ b/src/devices/sound/es5506.h
@@ -25,6 +25,7 @@ public:
auto irq_cb() { return m_irq_cb.bind(); }
auto read_port_cb() { return m_read_port_cb.bind(); }
+ auto sample_rate_changed() { return m_sample_rate_changed_cb.bind(); }
protected:
// struct describing a single playing voice
@@ -114,6 +115,7 @@ protected:
int m_channels; /* number of output channels: 1 .. 6 */
devcb_write_line m_irq_cb; /* irq callback */
devcb_read16 m_read_port_cb; /* input port read */
+ devcb_write32 m_sample_rate_changed_cb; /* callback for when sample rate is changed */
};
diff --git a/src/devices/sound/es8712.cpp b/src/devices/sound/es8712.cpp
index e0b2699edd0..00ec7fe90d3 100644
--- a/src/devices/sound/es8712.cpp
+++ b/src/devices/sound/es8712.cpp
@@ -228,7 +228,7 @@ WRITE_LINE_MEMBER(es8712_device::msm_int)
}
else
{
- m_adpcm_select->write_ab(read_byte(m_base_offset));
+ m_adpcm_select->ab_w(read_byte(m_base_offset));
m_adpcm_select->select_w(m_adpcm_trigger);
m_adpcm_trigger ^= 1;
if (m_adpcm_trigger == 0)
diff --git a/src/devices/sound/es8712.h b/src/devices/sound/es8712.h
index d355bd10633..b1cfafc1424 100644
--- a/src/devices/sound/es8712.h
+++ b/src/devices/sound/es8712.h
@@ -23,7 +23,7 @@ public:
es8712_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
// configuration
- void set_msm_tag(const char *tag) { m_msm.set_tag(tag); }
+ template <typename T> void set_msm_tag(T &&tag) { m_msm.set_tag(std::forward<T>(tag)); }
auto reset_handler() { return m_reset_handler.bind(); }
auto msm_write_handler() { return m_msm_write_cb.bind(); }
diff --git a/src/devices/sound/esqpump.cpp b/src/devices/sound/esqpump.cpp
index f817b0d7274..5ed977b9f81 100644
--- a/src/devices/sound/esqpump.cpp
+++ b/src/devices/sound/esqpump.cpp
@@ -16,8 +16,12 @@ DEFINE_DEVICE_TYPE(ESQ_5505_5510_PUMP, esq_5505_5510_pump_device, "esq_5505_5510
esq_5505_5510_pump_device::esq_5505_5510_pump_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
: device_t(mconfig, ESQ_5505_5510_PUMP, tag, owner, clock)
, device_sound_interface(mconfig, *this)
- , m_stream(nullptr), m_timer(nullptr), m_esp(nullptr)
- , m_esp_halted(true), ticks_spent_processing(0), samples_processed(0)
+ , m_stream(nullptr)
+ , m_timer(nullptr)
+ , m_esp(*this, finder_base::DUMMY_TAG)
+ , m_esp_halted(true)
+ , ticks_spent_processing(0)
+ , samples_processed(0)
{
#if !PUMP_FAKE_ESP_PROCESSING && PUMP_REPLACE_ESP_PROGRAM
e = nullptr;
@@ -59,14 +63,16 @@ void esq_5505_5510_pump_device::device_stop()
void esq_5505_5510_pump_device::device_reset()
{
- int64_t nsec_per_sample = 100 * 16 * 21;
- attotime sample_time(0, 1000000000 * nsec_per_sample);
- attotime initial_delay(0, 0);
-
- m_timer->adjust(initial_delay, 0, sample_time);
+ m_timer->adjust(attotime::zero, 0, attotime::from_hz(clock()));
m_timer->enable(true);
}
+void esq_5505_5510_pump_device::device_clock_changed()
+{
+ m_stream->set_sample_rate(clock());
+ m_timer->adjust(attotime::zero, 0, attotime::from_hz(clock()));
+}
+
void esq_5505_5510_pump_device::sound_stream_update(sound_stream &stream, stream_sample_t **inputs, stream_sample_t **outputs, int samples)
{
if (samples != 1) {
diff --git a/src/devices/sound/esqpump.h b/src/devices/sound/esqpump.h
index a95ee84c292..8ebd12bccb0 100644
--- a/src/devices/sound/esqpump.h
+++ b/src/devices/sound/esqpump.h
@@ -20,7 +20,7 @@ public:
esq_5505_5510_pump_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- void set_esp(es5510_device *esp) { m_esp = esp; }
+ template <typename T> void set_esp(T &&tag) { m_esp.set_tag(std::forward<T>(tag)); }
void set_esp_halted(bool esp_halted) {
m_esp_halted = esp_halted;
logerror("ESP-halted -> %d\n", m_esp_halted);
@@ -72,6 +72,7 @@ protected:
virtual void device_start() override;
virtual void device_stop() override;
virtual void device_reset() override;
+ virtual void device_clock_changed() override;
// sound stream update overrides
virtual void sound_stream_update(sound_stream &stream, stream_sample_t **inputs, stream_sample_t **outputs, int samples) override;
@@ -88,7 +89,7 @@ private:
emu_timer *m_timer;
// ESP signal processor
- es5510_device *m_esp;
+ required_device<es5510_device> m_esp;
// Is the ESP halted by the CPU?
bool m_esp_halted;
diff --git a/src/devices/sound/gaelco.cpp b/src/devices/sound/gaelco.cpp
index 57167945cae..c8109ce5acd 100644
--- a/src/devices/sound/gaelco.cpp
+++ b/src/devices/sound/gaelco.cpp
@@ -131,7 +131,9 @@ void gaelco_gae1_device::sound_stream_update(sound_stream &stream, stream_sample
}
} else {
LOG_SOUND(("(GAE1) Playing unknown sample format in channel: %02d, type: %02x, bank: %02x, end: %08x, Length: %04x\n", ch, type, bank, end_pos, m_sndregs[base_offset + 3]));
- channel->active = 0;
+ //channel->active = 0;
+ // play2000 expects these to expire, are they valid? this is unrelated to the missing sounds in touchgo which never hits here
+ m_sndregs[base_offset + 3]--;
}
/* check if the current sample has finished playing */
diff --git a/src/devices/sound/ics2115.cpp b/src/devices/sound/ics2115.cpp
index 12062e9a509..9ce19fe649f 100644
--- a/src/devices/sound/ics2115.cpp
+++ b/src/devices/sound/ics2115.cpp
@@ -15,9 +15,9 @@
//#define ICS2115_ISOLATE 6
// device type definition
-DEFINE_DEVICE_TYPE(ICS2115, ics2115_device, "ics2115", "ICS2115")
+DEFINE_DEVICE_TYPE(ICS2115, ics2115_device, "ics2115", "ICS2115 WaveFront Synthesizer")
-ics2115_device::ics2115_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+ics2115_device::ics2115_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
: device_t(mconfig, ICS2115, tag, owner, clock),
device_sound_interface(mconfig, *this), m_stream(nullptr),
m_rom(*this, DEVICE_SELF),
@@ -36,26 +36,26 @@ void ics2115_device::device_start()
//Exact formula as per patent 5809466
//This seems to give the ok fit but it is not good enough.
/*double maxvol = ((1 << volume_bits) - 1) * pow(2., (double)1/0x100);
- for (int i = 0; i < 0x1000; i++) {
+ for (int i = 0; i < 0x1000; i++)
m_volume[i] = floor(maxvol * pow(2.,(double)i/256 - 16) + 0.5);
- }*/
+ */
//austere's table, derived from patent 5809466:
//See section V starting from page 195
//Subsection F (column 124, page 198) onwards
- for (int i = 0; i<4096; i++) {
+ for (int i = 0; i<4096; i++)
m_volume[i] = ((0x100 | (i & 0xff)) << (volume_bits-9)) >> (15 - (i>>8));
- }
//u-Law table as per MIL-STD-188-113
- uint16_t lut[8];
- uint16_t lut_initial = 33 << 2; //shift up 2-bits for 16-bit range.
- for(int i = 0; i < 8; i++)
+ u16 lut[8];
+ u16 lut_initial = 33 << 2; //shift up 2-bits for 16-bit range.
+ for (int i = 0; i < 8; i++)
lut[i] = (lut_initial << i) - lut_initial;
- for(int i = 0; i < 256; i++) {
- uint8_t exponent = (~i >> 4) & 0x07;
- uint8_t mantissa = ~i & 0x0f;
- int16_t value = lut[exponent] + (mantissa << (exponent + 3));
+ for (int i = 0; i < 256; i++)
+ {
+ u8 exponent = (~i >> 4) & 0x07;
+ u8 mantissa = ~i & 0x0f;
+ s16 value = lut[exponent] + (mantissa << (exponent + 3));
m_ulaw[i] = (i & 0x80) ? -value : value;
}
@@ -73,7 +73,8 @@ void ics2115_device::device_start()
save_item(NAME(m_active_osc));
save_item(NAME(m_vmode));
- for(int i = 0; i < 32; i++) {
+ for (int i = 0; i < 32; i++)
+ {
save_item(NAME(m_voice[i].osc_conf.value), i);
save_item(NAME(m_voice[i].state.value), i);
save_item(NAME(m_voice[i].vol_ctrl.value), i);
@@ -108,14 +109,15 @@ void ics2115_device::device_reset()
m_vmode = 0;
m_irq_on = false;
memset(m_voice, 0, sizeof(m_voice));
- for(auto & elem : m_timer)
+ for (auto & elem : m_timer)
{
elem.timer->adjust(attotime::never);
elem.period = 0;
elem.scale = 0;
elem.preset = 0;
}
- for(auto & elem : m_voice) {
+ for (auto & elem : m_voice)
+ {
elem.osc_conf.value = 2;
elem.osc.fc = 0;
elem.osc.acc = 0;
@@ -127,7 +129,7 @@ void ics2115_device::device_reset()
elem.vol.incr = 0;
elem.vol.start = 0;
elem.vol.end = 0;
- elem.vol.pan = 0x7F;
+ elem.vol.pan = 0x7f;
elem.vol_ctrl.value = 1;
elem.vol.mode = 0;
elem.state.value = 0;
@@ -138,40 +140,47 @@ void ics2115_device::device_reset()
int ics2115_device::ics2115_voice::update_volume_envelope()
{
int ret = 0;
- if(vol_ctrl.bitflags.done || vol_ctrl.bitflags.stop)
+ if (vol_ctrl.bitflags.done || vol_ctrl.bitflags.stop)
return ret;
- if(vol_ctrl.bitflags.invert) {
+ if (vol_ctrl.bitflags.invert)
+ {
vol.acc -= vol.add;
vol.left = vol.acc - vol.start;
- } else {
+ }
+ else
+ {
vol.acc += vol.add;
vol.left = vol.end - vol.acc;
}
- if(vol.left > 0)
+ if (vol.left > 0)
return ret;
- if(vol_ctrl.bitflags.irq) {
+ if (vol_ctrl.bitflags.irq)
+ {
vol_ctrl.bitflags.irq_pending = true;
ret = 1;
}
- if(osc_conf.bitflags.eightbit)
+ if (osc_conf.bitflags.eightbit)
return ret;
- if(vol_ctrl.bitflags.loop) {
- if(vol_ctrl.bitflags.loop_bidir)
+ if (vol_ctrl.bitflags.loop)
+ {
+ if (vol_ctrl.bitflags.loop_bidir)
vol_ctrl.bitflags.invert = !vol_ctrl.bitflags.invert;
- if(vol_ctrl.bitflags.invert)
+ if (vol_ctrl.bitflags.invert)
vol.acc = vol.end + vol.left;
else
vol.acc = vol.start - vol.left;
- } else {
+ }
+ else
+ {
state.bitflags.on = false;
vol_ctrl.bitflags.done = true;
- if(vol_ctrl.bitflags.invert)
+ if (vol_ctrl.bitflags.invert)
vol.acc = vol.end;
else
vol.acc = vol.start;
@@ -180,7 +189,7 @@ int ics2115_device::ics2115_voice::update_volume_envelope()
return ret;
}
-/*uint32_t ics2115_device::ics2115_voice::next_address()
+/*u32 ics2115_device::ics2115_voice::next_address()
{
//Patent 6,246,774 B1, Column 111, Row 25
//LEN BLEN DIR BC NextAddress
@@ -198,40 +207,49 @@ int ics2115_device::ics2115_voice::update_volume_envelope()
int ics2115_device::ics2115_voice::update_oscillator()
{
int ret = 0;
- if(osc_conf.bitflags.stop)
+ if (osc_conf.bitflags.stop)
return ret;
- if(osc_conf.bitflags.invert) {
+ if (osc_conf.bitflags.invert)
+ {
osc.acc -= osc.fc << 2;
osc.left = osc.acc - osc.start;
- } else {
+ }
+ else
+ {
osc.acc += osc.fc << 2;
osc.left = osc.end - osc.acc;
}
// > instead of >= to stop crackling?
- if(osc.left > 0)
+ if (osc.left > 0)
return ret;
- if(osc_conf.bitflags.irq) {
+ if (osc_conf.bitflags.irq)
+ {
osc_conf.bitflags.irq_pending = true;
ret = 1;
}
- if(osc_conf.bitflags.loop) {
- if(osc_conf.bitflags.loop_bidir)
+ if (osc_conf.bitflags.loop)
+ {
+ if (osc_conf.bitflags.loop_bidir)
osc_conf.bitflags.invert = !osc_conf.bitflags.invert;
//else
- // printf("click!\n");
+ // logerror("click!\n");
- if(osc_conf.bitflags.invert) {
+ if (osc_conf.bitflags.invert)
+ {
osc.acc = osc.end + osc.left;
osc.left = osc.acc - osc.start;
}
- else {
+ else
+ {
osc.acc = osc.start - osc.left;
osc.left = osc.end - osc.acc;
}
- } else {
+ }
+ else
+ {
state.bitflags.on = false;
osc_conf.bitflags.stop = true;
- if(!osc_conf.bitflags.invert)
+ if (!osc_conf.bitflags.invert)
osc.acc = osc.end;
else
osc.acc = osc.start;
@@ -242,41 +260,44 @@ int ics2115_device::ics2115_voice::update_oscillator()
//TODO: proper interpolation for uLaw (fill_output doesn't use this) and 8-bit samples (looping)
stream_sample_t ics2115_device::get_sample(ics2115_voice& voice)
{
- uint32_t curaddr = ((voice.osc.saddr << 20) & 0xffffff) | (voice.osc.acc >> 12);
- uint32_t nextaddr;
+ u32 curaddr = ((voice.osc.saddr << 20) & 0xffffff) | (voice.osc.acc >> 12);
+ u32 nextaddr;
if (voice.state.bitflags.on && voice.osc_conf.bitflags.loop && !voice.osc_conf.bitflags.loop_bidir &&
- (voice.osc.left < (voice.osc.fc <<2))) {
- //printf("C?[%x:%x]", voice.osc.left, voice.osc.acc);
+ (voice.osc.left < (voice.osc.fc <<2)))
+ {
+ //logerror("C?[%x:%x]", voice.osc.left, voice.osc.acc);
nextaddr = ((voice.osc.saddr << 20) & 0xffffff) | (voice.osc.start >> 12);
}
else
nextaddr = curaddr + 2;
- int16_t sample1, sample2;
- if (voice.osc_conf.bitflags.eightbit) {
- sample1 = ((int8_t)m_rom[curaddr]) << 8;
- sample2 = ((int8_t)m_rom[curaddr + 1]) << 8;
+ s16 sample1, sample2;
+ if (voice.osc_conf.bitflags.eightbit)
+ {
+ sample1 = ((s8)m_rom[curaddr]) << 8;
+ sample2 = ((s8)m_rom[curaddr + 1]) << 8;
}
- else {
- sample1 = m_rom[curaddr + 0] | (((int8_t)m_rom[curaddr + 1]) << 8);
- sample2 = m_rom[nextaddr+ 0] | (((int8_t)m_rom[nextaddr+ 1]) << 8);
- //sample2 = m_rom[curaddr + 2] | (((int8_t)m_rom[curaddr + 3]) << 8);
+ else
+ {
+ sample1 = m_rom[curaddr + 0] | (((s8)m_rom[curaddr + 1]) << 8);
+ sample2 = m_rom[nextaddr+ 0] | (((s8)m_rom[nextaddr+ 1]) << 8);
+ //sample2 = m_rom[curaddr + 2] | (((s8)m_rom[curaddr + 3]) << 8);
}
//no need for interpolation since it's around 1 note a cycle?
- //if(voice.osc.fc >> 10)
+ //if (voice.osc.fc >> 10)
// return sample1;
//linear interpolation as in US patent 6,246,774 B1, column 2 row 59
//LEN=1, BLEN=0, DIR=0, start+end interpolation
- int32_t sample, diff;
- uint16_t fract;
+ s32 sample, diff;
+ u16 fract;
diff = sample2 - sample1;
fract = (voice.osc.acc >> 3) & 0x1ff;
- sample = (((int32_t)sample1 << 9) + diff * fract) >> 9;
+ sample = (((s32)sample1 << 9) + diff * fract) >> 9;
//sample = sample1;
return sample;
}
@@ -286,16 +307,19 @@ bool ics2115_device::ics2115_voice::playing()
return state.bitflags.on && !((vol_ctrl.bitflags.done || vol_ctrl.bitflags.stop) && osc_conf.bitflags.stop);
}
-void ics2115_device::ics2115_voice::update_ramp() {
+void ics2115_device::ics2115_voice::update_ramp()
+{
//slow attack
- if (state.bitflags.on && !osc_conf.bitflags.stop) {
+ if (state.bitflags.on && !osc_conf.bitflags.stop)
+ {
if (state.bitflags.ramp < 0x40)
state.bitflags.ramp += 0x1;
else
state.bitflags.ramp = 0x40;
}
//slow release
- else {
+ else
+ {
if (state.bitflags.ramp)
state.bitflags.ramp -= 0x1;
}
@@ -304,14 +328,15 @@ void ics2115_device::ics2115_voice::update_ramp() {
int ics2115_device::fill_output(ics2115_voice& voice, stream_sample_t *outputs[2], int samples)
{
bool irq_invalid = false;
- uint16_t fine = 1 << (3*(voice.vol.incr >> 6));
- voice.vol.add = (voice.vol.incr & 0x3F)<< (10 - fine);
+ u16 fine = 1 << (3*(voice.vol.incr >> 6));
+ voice.vol.add = (voice.vol.incr & 0x3f)<< (10 - fine);
- for (int i = 0; i < samples; i++) {
- uint32_t volacc = (voice.vol.acc >> 10) & 0xffff;
- uint32_t volume = (m_volume[volacc >> 4] * voice.state.bitflags.ramp) >> 6;
- uint16_t vleft = volume; //* (255 - voice.vol.pan) / 0x80];
- uint16_t vright = volume; //* (voice.vol.pan + 1) / 0x80];
+ for (int i = 0; i < samples; i++)
+ {
+ u32 volacc = (voice.vol.acc >> 10) & 0xffff;
+ u32 volume = (m_volume[volacc >> 4] * voice.state.bitflags.ramp) >> 6;
+ u16 vleft = volume; //* (255 - voice.vol.pan) / 0x80];
+ u16 vright = volume; //* (voice.vol.pan + 1) / 0x80];
//From GUS doc:
//In general, it is necessary to remember that all voices are being summed in to the
@@ -319,22 +344,26 @@ int ics2115_device::fill_output(ics2115_voice& voice, stream_sample_t *outputs[2
//that the voice is pointing at is contributing to the summation.
//(austere note: this will of course fix some of the glitches due to multiple transition)
stream_sample_t sample;
- if(voice.osc_conf.bitflags.ulaw) {
- uint32_t curaddr = ((voice.osc.saddr << 20) & 0xffffff) | (voice.osc.acc >> 12);
+ if (voice.osc_conf.bitflags.ulaw)
+ {
+ u32 curaddr = ((voice.osc.saddr << 20) & 0xffffff) | (voice.osc.acc >> 12);
sample = m_ulaw[m_rom[curaddr]];
}
else
sample = get_sample(voice);
//15-bit volume + (5-bit worth of 32 channel sum) + 16-bit samples = 4-bit extra
- if (!m_vmode || voice.playing()) {
- //if (voice.playing()) {
+ if (!m_vmode || voice.playing())
+ {
+ /*if (voice.playing())
+ {*/
outputs[0][i] += (sample * vleft) >> (5 + volume_bits - 16);
outputs[1][i] += (sample * vright) >> (5 + volume_bits - 16);
}
voice.update_ramp();
- if (voice.playing()) {
+ if (voice.playing())
+ {
if (voice.update_oscillator())
irq_invalid = true;
if (voice.update_volume_envelope())
@@ -350,71 +379,77 @@ void ics2115_device::sound_stream_update(sound_stream &stream, stream_sample_t *
memset(outputs[1], 0, samples * sizeof(stream_sample_t));
bool irq_invalid = false;
- for(int osc = 0; osc <= m_active_osc; osc++) {
+ for (int osc = 0; osc <= m_active_osc; osc++)
+ {
ics2115_voice& voice = m_voice[osc];
#ifdef ICS2115_ISOLATE
- if(osc != ICS2115_ISOLATE)
+ if (osc != ICS2115_ISOLATE)
continue;
#endif
/*
#ifdef ICS2115_DEBUG
- uint32_t curaddr = ((voice.osc.saddr << 20) & 0xffffff) | (voice.osc.acc >> 12);
+ u32 curaddr = ((voice.osc.saddr << 20) & 0xffffff) | (voice.osc.acc >> 12);
stream_sample_t sample;
- if(voice.osc_conf.bitflags.ulaw)
+ if (voice.osc_conf.bitflags.ulaw)
sample = m_ulaw[m_rom[curaddr]];
else
sample = get_sample(voice);
- printf("[%06x=%04x]", curaddr, (int16_t)sample);
+ logerror("[%06x=%04x]", curaddr, (s16)sample);
#endif
*/
- if(fill_output(voice, outputs, samples))
+ if (fill_output(voice, outputs, samples))
irq_invalid = true;
#ifdef ICS2115_DEBUG
- if(voice.playing()) {
- printf("%d", osc);
+ if (voice.playing())
+ {
+ logerror("%d", osc);
if (voice.osc_conf.bitflags.invert)
- printf("+");
+ logerror("+");
else if ((voice.osc.fc >> 1) > 0x1ff)
- printf("*");
- printf(" ");
+ logerror("*");
+ logerror(" ");
/*int min = 0x7fffffff, max = 0x80000000;
double average = 0;
- for (int i = 0; i < samples; i++) {
+ for (int i = 0; i < samples; i++)
+ {
if (outputs[0][i] > max) max = outputs[0][i];
if (outputs[0][i] < min) min = outputs[0][i];
average += fabs(outputs[0][i]);
}
average /= samples;
average /= 1 << 16;
- printf("<Mi:%d Mx:%d Av:%g>", min >> 16, max >> 16, average);*/
+ logerror("<Mi:%d Mx:%d Av:%g>", min >> 16, max >> 16, average);*/
}
#endif
}
#ifdef ICS2115_DEBUG
- printf("|");
+ logerror("|");
#endif
//rescale
- for (int i = 0; i < samples; i++) {
+ for (int i = 0; i < samples; i++)
+ {
outputs[0][i] >>= 16;
outputs[1][i] >>= 16;
}
- if(irq_invalid)
+ if (irq_invalid)
recalc_irq();
}
//Helper Function (Reads off current register)
-uint16_t ics2115_device::reg_read() {
- uint16_t ret;
+u16 ics2115_device::reg_read()
+{
+ u16 ret;
ics2115_voice& voice = m_voice[m_osc_select];
- switch(m_reg_select) {
+ switch (m_reg_select)
+ {
case 0x00: // [osc] Oscillator Configuration
ret = voice.osc_conf.value;
ret <<= 8;
@@ -460,33 +495,33 @@ uint16_t ics2115_device::reg_read() {
ret = voice.vol.acc >> (10);
break;
- case 0x0A: // [osc] Wavesample address
+ case 0x0a: // [osc] Wavesample address
ret = (voice.osc.acc >> 16) & 0xffff;
break;
- case 0x0B: // [osc] Wavesample address
+ case 0x0b: // [osc] Wavesample address
ret = (voice.osc.acc >> 0) & 0xfff8;
break;
- case 0x0C: // [osc] Pan
+ case 0x0c: // [osc] Pan
ret = voice.vol.pan << 8;
break;
/* DDP3 code (trap15's reversal) */
/* 0xA13's work:
res = read() & 0xC3;
- if(!(res & 2)) res |= 1;
+ if (!(res & 2)) res |= 1;
e = d = res;
*/
/* 0xA4F's work:
while(!(read() & 1))
*/
- case 0x0D: // [osc] Volume Envelope Control
+ case 0x0d: // [osc] Volume Envelope Control
//ret = v->Vol.Ctl | ((v->state & FLAG_STATE_VOLIRQ) ? 0x81 : 1);
// may expect |8 on voice irq with &40 == 0
// may expect |8 on reg 0 on voice irq with &80 == 0
- // ret = 0xFF;
+ // ret = 0xff;
if (!m_vmode)
ret = voice.vol_ctrl.bitflags.irq ? 0x81 : 0x01;
else
@@ -495,24 +530,28 @@ uint16_t ics2115_device::reg_read() {
ret <<= 8;
break;
- case 0x0E: // Active Voices
+ case 0x0e: // Active Voices
ret = m_active_osc;
break;
- case 0x0F:{// [osc] Interrupt source/oscillator
+ case 0x0f:{// [osc] Interrupt source/oscillator
ret = 0xff;
- for (int i = 0; i <= m_active_osc; i++) {
+ for (int i = 0; i <= m_active_osc; i++)
+ {
ics2115_voice& v = m_voice[i];
- if (v.osc_conf.bitflags.irq_pending || v.vol_ctrl.bitflags.irq_pending) {
+ if (v.osc_conf.bitflags.irq_pending || v.vol_ctrl.bitflags.irq_pending)
+ {
ret = i | 0xe0;
ret &= v.vol_ctrl.bitflags.irq_pending ? (~0x40) : 0xff;
ret &= v.osc_conf.bitflags.irq_pending ? (~0x80) : 0xff;
recalc_irq();
- if (v.osc_conf.bitflags.irq_pending) {
+ if (v.osc_conf.bitflags.irq_pending)
+ {
v.osc_conf.bitflags.irq_pending = 0;
ret &= ~0x80;
}
- if (v.vol_ctrl.bitflags.irq_pending) {
+ if (v.vol_ctrl.bitflags.irq_pending)
+ {
v.vol_ctrl.bitflags.irq_pending = 0;
ret &= ~0x40;
}
@@ -542,21 +581,21 @@ uint16_t ics2115_device::reg_read() {
ret = m_irq_pending & 3;
break;
- case 0x4A: // IRQ Pending
+ case 0x4a: // IRQ Pending
ret = m_irq_pending;
break;
- case 0x4B: // Address of Interrupting Oscillator
+ case 0x4b: // Address of Interrupting Oscillator
ret = 0x80;
break;
- case 0x4C: // Chip Revision
+ case 0x4c: // Chip Revision
ret = revision;
break;
default:
#ifdef ICS2115_DEBUG
- printf("ICS2115: Unhandled read %x\n", m_reg_select);
+ logerror("ICS2115: Unhandled read %x\n", m_reg_select);
#endif
ret = 0;
break;
@@ -564,140 +603,147 @@ uint16_t ics2115_device::reg_read() {
return ret;
}
-void ics2115_device::reg_write(uint8_t data, bool msb) {
+void ics2115_device::reg_write(u16 data, u16 mem_mask)
+{
ics2115_voice& voice = m_voice[m_osc_select];
- switch(m_reg_select) {
+ switch (m_reg_select)
+ {
case 0x00: // [osc] Oscillator Configuration
- if(msb) {
+ if (ACCESSING_BITS_8_15)
+ {
voice.osc_conf.value &= 0x80;
- voice.osc_conf.value |= data & 0x7f;
+ voice.osc_conf.value |= (data >> 8) & 0x7f;
}
break;
case 0x01: // [osc] Wavesample frequency
// freq = fc*33075/1024 in 32 voices mode, fc*44100/1024 in 24 voices mode
- if(msb)
- voice.osc.fc = (voice.osc.fc & 0x00ff) | (data << 8);
- else
+ if (ACCESSING_BITS_8_15)
+ voice.osc.fc = (voice.osc.fc & 0x00fe) | (data & 0xff00);
+ if (ACCESSING_BITS_0_7)
//last bit not used!
- voice.osc.fc = (voice.osc.fc & 0xff00) | (data & 0xfe);
+ voice.osc.fc = (voice.osc.fc & 0xff00) | (data & 0x00fe);
break;
case 0x02: // [osc] Wavesample loop start high
- if(msb)
- voice.osc.start = (voice.osc.start & 0x00ffffff) | (data << 24);
- else
- voice.osc.start = (voice.osc.start & 0xff00ffff) | (data << 16);
+ if (ACCESSING_BITS_8_15)
+ voice.osc.start = (voice.osc.start & 0x00ffffff) | ((data & 0xff00) << 16);
+ if (ACCESSING_BITS_0_7)
+ voice.osc.start = (voice.osc.start & 0xff00ffff) | ((data & 0x00ff) << 16);
break;
case 0x03: // [osc] Wavesample loop start low
- if(msb)
- voice.osc.start = (voice.osc.start & 0xffff00ff) | (data << 8);
+ if (ACCESSING_BITS_8_15)
+ voice.osc.start = (voice.osc.start & 0xffff00ff) | (data & 0xff00);
// This is unused?
- //else
+ //if (ACCESSING_BITS_0_7)
//voice.osc.start = (voice.osc.start & 0xffffff00) | (data & 0);
break;
case 0x04: // [osc] Wavesample loop end high
- if(msb)
- voice.osc.end = (voice.osc.end & 0x00ffffff) | (data << 24);
- else
- voice.osc.end = (voice.osc.end & 0xff00ffff) | (data << 16);
+ if (ACCESSING_BITS_8_15)
+ voice.osc.end = (voice.osc.end & 0x00ffffff) | ((data & 0xff00) << 16);
+ if (ACCESSING_BITS_0_7)
+ voice.osc.end = (voice.osc.end & 0xff00ffff) | ((data & 0x00ff) << 16);
break;
case 0x05: // [osc] Wavesample loop end low
- if(msb)
- voice.osc.end = (voice.osc.end & 0xffff00ff) | (data << 8);
+ if (ACCESSING_BITS_8_15)
+ voice.osc.end = (voice.osc.end & 0xffff00ff) | (data & 0xff00);
// lsb is unused?
break;
case 0x06: // [osc] Volume Increment
- if(msb)
- voice.vol.incr = data;
+ if (ACCESSING_BITS_8_15)
+ voice.vol.incr = (data >> 8) & 0xff;
break;
case 0x07: // [osc] Volume Start
- if (!msb)
- voice.vol.start = data << (10+8);
+ if (ACCESSING_BITS_0_7)
+ voice.vol.start = (data & 0xff) << (10+8);
break;
case 0x08: // [osc] Volume End
- if (!msb)
- voice.vol.end = data << (10+8);
+ if (ACCESSING_BITS_0_7)
+ voice.vol.end = (data & 0xff) << (10+8);
break;
case 0x09: // [osc] Volume accumulator
- if(msb)
- voice.vol.regacc = (voice.vol.regacc & 0x00ff) | (data << 8);
- else
- voice.vol.regacc = (voice.vol.regacc & 0xff00) | data;
+ if (ACCESSING_BITS_8_15)
+ voice.vol.regacc = (voice.vol.regacc & 0x00ff) | (data & 0xff00);
+ if (ACCESSING_BITS_0_7)
+ voice.vol.regacc = (voice.vol.regacc & 0xff00) | (data & 0x00ff);
voice.vol.acc = voice.vol.regacc << 10;
break;
- case 0x0A: // [osc] Wavesample address high
+ case 0x0a: // [osc] Wavesample address high
#ifdef ICS2115_DEBUG
#ifdef ICS2115_ISOLATE
- if(m_osc_select == ICS2115_ISOLATE)
+ if (m_osc_select == ICS2115_ISOLATE)
#endif
- printf("<%d:oa:H[%d]=%x>", m_osc_select, msb, data);
+ logerror("<%d:oa:H=%x>", m_osc_select, data);
#endif
- if(msb)
- voice.osc.acc = (voice.osc.acc & 0x00ffffff) | (data << 24);
- else
- voice.osc.acc = (voice.osc.acc & 0xff00ffff) | (data << 16);
+ if (ACCESSING_BITS_8_15)
+ voice.osc.acc = (voice.osc.acc & 0x00ffffff) | ((data & 0xff00) << 16);
+ if (ACCESSING_BITS_0_7)
+ voice.osc.acc = (voice.osc.acc & 0xff00ffff) | ((data & 0x00ff) << 16);
break;
- case 0x0B: // [osc] Wavesample address low
+ case 0x0b: // [osc] Wavesample address low
#ifdef ICS2115_DEBUG
#ifdef ICS2115_ISOLATE
- if(m_osc_select == ICS2115_ISOLATE)
+ if (m_osc_select == ICS2115_ISOLATE)
#endif
- printf("<%d:oa:L[%d]=%x>", m_osc_select, msb, data);
+ logerror("<%d:oa:L=%x>", m_osc_select, data);
#endif
- if(msb)
- voice.osc.acc = (voice.osc.acc & 0xffff00ff) | (data << 8);
- else
- voice.osc.acc = (voice.osc.acc & 0xffffff00) | (data & 0xF8);
+ if (ACCESSING_BITS_8_15)
+ voice.osc.acc = (voice.osc.acc & 0xffff00ff) | (data & 0xff00);
+ if (ACCESSING_BITS_0_7)
+ voice.osc.acc = (voice.osc.acc & 0xffffff00) | (data & 0x00f8);
break;
- case 0x0C: // [osc] Pan
- if(msb)
- voice.vol.pan = data;
+ case 0x0c: // [osc] Pan
+ if (ACCESSING_BITS_8_15)
+ voice.vol.pan = (data >> 8) & 0xff;
break;
- case 0x0D: // [osc] Volume Envelope Control
- if(msb) {
+ case 0x0d: // [osc] Volume Envelope Control
+ if (ACCESSING_BITS_8_15)
+ {
voice.vol_ctrl.value &= 0x80;
- voice.vol_ctrl.value |= data & 0x7F;
+ voice.vol_ctrl.value |= (data >> 8) & 0x7f;
}
break;
- case 0x0E: // Active Voices
+ case 0x0e: // Active Voices
//Does this value get added to 1? Not sure. Could trace for writes of 32.
- if(msb) {
- m_active_osc = data & 0x1F; // & 0x1F ? (Guessing)
- }
+ if (ACCESSING_BITS_8_15)
+ m_active_osc = (data >> 8) & 0x1f; // & 0x1f ? (Guessing)
break;
//2X8 ?
case 0x10: // [osc] Oscillator Control
//Could this be 2X9?
//[7 R | 6 M2 | 5 M1 | 4-2 Reserve | 1 - Timer 2 Strt | 0 - Timer 1 Strt]
- if (msb) {
+ if (ACCESSING_BITS_8_15)
+ {
+ data >>= 8;
voice.osc.ctl = data;
if (!data)
keyon();
//guessing here
- else if(data == 0xf) {
+ else if (data == 0xf)
+ {
#ifdef ICS2115_DEBUG
#ifdef ICS2115_ISOLATE
if (m_osc_select == ICS2115_ISOLATE)
#endif
if (!voice.osc_conf.bitflags.stop || !voice.vol_ctrl.bitflags.stop)
- printf("[%02d STOP]\n", m_osc_select);
+ logerror("[%02d STOP]\n", m_osc_select);
#endif
- if (!m_vmode) {
+ if (!m_vmode)
+ {
voice.osc_conf.bitflags.stop = true;
voice.vol_ctrl.bitflags.stop = true;
//try to key it off as well!
@@ -706,71 +752,77 @@ void ics2115_device::reg_write(uint8_t data, bool msb) {
}
#ifdef ICS2115_DEBUG
else
- printf("ICS2115: Unhandled* data write %d onto 0x10.\n", data);
+ logerror("ICS2115: Unhandled* data write %d onto 0x10.\n", data);
#endif
}
break;
case 0x11: // [osc] Wavesample static address 27-20
- if(msb)
- //v->Osc.SAddr = data;
- voice.osc.saddr = data;
+ if (ACCESSING_BITS_8_15)
+ //v->Osc.SAddr = (data >> 8);
+ voice.osc.saddr = (data >> 8);
break;
case 0x12:
//Could be per voice! -- investigate.
- if (msb)
- m_vmode = data;
+ if (ACCESSING_BITS_8_15)
+ m_vmode = (data >> 8);
break;
case 0x40: // Timer 1 Preset
case 0x41: // Timer 2 Preset
- if(!msb) {
- m_timer[m_reg_select & 0x1].preset = data;
+ if (ACCESSING_BITS_0_7)
+ {
+ m_timer[m_reg_select & 0x1].preset = data & 0xff;
recalc_timer(m_reg_select & 0x1);
}
break;
case 0x42: // Timer 1 Prescale
case 0x43: // Timer 2 Prescale
- if(!msb) {
- m_timer[m_reg_select & 0x1].scale = data;
+ if (ACCESSING_BITS_0_7)
+ {
+ m_timer[m_reg_select & 0x1].scale = data & 0xff;
recalc_timer(m_reg_select & 0x1);
}
break;
- case 0x4A: // IRQ Enable
- if(!msb) {
- m_irq_enabled = data;
+ case 0x4a: // IRQ Enable
+ if (ACCESSING_BITS_0_7)
+ {
+ m_irq_enabled = data & 0xff;
recalc_irq();
}
break;
- case 0x4F: // Oscillator Address being Programmed
- if(!msb) {
- m_osc_select = data % (1+m_active_osc);
- }
+ case 0x4f: // Oscillator Address being Programmed
+ if (ACCESSING_BITS_0_7)
+ m_osc_select = (data & 0xff) % (1+m_active_osc);
break;
default:
#ifdef ICS2115_DEBUG
- printf("ICS2115: Unhandled write %x onto %x(%d) [voice = %d]\n", data, m_reg_select, msb, m_osc_select);
+ logerror("ICS2115: Unhandled write %x onto %x [voice = %d]\n", data, m_reg_select, m_osc_select);
#endif
break;
}
}
-READ8_MEMBER(ics2115_device::read)
+u8 ics2115_device::read(offs_t offset)
{
- uint8_t ret = 0;
+ u8 ret = 0;
- switch(offset) {
+ switch (offset)
+ {
case 0:
//TODO: check this suspect code
- if (m_irq_on) {
+ if (m_irq_on)
+ {
ret |= 0x80;
if (m_irq_enabled && (m_irq_pending & 3))
ret |= 1;
- for (int i = 0; i <= m_active_osc; i++) {
+ for (int i = 0; i <= m_active_osc; i++)
+ {
if (//m_voice[i].vol_ctrl.bitflags.irq_pending ||
- m_voice[i].osc_conf.bitflags.irq_pending) {
+ m_voice[i].osc_conf.bitflags.irq_pending)
+ {
ret |= 2;
break;
}
@@ -782,35 +834,89 @@ READ8_MEMBER(ics2115_device::read)
ret = m_reg_select;
break;
case 2:
- ret = (uint8_t)(reg_read());
+ ret = (u8)(reg_read());
break;
case 3:
ret = reg_read() >> 8;
break;
default:
#ifdef ICS2115_DEBUG
- printf("ICS2115: Unhandled memory read at %x\n", offset);
+ logerror("ICS2115: Unhandled memory read at %x\n", offset);
#endif
break;
}
return ret;
}
-WRITE8_MEMBER(ics2115_device::write)
+void ics2115_device::write(offs_t offset, u8 data)
{
- switch(offset) {
+ switch (offset)
+ {
case 1:
m_reg_select = data;
break;
case 2:
- reg_write(data,0);
+ reg_write(data, 0x00ff);
break;
case 3:
- reg_write(data,1);
+ reg_write(data << 8, 0xff00);
break;
default:
#ifdef ICS2115_DEBUG
- printf("ICS2115: Unhandled memory write %02x to %x\n", data, offset);
+ logerror("ICS2115: Unhandled memory write %02x to %x\n", data, offset);
+#endif
+ break;
+ }
+}
+
+u16 ics2115_device::word_r(offs_t offset, u16 mem_mask)
+{
+ u16 ret = 0;
+
+ switch (offset)
+ {
+ case 0:
+ case 1:
+ if (ACCESSING_BITS_0_7)
+ ret |= read(offset);
+ break;
+ case 2:
+ ret |= reg_read() & mem_mask;
+ break;
+ /*
+ case 3:
+ TODO : used for byte size only;
+ break;
+ */
+ default:
+#ifdef ICS2115_DEBUG
+ logerror("ICS2115: Unhandled memory read at %x\n", offset);
+#endif
+ break;
+ }
+ return ret;
+}
+
+void ics2115_device::word_w(offs_t offset, u16 data, u16 mem_mask)
+{
+ switch (offset)
+ {
+ case 0:
+ case 1:
+ if (ACCESSING_BITS_0_7)
+ write(offset, data & 0xff);
+ break;
+ case 2:
+ reg_write(data, mem_mask);
+ break;
+ /*
+ case 3:
+ TODO : used for byte size only;
+ break;
+ */
+ default:
+#ifdef ICS2115_DEBUG
+ logerror("ICS2115: Unhandled memory write %02x to %x\n", data, offset);
#endif
break;
}
@@ -828,7 +934,7 @@ void ics2115_device::keyon()
m_voice[m_osc_select].state.bitflags.ramp = 0x40;
#ifdef ICS2115_DEBUG
- printf("[%02d vs:%04x ve:%04x va:%04x vi:%02x vc:%02x os:%06x oe:%06x oa:%06x of:%04x SA:%02x oc:%02x][%04x]\n", m_osc_select,
+ logerror("[%02d vs:%04x ve:%04x va:%04x vi:%02x vc:%02x os:%06x oe:%06x oa:%06x of:%04x SA:%02x oc:%02x][%04x]\n", m_osc_select,
m_voice[m_osc_select].vol.start >> 10,
m_voice[m_osc_select].vol.end >> 10,
m_voice[m_osc_select].vol.acc >> 10,
@@ -844,17 +950,17 @@ void ics2115_device::keyon()
);
#endif
//testing memory corruption issue with mame stream
- //printf("m_volume[0x%x]=0x%x\n", mastervolume, m_volume[mastervolume]);
+ //logerror("m_volume[0x%x]=0x%x\n", mastervolume, m_volume[mastervolume]);
}
void ics2115_device::recalc_irq()
{
//Suspect
bool irq = (m_irq_pending & m_irq_enabled);
- for(int i = 0; (!irq) && (i < 32); i++)
+ for (int i = 0; (!irq) && (i < 32); i++)
irq |= m_voice[i].vol_ctrl.bitflags.irq_pending && m_voice[i].osc_conf.bitflags.irq_pending;
m_irq_on = irq;
- if(!m_irq_cb.isnull())
+ if (!m_irq_cb.isnull())
m_irq_cb(irq ? ASSERT_LINE : CLEAR_LINE);
}
@@ -873,16 +979,17 @@ TIMER_CALLBACK_MEMBER( ics2115_device::timer_cb_1 )
void ics2115_device::recalc_timer(int timer)
{
//Old regression-based formula (minus constant)
- //uint64_t period = m_timer[timer].preset * (m_timer[timer].scale << 16) / 60;
+ //u64 period = m_timer[timer].preset * (m_timer[timer].scale << 16) / 60;
//New formula based on O.Galibert's reverse engineering of ICS2115 card firmware
- uint64_t period = ((m_timer[timer].scale & 0x1f) + 1) * (m_timer[timer].preset + 1);
+ u64 period = ((m_timer[timer].scale & 0x1f) + 1) * (m_timer[timer].preset + 1);
period = (period << (4 + (m_timer[timer].scale >> 5)))*78125/2646;
- if(m_timer[timer].period != period) {
+ if (m_timer[timer].period != period)
+ {
m_timer[timer].period = period;
// Adjust the timer lengths
- if(period) // Reset the length
+ if (period) // Reset the length
m_timer[timer].timer->adjust(attotime::from_nsec(period), 0, attotime::from_nsec(period));
else // Kill the timer if length == 0
m_timer[timer].timer->adjust(attotime::never);
diff --git a/src/devices/sound/ics2115.h b/src/devices/sound/ics2115.h
index 57afef9f0c1..e9dc99a368f 100644
--- a/src/devices/sound/ics2115.h
+++ b/src/devices/sound/ics2115.h
@@ -16,77 +16,79 @@ class ics2115_device : public device_t, public device_sound_interface
{
public:
// construction/destruction
- ics2115_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+ ics2115_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
template <class Object> devcb_base &set_irq_callback(Object &&cb) { return m_irq_cb.set_callback(std::forward<Object>(cb)); }
auto irq() { return m_irq_cb.bind(); }
- DECLARE_READ8_MEMBER(read);
- DECLARE_WRITE8_MEMBER(write);
- //uint8_t read(offs_t offset);
- //void write(offs_t offset, uint8_t data);
+ u8 read(offs_t offset);
+ void write(offs_t offset, u8 data);
+
+ // 16-bit read / write handlers (when /IOCS16 is low)
+ u16 word_r(offs_t offset, u16 mem_mask);
+ void word_w(offs_t offset, u16 data, u16 mem_mask);
TIMER_CALLBACK_MEMBER(timer_cb_0);
TIMER_CALLBACK_MEMBER(timer_cb_1);
protected:
- static constexpr uint16_t revision = 0x1;
+ static constexpr u16 revision = 0x1;
struct ics2115_voice {
struct {
- int32_t left;
- uint32_t acc, start, end;
- uint16_t fc;
- uint8_t ctl, saddr;
+ s32 left;
+ u32 acc, start, end;
+ u16 fc;
+ u8 ctl, saddr;
} osc;
struct {
- int32_t left;
- uint32_t add;
- uint32_t start, end;
- uint32_t acc;
- uint16_t regacc;
- uint8_t incr;
- uint8_t pan, mode;
+ s32 left;
+ u32 add;
+ u32 start, end;
+ u32 acc;
+ u16 regacc;
+ u8 incr;
+ u8 pan, mode;
} vol;
union {
struct {
- uint8_t ulaw : 1;
- uint8_t stop : 1; //stops wave + vol envelope
- uint8_t eightbit : 1;
- uint8_t loop : 1;
- uint8_t loop_bidir : 1;
- uint8_t irq : 1;
- uint8_t invert : 1;
- uint8_t irq_pending: 1;
+ u8 ulaw : 1;
+ u8 stop : 1; //stops wave + vol envelope
+ u8 eightbit : 1;
+ u8 loop : 1;
+ u8 loop_bidir : 1;
+ u8 irq : 1;
+ u8 invert : 1;
+ u8 irq_pending: 1;
//IRQ on variable?
} bitflags;
- uint8_t value;
+ u8 value;
} osc_conf;
union {
struct {
- uint8_t done : 1; //indicates ramp has stopped
- uint8_t stop : 1; //stops the ramp
- uint8_t rollover : 1; //rollover (TODO)
- uint8_t loop : 1;
- uint8_t loop_bidir : 1;
- uint8_t irq : 1; //enable IRQ generation
- uint8_t invert : 1; //invert direction
- uint8_t irq_pending: 1; //(read only) IRQ pending
+ u8 done : 1; //indicates ramp has stopped
+ u8 stop : 1; //stops the ramp
+ u8 rollover : 1; //rollover (TODO)
+ u8 loop : 1;
+ u8 loop_bidir : 1;
+ u8 irq : 1; //enable IRQ generation
+ u8 invert : 1; //invert direction
+ u8 irq_pending: 1; //(read only) IRQ pending
//noenvelope == (done | disable)
} bitflags;
- uint8_t value;
+ u8 value;
} vol_ctrl;
//Possibly redundant state. => improvements of wavetable logic
//may lead to its elimination.
union {
struct {
- uint8_t on : 1;
- uint8_t ramp : 7; // 100 0000 = 0x40 maximum
+ u8 on : 1;
+ u8 ramp : 7; // 100 0000 = 0x40 maximum
} bitflags;
- uint8_t value;
+ u8 value;
} state;
bool playing();
@@ -103,8 +105,8 @@ protected:
virtual void sound_stream_update(sound_stream &stream, stream_sample_t **inputs, stream_sample_t **outputs, int samples) override;
//internal register helper functions
- uint16_t reg_read();
- void reg_write(uint8_t data, bool msb);
+ u16 reg_read();
+ void reg_write(u16 data, u16 mem_mask);
void recalc_timer(int timer);
void keyon();
void recalc_irq();
@@ -116,29 +118,29 @@ protected:
sound_stream *m_stream;
// internal state
- required_region_ptr<uint8_t> m_rom;
+ required_region_ptr<u8> m_rom;
devcb_write_line m_irq_cb;
- int16_t m_ulaw[256];
- uint16_t m_volume[4096];
+ s16 m_ulaw[256];
+ u16 m_volume[4096];
static const int volume_bits = 15;
ics2115_voice m_voice[32];
struct {
- uint8_t scale, preset;
+ u8 scale, preset;
emu_timer *timer;
- uint64_t period; /* in nsec */
+ u64 period; /* in nsec */
} m_timer[2];
- uint8_t m_active_osc;
- uint8_t m_osc_select;
- uint8_t m_reg_select;
- uint8_t m_irq_enabled, m_irq_pending;
+ u8 m_active_osc;
+ u8 m_osc_select;
+ u8 m_reg_select;
+ u8 m_irq_enabled, m_irq_pending;
bool m_irq_on;
//Unknown variable, seems to be effected by 0x12. Further investigation
//Required.
- uint8_t m_vmode;
+ u8 m_vmode;
};
diff --git a/src/devices/sound/k051649.cpp b/src/devices/sound/k051649.cpp
index 815abb26739..995593aa6b2 100644
--- a/src/devices/sound/k051649.cpp
+++ b/src/devices/sound/k051649.cpp
@@ -37,7 +37,7 @@ void k051649_device::scc_map(address_map &map)
map(0x80, 0x89).w(FUNC(k051649_device::k051649_frequency_w));
map(0x8a, 0x8e).w(FUNC(k051649_device::k051649_volume_w));
map(0x8f, 0x8f).w(FUNC(k051649_device::k051649_keyonoff_w));
- map(0xe0, 0xff).rw(FUNC(k051649_device::k051649_test_r), FUNC(k051649_device::k051649_test_w));
+ map(0xe0, 0xe0).mirror(0x1f).rw(FUNC(k051649_device::k051649_test_r), FUNC(k051649_device::k051649_test_w));
}
// device type definition
@@ -177,7 +177,7 @@ void k051649_device::sound_stream_update(sound_stream &stream, stream_sample_t *
/********************************************************************************/
-WRITE8_MEMBER( k051649_device::k051649_waveform_w )
+void k051649_device::k051649_waveform_w(offs_t offset, uint8_t data)
{
// waveram is read-only?
if (m_test & 0x40 || (m_test & 0x80 && offset >= 0x60))
@@ -196,7 +196,7 @@ WRITE8_MEMBER( k051649_device::k051649_waveform_w )
}
-READ8_MEMBER ( k051649_device::k051649_waveform_r )
+uint8_t k051649_device::k051649_waveform_r(offs_t offset)
{
// test-register bits 6/7 expose the internal counter
if (m_test & 0xc0)
@@ -212,7 +212,7 @@ READ8_MEMBER ( k051649_device::k051649_waveform_r )
}
-WRITE8_MEMBER( k051649_device::k052539_waveform_w )
+void k051649_device::k052539_waveform_w(offs_t offset, uint8_t data)
{
// waveram is read-only?
if (m_test & 0x40)
@@ -223,7 +223,7 @@ WRITE8_MEMBER( k051649_device::k052539_waveform_w )
}
-READ8_MEMBER ( k051649_device::k052539_waveform_r )
+uint8_t k051649_device::k052539_waveform_r(offs_t offset)
{
// test-register bit 6 exposes the internal counter
if (m_test & 0x40)
@@ -235,14 +235,14 @@ READ8_MEMBER ( k051649_device::k052539_waveform_r )
}
-WRITE8_MEMBER( k051649_device::k051649_volume_w )
+void k051649_device::k051649_volume_w(offs_t offset, uint8_t data)
{
m_stream->update();
m_channel_list[offset&0x7].volume=data&0xf;
}
-WRITE8_MEMBER( k051649_device::k051649_frequency_w )
+void k051649_device::k051649_frequency_w(offs_t offset, uint8_t data)
{
int freq_hi = offset & 1;
offset >>= 1;
@@ -263,7 +263,7 @@ WRITE8_MEMBER( k051649_device::k051649_frequency_w )
}
-WRITE8_MEMBER( k051649_device::k051649_keyonoff_w )
+void k051649_device::k051649_keyonoff_w(uint8_t data)
{
int i;
m_stream->update();
@@ -276,16 +276,17 @@ WRITE8_MEMBER( k051649_device::k051649_keyonoff_w )
}
-WRITE8_MEMBER( k051649_device::k051649_test_w )
+void k051649_device::k051649_test_w(uint8_t data)
{
m_test = data;
}
-READ8_MEMBER ( k051649_device::k051649_test_r )
+uint8_t k051649_device::k051649_test_r()
{
// reading the test register sets it to $ff!
- k051649_test_w(space, offset, 0xff);
+ if (!machine().side_effects_disabled())
+ k051649_test_w(0xff);
return 0xff;
}
diff --git a/src/devices/sound/k051649.h b/src/devices/sound/k051649.h
index 6ede7a295ee..bbd671fe9ab 100644
--- a/src/devices/sound/k051649.h
+++ b/src/devices/sound/k051649.h
@@ -18,16 +18,16 @@ class k051649_device : public device_t,
public:
k051649_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- DECLARE_WRITE8_MEMBER( k051649_waveform_w );
- DECLARE_READ8_MEMBER ( k051649_waveform_r );
- DECLARE_WRITE8_MEMBER( k051649_volume_w );
- DECLARE_WRITE8_MEMBER( k051649_frequency_w );
- DECLARE_WRITE8_MEMBER( k051649_keyonoff_w );
- DECLARE_WRITE8_MEMBER( k051649_test_w );
- DECLARE_READ8_MEMBER ( k051649_test_r );
-
- DECLARE_WRITE8_MEMBER( k052539_waveform_w );
- DECLARE_READ8_MEMBER ( k052539_waveform_r );
+ void k051649_waveform_w(offs_t offset, uint8_t data);
+ uint8_t k051649_waveform_r(offs_t offset);
+ void k051649_volume_w(offs_t offset, uint8_t data);
+ void k051649_frequency_w(offs_t offset, uint8_t data);
+ void k051649_keyonoff_w(uint8_t data);
+ void k051649_test_w(uint8_t data);
+ uint8_t k051649_test_r();
+
+ void k052539_waveform_w(offs_t offset, uint8_t data);
+ uint8_t k052539_waveform_r(offs_t offset);
void scc_map(address_map &map);
protected:
diff --git a/src/devices/sound/k054539.cpp b/src/devices/sound/k054539.cpp
index 35f45bf4fa6..17dd9c97501 100644
--- a/src/devices/sound/k054539.cpp
+++ b/src/devices/sound/k054539.cpp
@@ -338,7 +338,7 @@ void k054539_device::init_chip()
save_item(NAME(m_timer_state));
}
-WRITE8_MEMBER(k054539_device::write)
+void k054539_device::write(offs_t offset, u8 data)
{
if(0) {
int voice, reg;
@@ -476,7 +476,7 @@ void k054539_device::device_post_load()
cur_limit = rom_addr == 0x80 ? 0x4000 : 0x20000;
}
-READ8_MEMBER(k054539_device::read)
+u8 k054539_device::read(offs_t offset)
{
switch(offset) {
case 0x22d:
diff --git a/src/devices/sound/k054539.h b/src/devices/sound/k054539.h
index ebc117d494c..9e7bafdb0fc 100644
--- a/src/devices/sound/k054539.h
+++ b/src/devices/sound/k054539.h
@@ -44,8 +44,8 @@ public:
set_analog_callback(cb_delegate(callback, name, nullptr, static_cast<FunctionClass *>(nullptr)));
}
- DECLARE_WRITE8_MEMBER(write);
- DECLARE_READ8_MEMBER(read);
+ void write(offs_t offset, u8 data);
+ u8 read(offs_t offset);
void init_flags(int flags);
diff --git a/src/devices/sound/meg.cpp b/src/devices/sound/meg.cpp
new file mode 100644
index 00000000000..a1f9d67b293
--- /dev/null
+++ b/src/devices/sound/meg.cpp
@@ -0,0 +1,384 @@
+// license:BSD-3-Clause
+// copyright-holders:Olivier Galibert
+
+// Yamaha MEG - Multiple effects generator
+//
+// Audio dsp dedicated to effects generation
+
+#include "emu.h"
+#include "debugger.h"
+#include "meg.h"
+
+DEFINE_DEVICE_TYPE(MEG, meg_device, "meg", "Multiple Effects Generator (HD62098 / XM309A00)")
+DEFINE_DEVICE_TYPE(MEGEMB, meg_embedded_device, "megemb", "Multiple Effects Generator (embedded)")
+
+void meg_base_device::prg_map(address_map &map)
+{
+ map(0, m_prg_size - 1).ram();
+}
+
+void meg_base_device::fp_map(address_map &map)
+{
+ map(0, m_prg_size - 1).ram();
+}
+
+void meg_base_device::offsets_map(address_map &map)
+{
+ map(0, 0x7f).ram();
+}
+
+meg_base_device::meg_base_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock, u32 prg_size) :
+ cpu_device(mconfig, type, tag, owner, clock),
+ m_program_config("program", ENDIANNESS_BIG, 64, prg_size > 256 ? 9 : 8, -3, address_map_constructor(FUNC(meg_base_device::prg_map), this)),
+ m_fp_config("fp", ENDIANNESS_BIG, 16, prg_size > 256 ? 9 : 8, -1, address_map_constructor(FUNC(meg_base_device::fp_map), this)),
+ m_offsets_config("offsets", ENDIANNESS_BIG, 16, prg_size > 256 ? 7 : 7, -1, address_map_constructor(FUNC(meg_base_device::offsets_map), this)),
+ m_prg_size(prg_size)
+{
+}
+
+
+void meg_base_device::prg_w(u16 address, u64 opcode)
+{
+ m_program->write_qword(address, opcode);
+}
+
+void meg_base_device::fp_w(u16 address, u16 value)
+{
+ m_fp->write_word(address, value);
+}
+
+void meg_base_device::offset_w(u16 address, u16 value)
+{
+ m_offsets->write_word(address, value);
+}
+
+void meg_base_device::lfo_w(u8 reg, u16 value)
+{
+ m_lfo[reg] = value;
+
+ static const int dt[8] = { 0, 32, 64, 128, 256, 512, 1024, 2048 };
+ static const int sh[8] = { 0, 0, 1, 2, 3, 4, 5, 6 };
+
+ int scale = (value >> 5) & 7;
+ int step = ((value & 31) << sh[scale]) + dt[scale];
+ logerror("lfo_w %02x freq=%5.2f phase=%6.4f\n", reg, step * 44100.0/4194304, (value >> 8)/256.0);
+}
+
+void meg_base_device::map_w(u8 reg, u16 value)
+{
+ m_map[reg] = value;
+}
+
+u64 meg_base_device::prg_r(u16 address) const
+{
+ return m_program->read_qword(address);
+}
+
+u16 meg_base_device::fp_r(u16 address) const
+{
+ return m_fp->read_word(address);
+}
+
+u16 meg_base_device::offset_r(u16 address) const
+{
+ return m_offsets->read_word(address);
+}
+
+u16 meg_base_device::lfo_r(u8 reg) const
+{
+ return m_lfo[reg];
+}
+
+u16 meg_base_device::map_r(u8 reg) const
+{
+ return m_map[reg];
+}
+
+
+void meg_base_device::device_start()
+{
+ m_program = &space(AS_PROGRAM);
+ m_fp = &space(AS_FP);
+ m_offsets = &space(AS_OFFSETS);
+
+ state_add(STATE_GENPC, "GENPC", m_pc).noshow();
+ state_add(STATE_GENPCBASE, "CURPC", m_pc).noshow();
+ state_add(0, "PC", m_pc);
+
+ set_icountptr(m_icount);
+
+ save_item(NAME(m_lfo));
+ save_item(NAME(m_map));
+ save_item(NAME(m_pc));
+}
+
+void meg_base_device::device_reset()
+{
+ memset(m_lfo, 0, sizeof(m_lfo));
+ memset(m_map, 0, sizeof(m_map));
+ m_pc = 0;
+}
+
+uint32_t meg_base_device::execute_min_cycles() const
+{
+ return 1;
+}
+
+uint32_t meg_base_device::execute_max_cycles() const
+{
+ return 1;
+}
+
+uint32_t meg_base_device::execute_input_lines() const
+{
+ return 0;
+}
+
+void meg_base_device::execute_run()
+{
+ if(machine().debug_flags & DEBUG_FLAG_ENABLED)
+ debugger_instruction_hook(m_pc);
+ m_icount = 0;
+}
+
+device_memory_interface::space_config_vector meg_base_device::memory_space_config() const
+{
+ return space_config_vector {
+ std::make_pair(AS_PROGRAM, &m_program_config),
+ std::make_pair(AS_FP, &m_fp_config),
+ std::make_pair(AS_OFFSETS, &m_offsets_config)
+ };
+}
+
+void meg_base_device::state_import(const device_state_entry &entry)
+{
+}
+
+void meg_base_device::state_export(const device_state_entry &entry)
+{
+}
+
+void meg_base_device::state_string_export(const device_state_entry &entry, std::string &str) const
+{
+}
+
+std::unique_ptr<util::disasm_interface> meg_base_device::create_disassembler()
+{
+ return std::make_unique<meg_disassembler>(this);
+}
+
+meg_embedded_device::meg_embedded_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) :
+ meg_base_device(mconfig, MEGEMB, tag, owner, clock, 384)
+{
+}
+
+meg_device::meg_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) :
+ meg_base_device(mconfig, MEG, tag, owner, clock, 256)
+{
+}
+
+
+// vl70:
+// 6d1e: write 1, r0l
+// 6d26: write 2, r0l
+// 6d2e: read 2
+// 6d36: write 3, r0l
+// 6d3e: write reg 4:r0h, r0l
+// 6d52: write reg 5:r0h, r0l-1
+// 6d68: write 7, r0l
+// 6d70: write reg 8:r0h, r0l
+// 6d84: write reg 9:r0h, r0l
+// 6dac: write a, r0l
+// 6db4: write reg cd:r1l, r0
+// 6dd4: write reg e:r0h, r0l
+// 6dee: write reg f:r0h, r0l
+// 6e08: read 10,11
+// 6e1c: write reg 1213:r1l, r0
+// 6e3c: write reg 14:r0h, r0l
+// 6e50: write 15, r0l
+// 6e58: write reg 16:r0h, r0l
+// 6e6c: write reg 17:r0h, r0l
+// 6e80: write reg 18:e0h, e0l
+
+void meg_device::map(address_map &map)
+{
+ map(0x00, 0x00).w(FUNC(meg_device::select_w));
+ map(0x01, 0x01).w(FUNC(meg_device::s1_w));
+ map(0x02, 0x02).rw(FUNC(meg_device::s2_r), FUNC(meg_device::s2_w));
+ map(0x03, 0x03).w(FUNC(meg_device::s3_w));
+ map(0x04, 0x04).w(FUNC(meg_device::s4_w));
+ map(0x05, 0x05).w(FUNC(meg_device::s5_w));
+ map(0x07, 0x07).w(FUNC(meg_device::s7_w));
+ map(0x08, 0x08).w(FUNC(meg_device::s8_w));
+ map(0x09, 0x09).w(FUNC(meg_device::s9_w));
+ map(0x0a, 0x0a).w(FUNC(meg_device::sa_w));
+ map(0x0c, 0x0c).w(FUNC(meg_device::fph_w));
+ map(0x0d, 0x0d).w(FUNC(meg_device::fpl_w));
+ map(0x0e, 0x0e).w(FUNC(meg_device::se_w));
+ map(0x0f, 0x0f).w(FUNC(meg_device::sf_w));
+ map(0x10, 0x10).r(FUNC(meg_device::s10_r));
+ map(0x11, 0x11).r(FUNC(meg_device::s11_r));
+ map(0x12, 0x12).w(FUNC(meg_device::offseth_w));
+ map(0x13, 0x13).w(FUNC(meg_device::offsetl_w));
+ map(0x14, 0x14).w(FUNC(meg_device::s14_w));
+ map(0x15, 0x15).w(FUNC(meg_device::s15_w));
+ map(0x16, 0x16).w(FUNC(meg_device::s16_w));
+ map(0x17, 0x17).w(FUNC(meg_device::s17_w));
+ map(0x18, 0x18).w(FUNC(meg_device::s18_w));
+}
+
+u8 meg_device::s2_r()
+{
+ logerror("read r2 %s\n", machine().describe_context());
+ return 0x00;
+}
+
+void meg_device::select_w(u8 data)
+{
+ m_reg = data;
+}
+
+void meg_device::s1_w(u8 data)
+{
+ logerror("r1 %02x %s\n", data, machine().describe_context());
+}
+
+void meg_device::s2_w(u8 data)
+{
+ logerror("r2 %02x %s\n", data, machine().describe_context());
+}
+
+void meg_device::s3_w(u8 data)
+{
+ logerror("r3 %02x %s\n", data, machine().describe_context());
+}
+
+void meg_device::s4_w(u8 data)
+{
+ if(m_r4[m_reg] != data) {
+ m_r4[m_reg] = data;
+ logerror("r4[%02x] = %02x %s\n", m_reg, data, machine().describe_context());
+ }
+}
+
+void meg_device::s5_w(u8 data)
+{
+ if(m_r5[m_reg] != data) {
+ m_r5[m_reg] = data;
+ logerror("r5[%02x] = %02x %s\n", m_reg, data, machine().describe_context());
+ }
+}
+
+void meg_device::s7_w(u8 data)
+{
+ logerror("r7 %02x %s\n", data, machine().describe_context());
+}
+
+void meg_device::s8_w(u8 data)
+{
+ if(m_r8[m_reg] != data) {
+ m_r8[m_reg] = data;
+ logerror("r8[%02x] = %02x %s\n", m_reg, data, machine().describe_context());
+ }
+}
+
+
+void meg_device::s9_w(u8 data)
+{
+ if(m_r9[m_reg] != data) {
+ m_r9[m_reg] = data;
+ logerror("r9[%02x] = %02x %s\n", m_reg, data, machine().describe_context());
+ }
+}
+
+void meg_device::sa_w(u8 data)
+{
+ logerror("ra %02x %s\n", data, machine().describe_context());
+}
+
+void meg_device::fph_w(u8 data)
+{
+ fp_w(m_reg, (fp_r(m_reg) & 0x00ff) | (data << 8));
+}
+
+
+void meg_device::fpl_w(u8 data)
+{
+ fp_w(m_reg, (fp_r(m_reg) & 0xff00) | data);
+}
+
+void meg_device::se_w(u8 data)
+{
+ if(m_re[m_reg] != data) {
+ m_re[m_reg] = data;
+ logerror("re[%02x] = %02x %s\n", m_reg, data, machine().describe_context());
+ }
+}
+
+
+void meg_device::sf_w(u8 data)
+{
+ if(m_rf[m_reg] != data) {
+ m_rf[m_reg] = data;
+ logerror("rf[%02x] = %02x %s\n", m_reg, data, machine().describe_context());
+ }
+}
+
+u8 meg_device::s10_r()
+{
+ logerror("read r10 %s\n", machine().describe_context());
+ return 0x00;
+}
+
+u8 meg_device::s11_r()
+{
+ logerror("read r11 %s\n", machine().describe_context());
+ return 0x00;
+}
+
+void meg_device::offseth_w(u8 data)
+{
+ offset_w(m_reg, (offset_r(m_reg) & 0x00ff) | (data << 8));
+}
+
+void meg_device::offsetl_w(u8 data)
+{
+ offset_w(m_reg, (offset_r(m_reg) & 0xff00) | data);
+}
+
+void meg_device::s14_w(u8 data)
+{
+ if(m_r14[m_reg] != data) {
+ m_r14[m_reg] = data;
+ logerror("r14[%02x] = %02x %s\n", m_reg, data, machine().describe_context());
+ }
+}
+
+void meg_device::s15_w(u8 data)
+{
+ logerror("r15 %02x %s\n", data, machine().describe_context());
+}
+
+void meg_device::s16_w(u8 data)
+{
+ if(m_r16[m_reg] != data) {
+ m_r16[m_reg] = data;
+ logerror("r16[%02x] = %02x %s\n", m_reg, data, machine().describe_context());
+ }
+}
+
+void meg_device::s17_w(u8 data)
+{
+ if(m_r17[m_reg] != data) {
+ m_r17[m_reg] = data;
+ logerror("r17[%02x] = %02x %s\n", m_reg, data, machine().describe_context());
+ }
+}
+
+void meg_device::s18_w(u8 data)
+{
+ if(m_r18[m_reg] != data) {
+ m_r18[m_reg] = data;
+ logerror("r18[%02x] = %02x %s\n", m_reg, data, machine().describe_context());
+ }
+}
diff --git a/src/devices/sound/meg.h b/src/devices/sound/meg.h
new file mode 100644
index 00000000000..e9ff44f990a
--- /dev/null
+++ b/src/devices/sound/meg.h
@@ -0,0 +1,122 @@
+// license:BSD-3-Clause
+// copyright-holders:Olivier Galibert
+
+// Yamaha MEG - Multiple effects generator
+//
+// Audio dsp dedicated to effects generation
+
+#ifndef DEVICES_SOUND_MEG_H
+#define DEVICES_SOUND_MEG_H
+
+#pragma once
+
+#include "megd.h"
+
+
+class meg_base_device : public cpu_device, public meg_disassembler::info
+{
+public:
+ enum {
+ AS_FP = 1,
+ AS_OFFSETS = 2
+ };
+
+ meg_base_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock, u32 prg_size);
+
+ void prg_w(u16 address, u64 opcode);
+ void fp_w(u16 address, u16 value);
+ void offset_w(u16 address, u16 value);
+ void lfo_w(u8 reg, u16 value);
+ void map_w(u8 reg, u16 value);
+ u64 prg_r(u16 address) const;
+ virtual u16 fp_r(u16 address) const override;
+ virtual u16 offset_r(u16 address) const override;
+ u16 lfo_r(u8 reg) const;
+ u16 map_r(u8 reg) const;
+
+protected:
+ virtual void device_start() override;
+ virtual void device_reset() override;
+ virtual uint32_t execute_min_cycles() const override;
+ virtual uint32_t execute_max_cycles() const override;
+ virtual uint32_t execute_input_lines() const override;
+ virtual void execute_run() override;
+ virtual space_config_vector memory_space_config() const override;
+ virtual void state_import(const device_state_entry &entry) override;
+ virtual void state_export(const device_state_entry &entry) override;
+ virtual void state_string_export(const device_state_entry &entry, std::string &str) const override;
+ virtual std::unique_ptr<util::disasm_interface> create_disassembler() override;
+
+private:
+ address_space_config m_program_config, m_fp_config, m_offsets_config;
+ address_space *m_program, *m_fp, *m_offsets;
+
+ u32 m_prg_size, m_pc;
+ int m_icount;
+
+ u16 m_lfo[0x18], m_map[8];
+
+ void prg_map(address_map &map);
+ void fp_map(address_map &map);
+ void offsets_map(address_map &map);
+};
+
+class meg_embedded_device : public meg_base_device
+{
+public:
+ meg_embedded_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock = 44100*384);
+};
+
+class meg_device : public meg_base_device
+{
+public:
+ meg_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock = 44100*256);
+ void map(address_map &map);
+
+private:
+ u8 m_r4[256];
+ u8 m_r5[256];
+ u8 m_r8[256];
+ u8 m_r9[256];
+ u8 m_re[256];
+ u8 m_rf[256];
+ u8 m_r12[256];
+ u8 m_r13[256];
+ u8 m_r14[256];
+ u8 m_r16[256];
+ u8 m_r17[256];
+ u8 m_r18[256];
+ u8 m_reg;
+ u8 s2_r();
+ u8 s10_r();
+ u8 s11_r();
+ void select_w(u8 reg);
+ void s1_w(u8 data);
+ void s2_w(u8 data);
+ void s3_w(u8 data);
+ void s4_w(u8 data);
+ void s5_w(u8 data);
+ void s7_w(u8 data);
+ void s8_w(u8 data);
+ void s9_w(u8 data);
+ void sa_w(u8 data);
+ void fph_w(u8 data);
+ void fpl_w(u8 data);
+ void se_w(u8 data);
+ void sf_w(u8 data);
+ void s10_w(u8 data);
+ void s11_w(u8 data);
+ void offseth_w(u8 data);
+ void offsetl_w(u8 data);
+ void s14_w(u8 data);
+ void s15_w(u8 data);
+ void s16_w(u8 data);
+ void s17_w(u8 data);
+ void s18_w(u8 data);
+};
+
+
+DECLARE_DEVICE_TYPE(MEG, meg_device)
+DECLARE_DEVICE_TYPE(MEGEMB, meg_embedded_device)
+
+#endif
diff --git a/src/devices/sound/megd.cpp b/src/devices/sound/megd.cpp
new file mode 100644
index 00000000000..2790a7ca69c
--- /dev/null
+++ b/src/devices/sound/megd.cpp
@@ -0,0 +1,118 @@
+// license:BSD-3-Clause
+// copyright-holders:Olivier Galibert
+
+// Yamaha MEG - Multiple effects generator
+//
+// Audio dsp dedicated to effects generation
+//
+// Disassembler
+
+#include "emu.h"
+#include "megd.h"
+
+meg_disassembler::meg_disassembler(info *inf) : m_info(inf)
+{
+}
+
+u32 meg_disassembler::opcode_alignment() const
+{
+ return 1;
+}
+
+std::string meg_disassembler::gfp(offs_t address) const
+{
+ if(!m_info)
+ return util::string_format("fp%03x", address);
+ s16 fp = m_info->fp_r(address);
+ return util::string_format("%g", fp / 16384.0);
+}
+
+std::string meg_disassembler::goffset(offs_t address) const
+{
+ return m_info ? util::string_format("%x", m_info->offset_r(address)) : util::string_format("of%02x", address);
+}
+
+u32 meg_disassembler::b(u64 opc, u32 start, u32 count)
+{
+ return (opc >> start) & ((1 << count) - 1);
+}
+
+void meg_disassembler::append(std::string &r, std::string e)
+{
+ if(r != "")
+ r += " ; ";
+ r += e;
+}
+
+// 33333333 33333333 22222222 22222222 11111111 11111111 00000000 00000000
+// fedcba98 76543210 fedcba98 76543210 fedcba98 76543210 fedcba98 76543210
+
+// 66665555 55555544 44444444 33333333 33222222 22221111 11111100 00000000
+// 32109876 54321098 76543210 98765432 10987654 32109876 54321098 76543210
+// XLB----- -rrrrrrr r--mmmmm m-MM---- -P-----* -----Arr rrrrrrmm mmmm----
+
+// m = low is read port, high is write port, memory register
+// r = low is read port, high is high port, rotating register
+
+// X = used for lo-fi variation only
+// L = lfo read
+// * = compute mul
+// A = mul input = m or r
+// P = P sent for register write
+// B = register write to mbuf
+// M = memory mode, none/read/write/read+1
+
+offs_t meg_disassembler::disassemble(std::ostream &stream, offs_t pc, const data_buffer &opcodes, const data_buffer &params)
+{
+ u64 opc = opcodes.r64(pc);
+
+ std::string r;
+
+ r = util::string_format("[m%02x]", b(opc, 39, 6));
+
+ if(b(opc, 62, 1))
+ append(r, "lfo");
+
+ if(b(opc, 23, 1))
+ switch(b(opc, 24, 2)) {
+ case 0:
+ if(b(opc, 18, 1))
+ append(r, util::string_format("p += %s*m%02x", gfp(pc), b(opc, 4, 6)));
+ else
+ append(r, util::string_format("p += %s*r%02x", gfp(pc), b(opc, 10, 8)));
+ break;
+ case 1:
+ append(r, util::string_format("p = %s*(r%02x+m%02x)", gfp(pc), b(opc, 10, 8), b(opc, 4, 6)));
+ break;
+ case 2:
+ append(r, util::string_format("p ?= %s*(r%02x+m%02x)", gfp(pc), b(opc, 10, 8), b(opc, 4, 6)));
+ break;
+ case 3:
+ if(b(opc, 18, 1))
+ append(r, util::string_format("p = %s*m%02x", gfp(pc), b(opc, 4, 6)));
+ else
+ append(r, util::string_format("p = %s*r%02x", gfp(pc), b(opc, 10, 8)));
+ break;
+ }
+
+ if(b(opc, 30, 1)) {
+ if(b(opc, 61, 1))
+ append(r, "mb = p");
+ else if(b(opc, 46, 1) == 1)
+ append(r, util::string_format("m%02x = p", b(opc, 39, 6)));
+ else
+ append(r, util::string_format("r%02x = p", b(opc, 47, 8)));
+ }
+
+ u32 memmode = b(opc, 36, 2);
+ if(memmode) {
+ static const char *modes[4] = { nullptr, "w", "r", "rw" };
+
+ append(r, util::string_format("mem_%s %x +%s", modes[memmode], b(opc, 33, 3), goffset(pc/3)));
+ r += util::string_format("-> m%02x", b(opcodes.r64(pc+2), 39, 6));
+ }
+
+ stream << r;
+
+ return 1 | SUPPORTED;
+}
diff --git a/src/devices/sound/megd.h b/src/devices/sound/megd.h
new file mode 100644
index 00000000000..59a13aa0ea4
--- /dev/null
+++ b/src/devices/sound/megd.h
@@ -0,0 +1,39 @@
+// license:BSD-3-Clause
+// copyright-holders:Olivier Galibert
+
+// Yamaha MEG - Multiple effects generator
+//
+// Audio dsp dedicated to effects generation
+//
+// Disassembler
+
+#ifndef DEVICES_SOUND_MEGD_H
+#define DEVICES_SOUND_MEGD_H
+
+#pragma once
+
+class meg_disassembler : public util::disasm_interface
+{
+public:
+ class info {
+ public:
+ virtual u16 fp_r(u16 address) const = 0;
+ virtual u16 offset_r(u16 address) const = 0;
+ };
+
+ meg_disassembler(info *inf = nullptr);
+
+ virtual u32 opcode_alignment() const override;
+ virtual offs_t disassemble(std::ostream &stream, offs_t pc, const data_buffer &opcodes, const data_buffer &params) override;
+
+private:
+ info *m_info;
+
+ std::string gfp(offs_t address) const;
+ std::string goffset(offs_t address) const;
+
+ static inline u32 b(u64 opc, u32 start, u32 count);
+ static inline void append(std::string &r, std::string e);
+};
+
+#endif
diff --git a/src/devices/sound/mos6560.cpp b/src/devices/sound/mos6560.cpp
index 45b944c5179..d332791ec7c 100644
--- a/src/devices/sound/mos6560.cpp
+++ b/src/devices/sound/mos6560.cpp
@@ -682,12 +682,14 @@ DEFINE_DEVICE_TYPE(MOS656X_ATTACK_UFO, mos656x_attack_ufo_device, "mos656x_attac
// default address maps
void mos6560_device::mos6560_videoram_map(address_map &map)
{
- map(0x0000, 0x3fff).ram();
+ if (!has_configured_map(0))
+ map(0x0000, 0x3fff).ram();
}
void mos6560_device::mos6560_colorram_map(address_map &map)
{
- map(0x000, 0x3ff).ram();
+ if (!has_configured_map(1))
+ map(0x000, 0x3ff).ram();
}
mos6560_device::mos6560_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock, uint32_t variant)
@@ -696,8 +698,8 @@ mos6560_device::mos6560_device(const machine_config &mconfig, device_type type,
device_sound_interface(mconfig, *this),
device_video_interface(mconfig, *this),
m_variant(variant),
- m_videoram_space_config("videoram", ENDIANNESS_LITTLE, 8, 14, 0, address_map_constructor(), address_map_constructor(FUNC(mos6560_device::mos6560_videoram_map), this)),
- m_colorram_space_config("colorram", ENDIANNESS_LITTLE, 8, 10, 0, address_map_constructor(), address_map_constructor(FUNC(mos6560_device::mos6560_colorram_map), this)),
+ m_videoram_space_config("videoram", ENDIANNESS_LITTLE, 8, 14, 0, address_map_constructor(FUNC(mos6560_device::mos6560_videoram_map), this)),
+ m_colorram_space_config("colorram", ENDIANNESS_LITTLE, 8, 10, 0, address_map_constructor(FUNC(mos6560_device::mos6560_colorram_map), this)),
m_read_potx(*this),
m_read_poty(*this)
{
diff --git a/src/devices/sound/mos6581.cpp b/src/devices/sound/mos6581.cpp
index 8648e86bbc9..2e4cb1f3cfd 100644
--- a/src/devices/sound/mos6581.cpp
+++ b/src/devices/sound/mos6581.cpp
@@ -119,7 +119,7 @@ void mos6581_device::sound_stream_update(sound_stream &stream, stream_sample_t *
// read -
//-------------------------------------------------
-READ8_MEMBER( mos6581_device::read )
+uint8_t mos6581_device::read(offs_t offset)
{
uint8_t data;
@@ -146,7 +146,7 @@ READ8_MEMBER( mos6581_device::read )
// write -
//-------------------------------------------------
-WRITE8_MEMBER( mos6581_device::write )
+void mos6581_device::write(offs_t offset, uint8_t data)
{
m_token->port_w(offset, data);
}
diff --git a/src/devices/sound/mos6581.h b/src/devices/sound/mos6581.h
index 95af2cbd687..68d319a45df 100644
--- a/src/devices/sound/mos6581.h
+++ b/src/devices/sound/mos6581.h
@@ -53,8 +53,8 @@ public:
auto potx() { return m_read_potx.bind(); }
auto poty() { return m_read_poty.bind(); }
- DECLARE_READ8_MEMBER( read );
- DECLARE_WRITE8_MEMBER( write );
+ uint8_t read(offs_t offset);
+ void write(offs_t offset, uint8_t data);
protected:
mos6581_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock, uint32_t variant);
diff --git a/src/devices/sound/mos7360.cpp b/src/devices/sound/mos7360.cpp
index f1ced2e6a9e..2c3f6cbd26d 100644
--- a/src/devices/sound/mos7360.cpp
+++ b/src/devices/sound/mos7360.cpp
@@ -172,7 +172,8 @@ DEFINE_DEVICE_TYPE(MOS7360, mos7360_device, "mos7360", "MOS 7360 TED")
// default address maps
void mos7360_device::mos7360_videoram_map(address_map &map)
{
- map(0x0000, 0xffff).ram();
+ if (!has_configured_map(0))
+ map(0x0000, 0xffff).ram();
}
@@ -265,7 +266,7 @@ mos7360_device::mos7360_device(const machine_config &mconfig, const char *tag, d
device_memory_interface(mconfig, *this),
device_sound_interface(mconfig, *this),
device_video_interface(mconfig, *this),
- m_videoram_space_config("videoram", ENDIANNESS_LITTLE, 8, 16, 0, address_map_constructor(), address_map_constructor(FUNC(mos7360_device::mos7360_videoram_map), this)),
+ m_videoram_space_config("videoram", ENDIANNESS_LITTLE, 8, 16, 0, address_map_constructor(FUNC(mos7360_device::mos7360_videoram_map), this)),
m_write_irq(*this),
m_read_k(*this),
m_stream(nullptr)
diff --git a/src/devices/sound/msm5205.h b/src/devices/sound/msm5205.h
index 7bdb0544af1..2f36d0347e9 100644
--- a/src/devices/sound/msm5205.h
+++ b/src/devices/sound/msm5205.h
@@ -7,16 +7,6 @@
/* an interface for the MSM5205 and similar chips */
-#define MCFG_MSM5205_PRESCALER_SELECTOR(select) \
- downcast<msm5205_device &>(*device).set_prescaler_selector((msm5205_device::select));
-
-#define MCFG_MSM5205_VCK_CALLBACK(cb) \
- downcast<msm5205_device &>(*device).set_vck_callback((DEVCB_##cb));
-
-#define MCFG_MSM5205_VCLK_CB(cb) \
- downcast<msm5205_device &>(*device).set_vck_legacy_callback((DEVCB_##cb));
-
-
class msm5205_device : public device_t, public device_sound_interface
{
public:
diff --git a/src/devices/sound/nile.cpp b/src/devices/sound/nile.cpp
index 4e78b754db5..fcd9e4b592d 100644
--- a/src/devices/sound/nile.cpp
+++ b/src/devices/sound/nile.cpp
@@ -69,6 +69,11 @@ nile_device::nile_device(const machine_config &mconfig, const char *tag, device_
void nile_device::device_start()
{
m_stream = stream_alloc(0, 2, 44100);
+ save_item(NAME(m_sound_regs));
+ save_item(NAME(m_vpos));
+ save_item(NAME(m_frac));
+ save_item(NAME(m_lponce));
+ save_item(NAME(m_ctrl));
}
diff --git a/src/devices/sound/okim6258.cpp b/src/devices/sound/okim6258.cpp
index 491229a4e81..a9477a5d7bc 100644
--- a/src/devices/sound/okim6258.cpp
+++ b/src/devices/sound/okim6258.cpp
@@ -262,7 +262,7 @@ int okim6258_device::get_vclk()
***********************************************************************************************/
-READ8_MEMBER( okim6258_device::status_r )
+uint8_t okim6258_device::status_r()
{
m_stream->update();
@@ -275,7 +275,7 @@ READ8_MEMBER( okim6258_device::status_r )
okim6258_data_w -- write to the control port of an OKIM6258-compatible chip
***********************************************************************************************/
-WRITE8_MEMBER( okim6258_device::data_w )
+void okim6258_device::data_w(uint8_t data)
{
/* update the stream */
m_stream->update();
@@ -291,7 +291,7 @@ WRITE8_MEMBER( okim6258_device::data_w )
***********************************************************************************************/
-WRITE8_MEMBER( okim6258_device::ctrl_w )
+void okim6258_device::ctrl_w(uint8_t data)
{
m_stream->update();
diff --git a/src/devices/sound/okim6258.h b/src/devices/sound/okim6258.h
index 6ca2c67532b..57f764d4eb7 100644
--- a/src/devices/sound/okim6258.h
+++ b/src/devices/sound/okim6258.h
@@ -33,9 +33,9 @@ public:
void set_type(int type) { m_adpcm_type = type; }
void set_outbits(int outbit) { m_output_bits = outbit; }
- DECLARE_READ8_MEMBER( status_r );
- DECLARE_WRITE8_MEMBER( data_w );
- DECLARE_WRITE8_MEMBER( ctrl_w );
+ uint8_t status_r();
+ void data_w(uint8_t data);
+ void ctrl_w(uint8_t data);
void set_divider(int val);
int get_vclk();
diff --git a/src/devices/sound/okim6295.cpp b/src/devices/sound/okim6295.cpp
index faf078e5f7c..10375f7736a 100644
--- a/src/devices/sound/okim6295.cpp
+++ b/src/devices/sound/okim6295.cpp
@@ -210,10 +210,10 @@ void okim6295_device::set_pin7(int pin7)
//-------------------------------------------------
-// read_status - read the status register
+// read - read the status register
//-------------------------------------------------
-uint8_t okim6295_device::read_status()
+uint8_t okim6295_device::read()
{
uint8_t result = 0xf0; // naname expects bits 4-7 to be 1
@@ -228,20 +228,10 @@ uint8_t okim6295_device::read_status()
//-------------------------------------------------
-// read - memory interface for read
+// write - write to the command register
//-------------------------------------------------
-READ8_MEMBER( okim6295_device::read )
-{
- return read_status();
-}
-
-
-//-------------------------------------------------
-// write_command - write to the command register
-//-------------------------------------------------
-
-void okim6295_device::write_command(uint8_t command)
+void okim6295_device::write(uint8_t command)
{
// if a command is pending, process the second half
if (m_command != -1)
@@ -323,16 +313,6 @@ void okim6295_device::write_command(uint8_t command)
}
-//-------------------------------------------------
-// write - memory interface for write
-//-------------------------------------------------
-
-WRITE8_MEMBER( okim6295_device::write )
-{
- write_command(data);
-}
-
-
//**************************************************************************
// OKIM VOICE
diff --git a/src/devices/sound/okim6295.h b/src/devices/sound/okim6295.h
index 536c76b3b10..0e836c29ad9 100644
--- a/src/devices/sound/okim6295.h
+++ b/src/devices/sound/okim6295.h
@@ -47,11 +47,8 @@ public:
// runtime configuration
void set_pin7(int pin7);
- uint8_t read_status();
- void write_command(uint8_t command);
-
- DECLARE_READ8_MEMBER( read );
- DECLARE_WRITE8_MEMBER( write );
+ uint8_t read();
+ void write(uint8_t command);
protected:
// device-level overrides
diff --git a/src/devices/sound/okim6376.cpp b/src/devices/sound/okim6376.cpp
index 0e33c83d7a8..e04f051b0f5 100644
--- a/src/devices/sound/okim6376.cpp
+++ b/src/devices/sound/okim6376.cpp
@@ -513,7 +513,7 @@ WRITE_LINE_MEMBER( okim6376_device::st_w )
***********************************************************************************************/
-WRITE8_MEMBER( okim6376_device::write )
+void okim6376_device::write(uint8_t data)
{
// The data port is purely used to set the latch, everything else is started by an ST pulse
diff --git a/src/devices/sound/okim6376.h b/src/devices/sound/okim6376.h
index 7efaa337d49..91cb3acf7e6 100644
--- a/src/devices/sound/okim6376.h
+++ b/src/devices/sound/okim6376.h
@@ -13,7 +13,7 @@ class okim6376_device : public device_t,
public:
okim6376_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- DECLARE_WRITE8_MEMBER( write );
+ void write(uint8_t data);
DECLARE_WRITE_LINE_MEMBER( st_w );
DECLARE_WRITE_LINE_MEMBER( ch2_w );
diff --git a/src/devices/sound/pokey.cpp b/src/devices/sound/pokey.cpp
index 487a1b4e83b..3372ac70a81 100644
--- a/src/devices/sound/pokey.cpp
+++ b/src/devices/sound/pokey.cpp
@@ -99,11 +99,6 @@
#define TIMER2 1
#define TIMER4 2
-/* values to add to the divisors for the different modes */
-#define DIVADD_LOCLK 1
-#define DIVADD_HICLK 4
-#define DIVADD_HICLK_JOINED 7
-
/* AUDCx */
#define NOTPOLY5 0x80 /* selects POLY5 or direct CLOCK */
#define POLY4 0x40 /* selects POLY4 or POLY17 */
@@ -152,17 +147,10 @@
#define DIV_64 28 /* divisor for 1.78979 MHz clock to 63.9211 kHz */
#define DIV_15 114 /* divisor for 1.78979 MHz clock to 15.6999 kHz */
-#define P4(chip) chip->poly4[chip->p4]
-#define P5(chip) chip->poly5[chip->p5]
-#define P9(chip) chip->poly9[chip->p9]
-#define P17(chip) chip->poly17[chip->p17]
-
#define CLK_1 0
#define CLK_28 1
#define CLK_114 2
-static const int clock_divisors[3] = {1, DIV_64, DIV_15};
-
constexpr unsigned pokey_device::FREQ_17_EXACT;
@@ -253,7 +241,8 @@ void pokey_device::device_start()
m_pot_counter = 0;
m_kbd_cnt = 0;
m_out_filter = 0;
- m_output = 0;
+ m_out_raw = 0;
+ m_old_raw_inval = true;
m_kbd_state = 0;
/* reset more internal state */
@@ -435,14 +424,7 @@ void pokey_device::execute_run()
{
do
{
- uint32_t new_out = step_one_clock();
- if (m_output != new_out)
- {
- //printf("forced update %08d %08x\n", m_icount, m_output);
- m_stream->update();
- m_output = new_out;
- }
-
+ step_one_clock();
m_icount--;
} while (m_icount > 0);
@@ -546,11 +528,8 @@ void pokey_device::step_keyboard()
void pokey_device::step_pot()
{
- if ((m_SKCTL & SK_RESET) == 0)
- return;
-
- uint8_t upd = 0;
m_pot_counter++;
+ uint8_t upd = 0;
for (int pot = 0; pot < 8; pot++)
{
if ((m_POTx[pot]<m_pot_counter) || (m_pot_counter == 228))
@@ -559,7 +538,9 @@ void pokey_device::step_pot()
/* latching is emulated in read */
}
}
- synchronize(SYNC_POT, upd);
+ // some pots latched?
+ if (upd != 0)
+ synchronize(SYNC_POT, upd);
}
/*
@@ -570,31 +551,38 @@ void pokey_device::step_pot()
*
*/
-uint32_t pokey_device::step_one_clock(void)
+void pokey_device::step_one_clock(void)
{
- int const base_clock = (m_AUDCTL & CLK_15KHZ) ? CLK_114 : CLK_28;
-
+ /* Clocks only count if we are not in a reset */
if (m_SKCTL & SK_RESET)
{
- /* Clocks only count if we are not in a reset */
- int clock_triggered[3] = {0,0,0};
- int clk;
- for (clk = 0; clk < 3; clk++)
+ /* polynom pointers */
+ if (++m_p4 == 0x0000f)
+ m_p4 = 0;
+ if (++m_p5 == 0x0001f)
+ m_p5 = 0;
+ if (++m_p9 == 0x001ff)
+ m_p9 = 0;
+ if (++m_p17 == 0x1ffff)
+ m_p17 = 0;
+
+ /* CLK_1: no presacler */
+ int clock_triggered[3] = {1,0,0};
+ /* CLK_28: prescaler 63.9211 kHz */
+ if (++m_clock_cnt[CLK_28] >= DIV_64)
{
- m_clock_cnt[clk]++;
- if (m_clock_cnt[clk] >= clock_divisors[clk])
- {
- m_clock_cnt[clk] = 0;
- clock_triggered[clk] = 1;
- }
+ m_clock_cnt[CLK_28] = 0;
+ clock_triggered[CLK_28] = 1;
+ }
+ /* CLK_114 prescaler 15.6999 kHz */
+ if (++m_clock_cnt[CLK_114] >= DIV_15)
+ {
+ m_clock_cnt[CLK_114] = 0;
+ clock_triggered[CLK_114] = 1;
}
- m_p4 = (m_p4 + 1) % 0x0000f;
- m_p5 = (m_p5 + 1) % 0x0001f;
- m_p9 = (m_p9 + 1) % 0x001ff;
- m_p17 = (m_p17 + 1 ) % 0x1ffff;
-
- clk = (m_AUDCTL & CH1_HICLK) ? CLK_1 : base_clock;
+ int const base_clock = (m_AUDCTL & CLK_15KHZ) ? CLK_114 : CLK_28;
+ int clk = (m_AUDCTL & CH1_HICLK) ? CLK_1 : base_clock;
if (clock_triggered[clk])
m_channel[CHAN1].inc_chan();
@@ -678,12 +666,23 @@ uint32_t pokey_device::step_one_clock(void)
m_channel[CHAN1].m_filter_sample = 1;
}
- uint32_t sum = 0;
- for (int ch = 0; ch < 4; ch++)
+ if (m_old_raw_inval)
{
- sum |= (((((m_channel[ch].m_output ^ m_channel[ch].m_filter_sample) || (m_channel[ch].m_AUDC & VOLUME_ONLY)) ? (m_channel[ch].m_AUDC & VOLUME_MASK) : 0 )) << (ch * 4));
+ uint32_t sum = 0;
+ for (int ch = 0; ch < 4; ch++)
+ {
+ sum |= (((m_channel[ch].m_output ^ m_channel[ch].m_filter_sample) || (m_channel[ch].m_AUDC & VOLUME_ONLY)) ?
+ ((m_channel[ch].m_AUDC & VOLUME_MASK) << (ch * 4)) : 0);
+ }
+
+ if (m_out_raw != sum)
+ {
+ //printf("forced update %08d %08x\n", m_icount, m_out_raw);
+ m_stream->update();
+ }
+ m_old_raw_inval = false;
+ m_out_raw = sum;
}
- return sum;
}
//-------------------------------------------------
@@ -700,7 +699,7 @@ void pokey_device::sound_stream_update(sound_stream &stream, stream_sample_t **i
{
int32_t out = 0;
for (int i = 0; i < 4; i++)
- out += ((m_output >> (4*i)) & 0x0f);
+ out += ((m_out_raw >> (4*i)) & 0x0f);
out *= POKEY_DEFAULT_GAIN;
out = (out > 0x7fff) ? 0x7fff : out;
while( samples > 0 )
@@ -711,7 +710,7 @@ void pokey_device::sound_stream_update(sound_stream &stream, stream_sample_t **i
}
else if (m_output_type == RC_LOWPASS)
{
- double rTot = m_voltab[m_output];
+ double rTot = m_voltab[m_out_raw];
double V0 = rTot / (rTot+m_r_pullup) * m_v_ref / 5.0 * 32767.0;
double mult = (m_cap == 0.0) ? 1.0 : 1.0 - exp(-(rTot + m_r_pullup) / (m_cap * m_r_pullup * rTot) * m_clock_period.as_double());
@@ -727,7 +726,7 @@ void pokey_device::sound_stream_update(sound_stream &stream, stream_sample_t **i
}
else if (m_output_type == OPAMP_C_TO_GROUND)
{
- double rTot = m_voltab[m_output];
+ double rTot = m_voltab[m_out_raw];
/* In this configuration there is a capacitor in parallel to the pokey output to ground.
* With a LM324 in LTSpice this causes the opamp circuit to oscillate at around 100 kHz.
* We are ignoring the capacitor here, since this oscillation would not be audible.
@@ -749,7 +748,7 @@ void pokey_device::sound_stream_update(sound_stream &stream, stream_sample_t **i
}
else if (m_output_type == OPAMP_LOW_PASS)
{
- double rTot = m_voltab[m_output];
+ double rTot = m_voltab[m_out_raw];
/* This post-pokey stage usually has a low-pass filter behind it
* It is approximated by not adding in VRef below.
*/
@@ -767,7 +766,7 @@ void pokey_device::sound_stream_update(sound_stream &stream, stream_sample_t **i
}
else if (m_output_type == DISCRETE_VAR_R)
{
- int32_t out = m_voltab[m_output];
+ int32_t out = m_voltab[m_out_raw];
while( samples > 0 )
{
*buffer++ = out;
@@ -780,7 +779,7 @@ void pokey_device::sound_stream_update(sound_stream &stream, stream_sample_t **i
// read - memory interface for reading the active status
//-------------------------------------------------
-READ8_MEMBER( pokey_device::read )
+uint8_t pokey_device::read(offs_t offset)
{
int data, pot;
@@ -876,7 +875,7 @@ READ8_MEMBER( pokey_device::read )
// write - memory interface for write
//-------------------------------------------------
-WRITE8_MEMBER( pokey_device::write )
+void pokey_device::write(offs_t offset, uint8_t data)
{
synchronize(SYNC_WRITE, (offset << 8) | data);
}
@@ -894,6 +893,7 @@ void pokey_device::write_internal(offs_t offset, uint8_t data)
case AUDC1_C:
LOG_SOUND(("POKEY '%s' AUDC1 $%02x (%s)\n", tag(), data, audc2str(data)));
m_channel[CHAN1].m_AUDC = data;
+ m_old_raw_inval = true;
break;
case AUDF2_C:
@@ -904,6 +904,7 @@ void pokey_device::write_internal(offs_t offset, uint8_t data)
case AUDC2_C:
LOG_SOUND(("POKEY '%s' AUDC2 $%02x (%s)\n", tag(), data, audc2str(data)));
m_channel[CHAN2].m_AUDC = data;
+ m_old_raw_inval = true;
break;
case AUDF3_C:
@@ -914,6 +915,7 @@ void pokey_device::write_internal(offs_t offset, uint8_t data)
case AUDC3_C:
LOG_SOUND(("POKEY '%s' AUDC3 $%02x (%s)\n", tag(), data, audc2str(data)));
m_channel[CHAN3].m_AUDC = data;
+ m_old_raw_inval = true;
break;
case AUDF4_C:
@@ -924,6 +926,7 @@ void pokey_device::write_internal(offs_t offset, uint8_t data)
case AUDC4_C:
LOG_SOUND(("POKEY '%s' AUDC4 $%02x (%s)\n", tag(), data, audc2str(data)));
m_channel[CHAN4].m_AUDC = data;
+ m_old_raw_inval = true;
break;
case AUDCTL_C:
@@ -948,7 +951,7 @@ void pokey_device::write_internal(offs_t offset, uint8_t data)
m_channel[i].m_output = 0;
m_channel[i].m_filter_sample = (i<2 ? 1 : 0);
}
-
+ m_old_raw_inval = true;
break;
case SKREST_C:
@@ -1018,6 +1021,7 @@ void pokey_device::write_internal(offs_t offset, uint8_t data)
m_clock_cnt[0] = 0;
m_clock_cnt[1] = 0;
m_clock_cnt[2] = 0;
+ m_old_raw_inval = true;
/* FIXME: Serial port reset ! */
}
break;
@@ -1066,6 +1070,7 @@ inline void pokey_device::process_channel(int ch)
m_channel[ch].m_output = (m_poly9[m_p9] & 1);
else
m_channel[ch].m_output = (m_poly17[m_p17] & 1);
+ m_old_raw_inval = true;
}
}
diff --git a/src/devices/sound/pokey.h b/src/devices/sound/pokey.h
index ec1a21b3541..7e63e89e54d 100644
--- a/src/devices/sound/pokey.h
+++ b/src/devices/sound/pokey.h
@@ -165,8 +165,8 @@ public:
set_interrupt_callback(int_cb_delegate(callback, name, nullptr, static_cast<FunctionClass *>(nullptr)));
}
- DECLARE_READ8_MEMBER( read );
- DECLARE_WRITE8_MEMBER( write );
+ uint8_t read(offs_t offset);
+ void write(offs_t offset, uint8_t data);
DECLARE_WRITE_LINE_MEMBER( sid_w ); // pin 24
void serin_ready(int after);
@@ -264,7 +264,7 @@ private:
static constexpr int POKEY_CHANNELS = 4;
- uint32_t step_one_clock();
+ void step_one_clock();
void step_keyboard();
void step_pot();
@@ -284,10 +284,11 @@ private:
pokey_channel m_channel[POKEY_CHANNELS];
- uint32_t m_output; /* raw output */
- double m_out_filter; /* filtered output */
+ uint32_t m_out_raw; /* raw output */
+ bool m_old_raw_inval; /* true: recalc m_out_raw required */
+ double m_out_filter; /* filtered output */
- int32_t m_clock_cnt[3]; /* clock counters */
+ int32_t m_clock_cnt[3]; /* clock counters */
uint32_t m_p4; /* poly4 index */
uint32_t m_p5; /* poly5 index */
uint32_t m_p9; /* poly9 index */
diff --git a/src/devices/sound/qs1000.h b/src/devices/sound/qs1000.h
index 237ef21b8e5..f57b2e41d91 100644
--- a/src/devices/sound/qs1000.h
+++ b/src/devices/sound/qs1000.h
@@ -40,6 +40,7 @@ public:
//auto serial_w() { return m_serial_w_cb.bind(); }
// external
+ i8052_device &cpu() const { return *m_cpu; }
void serial_in(uint8_t data);
DECLARE_WRITE_LINE_MEMBER( set_irq );
diff --git a/src/devices/sound/rf5c68.cpp b/src/devices/sound/rf5c68.cpp
index 2af393c884b..9ec522b7d92 100644
--- a/src/devices/sound/rf5c68.cpp
+++ b/src/devices/sound/rf5c68.cpp
@@ -189,7 +189,7 @@ void rf5c68_device::sound_stream_update(sound_stream &stream, stream_sample_t **
// RF5C68 write register
//-------------------------------------------------
-READ8_MEMBER( rf5c68_device::rf5c68_r )
+u8 rf5c68_device::rf5c68_r(offs_t offset)
{
uint8_t shift;
@@ -201,7 +201,7 @@ READ8_MEMBER( rf5c68_device::rf5c68_r )
return (m_chan[(offset & 0x0e) >> 1].addr) >> (shift);
}
-WRITE8_MEMBER( rf5c68_device::rf5c68_w )
+void rf5c68_device::rf5c68_w(offs_t offset, u8 data)
{
pcm_channel &chan = m_chan[m_cbank];
int i;
@@ -266,7 +266,7 @@ WRITE8_MEMBER( rf5c68_device::rf5c68_w )
// RF5C68 read memory
//-------------------------------------------------
-READ8_MEMBER( rf5c68_device::rf5c68_mem_r )
+u8 rf5c68_device::rf5c68_mem_r(offs_t offset)
{
return m_cache->read_byte(m_wbank | offset);
}
@@ -276,7 +276,7 @@ READ8_MEMBER( rf5c68_device::rf5c68_mem_r )
// RF5C68 write memory
//-------------------------------------------------
-WRITE8_MEMBER( rf5c68_device::rf5c68_mem_w )
+void rf5c68_device::rf5c68_mem_w(offs_t offset, u8 data)
{
m_data->write_byte(m_wbank | offset, data);
}
diff --git a/src/devices/sound/rf5c68.h b/src/devices/sound/rf5c68.h
index 056d2c9c99c..262efb54286 100644
--- a/src/devices/sound/rf5c68.h
+++ b/src/devices/sound/rf5c68.h
@@ -38,11 +38,11 @@ public:
set_end_callback(sample_end_cb_delegate(callback, name, nullptr, static_cast<FunctionClass *>(nullptr)));
}
- DECLARE_READ8_MEMBER( rf5c68_r );
- DECLARE_WRITE8_MEMBER( rf5c68_w );
+ u8 rf5c68_r(offs_t offset);
+ void rf5c68_w(offs_t offset, u8 data);
- DECLARE_READ8_MEMBER( rf5c68_mem_r );
- DECLARE_WRITE8_MEMBER( rf5c68_mem_w );
+ u8 rf5c68_mem_r(offs_t offset);
+ void rf5c68_mem_w(offs_t offset, u8 data);
protected:
rf5c68_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock);
diff --git a/src/devices/sound/sn76496.cpp b/src/devices/sound/sn76496.cpp
index 23b29c208e3..6765fb3393f 100644
--- a/src/devices/sound/sn76496.cpp
+++ b/src/devices/sound/sn76496.cpp
@@ -290,14 +290,14 @@ void sn76496_base_device::device_clock_changed()
m_sound->set_sample_rate(clock()/2);
}
-WRITE8_MEMBER( sn76496_base_device::stereo_w )
+void sn76496_base_device::stereo_w(u8 data)
{
m_sound->update();
if (m_stereo) m_stereo_mask = data;
else fatalerror("sn76496_base_device: Call to stereo write with mono chip!\n");
}
-void sn76496_base_device::write(uint8_t data)
+void sn76496_base_device::write(u8 data)
{
int n, r, c;
diff --git a/src/devices/sound/sn76496.h b/src/devices/sound/sn76496.h
index b518fa25398..cd7b4a6c509 100644
--- a/src/devices/sound/sn76496.h
+++ b/src/devices/sound/sn76496.h
@@ -24,9 +24,8 @@ class sn76496_base_device : public device_t, public device_sound_interface
public:
auto ready_cb() { return m_ready_handler.bind(); }
- DECLARE_WRITE8_MEMBER( stereo_w );
- void write(uint8_t data);
- DECLARE_WRITE8_MEMBER( command_w ) { write(data); }
+ void stereo_w(u8 data);
+ void write(u8 data);
DECLARE_READ_LINE_MEMBER( ready_r ) { return m_ready_state ? 1 : 0; }
protected:
diff --git a/src/devices/sound/spkrdev.h b/src/devices/sound/spkrdev.h
index 7542d943793..49e953b5d40 100644
--- a/src/devices/sound/spkrdev.h
+++ b/src/devices/sound/spkrdev.h
@@ -21,9 +21,9 @@ public:
~speaker_sound_device() {}
// configuration
- void set_levels(int num_levels, const int16_t *levels) { m_num_levels = num_levels; m_levels = levels;}
+ void set_levels(int num_levels, const int16_t *levels) { m_num_levels = num_levels; m_levels = levels; }
- void level_w(int new_level);
+ void level_w(int new_level); // can use as writeline
protected:
// device-level overrides
diff --git a/src/devices/sound/swp30.cpp b/src/devices/sound/swp30.cpp
index 56870df5ec7..f43df8084f9 100644
--- a/src/devices/sound/swp30.cpp
+++ b/src/devices/sound/swp30.cpp
@@ -150,8 +150,15 @@ DEFINE_DEVICE_TYPE(SWP30, swp30_device, "swp30", "Yamaha SWP30 sound chip")
swp30_device::swp30_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
: device_t(mconfig, SWP30, tag, owner, clock),
device_sound_interface(mconfig, *this),
- device_rom_interface(mconfig, *this, 25+2, ENDIANNESS_LITTLE, 32)
+ device_rom_interface(mconfig, *this, 25+2, ENDIANNESS_LITTLE, 32),
+ m_meg(*this, "meg")
{
+ (void)m_map;
+}
+
+void swp30_device::device_add_mconfig(machine_config &config)
+{
+ MEGEMB(config, m_meg);
}
void swp30_device::device_start()
@@ -160,7 +167,7 @@ void swp30_device::device_start()
// Attenuantion for panning is 4.4 floating point. That means 0
// to -96.3dB. Since it's a nice range, we assume it's the same
- // for other attenuation values. Computed value is is 1.16
+ // for other attenuation values. Computed value is 1.16
// format, to avoid overflow
for(int i=0; i<256; i++)
@@ -328,8 +335,8 @@ void swp30_device::map(address_map &map)
rchan(map, 0x27).rw(FUNC(swp30_device::prg_fp_r<3>), FUNC(swp30_device::prg_fp_w<3>));
rchan(map, 0x29).rw(FUNC(swp30_device::prg_fp_r<4>), FUNC(swp30_device::prg_fp_w<4>));
rchan(map, 0x2b).rw(FUNC(swp30_device::prg_fp_r<5>), FUNC(swp30_device::prg_fp_w<5>));
- rchan(map, 0x30).rw(FUNC(swp30_device::prg_int_r<0>), FUNC(swp30_device::prg_int_w<0>));
- rchan(map, 0x31).rw(FUNC(swp30_device::prg_int_r<1>), FUNC(swp30_device::prg_int_w<1>));
+ rchan(map, 0x30).rw(FUNC(swp30_device::prg_off_r<0>), FUNC(swp30_device::prg_off_w<0>));
+ rchan(map, 0x31).rw(FUNC(swp30_device::prg_off_r<1>), FUNC(swp30_device::prg_off_w<1>));
rchan(map, 0x3e).rw(FUNC(swp30_device::prg_lfo_r<0>), FUNC(swp30_device::prg_lfo_w<0>));
rchan(map, 0x3f).rw(FUNC(swp30_device::prg_lfo_r<1>), FUNC(swp30_device::prg_lfo_w<1>));
}
@@ -381,14 +388,14 @@ void swp30_device::prg_address_w(u16 data)
template<int sel> u16 swp30_device::prg_r()
{
constexpr offs_t shift = 48-16*sel;
- return m_program[m_program_address] >> shift;
+ return m_meg->prg_r(m_program_address) >> shift;
}
template<int sel> void swp30_device::prg_w(u16 data)
{
constexpr offs_t shift = 48-16*sel;
constexpr u64 mask = ~(u64(0xffff) << shift);
- m_program[m_program_address] = (m_program[m_program_address] & mask) | (u64(data) << shift);
+ m_meg->prg_w(m_program_address, (m_meg->prg_r(m_program_address) & mask) | (u64(data) << shift));
if(sel == 3) {
if(0)
@@ -402,14 +409,12 @@ template<int sel> void swp30_device::prg_w(u16 data)
template<int sel> u16 swp30_device::map_r()
{
- return m_map[sel];
+ return m_meg->map_r(sel);
}
template<int sel> void swp30_device::map_w(u16 data)
{
- m_map[sel] = data;
- if(0)
- logerror("map %d: type=%02x offset=%05x size=%05x\n", sel, data >> 11, (data & 0xff) << 10, 0x400 << ((data >> 8) & 7));
+ m_meg->map_w(sel, data);
}
@@ -656,54 +661,36 @@ void swp30_device::address_l_w(offs_t offset, u16 data)
}
-// MEG registers (Multiple Effects Generator)
+// MEG registers forwarding
template<int sel> u16 swp30_device::prg_fp_r(offs_t offset)
{
- offs_t adr = (offset >> 6)*6 + sel;
- return m_program_pfp[adr];
+ return m_meg->fp_r((offset >> 6)*6 + sel);
}
template<int sel> void swp30_device::prg_fp_w(offs_t offset, u16 data)
{
- offs_t adr = (offset >> 6)*6 + sel;
- m_program_pfp[adr] = data;
- if(0)
- logerror("prg_fp_w %03x, %04x\n", adr, data);
+ m_meg->fp_w((offset >> 6)*6 + sel, data);
}
-template<int sel> u16 swp30_device::prg_int_r(offs_t offset)
+template<int sel> u16 swp30_device::prg_off_r(offs_t offset)
{
- offs_t adr = (offset >> 6)*2 + sel;
- return m_program_pint[adr];
+ return m_meg->offset_r((offset >> 6)*2 + sel);
}
-template<int sel> void swp30_device::prg_int_w(offs_t offset, u16 data)
+template<int sel> void swp30_device::prg_off_w(offs_t offset, u16 data)
{
- offs_t adr = (offset >> 6)*2 + sel;
- m_program_pint[adr] = data;
- if(0)
- logerror("prg_int_w %02x, %04x\n", adr, data);
+ m_meg->offset_w((offset >> 6)*2 + sel, data);
}
template<int sel> u16 swp30_device::prg_lfo_r(offs_t offset)
{
- offs_t adr = (offset >> 6)*2 + sel;
- return m_program_plfo[adr];
+ return m_meg->lfo_r((offset >> 6)*2 + sel);
}
template<int sel> void swp30_device::prg_lfo_w(offs_t offset, u16 data)
{
- offs_t adr = (offset >> 6)*2 + sel;
- m_program_plfo[adr] = data;
-
- static const int dt[8] = { 0, 32, 64, 128, 256, 512, 1024, 2048 };
- static const int sh[8] = { 0, 0, 1, 2, 3, 4, 5, 6 };
-
- int scale = (data >> 5) & 7;
- int step = ((data & 31) << sh[scale]) + dt[scale];
- if(0)
- logerror("prg_lfo_w %02x freq=%5.2f phase=%6.4f\n", adr, step * 44100.0/4194304, (data >> 8)/256.0);
+ m_meg->lfo_w((offset >> 6)*2 + sel, data);
}
diff --git a/src/devices/sound/swp30.h b/src/devices/sound/swp30.h
index 56e24b453f0..dd95a8dd85f 100644
--- a/src/devices/sound/swp30.h
+++ b/src/devices/sound/swp30.h
@@ -8,6 +8,8 @@
#pragma once
+#include "meg.h"
+
class swp30_device : public device_t, public device_sound_interface, public device_rom_interface
{
public:
@@ -20,8 +22,11 @@ protected:
virtual void device_reset() override;
virtual void sound_stream_update(sound_stream &stream, stream_sample_t **inputs, stream_sample_t **outputs, int samples) override;
virtual void rom_bank_updated() override;
+ virtual void device_add_mconfig(machine_config &config) override;
private:
+ required_device<meg_embedded_device> m_meg;
+
sound_stream *m_stream;
s32 m_sample_increment[0x4000];
@@ -99,8 +104,8 @@ private:
// MEG registers
template<int sel> u16 prg_fp_r(offs_t offset);
template<int sel> void prg_fp_w(offs_t offset, u16 data);
- template<int sel> u16 prg_int_r(offs_t offset);
- template<int sel> void prg_int_w(offs_t offset, u16 data);
+ template<int sel> u16 prg_off_r(offs_t offset);
+ template<int sel> void prg_off_w(offs_t offset, u16 data);
template<int sel> u16 prg_lfo_r(offs_t offset);
template<int sel> void prg_lfo_w(offs_t offset, u16 data);
diff --git a/src/devices/sound/t6721a.cpp b/src/devices/sound/t6721a.cpp
index f4ea65a92b5..423cd3edc19 100644
--- a/src/devices/sound/t6721a.cpp
+++ b/src/devices/sound/t6721a.cpp
@@ -74,7 +74,7 @@ void t6721a_device::sound_stream_update(sound_stream &stream, stream_sample_t **
// read -
//-------------------------------------------------
-READ8_MEMBER( t6721a_device::read )
+uint8_t t6721a_device::read()
{
return 0;
}
@@ -84,7 +84,7 @@ READ8_MEMBER( t6721a_device::read )
// write -
//-------------------------------------------------
-WRITE8_MEMBER( t6721a_device::write )
+void t6721a_device::write(uint8_t data)
{
}
diff --git a/src/devices/sound/t6721a.h b/src/devices/sound/t6721a.h
index 0342cbaad84..ebc7ea6924e 100644
--- a/src/devices/sound/t6721a.h
+++ b/src/devices/sound/t6721a.h
@@ -53,8 +53,8 @@ public:
auto dtrd_handler() { return m_write_dtrd.bind(); }
auto apd_handler() { return m_write_apd.bind(); }
- DECLARE_READ8_MEMBER( read );
- DECLARE_WRITE8_MEMBER( write );
+ uint8_t read();
+ void write(uint8_t data);
DECLARE_WRITE_LINE_MEMBER( di_w );
diff --git a/src/devices/sound/t6w28.cpp b/src/devices/sound/t6w28.cpp
index 2f155644c5c..cc7324d41f1 100644
--- a/src/devices/sound/t6w28.cpp
+++ b/src/devices/sound/t6w28.cpp
@@ -39,7 +39,7 @@ Offset 0:
#define STEP 0x10000
-WRITE8_MEMBER( t6w28_device::write )
+void t6w28_device::write(offs_t offset, uint8_t data)
{
int n, r, c;
diff --git a/src/devices/sound/t6w28.h b/src/devices/sound/t6w28.h
index e62852e77b6..e6cc2d9319d 100644
--- a/src/devices/sound/t6w28.h
+++ b/src/devices/sound/t6w28.h
@@ -10,8 +10,8 @@ class t6w28_device : public device_t, public device_sound_interface
public:
t6w28_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- DECLARE_WRITE8_MEMBER( write );
- void set_enable( bool enable );
+ void write(offs_t offset, uint8_t data);
+ void set_enable(bool enable);
protected:
// device-level overrides
diff --git a/src/devices/sound/upd7752.cpp b/src/devices/sound/upd7752.cpp
index f49171588e7..e2e28317d4c 100644
--- a/src/devices/sound/upd7752.cpp
+++ b/src/devices/sound/upd7752.cpp
@@ -31,8 +31,8 @@ DEFINE_DEVICE_TYPE(UPD7752, upd7752_device, "upd7752", "NEC uPD7752")
/* TODO: unknown exact size */
void upd7752_device::upd7752_ram(address_map &map)
{
-// AM_RANGE(0x0000, 0x7fff) AM_ROM
- map(0x0000, 0xffff).ram();
+ if (!has_configured_map(0))
+ map(0x0000, 0xffff).ram();
}
//**************************************************************************
@@ -47,7 +47,7 @@ upd7752_device::upd7752_device(const machine_config &mconfig, const char *tag, d
: device_t(mconfig, UPD7752, tag, owner, clock),
device_sound_interface(mconfig, *this),
device_memory_interface(mconfig, *this), m_stream(nullptr),
- m_space_config("ram", ENDIANNESS_LITTLE, 8, 16, 0, address_map_constructor(), address_map_constructor(FUNC(upd7752_device::upd7752_ram), this)), m_status(0), m_ram_addr(0), m_mode(0)
+ m_space_config("ram", ENDIANNESS_LITTLE, 8, 16, 0, address_map_constructor(FUNC(upd7752_device::upd7752_ram), this)), m_status(0), m_ram_addr(0), m_mode(0)
{
}
diff --git a/src/devices/sound/vlm5030.cpp b/src/devices/sound/vlm5030.cpp
index 9bdbd807876..f58540558d4 100644
--- a/src/devices/sound/vlm5030.cpp
+++ b/src/devices/sound/vlm5030.cpp
@@ -397,9 +397,9 @@ READ_LINE_MEMBER( vlm5030_device::bsy )
}
/* latch contoll data */
-WRITE8_MEMBER( vlm5030_device::data_w )
+void vlm5030_device::data_w(uint8_t data)
{
- m_latch_data = (uint8_t)data;
+ m_latch_data = data;
}
/* set RST pin level : reset / set table address A8-A15 */
diff --git a/src/devices/sound/vlm5030.h b/src/devices/sound/vlm5030.h
index af5f6dbc75b..adbd9173c2b 100644
--- a/src/devices/sound/vlm5030.h
+++ b/src/devices/sound/vlm5030.h
@@ -14,7 +14,7 @@ public:
DECLARE_READ_LINE_MEMBER( bsy );
/* latch contoll data */
- DECLARE_WRITE8_MEMBER( data_w );
+ void data_w(uint8_t data);
/* set RST pin level : reset / set table address A8-A15 */
DECLARE_WRITE_LINE_MEMBER( rst );
diff --git a/src/devices/sound/volt_reg.cpp b/src/devices/sound/volt_reg.cpp
index 12f3ed31130..aade7ddff01 100644
--- a/src/devices/sound/volt_reg.cpp
+++ b/src/devices/sound/volt_reg.cpp
@@ -23,7 +23,7 @@ voltage_regulator_device::voltage_regulator_device(const machine_config &mconfig
device_t(mconfig, VOLTAGE_REGULATOR, tag, owner, clock),
device_sound_interface(mconfig, *this),
m_stream(nullptr),
- m_output(0)
+ m_output(0x7fff)
{
}
diff --git a/src/devices/sound/volt_reg.h b/src/devices/sound/volt_reg.h
index f2e5d88298e..516039aac17 100644
--- a/src/devices/sound/volt_reg.h
+++ b/src/devices/sound/volt_reg.h
@@ -14,13 +14,10 @@
#pragma once
-#define MCFG_VOLTAGE_REGULATOR_OUTPUT(_output) \
- downcast<voltage_regulator_device &>(*device).set_output(_output);
-
class voltage_regulator_device : public device_t, public device_sound_interface
{
public:
- voltage_regulator_device &set_output(double analogue_dc) { m_output = (analogue_dc * 32768) / 5.0f; return *this; }
+ voltage_regulator_device &set_output(double analogue_dc) { m_output = (analogue_dc * 0x7fff) / 5.0f; return *this; }
voltage_regulator_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock = 0);
diff --git a/src/devices/sound/votrax.cpp b/src/devices/sound/votrax.cpp
index d2741b0a7dc..720df7d2ca9 100644
--- a/src/devices/sound/votrax.cpp
+++ b/src/devices/sound/votrax.cpp
@@ -84,7 +84,7 @@ votrax_sc01_device::votrax_sc01_device(const machine_config &mconfig, const char
{
}
-WRITE8_MEMBER( votrax_sc01_device::write )
+void votrax_sc01_device::write(uint8_t data)
{
// flush out anything currently processing
m_stream->update();
@@ -114,7 +114,7 @@ WRITE8_MEMBER( votrax_sc01_device::write )
// inflection bits
//-------------------------------------------------
-WRITE8_MEMBER( votrax_sc01_device::inflection_w )
+void votrax_sc01_device::inflection_w(uint8_t data)
{
// only 2 bits matter
data &= 3;
diff --git a/src/devices/sound/votrax.h b/src/devices/sound/votrax.h
index a7122c561af..aa3b88cc7e3 100644
--- a/src/devices/sound/votrax.h
+++ b/src/devices/sound/votrax.h
@@ -24,8 +24,8 @@ public:
auto ar_callback() { return m_ar_cb.bind(); }
- DECLARE_WRITE8_MEMBER(write);
- DECLARE_WRITE8_MEMBER(inflection_w);
+ void write(uint8_t data);
+ void inflection_w(uint8_t data);
DECLARE_READ_LINE_MEMBER(request) { m_stream->update(); return m_ar_state; }
protected:
diff --git a/src/devices/sound/vrc6.cpp b/src/devices/sound/vrc6.cpp
index e632cce1cdb..e990a0edd69 100644
--- a/src/devices/sound/vrc6.cpp
+++ b/src/devices/sound/vrc6.cpp
@@ -2,7 +2,7 @@
// copyright-holders:R. Belmont
/***************************************************************************
- vrc6.c
+ vrc6.cpp
Konami VRC6 additional sound channels
Emulation by R. Belmont
@@ -218,7 +218,7 @@ void vrc6snd_device::sound_stream_update(sound_stream &stream, stream_sample_t *
// write - write to the chip's registers
//---------------------------------------
-WRITE8_MEMBER( vrc6snd_device::write )
+void vrc6snd_device::write(offs_t offset, uint8_t data)
{
switch (offset >> 8)
{
diff --git a/src/devices/sound/vrc6.h b/src/devices/sound/vrc6.h
index dbcd5152c3b..a24d34a90c4 100644
--- a/src/devices/sound/vrc6.h
+++ b/src/devices/sound/vrc6.h
@@ -24,7 +24,7 @@ public:
// construction/destruction
vrc6snd_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- DECLARE_WRITE8_MEMBER(write);
+ void write(offs_t offset, uint8_t data);
protected:
// device-level overrides
diff --git a/src/devices/sound/ym2151.cpp b/src/devices/sound/ym2151.cpp
index 4f3a95acdb8..42c105c64a0 100644
--- a/src/devices/sound/ym2151.cpp
+++ b/src/devices/sound/ym2151.cpp
@@ -1676,7 +1676,7 @@ ym2151_device::ym2151_device(const machine_config &mconfig, const char *tag, dev
// read - read from the device
//-------------------------------------------------
-READ8_MEMBER( ym2151_device::read )
+u8 ym2151_device::read(offs_t offset)
{
if (offset & 1)
{
@@ -1692,7 +1692,7 @@ READ8_MEMBER( ym2151_device::read )
// write - write from the device
//-------------------------------------------------
-WRITE8_MEMBER( ym2151_device::write )
+void ym2151_device::write(offs_t offset, u8 data)
{
if (offset & 1)
{
@@ -1707,19 +1707,19 @@ WRITE8_MEMBER( ym2151_device::write )
}
-READ8_MEMBER( ym2151_device::status_r )
+u8 ym2151_device::status_r()
{
- return read(space, 1);
+ return read(1);
}
-WRITE8_MEMBER( ym2151_device::register_w )
+void ym2151_device::register_w(u8 data)
{
- write(space, 0, data);
+ write(0, data);
}
-WRITE8_MEMBER( ym2151_device::data_w )
+void ym2151_device::data_w(u8 data)
{
- write(space, 1, data);
+ write(1, data);
}
diff --git a/src/devices/sound/ym2151.h b/src/devices/sound/ym2151.h
index e797a88724b..562c6bb10a2 100644
--- a/src/devices/sound/ym2151.h
+++ b/src/devices/sound/ym2151.h
@@ -55,12 +55,12 @@ public:
auto port_write_handler() { return m_portwritehandler.bind(); }
// read/write
- DECLARE_READ8_MEMBER(read);
- DECLARE_WRITE8_MEMBER(write);
+ u8 read(offs_t offset);
+ void write(offs_t offset, u8 data);
- DECLARE_READ8_MEMBER(status_r);
- DECLARE_WRITE8_MEMBER(register_w);
- DECLARE_WRITE8_MEMBER(data_w);
+ u8 status_r();
+ void register_w(u8 data);
+ void data_w(u8 data);
DECLARE_WRITE_LINE_MEMBER(reset_w);
diff --git a/src/devices/sound/ym2413.cpp b/src/devices/sound/ym2413.cpp
index 69ad6b31e33..755e66ea629 100644
--- a/src/devices/sound/ym2413.cpp
+++ b/src/devices/sound/ym2413.cpp
@@ -42,6 +42,8 @@ to do:
#include "emu.h"
#include "ym2413.h"
+#include <algorithm>
+
#define FREQ_SH 16 /* 16.16 fixed point (frequency calculations) */
#define EG_SH 16 /* 16.16 fixed point (EG timing) */
#define LFO_SH 24 /* 8.24 fixed point (LFO calculations) */
@@ -131,7 +133,7 @@ const uint32_t ym2413_device::sl_tab[16] = {
};
#undef SC
-const unsigned char ym2413_device::eg_inc[15*RATE_STEPS] = {
+const uint8_t ym2413_device::eg_inc[15*RATE_STEPS] = {
/*cycle:0 1 2 3 4 5 6 7*/
/* 0 */ 0,1, 0,1, 0,1, 0,1, /* rates 00..12 0 (increment by 0 or 1) */
@@ -158,7 +160,7 @@ const unsigned char ym2413_device::eg_inc[15*RATE_STEPS] = {
#define O(a) (a*RATE_STEPS)
/*note that there is no O(13) in this table - it's directly in the code */
-const unsigned char ym2413_device::eg_rate_select[16+64+16] = { /* Envelope Generator rates (16 + 64 rates + 16 RKS) */
+const uint8_t ym2413_device::eg_rate_select[16+64+16] = { /* Envelope Generator rates (16 + 64 rates + 16 RKS) */
/* 16 infinite time rates */
O(14),O(14),O(14),O(14),O(14),O(14),O(14),O(14),
O(14),O(14),O(14),O(14),O(14),O(14),O(14),O(14),
@@ -199,7 +201,7 @@ const unsigned char ym2413_device::eg_rate_select[16+64+16] = { /* Envelope Ge
/*mask 8191, 4095, 2047, 1023, 511, 255, 127, 63, 31, 15, 7, 3, 1, 0, 0, 0 */
#define O(a) (a*1)
-const unsigned char ym2413_device::eg_rate_shift[16+64+16] = { /* Envelope Generator counter shifts (16 + 64 rates + 16 RKS) */
+const uint8_t ym2413_device::eg_rate_shift[16+64+16] = { /* Envelope Generator counter shifts (16 + 64 rates + 16 RKS) */
/* 16 infinite time rates */
O(0),O(0),O(0),O(0),O(0),O(0),O(0),O(0),
O(0),O(0),O(0),O(0),O(0),O(0),O(0),O(0),
@@ -350,9 +352,10 @@ const int8_t ym2413_device::lfo_pm_table[8*8] = {
- waveform DC and DM select are 100% correct
*/
-const unsigned char ym2413_device::table[19][8] = {
+const uint8_t ym2413_device::table[19][8] = {
/* MULT MULT modTL DcDmFb AR/DR AR/DR SL/RR SL/RR */
/* 0 1 2 3 4 5 6 7 */
+/* These YM2413(OPLL) patch dumps are done via audio analysis (and a/b testing?) from Jarek and are known to be inaccurate */
{0x49, 0x4c, 0x4c, 0x12, 0x00, 0x00, 0x00, 0x00 }, //0
{0x61, 0x61, 0x1e, 0x17, 0xf0, 0x78, 0x00, 0x17 }, //1
@@ -385,9 +388,45 @@ const unsigned char ym2413_device::table[19][8] = {
/* drum instruments definitions */
/* MULTI MULTI modTL xxx AR/DR AR/DR SL/RR SL/RR */
/* 0 1 2 3 4 5 6 7 */
- {0x01, 0x01, 0x16, 0x00, 0xfd, 0xf8, 0x2f, 0x6d },/* BD(multi verified, modTL verified, mod env - verified(close), carr. env verifed) */
- {0x01, 0x01, 0x00, 0x00, 0xd8, 0xd8, 0xf9, 0xf8 },/* HH(multi verified), SD(multi not used) */
- {0x05, 0x01, 0x00, 0x00, 0xf8, 0xba, 0x49, 0x55 },/* TOM(multi,env verified), TOP CYM(multi verified, env verified) */
+/* old dumps via audio analysis (and a/b testing?) from Jarek */
+//{0x01, 0x01, 0x16, 0x00, 0xfd, 0xf8, 0x2f, 0x6d },/* BD(multi verified, modTL verified, mod env - verified(close), carr. env verifed) */
+//{0x01, 0x01, 0x00, 0x00, 0xd8, 0xd8, 0xf9, 0xf8 },/* HH(multi verified), SD(multi not used) */
+//{0x05, 0x01, 0x00, 0x00, 0xf8, 0xba, 0x49, 0x55 },/* TOM(multi,env verified), TOP CYM(multi verified, env verified) */
+/* Drums dumped from the VRC7 using debug mode, these are likely also correct for ym2413(OPLL) but need verification */
+ {0x01, 0x01, 0x18, 0x0f, 0xdf, 0xf8, 0x6a, 0x6d },/* BD */
+ {0x01, 0x01, 0x00, 0x00, 0xc8, 0xd8, 0xa7, 0x68 },/* HH, SD */
+ {0x05, 0x01, 0x00, 0x00, 0xf8, 0xaa, 0x59, 0x55 },/* TOM, TOP CYM */
+};
+
+// VRC7 Instruments : Dumped from internal ROM
+// reference : https://siliconpr0n.org/archive/doku.php?id=vendor:yamaha:opl2
+const uint8_t vrc7snd_device::vrc7_table[19][8] = {
+/* MULT MULT modTL DcDmFb AR/DR AR/DR SL/RR SL/RR */
+/* 0 1 2 3 4 5 6 7 */
+ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, //0 (This is the user-defined instrument, should this default to anything?)
+
+ {0x03, 0x21, 0x05, 0x06, 0xe8, 0x81, 0x42, 0x27 }, //1
+ {0x13, 0x41, 0x14, 0x0d, 0xd8, 0xf6, 0x23, 0x12 }, //2
+ {0x11, 0x11, 0x08, 0x08, 0xfa, 0xb2, 0x20, 0x12 }, //3
+ {0x31, 0x61, 0x0c, 0x07, 0xa8, 0x64, 0x61, 0x27 }, //4
+ {0x32, 0x21, 0x1e, 0x06, 0xe1, 0x76, 0x01, 0x28 }, //5
+ {0x02, 0x01, 0x06, 0x00, 0xa3, 0xe2, 0xf4, 0xf4 }, //6
+ {0x21, 0x61, 0x1d, 0x07, 0x82, 0x81, 0x11, 0x07 }, //7
+ {0x23, 0x21, 0x22, 0x17, 0xa2, 0x72, 0x01, 0x17 }, //8
+ {0x35, 0x11, 0x25, 0x00, 0x40, 0x73, 0x72, 0x01 }, //9
+ {0xb5, 0x01, 0x0f, 0x0f, 0xa8, 0xa5, 0x51, 0x02 }, //A
+ {0x17, 0xc1, 0x24, 0x07, 0xf8, 0xf8, 0x22, 0x12 }, //B
+ {0x71, 0x23, 0x11, 0x06, 0x65, 0x74, 0x18, 0x16 }, //C
+ {0x01, 0x02, 0xd3, 0x05, 0xc9, 0x95, 0x03, 0x02 }, //D
+ {0x61, 0x63, 0x0c, 0x00, 0x94, 0xc0, 0x33, 0xf6 }, //E
+ {0x21, 0x72, 0x0d, 0x00, 0xc1, 0xd5, 0x56, 0x06 }, //F
+
+/* Drums (silent due to no RO output pin(?) on VRC7, but present internally; these are probably shared with YM2413) */
+/* MULTI MULTI modTL xxx AR/DR AR/DR SL/RR SL/RR */
+/* 0 1 2 3 4 5 6 7 */
+ {0x01, 0x01, 0x18, 0x0f, 0xdf, 0xf8, 0x6a, 0x6d },/* BD */
+ {0x01, 0x01, 0x00, 0x00, 0xc8, 0xd8, 0xa7, 0x68 },/* HH, SD */
+ {0x05, 0x01, 0x00, 0x00, 0xf8, 0xaa, 0x59, 0x55 },/* TOM, TOP CYM */
};
/* work table */
@@ -823,21 +862,21 @@ void ym2413_device::rhythm_calc( OPLL_CH *CH, unsigned int noise )
*/
/* base frequency derived from operator 1 in channel 7 */
- unsigned char bit7 = ((SLOT7_1->phase>>FREQ_SH)>>7)&1;
- unsigned char bit3 = ((SLOT7_1->phase>>FREQ_SH)>>3)&1;
- unsigned char bit2 = ((SLOT7_1->phase>>FREQ_SH)>>2)&1;
+ uint8_t bit7 = ((SLOT7_1->phase>>FREQ_SH)>>7)&1;
+ uint8_t bit3 = ((SLOT7_1->phase>>FREQ_SH)>>3)&1;
+ uint8_t bit2 = ((SLOT7_1->phase>>FREQ_SH)>>2)&1;
- unsigned char res1 = (bit2 ^ bit7) | bit3;
+ uint8_t res1 = (bit2 ^ bit7) | bit3;
/* when res1 = 0 phase = 0x000 | 0xd0; */
/* when res1 = 1 phase = 0x200 | (0xd0>>2); */
uint32_t phase = res1 ? (0x200|(0xd0>>2)) : 0xd0;
/* enable gate based on frequency of operator 2 in channel 8 */
- unsigned char bit5e= ((SLOT8_2->phase>>FREQ_SH)>>5)&1;
- unsigned char bit3e= ((SLOT8_2->phase>>FREQ_SH)>>3)&1;
+ uint8_t bit5e= ((SLOT8_2->phase>>FREQ_SH)>>5)&1;
+ uint8_t bit3e= ((SLOT8_2->phase>>FREQ_SH)>>3)&1;
- unsigned char res2 = (bit3e | bit5e);
+ uint8_t res2 = (bit3e | bit5e);
/* when res2 = 0 pass the phase from calculation above (res1); */
/* when res2 = 1 phase = 0x200 | (0xd0>>2); */
@@ -868,7 +907,7 @@ void ym2413_device::rhythm_calc( OPLL_CH *CH, unsigned int noise )
if( env < ENV_QUIET )
{
/* base frequency derived from operator 1 in channel 7 */
- unsigned char bit8 = ((SLOT7_1->phase>>FREQ_SH)>>8)&1;
+ uint8_t bit8 = ((SLOT7_1->phase>>FREQ_SH)>>8)&1;
/* when bit8 = 0 phase = 0x100; */
/* when bit8 = 1 phase = 0x200; */
@@ -894,21 +933,21 @@ void ym2413_device::rhythm_calc( OPLL_CH *CH, unsigned int noise )
if( env < ENV_QUIET )
{
/* base frequency derived from operator 1 in channel 7 */
- unsigned char bit7 = ((SLOT7_1->phase>>FREQ_SH)>>7)&1;
- unsigned char bit3 = ((SLOT7_1->phase>>FREQ_SH)>>3)&1;
- unsigned char bit2 = ((SLOT7_1->phase>>FREQ_SH)>>2)&1;
+ uint8_t bit7 = ((SLOT7_1->phase>>FREQ_SH)>>7)&1;
+ uint8_t bit3 = ((SLOT7_1->phase>>FREQ_SH)>>3)&1;
+ uint8_t bit2 = ((SLOT7_1->phase>>FREQ_SH)>>2)&1;
- unsigned char res1 = (bit2 ^ bit7) | bit3;
+ uint8_t res1 = (bit2 ^ bit7) | bit3;
/* when res1 = 0 phase = 0x000 | 0x100; */
/* when res1 = 1 phase = 0x200 | 0x100; */
uint32_t phase = res1 ? 0x300 : 0x100;
/* enable gate based on frequency of operator 2 in channel 8 */
- unsigned char bit5e= ((SLOT8_2->phase>>FREQ_SH)>>5)&1;
- unsigned char bit3e= ((SLOT8_2->phase>>FREQ_SH)>>3)&1;
+ uint8_t bit5e= ((SLOT8_2->phase>>FREQ_SH)>>5)&1;
+ uint8_t bit3e= ((SLOT8_2->phase>>FREQ_SH)>>3)&1;
- unsigned char res2 = (bit3e | bit5e);
+ uint8_t res2 = (bit3e | bit5e);
/* when res2 = 0 pass the phase from calculation above (res1); */
/* when res2 = 1 phase = 0x200 | 0x100; */
if (res2)
@@ -1635,11 +1674,14 @@ void ym2413_device::device_reset()
noise_rng = 1; /* noise shift register */
/* setup instruments table */
- for (int i=0; i<19; i++)
+ if (m_inst_table != nullptr)
{
- for (int c=0; c<8; c++)
+ for (int i=0; i<19; i++)
{
- inst_tab[i][c] = table[i][c];
+ for (int c=0; c<8; c++)
+ {
+ inst_tab[i][c] = m_inst_table[i][c];
+ }
}
}
@@ -1664,20 +1706,20 @@ void ym2413_device::device_reset()
}
-WRITE8_MEMBER( ym2413_device::write )
+void ym2413_device::write(offs_t offset, u8 data)
{
if (offset)
- data_port_w(space, offset, data);
+ data_port_w(data);
else
- register_port_w(space, offset, data);
+ register_port_w(data);
}
-WRITE8_MEMBER( ym2413_device::register_port_w )
+void ym2413_device::register_port_w(u8 data)
{
address = data;
}
-WRITE8_MEMBER( ym2413_device::data_port_w )
+void ym2413_device::data_port_w(u8 data)
{
m_stream->update();
write_reg(address, data);
@@ -1686,7 +1728,37 @@ WRITE8_MEMBER( ym2413_device::data_port_w )
DEFINE_DEVICE_TYPE(YM2413, ym2413_device, "ym2413", "Yamaha YM2413 OPLL")
ym2413_device::ym2413_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
- : device_t(mconfig, YM2413, tag, owner, clock)
+ : ym2413_device(mconfig, YM2413, tag, owner, clock)
+{
+ for (int i = 0; i < 19; i++)
+ {
+ for (int c = 0; c < 8; c++)
+ {
+ m_inst_table[i][c] = table[i][c];
+ }
+ }
+}
+
+ym2413_device::ym2413_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock)
+ : device_t(mconfig, type, tag, owner, clock)
, device_sound_interface(mconfig, *this)
{
+ for (int i = 0; i < 19; i++)
+ {
+ std::fill_n(&m_inst_table[i][0], 8, 0);
+ }
+}
+
+DEFINE_DEVICE_TYPE(VRC7, vrc7snd_device, "vrc7snd", "Konami VRC7 (Sound)")
+
+vrc7snd_device::vrc7snd_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+ : ym2413_device(mconfig, VRC7, tag, owner, clock)
+{
+ for (int i = 0; i < 19; i++)
+ {
+ for (int c = 0; c < 8; c++)
+ {
+ m_inst_table[i][c] = vrc7_table[i][c];
+ }
+ }
}
diff --git a/src/devices/sound/ym2413.h b/src/devices/sound/ym2413.h
index 8f496645ee9..1b0d9869770 100644
--- a/src/devices/sound/ym2413.h
+++ b/src/devices/sound/ym2413.h
@@ -11,12 +11,14 @@ class ym2413_device : public device_t, public device_sound_interface
public:
ym2413_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- DECLARE_WRITE8_MEMBER( write );
+ void write(offs_t offset, u8 data);
- DECLARE_WRITE8_MEMBER( register_port_w );
- DECLARE_WRITE8_MEMBER( data_port_w );
+ void register_port_w(u8 data);
+ void data_port_w(u8 data);
protected:
+ ym2413_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock);
+
// device-level overrides
virtual void device_start() override;
virtual void device_clock_changed() override;
@@ -25,6 +27,8 @@ protected:
// sound stream update overrides
virtual void sound_stream_update(sound_stream &stream, stream_sample_t **inputs, stream_sample_t **outputs, int samples) override;
+ uint8_t m_inst_table[19][8];
+
private:
struct OPLL_SLOT
{
@@ -106,13 +110,13 @@ private:
static const double ksl_tab[8*16];
static const uint32_t ksl_shift[4];
static const uint32_t sl_tab[16];
- static const unsigned char eg_inc[15*RATE_STEPS];
- static const unsigned char eg_rate_select[16+64+16];
- static const unsigned char eg_rate_shift[16+64+16];
+ static const uint8_t eg_inc[15*RATE_STEPS];
+ static const uint8_t eg_rate_select[16+64+16];
+ static const uint8_t eg_rate_shift[16+64+16];
static const uint8_t mul_tab[16];
static const uint8_t lfo_am_table[LFO_AM_TAB_ELEMENTS];
static const int8_t lfo_pm_table[8*8];
- static const unsigned char table[19][8];
+ static const uint8_t table[19][8];
int tl_tab[TL_TAB_LEN];
@@ -185,4 +189,15 @@ private:
DECLARE_DEVICE_TYPE(YM2413, ym2413_device)
+class vrc7snd_device : public ym2413_device
+{
+public:
+ vrc7snd_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+
+private:
+ static const uint8_t vrc7_table[19][8];
+};
+
+DECLARE_DEVICE_TYPE(VRC7, vrc7snd_device)
+
#endif // MAME_SOUND_YM2413_H
diff --git a/src/devices/sound/ymf271.cpp b/src/devices/sound/ymf271.cpp
index 70f466b0667..c979ea7426e 100644
--- a/src/devices/sound/ymf271.cpp
+++ b/src/devices/sound/ymf271.cpp
@@ -1457,7 +1457,7 @@ void ymf271_device::ymf271_write_timer(uint8_t address, uint8_t data)
}
}
-WRITE8_MEMBER( ymf271_device::write )
+void ymf271_device::write(offs_t offset, u8 data)
{
m_stream->update();
@@ -1503,7 +1503,7 @@ WRITE8_MEMBER( ymf271_device::write )
}
}
-READ8_MEMBER( ymf271_device::read )
+u8 ymf271_device::read(offs_t offset)
{
switch (offset & 0xf)
{
diff --git a/src/devices/sound/ymf271.h b/src/devices/sound/ymf271.h
index 2022096bce3..efee18db0ad 100644
--- a/src/devices/sound/ymf271.h
+++ b/src/devices/sound/ymf271.h
@@ -16,8 +16,8 @@ public:
// configuration helpers
auto irq_handler() { return m_irq_handler.bind(); }
- DECLARE_READ8_MEMBER( read );
- DECLARE_WRITE8_MEMBER( write );
+ u8 read(offs_t offset);
+ void write(offs_t offset, u8 data);
protected:
// device-level overrides
diff --git a/src/devices/sound/ymf278b.cpp b/src/devices/sound/ymf278b.cpp
index 18451d71732..c25b519ae4e 100644
--- a/src/devices/sound/ymf278b.cpp
+++ b/src/devices/sound/ymf278b.cpp
@@ -673,7 +673,7 @@ void ymf278b_device::timer_busy_start(int is_pcm)
m_timer_busy->adjust(attotime::from_hz(m_clock / (is_pcm ? 88 : 56)));
}
-WRITE8_MEMBER( ymf278b_device::write )
+void ymf278b_device::write(offs_t offset, u8 data)
{
switch (offset)
{
@@ -717,7 +717,7 @@ WRITE8_MEMBER( ymf278b_device::write )
}
-READ8_MEMBER( ymf278b_device::read )
+u8 ymf278b_device::read(offs_t offset)
{
uint8_t ret = 0;
diff --git a/src/devices/sound/ymf278b.h b/src/devices/sound/ymf278b.h
index 6db01f9b096..480397c1d0c 100644
--- a/src/devices/sound/ymf278b.h
+++ b/src/devices/sound/ymf278b.h
@@ -16,8 +16,8 @@ public:
// configuration helpers
auto irq_handler() { return m_irq_handler.bind(); }
- DECLARE_READ8_MEMBER( read );
- DECLARE_WRITE8_MEMBER( write );
+ u8 read(offs_t offset);
+ void write(offs_t offset, u8 data);
protected:
// device-level overrides
diff --git a/src/devices/sound/ymz280b.cpp b/src/devices/sound/ymz280b.cpp
index ce2754e97fa..1ab3cd9b6a9 100644
--- a/src/devices/sound/ymz280b.cpp
+++ b/src/devices/sound/ymz280b.cpp
@@ -890,7 +890,7 @@ int ymz280b_device::compute_status()
***********************************************************************************************/
-READ8_MEMBER( ymz280b_device::read )
+u8 ymz280b_device::read(offs_t offset)
{
if ((offset & 1) == 0)
{
@@ -908,7 +908,7 @@ READ8_MEMBER( ymz280b_device::read )
}
-WRITE8_MEMBER( ymz280b_device::write )
+void ymz280b_device::write(offs_t offset, u8 data)
{
if ((offset & 1) == 0)
m_current_register = data;
diff --git a/src/devices/sound/ymz280b.h b/src/devices/sound/ymz280b.h
index 62c80b23ec9..0a8ada2ae5b 100644
--- a/src/devices/sound/ymz280b.h
+++ b/src/devices/sound/ymz280b.h
@@ -23,8 +23,8 @@ public:
// configuration helpers
auto irq_handler() { return m_irq_handler.bind(); }
- DECLARE_READ8_MEMBER( read );
- DECLARE_WRITE8_MEMBER( write );
+ u8 read(offs_t offset);
+ void write(offs_t offset, u8 data);
protected:
// device-level overrides
diff --git a/src/devices/video/315_5124.cpp b/src/devices/video/315_5124.cpp
index ef3b07d1f4f..90b94577376 100644
--- a/src/devices/video/315_5124.cpp
+++ b/src/devices/video/315_5124.cpp
@@ -88,12 +88,12 @@ PAL frame timing
#define BOTTOM_BORDER 4
#define BOTTOM_BLANKING 5
-static constexpr uint8_t ntsc_192[6] = { 3, 13, 27, 192, 24, 3 };
-static constexpr uint8_t ntsc_224[6] = { 3, 13, 11, 224, 8, 3 };
-static constexpr uint8_t ntsc_240[6] = { 3, 13, 3, 240, 0, 3 };
-static constexpr uint8_t pal_192[6] = { 3, 13, 54, 192, 48, 3 };
-static constexpr uint8_t pal_224[6] = { 3, 13, 38, 224, 32, 3 };
-static constexpr uint8_t pal_240[6] = { 3, 13, 30, 240, 24, 3 };
+static constexpr u8 ntsc_192[6] = { 3, 13, 27, 192, 24, 3 };
+static constexpr u8 ntsc_224[6] = { 3, 13, 11, 224, 8, 3 };
+static constexpr u8 ntsc_240[6] = { 3, 13, 3, 240, 0, 3 };
+static constexpr u8 pal_192[6] = { 3, 13, 54, 192, 48, 3 };
+static constexpr u8 pal_224[6] = { 3, 13, 38, 224, 32, 3 };
+static constexpr u8 pal_240[6] = { 3, 13, 30, 240, 24, 3 };
#define VINT_HPOS 0
#define VINT_FLAG_HPOS 1
@@ -104,8 +104,8 @@ static constexpr uint8_t pal_240[6] = { 3, 13, 30, 240, 24, 3 };
#define SPROVR_HPOS 6
#define SPRCOL_BASEHPOS 7
-static constexpr uint8_t line_315_5124[8] = { 24, 24, 26, 28 /* not verified */, 21, 23, 24, 59 };
-static constexpr uint8_t line_315_5377[8] = { 26, 26, 27, 28 /* not verified */, 24, 28, 26, 62 };
+static constexpr u8 line_315_5124[8] = { 24, 24, 26, 28 /* not verified */, 21, 23, 24, 59 };
+static constexpr u8 line_315_5377[8] = { 26, 26, 27, 28 /* not verified */, 24, 28, 26, 62 };
#define DISPLAY_DISABLED_HPOS 24 /* not verified, works if above 18 (for 'pstrike2') and below 25 (for 'fantdizzy') */
#define DISPLAY_CB_HPOS 2 /* fixes 'roadrash' (SMS game) title scrolling, due to line counter reload timing */
@@ -164,20 +164,22 @@ void sega315_5377_device::sega315_5377_palette(palette_device &palette) const
// default address map
void sega315_5124_device::sega315_5124(address_map &map)
{
- map(0x0000, VRAM_SIZE-1).ram();
+ if (!has_configured_map(0))
+ map(0x0000, VRAM_SIZE-1).ram();
}
-sega315_5124_device::sega315_5124_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+sega315_5124_device::sega315_5124_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
: sega315_5124_device(mconfig, SEGA315_5124, tag, owner, clock, SEGA315_5124_CRAM_SIZE, 0x00, 0x0f, 4, 8, line_315_5124)
{
}
-sega315_5124_device::sega315_5124_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock, uint8_t cram_size, uint8_t palette_offset, uint8_t reg_num_mask, int max_sprite_zoom_hcount, int max_sprite_zoom_vcount, const uint8_t *line_timing)
+sega315_5124_device::sega315_5124_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock, u8 cram_size, u8 palette_offset, u8 reg_num_mask, int max_sprite_zoom_hcount, int max_sprite_zoom_vcount, const u8 *line_timing)
: device_t(mconfig, type, tag, owner, clock)
, device_memory_interface(mconfig, *this)
, device_video_interface(mconfig, *this)
+ , device_mixer_interface(mconfig, *this, 2)
, m_cram_size(cram_size)
, m_line_timing(line_timing)
, m_palette_offset(palette_offset)
@@ -188,32 +190,33 @@ sega315_5124_device::sega315_5124_device(const machine_config &mconfig, device_t
, m_int_cb(*this)
, m_csync_cb(*this)
, m_pause_cb(*this)
- , m_space_config("videoram", ENDIANNESS_LITTLE, 8, 14, 0, address_map_constructor(), address_map_constructor(FUNC(sega315_5124_device::sega315_5124), this))
+ , m_space_config("videoram", ENDIANNESS_LITTLE, 8, 14, 0, address_map_constructor(FUNC(sega315_5124_device::sega315_5124), this))
, m_palette(*this, "palette")
+ , m_snsnd(*this, "snsnd")
{
}
-sega315_5246_device::sega315_5246_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+sega315_5246_device::sega315_5246_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
: sega315_5124_device(mconfig, SEGA315_5246, tag, owner, clock, SEGA315_5124_CRAM_SIZE, 0x00, 0x0f, 8, 8, line_315_5124)
{
}
-sega315_5246_device::sega315_5246_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock, uint8_t cram_size, uint8_t palette_offset, uint8_t reg_num_mask, int max_sprite_zoom_hcount, int max_sprite_zoom_vcount, const uint8_t *line_timing)
+sega315_5246_device::sega315_5246_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock, u8 cram_size, u8 palette_offset, u8 reg_num_mask, int max_sprite_zoom_hcount, int max_sprite_zoom_vcount, const u8 *line_timing)
: sega315_5124_device(mconfig, type, tag, owner, clock, cram_size, palette_offset, reg_num_mask, max_sprite_zoom_hcount, max_sprite_zoom_vcount, line_timing)
{
}
// Embedded mode 4 support of the 315-5313 VDP (see 315_5313.cpp), used by Sega Genesis/Mega Drive
-sega315_5313_mode4_device::sega315_5313_mode4_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock, uint8_t cram_size, uint8_t palette_offset, uint8_t reg_num_mask, int max_sprite_zoom_hcount, int max_sprite_zoom_vcount, const uint8_t *line_timing)
+sega315_5313_mode4_device::sega315_5313_mode4_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock, u8 cram_size, u8 palette_offset, u8 reg_num_mask, int max_sprite_zoom_hcount, int max_sprite_zoom_vcount, const u8 *line_timing)
: sega315_5246_device(mconfig, type, tag, owner, clock, cram_size, palette_offset, reg_num_mask, max_sprite_zoom_hcount, max_sprite_zoom_vcount, line_timing)
{
}
-sega315_5377_device::sega315_5377_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+sega315_5377_device::sega315_5377_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
: sega315_5246_device(mconfig, SEGA315_5377, tag, owner, clock, SEGA315_5377_CRAM_SIZE, 0x10, 0x0f, 8, 8, line_315_5377)
{
}
@@ -328,7 +331,7 @@ void sega315_5124_device::set_frame_timing()
}
-READ8_MEMBER( sega315_5124_device::vcount_read )
+u8 sega315_5124_device::vcount_read()
{
const int active_scr_start = m_frame_timing[VERTICAL_SYNC] + m_frame_timing[TOP_BLANKING] + m_frame_timing[TOP_BORDER];
int vpos = screen().vpos();
@@ -344,7 +347,7 @@ READ8_MEMBER( sega315_5124_device::vcount_read )
}
-READ8_MEMBER( sega315_5124_device::hcount_read )
+u8 sega315_5124_device::hcount_read()
{
return m_hcounter;
}
@@ -592,10 +595,10 @@ void sega315_5124_device::process_line_timer()
}
-READ8_MEMBER( sega315_5124_device::data_read )
+u8 sega315_5124_device::data_read()
{
/* Return data buffer contents */
- const uint8_t temp = m_buffer;
+ const u8 temp = m_buffer;
/* Clear pending write flag */
m_pending_control_write = false;
@@ -653,9 +656,9 @@ void sega315_5124_device::check_pending_flags()
}
-READ8_MEMBER( sega315_5124_device::control_read )
+u8 sega315_5124_device::control_read()
{
- uint8_t temp;
+ u8 temp;
check_pending_flags();
temp = m_status;
@@ -667,7 +670,7 @@ READ8_MEMBER( sega315_5124_device::control_read )
/* Clear status flags */
m_hint_occurred = false;
- m_status = uint8_t(~(STATUS_VINT | STATUS_SPROVR | STATUS_SPRCOL));
+ m_status = u8(~(STATUS_VINT | STATUS_SPROVR | STATUS_SPRCOL));
if (m_irq_state == 1)
{
@@ -682,7 +685,7 @@ READ8_MEMBER( sega315_5124_device::control_read )
}
-void sega315_5124_device::write_memory(uint8_t data)
+void sega315_5124_device::write_memory(u8 data)
{
switch (m_addrmode)
{
@@ -702,7 +705,7 @@ void sega315_5124_device::write_memory(uint8_t data)
}
-void sega315_5313_mode4_device::write_memory(uint8_t data)
+void sega315_5313_mode4_device::write_memory(u8 data)
{
switch (m_addrmode)
{
@@ -720,7 +723,7 @@ void sega315_5313_mode4_device::write_memory(uint8_t data)
}
-WRITE8_MEMBER( sega315_5124_device::data_write )
+void sega315_5124_device::data_write(u8 data)
{
/* Clear pending write flag */
m_pending_control_write = false;
@@ -730,7 +733,7 @@ WRITE8_MEMBER( sega315_5124_device::data_write )
}
-void sega315_5124_device::load_vram_addr(uint8_t data)
+void sega315_5124_device::load_vram_addr(u8 data)
{
// Seems like the latched data is passed straight through
// to the address register when in the middle of doing a command.
@@ -742,7 +745,7 @@ void sega315_5124_device::load_vram_addr(uint8_t data)
}
-void sega315_5313_mode4_device::load_vram_addr(uint8_t data)
+void sega315_5313_mode4_device::load_vram_addr(u8 data)
{
if (m_pending_control_write)
m_control_write_data_latch = data;
@@ -751,7 +754,7 @@ void sega315_5313_mode4_device::load_vram_addr(uint8_t data)
}
-WRITE8_MEMBER( sega315_5124_device::control_write )
+void sega315_5124_device::control_write(u8 data)
{
if (!m_pending_control_write)
{
@@ -859,13 +862,13 @@ WRITE8_MEMBER( sega315_5124_device::control_write )
}
-uint16_t sega315_5124_device::name_table_row_mode4(int row)
+u16 sega315_5124_device::name_table_row_mode4(int row)
{
return ((row >> 3) << 6) & (((m_reg[0x02] & 0x01) << 10) | ((m_reg[0x04] & 0x03) << 11) | 0x23ff);
}
-uint16_t sega315_5246_device::name_table_row_mode4(int row)
+u16 sega315_5246_device::name_table_row_mode4(int row)
{
return (row >> 3) << 6;
}
@@ -897,7 +900,7 @@ void sega315_5124_device::draw_leftmost_pixels_mode4(int *line_buffer, int *prio
// Load data of bit plane 1 for the selected tile.
const int tmp_bit_plane_1 = space().read_byte((tile_selected << 5) + ((parse_line & 0x07) << 2) + 0x01);
- const uint8_t pen_bit_1 = BIT(tmp_bit_plane_1, 7 - pixel_x);
+ const u8 pen_bit_1 = BIT(tmp_bit_plane_1, 7 - pixel_x);
for (int pixel_plot_x = 0; pixel_plot_x < fine_x_scroll; pixel_plot_x++)
{
@@ -931,7 +934,7 @@ void sega315_5124_device::draw_scanline_mode4(int *line_buffer, int *priority_se
const int fine_x_scroll = (x_scroll & 0x07);
int scroll_mod;
- uint16_t name_table_address;
+ u16 name_table_address;
if (m_y_pixels != 192)
{
name_table_address = ((m_reg[0x02] & 0x0c) << 10) | 0x0700;
@@ -953,7 +956,7 @@ void sega315_5124_device::draw_scanline_mode4(int *line_buffer, int *priority_se
/* vertical scrolling when bit 7 of reg[0x00] is set */
const int y_scroll = (BIT(m_reg[0x00], 7) && (tile_column > 23)) ? 0 : m_reg9copy;
- const uint16_t tile_data = space().read_word(name_table_address + name_table_row_mode4((line + y_scroll) % scroll_mod) + table_column);
+ const u16 tile_data = space().read_word(name_table_address + name_table_row_mode4((line + y_scroll) % scroll_mod) + table_column);
const int tile_selected = (tile_data & 0x01ff);
const int priority_select = tile_data & PRIORITY_BIT;
@@ -978,12 +981,12 @@ void sega315_5124_device::draw_scanline_mode4(int *line_buffer, int *priority_se
for (int pixel_x = 0; pixel_x < 8; pixel_x++)
{
- const uint8_t pen_bit_0 = BIT(bit_plane_0, 7 - pixel_x);
- const uint8_t pen_bit_1 = BIT(bit_plane_1, 7 - pixel_x);
- const uint8_t pen_bit_2 = BIT(bit_plane_2, 7 - pixel_x);
- const uint8_t pen_bit_3 = BIT(bit_plane_3, 7 - pixel_x);
+ const u8 pen_bit_0 = BIT(bit_plane_0, 7 - pixel_x);
+ const u8 pen_bit_1 = BIT(bit_plane_1, 7 - pixel_x);
+ const u8 pen_bit_2 = BIT(bit_plane_2, 7 - pixel_x);
+ const u8 pen_bit_3 = BIT(bit_plane_3, 7 - pixel_x);
- uint8_t pen_selected = (pen_bit_3 << 3 | pen_bit_2 << 2 | pen_bit_1 << 1 | pen_bit_0);
+ u8 pen_selected = (pen_bit_3 << 3 | pen_bit_2 << 2 | pen_bit_1 << 1 | pen_bit_0);
if (palette_selected)
pen_selected |= 0x10;
@@ -1000,25 +1003,25 @@ void sega315_5124_device::draw_scanline_mode4(int *line_buffer, int *priority_se
}
-uint16_t sega315_5124_device::sprite_attributes_addr_mode4(uint16_t base)
+u16 sega315_5124_device::sprite_attributes_addr_mode4(u16 base)
{
return base & ((BIT(m_reg[0x05], 0) << 7) | 0x3f7f);
}
-uint16_t sega315_5246_device::sprite_attributes_addr_mode4(uint16_t base)
+u16 sega315_5246_device::sprite_attributes_addr_mode4(u16 base)
{
return base;
}
-uint8_t sega315_5124_device::sprite_tile_mask_mode4(uint8_t tile_number)
+u8 sega315_5124_device::sprite_tile_mask_mode4(u8 tile_number)
{
return tile_number & (((m_reg[0x06] & 0x03) << 6) | 0x3f);
}
-uint8_t sega315_5246_device::sprite_tile_mask_mode4(uint8_t tile_number)
+u8 sega315_5246_device::sprite_tile_mask_mode4(u8 tile_number)
{
return tile_number;
}
@@ -1029,7 +1032,7 @@ void sega315_5124_device::sprite_count_overflow(int line, int sprite_index)
/* Overflow is flagged only on active display and when VINT isn't active */
if (!(m_status & STATUS_VINT) && line >= 0 && line < m_frame_timing[ACTIVE_DISPLAY_V])
{
- uint8_t sprite_number_bits;
+ u8 sprite_number_bits;
m_pending_status |= STATUS_SPROVR;
if (sprite_index < 14)
sprite_number_bits = (sprite_index + 1) / 2;
@@ -1096,7 +1099,7 @@ void sega315_5124_device::select_sprites(int line)
{
const int sprite_x = space().read_byte(m_sprite_base + sprite_index + 1);
int sprite_tile_selected = space().read_byte(m_sprite_base + sprite_index + 2);
- const uint8_t flags = space().read_byte(m_sprite_base + sprite_index + 3);
+ const u8 flags = space().read_byte(m_sprite_base + sprite_index + 3);
int sprite_line = parse_line - sprite_y;
@@ -1265,28 +1268,28 @@ void sega315_5124_device::draw_sprites_mode4(int *line_buffer, int *priority_sel
bool sprite_col_occurred = false;
int sprite_col_x = 255;
- uint8_t collision_buffer[256] = { 0 };
+ u8 collision_buffer[256] = { 0 };
// Draw sprite layer
for (int sprite_buffer_index = m_sprite_count - 1; sprite_buffer_index >= 0; sprite_buffer_index--)
{
const int sprite_x = m_sprite_x[sprite_buffer_index];
const int sprite_tile_selected = m_sprite_tile_selected[sprite_buffer_index];
- const uint16_t sprite_pattern_line = m_sprite_pattern_line[sprite_buffer_index];
+ const u16 sprite_pattern_line = m_sprite_pattern_line[sprite_buffer_index];
const int zoom_scale = sprite_buffer_index < m_max_sprite_zoom_hcount ? m_sprite_zoom_scale : 1;
- const uint8_t bit_plane_0 = space().read_byte((sprite_tile_selected << 5) + sprite_pattern_line + 0x00);
- const uint8_t bit_plane_1 = space().read_byte((sprite_tile_selected << 5) + sprite_pattern_line + 0x01);
- const uint8_t bit_plane_2 = space().read_byte((sprite_tile_selected << 5) + sprite_pattern_line + 0x02);
- const uint8_t bit_plane_3 = space().read_byte((sprite_tile_selected << 5) + sprite_pattern_line + 0x03);
+ const u8 bit_plane_0 = space().read_byte((sprite_tile_selected << 5) + sprite_pattern_line + 0x00);
+ const u8 bit_plane_1 = space().read_byte((sprite_tile_selected << 5) + sprite_pattern_line + 0x01);
+ const u8 bit_plane_2 = space().read_byte((sprite_tile_selected << 5) + sprite_pattern_line + 0x02);
+ const u8 bit_plane_3 = space().read_byte((sprite_tile_selected << 5) + sprite_pattern_line + 0x03);
for (int pixel_x = 0; pixel_x < 8; pixel_x++)
{
- const uint8_t pen_bit_0 = BIT(bit_plane_0, 7 - pixel_x);
- const uint8_t pen_bit_1 = BIT(bit_plane_1, 7 - pixel_x);
- const uint8_t pen_bit_2 = BIT(bit_plane_2, 7 - pixel_x);
- const uint8_t pen_bit_3 = BIT(bit_plane_3, 7 - pixel_x);
- const uint8_t pen_selected = (pen_bit_3 << 3 | pen_bit_2 << 2 | pen_bit_1 << 1 | pen_bit_0) | 0x10;
+ const u8 pen_bit_0 = BIT(bit_plane_0, 7 - pixel_x);
+ const u8 pen_bit_1 = BIT(bit_plane_1, 7 - pixel_x);
+ const u8 pen_bit_2 = BIT(bit_plane_2, 7 - pixel_x);
+ const u8 pen_bit_3 = BIT(bit_plane_3, 7 - pixel_x);
+ const u8 pen_selected = (pen_bit_3 << 3 | pen_bit_2 << 2 | pen_bit_1 << 1 | pen_bit_0) | 0x10;
if (pen_selected == 0x10) // Transparent palette so skip draw
continue;
@@ -1352,15 +1355,15 @@ void sega315_5124_device::draw_sprites_tms9918_mode(int *line_buffer, int line)
bool sprite_col_occurred = false;
int sprite_col_x = 255;
- uint8_t collision_buffer[256] = { 0 };
+ u8 collision_buffer[256] = { 0 };
/* Draw sprite layer */
for (int sprite_buffer_index = m_sprite_count - 1; sprite_buffer_index >= 0; sprite_buffer_index--)
{
int sprite_x = m_sprite_x[sprite_buffer_index];
int sprite_tile_selected = m_sprite_tile_selected[sprite_buffer_index];
- const uint16_t sprite_pattern_line = m_sprite_pattern_line[sprite_buffer_index];
- const uint8_t flags = m_sprite_flags[sprite_buffer_index];
+ const u16 sprite_pattern_line = m_sprite_pattern_line[sprite_buffer_index];
+ const u8 flags = m_sprite_flags[sprite_buffer_index];
const int pen_selected = m_palette_offset + (flags & 0x0f);
const int zoom_scale = sprite_buffer_index < m_max_sprite_zoom_hcount ? m_sprite_zoom_scale : 1;
@@ -1375,7 +1378,7 @@ void sega315_5124_device::draw_sprites_tms9918_mode(int *line_buffer, int line)
sprite_x += (zoom_scale > 1 ? 16 : 8);
}
- uint8_t pattern = space().read_byte(sprite_pattern_line + sprite_tile_selected * 8);
+ u8 pattern = space().read_byte(sprite_pattern_line + sprite_tile_selected * 8);
for (int pixel_x = 0; pixel_x < 8; pixel_x++)
{
@@ -1421,23 +1424,23 @@ void sega315_5124_device::draw_sprites_tms9918_mode(int *line_buffer, int line)
// Display mode 2 (Graphics II Mode)
void sega315_5124_device::draw_scanline_mode2(int *line_buffer, int line)
{
- const uint16_t name_table_base = ((m_reg[0x02] & 0x0f) << 10) + ((line >> 3) * 32);
- const uint16_t color_base = ((m_reg[0x03] & 0x80) << 6);
+ const u16 name_table_base = ((m_reg[0x02] & 0x0f) << 10) + ((line >> 3) * 32);
+ const u16 color_base = ((m_reg[0x03] & 0x80) << 6);
const int color_mask = ((m_reg[0x03] & 0x7f) << 3) | 0x07;
- const uint16_t pattern_base = ((m_reg[0x04] & 0x04) << 11);
+ const u16 pattern_base = ((m_reg[0x04] & 0x04) << 11);
const int pattern_mask = ((m_reg[0x04] & 0x03) << 8) | 0xff;
const int pattern_offset = (line & 0xc0) << 2;
/* Draw background layer */
for (int tile_column = 0; tile_column < 32; tile_column++)
{
- const uint8_t name = space().read_byte(name_table_base + tile_column);
- const uint8_t pattern = space().read_byte(pattern_base + (((pattern_offset + name) & pattern_mask) * 8) + (line & 0x07) );
- const uint8_t colors = space().read_byte(color_base + (((pattern_offset + name) & color_mask) * 8) + (line & 0x07) );
+ const u8 name = space().read_byte(name_table_base + tile_column);
+ const u8 pattern = space().read_byte(pattern_base + (((pattern_offset + name) & pattern_mask) * 8) + (line & 0x07) );
+ const u8 colors = space().read_byte(color_base + (((pattern_offset + name) & color_mask) * 8) + (line & 0x07) );
for (int pixel_x = 0; pixel_x < 8; pixel_x++)
{
- uint8_t pen_selected;
+ u8 pen_selected;
const int pixel_plot_x = (tile_column << 3) + pixel_x;
if (BIT(pattern, 7 - pixel_x))
@@ -1462,16 +1465,16 @@ void sega315_5124_device::draw_scanline_mode2(int *line_buffer, int line)
// Display mode 0 (Graphics I Mode)
void sega315_5124_device::draw_scanline_mode0(int *line_buffer, int line)
{
- const uint16_t name_base = ((m_reg[0x02] & 0x0f) << 10) + ((line >> 3) * 32);
- const uint16_t color_base = ((m_reg[0x03] << 6) & (VRAM_SIZE - 1));
- const uint16_t pattern_base = ((m_reg[0x04] << 11) & (VRAM_SIZE - 1));
+ const u16 name_base = ((m_reg[0x02] & 0x0f) << 10) + ((line >> 3) * 32);
+ const u16 color_base = ((m_reg[0x03] << 6) & (VRAM_SIZE - 1));
+ const u16 pattern_base = ((m_reg[0x04] << 11) & (VRAM_SIZE - 1));
/* Draw background layer */
for (int tile_column = 0; tile_column < 32; tile_column++)
{
- const uint8_t name = space().read_byte(name_base + tile_column);
- const uint8_t pattern = space().read_byte(pattern_base + (name << 3) + (line & 0x07));
- const uint8_t colors = space().read_byte(color_base + (name >> 3));
+ const u8 name = space().read_byte(name_base + tile_column);
+ const u8 pattern = space().read_byte(pattern_base + (name << 3) + (line & 0x07));
+ const u8 colors = space().read_byte(color_base + (name >> 3));
for (int pixel_x = 0; pixel_x < 8; pixel_x++)
{
@@ -1496,8 +1499,8 @@ void sega315_5124_device::draw_scanline_mode0(int *line_buffer, int line)
// Display mode 1 (Text Mode)
void sega315_5124_device::draw_scanline_mode1(int *line_buffer, int line)
{
- const uint16_t name_base = ((m_reg[0x02] & 0x0f) << 10) + ((line >> 3) * 32);
- const uint16_t pattern_base = ((m_reg[0x04] << 11) & (VRAM_SIZE - 1));
+ const u16 name_base = ((m_reg[0x02] & 0x0f) << 10) + ((line >> 3) * 32);
+ const u16 pattern_base = ((m_reg[0x04] << 11) & (VRAM_SIZE - 1));
for (int pixel_plot_x = 0; pixel_plot_x < 8; pixel_plot_x++)
{
@@ -1507,8 +1510,8 @@ void sega315_5124_device::draw_scanline_mode1(int *line_buffer, int line)
/* Draw background layer */
for (int tile_column = 0; tile_column < 40; tile_column++)
{
- const uint8_t name = space().read_byte(name_base + tile_column);
- const uint8_t pattern = space().read_byte(pattern_base + (name << 3) + (line & 0x07));
+ const u8 name = space().read_byte(name_base + tile_column);
+ const u8 pattern = space().read_byte(pattern_base + (name << 3) + (line & 0x07));
for (int pixel_x = 0; pixel_x < 6; pixel_x++)
{
@@ -1536,14 +1539,14 @@ void sega315_5124_device::draw_scanline_mode1(int *line_buffer, int line)
// Display mode 3 (Multicolor Mode)
void sega315_5124_device::draw_scanline_mode3(int *line_buffer, int line)
{
- const uint16_t name_base = ((m_reg[0x02] & 0x0f) << 10) + ((line >> 3) * 32);
- const uint16_t pattern_base = ((m_reg[0x04] << 11) & (VRAM_SIZE - 1));
+ const u16 name_base = ((m_reg[0x02] & 0x0f) << 10) + ((line >> 3) * 32);
+ const u16 pattern_base = ((m_reg[0x04] << 11) & (VRAM_SIZE - 1));
/* Draw background layer */
for (int tile_column = 0; tile_column < 32; tile_column++)
{
- const uint8_t name = space().read_byte(name_base + tile_column);
- const uint8_t pattern = space().read_byte(pattern_base + (name << 3) + (((line >> 3) & 3) << 1) + ((line & 4) >> 2));
+ const u8 name = space().read_byte(name_base + tile_column);
+ const u8 pattern = space().read_byte(pattern_base + (name << 3) + (((line >> 3) & 3) << 1) + ((line & 4) >> 2));
for (int pixel_x = 0; pixel_x < 8; pixel_x++)
{
@@ -1635,8 +1638,8 @@ void sega315_5124_device::draw_scanline(int pixel_offset_x, int pixel_plot_y, in
void sega315_5124_device::blit_scanline(int *line_buffer, int *priority_selected, int pixel_offset_x, int pixel_plot_y, int line)
{
- uint32_t *p_bitmap = &m_tmpbitmap.pix32(pixel_plot_y + line, pixel_offset_x);
- uint8_t *p_y1 = &m_y1_bitmap.pix8(pixel_plot_y + line, pixel_offset_x);
+ u32 *p_bitmap = &m_tmpbitmap.pix32(pixel_plot_y + line, pixel_offset_x);
+ u8 *p_y1 = &m_y1_bitmap.pix8(pixel_plot_y + line, pixel_offset_x);
int x = 0;
if (m_vdp_mode == 4 && BIT(m_reg[0x00], 5))
@@ -1667,8 +1670,8 @@ void sega315_5377_device::blit_scanline(int *line_buffer, int *priority_selected
}
else
{
- uint32_t *p_bitmap = &m_tmpbitmap.pix32(pixel_plot_y + line, pixel_offset_x);
- uint8_t *p_y1 = &m_y1_bitmap.pix8(pixel_plot_y + line, pixel_offset_x);
+ u32 *p_bitmap = &m_tmpbitmap.pix32(pixel_plot_y + line, pixel_offset_x);
+ u8 *p_y1 = &m_y1_bitmap.pix8(pixel_plot_y + line, pixel_offset_x);
int x = 0;
/* border on left side of the GG active screen */
@@ -1756,9 +1759,9 @@ void sega315_5377_device::update_palette()
}
-void sega315_5124_device::cram_write(uint8_t data)
+void sega315_5124_device::cram_write(u8 data)
{
- uint16_t address = m_addr & m_cram_mask;
+ u16 address = m_addr & m_cram_mask;
if (data != m_CRAM[address])
{
m_CRAM[address] = data;
@@ -1767,7 +1770,7 @@ void sega315_5124_device::cram_write(uint8_t data)
}
-void sega315_5377_device::cram_write(uint8_t data)
+void sega315_5377_device::cram_write(u8 data)
{
if (m_sega315_5124_compatibility_mode)
{
@@ -1777,7 +1780,7 @@ void sega315_5377_device::cram_write(uint8_t data)
{
if (m_addr & 1)
{
- uint16_t address = (m_addr & m_cram_mask) & ~1;
+ u16 address = (m_addr & m_cram_mask) & ~1;
if (m_buffer != m_CRAM[address] || data != m_CRAM[address + 1])
{
m_CRAM[address] = m_buffer;
@@ -1789,7 +1792,7 @@ void sega315_5377_device::cram_write(uint8_t data)
}
-uint32_t sega315_5124_device::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect)
+u32 sega315_5124_device::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect)
{
copybitmap(bitmap, m_tmpbitmap, 0, 0, 0, 0, cliprect);
return 0;
@@ -1819,7 +1822,7 @@ void sega315_5313_mode4_device::stop_timers()
DEVICE INTERFACE
*****************************************************************************/
-void sega315_5124_device::vdp_postload()
+void sega315_5124_device::device_post_load()
{
set_frame_timing();
}
@@ -1886,8 +1889,6 @@ void sega315_5124_device::device_start()
save_item(NAME(m_max_sprite_zoom_hcount));
save_item(NAME(m_max_sprite_zoom_vcount));
save_item(NAME(m_CRAM));
-
- machine().save().register_postload(save_prepost_delegate(FUNC(sega315_5124_device::vdp_postload), this));
}
@@ -1899,7 +1900,7 @@ void sega315_5124_device::device_reset()
m_reg[0x02] = 0x0e;
m_reg[0x0a] = 0xff;
- m_status = m_pending_status = uint8_t(~(STATUS_VINT | STATUS_SPROVR | STATUS_SPRCOL));
+ m_status = m_pending_status = u8(~(STATUS_VINT | STATUS_SPROVR | STATUS_SPRCOL));
m_pending_sprcol_x = 0;
m_pending_control_write = false;
m_pending_hint = false;
@@ -1934,6 +1935,8 @@ void sega315_5124_device::device_reset()
void sega315_5124_device::device_add_mconfig(machine_config &config)
{
PALETTE(config, m_palette, FUNC(sega315_5124_device::sega315_5124_palette), SEGA315_5124_PALETTE_SIZE);
+
+ SEGAPSG(config, m_snsnd, DERIVED_CLOCK(1, 3)).add_route(ALL_OUTPUTS, *this, 1.0, AUTO_ALLOC_INPUT, 0);
}
void sega315_5377_device::device_reset()
@@ -1949,6 +1952,11 @@ void sega315_5377_device::device_reset()
void sega315_5377_device::device_add_mconfig(machine_config &config)
{
sega315_5246_device::device_add_mconfig(config);
+
m_palette->set_entries(SEGA315_5377_PALETTE_SIZE);
m_palette->set_init(FUNC(sega315_5377_device::sega315_5377_palette));
+
+ GAMEGEAR(config.replace(), m_snsnd, DERIVED_CLOCK(1, 3));
+ m_snsnd->add_route(0, *this, 1.0, AUTO_ALLOC_INPUT, 0);
+ m_snsnd->add_route(1, *this, 1.0, AUTO_ALLOC_INPUT, 1);
}
diff --git a/src/devices/video/315_5124.h b/src/devices/video/315_5124.h
index 3ff7b5165a1..b88cf5c38d7 100644
--- a/src/devices/video/315_5124.h
+++ b/src/devices/video/315_5124.h
@@ -13,6 +13,7 @@
#pragma once
+#include "sound/sn76496.h"
#include "emupal.h"
#include "screen.h"
@@ -28,7 +29,8 @@ DECLARE_DEVICE_TYPE(SEGA315_5377, sega315_5377_device) /* aka Gamegear (2 A
class sega315_5124_device : public device_t,
public device_memory_interface,
- public device_video_interface
+ public device_video_interface,
+ public device_mixer_interface
{
public:
static constexpr unsigned WIDTH = 342; /* 342 pixels */
@@ -51,23 +53,22 @@ public:
// construction/destruction
- sega315_5124_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+ sega315_5124_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
void set_is_pal(bool is_pal) { m_is_pal = is_pal; }
- template <class Object> devcb_base &set_int_callback(Object &&cb) { return m_int_cb.set_callback(std::forward<Object>(cb)); }
- template <class Object> devcb_base &set_csync_callback(Object &&cb) { return m_csync_cb.set_callback(std::forward<Object>(cb)); }
- template <class Object> devcb_base &set_pause_callback(Object &&cb) { return m_pause_cb.set_callback(std::forward<Object>(cb)); }
auto irq() { return m_int_cb.bind(); }
auto csync() { return m_csync_cb.bind(); }
auto pause() { return m_pause_cb.bind(); }
- DECLARE_READ8_MEMBER( data_read );
- DECLARE_WRITE8_MEMBER( data_write );
- DECLARE_READ8_MEMBER( control_read );
- DECLARE_WRITE8_MEMBER( control_write );
- DECLARE_READ8_MEMBER( vcount_read );
- DECLARE_READ8_MEMBER( hcount_read );
+ void psg_w(u8 data) { m_snsnd->write(data); }
+ void psg_stereo_w(u8 data) { m_snsnd->stereo_w(data); }
+ u8 data_read();
+ void data_write(u8 data);
+ u8 control_read();
+ void control_write(u8 data);
+ u8 vcount_read();
+ u8 hcount_read();
void hcount_latch() { hcount_latch_at_hpos(screen().hpos()); };
void hcount_latch_at_hpos(int hpos);
@@ -76,7 +77,7 @@ public:
bitmap_ind8 &get_y1_bitmap() { return m_y1_bitmap; };
/* update the screen */
- uint32_t screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
+ u32 screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
virtual void set_sega315_5124_compatibility_mode(bool sega315_5124_compatibility_mode) { }
@@ -84,9 +85,10 @@ protected:
static constexpr unsigned SEGA315_5377_CRAM_SIZE = 0x40; /* 32 colors x 2 bytes per color = 64 bytes */
static constexpr unsigned SEGA315_5124_CRAM_SIZE = 0x20; /* 32 colors x 1 bytes per color = 32 bytes */
- sega315_5124_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock, uint8_t cram_size, uint8_t palette_offset, uint8_t reg_num_mask, int max_sprite_zoom_hcount, int max_sprite_zoom_vcount, const uint8_t *line_timing);
+ sega315_5124_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock, u8 cram_size, u8 palette_offset, u8 reg_num_mask, int max_sprite_zoom_hcount, int max_sprite_zoom_vcount, const u8 *line_timing);
// device-level overrides
+ virtual void device_post_load() override;
virtual void device_start() override;
virtual void device_reset() override;
virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override;
@@ -101,9 +103,9 @@ protected:
void set_display_settings();
void set_frame_timing();
virtual void update_palette();
- virtual void write_memory(uint8_t data);
- virtual void cram_write(uint8_t data);
- virtual void load_vram_addr(uint8_t data);
+ virtual void write_memory(u8 data);
+ virtual void cram_write(u8 data);
+ virtual void load_vram_addr(u8 data);
virtual void select_display_mode();
virtual void select_extended_res_mode4(bool M1, bool M2, bool M3);
virtual void select_sprites(int line);
@@ -112,9 +114,9 @@ protected:
virtual void draw_scanline(int pixel_offset_x, int pixel_plot_y, int line);
virtual void blit_scanline(int *line_buffer, int *priority_selected, int pixel_offset_x, int pixel_plot_y, int line);
virtual void draw_leftmost_pixels_mode4(int *line_buffer, int *priority_selected, int fine_x_scroll, int palette_selected, int tile_line);
- virtual uint16_t name_table_row_mode4(int row);
- virtual uint16_t sprite_attributes_addr_mode4(uint16_t base);
- virtual uint8_t sprite_tile_mask_mode4(uint8_t tile_number);
+ virtual u16 name_table_row_mode4(int row);
+ virtual u16 sprite_attributes_addr_mode4(u16 base);
+ virtual u8 sprite_tile_mask_mode4(u8 tile_number);
void process_line_timer();
void draw_scanline_mode4(int *line_buffer, int *priority_selected, int line);
void draw_sprites_mode4(int *line_buffer, int *priority_selected, int line);
@@ -125,44 +127,42 @@ protected:
void draw_scanline_mode0(int *line_buffer, int line);
void check_pending_flags();
- void vdp_postload();
-
- uint8_t m_reg[16]; /* All the registers */
- uint8_t m_status; /* Status register */
- uint8_t m_pending_status; /* Pending status flags */
- uint8_t m_reg8copy; /* Internal copy of register 8 (X-Scroll) */
- uint8_t m_reg9copy; /* Internal copy of register 9 (Y-Scroll) */
- uint8_t m_addrmode; /* Type of VDP action */
- uint16_t m_addr; /* Contents of internal VDP address register */
- const uint8_t m_cram_size; /* CRAM size */
- uint8_t m_cram_mask; /* Mask to switch between SMS and GG CRAM sizes */
+ u8 m_reg[16]; /* All the registers */
+ u8 m_status; /* Status register */
+ u8 m_pending_status; /* Pending status flags */
+ u8 m_reg8copy; /* Internal copy of register 8 (X-Scroll) */
+ u8 m_reg9copy; /* Internal copy of register 9 (Y-Scroll) */
+ u8 m_addrmode; /* Type of VDP action */
+ u16 m_addr; /* Contents of internal VDP address register */
+ const u8 m_cram_size; /* CRAM size */
+ u8 m_cram_mask; /* Mask to switch between SMS and GG CRAM sizes */
bool m_cram_dirty; /* Have there been any changes to the CRAM area */
bool m_hint_occurred;
bool m_pending_hint;
bool m_pending_control_write;
int m_pending_sprcol_x;
- uint8_t m_buffer;
- uint8_t m_control_write_data_latch;
+ u8 m_buffer;
+ u8 m_control_write_data_latch;
bool m_sega315_5124_compatibility_mode; /* when true, GG VDP behaves as SMS VDP */
int m_irq_state; /* The status of the IRQ line of the VDP */
int m_vdp_mode; /* Current mode of the VDP: 0,1,2,3,4 */
int m_y_pixels; /* 192, 224, 240 */
int m_draw_time;
- uint8_t m_line_counter;
- uint8_t m_hcounter;
- uint8_t m_CRAM[SEGA315_5377_CRAM_SIZE]; /* CRAM */
- const uint8_t *m_frame_timing;
- const uint8_t *m_line_timing;
+ u8 m_line_counter;
+ u8 m_hcounter;
+ u8 m_CRAM[SEGA315_5377_CRAM_SIZE]; /* CRAM */
+ const u8 *m_frame_timing;
+ const u8 *m_line_timing;
bitmap_rgb32 m_tmpbitmap;
bitmap_ind8 m_y1_bitmap;
- const uint8_t m_palette_offset;
- const uint8_t m_reg_num_mask;
+ const u8 m_palette_offset;
+ const u8 m_reg_num_mask;
bool m_display_disabled;
- uint16_t m_sprite_base;
- uint16_t m_sprite_pattern_line[8];
+ u16 m_sprite_base;
+ u16 m_sprite_pattern_line[8];
int m_sprite_tile_selected[8];
int m_sprite_x[8];
- uint8_t m_sprite_flags[8];
+ u8 m_sprite_flags[8];
int m_sprite_count;
int m_sprite_height;
int m_sprite_zoom_scale;
@@ -195,20 +195,21 @@ protected:
static constexpr device_timer_id TIMER_FLAGS = 7;
required_device<palette_device> m_palette;
+ required_device<sn76496_base_device> m_snsnd;
};
class sega315_5246_device : public sega315_5124_device
{
public:
- sega315_5246_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+ sega315_5246_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
protected:
- sega315_5246_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock, uint8_t cram_size, uint8_t palette_offset, uint8_t reg_num_mask, int max_sprite_zoom_hcount, int max_sprite_zoom_vcount, const uint8_t *line_timing);
+ sega315_5246_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock, u8 cram_size, u8 palette_offset, u8 reg_num_mask, int max_sprite_zoom_hcount, int max_sprite_zoom_vcount, const u8 *line_timing);
- virtual uint16_t name_table_row_mode4(int row) override;
- virtual uint16_t sprite_attributes_addr_mode4(uint16_t base) override;
- virtual uint8_t sprite_tile_mask_mode4(uint8_t tile_number) override;
+ virtual u16 name_table_row_mode4(int row) override;
+ virtual u16 sprite_attributes_addr_mode4(u16 base) override;
+ virtual u8 sprite_tile_mask_mode4(u8 tile_number) override;
virtual void select_extended_res_mode4(bool M1, bool M2, bool M3) override;
};
@@ -216,18 +217,18 @@ protected:
class sega315_5377_device : public sega315_5246_device
{
public:
- sega315_5377_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+ sega315_5377_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
virtual void set_sega315_5124_compatibility_mode(bool sega315_5124_compatibility_mode) override;
protected:
- sega315_5377_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock, uint8_t cram_size, uint8_t palette_offset, uint8_t reg_num_mask, int max_sprite_zoom_hcount, int max_sprite_zoom_vcount, const uint8_t *line_timing);
+ sega315_5377_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock, u8 cram_size, u8 palette_offset, u8 reg_num_mask, int max_sprite_zoom_hcount, int max_sprite_zoom_vcount, const u8 *line_timing);
virtual void device_reset() override;
virtual void device_add_mconfig(machine_config &config) override;
virtual void update_palette() override;
- virtual void cram_write(uint8_t data) override;
+ virtual void cram_write(u8 data) override;
virtual void blit_scanline(int *line_buffer, int *priority_selected, int pixel_offset_x, int pixel_plot_y, int line) override;
private:
@@ -242,10 +243,10 @@ public:
void stop_timers();
protected:
- sega315_5313_mode4_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock, uint8_t cram_size, uint8_t palette_offset, uint8_t reg_num_mask, int max_sprite_zoom_hcount, int max_sprite_zoom_vcount, const uint8_t *line_timing);
+ sega315_5313_mode4_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock, u8 cram_size, u8 palette_offset, u8 reg_num_mask, int max_sprite_zoom_hcount, int max_sprite_zoom_vcount, const u8 *line_timing);
- virtual void write_memory(uint8_t data) override;
- virtual void load_vram_addr(uint8_t data) override;
+ virtual void write_memory(u8 data) override;
+ virtual void load_vram_addr(u8 data) override;
virtual void select_sprites(int line) override;
virtual void sprite_collision(int line, int sprite_col_x) override;
virtual void sprite_count_overflow(int line, int sprite_index) override;
@@ -254,54 +255,4 @@ protected:
virtual void draw_leftmost_pixels_mode4(int *line_buffer, int *priority_selected, int fine_x_scroll, int palette_selected, int tile_line) override;
};
-
-/***************************************************************************
- DEVICE CONFIGURATION MACROS
-***************************************************************************/
-
-#define MCFG_SEGA315_5124_SET_SCREEN MCFG_VIDEO_SET_SCREEN
-
-#define MCFG_SEGA315_5124_IS_PAL(_bool) \
- downcast<sega315_5124_device &>(*device).set_is_pal(_bool);
-
-#define MCFG_SEGA315_5124_INT_CB(_devcb) \
- downcast<sega315_5124_device &>(*device).set_int_callback(DEVCB_##_devcb);
-
-#define MCFG_SEGA315_5124_CSYNC_CB(_devcb) \
- downcast<sega315_5124_device &>(*device).set_csync_callback(DEVCB_##_devcb);
-
-#define MCFG_SEGA315_5124_PAUSE_CB(_devcb) \
- downcast<sega315_5124_device &>(*device).set_pause_callback(DEVCB_##_devcb);
-
-
-#define MCFG_SEGA315_5246_SET_SCREEN MCFG_VIDEO_SET_SCREEN
-
-#define MCFG_SEGA315_5246_IS_PAL(_bool) \
- downcast<sega315_5246_device &>(*device).set_is_pal(_bool);
-
-#define MCFG_SEGA315_5246_INT_CB(_devcb) \
- downcast<sega315_5246_device &>(*device).set_int_callback(DEVCB_##_devcb);
-
-#define MCFG_SEGA315_5246_CSYNC_CB(_devcb) \
- downcast<sega315_5246_device &>(*device).set_csync_callback(DEVCB_##_devcb);
-
-#define MCFG_SEGA315_5246_PAUSE_CB(_devcb) \
- downcast<sega315_5246_device &>(*device).set_pause_callback(DEVCB_##_devcb);
-
-
-#define MCFG_SEGA315_5377_SET_SCREEN MCFG_VIDEO_SET_SCREEN
-
-#define MCFG_SEGA315_5377_IS_PAL(_bool) \
- downcast<sega315_5377_device &>(*device).set_is_pal(_bool);
-
-#define MCFG_SEGA315_5377_INT_CB(_devcb) \
- downcast<sega315_5377_device &>(*device).set_int_callback(DEVCB_##_devcb);
-
-#define MCFG_SEGA315_5377_CSYNC_CB(_devcb) \
- downcast<sega315_5377_device &>(*device).set_csync_callback(DEVCB_##_devcb);
-
-#define MCFG_SEGA315_5377_PAUSE_CB(_devcb) \
- downcast<sega315_5377_device &>(*device).set_pause_callback(DEVCB_##_devcb);
-
-
#endif // MAME_VIDEO_315_5124_H
diff --git a/src/devices/video/315_5313.cpp b/src/devices/video/315_5313.cpp
index 921c7011a29..b56f1349f59 100644
--- a/src/devices/video/315_5313.cpp
+++ b/src/devices/video/315_5313.cpp
@@ -161,7 +161,6 @@ DEFINE_DEVICE_TYPE(SEGA315_5313, sega315_5313_device, "sega315_5313", "Sega 315-
sega315_5313_device::sega315_5313_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
// mode 4 support, for SMS compatibility, is implemented in 315_5124.cpp
: sega315_5313_mode4_device(mconfig, SEGA315_5313, tag, owner, clock, SEGA315_5124_CRAM_SIZE, 0x00, 0x1f, 0, 0, line_315_5313_mode4)
- , device_mixer_interface(mconfig, *this, 2)
, m_render_bitmap(nullptr)
, m_render_line(nullptr)
, m_render_line_raw(nullptr)
@@ -210,7 +209,6 @@ sega315_5313_device::sega315_5313_device(const machine_config &mconfig, const ch
, m_palette_lookup_highlight(nullptr)
, m_space68k(nullptr)
, m_cpu68k(*this, finder_base::DUMMY_TAG)
- , m_snsnd(*this, "snsnd")
{
m_use_alt_timing = 0;
m_palwrite_base = -1;
@@ -227,7 +225,7 @@ void sega315_5313_device::device_add_mconfig(machine_config &config)
m_palette->set_entries(0x200); // more entries for 32X - not really the cleanest way to do this
- SEGAPSG(config, m_snsnd, DERIVED_CLOCK(1, 15)).add_route(ALL_OUTPUTS, *this, 0.5, AUTO_ALLOC_INPUT, 0);
+ SEGAPSG(config.replace(), m_snsnd, DERIVED_CLOCK(1, 15)).add_route(ALL_OUTPUTS, *this, 0.5, AUTO_ALLOC_INPUT, 0);
}
TIMER_CALLBACK_MEMBER(sega315_5313_device::irq6_on_timer_callback)
@@ -968,9 +966,9 @@ WRITE16_MEMBER( sega315_5313_device::vdp_w )
case 0x16:
{
// accessed by either segapsg_device or sn76496_device
- if (m_snsnd && ACCESSING_BITS_0_7)
- m_snsnd->write(data & 0xff);
- //if (m_snsnd && ACCESSING_BITS_8_15) sn->write((data>>8) & 0xff);
+ if (ACCESSING_BITS_0_7)
+ psg_w(data & 0xff);
+ //if (ACCESSING_BITS_8_15) psg_w((data>>8) & 0xff);
break;
}
diff --git a/src/devices/video/315_5313.h b/src/devices/video/315_5313.h
index f2aae550f8b..28d1d995d97 100644
--- a/src/devices/video/315_5313.h
+++ b/src/devices/video/315_5313.h
@@ -9,49 +9,9 @@
#include "video/315_5124.h"
#include "cpu/m68000/m68000.h"
#include "machine/timer.h"
-#include "sound/sn76496.h"
-#define MCFG_SEGA315_5313_IS_PAL(_bool) \
- downcast<sega315_5313_device &>(*device).set_is_pal(_bool);
-
-#define MCFG_SEGA315_5313_INT_CB(_devcb) \
- downcast<sega315_5313_device &>(*device).set_int_callback(DEVCB_##_devcb);
-
-#define MCFG_SEGA315_5313_PAUSE_CB(_devcb) \
- downcast<sega315_5313_device &>(*device).set_pause_callback(DEVCB_##_devcb);
-
-#define MCFG_SEGA315_5313_SND_IRQ_CALLBACK(_write) \
- downcast<sega315_5313_device &>(*device).set_sndirqline_callback(DEVCB_##_write);
-
-#define MCFG_SEGA315_5313_LV6_IRQ_CALLBACK(_write) \
- downcast<sega315_5313_device &>(*device).set_lv6irqline_callback(DEVCB_##_write);
-
-#define MCFG_SEGA315_5313_LV4_IRQ_CALLBACK(_write) \
- downcast<sega315_5313_device &>(*device).set_lv4irqline_callback(DEVCB_##_write);
-
-#define MCFG_SEGA315_5313_ALT_TIMING(_data) \
- downcast<sega315_5313_device &>(*device).set_alt_timing(_data);
-
-#define MCFG_SEGA315_5313_PAL_WRITE_BASE(_data) \
- downcast<sega315_5313_device &>(*device).set_pal_write_base(_data);
-
-#define MCFG_SEGA315_5313_PALETTE(_palette_tag) \
- downcast<sega315_5313_device &>(*device).set_palette(_palette_tag);
-
-
-// Temporary solution while 32x VDP mixing and scanline interrupting is moved outside MD VDP
-#define MCFG_SEGA315_5313_32X_SCANLINE_CB(_class, _method) \
- downcast<sega315_5313_device &>(*device).set_md_32x_scanline(sega315_5313_device::md_32x_scanline_delegate(&_class::_method, #_class "::" #_method, this));
-
-#define MCFG_SEGA315_5313_32X_INTERRUPT_CB(_class, _method) \
- downcast<sega315_5313_device &>(*device).set_md_32x_interrupt(sega315_5313_device::md_32x_interrupt_delegate(&_class::_method, #_class "::" #_method, this));
-
-#define MCFG_SEGA315_5313_32X_SCANLINE_HELPER_CB(_class, _method) \
- downcast<sega315_5313_device &>(*device).set_md_32x_scanline_helper(sega315_5313_device::md_32x_scanline_helper_delegate(&_class::_method, #_class "::" #_method, this));
-
-
-class sega315_5313_device : public sega315_5313_mode4_device, public device_mixer_interface
+class sega315_5313_device : public sega315_5313_mode4_device
{
public:
template <typename T>
@@ -67,9 +27,6 @@ public:
typedef device_delegate<void (int scanline, int irq6)> md_32x_interrupt_delegate;
typedef device_delegate<void (int scanline)> md_32x_scanline_helper_delegate;
- template <class Object> devcb_base &set_sndirqline_callback(Object &&cb) { return m_sndirqline_callback.set_callback(std::forward<Object>(cb)); }
- template <class Object> devcb_base &set_lv6irqline_callback(Object &&cb) { return m_lv6irqline_callback.set_callback(std::forward<Object>(cb)); }
- template <class Object> devcb_base &set_lv4irqline_callback(Object &&cb) { return m_lv4irqline_callback.set_callback(std::forward<Object>(cb)); }
auto snd_irq() { return m_sndirqline_callback.bind(); }
auto lv6_irq() { return m_lv6irqline_callback.bind(); }
auto lv4_irq() { return m_lv4irqline_callback.bind(); }
@@ -78,9 +35,10 @@ public:
void set_pal_write_base(int palwrite_base) { m_palwrite_base = palwrite_base; }
template <typename T> void set_palette(T &&tag) { m_palette.set_tag(std::forward<T>(tag)); }
- template <typename Object> void set_md_32x_scanline(Object &&cb) { m_32x_scanline_func = std::forward<Object>(cb); }
- template <typename Object> void set_md_32x_interrupt(Object &&cb) { m_32x_interrupt_func = std::forward<Object>(cb); }
- template <typename Object> void set_md_32x_scanline_helper(Object &&cb) { m_32x_scanline_helper_func = std::forward<Object>(cb); }
+ // Temporary solution while 32x VDP mixing and scanline interrupting is moved outside MD VDP
+ template <typename... T> void set_md_32x_scanline(T &&... args) { m_32x_scanline_func = md_32x_scanline_delegate(std::forward<T>(args)...); }
+ template <typename... T> void set_md_32x_interrupt(T &&... args) { m_32x_interrupt_func = md_32x_interrupt_delegate(std::forward<T>(args)...); }
+ template <typename... T> void set_md_32x_scanline_helper(T &&... args) { m_32x_scanline_helper_func = md_32x_scanline_helper_delegate(std::forward<T>(args)...); }
int m_use_alt_timing; // use MAME scanline timer instead, render only one scanline to a single line buffer, to be rendered by a partial update call.. experimental
@@ -228,7 +186,6 @@ private:
address_space *m_space68k;
required_device<m68000_base_device> m_cpu68k;
- required_device<sn76496_base_device> m_snsnd;
};
diff --git a/src/devices/video/cdp1862.cpp b/src/devices/video/cdp1862.cpp
index 78985db211c..ba4375c54de 100644
--- a/src/devices/video/cdp1862.cpp
+++ b/src/devices/video/cdp1862.cpp
@@ -126,7 +126,7 @@ void cdp1862_device::device_reset()
// dma_w -
//-------------------------------------------------
-WRITE8_MEMBER( cdp1862_device::dma_w )
+void cdp1862_device::dma_w(uint8_t data)
{
int rd = 1, bd = 1, gd = 1;
int sx = screen().hpos() + 4;
diff --git a/src/devices/video/cdp1862.h b/src/devices/video/cdp1862.h
index 0ee90fa3bd6..8ab9716642b 100644
--- a/src/devices/video/cdp1862.h
+++ b/src/devices/video/cdp1862.h
@@ -49,7 +49,7 @@ public:
void set_luminance(double r, double b, double g, double bkg) { m_lum_r = r; m_lum_b = b; m_lum_g = g; m_lum_bkg = bkg; }
void set_chrominance(double r, double b, double g, double bkg) { m_chr_r = r; m_chr_b = b; m_chr_g = g; m_chr_bkg = bkg; }
- DECLARE_WRITE8_MEMBER( dma_w );
+ void dma_w(uint8_t data);
DECLARE_WRITE_LINE_MEMBER( bkg_w );
DECLARE_WRITE_LINE_MEMBER( con_w );
diff --git a/src/devices/video/cesblit.h b/src/devices/video/cesblit.h
index f22f16df260..d535921ef6b 100644
--- a/src/devices/video/cesblit.h
+++ b/src/devices/video/cesblit.h
@@ -11,21 +11,6 @@
#pragma once
-/***************************************************************************
- INTERFACE CONFIGURATION MACROS
-***************************************************************************/
-
-#define MCFG_CESBLIT_ADD(_tag, _screen, _clock) \
- MCFG_DEVICE_ADD(_tag, CESBLIT, _clock) \
- MCFG_VIDEO_SET_SCREEN(_screen)
-
-#define MCFG_CESBLIT_MAP MCFG_DEVICE_PROGRAM_MAP
-
-#define MCFG_CESBLIT_COMPUTE_ADDR(_compute_addr) \
- downcast<cesblit_device &>(*device).set_compute_addr(_compute_addr);
-
-#define MCFG_CESBLIT_IRQ_CB(_devcb) \
- downcast<cesblit_device &>(*device).set_irq_callback(DEVCB_##_devcb);
/***************************************************************************
TYPE DEFINITIONS
@@ -41,11 +26,18 @@ public:
typedef int (*compute_addr_t) (uint16_t reg_low, uint16_t reg_mid, uint16_t reg_high);
// construction/destruction
+ template <typename T>
+ cesblit_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock, T &&screen_tag)
+ : cesblit_device(mconfig, tag, owner, clock)
+ {
+ set_screen(std::forward<T>(screen_tag));
+ }
+
cesblit_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
// configuration
void set_compute_addr(compute_addr_t compute_addr) { m_compute_addr = compute_addr; }
- template <class Object> devcb_base &set_irq_callback(Object &&cb) { return m_blit_irq_cb.set_callback(std::forward<Object>(cb)); }
+ auto irq_callback() { return m_blit_irq_cb.bind(); }
DECLARE_WRITE16_MEMBER(color_w);
DECLARE_WRITE16_MEMBER(addr_hi_w);
diff --git a/src/devices/video/crt9007.cpp b/src/devices/video/crt9007.cpp
index 40279d1316a..ff3893a4ca6 100644
--- a/src/devices/video/crt9007.cpp
+++ b/src/devices/video/crt9007.cpp
@@ -222,7 +222,8 @@ const int STATUS_LIGHT_PEN_UPDATE = 0x20;
// default address map
void crt9007_device::crt9007(address_map &map)
{
- map(0x0000, 0x3fff).ram();
+ if (!has_configured_map(0))
+ map(0x0000, 0x3fff).ram();
}
@@ -456,7 +457,7 @@ crt9007_device::crt9007_device(const machine_config &mconfig, const char *tag, d
device_t(mconfig, CRT9007, tag, owner, clock),
device_memory_interface(mconfig, *this),
device_video_interface(mconfig, *this),
- m_space_config("videoram", ENDIANNESS_LITTLE, 8, 14, 0, address_map_constructor(), address_map_constructor(FUNC(crt9007_device::crt9007), this)),
+ m_space_config("videoram", ENDIANNESS_LITTLE, 8, 14, 0, address_map_constructor(FUNC(crt9007_device::crt9007), this)),
m_write_int(*this),
m_write_dmar(*this),
m_write_hs(*this),
diff --git a/src/devices/video/crt9021.h b/src/devices/video/crt9021.h
index 2a7e513fdf2..65de1032a64 100644
--- a/src/devices/video/crt9021.h
+++ b/src/devices/video/crt9021.h
@@ -38,10 +38,6 @@
#define CRT9021_DRAW_CHARACTER_MEMBER(_name) void _name(bitmap_rgb32 &bitmap, int y, int x, uint8_t video, int intout)
-#define MCFG_CRT9021_DRAW_CHARACTER_CALLBACK_OWNER(_class, _method) \
- downcast<crt9021_device &>(*device).set_display_callback(crt9021_device::draw_character_delegate(&_class::_method, #_class "::" #_method, this));
-
-
//**************************************************************************
// TYPE DEFINITIONS
//**************************************************************************
@@ -57,7 +53,7 @@ public:
// construction/destruction
crt9021_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- template <typename Object> void set_display_callback(Object &&cb) { m_display_cb = std::forward<Object>(cb); }
+ template <typename... T> void set_display_callback(T &&... args) { m_display_cb = draw_character_delegate(std::forward<T>(args)...); }
void write(uint8_t data) { m_data = data; }
DECLARE_WRITE8_MEMBER( write ) { write(data); }
diff --git a/src/devices/video/crt9028.cpp b/src/devices/video/crt9028.cpp
new file mode 100644
index 00000000000..31c0c748420
--- /dev/null
+++ b/src/devices/video/crt9028.cpp
@@ -0,0 +1,371 @@
+// license:BSD-3-Clause
+// copyright-holders:AJR
+/**********************************************************************
+
+ Standard Microsystems CRT9028/9128 Video Terminal Logic Controller
+
+ The CRT 9028 and CRT 9128 are single-chip terminal-oriented video
+ processors. The two differ from each other in their bus protocol
+ for accessing the address, data and status registers: the 9028 has
+ separate RD and WR strobes for an 8051 or similar microcontroller,
+ while the 9128 replaces these with DS and R/W inputs that are more
+ Z8-oriented. A separate address/data bus connects to a 2Kx8 static
+ RAM or similar as display memory.
+
+ The internal 128-character set is mask-programmed, as are all
+ screen timings, with alternate vertical timings to allow operation
+ at either 60 Hz or 50 Hz. Mask parameters also determine the
+ polarity of the sync signals, the positioning of the underline
+ attribute and cursor and the dot patterns used for 6-segment wide
+ (block) graphics and 4-segment thin (line) graphics.
+
+ TODO: implement timing and display functions
+
+**********************************************************************/
+
+#include "emu.h"
+#include "video/crt9028.h"
+#include "screen.h"
+
+//**************************************************************************
+// GLOBAL VARIABLES
+//**************************************************************************
+
+// device type definition
+DEFINE_DEVICE_TYPE(CRT9028_000, crt9028_000_device, "crt9028_000", "CRT9028-000 VTLC")
+
+//**************************************************************************
+// DEVICE IMPLEMENTATION
+//**************************************************************************
+
+//-------------------------------------------------
+// crt9028_device - constructor
+//-------------------------------------------------
+
+crt9028_device::crt9028_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock,
+ int dots_per_char, int chars_per_row, int horiz_blanking, int hsync_delay, int hsync_width, bool hsync_active,
+ int char_rows, int scans_per_char, bool vsync_active,
+ int vert_blanking, int vsync_delay, bool vsync_width,
+ int alt_vert_blanking, int alt_vsync_delay, bool alt_vsync_width,
+ int csync_delay, int csync_width, int underline,
+ u16 wide_gfx_seg1_4, u16 wide_gfx_seg2_5, u16 wide_gfx_seg3_6, u8 wide_gfx_pattern,
+ u16 thin_gfx_seg1, u16 thin_gfx_seg2, u16 thin_gfx_seg3, u16 thin_gfx_seg4,
+ u8 thin_gfx_dots1, u8 thin_gfx_dots2, u8 thin_gfx_dots3, u8 thin_gfx_dots4)
+ : device_t(mconfig, type, tag, owner, clock)
+ , device_memory_interface(mconfig, *this)
+ , device_video_interface(mconfig, *this)
+ , m_space_config("charram", ENDIANNESS_LITTLE, 8, 11, 0)
+ , m_charset(*this, "charset")
+ , m_hsync_callback(*this)
+ , m_vsync_callback(*this)
+ , m_dots_per_char(dots_per_char)
+ , m_chars_per_row(chars_per_row)
+ , m_horiz_blanking(horiz_blanking)
+ , m_hsync_delay(hsync_delay)
+ , m_hsync_width(hsync_width)
+ , m_hsync_active(hsync_active)
+ , m_char_rows(char_rows)
+ , m_scans_per_char(scans_per_char)
+ , m_vsync_active(vsync_active)
+ , m_vert_blanking{vert_blanking, alt_vert_blanking}
+ , m_vsync_delay{vsync_delay, alt_vsync_delay}
+ , m_vsync_width{vsync_width, alt_vsync_width}
+ , m_csync_delay(csync_delay)
+ , m_csync_width(csync_width)
+ , m_underline(underline)
+ , m_wide_gfx_seg{wide_gfx_seg1_4, wide_gfx_seg2_5, wide_gfx_seg3_6}
+ , m_wide_gfx_pattern(wide_gfx_pattern)
+ , m_thin_gfx_seg{thin_gfx_seg1, thin_gfx_seg2, thin_gfx_seg3, thin_gfx_seg4}
+ , m_thin_gfx_dots{thin_gfx_dots1, thin_gfx_dots2, thin_gfx_dots3, thin_gfx_dots4}
+ , m_address_register(0)
+{
+ // Mostly unused now
+ (void)m_hsync_delay;
+ (void)m_hsync_width;
+ (void)m_hsync_active;
+ (void)m_vsync_active;
+ (void)m_vsync_delay;
+ (void)m_vsync_width;
+ (void)m_csync_delay;
+ (void)m_csync_width;
+ (void)m_underline;
+ (void)m_wide_gfx_seg;
+ (void)m_wide_gfx_pattern;
+ (void)m_thin_gfx_seg;
+ (void)m_thin_gfx_dots;
+}
+
+
+//-------------------------------------------------
+// crt9028_000_device - constructor
+//-------------------------------------------------
+
+crt9028_000_device::crt9028_000_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
+ : crt9028_device(mconfig, CRT9028_000, tag, owner, clock,
+ 7, 80, 20, 4, 8, false,
+ 24, 10, false,
+ 20, 4, 8,
+ 72, 30, 10,
+ 2, 8, 9,
+ 0x3c0, 0x038, 0x007, 0x0f,
+ 0x3e0, 0x020, 0x03f, 0x020,
+ 0x10, 0xff, 0x10, 0xff)
+{
+}
+
+
+//-------------------------------------------------
+// device_config_complete - finalise device
+// configuration
+//-------------------------------------------------
+
+void crt9028_device::device_config_complete()
+{
+ if (!has_screen())
+ return;
+
+ if (screen().refresh_attoseconds() == 0)
+ {
+ int visible_scan_lines = m_char_rows * m_scans_per_char;
+ screen().set_raw(clock(), m_dots_per_char * (m_chars_per_row + m_horiz_blanking), 0, m_dots_per_char * m_chars_per_row,
+ visible_scan_lines + m_vert_blanking[0], 0, visible_scan_lines);
+ }
+
+ if (!screen().has_screen_update())
+ screen().set_screen_update(screen_update_rgb32_delegate(FUNC(crt9028_device::screen_update), this));
+}
+
+
+//-------------------------------------------------
+// memory_space_config - return the configuration
+// for the address spaces
+//-------------------------------------------------
+
+device_memory_interface::space_config_vector crt9028_device::memory_space_config() const
+{
+ return space_config_vector{std::make_pair(0, &m_space_config)};
+}
+
+
+//-------------------------------------------------
+// device_resolve_objects - resolve objects that
+// may be needed for other devices to set
+// initial conditions at start time
+//-------------------------------------------------
+
+void crt9028_device::device_resolve_objects()
+{
+ m_hsync_callback.resolve_safe();
+ m_vsync_callback.resolve_safe();
+}
+
+
+//-------------------------------------------------
+// device_start - device-specific startup
+//-------------------------------------------------
+
+void crt9028_device::device_start()
+{
+ m_space = &space(0);
+
+ save_item(NAME(m_address_register));
+}
+
+
+//-------------------------------------------------
+// screen_update - screen update method
+//-------------------------------------------------
+
+u32 crt9028_device::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect)
+{
+ return 0;
+}
+
+
+//-------------------------------------------------
+// chip_reset - software reset command
+//-------------------------------------------------
+
+void crt9028_device::chip_reset()
+{
+ logerror("%s: Chip reset\n", machine().describe_context());
+}
+
+
+//-------------------------------------------------
+// status_r - read status register
+//-------------------------------------------------
+
+u8 crt9028_device::status_r()
+{
+ return 0x80;
+}
+
+
+//-------------------------------------------------
+// filadd_w - set fill address register
+//-------------------------------------------------
+
+void crt9028_device::filadd_w(u8 data)
+{
+ logerror("%s: Fill address = %03X\n", machine().describe_context(), data << 4);
+}
+
+
+//-------------------------------------------------
+// tosadd_w - set top of screen address register
+//-------------------------------------------------
+
+void crt9028_device::tosadd_w(u8 data)
+{
+ logerror("%s: Top of screen address = %03X\n", machine().describe_context(), data << 4);
+}
+
+
+//-------------------------------------------------
+// curlo_w - set cursor low register
+//-------------------------------------------------
+
+void crt9028_device::curlo_w(u8 data)
+{
+ logerror("%s: Cursor low = %02X\n", machine().describe_context(), data);
+}
+
+
+//-------------------------------------------------
+// curhi_w - set cursor high/scroll register
+//-------------------------------------------------
+
+void crt9028_device::curhi_w(u8 data)
+{
+ logerror("%s: Cursor high = %02X\n", machine().describe_context(), data);
+}
+
+
+//-------------------------------------------------
+// attdat_w - set attribute data register
+//-------------------------------------------------
+
+void crt9028_device::attdat_w(u8 data)
+{
+ logerror("%s: Attribute data = %02X\n", machine().describe_context(), data);
+}
+
+
+//-------------------------------------------------
+// mode_w - set mode register
+//-------------------------------------------------
+
+void crt9028_device::mode_w(u8 data)
+{
+ logerror("%s: Auto increment %sabled\n", machine().describe_context(), BIT(data, 7) ? "en" : "dis");
+}
+
+
+//-------------------------------------------------
+// character_r - read character from memory
+//-------------------------------------------------
+
+u8 crt9028_device::character_r()
+{
+ return 0;
+}
+
+
+//-------------------------------------------------
+// character_w - write character to memory
+//-------------------------------------------------
+
+void crt9028_device::character_w(u8 data)
+{
+ logerror("%s: Character = %02X\n", machine().describe_context(), data);
+}
+
+
+//-------------------------------------------------
+// read - read from data or status register
+//-------------------------------------------------
+
+u8 crt9028_device::read(offs_t offset)
+{
+ if (BIT(offset, 0))
+ return status_r();
+ else if (m_address_register == 0xe)
+ return character_r();
+ else
+ {
+ if (!machine().side_effects_disabled())
+ logerror("Read from unknown or write-only register %X\n", m_address_register);
+ return 0;
+ }
+}
+
+
+//-------------------------------------------------
+// write - write to data or address register
+//-------------------------------------------------
+
+void crt9028_device::write(offs_t offset, u8 data)
+{
+ if (BIT(offset, 0))
+ m_address_register = data & 0x0f;
+ else switch (m_address_register)
+ {
+ case 0x6:
+ chip_reset();
+ break;
+
+ case 0x8:
+ tosadd_w(data);
+ break;
+
+ case 0x9:
+ curlo_w(data);
+ break;
+
+ case 0xa:
+ curhi_w(data);
+ break;
+
+ case 0xb:
+ filadd_w(data);
+ break;
+
+ case 0xc:
+ attdat_w(data);
+ break;
+
+ case 0xd:
+ character_w(data);
+ break;
+
+ case 0xe:
+ mode_w(data);
+ break;
+
+ default:
+ logerror("%s: Unknown register %X = %02X\n", machine().describe_context(), m_address_register, data);
+ break;
+ }
+}
+
+
+//**************************************************************************
+// INTERNAL ROM
+//**************************************************************************
+
+ROM_START(crt9028_000)
+ ROM_REGION(0x400, "charset", 0)
+ ROM_LOAD("crt9028_000.bin", 0x000, 0x400, NO_DUMP)
+ROM_END
+
+
+//-------------------------------------------------
+// rom_region - return a pointer to the implicit
+// rom region description for this device
+//-------------------------------------------------
+
+const tiny_rom_entry *crt9028_000_device::device_rom_region() const
+{
+ return ROM_NAME(crt9028_000);
+}
diff --git a/src/devices/video/crt9028.h b/src/devices/video/crt9028.h
new file mode 100644
index 00000000000..f0696519ed9
--- /dev/null
+++ b/src/devices/video/crt9028.h
@@ -0,0 +1,142 @@
+// license:BSD-3-Clause
+// copyright-holders:AJR
+/**********************************************************************
+
+ Standard Microsystems CRT9028/9128 Video Terminal Logic Controller
+
+***********************************************************************
+ _____ _____
+ DA8 1 |* \__/ | 40 DA7
+ DA9 2 | | 39 DA6
+ DA10 3 | | 38 DA5
+ GND 4 | | 37 DA4
+ XTAL2 5 | | 36 DA3
+ XTAL1 6 | | 35 DA2
+ /VIDEO 7 | | 34 DA1
+ INTOUT 8 | | 33 DA0
+ /DWR 9 | | 32 DB7
+ DD0 10 | CRT 9028 | 31 DB6
+ DD1 11 | CRT 9128 | 30 DB5
+ DD2 12 | | 29 DB4
+ DD3 13 | | 28 DB3
+ DD4 14 | | 27 DB2
+ DD5 15 | | 26 DB1
+ DD6 16 | | 25 DB0
+ DD7 17 | | 24 A/D
+ HSYNC 18 | | 23 /RD or /DS
+ VSYNC 19 | | 22 /WR or R/W
+ CSYNC 20 |______________| 21 VCC
+
+**********************************************************************/
+
+#ifndef MAME_VIDEO_CRT9028_H
+#define MAME_VIDEO_CRT9028_H
+
+#pragma once
+
+//**************************************************************************
+// TYPE DEFINITIONS
+//**************************************************************************
+
+// ======================> crt9028_device
+
+class crt9028_device : public device_t, public device_memory_interface, public device_video_interface
+{
+public:
+ // device configuration
+ auto hsync_callback() { return m_hsync_callback.bind(); }
+ auto vsync_callback() { return m_hsync_callback.bind(); }
+
+ // read/write handlers
+ u8 read(offs_t offset);
+ void write(offs_t offset, u8 data);
+
+ // screen update method
+ u32 screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
+
+protected:
+ // base type constructor
+ crt9028_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock,
+ int dots_per_char, int chars_per_row, int horiz_blanking, int hsync_delay, int hsync_width, bool hsync_active,
+ int char_rows, int scans_per_char, bool vsync_active,
+ int vert_blanking, int vsync_delay, bool vsync_width,
+ int alt_vert_blanking, int alt_vsync_delay, bool alt_vsync_width,
+ int csync_delay, int csync_width, int underline,
+ u16 wide_gfx_seg1_4, u16 wide_gfx_seg2_5, u16 wide_gfx_seg3_6, u8 wide_gfx_pattern,
+ u16 thin_gfx_seg1, u16 thin_gfx_seg2, u16 thin_gfx_seg3, u16 thin_gfx_seg4,
+ u8 thin_gfx_dots1, u8 thin_gfx_dots2, u8 thin_gfx_dots3, u8 thin_gfx_dots4);
+
+ // device-specific overrides
+ virtual void device_config_complete() override;
+ virtual void device_resolve_objects() override;
+ virtual void device_start() override;
+
+ // device_memory_interface overrides
+ virtual space_config_vector memory_space_config() const override;
+
+private:
+ // register helpers
+ void chip_reset();
+ u8 status_r();
+ void filadd_w(u8 data);
+ void tosadd_w(u8 data);
+ void curlo_w(u8 data);
+ void curhi_w(u8 data);
+ void attdat_w(u8 data);
+ void mode_w(u8 data);
+ u8 character_r();
+ void character_w(u8 data);
+
+ // address space for display memory
+ const address_space_config m_space_config;
+ address_space *m_space;
+
+ // internal character set
+ required_region_ptr<u8> m_charset;
+
+ // timing callbacks
+ devcb_write_line m_hsync_callback;
+ devcb_write_line m_vsync_callback;
+
+ // mask parameters
+ const int m_dots_per_char;
+ const int m_chars_per_row;
+ const int m_horiz_blanking;
+ const int m_hsync_delay;
+ const int m_hsync_width;
+ const bool m_hsync_active;
+ const int m_char_rows;
+ const int m_scans_per_char;
+ const bool m_vsync_active;
+ const int m_vert_blanking[2];
+ const int m_vsync_delay[2];
+ const int m_vsync_width[2];
+ const int m_csync_delay;
+ const int m_csync_width;
+ const int m_underline;
+ const u16 m_wide_gfx_seg[3];
+ const u8 m_wide_gfx_pattern;
+ const u16 m_thin_gfx_seg[4];
+ const u8 m_thin_gfx_dots[4];
+
+ // internal state
+ u8 m_address_register;
+};
+
+// ======================> crt9028_000_device
+
+class crt9028_000_device : public crt9028_device
+{
+public:
+ // device constructor
+ crt9028_000_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
+
+protected:
+ // device-specific overrides
+ virtual const tiny_rom_entry *device_rom_region() const override;
+};
+
+// device type declarations
+DECLARE_DEVICE_TYPE(CRT9028_000, crt9028_000_device)
+
+#endif // MAME_VIDEO_CRT9028_H
diff --git a/src/devices/video/crtc_ega.cpp b/src/devices/video/crtc_ega.cpp
index 01ee629ad43..7d03b09f131 100644
--- a/src/devices/video/crtc_ega.cpp
+++ b/src/devices/video/crtc_ega.cpp
@@ -51,13 +51,13 @@ void crtc_ega_device::device_post_load()
}
-WRITE8_MEMBER( crtc_ega_device::address_w )
+void crtc_ega_device::address_w(uint8_t data)
{
m_register_address_latch = data & 0x1f;
}
-READ8_MEMBER( crtc_ega_device::register_r )
+uint8_t crtc_ega_device::register_r()
{
uint8_t ret = 0;
@@ -78,7 +78,7 @@ READ8_MEMBER( crtc_ega_device::register_r )
}
-WRITE8_MEMBER( crtc_ega_device::register_w )
+void crtc_ega_device::register_w(uint8_t data)
{
LOG("%s CRTC_EGA: reg 0x%02x = 0x%02x\n", machine().describe_context(), m_register_address_latch, data);
diff --git a/src/devices/video/crtc_ega.h b/src/devices/video/crtc_ega.h
index e995cdf8a30..9d03177b494 100644
--- a/src/devices/video/crtc_ega.h
+++ b/src/devices/video/crtc_ega.h
@@ -17,34 +17,6 @@
#define CRTC_EGA_END_UPDATE(_name) void _name(bitmap_ind16 &bitmap, const rectangle &cliprect)
-
-#define MCFG_CRTC_EGA_SET_SCREEN MCFG_VIDEO_SET_SCREEN
-
-#define MCFG_CRTC_EGA_BEGIN_UPDATE_CB(_class, _method) \
- downcast<crtc_ega_device &>(*device).set_begin_update_callback(crtc_ega_device::begin_update_delegate(&_class::_method, #_class "::" #_method, this));
-
-#define MCFG_CRTC_EGA_ROW_UPDATE_CB(_class, _method) \
- downcast<crtc_ega_device &>(*device).set_row_update_callback(crtc_ega_device::row_update_delegate(&_class::_method, #_class "::" #_method, this));
-
-#define MCFG_CRTC_EGA_END_UPDATE_CB(_class, _method) \
- downcast<crtc_ega_device &>(*device).set_end_update_callback(crtc_ega_device::end_update_delegate(&_class::_method, #_class "::" #_method, this));
-
-#define MCFG_CRTC_EGA_HPIXELS_PER_COLUMN(_pix) \
- downcast<crtc_ega_device &>(*device).config_set_hpixels_per_column(_pix);
-
-#define MCFG_CRTC_EGA_RES_OUT_DE_CB(_devcb) \
- downcast<crtc_ega_device &>(*device).set_res_out_de_callback(DEVCB_##_devcb);
-
-#define MCFG_CRTC_EGA_RES_OUT_HSYNC_CB(_devcb) \
- downcast<crtc_ega_device &>(*device).set_res_out_hsync_callback(DEVCB_##_devcb);
-
-#define MCFG_CRTC_EGA_RES_OUT_VSYNC_CB(_devcb) \
- downcast<crtc_ega_device &>(*device).set_res_out_vsync_callback(DEVCB_##_devcb);
-
-#define MCFG_CRTC_EGA_RES_OUT_VBLANK_CB(_devcb) \
- downcast<crtc_ega_device &>(*device).set_res_out_vblank_callback(DEVCB_##_devcb);
-
-
class crtc_ega_device : public device_t,
public device_video_interface
{
@@ -57,24 +29,24 @@ public:
crtc_ega_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- template <class Object> devcb_base &set_res_out_de_callback(Object &&cb) { return m_res_out_de_cb.set_callback(std::forward<Object>(cb)); }
- template <class Object> devcb_base &set_res_out_hsync_callback(Object &&cb) { return m_res_out_hsync_cb.set_callback(std::forward<Object>(cb)); }
- template <class Object> devcb_base &set_res_out_vsync_callback(Object &&cb) { return m_res_out_vsync_cb.set_callback(std::forward<Object>(cb)); }
- template <class Object> devcb_base &set_res_out_vblank_callback(Object &&cb) { return m_res_out_vblank_cb.set_callback(std::forward<Object>(cb)); }
+ auto res_out_de_callback() { return m_res_out_de_cb.bind(); }
+ auto res_out_hsync_callback() { return m_res_out_hsync_cb.bind(); }
+ auto res_out_vsync_callback() { return m_res_out_vsync_cb.bind(); }
+ auto res_out_vblank_callback() { return m_res_out_vblank_cb.bind(); }
- template <typename Object> void set_begin_update_callback(Object &&cb) { m_begin_update_cb = std::forward<Object>(cb); }
- template <typename Object> void set_row_update_callback(Object &&cb) { m_row_update_cb = std::forward<Object>(cb); }
- template <typename Object> void set_end_update_callback(Object &&cb) { m_end_update_cb = std::forward<Object>(cb); }
+ template <typename... T> void set_begin_update_callback(T &&... args) { m_begin_update_cb = begin_update_delegate(std::forward<T>(args)...); }
+ template <typename... T> void set_row_update_callback(T &&... args) { m_row_update_cb = row_update_delegate(std::forward<T>(args)...); }
+ template <typename... T> void set_end_update_callback(T &&... args) { m_end_update_cb = end_update_delegate(std::forward<T>(args)...); }
void config_set_hpixels_per_column(int hpixels_per_column) { m_hpixels_per_column = hpixels_per_column; }
/* select one of the registers for reading or writing */
- DECLARE_WRITE8_MEMBER( address_w );
+ void address_w(uint8_t data);
/* read from the currently selected register */
- DECLARE_READ8_MEMBER( register_r );
+ uint8_t register_r();
/* write to the currently selected register */
- DECLARE_WRITE8_MEMBER( register_w );
+ void register_w(uint8_t data);
/* return the current value on the MA0-MA15 pins */
uint16_t get_ma();
diff --git a/src/devices/video/decsfb.cpp b/src/devices/video/decsfb.cpp
new file mode 100644
index 00000000000..166cc98f62b
--- /dev/null
+++ b/src/devices/video/decsfb.cpp
@@ -0,0 +1,175 @@
+// license:BSD-3-Clause
+// copyright-holders:R. Belmont
+
+/*
+ * An emulation of the Digital Equipment Corporation SFB "Smart Frame Buffer" chip
+ *
+ * Used in:
+ *
+ * Accelerated TURBOChannel video cards for DECstations and AlphaStations
+ * On-board on some DECstations
+ * On-board on many AlphaStations
+ *
+ * Sources:
+ *
+ * http://www.hpl.hp.com/techreports/Compaq-DEC/WRL-93-1.pdf
+ *
+ */
+
+#include "emu.h"
+#include "decsfb.h"
+
+#define MODE_SIMPLE 0
+#define MODE_OPAQUESTIPPLE 1
+#define MODE_OPAQUELINE 2
+#define MODE_TRANSPARENTSTIPPLE 5
+#define MODE_TRANSPARENTLINE 6
+#define MODE_COPY 7
+
+#define LOG_GENERAL (1U << 0)
+#define LOG_REG (1U << 1)
+#define LOG_IRQ (1U << 2)
+
+//#define VERBOSE (LOG_GENERAL|LOG_REG||LOG_IRQ)
+
+#include "logmacro.h"
+
+DEFINE_DEVICE_TYPE(DECSFB, decsfb_device, "decsfb", "Digital Equipment Corporation Smart Frame Buffer")
+
+decsfb_device::decsfb_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+ : device_t(mconfig, DECSFB, tag, owner, clock),
+ m_int_cb(*this)
+{
+}
+
+void decsfb_device::device_start()
+{
+ m_int_cb.resolve_safe();
+
+ save_item(NAME(m_vram));
+ save_item(NAME(m_regs));
+ save_item(NAME(m_copy_src));
+}
+
+void decsfb_device::device_reset()
+{
+ m_copy_src = 1;
+}
+
+/*
+ 0x100000 copy register 0
+ 0x100004 copy register 1
+ 0x100008 copy register 2
+ 0x10000C copy register 3
+ 0x100010 copy register 4
+ 0x100014 copy register 5
+ 0x100018 copy register 6
+ 0x10001C copy register 7
+ 0x100020 foreground register
+ 0x100024 background register
+ 0x100028 plane mask
+ 0x10002C pixel mask
+ 0x100030 cxt mode
+ 0x100034 boolean operation
+ 0x100038 pixel shift
+ 0x10003C line address
+ 0x100040 bresh 1
+ 0x100044 bresh 2
+ 0x100048 bresh 3
+ 0x10004C bresh continue
+ 0x100050 deep register
+ 0x100054 start register
+ 0x100058 Clear Interrupt
+ 0x10005C reserved 2
+ 0x100060 refresh count
+ 0x100064 video horiz
+ 0x100068 video vertical
+ 0x10006C refresh base
+ 0x100070 video valid
+ 0x100074 Interrupt Enable
+*/
+
+READ32_MEMBER(decsfb_device::read)
+{
+ return m_regs[offset];
+}
+
+WRITE32_MEMBER(decsfb_device::write)
+{
+ COMBINE_DATA(&m_regs[offset]);
+
+ if ((offset == (0x30/4)) && (data = 7))
+ {
+ m_copy_src = 1;
+ }
+}
+
+READ32_MEMBER(decsfb_device::vram_r)
+{
+ return m_vram[offset];
+}
+
+WRITE32_MEMBER(decsfb_device::vram_w)
+{
+ switch (m_regs[0x30/4])
+ {
+ case MODE_SIMPLE: // simple
+ COMBINE_DATA(&m_vram[offset]);
+ break;
+
+ case MODE_TRANSPARENTSTIPPLE:
+ {
+ uint8_t *pVRAM = (uint8_t *)&m_vram[offset];
+ uint8_t fgs[4];
+
+ fgs[0] = m_regs[0x20/4] >> 24;
+ fgs[1] = (m_regs[0x20/4] >> 16) & 0xff;
+ fgs[2] = (m_regs[0x20/4] >> 8) & 0xff;
+ fgs[3] = m_regs[0x20/4] & 0xff;
+ for (int x = 0; x < 32; x++)
+ {
+ if (data & (1<<(31-x)))
+ {
+ pVRAM[x] = fgs[x & 3];
+ }
+ }
+ }
+ break;
+
+ case MODE_COPY:
+ {
+ uint8_t *pVRAM = (uint8_t *)&m_vram[offset];
+ uint8_t *pBuffer = (uint8_t *)&m_regs[0]; // first 8 32-bit regs are the copy buffer
+
+ if (m_copy_src)
+ {
+ m_copy_src = 0;
+
+ for (int x = 0; x < 32; x++)
+ {
+ if (data & (1<<(31-x)))
+ {
+ pBuffer[x] = pVRAM[x];
+ }
+ }
+ }
+ else
+ {
+ m_copy_src = 1;
+
+ for (int x = 0; x < 32; x++)
+ {
+ if (data & (1<<(31-x)))
+ {
+ pVRAM[x] = pBuffer[x];
+ }
+ }
+ }
+ }
+ break;
+
+ default:
+ logerror("SFB: Unsupported VRAM write %08x (mask %08x) at %08x in mode %x\n", data, mem_mask, offset<<2, m_regs[0x30/4]);
+ break;
+ }
+}
diff --git a/src/devices/video/decsfb.h b/src/devices/video/decsfb.h
new file mode 100644
index 00000000000..52e6687ea40
--- /dev/null
+++ b/src/devices/video/decsfb.h
@@ -0,0 +1,38 @@
+// license:BSD-3-Clause
+// copyright-holders:R. Belmont
+
+#ifndef MAME_VIDEO_DECSFB_H
+#define MAME_VIDEO_DECSFB_H
+
+#pragma once
+
+class decsfb_device : public device_t
+{
+public:
+ decsfb_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+
+ auto int_cb() { return m_int_cb.bind(); }
+
+ DECLARE_READ32_MEMBER( read );
+ DECLARE_WRITE32_MEMBER( write );
+ DECLARE_READ32_MEMBER( vram_r );
+ DECLARE_WRITE32_MEMBER( vram_w );
+
+ u32 *get_vram() { return m_vram; }
+
+protected:
+ // standard device_interface overrides
+ virtual void device_start() override;
+ virtual void device_reset() override;
+
+ devcb_write_line m_int_cb;
+
+private:
+ u32 m_vram[0x200000/4];
+ u32 m_regs[0x80];
+ int m_copy_src;
+};
+
+DECLARE_DEVICE_TYPE(DECSFB, decsfb_device)
+
+#endif // MAME_VIDEO_DECSFB_H
diff --git a/src/devices/video/dl1416.h b/src/devices/video/dl1416.h
index 2f98355b95d..446e37201dd 100644
--- a/src/devices/video/dl1416.h
+++ b/src/devices/video/dl1416.h
@@ -27,24 +27,12 @@ DECLARE_DEVICE_TYPE(DL1416T, dl1416_device)
/***************************************************************************
- DEVICE CONFIGURATION MACROS
-***************************************************************************/
-
-#define MCFG_DL1414_UPDATE_HANDLER(_devcb) \
- downcast<dl1414_device &>(*device).set_update_handler(DEVCB_##_devcb);
-
-#define MCFG_DL1416_UPDATE_HANDLER(_devcb) \
- downcast<dl1414_device &>(*device).set_update_handler(DEVCB_##_devcb);
-
-
-/***************************************************************************
TYPE DECLARATIONS
***************************************************************************/
class dl1414_device : public device_t
{
public:
- template <typename Object> devcb_base &set_update_handler(Object &&cb) { return m_update_cb.set_callback(std::forward<Object>(cb)); }
auto update() { return m_update_cb.bind(); }
// signal-level interface
diff --git a/src/devices/video/dm9368.h b/src/devices/video/dm9368.h
index ae9956de30b..fb376541a07 100644
--- a/src/devices/video/dm9368.h
+++ b/src/devices/video/dm9368.h
@@ -23,19 +23,6 @@
#pragma once
-
-//**************************************************************************
-// INTERFACE CONFIGURATION MACROS
-//**************************************************************************
-
-#define MCFG_DM9368_UPDATE_CALLBACK(cb) \
- downcast<dm9368_device &>(*device).set_update_callback(DEVCB_##cb);
-
-#define MCFG_DM9368_RBO_CALLBACK(cb) \
- downcast<dm9368_device &>(*device).set_rbo_callback(DEVCB_##cb);
-
-
-
//**************************************************************************
// TYPE DEFINITIONS
//**************************************************************************
@@ -45,8 +32,6 @@
class dm9368_device : public device_t
{
public:
- template <typename Obj> devcb_base &set_update_callback(Obj &&cb) { return m_update_cb.set_callback(std::forward<Obj>(cb)); }
- template <typename Obj> devcb_base &set_rbo_callback(Obj &&cb) { return m_rbo_cb.set_callback(std::forward<Obj>(cb)); }
auto update_cb() { return m_update_cb.bind(); }
auto rbo_cb() { return m_rbo_cb.bind(); }
diff --git a/src/devices/video/ef9340_1.h b/src/devices/video/ef9340_1.h
index 88b1d91a163..4d687d227d6 100644
--- a/src/devices/video/ef9340_1.h
+++ b/src/devices/video/ef9340_1.h
@@ -15,16 +15,18 @@
#pragma once
-
-#define MCFG_EF9340_1_ADD(_tag, _clock, _screen_tag) \
- MCFG_DEVICE_ADD(_tag, EF9340_1, _clock) \
- MCFG_VIDEO_SET_SCREEN(_screen_tag)
-
class ef9340_1_device : public device_t,
public device_video_interface
{
public:
// construction/destruction
+ template <typename T>
+ ef9340_1_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock, T &&screen_tag)
+ : ef9340_1_device(mconfig, tag, owner, clock)
+ {
+ set_screen(std::forward<T>(screen_tag));
+ }
+
ef9340_1_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
inline bitmap_ind16 *get_bitmap() { return &m_tmp_bitmap; }
diff --git a/src/devices/video/ef9345.cpp b/src/devices/video/ef9345.cpp
index 006d92855ba..1daf7b5fde7 100644
--- a/src/devices/video/ef9345.cpp
+++ b/src/devices/video/ef9345.cpp
@@ -35,7 +35,8 @@ DEFINE_DEVICE_TYPE(TS9347, ts9347_device, "ts9347", "TS9347")
// default address map
void ef9345_device::ef9345(address_map &map)
{
- map(0x0000, 0x3fff).ram();
+ if (!has_configured_map(0))
+ map(0x0000, 0x3fff).ram();
}
//-------------------------------------------------
@@ -113,7 +114,7 @@ ef9345_device::ef9345_device(const machine_config &mconfig, device_type type, co
device_t(mconfig, type, tag, owner, clock),
device_memory_interface(mconfig, *this),
device_video_interface(mconfig, *this),
- m_space_config("videoram", ENDIANNESS_LITTLE, 8, 16, 0, address_map_constructor(), address_map_constructor(FUNC(ef9345_device::ef9345), this)),
+ m_space_config("videoram", ENDIANNESS_LITTLE, 8, 16, 0, address_map_constructor(FUNC(ef9345_device::ef9345), this)),
m_charset(*this, DEVICE_SELF),
m_variant(variant),
m_palette(*this, finder_base::DUMMY_TAG)
@@ -212,7 +213,7 @@ void ef9345_device::device_timer(emu_timer &timer, device_timer_id id, int param
void ef9345_device::set_busy_flag(int period)
{
m_bf = 1;
- m_busy_timer->adjust(attotime::from_usec(period));
+ m_busy_timer->adjust(attotime::from_nsec(period));
}
// draw a char in 40 char line mode
@@ -753,7 +754,7 @@ void ef9345_device::ef9345_exec(uint8_t cmd)
{
case 0x00: //KRF: R1,R2,R3->ram
case 0x01: //KRF: R1,R2,R3->ram + increment
- set_busy_flag(4);
+ set_busy_flag(4000);
m_videoram->write_byte(a, m_registers[1]);
m_videoram->write_byte(a + 0x0800, m_registers[2]);
m_videoram->write_byte(a + 0x1000, m_registers[3]);
@@ -761,14 +762,14 @@ void ef9345_device::ef9345_exec(uint8_t cmd)
break;
case 0x02: //KRG: R1,R2->ram
case 0x03: //KRG: R1,R2->ram + increment
- set_busy_flag(5.5);
+ set_busy_flag(5500);
m_videoram->write_byte(a, m_registers[1]);
m_videoram->write_byte(a + 0x0800, m_registers[2]);
if (cmd&1) inc_x(7);
break;
case 0x08: //KRF: ram->R1,R2,R3
case 0x09: //KRF: ram->R1,R2,R3 + increment
- set_busy_flag(7.5);
+ set_busy_flag(7500);
m_registers[1] = m_videoram->read_byte(a);
m_registers[2] = m_videoram->read_byte(a + 0x0800);
m_registers[3] = m_videoram->read_byte(a + 0x1000);
@@ -776,14 +777,14 @@ void ef9345_device::ef9345_exec(uint8_t cmd)
break;
case 0x0a: //KRG: ram->R1,R2
case 0x0b: //KRG: ram->R1,R2 + increment
- set_busy_flag(7.5);
+ set_busy_flag(7500);
m_registers[1] = m_videoram->read_byte(a);
m_registers[2] = m_videoram->read_byte(a + 0x0800);
if (cmd&1) inc_x(7);
break;
case 0x30: //OCT: R1->RAM, main pointer
case 0x31: //OCT: R1->RAM, main pointer + inc
- set_busy_flag(4);
+ set_busy_flag(4000);
m_videoram->write_byte(indexram(7), m_registers[1]);
if (cmd&1)
@@ -795,7 +796,7 @@ void ef9345_device::ef9345_exec(uint8_t cmd)
break;
case 0x34: //OCT: R1->RAM, aux pointer
case 0x35: //OCT: R1->RAM, aux pointer + inc
- set_busy_flag(4);
+ set_busy_flag(4000);
m_videoram->write_byte(indexram(5), m_registers[1]);
if (cmd&1)
@@ -803,7 +804,7 @@ void ef9345_device::ef9345_exec(uint8_t cmd)
break;
case 0x38: //OCT: RAM->R1, main pointer
case 0x39: //OCT: RAM->R1, main pointer + inc
- set_busy_flag(4.5);
+ set_busy_flag(4500);
m_registers[1] = m_videoram->read_byte(indexram(7));
if (cmd&1)
@@ -816,7 +817,7 @@ void ef9345_device::ef9345_exec(uint8_t cmd)
break;
case 0x3c: //OCT: RAM->R1, aux pointer
case 0x3d: //OCT: RAM->R1, aux pointer + inc
- set_busy_flag(4.5);
+ set_busy_flag(4500);
m_registers[1] = m_videoram->read_byte(indexram(5));
if (cmd&1)
@@ -824,7 +825,7 @@ void ef9345_device::ef9345_exec(uint8_t cmd)
break;
case 0x50: //KRL: 80 uint8_t - 12 bits write
case 0x51: //KRL: 80 uint8_t - 12 bits write + inc
- set_busy_flag(12.5);
+ set_busy_flag(12500);
m_videoram->write_byte(a, m_registers[1]);
switch((a / 0x0800) & 1)
{
@@ -850,7 +851,7 @@ void ef9345_device::ef9345_exec(uint8_t cmd)
break;
case 0x58: //KRL: 80 uint8_t - 12 bits read
case 0x59: //KRL: 80 uint8_t - 12 bits read + inc
- set_busy_flag(11.5);
+ set_busy_flag(11500);
m_registers[1] = m_videoram->read_byte(a);
switch((a / 0x0800) & 1)
{
@@ -879,7 +880,7 @@ void ef9345_device::ef9345_exec(uint8_t cmd)
case 0x83: //IND: R1->PAT
case 0x84: //IND: R1->DOR
case 0x87: //IND: R1->ROR
- set_busy_flag(2);
+ set_busy_flag(2000);
switch(cmd&7)
{
case 1: m_tgs = m_registers[1]; break;
@@ -897,7 +898,7 @@ void ef9345_device::ef9345_exec(uint8_t cmd)
case 0x8b: //IND: PAT->R1
case 0x8c: //IND: DOR->R1
case 0x8f: //IND: ROR->R1
- set_busy_flag(3.5);
+ set_busy_flag(3500);
switch(cmd&7)
{
case 0: m_registers[1] = m_charset[indexrom(7) & 0x1fff]; break;
@@ -915,7 +916,7 @@ void ef9345_device::ef9345_exec(uint8_t cmd)
case 0x99: //VSM: vertical sync mask set
break;
case 0xb0: //INY: increment Y
- set_busy_flag(2);
+ set_busy_flag(2000);
inc_y(6);
m_state &= 0x8f; //reset S4(LXa), S5(LXm), S6(Al)
break;
@@ -936,7 +937,7 @@ void ef9345_device::ef9345_exec(uint8_t cmd)
uint8_t n = (cmd>>4) - 0x0c;
uint8_t r1 = (cmd&0x04) ? 7 : 5;
uint8_t r2 = (cmd&0x04) ? 5 : 7;
- int busy = 2;
+ int busy = 2000;
for(i = 0; i < 1280; i++)
{
@@ -959,7 +960,7 @@ void ef9345_device::ef9345_exec(uint8_t cmd)
inc_y(6);
}
- busy += 4 * n;
+ busy += 4000 * n;
}
m_state &= 0x8f; //reset S4(LXa), S5(LXm), S6(Al)
set_busy_flag(busy);
@@ -994,7 +995,7 @@ void ef9345_device::update_scanline(uint16_t scanline)
if (scanline == 250)
m_state &= 0xfb;
- set_busy_flag(104);
+ set_busy_flag(104000);
if (m_char_mode == MODE12x80 || m_char_mode == MODE8x80)
{
@@ -1047,7 +1048,7 @@ void ef9345_device::update_scanline(uint16_t scanline)
}
}
-READ8_MEMBER( ef9345_device::data_r )
+uint8_t ef9345_device::data_r(offs_t offset)
{
if (offset & 7)
return m_registers[offset & 7];
@@ -1060,7 +1061,7 @@ READ8_MEMBER( ef9345_device::data_r )
return m_state;
}
-WRITE8_MEMBER( ef9345_device::data_w )
+void ef9345_device::data_w(offs_t offset, uint8_t data)
{
m_registers[offset & 7] = data;
diff --git a/src/devices/video/ef9345.h b/src/devices/video/ef9345.h
index dfec7d080f2..d36811e8a60 100644
--- a/src/devices/video/ef9345.h
+++ b/src/devices/video/ef9345.h
@@ -15,8 +15,6 @@
#include "emupal.h"
-#define MCFG_EF9345_PALETTE(_palette_tag) \
- downcast<ef9345_device &>(*device).set_palette_tag(_palette_tag);
//**************************************************************************
// TYPE DEFINITIONS
@@ -36,8 +34,8 @@ public:
template <typename T> void set_palette_tag(T &&tag) { m_palette.set_tag(std::forward<T>(tag)); }
// device interface
- DECLARE_READ8_MEMBER( data_r );
- DECLARE_WRITE8_MEMBER( data_w );
+ uint8_t data_r(offs_t offset);
+ void data_w(offs_t offset, uint8_t data);
void update_scanline(uint16_t scanline);
uint32_t screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
diff --git a/src/devices/video/ef9364.cpp b/src/devices/video/ef9364.cpp
index ec324ff0e52..858b7309ca6 100644
--- a/src/devices/video/ef9364.cpp
+++ b/src/devices/video/ef9364.cpp
@@ -35,7 +35,8 @@ DEFINE_DEVICE_TYPE(EF9364, ef9364_device, "ef9364", "Thomson EF9364")
//-------------------------------------------------
void ef9364_device::ef9364(address_map &map)
{
- map(0x00000, ef9364_device::TXTPLANE_MAX_SIZE * ef9364_device::MAX_TXTPLANES - 1).ram();
+ if (!has_configured_map(0))
+ map(0x00000, ef9364_device::TXTPLANE_MAX_SIZE * ef9364_device::MAX_TXTPLANES - 1).ram();
}
//-------------------------------------------------
@@ -66,7 +67,7 @@ ef9364_device::ef9364_device(const machine_config &mconfig, const char *tag, dev
device_t(mconfig, EF9364, tag, owner, clock),
device_memory_interface(mconfig, *this),
device_video_interface(mconfig, *this),
- m_space_config("textram", ENDIANNESS_LITTLE, 8, 12, 0, address_map_constructor(), address_map_constructor(FUNC(ef9364_device::ef9364), this)),
+ m_space_config("textram", ENDIANNESS_LITTLE, 8, 12, 0, address_map_constructor(FUNC(ef9364_device::ef9364), this)),
m_charset(*this, DEVICE_SELF),
m_palette(*this, finder_base::DUMMY_TAG)
{
diff --git a/src/devices/video/ef9364.h b/src/devices/video/ef9364.h
index 1082173733c..290ab8464df 100644
--- a/src/devices/video/ef9364.h
+++ b/src/devices/video/ef9364.h
@@ -15,14 +15,6 @@
#include "emupal.h"
-#define MCFG_EF9364_PALETTE(_palette_tag) \
- downcast<ef9364_device &>(*device).set_palette_tag(_palette_tag);
-
-#define MCFG_EF9364_PAGES_CNT(_pages_number) \
- downcast<ef9364_device &>(*device).set_nb_of_pages(_pages_number);
-
-#define MCFG_EF9364_IRQ_HANDLER(_devcb) \
- downcast<ef9364_device &>(*device).set_irq_handler(DEVCB_##_devcb);
//**************************************************************************
// TYPE DEFINITIONS
diff --git a/src/devices/video/ef9365.cpp b/src/devices/video/ef9365.cpp
index 5023348c99e..5abc7d2dde8 100644
--- a/src/devices/video/ef9365.cpp
+++ b/src/devices/video/ef9365.cpp
@@ -168,7 +168,8 @@ const tiny_rom_entry *ef9365_device::device_rom_region() const
//-------------------------------------------------
void ef9365_device::ef9365(address_map &map)
{
- map(0x00000, ef9365_device::BITPLANE_MAX_SIZE * ef9365_device::MAX_BITPLANES - 1).ram();
+ if (!has_configured_map(0))
+ map(0x00000, ef9365_device::BITPLANE_MAX_SIZE * ef9365_device::MAX_BITPLANES - 1).ram();
}
//-------------------------------------------------
@@ -200,7 +201,7 @@ ef9365_device::ef9365_device(const machine_config &mconfig, const char *tag, dev
device_t(mconfig, EF9365, tag, owner, clock),
device_memory_interface(mconfig, *this),
device_video_interface(mconfig, *this),
- m_space_config("videoram", ENDIANNESS_LITTLE, 8, 18, 0, address_map_constructor(), address_map_constructor(FUNC(ef9365_device::ef9365), this)),
+ m_space_config("videoram", ENDIANNESS_LITTLE, 8, 18, 0, address_map_constructor(FUNC(ef9365_device::ef9365), this)),
m_charset(*this, "ef9365"),
m_palette(*this, finder_base::DUMMY_TAG),
m_irq_handler(*this)
@@ -1224,7 +1225,7 @@ void ef9365_device::update_scanline(uint16_t scanline)
// data_r: Registers read access callback
//-------------------------------------------------
-READ8_MEMBER( ef9365_device::data_r )
+uint8_t ef9365_device::data_r(offs_t offset)
{
unsigned char return_value;
@@ -1315,7 +1316,7 @@ READ8_MEMBER( ef9365_device::data_r )
// data_w: Registers write access callback
//-------------------------------------------------
-WRITE8_MEMBER( ef9365_device::data_w )
+void ef9365_device::data_w(offs_t offset, uint8_t data)
{
LOG("EF9365 [ %s ] <WR [ 0x%.2X ] - %s\n", register_names[offset&0xF],data, machine().describe_context() );
diff --git a/src/devices/video/ef9365.h b/src/devices/video/ef9365.h
index 762989e6a03..be22ae6339b 100644
--- a/src/devices/video/ef9365.h
+++ b/src/devices/video/ef9365.h
@@ -15,17 +15,6 @@
#include "emupal.h"
-#define MCFG_EF936X_PALETTE(palette_tag) \
- downcast<ef9365_device &>(*device).set_palette_tag(palette_tag);
-
-#define MCFG_EF936X_BITPLANES_CNT(bitplanes_number) \
- downcast<ef9365_device &>(*device).set_nb_bitplanes((bitplanes_number));
-
-#define MCFG_EF936X_DISPLAYMODE(display_mode) \
- downcast<ef9365_device &>(*device).set_display_mode((ef9365_device::display_mode));
-
-#define MCFG_EF936X_IRQ_HANDLER(cb) \
- downcast<ef9365_device &>(*device).set_irq_handler((DEVCB_##cb));
//**************************************************************************
// TYPE DEFINITIONS
@@ -54,11 +43,11 @@ public:
template <typename T> void set_palette_tag(T &&tag) { m_palette.set_tag(std::forward<T>(tag)); }
void set_nb_bitplanes(int nb_bitplanes );
void set_display_mode(int display_mode );
- template<class Object> devcb_base &set_irq_handler(Object object) { return m_irq_handler.set_callback(std::forward<Object>(object)); }
+ auto irq_handler() { return m_irq_handler.bind(); }
// device interface
- DECLARE_READ8_MEMBER( data_r );
- DECLARE_WRITE8_MEMBER( data_w );
+ uint8_t data_r(offs_t offset);
+ void data_w(offs_t offset, uint8_t data);
void update_scanline(uint16_t scanline);
void set_color_filler( uint8_t color );
diff --git a/src/devices/video/epic12.h b/src/devices/video/epic12.h
index a8fe41b069f..287dc08ebb3 100644
--- a/src/devices/video/epic12.h
+++ b/src/devices/video/epic12.h
@@ -6,12 +6,6 @@
#pragma once
-#define MCFG_EPIC12_ADD(_tag) \
- MCFG_DEVICE_ADD(_tag, EPIC12, 0)
-
-#define MCFG_EPIC12_SET_MAINRAMSIZE( _rgn ) \
- downcast<epic12_device &>(*device).set_mainramsize(_rgn);
-
class epic12_device : public device_t, public device_video_interface
{
diff --git a/src/devices/video/fixfreq.cpp b/src/devices/video/fixfreq.cpp
index a64c6d812b3..58eec1722e3 100644
--- a/src/devices/video/fixfreq.cpp
+++ b/src/devices/video/fixfreq.cpp
@@ -19,194 +19,216 @@
//#define VERBOSE 1
#include "logmacro.h"
-
/***************************************************************************
Fixed frequency monitor
***************************************************************************/
+
+
+
// device type definition
DEFINE_DEVICE_TYPE(FIXFREQ, fixedfreq_device, "fixfreq", "Fixed-Frequency Monochrome Monitor")
-fixedfreq_device::fixedfreq_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock)
- : device_t(mconfig, type, tag, owner, clock),
- device_video_interface(mconfig, *this, false),
- m_htotal(0), m_vtotal(0), m_vid(0), m_last_x(0), m_last_y(0), m_cur_bm(0),
- // default to NTSC "704x480@30i"
- m_monitor_clock(13500000),
- m_hvisible(704),
- m_hfrontporch(728),
- m_hsync(791),
- m_hbackporch(858),
- m_vvisible(480),
- m_vfrontporch(486),
- m_vsync(492),
- m_vbackporch(525),
- m_fieldcount(2),
- m_sync_threshold(0.3),
- m_gain(1.0 / 3.7),
- m_vint(0), m_int_trig(0), m_mult(0), m_sig_vsync(0), m_sig_composite(0), m_sig_field(0)
+void fixedfreq_monitor_state::update_sync_channel(const time_type &time, const double newval)
{
-}
+ const time_type delta_time = time - m_last_sync_time;
-fixedfreq_device::fixedfreq_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
- : fixedfreq_device(mconfig, FIXFREQ, tag, owner, clock)
-{
+ const int last_vsync = m_sig_vsync;
+ const int last_comp = m_sig_composite;
+
+ m_vsync_filter += ((double) last_comp - m_vsync_filter) * (1.0 - exp(-delta_time * m_vsync_filter_timeconst));
+ m_sig_composite = (newval < m_desc.m_sync_threshold) ? 1 : 0 ;
+
+ m_sig_vsync = (m_vsync_filter > m_vsync_threshold) ? 1 : 0;
+
+ if (!last_vsync && m_sig_vsync)
+ {
+ //LOG("VSYNC %d %d\n", m_last_x, m_last_y + m_sig_field);
+ m_last_y = m_desc.m_vbackporch - m_desc.m_vsync;
+ m_intf.vsync_start_cb(time - m_last_vsync_time);
+ m_last_vsync_time = time;
+ }
+ else if (last_vsync && !m_sig_vsync)
+ {
+ m_sig_field = last_comp; /* force false-progressive */
+ m_sig_field = (m_sig_field ^ 1) ^ last_comp; /* if there is no field switch, auto switch */
+ //LOG("Field: %d\n", m_sig_field);
+ }
+
+ if (!last_comp && m_sig_composite)
+ {
+ /* TODO - time since last hsync and field detection */
+ //LOG("HSYNC up %d\n", m_last_x);
+ // FIXME: pixels > 50 filters some spurious hysnc on line 27 in breakout
+ if (!m_sig_vsync && (m_last_x > m_desc.m_hscale * 100))
+ {
+ m_last_y += m_desc.m_fieldcount;
+ m_last_x = 0;
+ m_line_time = time;
+ }
+ //if (m_last_y == 27) printf("HSYNC up %d %d\n", m_last_y, pixels);
+ }
+ else if (last_comp && !m_sig_composite)
+ {
+ /* falling composite */
+ //LOG("HSYNC down %f %d %f\n", time * 1e6, m_last_x, m_sync_signal);
+ }
+
+ m_sync_signal = newval;
+ m_last_sync_time = time;
}
-void fixedfreq_device::device_start()
+void fixedfreq_monitor_state::update_bm(const time_type &time)
{
- m_htotal = 0;
- m_vtotal = 0;
-
- m_vid = 0.0;
- m_last_x = 0;
- m_last_y = 0;
- m_last_time = attotime::zero;
- m_line_time = attotime::zero;
- m_last_hsync_time = attotime::zero;
- m_last_vsync_time = attotime::zero;
- m_refresh = attotime::zero;
- m_clock_period = attotime::zero;
- //bitmap_rgb32 *m_bitmap[2];
- m_cur_bm = 0;
+ const int pixels = round((time - m_line_time) * m_desc.m_hscale / m_clock_period);
+ const int has_fields = (m_desc.m_fieldcount > 1) ? 1: 0;
- /* sync separator */
- m_vint = 0.0;
- m_int_trig = 0.0;
- m_mult = 0.0;
-
- m_sig_vsync = 0;
- m_sig_composite = 0;
- m_sig_field = 0;
-
- m_bitmap[0] = nullptr;
- m_bitmap[1] = nullptr;
- //m_vblank_timer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(vga_device::vblank_timer_cb),this));
- recompute_parameters(false);
-
- save_item(NAME(m_vid));
- save_item(NAME(m_last_x));
- save_item(NAME(m_last_y));
- save_item(NAME(m_last_time));
- save_item(NAME(m_line_time));
- save_item(NAME(m_last_hsync_time));
- save_item(NAME(m_last_vsync_time));
- save_item(NAME(m_refresh));
- save_item(NAME(m_clock_period));
- //save_item(NAME(m_bitmap[0]));
- //save_item(NAME(m_bitmap[1]));
- save_item(NAME(m_cur_bm));
+ uint32_t col(0xffff0000); // Mark sync areas
- /* sync separator */
- save_item(NAME(m_vint));
- save_item(NAME(m_int_trig));
- save_item(NAME(m_mult));
+ if (m_sync_signal >= m_desc.m_sync_threshold)
+ col = m_col;
- save_item(NAME(m_sig_vsync));
- save_item(NAME(m_sig_composite));
- save_item(NAME(m_sig_field));
+ m_intf.plot_hline(m_last_x, m_last_y + m_sig_field * has_fields, pixels - m_last_x, col);
+ m_last_x = pixels;
+}
+void fixedfreq_monitor_state::update_composite_monochrome(const time_type &time, const double data)
+{
+ update_bm(time);
+ update_sync_channel(time, data);
+
+ int colv = (int) ((data - m_desc.m_sync_threshold) * m_desc.m_gain * 255.0);
+ if (colv > 255)
+ colv = 255;
+ if (colv < 0)
+ m_col = 0xffff0000;
+ else
+ m_col = 0xff000000 | (colv<<16) | (colv<<8) | colv;
+}
+void fixedfreq_monitor_state::update_red(const time_type &time, const double data)
+{
+ update_bm(time);
+
+ int colv = (int) ((data - m_desc.m_sync_threshold) * m_desc.m_gain * 255.0);
+ if (colv > 255)
+ colv = 255;
+ if (colv < 0)
+ colv = 0;
+ m_col = (m_col & 0xff00ffff) | (colv<<16);
+}
+void fixedfreq_monitor_state::update_green(const time_type &time, const double data)
+{
+ update_bm(time);
+ //update_sync_channel(ctime, data);
+
+ int colv = (int) ((data - m_desc.m_sync_threshold) * m_desc.m_gain * 255.0);
+ if (colv > 255)
+ colv = 255;
+ if (colv < 0)
+ colv = 0;
+ m_col = (m_col & 0xffff00ff) | (colv<<8);
}
-void fixedfreq_device::device_reset()
+void fixedfreq_monitor_state::update_blue(const time_type &time, const double data)
{
- m_last_time = attotime::zero;
- m_line_time = attotime::zero;
- m_last_hsync_time = attotime::zero;
- m_last_vsync_time = attotime::zero;
- m_vint = 0;
+ update_bm(time);
+ //update_sync_channel(ctime, data);
+
+ int colv = (int) ((data - m_desc.m_sync_threshold) * m_desc.m_gain * 255.0);
+ if (colv > 255)
+ colv = 255;
+ if (colv < 0)
+ colv = 0;
+ m_col = (m_col & 0xffffff00) | colv;
}
+void fixedfreq_monitor_state::update_sync(const time_type &time, const double data)
+{
+ update_bm(time);
+ update_sync_channel(time, data);
+}
-void fixedfreq_device::device_post_load()
+fixedfreq_device::fixedfreq_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock)
+ : device_t(mconfig, type, tag, owner, clock),
+ device_video_interface(mconfig, *this, false),
+ m_cur_bm(0),
+ m_htotal(0),
+ m_vtotal(0),
+ m_refresh_period(time_type(0)),
+ m_monitor(),
+ m_state(m_monitor, *this)
{
- //recompute_parameters(true);
}
-void fixedfreq_device::recompute_parameters(bool postload)
+fixedfreq_device::fixedfreq_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+ : fixedfreq_device(mconfig, FIXFREQ, tag, owner, clock)
{
- bool needs_realloc = (m_htotal != m_hbackporch) && (m_vtotal != m_vbackporch);
+}
- if (m_bitmap[0] != nullptr || needs_realloc)
- m_bitmap[0] = nullptr;
- if (m_bitmap[1] != nullptr || needs_realloc)
- m_bitmap[1] = nullptr;
+void fixedfreq_device::device_config_complete()
+{
+ if (!has_screen())
+ return;
- m_htotal = m_hbackporch;
- m_vtotal = m_vbackporch;
+ if (!screen().refresh_attoseconds())
+ screen().set_raw(m_monitor.m_monitor_clock, m_monitor.m_hbackporch, 0,
+ m_monitor.m_hbackporch, m_monitor.m_vbackporch, 0,
+ m_monitor.m_vbackporch);
- /* sync separator */
+ if (!screen().has_screen_update())
+ screen().set_screen_update(screen_update_rgb32_delegate(FUNC(fixedfreq_device::screen_update), this));
+}
- m_int_trig = (exp(- 3.0/(3.0+3.0))) - exp(-1.0);
- m_mult = (double) (m_monitor_clock) / (double) m_htotal * 1.0; // / (3.0 + 3.0);
- LOG("trigger %f with len %f\n", m_int_trig, 1e6 / m_mult);
+void fixedfreq_device::device_start()
+{
- m_bitmap[0] = std::make_unique<bitmap_rgb32>(m_htotal, m_vtotal);
- m_bitmap[1] = std::make_unique<bitmap_rgb32>(m_htotal, m_vtotal);
+ m_refresh_period = time_type(0);
+
+ m_cur_bm = 0;
- rectangle visarea(
- m_hbackporch - m_hfrontporch,
- m_hbackporch - m_hfrontporch + m_hvisible - 1,
- m_vbackporch - m_vfrontporch,
- m_vbackporch - m_vfrontporch + m_vvisible - 1);
+ m_htotal = m_monitor.m_hbackporch;
+ m_vtotal = m_monitor.m_vbackporch;
+ m_bitmap[0] = std::make_unique<bitmap_rgb32>(m_htotal * m_monitor.m_hscale, m_vtotal);
+ m_bitmap[1] = std::make_unique<bitmap_rgb32>(m_htotal * m_monitor.m_hscale, m_vtotal);
+
+ m_state.start();
+
+ // FIXME: will be done by netlist going forward
+ save_item(NAME(m_state.m_sync_signal));
+ save_item(NAME(m_state.m_last_x));
+ save_item(NAME(m_state.m_last_y));
+ save_item(NAME(m_state.m_last_sync_time));
+ save_item(NAME(m_state.m_line_time));
+ save_item(NAME(m_state.m_last_hsync_time));
+ save_item(NAME(m_state.m_last_vsync_time));
+ save_item(NAME(m_refresh_period));
+ save_item(NAME(m_state.m_clock_period));
+ //save_item(NAME(m_bitmap[0]));
+ //save_item(NAME(m_bitmap[1]));
+ save_item(NAME(m_cur_bm));
- m_clock_period = attotime::from_hz(m_monitor_clock);
+ /* sync separator */
+ save_item(NAME(m_state.m_vsync_filter));
+ save_item(NAME(m_state.m_vsync_threshold));
+ save_item(NAME(m_state.m_vsync_filter_timeconst));
- m_refresh = attotime::from_hz(m_monitor_clock) * m_vtotal * m_htotal;
- screen().configure(m_htotal, m_vtotal, visarea, m_refresh.as_attoseconds());
+ save_item(NAME(m_state.m_sig_vsync));
+ save_item(NAME(m_state.m_sig_composite));
+ save_item(NAME(m_state.m_sig_field));
}
-void fixedfreq_device::update_screen_parameters(const attotime &refresh)
+void fixedfreq_device::device_reset()
{
- rectangle visarea(
-// m_hsync - m_hvisible,
-// m_hsync - 1 ,
- m_hbackporch - m_hfrontporch,
- m_hbackporch - m_hfrontporch + m_hvisible - 1,
- m_vbackporch - m_vfrontporch,
- m_vbackporch - m_vfrontporch + m_vvisible - 1);
-
- m_refresh = refresh;
- screen().configure(m_htotal, m_vtotal, visarea, m_refresh.as_attoseconds());
+ m_state.reset();
}
-int fixedfreq_device::sync_separator(const attotime &time, double newval)
+void fixedfreq_device::device_post_load()
{
- int last_vsync = m_sig_vsync;
- int last_comp = m_sig_composite;
- int ret = 0;
-
- m_vint += ((double) last_comp - m_vint) * (1.0 - exp(-time.as_double() * m_mult));
- m_sig_composite = (newval < m_sync_threshold) ? 1 : 0 ;
-
- m_sig_vsync = (m_vint > m_int_trig) ? 1 : 0;
-
- if (!last_vsync && m_sig_vsync)
- {
- /* TODO - time since last hsync and field detection */
- ret |= 1;
- }
- if (last_vsync && !m_sig_vsync)
- {
- m_sig_field = last_comp; /* force false-progressive */
- m_sig_field = (m_sig_field ^ 1) ^ last_comp; /* if there is no field switch, auto switch */
- LOG("Field: %d\n", m_sig_field);
- }
- if (!last_comp && m_sig_composite)
- {
- /* TODO - time since last hsync and field detection */
- ret |= 2;
- }
- if (last_comp && !m_sig_composite)
- {
- /* falling composite */
- ret |= 4;
- }
- return ret;
+ //recompute_parameters();
}
uint32_t fixedfreq_device::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect)
@@ -216,72 +238,62 @@ uint32_t fixedfreq_device::screen_update(screen_device &screen, bitmap_rgb32 &bi
return 0;
}
-NETDEV_ANALOG_CALLBACK_MEMBER(fixedfreq_device::update_vid)
+void fixedfreq_device::vsync_start_cb(double refresh_time)
{
- bitmap_rgb32 *bm = m_bitmap[m_cur_bm].get();
- const int has_fields = (m_fieldcount > 1) ? 1: 0;
+ // toggle bitmap
+ m_cur_bm ^= 1;
- int pixels = round((time - m_line_time).as_double() / m_clock_period.as_double());
- attotime delta_time = (time - m_last_time);
+ rectangle visarea(m_monitor.minh(), m_monitor.maxh(), m_monitor.minv(), m_monitor.maxv());
- if (data == m_vid)
- return;
+ m_refresh_period = refresh_time;
+ screen().configure(m_htotal * m_monitor.m_hscale, m_vtotal, visarea, DOUBLE_TO_ATTOSECONDS(m_refresh_period));
+}
- ATTR_UNUSED int sync = sync_separator(delta_time, data);
+void fixedfreq_device::plot_hline(int x, int y, int w, uint32_t col)
+{
+ bitmap_rgb32 *bm = m_bitmap[m_cur_bm].get();
+ if (y < bm->height())
+ bm->plot_box(x, y, w, 1, col);
+}
- if (m_last_y < bm->height())
- {
- rgb_t col;
+NETDEV_ANALOG_CALLBACK_MEMBER(fixedfreq_device::update_composite_monochrome)
+{
+ // double is good enough for this exercise;
- if (m_vid < m_sync_threshold)
- // Mark sync areas
- col = rgb_t(255, 0, 0);
- else
- {
- int colv = (int) ((m_vid - m_sync_threshold) * m_gain * 255.0);
- if (colv > 255)
- colv = 255;
- col = rgb_t(colv, colv, colv);
- }
+ const time_type ctime = time.as_double();
+ m_state.update_composite_monochrome(ctime, data);
+}
- bm->plot_box(m_last_x, m_last_y + m_sig_field * has_fields, pixels - m_last_x, 1, col);
- m_last_x = pixels;
- }
- if (sync & 1)
- {
- LOG("VSYNC %d %d\n", pixels, m_last_y + m_sig_field);
- }
- if (sync & 2)
- {
- LOG("HSYNC up %d\n", pixels);
- //if (m_last_y == 27) printf("HSYNC up %d %d\n", m_last_y, pixels);
- }
- if (sync & 4)
- {
- LOG("HSYNC down %f %d %f\n", time.as_double()* 1e6, pixels, m_vid);
- }
+NETDEV_ANALOG_CALLBACK_MEMBER(fixedfreq_device::update_red)
+{
+ // double is good enough for this exercise;
- if (sync & 1)
- {
- m_last_y = m_vbackporch - m_vsync;
- // toggle bitmap
- m_cur_bm ^= 1;
- update_screen_parameters(time - m_last_vsync_time);
- m_last_vsync_time = time;
- }
+ const time_type ctime = time.as_double();
+ m_state.update_red(ctime, data);
+}
- // FIXME: pixels > 50 filters some spurious hysnc on line 27 in breakout
- if ((sync & 2) && !m_sig_vsync && (pixels > 100))
- {
- m_last_y += m_fieldcount;
- m_last_x = 0;
- m_line_time = time;
- }
+NETDEV_ANALOG_CALLBACK_MEMBER(fixedfreq_device::update_green)
+{
+ // double is good enough for this exercise;
+
+ const time_type ctime = time.as_double();
+ m_state.update_green(ctime, data);
+}
- m_last_time = time;
- m_vid = data;
+NETDEV_ANALOG_CALLBACK_MEMBER(fixedfreq_device::update_blue)
+{
+ // double is good enough for this exercise;
+ const time_type ctime = time.as_double();
+ m_state.update_blue(ctime, data);
}
+NETDEV_ANALOG_CALLBACK_MEMBER(fixedfreq_device::update_sync)
+{
+ // double is good enough for this exercise;
+
+ const time_type ctime = time.as_double();
+ m_state.update_sync(ctime, data);
+}
/***************************************************************************/
diff --git a/src/devices/video/fixfreq.h b/src/devices/video/fixfreq.h
index 10c52217e82..d85056d874b 100644
--- a/src/devices/video/fixfreq.h
+++ b/src/devices/video/fixfreq.h
@@ -17,139 +17,245 @@
#include "machine/netlist.h"
#include "screen.h"
+struct fixedfreq_monitor_desc
+{
+ fixedfreq_monitor_desc()
+ // default to NTSC "704x480@30i"
+ : m_monitor_clock(13500000),
+ m_hvisible(704),
+ m_hfrontporch(728),
+ m_hsync(791),
+ m_hbackporch(858),
+ m_vvisible(480),
+ m_vfrontporch(486),
+ m_vsync(492),
+ m_vbackporch(525),
+ m_fieldcount(2),
+ m_sync_threshold(0.3),
+ m_gain(1.0 / 3.7),
+ m_hscale(1)
+ {}
+
+ int minh() const { return (m_hbackporch - m_hfrontporch) * m_hscale; }
+ int maxh() const { return (m_hbackporch - m_hfrontporch + m_hvisible) * m_hscale - 1; }
+ int minv() const { return m_vbackporch - m_vfrontporch; }
+ int maxv() const { return m_vbackporch - m_vfrontporch + m_vvisible - 1; }
+
+ uint32_t m_monitor_clock;
+ int m_hvisible;
+ int m_hfrontporch;
+ int m_hsync;
+ int m_hbackporch;
+ int m_vvisible;
+ int m_vfrontporch;
+ int m_vsync;
+ int m_vbackporch;
+ int m_fieldcount;
+ double m_sync_threshold;
+ double m_gain;
+ int m_hscale;
+};
+
+struct fixedfreq_monitor_intf
+{
+ virtual ~fixedfreq_monitor_intf() = default;
+ virtual void vsync_start_cb(double refresh_time) = 0;
+ virtual void plot_hline(int x, int y, int w, uint32_t col) = 0;
+};
-#define FIXFREQ_INTERFACE(name) \
- const fixedfreq_interface (name) =
+struct fixedfreq_monitor_state
+{
+ using time_type = double;
+
+ fixedfreq_monitor_state(fixedfreq_monitor_desc &desc, fixedfreq_monitor_intf &intf)
+ : m_desc(desc),
+ m_intf(intf),
+ m_sync_signal(0),
+ m_col(0),
+ m_last_x(0),
+ m_last_y(0),
+ m_last_sync_time(time_type(0)),
+ m_line_time(time_type(0)),
+ m_last_hsync_time(time_type(0)),
+ m_last_vsync_time(time_type(0)),
+ m_clock_period(time_type(0)),
+ m_vsync_filter(0),
+ m_vsync_threshold(0),
+ m_vsync_filter_timeconst(0),
+ m_sig_vsync(0),
+ m_sig_composite(0),
+ m_sig_field(0)
+ {}
+
+ /***
+ * \brief To be called after monitor parameters are set
+ */
+ void start()
+ {
+ // FIXME: once moved to netlist this may no longer be necessary.
+ // Only copies constructor init
-#define MCFG_FIXFREQ_ADD(_tag, _screen_tag) \
- MCFG_SCREEN_ADD(_screen_tag, RASTER) \
- MCFG_SCREEN_RAW_PARAMS(13500000, 858, 0, 858, 525, 0, 525) \
- MCFG_SCREEN_UPDATE_DEVICE(_tag, fixedfreq_device, screen_update) \
- MCFG_DEVICE_ADD(_tag, FIXFREQ, 0) \
- MCFG_VIDEO_SET_SCREEN(_screen_tag)
+ m_sync_signal = 0.0;
+ m_col = rgb_t(0,0,0);
+ m_last_x = 0;
+ m_last_y = 0;
+ m_last_sync_time = time_type(0);
+ m_line_time = time_type(0);
+ m_last_hsync_time = time_type(0);
+ m_last_vsync_time = time_type(0);
+ m_clock_period = time_type(0);
-#define MCFG_FIXFREQ_MONITOR_CLOCK(_clock) \
- downcast<fixedfreq_device &>(*device).set_minitor_clock(_clock);
+ /* sync separator */
+ m_vsync_filter = 0.0;
+ m_vsync_threshold = 0.0;
+ m_vsync_filter_timeconst = 0.0;
-#define MCFG_FIXFREQ_HORZ_PARAMS(_visible, _frontporch, _sync, _backporch) \
- downcast<fixedfreq_device &>(*device).set_horz_params(_visible, _frontporch, _sync, _backporch);
+ m_sig_vsync = 0;
+ m_sig_composite = 0;
+ m_sig_field = 0;
-#define MCFG_FIXFREQ_VERT_PARAMS(_visible, _frontporch, _sync, _backporch) \
- downcast<fixedfreq_device &>(*device).set_vert_params(_visible, _frontporch, _sync, _backporch);
+ // htotal = m_desc.m_hbackporch;
+ // vtotal = m_desc.m_vbackporch;
-#define MCFG_FIXFREQ_FIELDCOUNT(_count) \
- downcast<fixedfreq_device &>(*device).set_fieldcount(_count);
+ /* sync separator */
-#define MCFG_FIXFREQ_SYNC_THRESHOLD(_threshold) \
- downcast<fixedfreq_device &>(*device).set_threshold(_threshold);
+ m_vsync_threshold = (exp(- 3.0/(3.0+3.0))) - exp(-1.0);
+ m_vsync_filter_timeconst = (double) (m_desc.m_monitor_clock) / (double) m_desc.m_hbackporch * 1.0; // / (3.0 + 3.0);
+ //LOG("trigger %f with len %f\n", m_vsync_threshold, 1e6 / m_vsync_filter_timeconst);
-#define MCFG_FIXFREQ_GAIN(_gain) \
- downcast<fixedfreq_device &>(*device).set_gain(_gain);
+ m_clock_period = 1.0 / m_desc.m_monitor_clock;
+ m_intf.vsync_start_cb(m_clock_period * m_desc.m_vbackporch * m_desc.m_hbackporch);
-// pre-defined configurations
+ }
-//ModeLine "720x480@30i" 13.5 720 736 799 858 480 486 492 525 interlace -hsync -vsync
-#define MCFG_FIXFREQ_MODE_NTSC720 \
- MCFG_FIXFREQ_MONITOR_CLOCK(13500000) \
- MCFG_FIXFREQ_HORZ_PARAMS(720, 736, 799, 858) \
- MCFG_FIXFREQ_VERT_PARAMS(480, 486, 492, 525) \
- MCFG_FIXFREQ_FIELDCOUNT(2) \
- MCFG_FIXFREQ_SYNC_THRESHOLD(0.3)
+ void reset()
+ {
+ m_last_sync_time = time_type(0);
+ m_line_time = time_type(0);
+ m_last_hsync_time = time_type(0);
+ m_last_vsync_time = time_type(0);
+ m_vsync_filter = 0;
+ }
+
+ void update_sync_channel(const time_type &time, const double newval);
+ void update_bm(const time_type &time);
+ void update_composite_monochrome(const time_type &time, const double newval);
+ void update_red(const time_type &time, const double data);
+ void update_green(const time_type &time, const double data);
+ void update_blue(const time_type &time, const double data);
+ void update_sync(const time_type &time, const double data);
-//ModeLine "704x480@30i" 13.5 704 728 791 858 480 486 492 525
-#define MCFG_FIXFREQ_MODE_NTSC704 \
- MCFG_FIXFREQ_MONITOR_CLOCK(13500000) \
- MCFG_FIXFREQ_HORZ_PARAMS(704, 728, 791, 858) \
- MCFG_FIXFREQ_VERT_PARAMS(480, 486, 492, 525) \
- MCFG_FIXFREQ_FIELDCOUNT(2) \
- MCFG_FIXFREQ_SYNC_THRESHOLD(0.3)
+ const fixedfreq_monitor_desc &m_desc;
+ fixedfreq_monitor_intf &m_intf;
+ double m_sync_signal;
+ uint32_t m_col;
+ int m_last_x;
+ int m_last_y;
+ time_type m_last_sync_time;
+ time_type m_line_time;
+ time_type m_last_hsync_time;
+ time_type m_last_vsync_time;
+ time_type m_clock_period;
+
+ /* sync separator */
+ double m_vsync_filter;
+ double m_vsync_threshold;
+ double m_vsync_filter_timeconst;
+
+ int m_sig_vsync;
+ int m_sig_composite;
+ int m_sig_field;
+
+};
-// ======================> vga_device
+// ======================> fixedfreq_device
-class fixedfreq_device : public device_t, public device_video_interface
+class fixedfreq_device : public device_t, public device_video_interface,
+ public fixedfreq_monitor_intf
{
public:
+
+ using time_type = fixedfreq_monitor_state::time_type;
+
// construction/destruction
- fixedfreq_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+ fixedfreq_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock = 0);
// inline configuration helpers
- void set_minitor_clock(uint32_t clock) { m_monitor_clock = clock; }
- void set_fieldcount(int count) { m_fieldcount = count; }
- void set_threshold(double threshold) { m_sync_threshold = threshold; }
- void set_gain(double gain) { m_gain = gain; }
+ void set_monitor_clock(uint32_t clock) { m_monitor.m_monitor_clock = clock; }
+ void set_fieldcount(int count) { m_monitor.m_fieldcount = count; }
+ void set_threshold(double threshold) { m_monitor.m_sync_threshold = threshold; }
+ void set_gain(double gain) { m_monitor.m_gain = gain; }
void set_horz_params(int visible, int frontporch, int sync, int backporch)
{
- m_hvisible = visible;
- m_hfrontporch = frontporch;
- m_hsync = sync;
- m_hbackporch = backporch;
+ m_monitor.m_hvisible = visible;
+ m_monitor.m_hfrontporch = frontporch;
+ m_monitor.m_hsync = sync;
+ m_monitor.m_hbackporch = backporch;
}
void set_vert_params(int visible, int frontporch, int sync, int backporch)
{
- m_vvisible = visible;
- m_vfrontporch = frontporch;
- m_vsync = sync;
- m_vbackporch = backporch;
+ m_monitor.m_vvisible = visible;
+ m_monitor.m_vfrontporch = frontporch;
+ m_monitor.m_vsync = sync;
+ m_monitor.m_vbackporch = backporch;
+ }
+ void set_horz_scale(int hscale) { m_monitor.m_hscale = hscale; }
+
+ // pre-defined configurations
+ void set_mode_ntsc720() //ModeLine "720x480@30i" 13.5 720 736 799 858 480 486 492 525 interlace -hsync -vsync
+ {
+ set_monitor_clock(13500000);
+ set_horz_params(720, 736, 799, 858);
+ set_vert_params(480, 486, 492, 525);
+ set_fieldcount(2);
+ set_threshold(0.3);
+ }
+ void set_mode_ntsc704() //ModeLine "704x480@30i" 13.5 704 728 791 858 480 486 492 525
+ {
+ set_monitor_clock(13500000);
+ set_horz_params(704, 728, 791, 858);
+ set_vert_params(480, 486, 492, 525);
+ set_fieldcount(2);
+ set_threshold(0.3);
}
virtual uint32_t screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
- NETDEV_ANALOG_CALLBACK_MEMBER(update_vid);
+ NETDEV_ANALOG_CALLBACK_MEMBER(update_composite_monochrome);
+ NETDEV_ANALOG_CALLBACK_MEMBER(update_red);
+ NETDEV_ANALOG_CALLBACK_MEMBER(update_green);
+ NETDEV_ANALOG_CALLBACK_MEMBER(update_blue);
+ NETDEV_ANALOG_CALLBACK_MEMBER(update_sync);
+
protected:
+
fixedfreq_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock);
// device-level overrides
+ virtual void device_config_complete() override;
virtual void device_start() override;
virtual void device_reset() override;
virtual void device_post_load() override;
//virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr);
- void recompute_parameters(bool postload);
- void update_screen_parameters(const attotime &refresh);
+ void vsync_start_cb(double refresh_time) override;
+ void plot_hline(int x, int y, int w, uint32_t col) override;
private:
- int sync_separator(const attotime &time, double newval);
-
+ std::unique_ptr<bitmap_rgb32> m_bitmap[2];
+ int m_cur_bm;
int m_htotal;
int m_vtotal;
- double m_vid;
- int m_last_x;
- int m_last_y;
- attotime m_last_time;
- attotime m_line_time;
- attotime m_last_hsync_time;
- attotime m_last_vsync_time;
- attotime m_refresh;
- attotime m_clock_period;
- std::unique_ptr<bitmap_rgb32> m_bitmap[2];
- int m_cur_bm;
+ time_type m_refresh_period;
/* adjustable by drivers */
- uint32_t m_monitor_clock;
- int m_hvisible;
- int m_hfrontporch;
- int m_hsync;
- int m_hbackporch;
- int m_vvisible;
- int m_vfrontporch;
- int m_vsync;
- int m_vbackporch;
- int m_fieldcount;
- double m_sync_threshold;
- double m_gain;
-
- /* sync separator */
- double m_vint;
- double m_int_trig;
- double m_mult;
+ fixedfreq_monitor_desc m_monitor;
+ fixedfreq_monitor_state m_state;
- int m_sig_vsync;
- int m_sig_composite;
- int m_sig_field;
};
diff --git a/src/devices/video/gba_lcd.cpp b/src/devices/video/gba_lcd.cpp
index 36c8e83b27e..36214bb1ad4 100644
--- a/src/devices/video/gba_lcd.cpp
+++ b/src/devices/video/gba_lcd.cpp
@@ -1807,11 +1807,12 @@ void gba_lcd_device::device_reset()
m_hbl_timer->adjust(attotime::never);
}
-MACHINE_CONFIG_START(gba_lcd_device::device_add_mconfig)
- MCFG_SCREEN_ADD("screen", LCD)
- MCFG_SCREEN_RAW_PARAMS(XTAL(16'777'216) / 4, 308, 0, 240, 228, 0, 160)
- MCFG_SCREEN_UPDATE_DEVICE(DEVICE_SELF, gba_lcd_device, screen_update)
- MCFG_SCREEN_PALETTE("palette")
+void gba_lcd_device::device_add_mconfig(machine_config &config)
+{
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_LCD));
+ screen.set_raw(XTAL(16'777'216) / 4, 308, 0, 240, 228, 0, 160);
+ screen.set_screen_update(FUNC(gba_lcd_device::screen_update));
+ screen.set_palette("palette");
PALETTE(config, "palette", FUNC(gba_lcd_device::gba_palette), 32768);
-MACHINE_CONFIG_END
+}
diff --git a/src/devices/video/gba_lcd.h b/src/devices/video/gba_lcd.h
index 1332340e175..ed4c258acad 100644
--- a/src/devices/video/gba_lcd.h
+++ b/src/devices/video/gba_lcd.h
@@ -26,29 +26,6 @@ DECLARE_DEVICE_TYPE(GBA_LCD, gba_lcd_device)
//**************************************************************************
-// DEVICE CONFIGURATION MACROS
-//**************************************************************************
-
-#define MCFG_GBA_LCD_ADD(_tag) \
- MCFG_DEVICE_ADD(_tag, GBA_LCD, 0)
-
-#define MCFG_GBA_LCD_INT_HBLANK(_devcb) \
- downcast<gba_lcd_device &>(*device).set_int_hblank_callback(DEVCB_##_devcb);
-
-#define MCFG_GBA_LCD_INT_VBLANK(_devcb) \
- downcast<gba_lcd_device &>(*device).set_int_vblank_callback(DEVCB_##_devcb);
-
-#define MCFG_GBA_LCD_INT_VCOUNT(_devcb) \
- downcast<gba_lcd_device &>(*device).set_int_vcount_callback(DEVCB_##_devcb);
-
-#define MCFG_GBA_LCD_DMA_HBLANK(_devcb) \
- downcast<gba_lcd_device &>(*device).set_dma_hblank_callback(DEVCB_##_devcb);
-
-#define MCFG_GBA_LCD_DMA_VBLANK(_devcb) \
- downcast<gba_lcd_device &>(*device).set_dma_vblank_callback(DEVCB_##_devcb);
-
-
-//**************************************************************************
// TYPE DEFINITIONS
//**************************************************************************
@@ -99,11 +76,11 @@ public:
TIMER_CALLBACK_MEMBER(perform_hbl);
TIMER_CALLBACK_MEMBER(perform_scan);
- template <class Object> devcb_base &set_int_hblank_callback(Object &&cb) { return m_int_hblank_cb.set_callback(std::forward<Object>(cb)); }
- template <class Object> devcb_base &set_int_vblank_callback(Object &&cb) { return m_int_vblank_cb.set_callback(std::forward<Object>(cb)); }
- template <class Object> devcb_base &set_int_vcount_callback(Object &&cb) { return m_int_vcount_cb.set_callback(std::forward<Object>(cb)); }
- template <class Object> devcb_base &set_dma_hblank_callback(Object &&cb) { return m_dma_hblank_cb.set_callback(std::forward<Object>(cb)); }
- template <class Object> devcb_base &set_dma_vblank_callback(Object &&cb) { return m_dma_vblank_cb.set_callback(std::forward<Object>(cb)); }
+ auto int_hblank_callback() { return m_int_hblank_cb.bind(); }
+ auto int_vblank_callback() { return m_int_vblank_cb.bind(); }
+ auto int_vcount_callback() { return m_int_vcount_cb.bind(); }
+ auto dma_hblank_callback() { return m_dma_hblank_cb.bind(); }
+ auto dma_vblank_callback() { return m_dma_vblank_cb.bind(); }
protected:
// device-level overrides
diff --git a/src/devices/video/hd44102.h b/src/devices/video/hd44102.h
index a484ce77478..1688a502441 100644
--- a/src/devices/video/hd44102.h
+++ b/src/devices/video/hd44102.h
@@ -12,19 +12,6 @@
#pragma once
-
-
-///*************************************************************************
-// INTERFACE CONFIGURATION MACROS
-///*************************************************************************
-
-#define MCFG_HD44102_ADD(_tag, _screen_tag, _sx, _sy) \
- MCFG_DEVICE_ADD(_tag, HD44102, 0) \
- MCFG_VIDEO_SET_SCREEN(_screen_tag) \
- downcast<hd44102_device &>(*device).set_offsets(_sx, _sy);
-
-
-
///*************************************************************************
// TYPE DEFINITIONS
///*************************************************************************
@@ -36,6 +23,14 @@ class hd44102_device : public device_t,
{
public:
// construction/destruction
+ template <typename T>
+ hd44102_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock, T &&screen_tag, int sx, int sy)
+ :hd44102_device(mconfig, tag, owner, clock)
+ {
+ set_screen(std::forward<T>(screen_tag));
+ set_offsets(sx, sy);
+ }
+
hd44102_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
// inline configuration helpers
diff --git a/src/devices/video/hd44780.h b/src/devices/video/hd44780.h
index 65544ef6828..a6572536cf1 100644
--- a/src/devices/video/hd44780.h
+++ b/src/devices/video/hd44780.h
@@ -12,18 +12,6 @@
#pragma once
-#define MCFG_HD44780_ADD( _tag ) \
- MCFG_DEVICE_ADD( _tag, HD44780, 0 )
-
-#define MCFG_KS0066_F05_ADD( _tag ) \
- MCFG_DEVICE_ADD( _tag, KS0066_F05, 0 )
-
-#define MCFG_HD44780_LCD_SIZE(_lines, _chars) \
- downcast<hd44780_device &>(*device).set_lcd_size(_lines, _chars);
-
-#define MCFG_HD44780_PIXEL_UPDATE_CB(_class, _method) \
- downcast<hd44780_device &>(*device).set_pixel_update_cb(&_class::_method, #_class "::" #_method, this);
-
//**************************************************************************
// TYPE DEFINITIONS
//**************************************************************************
diff --git a/src/devices/video/hd61830.cpp b/src/devices/video/hd61830.cpp
index 7d0427ff2ba..a608c096b1e 100644
--- a/src/devices/video/hd61830.cpp
+++ b/src/devices/video/hd61830.cpp
@@ -27,7 +27,8 @@ decltype(HD61830) HD61830B = HD61830;
// default address map
void hd61830_device::hd61830(address_map &map)
{
- map(0x0000, 0xffff).ram();
+ if (!has_configured_map(0))
+ map(0x0000, 0xffff).ram();
}
@@ -84,7 +85,7 @@ hd61830_device::hd61830_device(const machine_config &mconfig, const char *tag, d
m_cac(0),
m_blink(0),
m_cursor(0),
- m_space_config("videoram", ENDIANNESS_LITTLE, 8, 16, 0, address_map_constructor(), address_map_constructor(FUNC(hd61830_device::hd61830), this)),
+ m_space_config("videoram", ENDIANNESS_LITTLE, 8, 16, 0, address_map_constructor(FUNC(hd61830_device::hd61830), this)),
m_char_rom(*this, "hd61830")
{
}
diff --git a/src/devices/video/hd61830.h b/src/devices/video/hd61830.h
index ab4278f9d89..f8579081ac1 100644
--- a/src/devices/video/hd61830.h
+++ b/src/devices/video/hd61830.h
@@ -12,17 +12,6 @@
#pragma once
-
-
-//**************************************************************************
-// INTERFACE CONFIGURATION MACROS
-//**************************************************************************
-
-#define MCFG_HD61830_RD_CALLBACK(_read) \
- downcast<hd61830_device &>(*device).set_rd_rd_callback(DEVCB_##_read);
-
-
-
//**************************************************************************
// TYPE DEFINITIONS
//**************************************************************************
@@ -37,7 +26,7 @@ public:
// construction/destruction
hd61830_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- template <class Object> devcb_base &set_rd_rd_callback(Object &&cb) { return m_read_rd.set_callback(std::forward<Object>(cb)); }
+ auto rd_rd_callback() { return m_read_rd.bind(); }
DECLARE_READ8_MEMBER( status_r );
DECLARE_WRITE8_MEMBER( control_w );
diff --git a/src/devices/video/hd63484.h b/src/devices/video/hd63484.h
index 885761d211b..73a321fc117 100644
--- a/src/devices/video/hd63484.h
+++ b/src/devices/video/hd63484.h
@@ -13,30 +13,8 @@
#pragma once
-
-/***************************************************************************
- DEVICE CONFIGURATION MACROS
-***************************************************************************/
-
-#define MCFG_HD63484_ADD(_tag, _clock, _map) \
- MCFG_DEVICE_ADD(_tag, HD63484, _clock) \
- MCFG_DEVICE_ADDRESS_MAP(0, _map)
-
-#define MCFG_HD63484_ADDRESS_MAP(_map) \
- MCFG_DEVICE_ADDRESS_MAP(0, _map)
-
-#define MCFG_HD63484_DISPLAY_CALLBACK_OWNER(_class, _method) \
- downcast<hd63484_device &>(*device).set_display_callback(hd63484_device::display_delegate(&_class::_method, #_class "::" #_method, this));
-
-#define MCFG_HD63484_AUTO_CONFIGURE_SCREEN(_val) \
- downcast<hd63484_device &>(*device).set_auto_configure_screen(_val);
-
#define HD63484_DISPLAY_PIXELS_MEMBER(_name) void _name(bitmap_ind16 &bitmap, const rectangle &cliprect, int y, int x, uint16_t data)
-#define MCFG_HD63484_EXTERNAL_SKEW(_val) \
- downcast<hd63484_device &>(*device).set_external_skew(_val);
-
-
// ======================> hd63484_device
class hd63484_device : public device_t,
@@ -49,7 +27,7 @@ public:
// construction/destruction
hd63484_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- template <typename Object> void set_display_callback(Object &&cb) { m_display_cb = std::forward<Object>(cb); }
+ template <typename... T> void set_display_callback(T &&... args) { m_display_cb = display_delegate(std::forward<T>(args)...); }
void set_auto_configure_screen(bool auto_configure_screen) { m_auto_configure_screen = auto_configure_screen; }
void set_external_skew(int skew) { m_external_skew = skew; }
diff --git a/src/devices/video/hd66421.cpp b/src/devices/video/hd66421.cpp
index 63283f498b0..bb03b80252e 100644
--- a/src/devices/video/hd66421.cpp
+++ b/src/devices/video/hd66421.cpp
@@ -74,7 +74,8 @@ DEFINE_DEVICE_TYPE(HD66421, hd66421_device, "hd66421", "Hitachi HD66421 LCD Cont
// default address map
void hd66421_device::hd66421(address_map &map)
{
- map(0x0000, HD66421_RAM_SIZE).ram();
+ if (!has_configured_map(0))
+ map(0x0000, HD66421_RAM_SIZE).ram();
}
//-------------------------------------------------
@@ -125,7 +126,7 @@ inline void hd66421_device::writebyte(offs_t address, uint8_t data)
hd66421_device::hd66421_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
: device_t(mconfig, HD66421, tag, owner, clock)
, device_memory_interface(mconfig, *this)
- , m_space_config("videoram", ENDIANNESS_LITTLE, 8, 17, 0, address_map_constructor(), address_map_constructor(FUNC(hd66421_device::hd66421), this))
+ , m_space_config("videoram", ENDIANNESS_LITTLE, 8, 17, 0, address_map_constructor(FUNC(hd66421_device::hd66421), this))
, m_cmd(0)
, m_x(0)
, m_y(0)
diff --git a/src/devices/video/hlcd0515.cpp b/src/devices/video/hlcd0515.cpp
index b7730332bfd..87abf50bc0e 100644
--- a/src/devices/video/hlcd0515.cpp
+++ b/src/devices/video/hlcd0515.cpp
@@ -26,27 +26,23 @@ DEFINE_DEVICE_TYPE(HLCD0530, hlcd0530_device, "hlcd0530", "Hughes HLCD 0530 LCD
// constructor
//-------------------------------------------------
-hlcd0515_device::hlcd0515_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock, u8 colmax)
- : device_t(mconfig, type, tag, owner, clock)
- , m_colmax(colmax)
- , m_write_cols(*this), m_write_data(*this)
-{
-}
+hlcd0515_device::hlcd0515_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock, u8 colmax) :
+ device_t(mconfig, type, tag, owner, clock),
+ m_colmax(colmax),
+ m_write_cols(*this), m_write_data(*this)
+{ }
-hlcd0515_device::hlcd0515_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
- : hlcd0515_device(mconfig, HLCD0515, tag, owner, clock, 25)
-{
-}
+hlcd0515_device::hlcd0515_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock) :
+ hlcd0515_device(mconfig, HLCD0515, tag, owner, clock, 25)
+{ }
-hlcd0569_device::hlcd0569_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
- : hlcd0515_device(mconfig, HLCD0569, tag, owner, clock, 24)
-{
-}
+hlcd0569_device::hlcd0569_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock) :
+ hlcd0515_device(mconfig, HLCD0569, tag, owner, clock, 24)
+{ }
-hlcd0530_device::hlcd0530_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
- : hlcd0515_device(mconfig, HLCD0530, tag, owner, clock, 24)
-{
-}
+hlcd0530_device::hlcd0530_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock) :
+ hlcd0515_device(mconfig, HLCD0530, tag, owner, clock, 24)
+{ }
@@ -66,7 +62,7 @@ void hlcd0515_device::device_start()
// zerofill
m_cs = 0;
- m_pclock = 0;
+ m_clk = 0;
m_data = 0;
m_count = 0;
m_control = 0;
@@ -79,7 +75,7 @@ void hlcd0515_device::device_start()
// register for savestates
save_item(NAME(m_cs));
- save_item(NAME(m_pclock));
+ save_item(NAME(m_clk));
save_item(NAME(m_data));
save_item(NAME(m_count));
save_item(NAME(m_control));
@@ -157,12 +153,12 @@ void hlcd0515_device::clock_data(int col)
}
-WRITE_LINE_MEMBER(hlcd0515_device::write_clock)
+WRITE_LINE_MEMBER(hlcd0515_device::clock_w)
{
state = (state) ? 1 : 0;
// clock/shift data on falling edge
- if (!m_cs && !state && m_pclock)
+ if (!m_cs && !state && m_clk)
{
if (m_count < 5)
{
@@ -179,11 +175,11 @@ WRITE_LINE_MEMBER(hlcd0515_device::write_clock)
m_count++;
}
- m_pclock = state;
+ m_clk = state;
}
-WRITE_LINE_MEMBER(hlcd0515_device::write_cs)
+WRITE_LINE_MEMBER(hlcd0515_device::cs_w)
{
state = (state) ? 1 : 0;
diff --git a/src/devices/video/hlcd0515.h b/src/devices/video/hlcd0515.h
index 5018978226d..1108890a1fb 100644
--- a/src/devices/video/hlcd0515.h
+++ b/src/devices/video/hlcd0515.h
@@ -50,9 +50,9 @@ public:
auto write_cols() { return m_write_cols.bind(); } // COL/ROW pins (offset for ROW)
auto write_data() { return m_write_data.bind(); } // DATA OUT pin, don't use on HLCD0569
- DECLARE_WRITE_LINE_MEMBER(write_clock);
- DECLARE_WRITE_LINE_MEMBER(write_cs);
- DECLARE_WRITE_LINE_MEMBER(write_data) { m_data = (state) ? 1 : 0; }
+ DECLARE_WRITE_LINE_MEMBER(clock_w);
+ DECLARE_WRITE_LINE_MEMBER(cs_w);
+ DECLARE_WRITE_LINE_MEMBER(data_w) { m_data = (state) ? 1 : 0; }
protected:
hlcd0515_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock, u8 colmax);
@@ -67,7 +67,7 @@ protected:
const u8 m_colmax; // number of column pins
int m_cs; // input pin state
- int m_pclock; // "
+ int m_clk; // "
int m_data; // "
int m_count;
u8 m_control;
diff --git a/src/devices/video/hlcd0538.cpp b/src/devices/video/hlcd0538.cpp
index c409e6be528..12a188d07a0 100644
--- a/src/devices/video/hlcd0538.cpp
+++ b/src/devices/video/hlcd0538.cpp
@@ -23,22 +23,18 @@ DEFINE_DEVICE_TYPE(HLCD0539, hlcd0539_device, "hlcd0539", "Hughes HLCD 0539 LCD
// constructor
//-------------------------------------------------
-hlcd0538_device::hlcd0538_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock)
- : device_t(mconfig, type, tag, owner, clock)
- , m_write_cols(*this), m_write_interrupt(*this)
-{
-}
-
-hlcd0538_device::hlcd0538_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
- : hlcd0538_device(mconfig, HLCD0538, tag, owner, clock)
-{
-}
+hlcd0538_device::hlcd0538_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock) :
+ device_t(mconfig, type, tag, owner, clock),
+ m_write_cols(*this), m_write_interrupt(*this)
+{ }
-hlcd0539_device::hlcd0539_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
- : hlcd0538_device(mconfig, HLCD0539, tag, owner, clock)
-{
-}
+hlcd0538_device::hlcd0538_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock) :
+ hlcd0538_device(mconfig, HLCD0538, tag, owner, clock)
+{ }
+hlcd0539_device::hlcd0539_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock) :
+ hlcd0538_device(mconfig, HLCD0539, tag, owner, clock)
+{ }
//-------------------------------------------------
@@ -65,12 +61,11 @@ void hlcd0538_device::device_start()
}
-
//-------------------------------------------------
// handlers
//-------------------------------------------------
-WRITE_LINE_MEMBER(hlcd0538_device::write_clk)
+WRITE_LINE_MEMBER(hlcd0538_device::clk_w)
{
state = (state) ? 1 : 0;
@@ -81,7 +76,7 @@ WRITE_LINE_MEMBER(hlcd0538_device::write_clk)
m_clk = state;
}
-WRITE_LINE_MEMBER(hlcd0538_device::write_lcd)
+WRITE_LINE_MEMBER(hlcd0538_device::lcd_w)
{
state = (state) ? 1 : 0;
diff --git a/src/devices/video/hlcd0538.h b/src/devices/video/hlcd0538.h
index 187523e1076..bc1a78d16fc 100644
--- a/src/devices/video/hlcd0538.h
+++ b/src/devices/video/hlcd0538.h
@@ -43,15 +43,15 @@
class hlcd0538_device : public device_t
{
public:
- hlcd0538_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
+ hlcd0538_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock = 0);
// configuration helpers
- auto write_cols_callback() { return m_write_cols.bind(); } // C/R pins (0538: d0-d7 for rows)
- auto write_interrupt_callback() { return m_write_interrupt.bind(); } // INTERRUPT pin
+ auto write_cols() { return m_write_cols.bind(); } // C/R pins (0538: d0-d7 for rows)
+ auto write_interrupt() { return m_write_interrupt.bind(); } // INTERRUPT pin
- DECLARE_WRITE_LINE_MEMBER(write_clk);
- DECLARE_WRITE_LINE_MEMBER(write_lcd);
- DECLARE_WRITE_LINE_MEMBER(write_data) { m_data = (state) ? 1 : 0; }
+ DECLARE_WRITE_LINE_MEMBER(clk_w);
+ DECLARE_WRITE_LINE_MEMBER(lcd_w);
+ DECLARE_WRITE_LINE_MEMBER(data_w) { m_data = (state) ? 1 : 0; }
protected:
hlcd0538_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock);
diff --git a/src/devices/video/huc6202.h b/src/devices/video/huc6202.h
index a3e1a47b519..3ff175f0ece 100644
--- a/src/devices/video/huc6202.h
+++ b/src/devices/video/huc6202.h
@@ -12,61 +12,24 @@
#pragma once
-#define MCFG_HUC6202_NEXT_PIXEL_0_CB(_devcb) \
- downcast<huc6202_device &>(*device).set_next_pixel_0_callback(DEVCB_##_devcb);
-
-#define MCFG_HUC6202_TIME_TIL_NEXT_EVENT_0_CB(_devcb) \
- downcast<huc6202_device &>(*device).set_time_til_next_event_0_callback(DEVCB_##_devcb);
-
-#define MCFG_HUC6202_VSYNC_CHANGED_0_CB(_devcb) \
- downcast<huc6202_device &>(*device).set_vsync_changed_0_callback(DEVCB_##_devcb);
-
-#define MCFG_HUC6202_HSYNC_CHANGED_0_CB(_devcb) \
- downcast<huc6202_device &>(*device).set_hsync_changed_0_callback(DEVCB_##_devcb);
-
-#define MCFG_HUC6202_READ_0_CB(_devcb) \
- downcast<huc6202_device &>(*device).set_read_0_callback(DEVCB_##_devcb);
-
-#define MCFG_HUC6202_WRITE_0_CB(_devcb) \
- downcast<huc6202_device &>(*device).set_write_0_callback(DEVCB_##_devcb);
-
-#define MCFG_HUC6202_NEXT_PIXEL_1_CB(_devcb) \
- downcast<huc6202_device &>(*device).set_next_pixel_1_callback(DEVCB_##_devcb);
-
-#define MCFG_HUC6202_TIME_TIL_NEXT_EVENT_1_CB(_devcb) \
- downcast<huc6202_device &>(*device).set_time_til_next_event_1_callback(DEVCB_##_devcb);
-
-#define MCFG_HUC6202_VSYNC_CHANGED_1_CB(_devcb) \
- downcast<huc6202_device &>(*device).set_vsync_changed_1_callback(DEVCB_##_devcb);
-
-#define MCFG_HUC6202_HSYNC_CHANGED_1_CB(_devcb) \
- downcast<huc6202_device &>(*device).set_hsync_changed_1_callback(DEVCB_##_devcb);
-
-#define MCFG_HUC6202_READ_1_CB(_devcb) \
- downcast<huc6202_device &>(*device).set_read_1_callback(DEVCB_##_devcb);
-
-#define MCFG_HUC6202_WRITE_1_CB(_devcb) \
- downcast<huc6202_device &>(*device).set_write_1_callback(DEVCB_##_devcb);
-
-
class huc6202_device : public device_t
{
public:
// construction/destruction
huc6202_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- template <class Object> devcb_base &set_next_pixel_0_callback(Object &&cb) { return m_next_pixel_0_cb.set_callback(std::forward<Object>(cb)); }
- template <class Object> devcb_base &set_time_til_next_event_0_callback(Object &&cb) { return m_time_til_next_event_0_cb.set_callback(std::forward<Object>(cb)); }
- template <class Object> devcb_base &set_vsync_changed_0_callback(Object &&cb) { return m_vsync_changed_0_cb.set_callback(std::forward<Object>(cb)); }
- template <class Object> devcb_base &set_hsync_changed_0_callback(Object &&cb) { return m_hsync_changed_0_cb.set_callback(std::forward<Object>(cb)); }
- template <class Object> devcb_base &set_read_0_callback(Object &&cb) { return m_read_0_cb.set_callback(std::forward<Object>(cb)); }
- template <class Object> devcb_base &set_write_0_callback(Object &&cb) { return m_write_0_cb.set_callback(std::forward<Object>(cb)); }
- template <class Object> devcb_base &set_next_pixel_1_callback(Object &&cb) { return m_next_pixel_1_cb.set_callback(std::forward<Object>(cb)); }
- template <class Object> devcb_base &set_time_til_next_event_1_callback(Object &&cb) { return m_time_til_next_event_1_cb.set_callback(std::forward<Object>(cb)); }
- template <class Object> devcb_base &set_vsync_changed_1_callback(Object &&cb) { return m_vsync_changed_1_cb.set_callback(std::forward<Object>(cb)); }
- template <class Object> devcb_base &set_hsync_changed_1_callback(Object &&cb) { return m_hsync_changed_1_cb.set_callback(std::forward<Object>(cb)); }
- template <class Object> devcb_base &set_read_1_callback(Object &&cb) { return m_read_1_cb.set_callback(std::forward<Object>(cb)); }
- template <class Object> devcb_base &set_write_1_callback(Object &&cb) { return m_write_1_cb.set_callback(std::forward<Object>(cb)); }
+ auto next_pixel_0_callback() { return m_next_pixel_0_cb.bind(); }
+ auto time_til_next_event_0_callback() { return m_time_til_next_event_0_cb.bind(); }
+ auto vsync_changed_0_callback() { return m_vsync_changed_0_cb.bind(); }
+ auto hsync_changed_0_callback() { return m_hsync_changed_0_cb.bind(); }
+ auto read_0_callback() { return m_read_0_cb.bind(); }
+ auto write_0_callback() { return m_write_0_cb.bind(); }
+ auto next_pixel_1_callback() { return m_next_pixel_1_cb.bind(); }
+ auto time_til_next_event_1_callback() { return m_time_til_next_event_1_cb.bind(); }
+ auto vsync_changed_1_callback() { return m_vsync_changed_1_cb.bind(); }
+ auto hsync_changed_1_callback() { return m_hsync_changed_1_cb.bind(); }
+ auto read_1_callback() { return m_read_1_cb.bind(); }
+ auto write_1_callback() { return m_write_1_cb.bind(); }
DECLARE_READ8_MEMBER( read );
DECLARE_WRITE8_MEMBER( write );
diff --git a/src/devices/video/huc6260.h b/src/devices/video/huc6260.h
index 8737d0432cf..695f60c9a05 100644
--- a/src/devices/video/huc6260.h
+++ b/src/devices/video/huc6260.h
@@ -12,19 +12,6 @@
#pragma once
-#define MCFG_HUC6260_NEXT_PIXEL_DATA_CB(_devcb) \
- downcast<huc6260_device &>(*device).set_next_pixel_data_callback(DEVCB_##_devcb);
-
-#define MCFG_HUC6260_TIME_TIL_NEXT_EVENT_CB(_devcb) \
- downcast<huc6260_device &>(*device).set_time_til_next_event_callback(DEVCB_##_devcb);
-
-#define MCFG_HUC6260_VSYNC_CHANGED_CB(_devcb) \
- downcast<huc6260_device &>(*device).set_vsync_changed_callback(DEVCB_##_devcb);
-
-#define MCFG_HUC6260_HSYNC_CHANGED_CB(_devcb) \
- downcast<huc6260_device &>(*device).set_hsync_changed_callback(DEVCB_##_devcb);
-
-
class huc6260_device : public device_t,
public device_palette_interface,
public device_video_interface
@@ -40,10 +27,6 @@ public:
// construction/destruction
huc6260_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- template <class Object> devcb_base &set_next_pixel_data_callback(Object &&cb) { return m_next_pixel_data_cb.set_callback(std::forward<Object>(cb)); }
- template <class Object> devcb_base &set_time_til_next_event_callback(Object &&cb) { return m_time_til_next_event_cb.set_callback(std::forward<Object>(cb)); }
- template <class Object> devcb_base &set_vsync_changed_callback(Object &&cb) { return m_vsync_changed_cb.set_callback(std::forward<Object>(cb)); }
- template <class Object> devcb_base &set_hsync_changed_callback(Object &&cb) { return m_hsync_changed_cb.set_callback(std::forward<Object>(cb)); }
auto next_pixel_data() { return m_next_pixel_data_cb.bind(); }
auto time_til_next_event() { return m_time_til_next_event_cb.bind(); }
auto vsync_changed() { return m_vsync_changed_cb.bind(); }
diff --git a/src/devices/video/huc6261.h b/src/devices/video/huc6261.h
index 721ef88cc3a..33efd71fcd9 100644
--- a/src/devices/video/huc6261.h
+++ b/src/devices/video/huc6261.h
@@ -15,16 +15,6 @@
#include "video/huc6272.h"
-#define MCFG_HUC6261_VDC1(_tag) \
- downcast<huc6261_device &>(*device).set_vdc1_tag(_tag);
-
-#define MCFG_HUC6261_VDC2(_tag) \
- downcast<huc6261_device &>(*device).set_vdc2_tag(_tag);
-
-#define MCFG_HUC6261_KING(_tag) \
- downcast<huc6261_device &>(*device).set_king_tag(_tag);
-
-
class huc6261_device : public device_t,
public device_video_interface
{
diff --git a/src/devices/video/huc6270.h b/src/devices/video/huc6270.h
index 2ee9e0d6259..cd3a9f7acee 100644
--- a/src/devices/video/huc6270.h
+++ b/src/devices/video/huc6270.h
@@ -12,12 +12,6 @@
#pragma once
-#define MCFG_HUC6270_VRAM_SIZE(_size) \
- downcast<huc6270_device &>(*device).set_vram_size(_size);
-
-#define MCFG_HUC6270_IRQ_CHANGED_CB(_devcb) \
- downcast<huc6270_device &>(*device).set_irq_changed_callback(DEVCB_##_devcb);
-
class huc6270_device : public device_t
{
public:
@@ -25,7 +19,6 @@ public:
huc6270_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
void set_vram_size(uint32_t vram_size) { m_vram_size = vram_size; }
- template <class Object> devcb_base &set_irq_changed_callback(Object &&cb) { return m_irq_changed_cb.set_callback(std::forward<Object>(cb)); }
auto irq() { return m_irq_changed_cb.bind(); }
DECLARE_READ8_MEMBER( read );
diff --git a/src/devices/video/huc6271.cpp b/src/devices/video/huc6271.cpp
index 7af976a820a..9f90ba8c3b3 100644
--- a/src/devices/video/huc6271.cpp
+++ b/src/devices/video/huc6271.cpp
@@ -29,13 +29,14 @@ DEFINE_DEVICE_TYPE(HUC6271, huc6271_device, "huc6271", "Hudson HuC6271 \"Rainbow
void huc6271_device::data_map(address_map &map)
{
- map(0x000000, 0x0fffff).ram();
+ if (!has_configured_map(0))
+ map(0x000000, 0x0fffff).ram();
}
huc6271_device::huc6271_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
: device_t(mconfig, HUC6271, tag, owner, clock)
, device_memory_interface(mconfig, *this)
- , m_data_space_config("data", ENDIANNESS_LITTLE, 32, 32, 0, address_map_constructor(), address_map_constructor(FUNC(huc6271_device::data_map), this))
+ , m_data_space_config("data", ENDIANNESS_LITTLE, 32, 32, 0, address_map_constructor(FUNC(huc6271_device::data_map), this))
{
}
diff --git a/src/devices/video/huc6272.cpp b/src/devices/video/huc6272.cpp
index c6e94bb9810..0fe5ec52159 100644
--- a/src/devices/video/huc6272.cpp
+++ b/src/devices/video/huc6272.cpp
@@ -25,13 +25,17 @@ DEFINE_DEVICE_TYPE(HUC6272, huc6272_device, "huc6272", "Hudson HuC6272 \"King\""
void huc6272_device::microprg_map(address_map &map)
{
- map(0x00, 0x0f).ram().share("microprg_ram");
+ if (!has_configured_map(0))
+ map(0x00, 0x0f).ram().share("microprg_ram");
}
void huc6272_device::kram_map(address_map &map)
{
- map(0x000000, 0x0fffff).ram().share("kram_page0");
- map(0x100000, 0x1fffff).ram().share("kram_page1");
+ if (!has_configured_map(1))
+ {
+ map(0x000000, 0x0fffff).ram().share("kram_page0");
+ map(0x100000, 0x1fffff).ram().share("kram_page1");
+ }
}
@@ -49,8 +53,8 @@ huc6272_device::huc6272_device(const machine_config &mconfig, const char *tag, d
m_huc6271(*this, finder_base::DUMMY_TAG),
m_cdda_l(*this, "cdda_l"),
m_cdda_r(*this, "cdda_r"),
- m_program_space_config("microprg", ENDIANNESS_LITTLE, 16, 4, 0, address_map_constructor(), address_map_constructor(FUNC(huc6272_device::microprg_map), this)),
- m_data_space_config("kram", ENDIANNESS_LITTLE, 32, 21, 0, address_map_constructor(), address_map_constructor(FUNC(huc6272_device::kram_map), this)),
+ m_program_space_config("microprg", ENDIANNESS_LITTLE, 16, 4, 0, address_map_constructor(FUNC(huc6272_device::microprg_map), this)),
+ m_data_space_config("kram", ENDIANNESS_LITTLE, 32, 21, 0, address_map_constructor(FUNC(huc6272_device::kram_map), this)),
m_microprg_ram(*this, "microprg_ram"),
m_kram_page0(*this, "kram_page0"),
m_kram_page1(*this, "kram_page1"),
diff --git a/src/devices/video/huc6272.h b/src/devices/video/huc6272.h
index cd931a1dae9..8d7f0583600 100644
--- a/src/devices/video/huc6272.h
+++ b/src/devices/video/huc6272.h
@@ -18,17 +18,6 @@
//**************************************************************************
-// INTERFACE CONFIGURATION MACROS
-//**************************************************************************
-
-#define MCFG_HUC6272_IRQ_CHANGED_CB(cb) \
- downcast<huc6272_device &>(*device).set_irq_changed_callback((DEVCB_##cb));
-
-#define MCFG_HUC6272_RAINBOW(tag) \
- downcast<huc6272_device &>(*device).set_rainbow_tag((tag));
-
-
-//**************************************************************************
// TYPE DEFINITIONS
//**************************************************************************
@@ -41,7 +30,7 @@ public:
// construction/destruction
huc6272_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- template <class Object> devcb_base &set_irq_changed_callback(Object &&cb) { return m_irq_changed_cb.set_callback(std::forward<Object>(cb)); }
+ auto irq_changed_callback() { return m_irq_changed_cb.bind(); }
template <typename T> void set_rainbow_tag(T &&tag) { m_huc6271.set_tag(std::forward<T>(tag)); }
// I/O operations
diff --git a/src/devices/video/i8244.cpp b/src/devices/video/i8244.cpp
index 639174a84b8..a2d142b0410 100644
--- a/src/devices/video/i8244.cpp
+++ b/src/devices/video/i8244.cpp
@@ -130,6 +130,22 @@ i8245_device::i8245_device(const machine_config &mconfig, const char *tag, devic
//-------------------------------------------------
+// device_config_complete - perform any
+// operations now that the configuration is
+// complete
+//-------------------------------------------------
+
+void i8244_device::device_config_complete()
+{
+ if (!has_screen())
+ return;
+
+ if (!screen().refresh_attoseconds())
+ screen().set_raw(clock(), LINE_CLOCKS, START_ACTIVE_SCAN, END_ACTIVE_SCAN, m_screen_lines, START_Y, START_Y + SCREEN_HEIGHT);
+}
+
+
+//-------------------------------------------------
// device_start - device-specific startup
//-------------------------------------------------
diff --git a/src/devices/video/i8244.h b/src/devices/video/i8244.h
index 0bf0174cdba..2a46163073b 100644
--- a/src/devices/video/i8244.h
+++ b/src/devices/video/i8244.h
@@ -17,25 +17,6 @@
/***************************************************************************
- DEVICE CONFIGURATION MACROS
-***************************************************************************/
-
-#define MCFG_I8244_ADD(_tag, _clock, _screen_tag, _irq_cb, _postprocess_cb) \
- MCFG_DEVICE_ADD(_tag, I8244, _clock) \
- MCFG_VIDEO_SET_SCREEN(_screen_tag) \
- MCFG_I8244_IRQ_CB(_irq_cb) \
- MCFG_I8244_POSTPROCESS_CB(_postprocess_cb)
-#define MCFG_I8244_IRQ_CB(_devcb) \
- downcast<i8244_device &>(*device).set_irq_cb(DEVCB_##_devcb);
-#define MCFG_I8244_POSTPROCESS_CB(_devcb) \
- downcast<i8244_device &>(*device).set_postprocess_cb(DEVCB_##_devcb);
-#define MCFG_I8245_ADD(_tag, _clock, _screen_tag, _irq_cb, _postprocess_cb) \
- MCFG_DEVICE_ADD(_tag, I8245, _clock) \
- MCFG_VIDEO_SET_SCREEN(_screen_tag) \
- MCFG_I8244_IRQ_CB(_irq_cb) \
- MCFG_I8244_POSTPROCESS_CB(_postprocess_cb )
-
-/***************************************************************************
TYPE DEFINITIONS
***************************************************************************/
@@ -51,8 +32,8 @@ public:
i8244_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
// configuration helpers
- template <class Object> devcb_base &set_irq_cb(Object &&cb) { return m_irq_func.set_callback(std::forward<Object>(cb)); }
- template <class Object> devcb_base &set_postprocess_cb(Object &&cb) { return m_postprocess_func.set_callback(std::forward<Object>(cb)); }
+ auto irq_cb() { return m_irq_func.bind(); }
+ auto postprocess_cb() { return m_postprocess_func.bind(); }
DECLARE_READ8_MEMBER(read);
DECLARE_WRITE8_MEMBER(write);
@@ -109,6 +90,7 @@ protected:
i8244_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock, int lines);
// device-level overrides
+ virtual void device_config_complete() override;
virtual void device_start() override;
virtual void device_reset() override;
virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override;
diff --git a/src/devices/video/i8275.h b/src/devices/video/i8275.h
index 44bede3ace4..f5d6b3633bc 100644
--- a/src/devices/video/i8275.h
+++ b/src/devices/video/i8275.h
@@ -44,26 +44,6 @@
#define I8275_DRAW_CHARACTER_MEMBER(_name) void _name(bitmap_rgb32 &bitmap, int x, int y, uint8_t linecount, uint8_t charcode, uint8_t lineattr, uint8_t lten, uint8_t rvv, uint8_t vsp, uint8_t gpa, uint8_t hlgt)
-#define MCFG_I8275_CHARACTER_WIDTH(_value) \
- downcast<i8275_device &>(*device).set_character_width(_value);
-
-#define MCFG_I8275_DRAW_CHARACTER_CALLBACK_OWNER(_class, _method) \
- downcast<i8275_device &>(*device).set_display_callback(&_class::_method, #_class "::" #_method, this);
-
-#define MCFG_I8275_DRQ_CALLBACK(_write) \
- downcast<i8275_device &>(*device).set_drq_wr_callback(DEVCB_##_write);
-
-#define MCFG_I8275_IRQ_CALLBACK(_write) \
- downcast<i8275_device &>(*device).set_irq_wr_callback(DEVCB_##_write);
-
-#define MCFG_I8275_HRTC_CALLBACK(_write) \
- downcast<i8275_device &>(*device).set_hrtc_wr_callback(DEVCB_##_write);
-
-#define MCFG_I8275_VRTC_CALLBACK(_write) \
- downcast<i8275_device &>(*device).set_vrtc_wr_callback(DEVCB_##_write);
-
-
-
//**************************************************************************
// TYPE DEFINITIONS
//**************************************************************************
@@ -96,10 +76,6 @@ public:
set_display_callback(draw_character_delegate(callback, name, nullptr, static_cast<FunctionClass *>(nullptr)));
}
- template <class Object> devcb_base &set_drq_wr_callback(Object &&cb) { return m_write_drq.set_callback(std::forward<Object>(cb)); }
- template <class Object> devcb_base &set_irq_wr_callback(Object &&cb) { return m_write_irq.set_callback(std::forward<Object>(cb)); }
- template <class Object> devcb_base &set_hrtc_wr_callback(Object &&cb) { return m_write_hrtc.set_callback(std::forward<Object>(cb)); }
- template <class Object> devcb_base &set_vrtc_wr_callback(Object &&cb) { return m_write_vrtc.set_callback(std::forward<Object>(cb)); }
auto drq_wr_callback() { return m_write_drq.bind(); }
auto irq_wr_callback() { return m_write_irq.bind(); }
auto hrtc_wr_callback() { return m_write_hrtc.bind(); }
diff --git a/src/devices/video/ims_cvc.cpp b/src/devices/video/ims_cvc.cpp
index 60b76604ef5..14ae0901769 100644
--- a/src/devices/video/ims_cvc.cpp
+++ b/src/devices/video/ims_cvc.cpp
@@ -10,7 +10,7 @@
* http://bitsavers.org/components/inmos/graphics/72-TRN-204-01_Graphics_Databook_Second_Edition_1990.pdf
*
* TODO
- * - everything (skeleton only)
+ * - cursor
*/
#include "emu.h"
@@ -18,7 +18,10 @@
#include "screen.h"
-#define VERBOSE 0
+#define LOG_GENERAL (1U << 0)
+#define LOG_CONFIG (1U << 1)
+
+//#define VERBOSE (LOG_GENERAL|LOG_CONFIG)
#include "logmacro.h"
DEFINE_DEVICE_TYPE(G300, g300_device, "g300", "INMOS G300 Colour Video Controller")
@@ -27,9 +30,9 @@ DEFINE_DEVICE_TYPE(G364, g364_device, "g364", "INMOS G364 Colour Video Controlle
ims_cvc_device::ims_cvc_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock)
: device_t(mconfig, type, tag, owner, clock)
- , device_memory_interface(mconfig, *this)
, device_palette_interface(mconfig, *this)
- , m_space_config("shared", ENDIANNESS_LITTLE, 32, 24)
+ , m_screen(*this, finder_base::DUMMY_TAG)
+ , m_vram(*this, finder_base::DUMMY_TAG)
{
}
@@ -40,11 +43,12 @@ g300_device::g300_device(const machine_config &mconfig, const char *tag, device_
g332_device::g332_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock)
: ims_cvc_device(mconfig, type, tag, owner, clock)
+ , m_microport(*this, "microport")
{
}
g332_device::g332_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
- : ims_cvc_device(mconfig, G332, tag, owner, clock)
+ : g332_device(mconfig, G332, tag, owner, clock)
{
}
@@ -53,11 +57,9 @@ g364_device::g364_device(const machine_config &mconfig, const char *tag, device_
{
}
-device_memory_interface::space_config_vector ims_cvc_device::memory_space_config() const
+void g332_device::device_add_mconfig(machine_config &config)
{
- return space_config_vector{
- std::make_pair(0, &m_space_config)
- };
+ ADDRESS_MAP_BANK(config, m_microport).set_map(&g332_device::microport_map).set_options(ENDIANNESS_LITTLE, 32, 32);
}
void g300_device::map(address_map &map)
@@ -69,18 +71,18 @@ void g300_device::map(address_map &map)
map(0x000 << shift, (0x0ff << shift) | 0x3).rw(FUNC(g300_device::colour_palette_r), FUNC(g300_device::colour_palette_w));
// data path registers
- map(0x121, (0x121 << shift) | 0x3).rw(FUNC(g300_device::halfsync_r), FUNC(g300_device::halfsync_w));
- map(0x122, (0x122 << shift) | 0x3).rw(FUNC(g300_device::backporch_r), FUNC(g300_device::backporch_w));
- map(0x123, (0x123 << shift) | 0x3).rw(FUNC(g300_device::display_r), FUNC(g300_device::display_w));
- map(0x124, (0x124 << shift) | 0x3).rw(FUNC(g300_device::shortdisplay_r), FUNC(g300_device::shortdisplay_w));
- map(0x125, (0x125 << shift) | 0x3).rw(FUNC(g300_device::broadpulse_r), FUNC(g300_device::broadpulse_w));
- map(0x126, (0x126 << shift) | 0x3).rw(FUNC(g300_device::vsync_r), FUNC(g300_device::vsync_w));
- map(0x127, (0x127 << shift) | 0x3).rw(FUNC(g300_device::vblank_r), FUNC(g300_device::vblank_w));
- map(0x128, (0x128 << shift) | 0x3).rw(FUNC(g300_device::vdisplay_r), FUNC(g300_device::vdisplay_w));
- map(0x129, (0x129 << shift) | 0x3).rw(FUNC(g300_device::linetime_r), FUNC(g300_device::linetime_w));
- map(0x12a, (0x12a << shift) | 0x3).rw(FUNC(g300_device::tos_r), FUNC(g300_device::tos_w));
- map(0x12b, (0x12b << shift) | 0x3).rw(FUNC(g300_device::meminit_r), FUNC(g300_device::meminit_w));
- map(0x12c, (0x12c << shift) | 0x3).rw(FUNC(g300_device::transferdelay_r), FUNC(g300_device::transferdelay_w));
+ map(0x121 << shift, (0x121 << shift) | 0x3).rw(FUNC(g300_device::halfsync_r), FUNC(g300_device::halfsync_w));
+ map(0x122 << shift, (0x122 << shift) | 0x3).rw(FUNC(g300_device::backporch_r), FUNC(g300_device::backporch_w));
+ map(0x123 << shift, (0x123 << shift) | 0x3).rw(FUNC(g300_device::display_r), FUNC(g300_device::display_w));
+ map(0x124 << shift, (0x124 << shift) | 0x3).rw(FUNC(g300_device::shortdisplay_r), FUNC(g300_device::shortdisplay_w));
+ map(0x125 << shift, (0x125 << shift) | 0x3).rw(FUNC(g300_device::broadpulse_r), FUNC(g300_device::broadpulse_w));
+ map(0x126 << shift, (0x126 << shift) | 0x3).rw(FUNC(g300_device::vsync_r), FUNC(g300_device::vsync_w));
+ map(0x127 << shift, (0x127 << shift) | 0x3).rw(FUNC(g300_device::vblank_r), FUNC(g300_device::vblank_w));
+ map(0x128 << shift, (0x128 << shift) | 0x3).rw(FUNC(g300_device::vdisplay_r), FUNC(g300_device::vdisplay_w));
+ map(0x129 << shift, (0x129 << shift) | 0x3).rw(FUNC(g300_device::linetime_r), FUNC(g300_device::linetime_w));
+ map(0x12a << shift, (0x12a << shift) | 0x3).rw(FUNC(g300_device::tos_r), FUNC(g300_device::tos_w));
+ map(0x12b << shift, (0x12b << shift) | 0x3).rw(FUNC(g300_device::meminit_r), FUNC(g300_device::meminit_w));
+ map(0x12c << shift, (0x12c << shift) | 0x3).rw(FUNC(g300_device::transferdelay_r), FUNC(g300_device::transferdelay_w));
map(0x140 << shift, (0x140 << shift) | 0x3).rw(FUNC(g300_device::mask_r), FUNC(g300_device::mask_w));
map(0x160 << shift, (0x160 << shift) | 0x3).rw(FUNC(g300_device::control_r), FUNC(g300_device::control_w));
@@ -90,37 +92,45 @@ void g300_device::map(address_map &map)
void g332_device::map(address_map &map)
{
- // datasheet gives unshifted addresses
- const int shift = 2; // TODO: 64 bit mode
+ map(0x0000, 0x1fff).m(m_microport, FUNC(address_map_bank_device::amap32));
+}
+
+void g332_device::microport_map(address_map &map)
+{
+ // datasheet uses unshifted addresses: configure the device map for 64 bit
+ // address mode, bank device does handles additional shift for 32 bit mode
+ const int shift = 3;
- map(0x000 << shift, (0x000 << shift) | 0x3).w(FUNC(g332_device::boot_w));
+ map(0x000 << shift, (0x000 << shift) | 0x7).w(FUNC(g332_device::boot_w));
// data path registers
- map(0x021, (0x021 << shift) | 0x3).rw(FUNC(g332_device::halfsync_r), FUNC(g332_device::halfsync_w));
- map(0x022, (0x022 << shift) | 0x3).rw(FUNC(g332_device::backporch_r), FUNC(g332_device::backporch_w));
- map(0x023, (0x023 << shift) | 0x3).rw(FUNC(g332_device::display_r), FUNC(g332_device::display_w));
- map(0x024, (0x024 << shift) | 0x3).rw(FUNC(g332_device::shortdisplay_r), FUNC(g332_device::shortdisplay_w));
- map(0x025, (0x025 << shift) | 0x3).rw(FUNC(g332_device::broadpulse_r), FUNC(g332_device::broadpulse_w));
- map(0x026, (0x026 << shift) | 0x3).rw(FUNC(g332_device::vsync_r), FUNC(g332_device::vsync_w));
- map(0x027, (0x027 << shift) | 0x3).rw(FUNC(g332_device::vpreequalise_r), FUNC(g332_device::vpreequalise_w));
- map(0x028, (0x028 << shift) | 0x3).rw(FUNC(g332_device::vpostequalise_r), FUNC(g332_device::vpostequalise_w));
- map(0x029, (0x029 << shift) | 0x3).rw(FUNC(g332_device::vblank_r), FUNC(g332_device::vblank_w));
- map(0x02a, (0x02a << shift) | 0x3).rw(FUNC(g332_device::vdisplay_r), FUNC(g332_device::vdisplay_w));
- map(0x02b, (0x02b << shift) | 0x3).rw(FUNC(g332_device::linetime_r), FUNC(g332_device::linetime_w));
- map(0x02c, (0x02c << shift) | 0x3).rw(FUNC(g332_device::linestart_r), FUNC(g332_device::linestart_w));
- map(0x02d, (0x02d << shift) | 0x3).rw(FUNC(g332_device::meminit_r), FUNC(g332_device::meminit_w));
- map(0x02e, (0x02e << shift) | 0x3).rw(FUNC(g332_device::transferdelay_r), FUNC(g332_device::transferdelay_w));
-
- map(0x040 << shift, (0x040 << shift) | 0x3).rw(FUNC(g332_device::mask_r), FUNC(g332_device::mask_w));
- map(0x060 << shift, (0x060 << shift) | 0x3).rw(FUNC(g332_device::control_a_r), FUNC(g332_device::control_a_w));
- map(0x070 << shift, (0x070 << shift) | 0x3).rw(FUNC(g332_device::control_b_r), FUNC(g332_device::control_b_w));
- map(0x080 << shift, (0x080 << shift) | 0x3).rw(FUNC(g332_device::tos_r), FUNC(g332_device::tos_w));
+ map(0x021 << shift, (0x021 << shift) | 0x7).rw(FUNC(g332_device::halfsync_r), FUNC(g332_device::halfsync_w));
+ map(0x022 << shift, (0x022 << shift) | 0x7).rw(FUNC(g332_device::backporch_r), FUNC(g332_device::backporch_w));
+ map(0x023 << shift, (0x023 << shift) | 0x7).rw(FUNC(g332_device::display_r), FUNC(g332_device::display_w));
+ map(0x024 << shift, (0x024 << shift) | 0x7).rw(FUNC(g332_device::shortdisplay_r), FUNC(g332_device::shortdisplay_w));
+ map(0x025 << shift, (0x025 << shift) | 0x7).rw(FUNC(g332_device::broadpulse_r), FUNC(g332_device::broadpulse_w));
+ map(0x026 << shift, (0x026 << shift) | 0x7).rw(FUNC(g332_device::vsync_r), FUNC(g332_device::vsync_w));
+ map(0x027 << shift, (0x027 << shift) | 0x7).rw(FUNC(g332_device::vpreequalise_r), FUNC(g332_device::vpreequalise_w));
+ map(0x028 << shift, (0x028 << shift) | 0x7).rw(FUNC(g332_device::vpostequalise_r), FUNC(g332_device::vpostequalise_w));
+ map(0x029 << shift, (0x029 << shift) | 0x7).rw(FUNC(g332_device::vblank_r), FUNC(g332_device::vblank_w));
+ map(0x02a << shift, (0x02a << shift) | 0x7).rw(FUNC(g332_device::vdisplay_r), FUNC(g332_device::vdisplay_w));
+ map(0x02b << shift, (0x02b << shift) | 0x7).rw(FUNC(g332_device::linetime_r), FUNC(g332_device::linetime_w));
+ map(0x02c << shift, (0x02c << shift) | 0x7).rw(FUNC(g332_device::linestart_r), FUNC(g332_device::linestart_w));
+ map(0x02d << shift, (0x02d << shift) | 0x7).rw(FUNC(g332_device::meminit_r), FUNC(g332_device::meminit_w));
+ map(0x02e << shift, (0x02e << shift) | 0x7).rw(FUNC(g332_device::transferdelay_r), FUNC(g332_device::transferdelay_w));
+
+ map(0x040 << shift, (0x040 << shift) | 0x7).rw(FUNC(g332_device::mask_r), FUNC(g332_device::mask_w));
+ map(0x060 << shift, (0x060 << shift) | 0x7).rw(FUNC(g332_device::control_a_r), FUNC(g332_device::control_a_w));
+ map(0x070 << shift, (0x070 << shift) | 0x7).rw(FUNC(g332_device::control_b_r), FUNC(g332_device::control_b_w));
+ map(0x080 << shift, (0x080 << shift) | 0x7).rw(FUNC(g332_device::tos_r), FUNC(g332_device::tos_w));
// cursor palette (0a1-0a3)
+ map(0x0a1 << shift, (0x0a3 << shift) | 0x7).rw(FUNC(g332_device::cursor_palette_r), FUNC(g332_device::cursor_palette_w));
+
// checksum registers (0c0-0c2)
// colour palette
- map(0x100 << shift, (0x1ff << shift) | 0x3).rw(FUNC(g332_device::colour_palette_r), FUNC(g332_device::colour_palette_w));
+ map(0x100 << shift, (0x1ff << shift) | 0x7).rw(FUNC(g332_device::colour_palette_r), FUNC(g332_device::colour_palette_w));
// cursor store (200-3ff)
// cursor position (0c7)
@@ -128,13 +138,208 @@ void g332_device::map(address_map &map)
void ims_cvc_device::device_start()
{
- m_space = &space(0);
+ save_item(NAME(m_halfsync));
+ save_item(NAME(m_backporch));
+ save_item(NAME(m_display));
+ save_item(NAME(m_shortdisplay));
+ save_item(NAME(m_broadpulse));
+ save_item(NAME(m_vsync));
+ save_item(NAME(m_vblank));
+ save_item(NAME(m_vdisplay));
+ save_item(NAME(m_linetime));
+ save_item(NAME(m_meminit));
+ save_item(NAME(m_transferdelay));
+
+ save_item(NAME(m_mask));
+ save_item(NAME(m_tos));
+ save_item(NAME(m_boot));
}
void ims_cvc_device::device_reset()
{
}
-void ims_cvc_device::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect)
+void g300_device::device_start()
+{
+ ims_cvc_device::device_start();
+
+ save_item(NAME(m_control));
+}
+
+void g332_device::device_start()
+{
+ ims_cvc_device::device_start();
+
+ save_item(NAME(m_vpreequalise));
+ save_item(NAME(m_vpostequalise));
+ save_item(NAME(m_linestart));
+ save_item(NAME(m_control_a));
+ save_item(NAME(m_control_b));
+}
+
+void g332_device::device_reset()
+{
+ m_control_a = 0;
+}
+
+u32 g300_device::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect)
+{
+ offs_t address = m_tos;
+
+ for (int y = screen.visible_area().min_y; y <= screen.visible_area().max_y; y++)
+ for (int x = screen.visible_area().min_x; x <= screen.visible_area().max_x; x++)
+ bitmap.pix(y, x) = pen_color(m_vram->read(address++) & m_mask);
+
+ return 0;
+}
+
+u32 g332_device::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect)
{
+ offs_t address = m_tos;
+
+ switch (m_control_a & PIXEL_BITS)
+ {
+ case BPP_1:
+ for (int y = screen.visible_area().min_y; y <= screen.visible_area().max_y; y++)
+ for (int x = screen.visible_area().min_x; x <= screen.visible_area().max_x; x += 8)
+ {
+ u8 pixel_data = m_vram->read(address++);
+
+ bitmap.pix(y, x + 0) = pen_color(pixel_data & 0x1 & m_mask); pixel_data >>= 1;
+ bitmap.pix(y, x + 1) = pen_color(pixel_data & 0x1 & m_mask); pixel_data >>= 1;
+ bitmap.pix(y, x + 2) = pen_color(pixel_data & 0x1 & m_mask); pixel_data >>= 1;
+ bitmap.pix(y, x + 3) = pen_color(pixel_data & 0x1 & m_mask); pixel_data >>= 1;
+ bitmap.pix(y, x + 4) = pen_color(pixel_data & 0x1 & m_mask); pixel_data >>= 1;
+ bitmap.pix(y, x + 5) = pen_color(pixel_data & 0x1 & m_mask); pixel_data >>= 1;
+ bitmap.pix(y, x + 6) = pen_color(pixel_data & 0x1 & m_mask); pixel_data >>= 1;
+ bitmap.pix(y, x + 7) = pen_color(pixel_data & 0x1 & m_mask);
+ }
+ break;
+
+ case BPP_2:
+ for (int y = screen.visible_area().min_y; y <= screen.visible_area().max_y; y++)
+ for (int x = screen.visible_area().min_x; x <= screen.visible_area().max_x; x += 4)
+ {
+ u8 pixel_data = m_vram->read(address++);
+
+ bitmap.pix(y, x + 0) = pen_color(pixel_data & 0x3 & m_mask); pixel_data >>= 2;
+ bitmap.pix(y, x + 1) = pen_color(pixel_data & 0x3 & m_mask); pixel_data >>= 2;
+ bitmap.pix(y, x + 2) = pen_color(pixel_data & 0x3 & m_mask); pixel_data >>= 2;
+ bitmap.pix(y, x + 3) = pen_color(pixel_data & 0x3 & m_mask);
+ }
+ break;
+
+ case BPP_4:
+ for (int y = screen.visible_area().min_y; y <= screen.visible_area().max_y; y++)
+ for (int x = screen.visible_area().min_x; x <= screen.visible_area().max_x; x += 2)
+ {
+ u8 pixel_data = m_vram->read(address++);
+
+ bitmap.pix(y, x + 0) = pen_color(pixel_data & 0xf & m_mask); pixel_data >>= 4;
+ bitmap.pix(y, x + 1) = pen_color(pixel_data & 0xf & m_mask);
+ }
+ break;
+
+ case BPP_8:
+ for (int y = screen.visible_area().min_y; y <= screen.visible_area().max_y; y++)
+ for (int x = screen.visible_area().min_x; x <= screen.visible_area().max_x; x++)
+ bitmap.pix(y, x) = pen_color(m_vram->read(address++) & m_mask);
+ break;
+ }
+
+ return 0;
+}
+
+u32 ims_cvc_device::colour_palette_r(offs_t offset)
+{
+ return 0;
+}
+
+void ims_cvc_device::colour_palette_w(offs_t offset, u32 data, u32 mem_mask)
+{
+ set_pen_color(offset >> 1, data >> 16, data >> 8, data >> 0);
+}
+
+u32 g332_device::cursor_palette_r(offs_t offset)
+{
+ return 0;
+}
+
+void g332_device::cursor_palette_w(offs_t offset, u32 data, u32 mem_mask)
+{
+ set_pen_color(256 + (offset >> 1), data >> 16, data >> 8, data >> 0);
+}
+
+void g332_device::boot_w(offs_t offset, u32 data, u32 mem_mask)
+{
+ LOG("boot_w %s clock, multiplier %d, %d bit alignment (%s)\n",
+ (data & PLL_SELECT) ? "PLL" : "external", (data & PLL_MULTIPLIER),
+ (data & ALIGN_64) ? 64 : 32, machine().describe_context());
+
+ m_microport->set_shift((data & ALIGN_64) ? 0 : 1);
+
+ mem_mask &= 0x00ffffffU;
+ COMBINE_DATA(&m_boot);
+}
+
+void g332_device::control_a_w(offs_t offset, u32 data, u32 mem_mask)
+{
+ LOG("control_a_w 0x%08x (%s)\n", data, machine().describe_context());
+
+ mem_mask &= 0x00ffffffU;
+ COMBINE_DATA(&m_control_a);
+
+ if (data & VTG_ENABLE)
+ {
+ LOGMASKED(LOG_CONFIG, "VTG %s, %s, %s mode\n",
+ (data & VTG_ENABLE) ? "enabled" : "disabled",
+ (data & INTL_ENABLE) ? ((data & INTL_FORMAT) ? "interlaced (CCIR)" : "interlaced (EIA)") : "non-interlaced",
+ (data & SLAVE_MODE) ? "slave" : "master");
+
+ LOGMASKED(LOG_CONFIG, "%s sync, %s digital sync, analogue %s\n",
+ (data & SYNC_PATTERN) ? "plain" : "tesselated",
+ (data & SYNC_FORMAT) ? "separate" : "composite",
+ (data & VIDEO_FORMAT) ? "video only" : "composite video + sync");
+
+ LOGMASKED(LOG_CONFIG, "%s, CBlank is %s, %s, %s\n",
+ (data & BLANK_LEVEL) ? "blanking pedestal" : "no blank pedestal",
+ (data & BLANK_IO) ? "ouput" : "input",
+ (data & BLANK_FUNC) ? "undelayed ClkDisable" : "delayed CBlank",
+ (data & BLANK_FORCE) ? "screen blanked" : (data & BLANK_DISABLE) ? "blanking disabled" : "blanking enabled");
+
+ LOGMASKED(LOG_CONFIG, "address increment %d, DMA %s, sync delay %d cycles\n",
+ (data & ADDR_INC) == INC_1 ? 1 :
+ (data & ADDR_INC) == INC_256 ? (data & INTL_ENABLE) ? 2 : 256 :
+ (data & ADDR_INC) == INC_512 ? 512 : 1024,
+ (data & DMA_DISABLE) ? "disabled" : "enabled",
+ (data & SYNC_DELAY) >> 15);
+
+ LOGMASKED(LOG_CONFIG, "interleave %s, pixel sampling %s, %s bits per pixel, cursor %s\n",
+ (data & INTERLEAVE) ? "enabled" : "disabled",
+ (data & SAMPLE_DELAY) ? "delayed" : "standard",
+ (data & PIXEL_BITS) == BPP_1 ? "1" :
+ (data & PIXEL_BITS) == BPP_2 ? "2" :
+ (data & PIXEL_BITS) == BPP_4 ? "4" :
+ (data & PIXEL_BITS) == BPP_8 ? "8" :
+ (data & PIXEL_BITS) == BPP_15 ? "15" :
+ (data & PIXEL_BITS) == BPP_16 ? "16" : "unknown",
+ (data & CURSOR_DISABLE) ? "disabled" : "enabled");
+
+ LOG("display %d vdisplay %d\n", m_display, m_vdisplay);
+ LOG("linetime %d halfsync %d backporch %d broadpulse %d\n", m_linetime, m_halfsync, m_backporch, m_broadpulse);
+ LOG("vsync %d vpreequalise %d vpostequalise %d vblank %d\n", m_vsync, m_vpreequalise, m_vpostequalise, m_vblank);
+
+ int const hbend = (m_halfsync + m_halfsync + m_backporch) << 2;
+ int const vbend = (m_vpreequalise + m_vpostequalise + m_vsync + m_vblank) >> 1;
+ int const width = m_linetime << 2;
+ int const height = vbend + (m_vdisplay >> 1);
+
+ rectangle const visarea(hbend, hbend + (m_display << 2) - 1, vbend, height - 1);
+
+ u32 const dotclock = (m_boot & PLL_SELECT) ? clock() * (m_boot & PLL_MULTIPLIER) : clock();
+ attotime const refresh = attotime::from_hz(dotclock / (width * height));
+
+ m_screen->configure(width, height, visarea, refresh.as_attoseconds());
+ m_screen->reset_origin();
+ }
}
diff --git a/src/devices/video/ims_cvc.h b/src/devices/video/ims_cvc.h
index 25c0163642d..82acfe5c6eb 100644
--- a/src/devices/video/ims_cvc.h
+++ b/src/devices/video/ims_cvc.h
@@ -5,15 +5,22 @@
#pragma once
-class ims_cvc_device :
- public device_t,
- public device_memory_interface,
- public device_palette_interface
+#include "machine/bankdev.h"
+#include "machine/ram.h"
+
+class ims_cvc_device
+ : public device_t
+ , public device_palette_interface
{
public:
- virtual void map(address_map &map) = 0;
+ static constexpr feature_type imperfect_features() { return feature::GRAPHICS; }
+
+ // configuration
+ template <typename T> void set_screen(T &&tag) { m_screen.set_tag(std::forward<T>(tag)); }
+ template <typename T> void set_vram(T &&tag) { m_vram.set_tag(std::forward<T>(tag)); }
- void screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
+ virtual void map(address_map &map) = 0;
+ virtual u32 screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect) = 0;
protected:
ims_cvc_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock);
@@ -22,51 +29,47 @@ protected:
virtual void device_start() override;
virtual void device_reset() override;
- // device_memory_interface overrides
- virtual space_config_vector memory_space_config() const override;
-
// device_palette_interface overrides
- virtual u32 palette_entries() const override { return 256; } // FIXME
+ virtual u32 palette_entries() const override { return 256; }
- u32 colour_palette_r(const offs_t offset) { return 0; }
- void colour_palette_w(const offs_t offset, const u32 data) {}
+ u32 colour_palette_r(const offs_t offset);
+ void colour_palette_w(offs_t offset, u32 data, u32 mem_mask = 0xffffffffU);
u32 halfsync_r() { return m_halfsync; }
- void halfsync_w(const u32 data) { m_halfsync = data; }
+ void halfsync_w(offs_t offset, u32 data, u32 mem_mask = 0xffffffffU) { COMBINE_DATA(&m_halfsync); }
u32 backporch_r() { return m_backporch; }
- void backporch_w(const u32 data) { m_backporch = data; }
+ void backporch_w(offs_t offset, u32 data, u32 mem_mask = 0xffffffffU) { COMBINE_DATA(&m_backporch); }
u32 display_r() { return m_display; }
- void display_w(const u32 data) { m_display = data; }
+ void display_w(offs_t offset, u32 data, u32 mem_mask = 0xffffffffU) { COMBINE_DATA(&m_display); }
u32 shortdisplay_r() { return m_shortdisplay; }
- void shortdisplay_w(const u32 data) { m_shortdisplay = data; }
+ void shortdisplay_w(offs_t offset, u32 data, u32 mem_mask = 0xffffffffU) { COMBINE_DATA(&m_shortdisplay); }
u32 broadpulse_r() { return m_broadpulse; }
- void broadpulse_w(const u32 data) { m_broadpulse = data; }
+ void broadpulse_w(offs_t offset, u32 data, u32 mem_mask = 0xffffffffU) { COMBINE_DATA(&m_broadpulse); }
u32 vsync_r() { return m_vsync; }
- void vsync_w(const u32 data) { m_vsync = data; }
+ void vsync_w(offs_t offset, u32 data, u32 mem_mask = 0xffffffffU) { COMBINE_DATA(&m_vsync); }
u32 vblank_r() { return m_vblank; }
- void vblank_w(const u32 data) { m_vblank = data; }
+ void vblank_w(offs_t offset, u32 data, u32 mem_mask = 0xffffffffU) { COMBINE_DATA(&m_vblank); }
u32 vdisplay_r() { return m_vdisplay; }
- void vdisplay_w(const u32 data) { m_vdisplay = data; }
+ void vdisplay_w(offs_t offset, u32 data, u32 mem_mask = 0xffffffffU) { COMBINE_DATA(&m_vdisplay); }
u32 linetime_r() { return m_linetime; }
- void linetime_w(const u32 data) { m_linetime = data; }
+ void linetime_w(offs_t offset, u32 data, u32 mem_mask = 0xffffffffU) { COMBINE_DATA(&m_linetime); }
//u32 tos_r() { return m_tos; }
//void tos_w(const u32 data) { m_tos = data; }
u32 meminit_r() { return m_meminit; }
- void meminit_w(const u32 data) { m_meminit = data; }
+ void meminit_w(offs_t offset, u32 data, u32 mem_mask = 0xffffffffU) { COMBINE_DATA(&m_meminit); }
u32 transferdelay_r() { return m_transferdelay; }
- void transferdelay_w(const u32 data) { m_transferdelay = data; }
+ void transferdelay_w(offs_t offset, u32 data, u32 mem_mask = 0xffffffffU) { COMBINE_DATA(&m_transferdelay); }
u32 mask_r() { return m_mask; }
- void mask_w(const u32 data) { m_mask = data; }
+ void mask_w(offs_t offset, u32 data, u32 mem_mask = 0xffffffffU) { COMBINE_DATA(&m_mask); }
u32 tos_r() { return m_tos; }
- void tos_w(const u32 data) { m_tos = data; }
+ void tos_w(offs_t offset, u32 data, u32 mem_mask = 0xffffffffU) { COMBINE_DATA(&m_tos); }
- void boot_w(const u32 data) { m_boot = data; }
+ virtual void boot_w(offs_t offset, u32 data, u32 mem_mask = 0xffffffffU) { COMBINE_DATA(&m_boot); }
-private:
- // device_memory_interface members
- const address_space_config m_space_config;
- address_space *m_space;
+ required_device<screen_device> m_screen;
+ required_device<ram_device> m_vram;
+protected:
// device state
u32 m_halfsync;
u32 m_backporch;
@@ -92,9 +95,13 @@ public:
virtual void map(address_map &map) override;
+ virtual u32 screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect) override;
+
protected:
+ virtual void device_start() override;
+
u32 control_r() { return m_control; }
- void control_w(const u32 data) { m_control = data; }
+ void control_w(offs_t offset, u32 data, u32 mem_mask = 0xffffffffU) { COMBINE_DATA(&m_control); }
private:
u32 m_control;
@@ -107,21 +114,86 @@ public:
virtual void map(address_map &map) override;
+ virtual u32 screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect) override;
+
+ enum boot_mask : u32
+ {
+ PLL_MULTIPLIER = 0x000001f, // pll multiplier
+ PLL_SELECT = 0x0000020, // pll clock select
+ ALIGN_64 = 0x0000040, // 64 bit address alignment
+ };
+
+ enum control_a_mask
+ {
+ VTG_ENABLE = 0x000001, // video timing generator enable
+ INTL_ENABLE = 0x000002, // interlace enable
+ INTL_FORMAT = 0x000004, // ccir/eia interlace format
+ SLAVE_MODE = 0x000008, // slave/master operating mode
+ SYNC_PATTERN = 0x000010, // plain/tesselated sync
+ SYNC_FORMAT = 0x000020, // separate/composite sync
+ VIDEO_FORMAT = 0x000040, // video only/composite video + sync
+ BLANK_LEVEL = 0x000080, // blanking pedestal/no blank pedestal
+ BLANK_IO = 0x000100, // CBlank is output/input
+ BLANK_FUNC = 0x000200, // undelayed ClkDisable/delayed CBlank
+ BLANK_FORCE = 0x000400, // screen blanked/no action
+ BLANK_DISABLE = 0x000800, // blanking disabled/enabled
+ ADDR_INC = 0x003000, // VRAM address increment
+ DMA_DISABLE = 0x004000, // DMA disabled/enabled
+ SYNC_DELAY = 0x038000,
+ INTERLEAVE = 0x040000, // interleave enabled/disabled
+ SAMPLE_DELAY = 0x080000,
+ PIXEL_BITS = 0x700000, // bits per pixel
+ CURSOR_DISABLE = 0x800000, // cursor disabled/enabled
+ };
+ enum control_a_addr_inc_mask
+ {
+ INC_1 = 0x000000,
+ INC_256 = 0x001000,
+ INC_512 = 0x002000,
+ INC_1024 = 0x003000,
+ };
+ enum control_a_bpp_mask
+ {
+ BPP_1 = 0x000000,
+ BPP_2 = 0x100000,
+ BPP_4 = 0x200000,
+ BPP_8 = 0x300000,
+ BPP_15 = 0x400000,
+ BPP_16 = 0x500000,
+ };
+
protected:
g332_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock);
+ // device_t overrides
+ virtual void device_add_mconfig(machine_config &config) override;
+ virtual void device_start() override;
+ virtual void device_reset() override;
+
+ // device_palette_interface overrides
+ virtual u32 palette_entries() const override { return 256 + 3; }
+
+ virtual void microport_map(address_map &map);
+
+ virtual void boot_w(offs_t offset, u32 data, u32 mem_mask = 0x00ffffffU) override;
+
+ u32 cursor_palette_r(const offs_t offset);
+ void cursor_palette_w(offs_t offset, u32 data, u32 mem_mask = 0xffffffffU);
+
u32 vpreequalise_r() { return m_vpreequalise; }
- void vpreequalise_w(const u32 data) { m_vpreequalise = data; }
+ void vpreequalise_w(offs_t offset, u32 data, u32 mem_mask = 0xffffffffU) { COMBINE_DATA(&m_vpreequalise); }
u32 vpostequalise_r() { return m_vpostequalise; }
- void vpostequalise_w(const u32 data) { m_vpostequalise = data; }
+ void vpostequalise_w(offs_t offset, u32 data, u32 mem_mask = 0xffffffffU) { COMBINE_DATA(&m_vpostequalise); }
u32 linestart_r() { return m_linestart; }
- void linestart_w(const u32 data) { m_linestart = data; }
+ void linestart_w(offs_t offset, u32 data, u32 mem_mask = 0xffffffffU) { COMBINE_DATA(&m_linestart); }
u32 control_a_r() { return m_control_a; }
- void control_a_w(const u32 data) { m_control_a = data; }
+ void control_a_w(offs_t offset, u32 data, u32 mem_mask = 0xffffffffU);
u32 control_b_r() { return m_control_b; }
- void control_b_w(const u32 data) { m_control_b = data; }
+ void control_b_w(offs_t offset, u32 data, u32 mem_mask = 0xffffffffU) { COMBINE_DATA(&m_control_b); }
private:
+ required_device<address_map_bank_device> m_microport;
+
u32 m_vpreequalise;
u32 m_vpostequalise;
u32 m_linestart;
diff --git a/src/devices/video/jangou_blitter.h b/src/devices/video/jangou_blitter.h
index 3ff34b50ae7..8bf4f4a56ec 100644
--- a/src/devices/video/jangou_blitter.h
+++ b/src/devices/video/jangou_blitter.h
@@ -7,14 +7,6 @@
#pragma once
-
-//**************************************************************************
-// INTERFACE CONFIGURATION MACROS
-//**************************************************************************
-
-#define MCFG_JANGOU_BLITTER_ADD(_tag,_freq) \
- MCFG_DEVICE_ADD(_tag, JANGOU_BLITTER, _freq)
-
//**************************************************************************
// TYPE DEFINITIONS
//**************************************************************************
diff --git a/src/devices/video/m50458.cpp b/src/devices/video/m50458.cpp
index 41a6bd1651f..59e0f44cc43 100644
--- a/src/devices/video/m50458.cpp
+++ b/src/devices/video/m50458.cpp
@@ -31,15 +31,18 @@ DEFINE_DEVICE_TYPE(M50458, m50458_device, "m50458", "Mitsubishi M50458 OSD")
void m50458_device::m50458_vram(address_map &map)
{
- map(0x0000, 0x023f).ram(); // vram
- map(0x0240, 0x0241).w(FUNC(m50458_device::vreg_120_w));
- map(0x0242, 0x0243).w(FUNC(m50458_device::vreg_121_w));
- map(0x0244, 0x0245).w(FUNC(m50458_device::vreg_122_w));
- map(0x0246, 0x0247).w(FUNC(m50458_device::vreg_123_w));
- map(0x0248, 0x0249).w(FUNC(m50458_device::vreg_124_w));
- map(0x024a, 0x024b).w(FUNC(m50458_device::vreg_125_w));
- map(0x024c, 0x024d).w(FUNC(m50458_device::vreg_126_w));
- map(0x024e, 0x024f).w(FUNC(m50458_device::vreg_127_w));
+ if (!has_configured_map(0))
+ {
+ map(0x0000, 0x023f).ram(); // vram
+ map(0x0240, 0x0241).w(FUNC(m50458_device::vreg_120_w));
+ map(0x0242, 0x0243).w(FUNC(m50458_device::vreg_121_w));
+ map(0x0244, 0x0245).w(FUNC(m50458_device::vreg_122_w));
+ map(0x0246, 0x0247).w(FUNC(m50458_device::vreg_123_w));
+ map(0x0248, 0x0249).w(FUNC(m50458_device::vreg_124_w));
+ map(0x024a, 0x024b).w(FUNC(m50458_device::vreg_125_w));
+ map(0x024c, 0x024d).w(FUNC(m50458_device::vreg_126_w));
+ map(0x024e, 0x024f).w(FUNC(m50458_device::vreg_127_w));
+ }
}
// internal GFX ROM (TODO: GFXs in here should be 12x18, not 16x18)
@@ -180,7 +183,7 @@ m50458_device::m50458_device(const machine_config &mconfig, const char *tag, dev
: device_t(mconfig, M50458, tag, owner, clock)
, device_memory_interface(mconfig, *this)
, device_video_interface(mconfig, *this)
- , m_space_config("videoram", ENDIANNESS_LITTLE, 16, 16, 0, address_map_constructor(), address_map_constructor(FUNC(m50458_device::m50458_vram), this))
+ , m_space_config("videoram", ENDIANNESS_LITTLE, 16, 16, 0, address_map_constructor(FUNC(m50458_device::m50458_vram), this))
{
}
diff --git a/src/devices/video/m50458.h b/src/devices/video/m50458.h
index 5be6ceaf08c..07113a93afe 100644
--- a/src/devices/video/m50458.h
+++ b/src/devices/video/m50458.h
@@ -12,16 +12,6 @@ Mitsubishi M50458 OSD chip
#pragma once
-
-//**************************************************************************
-// INTERFACE CONFIGURATION MACROS
-//**************************************************************************
-
-#define MCFG_M50458_ADD(_tag,_freq,_screen) \
- MCFG_DEVICE_ADD(_tag, M50458,_freq) \
- MCFG_VIDEO_SET_SCREEN(_screen)
-
-
//**************************************************************************
// TYPE DEFINITIONS
//**************************************************************************
@@ -34,6 +24,13 @@ class m50458_device : public device_t,
{
public:
// construction/destruction
+ template <typename T>
+ m50458_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock, T &&screen_tag)
+ : m50458_device(mconfig, tag, owner, clock)
+ {
+ set_screen(std::forward<T>(screen_tag));
+ }
+
m50458_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
// I/O operations
diff --git a/src/devices/video/mb88303.h b/src/devices/video/mb88303.h
index 9c088d8d56b..f8804adff61 100644
--- a/src/devices/video/mb88303.h
+++ b/src/devices/video/mb88303.h
@@ -26,21 +26,6 @@
#pragma once
-
-//**************************************************************************
-// INTERFACE CONFIGURATION MACROS
-//**************************************************************************
-
-#define MCFG_MB88303_VOW_CALLBACK(_write) \
- downcast<mb88303_device &>(*device).set_vow_callback(DEVCB_##_write);
-
-#define MCFG_MB88303_VOBN_CALLBACK(_write) \
- downcast<mb88303_device &>(*device).set_vob_n_callback(DEVCB_##_write);
-
-#define MCFG_MB88303_DO_CALLBACK(_write) \
- downcast<mb88303_device &>(*device).set_do_callback(DEVCB_##_write);
-
-
//**************************************************************************
// TYPE DEFINITIONS
//**************************************************************************
@@ -56,9 +41,9 @@ public:
// construction/destruction
mb88303_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- template <class Object> devcb_base &set_vow_callback(Object &&cb) { return m_write_vow.set_callback(std::forward<Object>(cb)); }
- template <class Object> devcb_base &set_vobn_callback(Object &&cb) { return m_write_vobn.set_callback(std::forward<Object>(cb)); }
- template <class Object> devcb_base &set_do_callback(Object &&cb) { return m_write_do.set_callback(std::forward<Object>(cb)); }
+ auto vow_callback() { return m_write_vow.bind(); }
+ auto vobn_callback() { return m_write_vobn.bind(); }
+ auto do_callback() { return m_write_do.bind(); }
DECLARE_WRITE8_MEMBER(da_w);
DECLARE_WRITE_LINE_MEMBER(adm_w);
diff --git a/src/devices/video/mb90082.cpp b/src/devices/video/mb90082.cpp
index a3026aeb179..957669fb48b 100644
--- a/src/devices/video/mb90082.cpp
+++ b/src/devices/video/mb90082.cpp
@@ -25,10 +25,13 @@ DEFINE_DEVICE_TYPE(MB90082, mb90082_device, "mb90082", "Fujitsu MB90082 OSD")
void mb90082_device::mb90082_vram(address_map &map)
{
- map(0x0000, 0x023f).ram(); // main screen vram
- map(0x0400, 0x063f).ram(); // main screen attr
+ if (!has_configured_map(0))
+ {
+ map(0x0000, 0x023f).ram(); // main screen vram
+ map(0x0400, 0x063f).ram(); // main screen attr
// AM_RANGE(0x0800, 0x0a3f) AM_RAM // sub screen vram
// AM_RANGE(0x0c00, 0x0e3f) AM_RAM // sub screen attr
+ }
}
/* charset is undumped, but apparently a normal ASCII one is enough for the time being (for example "fnt0808.x1" in Sharp X1) */
@@ -91,7 +94,7 @@ inline void mb90082_device::write_word(offs_t address, uint16_t data)
mb90082_device::mb90082_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
: device_t(mconfig, MB90082, tag, owner, clock)
, device_memory_interface(mconfig, *this)
- , m_space_config("videoram", ENDIANNESS_LITTLE, 16, 16, 0, address_map_constructor(), address_map_constructor(FUNC(mb90082_device::mb90082_vram), this))
+ , m_space_config("videoram", ENDIANNESS_LITTLE, 16, 16, 0, address_map_constructor(FUNC(mb90082_device::mb90082_vram), this))
{
}
diff --git a/src/devices/video/mb90082.h b/src/devices/video/mb90082.h
index 3fa203f385f..5c6d2c46df3 100644
--- a/src/devices/video/mb90082.h
+++ b/src/devices/video/mb90082.h
@@ -12,14 +12,6 @@
#pragma once
-
-//**************************************************************************
-// INTERFACE CONFIGURATION MACROS
-//**************************************************************************
-
-#define MCFG_MB90082_ADD(_tag,_freq) \
- MCFG_DEVICE_ADD(_tag, MB90082, _freq)
-
//**************************************************************************
// TYPE DEFINITIONS
//**************************************************************************
diff --git a/src/devices/video/mb_vcu.cpp b/src/devices/video/mb_vcu.cpp
index 8d0f921be12..96acc945359 100644
--- a/src/devices/video/mb_vcu.cpp
+++ b/src/devices/video/mb_vcu.cpp
@@ -38,16 +38,20 @@ DEFINE_DEVICE_TYPE(MB_VCU, mb_vcu_device, "mb_vcu", "Mazer Blazer custom VCU")
void mb_vcu_device::mb_vcu_vram(address_map &map)
{
- map(0x00000, 0x7ffff).ram(); // enough for a 256x256x4 x 2 pages of framebuffer with 4 layers (TODO: doubled for simplicity)
+ if (!has_configured_map(0))
+ map(0x00000, 0x7ffff).ram(); // enough for a 256x256x4 x 2 pages of framebuffer with 4 layers (TODO: doubled for simplicity)
}
void mb_vcu_device::mb_vcu_pal_ram(address_map &map)
{
- map(0x0000, 0x00ff).ram();
- map(0x0200, 0x02ff).ram();
- map(0x0400, 0x04ff).ram();
- map(0x0600, 0x06ff).rw(FUNC(mb_vcu_device::mb_vcu_paletteram_r), FUNC(mb_vcu_device::mb_vcu_paletteram_w));
+ if (!has_configured_map(1))
+ {
+ map(0x0000, 0x00ff).ram();
+ map(0x0200, 0x02ff).ram();
+ map(0x0400, 0x04ff).ram();
+ map(0x0600, 0x06ff).rw(FUNC(mb_vcu_device::mb_vcu_paletteram_r), FUNC(mb_vcu_device::mb_vcu_paletteram_w));
+ }
}
READ8_MEMBER( mb_vcu_device::mb_vcu_paletteram_r )
@@ -64,19 +68,19 @@ WRITE8_MEMBER( mb_vcu_device::mb_vcu_paletteram_w )
/* red component */
bit1 = (m_palram[offset] >> 7) & 0x01;
bit0 = (m_palram[offset] >> 6) & 0x01;
- r = combine_2_weights(m_weights_r, bit0, bit1);
+ r = combine_weights(m_weights_r, bit0, bit1);
/* green component */
bit2 = (m_palram[offset] >> 5) & 0x01;
bit1 = (m_palram[offset] >> 4) & 0x01;
bit0 = (m_palram[offset] >> 3) & 0x01;
- g = combine_3_weights(m_weights_g, bit0, bit1, bit2);
+ g = combine_weights(m_weights_g, bit0, bit1, bit2);
/* blue component */
bit2 = (m_palram[offset] >> 2) & 0x01;
bit1 = (m_palram[offset] >> 1) & 0x01;
bit0 = (m_palram[offset] >> 0) & 0x01;
- b = combine_3_weights(m_weights_b, bit0, bit1, bit2);
+ b = combine_weights(m_weights_b, bit0, bit1, bit2);
m_palette->set_pen_color(offset, rgb_t(r, g, b));
}
@@ -147,8 +151,8 @@ mb_vcu_device::mb_vcu_device(const machine_config &mconfig, const char *tag, dev
: device_t(mconfig, MB_VCU, tag, owner, clock)
, device_memory_interface(mconfig, *this)
, device_video_interface(mconfig, *this)
- , m_videoram_space_config("videoram", ENDIANNESS_LITTLE, 8, 19, 0, address_map_constructor(), address_map_constructor(FUNC(mb_vcu_device::mb_vcu_vram), this))
- , m_paletteram_space_config("palram", ENDIANNESS_LITTLE, 8, 16, 0, address_map_constructor(), address_map_constructor(FUNC(mb_vcu_device::mb_vcu_pal_ram), this))
+ , m_videoram_space_config("videoram", ENDIANNESS_LITTLE, 8, 19, 0, address_map_constructor(FUNC(mb_vcu_device::mb_vcu_vram), this))
+ , m_paletteram_space_config("palram", ENDIANNESS_LITTLE, 8, 16, 0, address_map_constructor(FUNC(mb_vcu_device::mb_vcu_pal_ram), this))
, m_cpu(*this, finder_base::DUMMY_TAG)
, m_palette(*this, finder_base::DUMMY_TAG)
{
@@ -474,19 +478,19 @@ WRITE8_MEMBER( mb_vcu_device::background_color_w )
/* red component */
bit1 = (m_bk_color >> 7) & 0x01;
bit0 = (m_bk_color >> 6) & 0x01;
- r = combine_2_weights(m_weights_r, bit0, bit1);
+ r = combine_weights(m_weights_r, bit0, bit1);
/* green component */
bit2 = (m_bk_color >> 5) & 0x01;
bit1 = (m_bk_color >> 4) & 0x01;
bit0 = (m_bk_color >> 3) & 0x01;
- g = combine_3_weights(m_weights_g, bit0, bit1, bit2);
+ g = combine_weights(m_weights_g, bit0, bit1, bit2);
/* blue component */
bit2 = (m_bk_color >> 2) & 0x01;
bit1 = (m_bk_color >> 1) & 0x01;
bit0 = (m_bk_color >> 0) & 0x01;
- b = combine_3_weights(m_weights_b, bit0, bit1, bit2);
+ b = combine_weights(m_weights_b, bit0, bit1, bit2);
m_palette->set_pen_color(0x100, rgb_t(r, g, b));
}
diff --git a/src/devices/video/mb_vcu.h b/src/devices/video/mb_vcu.h
index a8b53637a7d..90f0eea422a 100644
--- a/src/devices/video/mb_vcu.h
+++ b/src/devices/video/mb_vcu.h
@@ -23,8 +23,8 @@ public:
mb_vcu_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
// configuration
- void set_palette_tag(const char *tag) { m_palette.set_tag(tag); }
- void set_cpu_tag(const char *tag) { m_cpu.set_tag(tag); }
+ template <typename T> void set_palette_tag(T &&tag) { m_palette.set_tag(std::forward<T>(tag)); }
+ template <typename T> void set_cpu_tag(T &&tag) { m_cpu.set_tag(std::forward<T>(tag)); }
// I/O operations
DECLARE_WRITE8_MEMBER( write_vregs );
@@ -86,15 +86,4 @@ private:
// device type definition
DECLARE_DEVICE_TYPE(MB_VCU, mb_vcu_device)
-
-//**************************************************************************
-// INTERFACE CONFIGURATION MACROS
-//**************************************************************************
-
-#define MCFG_MB_VCU_CPU(_tag) \
- downcast<mb_vcu_device &>(*device).set_cpu_tag(_tag);
-
-#define MCFG_MB_VCU_PALETTE(_palette_tag) \
- downcast<mb_vcu_device &>(*device).set_palette_tag(_palette_tag);
-
#endif // MAME_VIDEO_MB_VCU_H
diff --git a/src/devices/video/mc6845.cpp b/src/devices/video/mc6845.cpp
index 13c1c8a6155..82ec8408130 100644
--- a/src/devices/video/mc6845.cpp
+++ b/src/devices/video/mc6845.cpp
@@ -129,13 +129,13 @@ void mc6845_device::call_on_update_address(int strobe)
}
-void mc6845_device::write_address(uint8_t data)
+void mc6845_device::address_w(uint8_t data)
{
m_register_address_latch = data & 0x1f;
}
-uint8_t mc6845_device::read_status()
+uint8_t mc6845_device::status_r()
{
uint8_t ret = 0;
@@ -178,7 +178,7 @@ void mc6845_device::transparent_update()
}
-uint8_t mc6845_device::read_register()
+uint8_t mc6845_device::register_r()
{
uint8_t ret = 0;
@@ -200,7 +200,7 @@ uint8_t mc6845_device::read_register()
}
-void mc6845_device::write_register(uint8_t data)
+void mc6845_device::register_w(uint8_t data)
{
LOG("%s:M6845 reg 0x%02x = 0x%02x\n", machine().describe_context(), m_register_address_latch, data);
@@ -253,13 +253,13 @@ void mc6845_device::write_register(uint8_t data)
}
-WRITE8_MEMBER( mos8563_device::address_w )
+void mos8563_device::address_w(uint8_t data)
{
m_register_address_latch = data & 0x3f;
}
-READ8_MEMBER( mos8563_device::status_r )
+uint8_t mos8563_device::status_r()
{
uint8_t ret = m_revision;
@@ -279,7 +279,7 @@ READ8_MEMBER( mos8563_device::status_r )
}
-READ8_MEMBER( mos8563_device::register_r )
+uint8_t mos8563_device::register_r()
{
uint8_t ret = 0xff;
@@ -329,7 +329,7 @@ READ8_MEMBER( mos8563_device::register_r )
}
-WRITE8_MEMBER( mos8563_device::register_w )
+void mos8563_device::register_w(uint8_t data)
{
LOG("%s:MOS8563 reg 0x%02x = 0x%02x\n", machine().describe_context(), m_register_address_latch, data);
@@ -392,13 +392,13 @@ WRITE8_MEMBER( mos8563_device::register_w )
recompute_parameters(false);
}
-WRITE8_MEMBER( hd6345_device::address_w )
+void hd6345_device::address_w(uint8_t data)
{
m_register_address_latch = data & 0x3f;
}
-READ8_MEMBER( hd6345_device::register_r )
+uint8_t hd6345_device::register_r()
{
uint8_t ret = 0xff;
@@ -416,7 +416,7 @@ READ8_MEMBER( hd6345_device::register_r )
return ret;
}
-WRITE8_MEMBER( hd6345_device::register_w )
+void hd6345_device::register_w(uint8_t data)
{
LOG("%s:HD6345 reg 0x%02x = 0x%02x\n", machine().describe_context(), m_register_address_latch, data);
@@ -582,7 +582,7 @@ void mc6845_device::recompute_parameters(bool postload)
m_hsync_off_pos = hsync_off_pos;
m_vsync_on_pos = vsync_on_pos;
m_vsync_off_pos = vsync_off_pos;
- if (!postload) // set m_line_counter to 0 on normal operation, but not on postload
+ if ( (!m_reconfigure_cb.isnull()) && (!postload) )
m_line_counter = 0;
}
}
@@ -659,6 +659,28 @@ void mc6845_device::update_upd_adr_timer()
}
+bool mc6845_device::match_line()
+{
+ /* Check if we've reached the end of active display */
+ if ( m_line_counter == m_vert_disp )
+ {
+ m_line_enable_ff = false;
+ m_current_disp_addr = m_disp_start_addr;
+ }
+
+ /* Check if VSYNC should be enabled */
+ if ( m_line_counter == m_vert_sync_pos )
+ {
+ m_vsync_width_counter = 0;
+ m_vsync_ff = 1;
+
+ return true;
+ }
+
+ return false;
+}
+
+
void mc6845_device::handle_line_timer()
{
bool new_vsync = m_vsync;
@@ -698,21 +720,8 @@ void mc6845_device::handle_line_timer()
m_line_counter = ( m_line_counter + 1 ) & 0x7F;
m_line_address = ( m_line_address + m_horiz_disp ) & 0x3fff;
- /* Check if we've reached the end of active display */
- if ( m_line_counter == m_vert_disp )
- {
- m_line_enable_ff = false;
- m_current_disp_addr = m_disp_start_addr;
- }
-
- /* Check if VSYNC should be enabled */
- if ( m_line_counter == m_vert_sync_pos )
- {
- m_vsync_width_counter = 0;
- m_vsync_ff = 1;
-
+ if (match_line())
new_vsync = true;
- }
}
else
{
@@ -731,6 +740,13 @@ void mc6845_device::handle_line_timer()
m_line_counter = 0;
m_line_address = m_disp_start_addr;
m_line_enable_ff = true;
+
+ if (m_supports_vert_sync_width)
+ {
+ if (match_line())
+ new_vsync = true;
+ }
+
/* also update the cursor state now */
update_cursor_state();
@@ -1438,7 +1454,8 @@ device_memory_interface::space_config_vector mos8563_device::memory_space_config
// default address maps
void mos8563_device::mos8563_videoram_map(address_map &map)
{
- map(0x0000, 0xffff).ram();
+ if (!has_configured_map(0))
+ map(0x0000, 0xffff).ram();
}
@@ -1505,7 +1522,7 @@ mos8563_device::mos8563_device(const machine_config &mconfig, device_type type,
: mc6845_device(mconfig, type, tag, owner, clock),
device_memory_interface(mconfig, *this),
device_palette_interface(mconfig, *this),
- m_videoram_space_config("videoram", ENDIANNESS_LITTLE, 8, 16, 0, address_map_constructor(), address_map_constructor(FUNC(mos8563_device::mos8563_videoram_map), this))
+ m_videoram_space_config("videoram", ENDIANNESS_LITTLE, 8, 16, 0, address_map_constructor(FUNC(mos8563_device::mos8563_videoram_map), this))
{
set_clock_scale(1.0/8);
}
diff --git a/src/devices/video/mc6845.h b/src/devices/video/mc6845.h
index 1233651e07b..1bb0683ee85 100644
--- a/src/devices/video/mc6845.h
+++ b/src/devices/video/mc6845.h
@@ -61,20 +61,16 @@ public:
auto out_vsync_callback() { return m_out_vsync_cb.bind(); }
/* select one of the registers for reading or writing */
- DECLARE_WRITE8_MEMBER( address_w ) { write_address(data); }
- void write_address(uint8_t data);
+ void address_w(uint8_t data);
/* read from the status register */
- DECLARE_READ8_MEMBER( status_r ) { return read_status(); }
- uint8_t read_status();
+ uint8_t status_r();
/* read from the currently selected register */
- DECLARE_READ8_MEMBER( register_r ) { return read_register(); }
- uint8_t read_register();
+ uint8_t register_r();
/* write to the currently selected register */
- DECLARE_WRITE8_MEMBER( register_w ) { write_register(data); }
- void write_register(uint8_t data);
+ void register_w(uint8_t data);
// read display enable line state
DECLARE_READ_LINE_MEMBER( de_r );
@@ -215,6 +211,7 @@ protected:
void set_hsync(int state);
void set_vsync(int state);
void set_cur(int state);
+ bool match_line();
void handle_line_timer();
virtual void update_cursor_state();
virtual uint8_t draw_scanline(int y, bitmap_rgb32 &bitmap, const rectangle &cliprect);
@@ -347,9 +344,9 @@ class hd6345_device : public mc6845_device
public:
hd6345_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- DECLARE_WRITE8_MEMBER(address_w);
- DECLARE_READ8_MEMBER(register_r);
- DECLARE_WRITE8_MEMBER(register_w);
+ void address_w(uint8_t data);
+ uint8_t register_r();
+ void register_w(uint8_t data);
protected:
virtual void device_start() override;
@@ -383,10 +380,10 @@ class mos8563_device : public mc6845_device,
public:
mos8563_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- DECLARE_WRITE8_MEMBER( address_w );
- DECLARE_READ8_MEMBER( status_r );
- DECLARE_READ8_MEMBER( register_r );
- DECLARE_WRITE8_MEMBER( register_w );
+ void address_w(uint8_t data);
+ uint8_t status_r();
+ uint8_t register_r();
+ void register_w(uint8_t data);
inline uint8_t read_videoram(offs_t offset);
inline void write_videoram(offs_t offset, uint8_t data);
diff --git a/src/devices/video/mc6847.cpp b/src/devices/video/mc6847.cpp
index 84b48bc1526..4ef156632b0 100644
--- a/src/devices/video/mc6847.cpp
+++ b/src/devices/video/mc6847.cpp
@@ -132,14 +132,14 @@ const uint32_t mc6847_base_device::s_palette[mc6847_base_device::PALETTE_LENGTH]
mc6847_friend_device::mc6847_friend_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock,
const uint8_t *fontdata, bool is_mc6847t1, double tpfs, int field_sync_falling_edge_scanline, int divider, bool supports_partial_body_scanlines)
: device_t(mconfig, type, tag, owner, clock)
+ , device_video_interface(mconfig, *this)
, m_write_hsync(*this)
, m_write_fsync(*this)
, m_character_map(fontdata, is_mc6847t1)
+ , m_tpfs(tpfs)
+ , m_divider(divider)
+ , m_supports_partial_body_scanlines(supports_partial_body_scanlines)
{
- m_tpfs = tpfs;
- m_divider = divider;
- m_supports_partial_body_scanlines = supports_partial_body_scanlines;
-
// The MC6847 and the GIME apply field sync on different scanlines
m_field_sync_falling_edge_scanline = field_sync_falling_edge_scanline;
}
@@ -577,6 +577,31 @@ void mc6847_base_device::setup_fixed_mode()
//-------------------------------------------------
+// device_config_complete - perform any
+// operations now that the configuration is
+// complete
+//-------------------------------------------------
+
+void mc6847_base_device::device_config_complete()
+{
+ if (!has_screen())
+ return;
+
+ if (!screen().refresh_attoseconds())
+ {
+ // FIXME: use correct raw parameters rather than this nonsense
+ screen().set_refresh_hz(m_tpfs > 310.0 ? 50 : 60);
+ screen().set_size(320, 243);
+ screen().set_visarea(0, 320-1, 1, 241-1);
+ screen().set_vblank_time(0);
+ }
+
+ if (!screen().has_screen_update())
+ screen().set_screen_update(screen_update_rgb32_delegate(FUNC(mc6847_base_device::screen_update), this));
+}
+
+
+//-------------------------------------------------
// device_start - device-specific startup
//-------------------------------------------------
diff --git a/src/devices/video/mc6847.h b/src/devices/video/mc6847.h
index 3868420280b..b9e8e02ed4c 100644
--- a/src/devices/video/mc6847.h
+++ b/src/devices/video/mc6847.h
@@ -19,41 +19,6 @@
// MC6847 CONFIGURATION / INTERFACE
//**************************************************************************
-#define MCFG_SCREEN_MC6847_NTSC_ADD(_tag, _mctag) \
- MCFG_SCREEN_ADD(_tag, RASTER) \
- MCFG_SCREEN_UPDATE_DEVICE(_mctag, mc6847_base_device, screen_update) \
- MCFG_SCREEN_REFRESH_RATE(60) \
- MCFG_SCREEN_SIZE(320, 243) \
- MCFG_SCREEN_VISIBLE_AREA(0, 320-1, 1, 241-1) \
- MCFG_SCREEN_VBLANK_TIME(0)
-
-#define MCFG_SCREEN_MC6847_PAL_ADD(_tag, _mctag) \
- MCFG_SCREEN_ADD(_tag, RASTER) \
- MCFG_SCREEN_UPDATE_DEVICE(_mctag, mc6847_base_device, screen_update) \
- MCFG_SCREEN_REFRESH_RATE(50) \
- MCFG_SCREEN_SIZE(320, 243) \
- MCFG_SCREEN_VISIBLE_AREA(0, 320-1, 1, 241-1) \
- MCFG_SCREEN_VBLANK_TIME(0)
-
-#define MCFG_MC6847_HSYNC_CALLBACK(_write) \
- downcast<mc6847_friend_device &>(*device).set_hsync_wr_callback(DEVCB_##_write);
-
-#define MCFG_MC6847_FSYNC_CALLBACK(_write) \
- downcast<mc6847_friend_device &>(*device).set_fsync_wr_callback(DEVCB_##_write);
-
-#define MCFG_MC6847_CHARROM_CALLBACK(_class, _method) \
- downcast<mc6847_friend_device &>(*device).set_get_char_rom(mc6847_friend_device::get_char_rom_delegate(&_class::_method, #_class "::" #_method, this));
-
-#define MCFG_MC6847_INPUT_CALLBACK(_read) \
- downcast<mc6847_base_device &>(*device).set_input_callback(DEVCB_##_read);
-
-#define MCFG_MC6847_FIXED_MODE(_mode) \
- downcast<mc6847_base_device &>(*device).set_get_fixed_mode(_mode);
-
-#define MCFG_MC6847_BW(_bw) \
- downcast<mc6847_base_device &>(*device).set_black_and_white(_bw);
-
-
#define MC6847_GET_CHARROM_MEMBER(_name) uint8_t _name(uint8_t ch, int line)
@@ -67,7 +32,7 @@ INPUT_PORTS_EXTERN(mc6847_artifacting);
//**************************************************************************
// base class so that the GIME emulation can access mc6847 stuff
-class mc6847_friend_device : public device_t
+class mc6847_friend_device : public device_t, public device_video_interface
{
public:
// video mode constants
@@ -86,12 +51,19 @@ public:
bool hs_r() const { return m_horizontal_sync; }
bool fs_r() const { return m_field_sync; }
- template <class Object> devcb_base &set_hsync_wr_callback(Object &&cb) { return m_write_hsync.set_callback(std::forward<Object>(cb)); }
- template <class Object> devcb_base &set_fsync_wr_callback(Object &&cb) { return m_write_fsync.set_callback(std::forward<Object>(cb)); }
auto hsync_wr_callback() { return m_write_hsync.bind(); }
auto fsync_wr_callback() { return m_write_fsync.bind(); }
template <typename Object> void set_get_char_rom(Object &&cb) { m_charrom_cb = std::forward<Object>(cb); }
+ void set_get_char_rom(get_char_rom_delegate cb) { m_charrom_cb = cb; }
+ template <class FunctionClass> void set_get_char_rom(const char *devname, uint8_t (FunctionClass::*cb)(uint8_t, int), const char *name)
+ {
+ set_get_char_rom(get_char_rom_delegate(cb, name, devname, static_cast<FunctionClass *>(nullptr)));
+ }
+ template <class FunctionClass> void set_get_char_rom(uint8_t (FunctionClass::*cb)(uint8_t, int), const char *name)
+ {
+ set_get_char_rom(get_char_rom_delegate(cb, name, nullptr, static_cast<FunctionClass *>(nullptr)));
+ }
protected:
mc6847_friend_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock,
@@ -479,16 +451,19 @@ private:
emu_timer *m_hsync_off_timer;
emu_timer *m_fsync_timer;
+protected:
+ const double m_tpfs;
+
+private:
// incidentals
- double m_tpfs;
- int m_divider;
+ const int m_divider;
int m_field_sync_falling_edge_scanline;
bool m_wide;
bool m_video_changed;
uint16_t m_top_border_scanlines;
uint16_t m_body_scanlines;
bool m_recording_scanline;
- bool m_supports_partial_body_scanlines;
+ const bool m_supports_partial_body_scanlines;
// video state
uint16_t m_physical_scanline;
@@ -513,7 +488,6 @@ private:
class mc6847_base_device : public mc6847_friend_device
{
public:
- template <class Object> devcb_base &set_input_callback(Object &&cb) { return m_input_cb.set_callback(std::forward<Object>(cb)); }
auto input_callback() { return m_input_cb.bind(); }
void set_get_fixed_mode(uint8_t mode) { m_fixed_mode = mode; }
@@ -524,18 +498,6 @@ public:
updating is complete, end_update() */
uint32_t screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
- template <typename T, typename U>
- static screen_device &add_pal_screen(machine_config &config, T &&screen_tag, U &&mc_tag)
- {
- screen_device &screen(SCREEN(config, std::forward<T>(screen_tag), SCREEN_TYPE_RASTER));
- screen.set_screen_update(std::forward<U>(mc_tag), FUNC(mc6847_base_device::screen_update));
- screen.set_refresh_hz(50);
- screen.set_size(320, 243);
- screen.set_visarea(0, 320-1, 1, 241-1);
- screen.set_vblank_time(0);
- return screen;
- }
-
// mode changing operations
DECLARE_WRITE_LINE_MEMBER( ag_w ) { change_mode(MODE_AG, state); }
DECLARE_WRITE_LINE_MEMBER( gm2_w ) { change_mode(MODE_GM2, state); }
@@ -550,6 +512,7 @@ protected:
mc6847_base_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock, const uint8_t *fontdata, double tpfs);
// device-level overrides
+ virtual void device_config_complete() override;
virtual void device_start() override;
virtual void device_reset() override;
virtual ioport_constructor device_input_ports() const override;
diff --git a/src/devices/video/mm5445.cpp b/src/devices/video/mm5445.cpp
new file mode 100644
index 00000000000..6b857ed19b3
--- /dev/null
+++ b/src/devices/video/mm5445.cpp
@@ -0,0 +1,106 @@
+// license:BSD-3-Clause
+// copyright-holders:hap
+/*
+
+ National Semiconductor MM5445 series VFD Driver
+
+ TODO:
+ - brightness control input pin (sets output voltage level)
+
+*/
+
+#include "emu.h"
+#include "video/mm5445.h"
+
+
+DEFINE_DEVICE_TYPE(MM5445, mm5445_device, "mm5445", "MM5445 VFD Driver")
+DEFINE_DEVICE_TYPE(MM5446, mm5446_device, "mm5446", "MM5446 VFD Driver")
+DEFINE_DEVICE_TYPE(MM5447, mm5447_device, "mm5447", "MM5447 VFD Driver")
+DEFINE_DEVICE_TYPE(MM5448, mm5448_device, "mm5448", "MM5448 VFD Driver")
+
+//-------------------------------------------------
+// constructor
+//-------------------------------------------------
+
+mm5445_device::mm5445_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock, u8 outpins) :
+ device_t(mconfig, type, tag, owner, clock),
+ m_outmask((u64(1) << outpins) - 1),
+ m_write_output(*this)
+{ }
+
+mm5445_device::mm5445_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock) :
+ mm5445_device(mconfig, MM5445, tag, owner, clock, 33)
+{ }
+
+mm5446_device::mm5446_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock) :
+ mm5445_device(mconfig, MM5446, tag, owner, clock, 34)
+{ }
+
+mm5447_device::mm5447_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock) :
+ mm5445_device(mconfig, MM5447, tag, owner, clock, 34)
+{ }
+
+mm5448_device::mm5448_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock) :
+ mm5445_device(mconfig, MM5448, tag, owner, clock, 35)
+{ }
+
+
+//-------------------------------------------------
+// device_start - device-specific startup
+//-------------------------------------------------
+
+void mm5445_device::device_start()
+{
+ // resolve callbacks
+ m_write_output.resolve_safe();
+
+ // zerofill
+ m_clk = 0;
+ m_enable = 0;
+ m_data = 0;
+ m_shiftreg = 0;
+ m_shiftcount = 0;
+
+ // register for savestates
+ save_item(NAME(m_clk));
+ save_item(NAME(m_enable));
+ save_item(NAME(m_data));
+ save_item(NAME(m_shiftreg));
+ save_item(NAME(m_shiftcount));
+}
+
+
+//-------------------------------------------------
+// handlers
+//-------------------------------------------------
+
+WRITE_LINE_MEMBER(mm5445_device::clock_w)
+{
+ state = (state) ? 1 : 0;
+ bool rise = state && !m_clk;
+ m_clk = state;
+
+ // clock on rising edge
+ if (rise)
+ {
+ u64 data_in = u64(m_data & ~m_enable) << 34;
+ u64 lead_in = ~m_shiftreg & data_in;
+ m_shiftreg = (m_shiftreg & ((u64(1) << 34) - 1)) | data_in;
+
+ // leading 1 triggers shift start
+ if (m_shiftcount == 0 && !lead_in)
+ return;
+
+ // output on 35th clock
+ if (m_shiftcount == 35)
+ {
+ m_shiftcount = 0;
+ m_write_output(0, m_shiftreg & m_outmask, ~u64(0));
+ }
+ else
+ {
+ m_shiftreg >>= 1;
+ m_shiftcount++;
+ }
+ }
+}
diff --git a/src/devices/video/mm5445.h b/src/devices/video/mm5445.h
new file mode 100644
index 00000000000..7d16d4f2ee2
--- /dev/null
+++ b/src/devices/video/mm5445.h
@@ -0,0 +1,101 @@
+// license:BSD-3-Clause
+// copyright-holders:hap
+/*
+
+ National Semiconductor MM5445 series VFD Driver
+
+*/
+
+#ifndef MAME_VIDEO_MM5445_H
+#define MAME_VIDEO_MM5445_H
+
+#pragma once
+
+// pinout reference
+
+/*
+ ____ ____
+ VDD 1 |* \_/ | 40 O18
+ O17 2 | | 39 O19
+ O16 3 | | 38 O20
+ O15 4 | | 37 O21
+ O14 5 | | 36 O22
+ O13 6 | | 35 O23
+ O12 7 | | 34 O24
+ O11 8 | | 33 O25
+ O10 9 | | 32 O26
+ O9 10 | MM5445N | 31 O27
+ O8 11 | | 30 O28
+ O7 12 | | 29 O29
+ O6 13 | | 28 O30
+ O5 14 | | 27 O31
+ O4 15 | | 26 O32
+ O3 16 | | 25 O33
+ O2 17 | | 24 BRIGHTNESS CONTROL
+ O1 18 | | 23 _DATA ENABLE
+ VGG 19 | | 22 DATA IN
+ VSS 20 |___________| 21 CLOCK IN
+
+ O# = OUTPUT BIT #
+ MM5446, MM5448 don't have the brightness control pin, an extra output pin instead
+ MM5447, MM5448 don't have the data enable pin(always enabled), but another extra output pin
+*/
+
+
+class mm5445_device : public device_t
+{
+public:
+ mm5445_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock = 0);
+
+ // configuration helpers
+ auto output_cb() { return m_write_output.bind(); }
+
+ DECLARE_WRITE_LINE_MEMBER(clock_w);
+ DECLARE_WRITE_LINE_MEMBER(enable_w) { m_enable = (state) ? 1 : 0; } // active low, unused on MM5447 and MM5448
+ DECLARE_WRITE_LINE_MEMBER(data_w) { m_data = (state) ? 1 : 0; }
+
+protected:
+ mm5445_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock, u8 outpins);
+
+ // device-level overrides
+ virtual void device_start() override;
+
+ const u64 m_outmask;
+
+ int m_clk; // input pin state
+ int m_enable; // "
+ int m_data; // "
+
+ u64 m_shiftreg;
+ int m_shiftcount;
+
+ // callbacks
+ devcb_write64 m_write_output;
+};
+
+
+class mm5446_device : public mm5445_device
+{
+public:
+ mm5446_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
+};
+
+class mm5447_device : public mm5445_device
+{
+public:
+ mm5447_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
+};
+
+class mm5448_device : public mm5445_device
+{
+public:
+ mm5448_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
+};
+
+
+DECLARE_DEVICE_TYPE(MM5445, mm5445_device)
+DECLARE_DEVICE_TYPE(MM5446, mm5446_device)
+DECLARE_DEVICE_TYPE(MM5447, mm5447_device)
+DECLARE_DEVICE_TYPE(MM5448, mm5448_device)
+
+#endif // MAME_VIDEO_MM5445_H
diff --git a/src/devices/video/mos6566.cpp b/src/devices/video/mos6566.cpp
index a671448a4ab..b88cad06c64 100644
--- a/src/devices/video/mos6566.cpp
+++ b/src/devices/video/mos6566.cpp
@@ -227,12 +227,14 @@ DEFINE_DEVICE_TYPE(MOS8566, mos8566_device, "mos8566", "MOS 8566 VIC-II")
// default address maps
void mos6566_device::mos6566_videoram_map(address_map &map)
{
- map(0x0000, 0x3fff).ram();
+ if (!has_configured_map(0))
+ map(0x0000, 0x3fff).ram();
}
void mos6566_device::mos6566_colorram_map(address_map &map)
{
- map(0x000, 0x3ff).ram();
+ if (!has_configured_map(1))
+ map(0x000, 0x3ff).ram();
}
@@ -587,8 +589,8 @@ mos6566_device::mos6566_device(const machine_config &mconfig, device_type type,
device_execute_interface(mconfig, *this),
m_icount(0),
m_variant(variant),
- m_videoram_space_config("videoram", ENDIANNESS_LITTLE, 8, 14, 0, address_map_constructor(), address_map_constructor(FUNC(mos6566_device::mos6566_videoram_map), this)),
- m_colorram_space_config("colorram", ENDIANNESS_LITTLE, 8, 10, 0, address_map_constructor(), address_map_constructor(FUNC(mos6566_device::mos6566_colorram_map), this)),
+ m_videoram_space_config("videoram", ENDIANNESS_LITTLE, 8, 14, 0, address_map_constructor(FUNC(mos6566_device::mos6566_videoram_map), this)),
+ m_colorram_space_config("colorram", ENDIANNESS_LITTLE, 8, 10, 0, address_map_constructor(FUNC(mos6566_device::mos6566_colorram_map), this)),
m_write_irq(*this),
m_write_ba(*this),
m_write_aec(*this),
@@ -2446,7 +2448,7 @@ uint32_t mos6566_device::screen_update(screen_device &screen, bitmap_rgb32 &bitm
// read -
//-------------------------------------------------
-READ8_MEMBER( mos6566_device::read )
+uint8_t mos6566_device::read(offs_t offset)
{
uint8_t val = 0;
@@ -2591,7 +2593,7 @@ READ8_MEMBER( mos6566_device::read )
// write -
//-------------------------------------------------
-WRITE8_MEMBER( mos6566_device::write )
+void mos6566_device::write(offs_t offset, uint8_t data)
{
DBG_LOG(2, "vic write", ("%.2x:%.2x\n", offset, data));
offset &= 0x3f;
diff --git a/src/devices/video/mos6566.h b/src/devices/video/mos6566.h
index 6f3a52dbab5..d1d7338e151 100644
--- a/src/devices/video/mos6566.h
+++ b/src/devices/video/mos6566.h
@@ -199,8 +199,8 @@ public:
virtual space_config_vector memory_space_config() const override;
- DECLARE_READ8_MEMBER( read );
- DECLARE_WRITE8_MEMBER( write );
+ uint8_t read(offs_t offset);
+ void write(offs_t offset, uint8_t data);
DECLARE_WRITE_LINE_MEMBER( lp_w );
diff --git a/src/devices/video/msm6222b.h b/src/devices/video/msm6222b.h
index 9cf3623e25f..7a2cb00fd89 100644
--- a/src/devices/video/msm6222b.h
+++ b/src/devices/video/msm6222b.h
@@ -15,11 +15,6 @@
#pragma once
-#define MCFG_MSM6222B_ADD( _tag ) \
- MCFG_DEVICE_ADD( _tag, MSM6222B, 0 )
-
-#define MCFG_MSM6222B_01_ADD( _tag ) \
- MCFG_DEVICE_ADD( _tag, MSM6222B_01, 0 )
class msm6222b_device : public device_t {
public:
diff --git a/src/devices/video/msm6255.cpp b/src/devices/video/msm6255.cpp
index ffca4414314..b1c83556103 100644
--- a/src/devices/video/msm6255.cpp
+++ b/src/devices/video/msm6255.cpp
@@ -63,7 +63,8 @@ void msm6255_device::map(address_map &map)
// default address map
void msm6255_device::msm6255(address_map &map)
{
- map(0x00000, 0xfffff).ram();
+ if (!has_configured_map(0))
+ map(0x00000, 0xfffff).ram();
}
@@ -80,7 +81,7 @@ msm6255_device::msm6255_device(const machine_config &mconfig, const char *tag, d
device_t(mconfig, MSM6255, tag, owner, clock),
device_memory_interface(mconfig, *this),
device_video_interface(mconfig, *this),
- m_space_config("videoram", ENDIANNESS_LITTLE, 8, 20, 0, address_map_constructor(), address_map_constructor(FUNC(msm6255_device::msm6255), this)),
+ m_space_config("videoram", ENDIANNESS_LITTLE, 8, 20, 0, address_map_constructor(FUNC(msm6255_device::msm6255), this)),
m_cursor(0)
{
}
diff --git a/src/devices/video/nt7534.h b/src/devices/video/nt7534.h
index 06e37d2bd26..75390f8acaa 100644
--- a/src/devices/video/nt7534.h
+++ b/src/devices/video/nt7534.h
@@ -12,9 +12,6 @@
#pragma once
-#define MCFG_NT7534_PIXEL_UPDATE_CB(_class, _method) \
- downcast<nt7534_device &>(*device).set_pixel_update_cb(nt7534_device::pixel_update_delegate(&_class::_method, #_class "::" #_method, this));
-
//**************************************************************************
// TYPE DEFINITIONS
//**************************************************************************
@@ -32,7 +29,7 @@ public:
// construction/destruction
nt7534_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock = 0);
- template <typename Object> void set_pixel_update_cb(Object &&cb) { m_pixel_update_cb = std::forward<Object>(cb); }
+ template <typename... T> void set_pixel_update_cb(T &&... args) { m_pixel_update_cb = pixel_update_delegate(std::forward<T>(args)...); }
// device interface
virtual DECLARE_WRITE8_MEMBER(write);
diff --git a/src/devices/video/pc_vga.cpp b/src/devices/video/pc_vga.cpp
index 9bf529f7213..1170693a2db 100644
--- a/src/devices/video/pc_vga.cpp
+++ b/src/devices/video/pc_vga.cpp
@@ -2220,14 +2220,16 @@ WRITE8_MEMBER(vga_device::mem_linear_w)
// device_add_mconfig - add device configuration
//-------------------------------------------------
-MACHINE_CONFIG_START(ati_vga_device::device_add_mconfig)
- MCFG_MACH8_ADD_OWNER("8514a")
+void ati_vga_device::device_add_mconfig(machine_config &config)
+{
+ MACH8(config, "8514a", 0).set_vga_owner();
EEPROM_93C46_16BIT(config, "ati_eeprom");
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(s3_vga_device::device_add_mconfig)
- MCFG_8514A_ADD_OWNER("8514a")
-MACHINE_CONFIG_END
+void s3_vga_device::device_add_mconfig(machine_config &config)
+{
+ IBM8514A(config, "8514a", 0).set_vga_owner();
+}
/******************************************
diff --git a/src/devices/video/pc_vga.h b/src/devices/video/pc_vga.h
index afde9bfdfd6..bab15da5673 100644
--- a/src/devices/video/pc_vga.h
+++ b/src/devices/video/pc_vga.h
@@ -415,14 +415,6 @@ private:
// device type definition
DECLARE_DEVICE_TYPE(IBM8514A, ibm8514a_device)
-#define MCFG_8514A_ADD(_tag, _param) \
- MCFG_DEVICE_ADD(_tag, IBM8514A, 0) \
- downcast<ibm8514a_device*>(device)->set_vga(_param);
-
-#define MCFG_8514A_ADD_OWNER(_tag) \
- MCFG_DEVICE_ADD(_tag, IBM8514A, 0) \
- downcast<ibm8514a_device*>(device)->set_vga_owner();
-
class mach8_device : public ibm8514a_device
{
@@ -496,13 +488,6 @@ private:
// device type definition
DECLARE_DEVICE_TYPE(MACH8, mach8_device)
-#define MCFG_MACH8_ADD(_tag, _param) \
- MCFG_DEVICE_ADD(_tag, MACH8, 0) \
- downcast<mach8_device*>(device)->set_vga(_param);
-
-#define MCFG_MACH8_ADD_OWNER(_tag) \
- MCFG_DEVICE_ADD(_tag, MACH8, 0) \
- downcast<mach8_device*>(device)->set_vga_owner();
// ======================> tseng_vga_device
diff --git a/src/devices/video/pcd8544.h b/src/devices/video/pcd8544.h
index fee6fad00d8..069984e9483 100644
--- a/src/devices/video/pcd8544.h
+++ b/src/devices/video/pcd8544.h
@@ -18,12 +18,6 @@
#define PCD8544_SCREEN_UPDATE(name) void name(device_t &device, bitmap_ind16 &bitmap, const rectangle &cliprect , uint8_t *vram, int inv)
-#define MCFG_PCD8544_ADD( _tag ) \
- MCFG_DEVICE_ADD( _tag, PCD8544, 0 )
-
-#define MCFG_PCD8544_SCREEN_UPDATE_CALLBACK(_class, _method) \
- downcast<pcd8544_device &>(*device).set_screen_update_cb(pcd8544_device::screen_update_delegate(&_class::_method, #_class "::" #_method, this));
-
// ======================> pcd8544_device
@@ -34,7 +28,7 @@ public:
// construction/destruction
pcd8544_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- template <typename Object> void set_screen_update_cb(Object &&cb) { m_screen_update_cb = std::forward<Object>(cb); }
+ template <typename... T> void set_screen_update_cb(T &&... args) { m_screen_update_cb = screen_update_delegate(std::forward<T>(args)...); }
// device interface
DECLARE_WRITE_LINE_MEMBER(sdin_w);
diff --git a/src/devices/video/ppu2c0x.cpp b/src/devices/video/ppu2c0x.cpp
index 341271ed6bf..8aa57660318 100644
--- a/src/devices/video/ppu2c0x.cpp
+++ b/src/devices/video/ppu2c0x.cpp
@@ -89,9 +89,12 @@ DEFINE_DEVICE_TYPE(PPU_2C05_04, ppu2c05_04_device, "ppu2c05_04", "2C05_04 PPU")
// default address map
void ppu2c0x_device::ppu2c0x(address_map &map)
{
- map(0x0000, 0x3eff).ram();
- map(0x3f00, 0x3fff).rw(FUNC(ppu2c0x_device::palette_read), FUNC(ppu2c0x_device::palette_write));
+ if (!has_configured_map(0))
+ {
+ map(0x0000, 0x3eff).ram();
+ map(0x3f00, 0x3fff).rw(FUNC(ppu2c0x_device::palette_read), FUNC(ppu2c0x_device::palette_write));
// AM_RANGE(0x0000, 0x3fff) AM_RAM
+ }
}
//-------------------------------------------------
@@ -125,7 +128,7 @@ ppu2c0x_device::ppu2c0x_device(const machine_config &mconfig, device_type type,
, device_memory_interface(mconfig, *this)
, device_video_interface(mconfig, *this)
, device_palette_interface(mconfig, *this)
- , m_space_config("videoram", ENDIANNESS_LITTLE, 8, 17, 0, address_map_constructor(), address_map_constructor(FUNC(ppu2c0x_device::ppu2c0x), this))
+ , m_space_config("videoram", ENDIANNESS_LITTLE, 8, 17, 0, address_map_constructor(FUNC(ppu2c0x_device::ppu2c0x), this))
, m_cpu(*this, finder_base::DUMMY_TAG)
, m_scanline(0) // reset the scanline count
, m_int_callback(*this)
@@ -229,7 +232,7 @@ void ppu2c0x_device::device_start()
/* initialize the scanline handling portion */
m_scanline_timer->adjust(screen().time_until_pos(1));
- m_hblank_timer->adjust(m_cpu->cycles_to_attotime(86.67)); // ??? FIXME - hardcoding NTSC, need better calculation
+ m_hblank_timer->adjust(m_cpu->cycles_to_attotime(260) / 3); // ??? FIXME - hardcoding NTSC, need better calculation
m_nmi_timer->adjust(attotime::never);
/* allocate a screen bitmap, videomem and spriteram, a dirtychar array and the monochromatic colortable */
@@ -558,7 +561,7 @@ void ppu2c0x_device::device_timer(emu_timer &timer, device_timer_id id, int para
next_scanline = 0;
// Call us back when the hblank starts for this scanline
- m_hblank_timer->adjust(m_cpu->cycles_to_attotime(86.67)); // ??? FIXME - hardcoding NTSC, need better calculation
+ m_hblank_timer->adjust(m_cpu->cycles_to_attotime(260) / 3); // ??? FIXME - hardcoding NTSC, need better calculation
// trigger again at the start of the next scanline
m_scanline_timer->adjust(screen().time_until_pos(next_scanline * m_scan_scale));
diff --git a/src/devices/video/ps2gs.cpp b/src/devices/video/ps2gs.cpp
index 79ba24339d2..298b3779bbe 100644
--- a/src/devices/video/ps2gs.cpp
+++ b/src/devices/video/ps2gs.cpp
@@ -52,9 +52,10 @@ ps2_gs_device::~ps2_gs_device()
{
}
-MACHINE_CONFIG_START(ps2_gs_device::device_add_mconfig)
- MCFG_DEVICE_ADD(m_gif, SONYPS2_GIF, clock(), DEVICE_SELF, m_vu1)
-MACHINE_CONFIG_END
+void ps2_gs_device::device_add_mconfig(machine_config &config)
+{
+ SONYPS2_GIF(config, m_gif, clock(), DEVICE_SELF, m_vu1);
+}
void ps2_gs_device::device_start()
{
diff --git a/src/devices/video/ramdac.cpp b/src/devices/video/ramdac.cpp
index dc45e106711..d651235f60c 100644
--- a/src/devices/video/ramdac.cpp
+++ b/src/devices/video/ramdac.cpp
@@ -19,10 +19,13 @@
// default address map
void ramdac_device::ramdac_palram(address_map &map)
{
- map(0x000, 0x0ff).ram(); // R bank
- map(0x100, 0x1ff).ram(); // G bank
- map(0x200, 0x2ff).ram(); // B bank
- map(0x300, 0x3ff).noprw();
+ if (!has_configured_map(0))
+ {
+ map(0x000, 0x0ff).ram(); // R bank
+ map(0x100, 0x1ff).ram(); // G bank
+ map(0x200, 0x2ff).ram(); // B bank
+ map(0x300, 0x3ff).noprw();
+ }
}
//**************************************************************************
@@ -44,7 +47,7 @@ DEFINE_DEVICE_TYPE(RAMDAC, ramdac_device, "ramdac", "RAMDAC")
ramdac_device::ramdac_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
: device_t(mconfig, RAMDAC, tag, owner, clock),
device_memory_interface(mconfig, *this),
- m_space_config("videoram", ENDIANNESS_LITTLE, 8, 10, 0, address_map_constructor(), address_map_constructor(FUNC(ramdac_device::ramdac_palram), this)),
+ m_space_config("videoram", ENDIANNESS_LITTLE, 8, 10, 0, address_map_constructor(FUNC(ramdac_device::ramdac_palram), this)),
m_palette(*this, finder_base::DUMMY_TAG),
m_color_base(0),
m_split_read_reg(0)
diff --git a/src/devices/video/saa5050.h b/src/devices/video/saa5050.h
index 6e1aa5cec6a..a9bb680f347 100644
--- a/src/devices/video/saa5050.h
+++ b/src/devices/video/saa5050.h
@@ -29,21 +29,6 @@
#pragma once
-
-
-//**************************************************************************
-// INTERFACE CONFIGURATION MACROS
-//**************************************************************************
-
-#define MCFG_SAA5050_D_CALLBACK(_read) \
- downcast<saa5050_device &>(*device).set_d_rd_callback(DEVCB_##_read);
-
-
-#define MCFG_SAA5050_SCREEN_SIZE(_cols, _rows, _size) \
- downcast<saa5050_device &>(*device).set_screen_size(_cols, _rows, _size);
-
-
-
//**************************************************************************
// TYPE DEFINITIONS
//**************************************************************************
@@ -58,7 +43,6 @@ public:
void set_screen_size(int cols, int rows, int size) { m_cols = cols; m_rows = rows; m_size = size; }
- template <class Object> devcb_base &set_d_rd_callback(Object &&cb) { return m_read_d.set_callback(std::forward<Object>(cb)); }
auto d_cb() { return m_read_d.bind(); }
// optional information overrides
diff --git a/src/devices/video/scn2674.cpp b/src/devices/video/scn2674.cpp
index 9baae770f4c..1e6cf3d68b5 100644
--- a/src/devices/video/scn2674.cpp
+++ b/src/devices/video/scn2674.cpp
@@ -25,7 +25,8 @@ DEFINE_DEVICE_TYPE(SCN2674, scn2674_device, "scn2674", "Signetics SCN2674 AVDC")
// default address map
void scn2674_device::scn2674_vram(address_map &map)
{
- map(0x0000, (1 << space_config(0)->addr_width()) - 1).noprw();
+ if (!has_configured_map(0))
+ map(0x0000, (1 << space_config(0)->addr_width()) - 1).noprw();
}
scn2672_device::scn2672_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
@@ -44,12 +45,15 @@ scn2674_device::scn2674_device(const machine_config &mconfig, device_type type,
, device_memory_interface(mconfig, *this)
, m_intr_cb(*this)
, m_breq_cb(*this)
+ , m_mbc_cb(*this)
+ , m_mbc_char_cb(*this)
+ , m_mbc_attr_cb(*this)
, m_IR_pointer(0)
, m_screen1_address(0), m_screen2_address(0)
, m_cursor_address(0)
, m_irq_register(0), m_status_register(0), m_irq_mask(0)
, m_gfx_enabled(false)
- , m_display_enabled(false), m_display_enabled_field(false), m_display_enabled_scanline(false)
+ , m_display_enabled(false), m_dadd_enabled(false), m_display_enabled_field(false), m_display_enabled_scanline(false)
, m_cursor_enabled(false)
, m_hpixels_per_column(0)
, m_double_ht_wd(false)
@@ -83,9 +87,11 @@ scn2674_device::scn2674_device(const machine_config &mconfig, device_type type,
, m_char_buffer(0), m_attr_buffer(0)
, m_linecounter(0), m_address(0), m_start1change(0)
, m_scanline_timer(nullptr)
+ , m_breq_timer(nullptr)
+ , m_vblank_timer(nullptr)
, m_char_space(nullptr), m_attr_space(nullptr)
- , m_char_space_config("charram", ENDIANNESS_LITTLE, 8, extend_addressing ? 16 : 14, 0, address_map_constructor(), address_map_constructor(FUNC(scn2674_device::scn2674_vram), this))
- , m_attr_space_config("attrram", ENDIANNESS_LITTLE, 8, extend_addressing ? 16 : 14, 0, address_map_constructor(), address_map_constructor(FUNC(scn2674_device::scn2674_vram), this))
+ , m_char_space_config("charram", ENDIANNESS_LITTLE, 8, extend_addressing ? 16 : 14, 0, address_map_constructor(FUNC(scn2674_device::scn2674_vram), this))
+ , m_attr_space_config("attrram", ENDIANNESS_LITTLE, 8, extend_addressing ? 16 : 14, 0)
{
}
@@ -105,7 +111,12 @@ void scn2674_device::device_start()
m_display_cb.bind_relative_to(*owner());
m_intr_cb.resolve_safe();
m_breq_cb.resolve_safe();
- m_scanline_timer = timer_alloc(TIMER_SCANLINE);
+ m_mbc_cb.resolve_safe();
+ m_mbc_char_cb.resolve();
+ m_mbc_attr_cb.resolve();
+ m_scanline_timer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(scn2674_device::scanline_timer), this));
+ m_breq_timer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(scn2674_device::breq_timer), this));
+ m_vblank_timer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(scn2674_device::vblank_timer), this));
screen().register_screen_bitmap(m_bitmap);
m_char_space = &space(0);
@@ -123,6 +134,7 @@ void scn2674_device::device_start()
save_item(NAME(m_irq_mask));
save_item(NAME(m_gfx_enabled));
save_item(NAME(m_display_enabled));
+ save_item(NAME(m_dadd_enabled));
save_item(NAME(m_display_enabled_field));
save_item(NAME(m_display_enabled_scanline));
save_item(NAME(m_cursor_enabled));
@@ -174,6 +186,7 @@ void scn2674_device::device_reset()
m_irq_mask = 0;
m_gfx_enabled = false;
m_display_enabled = false;
+ m_dadd_enabled = false;
m_display_enabled_field = false;
m_display_enabled_scanline = false;
m_cursor_enabled = false;
@@ -551,9 +564,15 @@ void scn2674_device::set_display_enabled(bool enabled, int n)
m_display_enabled = false;
if (n == 1)
+ {
LOGMASKED(LOG_COMMAND, "%s: Display off - float DADD bus\n", machine().describe_context());
+ m_dadd_enabled = false;
+ }
else
+ {
LOGMASKED(LOG_COMMAND, "%s: Display off - no float DADD bus\n", machine().describe_context());
+ m_dadd_enabled = true;
+ }
}
else
{
@@ -710,6 +729,9 @@ void scn2674_device::write_delayed_command(uint8_t data)
case 0xbb:
// write from cursor address to pointer address
// TODO: transfer only during blank
+ m_display_enabled = false;
+ m_display_enabled_field = true;
+ m_display_enabled_scanline = false;
for (i = m_cursor_address; i != m_screen2_address; i = ((i + 1) & 0xffff))
{
m_char_space->write_byte(i, m_char_buffer);
@@ -762,13 +784,17 @@ void scn2674_device::write_command(uint8_t data)
m_IR_pointer = 0;
m_irq_register = 0x00;
m_status_register = 0x20; // RDFLG activated
- m_linecounter = 0;
m_irq_mask = 0x00;
m_gfx_enabled = false;
m_display_enabled = false;
+ m_dadd_enabled = false;
m_cursor_enabled = false;
m_use_row_table = false;
m_intr_cb(CLEAR_LINE);
+ m_breq_cb(CLEAR_LINE);
+ m_mbc_cb(0);
+ m_breq_timer->adjust(attotime::never);
+ m_vblank_timer->adjust(attotime::never);
}
else
{
@@ -911,6 +937,8 @@ void scn2674_device::write(offs_t offset, uint8_t data)
m_screen1_address = (m_screen1_address & 0x3f00) | data;
if (!screen().vblank())
m_start1change = (m_linecounter / m_scanline_per_char_row) + 1;
+ else
+ m_start1change = 0;
break;
case 3:
@@ -924,6 +952,8 @@ void scn2674_device::write(offs_t offset, uint8_t data)
}
if (!screen().vblank())
m_start1change = (m_linecounter / m_scanline_per_char_row) + 1;
+ else
+ m_start1change = 0;
break;
case 4:
@@ -967,154 +997,200 @@ void scn2674_device::recompute_parameters()
rectangle visarea(0, max_visible_x, 0, max_visible_y);
screen().configure(horiz_pix_total, vert_pix_total, visarea, refresh.as_attoseconds());
- m_scanline_timer->adjust(screen().time_until_pos(0, 0), 0, screen().scan_period());
+ m_linecounter = screen().vpos();
+ m_scanline_timer->adjust(screen().time_until_pos((m_linecounter + 1) % vert_pix_total, 0), 0, screen().scan_period());
}
-void scn2674_device::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr)
+TIMER_CALLBACK_MEMBER(scn2674_device::scanline_timer)
{
- switch (id)
+ int dw = m_double_ht_wd ? m_double[0] : 0; // double width
+ if (((m_display_enabled_scanline) || (m_display_enabled_field && !m_interlace_enable)) && (!m_display_enabled))
{
- case TIMER_SCANLINE:
- {
- int dw = m_double_ht_wd ? m_double[0] : 0; // double width
- if (((m_display_enabled_scanline) || (m_display_enabled_field && !m_interlace_enable)) && (!m_display_enabled))
- {
- m_display_enabled = true;
- m_display_enabled_scanline = false;
- m_display_enabled_field = false;
- }
+ m_display_enabled = true;
+ m_dadd_enabled = true;
+ m_display_enabled_scanline = false;
+ m_display_enabled_field = false;
+ }
- m_linecounter++;
+ m_linecounter++;
- if (m_linecounter >= screen().height())
- {
- m_linecounter = 0;
- m_address = m_screen1_address;
- }
+ if (m_linecounter >= screen().height())
+ {
+ m_linecounter = 0;
+ m_address = m_screen1_address;
+ }
- if (m_linecounter == (m_rows_per_screen * m_scanline_per_char_row))
- {
- m_status_register |= 0x10;
- if (BIT(m_irq_mask, 4))
- {
- LOGMASKED(LOG_INTR, "V-Blank interrupt at line %d\n", m_linecounter);
- m_irq_register |= 0x10;
- m_intr_cb(ASSERT_LINE);
- }
- }
+ bool lastscan = m_linecounter == (m_rows_per_screen * m_scanline_per_char_row) - 1;
+ if (lastscan)
+ {
+ int horz_sync_begin = 2 * (m_equalizing_constant + 2 * m_horz_sync_width) - m_horz_sync_width - m_horz_back_porch;
+ m_vblank_timer->adjust(clocks_to_attotime(horz_sync_begin));
+ }
- if (m_linecounter >= (m_rows_per_screen * m_scanline_per_char_row))
- break;
+ if (m_linecounter >= (m_rows_per_screen * m_scanline_per_char_row))
+ {
+ if (m_buffer_mode_select == 3 && m_linecounter == (screen().height() - 1))
+ m_breq_timer->adjust(clocks_to_attotime(m_character_per_row + 1), ASSERT_LINE);
+ return;
+ }
- int charrow = m_linecounter % m_scanline_per_char_row;
- int tilerow = charrow;
+ int charrow = m_linecounter % m_scanline_per_char_row;
+ int tilerow = charrow;
- // should be triggered at the start of each ROW (line zero for that row)
- if (charrow == 0)
- {
- m_status_register |= 0x08;
- if (BIT(m_irq_mask, 3))
- {
- LOGMASKED(LOG_INTR, "Line Zero interrupt at line %d\n", m_linecounter);
- m_irq_register |= 0x08;
- m_intr_cb(ASSERT_LINE);
- }
- if (m_buffer_mode_select == 3)
- m_breq_cb(ASSERT_LINE);
- }
- else if (m_buffer_mode_select == 3)
- m_breq_cb(CLEAR_LINE);
+ // should be triggered at the start of each ROW (line zero for that row)
+ if (charrow == 0)
+ {
+ m_status_register |= 0x08;
+ if (BIT(m_irq_mask, 3))
+ {
+ LOGMASKED(LOG_INTR, "Line Zero interrupt at line %d\n", m_linecounter);
+ m_irq_register |= 0x08;
+ m_intr_cb(ASSERT_LINE);
+ }
+ if (m_buffer_mode_select == 3)
+ {
+ m_mbc_cb(1);
+ m_breq_timer->adjust(clocks_to_attotime(m_character_per_row + 1), CLEAR_LINE);
+ }
+ }
+ else if (m_buffer_mode_select == 3 && charrow == (m_scanline_per_char_row - 1) && !lastscan)
+ m_breq_timer->adjust(clocks_to_attotime(m_character_per_row + 1), ASSERT_LINE);
- // Handle screen splits
- for (int s = 0; s < 2; s++)
+ // Handle screen splits
+ for (int s = 0; s < 2; s++)
+ {
+ if ((m_linecounter == ((m_split_register[s] + 1) * m_scanline_per_char_row)) && m_linecounter)
+ {
+ uint8_t flag = (s == 0) ? 0x04 : 0x01;
+ m_status_register |= flag;
+ if ((m_irq_mask & flag) != 0)
{
- if ((m_linecounter == ((m_split_register[s] + 1) * m_scanline_per_char_row)) && m_linecounter)
- {
- uint8_t flag = (s == 0) ? 0x04 : 0x01;
- m_status_register |= flag;
- if ((m_irq_mask & flag) != 0)
- {
- LOGMASKED(LOG_INTR, "Split Screen %d interrupt at line %d\n", s + 1, m_linecounter);
- m_irq_register |= flag;
- m_intr_cb(ASSERT_LINE);
- }
- if (m_spl[s])
- m_address = m_screen2_address;
- if (!m_double_ht_wd)
- dw = m_double[s];
- }
+ LOGMASKED(LOG_INTR, "Split Screen %d interrupt at line %d\n", s + 1, m_linecounter);
+ m_irq_register |= flag;
+ m_intr_cb(ASSERT_LINE);
}
+ if (m_spl[s])
+ m_address = m_screen2_address;
+ if (!m_double_ht_wd)
+ dw = m_double[s];
+ }
+ }
- if (!m_display_enabled)
- break;
+ // WY-50 requires that normal row buffering take place even after a "display off" command
+ if (!m_dadd_enabled)
+ return;
- if (m_use_row_table)
- {
- if (m_double_ht_wd)
- dw = m_screen1_address >> 14;
- if (!charrow)
- {
- uint16_t addr = m_screen2_address;
- uint16_t line = m_char_space->read_word(addr);
- m_screen1_address = line;
- if (m_double_ht_wd)
- {
- dw = line >> 14;
- line &= ~0xc000;
- }
- m_address = line;
- addr += 2;
- m_screen2_address = addr & 0x3fff;
- }
- }
- else if (m_start1change && (m_start1change == (m_linecounter / m_scanline_per_char_row)))
+ if (m_use_row_table)
+ {
+ if (m_double_ht_wd)
+ dw = m_screen1_address >> 14;
+ if (!charrow)
+ {
+ uint16_t addr = m_screen2_address;
+ uint16_t line = m_char_space->read_word(addr);
+ m_screen1_address = line;
+ if (m_double_ht_wd)
{
- m_address = m_screen1_address;
- m_start1change = 0;
+ dw = line >> 14;
+ line &= ~0xc000;
}
+ m_address = line;
+ addr += 2;
+ m_screen2_address = addr & 0x3fff;
+ }
+ }
+ else if (m_start1change && (m_start1change == (m_linecounter / m_scanline_per_char_row)))
+ {
+ m_address = m_screen1_address;
+ m_start1change = 0;
+ }
- if (dw == 2)
- tilerow >>= 1;
- else if (dw == 3)
- tilerow = (charrow + m_scanline_per_char_row) >> 1;
+ if (dw == 2)
+ tilerow >>= 1;
+ else if (dw == 3)
+ tilerow = (charrow + m_scanline_per_char_row) >> 1;
- uint16_t address = m_address;
+ uint16_t address = m_address;
- for (int i = 0; i < m_character_per_row; i++)
+ const bool mbc = (charrow == 0) && (m_buffer_mode_select == 3);
+ const bool blink_on = (screen().frame_number() & (m_character_blink_rate_divisor >> 1)) != 0;
+ for (int i = 0; i < m_character_per_row; i++)
+ {
+ u8 charcode, attrcode = 0;
+ if (mbc && !m_mbc_char_cb.isnull())
+ {
+ // row buffering DMA
+ charcode = m_mbc_char_cb(address);
+ m_char_space->write_byte(address, charcode);
+ if (m_attr_space != nullptr && !m_mbc_attr_cb.isnull())
{
- bool cursor_on = ((address & 0x3fff) == m_cursor_address);
-
- if (!m_display_cb.isnull())
- m_display_cb(m_bitmap,
- i * m_hpixels_per_column,
- m_linecounter,
- tilerow,
- m_char_space->read_byte(address),
- m_attr_space != nullptr ? m_attr_space->read_byte(address) : 0,
- address,
- (charrow >= m_cursor_first_scanline) && (charrow <= m_cursor_last_scanline) && cursor_on,
- dw != 0,
- m_gfx_enabled,
- charrow == m_cursor_underline_position,
- m_cursor_blink && (screen().frame_number() & m_cursor_rate_divisor));
- address = (address + 1) & 0xffff;
-
- if (address > ((m_display_buffer_last_address << 10) | 0x3ff))
- address = m_display_buffer_first_address;
+ attrcode = m_mbc_attr_cb(address);
+ m_attr_space->write_byte(address, attrcode);
}
+ }
+ else
+ {
+ charcode = m_char_space->read_byte(address);
+ if (m_attr_space != nullptr)
+ attrcode = m_attr_space->read_byte(address);
+ }
+
+ if (m_display_enabled && !m_display_cb.isnull())
+ {
+ bool cursor_on = ((address & 0x3fff) == m_cursor_address)
+ && m_cursor_enabled
+ && (charrow >= m_cursor_first_scanline)
+ && (charrow <= m_cursor_last_scanline)
+ && (!m_cursor_blink || (screen().frame_number() & (m_cursor_rate_divisor >> 1)) != 0);
+ m_display_cb(m_bitmap,
+ i * m_hpixels_per_column,
+ m_linecounter,
+ tilerow,
+ charcode,
+ attrcode,
+ address,
+ cursor_on,
+ dw != 0,
+ m_gfx_enabled,
+ charrow == m_cursor_underline_position,
+ blink_on);
- if (m_gfx_enabled || (charrow == (m_scanline_per_char_row - 1)))
- m_address = address;
}
+ address = (address + 1) & 0xffff;
+
+ if (address > ((m_display_buffer_last_address << 10) | 0x3ff))
+ address = m_display_buffer_first_address;
+ }
+
+ if (!m_display_enabled)
+ std::fill_n(&m_bitmap.pix32(m_linecounter), m_character_per_row * m_hpixels_per_column, rgb_t::black());
+
+ if (m_gfx_enabled || (charrow == (m_scanline_per_char_row - 1)))
+ m_address = address;
+}
+
+TIMER_CALLBACK_MEMBER(scn2674_device::breq_timer)
+{
+ LOGMASKED(LOG_INTR, "BREQ %sasserted at line %d\n", (param == ASSERT_LINE) ? "" : "de", m_linecounter);
+ m_breq_cb(param);
+ if (param == CLEAR_LINE)
+ m_mbc_cb(0);
+}
+
+TIMER_CALLBACK_MEMBER(scn2674_device::vblank_timer)
+{
+ m_status_register |= 0x10;
+ if (BIT(m_irq_mask, 4))
+ {
+ LOGMASKED(LOG_INTR, "V-Blank interrupt at line %d\n", m_linecounter);
+ m_irq_register |= 0x10;
+ m_intr_cb(ASSERT_LINE);
}
}
uint32_t scn2674_device::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect)
{
- if (!m_display_enabled)
- m_bitmap.fill(rgb_t::black(), cliprect);
- else
- copybitmap(bitmap, m_bitmap, 0, 0, 0, 0, cliprect);
+ copybitmap(bitmap, m_bitmap, 0, 0, 0, 0, cliprect);
return 0;
}
diff --git a/src/devices/video/scn2674.h b/src/devices/video/scn2674.h
index 3090f740f8d..2b7367eeed0 100644
--- a/src/devices/video/scn2674.h
+++ b/src/devices/video/scn2674.h
@@ -23,6 +23,9 @@ public:
// static configuration
auto intr_callback() { return m_intr_cb.bind(); }
auto breq_callback() { return m_breq_cb.bind(); }
+ auto mbc_callback() { return m_mbc_cb.bind(); }
+ auto mbc_char_callback() { return m_mbc_char_cb.bind(); }
+ auto mbc_attr_callback() { return m_mbc_attr_cb.bind(); }
void set_character_width(int value) { m_hpixels_per_column = value; }
template <class FunctionClass>
@@ -54,14 +57,20 @@ protected:
virtual void device_start() override;
virtual void device_reset() override;
- virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override;
virtual space_config_vector memory_space_config() const override;
+ TIMER_CALLBACK_MEMBER(scanline_timer);
+ TIMER_CALLBACK_MEMBER(breq_timer);
+ TIMER_CALLBACK_MEMBER(vblank_timer);
+
//protected:
bitmap_rgb32 m_bitmap;
devcb_write_line m_intr_cb;
devcb_write_line m_breq_cb;
+ devcb_write_line m_mbc_cb;
+ devcb_read8 m_mbc_char_cb;
+ devcb_read8 m_mbc_attr_cb;
uint8_t m_IR_pointer;
uint16_t m_screen1_address;
@@ -72,6 +81,7 @@ protected:
uint8_t m_irq_mask;
bool m_gfx_enabled;
bool m_display_enabled;
+ bool m_dadd_enabled;
bool m_display_enabled_field;
bool m_display_enabled_scanline;
bool m_cursor_enabled;
@@ -129,14 +139,12 @@ protected:
draw_character_delegate m_display_cb;
emu_timer *m_scanline_timer;
+ emu_timer *m_breq_timer;
+ emu_timer *m_vblank_timer;
address_space *m_char_space;
address_space *m_attr_space;
const address_space_config m_char_space_config;
const address_space_config m_attr_space_config;
- enum
- {
- TIMER_SCANLINE
- };
};
class scn2672_device : public scn2674_device
diff --git a/src/devices/video/sda5708.h b/src/devices/video/sda5708.h
index eecb36e032c..4237675b95e 100644
--- a/src/devices/video/sda5708.h
+++ b/src/devices/video/sda5708.h
@@ -41,13 +41,6 @@
*
*/
-///*************************************************************************
-// INTERFACE CONFIGURATION MACROS
-///*************************************************************************
-
-#define MCFG_SDA5708_ADD(_tag) \
- MCFG_DEVICE_ADD(_tag, SDA5708, 0)
-
///*************************************************************************
// TYPE DEFINITIONS
diff --git a/src/devices/video/sed1200.h b/src/devices/video/sed1200.h
index 521bd4e027c..d6590af49ab 100644
--- a/src/devices/video/sed1200.h
+++ b/src/devices/video/sed1200.h
@@ -17,17 +17,6 @@
#pragma once
-#define MCFG_SED1200D0A_ADD( _tag ) \
- MCFG_DEVICE_ADD( _tag, SED1200D0A, 0 )
-
-#define MCFG_SED1200F0A_ADD( _tag ) \
- MCFG_DEVICE_ADD( _tag, SED1200F0A, 0 )
-
-#define MCFG_SED1200D0B_ADD( _tag ) \
- MCFG_DEVICE_ADD( _tag, SED1200D0B, 0 )
-
-#define MCFG_SED1200F0B_ADD( _tag ) \
- MCFG_DEVICE_ADD( _tag, SED1200F0B, 0 )
class sed1200_device : public device_t {
public:
diff --git a/src/devices/video/sed1330.cpp b/src/devices/video/sed1330.cpp
index 5015bb0d43b..75eefb18c9d 100644
--- a/src/devices/video/sed1330.cpp
+++ b/src/devices/video/sed1330.cpp
@@ -68,7 +68,8 @@ DEFINE_DEVICE_TYPE(SED1330, sed1330_device, "sed1330", "Epson SED1330")
// default address map
void sed1330_device::sed1330(address_map &map)
{
- map(0x0000, 0xffff).ram();
+ if (!has_configured_map(0))
+ map(0x0000, 0xffff).ram();
}
@@ -145,7 +146,7 @@ sed1330_device::sed1330_device(const machine_config &mconfig, const char *tag, d
device_memory_interface(mconfig, *this),
device_video_interface(mconfig, *this),
m_bf(0),
- m_space_config("videoram", ENDIANNESS_LITTLE, 8, 16, 0, address_map_constructor(), address_map_constructor(FUNC(sed1330_device::sed1330), this))
+ m_space_config("videoram", ENDIANNESS_LITTLE, 8, 16, 0, address_map_constructor(FUNC(sed1330_device::sed1330), this))
{
}
diff --git a/src/devices/video/t6a04.h b/src/devices/video/t6a04.h
index 0232ffc71a6..38906063f02 100644
--- a/src/devices/video/t6a04.h
+++ b/src/devices/video/t6a04.h
@@ -65,7 +65,4 @@ private:
// device type definition
DECLARE_DEVICE_TYPE(T6A04, t6a04_device)
-#define MCFG_T6A04_SIZE(_width, _height) \
- downcast<t6a04_device &>(*device).set_size(_width, _height);
-
#endif // MAME_VIDEO_T6A04_H
diff --git a/src/devices/video/tea1002.h b/src/devices/video/tea1002.h
index 067ec5583bc..44898c625ac 100644
--- a/src/devices/video/tea1002.h
+++ b/src/devices/video/tea1002.h
@@ -25,15 +25,6 @@
#pragma once
-
-//**************************************************************************
-// INTERFACE CONFIGURATION MACROS
-//**************************************************************************
-
-#define MCFG_TEA1002_ADD(_tag, _clock) \
- MCFG_DEVICE_ADD(_tag, TEA1002, _clock)
-
-
//**************************************************************************
// TYPE DEFINITIONS
//**************************************************************************
diff --git a/src/devices/video/tlc34076.cpp b/src/devices/video/tlc34076.cpp
index c33b302a3b8..37dd95a40b1 100644
--- a/src/devices/video/tlc34076.cpp
+++ b/src/devices/video/tlc34076.cpp
@@ -127,7 +127,7 @@ void tlc34076_device::update_pen(uint8_t i)
// read - read access
//-------------------------------------------------
-READ8_MEMBER( tlc34076_device::read )
+u8 tlc34076_device::read(offs_t offset)
{
uint8_t result;
@@ -161,7 +161,7 @@ READ8_MEMBER( tlc34076_device::read )
// write - write access
//-------------------------------------------------
-WRITE8_MEMBER( tlc34076_device::write )
+void tlc34076_device::write(offs_t offset, u8 data)
{
// uint8_t oldval;
diff --git a/src/devices/video/tlc34076.h b/src/devices/video/tlc34076.h
index fb816dd1181..7c4b021bd27 100644
--- a/src/devices/video/tlc34076.h
+++ b/src/devices/video/tlc34076.h
@@ -41,8 +41,8 @@ public:
void set_bits(tlc34076_bits bits) { m_dacbits = bits; }
// public interface
- DECLARE_READ8_MEMBER(read);
- DECLARE_WRITE8_MEMBER(write);
+ u8 read(offs_t offset);
+ void write(offs_t offset, u8 data);
protected:
// device-level overrides
@@ -66,15 +66,6 @@ private:
};
-/***************************************************************************
- DEVICE CONFIGURATION MACROS
-***************************************************************************/
-
-#define MCFG_TLC34076_ADD(tag, bits) \
- MCFG_DEVICE_ADD((tag), TLC34076, 0) \
- downcast<tlc34076_device &>(*device).set_bits((tlc34076_device::bits));
-
-
DECLARE_DEVICE_TYPE(TLC34076, tlc34076_device)
#endif // MAME_VIDEO_TLC34076_H
diff --git a/src/devices/video/tms34061.cpp b/src/devices/video/tms34061.cpp
index 397b412e586..8204facf1a1 100644
--- a/src/devices/video/tms34061.cpp
+++ b/src/devices/video/tms34061.cpp
@@ -32,7 +32,7 @@
DEFINE_DEVICE_TYPE(TMS34061, tms34061_device, "tms34061", "TI TMS34061 VSC")
-tms34061_device::tms34061_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+tms34061_device::tms34061_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
: device_t(mconfig, TMS34061, tag, owner, clock),
device_video_interface(mconfig, *this),
m_rowshift(0),
@@ -64,10 +64,10 @@ void tms34061_device::device_start()
m_vrammask = m_vramsize - 1;
/* allocate memory for VRAM */
- m_vram = auto_alloc_array_clear(machine(), uint8_t, m_vramsize + 256 * 2);
+ m_vram = auto_alloc_array_clear(machine(), u8, m_vramsize + 256 * 2);
/* allocate memory for latch RAM */
- m_latchram = auto_alloc_array_clear(machine(), uint8_t, m_vramsize + 256 * 2);
+ m_latchram = auto_alloc_array_clear(machine(), u8, m_vramsize + 256 * 2);
/* add some buffer space for VRAM and latch RAM */
m_vram += 256;
@@ -171,7 +171,7 @@ TIMER_CALLBACK_MEMBER( tms34061_device::interrupt )
*
*************************************/
-void tms34061_device::register_w(address_space &space, offs_t offset, uint8_t data)
+void tms34061_device::register_w(offs_t offset, u8 data)
{
int scanline;
int regnum = offset >> 2;
@@ -242,10 +242,10 @@ void tms34061_device::register_w(address_space &space, offs_t offset, uint8_t da
*
*************************************/
-uint8_t tms34061_device::register_r(address_space &space, offs_t offset)
+u8 tms34061_device::register_r(offs_t offset)
{
int regnum = offset >> 2;
- uint16_t result;
+ u16 result;
/* extract the correct portion of the register */
if (regnum < ARRAY_LENGTH(m_regs))
@@ -364,7 +364,7 @@ void tms34061_device::adjust_xyaddress(int offset)
}
-void tms34061_device::xypixel_w(address_space &space, int offset, uint8_t data)
+void tms34061_device::xypixel_w(int offset, u8 data)
{
/* determine the offset, then adjust it */
offs_t pixeloffs = m_regs[TMS34061_XYADDRESS];
@@ -384,7 +384,7 @@ void tms34061_device::xypixel_w(address_space &space, int offset, uint8_t data)
}
-uint8_t tms34061_device::xypixel_r(address_space &space, int offset)
+u8 tms34061_device::xypixel_r(int offset)
{
/* determine the offset, then adjust it */
offs_t pixeloffs = m_regs[TMS34061_XYADDRESS];
@@ -409,7 +409,7 @@ uint8_t tms34061_device::xypixel_r(address_space &space, int offset)
*
*************************************/
-void tms34061_device::write(address_space &space, int col, int row, int func, uint8_t data)
+void tms34061_device::write(int col, int row, int func, u8 data)
{
offs_t offs;
@@ -419,12 +419,12 @@ void tms34061_device::write(address_space &space, int col, int row, int func, ui
/* both 0 and 2 map to register access */
case 0:
case 2:
- register_w(space, col, data);
+ register_w(col, data);
break;
/* function 1 maps to XY access; col is the address adjustment */
case 1:
- xypixel_w(space, col, data);
+ xypixel_w(col, data);
break;
/* function 3 maps to direct access */
@@ -471,7 +471,7 @@ void tms34061_device::write(address_space &space, int col, int row, int func, ui
}
-uint8_t tms34061_device::read(address_space &space, int col, int row, int func)
+u8 tms34061_device::read(int col, int row, int func)
{
int result = 0;
offs_t offs;
@@ -482,12 +482,12 @@ uint8_t tms34061_device::read(address_space &space, int col, int row, int func)
/* both 0 and 2 map to register access */
case 0:
case 2:
- result = register_r(space, col);
+ result = register_r(col);
break;
/* function 1 maps to XY access; col is the address adjustment */
case 1:
- result = xypixel_r(space, col);
+ result = xypixel_r(col);
break;
/* function 3 maps to direct access */
@@ -535,13 +535,13 @@ uint8_t tms34061_device::read(address_space &space, int col, int row, int func)
*
*************************************/
-READ8_MEMBER( tms34061_device::latch_r )
+u8 tms34061_device::latch_r()
{
return m_latchdata;
}
-WRITE8_MEMBER( tms34061_device::latch_w )
+void tms34061_device::latch_w(u8 data)
{
LOG("tms34061_latch = %02X\n", data);
m_latchdata = data;
diff --git a/src/devices/video/tms34061.h b/src/devices/video/tms34061.h
index e4f92e75ac2..3b3e3d5f552 100644
--- a/src/devices/video/tms34061.h
+++ b/src/devices/video/tms34061.h
@@ -15,17 +15,6 @@
#pragma once
-#define MCFG_TMS34061_ROWSHIFT(_shift) \
- downcast<tms34061_device &>(*device).set_rowshift(_shift);
-
-#define MCFG_TMS34061_VRAM_SIZE(_size) \
- downcast<tms34061_device &>(*device).set_vram_size(_size);
-
-#define MCFG_TMS34061_INTERRUPT_CB(_devcb) \
- downcast<tms34061_device &>(*device).set_interrupt_callback(DEVCB_##_devcb);
-
-
-
// ======================> tms34061_device
class tms34061_device : public device_t, public device_video_interface
@@ -34,36 +23,35 @@ public:
/* display state structure */
struct tms34061_display
{
- uint8_t blanked; /* true if blanked */
- uint8_t *vram; /* base of VRAM */
- uint8_t *latchram; /* base of latch RAM */
- uint16_t *regs; /* pointer to array of registers */
+ u8 blanked; /* true if blanked */
+ u8 *vram; /* base of VRAM */
+ u8 *latchram; /* base of latch RAM */
+ u16 *regs; /* pointer to array of registers */
offs_t dispstart; /* display start */
};
// construction/destruction
- tms34061_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+ tms34061_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
- void set_rowshift(uint8_t rowshift) { m_rowshift = rowshift; }
- void set_vram_size(uint32_t vramsize) { m_vramsize = vramsize; }
- template <class Object> devcb_base &set_interrupt_callback(Object &&cb) { return m_interrupt_cb.set_callback(std::forward<Object>(cb)); }
+ void set_rowshift(u8 rowshift) { m_rowshift = rowshift; }
+ void set_vram_size(u32 vramsize) { m_vramsize = vramsize; }
auto int_callback() { return m_interrupt_cb.bind(); }
/* reads/writes to the 34061 */
- uint8_t read(address_space &space, int col, int row, int func);
- void write(address_space &space, int col, int row, int func, uint8_t data);
+ u8 read(int col, int row, int func);
+ void write(int col, int row, int func, u8 data);
/* latch settings */
- DECLARE_READ8_MEMBER( latch_r );
- DECLARE_WRITE8_MEMBER( latch_w );
+ u8 latch_r();
+ void latch_w(u8 data);
/* video update handling */
void get_display_state();
bool blanked() const { return bool(m_display.blanked); }
- uint8_t const &vram(unsigned row) const { return m_display.vram[row << m_rowshift]; }
- uint16_t xyoffset() const { return m_display.regs[TMS34061_XYOFFSET]; }
- uint16_t xyaddress() const { return m_display.regs[TMS34061_XYADDRESS]; }
+ u8 const &vram(unsigned row) const { return m_display.vram[row << m_rowshift]; }
+ u16 xyoffset() const { return m_display.regs[TMS34061_XYOFFSET]; }
+ u16 xyaddress() const { return m_display.regs[TMS34061_XYADDRESS]; }
// TODO: encapsulate this properly
tms34061_display m_display;
@@ -98,27 +86,27 @@ private:
TMS34061_REGCOUNT
};
- uint8_t m_rowshift; /* VRAM address is (row << rowshift) | col */
- uint32_t m_vramsize; /* size of video RAM */
+ u8 m_rowshift; /* VRAM address is (row << rowshift) | col */
+ u32 m_vramsize; /* size of video RAM */
devcb_write_line m_interrupt_cb; /* interrupt gen callback */
- uint16_t m_regs[TMS34061_REGCOUNT];
- uint16_t m_xmask;
- uint8_t m_yshift;
- uint32_t m_vrammask;
- uint8_t * m_vram;
- uint8_t * m_latchram;
- uint8_t m_latchdata;
- uint8_t * m_shiftreg;
- emu_timer * m_timer;
+ u16 m_regs[TMS34061_REGCOUNT];
+ u16 m_xmask;
+ u8 m_yshift;
+ u32 m_vrammask;
+ u8 * m_vram;
+ u8 * m_latchram;
+ u8 m_latchdata;
+ u8 * m_shiftreg;
+ emu_timer * m_timer;
void update_interrupts();
TIMER_CALLBACK_MEMBER( interrupt );
- void register_w(address_space &space, offs_t offset, uint8_t data);
- uint8_t register_r(address_space &space, offs_t offset);
+ void register_w(offs_t offset, u8 data);
+ u8 register_r(offs_t offset);
void adjust_xyaddress(int offset);
- void xypixel_w(address_space &space, int offset, uint8_t data);
- uint8_t xypixel_r(address_space &space, int offset);
+ void xypixel_w(int offset, u8 data);
+ u8 xypixel_r(int offset);
};
// device type definition
diff --git a/src/devices/video/tms3556.cpp b/src/devices/video/tms3556.cpp
index c856735756f..80280fe5364 100644
--- a/src/devices/video/tms3556.cpp
+++ b/src/devices/video/tms3556.cpp
@@ -59,7 +59,8 @@ DEFINE_DEVICE_TYPE(TMS3556, tms3556_device, "tms3556", "Texas Instruments TMS355
// default address map
void tms3556_device::tms3556(address_map &map)
{
- map(0x0000, 0xffff).ram();
+ if (!has_configured_map(0))
+ map(0x0000, 0xffff).ram();
}
//-------------------------------------------------
@@ -111,7 +112,7 @@ tms3556_device::tms3556_device(const machine_config &mconfig, const char *tag, d
: device_t(mconfig, TMS3556, tag, owner, clock),
device_memory_interface(mconfig, *this),
device_video_interface(mconfig, *this),
- m_space_config("videoram", ENDIANNESS_LITTLE, 8, 17, 0, address_map_constructor(), address_map_constructor(FUNC(tms3556_device::tms3556), this)),
+ m_space_config("videoram", ENDIANNESS_LITTLE, 8, 17, 0, address_map_constructor(FUNC(tms3556_device::tms3556), this)),
m_reg(0), m_reg2(0),
m_reg_access_phase(0),
m_row_col_written(0),
diff --git a/src/devices/video/tms3556.h b/src/devices/video/tms3556.h
index 11146f8b21f..e20e02d09c3 100644
--- a/src/devices/video/tms3556.h
+++ b/src/devices/video/tms3556.h
@@ -19,12 +19,6 @@
/* if DOUBLE_WIDTH set, the horizontal resolution is doubled */
#define TMS3556_DOUBLE_WIDTH 0
-///*************************************************************************
-// INTERFACE CONFIGURATION MACROS
-///*************************************************************************
-
-#define MCFG_TMS3556_ADD(_tag) \
- MCFG_DEVICE_ADD(_tag, TMS3556, 0)
///*************************************************************************
// TYPE DEFINITIONS
diff --git a/src/devices/video/tms9927.cpp b/src/devices/video/tms9927.cpp
index 9a43cb1f635..bc8e187f8e8 100644
--- a/src/devices/video/tms9927.cpp
+++ b/src/devices/video/tms9927.cpp
@@ -81,7 +81,7 @@ crt5057_device::crt5057_device(const machine_config &mconfig, const char *tag, d
void tms9927_device::device_start()
{
assert(clock() > 0);
- if (!(m_hpixels_per_column > 0)) fatalerror("TMS9927: number of pixels per column must be explicitly set using MCFG_TMS9927_CHAR_WIDTH()!\n");
+ if (!(m_hpixels_per_column > 0)) fatalerror("TMS9927: number of pixels per column must be explicitly set using set_char_width()!\n");
// resolve callbacks
m_write_vsyn.resolve_safe();
diff --git a/src/devices/video/tms9928a.cpp b/src/devices/video/tms9928a.cpp
index bc31b1b1db9..c068d8b4ce8 100644
--- a/src/devices/video/tms9928a.cpp
+++ b/src/devices/video/tms9928a.cpp
@@ -52,11 +52,11 @@ DEFINE_DEVICE_TYPE(EFO90501, efo90501_device, "efo90501", "EFO90501 VDP")
*/
void tms9928a_device::memmap(address_map &map)
{
- map.global_mask(0x3fff);
- map(0x0000, 0x3fff).ram();
+ if (!has_configured_map(0))
+ map(0x0000, 0x3fff).ram();
}
-tms9928a_device::tms9928a_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock, bool is_50hz, bool is_reva, bool is_99)
+tms9928a_device::tms9928a_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock, uint16_t horz_total, bool is_50hz, bool is_reva, bool is_99)
: device_t(mconfig, type, tag, owner, clock)
, device_memory_interface(mconfig, *this)
, device_palette_interface(mconfig, *this)
@@ -64,10 +64,11 @@ tms9928a_device::tms9928a_device(const machine_config &mconfig, device_type type
, m_vram_size(0)
, m_out_int_line_cb(*this)
, m_out_gromclk_cb(*this)
+ , m_total_horz(horz_total)
, m_50hz(is_50hz)
, m_reva(is_reva)
, m_99(is_99)
- , m_space_config("vram", ENDIANNESS_BIG, 8, 14, 0, address_map_constructor(), address_map_constructor(FUNC(tms9928a_device::memmap), this))
+ , m_space_config("vram", ENDIANNESS_BIG, 8, 14, 0, address_map_constructor(FUNC(tms9928a_device::memmap), this))
{
}
@@ -82,57 +83,57 @@ void tms9928a_device::device_config_complete()
if (!screen().refresh_attoseconds())
{
if (m_50hz)
- screen().set_raw(clock() / 2, TOTAL_HORZ, HORZ_DISPLAY_START - 12, HORZ_DISPLAY_START + 256 + 12,
+ screen().set_raw(clock() / 2, m_total_horz, HORZ_DISPLAY_START - 12, HORZ_DISPLAY_START + 256 + 12,
TOTAL_VERT_PAL, VERT_DISPLAY_START_PAL - 12, VERT_DISPLAY_START_PAL + 192 + 12);
else
- screen().set_raw(clock() / 2, TOTAL_HORZ, HORZ_DISPLAY_START - 12, HORZ_DISPLAY_START + 256 + 12,
+ screen().set_raw(clock() / 2, m_total_horz, HORZ_DISPLAY_START - 12, HORZ_DISPLAY_START + 256 + 12,
TOTAL_VERT_NTSC, VERT_DISPLAY_START_NTSC - 12, VERT_DISPLAY_START_NTSC + 192 + 12);
}
}
tms9928a_device::tms9928a_device( const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
- : tms9928a_device(mconfig, TMS9928A, tag, owner, clock, false, true, true)
+ : tms9928a_device(mconfig, TMS9928A, tag, owner, clock, 342, false, true, true)
{
}
tms9129_device::tms9129_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
- : tms9928a_device(mconfig, TMS9129, tag, owner, clock, true, true, false)
+ : tms9928a_device(mconfig, TMS9129, tag, owner, clock, 342, true, true, false)
{
}
tms9918_device::tms9918_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
- : tms9928a_device(mconfig, TMS9918, tag, owner, clock, false, false, true)
+ : tms9928a_device(mconfig, TMS9918, tag, owner, clock, 342, false, false, true)
{
}
tms9918a_device::tms9918a_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
- : tms9928a_device(mconfig, TMS9918A, tag, owner, clock, false, true, true)
+ : tms9928a_device(mconfig, TMS9918A, tag, owner, clock, 342, false, true, true)
{
}
tms9118_device::tms9118_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
- : tms9928a_device(mconfig, TMS9118, tag, owner, clock, false, true, false)
+ : tms9928a_device(mconfig, TMS9118, tag, owner, clock, 342, false, true, false)
{
}
tms9128_device::tms9128_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
- : tms9928a_device(mconfig, TMS9128, tag, owner, clock, false, true, false)
+ : tms9928a_device(mconfig, TMS9128, tag, owner, clock, 342, false, true, false)
{
}
tms9929_device::tms9929_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
- : tms9928a_device(mconfig, TMS9929, tag, owner, clock, true, false, true)
+ : tms9928a_device(mconfig, TMS9929, tag, owner, clock, 342, true, false, true)
{
}
tms9929a_device::tms9929a_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
- : tms9928a_device(mconfig, TMS9929A, tag, owner, clock, true, true, true)
+ : tms9928a_device(mconfig, TMS9929A, tag, owner, clock, 342, true, true, true)
{
}
efo90501_device::efo90501_device( const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
- : tms9928a_device(mconfig, EFO90501, tag, owner, clock, true, true, true)
+ : tms9928a_device(mconfig, EFO90501, tag, owner, clock, 346, true, true, true)
{
}
@@ -143,7 +144,7 @@ device_memory_interface::space_config_vector tms9928a_device::memory_space_confi
};
}
-READ8_MEMBER( tms9928a_device::read )
+uint8_t tms9928a_device::read(offs_t offset)
{
uint8_t value = 0;
@@ -155,7 +156,7 @@ READ8_MEMBER( tms9928a_device::read )
return value;
}
-WRITE8_MEMBER( tms9928a_device::write )
+void tms9928a_device::write(offs_t offset, uint8_t data)
{
if ((offset & 1) == 0)
vram_write(data);
@@ -165,11 +166,11 @@ WRITE8_MEMBER( tms9928a_device::write )
u8 tms9928a_device::vram_read()
{
- // prevent debugger from changing the address base
- if (machine().side_effects_disabled()) return 0;
-
uint8_t data = m_ReadAhead;
+ // prevent debugger from changing the address base
+ if (machine().side_effects_disabled()) return data;
+
m_ReadAhead = m_vram_space->read_byte(m_Addr);
m_Addr = (m_Addr + 1) & (m_vram_size - 1);
m_latch = 0;
@@ -192,11 +193,11 @@ void tms9928a_device::vram_write(u8 data)
u8 tms9928a_device::register_read()
{
- // prevent debugger from changing the internal state
- if (machine().side_effects_disabled()) return 0;
-
uint8_t data = m_StatusReg;
+ // prevent debugger from changing the internal state
+ if (machine().side_effects_disabled()) return data;
+
m_StatusReg = m_FifthSprite;
check_interrupt();
m_latch = 0;
@@ -371,7 +372,7 @@ void tms9928a_device::device_timer(emu_timer &timer, device_timer_id id, int par
if ( y < 0 || y >= 192 || ! (m_Regs[1] & 0x40) )
{
/* Draw backdrop colour */
- for ( int i = 0; i < TOTAL_HORZ; i++ )
+ for ( int i = 0; i < m_total_horz; i++ )
p[i] = pen(BackColour);
/* vblank is set at the last cycle of the first inactive line */
@@ -650,7 +651,7 @@ void tms9928a_device::device_timer(emu_timer &timer, device_timer_id id, int par
}
/* Right border */
- for ( int i = HORZ_DISPLAY_START + 256; i < TOTAL_HORZ; i++ )
+ for ( int i = HORZ_DISPLAY_START + 256; i < m_total_horz; i++ )
p[i] = pen(BackColour);
}
@@ -734,7 +735,7 @@ void tms9928a_device::device_start()
m_vram_space = &space(AS_DATA);
/* back bitmap */
- m_tmpbmp.allocate(TOTAL_HORZ, TOTAL_VERT_PAL);
+ m_tmpbmp.allocate(m_total_horz, TOTAL_VERT_PAL);
m_line_timer = timer_alloc(TIMER_LINE);
m_gromclk_timer = timer_alloc(GROMCLK);
diff --git a/src/devices/video/tms9928a.h b/src/devices/video/tms9928a.h
index 0798183f0ea..72c466d464b 100644
--- a/src/devices/video/tms9928a.h
+++ b/src/devices/video/tms9928a.h
@@ -73,13 +73,8 @@ public:
auto int_callback() { return m_out_int_line_cb.bind(); }
auto gromclk_callback() { return m_out_gromclk_cb.bind(); }
- DECLARE_READ8_MEMBER( read );
- DECLARE_WRITE8_MEMBER( write );
-
- DECLARE_READ8_MEMBER( vram_r ) { return vram_read(); }
- DECLARE_WRITE8_MEMBER( vram_w ) { vram_write(data); }
- DECLARE_READ8_MEMBER( register_r ) { return register_read(); }
- DECLARE_WRITE8_MEMBER( register_w ) { register_write(data); }
+ uint8_t read(offs_t offset);
+ void write(offs_t offset, uint8_t data);
u8 vram_read();
void vram_write(u8 data);
@@ -94,7 +89,7 @@ public:
void reset_line(int state) { if (state==ASSERT_LINE) device_reset(); }
protected:
- tms9928a_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock, bool is_50hz, bool is_reva, bool is_99);
+ tms9928a_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock, uint16_t horz_total, bool is_50hz, bool is_reva, bool is_99);
// device-level overrides
virtual void device_config_complete() override;
@@ -139,6 +134,7 @@ private:
uint16_t m_spritepattern;
int m_colourmask;
int m_patternmask;
+ const uint16_t m_total_horz;
const bool m_50hz;
const bool m_reva;
const bool m_99;
diff --git a/src/devices/video/upd3301.h b/src/devices/video/upd3301.h
index 80e9346eb6c..147c12c5b7d 100644
--- a/src/devices/video/upd3301.h
+++ b/src/devices/video/upd3301.h
@@ -43,26 +43,6 @@
#define UPD3301_DRAW_CHARACTER_MEMBER(_name) void _name(bitmap_rgb32 &bitmap, int y, int sx, uint8_t cc, uint8_t lc, int hlgt, int rvv, int vsp, int sl0, int sl12, int csr, int gpa)
-#define MCFG_UPD3301_CHARACTER_WIDTH(_value) \
- downcast<upd3301_device &>(*device).set_character_width(_value);
-
-#define MCFG_UPD3301_DRAW_CHARACTER_CALLBACK_OWNER(_class, _method) \
- downcast<upd3301_device &>(*device).set_display_callback(&_class::_method, #_class "::" #_method, this);
-
-#define MCFG_UPD3301_DRQ_CALLBACK(_write) \
- downcast<upd3301_device &>(*device).set_drq_wr_callback(DEVCB_##_write);
-
-#define MCFG_UPD3301_INT_CALLBACK(_write) \
- downcast<upd3301_device &>(*device).set_int_wr_callback(DEVCB_##_write);
-
-#define MCFG_UPD3301_HRTC_CALLBACK(_write) \
- downcast<upd3301_device &>(*device).set_hrtc_wr_callback(DEVCB_##_write);
-
-#define MCFG_UPD3301_VRTC_CALLBACK(_write) \
- downcast<upd3301_device &>(*device).set_vrtc_wr_callback(DEVCB_##_write);
-
-
-
//**************************************************************************
// TYPE DEFINITIONS
//**************************************************************************
@@ -93,10 +73,6 @@ public:
set_display_callback(draw_character_delegate(callback, name, nullptr, static_cast<FunctionClass *>(nullptr)));
}
- template <class Object> devcb_base &set_drq_wr_callback(Object &&cb) { return m_write_drq.set_callback(std::forward<Object>(cb)); }
- template <class Object> devcb_base &set_int_wr_callback(Object &&cb) { return m_write_int.set_callback(std::forward<Object>(cb)); }
- template <class Object> devcb_base &set_hrtc_wr_callback(Object &&cb) { return m_write_hrtc.set_callback(std::forward<Object>(cb)); }
- template <class Object> devcb_base &set_vrtc_wr_callback(Object &&cb) { return m_write_vrtc.set_callback(std::forward<Object>(cb)); }
auto drq_wr_callback() { return m_write_drq.bind(); }
auto int_wr_callback() { return m_write_int.bind(); }
auto hrtc_wr_callback() { return m_write_hrtc.bind(); }
diff --git a/src/devices/video/upd7220.cpp b/src/devices/video/upd7220.cpp
index 16bbc507a5a..d8697222485 100644
--- a/src/devices/video/upd7220.cpp
+++ b/src/devices/video/upd7220.cpp
@@ -151,7 +151,8 @@ DEFINE_DEVICE_TYPE(UPD7220, upd7220_device, "upd7220", "NEC uPD7220")
// default address map
void upd7220_device::upd7220_vram(address_map &map)
{
- map(0x00000, 0x3ffff).ram();
+ if (!has_configured_map(0))
+ map(0x00000, 0x3ffff).ram();
}
@@ -649,7 +650,7 @@ upd7220_device::upd7220_device(const machine_config &mconfig, const char *tag, d
m_disp(0),
m_gchr(0),
m_bitmap_mod(0),
- m_space_config("videoram", ENDIANNESS_LITTLE, 16, 18, 0, address_map_constructor(), address_map_constructor(FUNC(upd7220_device::upd7220_vram), this))
+ m_space_config("videoram", ENDIANNESS_LITTLE, 16, 18, 0, address_map_constructor(FUNC(upd7220_device::upd7220_vram), this))
{
for (int i = 0; i < 16; i++)
{
@@ -1447,7 +1448,7 @@ void upd7220_device::continue_command()
// read -
//-------------------------------------------------
-READ8_MEMBER( upd7220_device::read )
+uint8_t upd7220_device::read(offs_t offset)
{
uint8_t data;
@@ -1478,7 +1479,7 @@ READ8_MEMBER( upd7220_device::read )
// write -
//-------------------------------------------------
-WRITE8_MEMBER( upd7220_device::write )
+void upd7220_device::write(offs_t offset, uint8_t data)
{
if (offset & 1)
{
@@ -1501,7 +1502,7 @@ WRITE8_MEMBER( upd7220_device::write )
// dack_r -
//-------------------------------------------------
-READ8_MEMBER( upd7220_device::dack_r )
+uint8_t upd7220_device::dack_r()
{
return 0;
}
@@ -1511,7 +1512,7 @@ READ8_MEMBER( upd7220_device::dack_r )
// dack_w -
//-------------------------------------------------
-WRITE8_MEMBER( upd7220_device::dack_w )
+void upd7220_device::dack_w(uint8_t data)
{
}
diff --git a/src/devices/video/upd7220.h b/src/devices/video/upd7220.h
index 6a9837d90eb..7c7370c0cd9 100644
--- a/src/devices/video/upd7220.h
+++ b/src/devices/video/upd7220.h
@@ -62,19 +62,58 @@ public:
// construction/destruction
upd7220_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- template <typename... T> void set_display_pixels_callback(T &&... args) { m_display_cb = display_pixels_delegate(std::forward<T>(args)...); }
- template <typename... T> void set_draw_text_callback(T &&... args) { m_draw_text_cb = draw_text_delegate(std::forward<T>(args)...); }
+ // FIXME: these should be aware of current device for resolving the tag
+ template <class FunctionClass>
+ void set_display_pixels(void (FunctionClass::*init)(bitmap_rgb32 &, int, int, uint32_t), const char *name)
+ {
+ m_display_cb = display_pixels_delegate(init, name, nullptr, static_cast<FunctionClass *>(nullptr));
+ }
+ template <class FunctionClass>
+ void set_display_pixels(void (FunctionClass::*init)(bitmap_rgb32 &, int, int, uint32_t) const, const char *name)
+ {
+ m_display_cb = display_pixels_delegate(init, name, nullptr, static_cast<FunctionClass *>(nullptr));
+ }
+ template <class FunctionClass>
+ void set_display_pixels(const char *devname, void (FunctionClass::*init)(bitmap_rgb32 &, int, int, uint32_t), const char *name)
+ {
+ m_display_cb = display_pixels_delegate(init, name, devname, static_cast<FunctionClass *>(nullptr));
+ }
+ template <class FunctionClass>
+ void set_display_pixels(const char *devname, void (FunctionClass::*init)(bitmap_rgb32 &, int, int, uint32_t) const, const char *name)
+ {
+ m_display_cb = display_pixels_delegate(init, name, devname, static_cast<FunctionClass *>(nullptr));
+ }
+ template <class FunctionClass>
+ void set_draw_text(void (FunctionClass::*init)(bitmap_rgb32 &, uint32_t, int, int, int, int, int, int), const char *name)
+ {
+ m_draw_text_cb = draw_text_delegate(init, name, nullptr, static_cast<FunctionClass *>(nullptr));
+ }
+ template <class FunctionClass>
+ void set_draw_text(void (FunctionClass::*init)(bitmap_rgb32 &, uint32_t, int, int, int, int, int, int) const, const char *name)
+ {
+ m_draw_text_cb = draw_text_delegate(init, name, nullptr, static_cast<FunctionClass *>(nullptr));
+ }
+ template <class FunctionClass>
+ void set_draw_text(const char *devname, void (FunctionClass::*init)(bitmap_rgb32 &, uint32_t, int, int, int, int, int, int), const char *name)
+ {
+ m_draw_text_cb = draw_text_delegate(init, name, devname, static_cast<FunctionClass *>(nullptr));
+ }
+ template <class FunctionClass>
+ void set_draw_text(const char *devname, void (FunctionClass::*init)(bitmap_rgb32 &, uint32_t, int, int, int, int, int, int) const, const char *name)
+ {
+ m_draw_text_cb = draw_text_delegate(init, name, devname, static_cast<FunctionClass *>(nullptr));
+ }
auto drq_wr_callback() { return m_write_drq.bind(); }
auto hsync_wr_callback() { return m_write_hsync.bind(); }
auto vsync_wr_callback() { return m_write_vsync.bind(); }
auto blank_wr_callback() { return m_write_blank.bind(); }
- DECLARE_READ8_MEMBER( read );
- DECLARE_WRITE8_MEMBER( write );
+ uint8_t read(offs_t offset);
+ void write(offs_t offset, uint8_t data);
- DECLARE_READ8_MEMBER( dack_r );
- DECLARE_WRITE8_MEMBER( dack_w );
+ uint8_t dack_r();
+ void dack_w(uint8_t data);
DECLARE_WRITE_LINE_MEMBER( ext_sync_w );
DECLARE_WRITE_LINE_MEMBER( lpen_w );
diff --git a/src/devices/video/v9938.cpp b/src/devices/video/v9938.cpp
index d33331eaa32..f7368efc485 100644
--- a/src/devices/video/v9938.cpp
+++ b/src/devices/video/v9938.cpp
@@ -369,7 +369,7 @@ uint32_t v99x8_device::screen_update(screen_device &screen, bitmap_rgb32 &bitmap
return 0;
}
-READ8_MEMBER( v99x8_device::read )
+uint8_t v99x8_device::read(offs_t offset)
{
switch (offset & 3)
{
@@ -379,7 +379,7 @@ READ8_MEMBER( v99x8_device::read )
return 0xff;
}
-WRITE8_MEMBER( v99x8_device::write )
+void v99x8_device::write(offs_t offset, uint8_t data)
{
switch (offset & 3)
{
diff --git a/src/devices/video/v9938.h b/src/devices/video/v9938.h
index 0e1a3640cb9..d0bbf7c48c5 100644
--- a/src/devices/video/v9938.h
+++ b/src/devices/video/v9938.h
@@ -54,8 +54,8 @@ public:
uint32_t screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
- DECLARE_READ8_MEMBER( read );
- DECLARE_WRITE8_MEMBER( write );
+ uint8_t read(offs_t offset);
+ void write(offs_t offset, uint8_t data);
uint8_t vram_r();
uint8_t status_r();
diff --git a/src/devices/video/vector.h b/src/devices/video/vector.h
index 919395f043a..6b473c3501c 100644
--- a/src/devices/video/vector.h
+++ b/src/devices/video/vector.h
@@ -62,7 +62,4 @@ private:
// device type definition
DECLARE_DEVICE_TYPE(VECTOR, vector_device)
-#define MCFG_VECTOR_ADD(_tag) \
- MCFG_DEVICE_ADD(_tag, VECTOR, 0)
-
#endif // MAME_VIDEO_VECTOR_H
diff --git a/src/devices/video/vic4567.h b/src/devices/video/vic4567.h
index e680a3ff0cf..ecadbfe19d9 100644
--- a/src/devices/video/vic4567.h
+++ b/src/devices/video/vic4567.h
@@ -110,16 +110,16 @@ public:
vic3_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- void set_cpu_tag(const char *tag) { m_cpu.set_tag(tag); }
+ template <typename T> void set_cpu_tag(T &&tag) { m_cpu.set_tag(std::forward<T>(tag)); }
void set_vic3_type(vic3_type type) { m_type = type; }
- template <class Object> devcb_base &set_dma_read_callback(Object &&cb) { return m_dma_read_cb.set_callback(std::forward<Object>(cb)); }
- template <class Object> devcb_base &set_dma_read_color_callback(Object &&cb) { return m_dma_read_color_cb.set_callback(std::forward<Object>(cb)); }
- template <class Object> devcb_base &set_interrupt_callback(Object &&cb) { return m_interrupt_cb.set_callback(std::forward<Object>(cb)); }
- template <class Object> devcb_base &set_port_changed_callback(Object &&cb) { return m_port_changed_cb.set_callback(std::forward<Object>(cb)); }
- template <class Object> devcb_base &set_lightpen_button_callback(Object &&cb) { return m_lightpen_button_cb.set_callback(std::forward<Object>(cb)); }
- template <class Object> devcb_base &set_lightpen_x_callback(Object &&cb) { return m_lightpen_x_cb.set_callback(std::forward<Object>(cb)); }
- template <class Object> devcb_base &set_lightpen_y_callback(Object &&cb) { return m_lightpen_y_cb.set_callback(std::forward<Object>(cb)); }
- template <class Object> devcb_base &set_c64_mem_r_callback(Object &&cb) { return m_c64_mem_r_cb.set_callback(std::forward<Object>(cb)); }
+ auto dma_read_callback() { return m_dma_read_cb.bind(); }
+ auto dma_read_color_callback() { return m_dma_read_color_cb.bind(); }
+ auto interrupt_callback() { return m_interrupt_cb.bind(); }
+ auto port_changed_callback() { return m_port_changed_cb.bind(); }
+ auto lightpen_button_callback() { return m_lightpen_button_cb.bind(); }
+ auto lightpen_x_callback() { return m_lightpen_x_cb.bind(); }
+ auto lightpen_y_callback() { return m_lightpen_y_cb.bind(); }
+ auto c64_mem_r_callback() { return m_c64_mem_r_cb.bind(); }
DECLARE_WRITE8_MEMBER(port_w);
DECLARE_WRITE8_MEMBER(palette_w);
@@ -236,35 +236,4 @@ private:
DECLARE_DEVICE_TYPE(VIC3, vic3_device)
-
-#define MCFG_VIC3_CPU(tag) \
- downcast<vic3_device &>(*device).set_cpu_tag(tag);
-
-#define MCFG_VIC3_TYPE(type) \
- downcast<vic3_device &>(*device).set_vic3_type((vic3_device::vic3_type::type));
-
-#define MCFG_VIC3_DMA_READ_CB(cb) \
- downcast<vic3_device &>(*device).set_dma_read_callback((DEVCB_##cb));
-
-#define MCFG_VIC3_DMA_READ_COLOR_CB(cb) \
- downcast<vic3_device &>(*device).set_dma_read_color_callback((DEVCB_##cb));
-
-#define MCFG_VIC3_INTERRUPT_CB(cb) \
- downcast<vic3_device &>(*device).set_interrupt_callback((DEVCB_##cb));
-
-#define MCFG_VIC3_PORT_CHANGED_CB(cb) \
- downcast<vic3_device &>(*device).set_port_changed_callback((DEVCB_##cb));
-
-#define MCFG_VIC3_LIGHTPEN_BUTTON_CB(cb) \
- downcast<vic3_device &>(*device).set_lightpen_button_callback((DEVCB_##cb));
-
-#define MCFG_VIC3_LIGHTPEN_X_CB(cb) \
- downcast<vic3_device &>(*device).set_lightpen_x_callback((DEVCB_##cb));
-
-#define MCFG_VIC3_LIGHTPEN_Y_CB(cb) \
- downcast<vic3_device &>(*device).set_lightpen_y_callback((DEVCB_##cb));
-
-#define MCFG_VIC3_C64_MEM_R_CB(cb) \
- downcast<vic3_device &>(*device).set_c64_mem_r_callback((DEVCB_##cb));
-
#endif // MAME_VIDEO_VIC4567_H
diff --git a/src/devices/video/voodoo.h b/src/devices/video/voodoo.h
index 5c39e867d85..26475f527de 100644
--- a/src/devices/video/voodoo.h
+++ b/src/devices/video/voodoo.h
@@ -1429,32 +1429,6 @@ enum
#define STD_VOODOO_3_CLOCK 132000000
-
-/***************************************************************************
- DEVICE CONFIGURATION MACROS
-***************************************************************************/
-
-#define MCFG_VOODOO_FBMEM(_value) \
- downcast<voodoo_device &>(*device).set_fbmem(_value);
-
-#define MCFG_VOODOO_TMUMEM(_value1, _value2) \
- downcast<voodoo_device &>(*device).set_tmumem(_value1, _value2);
-
-#define MCFG_VOODOO_SCREEN_TAG(_tag) \
- downcast<voodoo_device &>(*device).set_screen_tag(_tag);
-
-#define MCFG_VOODOO_CPU_TAG(_tag) \
- downcast<voodoo_device &>(*device).set_cpu_tag(_tag);
-
-#define MCFG_VOODOO_VBLANK_CB(_devcb) \
- downcast<voodoo_device &>(*device).set_vblank_callback(DEVCB_##_devcb);
-
-#define MCFG_VOODOO_STALL_CB(_devcb) \
- downcast<voodoo_device &>(*device).set_stall_callback(DEVCB_##_devcb);
-
-#define MCFG_VOODOO_PCIINT_CB(_devcb) \
- downcast<voodoo_device &>(*device).set_pciint_callback(DEVCB_##_devcb);
-
/***************************************************************************
FUNCTION PROTOTYPES
***************************************************************************/
@@ -1470,9 +1444,6 @@ public:
void set_tmumem(int value1, int value2) { m_tmumem0 = value1; m_tmumem1 = value2; }
template <typename T> void set_screen_tag(T &&tag) { m_screen_finder.set_tag(std::forward<T>(tag)); }
template <typename T> void set_cpu_tag(T &&tag) { m_cpu_finder.set_tag(std::forward<T>(tag)); }
- template <class Object> devcb_base &set_vblank_callback(Object &&cb) { return m_vblank.set_callback(std::forward<Object>(cb)); }
- template <class Object> devcb_base &set_stall_callback(Object &&cb) { return m_stall.set_callback(std::forward<Object>(cb)); }
- template <class Object> devcb_base &set_pciint_callback(Object &&cb) { return m_pciint.set_callback(std::forward<Object>(cb)); }
auto vblank_callback() { return m_vblank.bind(); }
auto stall_callback() { return m_stall.bind(); }
auto pciint_callback() { return m_pciint.bind(); }
diff --git a/src/devices/video/voodoo_pci.cpp b/src/devices/video/voodoo_pci.cpp
index 82fc89aaa9a..5a78099e01a 100644
--- a/src/devices/video/voodoo_pci.cpp
+++ b/src/devices/video/voodoo_pci.cpp
@@ -6,27 +6,31 @@
#include "screen.h"
-MACHINE_CONFIG_START(voodoo_1_pci_device::device_add_mconfig)
- MCFG_DEVICE_ADD("voodoo", VOODOO_1, STD_VOODOO_1_CLOCK)
- MCFG_VOODOO_FBMEM(4)
- MCFG_VOODOO_TMUMEM(1, 0)
-MACHINE_CONFIG_END
-
-MACHINE_CONFIG_START(voodoo_2_pci_device::device_add_mconfig)
- MCFG_DEVICE_ADD("voodoo", VOODOO_2, STD_VOODOO_2_CLOCK)
- MCFG_VOODOO_FBMEM(4)
- MCFG_VOODOO_TMUMEM(1, 0)
-MACHINE_CONFIG_END
-
-MACHINE_CONFIG_START(voodoo_banshee_pci_device::device_add_mconfig)
- MCFG_DEVICE_ADD("voodoo", VOODOO_BANSHEE, STD_VOODOO_BANSHEE_CLOCK)
- MCFG_VOODOO_FBMEM(16)
-MACHINE_CONFIG_END
-
-MACHINE_CONFIG_START(voodoo_3_pci_device::device_add_mconfig)
- MCFG_DEVICE_ADD("voodoo", VOODOO_3, STD_VOODOO_3_CLOCK)
- MCFG_VOODOO_FBMEM(16)
-MACHINE_CONFIG_END
+void voodoo_1_pci_device::device_add_mconfig(machine_config &config)
+{
+ VOODOO_1(config, m_voodoo, STD_VOODOO_1_CLOCK);
+ m_voodoo->set_fbmem(4);
+ m_voodoo->set_tmumem(1, 0);
+}
+
+void voodoo_2_pci_device::device_add_mconfig(machine_config &config)
+{
+ VOODOO_2(config, m_voodoo, STD_VOODOO_2_CLOCK);
+ m_voodoo->set_fbmem(4);
+ m_voodoo->set_tmumem(1, 0);
+}
+
+void voodoo_banshee_pci_device::device_add_mconfig(machine_config &config)
+{
+ VOODOO_BANSHEE(config, m_voodoo, STD_VOODOO_BANSHEE_CLOCK);
+ m_voodoo->set_fbmem(16);
+}
+
+void voodoo_3_pci_device::device_add_mconfig(machine_config &config)
+{
+ VOODOO_3(config, m_voodoo, STD_VOODOO_3_CLOCK);
+ m_voodoo->set_fbmem(16);
+}
DEFINE_DEVICE_TYPE(VOODOO_1_PCI, voodoo_1_pci_device, "voodoo_1_pci", "Voodoo 1 PCI")
DEFINE_DEVICE_TYPE(VOODOO_2_PCI, voodoo_2_pci_device, "voodoo_2_pci", "Voodoo 2 PCI")
@@ -42,22 +46,22 @@ void voodoo_pci_device::config_map(address_map &map)
// VOODOO_1 & VOODOO_2 map
void voodoo_pci_device::voodoo_reg_map(address_map &map)
{
- map(0x0, 0x00ffffff).rw("voodoo", FUNC(voodoo_device::voodoo_r), FUNC(voodoo_device::voodoo_w));
+ map(0x0, 0x00ffffff).rw(m_voodoo, FUNC(voodoo_device::voodoo_r), FUNC(voodoo_device::voodoo_w));
}
// VOODOO_BANSHEE and VOODOO_3 maps
void voodoo_pci_device::banshee_reg_map(address_map &map)
{
- map(0x0, 0x01ffffff).rw("voodoo", FUNC(voodoo_banshee_device::banshee_r), FUNC(voodoo_banshee_device::banshee_w));
+ map(0x0, 0x01ffffff).rw(m_voodoo, FUNC(voodoo_banshee_device::banshee_r), FUNC(voodoo_banshee_device::banshee_w));
}
void voodoo_pci_device::lfb_map(address_map &map)
{
- map(0x0, 0x01ffffff).rw("voodoo", FUNC(voodoo_banshee_device::banshee_fb_r), FUNC(voodoo_banshee_device::banshee_fb_w));
+ map(0x0, 0x01ffffff).rw(m_voodoo, FUNC(voodoo_banshee_device::banshee_fb_r), FUNC(voodoo_banshee_device::banshee_fb_w));
}
void voodoo_pci_device::io_map(address_map &map)
{
- map(0x000, 0x0ff).rw("voodoo", FUNC(voodoo_banshee_device::banshee_io_r), FUNC(voodoo_banshee_device::banshee_io_w));
+ map(0x000, 0x0ff).rw(m_voodoo, FUNC(voodoo_banshee_device::banshee_io_r), FUNC(voodoo_banshee_device::banshee_io_w));
}
voodoo_pci_device::voodoo_pci_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock)
diff --git a/src/emu/addrmap.cpp b/src/emu/addrmap.cpp
index 06410945815..0a2e7a15c98 100644
--- a/src/emu/addrmap.cpp
+++ b/src/emu/addrmap.cpp
@@ -759,12 +759,6 @@ address_map::address_map(device_t &device, int spacenum)
memintf->get_addrmap(spacenum)(*this);
m_device = &device;
}
- else
- {
- // if the owner didn't provide a map, use the default device map
- if (!spaceconfig->m_default_map.isnull())
- spaceconfig->m_default_map(*this);
- }
// construct the internal device map (last so it takes priority)
if (!spaceconfig->m_internal_map.isnull())
diff --git a/src/emu/debug/debugcmd.cpp b/src/emu/debug/debugcmd.cpp
index 05fb6acbddd..66bc8578464 100644
--- a/src/emu/debug/debugcmd.cpp
+++ b/src/emu/debug/debugcmd.cpp
@@ -21,6 +21,7 @@
#include "natkeyboard.h"
#include "render.h"
#include <ctype.h>
+#include <algorithm>
#include <fstream>
@@ -460,12 +461,17 @@ bool debugger_commands::validate_cpu_parameter(const char *param, device_t *&res
return false;
}
- /* if we got a valid one, return */
- device_execute_interface *exec = execute_interface_iterator(m_machine.root_device()).byindex(cpunum);
- if (exec != nullptr)
+ // attempt to find by numerical index
+ int index = 0;
+ for (device_execute_interface &exec : execute_interface_iterator(m_machine.root_device()))
{
- result = &exec->device();
- return true;
+ // real CPUs should have pcbase
+ const device_state_interface *state;
+ if (exec.device().interface(state) && state->state_find_entry(STATE_GENPCBASE) != nullptr && index++ == cpunum)
+ {
+ result = &exec.device();
+ return true;
+ }
}
/* if out of range, complain */
@@ -3215,13 +3221,6 @@ void debugger_commands::execute_memdump(int ref, const std::vector<std::string>
execute_symlist - execute the symlist command
-------------------------------------------------*/
-static int CLIB_DECL symbol_sort_compare(const void *item1, const void *item2)
-{
- const char *str1 = *(const char **)item1;
- const char *str2 = *(const char **)item2;
- return strcmp(str1, str2);
-}
-
void debugger_commands::execute_symlist(int ref, const std::vector<std::string> &params)
{
device_t *cpu = nullptr;
@@ -3257,7 +3256,9 @@ void debugger_commands::execute_symlist(int ref, const std::vector<std::string>
/* sort the symbols */
if (count > 1)
- qsort((void *)namelist, count, sizeof(namelist[0]), symbol_sort_compare);
+ std::sort(&namelist[0], &namelist[count], [](const char *item1, const char *item2) {
+ return strcmp(item1, item2) < 0;
+ });
/* iterate over symbols and print out relevant ones */
for (symnum = 0; symnum < count; symnum++)
diff --git a/src/emu/debug/dvbpoints.cpp b/src/emu/debug/dvbpoints.cpp
index 6bc4a008c5f..3b76c7d26fe 100644
--- a/src/emu/debug/dvbpoints.cpp
+++ b/src/emu/debug/dvbpoints.cpp
@@ -12,79 +12,68 @@
#include "debugger.h"
#include "dvbpoints.h"
+#include <algorithm>
#include <iomanip>
// Sorting functors for the qsort function
-static int cIndexAscending(const void* a, const void* b)
+static bool cIndexAscending(const device_debug::breakpoint *a, const device_debug::breakpoint *b)
{
- const device_debug::breakpoint* left = *(device_debug::breakpoint**)a;
- const device_debug::breakpoint* right = *(device_debug::breakpoint**)b;
- return left->index() - right->index();
+ return a->index() < b->index();
}
-static int cIndexDescending(const void* a, const void* b)
+static bool cIndexDescending(const device_debug::breakpoint *a, const device_debug::breakpoint *b)
{
return cIndexAscending(b, a);
}
-static int cEnabledAscending(const void* a, const void* b)
+static bool cEnabledAscending(const device_debug::breakpoint *a, const device_debug::breakpoint *b)
{
- const device_debug::breakpoint* left = *(device_debug::breakpoint**)a;
- const device_debug::breakpoint* right = *(device_debug::breakpoint**)b;
- return (left->enabled() ? 1 : 0) - (right->enabled() ? 1 : 0);
+ return !a->enabled() && b->enabled();
}
-static int cEnabledDescending(const void* a, const void* b)
+static bool cEnabledDescending(const device_debug::breakpoint *a, const device_debug::breakpoint *b)
{
return cEnabledAscending(b, a);
}
-static int cCpuAscending(const void* a, const void* b)
+static bool cCpuAscending(const device_debug::breakpoint *a, const device_debug::breakpoint *b)
{
- const device_debug::breakpoint* left = *(device_debug::breakpoint**)a;
- const device_debug::breakpoint* right = *(device_debug::breakpoint**)b;
- return strcmp(left->debugInterface()->device().tag(), right->debugInterface()->device().tag());
+ return strcmp(a->debugInterface()->device().tag(), b->debugInterface()->device().tag()) < 0;
}
-static int cCpuDescending(const void* a, const void* b)
+static bool cCpuDescending(const device_debug::breakpoint *a, const device_debug::breakpoint *b)
{
return cCpuAscending(b, a);
}
-static int cAddressAscending(const void* a, const void* b)
+static bool cAddressAscending(const device_debug::breakpoint *a, const device_debug::breakpoint *b)
{
- const device_debug::breakpoint* left = *(device_debug::breakpoint**)a;
- const device_debug::breakpoint* right = *(device_debug::breakpoint**)b;
- return (left->address() > right->address()) ? 1 : (left->address() < right->address()) ? -1 : 0;
+ return a->address() < b->address();
}
-static int cAddressDescending(const void* a, const void* b)
+static bool cAddressDescending(const device_debug::breakpoint *a, const device_debug::breakpoint *b)
{
return cAddressAscending(b, a);
}
-static int cConditionAscending(const void* a, const void* b)
+static bool cConditionAscending(const device_debug::breakpoint *a, const device_debug::breakpoint *b)
{
- const device_debug::breakpoint* left = *(device_debug::breakpoint**)a;
- const device_debug::breakpoint* right = *(device_debug::breakpoint**)b;
- return strcmp(left->condition(), right->condition());
+ return strcmp(a->condition(), b->condition()) < 0;
}
-static int cConditionDescending(const void* a, const void* b)
+static bool cConditionDescending(const device_debug::breakpoint *a, const device_debug::breakpoint *b)
{
return cConditionAscending(b, a);
}
-static int cActionAscending(const void* a, const void* b)
+static bool cActionAscending(const device_debug::breakpoint *a, const device_debug::breakpoint *b)
{
- const device_debug::breakpoint* left = *(device_debug::breakpoint**)a;
- const device_debug::breakpoint* right = *(device_debug::breakpoint**)b;
- return strcmp(left->action(), right->action());
+ return strcmp(a->action(), b->action()) < 0;
}
-static int cActionDescending(const void* a, const void* b)
+static bool cActionDescending(const device_debug::breakpoint *a, const device_debug::breakpoint *b)
{
return cActionAscending(b, a);
}
@@ -210,7 +199,7 @@ void debug_view_breakpoints::gather_breakpoints()
// And now for the sort
if (!m_buffer.empty())
- qsort(&m_buffer[0], m_buffer.size(), sizeof(device_debug::breakpoint *), m_sortType);
+ std::stable_sort(m_buffer.begin(), m_buffer.end(), m_sortType);
}
diff --git a/src/emu/debug/dvbpoints.h b/src/emu/debug/dvbpoints.h
index 5d74549fd66..2d3ae38fa58 100644
--- a/src/emu/debug/dvbpoints.h
+++ b/src/emu/debug/dvbpoints.h
@@ -48,7 +48,7 @@ private:
// internal state
- int (*m_sortType)(void const *, void const *);
+ bool (*m_sortType)(const device_debug::breakpoint *, const device_debug::breakpoint *);
std::vector<device_debug::breakpoint *> m_buffer;
};
diff --git a/src/emu/debug/dvwpoints.cpp b/src/emu/debug/dvwpoints.cpp
index 2ab1fc6a0bf..b0584b5d61c 100644
--- a/src/emu/debug/dvwpoints.cpp
+++ b/src/emu/debug/dvwpoints.cpp
@@ -11,102 +11,87 @@
#include "emu.h"
#include "dvwpoints.h"
+#include <algorithm>
#include <iomanip>
-static int cIndexAscending(const void* a, const void* b)
+static bool cIndexAscending(const device_debug::watchpoint *a, const device_debug::watchpoint *b)
{
- const device_debug::watchpoint* left = *(device_debug::watchpoint**)a;
- const device_debug::watchpoint* right = *(device_debug::watchpoint**)b;
- return left->index() - right->index();
+ return a->index() < b->index();
}
-static int cIndexDescending(const void* a, const void* b)
+static bool cIndexDescending(const device_debug::watchpoint *a, const device_debug::watchpoint *b)
{
return cIndexAscending(b, a);
}
-static int cEnabledAscending(const void* a, const void* b)
+static bool cEnabledAscending(const device_debug::watchpoint *a, const device_debug::watchpoint *b)
{
- const device_debug::watchpoint* left = *(device_debug::watchpoint**)a;
- const device_debug::watchpoint* right = *(device_debug::watchpoint**)b;
- return (left->enabled() ? 1 : 0) - (right->enabled() ? 1 : 0);
+ return !a->enabled() && b->enabled();
}
-static int cEnabledDescending(const void* a, const void* b)
+static bool cEnabledDescending(const device_debug::watchpoint *a, const device_debug::watchpoint *b)
{
return cEnabledAscending(b, a);
}
-static int cCpuAscending(const void* a, const void* b)
+static bool cCpuAscending(const device_debug::watchpoint *a, const device_debug::watchpoint *b)
{
- const device_debug::watchpoint* left = *(device_debug::watchpoint**)a;
- const device_debug::watchpoint* right = *(device_debug::watchpoint**)b;
- return strcmp(left->debugInterface()->device().tag(), right->debugInterface()->device().tag());
+ return strcmp(a->debugInterface()->device().tag(), b->debugInterface()->device().tag()) < 0;
}
-static int cCpuDescending(const void* a, const void* b)
+static bool cCpuDescending(const device_debug::watchpoint *a, const device_debug::watchpoint *b)
{
return cCpuAscending(b, a);
}
-static int cSpaceAscending(const void* a, const void* b)
+static bool cSpaceAscending(const device_debug::watchpoint *a, const device_debug::watchpoint *b)
{
- const device_debug::watchpoint* left = *(device_debug::watchpoint**)a;
- const device_debug::watchpoint* right = *(device_debug::watchpoint**)b;
- return strcmp(left->space().name(), right->space().name());
+ return strcmp(a->space().name(), b->space().name()) < 0;
}
-static int cSpaceDescending(const void* a, const void* b)
+static bool cSpaceDescending(const device_debug::watchpoint *a, const device_debug::watchpoint *b)
{
return cSpaceAscending(b, a);
}
-static int cAddressAscending(const void* a, const void* b)
+static bool cAddressAscending(const device_debug::watchpoint *a, const device_debug::watchpoint *b)
{
- const device_debug::watchpoint* left = *(device_debug::watchpoint**)a;
- const device_debug::watchpoint* right = *(device_debug::watchpoint**)b;
- return (left->address() > right->address()) ? 1 : (left->address() < right->address()) ? -1 : 0;
+ return a->address() < b->address();
}
-static int cAddressDescending(const void* a, const void* b)
+static bool cAddressDescending(const device_debug::watchpoint *a, const device_debug::watchpoint *b)
{
return cAddressAscending(b, a);
}
-static int cTypeAscending(const void* a, const void* b)
+static bool cTypeAscending(const device_debug::watchpoint *a, const device_debug::watchpoint *b)
{
- const device_debug::watchpoint* left = *(device_debug::watchpoint**)a;
- const device_debug::watchpoint* right = *(device_debug::watchpoint**)b;
- return int(left->type()) - int(right->type());
+ return int(a->type()) < int(b->type());
}
-static int cTypeDescending(const void* a, const void* b)
+static bool cTypeDescending(const device_debug::watchpoint *a, const device_debug::watchpoint *b)
{
return cTypeAscending(b, a);
}
-static int cConditionAscending(const void* a, const void* b)
+static bool cConditionAscending(const device_debug::watchpoint *a, const device_debug::watchpoint *b)
{
- const device_debug::watchpoint* left = *(device_debug::watchpoint**)a;
- const device_debug::watchpoint* right = *(device_debug::watchpoint**)b;
- return strcmp(left->condition(), right->condition());
+ return strcmp(a->condition(), b->condition()) < 0;
}
-static int cConditionDescending(const void* a, const void* b)
+static bool cConditionDescending(const device_debug::watchpoint *a, const device_debug::watchpoint *b)
{
return cConditionAscending(b, a);
}
-static int cActionAscending(const void* a, const void* b)
+static bool cActionAscending(const device_debug::watchpoint *a, const device_debug::watchpoint *b)
{
- const device_debug::watchpoint* left = *(device_debug::watchpoint**)a;
- const device_debug::watchpoint* right = *(device_debug::watchpoint**)b;
- return left->action().compare(right->action());
+ return a->action() < b->action();
}
-static int cActionDescending(const void* a, const void* b)
+static bool cActionDescending(const device_debug::watchpoint *a, const device_debug::watchpoint *b)
{
return cActionAscending(b, a);
}
@@ -236,7 +221,7 @@ void debug_view_watchpoints::gather_watchpoints()
// And now for the sort
if (!m_buffer.empty())
- qsort(&m_buffer[0], m_buffer.size(), sizeof(device_debug::watchpoint *), m_sortType);
+ std::stable_sort(m_buffer.begin(), m_buffer.end(), m_sortType);
}
diff --git a/src/emu/debug/dvwpoints.h b/src/emu/debug/dvwpoints.h
index b1707b7d5b2..26b7c676e0e 100644
--- a/src/emu/debug/dvwpoints.h
+++ b/src/emu/debug/dvwpoints.h
@@ -43,7 +43,7 @@ private:
// internal state
- int (*m_sortType)(void const *, void const *);
+ bool (*m_sortType)(const device_debug::watchpoint *, const device_debug::watchpoint *);
std::vector<device_debug::watchpoint *> m_buffer;
};
diff --git a/src/emu/devfind.cpp b/src/emu/devfind.cpp
index d3cfaf8c0a1..4128123e0f2 100644
--- a/src/emu/devfind.cpp
+++ b/src/emu/devfind.cpp
@@ -22,6 +22,8 @@ template class object_finder_base<memory_bank, false>;
template class object_finder_base<memory_bank, true>;
template class object_finder_base<ioport_port, false>;
template class object_finder_base<ioport_port, true>;
+template class object_finder_base<address_space, false>;
+template class object_finder_base<address_space, true>;
template class object_finder_base<u8, false>;
template class object_finder_base<u8, true>;
@@ -50,6 +52,9 @@ template class memory_bank_finder<true>;
template class ioport_finder<false>;
template class ioport_finder<true>;
+template class address_space_finder<false>;
+template class address_space_finder<true>;
+
template class region_ptr_finder<u8, false>;
template class region_ptr_finder<u8, true>;
template class region_ptr_finder<u16, false>;
@@ -230,29 +235,105 @@ void *finder_base::find_memshare(u8 width, size_t &bytes, bool required) const
//-------------------------------------------------
+// find_addrspace - find address space
+//-------------------------------------------------
+
+address_space *finder_base::find_addrspace(int spacenum, u8 width, bool required) const
+{
+ // look up the device and return nullptr if not found
+ device_t *const device(m_base.get().subdevice(m_tag));
+ if (device == nullptr)
+ return nullptr;
+
+ // check for memory interface and the specified space number
+ const device_memory_interface *memory;
+ if (!device->interface(memory))
+ {
+ if (required)
+ osd_printf_warning("Device '%s' found but lacks memory interface\n", m_tag);
+ return nullptr;
+ }
+ if (!memory->has_space(spacenum))
+ {
+ if (required)
+ osd_printf_warning("Device '%s' found but lacks address space #%d\n", m_tag, spacenum);
+ return nullptr;
+ }
+
+ // check data width
+ address_space &space(memory->space(spacenum));
+ if (width != 0 && width != space.data_width())
+ {
+ if (required)
+ osd_printf_warning("Device '%s' found but address space #%d has the wrong data width (expected %d, found %d)\n", m_tag, spacenum, width, space.data_width());
+ return nullptr;
+ }
+
+ // return result
+ return &space;
+}
+
+
+//-------------------------------------------------
+// validate_addrspace - find address space
+//-------------------------------------------------
+
+bool finder_base::validate_addrspace(int spacenum, u8 width, bool required) const
+{
+ // look up the device and return false if not found
+ device_t *const device(m_base.get().subdevice(m_tag));
+ if (device == nullptr)
+ return report_missing(false, "address space", required);
+
+ // check for memory interface and a configuration for the designated space
+ const device_memory_interface *memory = nullptr;
+ const address_space_config *config = nullptr;
+ if (device->interface(memory))
+ {
+ config = memory->space_config(spacenum);
+ if (required)
+ {
+ if (config == nullptr)
+ osd_printf_warning("Device '%s' found but lacks address space #%d\n", m_tag, spacenum);
+ else if (width != 0 && width != config->data_width())
+ osd_printf_warning("Device '%s' found but space #%d has the wrong data width (expected %d, found %d)\n", m_tag, spacenum, width, config->data_width());
+ }
+ }
+ else if (required)
+ osd_printf_warning("Device '%s' found but lacks memory interface\n", m_tag);
+
+ // report result
+ return report_missing(config != nullptr && (width == 0 || width == config->data_width()), "address space", required);
+}
+
+
+//-------------------------------------------------
// report_missing - report missing objects and
// return true if it's ok
//-------------------------------------------------
bool finder_base::report_missing(bool found, const char *objname, bool required) const
{
- if (required && (strcmp(m_tag, DUMMY_TAG) == 0))
+ if (required && (DUMMY_TAG == m_tag))
{
osd_printf_error("Tag not defined for required %s\n", objname);
return false;
}
-
- // just pass through in the found case
- if (found)
+ else if (found)
+ {
+ // just pass through in the found case
return true;
-
- // otherwise, report
- std::string const region_fulltag(m_base.get().subtag(m_tag));
- if (required)
- osd_printf_error("Required %s '%s' not found\n", objname, region_fulltag.c_str());
+ }
else
- osd_printf_verbose("Optional %s '%s' not found\n", objname, region_fulltag.c_str());
- return !required;
+ {
+ // otherwise, report
+ std::string const region_fulltag(m_base.get().subtag(m_tag));
+ if (required)
+ osd_printf_error("Required %s '%s' not found\n", objname, region_fulltag.c_str());
+ else if (DUMMY_TAG != m_tag)
+ osd_printf_verbose("Optional %s '%s' not found\n", objname, region_fulltag.c_str());
+ return !required;
+ }
}
@@ -261,7 +342,7 @@ void finder_base::printf_warning(const char *format, ...)
va_list argptr;
char buffer[1024];
- /* do the output */
+ // do the output
va_start(argptr, format);
vsnprintf(buffer, 1024, format, argptr);
osd_printf_warning("%s", buffer);
diff --git a/src/emu/devfind.h b/src/emu/devfind.h
index 1fe2ed78439..2428e1a7325 100644
--- a/src/emu/devfind.h
+++ b/src/emu/devfind.h
@@ -346,7 +346,7 @@ protected:
///
/// Walks ROM regions of all devices starting from the root looking
/// for one with matching tag and length in bytes. Prints a warning
- /// message if the region is required, a region iwth the requested
+ /// message if the region is required, a region with the requested
/// tag is found, but its length does not match. Calls
/// report_missing to print an error message if the region is
/// not found. Returns true if the region is required but no
@@ -377,6 +377,36 @@ protected:
/// share is found, or nullptr otherwise.
void *find_memshare(u8 width, size_t &bytes, bool required) const;
+ /// \brief Find an address space
+ ///
+ /// Look up address space and check that its width matches desired
+ /// value. Returns pointer to address space if a matching space
+ /// is found, or nullptr otherwise. Prints a message at warning
+ /// level if the address space is required, a device with the
+ /// requested tag is found, but it doesn't have a memory interface
+ /// or a space with the designated number.
+ /// \param [in] spacenum Address space number.
+ /// \param [in] width Specific data width, or 0.
+ /// \param [in] required. Whether warning message should be printed
+ /// if a device with no memory interface or space of that number
+ /// is found.
+ /// \return Pointer to address space if a matching address space
+ /// is found, or nullptr otherwise.
+ address_space *find_addrspace(int spacenum, u8 width, bool required) const;
+
+ /// \brief Check that address space exists
+ ///
+ /// Returns true if the space is required but no matching space is
+ /// found, or false otherwise.
+ /// \param [in] spacenum Address space number.
+ /// \param [in] width Specific data width, or 0.
+ /// \param [in] required. Whether warning message should be printed
+ /// if a device with no memory interface or space of that number
+ /// is found.
+ /// \return True if the space is optional, or if the space is
+ /// space and a matching space is found, or false otherwise.
+ bool validate_addrspace(int spacenum, u8 width, bool required) const;
+
/// \brief Log if object was not found
///
/// Logs a message at error level if the target object is required
@@ -820,6 +850,114 @@ template <unsigned Count> using optional_ioport_array = ioport_array_finder<Coun
template <unsigned Count> using required_ioport_array = ioport_array_finder<Count, true>;
+/// \brief Address space finder template
+///
+/// Template argument is whether the address space is required. It is a
+/// validation error if a required address space is not found. This class is
+/// generally not used directly, instead the optional_address_space and
+/// required_address_space helpers are used.
+/// \sa optional_address_space required_address_space
+template <bool Required>
+class address_space_finder : public object_finder_base<address_space, Required>
+{
+public:
+ /// \brief Address space finder constructor
+ /// \param [in] base Base device to search from.
+ /// \param [in] tag Address space tag to search for. This is not copied,
+ /// it is the caller's responsibility to ensure this pointer
+ /// remains valid until resolution time.
+ /// \param [in] spacenum Address space number.
+ /// \param [in] width Specific data width (optional).
+ address_space_finder(device_t &base, char const *tag, int spacenum, u8 width = 0) : object_finder_base<address_space, Required>(base, tag), m_spacenum(spacenum), m_data_width(width) { }
+
+ /// \brief Set search tag and space number
+ ///
+ /// Allows search tag to be changed after construction. Note that
+ /// this must be done before resolution time to take effect. Also
+ /// note that the tag is not copied.
+ /// \param [in] base Updated search base. The tag must be specified
+ /// relative to this device.
+ /// \param [in] tag Updated search tag. This is not copied, it is
+ /// the caller's responsibility to ensure this pointer remains
+ /// valid until resolution time.
+ /// \param [in] spacenum Address space number.
+ void set_tag(device_t &base, char const *tag, int spacenum) { finder_base::set_tag(base, tag); m_spacenum = spacenum; }
+
+ /// \brief Set search tag and space number
+ ///
+ /// Allows search tag to be changed after construction. Note that
+ /// this must be done before resolution time to take effect. Also
+ /// note that the tag is not copied.
+ /// \param [in] tag Updated search tag relative to the current
+ /// device being configured. This is not copied, it is the
+ /// caller's responsibility to ensure this pointer remains valid
+ /// until resolution time.
+ /// \param [in] spacenum Address space number.
+ void set_tag(char const *tag, int spacenum) { finder_base::set_tag(tag); m_spacenum = spacenum; }
+
+ /// \brief Set search tag and space number
+ ///
+ /// Allows search tag to be changed after construction. Note that
+ /// this must be done before resolution time to take effect.
+ /// \param [in] finder Object finder to take the search base and tag
+ /// from.
+ /// \param [in] spacenum Address space number.
+ void set_tag(finder_base const &finder, int spacenum) { finder_base::set_tag(finder); this->m_spacenum = spacenum; }
+
+ /// \brief Set data width of space
+ ///
+ /// Allows data width to be specified after construction. Note that
+ /// this must be done before resolution time to take effect.
+ /// \param [in] width Data width in bits (0 = don't care).
+ void set_data_width(u8 width) { this->m_data_width = width; }
+
+ /// \brief Get space number
+ ///
+ /// Returns the configured address space number.
+ /// \return The space number to be found.
+ int spacenum() const { return m_spacenum; }
+
+private:
+ /// \brief Find address space
+ ///
+ /// Find address space with requested tag. For a dry run, the
+ /// target object pointer will not be set. This method is called by
+ /// the base device at resolution time.
+ /// \param [in] isvalidation True if this is a dry run (not
+ /// intending to run the machine, just checking for errors).
+ /// \return True if the address space is optional, a matching address space is
+ /// is found or this is a dry run, false otherwise.
+ virtual bool findit(bool isvalidation) override
+ {
+ if (isvalidation)
+ return this->validate_addrspace(this->m_spacenum, this->m_data_width, Required);
+
+ assert(!this->m_resolved);
+ this->m_resolved = true;
+ this->m_target = this->find_addrspace(this->m_spacenum, this->m_data_width, Required);
+ return this->report_missing("address space");
+ }
+
+ int m_spacenum;
+ u8 m_data_width;
+};
+
+/// \brief Optional address space finder
+///
+/// Finds address space with maching tag and number. No error is generated if a
+/// matching address space is not found (the target object pointer will be
+/// null).
+/// \sa required_address_space address_space_finder
+using optional_address_space = address_space_finder<false>;
+
+/// \brief Required address space finder
+///
+/// Finds address space with maching tag and number. A validation error is generated if
+/// a matching address space is not found.
+/// \sa optional_address_space address_space_finder
+using required_address_space = address_space_finder<true>;
+
+
/// \brief Memory region base pointer finder
///
/// Template arguments are the element type of the memory region and
diff --git a/src/emu/device.h b/src/emu/device.h
index abaea74cb12..efd7a590e09 100644
--- a/src/emu/device.h
+++ b/src/emu/device.h
@@ -90,23 +90,43 @@ struct device_feature
{
enum type : u32
{
+ // Functionality-related
PROTECTION = u32(1) << 0,
- PALETTE = u32(1) << 1,
+ TIMING = u32(1) << 1,
+
+ // Graphics
GRAPHICS = u32(1) << 2,
- SOUND = u32(1) << 3,
- CONTROLS = u32(1) << 4,
- KEYBOARD = u32(1) << 5,
- MOUSE = u32(1) << 6,
+ PALETTE = u32(1) << 3,
+
+ // Sound
+ SOUND = u32(1) << 4,
+
+ // Capture/Media Output
+ CAPTURE = u32(1) << 5,
+ CAMERA = u32(1) << 6,
MICROPHONE = u32(1) << 7,
- CAMERA = u32(1) << 8,
- DISK = u32(1) << 9,
- PRINTER = u32(1) << 10,
- LAN = u32(1) << 11,
- WAN = u32(1) << 12,
- TIMING = u32(1) << 13,
+
+ // Controls/HID
+ CONTROLS = u32(1) << 8,
+ KEYBOARD = u32(1) << 9,
+ MOUSE = u32(1) << 10,
+
+ // Media Output
+ MEDIA = u32(1) << 11,
+ DISK = u32(1) << 12,
+ PRINTER = u32(1) << 13,
+ TAPE = u32(1) << 14,
+ PUNCH = u32(1) << 15,
+ DRUM = u32(1) << 16,
+ ROM = u32(1) << 17,
+
+ // Comms/Network
+ COMMS = u32(1) << 18,
+ LAN = u32(1) << 19,
+ WAN = u32(1) << 20,
NONE = u32(0),
- ALL = (u32(1) << 14) - 1U
+ ALL = (u32(1) << 21) - 1U
};
};
diff --git a/src/emu/didisasm.h b/src/emu/didisasm.h
index 751ba86b2b6..c63fe0cc421 100644
--- a/src/emu/didisasm.h
+++ b/src/emu/didisasm.h
@@ -18,9 +18,6 @@
#include <utility>
-#define MCFG_DEVICE_DISASSEMBLE_OVERRIDE(_class, _func) \
- dynamic_cast<device_disasm_interface *>(device)->set_dasm_override(dasm_override_delegate(&_class::_func, #_class "::" #_func, nullptr, (_class *)nullptr));
-
//**************************************************************************
// TYPE DEFINITIONS
//**************************************************************************
diff --git a/src/emu/digfx.h b/src/emu/digfx.h
index 1b9bfccb798..3829cd2882e 100644
--- a/src/emu/digfx.h
+++ b/src/emu/digfx.h
@@ -122,28 +122,6 @@ const gfx_layout name = { width, height, RGN_FRAC(1,1), 8, { GFX_RAW }, { 0 }, {
//**************************************************************************
-// INTERFACE CONFIGURATION MACROS
-//**************************************************************************
-
-#define MCFG_GFX_PALETTE(_palette_tag) \
- dynamic_cast<device_gfx_interface &>(*device).set_palette(_palette_tag);
-
-#define MCFG_GFX_INFO(_info) \
- dynamic_cast<device_gfx_interface &>(*device).set_info(_info);
-
-
-
-//**************************************************************************
-// DEVICE CONFIGURATION MACROS
-//**************************************************************************
-
-#define MCFG_GFXDECODE_MODIFY(_tag, _info) \
- MCFG_DEVICE_MODIFY(_tag) \
- MCFG_GFX_INFO(_info)
-
-
-
-//**************************************************************************
// TYPE DEFINITIONS
//**************************************************************************
diff --git a/src/emu/diimage.cpp b/src/emu/diimage.cpp
index ed0f6ae35f4..d6d0a5e5247 100644
--- a/src/emu/diimage.cpp
+++ b/src/emu/diimage.cpp
@@ -670,6 +670,10 @@ void device_image_interface::battery_load(void *buffer, int length, void *def_bu
void device_image_interface::battery_save(const void *buffer, int length)
{
assert_always(buffer && (length > 0), "Must specify sensical buffer/length");
+
+ if (!device().machine().options().nvram_save())
+ return;
+
std::string fname = std::string(device().machine().system().name).append(PATH_SEPARATOR).append(m_basename_noext.c_str()).append(".nv");
// try to open the battery file and write it out, if possible
diff --git a/src/emu/dinetwork.cpp b/src/emu/dinetwork.cpp
index db0544f3673..094d3476af1 100644
--- a/src/emu/dinetwork.cpp
+++ b/src/emu/dinetwork.cpp
@@ -24,13 +24,16 @@ void device_network_interface::interface_pre_start()
int device_network_interface::send(u8 *buf, int len) const
{
- if(!m_dev) return 0;
-
// TODO: enable this check when other devices implement delayed transmit
//assert_always(!m_send_timer->enabled(), "attempted to transmit while transmit already in progress");
- // send the data
- int result = m_dev->send(buf, len);
+ int result = 0;
+
+ if (m_dev)
+ {
+ // send the data
+ result = m_dev->send(buf, len);
+ }
// schedule transmit complete callback
m_send_timer->adjust(attotime::from_ticks(len, m_bandwidth * 1'000'000 / 8), result);
diff --git a/src/emu/diserial.cpp b/src/emu/diserial.cpp
index dc508324852..66778e5458c 100644
--- a/src/emu/diserial.cpp
+++ b/src/emu/diserial.cpp
@@ -442,16 +442,6 @@ u8 device_serial_interface::transmit_register_get_data_bit()
return bit;
}
-bool device_serial_interface::is_receive_register_full()
-{
- return m_rcv_flags & RECEIVE_REGISTER_FULL;
-}
-
-bool device_serial_interface::is_transmit_register_empty()
-{
- return m_tra_flags & TRANSMIT_REGISTER_EMPTY;
-}
-
const char *device_serial_interface::parity_tostring(parity_t parity)
{
switch (parity)
diff --git a/src/emu/diserial.h b/src/emu/diserial.h
index e1e2a447dff..7d7717c5158 100644
--- a/src/emu/diserial.h
+++ b/src/emu/diserial.h
@@ -105,8 +105,8 @@ protected:
u8 serial_helper_get_parity(u8 data) { return m_serial_parity_table[data]; }
- bool is_receive_register_full();
- bool is_transmit_register_empty();
+ bool is_receive_register_full() const { return m_rcv_flags & RECEIVE_REGISTER_FULL; }
+ bool is_transmit_register_empty() const { return m_tra_flags & TRANSMIT_REGISTER_EMPTY; }
bool is_receive_register_synchronized() const { return m_rcv_flags & RECEIVE_REGISTER_SYNCHRONISED; }
bool is_receive_register_shifting() const { return m_rcv_bit_count_received > 0; }
bool is_receive_framing_error() const { return m_rcv_framing_error; }
diff --git a/src/emu/dislot.h b/src/emu/dislot.h
index 154e7452b10..3154a056f35 100644
--- a/src/emu/dislot.h
+++ b/src/emu/dislot.h
@@ -133,6 +133,7 @@ public:
device_t *get_card_device() const { return m_card_device; }
void set_card_device(device_t *dev) { m_card_device = dev; }
const char *slot_name() const { return device().tag() + 1; }
+ slot_option &option_set(const char *tag, const device_type &devtype) { m_default_option = tag; m_fixed = true; return option_add_internal(tag, devtype); }
protected:
void set_default_clock(u32 clock) { m_default_clock = clock; }
diff --git a/src/emu/distate.h b/src/emu/distate.h
index dc3476d5ba7..f97ec8e3c2e 100644
--- a/src/emu/distate.h
+++ b/src/emu/distate.h
@@ -250,6 +250,9 @@ public:
void set_state_string(int index, const char *string);
void set_pc(offs_t pc) { set_state_int(STATE_GENPC, pc); }
+ // find the entry for a given index
+ const device_state_entry *state_find_entry(int index) const;
+
// deliberately ambiguous functions; if you have the state interface
// just use it directly
device_state_interface &state() { return *this; }
@@ -293,9 +296,6 @@ protected:
// internal operation overrides
virtual void interface_post_start() override;
- // find the entry for a given index
- const device_state_entry *state_find_entry(int index) const;
-
// constants
static constexpr int FAST_STATE_MIN = -4; // range for fast state
static constexpr int FAST_STATE_MAX = 256; // lookups
diff --git a/src/emu/divideo.h b/src/emu/divideo.h
index 1b6f48104bd..626d5bc66b4 100644
--- a/src/emu/divideo.h
+++ b/src/emu/divideo.h
@@ -19,15 +19,6 @@
//**************************************************************************
-// INTERFACE CONFIGURATION MACROS
-//**************************************************************************
-
-#define MCFG_VIDEO_SET_SCREEN(_tag) \
- dynamic_cast<device_video_interface &>(*device).set_screen(_tag);
-
-
-
-//**************************************************************************
// TYPE DEFINITIONS
//**************************************************************************
diff --git a/src/emu/drivenum.cpp b/src/emu/drivenum.cpp
index b3e9ce93d62..989a9cc8f46 100644
--- a/src/emu/drivenum.cpp
+++ b/src/emu/drivenum.cpp
@@ -12,6 +12,8 @@
#include "drivenum.h"
#include "softlist_dev.h"
+#include <algorithm>
+
#include <ctype.h>
@@ -64,47 +66,6 @@ bool driver_list::matches(const char *wildstring, const char *string)
}
-//-------------------------------------------------
-// penalty_compare - compare two strings for
-// closeness and assign a score.
-//-------------------------------------------------
-
-int driver_list::penalty_compare(const char *source, const char *target)
-{
- int gaps = 1;
- bool last = true;
-
- // scan the strings
- for ( ; *source && *target; target++)
- {
- // do a case insensitive match
- bool const match(tolower(u8(*source)) == tolower(u8(*target)));
-
- // if we matched, advance the source
- if (match)
- source++;
-
- // if the match state changed, count gaps
- if (match != last)
- {
- last = match;
- if (!match)
- gaps++;
- }
- }
-
- // penalty if short string does not completely fit in
- for ( ; *source; source++)
- gaps++;
-
- // if we matched perfectly, gaps == 0
- if (gaps == 1 && *source == 0 && *target == 0)
- gaps = 0;
-
- return gaps;
-}
-
-
//**************************************************************************
// DRIVER ENUMERATOR
@@ -260,12 +221,12 @@ bool driver_enumerator::next_excluded()
// an array of game_driver pointers
//-------------------------------------------------
-void driver_enumerator::find_approximate_matches(const char *string, std::size_t count, int *results)
+void driver_enumerator::find_approximate_matches(std::string const &string, std::size_t count, int *results)
{
#undef rand
// if no name, pick random entries
- if (!string || !string[0])
+ if (string.empty())
{
// seed the RNG first
srand(osd_ticks());
@@ -295,14 +256,11 @@ void driver_enumerator::find_approximate_matches(const char *string, std::size_t
else
{
// allocate memory to track the penalty value
- std::vector<int> penalty(count);
-
- // initialize everyone's states
- for (int matchnum = 0; matchnum < count; matchnum++)
- {
- penalty[matchnum] = 9999;
- results[matchnum] = -1;
- }
+ std::vector<std::pair<double, int> > penalty;
+ penalty.reserve(count);
+ std::u32string const search(ustr_from_utf8(normalize_unicode(string, unicode_normalization_form::D, true)));
+ std::string composed;
+ std::u32string candidate;
// scan the entire drivers array
for (int index = 0; index < s_driver_count; index++)
@@ -310,29 +268,58 @@ void driver_enumerator::find_approximate_matches(const char *string, std::size_t
// skip things that can't run
if (m_included[index])
{
- // pick the best match between driver name and description
- int curpenalty = penalty_compare(string, s_drivers_sorted[index]->type.fullname());
- int tmp = penalty_compare(string, s_drivers_sorted[index]->name);
- curpenalty = (std::min)(curpenalty, tmp);
+ // cheat on the shortname as it's always lowercase ASCII
+ game_driver const &drv(*s_drivers_sorted[index]);
+ std::size_t const namelen(std::strlen(drv.name));
+ candidate.resize(namelen);
+ std::copy_n(drv.name, namelen, candidate.begin());
+ double curpenalty(util::edit_distance(search, candidate));
+
+ // if it's not a perfect match, try the description
+ if (curpenalty)
+ {
+ candidate = ustr_from_utf8(normalize_unicode(drv.type.fullname(), unicode_normalization_form::D, true));
+ double p(util::edit_distance(search, candidate));
+ if (p < curpenalty)
+ curpenalty = p;
+ }
+
+ // also check "<manufacturer> <description>"
+ if (curpenalty)
+ {
+ composed.assign(drv.manufacturer);
+ composed.append(1, ' ');
+ composed.append(drv.type.fullname());
+ candidate = ustr_from_utf8(normalize_unicode(composed, unicode_normalization_form::D, true));
+ double p(util::edit_distance(search, candidate));
+ if (p < curpenalty)
+ curpenalty = p;
+ }
// insert into the sorted table of matches
- for (int matchnum = count - 1; matchnum >= 0; matchnum--)
+ auto const it(std::upper_bound(penalty.begin(), penalty.end(), std::make_pair(curpenalty, index)));
+ if (penalty.end() != it)
{
- // stop if we're worse than the current entry
- if (curpenalty >= penalty[matchnum])
- break;
-
- // as long as this isn't the last entry, bump this one down
- if (matchnum < count - 1)
- {
- penalty[matchnum + 1] = penalty[matchnum];
- results[matchnum + 1] = results[matchnum];
- }
- results[matchnum] = index;
- penalty[matchnum] = curpenalty;
+ if (penalty.size() >= count)
+ penalty.resize(count - 1);
+ penalty.emplace(it, curpenalty, index);
+ }
+ else if (penalty.size() < count)
+ {
+ penalty.emplace(it, curpenalty, index);
}
}
}
+
+ // copy to output and pad with -1
+ std::fill(
+ std::transform(
+ penalty.begin(),
+ penalty.end(),
+ results,
+ [] (std::pair<double, int> const &x) { return x.second; }),
+ results + count,
+ -1);
}
}
diff --git a/src/emu/drivenum.h b/src/emu/drivenum.h
index 8db4fa9766c..8c0f12b832f 100644
--- a/src/emu/drivenum.h
+++ b/src/emu/drivenum.h
@@ -61,7 +61,6 @@ public:
// static helpers
static bool matches(const char *wildstring, const char *string);
- static int penalty_compare(const char *source, const char *target);
protected:
static std::size_t const s_driver_count;
@@ -120,7 +119,7 @@ public:
// general helpers
void set_current(std::size_t index) { assert(index < s_driver_count); m_current = index; }
- void find_approximate_matches(const char *string, std::size_t count, int *results);
+ void find_approximate_matches(std::string const &string, std::size_t count, int *results);
private:
static constexpr std::size_t CONFIG_CACHE_COUNT = 100;
diff --git a/src/emu/drivers/empty.cpp b/src/emu/drivers/empty.cpp
index 3a139a9f12d..4dea1cceb9d 100644
--- a/src/emu/drivers/empty.cpp
+++ b/src/emu/drivers/empty.cpp
@@ -43,15 +43,15 @@ protected:
// MACHINE DRIVERS
//**************************************************************************
-MACHINE_CONFIG_START( empty_state::___empty )
-
+void empty_state::___empty(machine_config &config)
+{
// video hardware
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_UPDATE_DRIVER(empty_state, screen_update)
- MCFG_SCREEN_SIZE(640,480)
- MCFG_SCREEN_VISIBLE_AREA(0,639, 0,479)
- MCFG_SCREEN_REFRESH_RATE(30)
-MACHINE_CONFIG_END
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_screen_update(FUNC(empty_state::screen_update));
+ screen.set_size(640, 480);
+ screen.set_visarea(0, 639, 0, 479);
+ screen.set_refresh_hz(30);
+}
diff --git a/src/emu/emucore.h b/src/emu/emucore.h
index e64c2a0f765..07a48404ab3 100644
--- a/src/emu/emucore.h
+++ b/src/emu/emucore.h
@@ -224,11 +224,11 @@ inline TYPE &operator|=(TYPE &a, TYPE b) { return a = a | b; }
#undef assert_always
#if defined(MAME_DEBUG_FAST)
-#define assert_always(x, msg) do { if (!(x)) throw emu_fatalerror("Fatal error: %s\nCaused by assert: %s:%d: %s", msg, __FILE__, __LINE__, #x); } while (0)
+#define assert_always(x, msg) do { if (!(x)) throw emu_fatalerror("%s\nCaused by assert: %s:%d: %s", msg, __FILE__, __LINE__, #x); } while (0)
#elif defined(MAME_DEBUG)
-#define assert_always(x, msg) do { if (!(x)) throw emu_fatalerror("Fatal error: %s\nCaused by assert: %s:%d: %s", msg, __FILE__, __LINE__, #x); } while (0)
+#define assert_always(x, msg) do { if (!(x)) throw emu_fatalerror("%s\nCaused by assert: %s:%d: %s", msg, __FILE__, __LINE__, #x); } while (0)
#else
-#define assert_always(x, msg) do { if (!(x)) throw emu_fatalerror("Fatal error: %s (%s:%d)", msg, __FILE__, __LINE__); } while (0)
+#define assert_always(x, msg) do { if (!(x)) throw emu_fatalerror("%s (%s:%d)", msg, __FILE__, __LINE__); } while (0)
#endif
diff --git a/src/emu/emumem.cpp b/src/emu/emumem.cpp
index 80aaaf32c42..092e44d9555 100644
--- a/src/emu/emumem.cpp
+++ b/src/emu/emumem.cpp
@@ -742,6 +742,13 @@ void memory_manager::allocate(device_memory_interface &memory)
// allocate one of the appropriate type
switch (spaceconfig->data_width() | (spaceconfig->addr_shift() + 4))
{
+ case 8|(4+1):
+ if (spaceconfig->endianness() == ENDIANNESS_LITTLE)
+ memory.allocate<address_space_specific<0, 1, ENDIANNESS_LITTLE>>(*this, spacenum);
+ else
+ memory.allocate<address_space_specific<0, 1, ENDIANNESS_BIG >>(*this, spacenum);
+ break;
+
case 8|(4-0):
if (spaceconfig->endianness() == ENDIANNESS_LITTLE)
memory.allocate<address_space_specific<0, 0, ENDIANNESS_LITTLE>>(*this, spacenum);
@@ -962,8 +969,7 @@ address_space_config::address_space_config()
m_logaddr_width(0),
m_page_shift(0),
m_is_octal(false),
- m_internal_map(address_map_constructor()),
- m_default_map(address_map_constructor())
+ m_internal_map(address_map_constructor())
{
}
@@ -974,9 +980,8 @@ address_space_config::address_space_config()
@param addrwidth address bits
@param addrshift
@param internal
- @param defmap
*/
-address_space_config::address_space_config(const char *name, endianness_t endian, u8 datawidth, u8 addrwidth, s8 addrshift, address_map_constructor internal, address_map_constructor defmap)
+address_space_config::address_space_config(const char *name, endianness_t endian, u8 datawidth, u8 addrwidth, s8 addrshift, address_map_constructor internal)
: m_name(name),
m_endianness(endian),
m_data_width(datawidth),
@@ -985,12 +990,11 @@ address_space_config::address_space_config(const char *name, endianness_t endian
m_logaddr_width(addrwidth),
m_page_shift(0),
m_is_octal(false),
- m_internal_map(internal),
- m_default_map(defmap)
+ m_internal_map(internal)
{
}
-address_space_config::address_space_config(const char *name, endianness_t endian, u8 datawidth, u8 addrwidth, s8 addrshift, u8 logwidth, u8 pageshift, address_map_constructor internal, address_map_constructor defmap)
+address_space_config::address_space_config(const char *name, endianness_t endian, u8 datawidth, u8 addrwidth, s8 addrshift, u8 logwidth, u8 pageshift, address_map_constructor internal)
: m_name(name),
m_endianness(endian),
m_data_width(datawidth),
@@ -999,8 +1003,7 @@ address_space_config::address_space_config(const char *name, endianness_t endian
m_logaddr_width(logwidth),
m_page_shift(pageshift),
m_is_octal(false),
- m_internal_map(internal),
- m_default_map(defmap)
+ m_internal_map(internal)
{
}
@@ -2647,6 +2650,8 @@ template<int Width, int AddrShift, int Endian> memory_access_cache<Width, AddrSh
}
+template class memory_access_cache<0, 1, ENDIANNESS_LITTLE>;
+template class memory_access_cache<0, 1, ENDIANNESS_BIG>;
template class memory_access_cache<0, 0, ENDIANNESS_LITTLE>;
template class memory_access_cache<0, 0, ENDIANNESS_BIG>;
template class memory_access_cache<1, 3, ENDIANNESS_LITTLE>;
diff --git a/src/emu/emumem.h b/src/emu/emumem.h
index 4521b8335a6..0bd3de898ca 100644
--- a/src/emu/emumem.h
+++ b/src/emu/emumem.h
@@ -1137,8 +1137,8 @@ class address_space_config
public:
// construction/destruction
address_space_config();
- address_space_config(const char *name, endianness_t endian, u8 datawidth, u8 addrwidth, s8 addrshift = 0, address_map_constructor internal = address_map_constructor(), address_map_constructor defmap = address_map_constructor());
- address_space_config(const char *name, endianness_t endian, u8 datawidth, u8 addrwidth, s8 addrshift, u8 logwidth, u8 pageshift, address_map_constructor internal = address_map_constructor(), address_map_constructor defmap = address_map_constructor());
+ address_space_config(const char *name, endianness_t endian, u8 datawidth, u8 addrwidth, s8 addrshift = 0, address_map_constructor internal = address_map_constructor());
+ address_space_config(const char *name, endianness_t endian, u8 datawidth, u8 addrwidth, s8 addrshift, u8 logwidth, u8 pageshift, address_map_constructor internal = address_map_constructor());
// getters
const char *name() const { return m_name; }
@@ -1172,7 +1172,6 @@ public:
bool m_is_octal; // to determine if messages/debugger will show octal or hex
address_map_constructor m_internal_map;
- address_map_constructor m_default_map;
};
diff --git a/src/emu/emumem_hedp.cpp b/src/emu/emumem_hedp.cpp
index 84a592fbfbd..ccaa4ed650e 100644
--- a/src/emu/emumem_hedp.cpp
+++ b/src/emu/emumem_hedp.cpp
@@ -170,6 +170,8 @@ template<int Width, int AddrShift, int Endian> std::string handler_entry_write_i
+template class handler_entry_read_delegate<0, 1, ENDIANNESS_LITTLE, read8_delegate>;
+template class handler_entry_read_delegate<0, 1, ENDIANNESS_BIG, read8_delegate>;
template class handler_entry_read_delegate<0, 0, ENDIANNESS_LITTLE, read8_delegate>;
template class handler_entry_read_delegate<0, 0, ENDIANNESS_BIG, read8_delegate>;
template class handler_entry_read_delegate<1, 3, ENDIANNESS_LITTLE, read16_delegate>;
@@ -193,6 +195,8 @@ template class handler_entry_read_delegate<3, -2, ENDIANNESS_BIG, read64_dele
template class handler_entry_read_delegate<3, -3, ENDIANNESS_LITTLE, read64_delegate>;
template class handler_entry_read_delegate<3, -3, ENDIANNESS_BIG, read64_delegate>;
+template class handler_entry_read_delegate<0, 1, ENDIANNESS_LITTLE, read8m_delegate>;
+template class handler_entry_read_delegate<0, 1, ENDIANNESS_BIG, read8m_delegate>;
template class handler_entry_read_delegate<0, 0, ENDIANNESS_LITTLE, read8m_delegate>;
template class handler_entry_read_delegate<0, 0, ENDIANNESS_BIG, read8m_delegate>;
template class handler_entry_read_delegate<1, 3, ENDIANNESS_LITTLE, read16m_delegate>;
@@ -216,6 +220,8 @@ template class handler_entry_read_delegate<3, -2, ENDIANNESS_BIG, read64m_del
template class handler_entry_read_delegate<3, -3, ENDIANNESS_LITTLE, read64m_delegate>;
template class handler_entry_read_delegate<3, -3, ENDIANNESS_BIG, read64m_delegate>;
+template class handler_entry_read_delegate<0, 1, ENDIANNESS_LITTLE, read8s_delegate>;
+template class handler_entry_read_delegate<0, 1, ENDIANNESS_BIG, read8s_delegate>;
template class handler_entry_read_delegate<0, 0, ENDIANNESS_LITTLE, read8s_delegate>;
template class handler_entry_read_delegate<0, 0, ENDIANNESS_BIG, read8s_delegate>;
template class handler_entry_read_delegate<1, 3, ENDIANNESS_LITTLE, read16s_delegate>;
@@ -239,6 +245,8 @@ template class handler_entry_read_delegate<3, -2, ENDIANNESS_BIG, read64s_del
template class handler_entry_read_delegate<3, -3, ENDIANNESS_LITTLE, read64s_delegate>;
template class handler_entry_read_delegate<3, -3, ENDIANNESS_BIG, read64s_delegate>;
+template class handler_entry_read_delegate<0, 1, ENDIANNESS_LITTLE, read8sm_delegate>;
+template class handler_entry_read_delegate<0, 1, ENDIANNESS_BIG, read8sm_delegate>;
template class handler_entry_read_delegate<0, 0, ENDIANNESS_LITTLE, read8sm_delegate>;
template class handler_entry_read_delegate<0, 0, ENDIANNESS_BIG, read8sm_delegate>;
template class handler_entry_read_delegate<1, 3, ENDIANNESS_LITTLE, read16sm_delegate>;
@@ -262,6 +270,8 @@ template class handler_entry_read_delegate<3, -2, ENDIANNESS_BIG, read64sm_de
template class handler_entry_read_delegate<3, -3, ENDIANNESS_LITTLE, read64sm_delegate>;
template class handler_entry_read_delegate<3, -3, ENDIANNESS_BIG, read64sm_delegate>;
+template class handler_entry_read_delegate<0, 1, ENDIANNESS_LITTLE, read8mo_delegate>;
+template class handler_entry_read_delegate<0, 1, ENDIANNESS_BIG, read8mo_delegate>;
template class handler_entry_read_delegate<0, 0, ENDIANNESS_LITTLE, read8mo_delegate>;
template class handler_entry_read_delegate<0, 0, ENDIANNESS_BIG, read8mo_delegate>;
template class handler_entry_read_delegate<1, 3, ENDIANNESS_LITTLE, read16mo_delegate>;
@@ -285,6 +295,8 @@ template class handler_entry_read_delegate<3, -2, ENDIANNESS_BIG, read64mo_de
template class handler_entry_read_delegate<3, -3, ENDIANNESS_LITTLE, read64mo_delegate>;
template class handler_entry_read_delegate<3, -3, ENDIANNESS_BIG, read64mo_delegate>;
+template class handler_entry_read_delegate<0, 1, ENDIANNESS_LITTLE, read8smo_delegate>;
+template class handler_entry_read_delegate<0, 1, ENDIANNESS_BIG, read8smo_delegate>;
template class handler_entry_read_delegate<0, 0, ENDIANNESS_LITTLE, read8smo_delegate>;
template class handler_entry_read_delegate<0, 0, ENDIANNESS_BIG, read8smo_delegate>;
template class handler_entry_read_delegate<1, 3, ENDIANNESS_LITTLE, read16smo_delegate>;
@@ -308,6 +320,8 @@ template class handler_entry_read_delegate<3, -2, ENDIANNESS_BIG, read64smo_d
template class handler_entry_read_delegate<3, -3, ENDIANNESS_LITTLE, read64smo_delegate>;
template class handler_entry_read_delegate<3, -3, ENDIANNESS_BIG, read64smo_delegate>;
+template class handler_entry_write_delegate<0, 1, ENDIANNESS_LITTLE, write8_delegate>;
+template class handler_entry_write_delegate<0, 1, ENDIANNESS_BIG, write8_delegate>;
template class handler_entry_write_delegate<0, 0, ENDIANNESS_LITTLE, write8_delegate>;
template class handler_entry_write_delegate<0, 0, ENDIANNESS_BIG, write8_delegate>;
template class handler_entry_write_delegate<1, 3, ENDIANNESS_LITTLE, write16_delegate>;
@@ -331,6 +345,8 @@ template class handler_entry_write_delegate<3, -2, ENDIANNESS_BIG, write64_de
template class handler_entry_write_delegate<3, -3, ENDIANNESS_LITTLE, write64_delegate>;
template class handler_entry_write_delegate<3, -3, ENDIANNESS_BIG, write64_delegate>;
+template class handler_entry_write_delegate<0, 1, ENDIANNESS_LITTLE, write8m_delegate>;
+template class handler_entry_write_delegate<0, 1, ENDIANNESS_BIG, write8m_delegate>;
template class handler_entry_write_delegate<0, 0, ENDIANNESS_LITTLE, write8m_delegate>;
template class handler_entry_write_delegate<0, 0, ENDIANNESS_BIG, write8m_delegate>;
template class handler_entry_write_delegate<1, 3, ENDIANNESS_LITTLE, write16m_delegate>;
@@ -354,6 +370,8 @@ template class handler_entry_write_delegate<3, -2, ENDIANNESS_BIG, write64m_d
template class handler_entry_write_delegate<3, -3, ENDIANNESS_LITTLE, write64m_delegate>;
template class handler_entry_write_delegate<3, -3, ENDIANNESS_BIG, write64m_delegate>;
+template class handler_entry_write_delegate<0, 1, ENDIANNESS_LITTLE, write8s_delegate>;
+template class handler_entry_write_delegate<0, 1, ENDIANNESS_BIG, write8s_delegate>;
template class handler_entry_write_delegate<0, 0, ENDIANNESS_LITTLE, write8s_delegate>;
template class handler_entry_write_delegate<0, 0, ENDIANNESS_BIG, write8s_delegate>;
template class handler_entry_write_delegate<1, 3, ENDIANNESS_LITTLE, write16s_delegate>;
@@ -377,6 +395,8 @@ template class handler_entry_write_delegate<3, -2, ENDIANNESS_BIG, write64s_d
template class handler_entry_write_delegate<3, -3, ENDIANNESS_LITTLE, write64s_delegate>;
template class handler_entry_write_delegate<3, -3, ENDIANNESS_BIG, write64s_delegate>;
+template class handler_entry_write_delegate<0, 1, ENDIANNESS_LITTLE, write8sm_delegate>;
+template class handler_entry_write_delegate<0, 1, ENDIANNESS_BIG, write8sm_delegate>;
template class handler_entry_write_delegate<0, 0, ENDIANNESS_LITTLE, write8sm_delegate>;
template class handler_entry_write_delegate<0, 0, ENDIANNESS_BIG, write8sm_delegate>;
template class handler_entry_write_delegate<1, 3, ENDIANNESS_LITTLE, write16sm_delegate>;
@@ -400,6 +420,8 @@ template class handler_entry_write_delegate<3, -2, ENDIANNESS_BIG, write64sm_
template class handler_entry_write_delegate<3, -3, ENDIANNESS_LITTLE, write64sm_delegate>;
template class handler_entry_write_delegate<3, -3, ENDIANNESS_BIG, write64sm_delegate>;
+template class handler_entry_write_delegate<0, 1, ENDIANNESS_LITTLE, write8mo_delegate>;
+template class handler_entry_write_delegate<0, 1, ENDIANNESS_BIG, write8mo_delegate>;
template class handler_entry_write_delegate<0, 0, ENDIANNESS_LITTLE, write8mo_delegate>;
template class handler_entry_write_delegate<0, 0, ENDIANNESS_BIG, write8mo_delegate>;
template class handler_entry_write_delegate<1, 3, ENDIANNESS_LITTLE, write16mo_delegate>;
@@ -423,6 +445,8 @@ template class handler_entry_write_delegate<3, -2, ENDIANNESS_BIG, write64mo_
template class handler_entry_write_delegate<3, -3, ENDIANNESS_LITTLE, write64mo_delegate>;
template class handler_entry_write_delegate<3, -3, ENDIANNESS_BIG, write64mo_delegate>;
+template class handler_entry_write_delegate<0, 1, ENDIANNESS_LITTLE, write8smo_delegate>;
+template class handler_entry_write_delegate<0, 1, ENDIANNESS_BIG, write8smo_delegate>;
template class handler_entry_write_delegate<0, 0, ENDIANNESS_LITTLE, write8smo_delegate>;
template class handler_entry_write_delegate<0, 0, ENDIANNESS_BIG, write8smo_delegate>;
template class handler_entry_write_delegate<1, 3, ENDIANNESS_LITTLE, write16smo_delegate>;
@@ -447,6 +471,8 @@ template class handler_entry_write_delegate<3, -3, ENDIANNESS_LITTLE, write64smo
template class handler_entry_write_delegate<3, -3, ENDIANNESS_BIG, write64smo_delegate>;
+template class handler_entry_read_ioport<0, 1, ENDIANNESS_LITTLE>;
+template class handler_entry_read_ioport<0, 1, ENDIANNESS_BIG>;
template class handler_entry_read_ioport<0, 0, ENDIANNESS_LITTLE>;
template class handler_entry_read_ioport<0, 0, ENDIANNESS_BIG>;
template class handler_entry_read_ioport<1, 3, ENDIANNESS_LITTLE>;
@@ -470,6 +496,8 @@ template class handler_entry_read_ioport<3, -2, ENDIANNESS_BIG>;
template class handler_entry_read_ioport<3, -3, ENDIANNESS_LITTLE>;
template class handler_entry_read_ioport<3, -3, ENDIANNESS_BIG>;
+template class handler_entry_write_ioport<0, 1, ENDIANNESS_LITTLE>;
+template class handler_entry_write_ioport<0, 1, ENDIANNESS_BIG>;
template class handler_entry_write_ioport<0, 0, ENDIANNESS_LITTLE>;
template class handler_entry_write_ioport<0, 0, ENDIANNESS_BIG>;
template class handler_entry_write_ioport<1, 3, ENDIANNESS_LITTLE>;
diff --git a/src/emu/emumem_hedr0.cpp b/src/emu/emumem_hedr0.cpp
index b39b88263dc..92deb472e03 100644
--- a/src/emu/emumem_hedr0.cpp
+++ b/src/emu/emumem_hedr0.cpp
@@ -5,6 +5,23 @@
#include "emumem_hedr.ipp"
+template class handler_entry_read_dispatch< 1, 0, 1, ENDIANNESS_LITTLE>;
+template class handler_entry_read_dispatch< 1, 0, 1, ENDIANNESS_BIG>;
+template class handler_entry_read_dispatch< 2, 0, 1, ENDIANNESS_LITTLE>;
+template class handler_entry_read_dispatch< 2, 0, 1, ENDIANNESS_BIG>;
+template class handler_entry_read_dispatch< 3, 0, 1, ENDIANNESS_LITTLE>;
+template class handler_entry_read_dispatch< 3, 0, 1, ENDIANNESS_BIG>;
+template class handler_entry_read_dispatch< 4, 0, 1, ENDIANNESS_LITTLE>;
+template class handler_entry_read_dispatch< 4, 0, 1, ENDIANNESS_BIG>;
+template class handler_entry_read_dispatch< 5, 0, 1, ENDIANNESS_LITTLE>;
+template class handler_entry_read_dispatch< 5, 0, 1, ENDIANNESS_BIG>;
+template class handler_entry_read_dispatch< 6, 0, 1, ENDIANNESS_LITTLE>;
+template class handler_entry_read_dispatch< 6, 0, 1, ENDIANNESS_BIG>;
+template class handler_entry_read_dispatch< 7, 0, 1, ENDIANNESS_LITTLE>;
+template class handler_entry_read_dispatch< 7, 0, 1, ENDIANNESS_BIG>;
+template class handler_entry_read_dispatch< 8, 0, 1, ENDIANNESS_LITTLE>;
+template class handler_entry_read_dispatch< 8, 0, 1, ENDIANNESS_BIG>;
+
template class handler_entry_read_dispatch< 1, 0, 0, ENDIANNESS_LITTLE>;
template class handler_entry_read_dispatch< 1, 0, 0, ENDIANNESS_BIG>;
template class handler_entry_read_dispatch< 2, 0, 0, ENDIANNESS_LITTLE>;
diff --git a/src/emu/emumem_hedr1.cpp b/src/emu/emumem_hedr1.cpp
index 5a06dab08c3..86aa8452791 100644
--- a/src/emu/emumem_hedr1.cpp
+++ b/src/emu/emumem_hedr1.cpp
@@ -4,6 +4,23 @@
#include "emu.h"
#include "emumem_hedr.ipp"
+template class handler_entry_read_dispatch< 9, 0, 1, ENDIANNESS_LITTLE>;
+template class handler_entry_read_dispatch< 9, 0, 1, ENDIANNESS_BIG>;
+template class handler_entry_read_dispatch<10, 0, 1, ENDIANNESS_LITTLE>;
+template class handler_entry_read_dispatch<10, 0, 1, ENDIANNESS_BIG>;
+template class handler_entry_read_dispatch<11, 0, 1, ENDIANNESS_LITTLE>;
+template class handler_entry_read_dispatch<11, 0, 1, ENDIANNESS_BIG>;
+template class handler_entry_read_dispatch<12, 0, 1, ENDIANNESS_LITTLE>;
+template class handler_entry_read_dispatch<12, 0, 1, ENDIANNESS_BIG>;
+template class handler_entry_read_dispatch<13, 0, 1, ENDIANNESS_LITTLE>;
+template class handler_entry_read_dispatch<13, 0, 1, ENDIANNESS_BIG>;
+template class handler_entry_read_dispatch<14, 0, 1, ENDIANNESS_LITTLE>;
+template class handler_entry_read_dispatch<14, 0, 1, ENDIANNESS_BIG>;
+template class handler_entry_read_dispatch<15, 0, 1, ENDIANNESS_LITTLE>;
+template class handler_entry_read_dispatch<15, 0, 1, ENDIANNESS_BIG>;
+template class handler_entry_read_dispatch<16, 0, 1, ENDIANNESS_LITTLE>;
+template class handler_entry_read_dispatch<16, 0, 1, ENDIANNESS_BIG>;
+
template class handler_entry_read_dispatch< 9, 0, 0, ENDIANNESS_LITTLE>;
template class handler_entry_read_dispatch< 9, 0, 0, ENDIANNESS_BIG>;
template class handler_entry_read_dispatch<10, 0, 0, ENDIANNESS_LITTLE>;
diff --git a/src/emu/emumem_hedr2.cpp b/src/emu/emumem_hedr2.cpp
index 4c80f2423c4..a59bc746f9e 100644
--- a/src/emu/emumem_hedr2.cpp
+++ b/src/emu/emumem_hedr2.cpp
@@ -4,6 +4,23 @@
#include "emu.h"
#include "emumem_hedr.ipp"
+template class handler_entry_read_dispatch<17, 0, 1, ENDIANNESS_LITTLE>;
+template class handler_entry_read_dispatch<17, 0, 1, ENDIANNESS_BIG>;
+template class handler_entry_read_dispatch<18, 0, 1, ENDIANNESS_LITTLE>;
+template class handler_entry_read_dispatch<18, 0, 1, ENDIANNESS_BIG>;
+template class handler_entry_read_dispatch<19, 0, 1, ENDIANNESS_LITTLE>;
+template class handler_entry_read_dispatch<19, 0, 1, ENDIANNESS_BIG>;
+template class handler_entry_read_dispatch<20, 0, 1, ENDIANNESS_LITTLE>;
+template class handler_entry_read_dispatch<20, 0, 1, ENDIANNESS_BIG>;
+template class handler_entry_read_dispatch<21, 0, 1, ENDIANNESS_LITTLE>;
+template class handler_entry_read_dispatch<21, 0, 1, ENDIANNESS_BIG>;
+template class handler_entry_read_dispatch<22, 0, 1, ENDIANNESS_LITTLE>;
+template class handler_entry_read_dispatch<22, 0, 1, ENDIANNESS_BIG>;
+template class handler_entry_read_dispatch<23, 0, 1, ENDIANNESS_LITTLE>;
+template class handler_entry_read_dispatch<23, 0, 1, ENDIANNESS_BIG>;
+template class handler_entry_read_dispatch<24, 0, 1, ENDIANNESS_LITTLE>;
+template class handler_entry_read_dispatch<24, 0, 1, ENDIANNESS_BIG>;
+
template class handler_entry_read_dispatch<17, 0, 0, ENDIANNESS_LITTLE>;
template class handler_entry_read_dispatch<17, 0, 0, ENDIANNESS_BIG>;
template class handler_entry_read_dispatch<18, 0, 0, ENDIANNESS_LITTLE>;
diff --git a/src/emu/emumem_hedr3.cpp b/src/emu/emumem_hedr3.cpp
index 97fa6d1c9e3..aa325b5b5a8 100644
--- a/src/emu/emumem_hedr3.cpp
+++ b/src/emu/emumem_hedr3.cpp
@@ -5,6 +5,23 @@
#include "emumem_hedr.ipp"
+template class handler_entry_read_dispatch<25, 0, 1, ENDIANNESS_LITTLE>;
+template class handler_entry_read_dispatch<25, 0, 1, ENDIANNESS_BIG>;
+template class handler_entry_read_dispatch<26, 0, 1, ENDIANNESS_LITTLE>;
+template class handler_entry_read_dispatch<26, 0, 1, ENDIANNESS_BIG>;
+template class handler_entry_read_dispatch<27, 0, 1, ENDIANNESS_LITTLE>;
+template class handler_entry_read_dispatch<27, 0, 1, ENDIANNESS_BIG>;
+template class handler_entry_read_dispatch<28, 0, 1, ENDIANNESS_LITTLE>;
+template class handler_entry_read_dispatch<28, 0, 1, ENDIANNESS_BIG>;
+template class handler_entry_read_dispatch<29, 0, 1, ENDIANNESS_LITTLE>;
+template class handler_entry_read_dispatch<29, 0, 1, ENDIANNESS_BIG>;
+template class handler_entry_read_dispatch<30, 0, 1, ENDIANNESS_LITTLE>;
+template class handler_entry_read_dispatch<30, 0, 1, ENDIANNESS_BIG>;
+template class handler_entry_read_dispatch<31, 0, 1, ENDIANNESS_LITTLE>;
+template class handler_entry_read_dispatch<31, 0, 1, ENDIANNESS_BIG>;
+template class handler_entry_read_dispatch<32, 0, 1, ENDIANNESS_LITTLE>;
+template class handler_entry_read_dispatch<32, 0, 1, ENDIANNESS_BIG>;
+
template class handler_entry_read_dispatch<25, 0, 0, ENDIANNESS_LITTLE>;
template class handler_entry_read_dispatch<25, 0, 0, ENDIANNESS_BIG>;
template class handler_entry_read_dispatch<26, 0, 0, ENDIANNESS_LITTLE>;
diff --git a/src/emu/emumem_hedw0.cpp b/src/emu/emumem_hedw0.cpp
index 6a1d0b99699..acfbd3362c3 100644
--- a/src/emu/emumem_hedw0.cpp
+++ b/src/emu/emumem_hedw0.cpp
@@ -5,6 +5,23 @@
#include "emumem_hedw.ipp"
+template class handler_entry_write_dispatch< 1, 0, 1, ENDIANNESS_LITTLE>;
+template class handler_entry_write_dispatch< 1, 0, 1, ENDIANNESS_BIG>;
+template class handler_entry_write_dispatch< 2, 0, 1, ENDIANNESS_LITTLE>;
+template class handler_entry_write_dispatch< 2, 0, 1, ENDIANNESS_BIG>;
+template class handler_entry_write_dispatch< 3, 0, 1, ENDIANNESS_LITTLE>;
+template class handler_entry_write_dispatch< 3, 0, 1, ENDIANNESS_BIG>;
+template class handler_entry_write_dispatch< 4, 0, 1, ENDIANNESS_LITTLE>;
+template class handler_entry_write_dispatch< 4, 0, 1, ENDIANNESS_BIG>;
+template class handler_entry_write_dispatch< 5, 0, 1, ENDIANNESS_LITTLE>;
+template class handler_entry_write_dispatch< 5, 0, 1, ENDIANNESS_BIG>;
+template class handler_entry_write_dispatch< 6, 0, 1, ENDIANNESS_LITTLE>;
+template class handler_entry_write_dispatch< 6, 0, 1, ENDIANNESS_BIG>;
+template class handler_entry_write_dispatch< 7, 0, 1, ENDIANNESS_LITTLE>;
+template class handler_entry_write_dispatch< 7, 0, 1, ENDIANNESS_BIG>;
+template class handler_entry_write_dispatch< 8, 0, 1, ENDIANNESS_LITTLE>;
+template class handler_entry_write_dispatch< 8, 0, 1, ENDIANNESS_BIG>;
+
template class handler_entry_write_dispatch< 1, 0, 0, ENDIANNESS_LITTLE>;
template class handler_entry_write_dispatch< 1, 0, 0, ENDIANNESS_BIG>;
template class handler_entry_write_dispatch< 2, 0, 0, ENDIANNESS_LITTLE>;
diff --git a/src/emu/emumem_hedw1.cpp b/src/emu/emumem_hedw1.cpp
index 4f62d45de4d..d3d3b9e5f81 100644
--- a/src/emu/emumem_hedw1.cpp
+++ b/src/emu/emumem_hedw1.cpp
@@ -4,6 +4,23 @@
#include "emu.h"
#include "emumem_hedw.ipp"
+template class handler_entry_write_dispatch< 9, 0, 1, ENDIANNESS_LITTLE>;
+template class handler_entry_write_dispatch< 9, 0, 1, ENDIANNESS_BIG>;
+template class handler_entry_write_dispatch<10, 0, 1, ENDIANNESS_LITTLE>;
+template class handler_entry_write_dispatch<10, 0, 1, ENDIANNESS_BIG>;
+template class handler_entry_write_dispatch<11, 0, 1, ENDIANNESS_LITTLE>;
+template class handler_entry_write_dispatch<11, 0, 1, ENDIANNESS_BIG>;
+template class handler_entry_write_dispatch<12, 0, 1, ENDIANNESS_LITTLE>;
+template class handler_entry_write_dispatch<12, 0, 1, ENDIANNESS_BIG>;
+template class handler_entry_write_dispatch<13, 0, 1, ENDIANNESS_LITTLE>;
+template class handler_entry_write_dispatch<13, 0, 1, ENDIANNESS_BIG>;
+template class handler_entry_write_dispatch<14, 0, 1, ENDIANNESS_LITTLE>;
+template class handler_entry_write_dispatch<14, 0, 1, ENDIANNESS_BIG>;
+template class handler_entry_write_dispatch<15, 0, 1, ENDIANNESS_LITTLE>;
+template class handler_entry_write_dispatch<15, 0, 1, ENDIANNESS_BIG>;
+template class handler_entry_write_dispatch<16, 0, 1, ENDIANNESS_LITTLE>;
+template class handler_entry_write_dispatch<16, 0, 1, ENDIANNESS_BIG>;
+
template class handler_entry_write_dispatch< 9, 0, 0, ENDIANNESS_LITTLE>;
template class handler_entry_write_dispatch< 9, 0, 0, ENDIANNESS_BIG>;
template class handler_entry_write_dispatch<10, 0, 0, ENDIANNESS_LITTLE>;
diff --git a/src/emu/emumem_hedw2.cpp b/src/emu/emumem_hedw2.cpp
index b00eb38311d..8e6fc4c4dcf 100644
--- a/src/emu/emumem_hedw2.cpp
+++ b/src/emu/emumem_hedw2.cpp
@@ -4,6 +4,23 @@
#include "emu.h"
#include "emumem_hedw.ipp"
+template class handler_entry_write_dispatch<17, 0, 1, ENDIANNESS_LITTLE>;
+template class handler_entry_write_dispatch<17, 0, 1, ENDIANNESS_BIG>;
+template class handler_entry_write_dispatch<18, 0, 1, ENDIANNESS_LITTLE>;
+template class handler_entry_write_dispatch<18, 0, 1, ENDIANNESS_BIG>;
+template class handler_entry_write_dispatch<19, 0, 1, ENDIANNESS_LITTLE>;
+template class handler_entry_write_dispatch<19, 0, 1, ENDIANNESS_BIG>;
+template class handler_entry_write_dispatch<20, 0, 1, ENDIANNESS_LITTLE>;
+template class handler_entry_write_dispatch<20, 0, 1, ENDIANNESS_BIG>;
+template class handler_entry_write_dispatch<21, 0, 1, ENDIANNESS_LITTLE>;
+template class handler_entry_write_dispatch<21, 0, 1, ENDIANNESS_BIG>;
+template class handler_entry_write_dispatch<22, 0, 1, ENDIANNESS_LITTLE>;
+template class handler_entry_write_dispatch<22, 0, 1, ENDIANNESS_BIG>;
+template class handler_entry_write_dispatch<23, 0, 1, ENDIANNESS_LITTLE>;
+template class handler_entry_write_dispatch<23, 0, 1, ENDIANNESS_BIG>;
+template class handler_entry_write_dispatch<24, 0, 1, ENDIANNESS_LITTLE>;
+template class handler_entry_write_dispatch<24, 0, 1, ENDIANNESS_BIG>;
+
template class handler_entry_write_dispatch<17, 0, 0, ENDIANNESS_LITTLE>;
template class handler_entry_write_dispatch<17, 0, 0, ENDIANNESS_BIG>;
template class handler_entry_write_dispatch<18, 0, 0, ENDIANNESS_LITTLE>;
diff --git a/src/emu/emumem_hedw3.cpp b/src/emu/emumem_hedw3.cpp
index 539736655cc..4a423133483 100644
--- a/src/emu/emumem_hedw3.cpp
+++ b/src/emu/emumem_hedw3.cpp
@@ -5,6 +5,23 @@
#include "emumem_hedw.ipp"
+template class handler_entry_write_dispatch<25, 0, 1, ENDIANNESS_LITTLE>;
+template class handler_entry_write_dispatch<25, 0, 1, ENDIANNESS_BIG>;
+template class handler_entry_write_dispatch<26, 0, 1, ENDIANNESS_LITTLE>;
+template class handler_entry_write_dispatch<26, 0, 1, ENDIANNESS_BIG>;
+template class handler_entry_write_dispatch<27, 0, 1, ENDIANNESS_LITTLE>;
+template class handler_entry_write_dispatch<27, 0, 1, ENDIANNESS_BIG>;
+template class handler_entry_write_dispatch<28, 0, 1, ENDIANNESS_LITTLE>;
+template class handler_entry_write_dispatch<28, 0, 1, ENDIANNESS_BIG>;
+template class handler_entry_write_dispatch<29, 0, 1, ENDIANNESS_LITTLE>;
+template class handler_entry_write_dispatch<29, 0, 1, ENDIANNESS_BIG>;
+template class handler_entry_write_dispatch<30, 0, 1, ENDIANNESS_LITTLE>;
+template class handler_entry_write_dispatch<30, 0, 1, ENDIANNESS_BIG>;
+template class handler_entry_write_dispatch<31, 0, 1, ENDIANNESS_LITTLE>;
+template class handler_entry_write_dispatch<31, 0, 1, ENDIANNESS_BIG>;
+template class handler_entry_write_dispatch<32, 0, 1, ENDIANNESS_LITTLE>;
+template class handler_entry_write_dispatch<32, 0, 1, ENDIANNESS_BIG>;
+
template class handler_entry_write_dispatch<25, 0, 0, ENDIANNESS_LITTLE>;
template class handler_entry_write_dispatch<25, 0, 0, ENDIANNESS_BIG>;
template class handler_entry_write_dispatch<26, 0, 0, ENDIANNESS_LITTLE>;
diff --git a/src/emu/emumem_hem.cpp b/src/emu/emumem_hem.cpp
index 45f83d75d12..1a2963951f1 100644
--- a/src/emu/emumem_hem.cpp
+++ b/src/emu/emumem_hem.cpp
@@ -95,6 +95,8 @@ template<int Width, int AddrShift, int Endian> std::string handler_entry_write_m
+template class handler_entry_read_memory<0, 1, ENDIANNESS_LITTLE>;
+template class handler_entry_read_memory<0, 1, ENDIANNESS_BIG>;
template class handler_entry_read_memory<0, 0, ENDIANNESS_LITTLE>;
template class handler_entry_read_memory<0, 0, ENDIANNESS_BIG>;
template class handler_entry_read_memory<1, 3, ENDIANNESS_LITTLE>;
@@ -118,6 +120,8 @@ template class handler_entry_read_memory<3, -2, ENDIANNESS_BIG>;
template class handler_entry_read_memory<3, -3, ENDIANNESS_LITTLE>;
template class handler_entry_read_memory<3, -3, ENDIANNESS_BIG>;
+template class handler_entry_write_memory<0, 1, ENDIANNESS_LITTLE>;
+template class handler_entry_write_memory<0, 1, ENDIANNESS_BIG>;
template class handler_entry_write_memory<0, 0, ENDIANNESS_LITTLE>;
template class handler_entry_write_memory<0, 0, ENDIANNESS_BIG>;
template class handler_entry_write_memory<1, 3, ENDIANNESS_LITTLE>;
@@ -142,6 +146,8 @@ template class handler_entry_write_memory<3, -3, ENDIANNESS_LITTLE>;
template class handler_entry_write_memory<3, -3, ENDIANNESS_BIG>;
+template class handler_entry_read_memory_bank<0, 1, ENDIANNESS_LITTLE>;
+template class handler_entry_read_memory_bank<0, 1, ENDIANNESS_BIG>;
template class handler_entry_read_memory_bank<0, 0, ENDIANNESS_LITTLE>;
template class handler_entry_read_memory_bank<0, 0, ENDIANNESS_BIG>;
template class handler_entry_read_memory_bank<1, 3, ENDIANNESS_LITTLE>;
@@ -165,6 +171,8 @@ template class handler_entry_read_memory_bank<3, -2, ENDIANNESS_BIG>;
template class handler_entry_read_memory_bank<3, -3, ENDIANNESS_LITTLE>;
template class handler_entry_read_memory_bank<3, -3, ENDIANNESS_BIG>;
+template class handler_entry_write_memory_bank<0, 1, ENDIANNESS_LITTLE>;
+template class handler_entry_write_memory_bank<0, 1, ENDIANNESS_BIG>;
template class handler_entry_write_memory_bank<0, 0, ENDIANNESS_LITTLE>;
template class handler_entry_write_memory_bank<0, 0, ENDIANNESS_BIG>;
template class handler_entry_write_memory_bank<1, 3, ENDIANNESS_LITTLE>;
diff --git a/src/emu/emumem_hep.cpp b/src/emu/emumem_hep.cpp
index 97bdf759a38..f411dcb522c 100644
--- a/src/emu/emumem_hep.cpp
+++ b/src/emu/emumem_hep.cpp
@@ -50,6 +50,8 @@ template<int Width, int AddrShift, int Endian> void handler_entry_write_passthro
np->detach(handlers);
}
+template class handler_entry_read_passthrough<0, 1, ENDIANNESS_LITTLE>;
+template class handler_entry_read_passthrough<0, 1, ENDIANNESS_BIG>;
template class handler_entry_read_passthrough<0, 0, ENDIANNESS_LITTLE>;
template class handler_entry_read_passthrough<0, 0, ENDIANNESS_BIG>;
template class handler_entry_read_passthrough<1, 3, ENDIANNESS_LITTLE>;
@@ -73,6 +75,8 @@ template class handler_entry_read_passthrough<3, -2, ENDIANNESS_BIG>;
template class handler_entry_read_passthrough<3, -3, ENDIANNESS_LITTLE>;
template class handler_entry_read_passthrough<3, -3, ENDIANNESS_BIG>;
+template class handler_entry_write_passthrough<0, 1, ENDIANNESS_LITTLE>;
+template class handler_entry_write_passthrough<0, 1, ENDIANNESS_BIG>;
template class handler_entry_write_passthrough<0, 0, ENDIANNESS_LITTLE>;
template class handler_entry_write_passthrough<0, 0, ENDIANNESS_BIG>;
template class handler_entry_write_passthrough<1, 3, ENDIANNESS_LITTLE>;
diff --git a/src/emu/emumem_het.cpp b/src/emu/emumem_het.cpp
index 5d948eccfeb..87f3d35dc10 100644
--- a/src/emu/emumem_het.cpp
+++ b/src/emu/emumem_het.cpp
@@ -42,6 +42,8 @@ template<int Width, int AddrShift, int Endian> handler_entry_write_tap<Width, Ad
+template class handler_entry_read_tap<0, 1, ENDIANNESS_LITTLE>;
+template class handler_entry_read_tap<0, 1, ENDIANNESS_BIG>;
template class handler_entry_read_tap<0, 0, ENDIANNESS_LITTLE>;
template class handler_entry_read_tap<0, 0, ENDIANNESS_BIG>;
template class handler_entry_read_tap<1, 3, ENDIANNESS_LITTLE>;
@@ -65,6 +67,8 @@ template class handler_entry_read_tap<3, -2, ENDIANNESS_BIG>;
template class handler_entry_read_tap<3, -3, ENDIANNESS_LITTLE>;
template class handler_entry_read_tap<3, -3, ENDIANNESS_BIG>;
+template class handler_entry_write_tap<0, 1, ENDIANNESS_LITTLE>;
+template class handler_entry_write_tap<0, 1, ENDIANNESS_BIG>;
template class handler_entry_write_tap<0, 0, ENDIANNESS_LITTLE>;
template class handler_entry_write_tap<0, 0, ENDIANNESS_BIG>;
template class handler_entry_write_tap<1, 3, ENDIANNESS_LITTLE>;
diff --git a/src/emu/emumem_heu.cpp b/src/emu/emumem_heu.cpp
index 7b071e36c52..8a62d8aa5e2 100644
--- a/src/emu/emumem_heu.cpp
+++ b/src/emu/emumem_heu.cpp
@@ -230,6 +230,8 @@ template<int Width, int AddrShift, int Endian> std::string handler_entry_write_u
}
+template class handler_entry_read_units<0, 1, ENDIANNESS_LITTLE>;
+template class handler_entry_read_units<0, 1, ENDIANNESS_BIG>;
template class handler_entry_read_units<0, 0, ENDIANNESS_LITTLE>;
template class handler_entry_read_units<0, 0, ENDIANNESS_BIG>;
template class handler_entry_read_units<1, 3, ENDIANNESS_LITTLE>;
@@ -253,6 +255,8 @@ template class handler_entry_read_units<3, -2, ENDIANNESS_BIG>;
template class handler_entry_read_units<3, -3, ENDIANNESS_LITTLE>;
template class handler_entry_read_units<3, -3, ENDIANNESS_BIG>;
+template class handler_entry_write_units<0, 1, ENDIANNESS_LITTLE>;
+template class handler_entry_write_units<0, 1, ENDIANNESS_BIG>;
template class handler_entry_write_units<0, 0, ENDIANNESS_LITTLE>;
template class handler_entry_write_units<0, 0, ENDIANNESS_BIG>;
template class handler_entry_write_units<1, 3, ENDIANNESS_LITTLE>;
diff --git a/src/emu/emumem_heun.cpp b/src/emu/emumem_heun.cpp
index e76ddfe7078..c25d77bbd33 100644
--- a/src/emu/emumem_heun.cpp
+++ b/src/emu/emumem_heun.cpp
@@ -64,6 +64,8 @@ template<int Width, int AddrShift, int Endian> std::string handler_entry_write_n
}
+template class handler_entry_read_unmapped<0, 1, ENDIANNESS_LITTLE>;
+template class handler_entry_read_unmapped<0, 1, ENDIANNESS_BIG>;
template class handler_entry_read_unmapped<0, 0, ENDIANNESS_LITTLE>;
template class handler_entry_read_unmapped<0, 0, ENDIANNESS_BIG>;
template class handler_entry_read_unmapped<1, 3, ENDIANNESS_LITTLE>;
@@ -87,6 +89,8 @@ template class handler_entry_read_unmapped<3, -2, ENDIANNESS_BIG>;
template class handler_entry_read_unmapped<3, -3, ENDIANNESS_LITTLE>;
template class handler_entry_read_unmapped<3, -3, ENDIANNESS_BIG>;
+template class handler_entry_write_unmapped<0, 1, ENDIANNESS_LITTLE>;
+template class handler_entry_write_unmapped<0, 1, ENDIANNESS_BIG>;
template class handler_entry_write_unmapped<0, 0, ENDIANNESS_LITTLE>;
template class handler_entry_write_unmapped<0, 0, ENDIANNESS_BIG>;
template class handler_entry_write_unmapped<1, 3, ENDIANNESS_LITTLE>;
@@ -111,6 +115,8 @@ template class handler_entry_write_unmapped<3, -3, ENDIANNESS_LITTLE>;
template class handler_entry_write_unmapped<3, -3, ENDIANNESS_BIG>;
+template class handler_entry_read_nop<0, 1, ENDIANNESS_LITTLE>;
+template class handler_entry_read_nop<0, 1, ENDIANNESS_BIG>;
template class handler_entry_read_nop<0, 0, ENDIANNESS_LITTLE>;
template class handler_entry_read_nop<0, 0, ENDIANNESS_BIG>;
template class handler_entry_read_nop<1, 3, ENDIANNESS_LITTLE>;
@@ -134,6 +140,8 @@ template class handler_entry_read_nop<3, -2, ENDIANNESS_BIG>;
template class handler_entry_read_nop<3, -3, ENDIANNESS_LITTLE>;
template class handler_entry_read_nop<3, -3, ENDIANNESS_BIG>;
+template class handler_entry_write_nop<0, 1, ENDIANNESS_LITTLE>;
+template class handler_entry_write_nop<0, 1, ENDIANNESS_BIG>;
template class handler_entry_write_nop<0, 0, ENDIANNESS_LITTLE>;
template class handler_entry_write_nop<0, 0, ENDIANNESS_BIG>;
template class handler_entry_write_nop<1, 3, ENDIANNESS_LITTLE>;
diff --git a/src/emu/emupal.h b/src/emu/emupal.h
index c1bcdc11852..0711bf1a296 100644
--- a/src/emu/emupal.h
+++ b/src/emu/emupal.h
@@ -116,15 +116,6 @@
#define MCFG_PALETTE_FORMAT(_format) \
downcast<palette_device &>(*device).set_format(PALETTE_FORMAT_##_format);
-#define MCFG_PALETTE_MEMBITS(_width) \
- downcast<palette_device &>(*device).set_membits(_width);
-
-#define MCFG_PALETTE_ENTRIES(_entries) \
- downcast<palette_device &>(*device).set_entries(_entries);
-
-#define MCFG_PALETTE_INDIRECT_ENTRIES(_entries) \
- downcast<palette_device &>(*device).set_indirect_entries(_entries);
-
// not implemented yet
#if 0
@@ -165,7 +156,7 @@ public:
rgb_t operator()(u32 raw) const { return (*m_func)(raw); }
// generic raw-to-RGB conversion helpers
- template<int RedBits, int GreenBits, int BlueBits, int RedShift, int GreenShift, int BlueShift>
+ template <int RedBits, int GreenBits, int BlueBits, int RedShift, int GreenShift, int BlueShift>
static rgb_t standard_rgb_decoder(u32 raw)
{
u8 const r = palexpand<RedBits>(raw >> RedShift);
@@ -175,7 +166,7 @@ public:
}
// data-inverted generic raw-to-RGB conversion helpers
- template<int RedBits, int GreenBits, int BlueBits, int RedShift, int GreenShift, int BlueShift>
+ template <int RedBits, int GreenBits, int BlueBits, int RedShift, int GreenShift, int BlueShift>
static rgb_t inverted_rgb_decoder(u32 raw)
{
u8 const r = palexpand<RedBits>(~raw >> RedShift);
@@ -184,7 +175,7 @@ public:
return rgb_t(r, g, b);
}
- template<int IntBits, int RedBits, int GreenBits, int BlueBits, int IntShift, int RedShift, int GreenShift, int BlueShift>
+ template <int IntBits, int RedBits, int GreenBits, int BlueBits, int IntShift, int RedShift, int GreenShift, int BlueShift>
static rgb_t standard_irgb_decoder(u32 raw)
{
u8 const i = palexpand<IntBits>(raw >> IntShift);
diff --git a/src/emu/fileio.cpp b/src/emu/fileio.cpp
index 3ec686266c8..bbd1d931f30 100644
--- a/src/emu/fileio.cpp
+++ b/src/emu/fileio.cpp
@@ -96,7 +96,7 @@ bool path_iterator::next(std::string &buffer, const char *name)
if (name)
{
// compute the full pathname
- if (!buffer.empty() && (*buffer.rbegin() != *PATH_SEPARATOR))
+ if (!buffer.empty() && !util::is_directory_separator(buffer.back()))
buffer.append(PATH_SEPARATOR);
buffer.append(name);
}
diff --git a/src/emu/inpttype.h b/src/emu/inpttype.h
index 6cc9440c669..c77df5f39f6 100644
--- a/src/emu/inpttype.h
+++ b/src/emu/inpttype.h
@@ -25,7 +25,7 @@
#pragma GCC push_options
#pragma GCC optimize ("O1")
#endif
-#elif defined(_MSC_VER)
+#elif defined(_MSC_VER) && !defined(__clang__)
#pragma optimize("", off)
#endif
@@ -954,6 +954,6 @@ inline void construct_core_types(simple_list<input_type_entry> &typelist)
#if not(defined(__arm__) || defined(__ARMEL__))
#pragma GCC pop_options
#endif
-#elif defined(_MSC_VER)
+#elif defined(_MSC_VER) && !defined(__clang__)
#pragma optimize("", on)
#endif
diff --git a/src/emu/ioport.h b/src/emu/ioport.h
index f091af11373..3f5f7560f71 100644
--- a/src/emu/ioport.h
+++ b/src/emu/ioport.h
@@ -1505,7 +1505,7 @@ public:
ioport_configurer& field_add_code(input_seq_type which, input_code code);
ioport_configurer& field_set_way(int way) { m_curfield->m_way = way; return *this; }
ioport_configurer& field_set_rotated() { m_curfield->m_flags |= ioport_field::FIELD_FLAG_ROTATED; return *this; }
- ioport_configurer& field_set_name(const char *name) { m_curfield->m_name = string_from_token(name); return *this; }
+ ioport_configurer& field_set_name(const char *name) { assert(m_curfield != nullptr); m_curfield->m_name = string_from_token(name); return *this; }
ioport_configurer& field_set_player(int player) { m_curfield->m_player = player - 1; return *this; }
ioport_configurer& field_set_cocktail() { m_curfield->m_flags |= ioport_field::FIELD_FLAG_COCKTAIL; field_set_player(2); return *this; }
ioport_configurer& field_set_toggle() { m_curfield->m_flags |= ioport_field::FIELD_FLAG_TOGGLE; return *this; }
diff --git a/src/emu/machine.cpp b/src/emu/machine.cpp
index 904644e104f..72bdf764ee5 100644
--- a/src/emu/machine.cpp
+++ b/src/emu/machine.cpp
@@ -1329,7 +1329,7 @@ DEFINE_DEVICE_TYPE(DUMMY_SPACE, dummy_space_device, "dummy_space", "Dummy Space"
dummy_space_device::dummy_space_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock) :
device_t(mconfig, DUMMY_SPACE, tag, owner, clock),
device_memory_interface(mconfig, *this),
- m_space_config("dummy", ENDIANNESS_LITTLE, 8, 32, 0, address_map_constructor(), address_map_constructor(FUNC(dummy_space_device::dummy), this))
+ m_space_config("dummy", ENDIANNESS_LITTLE, 8, 32, 0, address_map_constructor(FUNC(dummy_space_device::dummy), this))
{
}
diff --git a/src/emu/mconfig.h b/src/emu/mconfig.h
index 787c2411fc7..16f431a9eb8 100644
--- a/src/emu/mconfig.h
+++ b/src/emu/mconfig.h
@@ -245,19 +245,11 @@ Ends a machine_config.
/** @name Core machine config options */
//*************************************************************************/
-// scheduling parameters
-#define MCFG_QUANTUM_TIME(_time) \
- config.m_minimum_quantum = _time;
-#define MCFG_QUANTUM_PERFECT_CPU(_cputag) \
- config.m_perfect_cpu_quantum = subtag(_cputag);
-
// add/remove devices
#define MCFG_DEVICE_ADD(_tag, ...) \
device = emu::detail::device_add_impl(config, _tag, __VA_ARGS__);
#define MCFG_DEVICE_REPLACE(_tag, ...) \
device = emu::detail::device_replace_impl(config, _tag, __VA_ARGS__);
-#define MCFG_DEVICE_REMOVE(_tag) \
- device = config.device_remove(_tag);
#define MCFG_DEVICE_MODIFY(_tag) \
device = config.device_find(this, _tag);
diff --git a/src/emu/render.h b/src/emu/render.h
index 9660b8fc71f..93621ea92c1 100644
--- a/src/emu/render.h
+++ b/src/emu/render.h
@@ -852,6 +852,8 @@ public:
std::string m_input_tag; // input tag of this item
ioport_port * m_input_port; // input port of this item
ioport_value m_input_mask; // input mask of this item
+ u8 m_input_shift; // input mask rightshift for raw (trailing 0s)
+ bool m_input_raw; // get raw data from input port
screen_device * m_screen; // pointer to screen
int m_orientation; // orientation of this item
render_bounds m_bounds; // bounds of the item
diff --git a/src/emu/rendlay.cpp b/src/emu/rendlay.cpp
index b47d643e254..d083ba5510a 100644
--- a/src/emu/rendlay.cpp
+++ b/src/emu/rendlay.cpp
@@ -3283,6 +3283,8 @@ layout_view::item::item(
, m_input_tag(env.get_attribute_string(itemnode, "inputtag", ""))
, m_input_port(nullptr)
, m_input_mask(0)
+ , m_input_shift(0)
+ , m_input_raw(false)
, m_screen(nullptr)
, m_orientation(orientation_add(env.parse_orientation(itemnode.get_child("orientation")), orientation))
, m_color(render_color_multiply(env.parse_color(itemnode.get_child("color")), color))
@@ -3308,6 +3310,8 @@ layout_view::item::item(
if (index != -1)
m_screen = screen_device_iterator(env.machine().root_device()).byindex(index);
m_input_mask = env.get_attribute_int(itemnode, "inputmask", 0);
+ for (u32 mask = m_input_mask; (mask != 0) && (~mask & 1); mask >>= 1) m_input_shift++;
+ m_input_raw = env.get_attribute_int(itemnode, "inputraw", 0) == 1;
if (m_have_output && m_element)
m_output = m_element->default_state();
env.parse_bounds(itemnode.get_child("bounds"), m_rawbounds);
@@ -3380,9 +3384,16 @@ int layout_view::item::state() const
// if configured to an input, fetch the input value
if (m_input_port)
{
- ioport_field const *const field = m_input_port->field(m_input_mask);
- if (field)
- return ((m_input_port->read() ^ field->defvalue()) & m_input_mask) ? 1 : 0;
+ if (m_input_raw)
+ {
+ return (m_input_port->read() & m_input_mask) >> m_input_shift;
+ }
+ else
+ {
+ ioport_field const *const field = m_input_port->field(m_input_mask);
+ if (field)
+ return ((m_input_port->read() ^ field->defvalue()) & m_input_mask) ? 1 : 0;
+ }
}
}
diff --git a/src/emu/romload.cpp b/src/emu/romload.cpp
index 674f4d1ab23..c5b03607509 100644
--- a/src/emu/romload.cpp
+++ b/src/emu/romload.cpp
@@ -32,14 +32,9 @@
static osd_file::error common_process_file(emu_options &options, const char *location, const char *ext, const rom_entry *romp, emu_file &image_file)
{
- osd_file::error filerr;
-
- if (location != nullptr && strcmp(location, "") != 0)
- filerr = image_file.open(location, PATH_SEPARATOR, ROM_GETNAME(romp), ext);
- else
- filerr = image_file.open(ROM_GETNAME(romp), ext);
-
- return filerr;
+ return (location && *location)
+ ? image_file.open(location, PATH_SEPARATOR, ROM_GETNAME(romp), ext)
+ : image_file.open(ROM_GETNAME(romp), ext);
}
std::unique_ptr<emu_file> common_process_file(emu_options &options, const char *location, bool has_crc, u32 crc, const rom_entry *romp, osd_file::error &filerr)
@@ -860,29 +855,29 @@ void rom_load_manager::process_rom_entries(const char *regiontag, const rom_entr
/* loop until we hit the end of this region */
while (!ROMENTRY_ISREGIONEND(romp))
{
- /* if this is a continue entry, it's invalid */
if (ROMENTRY_ISCONTINUE(romp))
fatalerror("Error in RomModule definition: ROM_CONTINUE not preceded by ROM_LOAD\n");
- /* if this is an ignore entry, it's invalid */
if (ROMENTRY_ISIGNORE(romp))
fatalerror("Error in RomModule definition: ROM_IGNORE not preceded by ROM_LOAD\n");
- /* if this is a reload entry, it's invalid */
if (ROMENTRY_ISRELOAD(romp))
fatalerror("Error in RomModule definition: ROM_RELOAD not preceded by ROM_LOAD\n");
- /* handle fills */
if (ROMENTRY_ISFILL(romp))
- fill_rom_data(romp++);
+ {
+ if (!ROM_GETBIOSFLAGS(romp) || ROM_GETBIOSFLAGS(romp) == device->system_bios())
+ fill_rom_data(romp);
- /* handle copies */
+ romp++;
+ }
else if (ROMENTRY_ISCOPY(romp))
+ {
copy_rom_data(romp++);
-
- /* handle files */
+ }
else if (ROMENTRY_ISFILE(romp))
{
+ /* handle files */
int irrelevantbios = (ROM_GETBIOSFLAGS(romp) != 0 && ROM_GETBIOSFLAGS(romp) != device->system_bios());
const rom_entry *baserom = romp;
int explength = 0;
@@ -941,7 +936,7 @@ void rom_load_manager::process_rom_entries(const char *regiontag, const rom_entr
}
else
{
- romp++; /* something else; skip */
+ romp++; // something else - skip
}
}
}
diff --git a/src/emu/schedule.h b/src/emu/schedule.h
index fea68690360..f5631a6f816 100644
--- a/src/emu/schedule.h
+++ b/src/emu/schedule.h
@@ -83,6 +83,7 @@ public:
attotime remaining() const;
attotime start() const { return m_start; }
attotime expire() const { return m_expire; }
+ attotime period() const { return m_period; }
private:
// internal helpers
diff --git a/src/emu/screen.cpp b/src/emu/screen.cpp
index fc706f5af48..77efffc970b 100644
--- a/src/emu/screen.cpp
+++ b/src/emu/screen.cpp
@@ -119,22 +119,7 @@ screen_device::svg_renderer::svg_renderer(memory_region *region)
m_sx = m_sy = 0;
m_scale = 1.0;
-#if 0
- double ar = m_image->width / m_image->height;
- int w,h;
- if (ar < (16.0/9.0))
- {
- h = 1080;
- w = (h * ar) + 0.5;
- }
- else
- {
- w = 1920;
- h = (w / ar) + 0.5;
- }
-
- printf("\n\nMCFG_SCREEN_SIZE(%d, %d)\nMCFG_SCREEN_VISIBLE_AREA(0, %d-1, 0, %d-1)\n", w, h, w, h);
-#endif
+ osd_printf_verbose("Parsed SVG '%s', aspect ratio %f\n", region->name(), (m_image->height == 0.0f) ? 0 : m_image->width / m_image->height);
}
screen_device::svg_renderer::~svg_renderer()
@@ -730,6 +715,10 @@ void screen_device::device_resolve_objects()
void screen_device::device_start()
{
+ // if we have a palette and it's not started, wait for it
+ if (m_palette && !m_palette->device().started())
+ throw device_missing_dependencies();
+
if (m_type == SCREEN_TYPE_SVG)
{
memory_region *reg = owner()->memregion(m_svg_region);
@@ -749,10 +738,6 @@ void screen_device::device_start()
}
}
- // if we have a palette and it's not started, wait for it
- if (m_palette && !m_palette->device().started())
- throw device_missing_dependencies();
-
// configure bitmap formats and allocate screen bitmaps
// svg is RGB32 too, and doesn't have any update method
texture_format texformat = !m_screen_update_ind16.isnull() ? TEXFORMAT_PALETTE16 : TEXFORMAT_RGB32;
diff --git a/src/emu/screen.h b/src/emu/screen.h
index acd106f3c4e..32702e26938 100644
--- a/src/emu/screen.h
+++ b/src/emu/screen.h
@@ -177,6 +177,18 @@ public:
{
set_type(type);
}
+ screen_device(const machine_config &mconfig, const char *tag, device_t *owner, screen_type_enum type, rgb_t color)
+ : screen_device(mconfig, tag, owner, u32(0))
+ {
+ set_type(type);
+ set_color(color);
+ }
+ screen_device(const machine_config &mconfig, const char *tag, device_t *owner, const char *region)
+ : screen_device(mconfig, tag, owner, u32(0))
+ {
+ set_type(SCREEN_TYPE_SVG);
+ set_svg_region(region);
+ }
~screen_device();
// configuration readers
@@ -217,6 +229,7 @@ public:
void set_vblank_time(attoseconds_t time) { m_vblank = time; m_oldstyle_vblank_supplied = true; }
void set_size(u16 width, u16 height) { m_width = width; m_height = height; }
void set_visarea(s16 minx, s16 maxx, s16 miny, s16 maxy) { m_visarea.set(minx, maxx, miny, maxy); }
+ void set_visarea_full() { m_visarea.set(0, m_width - 1, 0, m_height - 1); } // call after set_size
void set_default_position(double xscale, double xoffs, double yscale, double yoffs) {
m_xscale = xscale;
m_xoffset = xoffs;
@@ -520,22 +533,12 @@ typedef device_type_iterator<screen_device> screen_device_iterator;
#define MCFG_SCREEN_ADD(_tag, _type) \
MCFG_DEVICE_ADD(_tag, SCREEN, SCREEN_TYPE_##_type)
-#define MCFG_SCREEN_ADD_MONOCHROME(_tag, _type, _color) \
- MCFG_DEVICE_ADD(_tag, SCREEN, 0) \
- MCFG_SCREEN_TYPE(_type) \
- MCFG_SCREEN_COLOR(_color)
-
#define MCFG_SCREEN_MODIFY(_tag) \
MCFG_DEVICE_MODIFY(_tag)
#define MCFG_SCREEN_TYPE(_type) \
downcast<screen_device &>(*device).set_type(SCREEN_TYPE_##_type);
-#define MCFG_SCREEN_SVG_ADD(_tag, _region) \
- MCFG_DEVICE_ADD(_tag, SCREEN, 0) \
- MCFG_SCREEN_TYPE(SVG) \
- downcast<screen_device &>(*device).set_svg_region(_region);
-
#define MCFG_SCREEN_RAW_PARAMS(_pixclock, _htotal, _hbend, _hbstart, _vtotal, _vbend, _vbstart) \
downcast<screen_device &>(*device).set_raw(_pixclock, _htotal, _hbend, _hbstart, _vtotal, _vbend, _vbstart);
@@ -550,8 +553,6 @@ typedef device_type_iterator<screen_device> screen_device_iterator;
#define MCFG_SCREEN_VISIBLE_AREA(_minx, _maxx, _miny, _maxy) \
downcast<screen_device &>(*device).set_visarea(_minx, _maxx, _miny, _maxy);
-#define MCFG_SCREEN_DEFAULT_POSITION(_xscale, _xoffs, _yscale, _yoffs) \
- downcast<screen_device &>(*device).set_default_position(_xscale, _xoffs, _yscale, _yoffs);
#define MCFG_SCREEN_UPDATE_DRIVER(_class, _method) \
downcast<screen_device &>(*device).set_screen_update(&_class::_method, #_class "::" #_method);
#define MCFG_SCREEN_UPDATE_DEVICE(_device, _class, _method) \
@@ -564,7 +565,5 @@ typedef device_type_iterator<screen_device> screen_device_iterator;
downcast<screen_device &>(*device).set_palette(finder_base::DUMMY_TAG);
#define MCFG_SCREEN_VIDEO_ATTRIBUTES(_flags) \
downcast<screen_device &>(*device).set_video_attributes(_flags);
-#define MCFG_SCREEN_COLOR(_color) \
- downcast<screen_device &>(*device).set_color(_color);
#endif // MAME_EMU_SCREEN_H
diff --git a/src/emu/softlist_dev.cpp b/src/emu/softlist_dev.cpp
index 21dfb45ba09..831fc3f6734 100644
--- a/src/emu/softlist_dev.cpp
+++ b/src/emu/softlist_dev.cpp
@@ -113,14 +113,15 @@ void software_list_device::find_approx_matches(const std::string &name, int matc
return;
// initialize everyone's states
- std::vector<int> penalty(matches);
+ std::vector<double> penalty(matches);
for (int matchnum = 0; matchnum < matches; matchnum++)
{
- penalty[matchnum] = 9999;
+ penalty[matchnum] = 2.0;
list[matchnum] = nullptr;
}
// iterate over our info (will cause a parse if needed)
+ std::u32string const search(ustr_from_utf8(normalize_unicode(name, unicode_normalization_form::D, true)));
for (const software_info &swinfo : get_info())
{
for (const software_part &swpart : swinfo.parts())
@@ -128,13 +129,13 @@ void software_list_device::find_approx_matches(const std::string &name, int matc
if ((interface == nullptr || swpart.matches_interface(interface)) && is_compatible(swpart) == SOFTWARE_IS_COMPATIBLE)
{
// pick the best match between driver name and description
- int longpenalty = driver_list::penalty_compare(name.c_str(), swinfo.longname().c_str());
- int shortpenalty = driver_list::penalty_compare(name.c_str(), swinfo.shortname().c_str());
- int curpenalty = std::min(longpenalty, shortpenalty);
+ double const longpenalty = util::edit_distance(search, ustr_from_utf8(normalize_unicode(swinfo.longname(), unicode_normalization_form::D, true)));
+ double const shortpenalty = util::edit_distance(search, ustr_from_utf8(normalize_unicode(swinfo.shortname(), unicode_normalization_form::D, true)));
+ double const curpenalty = (std::min)(longpenalty, shortpenalty);
// make sure it isn't already in the table
bool skip = false;
- for (int matchnum = 0; matchnum < matches; matchnum++)
+ for (int matchnum = 0; !skip && (matchnum < matches) && list[matchnum]; matchnum++)
{
if ((penalty[matchnum] == curpenalty) && (swinfo.longname() == list[matchnum]->longname()) && (swinfo.shortname() == list[matchnum]->shortname()))
skip = true;
@@ -254,18 +255,16 @@ const software_info *software_list_device::find(const std::string &look_for)
// find a match (will cause a parse if needed when calling get_info)
const auto &info_list = get_info();
auto iter = std::find_if(
- info_list.begin(),
- info_list.end(),
- [&](const software_info &info)
- {
- const char *shortname = info.shortname().c_str();
- return (iswild && core_strwildcmp(look_for.c_str(), shortname) == 0)
- || core_stricmp(look_for.c_str(), shortname) == 0;
- });
-
- return iter != info_list.end()
- ? &*iter
- : nullptr;
+ info_list.begin(),
+ info_list.end(),
+ [&look_for, iswild] (const software_info &info)
+ {
+ const char *shortname = info.shortname().c_str();
+ return (iswild && core_strwildcmp(look_for.c_str(), shortname) == 0)
+ || core_stricmp(look_for.c_str(), shortname) == 0;
+ });
+
+ return iter != info_list.end() ? &*iter : nullptr;
}
diff --git a/src/emu/softlist_dev.h b/src/emu/softlist_dev.h
index 50cd2e01753..4370ec8a20d 100644
--- a/src/emu/softlist_dev.h
+++ b/src/emu/softlist_dev.h
@@ -40,37 +40,6 @@ enum software_compatibility
//**************************************************************************
-// MACROS
-//**************************************************************************
-
-#define MCFG_SOFTWARE_LIST_CONFIG(_list,_list_type) \
- downcast<software_list_device &>(*device).set_type(_list, _list_type);
-
-#define MCFG_SOFTWARE_LIST_ADD( _tag, _list ) \
- MCFG_DEVICE_ADD( _tag, SOFTWARE_LIST ) \
- MCFG_SOFTWARE_LIST_CONFIG(_list, SOFTWARE_LIST_ORIGINAL_SYSTEM)
-
-#define MCFG_SOFTWARE_LIST_COMPATIBLE_ADD( _tag, _list ) \
- MCFG_DEVICE_ADD( _tag, SOFTWARE_LIST ) \
- MCFG_SOFTWARE_LIST_CONFIG(_list, SOFTWARE_LIST_COMPATIBLE_SYSTEM)
-
-#define MCFG_SOFTWARE_LIST_MODIFY( _tag, _list ) \
- MCFG_DEVICE_MODIFY( _tag ) \
- MCFG_SOFTWARE_LIST_CONFIG(_list, SOFTWARE_LIST_ORIGINAL_SYSTEM)
-
-#define MCFG_SOFTWARE_LIST_COMPATIBLE_MODIFY( _tag, _list ) \
- MCFG_DEVICE_MODIFY( _tag ) \
- MCFG_SOFTWARE_LIST_CONFIG(_list, SOFTWARE_LIST_COMPATIBLE_SYSTEM)
-
-#define MCFG_SOFTWARE_LIST_FILTER( _tag, _filter ) \
- MCFG_DEVICE_MODIFY( _tag ) \
- downcast<software_list_device &>(*device).set_filter(_filter);
-
-#define MCFG_SOFTWARE_LIST_REMOVE( _tag ) \
- MCFG_DEVICE_REMOVE( _tag )
-
-
-//**************************************************************************
// TYPE DEFINITIONS
//**************************************************************************
diff --git a/src/emu/tilemap.h b/src/emu/tilemap.h
index 7acd649e2e0..d0c929658ef 100644
--- a/src/emu/tilemap.h
+++ b/src/emu/tilemap.h
@@ -535,6 +535,7 @@ public:
void set_flip(u32 attributes) { if (m_attributes != attributes) { m_attributes = attributes; mappings_update(); } }
// dirtying
+ void mark_mapping_dirty() { mappings_update(); }
void mark_tile_dirty(tilemap_memory_index memindex);
void mark_all_dirty() { m_all_tiles_dirty = true; m_all_tiles_clean = false; }
diff --git a/src/emu/video.cpp b/src/emu/video.cpp
index 12fa4d05991..f967ef78935 100644
--- a/src/emu/video.cpp
+++ b/src/emu/video.cpp
@@ -846,12 +846,17 @@ bool video_manager::finish_screen_updates()
// finish updating the screens
screen_device_iterator iter(machine().root_device());
+ bool has_screen = false;
for (screen_device &screen : iter)
+ {
screen.update_partial(screen.visible_area().max_y);
+ has_screen = true;
+ }
- // now add the quads for all the screens
- bool anything_changed = m_output_changed;
+ bool anything_changed = !has_screen || m_output_changed;
m_output_changed = false;
+
+ // now add the quads for all the screens
for (screen_device &screen : iter)
if (screen.update_quads())
anything_changed = true;
@@ -1045,7 +1050,11 @@ osd_ticks_t video_manager::throttle_until_ticks(osd_ticks_t target_ticks)
while (current_ticks < target_ticks)
{
// compute how much time to sleep for, taking into account the average oversleep
- osd_ticks_t const delta = (target_ticks - current_ticks) * 1000 / (1000 + m_average_oversleep);
+ osd_ticks_t delta = target_ticks - current_ticks;
+ if (delta > m_average_oversleep / 1000)
+ delta -= m_average_oversleep / 1000;
+ else
+ delta = 0;
// see if we can sleep
bool const slept = allowed_to_sleep && delta;
@@ -1062,8 +1071,8 @@ osd_ticks_t video_manager::throttle_until_ticks(osd_ticks_t target_ticks)
osd_ticks_t const actual_ticks = new_ticks - current_ticks;
if (actual_ticks > delta)
{
- // take 90% of the previous average plus 10% of the new value
- osd_ticks_t const oversleep_milliticks = 1000 * (actual_ticks - delta) / delta;
+ // take 99% of the previous average plus 1% of the new value
+ osd_ticks_t const oversleep_milliticks = 1000 * (actual_ticks - delta);
m_average_oversleep = (m_average_oversleep * 99 + oversleep_milliticks) / 100;
if (LOG_THROTTLE)
diff --git a/src/emu/video/resnet.h b/src/emu/video/resnet.h
index e3f8ad78a68..acc62bece79 100644
--- a/src/emu/video/resnet.h
+++ b/src/emu/video/resnet.h
@@ -177,21 +177,12 @@ double compute_resistor_weights(
int count_2, const int * resistances_2, double * weights_2, int pulldown_2, int pullup_2,
int count_3, const int * resistances_3, double * weights_3, int pulldown_3, int pullup_3);
-template <typename T, std::size_t N, typename... U>
-constexpr int combine_weights(T const (&tab)[N], U... w)
+template <typename T = int, typename U, std::size_t N, typename... V>
+constexpr T combine_weights(U const (&tab)[N], V... w)
{
- return int(emu::detail::combine_weights<0U>(tab, w...) + 0.5);
+ return T(emu::detail::combine_weights<0U>(tab, w...) + 0.5);
}
-#define combine_8_weights(tab,w0,w1,w2,w3,w4,w5,w6,w7) (int(((tab)[0]*(w0) + (tab)[1]*(w1) + (tab)[2]*(w2) + (tab)[3]*(w3) + (tab)[4]*(w4) + (tab)[5]*(w5) + (tab)[6]*(w6) + (tab)[7]*(w7)) + 0.5))
-#define combine_7_weights(tab,w0,w1,w2,w3,w4,w5,w6) (int(((tab)[0]*(w0) + (tab)[1]*(w1) + (tab)[2]*(w2) + (tab)[3]*(w3) + (tab)[4]*(w4) + (tab)[5]*(w5) + (tab)[6]*(w6)) + 0.5))
-#define combine_6_weights(tab,w0,w1,w2,w3,w4,w5) (int(((tab)[0]*(w0) + (tab)[1]*(w1) + (tab)[2]*(w2) + (tab)[3]*(w3) + (tab)[4]*(w4) + (tab)[5]*(w5)) + 0.5))
-#define combine_5_weights(tab,w0,w1,w2,w3,w4) (int(((tab)[0]*(w0) + (tab)[1]*(w1) + (tab)[2]*(w2) + (tab)[3]*(w3) + (tab)[4]*(w4)) + 0.5))
-#define combine_4_weights(tab,w0,w1,w2,w3) (int(((tab)[0]*(w0) + (tab)[1]*(w1) + (tab)[2]*(w2) + (tab)[3]*(w3)) + 0.5))
-#define combine_3_weights(tab,w0,w1,w2) (int(((tab)[0]*(w0) + (tab)[1]*(w1) + (tab)[2]*(w2)) + 0.5))
-#define combine_2_weights(tab,w0,w1) (int(((tab)[0]*(w0) + (tab)[1]*(w1)) + 0.5))
-#define combine_1_weights(tab,w0) (int(((tab)[0]*(w0) + 0.5)))
-
/* this should be moved to one of the core files */
@@ -205,10 +196,10 @@ constexpr int combine_weights(T const (&tab)[N], U... w)
/* for the open collector outputs PROMs */
double compute_resistor_net_outputs(
- int minval, int maxval, double scaler,
- int count_1, const int * resistances_1, double * outputs_1, int pulldown_1, int pullup_1,
- int count_2, const int * resistances_2, double * outputs_2, int pulldown_2, int pullup_2,
- int count_3, const int * resistances_3, double * outputs_3, int pulldown_3, int pullup_3 );
+ int minval, int maxval, double scaler,
+ int count_1, const int * resistances_1, double * outputs_1, int pulldown_1, int pullup_1,
+ int count_2, const int * resistances_2, double * outputs_2, int pulldown_2, int pullup_2,
+ int count_3, const int * resistances_3, double * outputs_3, int pulldown_3, int pullup_3 );
diff --git a/src/emu/xtal.cpp b/src/emu/xtal.cpp
index 1083179e588..21eef19b720 100644
--- a/src/emu/xtal.cpp
+++ b/src/emu/xtal.cpp
@@ -91,6 +91,7 @@ const double XTAL::known_xtals[] = {
3'686'400, /* 3.6864_MHz_XTAL Baud rate clock for MC68681 and similar UARTs */
3'840'000, /* 3.84_MHz_XTAL Fairlight CMI Alphanumeric Keyboard */
3'900'000, /* 3.9_MHz_XTAL Resonator - Used on some Fidelity boards */
+ 3'932'160, /* 3.93216_MHz_XTAL Apple Lisa COP421 (197-0016A) */
4'000'000, /* 4_MHz_XTAL - */
4'028'000, /* 4.028_MHz_XTAL Sony SMC-777 */
4'032'000, /* 4.032_MHz_XTAL GRiD Compass modem board */
@@ -137,6 +138,7 @@ const double XTAL::known_xtals[] = {
8'867'238, /* 8.867238_MHz_XTAL ETI-660 (~2x PAL subcarrier) */
8'945'000, /* 8.945_MHz_XTAL Hit Me */
9'216'000, /* 9.216_MHz_XTAL Conitec PROF-180X */
+ 9'600'000, /* 9.6_MHz_XTAL WD37C65 second clock (for 300 KB/sec rate) */
9'828'000, /* 9.828_MHz_XTAL Universal PCBs */
9'830'400, /* 9.8304_MHz_XTAL Epson PX-8 */
9'832'000, /* 9.832_MHz_XTAL Robotron A7150 */
@@ -146,6 +148,7 @@ const double XTAL::known_xtals[] = {
10'137'600, /* 10.1376_MHz_XTAL Wyse WY-100 */
10'245'000, /* 10.245_MHz_XTAL PES Speech box */
10'380'000, /* 10.38_MHz_XTAL Fairlight Q219 Lightpen/Graphics Card */
+ 10'480'000, /* 10.48_MHz_XTAL System-80 (50 Hz) */
10'500'000, /* 10.5_MHz_XTAL Agat-7 */
10'595'000, /* 10.595_MHz_XTAL Mad Alien */
10'644'500, /* 10.6445_MHz_XTAL TRS-80 Model I */
@@ -199,6 +202,8 @@ const double XTAL::known_xtals[] = {
14'318'181, /* 14.318181_MHz_XTAL Extremely common, used on 100's of PCBs (4x NTSC subcarrier) */
14'580'000, /* 14.58_MHz_XTAL Fortune 32:16 Video Controller */
14'705'882, /* 14.705882_MHz_XTAL Aleck64 */
+ 14'728'000, /* 14.728_MHz_XTAL ADM 36 */
+ 14'742'800, /* 14.7428_MHz_XTAL ADM 23 */
14'745'600, /* 14.7456_MHz_XTAL Namco System 12 & System Super 22/23 for JVS */
14'784'000, /* 14.784_MHz_XTAL Zenith Z-29 */
14'916'000, /* 14.916_MHz_XTAL ADDS Viewpoint 122 */
@@ -212,6 +217,7 @@ const double XTAL::known_xtals[] = {
15'400'000, /* 15.4_MHz_XTAL DVK KSM */
15'468'480, /* 15.46848_MHz_XTAL Bank Panic h/w, Sega G80 */
15'582'000, /* 15.582_MHz_XTAL Zentec Zephyr */
+ 15'667'200, /* 15.6672_MHz_XTAL Apple Macintosh */
15'700'000, /* 15.700_MHz_XTAL Motogonki */
15'897'600, /* 15.8976_MHz_XTAL IAI Swyft */
15'920'000, /* 15.92_MHz_XTAL HP Integral PC */
@@ -219,6 +225,8 @@ const double XTAL::known_xtals[] = {
16'000'000, /* 16_MHz_XTAL Extremely common, used on 100's of PCBs */
16'097'280, /* 16.09728_MHz_XTAL DEC VT240 (1024 * 262 * 60) */
16'128'000, /* 16.128_MHz_XTAL Fujitsu FM-7 */
+ 16'257'000, /* 16.257_MHz_XTAL IBM PC MDA & EGA */
+ 16'364'000, /* 16.364_MHz_XTAL Corvus Concept */
16'384'000, /* 16.384_MHz_XTAL - */
16'400'000, /* 16.4_MHz_XTAL MS 6102 */
16'572'000, /* 16.572_MHz_XTAL Micro-Term ACT-5A */
@@ -237,12 +245,14 @@ const double XTAL::known_xtals[] = {
17'734'472, /* 17.734472_MHz_XTAL actually ~4x PAL subcarrier */
17'971'200, /* 17.9712_MHz_XTAL Compucolor II, Hazeltine Esprit III */
18'000'000, /* 18_MHz_XTAL S.A.R, Ikari Warriors 3 */
+ 18'414'000, /* 18.414_MHz_XTAL Ann Arbor Ambassador */
18'432'000, /* 18.432_MHz_XTAL Extremely common, used on 100's of PCBs (48000 * 384) */
18'480'000, /* 18.48_MHz_XTAL Wyse WY-100 video */
18'575'000, /* 18.575_MHz_XTAL Visual 102, Visual 220 */
18'720'000, /* 18.72_MHz_XTAL Nokia MikroMikko 1 */
18'869'600, /* 18.8696_MHz_XTAL Memorex 2178 */
19'339'600, /* 19.3396_MHz_XTAL TeleVideo TVI-955 80-column display clock */
+ 19'584'000, /* 19.584_MHz_XTAL ADM-42 */
19'600'000, /* 19.6_MHz_XTAL Universal Mr. Do - Model 8021 PCB */
19'602'000, /* 19.602_MHz_XTAL Ampex 210+ 80-column display clock */
19'660'800, /* 19.6608_MHz_XTAL Euro League (bootleg), labeled as "UKI 19.6608 20PF" */
@@ -252,6 +262,7 @@ const double XTAL::known_xtals[] = {
20'000'000, /* 20_MHz_XTAL - */
20'160'000, /* 20.16_MHz_XTAL Nintendo 8080 */
20'275'200, /* 20.2752_MHz_XTAL TRS-80 Model III */
+ 20'375'040, /* 20.37504_MHz_XTAL Apple Lisa dot clock (197-0019A) */
20'625'000, /* 20.625_MHz_XTAL SM 7238 */
20'790'000, /* 20.79_MHz_XTAL Blockade-hardware Gremlin games */
21'000'000, /* 21_MHz_XTAL Lock-On pixel clock */
@@ -273,10 +284,12 @@ const double XTAL::known_xtals[] = {
23'961'600, /* 23.9616_MHz_XTAL Osborne 4 (Vixen) */
24'000'000, /* 24_MHz_XTAL Mario, 80's Data East games, 80's Konami games */
24'073'400, /* 24.0734_MHz_XTAL DEC Rainbow 100 */
+ 24'300'000, /* 24.3_MHz_XTAL ADM 36 132-column display clock */
24'576'000, /* 24.576_MHz_XTAL Pole Position h/w, Model 3 CPU board */
24'883'200, /* 24.8832_MHz_XTAL DEC VT100 */
25'000'000, /* 25_MHz_XTAL Namco System 22, Taito GNET, Dogyuun h/w */
25'174'800, /* 25.1748_MHz_XTAL Sega System 16A/16B (1600x NTSC line rate) */
+ 25'175'000, /* 25.175_MHz_XTAL IBM MCGA/VGA 320/640-pixel graphics */
25'200'000, /* 25.2_MHz_XTAL Tektronix 4404 video clock */
25'398'360, /* 25.39836_MHz_XTAL Tandberg TDV 2324 */
25'400'000, /* 25.4_MHz_XTAL PC9801-86 PCM base clock */
@@ -335,6 +348,7 @@ const double XTAL::known_xtals[] = {
39'710'000, /* 39.71_MHz_XTAL Wyse WY-60 132-column display clock */
40'000'000, /* 40_MHz_XTAL - */
40'210'000, /* 40.21_MHz_XTAL Fairlight CMI IIx */
+ 41'539'000, /* 41.539_MHz_XTAL IBM PS/2 132-column text mode */
42'000'000, /* 42_MHz_XTAL BMC A-00211 - Popo Bear */
42'105'200, /* 42.1052_MHz_XTAL NEC PC-88xx */
42'954'545, /* 42.954545_MHz_XTAL CPS3 (12x NTSC subcarrier)*/
@@ -342,6 +356,7 @@ const double XTAL::known_xtals[] = {
44'100'000, /* 44.1_MHz_XTAL Subsino's Bishou Jan */
44'236'800, /* 44.2368_MHz_XTAL ReCo6502, Fortune 32:16 */
44'452'800, /* 44.4528_MHz_XTAL TeleVideo 965 */
+ 44'900'000, /* 44.9_MHz_XTAL IBM 8514 1024x768 43.5Hz graphics */
45'000'000, /* 45_MHz_XTAL Eolith with Hyperstone CPUs */
45'158'000, /* 45.158_MHz_XTAL Sega Model 2A video board, Model 3 CPU board */
45'619'200, /* 45.6192_MHz_XTAL DEC VK100 */
@@ -382,6 +397,8 @@ const double XTAL::known_xtals[] = {
77'414'400, /* 77.4144_MHz_XTAL NCD17c */
80'000'000, /* 80_MHz_XTAL ARM710 */
87'183'360, /* 87.18336_MHz_XTAL AT&T 630 MTG */
+ 92'940'500, /* 92.9405_MHz_XTAL Sun cgthree */
+ 99'522'000, /* 99.522_MHz_XTAL Radius Two Page Display */
100'000'000, /* 100_MHz_XTAL PSX-based Namco System 12, Vegas, Sony ZN1-2-based */
101'491'200, /* 101.4912_MHz_XTAL PSX-based Namco System 10 */
108'108'000, /* 108.108_MHz_XTAL HP 98550 high-res color card */
diff --git a/src/frontend/mame/clifront.cpp b/src/frontend/mame/clifront.cpp
index f2dbf4e1c55..28249e7bd3e 100644
--- a/src/frontend/mame/clifront.cpp
+++ b/src/frontend/mame/clifront.cpp
@@ -99,11 +99,11 @@ const options_entry cli_option_entries[] =
{ CLICOMMAND_LISTCLONES ";lc", "0", OPTION_COMMAND, "show clones" },
{ CLICOMMAND_LISTBROTHERS ";lb", "0", OPTION_COMMAND, "show \"brothers\", or other drivers from same sourcefile" },
{ CLICOMMAND_LISTCRC, "0", OPTION_COMMAND, "CRC-32s" },
- { CLICOMMAND_LISTROMS ";lr", "0", OPTION_COMMAND, "list required roms for a driver" },
+ { CLICOMMAND_LISTROMS ";lr", "0", OPTION_COMMAND, "list required ROMs for a driver" },
{ CLICOMMAND_LISTSAMPLES, "0", OPTION_COMMAND, "list optional samples for a driver" },
{ CLICOMMAND_VERIFYROMS, "0", OPTION_COMMAND, "report romsets that have problems" },
{ CLICOMMAND_VERIFYSAMPLES, "0", OPTION_COMMAND, "report samplesets that have problems" },
- { CLICOMMAND_ROMIDENT, "0", OPTION_COMMAND, "compare files with known MAME roms" },
+ { CLICOMMAND_ROMIDENT, "0", OPTION_COMMAND, "compare files with known MAME ROMs" },
{ CLICOMMAND_LISTDEVICES ";ld", "0", OPTION_COMMAND, "list available devices" },
{ CLICOMMAND_LISTSLOTS ";lslot", "0", OPTION_COMMAND, "list available slots and slot devices" },
{ CLICOMMAND_LISTMEDIA ";lm", "0", OPTION_COMMAND, "list available media for the system" },
@@ -183,9 +183,9 @@ void print_summary(
//-------------------------------------------------
cli_frontend::cli_frontend(emu_options &options, osd_interface &osd)
- : m_options(options),
- m_osd(osd),
- m_result(EMU_ERR_NONE)
+ : m_options(options)
+ , m_osd(osd)
+ , m_result(EMU_ERR_NONE)
{
m_options.add_entries(cli_option_entries);
}
@@ -211,6 +211,7 @@ void cli_frontend::start_execution(mame_machine_manager *manager, const std::vec
try
{
m_options.parse_command_line(args, OPTION_PRIORITY_CMDLINE);
+ m_osd.set_verbose(m_options.verbose());
}
catch (options_exception &ex)
{
@@ -234,7 +235,10 @@ void cli_frontend::start_execution(mame_machine_manager *manager, const std::vec
// read INI's, if appropriate
if (m_options.read_config())
+ {
mame_options::parse_standard_inis(m_options, option_errors);
+ m_osd.set_verbose(m_options.verbose());
+ }
// otherwise, check for a valid system
load_translation(m_options);
@@ -291,14 +295,25 @@ int cli_frontend::execute(std::vector<std::string> &args)
// get the top 16 approximate matches
driver_enumerator drivlist(m_options);
int matches[16];
- drivlist.find_approximate_matches(m_options.attempted_system_name().c_str(), ARRAY_LENGTH(matches), matches);
+ drivlist.find_approximate_matches(m_options.attempted_system_name(), ARRAY_LENGTH(matches), matches);
+
+ // work out how wide the titles need to be
+ int titlelen(0);
+ for (int match : matches)
+ if (0 <= match)
+ titlelen = (std::max)(titlelen, int(strlen(drivlist.driver(match).type.fullname())));
// print them out
osd_printf_error("\n\"%s\" approximately matches the following\n"
"supported machines (best match first):\n\n", m_options.attempted_system_name().c_str());
- for (auto & matche : matches)
- if (matche != -1)
- osd_printf_error("%-18s%s\n", drivlist.driver(matche).name, drivlist.driver(matche).type.fullname());
+ for (int match : matches)
+ {
+ if (0 <= match)
+ {
+ game_driver const &drv(drivlist.driver(match));
+ osd_printf_error("%s", util::string_format("%-18s%-*s(%s, %s)\n", drv.name, titlelen + 2, drv.type.fullname(), drv.manufacturer, drv.year).c_str());
+ }
+ }
}
}
catch (emu_exception &)
@@ -349,77 +364,20 @@ void cli_frontend::listxml(const std::vector<std::string> &args)
void cli_frontend::listfull(const std::vector<std::string> &args)
{
- bool const iswild((1U != args.size()) || core_iswildstr(args[0].c_str()));
- std::vector<bool> matched(args.size(), false);
- auto const included = [&args, &matched] (char const *name) -> bool
- {
- if (args.empty())
- return true;
-
- bool result = false;
- auto it = matched.begin();
- for (std::string const &pat : args)
- {
- if (!core_strwildcmp(pat.c_str(), name))
- {
- result = true;
- *it = true;
- }
- ++it;
- }
- return result;
- };
-
- bool first = true;
- auto const list_system_name = [&first] (device_type const &type)
+ auto const list_system_name = [] (device_type type, bool first)
{
// print the header
if (first)
osd_printf_info("Name: Description:\n");
- first = false;
osd_printf_info("%-17s \"%s\"\n", type.shortname(), type.fullname());
};
-
- // determine which drivers to output
- driver_enumerator drivlist(m_options);
- while (drivlist.next())
- {
- if (included(drivlist.driver().name))
- {
- list_system_name(drivlist.driver().type);
-
- // if it wasn't a wildcard, there can only be one
- if (!iswild)
- break;
- }
- }
-
- // try devices as well
- if (iswild || first)
- {
- for (device_type type : registered_device_types)
- {
- if (included(type.shortname()))
- {
- list_system_name(type);
-
- // if it wasn't a wildcard, there can only be one
- if (!iswild)
- break;
- }
- }
- }
-
- // return an error if none found
- auto it = matched.begin();
- for (std::string const &pat : args)
- {
- if (!*it)
- throw emu_fatalerror(EMU_ERR_NO_SUCH_GAME, "No matching systems found for '%s'", pat.c_str());
-
- ++it;
- }
+ apply_action(
+ args,
+ [&list_system_name] (driver_enumerator &drivlist, bool first)
+ { list_system_name(drivlist.driver().type, first); },
+ [&list_system_name] (device_type type, bool first)
+ { list_system_name(type, first); });
}
@@ -430,16 +388,16 @@ void cli_frontend::listfull(const std::vector<std::string> &args)
void cli_frontend::listsource(const std::vector<std::string> &args)
{
- const char *gamename = args.empty() ? nullptr : args[0].c_str();
-
- // determine which drivers to output; return an error if none found
- driver_enumerator drivlist(m_options, gamename);
- if (drivlist.count() == 0)
- throw emu_fatalerror(EMU_ERR_NO_SUCH_GAME, "No matching systems found for '%s'", gamename);
-
- // iterate through drivers and output the info
- while (drivlist.next())
- osd_printf_info("%-16s %s\n", drivlist.driver().name, core_filename_extract_base(drivlist.driver().type.source()).c_str());
+ auto const list_system_source = [] (device_type type)
+ {
+ osd_printf_info("%-16s %s\n", type.shortname(), core_filename_extract_base(type.source()).c_str());
+ };
+ apply_action(
+ args,
+ [&list_system_source] (driver_enumerator &drivlist, bool first)
+ { list_system_source(drivlist.driver().type); },
+ [&list_system_source] (device_type type, bool first)
+ { list_system_source(type); });
}
@@ -547,164 +505,92 @@ void cli_frontend::listbrothers(const std::vector<std::string> &args)
void cli_frontend::listcrc(const std::vector<std::string> &args)
{
- const char *gamename = args.empty() ? nullptr : args[0].c_str();
-
- // determine which drivers to output; return an error if none found
- driver_enumerator drivlist(m_options, gamename);
- if (drivlist.count() == 0)
- throw emu_fatalerror(EMU_ERR_NO_SUCH_GAME, "No matching systems found for '%s'", gamename);
-
- // iterate through matches, and then through ROMs
- while (drivlist.next())
- {
- for (device_t const &device : device_iterator(drivlist.config()->root_device()))
- {
- for (tiny_rom_entry const *rom = device.rom_region(); rom && !ROMENTRY_ISEND(rom); ++rom)
+ apply_device_action(
+ args,
+ [] (device_t &root, char const *type, bool first)
{
- if (ROMENTRY_ISFILE(rom))
+ for (device_t const &device : device_iterator(root))
{
- // if we have a CRC, display it
- uint32_t crc;
- if (util::hash_collection(rom->hashdata).crc(crc))
- osd_printf_info("%08x %-32s\t%-16s\t%s\n", crc, rom->name, device.shortname(), device.name());
+ for (tiny_rom_entry const *rom = device.rom_region(); rom && !ROMENTRY_ISEND(rom); ++rom)
+ {
+ if (ROMENTRY_ISFILE(rom))
+ {
+ // if we have a CRC, display it
+ uint32_t crc;
+ if (util::hash_collection(rom->hashdata).crc(crc))
+ osd_printf_info("%08x %-32s\t%-16s\t%s\n", crc, rom->name, device.shortname(), device.name());
+ }
+ }
}
- }
- }
- }
+ });
}
//-------------------------------------------------
// listroms - output the list of ROMs referenced
-// by a given game or set of games
+// by matching systems/devices
//-------------------------------------------------
void cli_frontend::listroms(const std::vector<std::string> &args)
{
- bool const iswild((1U != args.size()) || core_iswildstr(args[0].c_str()));
- std::vector<bool> matched(args.size(), false);
- auto const included = [&args, &matched] (char const *name) -> bool
- {
- if (args.empty())
- return true;
-
- bool result = false;
- auto it = matched.begin();
- for (std::string const &pat : args)
- {
- if (!core_strwildcmp(pat.c_str(), name))
+ apply_device_action(
+ args,
+ [] (device_t &root, char const *type, bool first)
{
- result = true;
- *it = true;
- }
- ++it;
- }
- return result;
- };
-
- bool first = true;
- auto const list_system_roms = [&first] (device_t &root, char const *type)
- {
- // print a header
- if (!first)
- osd_printf_info("\n");
- first = false;
+ // space between items
+ if (!first)
+ osd_printf_info("\n");
- // iterate through roms
- bool hasroms = false;
- for (device_t const &device : device_iterator(root))
- {
- for (const rom_entry *region = rom_first_region(device); region; region = rom_next_region(region))
- {
- for (const rom_entry *rom = rom_first_file(region); rom; rom = rom_next_file(rom))
+ // iterate through ROMs
+ bool hasroms = false;
+ for (device_t const &device : device_iterator(root))
{
- // print a header
- if (!hasroms)
- osd_printf_info(
- "ROMs required for %s \"%s\".\n"
- "%-32s %10s %s\n",
- type, root.shortname(), "Name", "Size", "Checksum");
- hasroms = true;
-
- // accumulate the total length of all chunks
- int64_t length = -1;
- if (ROMREGION_ISROMDATA(region))
- length = rom_file_size(rom);
-
- // start with the name
- const char *name = ROM_GETNAME(rom);
- osd_printf_info("%-32s ", name);
-
- // output the length next
- if (length >= 0)
- osd_printf_info("%10u", unsigned(uint64_t(length)));
- else
- osd_printf_info("%10s", "");
-
- // output the hash data
- util::hash_collection hashes(ROM_GETHASHDATA(rom));
- if (!hashes.flag(util::hash_collection::FLAG_NO_DUMP))
+ for (const rom_entry *region = rom_first_region(device); region; region = rom_next_region(region))
{
- if (hashes.flag(util::hash_collection::FLAG_BAD_DUMP))
- osd_printf_info(" BAD");
- osd_printf_info(" %s", hashes.macro_string().c_str());
- }
- else
- osd_printf_info(" NO GOOD DUMP KNOWN");
+ for (const rom_entry *rom = rom_first_file(region); rom; rom = rom_next_file(rom))
+ {
+ // print a header
+ if (!hasroms)
+ osd_printf_info(
+ "ROMs required for %s \"%s\".\n"
+ "%-32s %10s %s\n",
+ type, root.shortname(), "Name", "Size", "Checksum");
+ hasroms = true;
+
+ // accumulate the total length of all chunks
+ int64_t length = -1;
+ if (ROMREGION_ISROMDATA(region))
+ length = rom_file_size(rom);
+
+ // start with the name
+ const char *name = ROM_GETNAME(rom);
+ osd_printf_info("%-32s ", name);
+
+ // output the length next
+ if (length >= 0)
+ osd_printf_info("%10u", unsigned(uint64_t(length)));
+ else
+ osd_printf_info("%10s", "");
+
+ // output the hash data
+ util::hash_collection hashes(ROM_GETHASHDATA(rom));
+ if (!hashes.flag(util::hash_collection::FLAG_NO_DUMP))
+ {
+ if (hashes.flag(util::hash_collection::FLAG_BAD_DUMP))
+ osd_printf_info(" BAD");
+ osd_printf_info(" %s", hashes.macro_string().c_str());
+ }
+ else
+ osd_printf_info(" NO GOOD DUMP KNOWN");
- // end with a CR
- osd_printf_info("\n");
+ // end with a CR
+ osd_printf_info("\n");
+ }
+ }
}
- }
- }
- if (!hasroms)
- osd_printf_info("No ROMs required for %s \"%s\".\n", type, root.shortname());
- };
-
- // determine which drivers to output
- driver_enumerator drivlist(m_options);
-
- // iterate through matches
- while (drivlist.next())
- {
- if (included(drivlist.driver().name))
- {
- list_system_roms(drivlist.config()->root_device(), "driver");
-
- // if it wasn't a wildcard, there can only be one
- if (!iswild)
- break;
- }
- }
-
- if (iswild || first)
- {
- machine_config config(GAME_NAME(___empty), m_options);
- machine_config::token const tok(config.begin_configuration(config.root_device()));
- for (device_type type : registered_device_types)
- {
- if (included(type.shortname()))
- {
- device_t *const dev = config.device_add("_tmp", type, 0);
- list_system_roms(*dev, "device");
- config.device_remove("_tmp");
-
- // if it wasn't a wildcard, there can only be one
- if (!iswild)
- break;
- }
- }
- }
-
- // return an error if none found
- auto it = matched.begin();
- for (std::string const &pat : args)
- {
- if (!*it)
- throw emu_fatalerror(EMU_ERR_NO_SUCH_GAME, "No matching systems found for '%s'", pat.c_str());
-
- ++it;
- }
+ if (!hasroms)
+ osd_printf_info("No ROMs required for %s \"%s\".\n", type, root.shortname());
+ });
}
@@ -1223,7 +1109,7 @@ void cli_frontend::output_single_softlist(FILE *out, software_list_device &swlis
for (const feature_list_item &flist : part.featurelist())
fprintf(out, "\t\t\t\t<feature name=\"%s\" value=\"%s\" />\n", flist.name().c_str(), util::xml::normalize_string(flist.value().c_str()));
- /* TODO: display rom region information */
+ // TODO: display ROM region information
for (const rom_entry *region = part.romdata().data(); region; region = rom_next_region(region))
{
int is_disk = ROMREGION_ISDISKDATA(region);
@@ -1354,7 +1240,7 @@ void cli_frontend::listsoftware(const std::vector<std::string> &args)
/*-------------------------------------------------
- verifysoftware - verify roms from the software
+ verifysoftware - verify ROMs from the software
list of the specified driver(s)
-------------------------------------------------*/
void cli_frontend::verifysoftware(const std::vector<std::string> &args)
@@ -1427,6 +1313,7 @@ void cli_frontend::verifysoftware(const std::vector<std::string> &args)
}
+
/*-------------------------------------------------
getsoftlist - retrieve software list by name
-------------------------------------------------*/
@@ -1561,6 +1448,105 @@ void cli_frontend::romident(const std::vector<std::string> &args)
//-------------------------------------------------
+// apply_action - apply action to matching
+// systems/devices
+//-------------------------------------------------
+
+template <typename T, typename U> void cli_frontend::apply_action(const std::vector<std::string> &args, T &&drvact, U &&devact)
+
+{
+ bool const iswild((1U != args.size()) || core_iswildstr(args[0].c_str()));
+ std::vector<bool> matched(args.size(), false);
+ auto const included = [&args, &matched] (char const *name) -> bool
+ {
+ if (args.empty())
+ return true;
+
+ bool result = false;
+ auto it = matched.begin();
+ for (std::string const &pat : args)
+ {
+ if (!core_strwildcmp(pat.c_str(), name))
+ {
+ result = true;
+ *it = true;
+ }
+ ++it;
+ }
+ return result;
+ };
+
+ // determine which drivers to output
+ driver_enumerator drivlist(m_options);
+
+ // iterate through matches
+ bool first(true);
+ while (drivlist.next())
+ {
+ if (included(drivlist.driver().name))
+ {
+ drvact(drivlist, first);
+ first = false;
+
+ // if it wasn't a wildcard, there can only be one
+ if (!iswild)
+ break;
+ }
+ }
+
+ if (iswild || first)
+ {
+ for (device_type type : registered_device_types)
+ {
+ if (included(type.shortname()))
+ {
+ devact(type, first);
+ first = false;
+
+ // if it wasn't a wildcard, there can only be one
+ if (!iswild)
+ break;
+ }
+ }
+ }
+
+ // return an error if none found
+ auto it = matched.begin();
+ for (std::string const &pat : args)
+ {
+ if (!*it)
+ throw emu_fatalerror(EMU_ERR_NO_SUCH_GAME, "No matching systems found for '%s'", pat.c_str());
+
+ ++it;
+ }
+}
+
+
+//-------------------------------------------------
+// apply_device_action - apply action to matching
+// systems/devices
+//-------------------------------------------------
+
+template <typename T> void cli_frontend::apply_device_action(const std::vector<std::string> &args, T &&action)
+{
+ machine_config config(GAME_NAME(___empty), m_options);
+ machine_config::token const tok(config.begin_configuration(config.root_device()));
+ apply_action(
+ args,
+ [&action] (driver_enumerator &drivlist, bool first)
+ {
+ action(drivlist.config()->root_device(), "driver", first);
+ },
+ [&action, &config] (device_type type, bool first)
+ {
+ device_t *const dev = config.device_add("_tmp", type, 0);
+ action(*dev, "device", first);
+ config.device_remove("_tmp");
+ });
+}
+
+
+//-------------------------------------------------
// find_command
//-------------------------------------------------
@@ -1570,10 +1556,10 @@ const cli_frontend::info_command_struct *cli_frontend::find_command(const std::s
{
{ CLICOMMAND_LISTXML, 0, -1, &cli_frontend::listxml, "[pattern] ..." },
{ CLICOMMAND_LISTFULL, 0, -1, &cli_frontend::listfull, "[pattern] ..." },
- { CLICOMMAND_LISTSOURCE, 0, 1, &cli_frontend::listsource, "[system name]" },
+ { CLICOMMAND_LISTSOURCE, 0, -1, &cli_frontend::listsource, "[system name]" },
{ CLICOMMAND_LISTCLONES, 0, 1, &cli_frontend::listclones, "[system name]" },
{ CLICOMMAND_LISTBROTHERS, 0, 1, &cli_frontend::listbrothers, "[system name]" },
- { CLICOMMAND_LISTCRC, 0, 1, &cli_frontend::listcrc, "[system name]" },
+ { CLICOMMAND_LISTCRC, 0, -1, &cli_frontend::listcrc, "[system name]" },
{ CLICOMMAND_LISTDEVICES, 0, 1, &cli_frontend::listdevices, "[system name]" },
{ CLICOMMAND_LISTSLOTS, 0, 1, &cli_frontend::listslots, "[system name]" },
{ CLICOMMAND_LISTROMS, 0, -1, &cli_frontend::listroms, "[pattern] ..." },
@@ -1622,6 +1608,11 @@ void cli_frontend::execute_commands(const char *exename)
// validate?
if (m_options.command() == CLICOMMAND_VALIDATE)
{
+ if (m_options.command_arguments().size() > 1)
+ {
+ osd_printf_error("Auxiliary verb -validate takes at most 1 argument\n");
+ return;
+ }
validity_checker valid(m_options);
valid.set_validate_all(true);
const char *sysname = m_options.command_arguments().empty() ? nullptr : m_options.command_arguments()[0].c_str();
@@ -1689,9 +1680,9 @@ void cli_frontend::execute_commands(const char *exename)
// validate argument count
const char *error_message = nullptr;
if (m_options.command_arguments().size() < info_command->min_args)
- error_message = "Auxillary verb -%s requires at least %d argument(s)\n";
+ error_message = "Auxiliary verb -%s requires at least %d argument(s)\n";
if ((info_command->max_args >= 0) && (m_options.command_arguments().size() > info_command->max_args))
- error_message = "Auxillary verb -%s takes at most %d argument(s)\n";
+ error_message = "Auxiliary verb -%s takes at most %d argument(s)\n";
if (error_message)
{
osd_printf_info(error_message, info_command->option, info_command->max_args);
@@ -1700,7 +1691,7 @@ void cli_frontend::execute_commands(const char *exename)
return;
}
- // invoke the auxillary command!
+ // invoke the auxiliary command!
(this->*info_command->function)(m_options.command_arguments());
return;
}
diff --git a/src/frontend/mame/clifront.h b/src/frontend/mame/clifront.h
index 15da370ee1f..e05467bc627 100644
--- a/src/frontend/mame/clifront.h
+++ b/src/frontend/mame/clifront.h
@@ -67,6 +67,8 @@ private:
void verifysoftlist(const std::vector<std::string> &args);
// internal helpers
+ template <typename T, typename U> void apply_action(const std::vector<std::string> &args, T &&drvact, U &&devact);
+ template <typename T> void apply_device_action(const std::vector<std::string> &args, T &&action);
void execute_commands(const char *exename);
void display_help(const char *exename);
void output_single_softlist(FILE *out, software_list_device &swlist);
diff --git a/src/frontend/mame/info.cpp b/src/frontend/mame/info.cpp
index 6110c5c5fa9..1fe65d7ea3c 100644
--- a/src/frontend/mame/info.cpp
+++ b/src/frontend/mame/info.cpp
@@ -168,7 +168,7 @@ const char info_xml_creator::s_dtd_string[] =
"\t\t\t<!ATTLIST driver cocktail (good|imperfect|preliminary) #IMPLIED>\n"
"\t\t\t<!ATTLIST driver savestate (supported|unsupported) #REQUIRED>\n"
"\t\t<!ELEMENT feature EMPTY>\n"
-"\t\t\t<!ATTLIST feature type (protection|palette|graphics|sound|controls|keyboard|mouse|microphone|camera|disk|printer|lan|wan|timing) #REQUIRED>\n"
+"\t\t\t<!ATTLIST feature type (protection|timing|graphics|palette|sound|capture|camera|microphone|controls|keyboard|mouse|media|disk|printer|tape|punch|drum|rom|comms|lan|wan) #REQUIRED>\n"
"\t\t\t<!ATTLIST feature status (unemulated|imperfect) #IMPLIED>\n"
"\t\t\t<!ATTLIST feature overall (unemulated|imperfect) #IMPLIED>\n"
"\t\t<!ELEMENT device (instance?, extension*)>\n"
@@ -1639,19 +1639,26 @@ void info_xml_creator::output_features(device_type type, device_t::feature_type
{
static constexpr std::pair<device_t::feature_type, char const *> features[] = {
{ device_t::feature::PROTECTION, "protection" },
- { device_t::feature::PALETTE, "palette" },
+ { device_t::feature::TIMING, "timing" },
{ device_t::feature::GRAPHICS, "graphics" },
+ { device_t::feature::PALETTE, "palette" },
{ device_t::feature::SOUND, "sound" },
+ { device_t::feature::CAPTURE, "capture" },
+ { device_t::feature::CAMERA, "camera" },
+ { device_t::feature::MICROPHONE, "microphone" },
{ device_t::feature::CONTROLS, "controls" },
{ device_t::feature::KEYBOARD, "keyboard" },
{ device_t::feature::MOUSE, "mouse" },
- { device_t::feature::MICROPHONE, "microphone" },
- { device_t::feature::CAMERA, "camera" },
+ { device_t::feature::MEDIA, "media" },
{ device_t::feature::DISK, "disk" },
{ device_t::feature::PRINTER, "printer" },
+ { device_t::feature::TAPE, "tape" },
+ { device_t::feature::PUNCH, "punch" },
+ { device_t::feature::DRUM, "drum" },
+ { device_t::feature::ROM, "rom" },
+ { device_t::feature::COMMS, "comms" },
{ device_t::feature::LAN, "lan" },
- { device_t::feature::WAN, "wan" },
- { device_t::feature::TIMING, "timing" } };
+ { device_t::feature::WAN, "wan" } };
device_t::feature_type const flags(type.unemulated_features() | type.imperfect_features() | unemulated | imperfect);
for (auto const &feature : features)
diff --git a/src/frontend/mame/language.cpp b/src/frontend/mame/language.cpp
index 93d8e410c4a..016a32f1811 100644
--- a/src/frontend/mame/language.cpp
+++ b/src/frontend/mame/language.cpp
@@ -72,7 +72,7 @@ void load_translation(emu_options &m_options)
{
std::string original = (const char *)data + buffer[original_table_offset + 2 * i + 1];
std::string translation = (const char *)data + buffer[translation_table_offset + 2 * i + 1];
- g_translation.insert(std::pair<std::string, std::string>(original, translation));
+ g_translation.emplace(std::move(original), std::move(translation));
}
global_free_array(buffer);
}
diff --git a/src/frontend/mame/mame.cpp b/src/frontend/mame/mame.cpp
index 528a1717a4a..f3c08f661e9 100644
--- a/src/frontend/mame/mame.cpp
+++ b/src/frontend/mame/mame.cpp
@@ -31,12 +31,11 @@
mame_machine_manager* mame_machine_manager::m_manager = nullptr;
-mame_machine_manager* mame_machine_manager::instance(emu_options &options,osd_interface &osd)
+mame_machine_manager* mame_machine_manager::instance(emu_options &options, osd_interface &osd)
{
- if(!m_manager)
- {
- m_manager = global_alloc(mame_machine_manager(options,osd));
- }
+ if (!m_manager)
+ m_manager = global_alloc(mame_machine_manager(options, osd));
+
return m_manager;
}
@@ -49,13 +48,13 @@ mame_machine_manager* mame_machine_manager::instance()
// mame_machine_manager - constructor
//-------------------------------------------------
-mame_machine_manager::mame_machine_manager(emu_options &options,osd_interface &osd)
- : machine_manager(options, osd),
- m_plugins(std::make_unique<plugin_options>()),
- m_lua(global_alloc(lua_engine)),
- m_new_driver_pending(nullptr),
- m_firstrun(true),
- m_autoboot_timer(nullptr)
+mame_machine_manager::mame_machine_manager(emu_options &options,osd_interface &osd) :
+ machine_manager(options, osd),
+ m_plugins(std::make_unique<plugin_options>()),
+ m_lua(global_alloc(lua_engine)),
+ m_new_driver_pending(nullptr),
+ m_firstrun(true),
+ m_autoboot_timer(nullptr)
{
}
@@ -100,7 +99,8 @@ std::vector<std::string> split(const std::string &text, char sep)
{
std::vector<std::string> tokens;
std::size_t start = 0, end = 0;
- while ((end = text.find(sep, start)) != std::string::npos) {
+ while ((end = text.find(sep, start)) != std::string::npos)
+ {
std::string temp = text.substr(start, end - start);
if (temp != "") tokens.push_back(temp);
start = end + 1;
@@ -120,8 +120,8 @@ void mame_machine_manager::start_luaengine()
{
m_plugins->parse_json(pluginpath);
}
- std::vector<std::string> include = split(options().plugin(),',');
- std::vector<std::string> exclude = split(options().no_plugin(),',');
+ std::vector<std::string> include = split(options().plugin(), ',');
+ std::vector<std::string> exclude = split(options().no_plugin(), ',');
{
// parse the file
// attempt to open the output file
@@ -304,13 +304,13 @@ void mame_machine_manager::ui_initialize(running_machine& machine)
void mame_machine_manager::create_custom(running_machine& machine)
{
// start the inifile manager
- m_inifile = std::make_unique<inifile_manager>(machine, m_ui->options());
+ m_inifile = std::make_unique<inifile_manager>(m_ui->options());
// allocate autoboot timer
m_autoboot_timer = machine.scheduler().timer_alloc(timer_expired_delegate(FUNC(mame_machine_manager::autoboot_callback), this));
// start favorite manager
- m_favorite = std::make_unique<favorite_manager>(machine, m_ui->options());
+ m_favorite = std::make_unique<favorite_manager>(m_ui->options());
}
void mame_machine_manager::load_cheatfiles(running_machine& machine)
diff --git a/src/frontend/mame/mame.h b/src/frontend/mame/mame.h
index 3700aaab81b..01a7235972b 100644
--- a/src/frontend/mame/mame.h
+++ b/src/frontend/mame/mame.h
@@ -15,26 +15,20 @@
class plugin_options;
class osd_interface;
-//**************************************************************************
-// TYPE DEFINITIONS
-//**************************************************************************
class lua_engine;
class cheat_manager;
class inifile_manager;
class favorite_manager;
class mame_ui_manager;
-namespace ui {
-} // namespace ui
+//**************************************************************************
+// TYPE DEFINITIONS
+//**************************************************************************
// ======================> machine_manager
class mame_machine_manager : public machine_manager
{
- DISABLE_COPYING(mame_machine_manager);
-private:
- // construction/destruction
- mame_machine_manager(emu_options &options, osd_interface &osd);
public:
static mame_machine_manager *instance(emu_options &options, osd_interface &osd);
static mame_machine_manager *instance();
@@ -64,7 +58,15 @@ public:
cheat_manager &cheat() const { assert(m_cheat != nullptr); return *m_cheat; }
inifile_manager &inifile() const { assert(m_inifile != nullptr); return *m_inifile; }
favorite_manager &favorite() const { assert(m_favorite != nullptr); return *m_favorite; }
+
private:
+ // construction
+ mame_machine_manager(emu_options &options, osd_interface &osd);
+ mame_machine_manager(mame_machine_manager const &) = delete;
+ mame_machine_manager(mame_machine_manager &&) = delete;
+ mame_machine_manager &operator=(mame_machine_manager const &) = delete;
+ mame_machine_manager &operator=(mame_machine_manager &&) = delete;
+
std::unique_ptr<plugin_options> m_plugins; // pointer to plugin options
lua_engine * m_lua;
diff --git a/src/frontend/mame/mameopts.cpp b/src/frontend/mame/mameopts.cpp
index d6c1e1044cf..47f1a71c595 100644
--- a/src/frontend/mame/mameopts.cpp
+++ b/src/frontend/mame/mameopts.cpp
@@ -39,8 +39,8 @@ void mame_options::parse_standard_inis(emu_options &options, std::ostream &error
parse_one_ini(options, "debug", OPTION_PRIORITY_DEBUG_INI, &error_stream);
// if we have a valid system driver, parse system-specific INI files
- const game_driver *cursystem = (driver == nullptr) ? system(options) : driver;
- if (cursystem == nullptr)
+ game_driver const *const cursystem = !driver ? system(options) : driver;
+ if (!cursystem)
return;
// parse "vertical.ini" or "horizont.ini"
diff --git a/src/frontend/mame/ui/auditmenu.cpp b/src/frontend/mame/ui/auditmenu.cpp
index 0349e1c2949..7d5cbfd7305 100644
--- a/src/frontend/mame/ui/auditmenu.cpp
+++ b/src/frontend/mame/ui/auditmenu.cpp
@@ -207,24 +207,21 @@ void menu_audit::audit_fast()
void menu_audit::audit_all()
{
- m_availablesorted.clear();
driver_enumerator enumerator(machine().options());
media_auditor auditor(enumerator);
+ std::vector<bool> available(driver_list::total(), false);
while (enumerator.next())
{
m_current.store(&enumerator.driver());
media_auditor::summary const summary(auditor.audit_media(AUDIT_VALIDATE_FAST));
// if everything looks good, include the driver
- m_availablesorted.emplace_back(enumerator.driver(), (summary == media_auditor::CORRECT) || (summary == media_auditor::BEST_AVAILABLE) || (summary == media_auditor::NONE_NEEDED));
+ available[enumerator.current()] = (summary == media_auditor::CORRECT) || (summary == media_auditor::BEST_AVAILABLE) || (summary == media_auditor::NONE_NEEDED);
++m_audited;
}
- // sort
- std::stable_sort(
- m_availablesorted.begin(),
- m_availablesorted.end(),
- [] (ui_system_info const &a, ui_system_info const &b) { return sorted_game_list(a.driver, b.driver); });
+ for (ui_system_info &info : m_availablesorted)
+ info.available = available[info.index];
}
void menu_audit::save_available_machines()
diff --git a/src/frontend/mame/ui/icorender.cpp b/src/frontend/mame/ui/icorender.cpp
new file mode 100644
index 00000000000..bea85f9dd60
--- /dev/null
+++ b/src/frontend/mame/ui/icorender.cpp
@@ -0,0 +1,781 @@
+// license:BSD-3-Clause
+// copyright-holders:Maurizio Petrarota, Victor Laskin
+/***************************************************************************
+
+ ui/icorender.h
+
+ Windows icon file parser.
+
+ Previously based on code by Victor Laskin (victor.laskin@gmail.com)
+ http://vitiy.info/Code/ico.cpp
+
+ TODO:
+ * Add variant that loads all images from the file
+ * Allow size hint for choosing best candidate
+ * Allow selecting amongst candidates based on colour depth
+
+***************************************************************************/
+
+#include "emu.h"
+#include "icorender.h"
+
+#include "util/png.h"
+
+#include <algorithm>
+#include <cassert>
+#include <cstdint>
+#include <cstring>
+
+// need to set LOG_OUTPUT_STREAM because there's no logerror outside devices
+#define LOG_OUTPUT_STREAM std::cerr
+
+#define LOG_GENERAL (1U << 0)
+#define LOG_DIB (1U << 1)
+
+//#define VERBOSE (LOG_GENERAL | LOG_DIB)
+
+#include "logmacro.h"
+
+
+namespace ui {
+
+namespace {
+
+// DIB compression schemes
+enum : uint32_t
+{
+ DIB_COMP_NONE = 0,
+ DIB_COMP_RLE8 = 1,
+ DIB_COMP_RLE4 = 2,
+ DIB_COMP_BITFIELDS = 3
+};
+
+
+// ICO file header
+struct icon_dir_t
+{
+ uint16_t reserved; // must be 0
+ uint16_t type; // 1 for icon or 2 for cursor
+ uint16_t count; // number of images in the file
+};
+
+// ICO file directory entry
+struct icon_dir_entry_t
+{
+ constexpr unsigned get_width() const { return width ? width : 256U; }
+ constexpr unsigned get_height() const { return height ? height : 256U; }
+
+ void byteswap()
+ {
+ planes = little_endianize_int16(planes);
+ bpp = little_endianize_int16(bpp);
+ size = little_endianize_int32(size);
+ offset = little_endianize_int32(offset);
+ }
+
+ uint8_t width; // 0 means 256
+ uint8_t height; // 0 means 256
+ uint8_t colors; // for indexed colour, or 0 for direct colour
+ uint8_t reserved; // documentation says this should be 0 but .NET writes 255
+ uint16_t planes; // or hotspot X for cursor
+ uint16_t bpp; // 0 to infer from image data, or hotspot Y for cursor
+ uint32_t size; // image data size in bytes
+ uint32_t offset; // offset to image data from start of file
+};
+
+// old-style DIB header
+struct bitmap_core_header_t
+{
+ uint32_t size; // size of the header (12, 16 or 64)
+ int16_t width; // width of bitmap in pixels
+ int16_t height; // height of the image in pixels
+ uint16_t planes; // number of colour planes (must be 1)
+ uint16_t bpp; // bits per pixel
+};
+
+// new-style DIB header
+struct bitmap_info_header_t
+{
+ uint32_t size; // size of the header
+ int32_t width; // width of bitmap in pixels
+ int32_t height; // height of bitmap in pixels
+ uint16_t planes; // number of colour planes (must be 1)
+ uint16_t bpp; // bits per pixel
+ uint32_t comp; // compression method
+ uint32_t rawsize; // size of bitmap data after decompression or 0 if uncompressed
+ int32_t hres; // horizontal resolution in pixels/metre
+ int32_t vres; // horizontal resolution in pixels/metre
+ uint32_t colors; // number of colours or 0 for 1 << bpp
+ uint32_t important; // number of important colours or 0 if all important
+ uint32_t red; // red field mask - must be contiguous
+ uint32_t green; // green field mask - must be contiguous
+ uint32_t blue; // blue field mask - must be contiguous
+ uint32_t alpha; // alpha field mask - must be contiguous
+};
+
+
+bool dib_parse_mask(uint32_t mask, unsigned &shift, unsigned &bits)
+{
+ shift = count_leading_zeros(mask);
+ mask <<= shift;
+ bits = count_leading_ones(mask);
+ mask <<= shift;
+ shift = 32 - shift - bits;
+ return !mask;
+}
+
+
+void dib_truncate_channel(unsigned &shift, unsigned &bits)
+{
+ if (8U < bits)
+ {
+ unsigned const excess(bits - 8);
+ shift += excess;
+ bits -= excess;
+ }
+}
+
+
+uint8_t dib_splat_sample(uint8_t val, unsigned bits)
+{
+ assert(8U >= bits);
+ for (val <<= (8U - bits); bits && (8U > bits); bits <<= 1)
+ val |= val >> bits;
+ return val;
+}
+
+
+bool load_ico_png(util::core_file &fp, icon_dir_entry_t const &dir, bitmap_argb32 &bitmap)
+{
+ // skip out if the data isn't a reasonable size - PNG magic alone is eight bytes
+ if (9U >= dir.size)
+ return false;
+ fp.seek(dir.offset, SEEK_SET);
+ png_error const err(png_read_bitmap(fp, bitmap));
+ switch (err)
+ {
+ case PNGERR_NONE:
+ // found valid PNG image
+ assert(bitmap.valid());
+ if ((dir.get_width() == bitmap.width()) && ((dir.get_height() == bitmap.height())))
+ {
+ LOG("Loaded %d*%d pixel PNG image from ICO file\n", bitmap.width(), bitmap.height());
+ }
+ else
+ {
+ LOG(
+ "Loaded %d*%d pixel PNG image from ICO file (directory indicated %u*%u)\n",
+ bitmap.width(),
+ bitmap.height(),
+ dir.get_width(),
+ dir.get_height());
+ }
+ return true;
+
+ case PNGERR_BAD_SIGNATURE:
+ // doesn't look like PNG data - just fall back to DIB without the file header
+ return false;
+
+ default:
+ // invalid PNG data or I/O error
+ LOG(
+ "Error %u reading PNG image data from ICO file at offset %u (directory size %u)\n",
+ unsigned(err),
+ dir.offset,
+ dir.size);
+ return false;
+ }
+}
+
+
+bool load_ico_dib(util::core_file &fp, icon_dir_entry_t const &dir, bitmap_argb32 &bitmap)
+{
+ // check that these things haven't been padded somehow
+ static_assert(sizeof(bitmap_core_header_t) == 12U, "compiler has applied padding to bitmap_core_header_t");
+ static_assert(sizeof(bitmap_info_header_t) == 56U, "compiler has applied padding to bitmap_info_header_t");
+
+ // ensure the header fits in the space for the image data
+ union { bitmap_core_header_t core; bitmap_info_header_t info; } header;
+ assert(&header.core.size == &header.info.size);
+ if (sizeof(header.core) > dir.size)
+ return false;
+ std::memset(&header, 0, sizeof(header));
+ fp.seek(dir.offset, SEEK_SET);
+ if (fp.read(&header.core.size, sizeof(header.core.size)) != sizeof(header.core.size))
+ {
+ LOG(
+ "Error reading DIB header size from ICO file at offset %u (directory size %u)\n",
+ dir.offset,
+ dir.size);
+ return false;
+ }
+ header.core.size = little_endianize_int32(header.core.size);
+ if (dir.size < header.core.size)
+ {
+ LOG(
+ "ICO file image data at %u (%u bytes) is too small for DIB header (%u bytes)\n",
+ dir.offset,
+ dir.size,
+ header.core.size);
+ return false;
+ }
+
+ // identify and read the header - convert OS/2 headers to Windows 3 format
+ unsigned palette_bytes(4U);
+ switch (header.core.size)
+ {
+ case 16U:
+ case 64U:
+ // extended OS/2 bitmap header with support for compression
+ LOG(
+ "ICO image data at %u (%u bytes) uses unsupported OS/2 DIB header (size %u)\n",
+ dir.offset,
+ dir.size,
+ header.core.size);
+ return false;
+
+ case 12U:
+ // introduced in OS/2 and Windows 2.0
+ {
+ palette_bytes = 3U;
+ uint32_t const header_read(std::min<uint32_t>(header.core.size, sizeof(header.core)) - sizeof(header.core.size));
+ if (fp.read(&header.core.width, header_read) != header_read)
+ {
+ LOG("Error reading DIB core header from ICO file image data at %u (%u bytes)\n", dir.offset, dir.size);
+ return false;
+ }
+ fp.seek(header.core.size - sizeof(header.core.size) - header_read, SEEK_CUR);
+ header.core.width = little_endianize_int16(header.core.width);
+ header.core.height = little_endianize_int16(header.core.height);
+ header.core.planes = little_endianize_int16(header.core.planes);
+ header.core.bpp = little_endianize_int16(header.core.bpp);
+ LOGMASKED(
+ LOG_DIB,
+ "Read DIB core header from ICO file image data at %u: %d*%d, %u planes, %u bpp\n",
+ dir.offset,
+ header.core.width,
+ header.core.height,
+ header.core.planes,
+ header.core.bpp);
+
+ // this works because the core header only aliases the width/height of the info header
+ header.info.bpp = header.core.bpp;
+ header.info.planes = header.core.planes;
+ header.info.height = header.core.height;
+ header.info.width = header.core.width;
+ header.info.size = 40U;
+ }
+ break;
+
+ default:
+ // the next version will be longer
+ if (124U >= header.core.size)
+ {
+ LOG(
+ "ICO image data at %u (%u bytes) uses unsupported DIB header format (size %u)\n",
+ dir.offset,
+ dir.size,
+ header.core.size);
+ return false;
+ }
+ // fall through
+ case 40U:
+ case 52U:
+ case 56U:
+ case 108U:
+ case 124U:
+ // the Windows 3 bitmap header with optional extensions
+ {
+ palette_bytes = 4U;
+ uint32_t const header_read(std::min<uint32_t>(header.info.size, sizeof(header.info)) - sizeof(header.info.size));
+ if (fp.read(&header.info.width, header_read) != header_read)
+ {
+ LOG("Error reading DIB info header from ICO file image data at %u (%u bytes)\n", dir.offset, dir.size);
+ return false;
+ }
+ fp.seek(header.info.size - sizeof(header.info.size) - header_read, SEEK_CUR);
+ header.info.width = little_endianize_int32(header.info.width);
+ header.info.height = little_endianize_int32(header.info.height);
+ header.info.planes = little_endianize_int16(header.info.planes);
+ header.info.bpp = little_endianize_int16(header.info.bpp);
+ header.info.comp = little_endianize_int32(header.info.comp);
+ header.info.rawsize = little_endianize_int32(header.info.rawsize);
+ header.info.hres = little_endianize_int32(header.info.hres);
+ header.info.vres = little_endianize_int32(header.info.vres);
+ header.info.colors = little_endianize_int32(header.info.colors);
+ header.info.important = little_endianize_int32(header.info.important);
+ header.info.red = little_endianize_int32(header.info.red);
+ header.info.green = little_endianize_int32(header.info.green);
+ header.info.blue = little_endianize_int32(header.info.blue);
+ header.info.alpha = little_endianize_int32(header.info.alpha);
+ LOGMASKED(
+ LOG_DIB,
+ "Read DIB info header from ICO file image data at %u: %d*%d (%d*%d ppm), %u planes, %u bpp %u/%s%u colors\n",
+ dir.offset,
+ header.info.width,
+ header.info.height,
+ header.info.hres,
+ header.info.vres,
+ header.info.planes,
+ header.info.bpp,
+ header.info.important,
+ header.info.colors ? "" : "2^",
+ header.info.colors ? header.info.colors : header.info.bpp);
+ }
+ break;
+ }
+
+ // check for unsupported planes/bit depth
+ if ((1U != header.info.planes) || !header.info.bpp || (32U < header.info.bpp) || ((8U < header.info.bpp) ? (header.info.bpp % 8) : (8 % header.info.bpp)))
+ {
+ LOG(
+ "ICO file DIB image data at %u uses unsupported planes/bits per pixel %u*%u\n",
+ dir.offset,
+ header.info.planes,
+ header.info.bpp);
+ return false;
+ }
+
+ // check dimensions
+ if ((0 >= header.info.width) || (0 == header.info.height))
+ {
+ LOG(
+ "ICO file DIB image data at %u has invalid dimensions %u*%u\n",
+ dir.offset,
+ header.info.width,
+ header.info.height);
+ return false;
+ }
+ bool const top_down(0 > header.info.height);
+ if (top_down)
+ header.info.height = -header.info.height;
+ bool have_and_mask((2 * dir.get_height()) == header.info.height);
+ if (!have_and_mask && (dir.get_height() != header.info.height))
+ {
+ osd_printf_verbose(
+ "ICO file DIB image data at %lu height %ld doesn't match directory height %u with or without AND mask\n",
+ (unsigned long)dir.offset,
+ (long)header.info.height,
+ dir.get_height());
+ return false;
+ }
+ if (have_and_mask)
+ header.info.height >>= 1;
+
+ // ensure compression scheme is supported
+ bool indexed(true), no_palette(false);
+ switch (header.info.comp)
+ {
+ case DIB_COMP_NONE:
+ // uncompressed - direct colour with implied bitfields if more than eight bits/pixel
+ indexed = 8U >= header.info.bpp;
+ if (indexed)
+ {
+ if ((1U << header.info.bpp) < header.info.colors)
+ {
+ osd_printf_verbose(
+ "ICO file DIB image data at %lu has oversized palette with %lu entries for %u bits per pixel\n",
+ (unsigned long)dir.offset,
+ (unsigned long)header.info.colors,
+ (unsigned)header.info.bpp);
+ }
+ }
+ if (!indexed)
+ {
+ no_palette = true;
+ switch(header.info.bpp)
+ {
+ case 16U:
+ header.info.red = 0x00007c00;
+ header.info.green = 0x000003e0;
+ header.info.blue = 0x0000001f;
+ header.info.alpha = 0x00000000;
+ break;
+ case 24U:
+ case 32U:
+ header.info.red = 0x00ff0000;
+ header.info.green = 0x0000ff00;
+ header.info.blue = 0x000000ff;
+ header.info.alpha = 0x00000000;
+ break;
+ }
+ }
+ break;
+
+ case DIB_COMP_BITFIELDS:
+ // uncompressed direct colour with explicitly-specified bitfields
+ indexed = false;
+ if (offsetof(bitmap_info_header_t, alpha) > header.info.size)
+ {
+ osd_printf_verbose(
+ "ICO file DIB image data at %lu specifies bit masks but is too small (size %lu)\n",
+ (unsigned long)dir.offset,
+ (unsigned long)header.info.size);
+ return false;
+ }
+ break;
+
+ default:
+ LOG("ICO file DIB image data at %u uses unsupported compression scheme %u\n", header.info.comp);
+ return false;
+ }
+
+ // we can now calculate the size of the palette and row data
+ size_t const palette_entries(
+ indexed
+ ? ((1U == header.info.bpp) ? 2U : header.info.colors ? header.info.colors : (1U << header.info.bpp))
+ : (no_palette ? 0U : header.info.colors));
+ size_t const palette_size(palette_bytes * palette_entries);
+ size_t const row_bytes(((31 + (header.info.width * header.info.bpp)) >> 5) << 2);
+ size_t const mask_row_bytes(((31 + header.info.width) >> 5) << 2);
+ size_t const required_size(
+ header.info.size +
+ palette_size +
+ ((row_bytes + (have_and_mask ? mask_row_bytes : 0U)) * header.info.height));
+ if (required_size > dir.size)
+ {
+ LOG(
+ "ICO file image data at %u (%u bytes) smaller than calculated DIB data size (%u bytes)\n",
+ dir.offset,
+ dir.size,
+ required_size);
+ return false;
+ }
+
+ // load the palette for indexed colour formats or the shifts for direct colour formats
+ unsigned red_shift(0), green_shift(0), blue_shift(0), alpha_shift(0);
+ unsigned red_bits(0), green_bits(0), blue_bits(0), alpha_bits(0);
+ std::unique_ptr<rgb_t []> palette;
+ if (indexed)
+ {
+ // read palette and convert
+ std::unique_ptr<uint8_t []> palette_data(new uint8_t [palette_size]);
+ if (fp.read(palette_data.get(), palette_size) != palette_size)
+ {
+ LOG("Error reading palette from ICO file DIB image data at %u (%u bytes)\n", dir.offset, dir.size);
+ return false;
+ }
+ size_t const palette_usable(std::min<size_t>(palette_entries, size_t(1) << header.info.bpp));
+ palette.reset(new rgb_t [palette_usable]);
+ uint8_t const *ptr(palette_data.get());
+ for (size_t i = 0; palette_usable > i; ++i, ptr += palette_bytes)
+ palette[i] = rgb_t(ptr[2], ptr[1], ptr[0]);
+ }
+ else
+ {
+ // skip over the palette if necessary
+ if (palette_entries)
+ fp.seek(palette_bytes * palette_entries, SEEK_CUR);
+
+ // convert masks to shifts
+ bool const masks_contiguous(
+ dib_parse_mask(header.info.red, red_shift, red_bits) &&
+ dib_parse_mask(header.info.green, green_shift, green_bits) &&
+ dib_parse_mask(header.info.blue, blue_shift, blue_bits) &&
+ dib_parse_mask(header.info.alpha, alpha_shift, alpha_bits));
+ if (!masks_contiguous)
+ {
+ osd_printf_verbose(
+ "ICO file DIB image data at %lu specifies non-contiguous channel masks 0x%lx | 0x%lx | 0x%lx | 0x%lx\n",
+ (unsigned long)dir.offset,
+ (unsigned long)header.info.red,
+ (unsigned long)header.info.green,
+ (unsigned long)header.info.blue,
+ (unsigned long)header.info.alpha);
+ }
+ if ((32U != header.info.bpp) && ((header.info.red | header.info.green | header.info.blue | header.info.alpha) >> header.info.bpp))
+ {
+ LOG(
+ "ICO file DIB image data at %lu specifies channel masks 0x%x | 0x%x | 0x%x | 0x%x that exceed %u bits per pixel\n",
+ dir.offset,
+ header.info.red,
+ header.info.green,
+ header.info.blue,
+ header.info.alpha,
+ header.info.bpp);
+ return false;
+ }
+ LOGMASKED(
+ LOG_DIB,
+ "DIB from ICO file image data at %1$u using channels: R((x >> %3$u) & 0x%4$0*2$x) G((x >> %5$u) & 0x%6$0*2$x) B((x >> %7$u) & 0x%8$0*2$x) A((x >> %9$u) & 0x%10$0*2$x)\n",
+ dir.offset,
+ (header.info.bpp + 3) >> 2,
+ red_shift,
+ (uint32_t(1) << red_bits) - 1,
+ green_shift,
+ (uint32_t(1) << green_bits) - 1,
+ blue_shift,
+ (uint32_t(1) << blue_bits) - 1,
+ alpha_shift,
+ (uint32_t(1) << alpha_bits) - 1);
+
+ // the MAME bitmap only supports 8 bits/sample maximum
+ dib_truncate_channel(red_shift, red_bits);
+ dib_truncate_channel(green_shift, green_bits);
+ dib_truncate_channel(blue_shift, blue_bits);
+ dib_truncate_channel(alpha_shift, alpha_bits);
+ }
+
+ // allocate the bitmap and process row data
+ std::unique_ptr<uint8_t []> row_data(new uint8_t [row_bytes]);
+ bitmap.allocate(header.info.width, header.info.height);
+ int const y_inc(top_down ? 1 : -1);
+ for (int32_t i = 0, y = top_down ? 0 : (header.info.height - 1); header.info.height > i; ++i, y += y_inc)
+ {
+ if (fp.read(row_data.get(), row_bytes) != row_bytes)
+ {
+ LOG("Error reading DIB row %d data from ICO image data at %u\n", i, dir.offset);
+ return false;
+ }
+ uint8_t *src(row_data.get());
+ uint32_t *dest(&bitmap.pix(y));
+ unsigned shift(0U);
+ for (int32_t x = 0; header.info.width > x; ++x, ++dest)
+ {
+ // extract or compose a pixel
+ uint32_t pix(0U);
+ if (8U >= header.info.bpp)
+ {
+ assert(8U > shift);
+ pix = *src >> (8U - header.info.bpp);
+ *src <<= header.info.bpp;
+ shift += header.info.bpp;
+ if (8U <= shift)
+ {
+ shift = 0U;
+ ++src;
+ }
+ }
+ else for (shift = 0; header.info.bpp > shift; shift += 8U, ++src)
+ {
+ pix |= uint32_t(*src) << shift;
+ }
+
+ // convert to RGB
+ if (indexed)
+ {
+ if (palette_entries > pix)
+ {
+ *dest = palette[pix];
+ }
+ else
+ {
+ *dest = rgb_t::transparent();
+ osd_printf_verbose(
+ "ICO file DIB image data at %lu has out-of-range color %lu at (%ld, %ld) with %lu palette entries\n",
+ (unsigned long)dir.offset,
+ (unsigned long)pix,
+ (long)x,
+ (long)y,
+ (unsigned long)palette_entries);
+ }
+ }
+ else
+ {
+ uint8_t r(dib_splat_sample((pix >> red_shift) & ((uint32_t(1) << red_bits) - 1), red_bits));
+ uint8_t g(dib_splat_sample((pix >> green_shift) & ((uint32_t(1) << green_bits) - 1), green_bits));
+ uint8_t b(dib_splat_sample((pix >> blue_shift) & ((uint32_t(1) << blue_bits) - 1), blue_bits));
+ uint8_t a(dib_splat_sample((pix >> alpha_shift) & ((uint32_t(1) << alpha_bits) - 1), alpha_bits));
+ *dest = rgb_t(alpha_bits ? a : 255, r, g, b);
+ }
+ }
+ }
+
+ // process the AND mask if present
+ if (have_and_mask)
+ {
+ for (int32_t i = 0, y = top_down ? 0 : (header.info.height - 1); header.info.height > i; ++i, y += y_inc)
+ {
+ if (fp.read(row_data.get(), mask_row_bytes) != mask_row_bytes)
+ {
+ LOG("Error reading DIB mask row %d data from ICO image data at %u\n", i, dir.offset);
+ return false;
+ }
+ uint8_t *src(row_data.get());
+ uint32_t *dest(&bitmap.pix(y));
+ unsigned shift(0U);
+ for (int32_t x = 0; header.info.width > x; ++x, ++dest)
+ {
+ assert(8U > shift);
+ rgb_t pix(*dest);
+ *dest = pix.set_a(BIT(*src, 7U - shift) ? 0U : pix.a());
+ if (8U <= ++shift)
+ {
+ shift = 0U;
+ ++src;
+ }
+ }
+ }
+ }
+
+ // we're done!
+ return true;
+}
+
+
+bool load_ico_image(util::core_file &fp, unsigned index, icon_dir_entry_t const &dir, bitmap_argb32 &bitmap)
+{
+ // try loading PNG image data (contains PNG file magic if used), and then fall back
+ if (load_ico_png(fp, dir, bitmap))
+ {
+ LOG("Successfully loaded PNG image from ICO file entry %u\n", index);
+ return true;
+ }
+ else if (load_ico_dib(fp, dir, bitmap))
+ {
+ LOG("Successfully loaded DIB image from ICO file entry %u\n", index);
+ return true;
+ }
+
+ // no luck
+ return false;
+}
+
+
+bool load_ico_image(util::core_file &fp, unsigned count, unsigned index, bitmap_argb32 &bitmap)
+{
+ // read the directory entry
+ icon_dir_entry_t dir;
+ fp.seek(sizeof(icon_dir_t) + (sizeof(icon_dir_entry_t) * index), SEEK_SET);
+ if (fp.read(&dir, sizeof(dir)) != sizeof(dir))
+ {
+ LOG("Failed to read ICO file directory entry %u\n", index);
+ return false;
+ }
+ dir.byteswap();
+ if ((sizeof(icon_dir_t) + (sizeof(icon_dir_entry_t) * count)) > dir.offset)
+ {
+ LOG(
+ "ICO file image %u data starting at %u overlaps %u bytes of file header and directory\n",
+ index,
+ dir.offset,
+ sizeof(icon_dir_t) + (sizeof(icon_dir_entry_t) * count));
+ return false;
+ }
+ else
+ {
+ return load_ico_image(fp, index, dir, bitmap);
+ }
+}
+
+} // anonymous namespace
+
+
+int images_in_ico(util::core_file &fp)
+{
+ // read and check the icon file header
+ icon_dir_t header;
+ fp.seek(0, SEEK_SET);
+ if (fp.read(&header, sizeof(header)) != sizeof(header))
+ {
+ LOG("Failed to read ICO file header\n");
+ return -1;
+ }
+ header.reserved = little_endianize_int16(header.reserved);
+ header.type = little_endianize_int16(header.type);
+ header.count = little_endianize_int16(header.count);
+ if (0U != header.reserved)
+ {
+ LOG("Invalid ICO file header reserved field %u (expected 0)\n", header.reserved);
+ return -1;
+ }
+ if ((1U != header.type) && (2U != header.type))
+ {
+ LOG("Invalid ICO file header type field %u (expected 1 or 2)\n", header.type);
+ return -1;
+ }
+ return int(unsigned(little_endianize_int16(header.count)));
+}
+
+
+void render_load_ico(util::core_file &fp, unsigned index, bitmap_argb32 &bitmap)
+{
+ // check that these things haven't been padded somehow
+ static_assert(sizeof(icon_dir_t) == 6U, "compiler has applied padding to icon_dir_t");
+ static_assert(sizeof(icon_dir_entry_t) == 16U, "compiler has applied padding to icon_dir_entry_t");
+
+ // read and check the icon file header, then try to load the specified image
+ int const count(images_in_ico(fp));
+ if (0 > count)
+ {
+ // images_in_ico already logged an error
+ }
+ else if (index >= count)
+ {
+ osd_printf_verbose("Requested image %u from ICO file containing %d images\n", index, count);
+ }
+ else if (load_ico_image(fp, count, index, bitmap))
+ {
+ return;
+ }
+ bitmap.reset();
+}
+
+
+void render_load_ico_first(util::core_file &fp, bitmap_argb32 &bitmap)
+{
+ int const count(images_in_ico(fp));
+ for (int i = 0; count > i; ++i)
+ {
+ if (load_ico_image(fp, count, i, bitmap))
+ return;
+ }
+ bitmap.reset();
+}
+
+
+void render_load_ico_highest_detail(util::core_file &fp, bitmap_argb32 &bitmap)
+{
+ // read and check the icon file header - logs a message on error
+ int const count(images_in_ico(fp));
+ if (0 <= count)
+ {
+ // now load all the directory entries
+ size_t const dir_bytes(sizeof(icon_dir_entry_t) * count);
+ std::unique_ptr<icon_dir_entry_t []> dir(new icon_dir_entry_t [count]);
+ std::unique_ptr<unsigned []> index(new unsigned [count]);
+ if (count && (fp.read(dir.get(), dir_bytes) != dir_bytes))
+ {
+ LOG("Failed to read ICO file directory entries\n");
+ }
+ else
+ {
+ // byteswap and sort by (pixels, depth)
+ for (int i = 0; count > i; ++i)
+ {
+ dir[i].byteswap();
+ index[i] = i;
+ }
+ std::stable_sort(
+ index.get(),
+ index.get() + count,
+ [&dir] (unsigned x, unsigned y)
+ {
+ unsigned const x_pixels(dir[x].get_width() * dir[x].get_height());
+ unsigned const y_pixels(dir[y].get_width() * dir[y].get_height());
+ if (x_pixels > y_pixels)
+ return true;
+ else if (x_pixels < y_pixels)
+ return false;
+ else
+ return dir[x].bpp > dir[y].bpp;
+ });
+
+ // walk down until something works
+ for (int i = 0; count > i; ++i)
+ {
+ LOG(
+ "Try loading ICO file entry %u: %u*%u, %u bits per pixel\n",
+ index[i],
+ dir[index[i]].get_width(),
+ dir[index[i]].get_height(),
+ dir[index[i]].bpp);
+ if (load_ico_image(fp, index[i], dir[index[i]], bitmap))
+ return;
+ }
+ }
+ }
+ bitmap.reset();
+}
+
+} // namespace ui
diff --git a/src/frontend/mame/ui/icorender.h b/src/frontend/mame/ui/icorender.h
index 17bc5a1d8ea..bb3f1a083be 100644
--- a/src/frontend/mame/ui/icorender.h
+++ b/src/frontend/mame/ui/icorender.h
@@ -1,13 +1,13 @@
// license:BSD-3-Clause
-// copyright-holders:Maurizio Petrarota, Victor Laskin
+// copyright-holders:Vas Crabb
/***************************************************************************
ui/icorender.h
- ICOns file loader.
+ Windows icon file parser.
- Original code by Victor Laskin (victor.laskin@gmail.com)
- http://vitiy.info/Code/ico.cpp
+ File handles passed to these functions must support read and seek
+ operations.
***************************************************************************/
#ifndef MAME_FRONTEND_MAME_UI_ICORENDER_H
@@ -15,219 +15,20 @@
#pragma once
-// These next two structs represent how the icon information is stored
-// in an ICO file.
-typedef struct
-{
- uint8_t bWidth; // Width of the image
- uint8_t bHeight; // Height of the image (times 2)
- uint8_t bColorCount; // Number of colors in image (0 if >=8bpp)
- uint8_t bReserved; // Reserved
- uint16_t wPlanes; // Color Planes
- uint16_t wBitCount; // Bits per pixel
- uint32_t dwBytesInRes; // how many bytes in this resource?
- uint32_t dwImageOffset; // where in the file is this image
-} ICONDIRENTRY, *LPICONDIRENTRY;
+namespace ui {
-typedef struct
-{
- uint16_t idReserved; // Reserved
- uint16_t idType; // resource type (1 for icons)
- uint16_t idCount; // how many images?
- //ICONDIRENTRY idEntries[1]; // the entries for each image
-} ICONDIR, *LPICONDIR;
+// get number of images in icon file (-1 on error)
+int images_in_ico(util::core_file &fp);
-// size - 40 bytes
-typedef struct {
- uint32_t biSize;
- uint32_t biWidth;
- uint32_t biHeight; // Icon Height (added height of XOR-Bitmap and AND-Bitmap)
- uint16_t biPlanes;
- uint16_t biBitCount;
- uint32_t biCompression;
- int32_t biSizeImage;
- uint32_t biXPelsPerMeter;
- uint32_t biYPelsPerMeter;
- uint32_t biClrUsed;
- uint32_t biClrImportant;
-} s_BITMAPINFOHEADER, *s_PBITMAPINFOHEADER;
+// load specified icon from file (zero-based)
+void render_load_ico(util::core_file &fp, unsigned index, bitmap_argb32 &bitmap);
-// 46 bytes
-typedef struct{
- s_BITMAPINFOHEADER icHeader; // DIB header
- uint32_t icColors[1]; // Color table (short 4 bytes) //RGBQUAD
- uint8_t icXOR[1]; // DIB bits for XOR mask
- uint8_t icAND[1]; // DIB bits for AND mask
-} ICONIMAGE, *LPICONIMAGE;
+// load first supported icon from file
+void render_load_ico_first(util::core_file &fp, bitmap_argb32 &bitmap);
-//-------------------------------------------------
-// load an ICO file into a bitmap
-//-------------------------------------------------
+// load highest detail supported icon from file
+void render_load_ico_highest_detail(util::core_file &fp, bitmap_argb32 &bitmap);
-inline void render_load_ico(bitmap_argb32 &bitmap, emu_file &file, const char *dirname, const char *filename)
-{
- int32_t width = 0;
- int32_t height = 0;
-
- // deallocate previous bitmap
- bitmap.reset();
-
- // define file's full name
- std::string fname;
-
- if (!dirname)
- fname = filename;
- else
- fname.assign(dirname).append(PATH_SEPARATOR).append(filename);
-
- osd_file::error filerr = file.open(fname.c_str());
-
- if (filerr != osd_file::error::NONE)
- return;
-
- // allocates a buffer for the image
- uint64_t size = file.size();
- uint8_t *buffer = global_alloc_array(uint8_t, size + 1);
-
- // read data from the file and set them in the buffer
- file.read(buffer, size);
-
- LPICONDIR icoDir = (LPICONDIR)buffer;
- int iconsCount = icoDir->idCount;
-
- if (icoDir->idReserved != 0 || icoDir->idType != 1 || iconsCount == 0 || iconsCount > 20)
- {
- file.close();
- global_free_array(buffer);
- return;
- }
-
- uint8_t* cursor = buffer;
- cursor += 6;
- ICONDIRENTRY* dirEntry = (ICONDIRENTRY*)(cursor);
- int maxSize = 0;
- int offset = 0;
- int maxBitCount = 0;
- for (int i = 0; i < iconsCount; i++, ++dirEntry)
- {
- int w = dirEntry->bWidth;
- int h = dirEntry->bHeight;
- int bitCount = dirEntry->wBitCount;
- if (w * h > maxSize || bitCount > maxBitCount) // we choose icon with max resolution
- {
- width = w;
- height = h;
- offset = dirEntry->dwImageOffset;
- maxSize = w * h;
- }
- }
-
- if (offset == 0) return;
-
- cursor = buffer;
- cursor += offset;
- ICONIMAGE* icon = (ICONIMAGE*)(cursor);
- int realBitsCount = (int)icon->icHeader.biBitCount;
- bool hasAndMask = (realBitsCount < 32) && (height != icon->icHeader.biHeight);
-
- cursor += 40;
- bitmap.allocate(width, height);
-
- // rgba + vertical swap
- if (realBitsCount >= 32)
- {
- for (int x = 0; x < width; ++x)
- for (int y = 0; y < height; ++y)
- {
- int shift2 = 4 * (x + (height - y - 1) * width);
- bitmap.pix32(y, x) = rgb_t(cursor[shift2 + 3], cursor[shift2 + 2], cursor[shift2 + 1], cursor[shift2]);
- }
- }
- else if (realBitsCount == 24)
- for (int x = 0; x < width; ++x)
- for (int y = 0; y < height; ++y)
- {
- int shift2 = 3 * (x + (height - y - 1) * width);
- bitmap.pix32(y, x) = rgb_t(255, cursor[shift2 + 2], cursor[shift2 + 1], cursor[shift2]);
- }
- else if (realBitsCount == 8) // 256 colors
- {
- // 256 color table
- uint8_t *colors = cursor;
- cursor += 256 * 4;
- for (int x = 0; x < width; ++x)
- for (int y = 0; y < height; ++y)
- {
- int shift2 = (x + (height - y - 1) * width);
- int index = 4 * cursor[shift2];
- bitmap.pix32(y, x) = rgb_t(255, colors[index + 2], colors[index + 1], colors[index]);
- }
- }
- else if (realBitsCount == 4) // 16 colors
- {
- // 16 color table
- uint8_t *colors = cursor;
- cursor += 16 * 4;
- for (int x = 0; x < width; ++x)
- for (int y = 0; y < height; ++y)
- {
- int shift2 = (x + (height - y - 1) * width);
- uint8_t index = cursor[shift2 / 2];
- if (shift2 % 2 == 0)
- index = (index >> 4) & 0xF;
- else
- index = index & 0xF;
- index *= 4;
- bitmap.pix32(y, x) = rgb_t(255, colors[index + 2], colors[index + 1], colors[index]);
- }
- }
- else if (realBitsCount == 1) // 2 colors
- {
- // 2 color table
- uint8_t *colors = cursor;
- cursor += 2 * 4;
- int boundary = width; // !!! 32 bit boundary (http://www.daubnet.com/en/file-format-ico)
- while (boundary % 32 != 0) boundary++;
-
- for (int x = 0; x < width; ++x)
- for (int y = 0; y < height; ++y)
- {
- int shift2 = (x + (height - y - 1) * boundary);
- uint8_t index = cursor[shift2 / 8];
-
- // select 1 bit only
- uint8_t bit = 7 - (x % 8);
- index = (index >> bit) & 0x01;
- index *= 4;
- bitmap.pix32(y, x) = rgb_t(255, colors[index + 2], colors[index + 1], colors[index]);
- }
- }
-
- // Read AND mask after base color data - 1 BIT MASK
- if (hasAndMask)
- {
- int boundary = width * realBitsCount; // !!! 32 bit boundary (http://www.daubnet.com/en/file-format-ico)
- while (boundary % 32 != 0) boundary++;
- cursor += boundary * height / 8;
-
- boundary = width;
- while (boundary % 32 != 0) boundary++;
-
- for (int y = 0; y < height; ++y)
- for (int x = 0; x < width; ++x)
- {
- uint8_t bit = 7 - (x % 8);
- int shift2 = (x + (height - y - 1) * boundary) / 8;
- int mask = (0x01 & ((uint8_t)cursor[shift2] >> bit));
- rgb_t colors = bitmap.pix32(y, x);
- uint8_t alpha = colors.a();
- alpha *= 1 - mask;
- colors.set_a(alpha);
- bitmap.pix32(y, x) = colors;
- }
- }
- file.close();
- global_free_array(buffer);
-}
+} // namespace ui
#endif // MAME_FRONTEND_MAME_UI_ICORENDER_H
diff --git a/src/frontend/mame/ui/info.cpp b/src/frontend/mame/ui/info.cpp
index 963dfb5597c..e7235b89111 100644
--- a/src/frontend/mame/ui/info.cpp
+++ b/src/frontend/mame/ui/info.cpp
@@ -28,20 +28,27 @@ constexpr machine_flags::type MACHINE_WARNINGS = machine_flags::NO_COCKTAIL | m
constexpr machine_flags::type MACHINE_BTANB = machine_flags::NO_SOUND_HW | machine_flags::IS_INCOMPLETE;
constexpr std::pair<device_t::feature_type, char const *> FEATURE_NAMES[] = {
- { device_t::feature::PROTECTION, __("protection") },
- { device_t::feature::PALETTE, __("color palette") },
- { device_t::feature::GRAPHICS, __("graphics") },
- { device_t::feature::SOUND, __("sound") },
- { device_t::feature::CONTROLS, __("controls") },
- { device_t::feature::KEYBOARD, __("keyboard") },
- { device_t::feature::MOUSE, __("mouse") },
- { device_t::feature::MICROPHONE, __("microphone") },
- { device_t::feature::CAMERA, __("camera") },
- { device_t::feature::DISK, __("disk") },
- { device_t::feature::PRINTER, __("printer") },
- { device_t::feature::LAN, __("LAN") },
- { device_t::feature::WAN, __("WAN") },
- { device_t::feature::TIMING, __("timing") } };
+ { device_t::feature::PROTECTION, __("protection") },
+ { device_t::feature::TIMING, __("timing") },
+ { device_t::feature::GRAPHICS, __("graphics") },
+ { device_t::feature::PALETTE, __("color palette") },
+ { device_t::feature::SOUND, __("sound") },
+ { device_t::feature::CAPTURE, __("capture hardware") },
+ { device_t::feature::CAMERA, __("camera") },
+ { device_t::feature::MICROPHONE, __("microphone") },
+ { device_t::feature::CONTROLS, __("controls") },
+ { device_t::feature::KEYBOARD, __("keyboard") },
+ { device_t::feature::MOUSE, __("mouse") },
+ { device_t::feature::MEDIA, __("media") },
+ { device_t::feature::DISK, __("disk") },
+ { device_t::feature::PRINTER, __("printer") },
+ { device_t::feature::TAPE, __("magnetic tape") },
+ { device_t::feature::PUNCH, __("punch tape") },
+ { device_t::feature::DRUM, __("magnetic drum") },
+ { device_t::feature::ROM, __("solid state storage") },
+ { device_t::feature::COMMS, __("communications") },
+ { device_t::feature::LAN, __("LAN") },
+ { device_t::feature::WAN, __("WAN") } };
} // anonymous namespace
diff --git a/src/frontend/mame/ui/inifile.cpp b/src/frontend/mame/ui/inifile.cpp
index 852884fea6a..b68be00122b 100644
--- a/src/frontend/mame/ui/inifile.cpp
+++ b/src/frontend/mame/ui/inifile.cpp
@@ -1,5 +1,5 @@
// license:BSD-3-Clause
-// copyright-holders:Maurizio Petrarota
+// copyright-holders:Maurizio Petrarota, Vas Crabb
/***************************************************************************
ui/inifile.cpp
@@ -16,13 +16,24 @@
#include "drivenum.h"
#include "softlist_dev.h"
+#include <algorithm>
+#include <cstring>
+#include <iterator>
+
+
+namespace {
+
+char const FAVORITE_FILENAME[] = "favorites.ini";
+
+} // anonymous namespace
+
//-------------------------------------------------
// ctor
//-------------------------------------------------
-inifile_manager::inifile_manager(running_machine &machine, ui_options &moptions)
- : m_options(moptions)
+inifile_manager::inifile_manager(ui_options &options)
+ : m_options(options)
, m_ini_index()
{
// scan directories and create index
@@ -108,204 +119,103 @@ void inifile_manager::init_category(std::string &&filename, emu_file &file)
FAVORITE MANAGER
**************************************************************************/
-//-------------------------------------------------
-// ctor
-//-------------------------------------------------
-
-favorite_manager::favorite_manager(running_machine &machine, ui_options &moptions)
- : m_machine(machine)
- , m_options(moptions)
+bool favorite_manager::favorite_compare::operator()(ui_software_info const &lhs, ui_software_info const &rhs) const
{
- parse_favorite();
-}
+ assert(lhs.driver);
+ assert(rhs.driver);
-//-------------------------------------------------
-// add a game
-//-------------------------------------------------
-
-void favorite_manager::add_favorite_game(const game_driver *driver)
-{
- m_list.emplace(driver->type.fullname(), *driver);
- save_favorite_games();
-}
-
-//-------------------------------------------------
-// add a system
-//-------------------------------------------------
-
-void favorite_manager::add_favorite_game(ui_software_info &swinfo)
-{
- m_list.emplace(swinfo.longname, swinfo);
- save_favorite_games();
-}
-
-//-------------------------------------------------
-// add a game / system
-//-------------------------------------------------
-
-void favorite_manager::add_favorite_game()
-{
- if ((machine().system().flags & machine_flags::MASK_TYPE) == machine_flags::TYPE_ARCADE)
+ if (!lhs.startempty)
{
- add_favorite_game(&machine().system());
- return;
+ if (rhs.startempty)
+ return false;
+ else if (lhs.listname < rhs.listname)
+ return true;
+ else if (lhs.listname > rhs.listname)
+ return false;
+ else if (lhs.shortname < rhs.shortname)
+ return true;
+ else if (lhs.shortname > rhs.shortname)
+ return false;
}
-
- auto software_avail = false;
- for (device_image_interface &image : image_interface_iterator(machine().root_device()))
+ else if (!rhs.startempty)
{
- if (image.exists() && image.loaded_through_softlist())
- {
- const software_info *swinfo = image.software_entry();
- const software_part *part = image.part_entry();
- ui_software_info tmpmatches;
- tmpmatches.shortname = swinfo->shortname();
- tmpmatches.longname = image.longname();
- tmpmatches.parentname = swinfo->parentname();
- tmpmatches.year = image.year();
- tmpmatches.publisher = image.manufacturer();
- tmpmatches.supported = image.supported();
- tmpmatches.part = part->name();
- tmpmatches.driver = &machine().system();
- tmpmatches.listname = strensure(image.software_list_name());
- tmpmatches.interface = part->interface();
- tmpmatches.instance = image.instance_name();
- tmpmatches.startempty = 0;
- tmpmatches.parentlongname.clear();
- if (!swinfo->parentname().empty())
- {
- auto swlist = software_list_device::find_by_name(machine().config(), image.software_list_name());
- for (const software_info &c_swinfo : swlist->get_info())
- {
- std::string c_parent(c_swinfo.parentname());
- if (!c_parent.empty() && c_parent == swinfo->shortname())
- {
- tmpmatches.parentlongname = c_swinfo.longname();
- break;
- }
- }
- }
-
- tmpmatches.usage.clear();
- for (const feature_list_item &flist : swinfo->other_info())
- if (!strcmp(flist.name().c_str(), "usage"))
- tmpmatches.usage = flist.value();
-
- tmpmatches.devicetype = strensure(image.image_type_name());
- tmpmatches.available = true;
- software_avail = true;
- m_list.emplace(tmpmatches.longname, tmpmatches);
- save_favorite_games();
- }
+ return true;
}
- if (!software_avail)
- add_favorite_game(&machine().system());
+ return 0 > std::strncmp(lhs.driver->name, rhs.driver->name, ARRAY_LENGTH(lhs.driver->name));
}
-//-------------------------------------------------
-// remove a favorite from list
-//-------------------------------------------------
-
-void favorite_manager::remove_favorite_game(ui_software_info const &swinfo)
+bool favorite_manager::favorite_compare::operator()(ui_software_info const &lhs, game_driver const &rhs) const
{
- for (auto e = m_list.begin(); e != m_list.end(); ++e)
- if (e->second == swinfo)
- {
- m_list.erase(e);
- break;
- }
- m_current = m_list.begin();
- save_favorite_games();
-}
-
-//-------------------------------------------------
-// remove a favorite from list
-//-------------------------------------------------
+ assert(lhs.driver);
-void favorite_manager::remove_favorite_game()
-{
- m_list.erase(m_current);
- m_current = m_list.begin();
- save_favorite_games();
+ if (!lhs.startempty)
+ return false;
+ else
+ return 0 > std::strncmp(lhs.driver->name, rhs.name, ARRAY_LENGTH(rhs.name));
}
-//-------------------------------------------------
-// check if game is already in favorite list
-//-------------------------------------------------
-
-bool favorite_manager::isgame_favorite()
+bool favorite_manager::favorite_compare::operator()(game_driver const &lhs, ui_software_info const &rhs) const
{
- if ((machine().system().flags & machine_flags::MASK_TYPE) == machine_flags::TYPE_ARCADE)
- return isgame_favorite(&machine().system());
-
- auto image_loaded = false;
+ assert(rhs.driver);
- for (device_image_interface &image : image_interface_iterator(machine().root_device()))
- {
- const software_info *swinfo = image.software_entry();
- if (image.exists() && swinfo != nullptr)
- {
- image_loaded = true;
- for (auto current = m_list.begin(); current != m_list.end(); ++current)
- if (current->second.shortname == swinfo->shortname() &&
- current->second.listname == image.software_list_name())
- {
- m_current = current;
- return true;
- }
- }
- }
-
- if (!image_loaded)
- return isgame_favorite(&machine().system());
-
- m_current = m_list.begin();
- return false;
+ if (!rhs.startempty)
+ return true;
+ else
+ return 0 > std::strncmp(lhs.name, rhs.driver->name, ARRAY_LENGTH(lhs.name));
}
-//-------------------------------------------------
-// check if game is already in favorite list
-//-------------------------------------------------
-
-bool favorite_manager::isgame_favorite(const game_driver *driver)
+bool favorite_manager::favorite_compare::operator()(ui_software_info const &lhs, running_software_key const &rhs) const
{
- for (auto current = m_list.begin(); current != m_list.end(); ++current)
- if (current->second.driver == driver && current->second.shortname == driver->name)
- {
- m_current = current;
- return true;
- }
-
- m_current = m_list.begin();
- return false;
+ assert(lhs.driver);
+ assert(std::get<1>(rhs));
+
+ if (lhs.startempty)
+ return true;
+ else if (lhs.listname < std::get<1>(rhs))
+ return true;
+ else if (lhs.listname > std::get<1>(rhs))
+ return false;
+ else if (lhs.shortname < std::get<2>(rhs))
+ return true;
+ else if (lhs.shortname > std::get<2>(rhs))
+ return false;
+ else
+ return 0 > std::strncmp(lhs.driver->name, std::get<0>(rhs).name, ARRAY_LENGTH(lhs.driver->name));
}
-//-------------------------------------------------
-// check if game is already in favorite list
-//-------------------------------------------------
-
-bool favorite_manager::isgame_favorite(ui_software_info const &swinfo)
+bool favorite_manager::favorite_compare::operator()(running_software_key const &lhs, ui_software_info const &rhs) const
{
- for (auto current = m_list.begin(); current != m_list.end(); ++current)
- if (current->second == swinfo)
- {
- m_current = current;
- return true;
- }
-
- m_current = m_list.begin();
- return false;
+ assert(std::get<1>(lhs));
+ assert(rhs.driver);
+
+ if (rhs.startempty)
+ return false;
+ else if (std::get<1>(lhs) < rhs.listname)
+ return true;
+ else if (std::get<1>(lhs) > rhs.listname)
+ return false;
+ else if (std::get<2>(lhs) < rhs.shortname)
+ return true;
+ else if (std::get<2>(lhs) > rhs.shortname)
+ return false;
+ else
+ return 0 > std::strncmp(std::get<0>(lhs).name, rhs.driver->name, ARRAY_LENGTH(rhs.driver->name));
}
+
//-------------------------------------------------
-// parse favorite file
+// construction/destruction
//-------------------------------------------------
-void favorite_manager::parse_favorite()
+favorite_manager::favorite_manager(ui_options &options)
+ : m_options(options)
+ , m_favorites()
+ , m_sorted()
+ , m_need_sort(true)
{
emu_file file(m_options.ui_path(), OPEN_FLAG_READ);
- if (file.open(favorite_filename) == osd_file::error::NONE)
+ if (file.open(FAVORITE_FILENAME) == osd_file::error::NONE)
{
char readbuf[1024];
file.gets(readbuf, 1024);
@@ -332,7 +242,8 @@ void favorite_manager::parse_favorite()
file.gets(readbuf, 1024);
chartrimcarriage(readbuf);
auto dx = driver_list::find(readbuf);
- if (dx == -1) continue;
+ if (0 > dx)
+ continue;
tmpmatches.driver = &driver_list::driver(dx);
file.gets(readbuf, 1024);
tmpmatches.listname = chartrimcarriage(readbuf);
@@ -350,53 +261,319 @@ void favorite_manager::parse_favorite()
tmpmatches.devicetype = chartrimcarriage(readbuf);
file.gets(readbuf, 1024);
tmpmatches.available = atoi(readbuf);
- m_list.emplace(tmpmatches.longname, tmpmatches);
+ m_favorites.emplace(std::move(tmpmatches));
}
file.close();
}
}
+
+//-------------------------------------------------
+// add
+//-------------------------------------------------
+
+void favorite_manager::add_favorite_system(game_driver const &driver)
+{
+ add_impl(driver);
+}
+
+void favorite_manager::add_favorite_software(ui_software_info const &swinfo)
+{
+ add_impl(swinfo);
+}
+
+void favorite_manager::add_favorite(running_machine &machine)
+{
+ apply_running_machine(
+ machine,
+ [this, &machine] (game_driver const &driver, device_image_interface *imagedev, software_info const *software, bool &done)
+ {
+ if (imagedev)
+ {
+ // creating this is fairly expensive, but we'll assume this usually succeeds
+ ui_software_info info;
+ software_part const *const part(imagedev->part_entry());
+ assert(software);
+ assert(part);
+
+ // start with simple stuff that can just be copied
+ info.shortname = software->shortname();
+ info.longname = imagedev->longname();
+ info.parentname = software->parentname();
+ info.year = imagedev->year();
+ info.publisher = imagedev->manufacturer();
+ info.supported = imagedev->supported();
+ info.part = part->name();
+ info.driver = &driver;
+ info.listname = imagedev->software_list_name();
+ info.interface = part->interface();
+ info.instance = imagedev->instance_name();
+ info.startempty = 0;
+ info.devicetype = strensure(imagedev->image_type_name());
+ info.available = true;
+
+ // look up the parent in the list if necessary (eugh, O(n) walk)
+ if (!info.parentname.empty())
+ {
+ auto const listdev = software_list_device::find_by_name(machine.config(), info.listname);
+ assert(listdev);
+ for (software_info const &other : listdev->get_info())
+ {
+ if (other.shortname() == info.parentname)
+ {
+ info.parentlongname = other.longname();
+ break;
+ }
+ }
+ }
+
+ // fill in with the first usage entry we find
+ for (feature_list_item const &feature : software->other_info())
+ {
+ if (feature.name() == "usage")
+ {
+ info.usage = feature.value();
+ break;
+ }
+ }
+
+ // hooray for move semantics!
+ add_impl(std::move(info));
+ }
+ else
+ {
+ add_impl(driver);
+ }
+ });
+}
+
+template <typename T> void favorite_manager::add_impl(T &&key)
+{
+ auto const ins(m_favorites.emplace(std::forward<T>(key)));
+ if (ins.second)
+ {
+ if (!m_sorted.empty())
+ m_sorted.emplace_back(std::ref(*ins.first));
+ m_need_sort = true;
+ save_favorites();
+ }
+}
+
+
+//-------------------------------------------------
+// check
+//-------------------------------------------------
+
+bool favorite_manager::is_favorite_system(game_driver const &driver) const
+{
+ return check_impl(driver);
+}
+
+bool favorite_manager::is_favorite_software(ui_software_info const &swinfo) const
+{
+ auto found(m_favorites.lower_bound(swinfo));
+ if ((m_favorites.end() != found) && (found->listname == swinfo.listname) && (found->shortname == swinfo.shortname))
+ return true;
+ else if (m_favorites.begin() == found)
+ return false;
+
+ // need to back up and check for matching software with lexically earlier driver
+ --found;
+ return (found->listname == swinfo.listname) && (found->shortname == swinfo.shortname);
+}
+
+bool favorite_manager::is_favorite(running_machine &machine) const
+{
+ bool result(false);
+ apply_running_machine(
+ machine,
+ [this, &result] (game_driver const &driver, device_image_interface *imagedev, software_info const *software, bool &done)
+ {
+ assert(!result);
+ result = imagedev
+ ? check_impl(running_software_key(driver, imagedev->software_list_name(), software->shortname()))
+ : check_impl(driver);
+ done = done || result;
+ });
+ return result;
+}
+
+bool favorite_manager::is_favorite_system_software(ui_software_info const &swinfo) const
+{
+ return check_impl(swinfo);
+}
+
+template <typename T> bool favorite_manager::check_impl(T const &key) const
+{
+ return m_favorites.find(key) != m_favorites.end();
+}
+
+
+//-------------------------------------------------
+// remove
+//-------------------------------------------------
+
+void favorite_manager::remove_favorite_system(game_driver const &driver)
+{
+ remove_impl(driver);
+}
+
+void favorite_manager::remove_favorite_software(ui_software_info const &swinfo)
+{
+ remove_impl(swinfo);
+}
+
+void favorite_manager::remove_favorite(running_machine &machine)
+{
+ apply_running_machine(
+ machine,
+ [this] (game_driver const &driver, device_image_interface *imagedev, software_info const *software, bool &done)
+ {
+ done = imagedev
+ ? remove_impl(running_software_key(driver, imagedev->software_list_name(), software->shortname()))
+ : remove_impl(driver);
+ });
+}
+
+template <typename T> bool favorite_manager::remove_impl(T const &key)
+{
+ auto const found(m_favorites.find(key));
+ if (m_favorites.end() != found)
+ {
+ m_favorites.erase(found);
+ m_sorted.clear();
+ m_need_sort = true;
+ save_favorites();
+ return true;
+ }
+ else
+ {
+ return false;
+ }
+}
+
+
//-------------------------------------------------
-// save favorite
+// implementation
//-------------------------------------------------
-void favorite_manager::save_favorite_games()
+template <typename T>
+void favorite_manager::apply_running_machine(running_machine &machine, T &&action)
+{
+ bool done(false);
+
+ // TODO: this should be changed - it interacts poorly with cartslots on arcade systems
+ if ((machine.system().flags & machine_flags::MASK_TYPE) == machine_flags::TYPE_ARCADE)
+ {
+ action(machine.system(), nullptr, nullptr, done);
+ }
+ else
+ {
+ bool have_software(false);
+ for (device_image_interface &image_dev : image_interface_iterator(machine.root_device()))
+ {
+ software_info const *const sw(image_dev.software_entry());
+ if (image_dev.exists() && image_dev.loaded_through_softlist() && sw)
+ {
+ assert(image_dev.software_list_name());
+
+ have_software = true;
+ action(machine.system(), &image_dev, sw, done);
+ if (done)
+ return;
+ }
+ }
+
+ if (!have_software)
+ action(machine.system(), nullptr, nullptr, done);
+ }
+}
+
+void favorite_manager::update_sorted()
+{
+ if (m_need_sort)
+ {
+ if (m_sorted.empty())
+ std::copy(m_favorites.begin(), m_favorites.end(), std::back_inserter(m_sorted));
+
+ assert(m_favorites.size() == m_sorted.size());
+ std::stable_sort(
+ m_sorted.begin(),
+ m_sorted.end(),
+ [] (ui_software_info const &lhs, ui_software_info const &rhs) -> bool
+ {
+ assert(lhs.driver);
+ assert(rhs.driver);
+
+ int cmp;
+
+ cmp = core_stricmp(lhs.longname.c_str(), rhs.longname.c_str());
+ if (0 > cmp)
+ return true;
+ else if (0 < cmp)
+ return false;
+
+ cmp = core_stricmp(lhs.driver->type.fullname(), rhs.driver->type.fullname());
+ if (0 > cmp)
+ return true;
+ else if (0 < cmp)
+ return false;
+
+ cmp = std::strcmp(lhs.listname.c_str(), rhs.listname.c_str());
+ if (0 > cmp)
+ return true;
+ else if (0 < cmp)
+ return false;
+
+ return false;
+ });
+
+ m_need_sort = false;
+ }
+}
+
+void favorite_manager::save_favorites()
{
// attempt to open the output file
emu_file file(m_options.ui_path(), OPEN_FLAG_WRITE | OPEN_FLAG_CREATE | OPEN_FLAG_CREATE_PATHS);
- if (file.open(favorite_filename) == osd_file::error::NONE)
+ if (file.open(FAVORITE_FILENAME) == osd_file::error::NONE)
{
- if (m_list.empty())
+ if (m_favorites.empty())
{
+ // delete it if there are no favorites
file.remove_on_close();
- file.close();
- return;
}
-
- // generate the favorite INI
- std::ostringstream text;
- text << "[ROOT_FOLDER]\n[Favorite]\n\n";
- for (auto & e : m_list)
+ else
{
- auto elem = e.second;
- text << elem.shortname << '\n';
- text << elem.longname << '\n';
- text << elem.parentname << '\n';
- text << elem.year << '\n';
- text << elem.publisher << '\n';
- util::stream_format(text, "%d\n", elem.supported);
- text << elem.part << '\n';
- util::stream_format(text, "%s\n", elem.driver->name);
- text << elem.listname << '\n';
- text << elem.interface << '\n';
- text << elem.instance << '\n';
- util::stream_format(text, "%d\n", elem.startempty);
- text << elem.parentlongname << '\n';
- text << elem.usage << '\n';
- text << elem.devicetype << '\n';
- util::stream_format(text, "%d\n", elem.available);
+ // generate the favorite INI
+ file.puts("[ROOT_FOLDER]\n[Favorite]\n\n");
+ util::ovectorstream buf;
+ for (ui_software_info const &info : m_favorites)
+ {
+ buf.clear();
+ buf.rdbuf()->clear();
+
+ buf << info.shortname << '\n';
+ buf << info.longname << '\n';
+ buf << info.parentname << '\n';
+ buf << info.year << '\n';
+ buf << info.publisher << '\n';
+ util::stream_format(buf, "%d\n", info.supported);
+ buf << info.part << '\n';
+ util::stream_format(buf, "%s\n", info.driver->name);
+ buf << info.listname << '\n';
+ buf << info.interface << '\n';
+ buf << info.instance << '\n';
+ util::stream_format(buf, "%d\n", info.startempty);
+ buf << info.parentlongname << '\n';
+ buf << info.usage << '\n';
+ buf << info.devicetype << '\n';
+ util::stream_format(buf, "%d\n", info.available);
+
+ buf.put('\0');
+ file.puts(&buf.vec()[0]);
+ }
}
- file.puts(text.str().c_str());
file.close();
}
}
diff --git a/src/frontend/mame/ui/inifile.h b/src/frontend/mame/ui/inifile.h
index 49344fd01eb..68adca3c917 100644
--- a/src/frontend/mame/ui/inifile.h
+++ b/src/frontend/mame/ui/inifile.h
@@ -1,5 +1,5 @@
// license:BSD-3-Clause
-// copyright-holders:Maurizio Petrarota
+// copyright-holders:Maurizio Petrarota, Vas Crabb
/***************************************************************************
ui/inifile.h
@@ -7,7 +7,6 @@
UI INIs file manager.
***************************************************************************/
-
#ifndef MAME_FRONTEND_UI_INIFILE_H
#define MAME_FRONTEND_UI_INIFILE_H
@@ -15,6 +14,10 @@
#include "ui/utils.h"
+#include <functional>
+#include <set>
+#include <tuple>
+#include <type_traits>
#include <unordered_set>
@@ -28,7 +31,7 @@ class inifile_manager
{
public:
// construction/destruction
- inifile_manager(running_machine &machine, ui_options &moptions);
+ inifile_manager(ui_options &options);
// load systems from category
void load_ini_category(size_t file, size_t category, std::unordered_set<game_driver const *> &result) const;
@@ -59,52 +62,67 @@ class favorite_manager
{
public:
// construction/destruction
- favorite_manager(running_machine &machine, ui_options &moptions);
-
- // favorites comparator
- struct ci_less
- {
- bool operator() (const std::string &s1, const std::string &s2) const
- {
- return (core_stricmp(s1.c_str(), s2.c_str()) < 0);
- }
- };
-
- // favorite indices
- std::multimap<std::string, ui_software_info, ci_less> m_list;
-
- // getters
- running_machine &machine() const { return m_machine; }
+ favorite_manager(ui_options &options);
// add
- void add_favorite_game();
- void add_favorite_game(const game_driver *driver);
- void add_favorite_game(ui_software_info &swinfo);
+ void add_favorite_system(game_driver const &driver);
+ void add_favorite_software(ui_software_info const &swinfo);
+ void add_favorite(running_machine &machine);
// check
- bool isgame_favorite();
- bool isgame_favorite(const game_driver *driver);
- bool isgame_favorite(ui_software_info const &swinfo);
-
- // save
- void save_favorite_games();
+ bool is_favorite_system(game_driver const &driver) const;
+ bool is_favorite_software(ui_software_info const &swinfo) const;
+ bool is_favorite_system_software(ui_software_info const &swinfo) const;
+ bool is_favorite(running_machine &machine) const;
// remove
- void remove_favorite_game();
- void remove_favorite_game(ui_software_info const &swinfo);
+ void remove_favorite_system(game_driver const &driver);
+ void remove_favorite_software(ui_software_info const &swinfo);
+ void remove_favorite(running_machine &machine);
+
+ // walk
+ template <typename T> void apply(T &&action)
+ {
+ for (auto const &item : m_favorites)
+ action(item);
+ }
+ template <typename T> void apply_sorted(T &&action)
+ {
+ update_sorted();
+ for (auto const &item : m_sorted)
+ action(item.get());
+ }
private:
- const char *favorite_filename = "favorites.ini";
+ using running_software_key = std::tuple<game_driver const &, char const *, std::string const &>;
+
+ struct favorite_compare
+ {
+ using is_transparent = std::true_type;
+
+ bool operator()(ui_software_info const &lhs, ui_software_info const &rhs) const;
+ bool operator()(ui_software_info const &lhs, game_driver const &rhs) const;
+ bool operator()(game_driver const &lhs, ui_software_info const &rhs) const;
+ bool operator()(ui_software_info const &lhs, running_software_key const &rhs) const;
+ bool operator()(running_software_key const &lhs, ui_software_info const &rhs) const;
+ };
- // current
- std::multimap<std::string, ui_software_info>::iterator m_current;
+ using favorites_set = std::set<ui_software_info, favorite_compare>;
+ using sorted_favorites = std::vector<std::reference_wrapper<ui_software_info const> >;
- // parse file ui_favorite
- void parse_favorite();
+ // implementation
+ template <typename T> static void apply_running_machine(running_machine &machine, T &&action);
+ template <typename T> void add_impl(T &&key);
+ template <typename T> bool check_impl(T const &key) const;
+ template <typename T> bool remove_impl(T const &key);
+ void update_sorted();
+ void save_favorites();
// internal state
- running_machine &m_machine; // reference to our machine
ui_options &m_options;
+ favorites_set m_favorites;
+ sorted_favorites m_sorted;
+ bool m_need_sort;
};
#endif // MAME_FRONTEND_UI_INIFILE_H
diff --git a/src/frontend/mame/ui/mainmenu.cpp b/src/frontend/mame/ui/mainmenu.cpp
index 30b2fbae1e0..b9befd90991 100644
--- a/src/frontend/mame/ui/mainmenu.cpp
+++ b/src/frontend/mame/ui/mainmenu.cpp
@@ -123,7 +123,7 @@ void menu_main::populate(float &customtop, float &custombottom)
item_append(menu_item_type::SEPARATOR);
- if (!mame_machine_manager::instance()->favorite().isgame_favorite())
+ if (!mame_machine_manager::instance()->favorite().is_favorite(machine()))
item_append(_("Add To Favorites"), "", 0, (void *)ADD_FAVORITE);
else
item_append(_("Remove From Favorites"), "", 0, (void *)REMOVE_FAVORITE);
@@ -249,12 +249,12 @@ void menu_main::handle()
break;
case ADD_FAVORITE:
- mame_machine_manager::instance()->favorite().add_favorite_game();
+ mame_machine_manager::instance()->favorite().add_favorite(machine());
reset(reset_options::REMEMBER_POSITION);
break;
case REMOVE_FAVORITE:
- mame_machine_manager::instance()->favorite().remove_favorite_game();
+ mame_machine_manager::instance()->favorite().remove_favorite(machine());
reset(reset_options::REMEMBER_POSITION);
break;
diff --git a/src/frontend/mame/ui/menu.cpp b/src/frontend/mame/ui/menu.cpp
index 3a0eff12c5e..eecaab68978 100644
--- a/src/frontend/mame/ui/menu.cpp
+++ b/src/frontend/mame/ui/menu.cpp
@@ -31,6 +31,7 @@
namespace ui {
+
/***************************************************************************
CONSTANTS
***************************************************************************/
@@ -85,14 +86,14 @@ menu::global_state::global_state(running_machine &machine, ui_options const &opt
, m_machine(machine)
, m_cleanup_callbacks()
, m_bgrnd_bitmap()
+ , m_bgrnd_texture(nullptr, machine.render())
, m_stack()
, m_free()
{
render_manager &render(machine.render());
- auto const texture_free([&render](render_texture *texture) { render.texture_free(texture); });
// create a texture for main menu background
- m_bgrnd_texture = texture_ptr(render.texture_alloc(render_texture::hq_scale), texture_free);
+ m_bgrnd_texture.reset(render.texture_alloc(render_texture::hq_scale));
if (options.use_background_image() && (&machine.system() == &GAME_NAME(___empty)))
{
m_bgrnd_bitmap = std::make_unique<bitmap_argb32>(0, 0);
@@ -161,8 +162,17 @@ void menu::global_state::stack_reset()
void menu::global_state::clear_free_list()
{
+ // free stack is in reverse order - unwind it properly
+ std::unique_ptr<menu> reversed;
while (m_free)
- m_free = std::move(m_free->m_parent);
+ {
+ std::unique_ptr<menu> menu(std::move(m_free));
+ m_free = std::move(menu->m_parent);
+ menu->m_parent = std::move(reversed);
+ reversed = std::move(menu);
+ }
+ while (reversed)
+ reversed = std::move(reversed->m_parent);
}
diff --git a/src/frontend/mame/ui/menu.h b/src/frontend/mame/ui/menu.h
index 1a6c2d977f8..ffcb0ed71e8 100644
--- a/src/frontend/mame/ui/menu.h
+++ b/src/frontend/mame/ui/menu.h
@@ -27,6 +27,7 @@
namespace ui {
+
/***************************************************************************
TYPE DEFINITIONS
***************************************************************************/
@@ -35,18 +36,17 @@ class menu
{
public:
// flags for menu items
- enum
+ enum : unsigned
{
- FLAG_LEFT_ARROW = (1 << 0),
- FLAG_RIGHT_ARROW = (1 << 1),
- FLAG_INVERT = (1 << 2),
- FLAG_MULTILINE = (1 << 3),
- FLAG_REDTEXT = (1 << 4),
- FLAG_DISABLE = (1 << 5),
- FLAG_UI_DATS = (1 << 6),
- FLAG_UI_FAVORITE = (1 << 7),
- FLAG_UI_HEADING = (1 << 8),
- FLAG_COLOR_BOX = (1 << 9)
+ FLAG_LEFT_ARROW = 1U << 0,
+ FLAG_RIGHT_ARROW = 1U << 1,
+ FLAG_INVERT = 1U << 2,
+ FLAG_MULTILINE = 1U << 3,
+ FLAG_REDTEXT = 1U << 4,
+ FLAG_DISABLE = 1U << 5,
+ FLAG_UI_DATS = 1U << 6,
+ FLAG_UI_HEADING = 1U << 7,
+ FLAG_COLOR_BOX = 1U << 8
};
virtual ~menu();
@@ -151,7 +151,6 @@ protected:
void reset(reset_options options);
void reset_parent(reset_options options) { m_parent->reset(options); }
- void reset_topmost(reset_options options) { m_global_state->reset_topmost(options); }
template <typename T> T *topmost_menu() const { return m_global_state->topmost_menu<T>(); }
template <typename T> static T *topmost_menu(running_machine &machine) { return get_global_state(machine)->topmost_menu<T>(); }
@@ -310,8 +309,6 @@ private:
bitmap_argb32 *bgrnd_bitmap() { return m_bgrnd_bitmap.get(); }
render_texture *bgrnd_texture() { return m_bgrnd_texture.get(); }
- void reset_topmost(reset_options options) { if (m_stack) m_stack->reset(options); }
-
template <typename T>
T *topmost_menu() const { return dynamic_cast<T *>(m_stack.get()); }
diff --git a/src/frontend/mame/ui/miscmenu.cpp b/src/frontend/mame/ui/miscmenu.cpp
index 57b1412dd5d..e2f1f0615fc 100644
--- a/src/frontend/mame/ui/miscmenu.cpp
+++ b/src/frontend/mame/ui/miscmenu.cpp
@@ -663,25 +663,40 @@ void menu_export::populate(float &customtop, float &custombottom)
// ctor / dtor
//-------------------------------------------------
-menu_machine_configure::menu_machine_configure(mame_ui_manager &mui, render_container &container, const game_driver *prev, float _x0, float _y0)
+menu_machine_configure::menu_machine_configure(
+ mame_ui_manager &mui,
+ render_container &container,
+ game_driver const &drv,
+ std::function<void (bool, bool)> &&handler,
+ float x0, float y0)
: menu(mui, container)
- , m_drv(prev)
- , x0(_x0)
- , y0(_y0)
+ , m_handler(std::move(handler))
+ , m_drv(drv)
+ , m_x0(x0)
+ , m_y0(y0)
, m_curbios(0)
- , m_fav_reset(false)
+ , m_was_favorite(mame_machine_manager::instance()->favorite().is_favorite_system(drv))
+ , m_want_favorite(m_was_favorite)
{
// parse the INI file
std::ostringstream error;
osd_setup_osd_specific_emu_options(m_opts);
- mame_options::parse_standard_inis(m_opts, error, m_drv);
+ mame_options::parse_standard_inis(m_opts, error, &m_drv);
setup_bios();
}
menu_machine_configure::~menu_machine_configure()
{
- if (m_fav_reset)
- reset_topmost(reset_options::SELECT_FIRST);
+ if (m_was_favorite != m_want_favorite)
+ {
+ if (m_want_favorite)
+ mame_machine_manager::instance()->favorite().add_favorite_system(m_drv);
+ else
+ mame_machine_manager::instance()->favorite().remove_favorite_system(m_drv);
+ }
+
+ if (m_handler)
+ m_handler(m_want_favorite, m_was_favorite != m_want_favorite);
}
//-------------------------------------------------
@@ -692,16 +707,16 @@ void menu_machine_configure::handle()
{
// process the menu
process_parent();
- const event *menu_event = process(PROCESS_NOIMAGE, x0, y0);
+ const event *menu_event = process(PROCESS_NOIMAGE, m_x0, m_y0);
if (menu_event != nullptr && menu_event->itemref != nullptr)
{
if (menu_event->iptkey == IPT_UI_SELECT)
{
switch ((uintptr_t)menu_event->itemref)
{
- case SAVE:
+ case SAVE:
{
- std::string filename(m_drv->name);
+ std::string filename(m_drv.name);
emu_file file(machine().options().ini_path(), OPEN_FLAG_WRITE | OPEN_FLAG_CREATE);
osd_file::error filerr = file.open(filename.c_str(), ".ini");
if (filerr == osd_file::error::NONE)
@@ -710,36 +725,30 @@ void menu_machine_configure::handle()
file.puts(inistring.c_str());
ui().popup_time(2, "%s", _("\n Configuration saved \n\n"));
}
- break;
}
- case ADDFAV:
- mame_machine_manager::instance()->favorite().add_favorite_game(m_drv);
- reset(reset_options::REMEMBER_POSITION);
- break;
- case DELFAV:
- mame_machine_manager::instance()->favorite().remove_favorite_game();
- if (main_filters::actual == machine_filter::FAVORITE)
- {
- m_fav_reset = true;
- menu::stack_pop();
- }
- else
- reset(reset_options::REMEMBER_POSITION);
- break;
- case CONTROLLER:
- if (menu_event->iptkey == IPT_UI_SELECT)
- menu::stack_push<submenu>(ui(), container(), submenu::control_options, m_drv, &m_opts);
- break;
- case VIDEO:
- if (menu_event->iptkey == IPT_UI_SELECT)
- menu::stack_push<submenu>(ui(), container(), submenu::video_options, m_drv, &m_opts);
- break;
- case ADVANCED:
- if (menu_event->iptkey == IPT_UI_SELECT)
- menu::stack_push<submenu>(ui(), container(), submenu::advanced_options, m_drv, &m_opts);
- break;
- default:
- break;
+ break;
+ case ADDFAV:
+ m_want_favorite = true;
+ reset(reset_options::REMEMBER_POSITION);
+ break;
+ case DELFAV:
+ m_want_favorite = false;
+ reset(reset_options::REMEMBER_POSITION);
+ break;
+ case CONTROLLER:
+ if (menu_event->iptkey == IPT_UI_SELECT)
+ menu::stack_push<submenu>(ui(), container(), submenu::control_options, &m_drv, &m_opts);
+ break;
+ case VIDEO:
+ if (menu_event->iptkey == IPT_UI_SELECT)
+ menu::stack_push<submenu>(ui(), container(), submenu::video_options, &m_drv, &m_opts);
+ break;
+ case ADVANCED:
+ if (menu_event->iptkey == IPT_UI_SELECT)
+ menu::stack_push<submenu>(ui(), container(), submenu::advanced_options, &m_drv, &m_opts);
+ break;
+ default:
+ break;
}
}
else if (menu_event->iptkey == IPT_UI_LEFT || menu_event->iptkey == IPT_UI_RIGHT)
@@ -773,7 +782,7 @@ void menu_machine_configure::populate(float &customtop, float &custombottom)
item_append(_(submenu::control_options[0].description), "", 0, (void *)(uintptr_t)CONTROLLER);
item_append(menu_item_type::SEPARATOR);
- if (!mame_machine_manager::instance()->favorite().isgame_favorite(m_drv))
+ if (!m_want_favorite)
item_append(_("Add To Favorites"), "", 0, (void *)ADDFAV);
else
item_append(_("Remove From Favorites"), "", 0, (void *)DELFAV);
@@ -790,7 +799,7 @@ void menu_machine_configure::populate(float &customtop, float &custombottom)
void menu_machine_configure::custom_render(void *selectedref, float top, float bottom, float origx1, float origy1, float origx2, float origy2)
{
- char const *const text[] = { _("Configure machine:"), m_drv->type.fullname() };
+ char const *const text[] = { _("Configure machine:"), m_drv.type.fullname() };
draw_text_box(
std::begin(text), std::end(text),
origx1, origx2, origy1 - top, origy1 - UI_BOX_TB_BORDER,
@@ -800,19 +809,19 @@ void menu_machine_configure::custom_render(void *selectedref, float top, float b
void menu_machine_configure::setup_bios()
{
- if (m_drv->rom == nullptr)
+ if (!m_drv.rom)
return;
std::string specbios(m_opts.bios());
char const *default_name(nullptr);
- for (tiny_rom_entry const *rom = m_drv->rom; !ROMENTRY_ISEND(rom); ++rom)
+ for (tiny_rom_entry const *rom = m_drv.rom; !ROMENTRY_ISEND(rom); ++rom)
{
if (ROMENTRY_ISDEFAULT_BIOS(rom))
default_name = rom->name;
}
std::size_t bios_count = 0;
- for (romload::system_bios const &bios : romload::entries(m_drv->rom).get_system_bioses())
+ for (romload::system_bios const &bios : romload::entries(m_drv.rom).get_system_bioses())
{
std::string name(bios.get_description());
u32 const bios_flags(bios.get_value());
diff --git a/src/frontend/mame/ui/miscmenu.h b/src/frontend/mame/ui/miscmenu.h
index 65ef235de57..4df94c60a78 100644
--- a/src/frontend/mame/ui/miscmenu.h
+++ b/src/frontend/mame/ui/miscmenu.h
@@ -20,6 +20,7 @@
#include <vector>
namespace ui {
+
class menu_keyboard_mode : public menu
{
public:
@@ -134,7 +135,12 @@ private:
class menu_machine_configure : public menu
{
public:
- menu_machine_configure(mame_ui_manager &mui, render_container &container, const game_driver *prev, float x0 = 0.0f, float y0 = 0.0f);
+ menu_machine_configure(
+ mame_ui_manager &mui,
+ render_container &container,
+ game_driver const &drv,
+ std::function<void (bool, bool)> &&handler = nullptr,
+ float x0 = 0.0f, float y0 = 0.0f);
virtual ~menu_machine_configure();
protected:
@@ -158,13 +164,17 @@ private:
virtual void populate(float &customtop, float &custombottom) override;
virtual void handle() override;
- const game_driver *m_drv;
+ void setup_bios();
+
+ std::function<void (bool, bool)> const m_handler;
+ game_driver const &m_drv;
emu_options m_opts;
- float x0, y0;
+ float const m_x0;
+ float const m_y0;
s_bios m_bios;
std::size_t m_curbios;
- void setup_bios();
- bool m_fav_reset;
+ bool const m_was_favorite;
+ bool m_want_favorite;
};
//-------------------------------------------------
@@ -186,4 +196,4 @@ protected:
} // namespace ui
-#endif /* MAME_FRONTEND_UI_MISCMENU_H */
+#endif // MAME_FRONTEND_UI_MISCMENU_H
diff --git a/src/frontend/mame/ui/optsmenu.cpp b/src/frontend/mame/ui/optsmenu.cpp
index fd29c3329bc..4452fae9bce 100644
--- a/src/frontend/mame/ui/optsmenu.cpp
+++ b/src/frontend/mame/ui/optsmenu.cpp
@@ -30,182 +30,44 @@ namespace ui {
// ctor
//-------------------------------------------------
-menu_game_options::menu_game_options(mame_ui_manager &mui, render_container &container) : menu(mui, container)
+menu_simple_game_options::menu_simple_game_options(
+ mame_ui_manager &mui,
+ render_container &container,
+ std::function<void ()> &&handler)
+ : menu(mui, container)
+ , m_handler(std::move(handler))
{
- m_main = main_filters::actual;
}
//-------------------------------------------------
// dtor
//-------------------------------------------------
-menu_game_options::~menu_game_options()
+menu_simple_game_options::~menu_simple_game_options()
{
- main_filters::actual = m_main;
- reset_topmost(reset_options::SELECT_FIRST);
ui().save_ui_options();
- ui_globals::switch_image = true;
+ if (m_handler)
+ m_handler();
}
//-------------------------------------------------
// handle
//-------------------------------------------------
-void menu_game_options::handle()
+void menu_simple_game_options::handle()
{
- bool changed = false;
-
// process the menu
- const event *menu_event;
- if (machine().options().ui() == emu_options::UI_SIMPLE)
- {
- menu_event = process(PROCESS_LR_REPEAT);
- }
- else
- {
- process_parent();
- menu_event = process(PROCESS_LR_REPEAT | PROCESS_NOIMAGE);
- }
-
- if (menu_event != nullptr && menu_event->itemref != nullptr)
- switch ((uintptr_t)menu_event->itemref)
- {
- case FILTER_MENU:
- if (menu_event->iptkey == IPT_UI_LEFT || menu_event->iptkey == IPT_UI_RIGHT)
- {
- (menu_event->iptkey == IPT_UI_RIGHT) ? ++m_main : --m_main;
- changed = true;
- }
- else if (menu_event->iptkey == IPT_UI_SELECT)
- {
- std::vector<std::string> s_sel(machine_filter::COUNT);
- for (unsigned index = 0; index < s_sel.size(); ++index)
- s_sel[index] = machine_filter::display_name(machine_filter::type(index));
-
- menu::stack_push<menu_selector>(
- ui(), container(), std::move(s_sel), m_main,
- [this] (int selection)
- {
- m_main = machine_filter::type(selection);
- reset(reset_options::REMEMBER_REF);
- });
- }
- break;
- case FILTER_ADJUST:
- if (menu_event->iptkey == IPT_UI_LEFT)
- {
- changed = main_filters::filters.find(m_main)->second->adjust_left();
- }
- else if (menu_event->iptkey == IPT_UI_RIGHT)
- {
- changed = main_filters::filters.find(m_main)->second->adjust_right();
- }
- else if (menu_event->iptkey == IPT_UI_SELECT)
- {
- main_filters::filters.find(m_main)->second->show_ui(
- ui(),
- container(),
- [this] (machine_filter &filter)
- {
- if (machine_filter::CUSTOM == filter.get_type())
- {
- emu_file file(ui().options().ui_path(), OPEN_FLAG_WRITE | OPEN_FLAG_CREATE | OPEN_FLAG_CREATE_PATHS);
- if (file.open("custom_", emulator_info::get_configname(), "_filter.ini") == osd_file::error::NONE)
- {
- filter.save_ini(file, 0);
- file.close();
- }
- }
- reset(reset_options::REMEMBER_REF);
- });
- }
- break;
- case CONF_DIR:
- if (menu_event->iptkey == IPT_UI_SELECT)
- menu::stack_push<menu_directory>(ui(), container());
- break;
- case MISC_MENU:
- if (menu_event->iptkey == IPT_UI_SELECT)
- {
- menu::stack_push<submenu>(ui(), container(), submenu::misc_options);
- ui_globals::reset = true;
- }
- break;
- case SOUND_MENU:
- if (menu_event->iptkey == IPT_UI_SELECT)
- {
- menu::stack_push<menu_sound_options>(ui(), container());
- ui_globals::reset = true;
- }
- break;
- case DISPLAY_MENU:
- if (menu_event->iptkey == IPT_UI_SELECT)
- {
- menu::stack_push<submenu>(ui(), container(), submenu::video_options);
- ui_globals::reset = true;
- }
- break;
- case CUSTOM_MENU:
- if (menu_event->iptkey == IPT_UI_SELECT)
- menu::stack_push<menu_custom_ui>(ui(), container());
- break;
- case CONTROLLER_MENU:
- if (menu_event->iptkey == IPT_UI_SELECT)
- menu::stack_push<submenu>(ui(), container(), submenu::control_options);
- break;
- case CGI_MENU:
- if (menu_event->iptkey == IPT_UI_SELECT)
- menu::stack_push<menu_input_groups>(ui(), container());
- break;
- case ADVANCED_MENU:
- if (menu_event->iptkey == IPT_UI_SELECT)
- {
- menu::stack_push<submenu>(ui(), container(), submenu::advanced_options);
- ui_globals::reset = true;
- }
- break;
- case SAVE_CONFIG:
- if (menu_event->iptkey == IPT_UI_SELECT)
- ui().save_main_option();
- break;
- }
-
- if (changed)
- reset(reset_options::REMEMBER_REF);
+ event const *const menu_event(process(PROCESS_LR_REPEAT));
+ if (menu_event && menu_event->itemref)
+ handle_item_event(*menu_event);
}
//-------------------------------------------------
// populate
//-------------------------------------------------
-void menu_game_options::populate(float &customtop, float &custombottom)
+void menu_simple_game_options::populate(float &customtop, float &custombottom)
{
- if (machine().options().ui() != emu_options::UI_SIMPLE)
- {
- // set filter arrow
- std::string fbuff;
-
- // add filter item
- uint32_t arrow_flags = get_arrow_flags<uint16_t>(machine_filter::FIRST, machine_filter::LAST, m_main);
- auto active_filter(main_filters::filters.find(m_main));
- if (main_filters::filters.end() == active_filter)
- active_filter = main_filters::filters.emplace(m_main, machine_filter::create(m_main)).first;
- item_append(_("Filter"), active_filter->second->display_name(), arrow_flags, (void *)(uintptr_t)FILTER_MENU);
-
- // add subitem if the filter wants it
- if (active_filter->second->wants_adjuster())
- {
- std::string name("^!");
- convert_command_glyph(name);
- item_append(name, active_filter->second->adjust_text(), active_filter->second->arrow_flags(), (void *)(FILTER_ADJUST));
- }
-
- item_append(menu_item_type::SEPARATOR);
-
- // add options items
- item_append(_("Customize UI"), "", 0, (void *)(uintptr_t)CUSTOM_MENU);
- item_append(_("Configure Directories"), "", 0, (void *)(uintptr_t)CONF_DIR);
- }
item_append(_(submenu::video_options[0].description), "", 0, (void *)(uintptr_t)DISPLAY_MENU);
item_append(_("Sound Options"), "", 0, (void *)(uintptr_t)SOUND_MENU);
item_append(_(submenu::misc_options[0].description), "", 0, (void *)(uintptr_t)MISC_MENU);
@@ -220,10 +82,61 @@ void menu_game_options::populate(float &customtop, float &custombottom)
}
//-------------------------------------------------
+// handle item
+//-------------------------------------------------
+
+void menu_simple_game_options::handle_item_event(event const &menu_event)
+{
+ switch ((uintptr_t)menu_event.itemref)
+ {
+ case MISC_MENU:
+ if (menu_event.iptkey == IPT_UI_SELECT)
+ {
+ menu::stack_push<submenu>(ui(), container(), submenu::misc_options);
+ ui_globals::reset = true;
+ }
+ break;
+ case SOUND_MENU:
+ if (menu_event.iptkey == IPT_UI_SELECT)
+ {
+ menu::stack_push<menu_sound_options>(ui(), container());
+ ui_globals::reset = true;
+ }
+ break;
+ case DISPLAY_MENU:
+ if (menu_event.iptkey == IPT_UI_SELECT)
+ {
+ menu::stack_push<submenu>(ui(), container(), submenu::video_options);
+ ui_globals::reset = true;
+ }
+ break;
+ case CONTROLLER_MENU:
+ if (menu_event.iptkey == IPT_UI_SELECT)
+ menu::stack_push<submenu>(ui(), container(), submenu::control_options);
+ break;
+ case CGI_MENU:
+ if (menu_event.iptkey == IPT_UI_SELECT)
+ menu::stack_push<menu_input_groups>(ui(), container());
+ break;
+ case ADVANCED_MENU:
+ if (menu_event.iptkey == IPT_UI_SELECT)
+ {
+ menu::stack_push<submenu>(ui(), container(), submenu::advanced_options);
+ ui_globals::reset = true;
+ }
+ break;
+ case SAVE_CONFIG:
+ if (menu_event.iptkey == IPT_UI_SELECT)
+ ui().save_main_option();
+ break;
+ }
+}
+
+//-------------------------------------------------
// perform our special rendering
//-------------------------------------------------
-void menu_game_options::custom_render(void *selectedref, float top, float bottom, float origx1, float origy1, float origx2, float origy2)
+void menu_simple_game_options::custom_render(void *selectedref, float top, float bottom, float origx1, float origy1, float origx2, float origy2)
{
char const *const toptext[] = { _("Settings") };
draw_text_box(
@@ -234,4 +147,150 @@ void menu_game_options::custom_render(void *selectedref, float top, float bottom
}
+//-------------------------------------------------
+// ctor
+//-------------------------------------------------
+
+menu_game_options::menu_game_options(
+ mame_ui_manager &mui,
+ render_container &container,
+ machine_filter_data &filter_data,
+ std::function<void ()> &&handler)
+ : menu_simple_game_options(mui, container, std::move(handler))
+ , m_filter_data(filter_data)
+ , m_main_filter(filter_data.get_current_filter_type())
+{
+}
+
+//-------------------------------------------------
+// dtor
+//-------------------------------------------------
+
+menu_game_options::~menu_game_options()
+{
+ m_filter_data.set_current_filter_type(m_main_filter);
+}
+
+//-------------------------------------------------
+// handle
+//-------------------------------------------------
+
+void menu_game_options::handle()
+{
+ // process the menu
+ process_parent();
+ event const *const menu_event(process(PROCESS_LR_REPEAT | PROCESS_NOIMAGE));
+ if (menu_event && menu_event->itemref)
+ handle_item_event(*menu_event);
+}
+
+//-------------------------------------------------
+// populate
+//-------------------------------------------------
+
+void menu_game_options::populate(float &customtop, float &custombottom)
+{
+ // set filter arrow
+ std::string fbuff;
+
+ // add filter item
+ uint32_t arrow_flags = get_arrow_flags<uint16_t>(machine_filter::FIRST, machine_filter::LAST, m_main_filter);
+ machine_filter &active_filter(m_filter_data.get_filter(m_main_filter));
+ item_append(_("Filter"), active_filter.display_name(), arrow_flags, (void *)(uintptr_t)FILTER_MENU);
+
+ // add subitem if the filter wants it
+ if (active_filter.wants_adjuster())
+ {
+ std::string name("^!");
+ convert_command_glyph(name);
+ item_append(name, active_filter.adjust_text(), active_filter.arrow_flags(), (void *)(FILTER_ADJUST));
+ }
+
+ item_append(menu_item_type::SEPARATOR);
+
+ // add options items
+ item_append(_("Customize UI"), "", 0, (void *)(uintptr_t)CUSTOM_MENU);
+ item_append(_("Configure Directories"), "", 0, (void *)(uintptr_t)CONF_DIR);
+
+ // add the options that don't relate to the UI
+ menu_simple_game_options::populate(customtop, custombottom);
+}
+
+//-------------------------------------------------
+// handle item
+//-------------------------------------------------
+
+void menu_game_options::handle_item_event(event const &menu_event)
+{
+ bool changed = false;
+
+ switch ((uintptr_t)menu_event.itemref)
+ {
+ case FILTER_MENU:
+ if (menu_event.iptkey == IPT_UI_LEFT || menu_event.iptkey == IPT_UI_RIGHT)
+ {
+ (menu_event.iptkey == IPT_UI_RIGHT) ? ++m_main_filter : --m_main_filter;
+ changed = true;
+ }
+ else if (menu_event.iptkey == IPT_UI_SELECT)
+ {
+ std::vector<std::string> s_sel(machine_filter::COUNT);
+ for (unsigned index = 0; index < s_sel.size(); ++index)
+ s_sel[index] = machine_filter::display_name(machine_filter::type(index));
+
+ menu::stack_push<menu_selector>(
+ ui(), container(), std::move(s_sel), m_main_filter,
+ [this] (int selection)
+ {
+ m_main_filter = machine_filter::type(selection);
+ reset(reset_options::REMEMBER_REF);
+ });
+ }
+ break;
+ case FILTER_ADJUST:
+ if (menu_event.iptkey == IPT_UI_LEFT)
+ {
+ changed = m_filter_data.get_filter(m_main_filter).adjust_left();
+ }
+ else if (menu_event.iptkey == IPT_UI_RIGHT)
+ {
+ changed = m_filter_data.get_filter(m_main_filter).adjust_right();
+ }
+ else if (menu_event.iptkey == IPT_UI_SELECT)
+ {
+ m_filter_data.get_filter(m_main_filter).show_ui(
+ ui(),
+ container(),
+ [this] (machine_filter &filter)
+ {
+ if (machine_filter::CUSTOM == filter.get_type())
+ {
+ emu_file file(ui().options().ui_path(), OPEN_FLAG_WRITE | OPEN_FLAG_CREATE | OPEN_FLAG_CREATE_PATHS);
+ if (file.open("custom_", emulator_info::get_configname(), "_filter.ini") == osd_file::error::NONE)
+ {
+ filter.save_ini(file, 0);
+ file.close();
+ }
+ }
+ reset(reset_options::REMEMBER_REF);
+ });
+ }
+ break;
+ case CONF_DIR:
+ if (menu_event.iptkey == IPT_UI_SELECT)
+ menu::stack_push<menu_directory>(ui(), container());
+ break;
+ case CUSTOM_MENU:
+ if (menu_event.iptkey == IPT_UI_SELECT)
+ menu::stack_push<menu_custom_ui>(ui(), container());
+ break;
+ default:
+ menu_simple_game_options::handle_item_event(menu_event);
+ return;
+ }
+
+ if (changed)
+ reset(reset_options::REMEMBER_REF);
+}
+
} // namespace ui
diff --git a/src/frontend/mame/ui/optsmenu.h b/src/frontend/mame/ui/optsmenu.h
index e9650e3a95b..2afe9b68a89 100644
--- a/src/frontend/mame/ui/optsmenu.h
+++ b/src/frontend/mame/ui/optsmenu.h
@@ -17,23 +17,27 @@
namespace ui {
-class menu_game_options : public menu
+
+class menu_simple_game_options : public menu
{
public:
- menu_game_options(mame_ui_manager &mui, render_container &container);
- virtual ~menu_game_options() override;
+ menu_simple_game_options(
+ mame_ui_manager &mui,
+ render_container &container,
+ std::function<void ()> &&handler);
+ virtual ~menu_simple_game_options() override;
protected:
virtual void custom_render(void *selectedref, float top, float bottom, float x, float y, float x2, float y2) override;
+ virtual void handle() override;
+ virtual void populate(float &customtop, float &custombottom) override;
+
+ void handle_item_event(event const &menu_event);
private:
enum
{
- FILTER_MENU = 1,
- FILTER_ADJUST,
- CONF_DIR,
- DISPLAY_MENU,
- CUSTOM_MENU,
+ DISPLAY_MENU = 1001,
SOUND_MENU,
CONTROLLER_MENU,
MISC_MENU,
@@ -43,12 +47,39 @@ private:
SAVE_CONFIG
};
- virtual void populate(float &customtop, float &custombottom) override;
+ std::function<void ()> const m_handler;
+};
+
+
+class menu_game_options : public menu_simple_game_options
+{
+public:
+ menu_game_options(
+ mame_ui_manager &mui,
+ render_container &container,
+ machine_filter_data &filter_data,
+ std::function<void ()> &&handler);
+ virtual ~menu_game_options() override;
+
+protected:
virtual void handle() override;
+ virtual void populate(float &customtop, float &custombottom) override;
+
+ void handle_item_event(event const &menu_event);
+
+private:
+ enum
+ {
+ FILTER_MENU = 2001,
+ FILTER_ADJUST,
+ CONF_DIR,
+ CUSTOM_MENU
+ };
- machine_filter::type m_main;
+ machine_filter_data &m_filter_data;
+ machine_filter::type m_main_filter;
};
} // namespace ui
-#endif /* MAME_FRONTEND_UI_OPTSMENU_H */
+#endif // MAME_FRONTEND_UI_OPTSMENU_H
diff --git a/src/frontend/mame/ui/selector.cpp b/src/frontend/mame/ui/selector.cpp
index 59aa51f9d13..83738641142 100644
--- a/src/frontend/mame/ui/selector.cpp
+++ b/src/frontend/mame/ui/selector.cpp
@@ -60,7 +60,6 @@ void menu_selector::handle()
m_handler(selection);
- ui_globals::switch_image = true;
stack_pop();
}
else if (menu_event->iptkey == IPT_SPECIAL)
@@ -136,12 +135,17 @@ void menu_selector::custom_render(void *selectedref, float top, float bottom, fl
void menu_selector::find_matches(const char *str)
{
// allocate memory to track the penalty value
- std::vector<int> penalty(VISIBLE_GAMES_IN_SEARCH, 9999);
- int index = 0;
+ m_ucs_items.reserve(m_str_items.size());
+ std::vector<double> penalty(VISIBLE_GAMES_IN_SEARCH, 1.0);
+ std::u32string const search(ustr_from_utf8(normalize_unicode(str, unicode_normalization_form::D, true)));
- for (; index < m_str_items.size(); ++index)
+ int index = 0;
+ for ( ; index < m_str_items.size(); ++index)
{
- int curpenalty = fuzzy_substring(str, m_str_items[index]);
+ assert(m_ucs_items.size() >= index);
+ if (m_ucs_items.size() == index)
+ m_ucs_items.emplace_back(ustr_from_utf8(normalize_unicode(m_str_items[index], unicode_normalization_form::D, true)));
+ double const curpenalty(util::edit_distance(search, m_ucs_items[index]));
// insert into the sorted table of matches
for (int matchnum = VISIBLE_GAMES_IN_SEARCH - 1; matchnum >= 0; --matchnum)
diff --git a/src/frontend/mame/ui/selector.h b/src/frontend/mame/ui/selector.h
index bd6a87c4ef9..f3921536267 100644
--- a/src/frontend/mame/ui/selector.h
+++ b/src/frontend/mame/ui/selector.h
@@ -7,14 +7,15 @@
Internal UI user interface.
***************************************************************************/
+#ifndef MAME_FRONTEND_UI_SELECTOR_H
+#define MAME_FRONTEND_UI_SELECTOR_H
#pragma once
-#ifndef MAME_FRONTEND_UI_SELECTOR_H
-#define MAME_FRONTEND_UI_SELECTOR_H
#include "ui/menu.h"
+
namespace ui {
//-------------------------------------------------
@@ -44,11 +45,12 @@ private:
void find_matches(const char *str);
- std::string m_search;
- std::vector<std::string> m_str_items;
- std::function<void (int)> m_handler;
- int m_initial;
- std::string *m_searchlist[VISIBLE_GAMES_IN_SEARCH + 1];
+ std::string m_search;
+ std::vector<std::string> m_str_items;
+ std::function<void (int)> m_handler;
+ std::vector<std::u32string> m_ucs_items;
+ int m_initial;
+ std::string *m_searchlist[VISIBLE_GAMES_IN_SEARCH + 1];
};
} // namespace ui
diff --git a/src/frontend/mame/ui/selgame.cpp b/src/frontend/mame/ui/selgame.cpp
index 0b47fa1d7d1..def4ceaa5f9 100644
--- a/src/frontend/mame/ui/selgame.cpp
+++ b/src/frontend/mame/ui/selgame.cpp
@@ -1,5 +1,5 @@
// license:BSD-3-Clause
-// copyright-holders:Maurizio Petrarota
+// copyright-holders:Maurizio Petrarota, Vas Crabb
/*********************************************************************
ui/selgame.cpp
@@ -12,6 +12,7 @@
#include "ui/selgame.h"
#include "ui/auditmenu.h"
+#include "ui/icorender.h"
#include "ui/inifile.h"
#include "ui/miscmenu.h"
#include "ui/optsmenu.h"
@@ -31,17 +32,190 @@
#include "uiinput.h"
#include "luaengine.h"
+#include <atomic>
+#include <condition_variable>
#include <cstring>
#include <iterator>
+#include <memory>
+#include <mutex>
+#include <thread>
extern const char UI_VERSION_TAG[];
namespace ui {
-bool menu_select_game::first_start = true;
-std::vector<const game_driver *> menu_select_game::m_sortedlist;
-int menu_select_game::m_isabios = 0;
+namespace {
+
+constexpr uint32_t FLAGS_UI = ui::menu::FLAG_LEFT_ARROW | ui::menu::FLAG_RIGHT_ARROW;
+
+} // anonymous namespace
+
+class menu_select_game::persistent_data
+{
+public:
+ enum available : unsigned
+ {
+ AVAIL_NONE = 0U,
+ AVAIL_SORTED_LIST = 1U << 0,
+ AVAIL_BIOS_COUNT = 1U << 1,
+ AVAIL_UCS_SHORTNAME = 1U << 2,
+ AVAIL_UCS_DESCRIPTION = 1U << 3,
+ AVAIL_UCS_MANUF_DESC = 1U << 4,
+ AVAIL_FILTER_DATA = 1U << 5
+ };
+
+ ~persistent_data()
+ {
+ if (m_thread)
+ m_thread->join();
+ }
+
+ void cache_data()
+ {
+ std::unique_lock<std::mutex> lock(m_mutex);
+ do_start_caching();
+ }
+
+ bool is_available(available desired)
+ {
+ return (m_available.load(std::memory_order_acquire) & desired) == desired;
+ }
+
+ void wait_available(available desired)
+ {
+ if (!is_available(desired))
+ {
+ std::unique_lock<std::mutex> lock(m_mutex);
+ do_start_caching();
+ m_condition.wait(lock, [this, desired] () { return is_available(desired); });
+ }
+ }
+
+ std::vector<ui_system_info> &sorted_list()
+ {
+ wait_available(AVAIL_SORTED_LIST);
+ return m_sorted_list;
+ }
+
+ int bios_count()
+ {
+ wait_available(AVAIL_BIOS_COUNT);
+ return m_bios_count;
+ }
+
+ bool unavailable_systems()
+ {
+ wait_available(AVAIL_SORTED_LIST);
+ return std::find_if(m_sorted_list.begin(), m_sorted_list.end(), [] (ui_system_info const &info) { return !info.available; }) != m_sorted_list.end();
+ }
+
+ machine_filter_data &filter_data()
+ {
+ wait_available(AVAIL_FILTER_DATA);
+ return m_filter_data;
+ }
+
+ static persistent_data &instance()
+ {
+ static persistent_data data;
+ return data;
+ }
+
+private:
+ persistent_data()
+ : m_started(false)
+ , m_available(AVAIL_NONE)
+ , m_bios_count(0)
+ {
+ }
+
+ void notify_available(available value)
+ {
+ std::unique_lock<std::mutex> lock(m_mutex);
+ m_available.fetch_or(value, std::memory_order_release);
+ m_condition.notify_all();
+ }
+
+ void do_start_caching()
+ {
+ if (!m_started)
+ {
+ m_started = true;
+ m_thread = std::make_unique<std::thread>([this] { do_cache_data(); });
+ }
+ }
+
+ void do_cache_data()
+ {
+ // generate full list
+ m_sorted_list.reserve(driver_list::total());
+ std::unordered_set<std::string> manufacturers, years;
+ for (int x = 0; x < driver_list::total(); ++x)
+ {
+ game_driver const &driver(driver_list::driver(x));
+ if (&driver != &GAME_NAME(___empty))
+ {
+ if (driver.flags & machine_flags::IS_BIOS_ROOT)
+ ++m_bios_count;
+
+ m_sorted_list.emplace_back(driver, x, false);
+ m_filter_data.add_manufacturer(driver.manufacturer);
+ m_filter_data.add_year(driver.year);
+ }
+ }
+
+ // notify that BIOS count is valie
+ notify_available(AVAIL_BIOS_COUNT);
+
+ // sort drivers and notify
+ std::stable_sort(
+ m_sorted_list.begin(),
+ m_sorted_list.end(),
+ [] (ui_system_info const &lhs, ui_system_info const &rhs) { return sorted_game_list(lhs.driver, rhs.driver); });
+ notify_available(AVAIL_SORTED_LIST);
+
+ // sort manufacturers and years
+ m_filter_data.finalise();
+ notify_available(AVAIL_FILTER_DATA);
+
+ // convert shortnames to UCS-4
+ for (ui_system_info &info : m_sorted_list)
+ info.ucs_shortname = ustr_from_utf8(normalize_unicode(info.driver->name, unicode_normalization_form::D, true));
+ notify_available(AVAIL_UCS_SHORTNAME);
+
+ // convert descriptions to UCS-4
+ for (ui_system_info &info : m_sorted_list)
+ info.ucs_description = ustr_from_utf8(normalize_unicode(info.driver->type.fullname(), unicode_normalization_form::D, true));
+ notify_available(AVAIL_UCS_DESCRIPTION);
+
+ // convert "<manufacturer> <description>" to UCS-4
+ std::string buf;
+ for (ui_system_info &info : m_sorted_list)
+ {
+ buf.assign(info.driver->manufacturer);
+ buf.append(1, ' ');
+ buf.append(info.driver->type.fullname());
+ info.ucs_manufacturer_description = ustr_from_utf8(normalize_unicode(buf, unicode_normalization_form::D, true));
+ }
+ notify_available(AVAIL_UCS_MANUF_DESC);
+ }
+
+ // synchronisation
+ std::mutex m_mutex;
+ std::condition_variable m_condition;
+ std::unique_ptr<std::thread> m_thread;
+ std::atomic<bool> m_started;
+ std::atomic<unsigned> m_available;
+
+ // data
+ std::vector<ui_system_info> m_sorted_list;
+ machine_filter_data m_filter_data;
+ int m_bios_count;
+};
+
+bool menu_select_game::s_first_start = true;
+
//-------------------------------------------------
// ctor
@@ -49,33 +223,30 @@ int menu_select_game::m_isabios = 0;
menu_select_game::menu_select_game(mame_ui_manager &mui, render_container &container, const char *gamename)
: menu_select_launch(mui, container, false)
+ , m_persistent_data(persistent_data::instance())
+ , m_icons(MAX_ICONS_RENDER)
+ , m_icon_paths()
+ , m_displaylist()
+ , m_searchlist()
+ , m_searched_fields(persistent_data::AVAIL_NONE)
+ , m_populated_favorites(false)
{
std::string error_string, last_filter, sub_filter;
ui_options &moptions = mui.options();
// load drivers cache
- init_sorted_list();
+ m_persistent_data.cache_data();
- // check if there are available icons
- ui_globals::has_icons = false;
- file_enumerator path(moptions.icons_directory());
- const osd::directory::entry *dir;
- while ((dir = path.next()) != nullptr)
- {
- std::string src(dir->name);
- if (src.find(".ico") != std::string::npos || src.find("icons") != std::string::npos)
- {
- ui_globals::has_icons = true;
- break;
- }
- }
+ // check if there are available system icons
+ check_for_icons(nullptr);
// build drivers list
if (!load_available_machines())
build_available_list();
- if (first_start)
+ if (s_first_start)
{
+ //s_first_start = false; TODO: why wansn't it ever clearing the first start flag?
reselect_last::set_driver(moptions.last_used_machine());
ui_globals::rpanel = std::min<int>(std::max<int>(moptions.last_right_panel(), RP_FIRST), RP_LAST);
@@ -96,32 +267,23 @@ menu_select_game::menu_select_game(mame_ui_manager &mui, render_container &conta
emu_file file(ui().options().ui_path(), OPEN_FLAG_READ);
if (file.open_ram(fake_ini.c_str(), fake_ini.size()) == osd_file::error::NONE)
{
- machine_filter::ptr flt(machine_filter::create(file));
- if (flt)
- {
- main_filters::actual = flt->get_type();
- main_filters::filters.emplace(main_filters::actual, std::move(flt));
- }
+ m_persistent_data.filter_data().load_ini(file);
file.close();
}
}
// do this after processing the last used filter setting so it overwrites the placeholder
load_custom_filters();
- m_filter_highlight = main_filters::actual;
+ m_filter_highlight = m_persistent_data.filter_data().get_current_filter_type();
if (!moptions.remember_last())
reselect_last::reset();
mui.machine().options().set_value(OPTION_SNAPNAME, "%g/%i", OPTION_PRIORITY_CMDLINE);
- ui_globals::curimage_view = FIRST_VIEW;
ui_globals::curdats_view = 0;
- ui_globals::switch_image = false;
- ui_globals::default_image = true;
ui_globals::panels_status = moptions.hide_panels();
ui_globals::curdats_total = 1;
- m_searchlist[0] = nullptr;
}
//-------------------------------------------------
@@ -140,17 +302,7 @@ menu_select_game::~menu_select_game()
if (driver)
last_driver = driver->name;
- std::string filter;
- auto const active_filter(main_filters::filters.find(main_filters::actual));
- if (main_filters::filters.end() != active_filter)
- {
- char const *val(active_filter->second->filter_text());
- filter = val ? util::string_format("%s,%s", active_filter->second->config_name(), val) : active_filter->second->config_name();
- }
- else
- {
- filter = machine_filter::config_name(main_filters::actual);
- }
+ std::string const filter(m_persistent_data.filter_data().get_config_string());
ui_options &mopt = ui().options();
mopt.set_value(OPTION_LAST_RIGHT_PANEL, ui_globals::rpanel, OPTION_PRIORITY_CMDLINE);
@@ -178,13 +330,13 @@ void menu_select_game::handle()
return;
}
- // if i have to reselect a software, force software list submenu
+ // if I have to select software, force software list submenu
if (reselect_last::get())
{
const game_driver *driver;
const ui_software_info *software;
get_selection(software, driver);
- menu::stack_push<menu_select_software>(ui(), container(), driver);
+ menu::stack_push<menu_select_software>(ui(), container(), *driver);
return;
}
@@ -241,7 +393,7 @@ void menu_select_game::handle()
case IPT_UI_SELECT:
if (get_focus() == focused_menu::MAIN)
{
- if (isfavorite())
+ if (m_populated_favorites)
inkey_select_favorite(menu_event);
else
inkey_select(menu_event);
@@ -250,11 +402,12 @@ void menu_select_game::handle()
case IPT_CUSTOM:
// handle IPT_CUSTOM (mouse right click)
- if (!isfavorite())
+ if (!m_populated_favorites)
{
menu::stack_push<menu_machine_configure>(
ui(), container(),
- reinterpret_cast<const game_driver *>(m_prev_selected),
+ *reinterpret_cast<const game_driver *>(m_prev_selected),
+ nullptr,
menu_event->mouse.x0, menu_event->mouse.y0);
}
else
@@ -262,18 +415,21 @@ void menu_select_game::handle()
ui_software_info *sw = reinterpret_cast<ui_software_info *>(m_prev_selected);
menu::stack_push<menu_machine_configure>(
ui(), container(),
- (const game_driver *)sw->driver,
+ *sw->driver,
+ [this, empty = sw->startempty] (bool fav, bool changed)
+ {
+ if (changed)
+ reset(empty ? reset_options::SELECT_FIRST : reset_options::REMEMBER_REF);
+ },
menu_event->mouse.x0, menu_event->mouse.y0);
}
break;
case IPT_UI_LEFT:
- if (ui_globals::rpanel == RP_IMAGES && ui_globals::curimage_view > FIRST_VIEW)
+ if (ui_globals::rpanel == RP_IMAGES)
{
// Images
- ui_globals::curimage_view--;
- ui_globals::switch_image = true;
- ui_globals::default_image = false;
+ previous_image_view();
}
else if (ui_globals::rpanel == RP_INFOS)
{
@@ -283,12 +439,10 @@ void menu_select_game::handle()
break;
case IPT_UI_RIGHT:
- if (ui_globals::rpanel == RP_IMAGES && ui_globals::curimage_view < LAST_VIEW)
+ if (ui_globals::rpanel == RP_IMAGES)
{
// Images
- ui_globals::curimage_view++;
- ui_globals::switch_image = true;
- ui_globals::default_image = false;
+ next_image_view();
}
else if (ui_globals::rpanel == RP_INFOS)
{
@@ -301,17 +455,17 @@ void menu_select_game::handle()
if (uintptr_t(menu_event->itemref) > skip_main_items)
{
favorite_manager &mfav(mame_machine_manager::instance()->favorite());
- if (!isfavorite())
+ if (!m_populated_favorites)
{
game_driver const *const driver(reinterpret_cast<game_driver const *>(menu_event->itemref));
- if (!mfav.isgame_favorite(driver))
+ if (!mfav.is_favorite_system(*driver))
{
- mfav.add_favorite_game(driver);
+ mfav.add_favorite_system(*driver);
machine().popmessage(_("%s\n added to favorites list."), driver->type.fullname());
}
else
{
- mfav.remove_favorite_game();
+ mfav.remove_favorite_system(*driver);
machine().popmessage(_("%s\n removed from favorites list."), driver->type.fullname());
}
}
@@ -319,19 +473,19 @@ void menu_select_game::handle()
{
ui_software_info const *const swinfo(reinterpret_cast<ui_software_info const *>(menu_event->itemref));
machine().popmessage(_("%s\n removed from favorites list."), swinfo->longname);
- mfav.remove_favorite_game(*swinfo);
+ mfav.remove_favorite_software(*swinfo);
reset(reset_options::SELECT_FIRST);
}
}
break;
case IPT_UI_AUDIT_FAST:
- if (std::find_if(m_availsortedlist.begin(), m_availsortedlist.end(), [] (ui_system_info const &info) { return !info.available; }) != m_availsortedlist.end())
- menu::stack_push<menu_audit>(ui(), container(), m_availsortedlist, menu_audit::mode::FAST);
+ if (m_persistent_data.unavailable_systems())
+ menu::stack_push<menu_audit>(ui(), container(), m_persistent_data.sorted_list(), menu_audit::mode::FAST);
break;
case IPT_UI_AUDIT_ALL:
- menu::stack_push<menu_audit>(ui(), container(), m_availsortedlist, menu_audit::mode::ALL);
+ menu::stack_push<menu_audit>(ui(), container(), m_persistent_data.sorted_list(), menu_audit::mode::ALL);
break;
}
}
@@ -348,98 +502,113 @@ void menu_select_game::handle()
void menu_select_game::populate(float &customtop, float &custombottom)
{
- ui_globals::redraw_icon = true;
- ui_globals::switch_image = true;
+ for (auto &icon : m_icons) // TODO: why is this here? maybe better on resize or setting change?
+ icon.second.texture.reset();
+
+ set_switch_image();
int old_item_selected = -1;
- uint32_t flags_ui = FLAG_LEFT_ARROW | FLAG_RIGHT_ARROW;
if (!isfavorite())
{
+ m_populated_favorites = false;
+ m_displaylist.clear();
+ machine_filter const *const flt(m_persistent_data.filter_data().get_current_filter());
+
// if search is not empty, find approximate matches
if (!m_search.empty())
{
populate_search();
+ if (flt)
+ {
+ for (auto it = m_searchlist.begin(); (m_searchlist.end() != it) && (MAX_VISIBLE_SEARCH > m_displaylist.size()); ++it)
+ {
+ if (flt->apply(it->second))
+ m_displaylist.emplace_back(it->second);
+ }
+ }
+ else
+ {
+ std::transform(
+ m_searchlist.begin(),
+ std::next(m_searchlist.begin(), (std::min)(m_searchlist.size(), MAX_VISIBLE_SEARCH)),
+ std::back_inserter(m_displaylist),
+ [] (auto const &entry) { return entry.second; });
+ }
}
else
{
- // reset search string
- m_search.clear();
- m_displaylist.clear();
-
// if filter is set on category, build category list
- auto const it(main_filters::filters.find(main_filters::actual));
- if (main_filters::filters.end() == it)
- m_displaylist = m_availsortedlist;
+ std::vector<ui_system_info> const &sorted(m_persistent_data.sorted_list());
+ if (!flt)
+ std::copy(sorted.begin(), sorted.end(), std::back_inserter(m_displaylist));
else
- it->second->apply(m_availsortedlist.begin(), m_availsortedlist.end(), std::back_inserter(m_displaylist));
-
- // iterate over entries
- int curitem = 0;
- for (ui_system_info const &elem : m_displaylist)
- {
- if (old_item_selected == -1 && elem.driver->name == reselect_last::driver())
- old_item_selected = curitem;
+ flt->apply(sorted.begin(), sorted.end(), std::back_inserter(m_displaylist));
+ }
- bool cloneof = strcmp(elem.driver->parent, "0");
- if (cloneof)
- {
- int cx = driver_list::find(elem.driver->parent);
- if (cx != -1 && ((driver_list::driver(cx).flags & machine_flags::IS_BIOS_ROOT) != 0))
- cloneof = false;
- }
+ // iterate over entries
+ int curitem = 0;
+ for (ui_system_info const &elem : m_displaylist)
+ {
+ if (old_item_selected == -1 && elem.driver->name == reselect_last::driver())
+ old_item_selected = curitem;
- item_append(elem.driver->type.fullname(), "", (cloneof) ? (flags_ui | FLAG_INVERT) : flags_ui, (void *)elem.driver);
- curitem++;
+ bool cloneof = strcmp(elem.driver->parent, "0");
+ if (cloneof)
+ {
+ int cx = driver_list::find(elem.driver->parent);
+ if (cx != -1 && ((driver_list::driver(cx).flags & machine_flags::IS_BIOS_ROOT) != 0))
+ cloneof = false;
}
+
+ item_append(elem.driver->type.fullname(), "", (cloneof) ? (FLAGS_UI | FLAG_INVERT) : FLAGS_UI, (void *)elem.driver);
+ curitem++;
}
}
else
{
// populate favorites list
+ m_populated_favorites = true;
m_search.clear();
- int curitem = 0;
-
- // iterate over entries
- for (auto & favmap : mame_machine_manager::instance()->favorite().m_list)
- {
- auto flags = flags_ui | FLAG_UI_FAVORITE;
- if (favmap.second.startempty == 1)
- {
- if (old_item_selected == -1 && favmap.second.shortname == reselect_last::driver())
- old_item_selected = curitem;
-
- bool cloneof = strcmp(favmap.second.driver->parent, "0");
- if (cloneof)
+ mame_machine_manager::instance()->favorite().apply_sorted(
+ [this, &old_item_selected, curitem = 0] (ui_software_info const &info) mutable
{
- int cx = driver_list::find(favmap.second.driver->parent);
- if (cx != -1 && ((driver_list::driver(cx).flags & machine_flags::IS_BIOS_ROOT) != 0))
- cloneof = false;
- }
+ if (info.startempty == 1)
+ {
+ if (old_item_selected == -1 && info.shortname == reselect_last::driver())
+ old_item_selected = curitem;
- item_append(favmap.second.longname, "", (cloneof) ? (flags | FLAG_INVERT) : flags, (void *)&favmap.second);
- }
- else
- {
- if (old_item_selected == -1 && favmap.second.shortname == reselect_last::driver())
- old_item_selected = curitem;
- item_append(favmap.second.longname, favmap.second.devicetype,
- favmap.second.parentname.empty() ? flags : (FLAG_INVERT | flags), (void *)&favmap.second);
- }
- curitem++;
- }
+ bool cloneof = strcmp(info.driver->parent, "0");
+ if (cloneof)
+ {
+ int cx = driver_list::find(info.driver->parent);
+ if (cx != -1 && ((driver_list::driver(cx).flags & machine_flags::IS_BIOS_ROOT) != 0))
+ cloneof = false;
+ }
+
+ item_append(info.longname, "", cloneof ? (FLAGS_UI | FLAG_INVERT) : FLAGS_UI, (void *)&info);
+ }
+ else
+ {
+ if (old_item_selected == -1 && info.shortname == reselect_last::driver())
+ old_item_selected = curitem;
+ item_append(info.longname, info.devicetype,
+ info.parentname.empty() ? FLAGS_UI : (FLAG_INVERT | FLAGS_UI), (void *)&info);
+ }
+ curitem++;
+ });
}
- item_append(menu_item_type::SEPARATOR, flags_ui);
+ item_append(menu_item_type::SEPARATOR, FLAGS_UI);
// add special items
if (stack_has_special_main_menu())
{
- item_append(_("Configure Options"), "", flags_ui, (void *)(uintptr_t)CONF_OPTS);
- item_append(_("Configure Machine"), "", flags_ui, (void *)(uintptr_t)CONF_MACHINE);
+ item_append(_("Configure Options"), "", FLAGS_UI, (void *)(uintptr_t)CONF_OPTS);
+ item_append(_("Configure Machine"), "", FLAGS_UI, (void *)(uintptr_t)CONF_MACHINE);
skip_main_items = 2;
if (machine().options().plugins())
{
- item_append(_("Plugins"), "", flags_ui, (void *)(uintptr_t)CONF_PLUGINS);
+ item_append(_("Plugins"), "", FLAGS_UI, (void *)(uintptr_t)CONF_PLUGINS);
skip_main_items++;
}
}
@@ -487,11 +656,11 @@ void menu_select_game::build_available_list()
// build a name for it
for (src = dir->name; *src != 0 && *src != '.' && dst < &drivername[ARRAY_LENGTH(drivername) - 1]; ++src)
- *dst++ = tolower((uint8_t) * src);
+ *dst++ = tolower(uint8_t(*src));
*dst = 0;
- int drivnum = driver_list::find(drivername);
- if (drivnum != -1 && !included[drivnum])
+ int const drivnum = driver_list::find(drivername);
+ if (0 <= drivnum)
included[drivnum] = true;
}
@@ -562,18 +731,9 @@ void menu_select_game::build_available_list()
}
}
- // sort
- m_availsortedlist.reserve(total);
- for (std::size_t x = 0; total > x; ++x)
- {
- game_driver const &driver(driver_list::driver(x));
- if (&driver != &GAME_NAME(___empty))
- m_availsortedlist.emplace_back(driver, included[x]);
- }
- std::stable_sort(
- m_availsortedlist.begin(),
- m_availsortedlist.end(),
- [] (ui_system_info const &a, ui_system_info const &b) { return sorted_game_list(a.driver, b.driver); });
+ // copy into the persistent sorted list
+ for (ui_system_info &info : m_persistent_data.sorted_list())
+ info.available = included[info.index];
}
@@ -609,13 +769,17 @@ void menu_select_game::inkey_select(const event *menu_event)
if ((uintptr_t)driver == CONF_OPTS)
{
// special case for configure options
- menu::stack_push<menu_game_options>(ui(), container());
+ menu::stack_push<menu_game_options>(
+ ui(),
+ container(),
+ m_persistent_data.filter_data(),
+ [this] () { reset(reset_options::SELECT_FIRST); });
}
else if (uintptr_t(driver) == CONF_MACHINE)
{
// special case for configure machine
if (m_prev_selected)
- menu::stack_push<menu_machine_configure>(ui(), container(), reinterpret_cast<const game_driver *>(m_prev_selected));
+ menu::stack_push<menu_machine_configure>(ui(), container(), *reinterpret_cast<const game_driver *>(m_prev_selected));
return;
}
else if ((uintptr_t)driver == CONF_PLUGINS)
@@ -640,7 +804,7 @@ void menu_select_game::inkey_select(const event *menu_event)
{
if (!swlistdev.get_info().empty())
{
- menu::stack_push<menu_select_software>(ui(), container(), driver);
+ menu::stack_push<menu_select_software>(ui(), container(), *driver);
return;
}
}
@@ -667,7 +831,11 @@ void menu_select_game::inkey_select_favorite(const event *menu_event)
if ((uintptr_t)ui_swinfo == CONF_OPTS)
{
// special case for configure options
- menu::stack_push<menu_game_options>(ui(), container());
+ menu::stack_push<menu_game_options>(
+ ui(),
+ container(),
+ m_persistent_data.filter_data(),
+ [this] () { reset(reset_options::SELECT_FIRST); });
}
else if ((uintptr_t)ui_swinfo == CONF_MACHINE)
{
@@ -675,7 +843,15 @@ void menu_select_game::inkey_select_favorite(const event *menu_event)
if (m_prev_selected)
{
ui_software_info *swinfo = reinterpret_cast<ui_software_info *>(m_prev_selected);
- menu::stack_push<menu_machine_configure>(ui(), container(), (const game_driver *)swinfo->driver);
+ menu::stack_push<menu_machine_configure>(
+ ui(),
+ container(),
+ *swinfo->driver,
+ [this, empty = swinfo->startempty] (bool fav, bool changed)
+ {
+ if (changed)
+ reset(empty ? reset_options::SELECT_FIRST : reset_options::REMEMBER_REF);
+ });
}
return;
}
@@ -698,7 +874,7 @@ void menu_select_game::inkey_select_favorite(const event *menu_event)
{
if (!swlistdev.get_info().empty())
{
- menu::stack_push<menu_select_software>(ui(), container(), ui_swinfo->driver);
+ menu::stack_push<menu_select_software>(ui(), container(), *ui_swinfo->driver);
return;
}
}
@@ -746,7 +922,7 @@ void menu_select_game::inkey_select_favorite(const event *menu_event)
bool menu_select_game::isfavorite() const
{
- return machine_filter::FAVORITE == main_filters::actual;
+ return machine_filter::FAVORITE == m_persistent_data.filter_data().get_current_filter_type();
}
@@ -771,7 +947,7 @@ void menu_select_game::change_info_pane(int delta)
game_driver const *drv;
ui_software_info const *soft;
get_selection(soft, drv);
- if (!isfavorite())
+ if (!m_populated_favorites)
{
if (uintptr_t(drv) > skip_main_items)
cap_delta(ui_globals::curdats_view, ui_globals::curdats_total);
@@ -791,49 +967,59 @@ void menu_select_game::change_info_pane(int delta)
void menu_select_game::populate_search()
{
- // allocate memory to track the penalty value
- std::vector<int> penalty(VISIBLE_GAMES_IN_SEARCH, 9999);
- int index = 0;
- for (; index < m_displaylist.size(); ++index)
+ // ensure search list is populated
+ if (m_searchlist.empty())
{
- // pick the best match between driver name and description
- int curpenalty = fuzzy_substring(m_search, m_displaylist[index].driver->type.fullname());
- int tmp = fuzzy_substring(m_search, m_displaylist[index].driver->name);
- curpenalty = std::min(curpenalty, tmp);
+ std::vector<ui_system_info> const &sorted(m_persistent_data.sorted_list());
+ m_searchlist.reserve(sorted.size());
+ for (ui_system_info const &info : sorted)
+ m_searchlist.emplace_back(1.0, std::ref(info));
+ }
- // insert into the sorted table of matches
- for (int matchnum = VISIBLE_GAMES_IN_SEARCH - 1; matchnum >= 0; --matchnum)
- {
- // stop if we're worse than the current entry
- if (curpenalty >= penalty[matchnum])
- break;
+ // keep track of what we matched against
+ const std::u32string ucs_search(ustr_from_utf8(normalize_unicode(m_search, unicode_normalization_form::D, true)));
+
+ // match shortnames
+ if (m_persistent_data.is_available(persistent_data::AVAIL_UCS_SHORTNAME))
+ {
+ m_searched_fields |= persistent_data::AVAIL_UCS_SHORTNAME;
+ for (std::pair<double, std::reference_wrapper<ui_system_info const> > &info : m_searchlist)
+ info.first = util::edit_distance(ucs_search, info.second.get().ucs_shortname);
+ }
- // as long as this isn't the last entry, bump this one down
- if (matchnum < VISIBLE_GAMES_IN_SEARCH - 1)
+ // match descriptions
+ if (m_persistent_data.is_available(persistent_data::AVAIL_UCS_DESCRIPTION))
+ {
+ m_searched_fields |= persistent_data::AVAIL_UCS_DESCRIPTION;
+ for (std::pair<double, std::reference_wrapper<ui_system_info const> > &info : m_searchlist)
+ {
+ if (info.first)
{
- penalty[matchnum + 1] = penalty[matchnum];
- m_searchlist[matchnum + 1] = m_searchlist[matchnum];
+ double const penalty(util::edit_distance(ucs_search, info.second.get().ucs_description));
+ info.first = (std::min)(penalty, info.first);
}
-
- m_searchlist[matchnum] = m_displaylist[index].driver;
- penalty[matchnum] = curpenalty;
}
}
- (index < VISIBLE_GAMES_IN_SEARCH) ? m_searchlist[index] = nullptr : m_searchlist[VISIBLE_GAMES_IN_SEARCH] = nullptr;
- uint32_t flags_ui = FLAG_LEFT_ARROW | FLAG_RIGHT_ARROW;
- for (int curitem = 0; m_searchlist[curitem]; ++curitem)
+ // match "<manufacturer> <description>"
+ if (m_persistent_data.is_available(persistent_data::AVAIL_UCS_MANUF_DESC))
{
- bool cloneof = strcmp(m_searchlist[curitem]->parent, "0");
- if (cloneof)
+ m_searched_fields |= persistent_data::AVAIL_UCS_MANUF_DESC;
+ for (std::pair<double, std::reference_wrapper<ui_system_info const> > &info : m_searchlist)
{
- int cx = driver_list::find(m_searchlist[curitem]->parent);
- if (cx != -1 && ((driver_list::driver(cx).flags & machine_flags::IS_BIOS_ROOT) != 0))
- cloneof = false;
+ if (info.first)
+ {
+ double const penalty(util::edit_distance(ucs_search, info.second.get().ucs_manufacturer_description));
+ info.first = (std::min)(penalty, info.first);
+ }
}
- item_append(m_searchlist[curitem]->type.fullname(), "", (!cloneof) ? flags_ui : (FLAG_INVERT | flags_ui),
- (void *)m_searchlist[curitem]);
}
+
+ // sort according to edit distance
+ std::stable_sort(
+ m_searchlist.begin(),
+ m_searchlist.end(),
+ [] (auto const &lhs, auto const &rhs) { return lhs.first < rhs.first; });
}
//-------------------------------------------------
@@ -889,6 +1075,21 @@ void menu_select_game::general_info(const game_driver *driver, std::string &buff
else
str << _("Sound\tOK\n");
+ if (flags.unemulated_features() & device_t::feature::CAPTURE)
+ str << _("Capture\tUnimplemented\n");
+ else if (flags.imperfect_features() & device_t::feature::CAPTURE)
+ str << _("Capture\tImperfect\n");
+
+ if (flags.unemulated_features() & device_t::feature::CAMERA)
+ str << _("Camera\tUnimplemented\n");
+ else if (flags.imperfect_features() & device_t::feature::CAMERA)
+ str << _("Camera\tImperfect\n");
+
+ if (flags.unemulated_features() & device_t::feature::MICROPHONE)
+ str << _("Microphone\tUnimplemented\n");
+ else if (flags.imperfect_features() & device_t::feature::MICROPHONE)
+ str << _("Microphone\tImperfect\n");
+
if (flags.unemulated_features() & device_t::feature::CONTROLS)
str << _("Controls\tUnimplemented\n");
else if (flags.imperfect_features() & device_t::feature::CONTROLS)
@@ -904,15 +1105,10 @@ void menu_select_game::general_info(const game_driver *driver, std::string &buff
else if (flags.imperfect_features() & device_t::feature::MOUSE)
str << _("Mouse\tImperfect\n");
- if (flags.unemulated_features() & device_t::feature::MICROPHONE)
- str << _("Microphone\tUnimplemented\n");
- else if (flags.imperfect_features() & device_t::feature::MICROPHONE)
- str << _("Microphone\tImperfect\n");
-
- if (flags.unemulated_features() & device_t::feature::CAMERA)
- str << _("Camera\tUnimplemented\n");
- else if (flags.imperfect_features() & device_t::feature::CAMERA)
- str << _("Camera\tImperfect\n");
+ if (flags.unemulated_features() & device_t::feature::MEDIA)
+ str << _("Media\tUnimplemented\n");
+ else if (flags.imperfect_features() & device_t::feature::MEDIA)
+ str << _("Media\tImperfect\n");
if (flags.unemulated_features() & device_t::feature::DISK)
str << _("Disk\tUnimplemented\n");
@@ -924,6 +1120,31 @@ void menu_select_game::general_info(const game_driver *driver, std::string &buff
else if (flags.imperfect_features() & device_t::feature::PRINTER)
str << _("Printer\tImperfect\n");
+ if (flags.unemulated_features() & device_t::feature::TAPE)
+ str << _("Mag. Tape\tUnimplemented\n");
+ else if (flags.imperfect_features() & device_t::feature::TAPE)
+ str << _("Mag. Tape\tImperfect\n");
+
+ if (flags.unemulated_features() & device_t::feature::PUNCH)
+ str << _("Punch Tape\tUnimplemented\n");
+ else if (flags.imperfect_features() & device_t::feature::PUNCH)
+ str << _("Punch Tape\tImperfect\n");
+
+ if (flags.unemulated_features() & device_t::feature::DRUM)
+ str << _("Mag. Drum\tUnimplemented\n");
+ else if (flags.imperfect_features() & device_t::feature::DRUM)
+ str << _("Mag. Drum\tImperfect\n");
+
+ if (flags.unemulated_features() & device_t::feature::ROM)
+ str << _("(EP)ROM\tUnimplemented\n");
+ else if (flags.imperfect_features() & device_t::feature::ROM)
+ str << _("(EP)ROM\tImperfect\n");
+
+ if (flags.unemulated_features() & device_t::feature::COMMS)
+ str << _("Communications\tUnimplemented\n");
+ else if (flags.imperfect_features() & device_t::feature::COMMS)
+ str << _("Communications\tImperfect\n");
+
if (flags.unemulated_features() & device_t::feature::LAN)
str << _("LAN\tUnimplemented\n");
else if (flags.imperfect_features() & device_t::feature::LAN)
@@ -987,71 +1208,86 @@ void menu_select_game::general_info(const game_driver *driver, std::string &buff
buffer = str.str();
}
-void menu_select_game::inkey_export()
+
+//-------------------------------------------------
+// get (possibly cached) icon texture
+//-------------------------------------------------
+
+render_texture *menu_select_game::get_icon_texture(int linenum, void *selectedref)
{
- std::vector<game_driver const *> list;
- if (!m_search.empty())
- {
- for (int curitem = 0; m_searchlist[curitem]; ++curitem)
- list.push_back(m_searchlist[curitem]);
- }
- else
+ game_driver const *const driver(m_populated_favorites
+ ? reinterpret_cast<ui_software_info const *>(selectedref)->driver
+ : reinterpret_cast<game_driver const *>(selectedref));
+ assert(driver);
+
+ icon_cache::iterator icon(m_icons.find(driver));
+ if ((m_icons.end() == icon) || !icon->second.texture)
{
- if (isfavorite())
+ if (m_icon_paths.empty())
+ m_icon_paths = make_icon_paths(nullptr);
+
+ // allocate an entry or allocate a texture on forced redraw
+ if (m_icons.end() == icon)
{
- // iterate over favorites
- for (auto & favmap : mame_machine_manager::instance()->favorite().m_list)
- {
- if (favmap.second.startempty == 1)
- list.push_back(favmap.second.driver);
- else
- return;
- }
+ icon = m_icons.emplace(driver, texture_ptr(machine().render().texture_alloc(), machine().render())).first;
}
else
{
- list.reserve(m_displaylist.size());
- for (ui_system_info const &info : m_displaylist)
- list.emplace_back(info.driver);
+ assert(!icon->second.texture);
+ icon->second.texture.reset(machine().render().texture_alloc());
}
+
+ // set clone status
+ bool cloneof = strcmp(driver->parent, "0");
+ if (cloneof)
+ {
+ auto cx = driver_list::find(driver->parent);
+ if ((cx >= 0) && (driver_list::driver(cx).flags & machine_flags::IS_BIOS_ROOT))
+ cloneof = false;
+ }
+
+ bitmap_argb32 tmp;
+ emu_file snapfile(std::string(m_icon_paths), OPEN_FLAG_READ);
+ if (snapfile.open(std::string(driver->name), ".ico") == osd_file::error::NONE)
+ {
+ render_load_ico_highest_detail(snapfile, tmp);
+ snapfile.close();
+ }
+ if (!tmp.valid() && cloneof && (snapfile.open(std::string(driver->parent), ".ico") == osd_file::error::NONE))
+ {
+ render_load_ico_highest_detail(snapfile, tmp);
+ snapfile.close();
+ }
+
+ scale_icon(std::move(tmp), icon->second);
}
- menu::stack_push<menu_export>(ui(), container(), std::move(list));
+ return icon->second.bitmap.valid() ? icon->second.texture.get() : nullptr;
}
-//-------------------------------------------------
-// save drivers infos to file
-//-------------------------------------------------
-void menu_select_game::init_sorted_list()
+void menu_select_game::inkey_export()
{
- if (!m_sortedlist.empty())
- return;
-
- // generate full list
- std::unordered_set<std::string> manufacturers, years;
- for (int x = 0; x < driver_list::total(); ++x)
+ std::vector<game_driver const *> list;
+ if (m_populated_favorites)
{
- game_driver const &driver(driver_list::driver(x));
- if (&driver != &GAME_NAME(___empty))
- {
- if (driver.flags & machine_flags::IS_BIOS_ROOT)
- m_isabios++;
-
- m_sortedlist.push_back(&driver);
- manufacturers.emplace(c_mnfct::getname(driver.manufacturer));
- years.emplace(driver.year);
- }
+ // iterate over favorites
+ mame_machine_manager::instance()->favorite().apply(
+ [&list] (ui_software_info const &info)
+ {
+ assert(info.driver);
+ if (info.startempty)
+ list.push_back(info.driver);
+ });
+ }
+ else
+ {
+ list.reserve(m_displaylist.size());
+ for (ui_system_info const &info : m_displaylist)
+ list.emplace_back(info.driver);
}
- // sort manufacturers - years and driver
- for (auto it = manufacturers.begin(); manufacturers.end() != it; it = manufacturers.erase(it))
- c_mnfct::ui.emplace_back(*it);
- std::sort(c_mnfct::ui.begin(), c_mnfct::ui.end(), [] (std::string const &x, std::string const &y) { return 0 > core_stricmp(x.c_str(), y.c_str()); });
- for (auto it = years.begin(); years.end() != it; it = years.erase(it))
- c_year::ui.emplace_back(*it);
- std::stable_sort(c_year::ui.begin(), c_year::ui.end());
- std::stable_sort(m_sortedlist.begin(), m_sortedlist.end(), sorted_game_list);
+ menu::stack_push<menu_export>(ui(), container(), std::move(list));
}
//-------------------------------------------------
@@ -1093,27 +1329,18 @@ bool menu_select_game::load_available_machines()
else
available.emplace(std::move(readbuf));
}
+ file.close();
// turn it into the sorted system list we all love
- m_availsortedlist.reserve(driver_list::total());
- for (std::size_t x = 0; driver_list::total() > x; ++x)
+ for (ui_system_info &info : m_persistent_data.sorted_list())
{
- game_driver const &driver(driver_list::driver(x));
- if (&driver != &GAME_NAME(___empty))
- {
- std::unordered_set<std::string>::iterator const it(available.find(&driver.name[0]));
- bool const found(available.end() != it);
- m_availsortedlist.emplace_back(driver, found);
- if (found)
- available.erase(it);
- }
+ std::unordered_set<std::string>::iterator const it(available.find(&info.driver->name[0]));
+ bool const found(available.end() != it);
+ info.available = found;
+ if (found)
+ available.erase(it);
}
- std::stable_sort(
- m_availsortedlist.begin(),
- m_availsortedlist.end(),
- [] (ui_system_info const &a, ui_system_info const &b) { return sorted_game_list(a.driver, b.driver); });
- file.close();
return true;
}
@@ -1126,9 +1353,9 @@ void menu_select_game::load_custom_filters()
emu_file file(ui().options().ui_path(), OPEN_FLAG_READ);
if (file.open("custom_", emulator_info::get_configname(), "_filter.ini") == osd_file::error::NONE)
{
- machine_filter::ptr flt(machine_filter::create(file));
+ machine_filter::ptr flt(machine_filter::create(file, m_persistent_data.filter_data()));
if (flt)
- main_filters::filters[flt->get_type()] = std::move(flt); // not emplace/insert - could replace bogus filter from ui.ini line
+ m_persistent_data.filter_data().set_filter(std::move(flt)); // not emplace/insert - could replace bogus filter from ui.ini line
file.close();
}
@@ -1141,7 +1368,8 @@ void menu_select_game::load_custom_filters()
float menu_select_game::draw_left_panel(float x1, float y1, float x2, float y2)
{
- return menu_select_launch::draw_left_panel<machine_filter>(main_filters::actual, main_filters::filters, x1, y1, x2, y2);
+ machine_filter_data &filter_data(m_persistent_data.filter_data());
+ return menu_select_launch::draw_left_panel<machine_filter>(filter_data.get_current_filter_type(), filter_data.get_filters(), x1, y1, x2, y2);
}
@@ -1151,7 +1379,7 @@ float menu_select_game::draw_left_panel(float x1, float y1, float x2, float y2)
void menu_select_game::get_selection(ui_software_info const *&software, game_driver const *&driver) const
{
- if (item[0].flags & FLAG_UI_FAVORITE) // TODO: work out why this doesn't use isfavorite()
+ if (m_populated_favorites)
{
software = reinterpret_cast<ui_software_info const *>(get_selection_ptr());
driver = software ? software->driver : nullptr;
@@ -1170,18 +1398,18 @@ void menu_select_game::make_topbox_text(std::string &line0, std::string &line1,
bare_build_version,
visible_items,
(driver_list::total() - 1),
- m_isabios);
+ m_persistent_data.bios_count());
- if (isfavorite())
+ if (m_populated_favorites)
{
line1.clear();
}
else
{
- auto const it(main_filters::filters.find(main_filters::actual));
- char const *const filter((main_filters::filters.end() != it) ? it->second->filter_text() : nullptr);
+ machine_filter const *const it(m_persistent_data.filter_data().get_current_filter());
+ char const *const filter(it ? it->filter_text() : nullptr);
if (filter)
- line1 = string_format(_("%1$s: %2$s - Search: %3$s_"), it->second->display_name(), filter, m_search);
+ line1 = string_format(_("%1$s: %2$s - Search: %3$s_"), it->display_name(), filter, m_search);
else
line1 = string_format(_("Search: %1$s_"), m_search);
}
@@ -1208,15 +1436,12 @@ void menu_select_game::filter_selected()
{
if ((machine_filter::FIRST <= m_filter_highlight) && (machine_filter::LAST >= m_filter_highlight))
{
- m_search.clear();
- auto it(main_filters::filters.find(machine_filter::type(m_filter_highlight)));
- if (main_filters::filters.end() == it)
- it = main_filters::filters.emplace(machine_filter::type(m_filter_highlight), machine_filter::create(machine_filter::type(m_filter_highlight))).first;
- it->second->show_ui(
+ m_persistent_data.filter_data().get_filter(machine_filter::type(m_filter_highlight)).show_ui(
ui(),
container(),
[this] (machine_filter &filter)
{
+ set_switch_image();
machine_filter::type const new_type(filter.get_type());
if (machine_filter::CUSTOM == new_type)
{
@@ -1227,7 +1452,7 @@ void menu_select_game::filter_selected()
file.close();
}
}
- main_filters::actual = new_type;
+ m_persistent_data.filter_data().set_current_filter_type(new_type);
reset(reset_options::SELECT_FIRST);
});
}
diff --git a/src/frontend/mame/ui/selgame.h b/src/frontend/mame/ui/selgame.h
index 5778b2c544c..da65fee98ce 100644
--- a/src/frontend/mame/ui/selgame.h
+++ b/src/frontend/mame/ui/selgame.h
@@ -1,5 +1,5 @@
// license:BSD-3-Clause
-// copyright-holders:Maurizio Petrarota
+// copyright-holders:Maurizio Petrarota, Vas Crabb
/***************************************************************************
ui/selgame.h
@@ -15,6 +15,8 @@
#include "ui/selmenu.h"
#include "ui/utils.h"
+#include <functional>
+
class media_auditor;
@@ -37,21 +39,27 @@ private:
CONF_PLUGINS,
};
- enum { VISIBLE_GAMES_IN_SEARCH = 200 };
- static bool first_start;
- static int m_isabios;
+ using icon_cache = texture_lru<game_driver const *>;
+
+ class persistent_data;
+
+ persistent_data &m_persistent_data;
+ icon_cache m_icons;
+ std::string m_icon_paths;
+ std::vector<std::reference_wrapper<ui_system_info const> > m_displaylist;
- static std::vector<const game_driver *> m_sortedlist;
- std::vector<ui_system_info> m_availsortedlist;
- std::vector<ui_system_info> m_displaylist;
+ std::vector<std::pair<double, std::reference_wrapper<ui_system_info const> > > m_searchlist;
+ unsigned m_searched_fields;
+ bool m_populated_favorites;
- const game_driver *m_searchlist[VISIBLE_GAMES_IN_SEARCH + 1];
+ static bool s_first_start;
virtual void populate(float &customtop, float &custombottom) override;
virtual void handle() override;
- // draw left panel
+ // drawing
virtual float draw_left_panel(float x1, float y1, float x2, float y2) override;
+ virtual render_texture *get_icon_texture(int linenum, void *selectedref) override;
// get selected software and/or driver
virtual void get_selection(ui_software_info const *&software, game_driver const *&driver) const override;
@@ -75,7 +83,6 @@ private:
bool isfavorite() const;
void populate_search();
- void init_sorted_list();
bool load_available_machines();
void load_custom_filters();
diff --git a/src/frontend/mame/ui/selmenu.cpp b/src/frontend/mame/ui/selmenu.cpp
index 90dd7af789f..306c2cad1f0 100644
--- a/src/frontend/mame/ui/selmenu.cpp
+++ b/src/frontend/mame/ui/selmenu.cpp
@@ -1,5 +1,5 @@
// license:BSD-3-Clause
-// copyright-holders:Nicola Salmoria, Aaron Giles, Nathan Woods
+// copyright-holders:Nicola Salmoria, Aaron Giles, Nathan Woods, Vas Crabb
/***************************************************************************
ui/selmenu.cpp
@@ -12,7 +12,6 @@
#include "ui/selmenu.h"
#include "ui/datmenu.h"
-#include "ui/icorender.h"
#include "ui/info.h"
#include "ui/inifile.h"
@@ -45,6 +44,28 @@ namespace ui {
namespace {
+enum
+{
+ FIRST_VIEW = 0,
+ SNAPSHOT_VIEW = FIRST_VIEW,
+ CABINETS_VIEW,
+ CPANELS_VIEW,
+ PCBS_VIEW,
+ FLYERS_VIEW,
+ TITLES_VIEW,
+ ENDS_VIEW,
+ ARTPREV_VIEW,
+ BOSSES_VIEW,
+ LOGOS_VIEW,
+ VERSUS_VIEW,
+ GAMEOVER_VIEW,
+ HOWTO_VIEW,
+ SCORES_VIEW,
+ SELECT_VIEW,
+ MARQUEES_VIEW,
+ LAST_VIEW = MARQUEES_VIEW
+};
+
std::pair<char const *, char const *> const arts_info[] =
{
{ __("Snapshots"), OPTION_SNAPSHOT_DIRECTORY },
@@ -74,6 +95,8 @@ char const *const hover_msg[] = {
} // anonymous namespace
+constexpr std::size_t menu_select_launch::MAX_VISIBLE_SEARCH; // stupid non-inline semantics
+
class menu_select_launch::software_parts : public menu
{
@@ -159,7 +182,7 @@ void menu_select_launch::reselect_last::set_software(game_driver const &driver,
s_driver = driver.name;
if (swinfo.startempty)
{
- // magic strings are bad...
+ // FIXME: magic strings are bad...
s_software = "[Start empty]";
s_swlist.clear();
}
@@ -352,27 +375,26 @@ void menu_select_launch::bios_selection::custom_render(void *selectedref, float
menu_select_launch::cache::cache(running_machine &machine)
: m_snapx_bitmap(std::make_unique<bitmap_argb32>(0, 0))
- , m_snapx_texture()
+ , m_snapx_texture(nullptr, machine.render())
, m_snapx_driver(nullptr)
, m_snapx_software(nullptr)
, m_no_avail_bitmap(256, 256)
, m_star_bitmap(32, 32)
- , m_star_texture()
+ , m_star_texture(nullptr, machine.render())
, m_toolbar_bitmap()
, m_sw_toolbar_bitmap()
, m_toolbar_texture()
, m_sw_toolbar_texture()
{
render_manager &render(machine.render());
- auto const texture_free([&render](render_texture *texture) { render.texture_free(texture); });
// create a texture for snapshot
- m_snapx_texture = texture_ptr(render.texture_alloc(render_texture::hq_scale), texture_free);
+ m_snapx_texture.reset(render.texture_alloc(render_texture::hq_scale));
std::memcpy(&m_no_avail_bitmap.pix32(0), no_avail_bmp, 256 * 256 * sizeof(uint32_t));
std::memcpy(&m_star_bitmap.pix32(0), favorite_star_bmp, 32 * 32 * sizeof(uint32_t));
- m_star_texture = texture_ptr(render.texture_alloc(), texture_free);
+ m_star_texture.reset(render.texture_alloc());
m_star_texture->set_bitmap(m_star_bitmap, m_star_bitmap.cliprect(), TEXFORMAT_ARGB32);
m_toolbar_bitmap.reserve(UI_TOOLBAR_BUTTONS);
@@ -384,8 +406,8 @@ menu_select_launch::cache::cache(running_machine &machine)
{
m_toolbar_bitmap.emplace_back(32, 32);
m_sw_toolbar_bitmap.emplace_back(32, 32);
- m_toolbar_texture.emplace_back(texture_ptr(render.texture_alloc(), texture_free));
- m_sw_toolbar_texture.emplace_back(texture_ptr(render.texture_alloc(), texture_free));
+ m_toolbar_texture.emplace_back(render.texture_alloc(), render);
+ m_sw_toolbar_texture.emplace_back(render.texture_alloc(), render);
std::memcpy(&m_toolbar_bitmap.back().pix32(0), toolbar_bitmap_bmp[i], 32 * 32 * sizeof(uint32_t));
if (m_toolbar_bitmap.back().valid())
@@ -437,8 +459,11 @@ menu_select_launch::menu_select_launch(mame_ui_manager &mui, render_container &c
, m_pressed(false)
, m_repeat(0)
, m_right_visible_lines(0)
+ , m_has_icons(false)
+ , m_switch_image(false)
+ , m_default_image(true)
+ , m_image_view(FIRST_VIEW)
, m_flags(256)
- , m_icons(MAX_ICONS_RENDER)
{
// set up persistent cache for machine run
{
@@ -459,6 +484,28 @@ menu_select_launch::menu_select_launch(mame_ui_manager &mui, render_container &c
}
+void menu_select_launch::next_image_view()
+{
+ if (LAST_VIEW > m_image_view)
+ {
+ ++m_image_view;
+ set_switch_image();
+ m_default_image = false;
+ }
+}
+
+
+void menu_select_launch::previous_image_view()
+{
+ if (FIRST_VIEW < m_image_view)
+ {
+ --m_image_view;
+ set_switch_image();
+ m_default_image = false;
+ }
+}
+
+
bool menu_select_launch::dismiss_error()
{
bool const result = m_ui_error;
@@ -562,7 +609,7 @@ void menu_select_launch::custom_render(void *selectedref, float top, float botto
rgb_t color = UI_BACKGROUND_COLOR;
if (swinfo && ((swinfo->startempty != 1) || !driver))
{
- isstar = mame_machine_manager::instance()->favorite().isgame_favorite(*swinfo);
+ isstar = mame_machine_manager::instance()->favorite().is_favorite_system_software(*swinfo);
// first line is long name or system
tempbuf[0] = make_software_description(*swinfo);
@@ -598,7 +645,7 @@ void menu_select_launch::custom_render(void *selectedref, float top, float botto
}
else if (driver)
{
- isstar = mame_machine_manager::instance()->favorite().isgame_favorite(driver);
+ isstar = mame_machine_manager::instance()->favorite().is_favorite_system(*driver);
// first line is game description/game name
tempbuf[0] = make_driver_description(*driver);
@@ -944,6 +991,150 @@ float menu_select_launch::draw_left_panel(
}
+//-------------------------------------------------
+// icon helpers
+//-------------------------------------------------
+
+void menu_select_launch::check_for_icons(char const *listname)
+{
+ // only ever set the flag, never clear it
+ if (m_has_icons)
+ return;
+
+ // iterate over configured icon paths
+ path_iterator paths(ui().options().icons_directory());
+ std::string current;
+ while (paths.next(current))
+ {
+ // if we're doing a software list, append it to the configured path
+ if (listname)
+ {
+ if (!current.empty() && !util::is_directory_separator(current.back()))
+ current.append(PATH_SEPARATOR);
+ current.append(listname);
+ }
+ osd_printf_verbose("Checking for icons in directory %s\n", current.c_str());
+
+ // open and walk the directory
+ osd::directory::ptr const dir(osd::directory::open(current));
+ if (dir)
+ {
+ // this could be improved in many ways - it's just a rough go/no-go
+ osd::directory::entry const *entry;
+ while ((entry = dir->read()) != nullptr)
+ {
+ current = entry->name;
+ std::string::size_type const found(current.rfind(".ico"));
+ if ((std::string::npos != found) && ((current.length() - 4) == found))
+ {
+ osd_printf_verbose("Entry %s is a candidate icon file\n", entry->name);
+ m_has_icons = true;
+ return;
+ }
+ else if (("icons" == current) || (current.find("icons.") == 0U))
+ {
+ osd_printf_verbose("Entry %s is a candidate icon collection\n", entry->name);
+ m_has_icons = true;
+ return;
+ }
+ }
+ }
+ }
+
+ // nothing promising
+ osd_printf_verbose(
+ "No candidate icons found for %s%s\n",
+ listname ? "software list " : "",
+ listname ? listname : "machines");
+}
+
+std::string menu_select_launch::make_icon_paths(char const *listname) const
+{
+ // iterate over configured icon paths
+ path_iterator paths(ui().options().icons_directory());
+ std::string current, result;
+ while (paths.next(current))
+ {
+ // if we're doing a software list, append it to the configured path
+ if (listname)
+ {
+ if (!current.empty() && !util::is_directory_separator(current.back()))
+ current.append(PATH_SEPARATOR);
+ current.append(listname);
+ }
+
+ // append the configured path
+ if (!result.empty())
+ result.append(1, ';'); // FIXME: should be a macro
+ result.append(current);
+
+ // append with "icons" appended so it'll search icons.zip or icons.7z in the directory
+ if (!current.empty())
+ {
+ result.append(1, ';'); // FIXME: should be a macro
+ result.append(current);
+ if (!util::is_directory_separator(result.back()))
+ result.append(PATH_SEPARATOR);
+ }
+ result.append("icons");
+ }
+
+ // log the result for debugging
+ osd_printf_verbose(
+ "Icon path for %s%s set to %s\n",
+ listname ? "software list " : "",
+ listname ? listname : "machines",
+ result.c_str());
+ return result;
+}
+
+bool menu_select_launch::scale_icon(bitmap_argb32 &&src, texture_and_bitmap &dst) const
+{
+ assert(dst.texture);
+ if (src.valid())
+ {
+ // calculate available space for the icon in pixels
+ float const height(ui().get_line_height());
+ float const width(height * container().manager().ui_aspect());
+ render_target const &target(machine().render().ui_target());
+ uint32_t const dst_height(target.height());
+ uint32_t const dst_width(target.width());
+ bool const rotated((target.orientation() & ORIENTATION_SWAP_XY) != 0);
+ int const max_height(int((rotated ? dst_width : dst_height) * height));
+ int const max_width(int((rotated ? dst_height : dst_width) * width));
+
+ // reduce the source bitmap if it's too big
+ bitmap_argb32 tmp;
+ float const ratio((std::min)({ float(max_height) / src.height(), float(max_width) / src.width(), 1.0F }));
+ if (1.0F > ratio)
+ {
+ float const pix_height(src.height() * ratio);
+ float const pix_width(src.width() * ratio);
+ tmp.allocate(int32_t(pix_width), int32_t(pix_height));
+ render_resample_argb_bitmap_hq(tmp, src, render_color{ 1.0F, 1.0F, 1.0F, 1.0F }, true);
+ }
+ else
+ {
+ tmp = std::move(src);
+ }
+
+ // copy into the destination
+ dst.bitmap.allocate(max_width, max_height);
+ for (int y = 0; tmp.height() > y; ++y)
+ for (int x = 0; tmp.width() > x; ++x)
+ dst.bitmap.pix32(y, x) = tmp.pix32(y, x);
+ dst.texture->set_bitmap(dst.bitmap, dst.bitmap.cliprect(), TEXFORMAT_ARGB32);
+ return true;
+ }
+ else
+ {
+ // couldn't load icon
+ dst.bitmap.reset();
+ return false;
+ }
+}
+
+
template <typename T> bool menu_select_launch::select_bios(T const &driver, bool inlist)
{
s_bios biosname;
@@ -1049,124 +1240,16 @@ void menu_select_launch::set_pressed()
// draw icons
//-------------------------------------------------
-float menu_select_launch::draw_icon(int linenum, void *selectedref, float x0, float y0)
+void menu_select_launch::draw_icon(int linenum, void *selectedref, float x0, float y0)
{
- if (!ui_globals::has_icons || m_is_swlist)
- return 0.0f;
-
- float ud_arrow_width = ui().get_line_height() * container().manager().ui_aspect(&container());
- const game_driver *driver = nullptr;
-
- if (item[0].flags & FLAG_UI_FAVORITE)
- {
- ui_software_info *soft = (ui_software_info *)selectedref;
- if (soft->startempty == 1)
- driver = soft->driver;
- }
- else
- driver = (const game_driver *)selectedref;
-
- auto x1 = x0 + ud_arrow_width;
- auto y1 = y0 + ui().get_line_height();
-
- icon_cache::iterator icon(m_icons.find(driver));
- if ((m_icons.end() == icon) || ui_globals::redraw_icon)
- {
- if (m_icons.end() == icon)
- {
- texture_ptr texture(machine().render().texture_alloc(), [&render = machine().render()] (render_texture *texture) { render.texture_free(texture); });
- icon = m_icons.emplace(
- std::piecewise_construct,
- std::forward_as_tuple(driver),
- std::forward_as_tuple(std::piecewise_construct, std::forward_as_tuple(std::move(texture)), std::tuple<>())).first;
- }
-
- // set clone status
- bool cloneof = strcmp(driver->parent, "0");
- if (cloneof)
- {
- auto cx = driver_list::find(driver->parent);
- if ((cx >= 0) && (driver_list::driver(cx).flags & machine_flags::IS_BIOS_ROOT))
- cloneof = false;
- }
-
- // get search path
- path_iterator path(ui().options().icons_directory());
- std::string curpath;
- std::string searchstr(ui().options().icons_directory());
-
- // iterate over path and add path for zipped formats
- while (path.next(curpath))
- searchstr.append(";").append(curpath.c_str()).append(PATH_SEPARATOR).append("icons");
-
- bitmap_argb32 tmp;
- emu_file snapfile(searchstr.c_str(), OPEN_FLAG_READ);
- std::string fullname = std::string(driver->name).append(".ico");
- render_load_ico(tmp, snapfile, nullptr, fullname.c_str());
-
- if (!tmp.valid() && cloneof)
- {
- fullname.assign(driver->parent).append(".ico");
- render_load_ico(tmp, snapfile, nullptr, fullname.c_str());
- }
-
- bitmap_argb32 &bitmap(icon->second.second);
- if (tmp.valid())
- {
- float panel_width = x1 - x0;
- float panel_height = y1 - y0;
- auto screen_width = machine().render().ui_target().width();
- auto screen_height = machine().render().ui_target().height();
-
- if (machine().render().ui_target().orientation() & ORIENTATION_SWAP_XY)
- std::swap(screen_height, screen_width);
-
- int panel_width_pixel = panel_width * screen_width;
- int panel_height_pixel = panel_height * screen_height;
-
- // Calculate resize ratios for resizing
- auto ratioW = (float)panel_width_pixel / tmp.width();
- auto ratioH = (float)panel_height_pixel / tmp.height();
- auto dest_xPixel = tmp.width();
- auto dest_yPixel = tmp.height();
-
- if (ratioW < 1 || ratioH < 1)
- {
- // smaller ratio will ensure that the image fits in the view
- float ratio = std::min(ratioW, ratioH);
- dest_xPixel = tmp.width() * ratio;
- dest_yPixel = tmp.height() * ratio;
- }
-
- bitmap_argb32 dest_bitmap;
-
- // resample if necessary
- if (dest_xPixel != tmp.width() || dest_yPixel != tmp.height())
- {
- dest_bitmap.allocate(dest_xPixel, dest_yPixel);
- render_color color = { 1.0f, 1.0f, 1.0f, 1.0f };
- render_resample_argb_bitmap_hq(dest_bitmap, tmp, color, true);
- }
- else
- dest_bitmap = std::move(tmp);
-
- bitmap.allocate(panel_width_pixel, panel_height_pixel);
- for (int x = 0; x < dest_xPixel; x++)
- for (int y = 0; y < dest_yPixel; y++)
- bitmap.pix32(y, x) = dest_bitmap.pix32(y, x);
-
- icon->second.first->set_bitmap(bitmap, bitmap.cliprect(), TEXFORMAT_ARGB32);
- }
- else
- {
- bitmap.reset();
- }
- }
-
- if (icon->second.second.valid())
- container().add_quad(x0, y0, x1, y1, rgb_t::white(), icon->second.first.get(), PRIMFLAG_BLENDMODE(BLENDMODE_ALPHA));
-
- return ud_arrow_width * 1.5f;
+ render_texture *const icon(get_icon_texture(linenum, selectedref));
+ if (icon)
+ {
+ float const ud_arrow_width = ui().get_line_height() * container().manager().ui_aspect(&container());
+ float const x1 = x0 + ud_arrow_width;
+ float const y1 = y0 + ui().get_line_height();
+ container().add_quad(x0, y0, x1, y1, rgb_t::white(), icon, PRIMFLAG_BLENDMODE(BLENDMODE_ALPHA));
+ };
}
@@ -1177,21 +1260,21 @@ float menu_select_launch::draw_icon(int linenum, void *selectedref, float x0, fl
void menu_select_launch::get_title_search(std::string &snaptext, std::string &searchstr)
{
// get arts title text
- snaptext.assign(_(arts_info[ui_globals::curimage_view].first));
+ snaptext.assign(_(arts_info[m_image_view].first));
// get search path
std::string addpath;
- if (ui_globals::curimage_view == SNAPSHOT_VIEW)
+ if (m_image_view == SNAPSHOT_VIEW)
{
emu_options moptions;
- searchstr = machine().options().value(arts_info[ui_globals::curimage_view].second);
- addpath = moptions.value(arts_info[ui_globals::curimage_view].second);
+ searchstr = machine().options().value(arts_info[m_image_view].second);
+ addpath = moptions.value(arts_info[m_image_view].second);
}
else
{
ui_options moptions;
- searchstr = ui().options().value(arts_info[ui_globals::curimage_view].second);
- addpath = moptions.value(arts_info[ui_globals::curimage_view].second);
+ searchstr = ui().options().value(arts_info[m_image_view].second);
+ addpath = moptions.value(arts_info[m_image_view].second);
}
std::string tmp(searchstr);
@@ -1680,8 +1763,9 @@ void menu_select_launch::draw(uint32_t flags)
{
bool noinput = (flags & PROCESS_NOINPUT);
float line_height = ui().get_line_height();
- float ud_arrow_width = line_height * machine().render().ui_aspect();
- float gutter_width = 0.52f * ud_arrow_width;
+ float const ud_arrow_width = line_height * machine().render().ui_aspect();
+ float const gutter_width = 0.52f * ud_arrow_width;
+ float const icon_offset = m_has_icons ? (1.5f * ud_arrow_width) : 0.0f;
float right_panel_size = (ui_globals::panels_status == HIDE_BOTH || ui_globals::panels_status == HIDE_RIGHT_PANEL) ? 2.0f * UI_BOX_LR_BORDER : 0.3f;
float visible_width = 1.0f - 4.0f * UI_BOX_LR_BORDER;
float primary_left = (1.0f - visible_width) * 0.5f;
@@ -1766,18 +1850,21 @@ void menu_select_launch::draw(uint32_t flags)
if (mouse_in_rect(line_x0, line_y0, line_x1, line_y1) && is_selectable(pitem))
hover = itemnum;
- // if we're selected, draw with a different background
if (is_selected(itemnum) && m_focus == focused_menu::MAIN)
{
+ // if we're selected, draw with a different background
fgcolor = rgb_t(0xff, 0xff, 0x00);
bgcolor = rgb_t(0xff, 0xff, 0xff);
fgcolor3 = rgb_t(0xcc, 0xcc, 0x00);
- ui().draw_textured_box(container(), line_x0 + 0.01f, line_y0, line_x1 - 0.01f, line_y1, bgcolor, rgb_t(43, 43, 43),
+ ui().draw_textured_box(
+ container(),
+ line_x0 + 0.01f, line_y0, line_x1 - 0.01f, line_y1,
+ bgcolor, rgb_t(43, 43, 43),
hilight_main_texture(), PRIMFLAG_BLENDMODE(BLENDMODE_ALPHA) | PRIMFLAG_TEXWRAP(1));
}
- // else if the mouse is over this item, draw with a different background
else if (itemnum == hover)
{
+ // else if the mouse is over this item, draw with a different background
fgcolor = fgcolor3 = UI_MOUSEOVER_COLOR;
bgcolor = UI_MOUSEOVER_BG_COLOR;
highlight(line_x0, line_y0, line_x1, line_y1, bgcolor);
@@ -1817,29 +1904,52 @@ void menu_select_launch::draw(uint32_t flags)
else if (pitem.subtext.empty())
{
// draw the item centered
- int item_invert = pitem.flags & FLAG_INVERT;
- auto icon = draw_icon(linenum, item[itemnum].ref, effective_left, line_y);
- ui().draw_text_full(container(), itemtext, effective_left + icon, line_y, effective_width - icon, ui::text_layout::LEFT, ui::text_layout::TRUNCATE,
- mame_ui_manager::NORMAL, item_invert ? fgcolor3 : fgcolor, bgcolor, nullptr, nullptr);
+ int const item_invert = pitem.flags & FLAG_INVERT;
+ if (m_has_icons)
+ draw_icon(linenum, item[itemnum].ref, effective_left, line_y);
+ ui().draw_text_full(
+ container(),
+ itemtext,
+ effective_left + icon_offset, line_y, effective_width - icon_offset,
+ ui::text_layout::LEFT, ui::text_layout::TRUNCATE,
+ mame_ui_manager::NORMAL, item_invert ? fgcolor3 : fgcolor, bgcolor,
+ nullptr, nullptr);
}
else
{
- auto item_invert = pitem.flags & FLAG_INVERT;
+ int const item_invert = pitem.flags & FLAG_INVERT;
const char *subitem_text = pitem.subtext.c_str();
float item_width, subitem_width;
// compute right space for subitem
- ui().draw_text_full(container(), subitem_text, effective_left, line_y, ui().get_string_width(pitem.subtext.c_str()),
- ui::text_layout::RIGHT, ui::text_layout::NEVER, mame_ui_manager::NONE, item_invert ? fgcolor3 : fgcolor, bgcolor, &subitem_width, nullptr);
+ ui().draw_text_full(
+ container(),
+ subitem_text,
+ effective_left + icon_offset, line_y, ui().get_string_width(pitem.subtext.c_str()),
+ ui::text_layout::RIGHT, ui::text_layout::NEVER,
+ mame_ui_manager::NONE, item_invert ? fgcolor3 : fgcolor, bgcolor,
+ &subitem_width, nullptr);
subitem_width += gutter_width;
// draw the item left-justified
- ui().draw_text_full(container(), itemtext, effective_left, line_y, effective_width - subitem_width,
- ui::text_layout::LEFT, ui::text_layout::TRUNCATE, mame_ui_manager::NORMAL, item_invert ? fgcolor3 : fgcolor, bgcolor, &item_width, nullptr);
+ if (m_has_icons)
+ draw_icon(linenum, item[itemnum].ref, effective_left, line_y);
+ ui().draw_text_full(
+ container(),
+ itemtext,
+ effective_left + icon_offset, line_y, effective_width - icon_offset - subitem_width,
+ ui::text_layout::LEFT, ui::text_layout::TRUNCATE,
+ mame_ui_manager::NORMAL, item_invert ? fgcolor3 : fgcolor, bgcolor,
+ &item_width, nullptr);
// draw the subitem right-justified
- ui().draw_text_full(container(), subitem_text, effective_left + item_width, line_y, effective_width - item_width,
- ui::text_layout::RIGHT, ui::text_layout::NEVER, mame_ui_manager::NORMAL, item_invert ? fgcolor3 : fgcolor, bgcolor, nullptr, nullptr);
+ ui().draw_text_full(
+ container(),
+ subitem_text,
+ effective_left + icon_offset + item_width, line_y, effective_width - icon_offset - item_width,
+ ui::text_layout::RIGHT, ui::text_layout::NEVER,
+ mame_ui_manager::NORMAL, item_invert ? fgcolor3 : fgcolor, bgcolor,
+ nullptr, nullptr);
}
}
@@ -1900,9 +2010,6 @@ void menu_select_launch::draw(uint32_t flags)
// return the number of visible lines, minus 1 for top arrow and 1 for bottom arrow
m_visible_items = m_visible_lines - (top_line != 0) - (top_line + m_visible_lines != visible_items);
- // reset redraw icon stage
- if (!m_is_swlist) ui_globals::redraw_icon = false;
-
// noinput
if (noinput)
{
@@ -2044,14 +2151,14 @@ void menu_select_launch::arts_render(float origx1, float origy1, float origx2, f
{
m_cache->set_snapx_driver(nullptr);
- if (ui_globals::default_image)
- ui_globals::curimage_view = (software->startempty == 0) ? SNAPSHOT_VIEW : CABINETS_VIEW;
+ if (m_default_image)
+ m_image_view = (software->startempty == 0) ? SNAPSHOT_VIEW : CABINETS_VIEW;
// arts title and searchpath
std::string const searchstr = arts_render_common(origx1, origy1, origx2, origy2);
// loads the image if necessary
- if (!m_cache->snapx_software_is(software) || !snapx_valid() || ui_globals::switch_image)
+ if (!m_cache->snapx_software_is(software) || !snapx_valid() || m_switch_image)
{
emu_file snapfile(searchstr.c_str(), OPEN_FLAG_READ);
bitmap_argb32 tmp_bitmap;
@@ -2097,7 +2204,7 @@ void menu_select_launch::arts_render(float origx1, float origy1, float origx2, f
}
m_cache->set_snapx_software(software);
- ui_globals::switch_image = false;
+ m_switch_image = false;
arts_render_images(std::move(tmp_bitmap), origx1, origy1, origx2, origy2);
}
@@ -2108,13 +2215,13 @@ void menu_select_launch::arts_render(float origx1, float origy1, float origx2, f
{
m_cache->set_snapx_software(nullptr);
- if (ui_globals::default_image)
- ui_globals::curimage_view = ((driver->flags & machine_flags::MASK_TYPE) != machine_flags::TYPE_ARCADE) ? CABINETS_VIEW : SNAPSHOT_VIEW;
+ if (m_default_image)
+ m_image_view = ((driver->flags & machine_flags::MASK_TYPE) != machine_flags::TYPE_ARCADE) ? CABINETS_VIEW : SNAPSHOT_VIEW;
std::string const searchstr = arts_render_common(origx1, origy1, origx2, origy2);
// loads the image if necessary
- if (!m_cache->snapx_driver_is(driver) || !snapx_valid() || ui_globals::switch_image)
+ if (!m_cache->snapx_driver_is(driver) || !snapx_valid() || m_switch_image)
{
emu_file snapfile(searchstr.c_str(), OPEN_FLAG_READ);
snapfile.set_restrict_to_mediapath(true);
@@ -2166,7 +2273,7 @@ void menu_select_launch::arts_render(float origx1, float origy1, float origx2, f
}
m_cache->set_snapx_driver(driver);
- ui_globals::switch_image = false;
+ m_switch_image = false;
arts_render_images(std::move(tmp_bitmap), origx1, origy1, origx2, origy2);
}
@@ -2224,7 +2331,7 @@ std::string menu_select_launch::arts_render_common(float origx1, float origy1, f
ui::text_layout::CENTER, ui::text_layout::TRUNCATE, mame_ui_manager::NORMAL, fgcolor, bgcolor,
nullptr, nullptr, tmp_size);
- draw_common_arrow(origx1, origy1 + UI_BOX_TB_BORDER, origx2, origy2, ui_globals::curimage_view, FIRST_VIEW, LAST_VIEW, title_size);
+ draw_common_arrow(origx1, origy1 + UI_BOX_TB_BORDER, origx2, origy2, m_image_view, FIRST_VIEW, LAST_VIEW, title_size);
return searchstr;
}
@@ -2274,7 +2381,7 @@ void menu_select_launch::arts_render_images(bitmap_argb32 &&tmp_bitmap, float or
auto dest_yPixel = tmp_bitmap.height();
// force 4:3 ratio min
- if (ui().options().forced_4x3_snapshot() && ratioI < 0.75f && ui_globals::curimage_view == SNAPSHOT_VIEW)
+ if (ui().options().forced_4x3_snapshot() && ratioI < 0.75f && m_image_view == SNAPSHOT_VIEW)
{
// smaller ratio will ensure that the image fits in the view
dest_yPixel = tmp_bitmap.width() * 0.75f;
@@ -2367,7 +2474,7 @@ bool menu_select_launch::has_multiple_bios(game_driver const &driver, s_bios &bi
for (romload::system_bios const &bios : romload::entries(driver.rom).get_system_bioses())
{
std::string name(bios.get_description());
- u32 const bios_flags(bios.get_value());
+ uint32_t const bios_flags(bios.get_value());
if (default_name && !std::strcmp(bios.get_name(), default_name))
{
diff --git a/src/frontend/mame/ui/selmenu.h b/src/frontend/mame/ui/selmenu.h
index 1c5b6bdadd9..5e85cb0ce96 100644
--- a/src/frontend/mame/ui/selmenu.h
+++ b/src/frontend/mame/ui/selmenu.h
@@ -1,5 +1,5 @@
// license:BSD-3-Clause
-// copyright-holders:Nicola Salmoria, Aaron Giles, Nathan Woods
+// copyright-holders:Nicola Salmoria, Aaron Giles, Nathan Woods, Vas Crabb
/***************************************************************************
ui/selmenu.h
@@ -7,7 +7,6 @@
MAME system/software selection menu.
***************************************************************************/
-
#ifndef MAME_FRONTEND_UI_SELMENU_H
#define MAME_FRONTEND_UI_SELMENU_H
@@ -34,6 +33,8 @@ public:
virtual ~menu_select_launch() override;
protected:
+ static constexpr std::size_t MAX_ICONS_RENDER = 128;
+ static constexpr std::size_t MAX_VISIBLE_SEARCH = 200;
// tab navigation
enum class focused_menu
@@ -44,6 +45,20 @@ protected:
RIGHTBOTTOM
};
+ struct texture_and_bitmap
+ {
+ template <typename T>
+ texture_and_bitmap(T &&tex) : texture(std::forward<T>(tex)) { }
+ texture_and_bitmap(texture_and_bitmap &&that) = default;
+ texture_and_bitmap &operator=(texture_and_bitmap &&that) = default;
+
+ texture_ptr texture;
+ bitmap_argb32 bitmap;
+ };
+
+ template <typename Key, typename Compare = std::less<Key> >
+ using texture_lru = util::lru_cache_map<Key, texture_and_bitmap, Compare>;
+
class system_flags
{
public:
@@ -93,6 +108,8 @@ protected:
focused_menu get_focus() const { return m_focus; }
void set_focus(focused_menu focus) { m_focus = focus; }
+ void next_image_view();
+ void previous_image_view();
bool dismiss_error();
void set_error(reset_options ropt, std::string &&message);
@@ -122,6 +139,14 @@ protected:
std::map<typename Filter::type, typename Filter::ptr> const &filters,
float x1, float y1, float x2, float y2);
+ // icon helpers
+ void check_for_icons(char const *listname);
+ std::string make_icon_paths(char const *listname) const;
+ bool scale_icon(bitmap_argb32 &&src, texture_and_bitmap &dst) const;
+
+ // forcing refresh
+ void set_switch_image() { m_switch_image = true; }
+
template <typename T> bool select_bios(T const &driver, bool inlist);
bool select_part(software_info const &info, ui_software_info const &ui_info);
@@ -188,9 +213,6 @@ private:
using cache_ptr_map = std::map<running_machine *, cache_ptr>;
using flags_cache = util::lru_cache_map<game_driver const *, system_flags>;
- using icon_cache = util::lru_cache_map<game_driver const *, std::pair<texture_ptr, bitmap_argb32> >;
-
- static constexpr std::size_t MAX_ICONS_RENDER = 128;
void reset_pressed() { m_pressed = false; m_repeat = 0; }
bool mouse_pressed() const { return (osd_ticks() >= m_repeat); }
@@ -230,7 +252,8 @@ private:
void draw_toolbar(float x1, float y1, float x2, float y2);
void draw_star(float x0, float y0);
- float draw_icon(int linenum, void *selectedref, float x1, float y1);
+ void draw_icon(int linenum, void *selectedref, float x1, float y1);
+ virtual render_texture *get_icon_texture(int linenum, void *selectedref) = 0;
void get_title_search(std::string &title, std::string &search);
@@ -289,8 +312,11 @@ private:
int m_right_visible_lines; // right box lines
+ bool m_has_icons;
+ bool m_switch_image;
+ bool m_default_image;
+ uint8_t m_image_view;
flags_cache m_flags;
- icon_cache m_icons;
static std::mutex s_cache_guard;
static cache_ptr_map s_caches;
diff --git a/src/frontend/mame/ui/selsoft.cpp b/src/frontend/mame/ui/selsoft.cpp
index e7ebc3effa2..26635c6d31a 100644
--- a/src/frontend/mame/ui/selsoft.cpp
+++ b/src/frontend/mame/ui/selsoft.cpp
@@ -1,5 +1,5 @@
// license:BSD-3-Clause
-// copyright-holders:Maurizio Petrarota
+// copyright-holders:Maurizio Petrarota, Vas Crabb
/***************************************************************************
ui/selsoft.cpp
@@ -12,6 +12,7 @@
#include "ui/selsoft.h"
#include "ui/ui.h"
+#include "ui/icorender.h"
#include "ui/inifile.h"
#include "ui/selector.h"
@@ -24,75 +25,97 @@
#include "uiinput.h"
#include "luaengine.h"
+#include <algorithm>
+#include <iterator>
+#include <functional>
+
namespace ui {
+namespace {
+
//-------------------------------------------------
// compares two items in the software list and
// sort them by parent-clone
//-------------------------------------------------
-bool compare_software(ui_software_info a, ui_software_info b)
+bool compare_software(ui_software_info const &a, ui_software_info const &b)
{
- ui_software_info *x = &a;
- ui_software_info *y = &b;
-
- bool clonex = !x->parentname.empty();
- bool cloney = !y->parentname.empty();
+ bool const clonex = !a.parentname.empty() && !a.parentlongname.empty();
+ bool const cloney = !b.parentname.empty() && !b.parentlongname.empty();
if (!clonex && !cloney)
- return (strmakelower(x->longname) < strmakelower(y->longname));
-
- std::string cx(x->parentlongname), cy(y->parentlongname);
-
- if (cx.empty())
- clonex = false;
-
- if (cy.empty())
- cloney = false;
-
- if (!clonex && !cloney)
- return (strmakelower(x->longname) < strmakelower(y->longname));
- else if (clonex && cloney)
{
- if (!core_stricmp(x->parentname.c_str(), y->parentname.c_str()) && !core_stricmp(x->instance.c_str(), y->instance.c_str()))
- return (strmakelower(x->longname) < strmakelower(y->longname));
- else
- return (strmakelower(cx) < strmakelower(cy));
+ return 0 > core_stricmp(a.longname.c_str(), b.longname.c_str());
}
else if (!clonex && cloney)
{
- if (!core_stricmp(x->shortname.c_str(), y->parentname.c_str()) && !core_stricmp(x->instance.c_str(), y->instance.c_str()))
+ if ((a.shortname == b.parentname) && (a.instance == b.instance))
return true;
else
- return (strmakelower(x->longname) < strmakelower(cy));
+ return 0 > core_stricmp(a.longname.c_str(), b.parentlongname.c_str());
}
- else
+ else if (clonex && !cloney)
{
- if (!core_stricmp(x->parentname.c_str(), y->shortname.c_str()) && !core_stricmp(x->instance.c_str(), y->instance.c_str()))
+ if ((a.parentname == b.shortname) && (a.instance == b.instance))
return false;
else
- return (strmakelower(cx) < strmakelower(y->longname));
+ return 0 > core_stricmp(a.parentlongname.c_str(), b.longname.c_str());
+ }
+ else if ((a.parentname == b.parentname) && (a.instance == b.instance))
+ {
+ return 0 > core_stricmp(a.longname.c_str(), b.longname.c_str());
+ }
+ else
+ {
+ return 0 > core_stricmp(a.parentlongname.c_str(), b.parentlongname.c_str());
}
}
+} // anonymous namespace
+
+
+menu_select_software::search_item::search_item(ui_software_info const &s)
+ : software(s)
+ , ucs_shortname(ustr_from_utf8(normalize_unicode(s.shortname, unicode_normalization_form::D, true)))
+ , ucs_longname(ustr_from_utf8(normalize_unicode(s.longname, unicode_normalization_form::D, true)))
+ , penalty(1.0)
+{
+}
+
+void menu_select_software::search_item::set_penalty(std::u32string const &search)
+{
+ // TODO: search alternate title as well
+ penalty = util::edit_distance(search, ucs_shortname);
+ if (penalty)
+ penalty = (std::min)(penalty, util::edit_distance(search, ucs_longname));
+}
+
+
//-------------------------------------------------
// ctor
//-------------------------------------------------
-menu_select_software::menu_select_software(mame_ui_manager &mui, render_container &container, const game_driver *driver)
+menu_select_software::menu_select_software(mame_ui_manager &mui, render_container &container, game_driver const &driver)
: menu_select_launch(mui, container, true)
+ , m_icon_paths()
+ , m_icons(MAX_ICONS_RENDER)
+ , m_driver(driver)
+ , m_has_empty_start(false)
+ , m_filter_data()
+ , m_filters()
, m_filter_type(software_filter::ALL)
+ , m_swinfo()
+ , m_searchlist()
+ , m_displaylist()
{
reselect_last::reselect(false);
- m_driver = driver;
build_software_list();
load_sw_custom_filters();
m_filter_highlight = m_filter_type;
- ui_globals::curimage_view = SNAPSHOT_VIEW;
- ui_globals::switch_image = true;
+ set_switch_image();
ui_globals::cur_sw_dats_view = 0;
ui_globals::cur_sw_dats_total = 1;
}
@@ -103,8 +126,6 @@ menu_select_software::menu_select_software(mame_ui_manager &mui, render_containe
menu_select_software::~menu_select_software()
{
- ui_globals::curimage_view = CABINETS_VIEW;
- ui_globals::switch_image = true;
}
//-------------------------------------------------
@@ -135,12 +156,10 @@ void menu_select_software::handle()
break;
case IPT_UI_LEFT:
- if (ui_globals::rpanel == RP_IMAGES && ui_globals::curimage_view > FIRST_VIEW)
+ if (ui_globals::rpanel == RP_IMAGES)
{
// Images
- ui_globals::curimage_view--;
- ui_globals::switch_image = true;
- ui_globals::default_image = false;
+ previous_image_view();
}
else if (ui_globals::rpanel == RP_INFOS && ui_globals::cur_sw_dats_view > 0)
{
@@ -151,12 +170,10 @@ void menu_select_software::handle()
break;
case IPT_UI_RIGHT:
- if (ui_globals::rpanel == RP_IMAGES && ui_globals::curimage_view < LAST_VIEW)
+ if (ui_globals::rpanel == RP_IMAGES)
{
// Images
- ui_globals::curimage_view++;
- ui_globals::switch_image = true;
- ui_globals::default_image = false;
+ next_image_view();
}
else if (ui_globals::rpanel == RP_INFOS && ui_globals::cur_sw_dats_view < (ui_globals::cur_sw_dats_total - 1))
{
@@ -205,16 +222,16 @@ void menu_select_software::handle()
if ((uintptr_t)swinfo > 2)
{
favorite_manager &mfav = mame_machine_manager::instance()->favorite();
- if (!mfav.isgame_favorite(*swinfo))
+ if (!mfav.is_favorite_system_software(*swinfo))
{
- mfav.add_favorite_game(*swinfo);
+ mfav.add_favorite_software(*swinfo);
machine().popmessage(_("%s\n added to favorites list."), swinfo->longname.c_str());
}
else
{
machine().popmessage(_("%s\n removed from favorites list."), swinfo->longname.c_str());
- mfav.remove_favorite_game();
+ mfav.remove_favorite_software(*swinfo);
}
}
}
@@ -232,17 +249,27 @@ void menu_select_software::handle()
void menu_select_software::populate(float &customtop, float &custombottom)
{
+ for (auto &icon : m_icons) // TODO: why is this here? maybe better on resize or setting change?
+ icon.second.texture.reset();
+
uint32_t flags_ui = FLAG_LEFT_ARROW | FLAG_RIGHT_ARROW;
m_has_empty_start = true;
int old_software = -1;
- machine_config config(*m_driver, machine().options());
+ // FIXME: why does it do this relatively expensive operation every time?
+ machine_config config(m_driver, machine().options());
for (device_image_interface &image : image_interface_iterator(config.root_device()))
- if (image.filename() == nullptr && image.must_be_loaded())
+ {
+ if (!image.filename() && image.must_be_loaded())
{
m_has_empty_start = false;
break;
}
+ }
+
+ // start with an empty list
+ m_displaylist.clear();
+ filter_map::const_iterator const flt(m_filters.find(m_filter_type));
// no active search
if (m_search.empty())
@@ -251,37 +278,44 @@ void menu_select_software::populate(float &customtop, float &custombottom)
if (m_has_empty_start)
item_append("[Start empty]", "", flags_ui, (void *)&m_swinfo[0]);
- m_displaylist.clear();
- m_tmp.clear();
-
- filter_map::const_iterator const it(m_filters.find(m_filter_type));
- if (m_filters.end() == it)
- m_displaylist = m_sortedlist;
+ if (m_filters.end() == flt)
+ std::copy(std::next(m_swinfo.begin()), m_swinfo.end(), std::back_inserter(m_displaylist));
else
- it->second->apply(std::begin(m_sortedlist), std::end(m_sortedlist), std::back_inserter(m_displaylist));
+ flt->second->apply(std::next(m_swinfo.begin()), m_swinfo.end(), std::back_inserter(m_displaylist));
+ }
+ else
+ {
+ find_matches();
- // iterate over entries
- for (size_t curitem = 0; curitem < m_displaylist.size(); ++curitem)
+ if (m_filters.end() == flt)
{
- if (reselect_last::software() == "[Start empty]" && !reselect_last::driver().empty())
- old_software = 0;
-
- else if (m_displaylist[curitem]->shortname == reselect_last::software() && m_displaylist[curitem]->listname == reselect_last::swlist())
- old_software = m_has_empty_start ? curitem + 1 : curitem;
-
- item_append(m_displaylist[curitem]->longname, m_displaylist[curitem]->devicetype,
- m_displaylist[curitem]->parentname.empty() ? flags_ui : (FLAG_INVERT | flags_ui), (void *)m_displaylist[curitem]);
+ std::transform(
+ m_searchlist.begin(),
+ std::next(m_searchlist.begin(), (std::min)(m_searchlist.size(), MAX_VISIBLE_SEARCH)),
+ std::back_inserter(m_displaylist),
+ [] (search_item const &entry) { return entry.software; });
+ }
+ else
+ {
+ for (auto it = m_searchlist.begin(); (m_searchlist.end() != it) && (MAX_VISIBLE_SEARCH > m_displaylist.size()); ++it)
+ {
+ if (flt->second->apply(it->software))
+ m_displaylist.emplace_back(it->software);
+ }
}
}
- else
+ // iterate over entries
+ for (size_t curitem = 0; curitem < m_displaylist.size(); ++curitem)
{
- find_matches(m_search.c_str(), VISIBLE_GAMES_IN_SEARCH);
-
- for (int curitem = 0; m_searchlist[curitem] != nullptr; ++curitem)
- item_append(m_searchlist[curitem]->longname, m_searchlist[curitem]->devicetype,
- m_searchlist[curitem]->parentname.empty() ? flags_ui : (FLAG_INVERT | flags_ui),
- (void *)m_searchlist[curitem]);
+ if (reselect_last::software() == "[Start empty]" && !reselect_last::driver().empty())
+ old_software = 0;
+ else if (m_displaylist[curitem].get().shortname == reselect_last::software() && m_displaylist[curitem].get().listname == reselect_last::swlist())
+ old_software = m_has_empty_start ? curitem + 1 : curitem;
+
+ item_append(
+ m_displaylist[curitem].get().longname, m_displaylist[curitem].get().devicetype,
+ m_displaylist[curitem].get().parentname.empty() ? flags_ui : (FLAG_INVERT | flags_ui), (void *)&m_displaylist[curitem].get());
}
item_append(menu_item_type::SEPARATOR, flags_ui);
@@ -306,21 +340,51 @@ void menu_select_software::populate(float &customtop, float &custombottom)
void menu_select_software::build_software_list()
{
// add start empty item
- m_swinfo.emplace_back(*m_driver);
+ m_swinfo.emplace_back(m_driver);
- machine_config config(*m_driver, machine().options());
+ machine_config config(m_driver, machine().options());
- // iterate thru all software lists
+ // iterate through all software lists
+ std::vector<std::size_t> orphans;
+ struct orphan_less
+ {
+ std::vector<ui_software_info> &swinfo;
+ bool operator()(std::string const &a, std::string const &b) const { return a < b; };
+ bool operator()(std::string const &a, std::size_t b) const { return a < swinfo[b].parentname; };
+ bool operator()(std::size_t a, std::string const &b) const { return swinfo[a].parentname < b; };
+ bool operator()(std::size_t a, std::size_t b) const { return swinfo[a].parentname < swinfo[b].parentname; };
+ };
+ orphan_less const orphan_cmp{ m_swinfo };
for (software_list_device &swlist : software_list_device_iterator(config.root_device()))
{
m_filter_data.add_list(swlist.list_name(), swlist.description());
+ check_for_icons(swlist.list_name().c_str());
+ orphans.clear();
+ std::map<std::string, std::string> parentnames;
+ std::map<std::string, std::string>::const_iterator prevparent(parentnames.end());
for (const software_info &swinfo : swlist.get_info())
{
+ // check for previously-encountered clones
+ if (swinfo.parentname().empty())
+ {
+ if (parentnames.emplace(swinfo.shortname(), swinfo.longname()).second)
+ {
+ auto const clones(std::equal_range(orphans.begin(), orphans.end(), swinfo.shortname(), orphan_cmp));
+ for (auto it = clones.first; clones.second != it; ++it)
+ m_swinfo[*it].parentlongname = swinfo.longname();
+ orphans.erase(clones.first, clones.second);
+ }
+ else
+ {
+ assert([] (auto const x) { return x.first == x.second; } (std::equal_range(orphans.begin(), orphans.end(), swinfo.shortname(), orphan_cmp)));
+ }
+ }
+
const software_part &part = swinfo.parts().front();
if (swlist.is_compatible(part) == SOFTWARE_IS_COMPATIBLE)
{
- const char *instance_name = nullptr;
- const char *type_name = nullptr;
+ char const *instance_name(nullptr);
+ char const *type_name(nullptr);
for (device_image_interface &image : image_interface_iterator(config.root_device()))
{
char const *const interface = image.image_interface();
@@ -331,45 +395,35 @@ void menu_select_software::build_software_list()
break;
}
}
- if (!instance_name || !type_name)
- continue;
- ui_software_info tmpmatches(swinfo, part, *m_driver, swlist.list_name(), instance_name, type_name);
-
- m_filter_data.add_region(tmpmatches.longname);
- m_filter_data.add_publisher(tmpmatches.publisher);
- m_filter_data.add_year(tmpmatches.year);
- m_filter_data.add_device_type(tmpmatches.devicetype);
- m_swinfo.emplace_back(std::move(tmpmatches));
- }
- }
- }
- m_displaylist.resize(m_swinfo.size() + 1);
-
- // retrieve and set the long name of software for parents
- for (size_t y = 1; y < m_swinfo.size(); ++y)
- {
- if (!m_swinfo[y].parentname.empty())
- {
- std::string lparent(m_swinfo[y].parentname);
- bool found = false;
-
- // first scan backward
- for (int x = y; x > 0; --x)
- if (lparent == m_swinfo[x].shortname && m_swinfo[y].listname == m_swinfo[x].listname)
+ if (instance_name && type_name)
{
- m_swinfo[y].parentlongname = m_swinfo[x].longname;
- found = true;
- break;
- }
+ // add to collection and try to resolve parent if applicable
+ auto const ins(m_swinfo.emplace(m_swinfo.end(), swinfo, part, m_driver, swlist.list_name(), instance_name, type_name));
+ if (!swinfo.parentname().empty())
+ {
+ if ((parentnames.end() == prevparent) || (swinfo.parentname() != prevparent->first))
+ prevparent = parentnames.find(swinfo.parentname());
- // not found? then scan forward
- for (size_t x = y; !found && x < m_swinfo.size(); ++x)
- if (lparent == m_swinfo[x].shortname && m_swinfo[y].listname == m_swinfo[x].listname)
- {
- m_swinfo[y].parentlongname = m_swinfo[x].longname;
- break;
+ if (parentnames.end() != prevparent)
+ {
+ ins->parentlongname = prevparent->second;
+ }
+ else
+ {
+ orphans.emplace(
+ std::upper_bound(orphans.begin(), orphans.end(), swinfo.parentname(), orphan_cmp),
+ std::distance(m_swinfo.begin(), ins));
+ }
+ }
+
+ // populate filter choices
+ m_filter_data.add_region(ins->longname);
+ m_filter_data.add_publisher(ins->publisher);
+ m_filter_data.add_year(ins->year);
+ m_filter_data.add_device_type(ins->devicetype);
}
+ }
}
}
@@ -408,9 +462,6 @@ void menu_select_software::build_software_list()
// sort array
std::stable_sort(m_swinfo.begin() + 1, m_swinfo.end(), compare_software);
m_filter_data.finalise();
-
- for (size_t x = 1; x < m_swinfo.size(); ++x)
- m_sortedlist.push_back(&m_swinfo[x]);
}
@@ -474,7 +525,7 @@ void menu_select_software::load_sw_custom_filters()
{
// attempt to open the output file
emu_file file(ui().options().ui_path(), OPEN_FLAG_READ);
- if (file.open("custom_", m_driver->name, "_filter.ini") == osd_file::error::NONE)
+ if (file.open("custom_", m_driver.name, "_filter.ini") == osd_file::error::NONE)
{
software_filter::ptr flt(software_filter::create(file, m_filter_data));
if (flt)
@@ -487,38 +538,25 @@ void menu_select_software::load_sw_custom_filters()
// find approximate matches
//-------------------------------------------------
-void menu_select_software::find_matches(const char *str, int count)
+void menu_select_software::find_matches()
{
- // allocate memory to track the penalty value
- std::vector<int> penalty(count, 9999);
- int index = 0;
-
- for (; index < m_displaylist.size(); ++index)
+ // ensure search list is populated
+ if (m_searchlist.empty())
{
- // pick the best match between driver name and description
- int curpenalty = fuzzy_substring(str, m_displaylist[index]->longname);
- int tmp = fuzzy_substring(str, m_displaylist[index]->shortname);
- curpenalty = std::min(curpenalty, tmp);
-
- // insert into the sorted table of matches
- for (int matchnum = count - 1; matchnum >= 0; --matchnum)
- {
- // stop if we're worse than the current entry
- if (curpenalty >= penalty[matchnum])
- break;
+ m_searchlist.reserve(m_swinfo.size());
+ std::copy(m_swinfo.begin(), m_swinfo.end(), std::back_inserter(m_searchlist));
+ }
- // as long as this isn't the last entry, bump this one down
- if (matchnum < count - 1)
- {
- penalty[matchnum + 1] = penalty[matchnum];
- m_searchlist[matchnum + 1] = m_searchlist[matchnum];
- }
+ // update search
+ const std::u32string ucs_search(ustr_from_utf8(normalize_unicode(m_search, unicode_normalization_form::D, true)));
+ for (search_item &entry : m_searchlist)
+ entry.set_penalty(ucs_search);
- m_searchlist[matchnum] = m_displaylist[index];
- penalty[matchnum] = curpenalty;
- }
- }
- (index < count) ? m_searchlist[index] = nullptr : m_searchlist[count] = nullptr;
+ // sort according to edit distance
+ std::stable_sort(
+ m_searchlist.begin(),
+ m_searchlist.end(),
+ [] (search_item const &lhs, search_item const &rhs) { return lhs.penalty < rhs.penalty; });
}
//-------------------------------------------------
@@ -532,6 +570,56 @@ float menu_select_software::draw_left_panel(float x1, float y1, float x2, float
//-------------------------------------------------
+// get (possibly cached) icon texture
+//-------------------------------------------------
+
+render_texture *menu_select_software::get_icon_texture(int linenum, void *selectedref)
+{
+ ui_software_info const *const swinfo(reinterpret_cast<ui_software_info const *>(selectedref));
+ assert(swinfo);
+
+ if (swinfo->startempty)
+ return nullptr;
+
+ icon_cache::iterator icon(m_icons.find(swinfo));
+ if ((m_icons.end() == icon) || !icon->second.texture)
+ {
+ std::map<std::string, std::string>::iterator paths(m_icon_paths.find(swinfo->listname));
+ if (m_icon_paths.end() == paths)
+ paths = m_icon_paths.emplace(swinfo->listname, make_icon_paths(swinfo->listname.c_str())).first;
+
+ // allocate an entry or allocate a texture on forced redraw
+ if (m_icons.end() == icon)
+ {
+ icon = m_icons.emplace(swinfo, texture_ptr(machine().render().texture_alloc(), machine().render())).first;
+ }
+ else
+ {
+ assert(!icon->second.texture);
+ icon->second.texture.reset(machine().render().texture_alloc());
+ }
+
+ bitmap_argb32 tmp;
+ emu_file snapfile(std::string(paths->second), OPEN_FLAG_READ);
+ if (snapfile.open(std::string(swinfo->shortname), ".ico") == osd_file::error::NONE)
+ {
+ render_load_ico_highest_detail(snapfile, tmp);
+ snapfile.close();
+ }
+ if (!tmp.valid() && !swinfo->parentname.empty() && (snapfile.open(std::string(swinfo->parentname), ".ico") == osd_file::error::NONE))
+ {
+ render_load_ico_highest_detail(snapfile, tmp);
+ snapfile.close();
+ }
+
+ scale_icon(std::move(tmp), icon->second);
+ }
+
+ return icon->second.bitmap.valid() ? icon->second.texture.get() : nullptr;
+}
+
+
+//-------------------------------------------------
// get selected software and/or driver
//-------------------------------------------------
@@ -547,7 +635,7 @@ void menu_select_software::make_topbox_text(std::string &line0, std::string &lin
// determine the text for the header
int vis_item = !m_search.empty() ? visible_items : (m_has_empty_start ? visible_items - 1 : visible_items);
line0 = string_format(_("%1$s %2$s ( %3$d / %4$d software packages )"), emulator_info::get_appname(), bare_build_version, vis_item, m_swinfo.size() - 1);
- line1 = string_format(_("Driver: \"%1$s\" software list "), m_driver->type.fullname());
+ line1 = string_format(_("Driver: \"%1$s\" software list "), m_driver.type.fullname());
filter_map::const_iterator const it(m_filters.find(m_filter_type));
char const *const filter((m_filters.end() != it) ? it->second->filter_text() : nullptr);
@@ -576,20 +664,19 @@ void menu_select_software::filter_selected()
{
if ((software_filter::FIRST <= m_filter_highlight) && (software_filter::LAST >= m_filter_highlight))
{
- m_search.clear();
filter_map::const_iterator it(m_filters.find(software_filter::type(m_filter_highlight)));
if (m_filters.end() == it)
it = m_filters.emplace(software_filter::type(m_filter_highlight), software_filter::create(software_filter::type(m_filter_highlight), m_filter_data)).first;
it->second->show_ui(
ui(),
container(),
- [this, driver = m_driver] (software_filter &filter)
+ [this] (software_filter &filter)
{
software_filter::type const new_type(filter.get_type());
if (software_filter::CUSTOM == new_type)
{
emu_file file(ui().options().ui_path(), OPEN_FLAG_WRITE | OPEN_FLAG_CREATE | OPEN_FLAG_CREATE_PATHS);
- if (file.open("custom_", driver->name, "_filter.ini") == osd_file::error::NONE)
+ if (file.open("custom_", m_driver.name, "_filter.ini") == osd_file::error::NONE)
{
filter.save_ini(file, 0);
file.close();
diff --git a/src/frontend/mame/ui/selsoft.h b/src/frontend/mame/ui/selsoft.h
index e65a5ddc61f..1bfdd9c1e48 100644
--- a/src/frontend/mame/ui/selsoft.h
+++ b/src/frontend/mame/ui/selsoft.h
@@ -1,5 +1,5 @@
// license:BSD-3-Clause
-// copyright-holders:Maurizio Petrarota
+// copyright-holders:Maurizio Petrarota, Vas Crabb
/***************************************************************************
ui/selsoft.h
@@ -15,6 +15,10 @@
#include "ui/selmenu.h"
#include "ui/utils.h"
+#include <map>
+#include <string>
+#include <vector>
+
namespace ui {
@@ -22,25 +26,34 @@ namespace ui {
class menu_select_software : public menu_select_launch
{
public:
- menu_select_software(mame_ui_manager &mui, render_container &container, const game_driver *driver);
+ menu_select_software(mame_ui_manager &mui, render_container &container, game_driver const &driver);
virtual ~menu_select_software() override;
private:
- enum { VISIBLE_GAMES_IN_SEARCH = 200 };
-
- typedef std::map<software_filter::type, software_filter::ptr> filter_map;
-
- const game_driver *m_driver;
- bool m_has_empty_start;
- software_filter_data m_filter_data;
- filter_map m_filters;
- software_filter::type m_filter_type;
+ using filter_map = std::map<software_filter::type, software_filter::ptr>;
+ using icon_cache = texture_lru<ui_software_info const *>;
+
+ struct search_item
+ {
+ search_item(ui_software_info const &s);
+ search_item(search_item const &) = default;
+ search_item(search_item &&) = default;
+ search_item &operator=(search_item const &) = default;
+ search_item &operator=(search_item &&) = default;
+ void set_penalty(std::u32string const &search);
+
+ std::reference_wrapper<ui_software_info const> software;
+ std::u32string ucs_shortname;
+ std::u32string ucs_longname;
+ double penalty;
+ };
virtual void populate(float &customtop, float &custombottom) override;
virtual void handle() override;
- // draw left panel
+ // drawing
virtual float draw_left_panel(float x1, float y1, float x2, float y2) override;
+ virtual render_texture *get_icon_texture(int linenum, void *selectedref) override;
// get selected software and/or driver
virtual void get_selection(ui_software_info const *&software, game_driver const *&driver) const override;
@@ -56,20 +69,28 @@ private:
// toolbar
virtual void inkey_export() override { throw false; }
- ui_software_info *m_searchlist[VISIBLE_GAMES_IN_SEARCH + 1];
- std::vector<ui_software_info *> m_displaylist, m_tmp, m_sortedlist;
- std::vector<ui_software_info> m_swinfo;
-
void build_software_list();
- void find_matches(const char *str, int count);
+ void find_matches();
void load_sw_custom_filters();
// handlers
void inkey_select(const event *menu_event);
- virtual void general_info(const game_driver *driver, std::string &buffer) override {}
+ virtual void general_info(const game_driver *driver, std::string &buffer) override { }
+
+ std::map<std::string, std::string> m_icon_paths;
+ icon_cache m_icons;
+ game_driver const &m_driver;
+ bool m_has_empty_start;
+ software_filter_data m_filter_data;
+ filter_map m_filters;
+ software_filter::type m_filter_type;
+
+ std::vector<ui_software_info> m_swinfo;
+ std::vector<search_item> m_searchlist;
+ std::vector<std::reference_wrapper<ui_software_info const> > m_displaylist;
};
} // namespace ui
-#endif /* MAME_FRONTEND_UI_SELSOFT_H */
+#endif // MAME_FRONTEND_UI_SELSOFT_H
diff --git a/src/frontend/mame/ui/simpleselgame.cpp b/src/frontend/mame/ui/simpleselgame.cpp
index f81b161dac1..e22e61b6a2b 100644
--- a/src/frontend/mame/ui/simpleselgame.cpp
+++ b/src/frontend/mame/ui/simpleselgame.cpp
@@ -163,7 +163,13 @@ void simple_menu_select_game::inkey_select(const event *menu_event)
// special case for configure inputs
if ((uintptr_t)driver == 1)
- menu::stack_push<menu_game_options>(ui(), container());
+ {
+ menu::stack_push<menu_simple_game_options>(
+ ui(),
+ container(),
+ [this] () { reset(reset_options::SELECT_FIRST); });
+ }
+
// anything else is a driver
else
{
@@ -250,7 +256,7 @@ void simple_menu_select_game::populate(float &customtop, float &custombottom)
// otherwise, rebuild the match list
assert(m_drivlist != nullptr);
if (!m_search.empty() || m_matchlist[0] == -1 || m_rerandomize)
- m_drivlist->find_approximate_matches(m_search.c_str(), matchcount, m_matchlist);
+ m_drivlist->find_approximate_matches(m_search, matchcount, m_matchlist);
m_rerandomize = false;
// iterate over entries
diff --git a/src/frontend/mame/ui/utils.cpp b/src/frontend/mame/ui/utils.cpp
index 1a8ff0ba476..52857fc6dbf 100644
--- a/src/frontend/mame/ui/utils.cpp
+++ b/src/frontend/mame/ui/utils.cpp
@@ -22,7 +22,9 @@
#include "romload.h"
#include "softlist.h"
+#include <atomic>
#include <bitset>
+#include <condition_variable>
#include <cstdlib>
#include <cstring>
#include <iterator>
@@ -82,6 +84,7 @@ constexpr char const *SOFTWARE_FILTER_NAMES[software_filter::COUNT] = {
__("Unfiltered"),
__("Available"),
__("Unavailable"),
+ __("Favorites"),
__("Parents"),
__("Clones"),
__("Year"),
@@ -642,7 +645,7 @@ template <machine_filter::type Type = machine_filter::AVAILABLE>
class available_machine_filter_impl : public simple_filter_impl_base<machine_filter, Type>
{
public:
- available_machine_filter_impl(char const *value, emu_file *file, unsigned indent) { }
+ available_machine_filter_impl(machine_filter_data const &data, char const *value, emu_file *file, unsigned indent) { }
virtual bool apply(ui_system_info const &system) const override { return system.available; }
};
@@ -652,7 +655,7 @@ template <machine_filter::type Type = machine_filter::WORKING>
class working_machine_filter_impl : public simple_filter_impl_base<machine_filter, Type>
{
public:
- working_machine_filter_impl(char const *value, emu_file *file, unsigned indent) { }
+ working_machine_filter_impl(machine_filter_data const &data, char const *value, emu_file *file, unsigned indent) { }
virtual bool apply(ui_system_info const &system) const override { return !(system.driver->flags & machine_flags::NOT_WORKING); }
};
@@ -662,7 +665,7 @@ template <machine_filter::type Type = machine_filter::MECHANICAL>
class mechanical_machine_filter_impl : public simple_filter_impl_base<machine_filter, Type>
{
public:
- mechanical_machine_filter_impl(char const *value, emu_file *file, unsigned indent) { }
+ mechanical_machine_filter_impl(machine_filter_data const &data, char const *value, emu_file *file, unsigned indent) { }
virtual bool apply(ui_system_info const &system) const override { return system.driver->flags & machine_flags::MECHANICAL; }
};
@@ -672,7 +675,7 @@ template <machine_filter::type Type = machine_filter::BIOS>
class bios_machine_filter_impl : public simple_filter_impl_base<machine_filter, Type>
{
public:
- bios_machine_filter_impl(char const *value, emu_file *file, unsigned indent) { }
+ bios_machine_filter_impl(machine_filter_data const &data, char const *value, emu_file *file, unsigned indent) { }
virtual bool apply(ui_system_info const &system) const override { return system.driver->flags & machine_flags::IS_BIOS_ROOT; }
};
@@ -682,7 +685,7 @@ template <machine_filter::type Type = machine_filter::PARENTS>
class parents_machine_filter_impl : public simple_filter_impl_base<machine_filter, Type>
{
public:
- parents_machine_filter_impl(char const *value, emu_file *file, unsigned indent) { }
+ parents_machine_filter_impl(machine_filter_data const &data, char const *value, emu_file *file, unsigned indent) { }
virtual bool apply(ui_system_info const &system) const override
{
@@ -697,7 +700,7 @@ template <machine_filter::type Type = machine_filter::CHD>
class chd_machine_filter_impl : public simple_filter_impl_base<machine_filter, Type>
{
public:
- chd_machine_filter_impl(char const *value, emu_file *file, unsigned indent) { }
+ chd_machine_filter_impl(machine_filter_data const &data, char const *value, emu_file *file, unsigned indent) { }
virtual bool apply(ui_system_info const &system) const override
{
@@ -715,7 +718,7 @@ template <machine_filter::type Type = machine_filter::SAVE>
class save_machine_filter_impl : public simple_filter_impl_base<machine_filter, Type>
{
public:
- save_machine_filter_impl(char const *value, emu_file *file, unsigned indent) { }
+ save_machine_filter_impl(machine_filter_data const &data, char const *value, emu_file *file, unsigned indent) { }
virtual bool apply(ui_system_info const &system) const override { return system.driver->flags & machine_flags::SUPPORTS_SAVE; }
};
@@ -725,7 +728,7 @@ template <machine_filter::type Type = machine_filter::VERTICAL>
class vertical_machine_filter_impl : public simple_filter_impl_base<machine_filter, Type>
{
public:
- vertical_machine_filter_impl(char const *value, emu_file *file, unsigned indent) { }
+ vertical_machine_filter_impl(machine_filter_data const &data, char const *value, emu_file *file, unsigned indent) { }
virtual bool apply(ui_system_info const &system) const override { return system.driver->flags & machine_flags::SWAP_XY; }
};
@@ -739,8 +742,8 @@ public:
class manufacturer_machine_filter : public choice_filter_impl_base<machine_filter, machine_filter::MANUFACTURER>
{
public:
- manufacturer_machine_filter(char const *value, emu_file *file, unsigned indent)
- : choice_filter_impl_base<machine_filter, machine_filter::MANUFACTURER>(c_mnfct::ui, value)
+ manufacturer_machine_filter(machine_filter_data const &data, char const *value, emu_file *file, unsigned indent)
+ : choice_filter_impl_base<machine_filter, machine_filter::MANUFACTURER>(data.manufacturers(), value)
{
}
@@ -751,7 +754,7 @@ public:
else if (!selection_valid())
return false;
- std::string const name(c_mnfct::getname(system.driver->manufacturer));
+ std::string const name(machine_filter_data::extract_manufacturer(system.driver->manufacturer));
return !name.empty() && (selection_text() == name);
}
};
@@ -760,8 +763,8 @@ public:
class year_machine_filter : public choice_filter_impl_base<machine_filter, machine_filter::YEAR>
{
public:
- year_machine_filter(char const *value, emu_file *file, unsigned indent)
- : choice_filter_impl_base<machine_filter, machine_filter::YEAR>(c_year::ui, value)
+ year_machine_filter(machine_filter_data const &data, char const *value, emu_file *file, unsigned indent)
+ : choice_filter_impl_base<machine_filter, machine_filter::YEAR>(data.years(), value)
{
}
@@ -778,7 +781,10 @@ template <template <machine_filter::type T> class Base, machine_filter::type Typ
class inverted_machine_filter : public Base<Type>
{
public:
- inverted_machine_filter(char const *value, emu_file *file, unsigned indent) : Base<Type>(value, file, indent) { }
+ inverted_machine_filter(machine_filter_data const &data, char const *value, emu_file *file, unsigned indent)
+ : Base<Type>(data, value, file, indent)
+ {
+ }
virtual bool apply(ui_system_info const &system) const override { return !Base<Type>::apply(system); }
};
@@ -811,7 +817,7 @@ template <machine_filter::type Type>
class inclusive_machine_filter_impl : public simple_filter_impl_base<machine_filter, Type>
{
public:
- inclusive_machine_filter_impl(char const *value, emu_file *file, unsigned indent) { }
+ inclusive_machine_filter_impl(machine_filter_data const &data, char const *value, emu_file *file, unsigned indent) { }
virtual bool apply(ui_system_info const &system) const override { return true; }
};
@@ -828,7 +834,7 @@ using favorite_machine_filter = inclusive_machine_filter_impl<machine_filt
class category_machine_filter : public simple_filter_impl_base<machine_filter, machine_filter::CATEGORY>
{
public:
- category_machine_filter(char const *value, emu_file *file, unsigned indent)
+ category_machine_filter(machine_filter_data const &data, char const *value, emu_file *file, unsigned indent)
: m_ini(0)
, m_group(0)
, m_include_clones(false)
@@ -1161,14 +1167,15 @@ void category_machine_filter::menu_configure::handle()
class custom_machine_filter : public composite_filter_impl_base<custom_machine_filter, machine_filter, machine_filter::CUSTOM>
{
public:
- custom_machine_filter(char const *value, emu_file *file, unsigned indent)
+ custom_machine_filter(machine_filter_data const &data, char const *value, emu_file *file, unsigned indent)
: composite_filter_impl_base<custom_machine_filter, machine_filter, machine_filter::CUSTOM>()
+ , m_data(data)
{
populate(value, file, indent);
}
- ptr create(type n) const { return machine_filter::create(n); }
- ptr create(emu_file &file, unsigned indent) const { return machine_filter::create(file, indent); }
+ ptr create(type n) const { return machine_filter::create(n, m_data); }
+ ptr create(emu_file &file, unsigned indent) const { return machine_filter::create(file, m_data, indent); }
static bool type_allowed(unsigned pos, type n)
{
@@ -1212,6 +1219,9 @@ public:
{
return (CATEGORY == n) || (MANUFACTURER == n) || (YEAR == n);
}
+
+private:
+ machine_filter_data const &m_data;
};
@@ -1247,6 +1257,21 @@ public:
};
+class favorite_software_filter : public simple_filter_impl_base<software_filter, software_filter::FAVORITE>
+{
+public:
+ favorite_software_filter(software_filter_data const &data, char const *value, emu_file *file, unsigned indent)
+ : m_manager(mame_machine_manager::instance()->favorite())
+ {
+ }
+
+ virtual bool apply(ui_software_info const &info) const override { return m_manager.is_favorite_software(info); }
+
+private:
+ favorite_manager const &m_manager;
+};
+
+
class parents_software_filter : public simple_filter_impl_base<software_filter, software_filter::PARENTS>
{
public:
@@ -1414,6 +1439,7 @@ public:
case UNSUPPORTED: return (SUPPORTED == m) || (PARTIAL_SUPPORTED == m);
case ALL:
+ case FAVORITE:
case YEAR:
case PUBLISHERS:
case REGION:
@@ -1440,20 +1466,100 @@ private:
//-------------------------------------------------
+// static data for machine filters
+//-------------------------------------------------
+
+void machine_filter_data::add_manufacturer(std::string const &manufacturer)
+{
+ std::string name(extract_manufacturer(manufacturer));
+ std::vector<std::string>::iterator const pos(std::lower_bound(m_manufacturers.begin(), m_manufacturers.end(), name));
+ if ((m_manufacturers.end() == pos) || (*pos != name))
+ m_manufacturers.emplace(pos, std::move(name));
+}
+
+void machine_filter_data::add_year(std::string const &year)
+{
+ std::vector<std::string>::iterator const pos(std::lower_bound(m_years.begin(), m_years.end(), year));
+ if ((m_years.end() == pos) || (*pos != year))
+ m_years.emplace(pos, year);
+}
+
+void machine_filter_data::finalise()
+{
+ std::stable_sort(m_manufacturers.begin(), m_manufacturers.end());
+ std::stable_sort(m_years.begin(), m_years.end());
+}
+
+std::string machine_filter_data::extract_manufacturer(std::string const &manufacturer)
+{
+ size_t const found(manufacturer.find('('));
+ if ((found != std::string::npos) && (found > 0))
+ return manufacturer.substr(0, found - 1);
+ else
+ return manufacturer;
+}
+
+void machine_filter_data::set_filter(machine_filter::ptr &&filter)
+{
+ m_filters[filter->get_type()] = std::move(filter);
+}
+
+machine_filter &machine_filter_data::get_filter(machine_filter::type type)
+{
+ auto it(m_filters.find(type));
+ if (m_filters.end() == it)
+ it = m_filters.emplace(type, machine_filter::create(type, *this)).first;
+
+ assert(it->second);
+ return *it->second;
+}
+
+std::string machine_filter_data::get_config_string() const
+{
+ auto const active_filter(m_filters.find(m_current_filter));
+ if (m_filters.end() != active_filter)
+ {
+ char const *const val(active_filter->second->filter_text());
+ return val ? util::string_format("%s,%s", active_filter->second->config_name(), val) : active_filter->second->config_name();
+ }
+ else
+ {
+ return machine_filter::config_name(m_current_filter);
+ }
+}
+
+bool machine_filter_data::load_ini(emu_file &file)
+{
+ machine_filter::ptr flt(machine_filter::create(file, *this));
+ if (flt)
+ {
+ // TODO: it should possibly replace an existing item here, but it may be relying on that not happening because it never clears the first start flag
+ m_current_filter = flt->get_type();
+ m_filters.emplace(m_current_filter, std::move(flt));
+ return true;
+ }
+ else
+ {
+ return false;
+ }
+}
+
+
+//-------------------------------------------------
// static data for software filters
//-------------------------------------------------
-void software_filter_data::add_region(std::string const &str)
+void software_filter_data::add_region(std::string const &longname)
{
- std::string name(extract_region(str));
+ std::string name(extract_region(longname));
std::vector<std::string>::iterator const pos(std::lower_bound(m_regions.begin(), m_regions.end(), name));
- if ((m_regions.end() == pos) || (*pos != str))
+ if ((m_regions.end() == pos) || (*pos != name))
m_regions.emplace(pos, std::move(name));
}
-void software_filter_data::add_publisher(std::string const &str)
+void software_filter_data::add_publisher(std::string const &publisher)
{
- std::string name(extract_publisher(str));
+ std::string name(extract_publisher(publisher));
std::vector<std::string>::iterator const pos(std::lower_bound(m_publishers.begin(), m_publishers.end(), name));
if ((m_publishers.end() == pos) || (*pos != name))
m_publishers.emplace(pos, std::move(name));
@@ -1518,62 +1624,62 @@ std::string software_filter_data::extract_publisher(std::string const &publisher
// public machine filter interface
//-------------------------------------------------
-machine_filter::ptr machine_filter::create(type n, char const *value, emu_file *file, unsigned indent)
+machine_filter::ptr machine_filter::create(type n, machine_filter_data const &data, char const *value, emu_file *file, unsigned indent)
{
assert(COUNT > n);
switch (n)
{
case ALL:
- return std::make_unique<all_machine_filter>(value, file, indent);
+ return std::make_unique<all_machine_filter>(data, value, file, indent);
case AVAILABLE:
- return std::make_unique<available_machine_filter>(value, file, indent);
+ return std::make_unique<available_machine_filter>(data, value, file, indent);
case UNAVAILABLE:
- return std::make_unique<unavailable_machine_filter>(value, file, indent);
+ return std::make_unique<unavailable_machine_filter>(data, value, file, indent);
case WORKING:
- return std::make_unique<working_machine_filter>(value, file, indent);
+ return std::make_unique<working_machine_filter>(data, value, file, indent);
case NOT_WORKING:
- return std::make_unique<not_working_machine_filter>(value, file, indent);
+ return std::make_unique<not_working_machine_filter>(data, value, file, indent);
case MECHANICAL:
- return std::make_unique<mechanical_machine_filter>(value, file, indent);
+ return std::make_unique<mechanical_machine_filter>(data, value, file, indent);
case NOT_MECHANICAL:
- return std::make_unique<not_mechanical_machine_filter>(value, file, indent);
+ return std::make_unique<not_mechanical_machine_filter>(data, value, file, indent);
case CATEGORY:
- return std::make_unique<category_machine_filter>(value, file, indent);
+ return std::make_unique<category_machine_filter>(data, value, file, indent);
case FAVORITE:
- return std::make_unique<favorite_machine_filter>(value, file, indent);
+ return std::make_unique<favorite_machine_filter>(data, value, file, indent);
case BIOS:
- return std::make_unique<bios_machine_filter>(value, file, indent);
+ return std::make_unique<bios_machine_filter>(data, value, file, indent);
case NOT_BIOS:
- return std::make_unique<not_bios_machine_filter>(value, file, indent);
+ return std::make_unique<not_bios_machine_filter>(data, value, file, indent);
case PARENTS:
- return std::make_unique<parents_machine_filter>(value, file, indent);
+ return std::make_unique<parents_machine_filter>(data, value, file, indent);
case CLONES:
- return std::make_unique<clones_machine_filter>(value, file, indent);
+ return std::make_unique<clones_machine_filter>(data, value, file, indent);
case MANUFACTURER:
- return std::make_unique<manufacturer_machine_filter>(value, file, indent);
+ return std::make_unique<manufacturer_machine_filter>(data, value, file, indent);
case YEAR:
- return std::make_unique<year_machine_filter>(value, file, indent);
+ return std::make_unique<year_machine_filter>(data, value, file, indent);
case SAVE:
- return std::make_unique<save_machine_filter>(value, file, indent);
+ return std::make_unique<save_machine_filter>(data, value, file, indent);
case NOSAVE:
- return std::make_unique<nosave_machine_filter>(value, file, indent);
+ return std::make_unique<nosave_machine_filter>(data, value, file, indent);
case CHD:
- return std::make_unique<chd_machine_filter>(value, file, indent);
+ return std::make_unique<chd_machine_filter>(data, value, file, indent);
case NOCHD:
- return std::make_unique<nochd_machine_filter>(value, file, indent);
+ return std::make_unique<nochd_machine_filter>(data, value, file, indent);
case VERTICAL:
- return std::make_unique<vertical_machine_filter>(value, file, indent);
+ return std::make_unique<vertical_machine_filter>(data, value, file, indent);
case HORIZONTAL:
- return std::make_unique<horizontal_machine_filter>(value, file, indent);
+ return std::make_unique<horizontal_machine_filter>(data, value, file, indent);
case CUSTOM:
- return std::make_unique<custom_machine_filter>(value, file, indent);
+ return std::make_unique<custom_machine_filter>(data, value, file, indent);
case COUNT: // not valid, but needed to suppress warnings
break;
}
return nullptr;
}
-machine_filter::ptr machine_filter::create(emu_file &file, unsigned indent)
+machine_filter::ptr machine_filter::create(emu_file &file, machine_filter_data const &data, unsigned indent)
{
char buffer[MAX_CHAR_INFO];
if (!file.gets(buffer, ARRAY_LENGTH(buffer)))
@@ -1598,7 +1704,7 @@ machine_filter::ptr machine_filter::create(emu_file &file, unsigned indent)
for (type n = FIRST; COUNT > n; ++n)
{
if (key == config_name(n))
- return create(n, value.c_str(), &file, indent);
+ return create(n, data, value.c_str(), &file, indent);
}
return nullptr;
}
@@ -1651,6 +1757,8 @@ software_filter::ptr software_filter::create(type n, software_filter_data const
return std::make_unique<available_software_filter>(data, value, file, indent);
case UNAVAILABLE:
return std::make_unique<unavailable_software_filter>(data, value, file, indent);
+ case FAVORITE:
+ return std::make_unique<favorite_software_filter>(data, value, file, indent);
case PARENTS:
return std::make_unique<parents_software_filter>(data, value, file, indent);
case CLONES:
@@ -1715,31 +1823,16 @@ software_filter::ptr software_filter::create(emu_file &file, software_filter_dat
extern const char UI_VERSION_TAG[];
const char UI_VERSION_TAG[] = "# UI INFO ";
-// Years index
-std::vector<std::string> c_year::ui;
-
-// Manufacturers index
-std::vector<std::string> c_mnfct::ui;
-
-// Main filters
-ui::machine_filter::type main_filters::actual = ui::machine_filter::ALL;
-std::map<ui::machine_filter::type, ui::machine_filter::ptr> main_filters::filters;
-
// Globals
uint8_t ui_globals::rpanel = 0;
-uint8_t ui_globals::curimage_view = 0;
uint8_t ui_globals::curdats_view = 0;
uint8_t ui_globals::cur_sw_dats_total = 0;
uint8_t ui_globals::curdats_total = 0;
uint8_t ui_globals::cur_sw_dats_view = 0;
-bool ui_globals::switch_image = false;
-bool ui_globals::default_image = true;
bool ui_globals::reset = false;
-bool ui_globals::redraw_icon = false;
int ui_globals::visible_main_lines = 0;
int ui_globals::visible_sw_lines = 0;
uint16_t ui_globals::panels_status = 0;
-bool ui_globals::has_icons = false;
char* chartrimcarriage(char str[])
{
@@ -1782,72 +1875,6 @@ std::vector<std::string> tokenize(const std::string &text, char sep)
return tokens;
}
-//-------------------------------------------------
-// search a substring with even partial matching
-//-------------------------------------------------
-
-int fuzzy_substring(std::string s_needle, std::string s_haystack)
-{
- if (s_needle.empty())
- return s_haystack.size();
- if (s_haystack.empty())
- return s_needle.size();
-
- strmakelower(s_needle);
- strmakelower(s_haystack);
-
- if (s_needle == s_haystack)
- return 0;
- if (s_haystack.find(s_needle) != std::string::npos)
- return 0;
-
- auto *row1 = global_alloc_array_clear<int>(s_haystack.size() + 2);
- auto *row2 = global_alloc_array_clear<int>(s_haystack.size() + 2);
-
- for (int i = 0; i < s_needle.size(); ++i)
- {
- row2[0] = i + 1;
- for (int j = 0; j < s_haystack.size(); ++j)
- {
- int cost = (s_needle[i] == s_haystack[j]) ? 0 : 1;
- row2[j + 1] = std::min(row1[j + 1] + 1, std::min(row2[j] + 1, row1[j] + cost));
- }
-
- int *tmp = row1;
- row1 = row2;
- row2 = tmp;
- }
-
- int *first, *smallest;
- first = smallest = row1;
- int *last = row1 + s_haystack.size();
-
- while (++first != last)
- if (*first < *smallest)
- smallest = first;
-
- int rv = *smallest;
- global_free_array(row1);
- global_free_array(row2);
-
- return rv;
-}
-
-//-------------------------------------------------
-// set manufacturers
-//-------------------------------------------------
-
-std::string c_mnfct::getname(const char *str)
-{
- std::string name(str);
- size_t found = name.find("(");
-
- if (found != std::string::npos)
- return (name.substr(0, found - 1));
- else
- return name;
-}
-
ui_software_info::ui_software_info(
software_info const &info,
diff --git a/src/frontend/mame/ui/utils.h b/src/frontend/mame/ui/utils.h
index aaedd75854e..e6f2acd6bc8 100644
--- a/src/frontend/mame/ui/utils.h
+++ b/src/frontend/mame/ui/utils.h
@@ -31,10 +31,15 @@ class render_container;
struct ui_system_info
{
ui_system_info() { }
- ui_system_info(game_driver const &d, bool a) : driver(&d), available(a) { }
+ ui_system_info(game_driver const &d, int i, bool a) : driver(&d), index(i), available(a) { }
game_driver const *driver = nullptr;
+ int index;
bool available = false;
+
+ std::u32string ucs_shortname;
+ std::u32string ucs_description;
+ std::u32string ucs_manufacturer_description;
};
struct ui_software_info
@@ -90,35 +95,8 @@ struct ui_software_info
namespace ui {
-class software_filter_data
-{
-public:
- std::vector<std::string> const &regions() const { return m_regions; }
- std::vector<std::string> const &publishers() const { return m_publishers; }
- std::vector<std::string> const &years() const { return m_years; }
- std::vector<std::string> const &device_types() const { return m_device_types; }
- std::vector<std::string> const &list_names() const { return m_list_names; }
- std::vector<std::string> const &list_descriptions() const { return m_list_descriptions; }
-
- // adding entries
- void add_region(std::string const &longname);
- void add_publisher(std::string const &publisher);
- void add_year(std::string const &year);
- void add_device_type(std::string const &device_type);
- void add_list(std::string const &name, std::string const &description);
- void finalise();
-
- // use heuristics to extract meaningful parts from software list fields
- static std::string extract_region(std::string const &longname);
- static std::string extract_publisher(std::string const &publisher);
-
-private:
- std::vector<std::string> m_regions;
- std::vector<std::string> m_publishers;
- std::vector<std::string> m_years;
- std::vector<std::string> m_device_types;
- std::vector<std::string> m_list_names, m_list_descriptions;
-};
+class machine_filter_data;
+class software_filter_data;
template <class Impl, typename Entry>
@@ -196,8 +174,8 @@ public:
virtual type get_type() const = 0;
virtual std::string adorned_display_name(type n) const = 0;
- static ptr create(type n) { return create(n, nullptr, nullptr, 0); }
- static ptr create(emu_file &file) { return create(file, 0); }
+ static ptr create(type n, machine_filter_data const &data) { return create(n, data, nullptr, nullptr, 0); }
+ static ptr create(emu_file &file, machine_filter_data const &data) { return create(file, data, 0); }
static char const *config_name(type n);
static char const *display_name(type n);
@@ -207,8 +185,8 @@ public:
protected:
machine_filter();
- static ptr create(type n, char const *value, emu_file *file, unsigned indent);
- static ptr create(emu_file &file, unsigned indent);
+ static ptr create(type n, machine_filter_data const &data, char const *value, emu_file *file, unsigned indent);
+ static ptr create(emu_file &file, machine_filter_data const &data, unsigned indent);
};
DECLARE_ENUM_INCDEC_OPERATORS(machine_filter::type)
@@ -222,6 +200,7 @@ public:
ALL = 0,
AVAILABLE,
UNAVAILABLE,
+ FAVORITE,
PARENTS,
CLONES,
YEAR,
@@ -259,32 +238,82 @@ protected:
DECLARE_ENUM_INCDEC_OPERATORS(software_filter::type)
-} // namespace ui
-#define MAX_CHAR_INFO 256
+class machine_filter_data
+{
+public:
+ std::vector<std::string> const &manufacturers() const { return m_manufacturers; }
+ std::vector<std::string> const &years() const { return m_years; }
-enum
+ // adding entries
+ void add_manufacturer(std::string const &manufacturer);
+ void add_year(std::string const &year);
+ void finalise();
+
+ // use heuristics to extract meaningful parts from machine metadata
+ static std::string extract_manufacturer(std::string const &manufacturer);
+
+ // the selected filter
+ machine_filter::type get_current_filter_type() const { return m_current_filter; }
+ void set_current_filter_type(machine_filter::type type) { m_current_filter = type; }
+
+ // managing current filters
+ void set_filter(machine_filter::ptr &&filter);
+ auto const &get_filters() { return m_filters; }
+ machine_filter &get_filter(machine_filter::type type);
+ machine_filter *get_current_filter()
+ {
+ auto const it(m_filters.find(m_current_filter));
+ return (m_filters.end() != it) ? it->second.get() : nullptr;
+ }
+ std::string get_config_string() const;
+ bool load_ini(emu_file &file);
+
+private:
+ using filter_map = std::map<machine_filter::type, machine_filter::ptr>;
+
+ std::vector<std::string> m_manufacturers;
+ std::vector<std::string> m_years;
+
+ machine_filter::type m_current_filter = machine_filter::ALL;
+ filter_map m_filters;
+};
+
+
+class software_filter_data
{
- FIRST_VIEW = 0,
- SNAPSHOT_VIEW = FIRST_VIEW,
- CABINETS_VIEW,
- CPANELS_VIEW,
- PCBS_VIEW,
- FLYERS_VIEW,
- TITLES_VIEW,
- ENDS_VIEW,
- ARTPREV_VIEW,
- BOSSES_VIEW,
- LOGOS_VIEW,
- VERSUS_VIEW,
- GAMEOVER_VIEW,
- HOWTO_VIEW,
- SCORES_VIEW,
- SELECT_VIEW,
- MARQUEES_VIEW,
- LAST_VIEW = MARQUEES_VIEW
+public:
+ std::vector<std::string> const &regions() const { return m_regions; }
+ std::vector<std::string> const &publishers() const { return m_publishers; }
+ std::vector<std::string> const &years() const { return m_years; }
+ std::vector<std::string> const &device_types() const { return m_device_types; }
+ std::vector<std::string> const &list_names() const { return m_list_names; }
+ std::vector<std::string> const &list_descriptions() const { return m_list_descriptions; }
+
+ // adding entries
+ void add_region(std::string const &longname);
+ void add_publisher(std::string const &publisher);
+ void add_year(std::string const &year);
+ void add_device_type(std::string const &device_type);
+ void add_list(std::string const &name, std::string const &description);
+ void finalise();
+
+ // use heuristics to extract meaningful parts from software list fields
+ static std::string extract_region(std::string const &longname);
+ static std::string extract_publisher(std::string const &publisher);
+
+private:
+ std::vector<std::string> m_regions;
+ std::vector<std::string> m_publishers;
+ std::vector<std::string> m_years;
+ std::vector<std::string> m_device_types;
+ std::vector<std::string> m_list_names, m_list_descriptions;
};
+} // namespace ui
+
+#define MAX_CHAR_INFO 256
+
enum
{
RP_FIRST = 0,
@@ -326,34 +355,13 @@ enum
// GLOBAL CLASS
struct ui_globals
{
- static uint8_t curimage_view, curdats_view, curdats_total, cur_sw_dats_view, cur_sw_dats_total, rpanel;
- static bool switch_image, redraw_icon, default_image, reset;
+ static uint8_t curdats_view, curdats_total, cur_sw_dats_view, cur_sw_dats_total, rpanel;
+ static bool default_image, reset;
static int visible_main_lines, visible_sw_lines;
- static uint16_t panels_status;
- static bool has_icons;
-};
-
-// Manufacturers
-struct c_mnfct
-{
- static std::string getname(const char *str);
- static std::vector<std::string> ui;
-};
-
-// Years
-struct c_year
-{
- static std::vector<std::string> ui;
-};
-
-struct main_filters
-{
- static ui::machine_filter::type actual;
- static std::map<ui::machine_filter::type, ui::machine_filter::ptr> filters;
+ static uint16_t panels_status;
};
// GLOBAL FUNCTIONS
-int fuzzy_substring(std::string needle, std::string haystack);
char* chartrimcarriage(char str[]);
const char* strensure(const char* s);
int getprecisionchr(const char* s);
diff --git a/src/frontend/mame/ui/videoopt.cpp b/src/frontend/mame/ui/videoopt.cpp
index 7ee243ec4e2..6cf0076734b 100644
--- a/src/frontend/mame/ui/videoopt.cpp
+++ b/src/frontend/mame/ui/videoopt.cpp
@@ -75,7 +75,7 @@ void menu_video_options::handle()
const event *menu_event = process(0);
if (menu_event != nullptr && menu_event->itemref != nullptr)
{
- switch ((uintptr_t)menu_event->itemref)
+ switch ((intptr_t)menu_event->itemref)
{
/* rotate adds rotation depending on the direction */
case VIDEO_ITEM_ROTATE:
diff --git a/src/frontend/mame/ui/widgets.cpp b/src/frontend/mame/ui/widgets.cpp
index cc2c276abfc..d8907303b36 100644
--- a/src/frontend/mame/ui/widgets.cpp
+++ b/src/frontend/mame/ui/widgets.cpp
@@ -14,6 +14,7 @@
namespace ui {
+
/***************************************************************************
WIDGETS
***************************************************************************/
@@ -24,12 +25,12 @@ namespace ui {
widgets_manager::widgets_manager(running_machine &machine)
: m_hilight_bitmap(std::make_unique<bitmap_argb32>(256, 1))
- , m_hilight_texture()
+ , m_hilight_texture(nullptr, machine.render())
, m_hilight_main_bitmap(std::make_unique<bitmap_argb32>(1, 128))
- , m_hilight_main_texture()
+ , m_hilight_main_texture(nullptr, machine.render())
+ , m_arrow_texture(nullptr, machine.render())
{
render_manager &render(machine.render());
- auto const texture_free([&render](render_texture *texture) { render.texture_free(texture); });
// create a texture for hilighting items
for (unsigned x = 0; x < 256; ++x)
@@ -37,7 +38,7 @@ widgets_manager::widgets_manager(running_machine &machine)
unsigned const alpha((x < 25) ? (0xff * x / 25) : (x >(256 - 25)) ? (0xff * (255 - x) / 25) : 0xff);
m_hilight_bitmap->pix32(0, x) = rgb_t(alpha, 0xff, 0xff, 0xff);
}
- m_hilight_texture = texture_ptr(render.texture_alloc(), texture_free);
+ m_hilight_texture.reset(render.texture_alloc());
m_hilight_texture->set_bitmap(*m_hilight_bitmap, m_hilight_bitmap->cliprect(), TEXFORMAT_ARGB32);
// create a texture for hilighting items in main menu
@@ -50,11 +51,11 @@ widgets_manager::widgets_manager(running_machine &machine)
unsigned const b = b1 + (y * (b2 - b1) / 128);
m_hilight_main_bitmap->pix32(y, 0) = rgb_t(r, g, b);
}
- m_hilight_main_texture = texture_ptr(render.texture_alloc(), texture_free);
+ m_hilight_main_texture.reset(render.texture_alloc());
m_hilight_main_texture->set_bitmap(*m_hilight_main_bitmap, m_hilight_main_bitmap->cliprect(), TEXFORMAT_ARGB32);
// create a texture for arrow icons
- m_arrow_texture = texture_ptr(render.texture_alloc(render_triangle), texture_free);
+ m_arrow_texture.reset(render.texture_alloc(render_triangle));
}
diff --git a/src/frontend/mame/ui/widgets.h b/src/frontend/mame/ui/widgets.h
index 45f1725d7ec..567b0a4e499 100644
--- a/src/frontend/mame/ui/widgets.h
+++ b/src/frontend/mame/ui/widgets.h
@@ -21,6 +21,7 @@
namespace ui {
+
/***************************************************************************
TYPE DEFINITIONS
***************************************************************************/
@@ -34,8 +35,17 @@ public:
render_texture *hilight_main_texture() { return m_hilight_main_texture.get(); }
render_texture *arrow_texture() { return m_arrow_texture.get(); }
+ class texture_destroyer
+ {
+ public:
+ texture_destroyer(render_manager &manager) : m_manager(manager) { }
+ void operator()(render_texture *texture) const { m_manager.get().texture_free(texture); }
+ private:
+ std::reference_wrapper<render_manager> m_manager;
+ };
+
using bitmap_ptr = std::unique_ptr<bitmap_argb32>;
- using texture_ptr = std::unique_ptr<render_texture, std::function<void(render_texture *)> >;
+ using texture_ptr = std::unique_ptr<render_texture, texture_destroyer>;
private:
static void render_triangle(bitmap_argb32 &dest, bitmap_argb32 &source, const rectangle &sbounds, void *param);
diff --git a/src/lib/formats/apridisk.h b/src/lib/formats/apridisk.h
index 81db4b41105..1155a0b4a9a 100644
--- a/src/lib/formats/apridisk.h
+++ b/src/lib/formats/apridisk.h
@@ -33,7 +33,7 @@ private:
static const int APR_HEADER_SIZE = 128;
// sector types
- enum
+ enum : uint32_t
{
APR_DELETED = 0xe31d0000,
APR_SECTOR = 0xe31d0001,
diff --git a/src/lib/formats/dsk_dsk.cpp b/src/lib/formats/dsk_dsk.cpp
index 5b019fb53d1..c90579b68d0 100644
--- a/src/lib/formats/dsk_dsk.cpp
+++ b/src/lib/formats/dsk_dsk.cpp
@@ -362,6 +362,12 @@ bool dsk_format::load(io_generic *io, uint32_t form_factor, floppy_image *image)
skip = 2;
}
int tracks = header[0x30];
+
+ int img_tracks, img_heads;
+ image->get_maximal_geometry(img_tracks, img_heads);
+ if (tracks > img_tracks || heads > img_heads)
+ return false;
+
uint64_t track_offsets[84*2];
int cnt =0;
if (!extendformat) {
diff --git a/src/lib/formats/hpi_dsk.cpp b/src/lib/formats/hpi_dsk.cpp
index 8d23f151862..50d2653280d 100644
--- a/src/lib/formats/hpi_dsk.cpp
+++ b/src/lib/formats/hpi_dsk.cpp
@@ -4,9 +4,10 @@
hpi_dsk.cpp
- HP9895A "HPI" disk images
+ HP9885/HP9895A "HPI" disk images
- CHS = 77/2/30
+ CHS = 67/1/30 (SSDD)
+ CHS = 77/2/30 (DSDD)
Sector size 256 bytes
Cell size 2 µs
Gap1 = 16 x 0x00
@@ -40,7 +41,7 @@
256 bytes per sector). There's also a "reduced" version holding
just 75 cylinders.
When loading, the disk image is translated to MMFM encoding so
- that it can be loaded into HP9895 emulator.
+ that it can be loaded into HP9885/HP9895 emulator.
*********************************************************************/
@@ -65,11 +66,14 @@ constexpr int ID_DATA_OFFSET = 30 * 16; // Nominal distance (in cells) between I
// Size of image file (holding 77 cylinders)
constexpr unsigned HPI_IMAGE_SIZE = HPI_TRACKS * HPI_HEADS * HPI_SECTORS * HPI_SECTOR_SIZE;
constexpr unsigned HPI_RED_TRACKS = 75; // Reduced number of tracks
+constexpr unsigned HPI_9885_TRACKS = 67; // Tracks visible to HP9885 drives
// Size of reduced image file (holding 75 cylinders)
constexpr unsigned HPI_RED_IMAGE_SIZE = HPI_RED_TRACKS * HPI_HEADS * HPI_SECTORS * HPI_SECTOR_SIZE;
hpi_format::hpi_format()
{
+ (void)HPI_IMAGE_SIZE;
+ (void)HPI_RED_IMAGE_SIZE;
}
int hpi_format::identify(io_generic *io, uint32_t form_factor)
@@ -79,27 +83,79 @@ int hpi_format::identify(io_generic *io, uint32_t form_factor)
// we try to stay back and give only 50 points, since another image
// format may also have images of the same size (there is no header and no
// magic number for HPI format...
+ unsigned dummy_heads;
+ unsigned dummy_tracks;
if (((form_factor == floppy_image::FF_8) || (form_factor == floppy_image::FF_UNKNOWN)) &&
- ((size == HPI_RED_IMAGE_SIZE) || (size == HPI_IMAGE_SIZE))) {
+ geometry_from_size(size , dummy_heads , dummy_tracks)) {
return 50;
} else {
return 0;
}
}
+bool hpi_format::geometry_from_size(uint64_t image_size , unsigned& heads , unsigned& tracks)
+{
+ if ((image_size % HPI_SECTOR_SIZE) != 0) {
+ // Not a whole number of sectors
+ return false;
+ }
+ unsigned sectors = unsigned(image_size / HPI_SECTOR_SIZE);
+ if ((sectors % HPI_SECTORS) != 0) {
+ // Not a whole number of tracks
+ return false;
+ }
+ unsigned tot_tracks = sectors / HPI_SECTORS;
+ // Possible combinations
+ //
+ // | Tot tracks | Heads | Tracks | Format |
+ // |------------+-------+--------+--------|
+ // | 67 | 1 | 67 | SSDD |
+ // | 77 | 1 | 77 | SSDD |
+ // | 150 | 2 | 75 | DSDD |
+ // | 154 | 2 | 77 | DSDD |
+ //
+ switch (tot_tracks) {
+ case HPI_9885_TRACKS:
+ heads = 1;
+ tracks = HPI_9885_TRACKS;
+ return true;
+
+ case HPI_TRACKS:
+ heads = 1;
+ tracks = HPI_TRACKS;
+ return true;
+
+ case HPI_RED_TRACKS * 2:
+ heads = 2;
+ tracks = HPI_RED_TRACKS;
+ return true;
+
+ case HPI_TRACKS * 2:
+ heads = 2;
+ tracks = HPI_TRACKS;
+ return true;
+
+ default:
+ return false;
+ }
+}
+
bool hpi_format::load(io_generic *io, uint32_t form_factor, floppy_image *image)
{
- image->set_variant(floppy_image::DSDD); // We actually need to derive the variant from the image size depending on the form factor
+ unsigned heads;
+ unsigned cylinders;
uint64_t size = io_generic_size(io);
- unsigned cylinders;
- if (size == HPI_RED_IMAGE_SIZE) {
- cylinders = HPI_RED_TRACKS;
- } else if (size == HPI_IMAGE_SIZE) {
- cylinders = HPI_TRACKS;
- } else {
+ if (!geometry_from_size(size, heads, cylinders)) {
+ return false;
+ }
+ int max_tracks;
+ int max_heads;
+ image->get_maximal_geometry(max_tracks , max_heads);
+ if (cylinders > max_tracks || heads > max_heads) {
return false;
}
+ image->set_variant(heads == 2 ? floppy_image::DSDD : floppy_image::SSDD);
// Suck in the whole image
std::vector<uint8_t> image_data(size);
@@ -118,11 +174,11 @@ bool hpi_format::load(io_generic *io, uint32_t form_factor, floppy_image *image)
unsigned list_offset = 0;
for (unsigned cyl = 0; cyl < cylinders; cyl++) {
- for (unsigned head = 0; head < HPI_HEADS; head++) {
+ for (unsigned head = 0; head < heads; head++) {
std::vector<uint32_t> track_data;
for (unsigned sector = 0; sector < HPI_SECTORS; sector++) {
unsigned real_sector = sector_list[ (sector + list_offset) % HPI_SECTORS ];
- unsigned offset_in_image = chs_to_lba(cyl, head, real_sector) * HPI_SECTOR_SIZE;
+ unsigned offset_in_image = chs_to_lba(cyl, head, real_sector, heads) * HPI_SECTOR_SIZE;
write_sector(track_data , cyl , real_sector + (head << 7) , &image_data[ offset_in_image ]);
}
fill_with_gap3(track_data);
@@ -135,8 +191,12 @@ bool hpi_format::load(io_generic *io, uint32_t form_factor, floppy_image *image)
bool hpi_format::save(io_generic *io, floppy_image *image)
{
- for (unsigned cyl = 0; cyl < HPI_TRACKS; cyl++) {
- for (unsigned head = 0; head < HPI_HEADS; head++) {
+ int tracks;
+ int heads;
+ image->get_actual_geometry(tracks, heads);
+
+ for (int cyl = 0; cyl < tracks; cyl++) {
+ for (int head = 0; head < heads; head++) {
uint8_t bitstream[ 21000 ];
int bitstream_size;
generate_bitstream_from_track(cyl , head , CELL_SIZE , bitstream , bitstream_size , image , 0);
@@ -145,7 +205,7 @@ bool hpi_format::save(io_generic *io, floppy_image *image)
uint8_t sector_data[ HPI_SECTOR_SIZE ];
while (get_next_sector(bitstream , bitstream_size , pos , track_no , head_no , sector_no , sector_data)) {
if (track_no == cyl && head_no == head && sector_no < HPI_SECTORS) {
- unsigned offset_in_image = chs_to_lba(cyl, head, sector_no) * HPI_SECTOR_SIZE;
+ unsigned offset_in_image = chs_to_lba(cyl, head, sector_no, heads) * HPI_SECTOR_SIZE;
io_generic_write(io, sector_data, offset_in_image, HPI_SECTOR_SIZE);
}
}
@@ -300,9 +360,9 @@ void hpi_format::fill_with_gap3(std::vector<uint32_t> &buffer)
}
}
-unsigned hpi_format::chs_to_lba(unsigned cylinder , unsigned head , unsigned sector)
+unsigned hpi_format::chs_to_lba(unsigned cylinder , unsigned head , unsigned sector , unsigned heads)
{
- return sector + (head + cylinder * HPI_HEADS) * HPI_SECTORS;
+ return sector + (head + cylinder * heads) * HPI_SECTORS;
}
std::vector<uint8_t> hpi_format::get_next_id_n_block(const uint8_t *bitstream , int bitstream_size , int& pos , int& start_pos)
diff --git a/src/lib/formats/hpi_dsk.h b/src/lib/formats/hpi_dsk.h
index 8457db1ea24..287f37fd302 100644
--- a/src/lib/formats/hpi_dsk.h
+++ b/src/lib/formats/hpi_dsk.h
@@ -36,6 +36,7 @@ public:
private:
typedef std::array<uint8_t , HPI_SECTORS> sector_list_t;
+ static bool geometry_from_size(uint64_t image_size , unsigned& heads , unsigned& tracks);
static void interleaved_sectors(unsigned il_factor , sector_list_t& sector_list);
void write_mmfm_bit(std::vector<uint32_t> &buffer , bool data_bit , bool clock_bit);
void write_mmfm_byte(std::vector<uint32_t> &buffer , uint8_t data , uint8_t clock = 0);
@@ -43,7 +44,7 @@ private:
void write_crc(std::vector<uint32_t> &buffer , uint16_t crc);
void write_sector(std::vector<uint32_t> &buffer , uint8_t track_no , uint8_t sect_head_no , const uint8_t *sect_data);
void fill_with_gap3(std::vector<uint32_t> &buffer);
- static unsigned chs_to_lba(unsigned cylinder , unsigned head , unsigned sector);
+ static unsigned chs_to_lba(unsigned cylinder , unsigned head , unsigned sector , unsigned heads);
std::vector<uint8_t> get_next_id_n_block(const uint8_t *bitstream , int bitstream_size , int& pos , int& start_pos);
bool get_next_sector(const uint8_t *bitstream , int bitstream_size , int& pos , unsigned& track , unsigned& head , unsigned& sector , uint8_t *sector_data);
diff --git a/src/lib/formats/mtx_dsk.cpp b/src/lib/formats/mtx_dsk.cpp
new file mode 100644
index 00000000000..95420f40aab
--- /dev/null
+++ b/src/lib/formats/mtx_dsk.cpp
@@ -0,0 +1,53 @@
+// license:BSD-3-Clause
+// copyright-holders:Nigel Barnes
+/***************************************************************************
+
+ Memotech MTX
+
+ Disk image format
+
+***************************************************************************/
+
+#include "mtx_dsk.h"
+
+mtx_format::mtx_format() : wd177x_format(formats)
+{
+}
+
+const char *mtx_format::name() const
+{
+ return "mtx";
+}
+
+const char *mtx_format::description() const
+{
+ return "Memotech MTX disk image";
+}
+
+const char *mtx_format::extensions() const
+{
+ return "mfloppy";
+}
+
+const mtx_format::format mtx_format::formats[] =
+{
+ { // 320k 5 1/4 inch double density single sided (Type 03)
+ floppy_image::FF_525, floppy_image::DSDD, floppy_image::MFM,
+ 2000, 16, 40, 2, 256, {}, 1, {}, 32, 22, 54
+ },
+ { // 640k 5 1/4 inch double density double sided (Type 07)
+ floppy_image::FF_525, floppy_image::DSQD, floppy_image::MFM,
+ 2000, 16, 80, 2, 256, {}, 1, {}, 32, 22, 54
+ },
+ { // 320k 3 1/2 inch double density single sided (Type 03)
+ floppy_image::FF_35, floppy_image::DSDD, floppy_image::MFM,
+ 2000, 16, 40, 2, 256, {}, 1, {}, 32, 22, 54
+ },
+ { // 640k 3 1/2 inch double density double sided (Type 07)
+ floppy_image::FF_35, floppy_image::DSQD, floppy_image::MFM,
+ 2000, 16, 80, 2, 256, {}, 1, {}, 32, 22, 54
+ },
+ {}
+};
+
+const floppy_format_type FLOPPY_MTX_FORMAT = &floppy_image_format_creator<mtx_format>;
diff --git a/src/lib/formats/mtx_dsk.h b/src/lib/formats/mtx_dsk.h
new file mode 100644
index 00000000000..86f74bccfc5
--- /dev/null
+++ b/src/lib/formats/mtx_dsk.h
@@ -0,0 +1,33 @@
+// license:BSD-3-Clause
+// copyright-holders:Nigel Barnes
+/***************************************************************************
+
+ Memotech MTX
+
+ Disk image format
+
+***************************************************************************/
+
+#pragma once
+
+#ifndef __MTX_DSK_H__
+#define __MTX_DSK_H__
+
+#include "wd177x_dsk.h"
+
+class mtx_format : public wd177x_format
+{
+public:
+ mtx_format();
+
+ virtual const char *name() const override;
+ virtual const char *description() const override;
+ virtual const char *extensions() const override;
+
+private:
+ static const format formats[];
+};
+
+extern const floppy_format_type FLOPPY_MTX_FORMAT;
+
+#endif // __MTX_DSK_H__
diff --git a/src/lib/formats/opd_dsk.cpp b/src/lib/formats/opd_dsk.cpp
new file mode 100644
index 00000000000..b45b58762ed
--- /dev/null
+++ b/src/lib/formats/opd_dsk.cpp
@@ -0,0 +1,61 @@
+// license:BSD-3-Clause
+// copyright-holders:Nigel Barnes
+/***************************************************************************
+
+ Sinclair ZX Spectrum
+
+ Opus Discovery disk image formats
+
+***************************************************************************/
+
+#include "opd_dsk.h"
+
+
+opd_format::opd_format() : wd177x_format(formats)
+{
+}
+
+const char *opd_format::name() const
+{
+ return "opd";
+}
+
+const char *opd_format::description() const
+{
+ return "Opus Discovery disk image";
+}
+
+const char *opd_format::extensions() const
+{
+ return "opd,opu";
+}
+
+int opd_format::identify(io_generic *io, uint32_t form_factor)
+{
+ int type = find_size(io, form_factor);
+
+ if (type != -1)
+ return 90;
+ return 0;
+}
+
+int opd_format::get_image_offset(const format &f, int head, int track)
+{
+ return (f.track_count * head + track) * compute_track_size(f);
+}
+
+const opd_format::format opd_format::formats[] =
+{
+ { // 180k 40 track single sided double density - gaps unverified
+ floppy_image::FF_35, floppy_image::SSSD, floppy_image::MFM,
+ 2000, 18, 40, 1, 256, {}, 0, {}, 36, 22, 27
+ },
+ { // 360k 40 track double sided double density - gaps unverified
+ floppy_image::FF_35, floppy_image::DSSD, floppy_image::MFM,
+ 2000, 18, 40, 2, 256, {}, 0, {}, 36, 22, 27
+ },
+ {}
+};
+
+
+const floppy_format_type FLOPPY_OPD_FORMAT = &floppy_image_format_creator<opd_format>;
diff --git a/src/lib/formats/opd_dsk.h b/src/lib/formats/opd_dsk.h
new file mode 100644
index 00000000000..3eb018ca1dc
--- /dev/null
+++ b/src/lib/formats/opd_dsk.h
@@ -0,0 +1,38 @@
+// license:BSD-3-Clause
+// copyright-holders:Nigel Barnes
+/***************************************************************************
+
+ Sinclair ZX Spectrum
+
+ Opus Discovery disk image formats
+
+***************************************************************************/
+
+#pragma once
+
+#ifndef OPD_DSK_H
+#define OPD_DSK_H
+
+#include "flopimg.h"
+#include "wd177x_dsk.h"
+
+
+class opd_format : public wd177x_format
+{
+public:
+ opd_format();
+
+ virtual int identify(io_generic *io, uint32_t form_factor) override;
+ virtual int get_image_offset(const format &f, int head, int track) override;
+ virtual const char *name() const override;
+ virtual const char *description() const override;
+ virtual const char *extensions() const override;
+
+private:
+ static const format formats[];
+};
+
+
+extern const floppy_format_type FLOPPY_OPD_FORMAT;
+
+#endif // OPD_DSK_H
diff --git a/src/lib/netlist/analog/nld_bjt.cpp b/src/lib/netlist/analog/nld_bjt.cpp
index 6f4a2db86bf..aef920635fe 100644
--- a/src/lib/netlist/analog/nld_bjt.cpp
+++ b/src/lib/netlist/analog/nld_bjt.cpp
@@ -5,47 +5,49 @@
*
*/
-#include "../solver/nld_solver.h"
+#include "netlist/solver/nld_solver.h"
+#include "netlist/nl_setup.h"
#include "nlid_twoterm.h"
-#include "../nl_setup.h"
+
#include <cmath>
namespace netlist
{
- namespace analog
- {
-
-class diode
+namespace analog
{
-public:
- diode() : m_Is(1e-15), m_VT(0.0258), m_VT_inv(1.0 / m_VT) {}
- diode(const nl_double Is, const nl_double n)
- {
- m_Is = Is;
- m_VT = 0.0258 * n;
- m_VT_inv = 1.0 / m_VT;
- }
- void set(const nl_double Is, const nl_double n)
- {
- m_Is = Is;
- m_VT = 0.0258 * n;
- m_VT_inv = 1.0 / m_VT;
- }
- nl_double I(const nl_double V) const { return m_Is * std::exp(V * m_VT_inv) - m_Is; }
- nl_double g(const nl_double V) const { return m_Is * m_VT_inv * std::exp(V * m_VT_inv); }
- nl_double V(const nl_double I) const { return std::log1p(I / m_Is) * m_VT; } // log1p(x)=log(1.0 + x)
- nl_double gI(const nl_double I) const { return m_VT_inv * (I + m_Is); }
+ using constants = plib::constants<nl_double>;
-private:
- nl_double m_Is;
- nl_double m_VT;
- nl_double m_VT_inv;
-};
+ class diode
+ {
+ public:
+ diode() : m_Is(1e-15), m_VT(0.0258), m_VT_inv(1.0 / m_VT) {}
+ diode(const nl_double Is, const nl_double n)
+ {
+ m_Is = Is;
+ m_VT = 0.0258 * n;
+ m_VT_inv = 1.0 / m_VT;
+ }
+ void set(const nl_double Is, const nl_double n)
+ {
+ m_Is = Is;
+ m_VT = 0.0258 * n;
+ m_VT_inv = 1.0 / m_VT;
+ }
+ nl_double I(const nl_double V) const { return m_Is * std::exp(V * m_VT_inv) - m_Is; }
+ nl_double g(const nl_double V) const { return m_Is * m_VT_inv * std::exp(V * m_VT_inv); }
+ nl_double V(const nl_double I) const { return std::log1p(I / m_Is) * m_VT; } // log1p(x)=log(1.0 + x)
+ nl_double gI(const nl_double I) const { return m_VT_inv * (I + m_Is); }
+
+ private:
+ nl_double m_Is;
+ nl_double m_VT;
+ nl_double m_VT_inv;
+ };
-// -----------------------------------------------------------------------------
-// nld_Q - Base classes
-// -----------------------------------------------------------------------------
+ // -----------------------------------------------------------------------------
+ // nld_Q - Base classes
+ // -----------------------------------------------------------------------------
/*! Class representing the bjt model paramers.
*
@@ -73,7 +75,7 @@ private:
* | | RBM | minimum base resistance at high currents | | RB | 10 | * |
* | | RE | emitter resistance | | 0 | 1 | * |
* | | RC | collector resistance | | 0 | 10 | * |
- * | | CJE | B-E zero-bias depletion capacitance | F | 0 | 2pF | * |
+ * | Y | CJE | B-E zero-bias depletion capacitance | F | 0 | 2pF | * |
* | | VJE | B-E built-in potential | V | 0.75 | 0.6 | |
* | | MJE | B-E junction exponential factor | - | 0.33 | 0.33 | |
* | | TF | ideal forward transit time | sec | 0 | 0.1ns | |
@@ -81,7 +83,7 @@ private:
* | | VTF | voltage describing VBC dependence of TF | V | infinite | | |
* | | ITF | high-current parameter for effect on TF | A | 0 | | * |
* | | PTF | excess phase at freq=1.0/(TF*2PI) Hz | deg | 0 | | |
- * | | CJC | B-C zero-bias depletion capacitance | F | 0 | 2pF | * |
+ * | Y | CJC | B-C zero-bias depletion capacitance | F | 0 | 2pF | * |
* | | VJC | B-C built-in potential | V | 0.75 | 0.5 | |
* | | MJC | B-C junction exponential factor | - | 0.33 | 0.5 | |
* | | XCJC | fraction of B-C depletion capacitance connected to internal base node | - | 1 | | |
@@ -95,343 +97,369 @@ private:
* | | KF | flicker-noise coefficient | - | 0 | | |
* | | AF | flicker-noise exponent | - | 1 | | |
* | | FC | coefficient for forward-bias depletion capacitance formula | - | 0.5 | | |
- * | | TNOM | Parameter measurement temperature | C | 27 | 50 | | */
+ * | | TNOM | Parameter measurement temperature | C | 27 | 50 | |
+ * */
class bjt_model_t : public param_model_t
{
public:
bjt_model_t(device_t &device, const pstring &name, const pstring &val)
: param_model_t(device, name, val)
- , m_IS(*this, "IS")
- , m_BF(*this, "BF")
- , m_NF(*this, "NF")
- , m_BR(*this, "BR")
- , m_NR(*this, "NR")
+ , m_IS (*this, "IS")
+ , m_BF (*this, "BF")
+ , m_NF (*this, "NF")
+ , m_BR (*this, "BR")
+ , m_NR (*this, "NR")
+ , m_CJE(*this, "CJE")
+ , m_CJC(*this, "CJC")
{}
- value_t m_IS; //!< transport saturation current
- value_t m_BF; //!< ideal maximum forward beta
- value_t m_NF; //!< forward current emission coefficient
- value_t m_BR; //!< ideal maximum reverse beta
- value_t m_NR; //!< reverse current emission coefficient
+ value_t m_IS; //!< transport saturation current
+ value_t m_BF; //!< ideal maximum forward beta
+ value_t m_NF; //!< forward current emission coefficient
+ value_t m_BR; //!< ideal maximum reverse beta
+ value_t m_NR; //!< reverse current emission coefficient
+ value_t m_CJE; //!< B-E zero-bias depletion capacitance
+ value_t m_CJC; //!< B-C zero-bias depletion capacitance
+
};
// Have a common start for transistors
-NETLIB_OBJECT(Q)
-{
-public:
- enum q_type {
- BJT_NPN,
- BJT_PNP
+ NETLIB_OBJECT(Q)
+ {
+ public:
+ enum q_type {
+ BJT_NPN,
+ BJT_PNP
+ };
+
+ NETLIB_CONSTRUCTOR(Q)
+ , m_model(*this, "MODEL", "NPN")
+ , m_qtype(BJT_NPN)
+ {
+ }
+
+ NETLIB_IS_DYNAMIC(true)
+
+ //NETLIB_RESETI();
+ NETLIB_UPDATEI();
+
+ q_type qtype() const { return m_qtype; }
+ bool is_qtype(q_type atype) const { return m_qtype == atype; }
+ void set_qtype(q_type atype) { m_qtype = atype; }
+ protected:
+
+ bjt_model_t m_model;
+ private:
+ q_type m_qtype;
};
- NETLIB_CONSTRUCTOR(Q)
- , m_model(*this, "MODEL", "NPN")
- , m_qtype(BJT_NPN)
+ NETLIB_OBJECT_DERIVED(QBJT, Q)
{
- }
-
- NETLIB_IS_DYNAMIC(true)
-
- //NETLIB_RESETI();
- NETLIB_UPDATEI();
+ public:
+ NETLIB_CONSTRUCTOR_DERIVED(QBJT, Q)
+ { }
- inline q_type qtype() const { return m_qtype; }
- inline bool is_qtype(q_type atype) const { return m_qtype == atype; }
- inline void set_qtype(q_type atype) { m_qtype = atype; }
-protected:
+ protected:
- bjt_model_t m_model;
-private:
- q_type m_qtype;
-};
+ private:
+ };
-NETLIB_OBJECT_DERIVED(QBJT, Q)
-{
-public:
- NETLIB_CONSTRUCTOR_DERIVED(QBJT, Q)
- { }
-protected:
-private:
-};
+ // -----------------------------------------------------------------------------
+ // nld_QBJT_switch
+ // -----------------------------------------------------------------------------
+ /*
+ * + - C
+ * B ----VVV----+ |
+ * | |
+ * Rb Rc
+ * Rb Rc
+ * Rb Rc
+ * | |
+ * +----+----+
+ * |
+ * E
+ */
-// -----------------------------------------------------------------------------
-// nld_QBJT_switch
-// -----------------------------------------------------------------------------
+ NETLIB_OBJECT_DERIVED(QBJT_switch, QBJT)
+ {
+ NETLIB_CONSTRUCTOR_DERIVED(QBJT_switch, QBJT)
+ , m_RB(*this, "m_RB", true)
+ , m_RC(*this, "m_RC", true)
+ , m_BC_dummy(*this, "m_BC", true)
+ , m_gB(1e-9)
+ , m_gC(1e-9)
+ , m_V(0.0)
+ , m_state_on(*this, "m_state_on", 0)
+ {
+ register_subalias("B", m_RB.m_P);
+ register_subalias("E", m_RB.m_N);
+ register_subalias("C", m_RC.m_P);
+ //register_term("_E1", m_RC.m_N);
+
+ //register_term("_B1", m_BC_dummy.m_P);
+ //register_term("_C1", m_BC_dummy.m_N);
+
+ connect(m_RB.m_N, m_RC.m_N);
+
+ connect(m_RB.m_P, m_BC_dummy.m_P);
+ connect(m_RC.m_P, m_BC_dummy.m_N);
+ }
+
+ NETLIB_RESETI();
+ NETLIB_UPDATEI();
+ NETLIB_UPDATE_PARAMI();
+ NETLIB_UPDATE_TERMINALSI();
+
+ private:
+ nld_twoterm m_RB;
+ nld_twoterm m_RC;
+
+ // FIXME: this is needed so we have all terminals belong to one net list
+
+ nld_twoterm m_BC_dummy;
+
+ nl_double m_gB; // base conductance / switch on
+ nl_double m_gC; // collector conductance / switch on
+ nl_double m_V; // internal voltage source
+ state_var<unsigned> m_state_on;
+
+ private:
+ };
+ // -----------------------------------------------------------------------------
+ // nld_QBJT_EB
+ // -----------------------------------------------------------------------------
-/*
- * + - C
- * B ----VVV----+ |
- * | |
- * Rb Rc
- * Rb Rc
- * Rb Rc
- * | |
- * +----+----+
- * |
- * E
- */
-NETLIB_OBJECT_DERIVED(QBJT_switch, QBJT)
-{
- NETLIB_CONSTRUCTOR_DERIVED(QBJT_switch, QBJT)
- , m_RB(*this, "m_RB", true)
- , m_RC(*this, "m_RC", true)
- , m_BC_dummy(*this, "m_BC", true)
- , m_gB(NETLIST_GMIN_DEFAULT)
- , m_gC(NETLIST_GMIN_DEFAULT)
- , m_V(0.0)
- , m_state_on(*this, "m_state_on", 0)
+ NETLIB_OBJECT_DERIVED(QBJT_EB, QBJT)
{
- register_subalias("B", m_RB.m_P);
- register_subalias("E", m_RB.m_N);
- register_subalias("C", m_RC.m_P);
- //register_term("_E1", m_RC.m_N);
+ public:
+ NETLIB_CONSTRUCTOR_DERIVED(QBJT_EB, QBJT)
+ , m_gD_BC(*this, "m_D_BC")
+ , m_gD_BE(*this, "m_D_BE")
+ , m_D_CB(*this, "m_D_CB", true)
+ , m_D_EB(*this, "m_D_EB", true)
+ , m_D_EC(*this, "m_D_EC", true)
+ , m_alpha_f(0)
+ , m_alpha_r(0)
+ {
+ register_subalias("E", m_D_EB.m_P); // Cathode
+ register_subalias("B", m_D_EB.m_N); // Anode
+
+ register_subalias("C", m_D_CB.m_P); // Cathode
+
+ connect(m_D_EB.m_P, m_D_EC.m_P);
+ connect(m_D_EB.m_N, m_D_CB.m_N);
+ connect(m_D_CB.m_P, m_D_EC.m_N);
+
+ if (m_model.m_CJE > 0.0)
+ {
+ create_and_register_subdevice("m_CJE", m_CJE);
+ connect("B", "m_CJE.1");
+ connect("E", "m_CJE.2");
+ }
+ if (m_model.m_CJC > 0.0)
+ {
+ create_and_register_subdevice("m_CJC", m_CJC);
+ connect("B", "m_CJC.1");
+ connect("C", "m_CJC.2");
+ }
+ }
+
+ protected:
+
+ NETLIB_RESETI();
+ NETLIB_UPDATEI();
+ NETLIB_UPDATE_PARAMI();
+ NETLIB_UPDATE_TERMINALSI();
+
+ private:
+ generic_diode<diode_e::BIPOLAR> m_gD_BC;
+ generic_diode<diode_e::BIPOLAR> m_gD_BE;
+
+ nld_twoterm m_D_CB; // gcc, gce - gcc, gec - gcc, gcc - gce | Ic
+ nld_twoterm m_D_EB; // gee, gec - gee, gce - gee, gee - gec | Ie
+ nld_twoterm m_D_EC; // 0, -gec, -gcc, 0 | 0
+
+ nl_double m_alpha_f;
+ nl_double m_alpha_r;
+
+ NETLIB_SUBXX(analog, C) m_CJE;
+ NETLIB_SUBXX(analog, C) m_CJC;
+ };
- //register_term("_B1", m_BC_dummy.m_P);
- //register_term("_C1", m_BC_dummy.m_N);
- connect(m_RB.m_N, m_RC.m_N);
+ // ----------------------------------------------------------------------------------------
+ // nld_Q
+ // ----------------------------------------------------------------------------------------
- connect(m_RB.m_P, m_BC_dummy.m_P);
- connect(m_RC.m_P, m_BC_dummy.m_N);
+ NETLIB_UPDATE(Q)
+ {
+ // netlist().solver()->schedule1();
}
- NETLIB_RESETI();
- NETLIB_UPDATEI();
- NETLIB_UPDATE_PARAMI();
- NETLIB_UPDATE_TERMINALSI();
-
- nld_twoterm m_RB;
- nld_twoterm m_RC;
-
- // FIXME: this is needed so we have all terminals belong to one net list
+ // ----------------------------------------------------------------------------------------
+ // nld_QBJT_switch
+ // ----------------------------------------------------------------------------------------
- nld_twoterm m_BC_dummy;
-
-protected:
+ NETLIB_RESET(QBJT_switch)
+ {
+ NETLIB_NAME(Q)::reset();
- nl_double m_gB; // base conductance / switch on
- nl_double m_gC; // collector conductance / switch on
- nl_double m_V; // internal voltage source
- state_var<unsigned> m_state_on;
+ m_state_on = 0;
-private:
-};
+ m_RB.set_G_V_I(exec().gmin(), 0.0, 0.0);
+ m_RC.set_G_V_I(exec().gmin(), 0.0, 0.0);
-// -----------------------------------------------------------------------------
-// nld_QBJT_EB
-// -----------------------------------------------------------------------------
+ m_BC_dummy.set_G_V_I(exec().gmin() / 10.0, 0.0, 0.0);
+ }
-NETLIB_OBJECT_DERIVED(QBJT_EB, QBJT)
-{
-public:
- NETLIB_CONSTRUCTOR_DERIVED(QBJT_EB, QBJT)
- , m_gD_BC(*this, "m_D_BC")
- , m_gD_BE(*this, "m_D_BE")
- , m_D_CB(*this, "m_D_CB", true)
- , m_D_EB(*this, "m_D_EB", true)
- , m_D_EC(*this, "m_D_EC", true)
- , m_alpha_f(0)
- , m_alpha_r(0)
+ NETLIB_UPDATE(QBJT_switch)
{
- register_subalias("E", m_D_EB.m_P); // Cathode
- register_subalias("B", m_D_EB.m_N); // Anode
-
- register_subalias("C", m_D_CB.m_P); // Cathode
- //register_term("_B1", m_D_CB.m_N); // Anode
-
- //register_term("_E1", m_D_EC.m_P);
- //register_term("_C1", m_D_EC.m_N);
-
- connect(m_D_EB.m_P, m_D_EC.m_P);
- connect(m_D_EB.m_N, m_D_CB.m_N);
- connect(m_D_CB.m_P, m_D_EC.m_N);
+ if (!m_RB.m_P.net().isRailNet())
+ m_RB.m_P.solve_now(); // Basis
+ else if (!m_RB.m_N.net().isRailNet())
+ m_RB.m_N.solve_now(); // Emitter
+ else if (!m_RC.m_P.net().isRailNet())
+ m_RC.m_P.solve_now(); // Collector
}
-protected:
-
- NETLIB_RESETI();
- NETLIB_UPDATEI();
- NETLIB_UPDATE_PARAMI();
- NETLIB_UPDATE_TERMINALSI();
-
- generic_diode m_gD_BC;
- generic_diode m_gD_BE;
-
-private:
- nld_twoterm m_D_CB; // gcc, gce - gcc, gec - gcc, gcc - gce | Ic
- nld_twoterm m_D_EB; // gee, gec - gee, gce - gee, gee - gec | Ie
- nld_twoterm m_D_EC; // 0, -gec, -gcc, 0 | 0
-
- nl_double m_alpha_f;
- nl_double m_alpha_r;
-
-};
-
-
-// ----------------------------------------------------------------------------------------
-// nld_Q
-// ----------------------------------------------------------------------------------------
-
-NETLIB_UPDATE(Q)
-{
-// netlist().solver()->schedule1();
-}
-
-// ----------------------------------------------------------------------------------------
-// nld_QBJT_switch
-// ----------------------------------------------------------------------------------------
-
-
-NETLIB_RESET(QBJT_switch)
-{
- NETLIB_NAME(Q)::reset();
- m_state_on = 0;
-
- m_RB.set(netlist().gmin(), 0.0, 0.0);
- m_RC.set(netlist().gmin(), 0.0, 0.0);
-
- m_BC_dummy.set(netlist().gmin() / 10.0, 0.0, 0.0);
-
-}
+ NETLIB_UPDATE_PARAM(QBJT_switch)
+ {
+ nl_double IS = m_model.m_IS;
+ nl_double BF = m_model.m_BF;
+ nl_double NF = m_model.m_NF;
+ //nl_double VJE = m_model.dValue("VJE", 0.75);
-NETLIB_UPDATE(QBJT_switch)
-{
- if (!m_RB.m_P.net().isRailNet())
- m_RB.m_P.solve_now(); // Basis
- else if (!m_RB.m_N.net().isRailNet())
- m_RB.m_N.solve_now(); // Emitter
- else if (!m_RC.m_P.net().isRailNet())
- m_RC.m_P.solve_now(); // Collector
-}
+ set_qtype((m_model.model_type() == "NPN") ? BJT_NPN : BJT_PNP);
+ nl_double alpha = BF / (1.0 + BF);
-NETLIB_UPDATE_PARAM(QBJT_switch)
-{
- nl_double IS = m_model.m_IS;
- nl_double BF = m_model.m_BF;
- nl_double NF = m_model.m_NF;
- //nl_double VJE = m_model.dValue("VJE", 0.75);
+ diode d(IS, NF);
- set_qtype((m_model.model_type() == "NPN") ? BJT_NPN : BJT_PNP);
+ // Assume 5mA Collector current for switch operation
- nl_double alpha = BF / (1.0 + BF);
+ m_V = d.V(0.005 / alpha);
- diode d(IS, NF);
+ /* Base current is 0.005 / beta
+ * as a rough estimate, we just scale the conductance down */
- // Assume 5mA Collector current for switch operation
+ m_gB = 1.0 / (m_V/(0.005 / BF));
- m_V = d.V(0.005 / alpha);
+ //m_gB = d.gI(0.005 / alpha);
- /* Base current is 0.005 / beta
- * as a rough estimate, we just scale the conductance down */
+ if (m_gB < exec().gmin())
+ m_gB = exec().gmin();
+ m_gC = d.gI(0.005); // very rough estimate
+ }
- m_gB = 1.0 / (m_V/(0.005 / BF));
+ NETLIB_UPDATE_TERMINALS(QBJT_switch)
+ {
+ const nl_double m = (is_qtype( BJT_NPN) ? 1 : -1);
+
+ const unsigned new_state = (m_RB.deltaV() * m > m_V ) ? 1 : 0;
+ if (m_state_on ^ new_state)
+ {
+ const nl_double gb = new_state ? m_gB : exec().gmin();
+ const nl_double gc = new_state ? m_gC : exec().gmin();
+ const nl_double v = new_state ? m_V * m : 0;
+
+ m_RB.set_G_V_I(gb, v, 0.0);
+ m_RC.set_G_V_I(gc, 0.0, 0.0);
+ m_state_on = new_state;
+ }
+ }
- //m_gB = d.gI(0.005 / alpha);
- if (m_gB < netlist().gmin())
- m_gB = netlist().gmin();
- m_gC = d.gI(0.005); // very rough estimate
-}
+ // ----------------------------------------------------------------------------------------
+ // nld_Q - Ebers Moll
+ // ----------------------------------------------------------------------------------------
-NETLIB_UPDATE_TERMINALS(QBJT_switch)
-{
- const nl_double m = (is_qtype( BJT_NPN) ? 1 : -1);
- const unsigned new_state = (m_RB.deltaV() * m > m_V ) ? 1 : 0;
- if (m_state_on ^ new_state)
+ NETLIB_UPDATE(QBJT_EB)
{
- const nl_double gb = new_state ? m_gB : netlist().gmin();
- const nl_double gc = new_state ? m_gC : netlist().gmin();
- const nl_double v = new_state ? m_V * m : 0;
-
- m_RB.set(gb, v, 0.0);
- m_RC.set(gc, 0.0, 0.0);
- m_state_on = new_state;
+ if (!m_D_EB.m_P.net().isRailNet())
+ m_D_EB.m_P.solve_now(); // Basis
+ else if (!m_D_EB.m_N.net().isRailNet())
+ m_D_EB.m_N.solve_now(); // Emitter
+ else
+ m_D_CB.m_N.solve_now(); // Collector
}
-}
+ NETLIB_RESET(QBJT_EB)
+ {
+ NETLIB_NAME(Q)::reset();
+ if (m_CJE)
+ {
+ m_CJE->reset();
+ m_CJE->m_C.setTo(m_model.m_CJE);
+ }
+ if (m_CJC)
+ {
+ m_CJC->reset();
+ m_CJC->m_C.setTo(m_model.m_CJC);
+ }
-// ----------------------------------------------------------------------------------------
-// nld_Q - Ebers Moll
-// ----------------------------------------------------------------------------------------
+ }
+ NETLIB_UPDATE_TERMINALS(QBJT_EB)
+ {
+ const nl_double polarity = (qtype() == BJT_NPN ? 1.0 : -1.0);
+
+ m_gD_BE.update_diode(-m_D_EB.deltaV() * polarity);
+ m_gD_BC.update_diode(-m_D_CB.deltaV() * polarity);
+
+ const nl_double gee = m_gD_BE.G();
+ const nl_double gcc = m_gD_BC.G();
+ const nl_double gec = m_alpha_r * gcc;
+ const nl_double gce = m_alpha_f * gee;
+ const nl_double sIe = -m_gD_BE.I() + m_alpha_r * m_gD_BC.I();
+ const nl_double sIc = m_alpha_f * m_gD_BE.I() - m_gD_BC.I();
+ const nl_double Ie = (sIe + gee * m_gD_BE.Vd() - gec * m_gD_BC.Vd()) * polarity;
+ const nl_double Ic = (sIc - gce * m_gD_BE.Vd() + gcc * m_gD_BC.Vd()) * polarity;
+
+ m_D_EB.set_mat( gee, gec - gee, -Ie,
+ gce - gee, gee - gec, Ie);
+ m_D_CB.set_mat( gcc, gce - gcc, -Ic,
+ gec - gcc, gcc - gce, Ic);
+ m_D_EC.set_mat( 0, -gec, 0,
+ -gce, 0, 0);
+ }
-NETLIB_UPDATE(QBJT_EB)
-{
- if (!m_D_EB.m_P.net().isRailNet())
- m_D_EB.m_P.solve_now(); // Basis
- else if (!m_D_EB.m_N.net().isRailNet())
- m_D_EB.m_N.solve_now(); // Emitter
- else
- m_D_CB.m_N.solve_now(); // Collector
-}
-
-NETLIB_RESET(QBJT_EB)
-{
- NETLIB_NAME(Q)::reset();
-}
-NETLIB_UPDATE_TERMINALS(QBJT_EB)
-{
- const nl_double polarity = (qtype() == BJT_NPN ? 1.0 : -1.0);
-
- m_gD_BE.update_diode(-m_D_EB.deltaV() * polarity);
- m_gD_BC.update_diode(-m_D_CB.deltaV() * polarity);
-
- const nl_double gee = m_gD_BE.G();
- const nl_double gcc = m_gD_BC.G();
- const nl_double gec = m_alpha_r * gcc;
- const nl_double gce = m_alpha_f * gee;
- const nl_double sIe = -m_gD_BE.I() + m_alpha_r * m_gD_BC.I();
- const nl_double sIc = m_alpha_f * m_gD_BE.I() - m_gD_BC.I();
- const nl_double Ie = (sIe + gee * m_gD_BE.Vd() - gec * m_gD_BC.Vd()) * polarity;
- const nl_double Ic = (sIc - gce * m_gD_BE.Vd() + gcc * m_gD_BC.Vd()) * polarity;
-
- m_D_EB.set_mat( gee, gec - gee, -Ie,
- gce - gee, gee - gec, Ie);
- m_D_CB.set_mat( gcc, gce - gcc, -Ic,
- gec - gcc, gcc - gce, Ic);
- m_D_EC.set_mat( 0, -gec, 0,
- -gce, 0, 0);
-}
-
-
-NETLIB_UPDATE_PARAM(QBJT_EB)
-{
- nl_double IS = m_model.m_IS;
- nl_double BF = m_model.m_BF;
- nl_double NF = m_model.m_NF;
- nl_double BR = m_model.m_BR;
- nl_double NR = m_model.m_NR;
- //nl_double VJE = m_model.dValue("VJE", 0.75);
+ NETLIB_UPDATE_PARAM(QBJT_EB)
+ {
+ nl_double IS = m_model.m_IS;
+ nl_double BF = m_model.m_BF;
+ nl_double NF = m_model.m_NF;
+ nl_double BR = m_model.m_BR;
+ nl_double NR = m_model.m_NR;
+ //nl_double VJE = m_model.dValue("VJE", 0.75);
- set_qtype((m_model.model_type() == "NPN") ? BJT_NPN : BJT_PNP);
+ set_qtype((m_model.model_type() == "NPN") ? BJT_NPN : BJT_PNP);
- m_alpha_f = BF / (1.0 + BF);
- m_alpha_r = BR / (1.0 + BR);
+ m_alpha_f = BF / (1.0 + BF);
+ m_alpha_r = BR / (1.0 + BR);
- m_gD_BE.set_param(IS / m_alpha_f, NF, netlist().gmin());
- m_gD_BC.set_param(IS / m_alpha_r, NR, netlist().gmin());
-}
+ m_gD_BE.set_param(IS / m_alpha_f, NF, exec().gmin(), constants::T0());
+ m_gD_BC.set_param(IS / m_alpha_r, NR, exec().gmin(), constants::T0());
+ }
- } //namespace analog
+} // namespace analog
- namespace devices {
- NETLIB_DEVICE_IMPL_NS(analog, QBJT_EB)
- NETLIB_DEVICE_IMPL_NS(analog, QBJT_switch)
- }
+namespace devices {
+ NETLIB_DEVICE_IMPL_NS(analog, QBJT_EB, "QBJT_EB", "MODEL")
+ NETLIB_DEVICE_IMPL_NS(analog, QBJT_switch, "QBJT_SW", "MODEL")
+} // namespace devices
} // namespace netlist
diff --git a/src/lib/netlist/analog/nld_bjt.h b/src/lib/netlist/analog/nld_bjt.h
index 9e1f82afbaa..3a8478f19f7 100644
--- a/src/lib/netlist/analog/nld_bjt.h
+++ b/src/lib/netlist/analog/nld_bjt.h
@@ -8,7 +8,7 @@
#ifndef NLD_BJT_H_
#define NLD_BJT_H_
-#include "../nl_setup.h"
+#include "netlist/nl_setup.h"
// -----------------------------------------------------------------------------
// Macros
diff --git a/src/lib/netlist/analog/nld_fourterm.h b/src/lib/netlist/analog/nld_fourterm.h
index b4bb5db1059..66c47c0be29 100644
--- a/src/lib/netlist/analog/nld_fourterm.h
+++ b/src/lib/netlist/analog/nld_fourterm.h
@@ -9,7 +9,7 @@
#define NLD_FOURTERM_H_
-#include "../nl_setup.h"
+#include "netlist/nl_setup.h"
// ----------------------------------------------------------------------------------------
// Macros
diff --git a/src/lib/netlist/analog/nld_mosfet.cpp b/src/lib/netlist/analog/nld_mosfet.cpp
new file mode 100644
index 00000000000..ea717fdefee
--- /dev/null
+++ b/src/lib/netlist/analog/nld_mosfet.cpp
@@ -0,0 +1,488 @@
+// license:GPL-2.0+
+// copyright-holders:Couriersud
+/*
+ * nld_mosfet.cpp
+ *
+ * Formulas in here based on the following Sources:
+ *
+ * https://www.imperial.ac.uk/pls/portallive/docs/1/7292573.PDF
+ * http://www3.imperial.ac.uk/pls/portallive/docs/1/56133736.PDF
+ * https://people.rit.edu/lffeee/SPICE_MOSFET_Model_Intro.pdf
+ * https://people.rit.edu/lffeee/SPICE.pdf
+ * http://web.mit.edu/course/6/6.012/SPR98/www/lectures/S98_Lecture10.pdf
+ * http://homepages.rpi.edu/~sawyes/Models_review.pdf
+ * http://jaco.ec.t.kanazawa-u.ac.jp/edu/mix/pdf/3.pdf
+ *
+ * Farid N. Naim, Circuit Simulation (Wiley-IEEE Press, 2010).
+ * Stefan Jahn, Michael Margraf, Vincent Habchi and Raimund Jacob, "Qucs Technical Papers" (2007)
+ *
+ */
+
+#include "netlist/solver/nld_solver.h"
+#include "netlist/nl_setup.h"
+#include "nlid_twoterm.h"
+
+#include <cmath>
+
+#define BODY_CONNECTED_TO_SOURCE (1)
+
+namespace netlist
+{
+namespace analog
+{
+
+ using constants = plib::constants<nl_double>;
+
+ // -----------------------------------------------------------------------------
+ // nld_FET - Base classes
+ // -----------------------------------------------------------------------------
+
+ /*! Class representing the nmos model paramers.
+ *
+ * This is the model representation of the nmos model. Typically, SPICE uses
+ * the following parameters. A "Y" in the first column indicates that the
+ * parameter is actually used in netlist.
+ *
+ * | NL? |Name | Description|Units |Default |Example |
+ * |:---:|------|-----------------------------------------------------------------------|-------|---------:|----------------:|
+ * | Y |Vto | Zero-bias threshold voltage | V | 0 | 1 |
+ * | Y |Kp | Transconductance parameter | A/V² | 0.00002 | 0.00003 |
+ * | Y |Gamma | Bulk threshold parameter | V^½ | 0 | 0.37 |
+ * | Y |Phi | Surface inversion potential | V | 0.6 | 0.65 |
+ * | Y |Lambda| Channel-length modulation (level 1 and 2 only) | 1/V | 0 | 0.02 |
+ * | |Rd | Drain ohmic resistance |W|0|1|
+ * | |Rs | Source ohmic resistance |W|0|1|
+ * | |Cbd | Zero-bias B-D junction capacitance |F|0|20f|
+ * | |Cbs | Zero-bias B-S junction capacitance |F|0|20f|
+ * | Y |Is | Bulk junction saturation current |A|0.00000000000001|1E-015|
+ * | Y |N | Bulk diode emission coefficient |-|1|*
+ * | |Pb | Bulk junction potential |V|0.8|0.87|8|
+ * | |Cgso | Gate-source overlap capacitance per meter channel width |F/m|0|0.00000000004|
+ * | |Cgdo | Gate-drain overlap capacitance per meter channel width |F/m|0|0.00000000004|*
+ * | |Cgbo | Gate-bulk overlap capacitance per meter channel width |F/m|0|0.0000000002|*
+ * | |Rsh | Drain and source diffusion sheet resistance |W|0|10|*
+ * | |Cj | Zero-bias bulk junction bottom capacitance per square meter of junction area|F/m²|0|0.0002|*
+ * | |Mj | Bulk junction bottom grading coefficient |-|0.5|0.5|*
+ * | |Cjsw | Zero-bias bulk junction sidewall capacitance per meter of junction perimeter|F/m|0|1p|*
+ * | |Mjsw | Bulk junction sidewall grading coefficient |-|.50 level 1 .33 level 2,3||
+ * | |Js | Bulk junction saturation current per square-meter of junction area|A/m|0|0.00000001|
+ * | Y |Tox | Oxide thickness |m|0.0000001|0.0000001|
+ * | Y |Nsub | Substrate doping |1/cm³|0|4000000000000000|
+ * | |Nss | Surface state density |1/cm²|0|10000000000|
+ * | |Nfs | Fast surface state |1/cm²|0|10000000000|*
+ * | |TPG | Type of gate material: +1 opp. to substrate -1 same as substrate 0 Al gate|-|1|
+ * | |Xj | Metallurgical junction depth |m|0|1µ|*
+ * | Y |Ld | Lateral diffusion |m|0|0.8µ|
+ * | Y |Uo | Surface mobility |cm²/V/s|600|700|
+ * | |Ucrit | Critical field for mobility degradation (level 2 only) |V/cm|10000|10000|
+ * | |Uexp | Critical field exponent in mobility degradation (level 2 only) |-|0|0.1|
+ * | |Utra | Transverse field coefficient (level 2 only) |-|0|0.3|*
+ * | |Vmax | Maximum carrier drift velocity (levels 2 & 3 only) |m/s|0|50000|
+ * | |Neff | Total channel-charge exponent (level 2 only) |-|1|5|
+ * | |Kf | Flicker noise coefficient |-|0|1E-026|
+ * | |Af | Flicker noise exponent |-|1|1.2|
+ * | |Fc | Coefficient for forward-bias depletion capacitance formula |-|0.5|
+ * | |Delta | Width effect on threshold voltage(levels 2 and 3) |-|0|1|
+ * | |Theta | Mobility modulation (level 3 only) |-|0|0.1|
+ * | |Eta | Static feedback (level 3 only) |-|0|1|
+ * | |Kappa | Saturation field (level 3 only) |0.2|0.5|
+ * | |Tnom | Parameter measurement temperature |ºC|27|50||
+ * | Y |L | Length scaling |-|1.0||
+ * | Y |W | Width scaling |-|1.0||
+ * */
+
+ class fet_model_t : public param_model_t
+ {
+ public:
+ fet_model_t(device_t &device, const pstring &name, const pstring &val)
+ : param_model_t(device, name, val)
+ , m_VTO(*this, "VTO")
+ , m_N(*this, "N")
+ , m_ISS(*this, "IS") // Haven't seen a model using ISS / ISD
+ , m_ISD(*this, "IS")
+ , m_LD(*this, "LD")
+ , m_L(*this, "L")
+ , m_W(*this, "W")
+ , m_TOX(*this, "TOX")
+ , m_KP(*this, "KP")
+ , m_UO(*this, "UO")
+ , m_PHI(*this, "PHI")
+ , m_NSUB(*this, "NSUB")
+ , m_GAMMA(*this, "GAMMA")
+ , m_LAMBDA(*this, "LAMBDA")
+ , m_RD(*this, "RD")
+ , m_RS(*this, "RS")
+ {}
+
+ value_t m_VTO; //!< Threshold voltage [V]
+ value_t m_N; //!< Bulk diode emission coefficient
+ value_t m_ISS; //!< Body diode saturation current
+ value_t m_ISD; //!< Body diode saturation current
+ value_t m_LD; //!< Lateral diffusion [m]
+ value_t m_L; //!< Length scaling
+ value_t m_W; //!< Width scaling
+ value_t m_TOX; //!< Oxide thickness
+ value_t m_KP; //!< Transconductance parameter [A/V²]
+ value_t m_UO; //!< Surface mobility [cm²/V/s]
+ value_t m_PHI; //!< Surface inversion potential [V]
+ value_t m_NSUB;//!< Substrate doping [1/cm³]
+ value_t m_GAMMA; //!< Bulk threshold parameter [V^½]
+ value_t m_LAMBDA; //!< Channel-length modulation [1/V]
+ value_t m_RD; //!< Drain ohmic resistance
+ value_t m_RS; //!< Source ohmic resistance
+ };
+
+ // Have a common start for mosfets
+
+ NETLIB_OBJECT(FET)
+ {
+ public:
+ enum q_type {
+ FET_NMOS,
+ FET_PMOS
+ };
+
+ NETLIB_CONSTRUCTOR(FET)
+ , m_model(*this, "MODEL", "NMOS")
+ , m_qtype(FET_NMOS)
+ {
+ }
+
+ NETLIB_IS_DYNAMIC(true)
+
+ //NETLIB_RESETI();
+ NETLIB_UPDATEI() { }
+
+ q_type qtype() const { return m_qtype; }
+ bool is_qtype(q_type atype) const { return m_qtype == atype; }
+ void set_qtype(q_type atype) { m_qtype = atype; }
+ protected:
+
+ fet_model_t m_model;
+ private:
+ q_type m_qtype;
+ };
+
+ // -----------------------------------------------------------------------------
+ // nld_QBJT_EB
+ // -----------------------------------------------------------------------------
+
+
+ NETLIB_OBJECT_DERIVED(MOSFET, FET)
+ {
+ public:
+ NETLIB_CONSTRUCTOR_DERIVED(MOSFET, FET)
+ , m_DG(*this, "m_DG", true)
+ , m_SG(*this, "m_SG", true)
+ , m_SD(*this, "m_SD", true)
+ , m_D_BD(*this, "m_D_BD")
+#if (!BODY_CONNECTED_TO_SOURCE)
+ , m_D_BS(*this, "m_D_BS")
+#endif
+ , m_phi(0.0)
+ , m_gamma(0.0)
+ , m_vto(0.0)
+ , m_beta(0.0)
+ , m_lambda(0.0)
+ , m_Leff(0.0)
+ , m_Cox(0.0)
+ {
+ register_subalias("S", m_SG.m_P); // Source
+ register_subalias("G", m_SG.m_N); // Gate
+
+ register_subalias("D", m_DG.m_P); // Drain
+
+ connect(m_SG.m_P, m_SD.m_P);
+ connect(m_SG.m_N, m_DG.m_N);
+ connect(m_DG.m_P, m_SD.m_N);
+
+#if 0
+ if (m_model.m_CJE > 0.0)
+ {
+ create_and_register_subdevice("m_CJE", m_CJE);
+ connect("B", "m_CJE.1");
+ connect("E", "m_CJE.2");
+ }
+ if (m_model.m_CJC > 0.0)
+ {
+ create_and_register_subdevice("m_CJC", m_CJC);
+ connect("B", "m_CJC.1");
+ connect("C", "m_CJC.2");
+ }
+#endif
+ }
+
+ protected:
+
+ NETLIB_RESETI();
+ NETLIB_UPDATEI();
+ NETLIB_UPDATE_PARAMI();
+ NETLIB_UPDATE_TERMINALSI();
+
+ private:
+
+ nld_twoterm m_DG;
+ nld_twoterm m_SG;
+ nld_twoterm m_SD;
+
+ generic_diode<diode_e::MOS> m_D_BD;
+#if (!BODY_CONNECTED_TO_SOURCE)
+ generic_diode<diode_e::MOS> m_D_BS;
+#endif
+
+ nl_double m_phi;
+ nl_double m_gamma;
+ nl_double m_vto;
+ nl_double m_beta;
+ nl_double m_lambda;
+
+ /* used in capacitance calculation */
+ nl_double m_Leff;
+ nl_double m_Cox;
+
+ //NETLIB_SUBXX(analog, C) m_CJE;
+ //NETLIB_SUBXX(analog, C) m_CJC;
+ };
+
+
+
+ // ----------------------------------------------------------------------------------------
+ // nld_Q - Ebers Moll
+ // ----------------------------------------------------------------------------------------
+
+
+ NETLIB_UPDATE(MOSFET)
+ {
+ if (!m_SG.m_P.net().isRailNet())
+ m_SG.m_P.solve_now(); // Basis
+ else if (!m_SG.m_N.net().isRailNet())
+ m_SG.m_N.solve_now(); // Emitter
+ else
+ m_DG.m_N.solve_now(); // Collector
+ }
+
+ NETLIB_RESET(MOSFET)
+ {
+ NETLIB_NAME(FET)::reset();
+#if 0
+ if (m_CJE)
+ {
+ m_CJE->reset();
+ m_CJE->m_C.setTo(m_model.m_CJE);
+ }
+ if (m_CJC)
+ {
+ m_CJC->reset();
+ m_CJC->m_C.setTo(m_model.m_CJC);
+ }
+#endif
+ }
+
+ NETLIB_UPDATE_TERMINALS(MOSFET)
+ {
+ const nl_double polarity = (qtype() == FET_NMOS ? 1.0 : -1.0);
+
+ const nl_double Ugd = -m_DG.deltaV() * polarity; // Gate - Drain
+ const nl_double Ugs = -m_SG.deltaV() * polarity; // Gate - Source
+ const nl_double Ubs = 0.0; // Bulk - Source == 0 if connected
+ const nl_double Ubd = m_SD.deltaV() * polarity; // Bulk - Drain = Source - Drain
+ const nl_double Uds = Ugs - Ugd;
+
+#if (!BODY_CONNECTED_TO_SOURCE)
+ m_D_BS.update_diode(Ubs);
+#endif
+ m_D_BD.update_diode(Ubd);
+
+ // Are we in forward mode ?
+ const bool is_forward = Uds >= 0;
+
+ // calculate Vth
+ const nl_double Vbulk = is_forward ? Ubs : Ubd;
+ const nl_double phi_m_Vbulk = (m_phi > Vbulk) ? std::sqrt(m_phi - Vbulk) : 0.0;
+ const nl_double Vth = m_vto * polarity + m_gamma * (phi_m_Vbulk - std::sqrt(m_phi));
+
+ const nl_double Vctrl = (is_forward ? Ugs : Ugd) - Vth;
+
+ nl_double Ids, gm, gds, gmb;
+
+ if (Vctrl <= 0.0)
+ {
+ // cutoff region
+ Ids = 0.0;
+ gm = 0.0;
+ gds = 0.0;
+ gmb = 0.0;
+ }
+ else
+ {
+ const nl_double Vds = std::abs(Uds);
+ const nl_double b = m_beta * (1.0 + m_lambda * Vds);
+ if (Vctrl <= Vds)
+ {
+ // saturation region
+ Ids = b * Vctrl * Vctrl / 2.0;
+ gm = b * Vctrl;
+ gds = m_lambda * m_beta * Vctrl * Vctrl / 2.0;
+ }
+ else
+ {
+ // linear region
+ Ids = b * Vds * (Vctrl - Vds / 2);
+ gm = b * Vds;
+ gds = b * (Vctrl - Vds) + m_lambda * m_beta * Vds * (Vctrl - Vds / 2.0);
+ }
+
+ // backgate transconductance
+ const nl_double bgtc = (phi_m_Vbulk != 0.0) ? (m_gamma / phi_m_Vbulk / 2.0) : 0.0;
+ gmb = gm * bgtc;
+ }
+
+ // FIXME: these are needed to compute capacitance
+ // nl_double Udsat = pol * std::max (Utst, 0.0);
+ // Uon = pol * Vth;
+
+ // compute bulk diode equivalent currents
+
+ const nl_double IeqBD = m_D_BD.Ieq();
+ const nl_double gbd = m_D_BD.G();
+#if 0
+ const nl_double IeqBS = m_D_BS.Ieq();
+ const nl_double gbs = m_D_BS.G();
+#else
+ const nl_double IeqBS = 0.0;
+ const nl_double gbs = 0.0;
+#endif
+ // exchange controlling nodes if necessary
+ const nl_double gsource = is_forward ? (gm + gmb) : 0;
+ const nl_double gdrain = is_forward ? 0.0 : (gm + gmb);
+
+ const nl_double IeqDS = (is_forward) ?
+ Ids - gm * Ugs - gmb * Ubs - gds * Uds
+ : -Ids - gm * Ugd - gmb * Ubd - gds * Uds;
+
+ // IG = 0
+ const nl_double IG = 0.0;
+ const nl_double ID = (+IeqBD - IeqDS) * polarity;
+ const nl_double IS = (+IeqBS + IeqDS) * polarity;
+ const nl_double IB = (-IeqBD - IeqBS) * polarity;
+
+ const nl_double gGG = 0.0; // ok
+ const nl_double gGD = 0.0; // ok
+ const nl_double gGS = 0.0; // ok
+ const nl_double gGB = 0.0; // ok
+
+ const nl_double gDG = gm; // ok
+ const nl_double gDD = gds + gbd - gdrain; // ok
+ const nl_double gDS = -gds - gsource; // ok
+ const nl_double gDB = gmb - gbd; // ok
+
+ const nl_double gSG = -gm; // ok
+ const nl_double gSD = -gds + gdrain; // ok
+ const nl_double gSS = gbs + gds + gsource; // ok
+ const nl_double gSB = -gbs - gmb;
+
+ const nl_double gBG = 0.0; // ok
+ const nl_double gBD = -gbd; // ok
+ const nl_double gBS = -gbs;
+ const nl_double gBB = gbs + gbd; // ok
+
+ // Source connected to body, Diode S-B shorted!
+ const nl_double gSSBB = gSS + gBB + gBS + gSB;
+
+ // S G
+ m_SG.set_mat( gSSBB, gSG + gBG, +(IS + IB), // S
+ gGS + gGB, gGG, IG ); // G
+ // D G
+ m_DG.set_mat( gDD, gDG, +ID, // D
+ gGD, 0.0, 0.0 ); // G
+ // S D
+ m_SD.set_mat( 0.0, gSD + gBD, 0.0, // S
+ gDS + gDB, 0.0, 0.0); // D
+
+ }
+
+
+ NETLIB_UPDATE_PARAM(MOSFET)
+ {
+ set_qtype((m_model.model_type() == "NMOS") ? FET_NMOS : FET_PMOS);
+
+ /*
+ * From http://ltwiki.org/LTspiceHelp/LTspiceHelp/M_MOSFET.htm :
+ *
+ * VTO, KP, LAMBDA, PHI and GAMMA. These parameters are computed
+ * if the process parameters(NSUB, TOX,...) are given, but
+ * user-specified values always override.
+ *
+ * But couldn't find a formula for lambda anywhere
+ *
+ */
+
+ m_lambda = m_model.m_LAMBDA; // FIXME: m_lambda only set once
+
+ // calculate effective channel length
+ m_Leff = m_model.m_L - 2 * m_model.m_LD;
+ nl_assert_always(m_Leff > 0.0, "Effective Lateral diffusion would be negative for model " + m_model.name());
+ if (m_model.m_TOX > 0.0)
+ m_Cox = (constants::eps_SiO2() * constants::eps_0() / m_model.m_TOX);
+ else
+ m_Cox = 0.0;
+
+ // calculate DC transconductance coefficient
+ if (m_model.m_KP > 0)
+ m_beta = m_model.m_KP * m_model.m_W / m_Leff;
+ else if (m_Cox > 0 && m_model.m_UO > 0)
+ m_beta = m_model.m_UO * 1e-4 * m_Cox * m_model.m_W / m_Leff;
+ else
+ m_beta = 2e-5 * m_model.m_W / m_Leff;
+
+ // Bulk diodes
+
+ m_D_BD.set_param(m_model.m_ISD, m_model.m_N, exec().gmin(), constants::T0());
+#if (!BODY_CONNECTED_TO_SOURCE)
+ m_D_BS.set_param(m_model.m_ISS, m_model.m_N, exec().gmin(), constants::T0());
+#endif
+
+ //FIXME::UT can disappear
+ const double Vt = constants::T0() * constants::k_b() / constants::Q_e();
+
+ // calculate surface potential if not given
+
+ if (m_model.m_PHI > 0.0)
+ m_phi = m_model.m_PHI;
+ else if (m_model.m_NSUB > 0.0)
+ {
+ nl_assert_always(m_model.m_NSUB * 1e6 >= constants::NiSi(), "Error calculating phi for model " + m_model.name());
+ m_phi = 2 * Vt * std::log (m_model.m_NSUB * 1e6 / constants::NiSi());
+ }
+ else
+ m_phi = 0.6;
+
+ // calculate bulk threshold if not given
+ if (m_model.m_GAMMA > 0.0)
+ m_gamma = m_model.m_GAMMA;
+ else
+ {
+ if (m_Cox > 0 && m_model.m_NSUB > 0)
+ m_gamma = std::sqrt (2.0 * constants::Q_e() * constants::eps_Si() * constants::eps_0() * m_model.m_NSUB * 1e6) / m_Cox;
+ else
+ m_gamma = 0.0;
+ }
+
+ m_vto = m_model.m_VTO;
+ nl_assert_always(m_vto != 0.0, "Threshold voltage not specified for " + m_model.name());
+
+ /* FIXME: VTO if missing may be calculated from TPG, NSS and temperature. Usually models
+ * specify VTO so skip this here.
+ */
+
+ m_Cox = m_Cox * m_model.m_W * m_Leff;
+
+ }
+
+} // namespace analog
+
+namespace devices {
+ NETLIB_DEVICE_IMPL_NS(analog, MOSFET, "MOSFET", "MODEL")
+} // namespace devices
+
+} // namespace netlist
diff --git a/src/lib/netlist/analog/nld_mosfet.h b/src/lib/netlist/analog/nld_mosfet.h
new file mode 100644
index 00000000000..32011d709d8
--- /dev/null
+++ b/src/lib/netlist/analog/nld_mosfet.h
@@ -0,0 +1,21 @@
+// license:GPL-2.0+
+// copyright-holders:Couriersud
+/*
+ * nld_mosfet.h
+ *
+ */
+
+#ifndef NLD_MOSFET_H_
+#define NLD_MOSFET_H_
+
+#include "netlist/nl_setup.h"
+
+// -----------------------------------------------------------------------------
+// Macros
+// -----------------------------------------------------------------------------
+
+#define MOSFET(name, model) \
+ NET_REGISTER_DEV(MOSFET, name) \
+ NETDEV_PARAMI(name, MODEL, model)
+
+#endif /* NLD_MOSFET_H_ */
diff --git a/src/lib/netlist/analog/nld_opamps.cpp b/src/lib/netlist/analog/nld_opamps.cpp
index 5f55a26f5d0..8c3c655bfa9 100644
--- a/src/lib/netlist/analog/nld_opamps.cpp
+++ b/src/lib/netlist/analog/nld_opamps.cpp
@@ -6,10 +6,10 @@
*/
#include "nld_opamps.h"
-#include "../nl_base.h"
-#include "../nl_errstr.h"
-#include "nlid_twoterm.h"
+#include "netlist/nl_base.h"
+#include "netlist/nl_errstr.h"
#include "nlid_fourterm.h"
+#include "nlid_twoterm.h"
#include <cmath>
@@ -129,10 +129,10 @@ namespace netlist
}
else if (m_type == 3)
{
- register_sub("CP1", m_CP);
- register_sub("EBUF", m_EBUF);
- register_sub("DN", m_DN, "D(IS=1e-15 N=1)");
- register_sub("DP", m_DP, "D(IS=1e-15 N=1)");
+ create_and_register_subdevice("CP1", m_CP);
+ create_and_register_subdevice("EBUF", m_EBUF);
+ create_and_register_subdevice("DN", m_DN, "D(IS=1e-15 N=1)");
+ create_and_register_subdevice("DP", m_DP, "D(IS=1e-15 N=1)");
//m_DP->m_model.setTo("D(IS=1e-15 N=1)");
//m_DN->m_model.setTo("D(IS=1e-15 N=1)");
@@ -201,7 +201,7 @@ namespace netlist
NETLIB_RESET(opamp)
{
- m_G1.do_reset();
+ m_G1.reset();
m_G1.m_RI.setTo(m_model.m_RI);
if (m_type == 1)
@@ -213,11 +213,11 @@ namespace netlist
}
else if (m_type == 3)
{
- m_EBUF->do_reset();
- m_DP->do_reset();
- m_DN->do_reset();
- m_CP->do_reset();
- m_RP.do_reset();
+ m_EBUF->reset();
+ m_DP->reset();
+ m_DN->reset();
+ m_CP->reset();
+ m_RP.reset();
m_EBUF->m_G.setTo(1.0);
m_EBUF->m_RO.setTo(m_model.m_RO);
@@ -239,6 +239,6 @@ namespace netlist
} //namespace analog
namespace devices {
- NETLIB_DEVICE_IMPL_NS(analog, opamp)
- }
+ NETLIB_DEVICE_IMPL_NS(analog, opamp, "OPAMP", "MODEL")
+ } // namespace devices
} // namespace netlist
diff --git a/src/lib/netlist/analog/nld_opamps.h b/src/lib/netlist/analog/nld_opamps.h
index d05a19aa3dc..4a07f646587 100644
--- a/src/lib/netlist/analog/nld_opamps.h
+++ b/src/lib/netlist/analog/nld_opamps.h
@@ -10,7 +10,7 @@
#ifndef NLD_OPAMPS_H_
#define NLD_OPAMPS_H_
-#include "../nl_setup.h"
+#include "netlist/nl_setup.h"
// ----------------------------------------------------------------------------------------
// Macros
diff --git a/src/lib/netlist/analog/nld_switches.cpp b/src/lib/netlist/analog/nld_switches.cpp
index 1575551f260..0e62fe13952 100644
--- a/src/lib/netlist/analog/nld_switches.cpp
+++ b/src/lib/netlist/analog/nld_switches.cpp
@@ -6,10 +6,13 @@
*/
#include "nlid_twoterm.h"
-#include "../nl_base.h"
-#include "../nl_factory.h"
+#include "netlist/nl_base.h"
+#include "netlist/nl_factory.h"
+#include "netlist/solver/nld_solver.h"
-#define R_OFF (1.0 / netlist().gmin())
+/* FIXME : convert to parameters */
+
+#define R_OFF (1.0 / exec().gmin())
#define R_ON 0.01
namespace netlist
@@ -24,7 +27,7 @@ namespace netlist
{
NETLIB_CONSTRUCTOR(switch1)
, m_R(*this, "R")
- , m_POS(*this, "POS", 0)
+ , m_POS(*this, "POS", false)
{
register_subalias("1", m_R.m_P);
register_subalias("2", m_R.m_N);
@@ -46,6 +49,11 @@ namespace netlist
NETLIB_UPDATE(switch1)
{
+ }
+
+ NETLIB_UPDATE_PARAM(switch1)
+ {
+ m_R.solve_now();
if (!m_POS())
{
m_R.set_R(R_OFF);
@@ -54,13 +62,8 @@ namespace netlist
{
m_R.set_R(R_ON);
}
+ m_R.solve_later();
- m_R.update_dev();
- }
-
- NETLIB_UPDATE_PARAM(switch1)
- {
- update();
}
// ----------------------------------------------------------------------------------------
@@ -72,7 +75,7 @@ namespace netlist
NETLIB_CONSTRUCTOR(switch2)
, m_R1(*this, "R1")
, m_R2(*this, "R2")
- , m_POS(*this, "POS", 0)
+ , m_POS(*this, "POS", false)
{
connect(m_R1.m_N, m_R2.m_N);
@@ -110,19 +113,31 @@ namespace netlist
m_R2.set_R(R_ON);
}
- m_R1.update_dev();
- m_R2.update_dev();
+ //m_R1.update_dev(time);
+ //m_R2.update_dev(time);
}
NETLIB_UPDATE_PARAM(switch2)
{
- update();
+ if (!m_POS())
+ {
+ m_R1.set_R(R_ON);
+ m_R2.set_R(R_OFF);
+ }
+ else
+ {
+ m_R1.set_R(R_OFF);
+ m_R2.set_R(R_ON);
+ }
+
+ m_R1.solve_now();
+ m_R2.solve_now();
}
} //namespace analog
namespace devices {
- NETLIB_DEVICE_IMPL_NS(analog, switch1)
- NETLIB_DEVICE_IMPL_NS(analog, switch2)
- }
+ NETLIB_DEVICE_IMPL_NS(analog, switch1, "SWITCH", "")
+ NETLIB_DEVICE_IMPL_NS(analog, switch2, "SWITCH2", "")
+ } // namespace devices
} // namespace netlist
diff --git a/src/lib/netlist/analog/nld_switches.h b/src/lib/netlist/analog/nld_switches.h
index 3cd561f84b1..7aa31c925ae 100644
--- a/src/lib/netlist/analog/nld_switches.h
+++ b/src/lib/netlist/analog/nld_switches.h
@@ -10,7 +10,7 @@
#ifndef NLD_SWITCHES_H_
#define NLD_SWITCHES_H_
-#include "../nl_setup.h"
+#include "netlist/nl_setup.h"
// ----------------------------------------------------------------------------------------
// Macros
diff --git a/src/lib/netlist/analog/nld_twoterm.h b/src/lib/netlist/analog/nld_twoterm.h
index d5cf6f6d228..b175f40af97 100644
--- a/src/lib/netlist/analog/nld_twoterm.h
+++ b/src/lib/netlist/analog/nld_twoterm.h
@@ -4,7 +4,7 @@
#ifndef NLD_TWOTERM_H_
#define NLD_TWOTERM_H_
-#include "../nl_setup.h"
+#include "netlist/nl_setup.h"
// -----------------------------------------------------------------------------
// Macros
diff --git a/src/lib/netlist/analog/nlid_fourterm.cpp b/src/lib/netlist/analog/nlid_fourterm.cpp
index aa2723fe8e1..7fa6a2f3809 100644
--- a/src/lib/netlist/analog/nlid_fourterm.cpp
+++ b/src/lib/netlist/analog/nlid_fourterm.cpp
@@ -5,8 +5,8 @@
*
*/
-#include "../solver/nld_solver.h"
-#include "../nl_factory.h"
+#include "netlist/solver/nld_solver.h"
+#include "netlist/nl_factory.h"
#include "nlid_fourterm.h"
#include <cmath>
@@ -24,16 +24,16 @@ namespace netlist
NETLIB_RESET(VCCS)
{
const nl_double m_mult = m_G() * m_gfac; // 1.0 ==> 1V ==> 1A
- const nl_double GI = NL_FCONST(1.0) / m_RI();
+ const nl_double GI = plib::constants<nl_double>::one() / m_RI();
- m_IP.set(GI);
- m_IN.set(GI);
+ m_IP.set_conductivity(GI);
+ m_IN.set_conductivity(GI);
- m_OP.set(m_mult, NL_FCONST(0.0));
- m_OP1.set(-m_mult, NL_FCONST(0.0));
+ m_OP.set_go_gt(-m_mult, plib::constants<nl_double>::zero());
+ m_OP1.set_go_gt(m_mult, plib::constants<nl_double>::zero());
- m_ON.set(-m_mult, NL_FCONST(0.0));
- m_ON1.set(m_mult, NL_FCONST(0.0));
+ m_ON.set_go_gt(m_mult, plib::constants<nl_double>::zero());
+ m_ON1.set_go_gt(-m_mult, plib::constants<nl_double>::zero());
}
NETLIB_UPDATE(VCCS)
@@ -63,11 +63,6 @@ NETLIB_UPDATE_PARAM(LVCCS)
NETLIB_NAME(VCCS)::update_param();
}
-NETLIB_UPDATE(LVCCS)
-{
- NETLIB_NAME(VCCS)::update();
-}
-
NETLIB_UPDATE_TERMINALS(LVCCS)
{
const nl_double m_mult = m_G() * m_gfac; // 1.0 ==> 1V ==> 1A
@@ -84,11 +79,11 @@ NETLIB_UPDATE_TERMINALS(LVCCS)
const nl_double beta = m_mult * (1.0 - X*X);
const nl_double I = m_cur_limit() * X - beta * m_vi;
- m_OP.set(beta, NL_FCONST(0.0), I);
- m_OP1.set(-beta, NL_FCONST(0.0));
+ m_OP.set_go_gt_I(-beta, plib::constants<nl_double>::zero(), I);
+ m_OP1.set_go_gt(beta, plib::constants<nl_double>::zero());
- m_ON.set(-beta, NL_FCONST(0.0), -I);
- m_ON1.set(beta, NL_FCONST(0.0));
+ m_ON.set_go_gt_I(beta, plib::constants<nl_double>::zero(), -I);
+ m_ON1.set_go_gt(-beta, plib::constants<nl_double>::zero());
}
// ----------------------------------------------------------------------------------------
@@ -105,30 +100,25 @@ NETLIB_UPDATE_PARAM(CCCS)
NETLIB_NAME(VCCS)::update_param();
}
-NETLIB_UPDATE(CCCS)
-{
- NETLIB_NAME(VCCS)::update();
-}
-
// ----------------------------------------------------------------------------------------
// nld_VCVS
// ----------------------------------------------------------------------------------------
NETLIB_RESET(VCVS)
{
- m_gfac = NL_FCONST(1.0) / m_RO();
+ m_gfac = plib::constants<nl_double>::one() / m_RO();
NETLIB_NAME(VCCS)::reset();
- m_OP2.set(NL_FCONST(1.0) / m_RO());
- m_ON2.set(NL_FCONST(1.0) / m_RO());
+ m_OP2.set_conductivity(plib::constants<nl_double>::one() / m_RO());
+ m_ON2.set_conductivity(plib::constants<nl_double>::one() / m_RO());
}
} //namespace analog
namespace devices {
- NETLIB_DEVICE_IMPL_NS(analog, VCVS)
- NETLIB_DEVICE_IMPL_NS(analog, VCCS)
- NETLIB_DEVICE_IMPL_NS(analog, CCCS)
- NETLIB_DEVICE_IMPL_NS(analog, LVCCS)
- }
+ NETLIB_DEVICE_IMPL_NS(analog, VCVS, "VCVS", "")
+ NETLIB_DEVICE_IMPL_NS(analog, VCCS, "VCCS", "")
+ NETLIB_DEVICE_IMPL_NS(analog, CCCS, "CCCS", "")
+ NETLIB_DEVICE_IMPL_NS(analog, LVCCS, "LVCCS", "")
+ } // namespace devices
} // namespace netlist
diff --git a/src/lib/netlist/analog/nlid_fourterm.h b/src/lib/netlist/analog/nlid_fourterm.h
index 641fc72427b..5ca6a747116 100644
--- a/src/lib/netlist/analog/nlid_fourterm.h
+++ b/src/lib/netlist/analog/nlid_fourterm.h
@@ -8,7 +8,8 @@
#ifndef NLID_FOURTERM_H_
#define NLID_FOURTERM_H_
-#include "../nl_base.h"
+#include "netlist/nl_base.h"
+#include "plib/putil.h"
namespace netlist {
namespace analog {
@@ -40,39 +41,32 @@ namespace netlist {
NETLIB_CONSTRUCTOR(VCCS)
, m_G(*this, "G", 1.0)
, m_RI(*this, "RI", 1e9)
- , m_OP(*this, "OP")
- , m_ON(*this, "ON")
- , m_IP(*this, "IP")
- , m_IN(*this, "IN")
- , m_OP1(*this, "_OP1")
- , m_ON1(*this, "_ON1")
+ , m_OP(*this, "OP", &m_IP)
+ , m_ON(*this, "ON", &m_IP)
+ , m_IP(*this, "IP", &m_IN) // <= this should be NULL and terminal be filtered out prior to solving...
+ , m_IN(*this, "IN", &m_IP) // <= this should be NULL and terminal be filtered out prior to solving...
+ , m_OP1(*this, "_OP1", &m_IN)
+ , m_ON1(*this, "_ON1", &m_IN)
, m_gfac(1.0)
{
- m_IP.m_otherterm = &m_IN; // <= this should be NULL and terminal be filtered out prior to solving...
- m_IN.m_otherterm = &m_IP; // <= this should be NULL and terminal be filtered out prior to solving...
-
- m_OP.m_otherterm = &m_IP;
- m_OP1.m_otherterm = &m_IN;
-
- m_ON.m_otherterm = &m_IP;
- m_ON1.m_otherterm = &m_IN;
-
connect(m_OP, m_OP1);
connect(m_ON, m_ON1);
- m_gfac = NL_FCONST(1.0);
+ m_gfac = plib::constants<nl_double>::one();
}
+ NETLIB_RESETI();
+
param_double_t m_G;
param_double_t m_RI;
protected:
- NETLIB_RESETI();
NETLIB_UPDATEI();
NETLIB_UPDATE_PARAMI()
{
NETLIB_NAME(VCCS)::reset();
}
+
terminal_t m_OP;
terminal_t m_ON;
@@ -98,14 +92,14 @@ namespace netlist {
NETLIB_IS_DYNAMIC(true)
- param_double_t m_cur_limit; /* current limit */
-
protected:
- NETLIB_UPDATEI();
+ //NETLIB_UPDATEI();
NETLIB_RESETI();
NETLIB_UPDATE_PARAMI();
NETLIB_UPDATE_TERMINALSI();
+ private:
+ param_double_t m_cur_limit; /* current limit */
nl_double m_vi;
};
@@ -137,12 +131,13 @@ namespace netlist {
public:
NETLIB_CONSTRUCTOR_DERIVED(CCCS, VCCS)
{
- m_gfac = NL_FCONST(1.0) / m_RI();
+ m_gfac = plib::constants<nl_double>::one() / m_RI();
}
- protected:
- NETLIB_UPDATEI();
NETLIB_RESETI();
+
+ protected:
+ //NETLIB_UPDATEI();
NETLIB_UPDATE_PARAMI();
};
@@ -180,29 +175,28 @@ namespace netlist {
public:
NETLIB_CONSTRUCTOR_DERIVED(VCVS, VCCS)
, m_RO(*this, "RO", 1.0)
- , m_OP2(*this, "_OP2")
- , m_ON2(*this, "_ON2")
+ , m_OP2(*this, "_OP2", &m_ON2)
+ , m_ON2(*this, "_ON2", &m_OP2)
{
- m_OP2.m_otherterm = &m_ON2;
- m_ON2.m_otherterm = &m_OP2;
-
connect(m_OP2, m_OP1);
connect(m_ON2, m_ON1);
}
+ NETLIB_RESETI();
+
param_double_t m_RO;
- protected:
+ private:
//NETLIB_UPDATEI();
- NETLIB_RESETI();
//NETLIB_UPDATE_PARAMI();
terminal_t m_OP2;
terminal_t m_ON2;
+
};
- }
-}
+ } // namespace analog
+} // namespace netlist
#endif /* NLD_FOURTERM_H_ */
diff --git a/src/lib/netlist/analog/nlid_twoterm.cpp b/src/lib/netlist/analog/nlid_twoterm.cpp
index f54c2b3e68f..5019c98c0e4 100644
--- a/src/lib/netlist/analog/nlid_twoterm.cpp
+++ b/src/lib/netlist/analog/nlid_twoterm.cpp
@@ -5,10 +5,10 @@
*
*/
-#include "../solver/nld_solver.h"
+#include "netlist/solver/nld_solver.h"
+#include "netlist/nl_factory.h"
#include "nlid_twoterm.h"
-#include "../nl_factory.h"
#include <cmath>
@@ -16,81 +16,34 @@ namespace netlist
{
namespace analog
{
+
// ----------------------------------------------------------------------------------------
-// generic_diode
+// nld_twoterm
// ----------------------------------------------------------------------------------------
-generic_diode::generic_diode(device_t &dev, pstring name)
- : m_Vd(dev, name + ".m_Vd", 0.7)
- , m_Id(dev, name + ".m_Id", 0.0)
- , m_G(dev, name + ".m_G", 1e-15)
- , m_Vt(0.0)
- , m_Vmin(0.0)
- , m_Is(0.0)
- , m_logIs(0.0)
- , m_n(0.0)
- , m_gmin(1e-15)
- , m_VtInv(0.0)
- , m_Vcrit(0.0)
-{
- set_param(1e-15, 1, 1e-15);
-}
-
-void generic_diode::set_param(const nl_double Is, const nl_double n, nl_double gmin)
+void NETLIB_NAME(twoterm)::solve_now()
{
- static constexpr double csqrt2 = 1.414213562373095048801688724209; //std::sqrt(2.0);
- m_Is = Is;
- m_logIs = std::log(Is);
- m_n = n;
- m_gmin = gmin;
-
- m_Vt = 0.0258 * m_n;
- m_Vmin = -5.0 * m_Vt;
-
- m_Vcrit = m_Vt * std::log(m_Vt / m_Is / csqrt2);
- m_VtInv = 1.0 / m_Vt;
+ /* we only need to call the non-rail terminal */
+ if (m_P.has_net() && !m_P.net().isRailNet())
+ m_P.solve_now();
+ else if (m_N.has_net() && !m_N.net().isRailNet())
+ m_N.solve_now();
}
-void generic_diode::update_diode(const nl_double nVd)
+void NETLIB_NAME(twoterm)::solve_later(netlist_time delay)
{
- if (nVd < m_Vmin)
- {
- m_Vd = nVd;
- m_G = m_gmin;
- m_Id = - m_Is;
- }
- else if (nVd < m_Vcrit)
- {
- m_Vd = nVd;
- //m_Vd = m_Vd + 10.0 * m_Vt * std::tanh((nVd - m_Vd) / 10.0 / m_Vt);
- //const double IseVDVt = m_Is * std::exp(m_Vd * m_VtInv);
- const double IseVDVt = std::exp(m_logIs + m_Vd * m_VtInv);
- m_Id = IseVDVt - m_Is;
- m_G = IseVDVt * m_VtInv + m_gmin;
- }
- else
- {
- const double a = std::max((nVd - m_Vd) * m_VtInv, NL_FCONST(-0.99));
- m_Vd = m_Vd + std::log1p(a) * m_Vt;
- //const double IseVDVt = m_Is * std::exp(m_Vd * m_VtInv);
- const double IseVDVt = std::exp(m_logIs + m_Vd * m_VtInv);
- m_Id = IseVDVt - m_Is;
- m_G = IseVDVt * m_VtInv + m_gmin;
- }
+ /* we only need to call the non-rail terminal */
+ if (m_P.has_net() && !m_P.net().isRailNet())
+ m_P.schedule_solve_after(delay);
+ else if (m_N.has_net() && !m_N.net().isRailNet())
+ m_N.schedule_solve_after(delay);
}
-// ----------------------------------------------------------------------------------------
-// nld_twoterm
-// ----------------------------------------------------------------------------------------
NETLIB_UPDATE(twoterm)
{
/* only called if connected to a rail net ==> notify the solver to recalculate */
- /* we only need to call the non-rail terminal */
- if (m_P.has_net() && !m_P.net().isRailNet())
- m_P.solve_now();
- else if (m_N.has_net() && !m_N.net().isRailNet())
- m_N.solve_now();
+ solve_now();
}
// ----------------------------------------------------------------------------------------
@@ -100,12 +53,7 @@ NETLIB_UPDATE(twoterm)
NETLIB_RESET(R_base)
{
NETLIB_NAME(twoterm)::reset();
- set_R(1.0 / netlist().gmin());
-}
-
-NETLIB_UPDATE(R_base)
-{
- NETLIB_NAME(twoterm)::update();
+ set_R(1.0 / exec().gmin());
}
// ----------------------------------------------------------------------------------------
@@ -114,14 +62,14 @@ NETLIB_UPDATE(R_base)
NETLIB_UPDATE_PARAM(R)
{
- update_dev();
- set_R(std::max(m_R(), netlist().gmin()));
+ solve_now();
+ set_R(std::max(m_R(), exec().gmin()));
}
NETLIB_RESET(R)
{
NETLIB_NAME(twoterm)::reset();
- set_R(std::max(m_R(), netlist().gmin()));
+ set_R(std::max(m_R(), exec().gmin()));
}
// ----------------------------------------------------------------------------------------
@@ -134,21 +82,22 @@ NETLIB_RESET(POT)
if (m_DialIsLog())
v = (std::exp(v) - 1.0) / (std::exp(1.0) - 1.0);
- m_R1.set_R(std::max(m_R() * v, netlist().gmin()));
- m_R2.set_R(std::max(m_R() * (NL_FCONST(1.0) - v), netlist().gmin()));
+ m_R1.set_R(std::max(m_R() * v, exec().gmin()));
+ m_R2.set_R(std::max(m_R() * (plib::constants<nl_double>::one() - v), exec().gmin()));
}
NETLIB_UPDATE_PARAM(POT)
{
- m_R1.update_dev();
- m_R2.update_dev();
+ m_R1.solve_now();
+ m_R2.solve_now();
nl_double v = m_Dial();
if (m_DialIsLog())
v = (std::exp(v) - 1.0) / (std::exp(1.0) - 1.0);
-
- m_R1.set_R(std::max(m_R() * v, netlist().gmin()));
- m_R2.set_R(std::max(m_R() * (NL_FCONST(1.0) - v), netlist().gmin()));
+ if (m_Reverse())
+ v = 1.0 - v;
+ m_R1.set_R(std::max(m_R() * v, exec().gmin()));
+ m_R2.set_R(std::max(m_R() * (plib::constants<nl_double>::one() - v), exec().gmin()));
}
@@ -164,13 +113,13 @@ NETLIB_RESET(POT2)
v = (std::exp(v) - 1.0) / (std::exp(1.0) - 1.0);
if (m_Reverse())
v = 1.0 - v;
- m_R1.set_R(std::max(m_R() * v, netlist().gmin()));
+ m_R1.set_R(std::max(m_R() * v, exec().gmin()));
}
NETLIB_UPDATE_PARAM(POT2)
{
- m_R1.update_dev();
+ m_R1.solve_now();
nl_double v = m_Dial();
@@ -178,38 +127,7 @@ NETLIB_UPDATE_PARAM(POT2)
v = (std::exp(v) - 1.0) / (std::exp(1.0) - 1.0);
if (m_Reverse())
v = 1.0 - v;
- m_R1.set_R(std::max(m_R() * v, netlist().gmin()));
-}
-
-// ----------------------------------------------------------------------------------------
-// nld_C
-// ----------------------------------------------------------------------------------------
-
-NETLIB_RESET(C)
-{
- // FIXME: Startup conditions
- set(netlist().gmin(), 0.0, -5.0 / netlist().gmin());
- //set(netlist().gmin(), 0.0, 0.0);
-}
-
-NETLIB_UPDATE_PARAM(C)
-{
- m_GParallel = netlist().gmin();
-}
-
-NETLIB_UPDATE(C)
-{
- NETLIB_NAME(twoterm)::update();
-}
-
-NETLIB_TIMESTEP(C)
-{
- /* Gpar should support convergence */
- const nl_double G = m_C() / step + m_GParallel;
- const nl_double I = -G * deltaV();
- set_mat( G, -G, -I,
- -G, G, I);
- //set(G, 0.0, I);
+ m_R1.set_R(std::max(m_R() * v, exec().gmin()));
}
// ----------------------------------------------------------------------------------------
@@ -218,9 +136,9 @@ NETLIB_TIMESTEP(C)
NETLIB_RESET(L)
{
- m_GParallel = netlist().gmin();
+ m_gmin = exec().gmin();
m_I = 0.0;
- m_G = m_GParallel;
+ m_G = m_gmin;
set_mat( m_G, -m_G, -m_I,
-m_G, m_G, m_I);
//set(1.0/NETLIST_GMIN, 0.0, -5.0 * NETLIST_GMIN);
@@ -230,16 +148,11 @@ NETLIB_UPDATE_PARAM(L)
{
}
-NETLIB_UPDATE(L)
-{
- NETLIB_NAME(twoterm)::update();
-}
-
NETLIB_TIMESTEP(L)
{
/* Gpar should support convergence */
m_I += m_I + m_G * deltaV();
- m_G = step / m_L() + m_GParallel;
+ m_G = step / m_L() + m_gmin;
set_mat( m_G, -m_G, -m_I,
-m_G, m_G, m_I);
//set(m_G, 0.0, m_I);
@@ -254,8 +167,8 @@ NETLIB_RESET(D)
nl_double Is = m_model.m_IS;
nl_double n = m_model.m_N;
- m_D.set_param(Is, n, netlist().gmin());
- set(m_D.G(), 0.0, m_D.Ieq());
+ m_D.set_param(Is, n, exec().gmin(), constants::T0());
+ set_G_V_I(m_D.G(), 0.0, m_D.Ieq());
}
NETLIB_UPDATE_PARAM(D)
@@ -263,12 +176,7 @@ NETLIB_UPDATE_PARAM(D)
nl_double Is = m_model.m_IS;
nl_double n = m_model.m_N;
- m_D.set_param(Is, n, netlist().gmin());
-}
-
-NETLIB_UPDATE(D)
-{
- NETLIB_NAME(twoterm)::update();
+ m_D.set_param(Is, n, exec().gmin(), constants::T0());
}
NETLIB_UPDATE_TERMINALS(D)
@@ -281,65 +189,18 @@ NETLIB_UPDATE_TERMINALS(D)
//set(m_D.G(), 0.0, m_D.Ieq());
}
-// ----------------------------------------------------------------------------------------
-// nld_VS
-// ----------------------------------------------------------------------------------------
-
-NETLIB_RESET(VS)
-{
- NETLIB_NAME(twoterm)::reset();
- this->set(1.0 / m_R(), m_V(), 0.0);
-}
-
-NETLIB_UPDATE(VS)
-{
- NETLIB_NAME(twoterm)::update();
-}
-
-NETLIB_TIMESTEP(VS)
-{
- this->set(1.0 / m_R(),
- m_compiled.evaluate(std::vector<double>({netlist().time().as_double()})),
- 0.0);
-}
-
-// ----------------------------------------------------------------------------------------
-// nld_CS
-// ----------------------------------------------------------------------------------------
-
-NETLIB_RESET(CS)
-{
- NETLIB_NAME(twoterm)::reset();
- const nl_double I = m_I();
-
- set_mat(0.0, 0.0, -I,
- 0.0, 0.0, I);
- //this->set(0.0, 0.0, m_I());
-}
-
-NETLIB_UPDATE(CS)
-{
- NETLIB_NAME(twoterm)::update();
-}
-
-NETLIB_TIMESTEP(CS)
-{
- const double I = m_compiled.evaluate(std::vector<double>({netlist().time().as_double()}));
- set_mat(0.0, 0.0, -I,
- 0.0, 0.0, I);
-}
} //namespace analog
namespace devices {
- NETLIB_DEVICE_IMPL_NS(analog, R)
- NETLIB_DEVICE_IMPL_NS(analog, POT)
- NETLIB_DEVICE_IMPL_NS(analog, POT2)
- NETLIB_DEVICE_IMPL_NS(analog, C)
- NETLIB_DEVICE_IMPL_NS(analog, L)
- NETLIB_DEVICE_IMPL_NS(analog, D)
- NETLIB_DEVICE_IMPL_NS(analog, VS)
- NETLIB_DEVICE_IMPL_NS(analog, CS)
- }
+ NETLIB_DEVICE_IMPL_NS(analog, R, "RES", "R")
+ NETLIB_DEVICE_IMPL_NS(analog, POT, "POT", "R")
+ NETLIB_DEVICE_IMPL_NS(analog, POT2, "POT2", "R")
+ NETLIB_DEVICE_IMPL_NS(analog, C, "CAP", "C")
+ NETLIB_DEVICE_IMPL_NS(analog, L, "IND", "L")
+ NETLIB_DEVICE_IMPL_NS(analog, D, "DIODE", "MODEL")
+ NETLIB_DEVICE_IMPL_NS(analog, VS, "VS", "V")
+ NETLIB_DEVICE_IMPL_NS(analog, CS, "CS", "I")
+ } // namespace devices
} // namespace netlist
diff --git a/src/lib/netlist/analog/nlid_twoterm.h b/src/lib/netlist/analog/nlid_twoterm.h
index 7778f5f4585..470fb35c96e 100644
--- a/src/lib/netlist/analog/nlid_twoterm.h
+++ b/src/lib/netlist/analog/nlid_twoterm.h
@@ -33,8 +33,12 @@
#ifndef NLID_TWOTERM_H_
#define NLID_TWOTERM_H_
-#include "../nl_base.h"
-#include "../plib/pfunction.h"
+#include "netlist/nl_base.h"
+#include "netlist/nl_setup.h"
+#include "netlist/solver/nld_solver.h"
+#include "plib/pfunction.h"
+
+#include <cmath>
// -----------------------------------------------------------------------------
// Implementation
@@ -48,14 +52,27 @@ namespace netlist
// nld_twoterm
// -----------------------------------------------------------------------------
+ template <class C>
+ inline core_device_t &bselect(bool b, C &d1, core_device_t &d2)
+ {
+ auto *h = dynamic_cast<core_device_t *>(&d1);
+ return b ? *h : d2;
+ }
+ template<>
+ inline core_device_t &bselect(bool b, netlist_state_t &d1, core_device_t &d2)
+ {
+ plib::unused_var(d1);
+ if (b)
+ throw nl_exception("bselect with netlist and b==true");
+ return d2;
+ }
+
NETLIB_OBJECT(twoterm)
{
NETLIB_CONSTRUCTOR_EX(twoterm, bool terminals_owned = false)
- , m_P(bselect(terminals_owned, owner, *this), (terminals_owned ? name + "." : "") + "1")
- , m_N(bselect(terminals_owned, owner, *this), (terminals_owned ? name + "." : "") + "2")
+ , m_P(bselect(terminals_owned, owner, *this), (terminals_owned ? name + "." : "") + "1", &m_N)
+ , m_N(bselect(terminals_owned, owner, *this), (terminals_owned ? name + "." : "") + "2", &m_P)
{
- m_P.m_otherterm = &m_N;
- m_N.m_otherterm = &m_P;
}
terminal_t m_P;
@@ -63,36 +80,36 @@ NETLIB_OBJECT(twoterm)
//NETLIB_UPDATE_TERMINALSI() { }
//NETLIB_RESETI() { }
- NETLIB_UPDATEI();
public:
- /* inline */ void set(const nl_double G, const nl_double V, const nl_double I)
+
+ NETLIB_UPDATEI();
+
+ void solve_now();
+
+ void solve_later(netlist_time delay = netlist_time::from_nsec(1));
+
+ void set_G_V_I(const nl_double G, const nl_double V, const nl_double I)
{
/* GO, GT, I */
- m_P.set( G, G, ( V) * G - I);
- m_N.set( G, G, ( -V) * G + I);
+ m_P.set_go_gt_I( -G, G, ( V) * G - I);
+ m_N.set_go_gt_I( -G, G, ( -V) * G + I);
}
- /* inline */ nl_double deltaV() const
+ nl_double deltaV() const
{
return m_P.net().Q_Analog() - m_N.net().Q_Analog();
}
- void set_mat(const nl_double a11, const nl_double a12, const nl_double r1,
- const nl_double a21, const nl_double a22, const nl_double r2)
+ void set_mat(const nl_double a11, const nl_double a12, const nl_double rhs1,
+ const nl_double a21, const nl_double a22, const nl_double rhs2)
{
/* GO, GT, I */
- m_P.set(-a12, a11, r1);
- m_N.set(-a21, a22, r2);
+ m_P.set_go_gt_I(a12, a11, rhs1);
+ m_N.set_go_gt_I(a21, a22, rhs2);
}
private:
- template <class C>
- static core_device_t &bselect(bool b, C &d1, core_device_t &d2)
- {
- core_device_t *h = dynamic_cast<core_device_t *>(&d1);
- return b ? *h : d2;
- }
};
@@ -106,17 +123,17 @@ NETLIB_OBJECT_DERIVED(R_base, twoterm)
{
}
-public:
- inline void set_R(const nl_double R)
+ void set_R(const nl_double R)
{
- const nl_double G = NL_FCONST(1.0) / R;
+ const nl_double G = plib::constants<nl_double>::one() / R;
set_mat( G, -G, 0.0,
-G, G, 0.0);
}
-protected:
NETLIB_RESETI();
- NETLIB_UPDATEI();
+
+protected:
+ //NETLIB_UPDATEI();
};
@@ -127,7 +144,6 @@ NETLIB_OBJECT_DERIVED(R, R_base)
{
}
- param_double_t m_R;
protected:
@@ -136,6 +152,7 @@ protected:
NETLIB_UPDATE_PARAMI();
private:
+ param_double_t m_R;
/* protect set_R ... it's a recipe to desaster when used to bypass the parameter */
using NETLIB_NAME(R_base)::set_R;
};
@@ -151,7 +168,8 @@ NETLIB_OBJECT(POT)
, m_R2(*this, "_R2")
, m_R(*this, "R", 10000)
, m_Dial(*this, "DIAL", 0.5)
- , m_DialIsLog(*this, "DIALLOG", 0)
+ , m_DialIsLog(*this, "DIALLOG", false)
+ , m_Reverse(*this, "REVERSE", false)
{
register_subalias("1", m_R1.m_P);
register_subalias("2", m_R1.m_N);
@@ -172,6 +190,7 @@ private:
param_double_t m_R;
param_double_t m_Dial;
param_logic_t m_DialIsLog;
+ param_logic_t m_Reverse;
};
NETLIB_OBJECT(POT2)
@@ -180,8 +199,8 @@ NETLIB_OBJECT(POT2)
, m_R1(*this, "_R1")
, m_R(*this, "R", 10000)
, m_Dial(*this, "DIAL", 0.5)
- , m_DialIsLog(*this, "DIALLOG", 0)
- , m_Reverse(*this, "REVERSE", 0)
+ , m_DialIsLog(*this, "DIALLOG", false)
+ , m_Reverse(*this, "REVERSE", false)
{
register_subalias("1", m_R1.m_P);
register_subalias("2", m_R1.m_N);
@@ -201,6 +220,83 @@ private:
param_logic_t m_Reverse;
};
+// -----------------------------------------------------------------------------
+// A generic capacitor model
+// -----------------------------------------------------------------------------
+
+enum class capacitor_e
+{
+ CHARGE_CONSERVING,
+ CONSTANT_CAPACITY
+};
+
+template <capacitor_e TYPE>
+class generic_capacitor
+{
+};
+
+
+template <>
+class generic_capacitor<capacitor_e::CHARGE_CONSERVING>
+{
+public:
+ generic_capacitor(device_t &dev, const pstring &name)
+ : m_h(dev, name + ".m_h", 0.0)
+ , m_charge(dev, name + ".m_charge", 0.0)
+ , m_gmin(0.0)
+ {
+ }
+
+ constexpr capacitor_e type() const { return capacitor_e::CHARGE_CONSERVING; }
+
+ constexpr nl_double G(nl_double cap) const
+ {
+ return cap * m_h + m_gmin;
+ }
+
+ constexpr nl_double Ieq(nl_double cap, nl_double v) const
+ {
+ return m_h * (cap * v - m_charge) - G(cap) * v;
+ }
+
+ void timestep(nl_double cap, nl_double v, nl_double step)
+ {
+ m_h = 1.0 / step;
+ m_charge = cap * v;
+ }
+
+ void setparams(nl_double gmin) { m_gmin = gmin; }
+
+private:
+ state_var<double> m_h;
+ state_var<double> m_charge;
+ nl_double m_gmin;
+};
+
+template <>
+class generic_capacitor<capacitor_e::CONSTANT_CAPACITY>
+{
+public:
+ generic_capacitor(device_t &dev, const pstring &name)
+ : m_h(dev, name + ".m_h", 0.0)
+ , m_gmin(0.0)
+ {
+ }
+
+ constexpr capacitor_e type() const { return capacitor_e::CONSTANT_CAPACITY; }
+ constexpr nl_double G(nl_double cap) const { return cap * m_h + m_gmin; }
+ constexpr nl_double Ieq(nl_double cap, nl_double v) const { return - G(cap) * v; }
+
+ void timestep(nl_double cap, nl_double v, nl_double step)
+ {
+ plib::unused_var(cap, v);
+ m_h = 1.0 / step;
+ }
+ void setparams(nl_double gmin) { m_gmin = gmin; }
+private:
+ state_var<nl_double> m_h;
+ nl_double m_gmin;
+};
// -----------------------------------------------------------------------------
// nld_C
@@ -211,25 +307,45 @@ NETLIB_OBJECT_DERIVED(C, twoterm)
public:
NETLIB_CONSTRUCTOR_DERIVED(C, twoterm)
, m_C(*this, "C", 1e-6)
- , m_GParallel(0.0)
+ , m_cap(*this, "m_cap")
{
- //register_term("1", m_P);
- //register_term("2", m_N);
}
NETLIB_IS_TIMESTEP(true)
- NETLIB_TIMESTEPI();
+ NETLIB_TIMESTEPI()
+ {
+ m_cap.timestep(m_C(), deltaV(), step);
+ if (m_cap.type() == capacitor_e::CONSTANT_CAPACITY)
+ {
+ const nl_double I = m_cap.Ieq(m_C(), deltaV());
+ const nl_double G = m_cap.G(m_C());
+ set_mat( G, -G, -I,
+ -G, G, I);
+ }
+ }
+
+ NETLIB_IS_DYNAMIC(m_cap.type() == capacitor_e::CHARGE_CONSERVING)
+ NETLIB_UPDATE_TERMINALSI()
+ {
+ const nl_double I = m_cap.Ieq(m_C(), deltaV());
+ const nl_double G = m_cap.G(m_C());
+ set_mat( G, -G, -I,
+ -G, G, I);
+ }
param_double_t m_C;
+ NETLIB_RESETI()
+ {
+ m_cap.setparams(exec().gmin());
+ }
protected:
- NETLIB_RESETI();
- NETLIB_UPDATEI();
- NETLIB_UPDATE_PARAMI();
+ //NETLIB_UPDATEI();
+ NETLIB_UPDATE_PARAMI() { }
private:
- nl_double m_GParallel;
-
+ generic_capacitor<capacitor_e::CHARGE_CONSERVING> m_cap;
+ //generic_capacitor<capacitor_e::CONSTANT_CAPACITY> m_cap;
};
// -----------------------------------------------------------------------------
@@ -241,7 +357,7 @@ NETLIB_OBJECT_DERIVED(L, twoterm)
public:
NETLIB_CONSTRUCTOR_DERIVED(L, twoterm)
, m_L(*this, "L", 1e-6)
- , m_GParallel(0.0)
+ , m_gmin(0.0)
, m_G(0.0)
, m_I(0.0)
{
@@ -251,16 +367,16 @@ public:
NETLIB_IS_TIMESTEP(true)
NETLIB_TIMESTEPI();
-
- param_double_t m_L;
+ NETLIB_RESETI();
protected:
- NETLIB_RESETI();
- NETLIB_UPDATEI();
+ //NETLIB_UPDATEI();
NETLIB_UPDATE_PARAMI();
private:
- nl_double m_GParallel;
+ param_double_t m_L;
+
+ nl_double m_gmin;
nl_double m_G;
nl_double m_I;
};
@@ -269,14 +385,82 @@ private:
// A generic diode model to be used in other devices (Diode, BJT ...)
// -----------------------------------------------------------------------------
+enum class diode_e
+{
+ BIPOLAR,
+ MOS
+};
+
+template <diode_e TYPE>
class generic_diode
{
public:
- generic_diode(device_t &dev, pstring name);
+ generic_diode(device_t &dev, const pstring &name)
+ : m_Vd(dev, name + ".m_Vd", 0.7)
+ , m_Id(dev, name + ".m_Id", 0.0)
+ , m_G(dev, name + ".m_G", 1e-15)
+ , m_Vt(0.0)
+ , m_Vmin(0.0) // not used in MOS model
+ , m_Is(0.0)
+ , m_logIs(0.0)
+ , m_n(0.0)
+ , m_gmin(1e-15)
+ , m_VtInv(0.0)
+ , m_Vcrit(0.0)
+ {
+ set_param(1e-15, 1, 1e-15, 300.0);
+ }
+
+ void update_diode(const double nVd)
+ {
+ if (TYPE == diode_e::BIPOLAR && nVd < m_Vmin)
+ {
+ m_Vd = nVd;
+ m_G = m_gmin;
+ m_Id = - m_Is;
+ }
+ else if (TYPE == diode_e::MOS && nVd < constants::zero())
+ {
+ m_Vd = nVd;
+ m_G = m_Is * m_VtInv + m_gmin;
+ m_Id = m_G * m_Vd;
+ }
+ // FIXME: For MOS, stop here, the critical code path will not converge
+ else if (TYPE == diode_e::MOS || nVd < m_Vcrit)
+ {
+ m_Vd = nVd;
+ const double IseVDVt = std::exp(std::min(700.0, m_logIs + m_Vd * m_VtInv));
+ m_Id = IseVDVt - m_Is;
+ m_G = IseVDVt * m_VtInv + m_gmin;
+ }
+ else
+ {
+ const double a = std::max((nVd - m_Vd) * m_VtInv, constants::cast(-0.99));
+ m_Vd = m_Vd + std::log1p(a) * m_Vt;
+ //const double IseVDVt = m_Is * std::exp(m_Vd * m_VtInv);
+ const double IseVDVt = std::exp(m_logIs + m_Vd * m_VtInv);
+ m_Id = IseVDVt - m_Is;
+ m_G = IseVDVt * m_VtInv + m_gmin;
+ }
+ }
+
+
+ void set_param(const double Is, const double n, double gmin, double temp)
+ {
+ static constexpr double csqrt2 = 1.414213562373095048801688724209; //std::sqrt(2.0);
+ m_Is = Is;
+ m_logIs = std::log(Is);
+ m_n = n;
+ m_gmin = gmin;
- void update_diode(const double nVd);
+ m_Vt = m_n * temp * constants::k_b() / constants::Q_e();
+
+ m_Vmin = -5.0 * m_Vt;
+
+ m_Vcrit = m_Vt * std::log(m_Vt / m_Is / csqrt2);
+ m_VtInv = 1.0 / m_Vt;
+ }
- void set_param(const double Is, const double n, double gmin);
double I() const { return m_Id; }
double G() const { return m_G; }
@@ -367,15 +551,15 @@ public:
NETLIB_IS_DYNAMIC(true)
NETLIB_UPDATE_TERMINALSI();
-
- diode_model_t m_model;
+ NETLIB_RESETI();
protected:
- NETLIB_RESETI();
- NETLIB_UPDATEI();
+ //NETLIB_UPDATEI();
NETLIB_UPDATE_PARAMI();
- generic_diode m_D;
+private:
+ diode_model_t m_model;
+ generic_diode<diode_e::BIPOLAR> m_D;
};
@@ -389,10 +573,11 @@ NETLIB_OBJECT_DERIVED(VS, twoterm)
{
public:
NETLIB_CONSTRUCTOR_DERIVED(VS, twoterm)
+ , m_t(*this, "m_t", 0.0)
, m_R(*this, "R", 0.1)
, m_V(*this, "V", 0.0)
, m_func(*this,"FUNC", "")
- , m_compiled(this->name() + ".FUNCC", this, this->netlist().state())
+ , m_compiled(this->name() + ".FUNCC", this, this->state().run_state_manager())
{
register_subalias("P", m_P);
register_subalias("N", m_N);
@@ -401,12 +586,26 @@ public:
}
NETLIB_IS_TIMESTEP(m_func() != "")
- NETLIB_TIMESTEPI();
+
+ NETLIB_TIMESTEPI()
+ {
+ m_t += step;
+ this->set_G_V_I(1.0 / m_R(),
+ m_compiled.evaluate(std::vector<double>({m_t})),
+ 0.0);
+ }
protected:
- NETLIB_UPDATEI();
- NETLIB_RESETI();
+ // NETLIB_UPDATEI() { NETLIB_NAME(twoterm)::update(time); }
+
+ NETLIB_RESETI()
+ {
+ NETLIB_NAME(twoterm)::reset();
+ this->set_G_V_I(1.0 / m_R(), m_V(), 0.0);
+ }
+private:
+ state_var<double> m_t;
param_double_t m_R;
param_double_t m_V;
param_str_t m_func;
@@ -421,9 +620,10 @@ NETLIB_OBJECT_DERIVED(CS, twoterm)
{
public:
NETLIB_CONSTRUCTOR_DERIVED(CS, twoterm)
+ , m_t(*this, "m_t", 0.0)
, m_I(*this, "I", 1.0)
, m_func(*this,"FUNC", "")
- , m_compiled(this->name() + ".FUNCC", this, this->netlist().state())
+ , m_compiled(this->name() + ".FUNCC", this, this->state().run_state_manager())
{
register_subalias("P", m_P);
register_subalias("N", m_N);
@@ -432,19 +632,33 @@ public:
}
NETLIB_IS_TIMESTEP(m_func() != "")
- NETLIB_TIMESTEPI();
+ NETLIB_TIMESTEPI()
+ {
+ m_t += step;
+ const double I = m_compiled.evaluate(std::vector<double>({m_t}));
+ set_mat(0.0, 0.0, -I,
+ 0.0, 0.0, I);
+ }
+
protected:
- NETLIB_UPDATEI();
- NETLIB_RESETI();
+ //NETLIB_UPDATEI() { NETLIB_NAME(twoterm)::update(time); }
+ NETLIB_RESETI()
+ {
+ NETLIB_NAME(twoterm)::reset();
+ set_mat(0.0, 0.0, -m_I(),
+ 0.0, 0.0, m_I());
+ }
+private:
+ state_var<double> m_t;
param_double_t m_I;
param_str_t m_func;
plib::pfunction m_compiled;
};
- } //namespace devices
+ } // namespace analog
} // namespace netlist
#endif /* NLD_TWOTERM_H_ */
diff --git a/src/lib/netlist/build/makefile b/src/lib/netlist/build/makefile
index 807ddbd6c7a..647c7df6f12 100644
--- a/src/lib/netlist/build/makefile
+++ b/src/lib/netlist/build/makefile
@@ -12,6 +12,27 @@
SRC = ..
VSBUILD = $(SRC)/buildVS
DOC = $(SRC)/documentation
+TIDY_DB = ../compile_commands.json
+
+TIDY_FLAGSX = -checks=*,-google*,-hicpp*,-readability*,-fuchsia*,cert-*,-android-*,
+TIDY_FLAGSX += -llvm-header-guard,-cppcoreguidelines-pro-type-reinterpret-cast,
+TIDY_FLAGSX += -cppcoreguidelines-pro-bounds-pointer-arithmetic,-cppcoreguidelines-owning-memory,
+TIDY_FLAGSX += -modernize-use-default-member-init,-cppcoreguidelines-pro-bounds-constant-array-index,
+TIDY_FLAGSX += -modernize-pass-by-value,-cppcoreguidelines-pro-type-static-cast-downcast,
+TIDY_FLAGSX += -cppcoreguidelines-avoid-magic-numbers,
+TIDY_FLAGSX += -cppcoreguidelines-macro-usage,
+TIDY_FLAGSX += -cppcoreguidelines-non-private-member-variables-in-classes,-misc-non-private-member-variables-in-classes,
+TIDY_FLAGSX += -bugprone-macro-parentheses,-misc-macro-parentheses
+
+space :=
+space +=
+TIDY_FLAGS = $(subst $(space),,$(TIDY_FLAGSX))
+
+TIDY_FLAGS = -checks=llvm-include-order,llvm-namespace-comment,modernize-use-override,modernize-use-using -fix
+#TIDY_FLAGS = -checks=llvm-include-order -fix
+#TIDY_FLAGS = -checks=llvm-namespace-comment -fix
+#TIDY_FLAGS = -checks=modernize-use-override -fix
+#TIDY_FLAGS = -checks=modernize-use-using -fix
ifeq ($(subst Windows_NT,windows,$(OS)),windows)
OBJ = obj/mingw
@@ -23,7 +44,7 @@ endif
# LTO = -flto=4 -fuse-linker-plugin -flto-partition=balanced -Wodr
-CFLAGS = $(LTO) -g -O3 -std=c++11 -march=native -I../.. -Wall -Wpedantic -Wsign-compare -Wextra -Wno-unused-parameter $(CEXTRAFLAGS)
+CFLAGS = $(LTO) -g -O3 -std=c++11 -I$(CURDIR)/.. -I$(CURDIR)/../.. $(CEXTRAFLAGS)
LDFLAGS = $(LTO) -g -O3 -std=c++11 $(LDEXTRAFLAGS)
LIBS = -lpthread -ldl
@@ -32,6 +53,7 @@ LD = @g++
MD = @mkdir
RM = @rm
DOXYGEN = @doxygen
+CLANG_TIDY = clang-tidy-9
TARGETS = nltool nlwav
@@ -53,7 +75,6 @@ OBJS = $(POBJS) $(NLOBJS)
POBJS := \
$(POBJ)/pstring.o \
- $(POBJ)/palloc.o \
$(POBJ)/pchrono.o \
$(POBJ)/pdynlib.o \
$(POBJ)/pexception.o \
@@ -73,6 +94,7 @@ NLOBJS := \
$(NLOBJ)/nl_setup.o \
$(NLOBJ)/nl_factory.o \
$(NLOBJ)/analog/nld_bjt.o \
+ $(NLOBJ)/analog/nld_mosfet.o \
$(NLOBJ)/analog/nlid_fourterm.o \
$(NLOBJ)/analog/nld_switches.o \
$(NLOBJ)/analog/nlid_twoterm.o \
@@ -92,6 +114,7 @@ NLOBJS := \
$(NLOBJ)/devices/nld_7485.o \
$(NLOBJ)/devices/nld_7490.o \
$(NLOBJ)/devices/nld_7493.o \
+ $(NLOBJ)/devices/nld_7497.o \
$(NLOBJ)/devices/nld_74107.o \
$(NLOBJ)/devices/nld_74123.o \
$(NLOBJ)/devices/nld_74153.o \
@@ -153,10 +176,12 @@ DOCS = \
$(DOC)/test1-50r.svg \
ALL_OBJS = $(OBJS) $(PMAIN) $(NLOBJ)/prg/nltool.o $(NLOBJ)/prg/nlwav.o
+
+ALL_TIDY_FILES = $(ALL_OBJS:.o=.json)
SOURCES = $(patsubst $(OBJ)%, $(SRC)%, $(ALL_OBJS:.o=.cpp))
ALLFILES = $(SOURCES) $(VSBUILDS) $(DOCS)
-MAKEFILE_TARGETS_WITHOUT_INCLUDE := clean doc clang mingw
+MAKEFILE_TARGETS_WITHOUT_INCLUDE := clean doc clang mingw nvcc
# git archive HEAD --prefix=project-name-version/ \
@@ -200,19 +225,33 @@ maketree: $(sort $(OBJDIRS))
# Special targets
#-------------------------------------------------
-.PHONY: clang clang-5 mingw doc
+.PHONY: clang clang-5 mingw doc native
+
+native:
+ $(MAKE) CEXTRAFLAGS="-march=native -msse4.2 -Wall -Wpedantic -Wsign-compare -Wextra "
clang:
- $(MAKE) CC=clang++ LD=clang++ CEXTRAFLAGS="-march=native -Weverything -Werror -override -Wno-unreachable-code -Wno-padded -Wno-weak-vtables -Wno-missing-variable-declarations -Wconversion -Wno-c++98-compat -Wno-float-equal -Wno-global-constructors -Wno-c++98-compat-pedantic -Wno-format-nonliteral -Wno-weak-template-vtables -Wno-exit-time-destructors"
+ $(MAKE) CC=clang++-9 LD=clang++-9 CEXTRAFLAGS="-march=native -Weverything -Werror -Wno-padded -Wno-weak-vtables -Wno-unused-template -Wno-missing-variable-declarations -Wno-float-equal -Wconversion -Wno-c++98-compat -Wno-c++98-compat-pedantic -Wno-format-nonliteral -Wno-exit-time-destructors"
clang-5:
$(MAKE) CC=clang++-5.0 LD=clang++-5.0 CEXTRAFLAGS="-march=native -Weverything -Werror -Wno-inconsistent-missing-destructor-override -Wno-unreachable-code -Wno-padded -Wno-weak-vtables -Wno-missing-variable-declarations -Wconversion -Wno-c++98-compat -Wno-float-equal -Wno-global-constructors -Wno-c++98-compat-pedantic -Wno-format-nonliteral -Wno-weak-template-vtables -Wno-exit-time-destructors"
+nvcc:
+ $(MAKE) CC=/usr/local/cuda-9.0/bin/nvcc LD=/usr/local/cuda-9.2/bin/nvcc \
+ CEXTRAFLAGS="-x cu -DNVCCBUILD=1 --expt-extended-lambda --expt-relaxed-constexpr --default-stream per-thread --restrict"
+
+tidy_db: compile_commands_prefix $(ALL_TIDY_FILES) compile_commands_postfix
+
#
+# -Wno-c++11-narrowing : seems a bit broken
# Mostly done: -Wno-weak-vtables -Wno-cast-align
# FIXME: -Wno-weak-vtables -Wno-missing-variable-declarations -Wno-conversion -Wno-exit-time-destructors
# FIXME: -Winconsistent-missing-destructor-override : c++ community has diverging opinions on this https://github.com/isocpp/CppCoreGuidelines/issues/721
# FIXME: -Wunreachable-code : False warnings, this a documented clang bug: https://llvm.org/bugs/show_bug.cgi?id=28994
+# -Wweak-template-vtables
+#
+# These have to be given:
+# -Wno-missing-variable-declarations : Device factory code, on purpose
mingw:
$(MAKE) CEXTRAFLAGS="-DUNICODE -D_UNICODE -D_WIN32_WINNT=0x0501 -DWIN32_LEAN_AND_MEAN" \
@@ -237,7 +276,7 @@ doc: nltool
@echo creating .depend
@rm -f ./.depend
@for i in $(SOURCES); do \
- $(CC) $(CFLAGS) -MM $$i -MT `echo $$i | sed -e 's+$(SRC)+$(OBJ)+' -e 's+.cpp+.o+' ` >>./.depend; \
+ $(CC) $(CFLAGS) -MM $$i -MT `echo $$i | sed -e 's+$(SRC)+$(OBJ)+' -e 's+.cpp+.o+' ` >> ./.depend; \
done
depend: .depend
@@ -248,6 +287,18 @@ ifeq ($(filter $(MAKECMDGOALS),$(MAKEFILE_TARGETS_WITHOUT_INCLUDE)),)
endif
#-------------------------------------------------
+# clang tidy
+#-------------------------------------------------
+tidy: tidy_db
+ @echo running tidy
+ @for i in $(SOURCES); do \
+ $(CLANG_TIDY) $$i $(TIDY_FLAGS) -header-filter=.*; \
+ done
+
+tidy_db: compile_commands_prefix $(ALL_TIDY_FILES) compile_commands_postfix
+
+
+#-------------------------------------------------
# generic rules
#-------------------------------------------------
@@ -268,3 +319,15 @@ $(OBJ)/%.a:
$(RM) $@
$(AR) $(ARFLAGS) $@ $^
+$(OBJ)/%.json: $(SRC)/%.cpp
+ @echo Building compile database entry for $< ...
+ @echo { \"directory\": \".\", >> $(TIDY_DB)
+ @echo \"command\": \"$(CC) $(CDEFS) $(CFLAGS) -c $< -o dummy.o\", >> $(TIDY_DB)
+ @echo \"file\": \"$(CURDIR)/$<\" } >> $(TIDY_DB)
+ @echo "," >> $(TIDY_DB)
+
+compile_commands_prefix:
+ @echo "[" > $(TIDY_DB)
+
+compile_commands_postfix:
+ @echo "]" >> $(TIDY_DB)
diff --git a/src/lib/netlist/devices/net_lib.cpp b/src/lib/netlist/devices/net_lib.cpp
index e0f0277daac..c0353f2489a 100644
--- a/src/lib/netlist/devices/net_lib.cpp
+++ b/src/lib/netlist/devices/net_lib.cpp
@@ -9,152 +9,159 @@
****************************************************************************/
#include "net_lib.h"
-#include "../nl_factory.h"
-#include "../solver/nld_solver.h"
+#include "netlist/nl_factory.h"
+#include "netlist/solver/nld_solver.h"
#define xstr(s) # s
-#define NETLIB_DEVICE_DECL(chip) extern factory::constructor_ptr_t decl_ ## chip;
+#define NETLIB_DEVICE_DECL(chip) extern factory::constructor_ptr_t decl_ ## chip
-#define ENTRYX1(nic, name, defparam, decl) factory.register_device( decl (pstring(# name), pstring(xstr(nic)), pstring(defparam)) );
-#define ENTRYX(nic, name, defparam) { NETLIB_DEVICE_DECL(nic) ENTRYX1(NETLIB_NAME(nic), name, defparam, decl_ ## nic) }
+#define LIB_DECL(nic, decl) factory.register_device( decl ( pstring(xstr(nic))) );
+#define LIB_ENTRY(nic) { NETLIB_DEVICE_DECL(nic); LIB_DECL(NETLIB_NAME(nic), decl_ ## nic) }
namespace netlist
{
- namespace devices
- {
- void initialize_factory(factory::list_t &factory)
+namespace devices
{
- ENTRYX(R, RES, "R")
- ENTRYX(POT, POT, "R")
- ENTRYX(POT2, POT2, "R")
- ENTRYX(C, CAP, "C")
- ENTRYX(L, IND, "L")
- ENTRYX(D, DIODE, "MODEL")
- ENTRYX(VS, VS, "V")
- ENTRYX(CS, CS, "I")
- ENTRYX(VCVS, VCVS, "")
- ENTRYX(VCCS, VCCS, "")
- ENTRYX(CCCS, CCCS, "")
- ENTRYX(LVCCS, LVCCS, "")
- ENTRYX(opamp, OPAMP, "MODEL")
- ENTRYX(dummy_input, DUMMY_INPUT, "")
- ENTRYX(frontier, FRONTIER_DEV, "+I,+G,+Q") // not intended to be used directly
- ENTRYX(function, AFUNC, "N,FUNC") // only for macro devices - NO FEEDBACK loops
- ENTRYX(QBJT_EB, QBJT_EB, "MODEL")
- ENTRYX(QBJT_switch, QBJT_SW, "MODEL")
- ENTRYX(logic_input, TTL_INPUT, "IN")
- ENTRYX(logic_input, LOGIC_INPUT, "IN,FAMILY")
- ENTRYX(analog_input, ANALOG_INPUT, "IN")
- ENTRYX(log, LOG, "+I")
- ENTRYX(logD, LOGD, "+I,+I2")
- ENTRYX(clock, CLOCK, "FREQ")
- ENTRYX(extclock, EXTCLOCK, "FREQ,PATTERN")
- ENTRYX(mainclock, MAINCLOCK, "FREQ")
- ENTRYX(gnd, GND, "")
- ENTRYX(netlistparams, PARAMETER, "")
- ENTRYX(solver, SOLVER, "FREQ")
- ENTRYX(res_sw, RES_SWITCH, "+IN,+P1,+P2")
- ENTRYX(switch1, SWITCH, "")
- ENTRYX(switch2, SWITCH2, "")
- ENTRYX(nicRSFF, NETDEV_RSFF, "")
- ENTRYX(nicDelay, NETDEV_DELAY, "")
- ENTRYX(2716, EPROM_2716, "+GQ,+EPQ,+A0,+A1,+A2,+A3,+A4,+A5,+A6,+A7,+A8,+A9,+A10")
- ENTRYX(TMS4800, ROM_TMS4800, "+AR,+OE1,+OE2,+A0,+A1,+A2,+A3,+A4,+A5,+A6,+A7,+A8,+A9,+A10")
- ENTRYX(2102A, RAM_2102A, "+CEQ,+A0,+A1,+A2,+A3,+A4,+A5,+A6,+A7,+A8,+A9,+RWQ,+DI")
- ENTRYX(7450, TTL_7450_ANDORINVERT, "+A,+B,+C,+D")
- ENTRYX(7448, TTL_7448, "+A,+B,+C,+D,+LTQ,+BIQ,+RBIQ")
- ENTRYX(7473, TTL_7473, "+CLK,+J,+K,+CLRQ")
- ENTRYX(7473A, TTL_7473A, "+CLK,+J,+K,+CLRQ")
- ENTRYX(7474, TTL_7474, "+CLK,+D,+CLRQ,+PREQ")
- ENTRYX(7475, TTL_7475, "")
- ENTRYX(7477, TTL_7477, "")
- ENTRYX(7483, TTL_7483, "+A1,+A2,+A3,+A4,+B1,+B2,+B3,+B4,+C0")
- ENTRYX(7485, TTL_7485, "+A0,+A1,+A2,+A3,+B0,+B1,+B2,+B3,+LTIN,+EQIN,+GTIN")
- ENTRYX(7490, TTL_7490, "+A,+B,+R1,+R2,+R91,+R92")
- ENTRYX(7493, TTL_7493, "+CLKA,+CLKB,+R1,+R2")
- ENTRYX(74107, TTL_74107, "+CLK,+J,+K,+CLRQ")
- ENTRYX(74107A, TTL_74107A, "+CLK,+J,+K,+CLRQ")
- ENTRYX(74123, TTL_74123, "")
- ENTRYX(74153, TTL_74153, "+C0,+C1,+C2,+C3,+A,+B,+G")
- ENTRYX(74161, TTL_74161, "+A,+B,+C,+D,+CLRQ,+LOADQ,+CLK,+ENABLEP,+ENABLET")
- ENTRYX(74164, TTL_74164, "+A,+B,+CLRQ,+CLK")
- ENTRYX(74165, TTL_74165, "+CLK,+CLKINH,+SH_LDQ,+SER,+A,+B,+C,+D,+E,+F,+G,+H")
- ENTRYX(74166, TTL_74166, "+CLK,+CLKINH,+SH_LDQ,+SER,+A,+B,+C,+D,+E,+F,+G,+H,+CLRQ")
- ENTRYX(74174, TTL_74174, "+CLK,+D1,+D2,+D3,+D4,+D5,+D6,+CLRQ")
- ENTRYX(74175, TTL_74175, "+CLK,+D1,+D2,+D3,+D4,+CLRQ")
- ENTRYX(74192, TTL_74192, "+A,+B,+C,+D,+CLEAR,+LOADQ,+CU,+CD")
- ENTRYX(74193, TTL_74193, "+A,+B,+C,+D,+CLEAR,+LOADQ,+CU,+CD")
- ENTRYX(74194, TTL_74194, "+CLK,+S0,+S1,+SRIN,+A,+B,+C,+D,+SLIN,+CLRQ")
- ENTRYX(74365, TTL_74365, "+G1Q,+G2Q,+A1,+A2,+A3,+A4,+A5,+A6")
- //ENTRY(74279, TTL_74279, "") // only dip available
- ENTRYX(SN74LS629, SN74LS629, "CAP")
- ENTRYX(82S16, TTL_82S16, "")
- ENTRYX(82S115, PROM_82S115, "+CE1Q,+CE2,+A0,+A1,+A2,+A3,+A4,+A5,+A6,+A7,+A8,+STROBE")
- ENTRYX(82S123, PROM_82S123, "+CEQ,+A0,+A1,+A2,+A3,+A4")
- ENTRYX(82S126, PROM_82S126, "+CE1Q,+CE2Q,+A0,+A1,+A2,+A3,+A4,+A5,+A6,+A7")
- ENTRYX(9310, TTL_9310, "")
- ENTRYX(9314, TTL_9314, "+EQ,+MRQ,+S0Q,+S1Q,+S2Q,+S3Q,+D0,+D1,+D2,+D3")
- ENTRYX(9316, TTL_9316, "+CLK,+ENP,+ENT,+CLRQ,+LOADQ,+A,+B,+C,+D")
- ENTRYX(9322, TTL_9322, "+SELECT,+A1,+B1,+A2,+B2,+A3,+B3,+A4,+B4,+STROBE")
- ENTRYX(9334, TTL_9334, "+CQ,+EQ,+D,+A0,+A1,+A2")
- ENTRYX(AM2847, TTL_AM2847, "+CP,+INA,+INB,+INC,+IND,+RCA,+RCB,+RCC,+RCD")
- ENTRYX(CD4020, CD4020, "")
- ENTRYX(CD4066_GATE, CD4066_GATE, "")
- ENTRYX(CD4316_GATE, CD4316_GATE, "")
- ENTRYX(schmitt_trigger, SCHMITT_TRIGGER, "MODEL")
- /* entries with suffix WI are legacy only */
- ENTRYX(CD4020, CD4020_WI, "+IP,+RESET,+VDD,+VSS")
- //ENTRY(4066, CD_4066, "+A,B")
- ENTRYX(NE555, NE555, "")
- ENTRYX(r2r_dac, R2R_DAC, "VIN,R,N")
- ENTRYX(tristate, TTL_TRISTATE, "+CEQ1,+D1,+CEQ2,+D2")
- ENTRYX(tristate3, TTL_TRISTATE3, "")
- ENTRYX(2102A_dip, RAM_2102A_DIP, "")
- ENTRYX(2716_dip, EPROM_2716_DIP, "")
- ENTRYX(tms4800_dip, ROM_TMS4800_DIP, "")
- ENTRYX(4538_dip, CD4538_DIP, "")
- ENTRYX(7448_dip, TTL_7448_DIP, "")
- ENTRYX(7450_dip, TTL_7450_DIP, "")
- ENTRYX(7473_dip, TTL_7473_DIP, "")
- ENTRYX(7473A_dip, TTL_7473A_DIP, "")
- ENTRYX(7474_dip, TTL_7474_DIP, "")
- ENTRYX(7475_dip, TTL_7475_DIP, "")
- ENTRYX(7477_dip, TTL_7477_DIP, "")
- ENTRYX(7483_dip, TTL_7483_DIP, "")
- ENTRYX(7485_dip, TTL_7485_DIP, "")
- ENTRYX(7490_dip, TTL_7490_DIP, "")
- ENTRYX(7493_dip, TTL_7493_DIP, "")
- ENTRYX(74107_dip, TTL_74107_DIP, "")
- ENTRYX(74123_dip, TTL_74123_DIP, "")
- ENTRYX(74153_dip, TTL_74153_DIP, "")
- ENTRYX(74161_dip, TTL_74161_DIP, "")
- ENTRYX(74164_dip, TTL_74164_DIP, "")
- ENTRYX(74165_dip, TTL_74165_DIP, "")
- ENTRYX(74166_dip, TTL_74166_DIP, "")
- ENTRYX(74174_dip, TTL_74174_DIP, "")
- ENTRYX(74175_dip, TTL_74175_DIP, "")
- ENTRYX(74192_dip, TTL_74192_DIP, "")
- ENTRYX(74193_dip, TTL_74193_DIP, "")
- ENTRYX(74194_dip, TTL_74194_DIP, "")
- ENTRYX(74365_dip, TTL_74365_DIP, "")
- ENTRYX(82S16_dip, TTL_82S16_DIP, "")
- ENTRYX(82S115_dip, PROM_82S115_DIP, "")
- ENTRYX(82S123_dip, PROM_82S123_DIP, "")
- ENTRYX(82S126_dip, PROM_82S126_DIP, "")
- ENTRYX(9602_dip, TTL_9602_DIP, "")
- ENTRYX(9310_dip, TTL_9310_DIP, "")
- ENTRYX(9314_dip, TTL_9314_DIP, "")
- ENTRYX(9316_dip, TTL_9316_DIP, "")
- ENTRYX(9322_dip, TTL_9322_DIP, "")
- ENTRYX(9334_dip, TTL_9334_DIP, "")
- ENTRYX(AM2847_dip, TTL_AM2847_DIP, "")
- ENTRYX(SN74LS629_dip, SN74LS629_DIP, "1.CAP1,2.CAP2")
- ENTRYX(NE555_dip, NE555_DIP, "")
- ENTRYX(MM5837_dip, MM5837_DIP, "")
-}
- } //namespace devices
+ void initialize_factory(factory::list_t &factory)
+ {
+ LIB_ENTRY(R)
+ LIB_ENTRY(POT)
+ LIB_ENTRY(POT2)
+ LIB_ENTRY(C)
+ LIB_ENTRY(L)
+ LIB_ENTRY(D)
+ LIB_ENTRY(VS)
+ LIB_ENTRY(CS)
+ LIB_ENTRY(VCVS)
+ LIB_ENTRY(VCCS)
+ LIB_ENTRY(CCCS)
+ LIB_ENTRY(LVCCS)
+ LIB_ENTRY(opamp)
+ LIB_ENTRY(dummy_input)
+ LIB_ENTRY(frontier) // not intended to be used directly
+ LIB_ENTRY(function) // only for macro devices - NO FEEDBACK loops
+ LIB_ENTRY(QBJT_EB)
+ LIB_ENTRY(QBJT_switch)
+ LIB_ENTRY(MOSFET)
+ LIB_ENTRY(logic_input_ttl)
+ LIB_ENTRY(logic_input)
+ LIB_ENTRY(analog_input)
+ LIB_ENTRY(log)
+ LIB_ENTRY(logD)
+ LIB_ENTRY(clock)
+ LIB_ENTRY(extclock)
+ LIB_ENTRY(mainclock)
+ LIB_ENTRY(gnd)
+ LIB_ENTRY(netlistparams)
+ LIB_ENTRY(solver)
+ LIB_ENTRY(res_sw)
+ LIB_ENTRY(switch1)
+ LIB_ENTRY(switch2)
+ LIB_ENTRY(nicRSFF)
+ LIB_ENTRY(nicDelay)
+ LIB_ENTRY(2102A)
+ LIB_ENTRY(2102A_dip)
+ LIB_ENTRY(2716)
+ LIB_ENTRY(2716_dip)
+ LIB_ENTRY(7448)
+ LIB_ENTRY(7448_dip)
+ LIB_ENTRY(7450)
+ LIB_ENTRY(7450_dip)
+ LIB_ENTRY(7473)
+ LIB_ENTRY(7473_dip)
+ LIB_ENTRY(7473A)
+ LIB_ENTRY(7473A_dip)
+ LIB_ENTRY(7474)
+ LIB_ENTRY(7474_dip)
+ LIB_ENTRY(7475)
+ LIB_ENTRY(7475_dip)
+ LIB_ENTRY(7477)
+ LIB_ENTRY(7477_dip)
+ LIB_ENTRY(7483)
+ LIB_ENTRY(7483_dip)
+ LIB_ENTRY(7485)
+ LIB_ENTRY(7485_dip)
+ LIB_ENTRY(7490)
+ LIB_ENTRY(7490_dip)
+ LIB_ENTRY(7493)
+ LIB_ENTRY(7493_dip)
+ LIB_ENTRY(7497)
+ LIB_ENTRY(7497_dip)
+ LIB_ENTRY(74107)
+ LIB_ENTRY(74107_dip)
+ LIB_ENTRY(74107A) // FIXME: implement missing DIP
+ LIB_ENTRY(74123)
+ LIB_ENTRY(74123_dip)
+ LIB_ENTRY(74153)
+ LIB_ENTRY(74153_dip)
+ LIB_ENTRY(74161)
+ LIB_ENTRY(74161_dip)
+ LIB_ENTRY(74164)
+ LIB_ENTRY(74164_dip)
+ LIB_ENTRY(74165)
+ LIB_ENTRY(74165_dip)
+ LIB_ENTRY(74166)
+ LIB_ENTRY(74166_dip)
+ LIB_ENTRY(74174)
+ LIB_ENTRY(74175)
+ LIB_ENTRY(74192)
+ LIB_ENTRY(74193)
+ LIB_ENTRY(74194)
+ LIB_ENTRY(74365)
+ //ENTRY(74279, TTL_74279, "") // only dip available
+ LIB_ENTRY(SN74LS629)
+ LIB_ENTRY(82S16)
+ LIB_ENTRY(82S115)
+ LIB_ENTRY(82S123)
+ LIB_ENTRY(82S126)
+ LIB_ENTRY(9310)
+ LIB_ENTRY(9314)
+ LIB_ENTRY(9316)
+ LIB_ENTRY(9322)
+ LIB_ENTRY(9334)
+ LIB_ENTRY(AM2847)
+ // FIXME: duplicate?
+ LIB_ENTRY(CD4020_WI)
+ LIB_ENTRY(CD4020)
+ LIB_ENTRY(CD4066_GATE)
+ LIB_ENTRY(CD4316_GATE)
+ LIB_ENTRY(4538_dip)
+ LIB_ENTRY(schmitt_trigger)
+ /* entries with suffix WI are legacy only */
+ //ENTRY(4066, CD_4066, "+A,B")
+ LIB_ENTRY(NE555)
+ LIB_ENTRY(NE555_dip)
+ LIB_ENTRY(MC1455P)
+ LIB_ENTRY(MC1455P_dip)
+ LIB_ENTRY(TMS4800)
+ LIB_ENTRY(TMS4800_dip)
+ LIB_ENTRY(r2r_dac)
+ LIB_ENTRY(tristate)
+ LIB_ENTRY(tristate3)
+ LIB_ENTRY(74174_dip)
+ LIB_ENTRY(74175_dip)
+ LIB_ENTRY(74192_dip)
+ LIB_ENTRY(74193_dip)
+ LIB_ENTRY(74194_dip)
+ LIB_ENTRY(74365_dip)
+ LIB_ENTRY(82S16_dip)
+ LIB_ENTRY(82S115_dip)
+ LIB_ENTRY(82S123_dip)
+ LIB_ENTRY(82S126_dip)
+ LIB_ENTRY(9602_dip)
+ LIB_ENTRY(9310_dip)
+ LIB_ENTRY(9314_dip)
+ LIB_ENTRY(9316_dip)
+ LIB_ENTRY(9322_dip)
+ LIB_ENTRY(9334_dip)
+ LIB_ENTRY(AM2847_dip)
+ LIB_ENTRY(SN74LS629_dip)
+ LIB_ENTRY(MM5837_dip)
+ }
+
+} //namespace devices
} // namespace netlist
diff --git a/src/lib/netlist/devices/net_lib.h b/src/lib/netlist/devices/net_lib.h
index 4dead624fc2..abf58ccee16 100644
--- a/src/lib/netlist/devices/net_lib.h
+++ b/src/lib/netlist/devices/net_lib.h
@@ -35,18 +35,8 @@
#include "nld_2102A.h"
#include "nld_2716.h"
-#include "nld_tms4800.h"
#include "nld_4020.h"
#include "nld_4066.h"
-#include "nld_7448.h"
-#include "nld_7450.h"
-#include "nld_7473.h"
-#include "nld_7474.h"
-#include "nld_7475.h"
-#include "nld_7483.h"
-#include "nld_7485.h"
-#include "nld_7490.h"
-#include "nld_7493.h"
#include "nld_74107.h"
#include "nld_74123.h"
#include "nld_74153.h"
@@ -60,21 +50,32 @@
#include "nld_74193.h"
#include "nld_74194.h"
#include "nld_74365.h"
+#include "nld_7448.h"
+#include "nld_7450.h"
+#include "nld_7473.h"
+#include "nld_7474.h"
+#include "nld_7475.h"
+#include "nld_7483.h"
+#include "nld_7485.h"
+#include "nld_7490.h"
+#include "nld_7493.h"
+#include "nld_7497.h"
#include "nld_74ls629.h"
-#include "nld_82S16.h"
#include "nld_82S115.h"
#include "nld_82S123.h"
#include "nld_82S126.h"
+#include "nld_82S16.h"
#include "nld_9310.h"
#include "nld_9316.h"
#include "nld_9322.h"
+#include "nld_tms4800.h"
#include "nld_am2847.h"
#include "nld_dm9314.h"
#include "nld_dm9334.h"
-#include "nld_ne555.h"
#include "nld_mm5837.h"
+#include "nld_ne555.h"
#include "nld_r2r_dac.h"
@@ -84,16 +85,17 @@
#include "nld_log.h"
-#include "../macro/nlm_cd4xxx.h"
-#include "../macro/nlm_ttl74xx.h"
-#include "../macro/nlm_opamp.h"
-#include "../macro/nlm_other.h"
-
-#include "../analog/nld_bjt.h"
-#include "../analog/nld_fourterm.h"
-#include "../analog/nld_switches.h"
-#include "../analog/nld_twoterm.h"
-#include "../analog/nld_opamps.h"
+#include "netlist/macro/nlm_cd4xxx.h"
+#include "netlist/macro/nlm_opamp.h"
+#include "netlist/macro/nlm_other.h"
+#include "netlist/macro/nlm_ttl74xx.h"
+
+#include "netlist/analog/nld_bjt.h"
+#include "netlist/analog/nld_fourterm.h"
+#include "netlist/analog/nld_mosfet.h"
+#include "netlist/analog/nld_opamps.h"
+#include "netlist/analog/nld_switches.h"
+#include "netlist/analog/nld_twoterm.h"
#include "nld_legacy.h"
#endif
diff --git a/src/lib/netlist/devices/nld_2102A.cpp b/src/lib/netlist/devices/nld_2102A.cpp
index 5296bf2d029..0ec7132b401 100644
--- a/src/lib/netlist/devices/nld_2102A.cpp
+++ b/src/lib/netlist/devices/nld_2102A.cpp
@@ -6,7 +6,7 @@
*/
#include "nld_2102A.h"
-#include "../nl_base.h"
+#include "netlist/nl_base.h"
#define ADDR2BYTE(a) ((a) >> 3)
#define ADDR2BIT(a) ((a) & 0x7)
@@ -39,7 +39,7 @@ namespace netlist
logic_output_t m_DO;
- state_var<uint8_t[128]> m_ram; // 1024x1 bits
+ state_array<uint8_t, 128> m_ram; // 1024x1 bits
param_ptr_t m_RAM;
};
@@ -97,8 +97,8 @@ namespace netlist
m_ram[i] = 0;
}
- NETLIB_DEVICE_IMPL(2102A)
- NETLIB_DEVICE_IMPL(2102A_dip)
+ NETLIB_DEVICE_IMPL(2102A, "RAM_2102A", "+CEQ,+A0,+A1,+A2,+A3,+A4,+A5,+A6,+A7,+A8,+A9,+RWQ,+DI")
+ NETLIB_DEVICE_IMPL(2102A_dip,"RAM_2102A_DIP","")
} //namespace devices
} // namespace netlist
diff --git a/src/lib/netlist/devices/nld_2102A.h b/src/lib/netlist/devices/nld_2102A.h
index 52d892d4d40..aa53efde47d 100644
--- a/src/lib/netlist/devices/nld_2102A.h
+++ b/src/lib/netlist/devices/nld_2102A.h
@@ -24,7 +24,7 @@
#ifndef NLD_2102A_H_
#define NLD_2102A_H_
-#include "../nl_setup.h"
+#include "netlist/nl_setup.h"
#define RAM_2102A(name, cCEQ, cA0, cA1, cA2, cA3, cA4, cA5, cA6, cA7, cA8, cA9, cRWQ, cDI) \
NET_REGISTER_DEV(RAM_2102A, name) \
diff --git a/src/lib/netlist/devices/nld_2716.cpp b/src/lib/netlist/devices/nld_2716.cpp
index cb53d60e205..b021bc95003 100644
--- a/src/lib/netlist/devices/nld_2716.cpp
+++ b/src/lib/netlist/devices/nld_2716.cpp
@@ -6,7 +6,7 @@
*/
#include "nld_2716.h"
-#include "../nl_base.h"
+#include "netlist/nl_base.h"
namespace netlist
{
@@ -92,8 +92,8 @@ namespace netlist
m_D[i].push((d >> i) & 1, delay);
}
- NETLIB_DEVICE_IMPL(2716)
- NETLIB_DEVICE_IMPL(2716_dip)
+ NETLIB_DEVICE_IMPL(2716, "EPROM_2716", "+GQ,+EPQ,+A0,+A1,+A2,+A3,+A4,+A5,+A6,+A7,+A8,+A9,+A10")
+ NETLIB_DEVICE_IMPL(2716_dip, "EPROM_2716_DIP", "")
} //namespace devices
} // namespace netlist
diff --git a/src/lib/netlist/devices/nld_2716.h b/src/lib/netlist/devices/nld_2716.h
index f4776242e6a..363086d6a37 100644
--- a/src/lib/netlist/devices/nld_2716.h
+++ b/src/lib/netlist/devices/nld_2716.h
@@ -28,7 +28,7 @@
#ifndef NLD_2716_H_
#define NLD_2716_H_
-#include "../nl_setup.h"
+#include "netlist/nl_setup.h"
#define EPROM_2716(name, cGQ, cEPQ, cA0, cA1, cA2, cA3, cA4, cA5, cA6, cA7, cA8, cA9, cA10) \
NET_REGISTER_DEV(EPROM_2716, name) \
diff --git a/src/lib/netlist/devices/nld_4020.cpp b/src/lib/netlist/devices/nld_4020.cpp
index 8403d42bef2..13518f9d3cb 100644
--- a/src/lib/netlist/devices/nld_4020.cpp
+++ b/src/lib/netlist/devices/nld_4020.cpp
@@ -96,9 +96,9 @@ namespace netlist
m_sub.m_IP.activate_hl();
}
- inline NETLIB_FUNC_VOID(CD4020_sub, update_outputs, (const unsigned cnt))
+ NETLIB_FUNC_VOID(CD4020_sub, update_outputs, (const unsigned cnt))
{
- /* static */ const netlist_time out_delayQn[14] = {
+ static constexpr const std::array<netlist_time, 14> out_delayQn = {
NLTIME_FROM_NS(180), NLTIME_FROM_NS(280),
NLTIME_FROM_NS(380), NLTIME_FROM_NS(480),
NLTIME_FROM_NS(580), NLTIME_FROM_NS(680),
@@ -113,7 +113,8 @@ namespace netlist
m_Q[i].push((cnt >> i) & 1, out_delayQn[i]);
}
- NETLIB_DEVICE_IMPL(CD4020)
+ NETLIB_DEVICE_IMPL(CD4020, "CD4020", "")
+ NETLIB_DEVICE_IMPL_ALIAS(CD4020_WI, CD4020, "CD4020_WI", "+IP,+RESET,+VDD,+VSS")
} //namespace devices
} // namespace netlist
diff --git a/src/lib/netlist/devices/nld_4020.h b/src/lib/netlist/devices/nld_4020.h
index fd6b234da46..f24251fb1dc 100644
--- a/src/lib/netlist/devices/nld_4020.h
+++ b/src/lib/netlist/devices/nld_4020.h
@@ -27,7 +27,7 @@
#ifndef NLD_4020_H_
#define NLD_4020_H_
-#include "../nl_setup.h"
+#include "netlist/nl_setup.h"
/* FIXME: only used in mario.c */
#define CD4020_WI(name, cIP, cRESET, cVDD, cVSS) \
diff --git a/src/lib/netlist/devices/nld_4066.cpp b/src/lib/netlist/devices/nld_4066.cpp
index ebd269a023a..0c7511ca438 100644
--- a/src/lib/netlist/devices/nld_4066.cpp
+++ b/src/lib/netlist/devices/nld_4066.cpp
@@ -5,10 +5,12 @@
*
*/
-#include "nlid_cmos.h"
-#include "../analog/nlid_twoterm.h"
#include "nld_4066.h"
+#include "netlist/analog/nlid_twoterm.h"
+#include "netlist/solver/nld_solver.h"
+#include "nlid_cmos.h"
+
namespace netlist
{
namespace devices
@@ -27,7 +29,7 @@ namespace netlist
NETLIB_RESETI();
NETLIB_UPDATEI();
- public:
+ private:
NETLIB_SUB(vdd_vss) m_supply;
analog::NETLIB_SUB(R_base) m_R;
@@ -39,45 +41,36 @@ namespace netlist
{
// Start in off condition
// FIXME: is ROFF correct?
- m_R.set_R(NL_FCONST(1.0) / netlist().gmin());
+ m_R.set_R(plib::constants<nl_double>::one() / exec().gmin());
}
NETLIB_UPDATE(CD4066_GATE)
{
nl_double sup = (m_supply.vdd() - m_supply.vss());
- nl_double low = NL_FCONST(0.45) * sup;
- nl_double high = NL_FCONST(0.55) * sup;
+ nl_double low = plib::constants<nl_double>::cast(0.45) * sup;
+ nl_double high = plib::constants<nl_double>::cast(0.55) * sup;
nl_double in = m_control() - m_supply.vss();
- nl_double rON = m_base_r() * NL_FCONST(5.0) / sup;
+ nl_double rON = m_base_r() * plib::constants<nl_double>::cast(5.0) / sup;
nl_double R = -1.0;
if (in < low)
{
- R = NL_FCONST(1.0) / netlist().gmin();
+ R = plib::constants<nl_double>::one() / exec().gmin();
}
else if (in > high)
{
R = rON;
}
- if (R > NL_FCONST(0.0))
+ if (R > plib::constants<nl_double>::zero())
{
- // We only need to update the net first if this is a time stepping net
- if ((1)) // m_R.m_P.net().as_analog().solver().is_timestep())
- {
- m_R.update_dev();
- m_R.set_R(R);
- m_R.m_P.schedule_solve_after(NLTIME_FROM_NS(1));
- }
- else
- {
- m_R.set_R(R);
- m_R.update_dev();
- }
+ m_R.update();
+ m_R.set_R(R);
+ m_R.solve_later();
}
}
- NETLIB_DEVICE_IMPL(CD4066_GATE)
+ NETLIB_DEVICE_IMPL(CD4066_GATE, "CD4066_GATE", "")
} //namespace devices
} // namespace netlist
diff --git a/src/lib/netlist/devices/nld_4066.h b/src/lib/netlist/devices/nld_4066.h
index e9fd579496c..d339464a108 100644
--- a/src/lib/netlist/devices/nld_4066.h
+++ b/src/lib/netlist/devices/nld_4066.h
@@ -24,7 +24,7 @@
#ifndef NLD_4066_H_
#define NLD_4066_H_
-#include "../nl_setup.h"
+#include "netlist/nl_setup.h"
#define CD4066_GATE(name) \
NET_REGISTER_DEV(CD4066_GATE, name)
diff --git a/src/lib/netlist/devices/nld_4316.cpp b/src/lib/netlist/devices/nld_4316.cpp
index b9758ff036b..c8ee1a90643 100644
--- a/src/lib/netlist/devices/nld_4316.cpp
+++ b/src/lib/netlist/devices/nld_4316.cpp
@@ -5,9 +5,10 @@
*
*/
-#include "nlid_cmos.h"
-#include "../analog/nlid_twoterm.h"
#include "nld_4316.h"
+#include "netlist/analog/nlid_twoterm.h"
+#include "netlist/solver/nld_solver.h"
+#include "nlid_cmos.h"
namespace netlist { namespace devices {
@@ -37,19 +38,20 @@ namespace netlist { namespace devices {
NETLIB_RESET(CD4316_GATE)
{
- m_R.set_R(NL_FCONST(1.0) / netlist().gmin());
+ m_R.set_R(plib::constants<nl_double>::one() / exec().gmin());
}
NETLIB_UPDATE(CD4316_GATE)
{
- m_R.update_dev();
+ m_R.update();
if (m_S() && !m_E())
m_R.set_R(m_base_r());
else
- m_R.set_R(NL_FCONST(1.0) / netlist().gmin());
- m_R.m_P.schedule_solve_after(NLTIME_FROM_NS(1));
+ m_R.set_R(plib::constants<nl_double>::one() / exec().gmin());
+ m_R.solve_later(NLTIME_FROM_NS(1));
}
- NETLIB_DEVICE_IMPL(CD4316_GATE)
+ NETLIB_DEVICE_IMPL(CD4316_GATE, "CD4316_GATE", "")
-} } // namesapce netlist::devices
+} // namespace devices
+ } // namespace netlist
diff --git a/src/lib/netlist/devices/nld_4316.h b/src/lib/netlist/devices/nld_4316.h
index eb1d13f5542..278a2793a6f 100644
--- a/src/lib/netlist/devices/nld_4316.h
+++ b/src/lib/netlist/devices/nld_4316.h
@@ -25,7 +25,7 @@
#ifndef NLD_4316_H_
#define NLD_4316_H_
-#include "../nl_setup.h"
+#include "netlist/nl_setup.h"
#define CD4316_GATE(name) \
NET_REGISTER_DEV(CD4316_GATE, name)
diff --git a/src/lib/netlist/devices/nld_74107.cpp b/src/lib/netlist/devices/nld_74107.cpp
index c5a12a15fb4..763760e2c6a 100644
--- a/src/lib/netlist/devices/nld_74107.cpp
+++ b/src/lib/netlist/devices/nld_74107.cpp
@@ -6,15 +6,15 @@
*/
#include "nld_74107.h"
-#include "../nl_base.h"
+#include "netlist/nl_base.h"
namespace netlist
{
namespace devices
{
- static constexpr netlist_time delay_107[2] = { NLTIME_FROM_NS(16), NLTIME_FROM_NS(25) };
- static constexpr netlist_time delay_107A[2] = { NLTIME_FROM_NS(15), NLTIME_FROM_NS(15) };
+ static constexpr const netlist_time delay_107[2] = { NLTIME_FROM_NS(16), NLTIME_FROM_NS(25) };
+ static constexpr const netlist_time delay_107A[2] = { NLTIME_FROM_NS(15), NLTIME_FROM_NS(15) };
NETLIB_OBJECT(74107A)
{
@@ -22,11 +22,12 @@ namespace netlist
, m_clk(*this, "CLK", NETLIB_DELEGATE(74107A, clk))
, m_Q(*this, "Q")
, m_QQ(*this, "QQ")
- , m_delay(delay_107A)
, m_J(*this, "J")
, m_K(*this, "K")
, m_clrQ(*this, "CLRQ")
{
+ m_delay[0] = delay_107A[0];
+ m_delay[1] = delay_107A[1];
}
friend class NETLIB_NAME(74107_dip);
@@ -43,7 +44,7 @@ namespace netlist
logic_output_t m_Q;
logic_output_t m_QQ;
- const netlist_time *m_delay;
+ netlist_time m_delay[2];
logic_input_t m_J;
logic_input_t m_K;
@@ -61,7 +62,8 @@ namespace netlist
public:
NETLIB_CONSTRUCTOR_DERIVED(74107, 74107A)
{
- m_delay = delay_107;
+ m_delay[0] = delay_107[0];
+ m_delay[1] = delay_107[1];
}
};
@@ -137,9 +139,9 @@ namespace netlist
m_clk.activate_hl();
}
- NETLIB_DEVICE_IMPL(74107)
- NETLIB_DEVICE_IMPL(74107A)
- NETLIB_DEVICE_IMPL(74107_dip)
+ NETLIB_DEVICE_IMPL(74107, "TTL_74107", "+CLK,+J,+K,+CLRQ")
+ NETLIB_DEVICE_IMPL(74107A, "TTL_74107A", "+CLK,+J,+K,+CLRQ")
+ NETLIB_DEVICE_IMPL(74107_dip, "TTL_74107_DIP", "")
} //namespace devices
} // namespace netlist
diff --git a/src/lib/netlist/devices/nld_74107.h b/src/lib/netlist/devices/nld_74107.h
index b59848cbb05..c6f8864610a 100644
--- a/src/lib/netlist/devices/nld_74107.h
+++ b/src/lib/netlist/devices/nld_74107.h
@@ -64,7 +64,7 @@
#ifndef NLD_74107_H_
#define NLD_74107_H_
-#include "../nl_setup.h"
+#include "netlist/nl_setup.h"
#define TTL_74107A(name, cCLK, cJ, cK, cCLRQ) \
NET_REGISTER_DEV(TTL_74107A, name) \
diff --git a/src/lib/netlist/devices/nld_74123.cpp b/src/lib/netlist/devices/nld_74123.cpp
index 9055c5ce140..32e47a47ef2 100644
--- a/src/lib/netlist/devices/nld_74123.cpp
+++ b/src/lib/netlist/devices/nld_74123.cpp
@@ -6,7 +6,7 @@
*/
#include "nlid_system.h"
-#include "../analog/nlid_twoterm.h"
+#include "netlist/analog/nlid_twoterm.h"
#include <cmath>
@@ -257,8 +257,8 @@ namespace netlist
{
m_KP = 1.0 / (1.0 + exp(m_K()));
- m_RP.do_reset();
- m_RN.do_reset();
+ m_RP.reset();
+ m_RN.reset();
//m_RP.set_R(R_OFF);
//m_RN.set_R(R_OFF);
@@ -276,8 +276,8 @@ namespace netlist
NETLIB_RESET(74123_dip)
{
- //m_1.do_reset();
- //m_2.do_reset();
+ //m_1.reset();
+ //m_2.reset();
}
NETLIB_UPDATE(9602_dip)
@@ -289,8 +289,8 @@ namespace netlist
NETLIB_RESET(9602_dip)
{
- //m_1.do_reset();
- //m_2.do_reset();
+ //m_1.reset();
+ //m_2.reset();
}
NETLIB_UPDATE(4538_dip)
@@ -302,14 +302,14 @@ namespace netlist
NETLIB_RESET(4538_dip)
{
- m_1.do_reset();
- m_2.do_reset();
+ m_1.reset();
+ m_2.reset();
}
- NETLIB_DEVICE_IMPL(74123)
- NETLIB_DEVICE_IMPL(74123_dip)
- NETLIB_DEVICE_IMPL(4538_dip)
- NETLIB_DEVICE_IMPL(9602_dip)
+ NETLIB_DEVICE_IMPL(74123, "TTL_74123", "")
+ NETLIB_DEVICE_IMPL(74123_dip, "TTL_74123_DIP", "")
+ NETLIB_DEVICE_IMPL(4538_dip, "CD4538_DIP", "")
+ NETLIB_DEVICE_IMPL(9602_dip, "TTL_9602_DIP", "")
} //namespace devices
} // namespace netlist
diff --git a/src/lib/netlist/devices/nld_74123.h b/src/lib/netlist/devices/nld_74123.h
index dfd75f746c7..3eca141b613 100644
--- a/src/lib/netlist/devices/nld_74123.h
+++ b/src/lib/netlist/devices/nld_74123.h
@@ -49,7 +49,7 @@
#ifndef NLD_74123_H_
#define NLD_74123_H_
-#include "../nl_setup.h"
+#include "netlist/nl_setup.h"
#define TTL_74123(name) \
NET_REGISTER_DEV(TTL_74123, name)
diff --git a/src/lib/netlist/devices/nld_74153.cpp b/src/lib/netlist/devices/nld_74153.cpp
index b74c09f8cc0..136fe61520b 100644
--- a/src/lib/netlist/devices/nld_74153.cpp
+++ b/src/lib/netlist/devices/nld_74153.cpp
@@ -6,7 +6,7 @@
*/
#include "nld_74153.h"
-#include "../nl_base.h"
+#include "netlist/nl_base.h"
namespace netlist
{
@@ -120,19 +120,19 @@ namespace netlist
NETLIB_UPDATE(74153)
{
m_sub.m_chan = (m_A() | (m_B()<<1));
- m_sub.update_dev();
+ m_sub.update();
}
NETLIB_UPDATE(74153_dip)
{
m_2.m_chan = m_1.m_chan = (m_A() | (m_B()<<1));
- m_1.update_dev();
- m_2.update_dev();
+ m_1.update();
+ m_2.update();
}
- NETLIB_DEVICE_IMPL(74153)
- NETLIB_DEVICE_IMPL(74153_dip)
+ NETLIB_DEVICE_IMPL(74153, "TTL_74153", "+C0,+C1,+C2,+C3,+A,+B,+G")
+ NETLIB_DEVICE_IMPL(74153_dip, "TTL_74153_DIP", "")
} //namespace devices
} // namespace netlist
diff --git a/src/lib/netlist/devices/nld_74153.h b/src/lib/netlist/devices/nld_74153.h
index ee77d4224ce..f1c0f056cf7 100644
--- a/src/lib/netlist/devices/nld_74153.h
+++ b/src/lib/netlist/devices/nld_74153.h
@@ -45,7 +45,7 @@
#ifndef NLD_74153_H_
#define NLD_74153_H_
-#include "../nl_setup.h"
+#include "netlist/nl_setup.h"
#define TTL_74153(name, cC0, cC1, cC2, cC3, cA, cB, cG) \
NET_REGISTER_DEV(TTL_74153, name) \
diff --git a/src/lib/netlist/devices/nld_74161.cpp b/src/lib/netlist/devices/nld_74161.cpp
index 5eb711fb456..7a3b54d6368 100644
--- a/src/lib/netlist/devices/nld_74161.cpp
+++ b/src/lib/netlist/devices/nld_74161.cpp
@@ -6,7 +6,7 @@
*/
#include "nld_74161.h"
-#include "../nl_base.h"
+#include "netlist/nl_base.h"
namespace netlist
{
@@ -85,7 +85,7 @@ namespace netlist
}
// FIXME: Timing
- static constexpr netlist_time delay[4] =
+ static constexpr const netlist_time delay[4] =
{
NLTIME_FROM_NS(40),
NLTIME_FROM_NS(40),
@@ -126,8 +126,8 @@ namespace netlist
m_RCO.push(tRippleCarryOut, NLTIME_FROM_NS(20)); //FIXME
}
- NETLIB_DEVICE_IMPL(74161)
- NETLIB_DEVICE_IMPL(74161_dip)
+ NETLIB_DEVICE_IMPL(74161, "TTL_74161", "+A,+B,+C,+D,+CLRQ,+LOADQ,+CLK,+ENABLEP,+ENABLET")
+ NETLIB_DEVICE_IMPL(74161_dip, "TTL_74161_DIP", "")
} //namespace devices
} // namespace netlist
diff --git a/src/lib/netlist/devices/nld_74161.h b/src/lib/netlist/devices/nld_74161.h
index 363bc3c7f0d..f3fa3eab043 100644
--- a/src/lib/netlist/devices/nld_74161.h
+++ b/src/lib/netlist/devices/nld_74161.h
@@ -25,7 +25,7 @@
#ifndef NLD_74161_H_
#define NLD_74161_H_
-#include "../nl_setup.h"
+#include "netlist/nl_setup.h"
#define TTL_74161(name, cA, cB, cC, cD, cCLRQ, cLOADQ, cCLK, cENABLEP, cENABLET) \
NET_REGISTER_DEV(TTL_74161, name) \
diff --git a/src/lib/netlist/devices/nld_74164.cpp b/src/lib/netlist/devices/nld_74164.cpp
index 5b2b1d8d080..b1eb30bb1ba 100644
--- a/src/lib/netlist/devices/nld_74164.cpp
+++ b/src/lib/netlist/devices/nld_74164.cpp
@@ -9,7 +9,7 @@
*/
#include "nld_74164.h"
-#include "../nl_base.h"
+#include "netlist/nl_base.h"
namespace netlist
{
@@ -97,8 +97,8 @@ namespace netlist
}
}
- NETLIB_DEVICE_IMPL(74164)
- NETLIB_DEVICE_IMPL(74164_dip)
+ NETLIB_DEVICE_IMPL(74164, "TTL_74164", "+A,+B,+CLRQ,+CLK")
+ NETLIB_DEVICE_IMPL(74164_dip, "TTL_74164_DIP", "")
} //namespace devices
} // namespace netlist
diff --git a/src/lib/netlist/devices/nld_74164.h b/src/lib/netlist/devices/nld_74164.h
index d7f29d386de..dd4e6bd1303 100644
--- a/src/lib/netlist/devices/nld_74164.h
+++ b/src/lib/netlist/devices/nld_74164.h
@@ -42,7 +42,7 @@
#ifndef NLD_74164_H_
#define NLD_74164_H_
-#include "../nl_setup.h"
+#include "netlist/nl_setup.h"
#define TTL_74164(name, cA, cB, cCLRQ, cCLK) \
NET_REGISTER_DEV(TTL_74164, name) \
diff --git a/src/lib/netlist/devices/nld_74165.cpp b/src/lib/netlist/devices/nld_74165.cpp
index 678c1b1782e..521bf4d63d2 100644
--- a/src/lib/netlist/devices/nld_74165.cpp
+++ b/src/lib/netlist/devices/nld_74165.cpp
@@ -6,7 +6,7 @@
*/
#include "nld_74165.h"
-#include "../nl_base.h"
+#include "netlist/nl_base.h"
namespace netlist
{
@@ -86,6 +86,7 @@ namespace netlist
}
else if (!m_CLK() || m_CLKINH())
{
+ // FIXME: qh is overwritten below?
qh = old_qh;
}
else if (!m_last_CLK)
@@ -101,8 +102,8 @@ namespace netlist
m_QH.push(qh, NLTIME_FROM_NS(20)); // FIXME: Timing
}
- NETLIB_DEVICE_IMPL(74165)
- NETLIB_DEVICE_IMPL(74165_dip)
+ NETLIB_DEVICE_IMPL(74165, "TTL_74165", "+CLK,+CLKINH,+SH_LDQ,+SER,+A,+B,+C,+D,+E,+F,+G,+H")
+ NETLIB_DEVICE_IMPL(74165_dip, "TTL_74165_DIP", "")
} //namespace devices
} // namespace netlist
diff --git a/src/lib/netlist/devices/nld_74165.h b/src/lib/netlist/devices/nld_74165.h
index e38ca7bab86..d282bab622b 100644
--- a/src/lib/netlist/devices/nld_74165.h
+++ b/src/lib/netlist/devices/nld_74165.h
@@ -27,7 +27,7 @@
#ifndef NLD_74165_H_
#define NLD_74165_H_
-#include "../nl_setup.h"
+#include "netlist/nl_setup.h"
#define TTL_74165(name, cCLK, cCLKINH, cSH_LDQ, cSER, cA, cB, cC, cD, cE, cF, cG, cH) \
NET_REGISTER_DEV(TTL_74165, name) \
diff --git a/src/lib/netlist/devices/nld_74166.cpp b/src/lib/netlist/devices/nld_74166.cpp
index 32f075c4da5..a5049014576 100644
--- a/src/lib/netlist/devices/nld_74166.cpp
+++ b/src/lib/netlist/devices/nld_74166.cpp
@@ -6,7 +6,7 @@
*/
#include "nld_74166.h"
-#include "../nl_base.h"
+#include "netlist/nl_base.h"
namespace netlist
{
@@ -121,8 +121,8 @@ namespace netlist
m_QH.push(qh, delay); //FIXME
}
- NETLIB_DEVICE_IMPL(74166)
- NETLIB_DEVICE_IMPL(74166_dip)
+ NETLIB_DEVICE_IMPL(74166, "TTL_74166", "+CLK,+CLKINH,+SH_LDQ,+SER,+A,+B,+C,+D,+E,+F,+G,+H,+CLRQ")
+ NETLIB_DEVICE_IMPL(74166_dip,"TTL_74166_DIP", "")
} //namespace devices
} // namespace netlist
diff --git a/src/lib/netlist/devices/nld_74166.h b/src/lib/netlist/devices/nld_74166.h
index b8a8a204374..80c86bb3422 100644
--- a/src/lib/netlist/devices/nld_74166.h
+++ b/src/lib/netlist/devices/nld_74166.h
@@ -27,7 +27,7 @@
#ifndef NLD_74166_H_
#define NLD_74166_H_
-#include "../nl_setup.h"
+#include "netlist/nl_setup.h"
#define TTL_74166(name, cCLK, cCLKINH, cSH_LDQ, cSER, cA, cB, cC, cD, cE, cF, cG, cH, cCLRQ) \
NET_REGISTER_DEV(TTL_74166, name) \
diff --git a/src/lib/netlist/devices/nld_74174.cpp b/src/lib/netlist/devices/nld_74174.cpp
index 5f4573942bd..83369075db6 100644
--- a/src/lib/netlist/devices/nld_74174.cpp
+++ b/src/lib/netlist/devices/nld_74174.cpp
@@ -6,7 +6,7 @@
*/
#include "nld_74174.h"
-#include "../nl_base.h"
+#include "netlist/nl_base.h"
namespace netlist
{
@@ -134,8 +134,8 @@ namespace netlist
//m_sub.do_reset();
}
- NETLIB_DEVICE_IMPL(74174)
- NETLIB_DEVICE_IMPL(74174_dip)
+ NETLIB_DEVICE_IMPL(74174, "TTL_74174", "+CLK,+D1,+D2,+D3,+D4,+D5,+D6,+CLRQ")
+ NETLIB_DEVICE_IMPL(74174_dip,"TTL_74174_DIP", "")
} //namespace devices
} // namespace netlist
diff --git a/src/lib/netlist/devices/nld_74174.h b/src/lib/netlist/devices/nld_74174.h
index 66824abb7aa..f1854801291 100644
--- a/src/lib/netlist/devices/nld_74174.h
+++ b/src/lib/netlist/devices/nld_74174.h
@@ -36,7 +36,7 @@
#ifndef NLD_74174_H_
#define NLD_74174_H_
-#include "../nl_setup.h"
+#include "netlist/nl_setup.h"
#define TTL_74174(name, cCLK, cD1, cD2, cD3, cD4, cD5, cD6, cCLRQ) \
NET_REGISTER_DEV(TTL_74174, name) \
diff --git a/src/lib/netlist/devices/nld_74175.cpp b/src/lib/netlist/devices/nld_74175.cpp
index 5955bcb389e..a15adb5c60f 100644
--- a/src/lib/netlist/devices/nld_74175.cpp
+++ b/src/lib/netlist/devices/nld_74175.cpp
@@ -6,7 +6,7 @@
*/
#include "nld_74175.h"
-#include "../nl_base.h"
+#include "netlist/nl_base.h"
namespace netlist
{
@@ -111,8 +111,8 @@ namespace netlist
m_data = 0xFF;
}
- NETLIB_DEVICE_IMPL(74175)
- NETLIB_DEVICE_IMPL(74175_dip)
+ NETLIB_DEVICE_IMPL(74175, "TTL_74175", "+CLK,+D1,+D2,+D3,+D4,+CLRQ")
+ NETLIB_DEVICE_IMPL(74175_dip,"TTL_74175_DIP", "")
} //namespace devices
} // namespace netlist
diff --git a/src/lib/netlist/devices/nld_74175.h b/src/lib/netlist/devices/nld_74175.h
index 27e01b55b05..4bc8c1175ba 100644
--- a/src/lib/netlist/devices/nld_74175.h
+++ b/src/lib/netlist/devices/nld_74175.h
@@ -36,7 +36,7 @@
#ifndef NLD_74175_H_
#define NLD_74175_H_
-#include "../nl_setup.h"
+#include "netlist/nl_setup.h"
#define TTL_74175(name, cCLK, cD1, cD2, cD3, cD4, cCLRQ) \
NET_REGISTER_DEV(TTL_74175, name) \
diff --git a/src/lib/netlist/devices/nld_74192.cpp b/src/lib/netlist/devices/nld_74192.cpp
index 1af605d4776..954fc351179 100644
--- a/src/lib/netlist/devices/nld_74192.cpp
+++ b/src/lib/netlist/devices/nld_74192.cpp
@@ -6,7 +6,7 @@
*/
#include "nld_74192.h"
-#include "../nl_base.h"
+#include "netlist/nl_base.h"
namespace netlist
{
@@ -110,7 +110,7 @@ namespace netlist
}
// FIXME: Timing
- static constexpr netlist_time delay[4] =
+ static constexpr const netlist_time delay[4] =
{
NLTIME_FROM_NS(40),
NLTIME_FROM_NS(40),
@@ -162,8 +162,8 @@ namespace netlist
m_CARRYQ.push(tCarry, NLTIME_FROM_NS(20)); //FIXME
}
- NETLIB_DEVICE_IMPL(74192)
- NETLIB_DEVICE_IMPL(74192_dip)
+ NETLIB_DEVICE_IMPL(74192, "TTL_74192", "+A,+B,+C,+D,+CLEAR,+LOADQ,+CU,+CD")
+ NETLIB_DEVICE_IMPL(74192_dip,"TTL_74192_DIP", "")
} //namespace devices
} // namespace netlist
diff --git a/src/lib/netlist/devices/nld_74192.h b/src/lib/netlist/devices/nld_74192.h
index 613d463cf47..9b0139070b8 100644
--- a/src/lib/netlist/devices/nld_74192.h
+++ b/src/lib/netlist/devices/nld_74192.h
@@ -29,7 +29,7 @@
#ifndef NLD_74192_H_
#define NLD_74192_H_
-#include "../nl_setup.h"
+#include "netlist/nl_setup.h"
#define TTL_74192(name, cA, cB, cC, cD, cCLEAR, cLOADQ, cCU, cCD) \
NET_REGISTER_DEV(TTL_74192, name) \
diff --git a/src/lib/netlist/devices/nld_74193.cpp b/src/lib/netlist/devices/nld_74193.cpp
index 55d18f3dc1b..16d7438d799 100644
--- a/src/lib/netlist/devices/nld_74193.cpp
+++ b/src/lib/netlist/devices/nld_74193.cpp
@@ -6,7 +6,7 @@
*/
#include "nld_74193.h"
-#include "../nl_base.h"
+#include "netlist/nl_base.h"
namespace netlist
{
@@ -87,7 +87,7 @@ namespace netlist
}
// FIXME: Timing
- static constexpr netlist_time delay[4] =
+ static constexpr const netlist_time delay[4] =
{
NLTIME_FROM_NS(40),
NLTIME_FROM_NS(40),
@@ -139,8 +139,8 @@ namespace netlist
m_CARRYQ.push(tCarry, NLTIME_FROM_NS(20)); //FIXME timing
}
- NETLIB_DEVICE_IMPL(74193)
- NETLIB_DEVICE_IMPL(74193_dip)
+ NETLIB_DEVICE_IMPL(74193, "TTL_74193", "+A,+B,+C,+D,+CLEAR,+LOADQ,+CU,+CD")
+ NETLIB_DEVICE_IMPL(74193_dip, "TTL_74193_DIP", "")
} //namespace devices
} // namespace netlist
diff --git a/src/lib/netlist/devices/nld_74193.h b/src/lib/netlist/devices/nld_74193.h
index bb14a301f38..a4c745d5386 100644
--- a/src/lib/netlist/devices/nld_74193.h
+++ b/src/lib/netlist/devices/nld_74193.h
@@ -26,7 +26,7 @@
#ifndef NLD_74193_H_
#define NLD_74193_H_
-#include "../nl_setup.h"
+#include "netlist/nl_setup.h"
#define TTL_74193(name, cA, cB, cC, cD, cCLEAR, cLOADQ, cCU, cCD) \
NET_REGISTER_DEV(TTL_74193, name) \
diff --git a/src/lib/netlist/devices/nld_74194.cpp b/src/lib/netlist/devices/nld_74194.cpp
index d531e792885..9876aa6b170 100644
--- a/src/lib/netlist/devices/nld_74194.cpp
+++ b/src/lib/netlist/devices/nld_74194.cpp
@@ -6,7 +6,7 @@
*/
#include "nld_74194.h"
-#include "../nl_base.h"
+#include "netlist/nl_base.h"
namespace netlist
{
@@ -116,8 +116,8 @@ namespace netlist
m_Q[i].push((q >> i) & 1, NLTIME_FROM_NS(26)); // FIXME: Timing
}
- NETLIB_DEVICE_IMPL(74194)
- NETLIB_DEVICE_IMPL(74194_dip)
+ NETLIB_DEVICE_IMPL(74194, "TTL_74194", "+CLK,+S0,+S1,+SRIN,+A,+B,+C,+D,+SLIN,+CLRQ")
+ NETLIB_DEVICE_IMPL(74194_dip, "TTL_74194_DIP", "")
} //namespace devices
} // namespace netlist
diff --git a/src/lib/netlist/devices/nld_74194.h b/src/lib/netlist/devices/nld_74194.h
index 5124a66bcc0..5a507982b81 100644
--- a/src/lib/netlist/devices/nld_74194.h
+++ b/src/lib/netlist/devices/nld_74194.h
@@ -26,7 +26,7 @@
#ifndef NLD_74194_H_
#define NLD_74194_H_
-#include "../nl_setup.h"
+#include "netlist/nl_setup.h"
#define TTL_74194(name, cCLK, cS0, cS1, cSRIN, cA, cB, cC, cD, cSLIN, cCLRQ) \
NET_REGISTER_DEV(TTL_74194, name) \
diff --git a/src/lib/netlist/devices/nld_74365.cpp b/src/lib/netlist/devices/nld_74365.cpp
index 10456ebbc21..753f16bfd22 100644
--- a/src/lib/netlist/devices/nld_74365.cpp
+++ b/src/lib/netlist/devices/nld_74365.cpp
@@ -6,12 +6,20 @@
*/
#include "nld_74365.h"
-#include "../nl_base.h"
+#include "netlist/nl_base.h"
namespace netlist
{
namespace devices
{
+
+ /* FIXME: This should be a single device, i.e. one tristate buffer only.
+ *
+ * FIXME: Implement tristate output.
+ *
+ */
+
+
NETLIB_OBJECT(74365)
{
NETLIB_CONSTRUCTOR(74365)
@@ -68,8 +76,8 @@ namespace netlist
}
}
- NETLIB_DEVICE_IMPL(74365)
- NETLIB_DEVICE_IMPL(74365_dip)
+ NETLIB_DEVICE_IMPL(74365, "TTL_74365", "+G1Q,+G2Q,+A1,+A2,+A3,+A4,+A5,+A6")
+ NETLIB_DEVICE_IMPL(74365_dip, "TTL_74365_DIP", "")
} //namespace devices
} // namespace netlist
diff --git a/src/lib/netlist/devices/nld_74365.h b/src/lib/netlist/devices/nld_74365.h
index ca0eacf6ba1..a50b535383f 100644
--- a/src/lib/netlist/devices/nld_74365.h
+++ b/src/lib/netlist/devices/nld_74365.h
@@ -25,7 +25,7 @@
#ifndef NLD_74365_H_
#define NLD_74365_H_
-#include "../nl_setup.h"
+#include "netlist/nl_setup.h"
#define TTL_74365(name, cG1Q, cG2Q, cA1, cA2, cA3, cA4, cA5, cA6) \
NET_REGISTER_DEV(TTL_74365, name) \
diff --git a/src/lib/netlist/devices/nld_7448.cpp b/src/lib/netlist/devices/nld_7448.cpp
index cc2e60f23b7..4500229a1c5 100644
--- a/src/lib/netlist/devices/nld_7448.cpp
+++ b/src/lib/netlist/devices/nld_7448.cpp
@@ -5,8 +5,10 @@
*
*/
-#include "nlid_truthtable.h"
#include "nld_7448.h"
+#include "nlid_truthtable.h"
+
+#include <array>
namespace netlist
{
@@ -133,9 +135,9 @@ namespace netlist
#else
-#define BITS7(b6,b5,b4,b3,b2,b1,b0) (b6<<6) | (b5<<5) | (b4<<4) | (b3<<3) | (b2<<2) | (b1<<1) | (b0<<0)
+#define BITS7(b6,b5,b4,b3,b2,b1,b0) ((b6)<<6) | ((b5)<<5) | ((b4)<<4) | ((b3)<<3) | ((b2)<<2) | ((b1)<<1) | ((b0)<<0)
- static constexpr uint8_t tab7448[16] =
+ static constexpr const std::array<uint8_t, 16> tab7448 =
{
BITS7( 1, 1, 1, 1, 1, 1, 0 ), /* 00 - not blanked ! */
BITS7( 0, 1, 1, 0, 0, 0, 0 ), /* 01 */
@@ -188,11 +190,13 @@ namespace netlist
NETLIB_RESET(7448)
{
m_state = 0;
- m_A.inactivate();
- m_B.inactivate();
- m_C.inactivate();
- m_D.inactivate();
- m_RBIQ.inactivate();
+#if 0
+ m_A.set_state(logic_t::STATE_INP_PASSIVE);
+ m_B.set_state(logic_t::STATE_INP_PASSIVE);
+ m_C.set_state(logic_t::STATE_INP_PASSIVE);
+ m_D.set_state(logic_t::STATE_INP_PASSIVE);
+ m_RBIQ.set_state(logic_t::STATE_INP_PASSIVE);
+#endif
}
NETLIB_FUNC_VOID(7448, update_outputs, (unsigned v))
@@ -211,8 +215,8 @@ namespace netlist
#endif
- NETLIB_DEVICE_IMPL(7448)
- NETLIB_DEVICE_IMPL(7448_dip)
+ NETLIB_DEVICE_IMPL(7448, "TTL_7448", "+A,+B,+C,+D,+LTQ,+BIQ,+RBIQ")
+ NETLIB_DEVICE_IMPL(7448_dip, "TTL_7448_DIP", "")
} //namespace devices
diff --git a/src/lib/netlist/devices/nld_7448.h b/src/lib/netlist/devices/nld_7448.h
index 89528707bc1..b9c03ae6360 100644
--- a/src/lib/netlist/devices/nld_7448.h
+++ b/src/lib/netlist/devices/nld_7448.h
@@ -24,7 +24,7 @@
#ifndef NLD_7448_H_
#define NLD_7448_H_
-#include "../nl_setup.h"
+#include "netlist/nl_setup.h"
#ifndef NL_AUTO_DEVICES
diff --git a/src/lib/netlist/devices/nld_7450.cpp b/src/lib/netlist/devices/nld_7450.cpp
index af9b9afada1..aacab46a021 100644
--- a/src/lib/netlist/devices/nld_7450.cpp
+++ b/src/lib/netlist/devices/nld_7450.cpp
@@ -6,7 +6,7 @@
*/
#include "nld_7450.h"
-#include "../nl_base.h"
+#include "netlist/nl_base.h"
namespace netlist
{
@@ -68,10 +68,10 @@ namespace netlist
m_B.activate();
m_C.activate();
m_D.activate();
- unsigned t1 = m_A() & m_B();
- unsigned t2 = m_C() & m_D();
+ auto t1 = m_A() & m_B();
+ auto t2 = m_C() & m_D();
- const netlist_time times[2] = { NLTIME_FROM_NS(22), NLTIME_FROM_NS(15) };
+ const netlist_time times[2] = { NLTIME_FROM_NS(15), NLTIME_FROM_NS(22) };
uint_fast8_t res = 0;
if (t1 ^ 1)
@@ -85,18 +85,20 @@ namespace netlist
m_A.inactivate();
m_B.inactivate();
}
- } else {
+ }
+ else
+ {
if (t2 ^ 1)
{
m_C.inactivate();
m_D.inactivate();
}
}
- m_Q.push(res, times[1 - res]);// ? 22000 : 15000);
+ m_Q.push(res, times[res]);// ? 22000 : 15000);
}
- NETLIB_DEVICE_IMPL(7450)
- NETLIB_DEVICE_IMPL(7450_dip)
+ NETLIB_DEVICE_IMPL(7450, "TTL_7450_ANDORINVERT", "+A,+B,+C,+D")
+ NETLIB_DEVICE_IMPL(7450_dip, "TTL_7450_DIP", "")
} //namespace devices
} // namespace netlist
diff --git a/src/lib/netlist/devices/nld_7450.h b/src/lib/netlist/devices/nld_7450.h
index 652516758ad..6718afd8f9e 100644
--- a/src/lib/netlist/devices/nld_7450.h
+++ b/src/lib/netlist/devices/nld_7450.h
@@ -24,7 +24,7 @@
#ifndef NLD_7450_H_
#define NLD_7450_H_
-#include "../nl_setup.h"
+#include "netlist/nl_setup.h"
#define TTL_7450_ANDORINVERT(name, cI1, cI2, cI3, cI4) \
NET_REGISTER_DEV(TTL_7450_ANDORINVERT, name) \
diff --git a/src/lib/netlist/devices/nld_7473.cpp b/src/lib/netlist/devices/nld_7473.cpp
index d9efb9fb710..c8abd829264 100644
--- a/src/lib/netlist/devices/nld_7473.cpp
+++ b/src/lib/netlist/devices/nld_7473.cpp
@@ -6,7 +6,7 @@
*/
#include "nld_7473.h"
-#include "../nl_base.h"
+#include "netlist/nl_base.h"
namespace netlist
{
@@ -142,10 +142,10 @@ namespace netlist
m_QQ.push(m_q ^ 1, NLTIME_FROM_NS(20)); // FIXME: timing
}
- NETLIB_DEVICE_IMPL(7473)
- NETLIB_DEVICE_IMPL(7473A)
- NETLIB_DEVICE_IMPL(7473_dip)
- NETLIB_DEVICE_IMPL(7473A_dip)
+ NETLIB_DEVICE_IMPL(7473, "TTL_7473", "+CLK,+J,+K,+CLRQ")
+ NETLIB_DEVICE_IMPL(7473A, "TTL_7473A", "+CLK,+J,+K,+CLRQ")
+ NETLIB_DEVICE_IMPL(7473_dip, "TTL_7473_DIP", "")
+ NETLIB_DEVICE_IMPL(7473A_dip, "TTL_7473A_DIP", "")
} //namespace devices
} // namespace netlist
diff --git a/src/lib/netlist/devices/nld_7473.h b/src/lib/netlist/devices/nld_7473.h
index 5313d18570c..3fbaaf4efbc 100644
--- a/src/lib/netlist/devices/nld_7473.h
+++ b/src/lib/netlist/devices/nld_7473.h
@@ -60,7 +60,7 @@
#ifndef NLD_7473_H_
#define NLD_7473_H_
-#include "../nl_setup.h"
+#include "netlist/nl_setup.h"
#define TTL_7473(name, cCLK, cJ, cK, cCLRQ) \
NET_REGISTER_DEV(TTL_7473, name) \
diff --git a/src/lib/netlist/devices/nld_7474.cpp b/src/lib/netlist/devices/nld_7474.cpp
index 9d020663f46..740af6ad3c1 100644
--- a/src/lib/netlist/devices/nld_7474.cpp
+++ b/src/lib/netlist/devices/nld_7474.cpp
@@ -1,3 +1,4 @@
+
// license:GPL-2.0+
// copyright-holders:Couriersud
/*
@@ -6,60 +7,47 @@
*/
#include "nld_7474.h"
-#include "../nl_base.h"
+#include "netlist/nl_base.h"
namespace netlist
{
namespace devices
{
- NETLIB_OBJECT(7474sub)
+
+ NETLIB_OBJECT(7474)
{
- NETLIB_CONSTRUCTOR(7474sub)
- , m_CLK(*this, "CLK")
+ NETLIB_CONSTRUCTOR(7474)
+ , m_D(*this, "D")
+ , m_CLRQ(*this, "CLRQ")
+ , m_PREQ(*this, "PREQ")
+ , m_CLK(*this, "CLK", NETLIB_DELEGATE(7474, clk))
, m_Q(*this, "Q")
, m_QQ(*this, "QQ")
, m_nextD(*this, "m_nextD", 0)
{
}
+ private:
NETLIB_RESETI();
NETLIB_UPDATEI();
+ NETLIB_HANDLERI(clk);
- public:
+ logic_input_t m_D;
+ logic_input_t m_CLRQ;
+ logic_input_t m_PREQ;
logic_input_t m_CLK;
logic_output_t m_Q;
logic_output_t m_QQ;
- state_var<unsigned> m_nextD;
-
- inline void newstate(const netlist_sig_t stateQ, const netlist_sig_t stateQQ);
- private:
-
- };
+ state_var<netlist_sig_t> m_nextD;
- NETLIB_OBJECT(7474)
- {
- NETLIB_CONSTRUCTOR(7474)
- , sub(*this, "sub")
- , m_D(*this, "D")
- , m_CLRQ(*this, "CLRQ")
- , m_PREQ(*this, "PREQ")
+ void newstate(const netlist_sig_t stateQ, const netlist_sig_t stateQQ)
{
- register_subalias("CLK", sub.m_CLK);
-
- register_subalias("Q", sub.m_Q);
- register_subalias("QQ", sub.m_QQ);
+ // 0: High-to-low 40 ns, 1: Low-to-high 25 ns
+ static constexpr const netlist_time delay[2] = { NLTIME_FROM_NS(40), NLTIME_FROM_NS(25) };
+ m_Q.push(stateQ, delay[stateQ]);
+ m_QQ.push(stateQQ, delay[stateQQ]);
}
-
- NETLIB_RESETI();
- NETLIB_UPDATEI();
-
- public:
- NETLIB_SUB(7474sub) sub;
-
- logic_input_t m_D;
- logic_input_t m_CLRQ;
- logic_input_t m_PREQ;
};
NETLIB_OBJECT(7474_dip)
@@ -68,20 +56,20 @@ namespace netlist
, m_1(*this, "1")
, m_2(*this, "2")
{
- register_subalias("1", m_1.m_CLRQ);
- register_subalias("2", m_1.m_D);
- register_subalias("3", m_1.sub.m_CLK);
- register_subalias("4", m_1.m_PREQ);
- register_subalias("5", m_1.sub.m_Q);
- register_subalias("6", m_1.sub.m_QQ);
+ register_subalias("1", "1.CLRQ");
+ register_subalias("2", "1.D");
+ register_subalias("3", "1.CLK");
+ register_subalias("4", "1.PREQ");
+ register_subalias("5", "1.Q");
+ register_subalias("6", "1.QQ");
// register_subalias("7", ); ==> GND
- register_subalias("8", m_2.sub.m_QQ);
- register_subalias("9", m_2.sub.m_Q);
- register_subalias("10", m_2.m_PREQ);
- register_subalias("11", m_2.sub.m_CLK);
- register_subalias("12", m_2.m_D);
- register_subalias("13", m_2.m_CLRQ);
+ register_subalias("8", "2.QQ");
+ register_subalias("9", "2.Q");
+ register_subalias("10", "2.PREQ");
+ register_subalias("11", "2.CLK");
+ register_subalias("12", "2.D");
+ register_subalias("13", "2.CLRQ");
// register_subalias("14", ); ==> VCC
}
NETLIB_UPDATEI();
@@ -92,77 +80,47 @@ namespace netlist
NETLIB_SUB(7474) m_2;
};
- inline void NETLIB_NAME(7474sub)::newstate(const netlist_sig_t stateQ, const netlist_sig_t stateQQ)
+ NETLIB_HANDLER(7474, clk)
{
- // 0: High-to-low 40 ns, 1: Low-to-high 25 ns
- const netlist_time delay[2] = { NLTIME_FROM_NS(40), NLTIME_FROM_NS(25) };
- m_Q.push(stateQ, delay[stateQ]);
- m_QQ.push(stateQQ, delay[stateQQ]);
- }
-
- NETLIB_UPDATE(7474sub)
- {
- //if (INP_LH(m_CLK))
- {
- newstate(m_nextD, !m_nextD);
- m_CLK.inactivate();
- }
+ newstate(m_nextD, !m_nextD);
+ m_CLK.inactivate();
}
NETLIB_UPDATE(7474)
{
- if (m_PREQ() && m_CLRQ())
+ const auto preq(m_PREQ());
+ const auto clrq(m_CLRQ());
+ if (preq & clrq)
{
m_D.activate();
- sub.m_nextD = m_D();
- sub.m_CLK.activate_lh();
- }
- else if (!m_PREQ())
- {
- sub.newstate(1, 0);
- sub.m_CLK.inactivate();
- m_D.inactivate();
- }
- else if (!m_CLRQ())
- {
- sub.newstate(0, 1);
- sub.m_CLK.inactivate();
- m_D.inactivate();
+ m_nextD = m_D();
+ m_CLK.activate_lh();
}
else
{
- sub.newstate(1, 1);
- sub.m_CLK.inactivate();
+ newstate(preq ^ 1, clrq ^ 1);
+ m_CLK.inactivate();
m_D.inactivate();
}
}
NETLIB_RESET(7474)
{
- sub.do_reset();
- }
-
- NETLIB_RESET(7474sub)
- {
m_CLK.set_state(logic_t::STATE_INP_LH);
-
+ m_D.set_state(logic_t::STATE_INP_ACTIVE);
m_nextD = 0;
}
NETLIB_RESET(7474_dip)
{
- // m_1.do_reset();
- //m_2.do_reset();
}
NETLIB_UPDATE(7474_dip)
{
- //m_1.update_dev();
- //m_2.update_dev();
}
- NETLIB_DEVICE_IMPL(7474)
- NETLIB_DEVICE_IMPL(7474_dip)
+ NETLIB_DEVICE_IMPL(7474, "TTL_7474", "+CLK,+D,+CLRQ,+PREQ")
+ NETLIB_DEVICE_IMPL(7474_dip, "TTL_7474_DIP", "")
} //namespace devices
} // namespace netlist
diff --git a/src/lib/netlist/devices/nld_7474.h b/src/lib/netlist/devices/nld_7474.h
index aa48e240387..48fd4f3d842 100644
--- a/src/lib/netlist/devices/nld_7474.h
+++ b/src/lib/netlist/devices/nld_7474.h
@@ -42,7 +42,7 @@
#ifndef NLD_7474_H_
#define NLD_7474_H_
-#include "../nl_setup.h"
+#include "netlist/nl_setup.h"
#define TTL_7474(name, cCLK, cD, cCLRQ, cPREQ) \
NET_REGISTER_DEV(TTL_7474, name) \
diff --git a/src/lib/netlist/devices/nld_7475.cpp b/src/lib/netlist/devices/nld_7475.cpp
index b2d28048513..63fd355d406 100644
--- a/src/lib/netlist/devices/nld_7475.cpp
+++ b/src/lib/netlist/devices/nld_7475.cpp
@@ -7,7 +7,7 @@
*/
#include "nld_7475.h"
-#include "../nl_base.h"
+#include "netlist/nl_base.h"
namespace netlist
{
@@ -101,7 +101,7 @@ namespace netlist
{
unsigned start_q = m_last_Q;
- NETLIB_PARENT_UPDATE(7477);
+ NETLIB_NAME(7477)::update();
for (std::size_t i=0; i<4; i++)
{
@@ -148,10 +148,10 @@ namespace netlist
}
- NETLIB_DEVICE_IMPL(7475)
- NETLIB_DEVICE_IMPL(7475_dip)
- NETLIB_DEVICE_IMPL(7477)
- NETLIB_DEVICE_IMPL(7477_dip)
+ NETLIB_DEVICE_IMPL(7475, "TTL_7475", "")
+ NETLIB_DEVICE_IMPL(7475_dip, "TTL_7475_DIP", "")
+ NETLIB_DEVICE_IMPL(7477, "TTL_7477", "")
+ NETLIB_DEVICE_IMPL(7477_dip, "TTL_7477_DIP", "")
} //namespace devices
} // namespace netlist
diff --git a/src/lib/netlist/devices/nld_7475.h b/src/lib/netlist/devices/nld_7475.h
index 51d09e75a66..b16fabe61b6 100644
--- a/src/lib/netlist/devices/nld_7475.h
+++ b/src/lib/netlist/devices/nld_7475.h
@@ -35,7 +35,7 @@
#ifndef NLD_7475_H_
#define NLD_7475_H_
-#include "../nl_setup.h"
+#include "netlist/nl_setup.h"
#define PARAMS_7475_7477(name, cC1C2, cC3C4, cD1, cD2, cD3, cD4) \
NET_CONNECT(name, C1C2, cC1C2) \
diff --git a/src/lib/netlist/devices/nld_7483.cpp b/src/lib/netlist/devices/nld_7483.cpp
index 72c86c003d5..5f820162209 100644
--- a/src/lib/netlist/devices/nld_7483.cpp
+++ b/src/lib/netlist/devices/nld_7483.cpp
@@ -6,7 +6,7 @@
*/
#include "nld_7483.h"
-#include "../nl_base.h"
+#include "netlist/nl_base.h"
namespace netlist
{
@@ -16,14 +16,16 @@ namespace netlist
{
NETLIB_CONSTRUCTOR(7483)
, m_C0(*this, "C0")
- , m_A1(*this, "A1")
- , m_A2(*this, "A2")
- , m_A3(*this, "A3")
- , m_A4(*this, "A4")
- , m_B1(*this, "B1")
- , m_B2(*this, "B2")
- , m_B3(*this, "B3")
- , m_B4(*this, "B4")
+ , m_A1(*this, "A1", NETLIB_DELEGATE(7483, upd_a))
+ , m_A2(*this, "A2", NETLIB_DELEGATE(7483, upd_a))
+ , m_A3(*this, "A3", NETLIB_DELEGATE(7483, upd_a))
+ , m_A4(*this, "A4", NETLIB_DELEGATE(7483, upd_a))
+ , m_B1(*this, "B1", NETLIB_DELEGATE(7483, upd_b))
+ , m_B2(*this, "B2", NETLIB_DELEGATE(7483, upd_b))
+ , m_B3(*this, "B3", NETLIB_DELEGATE(7483, upd_b))
+ , m_B4(*this, "B4", NETLIB_DELEGATE(7483, upd_b))
+ , m_a(*this, "m_a", 0)
+ , m_b(*this, "m_b", 0)
, m_lastr(*this, "m_lastr", 0)
, m_S1(*this, "S1")
, m_S2(*this, "S2")
@@ -34,6 +36,8 @@ namespace netlist
}
NETLIB_RESETI();
NETLIB_UPDATEI();
+ NETLIB_HANDLERI(upd_a);
+ NETLIB_HANDLERI(upd_b);
protected:
logic_input_t m_C0;
@@ -46,7 +50,9 @@ namespace netlist
logic_input_t m_B3;
logic_input_t m_B4;
- state_var<unsigned> m_lastr;
+ state_var_u8 m_a;
+ state_var_u8 m_b;
+ state_var_u8 m_lastr;
logic_output_t m_S1;
logic_output_t m_S2;
@@ -87,12 +93,21 @@ namespace netlist
m_lastr = 0;
}
- NETLIB_UPDATE(7483)
+ NETLIB_HANDLER(7483, upd_a)
{
- netlist_sig_t a = (m_A1() << 0) | (m_A2() << 1) | (m_A3() << 2) | (m_A4() << 3);
- netlist_sig_t b = (m_B1() << 0) | (m_B2() << 1) | (m_B3() << 2) | (m_B4() << 3);
+ m_a = static_cast<uint8_t>((m_A1() << 0) | (m_A2() << 1) | (m_A3() << 2) | (m_A4() << 3));
+ NETLIB_NAME(7483)::update();
+ }
- unsigned r = a + b + m_C0();
+ NETLIB_HANDLER(7483, upd_b)
+ {
+ m_b = static_cast<uint8_t>((m_B1() << 0) | (m_B2() << 1) | (m_B3() << 2) | (m_B4() << 3));
+ NETLIB_NAME(7483)::update();
+ }
+
+ NETLIB_UPDATE(7483)
+ {
+ auto r = static_cast<uint8_t>(m_a + m_b + m_C0());
if (r != m_lastr)
{
@@ -105,8 +120,8 @@ namespace netlist
}
}
- NETLIB_DEVICE_IMPL(7483)
- NETLIB_DEVICE_IMPL(7483_dip)
+ NETLIB_DEVICE_IMPL(7483, "TTL_7483", "+A1,+A2,+A3,+A4,+B1,+B2,+B3,+B4,+C0")
+ NETLIB_DEVICE_IMPL(7483_dip, "TTL_7483_DIP", "")
} //namespace devices
} // namespace netlist
diff --git a/src/lib/netlist/devices/nld_7483.h b/src/lib/netlist/devices/nld_7483.h
index 24952bf0501..ba82d5bbb9c 100644
--- a/src/lib/netlist/devices/nld_7483.h
+++ b/src/lib/netlist/devices/nld_7483.h
@@ -27,7 +27,7 @@
#ifndef NLD_7483_H_
#define NLD_7483_H_
-#include "../nl_setup.h"
+#include "netlist/nl_setup.h"
#define TTL_7483(name, cA1, cA2, cA3, cA4, cB1, cB2, cB3, cB4, cCI) \
NET_REGISTER_DEV(TTL_7483, name) \
diff --git a/src/lib/netlist/devices/nld_7485.cpp b/src/lib/netlist/devices/nld_7485.cpp
index 320cf762f26..cadb73000ff 100644
--- a/src/lib/netlist/devices/nld_7485.cpp
+++ b/src/lib/netlist/devices/nld_7485.cpp
@@ -6,7 +6,7 @@
*/
#include "nld_7485.h"
-#include "../nl_base.h"
+#include "netlist/nl_base.h"
namespace netlist
{
@@ -101,8 +101,8 @@ namespace netlist
update_outputs(1, 1, 0);
}
- NETLIB_DEVICE_IMPL(7485)
- NETLIB_DEVICE_IMPL(7485_dip)
+ NETLIB_DEVICE_IMPL(7485, "TTL_7485", "+A0,+A1,+A2,+A3,+B0,+B1,+B2,+B3,+LTIN,+EQIN,+GTIN")
+ NETLIB_DEVICE_IMPL(7485_dip, "TTL_7485_DIP", "")
} //namespace devices
} // namespace netlist
diff --git a/src/lib/netlist/devices/nld_7485.h b/src/lib/netlist/devices/nld_7485.h
index 61b87c37ba3..7890f4dbd2a 100644
--- a/src/lib/netlist/devices/nld_7485.h
+++ b/src/lib/netlist/devices/nld_7485.h
@@ -23,7 +23,7 @@
#ifndef NLD_7485_H_
#define NLD_7485_H_
-#include "../nl_setup.h"
+#include "netlist/nl_setup.h"
#define TTL_7485(name, cA0, cA1, cA2, cA3, cB0, cB1, cB2, cB3, cLTIN, cEQIN, cGTIN) \
NET_REGISTER_DEV(TTL_7485, name) \
diff --git a/src/lib/netlist/devices/nld_7490.cpp b/src/lib/netlist/devices/nld_7490.cpp
index 13e69c6aa31..acbe0fa4d7a 100644
--- a/src/lib/netlist/devices/nld_7490.cpp
+++ b/src/lib/netlist/devices/nld_7490.cpp
@@ -6,7 +6,7 @@
*/
#include "nld_7490.h"
-#include "../nl_base.h"
+#include "netlist/nl_base.h"
namespace netlist
{
@@ -28,10 +28,10 @@ namespace netlist
{
}
+ private:
NETLIB_UPDATEI();
NETLIB_RESETI();
- protected:
void update_outputs();
logic_input_t m_A;
@@ -52,22 +52,22 @@ namespace netlist
{
NETLIB_CONSTRUCTOR_DERIVED(7490_dip, 7490)
{
- register_subalias("1", m_B);
- register_subalias("2", m_R1);
- register_subalias("3", m_R2);
+ register_subalias("1", "B");
+ register_subalias("2", "R1");
+ register_subalias("3", "R2");
// register_subalias("4", ); --> NC
// register_subalias("5", ); --> VCC
- register_subalias("6", m_R91);
- register_subalias("7", m_R92);
+ register_subalias("6", "R91");
+ register_subalias("7", "R92");
- register_subalias("8", m_Q[2]);
- register_subalias("9", m_Q[1]);
+ register_subalias("8", "QC");
+ register_subalias("9", "QB");
// register_subalias("10", ); --> GND
- register_subalias("11", m_Q[3]);
- register_subalias("12", m_Q[0]);
+ register_subalias("11", "QD");
+ register_subalias("12", "QA");
// register_subalias("13", ); --> NC
- register_subalias("14", m_A);
+ register_subalias("14", "A");
}
};
@@ -78,12 +78,13 @@ namespace netlist
m_last_B = 0;
}
- static C14CONSTEXPR const netlist_time delay[4] =
+ static constexpr const netlist_time delay[4] =
{
NLTIME_FROM_NS(18),
NLTIME_FROM_NS(36) - NLTIME_FROM_NS(18),
NLTIME_FROM_NS(54) - NLTIME_FROM_NS(18),
- NLTIME_FROM_NS(72) - NLTIME_FROM_NS(18)};
+ NLTIME_FROM_NS(72) - NLTIME_FROM_NS(18)
+ };
NETLIB_UPDATE(7490)
{
@@ -119,14 +120,14 @@ namespace netlist
m_last_B = new_B;
}
- NETLIB_FUNC_VOID(7490, update_outputs, (void))
+ NETLIB_FUNC_VOID(7490, update_outputs, ())
{
for (std::size_t i=0; i<4; i++)
m_Q[i].push((m_cnt >> i) & 1, delay[i]);
}
- NETLIB_DEVICE_IMPL(7490)
- NETLIB_DEVICE_IMPL(7490_dip)
+ NETLIB_DEVICE_IMPL(7490, "TTL_7490", "+A,+B,+R1,+R2,+R91,+R92")
+ NETLIB_DEVICE_IMPL(7490_dip, "TTL_7490_DIP", "")
} //namespace devices
} // namespace netlist
diff --git a/src/lib/netlist/devices/nld_7490.h b/src/lib/netlist/devices/nld_7490.h
index 5ff18543b03..e2fa5094911 100644
--- a/src/lib/netlist/devices/nld_7490.h
+++ b/src/lib/netlist/devices/nld_7490.h
@@ -55,7 +55,7 @@
#ifndef NLD_7490_H_
#define NLD_7490_H_
-#include "../nl_setup.h"
+#include "netlist/nl_setup.h"
#define TTL_7490(name, cA, cB, cR1, cR2, cR91, cR92) \
NET_REGISTER_DEV(TTL_7490, name) \
diff --git a/src/lib/netlist/devices/nld_7493.cpp b/src/lib/netlist/devices/nld_7493.cpp
index f3c68f7a5c2..f26e1c237d5 100644
--- a/src/lib/netlist/devices/nld_7493.cpp
+++ b/src/lib/netlist/devices/nld_7493.cpp
@@ -6,23 +6,22 @@
*/
#include "nld_7493.h"
-#include "../nl_base.h"
+#include "netlist/nl_base.h"
namespace netlist
{
namespace devices
{
- static constexpr netlist_time out_delay = NLTIME_FROM_NS(18);
- static constexpr netlist_time out_delay2 = NLTIME_FROM_NS(36);
- static constexpr netlist_time out_delay3 = NLTIME_FROM_NS(54);
+ static constexpr const netlist_time out_delay = NLTIME_FROM_NS(18);
+ static constexpr const netlist_time out_delay2 = NLTIME_FROM_NS(36);
+ static constexpr const netlist_time out_delay3 = NLTIME_FROM_NS(54);
NETLIB_OBJECT(7493)
{
NETLIB_CONSTRUCTOR(7493)
, m_R1(*this, "R1")
, m_R2(*this, "R2")
- , m_reset(*this, "_m_reset", 0)
, m_a(*this, "_m_a", 0)
, m_bcd(*this, "_m_b", 0)
, m_CLKA(*this, "CLKA", NETLIB_DELEGATE(7493, updA))
@@ -35,35 +34,51 @@ namespace netlist
}
private:
- NETLIB_RESETI();
- NETLIB_UPDATEI();
+ NETLIB_RESETI()
+ {
+ m_a = m_bcd = 0;
+ m_CLKA.set_state(logic_t::STATE_INP_HL);
+ m_CLKB.set_state(logic_t::STATE_INP_HL);
+ }
- NETLIB_HANDLERI(updA)
+ NETLIB_UPDATEI()
{
- if (m_reset)
+ if (!(m_R1() & m_R2()))
+ {
+ m_CLKA.activate_hl();
+ m_CLKB.activate_hl();
+ }
+ else
{
- m_a ^= 1;
- m_QA.push(m_a, out_delay);
+ m_CLKA.inactivate();
+ m_CLKB.inactivate();
+ m_QA.push(0, NLTIME_FROM_NS(40));
+ m_QB.push(0, NLTIME_FROM_NS(40));
+ m_QC.push(0, NLTIME_FROM_NS(40));
+ m_QD.push(0, NLTIME_FROM_NS(40));
+ m_a = m_bcd = 0;
}
}
+ NETLIB_HANDLERI(updA)
+ {
+ m_a ^= 1;
+ m_QA.push(m_a, out_delay);
+ }
+
NETLIB_HANDLERI(updB)
{
- if (m_reset)
- {
- ++m_bcd &= static_cast<std::uint8_t>(0x07);
- m_QD.push((m_bcd >> 2) & 1, out_delay3);
- m_QC.push((m_bcd >> 1) & 1, out_delay2);
- m_QB.push(m_bcd & 1, out_delay);
- }
+ auto cnt = (++m_bcd &= 0x07);
+ m_QD.push((cnt >> 2) & 1, out_delay3);
+ m_QC.push((cnt >> 1) & 1, out_delay2);
+ m_QB.push(cnt & 1, out_delay);
}
logic_input_t m_R1;
logic_input_t m_R2;
- state_var_sig m_reset;
state_var_sig m_a;
- state_var_sig m_bcd;
+ state_var_u8 m_bcd;
logic_input_t m_CLKA;
logic_input_t m_CLKB;
@@ -97,37 +112,9 @@ namespace netlist
}
};
- NETLIB_RESET(7493)
- {
- m_reset = 1;
- m_a = m_bcd = 0;
- m_CLKA.set_state(logic_t::STATE_INP_HL);
- m_CLKB.set_state(logic_t::STATE_INP_HL);
- }
-
- NETLIB_UPDATE(7493)
- {
- m_reset = (m_R1() & m_R2()) ^ 1;
-
- if (m_reset)
- {
- m_CLKA.activate_hl();
- m_CLKB.activate_hl();
- }
- else
- {
- m_CLKA.inactivate();
- m_CLKB.inactivate();
- m_QA.push_force(0, NLTIME_FROM_NS(40));
- m_QB.push_force(0, NLTIME_FROM_NS(40));
- m_QC.push_force(0, NLTIME_FROM_NS(40));
- m_QD.push_force(0, NLTIME_FROM_NS(40));
- m_a = m_bcd = 0;
- }
- }
- NETLIB_DEVICE_IMPL(7493)
- NETLIB_DEVICE_IMPL(7493_dip)
+ NETLIB_DEVICE_IMPL(7493, "TTL_7493", "+CLKA,+CLKB,+R1,+R2")
+ NETLIB_DEVICE_IMPL(7493_dip, "TTL_7493_DIP", "")
} //namespace devices
} // namespace netlist
diff --git a/src/lib/netlist/devices/nld_7493.h b/src/lib/netlist/devices/nld_7493.h
index ce9566aa28f..68ad90885ec 100644
--- a/src/lib/netlist/devices/nld_7493.h
+++ b/src/lib/netlist/devices/nld_7493.h
@@ -57,7 +57,7 @@
#ifndef NLD_7493_H_
#define NLD_7493_H_
-#include "../nl_setup.h"
+#include "netlist/nl_setup.h"
#define TTL_7493(name, cCLKA, cCLKB, cR1, cR2) \
NET_REGISTER_DEV(TTL_7493, name) \
diff --git a/src/lib/netlist/devices/nld_7497.cpp b/src/lib/netlist/devices/nld_7497.cpp
new file mode 100644
index 00000000000..1432884b8dd
--- /dev/null
+++ b/src/lib/netlist/devices/nld_7497.cpp
@@ -0,0 +1,174 @@
+// license:GPL-2.0+
+// copyright-holders:Sergey Svishchev
+/*
+ * nld_7497.cpp
+ *
+ * To do:
+ *
+ * - STRB and EN
+ * - Timing
+ */
+
+#include "nld_7497.h"
+#include "netlist/nl_base.h"
+
+namespace netlist
+{
+ namespace devices
+ {
+
+ static constexpr const netlist_time out_delay_CLK_Y[2] = { NLTIME_FROM_NS(20), NLTIME_FROM_NS(26) }; // tPHL, tPLH
+ static constexpr const netlist_time out_delay_CLK_Z[2] = { NLTIME_FROM_NS(17), NLTIME_FROM_NS(12) };
+
+ NETLIB_OBJECT(7497)
+ {
+ NETLIB_CONSTRUCTOR(7497)
+ , m_B(*this, {{"B5", "B4", "B3", "B2", "B1", "B0"}})
+ , m_CLK(*this, "CLK", NETLIB_DELEGATE(7497, clk_strb))
+ , m_STRBQ(*this, "STRBQ", NETLIB_DELEGATE(7497, clk_strb))
+ , m_ENQ(*this, "ENQ")
+ , m_UNITYQ(*this, "UNITYQ", NETLIB_DELEGATE(7497, unity))
+ , m_CLR(*this, "CLR", NETLIB_DELEGATE(7497, clr))
+ , m_Y(*this, "Y")
+ , m_ZQ(*this, "ZQ")
+ , m_ENOUTQ(*this, "ENOUTQ")
+ , m_cnt(*this, "_m_cnt", 0)
+ , m_rate(*this, "_m_rate", 0)
+ , m_state(*this, "_m_state", 0)
+ , m_lastclock(*this, "_m_lastclock", 0)
+ {
+ }
+
+ private:
+ NETLIB_RESETI();
+ NETLIB_UPDATEI();
+
+ NETLIB_HANDLERI(noop) { }
+ NETLIB_HANDLERI(unity);
+ NETLIB_HANDLERI(clr);
+ NETLIB_HANDLERI(clk_strb);
+
+ protected:
+ object_array_t<logic_input_t, 6> m_B;
+ logic_input_t m_CLK;
+ logic_input_t m_STRBQ;
+ logic_input_t m_ENQ;
+ logic_input_t m_UNITYQ;
+ logic_input_t m_CLR;
+
+ logic_output_t m_Y;
+ logic_output_t m_ZQ;
+ logic_output_t m_ENOUTQ;
+
+ state_var_u8 m_cnt;
+ state_var_u8 m_rate;
+ state_var_sig m_state;
+ state_var_sig m_lastclock;
+
+ void newstate(const netlist_sig_t state)
+ {
+ m_state = state;
+ m_ZQ.push(state, out_delay_CLK_Z[state]);
+ //netlist_sig_t y = (state ^ 1) | (m_UNITY() ^ 1); // OR with negated inputs == NAND
+ netlist_sig_t y = (state & m_UNITYQ()) ^ 1; // OR with negated inputs == NAND
+ m_Y.push(y, out_delay_CLK_Y[y]);
+ }
+
+ uint8_t rate()
+ {
+ uint8_t a = 0;
+
+ for (std::size_t i = 0; i < 6; i++)
+ a |= (m_B[i]() << i);
+
+ return a;
+ }
+ };
+
+ NETLIB_RESET(7497)
+ {
+ m_cnt = 0;
+ m_rate = 0;
+ m_lastclock = 0;
+ }
+
+ NETLIB_UPDATE(7497)
+ {
+ m_rate = rate();
+ clk_strb();
+ }
+
+ NETLIB_HANDLER(7497, unity)
+ {
+ newstate (m_state);
+ }
+
+ NETLIB_HANDLER(7497, clr)
+ {
+ m_cnt = 0;
+ clk_strb();
+ }
+
+ NETLIB_HANDLER(7497, clk_strb)
+ {
+ netlist_sig_t clk = m_CLK();
+
+ if (!m_lastclock && clk && !m_ENQ() && !m_CLR())
+ {
+ m_cnt++;
+ m_cnt &= 63;
+ }
+ m_lastclock = clk;
+
+ const netlist_sig_t clk_strb = (clk ^ 1) & (m_STRBQ() ^ 1);
+
+ const netlist_sig_t cntQ = m_cnt;
+
+ // NOR GATE
+ netlist_sig_t p1 = ((cntQ & 63) == 31 && (m_rate & 32)) ||
+ ((cntQ & 31) == 15 && (m_rate & 16)) ||
+ ((cntQ & 15) == 7 && (m_rate & 8)) ||
+ ((cntQ & 7) == 3 && (m_rate & 4)) ||
+ ((cntQ & 3) == 1 && (m_rate & 2)) ||
+ ((cntQ & 1) == 0 && (m_rate & 1));
+
+ p1 = (p1 & clk_strb) ^ 1;
+
+ newstate(p1);
+
+ // NAND gate
+ if ((m_cnt == 63) && !m_ENQ())
+ m_ENOUTQ.push(0, out_delay_CLK_Y[0]); // XXX timing
+ else
+ m_ENOUTQ.push(1, out_delay_CLK_Y[1]);
+
+ }
+
+ NETLIB_OBJECT_DERIVED(7497_dip, 7497)
+ {
+ NETLIB_CONSTRUCTOR_DERIVED(7497_dip, 7497)
+ {
+ register_subalias("1", m_B[4]); // B0
+ register_subalias("2", m_B[1]); // B4
+ register_subalias("3", m_B[0]); // B5
+ register_subalias("4", m_B[5]); // B0
+ register_subalias("5", m_ZQ);
+ register_subalias("6", m_Y);
+ register_subalias("7", m_ENOUTQ);
+
+ register_subalias("9", m_CLK);
+ register_subalias("10", m_STRBQ);
+ register_subalias("11", m_UNITYQ);
+ register_subalias("12", m_ENQ);
+ register_subalias("13", m_CLR);
+ register_subalias("14", m_B[3]); // B2
+ register_subalias("15", m_B[2]); // B3
+ }
+ };
+
+
+ NETLIB_DEVICE_IMPL(7497, "TTL_7497", "+CLK,+STRBQ,+ENQ,+UNITYQ,+CLR,+B0,+B1,+B2,+B3,+B4,+B5")
+ NETLIB_DEVICE_IMPL(7497_dip, "TTL_7497_DIP", "")
+
+ } //namespace devices
+} // namespace netlist
diff --git a/src/lib/netlist/devices/nld_7497.h b/src/lib/netlist/devices/nld_7497.h
new file mode 100644
index 00000000000..8d14e08a49b
--- /dev/null
+++ b/src/lib/netlist/devices/nld_7497.h
@@ -0,0 +1,57 @@
+// license:GPL-2.0+
+// copyright-holders:Sergey Svishchev
+/*
+ * nld_7497.h
+ *
+ * SN7497: Synchronous 6-Bit Binary Rate Multiplier
+ *
+ * +--------------+
+ * B1 |1 16| VCC
+ * B4 |2 15| B3
+ * B5 |3 14| B2
+ * B0 |4 7497 13| CLR
+ * Z |5 12| UNITY/CAS
+ * Y |6 11| ENin (EN)
+ * ENout |7 10| STRB
+ * GND |8 9| CLK
+ * +--------------+
+ *
+ * Naming conventions follow TI datasheet
+ *
+ * The counter is enabled when the clear, strobe, and enable inputs are low.
+ *
+ * When the rate input is binary 0 (all rate inputs low), Z remains high [and Y low].
+ *
+ * The unity/cascade input, when connected to the clock input, passes
+ * clock frequency (inverted) to the Y output when the rate input/decoding
+ * gates are inhibited by the strobe.
+ *
+ * When CLR is H, states of CLK and STRB can affect Y and Z. Default are
+ * Y L, Z H, ENout H.
+ *
+ * Unity/cascade is used to inhibit output Y (UNITY L -> Y H)
+ */
+
+#ifndef NLD_7497_H_
+#define NLD_7497_H_
+
+#include "netlist/nl_setup.h"
+
+#define TTL_7497(name, cCLK, cSTRB, cEN, cUNITY, cCLR, cB0, cB1, cB2, cB3, cB4, cB5) \
+ NET_REGISTER_DEV(TTL_7497, name) \
+ NET_CONNECT(name, CLK, cCLK) \
+ NET_CONNECT(name, STRBQ, cSTRB) \
+ NET_CONNECT(name, ENQ, cEN) \
+ NET_CONNECT(name, UNITYQ,cUNITY) \
+ NET_CONNECT(name, CLR, cCLR) \
+ NET_CONNECT(name, B0, cB0) \
+ NET_CONNECT(name, B1, cB1) \
+ NET_CONNECT(name, B2, cB2) \
+ NET_CONNECT(name, B3, cB3) \
+ NET_CONNECT(name, B4, cB4) \
+ NET_CONNECT(name, B5, cB5)
+
+#define TTL_7497_DIP(name) \
+ NET_REGISTER_DEV(TTL_7497_DIP, name)
+
+#endif /* NLD_7497_H_ */
diff --git a/src/lib/netlist/devices/nld_74ls629.cpp b/src/lib/netlist/devices/nld_74ls629.cpp
index d6dc268ed28..b7bb729b334 100644
--- a/src/lib/netlist/devices/nld_74ls629.cpp
+++ b/src/lib/netlist/devices/nld_74ls629.cpp
@@ -40,7 +40,7 @@
#include "nld_74ls629.h"
-#include "../analog/nlid_twoterm.h"
+#include "netlist/analog/nlid_twoterm.h"
namespace netlist
{
@@ -100,11 +100,14 @@ namespace netlist
{
m_R_FC.set_R(90000.0);
m_R_RNG.set_R(90000.0);
- m_clock.do_reset();
+ m_clock.reset();
}
NETLIB_UPDATEI();
- NETLIB_UPDATE_PARAMI() { update_dev(); }
+ NETLIB_UPDATE_PARAMI()
+ {
+ /* update param may be called from anywhere, update_dev(time) is not a good idea */
+ }
public:
NETLIB_SUB(SN74LS629clk) m_clock;
@@ -145,8 +148,8 @@ namespace netlist
NETLIB_RESETI()
{
- m_1.do_reset();
- m_2.do_reset();
+ m_1.reset();
+ m_2.reset();
}
private:
@@ -207,7 +210,7 @@ namespace netlist
freq += k9 * v_rng * v_freq_3;
freq += k10 * v_rng * v_freq_4;
- freq *= NL_FCONST(0.1e-6) / m_CAP();
+ freq *= plib::constants<nl_double>::cast(0.1e-6) / m_CAP();
// FIXME: we need a possibility to remove entries from queue ...
// or an exact model ...
@@ -231,8 +234,8 @@ namespace netlist
}
}
- NETLIB_DEVICE_IMPL(SN74LS629)
- NETLIB_DEVICE_IMPL(SN74LS629_dip)
+ NETLIB_DEVICE_IMPL(SN74LS629, "SN74LS629", "CAP")
+ NETLIB_DEVICE_IMPL(SN74LS629_dip, "SN74LS629_DIP", "1.CAP1,2.CAP2")
} //namespace devices
} // namespace netlist
diff --git a/src/lib/netlist/devices/nld_74ls629.h b/src/lib/netlist/devices/nld_74ls629.h
index 3351524a60b..30d15d70865 100644
--- a/src/lib/netlist/devices/nld_74ls629.h
+++ b/src/lib/netlist/devices/nld_74ls629.h
@@ -28,7 +28,7 @@
#ifndef NLD_74LS629_H_
#define NLD_74LS629_H_
-#include "../nl_setup.h"
+#include "netlist/nl_setup.h"
#define SN74LS629(name, p_cap) \
NET_REGISTER_DEV(SN74LS629, name) \
diff --git a/src/lib/netlist/devices/nld_82S115.cpp b/src/lib/netlist/devices/nld_82S115.cpp
index 2e24bbf9fed..8ae6cbb6097 100644
--- a/src/lib/netlist/devices/nld_82S115.cpp
+++ b/src/lib/netlist/devices/nld_82S115.cpp
@@ -6,7 +6,7 @@
*/
#include "nld_82S115.h"
-#include "../nl_base.h"
+#include "netlist/nl_base.h"
namespace netlist
{
@@ -106,8 +106,8 @@ namespace netlist
m_O[i].push((o >> i) & 1, NLTIME_FROM_NS(40)); // FIXME: Timing
}
- NETLIB_DEVICE_IMPL(82S115)
- NETLIB_DEVICE_IMPL(82S115_dip)
+ NETLIB_DEVICE_IMPL(82S115, "PROM_82S115", "+CE1Q,+CE2,+A0,+A1,+A2,+A3,+A4,+A5,+A6,+A7,+A8,+STROBE")
+ NETLIB_DEVICE_IMPL(82S115_dip, "PROM_82S115_DIP", "")
} //namespace devices
} // namespace netlist
diff --git a/src/lib/netlist/devices/nld_82S115.h b/src/lib/netlist/devices/nld_82S115.h
index ef7f1ec3910..8c13fd8b51e 100644
--- a/src/lib/netlist/devices/nld_82S115.h
+++ b/src/lib/netlist/devices/nld_82S115.h
@@ -28,7 +28,7 @@
#ifndef NLD_82S115_H_
#define NLD_82S115_H_
-#include "../nl_setup.h"
+#include "netlist/nl_setup.h"
#define PROM_82S115(name, cCE1Q, cCE2, cA0, cA1, cA2, cA3, cA4, cA5, cA6, cA7, cA8, cSTROBE) \
NET_REGISTER_DEV(PROM_82S115, name) \
diff --git a/src/lib/netlist/devices/nld_82S123.cpp b/src/lib/netlist/devices/nld_82S123.cpp
index a8a6bfc9b57..4a80b57e349 100644
--- a/src/lib/netlist/devices/nld_82S123.cpp
+++ b/src/lib/netlist/devices/nld_82S123.cpp
@@ -6,7 +6,7 @@
*/
#include "nld_82S123.h"
-#include "../nl_base.h"
+#include "netlist/nl_base.h"
namespace netlist
{
@@ -77,8 +77,8 @@ namespace netlist
m_O[i].push((o >> i) & 1, delay);
}
- NETLIB_DEVICE_IMPL(82S123)
- NETLIB_DEVICE_IMPL(82S123_dip)
+ NETLIB_DEVICE_IMPL(82S123, "PROM_82S123", "+CEQ,+A0,+A1,+A2,+A3,+A4")
+ NETLIB_DEVICE_IMPL(82S123_dip, "PROM_82S123_DIP", "")
} //namespace devices
} // namespace netlist
diff --git a/src/lib/netlist/devices/nld_82S123.h b/src/lib/netlist/devices/nld_82S123.h
index dbf6bf63180..2c18377934d 100644
--- a/src/lib/netlist/devices/nld_82S123.h
+++ b/src/lib/netlist/devices/nld_82S123.h
@@ -25,7 +25,7 @@
#ifndef NLD_82S123_H_
#define NLD_82S123_H_
-#include "../nl_setup.h"
+#include "netlist/nl_setup.h"
#define PROM_82S123(name, cCEQ, cA0, cA1, cA2, cA3, cA4) \
NET_REGISTER_DEV(PROM_82S123, name) \
diff --git a/src/lib/netlist/devices/nld_82S126.cpp b/src/lib/netlist/devices/nld_82S126.cpp
index dcacd1ec876..b1752908645 100644
--- a/src/lib/netlist/devices/nld_82S126.cpp
+++ b/src/lib/netlist/devices/nld_82S126.cpp
@@ -6,7 +6,7 @@
*/
#include "nld_82S126.h"
-#include "../nl_base.h"
+#include "netlist/nl_base.h"
namespace netlist
{
@@ -79,8 +79,8 @@ namespace netlist
m_O[i].push((o >> i) & 1, delay);
}
- NETLIB_DEVICE_IMPL(82S126)
- NETLIB_DEVICE_IMPL(82S126_dip)
+ NETLIB_DEVICE_IMPL(82S126, "PROM_82S126", "+CE1Q,+CE2Q,+A0,+A1,+A2,+A3,+A4,+A5,+A6,+A7")
+ NETLIB_DEVICE_IMPL(82S126_dip, "PROM_82S126_DIP", "")
} //namespace devices
} // namespace netlist
diff --git a/src/lib/netlist/devices/nld_82S126.h b/src/lib/netlist/devices/nld_82S126.h
index 3079bb8e2e0..ed7aa131819 100644
--- a/src/lib/netlist/devices/nld_82S126.h
+++ b/src/lib/netlist/devices/nld_82S126.h
@@ -24,7 +24,7 @@
#ifndef NLD_82S126_H_
#define NLD_82S126_H_
-#include "../nl_setup.h"
+#include "netlist/nl_setup.h"
#define PROM_82S126(name, cCE1Q, cCE2Q, cA0, cA1, cA2, cA3, cA4, cA5, cA6, cA7) \
NET_REGISTER_DEV(PROM_82S126, name) \
diff --git a/src/lib/netlist/devices/nld_82S16.cpp b/src/lib/netlist/devices/nld_82S16.cpp
index 7441f6c677e..e3176c7b30f 100644
--- a/src/lib/netlist/devices/nld_82S16.cpp
+++ b/src/lib/netlist/devices/nld_82S16.cpp
@@ -6,7 +6,7 @@
*/
#include "nld_82S16.h"
-#include "../nl_base.h"
+#include "netlist/nl_base.h"
namespace netlist
{
@@ -15,19 +15,55 @@ namespace netlist
NETLIB_OBJECT(82S16)
{
NETLIB_CONSTRUCTOR(82S16)
- , m_A(*this, {{"A0", "A1", "A2", "A3", "A4", "A5", "A6", "A7" }})
- , m_CE1Q(*this, "CE1Q")
- , m_CE2Q(*this, "CE2Q")
- , m_CE3Q(*this, "CE3Q")
+ , m_A(*this, {{"A0", "A1", "A2", "A3", "A4", "A5", "A6", "A7" }}, NETLIB_DELEGATE(82S16, addr))
+ , m_CE1Q(*this, "CE1Q", NETLIB_DELEGATE(82S16, enq))
+ , m_CE2Q(*this, "CE2Q", NETLIB_DELEGATE(82S16, enq))
+ , m_CE3Q(*this, "CE3Q", NETLIB_DELEGATE(82S16, enq))
, m_WEQ(*this, "WEQ")
, m_DIN(*this, "DIN")
, m_DOUTQ(*this, "DOUTQ")
, m_ram(*this, "m_ram", 0)
+ , m_addr(*this, "m_addr", 0)
+ , m_enq(*this, "m_enq", 0)
{
}
NETLIB_RESETI();
NETLIB_UPDATEI();
+ NETLIB_HANDLERI(addr)
+ {
+ uint8_t adr = 0;
+ for (std::size_t i=0; i<8; i++)
+ {
+ //m_A[i].activate();
+ adr |= (m_A[i]() << i);
+ }
+ m_addr = adr;
+ NETLIB_NAME(82S16)::update();
+ }
+ NETLIB_HANDLERI(enq)
+ {
+ const auto last = m_enq;
+ m_enq = m_CE1Q() || m_CE2Q() || m_CE3Q();
+ if (!last && m_enq)
+ {
+ // FIXME: Outputs are tristate. This needs to be properly implemented
+ m_DOUTQ.push(1, NLTIME_FROM_NS(20));
+ for (std::size_t i=0; i<8; i++)
+ m_A[i].inactivate();
+ m_WEQ.inactivate();
+ m_DIN.inactivate();
+ }
+ else if (last && !m_enq)
+ {
+ for (std::size_t i=0; i<8; i++)
+ m_A[i].activate();
+ m_WEQ.activate();
+ m_DIN.activate();
+ NETLIB_NAME(82S16)::update();
+ }
+ }
+
protected:
object_array_t<logic_input_t, 8> m_A;
@@ -38,7 +74,9 @@ namespace netlist
logic_input_t m_DIN;
logic_output_t m_DOUTQ;
- state_var<uint64_t[4]> m_ram; // 256 bits
+ state_array<uint64_t, 4> m_ram; // 256 bits
+ state_var_u8 m_addr; // 256 bits
+ state_var_sig m_enq;
};
NETLIB_OBJECT_DERIVED(82S16_dip, 82S16)
@@ -69,22 +107,9 @@ namespace netlist
// FIXME: optimize device (separate address decoder!)
NETLIB_UPDATE(82S16)
{
- if (m_CE1Q() || m_CE2Q() || m_CE3Q())
+ if (!m_enq)
{
- // FIXME: Outputs are tristate. This needs to be properly implemented
- m_DOUTQ.push(1, NLTIME_FROM_NS(20));
- //for (int i=0; i<8; i++)
- //m_A[i].inactivate();
- }
- else
- {
- unsigned int adr = 0;
- for (std::size_t i=0; i<8; i++)
- {
- //m_A[i].activate();
- adr |= (m_A[i]() << i);
- }
-
+ const auto adr(m_addr);
if (!m_WEQ())
{
m_ram[adr >> 6] = (m_ram[adr >> 6]
@@ -101,10 +126,12 @@ namespace netlist
{
m_ram[i] = 0;
}
+ m_addr = 0;
+ m_enq = 0;
}
- NETLIB_DEVICE_IMPL(82S16)
- NETLIB_DEVICE_IMPL(82S16_dip)
+ NETLIB_DEVICE_IMPL(82S16, "TTL_82S16", "")
+ NETLIB_DEVICE_IMPL(82S16_dip, "TTL_82S16_DIP", "")
} //namespace devices
} // namespace netlist
diff --git a/src/lib/netlist/devices/nld_82S16.h b/src/lib/netlist/devices/nld_82S16.h
index d1117246d87..47d6189a79b 100644
--- a/src/lib/netlist/devices/nld_82S16.h
+++ b/src/lib/netlist/devices/nld_82S16.h
@@ -24,7 +24,7 @@
#ifndef NLD_82S16_H_
#define NLD_82S16_H_
-#include "../nl_setup.h"
+#include "netlist/nl_setup.h"
#define TTL_82S16(name) \
NET_REGISTER_DEV(TTL_82S16, name)
diff --git a/src/lib/netlist/devices/nld_9310.cpp b/src/lib/netlist/devices/nld_9310.cpp
index ad752adb605..b416015df24 100644
--- a/src/lib/netlist/devices/nld_9310.cpp
+++ b/src/lib/netlist/devices/nld_9310.cpp
@@ -6,7 +6,7 @@
*/
#include "nld_9310.h"
-#include "../nl_base.h"
+#include "netlist/nl_base.h"
#define MAXCNT 9
@@ -14,6 +14,7 @@ namespace netlist
{
namespace devices
{
+ //FIXME: Convert sub devices into NETDEV_DELEGATE logic
NETLIB_OBJECT(9310_subABCD)
{
NETLIB_CONSTRUCTOR(9310_subABCD)
@@ -139,8 +140,8 @@ namespace netlist
NETLIB_RESET(9310)
{
- sub.do_reset();
- subABCD.do_reset();
+ sub.reset();
+ subABCD.reset();
}
NETLIB_RESET(9310_subABCD)
@@ -157,32 +158,35 @@ namespace netlist
NETLIB_UPDATE(9310_sub)
{
+ auto cnt(m_cnt);
+
if (m_loadq)
{
- if (m_cnt < MAXCNT - 1)
+ if (cnt < MAXCNT - 1)
{
- ++m_cnt;
- update_outputs(m_cnt);
+ ++cnt;
+ update_outputs(cnt);
}
- else if (m_cnt == MAXCNT - 1)
+ else if (cnt == MAXCNT - 1)
{
- m_cnt = MAXCNT;
+ cnt = MAXCNT;
m_RC.push(m_ent, NLTIME_FROM_NS(20));
m_QA.push(1, NLTIME_FROM_NS(20));
}
else // MAXCNT
{
m_RC.push(0, NLTIME_FROM_NS(20));
- m_cnt = 0;
- update_outputs_all(m_cnt, NLTIME_FROM_NS(20));
+ cnt = 0;
+ update_outputs_all(cnt, NLTIME_FROM_NS(20));
}
}
else
{
- m_cnt = m_ABCD->read_ABCD();
- m_RC.push(m_ent & (m_cnt == MAXCNT), NLTIME_FROM_NS(27));
- update_outputs_all(m_cnt, NLTIME_FROM_NS(22));
+ cnt = m_ABCD->read_ABCD();
+ m_RC.push(m_ent & (cnt == MAXCNT), NLTIME_FROM_NS(27));
+ update_outputs_all(cnt, NLTIME_FROM_NS(22));
}
+ m_cnt = cnt;
}
NETLIB_UPDATE(9310)
@@ -223,10 +227,10 @@ namespace netlist
#if 0
// for (int i=0; i<4; i++)
// m_Q[i], (cnt >> i) & 1, delay[i]);
- m_QA, (cnt >> 0) & 1, out_delay);
- m_QB, (cnt >> 1) & 1, out_delay);
- m_QC, (cnt >> 2) & 1, out_delay);
- m_QD, (cnt >> 3) & 1, out_delay);
+ m_QA.push((cnt >> 0) & 1, out_delay);
+ m_QB.push((cnt >> 1) & 1, out_delay);
+ m_QC.push((cnt >> 2) & 1, out_delay);
+ m_QD.push((cnt >> 3) & 1, out_delay);
#else
if ((cnt & 1) == 1)
m_QA.push(1, out_delay);
@@ -262,8 +266,8 @@ namespace netlist
#endif
}
- NETLIB_DEVICE_IMPL(9310)
- NETLIB_DEVICE_IMPL(9310_dip)
+ NETLIB_DEVICE_IMPL(9310, "TTL_9310", "")
+ NETLIB_DEVICE_IMPL(9310_dip, "TTL_9310_DIP", "")
} //namespace devices
} // namespace netlist
diff --git a/src/lib/netlist/devices/nld_9310.h b/src/lib/netlist/devices/nld_9310.h
index 02cb45b2d86..65df9c04ce4 100644
--- a/src/lib/netlist/devices/nld_9310.h
+++ b/src/lib/netlist/devices/nld_9310.h
@@ -45,7 +45,7 @@
#ifndef NLD_9310_H_
#define NLD_9310_H_
-#include "../nl_setup.h"
+#include "netlist/nl_setup.h"
#define TTL_9310(name, cCLK, cENP, cENT, cCLRQ, cLOADQ, cA, cB, cC, cD) \
NET_REGISTER_DEV(TTL_9310, name) \
diff --git a/src/lib/netlist/devices/nld_9316.cpp b/src/lib/netlist/devices/nld_9316.cpp
index 7c478fd4b05..2b17eabb3ec 100644
--- a/src/lib/netlist/devices/nld_9316.cpp
+++ b/src/lib/netlist/devices/nld_9316.cpp
@@ -6,7 +6,7 @@
*/
#include "nld_9316.h"
-#include "../nl_base.h"
+#include "netlist/nl_base.h"
namespace netlist
{
@@ -20,31 +20,72 @@ namespace netlist
NETLIB_CONSTRUCTOR(9316)
, m_CLK(*this, "CLK", NETLIB_DELEGATE(9316, clk))
, m_ENT(*this, "ENT")
+ , m_RC(*this, "RC")
, m_LOADQ(*this, "LOADQ")
- , m_cnt(*this, "m_cnt", 0)
, m_ENP(*this, "ENP")
, m_CLRQ(*this, "CLRQ")
- , m_A(*this, "A", NETLIB_DELEGATE(9316, noop))
- , m_B(*this, "B", NETLIB_DELEGATE(9316, noop))
- , m_C(*this, "C", NETLIB_DELEGATE(9316, noop))
- , m_D(*this, "D", NETLIB_DELEGATE(9316, noop))
+ , m_A(*this, "A", NETLIB_DELEGATE(9316, abcd))
+ , m_B(*this, "B", NETLIB_DELEGATE(9316, abcd))
+ , m_C(*this, "C", NETLIB_DELEGATE(9316, abcd))
+ , m_D(*this, "D", NETLIB_DELEGATE(9316, abcd))
, m_Q(*this, {{ "QA", "QB", "QC", "QD" }})
- , m_RC(*this, "RC")
+ , m_cnt(*this, "m_cnt", 0)
+ , m_abcd(*this, "m_abcd", 0)
+ , m_loadq(*this, "m_loadq", 0)
+ , m_ent(*this, "m_ent", 0)
{
}
private:
- NETLIB_RESETI();
- NETLIB_UPDATEI();
- NETLIB_HANDLERI(clk);
- NETLIB_HANDLERI(noop) { }
+ NETLIB_RESETI()
+ {
+ m_CLK.set_state(logic_t::STATE_INP_LH);
+ m_cnt = 0;
+ m_abcd = 0;
+ }
- logic_input_t m_CLK;
+ NETLIB_UPDATEI()
+ {
+ const auto CLRQ(m_CLRQ());
+ m_ent = m_ENT();
+ m_loadq = m_LOADQ();
+ if (((m_loadq ^ 1) || (m_ent && m_ENP())) && CLRQ)
+ {
+ m_CLK.activate_lh();
+ }
+ else
+ {
+ m_CLK.inactivate();
+ if (!CLRQ && (m_cnt>0))
+ {
+ m_cnt = 0;
+ update_outputs_all(m_cnt, NLTIME_FROM_NS(36));
+ }
+ }
+ m_RC.push(m_ent && (m_cnt == MAXCNT), NLTIME_FROM_NS(27));
+ }
+
+
+ NETLIB_HANDLERI(clk)
+ {
+ auto cnt = (m_loadq ? m_cnt + 1 : m_abcd) & MAXCNT;
+ m_RC.push(m_ent && (cnt == MAXCNT), NLTIME_FROM_NS(27));
+ update_outputs_all(cnt, NLTIME_FROM_NS(20));
+ m_cnt = cnt;
+ }
+
+ NETLIB_HANDLERI(abcd)
+ {
+ m_abcd = static_cast<uint8_t>((m_D() << 3) | (m_C() << 2) | (m_B() << 1) | (m_A() << 0));
+ }
+
+ logic_input_t m_CLK;
logic_input_t m_ENT;
- logic_input_t m_LOADQ;
- state_var<unsigned> m_cnt;
+ logic_output_t m_RC;
+
+ logic_input_t m_LOADQ;
logic_input_t m_ENP;
logic_input_t m_CLRQ;
@@ -55,12 +96,15 @@ namespace netlist
logic_input_t m_D;
object_array_t<logic_output_t, 4> m_Q;
- logic_output_t m_RC;
+ /* counter state */
+ state_var<unsigned> m_cnt;
+ /* cached pins */
+ state_var_u8 m_abcd;
+ state_var_sig m_loadq;
+ state_var_sig m_ent;
- private:
- //inline void update_outputs_all(const unsigned &cnt, const netlist_time &out_delay) noexcept
- inline void update_outputs_all(const unsigned &cnt, const netlist_time &out_delay) noexcept
+ void update_outputs_all(unsigned cnt, netlist_time out_delay) noexcept
{
m_Q[0].push((cnt >> 0) & 1, out_delay);
m_Q[1].push((cnt >> 1) & 1, out_delay);
@@ -93,63 +137,9 @@ namespace netlist
}
};
- NETLIB_RESET(9316)
- {
- m_CLK.set_state(logic_t::STATE_INP_LH);
- m_cnt = 0;
- }
-
- NETLIB_HANDLER(9316, clk)
- {
- if (m_LOADQ())
- {
- ++m_cnt &= MAXCNT;
- //m_RC.push(m_ENT() && (m_cnt == MAXCNT), NLTIME_FROM_NS(27));
- if (m_cnt == MAXCNT)
- {
- m_RC.push(m_ENT(), NLTIME_FROM_NS(27));
- update_outputs_all(MAXCNT, NLTIME_FROM_NS(20));
- }
- else if (m_cnt == 0)
- {
- m_RC.push(0, NLTIME_FROM_NS(27));
- update_outputs_all(0, NLTIME_FROM_NS(20));
- }
- else
- update_outputs_all(m_cnt, NLTIME_FROM_NS(20));
- }
- else
- {
- m_cnt = (m_D() << 3) | (m_C() << 2) | (m_B() << 1) | (m_A() << 0);
- m_RC.push(m_ENT() && (m_cnt == MAXCNT), NLTIME_FROM_NS(27));
- update_outputs_all(m_cnt, NLTIME_FROM_NS(22));
- }
- }
-
- NETLIB_UPDATE(9316)
- {
- const netlist_sig_t CLRQ(m_CLRQ());
- const netlist_sig_t ENT(m_ENT());
-
- if (((m_LOADQ() ^ 1) || (ENT && m_ENP())) && CLRQ)
- {
- m_CLK.activate_lh();
- }
- else
- {
- m_CLK.inactivate();
- if (!CLRQ && (m_cnt>0))
- {
- m_cnt = 0;
- update_outputs_all(m_cnt, NLTIME_FROM_NS(36));
- }
- }
- m_RC.push(ENT && (m_cnt == MAXCNT), NLTIME_FROM_NS(27));
- }
-
- NETLIB_DEVICE_IMPL(9316)
- NETLIB_DEVICE_IMPL(9316_dip)
+ NETLIB_DEVICE_IMPL(9316, "TTL_9316", "+CLK,+ENP,+ENT,+CLRQ,+LOADQ,+A,+B,+C,+D")
+ NETLIB_DEVICE_IMPL(9316_dip, "TTL_9316_DIP", "")
} //namespace devices
} // namespace netlist
diff --git a/src/lib/netlist/devices/nld_9316.h b/src/lib/netlist/devices/nld_9316.h
index 8deb21dfccd..8ab1789d7c7 100644
--- a/src/lib/netlist/devices/nld_9316.h
+++ b/src/lib/netlist/devices/nld_9316.h
@@ -51,7 +51,7 @@
#ifndef NLD_9316_H_
#define NLD_9316_H_
-#include "../nl_setup.h"
+#include "netlist/nl_setup.h"
#define TTL_9316(name, cCLK, cENP, cENT, cCLRQ, cLOADQ, cA, cB, cC, cD) \
NET_REGISTER_DEV(TTL_9316, name) \
diff --git a/src/lib/netlist/devices/nld_9322.cpp b/src/lib/netlist/devices/nld_9322.cpp
index 6c408498be7..abf9bf9f6ef 100644
--- a/src/lib/netlist/devices/nld_9322.cpp
+++ b/src/lib/netlist/devices/nld_9322.cpp
@@ -6,7 +6,7 @@
*/
#include "nld_9322.h"
-#include "../nl_base.h"
+#include "netlist/nl_base.h"
namespace netlist
{
@@ -105,14 +105,14 @@ namespace netlist
NETLIB_UPDATE(9322)
{
- m_1.update_dev();
- m_2.update_dev();
- m_3.update_dev();
- m_4.update_dev();
+ m_1.update();
+ m_2.update();
+ m_3.update();
+ m_4.update();
}
- NETLIB_DEVICE_IMPL(9322)
- NETLIB_DEVICE_IMPL(9322_dip)
+ NETLIB_DEVICE_IMPL(9322, "TTL_9322", "+SELECT,+A1,+B1,+A2,+B2,+A3,+B3,+A4,+B4,+STROBE")
+ NETLIB_DEVICE_IMPL(9322_dip, "TTL_9322_DIP", "")
} //namespace devices
} // namespace netlist
diff --git a/src/lib/netlist/devices/nld_9322.h b/src/lib/netlist/devices/nld_9322.h
index 7de0f053b05..986c6b9e7f7 100644
--- a/src/lib/netlist/devices/nld_9322.h
+++ b/src/lib/netlist/devices/nld_9322.h
@@ -21,7 +21,7 @@
#ifndef NLD_9322_H_
#define NLD_9322_H_
-#include "../nl_setup.h"
+#include "netlist/nl_setup.h"
#define TTL_9322(name, cSELECT, cA1, cB1, cA2, cB2, cA3, cB3, cA4, cB4, cSTROBE) \
NET_REGISTER_DEV(TTL_9322, name) \
diff --git a/src/lib/netlist/devices/nld_am2847.cpp b/src/lib/netlist/devices/nld_am2847.cpp
index 5d0c5cb71a3..825696f0938 100644
--- a/src/lib/netlist/devices/nld_am2847.cpp
+++ b/src/lib/netlist/devices/nld_am2847.cpp
@@ -6,7 +6,7 @@
*/
#include "nld_am2847.h"
-#include "../nl_base.h"
+#include "netlist/nl_base.h"
namespace netlist
{
@@ -30,7 +30,7 @@ namespace netlist
logic_input_t m_RC;
logic_input_t m_IN;
- state_var<uint16_t[5]> m_buffer;
+ state_array<uint16_t, 5> m_buffer;
logic_output_t m_OUT;
};
@@ -116,7 +116,7 @@ namespace netlist
/* do nothing */
}
- inline NETLIB_FUNC_VOID(Am2847_shifter, shift, (void))
+ NETLIB_FUNC_VOID(Am2847_shifter, shift, ())
{
uint32_t out = m_buffer[0] & 1;
uint32_t in = (m_RC() ? out : m_IN());
@@ -130,8 +130,8 @@ namespace netlist
m_OUT.push(out, NLTIME_FROM_NS(200));
}
- NETLIB_DEVICE_IMPL(AM2847)
- NETLIB_DEVICE_IMPL(AM2847_dip)
+ NETLIB_DEVICE_IMPL(AM2847, "TTL_AM2847", "+CP,+INA,+INB,+INC,+IND,+RCA,+RCB,+RCC,+RCD")
+ NETLIB_DEVICE_IMPL(AM2847_dip, "TTL_AM2847_DIP", "")
} //namespace devices
} // namespace netlist
diff --git a/src/lib/netlist/devices/nld_am2847.h b/src/lib/netlist/devices/nld_am2847.h
index 70d288d3eec..ff4a95b8e81 100644
--- a/src/lib/netlist/devices/nld_am2847.h
+++ b/src/lib/netlist/devices/nld_am2847.h
@@ -21,7 +21,7 @@
#ifndef NLD_AM2847_H_
#define NLD_AM2847_H_
-#include "../nl_setup.h"
+#include "netlist/nl_setup.h"
#define TTL_AM2847(name, cCP, cINA, cINB, cINC, cIND, cRCA, cRCB, cRCC, cRCD) \
NET_REGISTER_DEV(TTL_AM2847, name) \
diff --git a/src/lib/netlist/devices/nld_dm9314.cpp b/src/lib/netlist/devices/nld_dm9314.cpp
index fd3b8666078..93b958de539 100644
--- a/src/lib/netlist/devices/nld_dm9314.cpp
+++ b/src/lib/netlist/devices/nld_dm9314.cpp
@@ -6,7 +6,7 @@
*/
#include "nld_dm9314.h"
-#include "../nl_base.h"
+#include "netlist/nl_base.h"
namespace netlist
{
@@ -107,8 +107,8 @@ namespace netlist
}
}
- NETLIB_DEVICE_IMPL(9314)
- NETLIB_DEVICE_IMPL(9314_dip)
+ NETLIB_DEVICE_IMPL(9314, "TTL_9314", "+EQ,+MRQ,+S0Q,+S1Q,+S2Q,+S3Q,+D0,+D1,+D2,+D3")
+ NETLIB_DEVICE_IMPL(9314_dip, "TTL_9314_DIP", "")
} //namespace devices
} // namespace netlist
diff --git a/src/lib/netlist/devices/nld_dm9314.h b/src/lib/netlist/devices/nld_dm9314.h
index 6188bbef42f..59c60591ce7 100644
--- a/src/lib/netlist/devices/nld_dm9314.h
+++ b/src/lib/netlist/devices/nld_dm9314.h
@@ -21,7 +21,7 @@
#ifndef NLD_DM9314_H_
#define NLD_DM9314_H_
-#include "../nl_setup.h"
+#include "netlist/nl_setup.h"
#define TTL_9314(name, cEQ, cMRQ, cS0Q, cS1Q, cS2Q, cS3Q, cD0, cD1, cD2, cD3) \
NET_REGISTER_DEV(TTL_9314, name) \
diff --git a/src/lib/netlist/devices/nld_dm9334.cpp b/src/lib/netlist/devices/nld_dm9334.cpp
index 8dceded5390..c08ce53efed 100644
--- a/src/lib/netlist/devices/nld_dm9334.cpp
+++ b/src/lib/netlist/devices/nld_dm9334.cpp
@@ -6,7 +6,7 @@
*/
#include "nld_dm9334.h"
-#include "../nl_base.h"
+#include "netlist/nl_base.h"
namespace netlist
{
@@ -143,8 +143,8 @@ namespace netlist
m_Q[i].push((q >> i) & 1, delay);
}
- NETLIB_DEVICE_IMPL(9334)
- NETLIB_DEVICE_IMPL(9334_dip)
+ NETLIB_DEVICE_IMPL(9334, "TTL_9334", "+CQ,+EQ,+D,+A0,+A1,+A2")
+ NETLIB_DEVICE_IMPL(9334_dip, "TTL_9334_DIP", "")
} //namespace devices
} // namespace netlist
diff --git a/src/lib/netlist/devices/nld_dm9334.h b/src/lib/netlist/devices/nld_dm9334.h
index 1a07e051333..e54208e3ba4 100644
--- a/src/lib/netlist/devices/nld_dm9334.h
+++ b/src/lib/netlist/devices/nld_dm9334.h
@@ -65,7 +65,7 @@
#ifndef NLD_DM9334_H_
#define NLD_DM9334_H_
-#include "../nl_setup.h"
+#include "netlist/nl_setup.h"
#define TTL_9334(name, cCQ, cEQ, cD, cA0, cA1, cA2) \
NET_REGISTER_DEV(TTL_9334, name) \
diff --git a/src/lib/netlist/devices/nld_legacy.cpp b/src/lib/netlist/devices/nld_legacy.cpp
index 28fe0ad8188..738230646e0 100644
--- a/src/lib/netlist/devices/nld_legacy.cpp
+++ b/src/lib/netlist/devices/nld_legacy.cpp
@@ -6,7 +6,7 @@
*/
#include "nld_legacy.h"
-#include "../nl_base.h"
+#include "netlist/nl_base.h"
namespace netlist
{
@@ -25,7 +25,7 @@ namespace netlist
NETLIB_RESETI();
NETLIB_UPDATEI();
- protected:
+ private:
logic_input_t m_S;
logic_input_t m_R;
@@ -49,7 +49,7 @@ namespace netlist
NETLIB_RESETI();
NETLIB_UPDATEI();
- protected:
+ private:
logic_input_t m_I;
logic_output_t m_Q;
@@ -100,8 +100,8 @@ namespace netlist
m_last = nval;
}
- NETLIB_DEVICE_IMPL(nicRSFF)
- NETLIB_DEVICE_IMPL(nicDelay)
+ NETLIB_DEVICE_IMPL(nicRSFF, "NETDEV_RSFF", "")
+ NETLIB_DEVICE_IMPL(nicDelay, "NETDEV_DELAY", "")
} //namespace devices
} // namespace netlist
diff --git a/src/lib/netlist/devices/nld_legacy.h b/src/lib/netlist/devices/nld_legacy.h
index 33f7d0caaf8..aa3aec6f147 100644
--- a/src/lib/netlist/devices/nld_legacy.h
+++ b/src/lib/netlist/devices/nld_legacy.h
@@ -13,7 +13,7 @@
#ifndef NLD_LEGACY_H_
#define NLD_LEGACY_H_
-#include "../nl_setup.h"
+#include "netlist/nl_setup.h"
// ----------------------------------------------------------------------------------------
// Macros
diff --git a/src/lib/netlist/devices/nld_log.cpp b/src/lib/netlist/devices/nld_log.cpp
index 29218aaa09a..6b1b3d8efc1 100644
--- a/src/lib/netlist/devices/nld_log.cpp
+++ b/src/lib/netlist/devices/nld_log.cpp
@@ -5,10 +5,10 @@
*
*/
-#include "../nl_base.h"
-#include "../plib/pstream.h"
-#include "../plib/pfmtlog.h"
+#include "netlist/nl_base.h"
#include "nld_log.h"
+#include "plib/pfmtlog.h"
+#include "plib/pstream.h"
//#include "sound/wavwrite.h"
namespace netlist
@@ -19,15 +19,15 @@ namespace netlist
{
NETLIB_CONSTRUCTOR(log)
, m_I(*this, "I")
- , m_strm(plib::pfmt("{1}.log")(this->name()))
- , m_writer(m_strm)
+ , m_strm(pstring(plib::pfmt("{1}.log")(this->name())))
+ , m_writer(&m_strm)
{
}
NETLIB_UPDATEI()
{
/* use pstring::sprintf, it is a LOT faster */
- m_writer.writeline(plib::pfmt("{1:.9} {2}").e(netlist().time().as_double()).e(static_cast<double>(m_I())));
+ m_writer.writeline(plib::pfmt("{1:.9} {2}").e(exec().time().as_double()).e(static_cast<double>(m_I())));
}
NETLIB_RESETI() { }
@@ -46,7 +46,7 @@ namespace netlist
NETLIB_UPDATEI()
{
- m_writer.writeline(plib::pfmt("{1:.9} {2}").e(netlist().time().as_double()).e(static_cast<double>(m_I() - m_I2())));
+ m_writer.writeline(plib::pfmt("{1:.9} {2}").e(exec().time().as_double()).e(static_cast<double>(m_I() - m_I2())));
}
NETLIB_RESETI() { }
@@ -89,8 +89,8 @@ namespace netlist
#endif
- NETLIB_DEVICE_IMPL(log)
- NETLIB_DEVICE_IMPL(logD)
+ NETLIB_DEVICE_IMPL(log, "LOG", "+I")
+ NETLIB_DEVICE_IMPL(logD, "LOGD", "+I,+I2")
} //namespace devices
} // namespace netlist
diff --git a/src/lib/netlist/devices/nld_log.h b/src/lib/netlist/devices/nld_log.h
index 6364022cea2..13c71ea7257 100644
--- a/src/lib/netlist/devices/nld_log.h
+++ b/src/lib/netlist/devices/nld_log.h
@@ -18,10 +18,10 @@
#ifndef NLD_LOG_H_
#define NLD_LOG_H_
-#include "../nl_setup.h"
+#include "netlist/nl_setup.h"
#define LOG(name, cI) \
- NET_REGISTER_DEV(??PG, name) \
+ NET_REGISTER_DEV(LOG, name) \
NET_CONNECT(name, I, cI)
#define LOGD(name, cI, cI2) \
diff --git a/src/lib/netlist/devices/nld_mm5837.cpp b/src/lib/netlist/devices/nld_mm5837.cpp
index e97ae41e437..f6c2566bd43 100644
--- a/src/lib/netlist/devices/nld_mm5837.cpp
+++ b/src/lib/netlist/devices/nld_mm5837.cpp
@@ -6,8 +6,8 @@
*/
#include "nld_mm5837.h"
-#include "../solver/nld_matrix_solver.h"
-#include "../analog/nlid_twoterm.h"
+#include "netlist/analog/nlid_twoterm.h"
+#include "netlist/solver/nld_matrix_solver.h"
#define R_LOW (1000.0)
#define R_HIGH (1000.0)
@@ -69,13 +69,13 @@ namespace netlist
{
//m_V0.initial(0.0);
//m_RV.do_reset();
- m_RV.set(NL_FCONST(1.0) / R_LOW, 0.0, 0.0);
+ m_RV.set_G_V_I(plib::constants<nl_double>::one() / R_LOW, 0.0, 0.0);
m_inc = netlist_time::from_double(1.0 / m_FREQ());
if (m_FREQ() < 24000 || m_FREQ() > 56000)
log().warning(MW_1_FREQUENCY_OUTSIDE_OF_SPECS_1, m_FREQ());
m_shift = 0x1ffff;
- m_is_timestep = m_RV.m_P.net().solver()->is_timestep();
+ m_is_timestep = m_RV.m_P.net().solver()->has_timestep_devices();
}
NETLIB_UPDATE_PARAM(MM5837_dip)
@@ -107,14 +107,14 @@ namespace netlist
// We only need to update the net first if this is a time stepping net
if (m_is_timestep)
- m_RV.update_dev();
- m_RV.set(NL_FCONST(1.0) / R, V, 0.0);
- m_RV.m_P.schedule_solve_after(NLTIME_FROM_NS(1));
+ m_RV.update();
+ m_RV.set_G_V_I(plib::constants<nl_double>::one() / R, V, plib::constants<nl_double>::zero());
+ m_RV.solve_later(NLTIME_FROM_NS(1));
}
}
- NETLIB_DEVICE_IMPL(MM5837_dip)
+ NETLIB_DEVICE_IMPL(MM5837_dip, "MM5837_DIP", "")
} //namespace devices
} // namespace netlist
diff --git a/src/lib/netlist/devices/nld_mm5837.h b/src/lib/netlist/devices/nld_mm5837.h
index 4af397d9965..8f764aa651f 100644
--- a/src/lib/netlist/devices/nld_mm5837.h
+++ b/src/lib/netlist/devices/nld_mm5837.h
@@ -19,7 +19,7 @@
#ifndef NLD_MM5837_H_
#define NLD_MM5837_H_
-#include "../nl_setup.h"
+#include "netlist/nl_setup.h"
#define MM5837_DIP(name) \
NET_REGISTER_DEV(MM5837_DIP, name)
diff --git a/src/lib/netlist/devices/nld_ne555.cpp b/src/lib/netlist/devices/nld_ne555.cpp
index 8795197bd57..5e990d2e974 100644
--- a/src/lib/netlist/devices/nld_ne555.cpp
+++ b/src/lib/netlist/devices/nld_ne555.cpp
@@ -46,8 +46,8 @@
*/
#include "nld_ne555.h"
-#include "../analog/nlid_twoterm.h"
-#include "../solver/nld_solver.h"
+#include "netlist/analog/nlid_twoterm.h"
+#include "netlist/solver/nld_solver.h"
#define R_OFF (1E20)
#define R_ON (25) // Datasheet states a maximum discharge of 200mA, R = 5V / 0.2
@@ -62,31 +62,37 @@ namespace netlist
, m_R1(*this, "R1")
, m_R2(*this, "R2")
, m_R3(*this, "R3")
+ , m_ROUT(*this, "ROUT")
, m_RDIS(*this, "RDIS")
, m_RESET(*this, "RESET") // Pin 4
, m_THRES(*this, "THRESH") // Pin 6
, m_TRIG(*this, "TRIG") // Pin 2
- , m_OUT(*this, "OUT") // Pin 3
+ , m_OUT(*this, "_OUT") // to Pin 3 via ROUT
, m_last_out(*this, "m_last_out", false)
, m_ff(*this, "m_ff", false)
+ , m_last_reset(*this, "m_last_reset", false)
{
register_subalias("GND", m_R3.m_N); // Pin 1
register_subalias("CONT", m_R1.m_N); // Pin 5
register_subalias("DISCH", m_RDIS.m_P); // Pin 7
register_subalias("VCC", m_R1.m_P); // Pin 8
+ register_subalias("OUT", m_ROUT.m_P); // Pin 3
connect(m_R1.m_N, m_R2.m_P);
+ connect(m_R1.m_N, m_R2.m_P);
connect(m_R2.m_N, m_R3.m_P);
connect(m_RDIS.m_N, m_R3.m_N);
+ connect(m_OUT, m_ROUT.m_N);
}
NETLIB_UPDATEI();
NETLIB_RESETI();
- protected:
+ private:
analog::NETLIB_SUB(R_base) m_R1;
analog::NETLIB_SUB(R_base) m_R2;
analog::NETLIB_SUB(R_base) m_R3;
+ analog::NETLIB_SUB(R_base) m_ROUT;
analog::NETLIB_SUB(R_base) m_RDIS;
logic_input_t m_RESET;
@@ -94,52 +100,51 @@ namespace netlist
analog_input_t m_TRIG;
analog_output_t m_OUT;
- private:
state_var<bool> m_last_out;
state_var<bool> m_ff;
+ state_var<bool> m_last_reset;
- inline nl_double clamp(const nl_double v, const nl_double a, const nl_double b);
-
+ nl_double clamp(const nl_double v, const nl_double a, const nl_double b)
+ {
+ nl_double ret = v;
+ nl_double vcc = m_R1.m_P();
+
+ if (ret > vcc - a)
+ ret = vcc - a;
+ if (ret < b)
+ ret = b;
+ return ret;
+ }
};
NETLIB_OBJECT_DERIVED(NE555_dip, NE555)
{
NETLIB_CONSTRUCTOR_DERIVED(NE555_dip, NE555)
{
- register_subalias("1", m_R3.m_N); // Pin 1
- register_subalias("2", m_TRIG); // Pin 2
- register_subalias("3", m_OUT); // Pin 3
- register_subalias("4", m_RESET); // Pin 4
- register_subalias("5", m_R1.m_N); // Pin 5
- register_subalias("6", m_THRES); // Pin 6
- register_subalias("7", m_RDIS.m_P); // Pin 7
- register_subalias("8", m_R1.m_P); // Pin 8
+ register_subalias("1", "GND"); // Pin 1
+ register_subalias("2", "TRIG"); // Pin 2
+ register_subalias("3", "OUT"); // Pin 3
+ register_subalias("4", "RESET"); // Pin 4
+ register_subalias("5", "CONT"); // Pin 5
+ register_subalias("6", "THRESH"); // Pin 6
+ register_subalias("7", "DISCH"); // Pin 7
+ register_subalias("8", "VCC"); // Pin 8
}
};
- inline nl_double NETLIB_NAME(NE555)::clamp(const nl_double v, const nl_double a, const nl_double b)
- {
- nl_double ret = v;
- nl_double vcc = m_R1.m_P();
-
- if (ret > vcc - a)
- ret = vcc - a;
- if (ret < b)
- ret = b;
- return ret;
- }
-
NETLIB_RESET(NE555)
{
- m_R1.do_reset();
- m_R2.do_reset();
- m_R3.do_reset();
- m_RDIS.do_reset();
+ m_R1.reset();
+ m_R2.reset();
+ m_R3.reset();
+ m_ROUT.reset();
+ m_RDIS.reset();
- /* FIXME make resistance a parameter, properly model other variants */
+ /* FIXME make resistances a parameter, properly model other variants */
m_R1.set_R(5000);
m_R2.set_R(5000);
m_R3.set_R(5000);
+ m_ROUT.set_R(20);
m_RDIS.set_R(R_OFF);
m_last_out = true;
@@ -149,39 +154,47 @@ namespace netlist
{
// FIXME: assumes GND is connected to 0V.
- nl_double vt = clamp(m_R2.m_P(), 0.7, 1.4);
- bool bthresh = (m_THRES() > vt);
- bool btrig = (m_TRIG() > clamp(m_R2.m_N(), 0.7, 1.4));
+ const auto reset = m_RESET();
- if (!btrig)
+ if (!reset && m_last_reset)
{
- m_ff = true;
+ m_ff = false;
}
- else if (bthresh)
+ else
{
- m_ff = false;
+ const nl_double vt = clamp(m_R2.m_P(), 0.7, 1.4);
+ const bool bthresh = (m_THRES() > vt);
+ const bool btrig = (m_TRIG() > clamp(m_R2.m_N(), 0.7, 1.4));
+
+ if (!btrig)
+ m_ff = true;
+ else if (bthresh)
+ m_ff = false;
}
- bool out = (!m_RESET() ? false : m_ff);
+ const bool out = (!reset ? false : m_ff);
if (m_last_out && !out)
{
- m_RDIS.update_dev();
+ m_RDIS.update();
m_OUT.push(m_R3.m_N());
m_RDIS.set_R(R_ON);
}
else if (!m_last_out && out)
{
- m_RDIS.update_dev();
+ m_RDIS.update();
// FIXME: Should be delayed by 100ns
m_OUT.push(m_R1.m_P());
m_RDIS.set_R(R_OFF);
}
+ m_last_reset = reset;
m_last_out = out;
}
- NETLIB_DEVICE_IMPL(NE555)
- NETLIB_DEVICE_IMPL(NE555_dip)
+ NETLIB_DEVICE_IMPL(NE555, "NE555", "")
+ NETLIB_DEVICE_IMPL(NE555_dip, "NE555_DIP", "")
+ NETLIB_DEVICE_IMPL_ALIAS(MC1455P, NE555, "MC1455P", "")
+ NETLIB_DEVICE_IMPL_ALIAS(MC1455P_dip, NE555_dip, "MC1455P_DIP", "")
} //namespace devices
} // namespace netlist
diff --git a/src/lib/netlist/devices/nld_ne555.h b/src/lib/netlist/devices/nld_ne555.h
index c629253f08f..fc575d914b7 100644
--- a/src/lib/netlist/devices/nld_ne555.h
+++ b/src/lib/netlist/devices/nld_ne555.h
@@ -4,7 +4,7 @@
#ifndef NLD_NE555_H_
#define NLD_NE555_H_
-#include "../nl_setup.h"
+#include "netlist/nl_setup.h"
#define NE555(name) \
NET_REGISTER_DEV(NE555, name)
@@ -12,4 +12,10 @@
#define NE555_DIP(name) \
NET_REGISTER_DEV(NE555_DIP, name)
+#define MC1455P(name) \
+ NET_REGISTER_DEV(MC1455P, name)
+
+#define MC1455P_DIP(name) \
+ NET_REGISTER_DEV(MC1455P_DIP, name)
+
#endif /* NLD_NE555_H_ */
diff --git a/src/lib/netlist/devices/nld_r2r_dac.cpp b/src/lib/netlist/devices/nld_r2r_dac.cpp
index 4c29389d491..284b6673f76 100644
--- a/src/lib/netlist/devices/nld_r2r_dac.cpp
+++ b/src/lib/netlist/devices/nld_r2r_dac.cpp
@@ -5,9 +5,9 @@
*
*/
-#include "../nl_base.h"
-#include "../nl_factory.h"
-#include "../analog/nlid_twoterm.h"
+#include "netlist/nl_base.h"
+#include "netlist/analog/nlid_twoterm.h"
+#include "netlist/nl_factory.h"
namespace netlist
{
@@ -39,17 +39,17 @@ namespace netlist
NETLIB_UPDATE_PARAM(r2r_dac)
{
- update_dev();
+ solve_now();
double V = m_VIN() / static_cast<double>(1 << m_num())
* static_cast<double>(m_val());
- this->set(1.0 / m_R(), V, 0.0);
+ this->set_G_V_I(1.0 / m_R(), V, 0.0);
}
} //namespace analog
namespace devices {
- NETLIB_DEVICE_IMPL_NS(analog, r2r_dac)
- }
+ NETLIB_DEVICE_IMPL_NS(analog, r2r_dac, "R2R_DAC", "VIN,R,N")
+ } // namespace devices
} // namespace netlist
diff --git a/src/lib/netlist/devices/nld_r2r_dac.h b/src/lib/netlist/devices/nld_r2r_dac.h
index 18e5bddc053..8a4257a3cbf 100644
--- a/src/lib/netlist/devices/nld_r2r_dac.h
+++ b/src/lib/netlist/devices/nld_r2r_dac.h
@@ -46,7 +46,7 @@
#ifndef NLD_R2R_DAC_H_
#define NLD_R2R_DAC_H_
-#include "../nl_setup.h"
+#include "netlist/nl_setup.h"
#define R2R_DAC(name, p_VIN, p_R, p_N) \
NET_REGISTER_DEV(R2R_DAC, name) \
diff --git a/src/lib/netlist/devices/nld_schmitt.cpp b/src/lib/netlist/devices/nld_schmitt.cpp
index 4bc41075f89..f219d215520 100644
--- a/src/lib/netlist/devices/nld_schmitt.cpp
+++ b/src/lib/netlist/devices/nld_schmitt.cpp
@@ -7,10 +7,10 @@
#include "nld_schmitt.h"
-#include "../nl_base.h"
-#include "../nl_errstr.h"
-#include "../analog/nlid_twoterm.h"
-#include "../solver/nld_solver.h"
+#include "netlist/analog/nlid_twoterm.h"
+#include "netlist/nl_base.h"
+#include "netlist/nl_errstr.h"
+#include "netlist/solver/nld_solver.h"
#include <cmath>
@@ -82,11 +82,11 @@ namespace netlist
NETLIB_RESETI()
{
m_last_state = 1;
- m_RVI.do_reset();
- m_RVO.do_reset();
+ m_RVI.reset();
+ m_RVO.reset();
m_is_timestep = m_RVO.m_P.net().solver()->has_timestep_devices();
- m_RVI.set(NL_FCONST(1.0) / m_model.m_RI, m_model.m_VI, 0.0);
- m_RVO.set(NL_FCONST(1.0) / m_model.m_ROL, m_model.m_VOL, 0.0);
+ m_RVI.set_G_V_I(plib::constants<nl_double>::one() / m_model.m_RI, m_model.m_VI, 0.0);
+ m_RVO.set_G_V_I(plib::constants<nl_double>::one() / m_model.m_ROL, m_model.m_VOL, 0.0);
}
NETLIB_UPDATEI()
@@ -97,9 +97,9 @@ namespace netlist
{
m_last_state = 0;
if (m_is_timestep)
- m_RVO.update_dev();
- m_RVO.set(NL_FCONST(1.0) / m_model.m_ROH, m_model.m_VOH, 0.0);
- m_RVO.m_P.schedule_solve_after(NLTIME_FROM_NS(1));
+ m_RVO.update();
+ m_RVO.set_G_V_I(plib::constants<nl_double>::one() / m_model.m_ROH, m_model.m_VOH, 0.0);
+ m_RVO.solve_later();
}
}
else
@@ -108,9 +108,9 @@ namespace netlist
{
m_last_state = 1;
if (m_is_timestep)
- m_RVO.update_dev();
- m_RVO.set(NL_FCONST(1.0) / m_model.m_ROL, m_model.m_VOL, 0.0);
- m_RVO.m_P.schedule_solve_after(NLTIME_FROM_NS(1));
+ m_RVO.update();
+ m_RVO.set_G_V_I(plib::constants<nl_double>::one() / m_model.m_ROL, m_model.m_VOL, 0.0);
+ m_RVO.solve_later();
}
}
}
@@ -125,7 +125,7 @@ namespace netlist
bool m_is_timestep;
};
- NETLIB_DEVICE_IMPL(schmitt_trigger)
+ NETLIB_DEVICE_IMPL(schmitt_trigger, "SCHMITT_TRIGGER", "MODEL")
} // namespace devices
} // namespace netlist
diff --git a/src/lib/netlist/devices/nld_schmitt.h b/src/lib/netlist/devices/nld_schmitt.h
index ecce59be616..20666b29cf7 100644
--- a/src/lib/netlist/devices/nld_schmitt.h
+++ b/src/lib/netlist/devices/nld_schmitt.h
@@ -11,7 +11,7 @@
#define NLD_SCHMITT_H_
-#include "../nl_setup.h"
+#include "netlist/nl_setup.h"
// ----------------------------------------------------------------------------------------
// Macros
diff --git a/src/lib/netlist/devices/nld_system.cpp b/src/lib/netlist/devices/nld_system.cpp
index eabc4b4fbff..03aa5c678f1 100644
--- a/src/lib/netlist/devices/nld_system.cpp
+++ b/src/lib/netlist/devices/nld_system.cpp
@@ -5,8 +5,8 @@
*
*/
-#include "../solver/nld_solver.h"
-#include "../solver/nld_matrix_solver.h"
+#include "netlist/solver/nld_solver.h"
+#include "netlist/solver/nld_matrix_solver.h"
#include "nlid_system.h"
namespace netlist
@@ -40,54 +40,40 @@ namespace netlist
{
m_cnt = 0;
m_off = netlist_time::from_double(m_offset());
+ m_feedback.m_delegate = NETLIB_DELEGATE(extclock, update);
+
+ //m_feedback.m_delegate .set(&NETLIB_NAME(extclock)::update, this);
//m_Q.initial(0);
}
- NETLIB_UPDATE(extclock)
+ NETLIB_HANDLER(extclock, clk2)
{
- m_Q.push((m_cnt & 1) ^ 1, m_inc[m_cnt] + m_off);
- m_off = netlist_time::zero();
+ m_Q.push((m_cnt & 1) ^ 1, m_inc[m_cnt]);
if (++m_cnt >= m_size)
m_cnt = 0;
}
- // ----------------------------------------------------------------------------------------
- // logic_input
- // ----------------------------------------------------------------------------------------
-
- NETLIB_RESET(logic_input)
- {
- m_Q.initial(0);
- }
-
- NETLIB_UPDATE(logic_input)
+ NETLIB_HANDLER(extclock, clk2_pow2)
{
- m_Q.push(m_IN() & 1, netlist_time::from_nsec(1));
+ m_Q.push((m_cnt & 1) ^ 1, m_inc[m_cnt]);
+ m_cnt = (++m_cnt) & (m_size-1);
}
- NETLIB_UPDATE_PARAM(logic_input)
- {
- }
-
- // ----------------------------------------------------------------------------------------
- // analog_input
- // ----------------------------------------------------------------------------------------
-
- NETLIB_RESET(analog_input)
+ NETLIB_UPDATE(extclock)
{
- m_Q.initial(0.0);
- }
+ m_Q.push((m_cnt & 1) ^ 1, m_inc[m_cnt] + m_off);
+ m_off = netlist_time::zero();
+ if (++m_cnt >= m_size)
+ m_cnt = 0;
- NETLIB_UPDATE(analog_input)
- {
- m_Q.push(m_IN());
- }
+ // continue with optimized clock handlers ....
- NETLIB_UPDATE_PARAM(analog_input)
- {
+ if ((m_size & (m_size-1)) == 0) // power of 2?
+ m_feedback.m_delegate.set(&NETLIB_NAME(extclock)::clk2_pow2, this);
+ else
+ m_feedback.m_delegate.set(&NETLIB_NAME(extclock)::clk2, this);
}
-
// -----------------------------------------------------------------------------
// nld_res_sw
// -----------------------------------------------------------------------------
@@ -106,19 +92,10 @@ namespace netlist
m_last_state = state;
const nl_double R = state ? m_RON() : m_ROFF();
- // We only need to update the net first if this is a time stepping net
- if ((0)) // m_R->m_P.net().as_analog().solver()->is_timestep())
- {
- m_R.update_dev();
- m_R.set_R(R);
- m_R.m_P.schedule_solve_after(NLTIME_FROM_NS(1));
- }
- else
- {
- m_R.set_R(R);
- m_R.m_P.schedule_solve_after(NLTIME_FROM_NS(1));
- //m_R->update_dev();
- }
+ // FIXME: We only need to update the net first if this is a time stepping net
+ m_R.update();
+ m_R.set_R(R);
+ m_R.solve_later();
}
}
@@ -141,17 +118,19 @@ namespace netlist
}
- NETLIB_DEVICE_IMPL(dummy_input)
- NETLIB_DEVICE_IMPL(frontier)
- NETLIB_DEVICE_IMPL(function)
- NETLIB_DEVICE_IMPL(logic_input)
- NETLIB_DEVICE_IMPL(analog_input)
- NETLIB_DEVICE_IMPL(clock)
- NETLIB_DEVICE_IMPL(extclock)
- NETLIB_DEVICE_IMPL(res_sw)
- NETLIB_DEVICE_IMPL(mainclock)
- NETLIB_DEVICE_IMPL(gnd)
- NETLIB_DEVICE_IMPL(netlistparams)
+ NETLIB_DEVICE_IMPL(dummy_input, "DUMMY_INPUT", "")
+ NETLIB_DEVICE_IMPL(frontier, "FRONTIER_DEV", "+I,+G,+Q")
+ NETLIB_DEVICE_IMPL(function, "AFUNC", "N,FUNC")
+ NETLIB_DEVICE_IMPL(analog_input, "ANALOG_INPUT", "IN")
+ NETLIB_DEVICE_IMPL(clock, "CLOCK", "FREQ")
+ NETLIB_DEVICE_IMPL(extclock, "EXTCLOCK", "FREQ,PATTERN")
+ NETLIB_DEVICE_IMPL(res_sw, "RES_SWITCH", "+IN,+P1,+P2")
+ NETLIB_DEVICE_IMPL(mainclock, "MAINCLOCK", "FREQ")
+ NETLIB_DEVICE_IMPL(gnd, "GND", "")
+ NETLIB_DEVICE_IMPL(netlistparams, "PARAMETER", "")
+
+ NETLIB_DEVICE_IMPL(logic_input, "LOGIC_INPUT", "IN,FAMILY")
+ NETLIB_DEVICE_IMPL_ALIAS(logic_input_ttl, logic_input, "TTL_INPUT", "IN")
} //namespace devices
} // namespace netlist
diff --git a/src/lib/netlist/devices/nld_system.h b/src/lib/netlist/devices/nld_system.h
index 69a7c75dbf3..5158e098cfa 100644
--- a/src/lib/netlist/devices/nld_system.h
+++ b/src/lib/netlist/devices/nld_system.h
@@ -9,7 +9,7 @@
#ifndef NLD_SYSTEM_H_
#define NLD_SYSTEM_H_
-#include "../nl_setup.h"
+#include "netlist/nl_setup.h"
// -----------------------------------------------------------------------------
// Macros
diff --git a/src/lib/netlist/devices/nld_tms4800.cpp b/src/lib/netlist/devices/nld_tms4800.cpp
index 29a9bd836ab..24729b10e72 100644
--- a/src/lib/netlist/devices/nld_tms4800.cpp
+++ b/src/lib/netlist/devices/nld_tms4800.cpp
@@ -6,7 +6,7 @@
*/
#include "nld_tms4800.h"
-#include "../nl_base.h"
+#include "netlist/nl_base.h"
namespace netlist
{
@@ -39,9 +39,9 @@ namespace netlist
param_rom_t<uint8_t, 11, 8> m_ROM; // 16 Kbits, used as 2 Kbit x 8
};
- NETLIB_OBJECT_DERIVED(tms4800_dip, TMS4800)
+ NETLIB_OBJECT_DERIVED(TMS4800_dip, TMS4800)
{
- NETLIB_CONSTRUCTOR_DERIVED(tms4800_dip, TMS4800)
+ NETLIB_CONSTRUCTOR_DERIVED(TMS4800_dip, TMS4800)
{
register_subalias("2", m_A[0]);
register_subalias("3", m_A[1]);
@@ -97,8 +97,8 @@ namespace netlist
}
}
- NETLIB_DEVICE_IMPL(TMS4800)
- NETLIB_DEVICE_IMPL(tms4800_dip)
+ NETLIB_DEVICE_IMPL(TMS4800, "ROM_TMS4800", "+AR,+OE1,+OE2,+A0,+A1,+A2,+A3,+A4,+A5,+A6,+A7,+A8,+A9,+A10")
+ NETLIB_DEVICE_IMPL(TMS4800_dip, "ROM_TMS4800_DIP", "")
} //namespace devices
} // namespace netlist
diff --git a/src/lib/netlist/devices/nld_tms4800.h b/src/lib/netlist/devices/nld_tms4800.h
index dc72354cb03..c5bcd1337f0 100644
--- a/src/lib/netlist/devices/nld_tms4800.h
+++ b/src/lib/netlist/devices/nld_tms4800.h
@@ -28,7 +28,7 @@
#ifndef NLD_TMS4800_H_
#define NLD_TMS4800_H_
-#include "../nl_setup.h"
+#include "netlist/nl_setup.h"
#define ROM_TMS4800(name, cAR, cOE1, cOE2, cA0, cA1, cA2, cA3, cA4, cA5, cA6, cA7, cA8, cA9, cA10) \
NET_REGISTER_DEV(ROM_TMS4800, name) \
diff --git a/src/lib/netlist/devices/nld_tristate.cpp b/src/lib/netlist/devices/nld_tristate.cpp
index 74fbb206feb..b05d09ea71e 100644
--- a/src/lib/netlist/devices/nld_tristate.cpp
+++ b/src/lib/netlist/devices/nld_tristate.cpp
@@ -6,7 +6,7 @@
*/
#include "nld_tristate.h"
-#include "../nl_base.h"
+#include "netlist/nl_base.h"
namespace netlist
{
@@ -70,8 +70,8 @@ namespace netlist
m_Q.push(q, NLTIME_FROM_NS(1));
}
- NETLIB_DEVICE_IMPL(tristate)
- NETLIB_DEVICE_IMPL(tristate3)
+ NETLIB_DEVICE_IMPL(tristate, "TTL_TRISTATE", "+CEQ1,+D1,+CEQ2,+D2")
+ NETLIB_DEVICE_IMPL(tristate3, "TTL_TRISTATE3", "")
} //namespace devices
} // namespace netlist
diff --git a/src/lib/netlist/devices/nld_tristate.h b/src/lib/netlist/devices/nld_tristate.h
index a5ff22fac96..71f97d9812d 100644
--- a/src/lib/netlist/devices/nld_tristate.h
+++ b/src/lib/netlist/devices/nld_tristate.h
@@ -10,7 +10,7 @@
#ifndef NLD_TRISTATE_H_
#define NLD_TRISTATE_H_
-#include "../nl_setup.h"
+#include "netlist/nl_setup.h"
#define TTL_TRISTATE(name, cCEQ1, cD1, cCEQ2, cD2) \
NET_REGISTER_DEV(TTL_TRISTATE, name) \
diff --git a/src/lib/netlist/devices/nlid_cmos.h b/src/lib/netlist/devices/nlid_cmos.h
index f9999aebcc0..d91d691453a 100644
--- a/src/lib/netlist/devices/nlid_cmos.h
+++ b/src/lib/netlist/devices/nlid_cmos.h
@@ -8,8 +8,8 @@
#ifndef NLID_CMOS_H_
#define NLID_CMOS_H_
-#include "../nl_setup.h"
-#include "../nl_base.h"
+#include "netlist/nl_base.h"
+#include "netlist/nl_setup.h"
namespace netlist
{
diff --git a/src/lib/netlist/devices/nlid_proxy.cpp b/src/lib/netlist/devices/nlid_proxy.cpp
index 4c3ec6f67aa..a2fd18e85a7 100644
--- a/src/lib/netlist/devices/nlid_proxy.cpp
+++ b/src/lib/netlist/devices/nlid_proxy.cpp
@@ -6,7 +6,7 @@
*/
#include "nlid_proxy.h"
-#include "../solver/nld_solver.h"
+#include "netlist/solver/nld_solver.h"
//#include "plib/pstream.h"
//#include "plib/pfmtlog.h"
//#include "nld_log.h"
@@ -20,7 +20,7 @@ namespace netlist
// nld_base_proxy
// -----------------------------------------------------------------------------
- nld_base_proxy::nld_base_proxy(netlist_t &anetlist, const pstring &name,
+ nld_base_proxy::nld_base_proxy(netlist_state_t &anetlist, const pstring &name,
logic_t *inout_proxied, detail::core_terminal_t *proxy_inout)
: device_t(anetlist, name)
{
@@ -29,33 +29,23 @@ namespace netlist
m_proxy_term = proxy_inout;
}
- nld_base_proxy::~nld_base_proxy()
- {
- }
-
// ----------------------------------------------------------------------------------------
// nld_a_to_d_proxy
// ----------------------------------------------------------------------------------------
- nld_base_a_to_d_proxy::nld_base_a_to_d_proxy(netlist_t &anetlist, const pstring &name,
+ nld_base_a_to_d_proxy::nld_base_a_to_d_proxy(netlist_state_t &anetlist, const pstring &name,
logic_input_t *in_proxied, detail::core_terminal_t *in_proxy)
: nld_base_proxy(anetlist, name, in_proxied, in_proxy)
, m_Q(*this, "Q")
{
}
- nld_base_a_to_d_proxy::~nld_base_a_to_d_proxy() {}
-
- nld_a_to_d_proxy::nld_a_to_d_proxy(netlist_t &anetlist, const pstring &name, logic_input_t *in_proxied)
+ nld_a_to_d_proxy::nld_a_to_d_proxy(netlist_state_t &anetlist, const pstring &name, logic_input_t *in_proxied)
: nld_base_a_to_d_proxy(anetlist, name, in_proxied, &m_I)
, m_I(*this, "I")
{
}
- nld_a_to_d_proxy::~nld_a_to_d_proxy()
- {
- }
-
NETLIB_RESET(a_to_d_proxy)
{
}
@@ -81,39 +71,32 @@ namespace netlist
// nld_d_to_a_proxy
// ----------------------------------------------------------------------------------------
- nld_base_d_to_a_proxy::nld_base_d_to_a_proxy(netlist_t &anetlist, const pstring &name,
+ nld_base_d_to_a_proxy::nld_base_d_to_a_proxy(netlist_state_t &anetlist, const pstring &name,
logic_output_t *out_proxied, detail::core_terminal_t &proxy_out)
: nld_base_proxy(anetlist, name, out_proxied, &proxy_out)
, m_I(*this, "I")
{
}
- nld_base_d_to_a_proxy::~nld_base_d_to_a_proxy()
- {
- }
-
- nld_d_to_a_proxy::nld_d_to_a_proxy(netlist_t &anetlist, const pstring &name, logic_output_t *out_proxied)
+ nld_d_to_a_proxy::nld_d_to_a_proxy(netlist_state_t &anetlist, const pstring &name, logic_output_t *out_proxied)
: nld_base_d_to_a_proxy(anetlist, name, out_proxied, m_RV.m_P)
, m_GNDHack(*this, "_Q")
, m_RV(*this, "RV")
, m_last_state(*this, "m_last_var", -1)
, m_is_timestep(false)
{
- const pstring power_syms[3][2] ={ {"VCC", "VEE"}, {"VCC", "GND"}, {"VDD", "VSS"}};
- //register_sub(m_RV);
- //register_term("1", m_RV.m_P);
- //register_term("2", m_RV.m_N);
+ const std::vector<std::pair<pstring, pstring>> power_syms = { {"VCC", "VEE"}, {"VCC", "GND"}, {"VDD", "VSS"}};
register_subalias("Q", m_RV.m_P);
connect(m_RV.m_N, m_GNDHack);
bool f = false;
- for (int i = 0; i < 3; i++)
+ for (auto & pwr_sym : power_syms)
{
pstring devname = out_proxied->device().name();
- auto tp = netlist().setup().find_terminal(devname + "." + power_syms[i][0],
+ auto tp = setup().find_terminal(devname + "." + pwr_sym.first,
detail::terminal_type::INPUT, false);
- auto tn = netlist().setup().find_terminal(devname + "." + power_syms[i][1],
+ auto tn = setup().find_terminal(devname + "." + pwr_sym.second,
detail::terminal_type::INPUT, false);
if (tp != nullptr && tn != nullptr)
{
@@ -126,11 +109,6 @@ namespace netlist
log().warning(MW_1_NO_POWER_TERMINALS_ON_DEVICE_1, out_proxied->device().name());
else
log().verbose("D/A Proxy: Found power terminals on device {1}", out_proxied->device().name());
-#if (0)
- printf("%s %s\n", out_proxied->name().c_str(), out_proxied->device().name().c_str());
- auto x = netlist().setup().find_terminal(out_proxied->name(), detail::device_object_t::terminal_type::OUTPUT, false);
- if (x) printf("==> %s\n", x->name().c_str());
-#endif
}
@@ -142,15 +120,15 @@ namespace netlist
//m_Q.initial(0.0);
m_last_state = -1;
- m_RV.do_reset();
+ m_RV.reset();
m_is_timestep = m_RV.m_P.net().solver()->has_timestep_devices();
- m_RV.set(NL_FCONST(1.0) / logic_family()->R_low(),
+ m_RV.set_G_V_I(plib::constants<nl_double>::one() / logic_family()->R_low(),
logic_family()->low_V(0.0, supply_V), 0.0);
}
NETLIB_UPDATE(d_to_a_proxy)
{
- const int state = static_cast<int>(m_I());
+ const auto state = static_cast<int>(m_I());
if (state != m_last_state)
{
// FIXME: Variable voltage
@@ -163,10 +141,10 @@ namespace netlist
// We only need to update the net first if this is a time stepping net
if (m_is_timestep)
{
- m_RV.update_dev();
+ m_RV.update();
}
- m_RV.set(NL_FCONST(1.0) / R, V, 0.0);
- m_RV.m_P.schedule_solve_after(NLTIME_FROM_NS(1));
+ m_RV.set_G_V_I(plib::constants<nl_double>::one() / R, V, 0.0);
+ m_RV.solve_later();
}
}
diff --git a/src/lib/netlist/devices/nlid_proxy.h b/src/lib/netlist/devices/nlid_proxy.h
index 821cfa56d9d..9543b8db234 100644
--- a/src/lib/netlist/devices/nlid_proxy.h
+++ b/src/lib/netlist/devices/nlid_proxy.h
@@ -11,8 +11,8 @@
#ifndef NLID_PROXY_H_
#define NLID_PROXY_H_
-#include "../nl_setup.h"
-#include "../analog/nlid_twoterm.h"
+#include "netlist/analog/nlid_twoterm.h"
+#include "netlist/nl_setup.h"
namespace netlist
{
@@ -26,11 +26,9 @@ namespace netlist
NETLIB_OBJECT(base_proxy)
{
public:
- nld_base_proxy(netlist_t &anetlist, const pstring &name,
+ nld_base_proxy(netlist_state_t &anetlist, const pstring &name,
logic_t *inout_proxied, detail::core_terminal_t *proxy_inout);
- virtual ~nld_base_proxy();
-
logic_t &term_proxied() const { return *m_term_proxied; }
detail::core_terminal_t &proxy_term() const { return *m_proxy_term; }
@@ -49,13 +47,11 @@ namespace netlist
{
public:
- virtual ~nld_base_a_to_d_proxy();
-
virtual logic_output_t &out() { return m_Q; }
protected:
- nld_base_a_to_d_proxy(netlist_t &anetlist, const pstring &name,
+ nld_base_a_to_d_proxy(netlist_state_t &anetlist, const pstring &name,
logic_input_t *in_proxied, detail::core_terminal_t *in_proxy);
private:
@@ -67,9 +63,7 @@ namespace netlist
NETLIB_OBJECT_DERIVED(a_to_d_proxy, base_a_to_d_proxy)
{
public:
- nld_a_to_d_proxy(netlist_t &anetlist, const pstring &name, logic_input_t *in_proxied);
-
- virtual ~nld_a_to_d_proxy() override;
+ nld_a_to_d_proxy(netlist_state_t &anetlist, const pstring &name, logic_input_t *in_proxied);
analog_input_t m_I;
@@ -88,24 +82,20 @@ namespace netlist
NETLIB_OBJECT_DERIVED(base_d_to_a_proxy, base_proxy)
{
public:
- virtual ~nld_base_d_to_a_proxy();
virtual logic_input_t &in() { return m_I; }
protected:
- nld_base_d_to_a_proxy(netlist_t &anetlist, const pstring &name,
+ nld_base_d_to_a_proxy(netlist_state_t &anetlist, const pstring &name,
logic_output_t *out_proxied, detail::core_terminal_t &proxy_out);
logic_input_t m_I;
-
- private:
};
NETLIB_OBJECT_DERIVED(d_to_a_proxy, base_d_to_a_proxy)
{
public:
- nld_d_to_a_proxy(netlist_t &anetlist, const pstring &name, logic_output_t *out_proxied);
- virtual ~nld_d_to_a_proxy() override {}
+ nld_d_to_a_proxy(netlist_state_t &anetlist, const pstring &name, logic_output_t *out_proxied);
protected:
diff --git a/src/lib/netlist/devices/nlid_system.h b/src/lib/netlist/devices/nlid_system.h
index 326cd3dbf2c..f1f2af1b31e 100644
--- a/src/lib/netlist/devices/nlid_system.h
+++ b/src/lib/netlist/devices/nlid_system.h
@@ -11,10 +11,10 @@
#ifndef NLID_SYSTEM_H_
#define NLID_SYSTEM_H_
-#include "../nl_base.h"
-#include "../nl_setup.h"
-#include "../analog/nlid_twoterm.h"
-#include "../plib/putil.h"
+#include "netlist/analog/nlid_twoterm.h"
+#include "netlist/nl_base.h"
+#include "netlist/nl_setup.h"
+#include "plib/putil.h"
namespace netlist
{
@@ -27,7 +27,8 @@ namespace netlist
NETLIB_OBJECT(netlistparams)
{
NETLIB_CONSTRUCTOR(netlistparams)
- , m_use_deactivate(*this, "USE_DEACTIVATE", 0)
+ , m_use_deactivate(*this, "USE_DEACTIVATE", false)
+ , m_startup_strategy(*this, "STARTUP_STRATEGY", 1)
{
}
NETLIB_UPDATEI() { }
@@ -35,6 +36,7 @@ namespace netlist
//NETLIB_UPDATE_PARAMI() { }
public:
param_logic_t m_use_deactivate;
+ param_int_t m_startup_strategy;
};
// -----------------------------------------------------------------------------
@@ -52,7 +54,7 @@ namespace netlist
NETLIB_RESETI()
{
- m_Q.net().set_time(netlist_time::zero());
+ m_Q.net().set_next_scheduled_time(netlist_time::zero());
}
NETLIB_UPDATE_PARAMI()
@@ -65,16 +67,14 @@ namespace netlist
logic_net_t &net = m_Q.net();
// this is only called during setup ...
net.toggle_new_Q();
- net.set_time(netlist().time() + m_inc);
+ net.set_next_scheduled_time(exec().time() + m_inc);
}
public:
logic_output_t m_Q;
-
- param_double_t m_freq;
netlist_time m_inc;
-
- inline static void mc_update(logic_net_t &net);
+ private:
+ param_double_t m_freq;
};
// -----------------------------------------------------------------------------
@@ -96,7 +96,7 @@ namespace netlist
//NETLIB_RESETI();
NETLIB_UPDATE_PARAMI();
- protected:
+ private:
logic_input_t m_feedback;
logic_output_t m_Q;
@@ -127,31 +127,35 @@ namespace netlist
std::vector<pstring> pat(plib::psplit(m_pattern(),","));
m_off = netlist_time::from_double(m_offset());
- unsigned long pati[32];
- for (int pI = 0; pI < 32; pI++)
- {
- pati[pI] = 0;
- }
+ std::array<std::int64_t, 32> pati = { 0 };
+
m_size = static_cast<std::uint8_t>(pat.size());
- unsigned long total = 0;
+ netlist_time::mult_type total = 0;
for (unsigned i=0; i<m_size; i++)
{
- pati[i] = static_cast<unsigned long>(pat[i].as_long());
+ // FIXME: use pstonum_ne
+ //pati[i] = plib::pstonum<decltype(pati[i])>(pat[i]);
+ pati[i] = plib::pstonum<std::int64_t>(pat[i]);
total += pati[i];
}
netlist_time ttotal = netlist_time::zero();
- for (unsigned i=0; i<m_size - 1; i++)
+ auto sm1 = static_cast<uint8_t>(m_size - 1);
+ for (unsigned i=0; i < sm1; i++)
{
m_inc[i] = base * pati[i];
ttotal += m_inc[i];
}
- m_inc[m_size - 1] = base * total - ttotal;
+ m_inc[sm1] = base * total - ttotal;
}
}
NETLIB_UPDATEI();
NETLIB_RESETI();
//NETLIB_UPDATE_PARAMI();
- protected:
+
+ NETLIB_HANDLERI(clk2);
+ NETLIB_HANDLERI(clk2_pow2);
+
+ private:
param_double_t m_freq;
param_str_t m_pattern;
@@ -162,7 +166,7 @@ namespace netlist
state_var_u8 m_cnt;
std::uint8_t m_size;
state_var<netlist_time> m_off;
- netlist_time m_inc[32];
+ std::array<netlist_time, 32> m_inc;
};
// -----------------------------------------------------------------------------
@@ -173,20 +177,19 @@ namespace netlist
{
NETLIB_CONSTRUCTOR(logic_input)
, m_Q(*this, "Q")
- , m_IN(*this, "IN", 0)
+ , m_IN(*this, "IN", false)
/* make sure we get the family first */
, m_FAMILY(*this, "FAMILY", "FAMILY(TYPE=TTL)")
{
set_logic_family(setup().family_from_model(m_FAMILY()));
+ m_Q.set_logic_family(this->logic_family());
}
- NETLIB_UPDATE_AFTER_PARAM_CHANGE()
-
- NETLIB_UPDATEI();
- NETLIB_RESETI();
- NETLIB_UPDATE_PARAMI();
+ NETLIB_UPDATEI() { }
+ NETLIB_RESETI() { m_Q.initial(0); }
+ NETLIB_UPDATE_PARAMI() { m_Q.push(m_IN() & 1, netlist_time::from_nsec(1)); }
- protected:
+ private:
logic_output_t m_Q;
param_logic_t m_IN;
@@ -200,12 +203,12 @@ namespace netlist
, m_IN(*this, "IN", 0.0)
{
}
- NETLIB_UPDATE_AFTER_PARAM_CHANGE()
- NETLIB_UPDATEI();
- NETLIB_RESETI();
- NETLIB_UPDATE_PARAMI();
- protected:
+ NETLIB_UPDATEI() { }
+ NETLIB_RESETI() { m_Q.initial(0.0); }
+ NETLIB_UPDATE_PARAMI() { m_Q.push(m_IN()); }
+
+ private:
analog_output_t m_Q;
param_double_t m_IN;
};
@@ -278,8 +281,8 @@ namespace netlist
NETLIB_RESETI()
{
- m_RIN.set(1.0 / m_p_RIN(),0,0);
- m_ROUT.set(1.0 / m_p_ROUT(),0,0);
+ m_RIN.set_G_V_I(1.0 / m_p_RIN(),0,0);
+ m_ROUT.set_G_V_I(1.0 / m_p_ROUT(),0,0);
}
NETLIB_UPDATEI()
@@ -310,13 +313,13 @@ namespace netlist
, m_N(*this, "N", 1)
, m_func(*this, "FUNC", "A0")
, m_Q(*this, "Q")
- , m_compiled(this->name() + ".FUNCC", this, this->netlist().state())
+ , m_compiled(this->name() + ".FUNCC", this, this->state().run_state_manager())
{
std::vector<pstring> inps;
for (int i=0; i < m_N(); i++)
{
pstring n = plib::pfmt("A{1}")(i);
- m_I.push_back(plib::make_unique<analog_input_t>(*this, n));
+ m_I.push_back(pool().make_poolptr<analog_input_t>(*this, n));
inps.push_back(n);
m_vals.push_back(0.0);
}
@@ -333,7 +336,7 @@ namespace netlist
param_int_t m_N;
param_str_t m_func;
analog_output_t m_Q;
- std::vector<std::unique_ptr<analog_input_t>> m_I;
+ std::vector<pool_owned_ptr<analog_input_t>> m_I;
std::vector<double> m_vals;
plib::pfunction m_compiled;
@@ -357,16 +360,17 @@ namespace netlist
register_subalias("2", m_R.m_N);
}
+ NETLIB_RESETI();
+ //NETLIB_UPDATE_PARAMI();
+ NETLIB_UPDATEI();
+
analog::NETLIB_SUB(R_base) m_R;
logic_input_t m_I;
param_double_t m_RON;
param_double_t m_ROFF;
- NETLIB_RESETI();
- //NETLIB_UPDATE_PARAMI();
- NETLIB_UPDATEI();
-
private:
+
state_var<netlist_sig_t> m_last_state;
};
diff --git a/src/lib/netlist/devices/nlid_truthtable.cpp b/src/lib/netlist/devices/nlid_truthtable.cpp
index bf7d03fe3d7..2221d855880 100644
--- a/src/lib/netlist/devices/nlid_truthtable.cpp
+++ b/src/lib/netlist/devices/nlid_truthtable.cpp
@@ -6,9 +6,9 @@
*/
#include "nlid_truthtable.h"
-#include "../plib/plists.h"
-#include "../nl_setup.h"
-#include "../plib/palloc.h"
+#include "netlist/nl_setup.h"
+#include "plib/palloc.h"
+#include "plib/plists.h"
#include <bitset>
@@ -24,7 +24,7 @@ namespace netlist
template <typename T>
struct sbitset
{
- typedef T type;
+ using type = T;
sbitset() : m_bs(0) { }
/* explicit */ sbitset(T v) : m_bs(v) { }
@@ -77,8 +77,8 @@ namespace netlist
return ret;
}
- static constexpr sbitset all_bits() { return sbitset(~static_cast<T>(0)); }
- static constexpr sbitset no_bits() { return sbitset(static_cast<T>(0)); }
+ static constexpr const sbitset all_bits() noexcept { return sbitset(~static_cast<T>(0)); }
+ static constexpr const sbitset no_bits() noexcept{ return sbitset(static_cast<T>(0)); }
private:
T m_bs;
};
@@ -122,8 +122,18 @@ namespace netlist
}
}
- uint_least64_t mask() const { return static_cast<uint_least64_t>(-1); }
-
+ uint_least64_t mask() const
+ {
+ switch (m_size)
+ {
+ case 8: return static_cast<uint_least8_t>(-1);
+ case 16: return static_cast<uint_least16_t>(-1);
+ case 32: return static_cast<uint_least32_t>(-1);
+ case 64: return static_cast<uint_least64_t>(-1);
+ default:
+ return 0; //should never happen
+ }
+ }
private:
void *m_data;
size_t m_size;
@@ -134,7 +144,7 @@ namespace netlist
truthtable_parser(unsigned NO, unsigned NI, bool *initialized,
packed_int outs, uint_least8_t *timing, netlist_time *timing_nt)
: m_NO(NO), m_NI(NI), m_initialized(initialized),
- m_outs(outs), m_timing(timing), m_timing_nt(timing_nt),
+ m_out_state(outs), m_timing(timing), m_timing_nt(timing_nt),
m_num_bits(m_NI),
m_size(1 << (m_num_bits))
{
@@ -151,7 +161,7 @@ namespace netlist
unsigned m_NO;
unsigned m_NI;
bool *m_initialized;
- packed_int m_outs;
+ packed_int m_out_state;
uint_least8_t *m_timing;
netlist_time *m_timing_nt;
@@ -178,51 +188,27 @@ namespace netlist
nl_assert_always(io.size() == 2, "too many '|'");
std::vector<pstring> inout(plib::psplit(io[0], ","));
nl_assert_always(inout.size() == m_num_bits, "bitcount wrong");
- std::vector<pstring> out(plib::psplit(io[1], ","));
- nl_assert_always(out.size() == m_NO, "output count wrong");
+ std::vector<pstring> outputs(plib::psplit(io[1], ","));
+ nl_assert_always(outputs.size() == m_NO, "output count wrong");
for (std::size_t i=0; i < m_NI; i++)
{
- inout[i] = inout[i].trim();
+ inout[i] = plib::trim(inout[i]);
m_I.emplace(i, *this, inout[i]);
}
for (std::size_t i=0; i < m_NO; i++)
{
- out[i] = out[i].trim();
- m_Q.emplace(i, *this, out[i]);
- }
- // Connect output "Q" to input "_Q" if this exists
- // This enables timed state without having explicit state ....
- tt_bitset disabled_ignore = 0;
- for (std::size_t i=0; i < m_NO; i++)
- {
- pstring tmp = "_" + out[i];
+ outputs[i] = plib::trim(outputs[i]);
+ m_Q.emplace(i, *this, outputs[i]);
+ // Connect output "Q" to input "_Q" if this exists
+ // This enables timed state without having explicit state ....
+ pstring tmp = "_" + outputs[i];
const std::size_t idx = plib::container::indexof(inout, tmp);
if (idx != plib::container::npos)
- {
connect(m_Q[i], m_I[idx]);
- // disable ignore for theses inputs altogether.
- // FIXME: This shouldn't be necessary
- disabled_ignore.set(idx);
- }
}
m_ign = 0;
-
-#if 0
- for (size_t i=0; i<m_size; i++)
- {
- m_ttp.m_outs[i] &= ~(disabled_ignore << m_NO);
- }
-#endif
-#if 0
- printf("%s\n", name().c_str());
- for (int j=0; j < m_size; j++)
- printf("%05x %04x %04x %04x\n", j, m_ttp->m_outs[j] & ((1 << m_NO)-1),
- m_ttp->m_outs[j] >> m_NO, m_ttp->m_timing[j * m_NO + 0]);
- for (int k=0; m_ttp->m_timing_nt[k] != netlist_time::zero(); k++)
- printf("%d %f\n", k, m_ttp->m_timing_nt[k].as_double() * 1000000.0);
-#endif
}
// ----------------------------------------------------------------------------------------
@@ -238,15 +224,20 @@ namespace netlist
: netlist_base_factory_truthtable_t(name, classname, def_param, sourcefile)
{ }
- plib::owned_ptr<device_t> Create(netlist_t &anetlist, const pstring &name) override
+ pool_owned_ptr<device_t> Create(netlist_state_t &anetlist, const pstring &name) override
{
- typedef nld_truthtable_t<m_NI, m_NO> tt_type;
+ using tt_type = nld_truthtable_t<m_NI, m_NO>;
truthtable_parser desc_s(m_NO, m_NI, &m_ttbl.m_initialized,
- packed_int(m_ttbl.m_outs, sizeof(m_ttbl.m_outs[0]) * 8),
- m_ttbl.m_timing, m_ttbl.m_timing_nt);
+ packed_int(m_ttbl.m_out_state.data(), sizeof(m_ttbl.m_out_state[0]) * 8),
+ m_ttbl.m_timing_index.data(), m_ttbl.m_timing_nt.data());
desc_s.parse(m_desc);
- return plib::owned_ptr<device_t>::Create<tt_type>(anetlist, name, m_family, m_ttbl, m_desc);
+
+ /* update truthtable family definitions */
+ if (m_family_name != "")
+ m_family_desc = anetlist.setup().family_from_model(m_family_name);
+
+ return pool().make_poolptr<tt_type>(anetlist, name, m_family_desc, m_ttbl, m_desc);
}
private:
typename nld_truthtable_t<m_NI, m_NO>::truthtable_t m_ttbl;
@@ -259,7 +250,7 @@ namespace netlist
for (std::size_t j=0; j<m_NI; j++)
{
// if changing the input directly doesn't change outputs we can ignore
- if (m_outs[state] == m_outs[tt_bitset(state).set(j)])
+ if (m_out_state[state] == m_out_state[tt_bitset(state).set(j)])
ignore.set(j);
}
@@ -285,7 +276,7 @@ namespace netlist
{
tt_bitset b = tign.expand_and(k);
// will any of the inputs ignored change the output if changed?
- if (m_outs[state] != m_outs[(state & tign.invert()) | b])
+ if (m_out_state[state] != m_out_state[(state & tign.invert()) | b])
{
t[j] = true;
break;
@@ -318,21 +309,21 @@ namespace netlist
void truthtable_parser::parseline(unsigned cur, std::vector<pstring> list,
tt_bitset state, uint_least64_t val, std::vector<uint_least8_t> &timing_index)
{
- pstring elem = list[cur].trim();
+ pstring elem = plib::trim(list[cur]);
uint_least64_t start = 0;
uint_least64_t end = 0;
- if (elem.equals("0"))
+ if (elem == "0")
{
start = 0;
end = 0;
}
- else if (elem.equals("1"))
+ else if (elem == "1")
{
start = 1;
end = 1;
}
- else if (elem.equals("X"))
+ else if (elem == "X")
{
start = 0;
end = 1;
@@ -352,10 +343,10 @@ void truthtable_parser::parseline(unsigned cur, std::vector<pstring> list,
else
{
// cutoff previous inputs and outputs for ignore
- if (m_outs[nstate] != m_outs.mask() && m_outs[nstate] != val)
- nl_exception(plib::pfmt("Error in truthtable: State {1:04} already set, {2} != {3}\n")
- .x(nstate.as_uint())(m_outs[nstate])(val) );
- m_outs.set(nstate, val);
+ if (m_out_state[nstate] != m_out_state.mask() && m_out_state[nstate] != val)
+ throw nl_exception(plib::pfmt("Error in truthtable: State {1:04} already set, {2} != {3}\n")
+ .x(nstate.as_uint())(m_out_state[nstate])(val) );
+ m_out_state.set(nstate, val);
for (std::size_t j=0; j<m_NO; j++)
m_timing[nstate * m_NO + j] = timing_index[j];
}
@@ -375,12 +366,12 @@ void truthtable_parser::parse(const std::vector<pstring> &truthtable)
line++;
for (unsigned j=0; j < m_size; j++)
- m_outs.set(j, tt_bitset::all_bits());
+ m_out_state.set(j, tt_bitset::all_bits());
for (int j=0; j < 16; j++)
m_timing_nt[j] = netlist_time::zero();
- while (!ttline.equals(""))
+ while (!(ttline == ""))
{
std::vector<pstring> io(plib::psplit(ttline,"|"));
// checks
@@ -402,12 +393,13 @@ void truthtable_parser::parse(const std::vector<pstring> &truthtable)
*/
for (unsigned j=0; j<m_NO; j++)
{
- pstring outs = out[j].trim();
- if (outs.equals("1"))
+ pstring outs = plib::trim(out[j]);
+ if (outs == "1")
val.set(j);
else
- nl_assert_always(outs.equals("0"), "Unknown value (not 0 or 1");
- netlist_time t = netlist_time::from_nsec(static_cast<unsigned long>(times[j].trim().as_long()));
+ nl_assert_always(outs == "0", "Unknown value (not 0 or 1");
+ // FIXME: error handling
+ netlist_time t = netlist_time::from_nsec(plib::pstonum<std::int64_t>(plib::trim(times[j])));
uint_least8_t k=0;
while (m_timing_nt[k] != netlist_time::zero() && m_timing_nt[k] != t)
k++;
@@ -450,9 +442,9 @@ void truthtable_parser::parse(const std::vector<pstring> &truthtable)
}
for (size_t i=0; i<m_size; i++)
{
- if (m_outs[i] == m_outs.mask())
+ if (m_out_state[i] == m_out_state.mask())
throw nl_exception(plib::pfmt("truthtable: found element not set {1}\n").x(i) );
- m_outs.set(i, m_outs[i] | (ign[i] << m_NO));;
+ m_out_state.set(i, m_out_state[i] | (ign[i] << m_NO));
}
*m_initialized = true;
@@ -460,26 +452,21 @@ void truthtable_parser::parse(const std::vector<pstring> &truthtable)
netlist_base_factory_truthtable_t::netlist_base_factory_truthtable_t(const pstring &name, const pstring &classname,
const pstring &def_param, const pstring &sourcefile)
-: factory::element_t(name, classname, def_param, sourcefile), m_family(family_TTL())
-{
-}
-
-netlist_base_factory_truthtable_t::~netlist_base_factory_truthtable_t()
+: factory::element_t(name, classname, def_param, sourcefile), m_family_desc(family_TTL())
{
}
-
#define ENTRYY(n, m, s) case (n * 100 + m): \
{ using xtype = netlist_factory_truthtable_t<n, m>; \
- ret = plib::palloc<xtype>(desc.name, desc.classname, desc.def_param, s); } break
+ ret = plib::make_unique<xtype>(desc.name, desc.classname, desc.def_param, s); } break
#define ENTRY(n, s) ENTRYY(n, 1, s); ENTRYY(n, 2, s); ENTRYY(n, 3, s); \
ENTRYY(n, 4, s); ENTRYY(n, 5, s); ENTRYY(n, 6, s); \
ENTRYY(n, 7, s); ENTRYY(n, 8, s)
-void tt_factory_create(setup_t &setup, tt_desc &desc, const pstring &sourcefile)
+plib::unique_ptr<netlist_base_factory_truthtable_t> tt_factory_create(tt_desc &desc, const pstring &sourcefile)
{
- netlist_base_factory_truthtable_t *ret;
+ plib::unique_ptr<netlist_base_factory_truthtable_t> ret;
switch (desc.ni * 100 + desc.no)
{
@@ -500,9 +487,9 @@ void tt_factory_create(setup_t &setup, tt_desc &desc, const pstring &sourcefile)
nl_assert_always(false, msg);
}
ret->m_desc = desc.desc;
- if (desc.family != "")
- ret->m_family = setup.family_from_model(desc.family);
- setup.factory().register_device(std::unique_ptr<netlist_base_factory_truthtable_t>(ret));
+ ret->m_family_name = desc.family;
+
+ return ret;
}
} //namespace devices
diff --git a/src/lib/netlist/devices/nlid_truthtable.h b/src/lib/netlist/devices/nlid_truthtable.h
index 311f5ebd8ca..1217d7ee873 100644
--- a/src/lib/netlist/devices/nlid_truthtable.h
+++ b/src/lib/netlist/devices/nlid_truthtable.h
@@ -10,9 +10,9 @@
#ifndef NLID_TRUTHTABLE_H_
#define NLID_TRUTHTABLE_H_
-#include "../nl_setup.h"
-#include "../nl_base.h"
-#include "../plib/putil.h"
+#include "netlist/nl_base.h"
+#include "netlist/nl_setup.h"
+#include "plib/putil.h"
#define NETLIB_TRUTHTABLE(cname, nIN, nOUT) \
class NETLIB_NAME(cname) : public nld_truthtable_t<nIN, nOUT> \
@@ -29,17 +29,9 @@
namespace netlist
{
- namespace devices
- {
+namespace devices
+{
-#if 0
- template<unsigned bits> struct uint_for_size { typedef uint_least32_t type; };
- template<unsigned bits>
- struct need_bytes_for_bits
- {
- enum { value = 4 };
- };
-#else
template<unsigned bits>
struct need_bytes_for_bits
{
@@ -52,11 +44,35 @@ namespace netlist
};
template<unsigned bits> struct uint_for_size;
- template<> struct uint_for_size<1> { typedef uint_least8_t type; };
- template<> struct uint_for_size<2> { typedef uint_least16_t type; };
- template<> struct uint_for_size<4> { typedef uint_least32_t type; };
- template<> struct uint_for_size<8> { typedef uint_least64_t type; };
-#endif
+ template<> struct uint_for_size<1> { using type = uint_least8_t; };
+ template<> struct uint_for_size<2> { using type = uint_least16_t; };
+ template<> struct uint_for_size<4> { using type = uint_least32_t; };
+ template<> struct uint_for_size<8> { using type = uint_least64_t; };
+
+ template<std::size_t NUM, typename R>
+ struct aa
+ {
+ template<typename T>
+ R f(T &arr, const R ign)
+ {
+ R r = aa<NUM-1, R>().f(arr, ign);
+ if (ign & (1 << (NUM-1)))
+ arr[NUM-1].activate();
+ return r | (arr[NUM-1]() << (NUM-1));
+ }
+ };
+
+ template<typename R>
+ struct aa<1, R>
+ {
+ template<typename T>
+ R f(T &arr, const R ign)
+ {
+ if ((ign & 1))
+ arr[0].activate();
+ return arr[0]();
+ }
+ };
template<std::size_t m_NI, std::size_t m_NO>
NETLIB_OBJECT(truthtable_t)
@@ -65,22 +81,23 @@ namespace netlist
detail::family_setter_t m_fam;
public:
- typedef typename uint_for_size<need_bytes_for_bits<m_NO + m_NI>::value>::type type_t;
+ using type_t = typename uint_for_size<need_bytes_for_bits<m_NO + m_NI>::value>::type;
static constexpr const std::size_t m_num_bits = m_NI;
static constexpr const std::size_t m_size = (1 << (m_num_bits));
static constexpr const type_t m_outmask = ((1 << m_NO) - 1);
- static constexpr const std::size_t m_min_devices_for_deactivate = 2;
struct truthtable_t
{
truthtable_t()
- : m_initialized(false)
+ : m_timing_index{0}
+ , m_initialized(false)
{}
+
+ std::array<type_t, m_size> m_out_state;
+ std::array<uint_least8_t, m_size * m_NO> m_timing_index;
+ std::array<netlist_time, 16> m_timing_nt;
bool m_initialized;
- type_t m_outs[m_size];
- uint_least8_t m_timing[m_size * m_NO];
- netlist_time m_timing_nt[16];
};
template <class C>
@@ -90,7 +107,6 @@ namespace netlist
: device_t(owner, name)
, m_fam(*this, fam)
, m_ign(*this, "m_ign", 0)
- , m_active(*this, "m_active", 1)
, m_ttp(ttp)
{
init(desc);
@@ -100,13 +116,14 @@ namespace netlist
NETLIB_RESETI()
{
- m_active = 0;
+ int active_outputs = 0;
m_ign = 0;
for (auto &i : m_I)
i.activate();
for (auto &q : m_Q)
if (q.has_net() && q.net().num_cons() > 0)
- m_active++;
+ active_outputs++;
+ set_active_outputs(active_outputs);
}
NETLIB_UPDATEI()
@@ -116,28 +133,14 @@ namespace netlist
void inc_active() NL_NOEXCEPT override
{
- if (m_NI >= m_min_devices_for_deactivate)
- if (++m_active == 1)
- {
- process<false>();
- }
+ process<false>();
}
void dec_active() NL_NOEXCEPT override
{
- /* FIXME:
- * Based on current measurements there is no point to disable
- * 1 input devices. This should actually be a parameter so that we
- * can decide for each individual gate whether it is beneficial to
- * ignore deactivation.
- */
- if (m_NI >= m_min_devices_for_deactivate)
- if (--m_active == 0)
- {
- for (std::size_t i = 0; i< m_NI; i++)
- m_I[i].inactivate();
- m_ign = (1<<m_NI)-1;
- }
+ for (std::size_t i = 0; i< m_NI; i++)
+ m_I[i].inactivate();
+ m_ign = (1<<m_NI)-1;
}
plib::uninitialised_array_t<logic_input_t, m_NI> m_I;
@@ -153,46 +156,44 @@ namespace netlist
netlist_time mt(netlist_time::zero());
type_t nstate(0);
- if (m_NI >= m_min_devices_for_deactivate)
- {
- type_t ign(m_ign);
- if (!doOUT)
- for (std::size_t i = 0; i < m_NI; i++)
- {
- m_I[i].activate();
- nstate |= (m_I[i]() ? (1 << i) : 0);
- mt = std::max(this->m_I[i].net().time(), mt);
- }
- else
- for (std::size_t i = 0; i < m_NI; i++)
- {
- if ((ign & 1))
- m_I[i].activate();
- nstate |= (m_I[i]() ? (1 << i) : 0);
- ign >>= 1;
- }
- }
+ type_t ign(m_ign);
+#if 1
+ if (!doOUT)
+ for (std::size_t i = 0; i < m_NI; i++)
+ {
+ m_I[i].activate();
+ //nstate |= (m_I[i]() ? (1 << i) : 0);
+ nstate |= (m_I[i]() << i);
+ mt = std::max(this->m_I[i].net().next_scheduled_time(), mt);
+ }
else
+ for (std::size_t i = 0; i < m_NI; i++)
+ {
+ if ((ign & 1))
+ m_I[i].activate();
+ //nstate |= (m_I[i]() ? (1 << i) : 0);
+ nstate |= (m_I[i]() << i);
+ ign >>= 1;
+ }
+#else
+ if (!doOUT)
{
- if (!doOUT)
- for (std::size_t i = 0; i < m_NI; i++)
- {
- nstate |= (m_I[i]() ? (1 << i) : 0);
- mt = std::max(this->m_I[i].net().time(), mt);
- }
- else
- for (std::size_t i = 0; i < m_NI; i++)
- nstate |= (m_I[i]() ? (1 << i) : 0);
+ nstate = aa<m_NI, type_t>().f(m_I, ~0);
+ for (std::size_t i = 0; i < m_NI; i++)
+ mt = std::max(this->m_I[i].net().time(), mt);
}
+ else
+ nstate = aa<m_NI, type_t>().f(m_I, ign);
+#endif
- const type_t outstate(m_ttp.m_outs[nstate]);
+ const type_t outstate(m_ttp.m_out_state[nstate]);
type_t out(outstate & m_outmask);
m_ign = outstate >> m_NO;
const std::size_t timebase(nstate * m_NO);
- const auto *t(&m_ttp.m_timing[timebase]);
- const auto *tim = m_ttp.m_timing_nt;
+ const auto *t(&m_ttp.m_timing_index[timebase]);
+ const auto *tim = m_ttp.m_timing_nt.data();
if (doOUT)
for (std::size_t i = 0; i < m_NO; out >>= 1, ++i)
@@ -201,18 +202,14 @@ namespace netlist
for (std::size_t i = 0; i < m_NO; out >>= 1, ++i)
m_Q[i].set_Q_time(out & 1, mt + tim[t[i]]);
- if (m_NI >= m_min_devices_for_deactivate)
- {
- type_t ign(m_ign);
- for (auto I = m_I.begin(); ign != 0; ign >>= 1, ++I)
- if (ign & 1)
- I->inactivate();
- }
+ ign = m_ign;
+ for (auto I = m_I.begin(); ign != 0; ign >>= 1, ++I)
+ if (ign & 1)
+ I->inactivate();
}
/* FIXME: check width */
state_var<type_t> m_ign;
- state_var_s32 m_active;
const truthtable_t &m_ttp;
};
@@ -222,15 +219,15 @@ namespace netlist
netlist_base_factory_truthtable_t(const pstring &name, const pstring &classname,
const pstring &def_param, const pstring &sourcefile);
- virtual ~netlist_base_factory_truthtable_t();
-
std::vector<pstring> m_desc;
- const logic_family_desc_t *m_family;
+ pstring m_family_name;
+ const logic_family_desc_t *m_family_desc;
};
- void tt_factory_create(setup_t &setup, tt_desc &desc, const pstring &sourcefile);
+ /* the returned element is still missing a pointer to the family ... */
+ plib::unique_ptr<netlist_base_factory_truthtable_t> tt_factory_create(tt_desc &desc, const pstring &sourcefile);
- } //namespace devices
+} //namespace devices
} // namespace netlist
diff --git a/src/lib/netlist/macro/nlm_base.cpp b/src/lib/netlist/macro/nlm_base.cpp
index 8ea6f148864..86f2450d301 100644
--- a/src/lib/netlist/macro/nlm_base.cpp
+++ b/src/lib/netlist/macro/nlm_base.cpp
@@ -1,7 +1,7 @@
// license:GPL-2.0+
// copyright-holders:Couriersud
-#include "../nl_setup.h"
-#include "../devices/net_lib.h"
+#include "netlist/nl_setup.h"
+#include "netlist/devices/net_lib.h"
#include "nlm_base.h"
/* ----------------------------------------------------------------------------
@@ -12,9 +12,14 @@ static NETLIST_START(diode_models)
NET_MODEL("D _(IS=1e-15 N=1)")
NET_MODEL("1N914 D(Is=2.52n Rs=.568 N=1.752 Cjo=4p M=.4 tt=20n Iave=200m Vpk=75 mfg=OnSemi type=silicon)")
+ // FIXME: 1N916 currently only a copy of 1N914!
+ NET_MODEL("1N916 D(Is=2.52n Rs=.568 N=1.752 Cjo=4p M=.4 tt=20n Iave=200m Vpk=75 mfg=OnSemi type=silicon)")
NET_MODEL("1N4001 D(Is=14.11n N=1.984 Rs=33.89m Ikf=94.81 Xti=3 Eg=1.11 Cjo=25.89p M=.44 Vj=.3245 Fc=.5 Bv=75 Ibv=10u Tt=5.7u Iave=1 Vpk=50 mfg=GI type=silicon)")
NET_MODEL("1N4148 D(Is=2.52n Rs=.568 N=1.752 Cjo=4p M=.4 tt=20n Iave=200m Vpk=75 mfg=OnSemi type=silicon)")
NET_MODEL("1S1588 D(Is=2.52n Rs=.568 N=1.752 Cjo=4p M=.4 tt=20n Iave=200m Vpk=75)")
+
+ NET_MODEL("1N34A D( Bv=75 Cjo=0.5e-12 Eg=0.67 Ibv=18e-3 Is=2e-7 Rs=7 N=1.3 Vj=0.1 M=0.27 type=germanium)")
+
NET_MODEL("LedRed D(IS=93.2p RS=42M N=3.73 BV=4 IBV=10U CJO=2.97P VJ=.75 M=.333 TT=4.32U Iave=40m Vpk=4 type=LED)")
NET_MODEL("LedGreen D(IS=93.2p RS=42M N=4.61 BV=4 IBV=10U CJO=2.97P VJ=.75 M=.333 TT=4.32U Iave=40m Vpk=4 type=LED)")
NET_MODEL("LedBlue D(IS=93.2p RS=42M N=7.47 BV=5 IBV=10U CJO=2.97P VJ=.75 M=.333 TT=4.32U Iave=40m Vpk=5 type=LED)")
@@ -26,9 +31,16 @@ NETLIST_END()
* BJT Models
* ---------------------------------------------------------------------------*/
+static NETLIST_START(mosfet_models)
+ //NET_MODEL("NMOS _(VTO=0.0 N=1.0 IS=1E-14 KP=2E-5 UO=600 PHI=0.6 LD=0.0 L=1.0 TOX=1E-7 W=1.0 NSUB=0.0 GAMMA=0.0 RD=0.0 RS=0.0 LAMBDA=0.0)")
+ //NET_MODEL("PMOS _(VTO=0.0 N=1.0 IS=1E-14 KP=2E-5 UO=600 PHI=0.6 LD=0.0 L=1.0 TOX=1E-7 W=1.0 NSUB=0.0 GAMMA=0.0 RD=0.0 RS=0.0 LAMBDA=0.0)")
+ NET_MODEL("NMOS _(VTO=0.0 N=1.0 IS=1E-14 KP=0.0 UO=600 PHI=0.0 LD=0.0 L=1.0 TOX=1E-7 W=1.0 NSUB=0.0 GAMMA=0.0 RD=0.0 RS=0.0 LAMBDA=0.0)")
+ NET_MODEL("PMOS _(VTO=0.0 N=1.0 IS=1E-14 KP=0.0 UO=600 PHI=0.0 LD=0.0 L=1.0 TOX=1E-7 W=1.0 NSUB=0.0 GAMMA=0.0 RD=0.0 RS=0.0 LAMBDA=0.0)")
+NETLIST_END()
+
static NETLIST_START(bjt_models)
- NET_MODEL("NPN _(IS=1e-15 BF=100 NF=1 BR=1 NR=1)")
- NET_MODEL("PNP _(IS=1e-15 BF=100 NF=1 BR=1 NR=1)")
+ NET_MODEL("NPN _(IS=1e-15 BF=100 NF=1 BR=1 NR=1 CJE=0 CJC=0)")
+ NET_MODEL("PNP _(IS=1e-15 BF=100 NF=1 BR=1 NR=1 CJE=0 CJC=0)")
NET_MODEL("2SA1015 PNP(Is=295.1E-18 Xti=3 Eg=1.11 Vaf=100 Bf=110 Xtb=1.5 Br=10.45 Rc=15 Cjc=66.2p Mjc=1.054 Vjc=.75 Fc=.5 Cje=5p Mje=.3333 Vje=.75 Tr=10n Tf=1.661n VCEO=45V ICrating=150M MFG=Toshiba)")
NET_MODEL("2SC1815 NPN(Is=2.04f Xti=3 Eg=1.11 Vaf=6 Bf=400 Ikf=20m Xtb=1.5 Br=3.377 Rc=1 Cjc=1p Mjc=.3333 Vjc=.75 Fc=.5 Cje=25p Mje=.3333 Vje=.75 Tr=450n Tf=20n Itf=0 Vtf=0 Xtf=0 VCEO=45V ICrating=150M MFG=Toshiba)")
@@ -46,6 +58,8 @@ static NETLIST_START(bjt_models)
NET_MODEL("BC556B PNP(IS=3.83E-14 NF=1.008 ISE=1.22E-14 NE=1.528 BF=344.4 IKF=0.08039 VAF=21.11 NR=1.005 ISC=2.85E-13 NC=1.28 BR=14.84 IKR=0.047 VAR=32.02 RB=1 IRB=1.00E-06 RBM=1 RE=0.6202 RC=0.5713 XTB=0 EG=1.11 XTI=3 CJE=1.23E-11 VJE=0.6106 MJE=0.378 TF=5.60E-10 XTF=3.414 VTF=5.23 ITF=0.1483 PTF=0 CJC=1.08E-11 VJC=0.1022 MJC=0.3563 XCJC=0.6288 TR=1.00E-32 CJS=0 VJS=0.75 MJS=0.333 FC=0.8027 Vceo=65 Icrating=100m mfg=Philips)")
NET_MODEL("BC548C NPN(IS=1.95E-14 ISE=1.31E-15 ISC=1.0E-13 XTI=3 BF=466 BR=2.42 IKF=0.18 IKR=1 XTB=1.5 VAF=91.7 VAR=24.7 VJE=0.632 VJC=0.339 RE=1 RC=1.73 RB=26.5 RBM=10 IRB=10 CJE=1.33E-11 CJC=5.17E-12 XCJC=1 FC=0.9 NF=0.993 NR=1.2 NE=1.32 NC=2.00 MJE=0.326 MJC=0.319 TF=6.52E-10 TR=0 PTF=0 ITF=1.03 VTF=1.65 XTF=100 EG=1.11 KF=1E-9 AF=1 VCEO=40 ICrating=800M MFG=Siemens)")
NET_MODEL("BC817-25 NPN(IS=9.198E-14 NF=1.003 ISE=4.468E-16 NE=1.65 BF=338.8 IKF=0.4913 VAF=107.9 NR=1.002 ISC=5.109E-15 NC=1.071 BR=29.48 IKR=0.193 VAR=25 RB=1 IRB=1000 RBM=1 RE=0.2126 RC=0.143 XTB=0 EG=1.11 XTI=3 CJE=3.825E-11 VJE=0.7004 MJE=0.364 TF=5.229E-10 XTF=219.7 VTF=3.502 ITF=7.257 PTF=0 CJC=1.27E-11 VJC=0.4431 MJC=0.3983 XCJC=0.4555 TR=7E-11 CJS=0 VJS=0.75 MJS=0.333 FC=0.905 Vceo=45 Icrating=500m mfg=Philips)")
+
+ NET_MODEL("9013 NPN(IS=3.40675E-14 BF=166 VAF=67 IKF=1.164 ISE=12.37e-15 NE=2 BR=15.17 VAR=40.84 IKR=0.261352 ISC=1.905E-15 NC=1.066 RB=63.2 IRB=5.62E-6 RBM=22.1 RE=0.02 RC=0.7426 CJE=3.53E-11 VJE=0.808 MJE=0.372 CJC=1.74E-11 VJC=0.614 MJC=0.388 XCJC=0.349 XTB=1.4025 EG=1.0999 XTI=3 VC=0.5 VCEO=20)")
NETLIST_END()
/* ----------------------------------------------------------------------------
@@ -74,19 +88,22 @@ NETLIST_START(base)
LOCAL_SOURCE(diode_models)
LOCAL_SOURCE(bjt_models)
+ LOCAL_SOURCE(mosfet_models)
LOCAL_SOURCE(family_models)
+
LOCAL_SOURCE(TTL74XX_lib)
LOCAL_SOURCE(CD4XXX_lib)
LOCAL_SOURCE(OPAMP_lib)
LOCAL_SOURCE(otheric_lib)
- INCLUDE(diode_models);
- INCLUDE(bjt_models);
- INCLUDE(family_models);
- INCLUDE(TTL74XX_lib);
- INCLUDE(CD4XXX_lib);
- INCLUDE(OPAMP_lib);
- INCLUDE(otheric_lib);
+ INCLUDE(diode_models)
+ INCLUDE(bjt_models)
+ INCLUDE(mosfet_models)
+ INCLUDE(family_models)
+ INCLUDE(TTL74XX_lib)
+ INCLUDE(CD4XXX_lib)
+ INCLUDE(OPAMP_lib)
+ INCLUDE(otheric_lib)
NETLIST_END()
diff --git a/src/lib/netlist/macro/nlm_base.h b/src/lib/netlist/macro/nlm_base.h
index 5ecf8071e98..6a88ad5a1be 100644
--- a/src/lib/netlist/macro/nlm_base.h
+++ b/src/lib/netlist/macro/nlm_base.h
@@ -10,7 +10,7 @@
#ifndef __PLIB_PREPROCESSOR__
-#include "../nl_setup.h"
+#include "netlist/nl_setup.h"
/* ----------------------------------------------------------------------------
* Netlist Macros
diff --git a/src/lib/netlist/macro/nlm_cd4xxx.cpp b/src/lib/netlist/macro/nlm_cd4xxx.cpp
index 9ce786ca85e..5ebd5593123 100644
--- a/src/lib/netlist/macro/nlm_cd4xxx.cpp
+++ b/src/lib/netlist/macro/nlm_cd4xxx.cpp
@@ -2,10 +2,10 @@
// copyright-holders:Couriersud
#include "nlm_cd4xxx.h"
-#include "../devices/nld_system.h"
-#include "../devices/nld_4020.h"
-#include "../devices/nld_4066.h"
-#include "../devices/nld_4316.h"
+#include "netlist/devices/nld_4020.h"
+#include "netlist/devices/nld_4066.h"
+#include "netlist/devices/nld_4316.h"
+#include "netlist/devices/nld_system.h"
/*
* CD4001BC: Quad 2-Input NOR Buffered B Series Gate
diff --git a/src/lib/netlist/macro/nlm_cd4xxx.h b/src/lib/netlist/macro/nlm_cd4xxx.h
index 527336c1e8e..d4d9c97fdc2 100644
--- a/src/lib/netlist/macro/nlm_cd4xxx.h
+++ b/src/lib/netlist/macro/nlm_cd4xxx.h
@@ -3,7 +3,7 @@
#ifndef NLD_CD4XXX_H_
#define NLD_CD4XXX_H_
-#include "../nl_setup.h"
+#include "netlist/nl_setup.h"
/*
* Devices:
diff --git a/src/lib/netlist/macro/nlm_opamp.cpp b/src/lib/netlist/macro/nlm_opamp.cpp
index 122b324f777..849f7820046 100644
--- a/src/lib/netlist/macro/nlm_opamp.cpp
+++ b/src/lib/netlist/macro/nlm_opamp.cpp
@@ -1,7 +1,7 @@
// license:GPL-2.0+
// copyright-holders:Couriersud
#include "nlm_opamp.h"
-#include "../devices/net_lib.h"
+#include "netlist/devices/net_lib.h"
/*
* Generic layout with 4 opamps, VCC on pin 4 and GND on pin 11
diff --git a/src/lib/netlist/macro/nlm_opamp.h b/src/lib/netlist/macro/nlm_opamp.h
index 9cffbb29c87..fbd7547c976 100644
--- a/src/lib/netlist/macro/nlm_opamp.h
+++ b/src/lib/netlist/macro/nlm_opamp.h
@@ -3,7 +3,7 @@
#ifndef NLM_OPAMP_H_
#define NLM_OPAMP_H_
-#include "../nl_setup.h"
+#include "netlist/nl_setup.h"
#ifndef __PLIB_PREPROCESSOR__
diff --git a/src/lib/netlist/macro/nlm_other.cpp b/src/lib/netlist/macro/nlm_other.cpp
index 7e31ae27bb4..ea0eb1539a8 100644
--- a/src/lib/netlist/macro/nlm_other.cpp
+++ b/src/lib/netlist/macro/nlm_other.cpp
@@ -2,7 +2,7 @@
// copyright-holders:Couriersud
#include "nlm_other.h"
-#include "../devices/nld_system.h"
+#include "netlist/devices/nld_system.h"
/*
* MC14584B: Hex Schmitt Trigger
diff --git a/src/lib/netlist/macro/nlm_other.h b/src/lib/netlist/macro/nlm_other.h
index 7c38d8ad363..ee231fbd6db 100644
--- a/src/lib/netlist/macro/nlm_other.h
+++ b/src/lib/netlist/macro/nlm_other.h
@@ -3,7 +3,7 @@
#ifndef NLM_OTHER_H_
#define NLM_OTHER_H_
-#include "../nl_setup.h"
+#include "netlist/nl_setup.h"
#ifndef __PLIB_PREPROCESSOR__
diff --git a/src/lib/netlist/macro/nlm_ttl74xx.cpp b/src/lib/netlist/macro/nlm_ttl74xx.cpp
index df1b873a468..58cab049ae7 100644
--- a/src/lib/netlist/macro/nlm_ttl74xx.cpp
+++ b/src/lib/netlist/macro/nlm_ttl74xx.cpp
@@ -2,8 +2,8 @@
// copyright-holders:Couriersud
#include "nlm_ttl74xx.h"
-#include "../devices/nld_schmitt.h"
-#include "../devices/nld_system.h"
+#include "netlist/devices/nld_schmitt.h"
+#include "netlist/devices/nld_system.h"
/*
@@ -825,8 +825,9 @@ NETLIST_END()
NETLIST_START(TTL74XX_lib)
- NET_MODEL("DM7414 SCHMITT_TRIGGER(VTP=1.7 VTM=0.9 VI=4.35 RI=6.15k VOH=3.5 ROH=120 VOL=0.1 ROL=37.5 TPLH=15 TPHL=15)")
- NET_MODEL("DM74LS14 SCHMITT_TRIGGER(VTP=1.6 VTM=0.8 VI=4.4 RI=19.3k VOH=3.45 ROH=130 VOL=0.1 ROL=31.2 TPLH=15 TPHL=15)")
+ NET_MODEL("DM7414 SCHMITT_TRIGGER(VTP=1.7 VTM=0.9 VI=4.35 RI=6.15k VOH=3.5 ROH=120 VOL=0.1 ROL=37.5 TPLH=15 TPHL=15)")
+ NET_MODEL("TTL_7414_GATE SCHMITT_TRIGGER(VTP=1.7 VTM=0.9 VI=4.35 RI=6.15k VOH=3.5 ROH=120 VOL=0.1 ROL=37.5 TPLH=15 TPHL=15)")
+ NET_MODEL("DM74LS14 SCHMITT_TRIGGER(VTP=1.6 VTM=0.8 VI=4.4 RI=19.3k VOH=3.45 ROH=130 VOL=0.1 ROL=31.2 TPLH=15 TPHL=15)")
//NET_MODEL("DM7414 FAMILY(FV=5 IVL=0.16 IVH=0.4 OVL=0.1 OVH=0.05 ORL=10.0 ORH=1.0e8)")
diff --git a/src/lib/netlist/macro/nlm_ttl74xx.h b/src/lib/netlist/macro/nlm_ttl74xx.h
index c8868e45f7f..21ff99f2efe 100644
--- a/src/lib/netlist/macro/nlm_ttl74xx.h
+++ b/src/lib/netlist/macro/nlm_ttl74xx.h
@@ -3,7 +3,7 @@
#ifndef NLD_TTL74XX_H_
#define NLD_TTL74XX_H_
-#include "../nl_setup.h"
+#include "netlist/nl_setup.h"
#ifndef __PLIB_PREPROCESSOR__
diff --git a/src/lib/netlist/netlist_types.h b/src/lib/netlist/netlist_types.h
deleted file mode 100644
index 0bd32be21be..00000000000
--- a/src/lib/netlist/netlist_types.h
+++ /dev/null
@@ -1,54 +0,0 @@
-// license:GPL-2.0+
-// copyright-holders:Couriersud
-/*!
- *
- * \file netlist_types.h
- *
- */
-
-#ifndef NETLIST_TYPES_H_
-#define NETLIST_TYPES_H_
-
-#include "nl_config.h"
-#include "plib/pchrono.h"
-#include "plib/pstring.h"
-
-#include <cstdint>
-#include <unordered_map>
-
-namespace netlist
-{
- //============================================================
- // Performance tracking
- //============================================================
-
-#if NL_KEEP_STATISTICS
- using nperftime_t = plib::chrono::timer<plib::chrono::exact_ticks, true>;
- using nperfcount_t = plib::chrono::counter<true>;
-#else
- using nperftime_t = plib::chrono::timer<plib::chrono::exact_ticks, false>;
- using nperfcount_t = plib::chrono::counter<false>;
-#endif
-
- //============================================================
- // Types needed by various includes
- //============================================================
-
- namespace detail {
-
- /*! Enum specifying the type of object */
- enum terminal_type {
- TERMINAL = 0, /*!< object is an analog terminal */
- INPUT = 1, /*!< object is an input */
- OUTPUT = 2, /*!< object is an output */
- };
-
- /*! Type of the model map used.
- * This is used to hold all #Models in an unordered map
- */
- using model_map_t = std::unordered_map<pstring, pstring>;
-
- }
-}
-
-#endif /* NETLIST_TYPES_H_ */
diff --git a/src/lib/netlist/nl_base.cpp b/src/lib/netlist/nl_base.cpp
index 9a513c00804..ad048e899bf 100644
--- a/src/lib/netlist/nl_base.cpp
+++ b/src/lib/netlist/nl_base.cpp
@@ -8,18 +8,19 @@
#include "solver/nld_matrix_solver.h"
#include "solver/nld_solver.h"
-#include "plib/putil.h"
#include "plib/palloc.h"
+#include "plib/pmempool.h"
+#include "plib/putil.h"
-#include "nl_base.h"
-#include "devices/nlid_system.h"
#include "devices/nlid_proxy.h"
+#include "devices/nlid_system.h"
#include "macro/nlm_base.h"
+#include "nl_base.h"
#include "nl_errstr.h"
-#include <cstring>
#include <cmath>
+#include <cstring>
#include <limits>
namespace netlist
@@ -27,14 +28,13 @@ namespace netlist
namespace detail
{
- static plib::mempool *pool()
- {
- static plib::mempool *s_pool = nullptr;
- if (s_pool == nullptr)
- s_pool = new plib::mempool(65536, 16);
- return s_pool;
- }
+ //static plib::mempool *pool()
+ //{
+ // static plib::mempool s_pool(655360, 32);
+ // return &s_pool;
+ //}
+#if 0
void * object_t::operator new (size_t size)
{
void *ret = nullptr;
@@ -44,38 +44,30 @@ namespace detail
ret = ::operator new(size);
return ret;
}
-
void object_t::operator delete (void * mem)
{
if (mem)
{
- if ((USE_MEMPOOL))
- pool()->free(mem);
- else
+ //if ((USE_MEMPOOL))
+ // pool()->free(mem);
+ //else
::operator delete(mem);
}
}
+#endif
-}
-
-nl_exception::~nl_exception()
-{
-}
+} // namespace detail
// ----------------------------------------------------------------------------------------
// logic_family_ttl_t
// ----------------------------------------------------------------------------------------
+// NOLINTNEXTLINE(cppcoreguidelines-pro-type-member-init, modernize-use-equals-default)
logic_family_desc_t::logic_family_desc_t()
{
}
-logic_family_desc_t::~logic_family_desc_t()
-{
-}
-
-
class logic_family_ttl_t : public logic_family_desc_t
{
public:
@@ -90,17 +82,17 @@ public:
m_R_low = 1.0;
m_R_high = 130.0;
}
- virtual plib::owned_ptr<devices::nld_base_d_to_a_proxy> create_d_a_proxy(netlist_t &anetlist, const pstring &name, logic_output_t *proxied) const override;
- virtual plib::owned_ptr<devices::nld_base_a_to_d_proxy> create_a_d_proxy(netlist_t &anetlist, const pstring &name, logic_input_t *proxied) const override;
+ pool_owned_ptr<devices::nld_base_d_to_a_proxy> create_d_a_proxy(netlist_state_t &anetlist, const pstring &name, logic_output_t *proxied) const override;
+ pool_owned_ptr<devices::nld_base_a_to_d_proxy> create_a_d_proxy(netlist_state_t &anetlist, const pstring &name, logic_input_t *proxied) const override;
};
-plib::owned_ptr<devices::nld_base_d_to_a_proxy> logic_family_ttl_t::create_d_a_proxy(netlist_t &anetlist, const pstring &name, logic_output_t *proxied) const
+pool_owned_ptr<devices::nld_base_d_to_a_proxy> logic_family_ttl_t::create_d_a_proxy(netlist_state_t &anetlist, const pstring &name, logic_output_t *proxied) const
{
- return plib::owned_ptr<devices::nld_base_d_to_a_proxy>::Create<devices::nld_d_to_a_proxy>(anetlist, name, proxied);
+ return pool().make_poolptr<devices::nld_d_to_a_proxy>(anetlist, name, proxied);
}
-plib::owned_ptr<devices::nld_base_a_to_d_proxy> logic_family_ttl_t::create_a_d_proxy(netlist_t &anetlist, const pstring &name, logic_input_t *proxied) const
+pool_owned_ptr<devices::nld_base_a_to_d_proxy> logic_family_ttl_t::create_a_d_proxy(netlist_state_t &anetlist, const pstring &name, logic_input_t *proxied) const
{
- return plib::owned_ptr<devices::nld_base_a_to_d_proxy>::Create<devices::nld_a_to_d_proxy>(anetlist, name, proxied);
+ return pool().make_poolptr<devices::nld_a_to_d_proxy>(anetlist, name, proxied);
}
class logic_family_cd4xxx_t : public logic_family_desc_t
@@ -117,17 +109,18 @@ public:
m_R_low = 10.0;
m_R_high = 10.0;
}
- virtual plib::owned_ptr<devices::nld_base_d_to_a_proxy> create_d_a_proxy(netlist_t &anetlist, const pstring &name, logic_output_t *proxied) const override;
- virtual plib::owned_ptr<devices::nld_base_a_to_d_proxy> create_a_d_proxy(netlist_t &anetlist, const pstring &name, logic_input_t *proxied) const override;
+ pool_owned_ptr<devices::nld_base_d_to_a_proxy> create_d_a_proxy(netlist_state_t &anetlist, const pstring &name, logic_output_t *proxied) const override;
+ pool_owned_ptr<devices::nld_base_a_to_d_proxy> create_a_d_proxy(netlist_state_t &anetlist, const pstring &name, logic_input_t *proxied) const override;
};
-plib::owned_ptr<devices::nld_base_d_to_a_proxy> logic_family_cd4xxx_t::create_d_a_proxy(netlist_t &anetlist, const pstring &name, logic_output_t *proxied) const
+pool_owned_ptr<devices::nld_base_d_to_a_proxy> logic_family_cd4xxx_t::create_d_a_proxy(netlist_state_t &anetlist, const pstring &name, logic_output_t *proxied) const
{
- return plib::owned_ptr<devices::nld_base_d_to_a_proxy>::Create<devices::nld_d_to_a_proxy>(anetlist, name, proxied);
+ return pool().make_poolptr<devices::nld_d_to_a_proxy>(anetlist, name, proxied);
}
-plib::owned_ptr<devices::nld_base_a_to_d_proxy> logic_family_cd4xxx_t::create_a_d_proxy(netlist_t &anetlist, const pstring &name, logic_input_t *proxied) const
+
+pool_owned_ptr<devices::nld_base_a_to_d_proxy> logic_family_cd4xxx_t::create_a_d_proxy(netlist_state_t &anetlist, const pstring &name, logic_input_t *proxied) const
{
- return plib::owned_ptr<devices::nld_base_a_to_d_proxy>::Create<devices::nld_a_to_d_proxy>(anetlist, name, proxied);
+ return pool().make_poolptr<devices::nld_a_to_d_proxy>(anetlist, name, proxied);
}
const logic_family_desc_t *family_TTL()
@@ -146,10 +139,10 @@ const logic_family_desc_t *family_CD4XXX()
// queue_t
// ----------------------------------------------------------------------------------------
-detail::queue_t::queue_t(netlist_t &nl)
- : timed_queue<pqentry_t<net_t *, netlist_time>, false>(512)
+detail::queue_t::queue_t(netlist_state_t &nl)
+ : timed_queue<pqentry_t<net_t *, netlist_time>, false, NL_KEEP_STATISTICS>(512)
, netlist_ref(nl)
- , plib::state_manager_t::callback_t()
+// , plib::state_manager_t::callback_t()
, m_qsize(0)
, m_times(512)
, m_net_ids(512)
@@ -158,52 +151,56 @@ detail::queue_t::queue_t(netlist_t &nl)
void detail::queue_t::register_state(plib::state_manager_t &manager, const pstring &module)
{
- netlist().log().debug("register_state\n");
+ //state().log().debug("register_state\n");
manager.save_item(this, m_qsize, module + "." + "qsize");
manager.save_item(this, &m_times[0], module + "." + "times", m_times.size());
manager.save_item(this, &m_net_ids[0], module + "." + "names", m_net_ids.size());
}
-void detail::queue_t::on_pre_save()
+void detail::queue_t::on_pre_save(plib::state_manager_t &manager)
{
- netlist().log().debug("on_pre_save\n");
+ plib::unused_var(manager);
m_qsize = this->size();
- netlist().log().debug("current time {1} qsize {2}\n", netlist().time().as_double(), m_qsize);
for (std::size_t i = 0; i < m_qsize; i++ )
{
m_times[i] = this->listptr()[i].m_exec_time.as_raw();
- m_net_ids[i] = netlist().find_net_id(this->listptr()[i].m_object);
+ m_net_ids[i] = state().find_net_id(this->listptr()[i].m_object);
}
}
-void detail::queue_t::on_post_load()
+void detail::queue_t::on_post_load(plib::state_manager_t &manager)
{
+ plib::unused_var(manager);
this->clear();
- netlist().log().debug("current time {1} qsize {2}\n", netlist().time().as_double(), m_qsize);
for (std::size_t i = 0; i < m_qsize; i++ )
{
- detail::net_t *n = netlist().m_nets[m_net_ids[i]].get();
+ detail::net_t *n = state().nets()[m_net_ids[i]].get();
this->push(queue_t::entry_t(netlist_time::from_raw(m_times[i]),n));
}
}
// ----------------------------------------------------------------------------------------
+// netlist_ref_t
+// ----------------------------------------------------------------------------------------
+
+detail::netlist_ref::netlist_ref(netlist_state_t &nl)
+: m_netlist(nl.exec()) { }
+
+// ----------------------------------------------------------------------------------------
// object_t
// ----------------------------------------------------------------------------------------
detail::object_t::object_t(const pstring &aname)
- : m_name(plib::make_unique<pstring>(aname))
+// : m_name(aname)
{
+ name_hash().insert({this, aname});
}
-detail::object_t::~object_t()
+pstring detail::object_t::name() const
{
-}
-
-const pstring &detail::object_t::name() const
-{
- return *m_name;
+ return name_hash().find(this)->second;
+ //return m_name;
}
// ----------------------------------------------------------------------------------------
@@ -230,7 +227,7 @@ detail::terminal_type detail::core_terminal_t::type() const
return terminal_type::OUTPUT;
else
{
- netlist().log().fatal(MF_1_UNKNOWN_TYPE_FOR_OBJECT, name());
+ state().log().fatal(MF_1_UNKNOWN_TYPE_FOR_OBJECT, name());
return terminal_type::TERMINAL; // please compiler
}
}
@@ -239,159 +236,38 @@ detail::terminal_type detail::core_terminal_t::type() const
// netlist_t
// ----------------------------------------------------------------------------------------
-netlist_t::netlist_t(const pstring &aname)
- : m_time(netlist_time::zero())
- , m_queue(*this)
- , m_mainclock(nullptr)
+netlist_t::netlist_t(const pstring &aname, plib::unique_ptr<callbacks_t> callbacks)
+ : m_state(plib::make_unique<netlist_state_t>(aname, *this, std::move(callbacks)))
, m_solver(nullptr)
- , m_params(nullptr)
- , m_name(aname)
- , m_log(*this)
- , m_lib(nullptr)
- , m_state()
-{
- state().save_item(this, static_cast<plib::state_manager_t::callback_t &>(m_queue), "m_queue");
- state().save_item(this, m_time, "m_time");
- m_setup = plib::make_unique<setup_t>(*this);
- /* FIXME: doesn't really belong here */
- NETLIST_NAME(base)(*m_setup);
-}
-
-netlist_t::~netlist_t()
-{
- m_nets.clear();
- m_devices.clear();
-}
-
-nl_double netlist_t::gmin() const NL_NOEXCEPT
-{
- return solver()->gmin();
-}
-
-void netlist_t::register_dev(plib::owned_ptr<core_device_t> dev)
-{
- for (auto & d : m_devices)
- if (d->name() == dev->name())
- log().fatal(MF_1_DUPLICATE_NAME_DEVICE_LIST, d->name());
- m_devices.push_back(std::move(dev));
-}
-
-void netlist_t::remove_dev(core_device_t *dev)
+ , m_time(netlist_time::zero())
+ , m_mainclock(nullptr)
+ , m_queue(*m_state)
{
- m_devices.erase(
- std::remove_if(
- m_devices.begin(),
- m_devices.end(),
- [&] (plib::owned_ptr<core_device_t> const& p)
- {
- return p.get() == dev;
- }),
- m_devices.end()
- );
+ devices::initialize_factory(nlstate().setup().factory());
+ NETLIST_NAME(base)(nlstate().setup());
+ run_state_manager().save_item(this, static_cast<plib::state_manager_t::callback_t &>(m_queue), "m_queue");
+ run_state_manager().save_item(this, m_time, "m_time");
}
+// ----------------------------------------------------------------------------------------
+// netlist_t
+// ----------------------------------------------------------------------------------------
-
-void netlist_t::start()
+netlist_state_t::netlist_state_t(const pstring &aname,
+ netlist_t & anetlist,
+ plib::unique_ptr<callbacks_t> &&callbacks)
+: m_name(aname)
+, m_netlist(anetlist)
+, m_state()
+, m_callbacks(std::move(callbacks)) // Order is important here
+, m_log(*m_callbacks)
+, m_setup(plib::make_unique<setup_t>(*this))
{
- setup().start_devices();
-
- /* load the library ... */
-
- /* make sure the solver and parameters are started first! */
-
- for (auto & e : setup().m_device_factory)
- {
- if ( setup().factory().is_class<devices::NETLIB_NAME(solver)>(e.second)
- || setup().factory().is_class<devices::NETLIB_NAME(netlistparams)>(e.second))
- {
- auto dev = plib::owned_ptr<device_t>(e.second->Create(*this, e.first));
- register_dev(std::move(dev));
- }
- }
-
- log().debug("Searching for mainclock and solver ...\n");
-
- m_solver = get_single_device<devices::NETLIB_NAME(solver)>("solver");
- m_params = get_single_device<devices::NETLIB_NAME(netlistparams)>("parameter");
-
- /* create devices */
-
- log().debug("Creating devices ...\n");
- for (auto & e : setup().m_device_factory)
- {
- if ( !setup().factory().is_class<devices::NETLIB_NAME(solver)>(e.second)
- && !setup().factory().is_class<devices::NETLIB_NAME(netlistparams)>(e.second))
- {
- auto dev = plib::owned_ptr<device_t>(e.second->Create(*this, e.first));
- register_dev(std::move(dev));
- }
- }
-
- log().debug("Searching for mainclock\n");
- m_mainclock = get_single_device<devices::NETLIB_NAME(mainclock)>("mainclock");
-
- bool use_deactivate = (m_params->m_use_deactivate() ? true : false);
-
- for (auto &d : m_devices)
- {
- if (use_deactivate)
- {
- auto p = setup().m_param_values.find(d->name() + ".HINT_NO_DEACTIVATE");
- if (p != setup().m_param_values.end())
- {
- //FIXME: turn this into a proper function
- bool error;
- auto v = p->second.as_double(&error);
- if (error || std::abs(v - std::floor(v)) > 1e-6 )
- log().fatal(MF_1_HND_VAL_NOT_SUPPORTED, p->second);
- d->set_hint_deactivate(v == 0.0);
- }
- }
- else
- d->set_hint_deactivate(false);
- }
-
pstring libpath = plib::util::environment("NL_BOOSTLIB", plib::util::buildpath({".", "nlboost.so"}));
m_lib = plib::make_unique<plib::dynlib>(libpath);
-
- /* resolve inputs */
- setup().resolve_inputs();
-
- log().verbose("looking for two terms connected to rail nets ...");
- for (auto & t : get_device_list<analog::NETLIB_NAME(twoterm)>())
- {
- if (t->m_N.net().isRailNet() && t->m_P.net().isRailNet())
- {
- log().warning(MW_3_REMOVE_DEVICE_1_CONNECTED_ONLY_TO_RAILS_2_3,
- t->name(), t->m_N.net().name(), t->m_P.net().name());
- t->m_N.net().remove_terminal(t->m_N);
- t->m_P.net().remove_terminal(t->m_P);
- remove_dev(t);
- }
- }
-
- log().verbose("initialize solver ...\n");
-
- if (m_solver == nullptr)
- {
- for (auto &p : m_nets)
- if (p->is_analog())
- log().fatal(MF_0_NO_SOLVER);
- }
- else
- m_solver->post_start();
-
- for (auto &n : m_nets)
- for (auto & term : n->m_core_terms)
- {
- //core_device_t *dev = reinterpret_cast<core_device_t *>(term->m_delegate.object());
- core_device_t *dev = &term->device();
- dev->set_default_delegate(*term);
- }
-
}
+
void netlist_t::stop()
{
log().debug("Printing statistics ...\n");
@@ -401,7 +277,7 @@ void netlist_t::stop()
m_solver->stop();
}
-detail::net_t *netlist_t::find_net(const pstring &name) const
+detail::net_t *netlist_state_t::find_net(const pstring &name) const
{
for (auto & net : m_nets)
if (net->name() == name)
@@ -410,7 +286,7 @@ detail::net_t *netlist_t::find_net(const pstring &name) const
return nullptr;
}
-std::size_t netlist_t::find_net_id(const detail::net_t *net) const
+std::size_t netlist_state_t::find_net_id(const detail::net_t *net) const
{
for (std::size_t i = 0; i < m_nets.size(); i++)
if (m_nets[i].get() == net)
@@ -420,7 +296,7 @@ std::size_t netlist_t::find_net_id(const detail::net_t *net) const
-void netlist_t::rebuild_lists()
+void netlist_state_t::rebuild_lists()
{
for (auto & net : m_nets)
net->rebuild_list();
@@ -429,32 +305,44 @@ void netlist_t::rebuild_lists()
void netlist_t::reset()
{
+ log().debug("Searching for mainclock\n");
+ m_mainclock = m_state->get_single_device<devices::NETLIB_NAME(mainclock)>("mainclock");
+
+ log().debug("Searching for solver\n");
+ m_solver = m_state->get_single_device<devices::NETLIB_NAME(solver)>("solver");
+
m_time = netlist_time::zero();
m_queue.clear();
if (m_mainclock != nullptr)
- m_mainclock->m_Q.net().set_time(netlist_time::zero());
+ m_mainclock->m_Q.net().set_next_scheduled_time(netlist_time::zero());
//if (m_solver != nullptr)
- // m_solver->do_reset();
-
- std::unordered_map<core_device_t *, bool> m;
+ // m_solver->reset();
- for (auto &d : m_devices)
- {
- m[d.get()] = d->get_hint_deactivate();
- }
+ m_state->reset();
+}
+void netlist_state_t::reset()
+{
+ //FIXME: never used ???
+ std::unordered_map<core_device_t *, bool> m;
// Reset all nets once !
- for (auto & n : m_nets)
+ log().verbose("Call reset on all nets:");
+ for (auto & n : nets())
n->reset();
// Reset all devices once !
+ log().verbose("Call reset on all devices:");
for (auto & dev : m_devices)
- dev->do_reset();
+ dev.second->reset();
// Make sure everything depending on parameters is set
+ // Currently analog input and logic input also
+ // push their outputs to queue.
+
+ log().verbose("Call update_param on all devices:");
for (auto & dev : m_devices)
- dev->update_param();
+ dev.second->update_param();
// Step all devices once !
/*
@@ -462,9 +350,9 @@ void netlist_t::reset()
* variations are explicitly stated in the breakout manual.
*/
- const unsigned startup_strategy = 1; //! \note make this a parameter
+ auto *netlist_params = get_single_device<devices::NETLIB_NAME(netlistparams)>("parameter");
- switch (startup_strategy)
+ switch (netlist_params->m_startup_strategy())
{
case 0:
{
@@ -472,7 +360,7 @@ void netlist_t::reset()
std::vector<nldelegate *> t;
log().verbose("Using default startup strategy");
for (auto &n : m_nets)
- for (auto & term : n->m_core_terms)
+ for (auto & term : n->core_terms())
if (term->m_delegate.has_object())
{
if (!plib::container::contains(t, &term->m_delegate))
@@ -480,70 +368,68 @@ void netlist_t::reset()
t.push_back(&term->m_delegate);
term->m_delegate();
}
- core_device_t *dev = reinterpret_cast<core_device_t *>(term->m_delegate.object());
+ auto *dev = reinterpret_cast<core_device_t *>(term->m_delegate.object());
if (!plib::container::contains(d, dev))
d.push_back(dev);
}
- log().verbose("Call update on devices which need parameter update:");
- for (auto & dev : m_devices)
- if (dev->needs_update_after_param_change())
- {
- if (!plib::container::contains(d, dev.get()))
- {
- d.push_back(dev.get());
- log().verbose("\t ...{1}", dev->name());
- dev->update_dev();
- }
- }
log().verbose("Devices not yet updated:");
for (auto &dev : m_devices)
- if (!plib::container::contains(d, dev.get()))
- log().verbose("\t ...{1}", dev->name());
- //x->update_dev();
+ if (!plib::container::contains(d, dev.second.get()))
+ {
+ log().verbose("\t ...{1}", dev.second->name());
+ dev.second->update();
+ }
}
break;
case 1: // brute force backward
{
+ log().verbose("Using brute force backward startup strategy");
+
+ for (auto &n : m_nets) // only used if USE_COPY_INSTEAD_OF_REFERENCE == 1
+ n->update_inputs();
+
std::size_t i = m_devices.size();
while (i>0)
- m_devices[--i]->update_dev();
+ m_devices[--i].second->update();
+
+ for (auto &n : m_nets) // only used if USE_COPY_INSTEAD_OF_REFERENCE == 1
+ n->update_inputs();
+
}
break;
case 2: // brute force forward
{
+ log().verbose("Using brute force forward startup strategy");
for (auto &d : m_devices)
- d->update_dev();
+ d.second->update();
}
break;
}
#if 1
/* the above may screw up m_active and the list */
- for (auto &n : m_nets)
- n->rebuild_list();
+ rebuild_lists();
#endif
}
-void netlist_t::process_queue(const netlist_time &delta) NL_NOEXCEPT
+void netlist_t::process_queue(const netlist_time delta) NL_NOEXCEPT
{
+ auto sm_guard(m_stat_mainloop.guard());
netlist_time stop(m_time + delta);
m_queue.push(detail::queue_t::entry_t(stop, nullptr));
- m_stat_mainloop.start();
if (m_mainclock == nullptr)
{
- detail::queue_t::entry_t e(m_queue.top());
- m_queue.pop();
+ detail::queue_t::entry_t e(m_queue.pop());
m_time = e.m_exec_time;
while (e.m_object != nullptr)
{
e.m_object->update_devs();
m_perf_out_processed.inc();
- e = m_queue.top();
- m_queue.pop();
+ e = m_queue.pop();
m_time = e.m_exec_time;
}
}
@@ -551,9 +437,7 @@ void netlist_t::process_queue(const netlist_time &delta) NL_NOEXCEPT
{
logic_net_t &mc_net(m_mainclock->m_Q.net());
const netlist_time inc(m_mainclock->m_inc);
- netlist_time mc_time(mc_net.time());
-
- detail::queue_t::entry_t e;
+ netlist_time mc_time(mc_net.next_scheduled_time());
do
{
@@ -565,37 +449,37 @@ void netlist_t::process_queue(const netlist_time &delta) NL_NOEXCEPT
mc_time += inc;
}
- e = m_queue.top();
- m_queue.pop();
+ detail::queue_t::entry_t e(m_queue.pop());
m_time = e.m_exec_time;
if (e.m_object != nullptr)
{
e.m_object->update_devs();
m_perf_out_processed.inc();
}
- } while (e.m_object != nullptr);
- mc_net.set_time(mc_time);
+ else
+ break;
+ } while (true); //while (e.m_object != nullptr);
+ mc_net.set_next_scheduled_time(mc_time);
}
- m_stat_mainloop.stop();
}
void netlist_t::print_stats() const
{
- if (nperftime_t::enabled)
+ if (nperftime_t<NL_KEEP_STATISTICS>::enabled)
{
std::vector<size_t> index;
- for (size_t i=0; i<m_devices.size(); i++)
+ for (size_t i=0; i < m_state->m_devices.size(); i++)
index.push_back(i);
std::sort(index.begin(), index.end(),
- [&](size_t i1, size_t i2) { return m_devices[i1]->m_stat_total_time.total() < m_devices[i2]->m_stat_total_time.total(); });
+ [&](size_t i1, size_t i2) { return m_state->m_devices[i1].second->m_stat_total_time.total() < m_state->m_devices[i2].second->m_stat_total_time.total(); });
- nperftime_t::type total_time(0);
- uint_least64_t total_count(0);
+ nperftime_t<NL_KEEP_STATISTICS>::type total_time(0);
+ nperftime_t<NL_KEEP_STATISTICS>::ctype total_count(0);
for (auto & j : index)
{
- auto entry = m_devices[j].get();
+ auto entry = m_state->m_devices[j].second.get();
log().verbose("Device {1:20} : {2:12} {3:12} {4:15} {5:12}", entry->name(),
entry->m_stat_call_count(), entry->m_stat_total_time.count(),
entry->m_stat_total_time.total(), entry->m_stat_inc_active());
@@ -603,22 +487,27 @@ void netlist_t::print_stats() const
total_count += entry->m_stat_total_time.count();
}
- nperftime_t overhead;
- nperftime_t test;
- overhead.start();
- for (int j=0; j<100000;j++)
+ log().verbose("Total calls : {1:12} {2:12} {3:12}", total_count,
+ total_time, total_time / static_cast<decltype(total_time)>(total_count));
+
+ nperftime_t<NL_KEEP_STATISTICS> overhead;
+ nperftime_t<NL_KEEP_STATISTICS> test;
{
- test.start();
- test.stop();
+ auto overhead_guard(overhead.guard());
+ for (int j=0; j<100000;j++)
+ {
+ auto test_guard(test.guard());
+ }
}
- overhead.stop();
- nperftime_t::type total_overhead = overhead()
- * static_cast<nperftime_t::type>(total_count)
- / static_cast<nperftime_t::type>(200000);
+ nperftime_t<NL_KEEP_STATISTICS>::type total_overhead = overhead()
+ * static_cast<nperftime_t<NL_KEEP_STATISTICS>::type>(total_count)
+ / static_cast<nperftime_t<NL_KEEP_STATISTICS>::type>(200000);
- log().verbose("Queue Pushes {1:15}", queue().m_prof_call());
- log().verbose("Queue Moves {1:15}", queue().m_prof_sortmove());
+ log().verbose("Queue Pushes {1:15}", m_queue.m_prof_call());
+ log().verbose("Queue Moves {1:15}", m_queue.m_prof_sortmove());
+ log().verbose("Queue Removes {1:15}", m_queue.m_prof_remove());
+ log().verbose("Queue Retimes {1:15}", m_queue.m_prof_retime());
log().verbose("Total loop {1:15}", m_stat_mainloop());
/* Only one serialization should be counted in total time */
@@ -627,29 +516,36 @@ void netlist_t::print_stats() const
log().verbose("");
log().verbose("Take the next lines with a grain of salt. They depend on the measurement implementation.");
log().verbose("Total overhead {1:15}", total_overhead);
- nperftime_t::type overhead_per_pop = (m_stat_mainloop()-2*total_overhead - (total_time - total_overhead))
- / static_cast<nperftime_t::type>(queue().m_prof_call());
+ nperftime_t<NL_KEEP_STATISTICS>::type overhead_per_pop = (m_stat_mainloop()-2*total_overhead - (total_time - total_overhead))
+ / static_cast<nperftime_t<NL_KEEP_STATISTICS>::type>(m_queue.m_prof_call());
log().verbose("Overhead per pop {1:11}", overhead_per_pop );
log().verbose("");
- for (auto &entry : m_devices)
+
+ auto trigger = total_count * 200 / 1000000; // 200 ppm
+ for (auto &entry : m_state->m_devices)
{
- if (entry->m_stat_inc_active() > 3 * entry->m_stat_total_time.count())
- log().verbose("HINT({}, NO_DEACTIVATE)", entry->name());
+ auto ep = entry.second.get();
+ // Factor of 3 offers best performace increase
+ if (ep->m_stat_inc_active() > 3 * ep->m_stat_total_time.count()
+ && ep->m_stat_inc_active() > trigger)
+ log().verbose("HINT({}, NO_DEACTIVATE) // {} {} {}", ep->name(),
+ static_cast<double>(ep->m_stat_inc_active()) / static_cast<double>(ep->m_stat_total_time.count()),
+ ep->m_stat_inc_active(), ep->m_stat_total_time.count());
}
}
}
-core_device_t *netlist_t::get_single_device(const pstring &classname, bool (*cc)(core_device_t *)) const
+core_device_t *netlist_state_t::get_single_device(const pstring &classname, bool (*cc)(core_device_t *)) const
{
core_device_t *ret = nullptr;
for (auto &d : m_devices)
{
- if (cc(d.get()))
+ if (cc(d.second.get()))
{
if (ret != nullptr)
- this->log().fatal(MF_1_MORE_THAN_ONE_1_DEVICE_FOUND, classname);
+ m_log.fatal(MF_1_MORE_THAN_ONE_1_DEVICE_FOUND, classname);
else
- ret = d.get();
+ ret = d.second.get();
}
}
return ret;
@@ -660,11 +556,12 @@ core_device_t *netlist_t::get_single_device(const pstring &classname, bool (*cc)
// core_device_t
// ----------------------------------------------------------------------------------------
-core_device_t::core_device_t(netlist_t &owner, const pstring &name)
+core_device_t::core_device_t(netlist_state_t &owner, const pstring &name)
: object_t(name)
, logic_family_t()
, netlist_ref(owner)
, m_hint_deactivate(false)
+ , m_active_outputs(*this, "m_active_outputs", 1)
{
if (logic_family() == nullptr)
set_logic_family(family_TTL());
@@ -673,17 +570,14 @@ core_device_t::core_device_t(netlist_t &owner, const pstring &name)
core_device_t::core_device_t(core_device_t &owner, const pstring &name)
: object_t(owner.name() + "." + name)
, logic_family_t()
- , netlist_ref(owner.netlist())
+ , netlist_ref(owner.state())
, m_hint_deactivate(false)
+ , m_active_outputs(*this, "m_active_outputs", 1)
{
set_logic_family(owner.logic_family());
if (logic_family() == nullptr)
set_logic_family(family_TTL());
- owner.netlist().register_dev(plib::owned_ptr<core_device_t>(this, false));
-}
-
-core_device_t::~core_device_t()
-{
+ state().add_dev(this->name(), pool_owned_ptr<core_device_t>(this, false));
}
void core_device_t::set_default_delegate(detail::core_terminal_t &term)
@@ -692,16 +586,16 @@ void core_device_t::set_default_delegate(detail::core_terminal_t &term)
term.m_delegate.set(&core_device_t::update, this);
}
-plib::plog_base<netlist_t, NL_DEBUG> &core_device_t::log()
+log_type & core_device_t::log()
{
- return netlist().log();
+ return state().log();
}
// ----------------------------------------------------------------------------------------
// device_t
// ----------------------------------------------------------------------------------------
-device_t::device_t(netlist_t &owner, const pstring &name)
+device_t::device_t(netlist_state_t &owner, const pstring &name)
: core_device_t(owner, name)
{
}
@@ -711,14 +605,14 @@ device_t::device_t(core_device_t &owner, const pstring &name)
{
}
-device_t::~device_t()
+setup_t &device_t::setup()
{
- //log().debug("~net_device_t\n");
+ return state().setup();
}
-setup_t &device_t::setup()
+const setup_t &device_t::setup() const
{
- return netlist().setup();
+ return state().setup();
}
void device_t::register_subalias(const pstring &name, detail::core_terminal_t &term)
@@ -762,9 +656,14 @@ void device_t::connect_post_start(detail::core_terminal_t &t1, detail::core_term
// family_setter_t
// -----------------------------------------------------------------------------
+// NOLINTNEXTLINE(modernize-use-equals-default)
+detail::family_setter_t::family_setter_t()
+{
+}
+
detail::family_setter_t::family_setter_t(core_device_t &dev, const pstring &desc)
{
- dev.set_logic_family(dev.netlist().setup().family_from_model(desc));
+ dev.set_logic_family(dev.setup().family_from_model(desc));
}
detail::family_setter_t::family_setter_t(core_device_t &dev, const logic_family_desc_t *desc)
@@ -776,81 +675,45 @@ detail::family_setter_t::family_setter_t(core_device_t &dev, const logic_family_
// net_t
// ----------------------------------------------------------------------------------------
-detail::net_t::net_t(netlist_t &nl, const pstring &aname, core_terminal_t *mr)
+detail::net_t::net_t(netlist_state_t &nl, const pstring &aname, core_terminal_t *mr)
: object_t(aname)
, netlist_ref(nl)
, m_new_Q(*this, "m_new_Q", 0)
, m_cur_Q (*this, "m_cur_Q", 0)
- , m_in_queue(*this, "m_in_queue", QS_DELIVERED)
- , m_active(*this, "m_active", 0)
- , m_time(*this, "m_time", netlist_time::zero())
+ , m_in_queue(*this, "m_in_queue", queue_status::DELIVERED)
+ , m_next_scheduled_time(*this, "m_time", netlist_time::zero())
, m_railterminal(mr)
{
}
-detail::net_t::~net_t()
-{
- netlist().state().remove_save_items(this);
-}
-
-void detail::net_t::inc_active(core_terminal_t &term) NL_NOEXCEPT
-{
- m_list_active.push_front(&term);
- ++m_active;
- nl_assert(m_active <= static_cast<int>(num_cons()));
- if (m_active == 1)
- {
- railterminal().device().do_inc_active();
- if (m_in_queue == QS_DELAYED_DUE_TO_INACTIVE)
- {
- if (m_time > netlist().time())
- {
- m_in_queue = QS_QUEUED; /* pending */
- netlist().queue().push({m_time, this});
- }
- else
- {
- m_in_queue = QS_DELIVERED;
- m_cur_Q = m_new_Q;
- }
- }
- }
-}
-
-void detail::net_t::dec_active(core_terminal_t &term) NL_NOEXCEPT
-{
- --m_active;
- nl_assert(m_active >= 0);
- m_list_active.remove(&term);
- if (m_active == 0)
- railterminal().device().do_dec_active();
-}
-
void detail::net_t::rebuild_list()
{
/* rebuild m_list */
- int cnt = 0;
m_list_active.clear();
for (auto & term : m_core_terms)
- if (term->state() != logic_t::STATE_INP_PASSIVE)
+ if (term->terminal_state() != logic_t::STATE_INP_PASSIVE)
{
m_list_active.push_back(term);
- cnt++;
+ term->set_copied_input(m_cur_Q);
}
- m_active = cnt;
}
-
-void detail::net_t::process(unsigned Mask)
+template <typename T>
+void detail::net_t::process(const T mask, netlist_sig_t sig)
{
+ m_cur_Q = sig;
+
for (auto & p : m_list_active)
{
+ p.set_copied_input(sig);
+
p.device().m_stat_call_count.inc();
- if ((p.state() & Mask) != 0)
+ if ((p.terminal_state() & mask))
{
- p.device().m_stat_total_time.start();
+ auto g(p.device().m_stat_total_time.guard());
+ //p.device().m_stat_total_time.start();
p.m_delegate();
- p.device().m_stat_total_time.stop();
+ //p.device().m_stat_total_time.stop();
}
}
}
@@ -859,67 +722,59 @@ void detail::net_t::update_devs() NL_NOEXCEPT
{
nl_assert(this->isRailNet());
- const unsigned mask((m_new_Q << core_terminal_t::INP_LH_SHIFT)
- | (m_cur_Q<<core_terminal_t::INP_HL_SHIFT));
+ const auto new_Q(m_new_Q);
- m_in_queue = QS_DELIVERED; /* mark as taken ... */
+ const auto mask((new_Q << core_terminal_t::INP_LH_SHIFT)
+ | (m_cur_Q << core_terminal_t::INP_HL_SHIFT));
+ m_in_queue = queue_status::DELIVERED; /* mark as taken ... */
switch (mask)
{
case core_terminal_t::STATE_INP_HL:
- m_cur_Q = m_new_Q;
- process(core_terminal_t::STATE_INP_HL | core_terminal_t::STATE_INP_ACTIVE);
- break;
case core_terminal_t::STATE_INP_LH:
- m_cur_Q = m_new_Q;
- process(core_terminal_t::STATE_INP_LH | core_terminal_t::STATE_INP_ACTIVE);
+ process(mask | core_terminal_t::STATE_INP_ACTIVE, new_Q);
break;
default:
+ /* do nothing */
break;
}
}
void detail::net_t::reset()
{
- m_time = netlist_time::zero();
- m_active = 0;
- m_in_queue = QS_DELIVERED;
+ m_next_scheduled_time = netlist_time::zero();
+ m_in_queue = queue_status::DELIVERED;
m_new_Q = 0;
m_cur_Q = 0;
- analog_net_t *p = dynamic_cast<analog_net_t *>(this);
+ auto *p = dynamic_cast<analog_net_t *>(this);
if (p != nullptr)
p->m_cur_Analog = 0.0;
- /* rebuild m_list */
+ /* rebuild m_list and reset terminals to active or analog out state */
m_list_active.clear();
for (core_terminal_t *ct : m_core_terms)
- m_list_active.push_back(ct);
-
- for (core_terminal_t *ct : m_core_terms)
+ {
ct->reset();
-
- for (core_terminal_t *ct : m_core_terms)
- if (ct->state() != logic_t::STATE_INP_PASSIVE)
- m_active++;
+ if (ct->terminal_state() != logic_t::STATE_INP_PASSIVE)
+ m_list_active.push_back(ct);
+ ct->set_copied_input(m_cur_Q);
+ }
}
void detail::net_t::add_terminal(detail::core_terminal_t &terminal)
{
for (auto &t : m_core_terms)
if (t == &terminal)
- netlist().log().fatal(MF_2_NET_1_DUPLICATE_TERMINAL_2, name(),
+ state().log().fatal(MF_2_NET_1_DUPLICATE_TERMINAL_2, name(),
t->name());
terminal.set_net(this);
m_core_terms.push_back(&terminal);
-
- if (terminal.state() != logic_t::STATE_INP_PASSIVE)
- m_active++;
}
void detail::net_t::remove_terminal(detail::core_terminal_t &terminal)
@@ -930,10 +785,8 @@ void detail::net_t::remove_terminal(detail::core_terminal_t &terminal)
plib::container::remove(m_core_terms, &terminal);
}
else
- netlist().log().fatal(MF_2_REMOVE_TERMINAL_1_FROM_NET_2, terminal.name(),
+ state().log().fatal(MF_2_REMOVE_TERMINAL_1_FROM_NET_2, terminal.name(),
this->name());
- if (terminal.state() != logic_t::STATE_INP_PASSIVE)
- m_active--;
}
void detail::net_t::move_connections(detail::net_t &dest_net)
@@ -941,37 +794,28 @@ void detail::net_t::move_connections(detail::net_t &dest_net)
for (auto &ct : m_core_terms)
dest_net.add_terminal(*ct);
m_core_terms.clear();
- m_active = 0;
}
// ----------------------------------------------------------------------------------------
// logic_net_t
// ----------------------------------------------------------------------------------------
-logic_net_t::logic_net_t(netlist_t &nl, const pstring &aname, detail::core_terminal_t *mr)
+logic_net_t::logic_net_t(netlist_state_t &nl, const pstring &aname, detail::core_terminal_t *mr)
: net_t(nl, aname, mr)
{
}
-logic_net_t::~logic_net_t()
-{
-}
-
// ----------------------------------------------------------------------------------------
// analog_net_t
// ----------------------------------------------------------------------------------------
-analog_net_t::analog_net_t(netlist_t &nl, const pstring &aname, detail::core_terminal_t *mr)
+analog_net_t::analog_net_t(netlist_state_t &nl, const pstring &aname, detail::core_terminal_t *mr)
: net_t(nl, aname, mr)
, m_cur_Analog(*this, "m_cur_Analog", 0.0)
, m_solver(nullptr)
{
}
-analog_net_t::~analog_net_t()
-{
-}
-
// ----------------------------------------------------------------------------------------
// core_terminal_t
// ----------------------------------------------------------------------------------------
@@ -981,42 +825,19 @@ detail::core_terminal_t::core_terminal_t(core_device_t &dev, const pstring &anam
: device_object_t(dev, dev.name() + "." + aname)
, plib::linkedlist_t<core_terminal_t>::element_t()
, m_delegate(delegate)
+#if USE_COPY_INSTEAD_OF_REFERENCE
+, m_Q(*this, "m_Q", 0)
+#endif
, m_net(nullptr)
, m_state(*this, "m_state", state)
{
}
-detail::core_terminal_t::~core_terminal_t()
-{
-}
-
-void detail::core_terminal_t::reset()
-{
- if (is_type(OUTPUT))
- set_state(STATE_OUT);
- else
- set_state(STATE_INP_ACTIVE);
-}
-
-void detail::core_terminal_t::set_net(net_t *anet)
-{
- m_net = anet;
-}
-
-void detail::core_terminal_t::clear_net()
-{
- m_net = nullptr;
-}
-
analog_t::analog_t(core_device_t &dev, const pstring &aname, const state_e state)
: core_terminal_t(dev, aname, state)
{
}
-analog_t::~analog_t()
-{
-}
-
logic_t::logic_t(core_device_t &dev, const pstring &aname, const state_e state,
nldelegate delegate)
: core_terminal_t(dev, aname, state, delegate)
@@ -1025,26 +846,18 @@ logic_t::logic_t(core_device_t &dev, const pstring &aname, const state_e state,
{
}
-logic_t::~logic_t()
-{
-}
-
// ----------------------------------------------------------------------------------------
// terminal_t
// ----------------------------------------------------------------------------------------
-terminal_t::terminal_t(core_device_t &dev, const pstring &aname)
+terminal_t::terminal_t(core_device_t &dev, const pstring &aname, terminal_t *otherterm)
: analog_t(dev, aname, STATE_BIDIR)
-, m_otherterm(nullptr)
, m_Idr1(nullptr)
, m_go1(nullptr)
, m_gt1(nullptr)
+, m_connected_terminal(otherterm)
{
- netlist().setup().register_term(*this);
-}
-
-terminal_t::~terminal_t()
-{
+ state().setup().register_term(*this);
}
void terminal_t::solve_now()
@@ -1055,7 +868,7 @@ void terminal_t::solve_now()
net().solver()->update_forced();
}
-void terminal_t::schedule_solve_after(const netlist_time &after)
+void terminal_t::schedule_solve_after(const netlist_time after)
{
// Nets may belong to railnets which do not have a solver attached
if (this->has_net())
@@ -1077,16 +890,12 @@ void terminal_t::schedule_solve_after(const netlist_time &after)
logic_output_t::logic_output_t(core_device_t &dev, const pstring &aname)
: logic_t(dev, aname, STATE_OUT)
- , m_my_net(dev.netlist(), name() + ".net", this)
+ , m_my_net(dev.state(), name() + ".net", this)
{
this->set_net(&m_my_net);
- netlist().m_nets.push_back(plib::owned_ptr<logic_net_t>(&m_my_net, false));
+ state().register_net(pool_owned_ptr<logic_net_t>(&m_my_net, false));
set_logic_family(dev.logic_family());
- netlist().setup().register_term(*this);
-}
-
-logic_output_t::~logic_output_t()
-{
+ state().setup().register_term(*this);
}
void logic_output_t::initial(const netlist_sig_t val)
@@ -1102,11 +911,7 @@ void logic_output_t::initial(const netlist_sig_t val)
analog_input_t::analog_input_t(core_device_t &dev, const pstring &aname)
: analog_t(dev, aname, STATE_INP_ACTIVE)
{
- netlist().setup().register_term(*this);
-}
-
-analog_input_t::~analog_input_t()
-{
+ state().setup().register_term(*this);
}
// ----------------------------------------------------------------------------------------
@@ -1115,17 +920,13 @@ analog_input_t::~analog_input_t()
analog_output_t::analog_output_t(core_device_t &dev, const pstring &aname)
: analog_t(dev, aname, STATE_OUT)
- , m_my_net(dev.netlist(), name() + ".net", this)
+ , m_my_net(dev.state(), name() + ".net", this)
{
- netlist().m_nets.push_back(plib::owned_ptr<analog_net_t>(&m_my_net, false));
+ state().register_net(pool_owned_ptr<analog_net_t>(&m_my_net, false));
this->set_net(&m_my_net);
//net().m_cur_Analog = NL_FCONST(0.0);
- netlist().setup().register_term(*this);
-}
-
-analog_output_t::~analog_output_t()
-{
+ state().setup().register_term(*this);
}
void analog_output_t::initial(const nl_double val)
@@ -1142,11 +943,7 @@ logic_input_t::logic_input_t(core_device_t &dev, const pstring &aname,
: logic_t(dev, aname, STATE_INP_ACTIVE, delegate)
{
set_logic_family(dev.logic_family());
- netlist().setup().register_term(*this);
-}
-
-logic_input_t::~logic_input_t()
-{
+ state().setup().register_term(*this);
}
// ----------------------------------------------------------------------------------------
@@ -1156,11 +953,7 @@ logic_input_t::~logic_input_t()
param_t::param_t(device_t &device, const pstring &name)
: device_object_t(device, device.name() + "." + name)
{
- device.setup().register_param(this->name(), *this);
-}
-
-param_t::~param_t()
-{
+ device.setup().register_param_t(this->name(), *this);
}
param_t::param_type_t param_t::param_type() const
@@ -1177,7 +970,7 @@ param_t::param_type_t param_t::param_type() const
return POINTER;
else
{
- netlist().log().fatal(MF_1_UNKNOWN_PARAM_TYPE, name());
+ state().log().fatal(MF_1_UNKNOWN_PARAM_TYPE, name());
return POINTER; /* Please compiler */
}
}
@@ -1186,50 +979,28 @@ param_t::param_type_t param_t::param_type() const
void param_t::update_param()
{
device().update_param();
- if (device().needs_update_after_param_change())
- device().update_dev();
}
-const pstring param_model_t::model_type()
+pstring param_t::get_initial(const device_t &dev, bool *found)
{
- if (m_map.size() == 0)
- netlist().setup().model_parse(this->Value(), m_map);
- return m_map["COREMODEL"];
+ pstring res = dev.setup().get_initial_param_val(this->name(), "");
+ *found = (res != "");
+ return res;
}
-param_str_t::param_str_t(device_t &device, const pstring &name, const pstring &val)
-: param_t(device, name)
-{
- m_param = device.setup().get_initial_param_val(this->name(),val);
-}
-
-param_str_t::~param_str_t()
-{
-}
-
-void param_str_t::changed()
-{
-}
-
-param_double_t::param_double_t(device_t &device, const pstring &name, const double val)
-: param_t(device, name)
+const pstring param_model_t::model_type()
{
- m_param = device.setup().get_initial_param_val(this->name(),val);
- netlist().save(*this, m_param, "m_param");
+ return state().setup().models().model_type(value());
}
-param_int_t::param_int_t(device_t &device, const pstring &name, const int val)
+param_str_t::param_str_t(device_t &device, const pstring &name, const pstring &val)
: param_t(device, name)
{
m_param = device.setup().get_initial_param_val(this->name(),val);
- netlist().save(*this, m_param, "m_param");
}
-param_logic_t::param_logic_t(device_t &device, const pstring &name, const bool val)
-: param_t(device, name)
+void param_str_t::changed()
{
- m_param = device.setup().get_initial_param_val(this->name(),val);
- netlist().save(*this, m_param, "m_param");
}
param_ptr_t::param_ptr_t(device_t &device, const pstring &name, uint8_t * val)
@@ -1241,53 +1012,25 @@ param_ptr_t::param_ptr_t(device_t &device, const pstring &name, uint8_t * val)
void param_model_t::changed()
{
- netlist().log().fatal(MF_1_MODEL_1_CAN_NOT_BE_CHANGED_AT_RUNTIME, name());
- m_map.clear();
+ state().log().fatal(MF_1_MODEL_1_CAN_NOT_BE_CHANGED_AT_RUNTIME, name());
}
const pstring param_model_t::model_value_str(const pstring &entity)
{
- if (m_map.size() == 0)
- netlist().setup().model_parse(this->Value(), m_map);
- return netlist().setup().model_value_str(m_map, entity);
+ return state().setup().models().model_value_str(value(), entity);
}
nl_double param_model_t::model_value(const pstring &entity)
{
- if (m_map.size() == 0)
- netlist().setup().model_parse(this->Value(), m_map);
- return netlist().setup().model_value(m_map, entity);
+ return state().setup().models().model_value(value(), entity);
}
-param_data_t::param_data_t(device_t &device, const pstring &name)
-: param_str_t(device, name, "")
-{
-}
-
-void param_data_t::changed()
-{
-}
-std::unique_ptr<plib::pistream> param_data_t::stream()
+plib::unique_ptr<plib::pistream> param_data_t::stream()
{
- return device().netlist().setup().get_data_stream(Value());
+ return device().setup().get_data_stream(value());
}
- namespace devices
- {
- // ----------------------------------------------------------------------------------------
- // mainclock
- // ----------------------------------------------------------------------------------------
-
- void NETLIB_NAME(mainclock)::mc_update(logic_net_t &net)
- {
- net.toggle_new_Q();
- net.update_devs();
- }
-
-
- } //namespace devices
-
bool detail::core_terminal_t::is_logic() const NL_NOEXCEPT
{
return dynamic_cast<const logic_t *>(this) != nullptr;
diff --git a/src/lib/netlist/nl_base.h b/src/lib/netlist/nl_base.h
index e56fde89f88..9d0eed869e0 100644
--- a/src/lib/netlist/nl_base.h
+++ b/src/lib/netlist/nl_base.h
@@ -9,27 +9,25 @@
#ifndef NLBASE_H_
#define NLBASE_H_
-#include "nl_lists.h"
-#include "nl_time.h"
+#ifdef NL_PROHIBIT_BASEH_INCLUDE
+#error "nl_base.h included. Please correct."
+#endif
+
#include "plib/palloc.h" // owned_ptr
#include "plib/pdynlib.h"
-#include "plib/pstate.h"
#include "plib/pfmtlog.h"
-#include "plib/pstream.h"
+#include "plib/pmempool.h"
#include "plib/ppmf.h"
+#include "plib/pstate.h"
+#include "plib/pstream.h"
-#include <unordered_map>
-
-#ifdef NL_PROHIBIT_BASEH_INCLUDE
-#error "nl_base.h included. Please correct."
-#endif
-
-// ----------------------------------------------------------------------------------------
-// Type definitions
-// ----------------------------------------------------------------------------------------
+#include "nl_errstr.h"
+#include "nl_lists.h"
+#include "nltypes.h"
+#include "plib/ptime.h"
-/*! netlist_sig_t is the type used for logic signals. */
-using netlist_sig_t = std::uint32_t;
+#include <unordered_map>
+#include <vector>
//============================================================
// MACROS / New Syntax
@@ -73,7 +71,7 @@ class NETLIB_NAME(name) : public device_t
/*! Used to define the destructor of a netlist device.
* The use of a destructor for netlist device should normally not be necessary.
*/
-#define NETLIB_DESTRUCTOR(name) public: virtual ~NETLIB_NAME(name)()
+#define NETLIB_DESTRUCTOR(name) public: virtual ~NETLIB_NAME(name)() noexcept
/*! Define an extended constructor and add further parameters to it.
* The macro allows to add further parameters to a device constructor. This is
@@ -85,14 +83,15 @@ class NETLIB_NAME(name) : public device_t
: device_t(owner, name)
/*! Add this to a device definition to mark the device as dynamic.
- * If NETLIB_IS_DYNAMIC(true) is added to the device definition the device
- * is treated as an analog dynamic device, i.e. #NETLIB_UPDATE_TERMINALSI
- * is called on a each step of the Newton-Raphson step
- * of solving the linear equations.
- *
- * You may also use e.g. NETLIB_IS_DYNAMIC(m_func() != "") to only make the
- * device a dynamic device if parameter m_func is set.
- */
+ *
+ * If NETLIB_IS_DYNAMIC(true) is added to the device definition the device
+ * is treated as an analog dynamic device, i.e. #NETLIB_UPDATE_TERMINALSI
+ * is called on a each step of the Newton-Raphson step
+ * of solving the linear equations.
+ *
+ * You may also use e.g. NETLIB_IS_DYNAMIC(m_func() != "") to only make the
+ * device a dynamic device if parameter m_func is set.
+ */
#define NETLIB_IS_DYNAMIC(expr) \
public: virtual bool is_dynamic() const override { return expr; }
@@ -127,36 +126,30 @@ class NETLIB_NAME(name) : public device_t
#define NETLIB_TIMESTEPI() \
public: virtual void timestep(const nl_double step) override
-#define NETLIB_UPDATE_AFTER_PARAM_CHANGE() \
- public: virtual bool needs_update_after_param_change() const override { return true; }
-
#define NETLIB_FAMILY(family) , m_famsetter(*this, family)
#define NETLIB_DELEGATE(chip, name) nldelegate(&NETLIB_NAME(chip) :: name, this)
-#define NETLIB_UPDATE_TERMINALSI() public: virtual void update_terminals() override
-#define NETLIB_HANDLERI(name) private: virtual void name() NL_NOEXCEPT
-#define NETLIB_UPDATEI() protected: virtual void update() NL_NOEXCEPT override
-#define NETLIB_UPDATE_PARAMI() public: virtual void update_param() override
-#define NETLIB_RESETI() protected: virtual void reset() override
+#define NETLIB_UPDATE_TERMINALSI() virtual void update_terminals() override
+#define NETLIB_HANDLERI(name) virtual void name() NL_NOEXCEPT
+#define NETLIB_UPDATEI() virtual void update() NL_NOEXCEPT override
+#define NETLIB_UPDATE_PARAMI() virtual void update_param() override
+#define NETLIB_RESETI() virtual void reset() override
#define NETLIB_TIMESTEP(chip) void NETLIB_NAME(chip) :: timestep(const nl_double step)
#define NETLIB_SUB(chip) nld_ ## chip
-#define NETLIB_SUBXX(ns, chip) std::unique_ptr< ns :: nld_ ## chip >
+#define NETLIB_SUBXX(ns, chip) pool_owned_ptr< ns :: nld_ ## chip >
-#define NETLIB_HANDLER(chip, name) void NETLIB_NAME(chip) :: name(void) NL_NOEXCEPT
+#define NETLIB_HANDLER(chip, name) void NETLIB_NAME(chip) :: name() NL_NOEXCEPT
#define NETLIB_UPDATE(chip) NETLIB_HANDLER(chip, update)
-// FIXME: NETLIB_PARENT_UPDATE should disappear
-#define NETLIB_PARENT_UPDATE(chip) NETLIB_NAME(chip) :: update();
-
#define NETLIB_RESET(chip) void NETLIB_NAME(chip) :: reset(void)
-#define NETLIB_UPDATE_PARAM(chip) void NETLIB_NAME(chip) :: update_param(void)
+#define NETLIB_UPDATE_PARAM(chip) void NETLIB_NAME(chip) :: update_param()
#define NETLIB_FUNC_VOID(chip, name, params) void NETLIB_NAME(chip) :: name params
-#define NETLIB_UPDATE_TERMINALS(chip) void NETLIB_NAME(chip) :: update_terminals(void)
+#define NETLIB_UPDATE_TERMINALS(chip) void NETLIB_NAME(chip) :: update_terminals()
//============================================================
// Asserts
@@ -169,7 +162,7 @@ class NETLIB_NAME(name) : public device_t
#define nl_assert(x) do { if (0) if (!(x)) { /*throw nl_exception(plib::pfmt("assert: {1}:{2}: {3}")(__FILE__)(__LINE__)(#x) ); */} } while (0)
#define NL_NOEXCEPT noexcept
#endif
-#define nl_assert_always(x, msg) do { if (!(x)) throw nl_exception(plib::pfmt("Fatal error: {1}\nCaused by assert: {2}:{3}: {4}")(msg)(__FILE__)(__LINE__)(#x)); } while (0)
+#define nl_assert_always(x, msg) do { if (!(x)) throw nl_exception("Fatal error: {1}\nCaused by assert: {2}:{3}: {4}", msg, __FILE__, __LINE__, #x); } while (0)
//============================================================
// Namespace starts
@@ -177,6 +170,11 @@ class NETLIB_NAME(name) : public device_t
namespace netlist
{
+ /*! Delegate type for device notification.
+ *
+ */
+ using nldelegate = plib::pmfp<void>;
+
// -----------------------------------------------------------------------------
// forward definitions
// -----------------------------------------------------------------------------
@@ -191,27 +189,23 @@ namespace netlist
class NETLIB_NAME(base_proxy);
class NETLIB_NAME(base_d_to_a_proxy);
class NETLIB_NAME(base_a_to_d_proxy);
- }
+ } // namespace devices
namespace detail {
- class object_t;
- class device_object_t;
- struct netlist_ref;
- class core_terminal_t;
struct family_setter_t;
class queue_t;
- class net_t;
- }
+ } // namespace detail
class logic_output_t;
class logic_input_t;
class analog_net_t;
class logic_net_t;
- class net_t;
class setup_t;
class netlist_t;
+ class netlist_state_t;
class core_device_t;
class device_t;
+ class callbacks_t;
//============================================================
// Exceptions
@@ -229,9 +223,12 @@ namespace netlist
explicit nl_exception(const pstring &text //!< text to be passed
)
: plib::pexception(text) { }
- /*! Copy constructor. */
- nl_exception(const nl_exception &e) : plib::pexception(e) { }
- virtual ~nl_exception();
+
+ template<typename... Args>
+ explicit nl_exception(const pstring &fmt //!< format to be used
+ , Args&&... args //!< arguments to be passed
+ )
+ : plib::pexception(plib::pfmt(fmt)(std::forward<Args>(args)...)) { }
};
/*! Logic families descriptors are used to create proxy devices.
@@ -242,18 +239,21 @@ namespace netlist
{
public:
logic_family_desc_t();
- virtual ~logic_family_desc_t();
- virtual plib::owned_ptr<devices::nld_base_d_to_a_proxy> create_d_a_proxy(netlist_t &anetlist, const pstring &name,
+ COPYASSIGNMOVE(logic_family_desc_t, delete)
+
+ virtual ~logic_family_desc_t() noexcept = default;
+
+ virtual pool_owned_ptr<devices::nld_base_d_to_a_proxy> create_d_a_proxy(netlist_state_t &anetlist, const pstring &name,
logic_output_t *proxied) const = 0;
- virtual plib::owned_ptr<devices::nld_base_a_to_d_proxy> create_a_d_proxy(netlist_t &anetlist, const pstring &name,
+ virtual pool_owned_ptr<devices::nld_base_a_to_d_proxy> create_a_d_proxy(netlist_state_t &anetlist, const pstring &name,
logic_input_t *proxied) const = 0;
double fixed_V() const { return m_fixed_V; }
double low_thresh_V(const double VN, const double VP) const { return VN + (VP - VN) * m_low_thresh_PCNT; }
double high_thresh_V(const double VN, const double VP) const { return VN + (VP - VN) * m_high_thresh_PCNT; }
- double low_V(const double VN, const double VP) const { return VN + m_low_VO; }
- double high_V(const double VN, const double VP) const { return VP - m_high_VO; }
+ double low_V(const double VN, const double VP) const { plib::unused_var(VP); return VN + m_low_VO; }
+ double high_V(const double VN, const double VP) const { plib::unused_var(VN); return VP - m_high_VO; }
double R_low() const { return m_R_low; }
double R_high() const { return m_R_high; }
@@ -282,12 +282,14 @@ namespace netlist
public:
logic_family_t() : m_logic_family(nullptr) {}
+ COPYASSIGNMOVE(logic_family_t, delete)
+
const logic_family_desc_t *logic_family() const { return m_logic_family; }
void set_logic_family(const logic_family_desc_t *fam) { m_logic_family = fam; }
protected:
- ~logic_family_t() { } // prohibit polymorphic destruction
+ ~logic_family_t() noexcept = default; // prohibit polymorphic destruction
const logic_family_desc_t *m_logic_family;
};
@@ -317,12 +319,15 @@ namespace netlist
const pstring &name, //!< identifier/name for this state variable
const T &value //!< Initial value after construction
);
+
+ //! Destructor.
+ ~state_var() noexcept = default;
//! Copy Constructor.
- constexpr state_var(const state_var &rhs) noexcept = default;
+ constexpr state_var(const state_var &rhs) = default;
//! Move Constructor.
constexpr state_var(state_var &&rhs) noexcept = default;
//! Assignment operator to assign value of a state var.
- C14CONSTEXPR state_var &operator=(const state_var &rhs) noexcept = default;
+ C14CONSTEXPR state_var &operator=(const state_var &rhs) = default;
//! Assignment move operator to assign value of a state var.
C14CONSTEXPR state_var &operator=(state_var &&rhs) noexcept = default;
//! Assignment operator to assign value of type T.
@@ -345,25 +350,29 @@ namespace netlist
* Please refer to \ref state_var.
*/
template <typename T, std::size_t N>
- struct state_var<T[N]>
+ struct state_array
{
public:
//! Constructor.
template <typename O>
- state_var(O &owner, //!< owner must have a netlist() method.
+ state_array(O &owner, //!< owner must have a netlist() method.
const pstring &name, //!< identifier/name for this state variable
const T &value //!< Initial value after construction
);
//! Copy Constructor.
- state_var(const state_var &rhs) NL_NOEXCEPT = default;
+ state_array(const state_array &rhs) noexcept = default;
+ //! Destructor.
+ ~state_array() noexcept = default;
//! Move Constructor.
- state_var(state_var &&rhs) NL_NOEXCEPT = default;
- state_var &operator=(const state_var &rhs) NL_NOEXCEPT = default;
- state_var &operator=(const T &rhs) NL_NOEXCEPT { m_value = rhs; return *this; }
- T & operator[](const std::size_t i) NL_NOEXCEPT { return m_value[i]; }
- constexpr T & operator[](const std::size_t i) const NL_NOEXCEPT { return m_value[i]; }
+ state_array(state_array &&rhs) noexcept = default;
+ state_array &operator=(const state_array &rhs) noexcept = default;
+ state_array &operator=(state_array &&rhs) noexcept = default;
+
+ state_array &operator=(const T &rhs) noexcept { m_value = rhs; return *this; }
+ T & operator[](const std::size_t i) noexcept { return m_value[i]; }
+ constexpr const T & operator[](const std::size_t i) const noexcept { return m_value[i]; }
private:
- T m_value[N];
+ std::array<T, N> m_value;
};
// -----------------------------------------------------------------------------
@@ -382,164 +391,324 @@ namespace netlist
/*! predefined state variable type for sig_t */
using state_var_sig = state_var<netlist_sig_t>;
- // -----------------------------------------------------------------------------
- // object_t
- // -----------------------------------------------------------------------------
+ namespace detail {
- /*! The base class for netlist devices, terminals and parameters.
- *
- * This class serves as the base class for all device, terminal and
- * objects. It provides new and delete operators to support e.g. pooled
- * memory allocation to enhance locality. Please refer to \ref USE_MEMPOOL as
- * well.
- */
- class detail::object_t
- {
- public:
+ // -----------------------------------------------------------------------------
+ // object_t
+ // -----------------------------------------------------------------------------
- /*! Constructor.
+ /*! The base class for netlist devices, terminals and parameters.
*
- * Every class derived from the object_t class must have a name.
+ * This class serves as the base class for all device, terminal and
+ * objects. It provides new and delete operators to support e.g. pooled
+ * memory allocation to enhance locality. Please refer to \ref USE_MEMPOOL as
+ * well.
*/
- explicit object_t(const pstring &aname /*!< string containing name of the object */);
+ class object_t
+ {
+ public:
- /*! return name of the object
- *
- * \returns name of the object.
- */
- const pstring &name() const;
+ /*! Constructor.
+ *
+ * Every class derived from the object_t class must have a name.
+ */
+ explicit object_t(const pstring &aname /*!< string containing name of the object */);
+
+ COPYASSIGNMOVE(object_t, delete)
+ /*! return name of the object
+ *
+ * \returns name of the object.
+ */
+ pstring name() const;
+
+ #if 0
+ void * operator new (size_t size, void *ptr) { plib::unused_var(size); return ptr; }
+ void operator delete (void *ptr, void *) { plib::unused_var(ptr); }
+ void * operator new (size_t size) = delete;
+ void operator delete (void * mem) = delete;
+ #endif
+ protected:
+ ~object_t() noexcept = default; // only childs should be destructible
- void * operator new (size_t size, void *ptr) { return ptr; }
- void operator delete (void *ptr, void *) { }
- void * operator new (size_t size);
- void operator delete (void * mem);
- protected:
- ~object_t(); // only childs should be destructible
+ private:
+ //pstring m_name;
+ static std::unordered_map<const object_t *, pstring> &name_hash()
+ {
+ static std::unordered_map<const object_t *, pstring> lhash;
+ return lhash;
+ }
+ };
- private:
- std::unique_ptr<pstring> m_name;
- };
+ struct netlist_ref
+ {
+ explicit netlist_ref(netlist_state_t &nl);
- struct detail::netlist_ref
- {
- explicit constexpr netlist_ref(netlist_t &nl) : m_netlist(nl) { }
+ COPYASSIGNMOVE(netlist_ref, delete)
- C14CONSTEXPR netlist_t & netlist() NL_NOEXCEPT { return m_netlist; }
- constexpr const netlist_t & netlist() const NL_NOEXCEPT { return m_netlist; }
+ netlist_state_t & state() noexcept;
+ const netlist_state_t & state() const noexcept;
- protected:
- ~netlist_ref() = default; // prohibit polymorphic destruction
+ setup_t & setup() noexcept;
+ const setup_t & setup() const noexcept;
- private:
- netlist_t & m_netlist;
+ netlist_t & exec() noexcept { return m_netlist; }
+ const netlist_t & exec() const noexcept { return m_netlist; }
- };
+ protected:
+ ~netlist_ref() noexcept = default; // prohibit polymorphic destruction
- // -----------------------------------------------------------------------------
- // device_object_t
- // -----------------------------------------------------------------------------
+ private:
+ netlist_t & m_netlist;
- /*! Base class for all objects being owned by a device.
- *
- * Serves as the base class of all objects being owned by a device.
- *
- */
- class detail::device_object_t : public detail::object_t
- {
- public:
- /*! Constructor.
+ };
+
+ // -----------------------------------------------------------------------------
+ // device_object_t
+ // -----------------------------------------------------------------------------
+
+ /*! Base class for all objects being owned by a device.
+ *
+ * Serves as the base class of all objects being owned by a device.
*
- * \param dev device owning the object.
- * \param name string holding the name of the device
*/
- device_object_t(core_device_t &dev, const pstring &name);
+ class device_object_t : public object_t
+ {
+ public:
+ /*! Constructor.
+ *
+ * \param dev device owning the object.
+ * \param name string holding the name of the device
+ */
+ device_object_t(core_device_t &dev, const pstring &name);
+
+ /*! returns reference to owning device.
+ * \returns reference to owning device.
+ */
+ core_device_t &device() noexcept { return m_device; }
+ const core_device_t &device() const noexcept { return m_device; }
+
+ /*! The netlist owning the owner of this object.
+ * \returns reference to netlist object.
+ */
+ netlist_state_t &state() NL_NOEXCEPT;
+ const netlist_state_t &state() const NL_NOEXCEPT;
+
+ netlist_t &exec() NL_NOEXCEPT;
+ const netlist_t &exec() const NL_NOEXCEPT;
- /*! returns reference to owning device.
- * \returns reference to owning device.
- */
- core_device_t &device() NL_NOEXCEPT { return m_device; }
- const core_device_t &device() const NL_NOEXCEPT { return m_device; }
+ private:
+ core_device_t & m_device;
+ };
- /*! The netlist owning the owner of this object.
- * \returns reference to netlist object.
+ // -----------------------------------------------------------------------------
+ // core_terminal_t
+ // -----------------------------------------------------------------------------
+
+ /*! Base class for all terminals.
+ *
+ * All terminals are derived from this class.
+ *
*/
- netlist_t &netlist() NL_NOEXCEPT;
- const netlist_t &netlist() const NL_NOEXCEPT;
- private:
- core_device_t & m_device;
-};
+ class net_t;
- /*! Delegate type for device notification.
- *
- */
- typedef plib::pmfp<void> nldelegate;
+ class core_terminal_t : public device_object_t,
+ public plib::linkedlist_t<core_terminal_t>::element_t
+ {
+ public:
- // -----------------------------------------------------------------------------
- // core_terminal_t
- // -----------------------------------------------------------------------------
+ using list_t = std::vector<core_terminal_t *>;
- /*! Base class for all terminals.
- *
- * All terminals are derived from this class.
- *
- */
- class detail::core_terminal_t : public device_object_t,
- public plib::linkedlist_t<core_terminal_t>::element_t
- {
- public:
+ static constexpr const auto INP_HL_SHIFT = 0;
+ static constexpr const auto INP_LH_SHIFT = 1;
+ static constexpr const auto INP_ACTIVE_SHIFT = 2;
+
+ enum state_e {
+ STATE_INP_PASSIVE = 0,
+ STATE_INP_HL = (1 << INP_HL_SHIFT),
+ STATE_INP_LH = (1 << INP_LH_SHIFT),
+ STATE_INP_ACTIVE = (1 << INP_ACTIVE_SHIFT),
+ STATE_OUT = 128,
+ STATE_BIDIR = 256
+ };
+
+ core_terminal_t(core_device_t &dev, const pstring &aname,
+ const state_e state, nldelegate delegate = nldelegate());
+ virtual ~core_terminal_t() noexcept = default;
+
+ COPYASSIGNMOVE(core_terminal_t, delete)
+
+ /*! The object type.
+ * \returns type of the object
+ */
+ terminal_type type() const;
+ /*! Checks if object is of specified type.
+ * \param atype type to check object against.
+ * \returns true if object is of specified type else false.
+ */
+ bool is_type(const terminal_type atype) const noexcept { return (type() == atype); }
+
+ void set_net(net_t *anet) noexcept { m_net = anet; }
+ void clear_net() noexcept { m_net = nullptr; }
+ bool has_net() const noexcept { return (m_net != nullptr); }
+
+ const net_t & net() const noexcept { return *m_net;}
+ net_t & net() noexcept { return *m_net;}
- using list_t = std::vector<core_terminal_t *>;
+ bool is_logic() const NL_NOEXCEPT;
+ bool is_analog() const NL_NOEXCEPT;
- static constexpr const unsigned INP_HL_SHIFT = 0;
- static constexpr const unsigned INP_LH_SHIFT = 1;
- static constexpr const unsigned INP_ACTIVE_SHIFT = 2;
+ bool is_state(state_e astate) const noexcept { return (m_state == astate); }
+ state_e terminal_state() const noexcept { return m_state; }
+ void set_state(state_e astate) noexcept { m_state = astate; }
- enum state_e {
- STATE_INP_PASSIVE = 0,
- STATE_INP_HL = (1 << INP_HL_SHIFT),
- STATE_INP_LH = (1 << INP_LH_SHIFT),
- STATE_INP_ACTIVE = (1 << INP_ACTIVE_SHIFT),
- STATE_OUT = 128,
- STATE_BIDIR = 256
+ void reset() noexcept { set_state(is_type(OUTPUT) ? STATE_OUT : STATE_INP_ACTIVE); }
+
+ nldelegate m_delegate;
+ #if USE_COPY_INSTEAD_OF_REFERENCE
+ void set_copied_input(netlist_sig_t val)
+ {
+ m_Q = val;
+ }
+
+ state_var_sig m_Q;
+ #else
+ void set_copied_input(netlist_sig_t val) const { plib::unused_var(val); }
+ #endif
+
+ private:
+ net_t * m_net;
+ state_var<state_e> m_state;
};
- core_terminal_t(core_device_t &dev, const pstring &aname,
- const state_e state, nldelegate delegate = nldelegate());
- virtual ~core_terminal_t();
+ // -----------------------------------------------------------------------------
+ // net_t
+ // -----------------------------------------------------------------------------
- /*! The object type.
- * \returns type of the object
- */
- terminal_type type() const;
- /*! Checks if object is of specified type.
- * \param atype type to check object against.
- * \returns true if object is of specified type else false.
- */
- bool is_type(const terminal_type atype) const { return (type() == atype); }
+ class net_t :
+ public object_t,
+ public netlist_ref
+ {
+ public:
- void set_net(net_t *anet);
- void clear_net();
- bool has_net() const NL_NOEXCEPT { return (m_net != nullptr); }
+ enum class queue_status
+ {
+ DELAYED_DUE_TO_INACTIVE = 0,
+ QUEUED,
+ DELIVERED
+ };
- const net_t & net() const NL_NOEXCEPT { return *m_net;}
- net_t & net() NL_NOEXCEPT { return *m_net;}
+ net_t(netlist_state_t &nl, const pstring &aname, core_terminal_t *mr = nullptr);
- bool is_logic() const NL_NOEXCEPT;
- bool is_analog() const NL_NOEXCEPT;
+ COPYASSIGNMOVE(net_t, delete)
- bool is_state(const state_e &astate) const NL_NOEXCEPT { return (m_state == astate); }
- const state_e &state() const NL_NOEXCEPT { return m_state; }
- void set_state(const state_e &astate) NL_NOEXCEPT { m_state = astate; }
+ virtual ~net_t() noexcept = default;
- void reset();
+ void reset();
- nldelegate m_delegate;
+ void toggle_new_Q() noexcept { m_new_Q = (m_cur_Q ^ 1); }
- private:
- net_t * m_net;
- state_var<state_e> m_state;
- };
+ void toggle_and_push_to_queue(netlist_time delay) NL_NOEXCEPT
+ {
+ toggle_new_Q();
+ push_to_queue(delay);
+ }
+
+ void push_to_queue(netlist_time delay) NL_NOEXCEPT;
+ bool is_queued() const noexcept { return m_in_queue == queue_status::QUEUED; }
+
+ void update_devs() NL_NOEXCEPT;
+
+ netlist_time next_scheduled_time() const noexcept { return m_next_scheduled_time; }
+ void set_next_scheduled_time(netlist_time ntime) noexcept { m_next_scheduled_time = ntime; }
+
+ bool isRailNet() const noexcept { return !(m_railterminal == nullptr); }
+ core_terminal_t & railterminal() const noexcept { return *m_railterminal; }
+
+ std::size_t num_cons() const noexcept { return m_core_terms.size(); }
+
+ void add_to_active_list(core_terminal_t &term) NL_NOEXCEPT;
+ void remove_from_active_list(core_terminal_t &term) NL_NOEXCEPT;
+
+ /* setup stuff */
+
+ void add_terminal(core_terminal_t &terminal);
+ void remove_terminal(core_terminal_t &terminal);
+
+ bool is_logic() const NL_NOEXCEPT;
+ bool is_analog() const NL_NOEXCEPT;
+
+ void rebuild_list(); /* rebuild m_list after a load */
+ void move_connections(net_t &dest_net);
+
+ std::vector<core_terminal_t *> &core_terms() { return m_core_terms; }
+ #if USE_COPY_INSTEAD_OF_REFERENCE
+ void update_inputs()
+ {
+ for (auto & term : m_core_terms)
+ term->m_Q = m_cur_Q;
+ }
+ #else
+ void update_inputs() const
+ {
+ /* nothing needs to be done */
+ }
+ #endif
+
+ protected:
+
+ /* only used for logic nets */
+ netlist_sig_t Q() const noexcept { return m_cur_Q; }
+
+ /* only used for logic nets */
+ void initial(const netlist_sig_t val) noexcept
+ {
+ m_cur_Q = m_new_Q = val;
+ update_inputs();
+ }
+
+ /* only used for logic nets */
+ void set_Q_and_push(const netlist_sig_t newQ, const netlist_time delay) NL_NOEXCEPT
+ {
+ if (newQ != m_new_Q)
+ {
+ m_new_Q = newQ;
+ push_to_queue(delay);
+ }
+ }
+
+ /* only used for logic nets */
+ void set_Q_time(const netlist_sig_t newQ, const netlist_time at) NL_NOEXCEPT
+ {
+ if (newQ != m_new_Q)
+ {
+ m_in_queue = queue_status::DELAYED_DUE_TO_INACTIVE;
+ m_next_scheduled_time = at;
+ }
+ m_cur_Q = m_new_Q = newQ;
+ update_inputs();
+ }
+
+ /* internal state support
+ * FIXME: get rid of this and implement export/import in MAME
+ */
+ /* only used for logic nets */
+ netlist_sig_t *Q_state_ptr() { return m_cur_Q.ptr(); }
+
+ private:
+ state_var<netlist_sig_t> m_new_Q;
+ state_var<netlist_sig_t> m_cur_Q;
+ state_var<queue_status> m_in_queue; /* 0: not in queue, 1: in queue, 2: last was taken */
+ state_var<netlist_time> m_next_scheduled_time;
+
+ core_terminal_t * m_railterminal;
+ plib::linkedlist_t<core_terminal_t> m_list_active;
+ std::vector<core_terminal_t *> m_core_terms; // save post-start m_list ...
+
+ template <typename T>
+ void process(const T mask, netlist_sig_t sig);
+ };
+ } // namespace detail
// -----------------------------------------------------------------------------
// analog_t
@@ -550,7 +719,6 @@ namespace netlist
public:
analog_t(core_device_t &dev, const pstring &aname, const state_e state);
- virtual ~analog_t();
const analog_net_t & net() const NL_NOEXCEPT;
analog_net_t & net() NL_NOEXCEPT;
@@ -564,53 +732,44 @@ namespace netlist
{
public:
- terminal_t(core_device_t &dev, const pstring &aname);
- virtual ~terminal_t();
+ terminal_t(core_device_t &dev, const pstring &aname, terminal_t *otherterm);
nl_double operator ()() const NL_NOEXCEPT;
- void set(const nl_double &G) NL_NOEXCEPT
+ void set_conductivity(const nl_double G) noexcept
{
- set(G,G, 0.0);
+ set_go_gt_I(-G, G, 0.0);
}
- void set(const nl_double &GO, const nl_double &GT) NL_NOEXCEPT
+ void set_go_gt(const nl_double GO, const nl_double GT) noexcept
{
- set(GO, GT, 0.0);
+ set_go_gt_I(GO, GT, 0.0);
}
- void set(const nl_double &GO, const nl_double &GT, const nl_double &I) NL_NOEXCEPT
+ void set_go_gt_I(const nl_double GO, const nl_double GT, const nl_double I) noexcept
{
- set_ptr(m_Idr1, I);
- set_ptr(m_go1, GO);
- set_ptr(m_gt1, GT);
+ if (m_go1 != nullptr)
+ {
+ if (*m_Idr1 != I) *m_Idr1 = I;
+ if (*m_go1 != GO) *m_go1 = GO;
+ if (*m_gt1 != GT) *m_gt1 = GT;
+ }
}
void solve_now();
- void schedule_solve_after(const netlist_time &after);
+ void schedule_solve_after(const netlist_time after);
- void set_ptrs(nl_double *gt, nl_double *go, nl_double *Idr) NL_NOEXCEPT
- {
- m_gt1 = gt;
- m_go1 = go;
- m_Idr1 = Idr;
- }
-
- terminal_t *m_otherterm;
+ void set_ptrs(nl_double *gt, nl_double *go, nl_double *Idr) noexcept;
+ terminal_t *connected_terminal() const noexcept { return m_connected_terminal; }
private:
- void set_ptr(nl_double *ptr, const nl_double &val) NL_NOEXCEPT
- {
- if (ptr != nullptr && *ptr != val)
- {
- *ptr = val;
- }
- }
nl_double *m_Idr1; // drive current
nl_double *m_go1; // conductance for Voltage from other term
nl_double *m_gt1; // conductance for total conductance
+ terminal_t *m_connected_terminal;
+
};
@@ -623,7 +782,6 @@ namespace netlist
public:
logic_t(core_device_t &dev, const pstring &aname,
const state_e state, nldelegate delegate = nldelegate());
- virtual ~logic_t();
bool has_proxy() const { return (m_proxy != nullptr); }
devices::nld_base_proxy *get_proxy() const { return m_proxy; }
@@ -647,7 +805,6 @@ namespace netlist
public:
logic_input_t(core_device_t &dev, const pstring &aname,
nldelegate delegate = nldelegate());
- virtual ~logic_input_t();
netlist_sig_t operator()() const NL_NOEXCEPT
{
@@ -679,9 +836,6 @@ namespace netlist
const pstring &aname /*!< name of terminal */
);
- /*! Destructor */
- virtual ~analog_input_t();
-
/*! returns voltage at terminal.
* \returns voltage at terminal.
*/
@@ -694,124 +848,18 @@ namespace netlist
};
- // -----------------------------------------------------------------------------
- // net_t
- // -----------------------------------------------------------------------------
-
- class detail::net_t :
- public detail::object_t,
- public detail::netlist_ref
- {
- public:
-
- enum queue_status
- {
- QS_DELAYED_DUE_TO_INACTIVE = 0,
- QS_QUEUED,
- QS_DELIVERED
- };
-
- net_t(netlist_t &nl, const pstring &aname, core_terminal_t *mr = nullptr);
- virtual ~net_t();
-
- void reset();
-
- void toggle_new_Q() NL_NOEXCEPT { m_new_Q = (m_cur_Q ^ 1); }
-
- void toggle_and_push_to_queue(const netlist_time &delay) NL_NOEXCEPT
- {
- toggle_new_Q();
- push_to_queue(delay);
- }
-
- void push_to_queue(const netlist_time &delay) NL_NOEXCEPT;
- bool is_queued() const NL_NOEXCEPT { return m_in_queue == QS_QUEUED; }
-
- void update_devs() NL_NOEXCEPT;
-
- const netlist_time &time() const NL_NOEXCEPT { return m_time; }
- void set_time(const netlist_time &ntime) NL_NOEXCEPT { m_time = ntime; }
-
- bool isRailNet() const NL_NOEXCEPT { return !(m_railterminal == nullptr); }
- core_terminal_t & railterminal() const NL_NOEXCEPT { return *m_railterminal; }
-
- std::size_t num_cons() const NL_NOEXCEPT { return m_core_terms.size(); }
-
- void inc_active(core_terminal_t &term) NL_NOEXCEPT;
- void dec_active(core_terminal_t &term) NL_NOEXCEPT;
-
- /* setup stuff */
-
- void add_terminal(core_terminal_t &terminal);
- void remove_terminal(core_terminal_t &terminal);
-
- bool is_logic() const NL_NOEXCEPT;
- bool is_analog() const NL_NOEXCEPT;
-
- void rebuild_list(); /* rebuild m_list after a load */
- void move_connections(net_t &dest_net);
-
- std::vector<core_terminal_t *> m_core_terms; // save post-start m_list ...
-
- protected:
- state_var<netlist_sig_t> m_new_Q;
- state_var<netlist_sig_t> m_cur_Q;
- state_var<queue_status> m_in_queue; /* 0: not in queue, 1: in queue, 2: last was taken */
- state_var_s32 m_active;
-
- state_var<netlist_time> m_time;
-
- private:
- plib::linkedlist_t<core_terminal_t> m_list_active;
- core_terminal_t * m_railterminal;
-
- void process(unsigned Mask);
- };
class logic_net_t : public detail::net_t
{
public:
- logic_net_t(netlist_t &nl, const pstring &aname, detail::core_terminal_t *mr = nullptr);
- virtual ~logic_net_t();
-
- netlist_sig_t Q() const NL_NOEXCEPT { return m_cur_Q; }
- void initial(const netlist_sig_t val) NL_NOEXCEPT { m_cur_Q = m_new_Q = val; }
-
- void set_Q_and_push(const netlist_sig_t newQ, const netlist_time &delay) NL_NOEXCEPT
- {
- if (newQ != m_new_Q )
- {
- m_new_Q = newQ;
- push_to_queue(delay);
- }
- }
- void set_Q_and_push_force(const netlist_sig_t newQ, const netlist_time &delay) NL_NOEXCEPT
- {
- if (newQ != m_new_Q || is_queued())
- {
- m_new_Q = newQ;
- push_to_queue(delay);
- }
- }
-
- void set_Q_time(const netlist_sig_t newQ, const netlist_time &at) NL_NOEXCEPT
- {
- if (newQ != m_new_Q)
- {
- m_in_queue = QS_DELAYED_DUE_TO_INACTIVE;
- m_time = at;
- }
- m_cur_Q = m_new_Q = newQ;
- }
-
- /* internal state support
- * FIXME: get rid of this and implement export/import in MAME
- */
- netlist_sig_t *Q_state_ptr() { return m_cur_Q.ptr(); }
+ logic_net_t(netlist_state_t &nl, const pstring &aname, detail::core_terminal_t *mr = nullptr);
- protected:
- private:
+ using detail::net_t::Q;
+ using detail::net_t::initial;
+ using detail::net_t::set_Q_and_push;
+ using detail::net_t::set_Q_time;
+ using detail::net_t::Q_state_ptr;
};
@@ -823,9 +871,7 @@ namespace netlist
friend class detail::net_t;
- analog_net_t(netlist_t &nl, const pstring &aname, detail::core_terminal_t *mr = nullptr);
-
- virtual ~analog_net_t();
+ analog_net_t(netlist_state_t &nl, const pstring &aname, detail::core_terminal_t *mr = nullptr);
nl_double Q_Analog() const NL_NOEXCEPT { return m_cur_Analog; }
void set_Q_Analog(const nl_double v) NL_NOEXCEPT { m_cur_Analog = v; }
@@ -849,21 +895,15 @@ namespace netlist
public:
logic_output_t(core_device_t &dev, const pstring &aname);
- virtual ~logic_output_t();
void initial(const netlist_sig_t val);
- void push(const netlist_sig_t newQ, const netlist_time &delay) NL_NOEXCEPT
+ void push(const netlist_sig_t newQ, const netlist_time delay) NL_NOEXCEPT
{
m_my_net.set_Q_and_push(newQ, delay); // take the shortcut
}
- void push_force(const netlist_sig_t newQ, const netlist_time &delay) NL_NOEXCEPT
- {
- m_my_net.set_Q_and_push_force(newQ, delay); // take the shortcut
- }
-
- void set_Q_time(const netlist_sig_t newQ, const netlist_time &at) NL_NOEXCEPT
+ void set_Q_time(const netlist_sig_t newQ, const netlist_time at) NL_NOEXCEPT
{
m_my_net.set_Q_time(newQ, at); // take the shortcut
}
@@ -876,7 +916,6 @@ namespace netlist
{
public:
analog_output_t(core_device_t &dev, const pstring &aname);
- virtual ~analog_output_t();
void push(const nl_double val) NL_NOEXCEPT { set_Q(val); }
void initial(const nl_double val);
@@ -904,13 +943,17 @@ namespace netlist
param_t(device_t &device, const pstring &name);
+ COPYASSIGNMOVE(param_t, delete)
+
param_type_t param_type() const;
protected:
- virtual ~param_t(); /* not intended to be destroyed */
+ virtual ~param_t() noexcept = default; /* not intended to be destroyed */
void update_param();
+ pstring get_initial(const device_t &dev, bool *found);
+
template<typename C>
void set(C &p, const C v)
{
@@ -923,53 +966,51 @@ namespace netlist
};
- class param_ptr_t final: public param_t
- {
- public:
- param_ptr_t(device_t &device, const pstring &name, std::uint8_t* val);
- std::uint8_t * operator()() const NL_NOEXCEPT { return m_param; }
- void setTo(std::uint8_t *param) { set(m_param, param); }
- private:
- std::uint8_t* m_param;
- };
+ // -----------------------------------------------------------------------------
+ // numeric parameter template
+ // -----------------------------------------------------------------------------
- class param_logic_t final: public param_t
+ template <typename T>
+ class param_num_t final: public param_t
{
public:
- param_logic_t(device_t &device, const pstring &name, const bool val);
- const bool &operator()() const NL_NOEXCEPT { return m_param; }
- void setTo(const bool &param) { set(m_param, param); }
- private:
- bool m_param;
- };
+ param_num_t(device_t &device, const pstring &name, const T val);
- class param_int_t final: public param_t
- {
- public:
- param_int_t(device_t &device, const pstring &name, const int val);
- const int &operator()() const NL_NOEXCEPT { return m_param; }
- void setTo(const int &param) { set(m_param, param); }
+ const T operator()() const NL_NOEXCEPT { return m_param; }
+ void setTo(const T &param) { set(m_param, param); }
private:
- int m_param;
+ T m_param;
};
- class param_double_t final: public param_t
+ /* FIXME: these should go as well */
+ using param_logic_t = param_num_t<bool>;
+ using param_int_t = param_num_t<int>;
+ using param_double_t = param_num_t<double>;
+
+ // -----------------------------------------------------------------------------
+ // pointer parameter
+ // -----------------------------------------------------------------------------
+
+ class param_ptr_t final: public param_t
{
public:
- param_double_t(device_t &device, const pstring &name, const double val);
- const double &operator()() const NL_NOEXCEPT { return m_param; }
- void setTo(const double &param) { set(m_param, param); }
+ param_ptr_t(device_t &device, const pstring &name, std::uint8_t* val);
+ std::uint8_t * operator()() const NL_NOEXCEPT { return m_param; }
+ void setTo(std::uint8_t *param) { set(m_param, param); }
private:
- double m_param;
+ std::uint8_t* m_param;
};
+ // -----------------------------------------------------------------------------
+ // string parameter
+ // -----------------------------------------------------------------------------
+
class param_str_t : public param_t
{
public:
param_str_t(device_t &device, const pstring &name, const pstring &val);
- virtual ~param_str_t();
- const pstring &operator()() const NL_NOEXCEPT { return Value(); }
+ const pstring &operator()() const NL_NOEXCEPT { return value(); }
void setTo(const pstring &param) NL_NOEXCEPT
{
if (m_param != param)
@@ -981,11 +1022,16 @@ namespace netlist
}
protected:
virtual void changed();
- const pstring &Value() const NL_NOEXCEPT { return m_param; }
+ const pstring &value() const NL_NOEXCEPT { return m_param; }
private:
+ PALIGNAS_CACHELINE()
pstring m_param;
};
+ // -----------------------------------------------------------------------------
+ // model parameter
+ // -----------------------------------------------------------------------------
+
class param_model_t : public param_str_t
{
public:
@@ -997,8 +1043,8 @@ namespace netlist
: m_value(param.model_value(name))
{
}
- const double &operator()() const NL_NOEXCEPT { return m_value; }
- operator const double&() const NL_NOEXCEPT { return m_value; }
+ double operator()() const noexcept { return m_value; }
+ operator double() const noexcept { return m_value; }
private:
const double m_value;
};
@@ -1010,24 +1056,29 @@ namespace netlist
const pstring model_value_str(const pstring &entity) /*const*/;
const pstring model_type() /*const*/;
+ /* hide this */
+ void setTo(const pstring &param) = delete;
protected:
- virtual void changed() override;
+ void changed() override;
nl_double model_value(const pstring &entity) /*const*/;
private:
- /* hide this */
- void setTo(const pstring &param) = delete;
- detail::model_map_t m_map;
};
+ // -----------------------------------------------------------------------------
+ // data parameter
+ // -----------------------------------------------------------------------------
class param_data_t : public param_str_t
{
public:
- param_data_t(device_t &device, const pstring &name);
+ param_data_t(device_t &device, const pstring &name)
+ : param_str_t(device, name, "")
+ {
+ }
- std::unique_ptr<plib::pistream> stream();
+ plib::unique_ptr<plib::pistream> stream();
protected:
- virtual void changed() override;
+ void changed() override { }
};
// -----------------------------------------------------------------------------
@@ -1041,15 +1092,15 @@ namespace netlist
param_rom_t(device_t &device, const pstring &name);
- const ST & operator[] (std::size_t n) NL_NOEXCEPT { return m_data[n]; }
+ ST operator[] (std::size_t n) const NL_NOEXCEPT { return m_data[n]; }
protected:
- virtual void changed() override
+ void changed() override
{
- stream()->read(&m_data[0],1<<AW);
+ stream()->read(reinterpret_cast<plib::pistream::value_type *>(&m_data[0]),1<<AW);
}
private:
- ST m_data[1 << AW];
+ std::array<ST, 1 << AW> m_data;
};
// -----------------------------------------------------------------------------
@@ -1062,68 +1113,67 @@ namespace netlist
public detail::netlist_ref
{
public:
- core_device_t(netlist_t &owner, const pstring &name);
+ core_device_t(netlist_state_t &owner, const pstring &name);
core_device_t(core_device_t &owner, const pstring &name);
- virtual ~core_device_t();
+ COPYASSIGNMOVE(core_device_t, delete)
- void update_dev() NL_NOEXCEPT
- {
- do_update();
- }
+ virtual ~core_device_t() noexcept = default;
void do_inc_active() NL_NOEXCEPT
{
if (m_hint_deactivate)
{
- m_stat_inc_active.inc();
- inc_active();
+ if (++m_active_outputs == 1)
+ {
+ m_stat_inc_active.inc();
+ inc_active();
+ }
}
}
void do_dec_active() NL_NOEXCEPT
{
if (m_hint_deactivate)
- dec_active();
+ if (--m_active_outputs == 0)
+ {
+ dec_active();
+ }
}
- void do_reset() { reset(); }
void set_hint_deactivate(bool v) { m_hint_deactivate = v; }
bool get_hint_deactivate() { return m_hint_deactivate; }
+ /* Has to be set in device reset */
+ void set_active_outputs(int n) { m_active_outputs = n; }
void set_default_delegate(detail::core_terminal_t &term);
/* stats */
- nperftime_t m_stat_total_time;
- nperfcount_t m_stat_call_count;
- nperfcount_t m_stat_inc_active;
+ nperftime_t<NL_KEEP_STATISTICS> m_stat_total_time;
+ nperfcount_t<NL_KEEP_STATISTICS> m_stat_call_count;
+ nperfcount_t<NL_KEEP_STATISTICS> m_stat_inc_active;
+ virtual void update() NL_NOEXCEPT { }
+ virtual void reset() { }
protected:
- virtual void update() NL_NOEXCEPT { }
virtual void inc_active() NL_NOEXCEPT { }
virtual void dec_active() NL_NOEXCEPT { }
- virtual void reset() { }
- void do_update() NL_NOEXCEPT
- {
- update();
- }
-
- plib::plog_base<netlist_t, NL_DEBUG> &log();
+ log_type & log();
public:
- virtual void timestep(ATTR_UNUSED const nl_double st) { }
+ virtual void timestep(const nl_double st) { plib::unused_var(st); }
virtual void update_terminals() { }
virtual void update_param() {}
virtual bool is_dynamic() const { return false; }
virtual bool is_timestep() const { return false; }
- virtual bool needs_update_after_param_change() const { return false; }
private:
- bool m_hint_deactivate;
+ bool m_hint_deactivate;
+ state_var_s32 m_active_outputs;
};
// -----------------------------------------------------------------------------
@@ -1134,17 +1184,20 @@ namespace netlist
{
public:
- device_t(netlist_t &owner, const pstring &name);
+ device_t(netlist_state_t &owner, const pstring &name);
device_t(core_device_t &owner, const pstring &name);
- virtual ~device_t() override;
+ COPYASSIGNMOVE(device_t, delete)
+
+ ~device_t() noexcept override = default;
setup_t &setup();
+ const setup_t &setup() const;
template<class C, typename... Args>
- void register_sub(const pstring &name, std::unique_ptr<C> &dev, const Args&... args)
+ void create_and_register_subdevice(const pstring &name, pool_owned_ptr<C> &dev, Args&&... args)
{
- dev.reset(plib::palloc<C>(*this, name, args...));
+ dev = pool().make_poolptr<C>(*this, name, std::forward<Args>(args)...);
}
void register_subalias(const pstring &name, detail::core_terminal_t &term);
@@ -1167,13 +1220,18 @@ namespace netlist
struct detail::family_setter_t
{
- family_setter_t() { }
+ /* clang will complain about an unused private field if
+ * a defaulted constructor is used
+ */
+ // NOLINTNEXTLINE(modernize-use-equals-default)
+ family_setter_t();
family_setter_t(core_device_t &dev, const pstring &desc);
family_setter_t(core_device_t &dev, const logic_family_desc_t *desc);
};
// -----------------------------------------------------------------------------
// nld_base_dummy : basis for dummy devices
+ // FIXME: this is not the right place to define this
// -----------------------------------------------------------------------------
NETLIB_OBJECT(base_dummy)
@@ -1190,19 +1248,25 @@ namespace netlist
* solvers will update inputs after parallel processing.
*/
class detail::queue_t :
- public timed_queue<pqentry_t<net_t *, netlist_time>, false>,
+ public timed_queue<pqentry_t<net_t *, netlist_time>, false, NL_KEEP_STATISTICS>,
public detail::netlist_ref,
public plib::state_manager_t::callback_t
{
public:
- typedef pqentry_t<net_t *, netlist_time> entry_t;
- explicit queue_t(netlist_t &nl);
+ using entry_t = pqentry_t<net_t *, netlist_time>;
+ explicit queue_t(netlist_state_t &nl);
+ virtual ~queue_t() noexcept = default;
+
+ queue_t(const queue_t &) = delete;
+ queue_t(queue_t &&) = delete;
+ queue_t &operator=(const queue_t &) = delete;
+ queue_t &operator=(queue_t &&) = delete;
protected:
void register_state(plib::state_manager_t &manager, const pstring &module) override;
- void on_pre_save() override;
- void on_post_load() override;
+ void on_pre_save(plib::state_manager_t &manager) override;
+ void on_post_load(plib::state_manager_t &manager) override;
private:
std::size_t m_qsize;
@@ -1211,139 +1275,214 @@ namespace netlist
};
// -----------------------------------------------------------------------------
- // netlist_t
+ // netlist_state__t
// -----------------------------------------------------------------------------
-
- class netlist_t : private plib::nocopyassignmove
+ class netlist_state_t
{
public:
- explicit netlist_t(const pstring &aname);
- virtual ~netlist_t();
+ using nets_collection_type = std::vector<pool_owned_ptr<detail::net_t>>;
- /* run functions */
+ /* need to preserve order of device creation ... */
+ using devices_collection_type = std::vector<std::pair<pstring, pool_owned_ptr<core_device_t>>>;
+ netlist_state_t(const pstring &aname,
+ netlist_t & anetlist,
+ plib::unique_ptr<callbacks_t> &&callbacks);
- const netlist_time &time() const NL_NOEXCEPT { return m_time; }
- devices::NETLIB_NAME(solver) *solver() const NL_NOEXCEPT { return m_solver; }
+ COPYASSIGNMOVE(netlist_state_t, delete)
- /* never use this in constructors! */
- nl_double gmin() const NL_NOEXCEPT;
+ ~netlist_state_t() noexcept = default;
- void process_queue(const netlist_time &delta) NL_NOEXCEPT;
- void abort_current_queue_slice() NL_NOEXCEPT { m_queue.retime(detail::queue_t::entry_t(m_time, nullptr)); }
+ friend class netlist_t; // allow access to private members
- /* Control functions */
+ template<class C>
+ static bool check_class(core_device_t *p)
+ {
+ return dynamic_cast<C *>(p) != nullptr;
+ }
- void start();
- void stop();
- void reset();
+ template<class C>
+ C *get_single_device(const pstring &classname) const
+ {
+ return dynamic_cast<C *>(get_single_device(classname, check_class<C>));
+ }
- const detail::queue_t &queue() const NL_NOEXCEPT { return m_queue; }
- detail::queue_t &queue() NL_NOEXCEPT { return m_queue; }
+ /* logging and name */
- /* netlist build functions */
+ pstring name() const { return m_name; }
- setup_t &setup() NL_NOEXCEPT { return *m_setup; }
+ log_type & log() { return m_log; }
+ const log_type &log() const { return m_log; }
+
+ plib::dynlib &lib() { return *m_lib; }
+
+ netlist_t &exec() { return m_netlist; }
+ const netlist_t &exec() const { return m_netlist; }
- void register_dev(plib::owned_ptr<core_device_t> dev);
- void remove_dev(core_device_t *dev);
+ /* state handling */
+ plib::state_manager_t &run_state_manager() { return m_state; }
+
+ template<typename O, typename C>
+ void save(O &owner, C &state, const pstring &module, const pstring &stname)
+ {
+ this->run_state_manager().save_item(static_cast<void *>(&owner), state, module + pstring(".") + stname);
+ }
+ template<typename O, typename C>
+ void save(O &owner, C *state, const pstring &module, const pstring &stname, const std::size_t count)
+ {
+ this->run_state_manager().save_state_ptr(static_cast<void *>(&owner), module + pstring(".") + stname, plib::state_manager_t::dtype<C>(), count, state);
+ }
+
+ core_device_t *get_single_device(const pstring &classname, bool (*cc)(core_device_t *)) const;
detail::net_t *find_net(const pstring &name) const;
std::size_t find_net_id(const detail::net_t *net) const;
+ template <typename T>
+ void register_net(pool_owned_ptr<T> &&net) { m_nets.push_back(std::move(net)); }
+
template<class device_class>
- std::vector<device_class *> get_device_list() const
+ inline std::vector<device_class *> get_device_list()
{
std::vector<device_class *> tmp;
for (auto &d : m_devices)
{
- device_class *dev = dynamic_cast<device_class *>(d.get());
+ auto dev = dynamic_cast<device_class *>(d.second.get());
if (dev != nullptr)
tmp.push_back(dev);
}
return tmp;
}
- template<class C>
- static bool check_class(core_device_t *p)
+ template <typename T>
+ void add_dev(const pstring &name, pool_owned_ptr<T> &&dev)
{
- return dynamic_cast<C *>(p) != nullptr;
+ for (auto & d : m_devices)
+ if (d.first == name)
+ log().fatal(MF_1_DUPLICATE_NAME_DEVICE_LIST, d.first);
+ //m_devices.push_back(std::move(dev));
+ m_devices.insert(m_devices.end(), { name, std::move(dev) });
}
- template<class C>
- C *get_single_device(const pstring &classname) const
+ /**
+ * @brief Remove device
+ *
+ * Care needs to be applied if this is called to remove devices with
+ * sub-devices which may have registered state.
+ *
+ * @param dev Device to be removed
+ */
+ void remove_dev(core_device_t *dev)
{
- return dynamic_cast<C *>(get_single_device(classname, check_class<C>));
+ for (auto it = m_devices.begin(); it != m_devices.end(); it++)
+ if (it->second.get() == dev)
+ {
+ m_state.remove_save_items(dev);
+ m_devices.erase(it);
+ return;
+ }
}
- /* logging and name */
+ /* sole use is to manage lifetime of family objects */
+ std::vector<std::pair<pstring, plib::unique_ptr<logic_family_desc_t>>> m_family_cache;
- pstring name() const { return m_name; }
- plib::plog_base<netlist_t, NL_DEBUG> &log() { return m_log; }
- const plib::plog_base<netlist_t, NL_DEBUG> &log() const { return m_log; }
+ setup_t &setup() NL_NOEXCEPT { return *m_setup; }
+ const setup_t &setup() const NL_NOEXCEPT { return *m_setup; }
- /* state related */
+ nets_collection_type & nets() { return m_nets; }
+ devices_collection_type & devices() { return m_devices; }
- plib::state_manager_t &state() { return m_state; }
+ // FIXME: make a postload member and include code there
+ void rebuild_lists(); /* must be called after post_load ! */
- template<typename O, typename C> void save(O &owner, C &state, const pstring &stname)
- {
- this->state().save_item(static_cast<void *>(&owner), state, from_utf8(owner.name()) + pstring(".") + stname);
- }
- template<typename O, typename C> void save(O &owner, C *state, const pstring &stname, const std::size_t count)
- {
- this->state().save_state_ptr(static_cast<void *>(&owner), from_utf8(owner.name()) + pstring(".") + stname, plib::state_manager_t::datatype_f<C>::f(), count, state);
- }
+ private:
- plib::dynlib &lib() { return *m_lib; }
+ void reset();
- // FIXME: find something better
+ pstring m_name;
+ netlist_t &m_netlist;
+ plib::unique_ptr<plib::dynlib> m_lib; // external lib needs to be loaded as long as netlist exists
+ plib::state_manager_t m_state;
+ plib::unique_ptr<callbacks_t> m_callbacks;
+ log_type m_log;
+ plib::unique_ptr<setup_t> m_setup;
+
+ nets_collection_type m_nets;
/* sole use is to manage lifetime of net objects */
- std::vector<plib::owned_ptr<detail::net_t>> m_nets;
- /* sole use is to manage lifetime of family objects */
- std::vector<std::pair<pstring, std::unique_ptr<logic_family_desc_t>>> m_family_cache;
+ devices_collection_type m_devices;
- // FIXME: sort rebuild_lists out
- void rebuild_lists(); /* must be called after post_load ! */
- /* logging callback */
- virtual void vlog(const plib::plog_level &l, const pstring &ls) const = 0;
- protected:
+ };
- void print_stats() const;
+ // -----------------------------------------------------------------------------
+ // netlist_t
+ // -----------------------------------------------------------------------------
- private:
+ class netlist_t
+ {
+ public:
- /* helper for save above */
- static pstring from_utf8(const char *c) { return pstring(c, pstring::UTF8); }
- static pstring from_utf8(const pstring &c) { return c; }
+ explicit netlist_t(const pstring &aname, plib::unique_ptr<callbacks_t> callbacks);
- core_device_t *get_single_device(const pstring &classname, bool (*cc)(core_device_t *)) const;
+ COPYASSIGNMOVE(netlist_t, delete)
- /* mostly rw */
- netlist_time m_time;
- detail::queue_t m_queue;
+ ~netlist_t() noexcept = default;
- /* mostly ro */
+ /* run functions */
- devices::NETLIB_NAME(mainclock) * m_mainclock;
- devices::NETLIB_NAME(solver) * m_solver;
- devices::NETLIB_NAME(netlistparams) *m_params;
+ netlist_time time() const NL_NOEXCEPT { return m_time; }
- pstring m_name;
- std::unique_ptr<setup_t> m_setup;
- plib::plog_base<netlist_t, NL_DEBUG> m_log;
- std::unique_ptr<plib::dynlib> m_lib; // external lib needs to be loaded as long as netlist exists
+ void process_queue(const netlist_time delta) NL_NOEXCEPT;
+ void abort_current_queue_slice() NL_NOEXCEPT { m_queue.retime(detail::queue_t::entry_t(m_time, nullptr)); }
- plib::state_manager_t m_state;
+ const detail::queue_t &queue() const NL_NOEXCEPT { return m_queue; }
+ detail::queue_t &queue() NL_NOEXCEPT { return m_queue; }
- // performance
- nperftime_t m_stat_mainloop;
- nperfcount_t m_perf_out_processed;
+ /* Control functions */
+
+ void stop();
+ void reset();
+
+ /* state handling */
+
+ plib::state_manager_t &run_state_manager() { return m_state->run_state_manager(); }
+
+ /* only used by nltool to create static c-code */
+ devices::NETLIB_NAME(solver) *solver() const NL_NOEXCEPT { return m_solver; }
+
+ /* force late type resolution */
+ template <typename X = devices::NETLIB_NAME(solver)>
+ nl_double gmin(X *solv = nullptr) const NL_NOEXCEPT
+ {
+ plib::unused_var(solv);
+ return static_cast<X *>(m_solver)->gmin();
+ }
+
+ netlist_state_t &nlstate() NL_NOEXCEPT { return *m_state; }
+ const netlist_state_t &nlstate() const { return *m_state; }
+
+ log_type & log() { return m_state->log(); }
+ const log_type &log() const { return m_state->log(); }
+
+ void print_stats() const;
+
+ private:
+ plib::unique_ptr<netlist_state_t> m_state;
+ devices::NETLIB_NAME(solver) * m_solver;
+
+ /* mostly rw */
+ PALIGNAS_CACHELINE()
+ netlist_time m_time;
+ devices::NETLIB_NAME(mainclock) * m_mainclock;
- std::vector<plib::owned_ptr<core_device_t>> m_devices;
+ PALIGNAS_CACHELINE()
+ detail::queue_t m_queue;
+
+ // performance
+ nperftime_t<NL_KEEP_STATISTICS> m_stat_mainloop;
+ nperfcount_t<NL_KEEP_STATISTICS> m_perf_out_processed;
};
// -----------------------------------------------------------------------------
@@ -1356,12 +1495,13 @@ namespace netlist
public:
struct init
{
- const char *p[N];
+ std::array<const char *, N> p;
};
- object_array_t(core_device_t &dev, init names)
+ template<typename... Args>
+ object_array_t(core_device_t &dev, init names, Args&&... args)
{
for (std::size_t i = 0; i<N; i++)
- this->emplace(i, dev, pstring(names.p[i], pstring::UTF8));
+ this->emplace(i, dev, pstring(names.p[i]), std::forward<Args>(args)...);
}
};
@@ -1369,15 +1509,56 @@ namespace netlist
// inline implementations
// -----------------------------------------------------------------------------
+ inline netlist_state_t & detail::netlist_ref::state() noexcept
+ {
+ return m_netlist.nlstate();
+ }
+
+ inline const netlist_state_t & detail::netlist_ref::state() const noexcept
+ {
+ return m_netlist.nlstate();
+ }
+
+ inline setup_t & detail::netlist_ref::setup() noexcept
+ {
+ return m_netlist.nlstate().setup();
+ }
+
+ inline const setup_t & detail::netlist_ref::setup() const noexcept
+ {
+ return m_netlist.nlstate().setup();
+ }
+
+ template <typename T>
+ param_num_t<T>::param_num_t(device_t &device, const pstring &name, const T val)
+ : param_t(device, name)
+ {
+ //m_param = device.setup().get_initial_param_val(this->name(),val);
+ bool found = false;
+ pstring p = this->get_initial(device, &found);
+ if (found)
+ {
+ bool err = false;
+ auto vald = plib::pstonum_ne<T>(p, err);
+ if (err)
+ device.state().log().fatal(MF_2_INVALID_NUMBER_CONVERSION_1_2, name, p);
+ m_param = vald;
+ }
+ else
+ m_param = val;
+
+ device.state().save(*this, m_param, this->name(), "m_param");
+ }
+
template <typename ST, std::size_t AW, std::size_t DW>
- inline param_rom_t<ST, AW, DW>::param_rom_t(device_t &device, const pstring &name)
+ param_rom_t<ST, AW, DW>::param_rom_t(device_t &device, const pstring &name)
: param_data_t(device, name)
{
auto f = stream();
if (f != nullptr)
- f->read(&m_data[0],1<<AW);
+ f->read(reinterpret_cast<plib::pistream::value_type *>(&m_data[0]),1<<AW);
else
- device.netlist().log().warning("Rom {1} not found", Value());
+ device.state().log().warning("Rom {1} not found", value());
}
inline void logic_input_t::inactivate() NL_NOEXCEPT
@@ -1385,7 +1566,7 @@ namespace netlist
if (!is_state(STATE_INP_PASSIVE))
{
set_state(STATE_INP_PASSIVE);
- net().dec_active(*this);
+ net().remove_from_active_list(*this);
}
}
@@ -1393,7 +1574,7 @@ namespace netlist
{
if (is_state(STATE_INP_PASSIVE))
{
- net().inc_active(*this);
+ net().add_to_active_list(*this);
set_state(STATE_INP_ACTIVE);
}
}
@@ -1402,7 +1583,7 @@ namespace netlist
{
if (is_state(STATE_INP_PASSIVE))
{
- net().inc_active(*this);
+ net().add_to_active_list(*this);
set_state(STATE_INP_HL);
}
}
@@ -1411,24 +1592,68 @@ namespace netlist
{
if (is_state(STATE_INP_PASSIVE))
{
- net().inc_active(*this);
+ net().add_to_active_list(*this);
set_state(STATE_INP_LH);
}
}
- inline void detail::net_t::push_to_queue(const netlist_time &delay) NL_NOEXCEPT
+ inline void detail::net_t::push_to_queue(const netlist_time delay) NL_NOEXCEPT
{
if ((num_cons() != 0))
{
+ auto &lexec(exec());
+ auto &q(lexec.queue());
+ auto nst(lexec.time() + delay);
+
if (is_queued())
- netlist().queue().remove(this);
- m_time = netlist().time() + delay;
- m_in_queue = (m_active > 0) ? QS_QUEUED : QS_DELAYED_DUE_TO_INACTIVE; /* queued ? */
- if (m_in_queue == QS_QUEUED)
- netlist().queue().push(queue_t::entry_t(m_time, this));
+ q.remove(this);
+ m_in_queue = (!m_list_active.empty()) ?
+ queue_status::QUEUED : queue_status::DELAYED_DUE_TO_INACTIVE; /* queued ? */
+ if (m_in_queue == queue_status::QUEUED)
+ q.push(queue_t::entry_t(nst, this));
+ else
+ update_inputs();
+ m_next_scheduled_time = nst;
+ }
+ }
+
+ inline void detail::net_t::add_to_active_list(core_terminal_t &term) NL_NOEXCEPT
+ {
+ if (m_list_active.empty())
+ {
+ m_list_active.push_front(&term);
+ railterminal().device().do_inc_active();
+ if (m_in_queue == queue_status::DELAYED_DUE_TO_INACTIVE)
+ {
+ if (m_next_scheduled_time > exec().time())
+ {
+ m_in_queue = queue_status::QUEUED; /* pending */
+ exec().queue().push({m_next_scheduled_time, this});
+ }
+ else
+ {
+ m_in_queue = queue_status::DELIVERED;
+ m_cur_Q = m_new_Q;
+ }
+ update_inputs();
+ }
+ else
+ term.set_copied_input(m_cur_Q);
+ }
+ else
+ {
+ term.set_copied_input(m_cur_Q);
+ m_list_active.push_front(&term);
}
}
+ inline void detail::net_t::remove_from_active_list(core_terminal_t &term) NL_NOEXCEPT
+ {
+ m_list_active.remove(&term);
+ if (m_list_active.empty())
+ railterminal().device().do_dec_active();
+ }
+
inline const analog_net_t & analog_t::net() const NL_NOEXCEPT
{
return static_cast<const analog_net_t &>(core_terminal_t::net());
@@ -1441,6 +1666,18 @@ namespace netlist
inline nl_double terminal_t::operator ()() const NL_NOEXCEPT { return net().Q_Analog(); }
+ inline void terminal_t::set_ptrs(nl_double *gt, nl_double *go, nl_double *Idr) noexcept
+ {
+ if (!(gt && go && Idr) && (gt || go || Idr))
+ state().log().fatal("Inconsistent nullptrs for terminal {}", name());
+ else
+ {
+ m_gt1 = gt;
+ m_go1 = go;
+ m_Idr1 = Idr;
+ }
+ }
+
inline logic_net_t & logic_t::net() NL_NOEXCEPT
{
return static_cast<logic_net_t &>(core_terminal_t::net());
@@ -1453,8 +1690,14 @@ namespace netlist
inline netlist_sig_t logic_input_t::Q() const NL_NOEXCEPT
{
- nl_assert(state() != STATE_INP_PASSIVE);
+ nl_assert(terminal_state() != STATE_INP_PASSIVE);
+ //if (net().Q() != m_Q)
+ // printf("term: %s, %d %d TS %d\n", this->name().c_str(), net().Q(), m_Q, terminal_state());
+#if USE_COPY_INSTEAD_OF_REFERENCE
+ return m_Q;
+#else
return net().Q();
+#endif
}
inline nl_double analog_input_t::Q_Analog() const NL_NOEXCEPT
@@ -1471,14 +1714,24 @@ namespace netlist
}
}
- inline netlist_t &detail::device_object_t::netlist() NL_NOEXCEPT
+ inline netlist_state_t &detail::device_object_t::state() NL_NOEXCEPT
+ {
+ return m_device.state();
+ }
+
+ inline const netlist_state_t &detail::device_object_t::state() const NL_NOEXCEPT
+ {
+ return m_device.state();
+ }
+
+ inline netlist_t &detail::device_object_t::exec() NL_NOEXCEPT
{
- return m_device.netlist();
+ return m_device.exec();
}
- inline const netlist_t &detail::device_object_t::netlist() const NL_NOEXCEPT
+ inline const netlist_t &detail::device_object_t::exec() const NL_NOEXCEPT
{
- return m_device.netlist();
+ return m_device.exec();
}
template <typename T>
@@ -1486,18 +1739,18 @@ namespace netlist
state_var<T>::state_var(O &owner, const pstring &name, const T &value)
: m_value(value)
{
- owner.netlist().save(owner, m_value, name);
+ owner.state().save(owner, m_value, owner.name(), name);
}
template <typename T, std::size_t N>
template <typename O>
- state_var<T[N]>::state_var(O &owner, const pstring &name, const T & value)
+ state_array<T,N>::state_array(O &owner, const pstring &name, const T & value)
{
- owner.netlist().save(owner, m_value, name);
+ owner.state().save(owner, m_value, owner.name(), name);
for (std::size_t i=0; i<N; i++)
m_value[i] = value;
}
-}
+} // namespace netlist
namespace plib
{
@@ -1505,7 +1758,7 @@ namespace plib
struct ptype_traits<netlist::state_var<X>> : ptype_traits<X>
{
};
-}
+} // namespace plib
diff --git a/src/lib/netlist/nl_config.h b/src/lib/netlist/nl_config.h
index 6a65abac40a..faa5008ff56 100644
--- a/src/lib/netlist/nl_config.h
+++ b/src/lib/netlist/nl_config.h
@@ -26,10 +26,21 @@
* linear memory pool. This is based of the assumption that
* due to enhanced locality there will be less cache misses.
* Your mileage may vary.
- * This will cause crashes on OSX and thus is ignored on OSX.
*
*/
-#define USE_MEMPOOL (0)
+#define USE_MEMPOOL (1)
+
+/*! Store input values in logic_terminal_t.
+ *
+ * Set to 1 to store values in logic_terminal_t instead of
+ * accessing them indirectly by pointer from logic_net_t.
+ * This approach is stricter and should identify bugs in
+ * the netlist core faster.
+ * By default it is disabled since it is not as fast as
+ * the default approach. It is up to 5% slower.
+ *
+ */
+#define USE_COPY_INSTEAD_OF_REFERENCE (0)
/*
* FIXME: Using truthtable is a lot slower than the explicit device
@@ -43,23 +54,13 @@
#define NL_MAX_LINK_RESOLVE_LOOPS (100)
//============================================================
-// Solver defines
-//============================================================
-
-#define USE_GABS (1)
-// savings are eaten up by effort
-// FIXME: Convert into solver parameter
-#define USE_LINEAR_PREDICTION (0)
-#define NETLIST_GMIN_DEFAULT (1e-9)
-
-
-
-//============================================================
// DEBUGGING
//============================================================
#define NL_DEBUG (false)
#define NL_KEEP_STATISTICS (0)
+//#define NL_DEBUG (true)
+//#define NL_KEEP_STATISTICS (1)
//============================================================
// General Macros
@@ -86,24 +87,19 @@
#endif // !defined(USE_OPENMP)
// Use nano-second resolution - Sufficient for now
-#define NETLIST_INTERNAL_RES (UINT64_C(1000000000))
-#define NETLIST_CLOCK (NETLIST_INTERNAL_RES)
+
+static constexpr const auto NETLIST_INTERNAL_RES = 1000000000;
+static constexpr const auto NETLIST_CLOCK = NETLIST_INTERNAL_RES;
+
+//#define NETLIST_INTERNAL_RES (UINT64_C(1000000000))
+//#define NETLIST_CLOCK (NETLIST_INTERNAL_RES)
//#define NETLIST_INTERNAL_RES (UINT64_C(1000000000000))
//#define NETLIST_CLOCK (UINT64_C(1000000000))
//#define nl_double float
-//#define NL_FCONST(x) (x ## f)
-
-//#define nl_double double
-#define NL_FCONST(x) x
using nl_double = double;
-/* The following option determines how object::update is called.
- * If set to 1, a virtual call is used. If it is left undefined, the best
- * approach will be automatically selected.
- */
-
//============================================================
// WARNINGS
//============================================================
diff --git a/src/lib/netlist/nl_dice_compat.h b/src/lib/netlist/nl_dice_compat.h
index b0ebdb2e371..48695e393ec 100644
--- a/src/lib/netlist/nl_dice_compat.h
+++ b/src/lib/netlist/nl_dice_compat.h
@@ -29,6 +29,7 @@ sed -e 's/#define \(.*\)"\(.*\)"[ \t]*,[ \t]*\(.*\)/NET_ALIAS(\1,\2.\3)/' src/ma
#include "analog/nld_twoterm.h"
#include <cmath>
+
#endif
@@ -111,8 +112,8 @@ public:
#define CHIP(n, t) TTL_ ## t ## _DIP(n)
#define OHM(x) x
-#define K_OHM(x) RES_K(X)
-#define M_OHM(x) RES_M(X)
+#define K_OHM(x) RES_K(x)
+#define M_OHM(x) RES_M(x)
#define U_FARAD(x) CAP_U(x)
#define N_FARAD(x) CAP_N(x)
#define P_FARAD(x) CAP_P(x)
@@ -131,9 +132,9 @@ public:
NET_C(name.6, name ## _R.1) \
NET_C(name.6, name ## _C.1) \
NET_C(name ## _R.2, V5) \
- NET_CSTR(# name "_C.2", "GND") \
+ NET_C(name ## _C.2, GND) \
NET_C(name.8, V5) \
- NET_CSTR(# name ".1", "GND")
+ NET_C(name.1, GND)
#define CHIP_555_Astable(name, pdesc) \
NE555_DIP(name) \
@@ -146,9 +147,9 @@ public:
NET_C(name.6, name ## _C.1) \
NET_C(name.2, name ## _C.1) \
NET_C(name ## _R1.2, V5) \
- NET_CSTR(# name "_C.2", "GND") \
+ NET_C(name ## _C.2, GND) \
NET_C(name.8, V5) \
- NET_CSTR(# name ".1", "GND")
+ NET_C(name.1, GND)
#define CHIP_9602_Mono(name, pdesc) \
CHIP(# name, 9602) \
@@ -178,13 +179,13 @@ public:
#define CHIP_INPUT_ACTIVE_LOW(name) \
SWITCH2(name ## _SW) \
NET_C(name ## _SW.1, V5) \
- NET_CSTR(# name "_SW.2", "GND") \
+ NET_C(name ## _SW.2, GND) \
ALIAS(name.1, name ## _SW.Q)
#define CHIP_INPUT_ACTIVE_HIGH(name) \
SWITCH2(name ## _SW) \
NET_C(name ## _SW.2, V5) \
- NET_CSTR(# name "_SW.1", "GND") \
+ NET_C(name ## _SW.1, GND) \
ALIAS(name.1, name ## _SW.Q)
#define CHIP_LATCH(name) \
diff --git a/src/lib/netlist/nl_errstr.h b/src/lib/netlist/nl_errstr.h
index 35b1e4f6c60..ee3c47f3339 100644
--- a/src/lib/netlist/nl_errstr.h
+++ b/src/lib/netlist/nl_errstr.h
@@ -58,7 +58,8 @@
//#define MF_1_CLASS_1_NOT_FOUND "Class {1} not found!"
#define MF_1_UNABLE_TO_PARSE_MODEL_1 "Unable to parse model: {1}"
#define MF_1_MODEL_ALREADY_EXISTS_1 "Model already exists: {1}"
-#define MF_1_ADDING_ALI1_TO_ALIAS_LIST "Error adding alias {1} to alias list"
+#define MF_1_DEVICE_ALREADY_EXISTS_1 "Device already exists: {1}"
+#define MF_1_ADDING_ALI1_TO_ALIAS_LIST "Error adding alias {1} to alias list"
#define MF_1_DIP_PINS_MUST_BE_AN_EQUAL_NUMBER_OF_PINS_1 "You must pass an equal number of pins to DIPPINS {1}"
#define MF_1_UNKNOWN_OBJECT_TYPE_1 "Unknown object type {1}"
#define MF_2_INVALID_NUMBER_CONVERSION_1_2 "Invalid number conversion {1} : {2}"
diff --git a/src/lib/netlist/nl_factory.cpp b/src/lib/netlist/nl_factory.cpp
index 2bb49590c4b..1f0ac35c6c4 100644
--- a/src/lib/netlist/nl_factory.cpp
+++ b/src/lib/netlist/nl_factory.cpp
@@ -10,102 +10,84 @@
#include "nl_factory.h"
#include "nl_base.h"
+#include "nl_errstr.h"
#include "nl_setup.h"
#include "plib/putil.h"
-#include "nl_errstr.h"
namespace netlist { namespace factory
{
-class NETLIB_NAME(wrapper) : public device_t
-{
-public:
- NETLIB_NAME(wrapper)(netlist_t &anetlist, const pstring &name)
- : device_t(anetlist, name)
+ class NETLIB_NAME(wrapper) : public device_t
+ {
+ public:
+ NETLIB_NAME(wrapper)(netlist_state_t &anetlist, const pstring &name)
+ : device_t(anetlist, name)
+ {
+ }
+ protected:
+ NETLIB_RESETI() { }
+ NETLIB_UPDATEI() { }
+ };
+
+ element_t::element_t(const pstring &name, const pstring &classname,
+ const pstring &def_param, const pstring &sourcefile)
+ : m_name(name), m_classname(classname), m_def_param(def_param),
+ m_sourcefile(sourcefile)
{
}
-protected:
- NETLIB_RESETI();
- NETLIB_UPDATEI();
-};
-
+ element_t::element_t(const pstring &name, const pstring &classname,
+ const pstring &def_param)
+ : m_name(name), m_classname(classname), m_def_param(def_param),
+ m_sourcefile("<unknown>")
+ {
+ }
-element_t::element_t(const pstring &name, const pstring &classname,
- const pstring &def_param, const pstring &sourcefile)
- : m_name(name), m_classname(classname), m_def_param(def_param),
- m_sourcefile(sourcefile)
-{
-}
-
-element_t::element_t(const pstring &name, const pstring &classname,
- const pstring &def_param)
- : m_name(name), m_classname(classname), m_def_param(def_param),
- m_sourcefile("<unknown>")
-{
-}
-
-element_t::~element_t()
-{
-}
-
-// ----------------------------------------------------------------------------------------
-// net_device_t_base_factory
-// ----------------------------------------------------------------------------------------
-
-list_t::list_t( setup_t &setup)
-: m_setup(setup)
-{
-}
-
-list_t::~list_t()
-{
- clear();
-}
-
-void list_t::register_device(std::unique_ptr<element_t> &&factory)
-{
- for (auto & e : *this)
- if (e->name() == factory->name())
- m_setup.log().fatal(MF_1_FACTORY_ALREADY_CONTAINS_1, factory->name());
- push_back(std::move(factory));
-}
+ // ----------------------------------------------------------------------------------------
+ // net_device_t_base_factory
+ // ----------------------------------------------------------------------------------------
-factory::element_t * list_t::factory_by_name(const pstring &devname)
-{
- for (auto & e : *this)
+ list_t::list_t(log_type &alog)
+ : m_log(alog)
{
- if (e->name() == devname)
- return e.get();
}
- m_setup.log().fatal(MF_1_CLASS_1_NOT_FOUND, devname);
- return nullptr; // appease code analysis
-}
-
-// -----------------------------------------------------------------------------
-// factory_lib_entry_t: factory class to wrap macro based chips/elements
-// -----------------------------------------------------------------------------
+ void list_t::register_device(plib::unique_ptr<element_t> &&factory)
+ {
+ for (auto & e : *this)
+ if (e->name() == factory->name())
+ m_log.fatal(MF_1_FACTORY_ALREADY_CONTAINS_1, factory->name());
+ push_back(std::move(factory));
+ }
-plib::owned_ptr<device_t> library_element_t::Create(netlist_t &anetlist, const pstring &name)
-{
- return plib::owned_ptr<device_t>::Create<NETLIB_NAME(wrapper)>(anetlist, name);
-}
+ factory::element_t * list_t::factory_by_name(const pstring &devname)
+ {
+ for (auto & e : *this)
+ {
+ if (e->name() == devname)
+ return e.get();
+ }
+
+ m_log.fatal(MF_1_CLASS_1_NOT_FOUND, devname);
+ return nullptr; // appease code analysis
+ }
-void library_element_t::macro_actions(netlist_t &anetlist, const pstring &name)
-{
- anetlist.setup().namespace_push(name);
- anetlist.setup().include(this->name());
- anetlist.setup().namespace_pop();
-}
+ // -----------------------------------------------------------------------------
+ // factory_lib_entry_t: factory class to wrap macro based chips/elements
+ // -----------------------------------------------------------------------------
-NETLIB_RESET(wrapper)
-{
-}
+ pool_owned_ptr<device_t> library_element_t::Create(netlist_state_t &anetlist, const pstring &name)
+ {
+ return pool().make_poolptr<NETLIB_NAME(wrapper)>(anetlist, name);
+ }
-NETLIB_UPDATE(wrapper)
-{
-}
+ void library_element_t::macro_actions(nlparse_t &nparser, const pstring &name)
+ {
+ nparser.namespace_push(name);
+ nparser.include(this->name());
+ nparser.namespace_pop();
+ }
-} }
+} // namespace factory
+ } // namespace netlist
diff --git a/src/lib/netlist/nl_factory.h b/src/lib/netlist/nl_factory.h
index 6dad6c5e171..271bf72bf90 100644
--- a/src/lib/netlist/nl_factory.h
+++ b/src/lib/netlist/nl_factory.h
@@ -9,46 +9,58 @@
#ifndef NLFACTORY_H_
#define NLFACTORY_H_
+#include "nltypes.h"
#include "plib/palloc.h"
#include "plib/ptypes.h"
-#define NETLIB_DEVICE_IMPL(chip) \
- static std::unique_ptr<factory::element_t> NETLIB_NAME(chip ## _c)( \
- const pstring &name, const pstring &classname, const pstring &def_param) \
- { \
- return std::unique_ptr<factory::element_t>(plib::palloc<factory::device_element_t<NETLIB_NAME(chip)>>(name, classname, def_param, pstring(__FILE__))); \
- } \
- factory::constructor_ptr_t decl_ ## chip = NETLIB_NAME(chip ## _c);
+#include <vector>
+
+#define NETLIB_DEVICE_IMPL_ALIAS(p_alias, chip, p_name, p_def_param) \
+ NETLIB_DEVICE_IMPL_BASE(devices, p_alias, chip, p_name, p_def_param) \
+
+#define NETLIB_DEVICE_IMPL(chip, p_name, p_def_param) \
+ NETLIB_DEVICE_IMPL_NS(devices, chip, p_name, p_def_param)
-#define NETLIB_DEVICE_IMPL_NS(ns, chip) \
- static std::unique_ptr<factory::element_t> NETLIB_NAME(chip ## _c)( \
- const pstring &name, const pstring &classname, const pstring &def_param) \
+#define NETLIB_DEVICE_IMPL_NS(ns, chip, p_name, p_def_param) \
+ NETLIB_DEVICE_IMPL_BASE(ns, chip, chip, p_name, p_def_param) \
+
+#define NETLIB_DEVICE_IMPL_BASE(ns, p_alias, chip, p_name, p_def_param) \
+ static plib::unique_ptr<factory::element_t> NETLIB_NAME(p_alias ## _c) \
+ (const pstring &classname) \
{ \
- return std::unique_ptr<factory::element_t>(plib::palloc<factory::device_element_t<ns :: NETLIB_NAME(chip)>>(name, classname, def_param, pstring(__FILE__))); \
+ return plib::make_unique<factory::device_element_t<ns :: NETLIB_NAME(chip)>>(p_name, classname, p_def_param, pstring(__FILE__)); \
} \
- factory::constructor_ptr_t decl_ ## chip = NETLIB_NAME(chip ## _c);
+ \
+ factory::constructor_ptr_t decl_ ## p_alias = NETLIB_NAME(p_alias ## _c);
namespace netlist {
- class netlist_t;
class device_t;
+ class nlparse_t;
class setup_t;
+ class netlist_state_t;
namespace factory {
// -----------------------------------------------------------------------------
// net_dev class factory
// -----------------------------------------------------------------------------
- class element_t : plib::nocopyassignmove
+ class element_t
{
public:
element_t(const pstring &name, const pstring &classname,
const pstring &def_param);
element_t(const pstring &name, const pstring &classname,
const pstring &def_param, const pstring &sourcefile);
- virtual ~element_t();
+ virtual ~element_t() = default;
- virtual plib::owned_ptr<device_t> Create(netlist_t &anetlist, const pstring &name) = 0;
- virtual void macro_actions(netlist_t &anetlist, const pstring &name) {}
+ COPYASSIGNMOVE(element_t, default)
+
+ virtual pool_owned_ptr<device_t> Create(netlist_state_t &anetlist, const pstring &name) = 0;
+ virtual void macro_actions(nlparse_t &nparser, const pstring &name)
+ {
+ plib::unused_var(nparser);
+ plib::unused_var(name);
+ }
const pstring &name() const { return m_name; }
const pstring &classname() const { return m_classname; }
@@ -73,26 +85,28 @@ namespace factory {
const pstring &def_param, const pstring &sourcefile)
: element_t(name, classname, def_param, sourcefile) { }
- plib::owned_ptr<device_t> Create(netlist_t &anetlist, const pstring &name) override
+ pool_owned_ptr<device_t> Create(netlist_state_t &anetlist, const pstring &name) override
{
- return plib::owned_ptr<device_t>::Create<C>(anetlist, name);
+ return pool().make_poolptr<C>(anetlist, name);
}
};
- class list_t : public std::vector<std::unique_ptr<element_t>>
+ class list_t : public std::vector<plib::unique_ptr<element_t>>
{
public:
- explicit list_t(setup_t &m_setup);
- ~list_t();
+ explicit list_t(log_type &alog);
+ ~list_t() = default;
+
+ COPYASSIGNMOVE(list_t, delete)
template<class device_class>
void register_device(const pstring &name, const pstring &classname,
const pstring &def_param)
{
- register_device(std::unique_ptr<element_t>(plib::palloc<device_element_t<device_class>>(name, classname, def_param)));
+ register_device(plib::make_unique<device_element_t<device_class>>(name, classname, def_param));
}
- void register_device(std::unique_ptr<element_t> &&factory);
+ void register_device(plib::unique_ptr<element_t> &&factory);
element_t * factory_by_name(const pstring &devname);
@@ -103,21 +117,20 @@ namespace factory {
}
private:
- setup_t &m_setup;
+ log_type &m_log;
};
// -----------------------------------------------------------------------------
// factory_creator_ptr_t
// -----------------------------------------------------------------------------
- using constructor_ptr_t = std::unique_ptr<element_t> (*)(const pstring &name, const pstring &classname,
- const pstring &def_param);
+ using constructor_ptr_t = plib::unique_ptr<element_t> (*)(const pstring &classname);
template <typename T>
- std::unique_ptr<element_t> constructor_t(const pstring &name, const pstring &classname,
+ plib::unique_ptr<element_t> constructor_t(const pstring &name, const pstring &classname,
const pstring &def_param)
{
- return std::unique_ptr<element_t>(plib::palloc<device_element_t<T>>(name, classname, def_param));
+ return plib::make_unique<device_element_t<T>>(name, classname, def_param);
}
// -----------------------------------------------------------------------------
@@ -128,22 +141,24 @@ namespace factory {
{
public:
- library_element_t(setup_t &setup, const pstring &name, const pstring &classname,
+ library_element_t(const pstring &name, const pstring &classname,
const pstring &def_param, const pstring &source)
- : element_t(name, classname, def_param, source) { }
+ : element_t(name, classname, def_param, source)
+ {
+ }
- plib::owned_ptr<device_t> Create(netlist_t &anetlist, const pstring &name) override;
+ pool_owned_ptr<device_t> Create(netlist_state_t &anetlist, const pstring &name) override;
- void macro_actions(netlist_t &anetlist, const pstring &name) override;
+ void macro_actions(nlparse_t &nparser, const pstring &name) override;
private:
};
- }
+ } // namespace factory
namespace devices {
void initialize_factory(factory::list_t &factory);
- }
-}
+ } // namespace devices
+} // namespace netlist
#endif /* NLFACTORY_H_ */
diff --git a/src/lib/netlist/nl_lists.h b/src/lib/netlist/nl_lists.h
index 1eae38b25fb..325f8a67c72 100644
--- a/src/lib/netlist/nl_lists.h
+++ b/src/lib/netlist/nl_lists.h
@@ -10,32 +10,24 @@
#ifndef NLLISTS_H_
#define NLLISTS_H_
-#include "nl_config.h"
-#include "netlist_types.h"
-#include "plib/plists.h"
#include "plib/pchrono.h"
+#include "plib/plists.h"
#include "plib/ptypes.h"
+#include "nl_config.h"
+#include "nltypes.h"
+
+#include <algorithm>
#include <atomic>
-#include <thread>
#include <mutex>
-#include <algorithm>
+#include <thread>
#include <utility>
+
// ----------------------------------------------------------------------------------------
// timed queue
// ----------------------------------------------------------------------------------------
-/*
- * Use -DUSE_HEAP=1 to use stdc++ heap functions instead of linear processing.
- *
- * This slows down processing by about 25% on a Kaby Lake.
- */
-
-#ifndef USE_HEAP
-#define USE_HEAP (0)
-#endif
-
namespace netlist
{
//FIXME: move to an appropriate place
@@ -43,10 +35,11 @@ namespace netlist
class pspin_mutex
{
public:
- pspin_mutex() noexcept { }
+ pspin_mutex() noexcept = default;
void lock() noexcept{ while (m_lock.test_and_set(std::memory_order_acquire)) { } }
void unlock() noexcept { m_lock.clear(std::memory_order_release); }
private:
+ PALIGNAS_CACHELINE()
std::atomic_flag m_lock = ATOMIC_FLAG_INIT;
};
@@ -62,10 +55,11 @@ namespace netlist
struct pqentry_t final
{
constexpr pqentry_t() noexcept : m_exec_time(), m_object(nullptr) { }
- constexpr pqentry_t(const Time &t, const Element &o) noexcept : m_exec_time(t), m_object(o) { }
+ constexpr pqentry_t(const Time t, const Element o) noexcept : m_exec_time(t), m_object(o) { }
+#if 0
~pqentry_t() = default;
constexpr pqentry_t(const pqentry_t &e) noexcept = default;
- constexpr pqentry_t(pqentry_t &&e) = default;
+ constexpr pqentry_t(pqentry_t &&e) noexcept = default;
pqentry_t& operator=(pqentry_t && other) noexcept = default;
pqentry_t& operator=(const pqentry_t &other) noexcept = default;
@@ -74,91 +68,97 @@ namespace netlist
std::swap(m_exec_time, other.m_exec_time);
std::swap(m_object, other.m_object);
}
-
+#endif
struct QueueOp
{
- static constexpr bool less(const pqentry_t &lhs, const pqentry_t &rhs) noexcept
+ inline static constexpr bool less(const pqentry_t &lhs, const pqentry_t &rhs) noexcept
{
return (lhs.m_exec_time < rhs.m_exec_time);
}
- static constexpr bool equal(const pqentry_t &lhs, const pqentry_t &rhs) noexcept
+ inline static constexpr bool lessequal(const pqentry_t &lhs, const pqentry_t &rhs) noexcept
+ {
+ return (lhs.m_exec_time <= rhs.m_exec_time);
+ }
+
+ inline static constexpr bool equal(const pqentry_t &lhs, const pqentry_t &rhs) noexcept
{
return lhs.m_object == rhs.m_object;
}
- static constexpr bool equal(const pqentry_t &lhs, const Element &rhs) noexcept
+ inline static constexpr bool equal(const pqentry_t &lhs, const Element &rhs) noexcept
{
return lhs.m_object == rhs;
}
- static constexpr pqentry_t never() noexcept { return pqentry_t(Time::never(), nullptr); }
+ inline static constexpr pqentry_t never() noexcept { return pqentry_t(Time::never(), nullptr); }
};
Time m_exec_time;
Element m_object;
};
-#if !USE_HEAP
/* Use TS = true for a threadsafe queue */
- template <class T, bool TS, class QueueOp = typename T::QueueOp>
- class timed_queue : plib::nocopyassignmove
+ template <class T, bool TS, bool KEEPSTAT, class QueueOp = typename T::QueueOp>
+ class timed_queue_linear : plib::nocopyassignmove
{
public:
- explicit timed_queue(const std::size_t list_size)
+ explicit timed_queue_linear(const std::size_t list_size)
: m_list(list_size)
{
clear();
}
- constexpr std::size_t capacity() const noexcept { return m_list.capacity() - 1; }
- constexpr bool empty() const noexcept { return (m_end == &m_list[1]); }
+ std::size_t capacity() const noexcept { return m_list.capacity() - 1; }
+ bool empty() const noexcept { return (m_end == &m_list[1]); }
- void push(T &&e) noexcept
+ void push(T && e) noexcept
{
/* Lock */
- tqlock lck(m_lock);
- T * i(m_end);
- for (; QueueOp::less(*(i - 1), e); --i)
+ lock_guard_type lck(m_lock);
+ T * i(m_end-1);
+ for (; QueueOp::less(*(i), e); --i)
{
- *(i) = std::move(*(i-1));
+ *(i+1) = *(i);
m_prof_sortmove.inc();
}
- *i = std::move(e);
+ *(i+1) = std::move(e);
++m_end;
m_prof_call.inc();
}
- void pop() noexcept { --m_end; }
+ T pop() noexcept { return *(--m_end); }
const T &top() const noexcept { return *(m_end-1); }
template <class R>
void remove(const R &elem) noexcept
{
/* Lock */
- tqlock lck(m_lock);
+ lock_guard_type lck(m_lock);
+ m_prof_remove.inc();
+
for (T * i = m_end - 1; i > &m_list[0]; --i)
{
if (QueueOp::equal(*i, elem))
{
- --m_end;
- for (;i < m_end; ++i)
- *i = std::move(*(i+1));
+ std::copy(i+1, m_end--, i);
return;
}
}
}
- void retime(const T &elem) noexcept
+ void retime(T && elem) noexcept
{
/* Lock */
- tqlock lck(m_lock);
+ lock_guard_type lck(m_lock);
+ m_prof_retime.inc();
+
for (T * i = m_end - 1; i > &m_list[0]; --i)
{
if (QueueOp::equal(*i, elem)) // partial equal!
{
- *i = elem;
+ *i = std::move(elem);
while (QueueOp::less(*(i-1), *i))
{
std::swap(*(i-1), *i);
@@ -174,9 +174,9 @@ namespace netlist
}
}
- void clear()
+ void clear() noexcept
{
- tqlock lck(m_lock);
+ lock_guard_type lck(m_lock);
m_end = &m_list[0];
/* put an empty element with maximum time into the queue.
* the insert algo above will run into this element and doesn't
@@ -188,55 +188,61 @@ namespace netlist
// save state support & mame disasm
- constexpr const T *listptr() const noexcept { return &m_list[1]; }
- constexpr std::size_t size() const noexcept { return static_cast<std::size_t>(m_end - &m_list[1]); }
- constexpr const T & operator[](const std::size_t index) const noexcept { return m_list[ 1 + index]; }
+ const T *listptr() const noexcept { return &m_list[1]; }
+ std::size_t size() const noexcept { return static_cast<std::size_t>(m_end - &m_list[1]); }
+ const T & operator[](const std::size_t index) const noexcept { return m_list[ 1 + index]; }
private:
- using tqmutex = pspin_mutex<TS>;
- using tqlock = std::lock_guard<tqmutex>;
+ using mutex_type = pspin_mutex<TS>;
+ using lock_guard_type = std::lock_guard<mutex_type>;
- tqmutex m_lock;
- T * m_end;
- std::vector<T> m_list;
+ mutex_type m_lock;
+ PALIGNAS_CACHELINE()
+ T * m_end;
+ //std::vector<T> m_list;
+ plib::aligned_vector<T> m_list;
public:
// profiling
- nperfcount_t m_prof_sortmove;
- nperfcount_t m_prof_call;
+ nperfcount_t<KEEPSTAT> m_prof_sortmove;
+ nperfcount_t<KEEPSTAT> m_prof_call;
+ nperfcount_t<KEEPSTAT> m_prof_remove;
+ nperfcount_t<KEEPSTAT> m_prof_retime;
};
-#else
- template <class T, bool TS, class QueueOp = typename T::QueueOp>
- class timed_queue : plib::nocopyassignmove
+
+ template <class T, bool TS, bool KEEPSTAT, class QueueOp = typename T::QueueOp>
+ class timed_queue_heap : plib::nocopyassignmove
{
public:
struct compare
{
- constexpr bool operator()(const T &a, const T &b) const { return QueueOp::less(b,a); }
+ constexpr bool operator()(const T &a, const T &b) const { return QueueOp::lessequal(b,a); }
};
- explicit timed_queue(const std::size_t list_size)
+ explicit timed_queue_heap(const std::size_t list_size)
: m_list(list_size)
{
clear();
}
- constexpr std::size_t capacity() const noexcept { return m_list.capacity(); }
- constexpr bool empty() const noexcept { return &m_list[0] == m_end; }
+ std::size_t capacity() const noexcept { return m_list.capacity(); }
+ bool empty() const noexcept { return &m_list[0] == m_end; }
void push(T &&e) noexcept
{
/* Lock */
- tqlock lck(m_lock);
+ lock_guard_type lck(m_lock);
*m_end++ = e;
std::push_heap(&m_list[0], m_end, compare());
m_prof_call.inc();
}
- void pop() noexcept
+ T pop() noexcept
{
+ T ret(m_list[0]);
std::pop_heap(&m_list[0], m_end, compare());
m_end--;
+ return ret;
}
const T &top() const noexcept { return m_list[0]; }
@@ -245,7 +251,7 @@ namespace netlist
void remove(const R &elem) noexcept
{
/* Lock */
- tqlock lck(m_lock);
+ lock_guard_type lck(m_lock);
for (T * i = m_end - 1; i >= &m_list[0]; i--)
{
if (QueueOp::equal(*i, elem))
@@ -262,7 +268,7 @@ namespace netlist
void retime(const T &elem) noexcept
{
/* Lock */
- tqlock lck(m_lock);
+ lock_guard_type lck(m_lock);
for (T * i = m_end - 1; i >= &m_list[0]; i--)
{
if (QueueOp::equal(*i, elem)) // partial equal!
@@ -276,7 +282,7 @@ namespace netlist
void clear()
{
- tqlock lck(m_lock);
+ lock_guard_type lck(m_lock);
m_list.clear();
m_end = &m_list[0];
}
@@ -287,19 +293,28 @@ namespace netlist
constexpr std::size_t size() const noexcept { return m_list.size(); }
constexpr const T & operator[](const std::size_t index) const { return m_list[ 0 + index]; }
private:
- using tqmutex = pspin_mutex<TS>;
- using tqlock = std::lock_guard<tqmutex>;
+ using mutex_type = pspin_mutex<TS>;
+ using lock_guard_type = std::lock_guard<mutex_type>;
- tqmutex m_lock;
+ mutex_type m_lock;
std::vector<T> m_list;
T *m_end;
public:
// profiling
- nperfcount_t m_prof_sortmove;
- nperfcount_t m_prof_call;
+ nperfcount_t<KEEPSTAT> m_prof_sortmove;
+ nperfcount_t<KEEPSTAT> m_prof_call;
};
-#endif
-}
+
+ /*
+ * Use timed_queue_heap to use stdc++ heap functions instead of linear processing.
+ *
+ * This slows down processing by about 25% on a Kaby Lake.
+ */
+
+ template <class T, bool TS, bool KEEPSTAT, class QueueOp = typename T::QueueOp>
+ using timed_queue = timed_queue_linear<T, TS, KEEPSTAT, QueueOp>;
+
+} // namespace netlist
#endif /* NLLISTS_H_ */
diff --git a/src/lib/netlist/nl_parser.cpp b/src/lib/netlist/nl_parser.cpp
index 4685a13c354..cecfbe862bf 100644
--- a/src/lib/netlist/nl_parser.cpp
+++ b/src/lib/netlist/nl_parser.cpp
@@ -6,9 +6,9 @@
*/
#include "nl_parser.h"
-#include "nl_factory.h"
-#include "nl_errstr.h"
#include "nl_base.h"
+#include "nl_errstr.h"
+#include "nl_factory.h"
namespace netlist
{
@@ -24,13 +24,13 @@ void parser_t::verror(const pstring &msg, int line_num, const pstring &line)
//throw error;
}
-
bool parser_t::parse(const pstring &nlname)
{
- set_identifier_chars("abcdefghijklmnopqrstuvwvxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890_.-");
- set_number_chars(".0123456789", "0123456789eE-."); //FIXME: processing of numbers
- set_whitespace(pstring("").cat(' ').cat(9).cat(10).cat(13));
- set_comment("/*", "*/", "//");
+ this->identifier_chars("abcdefghijklmnopqrstuvwvxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890_.-")
+ .number_chars(".0123456789", "0123456789eE-.") //FIXME: processing of numbers
+ //set_whitespace(pstring("").cat(' ').cat(9).cat(10).cat(13));
+ .whitespace(pstring("") + ' ' + static_cast<char>(9) + static_cast<char>(10) + static_cast<char>(13))
+ .comment("/*", "*/", "//");
m_tok_param_left = register_token("(");
m_tok_param_right = register_token(")");
m_tok_comma = register_token(",");
@@ -357,10 +357,10 @@ void parser_t::device(const pstring &dev_type)
m_setup.register_dev(dev_type, devname);
m_setup.log().debug("Parser: IC: {1}\n", devname);
- for (pstring tp : paramlist)
+ for (const pstring &tp : paramlist)
{
require_token(m_tok_comma);
- if (tp.startsWith("+"))
+ if (plib::startsWith(tp, "+"))
{
pstring output_name = get_identifier();
m_setup.log().debug("Link: {1} {2}\n", tp, output_name);
@@ -395,18 +395,15 @@ void parser_t::device(const pstring &dev_type)
// ----------------------------------------------------------------------------------------
-nl_double parser_t::eval_param(const token_t tok)
+nl_double parser_t::eval_param(const token_t &tok)
{
- static pstring macs[6] = {"", "RES_K", "RES_M", "CAP_U", "CAP_N", "CAP_P"};
- static nl_double facs[6] = {1, 1e3, 1e6, 1e-6, 1e-9, 1e-12};
- int i;
- int f=0;
- bool e;
+ static std::array<pstring, 6> macs = {"", "RES_K", "RES_M", "CAP_U", "CAP_N", "CAP_P"};
+ static std::array<nl_double, 6> facs = {1, 1e3, 1e6, 1e-6, 1e-9, 1e-12};
+ std::size_t f=0;
nl_double ret;
- pstring val;
- for (i=1; i<6;i++)
- if (tok.str().equals(macs[i]))
+ for (std::size_t i=1; i<macs.size();i++)
+ if (tok.str() == macs[i])
f = i;
if (f>0)
{
@@ -416,13 +413,13 @@ nl_double parser_t::eval_param(const token_t tok)
}
else
{
- val = tok.str();
- ret = val.as_double(&e);
- if (e)
- error(plib::pfmt("Parameter value <{1}> not double \n")(val));
+ bool err;
+ ret = plib::pstonum_ne<nl_double>(tok.str(), err);
+ if (err)
+ error(plib::pfmt("Parameter value <{1}> not double \n")(tok.str()));
}
return ret * facs[f];
}
-}
+} // namespace netlist
diff --git a/src/lib/netlist/nl_parser.h b/src/lib/netlist/nl_parser.h
index a813629faa0..92459c4b87b 100644
--- a/src/lib/netlist/nl_parser.h
+++ b/src/lib/netlist/nl_parser.h
@@ -16,8 +16,12 @@ namespace netlist
class parser_t : public plib::ptokenizer
{
public:
- parser_t(plib::putf8_reader &strm, setup_t &setup)
- : plib::ptokenizer(strm), m_setup(setup) {}
+ template <typename T>
+ parser_t(T &&strm, nlparse_t &setup)
+ : plib::ptokenizer(std::forward<T>(strm))
+ , m_setup(setup)
+ {
+ }
bool parse(const pstring &nlname = "");
@@ -39,12 +43,12 @@ namespace netlist
void net_truthtable_start(const pstring &nlname);
/* for debugging messages */
- netlist_t &netlist() { return m_setup.netlist(); }
+ //netlist_state_t &netlist() { return m_setup.netlist(); }
- virtual void verror(const pstring &msg, int line_num, const pstring &line) override;
+ void verror(const pstring &msg, int line_num, const pstring &line) override;
private:
- nl_double eval_param(const token_t tok);
+ nl_double eval_param(const token_t &tok);
token_id_t m_tok_param_left;
token_id_t m_tok_param_right;
@@ -68,9 +72,9 @@ namespace netlist
token_id_t m_tok_TT_LINE;
token_id_t m_tok_TT_FAMILY;
- setup_t &m_setup;
+ nlparse_t &m_setup;
};
-}
+} // namespace netlist
#endif /* NL_PARSER_H_ */
diff --git a/src/lib/netlist/nl_setup.cpp b/src/lib/netlist/nl_setup.cpp
index df761bc3f88..b9300f5ad9c 100644
--- a/src/lib/netlist/nl_setup.cpp
+++ b/src/lib/netlist/nl_setup.cpp
@@ -6,128 +6,243 @@
*/
#include "plib/palloc.h"
-#include "plib/putil.h"
+#include "analog/nld_twoterm.h"
+#include "devices/nlid_proxy.h"
+#include "devices/nlid_system.h"
+#include "devices/nlid_truthtable.h"
#include "nl_base.h"
-#include "nl_setup.h"
-#include "nl_parser.h"
#include "nl_factory.h"
-#include "devices/nlid_system.h"
-#include "devices/nlid_proxy.h"
-#include "analog/nld_twoterm.h"
+#include "nl_parser.h"
+#include "nl_setup.h"
+#include "plib/putil.h"
#include "solver/nld_solver.h"
-#include "devices/nlid_truthtable.h"
-// ----------------------------------------------------------------------------------------
-// setup_t
-// ----------------------------------------------------------------------------------------
+#include <cmath>
namespace netlist
{
-setup_t::setup_t(netlist_t &netlist)
- : m_netlist(netlist)
- , m_factory(*this)
- , m_proxy_cnt(0)
+ // ----------------------------------------------------------------------------------------
+ // nl_parse_t
+ // ----------------------------------------------------------------------------------------
+
+ nlparse_t::nlparse_t(setup_t &setup, log_type &log)
+ : m_factory(log)
+ , m_setup(setup)
+ , m_log(log)
, m_frontier_cnt(0)
-{
- devices::initialize_factory(m_factory);
-}
+ { }
-setup_t::~setup_t()
-{
- m_links.clear();
- m_alias.clear();
- m_params.clear();
- m_terminals.clear();
- m_param_values.clear();
+ void nlparse_t::register_alias(const pstring &alias, const pstring &out)
+ {
+ pstring alias_fqn = build_fqn(alias);
+ pstring out_fqn = build_fqn(out);
+ register_alias_nofqn(alias_fqn, out_fqn);
+ }
- m_sources.clear();
-}
+ void nlparse_t::register_dippins_arr(const pstring &terms)
+ {
+ std::vector<pstring> list(plib::psplit(terms,", "));
+ if (list.size() == 0 || (list.size() % 2) == 1)
+ log().fatal(MF_1_DIP_PINS_MUST_BE_AN_EQUAL_NUMBER_OF_PINS_1,
+ build_fqn(""));
+ std::size_t n = list.size();
+ for (std::size_t i = 0; i < n / 2; i++)
+ {
+ register_alias(plib::pfmt("{1}")(i+1), list[i * 2]);
+ register_alias(plib::pfmt("{1}")(n-i), list[i * 2 + 1]);
+ }
+ }
-pstring setup_t::build_fqn(const pstring &obj_name) const
-{
- if (m_namespace_stack.empty())
- //return netlist().name() + "." + obj_name;
- return obj_name;
- else
- return m_namespace_stack.top() + "." + obj_name;
-}
+ void nlparse_t::register_dev(const pstring &classname, const pstring &name)
+ {
+ auto f = m_factory.factory_by_name(classname);
+ if (f == nullptr)
+ log().fatal(MF_1_CLASS_1_NOT_FOUND, classname);
+ else
+ {
+ /* make sure we parse macro library entries */
+ f->macro_actions(*this, name);
+ pstring key = build_fqn(name);
+ if (device_exists(key))
+ log().fatal(MF_1_DEVICE_ALREADY_EXISTS_1, name);
+ else
+ m_device_factory.insert(m_device_factory.end(), {key, f});
+ }
+ }
-void setup_t::namespace_push(const pstring &aname)
-{
- if (m_namespace_stack.empty())
- //m_namespace_stack.push(netlist().name() + "." + aname);
- m_namespace_stack.push(aname);
- else
- m_namespace_stack.push(m_namespace_stack.top() + "." + aname);
-}
+ void nlparse_t::register_link(const pstring &sin, const pstring &sout)
+ {
+ register_link_fqn(build_fqn(sin), build_fqn(sout));
+ }
-void setup_t::namespace_pop()
-{
- m_namespace_stack.pop();
-}
+ void nlparse_t::register_link_arr(const pstring &terms)
+ {
+ std::vector<pstring> list(plib::psplit(terms,", "));
+ if (list.size() < 2)
+ log().fatal(MF_2_NET_C_NEEDS_AT_LEAST_2_TERMINAL);
+ for (std::size_t i = 1; i < list.size(); i++)
+ {
+ register_link(list[0], list[i]);
+ }
+ }
-void setup_t::register_lib_entry(const pstring &name, const pstring &sourcefile)
-{
- factory().register_device(plib::make_unique_base<factory::element_t, factory::library_element_t>(*this, name, name, "", sourcefile));
-}
+ void nlparse_t::include(const pstring &netlist_name)
+ {
+ for (auto &source : m_sources)
+ {
+ if (source->parse(*this, netlist_name))
+ return;
+ }
+ log().fatal(MF_1_NOT_FOUND_IN_SOURCE_COLLECTION, netlist_name);
+ }
-void setup_t::register_dev(const pstring &classname, const pstring &name)
-{
- auto f = factory().factory_by_name(classname);
- if (f == nullptr)
- log().fatal(MF_1_CLASS_1_NOT_FOUND, classname);
- /* make sure we parse macro library entries */
- f->macro_actions(netlist(), name);
- m_device_factory.push_back(std::pair<pstring, factory::element_t *>(build_fqn(name), f));
-}
-bool setup_t::device_exists(const pstring &name) const
-{
- for (auto e : m_device_factory)
+ void nlparse_t::namespace_push(const pstring &aname)
{
- if (e.first == name)
- return true;
+ if (m_namespace_stack.empty())
+ //m_namespace_stack.push(netlist().name() + "." + aname);
+ m_namespace_stack.push(aname);
+ else
+ m_namespace_stack.push(m_namespace_stack.top() + "." + aname);
}
- return false;
-}
+ void nlparse_t::namespace_pop()
+ {
+ m_namespace_stack.pop();
+ }
-void setup_t::register_model(const pstring &model_in)
-{
- auto pos = model_in.find(" ");
- if (pos == pstring::npos)
- log().fatal(MF_1_UNABLE_TO_PARSE_MODEL_1, model_in);
- pstring model = model_in.left(pos).trim().ucase();
- pstring def = model_in.substr(pos + 1).trim();
- if (!m_models.insert({model, def}).second)
- log().fatal(MF_1_MODEL_ALREADY_EXISTS_1, model_in);
-}
+ void nlparse_t::register_param(const pstring &param, const double value)
+ {
+ if (std::abs(value - std::floor(value)) > 1e-30 || std::abs(value) > 1e9)
+ register_param(param, plib::pfmt("{1:.9}").e(value));
+ else
+ register_param(param, plib::pfmt("{1}")(static_cast<long>(value)));
+ }
-void setup_t::register_alias_nofqn(const pstring &alias, const pstring &out)
-{
- if (!m_alias.insert({alias, out}).second)
- log().fatal(MF_1_ADDING_ALI1_TO_ALIAS_LIST, alias);
-}
+ void nlparse_t::register_param(const pstring &param, const pstring &value)
+ {
+ pstring fqn = build_fqn(param);
+
+ auto idx = m_param_values.find(fqn);
+ if (idx == m_param_values.end())
+ {
+ if (!m_param_values.insert({fqn, value}).second)
+ log().fatal(MF_1_ADDING_PARAMETER_1_TO_PARAMETER_LIST,
+ param);
+ }
+ else
+ {
+ log().warning(MW_3_OVERWRITING_PARAM_1_OLD_2_NEW_3, fqn, idx->second,
+ value);
+ m_param_values[fqn] = value;
+ }
+ }
+
+ void nlparse_t::register_lib_entry(const pstring &name, const pstring &sourcefile)
+ {
+ m_factory.register_device(plib::make_unique<factory::library_element_t>(name, name, "", sourcefile));
+ }
+
+ void nlparse_t::register_frontier(const pstring &attach, const double r_IN, const double r_OUT)
+ {
+ pstring frontier_name = plib::pfmt("frontier_{1}")(m_frontier_cnt);
+ m_frontier_cnt++;
+ register_dev("FRONTIER_DEV", frontier_name);
+ register_param(frontier_name + ".RIN", r_IN);
+ register_param(frontier_name + ".ROUT", r_OUT);
+ register_link(frontier_name + ".G", "GND");
+ pstring attfn = build_fqn(attach);
+ pstring front_fqn = build_fqn(frontier_name);
+ bool found = false;
+ for (auto & link : m_links)
+ {
+ if (link.first == attfn)
+ {
+ link.first = front_fqn + ".I";
+ found = true;
+ }
+ else if (link.second == attfn)
+ {
+ link.second = front_fqn + ".I";
+ found = true;
+ }
+ }
+ if (!found)
+ log().fatal(MF_1_FOUND_NO_OCCURRENCE_OF_1, attach);
+ register_link(attach, frontier_name + ".Q");
+ }
+
+ void nlparse_t::tt_factory_create(tt_desc &desc, const pstring &sourcefile)
+ {
+ auto fac = devices::tt_factory_create(desc, sourcefile);
+ m_factory.register_device(std::move(fac));
+ }
+
+ pstring nlparse_t::build_fqn(const pstring &obj_name) const
+ {
+ if (m_namespace_stack.empty())
+ //return netlist().name() + "." + obj_name;
+ return obj_name;
+ else
+ return m_namespace_stack.top() + "." + obj_name;
+ }
+
+ void nlparse_t::register_alias_nofqn(const pstring &alias, const pstring &out)
+ {
+ if (!m_alias.insert({alias, out}).second)
+ log().fatal(MF_1_ADDING_ALI1_TO_ALIAS_LIST, alias);
+ }
+
+ void nlparse_t::register_link_fqn(const pstring &sin, const pstring &sout)
+ {
+ link_t temp = link_t(sin, sout);
+ log().debug("link {1} <== {2}\n", sin, sout);
+ m_links.push_back(temp);
+ }
-void setup_t::register_alias(const pstring &alias, const pstring &out)
+ bool nlparse_t::device_exists(const pstring &name) const
+ {
+ for (auto &d : m_device_factory)
+ if (d.first == name)
+ return true;
+ return false;
+ }
+
+ bool nlparse_t::parse_stream(plib::unique_ptr<plib::pistream> &&istrm, const pstring &name)
+ {
+ return parser_t(std::move(plib::ppreprocessor(&m_defines).process(std::move(istrm))), *this).parse(name);
+ }
+
+ void nlparse_t::add_define(const pstring &defstr)
+ {
+ auto p = defstr.find("=");
+ if (p != pstring::npos)
+ add_define(plib::left(defstr, p), defstr.substr(p+1));
+ else
+ add_define(defstr, "1");
+ }
+
+ // ----------------------------------------------------------------------------------------
+ // setup_t
+ // ----------------------------------------------------------------------------------------
+
+
+setup_t::setup_t(netlist_state_t &nlstate)
+ : nlparse_t(*this, nlstate.log())
+ , m_nlstate(nlstate)
+ , m_netlist_params(nullptr)
+ , m_proxy_cnt(0)
{
- pstring alias_fqn = build_fqn(alias);
- pstring out_fqn = build_fqn(out);
- register_alias_nofqn(alias_fqn, out_fqn);
}
-void setup_t::register_dippins_arr(const pstring &terms)
+setup_t::~setup_t() noexcept
{
- std::vector<pstring> list(plib::psplit(terms,", "));
- if (list.size() == 0 || (list.size() % 2) == 1)
- log().fatal(MF_1_DIP_PINS_MUST_BE_AN_EQUAL_NUMBER_OF_PINS_1,
- build_fqn(""));
- std::size_t n = list.size();
- for (std::size_t i = 0; i < n / 2; i++)
- {
- register_alias(plib::pfmt("{1}")(i+1), list[i * 2]);
- register_alias(plib::pfmt("{1}")(n-i), list[i * 2 + 1]);
- }
+ // FIXME: can't see a need any longer
+ m_links.clear();
+ m_params.clear();
+ m_terminals.clear();
+ m_param_values.clear();
+ m_sources.clear();
}
pstring setup_t::termtype_as_str(detail::core_terminal_t &in) const
@@ -145,7 +260,7 @@ pstring setup_t::termtype_as_str(detail::core_terminal_t &in) const
return pstring("Error");
}
-pstring setup_t::get_initial_param_val(const pstring &name, const pstring &def)
+pstring setup_t::get_initial_param_val(const pstring &name, const pstring &def) const
{
auto i = m_param_values.find(name);
if (i != m_param_values.end())
@@ -154,40 +269,6 @@ pstring setup_t::get_initial_param_val(const pstring &name, const pstring &def)
return def;
}
-double setup_t::get_initial_param_val(const pstring &name, const double def)
-{
- auto i = m_param_values.find(name);
- if (i != m_param_values.end())
- {
- double vald = 0;
- if (sscanf(i->second.c_str(), "%lf", &vald) != 1)
- log().fatal(MF_2_INVALID_NUMBER_CONVERSION_1_2, name, i->second);
- return vald;
- }
- else
- return def;
-}
-
-int setup_t::get_initial_param_val(const pstring &name, const int def)
-{
- auto i = m_param_values.find(name);
- if (i != m_param_values.end())
- {
- double vald = 0;
- if (sscanf(i->second.c_str(), "%lf", &vald) != 1)
- log().fatal(MF_2_INVALID_NUMBER_CONVERSION_1_2, name, i->second);
- return static_cast<int>(vald);
- }
- else
- return def;
-}
-
-void setup_t::register_param(const pstring &name, param_t &param)
-{
- if (!m_params.insert({param.name(), param_ref_t(param.name(), param.device(), param)}).second)
- log().fatal(MF_1_ADDING_PARAMETER_1_TO_PARAMETER_LIST, name);
-}
-
void setup_t::register_term(detail::core_terminal_t &term)
{
if (!m_terminals.insert({term.name(), &term}).second)
@@ -196,30 +277,6 @@ void setup_t::register_term(detail::core_terminal_t &term)
log().debug("{1} {2}\n", termtype_as_str(term), term.name());
}
-void setup_t::register_link_arr(const pstring &terms)
-{
- std::vector<pstring> list(plib::psplit(terms,", "));
- if (list.size() < 2)
- log().fatal(MF_2_NET_C_NEEDS_AT_LEAST_2_TERMINAL);
- for (std::size_t i = 1; i < list.size(); i++)
- {
- register_link(list[0], list[i]);
- }
-}
-
-
-void setup_t::register_link_fqn(const pstring &sin, const pstring &sout)
-{
- link_t temp = link_t(sin, sout);
- log().debug("link {1} <== {2}\n", sin, sout);
- m_links.push_back(temp);
-}
-
-void setup_t::register_link(const pstring &sin, const pstring &sout)
-{
- register_link_fqn(build_fqn(sin), build_fqn(sout));
-}
-
void setup_t::remove_connections(const pstring &pin)
{
pstring pinfn = build_fqn(pin);
@@ -241,59 +298,14 @@ void setup_t::remove_connections(const pstring &pin)
}
-void setup_t::register_frontier(const pstring &attach, const double r_IN, const double r_OUT)
-{
- pstring frontier_name = plib::pfmt("frontier_{1}")(m_frontier_cnt);
- m_frontier_cnt++;
- register_dev("FRONTIER_DEV", frontier_name);
- register_param(frontier_name + ".RIN", r_IN);
- register_param(frontier_name + ".ROUT", r_OUT);
- register_link(frontier_name + ".G", "GND");
- pstring attfn = build_fqn(attach);
- pstring front_fqn = build_fqn(frontier_name);
- bool found = false;
- for (auto & link : m_links)
- {
- if (link.first == attfn)
- {
- link.first = front_fqn + ".I";
- found = true;
- }
- else if (link.second == attfn)
- {
- link.second = front_fqn + ".I";
- found = true;
- }
- }
- if (!found)
- log().fatal(MF_1_FOUND_NO_OCCURRENCE_OF_1, attach);
- register_link(attach, frontier_name + ".Q");
-}
-
-void setup_t::register_param(const pstring &param, const double value)
+void setup_t::register_param_t(const pstring &name, param_t &param)
{
- register_param(param, plib::pfmt("{1:.9}").e(value));
+ if (!m_params.insert({param.name(), param_ref_t(param.name(), param.device(), param)}).second)
+ log().fatal(MF_1_ADDING_PARAMETER_1_TO_PARAMETER_LIST, name);
}
-void setup_t::register_param(const pstring &param, const pstring &value)
-{
- pstring fqn = build_fqn(param);
- auto idx = m_param_values.find(fqn);
- if (idx == m_param_values.end())
- {
- if (!m_param_values.insert({fqn, value}).second)
- log().fatal(MF_1_ADDING_PARAMETER_1_TO_PARAMETER_LIST,
- param);
- }
- else
- {
- log().warning(MW_3_OVERWRITING_PARAM_1_OLD_2_NEW_3, fqn, idx->second,
- value);
- m_param_values[fqn] = value;
- }
-}
const pstring setup_t::resolve_alias(const pstring &name) const
{
@@ -311,6 +323,42 @@ const pstring setup_t::resolve_alias(const pstring &name) const
return ret;
}
+std::vector<pstring> setup_t::get_terminals_for_device_name(const pstring &devname)
+{
+ std::vector<pstring> terms;
+ for (auto & t : m_terminals)
+ {
+ if (plib::startsWith(t.second->name(), devname))
+ {
+ pstring tn(t.second->name().substr(devname.length()+1));
+ if (tn.find(".") == pstring::npos)
+ terms.push_back(tn);
+ }
+ }
+
+ for (auto & t : m_alias)
+ {
+ if (plib::startsWith(t.first, devname))
+ {
+ pstring tn(t.first.substr(devname.length()+1));
+ //printf("\t%s %s %s\n", t.first.c_str(), t.second.c_str(), tn.c_str());
+ if (tn.find(".") == pstring::npos)
+ {
+ terms.push_back(tn);
+ pstring resolved = resolve_alias(t.first);
+ //printf("\t%s %s %s\n", t.first.c_str(), t.second.c_str(), resolved.c_str());
+ if (resolved != t.first)
+ {
+ auto found = std::find(terms.begin(), terms.end(), resolved.substr(devname.length()+1));
+ if (found!=terms.end())
+ terms.erase(found);
+ }
+ }
+ }
+ }
+ return terms;
+}
+
detail::core_terminal_t *setup_t::find_terminal(const pstring &terminal_in, bool required)
{
const pstring &tname = resolve_alias(terminal_in);
@@ -377,7 +425,7 @@ devices::nld_base_proxy *setup_t::get_d_a_proxy(detail::core_terminal_t &out)
{
nl_assert(out.is_logic());
- logic_output_t &out_cast = static_cast<logic_output_t &>(out);
+ auto &out_cast = static_cast<logic_output_t &>(out);
devices::nld_base_proxy *proxy = out_cast.get_proxy();
if (proxy == nullptr)
@@ -385,28 +433,25 @@ devices::nld_base_proxy *setup_t::get_d_a_proxy(detail::core_terminal_t &out)
// create a new one ...
pstring x = plib::pfmt("proxy_da_{1}_{2}")(out.name())(m_proxy_cnt);
auto new_proxy =
- out_cast.logic_family()->create_d_a_proxy(netlist(), x, &out_cast);
+ out_cast.logic_family()->create_d_a_proxy(m_nlstate, x, &out_cast);
m_proxy_cnt++;
-
- //new_proxy->start_dev();
-
/* connect all existing terminals to new net */
- for (auto & p : out.net().m_core_terms)
+ for (auto & p : out.net().core_terms())
{
p->clear_net(); // de-link from all nets ...
if (!connect(new_proxy->proxy_term(), *p))
log().fatal(MF_2_CONNECTING_1_TO_2,
new_proxy->proxy_term().name(), (*p).name());
}
- out.net().m_core_terms.clear(); // clear the list
+ out.net().core_terms().clear(); // clear the list
out.net().add_terminal(new_proxy->in());
out_cast.set_proxy(proxy);
proxy = new_proxy.get();
- netlist().register_dev(std::move(new_proxy));
+ m_nlstate.add_dev(new_proxy->name(), std::move(new_proxy));
}
return proxy;
}
@@ -415,7 +460,7 @@ devices::nld_base_proxy *setup_t::get_a_d_proxy(detail::core_terminal_t &inp)
{
nl_assert(inp.is_logic());
- logic_input_t &incast = dynamic_cast<logic_input_t &>(inp);
+ auto &incast = dynamic_cast<logic_input_t &>(inp);
devices::nld_base_proxy *proxy = incast.get_proxy();
if (proxy != nullptr)
@@ -424,7 +469,7 @@ devices::nld_base_proxy *setup_t::get_a_d_proxy(detail::core_terminal_t &inp)
{
log().debug("connect_terminal_input: connecting proxy\n");
pstring x = plib::pfmt("proxy_ad_{1}_{2}")(inp.name())(m_proxy_cnt);
- auto new_proxy = incast.logic_family()->create_a_d_proxy(netlist(), x, &incast);
+ auto new_proxy = incast.logic_family()->create_a_d_proxy(m_nlstate, x, &incast);
//auto new_proxy = plib::owned_ptr<devices::nld_a_to_d_proxy>::Create(netlist(), x, &incast);
incast.set_proxy(new_proxy.get());
m_proxy_cnt++;
@@ -435,17 +480,17 @@ devices::nld_base_proxy *setup_t::get_a_d_proxy(detail::core_terminal_t &inp)
if (inp.has_net())
{
- for (auto & p : inp.net().m_core_terms)
+ for (auto & p : inp.net().core_terms())
{
p->clear_net(); // de-link from all nets ...
if (!connect(ret->proxy_term(), *p))
log().fatal(MF_2_CONNECTING_1_TO_2,
ret->proxy_term().name(), (*p).name());
}
- inp.net().m_core_terms.clear(); // clear the list
+ inp.net().core_terms().clear(); // clear the list
}
ret->out().net().add_terminal(inp);
- netlist().register_dev(std::move(new_proxy));
+ m_nlstate.add_dev(new_proxy->name(), std::move(new_proxy));
return ret;
}
}
@@ -568,11 +613,12 @@ void setup_t::connect_terminals(detail::core_terminal_t &t1, detail::core_termin
{
log().debug("adding analog net ...\n");
// FIXME: Nets should have a unique name
- auto anet = plib::palloc<analog_net_t>(netlist(),"net." + t1.name());
- netlist().m_nets.push_back(plib::owned_ptr<analog_net_t>(anet, true));
- t1.set_net(anet);
- anet->add_terminal(t2);
- anet->add_terminal(t1);
+ auto anet = pool().make_poolptr<analog_net_t>(m_nlstate,"net." + t1.name());
+ auto anetp = anet.get();
+ m_nlstate.register_net(std::move(anet));
+ t1.set_net(anetp);
+ anetp->add_terminal(t2);
+ anetp->add_terminal(t1);
}
}
@@ -580,7 +626,7 @@ static detail::core_terminal_t &resolve_proxy(detail::core_terminal_t &term)
{
if (term.is_logic())
{
- logic_t &out = dynamic_cast<logic_t &>(term);
+ auto &out = dynamic_cast<logic_t &>(term);
if (out.has_proxy())
return out.get_proxy()->proxy_term();
}
@@ -596,7 +642,7 @@ bool setup_t::connect_input_input(detail::core_terminal_t &t1, detail::core_term
ret = connect(t2, t1.net().railterminal());
if (!ret)
{
- for (auto & t : t1.net().m_core_terms)
+ for (auto & t : t1.net().core_terms())
{
if (t->is_type(detail::terminal_type::TERMINAL))
ret = connect(t2, *t);
@@ -611,7 +657,7 @@ bool setup_t::connect_input_input(detail::core_terminal_t &t1, detail::core_term
ret = connect(t1, t2.net().railterminal());
if (!ret)
{
- for (auto & t : t2.net().m_core_terms)
+ for (auto & t : t2.net().core_terms())
{
if (t->is_type(detail::terminal_type::TERMINAL))
ret = connect(t1, *t);
@@ -623,8 +669,6 @@ bool setup_t::connect_input_input(detail::core_terminal_t &t1, detail::core_term
return ret;
}
-
-
bool setup_t::connect(detail::core_terminal_t &t1_in, detail::core_terminal_t &t2_in)
{
log().debug("Connecting {1} to {2}\n", t1_in.name(), t2_in.name());
@@ -712,18 +756,7 @@ void setup_t::resolve_inputs()
// delete empty nets
- netlist().m_nets.erase(
- std::remove_if(netlist().m_nets.begin(), netlist().m_nets.end(),
- [](plib::owned_ptr<detail::net_t> &x)
- {
- if (x->num_cons() == 0)
- {
- x->netlist().log().verbose("Deleting net {1} ...", x->name());
- return true;
- }
- else
- return false;
- }), netlist().m_nets.end());
+ delete_empty_nets();
pstring errstr("");
@@ -744,7 +777,7 @@ void setup_t::resolve_inputs()
}
-void setup_t::start_devices()
+void setup_t::register_dynamic_log_devices()
{
pstring env = plib::util::environment("NL_LOGS", "");
@@ -752,41 +785,43 @@ void setup_t::start_devices()
{
log().debug("Creating dynamic logs ...");
std::vector<pstring> loglist(plib::psplit(env, ":"));
- for (pstring ll : loglist)
+ for (const pstring &ll : loglist)
{
pstring name = "log_" + ll;
- auto nc = factory().factory_by_name("LOG")->Create(netlist(), name);
+ auto nc = factory().factory_by_name("LOG")->Create(m_nlstate, name);
register_link(name + ".I", ll);
log().debug(" dynamic link {1}: <{2}>\n",ll, name);
- netlist().register_dev(std::move(nc));
+ m_nlstate.add_dev(nc->name(), std::move(nc));
}
}
}
-plib::plog_base<netlist_t, NL_DEBUG> &setup_t::log()
+log_type &setup_t::log()
{
- return netlist().log();
+ return m_nlstate.log();
}
-const plib::plog_base<netlist_t, NL_DEBUG> &setup_t::log() const
+const log_type &setup_t::log() const
{
- return netlist().log();
+ return m_nlstate.log();
}
// ----------------------------------------------------------------------------------------
-// Model
+// Models
// ----------------------------------------------------------------------------------------
-static pstring model_string(detail::model_map_t &map)
+void models_t::register_model(pstring model_in)
{
- pstring ret = map["COREMODEL"] + "(";
- for (auto & i : map)
- ret = ret + i.first + "=" + i.second + " ";
-
- return ret + ")";
+ auto pos = model_in.find(" ");
+ if (pos == pstring::npos)
+ throw nl_exception(MF_1_UNABLE_TO_PARSE_MODEL_1, model_in);
+ pstring model = plib::ucase(plib::trim(plib::left(model_in, pos)));
+ pstring def = plib::trim(model_in.substr(pos + 1));
+ if (!m_models.insert({model, def}).second)
+ throw nl_exception(MF_1_MODEL_ALREADY_EXISTS_1, model_in);
}
-void setup_t::model_parse(const pstring &model_in, detail::model_map_t &map)
+void models_t::model_parse(const pstring &model_in, model_map_t &map)
{
pstring model = model_in;
std::size_t pos = 0;
@@ -797,15 +832,15 @@ void setup_t::model_parse(const pstring &model_in, detail::model_map_t &map)
pos = model.find("(");
if (pos != pstring::npos) break;
- key = model.ucase();
+ key = plib::ucase(model);
auto i = m_models.find(key);
if (i == m_models.end())
- log().fatal(MF_1_MODEL_NOT_FOUND, model);
+ throw nl_exception(MF_1_MODEL_NOT_FOUND, model);
model = i->second;
}
- pstring xmodel = model.left(pos);
+ pstring xmodel = plib::left(model, pos);
- if (xmodel.equals("_"))
+ if (xmodel == "_")
map["COREMODEL"] = key;
else
{
@@ -813,46 +848,65 @@ void setup_t::model_parse(const pstring &model_in, detail::model_map_t &map)
if (i != m_models.end())
model_parse(xmodel, map);
else
- log().fatal(MF_1_MODEL_NOT_FOUND, model_in);
+ throw nl_exception(MF_1_MODEL_NOT_FOUND, model_in);
}
- pstring remainder = model.substr(pos + 1).trim();
- if (!remainder.endsWith(")"))
- log().fatal(MF_1_MODEL_ERROR_1, model);
+ pstring remainder = plib::trim(model.substr(pos + 1));
+ if (!plib::endsWith(remainder, ")"))
+ throw nl_exception(MF_1_MODEL_ERROR_1, model);
// FIMXE: Not optimal
- remainder = remainder.left(remainder.length() - 1);
+ remainder = plib::left(remainder, remainder.size() - 1);
std::vector<pstring> pairs(plib::psplit(remainder," ", true));
for (pstring &pe : pairs)
{
auto pose = pe.find("=");
if (pose == pstring::npos)
- log().fatal(MF_1_MODEL_ERROR_ON_PAIR_1, model);
- map[pe.left(pose).ucase()] = pe.substr(pose + 1);
+ throw nl_exception(MF_1_MODEL_ERROR_ON_PAIR_1, model);
+ map[plib::ucase(plib::left(pe, pose))] = pe.substr(pose + 1);
}
}
-const pstring setup_t::model_value_str(detail::model_map_t &map, const pstring &entity)
+pstring models_t::model_string(model_map_t &map)
+{
+ pstring ret = map["COREMODEL"] + "(";
+ for (auto & i : map)
+ ret = ret + i.first + "=" + i.second + " ";
+
+ return ret + ")";
+}
+
+pstring models_t::model_value_str(pstring model, pstring entity)
{
+ model_map_t &map = m_cache[model];
+
+ if (map.size() == 0)
+ model_parse(model , map);
+
pstring ret;
- if (entity != entity.ucase())
- log().fatal(MF_2_MODEL_PARAMETERS_NOT_UPPERCASE_1_2, entity,
+ if (entity != plib::ucase(entity))
+ throw nl_exception(MF_2_MODEL_PARAMETERS_NOT_UPPERCASE_1_2, entity,
model_string(map));
if (map.find(entity) == map.end())
- log().fatal(MF_2_ENTITY_1_NOT_FOUND_IN_MODEL_2, entity, model_string(map));
+ throw nl_exception(MF_2_ENTITY_1_NOT_FOUND_IN_MODEL_2, entity, model_string(map));
else
ret = map[entity];
return ret;
}
-nl_double setup_t::model_value(detail::model_map_t &map, const pstring &entity)
+nl_double models_t::model_value(pstring model, pstring entity)
{
- pstring tmp = model_value_str(map, entity);
+ model_map_t &map = m_cache[model];
+
+ if (map.size() == 0)
+ model_parse(model , map);
- nl_double factor = NL_FCONST(1.0);
- auto p = std::next(tmp.begin(), static_cast<pstring::difference_type>(tmp.length() - 1));
+ pstring tmp = model_value_str(model, entity);
+
+ nl_double factor = plib::constants<nl_double>::one();
+ auto p = std::next(tmp.begin(), static_cast<pstring::difference_type>(tmp.size() - 1));
switch (*p)
{
case 'M': factor = 1e6; break;
@@ -865,85 +919,69 @@ nl_double setup_t::model_value(detail::model_map_t &map, const pstring &entity)
case 'a': factor = 1e-18; break;
default:
if (*p < '0' || *p > '9')
- log().fatal(MF_1_UNKNOWN_NUMBER_FACTOR_IN_1, entity);
+ throw nl_exception(MF_1_UNKNOWN_NUMBER_FACTOR_IN_1, entity);
}
- if (factor != NL_FCONST(1.0))
- tmp = tmp.left(tmp.length() - 1);
- return tmp.as_double() * factor;
+ if (factor != plib::constants<nl_double>::one())
+ tmp = plib::left(tmp, tmp.size() - 1);
+ // FIXME: check for errors
+ //printf("%s %s %e %e\n", entity.c_str(), tmp.c_str(), plib::pstonum<nl_double>(tmp), factor);
+ return plib::pstonum<nl_double>(tmp) * factor;
}
class logic_family_std_proxy_t : public logic_family_desc_t
{
public:
- logic_family_std_proxy_t() { }
- virtual plib::owned_ptr<devices::nld_base_d_to_a_proxy> create_d_a_proxy(netlist_t &anetlist,
+ logic_family_std_proxy_t() = default;
+ pool_owned_ptr<devices::nld_base_d_to_a_proxy> create_d_a_proxy(netlist_state_t &anetlist,
const pstring &name, logic_output_t *proxied) const override;
- virtual plib::owned_ptr<devices::nld_base_a_to_d_proxy> create_a_d_proxy(netlist_t &anetlist, const pstring &name, logic_input_t *proxied) const override;
+ pool_owned_ptr<devices::nld_base_a_to_d_proxy> create_a_d_proxy(netlist_state_t &anetlist, const pstring &name, logic_input_t *proxied) const override;
};
-plib::owned_ptr<devices::nld_base_d_to_a_proxy> logic_family_std_proxy_t::create_d_a_proxy(netlist_t &anetlist,
+pool_owned_ptr<devices::nld_base_d_to_a_proxy> logic_family_std_proxy_t::create_d_a_proxy(netlist_state_t &anetlist,
const pstring &name, logic_output_t *proxied) const
{
- return plib::owned_ptr<devices::nld_base_d_to_a_proxy>::Create<devices::nld_d_to_a_proxy>(anetlist, name, proxied);
+ return pool().make_poolptr<devices::nld_d_to_a_proxy>(anetlist, name, proxied);
}
-plib::owned_ptr<devices::nld_base_a_to_d_proxy> logic_family_std_proxy_t::create_a_d_proxy(netlist_t &anetlist, const pstring &name, logic_input_t *proxied) const
+pool_owned_ptr<devices::nld_base_a_to_d_proxy> logic_family_std_proxy_t::create_a_d_proxy(netlist_state_t &anetlist, const pstring &name, logic_input_t *proxied) const
{
- return plib::owned_ptr<devices::nld_base_a_to_d_proxy>::Create<devices::nld_a_to_d_proxy>(anetlist, name, proxied);
+ return pool().make_poolptr<devices::nld_a_to_d_proxy>(anetlist, name, proxied);
}
const logic_family_desc_t *setup_t::family_from_model(const pstring &model)
{
- detail::model_map_t map;
- model_parse(model, map);
- if (model_value_str(map, "TYPE") == "TTL")
+ if (m_models.model_value_str(model, "TYPE") == "TTL")
return family_TTL();
- if (model_value_str(map, "TYPE") == "CD4XXX")
+ if (m_models.model_value_str(model, "TYPE") == "CD4XXX")
return family_CD4XXX();
- for (auto & e : netlist().m_family_cache)
+ for (auto & e : m_nlstate.m_family_cache)
if (e.first == model)
return e.second.get();
- auto ret = plib::make_unique_base<logic_family_desc_t, logic_family_std_proxy_t>();
+ auto ret = plib::make_unique<logic_family_std_proxy_t>();
- ret->m_fixed_V = model_value(map, "FV");
- ret->m_low_thresh_PCNT = model_value(map, "IVL");
- ret->m_high_thresh_PCNT = model_value(map, "IVH");
- ret->m_low_VO = model_value(map, "OVL");
- ret->m_high_VO = model_value(map, "OVH");
- ret->m_R_low = model_value(map, "ORL");
- ret->m_R_high = model_value(map, "ORH");
+ ret->m_fixed_V = m_models.model_value(model, "FV");
+ ret->m_low_thresh_PCNT = m_models.model_value(model, "IVL");
+ ret->m_high_thresh_PCNT = m_models.model_value(model, "IVH");
+ ret->m_low_VO = m_models.model_value(model, "OVL");
+ ret->m_high_VO = m_models. model_value(model, "OVH");
+ ret->m_R_low = m_models.model_value(model, "ORL");
+ ret->m_R_high = m_models.model_value(model, "ORH");
auto retp = ret.get();
- netlist().m_family_cache.emplace_back(model, std::move(ret));
+ m_nlstate.m_family_cache.emplace_back(model, std::move(ret));
return retp;
}
-void setup_t::tt_factory_create(tt_desc &desc, const pstring &sourcefile)
-{
- devices::tt_factory_create(*this, desc, sourcefile);
-}
-
-
// ----------------------------------------------------------------------------------------
// Sources
// ----------------------------------------------------------------------------------------
-void setup_t::include(const pstring &netlist_name)
-{
- for (auto &source : m_sources)
- {
- if (source->parse(netlist_name))
- return;
- }
- log().fatal(MF_1_NOT_FOUND_IN_SOURCE_COLLECTION, netlist_name);
-}
-
-std::unique_ptr<plib::pistream> setup_t::get_data_stream(const pstring &name)
+plib::unique_ptr<plib::pistream> setup_t::get_data_stream(const pstring &name)
{
for (auto &source : m_sources)
{
@@ -955,77 +993,189 @@ std::unique_ptr<plib::pistream> setup_t::get_data_stream(const pstring &name)
}
}
log().warning(MW_1_DATA_1_NOT_FOUND, name);
- return std::unique_ptr<plib::pistream>(nullptr);
+ return plib::unique_ptr<plib::pistream>(nullptr);
}
-bool setup_t::parse_stream(plib::putf8_reader &istrm, const pstring &name)
-{
- plib::pomemstream ostrm;
- plib::putf8_writer owrt(ostrm);
+// ----------------------------------------------------------------------------------------
+// Device handling
+// ----------------------------------------------------------------------------------------
- plib::ppreprocessor(&m_defines).process(istrm, owrt);
- plib::pimemstream istrm2(ostrm);
- plib::putf8_reader reader2(istrm2);
- return parser_t(reader2, *this).parse(name);
+void setup_t::delete_empty_nets()
+{
+ m_nlstate.nets().erase(
+ std::remove_if(m_nlstate.nets().begin(), m_nlstate.nets().end(),
+ [](pool_owned_ptr<detail::net_t> &x)
+ {
+ if (x->num_cons() == 0)
+ {
+ x->state().log().verbose("Deleting net {1} ...", x->name());
+ x->state().run_state_manager().remove_save_items(x.get());
+ return true;
+ }
+ else
+ return false;
+ }), m_nlstate.nets().end());
}
-void setup_t::register_define(pstring defstr)
+// ----------------------------------------------------------------------------------------
+// Run preparation
+// ----------------------------------------------------------------------------------------
+
+void setup_t::prepare_to_run()
{
- auto p = defstr.find("=");
- if (p != pstring::npos)
- register_define(defstr.left(p), defstr.substr(p+1));
+ register_dynamic_log_devices();
+
+ /* make sure the solver and parameters are started first! */
+
+ for (auto & e : m_device_factory)
+ {
+ if ( factory().is_class<devices::NETLIB_NAME(solver)>(e.second)
+ || factory().is_class<devices::NETLIB_NAME(netlistparams)>(e.second))
+ {
+ m_nlstate.add_dev(e.first, pool_owned_ptr<device_t>(e.second->Create(m_nlstate, e.first)));
+ }
+ }
+
+ log().debug("Searching for solver and parameters ...\n");
+
+ auto solver = m_nlstate.get_single_device<devices::NETLIB_NAME(solver)>("solver");
+ m_netlist_params = m_nlstate.get_single_device<devices::NETLIB_NAME(netlistparams)>("parameter");
+
+ /* create devices */
+
+ log().debug("Creating devices ...\n");
+ for (auto & e : m_device_factory)
+ {
+ if ( !factory().is_class<devices::NETLIB_NAME(solver)>(e.second)
+ && !factory().is_class<devices::NETLIB_NAME(netlistparams)>(e.second))
+ {
+ auto dev = pool_owned_ptr<device_t>(e.second->Create(m_nlstate, e.first));
+ m_nlstate.add_dev(dev->name(), std::move(dev));
+ }
+ }
+
+ log().debug("Looking for unknown parameters ...\n");
+ for (auto &p : m_param_values)
+ {
+ auto f = m_params.find(p.first);
+ if (f == m_params.end())
+ {
+ if (plib::endsWith(p.first, pstring(".HINT_NO_DEACTIVATE")))
+ {
+ // FIXME: get device name, check for device
+ }
+ else
+ log().info("Unknown parameter: {}", p.first);
+ }
+ }
+
+ bool use_deactivate = m_netlist_params->m_use_deactivate() ? true : false;
+
+ for (auto &d : m_nlstate.devices())
+ {
+ if (use_deactivate)
+ {
+ auto p = m_param_values.find(d.second->name() + ".HINT_NO_DEACTIVATE");
+ if (p != m_param_values.end())
+ {
+ //FIXME: check for errors ...
+ auto v = plib::pstonum<double>(p->second);
+ if (std::abs(v - std::floor(v)) > 1e-6 )
+ log().fatal(MF_1_HND_VAL_NOT_SUPPORTED, p->second);
+ d.second->set_hint_deactivate(v == 0.0);
+ }
+ }
+ else
+ d.second->set_hint_deactivate(false);
+ }
+
+ /* resolve inputs */
+ resolve_inputs();
+
+ log().verbose("looking for two terms connected to rail nets ...");
+ for (auto & t : m_nlstate.get_device_list<analog::NETLIB_NAME(twoterm)>())
+ {
+ if (t->m_N.net().isRailNet() && t->m_P.net().isRailNet())
+ {
+ log().warning(MW_3_REMOVE_DEVICE_1_CONNECTED_ONLY_TO_RAILS_2_3,
+ t->name(), t->m_N.net().name(), t->m_P.net().name());
+ t->m_N.net().remove_terminal(t->m_N);
+ t->m_P.net().remove_terminal(t->m_P);
+ m_nlstate.remove_dev(t);
+ }
+ }
+
+ log().verbose("initialize solver ...\n");
+
+ if (solver == nullptr)
+ {
+ for (auto &p : m_nlstate.nets())
+ if (p->is_analog())
+ log().fatal(MF_0_NO_SOLVER);
+ }
else
- register_define(defstr, "1");
+ solver->post_start();
+
+ for (auto &n : m_nlstate.nets())
+ for (auto & term : n->core_terms())
+ {
+ //core_device_t *dev = reinterpret_cast<core_device_t *>(term->m_delegate.object());
+ core_device_t *dev = &term->device();
+ dev->set_default_delegate(*term);
+ }
+
}
// ----------------------------------------------------------------------------------------
// base sources
// ----------------------------------------------------------------------------------------
-bool source_t::parse(const pstring &name)
+bool source_t::parse(nlparse_t &setup, const pstring &name)
{
if (m_type != SOURCE)
return false;
else
{
- auto rstream = stream(name);
- plib::putf8_reader reader(*rstream);
- return m_setup.parse_stream(reader, name);
+ return setup.parse_stream(stream(name), name);
}
}
-std::unique_ptr<plib::pistream> source_string_t::stream(const pstring &name)
+plib::unique_ptr<plib::pistream> source_string_t::stream(const pstring &name)
{
- return plib::make_unique_base<plib::pistream, plib::pimemstream>(m_str.c_str(), m_str.mem_t_size());
+ plib::unused_var(name);
+ return plib::make_unique<plib::pimemstream>(m_str.c_str(), std::strlen(m_str.c_str()));
}
-std::unique_ptr<plib::pistream> source_mem_t::stream(const pstring &name)
+plib::unique_ptr<plib::pistream> source_mem_t::stream(const pstring &name)
{
- return plib::make_unique_base<plib::pistream, plib::pimemstream>(m_str.c_str(), m_str.mem_t_size());
+ plib::unused_var(name);
+ return plib::make_unique<plib::pimemstream>(m_str.c_str(), std::strlen(m_str.c_str()));
}
-std::unique_ptr<plib::pistream> source_file_t::stream(const pstring &name)
+plib::unique_ptr<plib::pistream> source_file_t::stream(const pstring &name)
{
- return plib::make_unique_base<plib::pistream, plib::pifilestream>(m_filename);
+ plib::unused_var(name);
+ return plib::make_unique<plib::pifilestream>(m_filename);
}
-bool source_proc_t::parse(const pstring &name)
+bool source_proc_t::parse(nlparse_t &setup, const pstring &name)
{
if (name == m_setup_func_name)
{
- m_setup_func(setup());
+ m_setup_func(setup);
return true;
}
else
return false;
}
-std::unique_ptr<plib::pistream> source_proc_t::stream(const pstring &name)
+plib::unique_ptr<plib::pistream> source_proc_t::stream(const pstring &name)
{
- std::unique_ptr<plib::pistream> p(nullptr);
+ plib::unused_var(name);
+ plib::unique_ptr<plib::pistream> p(nullptr);
return p;
}
-}
+} // namespace netlist
diff --git a/src/lib/netlist/nl_setup.h b/src/lib/netlist/nl_setup.h
index d0359928711..ed0248a48e6 100644
--- a/src/lib/netlist/nl_setup.h
+++ b/src/lib/netlist/nl_setup.h
@@ -8,18 +8,20 @@
#ifndef NLSETUP_H_
#define NLSETUP_H_
+#include "plib/pparser.h"
+#include "plib/pstream.h"
#include "plib/pstring.h"
#include "plib/putil.h"
-#include "plib/pstream.h"
-#include "plib/pparser.h"
-#include "nl_factory.h"
#include "nl_config.h"
-#include "netlist_types.h"
+#include "nl_factory.h"
+#include "nltypes.h"
+#include <memory>
#include <stack>
+#include <unordered_map>
#include <vector>
-#include <memory>
+
//============================================================
// MACROS / inline netlist definitions
@@ -27,46 +29,46 @@
#define NET_STR(x) # x
-#define NET_MODEL(model) \
+#define NET_MODEL(model) \
setup.register_model(model);
-#define ALIAS(alias, name) \
+#define ALIAS(alias, name) \
setup.register_alias(# alias, # name);
-#define DIPPINS(pin1, ...) \
+#define DIPPINS(pin1, ...) \
setup.register_dippins_arr( # pin1 ", " # __VA_ARGS__);
/* to be used to reference new library truthtable devices */
-#define NET_REGISTER_DEV(type, name) \
+#define NET_REGISTER_DEV(type, name) \
setup.register_dev(# type, # name);
-#define NET_CONNECT(name, input, output) \
+#define NET_CONNECT(name, input, output) \
setup.register_link(# name "." # input, # output);
-#define NET_C(term1, ...) \
+#define NET_C(term1, ...) \
setup.register_link_arr( # term1 ", " # __VA_ARGS__);
-#define PARAM(name, val) \
+#define PARAM(name, val) \
setup.register_param(# name, val);
#define HINT(name, val) \
setup.register_param(# name ".HINT_" # val, 1);
-#define NETDEV_PARAMI(name, param, val) \
+#define NETDEV_PARAMI(name, param, val) \
setup.register_param(# name "." # param, val);
#define NETLIST_NAME(name) netlist ## _ ## name
#define NETLIST_EXTERNAL(name) \
- void NETLIST_NAME(name)(netlist::setup_t &setup);
+ void NETLIST_NAME(name)(netlist::nlparse_t &setup);
#define NETLIST_START(name) \
-void NETLIST_NAME(name)(netlist::setup_t &setup) \
+void NETLIST_NAME(name)(netlist::nlparse_t &setup) \
{
#define NETLIST_END() }
#define LOCAL_SOURCE(name) \
- setup.register_source(plib::make_unique_base<netlist::source_t, netlist::source_proc_t>(setup, # name, &NETLIST_NAME(name)));
+ setup.register_source(plib::make_unique<netlist::source_proc_t>(# name, &NETLIST_NAME(name)));
#define LOCAL_LIB_ENTRY(name) \
LOCAL_SOURCE(name) \
@@ -80,7 +82,7 @@ void NETLIST_NAME(name)(netlist::setup_t &setup) \
NETLIST_NAME(model)(setup); \
setup.namespace_pop();
-#define OPTIMIZE_FRONTIER(attach, r_in, r_out) \
+#define OPTIMIZE_FRONTIER(attach, r_in, r_out) \
setup.register_frontier(# attach, r_in, r_out);
// -----------------------------------------------------------------------------
@@ -98,10 +100,10 @@ void NETLIST_NAME(name)(netlist::setup_t &setup) \
desc.family = "";
#define TT_HEAD(x) \
- desc.desc.push_back(x);
+ desc.desc.emplace_back(x);
#define TT_LINE(x) \
- desc.desc.push_back(x);
+ desc.desc.emplace_back(x);
#define TT_FAMILY(x) \
desc.family = x;
@@ -110,22 +112,23 @@ void NETLIST_NAME(name)(netlist::setup_t &setup) \
setup.tt_factory_create(desc, __FILE__); \
}
-
namespace netlist
{
namespace detail {
class core_terminal_t;
class net_t;
- }
+ } // namespace detail
namespace devices {
class nld_base_proxy;
- }
+ class nld_netlistparams;
+ } // namespace devices
class core_device_t;
class param_t;
class setup_t;
+ class netlist_state_t;
class netlist_t;
class logic_family_desc_t;
class terminal_t;
@@ -136,6 +139,7 @@ namespace netlist
struct tt_desc
{
+ tt_desc() : ni(0), no(0) { }
pstring name;
pstring classname;
unsigned long ni;
@@ -168,138 +172,222 @@ namespace netlist
class source_t
{
public:
+
+ friend class setup_t;
+
enum type_t
{
SOURCE,
DATA
};
- using list_t = std::vector<std::unique_ptr<source_t>>;
+ using list_t = std::vector<plib::unique_ptr<source_t>>;
- source_t(setup_t &setup, const type_t type = SOURCE)
- : m_setup(setup), m_type(type)
+ source_t(const type_t type = SOURCE)
+ : m_type(type)
{}
- virtual ~source_t() { }
+ COPYASSIGNMOVE(source_t, delete)
- virtual bool parse(const pstring &name);
- virtual std::unique_ptr<plib::pistream> stream(const pstring &name) = 0;
+ virtual ~source_t() noexcept = default;
+
+ virtual bool parse(nlparse_t &setup, const pstring &name);
- setup_t &setup() { return m_setup; }
type_t type() const { return m_type; }
+
+ protected:
+ virtual plib::unique_ptr<plib::pistream> stream(const pstring &name) = 0;
+
private:
- setup_t &m_setup;
const type_t m_type;
};
+
// ----------------------------------------------------------------------------------------
- // setup_t
+ // Collection of models
// ----------------------------------------------------------------------------------------
-
- class setup_t : plib::nocopyassignmove
+ class models_t
{
public:
+ void register_model(pstring model_in);
+ /* model / family related */
- using link_t = std::pair<pstring, pstring>;
+ pstring model_value_str(pstring model, pstring entity);
- explicit setup_t(netlist_t &netlist);
- ~setup_t();
+ double model_value(pstring model, pstring entity);
- netlist_t &netlist() { return m_netlist; }
- const netlist_t &netlist() const { return m_netlist; }
+ pstring model_type(pstring model) { return model_value_str(model, "COREMODEL"); }
- pstring build_fqn(const pstring &obj_name) const;
+ private:
+ using model_map_t = std::unordered_map<pstring, pstring>;
- void register_param(const pstring &name, param_t &param);
- pstring get_initial_param_val(const pstring &name, const pstring &def);
- double get_initial_param_val(const pstring &name, const double def);
- int get_initial_param_val(const pstring &name, const int def);
+ void model_parse(const pstring &model, model_map_t &map);
+ pstring model_string(model_map_t &map);
- void register_term(detail::core_terminal_t &obj);
+ std::unordered_map<pstring, pstring> m_models;
+ std::unordered_map<pstring, model_map_t> m_cache;
+ };
- void register_dev(const pstring &classname, const pstring &name);
+ // ----------------------------------------------------------------------------------------
+ // nlparse_t
+ // ----------------------------------------------------------------------------------------
- void register_lib_entry(const pstring &name, const pstring &sourcefile);
+ class nlparse_t
+ {
+ public:
+ using link_t = std::pair<pstring, pstring>;
+
+ nlparse_t(setup_t &netlist, log_type &log);
- void register_model(const pstring &model_in);
+ void register_model(const pstring &model_in) { m_models.register_model(model_in); }
void register_alias(const pstring &alias, const pstring &out);
void register_dippins_arr(const pstring &terms);
-
- void register_alias_nofqn(const pstring &alias, const pstring &out);
-
- void register_link_arr(const pstring &terms);
- void register_link_fqn(const pstring &sin, const pstring &sout);
+ void register_dev(const pstring &classname, const pstring &name);
void register_link(const pstring &sin, const pstring &sout);
-
+ void register_link_arr(const pstring &terms);
void register_param(const pstring &param, const pstring &value);
void register_param(const pstring &param, const double value);
-
+ void register_lib_entry(const pstring &name, const pstring &sourcefile);
void register_frontier(const pstring &attach, const double r_IN, const double r_OUT);
- void remove_connections(const pstring &attach);
-
- bool connect(detail::core_terminal_t &t1, detail::core_terminal_t &t2);
-
- bool device_exists(const pstring &name) const;
-
- param_t *find_param(const pstring &param_in, bool required = true) const;
+ /* register a source */
+ void register_source(plib::unique_ptr<source_t> &&src)
+ {
+ m_sources.push_back(std::move(src));
+ }
- void start_devices();
- void resolve_inputs();
+ void tt_factory_create(tt_desc &desc, const pstring &sourcefile);
/* handle namespace */
void namespace_push(const pstring &aname);
void namespace_pop();
- /* parse a source */
+ /* include other files */
void include(const pstring &netlist_name);
- std::unique_ptr<plib::pistream> get_data_stream(const pstring &name);
+ pstring build_fqn(const pstring &obj_name) const;
+ void register_alias_nofqn(const pstring &alias, const pstring &out);
+
+ /* also called from devices for latebinding connected terminals */
+ void register_link_fqn(const pstring &sin, const pstring &sout);
- bool parse_stream(plib::putf8_reader &istrm, const pstring &name);
+ /* used from netlist.cpp (mame) */
+ bool device_exists(const pstring &name) const;
- /* register a source */
+ /* FIXME: used by source_t - need a different approach at some time */
+ bool parse_stream(plib::unique_ptr<plib::pistream> &&istrm, const pstring &name);
- void register_source(std::unique_ptr<source_t> &&src)
+ void add_define(const pstring &def, const pstring &val)
{
- m_sources.push_back(std::move(src));
+ m_defines.insert({ def, plib::ppreprocessor::define_t(def, val)});
}
- void register_define(pstring def, pstring val) { m_defines.push_back(plib::ppreprocessor::define_t(def, val)); }
- void register_define(pstring defstr);
+ void add_define(const pstring &defstr);
factory::list_t &factory() { return m_factory; }
const factory::list_t &factory() const { return m_factory; }
- /* model / family related */
+ log_type &log() { return m_log; }
+ const log_type &log() const { return m_log; }
+
+ /* FIXME: sources may need access to the netlist parent type
+ * since they may be created in a context in which they don't
+ * have access to their environment.
+ * Example is the MAME memregion source.
+ * We thus need a better approach to creating netlists in a context
+ * other than static procedures.
+ */
+ setup_t &setup() { return m_setup; }
+ const setup_t &setup() const { return m_setup; }
+
+ models_t &models() { return m_models; }
+ const models_t &models() const { return m_models; }
+
+ protected:
+ models_t m_models;
+ std::stack<pstring> m_namespace_stack;
+ std::unordered_map<pstring, pstring> m_alias;
+ std::vector<link_t> m_links;
+ std::unordered_map<pstring, pstring> m_param_values;
+
+ source_t::list_t m_sources;
+
+ factory::list_t m_factory;
+
+ /* need to preserve order of device creation ... */
+ std::vector<std::pair<pstring, factory::element_t *>> m_device_factory;
+
+
+ private:
+ plib::ppreprocessor::defines_map_type m_defines;
+
+ setup_t &m_setup;
+ log_type &m_log;
+ unsigned m_frontier_cnt;
+ };
+
+ // ----------------------------------------------------------------------------------------
+ // setup_t
+ // ----------------------------------------------------------------------------------------
+
+ class setup_t : public nlparse_t
+ {
+ public:
+
+ explicit setup_t(netlist_state_t &nlstate);
+ ~setup_t() noexcept;
+
+ COPYASSIGNMOVE(setup_t, delete)
+
+ netlist_state_t &nlstate() { return m_nlstate; }
+ const netlist_state_t &nlstate() const { return m_nlstate; }
+
+ void register_param_t(const pstring &name, param_t &param);
+
+ pstring get_initial_param_val(const pstring &name, const pstring &def) const;
+
+ void register_term(detail::core_terminal_t &obj);
+
+ void remove_connections(const pstring &attach);
- const pstring model_value_str(detail::model_map_t &map, const pstring &entity);
- double model_value(detail::model_map_t &map, const pstring &entity);
+ bool connect(detail::core_terminal_t &t1, detail::core_terminal_t &t2);
- void model_parse(const pstring &model, detail::model_map_t &map);
+ param_t *find_param(const pstring &param_in, bool required = true) const;
+ /* get family */
const logic_family_desc_t *family_from_model(const pstring &model);
- void tt_factory_create(tt_desc &desc, const pstring &sourcefile);
+ void register_dynamic_log_devices();
+ void resolve_inputs();
+
+ plib::unique_ptr<plib::pistream> get_data_stream(const pstring &name);
+
+ factory::list_t &factory() { return m_factory; }
+ const factory::list_t &factory() const { return m_factory; }
/* helper - also used by nltool */
const pstring resolve_alias(const pstring &name) const;
- plib::plog_base<netlist_t, NL_DEBUG> &log();
- const plib::plog_base<netlist_t, NL_DEBUG> &log() const;
-
- std::vector<std::pair<pstring, factory::element_t *>> m_device_factory;
+ /* needed by nltool */
+ std::vector<pstring> get_terminals_for_device_name(const pstring &devname);
- std::unordered_map<pstring, pstring> m_alias;
- std::unordered_map<pstring, pstring> m_param_values;
- std::unordered_map<pstring, detail::core_terminal_t *> m_terminals;
+ log_type &log();
+ const log_type &log() const;
/* needed by proxy */
detail::core_terminal_t *find_terminal(const pstring &outname_in, const detail::terminal_type atype, bool required = true);
+ /* core net handling */
+
+ void delete_empty_nets();
+
+ /* run preparation */
+
+ void prepare_to_run();
+
private:
detail::core_terminal_t *find_terminal(const pstring &outname_in, bool required = true);
@@ -318,35 +406,30 @@ namespace netlist
devices::nld_base_proxy *get_d_a_proxy(detail::core_terminal_t &out);
devices::nld_base_proxy *get_a_d_proxy(detail::core_terminal_t &inp);
- netlist_t &m_netlist;
- std::unordered_map<pstring, param_ref_t> m_params;
- std::vector<link_t> m_links;
- factory::list_t m_factory;
- std::unordered_map<pstring, pstring> m_models;
+ std::unordered_map<pstring, detail::core_terminal_t *> m_terminals;
- std::stack<pstring> m_namespace_stack;
- source_t::list_t m_sources;
- std::vector<plib::ppreprocessor::define_t> m_defines;
+ netlist_state_t &m_nlstate;
+ devices::nld_netlistparams *m_netlist_params;
+ std::unordered_map<pstring, param_ref_t> m_params;
unsigned m_proxy_cnt;
- unsigned m_frontier_cnt;
-};
+ };
// ----------------------------------------------------------------------------------------
// base sources
// ----------------------------------------------------------------------------------------
-
class source_string_t : public source_t
{
public:
- source_string_t(setup_t &setup, const pstring &source)
- : source_t(setup), m_str(source)
+ source_string_t(const pstring &source)
+ : source_t(), m_str(source)
{
}
- virtual std::unique_ptr<plib::pistream> stream(const pstring &name) override;
+ protected:
+ plib::unique_ptr<plib::pistream> stream(const pstring &name) override;
private:
pstring m_str;
@@ -356,12 +439,13 @@ namespace netlist
{
public:
- source_file_t(setup_t &setup, const pstring &filename)
- : source_t(setup), m_filename(filename)
+ source_file_t(const pstring &filename)
+ : source_t(), m_filename(filename)
{
}
- virtual std::unique_ptr<plib::pistream> stream(const pstring &name) override;
+ protected:
+ plib::unique_ptr<plib::pistream> stream(const pstring &name) override;
private:
pstring m_filename;
@@ -370,12 +454,13 @@ namespace netlist
class source_mem_t : public source_t
{
public:
- source_mem_t(setup_t &setup, const char *mem)
- : source_t(setup), m_str(mem, pstring::UTF8)
+ source_mem_t(const char *mem)
+ : source_t(), m_str(mem)
{
}
- virtual std::unique_ptr<plib::pistream> stream(const pstring &name) override;
+ protected:
+ plib::unique_ptr<plib::pistream> stream(const pstring &name) override;
private:
pstring m_str;
@@ -384,22 +469,28 @@ namespace netlist
class source_proc_t : public source_t
{
public:
- source_proc_t(setup_t &setup, pstring name, void (*setup_func)(setup_t &))
- : source_t(setup),
+ source_proc_t(const pstring &name, void (*setup_func)(nlparse_t &))
+ : source_t(),
m_setup_func(setup_func),
m_setup_func_name(name)
{
}
- virtual bool parse(const pstring &name) override;
- virtual std::unique_ptr<plib::pistream> stream(const pstring &name) override;
+ bool parse(nlparse_t &setup, const pstring &name) override;
+
+ protected:
+ plib::unique_ptr<plib::pistream> stream(const pstring &name) override;
private:
- void (*m_setup_func)(setup_t &);
+ void (*m_setup_func)(nlparse_t &);
pstring m_setup_func_name;
};
-}
+ // -----------------------------------------------------------------------------
+ // inline implementations
+ // -----------------------------------------------------------------------------
+
+} // namespace netlist
#endif /* NLSETUP_H_ */
diff --git a/src/lib/netlist/nl_time.h b/src/lib/netlist/nl_time.h
deleted file mode 100644
index 7c81f890e07..00000000000
--- a/src/lib/netlist/nl_time.h
+++ /dev/null
@@ -1,145 +0,0 @@
-// license:GPL-2.0+
-// copyright-holders:Couriersud
-/*
- * nltime.h
- */
-
-#ifndef NLTIME_H_
-#define NLTIME_H_
-
-#include "nl_config.h"
-#include "plib/ptypes.h"
-#include "plib/pstate.h"
-
-#include <cstdint>
-
-//============================================================
-// MACROS
-//============================================================
-
-#define NLTIME_FROM_NS(t) netlist_time::from_nsec(t)
-#define NLTIME_FROM_US(t) netlist_time::from_usec(t)
-#define NLTIME_FROM_MS(t) netlist_time::from_msec(t)
-#define NLTIME_IMMEDIATE netlist_time::from_nsec(1)
-
-// ----------------------------------------------------------------------------------------
-// netlist_time
-// ----------------------------------------------------------------------------------------
-
-namespace netlist
-{
- template <typename TYPE, TYPE RES>
- struct ptime final
- {
- public:
-
- using internal_type = TYPE;
- using mult_type = std::uint64_t;
-
- constexpr ptime() noexcept : m_time(0) {}
-
- constexpr ptime(const ptime &rhs) noexcept = default;
- constexpr ptime(ptime &&rhs) noexcept = default;
- C14CONSTEXPR ptime &operator=(const ptime &rhs) noexcept = default;
- C14CONSTEXPR ptime &operator=(ptime &&rhs) noexcept = default;
-
- constexpr explicit ptime(const double t) = delete;
- //: m_time((internal_type) ( t * (double) resolution)) { }
- constexpr explicit ptime(const internal_type &nom, const internal_type &den) noexcept
- : m_time(nom * (RES / den)) { }
-
- C14CONSTEXPR ptime &operator+=(const ptime &rhs) noexcept { m_time += rhs.m_time; return *this; }
- C14CONSTEXPR ptime &operator-=(const ptime &rhs) noexcept { m_time -= rhs.m_time; return *this; }
- C14CONSTEXPR ptime &operator*=(const mult_type &factor) noexcept { m_time *= static_cast<internal_type>(factor); return *this; }
-
- friend C14CONSTEXPR ptime operator-(ptime lhs, const ptime &rhs) noexcept
- {
- return lhs -= rhs;
- }
-
- friend C14CONSTEXPR ptime operator+(ptime lhs, const ptime &rhs) noexcept
- {
- return lhs += rhs;
- }
-
- friend C14CONSTEXPR ptime operator*(ptime lhs, const mult_type &factor) noexcept
- {
- return lhs *= factor;
- }
-
- friend constexpr mult_type operator/(const ptime &lhs, const ptime &rhs) noexcept
- {
- return static_cast<mult_type>(lhs.m_time / rhs.m_time);
- }
-
- friend constexpr bool operator<(const ptime &lhs, const ptime &rhs) noexcept
- {
- return (lhs.m_time < rhs.m_time);
- }
-
- friend constexpr bool operator>(const ptime &lhs, const ptime &rhs) noexcept
- {
- return (rhs < lhs);
- }
-
- friend constexpr bool operator<=(const ptime &lhs, const ptime &rhs) noexcept
- {
- return !(lhs > rhs);
- }
-
- friend constexpr bool operator>=(const ptime &lhs, const ptime &rhs) noexcept
- {
- return !(lhs < rhs);
- }
-
- friend constexpr bool operator==(const ptime &lhs, const ptime &rhs) noexcept
- {
- return lhs.m_time == rhs.m_time;
- }
-
- friend constexpr bool operator!=(const ptime &lhs, const ptime &rhs) noexcept
- {
- return !(lhs == rhs);
- }
-
- constexpr internal_type as_raw() const noexcept { return m_time; }
- constexpr double as_double() const noexcept
- {
- return static_cast<double>(m_time) / static_cast<double>(RES);
- }
-
- // for save states ....
- C14CONSTEXPR internal_type *get_internaltype_ptr() noexcept { return &m_time; }
-
- static constexpr ptime from_nsec(const internal_type &ns) noexcept { return ptime(ns, UINT64_C(1000000000)); }
- static constexpr ptime from_usec(const internal_type &us) noexcept { return ptime(us, UINT64_C(1000000)); }
- static constexpr ptime from_msec(const internal_type &ms) noexcept { return ptime(ms, UINT64_C(1000)); }
- static constexpr ptime from_hz(const internal_type &hz) noexcept { return ptime(1 , hz); }
- static constexpr ptime from_raw(const internal_type &raw) noexcept { return ptime(raw); }
- static constexpr ptime from_double(const double t) noexcept { return ptime(static_cast<internal_type>( t * static_cast<double>(RES)), RES); }
-
- static constexpr ptime zero() noexcept { return ptime(0, RES); }
- static constexpr ptime quantum() noexcept { return ptime(1, RES); }
- static constexpr ptime never() noexcept { return ptime(plib::numeric_limits<internal_type>::max(), RES); }
- static constexpr internal_type resolution() noexcept { return RES; }
- private:
- constexpr explicit ptime(const internal_type &time) : m_time(time) {}
- constexpr explicit ptime(internal_type &&time) : m_time(time) {}
- internal_type m_time;
- };
-
-#if (PHAS_INT128)
- using netlist_time = ptime<UINT128, NETLIST_INTERNAL_RES>;
-#else
- using netlist_time = ptime<std::uint64_t, NETLIST_INTERNAL_RES>;
-#endif
-}
-
-namespace plib {
-template<> inline void state_manager_t::save_item(const void *owner, netlist::netlist_time &nlt, const pstring &stname)
-{
- save_state_ptr(owner, stname, datatype_t(sizeof(netlist::netlist_time::internal_type), true, false), 1, nlt.get_internaltype_ptr());
-}
-}
-
-#endif /* NLTIME_H_ */
diff --git a/src/lib/netlist/nltypes.h b/src/lib/netlist/nltypes.h
new file mode 100644
index 00000000000..7d7582774b1
--- /dev/null
+++ b/src/lib/netlist/nltypes.h
@@ -0,0 +1,147 @@
+// license:GPL-2.0+
+// copyright-holders:Couriersud
+/*!
+ *
+ * \file nltypes.h
+ *
+ */
+
+/* \note never change the name to nl_types.h. This creates a conflict
+ * with nl_types.h file provided by libc++ (clang, macosx)
+ */
+
+#ifndef NLTYPES_H_
+#define NLTYPES_H_
+
+#include "nl_config.h"
+#include "plib/pchrono.h"
+#include "plib/pfmtlog.h"
+#include "plib/pmempool.h"
+#include "plib/pstate.h"
+#include "plib/pstring.h"
+#include "plib/ptime.h"
+#include "plib/putil.h"
+
+#include <cstdint>
+#include <unordered_map>
+
+namespace netlist
+{
+ /*! @brief plib::constants struct specialized for nl_double
+ *
+ * This may be any of bool, uint8_t, uint16_t, uin32_t and uint64_t.
+ * The choice has little to no impact on performance.
+ */
+ using constants = plib::constants<nl_double>;
+
+ /*! @brief netlist_sig_t is the type used for logic signals.
+ *
+ * This may be any of bool, uint8_t, uint16_t, uin32_t and uint64_t.
+ * The choice has little to no impact on performance.
+ */
+ using netlist_sig_t = std::uint32_t;
+
+ /* FIXME: belongs into nl_base.h to nlstate */
+ /**
+ * @brief Interface definition for netlist callbacks into calling code
+ *
+ * A class inheriting from netlist_callbacks_t has to be passed to the netlist_t
+ * constructor. Netlist does processing during construction and thus needs
+ * the object passed completely constructed.
+ *
+ */
+ class callbacks_t
+ {
+ public:
+
+ callbacks_t() = default;
+ /* what is done before this is passed as a unique_ptr to netlist
+ * we should not limit.
+ */
+ virtual ~callbacks_t() = default;
+ COPYASSIGNMOVE(callbacks_t, default)
+
+ /* logging callback */
+ virtual void vlog(const plib::plog_level &l, const pstring &ls) const = 0;
+
+ };
+
+ using log_type = plib::plog_base<callbacks_t, NL_DEBUG>;
+
+
+ //============================================================
+ // Performance tracking
+ //============================================================
+
+ template<bool enabled_>
+ using nperftime_t = plib::chrono::timer<plib::chrono::exact_ticks, enabled_>;
+
+ template<bool enabled_>
+ using nperfcount_t = plib::chrono::counter<enabled_>;
+
+ //============================================================
+ // Types needed by various includes
+ //============================================================
+
+ /*! The memory pool for netlist objects
+ *
+ * \note This is not the right location yet.
+ *
+ */
+
+#if (USE_MEMPOOL)
+ using nlmempool = plib::mempool;
+#else
+ using nlmempool = plib::aligned_arena;
+#endif
+
+ /*! Owned pointer type for pooled allocations.
+ *
+ */
+ template <typename T>
+ using pool_owned_ptr = nlmempool::owned_pool_ptr<T>;
+
+ inline nlmempool &pool()
+ {
+ static nlmempool static_pool;
+ return static_pool;
+ }
+
+ namespace detail {
+
+ /*! Enum specifying the type of object */
+ enum terminal_type {
+ TERMINAL = 0, /*!< object is an analog terminal */
+ INPUT = 1, /*!< object is an input */
+ OUTPUT = 2, /*!< object is an output */
+ };
+
+ } // namespace detail
+
+#if (PHAS_INT128)
+ using netlist_time = ptime<INT128, NETLIST_INTERNAL_RES>;
+#else
+ using netlist_time = plib::ptime<std::int64_t, NETLIST_INTERNAL_RES>;
+ static_assert(noexcept(netlist_time::from_nsec(1)) == true, "Not evaluated as constexpr");
+#endif
+
+ //============================================================
+ // MACROS
+ //============================================================
+
+ template <typename T> inline constexpr const netlist_time NLTIME_FROM_NS(T &&t) noexcept { return netlist_time::from_nsec(t); }
+ template <typename T> inline constexpr const netlist_time NLTIME_FROM_US(T &&t) noexcept { return netlist_time::from_usec(t); }
+ template <typename T> inline constexpr const netlist_time NLTIME_FROM_MS(T &&t) noexcept { return netlist_time::from_msec(t); }
+
+} // namespace netlist
+
+namespace plib {
+
+ template<>
+ inline void state_manager_t::save_item(const void *owner, netlist::netlist_time &nlt, const pstring &stname)
+ {
+ save_state_ptr(owner, stname, datatype_t(sizeof(netlist::netlist_time::internal_type), true, false), 1, nlt.get_internaltype_ptr());
+ }
+} // namespace plib
+
+#endif /* NLTYPES_H_ */
diff --git a/src/lib/netlist/plib/gmres.h b/src/lib/netlist/plib/gmres.h
new file mode 100644
index 00000000000..2c357e97624
--- /dev/null
+++ b/src/lib/netlist/plib/gmres.h
@@ -0,0 +1,450 @@
+// license:GPL-2.0+
+// copyright-holders:Couriersud
+/*
+ * gmres.h
+ *
+ */
+
+#ifndef PLIB_GMRES_H_
+#define PLIB_GMRES_H_
+
+#include "mat_cr.h"
+#include "parray.h"
+#include "pconfig.h"
+#include "vector_ops.h"
+
+#include <algorithm>
+#include <cmath>
+
+
+namespace plib
+{
+
+ template <typename FT, int SIZE>
+ struct mat_precondition_ILU
+ {
+ using mat_type = plib::matrix_compressed_rows_t<FT, SIZE>;
+
+ mat_precondition_ILU(std::size_t size, int ilu_scale = 4
+ , std::size_t bw = plib::matrix_compressed_rows_t<FT, SIZE>::FILL_INFINITY)
+ : m_mat(static_cast<typename mat_type::index_type>(size))
+ , m_LU(static_cast<typename mat_type::index_type>(size))
+ , m_use_iLU_preconditioning(ilu_scale >= 0)
+ , m_ILU_scale(static_cast<std::size_t>(ilu_scale))
+ , m_band_width(bw)
+ {
+ }
+
+ template <typename M>
+ void build(M &fill)
+ {
+ m_mat.build_from_fill_mat(fill, 0);
+ if (m_use_iLU_preconditioning)
+ {
+ m_LU.gaussian_extend_fill_mat(fill);
+ m_LU.build_from_fill_mat(fill, m_ILU_scale, m_band_width); // ILU(2)
+ //m_LU.build_from_fill_mat(fill, 9999, 20); // Band matrix width 20
+ }
+ }
+
+
+ template<typename R, typename V>
+ void calc_rhs(R &rhs, const V &v)
+ {
+ m_mat.mult_vec(rhs, v);
+ }
+
+ void precondition()
+ {
+ if (m_use_iLU_preconditioning)
+ {
+ if (m_ILU_scale < 1)
+ m_LU.raw_copy_from(m_mat);
+ else
+ m_LU.reduction_copy_from(m_mat);
+ m_LU.incomplete_LU_factorization();
+ }
+ }
+
+ template<typename V>
+ void solve_LU_inplace(V &v)
+ {
+ if (m_use_iLU_preconditioning)
+ {
+ m_LU.solveLUx(v);
+ }
+ }
+
+ PALIGNAS_VECTOROPT()
+ mat_type m_mat;
+ PALIGNAS_VECTOROPT()
+ mat_type m_LU;
+ bool m_use_iLU_preconditioning;
+ std::size_t m_ILU_scale;
+ std::size_t m_band_width;
+ };
+
+ template <typename FT, int SIZE>
+ struct mat_precondition_diag
+ {
+ mat_precondition_diag(std::size_t size)
+ : m_mat(size)
+ , m_diag(size)
+ , m_use_iLU_preconditioning(true)
+ {
+ }
+
+ template <typename M>
+ void build(M &fill)
+ {
+ m_mat.build_from_fill_mat(fill, 0);
+ }
+
+ template<typename R, typename V>
+ void calc_rhs(R &rhs, const V &v)
+ {
+ m_mat.mult_vec(rhs, v);
+ }
+
+ void precondition()
+ {
+ if (m_use_iLU_preconditioning)
+ {
+ for (std::size_t i = 0; i< m_diag.size(); i++)
+ {
+ m_diag[i] = 1.0 / m_mat.A[m_mat.diag[i]];
+ }
+ }
+ }
+
+ template<typename V>
+ void solve_LU_inplace(V &v)
+ {
+ if (m_use_iLU_preconditioning)
+ {
+ for (std::size_t i = 0; i< m_diag.size(); i++)
+ v[i] = v[i] * m_diag[i];
+ }
+ }
+
+ plib::matrix_compressed_rows_t<FT, SIZE> m_mat;
+ plib::parray<FT, SIZE> m_diag;
+ bool m_use_iLU_preconditioning;
+ };
+
+ /* FIXME: hardcoding RESTART to 20 becomes an issue on very large
+ * systems.
+ */
+ template <typename FT, int SIZE, int RESTART = 20>
+ struct gmres_t
+ {
+ public:
+
+ using float_type = FT;
+ // FIXME: dirty hack to make this compile
+ static constexpr const std::size_t storage_N = plib::sizeabs<FT, SIZE>::ABS();
+
+ gmres_t(std::size_t size)
+ : residual(size)
+ , Ax(size)
+ , m_size(size)
+ , m_use_more_precise_stop_condition(false)
+ {
+ }
+
+ void givens_mult( const FT c, const FT s, FT & g0, FT & g1 )
+ {
+ const FT g0_last(g0);
+
+ g0 = c * g0 - s * g1;
+ g1 = s * g0_last + c * g1;
+ }
+
+ std::size_t size() const { return (SIZE<=0) ? m_size : static_cast<std::size_t>(SIZE); }
+
+ template <typename OPS, typename VT, typename VRHS>
+ std::size_t solve(OPS &ops, VT &x, const VRHS & rhs, const std::size_t itr_max, float_type accuracy)
+ {
+ /*-------------------------------------------------------------------------
+ * The code below was inspired by code published by John Burkardt under
+ * the LPGL here:
+ *
+ * http://people.sc.fsu.edu/~jburkardt/cpp_src/mgmres/mgmres.html
+ *
+ * The code below was completely written from scratch based on the pseudo code
+ * found here:
+ *
+ * http://de.wikipedia.org/wiki/GMRES-Verfahren
+ *
+ * The Algorithm itself is described in
+ *
+ * Yousef Saad,
+ * Iterative Methods for Sparse Linear Systems,
+ * Second Edition,
+ * SIAM, 20003,
+ * ISBN: 0898715342,
+ * LC: QA188.S17.
+ *
+ *------------------------------------------------------------------------*/
+
+ std::size_t itr_used = 0;
+ double rho_delta = 0.0;
+
+ const std::size_t n = size();
+
+ ops.precondition();
+
+ if (m_use_more_precise_stop_condition)
+ {
+ /* derive residual for a given delta x
+ *
+ * LU y = A dx
+ *
+ * ==> rho / accuracy = sqrt(y * y)
+ *
+ * This approach will approximate the iterative stop condition
+ * based |xnew - xold| pretty precisely. But it is slow, or expressed
+ * differently: The invest doesn't pay off.
+ */
+
+ vec_set_scalar(n, residual, accuracy);
+ ops.calc_rhs(Ax, residual);
+
+ ops.solve_LU_inplace(Ax);
+
+ const float_type rho_to_accuracy = std::sqrt(vec_mult2<FT>(n, Ax)) / accuracy;
+
+ rho_delta = accuracy * rho_to_accuracy;
+ }
+ else
+ rho_delta = accuracy * std::sqrt(static_cast<FT>(n));
+
+ /*
+ * Using
+ *
+ * vec_set(n, x, rhs);
+ * ops.solve_LU_inplace(x);
+ *
+ * to get a starting point for x degrades convergence speed compared
+ * to using the last solution for x.
+ *
+ * LU x = b; solve for x;
+ *
+ */
+
+ while (itr_used < itr_max)
+ {
+ std::size_t last_k = RESTART;
+ float_type rho;
+
+ ops.calc_rhs(Ax, x);
+
+ vec_sub(n, residual, rhs, Ax);
+
+ ops.solve_LU_inplace(residual);
+
+ rho = std::sqrt(vec_mult2<FT>(n, residual));
+
+ if (rho < rho_delta)
+ return itr_used + 1;
+
+ /* FIXME: The "+" is necessary to avoid link issues
+ * on some systems / compiler versions. Issue reported by
+ * AJR, no details known yet.
+ */
+ vec_set_scalar(RESTART+1, m_g, +constants<FT>::zero());
+ m_g[0] = rho;
+
+ //for (std::size_t i = 0; i < mr + 1; i++)
+ // vec_set_scalar(mr, m_ht[i], NL_FCONST(0.0));
+
+ vec_mult_scalar(n, m_v[0], residual, constants<FT>::one() / rho);
+
+ for (std::size_t k = 0; k < RESTART; k++)
+ {
+ const std::size_t kp1 = k + 1;
+
+ ops.calc_rhs(m_v[kp1], m_v[k]);
+ ops.solve_LU_inplace(m_v[kp1]);
+
+ for (std::size_t j = 0; j <= k; j++)
+ {
+ m_ht[j][k] = vec_mult<FT>(n, m_v[kp1], m_v[j]);
+ vec_add_mult_scalar(n, m_v[kp1], m_v[j], -m_ht[j][k]);
+ }
+ m_ht[kp1][k] = std::sqrt(vec_mult2<FT>(n, m_v[kp1]));
+
+ if (m_ht[kp1][k] != 0.0)
+ vec_scale(n, m_v[kp1], constants<FT>::one() / m_ht[kp1][k]);
+
+ for (std::size_t j = 0; j < k; j++)
+ givens_mult(m_c[j], m_s[j], m_ht[j][k], m_ht[j+1][k]);
+
+ const float_type mu = 1.0 / std::hypot(m_ht[k][k], m_ht[kp1][k]);
+
+ m_c[k] = m_ht[k][k] * mu;
+ m_s[k] = -m_ht[kp1][k] * mu;
+ m_ht[k][k] = m_c[k] * m_ht[k][k] - m_s[k] * m_ht[kp1][k];
+ m_ht[kp1][k] = 0.0;
+
+ givens_mult(m_c[k], m_s[k], m_g[k], m_g[kp1]);
+
+ rho = std::abs(m_g[kp1]);
+
+ itr_used = itr_used + 1;
+
+ if (rho <= rho_delta)
+ {
+ last_k = k;
+ break;
+ }
+ }
+
+ if (last_k >= RESTART)
+ /* didn't converge within accuracy */
+ last_k = RESTART - 1;
+
+ /* Solve the system H * y = g */
+ /* x += m_v[j] * m_y[j] */
+ for (std::size_t i = last_k + 1; i-- > 0;)
+ {
+ double tmp = m_g[i];
+ for (std::size_t j = i + 1; j <= last_k; j++)
+ tmp -= m_ht[i][j] * m_y[j];
+ m_y[i] = tmp / m_ht[i][i];
+ }
+
+ for (std::size_t i = 0; i <= last_k; i++)
+ vec_add_mult_scalar(n, x, m_v[i], m_y[i]);
+
+ if (rho <= rho_delta)
+ break;
+
+ }
+ return itr_used;
+ }
+
+ private:
+
+ //typedef typename plib::mat_cr_t<FT, SIZE>::index_type mattype;
+
+ plib::parray<float_type, SIZE> residual;
+ plib::parray<float_type, SIZE> Ax;
+
+ plib::parray<float_type, RESTART + 1> m_c; /* mr + 1 */
+ plib::parray<float_type, RESTART + 1> m_g; /* mr + 1 */
+ plib::parray<plib::parray<float_type, RESTART>, RESTART + 1> m_ht; /* (mr + 1), mr */
+ plib::parray<float_type, RESTART + 1> m_s; /* mr + 1 */
+ plib::parray<float_type, RESTART + 1> m_y; /* mr + 1 */
+
+ //plib::parray<float_type, SIZE> m_v[RESTART + 1]; /* mr + 1, n */
+ plib::parray<plib::parray<float_type, storage_N>, RESTART + 1> m_v; /* mr + 1, n */
+
+ std::size_t m_size;
+
+ bool m_use_more_precise_stop_condition;
+
+
+ };
+
+
+#if 0
+ /* Example of a Chebyshev iteration solver. This one doesn't work yet,
+ * it needs to be extended for non-symmetric matrix operation and
+ * depends on spectral radius estimates - which we don't have.
+ *
+ * Left here as another example.
+ */
+
+ template <typename FT, int SIZE>
+ struct ch_t
+ {
+ public:
+
+ typedef FT float_type;
+ // FIXME: dirty hack to make this compile
+ static constexpr const std::size_t storage_N = plib::sizeabs<FT, SIZE>::ABS();
+
+ // Maximum iterations before a restart ...
+ static constexpr const std::size_t restart_N = (storage_N > 0 ? 20 : 0);
+
+ ch_t(std::size_t size)
+ : residual(size)
+ , Ax(size)
+ , m_size(size)
+ {
+ }
+
+ std::size_t size() const { return (SIZE<=0) ? m_size : static_cast<std::size_t>(SIZE); }
+
+ template <typename OPS, typename VT, typename VRHS>
+ std::size_t solve(OPS &ops, VT &x0, const VRHS & rhs, const std::size_t iter_max, float_type accuracy)
+ {
+ /*-------------------------------------------------------------------------
+ *
+ *
+ *------------------------------------------------------------------------*/
+
+ ops.precondition();
+
+ const FT lmax = 20.0;
+ const FT lmin = 0.0001;
+
+ const FT d = (lmax+lmin)/2.0;
+ const FT c = (lmax-lmin)/2.0;
+ FT alpha = 0;
+ FT beta = 0;
+ std::size_t itr_used = 0;
+
+ plib::parray<FT, SIZE> x(size());
+ plib::parray<FT, SIZE> p(size());
+
+ plib::vec_set(size(), x, x0);
+
+ ops.calc_rhs(Ax, x);
+ vec_sub(size(), rhs, Ax, residual);
+
+ FT rho_delta = accuracy * std::sqrt(static_cast<FT>(size()));
+
+ rho_delta = 1e-9;
+
+ for (int i = 0; i < iter_max; i++)
+ {
+ ops.solve_LU_inplace(residual);
+ if (i==0)
+ {
+ vec_set(size(), p, residual);
+ alpha = 2.0 / d;
+ }
+ else
+ {
+ beta = alpha * ( c / 2.0)*( c / 2.0);
+ alpha = 1.0 / (d - beta);
+ for (std::size_t k = 0; k < size(); k++)
+ p[k] = residual[k] + beta * p[k];
+ }
+ plib::vec_add_mult_scalar(size(), p, alpha, x);
+ ops.calc_rhs(Ax, x);
+ plib::vec_sub(size(), rhs, Ax, residual);
+ FT rho = std::sqrt(plib::vec_mult2<FT>(size(), residual));
+ if (rho < rho_delta)
+ break;
+ itr_used++;
+ }
+ return itr_used;
+ }
+ private:
+
+ //typedef typename plib::mat_cr_t<FT, SIZE>::index_type mattype;
+
+ plib::parray<float_type, SIZE> residual;
+ plib::parray<float_type, SIZE> Ax;
+
+ std::size_t m_size;
+
+ };
+#endif
+
+} // namespace plib
+
+#endif /* PLIB_GMRES_H_ */
diff --git a/src/lib/netlist/plib/mat_cr.h b/src/lib/netlist/plib/mat_cr.h
new file mode 100644
index 00000000000..4cc027f0d8f
--- /dev/null
+++ b/src/lib/netlist/plib/mat_cr.h
@@ -0,0 +1,530 @@
+// license:GPL-2.0+
+// copyright-holders:Couriersud
+/*
+ * mat_cr.h
+ *
+ * Compressed row format matrices
+ *
+ */
+
+#ifndef MAT_CR_H_
+#define MAT_CR_H_
+
+#include "palloc.h"
+#include "parray.h"
+#include "pconfig.h"
+#include "pomp.h"
+#include "pstate.h"
+#include "ptypes.h"
+#include "putil.h"
+
+#include <algorithm>
+#include <array>
+#include <cmath>
+#include <cstdlib>
+#include <type_traits>
+#include <vector>
+
+namespace plib
+{
+
+ // FIXME: causes a crash with GMRES handler
+ // template<typename T, int N, typename C = std::size_t>
+
+ template<typename T, int N, typename C = uint16_t>
+ struct matrix_compressed_rows_t
+ {
+ using index_type = C;
+ using value_type = T;
+
+ COPYASSIGNMOVE(matrix_compressed_rows_t, default)
+
+ enum constants_e
+ {
+ FILL_INFINITY = 9999999
+ };
+
+ parray<index_type, N> diag; // diagonal index pointer n
+ parray<index_type, (N == 0) ? 0 : (N < 0 ? N - 1 : N + 1)> row_idx; // row index pointer n + 1
+ parray<index_type, N < 0 ? -N * N : N *N> col_idx; // column index array nz_num, initially (n * n)
+ parray<value_type, N < 0 ? -N * N : N *N> A; // Matrix elements nz_num, initially (n * n)
+ //parray<C, N < 0 ? -N * (N-1) / 2 : N * (N+1) / 2 > nzbd; // Support for gaussian elimination
+ parray<std::vector<index_type>, N > nzbd; // Support for gaussian elimination
+ // contains elimination rows below the diagonal
+ // FIXME: convert to pvector
+ std::vector<std::vector<index_type>> m_ge_par;
+
+ index_type nz_num;
+
+ explicit matrix_compressed_rows_t(const index_type n)
+ : diag(n)
+ , row_idx(n+1)
+ , col_idx(n*n)
+ , A(n*n)
+ //, nzbd(n * (n+1) / 2)
+ , nzbd(n)
+ , nz_num(0)
+ , m_size(n)
+ {
+ for (index_type i=0; i<n+1; i++)
+ row_idx[i] = 0;
+ }
+
+ ~matrix_compressed_rows_t() = default;
+
+ constexpr index_type size() const { return static_cast<index_type>((N>0) ? N : m_size); }
+
+ void clear()
+ {
+ nz_num = 0;
+ for (index_type i=0; i < size() + 1; i++)
+ row_idx[i] = 0;
+ }
+
+ void set_scalar(const T scalar)
+ {
+ for (index_type i=0, e=nz_num; i<e; i++)
+ A[i] = scalar;
+ }
+
+ void set(C r, C c, T val)
+ {
+ C ri = row_idx[r];
+ while (ri < row_idx[r+1] && col_idx[ri] < c)
+ ri++;
+ // we have the position now;
+ if (ri < row_idx[r+1] && col_idx[ri] == c)
+ A[ri] = val;
+ else
+ {
+ for (C i = nz_num; i>ri; i--)
+ {
+ A[i] = A[i-1];
+ col_idx[i] = col_idx[i-1];
+ }
+ A[ri] = val;
+ col_idx[ri] = c;
+ for (C i = r + 1; i < size() + 1; i++)
+ row_idx[i]++;
+ nz_num++;
+ if (c==r)
+ diag[r] = ri;
+ }
+ }
+
+ template <typename M>
+ std::pair<std::size_t, std::size_t> gaussian_extend_fill_mat(M &fill)
+ {
+ std::size_t ops = 0;
+ std::size_t fill_max = 0;
+
+ for (std::size_t k = 0; k < fill.size(); k++)
+ {
+ ops++; // 1/A(k,k)
+ for (std::size_t row = k + 1; row < fill.size(); row++)
+ {
+ if (fill[row][k] < FILL_INFINITY)
+ {
+ ops++;
+ for (std::size_t col = k + 1; col < fill[row].size(); col++)
+ //if (fill[k][col] < FILL_INFINITY)
+ {
+ auto f = std::min(fill[row][col], 1 + fill[row][k] + fill[k][col]);
+ if (f < FILL_INFINITY)
+ {
+ if (f > fill_max)
+ fill_max = f;
+ ops += 2;
+ }
+ fill[row][col] = f;
+ }
+ }
+ }
+ }
+ build_parallel_gaussian_execution_scheme(fill);
+ return { fill_max, ops };
+ }
+
+ template <typename M>
+ void build_from_fill_mat(const M &f, std::size_t max_fill = FILL_INFINITY - 1,
+ std::size_t band_width = FILL_INFINITY)
+ {
+ C nz = 0;
+ if (nz_num != 0)
+ throw pexception("build_from_mat only allowed on empty CR matrix");
+ for (std::size_t k=0; k < size(); k++)
+ {
+ row_idx[k] = nz;
+
+ for (std::size_t j=0; j < size(); j++)
+ if (f[k][j] <= max_fill && std::abs(static_cast<int>(k)-static_cast<int>(j)) <= static_cast<int>(band_width))
+ {
+ col_idx[nz] = static_cast<C>(j);
+ if (j == k)
+ diag[k] = nz;
+ nz++;
+ }
+ }
+
+ row_idx[size()] = nz;
+ nz_num = nz;
+ /* build nzbd */
+
+ for (std::size_t k=0; k < size(); k++)
+ {
+ for (std::size_t j=k + 1; j < size(); j++)
+ if (f[j][k] < FILL_INFINITY)
+ nzbd[k].push_back(static_cast<C>(j));
+ nzbd[k].push_back(0); // end of sequence
+ }
+ }
+
+ template <typename V>
+ void gaussian_elimination(V & RHS)
+ {
+ const std::size_t iN = size();
+
+ for (std::size_t i = 0; i < iN - 1; i++)
+ {
+ std::size_t nzbdp = 0;
+ std::size_t pi = diag[i];
+ const value_type f = 1.0 / A[pi++];
+ const std::size_t piie = row_idx[i+1];
+ const auto &nz = nzbd[i];
+
+ while (auto j = nz[nzbdp++])
+ {
+ // proceed to column i
+
+ std::size_t pj = row_idx[j];
+
+ while (col_idx[pj] < i)
+ pj++;
+
+ const value_type f1 = - A[pj++] * f;
+
+ // subtract row i from j
+ // fill-in available assumed, i.e. matrix was prepared
+
+ for (std::size_t pii = pi; pii<piie; pii++)
+ {
+ while (col_idx[pj] < col_idx[pii])
+ pj++;
+ if (col_idx[pj] == col_idx[pii])
+ A[pj++] += A[pii] * f1;
+ }
+
+ RHS[j] += f1 * RHS[i];
+ }
+ }
+ }
+
+ template <typename V>
+ void gaussian_elimination_parallel(V & RHS)
+ {
+ // FIXME: move into solver creation ...
+ plib::omp::set_num_threads(4);
+ for (auto l = 0ul; l < m_ge_par.size(); l++)
+ plib::omp::for_static(0ul, m_ge_par[l].size(), [this, &RHS, &l] (unsigned ll)
+ {
+ auto &i = m_ge_par[l][ll];
+ {
+ std::size_t nzbdp = 0;
+ std::size_t pi = diag[i];
+ const value_type f = 1.0 / A[pi++];
+ const std::size_t piie = row_idx[i+1];
+
+ while (auto j = nzbd[i][nzbdp++])
+ {
+ // proceed to column i
+
+ std::size_t pj = row_idx[j];
+
+ while (col_idx[pj] < i)
+ pj++;
+
+ const value_type f1 = - A[pj++] * f;
+
+ // subtract row i from j
+ // fill-in available assumed, i.e. matrix was prepared
+ for (std::size_t pii = pi; pii<piie; pii++)
+ {
+ while (col_idx[pj] < col_idx[pii])
+ pj++;
+ if (col_idx[pj] == col_idx[pii])
+ A[pj++] += A[pii] * f1;
+ }
+ RHS[j] += f1 * RHS[i];
+ }
+ }
+ });
+ }
+
+ template <typename V1, typename V2>
+ void gaussian_back_substitution(V1 &V, const V2 &RHS)
+ {
+ const std::size_t iN = size();
+ /* row n-1 */
+ V[iN - 1] = RHS[iN - 1] / A[diag[iN - 1]];
+
+ for (std::size_t j = iN - 1; j-- > 0;)
+ {
+ value_type tmp = 0;
+ const auto jdiag = diag[j];
+ const std::size_t e = row_idx[j+1];
+ for (std::size_t pk = jdiag + 1; pk < e; pk++)
+ tmp += A[pk] * V[col_idx[pk]];
+ V[j] = (RHS[j] - tmp) / A[jdiag];
+ }
+ }
+
+ template <typename V1>
+ void gaussian_back_substitution(V1 &V)
+ {
+ const std::size_t iN = size();
+ /* row n-1 */
+ V[iN - 1] = V[iN - 1] / A[diag[iN - 1]];
+
+ for (std::size_t j = iN - 1; j-- > 0;)
+ {
+ value_type tmp = 0;
+ const auto jdiag = diag[j];
+ const std::size_t e = row_idx[j+1];
+ for (std::size_t pk = jdiag + 1; pk < e; pk++)
+ tmp += A[pk] * V[col_idx[pk]];
+ V[j] = (V[j] - tmp) / A[jdiag];
+ }
+ }
+
+
+ template <typename VTV, typename VTR>
+ void mult_vec(VTR & res, const VTV & x)
+ {
+ /*
+ * res = A * x
+ */
+
+ std::size_t row = 0;
+ std::size_t k = 0;
+ const std::size_t oe = nz_num;
+
+ while (k < oe)
+ {
+ T tmp = 0.0;
+ const std::size_t e = row_idx[row+1];
+ for (; k < e; k++)
+ tmp += A[k] * x[col_idx[k]];
+ res[row++] = tmp;
+ }
+ }
+
+ /* throws error if P(source)>P(destination) */
+ template <typename LUMAT>
+ void slim_copy_from(LUMAT & src)
+ {
+ for (std::size_t r=0; r<src.size(); r++)
+ {
+ C dp = row_idx[r];
+ for (C sp = src.row_idx[r]; sp < src.row_idx[r+1]; sp++)
+ {
+ /* advance dp to source column and fill 0s if necessary */
+ while (col_idx[dp] < src.col_idx[sp])
+ A[dp++] = 0;
+ if (row_idx[r+1] <= dp || col_idx[dp] != src.col_idx[sp])
+ throw plib::pexception("slim_copy_from error");
+ A[dp++] = src.A[sp];
+ }
+ /* fill remaining elements in row */
+ while (dp < row_idx[r+1])
+ A[dp++] = 0;
+ }
+ }
+
+ /* only copies common elements */
+ template <typename LUMAT>
+ void reduction_copy_from(LUMAT & src)
+ {
+ C sp = 0;
+ for (std::size_t r=0; r<src.size(); r++)
+ {
+ C dp = row_idx[r];
+ while(sp < src.row_idx[r+1])
+ {
+ /* advance dp to source column and fill 0s if necessary */
+ if (col_idx[dp] < src.col_idx[sp])
+ A[dp++] = 0;
+ else if (col_idx[dp] == src.col_idx[sp])
+ A[dp++] = src.A[sp++];
+ else
+ sp++;
+ }
+ /* fill remaining elements in row */
+ while (dp < row_idx[r+1])
+ A[dp++] = 0;
+ }
+ }
+
+ /* checks at all - may crash */
+ template <typename LUMAT>
+ void raw_copy_from(LUMAT & src)
+ {
+ for (std::size_t k = 0; k < nz_num; k++)
+ A[k] = src.A[k];
+ }
+
+ void incomplete_LU_factorization()
+ {
+ /*
+ * incomplete LU Factorization according to http://de.wikipedia.org/wiki/ILU-Zerlegung
+ *
+ * Result is stored in matrix LU
+ *
+ * For i = 1,...,N-1
+ * For k = 0, ... , i - 1
+ * If a[i,k] != 0
+ * a[i,k] = a[i,k] / a[k,k]
+ * For j = k + 1, ... , N - 1
+ * If a[i,j] != 0
+ * a[i,j] = a[i,j] - a[i,k] * a[k,j]
+ * j=j+1
+ * k=k+1
+ * i=i+1
+ *
+ */
+
+ for (std::size_t i = 1; i < size(); i++) // row i
+ {
+ const std::size_t p_i_end = row_idx[i + 1];
+ // loop over all columns k left of diag in row i
+ for (std::size_t i_k = row_idx[i]; i_k < diag[i]; i_k++)
+ {
+ const std::size_t k = col_idx[i_k];
+ const std::size_t p_k_end = row_idx[k + 1];
+ const T LUp_i_k = A[i_k] = A[i_k] / A[diag[k]];
+
+ std::size_t k_j = diag[k] + 1;
+ std::size_t i_j = i_k + 1;
+
+ while (i_j < p_i_end && k_j < p_k_end ) // pj = (i, j)
+ {
+ // we can assume that within a row ja increases continuously */
+ const std::size_t c_i_j = col_idx[i_j]; // row i, column j
+ const std::size_t c_k_j = col_idx[k_j]; // row i, column j
+ if (c_k_j < c_i_j)
+ k_j++;
+ else if (c_k_j == c_i_j)
+ A[i_j++] -= LUp_i_k * A[k_j++];
+ else
+ i_j++;
+ }
+ }
+ }
+ }
+
+ template <typename R>
+ void solveLUx (R &r)
+ {
+ /*
+ * Solve a linear equation Ax = r
+ * where
+ * A = L*U
+ *
+ * L unit lower triangular
+ * U upper triangular
+ *
+ * ==> LUx = r
+ *
+ * ==> Ux = L⁻¹ r = w
+ *
+ * ==> r = Lw
+ *
+ * This can be solved for w using backwards elimination in L.
+ *
+ * Now Ux = w
+ *
+ * This can be solved for x using backwards elimination in U.
+ *
+ */
+ for (std::size_t i = 1; i < size(); ++i )
+ {
+ T tmp = 0.0;
+ const std::size_t j1 = row_idx[i];
+ const std::size_t j2 = diag[i];
+
+ for (std::size_t j = j1; j < j2; ++j )
+ tmp += A[j] * r[col_idx[j]];
+ r[i] -= tmp;
+ }
+ // i now is equal to n;
+ for (std::size_t i = size(); i-- > 0; )
+ {
+ T tmp = 0.0;
+ const std::size_t di = diag[i];
+ const std::size_t j2 = row_idx[i+1];
+ for (std::size_t j = di + 1; j < j2; j++ )
+ tmp += A[j] * r[col_idx[j]];
+ r[i] = (r[i] - tmp) / A[di];
+ }
+ }
+ private:
+ template <typename M>
+ void build_parallel_gaussian_execution_scheme(const M &fill)
+ {
+ // calculate parallel scheme for gaussian elimination
+ std::vector<std::vector<index_type>> rt(size());
+ for (index_type k = 0; k < size(); k++)
+ {
+ for (index_type j = k+1; j < size(); j++)
+ {
+ if (fill[j][k] < FILL_INFINITY)
+ {
+ rt[k].push_back(j);
+ }
+ }
+ }
+
+ std::vector<index_type> levGE(size(), 0);
+ index_type cl = 0;
+
+ for (index_type k = 0; k < size(); k++ )
+ {
+ if (levGE[k] >= cl)
+ {
+ std::vector<index_type> t = rt[k];
+ for (index_type j = k+1; j < size(); j++ )
+ {
+ bool overlap = false;
+ // is there overlap
+ if (plib::container::contains(t, j))
+ overlap = true;
+ for (auto &x : rt[j])
+ if (plib::container::contains(t, x))
+ {
+ overlap = true;
+ break;
+ }
+ if (overlap)
+ levGE[j] = cl + 1;
+ else
+ {
+ t.push_back(j);
+ for (auto &x : rt[j])
+ t.push_back(x);
+ }
+ }
+ cl++;
+ }
+ }
+
+ m_ge_par.clear();
+ m_ge_par.resize(cl+1);
+ for (index_type k = 0; k < size(); k++)
+ m_ge_par[levGE[k]].push_back(k);
+ }
+
+ index_type m_size;
+ };
+
+} // namespace plib
+
+#endif /* MAT_CR_H_ */
diff --git a/src/lib/netlist/plib/palloc.cpp b/src/lib/netlist/plib/palloc.cpp
deleted file mode 100644
index e4d31985b23..00000000000
--- a/src/lib/netlist/plib/palloc.cpp
+++ /dev/null
@@ -1,105 +0,0 @@
-// license:GPL-2.0+
-// copyright-holders:Couriersud
-/*
- * palloc.c
- *
- */
-
-#include "pconfig.h"
-#include "palloc.h"
-#include "pfmtlog.h"
-
-#include <algorithm>
-
-namespace plib {
-
-//============================================================
-// Memory pool
-//============================================================
-
-mempool::mempool(size_t min_alloc, size_t min_align)
-: m_min_alloc(min_alloc), m_min_align(min_align)
-{
-}
-mempool::~mempool()
-{
- for (auto & b : m_blocks)
- {
- if (b.m_num_alloc != 0)
- {
- fprintf(stderr, "Found block with %d dangling allocations\n", static_cast<int>(b.m_num_alloc));
- }
- ::operator delete(b.data);
- }
- m_blocks.clear();
-}
-
-size_t mempool::new_block()
-{
- block b;
- b.data = static_cast<char *>(::operator new(m_min_alloc));
- b.cur_ptr = b.data;
- b.m_free = m_min_alloc;
- b.m_num_alloc = 0;
- m_blocks.push_back(b);
- return m_blocks.size() - 1;
-}
-
-size_t mempool::mininfosize()
-{
- size_t sinfo = sizeof(mempool::info);
-#ifdef __APPLE__
- size_t ma = 16;
-#else
- size_t ma = 8;
-#endif
- return ((std::max(m_min_align, sinfo) + ma - 1) / ma) * ma;
-}
-
-void *mempool::alloc(size_t size)
-{
- size_t rs = (size + mininfosize() + m_min_align - 1) & ~(m_min_align - 1);
- for (size_t bn=0; bn < m_blocks.size(); bn++)
- {
- auto &b = m_blocks[bn];
- if (b.m_free > rs)
- {
- b.m_free -= rs;
- b.m_num_alloc++;
- auto i = reinterpret_cast<info *>(b.cur_ptr);
- i->m_block = bn;
- auto ret = reinterpret_cast<void *>(b.cur_ptr + mininfosize());
- b.cur_ptr += rs;
- return ret;
- }
- }
- {
- size_t bn = new_block();
- auto &b = m_blocks[bn];
- b.m_num_alloc = 1;
- b.m_free = m_min_alloc - rs;
- auto i = reinterpret_cast<info *>(b.cur_ptr);
- i->m_block = bn;
- auto ret = reinterpret_cast<void *>(b.cur_ptr + mininfosize());
- b.cur_ptr += rs;
- return ret;
- }
-}
-
-void mempool::free(void *ptr)
-{
- auto p = reinterpret_cast<char *>(ptr);
-
- auto i = reinterpret_cast<info *>(p - mininfosize());
- block *b = &m_blocks[i->m_block];
- if (b->m_num_alloc == 0)
- fprintf(stderr, "Argh .. double free\n");
- else
- {
- //b->m_free = m_min_alloc;
- //b->cur_ptr = b->data;
- }
- b->m_num_alloc--;
-}
-
-}
diff --git a/src/lib/netlist/plib/palloc.h b/src/lib/netlist/plib/palloc.h
index a35bc50ff17..15fede3a99b 100644
--- a/src/lib/netlist/plib/palloc.h
+++ b/src/lib/netlist/plib/palloc.h
@@ -8,172 +8,427 @@
#ifndef PALLOC_H_
#define PALLOC_H_
+#include "pconfig.h"
#include "pstring.h"
+#include "ptypes.h"
-#include <vector>
+#include <cstddef>
+#include <cstdlib>
#include <memory>
+#include <type_traits>
+#include <utility>
+#include <vector>
+
+#if defined(_WIN32) || defined(_WIN64) || defined(_MSC_VER)
+#include <malloc.h>
+#endif
namespace plib {
-//============================================================
-// Memory allocation
-//============================================================
-
-template<typename T, typename... Args>
-T *palloc(Args&&... args)
-{
- return new T(std::forward<Args>(args)...);
-}
-
-template<typename T>
-void pfree(T *ptr)
-{
- delete ptr;
-}
-
-template<typename T>
-T* palloc_array(const std::size_t num)
-{
- return new T[num]();
-}
-
-template<typename T>
-void pfree_array(T *ptr)
-{
- delete [] ptr;
-}
-
-template<typename T, typename... Args>
-std::unique_ptr<T> make_unique(Args&&... args)
-{
- return std::unique_ptr<T>(new T(std::forward<Args>(args)...));
-}
-
-template<typename BC, typename DC, typename... Args>
-static std::unique_ptr<BC> make_unique_base(Args&&... args)
-{
- std::unique_ptr<BC> ret(new DC(std::forward<Args>(args)...));
- return ret;
-}
-
-template <typename SC>
-class owned_ptr
-{
-private:
- owned_ptr()
- : m_ptr(nullptr), m_is_owned(true) { }
-public:
- owned_ptr(SC *p, bool owned) noexcept
- : m_ptr(p), m_is_owned(owned)
- { }
-
- owned_ptr(const owned_ptr &r) = delete;
- owned_ptr & operator =(owned_ptr &r) = delete;
-
- template<typename DC>
- owned_ptr & operator =(owned_ptr<DC> &&r)
+ //============================================================
+ // Standard arena_deleter
+ //============================================================
+
+ template <typename P, typename T>
+ struct arena_deleter
+ {
+ //using arena_storage_type = P *;
+ using arena_storage_type = typename std::conditional<P::is_stateless, P, P *>::type;
+ template <typename X, typename Y = void>
+ typename std::enable_if<!X::is_stateless, X&>::type getref(X *x) { return *x;}
+ template <typename X, typename Y = void *>
+ typename std::enable_if<std::remove_pointer<X>::type::is_stateless, X&>::type
+ getref(X &x, Y y = nullptr)
+ {
+ unused_var(y);
+ return x;
+ }
+
+ constexpr arena_deleter(arena_storage_type a = arena_storage_type()) noexcept
+ : m_a(a) { }
+
+ template<typename PU, typename U, typename = typename
+ std::enable_if<std::is_convertible< U*, T*>::value>::type>
+ arena_deleter(const arena_deleter<PU, U> &rhs) noexcept : m_a(rhs.m_a) { }
+
+ void operator()(T *p) //const
+ {
+ /* call destructor */
+ p->~T();
+ getref(m_a).deallocate(p);
+ }
+ //private:
+ arena_storage_type m_a;
+ };
+
+ //============================================================
+ // owned_ptr: smart pointer with ownership information
+ //============================================================
+
+ template <typename SC, typename D>
+ class owned_ptr
+ {
+ public:
+
+ using pointer = SC *;
+ using element_type = SC;
+ using deleter_type = D;
+
+ owned_ptr()
+ : m_ptr(nullptr), m_deleter(), m_is_owned(true) { }
+
+ template <typename, typename>
+ friend class owned_ptr;
+
+ owned_ptr(pointer p, bool owned) noexcept
+ : m_ptr(p), m_deleter(), m_is_owned(owned)
+ { }
+
+ owned_ptr(pointer p, bool owned, D deleter) noexcept
+ : m_ptr(p), m_deleter(deleter), m_is_owned(owned)
+ { }
+
+
+ owned_ptr(const owned_ptr &r) = delete;
+ owned_ptr & operator =(owned_ptr &r) = delete;
+
+ template<typename DC, typename DC_D>
+ owned_ptr & operator =(owned_ptr<DC, DC_D> &&r)
+ {
+ if (m_is_owned && (m_ptr != nullptr))
+ //delete m_ptr;
+ m_deleter(m_ptr);
+ m_is_owned = r.m_is_owned;
+ m_ptr = r.m_ptr;
+ m_deleter = r.m_deleter;
+ r.m_is_owned = false;
+ r.m_ptr = nullptr;
+ return *this;
+ }
+
+ owned_ptr(owned_ptr &&r) noexcept
+ : m_ptr(r.m_ptr)
+ , m_deleter(r.m_deleter)
+ , m_is_owned(r.m_is_owned)
+ {
+ r.m_is_owned = false;
+ r.m_ptr = nullptr;
+ }
+
+ owned_ptr &operator=(owned_ptr &&r) noexcept
+ {
+ if (m_is_owned && (m_ptr != nullptr))
+ //delete m_ptr;
+ m_deleter(m_ptr);
+ m_is_owned = r.m_is_owned;
+ m_ptr = r.m_ptr;
+ m_deleter = std::move(r.m_deleter);
+ r.m_is_owned = false;
+ r.m_ptr = nullptr;
+ return *this;
+ }
+
+ template<typename DC, typename DC_D>
+ owned_ptr(owned_ptr<DC, DC_D> &&r) noexcept
+ : m_ptr(static_cast<pointer >(r.get()))
+ , m_deleter(r.m_deleter)
+ , m_is_owned(r.is_owned())
+ {
+ r.release();
+ }
+
+ ~owned_ptr() noexcept
+ {
+ if (m_is_owned && (m_ptr != nullptr))
+ {
+ //delete m_ptr;
+ m_deleter(m_ptr);
+ }
+ m_is_owned = false;
+ m_ptr = nullptr;
+ }
+
+ /**
+ * \brief Return @c true if the stored pointer is not null.
+ */
+ explicit operator bool() const noexcept { return m_ptr != nullptr; }
+
+ pointer release()
+ {
+ pointer tmp = m_ptr;
+ m_is_owned = false;
+ m_ptr = nullptr;
+ return tmp;
+ }
+
+ bool is_owned() const { return m_is_owned; }
+
+ pointer operator ->() const noexcept { return m_ptr; }
+ typename std::add_lvalue_reference<element_type>::type operator *() const noexcept { return *m_ptr; }
+ pointer get() const noexcept { return m_ptr; }
+
+ deleter_type& get_deleter() noexcept { return m_deleter; }
+ const deleter_type& get_deleter() const noexcept { return m_deleter; }
+
+ private:
+ pointer m_ptr;
+ D m_deleter;
+ bool m_is_owned;
+ };
+
+ //============================================================
+ // Arena allocator for use with containers
+ //============================================================
+
+ template <class ARENA, class T, std::size_t ALIGN = alignof(T)>
+ class arena_allocator
{
- if (m_is_owned && (m_ptr != nullptr))
- delete m_ptr;
- m_is_owned = r.m_is_owned;
- m_ptr = r.m_ptr;
- r.m_is_owned = false;
- r.m_ptr = nullptr;
- return *this;
+ public:
+ using value_type = T;
+ static constexpr const std::size_t align_size = ALIGN;
+ using arena_type = ARENA;
+
+ static_assert(align_size >= alignof(T) && (align_size % alignof(T)) == 0,
+ "ALIGN must be greater than alignof(T) and a multiple");
+
+ arena_allocator() noexcept
+ : m_a(arena_type::instance())
+ { }
+
+ ~arena_allocator() noexcept = default;
+
+ arena_allocator(const arena_allocator &rhs) noexcept = default;
+ arena_allocator& operator=(const arena_allocator&) noexcept = delete;
+
+ arena_allocator(arena_allocator&&) noexcept = default;
+ arena_allocator& operator=(arena_allocator&&) = delete;
+
+ arena_allocator(arena_type & a) noexcept : m_a(a)
+ {
+ }
+
+ template <class U>
+ arena_allocator(const arena_allocator<ARENA, U, ALIGN>& rhs) noexcept
+ : m_a(rhs.m_a)
+ {
+ }
+
+ template <class U> struct rebind
+ {
+ using other = arena_allocator<ARENA, U, ALIGN>;
+ };
+
+ T* allocate(std::size_t n)
+ {
+ return reinterpret_cast<T *>(m_a.allocate(ALIGN, sizeof(T) * n));
+ }
+
+ void deallocate(T* p, std::size_t n) noexcept
+ {
+ unused_var(n);
+ m_a.deallocate(p);
+ }
+
+ template <class AR1, class T1, std::size_t A1, class AR2, class T2, std::size_t A2>
+ friend bool operator==(const arena_allocator<AR1, T1, A1>& lhs,
+ const arena_allocator<AR2, T2, A2>& rhs) noexcept;
+
+ template <class AU, class U, std::size_t A> friend class arena_allocator;
+ private:
+ arena_type &m_a;
+ };
+
+ template <class AR1, class T1, std::size_t A1, class AR2, class T2, std::size_t A2>
+ inline bool operator==(const arena_allocator<AR1, T1, A1>& lhs,
+ const arena_allocator<AR2, T2, A2>& rhs) noexcept
+ {
+ return A1 == A2 && rhs.m_a == lhs.m_a;
+ }
+ template <class AR1, class T1, std::size_t A1, class AR2, class T2, std::size_t A2>
+ inline bool operator!=(const arena_allocator<AR1, T1, A1>& lhs,
+ const arena_allocator<AR2, T2, A2>& rhs) noexcept
+ {
+ return !(lhs == rhs);
}
- owned_ptr(owned_ptr &&r) noexcept
+ //============================================================
+ // Memory allocation
+ //============================================================
+
+ struct aligned_arena
{
- m_is_owned = r.m_is_owned;
- m_ptr = r.m_ptr;
- r.m_is_owned = false;
- r.m_ptr = nullptr;
+ static constexpr const bool is_stateless = true;
+ template <class T, std::size_t ALIGN = alignof(T)>
+ using allocator_type = arena_allocator<aligned_arena, T, ALIGN>;
+
+ template <typename T>
+ using owned_pool_ptr = plib::owned_ptr<T, arena_deleter<aligned_arena, T>>;
+
+ static inline aligned_arena &instance()
+ {
+ static aligned_arena s_arena;
+ return s_arena;
+ }
+
+ static inline void *allocate( size_t alignment, size_t size )
+ {
+ #if (USE_ALIGNED_ALLOCATION)
+ #if defined(_WIN32) || defined(_WIN64) || defined(_MSC_VER)
+ return _aligned_malloc(size, alignment);
+ #elif defined(__APPLE__)
+ void* p;
+ if (::posix_memalign(&p, alignment, size) != 0) {
+ p = nullptr;
+ }
+ return p;
+ #else
+ return aligned_alloc(alignment, size);
+ #endif
+ #else
+ unused_var(alignment);
+ return ::operator new(size);
+ #endif
+ }
+
+ static inline void deallocate( void *ptr )
+ {
+ #if (USE_ALIGNED_ALLOCATION)
+ // NOLINTNEXTLINE(cppcoreguidelines-no-malloc)
+ free(ptr);
+ #else
+ ::operator delete(ptr);
+ #endif
+ }
+
+ template<typename T, typename... Args>
+ owned_pool_ptr<T> make_poolptr(Args&&... args)
+ {
+ auto *mem = allocate(alignof(T), sizeof(T));
+ return owned_pool_ptr<T>(new (mem) T(std::forward<Args>(args)...), true, arena_deleter<aligned_arena, T>(*this));
+ }
+
+ };
+
+ template <typename T, std::size_t ALIGN>
+ /*inline */ C14CONSTEXPR T *assume_aligned_ptr(T *p) noexcept
+ {
+ static_assert(ALIGN >= alignof(T), "Alignment must be greater or equal to alignof(T)");
+ static_assert(is_pow2(ALIGN), "Alignment must be a power of 2");
+ //auto t = reinterpret_cast<std::uintptr_t>(p);
+ //if (t & (ALIGN-1))
+ // printf("alignment error!");
+#if (USE_ALIGNED_HINTS)
+ return reinterpret_cast<T *>(__builtin_assume_aligned(p, ALIGN));
+#else
+ return p;
+#endif
}
- template<typename DC>
- owned_ptr(owned_ptr<DC> &&r) noexcept
+ template <typename T, std::size_t ALIGN>
+ constexpr const T *assume_aligned_ptr(const T *p) noexcept
{
- m_ptr = static_cast<SC *>(r.get());
- m_is_owned = r.is_owned();
- r.release();
+ static_assert(ALIGN >= alignof(T), "Alignment must be greater or equal to alignof(T)");
+ static_assert(is_pow2(ALIGN), "Alignment must be a power of 2");
+#if (USE_ALIGNED_HINTS)
+ return reinterpret_cast<const T *>(__builtin_assume_aligned(p, ALIGN));
+#else
+ return p;
+#endif
}
- ~owned_ptr()
+ // FIXME: remove
+ template<typename T, typename... Args>
+ inline T *pnew(Args&&... args)
{
- if (m_is_owned && (m_ptr != nullptr))
- delete m_ptr;
- m_is_owned = false;
- m_ptr = nullptr;
+ auto *p = aligned_arena::allocate(alignof(T), sizeof(T));
+ return new(p) T(std::forward<Args>(args)...);
}
- template<typename DC, typename... Args>
- static owned_ptr Create(Args&&... args)
+
+ template<typename T>
+ inline void pdelete(T *ptr)
{
- owned_ptr a;
- DC *x = new DC(std::forward<Args>(args)...);
- a.m_ptr = static_cast<SC *>(x);
- return std::move(a);
+ ptr->~T();
+ aligned_arena::deallocate(ptr);
}
- template<typename... Args>
- static owned_ptr Create(Args&&... args)
+
+ template <typename T>
+ using unique_ptr = std::unique_ptr<T, arena_deleter<aligned_arena, T>>;
+
+ template<typename T, typename... Args>
+ plib::unique_ptr<T> make_unique(Args&&... args)
{
- owned_ptr a;
- a.m_ptr = new SC(std::forward<Args>(args)...);
- return std::move(a);
+ return plib::unique_ptr<T>(pnew<T>(std::forward<Args>(args)...));
}
- SC * release()
+
+#if 0
+ template<typename T, typename... Args>
+ static owned_ptr<T> make_owned(Args&&... args)
{
- SC *tmp = m_ptr;
- m_is_owned = false;
- m_ptr = nullptr;
- return tmp;
+ return owned_ptr<T>(pnew<T>(std::forward<Args>(args)...), true);
}
+#endif
+
- bool is_owned() const { return m_is_owned; }
+ template <class T, std::size_t ALIGN = alignof(T)>
+ using aligned_allocator = aligned_arena::allocator_type<T, ALIGN>;
- SC * operator ->() const { return m_ptr; }
- SC & operator *() const { return *m_ptr; }
- SC * get() const { return m_ptr; }
-private:
- SC *m_ptr;
- bool m_is_owned;
-};
+ //============================================================
+ // traits to determine alignment size and stride size
+ // from types supporting alignment
+ //============================================================
-class mempool
-{
-private:
- struct block
+ PDEFINE_HAS_MEMBER(has_align, align_size);
+
+ template <typename T, typename X = void>
+ struct align_traits
{
- block() : m_num_alloc(0), m_free(0), cur_ptr(nullptr), data(nullptr) { }
- std::size_t m_num_alloc;
- std::size_t m_free;
- char *cur_ptr;
- char *data;
+ static constexpr const std::size_t align_size = alignof(std::max_align_t);
+ static constexpr const std::size_t value_size = sizeof(typename T::value_type);
+ static constexpr const std::size_t stride_size = lcm(align_size, value_size) / value_size;
};
- size_t new_block();
- size_t mininfosize();
-
- struct info
+ template <typename T>
+ struct align_traits<T, typename std::enable_if<has_align<T>::value, void>::type>
{
- info() : m_block(0) { }
- size_t m_block;
+ static constexpr const std::size_t align_size = T::align_size;
+ static constexpr const std::size_t value_size = sizeof(typename T::value_type);
+ static constexpr const std::size_t stride_size = lcm(align_size, value_size) / value_size;
};
- size_t m_min_alloc;
- size_t m_min_align;
+ //============================================================
+ // Aligned vector
+ //============================================================
- std::vector<block> m_blocks;
+ // FIXME: needs a separate file
+ template <class T, std::size_t ALIGN = alignof(T)>
+ class aligned_vector : public std::vector<T, aligned_allocator<T, ALIGN>>
+ {
+ public:
+ using base = std::vector<T, aligned_allocator<T, ALIGN>>;
+
+ using reference = typename base::reference;
+ using const_reference = typename base::const_reference;
+ using pointer = typename base::pointer;
+ using const_pointer = typename base::const_pointer;
+ using size_type = typename base::size_type;
-public:
- mempool(size_t min_alloc, size_t min_align);
- ~mempool();
+ using base::base;
- void *alloc(size_t size);
- void free(void *ptr);
+ C14CONSTEXPR reference operator[](size_type i) noexcept
+ {
+ return assume_aligned_ptr<T, ALIGN>(&(base::operator[](0)))[i];
+ }
+ constexpr const_reference operator[](size_type i) const noexcept
+ {
+ return assume_aligned_ptr<T, ALIGN>(&(base::operator[](0)))[i];
+ }
-};
+ pointer data() noexcept { return assume_aligned_ptr<T, ALIGN>(base::data()); }
+ const_pointer data() const noexcept { return assume_aligned_ptr<T, ALIGN>(base::data()); }
+
+ };
-}
+} // namespace plib
#endif /* PALLOC_H_ */
diff --git a/src/lib/netlist/plib/parray.h b/src/lib/netlist/plib/parray.h
new file mode 100644
index 00000000000..1be37b908cd
--- /dev/null
+++ b/src/lib/netlist/plib/parray.h
@@ -0,0 +1,126 @@
+// license:GPL-2.0+
+// copyright-holders:Couriersud
+/*
+ * parray.h
+ *
+ */
+
+#ifndef PARRAY_H_
+#define PARRAY_H_
+
+#include "palloc.h"
+#include "pconfig.h"
+#include "pexception.h"
+
+#include <array>
+#include <memory>
+#include <type_traits>
+#include <utility>
+#include <vector>
+
+namespace plib {
+
+ template <typename FT, int SIZE>
+ struct sizeabs
+ {
+ static constexpr std::size_t ABS() { return (SIZE < 0) ? static_cast<std::size_t>(0 - SIZE) : static_cast<std::size_t>(SIZE); }
+ using container = typename std::array<FT, ABS()> ;
+ };
+
+ template <typename FT>
+ struct sizeabs<FT, 0>
+ {
+ static constexpr const std::size_t ABS = 0;
+ using container = typename std::vector<FT, aligned_allocator<FT, PALIGN_VECTOROPT>>;
+ };
+
+ /**
+ * \brief Array with preallocated or dynamic allocation
+ *
+ * Passing SIZE > 0 has the same functionality as a std::array.
+ * SIZE = 0 is pure dynamic allocation, the actual array size is passed to the
+ * constructor.
+ * SIZE < 0 reserves std::abs(SIZE) elements statically in place allocated. The
+ * actual size is passed in by the constructor.
+ * This array is purely intended for HPC application where depending on the
+ * architecture a preference dynamic/static has to be made.
+ *
+ * This struct is not intended to be a full replacement to std::array.
+ * It is a subset to enable switching between dynamic and static allocation.
+ * I consider > 10% performance difference to be a use case.
+ */
+
+ template <typename FT, int SIZE>
+ struct parray
+ {
+ public:
+ static constexpr std::size_t SIZEABS() { return sizeabs<FT, SIZE>::ABS(); }
+
+ using base_type = typename sizeabs<FT, SIZE>::container;
+ using size_type = typename base_type::size_type;
+ using reference = typename base_type::reference;
+ using const_reference = typename base_type::const_reference;
+ using value_type = typename base_type::value_type;
+
+ template <int X = SIZE >
+ parray(size_type size, typename std::enable_if<X==0, int>::type = 0)
+ : m_a(size), m_size(size)
+ {
+ }
+
+#if 1
+ /* allow construction in fixed size arrays */
+ template <int X = SIZE >
+ parray(typename std::enable_if<(X > 0), int>::type = 0)
+ : m_size(X)
+ {
+ }
+#endif
+ template <int X = SIZE >
+ parray(size_type size, typename std::enable_if<X!=0, int>::type = 0)
+ : m_size(size)
+ {
+ if (SIZE < 0 && size > SIZEABS())
+ throw plib::pexception("parray: size error " + plib::to_string(size) + ">" + plib::to_string(SIZEABS()));
+ else if (SIZE > 0 && size != SIZEABS())
+ throw plib::pexception("parray: size error");
+ }
+
+ inline size_type size() const noexcept { return SIZE <= 0 ? m_size : SIZEABS(); }
+
+ constexpr size_type max_size() const noexcept { return base_type::max_size(); }
+
+ bool empty() const noexcept { return size() == 0; }
+
+#if 0
+ reference operator[](size_type i) /*noexcept*/
+ {
+ if (i >= m_size) throw plib::pexception("limits error " + to_string(i) + ">=" + to_string(m_size));
+ return m_a[i];
+ }
+ const_reference operator[](size_type i) const /*noexcept*/
+ {
+ if (i >= m_size) throw plib::pexception("limits error " + to_string(i) + ">=" + to_string(m_size));
+ return m_a[i];
+ }
+#else
+ C14CONSTEXPR reference operator[](size_type i) noexcept
+ {
+ return assume_aligned_ptr<FT, PALIGN_VECTOROPT>(&m_a[0])[i];
+ }
+ constexpr const_reference operator[](size_type i) const noexcept
+ {
+ return assume_aligned_ptr<FT, PALIGN_VECTOROPT>(&m_a[0])[i];
+ }
+#endif
+ FT * data() noexcept { return assume_aligned_ptr<FT, PALIGN_VECTOROPT>(m_a.data()); }
+ const FT * data() const noexcept { return assume_aligned_ptr<FT, PALIGN_VECTOROPT>(m_a.data()); }
+
+ private:
+ PALIGNAS_VECTOROPT()
+ base_type m_a;
+ size_type m_size;
+ };
+} // namespace plib
+
+#endif /* PARRAY_H_ */
diff --git a/src/lib/netlist/plib/pchrono.cpp b/src/lib/netlist/plib/pchrono.cpp
index 971d19b3645..953d948e062 100644
--- a/src/lib/netlist/plib/pchrono.cpp
+++ b/src/lib/netlist/plib/pchrono.cpp
@@ -49,5 +49,5 @@ exact_ticks::type exact_ticks::per_second()
#endif
-}
-}
+} // namespace chrono
+} // namespace plib
diff --git a/src/lib/netlist/plib/pchrono.h b/src/lib/netlist/plib/pchrono.h
index a229128e7b8..8ce0eca23b3 100644
--- a/src/lib/netlist/plib/pchrono.h
+++ b/src/lib/netlist/plib/pchrono.h
@@ -9,16 +9,17 @@
#define PCHRONO_H_
#include "pconfig.h"
+#include "ptypes.h"
-#include <cstdint>
#include <chrono>
+#include <cstdint>
namespace plib {
namespace chrono {
template <typename T>
struct sys_ticks
{
- typedef typename T::rep type;
+ using type = typename T::rep;
static inline type start() { return T::now().time_since_epoch().count(); }
static inline type stop() { return T::now().time_since_epoch().count(); }
static inline constexpr type per_second() { return T::period::den / T::period::num; }
@@ -145,7 +146,7 @@ namespace chrono {
struct counter
{
counter() : m_count(0) { }
- typedef uint_least64_t type;
+ using type = uint_least64_t;
type operator()() const { return m_count; }
void inc() { ++m_count; }
void reset() { m_count = 0; }
@@ -157,7 +158,7 @@ namespace chrono {
template<>
struct counter<false>
{
- typedef uint_least64_t type;
+ using type = uint_least64_t;
constexpr type operator()() const { return 0; }
void inc() const { }
void reset() const { }
@@ -168,15 +169,28 @@ namespace chrono {
template< typename T, bool enabled_ = true>
struct timer
{
- typedef typename T::type type;
- typedef uint_least64_t ctype;
+ using type = typename T::type;
+ using ctype = uint_least64_t;
+ constexpr static bool enabled = enabled_;
+
+ struct guard_t
+ {
+ guard_t() = delete;
+ guard_t(timer &m) noexcept : m_m(m) { m_m.m_time -= T::start(); }
+ ~guard_t() { m_m.m_time += T::stop(); ++m_m.m_count; }
+
+ COPYASSIGNMOVE(guard_t, default)
+
+ private:
+ timer &m_m;
+ };
+
+ friend struct guard_t;
timer() : m_time(0), m_count(0) { }
type operator()() const { return m_time; }
- void start() { m_time -= T::start(); }
- void stop() { m_time += T::stop(); ++m_count; }
void reset() { m_time = 0; m_count = 0; }
type average() const { return (m_count == 0) ? 0 : m_time / m_count; }
type total() const { return m_time; }
@@ -185,7 +199,7 @@ namespace chrono {
double as_seconds() const { return static_cast<double>(total())
/ static_cast<double>(T::per_second()); }
- constexpr static bool enabled = enabled_;
+ guard_t guard() { return guard_t(*this); }
private:
type m_time;
ctype m_count;
@@ -194,19 +208,31 @@ namespace chrono {
template<typename T>
struct timer<T, false>
{
- typedef typename T::type type;
- typedef uint_least64_t ctype;
+ using type = typename T::type;
+ using ctype = uint_least64_t;
+
+ struct guard_t
+ {
+ guard_t() = default;
+ COPYASSIGNMOVE(guard_t, default)
+ /* using default constructor will trigger warning on
+ * unused local variable.
+ */
+ // NOLINTNEXTLINE(modernize-use-equals-default)
+ ~guard_t() { }
+ };
+
constexpr type operator()() const { return 0; }
- void start() const { }
- void stop() const { }
void reset() const { }
constexpr type average() const { return 0; }
constexpr type total() const { return 0; }
constexpr ctype count() const { return 0; }
constexpr double as_seconds() const { return 0.0; }
constexpr static bool enabled = false;
+ guard_t guard() { return guard_t(); }
};
+
} // namespace chrono
} // namespace plib
diff --git a/src/lib/netlist/plib/pconfig.h b/src/lib/netlist/plib/pconfig.h
index 0200c305ecd..d66b342f815 100644
--- a/src/lib/netlist/plib/pconfig.h
+++ b/src/lib/netlist/plib/pconfig.h
@@ -21,18 +21,46 @@
* if PHAS_RDTSCP == 1
*/
#ifndef PUSE_ACCURATE_STATS
-#define PUSE_ACCURATE_STATS (1)
+#define PUSE_ACCURATE_STATS (0)
#endif
/*
* Set this to one if you want to use 128 bit int for ptime.
- * This is for tests only.
+ * This is about 5% slower on a kaby lake processor.
*/
#ifndef PHAS_INT128
#define PHAS_INT128 (0)
#endif
+/*
+ * Set this to one if you want to use aligned storage optimizations.
+ */
+
+#ifndef USE_ALIGNED_OPTIMIZATIONS
+#define USE_ALIGNED_OPTIMIZATIONS (0)
+#endif
+
+#define USE_ALIGNED_ALLOCATION (USE_ALIGNED_OPTIMIZATIONS)
+#define USE_ALIGNED_HINTS (USE_ALIGNED_OPTIMIZATIONS)
+/*
+ * Standard alignment macros
+ */
+
+#define PALIGN_CACHELINE (64)
+#define PALIGN_VECTOROPT (64)
+
+#define PALIGNAS_CACHELINE() PALIGNAS(PALIGN_CACHELINE)
+#define PALIGNAS_VECTOROPT() PALIGNAS(PALIGN_VECTOROPT)
+
+/* Breaks mame build on windows due to -Wattribute
+ * FIXME: no error on cross-compile - need further checks */
+#if defined(_WIN32) && defined(__GNUC__)
+#define PALIGNAS(x)
+#else
+#define PALIGNAS(x) alignas(x)
+#endif
+
/*============================================================
* Check for CPP Version
*
@@ -47,6 +75,13 @@
*
*============================================================*/
+#ifndef NVCCBUILD
+#define NVCCBUILD (0)
+#endif
+
+#if NVCCBUILD
+#define C14CONSTEXPR
+#else
#if __cplusplus == 201103L
#define C14CONSTEXPR
#elif __cplusplus == 201402L
@@ -58,6 +93,7 @@
#else
#error "C++ version not supported"
#endif
+#endif
#ifndef PHAS_INT128
#define PHAS_INT128 (0)
@@ -68,17 +104,6 @@ typedef __uint128_t UINT128;
typedef __int128_t INT128;
#endif
-#if defined(__GNUC__)
-#ifdef RESTRICT
-#undef RESTRICT
-#endif
-#define RESTRICT __restrict__
-#define ATTR_UNUSED __attribute__((__unused__))
-#else
-#define RESTRICT
-#define ATTR_UNUSED
-#endif
-
//============================================================
// Standard defines
//============================================================
diff --git a/src/lib/netlist/plib/pdynlib.cpp b/src/lib/netlist/plib/pdynlib.cpp
index 13827eaf24c..0d32bead51d 100644
--- a/src/lib/netlist/plib/pdynlib.cpp
+++ b/src/lib/netlist/plib/pdynlib.cpp
@@ -25,7 +25,7 @@ CHAR *astring_from_utf8(const char *utf8string)
// convert UTF-16 to "ANSI code page" string
char_count = WideCharToMultiByte(CP_ACP, 0, wstring, -1, nullptr, 0, nullptr, nullptr);
- result = palloc_array<CHAR>(char_count);
+ result = new CHAR[char_count];
if (result != nullptr)
WideCharToMultiByte(CP_ACP, 0, wstring, -1, result, char_count, nullptr, nullptr);
@@ -39,7 +39,7 @@ WCHAR *wstring_from_utf8(const char *utf8string)
// convert MAME string (UTF-8) to UTF-16
char_count = MultiByteToWideChar(CP_UTF8, 0, utf8string, -1, nullptr, 0);
- result = palloc_array<WCHAR>(char_count);
+ result = new WCHAR[char_count];
if (result != nullptr)
MultiByteToWideChar(CP_UTF8, 0, utf8string, -1, result, char_count);
@@ -58,7 +58,7 @@ WCHAR *wstring_from_utf8(const char *utf8string)
#endif
namespace plib {
-dynlib::dynlib(const pstring libname)
+dynlib::dynlib(const pstring &libname)
: m_isLoaded(false), m_lib(nullptr)
{
#ifdef _WIN32
@@ -72,7 +72,7 @@ dynlib::dynlib(const pstring libname)
m_isLoaded = true;
//else
// fprintf(stderr, "win: library <%s> not found!\n", libname.c_str());
- pfree_array(buffer);
+ delete [] buffer;
#elif defined(EMSCRIPTEN)
//no-op
#else
@@ -88,9 +88,11 @@ dynlib::dynlib(const pstring libname)
#endif
}
-dynlib::dynlib(const pstring path, const pstring libname)
+dynlib::dynlib(const pstring &path, const pstring &libname)
: m_isLoaded(false), m_lib(nullptr)
{
+ // FIXME: implement path search
+ plib::unused_var(path);
// printf("win: loading <%s>\n", libname.c_str());
#ifdef _WIN32
TCHAR *buffer = tstring_from_utf8(libname.c_str());
@@ -104,7 +106,7 @@ dynlib::dynlib(const pstring path, const pstring libname)
{
//printf("win: library <%s> not found!\n", libname.c_str());
}
- pfree_array(buffer);
+ delete [] buffer;
#elif defined(EMSCRIPTEN)
//no-op
#else
@@ -139,7 +141,7 @@ bool dynlib::isLoaded() const
return m_isLoaded;
}
-void *dynlib::getsym_p(const pstring name)
+void *dynlib::getsym_p(const pstring &name)
{
#ifdef _WIN32
return (void *) GetProcAddress((HMODULE) m_lib, name.c_str());
@@ -148,4 +150,4 @@ void *dynlib::getsym_p(const pstring name)
#endif
}
-}
+} // namespace plib
diff --git a/src/lib/netlist/plib/pdynlib.h b/src/lib/netlist/plib/pdynlib.h
index 7c9412593c9..1454c053298 100644
--- a/src/lib/netlist/plib/pdynlib.h
+++ b/src/lib/netlist/plib/pdynlib.h
@@ -8,28 +8,31 @@
#define PDYNLIB_H_
#include "pstring.h"
+#include "ptypes.h"
namespace plib {
// ----------------------------------------------------------------------------------------
// pdynlib: dynamic loading of libraries ...
// ----------------------------------------------------------------------------------------
-class dynlib
+class dynlib : public nocopyassignmove
{
public:
- explicit dynlib(const pstring libname);
- dynlib(const pstring path, const pstring libname);
+ explicit dynlib(const pstring &libname);
+ dynlib(const pstring &path, const pstring &libname);
+
~dynlib();
+ COPYASSIGNMOVE(dynlib, delete)
bool isLoaded() const;
template <typename T>
- T getsym(const pstring name)
+ T getsym(const pstring &name)
{
return reinterpret_cast<T>(getsym_p(name));
}
private:
- void *getsym_p(const pstring name);
+ void *getsym_p(const pstring &name);
bool m_isLoaded;
void *m_lib;
@@ -64,6 +67,6 @@ private:
calltype m_sym;
};
-}
+} // namespace plib
#endif /* PSTRING_H_ */
diff --git a/src/lib/netlist/plib/pexception.cpp b/src/lib/netlist/plib/pexception.cpp
index a4ed8f367e0..8d6907d66f2 100644
--- a/src/lib/netlist/plib/pexception.cpp
+++ b/src/lib/netlist/plib/pexception.cpp
@@ -9,6 +9,7 @@
#include "pfmtlog.h"
#include <cfenv>
+#include <iostream>
#if (defined(__x86_64__) || defined(__i386__)) && defined(__linux__)
#define HAS_FEENABLE_EXCEPT (1)
@@ -17,127 +18,113 @@
#endif
namespace plib {
-//============================================================
-// Exceptions
-//============================================================
-
-pexception::pexception(const pstring &text)
-: m_text(text)
-{
-}
-
-pexception::~pexception() noexcept
-{
-}
-
-file_e::file_e(const pstring &fmt, const pstring &filename)
- : pexception(pfmt(fmt)(filename))
-{
-}
-
-file_e::~file_e() noexcept
-{
-}
-
-file_open_e::file_open_e(const pstring &filename)
- : file_e("File open failed: {}", filename)
-{
-}
-
-file_open_e::~file_open_e() noexcept
-{
-
-}
-
-file_read_e::file_read_e(const pstring &filename)
- : file_e("File read failed: {}", filename)
-{
-}
-
-file_read_e::~file_read_e() noexcept
-{
-
-}
-
-file_write_e::file_write_e(const pstring &filename)
- : file_e("File write failed: {}", filename)
-{
-}
-
-file_write_e::~file_write_e() noexcept
-{
-}
-
-null_argument_e::null_argument_e(const pstring &argument)
- : pexception(pfmt("Null argument passed: {}")(argument))
-{
-}
-
-null_argument_e::~null_argument_e() noexcept
-{
-}
-
-out_of_mem_e::out_of_mem_e(const pstring &location)
- : pexception(pfmt("Out of memory: {}")(location))
-{
-}
-
-out_of_mem_e::~out_of_mem_e() noexcept
-{
-}
-
-fpexception_e::fpexception_e(const pstring &text)
- : pexception(pfmt("Out of memory: {}")(text))
-{
-}
-
-fpexception_e::~fpexception_e() noexcept
-{
-}
-
-bool fpsignalenabler::m_enable = false;
-
-fpsignalenabler::fpsignalenabler(unsigned fpexceptions)
-{
-#if HAS_FEENABLE_EXCEPT
- if (m_enable)
+
+ //============================================================
+ // terminate
+ //============================================================
+
+ void terminate(const pstring &msg) noexcept
{
- int b = 0;
- if (fpexceptions & plib::FP_INEXACT) b = b | FE_INEXACT;
- if (fpexceptions & plib::FP_DIVBYZERO) b = b | FE_DIVBYZERO;
- if (fpexceptions & plib::FP_UNDERFLOW) b = b | FE_UNDERFLOW;
- if (fpexceptions & plib::FP_OVERFLOW) b = b | FE_OVERFLOW;
- if (fpexceptions & plib::FP_INVALID) b = b | FE_INVALID;
- m_last_enabled = feenableexcept(b);
+ std::cerr << msg.c_str() << "\n";
+ std::terminate();
}
-#else
- m_last_enabled = 0;
-#endif
-}
-fpsignalenabler::~fpsignalenabler()
-{
-#if HAS_FEENABLE_EXCEPT
- if (m_enable)
+ //============================================================
+ // Exceptions
+ //============================================================
+
+ pexception::pexception(const pstring &text)
+ : m_text(text)
+ {
+ }
+
+
+ file_e::file_e(const pstring &fmt, const pstring &filename)
+ : pexception(pfmt(fmt)(filename))
+ {
+ }
+
+
+ file_open_e::file_open_e(const pstring &filename)
+ : file_e("File open failed: {}", filename)
+ {
+ }
+
+
+ file_read_e::file_read_e(const pstring &filename)
+ : file_e("File read failed: {}", filename)
{
- fedisableexcept(FE_ALL_EXCEPT); // Enable all floating point exceptions but FE_INEXACT
- feenableexcept(m_last_enabled); // Enable all floating point exceptions but FE_INEXACT
}
-#endif
-}
-bool fpsignalenabler::supported()
-{
- return true;
-}
-bool fpsignalenabler::global_enable(bool enable)
-{
- bool old = m_enable;
- m_enable = enable;
- return old;
-}
+ file_write_e::file_write_e(const pstring &filename)
+ : file_e("File write failed: {}", filename)
+ {
+ }
+
+
+ null_argument_e::null_argument_e(const pstring &argument)
+ : pexception(pfmt("Null argument passed: {}")(argument))
+ {
+ }
+
+
+ out_of_mem_e::out_of_mem_e(const pstring &location)
+ : pexception(pfmt("Out of memory: {}")(location))
+ {
+ }
+
+
+ fpexception_e::fpexception_e(const pstring &text)
+ : pexception(pfmt("Out of memory: {}")(text))
+ {
+ }
+
+
+ bool fpsignalenabler::m_enable = false;
+
+ fpsignalenabler::fpsignalenabler(unsigned fpexceptions)
+ {
+ #if HAS_FEENABLE_EXCEPT
+ if (m_enable)
+ {
+ int b = 0;
+ if (fpexceptions & plib::FP_INEXACT) b = b | FE_INEXACT;
+ if (fpexceptions & plib::FP_DIVBYZERO) b = b | FE_DIVBYZERO;
+ if (fpexceptions & plib::FP_UNDERFLOW) b = b | FE_UNDERFLOW;
+ if (fpexceptions & plib::FP_OVERFLOW) b = b | FE_OVERFLOW;
+ if (fpexceptions & plib::FP_INVALID) b = b | FE_INVALID;
+ m_last_enabled = feenableexcept(b);
+ }
+ #else
+ m_last_enabled = 0;
+ #endif
+ }
+
+
+ fpsignalenabler::~fpsignalenabler()
+ {
+ #if HAS_FEENABLE_EXCEPT
+ if (m_enable)
+ {
+ fedisableexcept(FE_ALL_EXCEPT); // Enable all floating point exceptions but FE_INEXACT
+ feenableexcept(m_last_enabled); // Enable all floating point exceptions but FE_INEXACT
+ }
+ #endif
+ }
+
+ bool fpsignalenabler::supported()
+ {
+ return true;
+ }
+
+ bool fpsignalenabler::global_enable(bool enable)
+ {
+ bool old = m_enable;
+ m_enable = enable;
+ return old;
+ }
-}
+} // namespace plib
diff --git a/src/lib/netlist/plib/pexception.h b/src/lib/netlist/plib/pexception.h
index 4827081b754..28a3ac1adf1 100644
--- a/src/lib/netlist/plib/pexception.h
+++ b/src/lib/netlist/plib/pexception.h
@@ -9,118 +9,116 @@
#define PEXCEPTION_H_
#include "pstring.h"
+#include "ptypes.h"
#include <exception>
namespace plib {
-//============================================================
-// exception base
-//============================================================
-
-class pexception : public std::exception
-{
-public:
- explicit pexception(const pstring &text);
- pexception(const pexception &e) : std::exception(e), m_text(e.m_text) { }
-
- virtual ~pexception() noexcept;
-
- const pstring &text() { return m_text; }
- const char* what() const noexcept override { return m_text.c_str(); }
-
-private:
- pstring m_text;
-};
-
-class file_e : public plib::pexception
-{
-public:
- file_e(const pstring &fmt, const pstring &filename);
- file_e(const file_e &e) : pexception(e) { }
- virtual ~file_e() noexcept;
-};
-
-class file_open_e : public file_e
-{
-public:
- explicit file_open_e(const pstring &filename);
- file_open_e(const file_open_e &e) : file_e(e) { }
- virtual ~file_open_e() noexcept;
-};
-
-class file_read_e : public file_e
-{
-public:
- explicit file_read_e(const pstring &filename);
- file_read_e(const file_read_e &e) : file_e(e) { }
- virtual ~file_read_e() noexcept;
-};
-
-class file_write_e : public file_e
-{
-public:
- explicit file_write_e(const pstring &filename);
- file_write_e(const file_write_e &e) : file_e(e) { }
- virtual ~file_write_e() noexcept;
-};
-
-class null_argument_e : public plib::pexception
-{
-public:
- explicit null_argument_e(const pstring &argument);
- null_argument_e(const null_argument_e &e) : pexception(e) { }
- virtual ~null_argument_e() noexcept;
-};
-
-class out_of_mem_e : public plib::pexception
-{
-public:
- explicit out_of_mem_e(const pstring &location);
- out_of_mem_e(const out_of_mem_e &e) : pexception(e) { }
- virtual ~out_of_mem_e() noexcept;
-};
-
-/* FIXME: currently only a stub for later use. More use could be added by
- * using “-fnon-call-exceptions" and sigaction to enable c++ exception supported.
- */
-
-class fpexception_e : public pexception
-{
-public:
- explicit fpexception_e(const pstring &text);
- fpexception_e(const fpexception_e &e) : pexception(e) { }
- virtual ~fpexception_e() noexcept;
-};
-
-static constexpr unsigned FP_INEXACT = 0x0001;
-static constexpr unsigned FP_DIVBYZERO = 0x0002;
-static constexpr unsigned FP_UNDERFLOW = 0x0004;
-static constexpr unsigned FP_OVERFLOW = 0x0008;
-static constexpr unsigned FP_INVALID = 0x00010;
-static constexpr unsigned FP_ALL = 0x0001f;
-
-/*
- * Catch SIGFPE on linux for debugging purposes.
- */
-
-class fpsignalenabler
-{
-public:
- explicit fpsignalenabler(unsigned fpexceptions);
- ~fpsignalenabler();
-
- /* is the functionality supported ? */
- static bool supported();
- /* returns last global enable state */
- static bool global_enable(bool enable);
-
-private:
- int m_last_enabled;
-
- static bool m_enable;
-};
-
-}
+ //============================================================
+ // terminate
+ //============================================================
+
+ /*! Terminate the program
+ *
+ * \note could be enhanced by setting a termination handler
+ */
+ [[noreturn]] void terminate(const pstring &msg) noexcept;
+
+ //============================================================
+ // exception base
+ //============================================================
+
+ class pexception : public std::exception
+ {
+ public:
+ explicit pexception(const pstring &text);
+
+ const pstring &text() { return m_text; }
+ const char* what() const noexcept override { return m_text.c_str(); }
+
+ private:
+ pstring m_text;
+ };
+
+ class file_e : public plib::pexception
+ {
+ public:
+ file_e(const pstring &fmt, const pstring &filename);
+ };
+
+ class file_open_e : public file_e
+ {
+ public:
+ explicit file_open_e(const pstring &filename);
+ };
+
+ class file_read_e : public file_e
+ {
+ public:
+ explicit file_read_e(const pstring &filename);
+ };
+
+ class file_write_e : public file_e
+ {
+ public:
+ explicit file_write_e(const pstring &filename);
+ };
+
+ class null_argument_e : public plib::pexception
+ {
+ public:
+ explicit null_argument_e(const pstring &argument);
+ };
+
+ class out_of_mem_e : public plib::pexception
+ {
+ public:
+ explicit out_of_mem_e(const pstring &location);
+ };
+
+ /* FIXME: currently only a stub for later use. More use could be added by
+ * using “-fnon-call-exceptions" and sigaction to enable c++ exception supported.
+ */
+
+ class fpexception_e : public pexception
+ {
+ public:
+ explicit fpexception_e(const pstring &text);
+ };
+
+ static constexpr unsigned FP_INEXACT = 0x0001;
+ static constexpr unsigned FP_DIVBYZERO = 0x0002;
+ static constexpr unsigned FP_UNDERFLOW = 0x0004;
+ static constexpr unsigned FP_OVERFLOW = 0x0008;
+ static constexpr unsigned FP_INVALID = 0x00010;
+ static constexpr unsigned FP_ALL = 0x0001f;
+
+ /*
+ * Catch SIGFPE on linux for debugging purposes.
+ */
+
+ class fpsignalenabler
+ {
+ public:
+ explicit fpsignalenabler(unsigned fpexceptions);
+
+ COPYASSIGNMOVE(fpsignalenabler, delete)
+
+ ~fpsignalenabler();
+
+ /* is the functionality supported ? */
+ static bool supported();
+ /* returns last global enable state */
+ static bool global_enable(bool enable);
+
+ private:
+ int m_last_enabled;
+
+ static bool m_enable;
+ };
+
+
+} // namespace plib
#endif /* PEXCEPTION_H_ */
diff --git a/src/lib/netlist/plib/pfmtlog.cpp b/src/lib/netlist/plib/pfmtlog.cpp
index b8b5fcb3b91..af87251fbdf 100644
--- a/src/lib/netlist/plib/pfmtlog.cpp
+++ b/src/lib/netlist/plib/pfmtlog.cpp
@@ -8,83 +8,96 @@
#include "pfmtlog.h"
#include "palloc.h"
-#include <cstring>
-#include <cstdlib>
-#include <cstdarg>
#include <algorithm>
-#include <locale>
+#include <array>
+#include <cstdarg>
+#include <cstdio>
+#include <cstdlib>
+#include <cstring>
#include <iostream>
+#include <locale>
namespace plib {
pfmt &pfmt::format_element(const char *l, const unsigned cfmt_spec, ...)
{
va_list ap;
- va_start(ap, cfmt_spec);
- pstring fmt("%");
- char buf[2048]; // FIXME
+ // NOLINTNEXTLINE(cppcoreguidelines-pro-type-vararg)
+ std::array<char, 2048> buf;
std::size_t sl;
+ bool found_abs = false;
m_arg++;
- pstring search("{");
- search += plib::to_string(m_arg);
- sl = search.length();
+ do {
+ pstring fmt("%");
+ va_start(ap, cfmt_spec);
+ found_abs = false;
+ buf[0] = 0;
+ pstring search("{");
+ search += plib::to_string(m_arg);
+ sl = search.size();
- auto p = m_str.find(search + ":");
- sl++; // ":"
- if (p == pstring::npos) // no further specifiers
- {
- p = m_str.find(search + "}");
- if (p == pstring::npos) // not found try default
- {
- sl = 2;
- p = m_str.find("{}");
- }
- if (p == pstring::npos)
+ auto p = m_str.find(search + ":");
+ sl++; // ":"
+ if (p == pstring::npos) // no further specifiers
{
- sl=1;
- p = m_str.find("{");
- if (p != pstring:: npos)
+ p = m_str.find(search + "}");
+ if (p == pstring::npos) // not found try default
{
- auto p1 = m_str.find("}", p);
- if (p1 != pstring::npos)
+ sl = 2;
+ p = m_str.find("{}");
+ }
+ else
+ // found absolute positional place holder
+ found_abs = true;
+ if (p == pstring::npos)
+ {
+ sl=2;
+ p = m_str.find("{:");
+ if (p != pstring:: npos)
{
- sl = p1 - p + 1;
- fmt += m_str.substr(p+1, p1 - p - 1);
+ auto p1 = m_str.find("}", p);
+ if (p1 != pstring::npos)
+ {
+ sl = p1 - p + 1;
+ fmt += m_str.substr(p+1, p1 - p - 1);
+ }
}
}
}
- }
- else
- {
- auto p1 = m_str.find("}", p);
- if (p1 != pstring::npos)
+ else
+ {
+ // found absolute positional place holder
+ auto p1 = m_str.find("}", p);
+ if (p1 != pstring::npos)
+ {
+ sl = p1 - p + 1;
+ fmt += ((m_arg>=10) ? m_str.substr(p+4, p1 - p - 4) : m_str.substr(p+3, p1 - p - 3));
+ found_abs = true;
+ }
+ }
+ pstring::value_type pend = fmt.at(fmt.size() - 1);
+ if (pstring("duxo").find(cfmt_spec) != pstring::npos)
{
- sl = p1 - p + 1;
- fmt += ((m_arg>=10) ? m_str.substr(p+4, p1 - p - 4) : m_str.substr(p+3, p1 - p - 3));
+ if (pstring("duxo").find(pend) == pstring::npos)
+ fmt += (pstring(l) + static_cast<pstring::value_type>(cfmt_spec));
+ else
+ fmt = plib::left(fmt, fmt.size() - 1) + pstring(l) + plib::right(fmt, 1);
+ }
+ else if (pstring("fge").find(cfmt_spec) != pstring::npos)
+ {
+ if (pstring("fge").find(pend) == pstring::npos)
+ fmt += cfmt_spec;
}
- }
- pstring::code_t pend = fmt.at(fmt.length() - 1);
- if (pstring("duxo").find(cfmt_spec) != pstring::npos)
- {
- if (pstring("duxo").find(pend) == pstring::npos)
- fmt += (pstring(l, pstring::UTF8) + cfmt_spec);
else
- fmt = fmt.left(fmt.length() - 1) + pstring(l, pstring::UTF8) + fmt.right(1);
- }
- else if (pstring("fge").find(cfmt_spec) != pstring::npos)
- {
- if (pstring("fge").find(pend) == pstring::npos)
fmt += cfmt_spec;
- }
- else
- fmt += cfmt_spec;
- vsprintf(buf, fmt.c_str(), ap);
- if (p != pstring::npos)
- m_str = m_str.substr(0, p) + pstring(buf, pstring::UTF8) + m_str.substr(p + sl);
- va_end(ap);
+ std::vsnprintf(buf.data(), buf.size(), fmt.c_str(), ap);
+ if (p != pstring::npos)
+ m_str = m_str.substr(0, p) + pstring(buf.data()) + m_str.substr(p + sl);
+ va_end(ap);
+ } while (found_abs);
return *this;
}
-}
+} // namespace plib
diff --git a/src/lib/netlist/plib/pfmtlog.h b/src/lib/netlist/plib/pfmtlog.h
index 9b7a85d8d8d..cb9b59c01ce 100644
--- a/src/lib/netlist/plib/pfmtlog.h
+++ b/src/lib/netlist/plib/pfmtlog.h
@@ -9,6 +9,7 @@
#include "pstring.h"
#include "ptypes.h"
+#include "putil.h"
#include <limits>
@@ -34,7 +35,6 @@ struct ptype_traits_base
template <>
struct ptype_traits_base<bool>
{
- static unsigned int cast(bool &x) { return static_cast<unsigned int>(x); }
static unsigned int cast(const bool &x) { return static_cast<unsigned int>(x); }
static const bool is_signed = std::numeric_limits<bool>::is_signed;
static const char *size_spec() { return ""; }
@@ -136,7 +136,6 @@ struct ptype_traits<double> : ptype_traits_base<double>
static char32_t fmt_spec() { return 'f'; }
};
-
template<>
struct ptype_traits<char *> : ptype_traits_base<char *>
{
@@ -144,6 +143,13 @@ struct ptype_traits<char *> : ptype_traits_base<char *>
static char32_t fmt_spec() { return 's'; }
};
+template<>
+struct ptype_traits<std::string> : ptype_traits_base<char *>
+{
+ static const char *cast(const std::string &x) { return x.c_str(); }
+ static char32_t fmt_spec() { return 's'; }
+};
+
class pfmt
{
public:
@@ -151,44 +157,57 @@ public:
: m_str(fmt), m_arg(0)
{
}
+ COPYASSIGNMOVE(pfmt, default)
- pfmt(const pfmt &rhs) : m_str(rhs.m_str), m_arg(rhs.m_arg) { }
-
- ~pfmt()
- {
- }
+ ~pfmt() noexcept = default;
operator pstring() const { return m_str; }
+ // NOLINTNEXTLINE(cppcoreguidelines-pro-type-vararg)
pfmt & e(const double &x) {return format_element("", 'e', x); }
+ // NOLINTNEXTLINE(cppcoreguidelines-pro-type-vararg)
pfmt & g(const double &x) {return format_element("", 'g', x); }
+ // NOLINTNEXTLINE(cppcoreguidelines-pro-type-vararg)
pfmt & e(const float &x) {return format_element("", 'e', static_cast<double>(x)); }
+ // NOLINTNEXTLINE(cppcoreguidelines-pro-type-vararg)
pfmt & g(const float &x) {return format_element("", 'g', static_cast<double>(x)); }
+ // NOLINTNEXTLINE(cppcoreguidelines-pro-type-vararg)
pfmt &operator ()(const void *x) {return format_element("", 'p', x); }
+ // NOLINTNEXTLINE(cppcoreguidelines-pro-type-vararg)
pfmt &operator ()(const pstring &x) {return format_element("", 's', x.c_str() ); }
template<typename T>
pfmt &operator ()(const T &x)
{
+ // NOLINTNEXTLINE(cppcoreguidelines-pro-type-vararg)
return format_element(ptype_traits<T>::size_spec(), ptype_traits<T>::fmt_spec(), ptype_traits<T>::cast(x));
}
template<typename T>
pfmt &operator ()(const T *x)
{
+ // NOLINTNEXTLINE(cppcoreguidelines-pro-type-vararg)
return format_element(ptype_traits<T *>::size_spec(), ptype_traits<T *>::fmt_spec(), ptype_traits<T *>::cast(x));
}
+ template<typename X, typename Y, typename... Args>
+ pfmt &operator()(X&& x, Y && y, Args&&... args)
+ {
+ return ((*this)(std::forward<X>(x)))(std::forward<Y>(y), std::forward<Args>(args)...);
+ }
+
template<typename T>
pfmt &x(const T &x)
{
+ // NOLINTNEXTLINE(cppcoreguidelines-pro-type-vararg)
return format_element(ptype_traits<T>::size_spec(), 'x', x);
}
template<typename T>
pfmt &o(const T &x)
{
+ // NOLINTNEXTLINE(cppcoreguidelines-pro-type-vararg)
return format_element(ptype_traits<T>::size_spec(), 'o', x);
}
@@ -203,11 +222,13 @@ private:
};
template <class T, bool build_enabled = true>
-class pfmt_writer_t : plib::nocopyassignmove
+class pfmt_writer_t
{
public:
explicit pfmt_writer_t() : m_enabled(true) { }
+ COPYASSIGNMOVE(pfmt_writer_t, delete)
+
/* runtime enable */
template<bool enabled, typename... Args>
void log(const pstring & fmt, Args&&... args) const
@@ -237,7 +258,7 @@ public:
bool is_enabled() const { return m_enabled; }
protected:
- ~pfmt_writer_t() { }
+ ~pfmt_writer_t() noexcept = default;
private:
pfmt &xlog(pfmt &fmt) const { return fmt; }
@@ -258,7 +279,10 @@ class plog_channel : public pfmt_writer_t<plog_channel<T, L, build_enabled>, bui
friend class pfmt_writer_t<plog_channel<T, L, build_enabled>, build_enabled>;
public:
explicit plog_channel(T &b) : pfmt_writer_t<plog_channel, build_enabled>(), m_base(b) { }
- ~plog_channel() { }
+
+ COPYASSIGNMOVE(plog_channel, delete)
+
+ ~plog_channel() noexcept = default;
protected:
void vdowrite(const pstring &ls) const
@@ -283,7 +307,9 @@ public:
error(proxy),
fatal(proxy)
{}
- virtual ~plog_base() {}
+
+ COPYASSIGNMOVE(plog_base, default)
+ virtual ~plog_base() noexcept = default;
plog_channel<T, plog_level::DEBUG, debug_enabled> debug;
plog_channel<T, plog_level::INFO> info;
@@ -293,7 +319,7 @@ public:
plog_channel<T, plog_level::FATAL> fatal;
};
-}
+} // namespace plib
template<typename T>
plib::pfmt& operator<<(plib::pfmt &p, T&& val) { return p(std::forward<T>(val)); }
diff --git a/src/lib/netlist/plib/pfunction.cpp b/src/lib/netlist/plib/pfunction.cpp
index 79f09cb4a46..6a2179e0e6f 100644
--- a/src/lib/netlist/plib/pfunction.cpp
+++ b/src/lib/netlist/plib/pfunction.cpp
@@ -6,9 +6,9 @@
*/
#include "pfunction.h"
+#include "pexception.h"
#include "pfmtlog.h"
#include "putil.h"
-#include "pexception.h"
#include <cmath>
#include <stack>
@@ -17,7 +17,7 @@ namespace plib {
void pfunction::compile(const std::vector<pstring> &inputs, const pstring &expr)
{
- if (expr.startsWith("rpn:"))
+ if (plib::startsWith(expr, "rpn:"))
compile_postfix(inputs, expr.substr(4));
else
compile_infix(inputs, expr);
@@ -56,7 +56,7 @@ void pfunction::compile_postfix(const std::vector<pstring> &inputs,
{ rc.m_cmd = RAND; stk += 1; }
else
{
- for (unsigned i = 0; i < inputs.size(); i++)
+ for (std::size_t i = 0; i < inputs.size(); i++)
{
if (inputs[i] == cmd)
{
@@ -68,9 +68,9 @@ void pfunction::compile_postfix(const std::vector<pstring> &inputs,
}
if (rc.m_cmd != PUSH_INPUT)
{
- bool err = false;
rc.m_cmd = PUSH_CONST;
- rc.m_param = cmd.as_double(&err);
+ bool err;
+ rc.m_param = plib::pstonum_ne<decltype(rc.m_param)>(cmd, err);
if (err)
throw plib::pexception(plib::pfmt("nld_function: unknown/misformatted token <{1}> in <{2}>")(cmd)(expr));
stk += 1;
@@ -84,11 +84,11 @@ void pfunction::compile_postfix(const std::vector<pstring> &inputs,
throw plib::pexception(plib::pfmt("nld_function: stack count different to one on <{2}>")(expr));
}
-static int get_prio(pstring v)
+static int get_prio(const pstring &v)
{
if (v == "(" || v == ")")
return 1;
- else if (v.left(1) >= "a" && v.left(1) <= "z")
+ else if (plib::left(v, 1) >= "a" && plib::left(v, 1) <= "z")
return 0;
else if (v == "*" || v == "/")
return 20;
@@ -113,12 +113,11 @@ void pfunction::compile_infix(const std::vector<pstring> &inputs, const pstring
{
// Shunting-yard infix parsing
std::vector<pstring> sep = {"(", ")", ",", "*", "/", "+", "-", "^"};
- std::vector<pstring> sexpr(plib::psplit(expr.replace_all(" ",""), sep));
+ std::vector<pstring> sexpr(plib::psplit(plib::replace_all(expr, pstring(" "), pstring("")), sep));
std::stack<pstring> opstk;
std::vector<pstring> postfix;
- //printf("dbg: %s\n", expr.c_str());
- for (unsigned i = 0; i < sexpr.size(); i++)
+ for (std::size_t i = 0; i < sexpr.size(); i++)
{
pstring &s = sexpr[i];
if (s=="(")
@@ -182,14 +181,15 @@ void pfunction::compile_infix(const std::vector<pstring> &inputs, const pstring
#define OP(OP, ADJ, EXPR) \
case OP: \
- ptr-=ADJ; \
- stack[ptr-1] = EXPR; \
+ ptr-= (ADJ); \
+ stack[ptr-1] = (EXPR); \
break;
double pfunction::evaluate(const std::vector<double> &values)
{
- double stack[20];
+ std::array<double, 20> stack = { 0 };
unsigned ptr = 0;
+ stack[0] = 0.0;
for (auto &rc : m_precompiled)
{
switch (rc.m_cmd)
@@ -199,8 +199,8 @@ double pfunction::evaluate(const std::vector<double> &values)
OP(SUB, 1, ST2 - ST1)
OP(DIV, 1, ST2 / ST1)
OP(POW, 1, std::pow(ST2, ST1))
- OP(SIN, 0, std::sin(ST2));
- OP(COS, 0, std::cos(ST2));
+ OP(SIN, 0, std::sin(ST2))
+ OP(COS, 0, std::cos(ST2))
case RAND:
stack[ptr++] = lfsr_random();
break;
@@ -215,4 +215,4 @@ double pfunction::evaluate(const std::vector<double> &values)
return stack[ptr-1];
}
-}
+} // namespace plib
diff --git a/src/lib/netlist/plib/pfunction.h b/src/lib/netlist/plib/pfunction.h
index 7d5984f9d15..fbb6c508333 100644
--- a/src/lib/netlist/plib/pfunction.h
+++ b/src/lib/netlist/plib/pfunction.h
@@ -8,8 +8,8 @@
#ifndef PFUNCTION_H_
#define PFUNCTION_H_
-#include "pstring.h"
#include "pstate.h"
+#include "pstring.h"
#include <vector>
@@ -112,6 +112,6 @@ namespace plib {
};
-}
+} // namespace plib
#endif /* PEXCEPTION_H_ */
diff --git a/src/lib/netlist/plib/plists.h b/src/lib/netlist/plib/plists.h
index 5fefa658b83..c2fee9c2f8e 100644
--- a/src/lib/netlist/plib/plists.h
+++ b/src/lib/netlist/plib/plists.h
@@ -12,6 +12,8 @@
#include "pstring.h"
+#include <array>
+#include <type_traits>
#include <vector>
namespace plib {
@@ -29,14 +31,13 @@ class uninitialised_array_t
{
public:
- typedef C* iterator;
- typedef const C* const_iterator;
+ using iterator = C *;
+ using const_iterator = const C *;
- uninitialised_array_t()
- {
- }
+ uninitialised_array_t() noexcept = default;
- ~uninitialised_array_t()
+ COPYASSIGNMOVE(uninitialised_array_t, delete)
+ ~uninitialised_array_t() noexcept
{
for (std::size_t i=0; i<N; i++)
(*this)[i].~C();
@@ -51,7 +52,7 @@ public:
const C& operator[](const std::size_t &index) const noexcept
{
- return *reinterpret_cast<C *>(&m_buf[index]);
+ return *reinterpret_cast<const C *>(&m_buf[index]);
}
template<typename... Args>
@@ -75,7 +76,8 @@ protected:
private:
/* ensure proper alignment */
- typename std::aligned_storage<sizeof(C), alignof(C)>::type m_buf[N];
+ PALIGNAS_VECTOROPT()
+ std::array<typename std::aligned_storage<sizeof(C), alignof(C)>::type, N> m_buf;
};
// ----------------------------------------------------------------------------------------
@@ -83,6 +85,7 @@ private:
// the list allows insertions / deletions if used properly
// ----------------------------------------------------------------------------------------
+#if 0
template <class LC>
class linkedlist_t
{
@@ -152,9 +155,10 @@ public:
void remove(const LC *elem) noexcept
{
auto p = &m_head;
- for ( ; *p != elem; p = &((*p)->m_next))
+ while(*p != elem)
{
//nl_assert(*p != nullptr);
+ p = &((*p)->m_next);
}
(*p) = elem->m_next;
}
@@ -166,7 +170,105 @@ public:
private:
LC *m_head;
};
+#else
+template <class LC>
+class linkedlist_t
+{
+public:
+
+ struct element_t
+ {
+ public:
+
+ friend class linkedlist_t<LC>;
+
+ constexpr element_t() : m_next(nullptr), m_prev(nullptr) {}
+ ~element_t() noexcept = default;
+
+ COPYASSIGNMOVE(element_t, delete)
+
+ constexpr LC *next() const noexcept { return m_next; }
+ constexpr LC *prev() const noexcept { return m_prev; }
+ private:
+ LC * m_next;
+ LC * m_prev;
+ };
+
+ struct iter_t final : public std::iterator<std::forward_iterator_tag, LC>
+ {
+ private:
+ LC* p;
+ public:
+ explicit constexpr iter_t(LC* x) noexcept : p(x) { }
+ constexpr iter_t(iter_t &rhs) noexcept : p(rhs.p) { }
+ iter_t(iter_t &&rhs) noexcept { std::swap(*this, rhs); }
+ iter_t& operator=(const iter_t &rhs) noexcept { iter_t t(rhs); std::swap(*this, t); return *this; }
+ iter_t& operator=(iter_t &&rhs) noexcept { std::swap(*this, rhs); return *this; }
+ iter_t& operator++() noexcept {p = p->next();return *this;}
+ // NOLINTNEXTLINE(cert-dcl21-cpp)
+ iter_t operator++(int) & noexcept {const iter_t tmp(*this); operator++(); return tmp;}
+
+ ~iter_t() = default;
+
+ constexpr bool operator==(const iter_t& rhs) const noexcept {return p == rhs.p;}
+ constexpr bool operator!=(const iter_t& rhs) const noexcept {return p != rhs.p;}
+ /* constexpr */ LC& operator*() noexcept {return *p;}
+ /* constexpr */ LC* operator->() noexcept {return p;}
+
+ constexpr LC& operator*() const noexcept {return *p;}
+ constexpr LC* operator->() const noexcept {return p;}
+ };
+
+ constexpr linkedlist_t() : m_head(nullptr) {}
-}
+ constexpr iter_t begin() const noexcept { return iter_t(m_head); }
+ constexpr iter_t end() const noexcept { return iter_t(nullptr); }
+
+ void push_front(LC *elem) noexcept
+ {
+ if (m_head)
+ m_head->m_prev = elem;
+ elem->m_next = m_head;
+ elem->m_prev = nullptr;
+ m_head = elem;
+ }
+
+ void push_back(LC *elem) noexcept
+ {
+ LC ** p(&m_head);
+ LC * prev(nullptr);
+ while (*p != nullptr)
+ {
+ prev = *p;
+ p = &((*p)->m_next);
+ }
+ *p = elem;
+ elem->m_prev = prev;
+ elem->m_next = nullptr;
+ }
+
+ void remove(const LC *elem) noexcept
+ {
+ if (elem->m_prev)
+ elem->m_prev->m_next = elem->m_next;
+ else
+ m_head = elem->m_next;
+ if (elem->m_next)
+ elem->m_next->m_prev = elem->m_prev;
+ else
+ {
+ /* update tail */
+ }
+ }
+
+ LC *front() const noexcept { return m_head; }
+ void clear() noexcept { m_head = nullptr; }
+ constexpr bool empty() const noexcept { return (m_head == nullptr); }
+
+private:
+ LC *m_head;
+};
+#endif
+} // namespace plib
#endif /* PLISTS_H_ */
diff --git a/src/lib/netlist/plib/pmain.cpp b/src/lib/netlist/plib/pmain.cpp
index 93c4076bac2..b381d96dca7 100644
--- a/src/lib/netlist/plib/pmain.cpp
+++ b/src/lib/netlist/plib/pmain.cpp
@@ -23,7 +23,7 @@ namespace plib {
char *buf = new char[dst_char_count + 1];
WideCharToMultiByte(CP_UTF8, 0, w, wlen, buf, dst_char_count, nullptr, nullptr);
buf[dst_char_count] = 0;
- auto ret = pstring(buf, pstring::UTF8);
+ auto ret = pstring(buf);
delete [] buf;
return ret;
}
@@ -37,18 +37,13 @@ namespace plib {
: options()
, pout_strm()
, perr_strm()
- , pout(pout_strm)
- , perr(perr_strm)
+ , pout(&pout_strm)
+ , perr(&perr_strm)
{
}
- app::~app()
- {
-
- }
-
- int app::main_utfX(int argc, char *argv[])
+ int app::main_utfX(int argc, char **argv)
{
auto r = this->parse(argc, argv);
int ret = 0;
diff --git a/src/lib/netlist/plib/pmain.h b/src/lib/netlist/plib/pmain.h
index e2f84b90de6..4f4be779251 100644
--- a/src/lib/netlist/plib/pmain.h
+++ b/src/lib/netlist/plib/pmain.h
@@ -10,20 +10,21 @@
#ifndef PMAIN_H_
#define PMAIN_H_
+#include "palloc.h"
#include "poptions.h"
+#include "pstream.h"
#include "pstring.h"
#include "putil.h"
-#include "pstream.h"
-#include <memory>
#include <cwchar>
+#include <memory>
#ifdef _WIN32
#define PMAIN(appclass) \
extern "C" int wmain(int argc, wchar_t *argv[]) { return plib::app::mainrun<appclass, wchar_t>(argc, argv); }
#else
#define PMAIN(appclass) \
-int main(int argc, char *argv[]) { return plib::app::mainrun<appclass, char>(argc, argv); }
+int main(int argc, char **argv) { return plib::app::mainrun<appclass, char>(argc, argv); }
#endif
@@ -36,7 +37,10 @@ namespace plib {
{
public:
app();
- virtual ~app();
+
+ COPYASSIGNMOVE(app, delete)
+
+ virtual ~app() = default;
virtual pstring usage() = 0;
virtual int execute() = 0;
@@ -48,21 +52,21 @@ namespace plib {
plib::putf8_fmt_writer perr;
template <class C, typename T>
- static int mainrun(int argc, T *argv[])
+ static int mainrun(int argc, T **argv)
{
- auto a = std::unique_ptr<C>(new C);
+ auto a = plib::make_unique<C>();
return a->main_utfX(argc, argv);
}
private:
- int main_utfX(int argc, char *argv[]);
+ int main_utfX(int argc, char **argv);
#ifdef _WIN32
int main_utfX(int argc, wchar_t *argv[]);
#endif
};
-}
+} // namespace plib
diff --git a/src/lib/netlist/plib/pmatrix2d.h b/src/lib/netlist/plib/pmatrix2d.h
new file mode 100644
index 00000000000..eab533688d7
--- /dev/null
+++ b/src/lib/netlist/plib/pmatrix2d.h
@@ -0,0 +1,85 @@
+// license:GPL-2.0+
+// copyright-holders:Couriersud
+/*
+ * pmatrix2d.h
+ *
+ * NxM regular matrix
+ *
+ */
+
+#ifndef PMATRIX2D_H_
+#define PMATRIX2D_H_
+
+#include "palloc.h"
+
+#include <algorithm>
+#include <cmath>
+#include <cstdlib>
+#include <type_traits>
+#include <vector>
+
+namespace plib
+{
+
+
+ template<typename T, typename A = aligned_allocator<T>>
+ class pmatrix2d
+ {
+ public:
+ using value_type = T;
+ using allocator_type = A;
+
+ static constexpr const std::size_t align_size = align_traits<A>::align_size;
+ static constexpr const std::size_t stride_size = align_traits<A>::stride_size;
+ pmatrix2d()
+ : m_N(0), m_M(0), m_stride(8), m_v()
+ {
+ }
+
+ pmatrix2d(std::size_t N, std::size_t M)
+ : m_N(N), m_M(M), m_v()
+ {
+ m_stride = ((M + stride_size-1) / stride_size) * stride_size;
+ m_v.resize(N * m_stride);
+ }
+
+ void resize(std::size_t N, std::size_t M)
+ {
+ m_N = N;
+ m_M = M;
+ m_stride = ((M + stride_size-1) / stride_size) * stride_size;
+ m_v.resize(N * m_stride);
+ }
+
+ C14CONSTEXPR T * operator[] (std::size_t row) noexcept
+ {
+ return assume_aligned_ptr<T, align_size>(&m_v[m_stride * row]);
+ }
+
+ constexpr const T * operator[] (std::size_t row) const noexcept
+ {
+ return assume_aligned_ptr<T, align_size>(&m_v[m_stride * row]);
+ }
+
+ T & operator()(std::size_t r, std::size_t c) noexcept
+ {
+ return (*this)[r][c];
+ }
+
+ const T & operator()(std::size_t r, std::size_t c) const noexcept
+ {
+ return (*this)[r][c];
+ }
+
+ private:
+
+ std::size_t m_N;
+ std::size_t m_M;
+ std::size_t m_stride;
+
+ std::vector<T, A> m_v;
+ };
+
+} // namespace plib
+
+#endif /* MAT_CR_H_ */
diff --git a/src/lib/netlist/plib/pmempool.h b/src/lib/netlist/plib/pmempool.h
new file mode 100644
index 00000000000..f55807c86dc
--- /dev/null
+++ b/src/lib/netlist/plib/pmempool.h
@@ -0,0 +1,187 @@
+// license:GPL-2.0+
+// copyright-holders:Couriersud
+/*
+ * pmempool.h
+ *
+ */
+
+#ifndef PMEMPOOL_H_
+#define PMEMPOOL_H_
+
+#include "palloc.h"
+#include "pstream.h"
+#include "pstring.h"
+#include "ptypes.h"
+#include "putil.h"
+
+#include <algorithm>
+#include <cstddef>
+#include <memory>
+#include <unordered_map>
+#include <utility>
+#include <vector>
+
+namespace plib {
+
+ //============================================================
+ // Memory pool
+ //============================================================
+
+ class mempool
+ {
+ private:
+ struct block
+ {
+ block(mempool *mp, std::size_t min_bytes)
+ : m_num_alloc(0)
+ , m_cur(0)
+ , m_data(nullptr)
+ , m_mempool(mp)
+ {
+ min_bytes = std::max(mp->m_min_alloc, min_bytes);
+ m_free = min_bytes;
+ std::size_t alloc_bytes = (min_bytes + mp->m_min_align - 1) & ~(mp->m_min_align - 1);
+ m_data_allocated = static_cast<char *>(::operator new(alloc_bytes));
+ void *r = m_data_allocated;
+ std::align(mp->m_min_align, min_bytes, r, alloc_bytes);
+ m_data = reinterpret_cast<char *>(r);
+ }
+ std::size_t m_num_alloc;
+ std::size_t m_free;
+ std::size_t m_cur;
+ char *m_data;
+ char *m_data_allocated;
+ mempool *m_mempool;
+ };
+
+ struct info
+ {
+ info(block *b, std::size_t p) : m_block(b), m_pos(p) { }
+ ~info() = default;
+ COPYASSIGNMOVE(info, default)
+
+ block * m_block;
+ std::size_t m_pos;
+ };
+
+
+ block * new_block(std::size_t min_bytes)
+ {
+ auto *b = plib::pnew<block>(this, min_bytes);
+ m_blocks.push_back(b);
+ return b;
+ }
+
+
+ static std::unordered_map<void *, info> &sinfo()
+ {
+ static std::unordered_map<void *, info> spinfo;
+ return spinfo;
+ }
+
+ size_t m_min_alloc;
+ size_t m_min_align;
+
+ std::vector<block *> m_blocks;
+
+ public:
+ static constexpr const bool is_stateless = false;
+ template <class T, std::size_t ALIGN = alignof(T)>
+ using allocator_type = arena_allocator<mempool, T, ALIGN>;
+
+ mempool(size_t min_alloc = (1<<21), size_t min_align = 16)
+ : m_min_alloc(min_alloc), m_min_align(min_align)
+ {
+ }
+
+ COPYASSIGNMOVE(mempool, delete)
+
+ ~mempool()
+ {
+
+ for (auto & b : m_blocks)
+ {
+ if (b->m_num_alloc != 0)
+ {
+ plib::perrlogger("Found {} info blocks\n", sinfo().size());
+ plib::perrlogger("Found block with {} dangling allocations\n", b->m_num_alloc);
+ }
+ ::operator delete(b->m_data);
+ }
+ }
+
+ void *allocate(size_t align, size_t size)
+ {
+ if (align < m_min_align)
+ align = m_min_align;
+
+ size_t rs = size + align;
+ for (auto &b : m_blocks)
+ {
+ if (b->m_free > rs)
+ {
+ b->m_free -= rs;
+ b->m_num_alloc++;
+ auto *ret = reinterpret_cast<void *>(b->m_data + b->m_cur);
+ auto capacity(rs);
+ ret = std::align(align, size, ret, capacity);
+ // FIXME: if (ret == nullptr)
+ // printf("Oh no\n");
+ sinfo().insert({ ret, info(b, b->m_cur)});
+ rs -= (capacity - size);
+ b->m_cur += rs;
+
+ return ret;
+ }
+ }
+ {
+ block *b = new_block(rs);
+ b->m_num_alloc = 1;
+ b->m_free = m_min_alloc - rs;
+ auto *ret = reinterpret_cast<void *>(b->m_data + b->m_cur);
+ auto capacity(rs);
+ ret = std::align(align, size, ret, capacity);
+ // FIXME: if (ret == nullptr)
+ // printf("Oh no\n");
+ sinfo().insert({ ret, info(b, b->m_cur)});
+ rs -= (capacity - size);
+ b->m_cur += rs;
+ return ret;
+ }
+ }
+
+ static void deallocate(void *ptr)
+ {
+
+ auto it = sinfo().find(ptr);
+ if (it == sinfo().end())
+ plib::terminate("mempool::free - pointer not found\n");
+ info i = it->second;
+ block *b = i.m_block;
+ if (b->m_num_alloc == 0)
+ plib::terminate("mempool::free - double free was called\n");
+ else
+ {
+ //b->m_free = m_min_alloc;
+ //b->cur_ptr = b->data;
+ }
+ b->m_num_alloc--;
+ //printf("Freeing in block %p %lu\n", b, b->m_num_alloc);
+ sinfo().erase(it);
+ }
+
+ template <typename T>
+ using owned_pool_ptr = plib::owned_ptr<T, arena_deleter<mempool, T>>;
+
+ template<typename T, typename... Args>
+ owned_pool_ptr<T> make_poolptr(Args&&... args)
+ {
+ auto *mem = this->allocate(alignof(T), sizeof(T));
+ return owned_pool_ptr<T>(new (mem) T(std::forward<Args>(args)...), true, arena_deleter<mempool, T>(this));
+ }
+
+ };
+
+} // namespace plib
+
+#endif /* PMEMPOOL_H_ */
diff --git a/src/lib/netlist/plib/pomp.h b/src/lib/netlist/plib/pomp.h
index 6559207f09d..f8a516df485 100644
--- a/src/lib/netlist/plib/pomp.h
+++ b/src/lib/netlist/plib/pomp.h
@@ -11,6 +11,8 @@
#include "pconfig.h"
+#include <cstddef>
+
#if HAS_OPENMP
#include "omp.h"
#endif
@@ -18,29 +20,39 @@
namespace plib {
namespace omp {
-template <class T>
-void for_static(const int start, const int end, const T &what)
+template <typename I, class T>
+void for_static(const I start, const I end, const T &what)
{
#if HAS_OPENMP && USE_OPENMP
#pragma omp parallel
#endif
{
#if HAS_OPENMP && USE_OPENMP
- #pragma omp for schedule(static)
+ #pragma omp for //schedule(static)
#endif
- for (int i = start; i < end; i++)
+ for (I i = start; i < end; i++)
what(i);
}
}
-inline void set_num_threads(const int threads)
+template <typename I, class T>
+void for_static_np(const I start, const I end, const T &what)
+{
+ for (I i = start; i < end; i++)
+ what(i);
+}
+
+
+inline void set_num_threads(const std::size_t threads)
{
#if HAS_OPENMP && USE_OPENMP
omp_set_num_threads(threads);
+#else
+ plib::unused_var(threads);
#endif
}
-inline int get_max_threads()
+inline std::size_t get_max_threads()
{
#if HAS_OPENMP && USE_OPENMP
return omp_get_max_threads();
@@ -54,7 +66,7 @@ inline int get_max_threads()
// pdynlib: dynamic loading of libraries ...
// ----------------------------------------------------------------------------------------
-}
-}
+} // namespace omp
+} // namespace plib
#endif /* PSTRING_H_ */
diff --git a/src/lib/netlist/plib/poptions.cpp b/src/lib/netlist/plib/poptions.cpp
index 910660acb3d..4a3d32c4723 100644
--- a/src/lib/netlist/plib/poptions.cpp
+++ b/src/lib/netlist/plib/poptions.cpp
@@ -6,77 +6,39 @@
*/
#include "poptions.h"
+#include "pexception.h"
+#include "ptypes.h"
namespace plib {
/***************************************************************************
Options
***************************************************************************/
- option_base::option_base(options &parent, pstring help)
+ option_base::option_base(options &parent, const pstring &help)
: m_help(help)
{
parent.register_option(this);
}
- option_base::~option_base()
- {
- }
-
- option_group::~option_group()
- {
- }
-
- option_example::~option_example()
- {
- }
-
- option::option(options &parent, pstring ashort, pstring along, pstring help, bool has_argument)
+ option::option(options &parent, const pstring &ashort, const pstring &along, const pstring &help, bool has_argument)
: option_base(parent, help), m_short(ashort), m_long(along),
m_has_argument(has_argument), m_specified(false)
{
}
- option::~option()
- {
- }
-
int option_str::parse(const pstring &argument)
{
m_val = argument;
return 0;
}
- int option_str_limit::parse(const pstring &argument)
- {
- if (plib::container::contains(m_limit, argument))
- {
- m_val = argument;
- return 0;
- }
- else
- return 1;
- }
-
int option_bool::parse(const pstring &argument)
{
+ unused_var(argument);
m_val = true;
return 0;
}
- int option_double::parse(const pstring &argument)
- {
- bool err = false;
- m_val = argument.as_double(&err);
- return (err ? 1 : 0);
- }
-
- int option_long::parse(const pstring &argument)
- {
- bool err = false;
- m_val = argument.as_long(&err);
- return (err ? 1 : 0);
- }
-
int option_vec::parse(const pstring &argument)
{
bool err = false;
@@ -85,53 +47,88 @@ namespace plib {
}
options::options()
+ : m_other_args(nullptr)
{
}
- options::options(option *o[])
+ options::options(option **o)
+ : m_other_args(nullptr)
{
int i=0;
while (o[i] != nullptr)
{
- m_opts.push_back(o[i]);
+ register_option(o[i]);
i++;
}
}
- options::~options()
+ void options::register_option(option_base *opt)
{
- m_opts.clear();
+ m_opts.push_back(opt);
}
- void options::register_option(option_base *opt)
+ void options::check_consistency()
{
- m_opts.push_back(opt);
+ for (auto &opt : m_opts)
+ {
+ auto *o = dynamic_cast<option *>(opt);
+ if (o != nullptr)
+ {
+ if (o->short_opt() == "" && o->long_opt() == "")
+ {
+ auto *ov = dynamic_cast<option_args *>(o);
+ if (ov != nullptr)
+ {
+ if (m_other_args != nullptr)
+ {
+ throw pexception("other args can only be specified once!");
+ }
+ else
+ {
+ m_other_args = ov;
+ }
+ }
+ else
+ throw pexception("found option with neither short or long tag!" );
+ }
+ }
+ }
}
- int options::parse(int argc, char *argv[])
+ int options::parse(int argc, char **argv)
{
- m_app = pstring(argv[0], pstring::UTF8);
+ check_consistency();
+ m_app = pstring(argv[0]);
+ bool seen_other_args = false;
for (int i=1; i<argc; )
{
- pstring arg(argv[i], pstring::UTF8);
+ pstring arg(argv[i]);
option *opt = nullptr;
pstring opt_arg;
bool has_equal_arg = false;
- if (arg.startsWith("--"))
+ if (!seen_other_args && plib::startsWith(arg, "--"))
{
auto v = psplit(arg.substr(2),"=");
- opt = getopt_long(v[0]);
- has_equal_arg = (v.size() > 1);
- if (has_equal_arg)
+ if (v.size() && v[0] != pstring(""))
{
- for (unsigned j = 1; j < v.size() - 1; j++)
- opt_arg = opt_arg + v[j] + "=";
- opt_arg += v[v.size()-1];
+ opt = getopt_long(v[0]);
+ has_equal_arg = (v.size() > 1);
+ if (has_equal_arg)
+ {
+ for (std::size_t j = 1; j < v.size() - 1; j++)
+ opt_arg = opt_arg + v[j] + "=";
+ opt_arg += v[v.size()-1];
+ }
+ }
+ else
+ {
+ opt = m_other_args;
+ seen_other_args = true;
}
}
- else if (arg.startsWith("-"))
+ else if (!seen_other_args && plib::startsWith(arg, "-"))
{
std::size_t p = 1;
opt = getopt_short(arg.substr(p, 1));
@@ -144,7 +141,11 @@ namespace plib {
}
else
{
- return i;
+ seen_other_args = true;
+ if (m_other_args == nullptr)
+ return i;
+ opt = m_other_args;
+ i--; // we haven't had an option specifier;
}
if (opt == nullptr)
return i;
@@ -158,7 +159,7 @@ namespace plib {
else
{
i++; // FIXME: are there more arguments?
- if (opt->do_parse(pstring(argv[i], pstring::UTF8)) != 0)
+ if (opt->do_parse(pstring(argv[i])) != 0)
return i - 1;
}
}
@@ -173,7 +174,7 @@ namespace plib {
return argc;
}
- pstring options::split_paragraphs(pstring text, unsigned width, unsigned indent,
+ pstring options::split_paragraphs(const pstring &text, unsigned width, unsigned indent,
unsigned firstline_indent)
{
auto paragraphs = psplit(text,"\n");
@@ -181,13 +182,13 @@ namespace plib {
for (auto &p : paragraphs)
{
- pstring line = pstring("").rpad(" ", firstline_indent);
+ pstring line = plib::rpad(pstring(""), pstring(" "), firstline_indent);
for (auto &s : psplit(p, " "))
{
if (line.length() + s.length() > width)
{
ret += line + "\n";
- line = pstring("").rpad(" ", indent);
+ line = plib::rpad(pstring(""), pstring(" "), indent);
}
line += s + " ";
}
@@ -196,8 +197,8 @@ namespace plib {
return ret;
}
- pstring options::help(pstring description, pstring usage,
- unsigned width, unsigned indent)
+ pstring options::help(const pstring &description, const pstring &usage,
+ unsigned width, unsigned indent) const
{
pstring ret;
@@ -206,6 +207,10 @@ namespace plib {
for (auto & optbase : m_opts )
{
+ // Skip anonymous inputs which are collected in option_args
+ if (dynamic_cast<option_args *>(optbase) != nullptr)
+ continue;
+
if (auto opt = dynamic_cast<option *>(optbase))
{
pstring line = "";
@@ -221,20 +226,20 @@ namespace plib {
if (opt->has_argument())
{
line += "=";
- option_str_limit *ol = dynamic_cast<option_str_limit *>(opt);
+ auto *ol = dynamic_cast<option_str_limit_base *>(opt);
if (ol)
{
for (auto &v : ol->limit())
{
line += v + "|";
}
- line = line.left(line.length() - 1);
+ line = plib::left(line, line.length() - 1);
}
else
line += "Value";
}
}
- line = line.rpad(" ", indent - 2) + " ";
+ line = plib::rpad(line, pstring(" "), indent - 2) + " ";
if (line.length() > indent)
{
//ret += "TestGroup abc\n def gef\nxyz\n\n" ;
@@ -250,6 +255,7 @@ namespace plib {
if (grp->help() != "") ret += split_paragraphs(grp->help(), width, 4, 4) + "\n";
}
}
+ // FIXME: other help ...
pstring ex("");
for (auto & optbase : m_opts )
{
@@ -266,22 +272,22 @@ namespace plib {
return ret;
}
- option *options::getopt_short(pstring arg)
+ option *options::getopt_short(const pstring &arg) const
{
for (auto & optbase : m_opts)
{
auto opt = dynamic_cast<option *>(optbase);
- if (opt && opt->short_opt() == arg)
+ if (opt && arg != "" && opt->short_opt() == arg)
return opt;
}
return nullptr;
}
- option *options::getopt_long(pstring arg)
+ option *options::getopt_long(const pstring &arg) const
{
for (auto & optbase : m_opts)
{
auto opt = dynamic_cast<option *>(optbase);
- if (opt && opt->long_opt() == arg)
+ if (opt && arg !="" && opt->long_opt() == arg)
return opt;
}
return nullptr;
diff --git a/src/lib/netlist/plib/poptions.h b/src/lib/netlist/plib/poptions.h
index 491ac0b4d91..086fe32fc8a 100644
--- a/src/lib/netlist/plib/poptions.h
+++ b/src/lib/netlist/plib/poptions.h
@@ -10,8 +10,8 @@
#ifndef POPTIONS_H_
#define POPTIONS_H_
-#include "pstring.h"
#include "plists.h"
+#include "pstring.h"
#include "putil.h"
namespace plib {
@@ -24,10 +24,12 @@ class options;
class option_base
{
public:
- option_base(options &parent, pstring help);
- virtual ~option_base();
+ option_base(options &parent, const pstring &help);
+ virtual ~option_base() = default;
+
+ COPYASSIGNMOVE(option_base, delete)
- pstring help() { return m_help; }
+ pstring help() const { return m_help; }
private:
pstring m_help;
};
@@ -35,11 +37,10 @@ private:
class option_group : public option_base
{
public:
- option_group(options &parent, pstring group, pstring help)
+ option_group(options &parent, const pstring &group, const pstring &help)
: option_base(parent, help), m_group(group) { }
- ~option_group();
- pstring group() { return m_group; }
+ pstring group() const { return m_group; }
private:
pstring m_group;
};
@@ -47,11 +48,10 @@ private:
class option_example : public option_base
{
public:
- option_example(options &parent, pstring group, pstring help)
+ option_example(options &parent, const pstring &group, const pstring &help)
: option_base(parent, help), m_example(group) { }
- ~option_example();
- pstring example() { return m_example; }
+ pstring example() const { return m_example; }
private:
pstring m_example;
};
@@ -60,8 +60,7 @@ private:
class option : public option_base
{
public:
- option(options &parent, pstring ashort, pstring along, pstring help, bool has_argument);
- ~option();
+ option(options &parent, const pstring &ashort, const pstring &along, const pstring &help, bool has_argument);
/* no_argument options will be called with "" argument */
@@ -89,131 +88,177 @@ private:
class option_str : public option
{
public:
- option_str(options &parent, pstring ashort, pstring along, pstring defval, pstring help)
+ option_str(options &parent, const pstring &ashort, const pstring &along, const pstring &defval, const pstring &help)
: option(parent, ashort, along, help, true), m_val(defval)
{}
- pstring operator ()() { return m_val; }
+ pstring operator ()() const { return m_val; }
protected:
- virtual int parse(const pstring &argument) override;
+ int parse(const pstring &argument) override;
private:
pstring m_val;
};
-class option_str_limit : public option
+class option_str_limit_base : public option
{
public:
- option_str_limit(options &parent, pstring ashort, pstring along, pstring defval, pstring limit, pstring help)
- : option(parent, ashort, along, help, true), m_val(defval)
- , m_limit(plib::psplit(limit, ":"))
+ option_str_limit_base(options &parent, const pstring &ashort, const pstring &along, std::vector<pstring> &&limit, const pstring &help)
+ : option(parent, ashort, along, help, true)
+ , m_limit(limit)
{
}
-
- pstring operator ()() { return m_val; }
- const std::vector<pstring> &limit() { return m_limit; }
+ const std::vector<pstring> &limit() const { return m_limit; }
protected:
- virtual int parse(const pstring &argument) override;
private:
- pstring m_val;
std::vector<pstring> m_limit;
};
-class option_bool : public option
+
+template <typename T>
+class option_str_limit : public option_str_limit_base
{
public:
- option_bool(options &parent, pstring ashort, pstring along, pstring help)
- : option(parent, ashort, along, help, false), m_val(false)
- {}
+ option_str_limit(options &parent, const pstring &ashort, const pstring &along, const T &defval, std::vector<pstring> &&limit, const pstring &help)
+ : option_str_limit_base(parent, ashort, along, std::move(limit), help), m_val(defval)
+ {
+ }
+
+ T operator ()() const { return m_val; }
- bool operator ()() { return m_val; }
+ pstring as_string() const { return limit()[m_val]; }
protected:
- virtual int parse(const pstring &argument) override;
+ int parse(const pstring &argument) override
+ {
+ auto raw = plib::container::indexof(limit(), argument);
+
+ if (raw != plib::container::npos)
+ {
+ m_val = static_cast<T>(raw);
+ return 0;
+ }
+ else
+ return 1;
+ }
private:
- bool m_val;
+ T m_val;
};
-class option_double : public option
+class option_bool : public option
{
public:
- option_double(options &parent, pstring ashort, pstring along, double defval, pstring help)
- : option(parent, ashort, along, help, true), m_val(defval)
+ option_bool(options &parent, const pstring &ashort, const pstring &along, const pstring &help)
+ : option(parent, ashort, along, help, false), m_val(false)
{}
- double operator ()() { return m_val; }
+ bool operator ()() const { return m_val; }
protected:
- virtual int parse(const pstring &argument) override;
+ int parse(const pstring &argument) override;
private:
- double m_val;
+ bool m_val;
};
-class option_long : public option
+template <typename T>
+class option_num : public option
{
public:
- option_long(options &parent, pstring ashort, pstring along, long defval, pstring help)
- : option(parent, ashort, along, help, true), m_val(defval)
+ option_num(options &parent, const pstring &ashort, const pstring &along, T defval,
+ const pstring &help,
+ T minval = std::numeric_limits<T>::min(),
+ T maxval = std::numeric_limits<T>::max() )
+ : option(parent, ashort, along, help, true)
+ , m_val(defval)
+ , m_min(minval)
+ , m_max(maxval)
{}
- long operator ()() { return m_val; }
+ T operator ()() const { return m_val; }
protected:
- virtual int parse(const pstring &argument) override;
+ int parse(const pstring &argument) override
+ {
+ bool err;
+ m_val = pstonum_ne<T>(argument, err);
+ return (err ? 1 : (m_val < m_min || m_val > m_max));
+ }
private:
- long m_val;
+ T m_val;
+ T m_min;
+ T m_max;
};
class option_vec : public option
{
public:
- option_vec(options &parent, pstring ashort, pstring along, pstring help)
+ option_vec(options &parent, const pstring &ashort, const pstring &along, const pstring &help)
: option(parent, ashort, along, help, true)
{}
- std::vector<pstring> operator ()() { return m_val; }
+ const std::vector<pstring> &operator ()() const { return m_val; }
protected:
- virtual int parse(const pstring &argument) override;
+ int parse(const pstring &argument) override;
private:
std::vector<pstring> m_val;
};
-class options
+class option_args : public option_vec
{
public:
+ option_args(options &parent, const pstring &help)
+ : option_vec(parent, "", "", help)
+ {}
+};
- options();
- explicit options(option *o[]);
+class options : public nocopyassignmove
+{
+public:
- ~options();
+ options();
+ explicit options(option **o);
void register_option(option_base *opt);
- int parse(int argc, char *argv[]);
+ int parse(int argc, char **argv);
- pstring help(pstring description, pstring usage,
- unsigned width = 72, unsigned indent = 20);
+ pstring help(const pstring &description, const pstring &usage,
+ unsigned width = 72, unsigned indent = 20) const;
- pstring app() { return m_app; }
+ pstring app() const { return m_app; }
private:
- static pstring split_paragraphs(pstring text, unsigned width, unsigned indent,
+ static pstring split_paragraphs(const pstring &text, unsigned width, unsigned indent,
unsigned firstline_indent);
- option *getopt_short(pstring arg);
- option *getopt_long(pstring arg);
+ void check_consistency();
+
+ template <typename T>
+ T *getopt_type() const
+ {
+ for (auto & optbase : m_opts )
+ {
+ if (auto opt = dynamic_cast<T *>(optbase))
+ return opt;
+ }
+ return nullptr;
+ }
+
+ option *getopt_short(const pstring &arg) const;
+ option *getopt_long(const pstring &arg) const;
std::vector<option_base *> m_opts;
pstring m_app;
+ option_args * m_other_args;
};
-}
+} // namespace plib
#endif /* POPTIONS_H_ */
diff --git a/src/lib/netlist/plib/pparser.cpp b/src/lib/netlist/plib/pparser.cpp
index 7547572192d..5e1a231da81 100644
--- a/src/lib/netlist/plib/pparser.cpp
+++ b/src/lib/netlist/plib/pparser.cpp
@@ -16,16 +16,6 @@ namespace plib {
// A simple tokenizer
// ----------------------------------------------------------------------------------------
-ptokenizer::ptokenizer(plib::putf8_reader &strm)
-: m_strm(strm), m_lineno(0), m_cur_line(""), m_px(m_cur_line.begin()), m_unget(0), m_string('"')
-{
-}
-
-ptokenizer::~ptokenizer()
-{
-}
-
-
pstring ptokenizer::currentline_str()
{
return m_cur_line;
@@ -34,7 +24,7 @@ pstring ptokenizer::currentline_str()
void ptokenizer::skipeol()
{
- pstring::code_t c = getc();
+ pstring::value_type c = getc();
while (c)
{
if (c == 10)
@@ -49,11 +39,11 @@ void ptokenizer::skipeol()
}
-pstring::code_t ptokenizer::getc()
+pstring::value_type ptokenizer::getc()
{
if (m_unget != 0)
{
- pstring::code_t c = m_unget;
+ pstring::value_type c = m_unget;
m_unget = 0;
return c;
}
@@ -66,11 +56,11 @@ pstring::code_t ptokenizer::getc()
return 0;
return '\n';
}
- pstring::code_t c = *(m_px++);
+ pstring::value_type c = *(m_px++);
return c;
}
-void ptokenizer::ungetc(pstring::code_t c)
+void ptokenizer::ungetc(pstring::value_type c)
{
m_unget = c;
}
@@ -122,6 +112,7 @@ pstring ptokenizer::get_identifier_or_number()
return tok.str();
}
+// FIXME: combine into template
double ptokenizer::get_number_double()
{
token_t tok = get_token();
@@ -129,8 +120,8 @@ double ptokenizer::get_number_double()
{
error(pfmt("Expected a number, got <{1}>")(tok.str()) );
}
- bool err = false;
- double ret = tok.str().as_double(&err);
+ bool err;
+ auto ret = plib::pstonum_ne<double>(tok.str(), err);
if (err)
error(pfmt("Expected a number, got <{1}>")(tok.str()) );
return ret;
@@ -143,8 +134,8 @@ long ptokenizer::get_number_long()
{
error(pfmt("Expected a long int, got <{1}>")(tok.str()) );
}
- bool err = false;
- long ret = tok.str().as_long(&err);
+ bool err;
+ auto ret = plib::pstonum_ne<long>(tok.str(), err);
if (err)
error(pfmt("Expected a long int, got <{1}>")(tok.str()) );
return ret;
@@ -182,7 +173,7 @@ ptokenizer::token_t ptokenizer::get_token()
ptokenizer::token_t ptokenizer::get_token_internal()
{
/* skip ws */
- pstring::code_t c = getc();
+ pstring::value_type c = getc();
while (m_whitespace.find(c) != pstring::npos)
{
c = getc();
@@ -272,28 +263,31 @@ void ptokenizer::error(const pstring &errs)
// A simple preprocessor
// ----------------------------------------------------------------------------------------
-ppreprocessor::ppreprocessor(std::vector<define_t> *defines)
-: m_ifflag(0), m_level(0), m_lineno(0)
+ppreprocessor::ppreprocessor(defines_map_type *defines)
+: pistream()
+, m_ifflag(0)
+, m_level(0)
+, m_lineno(0)
+, m_pos(0)
+, m_state(PROCESS)
+, m_comment(false)
{
- m_expr_sep.push_back("!");
- m_expr_sep.push_back("(");
- m_expr_sep.push_back(")");
- m_expr_sep.push_back("+");
- m_expr_sep.push_back("-");
- m_expr_sep.push_back("*");
- m_expr_sep.push_back("/");
- m_expr_sep.push_back("==");
- m_expr_sep.push_back(" ");
- m_expr_sep.push_back("\t");
+ m_expr_sep.emplace_back("!");
+ m_expr_sep.emplace_back("(");
+ m_expr_sep.emplace_back(")");
+ m_expr_sep.emplace_back("+");
+ m_expr_sep.emplace_back("-");
+ m_expr_sep.emplace_back("*");
+ m_expr_sep.emplace_back("/");
+ m_expr_sep.emplace_back("&&");
+ m_expr_sep.emplace_back("||");
+ m_expr_sep.emplace_back("==");
+ m_expr_sep.emplace_back(" ");
+ m_expr_sep.emplace_back("\t");
- m_defines.insert({"__PLIB_PREPROCESSOR__", define_t("__PLIB_PREPROCESSOR__", "1")});
if (defines != nullptr)
- {
- for (auto & p : *defines)
- {
- m_defines.insert({p.m_name, p});
- }
- }
+ m_defines = *defines;
+ m_defines.insert({"__PLIB_PREPROCESSOR__", define_t("__PLIB_PREPROCESSOR__", "1")});
}
void ppreprocessor::error(const pstring &err)
@@ -301,35 +295,42 @@ void ppreprocessor::error(const pstring &err)
throw pexception("PREPRO ERROR: " + err);
}
+pstream::size_type ppreprocessor::vread(value_type *buf, const pstream::size_type n)
+{
+ size_type bytes = std::min(m_buf.size() - m_pos, n);
+
+ if (bytes==0)
+ return 0;
+
+ std::memcpy(buf, m_buf.c_str() + m_pos, bytes);
+ m_pos += bytes;
+ return bytes;
+}
+
+#define CHECKTOK2(p_op, p_prio) \
+ else if (tok == # p_op) \
+ { \
+ if (prio < (p_prio)) \
+ return val; \
+ start++; \
+ const auto v2 = expr(sexpr, start, (p_prio)); \
+ val = (val p_op v2); \
+ } \
+// Operator precedence see https://en.cppreference.com/w/cpp/language/operator_precedence
-double ppreprocessor::expr(const std::vector<pstring> &sexpr, std::size_t &start, int prio)
+int ppreprocessor::expr(const std::vector<pstring> &sexpr, std::size_t &start, int prio)
{
- double val;
+ int val = 0;
pstring tok=sexpr[start];
if (tok == "(")
{
start++;
- val = expr(sexpr, start, /*prio*/ 0);
+ val = expr(sexpr, start, /*prio*/ 255);
if (sexpr[start] != ")")
error("parsing error!");
start++;
}
- else if (tok == "!")
- {
- start++;
- val = expr(sexpr, start, 90);
- if (val != 0)
- val = 0;
- else
- val = 1;
- }
- else
- {
- tok=sexpr[start];
- val = tok.as_double();
- start++;
- }
while (start < sexpr.size())
{
tok=sexpr[start];
@@ -338,36 +339,25 @@ double ppreprocessor::expr(const std::vector<pstring> &sexpr, std::size_t &start
// FIXME: catch error
return val;
}
- else if (tok == "+")
+ else if (tok == "!")
{
- if (prio > 10)
+ if (prio < 3)
return val;
start++;
- val = val + expr(sexpr, start, 10);
+ val = !expr(sexpr, start, 3);
}
- else if (tok == "-")
- {
- if (prio > 10)
- return val;
- start++;
- val = val - expr(sexpr, start, 10);
- }
- else if (tok == "*")
- {
- start++;
- val = val * expr(sexpr, start, 20);
- }
- else if (tok == "/")
- {
- start++;
- val = val / expr(sexpr, start, 20);
- }
- else if (tok == "==")
+ CHECKTOK2(*, 5)
+ CHECKTOK2(/, 5)
+ CHECKTOK2(+, 6)
+ CHECKTOK2(-, 6)
+ CHECKTOK2(==, 10)
+ CHECKTOK2(&&, 14)
+ CHECKTOK2(||, 15)
+ else
{
- if (prio > 5)
- return val;
+ // FIXME: error handling
+ val = plib::pstonum<decltype(val)>(tok);
start++;
- val = (val == expr(sexpr, start, 5)) ? 1.0 : 0.0;
}
}
return val;
@@ -376,10 +366,7 @@ double ppreprocessor::expr(const std::vector<pstring> &sexpr, std::size_t &start
ppreprocessor::define_t *ppreprocessor::get_define(const pstring &name)
{
auto idx = m_defines.find(name);
- if (idx != m_defines.end())
- return &idx->second;
- else
- return nullptr;
+ return (idx != m_defines.end()) ? &idx->second : nullptr;
}
pstring ppreprocessor::replace_macros(const pstring &line)
@@ -389,78 +376,135 @@ pstring ppreprocessor::replace_macros(const pstring &line)
for (auto & elem : elems)
{
define_t *def = get_define(elem);
- if (def != nullptr)
- ret += def->m_replace;
- else
- ret += elem;
+ ret += (def != nullptr) ? def->m_replace : elem;
}
return ret;
}
-static pstring catremainder(const std::vector<pstring> &elems, std::size_t start, pstring sep)
+static pstring catremainder(const std::vector<pstring> &elems, std::size_t start, const pstring &sep)
{
pstring ret("");
- for (auto & elem : elems)
+ for (std::size_t i = start; i < elems.size(); i++)
{
- ret += elem;
+ ret += elems[i];
ret += sep;
}
return ret;
}
-pstring ppreprocessor::process_line(const pstring &line)
+pstring ppreprocessor::process_comments(pstring line)
+{
+ bool in_string = false;
+
+ std::size_t e = line.size();
+ pstring ret = "";
+ for (std::size_t i=0; i < e; )
+ {
+ pstring c = plib::left(line, 1);
+ line = line.substr(1);
+ if (!m_comment)
+ {
+ if (c=="\"")
+ {
+ in_string = !in_string;
+ ret += c;
+ }
+ else if (in_string && c=="\\")
+ {
+ i++;
+ ret += (c + plib::left(line, 1));
+ line = line.substr(1);
+ }
+ else if (!in_string && c=="/" && plib::left(line,1) == "*")
+ m_comment = true;
+ else if (!in_string && c=="/" && plib::left(line,1) == "/")
+ break;
+ else
+ ret += c;
+ }
+ else
+ if (c=="*" && plib::left(line,1) == "/")
+ {
+ i++;
+ line = line.substr(1);
+ m_comment = false;
+ }
+ i++;
+ }
+ return ret;
+}
+
+pstring ppreprocessor::process_line(pstring line)
{
- pstring lt = line.replace_all("\t"," ").trim();
+ bool line_cont = plib::right(line, 1) == "\\";
+ if (line_cont)
+ line = plib::left(line, line.size() - 1);
+
+ if (m_state == LINE_CONTINUATION)
+ m_line += line;
+ else
+ m_line = line;
+
+ if (line_cont)
+ {
+ m_state = LINE_CONTINUATION;
+ return "";
+ }
+ else
+ m_state = PROCESS;
+
+ line = process_comments(m_line);
+
+ pstring lt = plib::trim(plib::replace_all(line, pstring("\t"), pstring(" ")));
pstring ret;
- m_lineno++;
// FIXME ... revise and extend macro handling
- if (lt.startsWith("#"))
+ if (plib::startsWith(lt, "#"))
{
std::vector<pstring> lti(psplit(lt, " ", true));
- if (lti[0].equals("#if"))
+ if (lti[0] == "#if")
{
m_level++;
std::size_t start = 0;
lt = replace_macros(lt);
- std::vector<pstring> t(psplit(lt.substr(3).replace_all(" ",""), m_expr_sep));
- int val = static_cast<int>(expr(t, start, 0));
+ std::vector<pstring> t(psplit(replace_all(lt.substr(3), pstring(" "), pstring("")), m_expr_sep));
+ auto val = static_cast<int>(expr(t, start, 255));
if (val == 0)
m_ifflag |= (1 << m_level);
}
- else if (lti[0].equals("#ifdef"))
+ else if (lti[0] == "#ifdef")
{
m_level++;
if (get_define(lti[1]) == nullptr)
m_ifflag |= (1 << m_level);
}
- else if (lti[0].equals("#ifndef"))
+ else if (lti[0] == "#ifndef")
{
m_level++;
if (get_define(lti[1]) != nullptr)
m_ifflag |= (1 << m_level);
}
- else if (lti[0].equals("#else"))
+ else if (lti[0] == "#else")
{
m_ifflag ^= (1 << m_level);
}
- else if (lti[0].equals("#endif"))
+ else if (lti[0] == "#endif")
{
m_ifflag &= ~(1 << m_level);
m_level--;
}
- else if (lti[0].equals("#include"))
+ else if (lti[0] == "#include")
{
// ignore
}
- else if (lti[0].equals("#pragma"))
+ else if (lti[0] == "#pragma")
{
- if (m_ifflag == 0 && lti.size() > 3 && lti[1].equals("NETLIST"))
+ if (m_ifflag == 0 && lti.size() > 3 && lti[1] == "NETLIST")
{
- if (lti[2].equals("warning"))
+ if (lti[2] == "warning")
error("NETLIST: " + catremainder(lti, 3, " "));
}
}
- else if (lti[0].equals("#define"))
+ else if (lti[0] == "#define")
{
if (m_ifflag == 0)
{
@@ -470,28 +514,20 @@ pstring ppreprocessor::process_line(const pstring &line)
}
}
else
- error(pfmt("unknown directive on line {1}: {2}")(m_lineno)(line));
+ {
+ if (m_ifflag == 0)
+ error(pfmt("unknown directive on line {1}: {2}")(m_lineno)(replace_macros(line)));
+ }
}
else
{
lt = replace_macros(lt);
if (m_ifflag == 0)
- {
ret += lt;
- }
}
return ret;
}
-void ppreprocessor::process(putf8_reader &istrm, putf8_writer &ostrm)
-{
- pstring line;
- while (istrm.readline(line))
- {
- line = process_line(line);
- ostrm.writeline(line);
- }
-}
-}
+} // namespace plib
diff --git a/src/lib/netlist/plib/pparser.h b/src/lib/netlist/plib/pparser.h
index 7ec517255c8..1eca20e99ad 100644
--- a/src/lib/netlist/plib/pparser.h
+++ b/src/lib/netlist/plib/pparser.h
@@ -8,20 +8,27 @@
#ifndef PPARSER_H_
#define PPARSER_H_
-#include "pstring.h"
#include "plists.h"
#include "pstream.h"
+#include "pstring.h"
-#include <unordered_map>
#include <cstdint>
+#include <unordered_map>
+
namespace plib {
-class ptokenizer : nocopyassignmove
+class ptokenizer
{
public:
- explicit ptokenizer(plib::putf8_reader &strm);
+ template <typename T>
+ ptokenizer(T &&strm) // NOLINT(misc-forwarding-reference-overload, bugprone-forwarding-reference-overload)
+ : m_strm(std::forward<T>(strm)), m_lineno(0), m_cur_line(""), m_px(m_cur_line.begin()), m_unget(0), m_string('"')
+ {
+ }
+
+ COPYASSIGNMOVE(ptokenizer, delete)
- virtual ~ptokenizer();
+ virtual ~ptokenizer() = default;
enum token_type
{
@@ -91,22 +98,23 @@ public:
void require_token(const token_id_t &token_num);
void require_token(const token_t &tok, const token_id_t &token_num);
- token_id_t register_token(pstring token)
+ token_id_t register_token(const pstring &token)
{
token_id_t ret(m_tokens.size());
m_tokens.emplace(token, ret);
return ret;
}
- void set_identifier_chars(pstring s) { m_identifier_chars = s; }
- void set_number_chars(pstring st, pstring rem) { m_number_chars_start = st; m_number_chars = rem; }
- void set_string_char(pstring::code_t c) { m_string = c; }
- void set_whitespace(pstring s) { m_whitespace = s; }
- void set_comment(pstring start, pstring end, pstring line)
+ ptokenizer & identifier_chars(pstring s) { m_identifier_chars = std::move(s); return *this; }
+ ptokenizer & number_chars(pstring st, pstring rem) { m_number_chars_start = std::move(st); m_number_chars = std::move(rem); return *this; }
+ ptokenizer & string_char(pstring::value_type c) { m_string = c; return *this; }
+ ptokenizer & whitespace(pstring s) { m_whitespace = std::move(s); return *this; }
+ ptokenizer & comment(const pstring &start, const pstring &end, const pstring &line)
{
m_tok_comment_start = register_token(start);
m_tok_comment_end = register_token(end);
m_tok_line_comment = register_token(line);
+ return *this;
}
token_t get_token_internal();
@@ -118,17 +126,17 @@ protected:
private:
void skipeol();
- pstring::code_t getc();
- void ungetc(pstring::code_t c);
+ pstring::value_type getc();
+ void ungetc(pstring::value_type c);
bool eof() { return m_strm.eof(); }
- putf8_reader &m_strm;
+ putf8_reader m_strm;
int m_lineno;
pstring m_cur_line;
pstring::const_iterator m_px;
- pstring::code_t m_unget;
+ pstring::value_type m_unget;
/* tokenizer stuff follows ... */
@@ -137,7 +145,7 @@ private:
pstring m_number_chars_start;
std::unordered_map<pstring, token_id_t> m_tokens;
pstring m_whitespace;
- pstring::code_t m_string;
+ pstring::value_type m_string;
token_id_t m_tok_comment_start;
token_id_t m_tok_comment_end;
@@ -145,7 +153,7 @@ private:
};
-class ppreprocessor : plib::nocopyassignmove
+class ppreprocessor : public pistream
{
public:
@@ -158,29 +166,80 @@ public:
pstring m_replace;
};
- explicit ppreprocessor(std::vector<define_t> *defines = nullptr);
- virtual ~ppreprocessor() {}
+ using defines_map_type = std::unordered_map<pstring, define_t>;
+
+ explicit ppreprocessor(defines_map_type *defines = nullptr);
+ ~ppreprocessor() override = default;
+
+ template <typename T>
+ ppreprocessor & process(T &&istrm)
+ {
+ putf8_reader reader(std::forward<T>(istrm));
+ pstring line;
+ while (reader.readline(line))
+ {
+ m_lineno++;
+ line = process_line(line);
+ m_buf += decltype(m_buf)(line.c_str()) + static_cast<char>(10);
+ }
+ return *this;
+ }
+
+ COPYASSIGN(ppreprocessor, delete)
+ ppreprocessor &operator=(ppreprocessor &&src) = delete;
- void process(putf8_reader &istrm, putf8_writer &ostrm);
+
+ ppreprocessor(ppreprocessor &&s) noexcept
+ : m_defines(std::move(s.m_defines))
+ , m_expr_sep(std::move(s.m_expr_sep))
+ , m_ifflag(s.m_ifflag)
+ , m_level(s.m_level)
+ , m_lineno(s.m_lineno)
+ , m_buf(std::move(s.m_buf))
+ , m_pos(s.m_pos)
+ , m_state(s.m_state)
+ , m_comment(s.m_comment)
+ {
+ }
protected:
- double expr(const std::vector<pstring> &sexpr, std::size_t &start, int prio);
+
+ size_type vread(value_type *buf, const size_type n) override;
+ void vseek(const pos_type n) override
+ {
+ plib::unused_var(n);
+ /* FIXME throw exception - should be done in base unless implemented */
+ }
+ pos_type vtell() const override { return m_pos; }
+
+ int expr(const std::vector<pstring> &sexpr, std::size_t &start, int prio);
define_t *get_define(const pstring &name);
pstring replace_macros(const pstring &line);
virtual void error(const pstring &err);
private:
- pstring process_line(const pstring &line);
+ enum state_e
+ {
+ PROCESS,
+ LINE_CONTINUATION
+ };
+ pstring process_line(pstring line);
+ pstring process_comments(pstring line);
- std::unordered_map<pstring, define_t> m_defines;
+ defines_map_type m_defines;
std::vector<pstring> m_expr_sep;
std::uint_least64_t m_ifflag; // 31 if levels
int m_level;
int m_lineno;
+ pstring_t<pu8_traits> m_buf;
+ pos_type m_pos;
+ state_e m_state;
+ pstring m_line;
+ bool m_comment;
};
-}
+} // namespace plib
#endif /* PPARSER_H_ */
diff --git a/src/lib/netlist/plib/ppmf.h b/src/lib/netlist/plib/ppmf.h
index dc151d5d6a6..9c5329cccde 100644
--- a/src/lib/netlist/plib/ppmf.h
+++ b/src/lib/netlist/plib/ppmf.h
@@ -10,9 +10,8 @@
#include "pconfig.h"
-#include <utility>
#include <cstdint>
-
+#include <utility>
/*
*
@@ -70,7 +69,8 @@ namespace plib {
using generic_function = void (*)();
template<typename MemberFunctionType>
- mfp(MemberFunctionType mftp)
+ mfp(MemberFunctionType mftp) // NOLINT(cppcoreguidelines-pro-type-member-init)
+
: m_function(0), m_this_delta(0), m_size(sizeof(mfp))
{
*reinterpret_cast<MemberFunctionType *>(this) = mftp;
@@ -82,7 +82,7 @@ namespace plib {
mfp mfpo(mftp);
//return mfpo.update_after_bind<FunctionType>(object);
generic_function rfunc(nullptr);
- generic_class *robject = reinterpret_cast<generic_class *>(object);
+ auto robject = reinterpret_cast<generic_class *>(object);
mfpo.convert_to_generic(rfunc, robject);
func = reinterpret_cast<FunctionType>(rfunc);
object = reinterpret_cast<ObjectType *>(robject);
@@ -95,7 +95,8 @@ namespace plib {
if (PHAS_PMF_INTERNAL == 1)
{
// apply the "this" delta to the object first
- generic_class * o_p_delta = reinterpret_cast<generic_class *>(reinterpret_cast<std::uint8_t *>(object) + m_this_delta);
+ // NOLINTNEXTLINE(clang-analyzer-core.UndefinedBinaryOperatorResult)
+ auto o_p_delta = reinterpret_cast<generic_class *>(reinterpret_cast<std::uint8_t *>(object) + m_this_delta);
// if the low bit of the vtable index is clear, then it is just a raw function pointer
if (!(m_function & 1))
@@ -241,23 +242,28 @@ namespace plib {
{
public:
class generic_class;
+
+ template <class C>
+ using MemberFunctionType = R (C::*)(Targs...);
+
pmfp() : pmfp_base<R, Targs...>(), m_obj(nullptr) {}
- template<typename MemberFunctionType, typename O>
- pmfp(MemberFunctionType mftp, O *object)
+ template<typename O>
+ pmfp(MemberFunctionType<O> mftp, O *object)
: pmfp_base<R, Targs...>()
{
this->set(mftp, object);
}
- template<typename MemberFunctionType, typename O>
- void set(MemberFunctionType mftp, O *object)
+
+ template<typename O>
+ void set(MemberFunctionType<O> mftp, O *object)
{
this->set_base(mftp, object);
m_obj = reinterpret_cast<generic_class *>(object);
}
- inline R operator()(Targs... args)
+ inline R operator()(Targs ... args)
{
return this->call(m_obj, std::forward<Targs>(args)...);
}
@@ -269,6 +275,6 @@ namespace plib {
};
-}
+} // namespace plib
#endif /* PPMF_H_ */
diff --git a/src/lib/netlist/plib/pstate.cpp b/src/lib/netlist/plib/pstate.cpp
index 043033ed1ea..3bd93ed4f8e 100644
--- a/src/lib/netlist/plib/pstate.cpp
+++ b/src/lib/netlist/plib/pstate.cpp
@@ -9,17 +9,6 @@
#include "palloc.h"
namespace plib {
-state_manager_t::state_manager_t()
-{
-}
-
-state_manager_t::~state_manager_t()
-{
- m_save.clear();
- m_custom.clear();
-}
-
-
void state_manager_t::save_state_ptr(const void *owner, const pstring &stname, const datatype_t &dt, const std::size_t count, void *ptr)
{
@@ -29,46 +18,40 @@ void state_manager_t::save_state_ptr(const void *owner, const pstring &stname, c
void state_manager_t::remove_save_items(const void *owner)
{
- for (auto i = m_save.begin(); i != m_save.end(); )
+ auto i = m_save.end();
+ while (i != m_save.begin())
{
+ i--;
if (i->get()->m_owner == owner)
i = m_save.erase(i);
- else
- i++;
}
- for (auto i = m_custom.begin(); i != m_custom.end(); )
+ i = m_custom.end();
+ while (i > m_custom.begin())
{
+ i--;
if (i->get()->m_owner == owner)
i = m_custom.erase(i);
- else
- i++;
}
}
void state_manager_t::pre_save()
{
for (auto & s : m_custom)
- s->m_callback->on_pre_save();
+ s->m_callback->on_pre_save(*this);
}
void state_manager_t::post_load()
{
for (auto & s : m_custom)
- s->m_callback->on_post_load();
+ s->m_callback->on_post_load(*this);
}
template<> void state_manager_t::save_item(const void *owner, callback_t &state, const pstring &stname)
{
- //save_state_ptr(stname, DT_CUSTOM, 0, 1, &state);
callback_t *state_p = &state;
auto p = plib::make_unique<entry_t>(stname, owner, state_p);
m_custom.push_back(std::move(p));
state.register_state(*this, stname);
}
-state_manager_t::callback_t::~callback_t()
-{
-}
-
-
-}
+} // namespace plib
diff --git a/src/lib/netlist/plib/pstate.h b/src/lib/netlist/plib/pstate.h
index 9757d6408b7..ac75ca6b69e 100644
--- a/src/lib/netlist/plib/pstate.h
+++ b/src/lib/netlist/plib/pstate.h
@@ -8,11 +8,13 @@
#ifndef PSTATE_H_
#define PSTATE_H_
+#include "palloc.h"
#include "pstring.h"
#include "ptypes.h"
-#include <vector>
+#include <array>
#include <memory>
+#include <vector>
// ----------------------------------------------------------------------------------------
// state saving ...
@@ -38,32 +40,31 @@ public:
const bool is_custom;
};
- template<typename T> struct datatype_f
+ template<typename T>
+ static datatype_t dtype()
{
- static inline const datatype_t f()
- {
- return datatype_t(sizeof(T),
- plib::is_integral<T>::value || std::is_enum<T>::value,
- std::is_floating_point<T>::value);
- }
- };
+ return datatype_t(sizeof(T),
+ plib::is_integral<T>::value || std::is_enum<T>::value,
+ std::is_floating_point<T>::value);
+ }
class callback_t
{
public:
using list_t = std::vector<callback_t *>;
- virtual ~callback_t();
-
virtual void register_state(state_manager_t &manager, const pstring &module) = 0;
- virtual void on_pre_save() = 0;
- virtual void on_post_load() = 0;
+ virtual void on_pre_save(state_manager_t &manager) = 0;
+ virtual void on_post_load(state_manager_t &manager) = 0;
protected:
+ callback_t() = default;
+ ~callback_t() = default;
+ COPYASSIGNMOVE(callback_t, default)
};
struct entry_t
{
- using list_t = std::vector<std::unique_ptr<entry_t>>;
+ using list_t = std::vector<plib::unique_ptr<entry_t>>;
entry_t(const pstring &stname, const datatype_t &dt, const void *owner,
const std::size_t count, void *ptr)
@@ -72,8 +73,6 @@ public:
entry_t(const pstring &stname, const void *owner, callback_t *callback)
: m_name(stname), m_dt(datatype_t(true)), m_owner(owner), m_callback(callback), m_count(0), m_ptr(nullptr) { }
- ~entry_t() { }
-
pstring m_name;
const datatype_t m_dt;
const void * m_owner;
@@ -82,35 +81,49 @@ public:
void * m_ptr;
};
- state_manager_t();
- ~state_manager_t();
+ state_manager_t() = default;
- template<typename C> void save_item(const void *owner, C &state, const pstring &stname)
+ template<typename C>
+ void save_item(const void *owner, C &state, const pstring &stname)
{
- save_state_ptr( owner, stname, datatype_f<C>::f(), 1, &state);
+ save_state_ptr( owner, stname, dtype<C>(), 1, &state);
}
- template<typename C, std::size_t N> void save_item(const void *owner, C (&state)[N], const pstring &stname)
+ template<typename C, std::size_t N>
+ void save_item(const void *owner, C (&state)[N], const pstring &stname) // NOLINT(cppcoreguidelines-avoid-c-arrays, modernize-avoid-c-arrays)
{
- save_state_ptr(owner, stname, datatype_f<C>::f(), N, &(state[0]));
+ save_state_ptr(owner, stname, dtype<C>(), N, &(state[0]));
}
- template<typename C> void save_item(const void *owner, C *state, const pstring &stname, const std::size_t count)
+ template<typename C>
+ void save_item(const void *owner, C *state, const pstring &stname, const std::size_t count)
{
- save_state_ptr(owner, stname, datatype_f<C>::f(), count, state);
+ save_state_ptr(owner, stname, dtype<C>(), count, state);
}
template<typename C>
void save_item(const void *owner, std::vector<C> &v, const pstring &stname)
{
- save_state(v.data(), owner, stname, v.size());
+ save_state_ptr(owner, stname, dtype<C>(), v.size(), v.data());
+ }
+
+ template<typename C, std::size_t N>
+ void save_item(const void *owner, std::array<C, N> &a, const pstring &stname)
+ {
+ save_state_ptr(owner, stname, dtype<C>(), N, a.data());
}
void pre_save();
void post_load();
void remove_save_items(const void *owner);
- const entry_t::list_t &save_list() const { return m_save; }
+ const std::vector<const entry_t *> save_list() const
+ {
+ std::vector<const entry_t *> ret;
+ for (auto &i : m_save)
+ ret.push_back(i.get());
+ return ret;
+ }
void save_state_ptr(const void *owner, const pstring &stname, const datatype_t &dt, const std::size_t count, void *ptr);
@@ -124,6 +137,6 @@ private:
template<> void state_manager_t::save_item(const void *owner, callback_t &state, const pstring &stname);
-}
+} // namespace plib
#endif /* PSTATE_H_ */
diff --git a/src/lib/netlist/plib/pstream.cpp b/src/lib/netlist/plib/pstream.cpp
index 420f63c9e5e..a7acdaafb52 100644
--- a/src/lib/netlist/plib/pstream.cpp
+++ b/src/lib/netlist/plib/pstream.cpp
@@ -8,9 +8,9 @@
#include "pstream.h"
#include "palloc.h"
+#include <algorithm>
#include <cstdio>
#include <cstdlib>
-#include <algorithm>
// VS2015 prefers _dup
#ifdef _WIN32
@@ -21,34 +21,14 @@
namespace plib {
-pstream::~pstream()
-{
-}
-
// -----------------------------------------------------------------------------
// pistream: input stream
// -----------------------------------------------------------------------------
-pistream::~pistream()
-{
-}
-
// -----------------------------------------------------------------------------
// postream: output stream
// -----------------------------------------------------------------------------
-postream::~postream()
-{
-}
-
-void postream::write(pistream &strm)
-{
- char buf[1024];
- pos_type r;
- while ((r=strm.read(buf, 1024)) > 0)
- write(buf, r);
-}
-
// -----------------------------------------------------------------------------
// Input file stream
// -----------------------------------------------------------------------------
@@ -91,7 +71,7 @@ pifilestream::~pifilestream()
}
}
-pifilestream::pos_type pifilestream::vread(void *buf, const pos_type n)
+pifilestream::pos_type pifilestream::vread(value_type *buf, const pos_type n)
{
pos_type r = fread(buf, 1, n, static_cast<FILE *>(m_file));
if (r < n)
@@ -119,7 +99,7 @@ void pifilestream::vseek(const pos_type n)
throw file_e("Generic file operation failed: {}", m_filename);
}
-pifilestream::pos_type pifilestream::vtell()
+pifilestream::pos_type pifilestream::vtell() const
{
long ret = ftell(static_cast<FILE *>(m_file));
if (ret < 0)
@@ -140,10 +120,6 @@ pstdin::pstdin()
/* nothing to do */
}
-pstdin::~pstdin()
-{
-}
-
// -----------------------------------------------------------------------------
// Output file stream
// -----------------------------------------------------------------------------
@@ -180,12 +156,11 @@ pofilestream::~pofilestream()
}
}
-void pofilestream::vwrite(const void *buf, const pos_type n)
+void pofilestream::vwrite(const value_type *buf, const pos_type n)
{
std::size_t r = fwrite(buf, 1, n, static_cast<FILE *>(m_file));
if (r < n)
{
- //printf("%ld %ld %s\n", r, n, strerror(errno));
if (ferror(static_cast<FILE *>(m_file)))
throw file_write_e(m_filename);
}
@@ -204,7 +179,7 @@ void pofilestream::vseek(const pos_type n)
}
}
-pstream::pos_type pofilestream::vtell()
+pstream::pos_type pofilestream::vtell() const
{
std::ptrdiff_t ret = ftell(static_cast<FILE *>(m_file));
if (ret < 0)
@@ -215,11 +190,6 @@ pstream::pos_type pofilestream::vtell()
return static_cast<pos_type>(ret);
}
-postringstream::~postringstream()
-{
-}
-
-
// -----------------------------------------------------------------------------
// pstderr: write to stderr
// -----------------------------------------------------------------------------
@@ -233,10 +203,6 @@ pstderr::pstderr()
{
}
-pstderr::~pstderr()
-{
-}
-
// -----------------------------------------------------------------------------
// pstdout: write to stdout
// -----------------------------------------------------------------------------
@@ -250,35 +216,32 @@ pstdout::pstdout()
{
}
-pstdout::~pstdout()
-{
-}
-
// -----------------------------------------------------------------------------
// Memory stream
// -----------------------------------------------------------------------------
pimemstream::pimemstream(const void *mem, const pos_type len)
- : pistream(FLAG_SEEKABLE), m_pos(0), m_len(len), m_mem(static_cast<const pstring::mem_t *>(mem))
+ : pistream(FLAG_SEEKABLE), m_pos(0), m_len(len), m_mem(static_cast<const char *>(mem))
{
}
-pimemstream::pimemstream(const pomemstream &ostrm)
-: pistream(FLAG_SEEKABLE), m_pos(0), m_len(ostrm.size()), m_mem(reinterpret_cast<pstring::mem_t *>(ostrm.memory()))
+pimemstream::pimemstream()
+ : pistream(FLAG_SEEKABLE), m_pos(0), m_len(0), m_mem(static_cast<const char *>(nullptr))
{
}
-pimemstream::~pimemstream()
+pimemstream::pimemstream(const pomemstream &ostrm)
+: pistream(FLAG_SEEKABLE), m_pos(0), m_len(ostrm.size()), m_mem(reinterpret_cast<const char *>(ostrm.memory()))
{
}
-pimemstream::pos_type pimemstream::vread(void *buf, const pos_type n)
+pimemstream::pos_type pimemstream::vread(value_type *buf, const pos_type n)
{
pos_type ret = (m_pos + n <= m_len) ? n : m_len - m_pos;
if (ret > 0)
{
- std::copy(m_mem + m_pos, m_mem + m_pos + ret, static_cast<char *>(buf));
+ std::copy(m_mem + m_pos, m_mem + m_pos + ret, reinterpret_cast<char *>(buf));
m_pos += ret;
}
@@ -295,78 +258,45 @@ void pimemstream::vseek(const pos_type n)
}
-pimemstream::pos_type pimemstream::vtell()
+pimemstream::pos_type pimemstream::vtell() const
{
return m_pos;
}
-pistringstream::~pistringstream()
-{
-}
-
// -----------------------------------------------------------------------------
// Output memory stream
// -----------------------------------------------------------------------------
pomemstream::pomemstream()
-: postream(FLAG_SEEKABLE), m_pos(0), m_capacity(1024), m_size(0)
-{
- m_mem = palloc_array<char>(m_capacity);
-}
-
-pomemstream::~pomemstream()
+: postream(FLAG_SEEKABLE), m_pos(0), m_mem(1024)
{
- pfree_array(m_mem);
+ m_mem.clear();
}
-void pomemstream::vwrite(const void *buf, const pos_type n)
+void pomemstream::vwrite(const value_type *buf, const pos_type n)
{
- if (m_pos + n >= m_capacity)
- {
- while (m_pos + n >= m_capacity)
- m_capacity *= 2;
- char *o = m_mem;
- m_mem = palloc_array<char>(m_capacity);
- if (m_mem == nullptr)
- {
- throw out_of_mem_e("pomemstream::vwrite");
- }
- std::copy(o, o + m_pos, m_mem);
- pfree_array(o);
- }
+ if (m_pos + n >= m_mem.size())
+ m_mem.resize(m_pos + n);
- std::copy(static_cast<const char *>(buf), static_cast<const char *>(buf) + n, m_mem + m_pos);
+ std::copy(buf, buf + n, &m_mem[0] + m_pos);
m_pos += n;
- m_size = std::max(m_pos, m_size);
}
void pomemstream::vseek(const pos_type n)
{
m_pos = n;
- m_size = std::max(m_pos, m_size);
- if (m_size >= m_capacity)
- {
- while (m_size >= m_capacity)
- m_capacity *= 2;
- char *o = m_mem;
- m_mem = palloc_array<char>(m_capacity);
- if (m_mem == nullptr)
- {
- throw out_of_mem_e("pomemstream::vseek");
- }
- std::copy(o, o + m_pos, m_mem);
- pfree_array(o);
- }
+ if (m_pos>=m_mem.size())
+ m_mem.resize(m_pos);
}
-pstream::pos_type pomemstream::vtell()
+pstream::pos_type pomemstream::vtell() const
{
return m_pos;
}
bool putf8_reader::readline(pstring &line)
{
- pstring::code_t c = 0;
+ putf8string::code_t c = 0;
m_linebuf = "";
if (!this->readcode(c))
{
@@ -378,23 +308,14 @@ bool putf8_reader::readline(pstring &line)
if (c == 10)
break;
else if (c != 13) /* ignore CR */
- m_linebuf += pstring(c);
+ m_linebuf += putf8string(c);
if (!this->readcode(c))
break;
}
- line = m_linebuf;
+ line = m_linebuf.c_str();
return true;
}
-putf8_fmt_writer::putf8_fmt_writer(postream &strm)
-: pfmt_writer_t()
-, putf8_writer(strm)
-{
-}
-
-putf8_fmt_writer::~putf8_fmt_writer()
-{
-}
void putf8_fmt_writer::vdowrite(const pstring &ls) const
{
@@ -403,4 +324,4 @@ void putf8_fmt_writer::vdowrite(const pstring &ls) const
-}
+} // namespace plib
diff --git a/src/lib/netlist/plib/pstream.h b/src/lib/netlist/plib/pstream.h
index 3e9ee99cba0..93497eb1423 100644
--- a/src/lib/netlist/plib/pstream.h
+++ b/src/lib/netlist/plib/pstream.h
@@ -7,46 +7,76 @@
#ifndef PSTREAM_H_
#define PSTREAM_H_
+
+#include "palloc.h"
#include "pconfig.h"
-#include "pstring.h"
-#include "pfmtlog.h"
#include "pexception.h"
+#include "pfmtlog.h"
+#include "pstring.h"
+
+#define USE_CSTREAM (0)
+#include <array>
+#include <type_traits>
#include <vector>
+#if USE_CSTREAM
+#include <fstream>
+//#include <strstream>
+#include <sstream>
+#endif
+
namespace plib {
+
+#if USE_CSTREAM
+typedef std::ostream postream;
+typedef std::ofstream pofilestream;
+typedef std::ostringstream postringstream;
+typedef std::ostringstream pomemstream;
+
+#endif
+
// -----------------------------------------------------------------------------
// pstream: things common to all streams
// -----------------------------------------------------------------------------
-class pstream : nocopyassignmove
+class pstream
{
public:
using pos_type = std::size_t;
+ using size_type = std::size_t;
static constexpr pos_type SEEK_EOF = static_cast<pos_type>(-1);
+ COPYASSIGN(pstream, delete)
+ pstream &operator=(pstream &&) noexcept = delete;
+
bool seekable() const { return ((m_flags & FLAG_SEEKABLE) != 0); }
- void seek(const pos_type n)
+ void seekp(const pos_type n)
{
- return vseek(n);
+ vseek(n);
}
- pos_type tell()
+ pos_type tellp() const
{
return vtell();
}
protected:
+ pstream() : m_flags(0)
+ {
+ }
explicit pstream(const unsigned flags) : m_flags(flags)
{
}
- ~pstream();
+ pstream(pstream &&src) noexcept = default;
+
+ virtual ~pstream() = default;
virtual void vseek(const pos_type n) = 0;
- virtual pos_type vtell() = 0;
+ virtual pos_type vtell() const = 0;
static constexpr unsigned FLAG_EOF = 0x01;
static constexpr unsigned FLAG_SEEKABLE = 0x04;
@@ -69,51 +99,71 @@ private:
// pistream: input stream
// -----------------------------------------------------------------------------
-class pistream : public pstream
+template <typename T>
+class pistream_base : public pstream
{
public:
- virtual ~pistream();
+ using value_type = T;
+
+ ~pistream_base() noexcept override = default;
+
+ COPYASSIGN(pistream_base, delete)
+ pistream_base &operator=(pistream_base &&src) noexcept = delete;
bool eof() const { return ((flags() & FLAG_EOF) != 0); }
- pos_type read(void *buf, const pos_type n)
+ pos_type read(T *buf, const pos_type n)
{
return vread(buf, n);
}
protected:
- explicit pistream(const unsigned flags) : pstream(flags) {}
- /* read up to n bytes from stream */
- virtual pos_type vread(void *buf, const pos_type n) = 0;
+ pistream_base() : pstream(0) {}
+ explicit pistream_base(const unsigned flags) : pstream(flags) {}
+ pistream_base(pistream_base &&src) noexcept : pstream(std::move(src)) {}
+ /* read up to n bytes from stream */
+ virtual size_type vread(T *buf, const size_type n) = 0;
};
+using pistream = pistream_base<char>;
+
// -----------------------------------------------------------------------------
// postream: output stream
// -----------------------------------------------------------------------------
-class postream : public pstream
+#if !USE_CSTREAM
+template <typename T>
+class postream_base : public pstream
{
public:
- virtual ~postream();
+ using value_type = T;
+
+ postream_base() = default;
+ ~postream_base() noexcept override = default;
+
+ COPYASSIGN(postream_base, delete)
+ postream_base &operator=(postream_base &&src) noexcept = delete;
- void write(const void *buf, const pos_type n)
+ void write(const T *buf, const size_type n)
{
vwrite(buf, n);
}
- void write(pistream &strm);
-
protected:
- explicit postream(unsigned flags) : pstream(flags) {}
+ explicit postream_base(unsigned flags) : pstream(flags) {}
+ postream_base(postream_base &&src) noexcept : pstream(std::move(src)) {}
+
/* write n bytes to stream */
- virtual void vwrite(const void *buf, const pos_type n) = 0;
+ virtual void vwrite(const T *buf, const size_type n) = 0;
private:
};
+using postream = postream_base<char>;
+
// -----------------------------------------------------------------------------
// pomemstream: output string stream
// -----------------------------------------------------------------------------
@@ -123,22 +173,31 @@ class pomemstream : public postream
public:
pomemstream();
- virtual ~pomemstream() override;
- char *memory() const { return m_mem; }
- pos_type size() const { return m_size; }
+ COPYASSIGN(pomemstream, delete)
+
+ pomemstream(pomemstream &&src) noexcept
+ : postream(std::move(src))
+ , m_pos(src.m_pos)
+ , m_mem(std::move(src.m_mem))
+ {
+ }
+ pomemstream &operator=(pomemstream &&src) = delete;
+
+ ~pomemstream() override = default;
+
+ const char *memory() const { return m_mem.data(); }
+ pos_type size() const { return m_mem.size(); }
protected:
/* write n bytes to stream */
- virtual void vwrite(const void *buf, const pos_type) override;
- virtual void vseek(const pos_type n) override;
- virtual pos_type vtell() override;
+ void vwrite(const value_type *buf, const pos_type) override;
+ void vseek(const pos_type n) override;
+ pos_type vtell() const override;
private:
pos_type m_pos;
- pos_type m_capacity;
- pos_type m_size;
- char *m_mem;
+ std::vector<char> m_mem;
};
class postringstream : public postream
@@ -146,18 +205,26 @@ class postringstream : public postream
public:
postringstream() : postream(0) { }
- virtual ~postringstream() override;
+ postringstream(postringstream &&src) noexcept
+ : postream(std::move(src))
+ , m_buf(std::move(src.m_buf))
+ { src.m_buf = ""; }
+
+ COPYASSIGN(postringstream, delete)
+ postringstream &operator=(postringstream &&src) = delete;
+
+ ~postringstream() override = default;
const pstring &str() { return m_buf; }
protected:
/* write n bytes to stream */
- virtual void vwrite(const void *buf, const pos_type n) override
+ void vwrite(const value_type *buf, const pos_type n) override
{
- m_buf += pstring(static_cast<const pstring::mem_t *>(buf), n, pstring::UTF8);
+ m_buf += pstring(reinterpret_cast<const pstring::mem_t *>(buf), n);
}
- virtual void vseek(const pos_type n) override { }
- virtual pos_type vtell() override { return m_buf.mem_t_size(); }
+ void vseek(const pos_type n) override { unused_var(n); }
+ pos_type vtell() const override { return m_buf.size(); }
private:
pstring m_buf;
@@ -171,15 +238,28 @@ class pofilestream : public postream
{
public:
- explicit pofilestream(const pstring &fname);
- virtual ~pofilestream() override;
+ pofilestream(const pstring &fname);
+ pofilestream(pofilestream &&src) noexcept
+ : postream(std::move(src))
+ , m_file(src.m_file)
+ , m_pos(src.m_pos)
+ , m_actually_close(src.m_actually_close)
+ , m_filename(std::move(src.m_filename))
+ {
+ src.m_file = nullptr;
+ src.m_actually_close = false;
+ }
+ COPYASSIGN(pofilestream, delete)
+ pofilestream &operator=(pofilestream &&src) = delete;
+
+ ~pofilestream() override;
protected:
pofilestream(void *file, const pstring &name, const bool do_close);
/* write n bytes to stream */
- virtual void vwrite(const void *buf, const pos_type n) override;
- virtual void vseek(const pos_type n) override;
- virtual pos_type vtell() override;
+ void vwrite(const value_type *buf, const pos_type n) override;
+ void vseek(const pos_type n) override;
+ pos_type vtell() const override;
private:
void *m_file;
@@ -193,12 +273,17 @@ private:
// -----------------------------------------------------------------------------
// pstderr: write to stderr
// -----------------------------------------------------------------------------
+#endif
class pstderr : public pofilestream
{
public:
pstderr();
- virtual ~pstderr();
+ pstderr(pstderr &&src) noexcept = default;
+ pstderr &operator=(pstderr &&src) = delete;
+ COPYASSIGN(pstderr, delete)
+
+ ~pstderr() noexcept override= default;
};
// -----------------------------------------------------------------------------
@@ -209,7 +294,11 @@ class pstdout : public pofilestream
{
public:
pstdout();
- virtual ~pstdout();
+ pstdout(pstdout &&src) noexcept = default;
+ pstdout &operator=(pstdout &&src) = delete;
+ COPYASSIGN(pstdout, delete)
+
+ ~pstdout() noexcept override = default;
};
// -----------------------------------------------------------------------------
@@ -220,16 +309,29 @@ class pifilestream : public pistream
{
public:
- explicit pifilestream(const pstring &fname);
- virtual ~pifilestream() override;
+ pifilestream(const pstring &fname);
+ ~pifilestream() override;
+
+ pifilestream(pifilestream &&src) noexcept
+ : pistream(std::move(src))
+ , m_file(src.m_file)
+ , m_pos(src.m_pos)
+ , m_actually_close(src.m_actually_close)
+ , m_filename(std::move(src.m_filename))
+ {
+ src.m_actually_close = false;
+ src.m_file = nullptr;
+ }
+ COPYASSIGN(pifilestream, delete)
+ pifilestream &operator=(pifilestream &&src) = delete;
protected:
pifilestream(void *file, const pstring &name, const bool do_close);
/* read up to n bytes from stream */
- virtual pos_type vread(void *buf, const pos_type n) override;
- virtual void vseek(const pos_type n) override;
- virtual pos_type vtell() override;
+ pos_type vread(value_type *buf, const pos_type n) override;
+ void vseek(const pos_type n) override;
+ pos_type vtell() const override;
private:
void *m_file;
@@ -249,7 +351,10 @@ class pstdin : public pifilestream
public:
pstdin();
- virtual ~pstdin() override;
+ pstdin(pstdin &&src) noexcept = default;
+ pstdin &operator=(pstdin &&src) = delete;
+ COPYASSIGN(pstdin, delete)
+ ~pstdin() override = default;
};
// -----------------------------------------------------------------------------
@@ -261,15 +366,36 @@ class pimemstream : public pistream
public:
pimemstream(const void *mem, const pos_type len);
+ pimemstream();
+
+ pimemstream(pimemstream &&src) noexcept
+ : pistream(std::move(src))
+ , m_pos(src.m_pos)
+ , m_len(src.m_len)
+ , m_mem(src.m_mem)
+ {
+ src.m_mem = nullptr;
+ }
+ COPYASSIGN(pimemstream, delete)
+ pimemstream &operator=(pimemstream &&src) = delete;
+
explicit pimemstream(const pomemstream &ostrm);
- virtual ~pimemstream() override;
+
+ ~pimemstream() override = default;
pos_type size() const { return m_len; }
protected:
+
+ void set_mem(const void *mem, const pos_type len)
+ {
+ m_mem = static_cast<const char *>(mem);
+ m_len = len;
+ }
+
/* read up to n bytes from stream */
- virtual pos_type vread(void *buf, const pos_type n) override;
- virtual void vseek(const pos_type n) override;
- virtual pos_type vtell() override;
+ pos_type vread(value_type *buf, const pos_type n) override;
+ void vseek(const pos_type n) override;
+ pos_type vtell() const override;
private:
pos_type m_pos;
@@ -284,12 +410,25 @@ private:
class pistringstream : public pimemstream
{
public:
- explicit pistringstream(const pstring &str) : pimemstream(str.c_str(), str.mem_t_size()), m_str(str) { }
- virtual ~pistringstream() override;
+ pistringstream(const pstring &str)
+ : pimemstream()
+ , m_str(str)
+ {
+ set_mem(m_str.c_str(), std::strlen(m_str.c_str()));
+ }
+ pistringstream(pistringstream &&src) noexcept
+ : pimemstream(std::move(src)), m_str(src.m_str)
+ {
+ set_mem(m_str.c_str(), std::strlen(m_str.c_str()));
+ }
+ COPYASSIGN(pistringstream, delete)
+ pistringstream &operator=(pistringstream &&src) = delete;
+
+ ~pistringstream() override = default;
private:
/* only needed for a reference till destruction */
- pstring m_str;
+ const pstring m_str;
};
// -----------------------------------------------------------------------------
@@ -298,47 +437,84 @@ private:
/* this digests linux & dos/windows text files */
-class putf8_reader : plib::nocopyassignmove
+
+template <typename T>
+struct constructor_helper
+{
+ plib::unique_ptr<pistream> operator()(T &&s) { return std::move(plib::make_unique<T>(std::move(s))); }
+};
+
+// NOLINTNEXTLINE(cppcoreguidelines-special-member-functions)
+class putf8_reader
{
public:
- explicit putf8_reader(pistream &strm) : m_strm(strm) {}
- virtual ~putf8_reader() {}
- bool eof() const { return m_strm.eof(); }
+ COPYASSIGN(putf8_reader, delete)
+ putf8_reader &operator=(putf8_reader &&src) = delete;
+ virtual ~putf8_reader() = default;
+
+ template <typename T>
+ friend struct constructor_helper;
+
+ template <typename T>
+ putf8_reader(T &&strm) // NOLINT(cppcoreguidelines-special-member-functions, misc-forwarding-reference-overload, bugprone-forwarding-reference-overload)
+ : m_strm(std::move(constructor_helper<T>()(std::move(strm)))) // NOLINT(bugprone-move-forwarding-reference)
+ {}
+
+ bool eof() const { return m_strm->eof(); }
bool readline(pstring &line);
- bool readbyte1(char &b)
+ bool readbyte1(pistream::value_type &b)
{
- return (m_strm.read(&b, 1) == 1);
+ return (m_strm->read(&b, 1) == 1);
}
- bool readcode(pstring::code_t &c)
+ bool readcode(putf8string::traits_type::code_t &c)
{
- char b[4];
- if (m_strm.read(&b[0], 1) != 1)
+ std::array<pistream::value_type, 4> b{0};
+ if (m_strm->read(&b[0], 1) != 1)
return false;
- const std::size_t l = pstring::traits_type::codelen(b);
+ const std::size_t l = putf8string::traits_type::codelen(reinterpret_cast<putf8string::traits_type::mem_t *>(&b));
for (std::size_t i = 1; i < l; i++)
- if (m_strm.read(&b[i], 1) != 1)
+ if (m_strm->read(&b[i], 1) != 1)
return false;
- c = pstring::traits_type::code(b);
+ c = putf8string::traits_type::code(reinterpret_cast<putf8string::traits_type::mem_t *>(&b));
return true;
}
private:
- pistream &m_strm;
- pstring m_linebuf;
+ plib::unique_ptr<pistream> m_strm;
+ putf8string m_linebuf;
};
+template <>
+struct constructor_helper<putf8_reader>
+{
+ plib::unique_ptr<pistream> operator()(putf8_reader &&s) { return std::move(s.m_strm); }
+};
+
+template <>
+struct constructor_helper<plib::unique_ptr<pistream>>
+{
+ plib::unique_ptr<pistream> operator()(plib::unique_ptr<pistream> &&s) { return std::move(s); }
+};
+
+
// -----------------------------------------------------------------------------
// putf8writer_t: writer on top of ostream
// -----------------------------------------------------------------------------
-class putf8_writer : plib::nocopyassignmove
+class putf8_writer
{
public:
- explicit putf8_writer(postream &strm) : m_strm(strm) {}
- virtual ~putf8_writer() {}
+ explicit putf8_writer(postream *strm) : m_strm(strm) {}
+
+ putf8_writer(putf8_writer &&src) noexcept : m_strm(src.m_strm) {}
+
+ COPYASSIGN(putf8_writer, delete)
+ putf8_writer &operator=(putf8_writer &&src) = delete;
+
+ virtual ~putf8_writer() = default;
void writeline(const pstring &line) const
{
@@ -348,24 +524,34 @@ public:
void write(const pstring &text) const
{
- m_strm.write(text.c_str(), text.mem_t_size());
+ // NOLINTNEXTLINE(performance-unnecessary-copy-initialization)
+ const putf8string conv_utf8(text);
+ m_strm->write(reinterpret_cast<const pistream::value_type *>(conv_utf8.c_str()), conv_utf8.mem_t_size());
}
- void write(const pstring::code_t c) const
+ void write(const pstring::value_type c) const
{
- write(pstring(c));
+ pstring t = pstring("") + c;
+ write(t);
}
private:
- postream &m_strm;
+ postream *m_strm;
};
class putf8_fmt_writer : public pfmt_writer_t<putf8_fmt_writer>, public putf8_writer
{
public:
- explicit putf8_fmt_writer(postream &strm);
- virtual ~putf8_fmt_writer() override;
+ explicit putf8_fmt_writer(postream *strm)
+ : pfmt_writer_t()
+ , putf8_writer(strm)
+ {
+ }
+
+ COPYASSIGNMOVE(putf8_fmt_writer, delete)
+
+ ~putf8_fmt_writer() override = default;
//protected:
void vdowrite(const pstring &ls) const;
@@ -377,22 +563,29 @@ private:
// pbinary_writer_t: writer on top of ostream
// -----------------------------------------------------------------------------
-class pbinary_writer : plib::nocopyassignmove
+class pbinary_writer
{
public:
explicit pbinary_writer(postream &strm) : m_strm(strm) {}
- virtual ~pbinary_writer() {}
+ pbinary_writer(pbinary_writer &&src) noexcept : m_strm(src.m_strm) {}
+
+ COPYASSIGN(pbinary_writer, delete)
+ postringstream &operator=(pbinary_writer &&src) = delete;
+
+ virtual ~pbinary_writer() = default;
template <typename T>
- void write(const T val)
+ void write(const T &val)
{
- m_strm.write(&val, sizeof(T));
+ m_strm.write(reinterpret_cast<const postream::value_type *>(&val), sizeof(T));
}
void write(const pstring &s)
{
- write(s.mem_t_size());
- m_strm.write(s.c_str(), s.mem_t_size());
+ const auto sm = reinterpret_cast<const postream::value_type *>(s.c_str());
+ const std::size_t sl = std::strlen(s.c_str());
+ write(sl);
+ m_strm.write(sm, sl);
}
template <typename T>
@@ -400,34 +593,38 @@ public:
{
std::size_t sz = val.size();
write(sz);
- m_strm.write(val.data(), sizeof(T) * sz);
+ m_strm.write(reinterpret_cast<const postream::value_type *>(val.data()), sizeof(T) * sz);
}
private:
postream &m_strm;
};
-class pbinary_reader : plib::nocopyassignmove
+class pbinary_reader
{
public:
explicit pbinary_reader(pistream &strm) : m_strm(strm) {}
- virtual ~pbinary_reader() {}
+ pbinary_reader(pbinary_reader &&src) noexcept : m_strm(src.m_strm) { }
+
+ COPYASSIGN(pbinary_reader, delete)
+ pbinary_reader &operator=(pbinary_reader &&src) = delete;
+
+ virtual ~pbinary_reader() = default;
template <typename T>
void read(T &val)
{
- m_strm.read(&val, sizeof(T));
+ m_strm.read(reinterpret_cast<pistream::value_type *>(&val), sizeof(T));
}
void read( pstring &s)
{
std::size_t sz = 0;
read(sz);
- pstring::mem_t *buf = new pstring::mem_t[sz+1];
- m_strm.read(buf, sz);
+ std::vector<plib::string_info<pstring>::mem_t> buf(sz+1);
+ m_strm.read(buf.data(), sz);
buf[sz] = 0;
- s = pstring(buf, pstring::UTF8);
- delete [] buf;
+ s = pstring(buf.data());
}
template <typename T>
@@ -436,13 +633,38 @@ public:
std::size_t sz = 0;
read(sz);
val.resize(sz);
- m_strm.read(val.data(), sizeof(T) * sz);
+ m_strm.read(reinterpret_cast<pistream::value_type *>(val.data()), sizeof(T) * sz);
}
private:
pistream &m_strm;
};
+inline void copystream(postream &dest, pistream &src)
+{
+ std::array<postream::value_type, 1024> buf; // NOLINT(cppcoreguidelines-pro-type-member-init)
+ pstream::pos_type r;
+ while ((r=src.read(buf.data(), 1024)) > 0)
+ dest.write(buf.data(), r);
}
+struct perrlogger
+{
+ template <typename ... Args>
+ explicit perrlogger(Args&& ... args)
+ {
+ h()(std::forward<Args>(args)...);
+ }
+private:
+ static putf8_fmt_writer &h()
+ {
+ static plib::pstderr perr_strm;
+ static plib::putf8_fmt_writer perr(&perr_strm);
+ return perr;
+ }
+};
+
+
+} // namespace plib
+
#endif /* PSTREAM_H_ */
diff --git a/src/lib/netlist/plib/pstring.cpp b/src/lib/netlist/plib/pstring.cpp
index 47d35d7c82f..c304f11d1fd 100644
--- a/src/lib/netlist/plib/pstring.cpp
+++ b/src/lib/netlist/plib/pstring.cpp
@@ -10,17 +10,8 @@
#include "plists.h"
#include <algorithm>
-#include <stack>
#include <atomic>
-
-template <typename T>
-std::size_t strlen_mem(const T *s)
-{
- std::size_t len(0);
- while (*s++)
- ++len;
- return len;
-}
+#include <stack>
template<typename F>
int pstring_t<F>::compare(const pstring_t &right) const
@@ -67,18 +58,6 @@ pstring_t<F> pstring_t<F>::substr(size_type start, size_type nlen) const
}
template<typename F>
-pstring_t<F> pstring_t<F>::ucase() const
-{
- pstring_t ret;
- for (const auto &c : *this)
- if (c >= 'a' && c <= 'z')
- ret += (c - 'a' + 'A');
- else
- ret += c;
- return ret;
-}
-
-template<typename F>
typename pstring_t<F>::size_type pstring_t<F>::find_first_not_of(const pstring_t &no) const
{
size_type pos = 0;
@@ -150,114 +129,6 @@ typename pstring_t<F>::size_type pstring_t<F>::find(code_t search, size_type sta
return find(ss, start);
}
-
-template<typename F>
-pstring_t<F> pstring_t<F>::replace_all(const pstring_t &search, const pstring_t &replace) const
-{
- pstring_t ret;
- const size_type slen = search.length();
-
- size_type last_s = 0;
- size_type s = find(search, last_s);
- while (s != npos)
- {
- ret += substr(last_s, s - last_s);
- ret += replace;
- last_s = s + slen;
- s = find(search, last_s);
- }
- ret += substr(last_s);
- return ret;
-}
-
-template<typename F>
-pstring_t<F> pstring_t<F>::rpad(const pstring_t &ws, const size_type cnt) const
-{
- // FIXME: pstringbuffer ret(*this);
-
- pstring_t ret(*this);
- size_type wsl = ws.length();
- for (auto i = ret.length(); i < cnt; i+=wsl)
- ret += ws;
- return ret;
-}
-
-static double pstod(const pstring_t<pu8_traits> &str, std::size_t *e)
-{
- return std::stod(str.cpp_string(), e);
-}
-
-static double pstod(const pstring &str, std::size_t *e)
-{
- return std::stod(str.cpp_string(), e);
-}
-
-static double pstod(const pwstring &str, std::size_t *e)
-{
- return std::stod(str.cpp_string(), e);
-}
-
-static double pstod(const pu16string &str, std::size_t *e)
-{
- pstring c;
- c = str;
- return std::stod(c.cpp_string(), e);
-}
-
-static long pstol(const pstring_t<pu8_traits> &str, std::size_t *e, int base = 10)
-{
- return std::stol(str.cpp_string(), e, base);
-}
-
-static long pstol(const pstring &str, std::size_t *e, int base = 10)
-{
- return std::stol(str.cpp_string(), e, base);
-}
-
-static long pstol(const pwstring &str, std::size_t *e, int base = 10)
-{
- return std::stol(str.cpp_string(), e, base);
-}
-
-static long pstol(const pu16string &str, std::size_t *e, int base = 10)
-{
- pstring c;
- c = str;
- return std::stol(c.cpp_string(), e, base);
-}
-
-template<typename F>
-double pstring_t<F>::as_double(bool *error) const
-{
- std::size_t e = 0;
- if (error != nullptr)
- *error = false;
- double ret = pstod(*this, &e);
- if (e != mem_t_size())
- if (error != nullptr)
- *error = true;
- return ret;
-}
-
-template<typename F>
-long pstring_t<F>::as_long(bool *error) const
-{
- static pstring_t prefix(pstring("0x"));
- long ret;
- std::size_t e = 0;
-
- if (error != nullptr)
- *error = false;
- if (startsWith(prefix))
- ret = pstol(substr(2), &e, 16);
- else
- ret = pstol(*this, &e, 10);
- if (e != mem_t_size())
- if (error != nullptr)
- *error = true;
- return ret;
-}
-
// ----------------------------------------------------------------------------------------
// template stuff ...
// ----------------------------------------------------------------------------------------
diff --git a/src/lib/netlist/plib/pstring.h b/src/lib/netlist/plib/pstring.h
index cabce0e7b93..c4caeab8e8f 100644
--- a/src/lib/netlist/plib/pstring.h
+++ b/src/lib/netlist/plib/pstring.h
@@ -7,45 +7,50 @@
#ifndef PSTRING_H_
#define PSTRING_H_
-#include <iterator>
+#include "ptypes.h"
+
+#include <cstring>
#include <exception>
+#include <iterator>
+#include <limits>
+#include <stdexcept>
#include <string>
+#include <type_traits>
// ----------------------------------------------------------------------------------------
// pstring: semi-immutable strings ...
//
// The only reason this class exists is the absence of support for multi-byte
-// strings in std:: which I would consider usuable for the use-cases I encounter.
+// strings in std:: which I would consider sub-optimal for the use-cases I encounter.
// ----------------------------------------------------------------------------------------
+// enable this to use std::string instead of pstring globally.
+
+#define PSTRING_USE_STD_STRING (0)
+
template <typename T>
class pstring_const_iterator final
{
public:
- typedef typename T::ref_value_type value_type;
+ using value_type = typename T::ref_value_type;
- typedef value_type const *pointer;
- typedef value_type const &reference;
- typedef std::ptrdiff_t difference_type;
- typedef std::forward_iterator_tag iterator_category;
- typedef typename T::string_type string_type;
- typedef typename T::traits_type traits_type;
+ using pointer = value_type const *;
+ using reference = value_type const &;
+ using difference_type = std::ptrdiff_t;
+ using iterator_category = std::forward_iterator_tag;
+ using string_type = typename T::string_type;
+ using traits_type = typename T::traits_type;
- pstring_const_iterator() noexcept : p() { }
+ constexpr pstring_const_iterator() noexcept : p() { }
explicit constexpr pstring_const_iterator(const typename string_type::const_iterator &x) noexcept : p(x) { }
-#if !defined(_MSC_VER) || !defined(_ITERATOR_DEBUG_LEVEL) || (0 == _ITERATOR_DEBUG_LEVEL) // debug iterators are broken
- pstring_const_iterator(const pstring_const_iterator &rhs) noexcept = default;
- pstring_const_iterator(pstring_const_iterator &&rhs) noexcept = default;
- pstring_const_iterator &operator=(const pstring_const_iterator &rhs) noexcept = default;
- pstring_const_iterator &operator=(pstring_const_iterator &&rhs) noexcept = default;
-#endif
pstring_const_iterator& operator++() noexcept { p += static_cast<difference_type>(traits_type::codelen(&(*p))); return *this; }
- pstring_const_iterator operator++(int) noexcept { pstring_const_iterator tmp(*this); operator++(); return tmp; }
+ // NOLINTNEXTLINE(cert-dcl21-cpp)
+ pstring_const_iterator operator++(int) & noexcept { pstring_const_iterator tmp(*this); operator++(); return tmp; }
- bool operator==(const pstring_const_iterator& rhs) const noexcept { return p == rhs.p; }
- bool operator!=(const pstring_const_iterator& rhs) const noexcept { return p != rhs.p; }
+ constexpr bool operator==(const pstring_const_iterator& rhs) const noexcept { return p == rhs.p; }
+ constexpr bool operator!=(const pstring_const_iterator& rhs) const noexcept { return p != rhs.p; }
reference operator*() const noexcept { return *reinterpret_cast<pointer>(&(*p)); }
pointer operator->() const noexcept { return reinterpret_cast<pointer>(&(*p)); }
@@ -60,18 +65,21 @@ template <typename F>
struct pstring_t
{
public:
- typedef F traits_type;
+ using traits_type = F;
- typedef typename traits_type::mem_t mem_t;
- typedef typename traits_type::code_t code_t;
- typedef std::size_t size_type;
- typedef std::ptrdiff_t difference_type;
- typedef typename traits_type::string_type string_type;
+ using mem_t = typename traits_type::mem_t;
+ using code_t = typename traits_type::code_t;
+ using value_type = typename traits_type::code_t;
+ using size_type = std::size_t;
+ using difference_type = std::ptrdiff_t;
+ using string_type = typename traits_type::string_type;
- class ref_value_type final
+ // FIXME: this is ugly
+ struct ref_value_type final
{
public:
ref_value_type() = delete;
+ ~ref_value_type() = delete;
ref_value_type(const ref_value_type &) = delete;
ref_value_type(ref_value_type &&) = delete;
ref_value_type &operator=(const ref_value_type &) = delete;
@@ -80,37 +88,27 @@ public:
private:
const mem_t m;
};
- typedef const ref_value_type& const_reference;
- typedef const_reference reference;
-
- enum enc_t
- {
- UTF8,
- UTF16
- };
+ using const_reference = const ref_value_type &;
+ using reference = const_reference;
// simple construction/destruction
- pstring_t()
- {
- }
- ~pstring_t()
- {
- }
+ pstring_t() = default;
+ ~pstring_t() noexcept = default;
// FIXME: Do something with encoding
- pstring_t(const mem_t *string, const enc_t enc)
+ pstring_t(const mem_t *string)
: m_str(string)
{
}
- pstring_t(const mem_t *string, const size_type len, const enc_t enc)
+ pstring_t(const mem_t *string, const size_type len)
: m_str(string, len)
{
}
template<typename C, std::size_t N,
class = typename std::enable_if<std::is_same<C, const mem_t>::value>::type>
- pstring_t(C (&string)[N])
+ pstring_t(C (&string)[N]) // NOLINT(cppcoreguidelines-avoid-c-arrays, modernize-avoid-c-arrays)
{
static_assert(N > 0,"pstring from array of length 0");
if (string[N-1] != 0)
@@ -118,17 +116,15 @@ public:
m_str.assign(string, N - 1);
}
- pstring_t(const pstring_t &string)
- : m_str(string.m_str)
- { }
- explicit pstring_t(const string_type &string, const enc_t enc)
+ explicit pstring_t(const string_type &string)
: m_str(string)
{ }
- pstring_t(pstring_t &&string)
- : m_str(string.m_str)
- { }
+ pstring_t(const pstring_t &string) = default;
+ pstring_t(pstring_t &&string) noexcept = default;
+ pstring_t &operator=(const pstring_t &string) = default;
+ pstring_t &operator=(pstring_t &&string) noexcept = default;
explicit pstring_t(code_t code)
{
@@ -144,7 +140,8 @@ public:
*this += static_cast<code_t>(c); // FIXME: codepage conversion for u8
}
- pstring_t &operator=(const pstring_t &string) { m_str = string.m_str; return *this; }
+ operator string_type () const { return m_str; }
+
template <typename T,
class = typename std::enable_if<!std::is_same<T, pstring_t::traits_type>::value>::type>
@@ -157,8 +154,8 @@ public:
}
// no non-const const_iterator for now
- typedef pstring_const_iterator<pstring_t> iterator;
- typedef pstring_const_iterator<pstring_t> const_iterator;
+ using iterator = pstring_const_iterator<pstring_t<F> >;
+ using const_iterator = pstring_const_iterator<pstring_t<F> >;
iterator begin() { return iterator(m_str.begin()); }
iterator end() { return iterator(m_str.end()); }
@@ -201,67 +198,26 @@ public:
const_reference at(const size_type pos) const { return *reinterpret_cast<const ref_value_type *>(F::nthcode(m_str.c_str(),pos)); }
- /* The following is not compatible to std::string */
-
- bool equals(const pstring_t &string) const { return (compare(string) == 0); }
-
- bool startsWith(const pstring_t &arg) const { return arg.mem_t_size() > mem_t_size() ? false : m_str.compare(0, arg.mem_t_size(), arg.m_str) == 0; }
- bool endsWith(const pstring_t &arg) const { return arg.mem_t_size() > mem_t_size() ? false : m_str.compare(mem_t_size()-arg.mem_t_size(), arg.mem_t_size(), arg.m_str) == 0; }
-
- pstring_t replace_all(const pstring_t &search, const pstring_t &replace) const;
- pstring_t cat(const pstring_t &s) const { return *this + s; }
- pstring_t cat(code_t c) const { return *this + c; }
-
- // conversions
-
- double as_double(bool *error = nullptr) const;
- long as_long(bool *error = nullptr) const;
-
/* the following are extensions to <string> */
size_type mem_t_size() const { return m_str.size(); }
- pstring_t left(size_type len) const { return substr(0, len); }
- pstring_t right(size_type nlen) const
- {
- return nlen >= length() ? *this : substr(length() - nlen, nlen);
- }
-
- pstring_t ltrim(const pstring_t &ws = pstring_t(" \t\n\r")) const
- {
- return substr(find_first_not_of(ws));
- }
-
- pstring_t rtrim(const pstring_t &ws = pstring_t(" \t\n\r")) const
- {
- auto f = find_last_not_of(ws);
- return f == npos ? pstring_t() : substr(0, f + 1);
- }
-
- pstring_t trim(const pstring_t &ws = pstring_t(" \t\n\r")) const { return this->ltrim(ws).rtrim(ws); }
-
- pstring_t rpad(const pstring_t &ws, const size_type cnt) const;
-
- pstring_t ucase() const;
-
const string_type &cpp_string() const { return m_str; }
- static const size_type npos = static_cast<size_type>(-1);
-
-protected:
- string_type m_str;
+ static constexpr const size_type npos = static_cast<size_type>(-1);
private:
+ string_type m_str;
};
struct pu8_traits
{
- typedef char mem_t;
- typedef char code_t;
- typedef std::string string_type;
+ using mem_t = char;
+ using code_t = char;
+ using string_type = std::string;
static std::size_t len(const string_type &p) { return p.size(); }
- static std::size_t codelen(const mem_t *p) { return 1; }
- static std::size_t codelen(const code_t c) { return 1; }
+ static std::size_t codelen(const mem_t *p) { plib::unused_var(p); return 1; }
+ static std::size_t codelen(const code_t c) { plib::unused_var(c); return 1; }
static code_t code(const mem_t *p) { return *p; }
static void encode(const code_t c, string_type &s) { s += static_cast<mem_t>(c); }
static const mem_t *nthcode(const mem_t *p, const std::size_t n) { return &(p[n]); }
@@ -270,9 +226,9 @@ struct pu8_traits
/* No checking, this may deliver invalid codes */
struct putf8_traits
{
- typedef char mem_t;
- typedef char32_t code_t;
- typedef std::string string_type;
+ using mem_t = char;
+ using code_t = char32_t;
+ using string_type = std::string;
static std::size_t len(const string_type &p)
{
std::size_t ret = 0;
@@ -285,7 +241,7 @@ struct putf8_traits
}
static std::size_t codelen(const mem_t *p)
{
- const unsigned char *p1 = reinterpret_cast<const unsigned char *>(p);
+ const auto p1 = reinterpret_cast<const unsigned char *>(p);
if ((*p1 & 0x80) == 0x00)
return 1;
else if ((*p1 & 0xE0) == 0xC0)
@@ -312,7 +268,7 @@ struct putf8_traits
}
static code_t code(const mem_t *p)
{
- const unsigned char *p1 = reinterpret_cast<const unsigned char *>(p);
+ const auto p1 = reinterpret_cast<const unsigned char *>(p);
if ((*p1 & 0x80) == 0x00)
return *p1;
else if ((*p1 & 0xE0) == 0xC0)
@@ -361,9 +317,9 @@ struct putf8_traits
struct putf16_traits
{
- typedef char16_t mem_t;
- typedef char32_t code_t;
- typedef std::u16string string_type;
+ using mem_t = char16_t;
+ using code_t = char32_t;
+ using string_type = std::u16string;
static std::size_t len(const string_type &p)
{
std::size_t ret = 0;
@@ -371,7 +327,7 @@ struct putf16_traits
while (i != p.end())
{
// FIXME: check that size is equal
- uint16_t c = static_cast<uint16_t>(*i++);
+ auto c = static_cast<uint16_t>(*i++);
if (!((c & 0xd800) == 0xd800))
ret++;
}
@@ -379,7 +335,7 @@ struct putf16_traits
}
static std::size_t codelen(const mem_t *p)
{
- uint16_t c = static_cast<uint16_t>(*p);
+ auto c = static_cast<uint16_t>(*p);
return ((c & 0xd800) == 0xd800) ? 2 : 1;
}
static std::size_t codelen(const code_t c)
@@ -391,7 +347,7 @@ struct putf16_traits
}
static code_t code(const mem_t *p)
{
- uint32_t c = static_cast<uint32_t>(*p++);
+ auto c = static_cast<uint32_t>(*p++);
if ((c & 0xd800) == 0xd800)
{
c = (c - 0xd800) << 10;
@@ -401,7 +357,7 @@ struct putf16_traits
}
static void encode(code_t c, string_type &s)
{
- uint32_t cu = static_cast<uint32_t>(c);
+ auto cu = static_cast<uint32_t>(c);
if (c > 0xffff)
{ //make a surrogate pair
uint32_t t = ((cu - 0x10000) >> 10) + 0xd800;
@@ -425,9 +381,9 @@ struct putf16_traits
struct pwchar_traits
{
- typedef wchar_t mem_t;
- typedef char32_t code_t;
- typedef std::wstring string_type;
+ using mem_t = wchar_t;
+ using code_t = char32_t;
+ using string_type = std::wstring;
static std::size_t len(const string_type &p)
{
if (sizeof(wchar_t) == 2)
@@ -437,7 +393,7 @@ struct pwchar_traits
while (i != p.end())
{
// FIXME: check that size is equal
- uint32_t c = static_cast<uint32_t>(*i++);
+ auto c = static_cast<uint32_t>(*i++);
if (!((c & 0xd800) == 0xd800))
ret++;
}
@@ -451,7 +407,7 @@ struct pwchar_traits
{
if (sizeof(wchar_t) == 2)
{
- uint16_t c = static_cast<uint16_t>(*p);
+ auto c = static_cast<uint16_t>(*p);
return ((c & 0xd800) == 0xd800) ? 2 : 1;
}
else
@@ -470,7 +426,7 @@ struct pwchar_traits
{
if (sizeof(wchar_t) == 2)
{
- uint32_t c = static_cast<uint32_t>(*p++);
+ auto c = static_cast<uint32_t>(*p++);
if ((c & 0xd800) == 0xd800)
{
c = (c - 0xd800) << 10;
@@ -486,7 +442,7 @@ struct pwchar_traits
{
if (sizeof(wchar_t) == 2)
{
- uint32_t cu = static_cast<uint32_t>(c);
+ auto cu = static_cast<uint32_t>(c);
if (c > 0xffff)
{ //make a surrogate pair
uint32_t t = ((cu - 0x10000) >> 10) + 0xd800;
@@ -519,41 +475,280 @@ extern template struct pstring_t<putf8_traits>;
extern template struct pstring_t<putf16_traits>;
extern template struct pstring_t<pwchar_traits>;
-typedef pstring_t<putf8_traits> pstring;
-typedef pstring_t<putf16_traits> pu16string;
-typedef pstring_t<pwchar_traits> pwstring;
+#if (PSTRING_USE_STD_STRING)
+typedef std::string pstring;
+#else
+using pstring = pstring_t<putf8_traits>;
+#endif
+using putf8string = pstring_t<putf8_traits>;
+using pu16string = pstring_t<putf16_traits>;
+using pwstring = pstring_t<pwchar_traits>;
namespace plib
{
+ template<class T>
+ struct string_info
+ {
+ using mem_t = typename T::mem_t;
+ };
+
+ template<>
+ struct string_info<std::string>
+ {
+ using mem_t = char;
+ };
+
template<typename T>
pstring to_string(const T &v)
{
- return pstring(std::to_string(v), pstring::UTF8);
+ return pstring(std::to_string(v));
}
template<typename T>
pwstring to_wstring(const T &v)
{
- return pwstring(std::to_wstring(v), pwstring::UTF16);
+ return pwstring(std::to_wstring(v));
+ }
+
+ template <typename T, typename E = void>
+ struct pstonum_helper;
+
+ template<typename T>
+ struct pstonum_helper<T, typename std::enable_if<std::is_integral<T>::value
+ && std::is_signed<T>::value>::type>
+ {
+ template <typename S>
+ long long operator()(const S &arg, std::size_t *idx)
+ {
+ return std::stoll(arg, idx);
+ }
+ };
+
+ template<typename T>
+ struct pstonum_helper<T, typename std::enable_if<std::is_integral<T>::value
+ && !std::is_signed<T>::value>::type>
+ {
+ template <typename S>
+ unsigned long long operator()(const S &arg, std::size_t *idx)
+ {
+ return std::stoull(arg, idx);
+ }
+ };
+
+ template<typename T>
+ struct pstonum_helper<T, typename std::enable_if<std::is_floating_point<T>::value>::type>
+ {
+ template <typename S>
+ long double operator()(const S &arg, std::size_t *idx)
+ {
+ return std::stold(arg, idx);
+ }
+ };
+
+ template<typename T, typename S>
+ T pstonum(const S &arg)
+ {
+ decltype(arg.c_str()) cstr = arg.c_str();
+ std::size_t idx(0);
+ auto ret = pstonum_helper<T>()(cstr, &idx);
+ using ret_type = decltype(ret);
+ if (ret >= static_cast<ret_type>(std::numeric_limits<T>::lowest())
+ && ret <= static_cast<ret_type>(std::numeric_limits<T>::max()))
+ //&& (ret == T(0) || std::abs(ret) >= std::numeric_limits<T>::min() ))
+ {
+ if (cstr[idx] != 0)
+ throw std::invalid_argument(std::string("Continuation after numeric value ends: ") + cstr);
+ }
+ else
+ {
+ throw std::out_of_range(std::string("Out of range: ") + cstr);
+ }
+ return static_cast<T>(ret);
+ }
+
+ template<typename R, typename T>
+ R pstonum_ne(const T &str, bool &err) noexcept
+ {
+ try
+ {
+ err = false;
+ return pstonum<R>(str);
+ }
+ catch (...)
+ {
+ err = true;
+ return R(0);
+ }
+ }
+
+ template<typename T>
+ typename T::size_type find_first_not_of(const T &str, const T &no)
+ {
+ typename T::size_type pos = 0;
+ for (auto it = str.begin(); it != str.end(); ++it, ++pos)
+ {
+ bool f = true;
+ for (typename T::value_type const jt : no)
+ {
+ if (*it == jt)
+ {
+ f = false;
+ break;
+ }
+ }
+ if (f)
+ return pos;
+ }
+ return T::npos;
+ }
+
+ template<typename T>
+ typename T::size_type find_last_not_of(const T &str, const T &no)
+ {
+ /* FIXME: reverse iterator */
+ typename T::size_type last_found = T::npos;
+ typename T::size_type pos = 0;
+ for (auto it = str.begin(); it != str.end(); ++it, ++pos)
+ {
+ bool f = true;
+ for (typename T::value_type const jt : no)
+ {
+ if (*it == jt)
+ {
+ f = false;
+ break;
+ }
+ }
+ if (f)
+ last_found = pos;
+ }
+ return last_found;
+ }
+
+ template<typename T>
+ T ltrim(const T &str, const T &ws = T(" \t\n\r"))
+ {
+ auto f = find_first_not_of(str, ws);
+ return (f == T::npos) ? T() : str.substr(f);
}
-}
+
+ template<typename T>
+ T rtrim(const T &str, const T &ws = T(" \t\n\r"))
+ {
+ auto f = find_last_not_of(str, ws);
+ return (f == T::npos) ? T() : str.substr(0, f + 1);
+ }
+
+ template<typename T>
+ T trim(const T &str, const T &ws = T(" \t\n\r"))
+ {
+ return rtrim(ltrim(str, ws), ws);
+ }
+
+ template<typename T>
+ T left(const T &str, typename T::size_type len)
+ {
+ return str.substr(0, len);
+ }
+
+ template<typename T>
+ T right(const T &str, typename T::size_type nlen)
+ {
+ return nlen >= str.length() ? str : str.substr(str.length() - nlen, nlen);
+ }
+
+ template<typename T>
+ bool startsWith(const T &str, const T &arg)
+ {
+ return (arg == left(str, arg.length()));
+ }
+
+ template<typename T>
+ bool endsWith(const T &str, const T &arg)
+ {
+ return (right(str, arg.length()) == arg);
+ }
+
+ template<typename T>
+ bool startsWith(const T &str, const char *arg)
+ {
+ return (left(str, std::strlen(arg)) == arg);
+ }
+
+ template<typename T>
+ bool endsWith(const T &str, const char *arg)
+ {
+ return (right(str, std::strlen(arg)) == arg);
+ }
+
+ template<typename T>
+ T ucase(const T &str)
+ {
+ T ret;
+ for (const auto &c : str)
+ if (c >= 'a' && c <= 'z')
+ ret += (c - 'a' + 'A');
+ else
+ ret += c;
+ return ret;
+ }
+
+ template<typename T>
+ T rpad(const T &str, const T &ws, const typename T::size_type cnt)
+ {
+ // FIXME: pstringbuffer ret(*this);
+
+ T ret(str);
+ typename T::size_type wsl = ws.length();
+ for (auto i = ret.length(); i < cnt; i+=wsl)
+ ret += ws;
+ return ret;
+ }
+
+ template<typename T>
+ T replace_all(const T &str, const T &search, const T &replace)
+ {
+ T ret;
+ const typename T::size_type slen = search.length();
+
+ typename T::size_type last_s = 0;
+ typename T::size_type s = str.find(search, last_s);
+ while (s != T::npos)
+ {
+ ret += str.substr(last_s, s - last_s);
+ ret += replace;
+ last_s = s + slen;
+ s = str.find(search, last_s);
+ }
+ ret += str.substr(last_s);
+ return ret;
+ }
+
+ template<typename T, typename T1, typename T2>
+ T replace_all(const T &str, const T1 &search, const T2 &replace)
+ {
+ return replace_all(str, static_cast<T>(search), static_cast<T>(replace));
+ }
+
+} // namespace plib
// custom specialization of std::hash can be injected in namespace std
namespace std
{
+
template<typename T> struct hash<pstring_t<T>>
{
- typedef pstring_t<T> argument_type;
- typedef std::size_t result_type;
+ using argument_type = pstring_t<T>;
+ using result_type = std::size_t;
result_type operator()(argument_type const& s) const
{
- const pstring::mem_t *string = s.c_str();
+ const typename argument_type::mem_t *string = s.c_str();
result_type result = 5381;
- for (pstring::mem_t c = *string; c != 0; c = *string++)
+ for (typename argument_type::mem_t c = *string; c != 0; c = *string++)
result = ((result << 5) + result ) ^ (result >> (32 - 5)) ^ static_cast<result_type>(c);
return result;
}
};
-}
+} // namespace std
#endif /* PSTRING_H_ */
diff --git a/src/lib/netlist/plib/ptime.h b/src/lib/netlist/plib/ptime.h
new file mode 100644
index 00000000000..32ccc4f7b0d
--- /dev/null
+++ b/src/lib/netlist/plib/ptime.h
@@ -0,0 +1,136 @@
+// license:GPL-2.0+
+// copyright-holders:Couriersud
+/*
+ * ptime.h
+ */
+
+#ifndef PTIME_H_
+#define PTIME_H_
+
+#include "pconfig.h"
+#include "ptypes.h"
+
+#include <cstdint>
+
+// ----------------------------------------------------------------------------------------
+// netlist_time
+// ----------------------------------------------------------------------------------------
+
+namespace plib
+{
+
+ template <typename TYPE, TYPE RES>
+ struct ptime final
+ {
+ public:
+
+ using internal_type = TYPE;
+ using mult_type = TYPE;
+
+ constexpr ptime() noexcept : m_time(0) {}
+
+ ~ptime() noexcept = default;
+
+ constexpr ptime(const ptime &rhs) noexcept = default;
+ constexpr ptime(ptime &&rhs) noexcept = default;
+ constexpr explicit ptime(const internal_type &time) noexcept : m_time(time) {}
+ constexpr explicit ptime(internal_type &&time) noexcept : m_time(time) {}
+ C14CONSTEXPR ptime &operator=(const ptime &rhs) noexcept = default;
+ C14CONSTEXPR ptime &operator=(ptime &&rhs) noexcept = default;
+
+ constexpr explicit ptime(const double t) = delete;
+ //: m_time((internal_type) ( t * (double) resolution)) { }
+ constexpr explicit ptime(const internal_type nom, const internal_type den) noexcept
+ : m_time(nom * (RES / den)) { }
+
+ C14CONSTEXPR ptime &operator+=(const ptime rhs) noexcept { m_time += rhs.m_time; return *this; }
+ C14CONSTEXPR ptime &operator-=(const ptime rhs) noexcept { m_time -= rhs.m_time; return *this; }
+ C14CONSTEXPR ptime &operator*=(const mult_type factor) noexcept { m_time *= static_cast<internal_type>(factor); return *this; }
+
+ friend constexpr const ptime operator-(ptime lhs, const ptime rhs) noexcept
+ {
+ return ptime(lhs.m_time - rhs.m_time);
+ }
+
+ friend constexpr const ptime operator+(ptime lhs, const ptime rhs) noexcept
+ {
+ return ptime(lhs.m_time + rhs.m_time);
+ }
+
+ friend constexpr const ptime operator*(ptime lhs, const mult_type &factor) noexcept
+ {
+ return ptime(lhs.m_time * factor);
+ }
+
+ friend constexpr mult_type operator/(const ptime lhs, const ptime rhs) noexcept
+ {
+ return static_cast<mult_type>(lhs.m_time / rhs.m_time);
+ }
+
+ friend constexpr bool operator<(const ptime lhs, const ptime rhs) noexcept
+ {
+ return (lhs.m_time < rhs.m_time);
+ }
+
+ friend constexpr bool operator>(const ptime lhs, const ptime rhs) noexcept
+ {
+ return (rhs < lhs);
+ }
+
+ friend constexpr bool operator<=(const ptime lhs, const ptime rhs) noexcept
+ {
+ return !(lhs > rhs);
+ }
+
+ friend constexpr bool operator>=(const ptime lhs, const ptime rhs) noexcept
+ {
+ return !(lhs < rhs);
+ }
+
+ friend constexpr bool operator==(const ptime lhs, const ptime rhs) noexcept
+ {
+ return lhs.m_time == rhs.m_time;
+ }
+
+ friend constexpr bool operator!=(const ptime lhs, const ptime rhs) noexcept
+ {
+ return !(lhs == rhs);
+ }
+
+ constexpr internal_type as_raw() const noexcept { return m_time; }
+ constexpr double as_double() const noexcept
+ {
+ return static_cast<double>(m_time) * inv_res;
+ }
+
+ // for save states ....
+ C14CONSTEXPR internal_type *get_internaltype_ptr() noexcept { return &m_time; }
+
+ static constexpr ptime from_nsec(const internal_type ns) noexcept { return ptime(ns, UINT64_C(1000000000)); }
+ static constexpr ptime from_usec(const internal_type us) noexcept { return ptime(us, UINT64_C( 1000000)); }
+ static constexpr ptime from_msec(const internal_type ms) noexcept { return ptime(ms, UINT64_C( 1000)); }
+ static constexpr ptime from_sec(const internal_type s) noexcept { return ptime(s, UINT64_C( 1)); }
+ static constexpr ptime from_hz(const internal_type hz) noexcept { return ptime(1 , hz); }
+ static constexpr ptime from_raw(const internal_type raw) noexcept { return ptime(raw); }
+ static constexpr ptime from_double(const double t) noexcept { return ptime(static_cast<internal_type>( t * static_cast<double>(RES)), RES); }
+
+ static constexpr ptime zero() noexcept { return ptime(0, RES); }
+ static constexpr ptime quantum() noexcept { return ptime(1, RES); }
+ static constexpr ptime never() noexcept { return ptime(plib::numeric_limits<internal_type>::max(), RES); }
+ static constexpr internal_type resolution() noexcept { return RES; }
+
+ constexpr internal_type in_nsec() const noexcept { return m_time / (RES / UINT64_C(1000000000)); }
+ constexpr internal_type in_usec() const noexcept { return m_time / (RES / UINT64_C( 1000000)); }
+ constexpr internal_type in_msec() const noexcept { return m_time / (RES / UINT64_C( 1000)); }
+ constexpr internal_type in_sec() const noexcept { return m_time / (RES / UINT64_C( 1)); }
+
+ private:
+ static constexpr const double inv_res = 1.0 / static_cast<double>(RES);
+ internal_type m_time;
+ };
+
+
+} // namespace plib
+
+
+#endif /* PTIME_H_ */
diff --git a/src/lib/netlist/plib/ptypes.h b/src/lib/netlist/plib/ptypes.h
index 0934a86fdf2..bda62099150 100644
--- a/src/lib/netlist/plib/ptypes.h
+++ b/src/lib/netlist/plib/ptypes.h
@@ -9,10 +9,20 @@
#define PTYPES_H_
#include "pconfig.h"
-#include "pstring.h"
-#include <type_traits>
#include <limits>
+#include <string>
+#include <type_traits>
+
+#define COPYASSIGNMOVE(name, def) \
+ name(const name &) = def; \
+ name(name &&) noexcept = def; \
+ name &operator=(const name &) = def; \
+ name &operator=(name &&) noexcept = def;
+
+#define COPYASSIGN(name, def) \
+ name(const name &) = def; \
+ name &operator=(const name &) = def; \
namespace plib
{
@@ -25,14 +35,14 @@ namespace plib
template<> struct is_integral<INT128> { static constexpr bool value = true; };
template<> struct numeric_limits<UINT128>
{
- static inline constexpr UINT128 max()
+ static constexpr UINT128 max()
{
return ~((UINT128)0);
}
};
template<> struct numeric_limits<INT128>
{
- static inline constexpr INT128 max()
+ static constexpr INT128 max()
{
return (~((UINT128)0)) >> 1;
}
@@ -45,56 +55,98 @@ namespace plib
struct nocopyassignmove
{
- protected:
- nocopyassignmove() = default;
- ~nocopyassignmove() = default;
- private:
nocopyassignmove(const nocopyassignmove &) = delete;
nocopyassignmove(nocopyassignmove &&) = delete;
nocopyassignmove &operator=(const nocopyassignmove &) = delete;
nocopyassignmove &operator=(nocopyassignmove &&) = delete;
+ protected:
+ nocopyassignmove() = default;
+ ~nocopyassignmove() = default;
};
struct nocopyassign
{
+ nocopyassign(const nocopyassign &) = delete;
+ nocopyassign &operator=(const nocopyassign &) = delete;
protected:
nocopyassign() = default;
~nocopyassign() = default;
- private:
- nocopyassign(const nocopyassign &) = delete;
- nocopyassign &operator=(const nocopyassign &) = delete;
+ nocopyassign(nocopyassign &&) = default;
+ nocopyassign &operator=(nocopyassign &&) = default;
};
//============================================================
- // penum - strongly typed enumeration
+ // Avoid unused variable warnings
//============================================================
+ template<typename... Ts>
+ inline void unused_var(Ts&&...) {}
- struct penum_base
+ //============================================================
+ // is_pow2
+ //============================================================
+ template <typename T>
+ constexpr bool is_pow2(T v) noexcept
{
- protected:
- static int from_string_int(const char *str, const char *x);
- static pstring nthstr(int n, const char *str);
- };
+ static_assert(is_integral<T>::value, "is_pow2 needs integer arguments");
+ return !(v & (v-1));
+ }
+
+
+ //============================================================
+ // abs, lcd, gcm
+ //============================================================
+
+ template<typename T>
+ constexpr
+ typename std::enable_if<std::is_integral<T>::value && std::is_signed<T>::value, T>::type
+ abs(T v)
+ {
+ return v < 0 ? -v : v;
+ }
+
+ template<typename T>
+ constexpr
+ typename std::enable_if<std::is_integral<T>::value && std::is_unsigned<T>::value, T>::type
+ abs(T v)
+ {
+ return v;
+ }
+
+ template<typename M, typename N>
+ constexpr typename std::common_type<M, N>::type
+ gcd(M m, N n)
+ {
+ static_assert(std::is_integral<M>::value, "gcd: M must be an integer");
+ static_assert(std::is_integral<N>::value, "gcd: N must be an integer");
+
+ return m == 0 ? plib::abs(n)
+ : n == 0 ? plib::abs(m)
+ : gcd(n, m % n);
+ }
+
+ template<typename M, typename N>
+ constexpr typename std::common_type<M, N>::type
+ lcm(M m, N n)
+ {
+ static_assert(std::is_integral<M>::value, "lcm: M must be an integer");
+ static_assert(std::is_integral<N>::value, "lcm: N must be an integer");
+
+ return (m != 0 && n != 0) ? (plib::abs(m) / gcd(m, n)) * plib::abs(n) : 0;
+ }
+
+} // namespace plib
-}
-
-#define P_ENUM(ename, ...) \
- struct ename : public plib::penum_base { \
- enum E { __VA_ARGS__ }; \
- ename (E v) : m_v(v) { } \
- bool set_from_string (const pstring &s) { \
- static char const *const strings = # __VA_ARGS__; \
- int f = from_string_int(strings, s.c_str()); \
- if (f>=0) { m_v = static_cast<E>(f); return true; } else { return false; } \
- } \
- operator E() const {return m_v;} \
- bool operator==(const ename &rhs) const {return m_v == rhs.m_v;} \
- bool operator==(const E &rhs) const {return m_v == rhs;} \
- const pstring name() const { \
- static char const *const strings = # __VA_ARGS__; \
- return nthstr(static_cast<int>(m_v), strings); \
- } \
- private: E m_v; };
+//============================================================
+// Define a "has member" trait.
+//============================================================
+#define PDEFINE_HAS_MEMBER(name, member) \
+ template <typename T> class name \
+ { \
+ template <typename U> static long test(decltype(&U:: member)); \
+ template <typename U> static char test(...); \
+ public: \
+ static constexpr const bool value = sizeof(test<T>(nullptr)) == sizeof(long); \
+ }
#endif /* PTYPES_H_ */
diff --git a/src/lib/netlist/plib/putil.cpp b/src/lib/netlist/plib/putil.cpp
index c34102417ec..b62cbf60865 100644
--- a/src/lib/netlist/plib/putil.cpp
+++ b/src/lib/netlist/plib/putil.cpp
@@ -2,13 +2,13 @@
// copyright-holders:Couriersud
#include "putil.h"
-#include "ptypes.h"
#include "plists.h"
+#include "ptypes.h"
-#include <cstdlib>
#include <algorithm>
-#include <initializer_list>
+#include <cstdlib>
#include <cstring>
+#include <initializer_list>
namespace plib
{
@@ -17,7 +17,7 @@ namespace plib
const pstring buildpath(std::initializer_list<pstring> list )
{
pstring ret = "";
- for( auto elem : list )
+ for( const auto &elem : list )
{
if (ret == "")
ret = elem;
@@ -33,12 +33,12 @@ namespace plib
const pstring environment(const pstring &var, const pstring &default_val)
{
- if (getenv(var.c_str()) == nullptr)
+ if (std::getenv(var.c_str()) == nullptr)
return default_val;
else
- return pstring(getenv(var.c_str()), pstring::UTF8);
+ return pstring(std::getenv(var.c_str()));
}
- }
+ } // namespace util
std::vector<pstring> psplit(const pstring &str, const pstring &onstr, bool ignore_empty)
{
@@ -64,6 +64,36 @@ namespace plib
return ret;
}
+ std::vector<std::string> psplit_r(const std::string &stri,
+ const std::string &token,
+ const std::size_t maxsplit)
+ {
+ std::string str(stri);
+ std::vector<std::string> result;
+ std::size_t splits = 0;
+
+ while(str.size())
+ {
+ std::size_t index = str.rfind(token);
+ bool found = index!=std::string::npos;
+ if (found)
+ splits++;
+ if ((splits <= maxsplit || maxsplit == 0) && found)
+ {
+ result.push_back(str.substr(index+token.size()));
+ str = str.substr(0, index);
+ if (str.size()==0)
+ result.push_back(str);
+ }
+ else
+ {
+ result.push_back(str);
+ str = "";
+ }
+ }
+ return result;
+ }
+
std::vector<pstring> psplit(const pstring &str, const std::vector<pstring> &onstrl)
{
pstring col = "";
@@ -72,7 +102,7 @@ namespace plib
auto i = str.begin();
while (i != str.end())
{
- std::size_t p = static_cast<std::size_t>(-1);
+ auto p = static_cast<std::size_t>(-1);
for (std::size_t j=0; j < onstrl.size(); j++)
{
if (std::equal(onstrl[j].begin(), onstrl[j].end(), i))
@@ -92,7 +122,7 @@ namespace plib
}
else
{
- pstring::code_t c = *i;
+ pstring::value_type c = *i;
col += c;
i++;
}
@@ -131,31 +161,8 @@ namespace plib
return cnt;
return -1;
}
- pstring penum_base::nthstr(int n, const char *str)
+ std::string penum_base::nthstr(int n, const char *str)
{
- char buf[64];
- char *bufp = buf;
- int cur = 0;
- while (*str)
- {
- if (cur == n)
- {
- if (*str == ',')
- {
- *bufp = 0;
- return pstring(buf, pstring::UTF8);
- }
- else if (*str != ' ')
- *bufp++ = *str;
- }
- else
- {
- if (*str == ',')
- cur++;
- }
- str++;
- }
- *bufp = 0;
- return pstring(buf, pstring::UTF8);
+ return psplit(str, ",", false)[static_cast<std::size_t>(n)];
}
} // namespace plib
diff --git a/src/lib/netlist/plib/putil.h b/src/lib/netlist/plib/putil.h
index 8d59c0357e2..e8145361d9d 100644
--- a/src/lib/netlist/plib/putil.h
+++ b/src/lib/netlist/plib/putil.h
@@ -5,27 +5,32 @@
*
*/
-#ifndef P_UTIL_H_
-#define P_UTIL_H_
+#ifndef PUTIL_H_
+#define PUTIL_H_
#include "pstring.h"
-#include <initializer_list>
#include <algorithm>
-#include <vector> // <<= needed by windows build
+#include <initializer_list>
+#include <vector>
+
+#define PSTRINGIFY_HELP(y) # y
+#define PSTRINGIFY(x) PSTRINGIFY_HELP(x)
+
namespace plib
{
+
namespace util
{
const pstring buildpath(std::initializer_list<pstring> list );
const pstring environment(const pstring &var, const pstring &default_val);
- }
+ } // namespace util
namespace container
{
- template <class C>
- bool contains(C &con, const typename C::value_type &elem)
+ template <class C, class T>
+ bool contains(C &con, const T &elem)
{
return std::find(con.begin(), con.end(), elem) != con.end();
}
@@ -51,7 +56,51 @@ namespace plib
{
con.erase(std::remove(con.begin(), con.end(), elem), con.end());
}
- }
+ } // namespace container
+
+ /* May be further specialized .... This is the generic version */
+ template <typename T>
+ struct constants
+ {
+ static constexpr T zero() noexcept { return static_cast<T>(0); }
+ static constexpr T one() noexcept { return static_cast<T>(1); }
+ static constexpr T two() noexcept { return static_cast<T>(2); }
+
+ /*!
+ * \brief Electric constant of vacuum
+ */
+ static constexpr T eps_0() noexcept { return static_cast<T>(8.854187817e-12); }
+ /*!
+ * \brief Relative permittivity of Silicon dioxide
+ */
+ static constexpr T eps_SiO2() noexcept { return static_cast<T>(3.9); }
+ /*!
+ * \brief Relative permittivity of Silicon
+ */
+ static constexpr T eps_Si() noexcept { return static_cast<T>(11.7); }
+ /*!
+ * \brief Boltzmann constant
+ */
+ static constexpr T k_b() noexcept { return static_cast<T>(1.38064852e-23); }
+ /*!
+ * \brief room temperature (gives VT = 0.02585 at T=300)
+ */
+ static constexpr T T0() noexcept { return static_cast<T>(300); }
+ /*!
+ * \brief Elementary charge
+ */
+ static constexpr T Q_e() noexcept { return static_cast<T>(1.6021765314e-19); }
+ /*!
+ * \brief Intrinsic carrier concentration in 1/m^3 of Silicon
+ */
+ static constexpr T NiSi() noexcept { return static_cast<T>(1.45e16); }
+
+ template <typename V>
+ static constexpr const T cast(V &&v) noexcept { return static_cast<T>(v); }
+ };
+
+ static_assert(noexcept(constants<double>::one()) == true, "Not evaluated as constexpr");
+
template <class C>
struct indexed_compare
@@ -69,7 +118,41 @@ namespace plib
std::vector<pstring> psplit(const pstring &str, const pstring &onstr, bool ignore_empty = false);
std::vector<pstring> psplit(const pstring &str, const std::vector<pstring> &onstrl);
+ std::vector<std::string> psplit_r(const std::string &stri,
+ const std::string &token,
+ const std::size_t maxsplit);
+
+
+ //============================================================
+ // penum - strongly typed enumeration
+ //============================================================
+
+ struct penum_base
+ {
+ protected:
+ static int from_string_int(const char *str, const char *x);
+ static std::string nthstr(int n, const char *str);
+ };
+
+} // namespace plib
+
+#define P_ENUM(ename, ...) \
+ struct ename : public plib::penum_base { \
+ enum E { __VA_ARGS__ }; \
+ ename (E v) : m_v(v) { } \
+ bool set_from_string (const std::string &s) { \
+ static char const *const strings = # __VA_ARGS__; \
+ int f = from_string_int(strings, s.c_str()); \
+ if (f>=0) { m_v = static_cast<E>(f); return true; } else { return false; } \
+ } \
+ operator E() const {return m_v;} \
+ bool operator==(const ename &rhs) const {return m_v == rhs.m_v;} \
+ bool operator==(const E &rhs) const {return m_v == rhs;} \
+ std::string name() const { \
+ static char const *const strings = # __VA_ARGS__; \
+ return nthstr(static_cast<int>(m_v), strings); \
+ } \
+ private: E m_v; };
-}
-#endif /* P_UTIL_H_ */
+#endif /* PUTIL_H_ */
diff --git a/src/lib/netlist/plib/vector_ops.h b/src/lib/netlist/plib/vector_ops.h
new file mode 100644
index 00000000000..8043c48f61c
--- /dev/null
+++ b/src/lib/netlist/plib/vector_ops.h
@@ -0,0 +1,151 @@
+// license:GPL-2.0+
+// copyright-holders:Couriersud
+/*
+ * vector_ops.h
+ *
+ * Base vector operations
+ *
+ */
+
+#ifndef PLIB_VECTOR_OPS_H_
+#define PLIB_VECTOR_OPS_H_
+
+#include "pconfig.h"
+
+#include <algorithm>
+#include <cmath>
+#include <type_traits>
+
+#if !defined(__clang__) && !defined(_MSC_VER) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ > 6))
+#if !(__GNUC__ > 7 || (__GNUC__ == 7 && __GNUC_MINOR__ > 3))
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wmaybe-uninitialized"
+#endif
+#endif
+
+namespace plib
+{
+ template<typename VT, typename T>
+ void vec_set_scalar(const std::size_t n, VT &v, T && scalar)
+ {
+ const typename std::remove_reference<decltype(v[0])>::type s(std::forward<T>(scalar));
+ for ( std::size_t i = 0; i < n; i++ )
+ v[i] = s;
+ }
+
+ template<typename VT, typename VS>
+ void vec_set(const std::size_t n, VT &v, const VS & source)
+ {
+ for ( std::size_t i = 0; i < n; i++ )
+ v[i] = source[i];
+ }
+
+ template<typename T, typename V1, typename V2>
+ T vec_mult(const std::size_t n, const V1 & v1, const V2 & v2 )
+ {
+ using b8 = T[8];
+ PALIGNAS_VECTOROPT() b8 value = {0};
+ for (std::size_t i = 0; i < n ; i++ )
+ {
+ value[i & 7] += v1[i] * v2[i];
+ }
+ return value[0] + value[1] + value[2] + value[3] + value[4] + value[5] + value[6] + value[7];
+ }
+
+ template<typename T, typename VT>
+ T vec_mult2(const std::size_t n, const VT &v)
+ {
+ using b8 = T[8];
+ PALIGNAS_VECTOROPT() b8 value = {0};
+ for (std::size_t i = 0; i < n ; i++ )
+ {
+ value[i & 7] += v[i] * v[i];
+ }
+ return value[0] + value[1] + value[2] + value[3] + value[4] + value[5] + value[6] + value[7];
+ }
+
+ template<typename T, typename VT>
+ T vec_sum(const std::size_t n, const VT &v)
+ {
+ if (n<8)
+ {
+ T value(0);
+ for (std::size_t i = 0; i < n ; i++ )
+ value += v[i];
+
+ return value;
+ }
+ else
+ {
+ using b8 = T[8];
+ PALIGNAS_VECTOROPT() b8 value = {0};
+ for (std::size_t i = 0; i < n ; i++ )
+ value[i & 7] += v[i];
+
+ return ((value[0] + value[1]) + (value[2] + value[3])) + ((value[4] + value[5]) + (value[6] + value[7]));
+ }
+ }
+
+ template<typename VV, typename T, typename VR>
+ void vec_mult_scalar(const std::size_t n, VR & result, const VV & v, T && scalar)
+ {
+ const typename std::remove_reference<decltype(v[0])>::type s(std::forward<T>(scalar));
+ for ( std::size_t i = 0; i < n; i++ )
+ result[i] = s * v[i];
+ }
+
+ template<typename VR, typename VV, typename T>
+ void vec_add_mult_scalar(const std::size_t n, VR & result, const VV & v, T && scalar)
+ {
+ const typename std::remove_reference<decltype(v[0])>::type s(std::forward<T>(scalar));
+ for ( std::size_t i = 0; i < n; i++ )
+ result[i] += s * v[i];
+ }
+
+ template<typename T>
+ void vec_add_mult_scalar_p(const std::size_t n, T * result, const T * v, T scalar)
+ {
+ for ( std::size_t i = 0; i < n; i++ )
+ result[i] += scalar * v[i];
+ }
+
+ template<typename R, typename V>
+ void vec_add_ip(const std::size_t n, R & result, const V & v)
+ {
+ for ( std::size_t i = 0; i < n; i++ )
+ result[i] += v[i];
+ }
+
+ template<typename VR, typename V1, typename V2>
+ void vec_sub(const std::size_t n, VR & result, const V1 &v1, const V2 & v2)
+ {
+ for ( std::size_t i = 0; i < n; i++ )
+ result[i] = v1[i] - v2[i];
+ }
+
+ template<typename V, typename T>
+ void vec_scale(const std::size_t n, V & v, T &&scalar)
+ {
+ const typename std::remove_reference<decltype(v[0])>::type s(std::forward<T>(scalar));
+ for ( std::size_t i = 0; i < n; i++ )
+ v[i] *= s;
+ }
+
+ template<typename T, typename V>
+ T vec_maxabs(const std::size_t n, const V & v)
+ {
+ T ret = 0.0;
+ for ( std::size_t i = 0; i < n; i++ )
+ ret = std::max(ret, std::abs(v[i]));
+
+ return ret;
+ }
+} // namespace plib
+
+#if !defined(__clang__) && !defined(_MSC_VER) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ > 6))
+#if !(__GNUC__ > 7 || (__GNUC__ == 7 && __GNUC_MINOR__ > 3))
+#pragma GCC diagnostic pop
+#endif
+#endif
+
+#endif /* PLIB_VECTOR_OPS_H_ */
diff --git a/src/lib/netlist/prg/nltool.cpp b/src/lib/netlist/prg/nltool.cpp
index a1d53d6792d..4a1c8ac0315 100644
--- a/src/lib/netlist/prg/nltool.cpp
+++ b/src/lib/netlist/prg/nltool.cpp
@@ -9,21 +9,23 @@
****************************************************************************/
#include "netlist/plib/pmain.h"
-#include "netlist/nl_setup.h"
-#include "netlist/nl_parser.h"
#include "netlist/devices/net_lib.h"
-#include "netlist/tools/nl_convert.h"
+#include "netlist/nl_parser.h"
+#include "netlist/nl_setup.h"
#include "netlist/solver/nld_solver.h"
+#include "netlist/tools/nl_convert.h"
#include <cstring>
+#define NLTOOL_VERSION 20190202
+
class tool_app_t : public plib::app
{
public:
tool_app_t() :
plib::app(),
opt_grp1(*this, "General options", "The following options apply to all commands."),
- opt_cmd (*this, "c", "cmd", "run", "run:convert:listdevices:static:header:docheader", "run|convert|listdevices|static|header"),
+ opt_cmd (*this, "c", "cmd", 0, std::vector<pstring>({"run","convert","listdevices","static","header","docheader"}), "run|convert|listdevices|static|header|docheader"),
opt_file(*this, "f", "file", "-", "file to process (default is stdin)"),
opt_defines(*this, "D", "define", "predefine value as macro, e.g. -Dname=value. If '=value' is omitted predefine it as 1. This option may be specified repeatedly."),
opt_rfolders(*this, "r", "rom", "where to look for data files"),
@@ -31,25 +33,34 @@ public:
opt_quiet(*this, "q", "quiet", "be quiet - no warnings"),
opt_version(*this, "", "version", "display version and exit"),
opt_help(*this, "h", "help", "display help and exit"),
+
opt_grp2(*this, "Options for run and static commands", "These options apply to run and static commands."),
opt_name(*this, "n", "name", "", "the netlist in file specified by ""-f"" option to run; default is first one"),
+
opt_grp3(*this, "Options for run command", "These options are only used by the run command."),
- opt_ttr (*this, "t", "time_to_run", 1.0, "time to run the emulation (seconds)"),
+ opt_ttr (*this, "t", "time_to_run", 1.0, "time to run the emulation (seconds)\n\n abc def\n\n xyz"),
opt_logs(*this, "l", "log" , "define terminal to log. This option may be specified repeatedly."),
opt_inp(*this, "i", "input", "", "input file to process (default is none)"),
opt_loadstate(*this,"", "loadstate", "", "load state from file and continue from there"),
opt_savestate(*this,"", "savestate", "", "save state to file at end of run"),
+
opt_grp4(*this, "Options for convert command", "These options are only used by the convert command."),
- opt_type(*this, "y", "type", "spice", "spice:eagle:rinf", "type of file to be converted: spice,eagle,rinf"),
+ opt_type(*this, "y", "type", 0, std::vector<pstring>({"spice","eagle","rinf"}), "type of file to be converted: spice,eagle,rinf"),
+
+ opt_grp5(*this, "Options for header command", "These options are only used by the header command."),
+ opt_tabwidth(*this, "", "tab-width", 4, "Tab width for output."),
+ opt_linewidth(*this,"", "line-width", 72, "Line width for output."),
opt_ex1(*this, "nltool -c run -t 3.5 -f nl_examples/cdelay.c -n cap_delay",
"Run netlist \"cap_delay\" from file nl_examples/cdelay.c for 3.5 seconds"),
opt_ex2(*this, "nltool --cmd=listdevices",
- "List all known devices.")
+ "List all known devices."),
+ opt_ex3(*this, "nltool --cmd=header --tab-width=8 --line-width=80",
+ "Create the header file needed for including netlists as code.")
{}
plib::option_group opt_grp1;
- plib::option_str_limit opt_cmd;
+ plib::option_str_limit<unsigned> opt_cmd;
plib::option_str opt_file;
plib::option_vec opt_defines;
plib::option_vec opt_rfolders;
@@ -60,18 +71,22 @@ public:
plib::option_group opt_grp2;
plib::option_str opt_name;
plib::option_group opt_grp3;
- plib::option_double opt_ttr;
+ plib::option_num<double> opt_ttr;
plib::option_vec opt_logs;
plib::option_str opt_inp;
plib::option_str opt_loadstate;
plib::option_str opt_savestate;
plib::option_group opt_grp4;
- plib::option_str_limit opt_type;
+ plib::option_str_limit<unsigned> opt_type;
+ plib::option_group opt_grp5;
+ plib::option_num<unsigned> opt_tabwidth;
+ plib::option_num<unsigned> opt_linewidth;
plib::option_example opt_ex1;
plib::option_example opt_ex2;
+ plib::option_example opt_ex3;
- int execute();
- pstring usage();
+ int execute() override;
+ pstring usage() override;
private:
void run();
@@ -86,6 +101,8 @@ private:
void listdevices();
+ std::vector<pstring> m_options;
+
};
static NETLIST_START(dummy)
@@ -103,45 +120,54 @@ NETLIST_END()
class netlist_data_folder_t : public netlist::source_t
{
public:
- netlist_data_folder_t(netlist::setup_t &setup,
- pstring folder)
- : netlist::source_t(setup, netlist::source_t::DATA)
+ netlist_data_folder_t(const pstring &folder)
+ : netlist::source_t(netlist::source_t::DATA)
, m_folder(folder)
{
}
- virtual std::unique_ptr<plib::pistream> stream(const pstring &file) override;
+ plib::unique_ptr<plib::pistream> stream(const pstring &file) override;
private:
pstring m_folder;
};
-std::unique_ptr<plib::pistream> netlist_data_folder_t::stream(const pstring &file)
+plib::unique_ptr<plib::pistream> netlist_data_folder_t::stream(const pstring &file)
{
pstring name = m_folder + "/" + file;
try
{
- auto strm = plib::make_unique_base<plib::pistream, plib::pifilestream>(name);
- return strm;
+ auto strm = plib::make_unique<plib::pifilestream>(name);
+ return std::move(strm);
}
catch (const plib::pexception &e)
{
if (dynamic_cast<const plib::file_open_e *>(&e) == nullptr )
throw;
}
- return std::unique_ptr<plib::pistream>(nullptr);
+ return plib::unique_ptr<plib::pistream>(nullptr);
}
+class netlist_tool_callbacks_t : public netlist::callbacks_t
+{
+public:
+ netlist_tool_callbacks_t(tool_app_t &app)
+ : netlist::callbacks_t()
+ , m_app(app)
+ { }
+
+ void vlog(const plib::plog_level &l, const pstring &ls) const override;
+
+private:
+ tool_app_t &m_app;
+};
+
class netlist_tool_t : public netlist::netlist_t
{
public:
netlist_tool_t(tool_app_t &app, const pstring &aname)
- : netlist::netlist_t(aname), m_app(app)
- {
- }
-
- virtual ~netlist_tool_t() override
+ : netlist::netlist_t(aname, plib::make_unique<netlist_tool_callbacks_t>(app))
{
}
@@ -149,6 +175,8 @@ public:
{
}
+ netlist::setup_t &setup() { return nlstate().setup(); }
+
void read_netlist(const pstring &filename, const pstring &name,
const std::vector<pstring> &logs,
const std::vector<pstring> &defines,
@@ -157,23 +185,22 @@ public:
// read the netlist ...
for (auto & d : defines)
- setup().register_define(d);
+ setup().add_define(d);
for (auto & r : roms)
- setup().register_source(plib::make_unique_base<netlist::source_t, netlist_data_folder_t>(setup(), r));
+ setup().register_source(plib::make_unique<netlist_data_folder_t>(r));
- setup().register_source(plib::make_unique_base<netlist::source_t,
- netlist::source_file_t>(setup(), filename));
+ setup().register_source(plib::make_unique<netlist::source_file_t>(filename));
setup().include(name);
- log_setup(logs);
+ create_dynamic_logs(logs);
// start devices
- this->start();
+ setup().prepare_to_run();
// reset
this->reset();
}
- void log_setup(const std::vector<pstring> &logs)
+ void create_dynamic_logs(const std::vector<pstring> &logs)
{
log().debug("Creating dynamic logs ...\n");
for (auto & log : logs)
@@ -186,15 +213,15 @@ public:
std::vector<char> save_state()
{
- state().pre_save();
+ run_state_manager().pre_save();
std::size_t size = 0;
- for (auto const & s : state().save_list())
+ for (auto const & s : run_state_manager().save_list())
size += s->m_dt.size * s->m_count;
std::vector<char> buf(size);
char *p = buf.data();
- for (auto const & s : state().save_list())
+ for (auto const & s : run_state_manager().save_list())
{
std::size_t sz = s->m_dt.size * s->m_count;
if (s->m_dt.is_float || s->m_dt.is_integral)
@@ -210,7 +237,7 @@ public:
void load_state(std::vector<char> &buf)
{
std::size_t size = 0;
- for (auto const & s : state().save_list())
+ for (auto const & s : run_state_manager().save_list())
size += s->m_dt.size * s->m_count;
if (buf.size() != size)
@@ -218,7 +245,7 @@ public:
char *p = buf.data();
- for (auto const & s : state().save_list())
+ for (auto const & s : run_state_manager().save_list())
{
std::size_t sz = s->m_dt.size * s->m_count;
if (s->m_dt.is_float || s->m_dt.is_integral)
@@ -227,19 +254,16 @@ public:
log().fatal("found unsupported save element {1}\n", s->m_name);
p += sz;
}
- state().post_load();
- rebuild_lists();
+ run_state_manager().post_load();
+ nlstate().rebuild_lists();
}
protected:
- void vlog(const plib::plog_level &l, const pstring &ls) const override;
-
private:
- tool_app_t &m_app;
};
-void netlist_tool_t::vlog(const plib::plog_level &l, const pstring &ls) const
+void netlist_tool_callbacks_t::vlog(const plib::plog_level &l, const pstring &ls) const
{
pstring err = plib::pfmt("{}: {}\n")(l.name())(ls.c_str());
// FIXME: ...
@@ -248,18 +272,19 @@ void netlist_tool_t::vlog(const plib::plog_level &l, const pstring &ls) const
throw netlist::nl_exception(err);
}
-
struct input_t
{
input_t(const netlist::setup_t &setup, const pstring &line)
+ : m_value(0.0)
{
- char buf[400];
+ std::array<char, 400> buf; // NOLINT(cppcoreguidelines-pro-type-member-init)
double t;
- int e = sscanf(line.c_str(), "%lf,%[^,],%lf", &t, buf, &m_value);
+ // NOLINTNEXTLINE(cppcoreguidelines-pro-type-vararg)
+ int e = sscanf(line.c_str(), "%lf,%[^,],%lf", &t, buf.data(), &m_value);
if (e != 3)
throw netlist::nl_exception(plib::pfmt("error {1} scanning line {2}\n")(e)(line));
m_time = netlist::netlist_time::from_double(t);
- m_param = setup.find_param(pstring(buf, pstring::UTF8), true);
+ m_param = setup.find_param(pstring(buf.data()), true);
}
void setparam()
@@ -286,13 +311,12 @@ struct input_t
double m_value;
};
-static std::vector<input_t> read_input(const netlist::setup_t &setup, pstring fname)
+static std::vector<input_t> read_input(const netlist::setup_t &setup, const pstring &fname)
{
std::vector<input_t> ret;
if (fname != "")
{
- plib::pifilestream f(fname);
- plib::putf8_reader r(f);
+ plib::putf8_reader r = plib::putf8_reader(plib::pifilestream(fname));
pstring l;
while (r.readline(l))
{
@@ -309,78 +333,82 @@ static std::vector<input_t> read_input(const netlist::setup_t &setup, pstring fn
void tool_app_t::run()
{
plib::chrono::timer<plib::chrono::system_ticks> t;
- t.start();
-
+ std::vector<input_t> inps;
+ netlist::netlist_time ttr;
netlist_tool_t nt(*this, "netlist");
- //plib::perftime_t<plib::exact_ticks> t;
- nt.init();
+ {
+ auto t_guard(t.guard());
+ //plib::perftime_t<plib::exact_ticks> t;
- if (!opt_verb())
- nt.log().verbose.set_enabled(false);
- if (opt_quiet())
- nt.log().warning.set_enabled(false);
+ nt.init();
- nt.read_netlist(opt_file(), opt_name(),
- opt_logs(),
- opt_defines(), opt_rfolders());
+ if (!opt_verb())
+ nt.log().verbose.set_enabled(false);
+ if (opt_quiet())
+ nt.log().warning.set_enabled(false);
- std::vector<input_t> inps = read_input(nt.setup(), opt_inp());
+ nt.read_netlist(opt_file(), opt_name(),
+ opt_logs(),
+ m_options, opt_rfolders());
+
+ inps = read_input(nt.setup(), opt_inp());
+ ttr = netlist::netlist_time::from_double(opt_ttr());
+ }
- netlist::netlist_time ttr = netlist::netlist_time::from_double(opt_ttr());
- t.stop();
pout("startup time ==> {1:5.3f}\n", t.as_seconds() );
t.reset();
- t.start();
- // FIXME: error handling
- if (opt_loadstate.was_specified())
+ netlist::netlist_time nlt = nt.time();
{
- plib::pifilestream strm(opt_loadstate());
- plib::pbinary_reader reader(strm);
- std::vector<char> loadstate;
- reader.read(loadstate);
- nt.load_state(loadstate);
- pout("Loaded state, run will continue at {1:.6f}\n", nt.time().as_double());
- }
+ auto t_guard(t.guard());
- unsigned pos = 0;
- netlist::netlist_time nlt = nt.time();
+ // FIXME: error handling
+ if (opt_loadstate.was_specified())
+ {
+ plib::pifilestream strm(opt_loadstate());
+ plib::pbinary_reader reader(strm);
+ std::vector<char> loadstate;
+ reader.read(loadstate);
+ nt.load_state(loadstate);
+ pout("Loaded state, run will continue at {1:.6f}\n", nt.time().as_double());
+ }
+ unsigned pos = 0;
- while (pos < inps.size()
- && inps[pos].m_time < ttr
- && inps[pos].m_time >= nlt)
- {
- nt.process_queue(inps[pos].m_time - nlt);
- inps[pos].setparam();
- nlt = inps[pos].m_time;
- pos++;
- }
- pout("runnning ...\n");
+ while (pos < inps.size()
+ && inps[pos].m_time < ttr
+ && inps[pos].m_time >= nlt)
+ {
+ nt.process_queue(inps[pos].m_time - nlt);
+ inps[pos].setparam();
+ nlt = inps[pos].m_time;
+ pos++;
+ }
- if (ttr > nlt)
- nt.process_queue(ttr - nlt);
- else
- {
- pout("end time {1:.6f} less than saved time {2:.6f}\n",
- ttr.as_double(), nlt.as_double());
- ttr = nlt;
- }
+ pout("runnning ...\n");
- if (opt_savestate.was_specified())
- {
- auto savestate = nt.save_state();
- plib::pofilestream strm(opt_savestate());
- plib::pbinary_writer writer(strm);
- writer.write(savestate);
- }
- nt.stop();
+ if (ttr > nlt)
+ nt.process_queue(ttr - nlt);
+ else
+ {
+ pout("end time {1:.6f} less than saved time {2:.6f}\n",
+ ttr.as_double(), nlt.as_double());
+ ttr = nlt;
+ }
- t.stop();
+ if (opt_savestate.was_specified())
+ {
+ auto savestate = nt.save_state();
+ plib::pofilestream strm(opt_savestate());
+ plib::pbinary_writer writer(strm);
+ writer.write(savestate);
+ }
+ nt.stop();
+ }
double emutime = t.as_seconds();
pout("{1:f} seconds emulation took {2:f} real time ==> {3:5.2f}%\n",
@@ -399,9 +427,9 @@ void tool_app_t::static_compile()
nt.read_netlist(opt_file(), opt_name(),
opt_logs(),
- opt_defines(), opt_rfolders());
+ m_options, opt_rfolders());
- plib::putf8_writer w(pout_strm);
+ plib::putf8_writer w(&pout_strm);
std::map<pstring, pstring> mp;
nt.solver()->create_solver_code(mp);
@@ -417,13 +445,26 @@ void tool_app_t::static_compile()
void tool_app_t::mac_out(const pstring &s, const bool cont)
{
- static constexpr unsigned RIGHT = 72;
if (cont)
{
- unsigned adj = 0;
+ unsigned pos = 0;
+ pstring r;
for (const auto &x : s)
- adj += (x == '\t' ? 3 : 0);
- pout("{1}\\\n", s.rpad(" ", RIGHT-1-adj));
+ {
+ if (x == '\t')
+ {
+ auto pos_mod_4 = pos % opt_tabwidth();
+ auto tab_adj = opt_tabwidth() - pos_mod_4;
+ r += plib::rpad(pstring(""), pstring(" "), tab_adj);
+ pos += tab_adj;
+ }
+ else
+ {
+ r += x;
+ pos++;
+ }
+ }
+ pout("{1}\\\n", plib::rpad(r, pstring(" "), opt_linewidth()-1));
}
else
pout("{1}\n", s);
@@ -433,15 +474,15 @@ void tool_app_t::cmac(const netlist::factory::element_t *e)
{
auto v = plib::psplit(e->param_desc(), ",");
pstring vs;
- for (auto s : v)
- vs += ", p" + s.replace_all("+", "").replace_all(".", "_");
+ for (const auto &s : v)
+ vs += ", p" + plib::replace_all(plib::replace_all(s, "+", ""), ".", "_");
mac_out("#define " + e->name() + "(name" + vs + ")");
mac_out("\tNET_REGISTER_DEV(" + e->name() +", name)");
- for (auto s : v)
+ for (const auto &s : v)
{
- pstring r(s.replace_all("+", "").replace_all(".", "_"));
- if (s.startsWith("+"))
+ pstring r(plib::replace_all(plib::replace_all(s, "+", ""), ".", "_"));
+ if (plib::startsWith(s, "+"))
mac_out("\tNET_CONNECT(name, " + r + ", p" + r + ")");
else
mac_out("\tNETDEV_PARAMI(name, " + r + ", p" + r + ")");
@@ -453,18 +494,18 @@ void tool_app_t::mac(const netlist::factory::element_t *e)
{
auto v = plib::psplit(e->param_desc(), ",");
pstring vs;
- for (auto s : v)
+ for (const auto &s : v)
{
- vs += ", " + s.replace_all("+", "").replace_all(".", "_");
+ vs += ", " + plib::replace_all(plib::replace_all(s, "+", ""), ".", "_");
}
pout("{1}(name{2})\n", e->name(), vs);
if (v.size() > 0)
{
pout("/*\n");
- for (auto s : v)
+ for (const auto &s : v)
{
- pstring r(s.replace_all("+", "").replace_all(".", "_"));
- if (s.startsWith("+"))
+ pstring r(plib::replace_all(plib::replace_all(s, "+", ""), ".", "_"));
+ if (plib::startsWith(s, "+"))
pout("{1:10}: Terminal\n",r);
else
pout("{1:10}: Parameter\n", r);
@@ -482,8 +523,7 @@ void tool_app_t::create_header()
nt.log().verbose.set_enabled(false);
nt.log().warning.set_enabled(false);
- nt.setup().register_source(plib::make_unique_base<netlist::source_t,
- netlist::source_proc_t>(nt.setup(), "dummy", &netlist_dummy));
+ nt.setup().register_source(plib::make_unique<netlist::source_proc_t>("dummy", &netlist_dummy));
nt.setup().include("dummy");
pout("// license:GPL-2.0+\n");
@@ -506,9 +546,9 @@ void tool_app_t::create_header()
if (last_source != e->sourcefile())
{
last_source = e->sourcefile();
- pout("{1}\n", pstring("// ").rpad("-", 72));
- pout("{1}{2}\n", pstring("// Source: "), e->sourcefile().replace_all("../", ""));
- pout("{1}\n", pstring("// ").rpad("-", 72));
+ pout("{1}\n", plib::rpad(pstring("// "), pstring("-"), opt_linewidth()));
+ pout("{1}{2}\n", pstring("// Source: "), plib::replace_all(e->sourcefile(), "../", ""));
+ pout("{1}\n", plib::rpad(pstring("// "), pstring("-"), opt_linewidth()));
}
cmac(e.get());
}
@@ -527,8 +567,7 @@ void tool_app_t::create_docheader()
nt.log().verbose.set_enabled(false);
nt.log().warning.set_enabled(false);
- nt.setup().register_source(plib::make_unique_base<netlist::source_t,
- netlist::source_proc_t>(nt.setup(), "dummy", &netlist_dummy));
+ nt.setup().register_source(plib::make_unique<netlist::source_proc_t>("dummy", &netlist_dummy));
nt.setup().include("dummy");
std::vector<pstring> devs;
@@ -580,73 +619,42 @@ void tool_app_t::listdevices()
netlist::factory::list_t &list = nt.setup().factory();
- nt.setup().register_source(plib::make_unique_base<netlist::source_t,
- netlist::source_proc_t>(nt.setup(), "dummy", &netlist_dummy));
+ nt.setup().register_source(plib::make_unique<netlist::source_proc_t>("dummy", &netlist_dummy));
nt.setup().include("dummy");
- nt.start();
+ nt.setup().prepare_to_run();
- std::vector<plib::owned_ptr<netlist::core_device_t>> devs;
+ std::vector<netlist::pool_owned_ptr<netlist::core_device_t>> devs;
for (auto & f : list)
{
pstring out = plib::pfmt("{1:-20} {2}(<id>")(f->classname())(f->name());
- std::vector<pstring> terms;
- f->macro_actions(nt.setup().netlist(), f->name() + "_lc");
- auto d = f->Create(nt.setup().netlist(), f->name() + "_lc");
+ f->macro_actions(nt.setup(), f->name() + "_lc");
+ auto d = f->Create(nt.nlstate(), f->name() + "_lc");
// get the list of terminals ...
- for (auto & t : nt.setup().m_terminals)
- {
- if (t.second->name().startsWith(d->name()))
- {
- pstring tn(t.second->name().substr(d->name().length()+1));
- if (tn.find(".") == pstring::npos)
- terms.push_back(tn);
- }
- }
-
- for (auto & t : nt.setup().m_alias)
- {
- if (t.first.startsWith(d->name()))
- {
- pstring tn(t.first.substr(d->name().length()+1));
- //printf("\t%s %s %s\n", t.first.c_str(), t.second.c_str(), tn.c_str());
- if (tn.find(".") == pstring::npos)
- {
- terms.push_back(tn);
- pstring resolved = nt.setup().resolve_alias(t.first);
- //printf("\t%s %s %s\n", t.first.c_str(), t.second.c_str(), resolved.c_str());
- if (resolved != t.first)
- {
- auto found = std::find(terms.begin(), terms.end(), resolved.substr(d->name().length()+1));
- if (found!=terms.end())
- terms.erase(found);
- }
- }
- }
- }
+ std::vector<pstring> terms(nt.setup().get_terminals_for_device_name(d->name()));
out += "," + f->param_desc();
- for (auto p : plib::psplit(f->param_desc(),",") )
+ for (const auto &p : plib::psplit(f->param_desc(),",") )
{
- if (p.startsWith("+"))
+ if (plib::startsWith(p, "+"))
{
plib::container::remove(terms, p.substr(1));
}
}
out += ")";
- printf("%s\n", out.c_str());
+ pout("{}\n", out);
if (terms.size() > 0)
{
pstring t = "";
for (auto & j : terms)
t += "," + j;
- printf("\tTerminals: %s\n", t.substr(1).c_str());
+ pout("\tTerminals: {}\n", t.substr(1));
}
- devs.push_back(std::move(d));
+ devs.emplace_back(std::move(d));
}
}
@@ -681,10 +689,6 @@ int tool_app_t::execute()
plib::fpsignalenabler::global_enable(true);
plib::fpsignalenabler sigen(plib::FP_ALL & ~plib::FP_INEXACT & ~plib::FP_UNDERFLOW);
- //perr("{}", "WARNING: This is Work In Progress! - It may fail anytime\n");
- //perr("Update dispatching using method {}\n", pmf_verbose[NL_PMF_TYPE]);
- //printf("test2 %f\n", std::exp(-14362.38064713));
-
if (opt_help())
{
pout(usage());
@@ -694,8 +698,8 @@ int tool_app_t::execute()
if (opt_version())
{
pout(
- "nltool (netlist) 0.1\n"
- "Copyright (C) 2018 Couriersud\n"
+ "nltool (netlist) " PSTRINGIFY(NLTOOL_VERSION) "\n"
+ "Copyright (C) 2019 Couriersud\n"
"License GPLv2+: GNU GPL version 2 or later <http://gnu.org/licenses/gpl.html>.\n"
"This is free software: you are free to change and redistribute it.\n"
"There is NO WARRANTY, to the extent permitted by law.\n\n"
@@ -703,9 +707,12 @@ int tool_app_t::execute()
return 0;
}
+ m_options = opt_defines();
+ m_options.emplace_back("NLTOOL_VERSION=" PSTRINGIFY(NLTOOL_VERSION));
+
try
{
- pstring cmd = opt_cmd();
+ pstring cmd = opt_cmd.as_string();
if (cmd == "listdevices")
listdevices();
else if (cmd == "run")
@@ -723,29 +730,29 @@ int tool_app_t::execute()
if (opt_file() == "-")
{
plib::pstdin f;
- ostrm.write(f);
+ plib::copystream(ostrm, f);
}
else
{
plib::pifilestream f(opt_file());
- ostrm.write(f);
+ plib::copystream(ostrm, f);
}
contents = ostrm.str();
pstring result;
- if (opt_type().equals("spice"))
+ if (opt_type.as_string() == "spice")
{
nl_convert_spice_t c;
c.convert(contents);
result = c.result();
}
- else if (opt_type().equals("eagle"))
+ else if (opt_type.as_string() == "eagle")
{
nl_convert_eagle_t c;
c.convert(contents);
result = c.result();
}
- else if (opt_type().equals("rinf"))
+ else if (opt_type.as_string() == "rinf")
{
nl_convert_rinf_t c;
c.convert(contents);
@@ -771,13 +778,6 @@ int tool_app_t::execute()
perr("plib exception caught: {}\n", e.text());
}
-#if 0
-#define str(x) # x
-#define strx(x) str(x)
-#define ttt strx(__cplusplus)
- printf("%s\n", ttt);
-#endif
-
return 0;
}
diff --git a/src/lib/netlist/prg/nlwav.cpp b/src/lib/netlist/prg/nlwav.cpp
index 23491e88349..683bb8a1c55 100644
--- a/src/lib/netlist/prg/nlwav.cpp
+++ b/src/lib/netlist/prg/nlwav.cpp
@@ -1,45 +1,13 @@
// license:GPL-2.0+
// copyright-holders:Couriersud
-#include <cstring>
-#include "../plib/pstring.h"
-#include "../plib/plists.h"
-#include "../plib/pstream.h"
-#include "../plib/pmain.h"
-#include "../plib/ppmf.h"
-#include "../nl_setup.h"
-
-class nlwav_app : public plib::app
-{
-public:
- nlwav_app() :
- plib::app(),
- opt_inp(*this, "i", "input", "-", "input file"),
- opt_out(*this, "o", "output", "-", "output file"),
- opt_amp(*this, "a", "amp", 10000.0, "amplification after mean correction"),
- opt_rate(*this, "r", "rate", 48000, "sample rate of output file"),
- opt_verb(*this, "v", "verbose", "be verbose - this produces lots of output"),
- opt_quiet(*this,"q", "quiet", "be quiet - no warnings"),
- opt_version(*this, "", "version", "display version and exit"),
- opt_help(*this, "h", "help", "display help and exit")
- {}
- plib::option_str opt_inp;
- plib::option_str opt_out;
- plib::option_double opt_amp;
- plib::option_long opt_rate;
- plib::option_bool opt_verb;
- plib::option_bool opt_quiet;
- plib::option_bool opt_version;
- plib::option_bool opt_help;
-
- int execute();
- pstring usage();
-
- plib::pstdin pin_strm;
-private:
- void convert1(long sample_rate);
- void convert(long sample_rate);
-};
+#include "plib/pstring.h"
+#include "netlist/nl_setup.h"
+#include "plib/plists.h"
+#include "plib/pmain.h"
+#include "plib/ppmf.h"
+#include "plib/pstream.h"
+#include <cstring>
/* From: https://ffmpeg.org/pipermail/ffmpeg-devel/2007-October/038122.html
* The most compatible way to make a wav header for unknown length is to put
@@ -51,324 +19,470 @@ private:
* and data chunk length to the file.
*/
/* http://de.wikipedia.org/wiki/RIFF_WAVE */
+
class wav_t
{
public:
- wav_t(plib::postream &strm, unsigned sr) : m_f(strm)
+ // XXNOLINTNEXTLINE(cppcoreguidelines-pro-type-member-init)
+ wav_t(plib::postream &strm, std::size_t sr, std::size_t channels)
+ : m_f(strm)
+ /* force "play" to play and warn about eof instead of being silent */
+ , m_fmt(static_cast<std::uint16_t>(channels), static_cast<std::uint32_t>(sr))
+ , m_data(m_f.seekable() ? 0 : 0xffffffff)
{
- initialize(sr);
- m_f.write(&m_fh, sizeof(m_fh));
- m_f.write(&m_fmt, sizeof(m_fmt));
- m_f.write(&m_data, sizeof(m_data));
+
+ write(m_fh);
+ write(m_fmt);
+ write(m_data);
}
+
+ COPYASSIGNMOVE(wav_t, delete)
+
~wav_t()
{
if (m_f.seekable())
{
m_fh.filelen = m_data.len + sizeof(m_data) + sizeof(m_fh) + sizeof(m_fmt) - 8;
- m_f.seek(0);
- m_f.write(&m_fh, sizeof(m_fh));
- m_f.write(&m_fmt, sizeof(m_fmt));
+ m_f.seekp(0);
+ write(m_fh);
+ write(m_fmt);
//data.len = fmt.block_align * n;
- m_f.write(&m_data, sizeof(m_data));
+ write(m_data);
}
}
- unsigned channels() { return m_fmt.channels; }
- unsigned sample_rate() { return m_fmt.sample_rate; }
+ std::size_t channels() { return m_fmt.channels; }
+ std::size_t sample_rate() { return m_fmt.sample_rate; }
+
+ template <typename T>
+ void write(const T &val)
+ {
+ m_f.write(reinterpret_cast<const plib::postream::value_type *>(&val), sizeof(T));
+ }
- void write_sample(int sample)
+ void write_sample(int *sample)
{
m_data.len += m_fmt.block_align;
- int16_t ps = static_cast<int16_t>(sample); /* 16 bit sample, FIXME: Endianess? */
- m_f.write(&ps, sizeof(ps));
+ for (std::size_t i = 0; i < channels(); i++)
+ {
+ auto ps = static_cast<int16_t>(sample[i]); /* 16 bit sample, FIXME: Endianess? */
+ write(ps);
+ }
}
private:
struct riff_chunk_t
{
- uint8_t group_id[4];
- uint32_t filelen;
- uint8_t rifftype[4];
+ uint8_t group_id[4] = {'R','I','F','F'};
+ uint32_t filelen = 0;
+ uint8_t rifftype[4] = {'W','A','V','E'};
};
struct riff_format_t
{
- uint8_t signature[4];
- uint32_t fmt_length;
- uint16_t format_tag;
+ riff_format_t(uint16_t achannels, uint32_t asample_rate)
+ {
+ channels = achannels;
+ sample_rate = asample_rate;
+ block_align = channels * ((bits_sample + 7) / 8);
+ bytes_per_second = sample_rate * block_align;
+ }
+ uint8_t signature[4] = {'f','m','t',' '};
+ uint32_t fmt_length = 16;
+ uint16_t format_tag = 0x0001; // PCM
uint16_t channels;
uint32_t sample_rate;
uint32_t bytes_per_second;
uint16_t block_align;
- uint16_t bits_sample;
+ uint16_t bits_sample = 16;
};
struct riff_data_t
{
- uint8_t signature[4];
+ riff_data_t(uint32_t alen) : len(alen) {}
+ uint8_t signature[4] = {'d','a','t','a'};
uint32_t len;
// data follows
};
- void initialize(unsigned sr)
- {
- std::memcpy(m_fh.group_id, "RIFF", 4);
- m_fh.filelen = 0x0; // Fixme
- std::memcpy(m_fh.rifftype, "WAVE", 4);
-
- std::memcpy(m_fmt.signature, "fmt ", 4);
- m_fmt.fmt_length = 16;
- m_fmt.format_tag = 0x0001; //PCM
- m_fmt.channels = 1;
- m_fmt.sample_rate = sr;
- m_fmt.bits_sample = 16;
- m_fmt.block_align = m_fmt.channels * ((m_fmt.bits_sample + 7) / 8);
- m_fmt.bytes_per_second = m_fmt.sample_rate * m_fmt.block_align;
-
- std::memcpy(m_data.signature, "data", 4);
- //m_data.len = m_fmt.bytes_per_second * 2 * 0;
- /* force "play" to play and warn about eof instead of being silent */
- m_data.len = (m_f.seekable() ? 0 : 0xffffffff);
-
- }
+ plib::postream &m_f;
riff_chunk_t m_fh;
riff_format_t m_fmt;
riff_data_t m_data;
- plib::postream &m_f;
-
};
class log_processor
{
public:
- typedef plib::pmfp<void, double, double> callback_type;
- log_processor(plib::pistream &is, callback_type cb) : m_is(is), m_cb(cb) { }
+ using callback_type = plib::pmfp<void, std::size_t, double, double>;
+
+ struct elem
+ {
+ elem() : t(0), v(0), eof(false), need_more(true) { }
+ double t;
+ double v;
+ bool eof;
+ bool need_more;
+ };
+
+ log_processor(std::size_t channels, callback_type &cb)
+ : m_cb(cb)
+ , m_e(channels)
+ { }
+
+ bool readmore(std::vector<plib::putf8_reader> &r)
+ {
+ bool success = false;
+ for (std::size_t i = 0; i< r.size(); i++)
+ {
+ if (m_e[i].need_more)
+ {
+ pstring line;
+ m_e[i].eof = !r[i].readline(line);
+ if (!m_e[i].eof)
+ {
+ // sscanf is very fast ...
+ // NOLINTNEXTLINE(cppcoreguidelines-pro-type-vararg)
+ sscanf(line.c_str(), "%lf %lf", &m_e[i].t, &m_e[i].v);
+ m_e[i].need_more = false;
+ }
+ }
+ success |= !m_e[i].eof;
+ }
+ return success;
+ }
- void process()
+ void process(std::vector<plib::unique_ptr<plib::pistream>> &is)
{
- plib::putf8_reader reader(m_is);
+ std::vector<plib::putf8_reader> readers;
+ for (auto &i : is)
+ {
+ plib::putf8_reader r(std::move(i));
+ readers.push_back(std::move(r));
+ }
+
pstring line;
+ bool more = readmore(readers);
- while(reader.readline(line))
+ while (more)
{
- double t = 0.0; double v = 0.0;
- sscanf(line.c_str(), "%lf %lf", &t, &v);
- m_cb(t, v);
+ double mint = 1e200;
+ std::size_t mini = 0;
+ for (std::size_t i = 0; i<readers.size(); i++)
+ if (!m_e[i].need_more)
+ {
+ if (m_e[i].t < mint)
+ {
+ mint = m_e[i].t;
+ mini = i;
+ }
+ }
+
+ m_e[mini].need_more = true;
+ m_cb(mini, mint, m_e[mini].v);
+ more = readmore(readers);
}
}
private:
- plib::pistream &m_is;
callback_type m_cb;
+ std::vector<elem> m_e;
};
struct aggregator
{
- typedef plib::pmfp<void, double, double> callback_type;
+ using callback_type = plib::pmfp<void, std::size_t, double, double>;
- aggregator(double quantum, callback_type cb)
- : m_quantum(quantum)
+ aggregator(std::size_t channels, double quantum, callback_type cb)
+ : m_channels(channels)
+ , m_quantum(quantum)
, m_cb(cb)
, ct(0.0)
, lt(0.0)
- , outsam(0.0)
- , cursam(0.0)
+ , outsam(channels, 0.0)
+ , cursam(channels, 0.0)
{ }
- void process(double time, double val)
+ void process(std::size_t chan, double time, double val)
{
- while (time >= ct)
+ while (time >= ct + m_quantum)
{
- outsam += (ct - lt) * cursam;
- outsam = outsam / m_quantum;
- m_cb(ct, outsam);
- outsam = 0.0;
+ for (std::size_t i=0; i< m_channels; i++)
+ {
+ outsam[i] += (ct - lt) * cursam[i];
+ outsam[i] = outsam[i] / m_quantum;
+ m_cb(i, ct, outsam[i]);
+ outsam[i] = 0.0;
+ }
lt = ct;
ct += m_quantum;
}
- outsam += (time-lt)*cursam;
+ for (std::size_t i=0; i< m_channels; i++)
+ outsam[i] += (time-lt)*cursam[i];
lt = time;
- cursam = val;
+ cursam[chan] = val;
}
private:
+ std::size_t m_channels;
double m_quantum;
callback_type m_cb;
double ct;
double lt;
- double outsam;
- double cursam;
+ std::vector<double> outsam;
+ std::vector<double> cursam;
};
class wavwriter
{
public:
- wavwriter(plib::postream &fo, unsigned sample_rate, double ampa)
- : mean(0.0)
- , means(0.0)
- , maxsam(-1e9)
- , minsam(1e9)
- , n(0)
+ wavwriter(plib::postream &fo, std::size_t channels, std::size_t sample_rate, double ampa)
+ : mean(channels, 0.0)
+ , means(channels, 0.0)
+ , maxsam(channels, -1e9)
+ , minsam(channels, 1e9)
+ , m_n(channels, 0)
+ , m_samples(channels, 0)
+ , m_last_time(0)
, m_fo(fo)
- , amp(ampa)
- , m_wo(m_fo, sample_rate)
+ , m_amp(ampa)
+ , m_wo(m_fo, sample_rate, channels)
{ }
- void process(double time, double outsam)
+ void process(std::size_t chan, double time, double outsam)
{
- means += outsam;
- maxsam = std::max(maxsam, outsam);
- minsam = std::min(minsam, outsam);
- n++;
- //mean = means / (double) n;
- mean += 5.0 / static_cast<double>(m_wo.sample_rate()) * (outsam - mean);
-
- outsam = (outsam - mean) * amp;
+ if (time > m_last_time)
+ m_wo.write_sample(m_samples.data());
+ m_last_time = time;
+ means[chan] += outsam;
+ maxsam[chan] = std::max(maxsam[chan], outsam);
+ minsam[chan] = std::min(minsam[chan], outsam);
+ m_n[chan]++;
+ //mean = means / (double) m_n;
+ mean[chan] += 5.0 / static_cast<double>(m_wo.sample_rate()) * (outsam - mean[chan]);
+
+ outsam = (outsam - mean[chan]) * m_amp;
outsam = std::max(-32000.0, outsam);
outsam = std::min(32000.0, outsam);
- m_wo.write_sample(static_cast<int>(outsam));
+ m_samples[chan] = static_cast<int>(outsam);
}
- double mean;
- double means;
- double maxsam;
- double minsam;
- std::size_t n;
+ std::vector<double> mean;
+ std::vector<double> means;
+ std::vector<double> maxsam;
+ std::vector<double> minsam;
+ std::vector<std::size_t> m_n;
+ std::vector<int> m_samples;
+ double m_last_time;
private:
+
plib::postream &m_fo;
- double amp;
+ double m_amp;
wav_t m_wo;
};
-void nlwav_app::convert(long sample_rate)
+class vcdwriter
{
- plib::postream *fo = (opt_out() == "-" ? &pout_strm : plib::palloc<plib::pofilestream>(opt_out()));
- plib::pistream *fin = (opt_inp() == "-" ? &pin_strm : plib::palloc<plib::pifilestream>(opt_inp()));
- plib::putf8_reader reader(*fin);
- wav_t *wo = plib::palloc<wav_t>(*fo, static_cast<unsigned>(sample_rate));
-
- double dt = 1.0 / static_cast<double>(wo->sample_rate());
- double ct = dt;
- //double mean = 2.4;
- double amp = opt_amp();
- double mean = 0.0;
- double means = 0.0;
- double cursam = 0.0;
- double outsam = 0.0;
- double lt = 0.0;
- double maxsam = -1e9;
- double minsam = 1e9;
- int n = 0;
- //short sample = 0;
- pstring line;
-
- while(reader.readline(line))
+public:
+
+ enum format_e
+ {
+ DIGITAL,
+ ANALOG
+ };
+
+ vcdwriter(plib::postream &fo, const std::vector<pstring> &channels,
+ format_e format, double high_level = 2.0, double low_level = 1.0)
+ : m_channels(channels.size())
+ , m_last_time(0)
+ , m_fo(fo)
+ , m_high_level(high_level)
+ , m_low_level(low_level)
+ , m_format(format)
{
-#if 1
- double t = 0.0; double v = 0.0;
- sscanf(line.c_str(), "%lf %lf", &t, &v);
- while (t >= ct)
+ for (pstring::value_type c = 64; c < 64+26; c++)
+ m_ids.emplace_back(pstring(c));
+ write("$date Sat Jan 19 14:14:17 2019\n");
+ write("$end\n");
+ write("$version Netlist nlwav 0.1\n");
+ write("$end\n");
+ write("$timescale 1 ns\n");
+ write("$end\n");
+ std::size_t i = 0;
+ for (const auto &ch : channels)
{
- outsam += (ct - lt) * cursam;
- outsam = outsam / dt;
- if (t>0.0)
- {
- means += outsam;
- maxsam = std::max(maxsam, outsam);
- minsam = std::min(minsam, outsam);
- n++;
- //mean = means / (double) n;
- mean += 5.0 / static_cast<double>(wo->sample_rate()) * (outsam - mean);
- }
- outsam = (outsam - mean) * amp;
- outsam = std::max(-32000.0, outsam);
- outsam = std::min(32000.0, outsam);
- wo->write_sample(static_cast<int>(outsam));
- outsam = 0.0;
- lt = ct;
- ct += dt;
+ // $var real 64 N1X1 N1X1 $end
+ if (format == ANALOG)
+ write(pstring("$var real 64 ") + m_ids[i++] + " " + ch + " $end\n");
+ else if (format == DIGITAL)
+ write(pstring("$var wire 1 ") + m_ids[i++] + " " + ch + " $end\n");
}
- outsam += (t-lt)*cursam;
- lt = t;
- cursam = v;
-#else
- float t = 0.0; float v = 0.0;
- fscanf(FIN, "%f %f", &t, &v);
- while (ct <= t)
+ write("$enddefinitions $end\n");
+ if (format == ANALOG)
{
- wo.write_sample(sample);
- n++;
- ct += dt;
+ write("$dumpvars\n");
+ //r0.0 N1X1
+ for (i = 0; i < channels.size(); i++)
+ write(pstring("r0.0 ") + m_ids[i] + "\n");
+ write("$end\n");
}
- means += v;
- mean = means / (double) n;
- v = v - mean;
- v = v * amp;
- if (v>32000.0)
- v = 32000.0;
- else if (v<-32000.0)
- v = -32000.0;
- sample = v;
- //printf("%f %f\n", t, v);
-#endif
+
}
- plib::pfree(wo);
- if (opt_inp() != "-")
- plib::pfree(fin);
- if (opt_out() != "-")
- plib::pfree(fo);
- if (!opt_quiet())
+ void process(std::size_t chan, double time, double outsam)
{
- perr("Mean (low freq filter): {}\n", mean);
- perr("Mean (static): {}\n", means / static_cast<double>(n));
- perr("Amp + {}\n", 32000.0 / (maxsam- mean));
- perr("Amp - {}\n", -32000.0 / (minsam- mean));
+ if (time > m_last_time)
+ {
+ write(pstring("#") + plib::to_string(static_cast<std::int64_t>(m_last_time * 1e9)) + " ");
+ write(m_buf + "\n");
+ m_buf = "";
+ m_last_time = time;
+ }
+ if (m_format == ANALOG)
+ m_buf += "r" + plib::to_string(outsam)+ " " + m_ids[chan] + " ";
+ else
+ {
+ if (outsam >= m_high_level)
+ m_buf += pstring("1") + m_ids[chan] + " ";
+ else if (outsam <= m_low_level)
+ m_buf += pstring("0") + m_ids[chan] + " ";
+ }
+ }
+
+private:
+ void write(const pstring &line)
+ {
+ auto p = static_cast<const char *>(line.c_str());
+ std::size_t len = std::strlen(p);
+ m_fo.write(p, len);
}
-}
-void nlwav_app::convert1(long sample_rate)
+ std::size_t m_channels;
+ double m_last_time;
+
+ plib::postream &m_fo;
+ std::vector<pstring> m_ids;
+ pstring m_buf;
+ double m_high_level;
+ double m_low_level;
+ format_e m_format;
+};
+
+class nlwav_app : public plib::app
{
- plib::postream *fo = (opt_out() == "-" ? &pout_strm : plib::palloc<plib::pofilestream>(opt_out()));
- plib::pistream *fin = (opt_inp() == "-" ? &pin_strm : plib::palloc<plib::pifilestream>(opt_inp()));
+public:
+ nlwav_app() :
+ plib::app(),
+ opt_fmt(*this, "f", "format", 0, std::vector<pstring>({"wav","vcda","vcdd"}),
+ "output format. Available options are wav|vcda|vcdd."
+ " wav : multichannel wav output"
+ " vcda : analog VCD output"
+ " vcdd : digital VCD output"
+ " Digital signals are created using the --high and --low options"
+ ),
+ opt_out(*this, "o", "output", "-", "output file"),
+ opt_rate(*this, "r", "rate", 48000, "sample rate of output file"),
+ opt_amp(*this, "a", "amp", 10000.0, "amplification after mean correction (wav only)"),
+ opt_high(*this, "u", "high", 2.0, "minimum input for high level (vcdd only)"),
+ opt_low(*this, "l", "low", 1.0, "maximum input for low level (vcdd only)"),
+ opt_verb(*this, "v", "verbose", "be verbose - this produces lots of output"),
+ opt_quiet(*this,"q", "quiet", "be quiet - no warnings"),
+ opt_args(*this, "input file(s)"),
+ opt_version(*this, "", "version", "display version and exit"),
+ opt_help(*this, "h", "help", "display help and exit"),
+ opt_ex1(*this, "./nlwav -f vcdd -o x.vcd log_V*",
+ "convert all files starting with \"log_V\" into a digital vcd file"),
+ opt_ex2(*this, "./nlwav -f wav -o x.wav log_V*",
+ "convert all files starting with \"log_V\" into a multichannel wav file"),
+ m_outstrm(nullptr)
+ {}
- double dt = 1.0 / static_cast<double>(sample_rate);
+ int execute() override;
+ pstring usage() override;
- wavwriter *wo = plib::palloc<wavwriter>(*fo, static_cast<unsigned>(sample_rate), opt_amp());
- aggregator ag(dt, aggregator::callback_type(&wavwriter::process, wo));
- log_processor lp(*fin, log_processor::callback_type(&aggregator::process, &ag));
+private:
+ void convert_wav();
+ void convert_vcd(vcdwriter::format_e format);
- lp.process();
+ plib::option_str_limit<unsigned> opt_fmt;
+ plib::option_str opt_out;
+ plib::option_num<std::size_t> opt_rate;
+ plib::option_num<double> opt_amp;
+ plib::option_num<double> opt_high;
+ plib::option_num<double> opt_low;
+ plib::option_bool opt_verb;
+ plib::option_bool opt_quiet;
+ plib::option_args opt_args;
+ plib::option_bool opt_version;
+ plib::option_bool opt_help;
+ plib::option_example opt_ex1;
+ plib::option_example opt_ex2;
+ plib::pstdin pin_strm;
+
+ std::vector<plib::unique_ptr<plib::pistream>> m_instrms;
+ plib::postream *m_outstrm;
+};
+
+void nlwav_app::convert_wav()
+{
+
+ double dt = 1.0 / static_cast<double>(opt_rate());
+
+ plib::unique_ptr<wavwriter> wo = plib::make_unique<wavwriter>(*m_outstrm, m_instrms.size(), opt_rate(), opt_amp());
+ plib::unique_ptr<aggregator> ago = plib::make_unique<aggregator>(m_instrms.size(), dt, aggregator::callback_type(&wavwriter::process, wo.get()));
+ aggregator::callback_type agcb = log_processor::callback_type(&aggregator::process, ago.get());
+
+ log_processor lp(m_instrms.size(), agcb);
+
+ lp.process(m_instrms);
if (!opt_quiet())
{
+#if 0
perr("Mean (low freq filter): {}\n", wo->mean);
- perr("Mean (static): {}\n", wo->means / static_cast<double>(wo->n));
+ perr("Mean (static): {}\n", wo->means / static_cast<double>(wo->m_n));
perr("Amp + {}\n", 32000.0 / (wo->maxsam - wo->mean));
perr("Amp - {}\n", -32000.0 / (wo->minsam - wo->mean));
+#endif
}
+}
- plib::pfree(wo);
- if (opt_inp() != "-")
- plib::pfree(fin);
- if (opt_out() != "-")
- plib::pfree(fo);
+void nlwav_app::convert_vcd(vcdwriter::format_e format)
+{
+
+ plib::unique_ptr<vcdwriter> wo = plib::make_unique<vcdwriter>(*m_outstrm, opt_args(),
+ format, opt_high(), opt_low());
+ log_processor::callback_type agcb = log_processor::callback_type(&vcdwriter::process, wo.get());
+
+ log_processor lp(m_instrms.size(), agcb);
+ lp.process(m_instrms);
+
+ if (!opt_quiet())
+ {
+#if 0
+ perr("Mean (low freq filter): {}\n", wo->mean);
+ perr("Mean (static): {}\n", wo->means / static_cast<double>(wo->m_n));
+ perr("Amp + {}\n", 32000.0 / (wo->maxsam - wo->mean));
+ perr("Amp - {}\n", -32000.0 / (wo->minsam - wo->mean));
+#endif
+ }
}
pstring nlwav_app::usage()
{
return help("Convert netlist log files into wav files.\n",
- "nltool [options]");
+ "nlwav [OPTION] ... [FILE] ...");
}
int nlwav_app::execute()
{
+ for (auto &i : opt_args())
+ pout(pstring("Hello : ") + i + "\n");
if (opt_help())
{
pout(usage());
@@ -379,7 +493,7 @@ int nlwav_app::execute()
{
pout(
"nlwav (netlist) 0.1\n"
- "Copyright (C) 2018 Couriersud\n"
+ "Copyright (C) 2019 Couriersud\n"
"License GPLv2+: GNU GPL version 2 or later <http://gnu.org/licenses/gpl.html>.\n"
"This is free software: you are free to change and redistribute it.\n"
"There is NO WARRANTY, to the extent permitted by law.\n\n"
@@ -387,10 +501,31 @@ int nlwav_app::execute()
return 0;
}
- if ((1))
- convert1(opt_rate());
- else
- convert(opt_rate());
+ m_outstrm = (opt_out() == "-" ? &pout_strm : plib::pnew<plib::pofilestream>(opt_out()));
+
+ for (auto &oi: opt_args())
+ {
+ plib::unique_ptr<plib::pistream> fin = (oi == "-" ?
+ plib::make_unique<plib::pstdin>()
+ : plib::make_unique<plib::pifilestream>(oi));
+ m_instrms.push_back(std::move(fin));
+ }
+
+ switch (opt_fmt())
+ {
+ case 0:
+ convert_wav(); break;
+ case 1:
+ convert_vcd(vcdwriter::ANALOG); break;
+ case 2:
+ convert_vcd(vcdwriter::DIGITAL); break;
+ default:
+ // tease compiler - can't happen
+ break;
+ }
+
+ if (opt_out() != "-")
+ plib::pdelete(m_outstrm);
return 0;
}
diff --git a/src/lib/netlist/solver/mat_cr.h b/src/lib/netlist/solver/mat_cr.h
deleted file mode 100644
index 8693c49c3e1..00000000000
--- a/src/lib/netlist/solver/mat_cr.h
+++ /dev/null
@@ -1,175 +0,0 @@
-// license:GPL-2.0+
-// copyright-holders:Couriersud
-/*
- * mat_cr.h
- *
- * Compressed row format matrices
- *
- */
-
-#ifndef MAT_CR_H_
-#define MAT_CR_H_
-
-#include <algorithm>
-#include "../plib/pconfig.h"
-#include "../plib/palloc.h"
-
-template<std::size_t N, typename C = uint16_t, typename T = double>
-struct mat_cr_t
-{
- typedef C index_type;
- typedef T value_type;
-
- C diag[N]; // diagonal index pointer n
- C ia[N+1]; // row index pointer n + 1
- C ja[N*N]; // column index array nz_num, initially (n * n)
- T A[N*N]; // Matrix elements nz_num, initially (n * n)
-
- std::size_t size;
- std::size_t nz_num;
-
- explicit mat_cr_t(const std::size_t n)
- : size(n)
- , nz_num(0)
- {
-#if 0
-#if 0
- ia = plib::palloc_array<C>(n + 1);
- ja = plib::palloc_array<C>(n * n);
- diag = plib::palloc_array<C>(n);
-#else
- diag = plib::palloc_array<C>(n + (n + 1) + n * n);
- ia = diag + n;
- ja = ia + (n+1);
- A = plib::palloc_array<T>(n * n);
-#endif
-#endif
- }
-
- ~mat_cr_t()
- {
-#if 0
- plib::pfree_array(diag);
-#if 0
- plib::pfree_array(ia);
- plib::pfree_array(ja);
-#endif
- plib::pfree_array(A);
-#endif
- }
-
- void set_scalar(const T scalar)
- {
- for (std::size_t i=0, e=nz_num; i<e; i++)
- A[i] = scalar;
- }
-
- void mult_vec(const T * RESTRICT x, T * RESTRICT res)
- {
- /*
- * res = A * x
- */
-
- std::size_t i = 0;
- std::size_t k = 0;
- const std::size_t oe = nz_num;
-
- while (k < oe)
- {
- T tmp = 0.0;
- const std::size_t e = ia[i+1];
- for (; k < e; k++)
- tmp += A[k] * x[ja[k]];
- res[i++] = tmp;
- }
- }
-
- void incomplete_LU_factorization(T * RESTRICT LU)
- {
- /*
- * incomplete LU Factorization according to http://de.wikipedia.org/wiki/ILU-Zerlegung
- *
- * Result is stored in matrix LU
- *
- */
-
- const std::size_t lnz = nz_num;
-
- for (std::size_t k = 0; k < lnz; k++)
- LU[k] = A[k];
-
- for (std::size_t i = 1; ia[i] < lnz; i++) // row i
- {
- const std::size_t iai1 = ia[i + 1];
- const std::size_t pke = diag[i];
- for (std::size_t pk = ia[i]; pk < pke; pk++) // all columns left of diag in row i
- {
- // pk == (i, k)
- const std::size_t k = ja[pk];
- const std::size_t iak1 = ia[k + 1];
- const T LUpk = LU[pk] = LU[pk] / LU[diag[k]];
-
- std::size_t pt = ia[k];
-
- for (std::size_t pj = pk + 1; pj < iai1; pj++) // pj = (i, j)
- {
- // we can assume that within a row ja increases continuously */
- const std::size_t ej = ja[pj];
- while (ja[pt] < ej && pt < iak1)
- pt++;
- if (pt < iak1 && ja[pt] == ej)
- LU[pj] = LU[pj] - LUpk * LU[pt];
- }
- }
- }
- }
-
- void solveLUx (const T * RESTRICT LU, T * RESTRICT r)
- {
- /*
- * Solve a linear equation Ax = r
- * where
- * A = L*U
- *
- * L unit lower triangular
- * U upper triangular
- *
- * ==> LUx = r
- *
- * ==> Ux = L⁻¹ r = w
- *
- * ==> r = Lw
- *
- * This can be solved for w using backwards elimination in L.
- *
- * Now Ux = w
- *
- * This can be solved for x using backwards elimination in U.
- *
- */
-
- for (std::size_t i = 1; ia[i] < nz_num; ++i )
- {
- T tmp = 0.0;
- const std::size_t j1 = ia[i];
- const std::size_t j2 = diag[i];
-
- for (std::size_t j = j1; j < j2; ++j )
- tmp += LU[j] * r[ja[j]];
-
- r[i] -= tmp;
- }
- // i now is equal to n;
- for (std::size_t i = size; i-- > 0; )
- {
- T tmp = 0.0;
- const std::size_t di = diag[i];
- const std::size_t j2 = ia[i+1];
- for (std::size_t j = di + 1; j < j2; j++ )
- tmp += LU[j] * r[ja[j]];
- r[i] = (r[i] - tmp) / LU[di];
- }
- }
-};
-
-#endif /* MAT_CR_H_ */
diff --git a/src/lib/netlist/solver/nld_matrix_solver.cpp b/src/lib/netlist/solver/nld_matrix_solver.cpp
index 87c9b46ba21..1fe14b0f5e1 100644
--- a/src/lib/netlist/solver/nld_matrix_solver.cpp
+++ b/src/lib/netlist/solver/nld_matrix_solver.cpp
@@ -6,552 +6,623 @@
*/
#include "nld_matrix_solver.h"
-#include "../plib/putil.h"
+#include "plib/putil.h"
#include <cmath> // <<= needed by windows build
namespace netlist
{
- namespace devices
- {
-
-proxied_analog_output_t::~proxied_analog_output_t()
+namespace devices
{
-}
-terms_for_net_t::terms_for_net_t()
- : m_railstart(0)
- , m_last_V(0.0)
- , m_DD_n_m_1(0.0)
- , m_h_n_m_1(1e-9)
-{
-}
+ terms_for_net_t::terms_for_net_t()
+ : m_railstart(0)
+ , m_last_V(0.0)
+ , m_DD_n_m_1(0.0)
+ , m_h_n_m_1(1e-9)
+ {
+ }
-void terms_for_net_t::clear()
-{
- m_terms.clear();
- m_connected_net_idx.clear();
- m_gt.clear();
- m_go.clear();
- m_Idr.clear();
- m_connected_net_V.clear();
-}
-
-void terms_for_net_t::add(terminal_t *term, int net_other, bool sorted)
-{
- if (sorted)
- for (unsigned i=0; i < m_connected_net_idx.size(); i++)
- {
- if (m_connected_net_idx[i] > net_other)
+ void terms_for_net_t::add(terminal_t *term, int net_other, bool sorted)
+ {
+ if (sorted)
+ for (std::size_t i=0; i < m_connected_net_idx.size(); i++)
{
- plib::container::insert_at(m_terms, i, term);
- plib::container::insert_at(m_connected_net_idx, i, net_other);
- plib::container::insert_at(m_gt, i, 0.0);
- plib::container::insert_at(m_go, i, 0.0);
- plib::container::insert_at(m_Idr, i, 0.0);
- plib::container::insert_at(m_connected_net_V, i, nullptr);
- return;
+ if (m_connected_net_idx[i] > net_other)
+ {
+ plib::container::insert_at(m_terms, i, term);
+ plib::container::insert_at(m_connected_net_idx, i, net_other);
+ return;
+ }
}
- }
- m_terms.push_back(term);
- m_connected_net_idx.push_back(net_other);
- m_gt.push_back(0.0);
- m_go.push_back(0.0);
- m_Idr.push_back(0.0);
- m_connected_net_V.push_back(nullptr);
-}
-
-void terms_for_net_t::set_pointers()
-{
- for (unsigned i = 0; i < count(); i++)
+ m_terms.push_back(term);
+ m_connected_net_idx.push_back(net_other);
+ }
+
+ // ----------------------------------------------------------------------------------------
+ // matrix_solver
+ // ----------------------------------------------------------------------------------------
+
+ matrix_solver_t::matrix_solver_t(netlist_state_t &anetlist, const pstring &name,
+ const eSortType sort, const solver_parameters_t *params)
+ : device_t(anetlist, name)
+ , m_params(*params)
+ , m_stat_calculations(*this, "m_stat_calculations", 0)
+ , m_stat_newton_raphson(*this, "m_stat_newton_raphson", 0)
+ , m_stat_vsolver_calls(*this, "m_stat_vsolver_calls", 0)
+ , m_iterative_fail(*this, "m_iterative_fail", 0)
+ , m_iterative_total(*this, "m_iterative_total", 0)
+ , m_last_step(*this, "m_last_step", netlist_time::zero())
+ , m_fb_sync(*this, "FB_sync")
+ , m_Q_sync(*this, "Q_sync")
+ , m_ops(0)
+ , m_sort(sort)
{
- m_terms[i]->set_ptrs(&m_gt[i], &m_go[i], &m_Idr[i]);
- m_connected_net_V[i] = m_terms[i]->m_otherterm->net().Q_Analog_state_ptr();
+ connect_post_start(m_fb_sync, m_Q_sync);
}
-}
-
-// ----------------------------------------------------------------------------------------
-// matrix_solver
-// ----------------------------------------------------------------------------------------
-
-matrix_solver_t::matrix_solver_t(netlist_t &anetlist, const pstring &name,
- const eSortType sort, const solver_parameters_t *params)
- : device_t(anetlist, name)
- , m_params(*params)
- , m_stat_calculations(*this, "m_stat_calculations", 0)
- , m_stat_newton_raphson(*this, "m_stat_newton_raphson", 0)
- , m_stat_vsolver_calls(*this, "m_stat_vsolver_calls", 0)
- , m_iterative_fail(*this, "m_iterative_fail", 0)
- , m_iterative_total(*this, "m_iterative_total", 0)
- , m_last_step(*this, "m_last_step", netlist_time::zero())
- , m_fb_sync(*this, "FB_sync")
- , m_Q_sync(*this, "Q_sync")
- , m_ops(0)
- , m_sort(sort)
-{
- connect_post_start(m_fb_sync, m_Q_sync);
-}
-matrix_solver_t::~matrix_solver_t()
-{
-}
+ void matrix_solver_t::setup_base(analog_net_t::list_t &nets)
+ {
-void matrix_solver_t::setup_base(analog_net_t::list_t &nets)
-{
+ log().debug("New solver setup\n");
- log().debug("New solver setup\n");
+ m_nets.clear();
+ m_terms.clear();
- m_nets.clear();
- m_terms.clear();
+ for (auto & net : nets)
+ {
+ m_nets.push_back(net);
+ m_terms.push_back(plib::make_unique<terms_for_net_t>());
+ m_rails_temp.push_back(plib::make_unique<terms_for_net_t>());
+ }
- for (auto & net : nets)
- {
- m_nets.push_back(net);
- m_terms.push_back(plib::make_unique<terms_for_net_t>());
- m_rails_temp.push_back(plib::palloc<terms_for_net_t>());
- }
+ for (std::size_t k = 0; k < nets.size(); k++)
+ {
+ analog_net_t *net = nets[k];
- for (std::size_t k = 0; k < nets.size(); k++)
- {
- analog_net_t *net = nets[k];
+ log().debug("setting up net\n");
- log().debug("setting up net\n");
+ net->set_solver(this);
- net->set_solver(this);
+ for (auto &p : net->core_terms())
+ {
+ log().debug("{1} {2} {3}\n", p->name(), net->name(), net->isRailNet());
+ switch (p->type())
+ {
+ case detail::terminal_type::TERMINAL:
+ if (p->device().is_timestep())
+ if (!plib::container::contains(m_step_devices, &p->device()))
+ m_step_devices.push_back(&p->device());
+ if (p->device().is_dynamic())
+ if (!plib::container::contains(m_dynamic_devices, &p->device()))
+ m_dynamic_devices.push_back(&p->device());
+ {
+ auto *pterm = dynamic_cast<terminal_t *>(p);
+ add_term(k, pterm);
+ }
+ log().debug("Added terminal {1}\n", p->name());
+ break;
+ case detail::terminal_type::INPUT:
+ {
+ proxied_analog_output_t *net_proxy_output = nullptr;
+ for (auto & input : m_inps)
+ if (input->proxied_net() == &p->net())
+ {
+ net_proxy_output = input.get();
+ break;
+ }
+
+ if (net_proxy_output == nullptr)
+ {
+ pstring nname = this->name() + "." + pstring(plib::pfmt("m{1}")(m_inps.size()));
+ nl_assert(p->net().is_analog());
+ auto net_proxy_output_u = pool().make_poolptr<proxied_analog_output_t>(*this, nname, static_cast<analog_net_t *>(&p->net()));
+ net_proxy_output = net_proxy_output_u.get();
+ m_inps.push_back(std::move(net_proxy_output_u));
+ }
+ net_proxy_output->net().add_terminal(*p);
+ // FIXME: repeated calling - kind of brute force
+ net_proxy_output->net().rebuild_list();
+ log().debug("Added input\n");
+ }
+ break;
+ case detail::terminal_type::OUTPUT:
+ log().fatal(MF_1_UNHANDLED_ELEMENT_1_FOUND,
+ p->name());
+ break;
+ }
+ }
+ log().debug("added net with {1} populated connections\n", net->core_terms().size());
+ }
- for (auto &p : net->m_core_terms)
+ /* now setup the matrix */
+ setup_matrix();
+ }
+
+ void matrix_solver_t::sort_terms(eSortType sort)
+ {
+ /* Sort in descending order by number of connected matrix voltages.
+ * The idea is, that for Gauss-Seidel algo the first voltage computed
+ * depends on the greatest number of previous voltages thus taking into
+ * account the maximum amout of information.
+ *
+ * This actually improves performance on popeye slightly. Average
+ * GS computations reduce from 2.509 to 2.370
+ *
+ * Smallest to largest : 2.613
+ * Unsorted : 2.509
+ * Largest to smallest : 2.370
+ *
+ * Sorting as a general matrix pre-conditioning is mentioned in
+ * literature but I have found no articles about Gauss Seidel.
+ *
+ * For Gaussian Elimination however increasing order is better suited.
+ * NOTE: Even better would be to sort on elements right of the matrix diagonal.
+ *
+ */
+
+ const std::size_t iN = m_nets.size();
+
+ switch (sort)
{
- log().debug("{1} {2} {3}\n", p->name(), net->name(), net->isRailNet());
- switch (p->type())
- {
- case detail::terminal_type::TERMINAL:
- if (p->device().is_timestep())
- if (!plib::container::contains(m_step_devices, &p->device()))
- m_step_devices.push_back(&p->device());
- if (p->device().is_dynamic())
- if (!plib::container::contains(m_dynamic_devices, &p->device()))
- m_dynamic_devices.push_back(&p->device());
+ case PREFER_BAND_MATRIX:
+ {
+ for (std::size_t k = 0; k < iN - 1; k++)
{
- terminal_t *pterm = dynamic_cast<terminal_t *>(p);
- add_term(k, pterm);
+ auto pk = get_weight_around_diag(k,k);
+ for (std::size_t i = k+1; i < iN; i++)
+ {
+ auto pi = get_weight_around_diag(i,k);
+ if (pi < pk)
+ {
+ std::swap(m_terms[i], m_terms[k]);
+ std::swap(m_nets[i], m_nets[k]);
+ pk = get_weight_around_diag(k,k);
+ }
+ }
}
- log().debug("Added terminal {1}\n", p->name());
- break;
- case detail::terminal_type::INPUT:
+ }
+ break;
+ case PREFER_IDENTITY_TOP_LEFT:
+ {
+ for (std::size_t k = 0; k < iN - 1; k++)
{
- proxied_analog_output_t *net_proxy_output = nullptr;
- for (auto & input : m_inps)
- if (input->m_proxied_net == &p->net())
+ auto pk = get_left_right_of_diag(k,k);
+ for (std::size_t i = k+1; i < iN; i++)
+ {
+ auto pi = get_left_right_of_diag(i,k);
+ if (pi.first <= pk.first && pi.second >= pk.second)
{
- net_proxy_output = input.get();
- break;
+ std::swap(m_terms[i], m_terms[k]);
+ std::swap(m_nets[i], m_nets[k]);
+ pk = get_left_right_of_diag(k,k);
}
+ }
+ }
+ }
+ break;
+ case ASCENDING:
+ case DESCENDING:
+ {
+ int sort_order = (m_sort == DESCENDING ? 1 : -1);
- if (net_proxy_output == nullptr)
+ for (std::size_t k = 0; k < iN - 1; k++)
+ for (std::size_t i = k+1; i < iN; i++)
{
- pstring nname = this->name() + "." + pstring(plib::pfmt("m{1}")(m_inps.size()));
- auto net_proxy_output_u = plib::make_unique<proxied_analog_output_t>(*this, nname);
- net_proxy_output = net_proxy_output_u.get();
- m_inps.push_back(std::move(net_proxy_output_u));
- nl_assert(p->net().is_analog());
- net_proxy_output->m_proxied_net = static_cast<analog_net_t *>(&p->net());
+ if ((static_cast<int>(m_terms[k]->m_railstart) - static_cast<int>(m_terms[i]->m_railstart)) * sort_order < 0)
+ {
+ std::swap(m_terms[i], m_terms[k]);
+ std::swap(m_nets[i], m_nets[k]);
+ }
}
- net_proxy_output->net().add_terminal(*p);
- // FIXME: repeated calling - kind of brute force
- net_proxy_output->net().rebuild_list();
- log().debug("Added input\n");
- }
- break;
- case detail::terminal_type::OUTPUT:
- log().fatal(MF_1_UNHANDLED_ELEMENT_1_FOUND,
- p->name());
- break;
- }
+ }
+ break;
+ case NOSORT:
+ break;
+ }
+ /* rebuild */
+ for (auto &term : m_terms)
+ {
+ int *other = term->m_connected_net_idx.data();
+ for (std::size_t i = 0; i < term->count(); i++)
+ //FIXME: this is weird
+ if (other[i] != -1)
+ other[i] = get_net_idx(&term->terms()[i]->connected_terminal()->net());
}
- log().debug("added net with {1} populated connections\n", net->m_core_terms.size());
}
- /* now setup the matrix */
- setup_matrix();
-}
+ void matrix_solver_t::setup_matrix()
+ {
+ const std::size_t iN = m_nets.size();
-void matrix_solver_t::setup_matrix()
-{
- const std::size_t iN = m_nets.size();
+ for (std::size_t k = 0; k < iN; k++)
+ {
+ m_terms[k]->m_railstart = m_terms[k]->count();
+ for (std::size_t i = 0; i < m_rails_temp[k]->count(); i++)
+ this->m_terms[k]->add(m_rails_temp[k]->terms()[i], m_rails_temp[k]->m_connected_net_idx.data()[i], false);
+ }
- for (std::size_t k = 0; k < iN; k++)
- {
- m_terms[k]->m_railstart = m_terms[k]->count();
- for (std::size_t i = 0; i < m_rails_temp[k]->count(); i++)
- this->m_terms[k]->add(m_rails_temp[k]->terms()[i], m_rails_temp[k]->connected_net_idx()[i], false);
+ // free all - no longer needed
+ m_rails_temp.clear();
- m_terms[k]->set_pointers();
- }
+ sort_terms(m_sort);
- for (terms_for_net_t *rt : m_rails_temp)
- {
- rt->clear(); // no longer needed
- plib::pfree(rt); // no longer needed
- }
+ this->set_pointers();
- m_rails_temp.clear();
+ /* create a list of non zero elements. */
+ for (unsigned k = 0; k < iN; k++)
+ {
+ terms_for_net_t * t = m_terms[k].get();
+ /* pretty brutal */
+ int *other = t->m_connected_net_idx.data();
- /* Sort in descending order by number of connected matrix voltages.
- * The idea is, that for Gauss-Seidel algo the first voltage computed
- * depends on the greatest number of previous voltages thus taking into
- * account the maximum amout of information.
- *
- * This actually improves performance on popeye slightly. Average
- * GS computations reduce from 2.509 to 2.370
- *
- * Smallest to largest : 2.613
- * Unsorted : 2.509
- * Largest to smallest : 2.370
- *
- * Sorting as a general matrix pre-conditioning is mentioned in
- * literature but I have found no articles about Gauss Seidel.
- *
- * For Gaussian Elimination however increasing order is better suited.
- * NOTE: Even better would be to sort on elements right of the matrix diagonal.
- *
- */
+ t->m_nz.clear();
- if (m_sort != NOSORT)
- {
- int sort_order = (m_sort == DESCENDING ? 1 : -1);
+ for (std::size_t i = 0; i < t->m_railstart; i++)
+ if (!plib::container::contains(t->m_nz, static_cast<unsigned>(other[i])))
+ t->m_nz.push_back(static_cast<unsigned>(other[i]));
+
+ t->m_nz.push_back(k); // add diagonal
+
+ /* and sort */
+ std::sort(t->m_nz.begin(), t->m_nz.end());
+ }
+
+ /* create a list of non zero elements right of the diagonal
+ * These list anticipate the population of array elements by
+ * Gaussian elimination.
+ */
+ for (std::size_t k = 0; k < iN; k++)
+ {
+ terms_for_net_t * t = m_terms[k].get();
+ /* pretty brutal */
+ int *other = t->m_connected_net_idx.data();
- for (unsigned k = 0; k < iN - 1; k++)
- for (unsigned i = k+1; i < iN; i++)
+ if (k==0)
+ t->m_nzrd.clear();
+ else
{
- if ((static_cast<int>(m_terms[k]->m_railstart) - static_cast<int>(m_terms[i]->m_railstart)) * sort_order < 0)
+ t->m_nzrd = m_terms[k-1]->m_nzrd;
+ for (auto j = t->m_nzrd.begin(); j != t->m_nzrd.end(); )
{
- std::swap(m_terms[i], m_terms[k]);
- std::swap(m_nets[i], m_nets[k]);
+ if (*j < k + 1)
+ j = t->m_nzrd.erase(j);
+ else
+ ++j;
}
}
- for (auto &term : m_terms)
- {
- int *other = term->connected_net_idx();
- for (unsigned i = 0; i < term->count(); i++)
- if (other[i] != -1)
- other[i] = get_net_idx(&term->terms()[i]->m_otherterm->net());
- }
- }
+ for (std::size_t i = 0; i < t->m_railstart; i++)
+ if (!plib::container::contains(t->m_nzrd, static_cast<unsigned>(other[i])) && other[i] >= static_cast<int>(k + 1))
+ t->m_nzrd.push_back(static_cast<unsigned>(other[i]));
- /* create a list of non zero elements. */
- for (unsigned k = 0; k < iN; k++)
- {
- terms_for_net_t * t = m_terms[k].get();
- /* pretty brutal */
- int *other = t->connected_net_idx();
-
- t->m_nz.clear();
-
- for (unsigned i = 0; i < t->m_railstart; i++)
- if (!plib::container::contains(t->m_nz, static_cast<unsigned>(other[i])))
- t->m_nz.push_back(static_cast<unsigned>(other[i]));
+ /* and sort */
+ std::sort(t->m_nzrd.begin(), t->m_nzrd.end());
+ }
- t->m_nz.push_back(k); // add diagonal
+ /* create a list of non zero elements below diagonal k
+ * This should reduce cache misses ...
+ */
- /* and sort */
- std::sort(t->m_nz.begin(), t->m_nz.end());
- }
+ std::vector<std::vector<bool>> touched(iN, std::vector<bool>(iN));
- /* create a list of non zero elements right of the diagonal
- * These list anticipate the population of array elements by
- * Gaussian elimination.
- */
- for (unsigned k = 0; k < iN; k++)
- {
- terms_for_net_t * t = m_terms[k].get();
- /* pretty brutal */
- int *other = t->connected_net_idx();
+ for (std::size_t k = 0; k < iN; k++)
+ {
+ for (std::size_t j = 0; j < iN; j++)
+ touched[k][j] = false;
+ for (std::size_t j = 0; j < m_terms[k]->m_nz.size(); j++)
+ touched[k][m_terms[k]->m_nz[j]] = true;
+ }
- if (k==0)
- t->m_nzrd.clear();
- else
+ m_ops = 0;
+ for (unsigned k = 0; k < iN; k++)
{
- t->m_nzrd = m_terms[k-1]->m_nzrd;
- for (auto j = t->m_nzrd.begin(); j != t->m_nzrd.end(); )
+ m_ops++; // 1/A(k,k)
+ for (unsigned row = k + 1; row < iN; row++)
{
- if (*j < k + 1)
- j = t->m_nzrd.erase(j);
- else
- ++j;
+ if (touched[row][k])
+ {
+ m_ops++;
+ if (!plib::container::contains(m_terms[k]->m_nzbd, row))
+ m_terms[k]->m_nzbd.push_back(row);
+ for (std::size_t col = k + 1; col < iN; col++)
+ if (touched[k][col])
+ {
+ touched[row][col] = true;
+ m_ops += 2;
+ }
+ }
}
}
+ log().verbose("Number of mults/adds for {1}: {2}", name(), m_ops);
- for (unsigned i = 0; i < t->m_railstart; i++)
- if (!plib::container::contains(t->m_nzrd, static_cast<unsigned>(other[i])) && other[i] >= static_cast<int>(k + 1))
- t->m_nzrd.push_back(static_cast<unsigned>(other[i]));
+ if ((false))
+ for (std::size_t k = 0; k < iN; k++)
+ {
+ pstring line = plib::pfmt("{1:3}")(k);
+ for (const auto & nzrd : m_terms[k]->m_nzrd)
+ line += plib::pfmt(" {1:3}")(nzrd);
+ log().verbose("{1}", line);
+ }
- /* and sort */
- std::sort(t->m_nzrd.begin(), t->m_nzrd.end());
- }
+ /*
+ * save states
+ */
+ for (std::size_t k = 0; k < iN; k++)
+ {
+ pstring num = plib::pfmt("{1}")(k);
- /* create a list of non zero elements below diagonal k
- * This should reduce cache misses ...
- */
+ state().save(*this, m_terms[k]->m_last_V, this->name(), "lastV." + num);
+ state().save(*this, m_terms[k]->m_DD_n_m_1, this->name(), "m_DD_n_m_1." + num);
+ state().save(*this, m_terms[k]->m_h_n_m_1, this->name(), "m_h_n_m_1." + num);
- bool **touched = plib::palloc_array<bool *>(iN);
- for (unsigned k=0; k<iN; k++)
- touched[k] = plib::palloc_array<bool>(iN);
+ // FIXME: This shouldn't be necessary, recalculate on each entry ...
+ state().save(*this, m_gonn[k],"GO" + num, this->name(), m_terms[k]->count());
+ state().save(*this, m_gtn[k],"GT" + num, this->name(), m_terms[k]->count());
+ state().save(*this, m_Idrn[k],"IDR" + num, this->name(), m_terms[k]->count());
+ }
+ }
- for (unsigned k = 0; k < iN; k++)
+ void matrix_solver_t::update_inputs()
{
- for (unsigned j = 0; j < iN; j++)
- touched[k][j] = false;
- for (unsigned j = 0; j < m_terms[k]->m_nz.size(); j++)
- touched[k][m_terms[k]->m_nz[j]] = true;
+ // avoid recursive calls. Inputs are updated outside this call
+ for (auto &inp : m_inps)
+ inp->push(inp->proxied_net()->Q_Analog());
}
- m_ops = 0;
- for (unsigned k = 0; k < iN; k++)
+ void matrix_solver_t::update_dynamic()
{
- m_ops++; // 1/A(k,k)
- for (unsigned row = k + 1; row < iN; row++)
- {
- if (touched[row][k])
- {
- m_ops++;
- if (!plib::container::contains(m_terms[k]->m_nzbd, row))
- m_terms[k]->m_nzbd.push_back(row);
- for (unsigned col = k + 1; col < iN; col++)
- if (touched[k][col])
- {
- touched[row][col] = true;
- m_ops += 2;
- }
- }
- }
+ /* update all non-linear devices */
+ for (auto &dyn : m_dynamic_devices)
+ dyn->update_terminals();
}
- log().verbose("Number of mults/adds for {1}: {2}", name(), m_ops);
- if ((0))
- for (unsigned k = 0; k < iN; k++)
+ void matrix_solver_t::reset()
+ {
+ m_last_step = netlist_time::zero();
+ }
+
+ void matrix_solver_t::update() NL_NOEXCEPT
+ {
+ const netlist_time new_timestep = solve(exec().time());
+ update_inputs();
+
+ if (m_params.m_dynamic_ts && has_timestep_devices() && new_timestep > netlist_time::zero())
{
- pstring line = plib::pfmt("{1:3}")(k);
- for (unsigned j = 0; j < m_terms[k]->m_nzrd.size(); j++)
- line += plib::pfmt(" {1:3}")(m_terms[k]->m_nzrd[j]);
- log().verbose("{1}", line);
+ m_Q_sync.net().toggle_and_push_to_queue(new_timestep);
}
+ }
- /*
- * save states
+ /* update_forced is called from within param_update
+ *
+ * this should only occur outside of execution and thus
+ * using time should be safe.
+ *
*/
- for (unsigned k = 0; k < iN; k++)
+ void matrix_solver_t::update_forced()
{
- pstring num = plib::pfmt("{1}")(k);
+ const netlist_time new_timestep = solve(exec().time());
+ plib::unused_var(new_timestep);
- netlist().save(*this, m_terms[k]->m_last_V, "lastV." + num);
- netlist().save(*this, m_terms[k]->m_DD_n_m_1, "m_DD_n_m_1." + num);
- netlist().save(*this, m_terms[k]->m_h_n_m_1, "m_h_n_m_1." + num);
+ update_inputs();
- netlist().save(*this, m_terms[k]->go(),"GO" + num, m_terms[k]->count());
- netlist().save(*this, m_terms[k]->gt(),"GT" + num, m_terms[k]->count());
- netlist().save(*this, m_terms[k]->Idr(),"IDR" + num , m_terms[k]->count());
+ if (m_params.m_dynamic_ts && has_timestep_devices())
+ {
+ m_Q_sync.net().toggle_and_push_to_queue(netlist_time::from_double(m_params.m_min_timestep));
+ }
}
- for (unsigned k=0; k<iN; k++)
- plib::pfree_array(touched[k]);
- plib::pfree_array(touched);
-}
+ void matrix_solver_t::step(const netlist_time &delta)
+ {
+ const nl_double dd = delta.as_double();
+ for (auto &d : m_step_devices)
+ d->timestep(dd);
+ }
-void matrix_solver_t::update_inputs()
-{
- // avoid recursive calls. Inputs are updated outside this call
- for (auto &inp : m_inps)
- inp->push(inp->m_proxied_net->Q_Analog());
-}
+ void matrix_solver_t::solve_base()
+ {
+ ++m_stat_vsolver_calls;
+ if (has_dynamic_devices())
+ {
+ std::size_t this_resched;
+ std::size_t newton_loops = 0;
+ do
+ {
+ update_dynamic();
+ // Gauss-Seidel will revert to Gaussian elemination if steps exceeded.
+ this_resched = this->vsolve_non_dynamic(true);
+ newton_loops++;
+ } while (this_resched > 1 && newton_loops < m_params.m_nr_loops);
+
+ m_stat_newton_raphson += newton_loops;
+ // reschedule ....
+ if (this_resched > 1 && !m_Q_sync.net().is_queued())
+ {
+ log().warning(MW_1_NEWTON_LOOPS_EXCEEDED_ON_NET_1, this->name());
+ m_Q_sync.net().toggle_and_push_to_queue(m_params.m_nr_recalc_delay);
+ }
+ }
+ else
+ {
+ this->vsolve_non_dynamic(false);
+ }
+ }
-void matrix_solver_t::update_dynamic()
-{
- /* update all non-linear devices */
- for (auto &dyn : m_dynamic_devices)
- dyn->update_terminals();
-}
+ const netlist_time matrix_solver_t::solve(netlist_time now)
+ {
+ const netlist_time delta = now - m_last_step;
-void matrix_solver_t::reset()
-{
- m_last_step = netlist_time::zero();
-}
+ // We are already up to date. Avoid oscillations.
+ // FIXME: Make this a parameter!
+ if (delta < netlist_time::quantum())
+ return netlist_time::zero();
-void matrix_solver_t::update() NL_NOEXCEPT
-{
- const netlist_time new_timestep = solve();
- update_inputs();
+ /* update all terminals for new time step */
+ m_last_step = now;
+ step(delta);
+ solve_base();
+ const netlist_time next_time_step = compute_next_timestep(delta.as_double());
- if (m_params.m_dynamic_ts && has_timestep_devices() && new_timestep > netlist_time::zero())
- {
- m_Q_sync.net().toggle_and_push_to_queue(new_timestep);
+ return next_time_step;
}
-}
-
-void matrix_solver_t::update_forced()
-{
- ATTR_UNUSED const netlist_time new_timestep = solve();
- update_inputs();
- if (m_params.m_dynamic_ts && has_timestep_devices())
+ int matrix_solver_t::get_net_idx(detail::net_t *net)
{
- m_Q_sync.net().toggle_and_push_to_queue(netlist_time::from_double(m_params.m_min_timestep));
+ for (std::size_t k = 0; k < m_nets.size(); k++)
+ if (m_nets[k] == net)
+ return static_cast<int>(k);
+ return -1;
}
-}
-
-void matrix_solver_t::step(const netlist_time &delta)
-{
- const nl_double dd = delta.as_double();
- for (std::size_t k=0; k < m_step_devices.size(); k++)
- m_step_devices[k]->timestep(dd);
-}
-void matrix_solver_t::solve_base()
-{
- ++m_stat_vsolver_calls;
- if (has_dynamic_devices())
+ std::pair<int, int> matrix_solver_t::get_left_right_of_diag(std::size_t irow, std::size_t idiag)
{
- unsigned this_resched;
- unsigned newton_loops = 0;
- do
- {
- update_dynamic();
- // Gauss-Seidel will revert to Gaussian elemination if steps exceeded.
- this_resched = this->vsolve_non_dynamic(true);
- newton_loops++;
- } while (this_resched > 1 && newton_loops < m_params.m_nr_loops);
-
- m_stat_newton_raphson += newton_loops;
- // reschedule ....
- if (this_resched > 1 && !m_Q_sync.net().is_queued())
- {
- log().warning(MW_1_NEWTON_LOOPS_EXCEEDED_ON_NET_1, this->name());
- m_Q_sync.net().toggle_and_push_to_queue(m_params.m_nr_recalc_delay);
- }
- }
- else
- {
- this->vsolve_non_dynamic(false);
- }
-}
+ /*
+ * return the maximum column left of the diagonal (-1 if no cols found)
+ * return the minimum column right of the diagonal (999999 if no cols found)
+ */
-const netlist_time matrix_solver_t::solve()
-{
- const netlist_time now = netlist().time();
- const netlist_time delta = now - m_last_step;
+ const auto row = static_cast<int>(irow);
+ const auto diag = static_cast<int>(idiag);
- // We are already up to date. Avoid oscillations.
- // FIXME: Make this a parameter!
- if (delta < netlist_time::quantum())
- return netlist_time::zero();
+ int colmax = -1;
+ int colmin = 999999;
- /* update all terminals for new time step */
- m_last_step = now;
- step(delta);
- solve_base();
- const netlist_time next_time_step = compute_next_timestep(delta.as_double());
+ auto &term = m_terms[irow];
- return next_time_step;
-}
+ for (std::size_t i = 0; i < term->count(); i++)
+ {
+ auto col = get_net_idx(&term->terms()[i]->connected_terminal()->net());
+ if (col != -1)
+ {
+ if (col==row) col = diag;
+ else if (col==diag) col = row;
-int matrix_solver_t::get_net_idx(detail::net_t *net)
-{
- for (std::size_t k = 0; k < m_nets.size(); k++)
- if (m_nets[k] == net)
- return static_cast<int>(k);
- return -1;
-}
+ if (col > diag && col < colmin)
+ colmin = col;
+ else if (col < diag && col > colmax)
+ colmax = col;
+ }
+ }
+ return {colmax, colmin};
+ }
-void matrix_solver_t::add_term(std::size_t k, terminal_t *term)
-{
- if (term->m_otherterm->net().isRailNet())
+ double matrix_solver_t::get_weight_around_diag(std::size_t row, std::size_t diag)
{
- m_rails_temp[k]->add(term, -1, false);
+ {
+ /*
+ * return average absolute distance
+ */
+
+ std::vector<bool> touched(1024, false); // FIXME!
+
+ double weight = 0.0;
+ auto &term = m_terms[row];
+ for (std::size_t i = 0; i < term->count(); i++)
+ {
+ auto col = get_net_idx(&term->terms()[i]->connected_terminal()->net());
+ if (col >= 0)
+ {
+ auto colu = static_cast<std::size_t>(col);
+ if (!touched[colu])
+ {
+ if (colu==row) colu = static_cast<unsigned>(diag);
+ else if (colu==diag) colu = static_cast<unsigned>(row);
+
+ weight = weight + std::abs(static_cast<double>(colu) - static_cast<double>(diag));
+ touched[colu] = true;
+ }
+ }
+ }
+ return weight; // / static_cast<double>(term->m_railstart);
+ }
}
- else
+
+ void matrix_solver_t::add_term(std::size_t k, terminal_t *term)
{
- int ot = get_net_idx(&term->m_otherterm->net());
- if (ot>=0)
+ if (term->connected_terminal()->net().isRailNet())
{
- m_terms[k]->add(term, ot, true);
+ m_rails_temp[k]->add(term, -1, false);
}
- /* Should this be allowed ? */
- else // if (ot<0)
+ else
{
- m_rails_temp[k]->add(term, ot, true);
- log().fatal(MF_1_FOUND_TERM_WITH_MISSING_OTHERNET, term->name());
+ int ot = get_net_idx(&term->connected_terminal()->net());
+ if (ot>=0)
+ {
+ m_terms[k]->add(term, ot, true);
+ }
+ /* Should this be allowed ? */
+ else // if (ot<0)
+ {
+ m_rails_temp[k]->add(term, ot, true);
+ log().fatal(MF_1_FOUND_TERM_WITH_MISSING_OTHERNET, term->name());
+ }
}
}
-}
-netlist_time matrix_solver_t::compute_next_timestep(const double cur_ts)
-{
- nl_double new_solver_timestep = m_params.m_max_timestep;
-
- if (m_params.m_dynamic_ts)
+ netlist_time matrix_solver_t::compute_next_timestep(const double cur_ts)
{
- for (std::size_t k = 0, iN=m_terms.size(); k < iN; k++)
+ nl_double new_solver_timestep = m_params.m_max_timestep;
+
+ if (m_params.m_dynamic_ts)
{
- analog_net_t *n = m_nets[k];
- terms_for_net_t *t = m_terms[k].get();
+ for (std::size_t k = 0, iN=m_terms.size(); k < iN; k++)
+ {
+ analog_net_t *n = m_nets[k];
+ terms_for_net_t *t = m_terms[k].get();
- const nl_double DD_n = (n->Q_Analog() - t->m_last_V);
- const nl_double hn = cur_ts;
+ const nl_double DD_n = (n->Q_Analog() - t->m_last_V);
+ const nl_double hn = cur_ts;
- //printf("%f %f %f %f\n", DD_n, t->m_DD_n_m_1, hn, t->m_h_n_m_1);
- nl_double DD2 = (DD_n / hn - t->m_DD_n_m_1 / t->m_h_n_m_1) / (hn + t->m_h_n_m_1);
- nl_double new_net_timestep;
+ nl_double DD2 = (DD_n / hn - t->m_DD_n_m_1 / t->m_h_n_m_1) / (hn + t->m_h_n_m_1);
+ nl_double new_net_timestep;
- t->m_h_n_m_1 = hn;
- t->m_DD_n_m_1 = DD_n;
- if (std::fabs(DD2) > NL_FCONST(1e-60)) // avoid div-by-zero
- new_net_timestep = std::sqrt(m_params.m_dynamic_lte / std::fabs(NL_FCONST(0.5)*DD2));
- else
- new_net_timestep = m_params.m_max_timestep;
+ t->m_h_n_m_1 = hn;
+ t->m_DD_n_m_1 = DD_n;
+ if (std::fabs(DD2) > plib::constants<nl_double>::cast(1e-60)) // avoid div-by-zero
+ new_net_timestep = std::sqrt(m_params.m_dynamic_lte / std::fabs(plib::constants<nl_double>::cast(0.5)*DD2));
+ else
+ new_net_timestep = m_params.m_max_timestep;
- if (new_net_timestep < new_solver_timestep)
- new_solver_timestep = new_net_timestep;
+ if (new_net_timestep < new_solver_timestep)
+ new_solver_timestep = new_net_timestep;
- t->m_last_V = n->Q_Analog();
- }
- if (new_solver_timestep < m_params.m_min_timestep)
- {
- //log().warning("Dynamic timestep below min timestep. Consider decreasing MIN_TIMESTEP: {1} us", new_solver_timestep*1.0e6);
- new_solver_timestep = m_params.m_min_timestep;
+ t->m_last_V = n->Q_Analog();
+ }
+ if (new_solver_timestep < m_params.m_min_timestep)
+ {
+ //log().warning("Dynamic timestep below min timestep. Consider decreasing MIN_TIMESTEP: {1} us", new_solver_timestep*1.0e6);
+ new_solver_timestep = m_params.m_min_timestep;
+ }
}
+ //if (new_solver_timestep > 10.0 * hn)
+ // new_solver_timestep = 10.0 * hn;
+ /*
+ * FIXME: Factor 2 below is important. Without, we get timing issues. This must be a bug elsewhere.
+ */
+ return std::max(netlist_time::from_double(new_solver_timestep), netlist_time::quantum() * 2);
}
- //if (new_solver_timestep > 10.0 * hn)
- // new_solver_timestep = 10.0 * hn;
- /*
- * FIXME: Factor 2 below is important. Without, we get timing issues. This must be a bug elsewhere.
- */
- return std::max(netlist_time::from_double(new_solver_timestep), netlist_time::quantum() * 2);
-}
-
-
-void matrix_solver_t::log_stats()
-{
- if (this->m_stat_calculations != 0 && this->m_stat_vsolver_calls && this->m_params.m_log_stats)
+ void matrix_solver_t::log_stats()
{
- log().verbose("==============================================");
- log().verbose("Solver {1}", this->name());
- log().verbose(" ==> {1} nets", this->m_nets.size()); //, (*(*groups[i].first())->m_core_terms.first())->name());
- log().verbose(" has {1} elements", this->has_dynamic_devices() ? "dynamic" : "no dynamic");
- log().verbose(" has {1} elements", this->has_timestep_devices() ? "timestep" : "no timestep");
- log().verbose(" {1:6.3} average newton raphson loops",
- static_cast<double>(this->m_stat_newton_raphson) / static_cast<double>(this->m_stat_vsolver_calls));
- log().verbose(" {1:10} invocations ({2:6.0} Hz) {3:10} gs fails ({4:6.2} %) {5:6.3} average",
- this->m_stat_calculations,
- static_cast<double>(this->m_stat_calculations) / this->netlist().time().as_double(),
- this->m_iterative_fail,
- 100.0 * static_cast<double>(this->m_iterative_fail)
- / static_cast<double>(this->m_stat_calculations),
- static_cast<double>(this->m_iterative_total) / static_cast<double>(this->m_stat_calculations));
+ if (this->m_stat_calculations != 0 && this->m_stat_vsolver_calls && this->m_params.m_log_stats)
+ {
+ log().verbose("==============================================");
+ log().verbose("Solver {1}", this->name());
+ log().verbose(" ==> {1} nets", this->m_nets.size()); //, (*(*groups[i].first())->m_core_terms.first())->name());
+ log().verbose(" has {1} elements", this->has_dynamic_devices() ? "dynamic" : "no dynamic");
+ log().verbose(" has {1} elements", this->has_timestep_devices() ? "timestep" : "no timestep");
+ log().verbose(" {1:6.3} average newton raphson loops",
+ static_cast<double>(this->m_stat_newton_raphson) / static_cast<double>(this->m_stat_vsolver_calls));
+ log().verbose(" {1:10} invocations ({2:6.0} Hz) {3:10} gs fails ({4:6.2} %) {5:6.3} average",
+ this->m_stat_calculations,
+ static_cast<double>(this->m_stat_calculations) / this->exec().time().as_double(),
+ this->m_iterative_fail,
+ 100.0 * static_cast<double>(this->m_iterative_fail)
+ / static_cast<double>(this->m_stat_calculations),
+ static_cast<double>(this->m_iterative_total) / static_cast<double>(this->m_stat_calculations));
+ }
}
-}
-
- } //namespace devices
+} // namespace devices
} // namespace netlist
diff --git a/src/lib/netlist/solver/nld_matrix_solver.h b/src/lib/netlist/solver/nld_matrix_solver.h
index da44370d0d9..f76660e1cb9 100644
--- a/src/lib/netlist/solver/nld_matrix_solver.h
+++ b/src/lib/netlist/solver/nld_matrix_solver.h
@@ -10,282 +10,367 @@
#include "netlist/nl_base.h"
#include "netlist/nl_errstr.h"
-#include "netlist/plib/putil.h"
+#include "plib/palloc.h"
+#include "plib/pmatrix2d.h"
+#include "plib/putil.h"
+#include "plib/vector_ops.h"
+
+#include <cmath>
namespace netlist
{
- namespace devices
- {
+namespace devices
+{
/* FIXME: these should become proper devices */
struct solver_parameters_t
{
- int m_pivot;
+ bool m_pivot;
nl_double m_accuracy;
nl_double m_dynamic_lte;
nl_double m_min_timestep;
nl_double m_max_timestep;
nl_double m_gs_sor;
bool m_dynamic_ts;
- unsigned m_gs_loops;
- unsigned m_nr_loops;
+ std::size_t m_gs_loops;
+ std::size_t m_nr_loops;
netlist_time m_nr_recalc_delay;
+ bool m_use_gabs;
+ bool m_use_linear_prediction;
bool m_log_stats;
};
-class terms_for_net_t : plib::nocopyassignmove
-{
-public:
- terms_for_net_t();
+ class terms_for_net_t : plib::nocopyassignmove
+ {
+ public:
+ terms_for_net_t();
- void clear();
+ void clear();
- void add(terminal_t *term, int net_other, bool sorted);
+ void add(terminal_t *term, int net_other, bool sorted);
- inline std::size_t count() const { return m_terms.size(); }
+ std::size_t count() const { return m_terms.size(); }
- inline terminal_t **terms() { return m_terms.data(); }
- inline int *connected_net_idx() { return m_connected_net_idx.data(); }
- inline nl_double *gt() { return m_gt.data(); }
- inline nl_double *go() { return m_go.data(); }
- inline nl_double *Idr() { return m_Idr.data(); }
- inline nl_double * const *connected_net_V() const { return m_connected_net_V.data(); }
+ terminal_t **terms() { return m_terms.data(); }
- void set_pointers();
+ std::size_t m_railstart;
- std::size_t m_railstart;
+ std::vector<unsigned> m_nz; /* all non zero for multiplication */
+ std::vector<unsigned> m_nzrd; /* non zero right of the diagonal for elimination, may include RHS element */
+ std::vector<unsigned> m_nzbd; /* non zero below of the diagonal for elimination */
- std::vector<unsigned> m_nz; /* all non zero for multiplication */
- std::vector<unsigned> m_nzrd; /* non zero right of the diagonal for elimination, may include RHS element */
- std::vector<unsigned> m_nzbd; /* non zero below of the diagonal for elimination */
+ /* state */
+ nl_double m_last_V;
+ nl_double m_DD_n_m_1;
+ nl_double m_h_n_m_1;
- /* state */
- nl_double m_last_V;
- nl_double m_DD_n_m_1;
- nl_double m_h_n_m_1;
+ std::vector<int> m_connected_net_idx;
+ private:
+ std::vector<terminal_t *> m_terms;
-private:
- std::vector<int> m_connected_net_idx;
- std::vector<nl_double> m_go;
- std::vector<nl_double> m_gt;
- std::vector<nl_double> m_Idr;
- std::vector<nl_double *> m_connected_net_V;
- std::vector<terminal_t *> m_terms;
+ };
-};
+ class proxied_analog_output_t : public analog_output_t
+ {
+ public:
-class proxied_analog_output_t : public analog_output_t
-{
-public:
+ proxied_analog_output_t(core_device_t &dev, const pstring &aname, analog_net_t *pnet)
+ : analog_output_t(dev, aname)
+ , m_proxied_net(pnet)
+ { }
- proxied_analog_output_t(core_device_t &dev, const pstring &aname)
- : analog_output_t(dev, aname)
- , m_proxied_net(nullptr)
- { }
- virtual ~proxied_analog_output_t();
+ analog_net_t *proxied_net() const { return m_proxied_net;}
+ private:
+ analog_net_t *m_proxied_net; // only for proxy nets in analog input logic
+ };
- analog_net_t *m_proxied_net; // only for proxy nets in analog input logic
-};
+ class matrix_solver_t : public device_t
+ {
+ public:
+ using list_t = std::vector<matrix_solver_t *>;
+ enum eSortType
+ {
+ NOSORT,
+ ASCENDING,
+ DESCENDING,
+ PREFER_IDENTITY_TOP_LEFT,
+ PREFER_BAND_MATRIX
+ };
+
+ void setup(analog_net_t::list_t &nets)
+ {
+ vsetup(nets);
+ }
-class matrix_solver_t : public device_t
-{
-public:
- using list_t = std::vector<matrix_solver_t *>;
+ void solve_base();
- enum eSortType
- {
- NOSORT,
- ASCENDING,
- DESCENDING
- };
+ /* after every call to solve, update inputs must be called.
+ * this can be done as well as a batch to ease parallel processing.
+ */
+ const netlist_time solve(netlist_time now);
+ void update_inputs();
- virtual ~matrix_solver_t() override;
+ bool has_dynamic_devices() const { return m_dynamic_devices.size() > 0; }
+ bool has_timestep_devices() const { return m_step_devices.size() > 0; }
- void setup(analog_net_t::list_t &nets)
- {
- vsetup(nets);
- }
+ void update_forced();
+ void update_after(const netlist_time after)
+ {
+ m_Q_sync.net().toggle_and_push_to_queue(after);
+ }
- void solve_base();
+ /* netdevice functions */
+ NETLIB_UPDATEI();
+ NETLIB_RESETI();
- /* after every call to solve, update inputs must be called.
- * this can be done as well as a batch to ease parallel processing.
- */
- const netlist_time solve();
- void update_inputs();
+ public:
+ int get_net_idx(detail::net_t *net);
+ std::pair<int, int> get_left_right_of_diag(std::size_t row, std::size_t diag);
+ double get_weight_around_diag(std::size_t row, std::size_t diag);
- inline bool has_dynamic_devices() const { return m_dynamic_devices.size() > 0; }
- inline bool has_timestep_devices() const { return m_step_devices.size() > 0; }
+ virtual void log_stats();
- void update_forced();
- void update_after(const netlist_time &after)
- {
- m_Q_sync.net().toggle_and_push_to_queue(after);
- }
+ virtual std::pair<pstring, pstring> create_solver_code()
+ {
+ return std::pair<pstring, pstring>("", plib::pfmt("/* solver doesn't support static compile */\n\n"));
+ }
- /* netdevice functions */
- NETLIB_UPDATEI();
- NETLIB_RESETI();
+ /* return number of floating point operations for solve */
+ std::size_t ops() { return m_ops; }
-public:
- int get_net_idx(detail::net_t *net);
+ protected:
- virtual void log_stats();
+ matrix_solver_t(netlist_state_t &anetlist, const pstring &name,
+ eSortType sort, const solver_parameters_t *params);
- virtual std::pair<pstring, pstring> create_solver_code()
- {
- return std::pair<pstring, pstring>("", plib::pfmt("/* solver doesn't support static compile */\n\n"));
- }
+ void sort_terms(eSortType sort);
- /* return number of floating point operations for solve */
- std::size_t ops() { return m_ops; }
+ void setup_base(analog_net_t::list_t &nets);
+ void update_dynamic();
-protected:
+ virtual void vsetup(analog_net_t::list_t &nets) = 0;
+ virtual unsigned vsolve_non_dynamic(const bool newton_raphson) = 0;
- matrix_solver_t(netlist_t &anetlist, const pstring &name,
- const eSortType sort, const solver_parameters_t *params);
+ netlist_time compute_next_timestep(const double cur_ts);
+ /* virtual */ void add_term(std::size_t net_idx, terminal_t *term);
- void setup_base(analog_net_t::list_t &nets);
- void update_dynamic();
+ template <typename T>
+ void store(const T & V);
- virtual void vsetup(analog_net_t::list_t &nets) = 0;
- virtual unsigned vsolve_non_dynamic(const bool newton_raphson) = 0;
+ template <typename T>
+ auto delta(const T & V) -> typename std::decay<decltype(V[0])>::type;
- netlist_time compute_next_timestep(const double cur_ts);
- /* virtual */ void add_term(std::size_t net_idx, terminal_t *term);
+ template <typename T>
+ void build_LE_A(T &child);
+ template <typename T>
+ void build_LE_RHS(T &child);
- template <typename T>
- void store(const T * RESTRICT V);
- template <typename T>
- T delta(const T * RESTRICT V);
+ void set_pointers()
+ {
+ const std::size_t iN = this->m_nets.size();
+
+ std::size_t max_count = 0;
+ std::size_t max_rail = 0;
+ for (std::size_t k = 0; k < iN; k++)
+ {
+ max_count = std::max(max_count, m_terms[k]->count());
+ max_rail = std::max(max_rail, m_terms[k]->m_railstart);
+ }
+
+ m_mat_ptr.resize(iN, max_rail+1);
+ m_gtn.resize(iN, max_count);
+ m_gonn.resize(iN, max_count);
+ m_Idrn.resize(iN, max_count);
+ m_connected_net_Vn.resize(iN, max_count);
+
+ for (std::size_t k = 0; k < iN; k++)
+ {
+ auto count = m_terms[k]->count();
+
+ for (std::size_t i = 0; i < count; i++)
+ {
+ m_terms[k]->terms()[i]->set_ptrs(&m_gtn[k][i], &m_gonn[k][i], &m_Idrn[k][i]);
+ m_connected_net_Vn[k][i] = m_terms[k]->terms()[i]->connected_terminal()->net().Q_Analog_state_ptr();
+ }
+ }
+ }
- template <typename T>
- void build_LE_A();
- template <typename T>
- void build_LE_RHS();
+ template <typename AP, typename FT>
+ void fill_matrix(std::size_t N, AP &tcr, FT &RHS)
+ {
+ for (std::size_t k = 0; k < N; k++)
+ {
+ auto *net = m_terms[k].get();
+ auto **tcr_r = &(tcr[k][0]);
+
+ const std::size_t term_count = net->count();
+ const std::size_t railstart = net->m_railstart;
+ const auto &go = m_gonn[k];
+ const auto &gt = m_gtn[k];
+ const auto &Idr = m_Idrn[k];
+ const auto &cnV = m_connected_net_Vn[k];
+
+ for (std::size_t i = 0; i < railstart; i++)
+ *tcr_r[i] += go[i];
+
+ typename FT::value_type gtot_t = 0.0;
+ typename FT::value_type RHS_t = 0.0;
+
+ for (std::size_t i = 0; i < term_count; i++)
+ {
+ gtot_t += gt[i];
+ RHS_t += Idr[i];
+ }
+ // FIXME: Code above is faster than vec_sum - Check this
+ #if 0
+ auto gtot_t = plib::vec_sum<FT>(term_count, m_gt);
+ auto RHS_t = plib::vec_sum<FT>(term_count, m_Idr);
+ #endif
+
+ for (std::size_t i = railstart; i < term_count; i++)
+ {
+ RHS_t += (/*m_Idr[i]*/ (- go[i]) * *cnV[i]);
+ }
+
+ RHS[k] = RHS_t;
+ // update diagonal element ...
+ *tcr_r[railstart] += gtot_t; //mat.A[mat.diag[k]] += gtot_t;
+ }
- std::vector<std::unique_ptr<terms_for_net_t>> m_terms;
- std::vector<analog_net_t *> m_nets;
- std::vector<std::unique_ptr<proxied_analog_output_t>> m_inps;
+ }
- std::vector<terms_for_net_t *> m_rails_temp;
+ template <typename T>
+ using aligned_alloc = plib::aligned_allocator<T, PALIGN_VECTOROPT>;
- const solver_parameters_t &m_params;
+ plib::pmatrix2d<nl_double, aligned_alloc<nl_double>> m_gonn;
+ plib::pmatrix2d<nl_double, aligned_alloc<nl_double>> m_gtn;
+ plib::pmatrix2d<nl_double, aligned_alloc<nl_double>> m_Idrn;
+ plib::pmatrix2d<nl_double *, aligned_alloc<nl_double *>> m_mat_ptr;
+ plib::pmatrix2d<nl_double *, aligned_alloc<nl_double *>> m_connected_net_Vn;
- state_var<int> m_stat_calculations;
- state_var<int> m_stat_newton_raphson;
- state_var<int> m_stat_vsolver_calls;
- state_var<int> m_iterative_fail;
- state_var<int> m_iterative_total;
+ plib::pmatrix2d<nl_double> m_test;
-private:
+ std::vector<plib::unique_ptr<terms_for_net_t>> m_terms;
+ std::vector<analog_net_t *> m_nets;
+ std::vector<pool_owned_ptr<proxied_analog_output_t>> m_inps;
- state_var<netlist_time> m_last_step;
- std::vector<core_device_t *> m_step_devices;
- std::vector<core_device_t *> m_dynamic_devices;
+ std::vector<plib::unique_ptr<terms_for_net_t>> m_rails_temp;
- logic_input_t m_fb_sync;
- logic_output_t m_Q_sync;
+ const solver_parameters_t &m_params;
- /* calculate matrix */
- void setup_matrix();
+ state_var<int> m_stat_calculations;
+ state_var<int> m_stat_newton_raphson;
+ state_var<int> m_stat_vsolver_calls;
+ state_var<int> m_iterative_fail;
+ state_var<int> m_iterative_total;
- void step(const netlist_time &delta);
+ private:
- std::size_t m_ops;
- const eSortType m_sort;
-};
+ state_var<netlist_time> m_last_step;
+ std::vector<core_device_t *> m_step_devices;
+ std::vector<core_device_t *> m_dynamic_devices;
-template <typename T>
-T matrix_solver_t::delta(const T * RESTRICT V)
-{
- /* NOTE: Ideally we should also include currents (RHS) here. This would
- * need a reevaluation of the right hand side after voltages have been updated
- * and thus belong into a different calculation. This applies to all solvers.
- */
-
- const std::size_t iN = this->m_terms.size();
- T cerr = 0;
- for (std::size_t i = 0; i < iN; i++)
- cerr = std::max(cerr, std::abs(V[i] - static_cast<T>(this->m_nets[i]->Q_Analog())));
- return cerr;
-}
-
-template <typename T>
-void matrix_solver_t::store(const T * RESTRICT V)
-{
- const std::size_t iN = this->m_terms.size();
- for (std::size_t i = 0; i < iN; i++)
- this->m_nets[i]->set_Q_Analog(V[i]);
-}
+ logic_input_t m_fb_sync;
+ logic_output_t m_Q_sync;
-template <typename T>
-void matrix_solver_t::build_LE_A()
-{
- static_assert(std::is_base_of<matrix_solver_t, T>::value, "T must derive from matrix_solver_t");
+ /* calculate matrix */
+ void setup_matrix();
- T &child = static_cast<T &>(*this);
+ void step(const netlist_time &delta);
- const std::size_t iN = child.N();
- for (std::size_t k = 0; k < iN; k++)
+ std::size_t m_ops;
+ const eSortType m_sort;
+ };
+
+ template <typename T>
+ auto matrix_solver_t::delta(const T & V) -> typename std::decay<decltype(V[0])>::type
{
- terms_for_net_t *terms = m_terms[k].get();
- nl_double * Ak = &child.A(k, 0);
+ /* NOTE: Ideally we should also include currents (RHS) here. This would
+ * need a reevaluation of the right hand side after voltages have been updated
+ * and thus belong into a different calculation. This applies to all solvers.
+ */
+
+ const std::size_t iN = this->m_terms.size();
+ typename std::decay<decltype(V[0])>::type cerr = 0;
+ for (std::size_t i = 0; i < iN; i++)
+ cerr = std::max(cerr, std::abs(V[i] - this->m_nets[i]->Q_Analog()));
+ return cerr;
+ }
- for (std::size_t i=0; i < iN; i++)
- Ak[i] = 0.0;
+ template <typename T>
+ void matrix_solver_t::store(const T & V)
+ {
+ const std::size_t iN = this->m_terms.size();
+ for (std::size_t i = 0; i < iN; i++)
+ this->m_nets[i]->set_Q_Analog(V[i]);
+ }
- const std::size_t terms_count = terms->count();
- const std::size_t railstart = terms->m_railstart;
- const nl_double * const RESTRICT gt = terms->gt();
+ template <typename T>
+ void matrix_solver_t::build_LE_A(T &child)
+ {
+ using float_type = typename T::float_type;
+ static_assert(std::is_base_of<matrix_solver_t, T>::value, "T must derive from matrix_solver_t");
+ const std::size_t iN = child.size();
+ for (std::size_t k = 0; k < iN; k++)
{
- nl_double akk = 0.0;
- for (std::size_t i = 0; i < terms_count; i++)
- akk += gt[i];
+ terms_for_net_t *terms = m_terms[k].get();
+ float_type * Ak = &child.A(k, 0ul);
- Ak[k] = akk;
- }
+ for (std::size_t i=0; i < iN; i++)
+ Ak[i] = 0.0;
- const nl_double * const RESTRICT go = terms->go();
- int * RESTRICT net_other = terms->connected_net_idx();
+ const std::size_t terms_count = terms->count();
+ const std::size_t railstart = terms->m_railstart;
+ const float_type * const gt = m_gtn[k];
- for (std::size_t i = 0; i < railstart; i++)
- Ak[net_other[i]] -= go[i];
- }
-}
+ {
+ float_type akk = 0.0;
+ for (std::size_t i = 0; i < terms_count; i++)
+ akk += gt[i];
-template <typename T>
-void matrix_solver_t::build_LE_RHS()
-{
- static_assert(std::is_base_of<matrix_solver_t, T>::value, "T must derive from matrix_solver_t");
- T &child = static_cast<T &>(*this);
+ Ak[k] = akk;
+ }
+
+ const float_type * const go = m_gonn[k];
+ int * net_other = terms->m_connected_net_idx.data();
+
+ for (std::size_t i = 0; i < railstart; i++)
+ Ak[net_other[i]] += go[i];
+ }
+ }
- const std::size_t iN = child.N();
- for (std::size_t k = 0; k < iN; k++)
+ template <typename T>
+ void matrix_solver_t::build_LE_RHS(T &child)
{
- nl_double rhsk_a = 0.0;
- nl_double rhsk_b = 0.0;
+ static_assert(std::is_base_of<matrix_solver_t, T>::value, "T must derive from matrix_solver_t");
+ using float_type = typename T::float_type;
- const std::size_t terms_count = m_terms[k]->count();
- const nl_double * const RESTRICT go = m_terms[k]->go();
- const nl_double * const RESTRICT Idr = m_terms[k]->Idr();
- const nl_double * const * RESTRICT other_cur_analog = m_terms[k]->connected_net_V();
+ const std::size_t iN = child.size();
+ for (std::size_t k = 0; k < iN; k++)
+ {
+ float_type rhsk_a = 0.0;
+ float_type rhsk_b = 0.0;
- for (std::size_t i = 0; i < terms_count; i++)
- rhsk_a = rhsk_a + Idr[i];
+ const std::size_t terms_count = m_terms[k]->count();
+ const float_type * const go = m_gonn[k];
+ const float_type * const Idr = m_Idrn[k];
+ const float_type * const * other_cur_analog = m_connected_net_Vn[k];
- for (std::size_t i = m_terms[k]->m_railstart; i < terms_count; i++)
- //rhsk = rhsk + go[i] * terms[i]->m_otherterm->net().as_analog().Q_Analog();
- rhsk_b = rhsk_b + go[i] * *other_cur_analog[i];
+ for (std::size_t i = 0; i < terms_count; i++)
+ rhsk_a = rhsk_a + Idr[i];
+
+ for (std::size_t i = m_terms[k]->m_railstart; i < terms_count; i++)
+ //rhsk = rhsk + go[i] * terms[i]->m_otherterm->net().as_analog().Q_Analog();
+ rhsk_b = rhsk_b - go[i] * *other_cur_analog[i];
- child.RHS(k) = rhsk_a + rhsk_b;
+ child.RHS(k) = rhsk_a + rhsk_b;
+ }
}
-}
- } //namespace devices
+} //namespace devices
} // namespace netlist
#endif /* NLD_MS_DIRECT_H_ */
diff --git a/src/lib/netlist/solver/nld_ms_direct.h b/src/lib/netlist/solver/nld_ms_direct.h
index f03cb738028..2501742218d 100644
--- a/src/lib/netlist/solver/nld_ms_direct.h
+++ b/src/lib/netlist/solver/nld_ms_direct.h
@@ -8,286 +8,228 @@
#ifndef NLD_MS_DIRECT_H_
#define NLD_MS_DIRECT_H_
-#include <algorithm>
-
-#include "nld_solver.h"
#include "nld_matrix_solver.h"
-#include "vector_base.h"
+#include "nld_solver.h"
+#include "plib/mat_cr.h"
+#include "plib/vector_ops.h"
-/* Disabling dynamic allocation gives a ~10% boost in performance
- * This flag has been added to support continuous storage for arrays
- * going forward in case we implement cuda solvers in the future.
- */
-#define NL_USE_DYNAMIC_ALLOCATION (1)
+#include <algorithm>
+#include <cmath>
namespace netlist
{
- namespace devices
- {
-//#define nl_ext_double _float128 // slow, very slow
-//#define nl_ext_double long double // slightly slower
-#define nl_ext_double nl_double
-
-
-template <std::size_t m_N, std::size_t storage_N>
-class matrix_solver_direct_t: public matrix_solver_t
+namespace devices
{
- friend class matrix_solver_t;
-public:
- matrix_solver_direct_t(netlist_t &anetlist, const pstring &name, const solver_parameters_t *params, const std::size_t size);
- matrix_solver_direct_t(netlist_t &anetlist, const pstring &name, const eSortType sort, const solver_parameters_t *params, const std::size_t size);
+ template <typename FT, int SIZE>
+ class matrix_solver_direct_t: public matrix_solver_t
+ {
+ friend class matrix_solver_t;
+ public:
- virtual ~matrix_solver_direct_t() override;
+ using float_type = FT;
- virtual void vsetup(analog_net_t::list_t &nets) override;
- virtual void reset() override { matrix_solver_t::reset(); }
+ matrix_solver_direct_t(netlist_state_t &anetlist, const pstring &name, const solver_parameters_t *params, const std::size_t size);
+ matrix_solver_direct_t(netlist_state_t &anetlist, const pstring &name, const eSortType sort, const solver_parameters_t *params, const std::size_t size);
-protected:
- virtual unsigned vsolve_non_dynamic(const bool newton_raphson) override;
- unsigned solve_non_dynamic(const bool newton_raphson);
+ void vsetup(analog_net_t::list_t &nets) override;
+ void reset() override { matrix_solver_t::reset(); }
- constexpr std::size_t N() const { return (m_N == 0) ? m_dim : m_N; }
+ protected:
+ unsigned vsolve_non_dynamic(const bool newton_raphson) override;
+ unsigned solve_non_dynamic(const bool newton_raphson);
- void LE_solve();
+ constexpr std::size_t size() const { return (SIZE > 0) ? static_cast<std::size_t>(SIZE) : m_dim; }
- template <typename T>
- void LE_back_subst(T * RESTRICT x);
-
-#if (NL_USE_DYNAMIC_ALLOCATION)
- template <typename T1, typename T2>
- nl_ext_double &A(const T1 &r, const T2 &c) { return m_A[r * m_pitch + c]; }
- template <typename T1>
- nl_ext_double &RHS(const T1 &r) { return m_A[r * m_pitch + N()]; }
-#else
- template <typename T1, typename T2>
- nl_ext_double &A(const T1 &r, const T2 &c) { return m_A[r][c]; }
- template <typename T1>
- nl_ext_double &RHS(const T1 &r) { return m_A[r][N()]; }
-#endif
- nl_double m_last_RHS[storage_N]; // right hand side - contains currents
-
-private:
- //static const std::size_t m_pitch = (((storage_N + 1) + 0) / 1) * 1;
- static constexpr std::size_t m_pitch = (((storage_N + 1) + 7) / 8) * 8;
- //static const std::size_t m_pitch = (((storage_N + 1) + 15) / 16) * 16;
- //static const std::size_t m_pitch = (((storage_N + 1) + 31) / 32) * 32;
-#if (NL_USE_DYNAMIC_ALLOCATION)
- //nl_ext_double * RESTRICT m_A;
- std::vector<nl_ext_double> m_A;
-#else
- nl_ext_double m_A[storage_N][m_pitch];
-#endif
- //nl_ext_double m_RHSx[storage_N];
-
- const std::size_t m_dim;
-
-};
-
-// ----------------------------------------------------------------------------------------
-// matrix_solver_direct
-// ----------------------------------------------------------------------------------------
-
-template <std::size_t m_N, std::size_t storage_N>
-matrix_solver_direct_t<m_N, storage_N>::~matrix_solver_direct_t()
-{
-#if (NL_USE_DYNAMIC_ALLOCATION)
- //plib::pfree_array(m_A);
-#endif
-}
+ void LE_solve();
-template <std::size_t m_N, std::size_t storage_N>
-void matrix_solver_direct_t<m_N, storage_N>::vsetup(analog_net_t::list_t &nets)
-{
- matrix_solver_t::setup_base(nets);
+ template <typename T>
+ void LE_back_subst(T & x);
- /* add RHS element */
- for (std::size_t k = 0; k < N(); k++)
- {
- terms_for_net_t * t = m_terms[k].get();
+ FT &A(std::size_t r, std::size_t c) { return m_A[r * m_pitch + c]; }
+ FT &RHS(std::size_t r) { return m_A[r * m_pitch + size()]; }
+ plib::parray<FT, SIZE> m_new_V;
- if (!plib::container::contains(t->m_nzrd, static_cast<unsigned>(N())))
- t->m_nzrd.push_back(static_cast<unsigned>(N()));
- }
+ private:
+ static constexpr const std::size_t SIZEABS = plib::parray<FT, SIZE>::SIZEABS();
+ static constexpr const std::size_t m_pitch_ABS = (((SIZEABS + 1) + 7) / 8) * 8;
- netlist().save(*this, m_last_RHS, "m_last_RHS");
+ const std::size_t m_dim;
+ const std::size_t m_pitch;
+ plib::parray<FT, SIZE * int(m_pitch_ABS)> m_A;
- for (std::size_t k = 0; k < N(); k++)
- netlist().save(*this, RHS(k), plib::pfmt("RHS.{1}")(k));
-}
+ };
+ // ----------------------------------------------------------------------------------------
+ // matrix_solver_direct
+ // ----------------------------------------------------------------------------------------
-template <std::size_t m_N, std::size_t storage_N>
-void matrix_solver_direct_t<m_N, storage_N>::LE_solve()
-{
- const std::size_t kN = N();
- if (!m_params.m_pivot)
+ template <typename FT, int SIZE>
+ void matrix_solver_direct_t<FT, SIZE>::vsetup(analog_net_t::list_t &nets)
{
- for (std::size_t i = 0; i < kN; i++)
- {
+ matrix_solver_t::setup_base(nets);
- /* FIXME: Singular matrix? */
- nl_double *Ai = &A(i, 0);
- const nl_double f = 1.0 / A(i,i);
- const auto &nzrd = m_terms[i]->m_nzrd;
- const auto &nzbd = m_terms[i]->m_nzbd;
+ /* add RHS element */
+ for (std::size_t k = 0; k < size(); k++)
+ {
+ terms_for_net_t * t = m_terms[k].get();
- for (std::size_t j : nzbd)
- {
- nl_double *Aj = &A(j, 0);
- const nl_double f1 = -f * Aj[i];
- for (std::size_t k : nzrd)
- Aj[k] += Ai[k] * f1;
- //RHS(j) += RHS(i) * f1;
- }
+ if (!plib::container::contains(t->m_nzrd, static_cast<unsigned>(size())))
+ t->m_nzrd.push_back(static_cast<unsigned>(size()));
}
+
+ // FIXME: This shouldn't be necessary ...
+ for (std::size_t k = 0; k < size(); k++)
+ state().save(*this, RHS(k), this->name(), plib::pfmt("RHS.{1}")(k));
}
- else
+
+ template <typename FT, int SIZE>
+ void matrix_solver_direct_t<FT, SIZE>::LE_solve()
{
- for (std::size_t i = 0; i < kN; i++)
+ const std::size_t kN = size();
+ if (!m_params.m_pivot)
{
- /* Find the row with the largest first value */
- std::size_t maxrow = i;
- for (std::size_t j = i + 1; j < kN; j++)
+ for (std::size_t i = 0; i < kN; i++)
{
- //if (std::abs(m_A[j][i]) > std::abs(m_A[maxrow][i]))
- if (A(j,i) * A(j,i) > A(maxrow,i) * A(maxrow,i))
- maxrow = j;
- }
+ /* FIXME: Singular matrix? */
+ const FT f = 1.0 / A(i,i);
+ const auto &nzrd = m_terms[i]->m_nzrd;
+ const auto &nzbd = m_terms[i]->m_nzbd;
- if (maxrow != i)
- {
- /* Swap the maxrow and ith row */
- for (std::size_t k = 0; k < kN + 1; k++) {
- std::swap(A(i,k), A(maxrow,k));
+ for (std::size_t j : nzbd)
+ {
+ const FT f1 = -f * A(j, i);
+ for (std::size_t k : nzrd)
+ A(j, k) += A(i, k) * f1;
+ //RHS(j) += RHS(i) * f1;
}
- //std::swap(RHS(i), RHS(maxrow));
}
- /* FIXME: Singular matrix? */
- const nl_double f = 1.0 / A(i,i);
+ }
+ else
+ {
+ for (std::size_t i = 0; i < kN; i++)
+ {
+ /* Find the row with the largest first value */
+ std::size_t maxrow = i;
+ for (std::size_t j = i + 1; j < kN; j++)
+ {
+ //if (std::abs(m_A[j][i]) > std::abs(m_A[maxrow][i]))
+ if (A(j,i) * A(j,i) > A(maxrow,i) * A(maxrow,i))
+ maxrow = j;
+ }
- /* Eliminate column i from row j */
+ if (maxrow != i)
+ {
+ /* Swap the maxrow and ith row */
+ for (std::size_t k = 0; k < kN + 1; k++) {
+ std::swap(A(i,k), A(maxrow,k));
+ }
+ //std::swap(RHS(i), RHS(maxrow));
+ }
+ /* FIXME: Singular matrix? */
+ const FT f = 1.0 / A(i,i);
- for (std::size_t j = i + 1; j < kN; j++)
- {
- const nl_double f1 = - A(j,i) * f;
- if (f1 != NL_FCONST(0.0))
+ /* Eliminate column i from row j */
+
+ for (std::size_t j = i + 1; j < kN; j++)
{
- const nl_double * RESTRICT pi = &A(i,i+1);
- nl_double * RESTRICT pj = &A(j,i+1);
-#if 1
- vec_add_mult_scalar_p(kN-i,pi,f1,pj);
-#else
- vec_add_mult_scalar_p(kN-i-1,pj,f1,pi);
- //for (unsigned k = i+1; k < kN; k++)
- // pj[k] = pj[k] + pi[k] * f1;
- //for (unsigned k = i+1; k < kN; k++)
- //A(j,k) += A(i,k) * f1;
- RHS(j) += RHS(i) * f1;
-#endif
+ const FT f1 = - A(j,i) * f;
+ if (f1 != plib::constants<FT>::zero())
+ {
+ const FT * pi = &A(i,i+1);
+ FT * pj = &A(j,i+1);
+ #if 1
+ plib::vec_add_mult_scalar_p(kN-i,pj, pi,f1);
+ #else
+ vec_add_mult_scalar_p1(kN-i-1,pj,pi,f1);
+ //for (unsigned k = i+1; k < kN; k++)
+ // pj[k] = pj[k] + pi[k] * f1;
+ //for (unsigned k = i+1; k < kN; k++)
+ //A(j,k) += A(i,k) * f1;
+ RHS(j) += RHS(i) * f1;
+ #endif
+ }
}
}
}
}
-}
-template <std::size_t m_N, std::size_t storage_N>
-template <typename T>
-void matrix_solver_direct_t<m_N, storage_N>::LE_back_subst(
- T * RESTRICT x)
-{
- const std::size_t kN = N();
-
- /* back substitution */
- if (m_params.m_pivot)
+ template <typename FT, int SIZE>
+ template <typename T>
+ void matrix_solver_direct_t<FT, SIZE>::LE_back_subst(
+ T & x)
{
- for (std::size_t j = kN; j-- > 0; )
+ const std::size_t kN = size();
+
+ /* back substitution */
+ if (m_params.m_pivot)
{
- T tmp = 0;
- for (std::size_t k = j+1; k < kN; k++)
- tmp += A(j,k) * x[k];
- x[j] = (RHS(j) - tmp) / A(j,j);
+ for (std::size_t j = kN; j-- > 0; )
+ {
+ FT tmp = 0;
+ for (std::size_t k = j+1; k < kN; k++)
+ tmp += A(j,k) * x[k];
+ x[j] = (RHS(j) - tmp) / A(j,j);
+ }
}
- }
- else
- {
- for (std::size_t j = kN; j-- > 0; )
+ else
{
- T tmp = 0;
-
- const auto *p = m_terms[j]->m_nzrd.data();
- const auto e = m_terms[j]->m_nzrd.size() - 1; /* exclude RHS element */
- T * Aj = &A(j,0);
- for (std::size_t k = 0; k < e; k++)
+ for (std::size_t j = kN; j-- > 0; )
{
- const auto pk = p[k];
- tmp += Aj[pk] * x[pk];
+ FT tmp = 0;
+ const auto &nzrd = m_terms[j]->m_nzrd;
+ const auto e = nzrd.size() - 1; /* exclude RHS element */
+ for ( std::size_t k = 0; k < e; k++)
+ tmp += A(j, nzrd[k]) * x[nzrd[k]];
+ x[j] = (RHS(j) - tmp) / A(j,j);
}
- x[j] = (RHS(j) - tmp) / A(j,j);
}
}
-}
+ template <typename FT, int SIZE>
+ unsigned matrix_solver_direct_t<FT, SIZE>::solve_non_dynamic(const bool newton_raphson)
+ {
+ this->LE_solve();
+ this->LE_back_subst(m_new_V);
-template <std::size_t m_N, std::size_t storage_N>
-unsigned matrix_solver_direct_t<m_N, storage_N>::solve_non_dynamic(const bool newton_raphson)
-{
- nl_double new_V[storage_N]; // = { 0.0 };
-
- this->LE_solve();
- this->LE_back_subst(new_V);
-
- const nl_double err = (newton_raphson ? delta(new_V) : 0.0);
- store(new_V);
- return (err > this->m_params.m_accuracy) ? 2 : 1;
-}
-
-template <std::size_t m_N, std::size_t storage_N>
-inline unsigned matrix_solver_direct_t<m_N, storage_N>::vsolve_non_dynamic(const bool newton_raphson)
-{
- build_LE_A<matrix_solver_direct_t>();
- build_LE_RHS<matrix_solver_direct_t>();
+ const FT err = (newton_raphson ? delta(m_new_V) : 0.0);
+ store(m_new_V);
+ return (err > this->m_params.m_accuracy) ? 2 : 1;
+ }
- for (std::size_t i=0, iN=N(); i < iN; i++)
- m_last_RHS[i] = RHS(i);
+ template <typename FT, int SIZE>
+ unsigned matrix_solver_direct_t<FT, SIZE>::vsolve_non_dynamic(const bool newton_raphson)
+ {
+ this->build_LE_A(*this);
+ this->build_LE_RHS(*this);
- this->m_stat_calculations++;
- return this->solve_non_dynamic(newton_raphson);
-}
+ this->m_stat_calculations++;
+ return this->solve_non_dynamic(newton_raphson);
+ }
-template <std::size_t m_N, std::size_t storage_N>
-matrix_solver_direct_t<m_N, storage_N>::matrix_solver_direct_t(netlist_t &anetlist, const pstring &name,
- const solver_parameters_t *params, const std::size_t size)
-: matrix_solver_t(anetlist, name, ASCENDING, params)
-, m_dim(size)
-{
-#if (NL_USE_DYNAMIC_ALLOCATION)
- m_A.resize(N() * m_pitch);
- //m_A = plib::palloc_array<nl_ext_double>(N() * m_pitch);
-#endif
- for (unsigned k = 0; k < N(); k++)
+ template <typename FT, int SIZE>
+ matrix_solver_direct_t<FT, SIZE>::matrix_solver_direct_t(netlist_state_t &anetlist, const pstring &name,
+ const solver_parameters_t *params, const std::size_t size)
+ : matrix_solver_t(anetlist, name, ASCENDING, params)
+ , m_new_V(size)
+ , m_dim(size)
+ , m_pitch(m_pitch_ABS ? m_pitch_ABS : (((m_dim + 1) + 7) / 8) * 8)
+ , m_A(size * m_pitch)
{
- m_last_RHS[k] = 0.0;
}
-}
-template <std::size_t m_N, std::size_t storage_N>
-matrix_solver_direct_t<m_N, storage_N>::matrix_solver_direct_t(netlist_t &anetlist, const pstring &name,
- const eSortType sort, const solver_parameters_t *params, const std::size_t size)
-: matrix_solver_t(anetlist, name, sort, params)
-, m_dim(size)
-{
-#if (NL_USE_DYNAMIC_ALLOCATION)
- m_A.resize(N() * m_pitch);
- //m_A = plib::palloc_array<nl_ext_double>(N() * m_pitch);
-#endif
- for (unsigned k = 0; k < N(); k++)
+ template <typename FT, int SIZE>
+ matrix_solver_direct_t<FT, SIZE>::matrix_solver_direct_t(netlist_state_t &anetlist, const pstring &name,
+ const eSortType sort, const solver_parameters_t *params, const std::size_t size)
+ : matrix_solver_t(anetlist, name, sort, params)
+ , m_new_V(size)
+ , m_dim(size)
+ , m_pitch(m_pitch_ABS ? m_pitch_ABS : (((m_dim + 1) + 7) / 8) * 8)
+ , m_A(size * m_pitch)
{
- m_last_RHS[k] = 0.0;
}
-}
- } //namespace devices
+} // namespace devices
} // namespace netlist
#endif /* NLD_MS_DIRECT_H_ */
diff --git a/src/lib/netlist/solver/nld_ms_direct1.h b/src/lib/netlist/solver/nld_ms_direct1.h
index 6e1f99bad7d..fbbb8ecb098 100644
--- a/src/lib/netlist/solver/nld_ms_direct1.h
+++ b/src/lib/netlist/solver/nld_ms_direct1.h
@@ -13,37 +13,41 @@
namespace netlist
{
- namespace devices
- {
-class matrix_solver_direct1_t: public matrix_solver_direct_t<1,1>
+namespace devices
{
-public:
+ template <typename FT>
+ class matrix_solver_direct1_t: public matrix_solver_direct_t<FT, 1>
+ {
+ public:
- matrix_solver_direct1_t(netlist_t &anetlist, const pstring &name, const solver_parameters_t *params)
- : matrix_solver_direct_t<1, 1>(anetlist, name, params, 1)
- {}
- virtual unsigned vsolve_non_dynamic(const bool newton_raphson) override;
+ using float_type = FT;
+ using base_type = matrix_solver_direct_t<FT, 1>;
-};
+ matrix_solver_direct1_t(netlist_state_t &anetlist, const pstring &name, const solver_parameters_t *params)
+ : matrix_solver_direct_t<FT, 1>(anetlist, name, params, 1)
+ {}
-// ----------------------------------------------------------------------------------------
-// matrix_solver - Direct1
-// ----------------------------------------------------------------------------------------
+ // ----------------------------------------------------------------------------------------
+ // matrix_solver - Direct1
+ // ----------------------------------------------------------------------------------------
+ unsigned vsolve_non_dynamic(const bool newton_raphson) override
+ {
+ this->build_LE_A(*this);
+ this->build_LE_RHS(*this);
+ //NL_VERBOSE_OUT(("{1} {2}\n", new_val, m_RHS[0] / m_A[0][0]);
-inline unsigned matrix_solver_direct1_t::vsolve_non_dynamic(ATTR_UNUSED const bool newton_raphson)
-{
- build_LE_A<matrix_solver_direct1_t>();
- build_LE_RHS<matrix_solver_direct1_t>();
- //NL_VERBOSE_OUT(("{1} {2}\n", new_val, m_RHS[0] / m_A[0][0]);
+ std::array<FT, 1> new_V = { this->RHS(0) / this->A(0,0) };
+
+ const FT err = (newton_raphson ? this->delta(new_V) : 0.0);
+ this->store(new_V);
+ return (err > this->m_params.m_accuracy) ? 2 : 1;
+ }
+
+ };
- nl_double new_V[1] = { RHS(0) / A(0,0) };
- const nl_double err = (newton_raphson ? delta(new_V) : 0.0);
- store(new_V);
- return (err > this->m_params.m_accuracy) ? 2 : 1;
-}
- } //namespace devices
+} //namespace devices
} // namespace netlist
diff --git a/src/lib/netlist/solver/nld_ms_direct2.h b/src/lib/netlist/solver/nld_ms_direct2.h
index 4004bce9cc4..01f77c3bc3c 100644
--- a/src/lib/netlist/solver/nld_ms_direct2.h
+++ b/src/lib/netlist/solver/nld_ms_direct2.h
@@ -13,43 +13,46 @@
namespace netlist
{
- namespace devices
- {
-class matrix_solver_direct2_t: public matrix_solver_direct_t<2,2>
+namespace devices
{
-public:
- matrix_solver_direct2_t(netlist_t &anetlist, const pstring &name, const solver_parameters_t *params)
- : matrix_solver_direct_t<2, 2>(anetlist, name, params, 2)
- {}
- virtual unsigned vsolve_non_dynamic(const bool newton_raphson) override;
+ // ----------------------------------------------------------------------------------------
+ // matrix_solver - Direct2
+ // ----------------------------------------------------------------------------------------
+
+ template <typename FT>
+ class matrix_solver_direct2_t: public matrix_solver_direct_t<FT, 2>
+ {
+ public:
-};
+ using float_type = FT;
-// ----------------------------------------------------------------------------------------
-// matrix_solver - Direct2
-// ----------------------------------------------------------------------------------------
+ matrix_solver_direct2_t(netlist_state_t &anetlist, const pstring &name, const solver_parameters_t *params)
+ : matrix_solver_direct_t<double, 2>(anetlist, name, params, 2)
+ {}
+ unsigned vsolve_non_dynamic(const bool newton_raphson) override
+ {
+ this->build_LE_A(*this);
+ this->build_LE_RHS(*this);
-inline unsigned matrix_solver_direct2_t::vsolve_non_dynamic(ATTR_UNUSED const bool newton_raphson)
-{
- build_LE_A<matrix_solver_direct2_t>();
- build_LE_RHS<matrix_solver_direct2_t>();
+ const float_type a = this->A(0,0);
+ const float_type b = this->A(0,1);
+ const float_type c = this->A(1,0);
+ const float_type d = this->A(1,1);
- const nl_double a = A(0,0);
- const nl_double b = A(0,1);
- const nl_double c = A(1,0);
- const nl_double d = A(1,1);
+ const float_type v1 = (a * this->RHS(1) - c * this->RHS(0)) / (a * d - b * c);
+ const float_type v0 = (this->RHS(0) - b * v1) / a;
+ std::array<float_type, 2> new_V = {v0, v1};
- nl_double new_V[2];
- new_V[1] = (a * RHS(1) - c * RHS(0)) / (a * d - b * c);
- new_V[0] = (RHS(0) - b * new_V[1]) / a;
+ this->m_stat_calculations++;
+ const float_type err = (newton_raphson ? this->delta(new_V) : 0.0);
+ this->store(new_V);
+ return (err > this->m_params.m_accuracy) ? 2 : 1;
+ }
- const nl_double err = (newton_raphson ? delta(new_V) : 0.0);
- store(new_V);
- return (err > this->m_params.m_accuracy) ? 2 : 1;
-}
+ };
- } //namespace devices
+} //namespace devices
} // namespace netlist
#endif /* NLD_MS_DIRECT2_H_ */
diff --git a/src/lib/netlist/solver/nld_ms_direct_lu.h b/src/lib/netlist/solver/nld_ms_direct_lu.h
index c379cf8d055..e7cedc1dd29 100644
--- a/src/lib/netlist/solver/nld_ms_direct_lu.h
+++ b/src/lib/netlist/solver/nld_ms_direct_lu.h
@@ -8,11 +8,11 @@
#ifndef NLD_MS_DIRECT_H_
#define NLD_MS_DIRECT_H_
-#include <algorithm>
-
#include "solver/nld_solver.h"
#include "solver/nld_matrix_solver.h"
+#include <algorithm>
+
//#define A(r, c) m_A[_r][_c]
namespace netlist
@@ -36,9 +36,9 @@ public:
virtual void vsetup(analog_net_t::list_t &nets) override;
virtual void reset() override { matrix_solver_t::reset(); }
- inline unsigned N() const { if (m_N == 0) return m_dim; else return m_N; }
+ unsigned N() const { if (m_N == 0) return m_dim; else return m_N; }
- inline int vsolve_non_dynamic(const bool newton_raphson);
+ int vsolve_non_dynamic(const bool newton_raphson);
protected:
virtual void add_term(int net_idx, terminal_t *term) override;
@@ -139,12 +139,10 @@ protected:
nl_double compute_next_timestep();
template <typename T1, typename T2>
- inline nl_ext_double &A(const T1 r, const T2 c) { return m_A[r][c]; }
+ nl_ext_double &A(const T1 r, const T2 c) { return m_A[r][c]; }
//nl_double m_A[storage_N][((storage_N + 7) / 8) * 8];
nl_double m_RHS[storage_N];
- nl_double m_last_RHS[storage_N]; // right hand side - contains currents
- nl_double m_last_V[storage_N];
terms_for_net_t *m_rails_temp;
@@ -355,7 +353,6 @@ void matrix_solver_direct_t<m_N, storage_N>::vsetup(analog_net_t::list_t &nets)
* save states
*/
save(NLNAME(m_RHS));
- save(NLNAME(m_last_RHS));
save(NLNAME(m_last_V));
for (unsigned k = 0; k < N(); k++)
@@ -590,13 +587,10 @@ unsigned matrix_solver_direct_t<m_N, storage_N>::solve_non_dynamic(const bool ne
}
template <unsigned m_N, unsigned storage_N>
-inline int matrix_solver_direct_t<m_N, storage_N>::vsolve_non_dynamic(const bool newton_raphson)
+int matrix_solver_direct_t<m_N, storage_N>::vsolve_non_dynamic(const bool newton_raphson)
{
this->build_LE_A();
- this->build_LE_RHS(m_last_RHS);
-
- for (unsigned i=0, iN=N(); i < iN; i++)
- m_RHS[i] = m_last_RHS[i];
+ this->build_LE_RHS(m_RHS);
return this->solve_non_dynamic(newton_raphson);
}
@@ -608,11 +602,6 @@ matrix_solver_direct_t<m_N, storage_N>::matrix_solver_direct_t(const solver_para
, m_lp_fact(0)
{
m_rails_temp = palloc_array(terms_for_net_t, N());
-
- for (unsigned k = 0; k < N(); k++)
- {
- m_last_RHS[k] = 0.0;
- }
}
template <unsigned m_N, unsigned storage_N>
@@ -626,7 +615,6 @@ matrix_solver_direct_t<m_N, storage_N>::matrix_solver_direct_t(const eSolverType
for (unsigned k = 0; k < N(); k++)
{
m_terms[k] = palloc(terms_for_net_t);
- m_last_RHS[k] = 0.0;
}
}
diff --git a/src/lib/netlist/solver/nld_ms_gcr.h b/src/lib/netlist/solver/nld_ms_gcr.h
index a17ca1ec282..f3e56a342d6 100644
--- a/src/lib/netlist/solver/nld_ms_gcr.h
+++ b/src/lib/netlist/solver/nld_ms_gcr.h
@@ -10,390 +10,201 @@
#ifndef NLD_MS_GCR_H_
#define NLD_MS_GCR_H_
-#include <algorithm>
+#include "plib/mat_cr.h"
-#include "../plib/pdynlib.h"
-#include "mat_cr.h"
#include "nld_ms_direct.h"
#include "nld_solver.h"
-#include "vector_base.h"
-#include "../plib/pstream.h"
+#include "plib/pdynlib.h"
+#include "plib/pstream.h"
+#include "plib/vector_ops.h"
+
+#include <algorithm>
namespace netlist
{
- namespace devices
- {
-template <std::size_t m_N, std::size_t storage_N>
-class matrix_solver_GCR_t: public matrix_solver_t
+namespace devices
{
-public:
-
- matrix_solver_GCR_t(netlist_t &anetlist, const pstring &name,
- const solver_parameters_t *params, const std::size_t size)
- : matrix_solver_t(anetlist, name, matrix_solver_t::ASCENDING, params)
- , m_dim(size)
- , mat(size)
- , m_proc()
- {
- }
- virtual ~matrix_solver_GCR_t() override
+ template <typename FT, int SIZE>
+ class matrix_solver_GCR_t: public matrix_solver_t
{
- }
-
- constexpr std::size_t N() const { return (m_N == 0) ? m_dim : m_N; }
-
- virtual void vsetup(analog_net_t::list_t &nets) override;
- virtual unsigned vsolve_non_dynamic(const bool newton_raphson) override;
+ public:
+
+ using mat_type = plib::matrix_compressed_rows_t<FT, SIZE>;
+ // FIXME: dirty hack to make this compile
+ static constexpr const std::size_t storage_N = 100;
+
+ matrix_solver_GCR_t(netlist_state_t &anetlist, const pstring &name,
+ const solver_parameters_t *params, const std::size_t size)
+ : matrix_solver_t(anetlist, name, matrix_solver_t::PREFER_IDENTITY_TOP_LEFT, params)
+ , m_dim(size)
+ , RHS(size)
+ , new_V(size)
+ , mat(static_cast<typename mat_type::index_type>(size))
+ , m_proc()
+ {
+ }
- virtual std::pair<pstring, pstring> create_solver_code() override;
+ constexpr std::size_t N() const { return m_dim; }
-private:
+ void vsetup(analog_net_t::list_t &nets) override;
+ unsigned vsolve_non_dynamic(const bool newton_raphson) override;
- //typedef typename mat_cr_t<storage_N>::type mattype;
- typedef typename mat_cr_t<storage_N>::index_type mattype;
+ std::pair<pstring, pstring> create_solver_code() override;
- void csc_private(plib::putf8_fmt_writer &strm);
+ private:
- using extsolver = void (*)(double * RESTRICT m_A, double * RESTRICT RHS, double * RESTRICT V);
+ using mat_index_type = typename plib::matrix_compressed_rows_t<FT, SIZE>::index_type;
- pstring static_compile_name();
+ void csc_private(plib::putf8_fmt_writer &strm);
- const std::size_t m_dim;
- std::vector<unsigned> m_term_cr[storage_N];
- mat_cr_t<storage_N> mat;
+ using extsolver = void (*)(double * m_A, double * RHS, double * V);
- //extsolver m_proc;
- plib::dynproc<void, double * RESTRICT, double * RESTRICT, double * RESTRICT> m_proc;
+ pstring static_compile_name();
-};
+ const std::size_t m_dim;
+ plib::parray<FT, SIZE> RHS;
+ plib::parray<FT, SIZE> new_V;
-// ----------------------------------------------------------------------------------------
-// matrix_solver - GCR
-// ----------------------------------------------------------------------------------------
+ mat_type mat;
-template <std::size_t m_N, std::size_t storage_N>
-void matrix_solver_GCR_t<m_N, storage_N>::vsetup(analog_net_t::list_t &nets)
-{
- setup_base(nets);
+ //extsolver m_proc;
+ plib::dynproc<void, double * , double * , double * > m_proc;
- mattype nz = 0;
- const std::size_t iN = this->N();
+ };
- /* build the final matrix */
+ // ----------------------------------------------------------------------------------------
+ // matrix_solver - GCR
+ // ----------------------------------------------------------------------------------------
- bool touched[storage_N][storage_N] = { { false } };
- for (std::size_t k = 0; k < iN; k++)
+ // FIXME: namespace or static class member
+ template <typename V>
+ std::size_t inline get_level(const V &v, std::size_t k)
{
- for (auto &j : this->m_terms[k]->m_nz)
- touched[k][j] = true;
+ for (std::size_t i = 0; i < v.size(); i++)
+ if (plib::container::contains(v[i], k))
+ return i;
+ throw plib::pexception("Error in get_level");
}
- unsigned fc = 0;
+ template <typename FT, int SIZE>
+ void matrix_solver_GCR_t<FT, SIZE>::vsetup(analog_net_t::list_t &nets)
+ {
+ setup_base(nets);
- unsigned ops = 0;
+ const std::size_t iN = this->N();
- for (std::size_t k = 0; k < iN; k++)
- {
- ops++; // 1/A(k,k)
- for (std::size_t row = k + 1; row < iN; row++)
- {
- if (touched[row][k])
- {
- ops++;
- fc++;
- for (std::size_t col = k + 1; col < iN; col++)
- if (touched[k][col])
- {
- touched[row][col] = true;
- ops += 2;
- }
- }
- }
- }
+ /* build the final matrix */
+ std::vector<std::vector<unsigned>> fill(iN);
- for (mattype k=0; k<iN; k++)
- {
- mat.ia[k] = nz;
+ std::size_t raw_elements = 0;
- for (mattype j=0; j<iN; j++)
+ for (std::size_t k = 0; k < iN; k++)
{
- if (touched[k][j])
+ fill[k].resize(iN, decltype(mat)::FILL_INFINITY);
+ for (auto &j : this->m_terms[k]->m_nz)
{
- mat.ja[nz] = j;
- if (j == k)
- mat.diag[k] = nz;
- nz++;
+ fill[k][j] = 0;
+ raw_elements++;
}
- }
- m_term_cr[k].clear();
- /* build pointers into the compressed row format matrix for each terminal */
- for (std::size_t j=0; j< this->m_terms[k]->m_railstart;j++)
- {
- int other = this->m_terms[k]->connected_net_idx()[j];
- for (auto i = mat.ia[k]; i < nz; i++)
- if (other == static_cast<int>(mat.ja[i]))
- {
- m_term_cr[k].push_back(i);
- break;
- }
}
- nl_assert(m_term_cr[k].size() == this->m_terms[k]->m_railstart);
- }
- mat.ia[iN] = nz;
- mat.nz_num = nz;
+ auto gr = mat.gaussian_extend_fill_mat(fill);
- this->log().verbose("Ops: {1} Occupancy ratio: {2}\n", ops,
- static_cast<double>(nz) / static_cast<double>(iN * iN));
-
- // FIXME: Move me
-
- if (netlist().lib().isLoaded())
- {
- pstring symname = static_compile_name();
-#if 0
- m_proc = this->netlist().lib().template getsym<extsolver>(symname);
- if (m_proc != nullptr)
- this->log().verbose("External static solver {1} found ...", symname);
- else
- this->log().warning("External static solver {1} not found ...", symname);
-#else
- m_proc.load(this->netlist().lib(), symname);
- if (m_proc.resolved())
- this->log().warning("External static solver {1} found ...", symname);
- else
- this->log().warning("External static solver {1} not found ...", symname);
-#endif
- }
+ /* FIXME: move this to the cr matrix class and use computed
+ * parallel ordering once it makes sense.
+ */
-}
-#if 0
-template <std::size_t m_N, std::size_t storage_N>
-void matrix_solver_GCR_t<m_N, storage_N>::csc_private(plib::putf8_fmt_writer &strm)
-{
- const std::size_t iN = N();
- for (std::size_t i = 0; i < iN - 1; i++)
- {
- const auto &nzbd = this->m_terms[i]->m_nzbd;
+ std::vector<unsigned> levL(iN, 0);
+ std::vector<unsigned> levU(iN, 0);
- if (nzbd.size() > 0)
+ // parallel scheme for L x = y
+ for (std::size_t k = 0; k < iN; k++)
{
- std::size_t pi = mat.diag[i];
-
- //const nl_double f = 1.0 / m_A[pi++];
- strm("const double f{1} = 1.0 / m_A[{2}];\n", i, pi);
- pi++;
- const std::size_t piie = mat.ia[i+1];
-
- //for (auto & j : nzbd)
- for (std::size_t j : nzbd)
- {
- // proceed to column i
- std::size_t pj = mat.ia[j];
-
- while (mat.ja[pj] < i)
- pj++;
-
- //const nl_double f1 = - m_A[pj++] * f;
- strm("\tconst double f{1}_{2} = -f{3} * m_A[{4}];\n", i, j, i, pj);
- pj++;
-
- // subtract row i from j */
- for (std::size_t pii = pi; pii<piie; )
- {
- while (mat.ja[pj] < mat.ja[pii])
- pj++;
- //m_A[pj++] += m_A[pii++] * f1;
- strm("\tm_A[{1}] += m_A[{2}] * f{3}_{4};\n", pj, pii, i, j);
- pj++; pii++;
- }
- //RHS[j] += f1 * RHS[i];
- strm("\tRHS[{1}] += f{2}_{3} * RHS[{4}];\n", j, i, j, i);
- }
+ unsigned lm=0;
+ for (std::size_t j = 0; j<k; j++)
+ if (fill[k][j] < decltype(mat)::FILL_INFINITY)
+ lm = std::max(lm, levL[j]);
+ levL[k] = 1+lm;
}
- }
- //new_V[iN - 1] = RHS[iN - 1] / mat.A[mat.diag[iN - 1]];
- strm("\tV[{1}] = RHS[{2}] / m_A[{3}];\n", iN - 1, iN - 1, mat.diag[iN - 1]);
- for (std::size_t j = iN - 1; j-- > 0;)
- {
- strm("\tdouble tmp{1} = 0.0;\n", j);
- const std::size_t e = mat.ia[j+1];
- for (std::size_t pk = mat.diag[j] + 1; pk < e; pk++)
+ // parallel scheme for U x = y
+ for (std::size_t k = iN; k-- > 0; )
{
- strm("\ttmp{1} += m_A[{2}] * V[{3}];\n", j, pk, mat.ja[pk]);
+ unsigned lm=0;
+ for (std::size_t j = iN; --j > k; )
+ if (fill[k][j] < decltype(mat)::FILL_INFINITY)
+ lm = std::max(lm, levU[j]);
+ levU[k] = 1+lm;
}
- strm("\tV[{1}] = (RHS[{1}] - tmp{1}) / m_A[{4}];\n", j, j, j, mat.diag[j]);
- }
-}
-#else
-template <std::size_t m_N, std::size_t storage_N>
-void matrix_solver_GCR_t<m_N, storage_N>::csc_private(plib::putf8_fmt_writer &strm)
-{
- const std::size_t iN = N();
- for (std::size_t i = 0; i < mat.nz_num; i++)
- strm("double m_A{1} = m_A[{2}];\n", i, i);
- for (std::size_t i = 0; i < iN - 1; i++)
- {
- const auto &nzbd = this->m_terms[i]->m_nzbd;
-
- if (nzbd.size() > 0)
+ for (std::size_t k = 0; k < iN; k++)
{
- std::size_t pi = mat.diag[i];
-
- //const nl_double f = 1.0 / m_A[pi++];
- strm("const double f{1} = 1.0 / m_A{2};\n", i, pi);
- pi++;
- const std::size_t piie = mat.ia[i+1];
-
- //for (auto & j : nzbd)
- for (std::size_t j : nzbd)
+ unsigned fm = 0;
+ pstring ml = "";
+ for (std::size_t j = 0; j < iN; j++)
{
- // proceed to column i
- std::size_t pj = mat.ia[j];
-
- while (mat.ja[pj] < i)
- pj++;
-
- //const nl_double f1 = - m_A[pj++] * f;
- strm("\tconst double f{1}_{2} = -f{3} * m_A{4};\n", i, j, i, pj);
- pj++;
-
- // subtract row i from j */
- for (std::size_t pii = pi; pii<piie; )
- {
- while (mat.ja[pj] < mat.ja[pii])
- pj++;
- //m_A[pj++] += m_A[pii++] * f1;
- strm("\tm_A{1} += m_A{2} * f{3}_{4};\n", pj, pii, i, j);
- pj++; pii++;
- }
- //RHS[j] += f1 * RHS[i];
- strm("\tRHS[{1}] += f{2}_{3} * RHS[{4}];\n", j, i, j, i);
+ ml += fill[k][j] == 0 ? "X" : fill[k][j] < decltype(mat)::FILL_INFINITY ? "+" : ".";
+ if (fill[k][j] < decltype(mat)::FILL_INFINITY)
+ if (fill[k][j] > fm)
+ fm = fill[k][j];
}
+ this->log().verbose("{1:4} {2} {3:4} {4:4} {5:4} {6:4}", k, ml, levL[k], levU[k], get_level(mat.m_ge_par, k), fm);
}
- }
-
- //new_V[iN - 1] = RHS[iN - 1] / mat.A[mat.diag[iN - 1]];
- strm("\tV[{1}] = RHS[{2}] / m_A{3};\n", iN - 1, iN - 1, mat.diag[iN - 1]);
- for (std::size_t j = iN - 1; j-- > 0;)
- {
- strm("\tdouble tmp{1} = 0.0;\n", j);
- const std::size_t e = mat.ia[j+1];
- for (std::size_t pk = mat.diag[j] + 1; pk < e; pk++)
- {
- strm("\ttmp{1} += m_A{2} * V[{3}];\n", j, pk, mat.ja[pk]);
- }
- strm("\tV[{1}] = (RHS[{1}] - tmp{1}) / m_A{4};\n", j, j, j, mat.diag[j]);
- }
-}
-#endif
-
-template <std::size_t m_N, std::size_t storage_N>
-pstring matrix_solver_GCR_t<m_N, storage_N>::static_compile_name()
-{
- plib::postringstream t;
- plib::putf8_fmt_writer w(t);
- csc_private(w);
- std::hash<pstring> h;
-
- return plib::pfmt("nl_gcr_{1:x}_{2}")(h( t.str() ))(mat.nz_num);
-}
-
-template <std::size_t m_N, std::size_t storage_N>
-std::pair<pstring, pstring> matrix_solver_GCR_t<m_N, storage_N>::create_solver_code()
-{
- plib::postringstream t;
- plib::putf8_fmt_writer strm(t);
- pstring name = static_compile_name();
-
- strm.writeline(plib::pfmt("extern \"C\" void {1}(double * __restrict m_A, double * __restrict RHS, double * __restrict V)\n")(name));
- strm.writeline("{\n");
- csc_private(strm);
- strm.writeline("}\n");
- return std::pair<pstring, pstring>(name, t.str());
-}
-template <std::size_t m_N, std::size_t storage_N>
-unsigned matrix_solver_GCR_t<m_N, storage_N>::vsolve_non_dynamic(const bool newton_raphson)
-{
- const std::size_t iN = this->N();
-
- nl_double RHS[storage_N];
- nl_double new_V[storage_N];
+ mat.build_from_fill_mat(fill);
- mat.set_scalar(0.0);
-
- for (std::size_t k = 0; k < iN; k++)
- {
- terms_for_net_t *t = this->m_terms[k].get();
- nl_double gtot_t = 0.0;
- nl_double RHS_t = 0.0;
-
- const std::size_t term_count = t->count();
- const std::size_t railstart = t->m_railstart;
- const nl_double * const RESTRICT gt = t->gt();
- const nl_double * const RESTRICT go = t->go();
- const nl_double * const RESTRICT Idr = t->Idr();
- const nl_double * const * RESTRICT other_cur_analog = t->connected_net_V();
- const unsigned * const RESTRICT tcr = m_term_cr[k].data();
-
-#if 0
- for (std::size_t i = 0; i < term_count; i++)
+ for (mat_index_type k=0; k<iN; k++)
{
- gtot_t += gt[i];
- RHS_t += Idr[i];
+ std::size_t cnt(0);
+ /* build pointers into the compressed row format matrix for each terminal */
+ for (std::size_t j=0; j< this->m_terms[k]->m_railstart;j++)
+ {
+ int other = this->m_terms[k]->m_connected_net_idx[j];
+ for (auto i = mat.row_idx[k]; i < mat.row_idx[k+1]; i++)
+ if (other == static_cast<int>(mat.col_idx[i]))
+ {
+ m_mat_ptr[k][j] = &mat.A[i];
+ cnt++;
+ break;
+ }
+ }
+ nl_assert(cnt == this->m_terms[k]->m_railstart);
+ m_mat_ptr[k][this->m_terms[k]->m_railstart] = &mat.A[mat.diag[k]];
}
- for (std::size_t i = railstart; i < term_count; i++)
- RHS_t += go[i] * *other_cur_analog[i];
+ this->log().verbose("maximum fill: {1}", gr.first);
+ this->log().verbose("Post elimination occupancy ratio: {2} Ops: {1}", gr.second,
+ static_cast<double>(mat.nz_num) / static_cast<double>(iN * iN));
+ this->log().verbose(" Pre elimination occupancy ratio: {2}",
+ static_cast<double>(raw_elements) / static_cast<double>(iN * iN));
- RHS[k] = RHS_t;
+ // FIXME: Move me
- // add diagonal element
- mat.A[mat.diag[k]] = gtot_t;
-
- for (std::size_t i = 0; i < railstart; i++)
- mat.A[tcr[i]] -= go[i];
- }
-#else
- for (std::size_t i = 0; i < railstart; i++)
- mat.A[tcr[i]] -= go[i];
-
- for (std::size_t i = 0; i < railstart; i++)
+ if (state().lib().isLoaded())
{
- gtot_t += gt[i];
- RHS_t += Idr[i];
+ pstring symname = static_compile_name();
+ m_proc.load(this->state().lib(), symname);
+ if (m_proc.resolved())
+ this->log().warning("External static solver {1} found ...", symname);
+ else
+ this->log().warning("External static solver {1} not found ...", symname);
}
- for (std::size_t i = railstart; i < term_count; i++)
- {
- RHS_t += (Idr[i] + go[i] * *other_cur_analog[i]);
- gtot_t += gt[i];
- }
-
- RHS[k] = RHS_t;
- mat.A[mat.diag[k]] += gtot_t;
}
-#endif
- mat.ia[iN] = static_cast<mattype>(mat.nz_num);
-
- /* now solve it */
- //if (m_proc != nullptr)
- if (m_proc.resolved())
- {
- //static_solver(m_A, RHS);
- m_proc(&mat.A[0], &RHS[0], &new_V[0]);
- }
- else
+ template <typename FT, int SIZE>
+ void matrix_solver_GCR_t<FT, SIZE>::csc_private(plib::putf8_fmt_writer &strm)
{
+ const std::size_t iN = N();
+
+ for (std::size_t i = 0; i < mat.nz_num; i++)
+ strm("double m_A{1} = m_A[{2}];\n", i, i);
+
for (std::size_t i = 0; i < iN - 1; i++)
{
const auto &nzbd = this->m_terms[i]->m_nzbd;
@@ -401,61 +212,114 @@ unsigned matrix_solver_GCR_t<m_N, storage_N>::vsolve_non_dynamic(const bool newt
if (nzbd.size() > 0)
{
std::size_t pi = mat.diag[i];
- const nl_double f = 1.0 / mat.A[pi++];
- const std::size_t piie = mat.ia[i+1];
- for (std::size_t j : nzbd) // for (std::size_t j = i + 1; j < iN; j++)
+ //const FT f = 1.0 / m_A[pi++];
+ strm("const double f{1} = 1.0 / m_A{2};\n", i, pi);
+ pi++;
+ const std::size_t piie = mat.row_idx[i+1];
+
+ //for (auto & j : nzbd)
+ for (std::size_t j : nzbd)
{
// proceed to column i
- //__builtin_prefetch(&m_A[mat.diag[j+1]], 1);
- std::size_t pj = mat.ia[j];
+ std::size_t pj = mat.row_idx[j];
- while (mat.ja[pj] < i)
+ while (mat.col_idx[pj] < i)
pj++;
- const nl_double f1 = - mat.A[pj++] * f;
+ //const FT f1 = - m_A[pj++] * f;
+ strm("\tconst double f{1}_{2} = -f{3} * m_A{4};\n", i, j, i, pj);
+ pj++;
// subtract row i from j */
for (std::size_t pii = pi; pii<piie; )
{
- while (mat.ja[pj] < mat.ja[pii])
+ while (mat.col_idx[pj] < mat.col_idx[pii])
pj++;
- mat.A[pj++] += mat.A[pii++] * f1;
+ //m_A[pj++] += m_A[pii++] * f1;
+ strm("\tm_A{1} += m_A{2} * f{3}_{4};\n", pj, pii, i, j);
+ pj++; pii++;
}
- RHS[j] += f1 * RHS[i];
+ //RHS[j] += f1 * RHS[i];
+ strm("\tRHS[{1}] += f{2}_{3} * RHS[{4}];\n", j, i, j, i);
}
}
}
- /* backward substitution
- *
- */
-
- /* row n-1 */
- new_V[iN - 1] = RHS[iN - 1] / mat.A[mat.diag[iN - 1]];
+ //new_V[iN - 1] = RHS[iN - 1] / mat.A[mat.diag[iN - 1]];
+ strm("\tV[{1}] = RHS[{2}] / m_A{3};\n", iN - 1, iN - 1, mat.diag[iN - 1]);
for (std::size_t j = iN - 1; j-- > 0;)
{
- //__builtin_prefetch(&new_V[j-1], 1);
- //if (j>0)__builtin_prefetch(&m_A[mat.diag[j-1]], 0);
- double tmp = 0;
- auto jdiag = mat.diag[j];
- const std::size_t e = mat.ia[j+1];
- for (std::size_t pk = jdiag + 1; pk < e; pk++)
+ strm("\tdouble tmp{1} = 0.0;\n", j);
+ const std::size_t e = mat.row_idx[j+1];
+ for (std::size_t pk = mat.diag[j] + 1; pk < e; pk++)
{
- tmp += mat.A[pk] * new_V[mat.ja[pk]];
+ strm("\ttmp{1} += m_A{2} * V[{3}];\n", j, pk, mat.col_idx[pk]);
}
- new_V[j] = (RHS[j] - tmp) / mat.A[jdiag];
+ strm("\tV[{1}] = (RHS[{1}] - tmp{1}) / m_A{4};\n", j, j, j, mat.diag[j]);
}
}
- this->m_stat_calculations++;
+ template <typename FT, int SIZE>
+ pstring matrix_solver_GCR_t<FT, SIZE>::static_compile_name()
+ {
+ plib::postringstream t;
+ plib::putf8_fmt_writer w(&t);
+ csc_private(w);
+ std::hash<pstring> h;
+
+ return plib::pfmt("nl_gcr_{1:x}_{2}")(h( t.str() ))(mat.nz_num);
+ }
- const nl_double err = (newton_raphson ? delta(new_V) : 0.0);
- store(new_V);
- return (err > this->m_params.m_accuracy) ? 2 : 1;
-}
+ template <typename FT, int SIZE>
+ std::pair<pstring, pstring> matrix_solver_GCR_t<FT, SIZE>::create_solver_code()
+ {
+ plib::postringstream t;
+ plib::putf8_fmt_writer strm(&t);
+ pstring name = static_compile_name();
+
+ strm.writeline(plib::pfmt("extern \"C\" void {1}(double * __restrict m_A, double * __restrict RHS, double * __restrict V)\n")(name));
+ strm.writeline("{\n");
+ csc_private(strm);
+ strm.writeline("}\n");
+ return std::pair<pstring, pstring>(name, t.str());
+ }
+
+ template <typename FT, int SIZE>
+ unsigned matrix_solver_GCR_t<FT, SIZE>::vsolve_non_dynamic(const bool newton_raphson)
+ {
+ const std::size_t iN = this->N();
+
+ mat.set_scalar(0.0);
+
+ /* populate matrix */
+
+ this->fill_matrix(iN, m_mat_ptr, RHS);
+
+ /* now solve it */
+
+ //if (m_proc != nullptr)
+ if (m_proc.resolved())
+ {
+ //static_solver(m_A, RHS);
+ m_proc(&mat.A[0], &RHS[0], &new_V[0]);
+ }
+ else
+ {
+ // mat.gaussian_elimination_parallel(RHS);
+ mat.gaussian_elimination(RHS);
+ /* backward substitution */
+ mat.gaussian_back_substitution(new_V, RHS);
+ }
+
+ this->m_stat_calculations++;
+
+ const FT err = (newton_raphson ? delta(new_V) : 0.0);
+ store(new_V);
+ return (err > this->m_params.m_accuracy) ? 2 : 1;
+ }
- } //namespace devices
+} // namespace devices
} // namespace netlist
#endif /* NLD_MS_GCR_H_ */
diff --git a/src/lib/netlist/solver/nld_ms_gmres.h b/src/lib/netlist/solver/nld_ms_gmres.h
index 2e4e447d14f..2ff515ebda7 100644
--- a/src/lib/netlist/solver/nld_ms_gmres.h
+++ b/src/lib/netlist/solver/nld_ms_gmres.h
@@ -1,387 +1,145 @@
// license:GPL-2.0+
// copyright-holders:Couriersud
/*
- * nld_ms_sor.h
- *
- * Generic successive over relaxation solver.
- *
- * Fow w==1 we will do the classic Gauss-Seidel approach
+ * nld_ms_gmres.h
*
*/
#ifndef NLD_MS_GMRES_H_
#define NLD_MS_GMRES_H_
-#include <algorithm>
-
-#include "mat_cr.h"
#include "nld_ms_direct.h"
#include "nld_solver.h"
-#include "vector_base.h"
+#include "plib/gmres.h"
+#include "plib/mat_cr.h"
+#include "plib/parray.h"
+#include "plib/vector_ops.h"
+
+#include <algorithm>
+#include <cmath>
+
namespace netlist
{
- namespace devices
- {
-template <std::size_t m_N, std::size_t storage_N>
-class matrix_solver_GMRES_t: public matrix_solver_direct_t<m_N, storage_N>
+namespace devices
{
-public:
-
- matrix_solver_GMRES_t(netlist_t &anetlist, const pstring &name, const solver_parameters_t *params, const std::size_t size)
- : matrix_solver_direct_t<m_N, storage_N>(anetlist, name, matrix_solver_t::ASCENDING, params, size)
- , m_use_iLU_preconditioning(true)
- , m_use_more_precise_stop_condition(false)
- , m_accuracy_mult(1.0)
- , mat(size)
- {
- }
- virtual ~matrix_solver_GMRES_t() override
+ template <typename FT, int SIZE>
+ class matrix_solver_GMRES_t: public matrix_solver_direct_t<FT, SIZE>
{
- }
-
- virtual void vsetup(analog_net_t::list_t &nets) override;
- virtual unsigned vsolve_non_dynamic(const bool newton_raphson) override;
+ public:
-private:
+ using float_type = FT;
- //typedef typename mat_cr_t<storage_N>::type mattype;
- typedef typename mat_cr_t<storage_N>::index_type mattype;
-
- unsigned solve_ilu_gmres(nl_double (& RESTRICT x)[storage_N], const nl_double (& RESTRICT rhs)[storage_N], const unsigned restart_max, std::size_t mr, nl_double accuracy);
-
- std::vector<unsigned> m_term_cr[storage_N];
-
- bool m_use_iLU_preconditioning;
- bool m_use_more_precise_stop_condition;
- nl_double m_accuracy_mult; // FXIME: Save state
-
- mat_cr_t<storage_N> mat;
-
- nl_double m_LU[storage_N * storage_N];
+ /* Sort rows in ascending order. This should minimize fill-in and thus
+ * maximize the efficiency of the incomplete LUT.
+ * This is already preconditioning.
+ */
+ matrix_solver_GMRES_t(netlist_state_t &anetlist, const pstring &name, const solver_parameters_t *params, const std::size_t size)
+ : matrix_solver_direct_t<FT, SIZE>(anetlist, name, matrix_solver_t::PREFER_BAND_MATRIX, params, size)
+ //, m_ops(size, 2)
+ , m_ops(size, 4)
+ , m_gmres(size)
+ {
+ }
- nl_double m_c[storage_N + 1]; /* mr + 1 */
- nl_double m_g[storage_N + 1]; /* mr + 1 */
- nl_double m_ht[storage_N + 1][storage_N]; /* (mr + 1), mr */
- nl_double m_s[storage_N + 1]; /* mr + 1 */
- nl_double m_v[storage_N + 1][storage_N]; /*(mr + 1), n */
- nl_double m_y[storage_N + 1]; /* mr + 1 */
+ void vsetup(analog_net_t::list_t &nets) override;
+ unsigned vsolve_non_dynamic(const bool newton_raphson) override;
-};
+ private:
-// ----------------------------------------------------------------------------------------
-// matrix_solver - GMRES
-// ----------------------------------------------------------------------------------------
+ using mattype = typename plib::matrix_compressed_rows_t<FT, SIZE>::index_type;
-template <std::size_t m_N, std::size_t storage_N>
-void matrix_solver_GMRES_t<m_N, storage_N>::vsetup(analog_net_t::list_t &nets)
-{
- matrix_solver_direct_t<m_N, storage_N>::vsetup(nets);
+ plib::mat_precondition_ILU<FT, SIZE> m_ops;
+ plib::gmres_t<FT, SIZE> m_gmres;
+ };
- mattype nz = 0;
- const std::size_t iN = this->N();
+ // ----------------------------------------------------------------------------------------
+ // matrix_solver - GMRES
+ // ----------------------------------------------------------------------------------------
- for (std::size_t k=0; k<iN; k++)
+ template <typename FT, int SIZE>
+ void matrix_solver_GMRES_t<FT, SIZE>::vsetup(analog_net_t::list_t &nets)
{
- terms_for_net_t * RESTRICT row = this->m_terms[k].get();
- mat.ia[k] = nz;
+ matrix_solver_direct_t<FT, SIZE>::vsetup(nets);
- for (std::size_t j=0; j<row->m_nz.size(); j++)
- {
- mat.ja[nz] = static_cast<mattype>(row->m_nz[j]);
- if (row->m_nz[j] == k)
- mat.diag[k] = nz;
- nz++;
- }
+ const std::size_t iN = this->size();
- /* build pointers into the compressed row format matrix for each terminal */
+ std::vector<std::vector<unsigned>> fill(iN);
- for (unsigned j=0; j< this->m_terms[k]->m_railstart;j++)
+ for (std::size_t k=0; k<iN; k++)
{
- for (unsigned i = mat.ia[k]; i<nz; i++)
- if (this->m_terms[k]->connected_net_idx()[j] == static_cast<int>(mat.ja[i]))
- {
- m_term_cr[k].push_back(i);
- break;
- }
- nl_assert(m_term_cr[k].size() == this->m_terms[k]->m_railstart);
- }
- }
-
- mat.ia[iN] = nz;
- mat.nz_num = nz;
-}
-
-template <std::size_t m_N, std::size_t storage_N>
-unsigned matrix_solver_GMRES_t<m_N, storage_N>::vsolve_non_dynamic(const bool newton_raphson)
-{
- const std::size_t iN = this->N();
-
- /* ideally, we could get an estimate for the spectral radius of
- * Inv(D - L) * U
- *
- * and estimate using
- *
- * omega = 2.0 / (1.0 + std::sqrt(1-rho))
- */
-
- //nz_num = 0;
- nl_double RHS[storage_N];
- nl_double new_V[storage_N];
-
- mat.set_scalar(0.0);
-
- for (std::size_t k = 0; k < iN; k++)
- {
- nl_double gtot_t = 0.0;
- nl_double RHS_t = 0.0;
-
- const std::size_t term_count = this->m_terms[k]->count();
- const std::size_t railstart = this->m_terms[k]->m_railstart;
- const nl_double * const RESTRICT gt = this->m_terms[k]->gt();
- const nl_double * const RESTRICT go = this->m_terms[k]->go();
- const nl_double * const RESTRICT Idr = this->m_terms[k]->Idr();
- const nl_double * const * RESTRICT other_cur_analog = this->m_terms[k]->connected_net_V();
-
- for (std::size_t i = 0; i < term_count; i++)
- {
- gtot_t = gtot_t + gt[i];
- RHS_t = RHS_t + Idr[i];
+ fill[k].resize(iN, decltype(m_ops.m_mat)::FILL_INFINITY);
+ terms_for_net_t * row = this->m_terms[k].get();
+ for (const auto &nz_j : row->m_nz)
+ {
+ fill[k][static_cast<mattype>(nz_j)] = 0;
+ }
}
- for (std::size_t i = railstart; i < term_count; i++)
- RHS_t = RHS_t + go[i] * *other_cur_analog[i];
+ m_ops.build(fill);
- RHS[k] = RHS_t;
-
- // add diagonal element
- mat.A[mat.diag[k]] = gtot_t;
+ /* build pointers into the compressed row format matrix for each terminal */
- for (std::size_t i = 0; i < railstart; i++)
+ for (std::size_t k=0; k<iN; k++)
{
- const std::size_t pi = m_term_cr[k][i];
- mat.A[pi] -= go[i];
+ std::size_t cnt = 0;
+ for (std::size_t j=0; j< this->m_terms[k]->m_railstart;j++)
+ {
+ for (std::size_t i = m_ops.m_mat.row_idx[k]; i<m_ops.m_mat.row_idx[k+1]; i++)
+ if (this->m_terms[k]->m_connected_net_idx[j] == static_cast<int>(m_ops.m_mat.col_idx[i]))
+ {
+ this->m_mat_ptr[k][j] = &m_ops.m_mat.A[i];
+ cnt++;
+ break;
+ }
+ }
+ nl_assert(cnt == this->m_terms[k]->m_railstart);
+ this->m_mat_ptr[k][this->m_terms[k]->m_railstart] = &m_ops.m_mat.A[m_ops.m_mat.diag[k]];
}
-
- new_V[k] = this->m_nets[k]->Q_Analog();
-
}
- mat.ia[iN] = static_cast<mattype>(mat.nz_num);
-
- const nl_double accuracy = this->m_params.m_accuracy;
-
- unsigned mr = iN;
- if (iN > 3 )
- mr = static_cast<unsigned>(std::sqrt(iN) * 2.0);
- unsigned iter = std::max(1u, this->m_params.m_gs_loops);
- unsigned gsl = solve_ilu_gmres(new_V, RHS, iter, mr, accuracy);
- unsigned failed = mr * iter;
- this->m_iterative_total += gsl;
- this->m_stat_calculations++;
-
- if (gsl>=failed)
- {
- this->m_iterative_fail++;
- return matrix_solver_direct_t<m_N, storage_N>::vsolve_non_dynamic(newton_raphson);
- }
-
- const nl_double err = (newton_raphson ? this->delta(new_V) : 0.0);
- this->store(new_V);
- return (err > this->m_params.m_accuracy) ? 2 : 1;
-}
-
-template <typename T>
-inline static void givens_mult( const T c, const T s, T & g0, T & g1 )
-{
- const T tg0 = c * g0 - s * g1;
- const T tg1 = s * g0 + c * g1;
-
- g0 = tg0;
- g1 = tg1;
-}
-
-template <std::size_t m_N, std::size_t storage_N>
-unsigned matrix_solver_GMRES_t<m_N, storage_N>::solve_ilu_gmres (nl_double (& RESTRICT x)[storage_N], const nl_double (& RESTRICT rhs)[storage_N], const unsigned restart_max, std::size_t mr, nl_double accuracy)
-{
- /*-------------------------------------------------------------------------
- * The code below was inspired by code published by John Burkardt under
- * the LPGL here:
- *
- * http://people.sc.fsu.edu/~jburkardt/cpp_src/mgmres/mgmres.html
- *
- * The code below was completely written from scratch based on the pseudo code
- * found here:
- *
- * http://de.wikipedia.org/wiki/GMRES-Verfahren
- *
- * The Algorithm itself is described in
- *
- * Yousef Saad,
- * Iterative Methods for Sparse Linear Systems,
- * Second Edition,
- * SIAM, 20003,
- * ISBN: 0898715342,
- * LC: QA188.S17.
- *
- *------------------------------------------------------------------------*/
-
- unsigned itr_used = 0;
- double rho_delta = 0.0;
-
- const std::size_t n = this->N();
-
- if (mr > n) mr = n;
-
- if (m_use_iLU_preconditioning)
- mat.incomplete_LU_factorization(m_LU);
-
- if (m_use_more_precise_stop_condition)
+ template <typename FT, int SIZE>
+ unsigned matrix_solver_GMRES_t<FT, SIZE>::vsolve_non_dynamic(const bool newton_raphson)
{
- /* derive residual for a given delta x
- *
- * LU y = A dx
- *
- * ==> rho / accuracy = sqrt(y * y)
- *
- * This approach will approximate the iterative stop condition
- * based |xnew - xold| pretty precisely. But it is slow, or expressed
- * differently: The invest doesn't pay off.
- * Therefore we use the approach in the else part.
- */
- nl_double t[storage_N];
- nl_double Ax[storage_N];
- vec_set(n, accuracy, t);
- mat.mult_vec(t, Ax);
-
- mat.solveLUx(m_LU, Ax);
-
- const nl_double rho_to_accuracy = std::sqrt(vec_mult2(n, Ax)) / accuracy;
-
- rho_delta = accuracy * rho_to_accuracy;
- }
- else
- rho_delta = accuracy * std::sqrt(n) * m_accuracy_mult;
-
- for (unsigned itr = 0; itr < restart_max; itr++)
- {
- std::size_t last_k = mr;
- nl_double rho;
-
- nl_double Ax[storage_N];
- nl_double residual[storage_N];
-
- mat.mult_vec(x, Ax);
-
- vec_sub(n, rhs, Ax, residual);
-
- if (m_use_iLU_preconditioning)
- {
- mat.solveLUx(m_LU, residual);
- }
-
- rho = std::sqrt(vec_mult2(n, residual));
+ const std::size_t iN = this->size();
- if (rho < rho_delta)
- return itr_used + 1;
+ plib::parray<FT, SIZE> RHS(iN);
+ //float_type new_V[storage_N];
- vec_set(mr+1, NL_FCONST(0.0), m_g);
- m_g[0] = rho;
+ m_ops.m_mat.set_scalar(0.0);
- for (std::size_t i = 0; i < mr; i++)
- vec_set(mr + 1, NL_FCONST(0.0), m_ht[i]);
+ /* populate matrix and V for first estimate */
+ this->fill_matrix(iN, this->m_mat_ptr, RHS);
- vec_mult_scalar(n, residual, NL_FCONST(1.0) / rho, m_v[0]);
-
- for (std::size_t k = 0; k < mr; k++)
+ for (std::size_t k = 0; k < iN; k++)
{
- const std::size_t k1 = k + 1;
-
- mat.mult_vec(m_v[k], m_v[k1]);
-
- if (m_use_iLU_preconditioning)
- mat.solveLUx(m_LU, m_v[k1]);
-
- for (std::size_t j = 0; j <= k; j++)
- {
- m_ht[j][k] = vec_mult(n, m_v[k1], m_v[j]);
- vec_add_mult_scalar(n, m_v[j], -m_ht[j][k], m_v[k1]);
- }
- m_ht[k1][k] = std::sqrt(vec_mult2(n, m_v[k1]));
-
- if (m_ht[k1][k] != 0.0)
- vec_scale(n, m_v[k1], NL_FCONST(1.0) / m_ht[k1][k]);
-
- for (std::size_t j = 0; j < k; j++)
- givens_mult(m_c[j], m_s[j], m_ht[j][k], m_ht[j+1][k]);
-
- const nl_double mu = 1.0 / std::hypot(m_ht[k][k], m_ht[k1][k]);
-
- m_c[k] = m_ht[k][k] * mu;
- m_s[k] = -m_ht[k1][k] * mu;
- m_ht[k][k] = m_c[k] * m_ht[k][k] - m_s[k] * m_ht[k1][k];
- m_ht[k1][k] = 0.0;
-
- givens_mult(m_c[k], m_s[k], m_g[k], m_g[k1]);
-
- rho = std::abs(m_g[k1]);
-
- itr_used = itr_used + 1;
-
- if (rho <= rho_delta)
- {
- last_k = k;
- break;
- }
+ this->m_new_V[k] = this->m_nets[k]->Q_Analog();
}
- if (last_k >= mr)
- /* didn't converge within accuracy */
- last_k = mr - 1;
+ const float_type accuracy = this->m_params.m_accuracy;
- /* Solve the system H * y = g */
- /* x += m_v[j] * m_y[j] */
- for (std::size_t i = last_k + 1; i-- > 0;)
- {
- double tmp = m_g[i];
- for (std::size_t j = i + 1; j <= last_k; j++)
- {
- tmp -= m_ht[i][j] * m_y[j];
- }
- m_y[i] = tmp / m_ht[i][i];
- }
-
- for (std::size_t i = 0; i <= last_k; i++)
- vec_add_mult_scalar(n, m_v[i], m_y[i], x);
+ auto iter = std::max(plib::constants<std::size_t>::one(), this->m_params.m_gs_loops);
+ auto gsl = m_gmres.solve(m_ops, this->m_new_V, RHS, iter, accuracy);
-#if 1
- if (rho <= rho_delta)
- {
- break;
- }
-#else
- /* we try to approximate the x difference between to steps using m_v[last_k] */
+ this->m_iterative_total += gsl;
+ this->m_stat_calculations++;
- double xdelta = m_y[last_k] * vec_maxabs(n, m_v[last_k]);
- if (xdelta < accuracy)
+ if (gsl > iter)
{
- if (m_accuracy_mult < 16384.0)
- m_accuracy_mult = m_accuracy_mult * 2.0;
- break;
+ this->m_iterative_fail++;
+ return matrix_solver_direct_t<FT, SIZE>::vsolve_non_dynamic(newton_raphson);
}
- else
- m_accuracy_mult = m_accuracy_mult / 2.0;
-#endif
+ const float_type err = (newton_raphson ? this->delta(this->m_new_V) : 0.0);
+ this->store(this->m_new_V);
+ return (err > this->m_params.m_accuracy) ? 2 : 1;
}
- return itr_used;
-}
- } //namespace devices
+} // namespace devices
} // namespace netlist
#endif /* NLD_MS_GMRES_H_ */
diff --git a/src/lib/netlist/solver/nld_ms_sm.h b/src/lib/netlist/solver/nld_ms_sm.h
index ed95cd2dc03..d85ab0044f4 100644
--- a/src/lib/netlist/solver/nld_ms_sm.h
+++ b/src/lib/netlist/solver/nld_ms_sm.h
@@ -33,293 +33,275 @@
#ifndef NLD_MS_SM_H_
#define NLD_MS_SM_H_
-#include <algorithm>
-
-#include "nld_solver.h"
#include "nld_matrix_solver.h"
-#include "vector_base.h"
+#include "nld_solver.h"
+#include "plib/vector_ops.h"
+
+#include <algorithm>
namespace netlist
{
- namespace devices
- {
-//#define nl_ext_double _float128 // slow, very slow
-//#define nl_ext_double long double // slightly slower
-#define nl_ext_double nl_double
-
-template <std::size_t m_N, std::size_t storage_N>
-class matrix_solver_sm_t: public matrix_solver_t
+namespace devices
{
- friend class matrix_solver_t;
-
-public:
- matrix_solver_sm_t(netlist_t &anetlist, const pstring &name,
- const solver_parameters_t *params, const std::size_t size);
-
- virtual ~matrix_solver_sm_t() override;
-
- virtual void vsetup(analog_net_t::list_t &nets) override;
- virtual void reset() override { matrix_solver_t::reset(); }
-
-protected:
- virtual unsigned vsolve_non_dynamic(const bool newton_raphson) override;
- unsigned solve_non_dynamic(const bool newton_raphson);
-
- constexpr std::size_t N() const { return (m_N == 0) ? m_dim : m_N; }
-
- void LE_invert();
-
- template <typename T>
- void LE_compute_x(T * RESTRICT x);
+ template <typename FT, int SIZE>
+ class matrix_solver_sm_t: public matrix_solver_t
+ {
+ friend class matrix_solver_t;
+ public:
- template <typename T1, typename T2>
- nl_ext_double &A(const T1 &r, const T2 &c) { return m_A[r][c]; }
- template <typename T1, typename T2>
- nl_ext_double &W(const T1 &r, const T2 &c) { return m_W[r][c]; }
- template <typename T1, typename T2>
- nl_ext_double &Ainv(const T1 &r, const T2 &c) { return m_Ainv[r][c]; }
- template <typename T1>
- nl_ext_double &RHS(const T1 &r) { return m_RHS[r]; }
+ using float_ext_type = FT;
+ using float_type = FT;
+ // FIXME: dirty hack to make this compile
+ static constexpr const std::size_t storage_N = 100;
+ matrix_solver_sm_t(netlist_state_t &anetlist, const pstring &name,
+ const solver_parameters_t *params, const std::size_t size);
- template <typename T1, typename T2>
- nl_ext_double &lA(const T1 &r, const T2 &c) { return m_lA[r][c]; }
- template <typename T1, typename T2>
- nl_ext_double &lAinv(const T1 &r, const T2 &c) { return m_lAinv[r][c]; }
+ void vsetup(analog_net_t::list_t &nets) override;
+ void reset() override { matrix_solver_t::reset(); }
- nl_double m_last_RHS[storage_N]; // right hand side - contains currents
+ protected:
+ unsigned vsolve_non_dynamic(const bool newton_raphson) override;
+ unsigned solve_non_dynamic(const bool newton_raphson);
-private:
- static constexpr std::size_t m_pitch = ((( storage_N) + 7) / 8) * 8;
- nl_ext_double m_A[storage_N][m_pitch];
- nl_ext_double m_Ainv[storage_N][m_pitch];
- nl_ext_double m_W[storage_N][m_pitch];
- nl_ext_double m_RHS[storage_N]; // right hand side - contains currents
+ constexpr std::size_t size() const { return m_dim; }
- nl_ext_double m_lA[storage_N][m_pitch];
- nl_ext_double m_lAinv[storage_N][m_pitch];
+ void LE_invert();
- //nl_ext_double m_RHSx[storage_N];
+ template <typename T>
+ void LE_compute_x(T * x);
- const std::size_t m_dim;
- std::size_t m_cnt;
-};
+ template <typename T1, typename T2>
+ float_ext_type &A(const T1 &r, const T2 &c) { return m_A[r][c]; }
+ template <typename T1, typename T2>
+ float_ext_type &W(const T1 &r, const T2 &c) { return m_W[r][c]; }
+ template <typename T1, typename T2>
+ float_ext_type &Ainv(const T1 &r, const T2 &c) { return m_Ainv[r][c]; }
+ template <typename T1>
+ float_ext_type &RHS(const T1 &r) { return m_RHS[r]; }
-// ----------------------------------------------------------------------------------------
-// matrix_solver_direct
-// ----------------------------------------------------------------------------------------
-template <std::size_t m_N, std::size_t storage_N>
-matrix_solver_sm_t<m_N, storage_N>::~matrix_solver_sm_t()
-{
-}
+ template <typename T1, typename T2>
+ float_ext_type &lA(const T1 &r, const T2 &c) { return m_lA[r][c]; }
+ template <typename T1, typename T2>
+ float_ext_type &lAinv(const T1 &r, const T2 &c) { return m_lAinv[r][c]; }
-template <std::size_t m_N, std::size_t storage_N>
-void matrix_solver_sm_t<m_N, storage_N>::vsetup(analog_net_t::list_t &nets)
-{
- matrix_solver_t::setup_base(nets);
+ private:
+ static constexpr std::size_t m_pitch = ((( storage_N) + 7) / 8) * 8;
+ float_ext_type m_A[storage_N][m_pitch];
+ float_ext_type m_Ainv[storage_N][m_pitch];
+ float_ext_type m_W[storage_N][m_pitch];
+ float_ext_type m_RHS[storage_N]; // right hand side - contains currents
- netlist().save(*this, m_last_RHS, "m_last_RHS");
+ float_ext_type m_lA[storage_N][m_pitch];
+ float_ext_type m_lAinv[storage_N][m_pitch];
- for (unsigned k = 0; k < N(); k++)
- netlist().save(*this, RHS(k), plib::pfmt("RHS.{1}")(k));
-}
+ //float_ext_type m_RHSx[storage_N];
+ const std::size_t m_dim;
+ std::size_t m_cnt;
+ };
-template <std::size_t m_N, std::size_t storage_N>
-void matrix_solver_sm_t<m_N, storage_N>::LE_invert()
-{
- const std::size_t kN = N();
+ // ----------------------------------------------------------------------------------------
+ // matrix_solver_direct
+ // ----------------------------------------------------------------------------------------
- for (std::size_t i = 0; i < kN; i++)
+ template <typename FT, int SIZE>
+ void matrix_solver_sm_t<FT, SIZE>::vsetup(analog_net_t::list_t &nets)
{
- for (std::size_t j = 0; j < kN; j++)
- {
- W(i,j) = lA(i,j) = A(i,j);
- Ainv(i,j) = 0.0;
- }
- Ainv(i,i) = 1.0;
+ matrix_solver_t::setup_base(nets);
+
+ /* FIXME: Shouldn't be necessary */
+ for (std::size_t k = 0; k < size(); k++)
+ state().save(*this, RHS(k), this->name(), plib::pfmt("RHS.{1}")(k));
}
- /* down */
- for (std::size_t i = 0; i < kN; i++)
- {
- /* FIXME: Singular matrix? */
- const nl_double f = 1.0 / W(i,i);
- const auto * RESTRICT const p = m_terms[i]->m_nzrd.data();
- const std::size_t e = m_terms[i]->m_nzrd.size();
- /* Eliminate column i from row j */
+ template <typename FT, int SIZE>
+ void matrix_solver_sm_t<FT, SIZE>::LE_invert()
+ {
+ const std::size_t kN = size();
- const auto * RESTRICT const pb = m_terms[i]->m_nzbd.data();
- const std::size_t eb = m_terms[i]->m_nzbd.size();
- for (std::size_t jb = 0; jb < eb; jb++)
+ for (std::size_t i = 0; i < kN; i++)
{
- const unsigned j = pb[jb];
- const nl_double f1 = - W(j,i) * f;
- if (f1 != 0.0)
+ for (std::size_t j = 0; j < kN; j++)
{
- for (std::size_t k = 0; k < e; k++)
- W(j,p[k]) += W(i,p[k]) * f1;
- for (std::size_t k = 0; k <= i; k ++)
- Ainv(j,k) += Ainv(i,k) * f1;
+ W(i,j) = lA(i,j) = A(i,j);
+ Ainv(i,j) = 0.0;
}
+ Ainv(i,i) = 1.0;
}
- }
- /* up */
- for (std::size_t i = kN; i-- > 0; )
- {
- /* FIXME: Singular matrix? */
- const nl_double f = 1.0 / W(i,i);
- for (std::size_t j = i; j-- > 0; )
+ /* down */
+ for (std::size_t i = 0; i < kN; i++)
{
- const nl_double f1 = - W(j,i) * f;
- if (f1 != 0.0)
+ /* FIXME: Singular matrix? */
+ const float_type f = 1.0 / W(i,i);
+ const auto * const p = m_terms[i]->m_nzrd.data();
+ const std::size_t e = m_terms[i]->m_nzrd.size();
+
+ /* Eliminate column i from row j */
+
+ const auto * const pb = m_terms[i]->m_nzbd.data();
+ const std::size_t eb = m_terms[i]->m_nzbd.size();
+ for (std::size_t jb = 0; jb < eb; jb++)
{
- for (std::size_t k = i; k < kN; k++)
- W(j,k) += W(i,k) * f1;
- for (std::size_t k = 0; k < kN; k++)
- Ainv(j,k) += Ainv(i,k) * f1;
+ const unsigned j = pb[jb];
+ const float_type f1 = - W(j,i) * f;
+ if (f1 != 0.0)
+ {
+ for (std::size_t k = 0; k < e; k++)
+ W(j,p[k]) += W(i,p[k]) * f1;
+ for (std::size_t k = 0; k <= i; k ++)
+ Ainv(j,k) += Ainv(i,k) * f1;
+ }
}
}
- for (std::size_t k = 0; k < kN; k++)
+ /* up */
+ for (std::size_t i = kN; i-- > 0; )
{
- Ainv(i,k) *= f;
- lAinv(i,k) = Ainv(i,k);
+ /* FIXME: Singular matrix? */
+ const float_type f = 1.0 / W(i,i);
+ for (std::size_t j = i; j-- > 0; )
+ {
+ const float_type f1 = - W(j,i) * f;
+ if (f1 != 0.0)
+ {
+ for (std::size_t k = i; k < kN; k++)
+ W(j,k) += W(i,k) * f1;
+ for (std::size_t k = 0; k < kN; k++)
+ Ainv(j,k) += Ainv(i,k) * f1;
+ }
+ }
+ for (std::size_t k = 0; k < kN; k++)
+ {
+ Ainv(i,k) *= f;
+ lAinv(i,k) = Ainv(i,k);
+ }
}
}
-}
-
-template <std::size_t m_N, std::size_t storage_N>
-template <typename T>
-void matrix_solver_sm_t<m_N, storage_N>::LE_compute_x(
- T * RESTRICT x)
-{
- const std::size_t kN = N();
- for (std::size_t i=0; i<kN; i++)
- x[i] = 0.0;
-
- for (std::size_t k=0; k<kN; k++)
+ template <typename FT, int SIZE>
+ template <typename T>
+ void matrix_solver_sm_t<FT, SIZE>::LE_compute_x(
+ T * x)
{
- const nl_double f = RHS(k);
+ const std::size_t kN = size();
for (std::size_t i=0; i<kN; i++)
- x[i] += Ainv(i,k) * f;
- }
-}
-
-
-template <std::size_t m_N, std::size_t storage_N>
-unsigned matrix_solver_sm_t<m_N, storage_N>::solve_non_dynamic(const bool newton_raphson)
-{
- static constexpr const bool incremental = true;
- const std::size_t iN = N();
+ x[i] = 0.0;
- nl_double new_V[storage_N]; // = { 0.0 };
+ for (std::size_t k=0; k<kN; k++)
+ {
+ const float_type f = RHS(k);
- if ((m_cnt % 50) == 0)
- {
- /* complete calculation */
- this->LE_invert();
+ for (std::size_t i=0; i<kN; i++)
+ x[i] += Ainv(i,k) * f;
+ }
}
- else
+
+ template <typename FT, int SIZE>
+ unsigned matrix_solver_sm_t<FT, SIZE>::solve_non_dynamic(const bool newton_raphson)
{
- if (!incremental)
+ static constexpr const bool incremental = true;
+ const std::size_t iN = size();
+
+ float_type new_V[storage_N]; // = { 0.0 };
+
+ if ((m_cnt % 50) == 0)
{
- for (std::size_t row = 0; row < iN; row ++)
- for (std::size_t k = 0; k < iN; k++)
- Ainv(row,k) = lAinv(row, k);
+ /* complete calculation */
+ this->LE_invert();
}
- for (std::size_t row = 0; row < iN; row ++)
+ else
{
- nl_double v[m_pitch] = {0};
- std::size_t cols[m_pitch];
- std::size_t colcount = 0;
-
- auto &nz = m_terms[row]->m_nz;
- for (unsigned & col : nz)
+ if (!incremental)
{
- v[col] = A(row,col) - lA(row,col);
- if (incremental)
- lA(row,col) = A(row,col);
- if (v[col] != 0.0)
- cols[colcount++] = col;
+ for (std::size_t row = 0; row < iN; row ++)
+ for (std::size_t k = 0; k < iN; k++)
+ Ainv(row,k) = lAinv(row, k);
}
-
- if (colcount > 0)
+ for (std::size_t row = 0; row < iN; row ++)
{
- nl_double lamba = 0.0;
- nl_double w[m_pitch] = {0};
-
- nl_double z[m_pitch];
- /* compute w and lamba */
- for (std::size_t i = 0; i < iN; i++)
- z[i] = Ainv(i, row); /* u is row'th column */
+ float_type v[m_pitch] = {0};
+ std::size_t cols[m_pitch];
+ std::size_t colcount = 0;
- for (std::size_t j = 0; j < colcount; j++)
- lamba += v[cols[j]] * z[cols[j]];
-
- for (std::size_t j=0; j<colcount; j++)
+ auto &nz = m_terms[row]->m_nz;
+ for (unsigned & col : nz)
{
- std::size_t col = cols[j];
- nl_double f = v[col];
- for (std::size_t k = 0; k < iN; k++)
- w[k] += Ainv(col,k) * f; /* Transpose(Ainv) * v */
+ v[col] = A(row,col) - lA(row,col);
+ if (incremental)
+ lA(row,col) = A(row,col);
+ if (v[col] != 0.0)
+ cols[colcount++] = col;
}
- lamba = -1.0 / (1.0 + lamba);
- for (std::size_t i=0; i<iN; i++)
+ if (colcount > 0)
{
- const nl_double f = lamba * z[i];
- if (f != 0.0)
+ float_type lamba = 0.0;
+ float_type w[m_pitch] = {0};
+
+ float_type z[m_pitch];
+ /* compute w and lamba */
+ for (std::size_t i = 0; i < iN; i++)
+ z[i] = Ainv(i, row); /* u is row'th column */
+
+ for (std::size_t j = 0; j < colcount; j++)
+ lamba += v[cols[j]] * z[cols[j]];
+
+ for (std::size_t j=0; j<colcount; j++)
+ {
+ std::size_t col = cols[j];
+ float_type f = v[col];
for (std::size_t k = 0; k < iN; k++)
- Ainv(i,k) += f * w[k];
+ w[k] += Ainv(col,k) * f; /* Transpose(Ainv) * v */
+ }
+
+ lamba = -1.0 / (1.0 + lamba);
+ for (std::size_t i=0; i<iN; i++)
+ {
+ const float_type f = lamba * z[i];
+ if (f != 0.0)
+ for (std::size_t k = 0; k < iN; k++)
+ Ainv(i,k) += f * w[k];
+ }
}
- }
+ }
}
- }
- m_cnt++;
+ m_cnt++;
- this->LE_compute_x(new_V);
+ this->LE_compute_x(new_V);
- const nl_double err = (newton_raphson ? delta(new_V) : 0.0);
- store(new_V);
- return (err > this->m_params.m_accuracy) ? 2 : 1;
-}
+ const float_type err = (newton_raphson ? delta(new_V) : 0.0);
+ store(new_V);
+ return (err > this->m_params.m_accuracy) ? 2 : 1;
+ }
-template <std::size_t m_N, std::size_t storage_N>
-inline unsigned matrix_solver_sm_t<m_N, storage_N>::vsolve_non_dynamic(const bool newton_raphson)
-{
- build_LE_A<matrix_solver_sm_t>();
- build_LE_RHS<matrix_solver_sm_t>();
-
- for (std::size_t i=0, iN=N(); i < iN; i++)
- m_last_RHS[i] = RHS(i);
-
- this->m_stat_calculations++;
- return this->solve_non_dynamic(newton_raphson);
-}
-
-template <std::size_t m_N, std::size_t storage_N>
-matrix_solver_sm_t<m_N, storage_N>::matrix_solver_sm_t(netlist_t &anetlist, const pstring &name,
- const solver_parameters_t *params, const std::size_t size)
-: matrix_solver_t(anetlist, name, NOSORT, params)
-, m_dim(size)
-, m_cnt(0)
-{
- for (std::size_t k = 0; k < N(); k++)
+ template <typename FT, int SIZE>
+ unsigned matrix_solver_sm_t<FT, SIZE>::vsolve_non_dynamic(const bool newton_raphson)
+ {
+ this->build_LE_A(*this);
+ this->build_LE_RHS(*this);
+
+ this->m_stat_calculations++;
+ return this->solve_non_dynamic(newton_raphson);
+ }
+
+ template <typename FT, int SIZE>
+ matrix_solver_sm_t<FT, SIZE>::matrix_solver_sm_t(netlist_state_t &anetlist, const pstring &name,
+ const solver_parameters_t *params, const std::size_t size)
+ : matrix_solver_t(anetlist, name, NOSORT, params)
+ , m_dim(size)
+ , m_cnt(0)
{
- m_last_RHS[k] = 0.0;
}
-}
- } //namespace devices
+} // namespace devices
} // namespace netlist
#endif /* NLD_MS_DIRECT_H_ */
diff --git a/src/lib/netlist/solver/nld_ms_sor.h b/src/lib/netlist/solver/nld_ms_sor.h
index eea692d6c47..c31aaa6d46a 100644
--- a/src/lib/netlist/solver/nld_ms_sor.h
+++ b/src/lib/netlist/solver/nld_ms_sor.h
@@ -12,33 +12,42 @@
#ifndef NLD_MS_SOR_H_
#define NLD_MS_SOR_H_
-#include <algorithm>
-
#include "nld_ms_direct.h"
#include "nld_solver.h"
+#include <algorithm>
+
namespace netlist
{
namespace devices
- {
-template <std::size_t m_N, std::size_t storage_N>
-class matrix_solver_SOR_t: public matrix_solver_direct_t<m_N, storage_N>
+{
+
+template <typename FT, int SIZE>
+class matrix_solver_SOR_t: public matrix_solver_direct_t<FT, SIZE>
{
public:
- matrix_solver_SOR_t(netlist_t &anetlist, const pstring &name, const solver_parameters_t *params, const std::size_t size)
- : matrix_solver_direct_t<m_N, storage_N>(anetlist, name, matrix_solver_t::ASCENDING, params, size)
+ using float_type = FT;
+
+ matrix_solver_SOR_t(netlist_state_t &anetlist, const pstring &name, const solver_parameters_t *params, const std::size_t size)
+ : matrix_solver_direct_t<FT, SIZE>(anetlist, name, matrix_solver_t::ASCENDING, params, size)
, m_lp_fact(*this, "m_lp_fact", 0)
+ , w(size, 0.0)
+ , one_m_w(size, 0.0)
+ , RHS(size, 0.0)
+ //, new_V(size, 0.0)
{
}
- virtual ~matrix_solver_SOR_t() override {}
-
- virtual void vsetup(analog_net_t::list_t &nets) override;
- virtual unsigned vsolve_non_dynamic(const bool newton_raphson) override;
+ void vsetup(analog_net_t::list_t &nets) override;
+ unsigned vsolve_non_dynamic(const bool newton_raphson) override;
private:
- state_var<nl_double> m_lp_fact;
+ state_var<float_type> m_lp_fact;
+ std::vector<float_type> w;
+ std::vector<float_type> one_m_w;
+ std::vector<float_type> RHS;
+ //std::vector<float_type> new_V;
};
// ----------------------------------------------------------------------------------------
@@ -46,16 +55,16 @@ private:
// ----------------------------------------------------------------------------------------
-template <std::size_t m_N, std::size_t storage_N>
-void matrix_solver_SOR_t<m_N, storage_N>::vsetup(analog_net_t::list_t &nets)
+template <typename FT, int SIZE>
+void matrix_solver_SOR_t<FT, SIZE>::vsetup(analog_net_t::list_t &nets)
{
- matrix_solver_direct_t<m_N, storage_N>::vsetup(nets);
+ matrix_solver_direct_t<FT, SIZE>::vsetup(nets);
}
-template <std::size_t m_N, std::size_t storage_N>
-unsigned matrix_solver_SOR_t<m_N, storage_N>::vsolve_non_dynamic(const bool newton_raphson)
+template <typename FT, int SIZE>
+unsigned matrix_solver_SOR_t<FT, SIZE>::vsolve_non_dynamic(const bool newton_raphson)
{
- const std::size_t iN = this->N();
+ const std::size_t iN = this->size();
bool resched = false;
unsigned resched_cnt = 0;
@@ -67,26 +76,21 @@ unsigned matrix_solver_SOR_t<m_N, storage_N>::vsolve_non_dynamic(const bool newt
* omega = 2.0 / (1.0 + std::sqrt(1-rho))
*/
- const nl_double ws = this->m_params.m_gs_sor;
-
- nl_double w[storage_N];
- nl_double one_m_w[storage_N];
- nl_double RHS[storage_N];
- nl_double new_V[storage_N];
+ const float_type ws = this->m_params.m_gs_sor;
for (std::size_t k = 0; k < iN; k++)
{
- nl_double gtot_t = 0.0;
- nl_double gabs_t = 0.0;
- nl_double RHS_t = 0.0;
+ float_type gtot_t = 0.0;
+ float_type gabs_t = 0.0;
+ float_type RHS_t = 0.0;
const std::size_t term_count = this->m_terms[k]->count();
- const nl_double * const RESTRICT gt = this->m_terms[k]->gt();
- const nl_double * const RESTRICT go = this->m_terms[k]->go();
- const nl_double * const RESTRICT Idr = this->m_terms[k]->Idr();
- const nl_double * const *other_cur_analog = this->m_terms[k]->connected_net_V();
+ const float_type * const gt = this->m_gtn[k];
+ const float_type * const go = this->m_gonn[k];
+ const float_type * const Idr = this->m_Idrn[k];
+ auto other_cur_analog = this->m_connected_net_Vn[k];
- new_V[k] = this->m_nets[k]->Q_Analog();
+ this->m_new_V[k] = this->m_nets[k]->Q_Analog();
for (std::size_t i = 0; i < term_count; i++)
{
@@ -95,61 +99,60 @@ unsigned matrix_solver_SOR_t<m_N, storage_N>::vsolve_non_dynamic(const bool newt
}
for (std::size_t i = this->m_terms[k]->m_railstart; i < term_count; i++)
- RHS_t = RHS_t + go[i] * *other_cur_analog[i];
+ RHS_t = RHS_t - go[i] * *other_cur_analog[i];
RHS[k] = RHS_t;
- if (USE_GABS)
+ if (this->m_params.m_use_gabs)
{
for (std::size_t i = 0; i < term_count; i++)
gabs_t = gabs_t + std::abs(go[i]);
- gabs_t *= NL_FCONST(0.5); // derived by try and error
+ gabs_t *= plib::constants<nl_double>::cast(0.5); // derived by try and error
if (gabs_t <= gtot_t)
{
w[k] = ws / gtot_t;
- one_m_w[k] = NL_FCONST(1.0) - ws;
+ one_m_w[k] = plib::constants<FT>::one() - ws;
}
else
{
- w[k] = NL_FCONST(1.0) / (gtot_t + gabs_t);
- one_m_w[k] = NL_FCONST(1.0) - NL_FCONST(1.0) * gtot_t / (gtot_t + gabs_t);
+ w[k] = plib::constants<FT>::one() / (gtot_t + gabs_t);
+ one_m_w[k] = plib::constants<FT>::one() - plib::constants<FT>::one() * gtot_t / (gtot_t + gabs_t);
}
}
else
{
w[k] = ws / gtot_t;
- one_m_w[k] = NL_FCONST(1.0) - ws;
+ one_m_w[k] = plib::constants<FT>::one() - ws;
}
}
- const nl_double accuracy = this->m_params.m_accuracy;
+ const float_type accuracy = this->m_params.m_accuracy;
do {
resched = false;
- nl_double err = 0;
+ float_type err = 0;
for (std::size_t k = 0; k < iN; k++)
{
- const int * RESTRICT net_other = this->m_terms[k]->connected_net_idx();
+ const int * net_other = this->m_terms[k]->m_connected_net_idx.data();
const std::size_t railstart = this->m_terms[k]->m_railstart;
- const nl_double * RESTRICT go = this->m_terms[k]->go();
+ const float_type * go = this->m_gonn[k];
- nl_double Idrive = 0.0;
+ float_type Idrive = 0.0;
for (std::size_t i = 0; i < railstart; i++)
- Idrive = Idrive + go[i] * new_V[net_other[i]];
+ Idrive = Idrive - go[i] * this->m_new_V[static_cast<std::size_t>(net_other[i])];
- const nl_double new_val = new_V[k] * one_m_w[k] + (Idrive + RHS[k]) * w[k];
+ const float_type new_val = this->m_new_V[k] * one_m_w[k] + (Idrive + RHS[k]) * w[k];
- err = std::max(std::abs(new_val - new_V[k]), err);
- new_V[k] = new_val;
+ err = std::max(std::abs(new_val - this->m_new_V[k]), err);
+ this->m_new_V[k] = new_val;
}
if (err > accuracy)
resched = true;
resched_cnt++;
- //} while (resched && (resched_cnt < this->m_params.m_gs_loops));
- } while (resched && ((resched_cnt < this->m_params.m_gs_loops)));
+ } while (resched && (resched_cnt < this->m_params.m_gs_loops));
this->m_iterative_total += resched_cnt;
this->m_stat_calculations++;
@@ -158,13 +161,12 @@ unsigned matrix_solver_SOR_t<m_N, storage_N>::vsolve_non_dynamic(const bool newt
{
// Fallback to direct solver ...
this->m_iterative_fail++;
- return matrix_solver_direct_t<m_N, storage_N>::vsolve_non_dynamic(newton_raphson);
+ return matrix_solver_direct_t<FT, SIZE>::vsolve_non_dynamic(newton_raphson);
}
- for (std::size_t k = 0; k < iN; k++)
- this->m_nets[k]->set_Q_Analog(new_V[k]);
-
- return resched_cnt;
+ const float_type err = (newton_raphson ? this->delta(this->m_new_V) : 0.0);
+ this->store(this->m_new_V);
+ return (err > this->m_params.m_accuracy) ? 2 : 1;
}
} //namespace devices
diff --git a/src/lib/netlist/solver/nld_ms_sor_mat.h b/src/lib/netlist/solver/nld_ms_sor_mat.h
index 50bcac1a52d..83e4870cf28 100644
--- a/src/lib/netlist/solver/nld_ms_sor_mat.h
+++ b/src/lib/netlist/solver/nld_ms_sor_mat.h
@@ -12,212 +12,220 @@
#ifndef NLD_MS_SOR_MAT_H_
#define NLD_MS_SOR_MAT_H_
-#include <algorithm>
-
-#include "nld_ms_direct.h"
#include "nld_matrix_solver.h"
+#include "nld_ms_direct.h"
#include "nld_solver.h"
+#include <algorithm>
+
namespace netlist
{
- namespace devices
- {
-template <std::size_t m_N, std::size_t storage_N>
-class matrix_solver_SOR_mat_t: public matrix_solver_direct_t<m_N, storage_N>
+namespace devices
{
- friend class matrix_solver_t;
-public:
+ template <typename FT, int SIZE>
+ class matrix_solver_SOR_mat_t: public matrix_solver_direct_t<FT, SIZE>
+ {
+ friend class matrix_solver_t;
- matrix_solver_SOR_mat_t(netlist_t &anetlist, const pstring &name, const solver_parameters_t *params, std::size_t size)
- : matrix_solver_direct_t<m_N, storage_N>(anetlist, name, matrix_solver_t::DESCENDING, params, size)
- , m_Vdelta(*this, "m_Vdelta", 0.0)
- , m_omega(*this, "m_omega", params->m_gs_sor)
- , m_lp_fact(*this, "m_lp_fact", 0)
- , m_gs_fail(*this, "m_gs_fail", 0)
- , m_gs_total(*this, "m_gs_total", 0)
- {
- }
+ public:
- virtual ~matrix_solver_SOR_mat_t() override {}
+ using float_type = FT;
- virtual void vsetup(analog_net_t::list_t &nets) override;
+ matrix_solver_SOR_mat_t(netlist_state_t &anetlist, const pstring &name, const solver_parameters_t *params, std::size_t size)
+ : matrix_solver_direct_t<FT, SIZE>(anetlist, name, matrix_solver_t::ASCENDING, params, size)
+ , m_Vdelta(*this, "m_Vdelta", std::vector<float_type>(size))
+ , m_omega(*this, "m_omega", params->m_gs_sor)
+ , m_lp_fact(*this, "m_lp_fact", 0)
+ {
+ }
- virtual unsigned vsolve_non_dynamic(const bool newton_raphson) override;
+ void vsetup(analog_net_t::list_t &nets) override;
-private:
- state_var<nl_double[storage_N]> m_Vdelta;
+ unsigned vsolve_non_dynamic(const bool newton_raphson) override;
- state_var<nl_double> m_omega;
- state_var<nl_double> m_lp_fact;
- state_var<int> m_gs_fail;
- state_var<int> m_gs_total;
-};
+ private:
+ //state_var<float_type[storage_N]> m_Vdelta;
+ state_var<std::vector<float_type>> m_Vdelta;
-// ----------------------------------------------------------------------------------------
-// matrix_solver - Gauss - Seidel
-// ----------------------------------------------------------------------------------------
+ state_var<float_type> m_omega;
+ state_var<float_type> m_lp_fact;
-template <std::size_t m_N, std::size_t storage_N>
-void matrix_solver_SOR_mat_t<m_N, storage_N>::vsetup(analog_net_t::list_t &nets)
-{
- matrix_solver_direct_t<m_N, storage_N>::vsetup(nets);
-}
+ };
-#if 0
-//FIXME: move to solve_base
-template <unsigned m_N, unsigned storage_N>
-nl_double matrix_solver_SOR_mat_t<m_N, storage_N>::vsolve()
-{
- /*
- * enable linear prediction on first newton pass
- */
+ // ----------------------------------------------------------------------------------------
+ // matrix_solver - Gauss - Seidel
+ // ----------------------------------------------------------------------------------------
- if (USE_LINEAR_PREDICTION)
- for (unsigned k = 0; k < this->N(); k++)
- {
- this->m_last_V[k] = this->m_nets[k]->m_cur_Analog;
- this->m_nets[k]->m_cur_Analog = this->m_nets[k]->m_cur_Analog + this->m_Vdelta[k] * this->current_timestep() * m_lp_fact;
- }
- else
- for (unsigned k = 0; k < this->N(); k++)
- {
- this->m_last_V[k] = this->m_nets[k]->m_cur_Analog;
- }
-
- this->solve_base(this);
-
- if (USE_LINEAR_PREDICTION)
+ template <typename FT, int SIZE>
+ void matrix_solver_SOR_mat_t<FT, SIZE>::vsetup(analog_net_t::list_t &nets)
{
- nl_double sq = 0;
- nl_double sqo = 0;
- const nl_double rez_cts = 1.0 / this->current_timestep();
- for (unsigned k = 0; k < this->N(); k++)
- {
- const analog_net_t *n = this->m_nets[k];
- const nl_double nv = (n->Q_Analog() - this->m_last_V[k]) * rez_cts ;
- sq += nv * nv;
- sqo += this->m_Vdelta[k] * this->m_Vdelta[k];
- this->m_Vdelta[k] = nv;
- }
-
- // FIXME: used to be 1e90, but this would not be compatible with float
- if (sqo > NL_FCONST(1e-20))
- m_lp_fact = std::min(std::sqrt(sq/sqo), (nl_double) 2.0);
- else
- m_lp_fact = NL_FCONST(0.0);
+ matrix_solver_direct_t<FT, SIZE>::vsetup(nets);
}
+ #if 0
+ //FIXME: move to solve_base
+ template <unsigned m_N, unsigned storage_N>
+ float_type matrix_solver_SOR_mat_t<m_N, storage_N>::vsolve()
+ {
+ /*
+ * enable linear prediction on first newton pass
+ */
+
+ if (this->m_params->use_linear_prediction)
+ for (unsigned k = 0; k < this->size(); k++)
+ {
+ this->m_last_V[k] = this->m_nets[k]->m_cur_Analog;
+ this->m_nets[k]->m_cur_Analog = this->m_nets[k]->m_cur_Analog + this->m_Vdelta[k] * this->current_timestep() * m_lp_fact;
+ }
+ else
+ for (unsigned k = 0; k < this->size(); k++)
+ {
+ this->m_last_V[k] = this->m_nets[k]->m_cur_Analog;
+ }
- return this->compute_next_timestep();
-}
-#endif
-
-template <std::size_t m_N, std::size_t storage_N>
-unsigned matrix_solver_SOR_mat_t<m_N, storage_N>::vsolve_non_dynamic(const bool newton_raphson)
-{
- /* The matrix based code looks a lot nicer but actually is 30% slower than
- * the optimized code which works directly on the data structures.
- * Need something like that for gaussian elimination as well.
- */
-
-
- nl_double new_v[storage_N] = { 0.0 };
- const std::size_t iN = this->N();
-
- matrix_solver_t::build_LE_A<matrix_solver_SOR_mat_t>();
- matrix_solver_t::build_LE_RHS<matrix_solver_SOR_mat_t>();
+ this->solve_base(this);
- bool resched = false;
+ if (this->m_params->use_linear_prediction)
+ {
+ float_type sq = 0;
+ float_type sqo = 0;
+ const float_type rez_cts = 1.0 / this->current_timestep();
+ for (unsigned k = 0; k < this->size(); k++)
+ {
+ const analog_net_t *n = this->m_nets[k];
+ const float_type nv = (n->Q_Analog() - this->m_last_V[k]) * rez_cts ;
+ sq += nv * nv;
+ sqo += this->m_Vdelta[k] * this->m_Vdelta[k];
+ this->m_Vdelta[k] = nv;
+ }
+
+ // FIXME: used to be 1e90, but this would not be compatible with float
+ if (sqo > NL_FCONST(1e-20))
+ m_lp_fact = std::min(std::sqrt(sq/sqo), (float_type) 2.0);
+ else
+ m_lp_fact = NL_FCONST(0.0);
+ }
- unsigned resched_cnt = 0;
+ return this->compute_next_timestep();
+ }
+ #endif
-#if 0
- static int ws_cnt = 0;
- ws_cnt++;
- if (1 && ws_cnt % 200 == 0)
+ template <typename FT, int SIZE>
+ unsigned matrix_solver_SOR_mat_t<FT, SIZE>::vsolve_non_dynamic(const bool newton_raphson)
{
- // update omega
- nl_double lambdaN = 0;
- nl_double lambda1 = 1e9;
- for (int k = 0; k < iN; k++)
- {
- #if 0
- nl_double akk = std::abs(this->m_A[k][k]);
- if ( akk > lambdaN)
- lambdaN = akk;
- if (akk < lambda1)
- lambda1 = akk;
- #else
- nl_double akk = std::abs(this->m_A[k][k]);
- nl_double s = 0.0;
- for (int i=0; i<iN; i++)
- s = s + std::abs(this->m_A[k][i]);
- akk = s / akk - 1.0;
- if ( akk > lambdaN)
- lambdaN = akk;
- if (akk < lambda1)
- lambda1 = akk;
- #endif
- }
- //printf("lambda: %f %f\n", lambda, 2.0 / (1.0 + 2 * sqrt(lambda)) );
+ /* The matrix based code looks a lot nicer but actually is 30% slower than
+ * the optimized code which works directly on the data structures.
+ * Need something like that for gaussian elimination as well.
+ */
- //ws = 2.0 / (2.0 - lambdaN - lambda1);
- m_omega = 2.0 / (2.0 - lambda1);
- //printf("%f %f %f\n", m_omega, lambda1, lambdaN);
- }
-#endif
- for (std::size_t k = 0; k < iN; k++)
- new_v[k] = this->m_nets[k]->Q_Analog();
+ const std::size_t iN = this->size();
- do {
- resched = false;
- nl_double cerr = 0.0;
+ this->build_LE_A(*this);
+ this->build_LE_RHS(*this);
- for (std::size_t k = 0; k < iN; k++)
- {
- nl_double Idrive = 0;
+ bool resched = false;
- const auto *p = this->m_terms[k]->m_nz.data();
- const std::size_t e = this->m_terms[k]->m_nz.size();
+ unsigned resched_cnt = 0;
- for (std::size_t i = 0; i < e; i++)
- Idrive = Idrive + this->A(k,p[i]) * new_v[p[i]];
- const nl_double delta = m_omega * (this->RHS(k) - Idrive) / this->A(k,k);
- cerr = std::max(cerr, std::abs(delta));
- new_v[k] += delta;
+ #if 0
+ static int ws_cnt = 0;
+ ws_cnt++;
+ if (1 && ws_cnt % 200 == 0)
+ {
+ // update omega
+ float_type lambdaN = 0;
+ float_type lambda1 = 1e9;
+ for (int k = 0; k < iN; k++)
+ {
+ #if 0
+ float_type akk = std::abs(this->m_A[k][k]);
+ if ( akk > lambdaN)
+ lambdaN = akk;
+ if (akk < lambda1)
+ lambda1 = akk;
+ #else
+ float_type akk = std::abs(this->m_A[k][k]);
+ float_type s = 0.0;
+ for (int i=0; i<iN; i++)
+ s = s + std::abs(this->m_A[k][i]);
+ akk = s / akk - 1.0;
+ if ( akk > lambdaN)
+ lambdaN = akk;
+ if (akk < lambda1)
+ lambda1 = akk;
+ #endif
+ }
+
+ //ws = 2.0 / (2.0 - lambdaN - lambda1);
+ m_omega = 2.0 / (2.0 - lambda1);
}
+ #endif
- if (cerr > this->m_params.m_accuracy)
+ for (std::size_t k = 0; k < iN; k++)
+ this->m_new_V[k] = this->m_nets[k]->Q_Analog();
+
+ do {
+ resched = false;
+ float_type cerr = 0.0;
+
+ for (std::size_t k = 0; k < iN; k++)
+ {
+ float_type Idrive = 0;
+
+ const auto *p = this->m_terms[k]->m_nz.data();
+ const std::size_t e = this->m_terms[k]->m_nz.size();
+
+ for (std::size_t i = 0; i < e; i++)
+ Idrive = Idrive + this->A(k,p[i]) * this->m_new_V[p[i]];
+
+ FT w = m_omega / this->A(k,k);
+ if (this->m_params.m_use_gabs)
+ {
+ FT gabs_t = 0.0;
+ for (std::size_t i = 0; i < e; i++)
+ if (p[i] != k)
+ gabs_t = gabs_t + std::abs(this->A(k,p[i]));
+
+ gabs_t *= plib::constants<FT>::one(); // derived by try and error
+ if (gabs_t > this->A(k,k))
+ {
+ w = plib::constants<FT>::one() / (this->A(k,k) + gabs_t);
+ }
+ }
+
+ const float_type delta = w * (this->RHS(k) - Idrive) ;
+ cerr = std::max(cerr, std::abs(delta));
+ this->m_new_V[k] += delta;
+ }
+
+ if (cerr > this->m_params.m_accuracy)
+ {
+ resched = true;
+ }
+ resched_cnt++;
+ } while (resched && (resched_cnt < this->m_params.m_gs_loops));
+
+ this->m_stat_calculations++;
+ this->m_iterative_total += resched_cnt;
+
+ if (resched)
{
- resched = true;
+ this->m_iterative_fail++;
+ //this->netlist().warning("Falling back to direct solver .. Consider increasing RESCHED_LOOPS");
+ return matrix_solver_direct_t<FT, SIZE>::solve_non_dynamic(newton_raphson);
}
- resched_cnt++;
- } while (resched && (resched_cnt < this->m_params.m_gs_loops));
-
- this->m_stat_calculations++;
- this->m_iterative_total += resched_cnt;
- this->m_gs_total += resched_cnt;
- if (resched)
- {
- this->m_iterative_fail++;
- //this->netlist().warning("Falling back to direct solver .. Consider increasing RESCHED_LOOPS");
- this->m_gs_fail++;
+ const float_type err = (newton_raphson ? this->delta(this->m_new_V) : 0.0);
+ this->store(this->m_new_V);
+ return (err > this->m_params.m_accuracy) ? 2 : 1;
- return matrix_solver_direct_t<m_N, storage_N>::solve_non_dynamic(newton_raphson);
- }
- else {
- this->store(new_v);
- return resched_cnt;
}
-}
-
- } //namespace devices
+} // namespace devices
} // namespace netlist
#endif /* NLD_MS_GAUSS_SEIDEL_H_ */
diff --git a/src/lib/netlist/solver/nld_ms_w.h b/src/lib/netlist/solver/nld_ms_w.h
index 0d4e7781eed..3372b50c7c5 100644
--- a/src/lib/netlist/solver/nld_ms_w.h
+++ b/src/lib/netlist/solver/nld_ms_w.h
@@ -40,80 +40,80 @@
#ifndef NLD_MS_W_H_
#define NLD_MS_W_H_
-#include <algorithm>
-
-#include "nld_solver.h"
#include "nld_matrix_solver.h"
-#include "vector_base.h"
+#include "nld_solver.h"
+#include "plib/vector_ops.h"
+
+#include <algorithm>
namespace netlist
{
namespace devices
{
-//#define nl_ext_double _float128 // slow, very slow
-//#define nl_ext_double long double // slightly slower
-#define nl_ext_double nl_double
-template <std::size_t m_N, std::size_t storage_N>
+template <typename FT, int SIZE>
class matrix_solver_w_t: public matrix_solver_t
{
friend class matrix_solver_t;
+
public:
+ using float_ext_type = FT;
+ using float_type = FT;
- matrix_solver_w_t(netlist_t &anetlist, const pstring &name, const solver_parameters_t *params, const std::size_t size);
+ // FIXME: dirty hack to make this compile
+ static constexpr const std::size_t storage_N = 100;
- virtual ~matrix_solver_w_t() override;
+ matrix_solver_w_t(netlist_state_t &anetlist, const pstring &name, const solver_parameters_t *params, const std::size_t size);
- virtual void vsetup(analog_net_t::list_t &nets) override;
- virtual void reset() override { matrix_solver_t::reset(); }
+ void vsetup(analog_net_t::list_t &nets) override;
+ void reset() override { matrix_solver_t::reset(); }
protected:
- virtual unsigned vsolve_non_dynamic(const bool newton_raphson) override;
+ unsigned vsolve_non_dynamic(const bool newton_raphson) override;
unsigned solve_non_dynamic(const bool newton_raphson);
- constexpr std::size_t N() const { return (m_N == 0) ? m_dim : m_N; }
+ constexpr std::size_t size() const { return m_dim; }
void LE_invert();
template <typename T>
- void LE_compute_x(T * RESTRICT x);
+ void LE_compute_x(T * x);
template <typename T1, typename T2>
- inline nl_ext_double &A(const T1 &r, const T2 &c) { return m_A[r][c]; }
+ float_ext_type &A(const T1 &r, const T2 &c) { return m_A[r][c]; }
template <typename T1, typename T2>
- inline nl_ext_double &W(const T1 &r, const T2 &c) { return m_W[r][c]; }
+ float_ext_type &W(const T1 &r, const T2 &c) { return m_W[r][c]; }
/* access to Ainv for fixed columns over row, there store transposed */
template <typename T1, typename T2>
- inline nl_ext_double &Ainv(const T1 &r, const T2 &c) { return m_Ainv[c][r]; }
+ float_ext_type &Ainv(const T1 &r, const T2 &c) { return m_Ainv[c][r]; }
template <typename T1>
- inline nl_ext_double &RHS(const T1 &r) { return m_RHS[r]; }
+ float_ext_type &RHS(const T1 &r) { return m_RHS[r]; }
template <typename T1, typename T2>
- inline nl_ext_double &lA(const T1 &r, const T2 &c) { return m_lA[r][c]; }
+ float_ext_type &lA(const T1 &r, const T2 &c) { return m_lA[r][c]; }
- nl_double m_last_RHS[storage_N]; // right hand side - contains currents
private:
static constexpr std::size_t m_pitch = ((( storage_N) + 7) / 8) * 8;
- nl_ext_double m_A[storage_N][m_pitch];
- nl_ext_double m_Ainv[storage_N][m_pitch];
- nl_ext_double m_W[storage_N][m_pitch];
- nl_ext_double m_RHS[storage_N]; // right hand side - contains currents
+ float_ext_type m_A[storage_N][m_pitch];
+ float_ext_type m_Ainv[storage_N][m_pitch];
+ float_ext_type m_W[storage_N][m_pitch];
+ float_ext_type m_RHS[storage_N]; // right hand side - contains currents
- nl_ext_double m_lA[storage_N][m_pitch];
+ float_ext_type m_lA[storage_N][m_pitch];
/* temporary */
- nl_double H[storage_N][m_pitch] ;
+ float_type H[storage_N][m_pitch] ;
unsigned rows[storage_N];
unsigned cols[storage_N][m_pitch];
unsigned colcount[storage_N];
unsigned m_cnt;
- //nl_ext_double m_RHSx[storage_N];
+ //float_ext_type m_RHSx[storage_N];
const std::size_t m_dim;
@@ -123,28 +123,22 @@ private:
// matrix_solver_direct
// ----------------------------------------------------------------------------------------
-template <std::size_t m_N, std::size_t storage_N>
-matrix_solver_w_t<m_N, storage_N>::~matrix_solver_w_t()
-{
-}
-
-template <std::size_t m_N, std::size_t storage_N>
-void matrix_solver_w_t<m_N, storage_N>::vsetup(analog_net_t::list_t &nets)
+template <typename FT, int SIZE>
+void matrix_solver_w_t<FT, SIZE>::vsetup(analog_net_t::list_t &nets)
{
matrix_solver_t::setup_base(nets);
- netlist().save(*this, m_last_RHS, "m_last_RHS");
-
- for (unsigned k = 0; k < N(); k++)
- netlist().save(*this, RHS(k), plib::pfmt("RHS.{1}")(k));
+ // FIXME: This shouldn't be necessary, recalculate on each entry ...
+ for (std::size_t k = 0; k < size(); k++)
+ state().save(*this, RHS(k), this->name(), plib::pfmt("RHS.{1}")(k));
}
-template <std::size_t m_N, std::size_t storage_N>
-void matrix_solver_w_t<m_N, storage_N>::LE_invert()
+template <typename FT, int SIZE>
+void matrix_solver_w_t<FT, SIZE>::LE_invert()
{
- const std::size_t kN = N();
+ const std::size_t kN = size();
for (std::size_t i = 0; i < kN; i++)
{
@@ -159,18 +153,18 @@ void matrix_solver_w_t<m_N, storage_N>::LE_invert()
for (std::size_t i = 0; i < kN; i++)
{
/* FIXME: Singular matrix? */
- const nl_double f = 1.0 / W(i,i);
- const auto * RESTRICT const p = m_terms[i]->m_nzrd.data();
+ const float_type f = 1.0 / W(i,i);
+ const auto * const p = m_terms[i]->m_nzrd.data();
const size_t e = m_terms[i]->m_nzrd.size();
/* Eliminate column i from row j */
- const auto * RESTRICT const pb = m_terms[i]->m_nzbd.data();
+ const auto * const pb = m_terms[i]->m_nzbd.data();
const size_t eb = m_terms[i]->m_nzbd.size();
for (std::size_t jb = 0; jb < eb; jb++)
{
const auto j = pb[jb];
- const nl_double f1 = - W(j,i) * f;
+ const float_type f1 = - W(j,i) * f;
if (f1 != 0.0)
{
for (std::size_t k = 0; k < e; k++)
@@ -184,10 +178,10 @@ void matrix_solver_w_t<m_N, storage_N>::LE_invert()
for (std::size_t i = kN; i-- > 0; )
{
/* FIXME: Singular matrix? */
- const nl_double f = 1.0 / W(i,i);
+ const float_type f = 1.0 / W(i,i);
for (std::size_t j = i; j-- > 0; )
{
- const nl_double f1 = - W(j,i) * f;
+ const float_type f1 = - W(j,i) * f;
if (f1 != 0.0)
{
for (std::size_t k = i; k < kN; k++)
@@ -203,19 +197,19 @@ void matrix_solver_w_t<m_N, storage_N>::LE_invert()
}
}
-template <std::size_t m_N, std::size_t storage_N>
+template <typename FT, int SIZE>
template <typename T>
-void matrix_solver_w_t<m_N, storage_N>::LE_compute_x(
- T * RESTRICT x)
+void matrix_solver_w_t<FT, SIZE>::LE_compute_x(
+ T * x)
{
- const std::size_t kN = N();
+ const std::size_t kN = size();
for (std::size_t i=0; i<kN; i++)
x[i] = 0.0;
for (std::size_t k=0; k<kN; k++)
{
- const nl_double f = RHS(k);
+ const float_type f = RHS(k);
for (std::size_t i=0; i<kN; i++)
x[i] += Ainv(i,k) * f;
@@ -223,14 +217,14 @@ void matrix_solver_w_t<m_N, storage_N>::LE_compute_x(
}
-template <std::size_t m_N, std::size_t storage_N>
-unsigned matrix_solver_w_t<m_N, storage_N>::solve_non_dynamic(const bool newton_raphson)
+template <typename FT, int SIZE>
+unsigned matrix_solver_w_t<FT, SIZE>::solve_non_dynamic(const bool newton_raphson)
{
- const auto iN = N();
+ const auto iN = size();
- nl_double new_V[storage_N]; // = { 0.0 };
+ float_type new_V[storage_N]; // = { 0.0 };
- if ((m_cnt % 100) == 0)
+ if ((m_cnt % 50) == 0)
{
/* complete calculation */
this->LE_invert();
@@ -266,7 +260,7 @@ unsigned matrix_solver_w_t<m_N, storage_N>::solve_non_dynamic(const bool newton_
/* construct w = transform(V) * y
* dim: rowcount x iN
* */
- nl_double w[storage_N];
+ float_type w[storage_N];
for (unsigned i = 0; i < rowcount; i++)
{
const unsigned r = rows[i];
@@ -287,7 +281,7 @@ unsigned matrix_solver_w_t<m_N, storage_N>::solve_non_dynamic(const bool newton_
for (unsigned k=0; k< colcount[i]; k++)
{
const unsigned col = cols[i][k];
- nl_double f = VT(rows[i],col);
+ float_type f = VT(rows[i],col);
if (f!=0.0)
for (unsigned j= 0; j < rowcount; j++)
H[i][j] += f * Ainv(col,rows[j]);
@@ -297,16 +291,16 @@ unsigned matrix_solver_w_t<m_N, storage_N>::solve_non_dynamic(const bool newton_
for (unsigned i = 0; i < rowcount; i++)
{
if (H[i][i] == 0.0)
- printf("%s H singular\n", this->name().c_str());
- const nl_double f = 1.0 / H[i][i];
+ plib::perrlogger("{} H singular\n", this->name());
+ const float_type f = 1.0 / H[i][i];
for (unsigned j = i+1; j < rowcount; j++)
{
- const nl_double f1 = - f * H[j][i];
+ const float_type f1 = - f * H[j][i];
if (f1!=0.0)
{
- nl_double *pj = &H[j][i+1];
- const nl_double *pi = &H[i][i+1];
+ float_type *pj = &H[j][i+1];
+ const float_type *pi = &H[i][i+1];
for (unsigned k = 0; k < rowcount-i-1; k++)
pj[k] += f1 * pi[k];
//H[j][k] += f1 * H[i][k];
@@ -316,12 +310,12 @@ unsigned matrix_solver_w_t<m_N, storage_N>::solve_non_dynamic(const bool newton_
}
/* Back substitution */
//inv(H) w = t w = H t
- nl_double t[storage_N]; // FIXME: convert to member
+ float_type t[storage_N]; // FIXME: convert to member
for (unsigned j = rowcount; j-- > 0; )
{
- nl_double tmp = 0;
- const nl_double *pj = &H[j][j+1];
- const nl_double *tj = &t[j+1];
+ float_type tmp = 0;
+ const float_type *pj = &H[j][j+1];
+ const float_type *tj = &t[j+1];
for (unsigned k = 0; k < rowcount-j-1; k++)
tmp += pj[k] * tj[k];
//tmp += H[j][k] * t[k];
@@ -331,7 +325,7 @@ unsigned matrix_solver_w_t<m_N, storage_N>::solve_non_dynamic(const bool newton_
/* x = y - Zt */
for (unsigned i=0; i<iN; i++)
{
- nl_double tmp = 0.0;
+ float_type tmp = 0.0;
for (unsigned j=0; j<rowcount;j++)
{
const unsigned row = rows[j];
@@ -343,47 +337,40 @@ unsigned matrix_solver_w_t<m_N, storage_N>::solve_non_dynamic(const bool newton_
}
m_cnt++;
- if (0)
+ if (false)
for (unsigned i=0; i<iN; i++)
{
- nl_double tmp = 0.0;
+ float_type tmp = 0.0;
for (unsigned j=0; j<iN; j++)
{
tmp += A(i,j) * new_V[j];
}
if (std::abs(tmp-RHS(i)) > 1e-6)
- printf("%s failed on row %d: %f RHS: %f\n", this->name().c_str(), i, std::abs(tmp-RHS(i)), RHS(i));
+ plib::perrlogger("{} failed on row {}: {} RHS: {}\n", this->name(), i, std::abs(tmp-RHS(i)), RHS(i));
}
- const nl_double err = (newton_raphson ? delta(new_V) : 0.0);
+ const float_type err = (newton_raphson ? delta(new_V) : 0.0);
store(new_V);
return (err > this->m_params.m_accuracy) ? 2 : 1;
}
-template <std::size_t m_N, std::size_t storage_N>
-inline unsigned matrix_solver_w_t<m_N, storage_N>::vsolve_non_dynamic(const bool newton_raphson)
+template <typename FT, int SIZE>
+unsigned matrix_solver_w_t<FT, SIZE>::vsolve_non_dynamic(const bool newton_raphson)
{
- build_LE_A<matrix_solver_w_t>();
- build_LE_RHS<matrix_solver_w_t>();
-
- for (std::size_t i=0, iN=N(); i < iN; i++)
- m_last_RHS[i] = RHS(i);
+ this->build_LE_A(*this);
+ this->build_LE_RHS(*this);
this->m_stat_calculations++;
return this->solve_non_dynamic(newton_raphson);
}
-template <std::size_t m_N, std::size_t storage_N>
-matrix_solver_w_t<m_N, storage_N>::matrix_solver_w_t(netlist_t &anetlist, const pstring &name,
+template <typename FT, int SIZE>
+matrix_solver_w_t<FT, SIZE>::matrix_solver_w_t(netlist_state_t &anetlist, const pstring &name,
const solver_parameters_t *params, const std::size_t size)
-: matrix_solver_t(anetlist, name, NOSORT, params)
- ,m_cnt(0)
+ : matrix_solver_t(anetlist, name, NOSORT, params)
+ , m_cnt(0)
, m_dim(size)
{
- for (std::size_t k = 0; k < N(); k++)
- {
- m_last_RHS[k] = 0.0;
- }
}
} //namespace devices
diff --git a/src/lib/netlist/solver/nld_solver.cpp b/src/lib/netlist/solver/nld_solver.cpp
index cae76caab1a..4734cc3624d 100644
--- a/src/lib/netlist/solver/nld_solver.cpp
+++ b/src/lib/netlist/solver/nld_solver.cpp
@@ -31,393 +31,398 @@
#pragma GCC optimize "ivopts"
#endif
-#include <algorithm>
-#include <cmath> // <<= needed by windows build
-
-#include "../nl_lists.h"
-
-#include "../plib/pomp.h"
-
-#include "../nl_factory.h"
-
-#include "nld_solver.h"
+#include "netlist/nl_lists.h"
+#include "netlist/nl_factory.h"
#include "nld_matrix_solver.h"
-
-#if 1
#include "nld_ms_direct.h"
-#include "nld_ms_gcr.h"
-#else
-#include "nld_ms_direct_lu.h"
-#endif
-#include "nld_ms_w.h"
-#include "nld_ms_sm.h"
#include "nld_ms_direct1.h"
#include "nld_ms_direct2.h"
+#include "nld_ms_gcr.h"
+#include "nld_ms_gmres.h"
+#include "nld_ms_sm.h"
#include "nld_ms_sor.h"
#include "nld_ms_sor_mat.h"
-#include "nld_ms_gmres.h"
+#include "nld_ms_w.h"
+#include "nld_solver.h"
+#include "plib/pomp.h"
+
+#include <algorithm>
+#include <cmath>
namespace netlist
{
- namespace devices
- {
-
-
+namespace devices
+{
-// ----------------------------------------------------------------------------------------
-// solver
-// ----------------------------------------------------------------------------------------
+ // ----------------------------------------------------------------------------------------
+ // solver
+ // ----------------------------------------------------------------------------------------
-NETLIB_RESET(solver)
-{
- for (std::size_t i = 0; i < m_mat_solvers.size(); i++)
- m_mat_solvers[i]->do_reset();
-}
+ NETLIB_RESET(solver)
+ {
+ for (auto &s : m_mat_solvers)
+ s->reset();
+ }
-void NETLIB_NAME(solver)::stop()
-{
- for (std::size_t i = 0; i < m_mat_solvers.size(); i++)
- m_mat_solvers[i]->log_stats();
-}
+ void NETLIB_NAME(solver)::stop()
+ {
+ for (auto &s : m_mat_solvers)
+ s->log_stats();
+ }
-NETLIB_NAME(solver)::~NETLIB_NAME(solver)()
-{
-}
+ NETLIB_UPDATE(solver)
+ {
+ if (m_params.m_dynamic_ts)
+ return;
-NETLIB_UPDATE(solver)
-{
- if (m_params.m_dynamic_ts)
- return;
+ netlist_time now(exec().time());
+ /* force solving during start up if there are no time-step devices */
+ /* FIXME: Needs a more elegant solution */
+ bool force_solve = (now < netlist_time::from_double(2 * m_params.m_max_timestep));
- /* force solving during start up if there are no time-step devices */
- /* FIXME: Needs a more elegant solution */
- bool force_solve = (netlist().time() < netlist_time::from_double(2 * m_params.m_max_timestep));
+ std::size_t nthreads = std::min(static_cast<std::size_t>(m_parallel()), plib::omp::get_max_threads());
- std::size_t nthreads = std::min(m_parallel(), plib::omp::get_max_threads());
- std::size_t t_cnt = 0;
- int solv[128];
- for (int i = 0; i < m_mat_solvers.size(); i++)
- if (m_mat_solvers[i]->has_timestep_devices() || force_solve)
- solv[t_cnt++] = i;
+ std::vector<matrix_solver_t *> &solvers = (force_solve ? m_mat_solvers_all : m_mat_solvers_timestepping);
- if (nthreads > 1 && t_cnt > 1)
- {
- plib::omp::set_num_threads(nthreads);
- plib::omp::for_static(0, t_cnt, [this, &solv](int i) { ATTR_UNUSED const netlist_time ts = this->m_mat_solvers[solv[i]]->solve(); });
- }
- else
- for (auto & solver : m_mat_solvers)
- if (solver->has_timestep_devices() || force_solve)
- ATTR_UNUSED const netlist_time ts = solver->solve();
+ if (nthreads > 1 && solvers.size() > 1)
+ {
+ plib::omp::set_num_threads(nthreads);
+ plib::omp::for_static(static_cast<std::size_t>(0), solvers.size(), [&solvers, now](std::size_t i)
+ {
+ const netlist_time ts = solvers[i]->solve(now);
+ plib::unused_var(ts);
+ });
+ }
+ else
+ for (auto & solver : solvers)
+ {
+ const netlist_time ts = solver->solve(now);
+ plib::unused_var(ts);
+ }
- for (auto & solver : m_mat_solvers)
- if (solver->has_timestep_devices() || force_solve)
+ for (auto & solver : solvers)
solver->update_inputs();
- /* step circuit */
- if (!m_Q_step.net().is_queued())
- {
- m_Q_step.net().toggle_and_push_to_queue(netlist_time::from_double(m_params.m_max_timestep));
+ /* step circuit */
+ if (!m_Q_step.net().is_queued())
+ {
+ m_Q_step.net().toggle_and_push_to_queue(netlist_time::from_double(m_params.m_max_timestep));
+ }
}
-}
-
-template <class C>
-std::unique_ptr<matrix_solver_t> create_it(netlist_t &nl, pstring name, solver_parameters_t &params, std::size_t size)
-{
- typedef C solver;
- return plib::make_unique<solver>(nl, name, &params, size);
-}
-template <std::size_t m_N, std::size_t storage_N>
-std::unique_ptr<matrix_solver_t> NETLIB_NAME(solver)::create_solver(std::size_t size, const pstring &solvername)
-{
- if (pstring("SOR_MAT").equals(m_method()))
+ template <class C>
+ pool_owned_ptr<matrix_solver_t> create_it(netlist_state_t &nl, pstring name, solver_parameters_t &params, std::size_t size)
{
- return create_it<matrix_solver_SOR_mat_t<m_N, storage_N>>(netlist(), solvername, m_params, size);
- //typedef matrix_solver_SOR_mat_t<m_N,storage_N> solver_sor_mat;
- //return plib::make_unique<solver_sor_mat>(netlist(), solvername, &m_params, size);
+ return pool().make_poolptr<C>(nl, name, &params, size);
}
- else if (pstring("MAT_CR").equals(m_method()))
+
+ template <typename FT, int SIZE>
+ pool_owned_ptr<matrix_solver_t> NETLIB_NAME(solver)::create_solver(std::size_t size, const pstring &solvername)
{
- if (size > 0) // GCR always outperforms MAT solver
+ if (m_method() == "SOR_MAT")
+ {
+ return create_it<matrix_solver_SOR_mat_t<FT, SIZE>>(state(), solvername, m_params, size);
+ //typedef matrix_solver_SOR_mat_t<m_N,storage_N> solver_sor_mat;
+ //return plib::make_unique<solver_sor_mat>(state(), solvername, &m_params, size);
+ }
+ else if (m_method() == "MAT_CR")
+ {
+ if (size > 0) // GCR always outperforms MAT solver
+ {
+ return create_it<matrix_solver_GCR_t<FT, SIZE>>(state(), solvername, m_params, size);
+ }
+ else
+ {
+ return create_it<matrix_solver_direct_t<FT, SIZE>>(state(), solvername, m_params, size);
+ }
+ }
+ else if (m_method() == "MAT")
+ {
+ return create_it<matrix_solver_direct_t<FT, SIZE>>(state(), solvername, m_params, size);
+ }
+ else if (m_method() == "SM")
+ {
+ /* Sherman-Morrison Formula */
+ return create_it<matrix_solver_sm_t<FT, SIZE>>(state(), solvername, m_params, size);
+ }
+ else if (m_method() == "W")
{
- typedef matrix_solver_GCR_t<m_N,storage_N> solver_mat;
- return plib::make_unique<solver_mat>(netlist(), solvername, &m_params, size);
+ /* Woodbury Formula */
+ return create_it<matrix_solver_w_t<FT, SIZE>>(state(), solvername, m_params, size);
+ }
+ else if (m_method() == "SOR")
+ {
+ return create_it<matrix_solver_SOR_t<FT, SIZE>>(state(), solvername, m_params, size);
+ }
+ else if (m_method() == "GMRES")
+ {
+ return create_it<matrix_solver_GMRES_t<FT, SIZE>>(state(), solvername, m_params, size);
}
else
{
- typedef matrix_solver_direct_t<m_N,storage_N> solver_mat;
- return plib::make_unique<solver_mat>(netlist(), solvername, &m_params, size);
+ log().fatal(MF_1_UNKNOWN_SOLVER_TYPE, m_method());
+ return pool_owned_ptr<matrix_solver_t>();
}
}
- else if (pstring("MAT").equals(m_method()))
- {
- typedef matrix_solver_direct_t<m_N,storage_N> solver_mat;
- return plib::make_unique<solver_mat>(netlist(), solvername, &m_params, size);
- }
- else if (pstring("SM").equals(m_method()))
- {
- /* Sherman-Morrison Formula */
- typedef matrix_solver_sm_t<m_N,storage_N> solver_mat;
- return plib::make_unique<solver_mat>(netlist(), solvername, &m_params, size);
- }
- else if (pstring("W").equals(m_method()))
- {
- /* Woodbury Formula */
- typedef matrix_solver_w_t<m_N,storage_N> solver_mat;
- return plib::make_unique<solver_mat>(netlist(), solvername, &m_params, size);
- }
- else if (pstring("SOR").equals(m_method()))
- {
- typedef matrix_solver_SOR_t<m_N,storage_N> solver_GS;
- return plib::make_unique<solver_GS>(netlist(), solvername, &m_params, size);
- }
- else if (pstring("GMRES").equals(m_method()))
- {
- typedef matrix_solver_GMRES_t<m_N,storage_N> solver_GMRES;
- return plib::make_unique<solver_GMRES>(netlist(), solvername, &m_params, size);
- }
- else
+
+ template <typename FT, int SIZE>
+ pool_owned_ptr<matrix_solver_t> NETLIB_NAME(solver)::create_solver_x(std::size_t size, const pstring &solvername)
{
- log().fatal(MF_1_UNKNOWN_SOLVER_TYPE, m_method());
- return nullptr;
+ if (SIZE > 0)
+ {
+ if (size == SIZE)
+ return create_solver<FT, SIZE>(size, solvername);
+ else
+ return this->create_solver_x<FT, SIZE-1>(size, solvername);
+ }
+ else
+ {
+ if (size * 2 > -SIZE )
+ return create_solver<FT, SIZE>(size, solvername);
+ else
+ return this->create_solver_x<FT, SIZE / 2>(size, solvername);
+ }
}
-}
-
-struct net_splitter
-{
- bool already_processed(analog_net_t *n)
+ struct net_splitter
{
- if (n->isRailNet())
- return true;
- for (auto & grp : groups)
- if (plib::container::contains(grp, n))
+
+ bool already_processed(const analog_net_t &n) const
+ {
+ /* no need to process rail nets - these are known variables */
+ if (n.isRailNet())
return true;
- return false;
- }
+ /* if it's already processed - no need to continue */
+ for (auto & grp : groups)
+ if (plib::container::contains(grp, &n))
+ return true;
+ return false;
+ }
- void process_net(analog_net_t *n)
- {
- if (n->num_cons() == 0)
- return;
- /* add the net */
- groups.back().push_back(n);
- for (auto &p : n->m_core_terms)
+ void process_net(analog_net_t &n)
{
- if (p->is_type(detail::terminal_type::TERMINAL))
+ /* ignore empty nets. FIXME: print a warning message */
+ if (n.num_cons() == 0)
+ return;
+ /* add the net */
+ groups.back().push_back(&n);
+ /* process all terminals connected to this net */
+ for (auto &term : n.core_terms())
{
- terminal_t *pt = static_cast<terminal_t *>(p);
- analog_net_t *other_net = &pt->m_otherterm->net();
- if (!already_processed(other_net))
- process_net(other_net);
+ /* only process analog terminals */
+ if (term->is_type(detail::terminal_type::TERMINAL))
+ {
+ auto *pt = static_cast<terminal_t *>(term);
+ /* check the connected terminal */
+ analog_net_t &connected_net = pt->connected_terminal()->net();
+ if (!already_processed(connected_net))
+ process_net(connected_net);
+ }
}
}
- }
- void run(netlist_t &netlist)
- {
- for (auto & net : netlist.m_nets)
+ void run(netlist_state_t &netlist)
{
- netlist.log().debug("processing {1}\n", net->name());
- if (!net->isRailNet() && net->num_cons() > 0)
+ for (auto & net : netlist.nets())
{
- netlist.log().debug(" ==> not a rail net\n");
- /* Must be an analog net */
- analog_net_t *n = static_cast<analog_net_t *>(net.get());
- if (!already_processed(n))
+ netlist.log().debug("processing {1}\n", net->name());
+ if (!net->isRailNet() && net->num_cons() > 0)
{
- groups.push_back(analog_net_t::list_t());
- process_net(n);
+ netlist.log().debug(" ==> not a rail net\n");
+ /* Must be an analog net */
+ auto &n = *static_cast<analog_net_t *>(net.get());
+ if (!already_processed(n))
+ {
+ groups.emplace_back(analog_net_t::list_t());
+ process_net(n);
+ }
}
}
}
- }
- std::vector<analog_net_t::list_t> groups;
-};
+ std::vector<analog_net_t::list_t> groups;
+ };
-void NETLIB_NAME(solver)::post_start()
-{
- const bool use_specific = true;
-
- m_params.m_pivot = m_pivot();
- m_params.m_accuracy = m_accuracy();
- /* FIXME: Throw when negative */
- m_params.m_gs_loops = static_cast<unsigned>(m_gs_loops());
- m_params.m_nr_loops = static_cast<unsigned>(m_nr_loops());
- m_params.m_nr_recalc_delay = netlist_time::from_double(m_nr_recalc_delay());
- m_params.m_dynamic_lte = m_dynamic_lte();
- m_params.m_gs_sor = m_gs_sor();
-
- m_params.m_min_timestep = m_dynamic_min_ts();
- m_params.m_dynamic_ts = (m_dynamic_ts() == 1 ? true : false);
- m_params.m_max_timestep = netlist_time::from_double(1.0 / m_freq()).as_double();
-
- if (m_params.m_dynamic_ts)
+ void NETLIB_NAME(solver)::post_start()
{
- m_params.m_max_timestep *= 1;//NL_FCONST(1000.0);
- }
- else
- {
- m_params.m_min_timestep = m_params.m_max_timestep;
- }
+ m_params.m_pivot = m_pivot();
+ m_params.m_accuracy = m_accuracy();
+ /* FIXME: Throw when negative */
+ m_params.m_gs_loops = static_cast<unsigned>(m_gs_loops());
+ m_params.m_nr_loops = static_cast<unsigned>(m_nr_loops());
+ m_params.m_nr_recalc_delay = netlist_time::from_double(m_nr_recalc_delay());
+ m_params.m_dynamic_lte = m_dynamic_lte();
+ m_params.m_gs_sor = m_gs_sor();
+
+ m_params.m_min_timestep = m_dynamic_min_ts();
+ m_params.m_dynamic_ts = (m_dynamic_ts() == 1 ? true : false);
+ m_params.m_max_timestep = netlist_time::from_double(1.0 / m_freq()).as_double();
- //m_params.m_max_timestep = std::max(m_params.m_max_timestep, m_params.m_max_timestep::)
+ m_params.m_use_gabs = m_use_gabs();
+ m_params.m_use_linear_prediction = m_use_linear_prediction();
+
+
+ if (m_params.m_dynamic_ts)
+ {
+ m_params.m_max_timestep *= 1;//NL_FCONST(1000.0);
+ }
+ else
+ {
+ m_params.m_min_timestep = m_params.m_max_timestep;
+ }
- // Override log statistics
- pstring p = plib::util::environment("NL_STATS", "");
- if (p != "")
- m_params.m_log_stats = p.as_long();
- else
- m_params.m_log_stats = m_log_stats();
+ //m_params.m_max_timestep = std::max(m_params.m_max_timestep, m_params.m_max_timestep::)
- log().verbose("Scanning net groups ...");
- // determine net groups
+ // Override log statistics
+ pstring p = plib::util::environment("NL_STATS", "");
+ if (p != "")
+ m_params.m_log_stats = plib::pstonum<decltype(m_params.m_log_stats)>(p);
+ else
+ m_params.m_log_stats = m_log_stats();
- net_splitter splitter;
+ log().verbose("Scanning net groups ...");
+ // determine net groups
- splitter.run(netlist());
+ net_splitter splitter;
- // setup the solvers
- log().verbose("Found {1} net groups in {2} nets\n", splitter.groups.size(), netlist().m_nets.size());
- for (auto & grp : splitter.groups)
- {
- std::unique_ptr<matrix_solver_t> ms;
- std::size_t net_count = grp.size();
- pstring sname = plib::pfmt("Solver_{1}")(m_mat_solvers.size());
+ splitter.run(state());
- switch (net_count)
+ // setup the solvers
+ log().verbose("Found {1} net groups in {2} nets\n", splitter.groups.size(), state().nets().size());
+ for (auto & grp : splitter.groups)
{
-#if 1
- case 1:
- if (use_specific)
- ms = plib::make_unique<matrix_solver_direct1_t>(netlist(), sname, &m_params);
- else
- ms = create_solver<1,1>(1, sname);
- break;
- case 2:
- if (use_specific)
- ms = plib::make_unique<matrix_solver_direct2_t>(netlist(), sname, &m_params);
- else
- ms = create_solver<2,2>(2, sname);
- break;
-#if 0
- case 3:
- ms = create_solver<3,3>(3, sname);
- break;
- case 4:
- ms = create_solver<4,4>(4, sname);
- break;
- case 5:
- ms = create_solver<5,5>(5, sname);
- break;
- case 6:
- ms = create_solver<6,6>(6, sname);
- break;
- case 7:
- ms = create_solver<7,7>(7, sname);
- break;
- case 8:
- ms = create_solver<8,8>(8, sname);
- break;
- case 9:
- ms = create_solver<9,9>(9, sname);
- break;
- case 10:
- ms = create_solver<10,10>(10, sname);
- break;
- case 11:
- ms = create_solver<11,11>(11, sname);
- break;
- case 12:
- ms = create_solver<12,12>(12, sname);
- break;
- case 15:
- ms = create_solver<15,15>(15, sname);
- break;
- case 31:
- ms = create_solver<31,31>(31, sname);
- break;
- case 35:
- ms = create_solver<35,35>(35, sname);
- break;
- case 43:
- ms = create_solver<43,43>(43, sname);
- break;
- case 49:
- ms = create_solver<49,49>(49, sname);
- break;
-#endif
-#if 0
- case 87:
- ms = create_solver<87,87>(87, sname);
- break;
-#endif
-#endif
- default:
- log().warning(MW_1_NO_SPECIFIC_SOLVER, net_count);
- if (net_count <= 8)
- {
- ms = create_solver<0, 8>(net_count, sname);
- }
- else if (net_count <= 16)
- {
- ms = create_solver<0,16>(net_count, sname);
- }
- else if (net_count <= 32)
- {
- ms = create_solver<0,32>(net_count, sname);
- }
- else
- if (net_count <= 64)
- {
- ms = create_solver<0,64>(net_count, sname);
- }
- else
- if (net_count <= 128)
- {
- ms = create_solver<0,128>(net_count, sname);
- }
- else
- {
- log().fatal(MF_1_NETGROUP_SIZE_EXCEEDED_1, 128);
- ms = nullptr; /* tease compilers */
- }
+ pool_owned_ptr<matrix_solver_t> ms;
+ std::size_t net_count = grp.size();
+ pstring sname = plib::pfmt("Solver_{1}")(m_mat_solvers.size());
- break;
- }
+ switch (net_count)
+ {
+ #if 1
+ case 1:
+ ms = pool().make_poolptr<matrix_solver_direct1_t<double>>(state(), sname, &m_params);
+ break;
+ case 2:
+ ms = pool().make_poolptr<matrix_solver_direct2_t<double>>(state(), sname, &m_params);
+ break;
+ case 3:
+ ms = create_solver<double, 3>(3, sname);
+ break;
+ case 4:
+ ms = create_solver<double, 4>(4, sname);
+ break;
+ case 5:
+ ms = create_solver<double, 5>(5, sname);
+ break;
+ case 6:
+ ms = create_solver<double, 6>(6, sname);
+ break;
+ case 7:
+ ms = create_solver<double, 7>(7, sname);
+ break;
+ case 8:
+ ms = create_solver<double, 8>(8, sname);
+ break;
+ case 9:
+ ms = create_solver<double, 9>(9, sname);
+ break;
+ case 10:
+ ms = create_solver<double, 10>(10, sname);
+ break;
+ #if 0
+ case 11:
+ ms = create_solver<double, 11>(11, sname);
+ break;
+ case 12:
+ ms = create_solver<double, 12>(12, sname);
+ break;
+ case 15:
+ ms = create_solver<double, 15>(15, sname);
+ break;
+ case 31:
+ ms = create_solver<double, 31>(31, sname);
+ break;
+ case 35:
+ ms = create_solver<double, 35>(35, sname);
+ break;
+ case 43:
+ ms = create_solver<double, 43>(43, sname);
+ break;
+ case 49:
+ ms = create_solver<double, 49>(49, sname);
+ break;
+ #endif
+ #if 1
+ case 86:
+ ms = create_solver<double,86>(86, sname);
+ break;
+ #endif
+ #endif
+ default:
+ log().warning(MW_1_NO_SPECIFIC_SOLVER, net_count);
+ if (net_count <= 8)
+ {
+ ms = create_solver<double, -8>(net_count, sname);
+ }
+ else if (net_count <= 16)
+ {
+ ms = create_solver<double, -16>(net_count, sname);
+ }
+ else if (net_count <= 32)
+ {
+ ms = create_solver<double, -32>(net_count, sname);
+ }
+ else
+ if (net_count <= 64)
+ {
+ ms = create_solver<double, -64>(net_count, sname);
+ }
+ else
+ if (net_count <= 128)
+ {
+ ms = create_solver<double, -128>(net_count, sname);
+ }
+ else
+ {
+ log().fatal(MF_1_NETGROUP_SIZE_EXCEEDED_1, 128);
+ return; /* tease compilers */
+ }
+ break;
+ }
- // FIXME ...
- ms->setup(grp);
+ // FIXME ...
+ ms->setup(grp);
- log().verbose("Solver {1}", ms->name());
- log().verbose(" ==> {2} nets", grp.size());
- log().verbose(" has {1} elements", ms->has_dynamic_devices() ? "dynamic" : "no dynamic");
- log().verbose(" has {1} elements", ms->has_timestep_devices() ? "timestep" : "no timestep");
- for (auto &n : grp)
- {
- log().verbose("Net {1}", n->name());
- for (const auto &pcore : n->m_core_terms)
+ log().verbose("Solver {1}", ms->name());
+ log().verbose(" ==> {2} nets", grp.size());
+ log().verbose(" has {1} elements", ms->has_dynamic_devices() ? "dynamic" : "no dynamic");
+ log().verbose(" has {1} elements", ms->has_timestep_devices() ? "timestep" : "no timestep");
+ for (auto &n : grp)
{
- log().verbose(" {1}", pcore->name());
+ log().verbose("Net {1}", n->name());
+ for (const auto &pcore : n->core_terms())
+ {
+ log().verbose(" {1}", pcore->name());
+ }
}
- }
- m_mat_solvers.push_back(std::move(ms));
+ m_mat_solvers_all.push_back(ms.get());
+ if (ms->has_timestep_devices())
+ m_mat_solvers_timestepping.push_back(ms.get());
+
+ m_mat_solvers.emplace_back(std::move(ms));
+ }
}
-}
-void NETLIB_NAME(solver)::create_solver_code(std::map<pstring, pstring> &mp)
-{
- for (auto & s : m_mat_solvers)
+ void NETLIB_NAME(solver)::create_solver_code(std::map<pstring, pstring> &mp)
{
- auto r = s->create_solver_code();
- mp[r.first] = r.second; // automatically overwrites identical names
+ for (auto & s : m_mat_solvers)
+ {
+ auto r = s->create_solver_code();
+ mp[r.first] = r.second; // automatically overwrites identical names
+ }
}
-}
- NETLIB_DEVICE_IMPL(solver)
+ NETLIB_DEVICE_IMPL(solver, "SOLVER", "FREQ")
- } //namespace devices
+} // namespace devices
} // namespace netlist
diff --git a/src/lib/netlist/solver/nld_solver.h b/src/lib/netlist/solver/nld_solver.h
index 986d14f401a..c9ec967a72a 100644
--- a/src/lib/netlist/solver/nld_solver.h
+++ b/src/lib/netlist/solver/nld_solver.h
@@ -8,11 +8,13 @@
#ifndef NLD_SOLVER_H_
#define NLD_SOLVER_H_
-#include <map>
-
-#include "../nl_base.h"
-#include "../plib/pstream.h"
+#include "netlist/nl_base.h"
#include "nld_matrix_solver.h"
+#include "plib/pstream.h"
+
+#include <map>
+#include <memory>
+#include <vector>
//#define ATTR_ALIGNED(N) __attribute__((aligned(N)))
#define ATTR_ALIGNED(N) ATTR_ALIGN
@@ -23,89 +25,97 @@
namespace netlist
{
- namespace devices
- {
-class NETLIB_NAME(solver);
-
-
-class matrix_solver_t;
-
-NETLIB_OBJECT(solver)
+namespace devices
{
- NETLIB_CONSTRUCTOR(solver)
- , m_fb_step(*this, "FB_step")
- , m_Q_step(*this, "Q_step")
- , m_freq(*this, "FREQ", 48000.0)
-
- /* iteration parameters */
- , m_gs_sor(*this, "SOR_FACTOR", 1.059)
- , m_method(*this, "METHOD", "MAT_CR")
- , m_accuracy(*this, "ACCURACY", 1e-7)
- , m_gs_loops(*this, "GS_LOOPS",9) // Gauss-Seidel loops
-
- /* general parameters */
- , m_gmin(*this, "GMIN", NETLIST_GMIN_DEFAULT)
- , m_pivot(*this, "PIVOT", 0) // use pivoting - on supported solvers
- , m_nr_loops(*this, "NR_LOOPS", 250) // Newton-Raphson loops
- , m_nr_recalc_delay(*this, "NR_RECALC_DELAY", NLTIME_FROM_NS(10).as_double()) // Delay to next solve attempt if nr loops exceeded
- , m_parallel(*this, "PARALLEL", 0)
-
- /* automatic time step */
- , m_dynamic_ts(*this, "DYNAMIC_TS", 0)
- , m_dynamic_lte(*this, "DYNAMIC_LTE", 1e-5) // diff/timestep
- , m_dynamic_min_ts(*this, "DYNAMIC_MIN_TIMESTEP", 1e-6) // nl_double timestep resolution
-
- , m_log_stats(*this, "LOG_STATS", 0) // log statistics on shutdown
- , m_params()
- {
- // internal staff
-
- connect(m_fb_step, m_Q_step);
- }
-
- virtual ~NETLIB_NAME(solver)() override;
+ class NETLIB_NAME(solver);
- void post_start();
- void stop();
+ class matrix_solver_t;
- inline nl_double gmin() { return m_gmin(); }
-
- void create_solver_code(std::map<pstring, pstring> &mp);
-
- NETLIB_UPDATEI();
- NETLIB_RESETI();
- // NETLIB_UPDATE_PARAMI();
-
-protected:
- logic_input_t m_fb_step;
- logic_output_t m_Q_step;
-
- param_double_t m_freq;
- param_double_t m_gs_sor;
- param_str_t m_method;
- param_double_t m_accuracy;
- param_int_t m_gs_loops;
- param_double_t m_gmin;
- param_logic_t m_pivot;
- param_int_t m_nr_loops;
- param_double_t m_nr_recalc_delay;
- param_int_t m_parallel;
- param_logic_t m_dynamic_ts;
- param_double_t m_dynamic_lte;
- param_double_t m_dynamic_min_ts;
-
- param_logic_t m_log_stats;
-
- std::vector<std::unique_ptr<matrix_solver_t>> m_mat_solvers;
-private:
-
- solver_parameters_t m_params;
-
- template <std::size_t m_N, std::size_t storage_N>
- std::unique_ptr<matrix_solver_t> create_solver(std::size_t size, const pstring &solvername);
-};
-
- } //namespace devices
+ NETLIB_OBJECT(solver)
+ {
+ NETLIB_CONSTRUCTOR(solver)
+ , m_fb_step(*this, "FB_step")
+ , m_Q_step(*this, "Q_step")
+ , m_freq(*this, "FREQ", 48000.0)
+
+ /* iteration parameters */
+ , m_gs_sor(*this, "SOR_FACTOR", 1.059)
+ , m_method(*this, "METHOD", "MAT_CR")
+ , m_accuracy(*this, "ACCURACY", 1e-7)
+ , m_gs_loops(*this, "GS_LOOPS", 9) // Gauss-Seidel loops
+
+ /* general parameters */
+ , m_gmin(*this, "GMIN", 1e-9)
+ , m_pivot(*this, "PIVOT", false) // use pivoting - on supported solvers
+ , m_nr_loops(*this, "NR_LOOPS", 250) // Newton-Raphson loops
+ , m_nr_recalc_delay(*this, "NR_RECALC_DELAY", NLTIME_FROM_NS(10).as_double()) // Delay to next solve attempt if nr loops exceeded
+ , m_parallel(*this, "PARALLEL", 0)
+
+ /* automatic time step */
+ , m_dynamic_ts(*this, "DYNAMIC_TS", false)
+ , m_dynamic_lte(*this, "DYNAMIC_LTE", 1e-5) // diff/timestep
+ , m_dynamic_min_ts(*this, "DYNAMIC_MIN_TIMESTEP", 1e-6) // nl_double timestep resolution
+
+ /* special */
+ , m_use_gabs(*this, "USE_GABS", true)
+ , m_use_linear_prediction(*this, "USE_LINEAR_PREDICTION", false) // // savings are eaten up by effort
+
+ , m_log_stats(*this, "LOG_STATS", true) // log statistics on shutdown
+ , m_params()
+ {
+ // internal staff
+
+ connect(m_fb_step, m_Q_step);
+ }
+
+ void post_start();
+ void stop();
+
+ nl_double gmin() const { return m_gmin(); }
+
+ void create_solver_code(std::map<pstring, pstring> &mp);
+
+ NETLIB_UPDATEI();
+ NETLIB_RESETI();
+ // NETLIB_UPDATE_PARAMI();
+
+ private:
+ logic_input_t m_fb_step;
+ logic_output_t m_Q_step;
+
+ param_double_t m_freq;
+ param_double_t m_gs_sor;
+ param_str_t m_method;
+ param_double_t m_accuracy;
+ param_int_t m_gs_loops;
+ param_double_t m_gmin;
+ param_logic_t m_pivot;
+ param_int_t m_nr_loops;
+ param_double_t m_nr_recalc_delay;
+ param_int_t m_parallel;
+ param_logic_t m_dynamic_ts;
+ param_double_t m_dynamic_lte;
+ param_double_t m_dynamic_min_ts;
+
+ param_logic_t m_use_gabs;
+ param_logic_t m_use_linear_prediction;
+
+ param_logic_t m_log_stats;
+
+ std::vector<pool_owned_ptr<matrix_solver_t>> m_mat_solvers;
+ std::vector<matrix_solver_t *> m_mat_solvers_all;
+ std::vector<matrix_solver_t *> m_mat_solvers_timestepping;
+
+ solver_parameters_t m_params;
+
+ template <typename FT, int SIZE>
+ pool_owned_ptr<matrix_solver_t> create_solver(std::size_t size, const pstring &solvername);
+
+ template <typename FT, int SIZE>
+ pool_owned_ptr<matrix_solver_t> create_solver_x(std::size_t size, const pstring &solvername);
+ };
+
+} //namespace devices
} // namespace netlist
#endif /* NLD_SOLVER_H_ */
diff --git a/src/lib/netlist/solver/vector_base.h b/src/lib/netlist/solver/vector_base.h
deleted file mode 100644
index 28f5fa0dd44..00000000000
--- a/src/lib/netlist/solver/vector_base.h
+++ /dev/null
@@ -1,144 +0,0 @@
-// license:GPL-2.0+
-// copyright-holders:Couriersud
-/*
- * vector_base.h
- *
- * Base vector operations
- *
- */
-
-#ifndef VECTOR_BASE_H_
-#define VECTOR_BASE_H_
-
-#include <algorithm>
-#include "../plib/pconfig.h"
-
-#if 0
-template <unsigned storage_N>
-struct pvector
-{
- pvector(unsigned size)
- : m_N(size) { }
-
- unsigned size() {
- if (storage_N)
- }
-
- double m_V[storage_N];
-private:
- unsigned m_N;
-};
-#endif
-
-#if !defined(__clang__) && !defined(_MSC_VER) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ > 6))
-#pragma GCC diagnostic push
-#pragma GCC diagnostic ignored "-Wmaybe-uninitialized"
-#endif
-
-template<typename T, std::size_t N>
-inline static void vec_set (const std::size_t n, const T scalar, T (& RESTRICT v)[N])
-{
- if (n != N)
- for ( std::size_t i = 0; i < n; i++ )
- v[i] = scalar;
- else
- for ( std::size_t i = 0; i < N; i++ )
- v[i] = scalar;
-}
-
-template<typename T, std::size_t N>
-inline static T vec_mult (const std::size_t n, const T (& RESTRICT v1)[N], const T (& RESTRICT v2)[N] )
-{
- T value = 0.0;
- if (n != N)
- for ( std::size_t i = 0; i < n; i++ )
- value += v1[i] * v2[i];
- else
- for ( std::size_t i = 0; i < N; i++ )
- value += v1[i] * v2[i];
- return value;
-}
-
-template<typename T, std::size_t N>
-inline static T vec_mult2 (const std::size_t n, const T (& RESTRICT v)[N])
-{
- T value = 0.0;
- if (n != N)
- for ( std::size_t i = 0; i < n; i++ )
- value += v[i] * v[i];
- else
- for ( std::size_t i = 0; i < N; i++ )
- value += v[i] * v[i];
- return value;
-}
-
-template<typename T, std::size_t N>
-inline static void vec_mult_scalar (const std::size_t n, const T (& RESTRICT v)[N], const T & scalar, T (& RESTRICT result)[N])
-{
- if (n != N)
- for ( std::size_t i = 0; i < n; i++ )
- result[i] = scalar * v[i];
- else
- for ( std::size_t i = 0; i < N; i++ )
- result[i] = scalar * v[i];
-}
-
-template<typename T, std::size_t N>
-inline static void vec_add_mult_scalar (const std::size_t n, const T (& RESTRICT v)[N], const T scalar, T (& RESTRICT result)[N])
-{
- if (n != N)
- for ( std::size_t i = 0; i < n; i++ )
- result[i] = result[i] + scalar * v[i];
- else
- for ( std::size_t i = 0; i < N; i++ )
- result[i] = result[i] + scalar * v[i];
-}
-
-template<typename T>
-inline static void vec_add_mult_scalar_p(const std::size_t & n, const T * RESTRICT v, const T scalar, T * RESTRICT result)
-{
- for ( std::size_t i = 0; i < n; i++ )
- result[i] += scalar * v[i];
-}
-
-inline static void vec_add_ip(const std::size_t n, const double * RESTRICT v, double * RESTRICT result)
-{
- for ( std::size_t i = 0; i < n; i++ )
- result[i] += v[i];
-}
-
-template<typename T, std::size_t N>
-inline void vec_sub(const std::size_t n, const T (& RESTRICT v1)[N], const T (& RESTRICT v2)[N], T (& RESTRICT result)[N])
-{
- if (n != N)
- for ( std::size_t i = 0; i < n; i++ )
- result[i] = v1[i] - v2[i];
- else
- for ( std::size_t i = 0; i < N; i++ )
- result[i] = v1[i] - v2[i];
-}
-
-template<typename T, std::size_t N>
-inline void vec_scale(const std::size_t n, T (& RESTRICT v)[N], const T scalar)
-{
- if (n != N)
- for ( std::size_t i = 0; i < n; i++ )
- v[i] = scalar * v[i];
- else
- for ( std::size_t i = 0; i < N; i++ )
- v[i] = scalar * v[i];
-}
-
-inline double vec_maxabs(const std::size_t n, const double * RESTRICT v)
-{
- double ret = 0.0;
- for ( std::size_t i = 0; i < n; i++ )
- ret = std::max(ret, std::abs(v[i]));
-
- return ret;
-}
-#if !defined(__clang__) && !defined(_MSC_VER) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ > 6))
-#pragma GCC diagnostic pop
-#endif
-
-#endif /* MAT_CR_H_ */
diff --git a/src/lib/netlist/tools/nl_convert.cpp b/src/lib/netlist/tools/nl_convert.cpp
index bedddba3cda..0acf5041c91 100644
--- a/src/lib/netlist/tools/nl_convert.cpp
+++ b/src/lib/netlist/tools/nl_convert.cpp
@@ -5,19 +5,20 @@
*
*/
+#include "plib/palloc.h"
+#include "nl_convert.h"
+#include "plib/putil.h"
+
#include <algorithm>
#include <cmath>
#include <unordered_map>
-#include "nl_convert.h"
-#include "../plib/palloc.h"
-#include "../plib/putil.h"
/* FIXME: temporarily defined here - should be in a file */
/* FIXME: family logic in netlist is convoluted, create
* define a model param on core device
*/
/* Format: external name,netlist device,model */
-static const pstring s_lib_map =
+static const char * s_lib_map =
"SN74LS00D, TTL_7400_DIP, 74LSXX\n"
"SN74LS04D, TTL_7404_DIP, 74LSXX\n"
"SN74ALS08D, TTL_7408_DIP, 74ALSXX\n"
@@ -42,14 +43,13 @@ using lib_map_t = std::unordered_map<pstring, lib_map_entry>;
static lib_map_t read_lib_map(const pstring &lm)
{
- plib::pistringstream istrm(lm);
- plib::putf8_reader reader(istrm);
+ auto reader = plib::putf8_reader(plib::pistringstream(lm));
lib_map_t m;
pstring line;
while (reader.readline(line))
{
std::vector<pstring> split(plib::psplit(line, ","));
- m[split[0].trim()] = { split[1].trim(), split[2].trim() };
+ m[plib::trim(split[0])] = { plib::trim(split[1]), plib::trim(split[2]) };
}
return m;
}
@@ -59,7 +59,7 @@ static lib_map_t read_lib_map(const pstring &lm)
-------------------------------------------------*/
nl_convert_base_t::nl_convert_base_t()
- : out(m_buf)
+ : out(&m_buf)
, m_numberchars("0123456789-+e.")
{
}
@@ -82,7 +82,7 @@ void nl_convert_base_t::add_ext_alias(const pstring &alias)
m_ext_alias.push_back(alias);
}
-void nl_convert_base_t::add_device(std::unique_ptr<dev_t> dev)
+void nl_convert_base_t::add_device(plib::unique_ptr<dev_t> dev)
{
for (auto & d : m_devs)
if (d->name() == dev->name())
@@ -106,7 +106,7 @@ void nl_convert_base_t::add_device(const pstring &atype, const pstring &aname)
add_device(plib::make_unique<dev_t>(atype, aname));
}
-void nl_convert_base_t::add_term(pstring netname, pstring termname)
+void nl_convert_base_t::add_term(const pstring &netname, const pstring &termname)
{
net_t * net = nullptr;
auto idx = m_nets.find(netname);
@@ -130,11 +130,11 @@ void nl_convert_base_t::add_term(pstring netname, pstring termname)
void nl_convert_base_t::dump_nl()
{
- for (std::size_t i=0; i<m_ext_alias.size(); i++)
+ for (auto & alias : m_ext_alias)
{
- net_t *net = m_nets[m_ext_alias[i]].get();
+ net_t *net = m_nets[alias].get();
// use the first terminal ...
- out("ALIAS({}, {})\n", m_ext_alias[i].c_str(), net->terminals()[0].c_str());
+ out("ALIAS({}, {})\n", alias.c_str(), net->terminals()[0].c_str());
// if the aliased net only has this one terminal connected ==> don't dump
if (net->terminals().size() == 1)
net->set_no_export();
@@ -166,7 +166,6 @@ void nl_convert_base_t::dump_nl()
net_t * net = i.second.get();
if (!net->is_no_export())
{
- //printf("Net {}\n", net->name().c_str());
out("NET_C({}", net->terminals()[0].c_str() );
for (std::size_t j=1; j<net->terminals().size(); j++)
{
@@ -185,25 +184,25 @@ const pstring nl_convert_base_t::get_nl_val(const double val)
{
{
int i = 0;
- while (pstring(m_units[i].m_unit, pstring::UTF8) != "-" )
+ while (pstring(m_units[i].m_unit) != "-" )
{
if (m_units[i].m_mult <= std::abs(val))
break;
i++;
}
- return plib::pfmt(pstring(m_units[i].m_func, pstring::UTF8))(val / m_units[i].m_mult);
+ return plib::pfmt(pstring(m_units[i].m_func))(val / m_units[i].m_mult);
}
}
double nl_convert_base_t::get_sp_unit(const pstring &unit)
{
int i = 0;
- while (pstring(m_units[i].m_unit, pstring::UTF8) != "-")
+ while (pstring(m_units[i].m_unit) != "-")
{
- if (pstring(m_units[i].m_unit, pstring::UTF8) == unit)
+ if (pstring(m_units[i].m_unit) == unit)
return m_units[i].m_mult;
i++;
}
- fprintf(stderr, "Unit %s unknown\n", unit.c_str());
+ plib::perrlogger("Unit {} unknown\n", unit);
return 0.0;
}
@@ -212,9 +211,9 @@ double nl_convert_base_t::get_sp_val(const pstring &sin)
std::size_t p = 0;
while (p < sin.length() && (m_numberchars.find(sin.substr(p, 1)) != pstring::npos))
++p;
- pstring val = sin.left(p);
+ pstring val = plib::left(sin, p);
pstring unit = sin.substr(p);
- double ret = get_sp_unit(unit) * val.as_double();
+ double ret = get_sp_unit(unit) * plib::pstonum<double>(val);
return ret;
}
@@ -252,11 +251,11 @@ void nl_convert_spice_t::convert(const pstring &contents)
pstring line = "";
- for (std::size_t i=0; i < spnl.size(); i++)
+ for (const auto &i : spnl)
{
// Basic preprocessing
- pstring inl = spnl[i].trim().ucase();
- if (inl.startsWith("+"))
+ pstring inl = plib::ucase(plib::trim(i));
+ if (plib::startsWith(inl, "+"))
line = line + inl.substr(1);
else
{
@@ -285,13 +284,13 @@ void nl_convert_spice_t::process_line(const pstring &line)
out("// {}\n", line.substr(1).c_str());
break;
case '.':
- if (tt[0].equals(".SUBCKT"))
+ if (tt[0] == ".SUBCKT")
{
out("NETLIST_START({})\n", tt[1].c_str());
for (std::size_t i=2; i<tt.size(); i++)
add_ext_alias(tt[i]);
}
- else if (tt[0].equals(".ENDS"))
+ else if (tt[0] == ".ENDS")
{
dump_nl();
out("NETLIST_END()\n");
@@ -301,15 +300,16 @@ void nl_convert_spice_t::process_line(const pstring &line)
break;
case 'Q':
{
- bool cerr = false;
/* check for fourth terminal ... should be numeric net
* including "0" or start with "N" (ltspice)
*/
- ATTR_UNUSED long nval(tt[4].as_long(&cerr));
pstring model;
pstring pins ="CBE";
+ bool err;
+ auto nval = plib::pstonum_ne<long>(tt[4], err);
+ plib::unused_var(nval);
- if ((!cerr || tt[4].startsWith("N")) && tt.size() > 5)
+ if ((err || plib::startsWith(tt[4], "N")) && tt.size() > 5)
model = tt[5];
else
model = tt[4];
@@ -317,8 +317,8 @@ void nl_convert_spice_t::process_line(const pstring &line)
if (m.size() == 2)
{
if (m[1].length() != 4)
- fprintf(stderr, "error with model desc %s\n", model.c_str());
- pins = m[1].left(3);
+ plib::perrlogger("error with model desc {}\n", model);
+ pins = plib::left(m[1], 3);
}
add_device("QBJT_EB", tt[0], m[0]);
add_term(tt[1], tt[0] + "." + pins.at(0));
@@ -327,7 +327,7 @@ void nl_convert_spice_t::process_line(const pstring &line)
}
break;
case 'R':
- if (tt[0].startsWith("RV"))
+ if (plib::startsWith(tt[0], "RV"))
{
val = get_sp_val(tt[4]);
add_device("POT", tt[0], val);
@@ -351,7 +351,7 @@ void nl_convert_spice_t::process_line(const pstring &line)
break;
case 'V':
// just simple Voltage sources ....
- if (tt[2].equals("0"))
+ if (tt[2] == "0")
{
val = get_sp_val(tt[3]);
add_device("ANALOG_INPUT", tt[0], val);
@@ -359,7 +359,7 @@ void nl_convert_spice_t::process_line(const pstring &line)
//add_term(tt[2], tt[0] + ".2");
}
else
- fprintf(stderr, "Voltage Source %s not connected to GND\n", tt[0].c_str());
+ plib::perrlogger("Voltage Source {} not connected to GND\n", tt[0]);
break;
case 'I': // Input pin special notation
{
@@ -381,7 +381,7 @@ void nl_convert_spice_t::process_line(const pstring &line)
// last element is component type
// FIXME: Parameter
- pstring xname = tt[0].replace_all(".", "_");
+ pstring xname = plib::replace_all(tt[0], pstring("."), pstring("_"));
pstring tname = "TTL_" + tt[tt.size()-1] + "_DIP";
add_device(tname, xname);
for (std::size_t i=1; i < tt.size() - 1; i++)
@@ -401,16 +401,16 @@ void nl_convert_spice_t::process_line(const pstring &line)
Eagle converter
-------------------------------------------------*/
-nl_convert_eagle_t::tokenizer::tokenizer(nl_convert_eagle_t &convert, plib::putf8_reader &strm)
- : plib::ptokenizer(strm)
+nl_convert_eagle_t::tokenizer::tokenizer(nl_convert_eagle_t &convert, plib::putf8_reader &&strm)
+ : plib::ptokenizer(std::move(strm))
, m_convert(convert)
{
- set_identifier_chars("abcdefghijklmnopqrstuvwvxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890_.-");
- set_number_chars(".0123456789", "0123456789eE-."); //FIXME: processing of numbers
- set_whitespace(pstring("").cat(' ').cat(9).cat(10).cat(13));
- /* FIXME: gnetlist doesn't print comments */
- set_comment("/*", "*/", "//");
- set_string_char('\'');
+ this->identifier_chars("abcdefghijklmnopqrstuvwvxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890_.-")
+ .number_chars(".0123456789", "0123456789eE-.") //FIXME: processing of numbers
+ .whitespace(pstring("") + ' ' + static_cast<char>(9) + static_cast<char>(10) + static_cast<char>(13))
+ /* FIXME: gnetlist doesn't print comments */
+ .comment("/*", "*/", "//")
+ .string_char('\'');
m_tok_ADD = register_token("ADD");
m_tok_VALUE = register_token("VALUE");
m_tok_SIGNAL = register_token("SIGNAL");
@@ -428,9 +428,8 @@ void nl_convert_eagle_t::tokenizer::verror(const pstring &msg, int line_num, con
//FIXME: should accept a stream as well
void nl_convert_eagle_t::convert(const pstring &contents)
{
- plib::pistringstream istrm(contents);
- plib::putf8_reader reader(istrm);
- tokenizer tok(*this, reader);
+
+ tokenizer tok(*this, plib::putf8_reader(plib::pistringstream(contents)));
out("NETLIST_START(dummy)\n");
add_term("GND", "GND");
@@ -487,12 +486,12 @@ void nl_convert_eagle_t::convert(const pstring &contents)
}
break;
case 'P':
- if (sval.ucase() == "HIGH")
+ if (plib::ucase(sval) == "HIGH")
add_device("TTL_INPUT", name, 1);
- else if (sval.ucase() == "LOW")
+ else if (plib::ucase(sval) == "LOW")
add_device("TTL_INPUT", name, 0);
else
- add_device("ANALOG_INPUT", name, sval.as_double());
+ add_device("ANALOG_INPUT", name, plib::pstonum<double>(sval));
add_pin_alias(name, "1", "Q");
break;
case 'D':
@@ -538,16 +537,16 @@ void nl_convert_eagle_t::convert(const pstring &contents)
RINF converter
-------------------------------------------------*/
-nl_convert_rinf_t::tokenizer::tokenizer(nl_convert_rinf_t &convert, plib::putf8_reader &strm)
- : plib::ptokenizer(strm)
+nl_convert_rinf_t::tokenizer::tokenizer(nl_convert_rinf_t &convert, plib::putf8_reader &&strm)
+ : plib::ptokenizer(std::move(strm))
, m_convert(convert)
{
- set_identifier_chars(".abcdefghijklmnopqrstuvwvxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890_-");
- set_number_chars("0123456789", "0123456789eE-."); //FIXME: processing of numbers
- set_whitespace(pstring("").cat(' ').cat(9).cat(10).cat(13));
- /* FIXME: gnetlist doesn't print comments */
- set_comment("","","//"); // FIXME:needs to be confirmed
- set_string_char('"');
+ this->identifier_chars(".abcdefghijklmnopqrstuvwvxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890_-")
+ .number_chars("0123456789", "0123456789eE-.") //FIXME: processing of numbers
+ .whitespace(pstring("") + ' ' + static_cast<char>(9) + static_cast<char>(10) + static_cast<char>(13))
+ /* FIXME: gnetlist doesn't print comments */
+ .comment("","","//") // FIXME:needs to be confirmed
+ .string_char('"');
m_tok_HEA = register_token(".HEA");
m_tok_APP = register_token(".APP");
m_tok_TIM = register_token(".TIM");
@@ -577,9 +576,7 @@ void nl_convert_rinf_t::tokenizer::verror(const pstring &msg, int line_num, cons
void nl_convert_rinf_t::convert(const pstring &contents)
{
- plib::pistringstream istrm(contents);
- plib::putf8_reader reader(istrm);
- tokenizer tok(*this, reader);
+ tokenizer tok(*this, plib::putf8_reader(plib::pistringstream(contents)));
auto lm = read_lib_map(s_lib_map);
out("NETLIST_START(dummy)\n");
diff --git a/src/lib/netlist/tools/nl_convert.h b/src/lib/netlist/tools/nl_convert.h
index d3881320678..5cdae8e372d 100644
--- a/src/lib/netlist/tools/nl_convert.h
+++ b/src/lib/netlist/tools/nl_convert.h
@@ -10,10 +10,12 @@
#ifndef NL_CONVERT_H_
#define NL_CONVERT_H_
+#include "plib/plists.h"
+#include "plib/pparser.h"
+#include "plib/pstring.h"
+#include "plib/ptypes.h"
+
#include <memory>
-#include "../plib/pstring.h"
-#include "../plib/plists.h"
-#include "../plib/pparser.h"
/*-------------------------------------------------
convert - convert a spice netlist
@@ -23,6 +25,8 @@ class nl_convert_base_t
{
public:
+ COPYASSIGNMOVE(nl_convert_base_t, delete)
+
virtual ~nl_convert_base_t();
const pstring &result() { return m_buf.str(); }
@@ -40,7 +44,7 @@ protected:
void add_device(const pstring &atype, const pstring &aname, double aval);
void add_device(const pstring &atype, const pstring &aname);
- void add_term(pstring netname, pstring termname);
+ void add_term(const pstring &netname, const pstring &termname);
void dump_nl();
@@ -55,8 +59,8 @@ private:
struct net_t
{
public:
- explicit net_t(const pstring &aname)
- : m_name(aname), m_no_export(false) {}
+ explicit net_t(pstring aname)
+ : m_name(std::move(aname)), m_no_export(false) {}
const pstring &name() { return m_name;}
std::vector<pstring> &terminals() { return m_terminals; }
@@ -72,16 +76,28 @@ private:
struct dev_t
{
public:
- dev_t(const pstring &atype, const pstring &aname, const pstring &amodel)
- : m_type(atype), m_name(aname), m_model(amodel), m_val(0), m_has_val(false)
+ dev_t(pstring atype, pstring aname, pstring amodel)
+ : m_type(std::move(atype))
+ , m_name(std::move(aname))
+ , m_model(std::move(amodel))
+ , m_val(0)
+ , m_has_val(false)
{}
- dev_t(const pstring &atype, const pstring &aname, double aval)
- : m_type(atype), m_name(aname), m_model(""), m_val(aval), m_has_val(true)
+ dev_t(pstring atype, pstring aname, double aval)
+ : m_type(std::move(atype))
+ , m_name(std::move(aname))
+ , m_model("")
+ , m_val(aval)
+ , m_has_val(true)
{}
- dev_t(const pstring &atype, const pstring &aname)
- : m_type(atype), m_name(aname), m_model(""), m_val(0.0), m_has_val(false)
+ dev_t(pstring atype, pstring aname)
+ : m_type(std::move(atype))
+ , m_name(std::move(aname))
+ , m_model("")
+ , m_val(0.0)
+ , m_has_val(false)
{}
const pstring &name() { return m_name;}
@@ -109,8 +125,8 @@ private:
struct pin_alias_t
{
public:
- pin_alias_t(const pstring &name, const pstring &alias)
- : m_name(name), m_alias(alias)
+ pin_alias_t(pstring name, pstring alias)
+ : m_name(std::move(name)), m_alias(std::move(alias))
{}
const pstring &name() { return m_name; }
const pstring &alias() { return m_alias; }
@@ -121,14 +137,14 @@ private:
private:
- void add_device(std::unique_ptr<dev_t> dev);
+ void add_device(plib::unique_ptr<dev_t> dev);
plib::postringstream m_buf;
- std::vector<std::unique_ptr<dev_t>> m_devs;
- std::unordered_map<pstring, std::unique_ptr<net_t> > m_nets;
+ std::vector<plib::unique_ptr<dev_t>> m_devs;
+ std::unordered_map<pstring, plib::unique_ptr<net_t> > m_nets;
std::vector<pstring> m_ext_alias;
- std::unordered_map<pstring, std::unique_ptr<pin_alias_t>> m_pins;
+ std::unordered_map<pstring, plib::unique_ptr<pin_alias_t>> m_pins;
static unit_t m_units[];
pstring m_numberchars;
@@ -140,9 +156,6 @@ class nl_convert_spice_t : public nl_convert_base_t
public:
nl_convert_spice_t() : nl_convert_base_t() {}
- virtual ~nl_convert_spice_t() override
- {
- }
void convert(const pstring &contents) override;
@@ -159,14 +172,11 @@ class nl_convert_eagle_t : public nl_convert_base_t
public:
nl_convert_eagle_t() : nl_convert_base_t() {}
- virtual ~nl_convert_eagle_t() override
- {
- }
class tokenizer : public plib::ptokenizer
{
public:
- tokenizer(nl_convert_eagle_t &convert, plib::putf8_reader &strm);
+ tokenizer(nl_convert_eagle_t &convert, plib::putf8_reader &&strm);
token_id_t m_tok_ADD;
token_id_t m_tok_VALUE;
@@ -175,7 +185,7 @@ public:
protected:
- virtual void verror(const pstring &msg, int line_num, const pstring &line) override;
+ void verror(const pstring &msg, int line_num, const pstring &line) override;
private:
nl_convert_eagle_t &m_convert;
@@ -195,14 +205,11 @@ class nl_convert_rinf_t : public nl_convert_base_t
public:
nl_convert_rinf_t() : nl_convert_base_t() {}
- virtual ~nl_convert_rinf_t() override
- {
- }
class tokenizer : public plib::ptokenizer
{
public:
- tokenizer(nl_convert_rinf_t &convert, plib::putf8_reader &strm);
+ tokenizer(nl_convert_rinf_t &convert, plib::putf8_reader &&strm);
token_id_t m_tok_HEA;
token_id_t m_tok_APP;
@@ -216,7 +223,7 @@ public:
protected:
- virtual void verror(const pstring &msg, int line_num, const pstring &line) override;
+ void verror(const pstring &msg, int line_num, const pstring &line) override;
private:
nl_convert_rinf_t &m_convert;
diff --git a/src/lib/util/corefile.cpp b/src/lib/util/corefile.cpp
index 264d80f4113..78a484c5511 100644
--- a/src/lib/util/corefile.cpp
+++ b/src/lib/util/corefile.cpp
@@ -23,9 +23,10 @@
#include <ctype.h>
-
namespace util {
+
namespace {
+
/***************************************************************************
VALIDATION
***************************************************************************/
@@ -336,23 +337,6 @@ private:
/***************************************************************************
- INLINE FUNCTIONS
-***************************************************************************/
-
-/*-------------------------------------------------
- is_directory_separator - is a given character
- a directory separator? The following logic
- works for most platforms
--------------------------------------------------*/
-
-inline int is_directory_separator(char c)
-{
- return (c == '\\' || c == '/' || c == ':');
-}
-
-
-
-/***************************************************************************
core_text_file
***************************************************************************/
@@ -1275,7 +1259,7 @@ core_file::core_file()
std::string core_filename_extract_base(const std::string &name, bool strip_extension)
{
// find the start of the basename
- auto const start = std::find_if(name.rbegin(), name.rend(), [](char c) { return util::is_directory_separator(c); });
+ auto const start = std::find_if(name.rbegin(), name.rend(), &util::is_directory_separator);
// find the end of the basename
auto const chop_position = strip_extension
diff --git a/src/lib/util/corefile.h b/src/lib/util/corefile.h
index 2c4a5da8217..d286cb866ac 100644
--- a/src/lib/util/corefile.h
+++ b/src/lib/util/corefile.h
@@ -7,11 +7,11 @@
Core file I/O interface functions and definitions.
***************************************************************************/
+#ifndef MAME_LIB_UTIL_COREFILE_H
+#define MAME_LIB_UTIL_COREFILE_H
#pragma once
-#ifndef MAME_LIB_UTIL_COREFILE_H
-#define MAME_LIB_UTIL_COREFILE_H
#include "corestr.h"
#include "coretmpl.h"
@@ -23,6 +23,7 @@
namespace util {
+
/***************************************************************************
ADDITIONAL OPEN FLAGS
***************************************************************************/
@@ -130,6 +131,22 @@ protected:
core_file();
};
+
+/***************************************************************************
+ INLINE FUNCTIONS
+***************************************************************************/
+
+// is a given character a directory separator?
+
+constexpr bool is_directory_separator(char c)
+{
+#if defined(WIN32)
+ return ('\\' == c) || ('/' == c) || (':' == c);
+#else
+ return '/' == c;
+#endif
+}
+
} // namespace util
diff --git a/src/lib/util/corestr.cpp b/src/lib/util/corestr.cpp
index a2fef33a87a..5add3ed302f 100644
--- a/src/lib/util/corestr.cpp
+++ b/src/lib/util/corestr.cpp
@@ -10,6 +10,10 @@
#include "corestr.h"
#include "osdcore.h"
+
+#include <algorithm>
+#include <memory>
+
#include <ctype.h>
#include <stdlib.h>
@@ -236,3 +240,94 @@ int strreplace(std::string &str, const std::string& search, const std::string& r
}
return matches;
}
+
+namespace util {
+
+/**
+ * @fn double edit_distance(std::u32string const &lhs, std::u32string const &rhs)
+ *
+ * @brief Compares strings and returns prefix-weighted similarity score (smaller is more similar).
+ *
+ * @param lhs First input.
+ * @param rhs Second input.
+ *
+ * @return Similarity score ranging from 0.0 (totally dissimilar) to 1.0 (identical).
+ */
+
+double edit_distance(std::u32string const &lhs, std::u32string const &rhs)
+{
+ // based on Jaro-Winkler distance
+ // TODO: this breaks if the lengths don't fit in a long int, but that's not a big limitation
+ constexpr long MAX_PREFIX(4);
+ constexpr double PREFIX_WEIGHT(0.1);
+ constexpr double PREFIX_THRESHOLD(0.7);
+
+ std::u32string const &longer((lhs.length() >= rhs.length()) ? lhs : rhs);
+ std::u32string const &shorter((lhs.length() < rhs.length()) ? lhs : rhs);
+
+ // find matches
+ long const range((std::max)(long(longer.length() / 2) - 1, 0L));
+ std::unique_ptr<long []> match_idx(std::make_unique<long []>(shorter.length()));
+ std::unique_ptr<bool []> match_flg(std::make_unique<bool []>(longer.length()));
+ std::fill_n(match_idx.get(), shorter.length(), -1);
+ std::fill_n(match_flg.get(), longer.length(), false);
+ long match_cnt(0);
+ for (long i = 0; shorter.length() > i; ++i)
+ {
+ char32_t const ch(shorter[i]);
+ long const n((std::min)(i + range + 1L, long(longer.length())));
+ for (long j = (std::max)(i - range, 0L); n > j; ++j)
+ {
+ if (!match_flg[j] && (ch == longer[j]))
+ {
+ match_idx[i] = j;
+ match_flg[j] = true;
+ ++match_cnt;
+ break;
+ }
+ }
+ }
+
+ // early exit if strings are very dissimilar
+ if (!match_cnt)
+ return 1.0;
+
+ // now find transpositions
+ std::unique_ptr<char32_t []> ms(std::make_unique<char32_t []>(2 * match_cnt));
+ std::fill_n(ms.get(), 2 * match_cnt, char32_t(0));
+ char32_t *const ms1(&ms[0]);
+ char32_t *const ms2(&ms[match_cnt]);
+ for (long i = 0, j = 0; shorter.length() > i; ++i)
+ {
+ if (0 <= match_idx[i])
+ ms1[j++] = shorter[i];
+ }
+ match_idx.reset();
+ for (long i = 0, j = 0; longer.length() > i; ++i)
+ {
+ if (match_flg[i])
+ ms2[j++] = longer[i];
+ }
+ match_flg.reset();
+ long halftrans_cnt(0);
+ for (long i = 0; match_cnt > i; ++i)
+ {
+ if (ms1[i] != ms2[i])
+ ++halftrans_cnt;
+ }
+ ms.reset();
+
+ // simple prefix detection
+ long prefix_len(0);
+ for (long i = 0; ((std::min)(long(shorter.length()), MAX_PREFIX) > i) && (lhs[i] == rhs[i]); ++i)
+ ++prefix_len;
+
+ // do the weighting
+ double const m(match_cnt);
+ double const t(double(halftrans_cnt) / 2);
+ double const jaro(((m / lhs.length()) + (m / rhs.length()) + ((m - t) / m)) / 3);
+ double const jaro_winkler((PREFIX_THRESHOLD > jaro) ? jaro : (jaro + (PREFIX_WEIGHT * prefix_len * (1.0 - jaro))));
+ return 1.0 - jaro_winkler;
+}
+
+} // namespace util
diff --git a/src/lib/util/corestr.h b/src/lib/util/corestr.h
index d7734d50b29..c0bf4ef16d5 100644
--- a/src/lib/util/corestr.h
+++ b/src/lib/util/corestr.h
@@ -64,4 +64,11 @@ std::string &strmakeupper(std::string& str);
std::string &strmakelower(std::string& str);
int strreplace(std::string &str, const std::string& search, const std::string& replace);
+namespace util {
+
+// based on Jaro-Winkler distance - returns value from 0.0 (totally dissimilar) to 1.0 (identical)
+double edit_distance(std::u32string const &lhs, std::u32string const &rhs);
+
+} // namespace util
+
#endif // MAME_UTIL_CORESTR_H
diff --git a/src/lib/util/unicode.cpp b/src/lib/util/unicode.cpp
index 5151a1e101d..8e6478beee3 100644
--- a/src/lib/util/unicode.cpp
+++ b/src/lib/util/unicode.cpp
@@ -21,6 +21,67 @@
#include <locale>
+namespace {
+
+//-------------------------------------------------
+// internal_normalize_unicode - uses utf8proc to
+// normalize unicode
+//-------------------------------------------------
+
+std::string internal_normalize_unicode(
+ char const *s,
+ size_t length,
+ unicode_normalization_form normalization_form,
+ bool fold_case,
+ bool null_terminated)
+{
+ // convert the normalization form
+ int options;
+ switch (normalization_form)
+ {
+ case unicode_normalization_form::C:
+ options = UTF8PROC_STABLE | UTF8PROC_COMPOSE;
+ break;
+ case unicode_normalization_form::D:
+ options = UTF8PROC_STABLE | UTF8PROC_DECOMPOSE;
+ break;
+ case unicode_normalization_form::KC:
+ options = UTF8PROC_STABLE | UTF8PROC_COMPOSE | UTF8PROC_COMPAT;
+ break;
+ case unicode_normalization_form::KD:
+ options = UTF8PROC_STABLE | UTF8PROC_DECOMPOSE | UTF8PROC_COMPAT;
+ break;
+ default:
+ throw false;
+ }
+
+ // perform case folding?
+ if (fold_case)
+ options |= UTF8PROC_CASEFOLD;
+
+ // use NUL terminator to determine length?
+ if (null_terminated)
+ options |= UTF8PROC_NULLTERM;
+
+ // invoke utf8proc
+ utf8proc_uint8_t *utf8proc_result(nullptr);
+ utf8proc_ssize_t const utf8proc_result_length(utf8proc_map(reinterpret_cast<utf8proc_uint8_t const *>(s), length, &utf8proc_result, utf8proc_option_t(options)));
+
+ // conver the result
+ std::string result;
+ if (utf8proc_result)
+ {
+ if (utf8proc_result_length > 0)
+ result.assign(reinterpret_cast<char const *>(utf8proc_result), utf8proc_result_length);
+ free(utf8proc_result);
+ }
+
+ return result;
+}
+
+} // anonymous namespace
+
+
//-------------------------------------------------
// uchar_isvalid - return true if a given
// character is a legitimate unicode character
@@ -66,56 +127,53 @@ bool uchar_is_digit(char32_t uchar)
int uchar_from_utf8(char32_t *uchar, const char *utf8char, size_t count)
{
- char32_t c, minchar;
- int auxlen, i;
- char auxchar;
-
// validate parameters
- if (utf8char == nullptr || count == 0)
+ if (!utf8char || !count)
return 0;
// start with the first byte
- c = (unsigned char) *utf8char;
+ char32_t c = (unsigned char)*utf8char;
count--;
utf8char++;
// based on that, determine how many additional bytes we need
- if (c < 0x80)
+ char32_t minchar;
+ int auxlen;
+ if ((c & 0x80) == 0x00)
{
// unicode char 0x00000000 - 0x0000007F
- c &= 0x7f;
auxlen = 0;
minchar = 0x00000000;
}
- else if (c >= 0xc0 && c < 0xe0)
+ else if ((c & 0xe0) == 0xc0)
{
// unicode char 0x00000080 - 0x000007FF
c &= 0x1f;
auxlen = 1;
minchar = 0x00000080;
}
- else if (c >= 0xe0 && c < 0xf0)
+ else if ((c & 0xf0) == 0xe0)
{
// unicode char 0x00000800 - 0x0000FFFF
c &= 0x0f;
auxlen = 2;
minchar = 0x00000800;
}
- else if (c >= 0xf0 && c < 0xf8)
+ else if ((c & 0xf8) == 0xf0)
{
// unicode char 0x00010000 - 0x001FFFFF
c &= 0x07;
auxlen = 3;
minchar = 0x00010000;
}
- else if (c >= 0xf8 && c < 0xfc)
+ else if ((c & 0xfc) == 0xf8)
{
// unicode char 0x00200000 - 0x03FFFFFF
c &= 0x03;
auxlen = 4;
minchar = 0x00200000;
}
- else if (c >= 0xfc && c < 0xfe)
+ else if ((c & 0xfe) == 0xfc)
{
// unicode char 0x04000000 - 0x7FFFFFFF
c &= 0x01;
@@ -133,9 +191,9 @@ int uchar_from_utf8(char32_t *uchar, const char *utf8char, size_t count)
return -1;
// we now know how long the char is, now compute it
- for (i = 0; i < auxlen; i++)
+ for (int i = 0; i < auxlen; i++)
{
- auxchar = utf8char[i];
+ char32_t const auxchar = (unsigned char)utf8char[i];
// all auxillary chars must be between 0x80-0xbf
if ((auxchar & 0xc0) != 0x80)
@@ -206,6 +264,28 @@ int uchar_from_utf16f(char32_t *uchar, const char16_t *utf16char, size_t count)
//-------------------------------------------------
+// ustr_from_utf8 - convert a UTF-8 sequence into
+// into a Unicode string
+//-------------------------------------------------
+
+std::u32string ustr_from_utf8(const std::string &utf8str)
+{
+ std::u32string result;
+ char const *utf8char(utf8str.c_str());
+ size_t remaining(utf8str.length());
+ while (remaining)
+ {
+ char32_t ch;
+ int const consumed(uchar_from_utf8(&ch, utf8char, remaining));
+ result.append(1, (consumed > 0) ? ch : char32_t(0x00fffdU));
+ utf8char += (consumed > 0) ? consumed : 1;
+ remaining -= (consumed > 0) ? consumed : 1;
+ }
+ return result;
+}
+
+
+//-------------------------------------------------
// utf8_from_uchar - convert a unicode character
// into a UTF-8 sequence
//-------------------------------------------------
@@ -388,61 +468,13 @@ std::string utf8_from_wstring(const std::wstring &string)
//-------------------------------------------------
-// internal_normalize_unicode - uses utf8proc to
-// normalize unicode
-//-------------------------------------------------
-
-static std::string internal_normalize_unicode(const char *s, size_t length, unicode_normalization_form normalization_form, bool null_terminated)
-{
- // convert the normalization form
- int options;
- switch (normalization_form)
- {
- case unicode_normalization_form::C:
- options = UTF8PROC_STABLE | UTF8PROC_COMPOSE;
- break;
- case unicode_normalization_form::D:
- options = UTF8PROC_STABLE | UTF8PROC_DECOMPOSE;
- break;
- case unicode_normalization_form::KC:
- options = UTF8PROC_STABLE | UTF8PROC_COMPOSE | UTF8PROC_COMPAT;
- break;
- case unicode_normalization_form::KD:
- options = UTF8PROC_STABLE | UTF8PROC_DECOMPOSE | UTF8PROC_COMPAT;
- break;
- default:
- throw false;
- }
-
- // was this null terminated?
- if (null_terminated)
- options |= UTF8PROC_NULLTERM;
-
- // invoke utf8proc
- utf8proc_uint8_t *utf8proc_result;
- utf8proc_ssize_t utf8proc_result_length = utf8proc_map((utf8proc_uint8_t *) s, length, &utf8proc_result, (utf8proc_option_t)options);
-
- // conver the result
- std::string result;
- if (utf8proc_result)
- {
- if (utf8proc_result_length > 0)
- result = std::string((const char *)utf8proc_result, utf8proc_result_length);
- free(utf8proc_result);
- }
-
- return result;
-}
-
-
-//-------------------------------------------------
// normalize_unicode - uses utf8proc to normalize
// unicode
//-------------------------------------------------
-std::string normalize_unicode(const std::string &s, unicode_normalization_form normalization_form)
+std::string normalize_unicode(const std::string &s, unicode_normalization_form normalization_form, bool fold_case)
{
- return internal_normalize_unicode(s.c_str(), s.length(), normalization_form, false);
+ return internal_normalize_unicode(s.c_str(), s.length(), normalization_form, fold_case, false);
}
@@ -451,9 +483,9 @@ std::string normalize_unicode(const std::string &s, unicode_normalization_form n
// unicode
//-------------------------------------------------
-std::string normalize_unicode(const char *s, unicode_normalization_form normalization_form)
+std::string normalize_unicode(const char *s, unicode_normalization_form normalization_form, bool fold_case)
{
- return internal_normalize_unicode(s, 0, normalization_form, true);
+ return internal_normalize_unicode(s, 0, normalization_form, fold_case, true);
}
@@ -462,9 +494,9 @@ std::string normalize_unicode(const char *s, unicode_normalization_form normaliz
// unicode
//-------------------------------------------------
-std::string normalize_unicode(const char *s, size_t length, unicode_normalization_form normalization_form)
+std::string normalize_unicode(const char *s, size_t length, unicode_normalization_form normalization_form, bool fold_case)
{
- return internal_normalize_unicode(s, length, normalization_form, false);
+ return internal_normalize_unicode(s, length, normalization_form, fold_case, false);
}
diff --git a/src/lib/util/unicode.h b/src/lib/util/unicode.h
index 5e30a74916e..46e1aec3496 100644
--- a/src/lib/util/unicode.h
+++ b/src/lib/util/unicode.h
@@ -14,14 +14,16 @@
singular 32-bit Unicode chars.
***************************************************************************/
+#ifndef MAME_LIB_UTIL_UNICODE_H
+#define MAME_LIB_UTIL_UNICODE_H
#pragma once
-#ifndef UNICODE_H
-#define UNICODE_H
+#include "osdcore.h"
+
+#include <string>
#include <stdlib.h>
-#include "osdcore.h"
@@ -95,6 +97,7 @@ bool uchar_is_digit(char32_t uchar);
int uchar_from_utf8(char32_t *uchar, const char *utf8char, size_t count);
int uchar_from_utf16(char32_t *uchar, const char16_t *utf16char, size_t count);
int uchar_from_utf16f(char32_t *uchar, const char16_t *utf16char, size_t count);
+std::u32string ustr_from_utf8(const std::string &utf8str);
// converting 32-bit Unicode chars to strings
int utf8_from_uchar(char *utf8string, size_t count, char32_t uchar);
@@ -107,9 +110,9 @@ std::wstring wstring_from_utf8(const std::string &utf8string);
std::string utf8_from_wstring(const std::wstring &string);
// unicode normalization
-std::string normalize_unicode(const std::string &s, unicode_normalization_form normalization_form);
-std::string normalize_unicode(const char *s, unicode_normalization_form normalization_form);
-std::string normalize_unicode(const char *s, size_t length, unicode_normalization_form normalization_form);
+std::string normalize_unicode(const std::string &s, unicode_normalization_form normalization_form, bool fold_case = false);
+std::string normalize_unicode(const char *s, unicode_normalization_form normalization_form, bool fold_case = false);
+std::string normalize_unicode(const char *s, size_t length, unicode_normalization_form normalization_form, bool fold_case = false);
// upper and lower case
char32_t uchar_toupper(char32_t ch);
@@ -137,4 +140,4 @@ bool utf8_is_valid_string(const char *utf8string);
#define utf16le_from_uchar utf16f_from_uchar
#endif
-#endif /* UNICODE_H */
+#endif // MAME_LIB_UTIL_UNICODE_H
diff --git a/src/mame/arcade.flt b/src/mame/arcade.flt
index b8f412fb2b5..5f490afbb11 100644
--- a/src/mame/arcade.flt
+++ b/src/mame/arcade.flt
@@ -256,6 +256,7 @@ cpzodiac.cpp
crbaloon.cpp
crgolf.cpp
crimfght.cpp
+cromptons.cpp
crospang.cpp
crshrace.cpp
crystal.cpp
@@ -399,6 +400,7 @@ foodf.cpp
forte2.cpp
fortecar.cpp
freekick.cpp
+freeway.cpp
fresh.cpp
fromanc2.cpp
fromance.cpp
@@ -747,6 +749,7 @@ minivideo.cpp
mirage.cpp
mirax.cpp
missb2.cpp
+missbamby.cpp
missile.cpp
mitchell.cpp
mjkjidai.cpp
@@ -1304,6 +1307,7 @@ unianapc.cpp
unico.cpp
unkfr.cpp
unkhorse.cpp
+unkpoker.cpp
upscope.cpp
usbilliards.cpp
usgames.cpp
diff --git a/src/mame/audio/alesis.cpp b/src/mame/audio/alesis.cpp
index 39fb0609fb6..135a301dae7 100644
--- a/src/mame/audio/alesis.cpp
+++ b/src/mame/audio/alesis.cpp
@@ -41,15 +41,17 @@ alesis_dm3ag_device::alesis_dm3ag_device(const machine_config &mconfig, const ch
// device_add_mconfig
//-------------------------------------------------
-MACHINE_CONFIG_START(alesis_dm3ag_device::device_add_mconfig)
+void alesis_dm3ag_device::device_add_mconfig(machine_config &config)
+{
SPEAKER(config, "lspeaker1").front_left();
SPEAKER(config, "rspeaker1").front_right();
SPEAKER(config, "lspeaker2").front_left();
SPEAKER(config, "rspeaker2").front_right();
- MCFG_DEVICE_ADD("dac", PCM54HP, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker1", 1.0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker1", 1.0) // PCM54HP DAC + R63/R73-75 + Sample and hold
- MCFG_DEVICE_ADD("vref", VOLTAGE_REGULATOR, 0) MCFG_VOLTAGE_REGULATOR_OUTPUT(5.0)
- MCFG_SOUND_ROUTE(0, "dac", 1.0, DAC_VREF_POS_INPUT) MCFG_SOUND_ROUTE(0, "dac", -1.0, DAC_VREF_NEG_INPUT)
-MACHINE_CONFIG_END
+ PCM54HP(config, m_dac, 0).add_route(ALL_OUTPUTS, "lspeaker1", 1.0).add_route(ALL_OUTPUTS, "rspeaker1", 1.0); // PCM54HP DAC + R63/R73-75 + Sample and hold
+ voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref"));
+ vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT);
+ vref.add_route(0, "dac", -1.0, DAC_VREF_NEG_INPUT);
+}
//-------------------------------------------------
// device_start - device-specific startup
diff --git a/src/mame/audio/asteroid.cpp b/src/mame/audio/asteroid.cpp
index bfc5bb773f7..cbae5ac9efb 100644
--- a/src/mame/audio/asteroid.cpp
+++ b/src/mame/audio/asteroid.cpp
@@ -315,11 +315,11 @@ WRITE8_MEMBER(asteroid_state::asteroid_noise_reset_w)
}
-MACHINE_CONFIG_START(asteroid_state::asteroid_sound)
+void asteroid_state::asteroid_sound(machine_config &config)
+{
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("discrete", DISCRETE, asteroid_discrete)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.4)
+ DISCRETE(config, m_discrete, asteroid_discrete).add_route(ALL_OUTPUTS, "mono", 1.4);
ls259_device &audiolatch(LS259(config, "audiolatch")); // M10
audiolatch.q_out_cb<0>().set("discrete", FUNC(discrete_device::write_line<ASTEROID_SAUCER_SND_EN>));
@@ -328,15 +328,15 @@ MACHINE_CONFIG_START(asteroid_state::asteroid_sound)
audiolatch.q_out_cb<3>().set("discrete", FUNC(discrete_device::write_line<ASTEROID_THRUST_EN>));
audiolatch.q_out_cb<4>().set("discrete", FUNC(discrete_device::write_line<ASTEROID_SHIP_FIRE_EN>));
audiolatch.q_out_cb<5>().set("discrete", FUNC(discrete_device::write_line<ASTEROID_LIFE_EN>));
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(asteroid_state::astdelux_sound)
+void asteroid_state::astdelux_sound(machine_config &config)
+{
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("discrete", DISCRETE, astdelux_discrete)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
+ DISCRETE(config, m_discrete, astdelux_discrete).add_route(ALL_OUTPUTS, "mono", 1.0);
ls259_device &audiolatch(LS259(config, "audiolatch")); // M10
audiolatch.q_out_cb<3>().set("discrete", FUNC(discrete_device::write_line<ASTEROID_THRUST_EN>));
-MACHINE_CONFIG_END
+}
diff --git a/src/mame/audio/astrof.cpp b/src/mame/audio/astrof.cpp
index 89e334a6672..663013e1bc8 100644
--- a/src/mame/audio/astrof.cpp
+++ b/src/mame/audio/astrof.cpp
@@ -162,9 +162,10 @@ WRITE8_MEMBER(astrof_state::spfghmk2_audio_w)
}
-MACHINE_CONFIG_START(astrof_state::spfghmk2_audio)
+void astrof_state::spfghmk2_audio(machine_config &config)
+{
/* nothing yet */
-MACHINE_CONFIG_END
+}
diff --git a/src/mame/audio/atarijsa.cpp b/src/mame/audio/atarijsa.cpp
index 23b8dacbf5e..51869806fe1 100644
--- a/src/mame/audio/atarijsa.cpp
+++ b/src/mame/audio/atarijsa.cpp
@@ -364,11 +364,11 @@ READ8_MEMBER( atari_jsa_oki_base_device::oki_r )
{
// JSA IIIs selects the 2nd OKI via the low bit, so select it
if (m_oki2 != nullptr && offset == 1)
- return m_oki2->read(space, offset);
+ return m_oki2->read();
// OKI may not be populated at all
else if (m_oki1 != nullptr)
- return m_oki1->read(space, offset);
+ return m_oki1->read();
// if not present, return all 0xff
return 0xff;
@@ -384,11 +384,11 @@ WRITE8_MEMBER( atari_jsa_oki_base_device::oki_w )
{
// JSA IIIs selects the 2nd OKI via the low bit, so select it
if (m_oki2 != nullptr && offset == 1)
- m_oki2->write(space, offset, data);
+ m_oki2->write(data);
// OKI may not be populated at all
else if (m_oki1 != nullptr)
- m_oki1->write(space, offset, data);
+ m_oki1->write(data);
}
@@ -676,7 +676,7 @@ WRITE8_MEMBER( atari_jsa_i_device::tms5220_voice )
READ8_MEMBER( atari_jsa_i_device::pokey_r )
{
if (m_pokey != nullptr)
- return m_pokey->read(space, offset);
+ return m_pokey->read(offset);
return 0xff;
}
@@ -689,7 +689,7 @@ READ8_MEMBER( atari_jsa_i_device::pokey_r )
WRITE8_MEMBER( atari_jsa_i_device::pokey_w )
{
if (m_pokey != nullptr)
- m_pokey->write(space, offset, data);
+ m_pokey->write(offset, data);
}
@@ -698,8 +698,8 @@ WRITE8_MEMBER( atari_jsa_i_device::pokey_w )
//-------------------------------------------------
// Fully populated JSA-I, not used by anyone
-MACHINE_CONFIG_START(atari_jsa_i_device::device_add_mconfig)
-
+void atari_jsa_i_device::device_add_mconfig(machine_config &config)
+{
// basic machine hardware
M6502(config, m_jsacpu, JSA_MASTER_CLOCK/2);
m_jsacpu->set_addrmap(AS_PROGRAM, &atari_jsa_i_device::atarijsa1_map);
@@ -715,14 +715,14 @@ MACHINE_CONFIG_START(atari_jsa_i_device::device_add_mconfig)
m_ym2151->add_route(0, *this, 0.60, AUTO_ALLOC_INPUT, 0);
m_ym2151->add_route(1, *this, 0.60, AUTO_ALLOC_INPUT, 1);
- MCFG_DEVICE_ADD("pokey", POKEY, JSA_MASTER_CLOCK/2)
- MCFG_MIXER_ROUTE(ALL_OUTPUTS, *this, 0.40, 0)
- MCFG_MIXER_ROUTE(ALL_OUTPUTS, *this, 0.40, 1)
+ POKEY(config, m_pokey, JSA_MASTER_CLOCK/2);
+ m_pokey->add_route(ALL_OUTPUTS, *this, 0.40, AUTO_ALLOC_INPUT, 0);
+ m_pokey->add_route(ALL_OUTPUTS, *this, 0.40, AUTO_ALLOC_INPUT, 1);
- MCFG_DEVICE_ADD("tms", TMS5220C, JSA_MASTER_CLOCK*2/11) // potentially JSA_MASTER_CLOCK/9 as well
- MCFG_MIXER_ROUTE(ALL_OUTPUTS, *this, 1.0, 0)
- MCFG_MIXER_ROUTE(ALL_OUTPUTS, *this, 1.0, 1)
-MACHINE_CONFIG_END
+ TMS5220C(config, m_tms5220, JSA_MASTER_CLOCK*2/11); // potentially JSA_MASTER_CLOCK/9 as well
+ m_tms5220->add_route(ALL_OUTPUTS, *this, 1.0, AUTO_ALLOC_INPUT, 0);
+ m_tms5220->add_route(ALL_OUTPUTS, *this, 1.0, AUTO_ALLOC_INPUT, 1);
+}
//-------------------------------------------------
diff --git a/src/mame/audio/avalnche.cpp b/src/mame/audio/avalnche.cpp
index 3200bd8576f..471c73a8e5c 100644
--- a/src/mame/audio/avalnche.cpp
+++ b/src/mame/audio/avalnche.cpp
@@ -102,25 +102,27 @@ static DISCRETE_SOUND_START(avalnche_discrete)
DISCRETE_SOUND_END
-MACHINE_CONFIG_START(avalnche_state::avalnche_sound)
+void avalnche_state::avalnche_sound(machine_config &config)
+{
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("discrete", DISCRETE, avalnche_discrete)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
+ DISCRETE(config, m_discrete, avalnche_discrete).add_route(ALL_OUTPUTS, "mono", 1.0);
- m_latch->q_out_cb<1>().set("discrete", FUNC(discrete_device::write_line<AVALNCHE_ATTRACT_EN>));
- m_latch->q_out_cb<4>().set("discrete", FUNC(discrete_device::write_line<AVALNCHE_AUD0_EN>));
- m_latch->q_out_cb<5>().set("discrete", FUNC(discrete_device::write_line<AVALNCHE_AUD1_EN>));
- m_latch->q_out_cb<6>().set("discrete", FUNC(discrete_device::write_line<AVALNCHE_AUD2_EN>));
-MACHINE_CONFIG_END
+ m_latch->q_out_cb<1>().set(m_discrete, FUNC(discrete_device::write_line<AVALNCHE_ATTRACT_EN>));
+ m_latch->q_out_cb<4>().set(m_discrete, FUNC(discrete_device::write_line<AVALNCHE_AUD0_EN>));
+ m_latch->q_out_cb<5>().set(m_discrete, FUNC(discrete_device::write_line<AVALNCHE_AUD1_EN>));
+ m_latch->q_out_cb<6>().set(m_discrete, FUNC(discrete_device::write_line<AVALNCHE_AUD2_EN>));
+}
-MACHINE_CONFIG_START(avalnche_state::acatch_sound) // just a stub here...
+void avalnche_state::acatch_sound(machine_config &config)
+{
+ // just a stub here...
m_latch->q_out_cb<1>().set_nop(); // It is attract_enable just like avalnche, but not hooked up yet.
m_latch->q_out_cb<4>().set(FUNC(avalnche_state::catch_aud0_w));
m_latch->q_out_cb<5>().set(FUNC(avalnche_state::catch_aud1_w));
m_latch->q_out_cb<6>().set(FUNC(avalnche_state::catch_aud2_w));
-MACHINE_CONFIG_END
+}
/***************************************************************************
diff --git a/src/mame/audio/bwidow.cpp b/src/mame/audio/bwidow.cpp
index 0384035ff91..e2d2d6c6b2c 100644
--- a/src/mame/audio/bwidow.cpp
+++ b/src/mame/audio/bwidow.cpp
@@ -165,7 +165,7 @@ void bwidow_state::bwidow_audio(machine_config &config)
DISCRETE(config, "discrete", bwidow_discrete).add_route(ALL_OUTPUTS, "mono", 1.0);
- //MCFG_QUANTUM_PERFECT_CPU("pokey1")
+ //config.m_perfect_cpu_quantum = subtag("pokey1");
}
void bwidow_state::gravitar_audio(machine_config &config)
diff --git a/src/mame/audio/cage.cpp b/src/mame/audio/cage.cpp
index 6d4167b254f..71be3313f6a 100644
--- a/src/mame/audio/cage.cpp
+++ b/src/mame/audio/cage.cpp
@@ -119,8 +119,8 @@ atari_cage_device::atari_cage_device(const machine_config &mconfig, const char *
atari_cage_device::atari_cage_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock) :
device_t(mconfig, type, tag, owner, clock),
- m_cageram(*this, "cageram"),
m_cpu(*this, "cpu"),
+ m_cageram(*this, "cageram"),
m_soundlatch(*this, "soundlatch"),
m_dma_timer(*this, "cage_dma_timer"),
m_timer(*this, "cage_timer%u", 0U),
@@ -612,16 +612,16 @@ void atari_cage_seattle_device::cage_map_seattle(address_map &map)
// machine_add_config - add device configuration
//-------------------------------------------------
-MACHINE_CONFIG_START(atari_cage_device::device_add_mconfig)
-
+void atari_cage_device::device_add_mconfig(machine_config &config)
+{
/* basic machine hardware */
TMS32031(config, m_cpu, 33868800);
m_cpu->set_addrmap(AS_PROGRAM, &atari_cage_device::cage_map);
m_cpu->set_mcbl_mode(true);
- MCFG_TIMER_DEVICE_ADD("cage_dma_timer", DEVICE_SELF, atari_cage_device, dma_timer_callback)
- MCFG_TIMER_DEVICE_ADD("cage_timer0", DEVICE_SELF, atari_cage_device, cage_timer_callback)
- MCFG_TIMER_DEVICE_ADD("cage_timer1", DEVICE_SELF, atari_cage_device, cage_timer_callback)
+ TIMER(config, m_dma_timer).configure_generic(DEVICE_SELF, FUNC(atari_cage_device::dma_timer_callback));
+ TIMER(config, m_timer[0]).configure_generic(DEVICE_SELF, FUNC(atari_cage_device::cage_timer_callback));
+ TIMER(config, m_timer[1]).configure_generic(DEVICE_SELF, FUNC(atari_cage_device::cage_timer_callback));
/* sound hardware */
SPEAKER(config, "lspeaker").front_left();
@@ -630,25 +630,19 @@ MACHINE_CONFIG_START(atari_cage_device::device_add_mconfig)
GENERIC_LATCH_16(config, m_soundlatch);
#if (DAC_BUFFER_CHANNELS == 4)
- MCFG_DEVICE_ADD("dac1", DMADAC)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 0.50)
+ DMADAC(config, m_dmadac[0]).add_route(ALL_OUTPUTS, "rspeaker", 0.50);
- MCFG_DEVICE_ADD("dac2", DMADAC)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 0.50)
+ DMADAC(config, m_dmadac[1]).add_route(ALL_OUTPUTS, "lspeaker", 0.50);
- MCFG_DEVICE_ADD("dac3", DMADAC)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 0.50)
+ DMADAC(config, m_dmadac[2]).add_route(ALL_OUTPUTS, "lspeaker", 0.50);
- MCFG_DEVICE_ADD("dac4", DMADAC)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 0.50)
+ DMADAC(config, m_dmadac[3]).add_route(ALL_OUTPUTS, "rspeaker", 0.50);
#else
- MCFG_DEVICE_ADD("dac1", DMADAC)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 1.0)
+ DMADAC(config, m_dmadac[0]).add_route(ALL_OUTPUTS, "lspeaker", 1.0);
- MCFG_DEVICE_ADD("dac2", DMADAC)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 1.0)
+ DMADAC(config, m_dmadac[1]).add_route(ALL_OUTPUTS, "rspeaker", 1.0);
#endif
-MACHINE_CONFIG_END
+}
DEFINE_DEVICE_TYPE(ATARI_CAGE_SEATTLE, atari_cage_seattle_device, "atari_cage_seattle", "Atari CAGE Seattle")
@@ -669,10 +663,9 @@ atari_cage_seattle_device::atari_cage_seattle_device(const machine_config &mconf
//-------------------------------------------------
-MACHINE_CONFIG_START(atari_cage_seattle_device::device_add_mconfig)
-
+void atari_cage_seattle_device::device_add_mconfig(machine_config &config)
+{
atari_cage_device::device_add_mconfig(config);
- MCFG_DEVICE_MODIFY("cpu")
- MCFG_DEVICE_PROGRAM_MAP(cage_map_seattle)
-MACHINE_CONFIG_END
+ m_cpu->set_addrmap(AS_PROGRAM, &atari_cage_seattle_device::cage_map_seattle);
+}
diff --git a/src/mame/audio/cage.h b/src/mame/audio/cage.h
index e8230aae377..66c86f06cba 100644
--- a/src/mame/audio/cage.h
+++ b/src/mame/audio/cage.h
@@ -64,9 +64,10 @@ protected:
TIMER_DEVICE_CALLBACK_MEMBER( dma_timer_callback );
TIMER_DEVICE_CALLBACK_MEMBER( cage_timer_callback );
+ required_device<tms32031_device> m_cpu;
+
private:
required_shared_ptr<uint32_t> m_cageram;
- required_device<tms32031_device> m_cpu;
required_device<generic_latch_16_device> m_soundlatch;
required_device<timer_device> m_dma_timer;
required_device_array<timer_device, 2> m_timer;
diff --git a/src/mame/audio/carnival.cpp b/src/mame/audio/carnival.cpp
index d3bc5db7cc7..4709c274de4 100644
--- a/src/mame/audio/carnival.cpp
+++ b/src/mame/audio/carnival.cpp
@@ -162,9 +162,9 @@ void vicdual_state::carnival_psg_latch(address_space &space)
{
// BDIR W, BC1 selects address or data
if (m_psgBus & 2)
- m_psg->address_w(space, 0, m_psgData);
+ m_psg->address_w(m_psgData);
else
- m_psg->data_w(space, 0, m_psgData);
+ m_psg->data_w(m_psgData);
}
}
diff --git a/src/mame/audio/cmi01a.cpp b/src/mame/audio/cmi01a.cpp
index ad3899ac48a..0ec40b75a69 100644
--- a/src/mame/audio/cmi01a.cpp
+++ b/src/mame/audio/cmi01a.cpp
@@ -26,7 +26,8 @@ cmi01a_device::cmi01a_device(const machine_config &mconfig, const char *tag, dev
{
}
-MACHINE_CONFIG_START(cmi01a_device::device_add_mconfig)
+void cmi01a_device::device_add_mconfig(machine_config &config)
+{
PIA6821(config, m_pia[0], 0); // pia_cmi01a_1_config
m_pia[0]->readcb1_handler().set(FUNC(cmi01a_device::tri_r));
m_pia[0]->writepa_handler().set(FUNC(cmi01a_device::ws_dir_w));
@@ -49,9 +50,8 @@ MACHINE_CONFIG_START(cmi01a_device::device_add_mconfig)
m_ptm->o1_callback().set(FUNC(cmi01a_device::ptm_o1));
m_ptm->irq_callback().set("cmi01a_irq", FUNC(input_merger_device::in_w<4>));
- MCFG_INPUT_MERGER_ANY_HIGH("cmi01a_irq")
- MCFG_INPUT_MERGER_OUTPUT_HANDLER(WRITELINE(*this, cmi01a_device, cmi01a_irq))
-MACHINE_CONFIG_END
+ INPUT_MERGER_ANY_HIGH(config, "cmi01a_irq").output_handler().set(FUNC(cmi01a_device::cmi01a_irq));
+}
void cmi01a_device::sound_stream_update(sound_stream &stream, stream_sample_t **inputs, stream_sample_t **outputs, int samples)
@@ -124,21 +124,21 @@ WRITE_LINE_MEMBER( cmi01a_device::pia_0_ca2_w )
}
}
-WRITE8_MEMBER( cmi01a_device::pia_1_a_w )
+void cmi01a_device::pia_1_a_w(uint8_t data)
{
// top two
}
-WRITE8_MEMBER( cmi01a_device::pia_1_b_w )
+void cmi01a_device::pia_1_b_w(uint8_t data)
{
}
-WRITE8_MEMBER( cmi01a_device::rp_w )
+void cmi01a_device::rp_w(uint8_t data)
{
m_rp = data;
}
-WRITE8_MEMBER( cmi01a_device::ws_dir_w )
+void cmi01a_device::ws_dir_w(uint8_t data)
{
m_ws = data & 0x7f;
m_dir = (data >> 7) & 1;
@@ -304,7 +304,7 @@ READ_LINE_MEMBER( cmi01a_device::zx_r )
return m_segment_cnt & 0x40;
}
-WRITE8_MEMBER( cmi01a_device::write )
+void cmi01a_device::write(offs_t offset, uint8_t data)
{
//printf("C%d W: %02x = %02x\n", m_channel, offset, data);
@@ -335,11 +335,11 @@ WRITE8_MEMBER( cmi01a_device::write )
break;
case 0x8: case 0x9: case 0xa: case 0xb:
- m_pia[0]->write(space, offset & 3, data);
+ m_pia[0]->write(offset & 3, data);
break;
case 0xc: case 0xd: case 0xe: case 0xf:
- m_pia[1]->write(space, (BIT(offset, 0) << 1) | BIT(offset, 1), data);
+ m_pia[1]->write((BIT(offset, 0) << 1) | BIT(offset, 1), data);
break;
case 0x10: case 0x11: case 0x12: case 0x13: case 0x14: case 0x15: case 0x16: case 0x17:
@@ -350,7 +350,7 @@ WRITE8_MEMBER( cmi01a_device::write )
int a2 = BIT(offset, 1);
//printf("CH%d PTM W: [%x] = %02x\n", m_channel, (a2 << 2) | (a1 << 1) | a0, data);
- m_ptm->write(space, (a2 << 2) | (a1 << 1) | a0, data);
+ m_ptm->write((a2 << 2) | (a1 << 1) | a0, data);
break;
}
@@ -360,7 +360,7 @@ WRITE8_MEMBER( cmi01a_device::write )
}
}
-READ8_MEMBER( cmi01a_device::read )
+uint8_t cmi01a_device::read(offs_t offset)
{
if (machine().side_effects_disabled())
return 0;
@@ -392,11 +392,11 @@ READ8_MEMBER( cmi01a_device::read )
break;
case 0x8: case 0x9: case 0xa: case 0xb:
- data = m_pia[0]->read(space, offset & 3);
+ data = m_pia[0]->read(offset & 3);
break;
case 0xc: case 0xd: case 0xe: case 0xf:
- data = m_pia[1]->read(space, (BIT(offset, 0) << 1) | BIT(offset, 1));
+ data = m_pia[1]->read((BIT(offset, 0) << 1) | BIT(offset, 1));
break;
case 0x10: case 0x11: case 0x12: case 0x13: case 0x14: case 0x15: case 0x16: case 0x17:
@@ -405,7 +405,7 @@ READ8_MEMBER( cmi01a_device::read )
int a1 = (m_ptm_o1 && BIT(offset, 3)) || (!BIT(offset, 3) && BIT(offset, 2));
int a2 = BIT(offset, 1);
- data = m_ptm->read(space, (a2 << 2) | (a1 << 1) | a0);
+ data = m_ptm->read((a2 << 2) | (a1 << 1) | a0);
//printf("CH%d PTM R: [%x] %02x\n", m_channel, (a2 << 2) | (a1 << 1) | a0, data);
break;
diff --git a/src/mame/audio/cmi01a.h b/src/mame/audio/cmi01a.h
index 97685b7f624..a0bfb603418 100644
--- a/src/mame/audio/cmi01a.h
+++ b/src/mame/audio/cmi01a.h
@@ -22,8 +22,8 @@ public:
auto irq_callback() { return m_irq_cb.bind(); }
- DECLARE_WRITE8_MEMBER( write );
- DECLARE_READ8_MEMBER( read );
+ void write(offs_t offset, uint8_t data);
+ uint8_t read(offs_t offset);
virtual void sound_stream_update(sound_stream &stream, stream_sample_t **inputs, stream_sample_t **outputs, int samples) override;
@@ -71,16 +71,16 @@ private:
devcb_write_line m_irq_cb;
- DECLARE_WRITE8_MEMBER( rp_w );
- DECLARE_WRITE8_MEMBER( ws_dir_w );
+ void rp_w(uint8_t data);
+ void ws_dir_w(uint8_t data);
DECLARE_READ_LINE_MEMBER( tri_r );
DECLARE_WRITE_LINE_MEMBER( pia_0_ca2_w );
DECLARE_WRITE_LINE_MEMBER( pia_0_cb2_w );
DECLARE_READ_LINE_MEMBER( eosi_r );
DECLARE_READ_LINE_MEMBER( zx_r );
- DECLARE_WRITE8_MEMBER( pia_1_a_w );
- DECLARE_WRITE8_MEMBER( pia_1_b_w );
+ void pia_1_a_w(uint8_t data);
+ void pia_1_b_w(uint8_t data);
DECLARE_WRITE_LINE_MEMBER( ptm_o1 );
};
diff --git a/src/mame/audio/csd.cpp b/src/mame/audio/csd.cpp
index 416c3143353..9baf3792fed 100644
--- a/src/mame/audio/csd.cpp
+++ b/src/mame/audio/csd.cpp
@@ -36,9 +36,10 @@ void midway_cheap_squeak_deluxe_device::csdeluxe_map(address_map &map)
// machine configuration
//-------------------------------------------------
-MACHINE_CONFIG_START(midway_cheap_squeak_deluxe_device::device_add_mconfig)
- MCFG_DEVICE_ADD("cpu", M68000, DERIVED_CLOCK(1, 2))
- MCFG_DEVICE_PROGRAM_MAP(csdeluxe_map)
+void midway_cheap_squeak_deluxe_device::device_add_mconfig(machine_config &config)
+{
+ M68000(config, m_cpu, DERIVED_CLOCK(1, 2));
+ m_cpu->set_addrmap(AS_PROGRAM, &midway_cheap_squeak_deluxe_device::csdeluxe_map);
PIA6821(config, m_pia, 0);
m_pia->writepa_handler().set(FUNC(midway_cheap_squeak_deluxe_device::porta_w));
@@ -46,10 +47,11 @@ MACHINE_CONFIG_START(midway_cheap_squeak_deluxe_device::device_add_mconfig)
m_pia->irqa_handler().set(FUNC(midway_cheap_squeak_deluxe_device::irq_w));
m_pia->irqb_handler().set(FUNC(midway_cheap_squeak_deluxe_device::irq_w));
- MCFG_DEVICE_ADD("dac", AD7533, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, *this, 1.0)
- MCFG_DEVICE_ADD("vref", VOLTAGE_REGULATOR, 0) MCFG_VOLTAGE_REGULATOR_OUTPUT(5.0)
- MCFG_SOUND_ROUTE(0, "dac", 1.0, DAC_VREF_POS_INPUT) MCFG_SOUND_ROUTE(0, "dac", -1.0, DAC_VREF_NEG_INPUT)
-MACHINE_CONFIG_END
+ AD7533(config, m_dac, 0).add_route(ALL_OUTPUTS, *this, 1.0);
+ voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref"));
+ vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT);
+ vref.add_route(0, "dac", -1.0, DAC_VREF_NEG_INPUT);
+}
//-------------------------------------------------
// rom_region - device-specific ROM region
@@ -116,7 +118,7 @@ void midway_cheap_squeak_deluxe_device::suspend_cpu()
// stat_r - return the status value
//-------------------------------------------------
-READ8_MEMBER( midway_cheap_squeak_deluxe_device::stat_r )
+u8 midway_cheap_squeak_deluxe_device::stat_r()
{
return m_status;
}
@@ -125,7 +127,7 @@ READ8_MEMBER( midway_cheap_squeak_deluxe_device::stat_r )
// sr_w - external 4-bit write to the input latch
//-------------------------------------------------
-WRITE8_MEMBER( midway_cheap_squeak_deluxe_device::sr_w )
+void midway_cheap_squeak_deluxe_device::sr_w(u8 data)
{
m_pia->write_portb(data & 0x0f);
}
diff --git a/src/mame/audio/csd.h b/src/mame/audio/csd.h
index 0fb5a2f16a7..c532863e151 100644
--- a/src/mame/audio/csd.h
+++ b/src/mame/audio/csd.h
@@ -32,8 +32,8 @@ public:
void suspend_cpu();
// read/write
- DECLARE_READ8_MEMBER(stat_r);
- DECLARE_WRITE8_MEMBER(sr_w);
+ u8 stat_r();
+ void sr_w(u8 data);
DECLARE_WRITE_LINE_MEMBER(sirq_w);
DECLARE_WRITE_LINE_MEMBER(reset_w);
diff --git a/src/mame/audio/exidy.cpp b/src/mame/audio/exidy.cpp
index 99511cfe215..df55e898700 100644
--- a/src/mame/audio/exidy.cpp
+++ b/src/mame/audio/exidy.cpp
@@ -750,9 +750,10 @@ void venture_sound_device::venture_audio_map(address_map &map)
}
-MACHINE_CONFIG_START(venture_sound_device::device_add_mconfig)
- MCFG_DEVICE_ADD("audiocpu", M6502, 3579545/4)
- MCFG_DEVICE_PROGRAM_MAP(venture_audio_map)
+void venture_sound_device::device_add_mconfig(machine_config &config)
+{
+ m6502_device &audiocpu(M6502(config, "audiocpu", 3579545/4));
+ audiocpu.set_addrmap(AS_PROGRAM, &venture_sound_device::venture_audio_map);
RIOT6532(config, m_riot, SH6532_CLOCK);
m_riot->in_pa_callback().set(FUNC(venture_sound_device::r6532_porta_r));
@@ -768,14 +769,12 @@ MACHINE_CONFIG_START(venture_sound_device::device_add_mconfig)
m_pia->cb2_handler().set(FUNC(venture_sound_device::pia_cb2_w));
m_pia->irqb_handler().set("audioirq", FUNC(input_merger_device::in_w<1>));
- MCFG_INPUT_MERGER_ANY_HIGH("audioirq") // open collector
- MCFG_INPUT_MERGER_OUTPUT_HANDLER(INPUTLINE("audiocpu", m6502_device::IRQ_LINE))
+ INPUT_MERGER_ANY_HIGH(config, "audioirq").output_handler().set_inputline("audiocpu", m6502_device::IRQ_LINE); // open collector
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_MODIFY(DEVICE_SELF)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.50)
-MACHINE_CONFIG_END
+ this->add_route(ALL_OUTPUTS, "mono", 0.50);
+}
@@ -834,17 +833,17 @@ void mtrap_sound_device::cvsd_iomap(address_map &map)
}
-MACHINE_CONFIG_START(mtrap_sound_device::device_add_mconfig)
+void mtrap_sound_device::device_add_mconfig(machine_config &config)
+{
venture_sound_device::device_add_mconfig(config);
- MCFG_DEVICE_ADD("cvsdcpu", Z80, CVSD_Z80_CLOCK)
- MCFG_DEVICE_PROGRAM_MAP(cvsd_map)
- MCFG_DEVICE_IO_MAP(cvsd_iomap)
+ Z80(config, m_cvsdcpu, CVSD_Z80_CLOCK);
+ m_cvsdcpu->set_addrmap(AS_PROGRAM, &mtrap_sound_device::cvsd_map);
+ m_cvsdcpu->set_addrmap(AS_IO, &mtrap_sound_device::cvsd_iomap);
/* audio hardware */
- MCFG_DEVICE_ADD("cvsd", MC3417, CVSD_CLOCK)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.80)
-MACHINE_CONFIG_END
+ MC3417(config, m_cvsd, CVSD_CLOCK).add_route(ALL_OUTPUTS, "mono", 0.80);
+}
/*************************************
@@ -981,9 +980,10 @@ void victory_sound_device::victory_audio_map(address_map &map)
}
-MACHINE_CONFIG_START(victory_sound_device::device_add_mconfig)
- MCFG_DEVICE_ADD("audiocpu", M6502, VICTORY_AUDIO_CPU_CLOCK)
- MCFG_DEVICE_PROGRAM_MAP(victory_audio_map)
+void victory_sound_device::device_add_mconfig(machine_config &config)
+{
+ m6502_device &audiocpu(M6502(config, "audiocpu", VICTORY_AUDIO_CPU_CLOCK));
+ audiocpu.set_addrmap(AS_PROGRAM, &victory_sound_device::victory_audio_map);
RIOT6532(config, m_riot, SH6532_CLOCK);
m_riot->in_pa_callback().set(FUNC(victory_sound_device::r6532_porta_r));
@@ -997,14 +997,11 @@ MACHINE_CONFIG_START(victory_sound_device::device_add_mconfig)
m_pia->cb2_handler().set(FUNC(victory_sound_device::main_ack_w));
m_pia->irqb_handler().set("audioirq", FUNC(input_merger_device::in_w<1>));
- MCFG_INPUT_MERGER_ANY_HIGH("audioirq") // open collector
- MCFG_INPUT_MERGER_OUTPUT_HANDLER(INPUTLINE("audiocpu", m6502_device::IRQ_LINE))
+ INPUT_MERGER_ANY_HIGH(config, "audioirq").output_handler().set_inputline("audiocpu", m6502_device::IRQ_LINE); // open collector
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_MODIFY(DEVICE_SELF)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
+ this->add_route(ALL_OUTPUTS, "mono", 1.0);
- MCFG_DEVICE_ADD("tms", TMS5220, 640000)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
-MACHINE_CONFIG_END
+ TMS5220(config, m_tms, 640000).add_route(ALL_OUTPUTS, "mono", 1.0);
+}
diff --git a/src/mame/audio/exidy440.cpp b/src/mame/audio/exidy440.cpp
index 59920448465..df7c35fb084 100644
--- a/src/mame/audio/exidy440.cpp
+++ b/src/mame/audio/exidy440.cpp
@@ -98,22 +98,19 @@ exidy440_sound_device::exidy440_sound_device(const machine_config &mconfig, cons
// device_add_mconfig - add device configuration
//-------------------------------------------------
-MACHINE_CONFIG_START(exidy440_sound_device::device_add_mconfig)
- MCFG_DEVICE_ADD("audiocpu", MC6809, EXIDY440_AUDIO_CLOCK)
- MCFG_DEVICE_PROGRAM_MAP(exidy440_audio_map)
+void exidy440_sound_device::device_add_mconfig(machine_config &config)
+{
+ MC6809(config, m_audiocpu, EXIDY440_AUDIO_CLOCK);
+ m_audiocpu->set_addrmap(AS_PROGRAM, &exidy440_sound_device::exidy440_audio_map);
-// MCFG_DEVICE_ADD("cvsd1", MC3418, EXIDY440_MC3418_CLOCK)
-// MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 1.0)
+// MC3418(config, "cvsd1", EXIDY440_MC3418_CLOCK).add_route(ALL_OUTPUTS, "lspeaker", 1.0);
-// MCFG_DEVICE_ADD("cvsd2", MC3418, EXIDY440_MC3418_CLOCK)
-// MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 1.0)
+// MC3418(config, "cvsd2", EXIDY440_MC3418_CLOCK).add_route(ALL_OUTPUTS, "rspeaker", 1.0);
-// MCFG_DEVICE_ADD("cvsd3", MC3417, EXIDY440_MC3417_CLOCK)
-// MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 1.0)
+// MC3417(config, "cvsd3", EXIDY440_MC3417_CLOCK).add_route(ALL_OUTPUTS, "lspeaker", 1.0);
-// MCFG_DEVICE_ADD("cvsd4", MC3417, EXIDY440_MC3417_CLOCK)
-// MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 1.0)
-MACHINE_CONFIG_END
+// MC3417(config, "cvsd4", EXIDY440_MC3417_CLOCK).add_route(ALL_OUTPUTS, "rspeaker", 1.0);
+}
//-------------------------------------------------
// device_start - device-specific startup
diff --git a/src/mame/audio/gottlieb.cpp b/src/mame/audio/gottlieb.cpp
index 4b448f28c6d..8eab2d6b027 100644
--- a/src/mame/audio/gottlieb.cpp
+++ b/src/mame/audio/gottlieb.cpp
@@ -2,7 +2,7 @@
// copyright-holders:Aaron Giles
/***************************************************************************
- gottlieb.c
+ gottlieb.cpp
Gottlieb 6502-based sound hardware implementations.
@@ -87,7 +87,7 @@ void gottlieb_sound_r0_device::gottlieb_sound_r0_map(address_map &map)
{
map.global_mask(0x0fff);
map(0x0000, 0x003f).ram().mirror(0x1c0);
- map(0x0200, 0x020f).rw("r6530", FUNC(mos6530_device::read), FUNC(mos6530_device::write));
+ map(0x0200, 0x020f).rw(m_r6530, FUNC(mos6530_device::read), FUNC(mos6530_device::write));
map(0x0400, 0x0fff).rom();
}
@@ -115,21 +115,23 @@ INPUT_CHANGED_MEMBER( gottlieb_sound_r0_device::audio_nmi )
// device_add_mconfig - add device configuration
//-------------------------------------------------
-MACHINE_CONFIG_START(gottlieb_sound_r0_device::device_add_mconfig)
+void gottlieb_sound_r0_device::device_add_mconfig(machine_config &config)
+{
// audio CPU
- MCFG_DEVICE_ADD("audiocpu", M6502, SOUND1_CLOCK/4) // M6503 - clock is a gate, a resistor and a capacitor. Freq unknown.
- MCFG_DEVICE_PROGRAM_MAP(gottlieb_sound_r0_map)
+ M6502(config, m_audiocpu, SOUND1_CLOCK/4); // M6503 - clock is a gate, a resistor and a capacitor. Freq unknown.
+ m_audiocpu->set_addrmap(AS_PROGRAM, &gottlieb_sound_r0_device::gottlieb_sound_r0_map);
// I/O configuration
- MCFG_DEVICE_ADD("r6530", MOS6530, SOUND1_CLOCK/4) // unknown - same as cpu
- MCFG_MOS6530_OUT_PA_CB(WRITE8("dac", dac_byte_interface, data_w))
- MCFG_MOS6530_IN_PB_CB(READ8(*this, gottlieb_sound_r0_device, r6530b_r))
+ MOS6530(config, m_r6530, SOUND1_CLOCK/4); // unknown - same as cpu
+ m_r6530->out_pa_callback().set("dac", FUNC(dac_byte_interface::data_w));
+ m_r6530->in_pb_callback().set(FUNC(gottlieb_sound_r0_device::r6530b_r));
// sound devices
- MCFG_DEVICE_ADD("dac", DAC_8BIT_R2R, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, *this, 0.25) // unknown DAC
- MCFG_DEVICE_ADD("vref", VOLTAGE_REGULATOR, 0) MCFG_VOLTAGE_REGULATOR_OUTPUT(5.0)
- MCFG_SOUND_ROUTE(0, "dac", 1.0, DAC_VREF_POS_INPUT) MCFG_SOUND_ROUTE(0, "dac", -1.0, DAC_VREF_NEG_INPUT)
-MACHINE_CONFIG_END
+ DAC_8BIT_R2R(config, "dac", 0).add_route(ALL_OUTPUTS, *this, 0.25); // unknown DAC
+ voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref"));
+ vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT);
+ vref.add_route(0, "dac", -1.0, DAC_VREF_NEG_INPUT);
+}
//-------------------------------------------------
@@ -243,10 +245,11 @@ INPUT_PORTS_END
// device_add_mconfig - add device configuration
//-------------------------------------------------
-MACHINE_CONFIG_START(gottlieb_sound_r1_device::device_add_mconfig)
+void gottlieb_sound_r1_device::device_add_mconfig(machine_config &config)
+{
// audio CPU
- MCFG_DEVICE_ADD("audiocpu", M6502, SOUND1_CLOCK/4) // the board can be set to /2 as well
- MCFG_DEVICE_PROGRAM_MAP(gottlieb_sound_r1_map)
+ m6502_device &audiocpu(M6502(config, "audiocpu", SOUND1_CLOCK/4)); // the board can be set to /2 as well
+ audiocpu.set_addrmap(AS_PROGRAM, &gottlieb_sound_r1_device::gottlieb_sound_r1_map);
INPUT_MERGER_ANY_HIGH(config, "nmi").output_handler().set_inputline("audiocpu", INPUT_LINE_NMI);
@@ -257,10 +260,11 @@ MACHINE_CONFIG_START(gottlieb_sound_r1_device::device_add_mconfig)
m_riot->irq_callback().set_inputline("audiocpu", M6502_IRQ_LINE);
// sound devices
- MCFG_DEVICE_ADD("dac", DAC_8BIT_R2R, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, *this, 0.25) // unknown DAC
- MCFG_DEVICE_ADD("vref", VOLTAGE_REGULATOR, 0) MCFG_VOLTAGE_REGULATOR_OUTPUT(5.0)
- MCFG_SOUND_ROUTE(0, "dac", 1.0, DAC_VREF_POS_INPUT) MCFG_SOUND_ROUTE(0, "dac", -1.0, DAC_VREF_NEG_INPUT)
-MACHINE_CONFIG_END
+ DAC_8BIT_R2R(config, "dac", 0).add_route(ALL_OUTPUTS, *this, 0.25); // unknown DAC
+ voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref"));
+ vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT);
+ vref.add_route(0, "dac", -1.0, DAC_VREF_NEG_INPUT);
+}
//-------------------------------------------------
@@ -354,8 +358,8 @@ void gottlieb_sound_r1_with_votrax_device::device_post_load()
WRITE8_MEMBER( gottlieb_sound_r1_with_votrax_device::votrax_data_w )
{
- m_votrax->inflection_w(space, offset, data >> 6);
- m_votrax->write(space, offset, ~data & 0x3f);
+ m_votrax->inflection_w(data >> 6);
+ m_votrax->write(~data & 0x3f);
}
@@ -543,9 +547,9 @@ WRITE8_MEMBER( gottlieb_sound_r2_device::speech_control_w )
// bit 3 selects which of the two 8913 to enable
// bit 4 goes to the 8913 BC1 pin
if ((data & 0x08) != 0)
- m_ay1->data_address_w(space, data >> 4, m_psg_latch);
+ m_ay1->data_address_w(data >> 4, m_psg_latch);
else
- m_ay2->data_address_w(space, data >> 4, m_psg_latch);
+ m_ay2->data_address_w(data >> 4, m_psg_latch);
}
}
else
@@ -557,8 +561,8 @@ WRITE8_MEMBER( gottlieb_sound_r2_device::speech_control_w )
else
{
ay8913_device *ay = (data & 0x08) ? m_ay1 : m_ay2;
- ay->address_w(space, 0, m_psg_latch);
- ay->data_w(space, 0, m_psg_data_latch);
+ ay->address_w(m_psg_latch);
+ ay->data_w(m_psg_data_latch);
}
}
@@ -651,28 +655,27 @@ INPUT_PORTS_END
// device_add_mconfig - add device configuration
//-------------------------------------------------
-MACHINE_CONFIG_START(gottlieb_sound_r2_device::device_add_mconfig)
+void gottlieb_sound_r2_device::device_add_mconfig(machine_config &config)
+{
// audio CPUs
- MCFG_DEVICE_ADD("audiocpu", M6502, SOUND2_CLOCK/4)
- MCFG_DEVICE_PROGRAM_MAP(gottlieb_sound_r2_map)
+ M6502(config, m_audiocpu, SOUND2_CLOCK/4);
+ m_audiocpu->set_addrmap(AS_PROGRAM, &gottlieb_sound_r2_device::gottlieb_sound_r2_map);
- MCFG_DEVICE_ADD("speechcpu", M6502, SOUND2_CLOCK/4)
- MCFG_DEVICE_PROGRAM_MAP(gottlieb_speech_r2_map)
+ M6502(config, m_speechcpu, SOUND2_CLOCK/4);
+ m_speechcpu->set_addrmap(AS_PROGRAM, &gottlieb_sound_r2_device::gottlieb_speech_r2_map);
// sound hardware
- MCFG_DEVICE_ADD("dac", DAC_8BIT_R2R, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, *this, 0.075) // unknown DAC
- MCFG_DEVICE_ADD("dacvol", DAC_8BIT_R2R, 0) // unknown DAC
- MCFG_SOUND_ROUTE(0, "dac", 1.0, DAC_VREF_POS_INPUT) MCFG_SOUND_ROUTE(0, "dac", -1.0, DAC_VREF_NEG_INPUT)
- MCFG_DEVICE_ADD("vref", VOLTAGE_REGULATOR, 0) MCFG_VOLTAGE_REGULATOR_OUTPUT(5.0)
- MCFG_SOUND_ROUTE(0, "dacvol", 1.0, DAC_VREF_POS_INPUT)
+ DAC_8BIT_R2R(config, "dac", 0).add_route(ALL_OUTPUTS, *this, 0.075); // unknown DAC
+ DAC_8BIT_R2R(config, "dacvol", 0).add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT).add_route(0, "dac", -1.0, DAC_VREF_NEG_INPUT); // unknown DAC
+ voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref"));
+ vref.add_route(0, "dacvol", 1.0, DAC_VREF_POS_INPUT);
AY8913(config, m_ay1, SOUND2_CLOCK/2).add_route(ALL_OUTPUTS, *this, 0.15);
AY8913(config, m_ay2, SOUND2_CLOCK/2).add_route(ALL_OUTPUTS, *this, 0.15);
- MCFG_DEVICE_ADD("spsnd", SP0250, SOUND2_SPEECH_CLOCK)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, *this, 1.0)
-MACHINE_CONFIG_END
+ SP0250(config, m_sp0250, SOUND2_SPEECH_CLOCK).add_route(ALL_OUTPUTS, *this, 1.0);
+}
//-------------------------------------------------
diff --git a/src/mame/audio/harddriv.cpp b/src/mame/audio/harddriv.cpp
index 598ff034ea9..6f14ca96460 100644
--- a/src/mame/audio/harddriv.cpp
+++ b/src/mame/audio/harddriv.cpp
@@ -179,7 +179,7 @@ READ16_MEMBER(harddriv_sound_board_device::hdsnd68k_status_r)
// D14 = 'Sound Flag'
// D13 = Test Switch
// D12 = 5220 Ready Flag (0=Ready)
- logerror("%s:hdsnd68k_status_r(%04X)\n", machine().describe_context(), offset);
+ //logerror("%s:hdsnd68k_status_r(%04X)\n", machine().describe_context(), offset);
return (m_mainflag << 15) | (m_soundflag << 14) | 0x2000 | 0;//((ioport("IN0")->read() & 0x0020) << 8) | 0;
}
@@ -432,8 +432,8 @@ void harddriv_sound_board_device::driversnd_dsp_io_map(address_map &map)
// device_add_mconfig - add device configuration
//-------------------------------------------------
-MACHINE_CONFIG_START(harddriv_sound_board_device::device_add_mconfig)
-
+void harddriv_sound_board_device::device_add_mconfig(machine_config &config)
+{
/* basic machine hardware */
M68000(config, m_soundcpu, 16_MHz_XTAL/2);
m_soundcpu->set_addrmap(AS_PROGRAM, &harddriv_sound_board_device::driversnd_68k_map);
@@ -455,7 +455,8 @@ MACHINE_CONFIG_START(harddriv_sound_board_device::device_add_mconfig)
/* sound hardware */
SPEAKER(config, "speaker").front_center();
- MCFG_DEVICE_ADD("dac", AM6012, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 0.5) // ls374d.75e + ls374d.90e + am6012
- MCFG_DEVICE_ADD("vref", VOLTAGE_REGULATOR, 0) MCFG_VOLTAGE_REGULATOR_OUTPUT(5.0)
- MCFG_SOUND_ROUTE(0, "dac", 1.0, DAC_VREF_POS_INPUT) MCFG_SOUND_ROUTE(0, "dac", -1.0, DAC_VREF_NEG_INPUT)
-MACHINE_CONFIG_END
+ AM6012(config, m_dac, 0).add_route(ALL_OUTPUTS, "speaker", 0.5); // ls374d.75e + ls374d.90e + am6012
+ voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref"));
+ vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT);
+ vref.add_route(0, "dac", -1.0, DAC_VREF_NEG_INPUT);
+}
diff --git a/src/mame/audio/irem.cpp b/src/mame/audio/irem.cpp
index 066296d4088..0786ccb2c0a 100644
--- a/src/mame/audio/irem.cpp
+++ b/src/mame/audio/irem.cpp
@@ -123,17 +123,17 @@ WRITE8_MEMBER( irem_audio_device::m6803_port2_w )
{
/* PSG 0 or 1? */
if (m_port2 & 0x08)
- m_ay_45M->address_w(space, 0, m_port1);
+ m_ay_45M->address_w(m_port1);
if (m_port2 & 0x10)
- m_ay_45L->address_w(space, 0, m_port1);
+ m_ay_45L->address_w(m_port1);
}
else
{
/* PSG 0 or 1? */
if (m_port2 & 0x08)
- m_ay_45M->data_w(space, 0, m_port1);
+ m_ay_45M->data_w(m_port1);
if (m_port2 & 0x10)
- m_ay_45L->data_w(space, 0, m_port1);
+ m_ay_45L->data_w(m_port1);
}
}
m_port2 = data;
@@ -151,9 +151,9 @@ READ8_MEMBER( irem_audio_device::m6803_port1_r )
{
/* PSG 0 or 1? */
if (m_port2 & 0x08)
- return m_ay_45M->data_r(space, 0);
+ return m_ay_45M->data_r();
if (m_port2 & 0x10)
- return m_ay_45L->data_r(space, 0);
+ return m_ay_45L->data_r();
return 0xff;
}
diff --git a/src/mame/audio/leland.cpp b/src/mame/audio/leland.cpp
index fd46dfb7714..3d44fd2a539 100644
--- a/src/mame/audio/leland.cpp
+++ b/src/mame/audio/leland.cpp
@@ -163,7 +163,6 @@ void leland_80186_sound_device::device_add_mconfig(machine_config &config)
m_dacvol[5]->add_route(0, "dac6", -1.0, DAC_VREF_NEG_INPUT);
voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref", 0));
- vref.set_output(5.0);
vref.add_route(0, "dac1vol", 1.0, DAC_VREF_POS_INPUT);
vref.add_route(0, "dac2vol", 1.0, DAC_VREF_POS_INPUT);
vref.add_route(0, "dac3vol", 1.0, DAC_VREF_POS_INPUT);
@@ -224,7 +223,6 @@ void redline_80186_sound_device::device_add_mconfig(machine_config &config)
m_dacvol[7]->add_route(0, "dac8", -1.0, DAC_VREF_NEG_INPUT); // unknown DAC
voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref", 0));
- vref.set_output(5.0);
vref.add_route(0, "dac1vol", 1.0, DAC_VREF_POS_INPUT);
vref.add_route(0, "dac2vol", 1.0, DAC_VREF_POS_INPUT);
vref.add_route(0, "dac3vol", 1.0, DAC_VREF_POS_INPUT);
@@ -284,7 +282,6 @@ void ataxx_80186_sound_device::device_add_mconfig(machine_config &config)
m_dacvol[3]->add_route(0, "dac4", -1.0, DAC_VREF_NEG_INPUT);
voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref", 0));
- vref.set_output(5.0);
vref.add_route(0, "dac1vol", 1.0, DAC_VREF_POS_INPUT);
vref.add_route(0, "dac2vol", 1.0, DAC_VREF_POS_INPUT);
vref.add_route(0, "dac3vol", 1.0, DAC_VREF_POS_INPUT);
@@ -330,7 +327,6 @@ void wsf_80186_sound_device::device_add_mconfig(machine_config &config)
m_dacvol[3]->add_route(0, "dac4", -1.0, DAC_VREF_NEG_INPUT); // unknown DAC
voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref", 0));
- vref.set_output(5.0);
vref.add_route(0, "dac1vol", 1.0, DAC_VREF_POS_INPUT);
vref.add_route(0, "dac2vol", 1.0, DAC_VREF_POS_INPUT);
vref.add_route(0, "dac3vol", 1.0, DAC_VREF_POS_INPUT);
@@ -420,6 +416,8 @@ void leland_80186_sound_device::device_reset()
m_ext_start = 0;
m_ext_stop = 0;
m_ext_active = 0;
+ if (m_type == TYPE_WSF)
+ m_dacvol[3]->write(0xff); //TODO: determine how to set this if at all
}
DEFINE_DEVICE_TYPE(LELAND_80186, leland_80186_sound_device, "leland_80186_sound", "80186 DAC (Leland)")
@@ -622,6 +620,11 @@ WRITE16_MEMBER( leland_80186_sound_device::dac_w )
/* handle value changes */
if (ACCESSING_BITS_0_7)
{
+ if ((offset & 0x60) == 0x40)
+ m_audiocpu->drq0_w(CLEAR_LINE);
+ else if ((offset & 0x60) == 0x60)
+ m_audiocpu->drq1_w(CLEAR_LINE);
+
m_dac[dac]->write(data & 0xff);
set_clock_line(dac, 0);
@@ -637,7 +640,9 @@ WRITE16_MEMBER( leland_80186_sound_device::dac_w )
WRITE16_MEMBER( redline_80186_sound_device::redline_dac_w )
{
- dac_w(space, (offset >> 8) & 7, (data & 0xff) | (offset << 8), 0xffff);
+ data = (data & 0xff) | (offset << 8);
+ offset = ((offset >> 8) & 7) | ((offset & 0x2000) ? 0x40 : 0) | ((offset & 0x800) ? 0x20 : 0);
+ dac_w(space, offset, data, 0xffff);
}
WRITE16_MEMBER( leland_80186_sound_device::ataxx_dac_control )
@@ -645,21 +650,22 @@ WRITE16_MEMBER( leland_80186_sound_device::ataxx_dac_control )
if (ACCESSING_BITS_0_7)
{
/* handle common offsets */
- switch (offset)
+ switch (offset & 0x1f)
{
case 0x00:
+ dac_w(space, 0x40, data, 0x00ff);
+ return;
case 0x01:
+ dac_w(space, 0x61, data, 0x00ff);
+ return;
case 0x02:
- dac_w(space, offset, data, 0x00ff);
+ dac_w(space, 2, data, 0x00ff);
return;
case 0x03:
m_dacvol[0]->write((data & 7) << 5);
m_dacvol[1]->write(((data >> 3) & 7) << 5);
m_dacvol[2]->write(((data >> 6) & 3) << 6);
return;
- case 0x21:
- dac_w(space, 3, data, mem_mask);
- return;
}
}
@@ -739,7 +745,7 @@ READ16_MEMBER( leland_80186_sound_device::peripheral_r )
return m_pit[1]->read(offset & 3);
}
else if (m_type == TYPE_WSF)
- return m_ymsnd->read(space, offset);
+ return m_ymsnd->read(offset);
break;
case 4:
@@ -784,7 +790,7 @@ WRITE16_MEMBER( leland_80186_sound_device::peripheral_w )
m_pit[1]->write(offset & 3, data);
}
else if(m_type == TYPE_WSF)
- m_ymsnd->write(space, offset, data);
+ m_ymsnd->write(offset, data);
break;
case 4:
diff --git a/src/mame/audio/llander.cpp b/src/mame/audio/llander.cpp
index 4c216f3679b..80429f032f4 100644
--- a/src/mame/audio/llander.cpp
+++ b/src/mame/audio/llander.cpp
@@ -98,9 +98,9 @@ WRITE8_MEMBER(asteroid_state::llander_sounds_w)
}
-MACHINE_CONFIG_START(asteroid_state::llander_sound)
+void asteroid_state::llander_sound(machine_config &config)
+{
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("discrete", DISCRETE, llander_discrete)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
-MACHINE_CONFIG_END
+ DISCRETE(config, m_discrete, llander_discrete).add_route(ALL_OUTPUTS, "mono", 1.0);
+}
diff --git a/src/mame/audio/midway.cpp b/src/mame/audio/midway.cpp
index f25b82f69b8..2fc660bd094 100644
--- a/src/mame/audio/midway.cpp
+++ b/src/mame/audio/midway.cpp
@@ -590,9 +590,10 @@ void midway_sounds_good_device::soundsgood_map(address_map &map)
// device_add_mconfig - add device configuration
//-------------------------------------------------
-MACHINE_CONFIG_START(midway_sounds_good_device::device_add_mconfig)
- MCFG_DEVICE_ADD("cpu", M68000, DERIVED_CLOCK(1, 2))
- MCFG_DEVICE_PROGRAM_MAP(soundsgood_map)
+void midway_sounds_good_device::device_add_mconfig(machine_config &config)
+{
+ M68000(config, m_cpu, DERIVED_CLOCK(1, 2));
+ m_cpu->set_addrmap(AS_PROGRAM, &midway_sounds_good_device::soundsgood_map);
PIA6821(config, m_pia, 0);
m_pia->writepa_handler().set(FUNC(midway_sounds_good_device::porta_w));
@@ -600,10 +601,11 @@ MACHINE_CONFIG_START(midway_sounds_good_device::device_add_mconfig)
m_pia->irqa_handler().set(FUNC(midway_sounds_good_device::irq_w));
m_pia->irqb_handler().set(FUNC(midway_sounds_good_device::irq_w));
- MCFG_DEVICE_ADD("dac", AD7533, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, *this, 1.0) /// ad7533jn.u10
- MCFG_DEVICE_ADD("vref", VOLTAGE_REGULATOR, 0) MCFG_VOLTAGE_REGULATOR_OUTPUT(5.0)
- MCFG_SOUND_ROUTE(0, "dac", 1.0, DAC_VREF_POS_INPUT) MCFG_SOUND_ROUTE(0, "dac", -1.0, DAC_VREF_NEG_INPUT)
-MACHINE_CONFIG_END
+ AD7533(config, m_dac, 0).add_route(ALL_OUTPUTS, *this, 1.0); /// ad7533jn.u10
+ voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref"));
+ vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT);
+ vref.add_route(0, "dac", -1.0, DAC_VREF_NEG_INPUT);
+}
//-------------------------------------------------
@@ -745,9 +747,10 @@ void midway_turbo_cheap_squeak_device::turbocs_map(address_map &map)
// device_add_mconfig - add device configuration
//-------------------------------------------------
-MACHINE_CONFIG_START(midway_turbo_cheap_squeak_device::device_add_mconfig)
- MCFG_DEVICE_ADD("cpu", MC6809E, DERIVED_CLOCK(1, 4))
- MCFG_DEVICE_PROGRAM_MAP(turbocs_map)
+void midway_turbo_cheap_squeak_device::device_add_mconfig(machine_config &config)
+{
+ MC6809E(config, m_cpu, DERIVED_CLOCK(1, 4));
+ m_cpu->set_addrmap(AS_PROGRAM, &midway_turbo_cheap_squeak_device::turbocs_map);
PIA6821(config, m_pia, 0);
m_pia->writepa_handler().set(FUNC(midway_turbo_cheap_squeak_device::porta_w));
@@ -755,10 +758,11 @@ MACHINE_CONFIG_START(midway_turbo_cheap_squeak_device::device_add_mconfig)
m_pia->irqa_handler().set(FUNC(midway_turbo_cheap_squeak_device::irq_w));
m_pia->irqb_handler().set(FUNC(midway_turbo_cheap_squeak_device::irq_w));
- MCFG_DEVICE_ADD("dac", AD7533, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, *this, 1.0)
- MCFG_DEVICE_ADD("vref", VOLTAGE_REGULATOR, 0) MCFG_VOLTAGE_REGULATOR_OUTPUT(5.0)
- MCFG_SOUND_ROUTE(0, "dac", 1.0, DAC_VREF_POS_INPUT) MCFG_SOUND_ROUTE(0, "dac", -1.0, DAC_VREF_NEG_INPUT)
-MACHINE_CONFIG_END
+ AD7533(config, m_dac, 0).add_route(ALL_OUTPUTS, *this, 1.0);
+ voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref"));
+ vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT);
+ vref.add_route(0, "dac", -1.0, DAC_VREF_NEG_INPUT);
+}
//-------------------------------------------------
@@ -949,9 +953,10 @@ void midway_squawk_n_talk_device::squawkntalk_alt_map(address_map &map)
// device_add_mconfig - add device configuration
//-------------------------------------------------
-MACHINE_CONFIG_START(midway_squawk_n_talk_device::device_add_mconfig)
- MCFG_DEVICE_ADD("cpu", M6802, DERIVED_CLOCK(1, 1))
- MCFG_DEVICE_PROGRAM_MAP(squawkntalk_map)
+void midway_squawk_n_talk_device::device_add_mconfig(machine_config &config)
+{
+ M6802(config, m_cpu, DERIVED_CLOCK(1, 1));
+ m_cpu->set_addrmap(AS_PROGRAM, &midway_squawk_n_talk_device::squawkntalk_map);
PIA6821(config, m_pia0, 0);
m_pia0->writepa_handler().set(FUNC(midway_squawk_n_talk_device::porta1_w));
@@ -965,12 +970,11 @@ MACHINE_CONFIG_START(midway_squawk_n_talk_device::device_add_mconfig)
m_pia1->irqb_handler().set(FUNC(midway_squawk_n_talk_device::irq_w));
// only used on Discs of Tron, which is stereo
- MCFG_DEVICE_ADD("tms5200", TMS5200, 640000)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, *this, 0.60)
+ TMS5200(config, m_tms5200, 640000).add_route(ALL_OUTPUTS, *this, 0.60);
// the board also supports an AY-8912 and/or an 8-bit DAC, neither of
// which are populated on the Discs of Tron board
-MACHINE_CONFIG_END
+}
//-------------------------------------------------
diff --git a/src/mame/audio/n8080.cpp b/src/mame/audio/n8080.cpp
index 90557f27c3c..9d135e89433 100644
--- a/src/mame/audio/n8080.cpp
+++ b/src/mame/audio/n8080.cpp
@@ -491,7 +491,6 @@ void n8080_state::spacefev_sound(machine_config &config)
DAC_1BIT(config, m_n8080_dac, 0).add_route(ALL_OUTPUTS, "speaker", 0.15);
voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref", 0));
- vref.set_output(5.0);
vref.add_route(0, "n8080_dac", 1.0, DAC_VREF_POS_INPUT);
SN76477(config, m_sn);
@@ -529,7 +528,6 @@ void n8080_state::sheriff_sound(machine_config &config)
DAC_1BIT(config, m_n8080_dac, 0).add_route(ALL_OUTPUTS, "speaker", 0.15);
voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref", 0));
- vref.set_output(5.0);
vref.add_route(0, "n8080_dac", 1.0, DAC_VREF_POS_INPUT);
SN76477(config, m_sn);
@@ -570,7 +568,6 @@ void n8080_state::helifire_sound(machine_config &config)
SPEAKER(config, "speaker").front_center();
DAC_8BIT_R2R(config, m_helifire_dac, 0).add_route(ALL_OUTPUTS, "speaker", 0.15); // unknown DAC
voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref", 0));
- vref.set_output(5.0);
vref.add_route(0, "helifire_dac", 1.0, DAC_VREF_POS_INPUT);
vref.add_route(0, "helifire_dac", -1.0, DAC_VREF_NEG_INPUT);
}
diff --git a/src/mame/audio/nichisnd.cpp b/src/mame/audio/nichisnd.cpp
index 747a543e846..f6dd3030111 100644
--- a/src/mame/audio/nichisnd.cpp
+++ b/src/mame/audio/nichisnd.cpp
@@ -78,7 +78,8 @@ static const z80_daisy_config daisy_chain[] =
-MACHINE_CONFIG_START(nichisnd_device::device_add_mconfig)
+void nichisnd_device::device_add_mconfig(machine_config &config)
+{
tmpz84c011_device& audiocpu(TMPZ84C011(config, "audiocpu", 8000000)); /* TMPZ84C011, 8.00 MHz */
audiocpu.set_daisy_config(daisy_chain);
audiocpu.set_addrmap(AS_PROGRAM, &nichisnd_device::nichisnd_map);
@@ -95,15 +96,14 @@ MACHINE_CONFIG_START(nichisnd_device::device_add_mconfig)
GENERIC_LATCH_8(config, m_soundlatch);
- MCFG_DEVICE_ADD("ymsnd", YM3812, 4000000)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 1.0)
+ YM3812(config, "ymsnd", 4000000).add_route(ALL_OUTPUTS, "speaker", 1.0);
- MCFG_DEVICE_ADD("dac1", DAC_8BIT_R2R, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 0.37) // unknown DAC
- MCFG_DEVICE_ADD("dac2", DAC_8BIT_R2R, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 0.37) // unknown DAC
- MCFG_DEVICE_ADD("vref", VOLTAGE_REGULATOR, 0) MCFG_VOLTAGE_REGULATOR_OUTPUT(5.0)
- MCFG_SOUND_ROUTE(0, "dac1", 1.0, DAC_VREF_POS_INPUT) MCFG_SOUND_ROUTE(0, "dac1", -1.0, DAC_VREF_NEG_INPUT)
- MCFG_SOUND_ROUTE(0, "dac2", 1.0, DAC_VREF_POS_INPUT) MCFG_SOUND_ROUTE(0, "dac2", -1.0, DAC_VREF_NEG_INPUT)
-MACHINE_CONFIG_END
+ DAC_8BIT_R2R(config, "dac1", 0).add_route(ALL_OUTPUTS, "speaker", 0.37); // unknown DAC
+ DAC_8BIT_R2R(config, "dac2", 0).add_route(ALL_OUTPUTS, "speaker", 0.37); // unknown DAC
+ voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref"));
+ vref.add_route(0, "dac1", 1.0, DAC_VREF_POS_INPUT).add_route(0, "dac1", -1.0, DAC_VREF_NEG_INPUT);
+ vref.add_route(0, "dac2", 1.0, DAC_VREF_POS_INPUT).add_route(0, "dac2", -1.0, DAC_VREF_NEG_INPUT);
+}
//-------------------------------------------------
diff --git a/src/mame/audio/nl_kidniki.cpp b/src/mame/audio/nl_kidniki.cpp
index af9fc061c8c..380059740d7 100644
--- a/src/mame/audio/nl_kidniki.cpp
+++ b/src/mame/audio/nl_kidniki.cpp
@@ -2,8 +2,17 @@
// copyright-holders:Andrew Gardner, Couriersud
#include "netlist/devices/net_lib.h"
+#ifdef NLBASE_H_
+#error Somehow nl_base.h made it into the include chain.
+#endif
+
+#ifndef NLTOOL_VERSION
#define USE_FRONTIERS 1
#define USE_FIXED_STV 1
+#else
+#define USE_FRONTIERS 0
+#define USE_FIXED_STV 1
+#endif
/* ----------------------------------------------------------------------------
* Library section header START
@@ -308,7 +317,7 @@ NETLIST_END()
NETLIST_START(kidniki)
-#if (1 || USE_FRONTIERS)
+#if (0 || USE_FRONTIERS)
SOLVER(Solver, 18000)
PARAM(Solver.ACCURACY, 1e-7)
PARAM(Solver.NR_LOOPS, 100)
@@ -317,16 +326,19 @@ NETLIST_START(kidniki)
PARAM(Solver.METHOD, "MAT_CR")
//PARAM(Solver.METHOD, "MAT")
//PARAM(Solver.METHOD, "GMRES")
- PARAM(Solver.SOR_FACTOR, 1.00)
+ PARAM(Solver.SOR_FACTOR, 1.313)
PARAM(Solver.DYNAMIC_TS, 0)
PARAM(Solver.DYNAMIC_LTE, 5e-4)
PARAM(Solver.DYNAMIC_MIN_TIMESTEP, 20e-6)
#else
- SOLVER(Solver, 12000)
- PARAM(Solver.ACCURACY, 1e-8)
- PARAM(Solver.NR_LOOPS, 300)
- PARAM(Solver.GS_LOOPS, 20)
+ SOLVER(Solver, 18000)
+ PARAM(Solver.ACCURACY, 1e-7)
+ PARAM(Solver.NR_LOOPS, 100)
+ PARAM(Solver.GS_LOOPS, 300)
+ //PARAM(Solver.METHOD, "MAT_CR")
PARAM(Solver.METHOD, "GMRES")
+ //PARAM(Solver.SOR_FACTOR, 1.73)
+ //PARAM(Solver.METHOD, "SOR")
#endif
#if (USE_FRONTIERS)
@@ -372,16 +384,13 @@ NETLIST_START(kidniki)
ALIAS(I_SINH0, SINH_DUMMY.2)
#endif
- NET_MODEL("AY8910PORT FAMILY(OVL=0.05 OVH=4.95 ORL=100.0 ORH=0.5k)")
+ NET_MODEL("AY8910PORT FAMILY(OVL=0.05 OVH=0.05 ORL=100.0 ORH=0.5k)")
LOGIC_INPUT(I_SD0, 1, "AY8910PORT")
- //CLOCK(I_SD0, 5)
LOGIC_INPUT(I_BD0, 1, "AY8910PORT")
- //CLOCK(I_BD0, 5)
LOGIC_INPUT(I_CH0, 1, "AY8910PORT")
- //CLOCK(I_CH0, 2.2 )
LOGIC_INPUT(I_OH0, 1, "AY8910PORT")
- //CLOCK(I_OH0, 1.0)
+
ANALOG_INPUT(I_MSM2K0, 0)
ANALOG_INPUT(I_MSM3K0, 0)
diff --git a/src/mame/audio/nl_zac1b11142.cpp b/src/mame/audio/nl_zac1b11142.cpp
index 7172603f816..7f1aac03f70 100644
--- a/src/mame/audio/nl_zac1b11142.cpp
+++ b/src/mame/audio/nl_zac1b11142.cpp
@@ -297,7 +297,7 @@ NETLIST_START(zac1b11142)
ALIAS(VCC, I_P5.Q)
ALIAS(I_V0.Q, GND)
- NET_MODEL("AY8910PORT FAMILY(OVL=0.05 OVH=4.95 ORL=100.0 ORH=0.5k)")
+ NET_MODEL("AY8910PORT FAMILY(OVL=0.05 OVH=0.05 ORL=100.0 ORH=0.5k)")
// AY-3-8910 4G/4H digital outputs
LOGIC_INPUT(I_IOA0, 1, "AY8910PORT")
diff --git a/src/mame/audio/redalert.cpp b/src/mame/audio/redalert.cpp
index 1fa0b1c33b0..a962dffd207 100644
--- a/src/mame/audio/redalert.cpp
+++ b/src/mame/audio/redalert.cpp
@@ -86,7 +86,7 @@ WRITE8_MEMBER(redalert_state::redalert_AY8910_w)
/* BC1=1, BDIR=0 : read from PSG */
case 0x01:
- m_ay8910_latch_1 = m_ay8910->data_r(space, 0);
+ m_ay8910_latch_1 = m_ay8910->data_r();
break;
/* BC1=0, BDIR=1 : write to PSG */
@@ -94,7 +94,7 @@ WRITE8_MEMBER(redalert_state::redalert_AY8910_w)
case 0x02:
case 0x03:
default:
- m_ay8910->data_address_w(space, data, m_ay8910_latch_2);
+ m_ay8910->data_address_w(data, m_ay8910_latch_2);
break;
}
}
@@ -269,28 +269,28 @@ WRITE8_MEMBER(redalert_state::demoneye_ay8910_data_w)
{
case 0x00:
if (m_ay8910_latch_1 & 0x10)
- m_ay[0]->data_w(space, 0, data);
+ m_ay[0]->data_w(data);
if (m_ay8910_latch_1 & 0x20)
- m_ay[1]->data_w(space, 0, data);
+ m_ay[1]->data_w(data);
break;
case 0x01:
if (m_ay8910_latch_1 & 0x10)
- m_ay8910_latch_2 = m_ay[0]->data_r(space, 0);
+ m_ay8910_latch_2 = m_ay[0]->data_r();
if (m_ay8910_latch_1 & 0x20)
- m_ay8910_latch_2 = m_ay[1]->data_r(space, 0);
+ m_ay8910_latch_2 = m_ay[1]->data_r();
break;
case 0x03:
if (m_ay8910_latch_1 & 0x10)
- m_ay[0]->address_w(space, 0, data);
+ m_ay[0]->address_w(data);
if (m_ay8910_latch_1 & 0x20)
- m_ay[1]->address_w(space, 0, data);
+ m_ay[1]->address_w(data);
break;
diff --git a/src/mame/audio/s11c_bg.cpp b/src/mame/audio/s11c_bg.cpp
index 7ababf96d48..cdcbb701a76 100644
--- a/src/mame/audio/s11c_bg.cpp
+++ b/src/mame/audio/s11c_bg.cpp
@@ -58,30 +58,31 @@ void s11c_bg_device::data_w(uint8_t data)
m_pia40->write_portb(data);
}
-MACHINE_CONFIG_START(s11c_bg_device::device_add_mconfig)
- MCFG_DEVICE_ADD("bgcpu", MC6809E, XTAL(8'000'000) / 4) // MC68B09E
- MCFG_DEVICE_PROGRAM_MAP(s11c_bg_map)
- MCFG_QUANTUM_TIME(attotime::from_hz(50))
+void s11c_bg_device::device_add_mconfig(machine_config &config)
+{
+ MC6809E(config, m_cpu, XTAL(8'000'000) / 4); // MC68B09E
+ m_cpu->set_addrmap(AS_PROGRAM, &s11c_bg_device::s11c_bg_map);
+ config.m_minimum_quantum = attotime::from_hz(50);
YM2151(config, m_ym2151, XTAL(3'579'545)); // "3.58 MHz" on schematics and parts list
m_ym2151->irq_handler().set(FUNC(s11c_bg_device::ym2151_irq_w));
m_ym2151->add_route(ALL_OUTPUTS, *this, 0.25);
- MCFG_DEVICE_ADD("dac", MC1408, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, *this, 0.25)
- MCFG_DEVICE_ADD("vref", VOLTAGE_REGULATOR, 0) MCFG_VOLTAGE_REGULATOR_OUTPUT(5.0)
- MCFG_SOUND_ROUTE(0, "dac", 1.0, DAC_VREF_POS_INPUT) MCFG_SOUND_ROUTE(0, "dac", -1.0, DAC_VREF_NEG_INPUT)
+ MC1408(config, "dac", 0).add_route(ALL_OUTPUTS, *this, 0.25);
+ voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref"));
+ vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT);
+ vref.add_route(0, "dac", -1.0, DAC_VREF_NEG_INPUT);
- MCFG_DEVICE_ADD("hc55516_bg", HC55516, 0)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, *this, 0.5)
+ HC55516(config, m_hc55516, 0).add_route(ALL_OUTPUTS, *this, 0.5);
PIA6821(config, m_pia40, 0);
m_pia40->writepa_handler().set("dac", FUNC(dac_byte_interface::data_w));
m_pia40->writepb_handler().set(FUNC(s11c_bg_device::pia40_pb_w));
m_pia40->ca2_handler().set(m_ym2151, FUNC(ym2151_device::reset_w));
m_pia40->cb2_handler().set(FUNC(s11c_bg_device::pia40_cb2_w));
- m_pia40->irqa_handler().set_inputline("bgcpu", M6809_FIRQ_LINE);
- m_pia40->irqb_handler().set_inputline("bgcpu", INPUT_LINE_NMI);
-MACHINE_CONFIG_END
+ m_pia40->irqa_handler().set_inputline(m_cpu, M6809_FIRQ_LINE);
+ m_pia40->irqb_handler().set_inputline(m_cpu, INPUT_LINE_NMI);
+}
void s11c_bg_device::device_start()
{
diff --git a/src/mame/audio/segag80r.cpp b/src/mame/audio/segag80r.cpp
index e1cda7c68be..22fa9137274 100644
--- a/src/mame/audio/segag80r.cpp
+++ b/src/mame/audio/segag80r.cpp
@@ -838,7 +838,6 @@ void monsterb_sound_device::device_add_mconfig(machine_config &config)
DAC_8BIT_R2R(config, "dac", 0).add_route(ALL_OUTPUTS, "speaker", 0.5); // 50K (R91-97)/100K (R98-106) ladder network
voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref", 0));
- vref.set_output(5.0);
vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT);
vref.add_route(0, "dac", -1.0, DAC_VREF_NEG_INPUT);
diff --git a/src/mame/audio/snk6502.cpp b/src/mame/audio/snk6502.cpp
index c714fe23c0e..091186b79a2 100644
--- a/src/mame/audio/snk6502.cpp
+++ b/src/mame/audio/snk6502.cpp
@@ -339,7 +339,6 @@ void snk6502_sound_device::mute_channel(int channel)
void snk6502_sound_device::unmute_channel(int channel)
{
m_tone_channels[channel].mute = 0;
- m_tone_channels[channel].offset = 0;
}
diff --git a/src/mame/audio/spacefb.cpp b/src/mame/audio/spacefb.cpp
index a6e3055d130..c8e139ac583 100644
--- a/src/mame/audio/spacefb.cpp
+++ b/src/mame/audio/spacefb.cpp
@@ -82,7 +82,6 @@ void spacefb_state::spacefb_audio(machine_config &config)
SPEAKER(config, "speaker").front_center();
DAC_8BIT_R2R(config, "dac", 0).add_route(ALL_OUTPUTS, "speaker", 0.25); // unknown DAC
voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref", 0));
- vref.set_output(5.0);
vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT);
vref.add_route(0, "dac", -1.0, DAC_VREF_NEG_INPUT);
diff --git a/src/mame/audio/spiders.cpp b/src/mame/audio/spiders.cpp
index 93c03844447..3a50b0556c0 100644
--- a/src/mame/audio/spiders.cpp
+++ b/src/mame/audio/spiders.cpp
@@ -204,9 +204,8 @@ WRITE8_MEMBER(spiders_state::spiders_audio_ctrl_w)
}
-MACHINE_CONFIG_START(spiders_state::spiders_audio)
-
+void spiders_state::spiders_audio(machine_config &config)
+{
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("discrete", DISCRETE, spiders_discrete)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
-MACHINE_CONFIG_END
+ DISCRETE(config, m_discrete, spiders_discrete).add_route(ALL_OUTPUTS, "mono", 1.0);
+}
diff --git a/src/mame/audio/sprint8.cpp b/src/mame/audio/sprint8.cpp
index e187173cbcd..c05a83bc890 100644
--- a/src/mame/audio/sprint8.cpp
+++ b/src/mame/audio/sprint8.cpp
@@ -296,7 +296,8 @@ DISCRETE_SOUND_START( sprint8_discrete )
DISCRETE_TASK_END()
DISCRETE_SOUND_END
-MACHINE_CONFIG_START(sprint8_state::sprint8_audio)
+void sprint8_state::sprint8_audio(machine_config &config)
+{
/* sound hardware */
/* the proper way is to hook up 4 speakers, but they are not really
* F/R/L/R speakers. Though you can pretend the 1-2 mix is the front. */
@@ -305,30 +306,30 @@ MACHINE_CONFIG_START(sprint8_state::sprint8_audio)
SPEAKER(config, "speaker_5_6", 0.0, 0.0, -0.5); // back
SPEAKER(config, "speaker_4_8", 0.2, 0.0, 1.0); // right
- MCFG_DEVICE_ADD("discrete", DISCRETE, sprint8_discrete)
- MCFG_SOUND_ROUTE(0, "speaker_1_2", 1.0)
+ DISCRETE(config, m_discrete, sprint8_discrete);
+ m_discrete->add_route(0, "speaker_1_2", 1.0);
/* volumes on other channels defaulted to off, */
/* user can turn them up if needed. */
/* The game does not sound good with all channels mixed to stereo. */
- MCFG_SOUND_ROUTE(1, "speaker_3_7", 0.0)
- MCFG_SOUND_ROUTE(2, "speaker_5_6", 0.0)
- MCFG_SOUND_ROUTE(3, "speaker_4_8", 0.0)
+ m_discrete->add_route(1, "speaker_3_7", 0.0);
+ m_discrete->add_route(2, "speaker_5_6", 0.0);
+ m_discrete->add_route(3, "speaker_4_8", 0.0);
f9334_device &latch(F9334(config, "latch"));
latch.q_out_cb<0>().set(FUNC(sprint8_state::int_reset_w));
- latch.q_out_cb<1>().set("discrete", FUNC(discrete_device::write_line<SPRINT8_CRASH_EN>));
- latch.q_out_cb<2>().set("discrete", FUNC(discrete_device::write_line<SPRINT8_SCREECH_EN>));
+ latch.q_out_cb<1>().set(m_discrete, FUNC(discrete_device::write_line<SPRINT8_CRASH_EN>));
+ latch.q_out_cb<2>().set(m_discrete, FUNC(discrete_device::write_line<SPRINT8_SCREECH_EN>));
latch.q_out_cb<5>().set(FUNC(sprint8_state::team_w));
- latch.q_out_cb<6>().set("discrete", FUNC(discrete_device::write_line<SPRINT8_ATTRACT_EN>));
+ latch.q_out_cb<6>().set(m_discrete, FUNC(discrete_device::write_line<SPRINT8_ATTRACT_EN>));
f9334_device &motor(F9334(config, "motor"));
- motor.q_out_cb<0>().set("discrete", FUNC(discrete_device::write_line<SPRINT8_MOTOR1_EN>));
- motor.q_out_cb<1>().set("discrete", FUNC(discrete_device::write_line<SPRINT8_MOTOR2_EN>));
- motor.q_out_cb<2>().set("discrete", FUNC(discrete_device::write_line<SPRINT8_MOTOR3_EN>));
- motor.q_out_cb<3>().set("discrete", FUNC(discrete_device::write_line<SPRINT8_MOTOR4_EN>));
- motor.q_out_cb<4>().set("discrete", FUNC(discrete_device::write_line<SPRINT8_MOTOR5_EN>));
- motor.q_out_cb<5>().set("discrete", FUNC(discrete_device::write_line<SPRINT8_MOTOR6_EN>));
- motor.q_out_cb<6>().set("discrete", FUNC(discrete_device::write_line<SPRINT8_MOTOR7_EN>));
- motor.q_out_cb<7>().set("discrete", FUNC(discrete_device::write_line<SPRINT8_MOTOR8_EN>));
-MACHINE_CONFIG_END
+ motor.q_out_cb<0>().set(m_discrete, FUNC(discrete_device::write_line<SPRINT8_MOTOR1_EN>));
+ motor.q_out_cb<1>().set(m_discrete, FUNC(discrete_device::write_line<SPRINT8_MOTOR2_EN>));
+ motor.q_out_cb<2>().set(m_discrete, FUNC(discrete_device::write_line<SPRINT8_MOTOR3_EN>));
+ motor.q_out_cb<3>().set(m_discrete, FUNC(discrete_device::write_line<SPRINT8_MOTOR4_EN>));
+ motor.q_out_cb<4>().set(m_discrete, FUNC(discrete_device::write_line<SPRINT8_MOTOR5_EN>));
+ motor.q_out_cb<5>().set(m_discrete, FUNC(discrete_device::write_line<SPRINT8_MOTOR6_EN>));
+ motor.q_out_cb<6>().set(m_discrete, FUNC(discrete_device::write_line<SPRINT8_MOTOR7_EN>));
+ motor.q_out_cb<7>().set(m_discrete, FUNC(discrete_device::write_line<SPRINT8_MOTOR8_EN>));
+}
;
diff --git a/src/mame/audio/t5182.cpp b/src/mame/audio/t5182.cpp
index 93726634dcb..2cc831bf63d 100644
--- a/src/mame/audio/t5182.cpp
+++ b/src/mame/audio/t5182.cpp
@@ -371,9 +371,9 @@ void t5182_device::t5182_io(address_map &map)
// device_add_mconfig - add device configuration
//-------------------------------------------------
-MACHINE_CONFIG_START(t5182_device::device_add_mconfig)
- MCFG_DEVICE_ADD("t5182_z80", Z80, T5182_CLOCK)
- MCFG_DEVICE_PROGRAM_MAP(t5182_map)
- MCFG_DEVICE_IO_MAP(t5182_io)
-
-MACHINE_CONFIG_END
+void t5182_device::device_add_mconfig(machine_config &config)
+{
+ Z80(config, m_ourcpu, T5182_CLOCK);
+ m_ourcpu->set_addrmap(AS_PROGRAM, &t5182_device::t5182_map);
+ m_ourcpu->set_addrmap(AS_IO, &t5182_device::t5182_io);
+}
diff --git a/src/mame/audio/taito_en.cpp b/src/mame/audio/taito_en.cpp
index c4592aba133..bec1aa88503 100644
--- a/src/mame/audio/taito_en.cpp
+++ b/src/mame/audio/taito_en.cpp
@@ -43,7 +43,6 @@ taito_en_device::taito_en_device(const machine_config &mconfig, const char *tag,
void taito_en_device::device_start()
{
// tell the pump about the ESP chips
- m_pump->set_esp(m_esp);
uint8_t *ROM = m_osrom->base();
uint32_t max = (m_osrom->bytes() - 0x100000) / 0x20000;
for (int i = 0; i < 3; i++)
@@ -136,6 +135,18 @@ WRITE8_MEMBER(taito_en_device::mb87078_gain_changed)
/*************************************
*
+ * ES5510 callback
+ *
+ *************************************/
+
+void taito_en_device::es5505_clock_changed(u32 data)
+{
+ m_pump->set_unscaled_clock(data);
+}
+
+
+/*************************************
+ *
* M68681 callback
*
*************************************/
@@ -213,10 +224,12 @@ void taito_en_device::device_add_mconfig(machine_config &config)
SPEAKER(config, "rspeaker").front_right();
ESQ_5505_5510_PUMP(config, m_pump, XTAL(30'476'100) / (2 * 16 * 32));
+ m_pump->set_esp(m_esp);
m_pump->add_route(0, "lspeaker", 1.0);
m_pump->add_route(1, "rspeaker", 1.0);
ES5505(config, m_ensoniq, XTAL(30'476'100) / 2);
+ m_ensoniq->sample_rate_changed().set(FUNC(taito_en_device::es5505_clock_changed));
m_ensoniq->set_region0("ensoniq.0");
m_ensoniq->set_region1("ensoniq.0");
m_ensoniq->set_channels(4);
diff --git a/src/mame/audio/taito_en.h b/src/mame/audio/taito_en.h
index ca5854118d0..e3ab4c749e8 100644
--- a/src/mame/audio/taito_en.h
+++ b/src/mame/audio/taito_en.h
@@ -58,6 +58,7 @@ private:
DECLARE_WRITE8_MEMBER(duart_output);
DECLARE_WRITE8_MEMBER(mb87078_gain_changed);
+ void es5505_clock_changed(u32 data);
};
DECLARE_DEVICE_TYPE(TAITO_EN, taito_en_device)
diff --git a/src/mame/audio/targ.cpp b/src/mame/audio/targ.cpp
index 77d2c1fb150..d83b665955f 100644
--- a/src/mame/audio/targ.cpp
+++ b/src/mame/audio/targ.cpp
@@ -188,7 +188,6 @@ void exidy_state::spectar_audio(machine_config &config)
DAC_1BIT(config, m_dac, 0).add_route(ALL_OUTPUTS, "speaker", 0.99);
voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref", 0));
- vref.set_output(5.0);
vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT);
}
@@ -204,6 +203,5 @@ void exidy_state::targ_audio(machine_config &config)
DAC_1BIT(config, m_dac, 0).add_route(ALL_OUTPUTS, "speaker", 0.99);
voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref", 0));
- vref.set_output(5.0);
vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT);
}
diff --git a/src/mame/audio/timeplt.cpp b/src/mame/audio/timeplt.cpp
index 14bd7834c5c..c276cd3fcfe 100644
--- a/src/mame/audio/timeplt.cpp
+++ b/src/mame/audio/timeplt.cpp
@@ -219,13 +219,13 @@ void timeplt_audio_device::device_add_mconfig(machine_config &config)
}
-MACHINE_CONFIG_START(locomotn_audio_device::device_add_mconfig)
+void locomotn_audio_device::device_add_mconfig(machine_config &config)
+{
timeplt_audio_device::device_add_mconfig(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("tpsound")
- MCFG_DEVICE_PROGRAM_MAP(locomotn_sound_map)
-MACHINE_CONFIG_END
+ m_soundcpu->set_addrmap(AS_PROGRAM, &locomotn_audio_device::locomotn_sound_map);
+}
//-------------------------------------------------
// sound_stream_update - handle a stream update
diff --git a/src/mame/audio/timeplt.h b/src/mame/audio/timeplt.h
index fc3d57ec241..509de0fab17 100644
--- a/src/mame/audio/timeplt.h
+++ b/src/mame/audio/timeplt.h
@@ -34,9 +34,10 @@ protected:
void timeplt_sound_map(address_map &map);
+ required_device<cpu_device> m_soundcpu;
+
private:
// internal state
- required_device<cpu_device> m_soundcpu;
required_device<generic_latch_8_device> m_soundlatch;
required_device_array<filter_rc_device, 3> m_filter_0;
required_device_array<filter_rc_device, 3> m_filter_1;
diff --git a/src/mame/audio/tx1.cpp b/src/mame/audio/tx1.cpp
index d7eaf9d009a..f1667c8e7c0 100644
--- a/src/mame/audio/tx1.cpp
+++ b/src/mame/audio/tx1.cpp
@@ -386,21 +386,21 @@ void tx1_sound_device::sound_stream_update(sound_stream &stream, stream_sample_t
if (m_step0 & ((1 << TX1_FRAC)))
{
update_engine(m_eng0);
- m_pit0 = combine_4_weights(m_weights0, m_eng0[0], m_eng0[1], m_eng0[2], m_eng0[3]);
+ m_pit0 = combine_weights(m_weights0, m_eng0[0], m_eng0[1], m_eng0[2], m_eng0[3]);
m_step0 &= ((1 << TX1_FRAC) - 1);
}
if (m_step1 & ((1 << TX1_FRAC)))
{
update_engine(m_eng1);
- m_pit1 = combine_3_weights(m_weights1, m_eng1[0], m_eng1[1], m_eng1[3]);
+ m_pit1 = combine_weights(m_weights1, m_eng1[0], m_eng1[1], m_eng1[3]);
m_step1 &= ((1 << TX1_FRAC) - 1);
}
if (m_step2 & ((1 << TX1_FRAC)))
{
update_engine(m_eng2);
- m_pit2 = combine_3_weights(m_weights2, m_eng2[0], m_eng2[1], m_eng2[3]);
+ m_pit2 = combine_weights(m_weights2, m_eng2[0], m_eng2[1], m_eng2[3]);
m_step2 &= ((1 << TX1_FRAC) - 1);
}
@@ -552,7 +552,8 @@ ioport_constructor tx1j_sound_device::device_input_ports() const
return INPUT_PORTS_NAME(tx1j_inputs);
}
-MACHINE_CONFIG_START(tx1_sound_device::device_add_mconfig)
+void tx1_sound_device::device_add_mconfig(machine_config &config)
+{
Z80(config, m_audiocpu, TX1_PIXEL_CLOCK / 2);
m_audiocpu->set_addrmap(AS_PROGRAM, &tx1_sound_device::tx1_sound_prg);
m_audiocpu->set_addrmap(AS_IO, &tx1_sound_device::tx1_sound_io);
@@ -575,10 +576,9 @@ MACHINE_CONFIG_START(tx1_sound_device::device_add_mconfig)
aysnd.add_route(ALL_OUTPUTS, "frontleft", 0.1);
aysnd.add_route(ALL_OUTPUTS, "frontright", 0.1);
- MCFG_DEVICE_MODIFY(DEVICE_SELF)
- MCFG_SOUND_ROUTE(0, "frontleft", 0.2)
- MCFG_SOUND_ROUTE(1, "frontright", 0.2)
-MACHINE_CONFIG_END
+ this->add_route(0, "frontleft", 0.2);
+ this->add_route(1, "frontright", 0.2);
+}
/*************************************
*
@@ -659,7 +659,7 @@ void buggyboy_sound_device::device_start()
0, nullptr, nullptr, 0, 0 );
for (i = 0; i < 16; i++)
- m_eng_voltages[i] = combine_4_weights(aweights, BIT(tmp[i], 0), BIT(tmp[i], 1), BIT(tmp[i], 2), BIT(tmp[i], 3));
+ m_eng_voltages[i] = combine_weights(aweights, BIT(tmp[i], 0), BIT(tmp[i], 1), BIT(tmp[i], 2), BIT(tmp[i], 3));
/* Allocate the stream */
m_stream = machine().sound().stream_alloc(*this, 0, 2, machine().sample_rate());
@@ -1059,7 +1059,8 @@ ioport_constructor buggyboyjr_sound_device::device_input_ports() const
return INPUT_PORTS_NAME(buggyboyjr_inputs);
}
-MACHINE_CONFIG_START(buggyboy_sound_device::device_add_mconfig)
+void buggyboy_sound_device::device_add_mconfig(machine_config &config)
+{
Z80(config, m_audiocpu, BUGGYBOY_ZCLK / 2);
m_audiocpu->set_addrmap(AS_PROGRAM, &buggyboy_sound_device::buggyboy_sound_prg);
m_audiocpu->set_addrmap(AS_IO, &buggyboy_sound_device::buggyboy_sound_io);
@@ -1085,12 +1086,12 @@ MACHINE_CONFIG_START(buggyboy_sound_device::device_add_mconfig)
m_ym[1]->port_b_write_callback().set(FUNC(buggyboy_sound_device::ym2_b_w));
m_ym[1]->add_route(ALL_OUTPUTS, "frontright", 0.15);
- MCFG_DEVICE_MODIFY(DEVICE_SELF)
- MCFG_SOUND_ROUTE(0, "frontleft", 0.2)
- MCFG_SOUND_ROUTE(1, "frontright", 0.2)
-MACHINE_CONFIG_END
+ this->add_route(0, "frontleft", 0.2);
+ this->add_route(1, "frontright", 0.2);
+}
-MACHINE_CONFIG_START(buggyboyjr_sound_device::device_add_mconfig)
+void buggyboyjr_sound_device::device_add_mconfig(machine_config &config)
+{
Z80(config, m_audiocpu, BUGGYBOY_ZCLK / 2);
m_audiocpu->set_addrmap(AS_PROGRAM, &buggyboyjr_sound_device::buggybjr_sound_prg);
m_audiocpu->set_addrmap(AS_IO, &buggyboyjr_sound_device::buggyboy_sound_io);
@@ -1111,7 +1112,6 @@ MACHINE_CONFIG_START(buggyboyjr_sound_device::device_add_mconfig)
m_ym[1]->port_b_write_callback().set(FUNC(buggyboy_sound_device::ym2_b_w));
m_ym[1]->add_route(ALL_OUTPUTS, "frontright", 0.15);
- MCFG_DEVICE_MODIFY(DEVICE_SELF)
- MCFG_SOUND_ROUTE(0, "frontleft", 0.2)
- MCFG_SOUND_ROUTE(1, "frontright", 0.2)
-MACHINE_CONFIG_END
+ this->add_route(0, "frontleft", 0.2);
+ this->add_route(1, "frontright", 0.2);
+}
diff --git a/src/mame/audio/williams.cpp b/src/mame/audio/williams.cpp
index c94bea20c9a..1a515a44af7 100644
--- a/src/mame/audio/williams.cpp
+++ b/src/mame/audio/williams.cpp
@@ -70,7 +70,7 @@ DEFINE_DEVICE_TYPE(WILLIAMS_ADPCM_SOUND, williams_adpcm_sound_device, "wmsadpcm"
// williams_cvsd_sound_device - constructor
//-------------------------------------------------
-williams_cvsd_sound_device::williams_cvsd_sound_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+williams_cvsd_sound_device::williams_cvsd_sound_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
: device_t(mconfig, WILLIAMS_CVSD_SOUND, tag, owner, clock),
device_mixer_interface(mconfig, *this),
m_cpu(*this, "cpu"),
@@ -87,7 +87,7 @@ williams_cvsd_sound_device::williams_cvsd_sound_device(const machine_config &mco
// latch
//-------------------------------------------------
-WRITE16_MEMBER(williams_cvsd_sound_device::write)
+void williams_cvsd_sound_device::write(u16 data)
{
synchronize(0, data);
}
@@ -102,7 +102,7 @@ WRITE_LINE_MEMBER(williams_cvsd_sound_device::reset_write)
// going high halts the CPU
if (state)
{
- bank_select_w(m_cpu->space(), 0, 0);
+ bank_select_w(0);
device_reset();
m_cpu->set_input_line(INPUT_LINE_RESET, ASSERT_LINE);
}
@@ -117,7 +117,7 @@ WRITE_LINE_MEMBER(williams_cvsd_sound_device::reset_write)
// bank_select_w - change memory banks
//-------------------------------------------------
-WRITE8_MEMBER(williams_cvsd_sound_device::bank_select_w)
+void williams_cvsd_sound_device::bank_select_w(u8 data)
{
m_rombank->set_entry(data & 0x0f);
}
@@ -127,7 +127,7 @@ WRITE8_MEMBER(williams_cvsd_sound_device::bank_select_w)
// talkback_w - write to the talkback latch
//-------------------------------------------------
-WRITE8_MEMBER(williams_cvsd_sound_device::talkback_w)
+void williams_cvsd_sound_device::talkback_w(u8 data)
{
m_talkback = data;
logerror("CVSD Talkback = %02X\n", data);
@@ -139,7 +139,7 @@ WRITE8_MEMBER(williams_cvsd_sound_device::talkback_w)
// the HC55516 and clock the data
//-------------------------------------------------
-WRITE8_MEMBER(williams_cvsd_sound_device::cvsd_digit_clock_clear_w)
+void williams_cvsd_sound_device::cvsd_digit_clock_clear_w(u8 data)
{
m_hc55516->digit_w(data);
m_hc55516->clock_w(0);
@@ -150,7 +150,7 @@ WRITE8_MEMBER(williams_cvsd_sound_device::cvsd_digit_clock_clear_w)
// cvsd_clock_set_w - set the clock on the HC55516
//-------------------------------------------------
-WRITE8_MEMBER(williams_cvsd_sound_device::cvsd_clock_set_w)
+void williams_cvsd_sound_device::cvsd_clock_set_w(u8 data)
{
m_hc55516->clock_w(1);
}
@@ -176,9 +176,10 @@ void williams_cvsd_sound_device::williams_cvsd_map(address_map &map)
// device_add_mconfig - add device configuration
//-------------------------------------------------
-MACHINE_CONFIG_START(williams_cvsd_sound_device::device_add_mconfig)
- MCFG_DEVICE_ADD(m_cpu, MC6809E, CVSD_MASTER_CLOCK / 4)
- MCFG_DEVICE_PROGRAM_MAP(williams_cvsd_map)
+void williams_cvsd_sound_device::device_add_mconfig(machine_config &config)
+{
+ MC6809E(config, m_cpu, CVSD_MASTER_CLOCK / 4);
+ m_cpu->set_addrmap(AS_PROGRAM, &williams_cvsd_sound_device::williams_cvsd_map);
PIA6821(config, m_pia, 0);
m_pia->writepa_handler().set("dac", FUNC(dac_byte_interface::data_w));
@@ -191,12 +192,13 @@ MACHINE_CONFIG_START(williams_cvsd_sound_device::device_add_mconfig)
ym.add_route(ALL_OUTPUTS, *this, 0.10);
MC1408(config, "dac", 0).add_route(ALL_OUTPUTS, *this, 0.25);
- MCFG_DEVICE_ADD("vref", VOLTAGE_REGULATOR, 0) MCFG_VOLTAGE_REGULATOR_OUTPUT(5.0)
- MCFG_SOUND_ROUTE(0, "dac", 1.0, DAC_VREF_POS_INPUT) MCFG_SOUND_ROUTE(0, "dac", -1.0, DAC_VREF_NEG_INPUT)
+ voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref"));
+ vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT);
+ vref.add_route(0, "dac", -1.0, DAC_VREF_NEG_INPUT);
HC55516(config, m_hc55516, 0);
m_hc55516->add_route(ALL_OUTPUTS, *this, 0.60);
-MACHINE_CONFIG_END
+}
//-------------------------------------------------
@@ -206,7 +208,7 @@ MACHINE_CONFIG_END
void williams_cvsd_sound_device::device_start()
{
// configure master CPU banks
- uint8_t *rom = memregion("cpu")->base();
+ u8 *rom = memregion("cpu")->base();
for (int bank = 0; bank < 16; bank++)
{
//
@@ -262,7 +264,7 @@ void williams_cvsd_sound_device::device_timer(emu_timer &timer, device_timer_id
// williams_narc_sound_device - constructor
//-------------------------------------------------
-williams_narc_sound_device::williams_narc_sound_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+williams_narc_sound_device::williams_narc_sound_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
: device_t(mconfig, WILLIAMS_NARC_SOUND, tag, owner, clock),
device_mixer_interface(mconfig, *this),
m_cpu(*this, "cpu%u", 0U),
@@ -283,7 +285,7 @@ williams_narc_sound_device::williams_narc_sound_device(const machine_config &mco
// SYNC bits in bits 8 and 9
//-------------------------------------------------
-READ16_MEMBER(williams_narc_sound_device::read)
+u16 williams_narc_sound_device::read()
{
return m_talkback | (m_audio_sync << 8);
}
@@ -294,7 +296,7 @@ READ16_MEMBER(williams_narc_sound_device::read)
// latch
//-------------------------------------------------
-WRITE16_MEMBER(williams_narc_sound_device::write)
+void williams_narc_sound_device::write(u16 data)
{
synchronize(TID_MASTER_COMMAND, data);
}
@@ -309,8 +311,8 @@ WRITE_LINE_MEMBER(williams_narc_sound_device::reset_write)
// going high halts the CPU
if (state)
{
- master_bank_select_w(m_cpu[0]->space(), 0, 0);
- slave_bank_select_w(m_cpu[1]->space(), 0, 0);
+ master_bank_select_w(0);
+ slave_bank_select_w(0);
device_reset();
m_cpu[0]->set_input_line(INPUT_LINE_RESET, ASSERT_LINE);
m_cpu[1]->set_input_line(INPUT_LINE_RESET, ASSERT_LINE);
@@ -330,7 +332,7 @@ WRITE_LINE_MEMBER(williams_narc_sound_device::reset_write)
// master CPU
//-------------------------------------------------
-WRITE8_MEMBER(williams_narc_sound_device::master_bank_select_w)
+void williams_narc_sound_device::master_bank_select_w(u8 data)
{
m_masterbank->set_entry(data & 0x0f);
}
@@ -341,7 +343,7 @@ WRITE8_MEMBER(williams_narc_sound_device::master_bank_select_w)
// slave CPU
//-------------------------------------------------
-WRITE8_MEMBER(williams_narc_sound_device::slave_bank_select_w)
+void williams_narc_sound_device::slave_bank_select_w(u8 data)
{
m_slavebank->set_entry(data & 0x0f);
}
@@ -352,7 +354,7 @@ WRITE8_MEMBER(williams_narc_sound_device::slave_bank_select_w)
// agent
//-------------------------------------------------
-READ8_MEMBER(williams_narc_sound_device::command_r)
+u8 williams_narc_sound_device::command_r()
{
m_cpu[0]->set_input_line(M6809_IRQ_LINE, CLEAR_LINE);
m_sound_int_state = 0;
@@ -365,7 +367,7 @@ READ8_MEMBER(williams_narc_sound_device::command_r)
// slave CPU
//-------------------------------------------------
-WRITE8_MEMBER(williams_narc_sound_device::command2_w)
+void williams_narc_sound_device::command2_w(u8 data)
{
synchronize(TID_SLAVE_COMMAND, data);
}
@@ -376,7 +378,7 @@ WRITE8_MEMBER(williams_narc_sound_device::command2_w)
// CPU
//-------------------------------------------------
-READ8_MEMBER(williams_narc_sound_device::command2_r)
+u8 williams_narc_sound_device::command2_r()
{
m_cpu[1]->set_input_line(M6809_FIRQ_LINE, CLEAR_LINE);
return m_latch2;
@@ -388,7 +390,7 @@ READ8_MEMBER(williams_narc_sound_device::command2_r)
// talkback latch from the master CPU
//-------------------------------------------------
-WRITE8_MEMBER(williams_narc_sound_device::master_talkback_w)
+void williams_narc_sound_device::master_talkback_w(u8 data)
{
m_talkback = data;
logerror("Master Talkback = %02X\n", data);
@@ -400,7 +402,7 @@ WRITE8_MEMBER(williams_narc_sound_device::master_talkback_w)
// SYNC register
//-------------------------------------------------
-WRITE8_MEMBER(williams_narc_sound_device::master_sync_w)
+void williams_narc_sound_device::master_sync_w(u8 data)
{
timer_set(attotime::from_double(TIME_OF_74LS123(180000, 0.000001)), TID_SYNC_CLEAR, 0x01);
m_audio_sync |= 0x01;
@@ -413,7 +415,7 @@ WRITE8_MEMBER(williams_narc_sound_device::master_sync_w)
// talkback latch from the slave CPU
//-------------------------------------------------
-WRITE8_MEMBER(williams_narc_sound_device::slave_talkback_w)
+void williams_narc_sound_device::slave_talkback_w(u8 data)
{
logerror("Slave Talkback = %02X\n", data);
}
@@ -424,7 +426,7 @@ WRITE8_MEMBER(williams_narc_sound_device::slave_talkback_w)
// SYNC register
//-------------------------------------------------
-WRITE8_MEMBER(williams_narc_sound_device::slave_sync_w)
+void williams_narc_sound_device::slave_sync_w(u8 data)
{
timer_set(attotime::from_double(TIME_OF_74LS123(180000, 0.000001)), TID_SYNC_CLEAR, 0x02);
m_audio_sync |= 0x02;
@@ -437,7 +439,7 @@ WRITE8_MEMBER(williams_narc_sound_device::slave_sync_w)
// the HC55516 and clock the data
//-------------------------------------------------
-WRITE8_MEMBER(williams_narc_sound_device::cvsd_digit_clock_clear_w)
+void williams_narc_sound_device::cvsd_digit_clock_clear_w(u8 data)
{
m_hc55516->digit_w(data);
m_hc55516->clock_w(0);
@@ -448,7 +450,7 @@ WRITE8_MEMBER(williams_narc_sound_device::cvsd_digit_clock_clear_w)
// cvsd_clock_set_w - set the clock on the HC55516
//-------------------------------------------------
-WRITE8_MEMBER(williams_narc_sound_device::cvsd_clock_set_w)
+void williams_narc_sound_device::cvsd_clock_set_w(u8 data)
{
m_hc55516->clock_w(1);
}
@@ -497,26 +499,26 @@ void williams_narc_sound_device::williams_narc_slave_map(address_map &map)
//-------------------------------------------------
-MACHINE_CONFIG_START(williams_narc_sound_device::device_add_mconfig)
- MCFG_DEVICE_ADD("cpu0", MC6809E, NARC_MASTER_CLOCK / 4)
- MCFG_DEVICE_PROGRAM_MAP(williams_narc_master_map)
+void williams_narc_sound_device::device_add_mconfig(machine_config &config)
+{
+ MC6809E(config, m_cpu[0], NARC_MASTER_CLOCK / 4);
+ m_cpu[0]->set_addrmap(AS_PROGRAM, &williams_narc_sound_device::williams_narc_master_map);
- MCFG_DEVICE_ADD("cpu1", MC6809E, NARC_MASTER_CLOCK / 4)
- MCFG_DEVICE_PROGRAM_MAP(williams_narc_slave_map)
+ MC6809E(config, m_cpu[1], NARC_MASTER_CLOCK / 4);
+ m_cpu[1]->set_addrmap(AS_PROGRAM, &williams_narc_sound_device::williams_narc_slave_map);
ym2151_device &ym2151(YM2151(config, "ym2151", NARC_FM_CLOCK));
ym2151.irq_handler().set_inputline("cpu0", M6809_FIRQ_LINE);
ym2151.add_route(ALL_OUTPUTS, *this, 0.10);
- MCFG_DEVICE_ADD("dac1", AD7224, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, *this, 0.25)
- MCFG_DEVICE_ADD("dac2", AD7224, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, *this, 0.25)
- MCFG_DEVICE_ADD("vref", VOLTAGE_REGULATOR, 0) MCFG_VOLTAGE_REGULATOR_OUTPUT(5.0)
- MCFG_SOUND_ROUTE(0, "dac1", 1.0, DAC_VREF_POS_INPUT) MCFG_SOUND_ROUTE(0, "dac1", -1.0, DAC_VREF_NEG_INPUT)
- MCFG_SOUND_ROUTE(0, "dac2", 1.0, DAC_VREF_POS_INPUT) MCFG_SOUND_ROUTE(0, "dac2", -1.0, DAC_VREF_NEG_INPUT)
+ AD7224(config, "dac1", 0).add_route(ALL_OUTPUTS, *this, 0.25);
+ AD7224(config, "dac2", 0).add_route(ALL_OUTPUTS, *this, 0.25);
+ voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref"));
+ vref.add_route(0, "dac1", 1.0, DAC_VREF_POS_INPUT); vref.add_route(0, "dac1", -1.0, DAC_VREF_NEG_INPUT);
+ vref.add_route(0, "dac2", 1.0, DAC_VREF_POS_INPUT); vref.add_route(0, "dac2", -1.0, DAC_VREF_NEG_INPUT);
- MCFG_DEVICE_ADD("cvsd", HC55516, 0)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, *this, 0.60)
-MACHINE_CONFIG_END
+ HC55516(config, m_hc55516, 0).add_route(ALL_OUTPUTS, *this, 0.60);
+}
//-------------------------------------------------
@@ -526,7 +528,7 @@ MACHINE_CONFIG_END
void williams_narc_sound_device::device_start()
{
// configure master CPU banks
- uint8_t *rom = memregion("cpu0")->base();
+ u8 *rom = memregion("cpu0")->base();
for (int bank = 0; bank < 16; bank++)
{
//
@@ -617,7 +619,7 @@ void williams_narc_sound_device::device_timer(emu_timer &timer, device_timer_id
// williams_adpcm_sound_device - constructor
//-------------------------------------------------
-williams_adpcm_sound_device::williams_adpcm_sound_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+williams_adpcm_sound_device::williams_adpcm_sound_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
: device_t(mconfig, WILLIAMS_ADPCM_SOUND, tag, owner, clock),
device_mixer_interface(mconfig, *this),
m_cpu(*this, "cpu"),
@@ -635,7 +637,7 @@ williams_adpcm_sound_device::williams_adpcm_sound_device(const machine_config &m
// latch
//-------------------------------------------------
-WRITE16_MEMBER(williams_adpcm_sound_device::write)
+void williams_adpcm_sound_device::write(u16 data)
{
synchronize(TID_COMMAND, data);
}
@@ -650,7 +652,7 @@ WRITE_LINE_MEMBER(williams_adpcm_sound_device::reset_write)
// going high halts the CPU
if (state)
{
- bank_select_w(m_cpu->space(), 0, 0);
+ bank_select_w(0);
device_reset();
m_cpu->set_input_line(INPUT_LINE_RESET, ASSERT_LINE);
}
@@ -676,18 +678,18 @@ READ_LINE_MEMBER(williams_adpcm_sound_device::irq_read)
// bank
//-------------------------------------------------
-WRITE8_MEMBER(williams_adpcm_sound_device::bank_select_w)
+void williams_adpcm_sound_device::bank_select_w(u8 data)
{
m_rombank->set_entry(data & 0x07);
}
//-------------------------------------------------
-// bank_select_w - select the OKI6295 memory
-// bank
+// oki6295_bank_select_w - select the OKI6295
+// memory bank
//-------------------------------------------------
-WRITE8_MEMBER(williams_adpcm_sound_device::oki6295_bank_select_w)
+void williams_adpcm_sound_device::oki6295_bank_select_w(u8 data)
{
m_okibank->set_entry(data & 7);
}
@@ -698,7 +700,7 @@ WRITE8_MEMBER(williams_adpcm_sound_device::oki6295_bank_select_w)
// latch
//-------------------------------------------------
-READ8_MEMBER(williams_adpcm_sound_device::command_r)
+u8 williams_adpcm_sound_device::command_r()
{
m_cpu->set_input_line(M6809_IRQ_LINE, CLEAR_LINE);
@@ -713,7 +715,7 @@ READ8_MEMBER(williams_adpcm_sound_device::command_r)
// talkback_w - write to the talkback latch
//-------------------------------------------------
-WRITE8_MEMBER(williams_adpcm_sound_device::talkback_w)
+void williams_adpcm_sound_device::talkback_w(u8 data)
{
m_talkback = data;
logerror("ADPCM Talkback = %02X\n", data);
@@ -754,22 +756,24 @@ void williams_adpcm_sound_device::williams_adpcm_oki_map(address_map &map)
// device_add_mconfig - add device configuration
//-------------------------------------------------
-MACHINE_CONFIG_START(williams_adpcm_sound_device::device_add_mconfig)
- MCFG_DEVICE_ADD("cpu", MC6809E, ADPCM_MASTER_CLOCK / 4)
- MCFG_DEVICE_PROGRAM_MAP(williams_adpcm_map)
+void williams_adpcm_sound_device::device_add_mconfig(machine_config &config)
+{
+ MC6809E(config, m_cpu, ADPCM_MASTER_CLOCK / 4);
+ m_cpu->set_addrmap(AS_PROGRAM, &williams_adpcm_sound_device::williams_adpcm_map);
ym2151_device &ym2151(YM2151(config, "ym2151", ADPCM_FM_CLOCK));
ym2151.irq_handler().set_inputline("cpu", M6809_FIRQ_LINE);
ym2151.add_route(ALL_OUTPUTS, *this, 0.10);
- MCFG_DEVICE_ADD("dac", AD7524, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, *this, 0.10)
- MCFG_DEVICE_ADD("vref", VOLTAGE_REGULATOR, 0) MCFG_VOLTAGE_REGULATOR_OUTPUT(5.0)
- MCFG_SOUND_ROUTE(0, "dac", 1.0, DAC_VREF_POS_INPUT) MCFG_SOUND_ROUTE(0, "dac", -1.0, DAC_VREF_NEG_INPUT)
+ AD7524(config, "dac", 0).add_route(ALL_OUTPUTS, *this, 0.10);
+ voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref"));
+ vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT);
+ vref.add_route(0, "dac", -1.0, DAC_VREF_NEG_INPUT);
- MCFG_DEVICE_ADD("oki", OKIM6295, ADPCM_MASTER_CLOCK/8, okim6295_device::PIN7_HIGH) // clock frequency & pin 7 not verified
- MCFG_DEVICE_ADDRESS_MAP(0, williams_adpcm_oki_map)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, *this, 0.15)
-MACHINE_CONFIG_END
+ okim6295_device &oki(OKIM6295(config, "oki", ADPCM_MASTER_CLOCK/8, okim6295_device::PIN7_HIGH)); // clock frequency & pin 7 not verified
+ oki.set_addrmap(0, &williams_adpcm_sound_device::williams_adpcm_oki_map);
+ oki.add_route(ALL_OUTPUTS, *this, 0.15);
+}
//-------------------------------------------------
@@ -779,7 +783,7 @@ MACHINE_CONFIG_END
void williams_adpcm_sound_device::device_start()
{
// configure banks
- uint8_t *rom = memregion("cpu")->base();
+ u8 *rom = memregion("cpu")->base();
m_rombank->configure_entries(0, 8, &rom[0x10000], 0x8000);
membank("romupper")->set_base(&rom[0x10000 + 0x4000 + 7 * 0x8000]);
diff --git a/src/mame/audio/williams.h b/src/mame/audio/williams.h
index fa12524d3c1..a14e1d57d06 100644
--- a/src/mame/audio/williams.h
+++ b/src/mame/audio/williams.h
@@ -37,16 +37,16 @@ class williams_cvsd_sound_device : public device_t,
{
public:
// construction/destruction
- williams_cvsd_sound_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock = 0);
+ williams_cvsd_sound_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock = 0);
// read/write
- DECLARE_WRITE16_MEMBER(write);
+ void write(u16 data);
DECLARE_WRITE_LINE_MEMBER(reset_write);
// internal communications
- DECLARE_WRITE8_MEMBER(bank_select_w);
- DECLARE_WRITE8_MEMBER(cvsd_digit_clock_clear_w);
- DECLARE_WRITE8_MEMBER(cvsd_clock_set_w);
+ void bank_select_w(u8 data);
+ void cvsd_digit_clock_clear_w(u8 data);
+ void cvsd_clock_set_w(u8 data);
void williams_cvsd_map(address_map &map);
@@ -68,9 +68,9 @@ private:
required_memory_bank m_rombank;
// internal state
- uint8_t m_talkback;
+ u8 m_talkback;
- DECLARE_WRITE8_MEMBER(talkback_w);
+ void talkback_w(u8 data);
};
@@ -81,25 +81,25 @@ class williams_narc_sound_device : public device_t,
{
public:
// construction/destruction
- williams_narc_sound_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock = 0);
+ williams_narc_sound_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock = 0);
// read/write
- DECLARE_READ16_MEMBER(read);
- DECLARE_WRITE16_MEMBER(write);
+ u16 read();
+ void write(u16 data);
DECLARE_WRITE_LINE_MEMBER(reset_write);
// internal communications
- DECLARE_WRITE8_MEMBER(master_bank_select_w);
- DECLARE_WRITE8_MEMBER(slave_bank_select_w);
- DECLARE_READ8_MEMBER(command_r);
- DECLARE_WRITE8_MEMBER(command2_w);
- DECLARE_READ8_MEMBER(command2_r);
- DECLARE_WRITE8_MEMBER(master_talkback_w);
- DECLARE_WRITE8_MEMBER(master_sync_w);
- DECLARE_WRITE8_MEMBER(slave_talkback_w);
- DECLARE_WRITE8_MEMBER(slave_sync_w);
- DECLARE_WRITE8_MEMBER(cvsd_digit_clock_clear_w);
- DECLARE_WRITE8_MEMBER(cvsd_clock_set_w);
+ void master_bank_select_w(u8 data);
+ void slave_bank_select_w(u8 data);
+ u8 command_r();
+ void command2_w(u8 data);
+ u8 command2_r();
+ void master_talkback_w(u8 data);
+ void master_sync_w(u8 data);
+ void slave_talkback_w(u8 data);
+ void slave_sync_w(u8 data);
+ void cvsd_digit_clock_clear_w(u8 data);
+ void cvsd_clock_set_w(u8 data);
void williams_narc_master_map(address_map &map);
void williams_narc_slave_map(address_map &map);
@@ -130,11 +130,11 @@ private:
required_memory_bank m_slavebank;
// internal state
- uint8_t m_latch;
- uint8_t m_latch2;
- uint8_t m_talkback;
- uint8_t m_audio_sync;
- uint8_t m_sound_int_state;
+ u8 m_latch;
+ u8 m_latch2;
+ u8 m_talkback;
+ u8 m_audio_sync;
+ u8 m_sound_int_state;
};
@@ -145,18 +145,18 @@ class williams_adpcm_sound_device : public device_t,
{
public:
// construction/destruction
- williams_adpcm_sound_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock = 0);
+ williams_adpcm_sound_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock = 0);
// read/write
- DECLARE_WRITE16_MEMBER(write);
+ void write(u16 data);
DECLARE_WRITE_LINE_MEMBER(reset_write);
DECLARE_READ_LINE_MEMBER(irq_read);
// internal communications
- DECLARE_WRITE8_MEMBER(bank_select_w);
- DECLARE_WRITE8_MEMBER(oki6295_bank_select_w);
- DECLARE_READ8_MEMBER(command_r);
- DECLARE_WRITE8_MEMBER(talkback_w);
+ void bank_select_w(u8 data);
+ void oki6295_bank_select_w(u8 data);
+ u8 command_r();
+ void talkback_w(u8 data);
void williams_adpcm_map(address_map &map);
void williams_adpcm_oki_map(address_map &map);
@@ -185,7 +185,7 @@ private:
required_memory_bank m_okibank;
// internal state
- uint8_t m_latch;
- uint8_t m_talkback;
- uint8_t m_sound_int_state;
+ u8 m_latch;
+ u8 m_talkback;
+ u8 m_sound_int_state;
};
diff --git a/src/mame/audio/wpcsnd.cpp b/src/mame/audio/wpcsnd.cpp
index bb34e560a8d..05abf086a74 100644
--- a/src/mame/audio/wpcsnd.cpp
+++ b/src/mame/audio/wpcsnd.cpp
@@ -69,22 +69,23 @@ uint8_t wpcsnd_device::data_r()
return m_reply;
}
-MACHINE_CONFIG_START(wpcsnd_device::device_add_mconfig)
- MCFG_DEVICE_ADD("bgcpu", MC6809E, XTAL(8'000'000) / 4) // MC68B09E
- MCFG_DEVICE_PROGRAM_MAP(wpcsnd_map)
- MCFG_QUANTUM_TIME(attotime::from_hz(50))
+void wpcsnd_device::device_add_mconfig(machine_config &config)
+{
+ MC6809E(config, m_cpu, XTAL(8'000'000) / 4); // MC68B09E
+ m_cpu->set_addrmap(AS_PROGRAM, &wpcsnd_device::wpcsnd_map);
+ config.m_minimum_quantum = attotime::from_hz(50);
YM2151(config, m_ym2151, 3580000);
m_ym2151->irq_handler().set(FUNC(wpcsnd_device::ym2151_irq_w));
m_ym2151->add_route(ALL_OUTPUTS, *this, 0.25);
- MCFG_DEVICE_ADD("dac", AD7524, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, *this, 0.25)
- MCFG_DEVICE_ADD("vref", VOLTAGE_REGULATOR, 0) MCFG_VOLTAGE_REGULATOR_OUTPUT(5.0)
- MCFG_SOUND_ROUTE(0, "dac", 1.0, DAC_VREF_POS_INPUT) MCFG_SOUND_ROUTE(0, "dac", -1.0, DAC_VREF_NEG_INPUT)
+ AD7524(config, "dac", 0).add_route(ALL_OUTPUTS, *this, 0.25);
+ voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref"));
+ vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT);
+ vref.add_route(0, "dac", -1.0, DAC_VREF_NEG_INPUT);
- MCFG_DEVICE_ADD("hc55516", HC55516, 0)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, *this, 0.5)
-MACHINE_CONFIG_END
+ HC55516(config, m_hc55516, 0).add_route(ALL_OUTPUTS, *this, 0.5);
+}
void wpcsnd_device::device_start()
diff --git a/src/mame/audio/wswan.cpp b/src/mame/audio/wswan.cpp
index e8638bbc850..a7cb1ab1ceb 100644
--- a/src/mame/audio/wswan.cpp
+++ b/src/mame/audio/wswan.cpp
@@ -282,7 +282,7 @@ void wswan_sound_device::wswan_ch_set_freq( CHAN *ch, uint16_t freq )
ch->period = 2048 - freq;
}
-WRITE8_MEMBER( wswan_sound_device::port_w )
+void wswan_sound_device::port_w(offs_t offset, uint8_t data)
{
m_channel->update();
diff --git a/src/mame/audio/wswan.h b/src/mame/audio/wswan.h
index d04301ac868..3e39081ad57 100644
--- a/src/mame/audio/wswan.h
+++ b/src/mame/audio/wswan.h
@@ -25,7 +25,7 @@ class wswan_sound_device : public device_t,
public:
wswan_sound_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- DECLARE_WRITE8_MEMBER( port_w );
+ void port_w(offs_t offset, uint8_t data);
protected:
struct CHAN
diff --git a/src/mame/audio/zaccaria.cpp b/src/mame/audio/zaccaria.cpp
index b7284a1f8b4..da94bae6ce1 100644
--- a/src/mame/audio/zaccaria.cpp
+++ b/src/mame/audio/zaccaria.cpp
@@ -189,10 +189,10 @@ READ8_MEMBER(zac1b111xx_melody_base::melodypia_porta_r)
u8 data = 0xff;
if (0x01 == (control & 0x03))
- data &= m_melodypsg1->data_r(space, 0);
+ data &= m_melodypsg1->data_r();
if (0x04 == (control & 0x0c))
- data &= m_melodypsg2->data_r(space, 0);
+ data &= m_melodypsg2->data_r();
return data;
}
@@ -202,19 +202,19 @@ WRITE8_MEMBER(zac1b111xx_melody_base::melodypia_porta_w)
u8 const control = m_melodypia->b_output();
if (control & 0x02)
- m_melodypsg1->data_address_w(space, (control >> 0) & 0x01, data);
+ m_melodypsg1->data_address_w((control >> 0) & 0x01, data);
if (control & 0x08)
- m_melodypsg2->data_address_w(space, (control >> 2) & 0x01, data);
+ m_melodypsg2->data_address_w((control >> 2) & 0x01, data);
}
WRITE8_MEMBER(zac1b111xx_melody_base::melodypia_portb_w)
{
if (data & 0x02)
- m_melodypsg1->data_address_w(space, (data >> 0) & 0x01, m_melodypia->a_output());
+ m_melodypsg1->data_address_w((data >> 0) & 0x01, m_melodypia->a_output());
if (data & 0x08)
- m_melodypsg2->data_address_w(space, (data >> 2) & 0x01, m_melodypia->a_output());
+ m_melodypsg2->data_address_w((data >> 2) & 0x01, m_melodypia->a_output());
}
READ8_MEMBER(zac1b111xx_melody_base::melodypsg1_portb_r)
@@ -430,7 +430,6 @@ void zac1b11142_audio_device::device_add_mconfig(machine_config &config)
MC1408(config, "dac", 0).add_route(ALL_OUTPUTS, *this, 0.40, AUTO_ALLOC_INPUT, 0); // mc1408.1f
voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref", 0));
- vref.set_output(5.0);
vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT);
vref.add_route(0, "dac", -1.0, DAC_VREF_NEG_INPUT);
diff --git a/src/mame/drivers/1942.cpp b/src/mame/drivers/1942.cpp
index a063ee16ef9..3dea5f551d8 100644
--- a/src/mame/drivers/1942.cpp
+++ b/src/mame/drivers/1942.cpp
@@ -566,17 +566,18 @@ void _1942_state::machine_reset()
MACHINE_CONFIG_START(_1942_state::_1942)
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, MAIN_CPU_CLOCK) /* 4 MHz ??? */
- MCFG_DEVICE_PROGRAM_MAP(_1942_map)
- MCFG_TIMER_DRIVER_ADD_SCANLINE("scantimer", _1942_state, _1942_scanline, "screen", 0, 1)
+ Z80(config, m_maincpu, MAIN_CPU_CLOCK); /* 4 MHz ??? */
+ m_maincpu->set_addrmap(AS_PROGRAM, &_1942_state::_1942_map);
- MCFG_DEVICE_ADD("audiocpu", Z80, SOUND_CPU_CLOCK) /* 3 MHz ??? */
- MCFG_DEVICE_PROGRAM_MAP(sound_map)
- MCFG_DEVICE_PERIODIC_INT_DRIVER(_1942_state, irq0_line_hold, 4*60)
+ TIMER(config, "scantimer").configure_scanline(FUNC(_1942_state::_1942_scanline), "screen", 0, 1);
+
+ Z80(config, m_audiocpu, SOUND_CPU_CLOCK); /* 3 MHz ??? */
+ m_audiocpu->set_addrmap(AS_PROGRAM, &_1942_state::sound_map);
+ m_audiocpu->set_periodic_int(FUNC(_1942_state::irq0_line_hold), attotime::from_hz(4*60));
/* video hardware */
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_1942)
+ GFXDECODE(config, m_gfxdecode, m_palette, gfx_1942);
PALETTE(config, m_palette, FUNC(_1942_state::_1942_palette), 64*4+4*32*8+16*16, 256);
@@ -627,21 +628,21 @@ MACHINE_CONFIG_START(_1942_state::_1942)
MACHINE_CONFIG_END
-MACHINE_CONFIG_START(_1942p_state::_1942p)
-
+void _1942p_state::_1942p(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, MAIN_CPU_CLOCK_1942P) /* 4 MHz - verified on PCB */
- MCFG_DEVICE_PROGRAM_MAP(_1942p_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", _1942p_state, irq0_line_hold) // note, powerups won't move down the screen with the original '1942' logic.
+ Z80(config, m_maincpu, MAIN_CPU_CLOCK_1942P); /* 4 MHz - verified on PCB */
+ m_maincpu->set_addrmap(AS_PROGRAM, &_1942p_state::_1942p_map);
+ m_maincpu->set_vblank_int("screen", FUNC(_1942p_state::irq0_line_hold)); // note, powerups won't move down the screen with the original '1942' logic.
- MCFG_DEVICE_ADD("audiocpu", Z80, SOUND_CPU_CLOCK_1942P) /* 4 MHz - verified on PCB */
- MCFG_DEVICE_PROGRAM_MAP(_1942p_sound_map)
- MCFG_DEVICE_IO_MAP(_1942p_sound_io)
- MCFG_DEVICE_PERIODIC_INT_DRIVER(_1942p_state, irq0_line_hold, 4*60)
+ Z80(config, m_audiocpu, SOUND_CPU_CLOCK_1942P); /* 4 MHz - verified on PCB */
+ m_audiocpu->set_addrmap(AS_PROGRAM, &_1942p_state::_1942p_sound_map);
+ m_audiocpu->set_addrmap(AS_IO, &_1942p_state::_1942p_sound_io);
+ m_audiocpu->set_periodic_int(FUNC(_1942p_state::irq0_line_hold), attotime::from_hz(4*60));
/* video hardware */
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_1942p)
+ GFXDECODE(config, m_gfxdecode, m_palette, gfx_1942p);
PALETTE(config, m_palette, FUNC(_1942p_state::_1942p_palette), 0x500, 0x400);
@@ -662,7 +663,7 @@ MACHINE_CONFIG_START(_1942p_state::_1942p)
AY8910(config, "ay1", AUDIO_CLOCK_1942P).add_route(ALL_OUTPUTS, "mono", 0.25); // 1.25 MHz - verified on PCB
AY8910(config, "ay2", AUDIO_CLOCK_1942P).add_route(ALL_OUTPUTS, "mono", 0.25); // 1.25 MHz - verified on PCB
-MACHINE_CONFIG_END
+}
/***************************************************************************
diff --git a/src/mame/drivers/1943.cpp b/src/mame/drivers/1943.cpp
index f404a87765e..0f68850bff5 100644
--- a/src/mame/drivers/1943.cpp
+++ b/src/mame/drivers/1943.cpp
@@ -311,29 +311,29 @@ void _1943_state::machine_reset()
m_prot_value = 0;
}
-MACHINE_CONFIG_START(_1943_state::_1943)
-
+void _1943_state::_1943(machine_config &config)
+{
// basic machine hardware
- MCFG_DEVICE_ADD("maincpu", Z80, XTAL(24'000'000)/4) /* verified on pcb */
- MCFG_DEVICE_PROGRAM_MAP(c1943_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", _1943_state, irq0_line_hold)
+ Z80(config, m_maincpu, XTAL(24'000'000)/4); /* verified on pcb */
+ m_maincpu->set_addrmap(AS_PROGRAM, &_1943_state::c1943_map);
+ m_maincpu->set_vblank_int("screen", FUNC(_1943_state::irq0_line_hold));
- MCFG_DEVICE_ADD("audiocpu", Z80, XTAL(24'000'000)/8) /* verified on pcb */
- MCFG_DEVICE_PROGRAM_MAP(sound_map)
- MCFG_DEVICE_PERIODIC_INT_DRIVER(_1943_state, irq0_line_hold, 4*60)
+ z80_device &audiocpu(Z80(config, "audiocpu", XTAL(24'000'000)/8)); /* verified on pcb */
+ audiocpu.set_addrmap(AS_PROGRAM, &_1943_state::sound_map);
+ audiocpu.set_periodic_int(FUNC(_1943_state::irq0_line_hold), attotime::from_hz(4*60));
WATCHDOG_TIMER(config, "watchdog");
// video hardware
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(32*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(_1943_state, screen_update_1943)
- MCFG_SCREEN_PALETTE(m_palette)
-
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, m_palette, gfx_1943)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(32*8, 32*8);
+ screen.set_visarea(0*8, 32*8-1, 2*8, 30*8-1);
+ screen.set_screen_update(FUNC(_1943_state::screen_update_1943));
+ screen.set_palette(m_palette);
+
+ GFXDECODE(config, m_gfxdecode, m_palette, gfx_1943);
PALETTE(config, m_palette, FUNC(_1943_state::_1943_palette), 32*4+16*16+16*16+16*16, 256);
// sound hardware
@@ -341,18 +341,18 @@ MACHINE_CONFIG_START(_1943_state::_1943)
GENERIC_LATCH_8(config, "soundlatch");
- MCFG_DEVICE_ADD("ym1", YM2203, XTAL(24'000'000)/16) /* verified on pcb */
- MCFG_SOUND_ROUTE(0, "mono", 0.15)
- MCFG_SOUND_ROUTE(1, "mono", 0.15)
- MCFG_SOUND_ROUTE(2, "mono", 0.15)
- MCFG_SOUND_ROUTE(3, "mono", 0.10)
-
- MCFG_DEVICE_ADD("ym2", YM2203, XTAL(24'000'000)/16) /* verified on pcb */
- MCFG_SOUND_ROUTE(0, "mono", 0.15)
- MCFG_SOUND_ROUTE(1, "mono", 0.15)
- MCFG_SOUND_ROUTE(2, "mono", 0.15)
- MCFG_SOUND_ROUTE(3, "mono", 0.10)
-MACHINE_CONFIG_END
+ ym2203_device &ym1(YM2203(config, "ym1", XTAL(24'000'000)/16)); /* verified on pcb */
+ ym1.add_route(0, "mono", 0.15);
+ ym1.add_route(1, "mono", 0.15);
+ ym1.add_route(2, "mono", 0.15);
+ ym1.add_route(3, "mono", 0.10);
+
+ ym2203_device &ym2(YM2203(config, "ym2", XTAL(24'000'000)/16)); /* verified on pcb */
+ ym2.add_route(0, "mono", 0.15);
+ ym2.add_route(1, "mono", 0.15);
+ ym2.add_route(2, "mono", 0.15);
+ ym2.add_route(3, "mono", 0.10);
+}
/* ROMs */
diff --git a/src/mame/drivers/20pacgal.cpp b/src/mame/drivers/20pacgal.cpp
index 77e1873ac23..38883d77efb 100644
--- a/src/mame/drivers/20pacgal.cpp
+++ b/src/mame/drivers/20pacgal.cpp
@@ -420,7 +420,6 @@ void _20pacgal_state::_20pacgal(machine_config &config)
DAC_8BIT_R2R(config, "dac", 0).add_route(ALL_OUTPUTS, "speaker", 1.0); // unknown DAC
voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref", 0));
- vref.set_output(5.0);
vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT);
vref.add_route(0, "dac", -1.0, DAC_VREF_NEG_INPUT);
}
diff --git a/src/mame/drivers/24cdjuke.cpp b/src/mame/drivers/24cdjuke.cpp
index b0136b54929..565169ea73c 100644
--- a/src/mame/drivers/24cdjuke.cpp
+++ b/src/mame/drivers/24cdjuke.cpp
@@ -283,12 +283,13 @@ void midcoin24cdjuke_state::machine_reset()
}
-MACHINE_CONFIG_START(midcoin24cdjuke_state::midcoin24cdjuke)
+void midcoin24cdjuke_state::midcoin24cdjuke(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80,6000000) /* ? MHz */
- MCFG_DEVICE_PROGRAM_MAP(midcoin24cdjuke_map)
- MCFG_DEVICE_IO_MAP(midcoin24cdjuke_io)
- MCFG_DEVICE_PERIODIC_INT_DRIVER(midcoin24cdjuke_state, irq0_line_hold, 500)
+ Z80(config, m_maincpu, 6000000); /* ? MHz */
+ m_maincpu->set_addrmap(AS_PROGRAM, &midcoin24cdjuke_state::midcoin24cdjuke_map);
+ m_maincpu->set_addrmap(AS_IO, &midcoin24cdjuke_state::midcoin24cdjuke_io);
+ m_maincpu->set_periodic_int(FUNC(midcoin24cdjuke_state::irq0_line_hold), attotime::from_hz(500));
config.set_default_layout(layout_24cdjuke);
@@ -305,7 +306,7 @@ MACHINE_CONFIG_START(midcoin24cdjuke_state::midcoin24cdjuke)
i8255_device &ic31(I8255A(config, "ic31", 0));
ic31.out_pb_callback().set_log("PPI8255 - unmapped write port B");
ic31.in_pc_callback().set_ioport("MD4");
-MACHINE_CONFIG_END
+}
ROM_START( 24cdjuke )
diff --git a/src/mame/drivers/39in1.cpp b/src/mame/drivers/39in1.cpp
index ccd6a241677..ed5aa3df6b6 100644
--- a/src/mame/drivers/39in1.cpp
+++ b/src/mame/drivers/39in1.cpp
@@ -286,10 +286,11 @@ void _39in1_state::_39in1(machine_config &config)
m_pxa_periphs->gpio0_in_cb().set(FUNC(_39in1_state::eeprom_r));
}
-MACHINE_CONFIG_START(_39in1_state::_60in1)
+void _39in1_state::_60in1(machine_config &config)
+{
_39in1(config);
MCFG_MACHINE_START_OVERRIDE(_39in1_state,60in1)
-MACHINE_CONFIG_END
+}
ROM_START( 39in1 )
// main program, encrypted
diff --git a/src/mame/drivers/3do.cpp b/src/mame/drivers/3do.cpp
index 9e6af48c6cf..21c83a4d497 100644
--- a/src/mame/drivers/3do.cpp
+++ b/src/mame/drivers/3do.cpp
@@ -154,40 +154,40 @@ void _3do_state::machine_reset()
m_clio.cstatbits = 0x01; /* bit 0 = reset of clio caused by power on */
}
-MACHINE_CONFIG_START(_3do_state::_3do)
-
+void _3do_state::_3do(machine_config &config)
+{
/* Basic machine hardware */
- MCFG_DEVICE_ADD( m_maincpu, ARM7_BE, XTAL(50'000'000)/4 )
- MCFG_DEVICE_PROGRAM_MAP( main_mem)
+ ARM7_BE(config, m_maincpu, XTAL(50'000'000)/4);
+ m_maincpu->set_addrmap(AS_PROGRAM, &_3do_state::main_mem);
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_1);
- MCFG_TIMER_DRIVER_ADD_PERIODIC("timer_x16", _3do_state, timer_x16_cb, attotime::from_hz(12000)) // TODO: timing
-
- MCFG_SCREEN_ADD(m_screen, RASTER)
- MCFG_SCREEN_RAW_PARAMS( X2_CLOCK_NTSC / 2, 1592, 254, 1534, 263, 22, 262 )
- MCFG_SCREEN_UPDATE_DRIVER(_3do_state, screen_update)
+ TIMER(config, "timer_x16").configure_periodic(FUNC(_3do_state::timer_x16_cb), attotime::from_hz(12000)); // TODO: timing
- MCFG_CDROM_ADD("cdrom")
-MACHINE_CONFIG_END
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_raw(X2_CLOCK_NTSC / 2, 1592, 254, 1534, 263, 22, 262);
+ m_screen->set_screen_update(FUNC(_3do_state::screen_update));
+ CDROM(config, "cdrom");
+}
-MACHINE_CONFIG_START(_3do_state::_3do_pal)
+void _3do_state::_3do_pal(machine_config &config)
+{
/* Basic machine hardware */
- MCFG_DEVICE_ADD(m_maincpu, ARM7_BE, XTAL(50'000'000)/4 )
- MCFG_DEVICE_PROGRAM_MAP( main_mem)
+ ARM7_BE(config, m_maincpu, XTAL(50'000'000)/4);
+ m_maincpu->set_addrmap(AS_PROGRAM, &_3do_state::main_mem);
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_1);
- MCFG_TIMER_DRIVER_ADD_PERIODIC("timer_x16", _3do_state, timer_x16_cb, attotime::from_hz(12000)) // TODO: timing
+ TIMER(config, "timer_x16").configure_periodic(FUNC(_3do_state::timer_x16_cb), attotime::from_hz(12000)); // TODO: timing
- MCFG_SCREEN_ADD(m_screen, RASTER)
- MCFG_SCREEN_RAW_PARAMS( X2_CLOCK_PAL / 2, 1592, 254, 1534, 263, 22, 262 ) // TODO: proper params
- MCFG_SCREEN_UPDATE_DRIVER(_3do_state, screen_update)
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_raw(X2_CLOCK_PAL / 2, 1592, 254, 1534, 263, 22, 262); // TODO: proper params
+ m_screen->set_screen_update(FUNC(_3do_state::screen_update));
- MCFG_CDROM_ADD("cdrom")
-MACHINE_CONFIG_END
+ CDROM(config, "cdrom");
+}
#if 0
#define NTSC_BIOS \
diff --git a/src/mame/drivers/3x3puzzl.cpp b/src/mame/drivers/3x3puzzl.cpp
index 90cb23b4e5b..b390a774651 100644
--- a/src/mame/drivers/3x3puzzl.cpp
+++ b/src/mame/drivers/3x3puzzl.cpp
@@ -388,20 +388,20 @@ void _3x3puzzle_state::machine_reset()
}
-MACHINE_CONFIG_START(_3x3puzzle_state::_3x3puzzle)
-
+void _3x3puzzle_state::_3x3puzzle(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu",M68000,MAIN_CLOCK)
- MCFG_DEVICE_PROGRAM_MAP(_3x3puzzle_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", _3x3puzzle_state, irq4_line_hold)
+ M68000(config, m_maincpu, MAIN_CLOCK);
+ m_maincpu->set_addrmap(AS_PROGRAM, &_3x3puzzle_state::_3x3puzzle_map);
+ m_maincpu->set_vblank_int("screen", FUNC(_3x3puzzle_state::irq4_line_hold));
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500))
- MCFG_SCREEN_UPDATE_DRIVER(_3x3puzzle_state, screen_update)
- MCFG_SCREEN_SIZE(64*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 40*8-1, 0*8, 30*8-1)
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_refresh_hz(60);
+ m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(2500));
+ m_screen->set_screen_update(FUNC(_3x3puzzle_state::screen_update));
+ m_screen->set_size(64*8, 32*8);
+ m_screen->set_visarea(0*8, 40*8-1, 0*8, 30*8-1);
GFXDECODE(config, m_gfxdecode, "palette", gfx_3x3puzzle);
@@ -409,9 +409,8 @@ MACHINE_CONFIG_START(_3x3puzzle_state::_3x3puzzle)
/* sound hardware */
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("oki", OKIM6295, XTAL(4'000'000)/4, okim6295_device::PIN7_HIGH)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
-MACHINE_CONFIG_END
+ OKIM6295(config, m_oki, XTAL(4'000'000)/4, okim6295_device::PIN7_HIGH).add_route(ALL_OUTPUTS, "mono", 1.0);
+}
/***************************************************************************
diff --git a/src/mame/drivers/4004clk.cpp b/src/mame/drivers/4004clk.cpp
index d80d369b3a8..0071e0c56a5 100644
--- a/src/mame/drivers/4004clk.cpp
+++ b/src/mame/drivers/4004clk.cpp
@@ -134,8 +134,8 @@ void nixieclock_state::machine_start()
save_pointer(NAME(m_nixie), 6);
}
-MACHINE_CONFIG_START(nixieclock_state::_4004clk)
-
+void nixieclock_state::_4004clk(machine_config &config)
+{
/* basic machine hardware */
i4004_cpu_device &cpu(I4004(config, "maincpu", 5_MHz_XTAL / 8));
cpu.set_rom_map(&nixieclock_state::_4004clk_rom);
@@ -149,13 +149,13 @@ MACHINE_CONFIG_START(nixieclock_state::_4004clk)
/* sound hardware */
SPEAKER(config, "speaker").front_center();
- MCFG_DEVICE_ADD("dac", DAC_1BIT, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 0.25)
- MCFG_DEVICE_ADD("vref", VOLTAGE_REGULATOR, 0) MCFG_VOLTAGE_REGULATOR_OUTPUT(5.0)
- MCFG_SOUND_ROUTE(0, "dac", 1.0, DAC_VREF_POS_INPUT)
+ DAC_1BIT(config, "dac", 0).add_route(ALL_OUTPUTS, "speaker", 0.25);
+ voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref", 0));
+ vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT);
- MCFG_CLOCK_ADD("clk", 60)
- MCFG_CLOCK_SIGNAL_HANDLER(INPUTLINE("maincpu", I4004_TEST_LINE))
-MACHINE_CONFIG_END
+ clock_device &clk(CLOCK(config, "clk", 60));
+ clk.signal_handler().set_inputline("maincpu", I4004_TEST_LINE);
+}
/* ROM definition */
ROM_START( 4004clk )
diff --git a/src/mame/drivers/40love.cpp b/src/mame/drivers/40love.cpp
index 00840d27d24..65f1a29217a 100644
--- a/src/mame/drivers/40love.cpp
+++ b/src/mame/drivers/40love.cpp
@@ -730,7 +730,6 @@ void fortyl_state::common(machine_config &config)
DAC_8BIT_R2R(config, "dac", 0).add_route(ALL_OUTPUTS, "speaker", 0.2); // unknown DAC
voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref", 0));
- vref.set_output(5.0);
vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT);
vref.add_route(0, "dac", -1.0, DAC_VREF_NEG_INPUT);
}
diff --git a/src/mame/drivers/4dpi.cpp b/src/mame/drivers/4dpi.cpp
index 4bea366bc98..191edfbd51d 100644
--- a/src/mame/drivers/4dpi.cpp
+++ b/src/mame/drivers/4dpi.cpp
@@ -239,23 +239,21 @@ void sgi_ip6_state::sgi_ip6_map(address_map &map)
MACHINE DRIVERS
***************************************************************************/
-MACHINE_CONFIG_START(sgi_ip6_state::sgi_ip6)
+void sgi_ip6_state::sgi_ip6(machine_config &config)
+{
R2000(config, m_maincpu, 25_MHz_XTAL / 2, 16384, 8192);
m_maincpu->set_endianness(ENDIANNESS_BIG);
m_maincpu->set_addrmap(AS_PROGRAM, &sgi_ip6_state::sgi_ip6_map);
m_maincpu->set_vblank_int("screen", FUNC(sgi_ip6_state::sgi_ip6_vbl));
-
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE( 60 )
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */
- MCFG_SCREEN_SIZE(640, 480)
- MCFG_SCREEN_VISIBLE_AREA(0, 640-1, 0, 480-1)
- MCFG_SCREEN_UPDATE_DRIVER(sgi_ip6_state, screen_update_sgi_ip6)
-
-
-MACHINE_CONFIG_END
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */
+ screen.set_size(640, 480);
+ screen.set_visarea(0, 640-1, 0, 480-1);
+ screen.set_screen_update(FUNC(sgi_ip6_state::screen_update_sgi_ip6));
+}
static INPUT_PORTS_START( sgi_ip6 )
PORT_START("UNUSED") // unused IN0
diff --git a/src/mame/drivers/4enlinea.cpp b/src/mame/drivers/4enlinea.cpp
index be19ea3ab00..a91b52ac1c0 100644
--- a/src/mame/drivers/4enlinea.cpp
+++ b/src/mame/drivers/4enlinea.cpp
@@ -500,24 +500,26 @@ INTERRUPT_GEN_MEMBER(_4enlinea_state::_4enlinea_audio_irq)
device.execute().set_input_line(0, HOLD_LINE);
}
-MACHINE_CONFIG_START(_4enlinea_state::_4enlinea)
-
+void _4enlinea_state::_4enlinea(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, PRG_CPU_CLOCK)
- MCFG_DEVICE_PROGRAM_MAP(main_map)
- MCFG_DEVICE_IO_MAP(main_portmap)
- MCFG_DEVICE_PERIODIC_INT_DRIVER(_4enlinea_state, _4enlinea_irq, 60) //TODO
-// MCFG_DEVICE_PERIODIC_INT_DRIVER(_4enlinea_state, irq0_line_hold, 4*35)
+ Z80(config, m_maincpu, PRG_CPU_CLOCK);
+ m_maincpu->set_addrmap(AS_PROGRAM, &_4enlinea_state::main_map);
+ m_maincpu->set_addrmap(AS_IO, &_4enlinea_state::main_portmap);
+ m_maincpu->set_periodic_int(FUNC(_4enlinea_state::_4enlinea_irq), attotime::from_hz(60)); //TODO
+// m_maincpu->set_periodic_int(FUNC(_4enlinea_state::irq0_line_hold), attotime::from_hz(4*35));
- MCFG_DEVICE_ADD("audiocpu", Z80, SND_CPU_CLOCK)
- MCFG_DEVICE_PROGRAM_MAP(audio_map)
- MCFG_DEVICE_IO_MAP(audio_portmap)
- MCFG_DEVICE_PERIODIC_INT_DRIVER(_4enlinea_state, _4enlinea_audio_irq, 60) //TODO
+ z80_device &audiocpu(Z80(config, "audiocpu", SND_CPU_CLOCK));
+ audiocpu.set_addrmap(AS_PROGRAM, &_4enlinea_state::audio_map);
+ audiocpu.set_addrmap(AS_IO, &_4enlinea_state::audio_portmap);
+ audiocpu.set_periodic_int(FUNC(_4enlinea_state::_4enlinea_audio_irq), attotime::from_hz(60)); //TODO
// FIXME: determine ISA bus clock
- ISA8(config, "isa", 0).set_cputag("maincpu");
+ isa8_device &isa(ISA8(config, "isa", 0));
+ isa.set_memspace("maincpu", AS_PROGRAM);
+ isa.set_iospace("maincpu", AS_IO);
- MCFG_DEVICE_ADD("isa1", ISA8_SLOT, 0, "isa", _4enlinea_isa8_cards, "4enlinea", true)
+ ISA8_SLOT(config, "isa1", 0, "isa", _4enlinea_isa8_cards, "4enlinea", true);
/* 6845 clock is a guess, since it's a UM6845R embedded in the UM487F.
@@ -535,7 +537,7 @@ MACHINE_CONFIG_START(_4enlinea_state::_4enlinea)
m_ay->port_a_read_callback().set_ioport("IN-P2");
m_ay->port_b_read_callback().set_ioport("IN-P1");
m_ay->add_route(ALL_OUTPUTS, "mono", 0.50);
-MACHINE_CONFIG_END
+}
/***********************************
diff --git a/src/mame/drivers/4enraya.cpp b/src/mame/drivers/4enraya.cpp
index 7a05333266f..793ec6a0960 100644
--- a/src/mame/drivers/4enraya.cpp
+++ b/src/mame/drivers/4enraya.cpp
@@ -178,12 +178,12 @@ WRITE8_MEMBER(_4enraya_state::sound_control_w)
{
case 0: case 3:
// latch address
- m_ay->address_w(space, 0, m_soundlatch);
+ m_ay->address_w(m_soundlatch);
break;
case 2:
// write to psg
- m_ay->data_w(space, 0, m_soundlatch);
+ m_ay->data_w(m_soundlatch);
break;
default:
@@ -470,48 +470,47 @@ void _4enraya_state::machine_reset()
* Machine Drivers *
***********************************/
-MACHINE_CONFIG_START(_4enraya_state::_4enraya )
-
+void _4enraya_state::_4enraya(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, MAIN_CLOCK/2)
- MCFG_DEVICE_PROGRAM_MAP(main_map)
- MCFG_DEVICE_IO_MAP(main_portmap)
- MCFG_DEVICE_PERIODIC_INT_DRIVER(_4enraya_state, irq0_line_hold, 4*60) // unknown timing
+ Z80(config, m_maincpu, MAIN_CLOCK/2);
+ m_maincpu->set_addrmap(AS_PROGRAM, &_4enraya_state::main_map);
+ m_maincpu->set_addrmap(AS_IO, &_4enraya_state::main_portmap);
+ m_maincpu->set_periodic_int(FUNC(_4enraya_state::irq0_line_hold), attotime::from_hz(4*60)); // unknown timing
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(32*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(_4enraya_state, screen_update_4enraya)
- MCFG_SCREEN_PALETTE(m_palette)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(32*8, 32*8);
+ screen.set_visarea(0*8, 32*8-1, 2*8, 30*8-1);
+ screen.set_screen_update(FUNC(_4enraya_state::screen_update_4enraya));
+ screen.set_palette(m_palette);
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_4enraya)
+ GFXDECODE(config, m_gfxdecode, m_palette, gfx_4enraya);
PALETTE(config, m_palette, palette_device::RGB_3BIT);
/* sound hardware */
SPEAKER(config, "mono").front_center();
AY8910(config, m_ay, MAIN_CLOCK/4).add_route(ALL_OUTPUTS, "mono", 0.3); /* guess */
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(unk_gambl_state::unkpacg)
+void unk_gambl_state::unkpacg(machine_config &config)
+{
_4enraya(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(unkpacg_main_map)
- MCFG_DEVICE_IO_MAP(unkpacg_main_portmap)
+ m_maincpu->set_addrmap(AS_PROGRAM, &unk_gambl_state::unkpacg_main_map);
+ m_maincpu->set_addrmap(AS_IO, &unk_gambl_state::unkpacg_main_portmap);
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
/* sound hardware */
-// SPEAKER(config, "mono").front_center();
AY8910(config.replace(), m_ay, MAIN_CLOCK/4); /* guess */
m_ay->port_a_read_callback().set_ioport("DSW2");
m_ay->add_route(ALL_OUTPUTS, "mono", 1.0);
-MACHINE_CONFIG_END
+}
/***********************************
diff --git a/src/mame/drivers/4roses.cpp b/src/mame/drivers/4roses.cpp
index 9ec63144db4..bf8c3e00c91 100644
--- a/src/mame/drivers/4roses.cpp
+++ b/src/mame/drivers/4roses.cpp
@@ -454,25 +454,26 @@ GFXDECODE_END
* Machine Drivers *
**************************/
-MACHINE_CONFIG_START(_4roses_state::_4roses)
+void _4roses_state::_4roses(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M65C02, MASTER_CLOCK/8) /* 2MHz, guess */
- MCFG_DEVICE_PROGRAM_MAP(_4roses_map)
- MCFG_DEVICE_OPCODES_MAP(_4roses_opcodes_map)
+ M65C02(config, m_maincpu, MASTER_CLOCK/8); /* 2MHz, guess */
+ m_maincpu->set_addrmap(AS_PROGRAM, &_4roses_state::_4roses_map);
+ m_maincpu->set_addrmap(AS_OPCODES, &_4roses_state::_4roses_opcodes_map);
// NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE((124+1)*4, (30+1)*8) /* guess. taken from funworld games */
- MCFG_SCREEN_VISIBLE_AREA(0*4, 96*4-1, 0*8, 29*8-1) /* guess. taken from funworld games */
- MCFG_SCREEN_UPDATE_DRIVER(_4roses_state, screen_update_funworld)
- MCFG_SCREEN_PALETTE("palette")
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size((124+1)*4, (30+1)*8); /* guess. taken from funworld games */
+ screen.set_visarea(0*4, 96*4-1, 0*8, 29*8-1); /* guess. taken from funworld games */
+ screen.set_screen_update(FUNC(_4roses_state::screen_update_funworld));
+ screen.set_palette("palette");
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_4roses)
+ GFXDECODE(config, m_gfxdecode, "palette", gfx_4roses);
PALETTE(config, "palette", FUNC(_4roses_state::funworld_palette), 0x1000);
@@ -486,14 +487,15 @@ MACHINE_CONFIG_START(_4roses_state::_4roses)
SPEAKER(config, "mono").front_center();
AY8910(config, "ay8910", MASTER_CLOCK/8).add_route(ALL_OUTPUTS, "mono", 2.5); /* 2MHz, guess */
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(rugby_state::rugby)
+void rugby_state::rugby(machine_config &config)
+{
_4roses(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(rugby_map)
- MCFG_DEVICE_OPCODES_MAP(rugby_opcodes_map)
-MACHINE_CONFIG_END
+
+ m_maincpu->set_addrmap(AS_PROGRAM, &rugby_state::rugby_map);
+ m_maincpu->set_addrmap(AS_OPCODES, &rugby_state::rugby_opcodes_map);
+}
/*************************
diff --git a/src/mame/drivers/5clown.cpp b/src/mame/drivers/5clown.cpp
index 82097ed930b..192bae5fba5 100644
--- a/src/mame/drivers/5clown.cpp
+++ b/src/mame/drivers/5clown.cpp
@@ -509,7 +509,7 @@ private:
DECLARE_WRITE8_MEMBER(trigsnd_w);
DECLARE_READ8_MEMBER(pia0_b_r);
DECLARE_READ8_MEMBER(pia1_b_r);
- DECLARE_WRITE8_MEMBER(fclown_ay8910_w);
+ void fclown_ay8910_w(offs_t offset, u8 data);
TILE_GET_INFO_MEMBER(get_fclown_tile_info);
void _5clown_palette(palette_device &palette) const;
uint32_t screen_update_fclown(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
@@ -583,12 +583,12 @@ uint32_t _5clown_state::screen_update_fclown(screen_device &screen, bitmap_ind16
void _5clown_state::_5clown_palette(palette_device &palette) const
{
/*
- 7654 3210
- ---- ---x RED component.
- ---- --x- GREEN component.
- ---- -x-- BLUE component.
- ---- x--- background killer.
- xxxx ---- unused.
+ 7654 3210
+ ---- ---x RED component.
+ ---- --x- GREEN component.
+ ---- -x-- BLUE component.
+ ---- x--- background killer.
+ xxxx ---- unused.
*/
/* 0000KBGR */
@@ -714,10 +714,10 @@ WRITE8_MEMBER(_5clown_state::cpu_d800_w)
* AY3-8910 R/W Handlers *
********************************/
-WRITE8_MEMBER(_5clown_state::fclown_ay8910_w)
+void _5clown_state::fclown_ay8910_w(offs_t offset, u8 data)
{
- m_ay8910->address_w(space, 0, offset);
- m_ay8910->data_w(space, 0, data);
+ m_ay8910->address_w(offset);
+ m_ay8910->data_w(data);
}
@@ -742,7 +742,7 @@ WRITE8_MEMBER(_5clown_state::snd_800_w)
if (m_snd_latch_0a02 == 0x00)
{
- fclown_ay8910_w(space, m_ay8910_addr, m_snd_latch_0800);
+ fclown_ay8910_w(m_ay8910_addr, m_snd_latch_0800);
}
}
@@ -1020,14 +1020,14 @@ GFXDECODE_END
* Machine Drivers *
*************************/
-MACHINE_CONFIG_START(_5clown_state::fclown)
-
+void _5clown_state::fclown(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M6502, MASTER_CLOCK/8) /* guess, seems ok */
- MCFG_DEVICE_PROGRAM_MAP(fclown_map)
+ M6502(config, m_maincpu, MASTER_CLOCK/8); /* guess, seems ok */
+ m_maincpu->set_addrmap(AS_PROGRAM, &_5clown_state::fclown_map);
- MCFG_DEVICE_ADD("audiocpu", M6502, MASTER_CLOCK/8) /* guess, seems ok */
- MCFG_DEVICE_PROGRAM_MAP(fcaudio_map)
+ M6502(config, m_audiocpu, MASTER_CLOCK/8); /* guess, seems ok */
+ m_audiocpu->set_addrmap(AS_PROGRAM, &_5clown_state::fcaudio_map);
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
@@ -1043,13 +1043,13 @@ MACHINE_CONFIG_START(_5clown_state::fclown)
pia1.writepb_handler().set(FUNC(_5clown_state::mux_w));
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE((39+1)*8, (31+1)*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 0*8, 32*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(_5clown_state, screen_update_fclown)
- MCFG_SCREEN_PALETTE(m_palette)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size((39+1)*8, (31+1)*8);
+ screen.set_visarea(0*8, 32*8-1, 0*8, 32*8-1);
+ screen.set_screen_update(FUNC(_5clown_state::screen_update_fclown));
+ screen.set_palette(m_palette);
GFXDECODE(config, m_gfxdecode, m_palette, gfx_fclown);
PALETTE(config, m_palette, FUNC(_5clown_state::_5clown_palette), 256);
@@ -1065,10 +1065,8 @@ MACHINE_CONFIG_START(_5clown_state::fclown)
AY8910(config, m_ay8910, MASTER_CLOCK/8).add_route(ALL_OUTPUTS, "mono", 1.00); /* guess, seems ok */
- MCFG_DEVICE_ADD("oki6295", OKIM6295, MASTER_CLOCK/12, okim6295_device::PIN7_LOW) /* guess, seems ok; pin7 guessed, seems ok */
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.20)
-
-MACHINE_CONFIG_END
+ OKIM6295(config, "oki6295", MASTER_CLOCK/12, okim6295_device::PIN7_LOW).add_route(ALL_OUTPUTS, "mono", 1.20); /* guess, seems ok; pin7 guessed, seems ok */
+}
/*************************
diff --git a/src/mame/drivers/8080bw.cpp b/src/mame/drivers/8080bw.cpp
index 54acc0d8645..6650c16c1b7 100644
--- a/src/mame/drivers/8080bw.cpp
+++ b/src/mame/drivers/8080bw.cpp
@@ -819,20 +819,18 @@ void _8080bw_state::spacecom_io_map(address_map &map)
void _8080bw_state::spacecom(machine_config &config)
{
/* basic machine hardware */
- I8080A(config, m_maincpu, XTAL(18'000'000) / 10); // divider guessed
+ I8080A(config, m_maincpu, XTAL(18'000'000) / 9); // divider guessed
// TODO: move irq handling away from mw8080.c, this game runs on custom hardware
m_maincpu->set_addrmap(AS_PROGRAM, &_8080bw_state::spacecom_map);
m_maincpu->set_addrmap(AS_IO, &_8080bw_state::spacecom_io_map);
+ m_maincpu->set_irq_acknowledge_callback(FUNC(_8080bw_state::interrupt_vector));
MCFG_MACHINE_START_OVERRIDE(mw8080bw_state, mw8080bw)
MCFG_MACHINE_RESET_OVERRIDE(mw8080bw_state, mw8080bw)
/* video hardware */
SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
- m_screen->set_refresh_hz(60);
- m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(2500));
- m_screen->set_size(32*8, 32*8);
- m_screen->set_visarea(0*8, 32*8-1, 0*8, 28*8-1);
+ m_screen->set_raw(XTAL(18'000'000) / 3, 384, 0, 256, 260, 0, 224); // parameters guessed
m_screen->set_screen_update(FUNC(_8080bw_state::screen_update_spacecom));
PALETTE(config, m_palette, palette_device::MONOCHROME);
@@ -1144,6 +1142,7 @@ void _8080bw_state::escmars(machine_config &config)
I8080(config, m_maincpu, XTAL(18'000'000) / 10); // divider guessed
m_maincpu->set_addrmap(AS_PROGRAM, &_8080bw_state::escmars_map);
m_maincpu->set_addrmap(AS_IO, &_8080bw_state::lrescue_io_map);
+ m_maincpu->set_irq_acknowledge_callback(FUNC(_8080bw_state::interrupt_vector));
MCFG_MACHINE_START_OVERRIDE(_8080bw_state, extra_8080bw)
MCFG_MACHINE_RESET_OVERRIDE(_8080bw_state, mw8080bw)
@@ -1243,7 +1242,6 @@ void _8080bw_state::cosmicmo(machine_config &config)
/* basic machine hardware */
m_maincpu->set_addrmap(AS_IO, &_8080bw_state::cosmicmo_io_map);
- m_maincpu->set_vblank_int("screen", FUNC(_8080bw_state::irq0_line_hold));
MCFG_MACHINE_START_OVERRIDE(_8080bw_state,extra_8080bw)
@@ -1537,6 +1535,7 @@ void _8080bw_state::schaser(machine_config &config)
I8080(config.replace(), m_maincpu, 1996800); /* 19.968MHz / 10 */
m_maincpu->set_addrmap(AS_PROGRAM, &_8080bw_state::schaser_map);
m_maincpu->set_addrmap(AS_IO, &_8080bw_state::schaser_io_map);
+ m_maincpu->set_irq_acknowledge_callback(FUNC(_8080bw_state::interrupt_vector));
WATCHDOG_TIMER(config, m_watchdog).set_vblank_count("screen", 255);
MCFG_MACHINE_START_OVERRIDE(_8080bw_state,schaser)
@@ -1707,6 +1706,14 @@ CUSTOM_INPUT_MEMBER(_8080bw_state::sflush_80_r)
return (m_screen->vpos() & 0x80) ? 1 : 0;
}
+uint8_t _8080bw_state::sflush_in0_r()
+{
+ // guess at interrupt acknowledgement
+ if (!machine().side_effects_disabled())
+ m_maincpu->set_input_line(0, CLEAR_LINE);
+ return ioport("IN0")->read();
+}
+
void _8080bw_state::sflush_map(address_map &map)
{
map(0x0000, 0x1fff).ram();
@@ -1714,7 +1721,7 @@ void _8080bw_state::sflush_map(address_map &map)
map(0x8008, 0x8008).portr("PADDLE");
map(0x8009, 0x8009).r(m_mb14241, FUNC(mb14241_device::shift_result_r));
map(0x800a, 0x800a).portr("IN2");
- map(0x800b, 0x800b).portr("IN0");
+ map(0x800b, 0x800b).r(FUNC(_8080bw_state::sflush_in0_r));
map(0x8018, 0x8018).w(m_mb14241, FUNC(mb14241_device::shift_data_w));
map(0x8019, 0x8019).w(m_mb14241, FUNC(mb14241_device::shift_count_w));
map(0x801a, 0x801a).nopw();
@@ -1769,7 +1776,6 @@ void _8080bw_state::sflush(machine_config &config)
/* basic machine hardware */
M6800(config.replace(), m_maincpu, 1500000); // ?
m_maincpu->set_addrmap(AS_PROGRAM, &_8080bw_state::sflush_map);
- m_maincpu->set_vblank_int("screen", FUNC(_8080bw_state::irq0_line_hold));
MCFG_MACHINE_START_OVERRIDE(_8080bw_state,sflush)
@@ -1934,14 +1940,17 @@ void _8080bw_state::lupin3a(machine_config &config)
/* */
/*******************************************************/
-INTERRUPT_GEN_MEMBER(_8080bw_state::polaris_interrupt)
+WRITE_LINE_MEMBER(_8080bw_state::polaris_60hz_w)
{
- m_polaris_cloud_speed++;
-
- if (m_polaris_cloud_speed >= 4) /* every 4 frames - this was verified against real machine */
+ if (state)
{
- m_polaris_cloud_speed = 0;
- m_polaris_cloud_pos++;
+ m_polaris_cloud_speed++;
+
+ if (m_polaris_cloud_speed >= 4) /* every 4 frames - this was verified against real machine */
+ {
+ m_polaris_cloud_speed = 0;
+ m_polaris_cloud_pos++;
+ }
}
}
@@ -2039,10 +2048,8 @@ void _8080bw_state::polaris(machine_config &config)
mw8080bw_root(config);
/* basic machine hardware */
- I8080(config.replace(), m_maincpu, 1996800); /* 19.968MHz / 10 */
m_maincpu->set_addrmap(AS_PROGRAM, &_8080bw_state::schaser_map);
m_maincpu->set_addrmap(AS_IO, &_8080bw_state::polaris_io_map);
- m_maincpu->set_vblank_int("screen", FUNC(_8080bw_state::polaris_interrupt));
WATCHDOG_TIMER(config, m_watchdog).set_vblank_count("screen", 255);
@@ -2053,6 +2060,7 @@ void _8080bw_state::polaris(machine_config &config)
/* video hardware */
m_screen->set_screen_update(FUNC(_8080bw_state::screen_update_polaris));
+ m_screen->screen_vblank().set(FUNC(_8080bw_state::polaris_60hz_w));
PALETTE(config, m_palette, palette_device::RBG_3BIT);
@@ -2741,6 +2749,7 @@ void _8080bw_state::shuttlei(machine_config &config)
// TODO: move irq handling away from mw8080.cpp, this game runs on custom hardware
m_maincpu->set_addrmap(AS_PROGRAM, &_8080bw_state::shuttlei_map);
m_maincpu->set_addrmap(AS_IO, &_8080bw_state::shuttlei_io_map);
+ m_maincpu->set_irq_acknowledge_callback(FUNC(_8080bw_state::interrupt_vector));
MCFG_MACHINE_START_OVERRIDE(_8080bw_state, extra_8080bw)
MCFG_MACHINE_RESET_OVERRIDE(_8080bw_state, mw8080bw)
@@ -2796,6 +2805,12 @@ MACHINE_RESET_MEMBER(_8080bw_state,darthvdr)
/* do nothing for now - different interrupt system */
}
+IRQ_CALLBACK_MEMBER(_8080bw_state::darthvdr_interrupt_vector)
+{
+ m_maincpu->set_input_line(0, CLEAR_LINE);
+ return 0xff;
+}
+
READ8_MEMBER(_8080bw_state::darthvdr_01_r)
{
uint8_t data = ioport("P2")->read();
@@ -2867,7 +2882,7 @@ void _8080bw_state::darthvdr(machine_config &config)
/* basic machine hardware */
m_maincpu->set_addrmap(AS_PROGRAM, &_8080bw_state::darthvdr_map);
m_maincpu->set_addrmap(AS_IO, &_8080bw_state::darthvdr_io_map);
- m_maincpu->set_vblank_int("screen", FUNC(_8080bw_state::irq0_line_hold));
+ m_maincpu->set_irq_acknowledge_callback(FUNC(_8080bw_state::darthvdr_interrupt_vector));
MCFG_MACHINE_START_OVERRIDE(_8080bw_state,darthvdr)
MCFG_MACHINE_RESET_OVERRIDE(_8080bw_state,darthvdr)
@@ -2877,6 +2892,7 @@ void _8080bw_state::darthvdr(machine_config &config)
/* video hardware */
m_screen->set_screen_update(FUNC(_8080bw_state::screen_update_invaders));
+ m_screen->screen_vblank().set_inputline(m_maincpu, 0, ASSERT_LINE);
}
@@ -4484,6 +4500,16 @@ ROM_START( invasiona )
ROM_LOAD( "invasiona_5.bin", 0x1c00, 0x0400, CRC(59134ff8) SHA1(2e6a040066b35b10f867a3e500e3b13922c0eb7a) )
ROM_END
+ROM_START( invasiona2 )
+ ROM_REGION( 0x10000, "maincpu", 0 )
+ ROM_LOAD( "0.0.bin", 0x0000, 0x0400, CRC(7a9b4485) SHA1(dde918ec106971972bf7c7e5085c1262522f7e35) )
+ ROM_LOAD( "1.1.bin", 0x0400, 0x0400, CRC(7c86620d) SHA1(9e92ec0aa4eee96a7fa115a14a611c488d13b9dd) )
+ ROM_LOAD( "2.2.bin", 0x0800, 0x0400, CRC(b949185e) SHA1(f6dad27fdc5a030d2391078926bcf8e4adf21a12) )
+ ROM_LOAD( "3.5.bin", 0x1400, 0x0400, CRC(8ec9eae2) SHA1(48d7a7dc61e0417ca4093e5c2a36efd96e359233) )
+ ROM_LOAD( "4.6.bin", 0x1800, 0x0400, CRC(ec0edb4a) SHA1(8c6946b50ba5c319fe03c55b43c4e714387719b8) )
+ ROM_LOAD( "5.7.bin", 0x1c00, 0x0400, CRC(c3466380) SHA1(19b0f274a1b97a6ab48f3fe11fdee44ed2f50603) )
+ROM_END
+
ROM_START( invasionb )
ROM_REGION( 0x10000, "maincpu", 0 )
ROM_LOAD( "invasionb_0.bin", 0x0000, 0x0400, CRC(7a9b4485) SHA1(dde918ec106971972bf7c7e5085c1262522f7e35) )
@@ -5153,10 +5179,11 @@ GAMEL(1980, spaceat2, invaders, invaders, spaceat2, mw8080bw_state, empty_i
GAMEL(1979, spacecom, invaders, spacecom, spacecom, _8080bw_state, init_spacecom, ROT270, "bootleg", "Space Combat (bootleg of Space Invaders)", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE, layout_spacecom )
GAME( 1978, spacerng, invaders, spacerng, sitv, _8080bw_state, empty_init, ROT90, "bootleg (Leisure Time Electronics)", "Space Ranger", MACHINE_WRONG_COLORS | MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND ) // many modifications
GAMEL(19??, invasion, invaders, invaders, invasion, mw8080bw_state, empty_init, ROT270, "bootleg (Sidam)", "Invasion (Sidam)", MACHINE_SUPPORTS_SAVE, layout_invaders )
-GAMEL(19??, invasiona, invaders, invaders, invasion, mw8080bw_state, empty_init, ROT270, "bootleg", "Invasion (bootleg set 1, normal graphics)", MACHINE_SUPPORTS_SAVE, layout_invaders ) // has Sidam replaced with 'Ufo Monster Attack' and standard GFX
-GAMEL(19??, invasionb, invaders, invaders, invasion, mw8080bw_state, empty_init, ROT270, "bootleg", "Invasion (bootleg set 2, no copyright)", MACHINE_SUPPORTS_SAVE, layout_invaders )
-GAMEL(19??, invasionrz, invaders, invaders, invasion, mw8080bw_state, empty_init, ROT270, "bootleg (R Z SRL Bologna)", "Invasion (bootleg set 3, R Z SRL Bologna)", MACHINE_SUPPORTS_SAVE | MACHINE_NOT_WORKING, layout_invaders )
-GAMEL(19??, invasionrza, invaders, invaders, invasion, mw8080bw_state, empty_init, ROT270, "bootleg (R Z SRL Bologna)", "Invasion (bootleg set 4, R Z SRL Bologna)", MACHINE_SUPPORTS_SAVE | MACHINE_NOT_WORKING, layout_invaders )
+GAMEL(1979, invasiona, invaders, invaders, invasion, mw8080bw_state, empty_init, ROT270, "bootleg", "UFO Robot Attack (bootleg of Invasion, newer set)", MACHINE_SUPPORTS_SAVE, layout_invaders ) // has Sidam replaced with 'Ufo Monster Attack' and standard GFX
+GAMEL(1979, invasiona2, invaders, invaders, invasion, mw8080bw_state, empty_init, ROT270, "bootleg", "UFO Robot Attack (bootleg of Invasion, older set)", MACHINE_SUPPORTS_SAVE, layout_invaders ) // has Sidam replaced with 'Ufo Monster Attack' and standard GFX
+GAMEL(1979, invasionb, invaders, invaders, invasion, mw8080bw_state, empty_init, ROT270, "bootleg", "Invasion (Italian bootleg)", MACHINE_SUPPORTS_SAVE, layout_invaders )
+GAMEL(1979, invasionrz, invaders, invaders, invasion, mw8080bw_state, empty_init, ROT270, "bootleg (R Z SRL Bologna)", "Invasion (bootleg set 1, R Z SRL Bologna)", MACHINE_SUPPORTS_SAVE | MACHINE_NOT_WORKING, layout_invaders )
+GAMEL(1979, invasionrza, invaders, invaders, invasion, mw8080bw_state, empty_init, ROT270, "bootleg (R Z SRL Bologna)", "Invasion (bootleg set 2, R Z SRL Bologna)", MACHINE_SUPPORTS_SAVE | MACHINE_NOT_WORKING, layout_invaders )
GAMEL(19??, invadersem, invaders, invaders, sitv, mw8080bw_state, empty_init, ROT270, "Electromar", "Space Invaders (Electromar, Spanish)", MACHINE_SUPPORTS_SAVE, layout_invaders ) // possibly licensed
GAMEL(1978, superinv, invaders, invaders, superinv, mw8080bw_state, empty_init, ROT270, "bootleg", "Super Invaders (bootleg set 1)", MACHINE_SUPPORTS_SAVE, layout_invaders ) // not related to Zenitone-Microsec version
GAMEL(1978, sinvemag, invaders, invaders, sinvemag, mw8080bw_state, empty_init, ROT270, "bootleg (Emag)", "Super Invaders (bootleg set 2)", MACHINE_SUPPORTS_SAVE, layout_invaders ) // not related to Zenitone-Microsec version
diff --git a/src/mame/drivers/a1supply.cpp b/src/mame/drivers/a1supply.cpp
index 38dd35768df..964736feb25 100644
--- a/src/mame/drivers/a1supply.cpp
+++ b/src/mame/drivers/a1supply.cpp
@@ -87,20 +87,21 @@ void a1supply_state::video_start()
{
}
-MACHINE_CONFIG_START(a1supply_state::a1supply)
-
+void a1supply_state::a1supply(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", NETLIST_CPU, NETLIST_CLOCK)
- MCFG_NETLIST_SETUP(a1supply)
+ NETLIST_CPU(config, m_maincpu, NETLIST_CLOCK);
+ m_maincpu->set_constructor(netlist_a1supply);
/* video hardware */
- MCFG_FIXFREQ_ADD("fixfreq", "screen")
- MCFG_FIXFREQ_MONITOR_CLOCK(MASTER_CLOCK)
- MCFG_FIXFREQ_HORZ_PARAMS(H_TOTAL-67,H_TOTAL-40,H_TOTAL-8,H_TOTAL)
- MCFG_FIXFREQ_VERT_PARAMS(V_TOTAL-22,V_TOTAL-19,V_TOTAL-12,V_TOTAL)
- MCFG_FIXFREQ_FIELDCOUNT(1)
- MCFG_FIXFREQ_SYNC_THRESHOLD(0.30)
-MACHINE_CONFIG_END
+ SCREEN(config, "screen", SCREEN_TYPE_RASTER);
+ FIXFREQ(config, m_video).set_screen("screen");
+ m_video->set_monitor_clock(MASTER_CLOCK);
+ m_video->set_horz_params(H_TOTAL-67,H_TOTAL-40,H_TOTAL-8,H_TOTAL);
+ m_video->set_vert_params(V_TOTAL-22,V_TOTAL-19,V_TOTAL-12,V_TOTAL);
+ m_video->set_fieldcount(1);
+ m_video->set_threshold(0.30);
+}
/***************************************************************************
diff --git a/src/mame/drivers/a5105.cpp b/src/mame/drivers/a5105.cpp
index f52c14979aa..037daf3feab 100644
--- a/src/mame/drivers/a5105.cpp
+++ b/src/mame/drivers/a5105.cpp
@@ -560,7 +560,8 @@ static const z80_daisy_config a5105_daisy_chain[] =
{ nullptr }
};
-MACHINE_CONFIG_START(a5105_state::a5105)
+void a5105_state::a5105(machine_config &config)
+{
/* basic machine hardware */
Z80(config, m_maincpu, XTAL(15'000'000) / 4);
m_maincpu->set_addrmap(AS_PROGRAM, &a5105_state::a5105_mem);
@@ -568,12 +569,12 @@ MACHINE_CONFIG_START(a5105_state::a5105)
m_maincpu->set_daisy_config(a5105_daisy_chain);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(50)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */
- MCFG_SCREEN_UPDATE_DEVICE("upd7220", upd7220_device, screen_update)
- MCFG_SCREEN_SIZE(40*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0, 40*8-1, 0, 25*8-1)
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_refresh_hz(50);
+ m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */
+ m_screen->set_screen_update("upd7220", FUNC(upd7220_device::screen_update));
+ m_screen->set_size(40*8, 32*8);
+ m_screen->set_visarea(0, 40*8-1, 0, 25*8-1);
GFXDECODE(config, m_gfxdecode, m_palette, gfx_a5105);
PALETTE(config, m_palette, FUNC(a5105_state::a5105_palette), 16);
@@ -585,8 +586,8 @@ MACHINE_CONFIG_START(a5105_state::a5105)
/* Devices */
UPD7220(config, m_hgdc, XTAL(15'000'000) / 16); // unk clock
m_hgdc->set_addrmap(0, &a5105_state::upd7220_map);
- m_hgdc->set_display_pixels_callback(FUNC(a5105_state::hgdc_display_pixels), this);
- m_hgdc->set_draw_text_callback(FUNC(a5105_state::hgdc_draw_text), this);
+ m_hgdc->set_display_pixels(FUNC(a5105_state::hgdc_display_pixels));
+ m_hgdc->set_draw_text(FUNC(a5105_state::hgdc_draw_text));
z80ctc_device& ctc(Z80CTC(config, "z80ctc", XTAL(15'000'000) / 4));
ctc.intr_callback().set_inputline(m_maincpu, 0);
@@ -596,17 +597,17 @@ MACHINE_CONFIG_START(a5105_state::a5105)
z80pio_device& pio(Z80PIO(config, "z80pio", XTAL(15'000'000) / 4));
pio.out_int_callback().set_inputline(m_maincpu, 0);
- MCFG_CASSETTE_ADD( "cassette" )
+ CASSETTE(config, m_cass);
UPD765A(config, m_fdc, 8'000'000, true, true);
- MCFG_FLOPPY_DRIVE_ADD("upd765a:0", a5105_floppies, "525qd", a5105_state::floppy_formats)
- MCFG_FLOPPY_DRIVE_ADD("upd765a:1", a5105_floppies, "525qd", a5105_state::floppy_formats)
- MCFG_FLOPPY_DRIVE_ADD("upd765a:2", a5105_floppies, "525qd", a5105_state::floppy_formats)
- MCFG_FLOPPY_DRIVE_ADD("upd765a:3", a5105_floppies, "525qd", a5105_state::floppy_formats)
+ FLOPPY_CONNECTOR(config, "upd765a:0", a5105_floppies, "525qd", a5105_state::floppy_formats);
+ FLOPPY_CONNECTOR(config, "upd765a:1", a5105_floppies, "525qd", a5105_state::floppy_formats);
+ FLOPPY_CONNECTOR(config, "upd765a:2", a5105_floppies, "525qd", a5105_state::floppy_formats);
+ FLOPPY_CONNECTOR(config, "upd765a:3", a5105_floppies, "525qd", a5105_state::floppy_formats);
/* internal ram */
RAM(config, RAM_TAG).set_default_size("64K");
-MACHINE_CONFIG_END
+}
/* ROM definition */
ROM_START( a5105 )
diff --git a/src/mame/drivers/a51xx.cpp b/src/mame/drivers/a51xx.cpp
index 7273d616ecf..39ff383e87e 100644
--- a/src/mame/drivers/a51xx.cpp
+++ b/src/mame/drivers/a51xx.cpp
@@ -126,42 +126,42 @@ static GFXDECODE_START( gfx_a51xx )
GFXDECODE_ENTRY( "chargen", 0x0000, a51xx_charlayout, 0, 1 )
GFXDECODE_END
-MACHINE_CONFIG_START(a51xx_state::a5120)
+void a51xx_state::a5120(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu",Z80, XTAL(4'000'000))
- MCFG_DEVICE_PROGRAM_MAP(a5120_mem)
- MCFG_DEVICE_IO_MAP(a5120_io)
+ Z80(config, m_maincpu, XTAL(4'000'000));
+ m_maincpu->set_addrmap(AS_PROGRAM, &a51xx_state::a5120_mem);
+ m_maincpu->set_addrmap(AS_IO, &a51xx_state::a5120_io);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(50)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */
- MCFG_SCREEN_SIZE(640, 480)
- MCFG_SCREEN_VISIBLE_AREA(0, 640-1, 0, 480-1)
- MCFG_SCREEN_UPDATE_DRIVER(a51xx_state, screen_update_a5120)
- MCFG_SCREEN_PALETTE("palette")
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(50);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */
+ screen.set_size(640, 480);
+ screen.set_visarea_full();
+ screen.set_screen_update(FUNC(a51xx_state::screen_update_a5120));
+ screen.set_palette("palette");
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_a51xx)
+ GFXDECODE(config, "gfxdecode", "palette", gfx_a51xx);
PALETTE(config, "palette", palette_device::MONOCHROME);
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(a51xx_state::a5130)
+void a51xx_state::a5130(machine_config &config)
+{
a5120(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(a5130_mem)
- MCFG_DEVICE_IO_MAP(a5130_io)
+ m_maincpu->set_addrmap(AS_PROGRAM, &a51xx_state::a5130_mem);
+ m_maincpu->set_addrmap(AS_IO, &a51xx_state::a5130_io);
MCFG_MACHINE_RESET_OVERRIDE(a51xx_state,a5130)
/* video hardware */
- MCFG_SCREEN_MODIFY("screen")
- MCFG_SCREEN_UPDATE_DRIVER(a51xx_state, screen_update_a5130)
+ subdevice<screen_device>("screen")->set_screen_update(FUNC(a51xx_state::screen_update_a5130));
MCFG_VIDEO_START_OVERRIDE(a51xx_state,a5130)
-MACHINE_CONFIG_END
+}
/* ROM definition */
ROM_START( a5120 )
diff --git a/src/mame/drivers/a7150.cpp b/src/mame/drivers/a7150.cpp
index 1ab66db66bd..cea6f8b3a20 100644
--- a/src/mame/drivers/a7150.cpp
+++ b/src/mame/drivers/a7150.cpp
@@ -475,8 +475,7 @@ void a7150_state::a7150(machine_config &config)
m_maincpu->esc_data_handler().set("i8087", FUNC(i8087_device::addr_w));
i8087_device &i8087(I8087(config, "i8087", XTAL(9'832'000)/2));
- i8087.set_addrmap(AS_PROGRAM, &a7150_state::a7150_mem);
- i8087.set_data_width(16);
+ i8087.set_space_86(m_maincpu, AS_PROGRAM);
i8087.irq().set(m_pic8259, FUNC(pic8259_device::ir0_w));
i8087.busy().set_inputline("maincpu", INPUT_LINE_TEST);
diff --git a/src/mame/drivers/aa310.cpp b/src/mame/drivers/aa310.cpp
index 838fad59bff..6e124e6d693 100644
--- a/src/mame/drivers/aa310.cpp
+++ b/src/mame/drivers/aa310.cpp
@@ -444,7 +444,6 @@ void aa310_state::aa310(machine_config &config)
DAC_16BIT_R2R_TWOS_COMPLEMENT(config, m_dac[i], 0).add_route(0, "speaker", 0.1); // unknown DAC
}
voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref", 0));
- vref.set_output(5.0);
vref.add_route(0, "dac0", 1.0, DAC_VREF_POS_INPUT); vref.add_route(0, "dac0", -1.0, DAC_VREF_NEG_INPUT);
vref.add_route(0, "dac1", 1.0, DAC_VREF_POS_INPUT); vref.add_route(0, "dac1", -1.0, DAC_VREF_NEG_INPUT);
vref.add_route(0, "dac2", 1.0, DAC_VREF_POS_INPUT); vref.add_route(0, "dac2", -1.0, DAC_VREF_NEG_INPUT);
diff --git a/src/mame/drivers/aaa.cpp b/src/mame/drivers/aaa.cpp
index 18e5a6335e1..bf5d725de70 100644
--- a/src/mame/drivers/aaa.cpp
+++ b/src/mame/drivers/aaa.cpp
@@ -7,9 +7,13 @@ Skeleton driver for Ann Arbor Ambassador terminal.
************************************************************************************************************************************/
#include "emu.h"
+#include "bus/rs232/rs232.h"
#include "cpu/z80/z80.h"
+#include "machine/74259.h"
#include "machine/input_merger.h"
#include "machine/mc2661.h"
+#include "machine/nvram.h"
+#include "screen.h"
class aaa_state : public driver_device
{
@@ -17,93 +21,277 @@ public:
aaa_state(const machine_config &mconfig, device_type type, const char *tag)
: driver_device(mconfig, type, tag)
, m_maincpu(*this, "maincpu")
- , m_pci(*this, "pci%u", 0U)
- , m_chargen(*this, "chargen")
+ , m_usart(*this, "usart%u", 0U)
+ , m_screen(*this, "screen")
+ , m_key_row(*this, "KSL%u", 0U)
+ , m_font(*this, "font")
+ , m_display_ram(*this, "display")
+ , m_linecount(*this, "linecount")
{ }
void aaa(machine_config &config);
private:
- template<int N> u8 pci_r(offs_t offset);
- template<int N> void pci_w(offs_t offset, u8 data);
+ u32 screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
+
+ void display_ram_w(offs_t offset, u8 data);
+ template<int N> u8 usart_r(offs_t offset);
+ template<int N> void usart_w(offs_t offset, u8 data);
+ u8 keyboard_r(offs_t offset);
void mem_map(address_map &map);
void io_map(address_map &map);
required_device<cpu_device> m_maincpu;
- required_device_array<mc2661_device, 2> m_pci;
- required_region_ptr<u8> m_chargen;
+ required_device_array<mc2661_device, 2> m_usart;
+ required_device<screen_device> m_screen;
+ optional_ioport_array<16> m_key_row;
+ required_region_ptr<u8> m_font;
+ required_shared_ptr<u8> m_display_ram;
+ required_shared_ptr<u8> m_linecount;
};
+u32 aaa_state::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect)
+{
+ return 0;
+}
+
+void aaa_state::display_ram_w(offs_t offset, u8 data)
+{
+ // 6 bits wide (2 words per character)
+ m_display_ram[offset] = data | 0xc0;
+}
+
template<int N>
-u8 aaa_state::pci_r(offs_t offset)
+u8 aaa_state::usart_r(offs_t offset)
{
- return m_pci[N]->read(offset >> 1);
+ return m_usart[N]->read(offset >> 1);
}
template<int N>
-void aaa_state::pci_w(offs_t offset, u8 data)
+void aaa_state::usart_w(offs_t offset, u8 data)
{
- m_pci[N]->write(offset >> 1, data);
+ m_usart[N]->write(offset >> 1, data);
+}
+
+u8 aaa_state::keyboard_r(offs_t offset)
+{
+ // TODO: key click
+ return m_key_row[offset & 15].read_safe(0xff);
}
void aaa_state::mem_map(address_map &map)
{
- map(0x0000, 0x1fff).rom().region("maincpu", 0);
- map(0x2000, 0x27ff).ram();
- map(0x2800, 0x2fff).ram(); // NVRAM?
- map(0x8000, 0x9fff).rom().region("maincpu", 0x8000);
- map(0xc000, 0xffff).ram();
+ map(0x0000, 0x1fff).rom().region("loprog", 0);
+ map(0x2000, 0x27ff).mirror(0x800).ram();
+ map(0x3f00, 0x3f03).writeonly().share("linecount"); // LS670 at 7B on main board
+ map(0x4000, 0x43ff).ram().share("nvram");
+ map(0x8000, 0x9fff).rom().region("hiprog", 0);
+ map(0xc000, 0xffff).ram().w(FUNC(aaa_state::display_ram_w)).share("display");
}
void aaa_state::io_map(address_map &map)
{
map.global_mask(0xff);
- map(0x00, 0x00).select(6).r(FUNC(aaa_state::pci_r<0>));
- map(0x01, 0x01).select(6).w(FUNC(aaa_state::pci_w<0>));
- map(0x40, 0x40).select(6).r(FUNC(aaa_state::pci_r<1>));
- map(0x41, 0x41).select(6).w(FUNC(aaa_state::pci_w<1>));
- map(0x87, 0x87).nopw();
+ map(0x00, 0x00).select(6).r(FUNC(aaa_state::usart_r<0>));
+ map(0x01, 0x01).select(6).w(FUNC(aaa_state::usart_w<0>));
+ map(0x40, 0x40).select(6).r(FUNC(aaa_state::usart_r<1>));
+ map(0x41, 0x41).select(6).w(FUNC(aaa_state::usart_w<1>));
+ map(0x80, 0x87).w("ctrllatch", FUNC(ls259_device::write_d7));
+ map(0xc0, 0xff).r(FUNC(aaa_state::keyboard_r));
}
-static INPUT_PORTS_START( aaa )
+static INPUT_PORTS_START(aaa)
+ // KR0, KR1, KR2, KR3, KR4, KR5, KR6, KR7 = connector pins W, X, Y, Z, AA, BB, CC, DD
+
+ PORT_START("KSL2") // connector pin T
+ PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_UNUSED)
+ PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('[') PORT_CHAR('{') PORT_CODE(KEYCODE_OPENBRACE)
+ PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('a') PORT_CHAR('A') PORT_CODE(KEYCODE_A)
+ PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('b') PORT_CHAR('B') PORT_CODE(KEYCODE_B)
+ PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('c') PORT_CHAR('C') PORT_CODE(KEYCODE_C)
+ PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('d') PORT_CHAR('D') PORT_CODE(KEYCODE_D)
+ PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('e') PORT_CHAR('E') PORT_CODE(KEYCODE_E)
+ PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('f') PORT_CHAR('F') PORT_CODE(KEYCODE_F)
+
+ PORT_START("KSL3") // connector pin S
+ PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('g') PORT_CHAR('G') PORT_CODE(KEYCODE_G)
+ PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('h') PORT_CHAR('H') PORT_CODE(KEYCODE_H)
+ PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('i') PORT_CHAR('I') PORT_CODE(KEYCODE_I)
+ PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('j') PORT_CHAR('J') PORT_CODE(KEYCODE_J)
+ PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('k') PORT_CHAR('K') PORT_CODE(KEYCODE_K)
+ PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('l') PORT_CHAR('L') PORT_CODE(KEYCODE_L)
+ PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('m') PORT_CHAR('M') PORT_CODE(KEYCODE_M)
+ PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('n') PORT_CHAR('N') PORT_CODE(KEYCODE_N)
+
+ PORT_START("KSL4") // connector pin N
+ PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('o') PORT_CHAR('O') PORT_CODE(KEYCODE_O)
+ PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('p') PORT_CHAR('P') PORT_CODE(KEYCODE_P)
+ PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('q') PORT_CHAR('Q') PORT_CODE(KEYCODE_Q)
+ PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('r') PORT_CHAR('R') PORT_CODE(KEYCODE_R)
+ PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('s') PORT_CHAR('S') PORT_CODE(KEYCODE_S)
+ PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('t') PORT_CHAR('T') PORT_CODE(KEYCODE_T)
+ PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('u') PORT_CHAR('U') PORT_CODE(KEYCODE_U)
+ PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('v') PORT_CHAR('V') PORT_CODE(KEYCODE_V)
+
+ PORT_START("KSL5") // connector pin M
+ PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('w') PORT_CHAR('W') PORT_CODE(KEYCODE_W)
+ PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('x') PORT_CHAR('X') PORT_CODE(KEYCODE_X)
+ PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('y') PORT_CHAR('Y') PORT_CODE(KEYCODE_Y)
+ PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('z') PORT_CHAR('Z') PORT_CODE(KEYCODE_Z)
+ PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('`') PORT_CHAR('~') PORT_CODE(KEYCODE_TILDE)
+ PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('\'') PORT_CHAR('"') PORT_CODE(KEYCODE_QUOTE)
+ PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('\\') PORT_CHAR('|') PORT_CODE(KEYCODE_BACKSLASH)
+ PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Pause") PORT_CODE(KEYCODE_LALT)
+
+ PORT_START("KSL6") // connector pin L
+ PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Move Up") PORT_CHAR(UCHAR_MAMEKEY(HOME)) PORT_CODE(KEYCODE_PGUP)
+ PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('1') PORT_CHAR('!') PORT_CODE(KEYCODE_1)
+ PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('2') PORT_CHAR('@') PORT_CODE(KEYCODE_2)
+ PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('3') PORT_CHAR('#') PORT_CODE(KEYCODE_3)
+ PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('4') PORT_CHAR('$') PORT_CODE(KEYCODE_4)
+ PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('5') PORT_CHAR('%') PORT_CODE(KEYCODE_5)
+ PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('6') PORT_CHAR('^') PORT_CODE(KEYCODE_6)
+ PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('7') PORT_CHAR('&') PORT_CODE(KEYCODE_7)
+
+ PORT_START("KSL7") // connector pin K
+ PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('8') PORT_CHAR('*') PORT_CODE(KEYCODE_8)
+ PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('9') PORT_CHAR('(') PORT_CODE(KEYCODE_9)
+ PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('-') PORT_CHAR('_') PORT_CODE(KEYCODE_MINUS)
+ PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR(';') PORT_CHAR(':') PORT_CODE(KEYCODE_COLON)
+ PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR(',') PORT_CHAR('<') PORT_CODE(KEYCODE_COMMA)
+ PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('=') PORT_CHAR('+') PORT_CODE(KEYCODE_EQUALS)
+ PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('.') PORT_CHAR('>') PORT_CODE(KEYCODE_STOP)
+ PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('/') PORT_CHAR('?') PORT_CODE(KEYCODE_SLASH)
+
+ PORT_START("KSL8") // connector pin J
+ PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR(UCHAR_MAMEKEY(ENTER_PAD)) PORT_CODE(KEYCODE_ENTER_PAD)
+ PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR(UCHAR_MAMEKEY(0_PAD)) PORT_CODE(KEYCODE_0_PAD)
+ PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR(UCHAR_MAMEKEY(DEL_PAD)) PORT_CODE(KEYCODE_DEL_PAD)
+ PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Move Down") PORT_CHAR(UCHAR_MAMEKEY(PGDN)) PORT_CODE(KEYCODE_PGDN)
+ PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('0') PORT_CHAR(')') PORT_CODE(KEYCODE_0)
+ PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Keypad 1 SSA") PORT_CHAR(UCHAR_MAMEKEY(1_PAD)) PORT_CODE(KEYCODE_1_PAD)
+ PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Keypad 2 " UTF8_DOWN) PORT_CHAR(UCHAR_MAMEKEY(2_PAD)) PORT_CODE(KEYCODE_2_PAD)
+ PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Keypad 3 ESA") PORT_CHAR(UCHAR_MAMEKEY(3_PAD)) PORT_CODE(KEYCODE_3_PAD)
+
+ PORT_START("KSL9") // connector pin H
+ PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Keypad 4 " UTF8_LEFT) PORT_CHAR(UCHAR_MAMEKEY(4_PAD)) PORT_CODE(KEYCODE_4_PAD)
+ PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Keypad 5 Home") PORT_CHAR(UCHAR_MAMEKEY(5_PAD)) PORT_CODE(KEYCODE_5_PAD)
+ PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Keypad 6 " UTF8_RIGHT) PORT_CHAR(UCHAR_MAMEKEY(6_PAD)) PORT_CODE(KEYCODE_6_PAD)
+ PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Keypad 7 T-Clr") PORT_CHAR(UCHAR_MAMEKEY(7_PAD)) PORT_CODE(KEYCODE_7_PAD)
+ PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Keypad 8 " UTF8_UP) PORT_CHAR(UCHAR_MAMEKEY(8_PAD)) PORT_CODE(KEYCODE_8_PAD)
+ PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Keypad 9 T-Set") PORT_CHAR(UCHAR_MAMEKEY(9_PAD)) PORT_CODE(KEYCODE_9_PAD)
+ PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Reset")
+ PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Setup")
+
+ PORT_START("KSL10") // connector pin F
+ PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("PF1") PORT_CHAR(UCHAR_MAMEKEY(F1)) PORT_CODE(KEYCODE_F1)
+ PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("PF2") PORT_CHAR(UCHAR_MAMEKEY(F2)) PORT_CODE(KEYCODE_F2)
+ PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("PF3") PORT_CHAR(UCHAR_MAMEKEY(F3)) PORT_CODE(KEYCODE_F3)
+ PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Back Space") PORT_CHAR(0x08) PORT_CODE(KEYCODE_BACKSPACE)
+ PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("PF4") PORT_CHAR(UCHAR_MAMEKEY(F4)) PORT_CODE(KEYCODE_F4)
+ PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Break")
+ PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("PF5") PORT_CHAR(UCHAR_MAMEKEY(F5)) PORT_CODE(KEYCODE_F5)
+ PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("PF6") PORT_CHAR(UCHAR_MAMEKEY(F6)) PORT_CODE(KEYCODE_F6)
+
+ PORT_START("KSL11") // connector pin E
+ PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Del")
+ PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("PF7") PORT_CHAR(UCHAR_MAMEKEY(F7)) PORT_CODE(KEYCODE_F7)
+ PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("PF8") PORT_CHAR(UCHAR_MAMEKEY(F8)) PORT_CODE(KEYCODE_F8)
+ PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("PF9") PORT_CHAR(UCHAR_MAMEKEY(F9)) PORT_CODE(KEYCODE_F9)
+ PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("PF10") PORT_CHAR(UCHAR_MAMEKEY(F10)) PORT_CODE(KEYCODE_F10)
+ PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("PF11") PORT_CHAR(UCHAR_MAMEKEY(F11)) PORT_CODE(KEYCODE_F11)
+ PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("PF12") PORT_CHAR(UCHAR_MAMEKEY(F12)) PORT_CODE(KEYCODE_F12)
+ PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Erase")
+
+ PORT_START("KSL12") // connector pin D
+ PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Edit")
+ PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Line Feed") PORT_CHAR(0x0a) PORT_CODE(KEYCODE_RALT)
+ PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Delete") PORT_CHAR(UCHAR_MAMEKEY(DEL))
+ PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR(']') PORT_CHAR('}') PORT_CODE(KEYCODE_CLOSEBRACE)
+ PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Insert") PORT_CHAR(UCHAR_MAMEKEY(INSERT))
+ PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Print")
+ PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Return") PORT_CHAR(0x0d) PORT_CODE(KEYCODE_ENTER)
+ PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Send")
+
+ PORT_START("KSL13") // connector pin C
+ PORT_BIT(0xff, IP_ACTIVE_LOW, IPT_UNUSED)
+
+ PORT_START("KSL14") // connector pin B
+ PORT_BIT(0xff, IP_ACTIVE_LOW, IPT_UNUSED)
+
+ PORT_START("KSL15") // connector pin A
+ PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR(UCHAR_MAMEKEY(CAPSLOCK)) PORT_CODE(KEYCODE_CAPSLOCK) PORT_TOGGLE
+ PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Space Bar") PORT_CHAR(' ') PORT_CODE(KEYCODE_SPACE)
+ PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Tab " UTF8_RIGHT " " UTF8_LEFT) PORT_CHAR(0x09) PORT_CODE(KEYCODE_TAB)
+ PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Ctrl") PORT_CHAR(UCHAR_MAMEKEY(LCONTROL)) PORT_CODE(KEYCODE_LCONTROL)
+ PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Esc") PORT_CHAR(0x1b) PORT_CODE(KEYCODE_ESC)
+ PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Left Shift") PORT_CHAR(UCHAR_MAMEKEY(LSHIFT)) PORT_CODE(KEYCODE_LSHIFT)
+ PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Right Shift") PORT_CODE(KEYCODE_RSHIFT) // possibly the other way around
+ PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_UNUSED)
INPUT_PORTS_END
void aaa_state::aaa(machine_config &config)
{
- Z80(config, m_maincpu, 2'000'000);
+ Z80(config, m_maincpu, 18.414_MHz_XTAL / 5);
m_maincpu->set_addrmap(AS_PROGRAM, &aaa_state::mem_map);
m_maincpu->set_addrmap(AS_IO, &aaa_state::io_map);
- input_merger_device &pciint(INPUT_MERGER_ANY_HIGH(config, "pciint")); // open collector?
- pciint.output_handler().set_inputline(m_maincpu, INPUT_LINE_IRQ0);
+ NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0); // NEC D444C x2 + 3V lithium battery
+
+ LS259(config, "ctrllatch"); // 1B on main board
+
+ input_merger_device &usartint(INPUT_MERGER_ANY_HIGH(config, "usartint")); // open collector
+ usartint.output_handler().set_inputline(m_maincpu, INPUT_LINE_IRQ0);
+
+ MC2661(config, m_usart[0], 5.0688_MHz_XTAL); // 16F on I/O board
+ m_usart[0]->txrdy_handler().set("usartint", FUNC(input_merger_device::in_w<0>));
+ m_usart[0]->rxrdy_handler().set("usartint", FUNC(input_merger_device::in_w<1>));
+ m_usart[0]->txemt_dschg_handler().set("usartint", FUNC(input_merger_device::in_w<2>));
+ m_usart[0]->txd_handler().set("printer", FUNC(rs232_port_device::write_txd));
+ m_usart[0]->rts_handler().set("printer", FUNC(rs232_port_device::write_rts));
+ m_usart[0]->dtr_handler().set("printer", FUNC(rs232_port_device::write_dtr));
- MC2661(config, m_pci[0], 5.0688_MHz_XTAL);
- m_pci[0]->txrdy_handler().set("pciint", FUNC(input_merger_device::in_w<0>));
- m_pci[0]->rxrdy_handler().set("pciint", FUNC(input_merger_device::in_w<1>));
- m_pci[0]->txemt_dschg_handler().set("pciint", FUNC(input_merger_device::in_w<2>));
+ MC2661(config, m_usart[1], 5.0688_MHz_XTAL); // 18F on I/O board
+ m_usart[1]->txrdy_handler().set("usartint", FUNC(input_merger_device::in_w<3>));
+ m_usart[1]->rxrdy_handler().set("usartint", FUNC(input_merger_device::in_w<4>));
+ m_usart[1]->txemt_dschg_handler().set("usartint", FUNC(input_merger_device::in_w<5>));
+ m_usart[1]->txd_handler().set("computer", FUNC(rs232_port_device::write_txd));
+ m_usart[1]->rts_handler().set("computer", FUNC(rs232_port_device::write_rts));
+ m_usart[1]->dtr_handler().set("computer", FUNC(rs232_port_device::write_dtr));
- MC2661(config, m_pci[1], 5.0688_MHz_XTAL);
- m_pci[1]->txrdy_handler().set("pciint", FUNC(input_merger_device::in_w<3>));
- m_pci[1]->rxrdy_handler().set("pciint", FUNC(input_merger_device::in_w<4>));
- m_pci[1]->txemt_dschg_handler().set("pciint", FUNC(input_merger_device::in_w<5>));
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_raw(18.414_MHz_XTAL, 990, 0, 800, 310, 0, 240);
+ m_screen->set_screen_update(FUNC(aaa_state::screen_update));
+
+ rs232_port_device &computer(RS232_PORT(config, "computer", default_rs232_devices, nullptr));
+ computer.rxd_handler().set(m_usart[1], FUNC(mc2661_device::rx_w));
+ computer.cts_handler().set(m_usart[1], FUNC(mc2661_device::cts_w));
+ computer.dsr_handler().set(m_usart[1], FUNC(mc2661_device::dsr_w));
+
+ rs232_port_device &printer(RS232_PORT(config, "printer", default_rs232_devices, nullptr));
+ printer.rxd_handler().set(m_usart[0], FUNC(mc2661_device::rx_w));
+ printer.cts_handler().set(m_usart[0], FUNC(mc2661_device::cts_w));
+ printer.dsr_handler().set(m_usart[0], FUNC(mc2661_device::dsr_w));
}
/**************************************************************************************************************
Ann Arbor Ambassador.
-Chips: Z80A, M58725P (16k RAM), 2x SCN2651C, nvram, button-battery
-Crystals: 18.414, 6.0688
+Chips: Z80A, M58725P-15, 6x MK4116N-36P, 2x SCN2651C, nvram, button-battery
+Crystals: 18.414, 5.0688
***************************************************************************************************************/
ROM_START( aaa )
- ROM_REGION(0x10000, "maincpu", 0)
+ ROM_REGION(0x2000, "loprog", 0)
ROM_LOAD( "459_1.bin", 0x0000, 0x1000, CRC(55fb3e3b) SHA1(349cd257b1468827e1b389be7c989d0e4a13a5f1) )
ROM_LOAD( "459_3.bin", 0x1000, 0x1000, CRC(e1e84ca4) SHA1(42dc5f4211beee79178f0c03bb45c66833119eae) )
- ROM_LOAD( "459_4.bin", 0x8000, 0x2000, CRC(4038aa89) SHA1(caf33c1f87aa396860324b9c73b35e4221f03d2e) )
- ROM_REGION(0x1000, "chargen", 0)
+ ROM_REGION(0x2000, "hiprog", 0)
+ ROM_LOAD( "459_4.bin", 0x0000, 0x2000, CRC(4038aa89) SHA1(caf33c1f87aa396860324b9c73b35e4221f03d2e) )
+
+ ROM_REGION(0x1000, "font", 0)
ROM_LOAD( "202510b.bin", 0x0000, 0x1000, CRC(deda4aa4) SHA1(0bce5a8dc260ba51f3e431d8da408eac1f41acf7) )
ROM_END
diff --git a/src/mame/drivers/abc1600.cpp b/src/mame/drivers/abc1600.cpp
index 7506685b3ac..c2d2c817d0a 100644
--- a/src/mame/drivers/abc1600.cpp
+++ b/src/mame/drivers/abc1600.cpp
@@ -873,14 +873,15 @@ void abc1600_state::machine_reset()
//**************************************************************************
//-------------------------------------------------
-// MACHINE_CONFIG( abc1600 )
+// machine_config( abc1600 )
//-------------------------------------------------
-MACHINE_CONFIG_START(abc1600_state::abc1600)
+void abc1600_state::abc1600(machine_config &config)
+{
// basic machine hardware
- MCFG_DEVICE_ADD(MC68008P8_TAG, M68008, 64_MHz_XTAL / 8)
- MCFG_DEVICE_PROGRAM_MAP(abc1600_mem)
- MCFG_DEVICE_IRQ_ACKNOWLEDGE_DRIVER(abc1600_state,abc1600_int_ack)
+ M68008(config, m_maincpu, 64_MHz_XTAL / 8);
+ m_maincpu->set_addrmap(AS_PROGRAM, &abc1600_state::abc1600_mem);
+ m_maincpu->set_irq_acknowledge_callback(FUNC(abc1600_state::abc1600_int_ack));
// video hardware
ABC1600_MOVER(config, ABC1600_MOVER_TAG, 0);
@@ -931,7 +932,7 @@ MACHINE_CONFIG_START(abc1600_state::abc1600)
m_cio->pc_rd_cb().set(FUNC(abc1600_state::cio_pc_r));
m_cio->pc_wr_cb().set(FUNC(abc1600_state::cio_pc_w));
- MCFG_NMC9306_ADD(NMC9306_TAG)
+ NMC9306(config, m_nvram, 0);
E0516(config, E050_C16PC_TAG, 32.768_kHz_XTAL);
@@ -939,42 +940,42 @@ MACHINE_CONFIG_START(abc1600_state::abc1600)
m_fdc->intrq_wr_callback().set(m_cio, FUNC(z8536_device::pb7_w));
m_fdc->drq_wr_callback().set(FUNC(abc1600_state::fdc_drq_w));
- MCFG_FLOPPY_DRIVE_ADD(SAB1797_02P_TAG":0", abc1600_floppies, nullptr, floppy_image_device::default_floppy_formats)
- MCFG_FLOPPY_DRIVE_ADD(SAB1797_02P_TAG":1", abc1600_floppies, nullptr, floppy_image_device::default_floppy_formats)
- MCFG_FLOPPY_DRIVE_ADD(SAB1797_02P_TAG":2", abc1600_floppies, "525qd", floppy_image_device::default_floppy_formats)
+ FLOPPY_CONNECTOR(config, SAB1797_02P_TAG":0", abc1600_floppies, nullptr, floppy_image_device::default_floppy_formats);
+ FLOPPY_CONNECTOR(config, SAB1797_02P_TAG":1", abc1600_floppies, nullptr, floppy_image_device::default_floppy_formats);
+ FLOPPY_CONNECTOR(config, SAB1797_02P_TAG":2", abc1600_floppies, "525qd", floppy_image_device::default_floppy_formats);
RS232_PORT(config, RS232_A_TAG, default_rs232_devices, nullptr);
rs232_port_device &rs232b(RS232_PORT(config, RS232_B_TAG, default_rs232_devices, nullptr));
rs232b.rxd_handler().set(m_dart, FUNC(z80dart_device::rxa_w));
- MCFG_ABC_KEYBOARD_PORT_ADD(ABC_KEYBOARD_PORT_TAG, "abc99")
- MCFG_ABC_KEYBOARD_OUT_RX_HANDLER(WRITELINE(m_dart, z80dart_device, rxb_w))
- MCFG_ABC_KEYBOARD_OUT_TRXC_HANDLER(WRITELINE(m_dart, z80dart_device, rxtxcb_w))
- MCFG_ABC_KEYBOARD_OUT_KEYDOWN_HANDLER(WRITELINE(m_dart, z80dart_device, dcdb_w))
-
- MCFG_ABCBUS_SLOT_ADD("bus0i", abc1600bus_cards, nullptr)
- MCFG_ABCBUS_SLOT_IRQ_CALLBACK(WRITELINE(m_cio, z8536_device, pa7_w))
- MCFG_ABCBUS_SLOT_ADD("bus0x", abc1600bus_cards, nullptr)
- MCFG_ABCBUS_SLOT_IRQ_CALLBACK(WRITELINE(m_cio, z8536_device, pa6_w))
- MCFG_ABCBUS_SLOT_NMI_CALLBACK(WRITELINE(*this, abc1600_state, nmi_w))
- MCFG_ABCBUS_SLOT_XINT2_CALLBACK(WRITELINE(m_cio, z8536_device, pa2_w))
- MCFG_ABCBUS_SLOT_XINT3_CALLBACK(WRITELINE(m_cio, z8536_device, pa3_w))
- MCFG_ABCBUS_SLOT_XINT4_CALLBACK(WRITELINE(m_cio, z8536_device, pa4_w))
- MCFG_ABCBUS_SLOT_XINT5_CALLBACK(WRITELINE(m_cio, z8536_device, pa5_w))
- MCFG_ABCBUS_SLOT_ADD("bus1", abc1600bus_cards, nullptr)
- MCFG_ABCBUS_SLOT_IRQ_CALLBACK(WRITELINE(m_cio, z8536_device, pa1_w))
- MCFG_ABCBUS_SLOT_ADD("bus2", abc1600bus_cards, "4105")
- MCFG_ABCBUS_SLOT_IRQ_CALLBACK(WRITELINE(m_cio, z8536_device, pa0_w))
- //MCFG_ABCBUS_SLOT_PREN_CALLBACK(WRITELINE(Z8410AB1_2_TAG, z80dma_device, iei_w))
- MCFG_ABCBUS_SLOT_TRRQ_CALLBACK(WRITELINE(Z8410AB1_2_TAG, z80dma_device, rdy_w))
+ abc_keyboard_port_device &kb(ABC_KEYBOARD_PORT(config, ABC_KEYBOARD_PORT_TAG, abc_keyboard_devices, "abc99"));
+ kb.out_rx_handler().set(m_dart, FUNC(z80dart_device::rxb_w));
+ kb.out_trxc_handler().set(m_dart, FUNC(z80dart_device::rxtxcb_w));
+ kb.out_keydown_handler().set(m_dart, FUNC(z80dart_device::dcdb_w));
+
+ abcbus_slot_device &bus0i(ABCBUS_SLOT(config, "bus0i", 64_MHz_XTAL / 16, abc1600bus_cards, nullptr));
+ bus0i.irq_callback().set(m_cio, FUNC(z8536_device::pa7_w));
+ abcbus_slot_device &bus0x(ABCBUS_SLOT(config, "bus0x", 64_MHz_XTAL / 16, abc1600bus_cards, nullptr));
+ bus0x.irq_callback().set(m_cio, FUNC(z8536_device::pa6_w));
+ bus0x.nmi_callback().set(FUNC(abc1600_state::nmi_w));
+ bus0x.xint2_callback().set(m_cio, FUNC(z8536_device::pa2_w));
+ bus0x.xint3_callback().set(m_cio, FUNC(z8536_device::pa3_w));
+ bus0x.xint4_callback().set(m_cio, FUNC(z8536_device::pa4_w));
+ bus0x.xint5_callback().set(m_cio, FUNC(z8536_device::pa5_w));
+ abcbus_slot_device &bus1(ABCBUS_SLOT(config, "bus1", 64_MHz_XTAL / 16, abc1600bus_cards, nullptr));
+ bus1.irq_callback().set(m_cio, FUNC(z8536_device::pa1_w));
+ abcbus_slot_device &bus2(ABCBUS_SLOT(config, "bus2", 64_MHz_XTAL / 16, abc1600bus_cards, "4105"));
+ bus2.irq_callback().set(m_cio, FUNC(z8536_device::pa0_w));
+ //bus2.pren_callback().set(Z8410AB1_2_TAG, FUNC(z80dma_device::iei_w));
+ bus2.trrq_callback().set(Z8410AB1_2_TAG, FUNC(z80dma_device::rdy_w));
// internal ram
RAM(config, RAM_TAG).set_default_size("1M");
// software list
- MCFG_SOFTWARE_LIST_ADD("flop_list", "abc1600")
-MACHINE_CONFIG_END
+ SOFTWARE_LIST(config, "flop_list").set_original("abc1600");
+}
diff --git a/src/mame/drivers/abc80.cpp b/src/mame/drivers/abc80.cpp
index ab56eab9795..7e146613588 100644
--- a/src/mame/drivers/abc80.cpp
+++ b/src/mame/drivers/abc80.cpp
@@ -482,7 +482,7 @@ QUICKLOAD_LOAD_MEMBER( abc80_state, bac )
//**************************************************************************
//-------------------------------------------------
-// MACHINE_CONFIG( abc80 )
+// machine_config( abc80 )
//-------------------------------------------------
MACHINE_CONFIG_START(abc80_state::abc80)
@@ -509,7 +509,7 @@ MACHINE_CONFIG_START(abc80_state::abc80)
m_csg->set_oneshot_params(CAP_U(0.1), RES_K(330));
m_csg->add_route(ALL_OUTPUTS, "mono", 0.25);
- WAVE(config, "wave", CASSETTE_TAG).add_route(ALL_OUTPUTS, "mono", 0.25);
+ WAVE(config, "wave", m_cassette).add_route(ALL_OUTPUTS, "mono", 0.25);
// devices
Z80PIO(config, m_pio, XTAL(11'980'800)/2/2);
@@ -518,27 +518,27 @@ MACHINE_CONFIG_START(abc80_state::abc80)
m_pio->in_pb_callback().set(FUNC(abc80_state::pio_pb_r));
m_pio->out_pb_callback().set(FUNC(abc80_state::pio_pb_w));
- MCFG_CASSETTE_ADD(CASSETTE_TAG)
- MCFG_CASSETTE_DEFAULT_STATE(CASSETTE_STOPPED | CASSETTE_MOTOR_DISABLED | CASSETTE_SPEAKER_ENABLED)
- MCFG_CASSETTE_INTERFACE("abc80_cass")
+ CASSETTE(config, m_cassette);
+ m_cassette->set_default_state(CASSETTE_STOPPED | CASSETTE_MOTOR_DISABLED | CASSETTE_SPEAKER_ENABLED);
+ m_cassette->set_interface("abc80_cass");
ABC80_KEYBOARD(config, m_kb, 0);
m_kb->keydown_wr_callback().set(FUNC(abc80_state::keydown_w));
- MCFG_ABCBUS_SLOT_ADD(ABCBUS_TAG, abc80_cards, "abcexp")
+ ABCBUS_SLOT(config, ABCBUS_TAG, XTAL(11'980'800)/2/2, abc80_cards, "abcexp");
RS232_PORT(config, RS232_TAG, default_rs232_devices, nullptr);
generic_keyboard_device &keyboard(GENERIC_KEYBOARD(config, KEYBOARD_TAG, 0));
keyboard.set_keyboard_callback(FUNC(abc80_state::kbd_w));
- MCFG_QUICKLOAD_ADD("quickload", abc80_state, bac, "bac", 2)
+ MCFG_QUICKLOAD_ADD("quickload", abc80_state, bac, "bac", attotime::from_seconds(2))
// internal ram
RAM(config, RAM_TAG).set_default_size("16K");
// software list
- MCFG_SOFTWARE_LIST_ADD("cass_list", "abc80_cass")
- MCFG_SOFTWARE_LIST_ADD("flop_list", "abc80_flop")
+ SOFTWARE_LIST(config, "cass_list").set_original("abc80_cass");
+ SOFTWARE_LIST(config, "flop_list").set_original("abc80_flop");
MACHINE_CONFIG_END
diff --git a/src/mame/drivers/abc80x.cpp b/src/mame/drivers/abc80x.cpp
index 2b5f0279ba1..581c5ee516c 100644
--- a/src/mame/drivers/abc80x.cpp
+++ b/src/mame/drivers/abc80x.cpp
@@ -1049,7 +1049,7 @@ QUICKLOAD_LOAD_MEMBER( abc800_state, bac )
//**************************************************************************
//-------------------------------------------------
-// MACHINE_CONFIG( common )
+// machine_config( common )
//-------------------------------------------------
MACHINE_CONFIG_START(abc800_state::common)
@@ -1065,7 +1065,7 @@ MACHINE_CONFIG_START(abc800_state::common)
m_ctc->zc_callback<1>().set(FUNC(abc800_state::ctc_z1_w));
m_ctc->zc_callback<2>().set(m_dart, FUNC(z80dart_device::rxca_w));
m_ctc->zc_callback<2>().append(m_dart, FUNC(z80dart_device::txca_w));
- MCFG_TIMER_DRIVER_ADD_PERIODIC(TIMER_CTC_TAG, abc800_state, ctc_tick, attotime::from_hz(ABC800_X01/2/2/2))
+ TIMER(config, TIMER_CTC_TAG).configure_periodic(FUNC(abc800_state::ctc_tick), attotime::from_hz(ABC800_X01/2/2/2));
Z80SIO(config, m_sio, ABC800_X01/2/2);
m_sio->out_txda_callback().set(RS232_B_TAG, FUNC(rs232_port_device::write_txd));
@@ -1083,9 +1083,9 @@ MACHINE_CONFIG_START(abc800_state::common)
m_dart->out_txdb_callback().set(ABC_KEYBOARD_PORT_TAG, FUNC(abc_keyboard_port_device::txd_w));
m_dart->out_int_callback().set_inputline(m_maincpu, INPUT_LINE_IRQ0);
- MCFG_CASSETTE_ADD(CASSETTE_TAG)
- MCFG_CASSETTE_DEFAULT_STATE(CASSETTE_STOPPED | CASSETTE_MOTOR_DISABLED | CASSETTE_SPEAKER_MUTED)
- MCFG_TIMER_DRIVER_ADD_PERIODIC(TIMER_CASSETTE_TAG, abc800_state, cassette_input_tick, attotime::from_hz(44100))
+ CASSETTE(config, m_cassette);
+ m_cassette->set_default_state(CASSETTE_STOPPED | CASSETTE_MOTOR_DISABLED | CASSETTE_SPEAKER_MUTED);
+ TIMER(config, TIMER_CASSETTE_TAG).configure_periodic(FUNC(abc800_state::cassette_input_tick), attotime::from_hz(44100));
rs232_port_device &rs232a(RS232_PORT(config, RS232_A_TAG, default_rs232_devices, nullptr));
rs232a.rxd_handler().set(m_dart, FUNC(z80dart_device::rxa_w));
@@ -1097,32 +1097,32 @@ MACHINE_CONFIG_START(abc800_state::common)
rs232b.dcd_handler().set(m_sio, FUNC(z80sio_device::dcda_w));
rs232b.cts_handler().set(m_sio, FUNC(z80sio_device::ctsa_w));
- MCFG_ABC_KEYBOARD_PORT_ADD(ABC_KEYBOARD_PORT_TAG, nullptr)
- MCFG_ABC_KEYBOARD_OUT_RX_HANDLER(WRITELINE(m_dart, z80dart_device, rxb_w))
- MCFG_ABC_KEYBOARD_OUT_TRXC_HANDLER(WRITELINE(m_dart, z80dart_device, rxtxcb_w))
- MCFG_ABC_KEYBOARD_OUT_KEYDOWN_HANDLER(WRITELINE(m_dart, z80dart_device, dcdb_w))
+ abc_keyboard_port_device &kb(ABC_KEYBOARD_PORT(config, ABC_KEYBOARD_PORT_TAG, abc_keyboard_devices, nullptr));
+ kb.out_rx_handler().set(m_dart, FUNC(z80dart_device::rxb_w));
+ kb.out_trxc_handler().set(m_dart, FUNC(z80dart_device::rxtxcb_w));
+ kb.out_keydown_handler().set(m_dart, FUNC(z80dart_device::dcdb_w));
- MCFG_ABCBUS_SLOT_ADD(ABCBUS_TAG, abcbus_cards, nullptr)
+ ABCBUS_SLOT(config, ABCBUS_TAG, ABC800_X01/2/2, abcbus_cards, nullptr);
// sound hardware
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD(DISCRETE_TAG, DISCRETE, abc800_discrete)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.80)
+ DISCRETE(config, m_discrete, abc800_discrete).add_route(ALL_OUTPUTS, "mono", 0.80);
// software list
- MCFG_SOFTWARE_LIST_ADD("flop_list", "abc800")
- MCFG_SOFTWARE_LIST_ADD("hdd_list", "abc800_hdd")
+ SOFTWARE_LIST(config, "flop_list").set_original("abc800");
+ SOFTWARE_LIST(config, "hdd_list").set_original("abc800_hdd");
// quickload
- MCFG_QUICKLOAD_ADD("quickload", abc800_state, bac, "bac", 2)
+ MCFG_QUICKLOAD_ADD("quickload", abc800_state, bac, "bac", attotime::from_seconds(2))
MACHINE_CONFIG_END
//-------------------------------------------------
-// MACHINE_CONFIG( abc800c )
+// machine_config( abc800c )
//-------------------------------------------------
-MACHINE_CONFIG_START(abc800c_state::abc800c)
+void abc800c_state::abc800c(machine_config &config)
+{
common(config);
// basic machine hardware
@@ -1133,23 +1133,23 @@ MACHINE_CONFIG_START(abc800c_state::abc800c)
abc800c_video(config);
// peripheral hardware
- MCFG_DEVICE_MODIFY(ABC_KEYBOARD_PORT_TAG)
- MCFG_SLOT_DEFAULT_OPTION("abc800")
- MCFG_SLOT_FIXED(true)
+ abc_keyboard_port_device &kb(*subdevice<abc_keyboard_port_device>(ABC_KEYBOARD_PORT_TAG));
+ kb.set_default_option("abc800");
+ kb.set_fixed(true);
- MCFG_DEVICE_MODIFY(ABCBUS_TAG)
- MCFG_SLOT_DEFAULT_OPTION("abc830")
+ subdevice<abcbus_slot_device>(ABCBUS_TAG)->set_default_option("abc830");
// internal ram
RAM(config, RAM_TAG).set_default_size("16K").set_extra_options("32K");
-MACHINE_CONFIG_END
+}
//-------------------------------------------------
-// MACHINE_CONFIG( abc800m )
+// machine_config( abc800m )
//-------------------------------------------------
-MACHINE_CONFIG_START(abc800m_state::abc800m)
+void abc800m_state::abc800m(machine_config &config)
+{
common(config);
// basic machine hardware
@@ -1160,23 +1160,23 @@ MACHINE_CONFIG_START(abc800m_state::abc800m)
abc800m_video(config);
// peripheral hardware
- MCFG_DEVICE_MODIFY(ABC_KEYBOARD_PORT_TAG)
- MCFG_SLOT_DEFAULT_OPTION("abc800")
- MCFG_SLOT_FIXED(true)
+ abc_keyboard_port_device &kb(*subdevice<abc_keyboard_port_device>(ABC_KEYBOARD_PORT_TAG));
+ kb.set_default_option("abc800");
+ kb.set_fixed(true);
- MCFG_DEVICE_MODIFY(ABCBUS_TAG)
- MCFG_SLOT_DEFAULT_OPTION("abc830")
+ subdevice<abcbus_slot_device>(ABCBUS_TAG)->set_default_option("abc830");
// internal ram
RAM(config, RAM_TAG).set_default_size("16K").set_extra_options("32K");
-MACHINE_CONFIG_END
+}
//-------------------------------------------------
-// MACHINE_CONFIG( abc802 )
+// machine_config( abc802 )
//-------------------------------------------------
-MACHINE_CONFIG_START(abc802_state::abc802)
+void abc802_state::abc802(machine_config &config)
+{
common(config);
// basic machine hardware
@@ -1190,22 +1190,21 @@ MACHINE_CONFIG_START(abc802_state::abc802)
m_dart->out_dtrb_callback().set(FUNC(abc802_state::lrs_w));
m_dart->out_rtsb_callback().set(FUNC(abc802_state::mux80_40_w));
- MCFG_DEVICE_MODIFY(ABC_KEYBOARD_PORT_TAG)
- MCFG_SLOT_DEFAULT_OPTION("abc55")
+ subdevice<abc_keyboard_port_device>(ABC_KEYBOARD_PORT_TAG)->set_default_option("abc55");
- MCFG_DEVICE_MODIFY(ABCBUS_TAG)
- MCFG_SLOT_DEFAULT_OPTION("abc834")
+ subdevice<abcbus_slot_device>(ABCBUS_TAG)->set_default_option("abc834");
// internal ram
RAM(config, RAM_TAG).set_default_size("64K");
-MACHINE_CONFIG_END
+}
//-------------------------------------------------
-// MACHINE_CONFIG( abc806 )
+// machine_config( abc806 )
//-------------------------------------------------
-MACHINE_CONFIG_START(abc806_state::abc806)
+void abc806_state::abc806(machine_config &config)
+{
common(config);
// basic machine hardware
@@ -1220,18 +1219,16 @@ MACHINE_CONFIG_START(abc806_state::abc806)
m_dart->out_dtrb_callback().set(FUNC(abc806_state::keydtr_w));
- MCFG_DEVICE_MODIFY(ABC_KEYBOARD_PORT_TAG)
- MCFG_SLOT_DEFAULT_OPTION("abc77")
+ subdevice<abc_keyboard_port_device>(ABC_KEYBOARD_PORT_TAG)->set_default_option("abc77");
- MCFG_DEVICE_MODIFY(ABCBUS_TAG)
- MCFG_SLOT_DEFAULT_OPTION("abc832")
+ subdevice<abcbus_slot_device>(ABCBUS_TAG)->set_default_option("abc832");
// internal ram
RAM(config, RAM_TAG).set_default_size("160K").set_extra_options("544K");
// software list
- MCFG_SOFTWARE_LIST_ADD("flop_list2", "abc806")
-MACHINE_CONFIG_END
+ SOFTWARE_LIST(config, "flop_list2").set_original("abc806");
+}
diff --git a/src/mame/drivers/ac1.cpp b/src/mame/drivers/ac1.cpp
index 1b7e4329cf0..c1e75686566 100644
--- a/src/mame/drivers/ac1.cpp
+++ b/src/mame/drivers/ac1.cpp
@@ -129,11 +129,12 @@ static INPUT_PORTS_START( ac1 )
INPUT_PORTS_END
/* Machine driver */
-MACHINE_CONFIG_START(ac1_state::ac1)
+void ac1_state::ac1(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, XTAL(8'000'000) / 4)
- MCFG_DEVICE_PROGRAM_MAP(ac1_mem)
- MCFG_DEVICE_IO_MAP(ac1_io)
+ Z80(config, m_maincpu, XTAL(8'000'000) / 4);
+ m_maincpu->set_addrmap(AS_PROGRAM, &ac1_state::ac1_mem);
+ m_maincpu->set_addrmap(AS_IO, &ac1_state::ac1_io);
z80pio_device& pio(Z80PIO(config, "z80pio", XTAL(8'000'000)/4));
pio.in_pa_callback().set(FUNC(ac1_state::ac1_port_a_r));
@@ -142,35 +143,35 @@ MACHINE_CONFIG_START(ac1_state::ac1)
pio.out_pb_callback().set(FUNC(ac1_state::ac1_port_b_w));
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(50)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */
- MCFG_SCREEN_SIZE(64*6, 16*8)
- MCFG_SCREEN_VISIBLE_AREA(0, 64*6-1, 0, 16*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(ac1_state, screen_update_ac1)
- MCFG_SCREEN_PALETTE(m_palette)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(50);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */
+ screen.set_size(64*6, 16*8);
+ screen.set_visarea_full();
+ screen.set_screen_update(FUNC(ac1_state::screen_update_ac1));
+ screen.set_palette(m_palette);
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_ac1 )
+ GFXDECODE(config, m_gfxdecode, m_palette, gfx_ac1);
PALETTE(config, m_palette, palette_device::MONOCHROME);
SPEAKER(config, "mono").front_center();
WAVE(config, "wave", "cassette").add_route(ALL_OUTPUTS, "mono", 0.25);
- MCFG_CASSETTE_ADD( "cassette" )
-MACHINE_CONFIG_END
+ CASSETTE(config, m_cassette);
+}
-MACHINE_CONFIG_START(ac1_state::ac1_32)
+void ac1_state::ac1_32(machine_config &config)
+{
ac1(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(ac1_32_mem)
+ m_maincpu->set_addrmap(AS_PROGRAM, &ac1_state::ac1_32_mem);
- MCFG_SCREEN_MODIFY("screen")
- MCFG_SCREEN_SIZE(64*6, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0, 64*6-1, 0, 32*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(ac1_state, screen_update_ac1_32)
-MACHINE_CONFIG_END
+ screen_device &screen(*subdevice<screen_device>("screen"));
+ screen.set_size(64*6, 32*8);
+ screen.set_visarea_full();
+ screen.set_screen_update(FUNC(ac1_state::screen_update_ac1_32));
+}
/* ROM definition */
ROM_START( ac1 )
diff --git a/src/mame/drivers/acd.cpp b/src/mame/drivers/acd.cpp
index 64ff4cd0863..4207ac70b57 100644
--- a/src/mame/drivers/acd.cpp
+++ b/src/mame/drivers/acd.cpp
@@ -26,8 +26,9 @@ private:
static INPUT_PORTS_START( acd )
INPUT_PORTS_END
-MACHINE_CONFIG_START(acd_state::acd)
-MACHINE_CONFIG_END
+void acd_state::acd(machine_config &config)
+{
+}
ROM_START( acd )
ROM_REGION( 0x10000, "maincpu", 0 )
diff --git a/src/mame/drivers/ace.cpp b/src/mame/drivers/ace.cpp
index 91c30b4ce10..9bb971d5e44 100644
--- a/src/mame/drivers/ace.cpp
+++ b/src/mame/drivers/ace.cpp
@@ -322,27 +322,27 @@ void aceal_state::machine_reset()
elem = 0;
}
-MACHINE_CONFIG_START(aceal_state::ace)
-
+void aceal_state::ace(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", I8080, MASTER_CLOCK/9) /* 2 MHz ? */
- MCFG_DEVICE_PROGRAM_MAP(main_map)
+ I8080(config, m_maincpu, MASTER_CLOCK/9); /* 2 MHz ? */
+ m_maincpu->set_addrmap(AS_PROGRAM, &aceal_state::main_map);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */)
- MCFG_SCREEN_SIZE(32*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(4*8, 32*8-1, 2*8, 32*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(aceal_state, screen_update_ace)
- MCFG_SCREEN_PALETTE(m_palette)
-
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_ace)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500) /* not accurate */);
+ screen.set_size(32*8, 32*8);
+ screen.set_visarea(4*8, 32*8-1, 2*8, 32*8-1);
+ screen.set_screen_update(FUNC(aceal_state::screen_update_ace));
+ screen.set_palette(m_palette);
+
+ GFXDECODE(config, m_gfxdecode, m_palette, gfx_ace);
PALETTE(config, m_palette, palette_device::MONOCHROME);
/* sound hardware */
/* ???? */
-MACHINE_CONFIG_END
+}
/***************************************************************************
diff --git a/src/mame/drivers/aceex.cpp b/src/mame/drivers/aceex.cpp
index d4830b3906f..fcf2de94a0c 100644
--- a/src/mame/drivers/aceex.cpp
+++ b/src/mame/drivers/aceex.cpp
@@ -84,12 +84,13 @@ void aceex2814_state::machine_reset()
#define Y1_CLOCK 40320000
#define Y2_CLOCK 45342720
-MACHINE_CONFIG_START(aceex2814_state::aceex2814)
+void aceex2814_state::aceex2814(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", I80C31, Y2_CLOCK)
- MCFG_DEVICE_PROGRAM_MAP(aceex2814_map)
-MACHINE_CONFIG_END
+ I80C31(config, m_maincpu, Y2_CLOCK);
+ m_maincpu->set_addrmap(AS_PROGRAM, &aceex2814_state::aceex2814_map);
+}
ROM_START( aceex2814 )
ROM_REGION( 0x10000, "maincpu", 0 )
diff --git a/src/mame/drivers/acefruit.cpp b/src/mame/drivers/acefruit.cpp
index 49a05bdb9bc..c3ebc08de7b 100644
--- a/src/mame/drivers/acefruit.cpp
+++ b/src/mame/drivers/acefruit.cpp
@@ -626,33 +626,33 @@ static GFXDECODE_START( gfx_acefruit )
GFXDECODE_ENTRY( "gfx1", 0x1800, charlayout, 8, 4 )
GFXDECODE_END
-MACHINE_CONFIG_START(acefruit_state::acefruit)
-
+void acefruit_state::acefruit(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, 2500000) /* 2.5MHz */
- MCFG_DEVICE_PROGRAM_MAP(acefruit_map)
- MCFG_DEVICE_IO_MAP(acefruit_io)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", acefruit_state, acefruit_vblank)
+ Z80(config, m_maincpu, 2500000); /* 2.5MHz */
+ m_maincpu->set_addrmap(AS_PROGRAM, &acefruit_state::acefruit_map);
+ m_maincpu->set_addrmap(AS_IO, &acefruit_state::acefruit_io);
+ m_maincpu->set_vblank_int("screen", FUNC(acefruit_state::acefruit_vblank));
WATCHDOG_TIMER(config, "watchdog");
GFXDECODE(config, m_gfxdecode, m_palette, gfx_acefruit);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */)
- MCFG_SCREEN_SIZE(512, 256)
- MCFG_SCREEN_VISIBLE_AREA(0, 511, 0, 255)
- MCFG_SCREEN_UPDATE_DRIVER(acefruit_state, screen_update_acefruit)
- MCFG_SCREEN_PALETTE(m_palette)
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_refresh_hz(60);
+ m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(2500) /* not accurate */);
+ m_screen->set_size(512, 256);
+ m_screen->set_visarea_full();
+ m_screen->set_screen_update(FUNC(acefruit_state::screen_update_acefruit));
+ m_screen->set_palette(m_palette);
PALETTE(config, m_palette, FUNC(acefruit_state::acefruit_palette), 16);
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
/* sound hardware */
-MACHINE_CONFIG_END
+}
void acefruit_state::init_sidewndr()
{
diff --git a/src/mame/drivers/acesp.cpp b/src/mame/drivers/acesp.cpp
index 7f1b049ff2d..01584aaba1b 100644
--- a/src/mame/drivers/acesp.cpp
+++ b/src/mame/drivers/acesp.cpp
@@ -86,13 +86,13 @@ static INPUT_PORTS_START( ace_sp )
INPUT_PORTS_END
-MACHINE_CONFIG_START(ace_sp_state::ace_sp)
- MCFG_DEVICE_ADD("maincpu", HD6303Y, 1000000)
- MCFG_DEVICE_PROGRAM_MAP(ace_sp_map)
-
- MCFG_DEVICE_ADD("pia0", PIA6821, 0)
+void ace_sp_state::ace_sp(machine_config &config)
+{
+ HD6303Y(config, m_maincpu, 1000000);
+ m_maincpu->set_addrmap(AS_PROGRAM, &ace_sp_state::ace_sp_map);
-MACHINE_CONFIG_END
+ PIA6821(config, "pia0", 0);
+}
#define SP_CBOWL_SOUND \
diff --git a/src/mame/drivers/aci_boris.cpp b/src/mame/drivers/aci_boris.cpp
new file mode 100644
index 00000000000..55817b69224
--- /dev/null
+++ b/src/mame/drivers/aci_boris.cpp
@@ -0,0 +1,258 @@
+// license:BSD-3-Clause
+// copyright-holders:hap
+// thanks-to:Sean Riddle
+/******************************************************************************
+
+Applied Concepts Boris (electronic chess computer)
+
+- MK3850N-3 CPU @ 2 MHz, MK3853N memory interface
+- 256 bytes RAM(2*2112), AMI 2KB ROM + AMI 1KB(?*) ROM *: less than 512 bytes used
+- 8-digit 16seg led panel
+
+When it was first released, it was in kit form. An extensive assembly manual with
+schematics was included. It was later distributed by Chafitz in pre-assembled form.
+There's also an updated revision, identifiable by the startup message "Boris awaits
+your move"(same as Boris Master) instead of "Boris plays black".
+
+******************************************************************************/
+
+#include "emu.h"
+#include "cpu/f8/f8.h"
+#include "machine/f3853.h"
+#include "machine/timer.h"
+
+// internal artwork
+#include "aci_boris.lh" // clickable
+
+
+namespace {
+
+class boris_state : public driver_device
+{
+public:
+ boris_state(const machine_config &mconfig, device_type type, const char *tag) :
+ driver_device(mconfig, type, tag),
+ m_maincpu(*this, "maincpu"),
+ m_inp_matrix(*this, "IN.%u", 0),
+ m_delay_display(*this, "delay_display_%u", 0),
+ m_out_digit(*this, "digit%u", 0U)
+ { }
+
+ void boris(machine_config &config);
+
+ DECLARE_INPUT_CHANGED_MEMBER(reset_switch);
+
+protected:
+ virtual void machine_start() override;
+
+private:
+ // devices/pointers
+ required_device<cpu_device> m_maincpu;
+ required_ioport_array<4> m_inp_matrix;
+ required_device_array<timer_device, 8> m_delay_display;
+ output_finder<8> m_out_digit;
+
+ void main_map(address_map &map);
+ void main_io(address_map &map);
+
+ TIMER_DEVICE_CALLBACK_MEMBER(delay_display);
+
+ DECLARE_WRITE8_MEMBER(mux_w);
+ DECLARE_WRITE8_MEMBER(digit_w);
+ DECLARE_READ8_MEMBER(input_r);
+
+ void update_4042();
+
+ u8 m_io[2]; // MK3850 I/O ports
+ u8 m_4042; // 4042 latch output
+};
+
+void boris_state::machine_start()
+{
+ // resolve handlers
+ m_out_digit.resolve();
+
+ // zerofill
+ memset(m_io, 0, sizeof(m_io));
+ m_4042 = 0;
+
+ // register for savestates
+ save_item(NAME(m_io));
+ save_item(NAME(m_4042));
+}
+
+INPUT_CHANGED_MEMBER(boris_state::reset_switch)
+{
+ // reset switch is tied to MK3850 RESET pin
+ m_maincpu->set_input_line(INPUT_LINE_RESET, newval ? ASSERT_LINE : CLEAR_LINE);
+
+ // clear display
+ if (newval)
+ {
+ for (int i = 0; i < 8; i++)
+ m_delay_display[i]->adjust(attotime::zero, i);
+ }
+}
+
+
+
+/******************************************************************************
+ Devices, I/O
+******************************************************************************/
+
+// MK3850 ports/TTL
+
+TIMER_DEVICE_CALLBACK_MEMBER(boris_state::delay_display)
+{
+ // 16 segments via port 1 and 4042 output (latched port 1)
+ u16 mask = (param & 8) ? 0xffff : 0;
+ m_out_digit[param & 7] = ~(m_4042 << 8 | m_io[1]) & mask;
+}
+
+void boris_state::update_4042()
+{
+ // port 1 is latched as long as 4042 clock is low
+ // (yes low, this is actually (~~m_io[0] & 8) since output ports are inverted)
+ if (m_io[0] & 8)
+ m_4042 = bitswap<8>(m_io[1],4,2,0,6,5,1,3,7);
+}
+
+WRITE8_MEMBER(boris_state::mux_w)
+{
+ // IO00-IO02: 4028 A-C to digit/input mux (4028 D to GND)
+ u8 prev = ~m_io[0] & 7;
+ u8 sel = ~data & 7;
+ if (sel != prev)
+ {
+ // digits are strobed, so on falling edge, delay them going off to prevent flicker or stuck display
+ m_delay_display[prev]->adjust(attotime::from_msec(50), prev);
+
+ // need a short delay on rising edge too, while boris sets up digit segments
+ // (it writes port 1, increments digit, latches port 1, writes port 1 again)
+ m_delay_display[sel]->adjust(attotime::from_usec(50), sel | 8);
+ }
+
+ // IO03: clock 4042
+ m_io[0] = data;
+ update_4042();
+}
+
+READ8_MEMBER(boris_state::input_r)
+{
+ // IO04-IO07: multiplexed inputs from 4028 4-7
+ u8 data = m_io[0];
+ u8 sel = ~data & 7;
+ if (sel >= 4)
+ data |= m_inp_matrix[sel-4]->read() << 4;
+
+ return data;
+}
+
+WRITE8_MEMBER(boris_state::digit_w)
+{
+ // IO10-IO17: digit segments
+ m_io[1] = data;
+ update_4042();
+}
+
+
+
+/******************************************************************************
+ Address Maps
+******************************************************************************/
+
+void boris_state::main_map(address_map &map)
+{
+ map.global_mask(0x0fff);
+ map(0x0000, 0x0bff).rom();
+ map(0x0c00, 0x0fff).ram();
+}
+
+void boris_state::main_io(address_map &map)
+{
+ map(0x00, 0x00).rw(FUNC(boris_state::input_r), FUNC(boris_state::mux_w));
+ map(0x01, 0x01).w(FUNC(boris_state::digit_w));
+ map(0x0c, 0x0f).rw("smi", FUNC(f3853_device::read), FUNC(f3853_device::write));
+}
+
+
+
+/******************************************************************************
+ Input Ports
+******************************************************************************/
+
+static INPUT_PORTS_START( boris )
+ PORT_START("IN.0")
+ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_G) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("G.7")
+ PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_H) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("H.8")
+ PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_S) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) PORT_NAME("Set / 9") // labeled just "SET" on 1st version
+ PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_DEL) PORT_CODE(KEYCODE_BACKSPACE) PORT_NAME("CE") // clear entry
+
+ PORT_START("IN.1")
+ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_D) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("D.4 / Rook")
+ PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_E) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("E.5 / Queen")
+ PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_F) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("F.6 / King")
+ PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_T) PORT_NAME("Time")
+
+ PORT_START("IN.2")
+ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_A) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("A.1 / Pawn")
+ PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_B) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("B.2 / Knight")
+ PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_C) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("C.3 / Bishop")
+ PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_K) PORT_NAME("Rank")
+
+ PORT_START("IN.3")
+ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_0_PAD) PORT_NAME("0")
+ PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_SPACE) PORT_CODE(KEYCODE_MINUS) PORT_NAME("-")
+ PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_W) PORT_NAME("B/W") // black/white
+ PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("Enter")
+
+ PORT_START("RESET")
+ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_OTHER) PORT_CODE(KEYCODE_R) PORT_TOGGLE PORT_CHANGED_MEMBER(DEVICE_SELF, boris_state, reset_switch, nullptr) PORT_NAME("Reset Switch")
+INPUT_PORTS_END
+
+
+
+/******************************************************************************
+ Machine Configs
+******************************************************************************/
+
+void boris_state::boris(machine_config &config)
+{
+ /* basic machine hardware */
+ F8(config, m_maincpu, 2_MHz_XTAL); // MK3850, 2MHz XTAL according to schematics
+ m_maincpu->set_addrmap(AS_PROGRAM, &boris_state::main_map);
+ m_maincpu->set_addrmap(AS_IO, &boris_state::main_io);
+ m_maincpu->set_irq_acknowledge_callback("smi", FUNC(f3853_device::int_acknowledge));
+
+ f3853_device &smi(F3853(config, "smi", 2_MHz_XTAL));
+ smi.int_req_callback().set_inputline("maincpu", F8_INPUT_LINE_INT_REQ);
+
+ /* video hardware */
+ for (int i = 0; i < 8; i++)
+ TIMER(config, m_delay_display[i]).configure_generic(FUNC(boris_state::delay_display));
+
+ config.set_default_layout(layout_aci_boris);
+}
+
+
+
+/******************************************************************************
+ ROM Definitions
+******************************************************************************/
+
+ROM_START( boris )
+ ROM_REGION( 0x1000, "maincpu", 0 )
+ ROM_LOAD("007-7020-00_c10502", 0x0000, 0x0800, CRC(18182870) SHA1(cb717a4b5269b04b0d7ae61aaf4a8f6a019626a5) )
+ ROM_LOAD("007-7021-00_c10503", 0x0800, 0x0400, CRC(49b77505) SHA1(474b665ee2955497f6d70878d817f1783ba1a835) )
+ROM_END
+
+} // anonymous namespace
+
+
+
+/******************************************************************************
+ Drivers
+******************************************************************************/
+
+// YEAR NAME PARENT CMP MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS
+COMP( 1978, boris, 0, 0, boris, boris, boris_state, empty_init, "Applied Concepts", "Boris", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW | MACHINE_CLICKABLE_ARTWORK )
diff --git a/src/mame/drivers/aci_borisdpl.cpp b/src/mame/drivers/aci_borisdpl.cpp
new file mode 100644
index 00000000000..d2210d63df8
--- /dev/null
+++ b/src/mame/drivers/aci_borisdpl.cpp
@@ -0,0 +1,236 @@
+// license:BSD-3-Clause
+// copyright-holders:Sandro Ronco, hap
+// thanks-to:Sean Riddle
+/******************************************************************************
+
+Applied Concepts Boris Diplomat
+
+- F3870 MCU (Motorola SC80265P or Fairchild SL90259)
+- 256 bytes RAM(2*2112-1)
+- 8-digit 7seg led panel
+
+Two versions exists, a blue one(seen with SC80265P) and a brown one(seen with
+either MCU). The one emulated here is from a brown version with the SC80265P.
+Motorola SC80265P is a 3870 clone, it's assumed that the program is the same
+as SL90259.
+
+******************************************************************************/
+
+#include "emu.h"
+#include "cpu/f8/f8.h"
+#include "machine/f3853.h"
+#include "machine/timer.h"
+
+// internal artwork
+#include "aci_borisdpl.lh" // clickable
+
+
+namespace {
+
+class borisdpl_state : public driver_device
+{
+public:
+ borisdpl_state(const machine_config &mconfig, device_type type, const char *tag) :
+ driver_device(mconfig, type, tag),
+ m_maincpu(*this, "maincpu"),
+ m_keypad(*this, "LINE%u", 1U),
+ m_delay_display(*this, "delay_display_%u", 0),
+ m_out_digit(*this, "digit%u", 0U)
+ { }
+
+ void borisdpl(machine_config &config);
+
+ // reset button is tied to MCU RESET pin
+ DECLARE_INPUT_CHANGED_MEMBER(reset_button) { m_maincpu->set_input_line(INPUT_LINE_RESET, newval ? ASSERT_LINE : CLEAR_LINE); }
+
+protected:
+ virtual void machine_start() override;
+
+private:
+ // devices/pointers
+ required_device<cpu_device> m_maincpu;
+ required_ioport_array<4> m_keypad;
+ required_device_array<timer_device, 8> m_delay_display;
+ output_finder<8> m_out_digit;
+
+ void main_map(address_map &map);
+ void main_io(address_map &map);
+
+ TIMER_DEVICE_CALLBACK_MEMBER(delay_display);
+
+ DECLARE_WRITE8_MEMBER(digit_w);
+ DECLARE_READ8_MEMBER(input_r);
+ DECLARE_WRITE8_MEMBER(matrix_w);
+
+ // 256 bytes data RAM accessed via I/O ports
+ DECLARE_READ8_MEMBER(ram_address_r) { return m_ram_address; }
+ DECLARE_WRITE8_MEMBER(ram_address_w) { m_ram_address = data; }
+ DECLARE_READ8_MEMBER(ram_data_r) { return m_ram[m_ram_address]; }
+ DECLARE_WRITE8_MEMBER(ram_data_w) { m_ram[m_ram_address] = data; }
+
+ std::unique_ptr<u8[]> m_ram;
+ u8 m_ram_address;
+ u8 m_matrix;
+};
+
+void borisdpl_state::machine_start()
+{
+ // resolve handlers
+ m_out_digit.resolve();
+
+ // zerofill
+ m_ram = make_unique_clear<u8[]>(0x100);
+ m_ram_address = 0;
+ m_matrix = 0;
+
+ // register for savestates
+ save_pointer(NAME(m_ram), 0x100);
+ save_item(NAME(m_ram_address));
+ save_item(NAME(m_matrix));
+}
+
+
+
+/******************************************************************************
+ Devices, I/O
+******************************************************************************/
+
+// F3870 ports
+
+TIMER_DEVICE_CALLBACK_MEMBER(borisdpl_state::delay_display)
+{
+ // clear digits if inactive
+ if (param != (m_matrix & 7))
+ m_out_digit[param] = 0;
+}
+
+WRITE8_MEMBER(borisdpl_state::digit_w)
+{
+ // digit segments, update display here
+ m_out_digit[m_matrix & 7] = ~data & 0x7f;
+}
+
+WRITE8_MEMBER(borisdpl_state::matrix_w)
+{
+ // d0-d2: MC14028B to input/digit select
+ // digits are strobed, so on falling edge, delay them going off to prevent flicker or stuck display
+ if ((data & 7) != (m_matrix & 7))
+ m_delay_display[m_matrix & 7]->adjust(attotime::from_msec(20), m_matrix & 7);
+
+ m_matrix = data;
+}
+
+READ8_MEMBER(borisdpl_state::input_r)
+{
+ // d4-d7: multiplexed inputs (only one lane can be selected at the same time)
+ u8 data = m_matrix;
+ if ((m_matrix & 7) < 4)
+ data |= m_keypad[m_matrix & 3]->read() << 4;
+
+ return data;
+}
+
+
+
+/******************************************************************************
+ Address Maps
+******************************************************************************/
+
+void borisdpl_state::main_map(address_map &map)
+{
+ map.global_mask(0x7ff);
+ map(0x0000, 0x07ff).rom();
+}
+
+void borisdpl_state::main_io(address_map &map)
+{
+ map(0x00, 0x00).rw(FUNC(borisdpl_state::input_r), FUNC(borisdpl_state::matrix_w));
+ map(0x01, 0x01).w(FUNC(borisdpl_state::digit_w));
+ map(0x04, 0x07).rw("psu", FUNC(f38t56_device::read), FUNC(f38t56_device::write));
+}
+
+
+
+/******************************************************************************
+ Input Ports
+******************************************************************************/
+
+static INPUT_PORTS_START( borisdpl )
+ PORT_START("LINE1")
+ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_0_PAD) PORT_NAME("0")
+ PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_SPACE) PORT_CODE(KEYCODE_MINUS) PORT_NAME("-")
+ PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_W) PORT_NAME("B/W") // black/white
+ PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("Enter")
+
+ PORT_START("LINE2")
+ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_A) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("A.1 / Pawn")
+ PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_B) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("B.2 / Knight")
+ PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_C) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("C.3 / Bishop")
+ PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_K) PORT_NAME("Rank")
+
+ PORT_START("LINE3")
+ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_D) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("D.4 / Rook")
+ PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_E) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("E.5 / Queen")
+ PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_F) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("F.6 / King")
+ PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_T) PORT_NAME("Time")
+
+ PORT_START("LINE4")
+ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_G) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("G.7")
+ PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_H) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("H.8")
+ PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_S) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) PORT_NAME("9 / Set")
+ PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_DEL) PORT_CODE(KEYCODE_BACKSPACE) PORT_NAME("CE") // clear entry
+
+ PORT_START("RESET")
+ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_R) PORT_CHANGED_MEMBER(DEVICE_SELF, borisdpl_state, reset_button, nullptr) PORT_NAME("Reset")
+INPUT_PORTS_END
+
+
+
+/******************************************************************************
+ Machine Configs
+******************************************************************************/
+
+void borisdpl_state::borisdpl(machine_config &config)
+{
+ /* basic machine hardware */
+ F8(config, m_maincpu, 3000000/2); // frequency approximated from video reference
+ m_maincpu->set_addrmap(AS_PROGRAM, &borisdpl_state::main_map);
+ m_maincpu->set_addrmap(AS_IO, &borisdpl_state::main_io);
+ m_maincpu->set_irq_acknowledge_callback("psu", FUNC(f38t56_device::int_acknowledge));
+
+ f38t56_device &psu(F38T56(config, "psu", 3000000/2));
+ psu.set_int_vector(0x5020);
+ psu.int_req_callback().set_inputline("maincpu", F8_INPUT_LINE_INT_REQ);
+ psu.read_a().set(FUNC(borisdpl_state::ram_data_r));
+ psu.write_a().set(FUNC(borisdpl_state::ram_data_w));
+ psu.read_b().set(FUNC(borisdpl_state::ram_address_r));
+ psu.write_b().set(FUNC(borisdpl_state::ram_address_w));
+
+ /* video hardware */
+ for (int i = 0; i < 8; i++)
+ TIMER(config, m_delay_display[i]).configure_generic(FUNC(borisdpl_state::delay_display));
+
+ config.set_default_layout(layout_aci_borisdpl);
+}
+
+
+
+/******************************************************************************
+ ROM Definitions
+******************************************************************************/
+
+ROM_START( borisdpl )
+ ROM_REGION( 0x0800, "maincpu", 0 )
+ ROM_LOAD("007-7024-00_7847.u8", 0x0000, 0x0800, CRC(e20bac03) SHA1(9e17b9d90522371fbf7018926356150f70b9a3b6) )
+ROM_END
+
+} // anonymous namespace
+
+
+
+/******************************************************************************
+ Drivers
+******************************************************************************/
+
+// YEAR NAME PARENT CMP MACHINE INPUT STATE INIT COMPANY, FULLNAME, FLAGS
+CONS( 1979, borisdpl, 0, 0, borisdpl, borisdpl, borisdpl_state, empty_init, "Applied Concepts", "Boris Diplomat", MACHINE_NO_SOUND_HW | MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK )
diff --git a/src/mame/drivers/acommand.cpp b/src/mame/drivers/acommand.cpp
index 2f3174ff42d..c3560e0ea95 100644
--- a/src/mame/drivers/acommand.cpp
+++ b/src/mame/drivers/acommand.cpp
@@ -468,21 +468,21 @@ TIMER_DEVICE_CALLBACK_MEMBER(acommand_state::acommand_scanline)
m_maincpu->set_input_line(3, HOLD_LINE);
}
-MACHINE_CONFIG_START(acommand_state::acommand)
-
+void acommand_state::acommand(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu",M68000,12000000)
- MCFG_DEVICE_PROGRAM_MAP(acommand_map)
- MCFG_TIMER_DRIVER_ADD_SCANLINE("scantimer", acommand_state, acommand_scanline, "screen", 0, 1)
+ M68000(config, m_maincpu, 12000000);
+ m_maincpu->set_addrmap(AS_PROGRAM, &acommand_state::acommand_map);
+ TIMER(config, "scantimer").configure_scanline(FUNC(acommand_state::acommand_scanline), "screen", 0, 1);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(32*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(acommand_state, screen_update_acommand)
- MCFG_SCREEN_PALETTE(m_palette)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(32*8, 32*8);
+ screen.set_visarea(0*8, 32*8-1, 2*8, 30*8-1);
+ screen.set_screen_update(FUNC(acommand_state::screen_update_acommand));
+ screen.set_palette(m_palette);
GFXDECODE(config, m_gfxdecode, m_palette, gfx_acommand);
PALETTE(config, m_palette).set_format(palette_device::RRRRGGGGBBBBRGBx, 0x4000);
@@ -494,14 +494,14 @@ MACHINE_CONFIG_START(acommand_state::acommand)
SPEAKER(config, "lspeaker").front_left();
SPEAKER(config, "rspeaker").front_right();
- MCFG_DEVICE_ADD("oki1", OKIM6295, 2112000, okim6295_device::PIN7_HIGH) // clock frequency & pin 7 not verified
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 1.0)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 1.0)
+ OKIM6295(config, m_oki1, 2112000, okim6295_device::PIN7_HIGH); // clock frequency & pin 7 not verified
+ m_oki1->add_route(ALL_OUTPUTS, "lspeaker", 1.0);
+ m_oki1->add_route(ALL_OUTPUTS, "rspeaker", 1.0);
- MCFG_DEVICE_ADD("oki2", OKIM6295, 2112000, okim6295_device::PIN7_HIGH) // clock frequency & pin 7 not verified
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 1.0)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 1.0)
-MACHINE_CONFIG_END
+ OKIM6295(config, m_oki2, 2112000, okim6295_device::PIN7_HIGH); // clock frequency & pin 7 not verified
+ m_oki2->add_route(ALL_OUTPUTS, "lspeaker", 1.0);
+ m_oki2->add_route(ALL_OUTPUTS, "rspeaker", 1.0);
+}
/***************************************************************************
diff --git a/src/mame/drivers/acrnsys.cpp b/src/mame/drivers/acrnsys.cpp
index f24b1a4f120..2eaa8aca2eb 100644
--- a/src/mame/drivers/acrnsys.cpp
+++ b/src/mame/drivers/acrnsys.cpp
@@ -123,7 +123,7 @@ void acrnsys_state::a6502_mem(address_map &map)
{
map.unmap_value_low();
map(0x0000, 0x03ff).ram();
- map(0x0e00, 0x0e7f).mirror(0x100).rw(m_ins8154, FUNC(ins8154_device::ins8154_r), FUNC(ins8154_device::ins8154_w));
+ map(0x0e00, 0x0e7f).mirror(0x100).rw(m_ins8154, FUNC(ins8154_device::read_io), FUNC(ins8154_device::write_io));
map(0xf000, 0xffff).rom().region("maincpu", 0);
}
@@ -437,7 +437,7 @@ void acrnsys_state::acrnsys2(machine_config &config)
/* Acorn Bus - 8 Slot Backplane */
ACORN_BUS(config, m_bus, 0);
- m_bus->set_cputag(m_maincpu);
+ m_bus->set_space(m_maincpu, AS_PROGRAM);
m_bus->out_irq_callback().set(m_irqs, FUNC(input_merger_device::in_w<1>));
m_bus->out_nmi_callback().set(FUNC(acrnsys_state::bus_nmi_w));
ACORN_BUS_SLOT(config, "bus1", m_bus, acorn_bus_devices, "8k"); // 0x2000-0x3fff
@@ -461,7 +461,7 @@ void acrnsys_state::acrnsys3(machine_config &config)
/* Acorn Bus - 8 Slot Backplane */
ACORN_BUS(config, m_bus, 0);
- m_bus->set_cputag(m_maincpu);
+ m_bus->set_space(m_maincpu, AS_PROGRAM);
m_bus->out_irq_callback().set(m_irqs, FUNC(input_merger_device::in_w<1>));
m_bus->out_nmi_callback().set(FUNC(acrnsys_state::bus_nmi_w));
ACORN_BUS_SLOT(config, "bus1", m_bus, acorn_bus_devices, "8k"); // 0x2000-0x3fff
@@ -485,7 +485,7 @@ void acrnsys_state::acrnsys3_6809(machine_config &config)
/* Acorn Bus - 8 Slot Backplane */
ACORN_BUS(config, m_bus, 0);
- m_bus->set_cputag(m_maincpu);
+ m_bus->set_space(m_maincpu, AS_PROGRAM);
m_bus->out_irq_callback().set(m_irqs, FUNC(input_merger_device::in_w<1>));
m_bus->out_nmi_callback().set(FUNC(acrnsys_state::bus_nmi_w));
ACORN_BUS_SLOT(config, "bus1", m_bus, acorn_bus_devices, "8k"); // 0x0000-0x1fff
@@ -508,7 +508,7 @@ void acrnsys_state::acrnsys4(machine_config &config)
/* Acorn Bus - 14 Slot Backplane */
ACORN_BUS(config, m_bus, 0);
- m_bus->set_cputag(m_maincpu);
+ m_bus->set_space(m_maincpu, AS_PROGRAM);
m_bus->out_irq_callback().set(m_irqs, FUNC(input_merger_device::in_w<1>));
m_bus->out_nmi_callback().set(FUNC(acrnsys_state::bus_nmi_w));
ACORN_BUS_SLOT(config, "bus1", m_bus, acorn_bus_devices, "8k"); // 0x2000-0x3fff
@@ -538,7 +538,7 @@ void acrnsys_state::acrnsys5(machine_config &config)
/* Acorn Bus - 7 Slot Backplane */
ACORN_BUS(config, m_bus, 0);
- m_bus->set_cputag(m_maincpu);
+ m_bus->set_space(m_maincpu, AS_PROGRAM);
m_bus->out_irq_callback().set(m_irqs, FUNC(input_merger_device::in_w<1>));
m_bus->out_nmi_callback().set(FUNC(acrnsys_state::bus_nmi_w));
ACORN_BUS_SLOT(config, "bus1", m_bus, acorn_bus_devices, "32k"); // 32K
diff --git a/src/mame/drivers/acrnsys1.cpp b/src/mame/drivers/acrnsys1.cpp
index 0d33002b5b0..e9ba3b9f17b 100644
--- a/src/mame/drivers/acrnsys1.cpp
+++ b/src/mame/drivers/acrnsys1.cpp
@@ -185,8 +185,8 @@ WRITE8_MEMBER( acrnsys1_state::acrnsys1_led_segment_w )
void acrnsys1_state::acrnsys1_map(address_map &map)
{
map(0x0000, 0x03ff).ram();
- map(0x0e00, 0x0e7f).mirror(0x100).rw("b1", FUNC(ins8154_device::ins8154_r), FUNC(ins8154_device::ins8154_w));
- map(0x0e80, 0x0eff).mirror(0x100).ram();
+ map(0x0e00, 0x0e7f).mirror(0x100).rw("b1", FUNC(ins8154_device::read_io), FUNC(ins8154_device::write_io));
+ map(0x0e80, 0x0eff).mirror(0x100).rw("b1", FUNC(ins8154_device::read_ram), FUNC(ins8154_device::write_ram));
map(0xf800, 0xf9ff).mirror(0x600).rom();
}
@@ -264,16 +264,17 @@ INPUT_PORTS_END
MACHINE DRIVERS
***************************************************************************/
-MACHINE_CONFIG_START(acrnsys1_state::acrnsys1)
+void acrnsys1_state::acrnsys1(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M6502, 1.008_MHz_XTAL) /* 1.008 MHz */
- MCFG_DEVICE_PROGRAM_MAP(acrnsys1_map)
+ M6502(config, m_maincpu, 1.008_MHz_XTAL); /* 1.008 MHz */
+ m_maincpu->set_addrmap(AS_PROGRAM, &acrnsys1_state::acrnsys1_map);
config.set_default_layout(layout_acrnsys1);
/* sound hardware */
SPEAKER(config, "mono").front_center();
- WAVE(config, "wave", "cassette").add_route(ALL_OUTPUTS, "mono", 0.25);
+ WAVE(config, "wave", m_cass).add_route(ALL_OUTPUTS, "mono", 0.25);
/* devices */
ins8154_device &b1(INS8154(config, "b1"));
@@ -283,11 +284,11 @@ MACHINE_CONFIG_START(acrnsys1_state::acrnsys1)
TTL74145(config, m_ttl74145, 0);
- MCFG_CASSETTE_ADD( "cassette" )
+ CASSETTE(config, m_cass);
- MCFG_TIMER_DRIVER_ADD_PERIODIC("acrnsys1_c", acrnsys1_state, acrnsys1_c, attotime::from_hz(4800))
- MCFG_TIMER_DRIVER_ADD_PERIODIC("acrnsys1_p", acrnsys1_state, acrnsys1_p, attotime::from_hz(40000))
-MACHINE_CONFIG_END
+ TIMER(config, "acrnsys1_c").configure_periodic(FUNC(acrnsys1_state::acrnsys1_c), attotime::from_hz(4800));
+ TIMER(config, "acrnsys1_p").configure_periodic(FUNC(acrnsys1_state::acrnsys1_p), attotime::from_hz(40000));
+}
/***************************************************************************
diff --git a/src/mame/drivers/actfancr.cpp b/src/mame/drivers/actfancr.cpp
index 1953328632f..06056d62da8 100644
--- a/src/mame/drivers/actfancr.cpp
+++ b/src/mame/drivers/actfancr.cpp
@@ -4,16 +4,9 @@
Act Fancer (Japan) FD (c) 1989 Data East Corporation
Act Fancer (World) FE (c) 1989 Data East Corporation
- Trio The Punch (World) FC (c) 1989 Data East Corporation
+ Trio The Punch (World) FG (c) 1989 Data East Corporation
Trio The Punch (Japan) FF (c) 1989 Data East Corporation
- The 'World' set has rom code FE, the 'Japan' set has rom code FD.
-
- Most Data East games give the Japanese version the earlier code, though
- there is no real difference between the sets.
-
- I believe the USA version of Act Fancer is called 'Out Fencer'
-
Emulation by Bryan McPhail, mish@tendril.co.uk
Update of the 03/04/2005
diff --git a/src/mame/drivers/acvirus.cpp b/src/mame/drivers/acvirus.cpp
index 79aaa6f16c8..a95efbdd4de 100644
--- a/src/mame/drivers/acvirus.cpp
+++ b/src/mame/drivers/acvirus.cpp
@@ -106,13 +106,14 @@ void acvirus_state::virus_map(address_map &map)
map(0x8000, 0xffff).bankr("rombank");
}
-MACHINE_CONFIG_START(acvirus_state::virus)
- MCFG_DEVICE_ADD("maincpu", I8052, XTAL(12'000'000))
- MCFG_DEVICE_PROGRAM_MAP(virus_map)
+void acvirus_state::virus(machine_config &config)
+{
+ I8052(config, m_maincpu, XTAL(12'000'000));
+ m_maincpu->set_addrmap(AS_PROGRAM, &acvirus_state::virus_map);
SPEAKER(config, "lspeaker").front_left();
SPEAKER(config, "rspeaker").front_right();
-MACHINE_CONFIG_END
+}
static INPUT_PORTS_START( virus )
INPUT_PORTS_END
diff --git a/src/mame/drivers/adam.cpp b/src/mame/drivers/adam.cpp
index 6d1a69c2db5..f9eb9b979e2 100644
--- a/src/mame/drivers/adam.cpp
+++ b/src/mame/drivers/adam.cpp
@@ -457,10 +457,10 @@ READ8_MEMBER( adam_state::mreq_r )
}
}
- data = m_cart->bd_r(space, offset & 0x7fff, data, cs1, cs2, cs3, cs4);
- data = m_slot1->bd_r(space, offset & 0xff, data, 1, biorq, 1, 1, 1);
- data = m_slot2->bd_r(space, offset, data, bmreq, biorq, aux_rom_cs, 1, cas2);
- data = m_slot3->bd_r(space, offset, data, 1, 1, 1, cas1, cas2);
+ data = m_cart->bd_r(offset & 0x7fff, data, cs1, cs2, cs3, cs4);
+ data = m_slot1->bd_r(offset & 0xff, data, 1, biorq, 1, 1, 1);
+ data = m_slot2->bd_r(offset, data, bmreq, biorq, aux_rom_cs, 1, cas2);
+ data = m_slot3->bd_r(offset, data, 1, 1, 1, cas1, cas2);
return data;
}
@@ -516,9 +516,9 @@ WRITE8_MEMBER( adam_state::mreq_w )
m_ram->pointer()[offset] = data;
}
- m_slot1->bd_w(space, offset & 0xff, data, 1, biorq, 1, 1, 1);
- m_slot2->bd_w(space, offset, data, bmreq, biorq, aux_rom_cs, 1, cas2);
- m_slot3->bd_w(space, offset, data, 1, 1, 1, cas1, cas2);
+ m_slot1->bd_w(offset & 0xff, data, 1, biorq, 1, 1, 1);
+ m_slot2->bd_w(offset, data, bmreq, biorq, aux_rom_cs, 1, cas2);
+ m_slot3->bd_w(offset, data, 1, 1, 1, cas1, cas2);
}
@@ -557,9 +557,9 @@ READ8_MEMBER( adam_state::iorq_r )
break;
}
- data = m_slot1->bd_r(space, offset & 0xff, data, 1, biorq, 1, 1, 1);
- data = m_slot2->bd_r(space, offset, data, bmreq, biorq, aux_rom_cs, 1, cas2);
- data = m_slot3->bd_r(space, offset, data, 1, 1, 1, cas1, cas2);
+ data = m_slot1->bd_r(offset & 0xff, data, 1, biorq, 1, 1, 1);
+ data = m_slot2->bd_r(offset, data, bmreq, biorq, aux_rom_cs, 1, cas2);
+ data = m_slot3->bd_r(offset, data, 1, 1, 1, cas1, cas2);
return data;
}
@@ -609,9 +609,9 @@ WRITE8_MEMBER( adam_state::iorq_w )
break;
}
- m_slot1->bd_w(space, offset & 0xff, data, 1, biorq, 1, 1, 1);
- m_slot2->bd_w(space, offset, data, bmreq, biorq, aux_rom_cs, 1, cas2);
- m_slot3->bd_w(space, offset, data, 1, 1, 1, cas1, cas2);
+ m_slot1->bd_w(offset & 0xff, data, 1, biorq, 1, 1, 1);
+ m_slot2->bd_w(offset, data, bmreq, biorq, aux_rom_cs, 1, cas2);
+ m_slot3->bd_w(offset, data, 1, 1, 1, cas1, cas2);
}
@@ -1042,7 +1042,7 @@ void adam_state::adam(machine_config &config)
m_netcpu->out_p3_cb().set(FUNC(adam_state::m6801_p3_w));
m_netcpu->out_p4_cb().set(FUNC(adam_state::m6801_p4_w));
m_netcpu->out_sc2_cb().set(FUNC(adam_state::os3_w));
- MCFG_QUANTUM_PERFECT_CPU(M6801_TAG)
+ config.m_perfect_cpu_quantum = subtag(M6801_TAG);
// video hardware
TMS9928A(config, m_vdc, XTAL(10'738'635)).set_screen("screen");
diff --git a/src/mame/drivers/adm23.cpp b/src/mame/drivers/adm23.cpp
new file mode 100644
index 00000000000..4d957aef7c4
--- /dev/null
+++ b/src/mame/drivers/adm23.cpp
@@ -0,0 +1,86 @@
+// license:BSD-3-Clause
+// copyright-holders:AJR
+/***************************************************************************
+
+ Skeleton driver for ADM 23 terminal.
+
+***************************************************************************/
+
+#include "emu.h"
+#include "cpu/z8/z8.h"
+#include "video/mc6845.h"
+#include "screen.h"
+
+class adm23_state : public driver_device
+{
+public:
+ adm23_state(const machine_config &mconfig, device_type type, const char *tag)
+ : driver_device(mconfig, type, tag)
+ , m_chargen(*this, "chargen")
+ {
+ }
+
+ void adm23(machine_config &config);
+
+private:
+ MC6845_UPDATE_ROW(update_row);
+ MC6845_ON_UPDATE_ADDR_CHANGED(addr_changed);
+
+ void mem_map(address_map &map);
+
+ required_region_ptr<u8> m_chargen;
+};
+
+MC6845_UPDATE_ROW(adm23_state::update_row)
+{
+}
+
+MC6845_ON_UPDATE_ADDR_CHANGED(adm23_state::addr_changed)
+{
+}
+
+void adm23_state::mem_map(address_map &map)
+{
+ map(0x0800, 0x1fff).rom().region("program", 0x0800);
+ map(0x2020, 0x2020).nopr();
+ map(0x2080, 0x2080).rw("crtc", FUNC(mc6845_device::status_r), FUNC(mc6845_device::address_w));
+ map(0x2081, 0x2081).rw("crtc", FUNC(mc6845_device::register_r), FUNC(mc6845_device::register_w));
+ map(0xc080, 0xc080).nopw();
+ map(0xd080, 0xd080).nopr();
+}
+
+
+static INPUT_PORTS_START(adm23)
+INPUT_PORTS_END
+
+
+void adm23_state::adm23(machine_config &config)
+{
+ z8_device &maincpu(Z8682(config, "maincpu", 14.7428_MHz_XTAL / 2));
+ maincpu.set_addrmap(AS_PROGRAM, &adm23_state::mem_map);
+
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_raw(14.7428_MHz_XTAL, 873, 0, 720, 281, 0, 264);
+ screen.set_screen_update("crtc", FUNC(mc6845_device::screen_update));
+
+ mc6845_device &crtc(SY6545_1(config, "crtc", 14.7428_MHz_XTAL / 9));
+ crtc.set_char_width(9);
+ crtc.set_show_border_area(false);
+ crtc.set_screen("screen");
+ crtc.set_update_row_callback(FUNC(adm23_state::update_row), this);
+ crtc.set_on_update_addr_change_callback(FUNC(adm23_state::addr_changed), this);
+}
+
+ROM_START(adm23)
+ ROM_REGION(0x2000, "program", 0) // CPU is clearly a Z8682, though its location is labeled "Z8 8681"
+ ROM_LOAD("136261-083_u9.bin", 0x0000, 0x2000, CRC(85da07e7) SHA1(a1305d0f06c7e3c6075b05ca0f11c53a901b5013))
+
+ ROM_REGION(0x0800, "chargen", 0)
+ ROM_LOAD("chr_u10.bin", 0x0000, 0x0800, CRC(cd053232) SHA1(6b4136a91d0dcd9cb5df92c54c9c30b1cb5f1974))
+
+ ROM_REGION(0x0020, "proms", 0)
+ ROM_LOAD("129253-61_u3.bin", 0x0000, 0x0020, NO_DUMP) // N82S123N at location labeled "S288"
+ROM_END
+
+
+COMP(1982, adm23, 0, 0, adm23, adm23, adm23_state, empty_init, "Lear Siegler", "ADM 23 Smart Terminal", MACHINE_IS_SKELETON)
diff --git a/src/mame/drivers/adm31.cpp b/src/mame/drivers/adm31.cpp
new file mode 100644
index 00000000000..483c8e39def
--- /dev/null
+++ b/src/mame/drivers/adm31.cpp
@@ -0,0 +1,513 @@
+// license:BSD-3-Clause
+// copyright-holders:AJR
+/****************************************************************************
+
+ Skeleton driver for ADM-31 terminal.
+
+ The ADM-31 and ADM-42 Data Display Terminals were Lear Siegler, Inc.'s
+ first microprocessor-based video terminals, introduced in 1978 as the
+ respective successors to their earlier ADM-1A and ADM-2 "smart"
+ terminals. The original ADM-31 model was apparently rebranded in 1980
+ as the ADM-31 Intermediate Terminal, and the ADM-32 was released a few
+ months later.
+
+ While the ADM-31 and ADM-32 only support 2 pages of display memory, the
+ ADM-42 could be upgraded to 8. Enhancements over the ADM-31 offered by
+ both the ADM-42 and ADM-32 include a status line, a larger monitor and
+ a detachable keyboard. Several other expansion options were offered for
+ the ADM-42, including synchronous serial and parallel printer ports.
+
+****************************************************************************/
+
+#include "emu.h"
+//#include "bus/rs232/rs232.h"
+#include "cpu/m6800/m6800.h"
+#include "machine/com8116.h"
+#include "machine/input_merger.h"
+#include "machine/6821pia.h"
+#include "machine/6850acia.h"
+#include "video/tms9927.h"
+#include "screen.h"
+
+class adm31_state : public driver_device
+{
+public:
+ adm31_state(const machine_config &mconfig, device_type type, const char *tag)
+ : driver_device(mconfig, type, tag)
+ , m_maincpu(*this, "maincpu")
+ , m_acia(*this, "acia%u", 1U)
+ , m_brg(*this, "brg")
+ , m_vtac(*this, "vtac")
+ , m_chargen(*this, "chargen")
+ , m_keys(*this, "R%u", 0U)
+ , m_baud(*this, "BAUD")
+ , m_caps_lamp(*this, "caps_lamp")
+ {
+ }
+
+ void adm31(machine_config &mconfig);
+
+protected:
+ virtual void machine_start() override;
+ virtual void machine_reset() override;
+
+private:
+ u32 screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
+
+ void kbd_scan_w(u8 data);
+ u8 kbd_scan_r();
+ void kbd_status_w(u8 data);
+
+ void mem_map(address_map &map);
+
+ required_device<cpu_device> m_maincpu;
+ required_device_array<acia6850_device, 2> m_acia;
+ required_device<com8116_device> m_brg;
+ required_device<crt5027_device> m_vtac;
+ required_region_ptr<u8> m_chargen;
+ optional_ioport_array<16> m_keys;
+ required_ioport m_baud;
+ output_finder<> m_caps_lamp;
+
+ u8 m_kbd_scan;
+};
+
+
+void adm31_state::machine_start()
+{
+ m_caps_lamp.resolve();
+
+ save_item(NAME(m_kbd_scan));
+}
+
+void adm31_state::machine_reset()
+{
+ // Baud rate switches read by CPU on ADM-42, but not on ADM-31?
+ m_brg->stt_str_w(m_baud->read());
+}
+
+
+u32 adm31_state::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect)
+{
+ return 0;
+}
+
+
+void adm31_state::kbd_scan_w(u8 data)
+{
+ m_kbd_scan = data & 0x7f;
+}
+
+u8 adm31_state::kbd_scan_r()
+{
+ return m_kbd_scan | (BIT(m_keys[(m_kbd_scan & 0x78) >> 3].read_safe(0xff), m_kbd_scan & 0x07) ? 0x00 : 0x80);
+}
+
+void adm31_state::kbd_status_w(u8 data)
+{
+ m_caps_lamp = BIT(data, 0);
+}
+
+void adm31_state::mem_map(address_map &map)
+{
+ map(0x0000, 0x03ff).ram();
+ map(0x7000, 0x7000).nopw();
+ map(0x7800, 0x7803).rw("pia", FUNC(pia6821_device::read), FUNC(pia6821_device::write));
+ map(0x7900, 0x7900).portr("S5");
+ map(0x7a00, 0x7a01).rw(m_acia[0], FUNC(acia6850_device::read), FUNC(acia6850_device::write));
+ map(0x7c00, 0x7c01).rw(m_acia[1], FUNC(acia6850_device::read), FUNC(acia6850_device::write));
+ map(0x7d00, 0x7d00).portr("S6");
+ map(0x7e00, 0x7e00).portr("S4");
+ map(0x7f00, 0x7f0f).rw(m_vtac, FUNC(crt5027_device::read), FUNC(crt5027_device::write));
+ map(0x8000, 0x8fff).ram();
+ map(0xe000, 0xffff).rom().region("program", 0);
+}
+
+
+static INPUT_PORTS_START(adm31)
+ PORT_START("R0")
+ PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Key D1")
+ PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Key D7")
+ PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Key C5")
+ PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Key D2")
+ PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Key D4/F4")
+ PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Key D9/F9")
+ PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('2') PORT_CHAR('"') PORT_CODE(KEYCODE_2)
+ PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Esc") PORT_CHAR(0x1b) PORT_CODE(KEYCODE_F7)
+
+ PORT_START("R1")
+ PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Rub") PORT_CHAR(0x7f) PORT_CODE(KEYCODE_F8)
+ PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Key 9E/9F")
+ PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Key D0/F0")
+ PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Key B4/B6")
+ PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Key 92/93")
+ PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('1') PORT_CHAR('!') PORT_CODE(KEYCODE_1)
+ PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('q') PORT_CHAR('Q') PORT_CODE(KEYCODE_Q)
+ PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Cap Lock") PORT_CHAR(UCHAR_MAMEKEY(CAPSLOCK)) PORT_CODE(KEYCODE_CAPSLOCK)
+
+ PORT_START("R2")
+ PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('3') PORT_CHAR('#') PORT_CODE(KEYCODE_3)
+ PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('4') PORT_CHAR('$') PORT_CODE(KEYCODE_4)
+ PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('5') PORT_CHAR('%') PORT_CODE(KEYCODE_5)
+ PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('6') PORT_CHAR('&') PORT_CODE(KEYCODE_6)
+ PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('7') PORT_CHAR('\'') PORT_CODE(KEYCODE_7)
+ PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('8') PORT_CHAR('(') PORT_CODE(KEYCODE_8)
+ PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('9') PORT_CHAR(')') PORT_CODE(KEYCODE_9)
+ PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('0') PORT_CHAR('_') PORT_CODE(KEYCODE_0)
+
+ PORT_START("R3")
+ PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('-') PORT_CHAR('=') PORT_CODE(KEYCODE_MINUS)
+ PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('^') PORT_CHAR('~') PORT_CODE(KEYCODE_EQUALS)
+ PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('\\') PORT_CHAR('|') PORT_CODE(KEYCODE_BACKSLASH)
+ PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Tab Back Tab") PORT_CHAR(0x09) PORT_CODE(KEYCODE_BACKSPACE)
+ PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR(UCHAR_MAMEKEY(7_PAD)) PORT_CODE(KEYCODE_7_PAD)
+ PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR(UCHAR_MAMEKEY(8_PAD)) PORT_CODE(KEYCODE_8_PAD)
+ PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR(UCHAR_MAMEKEY(9_PAD)) PORT_CODE(KEYCODE_9_PAD)
+ PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR(UCHAR_MAMEKEY(MINUS_PAD)) PORT_CODE(KEYCODE_MINUS_PAD)
+
+ PORT_START("R4")
+ PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('w') PORT_CHAR('W') PORT_CODE(KEYCODE_W)
+ PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('e') PORT_CHAR('E') PORT_CODE(KEYCODE_E)
+ PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('r') PORT_CHAR('R') PORT_CODE(KEYCODE_R)
+ PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('t') PORT_CHAR('T') PORT_CODE(KEYCODE_T)
+ PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('y') PORT_CHAR('Y') PORT_CODE(KEYCODE_Y)
+ PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('u') PORT_CHAR('U') PORT_CODE(KEYCODE_U)
+ PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('i') PORT_CHAR('I') PORT_CODE(KEYCODE_I)
+ PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('o') PORT_CHAR('O') PORT_CODE(KEYCODE_O)
+
+ PORT_START("R5")
+ PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('p') PORT_CHAR('P') PORT_CODE(KEYCODE_P)
+ PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('[') PORT_CHAR('{') PORT_CODE(KEYCODE_OPENBRACE)
+ PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR(']') PORT_CHAR('}') PORT_CODE(KEYCODE_CLOSEBRACE)
+ PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Return") PORT_CHAR(0x0d) PORT_CODE(KEYCODE_ENTER)
+ PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR(UCHAR_MAMEKEY(4_PAD)) PORT_CODE(KEYCODE_4_PAD)
+ PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR(UCHAR_MAMEKEY(5_PAD)) PORT_CODE(KEYCODE_5_PAD)
+ PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR(UCHAR_MAMEKEY(6_PAD)) PORT_CODE(KEYCODE_6_PAD)
+ PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR(UCHAR_MAMEKEY(TAB_PAD)) PORT_CODE(KEYCODE_PLUS_PAD)
+
+ PORT_START("R6")
+ PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('a') PORT_CHAR('A') PORT_CODE(KEYCODE_A)
+ PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('s') PORT_CHAR('S') PORT_CODE(KEYCODE_S)
+ PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('d') PORT_CHAR('D') PORT_CODE(KEYCODE_D)
+ PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('f') PORT_CHAR('F') PORT_CODE(KEYCODE_F)
+ PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('g') PORT_CHAR('G') PORT_CODE(KEYCODE_G)
+ PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('h') PORT_CHAR('H') PORT_CODE(KEYCODE_H)
+ PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('j') PORT_CHAR('J') PORT_CODE(KEYCODE_J)
+ PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('k') PORT_CHAR('K') PORT_CODE(KEYCODE_K)
+
+ PORT_START("R7")
+ PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('l') PORT_CHAR('L') PORT_CODE(KEYCODE_L)
+ PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR(';') PORT_CHAR('+') PORT_CODE(KEYCODE_COLON)
+ PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR(':') PORT_CHAR('*') PORT_CODE(KEYCODE_QUOTE)
+ PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('@') PORT_CHAR('`') PORT_CODE(KEYCODE_TILDE)
+ PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Line Feed") PORT_CHAR(0x0a) PORT_CODE(KEYCODE_RCONTROL)
+ PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR(UCHAR_MAMEKEY(2_PAD)) PORT_CODE(KEYCODE_2_PAD)
+ PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR(UCHAR_MAMEKEY(3_PAD)) PORT_CODE(KEYCODE_3_PAD)
+ PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR(UCHAR_MAMEKEY(1_PAD)) PORT_CODE(KEYCODE_1_PAD)
+
+ PORT_START("R8")
+ PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Clear") PORT_CODE(KEYCODE_LALT)
+ PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('z') PORT_CHAR('Z') PORT_CODE(KEYCODE_Z)
+ PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('x') PORT_CHAR('X') PORT_CODE(KEYCODE_X)
+ PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('c') PORT_CHAR('C') PORT_CODE(KEYCODE_C)
+ PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('v') PORT_CHAR('V') PORT_CODE(KEYCODE_V)
+ PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('b') PORT_CHAR('B') PORT_CODE(KEYCODE_B)
+ PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('n') PORT_CHAR('N') PORT_CODE(KEYCODE_N)
+ PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('m') PORT_CHAR('M') PORT_CODE(KEYCODE_M)
+
+ PORT_START("R9")
+ PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR(',') PORT_CHAR('<') PORT_CODE(KEYCODE_COMMA)
+ PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('.') PORT_CHAR('>') PORT_CODE(KEYCODE_STOP)
+ PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('/') PORT_CHAR('?') PORT_CODE(KEYCODE_SLASH)
+ PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR(' ') PORT_CODE(KEYCODE_SPACE)
+ PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("New Line New Page") PORT_CODE(KEYCODE_END)
+ PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR(UCHAR_MAMEKEY(0_PAD)) PORT_CODE(KEYCODE_0_PAD)
+ PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR(UCHAR_MAMEKEY(DEL_PAD)) PORT_CODE(KEYCODE_DEL_PAD)
+ PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Keypad Return") PORT_CHAR(UCHAR_MAMEKEY(ENTER_PAD)) PORT_CODE(KEYCODE_ENTER_PAD)
+
+ PORT_START("R10")
+ PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Key 9D/94")
+ PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR(UCHAR_MAMEKEY(HOME)) PORT_CODE(KEYCODE_HOME)
+ PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR(UCHAR_MAMEKEY(DOWN)) PORT_CODE(KEYCODE_DOWN)
+ PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR(UCHAR_MAMEKEY(UP)) PORT_CODE(KEYCODE_UP)
+ PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR(UCHAR_MAMEKEY(LEFT)) PORT_CODE(KEYCODE_LEFT)
+ PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR(UCHAR_MAMEKEY(RIGHT)) PORT_CODE(KEYCODE_RIGHT)
+ PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Key E3/40")
+ PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR(UCHAR_MAMEKEY(COMMA_PAD)) PORT_CODE(KEYCODE_COMMA_PAD)
+
+ PORT_START("SHIFT")
+ PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_UNKNOWN)
+ PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_UNKNOWN)
+ PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Ctrl") PORT_CHAR(UCHAR_SHIFT_2) PORT_CODE(KEYCODE_LCONTROL)
+ PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Shift") PORT_CHAR(UCHAR_SHIFT_1) PORT_CODE(KEYCODE_LSHIFT) PORT_CODE(KEYCODE_RSHIFT)
+ PORT_BIT(0x1d, IP_ACTIVE_LOW, IPT_UNUSED)
+
+ PORT_START("S4")
+ PORT_DIPNAME(0x01, 0x00, "Break Key") PORT_DIPLOCATION("S4:1")
+ PORT_DIPSETTING(0x01, "Disable")
+ PORT_DIPSETTING(0x00, "Enable")
+ PORT_DIPNAME(0x02, 0x02, "Refresh Rate") PORT_DIPLOCATION("S4:2")
+ PORT_DIPSETTING(0x00, "50 Hz")
+ PORT_DIPSETTING(0x02, "60 Hz")
+ PORT_DIPNAME(0x1c, 0x14, "Modem Port") PORT_DIPLOCATION("S4:3,4,5")
+ PORT_DIPSETTING(0x00, "7 DB, EP, 2 SB")
+ PORT_DIPSETTING(0x04, "7 DB, OP, 2 SB")
+ PORT_DIPSETTING(0x08, "7 DB, EP, 1 SB")
+ PORT_DIPSETTING(0x0c, "7 DB, OP, 1 SB")
+ PORT_DIPSETTING(0x10, "8 DB, NP, 2 SB")
+ PORT_DIPSETTING(0x14, "8 DB, NP, 1 SB")
+ PORT_DIPSETTING(0x18, "8 DB, EP, 1 SB")
+ PORT_DIPSETTING(0x00, "8 DB, OP, 1 SB")
+ PORT_DIPNAME(0x20, 0x00, DEF_STR(Unused)) PORT_DIPLOCATION("S4:6")
+ PORT_DIPSETTING(0x20, DEF_STR(Off))
+ PORT_DIPSETTING(0x00, DEF_STR(On))
+ PORT_DIPNAME(0x40, 0x00, "Transmission") PORT_DIPLOCATION("S4:7")
+ PORT_DIPSETTING(0x00, "Block Mode")
+ PORT_DIPSETTING(0x40, "Conversation Mode")
+ PORT_DIPNAME(0x80, 0x00, "Duplex") PORT_DIPLOCATION("S4:8")
+ PORT_DIPSETTING(0x00, "Full Duplex")
+ PORT_DIPSETTING(0x80, "Half Duplex")
+
+ PORT_START("S5")
+ PORT_DIPNAME(0x01, 0x00, DEF_STR(Unused)) PORT_DIPLOCATION("S5:1")
+ PORT_DIPSETTING(0x01, DEF_STR(Off))
+ PORT_DIPSETTING(0x00, DEF_STR(On))
+ PORT_DIPNAME(0x02, 0x00, DEF_STR(Unused)) PORT_DIPLOCATION("S5:2")
+ PORT_DIPSETTING(0x02, DEF_STR(Off))
+ PORT_DIPSETTING(0x00, DEF_STR(On))
+ PORT_DIPNAME(0x1c, 0x14, "Printer Port") PORT_DIPLOCATION("S5:3,4,5")
+ PORT_DIPSETTING(0x00, "7 DB, EP, 2 SB")
+ PORT_DIPSETTING(0x04, "7 DB, OP, 2 SB")
+ PORT_DIPSETTING(0x08, "7 DB, EP, 1 SB")
+ PORT_DIPSETTING(0x0c, "7 DB, OP, 1 SB")
+ PORT_DIPSETTING(0x10, "8 DB, NP, 2 SB")
+ PORT_DIPSETTING(0x14, "8 DB, NP, 1 SB")
+ PORT_DIPSETTING(0x18, "8 DB, EP, 1 SB")
+ PORT_DIPSETTING(0x00, "8 DB, OP, 1 SB")
+ PORT_DIPNAME(0x20, 0x00, DEF_STR(Unused)) PORT_DIPLOCATION("S5:6")
+ PORT_DIPSETTING(0x20, DEF_STR(Off))
+ PORT_DIPSETTING(0x00, DEF_STR(On))
+ PORT_DIPNAME(0x40, 0x00, DEF_STR(Unused)) PORT_DIPLOCATION("S5:7")
+ PORT_DIPSETTING(0x40, DEF_STR(Off))
+ PORT_DIPSETTING(0x00, DEF_STR(On))
+ PORT_DIPNAME(0x80, 0x00, "Printer Port Buffer") PORT_DIPLOCATION("S5:8")
+ PORT_DIPSETTING(0x80, "Disable")
+ PORT_DIPSETTING(0x00, "Enable")
+
+ PORT_START("S6")
+ PORT_DIPNAME(0x7f, 0x00, "Polling Address") PORT_DIPLOCATION("S6:1,2,3,4,5,6,7")
+ PORT_DIPSETTING(0x00, "00")
+ PORT_DIPSETTING(0x01, "01")
+ PORT_DIPSETTING(0x02, "02")
+ PORT_DIPSETTING(0x03, "03")
+ PORT_DIPSETTING(0x04, "04")
+ PORT_DIPSETTING(0x05, "05")
+ PORT_DIPSETTING(0x06, "06")
+ PORT_DIPSETTING(0x07, "07")
+ PORT_DIPSETTING(0x08, "08")
+ PORT_DIPSETTING(0x09, "09")
+ PORT_DIPSETTING(0x0a, "0A")
+ PORT_DIPSETTING(0x0b, "0B")
+ PORT_DIPSETTING(0x0c, "0C")
+ PORT_DIPSETTING(0x0d, "0D")
+ PORT_DIPSETTING(0x0e, "0E")
+ PORT_DIPSETTING(0x0f, "0F")
+ PORT_DIPSETTING(0x10, "10")
+ PORT_DIPSETTING(0x11, "11")
+ PORT_DIPSETTING(0x12, "12")
+ PORT_DIPSETTING(0x13, "13")
+ PORT_DIPSETTING(0x14, "14")
+ PORT_DIPSETTING(0x15, "15")
+ PORT_DIPSETTING(0x16, "16")
+ PORT_DIPSETTING(0x17, "17")
+ PORT_DIPSETTING(0x18, "18")
+ PORT_DIPSETTING(0x19, "19")
+ PORT_DIPSETTING(0x1a, "1A")
+ PORT_DIPSETTING(0x1b, "1B")
+ PORT_DIPSETTING(0x1c, "1C")
+ PORT_DIPSETTING(0x1d, "1D")
+ PORT_DIPSETTING(0x1e, "1E")
+ PORT_DIPSETTING(0x1f, "1F")
+ PORT_DIPSETTING(0x20, "20")
+ PORT_DIPSETTING(0x21, "21")
+ PORT_DIPSETTING(0x22, "22")
+ PORT_DIPSETTING(0x23, "23")
+ PORT_DIPSETTING(0x24, "24")
+ PORT_DIPSETTING(0x25, "25")
+ PORT_DIPSETTING(0x26, "26")
+ PORT_DIPSETTING(0x27, "27")
+ PORT_DIPSETTING(0x28, "28")
+ PORT_DIPSETTING(0x29, "29")
+ PORT_DIPSETTING(0x2a, "2A")
+ PORT_DIPSETTING(0x2b, "2B")
+ PORT_DIPSETTING(0x2c, "2C")
+ PORT_DIPSETTING(0x2d, "2D")
+ PORT_DIPSETTING(0x2e, "2E")
+ PORT_DIPSETTING(0x2f, "2F")
+ PORT_DIPSETTING(0x30, "30")
+ PORT_DIPSETTING(0x31, "31")
+ PORT_DIPSETTING(0x32, "32")
+ PORT_DIPSETTING(0x33, "33")
+ PORT_DIPSETTING(0x34, "34")
+ PORT_DIPSETTING(0x35, "35")
+ PORT_DIPSETTING(0x36, "36")
+ PORT_DIPSETTING(0x37, "37")
+ PORT_DIPSETTING(0x38, "38")
+ PORT_DIPSETTING(0x39, "39")
+ PORT_DIPSETTING(0x3a, "3A")
+ PORT_DIPSETTING(0x3b, "3B")
+ PORT_DIPSETTING(0x3c, "3C")
+ PORT_DIPSETTING(0x3d, "3D")
+ PORT_DIPSETTING(0x3e, "3E")
+ PORT_DIPSETTING(0x3f, "3F")
+ PORT_DIPSETTING(0x40, "40")
+ PORT_DIPSETTING(0x41, "41")
+ PORT_DIPSETTING(0x42, "42")
+ PORT_DIPSETTING(0x43, "43")
+ PORT_DIPSETTING(0x44, "44")
+ PORT_DIPSETTING(0x45, "45")
+ PORT_DIPSETTING(0x46, "46")
+ PORT_DIPSETTING(0x47, "47")
+ PORT_DIPSETTING(0x48, "48")
+ PORT_DIPSETTING(0x49, "49")
+ PORT_DIPSETTING(0x4a, "4A")
+ PORT_DIPSETTING(0x4b, "4B")
+ PORT_DIPSETTING(0x4c, "4C")
+ PORT_DIPSETTING(0x4d, "4D")
+ PORT_DIPSETTING(0x4e, "4E")
+ PORT_DIPSETTING(0x4f, "4F")
+ PORT_DIPSETTING(0x50, "50")
+ PORT_DIPSETTING(0x51, "51")
+ PORT_DIPSETTING(0x52, "52")
+ PORT_DIPSETTING(0x53, "53")
+ PORT_DIPSETTING(0x54, "54")
+ PORT_DIPSETTING(0x55, "55")
+ PORT_DIPSETTING(0x56, "56")
+ PORT_DIPSETTING(0x57, "57")
+ PORT_DIPSETTING(0x58, "58")
+ PORT_DIPSETTING(0x59, "59")
+ PORT_DIPSETTING(0x5a, "5A")
+ PORT_DIPSETTING(0x5b, "5B")
+ PORT_DIPSETTING(0x5c, "5C")
+ PORT_DIPSETTING(0x5d, "5D")
+ PORT_DIPSETTING(0x5e, "5E")
+ PORT_DIPSETTING(0x5f, "5F")
+ PORT_DIPSETTING(0x60, "60")
+ PORT_DIPSETTING(0x61, "61")
+ PORT_DIPSETTING(0x62, "62")
+ PORT_DIPSETTING(0x63, "63")
+ PORT_DIPSETTING(0x64, "64")
+ PORT_DIPSETTING(0x65, "65")
+ PORT_DIPSETTING(0x66, "66")
+ PORT_DIPSETTING(0x67, "67")
+ PORT_DIPSETTING(0x68, "68")
+ PORT_DIPSETTING(0x69, "69")
+ PORT_DIPSETTING(0x6a, "6A")
+ PORT_DIPSETTING(0x6b, "6B")
+ PORT_DIPSETTING(0x6c, "6C")
+ PORT_DIPSETTING(0x6d, "6D")
+ PORT_DIPSETTING(0x6e, "6E")
+ PORT_DIPSETTING(0x6f, "6F")
+ PORT_DIPSETTING(0x70, "70")
+ PORT_DIPSETTING(0x71, "71")
+ PORT_DIPSETTING(0x72, "72")
+ PORT_DIPSETTING(0x73, "73")
+ PORT_DIPSETTING(0x74, "74")
+ PORT_DIPSETTING(0x75, "75")
+ PORT_DIPSETTING(0x76, "76")
+ PORT_DIPSETTING(0x77, "77")
+ PORT_DIPSETTING(0x78, "78")
+ PORT_DIPSETTING(0x79, "79")
+ PORT_DIPSETTING(0x7a, "7A")
+ PORT_DIPSETTING(0x7b, "7B")
+ PORT_DIPSETTING(0x7c, "7C")
+ PORT_DIPSETTING(0x7d, "7D")
+ PORT_DIPSETTING(0x7e, "7E")
+ PORT_DIPSETTING(0x7f, "7F")
+ PORT_DIPNAME(0x80, 0x80, "Polling Option") PORT_DIPLOCATION("S6:8")
+ PORT_DIPSETTING(0x80, "Disable")
+ PORT_DIPSETTING(0x00, "Enable")
+
+ PORT_START("BAUD")
+ PORT_DIPNAME(0x0f, 0x0e, "Modem Baud Rate") PORT_DIPLOCATION("BS1:1,2,3,4")
+ PORT_DIPSETTING(0x00, "50")
+ PORT_DIPSETTING(0x01, "75")
+ PORT_DIPSETTING(0x02, "110")
+ PORT_DIPSETTING(0x03, "134.5")
+ PORT_DIPSETTING(0x04, "150")
+ PORT_DIPSETTING(0x05, "300")
+ PORT_DIPSETTING(0x06, "600")
+ PORT_DIPSETTING(0x07, "1200")
+ PORT_DIPSETTING(0x08, "1800")
+ PORT_DIPSETTING(0x09, "2000")
+ PORT_DIPSETTING(0x0a, "2400")
+ PORT_DIPSETTING(0x0b, "3600")
+ PORT_DIPSETTING(0x0c, "4800")
+ PORT_DIPSETTING(0x0d, "7200")
+ PORT_DIPSETTING(0x0e, "9600")
+ PORT_DIPNAME(0xf0, 0x70, "Printer Baud Rate") PORT_DIPLOCATION("BS2:1,2,3,4")
+ PORT_DIPSETTING(0x00, "50")
+ PORT_DIPSETTING(0x10, "75")
+ PORT_DIPSETTING(0x20, "110")
+ PORT_DIPSETTING(0x30, "134.5")
+ PORT_DIPSETTING(0x40, "150")
+ PORT_DIPSETTING(0x50, "300")
+ PORT_DIPSETTING(0x60, "600")
+ PORT_DIPSETTING(0x70, "1200")
+ PORT_DIPSETTING(0x80, "1800")
+ PORT_DIPSETTING(0x90, "2000")
+ PORT_DIPSETTING(0xa0, "2400")
+ PORT_DIPSETTING(0xb0, "3600")
+ PORT_DIPSETTING(0xc0, "4800")
+ PORT_DIPSETTING(0xd0, "7200")
+ PORT_DIPSETTING(0xe0, "9600")
+INPUT_PORTS_END
+
+void adm31_state::adm31(machine_config &config)
+{
+ M6800(config, m_maincpu, 19.584_MHz_XTAL / 20);
+ m_maincpu->set_addrmap(AS_PROGRAM, &adm31_state::mem_map);
+
+ INPUT_MERGER_ANY_HIGH(config, "mainirq").output_handler().set_inputline(m_maincpu, M6800_IRQ_LINE);
+
+ pia6821_device &pia(PIA6821(config, "pia"));
+ pia.writepa_handler().set(FUNC(adm31_state::kbd_scan_w));
+ pia.readpa_handler().set(FUNC(adm31_state::kbd_scan_r));
+ pia.writepb_handler().set(FUNC(adm31_state::kbd_status_w));
+ pia.readpb_handler().set_ioport("SHIFT");
+
+ ACIA6850(config, m_acia[0]);
+ m_acia[0]->irq_handler().set("mainirq", FUNC(input_merger_device::in_w<0>));
+
+ ACIA6850(config, m_acia[1]);
+ m_acia[0]->irq_handler().set("mainirq", FUNC(input_merger_device::in_w<1>));
+
+ COM8116(config, m_brg, 5.0688_MHz_XTAL);
+ m_brg->fr_handler().set(m_acia[0], FUNC(acia6850_device::write_rxc));
+ m_brg->fr_handler().append(m_acia[0], FUNC(acia6850_device::write_txc));
+ m_brg->ft_handler().set(m_acia[1], FUNC(acia6850_device::write_rxc));
+ m_brg->ft_handler().append(m_acia[1], FUNC(acia6850_device::write_txc));
+
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_raw(19.584_MHz_XTAL, 1020, 0, 800, 320, 0, 288);
+ screen.set_screen_update(FUNC(adm31_state::screen_update));
+
+ CRT5027(config, m_vtac, 19.584_MHz_XTAL / 10);
+ m_vtac->set_screen("screen");
+ m_vtac->set_char_width(10);
+}
+
+
+ROM_START(adm31)
+ ROM_REGION(0x2000, "program", 0)
+ ROM_LOAD("adm-31-u62.bin", 0x0000, 0x0800, CRC(57e557a5) SHA1(cb3021ab570c279cbaa673b5de8fa1ca9eb48188))
+ ROM_LOAD("adm-31-u63.bin", 0x0800, 0x0800, CRC(1268a59c) SHA1(f0cd8562e0d5faebf84d8decaa848ff28f2ac637))
+ ROM_LOAD("adm-31-u64.bin", 0x1000, 0x0800, CRC(8939fa00) SHA1(00f6a8a49e51a9501cd9d1e2aae366fb070a5a1d))
+ ROM_LOAD("adm-31-u65.bin", 0x1800, 0x0800, CRC(53e4e2f1) SHA1(bf30241815c790de3354e1acfe84e760c889cbb1))
+
+ ROM_REGION(0x0800, "chargen", 0)
+ ROM_LOAD("chargen.bin", 0x0000, 0x0800, NO_DUMP)
+ROM_END
+
+
+COMP(1978, adm31, 0, 0, adm31, adm31, adm31_state, empty_init, "Lear Siegler", "ADM-31 Data Display Terminal", MACHINE_IS_SKELETON)
diff --git a/src/mame/drivers/adm36.cpp b/src/mame/drivers/adm36.cpp
new file mode 100644
index 00000000000..2298543b7eb
--- /dev/null
+++ b/src/mame/drivers/adm36.cpp
@@ -0,0 +1,202 @@
+// license:BSD-3-Clause
+// copyright-holders:Robbbert,AJR
+/************************************************************************************************************
+
+ Skeleton driver for ADM 36 Video Display Terminal.
+
+ The detachable keyboard has not been dumped. It is controlled serially through the PIO.
+
+************************************************************************************************************/
+
+#include "emu.h"
+#include "bus/rs232/rs232.h"
+#include "cpu/z80/z80.h"
+#include "machine/er1400.h"
+#include "machine/z80ctc.h"
+#include "machine/z80pio.h"
+#include "machine/z80sio.h"
+#include "video/tms9927.h"
+#include "screen.h"
+
+
+class adm36_state : public driver_device
+{
+public:
+ adm36_state(const machine_config &mconfig, device_type type, const char *tag)
+ : driver_device(mconfig, type, tag)
+ , m_maincpu(*this, "maincpu")
+ , m_earom(*this, "earom")
+ , m_vtac(*this, "vtac")
+ , m_chargen(*this, "chargen")
+ , m_vram(*this, "vram%u", 0U)
+ {
+ }
+
+ void adm36(machine_config &config);
+
+protected:
+ virtual void machine_start() override;
+ virtual void machine_reset() override;
+
+private:
+ u32 screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
+
+ void pio_pa_w(u8 data);
+ u8 pio_pb_r();
+ void pio_pb_w(u8 data);
+ DECLARE_WRITE_LINE_MEMBER(vsyn_w);
+
+ void mem_map(address_map &map);
+ void io_map(address_map &map);
+
+ required_device<z80_device> m_maincpu;
+ required_device<er1400_device> m_earom;
+ required_device<crt5037_device> m_vtac;
+ required_region_ptr<u8> m_chargen;
+ required_shared_ptr_array<u8, 2> m_vram;
+
+ bool m_vsyn;
+};
+
+
+u32 adm36_state::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect)
+{
+ return 0;
+}
+
+void adm36_state::machine_start()
+{
+ m_vsyn = false;
+
+ save_item(NAME(m_vsyn));
+}
+
+void adm36_state::machine_reset()
+{
+}
+
+void adm36_state::pio_pa_w(u8 data)
+{
+ m_earom->data_w(BIT(data, 0));
+}
+
+u8 adm36_state::pio_pb_r()
+{
+ return (m_earom->data_r() ? 0 : 1) | (m_vsyn ? 0x20 : 0);
+}
+
+void adm36_state::pio_pb_w(u8 data)
+{
+ m_earom->clock_w(!BIT(data, 4));
+ m_earom->c3_w(BIT(data, 3));
+ m_earom->c2_w(BIT(data, 2));
+ m_earom->c1_w(BIT(data, 1));
+}
+
+WRITE_LINE_MEMBER(adm36_state::vsyn_w)
+{
+ m_vsyn = bool(state);
+}
+
+void adm36_state::mem_map(address_map &map)
+{
+ map(0x0000, 0x2fff).rom().region("maincpu", 0);
+ map(0x6000, 0x67ff).ram(); // MK4802J-3 (U76)
+ map(0xe000, 0xefff).ram().share("vram0"); // 4x MK4118AN-1 (U66-U69)
+ map(0xf000, 0xffff).ram().share("vram1"); // 4x MK4118AN-1 (U81-U84)
+}
+
+void adm36_state::io_map(address_map &map)
+{
+ map.global_mask(0xff);
+ map(0x00, 0x03).mirror(0x0c).rw("ctc", FUNC(z80ctc_device::read), FUNC(z80ctc_device::write));
+ map(0x10, 0x13).mirror(0x0c).rw("sio", FUNC(z80sio_device::cd_ba_r), FUNC(z80sio_device::cd_ba_w));
+ map(0x20, 0x23).mirror(0x0c).rw("pio", FUNC(z80pio_device::read), FUNC(z80pio_device::write));
+ map(0x40, 0x4f).rw(m_vtac, FUNC(crt5037_device::read), FUNC(crt5037_device::write));
+}
+
+
+static INPUT_PORTS_START(adm36)
+INPUT_PORTS_END
+
+
+static const z80_daisy_config daisy_chain[] =
+{
+ { "ctc" },
+ { "sio" },
+ { "pio" },
+ { nullptr }
+};
+
+void adm36_state::adm36(machine_config &config)
+{
+ // basic machine hardware
+ Z80(config, m_maincpu, 14.728_MHz_XTAL / 6);
+ m_maincpu->set_addrmap(AS_PROGRAM, &adm36_state::mem_map);
+ m_maincpu->set_addrmap(AS_IO, &adm36_state::io_map);
+ m_maincpu->set_daisy_config(daisy_chain);
+
+ z80pio_device &pio(Z80PIO(config, "pio", 14.728_MHz_XTAL / 6));
+ pio.out_int_callback().set_inputline(m_maincpu, INPUT_LINE_IRQ0);
+ pio.out_pa_callback().set(FUNC(adm36_state::pio_pa_w));
+ pio.in_pb_callback().set(FUNC(adm36_state::pio_pb_r));
+ pio.out_pb_callback().set(FUNC(adm36_state::pio_pb_w));
+
+ ER1400(config, m_earom);
+
+ //F3870(config, "keybcpu", 3.579545_MHz_XTAL);
+
+ z80ctc_device &ctc(Z80CTC(config, "ctc", 14.728_MHz_XTAL / 6));
+ ctc.intr_callback().set_inputline(m_maincpu, INPUT_LINE_IRQ0);
+ ctc.set_clk<0>(14.728_MHz_XTAL / 12);
+ ctc.set_clk<1>(14.728_MHz_XTAL / 12);
+ ctc.set_clk<2>(14.728_MHz_XTAL / 12);
+ ctc.set_clk<3>(14.728_MHz_XTAL / 12);
+ ctc.zc_callback<0>().set("sio", FUNC(z80sio_device::txca_w));
+ ctc.zc_callback<1>().set("sio", FUNC(z80sio_device::rxca_w));
+ ctc.zc_callback<2>().set("sio", FUNC(z80sio_device::txcb_w));
+ ctc.zc_callback<2>().append("sio", FUNC(z80sio_device::rxcb_w));
+
+ z80sio_device &sio(Z80SIO(config, "sio", 14.728_MHz_XTAL / 6)); // MK3887N
+ sio.out_int_callback().set_inputline(m_maincpu, INPUT_LINE_IRQ0);
+ sio.out_txda_callback().set("modem", FUNC(rs232_port_device::write_txd));
+ sio.out_rtsa_callback().set("modem", FUNC(rs232_port_device::write_rts));
+ sio.out_dtra_callback().set("modem", FUNC(rs232_port_device::write_dtr));
+ sio.out_txdb_callback().set("printer", FUNC(rs232_port_device::write_txd));
+ sio.out_dtrb_callback().set("printer", FUNC(rs232_port_device::write_rts));
+
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_raw(14.728_MHz_XTAL, 936, 0, 720, 262, 0, 240);
+ //screen.set_raw(24.3_MHz_XTAL, 1548, 0, 1188, 262, 0, 240);
+ screen.set_screen_update(FUNC(adm36_state::screen_update));
+
+ CRT5037(config, m_vtac, 14.728_MHz_XTAL / 9);
+ m_vtac->set_char_width(9);
+ m_vtac->set_screen("screen");
+ m_vtac->vsyn_callback().set(FUNC(adm36_state::vsyn_w));
+
+ rs232_port_device &modem(RS232_PORT(config, "modem", default_rs232_devices, nullptr)); // RS-232C, RS-422A or 20mA current loop
+ modem.rxd_handler().set("sio", FUNC(z80sio_device::rxa_w));
+ modem.cts_handler().set("sio", FUNC(z80sio_device::ctsa_w));
+ modem.dcd_handler().set("sio", FUNC(z80sio_device::dcda_w));
+ modem.dsr_handler().set("pio", FUNC(z80pio_device::pb6_w));
+
+ rs232_port_device &printer(RS232_PORT(config, "printer", default_rs232_devices, nullptr));
+ printer.rxd_handler().set("sio", FUNC(z80sio_device::rxb_w));
+ printer.cts_handler().set("sio", FUNC(z80sio_device::ctsa_w));
+ printer.dcd_handler().set("sio", FUNC(z80sio_device::dcda_w));
+}
+
+
+ROM_START(adm36)
+ ROM_REGION(0x3000, "maincpu", 0)
+ ROM_LOAD("u71_136261-012.bin", 0x0000, 0x2000, CRC(f08315c7) SHA1(3943a5fc587e690df81aa9694e6e452673ec5513))
+ ROM_LOAD("u72_131671-015.bin", 0x2000, 0x1000, CRC(c397f4e2) SHA1(21513472fe4237bda8448a2ad85496757d4ece12))
+ // U73-U75 are empty sockets
+
+ ROM_REGION(0x1000, "chargen", 0)
+ ROM_LOAD("u56.bin", 0x0000, 0x1000, CRC(70e46897) SHA1(85b4360912fc05243b3b2df29bde5a3def94086b))
+ROM_END
+
+
+COMP(1981, adm36, 0, 0, adm36, adm36, adm36_state, empty_init, "Lear Siegler", "ADM 36 Video Display Terminal", MACHINE_IS_SKELETON)
diff --git a/src/mame/drivers/adp.cpp b/src/mame/drivers/adp.cpp
index 0c5317b7b0f..50200fc0a47 100644
--- a/src/mame/drivers/adp.cpp
+++ b/src/mame/drivers/adp.cpp
@@ -540,34 +540,34 @@ void adp_state::fstation_hd63484_map(address_map &map)
map(0x80000, 0xfffff).ram();
}
-MACHINE_CONFIG_START(adp_state::quickjac)
-
- MCFG_DEVICE_ADD(m_maincpu, M68000, 8000000)
- MCFG_DEVICE_PROGRAM_MAP(quickjac_mem)
- MCFG_DEVICE_IRQ_ACKNOWLEDGE_DRIVER(adp_state, duart_iack_handler)
+void adp_state::quickjac(machine_config &config)
+{
+ M68000(config, m_maincpu, 8000000);
+ m_maincpu->set_addrmap(AS_PROGRAM, &adp_state::quickjac_mem);
+ m_maincpu->set_irq_acknowledge_callback(FUNC(adp_state::duart_iack_handler));
MCFG_MACHINE_START_OVERRIDE(adp_state,skattv)
MCFG_MACHINE_RESET_OVERRIDE(adp_state,skattv)
- MCFG_DEVICE_ADD( "duart", MC68681, XTAL(8'664'000) / 2 )
- MCFG_MC68681_IRQ_CALLBACK(INPUTLINE("maincpu", M68K_IRQ_4))
- MCFG_MC68681_A_TX_CALLBACK(WRITELINE("microtouch", microtouch_device, rx))
- MCFG_MC68681_INPORT_CALLBACK(IOPORT("DSW1"))
+ MC68681(config, m_duart, XTAL(8'664'000) / 2);
+ m_duart->irq_cb().set_inputline(m_maincpu, M68K_IRQ_4);
+ m_duart->a_tx_cb().set(m_microtouch, FUNC(microtouch_device::rx));
+ m_duart->inport_cb().set_ioport("DSW1");
- MCFG_MICROTOUCH_ADD( "microtouch", 9600, WRITELINE("duart", mc68681_device, rx_a_w) )
+ MICROTOUCH(config, m_microtouch, 9600).stx().set(m_duart, FUNC(mc68681_device::rx_a_w));
NVRAM(config, m_nvram, nvram_device::DEFAULT_NONE);
- MCFG_DEVICE_ADD("rtc", MSM6242, XTAL(32'768))
- //MCFG_MSM6242_OUT_INT_HANDLER(WRITELINE(*this, adp_state, rtc_irq))
+ MSM6242(config, "rtc", XTAL(32'768));
+ //rtc.out_int_handler().set(FUNC(adp_state::rtc_irq));
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500))
- MCFG_SCREEN_SIZE(384, 280)
- MCFG_SCREEN_VISIBLE_AREA(0, 384-1, 0, 280-1)
- MCFG_SCREEN_UPDATE_DEVICE("acrtc", hd63484_device, update_screen)
- MCFG_SCREEN_PALETTE(m_palette)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500));
+ screen.set_size(384, 280);
+ screen.set_visarea_full();
+ screen.set_screen_update("acrtc", FUNC(hd63484_device::update_screen));
+ screen.set_palette(m_palette);
PALETTE(config, m_palette, FUNC(adp_state::adp_palette), 0x10);
@@ -577,8 +577,7 @@ MACHINE_CONFIG_START(adp_state::quickjac)
ym2149_device &aysnd(YM2149(config, "aysnd", 3686400/2));
aysnd.port_a_read_callback().set_ioport("PA");
aysnd.add_route(ALL_OUTPUTS, "mono", 0.10);
-
-MACHINE_CONFIG_END
+}
void adp_state::skattv(machine_config &config)
{
@@ -604,32 +603,31 @@ void adp_state::ramdac_map(address_map &map)
map(0x000, 0x3ff).rw("ramdac", FUNC(ramdac_device::ramdac_pal_r), FUNC(ramdac_device::ramdac_rgb666_w));
}
-MACHINE_CONFIG_START(adp_state::funland)
+void adp_state::funland(machine_config &config)
+{
quickjac(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(funland_mem)
+ m_maincpu->set_addrmap(AS_PROGRAM, &adp_state::funland_mem);
PALETTE(config.replace(), m_palette, palette_device::BLACK, 0x100);
ramdac_device &ramdac(RAMDAC(config, "ramdac", 0, m_palette));
ramdac.set_addrmap(0, &adp_state::ramdac_map);
- MCFG_DEVICE_MODIFY("acrtc")
- MCFG_HD63484_ADDRESS_MAP(fstation_hd63484_map)
-MACHINE_CONFIG_END
+ m_acrtc->set_addrmap(0, &adp_state::fstation_hd63484_map);
+}
-MACHINE_CONFIG_START(adp_state::fstation)
+void adp_state::fstation(machine_config &config)
+{
funland(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(fstation_mem)
+ m_maincpu->set_addrmap(AS_PROGRAM, &adp_state::fstation_mem);
- MCFG_SCREEN_MODIFY("screen")
- MCFG_SCREEN_SIZE(640, 480)
- MCFG_SCREEN_VISIBLE_AREA(0, 640-1, 0, 480-1)
+ screen_device &screen(*subdevice<screen_device>("screen"));
+ screen.set_size(640, 480);
+ screen.set_visarea_full();
m_palette->set_init(FUNC(adp_state::fstation_palette));
-MACHINE_CONFIG_END
+}
ROM_START( quickjac )
diff --git a/src/mame/drivers/advision.cpp b/src/mame/drivers/advision.cpp
index a2a4498e31f..ca9c168cbe9 100644
--- a/src/mame/drivers/advision.cpp
+++ b/src/mame/drivers/advision.cpp
@@ -31,7 +31,7 @@
READ8_MEMBER( advision_state::rom_r )
{
offset += 0x400;
- return m_cart->read_rom(space, offset & 0xfff);
+ return m_cart->read_rom(offset & 0xfff);
}
void advision_state::program_map(address_map &map)
@@ -93,7 +93,6 @@ void advision_state::advision(machine_config &config)
SPEAKER(config, "speaker").front_center();
DAC_2BIT_BINARY_WEIGHTED(config, m_dac, 0).add_route(ALL_OUTPUTS, "speaker", 0.25); // unknown DAC
voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref", 0));
- vref.set_output(5.0);
vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT);
vref.add_route(0, "dac", -1.0, DAC_VREF_NEG_INPUT);
diff --git a/src/mame/drivers/aeroboto.cpp b/src/mame/drivers/aeroboto.cpp
index 45a7daa8de6..9ec149faaa6 100644
--- a/src/mame/drivers/aeroboto.cpp
+++ b/src/mame/drivers/aeroboto.cpp
@@ -244,26 +244,26 @@ void aeroboto_state::machine_reset()
m_sy = 0;
}
-MACHINE_CONFIG_START(aeroboto_state::formatz)
-
+void aeroboto_state::formatz(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", MC6809, XTAL(10'000'000)/2) /* verified on pcb */
- MCFG_DEVICE_PROGRAM_MAP(main_map)
+ MC6809(config, m_maincpu, XTAL(10'000'000)/2); /* verified on pcb */
+ m_maincpu->set_addrmap(AS_PROGRAM, &aeroboto_state::main_map);
- MCFG_DEVICE_ADD("audiocpu", MC6809, XTAL(10'000'000)/4) /* verified on pcb */
- MCFG_DEVICE_PROGRAM_MAP(sound_map)
+ MC6809(config, m_audiocpu, XTAL(10'000'000)/4); /* verified on pcb */
+ m_audiocpu->set_addrmap(AS_PROGRAM, &aeroboto_state::sound_map);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(32*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 31*8-1, 2*8, 30*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(aeroboto_state, screen_update_aeroboto)
- MCFG_SCREEN_PALETTE("palette")
- MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE(*this, aeroboto_state, vblank_irq))
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(32*8, 32*8);
+ screen.set_visarea(0*8, 31*8-1, 2*8, 30*8-1);
+ screen.set_screen_update(FUNC(aeroboto_state::screen_update_aeroboto));
+ screen.set_palette(m_palette);
+ screen.screen_vblank().set(FUNC(aeroboto_state::vblank_irq));
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_aeroboto)
+ GFXDECODE(config, m_gfxdecode, m_palette, gfx_aeroboto);
PALETTE(config, m_palette, palette_device::RGB_444_PROMS, "proms", 256);
@@ -279,7 +279,7 @@ MACHINE_CONFIG_START(aeroboto_state::formatz)
ay1.add_route(ALL_OUTPUTS, "mono", 0.25);
AY8910(config, "ay2", XTAL(10'000'000)/16).add_route(ALL_OUTPUTS, "mono", 0.25); /* verified on pcb */
-MACHINE_CONFIG_END
+}
diff --git a/src/mame/drivers/aerofgt.cpp b/src/mame/drivers/aerofgt.cpp
index 62e85461888..0639b91322b 100644
--- a/src/mame/drivers/aerofgt.cpp
+++ b/src/mame/drivers/aerofgt.cpp
@@ -1861,7 +1861,7 @@ void aerofgt_state::turbofrc(machine_config &config)
/* video hardware */
screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
- screen.set_refresh_hz(61.31); /* verified on pcb */
+ screen.set_refresh_hz(61.31); /* verified on pcb */
screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
screen.set_size(64*8, 32*8);
screen.set_visarea(0*8, 44*8-1, 0*8, 30*8-1);
diff --git a/src/mame/drivers/agat.cpp b/src/mame/drivers/agat.cpp
index a0560a020af..b0d8cb1b2f8 100644
--- a/src/mame/drivers/agat.cpp
+++ b/src/mame/drivers/agat.cpp
@@ -1076,21 +1076,21 @@ static void agat7_cards(device_slot_interface &device)
// Nippel Co-processor (R65C02 clone + dual-ported RAM)
}
-MACHINE_CONFIG_START(agat7_state::agat7)
- MCFG_DEVICE_ADD(m_maincpu, M6502, XTAL(14'300'000) / 14)
- MCFG_DEVICE_PROGRAM_MAP(agat7_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER(A7_VIDEO_TAG ":a7screen", agat7_state, agat_vblank)
+void agat7_state::agat7(machine_config &config)
+{
+ M6502(config, m_maincpu, XTAL(14'300'000) / 14);
+ m_maincpu->set_addrmap(AS_PROGRAM, &agat7_state::agat7_map);
+ m_maincpu->set_vblank_int(A7_VIDEO_TAG ":a7screen", FUNC(agat7_state::agat_vblank));
- MCFG_TIMER_DRIVER_ADD_SCANLINE("scantimer", agat7_state, timer_irq, A7_VIDEO_TAG ":a7screen", 0, 1)
+ TIMER(config, "scantimer").configure_scanline(FUNC(agat7_state::timer_irq), A7_VIDEO_TAG ":a7screen", 0, 1);
- MCFG_DEVICE_ADD(m_video, AGAT7VIDEO, RAM_TAG, "gfx1")
+ AGAT7VIDEO(config, m_video, RAM_TAG, "gfx1");
RAM(config, m_ram).set_default_size("32K").set_default_value(0);//.set_extra_options("64K,128K");
/* sound hardware */
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD(A7_SPEAKER_TAG, SPEAKER_SOUND)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.00)
+ SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 1.00);
/* /INH banking */
ADDRESS_MAP_BANK(config, m_upperbank).set_map(&agat7_state::inhbank_map).set_options(ENDIANNESS_LITTLE, 8, 32, 0x3000);
@@ -1112,26 +1112,27 @@ MACHINE_CONFIG_START(agat7_state::agat7)
m_ay3600->ako().set(FUNC(agat7_state::ay3600_ako_w));
/* repeat timer. 10 Hz per Mymrin's book */
- MCFG_TIMER_DRIVER_ADD_PERIODIC("repttmr", agat7_state, ay3600_repeat, attotime::from_hz(10))
+ TIMER(config, "repttmr").configure_periodic(FUNC(agat7_state::ay3600_repeat), attotime::from_hz(10));
/*
* slot 0 is reserved for SECAM encoder or Apple II compat card.
* slot 1 always holds the CPU card.
*/
- MCFG_DEVICE_ADD(m_a2bus, A2BUS, 0)
- MCFG_A2BUS_CPU(A7_CPU_TAG)
- MCFG_A2BUS_OUT_IRQ_CB(WRITELINE(*this, agat7_state, a2bus_irq_w))
- MCFG_A2BUS_OUT_NMI_CB(WRITELINE(*this, agat7_state, a2bus_nmi_w))
- MCFG_A2BUS_OUT_INH_CB(WRITELINE(*this, agat7_state, a2bus_inh_w))
+ A2BUS(config, m_a2bus, 0);
+ m_a2bus->set_space(m_maincpu, AS_PROGRAM);
+ m_a2bus->irq_w().set(FUNC(agat7_state::a2bus_irq_w));
+ m_a2bus->nmi_w().set(FUNC(agat7_state::a2bus_nmi_w));
+ m_a2bus->inh_w().set(FUNC(agat7_state::a2bus_inh_w));
+ m_a2bus->dma_w().set_inputline(m_maincpu, INPUT_LINE_HALT);
A2BUS_SLOT(config, "sl2", m_a2bus, agat7_cards, "a7lang");
A2BUS_SLOT(config, "sl3", m_a2bus, agat7_cards, "a7fdc");
A2BUS_SLOT(config, "sl4", m_a2bus, agat7_cards, "a7ports");
A2BUS_SLOT(config, "sl5", m_a2bus, agat7_cards, nullptr);
A2BUS_SLOT(config, "sl6", m_a2bus, agat7_cards, "a7ram");
- MCFG_CASSETTE_ADD(m_cassette)
- MCFG_CASSETTE_DEFAULT_STATE(CASSETTE_STOPPED)
-MACHINE_CONFIG_END
+ CASSETTE(config,m_cassette);
+ m_cassette->set_default_state(CASSETTE_STOPPED);
+}
/***************************************************************************
diff --git a/src/mame/drivers/age_candy.cpp b/src/mame/drivers/age_candy.cpp
index 331a421c7f7..49c55908dd8 100644
--- a/src/mame/drivers/age_candy.cpp
+++ b/src/mame/drivers/age_candy.cpp
@@ -13,6 +13,7 @@ Device is a 27c256 location U3
*/
#include "emu.h"
+#include "cpu/hpc/hpc.h"
#include "speaker.h"
@@ -21,7 +22,7 @@ class age_candy_state : public driver_device
public:
age_candy_state(const machine_config &mconfig, device_type type, const char *tag)
: driver_device(mconfig, type, tag)
- // ,m_maincpu(*this, "maincpu")
+ , m_maincpu(*this, "maincpu")
{ }
void age_candy(machine_config &config);
@@ -31,7 +32,7 @@ private:
virtual void machine_reset() override;
void age_candy_map(address_map &map);
-// required_device<mcs51_cpu_device> m_maincpu;
+ required_device<hpc_device> m_maincpu;
};
static INPUT_PORTS_START( age_candy )
@@ -48,24 +49,19 @@ void age_candy_state::machine_reset()
}
-#ifdef UNUSED_DEFINITION
void age_candy_state::age_candy_map(address_map &map)
{
- map(0xc000, 0xffff).rom().region("maincpu", 0x4000);
+ map(0x8000, 0xffff).rom().region("maincpu", 0);
}
-#endif
-MACHINE_CONFIG_START(age_candy_state::age_candy)
-
- /* basic machine hardware */
-// MCFG_DEVICE_ADD("maincpu", HPC46104, 8000000) // unknown clock; HPC emulation needed
-// MCFG_DEVICE_PROGRAM_MAP(age_candy_map)
-// MCFG_DEVICE_IO_MAP(age_candy_io)
+void age_candy_state::age_candy(machine_config &config)
+{
+ HPC46104(config, m_maincpu, 16_MHz_XTAL); // HPC still not actually emulated
+ m_maincpu->set_addrmap(AS_PROGRAM, &age_candy_state::age_candy_map);
/* sound hardware */
SPEAKER(config, "mono").front_center();
-MACHINE_CONFIG_END
-
+}
ROM_START( age_cand )
diff --git a/src/mame/drivers/aim65.cpp b/src/mame/drivers/aim65.cpp
index d292923be37..dc8a1dbed81 100644
--- a/src/mame/drivers/aim65.cpp
+++ b/src/mame/drivers/aim65.cpp
@@ -188,32 +188,32 @@ image_init_result aim65_state::load_cart(device_image_interface &image, generic_
MACHINE_CONFIG_START(aim65_state::aim65)
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M6502, AIM65_CLOCK) /* 1 MHz */
- MCFG_DEVICE_PROGRAM_MAP(aim65_mem)
+ M6502(config, m_maincpu, AIM65_CLOCK); /* 1 MHz */
+ m_maincpu->set_addrmap(AS_PROGRAM, &aim65_state::aim65_mem);
config.set_default_layout(layout_aim65);
/* alpha-numeric display */
- MCFG_DEVICE_ADD("ds1", DL1416T, u32(0))
- MCFG_DL1416_UPDATE_HANDLER(WRITE16(*this, aim65_state, aim65_update_ds<1>))
- MCFG_DEVICE_ADD("ds2", DL1416T, u32(0))
- MCFG_DL1416_UPDATE_HANDLER(WRITE16(*this, aim65_state, aim65_update_ds<2>))
- MCFG_DEVICE_ADD("ds3", DL1416T, u32(0))
- MCFG_DL1416_UPDATE_HANDLER(WRITE16(*this, aim65_state, aim65_update_ds<3>))
- MCFG_DEVICE_ADD("ds4", DL1416T, u32(0))
- MCFG_DL1416_UPDATE_HANDLER(WRITE16(*this, aim65_state, aim65_update_ds<4>))
- MCFG_DEVICE_ADD("ds5", DL1416T, u32(0))
- MCFG_DL1416_UPDATE_HANDLER(WRITE16(*this, aim65_state, aim65_update_ds<5>))
+ DL1416T(config, m_ds[0], u32(0));
+ m_ds[0]->update().set(FUNC(aim65_state::aim65_update_ds<1>));
+ DL1416T(config, m_ds[1], u32(0));
+ m_ds[1]->update().set(FUNC(aim65_state::aim65_update_ds<2>));
+ DL1416T(config, m_ds[2], u32(0));
+ m_ds[2]->update().set(FUNC(aim65_state::aim65_update_ds<3>));
+ DL1416T(config, m_ds[3], u32(0));
+ m_ds[3]->update().set(FUNC(aim65_state::aim65_update_ds<4>));
+ DL1416T(config, m_ds[4], u32(0));
+ m_ds[4]->update().set(FUNC(aim65_state::aim65_update_ds<5>));
/* Sound - wave sound only */
SPEAKER(config, "mono").front_center();
- WAVE(config, "wave", "cassette").add_route(ALL_OUTPUTS, "mono", 0.25);
+ WAVE(config, "wave", m_cassette1).add_route(ALL_OUTPUTS, "mono", 0.25);
/* other devices */
- MCFG_DEVICE_ADD("riot", MOS6532_NEW, AIM65_CLOCK)
- MCFG_MOS6530n_OUT_PA_CB(WRITE8(*this, aim65_state, aim65_riot_a_w))
- MCFG_MOS6530n_IN_PB_CB(READ8(*this, aim65_state, aim65_riot_b_r))
- MCFG_MOS6530n_IRQ_CB(INPUTLINE("maincpu", M6502_IRQ_LINE))
+ mos6532_new_device &riot(MOS6532_NEW(config, "riot", AIM65_CLOCK));
+ riot.pa_wr_callback().set(FUNC(aim65_state::aim65_riot_a_w));
+ riot.pb_rd_callback().set(FUNC(aim65_state::aim65_riot_b_r));
+ riot.irq_wr_callback().set_inputline(m_maincpu, M6502_IRQ_LINE);
via6522_device &via0(VIA6522(config, "via6522_0", AIM65_CLOCK));
via0.readpb_handler().set(FUNC(aim65_state::aim65_pb_r));
@@ -232,12 +232,12 @@ MACHINE_CONFIG_START(aim65_state::aim65)
pia.writepb_handler().set(FUNC(aim65_state::aim65_pia_b_w));
// Deck 1 can play and record
- MCFG_CASSETTE_ADD( "cassette" )
- MCFG_CASSETTE_DEFAULT_STATE(CASSETTE_PLAY | CASSETTE_MOTOR_DISABLED | CASSETTE_SPEAKER_ENABLED)
+ CASSETTE(config, m_cassette1);
+ m_cassette1->set_default_state(CASSETTE_PLAY | CASSETTE_MOTOR_DISABLED | CASSETTE_SPEAKER_ENABLED);
// Deck 2 can only record
- MCFG_CASSETTE_ADD( "cassette2" )
- MCFG_CASSETTE_DEFAULT_STATE(CASSETTE_RECORD | CASSETTE_MOTOR_DISABLED | CASSETTE_SPEAKER_MUTED)
+ CASSETTE(config, m_cassette2);
+ m_cassette2->set_default_state(CASSETTE_RECORD | CASSETTE_MOTOR_DISABLED | CASSETTE_SPEAKER_MUTED);
MCFG_GENERIC_SOCKET_ADD("z26", generic_plain_slot, "aim65_z26_cart")
MCFG_GENERIC_EXTENSIONS("z26")
@@ -272,7 +272,7 @@ MACHINE_CONFIG_START(aim65_state::aim65)
RAM(config, RAM_TAG).set_default_size("4K").set_extra_options("1K,2K,3K");
/* Software lists */
- MCFG_SOFTWARE_LIST_ADD("cart_list","aim65_cart")
+ SOFTWARE_LIST(config, "cart_list").set_original("aim65_cart");
MACHINE_CONFIG_END
diff --git a/src/mame/drivers/airbustr.cpp b/src/mame/drivers/airbustr.cpp
index 88294b4bdc4..7e779e622ce 100644
--- a/src/mame/drivers/airbustr.cpp
+++ b/src/mame/drivers/airbustr.cpp
@@ -562,38 +562,38 @@ void airbustr_state::machine_reset()
/* Machine Driver */
-MACHINE_CONFIG_START(airbustr_state::airbustr)
-
+void airbustr_state::airbustr(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("master", Z80, XTAL(12'000'000)/2) /* verified on pcb */
- MCFG_DEVICE_PROGRAM_MAP(master_map)
- MCFG_DEVICE_IO_MAP(master_io_map)
- MCFG_TIMER_DRIVER_ADD_SCANLINE("scantimer", airbustr_state, airbustr_scanline, "screen", 0, 1)
-
- MCFG_DEVICE_ADD("slave", Z80, XTAL(12'000'000)/2) /* verified on pcb */
- MCFG_DEVICE_PROGRAM_MAP(slave_map)
- MCFG_DEVICE_IO_MAP(slave_io_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", airbustr_state, slave_interrupt) /* nmi signal from master cpu */
-
- MCFG_DEVICE_ADD("audiocpu", Z80, XTAL(12'000'000)/2) /* verified on pcb */
- MCFG_DEVICE_PROGRAM_MAP(sound_map)
- MCFG_DEVICE_IO_MAP(sound_io_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", airbustr_state, irq0_line_hold) // nmi are caused by sub cpu writing a sound command
-
- MCFG_QUANTUM_TIME(attotime::from_hz(6000)) // Palette RAM is filled by sub cpu with data supplied by main cpu
+ Z80(config, m_master, XTAL(12'000'000)/2); /* verified on pcb */
+ m_master->set_addrmap(AS_PROGRAM, &airbustr_state::master_map);
+ m_master->set_addrmap(AS_IO, &airbustr_state::master_io_map);
+ TIMER(config, "scantimer").configure_scanline(FUNC(airbustr_state::airbustr_scanline), "screen", 0, 1);
+
+ Z80(config, m_slave, XTAL(12'000'000)/2); /* verified on pcb */
+ m_slave->set_addrmap(AS_PROGRAM, &airbustr_state::slave_map);
+ m_slave->set_addrmap(AS_IO, &airbustr_state::slave_io_map);
+ m_slave->set_vblank_int("screen", FUNC(airbustr_state::slave_interrupt)); /* nmi signal from master cpu */
+
+ Z80(config, m_audiocpu, XTAL(12'000'000)/2); /* verified on pcb */
+ m_audiocpu->set_addrmap(AS_PROGRAM, &airbustr_state::sound_map);
+ m_audiocpu->set_addrmap(AS_IO, &airbustr_state::sound_io_map);
+ m_audiocpu->set_vblank_int("screen", FUNC(airbustr_state::irq0_line_hold)); // nmi are caused by sub cpu writing a sound command
+
+ config.m_minimum_quantum = attotime::from_hz(6000); // Palette RAM is filled by sub cpu with data supplied by main cpu
// Maybe a high value is safer in order to avoid glitches
WATCHDOG_TIMER(config, m_watchdog).set_time(attotime::from_seconds(3)); /* a guess, and certainly wrong */
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(57.4)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(32*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0, 32*8-1, 2*8, 30*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(airbustr_state, screen_update)
- MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE(*this, airbustr_state, screen_vblank))
- MCFG_SCREEN_PALETTE(m_palette)
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_refresh_hz(57.4);
+ m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ m_screen->set_size(32*8, 32*8);
+ m_screen->set_visarea(0, 32*8-1, 2*8, 30*8-1);
+ m_screen->set_screen_update(FUNC(airbustr_state::screen_update));
+ m_screen->screen_vblank().set(FUNC(airbustr_state::screen_vblank));
+ m_screen->set_palette(m_palette);
GFXDECODE(config, m_gfxdecode, m_palette, gfx_airbustr);
PALETTE(config, m_palette).set_format(palette_device::xGRB_555, 768);
@@ -618,9 +618,8 @@ MACHINE_CONFIG_START(airbustr_state::airbustr)
ymsnd.add_route(2, "mono", 0.25);
ymsnd.add_route(3, "mono", 0.50);
- MCFG_DEVICE_ADD("oki", OKIM6295, XTAL(12'000'000)/4, okim6295_device::PIN7_LOW) /* verified on pcb */
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.80)
-MACHINE_CONFIG_END
+ OKIM6295(config, "oki", XTAL(12'000'000)/4, okim6295_device::PIN7_LOW).add_route(ALL_OUTPUTS, "mono", 0.80); /* verified on pcb */
+}
void airbustr_state::airbustrb(machine_config &config)
{
diff --git a/src/mame/drivers/airraid.cpp b/src/mame/drivers/airraid.cpp
index bf405a0441c..8835909b340 100644
--- a/src/mame/drivers/airraid.cpp
+++ b/src/mame/drivers/airraid.cpp
@@ -389,19 +389,19 @@ INPUT_PORTS_END
-MACHINE_CONFIG_START(airraid_state::airraid)
-
+void airraid_state::airraid(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD(m_maincpu, Z80,XTAL(12'000'000)/2) /* verified on pcb */
- MCFG_DEVICE_PROGRAM_MAP(airraid_map)
- MCFG_TIMER_DRIVER_ADD_SCANLINE("scantimer", airraid_state, cshooter_scanline, "airraid_vid:screen", 0, 1)
+ Z80(config, m_maincpu, XTAL(12'000'000)/2); /* verified on pcb */
+ m_maincpu->set_addrmap(AS_PROGRAM, &airraid_state::airraid_map);
+ TIMER(config, "scantimer").configure_scanline(FUNC(airraid_state::cshooter_scanline), "airraid_vid:screen", 0, 1);
- MCFG_DEVICE_ADD("audiocpu", Z80, XTAL(14'318'181)/4) /* verified on pcb */
- MCFG_DEVICE_PROGRAM_MAP(airraid_sound_map)
- MCFG_DEVICE_OPCODES_MAP(airraid_sound_decrypted_opcodes_map)
- MCFG_DEVICE_IRQ_ACKNOWLEDGE_DEVICE("seibu_sound", seibu_sound_device, im0_vector_cb)
+ z80_device &audiocpu(Z80(config, "audiocpu", XTAL(14'318'181)/4)); /* verified on pcb */
+ audiocpu.set_addrmap(AS_PROGRAM, &airraid_state::airraid_sound_map);
+ audiocpu.set_addrmap(AS_OPCODES, &airraid_state::airraid_sound_decrypted_opcodes_map);
+ audiocpu.set_irq_acknowledge_callback("seibu_sound", FUNC(seibu_sound_device::im0_vector_cb));
- MCFG_QUANTUM_PERFECT_CPU("maincpu")
+ config.m_perfect_cpu_quantum = subtag("maincpu");
PALETTE(config, m_palette).set_format(palette_device::xBGR_444, 0x100);
@@ -422,14 +422,14 @@ MACHINE_CONFIG_START(airraid_state::airraid)
m_seibu_sound->ym_write_callback().set("ymsnd", FUNC(ym2151_device::write));
SEI80BU(config, "sei80bu", 0).set_device_rom_tag("audiocpu");
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(airraid_state::airraid_crypt)
+void airraid_state::airraid_crypt(machine_config &config)
+{
airraid(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_OPCODES_MAP(decrypted_opcodes_map)
-MACHINE_CONFIG_END
+ m_maincpu->set_addrmap(AS_OPCODES, &airraid_state::decrypted_opcodes_map);
+}
diff --git a/src/mame/drivers/albazc.cpp b/src/mame/drivers/albazc.cpp
index 35f5d547210..dc83bed62e7 100644
--- a/src/mame/drivers/albazc.cpp
+++ b/src/mame/drivers/albazc.cpp
@@ -276,28 +276,28 @@ static GFXDECODE_START( gfx_hanaroku )
GFXDECODE_END
-MACHINE_CONFIG_START(albazc_state::hanaroku)
-
- MCFG_DEVICE_ADD("maincpu", Z80,6000000) /* ? MHz */
- MCFG_DEVICE_PROGRAM_MAP(hanaroku_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", albazc_state, irq0_line_hold)
+void albazc_state::hanaroku(machine_config &config)
+{
+ Z80(config, m_maincpu, 6000000); /* ? MHz */
+ m_maincpu->set_addrmap(AS_PROGRAM, &albazc_state::hanaroku_map);
+ m_maincpu->set_vblank_int("screen", FUNC(albazc_state::irq0_line_hold));
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
- MCFG_TICKET_DISPENSER_ADD("hopper", attotime::from_msec(50), TICKET_MOTOR_ACTIVE_HIGH, TICKET_STATUS_ACTIVE_HIGH )
+ TICKET_DISPENSER(config, m_hopper, attotime::from_msec(50), TICKET_MOTOR_ACTIVE_HIGH, TICKET_STATUS_ACTIVE_HIGH );
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(64*8, 64*8)
- MCFG_SCREEN_VISIBLE_AREA(0, 48*8-1, 2*8, 30*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(albazc_state, screen_update_hanaroku)
- MCFG_SCREEN_PALETTE(m_palette)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(64*8, 64*8);
+ screen.set_visarea(0, 48*8-1, 2*8, 30*8-1);
+ screen.set_screen_update(FUNC(albazc_state::screen_update_hanaroku));
+ screen.set_palette(m_palette);
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, m_palette, gfx_hanaroku)
+ GFXDECODE(config, m_gfxdecode, m_palette, gfx_hanaroku);
- PALETTE(config, "palette", FUNC(albazc_state::albazc_palette), 0x200);
+ PALETTE(config, m_palette, FUNC(albazc_state::albazc_palette), 0x200);
/* sound hardware */
SPEAKER(config, "mono").front_center();
@@ -306,7 +306,7 @@ MACHINE_CONFIG_START(albazc_state::hanaroku)
aysnd.port_a_read_callback().set_ioport("DSW1");
aysnd.port_b_read_callback().set_ioport("DSW2");
aysnd.add_route(ALL_OUTPUTS, "mono", 0.50);
-MACHINE_CONFIG_END
+}
ROM_START( hanaroku )
diff --git a/src/mame/drivers/albazg.cpp b/src/mame/drivers/albazg.cpp
index 52c05ed8d9e..a2c11c23249 100644
--- a/src/mame/drivers/albazg.cpp
+++ b/src/mame/drivers/albazg.cpp
@@ -359,13 +359,13 @@ void albazg_state::machine_reset()
m_prot_lock = 0;
}
-MACHINE_CONFIG_START(albazg_state::yumefuda)
-
+void albazg_state::yumefuda(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80 , MASTER_CLOCK/2) /* xtal is 12 Mhz, unknown divider*/
- MCFG_DEVICE_PROGRAM_MAP(main_map)
- MCFG_DEVICE_IO_MAP(port_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", albazg_state, irq0_line_hold)
+ Z80(config, m_maincpu, MASTER_CLOCK/2); /* xtal is 12 Mhz, unknown divider*/
+ m_maincpu->set_addrmap(AS_PROGRAM, &albazg_state::main_map);
+ m_maincpu->set_addrmap(AS_IO, &albazg_state::port_map);
+ m_maincpu->set_vblank_int("screen", FUNC(albazg_state::irq0_line_hold));
EEPROM_93C46_16BIT(config, "eeprom");
@@ -377,20 +377,20 @@ MACHINE_CONFIG_START(albazg_state::yumefuda)
ppi.in_pc_callback().set(FUNC(albazg_state::mux_r));
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(32*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0, 32*8-1, 0, 32*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(albazg_state, screen_update_yumefuda)
- MCFG_SCREEN_PALETTE("palette")
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(32*8, 32*8);
+ screen.set_visarea_full();
+ screen.set_screen_update(FUNC(albazg_state::screen_update_yumefuda));
+ screen.set_palette("palette");
h46505_device &crtc(H46505(config, "crtc", MASTER_CLOCK/16)); /* hand tuned to get ~60 fps */
crtc.set_screen("screen");
crtc.set_show_border_area(false);
crtc.set_char_width(8);
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_yumefuda)
+ GFXDECODE(config, m_gfxdecode, "palette", gfx_yumefuda);
PALETTE(config, "palette").set_format(palette_device::xRGB_555, 0x80);
@@ -402,7 +402,7 @@ MACHINE_CONFIG_START(albazg_state::yumefuda)
aysnd.port_b_read_callback().set_ioport("DSW2");
aysnd.port_a_write_callback().set(FUNC(albazg_state::yumefuda_output_w));
aysnd.add_route(ALL_OUTPUTS, "mono", 0.50);
-MACHINE_CONFIG_END
+}
/***************************************************************************************/
diff --git a/src/mame/drivers/aleck64.cpp b/src/mame/drivers/aleck64.cpp
index 6fee3124b73..dfd4cdc1010 100644
--- a/src/mame/drivers/aleck64.cpp
+++ b/src/mame/drivers/aleck64.cpp
@@ -933,6 +933,61 @@ static INPUT_PORTS_START( hipai )
PORT_BIT( 0x00040000, IP_ACTIVE_LOW, IPT_COIN1 )
INPUT_PORTS_END
+static INPUT_PORTS_START( hipai2 )
+ PORT_INCLUDE( hipai )
+
+ PORT_MODIFY("IN0")
+ PORT_BIT( 0x0000ffff, IP_ACTIVE_LOW, IPT_UNUSED )
+ PORT_DIPNAME( 0x80000000, 0x80000000, DEF_STR( Free_Play ) ) PORT_DIPLOCATION("SW1:8")
+ PORT_DIPSETTING( 0x80000000, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00000000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x40000000, 0x40000000, "Backup Settings" ) PORT_DIPLOCATION("SW1:7")
+ PORT_DIPSETTING( 0x40000000, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00000000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x20000000, 0x20000000, DEF_STR( Unused ) ) PORT_DIPLOCATION("SW1:6")
+ PORT_DIPSETTING( 0x20000000, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00000000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x10000000, 0x10000000, DEF_STR( Unused ) ) PORT_DIPLOCATION("SW1:5")
+ PORT_DIPSETTING( 0x10000000, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00000000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x08000000, 0x08000000, DEF_STR( Unused ) ) PORT_DIPLOCATION("SW1:4")
+ PORT_DIPSETTING( 0x08000000, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00000000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x07000000, 0x07000000, DEF_STR( Coinage ) ) PORT_DIPLOCATION("SW1:1,2,3")
+ PORT_DIPSETTING( 0x00000000, DEF_STR( 5C_1C ) )
+ PORT_DIPSETTING( 0x01000000, DEF_STR( 4C_1C ) )
+ PORT_DIPSETTING( 0x02000000, DEF_STR( 3C_1C ) )
+ PORT_DIPSETTING( 0x03000000, DEF_STR( 2C_1C ) )
+ PORT_DIPSETTING( 0x07000000, DEF_STR( 1C_1C ) )
+ PORT_DIPSETTING( 0x06000000, DEF_STR( 1C_2C ) )
+ PORT_DIPSETTING( 0x05000000, DEF_STR( 1C_3C ) )
+ PORT_DIPSETTING( 0x04000000, DEF_STR( 1C_4C ) )
+ PORT_DIPNAME( 0x00800000, 0x00800000, DEF_STR( Test ) ) PORT_DIPLOCATION("SW2:8")
+ PORT_DIPSETTING( 0x00800000, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00000000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x00400000, 0x00400000, DEF_STR( Unused ) ) PORT_DIPLOCATION("SW2:7")
+ PORT_DIPSETTING( 0x00400000, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00000000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x00200000, 0x00000000, DEF_STR( Demo_Sounds ) ) PORT_DIPLOCATION("SW2:6")
+ PORT_DIPSETTING( 0x00200000, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00000000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x00100000, 0x00100000, DEF_STR( Allow_Continue ) ) PORT_DIPLOCATION("SW2:5")
+ PORT_DIPSETTING( 0x00000000, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00100000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x00080000, 0x00080000, "Kuitan" ) PORT_DIPLOCATION("SW2:4")
+ PORT_DIPSETTING( 0x00000000, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00080000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x00070000, 0x00070000, DEF_STR( Difficulty ) ) PORT_DIPLOCATION("SW2:1,2,3")
+ PORT_DIPSETTING( 0x00000000, DEF_STR( Hardest ) )
+ PORT_DIPSETTING( 0x00010000, DEF_STR( Very_Hard ) )
+ PORT_DIPSETTING( 0x00020000, DEF_STR( Hard ) )
+ PORT_DIPSETTING( 0x00030000, "Normal+" )
+ PORT_DIPSETTING( 0x00040000, DEF_STR( Easy ) )
+ PORT_DIPSETTING( 0x00050000, DEF_STR( Very_Easy ) )
+ PORT_DIPSETTING( 0x00060000, DEF_STR( Easiest ) )
+ PORT_DIPSETTING( 0x00070000, DEF_STR( Normal ) )
+INPUT_PORTS_END
+
static INPUT_PORTS_START( srmvs )
PORT_INCLUDE( hipai )
@@ -1267,6 +1322,25 @@ ROM_START( hipai )
ROM_END
+ROM_START( hipai2 )
+ ROM_REGION32_BE( 0x800, "user1", ROMREGION_ERASE00 )
+ PIF_BOOTROM
+
+ ROM_REGION32_BE( 0x4000000, "user2", 0 )
+ ROM_LOAD16_WORD_SWAP( "ua3029-all01.u3", 0x0000000, 0x1000000, CRC(88b83e93) SHA1(279a006436069232383b2065e7416d8ccc76e3ca) )
+ ROM_LOAD16_WORD_SWAP( "ua3029-alh01.u4", 0x1000000, 0x1000000, CRC(4f79fa94) SHA1(a6d2d805f96f0ad7294ebf41b13573320154b2a4) )
+
+ ROM_REGION32_BE( 0x800000, "user3", 0 )
+ ROM_LOAD16_WORD_SWAP( "nus-zsij-0.u1", 0x000000, 0x800000, CRC(2389576f) SHA1(dc22b2eab4d7a02cb918827a62e6c120b3a84e6c) )
+
+ ROM_REGION16_BE( 0x80, "normpoint", 0 )
+ ROM_LOAD( "normpnt.rom", 0x00, 0x80, CRC(e7f2a005) SHA1(c27b4a364a24daeee6e99fd286753fd6216362b4) )
+
+ ROM_REGION16_BE( 0x80, "normslope", 0 )
+ ROM_LOAD( "normslp.rom", 0x00, 0x80, CRC(4f2ae525) SHA1(eab43f8cc52c8551d9cff6fced18ef80eaba6f05) )
+ROM_END
+
+
ROM_START( kurufev )
ROM_REGION32_BE( 0x800, "user1", ROMREGION_ERASE00 )
PIF_BOOTROM
@@ -1343,3 +1417,4 @@ GAME( 2003, twrshaft, aleck64, aleck64, twrshaft, aleck64_state, init_aleck64, R
GAME( 2003, hipai, aleck64, aleck64, hipai, aleck64_state, init_aleck64, ROT0, "Aruze / Seta", "Hi Pai Paradise", MACHINE_IMPERFECT_GRAPHICS )
GAME( 2003, doncdoon, aleck64, aleck64, doncdoon, aleck64_state, init_aleck64, ROT0, "Aruze", "Hanabi de Doon! - Don-chan Puzzle", MACHINE_IMPERFECT_GRAPHICS )
GAME( 2003, kurufev, aleck64, aleck64, kurufev, aleck64_state, init_aleck64, ROT0, "Aruze / Takumi", "Kurukuru Fever", MACHINE_IMPERFECT_GRAPHICS )
+GAME( 2004, hipai2, aleck64, aleck64, hipai2, aleck64_state, init_aleck64, ROT0, "Aruze / Seta / Paon", "Hi Pai Paradise 2", MACHINE_IMPERFECT_GRAPHICS )
diff --git a/src/mame/drivers/aleisttl.cpp b/src/mame/drivers/aleisttl.cpp
index 2ee923f5753..55792d80cf5 100644
--- a/src/mame/drivers/aleisttl.cpp
+++ b/src/mame/drivers/aleisttl.cpp
@@ -100,20 +100,21 @@ void sburners_state::video_start()
{
}
-MACHINE_CONFIG_START(sburners_state::sburners)
-
+void sburners_state::sburners(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", NETLIST_CPU, NETLIST_CLOCK)
- MCFG_NETLIST_SETUP(sburners)
+ NETLIST_CPU(config, m_maincpu, NETLIST_CLOCK);
+ m_maincpu->set_constructor(netlist_sburners);
/* video hardware */
- MCFG_FIXFREQ_ADD("fixfreq", "screen")
- MCFG_FIXFREQ_MONITOR_CLOCK(MASTER_CLOCK)
- MCFG_FIXFREQ_HORZ_PARAMS(H_TOTAL-67,H_TOTAL-40,H_TOTAL-8,H_TOTAL)
- MCFG_FIXFREQ_VERT_PARAMS(V_TOTAL-22,V_TOTAL-19,V_TOTAL-12,V_TOTAL)
- MCFG_FIXFREQ_FIELDCOUNT(1)
- MCFG_FIXFREQ_SYNC_THRESHOLD(0.30)
-MACHINE_CONFIG_END
+ SCREEN(config, "screen", SCREEN_TYPE_RASTER);
+ FIXFREQ(config, m_video).set_screen("screen");
+ m_video->set_monitor_clock(MASTER_CLOCK);
+ m_video->set_horz_params(H_TOTAL-67,H_TOTAL-40,H_TOTAL-8,H_TOTAL);
+ m_video->set_vert_params(V_TOTAL-22,V_TOTAL-19,V_TOTAL-12,V_TOTAL);
+ m_video->set_fieldcount(1);
+ m_video->set_threshold(0.30);
+}
/***************************************************************************
diff --git a/src/mame/drivers/alesis.cpp b/src/mame/drivers/alesis.cpp
index 33da94d7999..f0784a972e9 100644
--- a/src/mame/drivers/alesis.cpp
+++ b/src/mame/drivers/alesis.cpp
@@ -414,7 +414,8 @@ HD44780_PIXEL_UPDATE(alesis_state::sr16_pixel_update)
bitmap.pix16(line*9 + y, pos*6 + x) = state;
}
-MACHINE_CONFIG_START(alesis_state::hr16)
+void alesis_state::hr16(machine_config &config)
+{
/* basic machine hardware */
I8031(config, m_maincpu, 12_MHz_XTAL);
m_maincpu->set_addrmap(AS_PROGRAM, &alesis_state::hr16_mem);
@@ -424,30 +425,31 @@ MACHINE_CONFIG_START(alesis_state::hr16)
m_maincpu->port_out_cb<3>().set(FUNC(alesis_state::p3_w));
/* video hardware */
- MCFG_SCREEN_ADD("screen", LCD)
- MCFG_SCREEN_REFRESH_RATE(50)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */
- MCFG_SCREEN_SIZE(6*16, 9*2)
- MCFG_SCREEN_VISIBLE_AREA(0, 6*16-1, 0, 9*2-1)
- MCFG_SCREEN_UPDATE_DEVICE("hd44780", hd44780_device, screen_update)
- MCFG_SCREEN_PALETTE("palette")
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_LCD));
+ screen.set_refresh_hz(50);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */
+ screen.set_size(6*16, 9*2);
+ screen.set_visarea_full();
+ screen.set_screen_update("hd44780", FUNC(hd44780_device::screen_update));
+ screen.set_palette("palette");
PALETTE(config, "palette", FUNC(alesis_state::alesis_palette), 2);
- MCFG_CASSETTE_ADD( "cassette" )
- MCFG_CASSETTE_DEFAULT_STATE(CASSETTE_STOPPED)
- MCFG_CASSETTE_INTERFACE("hr16_cass")
+ CASSETTE(config, m_cassette);
+ m_cassette->set_default_state(CASSETTE_STOPPED);
+ m_cassette->set_interface("hr16_cass");
- MCFG_HD44780_ADD("hd44780")
- MCFG_HD44780_LCD_SIZE(2, 16)
+ HD44780(config, m_lcdc, 0);
+ m_lcdc->set_lcd_size(2, 16);
/* sound hardware */
ALESIS_DM3AG(config, "dm3ag", 12_MHz_XTAL/2);
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(alesis_state::sr16)
+void alesis_state::sr16(machine_config &config)
+{
hr16(config);
/* basic machine hardware */
@@ -456,15 +458,15 @@ MACHINE_CONFIG_START(alesis_state::sr16)
m_maincpu->port_in_cb<1>().set_constant(0);
/* video hardware */
- MCFG_SCREEN_MODIFY("screen")
- MCFG_SCREEN_SIZE(6*8, 9*2)
- MCFG_SCREEN_VISIBLE_AREA(0, 6*8-1, 0, 9*2-1)
+ screen_device &screen(*subdevice<screen_device>("screen"));
+ screen.set_size(6*8, 9*2);
+ screen.set_visarea_full();
+
config.set_default_layout(layout_sr16);
- MCFG_DEVICE_MODIFY("hd44780")
- MCFG_HD44780_LCD_SIZE(2, 8)
- MCFG_HD44780_PIXEL_UPDATE_CB(alesis_state, sr16_pixel_update)
-MACHINE_CONFIG_END
+ m_lcdc->set_lcd_size(2, 8);
+ m_lcdc->set_pixel_update_cb(FUNC(alesis_state::sr16_pixel_update), this);
+}
void alesis_state::mmt8(machine_config &config)
{
diff --git a/src/mame/drivers/alesis_qs.cpp b/src/mame/drivers/alesis_qs.cpp
index 0ad9d363649..09c55100e4e 100644
--- a/src/mame/drivers/alesis_qs.cpp
+++ b/src/mame/drivers/alesis_qs.cpp
@@ -51,10 +51,11 @@ void qs_state::qs7_prog_map(address_map &map)
map(0x00000, 0x3ffff).rom();
}
-MACHINE_CONFIG_START(qs_state::qs7)
+void qs_state::qs7(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", H83048, XTAL(10'000'000)) /* FIX-ME! Actual CPU is H8/510 and XTAL value is a guess */
- MCFG_DEVICE_PROGRAM_MAP(qs7_prog_map)
+ H83048(config, m_maincpu, XTAL(10'000'000)); /* FIX-ME! Actual CPU is H8/510 and XTAL value is a guess */
+ m_maincpu->set_addrmap(AS_PROGRAM, &qs_state::qs7_prog_map);
//MCFG_ALESIS_KEYSCAN_ASIC_ADD("keyscan")
@@ -76,7 +77,7 @@ MACHINE_CONFIG_START(qs_state::qs7)
//MCFG_PCMCIA_ADD("pcmcia")
//MIDI
//RS232
-MACHINE_CONFIG_END
+}
ROM_START( alesqs7 )
ROM_REGION( 0x80000, "maincpu", 0 )
diff --git a/src/mame/drivers/alg.cpp b/src/mame/drivers/alg.cpp
index 48939844779..e341d5dc1af 100644
--- a/src/mame/drivers/alg.cpp
+++ b/src/mame/drivers/alg.cpp
@@ -305,11 +305,11 @@ INPUT_PORTS_END
*
*************************************/
-MACHINE_CONFIG_START(alg_state::alg_r1)
-
+void alg_state::alg_r1(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M68000, amiga_state::CLK_7M_NTSC)
- MCFG_DEVICE_PROGRAM_MAP(main_map_r1)
+ M68000(config, m_maincpu, amiga_state::CLK_7M_NTSC);
+ m_maincpu->set_addrmap(AS_PROGRAM, &alg_state::main_map_r1);
ADDRESS_MAP_BANK(config, "overlay").set_map(&alg_state::overlay_512kb_map).set_options(ENDIANNESS_BIG, 16, 22, 0x200000);
@@ -318,11 +318,12 @@ MACHINE_CONFIG_START(alg_state::alg_r1)
/* video hardware */
ntsc_video(config);
- MCFG_LASERDISC_LDP1450_ADD("laserdisc",9600)
- MCFG_LASERDISC_SCREEN("screen")
- MCFG_LASERDISC_OVERLAY_DRIVER(512*2, 262, amiga_state, screen_update_amiga)
- MCFG_LASERDISC_OVERLAY_CLIP((129-8)*2, (449+8-1)*2, 44-8, 244+8-1)
- MCFG_LASERDISC_OVERLAY_PALETTE(m_palette)
+ SONY_LDP1450(config, m_laserdisc, 9600);
+ m_laserdisc->set_screen("screen");
+ m_laserdisc->set_overlay(512*2, 262, FUNC(amiga_state::screen_update_amiga));
+ m_laserdisc->set_overlay_clip((129-8)*2, (449+8-1)*2, 44-8, 244+8-1);
+ m_laserdisc->set_overlay_palette(m_palette);
+
PALETTE(config, m_palette, FUNC(alg_state::amiga_palette), 4097);
@@ -332,25 +333,25 @@ MACHINE_CONFIG_START(alg_state::alg_r1)
SPEAKER(config, "lspeaker").front_left();
SPEAKER(config, "rspeaker").front_right();
- paula_8364_device &paula(PAULA_8364(config, "amiga", amiga_state::CLK_C1_NTSC));
- paula.add_route(0, "lspeaker", 0.25);
- paula.add_route(1, "rspeaker", 0.25);
- paula.add_route(2, "rspeaker", 0.25);
- paula.add_route(3, "lspeaker", 0.25);
- paula.mem_read_cb().set(FUNC(amiga_state::chip_ram_r));
- paula.int_cb().set(FUNC(amiga_state::paula_int_w));
+ PAULA_8364(config, m_paula, amiga_state::CLK_C1_NTSC);
+ m_paula->add_route(0, "lspeaker", 0.25);
+ m_paula->add_route(1, "rspeaker", 0.25);
+ m_paula->add_route(2, "rspeaker", 0.25);
+ m_paula->add_route(3, "lspeaker", 0.25);
+ m_paula->mem_read_cb().set(FUNC(amiga_state::chip_ram_r));
+ m_paula->int_cb().set(FUNC(amiga_state::paula_int_w));
- MCFG_DEVICE_MODIFY("laserdisc")
- MCFG_SOUND_ROUTE(0, "lspeaker", 1.0)
- MCFG_SOUND_ROUTE(1, "rspeaker", 1.0)
+ m_laserdisc->add_route(0, "lspeaker", 1.0);
+ m_laserdisc->add_route(1, "rspeaker", 1.0);
/* cia */
- MCFG_DEVICE_ADD("cia_0", MOS8520, amiga_state::CLK_E_NTSC)
- MCFG_MOS6526_IRQ_CALLBACK(WRITELINE(*this, amiga_state, cia_0_irq))
- MCFG_MOS6526_PA_INPUT_CALLBACK(IOPORT("FIRE"))
- MCFG_MOS6526_PA_OUTPUT_CALLBACK(WRITE8(*this, amiga_state, cia_0_port_a_write))
- MCFG_DEVICE_ADD("cia_1", MOS8520, amiga_state::CLK_E_NTSC)
- MCFG_MOS6526_IRQ_CALLBACK(WRITELINE(*this, amiga_state, cia_1_irq))
+ MOS8520(config, m_cia_0, amiga_state::CLK_E_NTSC);
+ m_cia_0->irq_wr_callback().set(FUNC(amiga_state::cia_0_irq));
+ m_cia_0->pa_rd_callback().set_ioport("FIRE");
+ m_cia_0->pa_wr_callback().set(FUNC(amiga_state::cia_0_port_a_write));
+
+ MOS8520(config, m_cia_1, amiga_state::CLK_E_NTSC);
+ m_cia_1->irq_wr_callback().set(FUNC(amiga_state::cia_1_irq));
AMIGA_FDC(config, m_fdc, amiga_state::CLK_7M_NTSC);
m_fdc->index_callback().set("cia_1", FUNC(mos8520_device::flag_w));
@@ -358,34 +359,31 @@ MACHINE_CONFIG_START(alg_state::alg_r1)
m_fdc->write_dma_callback().set(FUNC(amiga_state::chip_ram_w));
m_fdc->dskblk_callback().set(FUNC(amiga_state::fdc_dskblk_w));
m_fdc->dsksyn_callback().set(FUNC(amiga_state::fdc_dsksyn_w));
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(alg_state::alg_r2)
+void alg_state::alg_r2(machine_config &config)
+{
alg_r1(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(main_map_r2)
-MACHINE_CONFIG_END
+ m_maincpu->set_addrmap(AS_PROGRAM, &alg_state::main_map_r2);
+}
-MACHINE_CONFIG_START(alg_state::picmatic)
+void alg_state::picmatic(machine_config &config)
+{
alg_r1(config);
/* adjust for PAL specs */
- MCFG_DEVICE_REPLACE("maincpu", M68000, amiga_state::CLK_7M_PAL)
- MCFG_DEVICE_PROGRAM_MAP(main_map_picmatic)
+ m_maincpu->set_clock(amiga_state::CLK_7M_PAL);
+ m_maincpu->set_addrmap(AS_PROGRAM, &alg_state::main_map_picmatic);
- MCFG_DEVICE_REMOVE("screen")
+ config.device_remove("screen");
pal_video(config);
- MCFG_DEVICE_MODIFY("amiga")
- MCFG_DEVICE_CLOCK(amiga_state::CLK_C1_PAL)
- MCFG_DEVICE_MODIFY("cia_0")
- MCFG_DEVICE_CLOCK(amiga_state::CLK_E_PAL)
- MCFG_DEVICE_MODIFY("cia_1")
- MCFG_DEVICE_CLOCK(amiga_state::CLK_E_PAL)
- MCFG_DEVICE_MODIFY("fdc")
- MCFG_DEVICE_CLOCK(amiga_state::CLK_7M_PAL)
-MACHINE_CONFIG_END
+ m_paula->set_clock(amiga_state::CLK_C1_PAL);
+ m_cia_0->set_clock(amiga_state::CLK_E_PAL);
+ m_cia_1->set_clock(amiga_state::CLK_E_PAL);
+ m_fdc->set_clock(amiga_state::CLK_7M_PAL);
+}
diff --git a/src/mame/drivers/alien.cpp b/src/mame/drivers/alien.cpp
index fdb75504b26..f5d3d69e1dc 100644
--- a/src/mame/drivers/alien.cpp
+++ b/src/mame/drivers/alien.cpp
@@ -136,27 +136,27 @@ void alien_state::machine_reset()
//m_maincpu->set_input_line(INPUT_LINE_HALT, ASSERT_LINE);
}
-MACHINE_CONFIG_START(alien_state::alien)
+void alien_state::alien(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", SH4LE, MASTER_CLOCK) /* 200MHz */
- MCFG_DEVICE_PROGRAM_MAP(alien_map)
- MCFG_CPU_FORCE_NO_DRC()
+ SH4LE(config, m_maincpu, MASTER_CLOCK); /* 200MHz */
+ m_maincpu->set_addrmap(AS_PROGRAM, &alien_state::alien_map);
+ m_maincpu->set_force_no_drc(true);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_UPDATE_DRIVER(alien_state, screen_update)
- MCFG_SCREEN_SIZE((32)*8, (32)*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 0*8, 32*8-1)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_screen_update(FUNC(alien_state::screen_update));
+ screen.set_size((32)*8, (32)*8);
+ screen.set_visarea_full();
- MCFG_PALETTE_ADD("palette", 0x1000)
+ PALETTE(config, "palette").set_entries(0x1000);
/* sound hardware */
SPEAKER(config, "mono").front_center();
-
-MACHINE_CONFIG_END
+}
void alien_state::init_dkbanans()
{
diff --git a/src/mame/drivers/alinvade.cpp b/src/mame/drivers/alinvade.cpp
index e77ae1747d4..a9138a1e94c 100644
--- a/src/mame/drivers/alinvade.cpp
+++ b/src/mame/drivers/alinvade.cpp
@@ -207,26 +207,25 @@ WRITE_LINE_MEMBER(alinvade_state::vblank_irq)
m_maincpu->set_input_line(0,HOLD_LINE);
}
-MACHINE_CONFIG_START(alinvade_state::alinvade)
-
+void alinvade_state::alinvade(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M6502,2000000) /* ? MHz */
- MCFG_DEVICE_PROGRAM_MAP(alinvade_map)
+ M6502(config, m_maincpu, 2000000); /* ? MHz */
+ m_maincpu->set_addrmap(AS_PROGRAM, &alinvade_state::alinvade_map);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(128, 128)
- MCFG_SCREEN_VISIBLE_AREA(0, 128-1, 0, 128-1)
- MCFG_SCREEN_UPDATE_DRIVER(alinvade_state, screen_update)
- MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE(*this, alinvade_state, vblank_irq))
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(128, 128);
+ screen.set_visarea_full();
+ screen.set_screen_update(FUNC(alinvade_state::screen_update));
+ screen.screen_vblank().set(FUNC(alinvade_state::vblank_irq));
/* sound hardware */
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("discrete", DISCRETE, alinvade_discrete)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
-MACHINE_CONFIG_END
+ DISCRETE(config, m_discrete, alinvade_discrete).add_route(ALL_OUTPUTS, "mono", 1.0);
+}
diff --git a/src/mame/drivers/allied.cpp b/src/mame/drivers/allied.cpp
index 0729d7bc35a..e5b18995a24 100644
--- a/src/mame/drivers/allied.cpp
+++ b/src/mame/drivers/allied.cpp
@@ -622,10 +622,11 @@ void allied_state::machine_reset()
m_leds[0] = 1;
}
-MACHINE_CONFIG_START(allied_state::allied)
+void allied_state::allied(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M6504, 3572549/4)
- MCFG_DEVICE_PROGRAM_MAP(allied_map)
+ M6504(config, m_maincpu, 3572549/4);
+ m_maincpu->set_addrmap(AS_PROGRAM, &allied_state::allied_map);
/* Video */
config.set_default_layout(layout_allied);
@@ -684,23 +685,23 @@ MACHINE_CONFIG_START(allied_state::allied)
m_ic8->irqa_handler().set_inputline("maincpu", M6504_IRQ_LINE);
m_ic8->irqb_handler().set_inputline("maincpu", M6504_IRQ_LINE);
- MCFG_DEVICE_ADD("ic3", MOS6530, 3572549/4) // unknown where the ram and i/o is located
- MCFG_MOS6530_OUT_PB_CB(WRITE8(*this, allied_state, ic3_b_w))
+ mos6530_device &ic3(MOS6530(config, "ic3", 3572549/4)); // unknown where the ram and i/o is located
+ ic3.out_pb_callback().set(FUNC(allied_state::ic3_b_w));
- MCFG_DEVICE_ADD("ic5", MOS6530, 3572549/4)
- MCFG_MOS6530_IN_PA_CB(READ8(*this, allied_state, ic5_a_r))
- //MCFG_MOS6530_OUT_PA_CB(WRITE8(*this, allied_state, ic5_a_w))
- //MCFG_MOS6530_IN_PB_CB(READ8(*this, allied_state, ic5_b_r))
- MCFG_MOS6530_OUT_PB_CB(WRITE8(*this, allied_state, ic5_b_w))
+ MOS6530(config, m_ic5, 3572549/4);
+ m_ic5->in_pa_callback().set(FUNC(allied_state::ic5_a_r));
+ //m_ic5->out_pa_callback().set(FUNC(allied_state::ic5_a_w));
+ //m_ic5->in_pb_callback().set(FUNC(allied_state::ic5_b_r));
+ m_ic5->out_pb_callback().set(FUNC(allied_state::ic5_b_w));
- MCFG_DEVICE_ADD("ic6", MOS6530, 3572549/4)
- MCFG_MOS6530_IN_PA_CB(READ8(*this, allied_state, ic6_a_r))
- //MCFG_MOS6530_OUT_PA_CB(WRITE8(*this, allied_state, ic6_a_w))
- MCFG_MOS6530_IN_PB_CB(READ8(*this, allied_state, ic6_b_r))
- MCFG_MOS6530_OUT_PB_CB(WRITE8(*this, allied_state, ic6_b_w))
+ MOS6530(config, m_ic6, 3572549/4);
+ m_ic6->in_pa_callback().set(FUNC(allied_state::ic6_a_r));
+ //m_ic6->out_pa_callback().set(FUNC(allied_state::ic6_a_w));
+ m_ic6->in_pb_callback().set(FUNC(allied_state::ic6_b_r));
+ m_ic6->out_pb_callback().set(FUNC(allied_state::ic6_b_w));
- MCFG_TIMER_DRIVER_ADD_PERIODIC("timer_a", allied_state, timer_a, attotime::from_hz(50))
-MACHINE_CONFIG_END
+ TIMER(config, "timer_a").configure_periodic(FUNC(allied_state::timer_a), attotime::from_hz(50));
+}
ROM_START( allied )
diff --git a/src/mame/drivers/alpha68k.cpp b/src/mame/drivers/alpha68k.cpp
index ae21c86fb8f..2f33da06c14 100644
--- a/src/mame/drivers/alpha68k.cpp
+++ b/src/mame/drivers/alpha68k.cpp
@@ -1947,7 +1947,6 @@ void alpha68k_state::sstingry(machine_config &config)
DAC_8BIT_R2R(config, "dac", 0).add_route(ALL_OUTPUTS, "speaker", 0.75); // unknown DAC
voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref", 0));
- vref.set_output(5.0);
vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT);
vref.add_route(0, "dac", -1.0, DAC_VREF_NEG_INPUT);
}
@@ -1998,7 +1997,6 @@ void alpha68k_state::kyros(machine_config &config)
DAC_8BIT_R2R(config, "dac", 0).add_route(ALL_OUTPUTS, "speaker", 0.75); // unknown DAC
voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref", 0));
- vref.set_output(5.0);
vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT);
vref.add_route(0, "dac", -1.0, DAC_VREF_NEG_INPUT);
}
@@ -2134,7 +2132,6 @@ void alpha68k_state::alpha68k_II(machine_config &config)
DAC_8BIT_R2R(config, "dac", 0).add_route(ALL_OUTPUTS, "speaker", 0.75); // unknown DAC
voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref", 0));
- vref.set_output(5.0);
vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT);
vref.add_route(0, "dac", -1.0, DAC_VREF_NEG_INPUT);
}
@@ -2201,7 +2198,6 @@ void alpha68k_state::alpha68k_V(machine_config &config)
DAC_8BIT_R2R(config, "dac", 0).add_route(ALL_OUTPUTS, "speaker", 0.75); // ALPHA-VOICE88 custom DAC
voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref", 0));
- vref.set_output(5.0);
vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT);
vref.add_route(0, "dac", -1.0, DAC_VREF_NEG_INPUT);
}
diff --git a/src/mame/drivers/alphasma.cpp b/src/mame/drivers/alphasma.cpp
index 3487869370d..afb54668e78 100644
--- a/src/mame/drivers/alphasma.cpp
+++ b/src/mame/drivers/alphasma.cpp
@@ -431,39 +431,40 @@ void alphasmart_state::machine_reset()
m_port_d = 0;
}
-MACHINE_CONFIG_START(alphasmart_state::alphasmart)
+void alphasmart_state::alphasmart(machine_config &config)
+{
/* basic machine hardware */
MC68HC11(config, m_maincpu, XTAL(8'000'000)/2); // MC68HC11D0, XTAL is 8 Mhz, unknown divider
m_maincpu->set_addrmap(AS_PROGRAM, &alphasmart_state::alphasmart_mem);
m_maincpu->set_addrmap(AS_IO, &alphasmart_state::alphasmart_io);
m_maincpu->set_config(0, 192, 0x00);
- MCFG_KS0066_F05_ADD("ks0066_0")
- MCFG_HD44780_LCD_SIZE(2, 40)
- MCFG_KS0066_F05_ADD("ks0066_1")
- MCFG_HD44780_LCD_SIZE(2, 40)
+ KS0066_F05(config, m_lcdc0, 0);
+ m_lcdc0->set_lcd_size(2, 40);
+ KS0066_F05(config, m_lcdc1, 0);
+ m_lcdc1->set_lcd_size(2, 40);
RAM(config, RAM_TAG).set_default_size("128K");
/* video hardware */
- MCFG_SCREEN_ADD("screen", LCD)
- MCFG_SCREEN_REFRESH_RATE(50)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */
- MCFG_SCREEN_UPDATE_DRIVER(alphasmart_state, screen_update)
- MCFG_SCREEN_SIZE(6*40, 9*4)
- MCFG_SCREEN_VISIBLE_AREA(0, (6*40)-1, 0, (9*4)-1)
- MCFG_SCREEN_PALETTE("palette")
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_LCD));
+ screen.set_refresh_hz(50);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */
+ screen.set_screen_update(FUNC(alphasmart_state::screen_update));
+ screen.set_size(6*40, 9*4);
+ screen.set_visarea_full();
+ screen.set_palette("palette");
PALETTE(config, "palette", FUNC(alphasmart_state::alphasmart_palette), 2);
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(asma2k_state::asma2k)
+void asma2k_state::asma2k(machine_config &config)
+{
alphasmart(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(asma2k_mem)
-MACHINE_CONFIG_END
+ m_maincpu->set_addrmap(AS_PROGRAM, &asma2k_state::asma2k_mem);
+}
/* ROM definition */
ROM_START( asmapro )
diff --git a/src/mame/drivers/alphatpx.cpp b/src/mame/drivers/alphatpx.cpp
index 8fc6ee5dee5..060a89b1d53 100644
--- a/src/mame/drivers/alphatpx.cpp
+++ b/src/mame/drivers/alphatpx.cpp
@@ -1204,12 +1204,13 @@ void alphatp_12_state::machine_reset()
m_curfloppy = nullptr;
}
-MACHINE_CONFIG_START(alphatp_12_state::alphatp2)
- MCFG_DEVICE_ADD("maincpu", I8085A, 6_MHz_XTAL)
- MCFG_DEVICE_PROGRAM_MAP(alphatp2_mem)
- MCFG_DEVICE_IO_MAP(alphatp2_io)
+void alphatp_12_state::alphatp2(machine_config &config)
+{
+ i8085a_cpu_device &maincpu(I8085A(config, "maincpu", 6_MHz_XTAL));
+ maincpu.set_addrmap(AS_PROGRAM, &alphatp_12_state::alphatp2_mem);
+ maincpu.set_addrmap(AS_IO, &alphatp_12_state::alphatp2_io);
- MCFG_QUANTUM_PERFECT_CPU("maincpu")
+ config.m_perfect_cpu_quantum = subtag("maincpu");
I8041(config, m_kbdmcu, 12.8544_MHz_XTAL / 2);
m_kbdmcu->t0_in_cb().set(FUNC(alphatp_12_state::kbd_matrix_r));
@@ -1220,9 +1221,9 @@ MACHINE_CONFIG_START(alphatp_12_state::alphatp2)
ADDRESS_MAP_BANK(config, "bankdev").set_map(&alphatp_12_state::alphatp2_map).set_options(ENDIANNESS_LITTLE, 8, 18, 0x10000);
// video hardware
- MCFG_SCREEN_ADD_MONOCHROME("screen", RASTER, rgb_t::green())
- MCFG_SCREEN_RAW_PARAMS(12.8544_MHz_XTAL, 824, 0, 640, 312, 0, 288)
- MCFG_SCREEN_UPDATE_DRIVER(alphatp_12_state, screen_update)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER, rgb_t::green()));
+ screen.set_raw(12.8544_MHz_XTAL, 824, 0, 640, 312, 0, 288);
+ screen.set_screen_update(FUNC(alphatp_12_state::screen_update));
PALETTE(config, m_palette, palette_device::MONOCHROME);
@@ -1232,31 +1233,31 @@ MACHINE_CONFIG_START(alphatp_12_state::alphatp2)
m_crtc->vsyn_callback().set_inputline("maincpu", I8085_RST65_LINE).exor(1);
m_crtc->set_screen("screen");
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_alphatp3)
+ GFXDECODE(config, "gfxdecode", m_palette, gfx_alphatp3);
// sound hardware
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD( "beeper", BEEP, 1060 )
- MCFG_SOUND_ROUTE( ALL_OUTPUTS, "mono", 1.00 )
+ BEEP(config, m_beep, 1060).add_route(ALL_OUTPUTS, "mono", 1.00);
- MCFG_DEVICE_ADD("uart", I8251, 0)
+ I8251(config, "uart", 0);
// 4.9152_MHz_XTAL serial clock
FD1791(config, m_fdc, 4_MHz_XTAL / 4);
m_fdc->intrq_wr_callback().set(FUNC(alphatp_12_state::fdcirq_w));
m_fdc->drq_wr_callback().set(FUNC(alphatp_12_state::fdcdrq_w));
m_fdc->hld_wr_callback().set(FUNC(alphatp_12_state::fdchld_w));
- MCFG_FLOPPY_DRIVE_ADD("fdc:0", alphatp2_floppies, "525ssdd", floppy_image_device::default_floppy_formats)
- MCFG_FLOPPY_DRIVE_ADD("fdc:1", alphatp2_floppies, "525ssdd", floppy_image_device::default_floppy_formats)
-MACHINE_CONFIG_END
+ FLOPPY_CONNECTOR(config, "fdc:0", alphatp2_floppies, "525ssdd", floppy_image_device::default_floppy_formats);
+ FLOPPY_CONNECTOR(config, "fdc:1", alphatp2_floppies, "525ssdd", floppy_image_device::default_floppy_formats);
+}
-MACHINE_CONFIG_START(alphatp_12_state::alphatp2u)
+void alphatp_12_state::alphatp2u(machine_config &config)
+{
alphatp2(config);
- MCFG_DEVICE_REMOVE("fdc:0")
- MCFG_DEVICE_REMOVE("fdc:1")
- MCFG_FLOPPY_DRIVE_ADD("fdc:0", alphatp2su_floppies, "525dd", floppy_image_device::default_floppy_formats)
- MCFG_FLOPPY_DRIVE_ADD("fdc:1", alphatp2su_floppies, "525dd", floppy_image_device::default_floppy_formats)
-MACHINE_CONFIG_END
+ config.device_remove("fdc:0");
+ config.device_remove("fdc:1");
+ FLOPPY_CONNECTOR(config, "fdc:0", alphatp2su_floppies, "525dd", floppy_image_device::default_floppy_formats);
+ FLOPPY_CONNECTOR(config, "fdc:1", alphatp2su_floppies, "525dd", floppy_image_device::default_floppy_formats);
+}
//**************************************************************************
@@ -1281,12 +1282,13 @@ void alphatp_34_state::machine_reset()
m_curfloppy = nullptr;
m_88_da = m_85_da = m_88_started = false;
}
-MACHINE_CONFIG_START(alphatp_34_state::alphatp3)
- MCFG_DEVICE_ADD("maincpu", I8085A, 6_MHz_XTAL)
- MCFG_DEVICE_PROGRAM_MAP(alphatp3_mem)
- MCFG_DEVICE_IO_MAP(alphatp3_io)
+void alphatp_34_state::alphatp3(machine_config &config)
+{
+ i8085a_cpu_device &maincpu(I8085A(config, "maincpu", 6_MHz_XTAL));
+ maincpu.set_addrmap(AS_PROGRAM, &alphatp_34_state::alphatp3_mem);
+ maincpu.set_addrmap(AS_IO, &alphatp_34_state::alphatp3_io);
- MCFG_QUANTUM_PERFECT_CPU("maincpu")
+ config.m_perfect_cpu_quantum = subtag("maincpu");
I8041(config, m_kbdmcu, 12.8544_MHz_XTAL /2);
m_kbdmcu->t0_in_cb().set(FUNC(alphatp_34_state::kbd_matrix_r));
@@ -1297,9 +1299,9 @@ MACHINE_CONFIG_START(alphatp_34_state::alphatp3)
ADDRESS_MAP_BANK(config, "bankdev").set_map(&alphatp_34_state::alphatp3_map).set_options(ENDIANNESS_LITTLE, 8, 18, 0x10000);
// video hardware
- MCFG_SCREEN_ADD_MONOCHROME("screen", RASTER, rgb_t::green())
- MCFG_SCREEN_RAW_PARAMS(12.8544_MHz_XTAL, 824, 0, 640, 312, 0, 288)
- MCFG_SCREEN_UPDATE_DRIVER(alphatp_34_state, screen_update)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER, rgb_t::green()));
+ screen.set_raw(12.8544_MHz_XTAL, 824, 0, 640, 312, 0, 288);
+ screen.set_screen_update(FUNC(alphatp_34_state::screen_update));
PALETTE(config, m_palette, palette_device::MONOCHROME);
@@ -1308,23 +1310,22 @@ MACHINE_CONFIG_START(alphatp_34_state::alphatp3)
m_crtc->vsyn_callback().set_inputline("maincpu", I8085_RST65_LINE).exor(1);
m_crtc->set_screen("screen");
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_alphatp3)
+ GFXDECODE(config, "gfxdecode", m_palette, gfx_alphatp3);
// sound hardware
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD( "beeper", BEEP, 1060 )
- MCFG_SOUND_ROUTE( ALL_OUTPUTS, "mono", 1.00 )
+ BEEP(config, m_beep, 1060).add_route(ALL_OUTPUTS, "mono", 1.00);
- MCFG_DEVICE_ADD("uart", I8251, 0)
+ I8251(config, "uart", 0);
// 4.9152_MHz_XTAL serial clock
FD1791(config, m_fdc, 4_MHz_XTAL / 4);
m_fdc->intrq_wr_callback().set(FUNC(alphatp_34_state::fdcirq_w));
m_fdc->drq_wr_callback().set(FUNC(alphatp_34_state::fdcdrq_w));
m_fdc->hld_wr_callback().set(FUNC(alphatp_34_state::fdchld_w));
- MCFG_FLOPPY_DRIVE_ADD("fdc:0", alphatp3_floppies, "525qd", floppy_image_device::default_floppy_formats)
- MCFG_FLOPPY_DRIVE_ADD("fdc:1", alphatp3_floppies, "525qd", floppy_image_device::default_floppy_formats)
-MACHINE_CONFIG_END
+ FLOPPY_CONNECTOR(config, "fdc:0", alphatp3_floppies, "525qd", floppy_image_device::default_floppy_formats);
+ FLOPPY_CONNECTOR(config, "fdc:1", alphatp3_floppies, "525qd", floppy_image_device::default_floppy_formats);
+}
void alphatp_34_state::alphatp30(machine_config &config)
{
diff --git a/src/mame/drivers/alphatro.cpp b/src/mame/drivers/alphatro.cpp
index d173a2928c9..86885ce5761 100644
--- a/src/mame/drivers/alphatro.cpp
+++ b/src/mame/drivers/alphatro.cpp
@@ -731,9 +731,9 @@ static void alphatro_floppies(device_slot_interface &device)
MACHINE_CONFIG_START(alphatro_state::alphatro)
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, 16_MHz_XTAL / 4)
- MCFG_DEVICE_PROGRAM_MAP(alphatro_map)
- MCFG_DEVICE_IO_MAP(alphatro_io)
+ Z80(config, m_maincpu, 16_MHz_XTAL / 4);
+ m_maincpu->set_addrmap(AS_PROGRAM, &alphatro_state::alphatro_map);
+ m_maincpu->set_addrmap(AS_IO, &alphatro_state::alphatro_io);
/* video hardware */
screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
@@ -755,17 +755,17 @@ MACHINE_CONFIG_START(alphatro_state::alphatro)
UPD765A(config, m_fdc, 16_MHz_XTAL / 2, true, true); // clocked through SED-9420C
m_fdc->intrq_wr_callback().set(FUNC(alphatro_state::fdc_irq_w));
m_fdc->drq_wr_callback().set(m_dmac, FUNC(i8257_device::dreq2_w));
- MCFG_FLOPPY_DRIVE_ADD("fdc:0", alphatro_floppies, "525dd", alphatro_state::floppy_formats)
- MCFG_FLOPPY_DRIVE_ADD("fdc:1", alphatro_floppies, "525dd", alphatro_state::floppy_formats)
- MCFG_SOFTWARE_LIST_ADD("flop_list", "alphatro_flop")
+ FLOPPY_CONNECTOR(config, "fdc:0", alphatro_floppies, "525dd", alphatro_state::floppy_formats);
+ FLOPPY_CONNECTOR(config, "fdc:1", alphatro_floppies, "525dd", alphatro_state::floppy_formats);
+ SOFTWARE_LIST(config, "flop_list").set_original("alphatro_flop");
I8257(config, m_dmac, 16_MHz_XTAL / 4);
m_dmac->out_hrq_cb().set(FUNC(alphatro_state::hrq_w));
m_dmac->in_memr_cb().set(FUNC(alphatro_state::ram0000_r));
m_dmac->out_memw_cb().set(FUNC(alphatro_state::ram0000_w));
- m_dmac->in_ior_cb<2>().set("fdc", FUNC(upd765a_device::mdma_r));
- m_dmac->out_iow_cb<2>().set("fdc", FUNC(upd765a_device::mdma_w));
- m_dmac->out_tc_cb().set("fdc", FUNC(upd765a_device::tc_line_w));
+ m_dmac->in_ior_cb<2>().set(m_fdc, FUNC(upd765a_device::dma_r));
+ m_dmac->out_iow_cb<2>().set(m_fdc, FUNC(upd765a_device::dma_w));
+ m_dmac->out_tc_cb().set(m_fdc, FUNC(upd765a_device::tc_line_w));
HD6845(config, m_crtc, 16_MHz_XTAL / 8);
m_crtc->set_screen(m_screen);
@@ -780,13 +780,13 @@ MACHINE_CONFIG_START(alphatro_state::alphatro)
usart_clock.signal_handler().set(m_usart, FUNC(i8251_device::write_txc));
usart_clock.signal_handler().append(m_usart, FUNC(i8251_device::write_rxc));
- MCFG_CASSETTE_ADD("cassette")
- MCFG_CASSETTE_DEFAULT_STATE(CASSETTE_PLAY | CASSETTE_MOTOR_ENABLED | CASSETTE_SPEAKER_ENABLED)
- MCFG_CASSETTE_INTERFACE("alphatro_cass")
- MCFG_SOFTWARE_LIST_ADD("cass_list","alphatro_cass")
+ CASSETTE(config, m_cass);
+ m_cass->set_default_state(CASSETTE_PLAY | CASSETTE_MOTOR_ENABLED | CASSETTE_SPEAKER_ENABLED);
+ m_cass->set_interface("alphatro_cass");
+ SOFTWARE_LIST(config, "cass_list").set_original("alphatro_cass");
- MCFG_TIMER_DRIVER_ADD_PERIODIC("timer_c", alphatro_state, timer_c, attotime::from_hz(4800))
- MCFG_TIMER_DRIVER_ADD_PERIODIC("timer_p", alphatro_state, timer_p, attotime::from_hz(40000))
+ TIMER(config, "timer_c").configure_periodic(FUNC(alphatro_state::timer_c), attotime::from_hz(4800));
+ TIMER(config, "timer_p").configure_periodic(FUNC(alphatro_state::timer_p), attotime::from_hz(40000));
RAM(config, "ram").set_default_size("64K");
@@ -794,7 +794,7 @@ MACHINE_CONFIG_START(alphatro_state::alphatro)
MCFG_GENERIC_CARTSLOT_ADD("cartslot", generic_plain_slot, "alphatro_cart")
MCFG_GENERIC_EXTENSIONS("bin")
MCFG_GENERIC_LOAD(alphatro_state, cart_load)
- MCFG_SOFTWARE_LIST_ADD("cart_list","alphatro_cart")
+ SOFTWARE_LIST(config, "cart_list").set_original("alphatro_cart");
/* 0000 banking */
ADDRESS_MAP_BANK(config, "lowbank").set_map(&alphatro_state::rombank_map).set_options(ENDIANNESS_BIG, 8, 32, 0x6000);
diff --git a/src/mame/drivers/altair.cpp b/src/mame/drivers/altair.cpp
index 2c7d771b7c6..76b451ee24f 100644
--- a/src/mame/drivers/altair.cpp
+++ b/src/mame/drivers/altair.cpp
@@ -119,7 +119,7 @@ void altair_state::altair(machine_config &config)
uart_clock.signal_handler().append("acia", FUNC(acia6850_device::write_rxc));
/* quickload */
- QUICKLOAD(config, "quickload", 0).set_handler(snapquick_load_delegate(&QUICKLOAD_LOAD_NAME(altair_state, altair), this), "bin", 0);
+ QUICKLOAD(config, "quickload").set_handler(snapquick_load_delegate(&QUICKLOAD_LOAD_NAME(altair_state, altair), this), "bin");
}
/* ROM definition */
diff --git a/src/mame/drivers/alto1.cpp b/src/mame/drivers/alto1.cpp
index 3031a9a937e..d59d46922e4 100644
--- a/src/mame/drivers/alto1.cpp
+++ b/src/mame/drivers/alto1.cpp
@@ -30,8 +30,9 @@ private:
static INPUT_PORTS_START( alto1 )
INPUT_PORTS_END
-MACHINE_CONFIG_START(alto1_state::alto1)
-MACHINE_CONFIG_END
+void alto1_state::alto1(machine_config &config)
+{
+}
ROM_START( alto1 )
ROM_REGION( 0x4000, "roms", 0 )
diff --git a/src/mame/drivers/alto2.cpp b/src/mame/drivers/alto2.cpp
index 21681a5131a..480666fc0d9 100644
--- a/src/mame/drivers/alto2.cpp
+++ b/src/mame/drivers/alto2.cpp
@@ -280,14 +280,15 @@ void alto2_state::alto2_iomem_map(address_map &map)
map(0, 2*ALTO2_RAM_SIZE-1).m(m_maincpu, FUNC(alto2_cpu_device::iomem_map));
}
-MACHINE_CONFIG_START(alto2_state::alto2)
+void alto2_state::alto2(machine_config &config)
+{
// Basic machine hardware
// SYSCLK is Display Control part A51 (tagged 29.4MHz) divided by 5(?)
// 5.8MHz according to de.wikipedia.org/wiki/Xerox_Alto
- MCFG_DEVICE_ADD("maincpu", ALTO2, XTAL(29'491'200)/5)
- MCFG_DEVICE_PROGRAM_MAP(alto2_ucode_map)
- MCFG_DEVICE_DATA_MAP(alto2_const_map)
- MCFG_DEVICE_IO_MAP(alto2_iomem_map)
+ ALTO2(config, m_maincpu, XTAL(29'491'200)/5);
+ m_maincpu->set_addrmap(AS_PROGRAM, &alto2_state::alto2_ucode_map);
+ m_maincpu->set_addrmap(AS_DATA, &alto2_state::alto2_const_map);
+ m_maincpu->set_addrmap(AS_IO, &alto2_state::alto2_iomem_map);
// Video hardware
screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
@@ -302,11 +303,11 @@ MACHINE_CONFIG_START(alto2_state::alto2)
// Sound hardware
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("speaker", SPEAKER_SOUND)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.80)
+ SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.80);
- MCFG_DIABLO_DRIVES_ADD()
-MACHINE_CONFIG_END
+ DIABLO_HD(config, DIABLO_HD_0, 3333333);
+ DIABLO_HD(config, DIABLO_HD_1, 3333333);
+ }
/* Driver Init */
diff --git a/src/mame/drivers/altos5.cpp b/src/mame/drivers/altos5.cpp
index 6d2547a8f20..e47462843a8 100644
--- a/src/mame/drivers/altos5.cpp
+++ b/src/mame/drivers/altos5.cpp
@@ -470,13 +470,11 @@ MACHINE_CONFIG_START(altos5_state::altos5)
FD1797(config, m_fdc, 8_MHz_XTAL / 8);
m_fdc->intrq_wr_callback().set(FUNC(altos5_state::fdc_intrq_w));
m_fdc->drq_wr_callback().set(m_dma, FUNC(z80dma_device::rdy_w));
- MCFG_FLOPPY_DRIVE_ADD("fdc:0", altos5_floppies, "525qd", floppy_image_device::default_floppy_formats)
- MCFG_FLOPPY_DRIVE_SOUND(true)
- MCFG_FLOPPY_DRIVE_ADD("fdc:1", altos5_floppies, "525qd", floppy_image_device::default_floppy_formats)
- MCFG_FLOPPY_DRIVE_SOUND(true)
+ FLOPPY_CONNECTOR(config, "fdc:0", altos5_floppies, "525qd", floppy_image_device::default_floppy_formats).enable_sound(true);
+ FLOPPY_CONNECTOR(config, "fdc:1", altos5_floppies, "525qd", floppy_image_device::default_floppy_formats).enable_sound(true);
- MCFG_SOFTWARE_LIST_ADD("flop_list", "altos5")
- MCFG_QUICKLOAD_ADD("quickload", altos5_state, altos5, "com,cpm", 3)
+ SOFTWARE_LIST(config, "flop_list").set_original("altos5");
+ MCFG_QUICKLOAD_ADD("quickload", altos5_state, altos5, "com,cpm", attotime::from_seconds(3))
MACHINE_CONFIG_END
diff --git a/src/mame/drivers/alvg.cpp b/src/mame/drivers/alvg.cpp
index 150803c825a..64badefb851 100644
--- a/src/mame/drivers/alvg.cpp
+++ b/src/mame/drivers/alvg.cpp
@@ -45,11 +45,12 @@ void alvg_state::init_alvg()
{
}
-MACHINE_CONFIG_START(alvg_state::alvg)
+void alvg_state::alvg(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M65C02, 2000000)
- MCFG_DEVICE_PROGRAM_MAP(alvg_map)
-MACHINE_CONFIG_END
+ M65C02(config, m_maincpu, 2000000);
+ m_maincpu->set_addrmap(AS_PROGRAM, &alvg_state::alvg_map);
+}
/*----------------------------------------------------------------------------
/ A.G. Soccer Ball - A.G. Football has identical ROMs but different playfield
diff --git a/src/mame/drivers/amaticmg.cpp b/src/mame/drivers/amaticmg.cpp
index 7f6547c4133..5c22c61027c 100644
--- a/src/mame/drivers/amaticmg.cpp
+++ b/src/mame/drivers/amaticmg.cpp
@@ -846,11 +846,12 @@ void amaticmg_state::machine_reset()
* Machine Drivers *
************************************/
-MACHINE_CONFIG_START(amaticmg_state::amaticmg)
+void amaticmg_state::amaticmg(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, CPU_CLOCK) /* WRONG! */
- MCFG_DEVICE_PROGRAM_MAP(amaticmg_map)
- MCFG_DEVICE_IO_MAP(amaticmg_portmap)
+ Z80(config, m_maincpu, CPU_CLOCK); /* WRONG! */
+ m_maincpu->set_addrmap(AS_PROGRAM, &amaticmg_state::amaticmg_map);
+ m_maincpu->set_addrmap(AS_IO, &amaticmg_state::amaticmg_portmap);
// NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
@@ -866,13 +867,13 @@ MACHINE_CONFIG_START(amaticmg_state::amaticmg)
ppi1.out_pc_callback().set(FUNC(amaticmg_state::out_c_w));
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(512, 256)
- MCFG_SCREEN_VISIBLE_AREA(0, 512-1, 0, 256-1)
- MCFG_SCREEN_UPDATE_DRIVER(amaticmg_state, screen_update_amaticmg)
- MCFG_SCREEN_PALETTE(m_palette)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(512, 256);
+ screen.set_visarea_full();
+ screen.set_screen_update(FUNC(amaticmg_state::screen_update_amaticmg));
+ screen.set_palette(m_palette);
mc6845_device &crtc(MC6845(config, "crtc", CRTC_CLOCK));
crtc.set_screen("screen");
@@ -886,9 +887,8 @@ MACHINE_CONFIG_START(amaticmg_state::amaticmg)
/* sound hardware */
SPEAKER(config, "speaker").front_center();
- MCFG_DEVICE_ADD("ymsnd", YM3812, SND_CLOCK) /* Y3014B DAC */
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 0.5)
-MACHINE_CONFIG_END
+ YM3812(config, "ymsnd", SND_CLOCK).add_route(ALL_OUTPUTS, "speaker", 0.5); /* Y3014B DAC */
+}
WRITE_LINE_MEMBER(amaticmg_state::amaticmg2_irq)
@@ -898,42 +898,40 @@ WRITE_LINE_MEMBER(amaticmg_state::amaticmg2_irq)
}
-MACHINE_CONFIG_START(amaticmg_state::amaticmg2)
+void amaticmg_state::amaticmg2(machine_config &config)
+{
amaticmg(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_IO_MAP(amaticmg2_portmap)
+ m_maincpu->set_addrmap(AS_IO, &amaticmg_state::amaticmg2_portmap);
I8255A(config, "ppi8255_2"); // MG4: 0x89 -> A:out; B:out; C(h):in; C(l):in.
- MCFG_SCREEN_MODIFY("screen")
- MCFG_SCREEN_UPDATE_DRIVER(amaticmg_state, screen_update_amaticmg2)
+ subdevice<screen_device>("screen")->set_screen_update(FUNC(amaticmg_state::screen_update_amaticmg2));
subdevice<mc6845_device>("crtc")->out_vsync_callback().set(FUNC(amaticmg_state::amaticmg2_irq));
- MCFG_GFXDECODE_MODIFY("gfxdecode", gfx_amaticmg2)
+ m_gfxdecode->set_info(gfx_amaticmg2);
m_palette->set_init(FUNC(amaticmg_state::amaticmg2_palette));
m_palette->set_entries(0x10000);
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(amaticmg_state::amaticmg4)
+void amaticmg_state::amaticmg4(machine_config &config)
+{
amaticmg(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_IO_MAP(amaticmg4_portmap)
+ m_maincpu->set_addrmap(AS_IO, &amaticmg_state::amaticmg4_portmap);
I8255A(config, "ppi8255_2"); // MG4: 0x89 -> A:out; B:out; C(h):in; C(l):in.
- MCFG_SCREEN_MODIFY("screen")
- MCFG_SCREEN_UPDATE_DRIVER(amaticmg_state, screen_update_amaticmg2)
+ subdevice<screen_device>("screen")->set_screen_update(FUNC(amaticmg_state::screen_update_amaticmg2));
subdevice<mc6845_device>("crtc")->out_vsync_callback().set(FUNC(amaticmg_state::amaticmg2_irq));
- MCFG_GFXDECODE_MODIFY("gfxdecode", gfx_amaticmg2)
+ m_gfxdecode->set_info(gfx_amaticmg2);
m_palette->set_init(FUNC(amaticmg_state::amaticmg2_palette));
m_palette->set_entries(0x10000);
-MACHINE_CONFIG_END
+}
/************************************
diff --git a/src/mame/drivers/ambush.cpp b/src/mame/drivers/ambush.cpp
index 2b37533538a..0e15f2331aa 100644
--- a/src/mame/drivers/ambush.cpp
+++ b/src/mame/drivers/ambush.cpp
@@ -724,21 +724,22 @@ WRITE8_MEMBER(ambush_state::output_latches_w)
// MACHINE DEFINTIONS
//**************************************************************************
-MACHINE_CONFIG_START(ambush_state::ambush_base)
- MCFG_DEVICE_ADD("maincpu", Z80, XTAL(18'432'000)/6)
- MCFG_DEVICE_PROGRAM_MAP(main_map)
- MCFG_DEVICE_IO_MAP(main_portmap)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", ambush_state, irq0_line_hold)
+void ambush_state::ambush_base(machine_config &config)
+{
+ z80_device &maincpu(Z80(config, "maincpu", XTAL(18'432'000)/6));
+ maincpu.set_addrmap(AS_PROGRAM, &ambush_state::main_map);
+ maincpu.set_addrmap(AS_IO, &ambush_state::main_portmap);
+ maincpu.set_vblank_int("screen", FUNC(ambush_state::irq0_line_hold));
WATCHDOG_TIMER(config, "watchdog");
MCFG_MACHINE_START_OVERRIDE(ambush_state, ambush)
// video hardware
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_RAW_PARAMS(XTAL(18'432'000)/3, 384, 0, 256, 264, 16, 240)
- MCFG_SCREEN_UPDATE_DRIVER(ambush_state, screen_update)
- MCFG_SCREEN_PALETTE("palette")
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_raw(XTAL(18'432'000)/3, 384, 0, 256, 264, 16, 240);
+ screen.set_screen_update(FUNC(ambush_state::screen_update));
+ screen.set_palette("palette");
GFXDECODE(config, m_gfxdecode, "palette", gfx_ambush);
@@ -753,7 +754,7 @@ MACHINE_CONFIG_START(ambush_state::ambush_base)
ay8912_device &ay2(AY8912(config, "ay2", XTAL(18'432'000)/6/2));
ay2.port_a_read_callback().set_ioport("joystick");
ay2.add_route(ALL_OUTPUTS, "mono", 0.33);
-MACHINE_CONFIG_END
+}
void ambush_state::ambush(machine_config &config)
{
@@ -770,10 +771,10 @@ void ambush_state::ambush(machine_config &config)
m_outlatch[1]->q_out_cb<7>().set(FUNC(ambush_state::coin_counter_2_w));
}
-MACHINE_CONFIG_START(ambush_state::mariobl)
+void ambush_state::mariobl(machine_config &config)
+{
ambush_base(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(bootleg_map)
+ subdevice<z80_device>("maincpu")->set_addrmap(AS_PROGRAM, &ambush_state::bootleg_map);
// To be verified: do these bootlegs only have one LS259?
ls259_device &outlatch(LS259(config, "outlatch"));
@@ -782,10 +783,9 @@ MACHINE_CONFIG_START(ambush_state::mariobl)
MCFG_MACHINE_START_OVERRIDE(ambush_state, mariobl)
- MCFG_SCREEN_MODIFY("screen")
- MCFG_SCREEN_UPDATE_DRIVER(ambush_state, screen_update_bootleg)
+ subdevice<screen_device>("screen")->set_screen_update(FUNC(ambush_state::screen_update_bootleg));
- MCFG_GFXDECODE_MODIFY("gfxdecode", gfx_mariobl)
+ m_gfxdecode->set_info(gfx_mariobl);
subdevice<palette_device>("palette")->set_init(FUNC(ambush_state::mario_palette));
@@ -796,9 +796,10 @@ MACHINE_CONFIG_START(ambush_state::mariobl)
ay8910_device &ay2(AY8910(config.replace(), "ay2", XTAL(18'432'000)/6/2));
ay2.port_a_read_callback().set_ioport("joystick");
ay2.add_route(ALL_OUTPUTS, "mono", 0.33);
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(ambush_state::mariobla)
+void ambush_state::mariobla(machine_config &config)
+{
mariobl(config);
subdevice<palette_device>("palette")->set_init(FUNC(ambush_state::mariobla_palette));
@@ -806,17 +807,18 @@ MACHINE_CONFIG_START(ambush_state::mariobla)
auto &outlatch(*subdevice<ls259_device>("outlatch"));
outlatch.q_out_cb<5>().set(FUNC(ambush_state::color_bank_1_w));
outlatch.q_out_cb<6>().set_nop();
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(ambush_state::dkong3abl)
+void ambush_state::dkong3abl(machine_config &config)
+{
mariobl(config);
MCFG_MACHINE_START_OVERRIDE(ambush_state, dkong3abl)
- MCFG_GFXDECODE_MODIFY("gfxdecode", gfx_dkong3abl)
+ m_gfxdecode->set_info(gfx_dkong3abl);
subdevice<palette_device>("palette")->set_init(FUNC(ambush_state::dkong3_palette));
-MACHINE_CONFIG_END
+}
//**************************************************************************
diff --git a/src/mame/drivers/amerihok.cpp b/src/mame/drivers/amerihok.cpp
index 369f0bf885f..73276053c03 100644
--- a/src/mame/drivers/amerihok.cpp
+++ b/src/mame/drivers/amerihok.cpp
@@ -39,20 +39,44 @@ private:
virtual void machine_start() override;
virtual void machine_reset() override;
- DECLARE_WRITE8_MEMBER(control_w);
+ void control_w(u8 data);
+ void p2_w(u8 data);
+ u8 p3_r();
- required_device<cpu_device> m_maincpu;
+ required_device<z8_device> m_maincpu;
required_device<okim6376_device> m_oki;
void amerihok_data_map(address_map &map);
void amerihok_map(address_map &map);
+
+ u32 m_outputs[2];
+ u32 m_latched_outputs[2];
+ u8 m_old_p2;
};
-WRITE8_MEMBER(amerihok_state::control_w)
+void amerihok_state::control_w(u8 data)
{
m_oki->st_w(!BIT(data, 4));
m_oki->ch2_w(!BIT(data, 7));
}
+void amerihok_state::p2_w(u8 data)
+{
+ if (BIT(data, 5) && !BIT(m_old_p2, 5))
+ {
+ m_outputs[1] = (m_outputs[1] << 1) | BIT(m_outputs[0], 31);
+ m_outputs[0] = (m_outputs[0] << 1) | BIT(data, 6);
+ }
+
+ if (BIT(data, 7) && (m_outputs[0] != m_latched_outputs[0] || m_outputs[1] != m_latched_outputs[1]))
+ {
+ m_latched_outputs[0] = m_outputs[0];
+ m_latched_outputs[1] = m_outputs[1];
+ logerror("Outputs = %08X%08X\n", m_latched_outputs[1], m_latched_outputs[0]);
+ }
+
+ m_old_p2 = data;
+}
+
void amerihok_state::amerihok_map(address_map &map)
{
map(0x0000, 0xffff).rom().region("maincpu", 0);
@@ -60,17 +84,49 @@ void amerihok_state::amerihok_map(address_map &map)
void amerihok_state::amerihok_data_map(address_map &map)
{
+ map(0x1000, 0x1000).portr("1000");
map(0x2000, 0x2000).w(FUNC(amerihok_state::control_w));
+ map(0x3000, 0x3000).portr("3000");
map(0x4000, 0x4000).w(m_oki, FUNC(okim6376_device::write));
}
static INPUT_PORTS_START( amerihok )
+ PORT_START("1000")
+ PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_BUTTON1) PORT_CODE(KEYCODE_Z)
+ PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_BUTTON2) PORT_CODE(KEYCODE_X)
+ PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_BUTTON3) PORT_CODE(KEYCODE_C)
+ PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_BUTTON4) PORT_CODE(KEYCODE_V)
+ PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_BUTTON5) PORT_CODE(KEYCODE_B)
+ PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_BUTTON6) PORT_CODE(KEYCODE_N)
+ PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_BUTTON7) PORT_CODE(KEYCODE_M)
+ PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_BUTTON8) PORT_CODE(KEYCODE_COMMA)
+
+ PORT_START("3000")
+ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_OTHER) PORT_CODE(KEYCODE_A) PORT_NAME("Score Visitor")
+ PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_OTHER) PORT_CODE(KEYCODE_S) PORT_NAME("Score Home")
+ PORT_BIT(0xfc, IP_ACTIVE_HIGH, IPT_UNUSED)
+
+ PORT_START("P2")
+ PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_BUTTON9) PORT_CODE(KEYCODE_STOP)
+ PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_BUTTON10) PORT_CODE(KEYCODE_SLASH)
+ PORT_BIT(0xee, IP_ACTIVE_LOW, IPT_UNUSED)
+
+ PORT_START("P3")
+ PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_UNUSED)
+ PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_CUSTOM) PORT_READ_LINE_DEVICE_MEMBER("oki", okim6376_device, busy_r)
+ PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_COIN1)
+ PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_COIN2)
INPUT_PORTS_END
void amerihok_state::machine_start()
{
+ std::fill(std::begin(m_outputs), std::end(m_outputs), 0);
+ std::fill(std::begin(m_latched_outputs), std::end(m_latched_outputs), 0);
+
+ save_item(NAME(m_outputs));
+ save_item(NAME(m_latched_outputs));
}
void amerihok_state::machine_reset()
@@ -78,19 +134,21 @@ void amerihok_state::machine_reset()
}
-MACHINE_CONFIG_START(amerihok_state::amerihok)
-
- /* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z8681, 12_MHz_XTAL)
- MCFG_DEVICE_PROGRAM_MAP(amerihok_map)
- MCFG_DEVICE_DATA_MAP(amerihok_data_map)
+void amerihok_state::amerihok(machine_config &config)
+{
+ Z8681(config, m_maincpu, 12_MHz_XTAL);
+ m_maincpu->set_addrmap(AS_PROGRAM, &amerihok_state::amerihok_map);
+ m_maincpu->set_addrmap(AS_DATA, &amerihok_state::amerihok_data_map);
+ m_maincpu->p2_in_cb().set_ioport("P2");
+ m_maincpu->p2_out_cb().set(FUNC(amerihok_state::p2_w));
+ m_maincpu->p3_in_cb().set_ioport("P3");
/* sound hardware */
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("oki", OKIM6376, 1000000) // 64-pin QFP (probably actually MSM6650)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
-MACHINE_CONFIG_END
+ OKIM6376(config, m_oki, 12_MHz_XTAL / 96); // 64-pin QFP, type/clock unverified (probably clocked by Z8681 TOUT)
+ m_oki->add_route(ALL_OUTPUTS, "mono", 1.0);
+}
diff --git a/src/mame/drivers/amico2k.cpp b/src/mame/drivers/amico2k.cpp
index f6dcebdf5b7..cf3874d260c 100644
--- a/src/mame/drivers/amico2k.cpp
+++ b/src/mame/drivers/amico2k.cpp
@@ -215,10 +215,11 @@ void amico2k_state::machine_start()
save_item(NAME(m_segment));
}
-MACHINE_CONFIG_START(amico2k_state::amico2k)
+void amico2k_state::amico2k(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M6502, 1000000) /* 1MHz */
- MCFG_DEVICE_PROGRAM_MAP(amico2k_mem)
+ M6502(config, m_maincpu, 1000000); /* 1MHz */
+ m_maincpu->set_addrmap(AS_PROGRAM, &amico2k_state::amico2k_mem);
/* video hardware */
config.set_default_layout(layout_amico2k);
@@ -228,7 +229,7 @@ MACHINE_CONFIG_START(amico2k_state::amico2k)
ppi.out_pa_callback().set(FUNC(amico2k_state::ppi_pa_w));
ppi.in_pb_callback().set(FUNC(amico2k_state::ppi_pb_r));
ppi.out_pb_callback().set(FUNC(amico2k_state::ppi_pb_w));
-MACHINE_CONFIG_END
+}
/* ROM definition */
diff --git a/src/mame/drivers/amiga.cpp b/src/mame/drivers/amiga.cpp
index a8d41f300ae..c963688ee98 100644
--- a/src/mame/drivers/amiga.cpp
+++ b/src/mame/drivers/amiga.cpp
@@ -29,6 +29,14 @@
//**************************************************************************
+// CONSTANTS / MACROS
+//**************************************************************************
+
+#define EXP_SLOT_TAG "exp"
+#define ZORROBUS_TAG "zorrobus"
+
+
+//**************************************************************************
// PRIVATE DEVICES
//**************************************************************************
@@ -609,7 +617,7 @@ WRITE16_MEMBER( a500p_state::clock_w )
READ8_MEMBER( cdtv_state::dmac_scsi_data_read )
{
if (offset >= 0xb0 && offset <= 0xbf)
- return m_tpi->read(space, offset);
+ return m_tpi->read(offset);
return 0xff;
}
@@ -617,7 +625,7 @@ READ8_MEMBER( cdtv_state::dmac_scsi_data_read )
WRITE8_MEMBER( cdtv_state::dmac_scsi_data_write )
{
if (offset >= 0xb0 && offset <= 0xbf)
- m_tpi->write(space, offset, data);
+ m_tpi->write(offset, data);
}
READ8_MEMBER( cdtv_state::dmac_io_read )
@@ -1152,7 +1160,7 @@ WRITE8_MEMBER( cd32_state::akiko_cia_0_port_a_write )
// bit 1, power led
m_power_led = BIT(~data, 1);
- handle_joystick_cia(data, m_cia_0->read(space, 2));
+ handle_joystick_cia(data, m_cia_0->read(2));
}
@@ -1557,7 +1565,8 @@ static void amiga_floppies(device_slot_interface &device)
}
// basic elements common to all amigas
-MACHINE_CONFIG_START(amiga_state::amiga_base)
+void amiga_state::amiga_base(machine_config &config)
+{
// video
pal_video(config);
@@ -1583,13 +1592,13 @@ MACHINE_CONFIG_START(amiga_state::amiga_base)
// audio
SPEAKER(config, "lspeaker").front_left();
SPEAKER(config, "rspeaker").front_right();
- paula_8364_device &paula(PAULA_8364(config, "amiga", amiga_state::CLK_C1_PAL));
- paula.add_route(0, "lspeaker", 0.50);
- paula.add_route(1, "rspeaker", 0.50);
- paula.add_route(2, "rspeaker", 0.50);
- paula.add_route(3, "lspeaker", 0.50);
- paula.mem_read_cb().set(FUNC(amiga_state::chip_ram_r));
- paula.int_cb().set(FUNC(amiga_state::paula_int_w));
+ PAULA_8364(config, m_paula, amiga_state::CLK_C1_PAL);
+ m_paula->add_route(0, "lspeaker", 0.50);
+ m_paula->add_route(1, "rspeaker", 0.50);
+ m_paula->add_route(2, "rspeaker", 0.50);
+ m_paula->add_route(3, "lspeaker", 0.50);
+ m_paula->mem_read_cb().set(FUNC(amiga_state::chip_ram_r));
+ m_paula->int_cb().set(FUNC(amiga_state::paula_int_w));
// floppy drives
AMIGA_FDC(config, m_fdc, amiga_state::CLK_7M_PAL);
@@ -1597,14 +1606,10 @@ MACHINE_CONFIG_START(amiga_state::amiga_base)
m_fdc->write_dma_callback().set(FUNC(amiga_state::chip_ram_w));
m_fdc->dskblk_callback().set(FUNC(amiga_state::fdc_dskblk_w));
m_fdc->dsksyn_callback().set(FUNC(amiga_state::fdc_dsksyn_w));
- MCFG_FLOPPY_DRIVE_ADD("fdc:0", amiga_floppies, "35dd", amiga_fdc_device::floppy_formats)
- MCFG_FLOPPY_DRIVE_SOUND(true)
- MCFG_FLOPPY_DRIVE_ADD("fdc:1", amiga_floppies, nullptr, amiga_fdc_device::floppy_formats)
- MCFG_FLOPPY_DRIVE_SOUND(true)
- MCFG_FLOPPY_DRIVE_ADD("fdc:2", amiga_floppies, nullptr, amiga_fdc_device::floppy_formats)
- MCFG_FLOPPY_DRIVE_SOUND(true)
- MCFG_FLOPPY_DRIVE_ADD("fdc:3", amiga_floppies, nullptr, amiga_fdc_device::floppy_formats)
- MCFG_FLOPPY_DRIVE_SOUND(true)
+ FLOPPY_CONNECTOR(config, "fdc:0", amiga_floppies, "35dd", amiga_fdc_device::floppy_formats).enable_sound(true);
+ FLOPPY_CONNECTOR(config, "fdc:1", amiga_floppies, nullptr, amiga_fdc_device::floppy_formats).enable_sound(true);
+ FLOPPY_CONNECTOR(config, "fdc:2", amiga_floppies, nullptr, amiga_fdc_device::floppy_formats).enable_sound(true);
+ FLOPPY_CONNECTOR(config, "fdc:3", amiga_floppies, nullptr, amiga_fdc_device::floppy_formats).enable_sound(true);
// rs232
rs232_port_device &rs232(RS232_PORT(config, "rs232", default_rs232_devices, nullptr));
@@ -1615,22 +1620,25 @@ MACHINE_CONFIG_START(amiga_state::amiga_base)
rs232.cts_handler().set(FUNC(amiga_state::rs232_cts_w));
// centronics
- MCFG_DEVICE_ADD("centronics", CENTRONICS, centronics_devices, "printer")
- MCFG_CENTRONICS_ACK_HANDLER(WRITELINE(*this, amiga_state, centronics_ack_w))
- MCFG_CENTRONICS_BUSY_HANDLER(WRITELINE(*this, amiga_state, centronics_busy_w))
- MCFG_CENTRONICS_PERROR_HANDLER(WRITELINE(*this, amiga_state, centronics_perror_w))
- MCFG_CENTRONICS_SELECT_HANDLER(WRITELINE(*this, amiga_state, centronics_select_w))
- MCFG_CENTRONICS_OUTPUT_LATCH_ADD("cent_data_out", "centronics")
+ CENTRONICS(config, m_centronics, centronics_devices, "printer");
+ m_centronics->ack_handler().set(FUNC(amiga_state::centronics_ack_w));
+ m_centronics->busy_handler().set(FUNC(amiga_state::centronics_busy_w));
+ m_centronics->perror_handler().set(FUNC(amiga_state::centronics_perror_w));
+ m_centronics->select_handler().set(FUNC(amiga_state::centronics_select_w));
+
+ output_latch_device &cent_data_out(OUTPUT_LATCH(config, "cent_data_out"));
+ m_centronics->set_output_latch(cent_data_out);
// software
- MCFG_SOFTWARE_LIST_ADD("wb_list", "amiga_workbench")
- MCFG_SOFTWARE_LIST_ADD("hardware_list", "amiga_hardware")
- MCFG_SOFTWARE_LIST_ADD("apps_list", "amiga_apps")
- MCFG_SOFTWARE_LIST_ADD("flop_list", "amiga_flop")
- MCFG_SOFTWARE_LIST_ADD("ocs_list", "amigaocs_flop")
-MACHINE_CONFIG_END
-
-MACHINE_CONFIG_START(a1000_state::a1000)
+ SOFTWARE_LIST(config, "wb_list").set_original("amiga_workbench");
+ SOFTWARE_LIST(config, "hardware_list").set_original("amiga_hardware");
+ SOFTWARE_LIST(config, "apps_list").set_original("amiga_apps");
+ SOFTWARE_LIST(config, "flop_list").set_original("amiga_flop");
+ SOFTWARE_LIST(config, "ocs_list").set_original("amigaocs_flop");
+}
+
+void a1000_state::a1000(machine_config &config)
+{
amiga_base(config);
// keyboard
@@ -1643,33 +1651,30 @@ MACHINE_CONFIG_START(a1000_state::a1000)
.kbrst_cb().set(FUNC(a1000_state::kbreset_w));
// main cpu
- MCFG_DEVICE_ADD("maincpu", M68000, amiga_state::CLK_7M_PAL)
- MCFG_DEVICE_PROGRAM_MAP(a1000_mem)
+ M68000(config, m_maincpu, amiga_state::CLK_7M_PAL);
+ m_maincpu->set_addrmap(AS_PROGRAM, &a1000_state::a1000_mem);
ADDRESS_MAP_BANK(config, "overlay").set_map(&a1000_state::a1000_overlay_map).set_options(ENDIANNESS_BIG, 16, 22, 0x200000);
ADDRESS_MAP_BANK(config, "bootrom").set_map(&a1000_state::a1000_bootrom_map).set_options(ENDIANNESS_BIG, 16, 19, 0x40000);
- MCFG_SOFTWARE_LIST_ADD("a1000_list", "amiga_a1000")
-MACHINE_CONFIG_END
+ SOFTWARE_LIST(config, "a1000_list").set_original("amiga_a1000");
+}
-MACHINE_CONFIG_START(a1000_state::a1000n)
+void a1000_state::a1000n(machine_config &config)
+{
a1000(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_CLOCK(amiga_state::CLK_7M_NTSC)
- MCFG_DEVICE_REMOVE("screen")
+ m_maincpu->set_clock(amiga_state::CLK_7M_NTSC);
+ config.device_remove("screen");
ntsc_video(config);
- MCFG_DEVICE_MODIFY("amiga")
- MCFG_DEVICE_CLOCK(amiga_state::CLK_C1_NTSC)
- MCFG_DEVICE_MODIFY("cia_0")
- MCFG_DEVICE_CLOCK(amiga_state::CLK_E_NTSC)
- MCFG_DEVICE_MODIFY("cia_1")
- MCFG_DEVICE_CLOCK(amiga_state::CLK_E_NTSC)
- MCFG_DEVICE_MODIFY("fdc")
- MCFG_DEVICE_CLOCK(amiga_state::CLK_7M_NTSC)
-MACHINE_CONFIG_END
-
-MACHINE_CONFIG_START(a2000_state::a2000)
+ m_paula->set_clock(amiga_state::CLK_C1_NTSC);
+ m_cia_0->set_clock(amiga_state::CLK_E_NTSC);
+ m_cia_1->set_clock(amiga_state::CLK_E_NTSC);
+ m_fdc->set_clock(amiga_state::CLK_7M_NTSC);
+}
+
+void a2000_state::a2000(machine_config &config)
+{
amiga_base(config);
// keyboard
@@ -1682,46 +1687,45 @@ MACHINE_CONFIG_START(a2000_state::a2000)
.kbrst_cb().set(FUNC(a2000_state::kbreset_w));
// main cpu
- MCFG_DEVICE_ADD("maincpu", M68000, amiga_state::CLK_7M_PAL)
- MCFG_DEVICE_PROGRAM_MAP(a2000_mem)
+ M68000(config, m_maincpu, amiga_state::CLK_7M_PAL);
+ m_maincpu->set_addrmap(AS_PROGRAM, &a2000_state::a2000_mem);
ADDRESS_MAP_BANK(config, "overlay").set_map(&amiga_state::overlay_512kb_map).set_options(ENDIANNESS_BIG, 16, 22, 0x200000);
// real-time clock
- MCFG_DEVICE_ADD("u65", MSM6242, XTAL(32'768))
+ MSM6242(config, m_rtc, XTAL(32'768));
// cpu slot
- MCFG_EXPANSION_SLOT_ADD("maincpu", a2000_expansion_cards, nullptr)
+ EXP_SLOT(config, EXP_SLOT_TAG, 0).set_space(m_maincpu, AS_PROGRAM);
+ ZORRO_SLOT(config, "slot", EXP_SLOT_TAG, a2000_expansion_cards, nullptr);
// zorro slots
- MCFG_ZORRO2_ADD("maincpu")
- MCFG_ZORRO2_INT2_HANDLER(WRITELINE(*this, a2000_state, zorro2_int2_w))
- MCFG_ZORRO2_INT6_HANDLER(WRITELINE(*this, a2000_state, zorro2_int6_w))
- MCFG_ZORRO2_SLOT_ADD("zorro1", zorro2_cards, nullptr)
- MCFG_ZORRO2_SLOT_ADD("zorro2", zorro2_cards, nullptr)
- MCFG_ZORRO2_SLOT_ADD("zorro3", zorro2_cards, nullptr)
- MCFG_ZORRO2_SLOT_ADD("zorro4", zorro2_cards, nullptr)
- MCFG_ZORRO2_SLOT_ADD("zorro5", zorro2_cards, nullptr)
-MACHINE_CONFIG_END
-
-MACHINE_CONFIG_START(a2000_state::a2000n)
+ ZORRO2(config, m_zorro, 0);
+ m_zorro->set_space(m_maincpu, AS_PROGRAM);
+ m_zorro->int2_handler().set(FUNC(a2000_state::zorro2_int2_w));
+ m_zorro->int6_handler().set(FUNC(a2000_state::zorro2_int6_w));
+ ZORRO_SLOT(config, "zorro1", m_zorro, zorro2_cards, nullptr);
+ ZORRO_SLOT(config, "zorro2", m_zorro, zorro2_cards, nullptr);
+ ZORRO_SLOT(config, "zorro3", m_zorro, zorro2_cards, nullptr);
+ ZORRO_SLOT(config, "zorro4", m_zorro, zorro2_cards, nullptr);
+ ZORRO_SLOT(config, "zorro5", m_zorro, zorro2_cards, nullptr);
+}
+
+void a2000_state::a2000n(machine_config &config)
+{
a2000(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_CLOCK(amiga_state::CLK_7M_NTSC)
- MCFG_DEVICE_REMOVE("screen")
+ m_maincpu->set_clock(amiga_state::CLK_7M_NTSC);
+ config.device_remove("screen");
ntsc_video(config);
- MCFG_DEVICE_MODIFY("amiga")
- MCFG_DEVICE_CLOCK(amiga_state::CLK_C1_NTSC)
- MCFG_DEVICE_MODIFY("cia_0")
- MCFG_DEVICE_CLOCK(amiga_state::CLK_E_NTSC)
- MCFG_DEVICE_MODIFY("cia_1")
- MCFG_DEVICE_CLOCK(amiga_state::CLK_E_NTSC)
- MCFG_DEVICE_MODIFY("fdc")
- MCFG_DEVICE_CLOCK(amiga_state::CLK_7M_NTSC)
-MACHINE_CONFIG_END
-
-MACHINE_CONFIG_START(a500_state::a500)
+ m_paula->set_clock(amiga_state::CLK_C1_NTSC);
+ m_cia_0->set_clock(amiga_state::CLK_E_NTSC);
+ m_cia_1->set_clock(amiga_state::CLK_E_NTSC);
+ m_fdc->set_clock(amiga_state::CLK_7M_NTSC);
+}
+
+void a500_state::a500(machine_config &config)
+{
amiga_base(config);
// keyboard
@@ -1731,34 +1735,32 @@ MACHINE_CONFIG_START(a500_state::a500)
kbd.krst_handler().set(FUNC(amiga_state::kbreset_w));
// main cpu
- MCFG_DEVICE_ADD("maincpu", M68000, amiga_state::CLK_7M_PAL)
- MCFG_DEVICE_PROGRAM_MAP(a500_mem)
+ M68000(config, m_maincpu, amiga_state::CLK_7M_PAL);
+ m_maincpu->set_addrmap(AS_PROGRAM, &a500_state::a500_mem);
ADDRESS_MAP_BANK(config, "overlay").set_map(&amiga_state::overlay_1mb_map).set_options(ENDIANNESS_BIG, 16, 22, 0x200000);
// cpu slot
- MCFG_EXPANSION_SLOT_ADD("maincpu", a500_expansion_cards, nullptr)
- MCFG_EXPANSION_SLOT_INT2_HANDLER(WRITELINE(*this, a500_state, side_int2_w))
- MCFG_EXPANSION_SLOT_INT6_HANDLER(WRITELINE(*this, a500_state, side_int6_w))
-MACHINE_CONFIG_END
+ EXP_SLOT(config, m_side, 0).set_space(m_maincpu, AS_PROGRAM);
+ m_side->int2_handler().set(FUNC(a500_state::side_int2_w));
+ m_side->int6_handler().set(FUNC(a500_state::side_int6_w));
+ ZORRO_SLOT(config, "slot", m_side, a500_expansion_cards, nullptr);
+}
-MACHINE_CONFIG_START(a500_state::a500n)
+void a500_state::a500n(machine_config &config)
+{
a500(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_CLOCK(amiga_state::CLK_7M_NTSC)
- MCFG_DEVICE_REMOVE("screen")
+ m_maincpu->set_clock(amiga_state::CLK_7M_NTSC);
+ config.device_remove("screen");
ntsc_video(config);
- MCFG_DEVICE_MODIFY("amiga")
- MCFG_DEVICE_CLOCK(amiga_state::CLK_C1_NTSC)
- MCFG_DEVICE_MODIFY("cia_0")
- MCFG_DEVICE_CLOCK(amiga_state::CLK_E_NTSC)
- MCFG_DEVICE_MODIFY("cia_1")
- MCFG_DEVICE_CLOCK(amiga_state::CLK_E_NTSC)
- MCFG_DEVICE_MODIFY("fdc")
- MCFG_DEVICE_CLOCK(amiga_state::CLK_7M_NTSC)
-MACHINE_CONFIG_END
-
-MACHINE_CONFIG_START(cdtv_state::cdtv)
+ m_paula->set_clock(amiga_state::CLK_C1_NTSC);
+ m_cia_0->set_clock(amiga_state::CLK_E_NTSC);
+ m_cia_1->set_clock(amiga_state::CLK_E_NTSC);
+ m_fdc->set_clock(amiga_state::CLK_7M_NTSC);
+}
+
+void cdtv_state::cdtv(machine_config &config)
+{
amiga_base(config);
// keyboard
@@ -1771,18 +1773,18 @@ MACHINE_CONFIG_START(cdtv_state::cdtv)
.kbrst_cb().set(FUNC(a1000_state::kbreset_w));
// main cpu
- MCFG_DEVICE_ADD("maincpu", M68000, amiga_state::CLK_7M_PAL)
- MCFG_DEVICE_PROGRAM_MAP(cdtv_mem)
+ M68000(config, m_maincpu, amiga_state::CLK_7M_PAL);
+ m_maincpu->set_addrmap(AS_PROGRAM, &cdtv_state::cdtv_mem);
// remote control input converter
- MCFG_DEVICE_ADD("u75", M6502, XTAL(3'000'000))
- MCFG_DEVICE_PROGRAM_MAP(cdtv_rc_mem)
- MCFG_DEVICE_DISABLE()
+ m6502_device &u75(M6502(config, "u75", XTAL(3'000'000)));
+ u75.set_addrmap(AS_PROGRAM, &cdtv_state::cdtv_rc_mem);
+ u75.set_disable();
// lcd controller
#if 0
- MCFG_DEVICE_ADD("u62", LC6554, XTAL(4'000'000))
- MCFG_DEVICE_PROGRAM_MAP(lcd_mem)
+ lc6554_device &u62(LC6554(config, "u62", XTAL(4'000'000))); // device isn't emulated yet
+ u62.set_addrmap(AS_PROGRAM, &cdtv_state::lcd_mem);
#endif
ADDRESS_MAP_BANK(config, "overlay").set_map(&amiga_state::overlay_1mb_map).set_options(ENDIANNESS_BIG, 16, 22, 0x200000);
@@ -1794,7 +1796,7 @@ MACHINE_CONFIG_START(cdtv_state::cdtv)
NVRAM(config, "memcard", nvram_device::DEFAULT_ALL_0);
// real-time clock
- MCFG_DEVICE_ADD("u61", MSM6242, XTAL(32'768))
+ MSM6242(config, m_rtc, XTAL(32'768));
// cd-rom controller
AMIGA_DMAC(config, m_dmac, amiga_state::CLK_7M_PAL);
@@ -1804,42 +1806,38 @@ MACHINE_CONFIG_START(cdtv_state::cdtv)
m_dmac->io_write_handler().set(FUNC(cdtv_state::dmac_io_write));
m_dmac->int_handler().set(FUNC(cdtv_state::dmac_int_w));
- tpi6525_device &tpi(TPI6525(config, "u32", 0));
- tpi.out_irq_cb().set(FUNC(cdtv_state::tpi_int_w));
- tpi.out_pb_cb().set(FUNC(cdtv_state::tpi_port_b_write));
+ TPI6525(config, m_tpi, 0);
+ m_tpi->out_irq_cb().set(FUNC(cdtv_state::tpi_int_w));
+ m_tpi->out_pb_cb().set(FUNC(cdtv_state::tpi_port_b_write));
// cd-rom
CR511B(config, m_cdrom, 0);
- m_cdrom->scor_handler().set("u32", FUNC(tpi6525_device::i1_w)).invert();
- m_cdrom->stch_handler().set("u32", FUNC(tpi6525_device::i2_w)).invert();
- m_cdrom->sten_handler().set("u32", FUNC(tpi6525_device::i3_w));
- m_cdrom->xaen_handler().set("u32", FUNC(tpi6525_device::pb2_w));
- m_cdrom->drq_handler().set("u36", FUNC(amiga_dmac_device::xdreq_w));
- m_cdrom->dten_handler().set("u36", FUNC(amiga_dmac_device::xdreq_w));
+ m_cdrom->scor_handler().set(m_tpi, FUNC(tpi6525_device::i1_w)).invert();
+ m_cdrom->stch_handler().set(m_tpi, FUNC(tpi6525_device::i2_w)).invert();
+ m_cdrom->sten_handler().set(m_tpi, FUNC(tpi6525_device::i3_w));
+ m_cdrom->xaen_handler().set(m_tpi, FUNC(tpi6525_device::pb2_w));
+ m_cdrom->drq_handler().set(m_dmac, FUNC(amiga_dmac_device::xdreq_w));
+ m_cdrom->dten_handler().set(m_dmac, FUNC(amiga_dmac_device::xdreq_w));
// software
- MCFG_SOFTWARE_LIST_ADD("cd_list", "cdtv")
-MACHINE_CONFIG_END
+ SOFTWARE_LIST(config, "cd_list").set_original("cdtv");
+}
-MACHINE_CONFIG_START(cdtv_state::cdtvn)
+void cdtv_state::cdtvn(machine_config &config)
+{
cdtv(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_CLOCK(amiga_state::CLK_7M_NTSC)
- MCFG_DEVICE_REMOVE("screen")
+ m_maincpu->set_clock(amiga_state::CLK_7M_NTSC);
+ config.device_remove("screen");
ntsc_video(config);
- MCFG_DEVICE_MODIFY("amiga")
- MCFG_DEVICE_CLOCK(amiga_state::CLK_C1_NTSC)
- MCFG_DEVICE_MODIFY("cia_0")
- MCFG_DEVICE_CLOCK(amiga_state::CLK_E_NTSC)
- MCFG_DEVICE_MODIFY("cia_1")
- MCFG_DEVICE_CLOCK(amiga_state::CLK_E_NTSC)
- MCFG_DEVICE_MODIFY("u36")
- MCFG_DEVICE_CLOCK(amiga_state::CLK_7M_NTSC)
- MCFG_DEVICE_MODIFY("fdc")
- MCFG_DEVICE_CLOCK(amiga_state::CLK_7M_NTSC)
-MACHINE_CONFIG_END
-
-MACHINE_CONFIG_START(a3000_state::a3000)
+ m_paula->set_clock(amiga_state::CLK_C1_NTSC);
+ m_cia_0->set_clock(amiga_state::CLK_E_NTSC);
+ m_cia_1->set_clock(amiga_state::CLK_E_NTSC);
+ m_dmac->set_clock(amiga_state::CLK_7M_NTSC);
+ m_fdc->set_clock(amiga_state::CLK_7M_NTSC);
+}
+
+void a3000_state::a3000(machine_config &config)
+{
amiga_base(config);
// keyboard
@@ -1848,8 +1846,8 @@ MACHINE_CONFIG_START(a3000_state::a3000)
kbd.kdat_handler().set("cia_0", FUNC(mos8520_device::sp_w));
// main cpu
- MCFG_DEVICE_ADD("maincpu", M68030, XTAL(32'000'000) / 2)
- MCFG_DEVICE_PROGRAM_MAP(a3000_mem)
+ M68030(config, m_maincpu, XTAL(32'000'000) / 2);
+ m_maincpu->set_addrmap(AS_PROGRAM, &a3000_state::a3000_mem);
ADDRESS_MAP_BANK(config, "overlay").set_map(&amiga_state::overlay_1mb_map32).set_options(ENDIANNESS_BIG, 32, 22, 0x200000);
@@ -1859,23 +1857,22 @@ MACHINE_CONFIG_START(a3000_state::a3000)
// todo: zorro3 slots, super dmac, scsi
// software
- MCFG_SOFTWARE_LIST_ADD("a3000_list", "amiga_a3000")
- MCFG_SOFTWARE_LIST_ADD("ecs_list", "amigaecs_flop")
-MACHINE_CONFIG_END
+ SOFTWARE_LIST(config, "a3000_list").set_original("amiga_a3000");
+ SOFTWARE_LIST(config, "ecs_list").set_original("amigaecs_flop");
+}
-MACHINE_CONFIG_START(a3000_state::a3000n)
+void a3000_state::a3000n(machine_config &config)
+{
a3000(config);
- MCFG_DEVICE_REMOVE("screen")
+ config.device_remove("screen");
ntsc_video(config);
- MCFG_DEVICE_MODIFY("cia_0")
- MCFG_DEVICE_CLOCK(amiga_state::CLK_E_NTSC)
- MCFG_DEVICE_MODIFY("cia_1")
- MCFG_DEVICE_CLOCK(amiga_state::CLK_E_NTSC)
- MCFG_DEVICE_MODIFY("fdc")
- MCFG_DEVICE_CLOCK(amiga_state::CLK_7M_NTSC)
-MACHINE_CONFIG_END
-
-MACHINE_CONFIG_START(a500p_state::a500p)
+ m_cia_0->set_clock(amiga_state::CLK_E_NTSC);
+ m_cia_1->set_clock(amiga_state::CLK_E_NTSC);
+ m_fdc->set_clock(amiga_state::CLK_7M_NTSC);
+}
+
+void a500p_state::a500p(machine_config &config)
+{
amiga_base(config);
// keyboard
@@ -1885,38 +1882,36 @@ MACHINE_CONFIG_START(a500p_state::a500p)
kbd.krst_handler().set(FUNC(amiga_state::kbreset_w));
// main cpu
- MCFG_DEVICE_ADD("maincpu", M68000, amiga_state::CLK_7M_PAL)
- MCFG_DEVICE_PROGRAM_MAP(a500p_mem)
+ M68000(config, m_maincpu, amiga_state::CLK_7M_PAL);
+ m_maincpu->set_addrmap(AS_PROGRAM, &a500p_state::a500p_mem);
ADDRESS_MAP_BANK(config, "overlay").set_map(&amiga_state::overlay_1mb_map).set_options(ENDIANNESS_BIG, 16, 22, 0x200000);
// real-time clock
- MCFG_DEVICE_ADD("u9", MSM6242, XTAL(32'768))
+ MSM6242(config, m_rtc, XTAL(32'768));
// cpu slot
- MCFG_EXPANSION_SLOT_ADD("maincpu", a500_expansion_cards, nullptr)
+ EXP_SLOT(config, m_side, 0).set_space(m_maincpu, AS_PROGRAM);
+ ZORRO_SLOT(config, "slot", m_side, a500_expansion_cards, nullptr);
// software
- MCFG_SOFTWARE_LIST_ADD("ecs_list", "amigaecs_flop")
-MACHINE_CONFIG_END
+ SOFTWARE_LIST(config, "ecs_list").set_original("amigaecs_flop");
+}
-MACHINE_CONFIG_START(a500p_state::a500pn)
+void a500p_state::a500pn(machine_config &config)
+{
a500p(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_CLOCK(amiga_state::CLK_7M_NTSC)
- MCFG_DEVICE_REMOVE("screen")
+ m_maincpu->set_clock(amiga_state::CLK_7M_NTSC);
+ config.device_remove("screen");
ntsc_video(config);
- MCFG_DEVICE_MODIFY("amiga")
- MCFG_DEVICE_CLOCK(amiga_state::CLK_C1_NTSC)
- MCFG_DEVICE_MODIFY("cia_0")
- MCFG_DEVICE_CLOCK(amiga_state::CLK_E_NTSC)
- MCFG_DEVICE_MODIFY("cia_1")
- MCFG_DEVICE_CLOCK(amiga_state::CLK_E_NTSC)
- MCFG_DEVICE_MODIFY("fdc")
- MCFG_DEVICE_CLOCK(amiga_state::CLK_7M_NTSC)
-MACHINE_CONFIG_END
-
-MACHINE_CONFIG_START(a600_state::a600)
+ m_paula->set_clock(amiga_state::CLK_C1_NTSC);
+ m_cia_0->set_clock(amiga_state::CLK_E_NTSC);
+ m_cia_1->set_clock(amiga_state::CLK_E_NTSC);
+ m_fdc->set_clock(amiga_state::CLK_7M_NTSC);
+}
+
+void a600_state::a600(machine_config &config)
+{
amiga_base(config);
// keyboard
@@ -1926,8 +1921,8 @@ MACHINE_CONFIG_START(a600_state::a600)
kbd.krst_handler().set(FUNC(amiga_state::kbreset_w));
// main cpu
- MCFG_DEVICE_ADD("maincpu", M68000, amiga_state::CLK_7M_PAL)
- MCFG_DEVICE_PROGRAM_MAP(a600_mem)
+ M68000(config, m_maincpu, amiga_state::CLK_7M_PAL);
+ m_maincpu->set_addrmap(AS_PROGRAM, &a600_state::a600_mem);
ADDRESS_MAP_BANK(config, "overlay").set_map(&amiga_state::overlay_2mb_map16).set_options(ENDIANNESS_BIG, 16, 22, 0x200000);
@@ -1945,28 +1940,24 @@ MACHINE_CONFIG_START(a600_state::a600)
// todo: pcmcia
// software
- MCFG_SOFTWARE_LIST_ADD("ecs_list", "amigaecs_flop")
-MACHINE_CONFIG_END
+ SOFTWARE_LIST(config, "ecs_list").set_original("amigaecs_flop");
+}
-MACHINE_CONFIG_START(a600_state::a600n)
+void a600_state::a600n(machine_config &config)
+{
a600(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_CLOCK(amiga_state::CLK_7M_NTSC)
- MCFG_DEVICE_MODIFY("gayle")
- MCFG_DEVICE_CLOCK(amiga_state::CLK_28M_NTSC / 2)
- MCFG_DEVICE_REMOVE("screen")
+ m_maincpu->set_clock(amiga_state::CLK_7M_NTSC);
+ subdevice<gayle_device>("gayle")->set_clock(amiga_state::CLK_28M_NTSC / 2);
+ config.device_remove("screen");
ntsc_video(config);
- MCFG_DEVICE_MODIFY("amiga")
- MCFG_DEVICE_CLOCK(amiga_state::CLK_C1_NTSC)
- MCFG_DEVICE_MODIFY("cia_0")
- MCFG_DEVICE_CLOCK(amiga_state::CLK_E_NTSC)
- MCFG_DEVICE_MODIFY("cia_1")
- MCFG_DEVICE_CLOCK(amiga_state::CLK_E_NTSC)
- MCFG_DEVICE_MODIFY("fdc")
- MCFG_DEVICE_CLOCK(amiga_state::CLK_7M_NTSC)
-MACHINE_CONFIG_END
-
-MACHINE_CONFIG_START(a1200_state::a1200)
+ m_paula->set_clock(amiga_state::CLK_C1_NTSC);
+ m_cia_0->set_clock(amiga_state::CLK_E_NTSC);
+ m_cia_1->set_clock(amiga_state::CLK_E_NTSC);
+ m_fdc->set_clock(amiga_state::CLK_7M_NTSC);
+}
+
+void a1200_state::a1200(machine_config &config)
+{
amiga_base(config);
// keyboard
@@ -1976,16 +1967,15 @@ MACHINE_CONFIG_START(a1200_state::a1200)
kbd.krst_handler().set(FUNC(amiga_state::kbreset_w));
// main cpu
- MCFG_DEVICE_ADD("maincpu", M68EC020, amiga_state::CLK_28M_PAL / 2)
- MCFG_DEVICE_PROGRAM_MAP(a1200_mem)
+ M68EC020(config, m_maincpu, amiga_state::CLK_28M_PAL / 2);
+ m_maincpu->set_addrmap(AS_PROGRAM, &a1200_state::a1200_mem);
ADDRESS_MAP_BANK(config, "overlay").set_map(&amiga_state::overlay_2mb_map32).set_options(ENDIANNESS_BIG, 32, 22, 0x200000);
- MCFG_DEVICE_MODIFY("screen")
- MCFG_SCREEN_UPDATE_DRIVER(amiga_state, screen_update_amiga_aga)
- MCFG_SCREEN_NO_PALETTE
+ m_screen->set_screen_update(FUNC(amiga_state::screen_update_amiga_aga));
+ m_screen->set_palette(finder_base::DUMMY_TAG);
- MCFG_DEVICE_REMOVE("palette")
+ config.device_remove("palette");
MCFG_VIDEO_START_OVERRIDE(amiga_state, amiga_aga)
@@ -2002,39 +1992,33 @@ MACHINE_CONFIG_START(a1200_state::a1200)
// keyboard
#if 0
- MCFG_DEVICE_MODIFY("kbd")
- MCFG_SLOT_DEFAULT_OPTION("a1200_us")
+ subdevice<amiga_keyboard_bus_device>("kbd").set_default_option("a1200_us");
#endif
// todo: pcmcia
// software
- MCFG_SOFTWARE_LIST_ADD("aga_list", "amigaaga_flop")
- MCFG_SOFTWARE_LIST_ADD("ecs_list", "amigaecs_flop")
-MACHINE_CONFIG_END
+ SOFTWARE_LIST(config, "aga_list").set_original("amigaaga_flop");
+ SOFTWARE_LIST(config, "ecs_list").set_original("amigaecs_flop");
+}
-MACHINE_CONFIG_START(a1200_state::a1200n)
+void a1200_state::a1200n(machine_config &config)
+{
a1200(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_CLOCK(amiga_state::CLK_28M_NTSC / 2)
- MCFG_DEVICE_MODIFY("gayle")
- MCFG_DEVICE_CLOCK(amiga_state::CLK_28M_NTSC / 2)
- MCFG_DEVICE_REMOVE("screen")
+ m_maincpu->set_clock(amiga_state::CLK_28M_NTSC / 2);
+ subdevice<gayle_device>("gayle")->set_clock(amiga_state::CLK_28M_NTSC / 2);
+ config.device_remove("screen");
ntsc_video(config);
- MCFG_DEVICE_MODIFY("screen")
- MCFG_SCREEN_UPDATE_DRIVER(amiga_state, screen_update_amiga_aga)
- MCFG_SCREEN_NO_PALETTE
- MCFG_DEVICE_MODIFY("amiga")
- MCFG_DEVICE_CLOCK(amiga_state::CLK_C1_NTSC)
- MCFG_DEVICE_MODIFY("cia_0")
- MCFG_DEVICE_CLOCK(amiga_state::CLK_E_NTSC)
- MCFG_DEVICE_MODIFY("cia_1")
- MCFG_DEVICE_CLOCK(amiga_state::CLK_E_NTSC)
- MCFG_DEVICE_MODIFY("fdc")
- MCFG_DEVICE_CLOCK(amiga_state::CLK_7M_NTSC)
-MACHINE_CONFIG_END
-
-MACHINE_CONFIG_START(a4000_state::a4000)
+ m_screen->set_screen_update(FUNC(amiga_state::screen_update_amiga_aga));
+ m_screen->set_palette(finder_base::DUMMY_TAG);
+ m_paula->set_clock(amiga_state::CLK_C1_NTSC);
+ m_cia_0->set_clock(amiga_state::CLK_E_NTSC);
+ m_cia_1->set_clock(amiga_state::CLK_E_NTSC);
+ m_fdc->set_clock(amiga_state::CLK_7M_NTSC);
+}
+
+void a4000_state::a4000(machine_config &config)
+{
amiga_base(config);
// keyboard
@@ -2043,16 +2027,15 @@ MACHINE_CONFIG_START(a4000_state::a4000)
kbd.kdat_handler().set("cia_0", FUNC(mos8520_device::sp_w));
// main cpu
- MCFG_DEVICE_ADD("maincpu", M68040, XTAL(50'000'000) / 2)
- MCFG_DEVICE_PROGRAM_MAP(a4000_mem)
+ M68040(config, m_maincpu, XTAL(50'000'000) / 2);
+ m_maincpu->set_addrmap(AS_PROGRAM, &a4000_state::a4000_mem);
ADDRESS_MAP_BANK(config, "overlay").set_map(&amiga_state::overlay_2mb_map32).set_options(ENDIANNESS_BIG, 32, 22, 0x200000);
- MCFG_DEVICE_MODIFY("screen")
- MCFG_SCREEN_UPDATE_DRIVER(amiga_state, screen_update_amiga_aga)
- MCFG_SCREEN_NO_PALETTE
+ m_screen->set_screen_update(FUNC(amiga_state::screen_update_amiga_aga));
+ m_screen->set_palette(finder_base::DUMMY_TAG);
- MCFG_DEVICE_REMOVE("palette")
+ config.device_remove("palette");
MCFG_VIDEO_START_OVERRIDE(amiga_state, amiga_aga)
@@ -2066,61 +2049,54 @@ MACHINE_CONFIG_START(a4000_state::a4000)
// todo: zorro3
// software
- MCFG_SOFTWARE_LIST_ADD("aga_list", "amigaaga_flop")
- MCFG_SOFTWARE_LIST_ADD("ecs_list", "amigaecs_flop")
-MACHINE_CONFIG_END
+ SOFTWARE_LIST(config, "aga_list").set_original("amigaaga_flop");
+ SOFTWARE_LIST(config, "ecs_list").set_original("amigaecs_flop");
+}
-MACHINE_CONFIG_START(a4000_state::a4000n)
+void a4000_state::a4000n(machine_config &config)
+{
a4000(config);
- MCFG_DEVICE_REMOVE("screen")
+ config.device_remove("screen");
ntsc_video(config);
- MCFG_DEVICE_MODIFY("screen")
- MCFG_SCREEN_UPDATE_DRIVER(amiga_state, screen_update_amiga_aga)
- MCFG_SCREEN_NO_PALETTE
- MCFG_DEVICE_MODIFY("amiga")
- MCFG_DEVICE_CLOCK(amiga_state::CLK_C1_NTSC)
- MCFG_DEVICE_MODIFY("cia_0")
- MCFG_DEVICE_CLOCK(amiga_state::CLK_E_NTSC)
- MCFG_DEVICE_MODIFY("cia_1")
- MCFG_DEVICE_CLOCK(amiga_state::CLK_E_NTSC)
- MCFG_DEVICE_MODIFY("fdc")
- MCFG_DEVICE_CLOCK(amiga_state::CLK_7M_NTSC)
-MACHINE_CONFIG_END
-
-MACHINE_CONFIG_START(a4000_state::a400030)
+ m_screen->set_screen_update(FUNC(amiga_state::screen_update_amiga_aga));
+ m_screen->set_palette(finder_base::DUMMY_TAG);
+ m_paula->set_clock(amiga_state::CLK_C1_NTSC);
+ m_cia_0->set_clock(amiga_state::CLK_E_NTSC);
+ m_cia_1->set_clock(amiga_state::CLK_E_NTSC);
+ m_fdc->set_clock(amiga_state::CLK_7M_NTSC);
+}
+
+void a4000_state::a400030(machine_config &config)
+{
a4000(config);
// main cpu
- MCFG_DEVICE_REMOVE("maincpu")
- MCFG_DEVICE_ADD("maincpu", M68EC030, XTAL(50'000'000) / 2)
- MCFG_DEVICE_PROGRAM_MAP(a400030_mem)
+ M68EC030(config.replace(), m_maincpu, XTAL(50'000'000) / 2);
+ m_maincpu->set_addrmap(AS_PROGRAM, &a4000_state::a400030_mem);
// todo: ide
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(a4000_state::a400030n)
+void a4000_state::a400030n(machine_config &config)
+{
a400030(config);
- MCFG_DEVICE_REMOVE("screen")
+ config.device_remove("screen");
ntsc_video(config);
- MCFG_DEVICE_MODIFY("screen")
- MCFG_SCREEN_UPDATE_DRIVER(amiga_state, screen_update_amiga_aga)
- MCFG_SCREEN_NO_PALETTE
- MCFG_DEVICE_MODIFY("amiga")
- MCFG_DEVICE_CLOCK(amiga_state::CLK_C1_NTSC)
- MCFG_DEVICE_MODIFY("cia_0")
- MCFG_DEVICE_CLOCK(amiga_state::CLK_E_NTSC)
- MCFG_DEVICE_MODIFY("cia_1")
- MCFG_DEVICE_CLOCK(amiga_state::CLK_E_NTSC)
- MCFG_DEVICE_MODIFY("fdc")
- MCFG_DEVICE_CLOCK(amiga_state::CLK_7M_NTSC)
-MACHINE_CONFIG_END
-
-MACHINE_CONFIG_START(cd32_state::cd32)
+ m_screen->set_screen_update(FUNC(amiga_state::screen_update_amiga_aga));
+ m_screen->set_palette(finder_base::DUMMY_TAG);
+ m_paula->set_clock(amiga_state::CLK_C1_NTSC);
+ m_cia_0->set_clock(amiga_state::CLK_E_NTSC);
+ m_cia_1->set_clock(amiga_state::CLK_E_NTSC);
+ m_fdc->set_clock(amiga_state::CLK_7M_NTSC);
+}
+
+void cd32_state::cd32(machine_config &config)
+{
amiga_base(config);
// main cpu
- MCFG_DEVICE_ADD("maincpu", M68EC020, amiga_state::CLK_28M_PAL / 2)
- MCFG_DEVICE_PROGRAM_MAP(cd32_mem)
+ M68EC020(config, m_maincpu, amiga_state::CLK_28M_PAL / 2);
+ m_maincpu->set_addrmap(AS_PROGRAM, &cd32_state::cd32_mem);
ADDRESS_MAP_BANK(config, "overlay").set_map(&amiga_state::overlay_2mb_map32).set_options(ENDIANNESS_BIG, 32, 22, 0x200000);
@@ -2134,74 +2110,62 @@ MACHINE_CONFIG_START(cd32_state::cd32)
akiko.sda_r_callback().set("i2cmem", FUNC(i2cmem_device::read_sda));
akiko.sda_w_callback().set("i2cmem", FUNC(i2cmem_device::write_sda));
- MCFG_DEVICE_MODIFY("screen")
- MCFG_SCREEN_UPDATE_DRIVER(amiga_state, screen_update_amiga_aga)
- MCFG_SCREEN_NO_PALETTE
+ m_screen->set_screen_update(FUNC(amiga_state::screen_update_amiga_aga));
+ m_screen->set_palette(finder_base::DUMMY_TAG);
- MCFG_DEVICE_REMOVE("palette")
+ config.device_remove("palette");
MCFG_VIDEO_START_OVERRIDE(amiga_state, amiga_aga)
- MCFG_DEVICE_ADD("cdda", CDDA)
- MCFG_SOUND_ROUTE(0, "lspeaker", 0.50)
- MCFG_SOUND_ROUTE(1, "rspeaker", 0.50)
+ CDDA(config, m_cdda);
+ m_cdda->add_route(0, "lspeaker", 0.50);
+ m_cdda->add_route(1, "rspeaker", 0.50);
- MCFG_DEVICE_MODIFY("cia_0")
- MCFG_MOS6526_PA_OUTPUT_CALLBACK(WRITE8(*this, cd32_state, akiko_cia_0_port_a_write))
- MCFG_MOS6526_SP_CALLBACK(NOOP)
+ m_cia_0->pa_wr_callback().set(FUNC(cd32_state::akiko_cia_0_port_a_write));
+ m_cia_0->sp_wr_callback().set_nop();
- MCFG_CDROM_ADD("cdrom")
- MCFG_CDROM_INTERFACE("cd32_cdrom")
- MCFG_SOFTWARE_LIST_ADD("cd_list", "cd32")
-MACHINE_CONFIG_END
+ CDROM(config, "cdrom").set_interface("cd32_cdrom");
+ SOFTWARE_LIST(config, "cd_list").set_original("cd32");
+}
-MACHINE_CONFIG_START(cd32_state::cd32n)
+void cd32_state::cd32n(machine_config &config)
+{
cd32(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_CLOCK(amiga_state::CLK_28M_NTSC / 2)
- MCFG_DEVICE_REMOVE("screen")
+ m_maincpu->set_clock(amiga_state::CLK_28M_NTSC / 2);
+ config.device_remove("screen");
ntsc_video(config);
- MCFG_DEVICE_MODIFY("screen")
- MCFG_SCREEN_UPDATE_DRIVER(amiga_state, screen_update_amiga_aga)
- MCFG_SCREEN_NO_PALETTE
- MCFG_DEVICE_MODIFY("amiga")
- MCFG_DEVICE_CLOCK(amiga_state::CLK_C1_NTSC)
- MCFG_DEVICE_MODIFY("cia_0")
- MCFG_DEVICE_CLOCK(amiga_state::CLK_E_NTSC)
- MCFG_DEVICE_MODIFY("cia_1")
- MCFG_DEVICE_CLOCK(amiga_state::CLK_E_NTSC)
- MCFG_DEVICE_MODIFY("fdc")
- MCFG_DEVICE_CLOCK(amiga_state::CLK_7M_NTSC)
-MACHINE_CONFIG_END
-
-MACHINE_CONFIG_START(a4000_state::a4000t)
+ m_screen->set_screen_update(FUNC(amiga_state::screen_update_amiga_aga));
+ m_screen->set_palette(finder_base::DUMMY_TAG);
+ m_paula->set_clock(amiga_state::CLK_C1_NTSC);
+ m_cia_0->set_clock(amiga_state::CLK_E_NTSC);
+ m_cia_1->set_clock(amiga_state::CLK_E_NTSC);
+ m_fdc->set_clock(amiga_state::CLK_7M_NTSC);
+}
+
+void a4000_state::a4000t(machine_config &config)
+{
a4000(config);
// main cpu
- MCFG_DEVICE_REMOVE("maincpu")
- MCFG_DEVICE_ADD("maincpu", M68040, XTAL(50'000'000) / 2)
- MCFG_DEVICE_PROGRAM_MAP(a4000t_mem)
+ M68040(config.replace(), m_maincpu, XTAL(50'000'000) / 2);
+ m_maincpu->set_addrmap(AS_PROGRAM, &a4000_state::a4000t_mem);
// todo: ide, zorro3, scsi, super dmac
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(a4000_state::a4000tn)
+void a4000_state::a4000tn(machine_config &config)
+{
a4000(config);
- MCFG_DEVICE_REMOVE("screen")
+ config.device_remove("screen");
ntsc_video(config);
- MCFG_DEVICE_MODIFY("screen")
- MCFG_SCREEN_UPDATE_DRIVER(amiga_state, screen_update_amiga_aga)
- MCFG_SCREEN_NO_PALETTE
- MCFG_DEVICE_MODIFY("amiga")
- MCFG_DEVICE_CLOCK(amiga_state::CLK_C1_NTSC)
- MCFG_DEVICE_MODIFY("cia_0")
- MCFG_DEVICE_CLOCK(amiga_state::CLK_E_NTSC)
- MCFG_DEVICE_MODIFY("cia_1")
- MCFG_DEVICE_CLOCK(amiga_state::CLK_E_NTSC)
- MCFG_DEVICE_MODIFY("fdc")
- MCFG_DEVICE_CLOCK(amiga_state::CLK_7M_NTSC)
-MACHINE_CONFIG_END
+ m_screen->set_screen_update(FUNC(amiga_state::screen_update_amiga_aga));
+ m_screen->set_palette(finder_base::DUMMY_TAG);
+ m_paula->set_clock(amiga_state::CLK_C1_NTSC);
+ m_cia_0->set_clock(amiga_state::CLK_E_NTSC);
+ m_cia_1->set_clock(amiga_state::CLK_E_NTSC);
+ m_fdc->set_clock(amiga_state::CLK_7M_NTSC);
+}
//**************************************************************************
diff --git a/src/mame/drivers/ampex.cpp b/src/mame/drivers/ampex.cpp
index 0fdd64f4c80..c9cccab81ad 100644
--- a/src/mame/drivers/ampex.cpp
+++ b/src/mame/drivers/ampex.cpp
@@ -340,8 +340,8 @@ void ampex_state::machine_start()
m_uart->write_swe(0);
// Are rates hardwired to DIP switches? They don't seem to be software-controlled...
- m_dbrg->write_str(0xe);
- m_dbrg->write_stt(0xe);
+ m_dbrg->str_w(0xe);
+ m_dbrg->stt_w(0xe);
// Make up some settings for the UART (probably also actually controlled by DIP switches)
m_uart->write_nb1(1);
diff --git a/src/mame/drivers/ampoker2.cpp b/src/mame/drivers/ampoker2.cpp
index 1a89b0c45c4..4bd0e3570f7 100644
--- a/src/mame/drivers/ampoker2.cpp
+++ b/src/mame/drivers/ampoker2.cpp
@@ -1166,28 +1166,28 @@ GFXDECODE_END
* Machine Driver *
*************************/
-MACHINE_CONFIG_START(ampoker2_state::ampoker2)
-
+void ampoker2_state::ampoker2(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, MASTER_CLOCK/2) /* 3 MHz */
- MCFG_DEVICE_PROGRAM_MAP(program_map)
- MCFG_DEVICE_IO_MAP(io_map)
- MCFG_DEVICE_PERIODIC_INT_DRIVER(ampoker2_state, nmi_line_pulse, 1536)
+ Z80(config, m_maincpu, MASTER_CLOCK/2); /* 3 MHz */
+ m_maincpu->set_addrmap(AS_PROGRAM, &ampoker2_state::program_map);
+ m_maincpu->set_addrmap(AS_IO, &ampoker2_state::io_map);
+ m_maincpu->set_periodic_int(FUNC(ampoker2_state::nmi_line_pulse), attotime::from_hz(1536));
WATCHDOG_TIMER(config, m_watchdog).set_time(attotime::from_msec(200)); /* 200 ms, measured */
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
/* if VBLANK is used, the watchdog timer stop to work.
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
*/
- MCFG_SCREEN_SIZE(64*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(20*8, 56*8-1, 2*8, 32*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(ampoker2_state, screen_update)
- MCFG_SCREEN_PALETTE("palette")
+ screen.set_size(64*8, 32*8);
+ screen.set_visarea(20*8, 56*8-1, 2*8, 32*8-1);
+ screen.set_screen_update(FUNC(ampoker2_state::screen_update));
+ screen.set_palette("palette");
GFXDECODE(config, m_gfxdecode, "palette", gfx_ampoker2);
PALETTE(config, "palette", FUNC(ampoker2_state::ampoker2_palette), 512);
@@ -1195,15 +1195,16 @@ MACHINE_CONFIG_START(ampoker2_state::ampoker2)
/* sound hardware */
SPEAKER(config, "mono").front_center();
AY8910(config, "aysnd", MASTER_CLOCK/4).add_route(ALL_OUTPUTS, "mono", 0.30); /* 1.5 MHz, measured */
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(ampoker2_state::sigma2k)
+void ampoker2_state::sigma2k(machine_config &config)
+{
ampoker2(config);
/* video hardware */
- MCFG_GFXDECODE_MODIFY("gfxdecode", gfx_sigma2k)
+ m_gfxdecode->set_info(gfx_sigma2k);
MCFG_VIDEO_START_OVERRIDE(ampoker2_state, sigma2k)
-MACHINE_CONFIG_END
+}
/*************************
diff --git a/src/mame/drivers/ampscarp.cpp b/src/mame/drivers/ampscarp.cpp
index 05b72db1734..f9ca05e3442 100644
--- a/src/mame/drivers/ampscarp.cpp
+++ b/src/mame/drivers/ampscarp.cpp
@@ -37,10 +37,11 @@ void ampscarp_state::mem_map(address_map &map)
static INPUT_PORTS_START( ampscarp )
INPUT_PORTS_END
-MACHINE_CONFIG_START(ampscarp_state::ampscarp)
- MCFG_DEVICE_ADD("maincpu", MC68HC11, 8'000'000) // type and clock unknown
- MCFG_DEVICE_PROGRAM_MAP(mem_map)
-MACHINE_CONFIG_END
+void ampscarp_state::ampscarp(machine_config &config)
+{
+ MC68HC11(config, m_maincpu, 8'000'000); // type and clock unknown
+ m_maincpu->set_addrmap(AS_PROGRAM, &ampscarp_state::mem_map);
+}
ROM_START( ampscarp )
ROM_REGION( 0x20000, "maincpu", 0 )
diff --git a/src/mame/drivers/amspdwy.cpp b/src/mame/drivers/amspdwy.cpp
index 6e5d3fd4e4c..373b1e92627 100644
--- a/src/mame/drivers/amspdwy.cpp
+++ b/src/mame/drivers/amspdwy.cpp
@@ -68,7 +68,7 @@ READ8_MEMBER(amspdwy_state::amspdwy_wheel_1_r)
READ8_MEMBER(amspdwy_state::amspdwy_sound_r)
{
- return (m_ym2151->status_r(space, 0) & ~0x30) | ioport("IN0")->read();
+ return (m_ym2151->status_r() & ~0x30) | ioport("IN0")->read();
}
void amspdwy_state::amspdwy_map(address_map &map)
@@ -247,27 +247,27 @@ void amspdwy_state::machine_reset()
m_wheel_return[1] = 0;
}
-MACHINE_CONFIG_START(amspdwy_state::amspdwy)
-
+void amspdwy_state::amspdwy(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, 3000000)
- MCFG_DEVICE_PROGRAM_MAP(amspdwy_map)
- MCFG_DEVICE_IO_MAP(amspdwy_portmap)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", amspdwy_state, irq0_line_hold) /* IRQ: 60Hz, NMI: retn */
+ Z80(config, m_maincpu, 3000000);
+ m_maincpu->set_addrmap(AS_PROGRAM, &amspdwy_state::amspdwy_map);
+ m_maincpu->set_addrmap(AS_IO, &amspdwy_state::amspdwy_portmap);
+ m_maincpu->set_vblank_int("screen", FUNC(amspdwy_state::irq0_line_hold)); /* IRQ: 60Hz, NMI: retn */
- MCFG_DEVICE_ADD("audiocpu", Z80, 3000000)
- MCFG_DEVICE_PROGRAM_MAP(amspdwy_sound_map)
+ Z80(config, m_audiocpu, 3000000);
+ m_audiocpu->set_addrmap(AS_PROGRAM, &amspdwy_state::amspdwy_sound_map);
- MCFG_QUANTUM_PERFECT_CPU("maincpu")
+ config.m_perfect_cpu_quantum = subtag("maincpu");
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(256, 256)
- MCFG_SCREEN_VISIBLE_AREA(0, 256-1, 0+16, 256-16-1)
- MCFG_SCREEN_UPDATE_DRIVER(amspdwy_state, screen_update_amspdwy)
- MCFG_SCREEN_PALETTE(m_palette)
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_refresh_hz(60);
+ m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ m_screen->set_size(256, 256);
+ m_screen->set_visarea(0, 256-1, 0+16, 256-16-1);
+ m_screen->set_screen_update(FUNC(amspdwy_state::screen_update_amspdwy));
+ m_screen->set_palette(m_palette);
GFXDECODE(config, m_gfxdecode, m_palette, gfx_amspdwy);
PALETTE(config, m_palette).set_format(palette_device::BGR_233_inverted, 32);
@@ -283,7 +283,7 @@ MACHINE_CONFIG_START(amspdwy_state::amspdwy)
m_ym2151->irq_handler().set_inputline(m_audiocpu, 0);
m_ym2151->add_route(0, "lspeaker", 1.0);
m_ym2151->add_route(1, "rspeaker", 1.0);
-MACHINE_CONFIG_END
+}
diff --git a/src/mame/drivers/amstr_pc.cpp b/src/mame/drivers/amstr_pc.cpp
index 80129472ce9..3abea11e6d8 100644
--- a/src/mame/drivers/amstr_pc.cpp
+++ b/src/mame/drivers/amstr_pc.cpp
@@ -503,24 +503,23 @@ void amstrad_pc_state::cfg_fdc(device_t *device)
fdc1->set_default_option("35dd");
}
-MACHINE_CONFIG_START(amstrad_pc_state::pc200)
+void amstrad_pc_state::pc200(machine_config &config)
+{
/* basic machine hardware */
I8086(config, m_maincpu, 8000000);
m_maincpu->set_addrmap(AS_PROGRAM, &amstrad_pc_state::ppc640_map);
m_maincpu->set_addrmap(AS_IO, &amstrad_pc_state::pc200_io);
m_maincpu->set_irq_acknowledge_callback("mb:pic8259", FUNC(pic8259_device::inta_cb));
- MCFG_PCNOPPI_MOTHERBOARD_ADD("mb", "maincpu")
+ PCNOPPI_MOTHERBOARD(config, "mb", 0).set_cputag(m_maincpu);
// FIXME: determine ISA bus clock
- MCFG_DEVICE_ADD("aga", ISA8_SLOT, 0, "mb:isa", pc_isa8_cards, "aga_pc200", true)
- MCFG_DEVICE_ADD("fdc", ISA8_SLOT, 0, "mb:isa", pc_isa8_cards, "fdc_xt", true)
- MCFG_SLOT_OPTION_MACHINE_CONFIG("fdc_xt", cfg_fdc)
- MCFG_DEVICE_ADD("com", ISA8_SLOT, 0, "mb:isa", pc_isa8_cards, "com", true)
- MCFG_SLOT_OPTION_MACHINE_CONFIG("com", cfg_com)
+ ISA8_SLOT(config, "aga", 0, "mb:isa", pc_isa8_cards, "aga_pc200", true);
+ ISA8_SLOT(config, "fdc", 0, "mb:isa", pc_isa8_cards, "fdc_xt", true).set_option_machine_config("fdc_xt", cfg_fdc);
+ ISA8_SLOT(config, "com", 0, "mb:isa", pc_isa8_cards, "com", true).set_option_machine_config("com", cfg_com);
- MCFG_DEVICE_ADD("isa1", ISA8_SLOT, 0, "mb:isa", pc_isa8_cards, nullptr, false)
- MCFG_DEVICE_ADD("isa2", ISA8_SLOT, 0, "mb:isa", pc_isa8_cards, nullptr, false)
+ ISA8_SLOT(config, "isa1", 0, "mb:isa", pc_isa8_cards, nullptr, false);
+ ISA8_SLOT(config, "isa2", 0, "mb:isa", pc_isa8_cards, nullptr, false);
/* printer */
pc_lpt_device &lpt0(PC_LPT(config, "lpt_0"));
@@ -534,11 +533,12 @@ MACHINE_CONFIG_START(amstrad_pc_state::pc200)
PC_JOY(config, "pc_joy");
- MCFG_PC_KEYB_ADD("pc_keyboard", WRITELINE("mb:pic8259", pic8259_device, ir1_w))
+ PC_KEYB(config, m_keyboard);
+ m_keyboard->keypress().set("mb:pic8259", FUNC(pic8259_device::ir1_w));
/* internal ram */
RAM(config, m_ram).set_default_size("640K").set_extra_options("512K");
-MACHINE_CONFIG_END
+}
void amstrad_pc_state::pc2086(machine_config &config)
{
diff --git a/src/mame/drivers/amstrad.cpp b/src/mame/drivers/amstrad.cpp
index 8fcdc8732fa..c9280c9a6ed 100644
--- a/src/mame/drivers/amstrad.cpp
+++ b/src/mame/drivers/amstrad.cpp
@@ -813,7 +813,7 @@ MACHINE_CONFIG_START(amstrad_state::cpcplus_cartslot)
MCFG_GENERIC_MANDATORY
MCFG_GENERIC_LOAD(amstrad_state, amstrad_plus_cartridge)
- MCFG_SOFTWARE_LIST_ADD("cart_list", "gx4000")
+ SOFTWARE_LIST(config, "cart_list").set_original("gx4000");
MACHINE_CONFIG_END
void cpc464_exp_cards(device_slot_interface &device)
@@ -905,12 +905,12 @@ void amstrad_centronics_devices(device_slot_interface &device)
MACHINE_CONFIG_START(amstrad_state::amstrad_base)
/* Machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, 16_MHz_XTAL / 4)
- MCFG_DEVICE_PROGRAM_MAP(amstrad_mem)
- MCFG_DEVICE_IO_MAP(amstrad_io)
- MCFG_DEVICE_IRQ_ACKNOWLEDGE_DRIVER(amstrad_state,amstrad_cpu_acknowledge_int)
+ Z80(config, m_maincpu, 16_MHz_XTAL / 4);
+ m_maincpu->set_addrmap(AS_PROGRAM, &amstrad_state::amstrad_mem);
+ m_maincpu->set_addrmap(AS_IO, &amstrad_state::amstrad_io);
+ m_maincpu->set_irq_acknowledge_callback(FUNC(amstrad_state::amstrad_cpu_acknowledge_int));
- MCFG_QUANTUM_TIME(attotime::from_hz(60))
+ config.m_minimum_quantum = attotime::from_hz(60);
MCFG_MACHINE_START_OVERRIDE(amstrad_state, amstrad )
MCFG_MACHINE_RESET_OVERRIDE(amstrad_state, amstrad )
@@ -922,12 +922,12 @@ MACHINE_CONFIG_START(amstrad_state::amstrad_base)
ppi.out_pc_callback().set(FUNC(amstrad_state::amstrad_ppi_portc_w));
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_RAW_PARAMS(16_MHz_XTAL, 1024, 32, 32 + 640 + 64, 312, 56 + 15, 200 + 15)
- MCFG_SCREEN_UPDATE_DRIVER(amstrad_state, screen_update_amstrad)
- MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE(*this, amstrad_state, screen_vblank_amstrad))
- MCFG_SCREEN_VIDEO_ATTRIBUTES(VIDEO_ALWAYS_UPDATE)
- MCFG_SCREEN_PALETTE(m_palette)
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_raw(16_MHz_XTAL, 1024, 32, 32 + 640 + 64, 312, 56 + 15, 200 + 15);
+ m_screen->set_screen_update(FUNC(amstrad_state::screen_update_amstrad));
+ m_screen->screen_vblank().set(FUNC(amstrad_state::screen_vblank_amstrad));
+ m_screen->set_video_attributes(VIDEO_ALWAYS_UPDATE);
+ m_screen->set_palette(m_palette);
PALETTE(config, m_palette, FUNC(amstrad_state::amstrad_cpc_palette), 32);
@@ -944,28 +944,29 @@ MACHINE_CONFIG_START(amstrad_state::amstrad_base)
/* sound hardware */
SPEAKER(config, "mono").front_center();
- WAVE(config, "wave", "cassette").add_route(ALL_OUTPUTS, "mono", 0.25);
+ WAVE(config, "wave", m_cassette).add_route(ALL_OUTPUTS, "mono", 0.25);
AY8912(config, m_ay, 16_MHz_XTAL / 16);
m_ay->port_a_read_callback().set(FUNC(amstrad_state::amstrad_psg_porta_read));
m_ay->add_route(ALL_OUTPUTS, "mono", 0.25);
/* printer */
- MCFG_DEVICE_ADD("centronics", CENTRONICS, amstrad_centronics_devices, "printer")
- MCFG_CENTRONICS_BUSY_HANDLER(WRITELINE(*this, amstrad_state, write_centronics_busy))
+ CENTRONICS(config, m_centronics, amstrad_centronics_devices, "printer");
+ m_centronics->busy_handler().set(FUNC(amstrad_state::write_centronics_busy));
/* snapshot */
- MCFG_SNAPSHOT_ADD("snapshot", amstrad_state, amstrad, "sna", 0)
+ MCFG_SNAPSHOT_ADD("snapshot", amstrad_state, amstrad, "sna")
- MCFG_CASSETTE_ADD( "cassette" )
- MCFG_CASSETTE_FORMATS(cdt_cassette_formats)
- MCFG_CASSETTE_DEFAULT_STATE(CASSETTE_STOPPED | CASSETTE_MOTOR_DISABLED | CASSETTE_SPEAKER_ENABLED)
- MCFG_CASSETTE_INTERFACE("cpc_cass")
+ CASSETTE(config, m_cassette);
+ m_cassette->set_formats(cdt_cassette_formats);
+ m_cassette->set_default_state(CASSETTE_STOPPED | CASSETTE_MOTOR_DISABLED | CASSETTE_SPEAKER_ENABLED);
+ m_cassette->set_interface("cpc_cass");
- MCFG_SOFTWARE_LIST_ADD("cass_list","cpc_cass")
+ SOFTWARE_LIST(config, "cass_list").set_original("cpc_cass");
MACHINE_CONFIG_END
-MACHINE_CONFIG_START(amstrad_state::cpc464)
+void amstrad_state::cpc464(machine_config &config)
+{
amstrad_base(config);
cpc_expansion_slot_device &exp(CPC_EXPANSION_SLOT(config, "exp", 16_MHz_XTAL / 4, cpc464_exp_cards, nullptr));
@@ -977,14 +978,15 @@ MACHINE_CONFIG_START(amstrad_state::cpc464)
/* internal ram */
RAM(config, m_ram).set_default_size("64K").set_extra_options("128K,320K,576K");
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(amstrad_state::cpc664)
+void amstrad_state::cpc664(machine_config &config)
+{
amstrad_base(config);
UPD765A(config, m_fdc, 16_MHz_XTAL / 4, true, true);
- MCFG_FLOPPY_DRIVE_ADD("upd765:0", amstrad_floppies, "3ssdd", floppy_image_device::default_floppy_formats)
- MCFG_FLOPPY_DRIVE_ADD("upd765:1", amstrad_floppies, "35ssdd", floppy_image_device::default_floppy_formats)
- MCFG_SOFTWARE_LIST_ADD("flop_list","cpc_flop")
+ FLOPPY_CONNECTOR(config, "upd765:0", amstrad_floppies, "3ssdd", floppy_image_device::default_floppy_formats);
+ FLOPPY_CONNECTOR(config, "upd765:1", amstrad_floppies, "35ssdd", floppy_image_device::default_floppy_formats);
+ SOFTWARE_LIST(config, "flop_list").set_original("cpc_flop");
cpc_expansion_slot_device &exp(CPC_EXPANSION_SLOT(config, "exp", 16_MHz_XTAL / 4, cpc_exp_cards, nullptr));
exp.set_cpu_tag(m_maincpu);
@@ -995,14 +997,15 @@ MACHINE_CONFIG_START(amstrad_state::cpc664)
/* internal ram */
RAM(config, m_ram).set_default_size("64K").set_extra_options("128K,320K,576K");
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(amstrad_state::cpc6128)
+void amstrad_state::cpc6128(machine_config &config)
+{
amstrad_base(config);
UPD765A(config, m_fdc, 16_MHz_XTAL / 4, true, true);
- MCFG_FLOPPY_DRIVE_ADD("upd765:0", amstrad_floppies, "3ssdd", floppy_image_device::default_floppy_formats)
- MCFG_FLOPPY_DRIVE_ADD("upd765:1", amstrad_floppies, "35ssdd", floppy_image_device::default_floppy_formats)
- MCFG_SOFTWARE_LIST_ADD("flop_list","cpc_flop")
+ FLOPPY_CONNECTOR(config, "upd765:0", amstrad_floppies, "3ssdd", floppy_image_device::default_floppy_formats);
+ FLOPPY_CONNECTOR(config, "upd765:1", amstrad_floppies, "35ssdd", floppy_image_device::default_floppy_formats);
+ SOFTWARE_LIST(config, "flop_list").set_original("cpc_flop");
cpc_expansion_slot_device &exp(CPC_EXPANSION_SLOT(config, "exp", 16_MHz_XTAL / 4, cpc_exp_cards, nullptr));
exp.set_cpu_tag(m_maincpu);
@@ -1013,26 +1016,27 @@ MACHINE_CONFIG_START(amstrad_state::cpc6128)
/* internal ram */
RAM(config, m_ram).set_default_size("128K").set_extra_options("320K,576K");
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(amstrad_state::kccomp)
+void amstrad_state::kccomp(machine_config &config)
+{
cpc6128(config);
MCFG_MACHINE_START_OVERRIDE(amstrad_state,kccomp)
MCFG_MACHINE_RESET_OVERRIDE(amstrad_state,kccomp)
m_palette->set_init(FUNC(amstrad_state::kccomp_palette));
-MACHINE_CONFIG_END
+}
MACHINE_CONFIG_START(amstrad_state::cpcplus)
/* Machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, 40_MHz_XTAL / 10)
- MCFG_DEVICE_PROGRAM_MAP(amstrad_mem)
- MCFG_DEVICE_IO_MAP(amstrad_io)
- MCFG_DEVICE_IRQ_ACKNOWLEDGE_DRIVER(amstrad_state,amstrad_cpu_acknowledge_int)
+ Z80(config, m_maincpu, 40_MHz_XTAL / 10);
+ m_maincpu->set_addrmap(AS_PROGRAM, &amstrad_state::amstrad_mem);
+ m_maincpu->set_addrmap(AS_IO, &amstrad_state::amstrad_io);
+ m_maincpu->set_irq_acknowledge_callback(FUNC(amstrad_state::amstrad_cpu_acknowledge_int));
- MCFG_QUANTUM_TIME(attotime::from_hz(60))
+ config.m_minimum_quantum = attotime::from_hz(60);
MCFG_MACHINE_START_OVERRIDE(amstrad_state, plus )
MCFG_MACHINE_RESET_OVERRIDE(amstrad_state, plus )
@@ -1044,12 +1048,12 @@ MACHINE_CONFIG_START(amstrad_state::cpcplus)
ppi.out_pc_callback().set(FUNC(amstrad_state::amstrad_ppi_portc_w));
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_RAW_PARAMS((40_MHz_XTAL * 2) / 5, 1024, 32, 32 + 640 + 64, 312, 56 + 15, 200 + 15)
- MCFG_SCREEN_UPDATE_DRIVER(amstrad_state, screen_update_amstrad)
- MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE(*this, amstrad_state, screen_vblank_amstrad))
- MCFG_SCREEN_VIDEO_ATTRIBUTES(VIDEO_ALWAYS_UPDATE)
- MCFG_SCREEN_PALETTE(m_palette)
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_raw((40_MHz_XTAL * 2) / 5, 1024, 32, 32 + 640 + 64, 312, 56 + 15, 200 + 15);
+ m_screen->set_screen_update(FUNC(amstrad_state::screen_update_amstrad));
+ m_screen->screen_vblank().set(FUNC(amstrad_state::screen_vblank_amstrad));
+ m_screen->set_video_attributes(VIDEO_ALWAYS_UPDATE);
+ m_screen->set_palette(m_palette);
PALETTE(config, m_palette, FUNC(amstrad_state::amstrad_plus_palette), 4096);
@@ -1065,31 +1069,31 @@ MACHINE_CONFIG_START(amstrad_state::cpcplus)
/* sound hardware */
SPEAKER(config, "mono").front_center();
- WAVE(config, "wave", "cassette").add_route(ALL_OUTPUTS, "mono", 0.25);
+ WAVE(config, "wave", m_cassette).add_route(ALL_OUTPUTS, "mono", 0.25);
AY8912(config, m_ay, 40_MHz_XTAL / 40);
m_ay->port_a_read_callback().set(FUNC(amstrad_state::amstrad_psg_porta_read));
m_ay->add_route(ALL_OUTPUTS, "mono", 0.25);
/* printer */
- MCFG_DEVICE_ADD("centronics", CENTRONICS, centronics_devices, "printer")
- MCFG_CENTRONICS_BUSY_HANDLER(WRITELINE(*this, amstrad_state, write_centronics_busy))
+ CENTRONICS(config, m_centronics, centronics_devices, "printer");
+ m_centronics->busy_handler().set(FUNC(amstrad_state::write_centronics_busy));
/* snapshot */
- MCFG_SNAPSHOT_ADD("snapshot", amstrad_state, amstrad, "sna", 0)
+ MCFG_SNAPSHOT_ADD("snapshot", amstrad_state, amstrad, "sna")
- MCFG_CASSETTE_ADD( "cassette" )
- MCFG_CASSETTE_FORMATS(cdt_cassette_formats)
- MCFG_CASSETTE_DEFAULT_STATE(CASSETTE_STOPPED | CASSETTE_MOTOR_DISABLED | CASSETTE_SPEAKER_ENABLED)
- MCFG_CASSETTE_INTERFACE("cpc_cass")
- MCFG_SOFTWARE_LIST_ADD("cass_list","cpc_cass")
+ CASSETTE(config, m_cassette);
+ m_cassette->set_formats(cdt_cassette_formats);
+ m_cassette->set_default_state(CASSETTE_STOPPED | CASSETTE_MOTOR_DISABLED | CASSETTE_SPEAKER_ENABLED);
+ m_cassette->set_interface("cpc_cass");
+ SOFTWARE_LIST(config, "cass_list").set_original("cpc_cass");
UPD765A(config, m_fdc, 40_MHz_XTAL / 10, true, true);
cpcplus_cartslot(config);
- MCFG_FLOPPY_DRIVE_ADD("upd765:0", amstrad_floppies, "3ssdd", floppy_image_device::default_floppy_formats)
- MCFG_FLOPPY_DRIVE_ADD("upd765:1", amstrad_floppies, "35ssdd", floppy_image_device::default_floppy_formats)
- MCFG_SOFTWARE_LIST_ADD("flop_list","cpc_flop")
+ FLOPPY_CONNECTOR(config, "upd765:0", amstrad_floppies, "3ssdd", floppy_image_device::default_floppy_formats);
+ FLOPPY_CONNECTOR(config, "upd765:1", amstrad_floppies, "35ssdd", floppy_image_device::default_floppy_formats);
+ SOFTWARE_LIST(config, "flop_list").set_original("cpc_flop");
cpc_expansion_slot_device &exp(CPC_EXPANSION_SLOT(config, "exp", 40_MHz_XTAL / 10, cpcplus_exp_cards, nullptr));
exp.set_cpu_tag(m_maincpu);
@@ -1103,14 +1107,15 @@ MACHINE_CONFIG_START(amstrad_state::cpcplus)
MACHINE_CONFIG_END
-MACHINE_CONFIG_START(amstrad_state::gx4000)
+void amstrad_state::gx4000(machine_config &config)
+{
/* Machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, 40_MHz_XTAL / 10)
- MCFG_DEVICE_PROGRAM_MAP(amstrad_mem)
- MCFG_DEVICE_IO_MAP(amstrad_io)
- MCFG_DEVICE_IRQ_ACKNOWLEDGE_DRIVER(amstrad_state,amstrad_cpu_acknowledge_int)
+ Z80(config, m_maincpu, 40_MHz_XTAL / 10);
+ m_maincpu->set_addrmap(AS_PROGRAM, &amstrad_state::amstrad_mem);
+ m_maincpu->set_addrmap(AS_IO, &amstrad_state::amstrad_io);
+ m_maincpu->set_irq_acknowledge_callback(FUNC(amstrad_state::amstrad_cpu_acknowledge_int));
- MCFG_QUANTUM_TIME(attotime::from_hz(60))
+ config.m_minimum_quantum = attotime::from_hz(60);
MCFG_MACHINE_START_OVERRIDE(amstrad_state, gx4000 )
MCFG_MACHINE_RESET_OVERRIDE(amstrad_state, gx4000 )
@@ -1122,12 +1127,12 @@ MACHINE_CONFIG_START(amstrad_state::gx4000)
ppi.out_pc_callback().set(FUNC(amstrad_state::amstrad_ppi_portc_w));
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_RAW_PARAMS((40_MHz_XTAL * 2) / 5, 1024, 32, 32 + 640 + 64, 312, 56 + 15, 200 + 15)
- MCFG_SCREEN_UPDATE_DRIVER(amstrad_state, screen_update_amstrad)
- MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE(*this, amstrad_state, screen_vblank_amstrad))
- MCFG_SCREEN_VIDEO_ATTRIBUTES(VIDEO_ALWAYS_UPDATE)
- MCFG_SCREEN_PALETTE(m_palette)
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_raw((40_MHz_XTAL * 2) / 5, 1024, 32, 32 + 640 + 64, 312, 56 + 15, 200 + 15);
+ m_screen->set_screen_update(FUNC(amstrad_state::screen_update_amstrad));
+ m_screen->screen_vblank().set(FUNC(amstrad_state::screen_vblank_amstrad));
+ m_screen->set_video_attributes(VIDEO_ALWAYS_UPDATE);
+ m_screen->set_palette(m_palette);
PALETTE(config, m_palette, FUNC(amstrad_state::amstrad_plus_palette), 4096);
@@ -1151,10 +1156,11 @@ MACHINE_CONFIG_START(amstrad_state::gx4000)
/* internal ram */
RAM(config, m_ram).set_default_size("64K");
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(amstrad_state::aleste)
+void amstrad_state::aleste(machine_config &config)
+{
cpc6128(config);
MCFG_MACHINE_START_OVERRIDE(amstrad_state,aleste)
MCFG_MACHINE_RESET_OVERRIDE(amstrad_state,aleste)
@@ -1166,7 +1172,7 @@ MACHINE_CONFIG_START(amstrad_state::aleste)
m_palette->set_entries(32+64);
m_palette->set_init(FUNC(amstrad_state::aleste_palette));
- MCFG_DEVICE_ADD("rtc", MC146818, 4.194304_MHz_XTAL)
+ MC146818(config, m_rtc, 4.194304_MHz_XTAL);
I8272A(config.replace(), m_fdc, 16_MHz_XTAL / 4, true);
@@ -1177,16 +1183,15 @@ MACHINE_CONFIG_START(amstrad_state::aleste)
exp.romdis_callback().set(FUNC(amstrad_state::cpc_romdis)); // ROMDIS
exp.rom_select_callback().set(FUNC(amstrad_state::rom_select));
- MCFG_FLOPPY_DRIVE_ADD("upd765:0", aleste_floppies, "35dd", amstrad_state::aleste_floppy_formats)
- MCFG_FLOPPY_DRIVE_ADD("upd765:1", aleste_floppies, "35dd", amstrad_state::aleste_floppy_formats)
+ FLOPPY_CONNECTOR(config, "upd765:0", aleste_floppies, "35dd", amstrad_state::aleste_floppy_formats);
+ FLOPPY_CONNECTOR(config, "upd765:1", aleste_floppies, "35dd", amstrad_state::aleste_floppy_formats);
- MCFG_DEVICE_REMOVE("flop_list")
- MCFG_SOFTWARE_LIST_ADD("flop_list", "aleste")
- MCFG_SOFTWARE_LIST_COMPATIBLE_ADD("cpc_list", "cpc_flop")
+ SOFTWARE_LIST(config.replace(), "flop_list").set_original("aleste");
+ SOFTWARE_LIST(config, "cpc_list").set_compatible("cpc_flop");
/* internal ram */
m_ram->set_default_size("2M");
-MACHINE_CONFIG_END
+}
diff --git a/src/mame/drivers/amusco.cpp b/src/mame/drivers/amusco.cpp
index e349c69ccc5..aa5cf9db461 100644
--- a/src/mame/drivers/amusco.cpp
+++ b/src/mame/drivers/amusco.cpp
@@ -139,8 +139,8 @@ private:
MC6845_UPDATE_ROW(update_row);
void amusco_palette(palette_device &palette) const;
- void amusco_mem_map(address_map &map);
- void amusco_io_map(address_map &map);
+ void mem_map(address_map &map);
+ void io_map(address_map &map);
std::unique_ptr<uint8_t []> m_videoram;
tilemap_t *m_bg_tilemap;
@@ -209,25 +209,25 @@ void amusco_state::machine_start()
* Memory Map Information *
*************************/
-void amusco_state::amusco_mem_map(address_map &map)
+void amusco_state::mem_map(address_map &map)
{
map(0x00000, 0x0ffff).ram();
- map(0xf8000, 0xfffff).rom();
+ map(0xf8000, 0xfffff).rom().region("maincpu", 0);
}
READ8_MEMBER( amusco_state::mc6845_r)
{
if(offset & 1)
- return m_crtc->register_r(space, 0);
+ return m_crtc->register_r();
- return m_crtc->status_r(space,0); // not a plain 6845, requests update bit here ...
+ return m_crtc->status_r(); // not a plain 6845, requests update bit here ...
}
WRITE8_MEMBER( amusco_state::mc6845_w)
{
if(offset & 1)
{
- m_crtc->register_w(space, 0,data);
+ m_crtc->register_w(data);
if(m_mc6845_address == 0x12)
m_video_update_address = ((data & 0xff) << 8) | (m_video_update_address & 0x00ff);
if(m_mc6845_address == 0x13)
@@ -235,7 +235,7 @@ WRITE8_MEMBER( amusco_state::mc6845_w)
}
else
{
- m_crtc->address_w(space,0,data);
+ m_crtc->address_w(data);
m_mc6845_address = data;
}
}
@@ -365,14 +365,14 @@ WRITE8_MEMBER(amusco_state::rtc_control_w)
m_rtc->read_w(BIT(data, 4));
}
-void amusco_state::amusco_io_map(address_map &map)
+void amusco_state::io_map(address_map &map)
{
map(0x0000, 0x0001).rw(FUNC(amusco_state::mc6845_r), FUNC(amusco_state::mc6845_w));
map(0x0010, 0x0011).w(m_pic, FUNC(pic8259_device::write));
map(0x0020, 0x0023).w(m_pit, FUNC(pit8253_device::write));
map(0x0030, 0x0033).rw("ppi_outputs", FUNC(i8255_device::read), FUNC(i8255_device::write));
map(0x0040, 0x0043).rw("ppi_inputs", FUNC(i8255_device::read), FUNC(i8255_device::write));
- map(0x0060, 0x0060).w("sn", FUNC(sn76489a_device::command_w));
+ map(0x0060, 0x0060).w("sn", FUNC(sn76489a_device::write));
map(0x0070, 0x0071).w(FUNC(amusco_state::vram_w));
map(0x0280, 0x0283).rw("lpt_interface", FUNC(i8155_device::io_r), FUNC(i8155_device::io_w));
map(0x0380, 0x0383).rw("rtc_interface", FUNC(i8155_device::io_r), FUNC(i8155_device::io_w));
@@ -532,12 +532,12 @@ void amusco_state::amusco_palette(palette_device &palette) const
* Machine Drivers *
*************************/
-MACHINE_CONFIG_START(amusco_state::amusco)
-
+void amusco_state::amusco(machine_config &config)
+{
/* basic machine hardware */
I8088(config, m_maincpu, CPU_CLOCK); // 5 MHz ?
- m_maincpu->set_addrmap(AS_PROGRAM, &amusco_state::amusco_mem_map);
- m_maincpu->set_addrmap(AS_IO, &amusco_state::amusco_io_map);
+ m_maincpu->set_addrmap(AS_PROGRAM, &amusco_state::mem_map);
+ m_maincpu->set_addrmap(AS_IO, &amusco_state::io_map);
m_maincpu->set_irq_acknowledge_callback("pic8259", FUNC(pic8259_device::inta_cb));
PIC8259(config, m_pic, 0);
@@ -571,15 +571,15 @@ MACHINE_CONFIG_START(amusco_state::amusco)
i8155b.in_pc_callback().set(m_rtc, FUNC(msm5832_device::data_r));
i8155b.out_pc_callback().set(m_rtc, FUNC(msm5832_device::data_w));
- MCFG_TICKET_DISPENSER_ADD("hopper", attotime::from_msec(30), TICKET_MOTOR_ACTIVE_LOW, TICKET_STATUS_ACTIVE_HIGH)
+ TICKET_DISPENSER(config, m_hopper, attotime::from_msec(30), TICKET_MOTOR_ACTIVE_LOW, TICKET_STATUS_ACTIVE_HIGH);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(88*8, 27*10) // screen size: 88*8 27*10
- MCFG_SCREEN_VISIBLE_AREA(0*8, 74*8-1, 0*10, 24*10-1) // visible scr: 74*8 24*10
- MCFG_SCREEN_UPDATE_DEVICE("crtc", mc6845_device, screen_update)
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_refresh_hz(60);
+ m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ m_screen->set_size(88*8, 27*10); // screen size: 88*8 27*10
+ m_screen->set_visarea(0*8, 74*8-1, 0*10, 24*10-1); // visible scr: 74*8 24*10
+ m_screen->set_screen_update("crtc", FUNC(mc6845_device::screen_update));
GFXDECODE(config, m_gfxdecode, "palette", gfx_amusco);
PALETTE(config, "palette", FUNC(amusco_state::amusco_palette), 8*8);
@@ -595,23 +595,22 @@ MACHINE_CONFIG_START(amusco_state::amusco)
/* sound hardware */
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("sn", SN76489A, SND_CLOCK)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.80)
-MACHINE_CONFIG_END
+ SN76489A(config, "sn", SND_CLOCK).add_route(ALL_OUTPUTS, "mono", 0.80);
+}
-MACHINE_CONFIG_START(amusco_state::draw88pkr)
+void amusco_state::draw88pkr(machine_config &config)
+{
amusco(config);
//MCFG_DEVICE_MODIFY("ppi_outputs") // Some bits are definitely different
-MACHINE_CONFIG_END
-
+}
/*************************
* Rom Load *
*************************/
ROM_START( amusco )
- ROM_REGION( 0x100000, "maincpu", 0 )
- ROM_LOAD( "pk_v1.4_u42.u42", 0xf8000, 0x08000, CRC(bf57d7b1) SHA1(fc8b062b12c241c6c096325f728305316b80be8b) )
+ ROM_REGION( 0x8000, "maincpu", 0 )
+ ROM_LOAD( "pk_v1.4_u42.u42", 0x0000, 0x8000, CRC(bf57d7b1) SHA1(fc8b062b12c241c6c096325f728305316b80be8b) )
ROM_REGION( 0xc000, "gfx1", 0 )
ROM_LOAD( "char_a_u35.u35", 0x0000, 0x4000, CRC(ded67ef6) SHA1(da7326c190211e956e5a5f763d5045615bb8ffb3) )
@@ -638,8 +637,8 @@ ROM_END
*/
ROM_START( draw88pkr )
- ROM_REGION( 0x100000, "maincpu", 0 )
- ROM_LOAD( "u42.bin", 0xf8000, 0x08000, CRC(e98a7cfd) SHA1(8dc581c3e0cfd78bd33fbbbafd40307cf66f154d) )
+ ROM_REGION( 0x8000, "maincpu", 0 )
+ ROM_LOAD( "u42.bin", 0x0000, 0x8000, CRC(e98a7cfd) SHA1(8dc581c3e0cfd78bd33fbbbafd40307cf66f154d) )
ROM_REGION( 0xc000, "gfx1", 0 )
ROM_LOAD( "u35.bin", 0x0000, 0x4000, CRC(f608019a) SHA1(f0c5e10a03f39976d9bc6e8bc9f78e30ffefa03e) )
@@ -647,11 +646,10 @@ ROM_START( draw88pkr )
ROM_LOAD( "u37.bin", 0x8000, 0x4000, CRC(6e23b9f2) SHA1(6916828d84d1ecb44dc454e6786f97801a8550c7) )
ROM_END
-
/*************************
* Game Drivers *
*************************/
-/* YEAR NAME PARENT MACHINE INPUT CLASS INIT ROT COMPANY FULLNAME FLAGS LAYOUT */
-GAMEL( 1987, amusco, 0, amusco, amusco, amusco_state, empty_init, ROT0, "Amusco", "American Music Poker (V1.4)", MACHINE_IMPERFECT_COLORS | MACHINE_NODEVICE_PRINTER, layout_amusco ) // palette totally wrong
-GAMEL( 1988, draw88pkr, 0, draw88pkr, draw88pkr, amusco_state, empty_init, ROT0, "BTE, Inc.", "Draw 88 Poker (V2.0)", MACHINE_IMPERFECT_COLORS | MACHINE_NODEVICE_PRINTER, layout_amusco ) // palette totally wrong
+/* YEAR NAME PARENT MACHINE INPUT CLASS INIT ROT COMPANY FULLNAME FLAGS LAYOUT */
+GAMEL( 1987, amusco, 0, amusco, amusco, amusco_state, empty_init, ROT0, "Amusco", "American Music Poker (V1.4)", MACHINE_IMPERFECT_COLORS | MACHINE_NODEVICE_PRINTER, layout_amusco ) // palette totally wrong
+GAMEL( 1988, draw88pkr, 0, draw88pkr, draw88pkr, amusco_state, empty_init, ROT0, "BTE, Inc.", "Draw 88 Poker (V2.0)", MACHINE_IMPERFECT_COLORS | MACHINE_NODEVICE_PRINTER, layout_amusco ) // palette totally wrong
diff --git a/src/mame/drivers/amust.cpp b/src/mame/drivers/amust.cpp
index 146ac9ed961..282c61e12f5 100644
--- a/src/mame/drivers/amust.cpp
+++ b/src/mame/drivers/amust.cpp
@@ -433,26 +433,26 @@ void amust_state::init_amust()
membank("bankw0")->configure_entry(0, &main[0xf800]);
}
-MACHINE_CONFIG_START(amust_state::amust)
+void amust_state::amust(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu",Z80, XTAL(16'000'000) / 4)
- MCFG_DEVICE_PROGRAM_MAP(mem_map)
- MCFG_DEVICE_IO_MAP(io_map)
+ Z80(config, m_maincpu, XTAL(16'000'000) / 4);
+ m_maincpu->set_addrmap(AS_PROGRAM, &amust_state::mem_map);
+ m_maincpu->set_addrmap(AS_IO, &amust_state::io_map);
/* video hardware */
- MCFG_SCREEN_ADD_MONOCHROME("screen", RASTER, rgb_t::green())
- MCFG_SCREEN_REFRESH_RATE(50)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */
- MCFG_SCREEN_SIZE(640, 480)
- MCFG_SCREEN_VISIBLE_AREA(0, 640-1, 0, 480-1)
- MCFG_SCREEN_UPDATE_DEVICE("crtc", mc6845_device, screen_update)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER, rgb_t::green()));
+ screen.set_refresh_hz(50);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */
+ screen.set_size(640, 480);
+ screen.set_visarea(0, 640-1, 0, 480-1);
+ screen.set_screen_update("crtc", FUNC(mc6845_device::screen_update));
PALETTE(config, m_palette, palette_device::MONOCHROME);
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_amust)
+ GFXDECODE(config, "gfxdecode", m_palette, gfx_amust);
/* sound hardware */
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("beeper", BEEP, 800)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.50)
+ BEEP(config, m_beep, 800).add_route(ALL_OUTPUTS, "mono", 0.50);
/* Devices */
h46505_device &crtc(H46505(config, "crtc", XTAL(14'318'181) / 8));
@@ -466,10 +466,8 @@ MACHINE_CONFIG_START(amust_state::amust)
UPD765A(config, m_fdc, 8'000'000, true, true);
m_fdc->drq_wr_callback().set(FUNC(amust_state::drq_w));
m_fdc->intrq_wr_callback().set(FUNC(amust_state::intrq_w));
- MCFG_FLOPPY_DRIVE_ADD("fdc:0", amust_floppies, "525qd", floppy_image_device::default_floppy_formats)
- MCFG_FLOPPY_DRIVE_SOUND(true)
- MCFG_FLOPPY_DRIVE_ADD("fdc:1", amust_floppies, "525qd", floppy_image_device::default_floppy_formats)
- MCFG_FLOPPY_DRIVE_SOUND(true)
+ FLOPPY_CONNECTOR(config, "fdc:0", amust_floppies, "525qd", floppy_image_device::default_floppy_formats).enable_sound(true);
+ FLOPPY_CONNECTOR(config, "fdc:1", amust_floppies, "525qd", floppy_image_device::default_floppy_formats).enable_sound(true);
clock_device &uart_clock(CLOCK(config, "uart_clock", 153600));
uart_clock.signal_handler().set("uart1", FUNC(i8251_device::write_txc));
@@ -505,7 +503,7 @@ MACHINE_CONFIG_START(amust_state::amust)
ppi2.in_pb_callback().set(FUNC(amust_state::port09_r));
ppi2.in_pc_callback().set(FUNC(amust_state::port0a_r));
ppi2.out_pc_callback().set(FUNC(amust_state::port0a_w));
-MACHINE_CONFIG_END
+}
/* ROM definition */
ROM_START( amust )
diff --git a/src/mame/drivers/anes.cpp b/src/mame/drivers/anes.cpp
index c7370d40d4a..44a6d42b748 100644
--- a/src/mame/drivers/anes.cpp
+++ b/src/mame/drivers/anes.cpp
@@ -156,29 +156,29 @@ void anes_state::machine_start()
-MACHINE_CONFIG_START(anes_state::anes)
+void anes_state::anes(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, XTAL(16'000'000) / 2) // Z0840008PSC
- MCFG_DEVICE_PROGRAM_MAP(prg_map)
- MCFG_DEVICE_IO_MAP(io_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", anes_state, irq0_line_hold)
+ z80_device &maincpu(Z80(config, "maincpu", XTAL(16'000'000) / 2)); // Z0840008PSC
+ maincpu.set_addrmap(AS_PROGRAM, &anes_state::prg_map);
+ maincpu.set_addrmap(AS_IO, &anes_state::io_map);
+ maincpu.set_vblank_int("screen", FUNC(anes_state::irq0_line_hold));
// all wrong
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(64*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 64*8-1, 0*8, 32*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(anes_state, screen_update)
- MCFG_SCREEN_PALETTE("palette")
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(64*8, 32*8);
+ screen.set_visarea_full();
+ screen.set_screen_update(FUNC(anes_state::screen_update));
+ screen.set_palette("palette");
- MCFG_PALETTE_ADD("palette", 0x100)
+ PALETTE(config, "palette").set_entries(0x100);
/* sound hardware */
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("ym", YM2413, XTAL(3'579'545))
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.30)
-MACHINE_CONFIG_END
+ YM2413(config, "ym", XTAL(3'579'545)).add_route(ALL_OUTPUTS, "mono", 0.30);
+}
ROM_START( tonpuu )
diff --git a/src/mame/drivers/angelkds.cpp b/src/mame/drivers/angelkds.cpp
index 61d9033b961..e0f25bd9269 100644
--- a/src/mame/drivers/angelkds.cpp
+++ b/src/mame/drivers/angelkds.cpp
@@ -81,6 +81,8 @@ Space Position (JPN Ver.)
(c)1986 Sega / Nasco
X090-PC-A 171-5383
X090-PC-B 171-5384
+834-6089 SPACE POSITION
+Sticker reading 860723.0883E
CPU :D317-0005 (NEC Z80 Custom)
@@ -90,26 +92,26 @@ OSC :4.000MHz 6.000MHz
:18.432MHz
-EPR10120.C1 prg
-EPR10121.C2 |
-EPR10122.C3 |
-EPR10123.C4 |
-EPR10124.C5 |
-EPR10125.C10 /
+EPR-10120.C1 prg
+EPR-10121.C2 |
+EPR-10122.C3 |
+EPR-10123.C4 |
+EPR-10124.C5 |
+EPR-10125.C10/
-EPR10126.D4 snd
+EPR-10126.D4 snd
-EPR10127.06
-EPR10128.07
-EPR10129.08
-EPR10130.14
-EPR10131.15
-EPR10132.16
+EPR-10127.06
+EPR-10128.07
+EPR-10129.08
+EPR-10130.14
+EPR-10131.15
+EPR-10132.16
-EPR10133.17
+EPR-10133.17
-EPR10134.18
-EPR10135.19
+EPR-10134.18
+EPR-10135.19
63S081N.U5
@@ -598,82 +600,82 @@ void angelkds_state::spcpostn(machine_config &config)
ROM_START( angelkds )
/* Nasco X090-PC-A (Sega 837-6600) */
ROM_REGION( 0x8000, "maincpu", 0 )
- ROM_LOAD( "11428.c10", 0x00000, 0x08000, CRC(90daacd2) SHA1(7e50ad1cbed0c1e6bad04ef1611cad25538c905f) )
+ ROM_LOAD( "epr-11428.c10", 0x00000, 0x08000, CRC(90daacd2) SHA1(7e50ad1cbed0c1e6bad04ef1611cad25538c905f) )
ROM_REGION( 0x40000, "user1", 0 ) /* Banked Code */
- ROM_LOAD( "11424.c1", 0x00000, 0x08000, CRC(b55997f6) SHA1(7ed746becac1851f39591f1fdbeff64aa97d6206) )
- ROM_LOAD( "11425.c2", 0x08000, 0x08000, CRC(299359de) SHA1(f531dd3bfe6f64e9e043cb4f85d5657455241dc7) )
- ROM_LOAD( "11426.c3", 0x10000, 0x08000, CRC(5fad8bd3) SHA1(4d865342eb10dcfb779eee4ac1e159bb9ec140cb) )
- ROM_LOAD( "11427.c4", 0x18000, 0x08000, CRC(ef920c74) SHA1(81c0fbe4ace5441e4cd99ba423e0190cc541da31) )
+ ROM_LOAD( "epr-11424.c1", 0x00000, 0x08000, CRC(b55997f6) SHA1(7ed746becac1851f39591f1fdbeff64aa97d6206) )
+ ROM_LOAD( "epr-11425.c2", 0x08000, 0x08000, CRC(299359de) SHA1(f531dd3bfe6f64e9e043cb4f85d5657455241dc7) )
+ ROM_LOAD( "epr-11426.c3", 0x10000, 0x08000, CRC(5fad8bd3) SHA1(4d865342eb10dcfb779eee4ac1e159bb9ec140cb) )
+ ROM_LOAD( "epr-11427.c4", 0x18000, 0x08000, CRC(ef920c74) SHA1(81c0fbe4ace5441e4cd99ba423e0190cc541da31) )
ROM_REGION( 0x10000, "sub", 0 )
- ROM_LOAD( "11429.d4", 0x00000, 0x08000, CRC(0ca50a66) SHA1(cccb081b447419138b1ebd309e7f291e392a44d5) )
+ ROM_LOAD( "epr-11429.d4", 0x00000, 0x08000, CRC(0ca50a66) SHA1(cccb081b447419138b1ebd309e7f291e392a44d5) )
/* Nasco X090-PC-B */
ROM_REGION( 0x08000, "gfx1", 0 )
- ROM_LOAD( "11446", 0x00000, 0x08000, CRC(45052470) SHA1(c2312a9f814d6dbe42aa465147a04a2bd9b2aa1b) )
+ ROM_LOAD( "epr-11446", 0x00000, 0x08000, CRC(45052470) SHA1(c2312a9f814d6dbe42aa465147a04a2bd9b2aa1b) )
ROM_REGION( 0x10000, "gfx2", 0 )
- ROM_LOAD( "11447.f7", 0x08000, 0x08000, CRC(b3afc5b3) SHA1(376d527f60e9044f18d19a5535bca77606efbd4c) )
- ROM_LOAD( "11448.h7", 0x00000, 0x08000, CRC(05dab626) SHA1(73feaca6e23c673a7d8c9e972714b20bd8f2d51e) )
+ ROM_LOAD( "epr-11447.f7", 0x08000, 0x08000, CRC(b3afc5b3) SHA1(376d527f60e9044f18d19a5535bca77606efbd4c) )
+ ROM_LOAD( "epr-11448.h7", 0x00000, 0x08000, CRC(05dab626) SHA1(73feaca6e23c673a7d8c9e972714b20bd8f2d51e) )
/* both tilemaps on angelkds use the same gfx */
ROM_REGION( 0x40000, "gfx3", 0 )
- ROM_LOAD( "11437", 0x00000, 0x08000, CRC(a520b628) SHA1(2b51f59e760e740e5e6b06dad61bbc23fc84a72b) )
- ROM_LOAD( "11436", 0x08000, 0x08000, CRC(469ab216) SHA1(8223f072a6f9135ff84841c95410368bcea073d8) )
- ROM_LOAD( "11435", 0x10000, 0x08000, CRC(b0f8c245) SHA1(882e27eaceac46c397fdae8427a082caa7d6b7dc) )
- ROM_LOAD( "11434", 0x18000, 0x08000, CRC(cbde81f5) SHA1(5d5b8e709c9dd09a45dfced6f3d4a9c52500da6b) )
- ROM_LOAD( "11433", 0x20000, 0x08000, CRC(b63fa414) SHA1(25adcafd7e17ab0be0fed2ec44245124febd74b3) )
- ROM_LOAD( "11432", 0x28000, 0x08000, CRC(00dc747b) SHA1(041b73aa48b45162af33b5f416ccc0c0dbbd995b) )
- ROM_LOAD( "11431", 0x30000, 0x08000, CRC(ac2025af) SHA1(2aba145df3ccdb1a7f0fec524bd2de3f9aab4161) )
- ROM_LOAD( "11430", 0x38000, 0x08000, CRC(d640f89e) SHA1(38fb67bcb2a3d1ad614fc62e42f22a66bc757137) )
+ ROM_LOAD( "epr-11437", 0x00000, 0x08000, CRC(a520b628) SHA1(2b51f59e760e740e5e6b06dad61bbc23fc84a72b) )
+ ROM_LOAD( "epr-11436", 0x08000, 0x08000, CRC(469ab216) SHA1(8223f072a6f9135ff84841c95410368bcea073d8) )
+ ROM_LOAD( "epr-11435", 0x10000, 0x08000, CRC(b0f8c245) SHA1(882e27eaceac46c397fdae8427a082caa7d6b7dc) )
+ ROM_LOAD( "epr-11434", 0x18000, 0x08000, CRC(cbde81f5) SHA1(5d5b8e709c9dd09a45dfced6f3d4a9c52500da6b) )
+ ROM_LOAD( "epr-11433", 0x20000, 0x08000, CRC(b63fa414) SHA1(25adcafd7e17ab0be0fed2ec44245124febd74b3) )
+ ROM_LOAD( "epr-11432", 0x28000, 0x08000, CRC(00dc747b) SHA1(041b73aa48b45162af33b5f416ccc0c0dbbd995b) )
+ ROM_LOAD( "epr-11431", 0x30000, 0x08000, CRC(ac2025af) SHA1(2aba145df3ccdb1a7f0fec524bd2de3f9aab4161) )
+ ROM_LOAD( "epr-11430", 0x38000, 0x08000, CRC(d640f89e) SHA1(38fb67bcb2a3d1ad614fc62e42f22a66bc757137) )
ROM_REGION( 0x40000, "gfx4", 0 )
- ROM_LOAD( "11445", 0x00000, 0x08000, CRC(a520b628) SHA1(2b51f59e760e740e5e6b06dad61bbc23fc84a72b) )
- ROM_LOAD( "11444", 0x08000, 0x08000, CRC(469ab216) SHA1(8223f072a6f9135ff84841c95410368bcea073d8) )
- ROM_LOAD( "11443", 0x10000, 0x08000, CRC(b0f8c245) SHA1(882e27eaceac46c397fdae8427a082caa7d6b7dc) )
- ROM_LOAD( "11442", 0x18000, 0x08000, CRC(cbde81f5) SHA1(5d5b8e709c9dd09a45dfced6f3d4a9c52500da6b) )
- ROM_LOAD( "11441", 0x20000, 0x08000, CRC(b63fa414) SHA1(25adcafd7e17ab0be0fed2ec44245124febd74b3) )
- ROM_LOAD( "11440", 0x28000, 0x08000, CRC(00dc747b) SHA1(041b73aa48b45162af33b5f416ccc0c0dbbd995b) )
- ROM_LOAD( "11439", 0x30000, 0x08000, CRC(ac2025af) SHA1(2aba145df3ccdb1a7f0fec524bd2de3f9aab4161) )
- ROM_LOAD( "11438", 0x38000, 0x08000, CRC(d640f89e) SHA1(38fb67bcb2a3d1ad614fc62e42f22a66bc757137) )
+ ROM_LOAD( "epr-11445", 0x00000, 0x08000, CRC(a520b628) SHA1(2b51f59e760e740e5e6b06dad61bbc23fc84a72b) )
+ ROM_LOAD( "epr-11444", 0x08000, 0x08000, CRC(469ab216) SHA1(8223f072a6f9135ff84841c95410368bcea073d8) )
+ ROM_LOAD( "epr-11443", 0x10000, 0x08000, CRC(b0f8c245) SHA1(882e27eaceac46c397fdae8427a082caa7d6b7dc) )
+ ROM_LOAD( "epr-11442", 0x18000, 0x08000, CRC(cbde81f5) SHA1(5d5b8e709c9dd09a45dfced6f3d4a9c52500da6b) )
+ ROM_LOAD( "epr-11441", 0x20000, 0x08000, CRC(b63fa414) SHA1(25adcafd7e17ab0be0fed2ec44245124febd74b3) )
+ ROM_LOAD( "epr-11440", 0x28000, 0x08000, CRC(00dc747b) SHA1(041b73aa48b45162af33b5f416ccc0c0dbbd995b) )
+ ROM_LOAD( "epr-11439", 0x30000, 0x08000, CRC(ac2025af) SHA1(2aba145df3ccdb1a7f0fec524bd2de3f9aab4161) )
+ ROM_LOAD( "epr-11438", 0x38000, 0x08000, CRC(d640f89e) SHA1(38fb67bcb2a3d1ad614fc62e42f22a66bc757137) )
ROM_REGION( 0x20, "proms", 0 )
ROM_LOAD( "63s081n.u5", 0x00, 0x20, CRC(36b98627) SHA1(d2d54d92d1d47e7cc85104989ee421ce5d80a42a) )
ROM_END
ROM_START( spcpostn )
- /* X090-PC-A 171-5383 */
+ /* X090-PC-A 171-5383 (Sega 834-6089 SPACE POSITION) */
ROM_REGION( 0x8000, "maincpu", 0 ) /* D317-0005 (NEC Z80 Custom) */
- ROM_LOAD( "epr10125.c10", 0x00000, 0x08000, CRC(bffd38c6) SHA1(af02907124343ddecd21439d25f1ebb81ef9f51a) ) /* encrypted */
+ ROM_LOAD( "epr-10125.c10", 0x00000, 0x08000, CRC(bffd38c6) SHA1(af02907124343ddecd21439d25f1ebb81ef9f51a) ) /* encrypted */
ROM_REGION( 0x40000, "user1", 0 ) /* Banked Code */
- ROM_LOAD( "epr10120.c1", 0x00000, 0x08000, CRC(d6399f99) SHA1(4c7d19a8798e5a10b688bf793ca74f5170fd9b51) )
- ROM_LOAD( "epr10121.c2", 0x08000, 0x08000, CRC(d4861560) SHA1(74d28c36a08880abbd3c398cc3e990e8986caccb) )
- ROM_LOAD( "epr10122.c3", 0x10000, 0x08000, CRC(7a1bff1b) SHA1(e1bda8430fd632c1813dd78e0f210a358e1b0d2f) )
- ROM_LOAD( "epr10123.c4", 0x18000, 0x08000, CRC(6aed2925) SHA1(75848c8086c460b72494da2367f592d7d5dcf9f1) )
- ROM_LOAD( "epr10124.c5", 0x20000, 0x08000, CRC(a1d7ae6b) SHA1(ec81fecf63e0515cae2077e2623262227adfdf37) )
+ ROM_LOAD( "epr-10120.c1", 0x00000, 0x08000, CRC(d6399f99) SHA1(4c7d19a8798e5a10b688bf793ca74f5170fd9b51) )
+ ROM_LOAD( "epr-10121.c2", 0x08000, 0x08000, CRC(d4861560) SHA1(74d28c36a08880abbd3c398cc3e990e8986caccb) )
+ ROM_LOAD( "epr-10122.c3", 0x10000, 0x08000, CRC(7a1bff1b) SHA1(e1bda8430fd632c1813dd78e0f210a358e1b0d2f) )
+ ROM_LOAD( "epr-10123.c4", 0x18000, 0x08000, CRC(6aed2925) SHA1(75848c8086c460b72494da2367f592d7d5dcf9f1) )
+ ROM_LOAD( "epr-10124.c5", 0x20000, 0x08000, CRC(a1d7ae6b) SHA1(ec81fecf63e0515cae2077e2623262227adfdf37) )
ROM_REGION( 0x10000, "sub", 0 ) /* NEC D780C-1 */
- ROM_LOAD( "epr10126.d4", 0x00000, 0x08000, CRC(ab17f852) SHA1(dc0db427ddb4df97bb40dfb6fc65cb9354a6b9ad) )
+ ROM_LOAD( "epr-10126.d4", 0x00000, 0x08000, CRC(ab17f852) SHA1(dc0db427ddb4df97bb40dfb6fc65cb9354a6b9ad) )
/* X090-PC-B 171-5384 */
ROM_REGION( 0x08000, "gfx1", 0 )
- ROM_LOAD( "epr10133.17", 0x00000, 0x08000, CRC(642e6609) SHA1(2dfb4cc66f89543b55ed2a5b914e2c9304e821ca) )
+ ROM_LOAD( "epr-10133.17", 0x00000, 0x08000, CRC(642e6609) SHA1(2dfb4cc66f89543b55ed2a5b914e2c9304e821ca) )
ROM_REGION( 0x10000, "gfx2", 0 )
- ROM_LOAD( "epr10134.18", 0x08000, 0x08000, CRC(c674ff88) SHA1(9f240910a1ffb7c9e09d2326de280e6a5dd84565) )
- ROM_LOAD( "epr10135.19", 0x00000, 0x08000, CRC(0685c4fa) SHA1(6950d9ad9ec13236cf24e83e87adb62aa53af7bb) )
+ ROM_LOAD( "epr-10134.18", 0x08000, 0x08000, CRC(c674ff88) SHA1(9f240910a1ffb7c9e09d2326de280e6a5dd84565) )
+ ROM_LOAD( "epr-10135.19", 0x00000, 0x08000, CRC(0685c4fa) SHA1(6950d9ad9ec13236cf24e83e87adb62aa53af7bb) )
ROM_REGION( 0x30000, "gfx3", 0 )
- ROM_LOAD( "epr10130.14", 0x10000, 0x08000, CRC(b68fcb36) SHA1(3943dd550b13f2911d56d8dad675410da79196e6) )
- ROM_LOAD( "epr10131.15", 0x08000, 0x08000, CRC(de223817) SHA1(1860db0a19c926fcfaabe676cb57fff38c4df8e6) )
- ROM_LOAD( "epr10132.16", 0x00000, 0x08000, CRC(2df8b1bd) SHA1(cad8befa3f2c158d2aa74073066ccd2b54e68825) )
+ ROM_LOAD( "epr-10130.14", 0x10000, 0x08000, CRC(b68fcb36) SHA1(3943dd550b13f2911d56d8dad675410da79196e6) )
+ ROM_LOAD( "epr-10131.15", 0x08000, 0x08000, CRC(de223817) SHA1(1860db0a19c926fcfaabe676cb57fff38c4df8e6) )
+ ROM_LOAD( "epr-10132.16", 0x00000, 0x08000, CRC(2df8b1bd) SHA1(cad8befa3f2c158d2aa74073066ccd2b54e68825) )
ROM_REGION( 0x18000, "gfx4", 0 )
- ROM_LOAD( "epr10127.06", 0x10000, 0x08000, CRC(b68fcb36) SHA1(3943dd550b13f2911d56d8dad675410da79196e6) )
- ROM_LOAD( "epr10128.07", 0x08000, 0x08000, CRC(de223817) SHA1(1860db0a19c926fcfaabe676cb57fff38c4df8e6) )
- ROM_LOAD( "epr10129.08", 0x00000, 0x08000, CRC(a6f21023) SHA1(8d573446a2d3d3428409707d0c59b118d1463131) )
+ ROM_LOAD( "epr-10127.06", 0x10000, 0x08000, CRC(b68fcb36) SHA1(3943dd550b13f2911d56d8dad675410da79196e6) )
+ ROM_LOAD( "epr-10128.07", 0x08000, 0x08000, CRC(de223817) SHA1(1860db0a19c926fcfaabe676cb57fff38c4df8e6) )
+ ROM_LOAD( "epr-10129.08", 0x00000, 0x08000, CRC(a6f21023) SHA1(8d573446a2d3d3428409707d0c59b118d1463131) )
ROM_REGION( 0x20, "proms", 0 )
ROM_LOAD( "63s081n.u5", 0x00, 0x20, CRC(36b98627) SHA1(d2d54d92d1d47e7cc85104989ee421ce5d80a42a) )
diff --git a/src/mame/drivers/anzterm.cpp b/src/mame/drivers/anzterm.cpp
index c2d72c10133..5938606f34f 100644
--- a/src/mame/drivers/anzterm.cpp
+++ b/src/mame/drivers/anzterm.cpp
@@ -371,7 +371,7 @@ private:
{
return 0;
}
- void anzterm(address_map &map);
+ void anzterm_mem(address_map &map);
};
@@ -404,7 +404,7 @@ GFXDECODE_START( gfx_anzterm )
GFXDECODE_END
-void anzterm_state::anzterm(address_map &map)
+void anzterm_state::anzterm_mem(address_map &map)
{
// There are two battery-backed 2kB SRAM chips with a 4kb SRAM chip for parity
// There are two 64kB DRAM banks (with parity)
@@ -414,25 +414,26 @@ void anzterm_state::anzterm(address_map &map)
}
-MACHINE_CONFIG_START(anzterm_state::anzterm)
- MCFG_DEVICE_ADD("maincpu", M6809, 15974400/4)
- MCFG_DEVICE_PROGRAM_MAP(anzterm)
+void anzterm_state::anzterm(machine_config &config)
+{
+ m6809_device &maincpu(M6809(config, "maincpu", 15974400/4));
+ maincpu.set_addrmap(AS_PROGRAM, &anzterm_state::anzterm_mem);
- MCFG_DEVICE_ADD("pic.ic39", I8214, 0)
- MCFG_DEVICE_ADD("adlc.ic16", MC6854, 0)
- MCFG_DEVICE_ADD("adlc.1c19", MC6854, 0)
- MCFG_DEVICE_ADD("acia.ic17", ACIA6850, 0)
- MCFG_DEVICE_ADD("acia.ic18", ACIA6850, 0)
+ I8214(config, "pic.ic39", 0);
+ MC6854(config, "adlc.ic16", 0);
+ MC6854(config, "adlc.1c19", 0);
+ ACIA6850(config, "acia.ic17", 0);
+ ACIA6850(config, "acia.ic18", 0);
- MCFG_SCREEN_ADD_MONOCHROME("screen", RASTER, rgb_t::green())
- MCFG_SCREEN_UPDATE_DRIVER(anzterm_state, screen_update)
- MCFG_SCREEN_PALETTE("palette")
- MCFG_SCREEN_RAW_PARAMS(15974400/4, 1024, 0, 104*8, 260, 0, 24*10) // this is totally wrong, it just stops a validation error
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER, rgb_t::green()));
+ screen.set_screen_update(FUNC(anzterm_state::screen_update));
+ screen.set_palette("palette");
+ screen.set_raw(15974400/4, 1024, 0, 104*8, 260, 0, 24*10); // this is totally wrong, it just stops a validation error
PALETTE(config, "palette", palette_device::MONOCHROME);
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_anzterm)
-MACHINE_CONFIG_END
+ GFXDECODE(config, "gfxdecode", "palette", gfx_anzterm);
+}
INPUT_PORTS_START( anzterm )
diff --git a/src/mame/drivers/apc.cpp b/src/mame/drivers/apc.cpp
index 49dcf2f071a..6d065a94df2 100644
--- a/src/mame/drivers/apc.cpp
+++ b/src/mame/drivers/apc.cpp
@@ -344,9 +344,9 @@ READ8_MEMBER(apc_state::apc_gdc_r)
uint8_t res;
if(offset & 1)
- res = m_hgdc2->read(space, (offset & 2) >> 1); // upd7220 bitmap port
+ res = m_hgdc2->read((offset & 2) >> 1); // upd7220 bitmap port
else
- res = m_hgdc1->read(space, (offset & 2) >> 1); // upd7220 character port
+ res = m_hgdc1->read((offset & 2) >> 1); // upd7220 character port
return res;
}
@@ -354,9 +354,9 @@ READ8_MEMBER(apc_state::apc_gdc_r)
WRITE8_MEMBER(apc_state::apc_gdc_w)
{
if(offset & 1)
- m_hgdc2->write(space, (offset & 2) >> 1,data); // upd7220 bitmap port
+ m_hgdc2->write((offset & 2) >> 1,data); // upd7220 bitmap port
else
- m_hgdc1->write(space, (offset & 2) >> 1,data); // upd7220 character port
+ m_hgdc1->write((offset & 2) >> 1,data); // upd7220 character port
}
READ8_MEMBER(apc_state::apc_kbd_r)
@@ -416,12 +416,12 @@ CH3_EXA == 0X3E ; CH-3 extended address (W)
READ8_MEMBER(apc_state::apc_dma_r)
{
- return m_dmac->read(space, bitswap<8>(offset,7,6,5,4,2,1,0,3), 0xff);
+ return m_dmac->read(bitswap<4>(offset,2,1,0,3));
}
WRITE8_MEMBER(apc_state::apc_dma_w)
{
- m_dmac->write(space, bitswap<8>(offset,7,6,5,4,2,1,0,3), data, 0xff);
+ m_dmac->write(bitswap<4>(offset,2,1,0,3), data);
}
WRITE8_MEMBER(apc_state::apc_irq_ack_w)
@@ -936,13 +936,13 @@ static void apc_floppies(device_slot_interface &device)
device.option_add("8", FLOPPY_8_DSDD);
}
-MACHINE_CONFIG_START(apc_state::apc)
-
+void apc_state::apc(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD(m_maincpu,I8086,MAIN_CLOCK)
- MCFG_DEVICE_PROGRAM_MAP(apc_map)
- MCFG_DEVICE_IO_MAP(apc_io)
- MCFG_DEVICE_IRQ_ACKNOWLEDGE_DEVICE("pic8259_master", pic8259_device, inta_cb)
+ I8086(config, m_maincpu, MAIN_CLOCK);
+ m_maincpu->set_addrmap(AS_PROGRAM, &apc_state::apc_map);
+ m_maincpu->set_addrmap(AS_IO, &apc_state::apc_io);
+ m_maincpu->set_irq_acknowledge_callback("pic8259_master", FUNC(pic8259_device::inta_cb));
PIT8253(config, m_pit, 0);
m_pit->set_clk<0>(MAIN_CLOCK); // heartbeat IRQ
@@ -977,9 +977,9 @@ MACHINE_CONFIG_START(apc_state::apc)
UPD765A(config, m_fdc, 8'000'000, true, true);
m_fdc->intrq_wr_callback().set(m_i8259_s, FUNC(pic8259_device::ir4_w));
m_fdc->drq_wr_callback().set(m_dmac, FUNC(am9517a_device::dreq1_w));
- MCFG_FLOPPY_DRIVE_ADD(m_fdc_connector[0], apc_floppies, "8", apc_floppy_formats)
- MCFG_FLOPPY_DRIVE_ADD(m_fdc_connector[1], apc_floppies, "8", apc_floppy_formats)
- MCFG_SOFTWARE_LIST_ADD("disk_list","apc")
+ FLOPPY_CONNECTOR(config, m_fdc_connector[0], apc_floppies, "8", apc_floppy_formats);
+ FLOPPY_CONNECTOR(config, m_fdc_connector[1], apc_floppies, "8", apc_floppy_formats);
+ SOFTWARE_LIST(config, "disk_list").set_original("apc");
/* video hardware */
SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
@@ -991,21 +991,20 @@ MACHINE_CONFIG_START(apc_state::apc)
PALETTE(config, m_palette, palette_device::BRG_3BIT);
- MCFG_DEVICE_ADD(m_gfxdecode, GFXDECODE, m_palette, gfx_apc)
+ GFXDECODE(config, m_gfxdecode, m_palette, gfx_apc);
UPD7220(config, m_hgdc1, 3579545); // unk clock
m_hgdc1->set_addrmap(0, &apc_state::upd7220_1_map);
- m_hgdc1->set_draw_text_callback(FUNC(apc_state::hgdc_draw_text), this);
+ m_hgdc1->set_draw_text(FUNC(apc_state::hgdc_draw_text));
UPD7220(config, m_hgdc2, 3579545); // unk clock
m_hgdc2->set_addrmap(0, &apc_state::upd7220_2_map);
- m_hgdc2->set_display_pixels_callback(FUNC(apc_state::hgdc_display_pixels), this);
+ m_hgdc2->set_display_pixels(FUNC(apc_state::hgdc_display_pixels));
/* sound hardware */
SPEAKER(config, m_speaker).front_center();
- MCFG_DEVICE_ADD(m_sound, UPD1771C, MAIN_CLOCK) //uPD1771C-006
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.00)
-MACHINE_CONFIG_END
+ UPD1771C(config, m_sound, MAIN_CLOCK).add_route(ALL_OUTPUTS, "mono", 1.00); //uPD1771C-006
+}
/***************************************************************************
diff --git a/src/mame/drivers/apf.cpp b/src/mame/drivers/apf.cpp
index f93402f535e..8d1bed1ec81 100644
--- a/src/mame/drivers/apf.cpp
+++ b/src/mame/drivers/apf.cpp
@@ -519,70 +519,68 @@ static void apf_cart(device_slot_interface &device)
}
-MACHINE_CONFIG_START(apf_state::apfm1000)
-
+void apf_state::apfm1000(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M6800, 3.579545_MHz_XTAL / 4) // divided by 4 in external clock circuit
- MCFG_DEVICE_PROGRAM_MAP(apfm1000_map)
+ M6800(config, m_maincpu, 3.579545_MHz_XTAL / 4); // divided by 4 in external clock circuit
+ m_maincpu->set_addrmap(AS_PROGRAM, &apf_state::apfm1000_map);
/* video hardware */
- MCFG_SCREEN_MC6847_NTSC_ADD("screen", "mc6847")
+ SCREEN(config, "screen", SCREEN_TYPE_RASTER);
- MCFG_DEVICE_ADD("mc6847", MC6847_NTSC, 3.579545_MHz_XTAL)
- MCFG_MC6847_FSYNC_CALLBACK(WRITELINE("pia0", pia6821_device, cb1_w))
- MCFG_MC6847_INPUT_CALLBACK(READ8(*this, apf_state, videoram_r))
- MCFG_MC6847_FIXED_MODE(mc6847_ntsc_device::MODE_GM2 | mc6847_ntsc_device::MODE_GM1)
+ MC6847_NTSC(config, m_crtc, 3.579545_MHz_XTAL);
+ m_crtc->fsync_wr_callback().set(m_pia0, FUNC(pia6821_device::cb1_w));
+ m_crtc->input_callback().set(FUNC(apf_state::videoram_r));
+ m_crtc->set_get_fixed_mode(mc6847_ntsc_device::MODE_GM2 | mc6847_ntsc_device::MODE_GM1);
+ m_crtc->set_screen("screen");
// INTEXT = GND
// other lines not connected
/* sound hardware */
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("speaker", SPEAKER_SOUND)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.50)
+ SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.50);
/* Devices */
PIA6821(config, m_pia0, 0);
m_pia0->readpa_handler().set(FUNC(apf_state::pia0_porta_r));
m_pia0->writepb_handler().set(FUNC(apf_state::pia0_portb_w));
m_pia0->ca2_handler().set(FUNC(apf_state::pia0_ca2_w));
- m_pia0->cb2_handler().set("speaker", FUNC(speaker_sound_device::level_w));
- m_pia0->irqa_handler().set_inputline("maincpu", M6800_IRQ_LINE);
- m_pia0->irqb_handler().set_inputline("maincpu", M6800_IRQ_LINE);
+ m_pia0->cb2_handler().set(m_speaker, FUNC(speaker_sound_device::level_w));
+ m_pia0->irqa_handler().set_inputline(m_maincpu, M6800_IRQ_LINE);
+ m_pia0->irqb_handler().set_inputline(m_maincpu, M6800_IRQ_LINE);
- MCFG_APF_CARTRIDGE_ADD("cartslot", apf_cart, nullptr)
+ APF_CART_SLOT(config, m_cart, apf_cart, nullptr);
/* software lists */
- MCFG_SOFTWARE_LIST_ADD("cart_list", "apfm1000")
-MACHINE_CONFIG_END
+ SOFTWARE_LIST(config, "cart_list").set_original("apfm1000");
+}
-MACHINE_CONFIG_START(apf_state::apfimag)
+void apf_state::apfimag(machine_config &config)
+{
apfm1000(config);
- MCFG_DEVICE_MODIFY( "maincpu" )
- MCFG_DEVICE_PROGRAM_MAP( apfimag_map)
+ m_maincpu->set_addrmap(AS_PROGRAM, &apf_state::apfimag_map);
/* internal ram */
RAM(config, RAM_TAG).set_default_size("8K").set_extra_options("16K");
- WAVE(config, "wave", "cassette").add_route(ALL_OUTPUTS, "mono", 0.15);
+ WAVE(config, "wave", m_cass).add_route(ALL_OUTPUTS, "mono", 0.15);
PIA6821(config, m_pia1, 0);
m_pia1->readpa_handler().set(FUNC(apf_state::pia1_porta_r));
m_pia1->readpb_handler().set(FUNC(apf_state::pia1_portb_r));
m_pia1->writepb_handler().set(FUNC(apf_state::pia1_portb_w));
- MCFG_CASSETTE_ADD("cassette")
- MCFG_CASSETTE_FORMATS(apf_cassette_formats)
- MCFG_CASSETTE_DEFAULT_STATE(CASSETTE_STOPPED | CASSETTE_SPEAKER_ENABLED | CASSETTE_MOTOR_DISABLED)
- MCFG_CASSETTE_INTERFACE("apf_cass")
+ CASSETTE(config, m_cass);
+ m_cass->set_formats(apf_cassette_formats);
+ m_cass->set_default_state(CASSETTE_STOPPED | CASSETTE_SPEAKER_ENABLED | CASSETTE_MOTOR_DISABLED);
+ m_cass->set_interface("apf_cass");
FD1771(config, m_fdc, 1000000); // guess
- MCFG_FLOPPY_DRIVE_ADD("fdc:0", apf_floppies, "525dd", floppy_image_device::default_floppy_formats)
- MCFG_FLOPPY_DRIVE_SOUND(true)
- MCFG_FLOPPY_DRIVE_ADD("fdc:1", apf_floppies, "525dd", floppy_image_device::default_floppy_formats)
- MCFG_FLOPPY_DRIVE_SOUND(true)
+ FLOPPY_CONNECTOR(config, "fdc:0", apf_floppies, "525dd", floppy_image_device::default_floppy_formats).enable_sound(true);
+ FLOPPY_CONNECTOR(config, "fdc:1", apf_floppies, "525dd", floppy_image_device::default_floppy_formats).enable_sound(true);
- MCFG_SOFTWARE_LIST_ADD("cass_list", "apfimag_cass")
-MACHINE_CONFIG_END
+ SOFTWARE_LIST(config, "cass_list").set_original("apfimag_cass");
+}
/***************************************************************************
diff --git a/src/mame/drivers/apollo.cpp b/src/mame/drivers/apollo.cpp
index 1102f3cde86..6398cfbb1f3 100644
--- a/src/mame/drivers/apollo.cpp
+++ b/src/mame/drivers/apollo.cpp
@@ -29,14 +29,12 @@
#include "includes/apollo.h"
#include "cpu/m68000/m68000.h"
-#include "sound/beep.h"
// we use set_verbose
#include "bus/isa/omti8621.h"
#include "bus/isa/3c505.h"
#include "debugger.h"
-#include "speaker.h"
#include "apollo_dsp.lh"
@@ -1044,49 +1042,41 @@ READ_LINE_MEMBER( apollo_state::apollo_kbd_is_german )
MACHINE DRIVERS
***************************************************************************/
-MACHINE_CONFIG_START(apollo_state::dn3500)
+void apollo_state::dn3500(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD(MAINCPU, M68030, 25000000) /* 25 MHz 68030 */
- MCFG_DEVICE_PROGRAM_MAP(dn3500_map)
- MCFG_DEVICE_IRQ_ACKNOWLEDGE_DRIVER(apollo_state,apollo_irq_acknowledge)
+ M68030(config, m_maincpu, 25000000); /* 25 MHz 68030 */
+ m_maincpu->set_addrmap(AS_PROGRAM, &apollo_state::dn3500_map);
+ m_maincpu->set_irq_acknowledge_callback(FUNC(apollo_state::apollo_irq_acknowledge));
- MCFG_QUANTUM_TIME(attotime::from_hz(60))
+ config.m_minimum_quantum = attotime::from_hz(60);
apollo(config);
- /* keyboard beeper */
- SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("beep", BEEP, 1000)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.00)
-
/* internal ram */
RAM(config, m_ram).set_default_size("8M").set_extra_options("4M,8M,16M,32M");
#ifdef APOLLO_XXL
apollo_stdio_device &stdio(APOLLO_STDIO(config, APOLLO_STDIO_TAG, 0));
- stdio.tx_callback().set(m_sio, FUNC(apollo_sio::rx_b_w));
+ stdio.tx_cb().set(m_sio, FUNC(apollo_sio::rx_b_w));
#endif
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(apollo_state::dsp3500)
- MCFG_DEVICE_ADD(MAINCPU, M68030, 25000000) /* 25 MHz 68030 */
- MCFG_DEVICE_PROGRAM_MAP(dsp3500_map)
- MCFG_DEVICE_IRQ_ACKNOWLEDGE_DRIVER(apollo_state,apollo_irq_acknowledge)
- MCFG_QUANTUM_TIME(attotime::from_hz(60))
+void apollo_state::dsp3500(machine_config &config)
+{
+ M68030(config, m_maincpu, 25000000); /* 25 MHz 68030 */
+ m_maincpu->set_addrmap(AS_PROGRAM, &apollo_state::dsp3500_map);
+ m_maincpu->set_irq_acknowledge_callback(FUNC(apollo_state::apollo_irq_acknowledge));
+ config.m_minimum_quantum = attotime::from_hz(60);
apollo_terminal(config);
- /* keyboard beeper */
- SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("beep", BEEP, 1000)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.00)
-
/* internal ram */
RAM(config, RAM_TAG).set_default_size("8M").set_extra_options("4M,8M,16M,32M");
/* terminal hardware */
config.set_default_layout(layout_apollo_dsp);
-MACHINE_CONFIG_END
+}
void apollo_state::dn3500_19i(machine_config &config)
{
@@ -1108,31 +1098,28 @@ void apollo_state::dn3500_15i(machine_config &config)
m_keyboard->german_cb().set(FUNC(apollo_state::apollo_kbd_is_german));
}
-MACHINE_CONFIG_START(apollo_state::dn3000)
+void apollo_state::dn3000(machine_config &config)
+{
dn3500(config);
- MCFG_DEVICE_REPLACE(MAINCPU, M68020PMMU, 12000000) /* 12 MHz */
- MCFG_DEVICE_IRQ_ACKNOWLEDGE_DRIVER(apollo_state,apollo_irq_acknowledge)
- MCFG_DEVICE_PROGRAM_MAP(dn3000_map)
+ M68020PMMU(config.replace(), m_maincpu, 12000000); /* 12 MHz */
+ m_maincpu->set_irq_acknowledge_callback(FUNC(apollo_state::apollo_irq_acknowledge));
+ m_maincpu->set_addrmap(AS_PROGRAM, &apollo_state::dn3000_map);
config.device_remove( APOLLO_SIO2_TAG );
m_ram->set_default_size("8M").set_extra_options("4M");
// FIXME: is this interrupt really only connected on DN3000?
m_rtc->irq().set(FUNC(apollo_state::apollo_rtc_irq_function));
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(apollo_state::dsp3000)
- MCFG_DEVICE_ADD(MAINCPU, M68020PMMU, 12000000) /* 12 MHz */
- MCFG_DEVICE_IRQ_ACKNOWLEDGE_DRIVER(apollo_state,apollo_irq_acknowledge)
- MCFG_DEVICE_PROGRAM_MAP(dsp3000_map)
- MCFG_QUANTUM_TIME(attotime::from_hz(60))
+void apollo_state::dsp3000(machine_config &config)
+{
+ M68020PMMU(config, m_maincpu, 12000000); /* 12 MHz */
+ m_maincpu->set_irq_acknowledge_callback(FUNC(apollo_state::apollo_irq_acknowledge));
+ m_maincpu->set_addrmap(AS_PROGRAM, &apollo_state::dsp3000_map);
+ config.m_minimum_quantum = attotime::from_hz(60);
apollo_terminal(config);
- /* keyboard beeper */
- SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("beep", BEEP, 1000)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.00)
-
/* internal ram */
RAM(config, m_ram).set_default_size("8M").set_extra_options("4M");
@@ -1140,7 +1127,7 @@ MACHINE_CONFIG_START(apollo_state::dsp3000)
/* terminal hardware */
config.set_default_layout(layout_apollo_dsp);
-MACHINE_CONFIG_END
+}
void apollo_state::dn3000_19i(machine_config &config)
{
@@ -1162,32 +1149,29 @@ void apollo_state::dn3000_15i(machine_config &config)
m_keyboard->german_cb().set(FUNC(apollo_state::apollo_kbd_is_german));
}
-MACHINE_CONFIG_START(apollo_state::dn5500)
+void apollo_state::dn5500(machine_config &config)
+{
dn3500(config);
- MCFG_DEVICE_REPLACE(MAINCPU, M68040, 25000000) /* 25 MHz */
- MCFG_DEVICE_PROGRAM_MAP(dn5500_map)
-MACHINE_CONFIG_END
+ M68040(config.replace(), m_maincpu, 25000000); /* 25 MHz */
+ m_maincpu->set_addrmap(AS_PROGRAM, &apollo_state::dn5500_map);
+}
-MACHINE_CONFIG_START(apollo_state::dsp5500)
- MCFG_DEVICE_ADD(MAINCPU, M68040, 25000000) /* 25 MHz */
- MCFG_DEVICE_PROGRAM_MAP(dsp5500_map)
- MCFG_DEVICE_IRQ_ACKNOWLEDGE_DRIVER(apollo_state,apollo_irq_acknowledge)
- MCFG_QUANTUM_TIME(attotime::from_hz(60))
+void apollo_state::dsp5500(machine_config &config)
+{
+ M68040(config, m_maincpu, 25000000); /* 25 MHz */
+ m_maincpu->set_addrmap(AS_PROGRAM, &apollo_state::dsp5500_map);
+ m_maincpu->set_irq_acknowledge_callback(FUNC(apollo_state::apollo_irq_acknowledge));
+ config.m_minimum_quantum = attotime::from_hz(60);
apollo_terminal(config);
- /* keyboard beeper */
- SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("beep", BEEP, 1000)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.00)
-
/* internal ram */
// FIXME: guess, to fix validation
RAM(config, RAM_TAG).set_default_size("8M").set_extra_options("4M,8M,16M,32M");
/* terminal hardware */
config.set_default_layout(layout_apollo_dsp);
-MACHINE_CONFIG_END
+}
void apollo_state::dn5500_19i(machine_config &config)
{
diff --git a/src/mame/drivers/apple1.cpp b/src/mame/drivers/apple1.cpp
index 258c0b5465d..72a660dfda5 100644
--- a/src/mame/drivers/apple1.cpp
+++ b/src/mame/drivers/apple1.cpp
@@ -595,14 +595,14 @@ static void apple1_cards(device_slot_interface &device)
}
MACHINE_CONFIG_START(apple1_state::apple1)
- MCFG_DEVICE_ADD(m_maincpu, M6502, 960000) // effective CPU speed
- MCFG_DEVICE_PROGRAM_MAP(apple1_map)
+ M6502(config, m_maincpu, 960000); // effective CPU speed
+ m_maincpu->set_addrmap(AS_PROGRAM, &apple1_state::apple1_map);
// video timings are identical to the Apple II, unsurprisingly
- MCFG_SCREEN_ADD(m_screen, RASTER)
- MCFG_SCREEN_RAW_PARAMS(XTAL(14'318'181), (65*7)*2, 0, (40*7)*2, 262, 0, 192)
- MCFG_SCREEN_UPDATE_DRIVER(apple1_state, screen_update)
- MCFG_SCREEN_PALETTE("palette")
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_raw(XTAL(14'318'181), (65*7)*2, 0, (40*7)*2, 262, 0, 192);
+ m_screen->set_screen_update(FUNC(apple1_state::screen_update));
+ m_screen->set_palette("palette");
PALETTE(config, "palette", palette_device::MONOCHROME);
@@ -611,13 +611,12 @@ MACHINE_CONFIG_START(apple1_state::apple1)
m_pia->writepb_handler().set(FUNC(apple1_state::pia_display_w));
m_pia->cb2_handler().set(FUNC(apple1_state::pia_display_gate_w));
- MCFG_DEVICE_ADD(A1_BUS_TAG, A1BUS, 0)
- MCFG_A1BUS_CPU(m_maincpu)
- MCFG_DEVICE_ADD("exp", A1BUS_SLOT, 0, A1_BUS_TAG, apple1_cards, "cassette")
+ A1BUS(config, A1_BUS_TAG, 0).set_space(m_maincpu, AS_PROGRAM);
+ A1BUS_SLOT(config, "exp", 0, A1_BUS_TAG, apple1_cards, "cassette");
- MCFG_SNAPSHOT_ADD("snapshot", apple1_state, apple1, "snp", 0)
+ MCFG_SNAPSHOT_ADD("snapshot", apple1_state, apple1, "snp")
- MCFG_SOFTWARE_LIST_ADD("cass_list", "apple1")
+ SOFTWARE_LIST(config, "cass_list").set_original("apple1");
RAM(config, RAM_TAG).set_default_size("48K").set_extra_options("4K,8K,12K,16K,20K,24K,28K,32K,36K,40K,44K");
MACHINE_CONFIG_END
diff --git a/src/mame/drivers/apple2.cpp b/src/mame/drivers/apple2.cpp
index 4c8354f67b1..4f4e9f3ba35 100644
--- a/src/mame/drivers/apple2.cpp
+++ b/src/mame/drivers/apple2.cpp
@@ -50,6 +50,7 @@ II Plus: RAM options reduced to 16/32/48 KB.
#include "machine/kb3600.h"
#include "machine/ram.h"
#include "machine/timer.h"
+#include "machine/apple2common.h"
#include "sound/spkrdev.h"
@@ -111,6 +112,7 @@ public:
m_ram(*this, RAM_TAG),
m_ay3600(*this, A2_KBDC_TAG),
m_video(*this, A2_VIDEO_TAG),
+ m_a2common(*this, "a2common"),
m_a2bus(*this, "a2bus"),
m_joy1x(*this, "joystick_1_x"),
m_joy1y(*this, "joystick_1_y"),
@@ -133,6 +135,7 @@ public:
required_device<ram_device> m_ram;
required_device<ay3600_device> m_ay3600;
required_device<a2_video_device> m_video;
+ required_device<apple2_common_device> m_a2common;
required_device<a2bus_device> m_a2bus;
required_ioport m_joy1x, m_joy1y, m_joy2x, m_joy2y, m_joybuttons;
required_ioport m_kbspecial;
@@ -228,6 +231,8 @@ private:
device_a2bus_card_interface *m_slotdevice[8];
uint8_t read_floatingbus();
+
+ offs_t dasm_trampoline(std::ostream &stream, offs_t pc, const util::disasm_interface::data_buffer &opcodes, const util::disasm_interface::data_buffer &params);
};
/***************************************************************************
@@ -238,6 +243,11 @@ private:
#define JOYSTICK_SENSITIVITY 50
#define JOYSTICK_AUTOCENTER 80
+offs_t apple2_state::dasm_trampoline(std::ostream &stream, offs_t pc, const util::disasm_interface::data_buffer &opcodes, const util::disasm_interface::data_buffer &params)
+{
+ return m_a2common->dasm_override(stream, pc, opcodes, params);
+}
+
WRITE_LINE_MEMBER(apple2_state::a2bus_irq_w)
{
m_maincpu->set_input_line(M6502_IRQ_LINE, state);
@@ -313,8 +323,8 @@ void apple2_state::machine_start()
m_inh_bank = 0;
// precalculate joystick time constants
- m_x_calibration = attotime::from_usec(12).as_double();
- m_y_calibration = attotime::from_usec(13).as_double();
+ m_x_calibration = attotime::from_nsec(10800).as_double();
+ m_y_calibration = attotime::from_nsec(10800).as_double();
// cache slot devices
for (int i = 0; i <= 7; i++)
@@ -322,6 +332,12 @@ void apple2_state::machine_start()
m_slotdevice[i] = m_a2bus->get_a2bus_card(i);
}
+ for (int adr = 0; adr < m_ram_size; adr += 2)
+ {
+ m_ram_ptr[adr] = 0;
+ m_ram_ptr[adr+1] = 0xff;
+ }
+
// setup save states
save_item(NAME(m_speaker_state));
save_item(NAME(m_cassette_state));
@@ -351,7 +367,7 @@ void apple2_state::machine_start()
void apple2_state::machine_reset()
{
- m_inh_slot = -1;
+ m_inh_slot = 0;
m_cnxx_slot = -1;
m_page2 = false;
m_an0 = m_an1 = m_an2 = m_an3 = false;
@@ -626,37 +642,39 @@ READ8_MEMBER(apple2_state::switches_r)
READ8_MEMBER(apple2_state::flags_r)
{
+ u8 uFloatingBus7 = read_floatingbus() & 0x7f;
+
// Y output of 74LS251 at H14 read as D7
switch (offset)
{
- case 0: // cassette in
- return m_cassette->input() > 0.0 ? 0x80 : 0;
+ case 0: // cassette in (accidentally read at $C068 by ProDOS to attempt IIgs STATE register)
+ return (m_cassette->input() > 0.0 ? 0x80 : 0) | uFloatingBus7;
case 1: // button 0
- return (m_joybuttons->read() & 0x10) ? 0x80 : 0;
+ return ((m_joybuttons->read() & 0x10) ? 0x80 : 0) | uFloatingBus7;
case 2: // button 1
- return (m_joybuttons->read() & 0x20) ? 0x80 : 0;
+ return ((m_joybuttons->read() & 0x20) ? 0x80 : 0) | uFloatingBus7;
case 3: // button 2
// check if SHIFT key mod configured
if (m_sysconfig->read() & 0x04)
{
- return ((m_joybuttons->read() & 0x40) || (m_kbspecial->read() & 0x06)) ? 0x80 : 0;
+ return (((m_joybuttons->read() & 0x40) || (m_kbspecial->read() & 0x06)) ? 0x80 : 0) | uFloatingBus7;
}
- return (m_joybuttons->read() & 0x40) ? 0x80 : 0;
+ return ((m_joybuttons->read() & 0x40) ? 0x80 : 0) | (read_floatingbus() & 0x7f);
case 4: // joy 1 X axis
- return (machine().time().as_double() < m_joystick_x1_time) ? 0x80 : 0;
+ return ((machine().time().as_double() < m_joystick_x1_time) ? 0x80 : 0) | uFloatingBus7;
case 5: // joy 1 Y axis
- return (machine().time().as_double() < m_joystick_y1_time) ? 0x80 : 0;
+ return ((machine().time().as_double() < m_joystick_y1_time) ? 0x80 : 0) | uFloatingBus7;
case 6: // joy 2 X axis
- return (machine().time().as_double() < m_joystick_x2_time) ? 0x80 : 0;
+ return ((machine().time().as_double() < m_joystick_x2_time) ? 0x80 : 0) | uFloatingBus7;
case 7: // joy 2 Y axis
- return (machine().time().as_double() < m_joystick_y2_time) ? 0x80 : 0;
+ return ((machine().time().as_double() < m_joystick_y2_time) ? 0x80 : 0) | uFloatingBus7;
}
// this is never reached
@@ -1369,15 +1387,19 @@ static void apple2_cards(device_slot_interface &device)
// device.option_add("magicmusician", A2BUS_MAGICMUSICIAN); /* Magic Musician Card */
}
-MACHINE_CONFIG_START(apple2_state::apple2_common)
+void apple2_state::apple2_common(machine_config &config)
+{
/* basic machine hardware */
M6502(config, m_maincpu, 1021800);
m_maincpu->set_addrmap(AS_PROGRAM, &apple2_state::apple2_map);
+ m_maincpu->set_dasm_override(FUNC(apple2_state::dasm_trampoline));
+
TIMER(config, m_scantimer, 0);
m_scantimer->configure_scanline(FUNC(apple2_state::apple2_interrupt), "screen", 0, 1);
config.m_minimum_quantum = attotime::from_hz(60);
APPLE2_VIDEO(config, m_video, XTAL(14'318'181));
+ APPLE2_COMMON(config, m_a2common, XTAL(14'318'181));
SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
m_screen->set_raw(1021800*14, (65*7)*2, 0, (40*7)*2, 262, 0, 192);
@@ -1424,10 +1446,11 @@ MACHINE_CONFIG_START(apple2_state::apple2_common)
/* slot devices */
A2BUS(config, m_a2bus, 0);
- m_a2bus->set_cputag("maincpu");
+ m_a2bus->set_space(m_maincpu, AS_PROGRAM);
m_a2bus->irq_w().set(FUNC(apple2_state::a2bus_irq_w));
m_a2bus->nmi_w().set(FUNC(apple2_state::a2bus_nmi_w));
m_a2bus->inh_w().set(FUNC(apple2_state::a2bus_inh_w));
+ m_a2bus->dma_w().set_inputline(m_maincpu, INPUT_LINE_HALT);
A2BUS_SLOT(config, "sl0", m_a2bus, apple2_slot0_cards, "lang");
A2BUS_SLOT(config, "sl1", m_a2bus, apple2_cards, nullptr);
A2BUS_SLOT(config, "sl2", m_a2bus, apple2_cards, nullptr);
@@ -1437,13 +1460,17 @@ MACHINE_CONFIG_START(apple2_state::apple2_common)
A2BUS_SLOT(config, "sl6", m_a2bus, apple2_cards, "diskiing");
A2BUS_SLOT(config, "sl7", m_a2bus, apple2_cards, nullptr);
- MCFG_SOFTWARE_LIST_ADD("flop525_list","apple2")
- MCFG_SOFTWARE_LIST_ADD("cass_list", "apple2_cass")
+ /* Set up the softlists: clean cracks priority, originals second, others last */
+ SOFTWARE_LIST(config, "flop525_clean").set_original("apple2_flop_clcracked");
+ SOFTWARE_LIST(config, "flop525_orig").set_compatible("apple2_flop_orig").set_filter("A2");
+ SOFTWARE_LIST(config, "flop525_misc").set_compatible("apple2_flop_misc");
+ SOFTWARE_LIST(config, "cass_list").set_original("apple2_cass");
+ //MCFG_SOFTWARE_LIST_ADD("cass_list", "apple2_cass")
- MCFG_CASSETTE_ADD(A2_CASSETTE_TAG)
- MCFG_CASSETTE_DEFAULT_STATE(CASSETTE_STOPPED)
- MCFG_CASSETTE_INTERFACE("apple2_cass")
-MACHINE_CONFIG_END
+ CASSETTE(config, m_cassette);
+ m_cassette->set_default_state(CASSETTE_STOPPED);
+ m_cassette->set_interface("apple2_cass");
+}
void apple2_state::apple2(machine_config &config)
{
@@ -1455,6 +1482,7 @@ void apple2_state::apple2(machine_config &config)
void apple2_state::apple2p(machine_config &config)
{
apple2_common(config);
+ subdevice<software_list_device>("flop525_orig")->set_filter("A2P"); // Filter list to compatible disks for this machine.
/* internal ram */
RAM(config, RAM_TAG).set_default_size("48K").set_extra_options("16K,32K,48K").set_default_value(0x00);
}
@@ -1464,25 +1492,25 @@ void apple2_state::space84(machine_config &config)
apple2p(config);
}
-MACHINE_CONFIG_START(apple2_state::apple2jp)
+void apple2_state::apple2jp(machine_config &config)
+{
apple2p(config);
- MCFG_SCREEN_MODIFY("screen")
- MCFG_SCREEN_UPDATE_DRIVER(apple2_state, screen_update_jp)
-MACHINE_CONFIG_END
+ m_screen->set_screen_update(FUNC(apple2_state::screen_update_jp));
+}
#if 0
-static MACHINE_CONFIG_START( laba2p )
+void apple2_state::laba2p(machine_config &config)
+{
apple2p(config);
MCFG_MACHINE_START_OVERRIDE(apple2_state,laba2p)
- MCFG_DEVICE_REMOVE("sl0")
- MCFG_DEVICE_REMOVE("sl3")
- MCFG_DEVICE_REMOVE("sl6")
+ config.device_remove("sl0");
+ config.device_remove("sl3");
+ config.device_remove("sl6");
// A2BUS_LAB_80COL("sl3", A2BUS_LAB_80COL).set_onboard(m_a2bus);
A2BUS_IWM_FDC("sl6", A2BUS_IWM_FDC).set_onboard(m_a2bus);
-
-MACHINE_CONFIG_END
+}
#endif
/***************************************************************************
diff --git a/src/mame/drivers/apple2e.cpp b/src/mame/drivers/apple2e.cpp
index 814e8b335a4..3dfce268e3d 100644
--- a/src/mame/drivers/apple2e.cpp
+++ b/src/mame/drivers/apple2e.cpp
@@ -114,6 +114,7 @@ Address bus A0-A11 is Y0-Y11
#include "machine/sonydriv.h"
#include "machine/timer.h"
#include "machine/ds1315.h"
+#include "machine/apple2common.h"
#include "bus/a2bus/a2bus.h"
#include "bus/a2bus/a2diskii.h"
@@ -152,6 +153,7 @@ Address bus A0-A11 is Y0-Y11
#include "bus/a2bus/ssprite.h"
#include "bus/a2bus/ssbapple.h"
#include "bus/a2bus/transwarp.h"
+#include "bus/a2bus/a2vulcan.h"
#include "bus/rs232/rs232.h"
@@ -211,6 +213,7 @@ public:
m_scantimer(*this, "scantimer"),
m_ram(*this, RAM_TAG),
m_rom(*this, "maincpu"),
+ m_a2common(*this, "a2common"),
m_cecbanks(*this, "cecexp"),
m_ay3600(*this, A2_KBDC_TAG),
m_video(*this, A2_VIDEO_TAG),
@@ -253,6 +256,7 @@ public:
required_device<timer_device> m_scantimer;
required_device<ram_device> m_ram;
required_memory_region m_rom;
+ required_device<apple2_common_device> m_a2common;
optional_memory_region m_cecbanks;
required_device<ay3600_device> m_ay3600;
required_device<a2_video_device> m_video;
@@ -464,7 +468,7 @@ private:
uint8_t *m_exp_ram;
int m_exp_wptr, m_exp_liveptr;
- void do_io(address_space &space, int offset, bool is_iic);
+ void do_io(int offset, bool is_iic);
uint8_t read_floatingbus();
void update_slotrom_banks();
void lc_update(int offset, bool writing);
@@ -481,6 +485,8 @@ private:
uint8_t mig_r(uint16_t offset);
void mig_w(uint16_t offset, uint8_t data);
+
+ offs_t dasm_trampoline(std::ostream &stream, offs_t pc, const util::disasm_interface::data_buffer &opcodes, const util::disasm_interface::data_buffer &params);
};
/***************************************************************************
@@ -491,6 +497,11 @@ private:
#define JOYSTICK_SENSITIVITY 50
#define JOYSTICK_AUTOCENTER 80
+offs_t apple2e_state::dasm_trampoline(std::ostream &stream, offs_t pc, const util::disasm_interface::data_buffer &opcodes, const util::disasm_interface::data_buffer &params)
+{
+ return m_a2common->dasm_override(stream, pc, opcodes, params);
+}
+
uint8_t apple2e_state::mig_r(uint16_t offset)
{
//printf("mig_r @ %x\n", offset + 0xc00);
@@ -780,8 +791,8 @@ void apple2e_state::machine_start()
}
// precalculate joystick time constants
- m_x_calibration = attotime::from_usec(12).as_double();
- m_y_calibration = attotime::from_usec(13).as_double();
+ m_x_calibration = attotime::from_nsec(10800).as_double();
+ m_y_calibration = attotime::from_nsec(10800).as_double();
// cache slot devices
for (int i = 0; i <= 7; i++)
@@ -818,6 +829,24 @@ void apple2e_state::machine_start()
m_video->m_char_ptr = memregion("gfx1")->base();
m_video->m_char_size = memregion("gfx1")->bytes();
+ int ram_size = 0x10000;
+ if (m_ram_size < 0x10000)
+ {
+ ram_size = m_ram_size;
+ }
+
+ for (int adr = 0; adr < ram_size; adr += 2)
+ {
+ m_ram_ptr[adr] = 0;
+ m_ram_ptr[adr+1] = 0xff;
+
+ if (m_ram_size >= (128*1024))
+ {
+ m_aux_ptr[adr] = 0;
+ m_aux_ptr[adr+1] = 0xff;
+ }
+ }
+
m_inh_slot = -1;
m_cnxx_slot = CNXX_UNCLAIMED;
m_mockingboard4c = false;
@@ -1369,7 +1398,7 @@ void apple2e_state::cec_lcrom_update()
}
// most softswitches don't care about read vs write, so handle them here
-void apple2e_state::do_io(address_space &space, int offset, bool is_iic)
+void apple2e_state::do_io(int offset, bool is_iic)
{
if(machine().side_effects_disabled()) return;
@@ -1592,6 +1621,7 @@ void apple2e_state::do_io(address_space &space, int offset, bool is_iic)
READ8_MEMBER(apple2e_state::c000_r)
{
if(machine().side_effects_disabled()) return read_floatingbus();
+ u8 uFloatingBus7 = read_floatingbus() & 0x7f;
if ((offset & 0xf0) == 0x00) // keyboard latch, $C000 is really 00-0F
{
@@ -1656,46 +1686,46 @@ READ8_MEMBER(apple2e_state::c000_r)
case 0x68:
if (m_cassette)
{
- return m_cassette->input() > 0.0 ? 0x80 : 0;
+ return (m_cassette->input() > 0.0 ? 0x80 : 0) | uFloatingBus7;
}
- return 0;
+ return uFloatingBus7;
case 0x61: // button 0 or Open Apple
case 0x69:
- return ((m_joybuttons->read() & 0x10) || (m_kbspecial->read() & 0x10)) ? 0x80 : 0;
+ return (((m_joybuttons->read() & 0x10) || (m_kbspecial->read() & 0x10)) ? 0x80 : 0) | uFloatingBus7;
case 0x62: // button 1 or Solid Apple
case 0x6a:
- return ((m_joybuttons->read() & 0x20) || (m_kbspecial->read() & 0x20)) ? 0x80 : 0;
+ return (((m_joybuttons->read() & 0x20) || (m_kbspecial->read() & 0x20)) ? 0x80 : 0) | uFloatingBus7;
case 0x63: // button 2 or SHIFT key
case 0x6b:
- return ((m_joybuttons->read() & 0x40) || (m_kbspecial->read() & 0x06)) ? 0x80 : 0;
+ return (((m_joybuttons->read() & 0x40) || (m_kbspecial->read() & 0x06)) ? 0x80 : 0) | uFloatingBus7;
case 0x64: // joy 1 X axis
case 0x6c:
- return (machine().time().as_double() < m_joystick_x1_time) ? 0x80 : 0;
+ return ((machine().time().as_double() < m_joystick_x1_time) ? 0x80 : 0) | uFloatingBus7;
case 0x65: // joy 1 Y axis
case 0x6d:
- return (machine().time().as_double() < m_joystick_y1_time) ? 0x80 : 0;
+ return ((machine().time().as_double() < m_joystick_y1_time) ? 0x80 : 0) | uFloatingBus7;
case 0x66: // joy 2 X axis
case 0x6e:
- return (machine().time().as_double() < m_joystick_x2_time) ? 0x80 : 0;
+ return ((machine().time().as_double() < m_joystick_x2_time) ? 0x80 : 0) | uFloatingBus7;
case 0x67: // joy 2 Y axis
case 0x6f:
- return (machine().time().as_double() < m_joystick_y2_time) ? 0x80 : 0;
+ return ((machine().time().as_double() < m_joystick_y2_time) ? 0x80 : 0) | uFloatingBus7;
case 0x7e: // read IOUDIS
- return m_ioudis ? 0x80 : 0x00;
+ return (m_ioudis ? 0x80 : 0x00) | uFloatingBus7;
case 0x7f: // read DHIRES
- return m_video->m_dhires ? 0x00 : 0x80;
+ return (m_video->m_dhires ? 0x00 : 0x80) | uFloatingBus7;
default:
- do_io(space, offset, false);
+ do_io(offset, false);
break;
}
@@ -1810,12 +1840,12 @@ WRITE8_MEMBER(apple2e_state::c000_w)
case 0x78: case 0x79: case 0x7a: case 0x7b: case 0x7c: case 0x7d:
if (m_auxslotdevice)
{
- m_auxslotdevice->write_c07x(space, offset & 0xf, data);
+ m_auxslotdevice->write_c07x(offset & 0xf, data);
// card may have banked auxram; get a new bank pointer
m_aux_bank_ptr = m_auxslotdevice->get_auxbank_ptr();
}
- do_io(space, offset, false); // make sure it also side-effect resets the paddles as documented
+ do_io(offset, false); // make sure it also side-effect resets the paddles as documented
break;
case 0x7e: // SETIOUDIS
@@ -1825,7 +1855,7 @@ WRITE8_MEMBER(apple2e_state::c000_w)
m_ioudis = false; break;
default:
- do_io(space, offset, false);
+ do_io(offset, false);
break;
}
}
@@ -1833,6 +1863,7 @@ WRITE8_MEMBER(apple2e_state::c000_w)
READ8_MEMBER(apple2e_state::c000_iic_r)
{
if(machine().side_effects_disabled()) return read_floatingbus();
+ u8 uFloatingBus7 = read_floatingbus() & 0x7f;
if ((offset & 0xf0) == 0x00) // keyboard latch, $C000 is really 00-0F
{
@@ -1908,46 +1939,46 @@ READ8_MEMBER(apple2e_state::c000_iic_r)
return m_y0edge ? 0x80 : 0x00;
case 0x60: // 40/80 column switch (IIc only)
- return (m_sysconfig->read() & 0x04) ? 0x80 : 0;
+ return ((m_sysconfig->read() & 0x04) ? 0x80 : 0) | uFloatingBus7;
case 0x61: // button 0 or Open Apple or mouse button 1
case 0x69:
- return ((m_joybuttons->read() & 0x10) || (m_kbspecial->read() & 0x10)) ? 0x80 : 0;
+ return (((m_joybuttons->read() & 0x10) || (m_kbspecial->read() & 0x10)) ? 0x80 : 0) | uFloatingBus7;
case 0x62: // button 1 or Solid Apple
case 0x6a:
- return ((m_joybuttons->read() & 0x20) || (m_kbspecial->read() & 0x20)) ? 0x80 : 0;
+ return (((m_joybuttons->read() & 0x20) || (m_kbspecial->read() & 0x20)) ? 0x80 : 0) | uFloatingBus7;
case 0x63: // mouse button 2 (no other function on IIc)
case 0x6b:
- return m_mouseb->read() ? 0 : 0x80;
+ return (m_mouseb->read() ? 0 : 0x80) | uFloatingBus7;
case 0x64: // joy 1 X axis
case 0x6c:
- return (machine().time().as_double() < m_joystick_x1_time) ? 0x80 : 0;
+ return ((machine().time().as_double() < m_joystick_x1_time) ? 0x80 : 0) | uFloatingBus7;
case 0x65: // joy 1 Y axis
case 0x6d:
- return (machine().time().as_double() < m_joystick_y1_time) ? 0x80 : 0;
+ return ((machine().time().as_double() < m_joystick_y1_time) ? 0x80 : 0) | uFloatingBus7;
case 0x66: // mouse X1 (IIc only)
case 0x6e:
- return m_x1 ? 0x80 : 0;
+ return (m_x1 ? 0x80 : 0) | uFloatingBus7;
case 0x67: // mouse Y1 (IIc only)
case 0x6f:
- return m_y1 ? 0x80 : 0;
+ return (m_y1 ? 0x80 : 0) | uFloatingBus7;
case 0x7e: // read IOUDIS
m_vbl = false;
lower_irq(IRQ_VBL);
- return m_ioudis ? 0x80 : 0x00;
+ return (m_ioudis ? 0x80 : 0x00) | uFloatingBus7;
case 0x7f: // read DHIRES
- return m_video->m_dhires ? 0x00 : 0x80;
+ return (m_video->m_dhires ? 0x00 : 0x80) | uFloatingBus7;
default:
- do_io(space, offset, true);
+ do_io(offset, true);
break;
}
@@ -2085,7 +2116,7 @@ WRITE8_MEMBER(apple2e_state::c000_iic_w)
break;
default:
- do_io(space, offset, true);
+ do_io(offset, true);
break;
}
}
@@ -2303,7 +2334,7 @@ void apple2e_state::write_slot_rom(int slotbias, int offset, uint8_t data)
uint8_t apple2e_state::read_int_rom(int slotbias, int offset)
{
//return m_rom_ptr[slotbias + offset];
- return m_ds1315->read(machine().dummy_space(), slotbias + offset);
+ return m_ds1315->read(slotbias + offset);
}
READ8_MEMBER(apple2e_state::nsc_backing_r) { return m_rom_ptr[offset]; }
@@ -3925,6 +3956,7 @@ static void apple2_cards(device_slot_interface &device)
device.option_add("arcbd", A2BUS_ARCADEBOARD); /* Third Millenium Engineering Arcade Board */
device.option_add("midi", A2BUS_MIDI); /* Generic 6840+6850 MIDI board */
device.option_add("zipdrive", A2BUS_ZIPDRIVE); /* ZIP Technologies IDE card */
+ device.option_add("focusdrive", A2BUS_FOCUSDRIVE); /* Focus Drive IDE card */
device.option_add("echoiiplus", A2BUS_ECHOPLUS); /* Street Electronics Echo Plus (Echo II + Mockingboard clone) */
device.option_add("scsi", A2BUS_SCSI); /* Apple II SCSI Card */
device.option_add("applicard", A2BUS_APPLICARD); /* PCPI Applicard */
@@ -3947,6 +3979,8 @@ static void apple2_cards(device_slot_interface &device)
device.option_add("ssprite", A2BUS_SSPRITE); /* Synetix SuperSprite Board */
device.option_add("ssbapple", A2BUS_SSBAPPLE); /* SSB Apple speech board */
device.option_add("twarp", A2BUS_TRANSWARP); /* AE TransWarp accelerator */
+ device.option_add("vulcan", A2BUS_VULCAN); /* Applied Engineering Vulcan IDE drive */
+ device.option_add("vulcangold", A2BUS_VULCANGOLD); /* Applied Engineering Vulcan Gold IDE drive */
}
static void apple2eaux_cards(device_slot_interface &device)
@@ -3956,15 +3990,19 @@ static void apple2eaux_cards(device_slot_interface &device)
device.option_add("rw3", A2EAUX_RAMWORKS3); /* Applied Engineering RamWorks III */
}
-MACHINE_CONFIG_START(apple2e_state::apple2e)
+void apple2e_state::apple2e(machine_config &config)
+{
/* basic machine hardware */
M6502(config, m_maincpu, 1021800);
m_maincpu->set_addrmap(AS_PROGRAM, &apple2e_state::apple2e_map);
+ m_maincpu->set_dasm_override(FUNC(apple2e_state::dasm_trampoline));
+
TIMER(config, m_scantimer, 0);
m_scantimer->configure_scanline(FUNC(apple2e_state::apple2_interrupt), "screen", 0, 1);
config.m_minimum_quantum = attotime::from_hz(60);
APPLE2_VIDEO(config, m_video, XTAL(14'318'181));
+ APPLE2_COMMON(config, m_a2common, XTAL(14'318'181));
SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
m_screen->set_raw(1021800*14, (65*7)*2, 0, (40*7)*2, 262, 0, 192);
@@ -4039,10 +4077,11 @@ MACHINE_CONFIG_START(apple2e_state::apple2e)
/* slot devices */
A2BUS(config, m_a2bus, 0);
- m_a2bus->set_cputag("maincpu");
+ m_a2bus->set_space(m_maincpu, AS_PROGRAM);
m_a2bus->irq_w().set(FUNC(apple2e_state::a2bus_irq_w));
m_a2bus->nmi_w().set(FUNC(apple2e_state::a2bus_nmi_w));
m_a2bus->inh_w().set(FUNC(apple2e_state::a2bus_inh_w));
+ m_a2bus->dma_w().set_inputline(m_maincpu, INPUT_LINE_HALT);
A2BUS_SLOT(config, "sl1", m_a2bus, apple2_cards, nullptr);
A2BUS_SLOT(config, "sl2", m_a2bus, apple2_cards, nullptr);
A2BUS_SLOT(config, "sl3", m_a2bus, apple2_cards, nullptr);
@@ -4051,17 +4090,21 @@ MACHINE_CONFIG_START(apple2e_state::apple2e)
A2BUS_SLOT(config, "sl6", m_a2bus, apple2_cards, "diskiing");
A2BUS_SLOT(config, "sl7", m_a2bus, apple2_cards, nullptr);
- MCFG_DEVICE_ADD(A2_AUXSLOT_TAG, A2EAUXSLOT, 0)
- MCFG_A2EAUXSLOT_CPU("maincpu")
- MCFG_A2EAUXSLOT_OUT_IRQ_CB(WRITELINE(*this, apple2e_state, a2bus_irq_w))
- MCFG_A2EAUXSLOT_OUT_NMI_CB(WRITELINE(*this, apple2e_state, a2bus_nmi_w))
- MCFG_A2EAUXSLOT_SLOT_ADD(A2_AUXSLOT_TAG, "aux", apple2eaux_cards, "ext80") // default to an extended 80-column card
+ A2EAUXSLOT(config, m_a2eauxslot, 0);
+ m_a2eauxslot->set_space(m_maincpu, AS_PROGRAM);
+ m_a2eauxslot->out_irq_callback().set(FUNC(apple2e_state::a2bus_irq_w));
+ m_a2eauxslot->out_nmi_callback().set(FUNC(apple2e_state::a2bus_nmi_w));
+ A2EAUXSLOT_SLOT(config, "aux", m_a2eauxslot, apple2eaux_cards, "ext80");
- MCFG_SOFTWARE_LIST_ADD("flop525_list","apple2")
+ /* softlist config for baseline A2E
+ By default, filter lists where possible to compatible disks for A2E */
+ SOFTWARE_LIST(config, "flop525_clean").set_original("apple2_flop_clcracked");
+ SOFTWARE_LIST(config, "flop525_orig").set_compatible("apple2_flop_orig").set_filter("A2E");
+ SOFTWARE_LIST(config, "flop525_misc").set_compatible("apple2_flop_misc");
- MCFG_CASSETTE_ADD(A2_CASSETTE_TAG)
- MCFG_CASSETTE_DEFAULT_STATE(CASSETTE_STOPPED)
-MACHINE_CONFIG_END
+ CASSETTE(config, m_cassette);
+ m_cassette->set_default_state(CASSETTE_STOPPED);
+}
void apple2e_state::mprof3(machine_config &config)
{
@@ -4070,38 +4113,48 @@ void apple2e_state::mprof3(machine_config &config)
m_ram->set_default_size("128K");
}
-MACHINE_CONFIG_START(apple2e_state::apple2ee)
+void apple2e_state::apple2ee(machine_config &config)
+{
apple2e(config);
+ subdevice<software_list_device>("flop525_orig")->set_filter("A2EE"); // Filter list to compatible disks for this machine.
+
M65C02(config.replace(), m_maincpu, 1021800);
m_maincpu->set_addrmap(AS_PROGRAM, &apple2e_state::apple2e_map);
-MACHINE_CONFIG_END
+ m_maincpu->set_dasm_override(FUNC(apple2e_state::dasm_trampoline));
+}
-MACHINE_CONFIG_START(apple2e_state::spectred)
+void apple2e_state::spectred(machine_config &config)
+{
apple2e(config);
- MCFG_DEVICE_ADD("keyb_mcu", I8035, XTAL(4'000'000)) /* guessed frequency */
- MCFG_DEVICE_PROGRAM_MAP(spectred_keyb_map)
+ i8035_device &keyb_mcu(I8035(config, "keyb_mcu", XTAL(4'000'000))); /* guessed frequency */
+ keyb_mcu.set_addrmap(AS_PROGRAM, &apple2e_state::spectred_keyb_map);
//TODO: implement the actual interfacing to this 8035 MCU and
// and then remove the keyb CPU inherited from apple2e
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(apple2e_state::tk3000)
+void apple2e_state::tk3000(machine_config &config)
+{
apple2e(config);
M65C02(config.replace(), m_maincpu, 1021800);
m_maincpu->set_addrmap(AS_PROGRAM, &apple2e_state::apple2e_map);
-// MCFG_DEVICE_ADD("subcpu", Z80, 1021800) // schematics are illegible on where the clock comes from, but it *seems* to be the same as the 65C02 clock
-// MCFG_DEVICE_PROGRAM_MAP(tk3000_kbd_map)
-MACHINE_CONFIG_END
+// z80_device &subcpu(Z80(config, "subcpu", 1021800)); // schematics are illegible on where the clock comes from, but it *seems* to be the same as the 65C02 clock
+// subcpu.set_addrmap(AS_PROGRAM, &apple2e_state::tk3000_kbd_map);
+}
-MACHINE_CONFIG_START(apple2e_state::apple2ep)
+void apple2e_state::apple2ep(machine_config &config)
+{
apple2e(config);
M65C02(config.replace(), m_maincpu, 1021800);
m_maincpu->set_addrmap(AS_PROGRAM, &apple2e_state::apple2e_map);
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(apple2e_state::apple2c)
+void apple2e_state::apple2c(machine_config &config)
+{
apple2ee(config);
+ subdevice<software_list_device>("flop525_orig")->set_filter("A2C"); // Filter list to compatible disks for this machine.
+
M65C02(config.replace(), m_maincpu, 1021800);
m_maincpu->set_addrmap(AS_PROGRAM, &apple2e_state::apple2c_map);
@@ -4144,7 +4197,7 @@ MACHINE_CONFIG_START(apple2e_state::apple2c)
config.device_remove(A2_AUXSLOT_TAG);
m_ram->set_default_size("128K").set_extra_options("128K");
-MACHINE_CONFIG_END
+}
static void apple2cp_set_lines(device_t *device, uint8_t lines)
{
@@ -4248,37 +4301,44 @@ static const floppy_interface floppy_interface =
"floppy_5_25"
};
-MACHINE_CONFIG_START(apple2e_state::apple2cp)
+void apple2e_state::apple2cp(machine_config &config)
+{
apple2c(config);
M65C02(config.replace(), m_maincpu, 1021800);
m_maincpu->set_addrmap(AS_PROGRAM, &apple2e_state::apple2c_memexp_map);
+ m_maincpu->set_dasm_override(FUNC(apple2e_state::dasm_trampoline));
config.device_remove("sl4");
config.device_remove("sl6");
- MCFG_IWM_ADD(IICP_IWM_TAG, a2cp_interface)
- MCFG_LEGACY_FLOPPY_APPLE_2_DRIVES_ADD(floppy_interface,15,16)
- MCFG_LEGACY_FLOPPY_SONY_2_DRIVES_ADDITIONAL_ADD(apple2cp_floppy35_floppy_interface)
+ IWM(config, m_iicpiwm, &a2cp_interface);
+ FLOPPY_APPLE(config, FLOPPY_0, &floppy_interface, 15, 16);
+ FLOPPY_APPLE(config, FLOPPY_1, &floppy_interface, 15, 16);
+ FLOPPY_SONY(config, FLOPPY_2, &apple2cp_floppy35_floppy_interface);
+ FLOPPY_SONY(config, FLOPPY_3, &apple2cp_floppy35_floppy_interface);
m_ram->set_default_size("128K").set_extra_options("128K, 384K, 640K, 896K, 1152K");
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(apple2e_state::apple2c_iwm)
+void apple2e_state::apple2c_iwm(machine_config &config)
+{
apple2c(config);
config.device_remove("sl6");
A2BUS_IWM_FDC(config, "sl6", A2BUS_7M_CLOCK).set_onboard(m_a2bus);
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(apple2e_state::apple2c_mem)
+void apple2e_state::apple2c_mem(machine_config &config)
+{
apple2c(config);
M65C02(config.replace(), m_maincpu, 1021800);
m_maincpu->set_addrmap(AS_PROGRAM, &apple2e_state::apple2c_memexp_map);
+ m_maincpu->set_dasm_override(FUNC(apple2e_state::dasm_trampoline));
config.device_remove("sl6");
A2BUS_IWM_FDC(config, "sl6", A2BUS_7M_CLOCK).set_onboard(m_a2bus);
m_ram->set_default_size("128K").set_extra_options("128K, 384K, 640K, 896K, 1152K");
-MACHINE_CONFIG_END
+}
const applefdc_interface fdc_interface =
{
@@ -4290,13 +4350,15 @@ const applefdc_interface fdc_interface =
apple525_read_status /* read_status */
};
-MACHINE_CONFIG_START(apple2e_state::laser128)
+void apple2e_state::laser128(machine_config &config)
+{
apple2c(config);
M65C02(config.replace(), m_maincpu, 1021800);
m_maincpu->set_addrmap(AS_PROGRAM, &apple2e_state::laser128_map);
- MCFG_APPLEFDC_ADD(LASER128_UDC_TAG, fdc_interface)
- MCFG_LEGACY_FLOPPY_APPLE_2_DRIVES_ADD(floppy_interface,15,16)
+ APPLEFDC(config, m_laserudc, &fdc_interface);
+ FLOPPY_APPLE(config, FLOPPY_0, &floppy_interface, 15, 16);
+ FLOPPY_APPLE(config, FLOPPY_1, &floppy_interface, 15, 16);
config.device_remove("sl4");
config.device_remove("sl6");
@@ -4310,15 +4372,17 @@ MACHINE_CONFIG_START(apple2e_state::laser128)
A2BUS_SLOT(config, "sl7", m_a2bus, apple2_cards, nullptr);
m_ram->set_default_size("128K").set_extra_options("128K, 384K, 640K, 896K, 1152K");
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(apple2e_state::laser128ex2)
+void apple2e_state::laser128ex2(machine_config &config)
+{
apple2c(config);
M65C02(config.replace(), m_maincpu, 1021800);
m_maincpu->set_addrmap(AS_PROGRAM, &apple2e_state::laser128_map);
- MCFG_APPLEFDC_ADD(LASER128_UDC_TAG, fdc_interface)
- MCFG_LEGACY_FLOPPY_APPLE_2_DRIVES_ADD(floppy_interface,15,16)
+ APPLEFDC(config, m_laserudc, &fdc_interface);
+ FLOPPY_APPLE(config, FLOPPY_0, &floppy_interface, 15, 16);
+ FLOPPY_APPLE(config, FLOPPY_1, &floppy_interface, 15, 16);
config.device_remove("sl4");
config.device_remove("sl6");
@@ -4332,9 +4396,10 @@ MACHINE_CONFIG_START(apple2e_state::laser128ex2)
A2BUS_LASER128(config, "sl7", A2BUS_7M_CLOCK).set_onboard(m_a2bus);
m_ram->set_default_size("128K").set_extra_options("128K, 384K, 640K, 896K, 1152K");
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(apple2e_state::ceci)
+void apple2e_state::ceci(machine_config &config)
+{
apple2e(config);
config.device_remove("sl1");
config.device_remove("sl2");
@@ -4351,7 +4416,7 @@ MACHINE_CONFIG_START(apple2e_state::ceci)
config.device_remove(A2_AUXSLOT_TAG);
m_ram->set_default_size("64K");
-MACHINE_CONFIG_END
+}
/***************************************************************************
diff --git a/src/mame/drivers/apple2gs.cpp b/src/mame/drivers/apple2gs.cpp
index 50d6c4c7de0..7830a9601f2 100644
--- a/src/mame/drivers/apple2gs.cpp
+++ b/src/mame/drivers/apple2gs.cpp
@@ -54,6 +54,7 @@
#include "emu.h"
#include "video/apple2.h"
+#include "machine/apple2common.h"
#include "bus/a2bus/a2bus.h"
#include "bus/a2bus/ramcard16k.h"
@@ -84,6 +85,7 @@
#include "bus/a2bus/timemasterho.h"
#include "bus/a2bus/mouse.h"
#include "bus/a2bus/ezcgi.h"
+#include "bus/a2bus/a2vulcan.h"
//#include "bus/a2bus/pc_xporter.h"
// various timing standards
@@ -157,6 +159,7 @@ public:
m_nvram(*this, "nvram"),
m_video(*this, A2GS_VIDEO_TAG),
m_a2bus(*this, A2GS_BUS_TAG),
+ m_a2common(*this, "a2common"),
m_joy1x(*this, "joystick_1_x"),
m_joy1y(*this, "joystick_1_y"),
m_joy2x(*this, "joystick_2_x"),
@@ -214,6 +217,7 @@ public:
required_device<nvram_device> m_nvram;
required_device<a2_video_device> m_video;
required_device<a2bus_device> m_a2bus;
+ required_device<apple2_common_device> m_a2common;
required_ioport m_joy1x, m_joy1y, m_joy2x, m_joy2y, m_joybuttons;
required_device<speaker_sound_device> m_speaker;
required_device<address_map_bank_device> m_upperbank, m_upperaux, m_upper00, m_upper01;
@@ -491,6 +495,8 @@ private:
DECLARE_WRITE8_MEMBER(adbmicro_p2_out);
DECLARE_WRITE8_MEMBER(adbmicro_p3_out);
+ offs_t dasm_trampoline(std::ostream &stream, offs_t pc, const util::disasm_interface::data_buffer &opcodes, const util::disasm_interface::data_buffer &params);
+
private:
bool m_is_rom3;
int m_speaker_state;
@@ -633,6 +639,11 @@ private:
#define JOYSTICK_SENSITIVITY 50
#define JOYSTICK_AUTOCENTER 80
+offs_t apple2gs_state::dasm_trampoline(std::ostream &stream, offs_t pc, const util::disasm_interface::data_buffer &opcodes, const util::disasm_interface::data_buffer &params)
+{
+ return m_a2common->dasm_override_GS(stream, pc, opcodes, params);
+}
+
WRITE_LINE_MEMBER(apple2gs_state::a2bus_irq_w)
{
if (state == ASSERT_LINE)
@@ -1212,8 +1223,8 @@ void apple2gs_state::machine_start()
m_speaker->set_levels(16, lvlTable);
// precalculate joystick time constants
- m_x_calibration = attotime::from_usec(12).as_double();
- m_y_calibration = attotime::from_usec(13).as_double();
+ m_x_calibration = attotime::from_nsec(10800).as_double();
+ m_y_calibration = attotime::from_nsec(10800).as_double();
// cache slot devices
for (int i = 0; i <= 7; i++)
@@ -2029,6 +2040,7 @@ READ8_MEMBER(apple2gs_state::c000_r)
}
slow_cycle();
+ u8 uFloatingBus7 = read_floatingbus();
switch (offset)
{
@@ -2272,28 +2284,28 @@ READ8_MEMBER(apple2gs_state::c000_r)
return (m_an3 ? INTFLAG_AN3 : 0x00) | m_intflag;
case 0x60: // button 3 on IIgs
- return (m_joybuttons->read() & 0x80);
+ return (m_joybuttons->read() & 0x80) | uFloatingBus7;
case 0x61: // button 0 or Open Apple
- return ((m_joybuttons->read() & 0x10) || (m_kbspecial->read() & 0x10)) ? 0x80 : 0;
+ return (((m_joybuttons->read() & 0x10) || (m_kbspecial->read() & 0x10)) ? 0x80 : 0) | uFloatingBus7;
case 0x62: // button 1 or Solid Apple
- return ((m_joybuttons->read() & 0x20) || (m_kbspecial->read() & 0x20)) ? 0x80 : 0;
+ return (((m_joybuttons->read() & 0x20) || (m_kbspecial->read() & 0x20)) ? 0x80 : 0) | uFloatingBus7;
case 0x63: // button 2 or SHIFT key
- return ((m_joybuttons->read() & 0x40) || (m_kbspecial->read() & 0x06)) ? 0x80 : 0;
+ return (((m_joybuttons->read() & 0x40) || (m_kbspecial->read() & 0x06)) ? 0x80 : 0) | uFloatingBus7;
case 0x64: // joy 1 X axis
- return (machine().time().as_double() < m_joystick_x1_time) ? 0x80 : 0;
+ return ((machine().time().as_double() < m_joystick_x1_time) ? 0x80 : 0) | uFloatingBus7;
case 0x65: // joy 1 Y axis
- return (machine().time().as_double() < m_joystick_y1_time) ? 0x80 : 0;
+ return ((machine().time().as_double() < m_joystick_y1_time) ? 0x80 : 0) | uFloatingBus7;
case 0x66: // joy 2 X axis
- return (machine().time().as_double() < m_joystick_x2_time) ? 0x80 : 0;
+ return ((machine().time().as_double() < m_joystick_x2_time) ? 0x80 : 0) | uFloatingBus7;
case 0x67: // joy 2 Y axis
- return (machine().time().as_double() < m_joystick_y2_time) ? 0x80 : 0;
+ return ((machine().time().as_double() < m_joystick_y2_time) ? 0x80 : 0) | uFloatingBus7;
case 0x68: // STATEREG, synthesizes all the IIe state regs
return (m_altzp ? 0x80 : 0x00) |
@@ -3498,7 +3510,7 @@ WRITE8_MEMBER(apple2gs_state::bank1_0000_sh_w)
void apple2gs_state::apple2gs_map(address_map &map)
{
/* "fast side" - runs 2.8 MHz minus RAM refresh, banks 00 and 01 usually have writes shadowed to E0/E1 where I/O lives */
- /* Banks 00 and 01 also have their own independent language cards if shadowing is disabled */
+ /* Banks 00 and 01 also have their own independent language cards which are NOT shadowed. */
map(0x000000, 0x0001ff).m(m_b0_0000bank, FUNC(address_map_bank_device::amap8));
map(0x000200, 0x0003ff).m(m_b0_0200bank, FUNC(address_map_bank_device::amap8));
map(0x000400, 0x0007ff).m(m_b0_0400bank, FUNC(address_map_bank_device::amap8));
@@ -4511,6 +4523,7 @@ static void apple2_cards(device_slot_interface &device)
device.option_add("arcbd", A2BUS_ARCADEBOARD); /* Third Millenium Engineering Arcade Board */
device.option_add("midi", A2BUS_MIDI); /* Generic 6840+6850 MIDI board */
device.option_add("zipdrive", A2BUS_ZIPDRIVE); /* ZIP Technologies IDE card */
+ device.option_add("focusdrive", A2BUS_FOCUSDRIVE); /* Focus Drive IDE card */
device.option_add("echoiiplus", A2BUS_ECHOPLUS); /* Street Electronics Echo Plus (Echo II + Mockingboard clone) */
device.option_add("scsi", A2BUS_SCSI); /* Apple II SCSI Card */
device.option_add("applicard", A2BUS_APPLICARD); /* PCPI Applicard */
@@ -4528,6 +4541,8 @@ static void apple2_cards(device_slot_interface &device)
device.option_add("ezcgi", A2BUS_EZCGI); /* E-Z Color Graphics Interface */
device.option_add("ezcgi9938", A2BUS_EZCGI_9938); /* E-Z Color Graphics Interface (TMS9938) */
device.option_add("ezcgi9958", A2BUS_EZCGI_9958); /* E-Z Color Graphics Interface (TMS9958) */
+ device.option_add("vulcan", A2BUS_VULCAN); /* Applied Engineering Vulcan IDE drive */
+ device.option_add("vulcangold", A2BUS_VULCANGOLD); /* Applied Engineering Vulcan Gold IDE drive */
// device.option_add("magicmusician", A2BUS_MAGICMUSICIAN); /* Magic Musician Card */
// device.option_add("pcxport", A2BUS_PCXPORTER); /* Applied Engineering PC Transporter */
}
@@ -4538,6 +4553,7 @@ void apple2gs_state::apple2gs(machine_config &config)
G65816(config, m_maincpu, A2GS_MASTER_CLOCK/10);
m_maincpu->set_addrmap(AS_PROGRAM, &apple2gs_state::apple2gs_map);
m_maincpu->set_addrmap(g65816_device::AS_VECTORS, &apple2gs_state::vectors_map);
+ m_maincpu->set_dasm_override(FUNC(apple2gs_state::dasm_trampoline));
TIMER(config, m_scantimer, 0);
m_scantimer->configure_scanline(FUNC(apple2gs_state::apple2_interrupt), "screen", 0, 1);
config.m_minimum_quantum = attotime::from_hz(60);
@@ -4577,6 +4593,9 @@ void apple2gs_state::apple2gs(machine_config &config)
APPLE2_VIDEO(config, m_video, A2GS_14M);
+ APPLE2_COMMON(config, m_a2common, A2GS_14M);
+ m_a2common->set_GS_cputag(m_maincpu);
+
SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
m_screen->set_refresh_hz(60);
m_screen->set_size(704, 262); // 640+32+32 for the borders
@@ -4683,10 +4702,11 @@ void apple2gs_state::apple2gs(machine_config &config)
/* slot devices */
A2BUS(config, m_a2bus, 0);
- m_a2bus->set_cputag("maincpu");
+ m_a2bus->set_space(m_maincpu, AS_PROGRAM);
m_a2bus->irq_w().set(FUNC(apple2gs_state::a2bus_irq_w));
m_a2bus->nmi_w().set(FUNC(apple2gs_state::a2bus_nmi_w));
m_a2bus->inh_w().set(FUNC(apple2gs_state::a2bus_inh_w));
+ m_a2bus->dma_w().set_inputline(m_maincpu, INPUT_LINE_HALT);
A2BUS_SLOT(config, "sl1", m_a2bus, apple2_cards, nullptr);
A2BUS_SLOT(config, "sl2", m_a2bus, apple2_cards, nullptr);
A2BUS_SLOT(config, "sl3", m_a2bus, apple2_cards, nullptr);
@@ -4704,7 +4724,10 @@ void apple2gs_state::apple2gs(machine_config &config)
FLOPPY_SONY(config, FLOPPY_3, &apple2gs_floppy35_floppy_interface);
SOFTWARE_LIST(config, "flop35_list").set_original("apple2gs");
- SOFTWARE_LIST(config, "flop525_list").set_compatible("apple2");
+ SOFTWARE_LIST(config, "flop525_clean").set_compatible("apple2_flop_clcracked"); // No filter on clean cracks yet.
+ // As WOZ images won't load in the 2GS driver yet, comment out the softlist entry.
+ //SOFTWARE_LIST(config, "flop525_orig").set_compatible("apple2_flop_orig").set_filter("A2GS"); // Filter list to compatible disks for this machine.
+ SOFTWARE_LIST(config, "flop525_misc").set_compatible("apple2_misc");
}
void apple2gs_state::apple2gsr1(machine_config &config)
diff --git a/src/mame/drivers/apple3.cpp b/src/mame/drivers/apple3.cpp
index 48557d211f9..ecaa1453d03 100644
--- a/src/mame/drivers/apple3.cpp
+++ b/src/mame/drivers/apple3.cpp
@@ -25,6 +25,7 @@
#include "bus/a2bus/a2applicard.h"
#include "bus/a2bus/a2thunderclock.h"
#include "bus/a2bus/mouse.h"
+#include "bus/a2bus/a2zipdrive.h"
#include "bus/rs232/rs232.h"
@@ -44,6 +45,7 @@ static void apple3_cards(device_slot_interface &device)
device.option_add("applicard", A2BUS_APPLICARD); // PCPI Applicard
device.option_add("thclock", A2BUS_THUNDERCLOCK); // ThunderWare ThunderClock Plus - driver assumes slot 2 by default
device.option_add("mouse", A2BUS_MOUSE); // Apple II Mouse Card
+ device.option_add("focusdrive", A2BUS_FOCUSDRIVE); // Focus Drive IDE card
}
static void a3_floppies(device_slot_interface &device)
@@ -96,10 +98,11 @@ void apple3_state::apple3(machine_config &config)
/* slot bus */
A2BUS(config, m_a2bus, 0);
- m_a2bus->set_cputag("maincpu");
+ m_a2bus->set_space(m_maincpu, AS_PROGRAM);
m_a2bus->irq_w().set(FUNC(apple3_state::a2bus_irq_w));
m_a2bus->nmi_w().set(FUNC(apple3_state::a2bus_nmi_w));
//m_a2bus->inh_w().set(FUNC(apple3_state::a2bus_inh_w));
+ m_a2bus->dma_w().set_inputline(m_maincpu, INPUT_LINE_HALT);
A2BUS_SLOT(config, "sl1", m_a2bus, apple3_cards, nullptr);
A2BUS_SLOT(config, "sl2", m_a2bus, apple3_cards, nullptr);
A2BUS_SLOT(config, "sl3", m_a2bus, apple3_cards, nullptr);
@@ -151,7 +154,6 @@ void apple3_state::apple3(machine_config &config)
DAC_1BIT(config, m_bell, 0).add_route(ALL_OUTPUTS, "speaker", 0.99);
DAC_6BIT_BINARY_WEIGHTED(config, m_dac, 0).add_route(ALL_OUTPUTS, "speaker", 0.125); // 6522.b5(pb0-pb5) + 320k,160k,80k,40k,20k,10k
voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref", 0));
- vref.set_output(5.0);
vref.add_route(0, "bell", 1.0, DAC_VREF_POS_INPUT);
vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT);
vref.add_route(0, "dac", -1.0, DAC_VREF_NEG_INPUT);
diff --git a/src/mame/drivers/applix.cpp b/src/mame/drivers/applix.cpp
index 2176f468202..01b3043ef01 100644
--- a/src/mame/drivers/applix.cpp
+++ b/src/mame/drivers/applix.cpp
@@ -847,14 +847,15 @@ TIMER_DEVICE_CALLBACK_MEMBER(applix_state::cass_timer)
}
}
-MACHINE_CONFIG_START(applix_state::applix)
+void applix_state::applix(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M68000, 30_MHz_XTAL / 4) // MC68000-P10 @ 7.5 MHz
- MCFG_DEVICE_PROGRAM_MAP(applix_mem)
+ M68000(config, m_maincpu, 30_MHz_XTAL / 4); // MC68000-P10 @ 7.5 MHz
+ m_maincpu->set_addrmap(AS_PROGRAM, &applix_state::applix_mem);
- MCFG_DEVICE_ADD("subcpu", Z80, 16_MHz_XTAL / 2) // Z80H
- MCFG_DEVICE_PROGRAM_MAP(subcpu_mem)
- MCFG_DEVICE_IO_MAP(subcpu_io)
+ z80_device &subcpu(Z80(config, "subcpu", 16_MHz_XTAL / 2)); // Z80H
+ subcpu.set_addrmap(AS_PROGRAM, &applix_state::subcpu_mem);
+ subcpu.set_addrmap(AS_IO, &applix_state::subcpu_io);
i8051_device &kbdcpu(I8051(config, "kbdcpu", 11060250));
kbdcpu.set_addrmap(AS_PROGRAM, &applix_state::keytronic_pc3270_program);
@@ -867,24 +868,24 @@ MACHINE_CONFIG_START(applix_state::applix)
kbdcpu.port_out_cb<3>().set(FUNC(applix_state::p3_write));
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(50)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */
- MCFG_SCREEN_SIZE(640, 200)
- MCFG_SCREEN_VISIBLE_AREA(0, 640-1, 0, 200-1)
- MCFG_SCREEN_UPDATE_DEVICE("crtc", mc6845_device, screen_update)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(50);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */
+ screen.set_size(640, 200);
+ screen.set_visarea_full();
+ screen.set_screen_update("crtc", FUNC(mc6845_device::screen_update));
PALETTE(config, m_palette, FUNC(applix_state::applix_palette), 16);
/* sound hardware */
SPEAKER(config, "lspeaker").front_left();
SPEAKER(config, "rspeaker").front_right();
- MCFG_DEVICE_ADD("ldac", DAC0800, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 1.0) // 74ls374.u20 + dac0800.u21 + 4052.u23
- MCFG_DEVICE_ADD("rdac", DAC0800, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 1.0) // 74ls374.u20 + dac0800.u21 + 4052.u23
- MCFG_DEVICE_ADD("vref", VOLTAGE_REGULATOR, 0) MCFG_VOLTAGE_REGULATOR_OUTPUT(5.0)
- MCFG_SOUND_ROUTE(0, "ldac", 1.0, DAC_VREF_POS_INPUT) MCFG_SOUND_ROUTE(0, "ldac", -1.0, DAC_VREF_NEG_INPUT)
- MCFG_SOUND_ROUTE(0, "rdac", 1.0, DAC_VREF_POS_INPUT) MCFG_SOUND_ROUTE(0, "rdac", -1.0, DAC_VREF_NEG_INPUT)
+ DAC0800(config, "ldac", 0).add_route(ALL_OUTPUTS, "lspeaker", 1.0); // 74ls374.u20 + dac0800.u21 + 4052.u23
+ DAC0800(config, "rdac", 0).add_route(ALL_OUTPUTS, "rspeaker", 1.0); // 74ls374.u20 + dac0800.u21 + 4052.u23
+ voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref"));
+ vref.add_route(0, "ldac", 1.0, DAC_VREF_POS_INPUT).add_route(0, "ldac", -1.0, DAC_VREF_NEG_INPUT);
+ vref.add_route(0, "rdac", 1.0, DAC_VREF_POS_INPUT).add_route(0, "rdac", -1.0, DAC_VREF_NEG_INPUT);
- WAVE(config, "wave", "cassette").add_route(ALL_OUTPUTS, "lspeaker", 0.50);
+ WAVE(config, "wave", m_cass).add_route(ALL_OUTPUTS, "lspeaker", 0.50);
/* Devices */
MC6845(config, m_crtc, 30_MHz_XTAL / 16); // MC6545 @ 1.875 MHz
@@ -904,22 +905,21 @@ MACHINE_CONFIG_START(applix_state::applix)
m_via->writepb_handler().set(FUNC(applix_state::applix_pb_w));
m_via->irq_handler().set_inputline("maincpu", M68K_IRQ_2);
- MCFG_DEVICE_ADD(m_centronics, CENTRONICS, centronics_devices, "printer")
- MCFG_CENTRONICS_ACK_HANDLER(WRITELINE("via6522", via6522_device, write_ca1))
- MCFG_CENTRONICS_BUSY_HANDLER(WRITELINE("via6522", via6522_device, write_pa0))
+ CENTRONICS(config, m_centronics, centronics_devices, "printer");
+ m_centronics->ack_handler().set(m_via, FUNC(via6522_device::write_ca1));
+ m_centronics->busy_handler().set(m_via, FUNC(via6522_device::write_pa0));
- MCFG_CENTRONICS_OUTPUT_LATCH_ADD("cent_data_out", "centronics")
+ OUTPUT_LATCH(config, m_cent_data_out);
+ m_centronics->set_output_latch(*m_cent_data_out);
- MCFG_CASSETTE_ADD("cassette")
- MCFG_CASSETTE_DEFAULT_STATE(CASSETTE_STOPPED | CASSETTE_MOTOR_ENABLED | CASSETTE_SPEAKER_MUTED)
+ CASSETTE(config, m_cass);
+ m_cass->set_default_state(CASSETTE_STOPPED | CASSETTE_MOTOR_ENABLED | CASSETTE_SPEAKER_MUTED);
WD1772(config, m_fdc, 16_MHz_XTAL / 2); //connected to Z80H clock pin
- MCFG_FLOPPY_DRIVE_ADD("fdc:0", applix_floppies, "35dd", applix_state::floppy_formats)
- MCFG_FLOPPY_DRIVE_SOUND(true)
- MCFG_FLOPPY_DRIVE_ADD("fdc:1", applix_floppies, "35dd", applix_state::floppy_formats)
- MCFG_FLOPPY_DRIVE_SOUND(true)
- MCFG_TIMER_DRIVER_ADD_PERIODIC("applix_c", applix_state, cass_timer, attotime::from_hz(100000))
-MACHINE_CONFIG_END
+ FLOPPY_CONNECTOR(config, "fdc:0", applix_floppies, "35dd", applix_state::floppy_formats).enable_sound(true);
+ FLOPPY_CONNECTOR(config, "fdc:1", applix_floppies, "35dd", applix_state::floppy_formats).enable_sound(true);
+ TIMER(config, "applix_c").configure_periodic(FUNC(applix_state::cass_timer), attotime::from_hz(100000));
+}
/* ROM definition */
ROM_START( applix )
diff --git a/src/mame/drivers/appoooh.cpp b/src/mame/drivers/appoooh.cpp
index 1c15989ee51..488fffffa82 100644
--- a/src/mame/drivers/appoooh.cpp
+++ b/src/mame/drivers/appoooh.cpp
@@ -240,9 +240,9 @@ void appoooh_state::decrypted_opcodes_map(address_map &map)
void appoooh_state::main_portmap(address_map &map)
{
map.global_mask(0xff);
- map(0x00, 0x00).portr("P1").w("sn1", FUNC(sn76489_device::command_w));
- map(0x01, 0x01).portr("P2").w("sn2", FUNC(sn76489_device::command_w));
- map(0x02, 0x02).w("sn3", FUNC(sn76489_device::command_w));
+ map(0x00, 0x00).portr("P1").w("sn1", FUNC(sn76489_device::write));
+ map(0x01, 0x01).portr("P2").w("sn2", FUNC(sn76489_device::write));
+ map(0x02, 0x02).w("sn3", FUNC(sn76489_device::write));
map(0x03, 0x03).portr("DSW1").w(FUNC(appoooh_state::adpcm_w));
map(0x04, 0x04).portr("BUTTON3").w(FUNC(appoooh_state::out_w));
map(0x05, 0x05).w(FUNC(appoooh_state::scroll_w)); /* unknown */
diff --git a/src/mame/drivers/apricot.cpp b/src/mame/drivers/apricot.cpp
index 5ccd0e5c225..b27900d1abe 100644
--- a/src/mame/drivers/apricot.cpp
+++ b/src/mame/drivers/apricot.cpp
@@ -59,6 +59,7 @@ public:
m_floppy0(*this, "ic68:0"),
m_floppy1(*this, "ic68:1"),
m_palette(*this, "palette"),
+ m_exp(*this, "exp"),
m_screen_buffer(*this, "screen_buffer"),
m_video_mode(0),
m_display_on(1),
@@ -113,6 +114,7 @@ private:
required_device<floppy_connector> m_floppy0;
required_device<floppy_connector> m_floppy1;
required_device<palette_device> m_palette;
+ required_device<apricot_expansion_bus_device> m_exp;
required_shared_ptr<uint16_t> m_screen_buffer;
bool m_video_mode;
@@ -339,7 +341,7 @@ void apricot_state::apricot_io(address_map &map)
map(0x00, 0x03).rw(m_pic, FUNC(pic8259_device::read), FUNC(pic8259_device::write)).umask16(0x00ff);
map(0x40, 0x47).rw(m_fdc, FUNC(wd2797_device::read), FUNC(wd2797_device::write)).umask16(0x00ff);
map(0x48, 0x4f).rw(m_ppi, FUNC(i8255_device::read), FUNC(i8255_device::write)).umask16(0x00ff);
- map(0x50, 0x50).mirror(0x06).w("ic7", FUNC(sn76489_device::command_w));
+ map(0x50, 0x50).mirror(0x06).w("ic7", FUNC(sn76489_device::write));
map(0x58, 0x5f).rw(m_pit, FUNC(pit8253_device::read), FUNC(pit8253_device::write)).umask16(0x00ff);
map(0x60, 0x60).r(FUNC(apricot_state::sio_da_r)).w(m_sio, FUNC(z80sio_device::da_w)).umask16(0x00ff);
map(0x62, 0x62).r(FUNC(apricot_state::sio_ca_r)).w(m_sio, FUNC(z80sio_device::ca_w)).umask16(0x00ff);
@@ -471,7 +473,13 @@ void apricot_state::apricot(machine_config &config)
SOFTWARE_LIST(config, "flop_list").set_original("apricot_flop");
// expansion bus
- APRICOT_EXPANSION_BUS(config, "exp", m_cpu, m_iop);
+ APRICOT_EXPANSION_BUS(config, m_exp, 0);
+ m_exp->set_program_space(m_cpu, AS_PROGRAM);
+ m_exp->set_io_space(m_cpu, AS_IO);
+ m_exp->set_program_iop_space(m_iop, AS_PROGRAM);
+ m_exp->set_io_iop_space(m_iop, AS_IO);
+ m_exp->int2().set(m_pic, FUNC(pic8259_device::ir2_w));
+ m_exp->int3().set(m_pic, FUNC(pic8259_device::ir3_w));
APRICOT_EXPANSION_SLOT(config, "exp:1", apricot_expansion_cards, nullptr);
APRICOT_EXPANSION_SLOT(config, "exp:2", apricot_expansion_cards, nullptr);
}
diff --git a/src/mame/drivers/apricotf.cpp b/src/mame/drivers/apricotf.cpp
index ceffb12675d..93ec038ba5d 100644
--- a/src/mame/drivers/apricotf.cpp
+++ b/src/mame/drivers/apricotf.cpp
@@ -342,29 +342,29 @@ void apricotf_floppies(device_slot_interface &device)
//**************************************************************************
//-------------------------------------------------
-// MACHINE_CONFIG( act_f1 )
+// machine_config( act_f1 )
//-------------------------------------------------
-MACHINE_CONFIG_START(f1_state::act_f1)
+void f1_state::act_f1(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD(I8086_TAG, I8086, 14_MHz_XTAL / 4)
- MCFG_DEVICE_PROGRAM_MAP(act_f1_mem)
- MCFG_DEVICE_IO_MAP(act_f1_io)
+ I8086(config, m_maincpu, 14_MHz_XTAL / 4);
+ m_maincpu->set_addrmap(AS_PROGRAM, &f1_state::act_f1_mem);
+ m_maincpu->set_addrmap(AS_IO, &f1_state::act_f1_io);
- MCFG_INPUT_MERGER_ANY_HIGH("irqs")
- MCFG_INPUT_MERGER_OUTPUT_HANDLER(INPUTLINE(I8086_TAG, INPUT_LINE_IRQ0))
+ INPUT_MERGER_ANY_HIGH(config, "irqs").output_handler().set_inputline(m_maincpu, INPUT_LINE_IRQ0);
/* video hardware */
- MCFG_SCREEN_ADD(SCREEN_TAG, RASTER)
- MCFG_SCREEN_REFRESH_RATE(50)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */
- MCFG_SCREEN_UPDATE_DRIVER(f1_state, screen_update)
- MCFG_SCREEN_SIZE(640, 256)
- MCFG_SCREEN_VISIBLE_AREA(0, 640-1, 0, 256-1)
- MCFG_SCREEN_PALETTE("palette")
+ screen_device &screen(SCREEN(config, SCREEN_TAG, SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(50);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */
+ screen.set_screen_update(FUNC(f1_state::screen_update));
+ screen.set_size(640, 256);
+ screen.set_visarea_full();
+ screen.set_palette(m_palette);
- MCFG_PALETTE_ADD("palette", 16)
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_act_f1)
+ PALETTE(config, m_palette).set_entries(16);
+ GFXDECODE(config, "gfxdecode", m_palette, gfx_act_f1);
/* Devices */
APRICOT_KEYBOARD(config, APRICOT_KEYBOARD_TAG, 0);
@@ -377,19 +377,20 @@ MACHINE_CONFIG_START(f1_state::act_f1)
m_ctc->zc_callback<1>().set(FUNC(f1_state::ctc_z1_w));
m_ctc->zc_callback<2>().set(FUNC(f1_state::ctc_z2_w));
- MCFG_DEVICE_ADD(m_centronics, CENTRONICS, centronics_devices, "printer")
- MCFG_CENTRONICS_BUSY_HANDLER(WRITELINE(m_sio, z80sio_device, ctsa_w))
+ CENTRONICS(config, m_centronics, centronics_devices, "printer");
+ m_centronics->busy_handler().set(m_sio, FUNC(z80sio_device::ctsa_w));
- MCFG_CENTRONICS_OUTPUT_LATCH_ADD("cent_data_out", CENTRONICS_TAG)
+ OUTPUT_LATCH(config, m_cent_data_out);
+ m_centronics->set_output_latch(*m_cent_data_out);
// floppy
WD2797(config, m_fdc, 4_MHz_XTAL / 2 /* ? */);
m_fdc->intrq_wr_callback().set_inputline(m_maincpu, INPUT_LINE_NMI);
m_fdc->drq_wr_callback().set_inputline(m_maincpu, INPUT_LINE_TEST);
- MCFG_FLOPPY_DRIVE_ADD(WD2797_TAG ":0", apricotf_floppies, "d32w", f1_state::floppy_formats)
- MCFG_FLOPPY_DRIVE_ADD(WD2797_TAG ":1", apricotf_floppies, "d32w", f1_state::floppy_formats)
-MACHINE_CONFIG_END
+ FLOPPY_CONNECTOR(config, WD2797_TAG ":0", apricotf_floppies, "d32w", f1_state::floppy_formats);
+ FLOPPY_CONNECTOR(config, WD2797_TAG ":1", apricotf_floppies, "d32w", f1_state::floppy_formats);
+}
diff --git a/src/mame/drivers/apricotp.cpp b/src/mame/drivers/apricotp.cpp
index 1b8575942ed..2def89372c1 100644
--- a/src/mame/drivers/apricotp.cpp
+++ b/src/mame/drivers/apricotp.cpp
@@ -446,7 +446,7 @@ void fp_state::fp_io(address_map &map)
map(0x020, 0x020).w("cent_data_out", FUNC(output_latch_device::bus_w));
map(0x022, 0x022).w(FUNC(fp_state::pint_clr_w));
map(0x024, 0x024).r(FUNC(fp_state::prtr_snd_r));
- map(0x026, 0x026).w(SN76489AN_TAG, FUNC(sn76489a_device::command_w));
+ map(0x026, 0x026).w(SN76489AN_TAG, FUNC(sn76489a_device::write));
map(0x028, 0x028).w(FUNC(fp_state::contrast_w));
map(0x02a, 0x02a).w(FUNC(fp_state::palette_w));
map(0x02e, 0x02f).w(FUNC(fp_state::video_w));
@@ -563,40 +563,41 @@ FLOPPY_FORMATS_END
//-------------------------------------------------
-// MACHINE_CONFIG( fp )
+// machine_config( fp )
//-------------------------------------------------
-MACHINE_CONFIG_START(fp_state::fp)
+void fp_state::fp(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD(I8086_TAG, I8086, 15_MHz_XTAL / 3)
- MCFG_DEVICE_PROGRAM_MAP(fp_mem)
- MCFG_DEVICE_IO_MAP(fp_io)
- MCFG_DEVICE_IRQ_ACKNOWLEDGE_DEVICE(I8259A_TAG, pic8259_device, inta_cb)
+ I8086(config, m_maincpu, 15_MHz_XTAL / 3);
+ m_maincpu->set_addrmap(AS_PROGRAM, &fp_state::fp_mem);
+ m_maincpu->set_addrmap(AS_IO, &fp_state::fp_io);
+ m_maincpu->set_irq_acknowledge_callback(I8259A_TAG, FUNC(pic8259_device::inta_cb));
- MCFG_DEVICE_ADD(HD63B01V1_TAG, HD6301, 2000000)
- MCFG_DEVICE_PROGRAM_MAP(sound_mem)
- MCFG_DEVICE_DISABLE()
+ HD6301(config, m_soundcpu, 2000000);
+ m_soundcpu->set_addrmap(AS_PROGRAM, &fp_state::sound_mem);
+ m_soundcpu->set_disable();
/* video hardware */
config.set_default_layout(layout_apricotp);
- MCFG_SCREEN_ADD(SCREEN_LCD_TAG, LCD)
- MCFG_SCREEN_REFRESH_RATE(50)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */
- MCFG_SCREEN_UPDATE_DRIVER(fp_state, screen_update)
- MCFG_SCREEN_SIZE(640, 200)
- MCFG_SCREEN_VISIBLE_AREA(0, 640-1, 0, 200-1)
- MCFG_SCREEN_PALETTE("palette")
+ screen_device &screen_lcd(SCREEN(config, SCREEN_LCD_TAG, SCREEN_TYPE_RASTER));
+ screen_lcd.set_refresh_hz(50);
+ screen_lcd.set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */
+ screen_lcd.set_screen_update(FUNC(fp_state::screen_update));
+ screen_lcd.set_size(640, 200);
+ screen_lcd.set_visarea_full();
+ screen_lcd.set_palette("palette");
- MCFG_SCREEN_ADD(SCREEN_CRT_TAG, RASTER)
- MCFG_SCREEN_REFRESH_RATE(50)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */
- MCFG_SCREEN_UPDATE_DEVICE(MC6845_TAG, mc6845_device, screen_update)
- MCFG_SCREEN_SIZE(640, 256)
- MCFG_SCREEN_VISIBLE_AREA(0, 640-1, 0, 256-1)
+ screen_device &screen_crt(SCREEN(config, SCREEN_CRT_TAG, SCREEN_TYPE_RASTER));
+ screen_crt.set_refresh_hz(50);
+ screen_crt.set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */
+ screen_crt.set_screen_update(MC6845_TAG, FUNC(mc6845_device::screen_update));
+ screen_crt.set_size(640, 256);
+ screen_crt.set_visarea_full();
- MCFG_PALETTE_ADD("palette", 16)
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_act_f1)
+ PALETTE(config, "palette").set_entries(16);
+ GFXDECODE(config, "gfxdecode", "palette", gfx_act_f1);
MC6845(config, m_crtc, 4000000);
m_crtc->set_screen(SCREEN_CRT_TAG);
@@ -606,8 +607,7 @@ MACHINE_CONFIG_START(fp_state::fp)
// sound hardware
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD(SN76489AN_TAG, SN76489A, 2000000)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.00)
+ SN76489A(config, SN76489AN_TAG, 2000000).add_route(ALL_OUTPUTS, "mono", 1.00);
/* Devices */
APRICOT_KEYBOARD(config, APRICOT_KEYBOARD_TAG, 0);
@@ -642,11 +642,12 @@ MACHINE_CONFIG_START(fp_state::fp)
m_centronics->fault_handler().set(FUNC(fp_state::write_centronics_fault));
m_centronics->perror_handler().set(FUNC(fp_state::write_centronics_perror));
- MCFG_CENTRONICS_OUTPUT_LATCH_ADD("cent_data_out", CENTRONICS_TAG)
+ output_latch_device &cent_data_out(OUTPUT_LATCH(config, "cent_data_out"));
+ m_centronics->set_output_latch(cent_data_out);
/* internal ram */
RAM(config, RAM_TAG).set_default_size("256K").set_extra_options("512K,1M");
-MACHINE_CONFIG_END
+}
diff --git a/src/mame/drivers/aquarium.cpp b/src/mame/drivers/aquarium.cpp
index 0f3dd904512..d4379d9181f 100644
--- a/src/mame/drivers/aquarium.cpp
+++ b/src/mame/drivers/aquarium.cpp
@@ -87,13 +87,13 @@ uint8_t aquarium_state::aquarium_snd_bitswap( uint8_t scrambled_data )
READ8_MEMBER(aquarium_state::aquarium_oki_r)
{
- return aquarium_snd_bitswap(m_oki->read(space, offset));
+ return aquarium_snd_bitswap(m_oki->read());
}
WRITE8_MEMBER(aquarium_state::aquarium_oki_w)
{
logerror("%s:Writing %04x to the OKI M6295\n", machine().describe_context(), aquarium_snd_bitswap(data));
- m_oki->write(space, offset, (aquarium_snd_bitswap(data)));
+ m_oki->write(aquarium_snd_bitswap(data));
}
@@ -287,33 +287,33 @@ static GFXDECODE_START( gfx_aquarium )
GFXDECODE_ENTRY( "gfx4", 0, char5bpplayout, 0x400, 32 )
GFXDECODE_END
-MACHINE_CONFIG_START(aquarium_state::aquarium)
-
+void aquarium_state::aquarium(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M68000, XTAL(32'000'000)/2) // clock not verified on pcb
- MCFG_DEVICE_PROGRAM_MAP(main_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", aquarium_state, irq1_line_hold)
+ M68000(config, m_maincpu, XTAL(32'000'000)/2); // clock not verified on pcb
+ m_maincpu->set_addrmap(AS_PROGRAM, &aquarium_state::main_map);
+ m_maincpu->set_vblank_int("screen", FUNC(aquarium_state::irq1_line_hold));
- MCFG_DEVICE_ADD("audiocpu", Z80, XTAL(32'000'000)/6) // clock not verified on pcb
- MCFG_DEVICE_PROGRAM_MAP(snd_map)
- MCFG_DEVICE_IO_MAP(snd_portmap)
+ Z80(config, m_audiocpu, XTAL(32'000'000)/6); // clock not verified on pcb
+ m_audiocpu->set_addrmap(AS_PROGRAM, &aquarium_state::snd_map);
+ m_audiocpu->set_addrmap(AS_IO, &aquarium_state::snd_portmap);
// Is this the actual IC type? Some other Excellent games from this period use a MAX693.
- MCFG_DEVICE_ADD("watchdog", MB3773, 0)
+ MB3773(config, m_watchdog, 0);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(64*8, 64*8)
- MCFG_SCREEN_VISIBLE_AREA(2*8, 42*8-1, 2*8, 34*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(aquarium_state, screen_update_aquarium)
- MCFG_SCREEN_PALETTE(m_palette)
-
- MCFG_DEVICE_ADD(m_gfxdecode, GFXDECODE, m_palette, gfx_aquarium)
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_refresh_hz(60);
+ m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ m_screen->set_size(64*8, 64*8);
+ m_screen->set_visarea(2*8, 42*8-1, 2*8, 34*8-1);
+ m_screen->set_screen_update(FUNC(aquarium_state::screen_update_aquarium));
+ m_screen->set_palette(m_palette);
+
+ GFXDECODE(config, m_gfxdecode, m_palette, gfx_aquarium);
PALETTE(config, m_palette).set_format(palette_device::RRRRGGGGBBBBRGBx, 0x1000/2);
- MCFG_DEVICE_ADD("spritegen", EXCELLENT_SPRITE, 0)
+ EXCELLENT_SPRITE(config, m_sprgen, 0);
/* sound hardware */
SPEAKER(config, "lspeaker").front_left();
@@ -328,10 +328,10 @@ MACHINE_CONFIG_START(aquarium_state::aquarium)
ymsnd.add_route(0, "lspeaker", 0.45);
ymsnd.add_route(1, "rspeaker", 0.45);
- MCFG_DEVICE_ADD("oki", OKIM6295, XTAL(1'056'000), okim6295_device::PIN7_HIGH) // pin 7 not verified
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 0.47)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 0.47)
-MACHINE_CONFIG_END
+ OKIM6295(config, m_oki, XTAL(1'056'000), okim6295_device::PIN7_HIGH); // pin 7 not verified
+ m_oki->add_route(ALL_OUTPUTS, "lspeaker", 0.47);
+ m_oki->add_route(ALL_OUTPUTS, "rspeaker", 0.47);
+}
ROM_START( aquarium )
ROM_REGION( 0x080000, "maincpu", 0 ) /* 68000 code */
diff --git a/src/mame/drivers/aquarius.cpp b/src/mame/drivers/aquarius.cpp
index e7eb7728d4f..de6c264c083 100644
--- a/src/mame/drivers/aquarius.cpp
+++ b/src/mame/drivers/aquarius.cpp
@@ -180,7 +180,7 @@ READ8_MEMBER(aquarius_state::cartridge_r)
{
uint8_t data = 0;
if (m_cart->exists())
- data = m_cart->read_rom(space, offset);
+ data = m_cart->read_rom(offset);
return data ^ m_scrambler;
}
@@ -349,24 +349,25 @@ GFXDECODE_END
MACHINE DRIVERS
***************************************************************************/
-MACHINE_CONFIG_START(aquarius_state::aquarius)
+void aquarius_state::aquarius(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, XTAL(3'579'545)) // ???
- MCFG_DEVICE_PROGRAM_MAP(aquarius_mem)
- MCFG_DEVICE_IO_MAP(aquarius_io)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", aquarius_state, irq0_line_hold)
+ Z80(config, m_maincpu, XTAL(3'579'545)); // ???
+ m_maincpu->set_addrmap(AS_PROGRAM, &aquarius_state::aquarius_mem);
+ m_maincpu->set_addrmap(AS_IO, &aquarius_state::aquarius_io);
+ m_maincpu->set_vblank_int("screen", FUNC(aquarius_state::irq0_line_hold));
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2800))
- MCFG_SCREEN_SIZE(40 * 8, 25 * 8)
- MCFG_SCREEN_VISIBLE_AREA(0, 40 * 8 - 1, 0 * 8, 25 * 8 - 1)
- MCFG_SCREEN_UPDATE_DRIVER(aquarius_state, screen_update_aquarius)
- MCFG_SCREEN_PALETTE(m_palette)
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_refresh_hz(60);
+ m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(2800));
+ m_screen->set_size(40 * 8, 25 * 8);
+ m_screen->set_visarea(0, 40 * 8 - 1, 0 * 8, 25 * 8 - 1);
+ m_screen->set_screen_update(FUNC(aquarius_state::screen_update_aquarius));
+ m_screen->set_palette(m_palette);
GFXDECODE(config, m_gfxdecode, m_palette, gfx_aquarius);
- MCFG_TEA1002_ADD("encoder", XTAL(8'867'238))
+ TEA1002(config, m_tea1002, XTAL(8'867'238));
PALETTE(config, m_palette, FUNC(aquarius_state::aquarius_palette), 512, 16);
/* sound hardware */
@@ -379,18 +380,18 @@ MACHINE_CONFIG_START(aquarius_state::aquarius)
ay8910.add_route(ALL_OUTPUTS, "mono", 0.25);
/* cassette */
- MCFG_CASSETTE_ADD( "cassette" )
- MCFG_CASSETTE_DEFAULT_STATE(CASSETTE_STOPPED | CASSETTE_MOTOR_ENABLED | CASSETTE_SPEAKER_MUTED)
+ CASSETTE(config, m_cassette);
+ m_cassette->set_default_state(CASSETTE_STOPPED | CASSETTE_MOTOR_ENABLED | CASSETTE_SPEAKER_MUTED);
/* cartridge */
- MCFG_GENERIC_CARTSLOT_ADD("cartslot", generic_linear_slot, "aquarius_cart")
+ GENERIC_CARTSLOT(config, m_cart, generic_linear_slot, "aquarius_cart");
/* internal ram */
RAM(config, RAM_TAG).set_default_size("4K").set_extra_options("8K,20K,36K");
/* software lists */
- MCFG_SOFTWARE_LIST_ADD("cart_list","aquarius")
-MACHINE_CONFIG_END
+ SOFTWARE_LIST(config, "cart_list").set_original("aquarius");
+}
/***************************************************************************
diff --git a/src/mame/drivers/arachnid.cpp b/src/mame/drivers/arachnid.cpp
index c9a97e4cb5f..fc63ada443a 100644
--- a/src/mame/drivers/arachnid.cpp
+++ b/src/mame/drivers/arachnid.cpp
@@ -130,8 +130,8 @@ void arachnid_state::arachnid_map(address_map &map)
map(0x2000, 0x2007).rw(PTM6840_TAG, FUNC(ptm6840_device::read), FUNC(ptm6840_device::write));
map(0x4004, 0x4007).rw(m_pia_u4, FUNC(pia6821_device::read), FUNC(pia6821_device::write));
map(0x4008, 0x400b).rw(m_pia_u17, FUNC(pia6821_device::read), FUNC(pia6821_device::write));
- map(0x6000, 0x6000).w(TMS9118_TAG, FUNC(tms9928a_device::vram_w));
- map(0x6002, 0x6002).w(TMS9118_TAG, FUNC(tms9928a_device::register_w));
+ map(0x6000, 0x6000).w(TMS9118_TAG, FUNC(tms9928a_device::vram_write));
+ map(0x6002, 0x6002).w(TMS9118_TAG, FUNC(tms9928a_device::register_write));
map(0x8000, 0xffff).rom().region(M6809_TAG, 0);
}
@@ -420,13 +420,14 @@ void arachnid_state::machine_start()
***************************************************************************/
/*-------------------------------------------------
- MACHINE_CONFIG_START( arachnid )
+ machine_config( arachnid )
-------------------------------------------------*/
-MACHINE_CONFIG_START(arachnid_state::arachnid)
+void arachnid_state::arachnid(machine_config &config)
+{
// basic machine hardware
- MCFG_DEVICE_ADD(M6809_TAG, MC6809, 10.738635_MHz_XTAL / 3)
- MCFG_DEVICE_PROGRAM_MAP(arachnid_map)
+ MC6809(config, m_maincpu, 10.738635_MHz_XTAL / 3);
+ m_maincpu->set_addrmap(AS_PROGRAM, &arachnid_state::arachnid_map);
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0); // MK48Z02 (or DS1220Y)
@@ -456,13 +457,12 @@ MACHINE_CONFIG_START(arachnid_state::arachnid)
// sound hardware
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("speaker", SPEAKER_SOUND)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
+ SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 1.0);
ptm6840_device &ptm(PTM6840(config, PTM6840_TAG, 10.738635_MHz_XTAL / 3 / 4));
ptm.set_external_clocks(0, 0, 0);
ptm.o1_callback().set(FUNC(arachnid_state::ptm_o1_callback));
-MACHINE_CONFIG_END
+}
/***************************************************************************
ROMS
diff --git a/src/mame/drivers/arcadecl.cpp b/src/mame/drivers/arcadecl.cpp
index 944b0305ad4..28153da28e3 100644
--- a/src/mame/drivers/arcadecl.cpp
+++ b/src/mame/drivers/arcadecl.cpp
@@ -320,37 +320,36 @@ GFXDECODE_END
*
*************************************/
-MACHINE_CONFIG_START(sparkz_state::sparkz)
-
+void sparkz_state::sparkz(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M68000, MASTER_CLOCK)
- MCFG_DEVICE_PROGRAM_MAP(main_map)
+ M68000(config, m_maincpu, MASTER_CLOCK);
+ m_maincpu->set_addrmap(AS_PROGRAM, &sparkz_state::main_map);
EEPROM_2804(config, "eeprom").lock_after_write(true);
WATCHDOG_TIMER(config, "watchdog");
/* video hardware */
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_arcadecl)
+ GFXDECODE(config, m_gfxdecode, "palette", gfx_arcadecl);
palette_device &palette(PALETTE(config, "palette"));
palette.set_format(palette_device::IRGB_1555, 512);
palette.set_membits(8);
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_VIDEO_ATTRIBUTES(VIDEO_UPDATE_BEFORE_VBLANK)
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_video_attributes(VIDEO_UPDATE_BEFORE_VBLANK);
/* note: these parameters are from published specs, not derived */
/* the board uses an SOS-2 chip to generate video signals */
- MCFG_SCREEN_RAW_PARAMS(MASTER_CLOCK/2, 456, 0+12, 336+12, 262, 0, 240)
- MCFG_SCREEN_UPDATE_DRIVER(sparkz_state, screen_update)
- MCFG_SCREEN_PALETTE("palette")
- MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE(*this, sparkz_state, video_int_write_line))
+ m_screen->set_raw(MASTER_CLOCK/2, 456, 0+12, 336+12, 262, 0, 240);
+ m_screen->set_screen_update(FUNC(sparkz_state::screen_update));
+ m_screen->set_palette("palette");
+ m_screen->screen_vblank().set(FUNC(sparkz_state::video_int_write_line));
/* sound hardware */
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("oki", OKIM6295, MASTER_CLOCK/4/3, okim6295_device::PIN7_LOW)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
-MACHINE_CONFIG_END
+ OKIM6295(config, m_oki, MASTER_CLOCK/4/3, okim6295_device::PIN7_LOW).add_route(ALL_OUTPUTS, "mono", 1.0);
+}
void arcadecl_state::arcadecl(machine_config &config)
{
diff --git a/src/mame/drivers/argo.cpp b/src/mame/drivers/argo.cpp
index 8cfe5601103..7b4eaa8eee0 100644
--- a/src/mame/drivers/argo.cpp
+++ b/src/mame/drivers/argo.cpp
@@ -350,20 +350,21 @@ uint32_t argo_state::screen_update(screen_device &screen, bitmap_rgb32 &bitmap,
return 0;
}
-MACHINE_CONFIG_START(argo_state::argo)
+void argo_state::argo(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, 3500000)
- MCFG_DEVICE_PROGRAM_MAP(mem_map)
- MCFG_DEVICE_IO_MAP(io_map)
+ Z80(config, m_maincpu, 3500000);
+ m_maincpu->set_addrmap(AS_PROGRAM, &argo_state::mem_map);
+ m_maincpu->set_addrmap(AS_IO, &argo_state::io_map);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(50)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */
- MCFG_SCREEN_UPDATE_DRIVER(argo_state, screen_update)
- MCFG_SCREEN_SIZE(640, 250)
- MCFG_SCREEN_VISIBLE_AREA(0, 639, 0, 249)
-MACHINE_CONFIG_END
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(50);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */
+ screen.set_screen_update(FUNC(argo_state::screen_update));
+ screen.set_size(640, 250);
+ screen.set_visarea_full();
+}
/* ROM definition */
ROM_START( argo )
diff --git a/src/mame/drivers/argox.cpp b/src/mame/drivers/argox.cpp
index d24fde057ca..964895d77a8 100644
--- a/src/mame/drivers/argox.cpp
+++ b/src/mame/drivers/argox.cpp
@@ -71,13 +71,14 @@ void os214_state::os214_io_map(address_map &map)
// ADDRESS_MAP_GLOBAL_MASK(0xff)
}
-MACHINE_CONFIG_START(os214_state::os214)
+void os214_state::os214(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", H83002, XTAL(16'000'000)) /* X1 xtal value is correct,
+ H83002(config, m_maincpu, XTAL(16'000'000)); /* X1 xtal value is correct,
but there can be some clock divider perhaps ? */
- MCFG_DEVICE_PROGRAM_MAP(os214_prg_map)
- MCFG_DEVICE_IO_MAP(os214_io_map)
-MACHINE_CONFIG_END
+ m_maincpu->set_addrmap(AS_PROGRAM, &os214_state::os214_prg_map);
+ m_maincpu->set_addrmap(AS_IO, &os214_state::os214_io_map);
+}
void os214_state::init_os214()
{
diff --git a/src/mame/drivers/argus.cpp b/src/mame/drivers/argus.cpp
index 682dd01889d..66137ac1f8c 100644
--- a/src/mame/drivers/argus.cpp
+++ b/src/mame/drivers/argus.cpp
@@ -528,7 +528,7 @@ void argus_state::argus(machine_config &config)
void argus_state::valtric(machine_config &config)
{
/* basic machine hardware */
- Z80(config, m_maincpu, 5000000); /* 5 MHz */
+ Z80(config, m_maincpu, 5000000); /* 5 MHz */
m_maincpu->set_addrmap(AS_PROGRAM, &argus_state::valtric_map);
TIMER(config, "scantimer").configure_scanline(FUNC(argus_state::scanline), "screen", 0, 1);
@@ -576,7 +576,7 @@ void argus_state::valtric(machine_config &config)
void argus_state::butasan(machine_config &config)
{
/* basic machine hardware */
- Z80(config, m_maincpu, 5000000); /* 5 MHz */
+ Z80(config, m_maincpu, 5000000); /* 5 MHz */
m_maincpu->set_addrmap(AS_PROGRAM, &argus_state::butasan_map);
TIMER(config, "scantimer").configure_scanline(FUNC(argus_state::butasan_scanline), "screen", 0, 1);
diff --git a/src/mame/drivers/aristmk4.cpp b/src/mame/drivers/aristmk4.cpp
index 3c2b35a11e9..e1bf7fe0639 100644
--- a/src/mame/drivers/aristmk4.cpp
+++ b/src/mame/drivers/aristmk4.cpp
@@ -97,7 +97,7 @@
The VIA uses Port A to write to the D0-D7 on the AY8910s. Port B hooks first 4 bits up to BC1/BC2/BDIR and A9 on AY1 and A8 on AY2
The remaining 4 bits are connected to other hardware, read via the VIA.
- The AY8910 named ay1 has writes on PORT B to the ZN434 DA convertor.
+ The AY8910 named ay1 has writes on PORT B to the ZN434 DA converter.
The AY8910 named ay2 has writes to lamps and the light tower on Port A and B. these are implemented via the layout
@@ -680,7 +680,7 @@ READ8_MEMBER(aristmk4_state::mkiv_pia_ina)
{
/* uncomment this code once RTC is fixed */
- //return m_rtc->read(space,1);
+ //return m_rtc->read(1);
return 0; // OK for now, the aussie version has no RTC on the MB so this is valid.
}
@@ -689,12 +689,12 @@ WRITE8_MEMBER(aristmk4_state::mkiv_pia_outa)
{
if(m_rtc_data_strobe)
{
- m_rtc->write(space,1,data);
+ m_rtc->write(1,data);
//logerror("rtc protocol write data: %02X\n",data);
}
else
{
- m_rtc->write(space,0,data);
+ m_rtc->write(0,data);
//logerror("rtc protocol write address: %02X\n",data);
}
}
@@ -798,13 +798,13 @@ READ8_MEMBER(aristmk4_state::via_a_r)
if (m_ay8910_1&0x03) // SW1 read.
{
- psg_ret = m_ay1->data_r(space, 0);
+ psg_ret = m_ay1->data_r();
//logerror("PSG porta ay1 returned %02X\n",psg_ret);
}
else if (m_ay8910_2&0x03) //i don't think we read anything from Port A on ay2, Can be removed once game works ok.
{
- psg_ret = m_ay2->data_r(space, 0);
+ psg_ret = m_ay2->data_r();
//logerror("PSG porta ay2 returned %02X\n",psg_ret);
}
return psg_ret;
@@ -898,13 +898,13 @@ WRITE8_MEMBER(aristmk4_state::via_b_w)
break;
case 0x06: //WRITE
{
- m_ay1->data_w(space, 0 , m_psg_data);
+ m_ay1->data_w(m_psg_data);
//logerror("VIA Port A write data ay1: %02X\n",m_psg_data);
break;
}
case 0x07: //LATCH Address (set register)
{
- m_ay1->address_w(space, 0 , m_psg_data);
+ m_ay1->address_w(m_psg_data);
//logerror("VIA Port B write register ay1: %02X\n",m_psg_data);
break;
}
@@ -925,13 +925,13 @@ WRITE8_MEMBER(aristmk4_state::via_b_w)
break;
case 0x06: //WRITE
{
- m_ay2->data_w(space, 0, m_psg_data);
+ m_ay2->data_w(m_psg_data);
//logerror("VIA Port A write data ay2: %02X\n",m_psg_data);
break;
}
case 0x07: //LATCH Address (set register)
{
- m_ay2->address_w(space, 0, m_psg_data);
+ m_ay2->address_w(m_psg_data);
//logerror("VIA Port B write register ay2: %02X\n",m_psg_data);
break;
}
@@ -1511,10 +1511,10 @@ static INPUT_PORTS_START(cgold2)
PORT_MODIFY("500e")
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON6 ) PORT_NAME("Play 1 Line") PORT_CODE(KEYCODE_W)
- PORT_MODIFY("via_port_b")
- PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_GAMBLE_D_UP ) PORT_NAME("Test1") PORT_CODE(KEYCODE_2) // coin optic 1?
- PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_GAMBLE_TAKE ) PORT_NAME("Test2") PORT_CODE(KEYCODE_3) // coin optic 2?
- PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_GAMBLE_HIGH ) PORT_NAME("Test3") PORT_CODE(KEYCODE_4) // coin to cashbox?
+ PORT_MODIFY("5201")
+ PORT_DIPNAME( 0x10, 0x10, "5201-5") // Must be "on" otherwise the game will not respond
+ PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) PORT_DIPLOCATION("5201:5")
+ PORT_DIPSETTING( 0x10, DEF_STR( On ) )
INPUT_PORTS_END
static INPUT_PORTS_START(fhunter)
@@ -1770,10 +1770,10 @@ void aristmk4_state::power_fail()
To enter the robot test
1. Open the main door
- 2. Trigger powerfail / NMI by presing L for at least 1 second, the game will freeze.
+ 2. Trigger powerfail / NMI by pressing ',' for at least 1 second, the game will freeze.
3. Press F3 ( reset ) whilst holding down robot/hopper test button ( Z )
- Note: The use of 1 Hz in the timer is to avoid unintentional triggering the NMI ( ie.. hold down L for at least 1 second )
+ Note: The use of 1 Hz in the timer is to avoid unintentional triggering the NMI ( ie.. hold down ',' for at least 1 second )
*/
if(ioport("powerfail")->read()) // send NMI signal if L pressed
diff --git a/src/mame/drivers/aristmk5.cpp b/src/mame/drivers/aristmk5.cpp
index 473a331bb54..ced57a2e22c 100644
--- a/src/mame/drivers/aristmk5.cpp
+++ b/src/mame/drivers/aristmk5.cpp
@@ -675,6 +675,8 @@ public:
, m_lamps(*this, "lamp%u", 0U)
{ }
+ static constexpr feature_type imperfect_features() { return feature::GRAPHICS | feature::SOUND | feature::TIMING; }
+
void aristmk5(machine_config &config);
void aristmk5_touch(machine_config &config);
void aristmk5_usa(machine_config &config);
@@ -1379,15 +1381,7 @@ static INPUT_PORTS_START( aristmk5_usa )
PORT_BIT(0x00000002, IP_ACTIVE_HIGH, IPT_COIN1) PORT_CHANGED_MEMBER(DEVICE_SELF, aristmk5_state, coin_start, nullptr)
INPUT_PORTS_END
-static INPUT_PORTS_START( aristmk5 ) // TODO: Remove ROM swap code as it is not needed for non-US hardware
- /* This simulates the ROM swap */
- PORT_START("ROM_LOAD")
- PORT_CONFNAME( 0x07, 0x04, "System Mode" )
- PORT_CONFSETTING( 0x00, "USA Set Chip v4.04.09 Mode" )
- PORT_CONFSETTING( 0x01, "USA Set Chip v4.04.08 Mode" )
- PORT_CONFSETTING( 0x02, "USA Set Chip v4.04.00 Mode" )
- PORT_CONFSETTING( 0x03, "USA Set Chip v4.02.04 Mode" )
- PORT_CONFSETTING( 0x04, "Game Mode" )
+static INPUT_PORTS_START( aristmk5 )
PORT_START("P1")
PORT_BIT(0x00000100, IP_ACTIVE_HIGH, IPT_BUTTON1) PORT_CODE(KEYCODE_Q) PORT_NAME("Collect")
@@ -1990,10 +1984,10 @@ static INPUT_PORTS_START(baddog)
PORT_BIT(0x00001000, IP_ACTIVE_HIGH, IPT_BUTTON5) PORT_CODE(KEYCODE_T) PORT_NAME("Bet 10/50/200 / Hold 4 / Club")
PORT_BIT(0x00002000, IP_ACTIVE_HIGH, IPT_BUTTON6) PORT_CODE(KEYCODE_Y) PORT_NAME("High 10/50/200 / Hold 5 / Spade")
PORT_BIT(0x00000040, IP_ACTIVE_HIGH, IPT_BUTTON8) PORT_CODE(KEYCODE_S) PORT_NAME("Red")
- PORT_BIT(0x00000020, IP_ACTIVE_HIGH, IPT_BUTTON9) PORT_CODE(KEYCODE_D) PORT_NAME("Gamble")
+ PORT_BIT(0x00000020, IP_ACTIVE_HIGH, IPT_BUTTON9) PORT_CODE(KEYCODE_D) PORT_NAME("Gamble / Half Gamble")
PORT_BIT(0x00000010, IP_ACTIVE_HIGH, IPT_BUTTON10) PORT_CODE(KEYCODE_F) PORT_NAME("Take Win")
- PORT_BIT(0x00000004, IP_ACTIVE_HIGH, IPT_BUTTON12) PORT_CODE(KEYCODE_H) PORT_NAME("Draw / Black")
- PORT_BIT(0x00000008, IP_ACTIVE_HIGH, IPT_UNUSED)
+ PORT_BIT(0x00000008, IP_ACTIVE_HIGH, IPT_BUTTON11) PORT_CODE(KEYCODE_G) PORT_NAME("Black")
+ PORT_BIT(0x00000004, IP_ACTIVE_HIGH, IPT_BUTTON12) PORT_CODE(KEYCODE_H) PORT_NAME("Draw")
PORT_BIT(0x00000002, IP_ACTIVE_HIGH, IPT_UNUSED)
PORT_BIT(0x00000001, IP_ACTIVE_HIGH, IPT_UNUSED)
INPUT_PORTS_END
@@ -2007,8 +2001,7 @@ static INPUT_PORTS_START(multidrw)
PORT_BIT(0x00000800, IP_ACTIVE_HIGH, IPT_BUTTON4) PORT_CODE(KEYCODE_R) PORT_NAME("1 Draw / Hold 3")
PORT_BIT(0x00001000, IP_ACTIVE_HIGH, IPT_BUTTON5) PORT_CODE(KEYCODE_T) PORT_NAME("2 Draws / Hold 4 / Club")
PORT_BIT(0x00002000, IP_ACTIVE_HIGH, IPT_BUTTON6) PORT_CODE(KEYCODE_Y) PORT_NAME("3 Draws / Hold 5 / Spade")
- PORT_BIT(0x00000008, IP_ACTIVE_HIGH, IPT_BUTTON11) PORT_CODE(KEYCODE_G) PORT_NAME("Black")
- PORT_BIT(0x00000004, IP_ACTIVE_HIGH, IPT_BUTTON12) PORT_CODE(KEYCODE_H) PORT_NAME("Bet")
+ PORT_BIT(0x00000004, IP_ACTIVE_HIGH, IPT_BUTTON12) PORT_CODE(KEYCODE_H) PORT_NAME("Bet / Next Card")
PORT_BIT(0x00000001, IP_ACTIVE_HIGH, IPT_BUTTON13) PORT_CODE(KEYCODE_J) PORT_NAME("Draw")
INPUT_PORTS_END
@@ -2240,21 +2233,23 @@ void aristmk5_state::machine_reset()
m_ioc_regs[IRQ_STATUS_B] |= 0x40; //hack, set keyboard irq empty to be ON
- /* load the roms according to what the operator wants */
{
+ /* for US sets, load the roms according to what the operator wants */
uint8_t *ROM = memregion("maincpu")->base();
- uint8_t *PRG;// = memregion("prg_code")->base();
- int i;
- uint8_t op_mode;
- static const char *const rom_region[] = { "set_4.04.09", "set_4.04.08", "set_4.04.00", "set_4.02.04", "game_prg" };
+ uint8_t *PRG;
- op_mode = ioport("ROM_LOAD")->read();
+ if (ioport("ROM_LOAD") != nullptr)
+ {
+ static const char *const rom_region[] = { "set_4.04.09", "set_4.04.08", "set_4.04.00", "set_4.02.04", "game_prg" };
- PRG = memregion(rom_region[op_mode & 7])->base();
+ uint8_t op_mode = ioport("ROM_LOAD")->read();
- if(PRG != nullptr)
+ PRG = memregion(rom_region[op_mode & 7])->base();
+ }
+ else // non-US sets don't have set chips
+ PRG = memregion("game_prg")->base();
- for(i = 0; i < 0x400000; i++)
+ for(int i = 0; i < 0x400000; i++)
ROM[i] = PRG[i];
}
@@ -2329,7 +2324,6 @@ void aristmk5_state::aristmk5(machine_config &config)
DAC_16BIT_R2R_TWOS_COMPLEMENT(config, m_dac[i], 0).add_route(0, "speaker", 0.1); // unknown DAC
}
voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref", 0));
- vref.set_output(5.0);
vref.add_route(0, "dac0", 1.0, DAC_VREF_POS_INPUT); vref.add_route(0, "dac0", -1.0, DAC_VREF_NEG_INPUT);
vref.add_route(0, "dac1", 1.0, DAC_VREF_POS_INPUT); vref.add_route(0, "dac1", -1.0, DAC_VREF_NEG_INPUT);
vref.add_route(0, "dac2", 1.0, DAC_VREF_POS_INPUT); vref.add_route(0, "dac2", -1.0, DAC_VREF_NEG_INPUT);
@@ -2365,7 +2359,7 @@ void aristmk5_state::aristmk5_usa_touch(machine_config &config)
microtouch.stx().set("uart_0a", FUNC(ins8250_uart_device::rx_w));
}
-#define ARISTOCRAT_MK5_BIOS \
+#define ARISTOCRAT_MK5_USA_SETCHIPS \
ROM_REGION( 0x400000, "set_4.04.09", ROMREGION_ERASEFF ) /* setchip v4.04.09 4meg */ \
ROM_LOAD32_WORD( "setchip v4.04.09.u7", 0x000000, 0x80000, CRC(e8e8dc75) SHA1(201fe95256459ce34fdb6f7498135ab5016d07f3) ) \
ROM_LOAD32_WORD( "setchip v4.04.09.u11", 0x000002, 0x80000, CRC(ff7a9035) SHA1(4352c4336e61947c555fdc80c61f944076f64b64) ) \
@@ -2377,37 +2371,23 @@ void aristmk5_state::aristmk5_usa_touch(machine_config &config)
ROM_LOAD32_WORD( "setchip v4.04.00.u11", 0x000002, 0x80000, CRC(82dfa12a) SHA1(86fd0f0ad8d5d1bc503392a40bbcdadb055b2765) ) \
ROM_REGION( 0x400000, "set_4.02.04", ROMREGION_ERASEFF ) /* setchip v4.02.04 */ \
ROM_LOAD32_WORD( "setchip v4.02.04.u7", 0x000000, 0x80000, CRC(5a254b22) SHA1(8444f237b392df2a3cb42ea349e7af32f47dd544) ) \
- ROM_LOAD32_WORD( "setchip v4.02.04.u11", 0x000002, 0x80000, CRC(def36617) SHA1(c7ba5b08e884a8fb36c9fb51c08e243e32c81f89) ) \
- /* GALs */ \
- ROM_REGION( 0x600, "gals", 0 ) \
- ROM_LOAD( "a562837.u36", 0x000000, 0x000157, CRC(1f269234) SHA1(29940dd50fb55c632935f62ff44ca724379c7a43) ) \
- ROM_LOAD( "a562838.u65", 0x000200, 0x000157, CRC(f2f3c40a) SHA1(b795dfa5cc4e8127c3f3a0906664910d1325ec92) ) \
- ROM_LOAD( "a562840.u22", 0x000400, 0x000157, CRC(941d4cdb) SHA1(1ca091fba69e92f262dbb3d40f515703c8981793) ) \
- ROM_REGION16_BE( 0x100, "eeprom0", ROMREGION_ERASEFF ) \
- ROM_REGION16_BE( 0x100, "eeprom1", ROMREGION_ERASEFF ) \
+ ROM_LOAD32_WORD( "setchip v4.02.04.u11", 0x000002, 0x80000, CRC(def36617) SHA1(c7ba5b08e884a8fb36c9fb51c08e243e32c81f89) )
-#define ARISTOCRAT_MK5_BIOS_HAVE_EEPROMS \
- ROM_REGION( 0x400000, "set_4.04.09", ROMREGION_ERASEFF ) /* setchip v4.04.09 4meg */ \
- ROM_LOAD32_WORD( "setchip v4.04.09.u7", 0x000000, 0x80000, CRC(e8e8dc75) SHA1(201fe95256459ce34fdb6f7498135ab5016d07f3) ) \
- ROM_LOAD32_WORD( "setchip v4.04.09.u11", 0x000002, 0x80000, CRC(ff7a9035) SHA1(4352c4336e61947c555fdc80c61f944076f64b64) ) \
- ROM_REGION( 0x400000, "set_4.04.08", ROMREGION_ERASEFF ) /* setchip v4.04.08 4meg */ \
- ROM_LOAD32_WORD( "setchip v4.04.08.u7", 0x000000, 0x80000, CRC(7c4b7fe4) SHA1(39dd39c794c0cb6abc1b7503650643a8131468d1) ) \
- ROM_LOAD32_WORD( "setchip v4.04.08.u11", 0x000002, 0x80000, CRC(d3234a28) SHA1(8ff112ee4aadf1d359ca8ffe0cfa9c7400aa0595) ) \
- ROM_REGION( 0x400000, "set_4.04.00", ROMREGION_ERASEFF ) /* setchip v4.04.00 4meg 42pin */ \
- ROM_LOAD32_WORD( "setchip v4.04.00.u7", 0x000000, 0x80000, CRC(2453137e) SHA1(b59998e75ae3924da16faf47b9cfe9afd60d810c) ) \
- ROM_LOAD32_WORD( "setchip v4.04.00.u11", 0x000002, 0x80000, CRC(82dfa12a) SHA1(86fd0f0ad8d5d1bc503392a40bbcdadb055b2765) ) \
- ROM_REGION( 0x400000, "set_4.02.04", ROMREGION_ERASEFF ) /* setchip v4.02.04 */ \
- ROM_LOAD32_WORD( "setchip v4.02.04.u7", 0x000000, 0x80000, CRC(5a254b22) SHA1(8444f237b392df2a3cb42ea349e7af32f47dd544) ) \
- ROM_LOAD32_WORD( "setchip v4.02.04.u11", 0x000002, 0x80000, CRC(def36617) SHA1(c7ba5b08e884a8fb36c9fb51c08e243e32c81f89) ) \
- /* GALs */ \
+#define ARISTOCRAT_MK5_GALS \
ROM_REGION( 0x600, "gals", 0 ) \
ROM_LOAD( "a562837.u36", 0x000000, 0x000157, CRC(1f269234) SHA1(29940dd50fb55c632935f62ff44ca724379c7a43) ) \
ROM_LOAD( "a562838.u65", 0x000200, 0x000157, CRC(f2f3c40a) SHA1(b795dfa5cc4e8127c3f3a0906664910d1325ec92) ) \
- ROM_LOAD( "a562840.u22", 0x000400, 0x000157, CRC(941d4cdb) SHA1(1ca091fba69e92f262dbb3d40f515703c8981793) ) \
+ ROM_LOAD( "a562840.u22", 0x000400, 0x000157, CRC(941d4cdb) SHA1(1ca091fba69e92f262dbb3d40f515703c8981793) )
+
+#define ARISTOCRAT_MK5_EEPROM \
+ ROM_REGION16_BE( 0x100, "eeprom0", ROMREGION_ERASEFF ) \
+ ROM_REGION16_BE( 0x100, "eeprom1", ROMREGION_ERASEFF )
ROM_START( aristmk5 )
- ARISTOCRAT_MK5_BIOS
+ ARISTOCRAT_MK5_USA_SETCHIPS
+ ARISTOCRAT_MK5_GALS
+ ARISTOCRAT_MK5_EEPROM
ROM_REGION( 0x400000, "game_prg", ROMREGION_ERASEFF )
@@ -2422,7 +2402,8 @@ ROM_END
// 0200751V / 602/9 / 10 Credit Multiplier / 20 Line Multiline
// ADONIS / NSW/ACT / A - 25/05/98
ROM_START( adonis )
- ARISTOCRAT_MK5_BIOS
+ ARISTOCRAT_MK5_GALS
+ ARISTOCRAT_MK5_EEPROM
/*
Checksum code found at 0x000bf8
0x000000-0x05eb1b is the Checksummed Range (excluding 0x000020-0x000027 where Checksum is stored)
@@ -2446,7 +2427,8 @@ ROM_END
// 0100751V / 602/9 / 10 Credit Multiplier / 20 Line Multiline
// ADONIS / NSW/ACT / A - 25/05/98
ROM_START( adonisa )
- ARISTOCRAT_MK5_BIOS
+ ARISTOCRAT_MK5_GALS
+ ARISTOCRAT_MK5_EEPROM
/*
Checksum code found at 0x000bf8
0x000000-0x05cdc3 is the Checksummed Range (excluding 0x000020-0x000027 where Checksum is stored)
@@ -2471,7 +2453,9 @@ ROM_END
// ADONIS / Export / B - 31/07/01
// Requires set chips 4.04.xx
ROM_START( adonisu )
- ARISTOCRAT_MK5_BIOS
+ ARISTOCRAT_MK5_USA_SETCHIPS
+ ARISTOCRAT_MK5_GALS
+ ARISTOCRAT_MK5_EEPROM
/*
Checksum code found at 0x000d18
0x000000-0x0e8a7b is the Checksummed Range (excluding 0x000020-0x000027 where Checksum is stored)
@@ -2496,7 +2480,9 @@ ROM_END
// ADONIS / NSW/ACT / C - 06/07/99
// Cash Express Hyperlink game
ROM_START( adonisce )
- ARISTOCRAT_MK5_BIOS
+ ARISTOCRAT_MK5_USA_SETCHIPS
+ ARISTOCRAT_MK5_GALS
+ ARISTOCRAT_MK5_EEPROM
ROM_REGION( 0x400000, "game_prg", ROMREGION_ERASEFF )
/*
Checksum code found at 0x000c44
@@ -2524,7 +2510,8 @@ ROM_END
// Venezuela is spelled as 'Venezuila' in the ROM
// Game is in Spanish, however audit mode is in English
ROM_START( alchemst )
- ARISTOCRAT_MK5_BIOS
+ ARISTOCRAT_MK5_GALS
+ ARISTOCRAT_MK5_EEPROM
/*
Checksum code found at 0x000bb8
0x000000-0x08e937 is the Checksummed Range (excluding 0x000020-0x000027 where Checksum is stored)
@@ -2550,7 +2537,8 @@ ROM_END
// 0200428V / 386/56 / CARD POKER
// BAD DOG POKER / NSW HOTEL / A 17/12/96
ROM_START( baddog )
- ARISTOCRAT_MK5_BIOS
+ ARISTOCRAT_MK5_GALS
+ ARISTOCRAT_MK5_EEPROM
/*
Checksum code found at 0x000ae4
0x000000-0x056f3f is the Checksummed Range (excluding 0x000020-0x000027 where Checksum is stored)
@@ -2576,7 +2564,8 @@ ROM_END
// 0200818V / 594/1 / 3 Credit Multiplier/3 Line Multiline
// Black Panther / Victoria / A - 30/07/96
ROM_START( blackpnt )
- ARISTOCRAT_MK5_BIOS
+ ARISTOCRAT_MK5_GALS
+ ARISTOCRAT_MK5_EEPROM
/*
Checksum code found at 0x000bb0
0x000000-0x056d8b is the Checksummed Range (excluding 0x000020-0x000027 where Checksum is stored)
@@ -2601,7 +2590,8 @@ ROM_END
// 0100812V / 616/1 / 25 Credit Multiplier/20 Line Multiline
// Boot Scootin' 500cm / NSW/ACT / B - 11/12/98
ROM_START( bootsctn )
- ARISTOCRAT_MK5_BIOS
+ ARISTOCRAT_MK5_GALS
+ ARISTOCRAT_MK5_EEPROM
/*
0x000000-0x06c177 is the Checksummed Range (excluding 0x000020-0x000027 where Checksum is stored)
Expected Checksum 0xb0980753
@@ -2631,7 +2621,9 @@ ROM_END
// Marked as GHG101202 and 92.767%
// No set chips required
ROM_START( bootsctnu )
- ARISTOCRAT_MK5_BIOS
+ ARISTOCRAT_MK5_USA_SETCHIPS
+ ARISTOCRAT_MK5_GALS
+ ARISTOCRAT_MK5_EEPROM
/*
Checksum code found at 0x000d08
0x000000-0x0941ab is the Checksummed Range (excluding 0x000020-0x000027 where Checksum is stored)
@@ -2659,7 +2651,9 @@ ROM_END
// GHG1008-03 / MV4098/1 / 10 Credit Multiplier/20 Line Multiline
// BOOT SCOOTIN' / Export / A - 27/07/99
ROM_START( bootsctnua )
- ARISTOCRAT_MK5_BIOS
+ ARISTOCRAT_MK5_USA_SETCHIPS
+ ARISTOCRAT_MK5_GALS
+ ARISTOCRAT_MK5_EEPROM
/*
Checksum code found at 0x000d08
0x000000-0x0944bf is the Checksummed Range (excluding 0x000020-0x000027 where Checksum is stored)
@@ -2687,7 +2681,9 @@ ROM_END
// BOOT SCOOTIN' / Export / B - 22/03/01
// Requires set chip version: 4.04.xx
ROM_START( bootsctnub )
- ARISTOCRAT_MK5_BIOS
+ ARISTOCRAT_MK5_USA_SETCHIPS
+ ARISTOCRAT_MK5_GALS
+ ARISTOCRAT_MK5_EEPROM
/*
Checksum code found at 0x000d18
0x000000-0x0f47a7 is the Checksummed Range (excluding 0x000020-0x000027 where Checksum is stored)
@@ -2717,7 +2713,9 @@ ROM_END
// Touchscreen game
// Game requires set chip version: 4.01.xx
ROM_START( bparty )
- ARISTOCRAT_MK5_BIOS
+ ARISTOCRAT_MK5_USA_SETCHIPS
+ ARISTOCRAT_MK5_GALS
+ ARISTOCRAT_MK5_EEPROM
/*
Checksum code found at 0x000d18
0x000000-0x0a693f is the Checksummed Range (excluding 0x000020-0x000027 where Checksum is stored)
@@ -2745,7 +2743,9 @@ ROM_END
// Bachelorette Party / Export / B - 25/08/2000
// Touchscreen game
ROM_START( bpartya )
- ARISTOCRAT_MK5_BIOS
+ ARISTOCRAT_MK5_USA_SETCHIPS
+ ARISTOCRAT_MK5_GALS
+ ARISTOCRAT_MK5_EEPROM
// checksum code not found due to ROMs being corrupted, all files are missing bytes consisting of 0x0D
ROM_REGION( 0x400000, "game_prg", ROMREGION_ERASEFF )
ROM_LOAD32_WORD( "bhg1579.u7", 0x000000, 0x7f01b, BAD_DUMP CRC(da30ade2) SHA1(0a19181ae3968134a5731aa9eadde8c7a12798c1) )
@@ -2766,7 +2766,8 @@ ROM_END
// 0200510V / 593 / 10 Credit Multiplier / 9 Line Multiline
// Bumble Bugs / Local / D - 5/07/96
ROM_START( bumblbug )
- ARISTOCRAT_MK5_BIOS
+ ARISTOCRAT_MK5_GALS
+ ARISTOCRAT_MK5_EEPROM
/*
Checksum code found at 0x000b68
0x000000-0x05b94b is the Checksummed Range (excluding 0x000020-0x000027 where Checksum is stored)
@@ -2787,7 +2788,8 @@ ROM_END
// 0200546V / 593 / 10 Credit Multiplier / 9 Line Multiline
// Bumble Bugs / QLD CLUB & HOTEL / D - 05/07/96
ROM_START( bumblbugql )
- ARISTOCRAT_MK5_BIOS
+ ARISTOCRAT_MK5_GALS
+ ARISTOCRAT_MK5_EEPROM
/*
Checksum code found at 0x000ac8
0x000000-0x05554b is the Checksummed Range (excluding 0x000020-0x000027 where Checksum is stored)
@@ -2814,7 +2816,9 @@ ROM_END
// Marked as CHG047903 and 92.691%
// No set chips required
ROM_START( bumblbugu )
- ARISTOCRAT_MK5_BIOS
+ ARISTOCRAT_MK5_USA_SETCHIPS
+ ARISTOCRAT_MK5_GALS
+ ARISTOCRAT_MK5_EEPROM
/*
Checksum code found at 0x000d08
0x000000-0x0b1f47 is the Checksummed Range (excluding 0x000020-0x000027 where Checksum is stored)
@@ -2842,7 +2846,9 @@ ROM_END
// Variation (% and NO): 87.006% 99
// No set chips required
ROM_START( bumblbugua )
- ARISTOCRAT_MK5_BIOS
+ ARISTOCRAT_MK5_USA_SETCHIPS
+ ARISTOCRAT_MK5_GALS
+ ARISTOCRAT_MK5_EEPROM
/*
Checksum code found at 0x000d08
0x000000-0x0b1f47 is the Checksummed Range (excluding 0x000020-0x000027 where Checksum is stored)
@@ -2866,7 +2872,8 @@ ROM_END
// 0200143V / 571/4 / 10 Credit Multiplier/9 Line Multiline
// Butterfly Delight / Local / A - 19/12/95
ROM_START( buttdeli )
- ARISTOCRAT_MK5_BIOS
+ ARISTOCRAT_MK5_GALS
+ ARISTOCRAT_MK5_EEPROM
/*
Checksum code found at 0x000adc
0x000000-0x04477f is the Checksummed Range (excluding 0x000020-0x000027 where Checksum is stored)
@@ -2890,7 +2897,9 @@ ROM_END
// AHG1463 / 603(a) / 3,5,10,25,50 Credit Multiplier / 20 Line Multiline
// Canyon Rose 100cm / Export / B - 06/12/96
ROM_START( canrose )
- ARISTOCRAT_MK5_BIOS
+ ARISTOCRAT_MK5_USA_SETCHIPS
+ ARISTOCRAT_MK5_GALS
+ ARISTOCRAT_MK5_EEPROM
// checksum code not found due to ROMs being corrupted, all files are missing bytes consisting of 0x0D
ROM_REGION( 0x400000, "game_prg", ROMREGION_ERASEFF )
ROM_LOAD32_WORD( "ahg1463.u7", 0x000000, 0x7f06d, CRC(d866097c) SHA1(2bd2c6200986b27a35329aa0c43e5afd22becbfc) )
@@ -2907,7 +2916,8 @@ ROM_END
// 0100676V / 614/3 / 10 Credit Multiplier/20 Line Multiline
// Cash Cat 200cm / NSW/ACT / A - 3/04/98
ROM_START( cashcat )
- ARISTOCRAT_MK5_BIOS
+ ARISTOCRAT_MK5_GALS
+ ARISTOCRAT_MK5_EEPROM
ROM_REGION( 0x400000, "game_prg", ROMREGION_ERASEFF )
/*
Checksum code found at 0x000b68
@@ -2931,7 +2941,8 @@ ROM_END
// 0100557V / 614/1 / 10 Credit Multiplier/9 Line Multiline
// Cash Cat 90cm / NSW/ACT / B - 1/12/97
ROM_START( cashcata )
- ARISTOCRAT_MK5_BIOS
+ ARISTOCRAT_MK5_GALS
+ ARISTOCRAT_MK5_EEPROM
ROM_REGION( 0x400000, "game_prg", ROMREGION_ERASEFF )
/*
Checksum code found at 0x000b68
@@ -2955,7 +2966,8 @@ ROM_END
// 0300863V / MV4089 / 5 Credit Multiplier/9 Line Multiline
// Cash Cat / New Zealand / A- 4/1/99
ROM_START( cashcatnz )
- ARISTOCRAT_MK5_BIOS
+ ARISTOCRAT_MK5_GALS
+ ARISTOCRAT_MK5_EEPROM
ROM_REGION( 0x400000, "game_prg", ROMREGION_ERASEFF )
// checksum code not found (uses different startup sequence)
ROM_LOAD32_WORD( "0300863v.u7", 0x000000, 0x80000, CRC(de0f0202) SHA1(994f6c47b1e2e0e133853dc69b189752104486e4) )
@@ -2972,7 +2984,8 @@ ROM_END
// 0100438V / 603/1 / 25 Credit Multiplier / 20 Line Multiline
// Cash Chameleon / NSW/ACT / C - 15/4/97
ROM_START( cashcham )
- ARISTOCRAT_MK5_BIOS
+ ARISTOCRAT_MK5_GALS
+ ARISTOCRAT_MK5_EEPROM
/*
Checksum code found at 0x000ae0
0x000000-0x055f83 is the Checksummed Range (excluding 0x000020-0x000027 where Checksum is stored)
@@ -2996,7 +3009,8 @@ ROM_END
// 0200437V / 603(a) / 5 Credit Multiplier / 20 Line Multiline
// Cash Chameleon 100cm / NSW/ACT / D - 18/02/98
ROM_START( cashchama )
- ARISTOCRAT_MK5_BIOS
+ ARISTOCRAT_MK5_GALS
+ ARISTOCRAT_MK5_EEPROM
/*
Checksum code found at 0x000b00
0x000000-0x05ca1b is the Checksummed Range (excluding 0x000020-0x000027 where Checksum is stored)
@@ -3020,7 +3034,8 @@ ROM_END
// 0300781V / MV4067 / 5 Credit Multiplier/20 Line Multiline
// Cash Chameleon / New Zealand / A - 31/08/98
ROM_START( cashchamnz )
- ARISTOCRAT_MK5_BIOS
+ ARISTOCRAT_MK5_GALS
+ ARISTOCRAT_MK5_EEPROM
// checksum code not found (uses different startup sequence)
ROM_REGION( 0x400000, "game_prg", ROMREGION_ERASEFF )
ROM_LOAD32_WORD( "0300781v.u7", 0x000000, 0x80000, CRC(009e109e) SHA1(b912b474a226af17bef554f4db6fade7cd2e558f) )
@@ -3039,7 +3054,9 @@ ROM_END
// Marked as DHG4078.
// Game requires set chip version: 4.00.xx
ROM_START( cashchamu )
- ARISTOCRAT_MK5_BIOS
+ ARISTOCRAT_MK5_USA_SETCHIPS
+ ARISTOCRAT_MK5_GALS
+ ARISTOCRAT_MK5_EEPROM
/*
Checksum code found at 0x000d08
0x000000-0x09b413 is the Checksummed Range (excluding 0x000020-0x000027 where Checksum is stored)
@@ -3063,7 +3080,8 @@ ROM_END
// 0300467V / 607 / 10 Credit Multiplier/20 Line Multiline
// Cash Crop / Local / C - 14/07/97
ROM_START( cashcra5 )
- ARISTOCRAT_MK5_BIOS
+ ARISTOCRAT_MK5_GALS
+ ARISTOCRAT_MK5_EEPROM
/*
Checksum code found at 0x000b80
0x000000-0x06076b is the Checksummed Range (excluding 0x000020-0x000027 where Checksum is stored)
@@ -3087,7 +3105,8 @@ ROM_END
// 0300447V / 607/2 / 10 Credit Multiplier/9 Line Multiline
// Cash Crop / Local / C - 29/08/97
ROM_START( cashcra5a )
- ARISTOCRAT_MK5_BIOS
+ ARISTOCRAT_MK5_GALS
+ ARISTOCRAT_MK5_EEPROM
// checksum code not found due to ROMs being corrupted, all files are missing bytes consisting of 0x0D
ROM_REGION( 0x400000, "game_prg", ROMREGION_ERASEFF )
ROM_LOAD32_WORD( "0300447v.u7", 0x000000, 0x7f992, BAD_DUMP CRC(421ac2af) SHA1(552e98a0d3f969d702dd0aafcb4cb8f697a56b47) )
@@ -3104,7 +3123,8 @@ ROM_END
// 0100787V / 630/1 / 10 Credit Multiplier / 20 Line Multiline
// The Chariot Challenge / NSW/ACT / A - 10/08/98
ROM_START( chariotc )
- ARISTOCRAT_MK5_BIOS
+ ARISTOCRAT_MK5_GALS
+ ARISTOCRAT_MK5_EEPROM
/*
Checksum code found at 0x000ba8
0x000000-0x0603fb is the Checksummed Range (excluding 0x000020-0x000027 where Checksum is stored)
@@ -3130,7 +3150,8 @@ ROM_END
// ROM contains unaltered NSW/ACT region string and date, but game is for the Venezuelan market
// Game is in Spanish, however audit mode is in English
ROM_START( chariotcv )
- ARISTOCRAT_MK5_BIOS
+ ARISTOCRAT_MK5_GALS
+ ARISTOCRAT_MK5_EEPROM
/*
Checksum code found at 0x000ba8
0x000000-0x07dbb7 is the Checksummed Range (excluding 0x000020-0x000027 where Checksum is stored)
@@ -3155,7 +3176,8 @@ ROM_END
// Ckeckmate / NSW/ACT / B - 06/07/01
// Checkmate is misspelled as 'Ckeckmate' in the ROM
ROM_START( checkma5 )
- ARISTOCRAT_MK5_BIOS
+ ARISTOCRAT_MK5_GALS
+ ARISTOCRAT_MK5_EEPROM
/*
Checksum code found at 0x000c38
0x000000-0x071847 is the Checksummed Range (excluding 0x000020-0x000027 where Checksum is stored)
@@ -3181,7 +3203,8 @@ ROM_END
// 0100351V / 596 / 10 Credit Multiplier/9 Line Multiline
// Chicken / Local / A - 27/08/96
ROM_START( chickna5 )
- ARISTOCRAT_MK5_BIOS
+ ARISTOCRAT_MK5_GALS
+ ARISTOCRAT_MK5_EEPROM
/*
Checksum code found at 0x000b80
0x000000-0x053fb7 is the Checksummed Range (excluding 0x000020-0x000027 where Checksum is stored)
@@ -3206,7 +3229,8 @@ ROM_END
// 0200530V / 596 / 10 Credit Multiplier/9 Line Multiline
// Chicken / QLD Club & Hotels / C - 23/02/98
ROM_START( chickna5ql )
- ARISTOCRAT_MK5_BIOS
+ ARISTOCRAT_MK5_GALS
+ ARISTOCRAT_MK5_EEPROM
/*
Checksum code found at 0x000ac8
0x000000-0x05f193 is the Checksummed Range (excluding 0x000020-0x000027 where Checksum is stored)
@@ -3240,7 +3264,9 @@ ROM_END
// No set chips required
// Variation (% and NO): 92.588% 03
ROM_START( chickna5u )
- ARISTOCRAT_MK5_BIOS
+ ARISTOCRAT_MK5_USA_SETCHIPS
+ ARISTOCRAT_MK5_GALS
+ ARISTOCRAT_MK5_EEPROM
/*
Checksum code found at 0x000d08
0x000000-0x0a6917 is the Checksummed Range (excluding 0x000020-0x000027 where Checksum is stored)
@@ -3271,7 +3297,9 @@ ROM_END
// No set chips required
// All devices are 27c4002 instead of 27c4096.
ROM_START( chickna5ua )
- ARISTOCRAT_MK5_BIOS
+ ARISTOCRAT_MK5_USA_SETCHIPS
+ ARISTOCRAT_MK5_GALS
+ ARISTOCRAT_MK5_EEPROM
/*
Checksum code found at 0x000d08
0x000000-0x0a6917 is the Checksummed Range (excluding 0x000020-0x000027 where Checksum is stored)
@@ -3300,7 +3328,8 @@ ROM_END
// ROM contains unaltered NSW/ACT "Local" region string, but game is for the Venezuelan market
// Game is in Spanish, however audit mode is in English
ROM_START( chickna5v )
- ARISTOCRAT_MK5_BIOS
+ ARISTOCRAT_MK5_GALS
+ ARISTOCRAT_MK5_EEPROM
/*
Checksum code found at 0x000b80
0x000000-0x07c3e7 is the Checksummed Range (excluding 0x000020-0x000027 where Checksum is stored)
@@ -3326,7 +3355,8 @@ ROM_END
// 0100919V / 577/7 / 25 Credit Multiplier/20 Line Multiline
// Coral Riches II / Local / A - 29/12/98
ROM_START( coralrc2 )
- ARISTOCRAT_MK5_BIOS
+ ARISTOCRAT_MK5_GALS
+ ARISTOCRAT_MK5_EEPROM
/*
Checksum code found at 0x000be8
0x000000-0x05ba63 is the Checksummed Range (excluding 0x000020-0x000027 where Checksum is stored)
@@ -3350,7 +3380,8 @@ ROM_END
// 0200753V / 615/1 / 10 Credit Multiplier / 20 Line Multiline
// Cuckoo / Local / D - 03/07/98
ROM_START( cuckoo )
- ARISTOCRAT_MK5_BIOS
+ ARISTOCRAT_MK5_GALS
+ ARISTOCRAT_MK5_EEPROM
/*
Checksum code found at 0x000b10
0x000000-0x05f63f is the Checksummed Range (excluding 0x000020-0x000027 where Checksum is stored)
@@ -3377,7 +3408,8 @@ ROM_END
// All devices are 27c4002 instead of 27c4096
// Requires set chips 4.01.xx
ROM_START( cuckoou )
- ARISTOCRAT_MK5_BIOS_HAVE_EEPROMS
+ ARISTOCRAT_MK5_USA_SETCHIPS
+ ARISTOCRAT_MK5_GALS
/*
Checksum code found at 0x000d18
0x000000-0x0a588b is the Checksummed Range (excluding 0x000020-0x000027 where Checksum is stored)
@@ -3413,7 +3445,8 @@ ROM_END
// 0300111V / 577/2 / 20 Credit Multiplier/9 Line Multiline
// Desert Bloom / Local / A - 12/10/95
ROM_START( dstbloom )
- ARISTOCRAT_MK5_BIOS
+ ARISTOCRAT_MK5_GALS
+ ARISTOCRAT_MK5_EEPROM
/*
Checksum code found at 0x000adc
0x000000-0x044573 is the Checksummed Range (excluding 0x000020-0x000027 where Checksum is stored)
@@ -3438,7 +3471,8 @@ ROM_END
// Desert Bloom / Local / A - 12/10/95
// Same strings as dstbloom but earlier version
ROM_START( dstblooma )
- ARISTOCRAT_MK5_BIOS
+ ARISTOCRAT_MK5_GALS
+ ARISTOCRAT_MK5_EEPROM
/*
Checksum code found at 0x000adc
0x000000-0x0431d3 is the Checksummed Range (excluding 0x000020-0x000027 where Checksum is stored)
@@ -3462,7 +3496,9 @@ ROM_END
// AHG1533 / MV4115_5 / 5, 10, 25, 50 Credit Multiplier / 20 Line Multiline
// Diamond Destiny / Export / A - 09/05/2000
ROM_START( diamdest )
- ARISTOCRAT_MK5_BIOS
+ ARISTOCRAT_MK5_USA_SETCHIPS
+ ARISTOCRAT_MK5_GALS
+ ARISTOCRAT_MK5_EEPROM
// checksum code not found due to ROMs being corrupted, all files are missing bytes consisting of 0x0D
ROM_REGION( 0x400000, "game_prg", ROMREGION_ERASEFF )
ROM_LOAD32_WORD( "ahg1533.u7", 0x000000, 0x7efb1, BAD_DUMP CRC(b228ed66) SHA1(a92e403b4df2054693787f48e988613843731f9e) )
@@ -3482,7 +3518,8 @@ ROM_END
// Diamond Dove / NSW/ACT / B - 19/05/99
// ROM says '9 Credit Multiplier' but game has a 3 credit multiplier
ROM_START( diamdove )
- ARISTOCRAT_MK5_BIOS
+ ARISTOCRAT_MK5_GALS
+ ARISTOCRAT_MK5_EEPROM
/*
Checksum code found at 0x000b78
0x000000-0x063a9f is the Checksummed Range (excluding 0x000020-0x000027 where Checksum is stored)
@@ -3508,7 +3545,8 @@ ROM_END
// 0200302V / 483/7 / 3 Credit Multiplier/3 Line Multiline
// Diamond Fever / Local / E - 05/09/96
ROM_START( dmdfever )
- ARISTOCRAT_MK5_BIOS
+ ARISTOCRAT_MK5_GALS
+ ARISTOCRAT_MK5_EEPROM
/*
Checksum code found at 0x000ad8
0x000000-0x054f3f is the Checksummed Range (excluding 0x000020-0x000027 where Checksum is stored)
@@ -3530,7 +3568,8 @@ ROM_END
// Diamond Touch / Local / E - 30/06/97
// Touchscreen game
ROM_START( dimtouch )
- ARISTOCRAT_MK5_BIOS
+ ARISTOCRAT_MK5_GALS
+ ARISTOCRAT_MK5_EEPROM
// checksum code not found (uses different startup sequence)
ROM_REGION( 0x400000, "game_prg", ROMREGION_ERASEFF )
ROM_LOAD32_WORD( "0400433v.u7", 0x000000, 0x80000, CRC(71b19365) SHA1(5a8ba1806af544d33e9acbcbbc0555805b4074e6) )
@@ -3547,7 +3586,8 @@ ROM_END
// 0200424V / 602/1 / 10 Credit Multiplier / 20 Line Multiline
// Dolphin Treasure / NSW/ACT / B - 06/12/96
ROM_START( dolphntr )
- ARISTOCRAT_MK5_BIOS
+ ARISTOCRAT_MK5_GALS
+ ARISTOCRAT_MK5_EEPROM
/*
Checksum code found at 0x000b08
0x000000-0x05c367 is the Checksummed Range (excluding 0x000020-0x000027 where Checksum is stored)
@@ -3569,7 +3609,8 @@ ROM_END
// Dolphin Treasure / NSW/ACT / B - 06/12/96
// Same strings as dolphntr but earlier version
ROM_START( dolphntra )
- ARISTOCRAT_MK5_BIOS
+ ARISTOCRAT_MK5_GALS
+ ARISTOCRAT_MK5_EEPROM
/*
Checksum code found at 0x000b08
0x000000-0x053897 is the Checksummed Range (excluding 0x000020-0x000027 where Checksum is stored)
@@ -3593,7 +3634,8 @@ ROM_END
// 0100388V / 602 / 10 Credit Multiplier / 9 Line Multiline
// Dolphin Treasure / NSW/ACT / B - 10/12/96
ROM_START( dolphntrb )
- ARISTOCRAT_MK5_BIOS
+ ARISTOCRAT_MK5_GALS
+ ARISTOCRAT_MK5_EEPROM
/*
Checksum code found at 0x000b20
0x000000-0x0536c3 is the Checksummed Range (excluding 0x000020-0x000027 where Checksum is stored)
@@ -3620,7 +3662,9 @@ ROM_END
// ROM says '9 & 20 Line Multiline' but game only has 20 lines with a 5, 10, 25 or 50 credit multiplier
// Requires set chips 4.04.xx
ROM_START( dolphntrce )
- ARISTOCRAT_MK5_BIOS
+ ARISTOCRAT_MK5_USA_SETCHIPS
+ ARISTOCRAT_MK5_GALS
+ ARISTOCRAT_MK5_EEPROM
/*
Checksum code found at 0x000d18
0x000000-0x0f24a3 is the Checksummed Range (excluding 0x000020-0x000027 where Checksum is stored)
@@ -3650,7 +3694,9 @@ ROM_END
// ROM says '9 & 20 Line Multiline' but game only has 9 lines with a 5, 10 or 20 credit multiplier
// Requires set chips 4.04.xx
ROM_START( dolphntrcea )
- ARISTOCRAT_MK5_BIOS
+ ARISTOCRAT_MK5_USA_SETCHIPS
+ ARISTOCRAT_MK5_GALS
+ ARISTOCRAT_MK5_EEPROM
/*
Checksum code found at 0x000d18
0x000000-0x0f2307 is the Checksummed Range (excluding 0x000020-0x000027 where Checksum is stored)
@@ -3680,7 +3726,9 @@ ROM_END
// ROM says '9 & 20 Line Multiline' but game only has 20 lines
// Requires set chips 4.04.xx
ROM_START( dolphntrceb )
- ARISTOCRAT_MK5_BIOS
+ ARISTOCRAT_MK5_USA_SETCHIPS
+ ARISTOCRAT_MK5_GALS
+ ARISTOCRAT_MK5_EEPROM
/*
Checksum code found at 0x000d18
0x000000-0x0eeb03 is the Checksummed Range (excluding 0x000020-0x000027 where Checksum is stored)
@@ -3709,7 +3757,8 @@ ROM_END
// All devices are 27c4002 instead of 27c4096
// No set chips required
ROM_START( dolphntru )
- ARISTOCRAT_MK5_BIOS_HAVE_EEPROMS
+ ARISTOCRAT_MK5_USA_SETCHIPS
+ ARISTOCRAT_MK5_GALS
/*
Checksum code found at 0x000d08
0x000000-0x08ec8b is the Checksummed Range (excluding 0x000020-0x000027 where Checksum is stored)
@@ -3746,7 +3795,8 @@ ROM_END
// Dragon's Eye / Local / A - 09/05/97
// ROM says '10 Line Multiline' but game only has 9 lines
ROM_START( drgneye )
- ARISTOCRAT_MK5_BIOS
+ ARISTOCRAT_MK5_GALS
+ ARISTOCRAT_MK5_EEPROM
/*
Checksum code found at 0x000af8
0x000000-0x05891b is the Checksummed Range (excluding 0x000020-0x000027 where Checksum is stored)
@@ -3768,7 +3818,8 @@ ROM_END
// Dream Weaver / Local / A- 20/06/97
// Touchscreen game
ROM_START( dreamwv )
- ARISTOCRAT_MK5_BIOS
+ ARISTOCRAT_MK5_GALS
+ ARISTOCRAT_MK5_EEPROM
// checksum code not found (uses different startup sequence)
ROM_REGION( 0x400000, "game_prg", ROMREGION_ERASEFF )
ROM_LOAD32_WORD( "0200586v.u7", 0x000000, 0x80000, CRC(6d52fcd1) SHA1(136cb89037a96bf6824ed5754fc67167f0287684) )
@@ -3785,7 +3836,8 @@ ROM_END
// 01J00081 / JB004 / Multi credit / Multi line
// Dynamite Jack / NSW/ACT / A - 12/07/2000
ROM_START( dynajack )
- ARISTOCRAT_MK5_BIOS
+ ARISTOCRAT_MK5_GALS
+ ARISTOCRAT_MK5_EEPROM
/*
Checksum code found at 0x000b78
0x000000-0x07031b is the Checksummed Range (excluding 0x000020-0x000027 where Checksum is stored)
@@ -3811,7 +3863,9 @@ ROM_END
// CHG1562 / US002 / 5,10,20, Credit Multiplier / 9 Line Multiline
// Dynamite Jack / Export / A - 11/07/01
ROM_START( dynajacku )
- ARISTOCRAT_MK5_BIOS
+ ARISTOCRAT_MK5_USA_SETCHIPS
+ ARISTOCRAT_MK5_GALS
+ ARISTOCRAT_MK5_EEPROM
// checksum code not found due to ROMs being corrupted, first 4 files are missing bytes consisting of 0x0D
ROM_REGION( 0x400000, "game_prg", ROMREGION_ERASEFF )
ROM_LOAD32_WORD( "chg1562.u7", 0x000000, 0x7f023, BAD_DUMP CRC(c69c989c) SHA1(6eeadf185a38944c6c0c32777c006f27505eaa73) )
@@ -3830,7 +3884,8 @@ ROM_END
// 0100652V / 623 / 8 Credit Multiplier / 25 Credit Multiway
// El Dorado / Local / B - 24/03/98
ROM_START( eldorda5 )
- ARISTOCRAT_MK5_BIOS
+ ARISTOCRAT_MK5_GALS
+ ARISTOCRAT_MK5_EEPROM
/*
Checksum code found at 0x000b88
0x000000-0x06328b is the Checksummed Range (excluding 0x000020-0x000027 where Checksum is stored)
@@ -3851,7 +3906,8 @@ ROM_END
// 0400122V / 570/3 / 10 Credit Multiplier/9 Line Multiline
// Enchanted Forest / Local / E - 23/06/95
ROM_START( eforsta5 )
- ARISTOCRAT_MK5_BIOS
+ ARISTOCRAT_MK5_GALS
+ ARISTOCRAT_MK5_EEPROM
/*
Checksum code found at 0x000ae4
0x000000-0x045da3 is the Checksummed Range (excluding 0x000020-0x000027 where Checksum is stored)
@@ -3873,7 +3929,9 @@ ROM_END
// Enchanted Forest / Export / C - 17/01/00
// Cash Express Hyperlink game, but can also run standalone without progressive jackpot
ROM_START( eforsta5ce )
- ARISTOCRAT_MK5_BIOS
+ ARISTOCRAT_MK5_USA_SETCHIPS
+ ARISTOCRAT_MK5_GALS
+ ARISTOCRAT_MK5_EEPROM
// checksum code not found due to ROMs being corrupted, first 6 files are missing bytes consisting of 0x0D
ROM_REGION( 0x400000, "game_prg", ROMREGION_ERASEFF )
ROM_LOAD32_WORD( "chg1536.u7", 0x000000, 0x7efd4, BAD_DUMP CRC(d29185cc) SHA1(26154f3d99907461cff4a44fe02929fae66e6963) )
@@ -3898,7 +3956,9 @@ ROM_END
// Cash Express Hyperlink game, but can also run standalone without progressive jackpot
// Requires set chips 4.04.xx
ROM_START( eforsta5cea )
- ARISTOCRAT_MK5_BIOS
+ ARISTOCRAT_MK5_USA_SETCHIPS
+ ARISTOCRAT_MK5_GALS
+ ARISTOCRAT_MK5_EEPROM
/*
Checksum code found at 0x000d18
0x000000-0x0f29e7 is the Checksummed Range (excluding 0x000020-0x000027 where Checksum is stored)
@@ -3928,7 +3988,9 @@ ROM_END
// All devices are 27c4002 instead of 27c4096.
// No set chips required
ROM_START( eforsta5u )
- ARISTOCRAT_MK5_BIOS
+ ARISTOCRAT_MK5_USA_SETCHIPS
+ ARISTOCRAT_MK5_GALS
+ ARISTOCRAT_MK5_EEPROM
/*
Checksum code found at 0x000d08
0x000000-0x0a5233 is the Checksummed Range (excluding 0x000020-0x000027 where Checksum is stored)
@@ -3955,7 +4017,9 @@ ROM_END
// All devices are 27c4002 instead of 27c4096.
// No set chips required
ROM_START( eforsta5ua )
- ARISTOCRAT_MK5_BIOS
+ ARISTOCRAT_MK5_USA_SETCHIPS
+ ARISTOCRAT_MK5_GALS
+ ARISTOCRAT_MK5_EEPROM
/*
Checksum code found at 0x000d08
0x000000-0x0a5233 is the Checksummed Range (excluding 0x000020-0x000027 where Checksum is stored)
@@ -3979,7 +4043,8 @@ ROM_END
// 0100651V / 624 / 3 Credit Multiplier / 3 Line Multiline
// Fast Fortune / Local / D - 07/05/98
ROM_START( fastfort )
- ARISTOCRAT_MK5_BIOS
+ ARISTOCRAT_MK5_GALS
+ ARISTOCRAT_MK5_EEPROM
/*
Checksum code found at 0x000ba8
0x000000-0x05c0e7 is the Checksummed Range (excluding 0x000020-0x000027 where Checksum is stored)
@@ -4003,7 +4068,8 @@ ROM_END
// 01J00131 / JB006 / Multi credit / Multi line
// Fortune Teller / NSW/ACT / D - 24/11/2000
ROM_START( fortellr )
- ARISTOCRAT_MK5_BIOS
+ ARISTOCRAT_MK5_GALS
+ ARISTOCRAT_MK5_EEPROM
/*
Checksum code found at 0x000b78
0x000000-0x07038b is the Checksummed Range (excluding 0x000020-0x000027 where Checksum is stored)
@@ -4031,7 +4097,9 @@ ROM_END
// BHG1566 / MV4122/2 / 9 Line Multiline / 5, 10, 20 Credit Multiplier
// Fortune Fever / Export / A - 13/05/01
ROM_START( fortfvr )
- ARISTOCRAT_MK5_BIOS
+ ARISTOCRAT_MK5_USA_SETCHIPS
+ ARISTOCRAT_MK5_GALS
+ ARISTOCRAT_MK5_EEPROM
// checksum code not found due to ROMs being corrupted, 7 out of 8 files are missing bytes consisting of 0x0D
ROM_REGION( 0x400000, "game_prg", ROMREGION_ERASEFF )
ROM_LOAD32_WORD( "bhg1566.u7", 0x000000, 0x7f050, BAD_DUMP CRC(07c896ae) SHA1(5d275f3759253d2aa3eeef4d6ce973e9a3b5e421) )
@@ -4055,7 +4123,9 @@ ROM_END
// All devices are 27c4002 instead of 27c4096
// No set chips required
ROM_START( gambler )
- ARISTOCRAT_MK5_BIOS
+ ARISTOCRAT_MK5_USA_SETCHIPS
+ ARISTOCRAT_MK5_GALS
+ ARISTOCRAT_MK5_EEPROM
/*
Checksum code found at 0x000d08
0x000000-0x08f46b is the Checksummed Range (excluding 0x000020-0x000027 where Checksum is stored)
@@ -4080,7 +4150,8 @@ ROM_END
// Geisha / New Zealand / A- 05/03/01
// This game is downported from the MK6 version for the New Zealand market only, no other MK5 version exists
ROM_START( geisha )
- ARISTOCRAT_MK5_BIOS
+ ARISTOCRAT_MK5_GALS
+ ARISTOCRAT_MK5_EEPROM
// checksum code not found (uses different startup sequence)
ROM_REGION( 0x400000, "game_prg", ROMREGION_ERASEFF )
ROM_LOAD32_WORD( "0101408v.u7", 0x000000, 0x80000, CRC(ebdde248) SHA1(83f4f4deb5c6f5b33ae066d50e043a24cb0cbfe0) )
@@ -4100,7 +4171,8 @@ ROM_END
// Genie Magic / Local / C- 15/02/99
// Touchscreen game
ROM_START( genmagi )
- ARISTOCRAT_MK5_BIOS
+ ARISTOCRAT_MK5_GALS
+ ARISTOCRAT_MK5_EEPROM
// checksum code not found (uses different startup sequence)
ROM_REGION( 0x400000, "game_prg", ROMREGION_ERASEFF )
ROM_LOAD32_WORD( "0200894v.u7", 0x000000, 0x80000, CRC(20ec3b50) SHA1(400ad7f86077184fee63690060fe2a51ba888e1b) )
@@ -4123,7 +4195,9 @@ ROM_END
// Requires set chip version: 4.04.xx
// Cash Express Hyperlink game, but can also run standalone without progressive jackpot
ROM_START( glizrdce )
- ARISTOCRAT_MK5_BIOS
+ ARISTOCRAT_MK5_USA_SETCHIPS
+ ARISTOCRAT_MK5_GALS
+ ARISTOCRAT_MK5_EEPROM
/*
Checksum code found at 0x000d18
0x000000-0x0f19bf is the Checksummed Range (excluding 0x000020-0x000027 where Checksum is stored)
@@ -4150,7 +4224,8 @@ ROM_END
// 0100767V / 625 / 10 Credit Multiplier/20 Line Multiline
// Gnome Around The World 200cm / NSW/ACT / C - 18/12/98
ROM_START( gnomeatw )
- ARISTOCRAT_MK5_BIOS
+ ARISTOCRAT_MK5_GALS
+ ARISTOCRAT_MK5_EEPROM
/*
Checksum code found at 0x000b68
0x000000-0x05ebcb is the Checksummed Range (excluding 0x000020-0x000027 where Checksum is stored)
@@ -4177,7 +4252,9 @@ ROM_END
// Marked as AHG1205-03, Golden Pyramids, and 94.941%
// No set chips required
ROM_START( goldpyr )
- ARISTOCRAT_MK5_BIOS
+ ARISTOCRAT_MK5_USA_SETCHIPS
+ ARISTOCRAT_MK5_GALS
+ ARISTOCRAT_MK5_EEPROM
/*
Checksum code found at 0x000d08
0x000000-0x08ec83 is the Checksummed Range (excluding 0x000020-0x000027 where Checksum is stored)
@@ -4204,7 +4281,9 @@ ROM_END
// Marked as AHG1206-99, Golden Pyramids, and 87.928%
// No set chips required
ROM_START( goldpyra )
- ARISTOCRAT_MK5_BIOS
+ ARISTOCRAT_MK5_USA_SETCHIPS
+ ARISTOCRAT_MK5_GALS
+ ARISTOCRAT_MK5_EEPROM
/*
Checksum code found at 0x000d08
0x000000-0x08ef13 is the Checksummed Range (excluding 0x000020-0x000027 where Checksum is stored)
@@ -4230,7 +4309,8 @@ ROM_END
// ROM says 'Golden Pyramid' with three trailing spaces, artwork says 'Golden Pyramids'
// Original casino BIOS is not dumped, using New Zealand 0700474V BIOS until an Australian version is dumped
ROM_START( goldpyrb )
- ARISTOCRAT_MK5_BIOS
+ ARISTOCRAT_MK5_GALS
+ ARISTOCRAT_MK5_EEPROM
/*
note, this actually contains a 2nd checksum for the game, this is the base/bios check only.
@@ -4259,7 +4339,8 @@ ROM_END
// 0101164V / 661 / 50 Credit Multiplier / 20 Line Multiline
// Golden Ra / NSW/ACT / A - 10/04/00
ROM_START( goldenra )
- ARISTOCRAT_MK5_BIOS
+ ARISTOCRAT_MK5_GALS
+ ARISTOCRAT_MK5_EEPROM
/*
Checksum code found at 0x000b98
0x000000-0x068297 is the Checksummed Range (excluding 0x000020-0x000027 where Checksum is stored)
@@ -4285,7 +4366,8 @@ ROM_END
// 03J00241 / JB008 / Multi credit / Multi line
// Honey Pot / NSW/ACT / A - 21/11/2000
ROM_START( honeypot )
- ARISTOCRAT_MK5_BIOS
+ ARISTOCRAT_MK5_GALS
+ ARISTOCRAT_MK5_EEPROM
/*
Checksum code found at 0x000bb8
0x000000-0x06f02b is the Checksummed Range (excluding 0x000020-0x000027 where Checksum is stored)
@@ -4315,7 +4397,9 @@ ROM_END
// Variation (% and NO)
// The game shares reel graphics with Boot Scootin', but the game plays identically to Penguin Pays therefore it doesn't have the double wild feature.
ROM_START( hnktonku )
- ARISTOCRAT_MK5_BIOS
+ ARISTOCRAT_MK5_USA_SETCHIPS
+ ARISTOCRAT_MK5_GALS
+ ARISTOCRAT_MK5_EEPROM
/*
Checksum code found at 0x000d18
0x000000-0x0ed4ff is the Checksummed Range (excluding 0x000020-0x000027 where Checksum is stored)
@@ -4340,7 +4424,8 @@ ROM_END
// 0100872V / 631/3 B / 25 Credit Multiplier / 20 Line Multiline
// INCA SUN / NSW/ACT / B- 03/05/99
ROM_START( incasun )
- ARISTOCRAT_MK5_BIOS
+ ARISTOCRAT_MK5_GALS
+ ARISTOCRAT_MK5_EEPROM
/*
Checksum code found at 0x000bf8
0x000000-0x05f56b is the Checksummed Range (excluding 0x000020-0x000027 where Checksum is stored)
@@ -4366,7 +4451,8 @@ ROM_END
// INCA SUN / NSW/ACT / B- 03/05/99
// SHOW PROGRAM
ROM_START( incasunsp )
- ARISTOCRAT_MK5_BIOS
+ ARISTOCRAT_MK5_GALS
+ ARISTOCRAT_MK5_EEPROM
ROM_REGION( 0x400000, "game_prg", ROMREGION_ERASEFF )
/*
Checksum code found at 0x000bf8
@@ -4391,7 +4477,8 @@ ROM_END
// 0101108V / MV4113 / 5 Credit Multiplier/20 Line Multiline
// Inca Sun / New Zealand / A- 6/3/00
ROM_START( incasunnz )
- ARISTOCRAT_MK5_BIOS
+ ARISTOCRAT_MK5_GALS
+ ARISTOCRAT_MK5_EEPROM
// checksum code not found (uses different startup sequence)
ROM_REGION( 0x400000, "game_prg", ROMREGION_ERASEFF )
ROM_LOAD32_WORD( "0101108v.u7", 0x000000, 0x80000, CRC(1e7be5ca) SHA1(333b7665fab8f60fb60e9d3b44de96725763ca17) )
@@ -4411,7 +4498,8 @@ ROM_END
// Inca Sun / Export / A - 05/09/00
// Requires set chips 4.03.xx
ROM_START( incasunu )
- ARISTOCRAT_MK5_BIOS_HAVE_EEPROMS
+ ARISTOCRAT_MK5_USA_SETCHIPS
+ ARISTOCRAT_MK5_GALS
/*
Checksum code found at 0x000d18
0x000000-0x0e847f is the Checksummed Range (excluding 0x000020-0x000027 where Checksum is stored)
@@ -4450,7 +4538,9 @@ ROM_END
// Same strings as incasunu but different version
// Requires set chips 4.04.xx
ROM_START( incasunua )
- ARISTOCRAT_MK5_BIOS
+ ARISTOCRAT_MK5_USA_SETCHIPS
+ ARISTOCRAT_MK5_GALS
+ ARISTOCRAT_MK5_EEPROM
/*
Checksum code found at 0x000d18
0x000000-0x0ec3a7 is the Checksummed Range (excluding 0x000020-0x000027 where Checksum is stored)
@@ -4476,7 +4566,8 @@ ROM_END
// INCA SUN / VENEZUELA / B- 03/05/99
// Game is in Spanish, however audit mode is in English
ROM_START( incasunv )
- ARISTOCRAT_MK5_BIOS
+ ARISTOCRAT_MK5_GALS
+ ARISTOCRAT_MK5_EEPROM
/*
Checksum code found at 0x000c10
0x000000-0x082163 is the Checksummed Range (excluding 0x000020-0x000027 where Checksum is stored)
@@ -4501,7 +4592,8 @@ ROM_END
// 0100845V / 628/1 / 25 Credit Multiway / 20 Credit Multiplier
// Indian Dreaming / Local / B - 15/12/98
ROM_START( indrema5 )
- ARISTOCRAT_MK5_BIOS
+ ARISTOCRAT_MK5_GALS
+ ARISTOCRAT_MK5_EEPROM
/*
Checksum code found at 0x000ba8
0x000000-0x06323f is the Checksummed Range (excluding 0x000020-0x000027 where Checksum is stored)
@@ -4525,7 +4617,8 @@ ROM_END
// 0100161V / 586/2 / 10 Credit Multiplier/9 Line Multiline
// Jumping Beans / Local / A - 25/1/96
ROM_START( jumpbean )
- ARISTOCRAT_MK5_BIOS
+ ARISTOCRAT_MK5_GALS
+ ARISTOCRAT_MK5_EEPROM
// checksum code not found due to ROMs being corrupted, all files are missing bytes consisting of 0x0D
ROM_REGION( 0x400000, "game_prg", ROMREGION_ERASEFF )
ROM_LOAD32_WORD( "0100161v.u7", 0x000000, 0x7fa4c, BAD_DUMP CRC(6994c968) SHA1(7896a93aeec9c2d815c49d203ca594644e5df8a6) )
@@ -4542,7 +4635,8 @@ ROM_END
// 0100383V / 586/6 / 25 Credit Multiplier / 20 Line Multiline
// JUMPIN' JOEY 500cm / NSW/ACT / C - 13/11/96
ROM_START( jumpjoey )
- ARISTOCRAT_MK5_BIOS
+ ARISTOCRAT_MK5_GALS
+ ARISTOCRAT_MK5_EEPROM
/*
Checksum code found at 0x000ae8
0x000000-0x0562cb is the Checksummed Range (excluding 0x000020-0x000027 where Checksum is stored)
@@ -4567,7 +4661,8 @@ ROM_END
// Jungle Juice / Crown / F - 06/03/96
// ROM says 'Crown' as region (Crown Casino), but game was from Dunedin Casino with New Zealand base chips
ROM_START( jungjuic )
- ARISTOCRAT_MK5_BIOS
+ ARISTOCRAT_MK5_GALS
+ ARISTOCRAT_MK5_EEPROM
/*
note, this actually contains a 2nd checksum for the game, this is the base/bios check only.
@@ -4595,7 +4690,8 @@ ROM_END
// King Galah / Local / A - 21/07/95
// ROM says 1995 but artwork says 1997; game has a 1998+ style denomination sign
ROM_START( kgalah )
- ARISTOCRAT_MK5_BIOS
+ ARISTOCRAT_MK5_GALS
+ ARISTOCRAT_MK5_EEPROM
/*
Checksum code found at 0x000b28
0x000000-0x05af27 is the Checksummed Range (excluding 0x000020-0x000027 where Checksum is stored)
@@ -4620,7 +4716,8 @@ ROM_END
// King Galah / Local / A - 21/07/95
// ROM says 1995 but artwork says 1997; game has the newer style music introduced in 1997
ROM_START( kgalaha )
- ARISTOCRAT_MK5_BIOS
+ ARISTOCRAT_MK5_GALS
+ ARISTOCRAT_MK5_EEPROM
/*
Checksum code found at 0x000b28
0x000000-0x058863 is the Checksummed Range (excluding 0x000020-0x000027 where Checksum is stored)
@@ -4647,7 +4744,9 @@ ROM_END
// Variation (% and NO):
// Cash Express Hyperlink game, but can also run standalone without progressive jackpot
ROM_START( kgalahce )
- ARISTOCRAT_MK5_BIOS
+ ARISTOCRAT_MK5_USA_SETCHIPS
+ ARISTOCRAT_MK5_GALS
+ ARISTOCRAT_MK5_EEPROM
/*
Checksum code found at 0x000d18
0x000000-0x0f19b3 is the Checksummed Range (excluding 0x000020-0x000027 where Checksum is stored)
@@ -4674,7 +4773,8 @@ ROM_END
// 0200024V / 540/3 / 10 Credit Multiplier/5 Line Multiline
// K. G. Bird / Local / D - 10/10/94
ROM_START( kgbirda5 )
- ARISTOCRAT_MK5_BIOS
+ ARISTOCRAT_MK5_GALS
+ ARISTOCRAT_MK5_EEPROM
/*
Checksum code found at 0x000ae0
0x000000-0x0435af is the Checksummed Range (excluding 0x000020-0x000027 where Checksum is stored)
@@ -4699,7 +4799,9 @@ ROM_END
// Koala Mint / Export / A - 12/09/01
// Requires set chips 4.04.xx
ROM_START( koalamnt )
- ARISTOCRAT_MK5_BIOS
+ ARISTOCRAT_MK5_USA_SETCHIPS
+ ARISTOCRAT_MK5_GALS
+ ARISTOCRAT_MK5_EEPROM
/*
Checksum code found at 0x000d18
0x000000-0x0ec32b is the Checksummed Range (excluding 0x000020-0x000027 where Checksum is stored)
@@ -4726,7 +4828,8 @@ ROM_END
// 0100677V / 614/2 / 10 Credit Multiplier/20 Line Multiline
// Kooka Bucks 200cm / NSW/ACT / A - 03/04/98
ROM_START( kookabuk )
- ARISTOCRAT_MK5_BIOS
+ ARISTOCRAT_MK5_GALS
+ ARISTOCRAT_MK5_EEPROM
/*
Checksum code found at 0x000b68
0x000000-0x061857 is the Checksummed Range (excluding 0x000020-0x000027 where Checksum is stored)
@@ -4753,7 +4856,9 @@ ROM_END
// Variation (% and NO)
// Touchscreen game
ROM_START( kyhatonu )
- ARISTOCRAT_MK5_BIOS
+ ARISTOCRAT_MK5_USA_SETCHIPS
+ ARISTOCRAT_MK5_GALS
+ ARISTOCRAT_MK5_EEPROM
/*
Checksum code found at 0x000d18
0x000000-0x0a6927 is the Checksummed Range (excluding 0x000020-0x000027 where Checksum is stored)
@@ -4780,7 +4885,8 @@ ROM_END
// 0100473V / 599/3 / 25 Credit Multiplier / 20 Line Multiline
// Loco Loot / Local / C - 17/06/97
ROM_START( locoloot )
- ARISTOCRAT_MK5_BIOS
+ ARISTOCRAT_MK5_GALS
+ ARISTOCRAT_MK5_EEPROM
/*
Checksum code found at 0x000b20
0x000000-0x05633b is the Checksummed Range (excluding 0x000020-0x000027 where Checksum is stored)
@@ -4801,7 +4907,8 @@ ROM_END
// 0100472V / 599/2 / 20 Credit Multiplier / 9 Line Multiline
// Loco Loot / Local / C - 17/06/97
ROM_START( locoloota )
- ARISTOCRAT_MK5_BIOS
+ ARISTOCRAT_MK5_GALS
+ ARISTOCRAT_MK5_EEPROM
/*
Checksum code found at 0x000b20
0x000000-0x055e93 is the Checksummed Range (excluding 0x000020-0x000027 where Checksum is stored)
@@ -4822,7 +4929,8 @@ ROM_END
// 0600725V / MV4064 / 5 Credit Multiplier / 20 Line Multiline
// Loco Loot / New Zealand / A - 8/7/98
ROM_START( locolootnz )
- ARISTOCRAT_MK5_BIOS
+ ARISTOCRAT_MK5_GALS
+ ARISTOCRAT_MK5_EEPROM
// checksum code not found (uses different startup sequence)
ROM_REGION( 0x400000, "game_prg", ROMREGION_ERASEFF )
ROM_LOAD32_WORD( "0600725v.u7", 0x000000, 0x80000, CRC(164dd049) SHA1(c99c56af72cb1eb69591cb8f7bacbd06bdb6494d) )
@@ -4840,7 +4948,9 @@ ROM_END
// Loco Loot / Export / A - 30/07/01
// Requires set chips 4.04.xx
ROM_START( locolootu )
- ARISTOCRAT_MK5_BIOS
+ ARISTOCRAT_MK5_USA_SETCHIPS
+ ARISTOCRAT_MK5_GALS
+ ARISTOCRAT_MK5_EEPROM
/*
Checksum code found at 0x000d18
0x000000-0x0e94fb is the Checksummed Range (excluding 0x000020-0x000027 where Checksum is stored)
@@ -4864,7 +4974,8 @@ ROM_END
// 0100587V / 621 / 3 Credit Multiplier/3 Line Multiline
// Lone Wolf / Local / A - 29/10/97
ROM_START( lonewolf )
- ARISTOCRAT_MK5_BIOS
+ ARISTOCRAT_MK5_GALS
+ ARISTOCRAT_MK5_EEPROM
/*
Checksum code found at 0x000b48
0x000000-0x0580f3 is the Checksummed Range (excluding 0x000020-0x000027 where Checksum is stored)
@@ -4885,7 +4996,8 @@ ROM_END
// 0300109V / 570/6 / 20 Credit Multiplier/9 Line Multiline
// Lucky Clover / Local / A - 12/10/95
ROM_START( luckyclo )
- ARISTOCRAT_MK5_BIOS
+ ARISTOCRAT_MK5_GALS
+ ARISTOCRAT_MK5_EEPROM
/*
Checksum code found at 0x000ae8
0x000000-0x055e07 is the Checksummed Range (excluding 0x000020-0x000027 where Checksum is stored)
@@ -4908,7 +5020,9 @@ ROM_END
// Marked as AHG1211 and 88.26%
// No set chips required
ROM_START( mgarden )
- ARISTOCRAT_MK5_BIOS
+ ARISTOCRAT_MK5_USA_SETCHIPS
+ ARISTOCRAT_MK5_GALS
+ ARISTOCRAT_MK5_EEPROM
/*
Checksum code found at 0x000d08
0x000000-0x0a522b is the Checksummed Range (excluding 0x000020-0x000027 where Checksum is stored)
@@ -4934,7 +5048,9 @@ ROM_END
// Requires set chips 4.04.xx
// Touchscreen game
ROM_START( magimask )
- ARISTOCRAT_MK5_BIOS
+ ARISTOCRAT_MK5_USA_SETCHIPS
+ ARISTOCRAT_MK5_GALS
+ ARISTOCRAT_MK5_EEPROM
/*
Checksum code found at 0x000d18
0x000000-0x0e95fb is the Checksummed Range (excluding 0x000020-0x000027 where Checksum is stored)
@@ -4960,7 +5076,8 @@ ROM_END
// Requires set chips 4.04.xx
// Touchscreen game
ROM_START( magimaska )
- ARISTOCRAT_MK5_BIOS_HAVE_EEPROMS
+ ARISTOCRAT_MK5_USA_SETCHIPS
+ ARISTOCRAT_MK5_GALS
/*
Checksum code found at 0x000d18
0x000000-0x0e9597 is the Checksummed Range (excluding 0x000020-0x000027 where Checksum is stored)
@@ -5000,7 +5117,8 @@ ROM_END
// Requires set chips 4.03.xx
// Touchscreen game
ROM_START( magimaskb )
- ARISTOCRAT_MK5_BIOS_HAVE_EEPROMS
+ ARISTOCRAT_MK5_USA_SETCHIPS
+ ARISTOCRAT_MK5_GALS
/*
Checksum code found at 0x000d18
0x000000-0x0e8527 is the Checksummed Range (excluding 0x000020-0x000027 where Checksum is stored)
@@ -5037,7 +5155,8 @@ ROM_END
// Magic Touch / Local / A- 06/03/97
// Touchscreen game
ROM_START( magtcha5 )
- ARISTOCRAT_MK5_BIOS
+ ARISTOCRAT_MK5_GALS
+ ARISTOCRAT_MK5_EEPROM
// checksum code not found (uses different startup sequence)
ROM_REGION( 0x400000, "game_prg", ROMREGION_ERASEFF )
ROM_LOAD32_WORD( "0300455v.u7", 0x000000, 0x80000, CRC(a1568e3b) SHA1(842c1aa3f9765f7ba9f2587cb94b6ef03c74e8b9) )
@@ -5058,7 +5177,8 @@ ROM_END
// Same strings as magtcha5 but earlier version
// Touchscreen game
ROM_START( magtcha5a )
- ARISTOCRAT_MK5_BIOS
+ ARISTOCRAT_MK5_GALS
+ ARISTOCRAT_MK5_EEPROM
// checksum code not found (uses different startup sequence)
ROM_REGION( 0x400000, "game_prg", ROMREGION_ERASEFF )
ROM_LOAD32_WORD( "0200455v.u7", 0x000000, 0x80000, CRC(9fa3ee86) SHA1(ce7546b8d1dbf90eb8f4f8d3255dc1c215c966a7) )
@@ -5077,7 +5197,8 @@ ROM_END
// 0100425V / 595/5 / 10 Credit Multiplier/20 Line Multiline
// Mammoth Money / Local / D - 07/04/97
ROM_START( mammothm )
- ARISTOCRAT_MK5_BIOS
+ ARISTOCRAT_MK5_GALS
+ ARISTOCRAT_MK5_EEPROM
/*
Checksum code found at 0x000adc
0x000000-0x053623 is the Checksummed Range (excluding 0x000020-0x000027 where Checksum is stored)
@@ -5101,7 +5222,8 @@ ROM_END
// 01J00101 / JB005 / Multi credit / Multi line
// Margarita Magic / NSW/ACT / A - 07/07/2000
ROM_START( marmagic )
- ARISTOCRAT_MK5_BIOS
+ ARISTOCRAT_MK5_GALS
+ ARISTOCRAT_MK5_EEPROM
/*
Checksum code found at 0x000b78
0x000000-0x06d93b is the Checksummed Range (excluding 0x000020-0x000027 where Checksum is stored)
@@ -5129,7 +5251,9 @@ ROM_END
// ROM has NSW/ACT strings but it is for US platform
// Requires set chips 4.04.xx
ROM_START( marmagicu )
- ARISTOCRAT_MK5_BIOS
+ ARISTOCRAT_MK5_USA_SETCHIPS
+ ARISTOCRAT_MK5_GALS
+ ARISTOCRAT_MK5_EEPROM
/*
Checksum code found at 0x000d18
0x000000-0x0ed9f3 is the Checksummed Range (excluding 0x000020-0x000027 where Checksum is stored)
@@ -5158,7 +5282,9 @@ ROM_END
// ROM has NSW/ACT strings but it is for US platform
// Requires set chips 4.04.xx
ROM_START( marmagicua )
- ARISTOCRAT_MK5_BIOS
+ ARISTOCRAT_MK5_USA_SETCHIPS
+ ARISTOCRAT_MK5_GALS
+ ARISTOCRAT_MK5_EEPROM
/*
Checksum code found at 0x000d18
0x000000-0x0eda53 is the Checksummed Range (excluding 0x000020-0x000027 where Checksum is stored)
@@ -5186,7 +5312,8 @@ ROM_END
// 0400115V / 559/2 / 10 Credit Multiplier/9 Line Multiline
// Mine, Mine, Mine / Local / D - 16/01/96
ROM_START( minemine )
- ARISTOCRAT_MK5_BIOS
+ ARISTOCRAT_MK5_GALS
+ ARISTOCRAT_MK5_EEPROM
/*
Checksum code found at 0x000adc
0x000000-0x0446e3 is the Checksummed Range (excluding 0x000020-0x000027 where Checksum is stored)
@@ -5212,7 +5339,8 @@ ROM_END
// All devices are 27c4002 instead of 27c4096
// No set chips required
ROM_START( minemineu )
- ARISTOCRAT_MK5_BIOS_HAVE_EEPROMS
+ ARISTOCRAT_MK5_USA_SETCHIPS
+ ARISTOCRAT_MK5_GALS
/*
Checksum code found at 0x000d10
0x000000-0x0a7203 is the Checksummed Range (excluding 0x000020-0x000027 where Checksum is stored)
@@ -5251,7 +5379,9 @@ ROM_END
// All eproms are 27C4002.
// No set chips required
ROM_START( minemineua )
- ARISTOCRAT_MK5_BIOS
+ ARISTOCRAT_MK5_USA_SETCHIPS
+ ARISTOCRAT_MK5_GALS
+ ARISTOCRAT_MK5_EEPROM
/*
Checksum code found at 0x000d10
0x000000-0x0a7183 is the Checksummed Range (excluding 0x000020-0x000027 where Checksum is stored)
@@ -5275,7 +5405,8 @@ ROM_END
// 0400469V / 607/1 / 25 Credit Multiplier/20 Line Multiline
// Money Mouse / Local / B - 08/04/97
ROM_START( monmouse )
- ARISTOCRAT_MK5_BIOS
+ ARISTOCRAT_MK5_GALS
+ ARISTOCRAT_MK5_EEPROM
/*
Checksum code found at 0x000b80
0x000000-0x066077 is the Checksummed Range (excluding 0x000020-0x000027 where Checksum is stored)
@@ -5300,7 +5431,8 @@ ROM_END
// Money Mouse / Local / B - 08/04/97
// Same strings as monmouse but earlier version
ROM_START( monmousea )
- ARISTOCRAT_MK5_BIOS
+ ARISTOCRAT_MK5_GALS
+ ARISTOCRAT_MK5_EEPROM
/*
Checksum code found at 0x000b80
0x000000-0x05dc0b is the Checksummed Range (excluding 0x000020-0x000027 where Checksum is stored)
@@ -5324,7 +5456,8 @@ ROM_END
// 0201397V / MV4126 / 12 Credit Multiplier/20 Line Multiline
// Money Tree / New Zealand / C- 12/04/01
ROM_START( montree )
- ARISTOCRAT_MK5_BIOS
+ ARISTOCRAT_MK5_GALS
+ ARISTOCRAT_MK5_EEPROM
// checksum code not found (uses different startup sequence)
ROM_REGION( 0x400000, "game_prg", ROMREGION_ERASEFF )
ROM_LOAD32_WORD( "0201397v.u7", 0x000000, 0x80000, CRC(982a0078) SHA1(163c15aebd2be623c0f2c7641360336399bc1f4f) )
@@ -5343,7 +5476,8 @@ ROM_END
// 0100294V / 595/3 / 50 Credit Multiplier/20 Line Multiline
// Mountain Money / Local / B - 11/06/96
ROM_START( mountmon )
- ARISTOCRAT_MK5_BIOS
+ ARISTOCRAT_MK5_GALS
+ ARISTOCRAT_MK5_EEPROM
/*
Checksum code found at 0x000ae4
0x000000-0x04ee9b is the Checksummed Range (excluding 0x000020-0x000027 where Checksum is stored)
@@ -5364,7 +5498,8 @@ ROM_END
// 0100289V / 595/2 / 5 Credit Multiplier/20 Line Multiline
// Mountain Money / Local / C - 11/06/96
ROM_START( mountmona )
- ARISTOCRAT_MK5_BIOS
+ ARISTOCRAT_MK5_GALS
+ ARISTOCRAT_MK5_EEPROM
/*
Checksum code found at 0x000ae4
0x000000-0x04eea3 is the Checksummed Range (excluding 0x000020-0x000027 where Checksum is stored)
@@ -5386,7 +5521,9 @@ ROM_END
// Mountain Money / Export / A - 10/03/01
// Cash Express Hyperlink game, but can also run standalone without progressive jackpot
ROM_START( mountmonce )
- ARISTOCRAT_MK5_BIOS
+ ARISTOCRAT_MK5_USA_SETCHIPS
+ ARISTOCRAT_MK5_GALS
+ ARISTOCRAT_MK5_EEPROM
// checksum code not found due to ROMs being corrupted, all files except U10 are missing bytes consisting of 0x0D
ROM_REGION( 0x400000, "game_prg", ROMREGION_ERASEFF )
ROM_LOAD32_WORD( "ahg1629.u7", 0x000000, 0x7efa7, BAD_DUMP CRC(8e5b5354) SHA1(519c5af995d75c3035c0a3832956d94a989163de) )
@@ -5407,7 +5544,9 @@ ROM_END
// BHG1465 / MV4108/5 / 5,10,25,50 Credit Multiplier / 20 Line Multiline
// Mountain Money / Export / A - 10/03/01
ROM_START( mountmonu )
- ARISTOCRAT_MK5_BIOS
+ ARISTOCRAT_MK5_USA_SETCHIPS
+ ARISTOCRAT_MK5_GALS
+ ARISTOCRAT_MK5_EEPROM
// checksum code not found due to ROMs being corrupted, first 6 files are missing bytes consisting of 0x0D
ROM_REGION( 0x400000, "game_prg", ROMREGION_ERASEFF )
ROM_LOAD32_WORD( "bhg1465.u7", 0x000000, 0x7f026, BAD_DUMP CRC(9a176a6b) SHA1(a86213020f6cf0c99271ae4e5768453578ade4c3) )
@@ -5430,7 +5569,9 @@ ROM_END
// Requires set chip version: 4.04.xx
// Variation (% and NO):
ROM_START( mountmonua )
- ARISTOCRAT_MK5_BIOS
+ ARISTOCRAT_MK5_USA_SETCHIPS
+ ARISTOCRAT_MK5_GALS
+ ARISTOCRAT_MK5_EEPROM
/*
Checksum code found at 0x000d18
0x000000-0x0e8e57 is the Checksummed Range (excluding 0x000020-0x000027 where Checksum is stored)
@@ -5457,7 +5598,8 @@ ROM_END
// 0200956V / 386/64 / 200 Credits per Draw / 3 Draws(1 cent) / 2 Credits per Draw / 3 Draws ($1.00)
// MULTIDRAW - FREE GAMES / NSW/ACT / E - 08/05/00
ROM_START( multidrw )
- ARISTOCRAT_MK5_BIOS
+ ARISTOCRAT_MK5_GALS
+ ARISTOCRAT_MK5_EEPROM
/*
Checksum code found at 0x000b98
0x000000-0x07477f is the Checksummed Range (excluding 0x000020-0x000027 where Checksum is stored)
@@ -5483,7 +5625,8 @@ ROM_END
// 0100275V / 595/1 / 5 Credit Multiplier/20 Line Multiline
// Mystic Garden / Local / B - 11/06/96
ROM_START( mystgard )
- ARISTOCRAT_MK5_BIOS
+ ARISTOCRAT_MK5_GALS
+ ARISTOCRAT_MK5_EEPROM
/*
Checksum code found at 0x000ae4
0x000000-0x04eea7 is the Checksummed Range (excluding 0x000020-0x000027 where Checksum is stored)
@@ -5504,7 +5647,8 @@ ROM_END
// 0101503V / MV4141 / 6 Credit Multiplier/20 Line Multiline
// One For All / New Zealand / A- 28/05/01
ROM_START( one4all )
- ARISTOCRAT_MK5_BIOS
+ ARISTOCRAT_MK5_GALS
+ ARISTOCRAT_MK5_EEPROM
// checksum code not found (uses different startup sequence)
ROM_REGION( 0x400000, "game_prg", ROMREGION_ERASEFF )
ROM_LOAD32_WORD( "0101503v.u7", 0x000000, 0x80000, CRC(edf50554) SHA1(302737220c4b7d60db77074429d6f360c55494a6) )
@@ -5524,7 +5668,8 @@ ROM_END
// Orchid Mist 500cm / Local / C - 03/02/99
// ROM says '10 Credit Multiplier' but game has a 50 credit multiplier
ROM_START( orchidms )
- ARISTOCRAT_MK5_BIOS
+ ARISTOCRAT_MK5_GALS
+ ARISTOCRAT_MK5_EEPROM
/*
Checksum code found at 0x000b20
0x000000-0x0677c7 is the Checksummed Range (excluding 0x000020-0x000027 where Checksum is stored)
@@ -5550,7 +5695,8 @@ ROM_END
// Same strings as orchidms but earlier version
// ROM says '10 Credit Multiplier' but game has a 50 credit multiplier
ROM_START( orchidmsa )
- ARISTOCRAT_MK5_BIOS
+ ARISTOCRAT_MK5_GALS
+ ARISTOCRAT_MK5_EEPROM
/*
Checksum code found at 0x000b08
0x000000-0x05f753 is the Checksummed Range (excluding 0x000020-0x000027 where Checksum is stored)
@@ -5574,7 +5720,8 @@ ROM_END
// 0101241V / MV4118 / 25 Credit Multiplier/10 Line Multiline
// Orchid Mist / New Zealand / A- 3/7/00
ROM_START( orchidmsnz )
- ARISTOCRAT_MK5_BIOS
+ ARISTOCRAT_MK5_GALS
+ ARISTOCRAT_MK5_EEPROM
// checksum code not found (uses different startup sequence)
ROM_REGION( 0x400000, "game_prg", ROMREGION_ERASEFF )
ROM_LOAD32_WORD( "0101241v.u7", 0x000000, 0x80000, CRC(e4183d54) SHA1(c5829448450dff212e76b5571fc1bf0ba681afdf) )
@@ -5591,7 +5738,8 @@ ROM_END
// 0200348V / 593/2 / 10 Credit Multiplier / 9 Line Multiline
// Oscar / Local / C - 20/09/96
ROM_START( oscara5 )
- ARISTOCRAT_MK5_BIOS
+ ARISTOCRAT_MK5_GALS
+ ARISTOCRAT_MK5_EEPROM
/*
Checksum code found at 0x000b80
0x000000-0x05d187 is the Checksummed Range (excluding 0x000020-0x000027 where Checksum is stored)
@@ -5613,7 +5761,8 @@ ROM_END
// Oscar / Local / C - 20/09/96
// Same strings as oscara5 but earlier version
ROM_START( oscara5a )
- ARISTOCRAT_MK5_BIOS
+ ARISTOCRAT_MK5_GALS
+ ARISTOCRAT_MK5_EEPROM
/*
Checksum code found at 0x000b80
0x000000-0x054093 is the Checksummed Range (excluding 0x000020-0x000027 where Checksum is stored)
@@ -5637,7 +5786,8 @@ ROM_END
// 0101046V / 594/7 / 10 Credit Multiplier/9 && 20 Line Multiline
// Panther Magic / NSW/ACT / A - 06/10/99
ROM_START( pantmag )
- ARISTOCRAT_MK5_BIOS
+ ARISTOCRAT_MK5_GALS
+ ARISTOCRAT_MK5_EEPROM
/*
Checksum code found at 0x000d18
0x000000-0x06d1ff is the Checksummed Range (excluding 0x000020-0x000027 where Checksum is stored)
@@ -5661,7 +5811,8 @@ ROM_END
// 0100716V / 594/4 / 2 Credit Multiplier/5 Line Multiline
// Panther Magic / Local / A - 13/05/98
ROM_START( pantmaga )
- ARISTOCRAT_MK5_BIOS
+ ARISTOCRAT_MK5_GALS
+ ARISTOCRAT_MK5_EEPROM
/*
Checksum code found at 0x000c00
0x000000-0x0583f7 is the Checksummed Range (excluding 0x000020-0x000027 where Checksum is stored)
@@ -5689,7 +5840,8 @@ ROM_END
// Requires set chips 4.04.xx
// Touchscreen game
ROM_START( partygrs )
- ARISTOCRAT_MK5_BIOS_HAVE_EEPROMS
+ ARISTOCRAT_MK5_USA_SETCHIPS
+ ARISTOCRAT_MK5_GALS
/*
Checksum code found at 0x000d18
0x000000-0x0e9b47 is the Checksummed Range (excluding 0x000020-0x000027 where Checksum is stored)
@@ -5727,7 +5879,9 @@ ROM_END
// Requires set chips 4.01.xx
// Touchscreen game
ROM_START( partygrsa )
- ARISTOCRAT_MK5_BIOS
+ ARISTOCRAT_MK5_USA_SETCHIPS
+ ARISTOCRAT_MK5_GALS
+ ARISTOCRAT_MK5_EEPROM
/*
Checksum code found at 0x000d18
0x000000-0x0a69d3 is the Checksummed Range (excluding 0x000020-0x000027 where Checksum is stored)
@@ -5752,7 +5906,9 @@ ROM_END
// Party Gras / Export / A - 10/11/2001
// Touchscreen game
ROM_START( partygrsb )
- ARISTOCRAT_MK5_BIOS
+ ARISTOCRAT_MK5_USA_SETCHIPS
+ ARISTOCRAT_MK5_GALS
+ ARISTOCRAT_MK5_EEPROM
// checksum code not found due to ROMs being corrupted, all files are missing bytes consisting of 0x0D
ROM_REGION( 0x400000, "game_prg", ROMREGION_ERASEFF )
ROM_LOAD32_WORD( "ahg1568.u7", 0x000000, 0x7efb7, BAD_DUMP CRC(69ab6487) SHA1(d7147f78dc098d142e857687e6cbdb8a8762371a) )
@@ -5769,7 +5925,8 @@ ROM_END
// 02J00011 / JB001 / 25 Credit Multiplier / 20 Line Multiline
// Peacock Flutter / NSW/ACT / A - 10/03/00
ROM_START( peaflut )
- ARISTOCRAT_MK5_BIOS
+ ARISTOCRAT_MK5_GALS
+ ARISTOCRAT_MK5_EEPROM
/*
Checksum code found at 0x000b98
0x000000-0x0638d3 is the Checksummed Range (excluding 0x000020-0x000027 where Checksum is stored)
@@ -5793,7 +5950,8 @@ ROM_END
// 0200460V / 586/4(a) / 5 Credit Multiplier / 20 Line Multiline
// Penguin Pays 100cm / NSW/ACT / D - 03/06/97
ROM_START( pengpay )
- ARISTOCRAT_MK5_BIOS
+ ARISTOCRAT_MK5_GALS
+ ARISTOCRAT_MK5_EEPROM
/*
Checksum code found at 0x000b68
0x000000-0x05c71f is the Checksummed Range (excluding 0x000020-0x000027 where Checksum is stored)
@@ -5817,7 +5975,8 @@ ROM_END
// 0200357V / 586/4 / 5 Credit Multiplier / 20 Line Multiline
// Penguin Pays 100cm / NSW/ACT / C - 12/11/96
ROM_START( pengpaya )
- ARISTOCRAT_MK5_BIOS
+ ARISTOCRAT_MK5_GALS
+ ARISTOCRAT_MK5_EEPROM
/*
Checksum code found at 0x000b60
0x000000-0x05644f is the Checksummed Range (excluding 0x000020-0x000027 where Checksum is stored)
@@ -5842,7 +6001,8 @@ ROM_END
// Penguin Pays 90cm / NSW/ACT / D - 03/06/97
// ROM says '100 Credit Multiplier' but game has a 10 credit multiplier
ROM_START( pengpayb )
- ARISTOCRAT_MK5_BIOS
+ ARISTOCRAT_MK5_GALS
+ ARISTOCRAT_MK5_EEPROM
/*
Checksum code found at 0x000b68
0x000000-0x05d7b7 is the Checksummed Range (excluding 0x000020-0x000027 where Checksum is stored)
@@ -5866,7 +6026,8 @@ ROM_END
// 0200113V / 586 / 20 Credit Multiplier/9 Line Multiline
// Penguin Pays / Local / A - 12/10/95
ROM_START( pengpayc )
- ARISTOCRAT_MK5_BIOS
+ ARISTOCRAT_MK5_GALS
+ ARISTOCRAT_MK5_EEPROM
/*
Checksum code found at 0x000adc
0x000000-0x0537d7 is the Checksummed Range (excluding 0x000020-0x000027 where Checksum is stored)
@@ -5890,7 +6051,8 @@ ROM_END
// 0300113V / 586 / 20 Credit Multiplier/9 Line Multiline
// Penguin Pays 180cm / NSW/ACT / A - 12/10/95
ROM_START( pengpayd )
- ARISTOCRAT_MK5_BIOS
+ ARISTOCRAT_MK5_GALS
+ ARISTOCRAT_MK5_EEPROM
// checksum code not found due to ROMs being corrupted, all files are missing bytes consisting of 0x0D
ROM_REGION( 0x400000, "game_prg", ROMREGION_ERASEFF )
ROM_LOAD32_WORD( "0300113v.u7", 0x000000, 0x7f909, BAD_DUMP CRC(30c6c635) SHA1(9a31f99c8a7fb0a909b101b2c5767f39930934e9) )
@@ -5910,7 +6072,8 @@ ROM_END
// marked as 92.130%
// No set chips required
ROM_START( pengpayu )
- ARISTOCRAT_MK5_BIOS_HAVE_EEPROMS
+ ARISTOCRAT_MK5_USA_SETCHIPS
+ ARISTOCRAT_MK5_GALS
/*
Checksum code found at 0x000d08
0x000000-0x0cd21b is the Checksummed Range (excluding 0x000020-0x000027 where Checksum is stored)
@@ -5949,7 +6112,8 @@ ROM_END
// marked as 92.130%
// No set chips required
ROM_START( pengpayua )
- ARISTOCRAT_MK5_BIOS_HAVE_EEPROMS
+ ARISTOCRAT_MK5_USA_SETCHIPS
+ ARISTOCRAT_MK5_GALS
/*
Checksum code found at 0x000d08
0x000000-0x0a898f is the Checksummed Range (excluding 0x000020-0x000027 where Checksum is stored)
@@ -5976,7 +6140,8 @@ ROM_END
// marked as 90.45%
// No set chips required
ROM_START( pengpayub )
- ARISTOCRAT_MK5_BIOS_HAVE_EEPROMS
+ ARISTOCRAT_MK5_USA_SETCHIPS
+ ARISTOCRAT_MK5_GALS
/*
Checksum code found at 0x000d08
0x000000-0x0a898f is the Checksummed Range (excluding 0x000020-0x000027 where Checksum is stored)
@@ -6004,7 +6169,9 @@ ROM_END
// Cash Express Hyperlink game, but can also run standalone without progressive jackpot
// Requires set chips 4.04.xx
ROM_START( pengpayce )
- ARISTOCRAT_MK5_BIOS
+ ARISTOCRAT_MK5_USA_SETCHIPS
+ ARISTOCRAT_MK5_GALS
+ ARISTOCRAT_MK5_EEPROM
/*
Checksum code found at 0x000d18
0x000000-0x0f368f is the Checksummed Range (excluding 0x000020-0x000027 where Checksum is stored)
@@ -6033,7 +6200,9 @@ ROM_END
// Penguin Pucks Hyperlink game, but can also run standalone without progressive jackpot
// Requires set chips 4.03.xx
ROM_START( pengpuck )
- ARISTOCRAT_MK5_BIOS
+ ARISTOCRAT_MK5_USA_SETCHIPS
+ ARISTOCRAT_MK5_GALS
+ ARISTOCRAT_MK5_EEPROM
/*
Checksum code found at 0x000d18
0x000000-0x0f29ef is the Checksummed Range (excluding 0x000020-0x000027 where Checksum is stored)
@@ -6060,7 +6229,8 @@ ROM_END
// 0100674V / 619/1 / 10 Credit Multiplier/20 Line Multiline
// Penguin Pirate 200cm / NSW/ACT / A - 31/03/98
ROM_START( penpir )
- ARISTOCRAT_MK5_BIOS
+ ARISTOCRAT_MK5_GALS
+ ARISTOCRAT_MK5_EEPROM
/*
Checksum code found at 0x000b68
0x000000-0x05d27b is the Checksummed Range (excluding 0x000020-0x000027 where Checksum is stored)
@@ -6084,7 +6254,8 @@ ROM_END
// 0200578V / 619 / 10 Credit Multiplier/9 Line Multiline
// Penguin Pirate 90cm / NSW/ACT / C - 27/02/98
ROM_START( penpira )
- ARISTOCRAT_MK5_BIOS
+ ARISTOCRAT_MK5_GALS
+ ARISTOCRAT_MK5_EEPROM
/*
Checksum code found at 0x000b68
0x000000-0x05feeb is the Checksummed Range (excluding 0x000020-0x000027 where Checksum is stored)
@@ -6110,7 +6281,8 @@ ROM_END
// ROM says 'Penguin Pirate 2', artwork says 'Penguin Pirate II'
// Original casino BIOS is not dumped, using New Zealand 0700474V BIOS until an Australian version is dumped
ROM_START( penpir2 )
- ARISTOCRAT_MK5_BIOS
+ ARISTOCRAT_MK5_GALS
+ ARISTOCRAT_MK5_EEPROM
/*
note, this actually contains a 2nd checksum for the game, this is the base/bios check only.
@@ -6140,7 +6312,8 @@ ROM_END
// 0100731V / 618/1 / 10 Credit Multiplier / 20 Line Multiline
// Pet Shop / Local / A - 17/04/98
ROM_START( petshop )
- ARISTOCRAT_MK5_BIOS
+ ARISTOCRAT_MK5_GALS
+ ARISTOCRAT_MK5_EEPROM
/*
Checksum code found at 0x000b88
0x000000-0x05f127 is the Checksummed Range (excluding 0x000020-0x000027 where Checksum is stored)
@@ -6163,7 +6336,8 @@ ROM_END
// 0100679V / 618 / 10 Credit Multiplier / 9 Line Multiline
// Pet Shop / Local / A - 09/03/98
ROM_START( petshopa )
- ARISTOCRAT_MK5_BIOS
+ ARISTOCRAT_MK5_GALS
+ ARISTOCRAT_MK5_EEPROM
// checksum code not found due to bad ROMs, all 4 ROMs have stuck bits (0x20)
ROM_REGION( 0x400000, "game_prg", ROMREGION_ERASEFF )
ROM_LOAD32_WORD( "0100679v.u7", 0x000000, 0x80000, BAD_DUMP CRC(cf4a24fa) SHA1(b510de9199d16ba7319e1b692d7c6c09fcb735dc) )
@@ -6180,7 +6354,8 @@ ROM_END
// 0500005V / 570/1 / 10 Credit Multiplier/9 Line Multiline
// Phantom Pays / Local / E - 12/09/95
ROM_START( phantpay )
- ARISTOCRAT_MK5_BIOS
+ ARISTOCRAT_MK5_GALS
+ ARISTOCRAT_MK5_EEPROM
/*
Checksum code found at 0x000adc
0x000000-0x044713 is the Checksummed Range (excluding 0x000020-0x000027 where Checksum is stored)
@@ -6204,7 +6379,8 @@ ROM_END
// 0100299V / 578/4 / 3 Credit Multiplier/3 Line Multiline
// Prize Fight / Local / B - 08/08/96
ROM_START( przfight )
- ARISTOCRAT_MK5_BIOS
+ ARISTOCRAT_MK5_GALS
+ ARISTOCRAT_MK5_EEPROM
/*
Checksum code found at 0x000b48
0x000000-0x053def is the Checksummed Range (excluding 0x000020-0x000027 where Checksum is stored)
@@ -6230,7 +6406,8 @@ ROM_END
// 0100706V / 603/6 / 10 Credit Multiplier / 20 Line Multiline
// Queens of Cash / NSW/ACT / C - 23/07/98
ROM_START( qcash )
- ARISTOCRAT_MK5_BIOS
+ ARISTOCRAT_MK5_GALS
+ ARISTOCRAT_MK5_EEPROM
/*
Checksum code found at 0x000af4
0x000000-0x05d55b is the Checksummed Range (excluding 0x000020-0x000027 where Checksum is stored)
@@ -6255,7 +6432,8 @@ ROM_END
// QUEEN OF THE NILE / NSW/ACT / B - 13/05/97
// EPROM labels have "Golden Pyramid 500" (no trailing 's') and 2001 for the year
ROM_START( qnile )
- ARISTOCRAT_MK5_BIOS
+ ARISTOCRAT_MK5_GALS
+ ARISTOCRAT_MK5_EEPROM
/*
Checksum code found at 0x000b80
0x000000-0x062913 is the Checksummed Range (excluding 0x000020-0x000027 where Checksum is stored)
@@ -6280,7 +6458,8 @@ ROM_END
// QUEEN OF THE NILE / NSW/ACT / B - 13/05/97
// Same strings as qnile but earlier version
ROM_START( qnilea )
- ARISTOCRAT_MK5_BIOS
+ ARISTOCRAT_MK5_GALS
+ ARISTOCRAT_MK5_EEPROM
/*
Checksum code found at 0x000b80
0x000000-0x059dff is the Checksummed Range (excluding 0x000020-0x000027 where Checksum is stored)
@@ -6305,7 +6484,8 @@ ROM_END
// QUEEN OF THE NILE / NSW/ACT / B - 13/05/97
// Same strings as qnile and qnilea but earlier version
ROM_START( qnileb )
- ARISTOCRAT_MK5_BIOS
+ ARISTOCRAT_MK5_GALS
+ ARISTOCRAT_MK5_EEPROM
/*
Checksum code found at 0x000b80
0x000000-0x055c83 is the Checksummed Range (excluding 0x000020-0x000027 where Checksum is stored)
@@ -6332,7 +6512,8 @@ ROM_END
// 3 = Nine, 4 = Ten, 5 = Jack, 6 = Queen, 7 = King, 8 = Ace
// Game and BIOS are in Portuguese
ROM_START( qnilebr )
- ARISTOCRAT_MK5_BIOS
+ ARISTOCRAT_MK5_GALS
+ ARISTOCRAT_MK5_EEPROM
/*
note, this actually contains a 2nd checksum for the game, this is the base/bios check only.
@@ -6362,7 +6543,8 @@ ROM_END
// 0300440V / 602/3 / 20 Credit Multiplier / 9 Line Multiline
// QUEEN OF THE NILE / NSW/ACT / B - 13/05/97
ROM_START( qnilec )
- ARISTOCRAT_MK5_BIOS
+ ARISTOCRAT_MK5_GALS
+ ARISTOCRAT_MK5_EEPROM
/*
Checksum code found at 0x000b80
0x000000-0x064c4b is the Checksummed Range (excluding 0x000020-0x000027 where Checksum is stored)
@@ -6388,7 +6570,9 @@ ROM_END
// Cash Express Hyperlink game, but can also run standalone without progressive jackpot
// Requires set chips 4.04.xx
ROM_START( qnilece )
- ARISTOCRAT_MK5_BIOS
+ ARISTOCRAT_MK5_USA_SETCHIPS
+ ARISTOCRAT_MK5_GALS
+ ARISTOCRAT_MK5_EEPROM
/*
Checksum code found at 0x000d18
0x000000-0x0f2453 is the Checksummed Range (excluding 0x000020-0x000027 where Checksum is stored)
@@ -6418,7 +6602,9 @@ ROM_END
// Cash Express Hyperlink game, but can also run standalone without progressive jackpot
// Requires set chips 4.04.xx
ROM_START( qnilecea )
- ARISTOCRAT_MK5_BIOS
+ ARISTOCRAT_MK5_USA_SETCHIPS
+ ARISTOCRAT_MK5_GALS
+ ARISTOCRAT_MK5_EEPROM
/*
Checksum code found at 0x000d18
0x000000-0x0ee84f is the Checksummed Range (excluding 0x000020-0x000027 where Checksum is stored)
@@ -6449,7 +6635,9 @@ ROM_END
// Cash Express Hyperlink game, but can also run standalone without progressive jackpot
// Requires set chips 4.04.xx
ROM_START( qnileceb )
- ARISTOCRAT_MK5_BIOS
+ ARISTOCRAT_MK5_USA_SETCHIPS
+ ARISTOCRAT_MK5_GALS
+ ARISTOCRAT_MK5_EEPROM
/*
Checksum code found at 0x000d18
0x000000-0x0f237f is the Checksummed Range (excluding 0x000020-0x000027 where Checksum is stored)
@@ -6476,7 +6664,8 @@ ROM_END
// 0101139V / 602/16 / 3 Credit Multiplier / 3 Line Multiline
// QUEEN OF THE NILE / NSW/ACT / A - 11/10/99
ROM_START( qniled )
- ARISTOCRAT_MK5_BIOS
+ ARISTOCRAT_MK5_GALS
+ ARISTOCRAT_MK5_EEPROM
/*
Checksum code found at 0x000b78
0x000000-0x068183 is the Checksummed Range (excluding 0x000020-0x000027 where Checksum is stored)
@@ -6499,11 +6688,39 @@ ROM_START( qniled )
ROM_END
+// 0101670V / 602/4 / 25, 50 Credit / 20 Line Multiline
+// Queen Of The Nile - Fast Lane / Qld QCOM / E - 17/08/01
+// Fast Lane Hyperlink game
+ROM_START( qnilefl )
+ ARISTOCRAT_MK5_GALS
+ ARISTOCRAT_MK5_EEPROM
+ /*
+ Checksum code found at 0x000ad0
+ 0x000000-0x086cbb is the Checksummed Range (excluding 0x000020-0x000027 where Checksum is stored)
+ Expected Checksum 0x3297c26b
+ Calculated Checksum 0x3297c26b (OK)
+ 0x086cbc-0x2aecd3 is the non-Checksummed range (unusual endpoint)
+ */
+ ROM_REGION( 0x400000, "game_prg", ROMREGION_ERASEFF )
+ ROM_LOAD32_WORD( "0101670v.u7", 0x000000, 0x80000, CRC(71817007) SHA1(90cd928894044b629e03aa2c1d533eb6aed4c7af) )
+ ROM_LOAD32_WORD( "0101670v.u11", 0x000002, 0x80000, CRC(53006d14) SHA1(00d99e74433023d007f6a401d0081decb36a32dc) )
+ ROM_LOAD32_WORD( "0101670v.u8", 0x100000, 0x80000, CRC(ffd13e39) SHA1(d0fd0efc968fc4c8c81b0824eb9773462b88acb4) )
+ ROM_LOAD32_WORD( "0101670v.u12", 0x100002, 0x80000, CRC(d918d776) SHA1(aa3729d712a43b777d648c840b3e3de21d76ab50) )
+ ROM_LOAD32_WORD( "0101670v.u9", 0x200000, 0x80000, CRC(d8c46bd8) SHA1(ae9427f668fe109573915ca0408450137f75ade0) )
+ ROM_LOAD32_WORD( "0101670v.u13", 0x200002, 0x80000, CRC(715e7789) SHA1(b734aa88e7e65fba988e7fffd711039c4f554b2c) )
+
+ ROM_REGION( 0x800000, "maincpu", ROMREGION_ERASE00 ) /* ARM Code */
+ ROM_REGION( 0x200000, "vram", ROMREGION_ERASE00 )
+ ROM_REGION( 0x20000*4, "sram", ROMREGION_ERASE00 )
+ROM_END
+
+
// 0401072V / 602/4 / 25 Credit Multiplier / 20 Line Multiline
// QUEEN OF THE NILE / NSW/ACT / D - 18/06/99
// Maximillions Hyperlink game
ROM_START( qnilemax )
- ARISTOCRAT_MK5_BIOS
+ ARISTOCRAT_MK5_GALS
+ ARISTOCRAT_MK5_EEPROM
/*
Checksum code found at 0x000bb8
0x000000-0x06fd6f is the Checksummed Range (excluding 0x000020-0x000027 where Checksum is stored)
@@ -6530,7 +6747,8 @@ ROM_END
// 0301059V / 602/5 / 10 Credit Multiplier / 9 Line Multiline
// QUEEN OF THE NILE / HOLLAND / G - 10/04/00
ROM_START( qnilenl )
- ARISTOCRAT_MK5_BIOS
+ ARISTOCRAT_MK5_GALS
+ ARISTOCRAT_MK5_EEPROM
/*
Checksum code found at 0x00104c
0x000000-0x05d1cb is the Checksummed Range (excluding 0x000020-0x000027 where Checksum is stored)
@@ -6555,7 +6773,8 @@ ROM_END
// Queen of the nile / New Zealand / A- 31/8/98
// ROM has "nile" in lowercase
ROM_START( qnilenz )
- ARISTOCRAT_MK5_BIOS
+ ARISTOCRAT_MK5_GALS
+ ARISTOCRAT_MK5_EEPROM
// checksum code not found (uses different startup sequence)
ROM_REGION( 0x400000, "game_prg", ROMREGION_ERASEFF )
ROM_LOAD32_WORD( "0300785v.u7", 0x000000, 0x80000, CRC(c327d801) SHA1(4721d87a7a759bd437d0d93dc6c415e7a8e60ea5) )
@@ -6571,13 +6790,39 @@ ROM_START( qnilenz )
ROM_END
+// 0201200V / 602/4 / 25 Credit Multiplier / 20 Line Multiline
+// Queen Of The Nile / Qld QCOM / D - 18/06/99
+ROM_START( qnileql )
+ ARISTOCRAT_MK5_GALS
+ ARISTOCRAT_MK5_EEPROM
+ /*
+ Checksum code found at 0x000ad0
+ 0x000000-0x0807ff is the Checksummed Range (excluding 0x000020-0x000027 where Checksum is stored)
+ Expected Checksum 0x36105c3f
+ Calculated Checksum 0x36105c3f (OK)
+ 0x080800-0x1aa743 is the non-Checksummed range still containing data but NOT covered by Checksum
+ 0x080800-0x1fffff is the non-Checksummed range if the additional vectors? at the end are included
+ */
+ ROM_REGION( 0x400000, "game_prg", ROMREGION_ERASEFF )
+ ROM_LOAD32_WORD( "0201200v.u7", 0x000000, 0x80000, CRC(093b575c) SHA1(3139e1f1e94f752e2162af8064ab7d62f0b15b07) )
+ ROM_LOAD32_WORD( "0201200v.u11", 0x000002, 0x80000, CRC(2a356826) SHA1(4c9ae643570fceff7138e1a7bb780de9eaa272b0) )
+ ROM_LOAD32_WORD( "0201200v.u8", 0x100000, 0x80000, CRC(8b3dd4cb) SHA1(b57494001bfd6a7b933214b62f5c93cb8c21fdca) )
+ ROM_LOAD32_WORD( "0201200v.u12", 0x100002, 0x80000, CRC(38332f4e) SHA1(53c90103df06e5a28bbaf32504a0984b7c65bec7) )
+
+ ROM_REGION( 0x800000, "maincpu", ROMREGION_ERASE00 ) /* ARM Code */
+ ROM_REGION( 0x200000, "vram", ROMREGION_ERASE00 )
+ ROM_REGION( 0x20000*4, "sram", ROMREGION_ERASE00 )
+ROM_END
+
+
// GHG4091-02 / MV4091 / 10 Credit Multiplier / 9 Line Multiline
// QUEEN OF THE NILE / NSW/ACT / B - 13/05/97
// All devices are 27c4002 instead of 27c4096
// ROM contains unaltered NSW/ACT region string and date, but game is for the US platform
// No set chips required
ROM_START( qnileu )
- ARISTOCRAT_MK5_BIOS_HAVE_EEPROMS
+ ARISTOCRAT_MK5_USA_SETCHIPS
+ ARISTOCRAT_MK5_GALS
/*
Checksum code found at 0x000d08
0x000000-0x08ec87 is the Checksummed Range (excluding 0x000020-0x000027 where Checksum is stored)
@@ -6618,7 +6863,9 @@ ROM_END
// Note: The game has GHG4090-03 in the stickers, but the strings inside are GHG4091-03 instead. Also the base is GHG4091.
// No set chips required
ROM_START( qnileua )
- ARISTOCRAT_MK5_BIOS
+ ARISTOCRAT_MK5_USA_SETCHIPS
+ ARISTOCRAT_MK5_GALS
+ ARISTOCRAT_MK5_EEPROM
/*
Checksum code found at 0x000d08
0x000000-0x08ec87 is the Checksummed Range (excluding 0x000020-0x000027 where Checksum is stored)
@@ -6644,7 +6891,8 @@ ROM_END
// ROM contains unaltered NSW/ACT region string and date, but game is for the Venezuelan market
// Game is in Spanish, however audit mode is in English
ROM_START( qnilev )
- ARISTOCRAT_MK5_BIOS
+ ARISTOCRAT_MK5_GALS
+ ARISTOCRAT_MK5_EEPROM
/*
Checksum code found at 0x000b80
0x000000-0x081a0b is the Checksummed Range (excluding 0x000020-0x000027 where Checksum is stored)
@@ -6668,7 +6916,8 @@ ROM_END
// 0500009V / 581 / 5 Credit Multiplier/9 Line Multiline
// Q.T. Bird / Local / A - 27/10/94
ROM_START( qtbird )
- ARISTOCRAT_MK5_BIOS
+ ARISTOCRAT_MK5_GALS
+ ARISTOCRAT_MK5_EEPROM
/*
Checksum code found at 0x000ae0
0x000000-0x0454af is the Checksummed Range (excluding 0x000020-0x000027 where Checksum is stored)
@@ -6693,7 +6942,8 @@ ROM_END
// Rainbow Warriors / NSW/ACT / B - 02/03/00
// Cash Express Hyperlink game
ROM_START( rainwrce )
- ARISTOCRAT_MK5_BIOS
+ ARISTOCRAT_MK5_GALS
+ ARISTOCRAT_MK5_EEPROM
/*
Checksum code found at 0x000bf8
0x000000-0x06bb13 is the Checksummed Range (excluding 0x000020-0x000027 where Checksum is stored)
@@ -6721,7 +6971,8 @@ ROM_END
// 0100400V / 598/2 / 20 Credit Multiplier / 25 Credit Multiway
// Reel Power / Local / A - 01/11/96
ROM_START( reelpwr )
- ARISTOCRAT_MK5_BIOS
+ ARISTOCRAT_MK5_GALS
+ ARISTOCRAT_MK5_EEPROM
/*
Checksum code found at 0x000b80
0x000000-0x059d1b is the Checksummed Range (excluding 0x000020-0x000027 where Checksum is stored)
@@ -6746,7 +6997,8 @@ ROM_END
// Reelin'n Rockin / Local / A - 13/07/98
// ROM says 'Reelin'n Rockin', artwork says 'Reelin-n-Rockin'
ROM_START( reelrock )
- ARISTOCRAT_MK5_BIOS
+ ARISTOCRAT_MK5_GALS
+ ARISTOCRAT_MK5_EEPROM
/*
Checksum code found at 0x000ba8
0x000000-0x062f6f is the Checksummed Range (excluding 0x000020-0x000027 where Checksum is stored)
@@ -6767,10 +7019,38 @@ ROM_START( reelrock )
ROM_END
+// 0101460V / 628/2 / 10, 25 & 50 Credit Multiplier / 20 Line Multiline
+// Reelin 'n Rockin / QLD / E - 20/12/00
+// ROM says 'Reelin 'n Rockin', artwork says 'Reelin-n-Rockin'
+ROM_START( reelrockql )
+ ARISTOCRAT_MK5_GALS
+ ARISTOCRAT_MK5_EEPROM
+ /*
+ Checksum code found at 0x000ad0
+ 0x000000-0x08737b is the Checksummed Range (excluding 0x000020-0x000027 where Checksum is stored)
+ Expected Checksum 0x962948fb
+ Calculated Checksum 0x962948fb (OK)
+ 0x08737c-0x2b2beb is the non-Checksummed range (unusual endpoint)
+ */
+ ROM_REGION( 0x400000, "game_prg", ROMREGION_ERASEFF )
+ ROM_LOAD32_WORD( "0101460v.u7", 0x000000, 0x80000, CRC(6781085a) SHA1(8fbd8cddada944ca3fd633bdc3b5dc3c0a14736d) )
+ ROM_LOAD32_WORD( "0101460v.u11", 0x000002, 0x80000, CRC(43525988) SHA1(705c0114300ea099c7eb96c5035233753534d28d) )
+ ROM_LOAD32_WORD( "0101460v.u8", 0x100000, 0x80000, CRC(21767926) SHA1(cbfc3304aab6ef4988652071b263a814804f5f6b) )
+ ROM_LOAD32_WORD( "0101460v.u12", 0x100002, 0x80000, NO_DUMP )
+ ROM_LOAD32_WORD( "0101460v.u9", 0x200000, 0x80000, CRC(324f6fd8) SHA1(c6d689447eb15a57046bcdecc5dbd67b716112f5) )
+ ROM_LOAD32_WORD( "0101460v.u13", 0x200002, 0x80000, NO_DUMP )
+
+ ROM_REGION( 0x800000, "maincpu", ROMREGION_ERASE00 ) /* ARM Code */
+ ROM_REGION( 0x200000, "vram", ROMREGION_ERASE00 )
+ ROM_REGION( 0x20000*4, "sram", ROMREGION_ERASE00 )
+ROM_END
+
+
// 0400549V / 608 / 3 Credit Multiplier/3 Line Multiline
// Return of the Samurai / Local / A - 17/04/97
ROM_START( retrsam )
- ARISTOCRAT_MK5_BIOS
+ ARISTOCRAT_MK5_GALS
+ ARISTOCRAT_MK5_EEPROM
/*
Checksum code found at 0x000b88
0x000000-0x06445b is the Checksummed Range (excluding 0x000020-0x000027 where Checksum is stored)
@@ -6795,7 +7075,8 @@ ROM_END
// Return of the Samurai / Local / A - 17/04/97
// Same strings as retrsam but earlier version
ROM_START( retrsama )
- ARISTOCRAT_MK5_BIOS
+ ARISTOCRAT_MK5_GALS
+ ARISTOCRAT_MK5_EEPROM
/*
Checksum code found at 0x000b88
0x000000-0x0590b7 is the Checksummed Range (excluding 0x000020-0x000027 where Checksum is stored)
@@ -6816,7 +7097,8 @@ ROM_END
// 0200506V / 608/1 / 10 Credit Multiplier/9 Line Multiline
// Return of the Samurai / Local / A - 28/04/97
ROM_START( retrsamb )
- ARISTOCRAT_MK5_BIOS
+ ARISTOCRAT_MK5_GALS
+ ARISTOCRAT_MK5_EEPROM
/*
Checksum code found at 0x000b88
0x000000-0x05889b is the Checksummed Range (excluding 0x000020-0x000027 where Checksum is stored)
@@ -6838,7 +7120,8 @@ ROM_END
// Rushin Rooster / Local / C - 25/06/97
// ROM says '10 Credit Multiplier' but game has a 5 credit multiplier
ROM_START( rushrst )
- ARISTOCRAT_MK5_BIOS
+ ARISTOCRAT_MK5_GALS
+ ARISTOCRAT_MK5_EEPROM
/*
Checksum code found at 0x000b68
0x000000-0x05a0c3 is the Checksummed Range (excluding 0x000020-0x000027 where Checksum is stored)
@@ -6864,7 +7147,8 @@ ROM_END
// SUPER BUCKS II / NSW/ACT / G 26/07/99
// Sound data is damaged due to bad u8 ROM
ROM_START( sbuk2 )
- ARISTOCRAT_MK5_BIOS
+ ARISTOCRAT_MK5_GALS
+ ARISTOCRAT_MK5_EEPROM
/*
Checksum code found at 0x000b98
0x000000-0x06ab7f is the Checksummed Range (excluding 0x000020-0x000027 where Checksum is stored)
@@ -6889,7 +7173,8 @@ ROM_END
// No combination data due to missing u11 ROM
// This version had Superman-style reel symbols, whereas sbuk2 has similar graphics to Super Bucks III
ROM_START( sbuk2a )
- ARISTOCRAT_MK5_BIOS
+ ARISTOCRAT_MK5_GALS
+ ARISTOCRAT_MK5_EEPROM
// checksum code not found due to missing ROMs
ROM_REGION( 0x400000, "game_prg", ROMREGION_ERASEFF )
ROM_LOAD32_WORD( "0300006v.u7", 0x000000, 0x80000, CRC(d1833c73) SHA1(1576a7877877569438571a16c51fdd56a172c60d) )
@@ -6906,7 +7191,8 @@ ROM_END
// 0200711V / 626 / 3 Credit Multiplier / 3 Line Multiline
// Super Bucks III / NSW/ACT / A-22/04/98
ROM_START( sbuk3 )
- ARISTOCRAT_MK5_BIOS
+ ARISTOCRAT_MK5_GALS
+ ARISTOCRAT_MK5_EEPROM
/*
Checksum code found at 0x000ba8
0x000000-0x05ead3 is the Checksummed Range (excluding 0x000020-0x000027 where Checksum is stored)
@@ -6931,7 +7217,8 @@ ROM_END
// Super Bucks III / NSW/ACT / A-22/04/98
// Same strings as sbuk3 but earlier version
ROM_START( sbuk3a )
- ARISTOCRAT_MK5_BIOS
+ ARISTOCRAT_MK5_GALS
+ ARISTOCRAT_MK5_EEPROM
/*
Checksum code found at 0x000ba8
0x000000-0x05eaff is the Checksummed Range (excluding 0x000020-0x000027 where Checksum is stored)
@@ -6956,7 +7243,9 @@ ROM_END
// Sweet Liberty Deluxe / Export / A - 11/02/01
// Requires set chips 4.04.xx
ROM_START( sldeluxe )
- ARISTOCRAT_MK5_BIOS
+ ARISTOCRAT_MK5_USA_SETCHIPS
+ ARISTOCRAT_MK5_GALS
+ ARISTOCRAT_MK5_EEPROM
/*
Checksum code found at 0x000d18
0x000000-0x0ec207 is the Checksummed Range (excluding 0x000020-0x000027 where Checksum is stored)
@@ -6983,7 +7272,8 @@ ROM_END
// 0100673V / 621/2 / 10 Credit Multiplier
// Silver Wolf / Local / A - 23/03/98
ROM_START( slvrwolf )
- ARISTOCRAT_MK5_BIOS
+ ARISTOCRAT_MK5_GALS
+ ARISTOCRAT_MK5_EEPROM
/*
Checksum code found at 0x000ba8
0x000000-0x05bd47 is the Checksummed Range (excluding 0x000020-0x000027 where Checksum is stored)
@@ -7007,7 +7297,8 @@ ROM_END
// 0100405V / 599 / 10 Credit Multiplier / 9 Line Multiline
// Snow Cat / Local / B - 23/12/96
ROM_START( snowcat )
- ARISTOCRAT_MK5_BIOS
+ ARISTOCRAT_MK5_GALS
+ ARISTOCRAT_MK5_EEPROM
/*
Checksum code found at 0x000b80
0x000000-0x0553db is the Checksummed Range (excluding 0x000020-0x000027 where Checksum is stored)
@@ -7028,7 +7319,8 @@ ROM_END
// 0200606V / 622 / 10 Credit Multiplier / 9 Line Multiline
// Sumo Spins / Local / A - 08/12/97
ROM_START( sumospin )
- ARISTOCRAT_MK5_BIOS
+ ARISTOCRAT_MK5_GALS
+ ARISTOCRAT_MK5_EEPROM
/*
Checksum code found at 0x000b88
0x000000-0x05d92b is the Checksummed Range (excluding 0x000020-0x000027 where Checksum is stored)
@@ -7052,7 +7344,8 @@ ROM_END
// 0200465V / 577/1 / 10 Credit Multiplier/9 Line Multiline
// Sweethearts II / Local / C - 07/09/95
ROM_START( swhr2 )
- ARISTOCRAT_MK5_BIOS
+ ARISTOCRAT_MK5_GALS
+ ARISTOCRAT_MK5_EEPROM
/*
Checksum code found at 0x000b68
0x000000-0x05b507 is the Checksummed Range (excluding 0x000020-0x000027 where Checksum is stored)
@@ -7074,7 +7367,8 @@ ROM_END
// Sweethearts II / Local / C - 07/09/95
// Same strings as swhr2 but earlier version
ROM_START( swhr2a )
- ARISTOCRAT_MK5_BIOS
+ ARISTOCRAT_MK5_GALS
+ ARISTOCRAT_MK5_EEPROM
/*
Checksum code found at 0x000ae0
0x000000-0x041803 is the Checksummed Range (excluding 0x000020-0x000027 where Checksum is stored)
@@ -7098,7 +7392,9 @@ ROM_END
// All devices are 27c4002 instead of 27c4096
// No set chips required
ROM_START( swhr2u )
- ARISTOCRAT_MK5_BIOS
+ ARISTOCRAT_MK5_USA_SETCHIPS
+ ARISTOCRAT_MK5_GALS
+ ARISTOCRAT_MK5_EEPROM
/*
Checksum code found at 0x000d08
0x000000-0x0b31cb is the Checksummed Range (excluding 0x000020-0x000027 where Checksum is stored)
@@ -7123,7 +7419,8 @@ ROM_END
// Sweethearts II / VENEZUELA / C - 07/09/95
// Game is in Spanish, however audit mode is in English
ROM_START( swhr2v )
- ARISTOCRAT_MK5_BIOS
+ ARISTOCRAT_MK5_GALS
+ ARISTOCRAT_MK5_EEPROM
/*
Checksum code found at 0x000b68
0x000000-0x07a763 is the Checksummed Range (excluding 0x000020-0x000027 where Checksum is stored)
@@ -7144,7 +7441,8 @@ ROM_END
// 0200319V / 569/12 / 25 Credit Multiplier / 20 Line Multiline
// Thor / Local / B - 14/08/96
ROM_START( thor )
- ARISTOCRAT_MK5_BIOS
+ ARISTOCRAT_MK5_GALS
+ ARISTOCRAT_MK5_EEPROM
/*
Checksum code found at 0x000adc
0x000000-0x052b07 is the Checksummed Range (excluding 0x000020-0x000027 where Checksum is stored)
@@ -7168,7 +7466,8 @@ ROM_END
// 0200333V / 570/9 / 10 Credit Multiplier/9 Line Multiline
// Thunder Heart / Local / A - 14/08/96
ROM_START( thndh )
- ARISTOCRAT_MK5_BIOS
+ ARISTOCRAT_MK5_GALS
+ ARISTOCRAT_MK5_EEPROM
/*
Checksum code found at 0x000ae0
0x000000-0x054c6f is the Checksummed Range (excluding 0x000020-0x000027 where Checksum is stored)
@@ -7192,7 +7491,8 @@ ROM_END
// 0200334V / 597/1 / 3 Credit Multiplier/3 Line Multiline
// Thunder Heart / Local / A - 14/08/96
ROM_START( thndha )
- ARISTOCRAT_MK5_BIOS
+ ARISTOCRAT_MK5_GALS
+ ARISTOCRAT_MK5_EEPROM
/*
Checksum code found at 0x000b38
0x000000-0x053c2b is the Checksummed Range (excluding 0x000020-0x000027 where Checksum is stored)
@@ -7216,7 +7516,8 @@ ROM_END
// 0100550V / 594/3 / 3 Credit Multiplier/3 Line Multiline
// Top Banana / Local / A - 18/08/97
ROM_START( topbana )
- ARISTOCRAT_MK5_BIOS
+ ARISTOCRAT_MK5_GALS
+ ARISTOCRAT_MK5_EEPROM
/*
Checksum code found at 0x000b68
0x000000-0x05851f is the Checksummed Range (excluding 0x000020-0x000027 where Checksum is stored)
@@ -7237,7 +7538,8 @@ ROM_END
// 0100782V / 616/1 / 10 Credit Multiplier/20 Line Multiline
// Toucan Tango 200cm / NSW/ACT / A - 17/06/98
ROM_START( toutango )
- ARISTOCRAT_MK5_BIOS
+ ARISTOCRAT_MK5_GALS
+ ARISTOCRAT_MK5_EEPROM
/*
Checksum code found at 0x000b88
0x000000-0x06766b is the Checksummed Range (excluding 0x000020-0x000027 where Checksum is stored)
@@ -7265,7 +7567,8 @@ ROM_END
// 0301388V / 616 / 10 Credit Multiplier / 9 Line Multiline
// Toucan Tango 90cm / Holland / C - 11/05/99
ROM_START( toutangonl )
- ARISTOCRAT_MK5_BIOS
+ ARISTOCRAT_MK5_GALS
+ ARISTOCRAT_MK5_EEPROM
/*
Checksum code found at 0x00104c
0x000000-0x060dbf is the Checksummed Range (excluding 0x000020-0x000027 where Checksum is stored)
@@ -7292,7 +7595,8 @@ ROM_END
// 01J00161 / JB001/3 / 25 Credit Multiplier / 20 Line Multiline
// TREASURE TROVE / NSW/ACT / A - 5/10/00
ROM_START( trstrove )
- ARISTOCRAT_MK5_BIOS
+ ARISTOCRAT_MK5_GALS
+ ARISTOCRAT_MK5_EEPROM
/*
Checksum code found at 0x000b98
0x000000-0x0638d7 is the Checksummed Range (excluding 0x000020-0x000027 where Checksum is stored)
@@ -7316,7 +7620,8 @@ ROM_END
// 0201692V / 692 / 10 or 25 Credit Multiplier/9 or 20 Line Multiline
// Triple Treat / NSW/ACT / A - 17/05/02
ROM_START( tritreat )
- ARISTOCRAT_MK5_BIOS
+ ARISTOCRAT_MK5_GALS
+ ARISTOCRAT_MK5_EEPROM
/*
Checksum code found at 0x000d18
0x000000-0x07089b is the Checksummed Range (excluding 0x000020-0x000027 where Checksum is stored)
@@ -7342,7 +7647,8 @@ ROM_END
// 01J00851 / JB001/5 / Multi credit / Multi line
// TROJAN HORSE / NSW/ACT / A - 30/10/01
ROM_START( trojhors )
- ARISTOCRAT_MK5_BIOS
+ ARISTOCRAT_MK5_GALS
+ ARISTOCRAT_MK5_EEPROM
/*
Checksum code found at 0x000bb8
0x000000-0x06e9f7 is the Checksummed Range (excluding 0x000020-0x000027 where Checksum is stored)
@@ -7368,7 +7674,8 @@ ROM_END
// 0100269V / 577/3 / 10 Credit Multiplier/9 Line Multiline
// Tropical Delight / Local / B - 15/05/96
ROM_START( trpdlght )
- ARISTOCRAT_MK5_BIOS
+ ARISTOCRAT_MK5_GALS
+ ARISTOCRAT_MK5_EEPROM
/*
Checksum code found at 0x000adc
0x000000-0x04ea87 is the Checksummed Range (excluding 0x000020-0x000027 where Checksum is stored)
@@ -7395,7 +7702,9 @@ ROM_END
// All devices are 27c4002 instead of 27c4096
// No set chips required
ROM_START( trpdlghtu )
- ARISTOCRAT_MK5_BIOS
+ ARISTOCRAT_MK5_USA_SETCHIPS
+ ARISTOCRAT_MK5_GALS
+ ARISTOCRAT_MK5_EEPROM
/*
Checksum code found at 0x000d08
0x000000-0x0b2d1f is the Checksummed Range (excluding 0x000020-0x000027 where Checksum is stored)
@@ -7419,7 +7728,8 @@ ROM_END
// 0100791V / 631/1 A / 10 Credit Multiplier / 20 Line Multiline
// UNICORN DREAMING / NSW/ACT / A - 31/08/98
ROM_START( unicornd )
- ARISTOCRAT_MK5_BIOS
+ ARISTOCRAT_MK5_GALS
+ ARISTOCRAT_MK5_EEPROM
/*
Checksum code found at 0x000bf8
0x000000-0x05f36f is the Checksummed Range (excluding 0x000020-0x000027 where Checksum is stored)
@@ -7443,7 +7753,8 @@ ROM_END
// 0100813V / 631 A / 10 Credit Multiplier / 9 Line Multiline
// UNICORN DREAMING / NSW/ACT / A - 02/09/98
ROM_START( unicornda )
- ARISTOCRAT_MK5_BIOS
+ ARISTOCRAT_MK5_GALS
+ ARISTOCRAT_MK5_EEPROM
/*
Checksum code found at 0x000bf8
0x000000-0x05f087 is the Checksummed Range (excluding 0x000020-0x000027 where Checksum is stored)
@@ -7467,7 +7778,8 @@ ROM_END
// 0101228V / MV4113/1 / 10 Credit Multiplier/20 Line Multiline
// Unicorn Dreaming / New Zealand / A- 5/4/00
ROM_START( unicorndnz )
- ARISTOCRAT_MK5_BIOS
+ ARISTOCRAT_MK5_GALS
+ ARISTOCRAT_MK5_EEPROM
// checksum code not found (uses different startup sequence)
ROM_REGION( 0x400000, "game_prg", ROMREGION_ERASEFF )
ROM_LOAD32_WORD( "0101228v.u7", 0x000000, 0x80000, CRC(54d55ecb) SHA1(0afb2d6489f01ae55563030e228e1d5443738af1) )
@@ -7485,7 +7797,9 @@ ROM_END
// Unicorn Dreaming / Export / C - 10/17/01
// Requires set chips 4.04.xx
ROM_START( unicorndu )
- ARISTOCRAT_MK5_BIOS
+ ARISTOCRAT_MK5_USA_SETCHIPS
+ ARISTOCRAT_MK5_GALS
+ ARISTOCRAT_MK5_EEPROM
/*
Checksum code found at 0x000d18
0x000000-0x0ec547 is the Checksummed Range (excluding 0x000020-0x000027 where Checksum is stored)
@@ -7512,7 +7826,8 @@ ROM_END
// Venezuela is spelled as 'Venezuila' in the ROM
// Game is in Spanish, however audit mode is in English
ROM_START( venicea5 )
- ARISTOCRAT_MK5_BIOS
+ ARISTOCRAT_MK5_GALS
+ ARISTOCRAT_MK5_EEPROM
/*
Checksum code needs to be done
*/
@@ -7537,7 +7852,9 @@ ROM_END
// All devices are 27c4096
// Requires set chips 4.04.xx
ROM_START( wafricau )
- ARISTOCRAT_MK5_BIOS
+ ARISTOCRAT_MK5_USA_SETCHIPS
+ ARISTOCRAT_MK5_GALS
+ ARISTOCRAT_MK5_EEPROM
/*
Checksum code found at 0x000d18
0x000000-0x0e77e7 is the Checksummed Range (excluding 0x000020-0x000027 where Checksum is stored)
@@ -7561,7 +7878,8 @@ ROM_END
// 0200507V / 506/8 / 3 Credit Multiplier/3 Line Multiline
// Wild Amazon / Local / A - 10/10/96
ROM_START( wamazon )
- ARISTOCRAT_MK5_BIOS
+ ARISTOCRAT_MK5_GALS
+ ARISTOCRAT_MK5_EEPROM
/*
Checksum code found at 0x000b68
0x000000-0x05c043 is the Checksummed Range (excluding 0x000020-0x000027 where Checksum is stored)
@@ -7582,7 +7900,8 @@ ROM_END
// 0200285V / 506/6 / 10 Credit Multiplier
// Wild Amazon / Local / A - 7/5/96
ROM_START( wamazona )
- ARISTOCRAT_MK5_BIOS
+ ARISTOCRAT_MK5_GALS
+ ARISTOCRAT_MK5_EEPROM
/*
Checksum code found at 0x000b68
0x000000-0x052b8b is the Checksummed Range (excluding 0x000020-0x000027 where Checksum is stored)
@@ -7607,7 +7926,8 @@ ROM_END
// Wild Amazon / VENEZUELA / A - 10/10/96
// Game is in Spanish, however audit mode is in English
ROM_START( wamazonv )
- ARISTOCRAT_MK5_BIOS
+ ARISTOCRAT_MK5_GALS
+ ARISTOCRAT_MK5_EEPROM
/*
Checksum code found at 0x000b68
0x000000-0x07b2f3 is the Checksummed Range (excluding 0x000020-0x000027 where Checksum is stored)
@@ -7631,7 +7951,8 @@ ROM_END
// 0100553V / 609 / 4 Credit Multiplier / 25 Credit Multiway
// Wicked Winnings / Local / B - 01/07/97
ROM_START( wikwin )
- ARISTOCRAT_MK5_BIOS
+ ARISTOCRAT_MK5_GALS
+ ARISTOCRAT_MK5_EEPROM
/*
Checksum code found at 0x000b88
0x000000-0x07237f is the Checksummed Range (excluding 0x000020-0x000027 where Checksum is stored)
@@ -7655,7 +7976,8 @@ ROM_END
// 0100297V / 543/8 / 3 Credit Multiplier/3 Line Multiline
// Wild Bill / Local / C - 15/08/96
ROM_START( wildbill )
- ARISTOCRAT_MK5_BIOS
+ ARISTOCRAT_MK5_GALS
+ ARISTOCRAT_MK5_EEPROM
/*
Checksum code found at 0x000ad8
0x000000-0x054e6b is the Checksummed Range (excluding 0x000020-0x000027 where Checksum is stored)
@@ -7676,7 +7998,8 @@ ROM_END
// 0100167V / 569/9 / 20 Credit Multiplier / 9 Line Multiline
// Wild Cougar / Local / B - 27/2/96
ROM_START( wcougar )
- ARISTOCRAT_MK5_BIOS
+ ARISTOCRAT_MK5_GALS
+ ARISTOCRAT_MK5_EEPROM
/*
Checksum code found at 0x000adc
0x000000-0x043573 is the Checksummed Range (excluding 0x000020-0x000027 where Checksum is stored)
@@ -7702,7 +8025,8 @@ ROM_END
// All devices are 27c4002 instead of 27c4096
// No set chips required
ROM_START( wcougaru )
- ARISTOCRAT_MK5_BIOS_HAVE_EEPROMS
+ ARISTOCRAT_MK5_USA_SETCHIPS
+ ARISTOCRAT_MK5_GALS
/*
Checksum code found at 0x000d08
0x000000-0x0b0d5b is the Checksummed Range (excluding 0x000020-0x000027 where Checksum is stored)
@@ -7741,7 +8065,9 @@ ROM_END
// All devices are 27C4002 instead of 27C4096
// No set chips required
ROM_START( wcougarua )
- ARISTOCRAT_MK5_BIOS
+ ARISTOCRAT_MK5_USA_SETCHIPS
+ ARISTOCRAT_MK5_GALS
+ ARISTOCRAT_MK5_EEPROM
/*
Checksum code found at 0x000d08
0x000000-0x0b0d5b is the Checksummed Range (excluding 0x000020-0x000027 where Checksum is stored)
@@ -7767,7 +8093,9 @@ ROM_END
// Variation (% and NO): 87,836% 99
// No set chips required
ROM_START( wcougarub )
- ARISTOCRAT_MK5_BIOS
+ ARISTOCRAT_MK5_USA_SETCHIPS
+ ARISTOCRAT_MK5_GALS
+ ARISTOCRAT_MK5_EEPROM
/*
Checksum code found at 0x000d08
0x000000-0x0b0d5b is the Checksummed Range (excluding 0x000020-0x000027 where Checksum is stored)
@@ -7794,7 +8122,9 @@ ROM_END
// ROM says '5 Line / 10 Credit Multiplier' but this game has 9 lines with a 5, 10 or 20 credit multiplier
// Requires set chips 4.04.xx
ROM_START( wcougaruc )
- ARISTOCRAT_MK5_BIOS
+ ARISTOCRAT_MK5_USA_SETCHIPS
+ ARISTOCRAT_MK5_GALS
+ ARISTOCRAT_MK5_EEPROM
/*
Checksum code found at 0x000d18
0x000000-0x0e783b is the Checksummed Range (excluding 0x000020-0x000027 where Checksum is stored)
@@ -7818,7 +8148,9 @@ ROM_END
// AHG1515 / MV4134 / 5,10,25,50 Credit Multiplier / 20 Line Multiline
// Wild Coyote / Export / A - 30/07/01
ROM_START( wcoyote )
- ARISTOCRAT_MK5_BIOS
+ ARISTOCRAT_MK5_USA_SETCHIPS
+ ARISTOCRAT_MK5_GALS
+ ARISTOCRAT_MK5_EEPROM
// checksum code not found due to ROMs being corrupted, all files are missing bytes consisting of 0x0D
ROM_REGION( 0x400000, "game_prg", ROMREGION_ERASEFF )
ROM_LOAD32_WORD( "ahg1515.u7", 0x000000, 0x7f070, BAD_DUMP CRC(045858cd) SHA1(232a9631bcdbbd2e60970eca62bdc540e537e1f2) )
@@ -7836,7 +8168,8 @@ ROM_END
// Wizard Ways / Local / A - 04/11/96
// ROM says 1996 but game has newer style music and a 1998+ style denomination sign
ROM_START( wizways )
- ARISTOCRAT_MK5_BIOS
+ ARISTOCRAT_MK5_GALS
+ ARISTOCRAT_MK5_EEPROM
/*
Checksum code found at 0x000b88
0x000000-0x05ee9b is the Checksummed Range (excluding 0x000020-0x000027 where Checksum is stored)
@@ -7860,7 +8193,8 @@ ROM_END
// 0100337V / 600 / 10 Credit Multiplier/9 Line Multiline
// Wild Angels / Local / B - 24/09/96
ROM_START( wldangel )
- ARISTOCRAT_MK5_BIOS
+ ARISTOCRAT_MK5_GALS
+ ARISTOCRAT_MK5_EEPROM
/*
Checksum code found at 0x000ae0
0x000000-0x05259f is the Checksummed Range (excluding 0x000020-0x000027 where Checksum is stored)
@@ -7885,7 +8219,9 @@ ROM_END
// Winning Post / Export / G - 11/02/97
// No set chips required
ROM_START( wnpost )
- ARISTOCRAT_MK5_BIOS
+ ARISTOCRAT_MK5_USA_SETCHIPS
+ ARISTOCRAT_MK5_GALS
+ ARISTOCRAT_MK5_EEPROM
/*
Checksum code found at 0x000d08
0x000000-0x0c3697 is the Checksummed Range (excluding 0x000020-0x000027 where Checksum is stored)
@@ -7909,7 +8245,8 @@ ROM_END
// 0101158V / 608/4 / 3 Credit Multiplier/3 Line Multiline
// Wild Thing / NSW/ACT / B - 14/12/99
ROM_START( wthing )
- ARISTOCRAT_MK5_BIOS
+ ARISTOCRAT_MK5_GALS
+ ARISTOCRAT_MK5_EEPROM
/*
Checksum code found at 0x000b74
0x000000-0x0673cb is the Checksummed Range (excluding 0x000020-0x000027 where Checksum is stored)
@@ -7933,7 +8270,8 @@ ROM_END
// 0201176V / 608/5 / 25 Credit Multiplier/20 Line Multiline
// Wild Thing / NSW/ACT / B - 25/02/00
ROM_START( wthinga )
- ARISTOCRAT_MK5_BIOS
+ ARISTOCRAT_MK5_GALS
+ ARISTOCRAT_MK5_EEPROM
// checksum code not found due to ROMs being corrupted, all files are missing bytes consisting of 0x0D
ROM_REGION( 0x400000, "game_prg", ROMREGION_ERASEFF )
ROM_LOAD32_WORD( "0201176v.u7", 0x000000, 0x7f44a, BAD_DUMP CRC(e2632da7) SHA1(ff53d87d8f45c3bcece358d0ecfa89e6912e1ccf) )
@@ -7952,7 +8290,8 @@ ROM_END
// 0200954V / 638/1 / 10 Credit Multiplier / 20 Line Multiline
// White Tiger Classic / NSW/ACT / B - 08/07/99
ROM_START( wtiger )
- ARISTOCRAT_MK5_BIOS
+ ARISTOCRAT_MK5_GALS
+ ARISTOCRAT_MK5_EEPROM
/*
Checksum code found at 0x000d30
0x000000-0x060227 is the Checksummed Range (excluding 0x000020-0x000027 where Checksum is stored)
@@ -7973,7 +8312,8 @@ ROM_END
// 03J00191 / JB005/1 / Multi credit / Multi line
// Yukon Gold / NSW/ACT / A - 30/10/2000
ROM_START( yukongl5 )
- ARISTOCRAT_MK5_BIOS
+ ARISTOCRAT_MK5_GALS
+ ARISTOCRAT_MK5_EEPROM
/*
Checksum code found at 0x000bb8
0x000000-0x06dbc3 is the Checksummed Range (excluding 0x000020-0x000027 where Checksum is stored)
@@ -8000,236 +8340,236 @@ ROM_END
* Game Drivers *
*************************/
-#define MACHINE_FLAGS MACHINE_IMPERFECT_SOUND|MACHINE_IMPERFECT_GRAPHICS|MACHINE_IMPERFECT_TIMING
-#define MACHINE_FLAGS_NW MACHINE_NOT_WORKING|MACHINE_IMPERFECT_SOUND|MACHINE_IMPERFECT_GRAPHICS|MACHINE_IMPERFECT_TIMING
-
// YEAR NAME PARENT MACHINE INPUT CLASS INIT ROT COMPANY FULLNAME FLAGS
-GAMEL( 1995, aristmk5, 0, aristmk5_usa, aristmk5_usa, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "MKV Set/Clear Chips (USA)", MACHINE_FLAGS_NW|MACHINE_IS_BIOS_ROOT, layout_aristmk5_us )
+GAMEL( 1995, aristmk5, 0, aristmk5_usa, aristmk5_usa, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "MKV Set/Clear Chips (USA)", MACHINE_NOT_WORKING | MACHINE_IS_BIOS_ROOT, layout_aristmk5_us )
// Dates listed below are for the combination (reel layout), not release dates
-GAMEL( 1998, adonis, aristmk5, aristmk5, aristmk5, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Adonis (0200751V, NSW/ACT)", MACHINE_FLAGS_NW, layout_aristmk5 ) // 602/9, A - 25/05/98, Rev 10
-GAMEL( 1998, adonisa, adonis, aristmk5, aristmk5, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Adonis (0100751V, NSW/ACT)", MACHINE_FLAGS_NW, layout_aristmk5 ) // 602/9, A - 25/05/98, Rev 9
-GAMEL( 1999, adonisce, adonis, aristmk5, adonisce, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Adonis - Cash Express (0201005V, NSW/ACT)", MACHINE_FLAGS_NW, layout_aristmk5 ) // 602/9, C - 06/07/99, Rev 12
-GAMEL( 2001, adonisu, adonis, aristmk5_usa, bootsctnua, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Adonis (BHG1508, US)", MACHINE_FLAGS_NW, layout_adonisu ) // MV4124/1, B - 31/07/01
-GAMEL( 2002, alchemst, aristmk5, aristmk5, goldenra, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Alchemist (01J02046, Venezuela)", MACHINE_FLAGS_NW, layout_yukongl5 ) // JB013/1, A - 22/01/02, Rev 17
-GAMEL( 2000, bparty, aristmk5, aristmk5_usa_touch, bootsctnua, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Bachelorette Party (BHG1248, US)", MACHINE_FLAGS_NW, layout_bparty ) // MV4119/1, B - 25/08/2000
-GAMEL( 1996, baddog, aristmk5, aristmk5, baddog, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Bad Dog Poker (0200428V, NSW/ACT)", MACHINE_FLAGS, layout_baddog ) // 386/56, A - 17/12/96
-GAMEL( 1998, bootsctn, aristmk5, aristmk5, cashcham, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Boot Scootin' (0100812V, NSW/ACT)", MACHINE_FLAGS_NW, layout_cashcham ) // 616/1, B - 11/12/98, Rev 20
-GAMEL( 1999, bootsctnu, bootsctn, aristmk5_usa, aristmk5_usa, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Boot Scootin' (GHG1012-02, US)", MACHINE_FLAGS_NW, layout_aristmk5_us ) // MV4098, A - 25/08/99
-GAMEL( 1999, bootsctnua, bootsctn, aristmk5_usa, pengpuck, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Boot Scootin' (GHG1008-03, US)", MACHINE_FLAGS_NW, layout_aristmk5_us_200 ) // MV4098/1, A - 27/07/99
-GAMEL( 2001, bootsctnub, bootsctn, aristmk5_usa, aristmk5_usa, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Boot Scootin' (AHG1547, US)", MACHINE_FLAGS_NW, layout_adonisu ) // MV4098/1, B - 22/03/01
-GAMEL( 1996, bumblbug, aristmk5, aristmk5, swhr2, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Bumble Bugs (0200510V, NSW/ACT)", MACHINE_FLAGS_NW, layout_swhr2 ) // 593, D - 5/07/96, Rev 3
-GAMEL( 1996, bumblbugql, bumblbug, aristmk5, swhr2, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Bumble Bugs (0200456V, Queensland)", MACHINE_FLAGS_NW, layout_swhr2 ) // 593, D - 5/07/96, Rev 1.0
-GAMEL( 1997, bumblbugu, bumblbug, aristmk5_usa, aristmk5_usa, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Bumble Bugs (CHG0479-03, US)", MACHINE_FLAGS_NW, layout_aristmk5_us ) // 593, D - 05/07/97
-GAMEL( 1997, bumblbugua, bumblbug, aristmk5_usa, aristmk5_usa, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Bumble Bugs (CHG0479-99, US)", MACHINE_FLAGS_NW, layout_aristmk5_us ) // 593, D - 05/07/97
-GAMEL( 1995, buttdeli, aristmk5, aristmk5, swhr2, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Butterfly Delight (0200143V, NSW/ACT)", MACHINE_FLAGS, layout_swhr2 ) // 571/4, A - 19/12/95, Rev 1.8.1.0
-GAMEL( 1998, cashcat, aristmk5, aristmk5, aristmk5, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Cash Cat (0100676V, NSW/ACT)", MACHINE_FLAGS_NW, layout_aristmk5 ) // 614/3, A - 03/04/98, Rev 7
-GAMEL( 1997, cashcata, cashcat, aristmk5, aristmk5_9, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Cash Cat (0100557V, NSW/ACT)", MACHINE_FLAGS_NW, layout_dolphntrb ) // 614/1, B - 01/12/97, Rev 7
-GAMEL( 1999, cashcatnz, cashcat, aristmk5, cashcatnz, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Cash Cat (0300863V, New Zealand)", MACHINE_FLAGS, layout_cashcatnz ) // MV4089, A - 4/1/99, Rev 26
-GAMEL( 1997, cashcham, aristmk5, aristmk5, cashcham, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Cash Chameleon (0100438V, NSW/ACT)", MACHINE_FLAGS, layout_cashcham ) // 603/1, C - 15/4/97, Rev 1.25.3.0
-GAMEL( 1998, cashchama, cashcham, aristmk5, cashchama, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Cash Chameleon (0200437V, NSW/ACT)", MACHINE_FLAGS_NW, layout_cashchama ) // 603(a), D - 18/02/98, Rev 3
-GAMEL( 1998, cashchamnz, cashcham, aristmk5, cashchamnz, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Cash Chameleon (0300781V, New Zealand)", MACHINE_FLAGS, layout_cashchamnz ) // MV4067, A - 31/08/98, Rev 21
-GAMEL( 1996, cashchamu, cashcham, aristmk5_usa, bootsctnua, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Cash Chameleon (DHG4078-99, US)", MACHINE_FLAGS_NW, layout_cashchamu ) // 603(a), B - 06/12/96
-GAMEL( 1997, cashcra5, aristmk5, aristmk5, aristmk5, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Cash Crop (0300467V, NSW/ACT)", MACHINE_FLAGS_NW, layout_aristmk5 ) // 607, C - 14/07/97, Rev 6
-GAMEL( 1998, chariotc, aristmk5, aristmk5, chariotc, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "The Chariot Challenge (0100787V, NSW/ACT)", MACHINE_FLAGS_NW, layout_aristmk5 ) // 630/1, A - 10/08/98, Rev 11
-GAMEL( 1998, chariotcv, chariotc, aristmk5, chariotcv, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "The Chariot Challenge (04J00714, Venezuela)", MACHINE_FLAGS_NW, layout_snowcat ) // 630, A - 10/08/98, Rev 12
-GAMEL( 2001, checkma5, aristmk5, aristmk5, checkma5, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Checkmate (01J00681, NSW/ACT)", MACHINE_FLAGS_NW, layout_checkma5 ) // JB011, B - 06/07/01, Rev 17
-GAMEL( 1996, chickna5, aristmk5, aristmk5, chickna5, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Chicken (0100351V, NSW/ACT)", MACHINE_FLAGS, layout_snowcat ) // 596, A - 27/08/96, Rev 1.24
-GAMEL( 1998, chickna5ql, chickna5, aristmk5, chickna5, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Chicken (0200530V, Queensland)", MACHINE_FLAGS_NW, layout_snowcat ) // 596, C - 23/02/98, Rev 1.0
-GAMEL( 1998, chickna5u, chickna5, aristmk5_usa, chickna5u, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Chicken (RHG0730-03, US)", MACHINE_FLAGS_NW, layout_aristmk5_us ) // 596, C - 23/02/98
-GAMEL( 1998, chickna5ua, chickna5, aristmk5_usa, chickna5u, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Chicken (RHG0730-99, US)", MACHINE_FLAGS_NW, layout_aristmk5_us ) // 596, C - 23/02/98
-GAMEL( 1998, coralrc2, aristmk5, aristmk5, coralrc2, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Coral Riches II (0100919V, NSW/ACT)", MACHINE_FLAGS_NW, layout_coralrc2 ) // 577/7, A - 29/12/98, Rev 12
-GAMEL( 1998, cuckoo, aristmk5, aristmk5, aristmk5, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Cuckoo (0200753V, NSW/ACT)", MACHINE_FLAGS_NW, layout_aristmk5 ) // 615/1, D - 03/07/98, Rev 6
-GAMEL( 2000, cuckoou, cuckoo, aristmk5_usa, aristmk5_usa, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Cuckoo (CHG1195, US)", MACHINE_FLAGS_NW, layout_cuckoou ) // MV4104, C - 02/02/00
-GAMEL( 1995, dstbloom, aristmk5, aristmk5, wcougar, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Desert Bloom (0300111V, NSW/ACT)", MACHINE_FLAGS, layout_wcougar ) // 577/2, A - 12/10/95, Rev 1.16.4.0
-GAMEL( 1995, dstblooma, dstbloom, aristmk5, wcougar, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Desert Bloom (0200111V, NSW/ACT)", MACHINE_FLAGS, layout_wcougar ) // 577/2, A - 12/10/95, Rev 1.16.4.0
-GAMEL( 1999, diamdove, aristmk5, aristmk5, retrsam, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Diamond Dove (0101018V, NSW/ACT)", MACHINE_FLAGS_NW, layout_sbuk3 ) // 640, B - 19/05/99, Rev 8
-GAMEL( 1996, dmdfever, aristmk5, aristmk5, wildbill, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Diamond Fever (0200302V, NSW/ACT)", MACHINE_FLAGS, layout_wildbill ) // 483/7, E - 05/09/96, Rev 1.23.5.0
-GAMEL( 1997, dimtouch, aristmk5, aristmk5_touch, dimtouch, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Diamond Touch (0400433V, NSW/ACT)", MACHINE_FLAGS_NW, layout_dimtouch ) // 604, E - 30/06/97, Rev 17
-GAMEL( 1996, dolphntr, aristmk5, aristmk5, aristmk5, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Dolphin Treasure (0200424V, NSW/ACT)", MACHINE_FLAGS_NW, layout_aristmk5 ) // 602/1, B - 06/12/96, Rev 3
-GAMEL( 1996, dolphntra, dolphntr, aristmk5, aristmk5, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Dolphin Treasure (0100424V, NSW/ACT)", MACHINE_FLAGS, layout_aristmk5 ) // 602/1, B - 06/12/96, Rev 1.24.4.0
-GAMEL( 1996, dolphntrb, dolphntr, aristmk5, aristmk5_9, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Dolphin Treasure (0100388V, NSW/ACT)", MACHINE_FLAGS, layout_dolphntrb ) // 602, B - 10/12/96, Rev 1.24.4.0
-GAMEL( 1996, dolphntru, dolphntr, aristmk5_usa, dolphntru, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Dolphin Treasure (FHG4077-02, US)", MACHINE_FLAGS_NW, layout_aristmk5_us ) // 602/1, B - 06/12/96
-GAMEL( 1999, dolphntrce, dolphntr, aristmk5_usa, dolphntrce, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Dolphin Treasure - Cash Express (AHG1607, US)", MACHINE_FLAGS_NW, layout_adonisu ) // MV4090, D - 22/12/99
-GAMEL( 1999, dolphntrcea, dolphntr, aristmk5_usa, dolphntru, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Dolphin Treasure - Cash Express (AHG1606, US)", MACHINE_FLAGS_NW, layout_magimaska ) // MV4090, D - 22/12/99
-GAMEL( 1999, dolphntrceb, dolphntr, aristmk5_usa, dolphntrce, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Dolphin Treasure - Cash Express (AHG1519, US)", MACHINE_FLAGS_NW, layout_dolphntrceb ) // MV4090, D - 22/12/99
-GAMEL( 1997, drgneye, aristmk5, aristmk5, snowcat, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Dragon's Eye (0100521V, NSW/ACT)", MACHINE_FLAGS, layout_snowcat ) // 610, A - 09/05/97, Rev 1.27
-GAMEL( 1997, dreamwv, aristmk5, aristmk5_touch, dreamwv, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Dream Weaver (0200586V, NSW/ACT)", MACHINE_FLAGS_NW, layout_dreamwv ) // 606/2, A - 20/06/97, Rev 16
-GAMEL( 2000, dynajack, aristmk5, aristmk5, dynajack, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Dynamite Jack (01J00081, NSW/ACT)", MACHINE_FLAGS_NW, layout_dynajack ) // JB004, A - 12/07/2000, Rev 17
-GAMEL( 1998, eldorda5, aristmk5, aristmk5, reelrock, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "El Dorado (0100652V, NSW/ACT)", MACHINE_FLAGS_NW, layout_reelrock ) // 623, B - 24/03/98, Rev 3
-GAMEL( 1995, eforsta5, aristmk5, aristmk5, swhr2, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Enchanted Forest (0400122V, NSW/ACT)", MACHINE_FLAGS, layout_swhr2 ) // 570/3, E - 23/06/95, Rev 1.18
-GAMEL( 1997, eforsta5u, eforsta5, aristmk5_usa, aristmk5_usa, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Enchanted Forest (JHG0415-03, US)", MACHINE_FLAGS_NW, layout_aristmk5_us ) // MV4033, B - 10/02/97
-GAMEL( 1997, eforsta5ua, eforsta5, aristmk5_usa, aristmk5_usa, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Enchanted Forest (JHG0415-99, US)", MACHINE_FLAGS_NW, layout_aristmk5_us ) // MV4033, B - 10/02/97
-GAMEL( 2000, eforsta5cea, eforsta5, aristmk5_usa, aristmk5_usa, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Enchanted Forest - Cash Express (AHG1615, US)", MACHINE_FLAGS_NW, layout_magimaska ) // MV4108/6, C - 17/01/00
-GAMEL( 1998, fastfort, aristmk5, aristmk5, wildbill, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Fast Fortune (0100651V, NSW/ACT)", MACHINE_FLAGS_NW, layout_wildbill ) // 624, D - 07/05/98, Rev 5
-GAMEL( 2000, fortellr, aristmk5, aristmk5, goldenra, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Fortune Teller (01J00131, NSW/ACT)", MACHINE_FLAGS_NW, layout_fortellr ) // JB006, D - 24/11/2000, Rev 17
-GAMEL( 1998, gambler, aristmk5, aristmk5_usa, aristmk5_usa, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "The Gambler (EHG0916-02, US)", MACHINE_FLAGS_NW, layout_aristmk5_us ) // MV4084/1, A - 30/10/98
-GAMEL( 2001, geisha, aristmk5, aristmk5, geisha, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Geisha (0101408V, New Zealand)", MACHINE_FLAGS, layout_geisha ) // MV4127, A - 05/03/01, Rev 25
-GAMEL( 1999, genmagi, aristmk5, aristmk5_touch, genmagi, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Genie Magic (0200894V, NSW/ACT)", MACHINE_FLAGS_NW, layout_genmagi ) // 632/1, C - 15/02/99, Rev 20
-GAMEL( 2001, glizrdce, aristmk5, aristmk5_usa, bootsctnua, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Green Lizard - Cash Express (AHG1623, US)", MACHINE_FLAGS_NW, layout_adonisu ) // MV4112/2 - A - 05/01/01
-GAMEL( 1998, gnomeatw, aristmk5, aristmk5, kgalah, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Gnome Around The World (0100767V, NSW/ACT)", MACHINE_FLAGS_NW, layout_kgalah ) // 625, C - 18/12/98, Rev 16
-GAMEL( 1997, goldpyr, aristmk5, aristmk5_usa, dolphntru, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Golden Pyramids (AHG1205-03, US)", MACHINE_FLAGS_NW, layout_aristmk5_us ) // MV4091, B - 13/05/97
-GAMEL( 1997, goldpyra, goldpyr, aristmk5_usa, bootsctnua, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Golden Pyramids (AHG1206-99, US)", MACHINE_FLAGS_NW, layout_aristmk5_us_200 ) // 602/2, B - 13/05/97
-GAMEL( 1998, goldpyrb, goldpyr, aristmk5, goldpyrb, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Golden Pyramids (0100878V, Victoria)", MACHINE_FLAGS_NW, layout_goldpyrb ) // 602/5, C - 19/06/98
-GAMEL( 2000, goldenra, aristmk5, aristmk5, goldenra, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Golden Ra (0101164V, NSW/ACT)", MACHINE_FLAGS_NW, layout_goldenra ) // 661, A - 10/04/00, Rev 15
-GAMEL( 2001, hnktonku, aristmk5, aristmk5_usa, aristmk5_usa, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Honky Tonk (BHG1455, US)", MACHINE_FLAGS_NW, layout_magimaska ) // MV4122/3, A - 07/08/01
-GAMEL( 2000, honeypot, aristmk5, aristmk5, goldenra, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Honey Pot (03J00241, NSW/ACT)", MACHINE_FLAGS_NW, layout_yukongl5 ) // JB008, A - 21/11/2000, Rev 17
-GAMEL( 1999, incasun, aristmk5, aristmk5, incasun, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Inca Sun (0100872V, NSW/ACT)", MACHINE_FLAGS_NW, layout_incasun ) // 631/3 B, B - 03/05/99, Rev 15
-GAMEL( 1999, incasunsp, incasun, aristmk5, incasun, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Inca Sun (0100872V, NSW/ACT, Show Program)", MACHINE_FLAGS_NW, layout_incasun ) // 631/3 B, B - 03/05/99, Rev 15
-GAMEL( 2000, incasunnz, incasun, aristmk5, incasunnz, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Inca Sun (0101108V, New Zealand)", MACHINE_FLAGS, layout_incasunnz ) // MV4113, A - 6/3/00, Rev 25
-GAMEL( 2000, incasunu, incasun, aristmk5_usa, dolphntrce, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Inca Sun (CHG1458, US)", MACHINE_FLAGS_NW, layout_adonisu ) // MV4130/3, A - 05/09/00
-GAMEL( 2000, incasunua, incasun, aristmk5_usa, bootsctnua, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Inca Sun (DHG1577, US)", MACHINE_FLAGS_NW, layout_adonisu ) // MV4130, A - 05/09/00
-GAMEL( 1999, incasunv, incasun, aristmk5, incasun, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Inca Sun (01J01946, Venezuela)", MACHINE_FLAGS_NW, layout_incasun ) // 631/3 B, B- 03/05/99, Rev 15
-GAMEL( 1998, indrema5, aristmk5, aristmk5, indrema5, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Indian Dreaming (0100845V, NSW/ACT)", MACHINE_FLAGS_NW, layout_indrema5 ) // 628/1, B - 15/12/98, Rev 7
-GAMEL( 1996, jumpjoey, aristmk5, aristmk5, cashcham, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Jumpin' Joey (0100383V, NSW/ACT)", MACHINE_FLAGS, layout_cashcham ) // 586/6, C - 13/11/96
-GAMEL( 1996, jungjuic, aristmk5, aristmk5, jungjuic, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Jungle Juice (0200240V, New Zealand)", MACHINE_FLAGS_NW, layout_jungjuic ) // 566/3, F - 06/03/96
-GAMEL( 1995, kgalah, aristmk5, aristmk5, kgalah, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "King Galah (0200536V, NSW/ACT)", MACHINE_FLAGS_NW, layout_kgalah ) // 613/6, A - 21/07/95
-GAMEL( 1995, kgalaha, kgalah, aristmk5, kgalah, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "King Galah (0100536V, NSW/ACT)", MACHINE_FLAGS, layout_kgalah ) // 613, A - 21/07/95
-GAMEL( 2001, kgalahce, kgalah, aristmk5_usa, bootsctnua, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "King Galah - Cash Express (AHG1625, US)", MACHINE_FLAGS_NW, layout_adonisu ) // MV4112/2, B - 07/02/01
-GAMEL( 1994, kgbirda5, aristmk5, aristmk5, kgbirda5, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "K.G. Bird (0200024V, NSW/ACT)", MACHINE_FLAGS, layout_kgbirda5 ) // 540/3, D - 10/10/94
-GAMEL( 2001, koalamnt, aristmk5, aristmk5_usa, dolphntrce, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Koala Mint (CHG1573, US)", MACHINE_FLAGS_NW, layout_adonisu ) // MV4137, A - 12/09/01
-GAMEL( 1998, kookabuk, aristmk5, aristmk5, aristmk5, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Kooka Bucks (0100677V, NSW/ACT)", MACHINE_FLAGS_NW, layout_aristmk5 ) // 661, A - 03/04/98, Rev 5
-GAMEL( 2000, kyhatonu, aristmk5, aristmk5_usa_touch, bootsctnua, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Keep Your Hat On (BHG1204, US)", MACHINE_FLAGS_NW, layout_bparty ) // MV4114/1, B - 08/05/2000
-GAMEL( 1997, locoloot, aristmk5, aristmk5, cashcham, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Loco Loot (0100473V, NSW/ACT)", MACHINE_FLAGS, layout_cashcham ) // 599/3, C - 17/06/97, Rev 1.26.13.0
-GAMEL( 1997, locoloota, locoloot, aristmk5, locoloota, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Loco Loot (0100472V, NSW/ACT)", MACHINE_FLAGS, layout_locoloota ) // 599/2, C - 17/06/97, Rev 1.26.13.0
-GAMEL( 1998, locolootnz, locoloot, aristmk5, cashchamnz, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Loco Loot (0600725V, New Zealand)", MACHINE_FLAGS, layout_cashchamnz ) // MV4064, A - 8/7/98, Rev 24
-GAMEL( 2001, locolootu, locoloot, aristmk5_usa, bootsctnua, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Loco Loot (AHG1513, US)", MACHINE_FLAGS_NW, layout_adonisu ) // MV4134, A - 30/07/01
-GAMEL( 1997, lonewolf, aristmk5, aristmk5, wildbill, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Lone Wolf (0100587V, NSW/ACT)", MACHINE_FLAGS, layout_wildbill ) // 621, A - 29/10/97, Rev 1.27.17.0
-GAMEL( 1995, luckyclo, aristmk5, aristmk5, wcougar, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Lucky Clover (0300109V, NSW/ACT)", MACHINE_FLAGS, layout_wcougar ) // 570/6, A - 12/10/95
-GAMEL( 2000, magimask, aristmk5, aristmk5_usa_touch, bootsctnua, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Magic Mask (AHG1549, US)", MACHINE_FLAGS_NW, layout_adonisu ) // MV4115_1, A - 09/05/00
-GAMEL( 2000, magimaska, magimask, aristmk5_usa_touch, aristmk5_usa, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Magic Mask (AHG1548, US)", MACHINE_FLAGS_NW, layout_magimaska ) // MV4115, A - 09/05/00
-GAMEL( 2000, magimaskb, magimask, aristmk5_usa_touch, aristmk5_usa, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Magic Mask (DHG1309, US)", MACHINE_FLAGS_NW, layout_magimaska ) // MV4115, A - 09/05/00
-GAMEL( 1997, magtcha5, aristmk5, aristmk5_touch, dimtouch, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Magic Touch (0300455V, NSW/ACT)", MACHINE_FLAGS_NW, layout_dimtouch ) // 606, A - 06/03/97, Rev 14
-GAMEL( 1997, magtcha5a, magtcha5, aristmk5_touch, dimtouch, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Magic Touch (0200455V, NSW/ACT)", MACHINE_FLAGS_NW, layout_dimtouch ) // 606, A - 06/03/97, Rev 14
-GAMEL( 1997, mammothm, aristmk5, aristmk5, kgalah, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Mammoth Money (0100425V, NSW/ACT)", MACHINE_FLAGS, layout_kgalah ) // 595/5, D - 07/04/97, Rev 1.22.14.1
-GAMEL( 2000, marmagic, aristmk5, aristmk5, goldenra, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Margarita Magic (01J00101, NSW/ACT)", MACHINE_FLAGS_NW, layout_marmagic ) // JB005, A - 07/07/00, Rev 17
-GAMEL( 2000, marmagicu, marmagic, aristmk5_usa, aristmk5_usa, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Margarita Magic (EHG1558, US)", MACHINE_FLAGS_NW, layout_magimaska ) // US003, 07/07/2000
-GAMEL( 2000, marmagicua, marmagic, aristmk5_usa, bootsctnua, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Margarita Magic (EHG1559, US)", MACHINE_FLAGS_NW, layout_adonisu ) // US003, A - 07/07/00
-GAMEL( 1997, mgarden, aristmk5, aristmk5_usa, aristmk5_usa, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Magic Garden (AHG1211-99, US)", MACHINE_FLAGS_NW, layout_aristmk5_us ) // MV4033, B - 10/02/97
-GAMEL( 1996, minemine, aristmk5, aristmk5, swhr2, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Mine, Mine, Mine (0400115V, NSW/ACT)", MACHINE_FLAGS, layout_swhr2 ) // 559/2, D - 16/01/96, Rev 1.18.3.0
-GAMEL( 1996, minemineu, minemine, aristmk5_usa, aristmk5_usa, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Mine, Mine, Mine (VHG0416-99, US)", MACHINE_FLAGS_NW, layout_aristmk5_us ) // 559/2, E - 14/02/96
-GAMEL( 1996, minemineua, minemine, aristmk5_usa, aristmk5_usa, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Mine, Mine, Mine (NHG0416-99, US)", MACHINE_FLAGS_NW, layout_aristmk5_us ) // 559/2, E - 14/02/96
-GAMEL( 1997, monmouse, aristmk5, aristmk5, cashcham, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Money Mouse (0400469V, NSW/ACT)", MACHINE_FLAGS_NW, layout_cashcham ) // 607/1, B - 08/04/97, Rev 6
-GAMEL( 1997, monmousea, monmouse, aristmk5, cashcham, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Money Mouse (0300469V, NSW/ACT)", MACHINE_FLAGS_NW, layout_cashcham ) // 607/1, B - 08/04/97, Rev 6
-GAMEL( 2001, montree, aristmk5, aristmk5, montree, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Money Tree (0201397V, New Zealand)", MACHINE_FLAGS, layout_montree ) // MV4126, C - 12/04/01, Rev 5
-GAMEL( 1996, mountmon, aristmk5, aristmk5, mountmon, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Mountain Money (0100294V, NSW/ACT)", MACHINE_FLAGS, layout_mountmon ) // 595/3, B - 11/06/96, Rev 1.22.5.0
-GAMEL( 1996, mountmona, mountmon, aristmk5, mystgard, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Mountain Money (0100289V, NSW/ACT)", MACHINE_FLAGS, layout_mystgard ) // 595/2, C - 11/06/96, Rev 1.22.5.0
-GAMEL( 2001, mountmonua, mountmon, aristmk5_usa, aristmk5_usa, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Mountain Money (BHG1464, US)", MACHINE_FLAGS_NW, layout_magimaska ) // MV4108/5, A - 10/03/01
-GAMEL( 2000, multidrw, aristmk5, aristmk5, multidrw, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Multidraw - Free Games (0200956V, NSW/ACT)", MACHINE_FLAGS_NW, layout_multidrw ) // 386/64, E - 08/05/00, Rev 17
-GAMEL( 1996, mystgard, aristmk5, aristmk5, mystgard, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Mystic Garden (0100275V, NSW/ACT)", MACHINE_FLAGS, layout_mystgard ) // 595/1, B - 11/06/96, Rev 1.22
-GAMEL( 2001, one4all, aristmk5, aristmk5, one4all, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "One For All (0101503V, New Zealand)", MACHINE_FLAGS, layout_one4all ) // MV4141, A - 28/05/01, Rev 11
-GAMEL( 1999, orchidms, aristmk5, aristmk5, orchidms, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Orchid Mist (0200849V, NSW/ACT)", MACHINE_FLAGS_NW, layout_orchidms ) // 601/3, C - 03/02/99, Rev 8
-GAMEL( 1999, orchidmsa, orchidms, aristmk5, orchidms, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Orchid Mist (0100849V, NSW/ACT)", MACHINE_FLAGS_NW, layout_orchidms ) // 601/3, C - 03/02/99, Rev 6
-GAMEL( 2000, orchidmsnz, orchidms, aristmk5, orchidmsnz, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Orchid Mist (0101241V, New Zealand)", MACHINE_FLAGS, layout_orchidmsnz ) // MV4118, A - 3/7/00, Rev 30
-GAMEL( 1996, oscara5, aristmk5, aristmk5, aristmk5_9, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Oscar (0200348V, NSW/ACT)", MACHINE_FLAGS_NW, layout_dolphntrb ) // 593/2, C - 20/09/96, Rev 3
-GAMEL( 1996, oscara5a, oscara5, aristmk5, aristmk5_9, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Oscar (0100348V, NSW/ACT)", MACHINE_FLAGS, layout_dolphntrb ) // 593/2, C - 20/09/96, Rev 1.23.9.1
-GAMEL( 1999, pantmag, aristmk5, aristmk5, kgalah, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Panther Magic (0101046V, NSW/ACT)", MACHINE_FLAGS_NW, layout_pantmag ) // 594/7, A - 06/10/99, Rev 16
-GAMEL( 1999, pantmaga, pantmag, aristmk5, pantmaga, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Panther Magic (0100716V, NSW/ACT)", MACHINE_FLAGS_NW, layout_pantmaga ) // 594/4, A - 13/05/98, Rev 9
-GAMEL( 2001, partygrs, aristmk5, aristmk5_usa_touch, aristmk5_usa, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Party Gras (AHG1567, US)", MACHINE_FLAGS_NW, layout_magimaska ) // MV4115/6, A - 10/11/01
-GAMEL( 2001, partygrsa, partygrs, aristmk5_usa_touch, bootsctnua, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Party Gras (BHG1284, US)", MACHINE_FLAGS_NW, layout_bparty ) // MV4115/3, B - 06/02/01
-GAMEL( 2000, peaflut, aristmk5, aristmk5, trstrove, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Peacock Flutter (02J00011, NSW/ACT)", MACHINE_FLAGS_NW, layout_trstrove ) // JB001, A - 10/03/00, Rev 8
-GAMEL( 1997, pengpay, aristmk5, aristmk5, cashchama, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Penguin Pays (0200460V, NSW/ACT)", MACHINE_FLAGS_NW, layout_cashchama ) // 586/4(a), D - 03/06/97, Rev 3
-GAMEL( 1996, pengpaya, pengpay, aristmk5, cashchama, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Penguin Pays (0200357V, NSW/ACT)", MACHINE_FLAGS, layout_cashchama ) // 586/4, C - 12/11/96
-GAMEL( 1997, pengpayb, pengpay, aristmk5, swhr2, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Penguin Pays (0200359V, NSW/ACT)", MACHINE_FLAGS_NW, layout_swhr2 ) // 586/3(a), D - 03/06/97, Rev 4
-GAMEL( 1995, pengpayc, pengpay, aristmk5, wcougar, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Penguin Pays (0200113V, NSW/ACT)", MACHINE_FLAGS, layout_wcougar ) // 586, A - 12/10/95
-GAMEL( 1997, pengpayu, pengpay, aristmk5_usa, aristmk5_usa, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Penguin Pays (BHI0417-03, US)", MACHINE_FLAGS_NW, layout_aristmk5_us ) // 586/7(b), B - 14/07/97
-GAMEL( 1997, pengpayua, pengpay, aristmk5_usa, aristmk5_usa, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Penguin Pays (OHG0417-03, US)", MACHINE_FLAGS_NW, layout_aristmk5_us ) // 586/7(b), B - 14/07/97
-GAMEL( 1997, pengpayub, pengpay, aristmk5_usa, aristmk5_usa, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Penguin Pays (OHG0417-02, US)", MACHINE_FLAGS_NW, layout_aristmk5_us ) // 586/7(b), B - 14/07/97
-GAMEL( 2001, pengpayce, pengpay, aristmk5_usa, aristmk5_usa, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Penguin Pays - Cash Express (AHG1544, US)", MACHINE_FLAGS_NW, layout_qnilecea ) // MV4122, C - 19/01/01
-GAMEL( 2001, pengpuck, pengpay, aristmk5_usa, pengpuck, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Penguin Pays - Penguin Pucks (EHG1257, US)", MACHINE_FLAGS_NW, layout_pengpuck ) // MV4122/1, C - 19/01/01
-GAMEL( 1998, penpir, aristmk5, aristmk5, kgalah, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Penguin Pirate (0100674V, NSW/ACT)", MACHINE_FLAGS_NW, layout_kgalah ) // 619/1, A - 31/03/98, Rev 10
-GAMEL( 1998, penpira, penpir, aristmk5, snowcat, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Penguin Pirate (0200578V, NSW/ACT)", MACHINE_FLAGS_NW, layout_snowcat ) // 619, A - 27/02/98, Rev 8
-GAMEL( 1998, penpir2, aristmk5, aristmk5, penpir2, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Penguin Pirate II (0100869V, Victoria)", MACHINE_FLAGS_NW, layout_penpir2 ) // 619/3, A - 17/12/98
-GAMEL( 1998, petshop, aristmk5, aristmk5, petshop, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Pet Shop (0100731V, NSW/ACT)", MACHINE_FLAGS_NW, layout_petshop ) // 618/1, A - 17/04/98, Rev 13
-GAMEL( 1995, phantpay, aristmk5, aristmk5, swhr2, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Phantom Pays (0500005V, NSW/ACT)", MACHINE_FLAGS, layout_swhr2 ) // 570/1, E - 12/09/95
-GAMEL( 1996, przfight, aristmk5, aristmk5, przfight, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Prize Fight (0100299V, NSW/ACT)", MACHINE_FLAGS, layout_przfight ) // 578/4, B - 08/08/96
-GAMEL( 1998, qcash, aristmk5, aristmk5, kgalah, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Queens of Cash (0100706V, NSW/ACT)", MACHINE_FLAGS_NW, layout_kgalah ) // 603/6, C - 23/07/98, Rev 6
-GAMEL( 1997, qnile, aristmk5, aristmk5, qnile, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Queen of the Nile (0300439V, NSW/ACT)", MACHINE_FLAGS_NW, layout_qnile ) // 602/4, B - 13/05/97, Rev 7
-GAMEL( 1997, qnilea, qnile, aristmk5, qnile, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Queen of the Nile (0200439V, NSW/ACT)", MACHINE_FLAGS_NW, layout_qnile ) // 602/4, B - 13/05/97, Rev 7
-GAMEL( 1997, qnileb, qnile, aristmk5, qnile, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Queen of the Nile (0100439V, NSW/ACT)", MACHINE_FLAGS, layout_qnile ) // 602/4, B - 13/05/97, Rev 1.26.18.1
-GAMEL( 2002, qnilebr, qnile, aristmk5, goldpyrb, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Queen of the Nile (0101707V, Brazil)", MACHINE_FLAGS, layout_goldpyrb ) // MV4162, A - 21/08/02
-GAMEL( 1997, qnilec, qnile, aristmk5, qnilec, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Queen of the Nile (0300440V, NSW/ACT)", MACHINE_FLAGS_NW, layout_qnilec ) // 602/3, B - 13/05/97, Rev 5
-GAMEL( 1999, qniled, qnile, aristmk5, checkma5, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Queen of the Nile (0101139V, NSW/ACT)", MACHINE_FLAGS_NW, layout_qniled ) // 602/16, A - 11/10/99, Rev 14
-GAMEL( 2000, qnilenl, qnile, aristmk5, qnilenl, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Queen of the Nile (0301059V, Holland)", MACHINE_FLAGS, layout_qnilenl ) // 602/5, G - 10/04/00
-GAMEL( 1998, qnilenz, qnile, aristmk5, cashcatnz, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Queen of the Nile (0300785V, New Zealand)", MACHINE_FLAGS, layout_cashcatnz ) // MV4068, A - 31/8/98, Rev 20
-GAMEL( 1997, qnileu, qnile, aristmk5_usa, dolphntru, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Queen of the Nile (GHG4091-02, US)", MACHINE_FLAGS_NW, layout_aristmk5_us ) // MV4091, B - 13/05/97
-GAMEL( 1997, qnileua, qnile, aristmk5_usa, dolphntru, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Queen of the Nile (GHG4091-03, US)", MACHINE_FLAGS_NW, layout_aristmk5_us ) // MV4091, B - 13/05/97
-GAMEL( 1997, qnilev, qnile, aristmk5, aristmk5_9, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Queen of the Nile (04J00784, Venezuela)", MACHINE_FLAGS_NW, layout_dolphntrb ) // 602/3, B - 13/05/97, Rev 6
-GAMEL( 2001, qnilece, qnile, aristmk5_usa, dolphntrce, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Queen of the Nile - Cash Express (AHG1609, US)", MACHINE_FLAGS_NW, layout_adonisu ) // MV4091/1, A - 17/01/01
-GAMEL( 2001, qnilecea, qnile, aristmk5_usa, dolphntru, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Queen of the Nile - Cash Express (AHG1525, US)", MACHINE_FLAGS_NW, layout_qnilecea ) // MV4091, F - 17/01/01
-GAMEL( 2001, qnileceb, qnile, aristmk5_usa, dolphntru, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Queen of the Nile - Cash Express (AHG1608, US)", MACHINE_FLAGS_NW, layout_magimaska ) // MV4091, F - 17/01/01
-GAMEL( 1999, qnilemax, qnile, aristmk5_touch, trstrove, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Queen of the Nile - Maximillions (0401072V, NSW/ACT)", MACHINE_FLAGS_NW, layout_trstrove ) // 602/4, D - 18/06/99, Rev 14
-GAMEL( 1994, qtbird, aristmk5, aristmk5, qtbird, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Q.T. Bird (0500009V, NSW/ACT)", MACHINE_FLAGS, layout_qtbird ) // 581, A - 27/10/94, Rev 1.1.1.0
-GAMEL( 2000, rainwrce, aristmk5, aristmk5, adonisce, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Rainbow Warriors - Cash Express (0101332V, NSW/ACT)", MACHINE_FLAGS_NW, layout_aristmk5 ) // 655, B - 02/03/00, Rev 25
-GAMEL( 1998, reelpwr, aristmk5, aristmk5, wizways, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Reel Power (0100400V, NSW/ACT)", MACHINE_FLAGS, layout_wizways ) // 598/2, A - 01/11/96, Rev 1.23.8.0
-GAMEL( 1998, reelrock, aristmk5, aristmk5, reelrock, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Reelin-n-Rockin (0100779V, NSW/ACT)", MACHINE_FLAGS_NW, layout_reelrock ) // 628, A - 13/07/98, Rev 5
-GAMEL( 1997, retrsam, aristmk5, aristmk5, retrsam, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Return of the Samurai (0400549V, NSW/ACT)", MACHINE_FLAGS_NW, layout_sbuk3 ) // 608, A - 17/04/97, Rev 5
-GAMEL( 1997, retrsama, retrsam, aristmk5, retrsam, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Return of the Samurai (0200549V, NSW/ACT)", MACHINE_FLAGS, layout_sbuk3 ) // 608, A - 17/04/97, Rev 1.26.25.3
-GAMEL( 1997, retrsamb, retrsam, aristmk5, retrsamb, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Return of the Samurai (0200506V, NSW/ACT)", MACHINE_FLAGS, layout_retrsamb ) // 608, A - 17/04/97, Rev 1.26.25.3
-GAMEL( 1997, rushrst, aristmk5, aristmk5, rushrst, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Rushin Rooster (0100534V, NSW/ACT)", MACHINE_FLAGS, layout_cashchama ) // 596/3, C - 25/06/97, Rev 1.27.2.3
-GAMEL( 2001, sldeluxe, aristmk5, aristmk5_usa, bootsctnua, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Sweet Liberty Deluxe (AHG1575, US)", MACHINE_FLAGS_NW, layout_adonisu ) // MV4137, A - 11/02/01
-GAMEL( 1998, slvrwolf, aristmk5, aristmk5, wamazona, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Silver Wolf (0100673V, NSW/ACT)", MACHINE_FLAGS_NW, layout_wamazona ) // 621/2, A - 23/03/98, Rev 3
-GAMEL( 1996, snowcat, aristmk5, aristmk5, snowcat, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Snow Cat (0100405V, NSW/ACT)", MACHINE_FLAGS, layout_snowcat ) // 599, B - 23/12/96, Rev 1.25.1.0
-GAMEL( 1997, sumospin, aristmk5, aristmk5, swhr2, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Sumo Spins (0200606V, NSW/ACT)", MACHINE_FLAGS_NW, layout_swhr2 ) // 622, A - 08/12/97, Rev 4
-GAMEL( 1998, sbuk3, aristmk5, aristmk5, sbuk3, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Super Bucks III (0200711V, NSW/ACT)", MACHINE_FLAGS_NW, layout_sbuk3 ) // 626, A - 22/04/98, Rev 8
-GAMEL( 1998, sbuk3a, sbuk3, aristmk5, sbuk3, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Super Bucks III (0100711V, NSW/ACT)", MACHINE_FLAGS_NW, layout_sbuk3 ) // 626, A - 22/04/98, Rev 7
-GAMEL( 1995, swhr2, aristmk5, aristmk5, swhr2, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Sweethearts II (0200465V, NSW/ACT)", MACHINE_FLAGS_NW, layout_swhr2 ) // 577/1, C - 07/09/95, Rev 3
-GAMEL( 1995, swhr2a, swhr2, aristmk5, swhr2, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Sweethearts II (0200004V, NSW/ACT)", MACHINE_FLAGS, layout_swhr2 ) // 577/1, C - 07/09/95, Rev 1.1.3.0
-GAMEL( 1998, swhr2u, swhr2, aristmk5_usa, swhr2u, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Sweethearts II (PHG0742-02, US)", MACHINE_FLAGS_NW, layout_swhr2u ) // MV4061, A - 29/06/98
-GAMEL( 1995, swhr2v, swhr2, aristmk5, swhr2, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Sweethearts II (01J01986, Venezuela)", MACHINE_FLAGS_NW, layout_swhr2 ) // 577/1, C - 07/09/95, Rev 3
-GAMEL( 1996, thor, aristmk5, aristmk5, cashcham, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Thor (0200319V, NSW/ACT)", MACHINE_FLAGS, layout_cashcham ) // 569/12, B - 14/08/96, Rev 1.23.7.0
-GAMEL( 1996, thndh, aristmk5, aristmk5, snowcat, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Thunder Heart (0200333V, NSW/ACT)", MACHINE_FLAGS, layout_snowcat ) // 570/9, A - 14/08/96, Rev 1.23.6.0
-GAMEL( 1996, thndha, thndh, aristmk5, wildbill, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Thunder Heart (0200334V, NSW/ACT)", MACHINE_FLAGS, layout_wildbill ) // 597/1, A - 14/08/96, Rev 1.23.6.0
-GAMEL( 1997, topbana, aristmk5, aristmk5, wildbill, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Top Banana (0100550V, NSW/ACT)", MACHINE_FLAGS, layout_wildbill ) // 594/3, A - 18/08/97, Rev 1.26.39.2
-GAMEL( 1998, toutango, aristmk5, aristmk5, kgalah, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Toucan Tango (0100782V, NSW/ACT)", MACHINE_FLAGS_NW, layout_kgalah ) // 616/1, A - 17/06/98, Rev 16
-GAMEL( 1999, toutangonl, toutango, aristmk5, toutangonl, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Toucan Tango (0301388V, Holland)", MACHINE_FLAGS, layout_toutangonl ) // 616, C - 11/05/99
-GAMEL( 2000, trstrove, aristmk5, aristmk5, trstrove, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Treasure Trove (01J00161, NSW/ACT)", MACHINE_FLAGS_NW, layout_trstrove ) // JB001/3, A - 5/10/00, Rev 8
-GAMEL( 2002, tritreat, aristmk5, aristmk5, trstrove, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Triple Treat (0201692V, NSW/ACT)", MACHINE_FLAGS_NW, layout_tritreat ) // 692, A - 17/05/02, Rev 25
-GAMEL( 2001, trojhors, aristmk5, aristmk5, goldenra, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Trojan Horse (01J00851, NSW/ACT)", MACHINE_FLAGS_NW, layout_marmagic ) // JB001/5, A - 30/10/01, Rev 17
-GAMEL( 1996, trpdlght, aristmk5, aristmk5, swhr2, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Tropical Delight (0100269V, NSW/ACT)", MACHINE_FLAGS, layout_swhr2 ) // 577/3, B - 15/05/96, Rev 1.22.2.0
-GAMEL( 1997, trpdlghtu, trpdlght, aristmk5_usa, aristmk5_usa, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Tropical Delight (PHG0625-02, US)", MACHINE_FLAGS_NW, layout_aristmk5_us ) // 577/3, D - 24/09/97
-GAMEL( 1998, unicornd, aristmk5, aristmk5, aristmk5, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Unicorn Dreaming (0100791V, NSW/ACT)", MACHINE_FLAGS_NW, layout_aristmk5 ) // 631/1 A, A - 31/08/98, Rev 12
-GAMEL( 1998, unicornda, unicornd, aristmk5, aristmk5_9, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Unicorn Dreaming (0100813V, NSW/ACT)", MACHINE_FLAGS_NW, layout_dolphntrb ) // 631 A, A - 02/09/98, Rev 14
-GAMEL( 2000, unicorndnz, unicornd, aristmk5, unicorndnz, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Unicorn Dreaming (0101228V, New Zealand)", MACHINE_FLAGS, layout_aristmk5 ) // MV4113/1, A - 05/04/2000, Rev 27
-GAMEL( 2001, unicorndu, unicornd, aristmk5_usa, bootsctnua, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Unicorn Dreaming (BHG1584, US)", MACHINE_FLAGS_NW, layout_adonisu ) // MV4130/1, C - 10/17/01
-GAMEL( 2002, venicea5, aristmk5, aristmk5, goldenra, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Venice (02J02056, Venezuela)", MACHINE_FLAGS_NW, layout_venicea5 ) // JB009/2, B - 11/07/02, Rev 17
-GAMEL( 2001, wafricau, aristmk5, aristmk5_usa, aristmk5_usa, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Wild Africa (AHG1535, US)", MACHINE_FLAGS_NW, layout_magimaska ) // MV4076, B - 17/07/01
-GAMEL( 1996, wamazon, aristmk5, aristmk5, wamazon, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Wild Amazon (0200507V, NSW/ACT)", MACHINE_FLAGS_NW, layout_wamazon ) // 506/8, A - 10/10/96, Rev 3
-GAMEL( 1996, wamazona, wamazon, aristmk5, wamazona, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Wild Amazon (0200285V, NSW/ACT)", MACHINE_FLAGS, layout_wamazona ) // 506/6, A - 7/5/96, Rev 1.22.8.0
-GAMEL( 1996, wamazonv, wamazon, aristmk5, wamazon, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Wild Amazon (01J01996, Venezuela)", MACHINE_FLAGS_NW, layout_wamazon ) // 506/8, A - 10/10/96, Rev 3
-GAMEL( 1997, wikwin, aristmk5, aristmk5, wikwin, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Wicked Winnings (0100553V, NSW/ACT)", MACHINE_FLAGS_NW, layout_wikwin ) // 609, B - 01/07/97, Rev 1
-GAMEL( 1996, wldangel, aristmk5, aristmk5, swhr2, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Wild Angels (0100337V, NSW/ACT)", MACHINE_FLAGS, layout_swhr2 ) // 600, B - 24/09/96
-GAMEL( 1996, wildbill, aristmk5, aristmk5, wildbill, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Wild Bill (0100297V, NSW/ACT)", MACHINE_FLAGS, layout_wildbill ) // 543/8, C - 15/08/96, Rev 1.22.12.0
-GAMEL( 1996, wcougar, aristmk5, aristmk5, wcougar, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Wild Cougar (0100167V, NSW/ACT)", MACHINE_FLAGS, layout_wcougar ) // 569/9, B - 27/2/96, Rev 1.18.1.0
-GAMEL( 1997, wcougaru, wcougar, aristmk5_usa, aristmk5_usa, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Wild Cougar (NHG0296-04, US)", MACHINE_FLAGS_NW, layout_aristmk5_us ) // 569/8, D - 19/05/97
-GAMEL( 1997, wcougarua, wcougar, aristmk5_usa, aristmk5_usa, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Wild Cougar (NHG0296-07, US)", MACHINE_FLAGS_NW, layout_aristmk5_us ) // 569/8, D - 19/05/97
-GAMEL( 1997, wcougarub, wcougar, aristmk5_usa, aristmk5_usa, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Wild Cougar (NHG0296-99, US)", MACHINE_FLAGS_NW, layout_aristmk5_us ) // 569/8, D - 19/05/97
-GAMEL( 1997, wcougaruc, wcougar, aristmk5_usa, aristmk5_usa, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Wild Cougar (AHG1531, US)", MACHINE_FLAGS_NW, layout_magimaska ) // MV4055, B - 13/05/97
-GAMEL( 1996, wizways, aristmk5, aristmk5, wizways, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Wizard Ways (0200396V, NSW/ACT)", MACHINE_FLAGS_NW, layout_wizways ) // 598/3, A - 04/11/96, Rev 9
-GAMEL( 1997, wnpost, aristmk5, aristmk5_usa, wnpost, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Winning Post (RHG0418-04, US)", MACHINE_FLAGS_NW, layout_wnpost ) // 541/2, G - 11/02/97
-GAMEL( 1999, wthing, aristmk5, aristmk5, retrsam, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Wild Thing (0101158V, NSW/ACT)", MACHINE_FLAGS_NW, layout_sbuk3 ) // 608/4, B - 14/12/99, Rev 8
-GAMEL( 1999, wtiger, aristmk5, aristmk5, wtiger, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "White Tiger Classic (0200954V, NSW/ACT)", MACHINE_FLAGS_NW, layout_wtiger ) // 638/1, B - 08/07/99, Rev 13
-GAMEL( 2000, yukongl5, aristmk5, aristmk5, goldenra, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Yukon Gold (03J00191, NSW/ACT)", MACHINE_FLAGS_NW, layout_yukongl5 ) // JB005/1, A - 30/10/2000, Rev 17
+GAMEL( 1998, adonis, aristmk5, aristmk5, aristmk5, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Adonis (0200751V, NSW/ACT)", MACHINE_NOT_WORKING, layout_aristmk5 ) // 602/9, A - 25/05/98, Rev 10
+GAMEL( 1998, adonisa, adonis, aristmk5, aristmk5, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Adonis (0100751V, NSW/ACT)", MACHINE_NOT_WORKING, layout_aristmk5 ) // 602/9, A - 25/05/98, Rev 9
+GAMEL( 1999, adonisce, adonis, aristmk5, adonisce, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Adonis - Cash Express (0201005V, NSW/ACT)", MACHINE_NOT_WORKING, layout_aristmk5 ) // 602/9, C - 06/07/99, Rev 12
+GAMEL( 2001, adonisu, adonis, aristmk5_usa, bootsctnua, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Adonis (BHG1508, US)", MACHINE_NOT_WORKING, layout_adonisu ) // MV4124/1, B - 31/07/01
+GAMEL( 2002, alchemst, aristmk5, aristmk5, goldenra, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Alchemist (01J02046, Venezuela)", MACHINE_NOT_WORKING, layout_yukongl5 ) // JB013/1, A - 22/01/02, Rev 17
+GAMEL( 2000, bparty, aristmk5, aristmk5_usa_touch, bootsctnua, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Bachelorette Party (BHG1248, US)", MACHINE_NOT_WORKING, layout_bparty ) // MV4119/1, B - 25/08/2000
+GAMEL( 1996, baddog, aristmk5, aristmk5, baddog, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Bad Dog Poker (0200428V, NSW/ACT)", 0, layout_baddog ) // 386/56, A - 17/12/96
+GAMEL( 1998, bootsctn, aristmk5, aristmk5, cashcham, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Boot Scootin' (0100812V, NSW/ACT)", MACHINE_NOT_WORKING, layout_cashcham ) // 616/1, B - 11/12/98, Rev 20
+GAMEL( 1999, bootsctnu, bootsctn, aristmk5_usa, aristmk5_usa, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Boot Scootin' (GHG1012-02, US)", MACHINE_NOT_WORKING, layout_aristmk5_us ) // MV4098, A - 25/08/99
+GAMEL( 1999, bootsctnua, bootsctn, aristmk5_usa, pengpuck, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Boot Scootin' (GHG1008-03, US)", MACHINE_NOT_WORKING, layout_aristmk5_us_200 ) // MV4098/1, A - 27/07/99
+GAMEL( 2001, bootsctnub, bootsctn, aristmk5_usa, aristmk5_usa, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Boot Scootin' (AHG1547, US)", MACHINE_NOT_WORKING, layout_adonisu ) // MV4098/1, B - 22/03/01
+GAMEL( 1996, bumblbug, aristmk5, aristmk5, swhr2, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Bumble Bugs (0200510V, NSW/ACT)", MACHINE_NOT_WORKING, layout_swhr2 ) // 593, D - 5/07/96, Rev 3
+GAMEL( 1996, bumblbugql, bumblbug, aristmk5, swhr2, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Bumble Bugs (0200456V, Queensland)", MACHINE_NOT_WORKING, layout_swhr2 ) // 593, D - 5/07/96, Rev 1.0
+GAMEL( 1997, bumblbugu, bumblbug, aristmk5_usa, aristmk5_usa, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Bumble Bugs (CHG0479-03, US)", MACHINE_NOT_WORKING, layout_aristmk5_us ) // 593, D - 05/07/97
+GAMEL( 1997, bumblbugua, bumblbug, aristmk5_usa, aristmk5_usa, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Bumble Bugs (CHG0479-99, US)", MACHINE_NOT_WORKING, layout_aristmk5_us ) // 593, D - 05/07/97
+GAMEL( 1995, buttdeli, aristmk5, aristmk5, swhr2, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Butterfly Delight (0200143V, NSW/ACT)", 0, layout_swhr2 ) // 571/4, A - 19/12/95, Rev 1.8.1.0
+GAMEL( 1998, cashcat, aristmk5, aristmk5, aristmk5, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Cash Cat (0100676V, NSW/ACT)", MACHINE_NOT_WORKING, layout_aristmk5 ) // 614/3, A - 03/04/98, Rev 7
+GAMEL( 1997, cashcata, cashcat, aristmk5, aristmk5_9, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Cash Cat (0100557V, NSW/ACT)", MACHINE_NOT_WORKING, layout_dolphntrb ) // 614/1, B - 01/12/97, Rev 7
+GAMEL( 1999, cashcatnz, cashcat, aristmk5, cashcatnz, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Cash Cat (0300863V, New Zealand)", 0, layout_cashcatnz ) // MV4089, A - 4/1/99, Rev 26
+GAMEL( 1997, cashcham, aristmk5, aristmk5, cashcham, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Cash Chameleon (0100438V, NSW/ACT)", 0, layout_cashcham ) // 603/1, C - 15/4/97, Rev 1.25.3.0
+GAMEL( 1998, cashchama, cashcham, aristmk5, cashchama, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Cash Chameleon (0200437V, NSW/ACT)", MACHINE_NOT_WORKING, layout_cashchama ) // 603(a), D - 18/02/98, Rev 3
+GAMEL( 1998, cashchamnz, cashcham, aristmk5, cashchamnz, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Cash Chameleon (0300781V, New Zealand)", 0, layout_cashchamnz ) // MV4067, A - 31/08/98, Rev 21
+GAMEL( 1996, cashchamu, cashcham, aristmk5_usa, bootsctnua, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Cash Chameleon (DHG4078-99, US)", MACHINE_NOT_WORKING, layout_cashchamu ) // 603(a), B - 06/12/96
+GAMEL( 1997, cashcra5, aristmk5, aristmk5, aristmk5, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Cash Crop (0300467V, NSW/ACT)", MACHINE_NOT_WORKING, layout_aristmk5 ) // 607, C - 14/07/97, Rev 6
+GAMEL( 1998, chariotc, aristmk5, aristmk5, chariotc, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "The Chariot Challenge (0100787V, NSW/ACT)", MACHINE_NOT_WORKING, layout_aristmk5 ) // 630/1, A - 10/08/98, Rev 11
+GAMEL( 1998, chariotcv, chariotc, aristmk5, chariotcv, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "The Chariot Challenge (04J00714, Venezuela)", MACHINE_NOT_WORKING, layout_snowcat ) // 630, A - 10/08/98, Rev 12
+GAMEL( 2001, checkma5, aristmk5, aristmk5, checkma5, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Checkmate (01J00681, NSW/ACT)", MACHINE_NOT_WORKING, layout_checkma5 ) // JB011, B - 06/07/01, Rev 17
+GAMEL( 1996, chickna5, aristmk5, aristmk5, chickna5, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Chicken (0100351V, NSW/ACT)", 0, layout_snowcat ) // 596, A - 27/08/96, Rev 1.24
+GAMEL( 1998, chickna5ql, chickna5, aristmk5, chickna5, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Chicken (0200530V, Queensland)", MACHINE_NOT_WORKING, layout_snowcat ) // 596, C - 23/02/98, Rev 1.0
+GAMEL( 1998, chickna5u, chickna5, aristmk5_usa, chickna5u, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Chicken (RHG0730-03, US)", MACHINE_NOT_WORKING, layout_aristmk5_us ) // 596, C - 23/02/98
+GAMEL( 1998, chickna5ua, chickna5, aristmk5_usa, chickna5u, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Chicken (RHG0730-99, US)", MACHINE_NOT_WORKING, layout_aristmk5_us ) // 596, C - 23/02/98
+GAMEL( 1998, coralrc2, aristmk5, aristmk5, coralrc2, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Coral Riches II (0100919V, NSW/ACT)", MACHINE_NOT_WORKING, layout_coralrc2 ) // 577/7, A - 29/12/98, Rev 12
+GAMEL( 1998, cuckoo, aristmk5, aristmk5, aristmk5, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Cuckoo (0200753V, NSW/ACT)", MACHINE_NOT_WORKING, layout_aristmk5 ) // 615/1, D - 03/07/98, Rev 6
+GAMEL( 2000, cuckoou, cuckoo, aristmk5_usa, aristmk5_usa, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Cuckoo (CHG1195, US)", MACHINE_NOT_WORKING, layout_cuckoou ) // MV4104, C - 02/02/00
+GAMEL( 1995, dstbloom, aristmk5, aristmk5, wcougar, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Desert Bloom (0300111V, NSW/ACT)", 0, layout_wcougar ) // 577/2, A - 12/10/95, Rev 1.16.4.0
+GAMEL( 1995, dstblooma, dstbloom, aristmk5, wcougar, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Desert Bloom (0200111V, NSW/ACT)", 0, layout_wcougar ) // 577/2, A - 12/10/95, Rev 1.16.4.0
+GAMEL( 1999, diamdove, aristmk5, aristmk5, retrsam, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Diamond Dove (0101018V, NSW/ACT)", MACHINE_NOT_WORKING, layout_sbuk3 ) // 640, B - 19/05/99, Rev 8
+GAMEL( 1996, dmdfever, aristmk5, aristmk5, wildbill, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Diamond Fever (0200302V, NSW/ACT)", 0, layout_wildbill ) // 483/7, E - 05/09/96, Rev 1.23.5.0
+GAMEL( 1997, dimtouch, aristmk5, aristmk5_touch, dimtouch, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Diamond Touch (0400433V, NSW/ACT)", MACHINE_NOT_WORKING, layout_dimtouch ) // 604, E - 30/06/97, Rev 17
+GAMEL( 1996, dolphntr, aristmk5, aristmk5, aristmk5, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Dolphin Treasure (0200424V, NSW/ACT)", MACHINE_NOT_WORKING, layout_aristmk5 ) // 602/1, B - 06/12/96, Rev 3
+GAMEL( 1996, dolphntra, dolphntr, aristmk5, aristmk5, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Dolphin Treasure (0100424V, NSW/ACT)", 0, layout_aristmk5 ) // 602/1, B - 06/12/96, Rev 1.24.4.0
+GAMEL( 1996, dolphntrb, dolphntr, aristmk5, aristmk5_9, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Dolphin Treasure (0100388V, NSW/ACT)", 0, layout_dolphntrb ) // 602, B - 10/12/96, Rev 1.24.4.0
+GAMEL( 1996, dolphntru, dolphntr, aristmk5_usa, dolphntru, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Dolphin Treasure (FHG4077-02, US)", MACHINE_NOT_WORKING, layout_aristmk5_us ) // 602/1, B - 06/12/96
+GAMEL( 1999, dolphntrce, dolphntr, aristmk5_usa, dolphntrce, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Dolphin Treasure - Cash Express (AHG1607, US)", MACHINE_NOT_WORKING, layout_adonisu ) // MV4090, D - 22/12/99
+GAMEL( 1999, dolphntrcea, dolphntr, aristmk5_usa, dolphntru, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Dolphin Treasure - Cash Express (AHG1606, US)", MACHINE_NOT_WORKING, layout_magimaska ) // MV4090, D - 22/12/99
+GAMEL( 1999, dolphntrceb, dolphntr, aristmk5_usa, dolphntrce, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Dolphin Treasure - Cash Express (AHG1519, US)", MACHINE_NOT_WORKING, layout_dolphntrceb ) // MV4090, D - 22/12/99
+GAMEL( 1997, drgneye, aristmk5, aristmk5, snowcat, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Dragon's Eye (0100521V, NSW/ACT)", 0, layout_snowcat ) // 610, A - 09/05/97, Rev 1.27
+GAMEL( 1997, dreamwv, aristmk5, aristmk5_touch, dreamwv, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Dream Weaver (0200586V, NSW/ACT)", MACHINE_NOT_WORKING, layout_dreamwv ) // 606/2, A - 20/06/97, Rev 16
+GAMEL( 2000, dynajack, aristmk5, aristmk5, dynajack, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Dynamite Jack (01J00081, NSW/ACT)", MACHINE_NOT_WORKING, layout_dynajack ) // JB004, A - 12/07/2000, Rev 17
+GAMEL( 1998, eldorda5, aristmk5, aristmk5, reelrock, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "El Dorado (0100652V, NSW/ACT)", MACHINE_NOT_WORKING, layout_reelrock ) // 623, B - 24/03/98, Rev 3
+GAMEL( 1995, eforsta5, aristmk5, aristmk5, swhr2, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Enchanted Forest (0400122V, NSW/ACT)", 0, layout_swhr2 ) // 570/3, E - 23/06/95, Rev 1.18
+GAMEL( 1997, eforsta5u, eforsta5, aristmk5_usa, aristmk5_usa, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Enchanted Forest (JHG0415-03, US)", MACHINE_NOT_WORKING, layout_aristmk5_us ) // MV4033, B - 10/02/97
+GAMEL( 1997, eforsta5ua, eforsta5, aristmk5_usa, aristmk5_usa, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Enchanted Forest (JHG0415-99, US)", MACHINE_NOT_WORKING, layout_aristmk5_us ) // MV4033, B - 10/02/97
+GAMEL( 2000, eforsta5cea, eforsta5, aristmk5_usa, aristmk5_usa, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Enchanted Forest - Cash Express (AHG1615, US)", MACHINE_NOT_WORKING, layout_magimaska ) // MV4108/6, C - 17/01/00
+GAMEL( 1998, fastfort, aristmk5, aristmk5, wildbill, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Fast Fortune (0100651V, NSW/ACT)", MACHINE_NOT_WORKING, layout_wildbill ) // 624, D - 07/05/98, Rev 5
+GAMEL( 2000, fortellr, aristmk5, aristmk5, goldenra, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Fortune Teller (01J00131, NSW/ACT)", MACHINE_NOT_WORKING, layout_fortellr ) // JB006, D - 24/11/2000, Rev 17
+GAMEL( 1998, gambler, aristmk5, aristmk5_usa, aristmk5_usa, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "The Gambler (EHG0916-02, US)", MACHINE_NOT_WORKING, layout_aristmk5_us ) // MV4084/1, A - 30/10/98
+GAMEL( 2001, geisha, aristmk5, aristmk5, geisha, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Geisha (0101408V, New Zealand)", 0, layout_geisha ) // MV4127, A - 05/03/01, Rev 25
+GAMEL( 1999, genmagi, aristmk5, aristmk5_touch, genmagi, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Genie Magic (0200894V, NSW/ACT)", MACHINE_NOT_WORKING, layout_genmagi ) // 632/1, C - 15/02/99, Rev 20
+GAMEL( 2001, glizrdce, aristmk5, aristmk5_usa, bootsctnua, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Green Lizard - Cash Express (AHG1623, US)", MACHINE_NOT_WORKING, layout_adonisu ) // MV4112/2 - A - 05/01/01
+GAMEL( 1998, gnomeatw, aristmk5, aristmk5, kgalah, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Gnome Around The World (0100767V, NSW/ACT)", MACHINE_NOT_WORKING, layout_kgalah ) // 625, C - 18/12/98, Rev 16
+GAMEL( 1997, goldpyr, aristmk5, aristmk5_usa, dolphntru, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Golden Pyramids (AHG1205-03, US)", MACHINE_NOT_WORKING, layout_aristmk5_us ) // MV4091, B - 13/05/97
+GAMEL( 1997, goldpyra, goldpyr, aristmk5_usa, bootsctnua, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Golden Pyramids (AHG1206-99, US)", MACHINE_NOT_WORKING, layout_aristmk5_us_200 ) // 602/2, B - 13/05/97
+GAMEL( 1998, goldpyrb, goldpyr, aristmk5, goldpyrb, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Golden Pyramids (0100878V, Victoria)", MACHINE_NOT_WORKING, layout_goldpyrb ) // 602/5, C - 19/06/98
+GAMEL( 2000, goldenra, aristmk5, aristmk5, goldenra, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Golden Ra (0101164V, NSW/ACT)", MACHINE_NOT_WORKING, layout_goldenra ) // 661, A - 10/04/00, Rev 15
+GAMEL( 2001, hnktonku, aristmk5, aristmk5_usa, aristmk5_usa, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Honky Tonk (BHG1455, US)", MACHINE_NOT_WORKING, layout_magimaska ) // MV4122/3, A - 07/08/01
+GAMEL( 2000, honeypot, aristmk5, aristmk5, goldenra, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Honey Pot (03J00241, NSW/ACT)", MACHINE_NOT_WORKING, layout_yukongl5 ) // JB008, A - 21/11/2000, Rev 17
+GAMEL( 1999, incasun, aristmk5, aristmk5, incasun, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Inca Sun (0100872V, NSW/ACT)", MACHINE_NOT_WORKING, layout_incasun ) // 631/3 B, B - 03/05/99, Rev 15
+GAMEL( 1999, incasunsp, incasun, aristmk5, incasun, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Inca Sun (0100872V, NSW/ACT, Show Program)", MACHINE_NOT_WORKING, layout_incasun ) // 631/3 B, B - 03/05/99, Rev 15
+GAMEL( 2000, incasunnz, incasun, aristmk5, incasunnz, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Inca Sun (0101108V, New Zealand)", 0, layout_incasunnz ) // MV4113, A - 6/3/00, Rev 25
+GAMEL( 2000, incasunu, incasun, aristmk5_usa, dolphntrce, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Inca Sun (CHG1458, US)", MACHINE_NOT_WORKING, layout_adonisu ) // MV4130/3, A - 05/09/00
+GAMEL( 2000, incasunua, incasun, aristmk5_usa, bootsctnua, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Inca Sun (DHG1577, US)", MACHINE_NOT_WORKING, layout_adonisu ) // MV4130, A - 05/09/00
+GAMEL( 1999, incasunv, incasun, aristmk5, incasun, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Inca Sun (01J01946, Venezuela)", MACHINE_NOT_WORKING, layout_incasun ) // 631/3 B, B- 03/05/99, Rev 15
+GAMEL( 1998, indrema5, aristmk5, aristmk5, indrema5, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Indian Dreaming (0100845V, NSW/ACT)", MACHINE_NOT_WORKING, layout_indrema5 ) // 628/1, B - 15/12/98, Rev 7
+GAMEL( 1996, jumpjoey, aristmk5, aristmk5, cashcham, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Jumpin' Joey (0100383V, NSW/ACT)", 0, layout_cashcham ) // 586/6, C - 13/11/96
+GAMEL( 1996, jungjuic, aristmk5, aristmk5, jungjuic, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Jungle Juice (0200240V, New Zealand)", MACHINE_NOT_WORKING, layout_jungjuic ) // 566/3, F - 06/03/96
+GAMEL( 1995, kgalah, aristmk5, aristmk5, kgalah, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "King Galah (0200536V, NSW/ACT)", MACHINE_NOT_WORKING, layout_kgalah ) // 613/6, A - 21/07/95
+GAMEL( 1995, kgalaha, kgalah, aristmk5, kgalah, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "King Galah (0100536V, NSW/ACT)", 0, layout_kgalah ) // 613, A - 21/07/95
+GAMEL( 2001, kgalahce, kgalah, aristmk5_usa, bootsctnua, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "King Galah - Cash Express (AHG1625, US)", MACHINE_NOT_WORKING, layout_adonisu ) // MV4112/2, B - 07/02/01
+GAMEL( 1994, kgbirda5, aristmk5, aristmk5, kgbirda5, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "K.G. Bird (0200024V, NSW/ACT)", 0, layout_kgbirda5 ) // 540/3, D - 10/10/94
+GAMEL( 2001, koalamnt, aristmk5, aristmk5_usa, dolphntrce, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Koala Mint (CHG1573, US)", MACHINE_NOT_WORKING, layout_adonisu ) // MV4137, A - 12/09/01
+GAMEL( 1998, kookabuk, aristmk5, aristmk5, aristmk5, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Kooka Bucks (0100677V, NSW/ACT)", MACHINE_NOT_WORKING, layout_aristmk5 ) // 661, A - 03/04/98, Rev 5
+GAMEL( 2000, kyhatonu, aristmk5, aristmk5_usa_touch, bootsctnua, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Keep Your Hat On (BHG1204, US)", MACHINE_NOT_WORKING, layout_bparty ) // MV4114/1, B - 08/05/2000
+GAMEL( 1997, locoloot, aristmk5, aristmk5, cashcham, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Loco Loot (0100473V, NSW/ACT)", 0, layout_cashcham ) // 599/3, C - 17/06/97, Rev 1.26.13.0
+GAMEL( 1997, locoloota, locoloot, aristmk5, locoloota, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Loco Loot (0100472V, NSW/ACT)", 0, layout_locoloota ) // 599/2, C - 17/06/97, Rev 1.26.13.0
+GAMEL( 1998, locolootnz, locoloot, aristmk5, cashchamnz, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Loco Loot (0600725V, New Zealand)", 0, layout_cashchamnz ) // MV4064, A - 8/7/98, Rev 24
+GAMEL( 2001, locolootu, locoloot, aristmk5_usa, bootsctnua, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Loco Loot (AHG1513, US)", MACHINE_NOT_WORKING, layout_adonisu ) // MV4134, A - 30/07/01
+GAMEL( 1997, lonewolf, aristmk5, aristmk5, wildbill, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Lone Wolf (0100587V, NSW/ACT)", 0, layout_wildbill ) // 621, A - 29/10/97, Rev 1.27.17.0
+GAMEL( 1995, luckyclo, aristmk5, aristmk5, wcougar, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Lucky Clover (0300109V, NSW/ACT)", 0, layout_wcougar ) // 570/6, A - 12/10/95
+GAMEL( 2000, magimask, aristmk5, aristmk5_usa_touch, bootsctnua, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Magic Mask (AHG1549, US)", MACHINE_NOT_WORKING, layout_adonisu ) // MV4115_1, A - 09/05/00
+GAMEL( 2000, magimaska, magimask, aristmk5_usa_touch, aristmk5_usa, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Magic Mask (AHG1548, US)", MACHINE_NOT_WORKING, layout_magimaska ) // MV4115, A - 09/05/00
+GAMEL( 2000, magimaskb, magimask, aristmk5_usa_touch, aristmk5_usa, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Magic Mask (DHG1309, US)", MACHINE_NOT_WORKING, layout_magimaska ) // MV4115, A - 09/05/00
+GAMEL( 1997, magtcha5, aristmk5, aristmk5_touch, dimtouch, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Magic Touch (0300455V, NSW/ACT)", MACHINE_NOT_WORKING, layout_dimtouch ) // 606, A - 06/03/97, Rev 14
+GAMEL( 1997, magtcha5a, magtcha5, aristmk5_touch, dimtouch, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Magic Touch (0200455V, NSW/ACT)", MACHINE_NOT_WORKING, layout_dimtouch ) // 606, A - 06/03/97, Rev 14
+GAMEL( 1997, mammothm, aristmk5, aristmk5, kgalah, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Mammoth Money (0100425V, NSW/ACT)", 0, layout_kgalah ) // 595/5, D - 07/04/97, Rev 1.22.14.1
+GAMEL( 2000, marmagic, aristmk5, aristmk5, goldenra, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Margarita Magic (01J00101, NSW/ACT)", MACHINE_NOT_WORKING, layout_marmagic ) // JB005, A - 07/07/00, Rev 17
+GAMEL( 2000, marmagicu, marmagic, aristmk5_usa, aristmk5_usa, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Margarita Magic (EHG1558, US)", MACHINE_NOT_WORKING, layout_magimaska ) // US003, 07/07/2000
+GAMEL( 2000, marmagicua, marmagic, aristmk5_usa, bootsctnua, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Margarita Magic (EHG1559, US)", MACHINE_NOT_WORKING, layout_adonisu ) // US003, A - 07/07/00
+GAMEL( 1997, mgarden, aristmk5, aristmk5_usa, aristmk5_usa, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Magic Garden (AHG1211-99, US)", MACHINE_NOT_WORKING, layout_aristmk5_us ) // MV4033, B - 10/02/97
+GAMEL( 1996, minemine, aristmk5, aristmk5, swhr2, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Mine, Mine, Mine (0400115V, NSW/ACT)", 0, layout_swhr2 ) // 559/2, D - 16/01/96, Rev 1.18.3.0
+GAMEL( 1996, minemineu, minemine, aristmk5_usa, aristmk5_usa, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Mine, Mine, Mine (VHG0416-99, US)", MACHINE_NOT_WORKING, layout_aristmk5_us ) // 559/2, E - 14/02/96
+GAMEL( 1996, minemineua, minemine, aristmk5_usa, aristmk5_usa, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Mine, Mine, Mine (NHG0416-99, US)", MACHINE_NOT_WORKING, layout_aristmk5_us ) // 559/2, E - 14/02/96
+GAMEL( 1997, monmouse, aristmk5, aristmk5, cashcham, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Money Mouse (0400469V, NSW/ACT)", MACHINE_NOT_WORKING, layout_cashcham ) // 607/1, B - 08/04/97, Rev 6
+GAMEL( 1997, monmousea, monmouse, aristmk5, cashcham, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Money Mouse (0300469V, NSW/ACT)", MACHINE_NOT_WORKING, layout_cashcham ) // 607/1, B - 08/04/97, Rev 6
+GAMEL( 2001, montree, aristmk5, aristmk5, montree, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Money Tree (0201397V, New Zealand)", 0, layout_montree ) // MV4126, C - 12/04/01, Rev 5
+GAMEL( 1996, mountmon, aristmk5, aristmk5, mountmon, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Mountain Money (0100294V, NSW/ACT)", 0, layout_mountmon ) // 595/3, B - 11/06/96, Rev 1.22.5.0
+GAMEL( 1996, mountmona, mountmon, aristmk5, mystgard, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Mountain Money (0100289V, NSW/ACT)", 0, layout_mystgard ) // 595/2, C - 11/06/96, Rev 1.22.5.0
+GAMEL( 2001, mountmonua, mountmon, aristmk5_usa, aristmk5_usa, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Mountain Money (BHG1464, US)", MACHINE_NOT_WORKING, layout_magimaska ) // MV4108/5, A - 10/03/01
+GAMEL( 2000, multidrw, aristmk5, aristmk5, multidrw, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Multidraw - Free Games (0200956V, NSW/ACT)", MACHINE_NOT_WORKING, layout_multidrw ) // 386/64, E - 08/05/00, Rev 17
+GAMEL( 1996, mystgard, aristmk5, aristmk5, mystgard, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Mystic Garden (0100275V, NSW/ACT)", 0, layout_mystgard ) // 595/1, B - 11/06/96, Rev 1.22
+GAMEL( 2001, one4all, aristmk5, aristmk5, one4all, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "One For All (0101503V, New Zealand)", 0, layout_one4all ) // MV4141, A - 28/05/01, Rev 11
+GAMEL( 1999, orchidms, aristmk5, aristmk5, orchidms, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Orchid Mist (0200849V, NSW/ACT)", MACHINE_NOT_WORKING, layout_orchidms ) // 601/3, C - 03/02/99, Rev 8
+GAMEL( 1999, orchidmsa, orchidms, aristmk5, orchidms, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Orchid Mist (0100849V, NSW/ACT)", MACHINE_NOT_WORKING, layout_orchidms ) // 601/3, C - 03/02/99, Rev 6
+GAMEL( 2000, orchidmsnz, orchidms, aristmk5, orchidmsnz, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Orchid Mist (0101241V, New Zealand)", 0, layout_orchidmsnz ) // MV4118, A - 3/7/00, Rev 30
+GAMEL( 1996, oscara5, aristmk5, aristmk5, aristmk5_9, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Oscar (0200348V, NSW/ACT)", MACHINE_NOT_WORKING, layout_dolphntrb ) // 593/2, C - 20/09/96, Rev 3
+GAMEL( 1996, oscara5a, oscara5, aristmk5, aristmk5_9, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Oscar (0100348V, NSW/ACT)", 0, layout_dolphntrb ) // 593/2, C - 20/09/96, Rev 1.23.9.1
+GAMEL( 1999, pantmag, aristmk5, aristmk5, kgalah, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Panther Magic (0101046V, NSW/ACT)", MACHINE_NOT_WORKING, layout_pantmag ) // 594/7, A - 06/10/99, Rev 16
+GAMEL( 1999, pantmaga, pantmag, aristmk5, pantmaga, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Panther Magic (0100716V, NSW/ACT)", MACHINE_NOT_WORKING, layout_pantmaga ) // 594/4, A - 13/05/98, Rev 9
+GAMEL( 2001, partygrs, aristmk5, aristmk5_usa_touch, aristmk5_usa, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Party Gras (AHG1567, US)", MACHINE_NOT_WORKING, layout_magimaska ) // MV4115/6, A - 10/11/01
+GAMEL( 2001, partygrsa, partygrs, aristmk5_usa_touch, bootsctnua, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Party Gras (BHG1284, US)", MACHINE_NOT_WORKING, layout_bparty ) // MV4115/3, B - 06/02/01
+GAMEL( 2000, peaflut, aristmk5, aristmk5, trstrove, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Peacock Flutter (02J00011, NSW/ACT)", MACHINE_NOT_WORKING, layout_trstrove ) // JB001, A - 10/03/00, Rev 8
+GAMEL( 1997, pengpay, aristmk5, aristmk5, cashchama, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Penguin Pays (0200460V, NSW/ACT)", MACHINE_NOT_WORKING, layout_cashchama ) // 586/4(a), D - 03/06/97, Rev 3
+GAMEL( 1996, pengpaya, pengpay, aristmk5, cashchama, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Penguin Pays (0200357V, NSW/ACT)", 0, layout_cashchama ) // 586/4, C - 12/11/96
+GAMEL( 1997, pengpayb, pengpay, aristmk5, swhr2, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Penguin Pays (0200359V, NSW/ACT)", MACHINE_NOT_WORKING, layout_swhr2 ) // 586/3(a), D - 03/06/97, Rev 4
+GAMEL( 1995, pengpayc, pengpay, aristmk5, wcougar, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Penguin Pays (0200113V, NSW/ACT)", 0, layout_wcougar ) // 586, A - 12/10/95
+GAMEL( 1997, pengpayu, pengpay, aristmk5_usa, aristmk5_usa, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Penguin Pays (BHI0417-03, US)", MACHINE_NOT_WORKING, layout_aristmk5_us ) // 586/7(b), B - 14/07/97
+GAMEL( 1997, pengpayua, pengpay, aristmk5_usa, aristmk5_usa, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Penguin Pays (OHG0417-03, US)", MACHINE_NOT_WORKING, layout_aristmk5_us ) // 586/7(b), B - 14/07/97
+GAMEL( 1997, pengpayub, pengpay, aristmk5_usa, aristmk5_usa, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Penguin Pays (OHG0417-02, US)", MACHINE_NOT_WORKING, layout_aristmk5_us ) // 586/7(b), B - 14/07/97
+GAMEL( 2001, pengpayce, pengpay, aristmk5_usa, aristmk5_usa, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Penguin Pays - Cash Express (AHG1544, US)", MACHINE_NOT_WORKING, layout_qnilecea ) // MV4122, C - 19/01/01
+GAMEL( 2001, pengpuck, pengpay, aristmk5_usa, pengpuck, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Penguin Pays - Penguin Pucks (EHG1257, US)", MACHINE_NOT_WORKING, layout_pengpuck ) // MV4122/1, C - 19/01/01
+GAMEL( 1998, penpir, aristmk5, aristmk5, kgalah, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Penguin Pirate (0100674V, NSW/ACT)", MACHINE_NOT_WORKING, layout_kgalah ) // 619/1, A - 31/03/98, Rev 10
+GAMEL( 1998, penpira, penpir, aristmk5, snowcat, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Penguin Pirate (0200578V, NSW/ACT)", MACHINE_NOT_WORKING, layout_snowcat ) // 619, A - 27/02/98, Rev 8
+GAMEL( 1998, penpir2, aristmk5, aristmk5, penpir2, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Penguin Pirate II (0100869V, Victoria)", MACHINE_NOT_WORKING, layout_penpir2 ) // 619/3, A - 17/12/98
+GAMEL( 1998, petshop, aristmk5, aristmk5, petshop, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Pet Shop (0100731V, NSW/ACT)", MACHINE_NOT_WORKING, layout_petshop ) // 618/1, A - 17/04/98, Rev 13
+GAMEL( 1995, phantpay, aristmk5, aristmk5, swhr2, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Phantom Pays (0500005V, NSW/ACT)", 0, layout_swhr2 ) // 570/1, E - 12/09/95
+GAMEL( 1996, przfight, aristmk5, aristmk5, przfight, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Prize Fight (0100299V, NSW/ACT)", 0, layout_przfight ) // 578/4, B - 08/08/96
+GAMEL( 1998, qcash, aristmk5, aristmk5, kgalah, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Queens of Cash (0100706V, NSW/ACT)", MACHINE_NOT_WORKING, layout_kgalah ) // 603/6, C - 23/07/98, Rev 6
+GAMEL( 1997, qnile, aristmk5, aristmk5, qnile, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Queen of the Nile (0300439V, NSW/ACT)", MACHINE_NOT_WORKING, layout_qnile ) // 602/4, B - 13/05/97, Rev 7
+GAMEL( 1997, qnilea, qnile, aristmk5, qnile, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Queen of the Nile (0200439V, NSW/ACT)", MACHINE_NOT_WORKING, layout_qnile ) // 602/4, B - 13/05/97, Rev 7
+GAMEL( 1997, qnileb, qnile, aristmk5, qnile, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Queen of the Nile (0100439V, NSW/ACT)", 0, layout_qnile ) // 602/4, B - 13/05/97, Rev 1.26.18.1
+GAMEL( 2002, qnilebr, qnile, aristmk5, goldpyrb, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Queen of the Nile (0101707V, Brazil)", 0, layout_goldpyrb ) // MV4162, A - 21/08/02
+GAMEL( 1997, qnilec, qnile, aristmk5, qnilec, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Queen of the Nile (0300440V, NSW/ACT)", MACHINE_NOT_WORKING, layout_qnilec ) // 602/3, B - 13/05/97, Rev 5
+GAMEL( 1999, qniled, qnile, aristmk5, checkma5, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Queen of the Nile (0101139V, NSW/ACT)", MACHINE_NOT_WORKING, layout_qniled ) // 602/16, A - 11/10/99, Rev 14
+GAMEL( 2001, qnilefl, qnile, aristmk5, trstrove, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Queen of the Nile - Fast Lane (0101670V, Queensland)", MACHINE_NOT_WORKING, layout_trstrove ) // 602/4, E - 17/08/01
+GAMEL( 2000, qnilenl, qnile, aristmk5, qnilenl, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Queen of the Nile (0301059V, Holland)", 0, layout_qnilenl ) // 602/5, G - 10/04/00
+GAMEL( 1998, qnilenz, qnile, aristmk5, cashcatnz, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Queen of the Nile (0300785V, New Zealand)", 0, layout_cashcatnz ) // MV4068, A - 31/8/98, Rev 20
+GAMEL( 1999, qnileql, qnile, aristmk5, trstrove, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Queen of the Nile (0201200V, Queensland)", MACHINE_NOT_WORKING, layout_trstrove ) // 602/4, D - 18/06/99
+GAMEL( 1997, qnileu, qnile, aristmk5_usa, dolphntru, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Queen of the Nile (GHG4091-02, US)", MACHINE_NOT_WORKING, layout_aristmk5_us ) // MV4091, B - 13/05/97
+GAMEL( 1997, qnileua, qnile, aristmk5_usa, dolphntru, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Queen of the Nile (GHG4091-03, US)", MACHINE_NOT_WORKING, layout_aristmk5_us ) // MV4091, B - 13/05/97
+GAMEL( 1997, qnilev, qnile, aristmk5, aristmk5_9, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Queen of the Nile (04J00784, Venezuela)", MACHINE_NOT_WORKING, layout_dolphntrb ) // 602/3, B - 13/05/97, Rev 6
+GAMEL( 2001, qnilece, qnile, aristmk5_usa, dolphntrce, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Queen of the Nile - Cash Express (AHG1609, US)", MACHINE_NOT_WORKING, layout_adonisu ) // MV4091/1, A - 17/01/01
+GAMEL( 2001, qnilecea, qnile, aristmk5_usa, dolphntru, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Queen of the Nile - Cash Express (AHG1525, US)", MACHINE_NOT_WORKING, layout_qnilecea ) // MV4091, F - 17/01/01
+GAMEL( 2001, qnileceb, qnile, aristmk5_usa, dolphntru, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Queen of the Nile - Cash Express (AHG1608, US)", MACHINE_NOT_WORKING, layout_magimaska ) // MV4091, F - 17/01/01
+GAMEL( 1999, qnilemax, qnile, aristmk5_touch, trstrove, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Queen of the Nile - Maximillions (0401072V, NSW/ACT)", MACHINE_NOT_WORKING, layout_trstrove ) // 602/4, D - 18/06/99, Rev 14
+GAMEL( 1994, qtbird, aristmk5, aristmk5, qtbird, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Q.T. Bird (0500009V, NSW/ACT)", 0, layout_qtbird ) // 581, A - 27/10/94, Rev 1.1.1.0
+GAMEL( 2000, rainwrce, aristmk5, aristmk5, adonisce, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Rainbow Warriors - Cash Express (0101332V, NSW/ACT)", MACHINE_NOT_WORKING, layout_aristmk5 ) // 655, B - 02/03/00, Rev 25
+GAMEL( 1998, reelpwr, aristmk5, aristmk5, wizways, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Reel Power (0100400V, NSW/ACT)", 0, layout_wizways ) // 598/2, A - 01/11/96, Rev 1.23.8.0
+GAMEL( 1998, reelrock, aristmk5, aristmk5, reelrock, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Reelin-n-Rockin (0100779V, NSW/ACT)", MACHINE_NOT_WORKING, layout_reelrock ) // 628, A - 13/07/98, Rev 5
+GAMEL( 2000, reelrockql, reelrock, aristmk5, trstrove, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Reelin-n-Rockin (0101460V, Queensland)", MACHINE_NOT_WORKING, layout_trstrove ) // 628/2, E - 20/12/00
+GAMEL( 1997, retrsam, aristmk5, aristmk5, retrsam, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Return of the Samurai (0400549V, NSW/ACT)", MACHINE_NOT_WORKING, layout_sbuk3 ) // 608, A - 17/04/97, Rev 5
+GAMEL( 1997, retrsama, retrsam, aristmk5, retrsam, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Return of the Samurai (0200549V, NSW/ACT)", 0, layout_sbuk3 ) // 608, A - 17/04/97, Rev 1.26.25.3
+GAMEL( 1997, retrsamb, retrsam, aristmk5, retrsamb, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Return of the Samurai (0200506V, NSW/ACT)", 0, layout_retrsamb ) // 608, A - 17/04/97, Rev 1.26.25.3
+GAMEL( 1997, rushrst, aristmk5, aristmk5, rushrst, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Rushin Rooster (0100534V, NSW/ACT)", 0, layout_cashchama ) // 596/3, C - 25/06/97, Rev 1.27.2.3
+GAMEL( 2001, sldeluxe, aristmk5, aristmk5_usa, bootsctnua, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Sweet Liberty Deluxe (AHG1575, US)", MACHINE_NOT_WORKING, layout_adonisu ) // MV4137, A - 11/02/01
+GAMEL( 1998, slvrwolf, aristmk5, aristmk5, wamazona, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Silver Wolf (0100673V, NSW/ACT)", MACHINE_NOT_WORKING, layout_wamazona ) // 621/2, A - 23/03/98, Rev 3
+GAMEL( 1996, snowcat, aristmk5, aristmk5, snowcat, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Snow Cat (0100405V, NSW/ACT)", 0, layout_snowcat ) // 599, B - 23/12/96, Rev 1.25.1.0
+GAMEL( 1997, sumospin, aristmk5, aristmk5, swhr2, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Sumo Spins (0200606V, NSW/ACT)", MACHINE_NOT_WORKING, layout_swhr2 ) // 622, A - 08/12/97, Rev 4
+GAMEL( 1998, sbuk3, aristmk5, aristmk5, sbuk3, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Super Bucks III (0200711V, NSW/ACT)", MACHINE_NOT_WORKING, layout_sbuk3 ) // 626, A - 22/04/98, Rev 8
+GAMEL( 1998, sbuk3a, sbuk3, aristmk5, sbuk3, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Super Bucks III (0100711V, NSW/ACT)", MACHINE_NOT_WORKING, layout_sbuk3 ) // 626, A - 22/04/98, Rev 7
+GAMEL( 1995, swhr2, aristmk5, aristmk5, swhr2, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Sweethearts II (0200465V, NSW/ACT)", MACHINE_NOT_WORKING, layout_swhr2 ) // 577/1, C - 07/09/95, Rev 3
+GAMEL( 1995, swhr2a, swhr2, aristmk5, swhr2, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Sweethearts II (0200004V, NSW/ACT)", 0, layout_swhr2 ) // 577/1, C - 07/09/95, Rev 1.1.3.0
+GAMEL( 1998, swhr2u, swhr2, aristmk5_usa, swhr2u, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Sweethearts II (PHG0742-02, US)", MACHINE_NOT_WORKING, layout_swhr2u ) // MV4061, A - 29/06/98
+GAMEL( 1995, swhr2v, swhr2, aristmk5, swhr2, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Sweethearts II (01J01986, Venezuela)", MACHINE_NOT_WORKING, layout_swhr2 ) // 577/1, C - 07/09/95, Rev 3
+GAMEL( 1996, thor, aristmk5, aristmk5, cashcham, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Thor (0200319V, NSW/ACT)", 0, layout_cashcham ) // 569/12, B - 14/08/96, Rev 1.23.7.0
+GAMEL( 1996, thndh, aristmk5, aristmk5, snowcat, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Thunder Heart (0200333V, NSW/ACT)", 0, layout_snowcat ) // 570/9, A - 14/08/96, Rev 1.23.6.0
+GAMEL( 1996, thndha, thndh, aristmk5, wildbill, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Thunder Heart (0200334V, NSW/ACT)", 0, layout_wildbill ) // 597/1, A - 14/08/96, Rev 1.23.6.0
+GAMEL( 1997, topbana, aristmk5, aristmk5, wildbill, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Top Banana (0100550V, NSW/ACT)", 0, layout_wildbill ) // 594/3, A - 18/08/97, Rev 1.26.39.2
+GAMEL( 1998, toutango, aristmk5, aristmk5, kgalah, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Toucan Tango (0100782V, NSW/ACT)", MACHINE_NOT_WORKING, layout_kgalah ) // 616/1, A - 17/06/98, Rev 16
+GAMEL( 1999, toutangonl, toutango, aristmk5, toutangonl, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Toucan Tango (0301388V, Holland)", 0, layout_toutangonl ) // 616, C - 11/05/99
+GAMEL( 2000, trstrove, aristmk5, aristmk5, trstrove, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Treasure Trove (01J00161, NSW/ACT)", MACHINE_NOT_WORKING, layout_trstrove ) // JB001/3, A - 5/10/00, Rev 8
+GAMEL( 2002, tritreat, aristmk5, aristmk5, trstrove, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Triple Treat (0201692V, NSW/ACT)", MACHINE_NOT_WORKING, layout_tritreat ) // 692, A - 17/05/02, Rev 25
+GAMEL( 2001, trojhors, aristmk5, aristmk5, goldenra, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Trojan Horse (01J00851, NSW/ACT)", MACHINE_NOT_WORKING, layout_marmagic ) // JB001/5, A - 30/10/01, Rev 17
+GAMEL( 1996, trpdlght, aristmk5, aristmk5, swhr2, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Tropical Delight (0100269V, NSW/ACT)", 0, layout_swhr2 ) // 577/3, B - 15/05/96, Rev 1.22.2.0
+GAMEL( 1997, trpdlghtu, trpdlght, aristmk5_usa, aristmk5_usa, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Tropical Delight (PHG0625-02, US)", MACHINE_NOT_WORKING, layout_aristmk5_us ) // 577/3, D - 24/09/97
+GAMEL( 1998, unicornd, aristmk5, aristmk5, aristmk5, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Unicorn Dreaming (0100791V, NSW/ACT)", MACHINE_NOT_WORKING, layout_aristmk5 ) // 631/1 A, A - 31/08/98, Rev 12
+GAMEL( 1998, unicornda, unicornd, aristmk5, aristmk5_9, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Unicorn Dreaming (0100813V, NSW/ACT)", MACHINE_NOT_WORKING, layout_dolphntrb ) // 631 A, A - 02/09/98, Rev 14
+GAMEL( 2000, unicorndnz, unicornd, aristmk5, unicorndnz, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Unicorn Dreaming (0101228V, New Zealand)", 0, layout_aristmk5 ) // MV4113/1, A - 05/04/2000, Rev 27
+GAMEL( 2001, unicorndu, unicornd, aristmk5_usa, bootsctnua, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Unicorn Dreaming (BHG1584, US)", MACHINE_NOT_WORKING, layout_adonisu ) // MV4130/1, C - 10/17/01
+GAMEL( 2002, venicea5, aristmk5, aristmk5, goldenra, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Venice (02J02056, Venezuela)", MACHINE_NOT_WORKING, layout_venicea5 ) // JB009/2, B - 11/07/02, Rev 17
+GAMEL( 2001, wafricau, aristmk5, aristmk5_usa, aristmk5_usa, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Wild Africa (AHG1535, US)", MACHINE_NOT_WORKING, layout_magimaska ) // MV4076, B - 17/07/01
+GAMEL( 1996, wamazon, aristmk5, aristmk5, wamazon, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Wild Amazon (0200507V, NSW/ACT)", MACHINE_NOT_WORKING, layout_wamazon ) // 506/8, A - 10/10/96, Rev 3
+GAMEL( 1996, wamazona, wamazon, aristmk5, wamazona, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Wild Amazon (0200285V, NSW/ACT)", 0, layout_wamazona ) // 506/6, A - 7/5/96, Rev 1.22.8.0
+GAMEL( 1996, wamazonv, wamazon, aristmk5, wamazon, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Wild Amazon (01J01996, Venezuela)", MACHINE_NOT_WORKING, layout_wamazon ) // 506/8, A - 10/10/96, Rev 3
+GAMEL( 1997, wikwin, aristmk5, aristmk5, wikwin, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Wicked Winnings (0100553V, NSW/ACT)", MACHINE_NOT_WORKING, layout_wikwin ) // 609, B - 01/07/97, Rev 1
+GAMEL( 1996, wldangel, aristmk5, aristmk5, swhr2, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Wild Angels (0100337V, NSW/ACT)", 0, layout_swhr2 ) // 600, B - 24/09/96
+GAMEL( 1996, wildbill, aristmk5, aristmk5, wildbill, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Wild Bill (0100297V, NSW/ACT)", 0, layout_wildbill ) // 543/8, C - 15/08/96, Rev 1.22.12.0
+GAMEL( 1996, wcougar, aristmk5, aristmk5, wcougar, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Wild Cougar (0100167V, NSW/ACT)", 0, layout_wcougar ) // 569/9, B - 27/2/96, Rev 1.18.1.0
+GAMEL( 1997, wcougaru, wcougar, aristmk5_usa, aristmk5_usa, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Wild Cougar (NHG0296-04, US)", MACHINE_NOT_WORKING, layout_aristmk5_us ) // 569/8, D - 19/05/97
+GAMEL( 1997, wcougarua, wcougar, aristmk5_usa, aristmk5_usa, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Wild Cougar (NHG0296-07, US)", MACHINE_NOT_WORKING, layout_aristmk5_us ) // 569/8, D - 19/05/97
+GAMEL( 1997, wcougarub, wcougar, aristmk5_usa, aristmk5_usa, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Wild Cougar (NHG0296-99, US)", MACHINE_NOT_WORKING, layout_aristmk5_us ) // 569/8, D - 19/05/97
+GAMEL( 1997, wcougaruc, wcougar, aristmk5_usa, aristmk5_usa, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Wild Cougar (AHG1531, US)", MACHINE_NOT_WORKING, layout_magimaska ) // MV4055, B - 13/05/97
+GAMEL( 1996, wizways, aristmk5, aristmk5, wizways, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Wizard Ways (0200396V, NSW/ACT)", MACHINE_NOT_WORKING, layout_wizways ) // 598/3, A - 04/11/96, Rev 9
+GAMEL( 1997, wnpost, aristmk5, aristmk5_usa, wnpost, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Winning Post (RHG0418-04, US)", MACHINE_NOT_WORKING, layout_wnpost ) // 541/2, G - 11/02/97
+GAMEL( 1999, wthing, aristmk5, aristmk5, retrsam, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Wild Thing (0101158V, NSW/ACT)", MACHINE_NOT_WORKING, layout_sbuk3 ) // 608/4, B - 14/12/99, Rev 8
+GAMEL( 1999, wtiger, aristmk5, aristmk5, wtiger, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "White Tiger Classic (0200954V, NSW/ACT)", MACHINE_NOT_WORKING, layout_wtiger ) // 638/1, B - 08/07/99, Rev 13
+GAMEL( 2000, yukongl5, aristmk5, aristmk5, goldenra, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Yukon Gold (03J00191, NSW/ACT)", MACHINE_NOT_WORKING, layout_yukongl5 ) // JB005/1, A - 30/10/2000, Rev 17
// the following parent sets are known bad dumps, and do not boot (confirmed)
-GAMEL( 1996, blackpnt, aristmk5, aristmk5, wildbill, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Black Panther (0200818V, Victoria)", MACHINE_FLAGS_NW, layout_wildbill ) // 594/1, A - 30/07/96
-GAMEL( 1996, canrose, aristmk5, aristmk5_usa, bootsctnua, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Canyon Rose (AHG1463, US)", MACHINE_FLAGS_NW, layout_cashchamu ) // 603(a), B - 06/12/96 (same as Cash Chameleon)
-GAMEL( 2000, diamdest, aristmk5, aristmk5_usa, bootsctnua, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Diamond Destiny (AHG1533, US)", MACHINE_FLAGS_NW, layout_aristmk5_us_200 ) // MV4115_5, A - 09/05/2000 (same as Magic Mask)
-GAMEL( 2001, fortfvr, aristmk5, aristmk5_usa, aristmk5_usa, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Fortune Fever (BHG1566, US)", MACHINE_FLAGS_NW, layout_aristmk5_us ) // MV4122/2, A - 13/05/01
-GAMEL( 1996, jumpbean, aristmk5, aristmk5, swhr2, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Jumping Beans (0100161V, NSW/ACT)", MACHINE_FLAGS_NW, layout_swhr2 ) // 586/2, A - 25/01/96
-GAMEL( 1999, sbuk2, aristmk5, aristmk5, sbuk2, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Super Bucks II (0400501V, NSW/ACT)", MACHINE_FLAGS_NW, layout_sbuk2 ) // 578, G - 26/07/99, Rev 7
-GAMEL( 2001, wcoyote, aristmk5, aristmk5_usa, aristmk5_usa, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Wild Coyote (AHG1515, US)", MACHINE_FLAGS_NW, layout_aristmk5_us ) // MV4134, A - 30/07/01 (same as Loco Loot)
+GAMEL( 1996, blackpnt, aristmk5, aristmk5, wildbill, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Black Panther (0200818V, Victoria)", MACHINE_NOT_WORKING, layout_wildbill ) // 594/1, A - 30/07/96
+GAMEL( 1996, canrose, aristmk5, aristmk5_usa, bootsctnua, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Canyon Rose (AHG1463, US)", MACHINE_NOT_WORKING, layout_cashchamu ) // 603(a), B - 06/12/96 (same as Cash Chameleon)
+GAMEL( 2000, diamdest, aristmk5, aristmk5_usa, bootsctnua, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Diamond Destiny (AHG1533, US)", MACHINE_NOT_WORKING, layout_aristmk5_us_200 ) // MV4115_5, A - 09/05/2000 (same as Magic Mask)
+GAMEL( 2001, fortfvr, aristmk5, aristmk5_usa, aristmk5_usa, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Fortune Fever (BHG1566, US)", MACHINE_NOT_WORKING, layout_aristmk5_us ) // MV4122/2, A - 13/05/01
+GAMEL( 1996, jumpbean, aristmk5, aristmk5, swhr2, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Jumping Beans (0100161V, NSW/ACT)", MACHINE_NOT_WORKING, layout_swhr2 ) // 586/2, A - 25/01/96
+GAMEL( 1999, sbuk2, aristmk5, aristmk5, sbuk2, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Super Bucks II (0400501V, NSW/ACT)", MACHINE_NOT_WORKING, layout_sbuk2 ) // 578, G - 26/07/99, Rev 7
+GAMEL( 2001, wcoyote, aristmk5, aristmk5_usa, aristmk5_usa, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Wild Coyote (AHG1515, US)", MACHINE_NOT_WORKING, layout_aristmk5_us ) // MV4134, A - 30/07/01 (same as Loco Loot)
// the following clone sets are known bad dumps, and do not boot (confirmed)
-GAMEL( 2000, bpartya, bparty, aristmk5_usa_touch, bootsctnua, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Bachelorette Party (BHG1579, US)", MACHINE_FLAGS_NW, layout_bparty ) // MV4119/1, B - 25/08/2000
-GAMEL( 1997, cashcra5a, cashcra5, aristmk5, aristmk5_9, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Cash Crop (0300447V, NSW/ACT)", MACHINE_FLAGS_NW, layout_dolphntrb ) // 607/2, C - 29/08/97, Rev 7
-GAMEL( 1996, chickna5v, chickna5, aristmk5, chickna5v, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Chicken (01J01886, Venezuela)", MACHINE_FLAGS_NW, layout_chickna5v ) // 596/1, B - 23/12/96, Rev 3
-GAMEL( 2001, dynajacku, dynajack, aristmk5_usa, aristmk5_usa, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Dynamite Jack (CHG1562, US)", MACHINE_FLAGS_NW, layout_magimaska ) // US002, A - 11/07/01
-GAMEL( 2000, eforsta5ce, eforsta5, aristmk5_usa, aristmk5_usa, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Enchanted Forest - Cash Express (CHG1536, US)", MACHINE_FLAGS_NW, layout_aristmk5_us ) // MV4108/6, C - 17/01/00
-GAMEL( 2001, mountmonce, mountmon, aristmk5_usa, aristmk5_usa, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Mountain Money - Cash Express (AHG1629, US)", MACHINE_FLAGS_NW, layout_aristmk5_us ) // MV4108/5, A - 10/03/01
-GAMEL( 2001, mountmonu, mountmon, aristmk5_usa, aristmk5_usa, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Mountain Money (BHG1465, US)", MACHINE_FLAGS_NW, layout_aristmk5_us ) // MV4108/5, A - 10/03/01
-GAMEL( 2001, partygrsb, partygrs, aristmk5_usa_touch, bootsctnua, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Party Gras (AHG1568, US)", MACHINE_FLAGS_NW, layout_bparty ) // MV4115/6, A - 10/11/2001, 20 lines
-GAMEL( 1995, pengpayd, pengpay, aristmk5, wcougar, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Penguin Pays (0300113V, NSW/ACT)", MACHINE_FLAGS_NW, layout_wcougar ) // 586, A - 12/10/95, Rev 4
-GAMEL( 1998, petshopa, petshop, aristmk5, snowcat, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Pet Shop (0100679V, NSW/ACT)", MACHINE_FLAGS_NW, layout_snowcat ) // 618, A - 09/03/98, Rev 10
-GAMEL( 1995, sbuk2a, sbuk2, aristmk5, sbuk2, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Super Bucks II (0300006V, NSW/ACT)", MACHINE_FLAGS_NW, layout_sbuk2 ) // no data due to missing ROMs
-GAMEL( 2000, wthinga, wthing, aristmk5, aristmk5, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Wild Thing (0201176V, NSW/ACT)", MACHINE_FLAGS_NW, layout_aristmk5 ) // 608/5, B - 25/02/00, Rev 11
+GAMEL( 2000, bpartya, bparty, aristmk5_usa_touch, bootsctnua, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Bachelorette Party (BHG1579, US)", MACHINE_NOT_WORKING, layout_bparty ) // MV4119/1, B - 25/08/2000
+GAMEL( 1997, cashcra5a, cashcra5, aristmk5, aristmk5_9, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Cash Crop (0300447V, NSW/ACT)", MACHINE_NOT_WORKING, layout_dolphntrb ) // 607/2, C - 29/08/97, Rev 7
+GAMEL( 1996, chickna5v, chickna5, aristmk5, chickna5v, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Chicken (01J01886, Venezuela)", MACHINE_NOT_WORKING, layout_chickna5v ) // 596/1, B - 23/12/96, Rev 3
+GAMEL( 2001, dynajacku, dynajack, aristmk5_usa, aristmk5_usa, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Dynamite Jack (CHG1562, US)", MACHINE_NOT_WORKING, layout_magimaska ) // US002, A - 11/07/01
+GAMEL( 2000, eforsta5ce, eforsta5, aristmk5_usa, aristmk5_usa, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Enchanted Forest - Cash Express (CHG1536, US)", MACHINE_NOT_WORKING, layout_aristmk5_us ) // MV4108/6, C - 17/01/00
+GAMEL( 2001, mountmonce, mountmon, aristmk5_usa, aristmk5_usa, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Mountain Money - Cash Express (AHG1629, US)", MACHINE_NOT_WORKING, layout_aristmk5_us ) // MV4108/5, A - 10/03/01
+GAMEL( 2001, mountmonu, mountmon, aristmk5_usa, aristmk5_usa, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Mountain Money (BHG1465, US)", MACHINE_NOT_WORKING, layout_aristmk5_us ) // MV4108/5, A - 10/03/01
+GAMEL( 2001, partygrsb, partygrs, aristmk5_usa_touch, bootsctnua, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Party Gras (AHG1568, US)", MACHINE_NOT_WORKING, layout_bparty ) // MV4115/6, A - 10/11/2001, 20 lines
+GAMEL( 1995, pengpayd, pengpay, aristmk5, wcougar, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Penguin Pays (0300113V, NSW/ACT)", MACHINE_NOT_WORKING, layout_wcougar ) // 586, A - 12/10/95, Rev 4
+GAMEL( 1998, petshopa, petshop, aristmk5, snowcat, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Pet Shop (0100679V, NSW/ACT)", MACHINE_NOT_WORKING, layout_snowcat ) // 618, A - 09/03/98, Rev 10
+GAMEL( 1995, sbuk2a, sbuk2, aristmk5, sbuk2, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Super Bucks II (0300006V, NSW/ACT)", MACHINE_NOT_WORKING, layout_sbuk2 ) // no data due to missing ROMs
+GAMEL( 2000, wthinga, wthing, aristmk5, aristmk5, aristmk5_state, init_aristmk5, ROT0, "Aristocrat", "Wild Thing (0201176V, NSW/ACT)", MACHINE_NOT_WORKING, layout_aristmk5 ) // 608/5, B - 25/02/00, Rev 11
diff --git a/src/mame/drivers/aristmk6.cpp b/src/mame/drivers/aristmk6.cpp
index e78eda78a1c..55cd5b71d9a 100644
--- a/src/mame/drivers/aristmk6.cpp
+++ b/src/mame/drivers/aristmk6.cpp
@@ -35,8 +35,8 @@ notes:
class aristmk6_state : public driver_device
{
public:
- aristmk6_state(const machine_config &mconfig, device_type type, const char *tag)
- : driver_device(mconfig, type, tag),
+ aristmk6_state(const machine_config &mconfig, device_type type, const char *tag) :
+ driver_device(mconfig, type, tag),
m_maincpu(*this, "maincpu"),
m_uart0(*this, "uart0"),
m_uart1(*this, "uart1"),
@@ -385,120 +385,134 @@ typically at around 0x3100-0x3200, 0x3600-0x3700 for Left/Right BIOS dumps (2 fi
#define ARISTMK6_BIOS \
ROM_REGION( 0x0400000, "maincpu", ROMREGION_ERASEFF) \
- ROM_SYSTEM_BIOS( 0, "bios0", "Aristocrat MK6 Base (02010114, NSW/ACT)" ) \
+ ROM_SYSTEM_BIOS( 0, "au-nsw1", "Aristocrat MK6 Base (02010114, NSW/ACT)" ) \
ROM_LOAD64_WORD_BIOS( 0, "02010114.u84", 0x0000000, 0x0100000, CRC(183e3836) SHA1(4c802d0cd010bc007acb3a83e37aaa29b2d13d87) ) /* From Arabian Nights & Helen of Troy */ \
ROM_LOAD64_WORD_BIOS( 0, "02010114.u71", 0x0000002, 0x0100000, CRC(8f83c3dd) SHA1(a5f9d80b4b515b24299d0241e1665cfd9da8bab7) ) \
ROM_LOAD64_WORD_BIOS( 0, "02010114.u83", 0x0000004, 0x0100000, CRC(945104d7) SHA1(e372d0cf889c72b5d001b26fe4a925a28486537f) ) \
ROM_LOAD64_WORD_BIOS( 0, "02010114.u70", 0x0000006, 0x0100000, CRC(3ba4379f) SHA1(84367f12c4c9224d2ab9cae83ae8727de338408c) ) \
- ROM_SYSTEM_BIOS( 1, "bios1", "Aristocrat MK6 Base (02010201, NSW/ACT)" ) \
+ ROM_SYSTEM_BIOS( 1, "au-nsw2", "Aristocrat MK6 Base (02010201, NSW/ACT)" ) \
ROM_LOAD64_WORD_BIOS( 1, "02010201.u84", 0x0000000, 0x0100000, CRC(0920930f) SHA1(771b0f62442d1c75b1bb59ad82365b7ab8747173) ) /* From Money Tree & Go For Green */ \
ROM_LOAD64_WORD_BIOS( 1, "02010201.u71", 0x0000002, 0x0100000, CRC(24d5614a) SHA1(fdcf3826dccc72b74b66379b1411cf211d5a1670) ) \
ROM_LOAD64_WORD_BIOS( 1, "02010201.u83", 0x0000004, 0x0100000, CRC(5f64a20c) SHA1(397404ab6d2a1aa3c1fc77bb9421fef7079b65a5) ) \
ROM_LOAD64_WORD_BIOS( 1, "02010201.u70", 0x0000006, 0x0100000, CRC(9b2db442) SHA1(d512398a2d9257bd385dc50d61c63cd1a47300ba) ) \
- ROM_SYSTEM_BIOS( 2, "bios2", "Aristocrat MK6 Base (02061013, NSW/ACT)" ) \
+ ROM_SYSTEM_BIOS( 2, "au-nsw3", "Aristocrat MK6 Base (02061013, NSW/ACT)" ) \
ROM_LOAD32_WORD_BIOS( 2, "02061013_right.u83", 0x0000000, 0x0100000, CRC(7a8619a5) SHA1(bd03ddb68817c1660b009e102ccf69e5b603b875) ) \
ROM_LOAD32_WORD_BIOS( 2, "02061013_left.u70", 0x0000002, 0x0100000, CRC(e70a7007) SHA1(0935f924866162d9c0fbdbb99391cbf730a04b76) ) \
- ROM_SYSTEM_BIOS( 3, "bios3", "Aristocrat MK6 Base (03010301, NSW/ACT)" ) \
+ ROM_SYSTEM_BIOS( 3, "au-nsw4", "Aristocrat MK6 Base (03010301, NSW/ACT)" ) \
ROM_LOAD64_WORD_BIOS( 3, "03010301.u84", 0x0000000, 0x0100000, CRC(a34a9f16) SHA1(b8750e6ceb1715da8e5ac2f0183254e29a042641) ) /* From Queen of the Nile Special Edition */ \
ROM_LOAD64_WORD_BIOS( 3, "03010301.u71", 0x0000002, 0x0100000, CRC(d793440a) SHA1(dced4c04bde13293af77a9a1f4c5c606e3758de0) ) \
ROM_LOAD64_WORD_BIOS( 3, "03010301.u83", 0x0000004, 0x0100000, CRC(c8580554) SHA1(58b8bfff2f8d298c4e3be2b01900800c45fa7ad7) ) \
ROM_LOAD64_WORD_BIOS( 3, "03010301.u70", 0x0000006, 0x0100000, CRC(5ae69121) SHA1(36dd3f9aaf5f7d2751d1954d67f898bc3ec71f3b) ) \
- ROM_SYSTEM_BIOS( 4, "bios4", "Aristocrat MK6 Base (04010501, NSW/ACT)" ) \
+ ROM_SYSTEM_BIOS( 4, "au-nsw5", "Aristocrat MK6 Base (04010501, NSW/ACT)" ) \
ROM_LOAD32_WORD_BIOS( 4, "04010501_right.u83", 0x0000000, 0x0100000, CRC(3daefb7a) SHA1(411471713219f4bab5ccf5fe7a12a6c138c8c550) ) /* From Diamonds Forever */ \
ROM_LOAD32_WORD_BIOS( 4, "04010501_left.u70", 0x0000002, 0x0100000, CRC(21182775) SHA1(7c5b7f5aba3babc85f512a8f7d4ebc0d83eb842a) ) \
- ROM_SYSTEM_BIOS( 5, "bios5", "Aristocrat MK6 Base (05010601, NSW/ACT)" ) \
+ ROM_SYSTEM_BIOS( 5, "au-nsw6", "Aristocrat MK6 Base (05010601, NSW/ACT)" ) \
ROM_LOAD32_WORD_BIOS( 5, "05010601_right.u83", 0x0000000, 0x0100000, CRC(c12eac11) SHA1(683b9ddc323865ace7dca37d13b55de6e42759a5) ) /* From Thai Princess & Venetian Nights */ \
ROM_LOAD32_WORD_BIOS( 5, "05010601_left.u70", 0x0000002, 0x0100000, CRC(b3e6b4a0) SHA1(3bf398c9257579f8e51ce716d6ebfa74fa510273) ) \
- ROM_SYSTEM_BIOS( 6, "bios6", "Aristocrat MK6 Base (07010801, NSW/ACT)" ) \
+ ROM_SYSTEM_BIOS( 6, "au-nsw7", "Aristocrat MK6 Base (07010801, NSW/ACT)" ) \
ROM_LOAD32_WORD_BIOS( 6, "07010801_right.u83", 0x0000000, 0x0200000, CRC(8c148c11) SHA1(5ff3be18455b4f04675fec8d5b9d881295c65e23) ) /* From Jailbreak */ \
ROM_LOAD32_WORD_BIOS( 6, "07010801_left.u70", 0x0000002, 0x0200000, CRC(8e92af68) SHA1(00d2bb655b7964a9652896741210ec534df0b0d2) ) \
- ROM_SYSTEM_BIOS( 7, "bios7", "Aristocrat MK6 Base (09011001, NSW/ACT)" ) \
+ ROM_SYSTEM_BIOS( 7, "au-nsw8", "Aristocrat MK6 Base (09011001, NSW/ACT)" ) \
ROM_LOAD32_WORD_BIOS( 7, "09011001_right.u83", 0x0000000, 0x0200000, CRC(8a853f80) SHA1(9a75498f7b02c81a483b4e1c158f35f0ee4c0112) ) \
ROM_LOAD32_WORD_BIOS( 7, "09011001_left.u70", 0x0000002, 0x0200000, CRC(229c2e63) SHA1(91fd2b1acb69efe073647e93db9f11042add2feb) ) \
- ROM_SYSTEM_BIOS( 8, "bios8", "Aristocrat MK6 Base (11011501, NSW/ACT)" ) \
+ ROM_SYSTEM_BIOS( 8, "au-nsw9", "Aristocrat MK6 Base (11011501, NSW/ACT)" ) \
ROM_LOAD32_WORD_BIOS( 8, "11011501_right.u83", 0x0000000, 0x0200000, CRC(de4c3aed) SHA1(21596a2edd20eb7de7a4ec8900a270b09c8f326f) ) \
ROM_LOAD32_WORD_BIOS( 8, "11011501_left.u70", 0x0000002, 0x0200000, CRC(c5cc3461) SHA1(5b43c4cb6110a6ccf67cd0f3789253f6872b20c4) ) \
- ROM_SYSTEM_BIOS( 9, "bios9", "Aristocrat MK6 Base (11011901, NSW/ACT)" ) \
+ ROM_SYSTEM_BIOS( 9, "au-nsw10", "Aristocrat MK6 Base (11011901, NSW/ACT)" ) \
ROM_LOAD32_WORD_BIOS( 9, "11011901_right.u83", 0x0000000, 0x0200000, CRC(73dcb11c) SHA1(69ae4f32a0c9141b2a82ff3935b0cd20333d2964) ) \
ROM_LOAD32_WORD_BIOS( 9, "11011901_left.u70", 0x0000002, 0x0200000, CRC(d3dd2210) SHA1(3548f8cc39859d3f44a55f6bae48966a2d48e0eb) ) \
- ROM_SYSTEM_BIOS( 10, "bios10", "Aristocrat MK6 Base (13012001, NSW/ACT)" ) \
+ ROM_SYSTEM_BIOS( 10, "au-nsw11", "Aristocrat MK6 Base (13012001, NSW/ACT)" ) \
ROM_LOAD32_WORD_BIOS( 10, "13012001_right.u83", 0x0000000, 0x0200000, CRC(e627dbfa) SHA1(4fedbe0975ceb7dc0ebebf18a7708d78984db9b7) ) /* From Grizzly & Queen of the Nile */ \
ROM_LOAD32_WORD_BIOS( 10, "13012001_left.u70", 0x0000002, 0x0200000, CRC(38e8f659) SHA1(88c6acba99b0aca023c6f4d27c061c231490e9e0) ) \
- ROM_SYSTEM_BIOS( 11, "bios11", "Aristocrat MK6 Base (14011913, NSW/ACT)" ) \
+ ROM_SYSTEM_BIOS( 11, "au-nsw12", "Aristocrat MK6 Base (14011913, NSW/ACT)" ) \
ROM_LOAD32_WORD_BIOS( 11, "14011913_right.u83", 0x0000000, 0x0200000, CRC(01d13b89) SHA1(b1013366d0803dfbec5a5f90f6a5cea862de0513) ) \
ROM_LOAD32_WORD_BIOS( 11, "14011913_left.u70", 0x0000002, 0x0200000, CRC(9a4cefdf) SHA1(6c15bc565ede8af19361d60ee1e6657a8055c92c) ) \
- ROM_SYSTEM_BIOS( 12, "bios12", "Aristocrat MK6 Base (19012801, NSW/ACT)" ) \
+ ROM_SYSTEM_BIOS( 12, "au-nsw13", "Aristocrat MK6 Base (19012801, NSW/ACT)" ) \
ROM_LOAD32_WORD_BIOS( 12, "19012801_right.u83", 0x0000000, 0x0200000, CRC(5b20a96c) SHA1(5fd916b7cc2cdd51bf7dd212c1114f94dc9c7926) ) /* From Cactus Corral & Cashman Tonight & Heart of Vegas & Moonlight Waltz */ \
ROM_LOAD32_WORD_BIOS( 12, "19012801_left.u70", 0x0000002, 0x0200000, CRC(b03bd17c) SHA1(f281e80f6dda5b727ed71d2deebe3b0ff548773f) ) \
- ROM_SYSTEM_BIOS( 13, "bios13", "Aristocrat MK6 Base (21012901, NSW/ACT)" ) \
+ ROM_SYSTEM_BIOS( 13, "au-nsw14", "Aristocrat MK6 Base (21012901, NSW/ACT)" ) \
ROM_LOAD32_WORD_BIOS( 13, "21012901_right.u83", 0x0000000, 0x0200000, CRC(757618f2) SHA1(43f9a3e7d544979f8c6974945914d9e099b02abd) ) /* From Red Baron */ \
ROM_LOAD32_WORD_BIOS( 13, "21012901_left.u70", 0x0000002, 0x0200000, CRC(0d271470) SHA1(5cd4b604bfe2fd7e9a8d08e1c7c97f17ae068479) ) \
- ROM_SYSTEM_BIOS( 14, "bios14", "Aristocrat MK6 Base (24013001, NSW/ACT)" ) \
+ ROM_SYSTEM_BIOS( 14, "au-nsw15", "Aristocrat MK6 Base (24013001, NSW/ACT)" ) \
ROM_LOAD32_WORD_BIOS( 14, "24013001_right.u83", 0x0000000, 0x0200000, CRC(e97afedf) SHA1(10ca3b015afaff5d7812f0f5207b2535602136a5) ) /* From Wild Stallion */ \
ROM_LOAD32_WORD_BIOS( 14, "24013001_left.u70", 0x0000002, 0x0200000, CRC(06ae7e07) SHA1(39a45575b66906d73b519988d1001c99b05c5f34) ) \
- ROM_SYSTEM_BIOS( 15, "bios15", "Aristocrat MK6 Base (03030708, South Australia)" ) \
+ ROM_SYSTEM_BIOS( 15, "au-sa1", "Aristocrat MK6 Base (03030708, South Australia)" ) \
ROM_LOAD32_WORD_BIOS( 15, "03030708_right.u83", 0x0000000, 0x0100000, CRC(b4b3c6a5) SHA1(5747f98a6eaa5c24a23d1d76a28b33a3bfbbfd1f) ) /* From Scatter Magic II SA */ \
ROM_LOAD32_WORD_BIOS( 15, "03030708_left.u70", 0x0000002, 0x0100000, CRC(4e5ad823) SHA1(77ab1c29c6172cfdcef776222a72b2b44114d4da) ) \
- ROM_SYSTEM_BIOS( 16, "bios16", "Aristocrat MK6 Base (15011025, Malaysia)" ) \
+ ROM_SYSTEM_BIOS( 16, "my", "Aristocrat MK6 Base (15011025, Malaysia)" ) \
ROM_LOAD32_WORD_BIOS( 16, "15011025_right.u83", 0x0000000, 0x0200000, CRC(bf21a975) SHA1(a251b1a7342387300689cd50fe4ce7975b903ac5) ) \
ROM_LOAD32_WORD_BIOS( 16, "15011025_left.u70", 0x0000002, 0x0200000, CRC(c02e14b0) SHA1(6bf98927813519dfe60e582dbe5be3ccd87f7c91) ) \
- ROM_SYSTEM_BIOS( 17, "bios17", "Aristocrat MK6 Base (20012605, Queensland)" ) \
- ROM_LOAD32_WORD_BIOS( 17, "20012605_right.u83", 0x0000000, 0x0200000, CRC(045b82ad) SHA1(b8e4f9f826970d83ae5fd2f2898de12ad1bf2d24) ) \
- ROM_LOAD32_WORD_BIOS( 17, "20012605_left.u70", 0x0000002, 0x0200000, CRC(87331111) SHA1(6cdc2d81f68de23af18a975a6f27ddec246be405) ) \
- ROM_SYSTEM_BIOS( 18, "bios18", "Aristocrat MK6 Base (04041205, Queensland)" ) \
- ROM_LOAD32_WORD_BIOS( 18, "04041205_right.u83", 0x0000000, 0x0100000, CRC(ca6bc86c) SHA1(69fe7fc35694e4cd7f861bff4ec3a6165a81df6e) ) \
- ROM_LOAD32_WORD_BIOS( 18, "04041205_left.u70", 0x0000002, 0x0100000, CRC(dfb9a119) SHA1(814a5a7877392aec4e4871d7f0e19d2fbd717409) ) \
- ROM_SYSTEM_BIOS( 19, "bios19", "Aristocrat MK6 Base (01.02.08, USA)" ) \
- ROM_LOAD32_WORD_BIOS( 19, "01.02.08_right.u2", 0x0000000, 0x0100000, CRC(aaaeac8c) SHA1(a565e5fcb4f55f31e7d36be40eec234248a66efd) ) \
- ROM_LOAD32_WORD_BIOS( 19, "01.02.08_left.u3", 0x0000002, 0x0100000, CRC(f29fd1bf) SHA1(33e043d2616e10a1c7a0936c3d208f9bcc2ca6f3) ) \
- ROM_SYSTEM_BIOS( 20, "bios20", "Aristocrat MK6 Base (01.03.03a, USA)" ) \
- ROM_LOAD32_WORD_BIOS( 20, "01.03.03a_right.u83", 0x0000000, 0x0200000, CRC(253415f4) SHA1(50dc77ad87bc6be1932dda2fd4865602c8c49729) ) \
- ROM_LOAD32_WORD_BIOS( 20, "01.03.03a_left.u70", 0x0000002, 0x0200000, CRC(4ab5dd40) SHA1(a6812cc624e6a98ea7b0697e2797fe10ba8e303e) ) \
- ROM_SYSTEM_BIOS( 21, "bios21", "Aristocrat MK6 Base (01.03.03e, USA)" ) \
- ROM_LOAD32_WORD_BIOS( 21, "01.03.03e_right.u83", 0x0000000, 0x0200000, CRC(2255e263) SHA1(5e9e093aaa17172f47a14c3baf7f6f0f73b19398) ) \
- ROM_LOAD32_WORD_BIOS( 21, "01.03.03e_left.u70", 0x0000002, 0x0200000, CRC(ea50729a) SHA1(14b5a71bfb91ac366ddcb5f77fb54127808f8163) ) \
- ROM_SYSTEM_BIOS( 22, "bios22", "Aristocrat MK6 Base (01.03.05, USA)" ) \
- ROM_LOAD32_WORD_BIOS( 22, "01.03.05_right.u83", 0x0000000, 0x0200000, CRC(2c7f1ec3) SHA1(d03167f43ed6f9596080d91472695829378cef0a) ) \
- ROM_LOAD32_WORD_BIOS( 22, "01.03.05_left.u70", 0x0000002, 0x0200000, CRC(0095e3f9) SHA1(d2e8786158b1ab0a614aab21cf1d14cbc04754af) ) \
- ROM_SYSTEM_BIOS( 23, "bios23", "Aristocrat MK6 Base (01.03.06, USA)" ) \
- ROM_LOAD32_WORD_BIOS( 23, "01.03.06_right.u83", 0x0000000, 0x0200000, CRC(bd48ca55) SHA1(8fb1576cbeb1c64c358880714740195d2e73e03e) ) /* From Diamond Eyes US */ \
- ROM_LOAD32_WORD_BIOS( 23, "01.03.06_left.u70", 0x0000002, 0x0200000, CRC(2f9d9a29) SHA1(fdebfaca9a579d7249379f19aef22fbfd66bf943) ) \
- ROM_SYSTEM_BIOS( 24, "bios24", "Aristocrat MK6 Base (01.03.07, USA)" ) \
- ROM_LOAD32_WORD_BIOS( 24, "01.03.07_right.u83", 0x0000000, 0x0200000, CRC(2ebccc4e) SHA1(9342724e4451e9ab24ceae208284b50abd4f0be3) ) \
- ROM_LOAD32_WORD_BIOS( 24, "01.03.07_left.u70", 0x0000002, 0x0200000, CRC(a3632da4) SHA1(1c96a88e86095b81801ab88e36a4cdfa4b893265) ) \
- ROM_SYSTEM_BIOS( 25, "bios25", "Aristocrat MK6 Base (01.03.14, USA)" ) \
- ROM_LOAD32_WORD_BIOS( 25, "01.03.14_right.u83", 0x0000000, 0x0200000, CRC(889ffd82) SHA1(9c98c9cdcf5f7d05095f11006418133029e9f0f8) ) /* From 5 Dragons US */ \
- ROM_LOAD32_WORD_BIOS( 25, "01.03.14_left.u70", 0x0000002, 0x0200000, CRC(7138fec4) SHA1(f81331d1875ac574d3e6c98be218ff25c6c7be5a) ) \
- ROM_SYSTEM_BIOS( 26, "bios26", "Aristocrat MK6 Base (01.03.17, USA)" ) \
- ROM_LOAD32_WORD_BIOS( 26, "01.03.17_right.u83", 0x0000000, 0x0200000, CRC(1582714b) SHA1(92d0a15314ffe526159bef9a364898dd1ebdfde7) ) \
- ROM_LOAD32_WORD_BIOS( 26, "01.03.17_left.u70", 0x0000002, 0x0200000, CRC(a88193dc) SHA1(c9e1d483edaecd318d2e5fc8a54e84516c93e0ca) ) \
- ROM_SYSTEM_BIOS( 27, "bios27", "Aristocrat MK6 Base (01.04.14, USA)" ) \
- ROM_LOAD32_WORD_BIOS( 27, "01.04.04_right.u83", 0x0000000, 0x0200000, CRC(e57ba02d) SHA1(8e29403e6b619eeab41dc171221720bc7820ccdc) ) \
- ROM_LOAD32_WORD_BIOS( 27, "01.04.04_left.u70", 0x0000002, 0x0200000, CRC(b984a92c) SHA1(90f7a61302caee40195c08565bdac856a3234c1d) ) \
- ROM_SYSTEM_BIOS( 28, "bios28", "Aristocrat MK6 Base (01.04.07, USA)" ) \
- ROM_LOAD32_WORD_BIOS( 28, "01.04.07_right.u83", 0x0000000, 0x0200000, CRC(23c28e22) SHA1(98f24a1f86232b6c2c288a61ec7d60c867f192e5) ) \
- ROM_LOAD32_WORD_BIOS( 28, "01.04.07_left.u70", 0x0000002, 0x0200000, CRC(acfb0fe0) SHA1(b1a772d7978e6ff4406a5bb39a71cb3f89608e72) ) \
- ROM_SYSTEM_BIOS( 29, "bios29", "Aristocrat MK6 Base (01.04.08, USA)" ) \
- ROM_LOAD32_WORD_BIOS( 29, "01.04.08_right.u83", 0x0000000, 0x0200000, CRC(95333304) SHA1(7afe49d6c5e4d6820f349778557daa88c5366a51) ) /* From Bob and Dolly, also u20 on EPROM expansion board */ \
- ROM_LOAD32_WORD_BIOS( 29, "01.04.08_left.u70", 0x0000002, 0x0200000, CRC(0dfcad10) SHA1(53798be000304aed38909f5fd8470a68bedd8229) ) /* also u10 on EPROM expansion board */ \
- ROM_SYSTEM_BIOS( 30, "bios30", "Aristocrat MK6 Base (01.04.10, USA)" ) \
- ROM_LOAD32_WORD_BIOS( 30, "01.04.10_right.u83", 0x0000000, 0x0200000, CRC(82ce2fcc) SHA1(4c8fb3db084a67e99d1420b3f895a06ce9ef5ec2) ) \
- ROM_LOAD32_WORD_BIOS( 30, "01.04.10_left.u70", 0x0000002, 0x0200000, CRC(9d9d52c1) SHA1(b957220cdbedd516c219d1bfc28807ce466df93f) ) \
- ROM_SYSTEM_BIOS( 31, "bios31", "Aristocrat MK6 Base (01.04.11, USA)" ) \
- ROM_LOAD32_WORD_BIOS( 31, "01.04.11_right.u83", 0x0000000, 0x0200000, CRC(2dae8ca0) SHA1(7a0fb38b4c1ac7195d15bdab6f0cfb16c78430f0) ) \
- ROM_LOAD32_WORD_BIOS( 31, "01.04.11_left.u70", 0x0000002, 0x0200000, CRC(787f2b07) SHA1(2548289e44f4b935346b759afb5383bdbac04c3e) ) \
- ROM_SYSTEM_BIOS( 32, "bios32", "Aristocrat MK6 Set Chips (06.02.04, USA)" ) \
- ROM_LOAD32_WORD_BIOS( 32, "06.02.04_right.u2", 0x0000000, 0x0100000, CRC(1cf5a853) SHA1(64d17efcce702df7a0b0e151293199478e25226d) ) \
- ROM_LOAD32_WORD_BIOS( 32, "06.02.04_left.u3", 0x0000002, 0x0100000, CRC(117b75f2) SHA1(2129286853d3c50b8a943b71334d4ef6b98adc05) ) \
- ROM_SYSTEM_BIOS( 33, "bios33", "Aristocrat MK6 Set Chips (06.02.20, USA)" ) \
- ROM_LOAD32_WORD_BIOS( 33, "06.02.20_right.u83", 0x0000000, 0x0100000, CRC(e4001f60) SHA1(5da34efb1ac0f7c84a48e09363d20cfecda4bcf1) ) \
- ROM_LOAD32_WORD_BIOS( 33, "06.02.20_left.u70", 0x0000002, 0x0100000, CRC(199ed3b9) SHA1(e3ee81ffd713f09e35a10c38e4f59282e2c5cd30) ) \
- ROM_SYSTEM_BIOS( 34, "bios34", "Aristocrat MK6 Set Chips (06.03.03, USA)" ) \
- ROM_LOAD32_WORD_BIOS( 34, "06.03.03_right.u2", 0x0000000, 0x0100000, CRC(98763498) SHA1(246e95cc12eb34f946b2f4938c59217718f6d841) ) \
- ROM_LOAD32_WORD_BIOS( 34, "06.03.03_left.u3", 0x0000002, 0x0100000, CRC(a6924238) SHA1(b71ab39bf9c1fdbab556028138749e8c040ec83c) ) \
- ROM_SYSTEM_BIOS( 35, "bios35", "Aristocrat MK6 Set Chips (06.03.04, USA)" ) \
- ROM_LOAD32_WORD_BIOS( 35, "06.03.04_right.u2", 0x0000000, 0x0100000, CRC(6f5f5ef1) SHA1(70a43fba4de47ed8dcf38b25eafd5873f3428e72) ) \
- ROM_LOAD32_WORD_BIOS( 35, "06.03.04_left.u3", 0x0000002, 0x0100000, CRC(7034f26b) SHA1(7be78f23bec38d05240cdfe1186ec0c8291f5a1c) )
+ ROM_SYSTEM_BIOS( 17, "au-qld1", "Aristocrat MK6 Base (14011605, Queensland))" ) \
+ ROM_LOAD32_WORD_BIOS( 17, "14011605_right.u83", 0x0000000, 0x0200000, CRC(2bec5b74) SHA1(854733cada75e632f01f7096d4740ed4941a3d5b) ) /* From Moon Fire - Jackpot Carnival */ \
+ ROM_LOAD32_WORD_BIOS( 17, "14011605_left.u70", 0x0000002, 0x0200000, CRC(cd26d4f0) SHA1(40822714abf08aeb08d827dbd8cd099f86803754) ) \
+ ROM_SYSTEM_BIOS( 18, "au-qld2", "Aristocrat MK6 Base (20012305, Queensland)" ) \
+ ROM_LOAD32_WORD_BIOS( 18, "20012305_right.u83", 0x0000000, 0x0200000, CRC(e436c1f5) SHA1(62ee529cc971fd76aa2ccc15778e3f0c40e3e47f) ) /* From Spring Festival */ \
+ ROM_LOAD32_WORD_BIOS( 18, "20012305_left.u70", 0x0000002, 0x0200000, CRC(ea8961cc) SHA1(0ebc7c3b94a6e01ee984af4711043130d9670bd3) ) \
+ ROM_SYSTEM_BIOS( 19, "au-qld3", "Aristocrat MK6 Base (20012605, Queensland)" ) \
+ ROM_LOAD32_WORD_BIOS( 19, "20012605_right.u83", 0x0000000, 0x0200000, CRC(045b82ad) SHA1(b8e4f9f826970d83ae5fd2f2898de12ad1bf2d24) ) \
+ ROM_LOAD32_WORD_BIOS( 19, "20012605_left.u70", 0x0000002, 0x0200000, CRC(87331111) SHA1(6cdc2d81f68de23af18a975a6f27ddec246be405) ) \
+ ROM_SYSTEM_BIOS( 20, "au-qld4", "Aristocrat MK6 Base (01040505, Queensland)" ) \
+ ROM_LOAD64_WORD_BIOS( 20, "01040505.u84", 0x0000000, 0x0100000, CRC(cf5a9d1e) SHA1(0ebba478fc883831d70b0fa95f43e5f93b07ae9e) ) /* From Show Me The Money */ \
+ ROM_LOAD64_WORD_BIOS( 20, "01040505.u71", 0x0000002, 0x0100000, CRC(f56ea77e) SHA1(319be1bee66a289e2c1f6beec07758f79aa0cf16) ) \
+ ROM_LOAD64_WORD_BIOS( 20, "01040505.u83", 0x0000004, 0x0100000, CRC(90f32169) SHA1(228be8b4a9eb6b2acf7f7a7561bd194009936026) ) \
+ ROM_LOAD64_WORD_BIOS( 20, "01040505.u70", 0x0000006, 0x0100000, CRC(b9ddea66) SHA1(f4bfdeada39a3f0094d6468b7374a34f88f5df7f) ) \
+ ROM_SYSTEM_BIOS( 21, "au-qld5", "Aristocrat MK6 Base (04041205, Queensland)" ) \
+ ROM_LOAD32_WORD_BIOS( 21, "04041205_right.u83", 0x0000000, 0x0100000, CRC(ca6bc86c) SHA1(69fe7fc35694e4cd7f861bff4ec3a6165a81df6e) ) \
+ ROM_LOAD32_WORD_BIOS( 21, "04041205_left.u70", 0x0000002, 0x0100000, CRC(dfb9a119) SHA1(814a5a7877392aec4e4871d7f0e19d2fbd717409) ) \
+ ROM_SYSTEM_BIOS( 22, "au-qld6", "Aristocrat MK6 Base (03130334, Queensland)" ) \
+ ROM_LOAD32_WORD_BIOS( 22, "03130334_right.u83", 0x0000000, 0x0200000, CRC(bce3d97f) SHA1(da36377cc1465022a2434703adee63bf48c71a9c) ) \
+ ROM_LOAD32_WORD_BIOS( 22, "03130334_left.u70", 0x0000002, 0x0200000, CRC(02175fde) SHA1(4e9a9e1e803a0c84b06aec99dc3147dd7a919eee) ) \
+ ROM_SYSTEM_BIOS( 23, "us1", "Aristocrat MK6 Base (01.02.08, USA)" ) \
+ ROM_LOAD32_WORD_BIOS( 23, "01.02.08_right.u2", 0x0000000, 0x0100000, CRC(aaaeac8c) SHA1(a565e5fcb4f55f31e7d36be40eec234248a66efd) ) \
+ ROM_LOAD32_WORD_BIOS( 23, "01.02.08_left.u3", 0x0000002, 0x0100000, CRC(f29fd1bf) SHA1(33e043d2616e10a1c7a0936c3d208f9bcc2ca6f3) ) \
+ ROM_SYSTEM_BIOS( 24, "us2", "Aristocrat MK6 Base (01.03.03a, USA)" ) \
+ ROM_LOAD32_WORD_BIOS( 24, "01.03.03a_right.u83", 0x0000000, 0x0200000, CRC(253415f4) SHA1(50dc77ad87bc6be1932dda2fd4865602c8c49729) ) \
+ ROM_LOAD32_WORD_BIOS( 24, "01.03.03a_left.u70", 0x0000002, 0x0200000, CRC(4ab5dd40) SHA1(a6812cc624e6a98ea7b0697e2797fe10ba8e303e) ) \
+ ROM_SYSTEM_BIOS( 25, "us3", "Aristocrat MK6 Base (01.03.03e, USA)" ) \
+ ROM_LOAD32_WORD_BIOS( 25, "01.03.03e_right.u83", 0x0000000, 0x0200000, CRC(2255e263) SHA1(5e9e093aaa17172f47a14c3baf7f6f0f73b19398) ) \
+ ROM_LOAD32_WORD_BIOS( 25, "01.03.03e_left.u70", 0x0000002, 0x0200000, CRC(ea50729a) SHA1(14b5a71bfb91ac366ddcb5f77fb54127808f8163) ) \
+ ROM_SYSTEM_BIOS( 26, "us4", "Aristocrat MK6 Base (01.03.05, USA)" ) \
+ ROM_LOAD32_WORD_BIOS( 26, "01.03.05_right.u83", 0x0000000, 0x0200000, CRC(2c7f1ec3) SHA1(d03167f43ed6f9596080d91472695829378cef0a) ) \
+ ROM_LOAD32_WORD_BIOS( 26, "01.03.05_left.u70", 0x0000002, 0x0200000, CRC(0095e3f9) SHA1(d2e8786158b1ab0a614aab21cf1d14cbc04754af) ) \
+ ROM_SYSTEM_BIOS( 27, "us5", "Aristocrat MK6 Base (01.03.06, USA)" ) \
+ ROM_LOAD32_WORD_BIOS( 27, "01.03.06_right.u83", 0x0000000, 0x0200000, CRC(bd48ca55) SHA1(8fb1576cbeb1c64c358880714740195d2e73e03e) ) /* From Diamond Eyes US */ \
+ ROM_LOAD32_WORD_BIOS( 27, "01.03.06_left.u70", 0x0000002, 0x0200000, CRC(2f9d9a29) SHA1(fdebfaca9a579d7249379f19aef22fbfd66bf943) ) \
+ ROM_SYSTEM_BIOS( 28, "us6", "Aristocrat MK6 Base (01.03.07, USA)" ) \
+ ROM_LOAD32_WORD_BIOS( 28, "01.03.07_right.u83", 0x0000000, 0x0200000, CRC(2ebccc4e) SHA1(9342724e4451e9ab24ceae208284b50abd4f0be3) ) \
+ ROM_LOAD32_WORD_BIOS( 28, "01.03.07_left.u70", 0x0000002, 0x0200000, CRC(a3632da4) SHA1(1c96a88e86095b81801ab88e36a4cdfa4b893265) ) \
+ ROM_SYSTEM_BIOS( 29, "us7", "Aristocrat MK6 Base (01.03.14, USA)" ) \
+ ROM_LOAD32_WORD_BIOS( 29, "01.03.14_right.u83", 0x0000000, 0x0200000, CRC(889ffd82) SHA1(9c98c9cdcf5f7d05095f11006418133029e9f0f8) ) /* From 5 Dragons US */ \
+ ROM_LOAD32_WORD_BIOS( 29, "01.03.14_left.u70", 0x0000002, 0x0200000, CRC(7138fec4) SHA1(f81331d1875ac574d3e6c98be218ff25c6c7be5a) ) \
+ ROM_SYSTEM_BIOS( 30, "us8", "Aristocrat MK6 Base (01.03.17, USA)" ) \
+ ROM_LOAD32_WORD_BIOS( 30, "01.03.17_right.u83", 0x0000000, 0x0200000, CRC(1582714b) SHA1(92d0a15314ffe526159bef9a364898dd1ebdfde7) ) \
+ ROM_LOAD32_WORD_BIOS( 30, "01.03.17_left.u70", 0x0000002, 0x0200000, CRC(a88193dc) SHA1(c9e1d483edaecd318d2e5fc8a54e84516c93e0ca) ) \
+ ROM_SYSTEM_BIOS( 31, "us9", "Aristocrat MK6 Base (01.04.14, USA)" ) \
+ ROM_LOAD32_WORD_BIOS( 31, "01.04.04_right.u83", 0x0000000, 0x0200000, CRC(e57ba02d) SHA1(8e29403e6b619eeab41dc171221720bc7820ccdc) ) \
+ ROM_LOAD32_WORD_BIOS( 31, "01.04.04_left.u70", 0x0000002, 0x0200000, CRC(b984a92c) SHA1(90f7a61302caee40195c08565bdac856a3234c1d) ) \
+ ROM_SYSTEM_BIOS( 32, "us10", "Aristocrat MK6 Base (01.04.07, USA)" ) \
+ ROM_LOAD32_WORD_BIOS( 32, "01.04.07_right.u83", 0x0000000, 0x0200000, CRC(23c28e22) SHA1(98f24a1f86232b6c2c288a61ec7d60c867f192e5) ) \
+ ROM_LOAD32_WORD_BIOS( 32, "01.04.07_left.u70", 0x0000002, 0x0200000, CRC(acfb0fe0) SHA1(b1a772d7978e6ff4406a5bb39a71cb3f89608e72) ) \
+ ROM_SYSTEM_BIOS( 33, "us11", "Aristocrat MK6 Base (01.04.08, USA)" ) \
+ ROM_LOAD32_WORD_BIOS( 33, "01.04.08_right.u83", 0x0000000, 0x0200000, CRC(95333304) SHA1(7afe49d6c5e4d6820f349778557daa88c5366a51) ) /* From Bob and Dolly, also u20 on EPROM expansion board */ \
+ ROM_LOAD32_WORD_BIOS( 33, "01.04.08_left.u70", 0x0000002, 0x0200000, CRC(0dfcad10) SHA1(53798be000304aed38909f5fd8470a68bedd8229) ) /* also u10 on EPROM expansion board */ \
+ ROM_SYSTEM_BIOS( 34, "us12", "Aristocrat MK6 Base (01.04.10, USA)" ) \
+ ROM_LOAD32_WORD_BIOS( 34, "01.04.10_right.u83", 0x0000000, 0x0200000, CRC(82ce2fcc) SHA1(4c8fb3db084a67e99d1420b3f895a06ce9ef5ec2) ) \
+ ROM_LOAD32_WORD_BIOS( 34, "01.04.10_left.u70", 0x0000002, 0x0200000, CRC(9d9d52c1) SHA1(b957220cdbedd516c219d1bfc28807ce466df93f) ) \
+ ROM_SYSTEM_BIOS( 35, "us13", "Aristocrat MK6 Base (01.04.11, USA)" ) \
+ ROM_LOAD32_WORD_BIOS( 35, "01.04.11_right.u83", 0x0000000, 0x0200000, CRC(2dae8ca0) SHA1(7a0fb38b4c1ac7195d15bdab6f0cfb16c78430f0) ) \
+ ROM_LOAD32_WORD_BIOS( 35, "01.04.11_left.u70", 0x0000002, 0x0200000, CRC(787f2b07) SHA1(2548289e44f4b935346b759afb5383bdbac04c3e) ) \
+ ROM_SYSTEM_BIOS( 36, "set-us1", "Aristocrat MK6 Set Chips (06.02.04, USA)" ) \
+ ROM_LOAD32_WORD_BIOS( 36, "06.02.04_right.u2", 0x0000000, 0x0100000, CRC(1cf5a853) SHA1(64d17efcce702df7a0b0e151293199478e25226d) ) \
+ ROM_LOAD32_WORD_BIOS( 36, "06.02.04_left.u3", 0x0000002, 0x0100000, CRC(117b75f2) SHA1(2129286853d3c50b8a943b71334d4ef6b98adc05) ) \
+ ROM_SYSTEM_BIOS( 37, "set-us2", "Aristocrat MK6 Set Chips (06.02.20, USA)" ) \
+ ROM_LOAD32_WORD_BIOS( 37, "06.02.20_right.u83", 0x0000000, 0x0100000, CRC(e4001f60) SHA1(5da34efb1ac0f7c84a48e09363d20cfecda4bcf1) ) \
+ ROM_LOAD32_WORD_BIOS( 37, "06.02.20_left.u70", 0x0000002, 0x0100000, CRC(199ed3b9) SHA1(e3ee81ffd713f09e35a10c38e4f59282e2c5cd30) ) \
+ ROM_SYSTEM_BIOS( 38, "set-us3", "Aristocrat MK6 Set Chips (06.03.03, USA)" ) \
+ ROM_LOAD32_WORD_BIOS( 38, "06.03.03_right.u2", 0x0000000, 0x0100000, CRC(98763498) SHA1(246e95cc12eb34f946b2f4938c59217718f6d841) ) \
+ ROM_LOAD32_WORD_BIOS( 38, "06.03.03_left.u3", 0x0000002, 0x0100000, CRC(a6924238) SHA1(b71ab39bf9c1fdbab556028138749e8c040ec83c) ) \
+ ROM_SYSTEM_BIOS( 39, "set-us4", "Aristocrat MK6 Set Chips (06.03.04, USA)" ) \
+ ROM_LOAD32_WORD_BIOS( 39, "06.03.04_right.u2", 0x0000000, 0x0100000, CRC(6f5f5ef1) SHA1(70a43fba4de47ed8dcf38b25eafd5873f3428e72) ) \
+ ROM_LOAD32_WORD_BIOS( 39, "06.03.04_left.u3", 0x0000002, 0x0100000, CRC(7034f26b) SHA1(7be78f23bec38d05240cdfe1186ec0c8291f5a1c) )
ROM_START( aristmk6 )
ARISTMK6_BIOS
@@ -814,6 +828,14 @@ ROM_START( bigbena )
ROM_LOAD32_WORD("20126911.u72", 0x0800002, 0x0400000, CRC(d59c8c69) SHA1(b37a3d3061e6209a93e0a5de4a59ea073eedbbb7) )
ROM_END
+ROM_START( bigbenq )
+ ARISTMK6_BIOS
+ ROM_REGION( 0x4000000, "game_rom", ROMREGION_ERASEFF)
+ ROM_LOAD32_WORD("20201111.u86", 0x0000000, 0x0400000, CRC(c27488bc) SHA1(b4d6e89b093fe850160baef067df9f261723c02e) )
+ ROM_LOAD32_WORD("20201111.u73", 0x0000002, 0x0400000, CRC(d0429338) SHA1(c9e31a874603d7397b4720a3d88030671f0e8d27) )
+ ROM_LOAD32_WORD("20201111.u85", 0x0800000, 0x0400000, CRC(8105b054) SHA1(b346ab044f311909803512e014a1af1bc8ada684) )
+ ROM_LOAD32_WORD("20201111.u72", 0x0800002, 0x0400000, CRC(63f90aad) SHA1(2bbec33552cd3c134c4f66c49181a4b875d9daf0) )
+ROM_END
ROM_START( bigheart )
ARISTMK6_BIOS
@@ -1037,8 +1059,8 @@ ROM_END
/*
- Chance In Hell - Li'l Lucy
- The Li'l Lucy character was originally called Lucky Devil in Australia.
+ Chance In Hell - Lil' Lucy
+ The Lil' Lucy character was originally called Lucky Devil in Australia.
*/
ROM_START( cinhell )
ARISTMK6_BIOS
@@ -1079,7 +1101,18 @@ ROM_START( csdm )
ROM_LOAD32_WORD("20131511.u86", 0x0000000, 0x0400000, CRC(06f78c92) SHA1(e8bd3f18831dfb5c644321541fa9e75ae9e83688) )
ROM_LOAD32_WORD("20131511.u73", 0x0000002, 0x0400000, CRC(5b2468b6) SHA1(085aa44343f11fdf5ab7cc1ca56ddb0ba5cafc36) )
ROM_LOAD32_WORD("20131511.u85", 0x0800000, 0x0400000, CRC(6973dffd) SHA1(4350e0cdfeb9135e708f15bf2de325b8412c1434) )
- ROM_LOAD32_WORD("20131511.u72", 0x0800002, 0x0400000 ,CRC(1c9a77d1) SHA1(ef31215be73b09531039fda1a2f3e875045180f3) )
+ ROM_LOAD32_WORD("20131511.u72", 0x0800002, 0x0400000, CRC(1c9a77d1) SHA1(ef31215be73b09531039fda1a2f3e875045180f3) )
+ROM_END
+
+
+ROM_START( csdq )
+ ARISTMK6_BIOS
+
+ ROM_REGION( 0x4000000, "game_rom", ROMREGION_ERASEFF)
+ ROM_LOAD32_WORD("10121111.u86", 0x0000000, 0x0400000, CRC(cbcabeae) SHA1(ebc951037bfda441833beb5b0ca102dc76fcc901) )
+ ROM_LOAD32_WORD("10121111.u73", 0x0000002, 0x0400000, CRC(4bb97e62) SHA1(8144b6ec8a69b12fd4e4641999a988ad6a9e5160) )
+ ROM_LOAD32_WORD("10121111.u85", 0x0800000, 0x0400000, CRC(8425f9d0) SHA1(81a86caf20d2ee18f6a3e68da58e69ff00bbc68a) )
+ ROM_LOAD32_WORD("10121111.u72", 0x0800002, 0x0400000, CRC(f11f4f9d) SHA1(684930290f8b5c933bb72a08db4875ce9b7483da) )
ROM_END
@@ -1244,6 +1277,16 @@ ROM_START( dbldolph )
ROM_END
+ROM_START( dbldolphq )
+ ARISTMK6_BIOS
+ ROM_REGION( 0x4000000, "game_rom", ROMREGION_ERASEFF)
+ ROM_LOAD32_WORD("40003211.u86", 0x0000000, 0x0400000, CRC(73fbb9df) SHA1(3f5e68f24d4d38f0b514acaac0672ca2a40f31f3) )
+ ROM_LOAD32_WORD("40003211.u73", 0x0000002, 0x0400000, CRC(e69e12f2) SHA1(176af1d3177da18468673a9a52672c97a278c75a) )
+ ROM_LOAD32_WORD("40003211.u85", 0x0800000, 0x0400000, CRC(7df3105d) SHA1(df287fd3f42aff0a0b3bbab5a40723de6170d488) )
+ ROM_LOAD32_WORD("40003211.u72", 0x0800002, 0x0400000, CRC(7c366f7f) SHA1(9816f8ef8ae7f1d3083a5094ce27e17df478dc3a) )
+ROM_END
+
+
ROM_START( drgnlord )
ARISTMK6_BIOS
ROM_REGION( 0x4000000, "game_rom", ROMREGION_ERASEFF)
@@ -1514,6 +1557,14 @@ ROM_START( gldgong )
ROM_END
+ROM_START( gldgongq )
+ ARISTMK6_BIOS
+ ROM_REGION( 0x4000000, "game_rom", ROMREGION_ERASEFF)
+ ROM_LOAD32_WORD("10217411.u86", 0x0000000, 0x0400000, CRC(e2d0c057) SHA1(9311faeb430eaae41b6c42711cf87e3824a88933) )
+ ROM_LOAD32_WORD("10217411.u73", 0x0000002, 0x0400000, CRC(4be87efb) SHA1(6775853e14f771f784ac05d1a63534cd1aedca21) )
+ROM_END
+
+
ROM_START( goldinc )
ARISTMK6_BIOS
ROM_REGION( 0x4000000, "game_rom", ROMREGION_ERASEFF)
@@ -1931,6 +1982,18 @@ ROM_START( magmerm )
ROM_END
+ROM_START( magician )
+ ARISTMK6_BIOS
+ ROM_REGION( 0x4000000, "game_rom", ROMREGION_ERASEFF)
+ ROM_LOAD32_WORD("20210111.u86", 0x0000000, 0x0400000, CRC(d5763bfa) SHA1(c8363f855bc1962588e35acf11c847e1c3c1775b) )
+ ROM_LOAD32_WORD("20210111.u73", 0x0000002, 0x0400000, CRC(6198b73e) SHA1(1459212376c25df9f3120dc4e3567dfd30b8dd96) )
+ ROM_LOAD32_WORD("20210111.u85", 0x0800000, 0x0400000, CRC(ae216d29) SHA1(d40ee5d9a6f96d7cc6b38ccbe1dc9b2f543a35f3) )
+ ROM_LOAD32_WORD("20210111.u72", 0x0800002, 0x0400000, CRC(7fb305d3) SHA1(c79bae5a62bb3aa9090fd6cac91d35a950300146) )
+ ROM_LOAD32_WORD("20210111.u84", 0x1000000, 0x0400000, CRC(dbb4f1ee) SHA1(f4064ba792a5705209b3221ceb2f3d828c73df1c) )
+ ROM_LOAD32_WORD("20210111.u71", 0x1000002, 0x0400000, CRC(67a0906d) SHA1(3f0f8f17dfcc5d1fe38e0737cd623594076bbd2d) )
+ROM_END
+
+
ROM_START( metestrm )
ARISTMK6_BIOS
ROM_REGION( 0x4000000, "game_rom", ROMREGION_ERASEFF)
@@ -1973,6 +2036,16 @@ ROM_START( mnytree )
ROM_END
+ROM_START( moonfire )
+ ARISTMK6_BIOS
+ ROM_REGION( 0x4000000, "game_rom", ROMREGION_ERASEFF)
+ ROM_LOAD32_WORD("30164211.u86", 0x0000000, 0x0400000, CRC(9d60754d) SHA1(ab62e0f92191821b8e76dbaf3bd37303cb94187e) )
+ ROM_LOAD32_WORD("30164211.u73", 0x0000002, 0x0400000, CRC(56a5ea19) SHA1(2f89527fe3dfdcab088cd3a7ab51a26816fe14dc) )
+ ROM_LOAD32_WORD("30164211.u85", 0x0800000, 0x0400000, CRC(01d1f670) SHA1(efca261e4810f683084baa1cac03304cdd233ef9) )
+ ROM_LOAD32_WORD("30164211.u72", 0x0800002, 0x0400000, CRC(21ebecc5) SHA1(dfd69f1ebea56b5cf49d67a437c7016410ea65c4) )
+ROM_END
+
+
ROM_START( moonwalt )
ARISTMK6_BIOS
ROM_REGION( 0x4000000, "game_rom", ROMREGION_ERASEFF)
@@ -2421,6 +2494,16 @@ ROM_START( qnilea6 )
ROM_END
+ROM_START( qnilemt2 )
+ ARISTMK6_BIOS
+ ROM_REGION( 0x4000000, "game_rom", ROMREGION_ERASEFF)
+ ROM_LOAD32_WORD("10203811.u86", 0x0000000, 0x0400000, CRC(8822085a) SHA1(1cf43815eeab91cb3df18f4b64c6815b449184e3) )
+ ROM_LOAD32_WORD("10203811.u73", 0x0000002, 0x0400000, CRC(01bfd58d) SHA1(8ba07b37624469bf802118a7778bb1d52b3649b8) )
+ ROM_LOAD32_WORD("10203811.u85", 0x0800000, 0x0400000, CRC(364f2565) SHA1(f6c24c7f59f356c63c8ceda82243a5d99f4f81d8) )
+ ROM_LOAD32_WORD("10203811.u72", 0x0800002, 0x0400000, CRC(af15bb42) SHA1(a5f8a7dd037fd6402db983b5cabaa156599ba9f2) )
+ROM_END
+
+
ROM_START( qnilese )
ARISTMK6_BIOS
ROM_REGION( 0x4000000, "game_rom", ROMREGION_ERASEFF)
@@ -2487,6 +2570,26 @@ ROM_START( redbara6 )
ROM_END
+ROM_START( redbarfl )
+ ARISTMK6_BIOS
+ ROM_REGION( 0x4000000, "game_rom", ROMREGION_ERASEFF)
+ ROM_LOAD32_WORD("10160711.u86", 0x0000000, 0x0400000, CRC(6deec801) SHA1(7a3a7ee88d116cc3f78ca77b66247c0271130682) )
+ ROM_LOAD32_WORD("10160711.u73", 0x0000002, 0x0400000, CRC(8467e3a6) SHA1(4abef9510a3d71166fa0ece928f936171de784b3) )
+ ROM_LOAD32_WORD("10160711.u85", 0x0800000, 0x0400000, CRC(5d77ca06) SHA1(22c6cccf6f0ddb9ee95691180299c55b0b8b5747) )
+ ROM_LOAD32_WORD("10160711.u72", 0x0800002, 0x0400000, CRC(91993744) SHA1(e8ac54b233eb47c525225318a07f2e58246c5131) )
+ROM_END
+
+
+ROM_START( reelrkfl )
+ ARISTMK6_BIOS
+ ROM_REGION( 0x4000000, "game_rom", ROMREGION_ERASEFF)
+ ROM_LOAD32_WORD("10298611.u86", 0x0000000, 0x0400000, CRC(efb8f415) SHA1(b779fda43bb63d947f3ddad84cf324d530d20728) )
+ ROM_LOAD32_WORD("10298611.u73", 0x0000002, 0x0400000, CRC(2eee9ff5) SHA1(0fb78b79df4efb71d1da850b11ca11c92fb47858) )
+ ROM_LOAD32_WORD("10298611.u85", 0x0800000, 0x0400000, CRC(1f1c2b5b) SHA1(c2617a8d518f58cb622f3d9859a0f7d1766d359a) )
+ ROM_LOAD32_WORD("10298611.u72", 0x0800002, 0x0400000, CRC(e58d6bc4) SHA1(d6cfb78c570f50f65c27c01f804720e499d623b3) )
+ROM_END
+
+
ROM_START( retsama6 )
ARISTMK6_BIOS
ROM_REGION( 0x4000000, "game_rom", ROMREGION_ERASEFF)
@@ -2621,6 +2724,16 @@ ROM_START( smtma6 )
ROM_END
+ROM_START( smtma6q )
+ ARISTMK6_BIOS
+ ROM_REGION( 0x4000000, "game_rom", ROMREGION_ERASEFF)
+ ROM_LOAD32_WORD("10015711.u86", 0x0000000, 0x0400000, CRC(f15a79e5) SHA1(82ef7f28460623bbafa704c9e26e914d4be1cb7f) )
+ ROM_LOAD32_WORD("10015711.u73", 0x0000002, 0x0400000, CRC(906cbb69) SHA1(21775cc58425e828d6d77e11d07167acb6867f82) )
+ ROM_LOAD32_WORD("10015711.u85", 0x0800000, 0x0400000, CRC(722ea31f) SHA1(6ace379272ca207449a4b03df480929eb1636593) )
+ ROM_LOAD32_WORD("10015711.u72", 0x0800002, 0x0400000, CRC(b208c54e) SHA1(ad833271972f58bb866ca63f68d8f5dd67b275b2) )
+ROM_END
+
+
ROM_START( silkrda6 )
ARISTMK6_BIOS
ROM_REGION( 0x4000000, "game_rom", ROMREGION_ERASEFF)
@@ -2671,6 +2784,18 @@ ROM_START( spgcarnq )
ROM_END
+ROM_START( spgfest )
+ ARISTMK6_BIOS
+ ROM_REGION( 0x4000000, "game_rom", ROMREGION_ERASEFF)
+ ROM_LOAD32_WORD("20262311.u86", 0x0000000, 0x0400000, CRC(fba59959) SHA1(28fd5f54a627ba097d1841fff17b3be5b4e08619) )
+ ROM_LOAD32_WORD("20262311.u73", 0x0000002, 0x0400000, CRC(ea2b0902) SHA1(d4ff35750c473b7816e9bd8db3ab88f235a96041) )
+ ROM_LOAD32_WORD("20262311.u85", 0x0800000, 0x0400000, CRC(692260eb) SHA1(410b038ab2254d207608033986f9ce90866f0c71) )
+ ROM_LOAD32_WORD("20262311.u72", 0x0800002, 0x0400000, CRC(1d645199) SHA1(31f51022c7533b52b7933fc3baec374b1df4f35c) )
+ ROM_LOAD32_WORD("20262311.u84", 0x1000000, 0x0400000, CRC(b7c8700e) SHA1(72123d279931b758d08b5760c5f4c38e77611790) )
+ ROM_LOAD32_WORD("20262311.u71", 0x1000002, 0x0400000, CRC(3c2baee2) SHA1(fc03ca7e96d0e877a4f8a8f267f874c374e018d8) )
+ROM_END
+
+
ROM_START( stardrft )
ARISTMK6_BIOS
ROM_REGION( 0x4000000, "game_rom", ROMREGION_ERASEFF)
@@ -3006,6 +3131,17 @@ ROM_START( wheregldm )
ROM_END
+ROM_START( wheregldq )
+ ARISTMK6_BIOS
+
+ ROM_REGION( 0x4000000, "game_rom", ROMREGION_ERASEFF)
+ ROM_LOAD32_WORD("20184811.u86", 0x0000000, 0x0400000, CRC(95da579c) SHA1(230a18b76e72f09ea74543bd6a7a31ae51bf651e) )
+ ROM_LOAD32_WORD("20184811.u73", 0x0000002, 0x0400000, CRC(c35095ec) SHA1(637c5cfbb985716140a0e123c23ba13bffc2e734) )
+ ROM_LOAD32_WORD("20184811.u85", 0x0800000, 0x0400000, CRC(1520539c) SHA1(9f3503bfcadc74f9e12ea7300b3356e9efb00b5a) )
+ ROM_LOAD32_WORD("20184811.u72", 0x0800002, 0x0400000, CRC(50ed1445) SHA1(6b623965b95352d7f79700a075eaf4eb2019dee8) )
+ROM_END
+
+
ROM_START( whtwater )
ARISTMK6_BIOS
ROM_REGION( 0x4000000, "game_rom", ROMREGION_ERASEFF)
@@ -3221,6 +3357,7 @@ GAME( 2008, beavbuk, aristmk6, aristmk6, aristmk6, aristmk6_state, empty_init
GAME( 2003, betzoo, aristmk6, aristmk6, aristmk6, aristmk6_state, empty_init, ROT0, "Aristocrat", "Betting Zoo - Mr. Cashman (0251064, US)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) // US037, B - 01/28/03
GAME( 2003, bigben, aristmk6, aristmk6, aristmk6, aristmk6_state, empty_init, ROT0, "Aristocrat", "Big Ben (30126911, NSW/ACT)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) // 710, B - 17/07/03
GAME( 2003, bigbena, bigben, aristmk6, aristmk6, aristmk6_state, empty_init, ROT0, "Aristocrat", "Big Ben (20126911, NSW/ACT)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) // 710, B - 17/07/03
+GAME( 2005, bigbenq, bigben, aristmk6, aristmk6, aristmk6_state, empty_init, ROT0, "Aristocrat", "Big Ben (20201111, Queensland)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) // 710/3, C - 09/08/05
GAME( 1999, bigheart, aristmk6, aristmk6, aristmk6, aristmk6_state, empty_init, ROT0, "Aristocrat", "Big Hearted (10000511, NSW/ACT)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) // 637, D - 15/11/99
GAME( 2002, bigred, aristmk6, aristmk6, aristmk6, aristmk6_state, empty_init, ROT0, "Aristocrat", "Big Red (2J009211, NSW/ACT)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) // JB015, D - 27/09/02
GAME( 2002, bigreda, bigred, aristmk6, aristmk6, aristmk6_state, empty_init, ROT0, "Aristocrat", "Big Red (1J009211, NSW/ACT)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) // JB015, D - 27/09/02
@@ -3231,7 +3368,7 @@ GAME( 2007, bluetigr, aristmk6, aristmk6, aristmk6, aristmk6_state, empty_init
GAME( 2007, bobdolly, aristmk6, aristmk6, aristmk6, aristmk6_state, empty_init, ROT0, "Aristocrat", "Bob and Dolly (0352298, US)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) // US243, A - 10/15/07
GAME( 2005, brazil, aristmk6, aristmk6, aristmk6, aristmk6_state, empty_init, ROT0, "Aristocrat", "Brazil (20180311, NSW/ACT)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) // 783, B - 25/02/05
GAME( 2004, bucaneer, aristmk6, aristmk6, aristmk6, aristmk6_state, empty_init, ROT0, "Aristocrat", "Buccaneer (10173011, NSW/ACT)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) // 765, A - 05/04/04
-GAME( 2005, bucaneeru, aristmk6, aristmk6, aristmk6, aristmk6_state, empty_init, ROT0, "Aristocrat", "Buccaneer (0252523, US)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) // MV4229, B - 01/07/05
+GAME( 2005, bucaneeru, bucaneer, aristmk6, aristmk6, aristmk6_state, empty_init, ROT0, "Aristocrat", "Buccaneer (0252523, US)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) // MV4229, B - 01/07/05
GAME( 2010, buckstop, aristmk6, aristmk6, aristmk6, aristmk6_state, empty_init, ROT0, "Aristocrat", "The Buck Stops Here (10294311, NSW/ACT)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) // 897/1, A - 22/07/10
GAME( 2006, buffalo, aristmk6, aristmk6, aristmk6, aristmk6_state, empty_init, ROT0, "Aristocrat", "Buffalo (10217811, NSW/ACT)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) // 806, E - 06/10/06
GAME( 2006, buffalou, buffalo, aristmk6, aristmk6, aristmk6_state, empty_init, ROT0, "Aristocrat", "Buffalo (0252636, US)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) // MV4328, (no data)
@@ -3242,10 +3379,11 @@ GAME( 2007, callwld, aristmk6, aristmk6, aristmk6, aristmk6_state, empty_init
GAME( 2005, calyking, aristmk6, aristmk6, aristmk6, aristmk6_state, empty_init, ROT0, "Aristocrat", "Calypso King (20197111, NSW/ACT)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) // 772/1, B - 25/07/05
GAME( 2006, canaryrc, aristmk6, aristmk6, aristmk6, aristmk6_state, empty_init, ROT0, "Aristocrat", "Canary Riches (10218211, NSW/ACT)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) // 809, A - 30/03/06
GAME( 2005, cmtonig, aristmk6, aristmk6, aristmk6, aristmk6_state, empty_init, ROT0, "Aristocrat", "Cashman Tonight (30194711, NSW/ACT)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) // MG0007, B - 25/05/05
-GAME( 2004, cinhell, aristmk6, aristmk6, aristmk6, aristmk6_state, empty_init, ROT0, "Aristocrat", "Chance in Hell - Li'l Lucy (0251125, US)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) // US119, A - 06/30/04
+GAME( 2004, cinhell, aristmk6, aristmk6, aristmk6, aristmk6_state, empty_init, ROT0, "Aristocrat", "Chance in Hell - Lil' Lucy (0251125, US)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) // US119, A - 06/30/04
GAME( 2002, csd, aristmk6, aristmk6, aristmk6, aristmk6_state, empty_init, ROT0, "Aristocrat", "Choy Sun Doa (10104011, NSW/ACT)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) // 688, A - 23/04/02
GAME( 2002, csdsp, csd, aristmk6, aristmk6, aristmk6_state, empty_init, ROT0, "Aristocrat", "Choy Sun Doa (20104011, NSW/ACT, Show Program)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) // 688, A - 23/04/02
GAME( 2003, csdm, csd, aristmk6, aristmk6, aristmk6_state, empty_init, ROT0, "Aristocrat", "Choy Sun Doa (20131511, Malaysia)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) // 688, A - 23/01/03
+GAME( 2002, csdq, csd, aristmk6, aristmk6, aristmk6_state, empty_init, ROT0, "Aristocrat", "Choy Sun Doa (10121111, Queensland)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) // 688, C - 05/07/02
GAME( 2003, csdce, csd, aristmk6, aristmk6, aristmk6_state, empty_init, ROT0, "Aristocrat", "Choy Sun Doa - Cash Express (30149511, NSW/ACT)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) // 688, A - 03/02/03
GAME( 2006, csret, aristmk6, aristmk6, aristmk6, aristmk6_state, empty_init, ROT0, "Aristocrat", "Choy Sun Returns (20212211, NSW/ACT)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) // 744/2, B - 15/08/06
GAME( 2005, corrida, aristmk6, aristmk6, aristmk6, aristmk6_state, empty_init, ROT0, "Aristocrat", "Corrida de Toros (30178311, NSW/ACT)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) // 771, D - 22/03/05
@@ -3262,6 +3400,7 @@ GAME( 2002, di4ever, aristmk6, aristmk6, aristmk6, aristmk6_state, empty_init
GAME( 2003, dinosa6, aristmk6, aristmk6, aristmk6, aristmk6_state, empty_init, ROT0, "Aristocrat", "Dinosaur (10118811, NSW/ACT)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) // 731, C - 08/08/03
GAME( 2005, dblagent, aristmk6, aristmk6, aristmk6, aristmk6_state, empty_init, ROT0, "Aristocrat", "Double Agent (0152082, US)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) // US180, A - 12/09/05
GAME( 2000, dbldolph, aristmk6, aristmk6, aristmk6, aristmk6_state, empty_init, ROT0, "Aristocrat", "Double Dolphins (20000211, NSW/ACT)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) // 647, C - 18/04/00
+GAME( 2000, dbldolphq, dbldolph, aristmk6, aristmk6, aristmk6_state, empty_init, ROT0, "Aristocrat", "Double Dolphins (40003211, Queensland)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) // 647, F - 17/11/00
GAME( 2004, drgnlord, aristmk6, aristmk6, aristmk6, aristmk6_state, empty_init, ROT0, "Aristocrat", "Dragon Lord (10173511, NSW/ACT)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) // 761, A - 22/06/04
GAME( 2006, drgnmgic, aristmk6, aristmk6, aristmk6, aristmk6_state, empty_init, ROT0, "Aristocrat", "Dragon Magic (2J015711, NSW/ACT)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) // JB051, E - 05/07/06
GAME( 2003, drmcatch, aristmk6, aristmk6, aristmk6, aristmk6_state, empty_init, ROT0, "Aristocrat", "Dream Catcher (10126721, NSW/ACT)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) // 704, F - 23/06/03
@@ -3289,6 +3428,7 @@ GAME( 2001, gogreen, aristmk6, aristmk6, aristmk6, aristmk6_state, empty_init
GAME( 2005, goldarch, aristmk6, aristmk6, aristmk6, aristmk6_state, empty_init, ROT0, "Aristocrat", "Golden Archer (10197411, NSW/ACT)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) // 770, A - 07/07/05
GAME( 2003, gldnflc, aristmk6, aristmk6, aristmk6, aristmk6_state, empty_init, ROT0, "Aristocrat", "The Golden Fleece (10158311, NSW/ACT)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) // 680/2, A-07/07/03
GAME( 2005, gldgong, aristmk6, aristmk6, aristmk6, aristmk6_state, empty_init, ROT0, "Aristocrat", "The Golden Gong (0152558, US)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) // MV4258, C - 08/18/05
+GAME( 2005, gldgongq, gldgong, aristmk6, aristmk6, aristmk6_state, empty_init, ROT0, "Aristocrat", "The Golden Gong (10217411, Queensland)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) // 710/3, C - 09/08/05, Identical date string to Big Ben above (the games are identical but with different graphics)
GAME( 2004, goldinc, aristmk6, aristmk6, aristmk6, aristmk6_state, empty_init, ROT0, "Aristocrat", "Golden Incas (10174011, NSW/ACT, Show Program)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) // 752, A - 07/04/04
GAME( 2005, goldincu, goldinc, aristmk6, aristmk6, aristmk6_state, empty_init, ROT0, "Aristocrat", "Golden Incas (0252533, US)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) // MV4244, A - 03/10/05
GAME( 2002, goldpym, aristmk6, aristmk6, aristmk6, aristmk6_state, empty_init, ROT0, "Aristocrat", "Golden Pyramids Special Edition - Maximillions (10130811, NSW/ACT)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) // 683/1, A - 21/10/02
@@ -3317,7 +3457,7 @@ GAME( 2005, kingnep, aristmk6, aristmk6, aristmk6, aristmk6_state, empty_init
GAME( 2003, kingnile, aristmk6, aristmk6, aristmk6, aristmk6_state, empty_init, ROT0, "Aristocrat", "King of the Nile (30106331, NSW/ACT)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) // 687, D - 07/01/03
GAME( 2002, kingnilea, kingnile, aristmk6, aristmk6, aristmk6_state, empty_init, ROT0, "Aristocrat", "King of the Nile (20106321, NSW/ACT)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) // 687, C - 27/09/02
GAME( 2002, kingpeng, aristmk6, aristmk6, aristmk6, aristmk6_state, empty_init, ROT0, "Aristocrat", "King Penguin (20109021, NSW/ACT)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) // 696, D - 02/10/02
-GAME( 2002, kingpengsp, aristmk6, aristmk6, aristmk6, aristmk6_state, empty_init, ROT0, "Aristocrat", "King Penguin (40109021, NSW/ACT, Show Program)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) // 696, E- 26/11/02
+GAME( 2002, kingpengsp, kingpeng, aristmk6, aristmk6, aristmk6_state, empty_init, ROT0, "Aristocrat", "King Penguin (40109021, NSW/ACT, Show Program)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) // 696, E- 26/11/02
GAME( 2000, koalama6, aristmk6, aristmk6, aristmk6, aristmk6_state, empty_init, ROT0, "Aristocrat", "Koala Mint (30001011, NSW/ACT)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) // 643/6, A- 01/09/00
GAME( 2003, kohinoor, aristmk6, aristmk6, aristmk6, aristmk6_state, empty_init, ROT0, "Aristocrat", "Kohinoor (10136711, NSW/ACT)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) // 602/21, B - 10/02/03
GAME( 2006, lgfish, aristmk6, aristmk6, aristmk6, aristmk6_state, empty_init, ROT0, "Aristocrat", "Let's Go Fish'n (10220111, NSW/ACT)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) // 756, E - 23/05/06
@@ -3330,10 +3470,12 @@ GAME( 2007, lucky88, aristmk6, aristmk6, aristmk6, aristmk6_state, empty_init
GAME( 2007, luigibal, aristmk6, aristmk6, aristmk6, aristmk6_state, empty_init, ROT0, "Aristocrat", "Luigi's Ball (10235411, NSW/ACT)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) // 822, D - 19/03/07
GAME( 2005, magforst, aristmk6, aristmk6, aristmk6, aristmk6_state, empty_init, ROT0, "Aristocrat", "Magic Forest (0151139, US)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) // US141, D - 02/01/05
GAME( 2003, magmerm, aristmk6, aristmk6, aristmk6, aristmk6_state, empty_init, ROT0, "Aristocrat", "Magic Mermaid (0251331, US)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) // JB013/20, F - 10/13/03
+GAME( 2006, magician, aristmk6, aristmk6, aristmk6, aristmk6_state, empty_init, ROT0, "Aristocrat", "The Magician (20210111, NSW/ACT)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) // 801, C - 01/03/06
GAME( 2007, metestrm, aristmk6, aristmk6, aristmk6, aristmk6_state, empty_init, ROT0, "Aristocrat", "Meteor Storm (0152162, US)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) // US217, A - 03/19/07
GAME( 2007, milkin, aristmk6, aristmk6, aristmk6, aristmk6_state, empty_init, ROT0, "Aristocrat", "Milkin' It (10251911, NSW/ACT)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) // 816, B - 13/08/07
GAME( 2005, mskitty, aristmk6, aristmk6, aristmk6, aristmk6_state, empty_init, ROT0, "Aristocrat", "Miss Kitty (10216611, NSW/ACT)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) // 778, C - 18/04/05
GAME( 2000, mnytree, aristmk6, aristmk6, aristmk6, aristmk6_state, empty_init, ROT0, "Aristocrat", "Money Tree (10001211, NSW/ACT)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) // 657, E - 06/11/00
+GAME( 2004, moonfire, aristmk6, aristmk6, aristmk6, aristmk6_state, empty_init, ROT0, "Aristocrat", "Moon Fire - Jackpot Carnival (30164211, Queensland)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) // 628/3, E - 27/01/04
GAME( 2007, moonwalt, aristmk6, aristmk6, aristmk6, aristmk6_state, empty_init, ROT0, "Aristocrat", "Moonlight Waltz (10227611, NSW/ACT)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) // 814/1, B - 11/01/07
GAME( 2008, mchilli, aristmk6, aristmk6, aristmk6, aristmk6_state, empty_init, ROT0, "Aristocrat", "More Chilli (20248711, NSW/ACT)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) // 844, B - 21/01/08
GAME( 2010, mchilliq, mchilli, aristmk6, aristmk6, aristmk6_state, empty_init, ROT0, "Aristocrat", "More Chilli (20289311, Queensland)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) // 844/2, B - 14/12/10
@@ -3373,13 +3515,17 @@ GAME( 2002, pompeia6ua, pompeia6, aristmk6, aristmk6, aristmk6_state, empty_init
GAME( 2005, prideaf, aristmk6, aristmk6, aristmk6, aristmk6_state, empty_init, ROT0, "Aristocrat", "Pride of Africa (10208511, NSW/ACT)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) // 628/9, J - 06/12/05
GAME( 2004, prophecy, aristmk6, aristmk6, aristmk6, aristmk6_state, empty_init, ROT0, "Aristocrat", "Prophecy (20173411, NSW/ACT)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) // 734, B - 10/08/04
GAME( 2005, qnilea6, aristmk6, aristmk6, aristmk6, aristmk6_state, empty_init, ROT0, "Aristocrat", "Queen of the Nile (3J011111, NSW/ACT)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) // JB027, C - 16/02/05
+GAME( 2005, qnilemt2, qnilea6, aristmk6, aristmk6, aristmk6_state, empty_init, ROT0, "Aristocrat", "Queen of the Nile - Money Train II (10203811, Queensland)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) // 602/23, E - 17/11/05
GAME( 2001, qnilese, aristmk6, aristmk6, aristmk6, aristmk6_state, empty_init, ROT0, "Aristocrat", "Queen of the Nile Special Edition (20102811, NSW/ACT)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) // 683, A - 06/12/01
-GAME( 2001, qnilesea, aristmk6, aristmk6, aristmk6, aristmk6_state, empty_init, ROT0, "Aristocrat", "Queen of the Nile Special Edition (10102811, NSW/ACT)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) // 683, A - 06/12/01
+GAME( 2001, qnilesea, qnilese, aristmk6, aristmk6, aristmk6_state, empty_init, ROT0, "Aristocrat", "Queen of the Nile Special Edition (10102811, NSW/ACT)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) // 683, A - 06/12/01
GAME( 2002, qnilejc, qnilese, aristmk6, aristmk6, aristmk6_state, empty_init, ROT0, "Aristocrat", "Queen of the Nile Special Edition - Jackpot Carnival (20123911, NSW/ACT)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) // 683/1, A - 21/10/02
GAME( 2002, qnilejcsp, qnilese, aristmk6, aristmk6, aristmk6_state, empty_init, ROT0, "Aristocrat", "Queen of the Nile Special Edition - Jackpot Carnival (20123911, NSW/ACT, Show Program)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) // 683/1, A - 21/10/02
GAME( 2003, qsheba, aristmk6, aristmk6, aristmk6, aristmk6_state, empty_init, ROT0, "Aristocrat", "Queen of Sheba (10133711, NSW/ACT)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) // 687, F - 04/03/03
GAME( 2005, raprichs, aristmk6, aristmk6, aristmk6, aristmk6_state, empty_init, ROT0, "Aristocrat", "Rapid Riches (10194211, NSW/ACT)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) // 762, D - 09/03/05
GAME( 2002, redbara6, aristmk6, aristmk6, aristmk6, aristmk6_state, empty_init, ROT0, "Aristocrat", "Red Baron (10119911, NSW/ACT)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) // 709, B - 21/11/02
+GAME( 2003, redbarfl, redbara6, aristmk6, aristmk6, aristmk6_state, empty_init, ROT0, "Aristocrat", "Red Baron - Fast Lane (10160711, Queensland)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) // 709, E - 04/12/03
+// The following is clearly not a year 2000 game (an ID of #2986 would be from around 2010, note similar ID number region to buckstop/werewildq), the date string is most likely unchanged from the original MK5 20 line version which actually was released in 2000.
+GAME( 201?, reelrkfl, aristmk6, aristmk6, aristmk6, aristmk6_state, empty_init, ROT0, "Aristocrat", "Reelin-n-Rockin - Fast Lane (10298611, Queensland)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) // 628/2, E - 20/12/00
GAME( 2002, retsama6, aristmk6, aristmk6, aristmk6, aristmk6_state, empty_init, ROT0, "Aristocrat", "Return of the Samurai (10117211, NSW/ACT)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) // 628/10, A - 26/08/02
GAME( 2005, roadtrip, aristmk6, aristmk6, aristmk6, aristmk6_state, empty_init, ROT0, "Aristocrat", "Road Trip (0152539, US)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) // MV4238, C - 08/18/05
GAME( 2002, ruprup, aristmk6, aristmk6, aristmk6, aristmk6_state, empty_init, ROT0, "Aristocrat", "Roll Up! Roll Up!! (10115911, NSW/ACT)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) // 642/5, A - 22/08/02
@@ -3393,11 +3539,13 @@ GAME( 2006, shamnmg, aristmk6, aristmk6, aristmk6, aristmk6_state, empty_init
GAME( 200?, shamnmgu, shamnmg, aristmk6, aristmk6, aristmk6_state, empty_init, ROT0, "Aristocrat", "Shaman's Magic (0152647, US)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) // MV4318/1, (no data)
GAME( 2004, shorthng, aristmk6, aristmk6, aristmk6, aristmk6_state, empty_init, ROT0, "Aristocrat", "Shore Thing (0251088, US)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) // US087, B - 1/30/04
GAME( 2001, smtma6, aristmk6, aristmk6, aristmk6, aristmk6_state, empty_init, ROT0, "Aristocrat", "Show Me The Money (10001911, NSW/ACT)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) // 657/1, B - 08/01/01
+GAME( 2001, smtma6q, smtma6, aristmk6, aristmk6, aristmk6_state, empty_init, ROT0, "Aristocrat", "Show Me The Money (10015711, Queensland)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) // 657/1, D - 31/05/01
GAME( 2006, silkrda6, aristmk6, aristmk6, aristmk6, aristmk6_state, empty_init, ROT0, "Aristocrat", "Silk Road (0152537, US)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) // MV4248/4, D - 02/09/06
GAME( 2002, silgola6, aristmk6, aristmk6, aristmk6, aristmk6_state, empty_init, ROT0, "Aristocrat", "Silver & Gold (20100721, NSW/ACT)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) // 672/1, G - 08/07/02
GAME( 2008, skydnca6, aristmk6, aristmk6, aristmk6, aristmk6_state, empty_init, ROT0, "Aristocrat", "Sky Dancer (10272711, NSW/ACT)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) // JB091/2, A - 28/08/08
GAME( 1999, spgcarn, aristmk6, aristmk6, aristmk6, aristmk6_state, empty_init, ROT0, "Aristocrat", "Spring Carnival (10000311, NSW/ACT)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) // 642, C - 15/11/99
GAME( 2001, spgcarnq, spgcarn, aristmk6, aristmk6, aristmk6_state, empty_init, ROT0, "Aristocrat", "Spring Carnival (10008011, Queensland)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) // 642, E - 27/02/01
+GAME( 2008, spgfest, aristmk6, aristmk6, aristmk6, aristmk6_state, empty_init, ROT0, "Aristocrat", "Spring Festival (20262311, Queensland)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) // JB040, C - 03/06/08
GAME( 2003, stardrft, aristmk6, aristmk6, aristmk6, aristmk6_state, empty_init, ROT0, "Aristocrat", "Star Drifter (20150811, NSW/ACT)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) // 717/2, A - 15/09/03
GAME( 2004, stardrftu, stardrft, aristmk6, aristmk6, aristmk6_state, empty_init, ROT0, "Aristocrat", "Star Drifter (0451341, US)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) // MV4204/1, A - 02/16/04
GAME( 2001, starqst, aristmk6, aristmk6, aristmk6, aristmk6_state, empty_init, ROT0, "Aristocrat", "Star Quest (10009511, NSW/ACT)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) // 659/2, B - 29/10/01
@@ -3431,7 +3579,8 @@ GAME( 2003, whalecshu, whalecsh, aristmk6, aristmk6, aristmk6_state, empty_init
GAME( 2005, whalecshua, whalecsh, aristmk6, aristmk6, aristmk6_state, empty_init, ROT0, "Aristocrat", "Whales of Cash (0451346, US)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) // MV4214, B - 01/14/05
GAME( 2004, wheregld, aristmk6, aristmk6, aristmk6, aristmk6_state, empty_init, ROT0, "Aristocrat", "Where's The Gold (10124811, NSW/ACT)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) // 756, B - 26/02/04
GAME( 2004, wheregldsp, wheregld, aristmk6, aristmk6, aristmk6_state, empty_init, ROT0, "Aristocrat", "Where's The Gold (10124811, NSW/ACT, Show Program)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) // 756, B - 26/02/04
-GAME( 2004, wheregldm, wheregld, aristmk6, aristmk6, aristmk6_state, empty_init, ROT0, "Aristocrat", "Where's the Gold (20177111, Malaysia)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) // 756, C - 17/06/04
+GAME( 2004, wheregldm, wheregld, aristmk6, aristmk6, aristmk6_state, empty_init, ROT0, "Aristocrat", "Where's The Gold (20177111, Malaysia)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) // 756, C - 17/06/04
+GAME( 2005, wheregldq, wheregld, aristmk6, aristmk6, aristmk6_state, empty_init, ROT0, "Aristocrat", "Where's The Gold (20184811, Queensland)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) // 756, D - 21/06/05
GAME( 2003, whtwater, aristmk6, aristmk6, aristmk6, aristmk6_state, empty_init, ROT0, "Aristocrat", "White Water (0151075, US)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) // US054, A - 4/11/03
GAME( 2006, wikwin2, aristmk6, aristmk6, aristmk6, aristmk6_state, empty_init, ROT0, "Aristocrat", "Wicked Winnings II - Power Pay (10214011, NSW/ACT)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) // 796, A - 28/02/06
GAME( 2002, wldafr, aristmk6, aristmk6, aristmk6, aristmk6_state, empty_init, ROT0, "Aristocrat", "Wild Africa - Millioniser (0351083, US)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) // MV4076, D - 5/08/02
@@ -3439,7 +3588,7 @@ GAME( 2006, wldcata6, aristmk6, aristmk6, aristmk6, aristmk6_state, empty_init
GAME( 2003, wldgoos, aristmk6, aristmk6, aristmk6, aristmk6_state, empty_init, ROT0, "Aristocrat", "Wild Goose (20131911, NSW/ACT)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) // 732, B - 02/06/03
GAME( 2009, wgorilla, aristmk6, aristmk6, aristmk6, aristmk6_state, empty_init, ROT0, "Aristocrat", "Wild Gorilla - Power Pay (20279811, NSW/ACT)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) // JB108/2, B - 19/06/09
GAME( 2006, wldpanda, aristmk6, aristmk6, aristmk6, aristmk6_state, empty_init, ROT0, "Aristocrat", "Wild Panda (20218411, NSW/ACT)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) // 800, E - 07/08/06
-GAME( 2004, wldpanth, aristmk6, aristmk6, aristmk6, aristmk6_state, empty_init, ROT0, "Aristocrat", "Wild Panthers - Li'l Lucy (0651310, US)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) // MV4187, D- 01/15/04
+GAME( 2004, wldpanth, aristmk6, aristmk6, aristmk6, aristmk6_state, empty_init, ROT0, "Aristocrat", "Wild Panthers - Lil' Lucy (0651310, US)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) // MV4187, D- 01/15/04
GAME( 2006, wldstall, aristmk6, aristmk6, aristmk6, aristmk6_state, empty_init, ROT0, "Aristocrat", "Wild Stallion (10230811, NSW/ACT)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) // 805, B - 12/09/06
GAME( 2007, wtepee, aristmk6, aristmk6, aristmk6, aristmk6_state, empty_init, ROT0, "Aristocrat", "Wild Tepee - Power Pay (10230211, NSW/ACT)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) // 820, H - 20/04/07
GAME( 2006, wwaratah, aristmk6, aristmk6, aristmk6, aristmk6_state, empty_init, ROT0, "Aristocrat", "Wild Waratah (10215911, NSW/ACT)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) // 811, A - 14/02/06
diff --git a/src/mame/drivers/arkanoid.cpp b/src/mame/drivers/arkanoid.cpp
index f66b40b9867..d2ef042afe2 100644
--- a/src/mame/drivers/arkanoid.cpp
+++ b/src/mame/drivers/arkanoid.cpp
@@ -1344,31 +1344,31 @@ Pixel clock: 3 MHz = 192 HTotal, assuming it's 6 MHz
#define ARKANOID_VBEND 16
#define ARKANOID_VBSTART 240
-MACHINE_CONFIG_START(arkanoid_state::arkanoid)
-
+void arkanoid_state::arkanoid(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, XTAL(12'000'000)/2) /* verified on pcb */
- MCFG_DEVICE_PROGRAM_MAP(arkanoid_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", arkanoid_state, irq0_line_hold)
+ Z80(config, m_maincpu, XTAL(12'000'000)/2); /* verified on pcb */
+ m_maincpu->set_addrmap(AS_PROGRAM, &arkanoid_state::arkanoid_map);
+ m_maincpu->set_vblank_int("screen", FUNC(arkanoid_state::irq0_line_hold));
WATCHDOG_TIMER(config, "watchdog").set_vblank_count("screen", 128); // 74LS393 at ic21, counts 128 vblanks before firing watchdog; z80 /RESET ls08 ic19 pin 9 input comes from ls04 ic20 pin 8, ls04 ic20 pin 9 input comes from ic21 ls393 pin 8, and ls393 is set to chain both 4 bit counters together
ARKANOID_68705P5(config, m_mcuintf, 12_MHz_XTAL / 4); // verified on PCB
m_mcuintf->portb_r_cb().set_ioport("MUX");
- MCFG_QUANTUM_TIME(attotime::from_hz(6000)) // 100 CPU slices per second to synchronize between the MCU and the main CPU
+ config.m_minimum_quantum = attotime::from_hz(6000); // 100 CPU slices per second to synchronize between the MCU and the main CPU
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
-// MCFG_SCREEN_REFRESH_RATE(60)
-// MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
-// MCFG_SCREEN_SIZE(32*8, 32*8)
-// MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1)
- MCFG_SCREEN_RAW_PARAMS(ARKANOID_PIXEL_CLOCK,ARKANOID_HTOTAL,ARKANOID_HBEND,ARKANOID_HBSTART,ARKANOID_VTOTAL,ARKANOID_VBEND,ARKANOID_VBSTART)
- MCFG_SCREEN_UPDATE_DRIVER(arkanoid_state, screen_update_arkanoid)
- MCFG_SCREEN_PALETTE(m_palette)
-
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_arkanoid)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+// screen.set_refresh_hz(60);
+// screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+// screen.set_size(32*8, 32*8);
+// screen.set_visarea(0*8, 32*8-1, 2*8, 30*8-1);
+ screen.set_raw(ARKANOID_PIXEL_CLOCK,ARKANOID_HTOTAL,ARKANOID_HBEND,ARKANOID_HBSTART,ARKANOID_VTOTAL,ARKANOID_VBEND,ARKANOID_VBSTART);
+ screen.set_screen_update(FUNC(arkanoid_state::screen_update_arkanoid));
+ screen.set_palette(m_palette);
+
+ GFXDECODE(config, m_gfxdecode, m_palette, gfx_arkanoid);
PALETTE(config, m_palette, palette_device::RGB_444_PROMS, "proms", 512);
/* sound hardware */
@@ -1379,7 +1379,7 @@ MACHINE_CONFIG_START(arkanoid_state::arkanoid)
aysnd.port_a_read_callback().set_ioport("UNUSED");
aysnd.port_b_read_callback().set_ioport("DSW");
aysnd.add_route(ALL_OUTPUTS, "mono", 0.66);
-MACHINE_CONFIG_END
+}
void arkanoid_state::p3mcu(machine_config &config)
{
@@ -1401,15 +1401,15 @@ void arkanoid_state::p3mcuay(machine_config &config)
aysnd.add_route(ALL_OUTPUTS, "mono", 0.66);
}
-MACHINE_CONFIG_START(arkanoid_state::bootleg)
+void arkanoid_state::bootleg(machine_config &config)
+{
arkanoid(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(bootleg_map)
+ m_maincpu->set_addrmap(AS_PROGRAM, &arkanoid_state::bootleg_map);
- MCFG_DEVICE_REMOVE("mcu")
-MACHINE_CONFIG_END
+ config.device_remove("mcu");
+}
void arkanoid_state::aysnd(machine_config &config)
{
@@ -1423,26 +1423,26 @@ void arkanoid_state::aysnd(machine_config &config)
}
-MACHINE_CONFIG_START(arkanoid_state::hexa)
-
+void arkanoid_state::hexa(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, XTAL(12'000'000)/2) /* Imported from arkanoid - correct? */
- MCFG_DEVICE_PROGRAM_MAP(hexa_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", arkanoid_state, irq0_line_hold)
+ Z80(config, m_maincpu, XTAL(12'000'000)/2); /* Imported from arkanoid - correct? */
+ m_maincpu->set_addrmap(AS_PROGRAM, &arkanoid_state::hexa_map);
+ m_maincpu->set_vblank_int("screen", FUNC(arkanoid_state::irq0_line_hold));
WATCHDOG_TIMER(config, "watchdog");
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
-// MCFG_SCREEN_REFRESH_RATE(60)
-// MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
-// MCFG_SCREEN_SIZE(32*8, 32*8)
-// MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1)
- MCFG_SCREEN_RAW_PARAMS(ARKANOID_PIXEL_CLOCK,ARKANOID_HTOTAL,ARKANOID_HBEND,ARKANOID_HBSTART,ARKANOID_VTOTAL,ARKANOID_VBEND,ARKANOID_VBSTART)
- MCFG_SCREEN_UPDATE_DRIVER(arkanoid_state, screen_update_hexa)
- MCFG_SCREEN_PALETTE(m_palette)
-
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_hexa)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+// screen.set_refresh_hz(60);
+// screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+// screen.set_size(32*8, 32*8);
+// screen.set_visarea(0*8, 32*8-1, 2*8, 30*8-1);
+ screen.set_raw(ARKANOID_PIXEL_CLOCK,ARKANOID_HTOTAL,ARKANOID_HBEND,ARKANOID_HBSTART,ARKANOID_VTOTAL,ARKANOID_VBEND,ARKANOID_VBSTART);
+ screen.set_screen_update(FUNC(arkanoid_state::screen_update_hexa));
+ screen.set_palette(m_palette);
+
+ GFXDECODE(config, m_gfxdecode, m_palette, gfx_hexa);
PALETTE(config, m_palette, palette_device::RGB_444_PROMS, "proms", 256);
/* sound hardware */
@@ -1451,41 +1451,41 @@ MACHINE_CONFIG_START(arkanoid_state::hexa)
aysnd.port_a_read_callback().set_ioport("INPUTS");
aysnd.port_b_read_callback().set_ioport("DSW");
aysnd.add_route(ALL_OUTPUTS, "mono", 0.50);
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(arkanoid_state::hexaa)
+void arkanoid_state::hexaa(machine_config &config)
+{
hexa(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(hexaa_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", arkanoid_state, irq0_line_hold)
-
- MCFG_DEVICE_ADD("subcpu", Z80, XTAL(12'000'000)/2) // ?
- MCFG_DEVICE_PROGRAM_MAP(hexaa_sub_map)
- MCFG_DEVICE_IO_MAP(hexaa_sub_iomap)
-MACHINE_CONFIG_END
+ m_maincpu->set_addrmap(AS_PROGRAM, &arkanoid_state::hexaa_map);
+ m_maincpu->set_vblank_int("screen", FUNC(arkanoid_state::irq0_line_hold));
+ z80_device &subcpu(Z80(config, "subcpu", XTAL(12'000'000)/2)); // ?
+ subcpu.set_addrmap(AS_PROGRAM, &arkanoid_state::hexaa_sub_map);
+ subcpu.set_addrmap(AS_IO, &arkanoid_state::hexaa_sub_iomap);
+}
-MACHINE_CONFIG_START(arkanoid_state::brixian)
+void arkanoid_state::brixian(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, XTAL(12'000'000)/2)
- MCFG_DEVICE_PROGRAM_MAP(brixian_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", arkanoid_state, irq0_line_hold)
+ Z80(config, m_maincpu, XTAL(12'000'000)/2);
+ m_maincpu->set_addrmap(AS_PROGRAM, &arkanoid_state::brixian_map);
+ m_maincpu->set_vblank_int("screen", FUNC(arkanoid_state::irq0_line_hold));
/* there is a 68705 but it's only role appears to be to copy data to RAM at startup */
/* the RAM is also battery backed, making the 68705 almost redundant as long as the battery doesn't die(!) */
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
-// MCFG_SCREEN_REFRESH_RATE(60)
-// MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
-// MCFG_SCREEN_SIZE(32*8, 32*8)
-// MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1)
- MCFG_SCREEN_RAW_PARAMS(ARKANOID_PIXEL_CLOCK,ARKANOID_HTOTAL,ARKANOID_HBEND,ARKANOID_HBSTART,ARKANOID_VTOTAL,ARKANOID_VBEND,ARKANOID_VBSTART)
- MCFG_SCREEN_UPDATE_DRIVER(arkanoid_state, screen_update_hexa)
- MCFG_SCREEN_PALETTE(m_palette)
-
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_arkanoid)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+// screen.set_refresh_hz(60);
+// screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+// screen.set_size(32*8, 32*8);
+// screen.set_visarea(0*8, 32*8-1, 2*8, 30*8-1);
+ screen.set_raw(ARKANOID_PIXEL_CLOCK,ARKANOID_HTOTAL,ARKANOID_HBEND,ARKANOID_HBSTART,ARKANOID_VTOTAL,ARKANOID_VBEND,ARKANOID_VBSTART);
+ screen.set_screen_update(FUNC(arkanoid_state::screen_update_hexa));
+ screen.set_palette(m_palette);
+
+ GFXDECODE(config, m_gfxdecode, m_palette, gfx_arkanoid);
PALETTE(config, m_palette, palette_device::RGB_444_PROMS, "proms", 512);
/* sound hardware */
@@ -1494,7 +1494,7 @@ MACHINE_CONFIG_START(arkanoid_state::brixian)
aysnd.port_a_read_callback().set_ioport("INPUTS");
aysnd.port_b_read_callback().set_ioport("DSW");
aysnd.add_route(ALL_OUTPUTS, "mono", 0.50);
-MACHINE_CONFIG_END
+}
diff --git a/src/mame/drivers/armedf.cpp b/src/mame/drivers/armedf.cpp
index 17b1766d8ed..240f6224d7b 100644
--- a/src/mame/drivers/armedf.cpp
+++ b/src/mame/drivers/armedf.cpp
@@ -1251,46 +1251,46 @@ void armedf_state::machine_reset()
}
-MACHINE_CONFIG_START(armedf_state::terraf_sound)
- MCFG_DEVICE_ADD("audiocpu", Z80, XTAL(24'000'000)/6) // 4mhz
- MCFG_DEVICE_PROGRAM_MAP(sound_map)
- MCFG_DEVICE_IO_MAP(sound_portmap)
- MCFG_DEVICE_PERIODIC_INT_DRIVER(armedf_state, irq0_line_hold, XTAL(8'000'000)/2/512) // ?
+void armedf_state::terraf_sound(machine_config &config)
+{
+ z80_device &audiocpu(Z80(config, "audiocpu", XTAL(24'000'000)/6)); // 4mhz
+ audiocpu.set_addrmap(AS_PROGRAM, &armedf_state::sound_map);
+ audiocpu.set_addrmap(AS_IO, &armedf_state::sound_portmap);
+ audiocpu.set_periodic_int(FUNC(armedf_state::irq0_line_hold), attotime::from_hz(XTAL(8'000'000)/2/512)); // ?
SPEAKER(config, "speaker").front_center();
GENERIC_LATCH_8(config, m_soundlatch);
- MCFG_DEVICE_ADD("ymsnd", YM3812, XTAL(24'000'000)/6) // 4mhz
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 0.5)
-
- MCFG_DEVICE_ADD("dac1", DAC_8BIT_R2R, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 0.8) // 10-pin SIP with 74HC374P latch
- MCFG_DEVICE_ADD("dac2", DAC_8BIT_R2R, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 0.8) // 10-pin SIP with 74HC374P latch
- MCFG_DEVICE_ADD("vref", VOLTAGE_REGULATOR, 0) MCFG_VOLTAGE_REGULATOR_OUTPUT(5.0)
- MCFG_SOUND_ROUTE(0, "dac1", 1.0, DAC_VREF_POS_INPUT) MCFG_SOUND_ROUTE(0, "dac1", -1.0, DAC_VREF_NEG_INPUT)
- MCFG_SOUND_ROUTE(0, "dac2", 1.0, DAC_VREF_POS_INPUT) MCFG_SOUND_ROUTE(0, "dac2", -1.0, DAC_VREF_NEG_INPUT)
-MACHINE_CONFIG_END
+ YM3812(config, "ymsnd", XTAL(24'000'000)/6).add_route(ALL_OUTPUTS, "speaker", 0.5); // 4mhz
-MACHINE_CONFIG_START(armedf_state::terraf)
+ DAC_8BIT_R2R(config, "dac1", 0).add_route(ALL_OUTPUTS, "speaker", 0.8); // 10-pin SIP with 74HC374P latch
+ DAC_8BIT_R2R(config, "dac2", 0).add_route(ALL_OUTPUTS, "speaker", 0.8); // 10-pin SIP with 74HC374P latch
+ voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref"));
+ vref.add_route(0, "dac1", 1.0, DAC_VREF_POS_INPUT).add_route(0, "dac1", -1.0, DAC_VREF_NEG_INPUT);
+ vref.add_route(0, "dac2", 1.0, DAC_VREF_POS_INPUT).add_route(0, "dac2", -1.0, DAC_VREF_NEG_INPUT);
+}
+void armedf_state::terraf(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M68000, XTAL(16'000'000)/2) // 8mhz?
- MCFG_DEVICE_PROGRAM_MAP(terraf_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", armedf_state, irq1_line_assert)
+ M68000(config, m_maincpu, XTAL(16'000'000)/2); // 8mhz?
+ m_maincpu->set_addrmap(AS_PROGRAM, &armedf_state::terraf_map);
+ m_maincpu->set_vblank_int("screen", FUNC(armedf_state::irq1_line_assert));
- MCFG_DEVICE_ADD("nb1414m4", NB1414M4, 0)
+ NB1414M4(config, m_nb1414m4, 0);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(57)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */)
- MCFG_SCREEN_SIZE(64*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(12*8, (64-12)*8-1, 1*8, 31*8-1 )
- MCFG_SCREEN_PALETTE(m_palette)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(57);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500) /* not accurate */);
+ screen.set_size(64*8, 32*8);
+ screen.set_visarea(12*8, (64-12)*8-1, 1*8, 31*8-1 );
+ screen.set_palette(m_palette);
+ screen.set_screen_update(FUNC(armedf_state::screen_update_armedf));
+ screen.screen_vblank().set(m_spriteram, FUNC(buffered_spriteram16_device::vblank_copy_rising));
MCFG_VIDEO_START_OVERRIDE(armedf_state,terraf)
- MCFG_SCREEN_UPDATE_DRIVER(armedf_state, screen_update_armedf)
- MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE("spriteram", buffered_spriteram16_device, vblank_copy_rising))
GFXDECODE(config, m_gfxdecode, m_palette, gfx_armedf);
PALETTE(config, m_palette).set_format(palette_device::xRGB_444, 2048);
@@ -1299,35 +1299,35 @@ MACHINE_CONFIG_START(armedf_state::terraf)
/* sound hardware */
terraf_sound(config);
-MACHINE_CONFIG_END
-
-MACHINE_CONFIG_START(armedf_state::terrafjb)
+}
+void armedf_state::terrafjb(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M68000, XTAL(16'000'000)/2) // 8mhz
- MCFG_DEVICE_PROGRAM_MAP(terraf_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", armedf_state, irq1_line_assert)
+ M68000(config, m_maincpu, XTAL(16'000'000)/2); // 8mhz
+ m_maincpu->set_addrmap(AS_PROGRAM, &armedf_state::terraf_map);
+ m_maincpu->set_vblank_int("screen", FUNC(armedf_state::irq1_line_assert));
- MCFG_DEVICE_ADD("audiocpu", Z80, XTAL(24'000'000)/6) // 4mhz
- MCFG_DEVICE_PROGRAM_MAP(sound_map)
- MCFG_DEVICE_IO_MAP(sound_portmap)
- MCFG_DEVICE_PERIODIC_INT_DRIVER(armedf_state, irq0_line_hold, XTAL(8'000'000)/2/512) // ?
+ z80_device &audiocpu(Z80(config, "audiocpu", XTAL(24'000'000)/6)); // 4mhz
+ audiocpu.set_addrmap(AS_PROGRAM, &armedf_state::sound_map);
+ audiocpu.set_addrmap(AS_IO, &armedf_state::sound_portmap);
+ audiocpu.set_periodic_int(FUNC(armedf_state::irq0_line_hold), attotime::from_hz(XTAL(8'000'000)/2/512)); // ?
- MCFG_DEVICE_ADD("extra", Z80, XTAL(16'000'000)/4) // 4mhz?
- MCFG_DEVICE_PROGRAM_MAP(terrafjb_extraz80_map)
- MCFG_DEVICE_IO_MAP(terrafjb_extraz80_portmap)
+ Z80(config, m_extra, XTAL(16'000'000)/4); // 4mhz?
+ m_extra->set_addrmap(AS_PROGRAM, &armedf_state::terrafjb_extraz80_map);
+ m_extra->set_addrmap(AS_IO, &armedf_state::terrafjb_extraz80_portmap);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(57)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */)
- MCFG_SCREEN_SIZE(64*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(12*8, (64-12)*8-1, 1*8, 31*8-1 )
- MCFG_SCREEN_PALETTE(m_palette)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(57);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500) /* not accurate */);
+ screen.set_size(64*8, 32*8);
+ screen.set_visarea(12*8, (64-12)*8-1, 1*8, 31*8-1 );
+ screen.set_palette(m_palette);
+ screen.set_screen_update(FUNC(armedf_state::screen_update_armedf));
+ screen.screen_vblank().set(m_spriteram, FUNC(buffered_spriteram16_device::vblank_copy_rising));
MCFG_VIDEO_START_OVERRIDE(armedf_state,terraf)
- MCFG_SCREEN_UPDATE_DRIVER(armedf_state, screen_update_armedf)
- MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE("spriteram", buffered_spriteram16_device, vblank_copy_rising))
GFXDECODE(config, m_gfxdecode, m_palette, gfx_armedf);
PALETTE(config, m_palette).set_format(palette_device::xRGB_444, 2048);
@@ -1339,41 +1339,41 @@ MACHINE_CONFIG_START(armedf_state::terrafjb)
GENERIC_LATCH_8(config, m_soundlatch);
- MCFG_DEVICE_ADD("ymsnd", YM3812, XTAL(24'000'000)/6) // 4mhz
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 0.5)
+ YM3812(config, "ymsnd", XTAL(24'000'000)/6).add_route(ALL_OUTPUTS, "speaker", 0.5); // 4mhz
- MCFG_DEVICE_ADD("dac1", DAC_8BIT_R2R, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 0.8) // unknown DAC
- MCFG_DEVICE_ADD("dac2", DAC_8BIT_R2R, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 0.8) // unknown DAC
- MCFG_DEVICE_ADD("vref", VOLTAGE_REGULATOR, 0) MCFG_VOLTAGE_REGULATOR_OUTPUT(5.0)
- MCFG_SOUND_ROUTE(0, "dac1", 1.0, DAC_VREF_POS_INPUT) MCFG_SOUND_ROUTE(0, "dac1", -1.0, DAC_VREF_NEG_INPUT)
- MCFG_SOUND_ROUTE(0, "dac2", 1.0, DAC_VREF_POS_INPUT) MCFG_SOUND_ROUTE(0, "dac2", -1.0, DAC_VREF_NEG_INPUT)
-MACHINE_CONFIG_END
+ DAC_8BIT_R2R(config, "dac1", 0).add_route(ALL_OUTPUTS, "speaker", 0.8); // unknown DAC
+ DAC_8BIT_R2R(config, "dac2", 0).add_route(ALL_OUTPUTS, "speaker", 0.8); // unknown DAC
+ voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref"));
+ vref.add_route(0, "dac1", 1.0, DAC_VREF_POS_INPUT).add_route(0, "dac1", -1.0, DAC_VREF_NEG_INPUT);
+ vref.add_route(0, "dac2", 1.0, DAC_VREF_POS_INPUT).add_route(0, "dac2", -1.0, DAC_VREF_NEG_INPUT);
+}
-MACHINE_CONFIG_START(armedf_state::terrafb)
+void armedf_state::terrafb(machine_config &config)
+{
terraf(config);
- MCFG_DEVICE_REMOVE("nb1414m4")
-MACHINE_CONFIG_END
-
-MACHINE_CONFIG_START(armedf_state::kozure)
+ config.device_remove("nb1414m4");
+}
+void armedf_state::kozure(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M68000, XTAL(16'000'000)/2) // 8mhz
- MCFG_DEVICE_PROGRAM_MAP(kozure_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", armedf_state, irq1_line_assert)
+ M68000(config, m_maincpu, XTAL(16'000'000)/2); // 8mhz
+ m_maincpu->set_addrmap(AS_PROGRAM, &armedf_state::kozure_map);
+ m_maincpu->set_vblank_int("screen", FUNC(armedf_state::irq1_line_assert));
- MCFG_DEVICE_ADD("nb1414m4", NB1414M4, 0)
+ NB1414M4(config, m_nb1414m4, 0);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */)
- MCFG_SCREEN_SIZE(64*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(12*8, (64-12)*8-1, 1*8, 31*8-1 ) // 320 x 240, trusted
- MCFG_SCREEN_PALETTE(m_palette)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500) /* not accurate */);
+ screen.set_size(64*8, 32*8);
+ screen.set_visarea(12*8, (64-12)*8-1, 1*8, 31*8-1 ); // 320 x 240, trusted
+ screen.set_palette(m_palette);
+ screen.set_screen_update(FUNC(armedf_state::screen_update_armedf));
+ screen.screen_vblank().set(m_spriteram, FUNC(buffered_spriteram16_device::vblank_copy_rising));
MCFG_VIDEO_START_OVERRIDE(armedf_state,terraf)
- MCFG_SCREEN_UPDATE_DRIVER(armedf_state, screen_update_armedf)
- MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE("spriteram", buffered_spriteram16_device, vblank_copy_rising))
GFXDECODE(config, m_gfxdecode, m_palette, gfx_armedf);
PALETTE(config, m_palette).set_format(palette_device::xRGB_444, 2048);
@@ -1382,31 +1382,31 @@ MACHINE_CONFIG_START(armedf_state::kozure)
/* sound hardware */
terraf_sound(config);
-MACHINE_CONFIG_END
-
-MACHINE_CONFIG_START(armedf_state::armedf)
+}
+void armedf_state::armedf(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M68000, XTAL(16'000'000)/2) // 8mhz
- MCFG_DEVICE_PROGRAM_MAP(armedf_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", armedf_state, irq1_line_assert)
+ M68000(config, m_maincpu, XTAL(16'000'000)/2); // 8mhz
+ m_maincpu->set_addrmap(AS_PROGRAM, &armedf_state::armedf_map);
+ m_maincpu->set_vblank_int("screen", FUNC(armedf_state::irq1_line_assert));
- MCFG_DEVICE_ADD("audiocpu", Z80, XTAL(24'000'000)/6) // 4mhz
- MCFG_DEVICE_PROGRAM_MAP(sound_map)
- MCFG_DEVICE_IO_MAP(sound_portmap)
- MCFG_DEVICE_PERIODIC_INT_DRIVER(armedf_state, irq0_line_hold, XTAL(8'000'000)/2/512) // ?
+ z80_device &audiocpu(Z80(config, "audiocpu", XTAL(24'000'000)/6)); // 4mhz
+ audiocpu.set_addrmap(AS_PROGRAM, &armedf_state::sound_map);
+ audiocpu.set_addrmap(AS_IO, &armedf_state::sound_portmap);
+ audiocpu.set_periodic_int(FUNC(armedf_state::irq0_line_hold), attotime::from_hz(XTAL(8'000'000)/2/512)); // ?
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(57)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */)
- MCFG_SCREEN_SIZE(64*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(12*8, (64-12)*8-1, 1*8, 31*8-1 )
- MCFG_SCREEN_PALETTE(m_palette)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(57);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500) /* not accurate */);
+ screen.set_size(64*8, 32*8);
+ screen.set_visarea(12*8, (64-12)*8-1, 1*8, 31*8-1 );
+ screen.set_palette(m_palette);
+ screen.set_screen_update(FUNC(armedf_state::screen_update_armedf));
+ screen.screen_vblank().set(m_spriteram, FUNC(buffered_spriteram16_device::vblank_copy_rising));
MCFG_VIDEO_START_OVERRIDE(armedf_state,armedf)
- MCFG_SCREEN_UPDATE_DRIVER(armedf_state, screen_update_armedf)
- MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE("spriteram", buffered_spriteram16_device, vblank_copy_rising))
GFXDECODE(config, m_gfxdecode, m_palette, gfx_armedf);
PALETTE(config, m_palette).set_format(palette_device::xRGB_444, 2048);
@@ -1418,41 +1418,40 @@ MACHINE_CONFIG_START(armedf_state::armedf)
GENERIC_LATCH_8(config, m_soundlatch);
- MCFG_DEVICE_ADD("ymsnd", YM3812, XTAL(24'000'000)/6) // 4mhz
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 0.5)
+ YM3812(config, "ymsnd", XTAL(24'000'000)/6).add_route(ALL_OUTPUTS, "speaker", 0.5); // 4mhz
- MCFG_DEVICE_ADD("dac1", DAC_8BIT_R2R, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 0.5) // unknown DAC
- MCFG_DEVICE_ADD("dac2", DAC_8BIT_R2R, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 0.5) // unknown DAC
- MCFG_DEVICE_ADD("vref", VOLTAGE_REGULATOR, 0) MCFG_VOLTAGE_REGULATOR_OUTPUT(5.0)
- MCFG_SOUND_ROUTE(0, "dac1", 1.0, DAC_VREF_POS_INPUT) MCFG_SOUND_ROUTE(0, "dac1", -1.0, DAC_VREF_NEG_INPUT)
- MCFG_SOUND_ROUTE(0, "dac2", 1.0, DAC_VREF_POS_INPUT) MCFG_SOUND_ROUTE(0, "dac2", -1.0, DAC_VREF_NEG_INPUT)
-MACHINE_CONFIG_END
-
-MACHINE_CONFIG_START(armedf_state::cclimbr2)
+ DAC_8BIT_R2R(config, "dac1", 0).add_route(ALL_OUTPUTS, "speaker", 0.5); // unknown DAC
+ DAC_8BIT_R2R(config, "dac2", 0).add_route(ALL_OUTPUTS, "speaker", 0.5); // unknown DAC
+ voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref"));
+ vref.add_route(0, "dac1", 1.0, DAC_VREF_POS_INPUT).add_route(0, "dac1", -1.0, DAC_VREF_NEG_INPUT);
+ vref.add_route(0, "dac2", 1.0, DAC_VREF_POS_INPUT).add_route(0, "dac2", -1.0, DAC_VREF_NEG_INPUT);
+}
+void armedf_state::cclimbr2(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M68000, XTAL(16'000'000)/2) // 8mhz
- MCFG_DEVICE_PROGRAM_MAP(cclimbr2_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", armedf_state, irq2_line_assert)
+ M68000(config, m_maincpu, XTAL(16'000'000)/2); // 8mhz
+ m_maincpu->set_addrmap(AS_PROGRAM, &armedf_state::cclimbr2_map);
+ m_maincpu->set_vblank_int("screen", FUNC(armedf_state::irq2_line_assert));
- MCFG_DEVICE_ADD("audiocpu", Z80, XTAL(24'000'000)/6) // 4mhz
- MCFG_DEVICE_PROGRAM_MAP(cclimbr2_soundmap)
- MCFG_DEVICE_IO_MAP(sound_portmap)
- MCFG_DEVICE_PERIODIC_INT_DRIVER(armedf_state, irq0_line_hold, XTAL(8'000'000)/2/512) // ?
+ z80_device &audiocpu(Z80(config, "audiocpu", XTAL(24'000'000)/6)); // 4mhz
+ audiocpu.set_addrmap(AS_PROGRAM, &armedf_state::cclimbr2_soundmap);
+ audiocpu.set_addrmap(AS_IO, &armedf_state::sound_portmap);
+ audiocpu.set_periodic_int(FUNC(armedf_state::irq0_line_hold), attotime::from_hz(XTAL(8'000'000)/2/512)); // ?
- MCFG_DEVICE_ADD("nb1414m4", NB1414M4, 0)
+ NB1414M4(config, m_nb1414m4, 0);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */)
- MCFG_SCREEN_SIZE(64*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(14*8, (64-14)*8-1, 2*8, 30*8-1 )
- MCFG_SCREEN_PALETTE(m_palette)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500) /* not accurate */);
+ screen.set_size(64*8, 32*8);
+ screen.set_visarea(14*8, (64-14)*8-1, 2*8, 30*8-1 );
+ screen.set_palette(m_palette);
+ screen.set_screen_update(FUNC(armedf_state::screen_update_armedf));
+ screen.screen_vblank().set(m_spriteram, FUNC(buffered_spriteram16_device::vblank_copy_rising));
MCFG_VIDEO_START_OVERRIDE(armedf_state,terraf)
- MCFG_SCREEN_UPDATE_DRIVER(armedf_state, screen_update_armedf)
- MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE("spriteram", buffered_spriteram16_device, vblank_copy_rising))
GFXDECODE(config, m_gfxdecode, m_palette, gfx_armedf);
PALETTE(config, m_palette).set_format(palette_device::xRGB_444, 2048);
@@ -1464,36 +1463,36 @@ MACHINE_CONFIG_START(armedf_state::cclimbr2)
GENERIC_LATCH_8(config, m_soundlatch);
- MCFG_DEVICE_ADD("ymsnd", YM3812, XTAL(24'000'000)/6) // or YM3526?
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 0.5)
+ YM3812(config, "ymsnd", XTAL(24'000'000)/6).add_route(ALL_OUTPUTS, "speaker", 0.5); // or YM3526?
- MCFG_DEVICE_ADD("dac1", DAC_8BIT_R2R, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 0.4) // unknown DAC
- MCFG_DEVICE_ADD("dac2", DAC_8BIT_R2R, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 0.4) // unknown DAC
- MCFG_DEVICE_ADD("vref", VOLTAGE_REGULATOR, 0) MCFG_VOLTAGE_REGULATOR_OUTPUT(5.0)
- MCFG_SOUND_ROUTE(0, "dac1", 1.0, DAC_VREF_POS_INPUT) MCFG_SOUND_ROUTE(0, "dac1", -1.0, DAC_VREF_NEG_INPUT)
- MCFG_SOUND_ROUTE(0, "dac2", 1.0, DAC_VREF_POS_INPUT) MCFG_SOUND_ROUTE(0, "dac2", -1.0, DAC_VREF_NEG_INPUT)
-MACHINE_CONFIG_END
+ DAC_8BIT_R2R(config, "dac1", 0).add_route(ALL_OUTPUTS, "speaker", 0.4); // unknown DAC
+ DAC_8BIT_R2R(config, "dac2", 0).add_route(ALL_OUTPUTS, "speaker", 0.4); // unknown DAC
+ voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref"));
+ vref.add_route(0, "dac1", 1.0, DAC_VREF_POS_INPUT).add_route(0, "dac1", -1.0, DAC_VREF_NEG_INPUT);
+ vref.add_route(0, "dac2", 1.0, DAC_VREF_POS_INPUT).add_route(0, "dac2", -1.0, DAC_VREF_NEG_INPUT);
+}
-MACHINE_CONFIG_START(armedf_state::legion_common)
+void armedf_state::legion_common(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M68000, XTAL(16'000'000)/2) // 8mhz
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", armedf_state, irq2_line_assert)
+ M68000(config, m_maincpu, XTAL(16'000'000)/2); // 8mhz
+ m_maincpu->set_vblank_int("screen", FUNC(armedf_state::irq2_line_assert));
- MCFG_DEVICE_ADD("audiocpu", Z80, XTAL(24'000'000)/6) // 4mhz
- MCFG_DEVICE_PROGRAM_MAP(cclimbr2_soundmap)
- MCFG_DEVICE_PERIODIC_INT_DRIVER(armedf_state, irq0_line_hold, XTAL(8'000'000)/2/512) // ?
+ z80_device &audiocpu(Z80(config, "audiocpu", XTAL(24'000'000)/6)); // 4mhz
+ audiocpu.set_addrmap(AS_PROGRAM, &armedf_state::cclimbr2_soundmap);
+ audiocpu.set_periodic_int(FUNC(armedf_state::irq0_line_hold), attotime::from_hz(XTAL(8'000'000)/2/512)); // ?
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */)
- MCFG_SCREEN_SIZE(64*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(14*8, (64-14)*8-1, 2*8, 30*8-1 )
- MCFG_SCREEN_PALETTE(m_palette)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500) /* not accurate */);
+ screen.set_size(64*8, 32*8);
+ screen.set_visarea(14*8, (64-14)*8-1, 2*8, 30*8-1 );
+ screen.set_palette(m_palette);
+ screen.set_screen_update(FUNC(armedf_state::screen_update_armedf));
+ screen.screen_vblank().set(m_spriteram, FUNC(buffered_spriteram16_device::vblank_copy_rising));
MCFG_VIDEO_START_OVERRIDE(armedf_state,terraf)
- MCFG_SCREEN_UPDATE_DRIVER(armedf_state, screen_update_armedf)
- MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE("spriteram", buffered_spriteram16_device, vblank_copy_rising))
GFXDECODE(config, m_gfxdecode, m_palette, gfx_armedf);
PALETTE(config, m_palette).set_format(palette_device::xRGB_444, 2048);
@@ -1505,53 +1504,50 @@ MACHINE_CONFIG_START(armedf_state::legion_common)
GENERIC_LATCH_8(config, m_soundlatch);
- MCFG_DEVICE_ADD("dac1", DAC_8BIT_R2R, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 0.4) // 10-pin SIP with 74HC374P latch
- MCFG_DEVICE_ADD("dac2", DAC_8BIT_R2R, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 0.4) // 10-pin SIP with 74HC374P latch
- MCFG_DEVICE_ADD("vref", VOLTAGE_REGULATOR, 0) MCFG_VOLTAGE_REGULATOR_OUTPUT(5.0)
- MCFG_SOUND_ROUTE(0, "dac1", 1.0, DAC_VREF_POS_INPUT) MCFG_SOUND_ROUTE(0, "dac1", -1.0, DAC_VREF_NEG_INPUT)
- MCFG_SOUND_ROUTE(0, "dac2", 1.0, DAC_VREF_POS_INPUT) MCFG_SOUND_ROUTE(0, "dac2", -1.0, DAC_VREF_NEG_INPUT)
-MACHINE_CONFIG_END
+ DAC_8BIT_R2R(config, "dac1", 0).add_route(ALL_OUTPUTS, "speaker", 0.4); // 10-pin SIP with 74HC374P latch
+ DAC_8BIT_R2R(config, "dac2", 0).add_route(ALL_OUTPUTS, "speaker", 0.4); // 10-pin SIP with 74HC374P latch
+ voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref"));
+ vref.add_route(0, "dac1", 1.0, DAC_VREF_POS_INPUT).add_route(0, "dac1", -1.0, DAC_VREF_NEG_INPUT);
+ vref.add_route(0, "dac2", 1.0, DAC_VREF_POS_INPUT).add_route(0, "dac2", -1.0, DAC_VREF_NEG_INPUT);
+}
-MACHINE_CONFIG_START(armedf_state::legion)
+void armedf_state::legion(machine_config &config)
+{
legion_common(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(legion_map)
+ m_maincpu->set_addrmap(AS_PROGRAM, &armedf_state::legion_map);
- MCFG_DEVICE_MODIFY("audiocpu")
- MCFG_DEVICE_IO_MAP(sound_3526_portmap)
+ subdevice<z80_device>("audiocpu")->set_addrmap(AS_IO, &armedf_state::sound_3526_portmap);
- MCFG_DEVICE_ADD("nb1414m4", NB1414M4, 0)
+ NB1414M4(config, m_nb1414m4, 0);
- MCFG_DEVICE_ADD("ymsnd", YM3526, XTAL(24'000'000)/6) // 4mhz
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 0.5)
-MACHINE_CONFIG_END
+ YM3526(config, "ymsnd", XTAL(24'000'000)/6).add_route(ALL_OUTPUTS, "speaker", 0.5); // 4mhz
+}
-MACHINE_CONFIG_START(armedf_state::legionjb)
+void armedf_state::legionjb(machine_config &config)
+{
legion_common(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(legionjb_map)
+ m_maincpu->set_addrmap(AS_PROGRAM, &armedf_state::legionjb_map);
- MCFG_DEVICE_MODIFY("audiocpu")
- MCFG_DEVICE_IO_MAP(sound_portmap)
+ subdevice<z80_device>("audiocpu")->set_addrmap(AS_IO, &armedf_state::sound_portmap);
- MCFG_DEVICE_ADD("ymsnd", YM3812, XTAL(24'000'000)/6) // or YM3526?
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 0.5)
-MACHINE_CONFIG_END
+ YM3812(config, "ymsnd", XTAL(24'000'000)/6).add_route(ALL_OUTPUTS, "speaker", 0.5); // or YM3526?
+}
-MACHINE_CONFIG_START(armedf_state::legionjb2)
+void armedf_state::legionjb2(machine_config &config)
+{
legionjb(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(legionjb2_map)
-MACHINE_CONFIG_END
+ m_maincpu->set_addrmap(AS_PROGRAM, &armedf_state::legionjb2_map);
+}
-MACHINE_CONFIG_START(bigfghtr_state::bigfghtr)
+void bigfghtr_state::bigfghtr(machine_config &config)
+{
- MCFG_DEVICE_ADD("maincpu", M68000, XTAL(16'000'000)/2) // verified
- MCFG_DEVICE_PROGRAM_MAP(bigfghtr_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", armedf_state, irq1_line_assert)
+ M68000(config, m_maincpu, XTAL(16'000'000)/2); // verified
+ m_maincpu->set_addrmap(AS_PROGRAM, &bigfghtr_state::bigfghtr_map);
+ m_maincpu->set_vblank_int("screen", FUNC(armedf_state::irq1_line_assert));
i8751_device &mcu(I8751(config, "mcu", XTAL(16'000'000)/2)); // verified
mcu.set_addrmap(AS_PROGRAM, &bigfghtr_state::bigfghtr_mcu_map);
@@ -1559,13 +1555,13 @@ MACHINE_CONFIG_START(bigfghtr_state::bigfghtr)
mcu.port_in_cb<1>().set_constant(0xdf); // bit 5: bus contention related?
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_RAW_PARAMS(XTAL(16'000'000)/2,531,12*8,(64-12)*8, 254, 1*8, 31*8) // guess, matches 59.3 Hz from reference - measured at 59.1358Hz
- MCFG_SCREEN_PALETTE(m_palette)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_raw(XTAL(16'000'000)/2,531,12*8,(64-12)*8, 254, 1*8, 31*8); // guess, matches 59.3 Hz from reference - measured at 59.1358Hz
+ screen.set_palette(m_palette);
+ screen.set_screen_update(FUNC(armedf_state::screen_update_armedf));
+ screen.screen_vblank().set(m_spriteram, FUNC(buffered_spriteram16_device::vblank_copy_rising));
MCFG_VIDEO_START_OVERRIDE(armedf_state,armedf)
- MCFG_SCREEN_UPDATE_DRIVER(armedf_state, screen_update_armedf)
- MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE("spriteram", buffered_spriteram16_device, vblank_copy_rising))
GFXDECODE(config, m_gfxdecode, m_palette, gfx_armedf);
PALETTE(config, m_palette).set_format(palette_device::xRGB_444, 2048);
@@ -1574,7 +1570,7 @@ MACHINE_CONFIG_START(bigfghtr_state::bigfghtr)
/* sound hardware */
terraf_sound(config);
-MACHINE_CONFIG_END
+}
/*************************************
*
diff --git a/src/mame/drivers/arsystems.cpp b/src/mame/drivers/arsystems.cpp
index 65fc15671c8..8fffdfb3f08 100644
--- a/src/mame/drivers/arsystems.cpp
+++ b/src/mame/drivers/arsystems.cpp
@@ -300,11 +300,11 @@ INPUT_PORTS_END
*
*************************************/
-MACHINE_CONFIG_START(arcadia_amiga_state::arcadia)
-
+void arcadia_amiga_state::arcadia(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M68000, amiga_state::CLK_7M_NTSC)
- MCFG_DEVICE_PROGRAM_MAP(arcadia_map)
+ M68000(config, m_maincpu, amiga_state::CLK_7M_NTSC);
+ m_maincpu->set_addrmap(AS_PROGRAM, &arcadia_amiga_state::arcadia_map);
ADDRESS_MAP_BANK(config, "overlay").set_map(&amiga_state::overlay_512kb_map).set_options(ENDIANNESS_BIG, 16, 22, 0x200000);
@@ -321,23 +321,24 @@ MACHINE_CONFIG_START(arcadia_amiga_state::arcadia)
SPEAKER(config, "lspeaker").front_left();
SPEAKER(config, "rspeaker").front_right();
- paula_8364_device &paula(PAULA_8364(config, "amiga", amiga_state::CLK_C1_NTSC));
- paula.add_route(0, "lspeaker", 0.50);
- paula.add_route(1, "rspeaker", 0.50);
- paula.add_route(2, "rspeaker", 0.50);
- paula.add_route(3, "lspeaker", 0.50);
- paula.mem_read_cb().set(FUNC(amiga_state::chip_ram_r));
- paula.int_cb().set(FUNC(amiga_state::paula_int_w));
+ PAULA_8364(config, m_paula, amiga_state::CLK_C1_NTSC);
+ m_paula->add_route(0, "lspeaker", 0.50);
+ m_paula->add_route(1, "rspeaker", 0.50);
+ m_paula->add_route(2, "rspeaker", 0.50);
+ m_paula->add_route(3, "lspeaker", 0.50);
+ m_paula->mem_read_cb().set(FUNC(amiga_state::chip_ram_r));
+ m_paula->int_cb().set(FUNC(amiga_state::paula_int_w));
/* cia */
- MCFG_DEVICE_ADD("cia_0", MOS8520, amiga_state::CLK_E_NTSC)
- MCFG_MOS6526_IRQ_CALLBACK(WRITELINE(*this, amiga_state, cia_0_irq))
- MCFG_MOS6526_PA_INPUT_CALLBACK(IOPORT("CIA0PORTA"))
- MCFG_MOS6526_PA_OUTPUT_CALLBACK(WRITE8(*this, amiga_state, cia_0_port_a_write))
- MCFG_MOS6526_PB_INPUT_CALLBACK(IOPORT("CIA0PORTB"))
- MCFG_MOS6526_PB_OUTPUT_CALLBACK(WRITE8(*this, arcadia_amiga_state,arcadia_cia_0_portb_w))
- MCFG_DEVICE_ADD("cia_1", MOS8520, amiga_state::CLK_E_NTSC)
- MCFG_MOS6526_IRQ_CALLBACK(WRITELINE(*this, amiga_state, cia_1_irq))
+ MOS8520(config, m_cia_0, amiga_state::CLK_E_NTSC);
+ m_cia_0->irq_wr_callback().set(FUNC(amiga_state::cia_0_irq));
+ m_cia_0->pa_rd_callback().set_ioport("CIA0PORTA");
+ m_cia_0->pa_wr_callback().set(FUNC(amiga_state::cia_0_port_a_write));
+ m_cia_0->pb_rd_callback().set_ioport("CIA0PORTB");
+ m_cia_0->pb_wr_callback().set(FUNC(arcadia_amiga_state::arcadia_cia_0_portb_w));
+
+ MOS8520(config, m_cia_1, amiga_state::CLK_E_NTSC);
+ m_cia_1->irq_wr_callback().set(FUNC(amiga_state::cia_1_irq));
/* fdc */
AMIGA_FDC(config, m_fdc, amiga_state::CLK_7M_NTSC);
@@ -346,15 +347,15 @@ MACHINE_CONFIG_START(arcadia_amiga_state::arcadia)
m_fdc->write_dma_callback().set(FUNC(amiga_state::chip_ram_w));
m_fdc->dskblk_callback().set(FUNC(amiga_state::fdc_dskblk_w));
m_fdc->dsksyn_callback().set(FUNC(amiga_state::fdc_dsksyn_w));
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(arcadia_amiga_state::argh)
+void arcadia_amiga_state::argh(machine_config &config)
+{
arcadia(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(argh_map)
-MACHINE_CONFIG_END
+ m_maincpu->set_addrmap(AS_PROGRAM, &arcadia_amiga_state::argh_map);
+}
/*************************************
diff --git a/src/mame/drivers/artmagic.cpp b/src/mame/drivers/artmagic.cpp
index 65c7b55bf3d..79548718334 100644
--- a/src/mame/drivers/artmagic.cpp
+++ b/src/mame/drivers/artmagic.cpp
@@ -473,7 +473,6 @@ void artmagic_state::tms_map(address_map &map)
map(0x00400000, 0x005fffff).ram().share("vram1");
map(0x00800000, 0x0080007f).rw(FUNC(artmagic_state::blitter_r), FUNC(artmagic_state::blitter_w));
map(0x00c00000, 0x00c000ff).rw(m_tlc34076, FUNC(tlc34076_device::read), FUNC(tlc34076_device::write)).umask16(0x00ff);
- map(0xc0000000, 0xc00001ff).rw(m_tms, FUNC(tms34010_device::io_register_r), FUNC(tms34010_device::io_register_w));
map(0xffe00000, 0xffffffff).ram();
}
@@ -484,7 +483,6 @@ void artmagic_state::stonebal_tms_map(address_map &map)
map(0x00400000, 0x005fffff).ram().share("vram1");
map(0x00800000, 0x0080007f).rw(FUNC(artmagic_state::blitter_r), FUNC(artmagic_state::blitter_w));
map(0x00c00000, 0x00c000ff).rw(m_tlc34076, FUNC(tlc34076_device::read), FUNC(tlc34076_device::write)).umask16(0x00ff);
- map(0xc0000000, 0xc00001ff).rw(m_tms, FUNC(tms34010_device::io_register_r), FUNC(tms34010_device::io_register_w));
map(0xffc00000, 0xffffffff).ram();
}
@@ -806,11 +804,11 @@ INPUT_PORTS_END
*
*************************************/
-MACHINE_CONFIG_START(artmagic_state::artmagic)
-
+void artmagic_state::artmagic(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M68000, MASTER_CLOCK_25MHz/2)
- MCFG_DEVICE_PROGRAM_MAP(main_map)
+ M68000(config, m_maincpu, MASTER_CLOCK_25MHz/2);
+ m_maincpu->set_addrmap(AS_PROGRAM, &artmagic_state::main_map);
TMS34010(config, m_tms, MASTER_CLOCK_40MHz);
m_tms->set_addrmap(AS_PROGRAM, &artmagic_state::tms_map);
@@ -822,61 +820,58 @@ MACHINE_CONFIG_START(artmagic_state::artmagic)
m_tms->set_shiftreg_in_callback(FUNC(artmagic_state::to_shiftreg));
m_tms->set_shiftreg_out_callback(FUNC(artmagic_state::from_shiftreg));
- MCFG_QUANTUM_TIME(attotime::from_hz(6000))
+ config.m_minimum_quantum = attotime::from_hz(6000);
EEPROM_2816(config, "eeprom").write_time(attotime::from_usec(1)); // FIXME: false-readback polling should make this unnecessary
/* video hardware */
- MCFG_TLC34076_ADD("tlc34076", TLC34076_6_BIT)
+ TLC34076(config, m_tlc34076, tlc34076_device::TLC34076_6_BIT);
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_RAW_PARAMS(MASTER_CLOCK_40MHz/6, 428, 0, 320, 313, 0, 256)
- MCFG_SCREEN_UPDATE_DEVICE("tms", tms34010_device, tms340x0_rgb32)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_raw(MASTER_CLOCK_40MHz/6, 428, 0, 320, 313, 0, 256);
+ screen.set_screen_update("tms", FUNC(tms34010_device::tms340x0_rgb32));
/* sound hardware */
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("oki", OKIM6295, MASTER_CLOCK_40MHz/3/10, okim6295_device::PIN7_LOW)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.65)
-MACHINE_CONFIG_END
+ OKIM6295(config, m_oki, MASTER_CLOCK_40MHz/3/10, okim6295_device::PIN7_LOW).add_route(ALL_OUTPUTS, "mono", 0.65);
+}
-MACHINE_CONFIG_START(artmagic_state::cheesech)
+void artmagic_state::cheesech(machine_config &config)
+{
artmagic(config);
- MCFG_DEVICE_MODIFY("oki")
- MCFG_SOUND_ROUTES_RESET()
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
-MACHINE_CONFIG_END
+ m_oki->reset_routes();
+ m_oki->add_route(ALL_OUTPUTS, "mono", 1.0);
+}
-MACHINE_CONFIG_START(artmagic_state::stonebal)
+void artmagic_state::stonebal(machine_config &config)
+{
artmagic(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(stonebal_map)
+ m_maincpu->set_addrmap(AS_PROGRAM, &artmagic_state::stonebal_map);
- MCFG_DEVICE_MODIFY("tms")
- MCFG_DEVICE_PROGRAM_MAP(stonebal_tms_map)
+ m_tms->set_addrmap(AS_PROGRAM, &artmagic_state::stonebal_tms_map);
- MCFG_DEVICE_MODIFY("oki")
- MCFG_SOUND_ROUTES_RESET()
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.45)
-MACHINE_CONFIG_END
+ m_oki->reset_routes();
+ m_oki->add_route(ALL_OUTPUTS, "mono", 0.45);
+}
-MACHINE_CONFIG_START(artmagic_state::shtstar)
+void artmagic_state::shtstar(machine_config &config)
+{
artmagic(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(shtstar_map)
+ m_maincpu->set_addrmap(AS_PROGRAM, &artmagic_state::shtstar_map);
- MCFG_DEVICE_ADD("mainduart", MC68681, 3686400)
+ MC68681(config, "mainduart", 3686400);
/* sub cpu*/
- MCFG_DEVICE_ADD("subcpu", M68000, MASTER_CLOCK_25MHz/2)
- MCFG_DEVICE_PROGRAM_MAP(shtstar_subcpu_map)
+ m68000_device &subcpu(M68000(config, "subcpu", MASTER_CLOCK_25MHz/2));
+ subcpu.set_addrmap(AS_PROGRAM, &artmagic_state::shtstar_subcpu_map);
- MCFG_DEVICE_ADD("subduart", MC68681, 3686400)
+ MC68681(config, "subduart", 3686400);
YM2149(config, "aysnd", 3686400/2).add_route(ALL_OUTPUTS, "mono", 0.10);
@@ -885,7 +880,7 @@ MACHINE_CONFIG_START(artmagic_state::shtstar)
guncpu.set_addrmap(AS_PROGRAM, &artmagic_state::shtstar_guncpu_map);
guncpu.set_addrmap(AS_IO, &artmagic_state::shtstar_guncpu_io_map);
guncpu.port_in_cb<1>().set_constant(0); // ?
-MACHINE_CONFIG_END
+}
diff --git a/src/mame/drivers/ashnojoe.cpp b/src/mame/drivers/ashnojoe.cpp
index 100c5c419bf..29d209ef138 100644
--- a/src/mame/drivers/ashnojoe.cpp
+++ b/src/mame/drivers/ashnojoe.cpp
@@ -279,7 +279,7 @@ WRITE8_MEMBER(ashnojoe_state::ym2203_write_b)
WRITE_LINE_MEMBER(ashnojoe_state::ashnojoe_vclk_cb)
{
- if (state)
+ if (m_msm5205_vclk_toggle == 0)
{
m_msm->write_data(m_adpcm_byte >> 4);
}
@@ -288,16 +288,20 @@ WRITE_LINE_MEMBER(ashnojoe_state::ashnojoe_vclk_cb)
m_msm->write_data(m_adpcm_byte & 0xf);
m_audiocpu->pulse_input_line(INPUT_LINE_NMI, attotime::zero);
}
+
+ m_msm5205_vclk_toggle ^= 1;
}
void ashnojoe_state::machine_start()
{
save_item(NAME(m_adpcm_byte));
+ save_item(NAME(m_msm5205_vclk_toggle));
}
void ashnojoe_state::machine_reset()
{
m_adpcm_byte = 0;
+ m_msm5205_vclk_toggle = 0;
}
@@ -336,7 +340,7 @@ void ashnojoe_state::ashnojoe(machine_config &config)
ymsnd.add_route(ALL_OUTPUTS, "mono", 0.1);
MSM5205(config, m_msm, 384000);
- m_msm->vck_callback().set(FUNC(ashnojoe_state::ashnojoe_vclk_cb));
+ m_msm->vck_legacy_callback().set(FUNC(ashnojoe_state::ashnojoe_vclk_cb));
m_msm->set_prescaler_selector(msm5205_device::S48_4B);
m_msm->add_route(ALL_OUTPUTS, "mono", 1.0);
}
diff --git a/src/mame/drivers/asst128.cpp b/src/mame/drivers/asst128.cpp
index f857d084ae0..2de3a578e95 100644
--- a/src/mame/drivers/asst128.cpp
+++ b/src/mame/drivers/asst128.cpp
@@ -102,34 +102,34 @@ static DEVICE_INPUT_DEFAULTS_START( asst128 )
DEVICE_INPUT_DEFAULTS("DSW0", 0x30, 0x20)
DEVICE_INPUT_DEFAULTS_END
-MACHINE_CONFIG_START(asst128_state::asst128)
- MCFG_DEVICE_ADD("maincpu", I8086, 4772720)
- MCFG_DEVICE_PROGRAM_MAP(asst128_map)
- MCFG_DEVICE_IO_MAP(asst128_io)
- MCFG_DEVICE_IRQ_ACKNOWLEDGE_DEVICE("mb:pic8259", pic8259_device, inta_cb)
+void asst128_state::asst128(machine_config &config)
+{
+ I8086(config, m_maincpu, 4772720);
+ m_maincpu->set_addrmap(AS_PROGRAM, &asst128_state::asst128_map);
+ m_maincpu->set_addrmap(AS_IO, &asst128_state::asst128_io);
+ m_maincpu->set_irq_acknowledge_callback("mb:pic8259", FUNC(pic8259_device::inta_cb));
- MCFG_DEVICE_ADD("mb", ASST128_MOTHERBOARD, 0)
- downcast<asst128_mb_device &>(*device).set_cputag("maincpu");
- MCFG_DEVICE_INPUT_DEFAULTS(asst128)
+ asst128_mb_device &mb(ASST128_MOTHERBOARD(config, "mb", 0));
+ mb.set_cputag(m_maincpu);
+ mb.set_input_default(DEVICE_INPUT_DEFAULTS_NAME(asst128));
- MCFG_DEVICE_MODIFY("mb:cassette")
- MCFG_CASSETTE_DEFAULT_STATE(CASSETTE_STOPPED | CASSETTE_MOTOR_ENABLED | CASSETTE_SPEAKER_ENABLED)
+ subdevice<cassette_image_device>("mb:cassette")->set_default_state(CASSETTE_STOPPED | CASSETTE_MOTOR_ENABLED | CASSETTE_SPEAKER_ENABLED);
// FIXME: determine ISA bus clock
- MCFG_DEVICE_ADD("board0", ISA8_SLOT, 0, "mb:isa", pc_isa8_cards, "cga_mc1502", true)
- MCFG_DEVICE_ADD("board1", ISA8_SLOT, 0, "mb:isa", pc_isa8_cards, "lpt", true)
+ ISA8_SLOT(config, "board0", 0, "mb:isa", pc_isa8_cards, "cga_mc1502", true);
+ ISA8_SLOT(config, "board1", 0, "mb:isa", pc_isa8_cards, "lpt", true);
- MCFG_PC_KBDC_SLOT_ADD("mb:pc_kbdc", "kbd", pc_xt_keyboards, STR_KBD_IBM_PC_XT_83)
+ PC_KBDC_SLOT(config, "kbd", pc_xt_keyboards, STR_KBD_IBM_PC_XT_83).set_pc_kbdc_slot(subdevice("mb:pc_kbdc"));
PC_FDC_XT(config, m_fdc, 0);
m_fdc->intrq_wr_callback().set("mb:pic8259", FUNC(pic8259_device::ir6_w));
- MCFG_FLOPPY_DRIVE_ADD("fdc:0", asst128_floppies, "525ssqd", asst128_state::asst128_formats)
- MCFG_FLOPPY_DRIVE_ADD("fdc:1", asst128_floppies, "525ssqd", asst128_state::asst128_formats)
+ FLOPPY_CONNECTOR(config, "fdc:0", asst128_floppies, "525ssqd", asst128_state::asst128_formats);
+ FLOPPY_CONNECTOR(config, "fdc:1", asst128_floppies, "525ssqd", asst128_state::asst128_formats);
PC_JOY(config, "pc_joy");
RAM(config, RAM_TAG).set_default_size("512K").set_extra_options("64K, 128K, 256K");
-MACHINE_CONFIG_END
+}
ROM_START( asst128 )
ROM_REGION16_LE(0x10000,"bios", 0)
diff --git a/src/mame/drivers/asteroid.cpp b/src/mame/drivers/asteroid.cpp
index e3d97ac9747..53145eec6bf 100644
--- a/src/mame/drivers/asteroid.cpp
+++ b/src/mame/drivers/asteroid.cpp
@@ -808,33 +808,33 @@ void asteroid_state::astdelux(machine_config &config)
audiolatch.q_out_cb<5>().set(FUNC(asteroid_state::coin_counter_left_w)); // LEFT COIN
audiolatch.q_out_cb<6>().set(FUNC(asteroid_state::coin_counter_center_w)); // CENTER COIN
audiolatch.q_out_cb<7>().set(FUNC(asteroid_state::coin_counter_right_w)); // RIGHT COIN
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(asteroid_state::llander)
+void asteroid_state::llander(machine_config &config)
+{
asteroid_base(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(llander_map)
- MCFG_DEVICE_PERIODIC_INT_DRIVER(asteroid_state, llander_interrupt, MASTER_CLOCK/4096/12)
-
- MCFG_SCREEN_MODIFY("screen")
- MCFG_SCREEN_REFRESH_RATE(CLOCK_3KHZ/12/6)
- MCFG_SCREEN_VISIBLE_AREA(522, 1566, 270, 1070)
- MCFG_SCREEN_UPDATE_DEVICE("vector", vector_device, screen_update)
-
- MCFG_DEVICE_MODIFY("outlatch") // LS174 at N11
- MCFG_OUTPUT_LATCH_BIT0_HANDLER(OUTPUT("lamp4")) // LAMP5 (COMMAND MISSION)
- MCFG_OUTPUT_LATCH_BIT1_HANDLER(OUTPUT("lamp3")) // LAMP4 (PRIME MISSION)
- MCFG_OUTPUT_LATCH_BIT2_HANDLER(OUTPUT("lamp2")) // LAMP3 (CADET MISSION)
- MCFG_OUTPUT_LATCH_BIT3_HANDLER(OUTPUT("lamp1")) // LAMP2 (TRAINING MISSION)
- MCFG_OUTPUT_LATCH_BIT4_HANDLER(OUTPUT("lamp0")) // START/SELECT LEDs
- MCFG_OUTPUT_LATCH_BIT5_HANDLER(NOOP)
+ m_maincpu->set_addrmap(AS_PROGRAM, &asteroid_state::llander_map);
+ m_maincpu->set_periodic_int(FUNC(asteroid_state::llander_interrupt), attotime::from_hz(MASTER_CLOCK/4096/12));
+
+ screen_device &screen(*subdevice<screen_device>("screen"));
+ screen.set_refresh_hz(CLOCK_3KHZ/12/6);
+ screen.set_visarea(522, 1566, 270, 1070);
+ screen.set_screen_update("vector", FUNC(vector_device::screen_update));
+
+ output_latch_device &outlatch(*subdevice<output_latch_device>("outlatch")); // LS174 at N11
+ outlatch.bit_handler<0>().set_output("lamp4"); // LAMP5 (COMMAND MISSION)
+ outlatch.bit_handler<1>().set_output("lamp3"); // LAMP4 (PRIME MISSION)
+ outlatch.bit_handler<2>().set_output("lamp2"); // LAMP3 (CADET MISSION)
+ outlatch.bit_handler<3>().set_output("lamp1"); // LAMP2 (TRAINING MISSION)
+ outlatch.bit_handler<4>().set_output("lamp0"); // START/SELECT LEDs
+ outlatch.bit_handler<5>().set_nop();
/* sound hardware */
llander_sound(config);
-MACHINE_CONFIG_END
+}
diff --git a/src/mame/drivers/astrafr.cpp b/src/mame/drivers/astrafr.cpp
index dd80d010adb..1ad452a5c66 100644
--- a/src/mame/drivers/astrafr.cpp
+++ b/src/mame/drivers/astrafr.cpp
@@ -311,7 +311,8 @@ MACHINE_START_MEMBER(astrafr_state,astra_2e)
}
-MACHINE_CONFIG_START(astrafr_state::astrafr_dual)
+void astrafr_state::astrafr_dual(machine_config &config)
+{
M68340(config, m_maincpu, 16000000);
m_maincpu->set_addrmap(AS_PROGRAM, &astrafr_state::astrafr_master_map);
@@ -319,17 +320,19 @@ MACHINE_CONFIG_START(astrafr_state::astrafr_dual)
m_slavecpu->set_addrmap(AS_PROGRAM, &astrafr_state::astrafr_slave_map);
MCFG_MACHINE_START_OVERRIDE(astrafr_state, astra_common )
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(astrafr_state::astrafr_dual_2e)
+void astrafr_state::astrafr_dual_2e(machine_config &config)
+{
astrafr_dual(config);
MCFG_MACHINE_START_OVERRIDE(astrafr_state, astra_2e )
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(astrafr_state::astrafr_dual_37)
+void astrafr_state::astrafr_dual_37(machine_config &config)
+{
astrafr_dual(config);
MCFG_MACHINE_START_OVERRIDE(astrafr_state, astra_37 )
-MACHINE_CONFIG_END
+}
void astrafr_state::astrafr_dual_alt(machine_config &config)
{
@@ -340,28 +343,32 @@ void astrafr_state::astrafr_dual_alt(machine_config &config)
m_slavecpu->set_addrmap(AS_PROGRAM, &astrafr_state::astrafr_slave_map);
}
-MACHINE_CONFIG_START(astrafr_state::astrafr_dual_alt_37)
+void astrafr_state::astrafr_dual_alt_37(machine_config &config)
+{
astrafr_dual_alt(config);
MCFG_MACHINE_START_OVERRIDE(astrafr_state, astra_37 )
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(astrafr_state::astra_single)
+void astrafr_state::astra_single(machine_config &config)
+{
M68340(config, m_maincpu, 16000000);
m_maincpu->set_addrmap(AS_PROGRAM, &astrafr_state::astra_map);
MCFG_MACHINE_START_OVERRIDE(astrafr_state, astra_common )
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(astrafr_state::astra_single_37)
+void astrafr_state::astra_single_37(machine_config &config)
+{
astra_single(config);
MCFG_MACHINE_START_OVERRIDE(astrafr_state, astra_37 )
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(astrafr_state::astra_single_2e)
+void astrafr_state::astra_single_2e(machine_config &config)
+{
astra_single(config);
MCFG_MACHINE_START_OVERRIDE(astrafr_state, astra_2e )
-MACHINE_CONFIG_END
+}
MACHINE_START_MEMBER(astrafr_state,astra_57)
{
@@ -372,21 +379,24 @@ MACHINE_START_MEMBER(astrafr_state,astra_57)
}
-MACHINE_CONFIG_START(astrafr_state::astra_single_alt)
+void astrafr_state::astra_single_alt(machine_config &config)
+{
M68340(config, m_maincpu, 16000000);
m_maincpu->set_addrmap(AS_PROGRAM, &astrafr_state::astra_map);
MCFG_MACHINE_START_OVERRIDE(astrafr_state, astra_common )
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(astrafr_state::astra_single_alt_57)
+void astrafr_state::astra_single_alt_57(machine_config &config)
+{
astra_single_alt(config);
MCFG_MACHINE_START_OVERRIDE(astrafr_state, astra_57 )
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(astrafr_state::astra_single_alt_37)
+void astrafr_state::astra_single_alt_37(machine_config &config)
+{
astra_single_alt(config);
MCFG_MACHINE_START_OVERRIDE(astrafr_state, astra_37 )
-MACHINE_CONFIG_END
+}
/* are the ptM roms Master and ptS roms Slave?
or is as_partyd set actually the master, with the larger roms?
diff --git a/src/mame/drivers/astrcorp.cpp b/src/mame/drivers/astrcorp.cpp
index 9ed45d4c9ba..3a106ec783a 100644
--- a/src/mame/drivers/astrcorp.cpp
+++ b/src/mame/drivers/astrcorp.cpp
@@ -78,6 +78,23 @@ protected:
virtual void video_start() override;
private:
+ struct decryption_info {
+ struct {
+ // Address bits used for bitswap/xor selection
+ u8 bits[3];
+ struct {
+ // 8-8 Bitswap
+ u8 bits[8];
+ // Xor
+ u8 xor_mask;
+ } entries[8];
+ } rom[2];
+ // Global address bitswap (src -> dest, bits 12-8 only)
+ u8 bits[5];
+ };
+
+ static const decryption_info astoneag_table;
+
// devices
required_device<cpu_device> m_maincpu;
required_device<okim6295_device> m_oki;
@@ -113,6 +130,8 @@ private:
void showhand_map(address_map &map);
void skilldrp_map(address_map &map);
void speeddrp_map(address_map &map);
+
+ void decrypt_rom(const decryption_info &table);
};
/***************************************************************************
@@ -525,26 +544,26 @@ TODO: understand if later hardware uses different parameters (XTAL is almost sur
#define ASTROCORP_VBEND 0
#define ASTROCORP_VBSTART 240
-MACHINE_CONFIG_START(astrocorp_state::showhand)
-
+void astrocorp_state::showhand(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M68000, XTAL(20'000'000) / 2)
- MCFG_DEVICE_PROGRAM_MAP(showhand_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", astrocorp_state, irq4_line_hold)
+ M68000(config, m_maincpu, XTAL(20'000'000) / 2);
+ m_maincpu->set_addrmap(AS_PROGRAM, &astrocorp_state::showhand_map);
+ m_maincpu->set_vblank_int("screen", FUNC(astrocorp_state::irq4_line_hold));
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
EEPROM_93C46_16BIT(config, "eeprom").default_data(showhand_default_eeprom, sizeof(showhand_default_eeprom));
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
-// MCFG_SCREEN_REFRESH_RATE(58.846) // measured on pcb
-// MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */)
-// MCFG_SCREEN_SIZE(320, 240)
-// MCFG_SCREEN_VISIBLE_AREA(0, 320-1, 0, 240-1)
- MCFG_SCREEN_RAW_PARAMS(ASTROCORP_PIXEL_CLOCK,ASTROCORP_HTOTAL,ASTROCORP_HBEND,320,ASTROCORP_VTOTAL,ASTROCORP_VBEND,ASTROCORP_VBSTART)
- MCFG_SCREEN_UPDATE_DRIVER(astrocorp_state, screen_update_astrocorp)
- MCFG_SCREEN_PALETTE(m_palette)
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+// m_screen->set_refresh_hz(58.846); // measured on pcb
+// m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(2500) /* not accurate */);
+// m_screen->set_size(320, 240);
+// m_screen->set_visarea_full();
+ m_screen->set_raw(ASTROCORP_PIXEL_CLOCK,ASTROCORP_HTOTAL,ASTROCORP_HBEND,320,ASTROCORP_VTOTAL,ASTROCORP_VBEND,ASTROCORP_VBSTART);
+ m_screen->set_screen_update(FUNC(astrocorp_state::screen_update_astrocorp));
+ m_screen->set_palette(m_palette);
GFXDECODE(config, m_gfxdecode, m_palette, gfx_astrocorp);
PALETTE(config, m_palette).set_format(palette_device::BGR_565, 0x100);
@@ -552,16 +571,15 @@ MACHINE_CONFIG_START(astrocorp_state::showhand)
/* sound hardware */
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("oki", OKIM6295, XTAL(20'000'000)/20, okim6295_device::PIN7_HIGH)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
-MACHINE_CONFIG_END
+ OKIM6295(config, m_oki, XTAL(20'000'000)/20, okim6295_device::PIN7_HIGH).add_route(ALL_OUTPUTS, "mono", 1.0);
+}
-MACHINE_CONFIG_START(astrocorp_state::showhanc)
+void astrocorp_state::showhanc(machine_config &config)
+{
showhand(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(showhanc_map)
-MACHINE_CONFIG_END
+ m_maincpu->set_addrmap(AS_PROGRAM, &astrocorp_state::showhanc_map);
+}
TIMER_DEVICE_CALLBACK_MEMBER(astrocorp_state::skilldrp_scanline)
@@ -575,28 +593,28 @@ TIMER_DEVICE_CALLBACK_MEMBER(astrocorp_state::skilldrp_scanline)
m_maincpu->set_input_line(2, HOLD_LINE);
}
-MACHINE_CONFIG_START(astrocorp_state::skilldrp)
-
+void astrocorp_state::skilldrp(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M68000, XTAL(24'000'000) / 2) // JX-1689F1028N GRX586.V5
- MCFG_DEVICE_PROGRAM_MAP(skilldrp_map)
- MCFG_TIMER_DRIVER_ADD_SCANLINE("scantimer", astrocorp_state, skilldrp_scanline, "screen", 0, 1)
+ M68000(config, m_maincpu, XTAL(24'000'000) / 2); // JX-1689F1028N GRX586.V5
+ m_maincpu->set_addrmap(AS_PROGRAM, &astrocorp_state::skilldrp_map);
+ TIMER(config, "scantimer").configure_scanline(FUNC(astrocorp_state::skilldrp_scanline), "screen", 0, 1);
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
EEPROM_93C46_16BIT(config, "eeprom");
- MCFG_TICKET_DISPENSER_ADD("ticket", attotime::from_msec(200), TICKET_MOTOR_ACTIVE_HIGH, TICKET_STATUS_ACTIVE_LOW )
- MCFG_TICKET_DISPENSER_ADD("hopper", attotime::from_msec(200), TICKET_MOTOR_ACTIVE_HIGH, TICKET_STATUS_ACTIVE_LOW )
+ TICKET_DISPENSER(config, m_ticket, attotime::from_msec(200), TICKET_MOTOR_ACTIVE_HIGH, TICKET_STATUS_ACTIVE_LOW );
+ TICKET_DISPENSER(config, m_hopper, attotime::from_msec(200), TICKET_MOTOR_ACTIVE_HIGH, TICKET_STATUS_ACTIVE_LOW );
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
-// MCFG_SCREEN_REFRESH_RATE(58.846)
-// MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */)
-// MCFG_SCREEN_SIZE(0x200, 0x100)
-// MCFG_SCREEN_VISIBLE_AREA(0, 0x200-1, 0, 0xf0-1)
- MCFG_SCREEN_RAW_PARAMS(ASTROCORP_PIXEL_CLOCK,ASTROCORP_HTOTAL,ASTROCORP_HBEND,512,ASTROCORP_VTOTAL,ASTROCORP_VBEND,ASTROCORP_VBSTART)
- MCFG_SCREEN_UPDATE_DRIVER(astrocorp_state, screen_update_astrocorp)
- MCFG_SCREEN_PALETTE(m_palette)
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+// m_screen->set_refresh_hz(58.846);
+// m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(2500) /* not accurate */);
+// m_screen->set_size(0x200, 0x100);
+// m_screen->set_visarea(0, 0x200-1, 0, 0xf0-1);
+ m_screen->set_raw(ASTROCORP_PIXEL_CLOCK,ASTROCORP_HTOTAL,ASTROCORP_HBEND,512,ASTROCORP_VTOTAL,ASTROCORP_VBEND,ASTROCORP_VBSTART);
+ m_screen->set_screen_update(FUNC(astrocorp_state::screen_update_astrocorp));
+ m_screen->set_palette(m_palette);
GFXDECODE(config, m_gfxdecode, m_palette, gfx_astrocorp);
PALETTE(config, m_palette).set_format(palette_device::BGR_565, 0x100);
@@ -604,16 +622,15 @@ MACHINE_CONFIG_START(astrocorp_state::skilldrp)
/* sound hardware */
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("oki", OKIM6295, XTAL(24'000'000)/24, okim6295_device::PIN7_HIGH)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
-MACHINE_CONFIG_END
+ OKIM6295(config, m_oki, XTAL(24'000'000)/24, okim6295_device::PIN7_HIGH).add_route(ALL_OUTPUTS, "mono", 1.0);
+}
-MACHINE_CONFIG_START(astrocorp_state::speeddrp)
+void astrocorp_state::speeddrp(machine_config &config)
+{
skilldrp(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(speeddrp_map)
-MACHINE_CONFIG_END
+ m_maincpu->set_addrmap(AS_PROGRAM, &astrocorp_state::speeddrp_map);
+}
/***************************************************************************
@@ -1238,155 +1255,93 @@ void astrocorp_state::init_showhanc()
#endif
}
-void astrocorp_state::init_astoneag()
+void astrocorp_state::decrypt_rom(const decryption_info &table)
{
-#if 0
- uint16_t *rom = (uint16_t*)memregion("maincpu")->base();
- uint16_t x;
- int i;
-
- for (i = 0x25100/2; i < 0x25200/2; i++)
- {
- x = 0x0000;
- if ( (i & 0x0001) ) x |= 0x0200;
- if ( (i & 0x0004) && !(i & 0x0001) ) x |= 0x0080;
- if ( (i & 0x0040) || (i & 0x0001) ) x |= 0x0040;
- if ( (i & 0x0010) && !(i & 0x0001) ) x |= 0x0020;
- if ( !(i & 0x0020) || (i & 0x0001) ) x |= 0x0010;
- if ( (i & 0x0002) || (i & 0x0001) ) x |= 0x0008;
- if ( (i & 0x0008) && !(i & 0x0001) ) x |= 0x0004;
- if ( !(i & 0x0040) && !(i & 0x0001) ) x |= 0x0002;
- if ( (i & 0x0040) && !(i & 0x0001) ) x |= 0x0001;
- rom[i] ^= x;
- }
-
-/*
- for (i = 0x25300/2; i < 0x25400/2; i++)
- {
- x = 0x1300;
- rom[i] ^= x;
- }
-*/
-
- for (i = 0x25400/2; i < 0x25500/2; i++)
- {
- x = 0x4200;
- if ( (i & 0x0001) ) x |= 0x0400;
- if ( (i & 0x0020) && !(i & 0x0001) ) x |= 0x0080;
- if ( !(i & 0x0010) || (i & 0x0001) ) x |= 0x0040;
- if ( (i & 0x0040) && !(i & 0x0001) ) x |= 0x0020;
- if ( !(i & 0x0004) || (i & 0x0001) ) x |= 0x0010;
- if ( !(i & 0x0040) && !(i & 0x0001) ) x |= 0x0004;
- if ( (i & 0x0008) && !(i & 0x0001) ) x |= 0x0002;
- if ( (i & 0x0002) || (i & 0x0001) ) x |= 0x0001;
- rom[i] ^= x;
- }
-
- for (i = 0x25500/2; i < 0x25600/2; i++)
- {
- x = 0x4200;
- if ( (i & 0x0001) ) x |= 0x0400;
- if ( (i & 0x0010) && !(i & 0x0001) ) x |= 0x0080;
- if ( (i & 0x0040) && !(i & 0x0001) ) x |= 0x0040;
- if ( !(i & 0x0002) && !(i & 0x0001) ) x |= 0x0020;
- if ( !(i & 0x0040) && !(i & 0x0001) ) x |= 0x0010;
- if ( (i & 0x0008) && !(i & 0x0001) ) x |= 0x0008;
- if ( (i & 0x0020) && !(i & 0x0001) ) x |= 0x0004;
- if ( (i & 0x0004) && !(i & 0x0001) ) x |= 0x0002;
- if ( (i & 0x0001) ) x |= 0x0001;
- rom[i] ^= x;
- }
-
-/*
- for (i = 0x25700/2; i < 0x25800/2; i++)
- {
- x = 0x6800;
- if ( !(i & 0x0001) ) x |= 0x8000;
-
- if ( !(i & 0x0040) || ((i & 0x0001) || !(i & 0x0001)) ) x |= 0x0100;
-
- rom[i] ^= x;
- }
-*/
-
- for (i = 0x25800/2; i < 0x25900/2; i++)
- {
- x = 0x8300;
- if ( (i & 0x0040) || (i & 0x0001) ) x |= 0x2000;
- if ( (i & 0x0002) || (i & 0x0001) ) x |= 0x0080;
- if ( !(i & 0x0040) && !(i & 0x0001) ) x |= 0x0040;
- if ( (i & 0x0020) && !(i & 0x0001) ) x |= 0x0020;
- if ( !(i & 0x0004) || (i & 0x0001) ) x |= 0x0010;
- if ( !(i & 0x0040) && !(i & 0x0001) ) x |= 0x0008;
- if ( (i & 0x0010) && !(i & 0x0001) ) x |= 0x0004;
- if ( (i & 0x0008) && !(i & 0x0001) ) x |= 0x0002;
- if ( !(i & 0x0040) && !(i & 0x0001) ) x |= 0x0001;
- rom[i] ^= x;
+ u32 size = memregion("maincpu")->bytes();
+ u16 *rom = (u16 *)memregion("maincpu")->base();
+ std::unique_ptr<u16[]> tmp = std::make_unique<u16[]>(size/2);
+
+ // Pass 1: decrypt high and low byte independently. They go
+ // trough a bitswap and an xor, choosing between 8 possibilities
+ // through address bits.
+
+ for(u32 i = 0; i != size; i += 2) {
+ u16 orig = rom[i >> 1];
+ u16 result = 0;
+ for(u32 rb = 0; rb < 2; rb ++) {
+ u8 val = orig >> (rb ? 0 : 8);
+ u32 index =
+ (BIT(i, table.rom[rb].bits[0]) << 2) |
+ (BIT(i, table.rom[rb].bits[1]) << 1) |
+ BIT(i, table.rom[rb].bits[2]);
+ val = bitswap(val,
+ table.rom[rb].entries[index].bits[0],
+ table.rom[rb].entries[index].bits[1],
+ table.rom[rb].entries[index].bits[2],
+ table.rom[rb].entries[index].bits[3],
+ table.rom[rb].entries[index].bits[4],
+ table.rom[rb].entries[index].bits[5],
+ table.rom[rb].entries[index].bits[6],
+ table.rom[rb].entries[index].bits[7]);
+ val = val ^ table.rom[rb].entries[index].xor_mask;
+
+ result |= val << (rb ? 0 : 8);
+ }
+ tmp[i >> 1] = result;
}
-// for (i = 0x25900/2; i < 0x25a00/2; i++)
-
- for (i = 0x25c00/2; i < 0x25d00/2; i++)
- {
- // changed from 25400
-// x = 0x4200;
- x = 0x4000;
-// if ( (i & 0x0001) ) x |= 0x0400;
- if ( (i & 0x0020) && !(i & 0x0001) ) x |= 0x0080;
- if ( !(i & 0x0010) || (i & 0x0001) ) x |= 0x0040;
- if ( (i & 0x0040) && !(i & 0x0001) ) x |= 0x0020;
- if ( !(i & 0x0004) || (i & 0x0001) ) x |= 0x0010;
- if ( !(i & 0x0040) && !(i & 0x0001) ) x |= 0x0004;
- if ( (i & 0x0008) && !(i & 0x0001) ) x |= 0x0002;
- if ( (i & 0x0002) || (i & 0x0001) ) x |= 0x0001;
- rom[i] ^= x;
+ // Pass 2: copy back the decrypted data following the address
+ // scrambling
+ for(u32 i = 0; i != size; i += 2) {
+ u32 dest =
+ (i & 0xffffe0ff) |
+ (BIT(i, table.bits[0]) << 12) |
+ (BIT(i, table.bits[1]) << 11) |
+ (BIT(i, table.bits[2]) << 10) |
+ (BIT(i, table.bits[3]) << 9) |
+ (BIT(i, table.bits[4]) << 8);
+ rom[dest >> 1] = tmp[i >> 1];
}
-/*
- for (i = 0x25d00/2; i < 0x25e00/2; i++)
- {
- x = 0x4000;
- if ( !(i & 0x0040) ) x |= 0x0800;
-
- if ( !(i & 0x0040) && !(i & 0x0001) ) x |= 0x0100; // almost!!
-
- if ( ((i & 0x0040)&&((i & 0x0020)||(i & 0x0010))) || !(i & 0x0001) ) x |= 0x0200; // almost!!
- if ( (!(i & 0x0040) || !(i & 0x0008)) && !(i & 0x0001) ) x |= 0x0008;
- if ( (i & 0x0040) || !(i & 0x0020) || (i & 0x0001) ) x |= 0x0001; // almost!!
- rom[i] ^= x;
- }
-*/
-
-/*
- for (i = 0x25e00/2; i < 0x25f00/2; i++)
- {
- x = 0xa600;
-
- if ( (i & 0x0040) && (i & 0x0001) ) x |= 0x4000;
- if ( (i & 0x0040) && (i & 0x0001) ) x |= 0x0800;
- if ( !(i & 0x0001) ) x |= 0x0100;
-
- if ( ( (i & 0x0040) && (i & 0x0008) && !(i & 0x0001)) ||
- ( !(i & 0x0040) && ((i & 0x0004) ^ (i & 0x0002)) && !(i & 0x0001) ) ) x |= 0x0002; // almost!!
-
- if ( !(i & 0x0040) || !(i & 0x0002) || (i & 0x0001) ) x |= 0x0001;
- rom[i] ^= x;
- }
-*/
+ // There's more stuff happening for addresses < 0x400...
- for (i = 0x26f00/2; i < 0x27000/2; i++)
- {
- x = 0xb94c;
- rom[i] ^= x;
- }
+}
- for (i = 0x27000/2; i < 0x27100/2; i++)
+const astrocorp_state::decryption_info astrocorp_state::astoneag_table = {
{
- x = 0x5f10;
- rom[i] ^= x;
- }
+ {
+ { 11, 10, 9 },
+ {
+ { { 7, 5, 4, 6, 0, 3, 2, 1 }, 0x00 },
+ { { 1, 4, 6, 0, 2, 5, 3, 7 }, 0xd0 },
+ { { 1, 7, 4, 3, 6, 5, 0, 2 }, 0x88 },
+ { { 6, 5, 2, 3, 7, 1, 0, 4 }, 0xd1 },
+ { { 6, 1, 7, 2, 4, 0, 3, 5 }, 0x64 },
+ { { 1, 7, 2, 6, 5, 4, 3, 0 }, 0x83 },
+ { { 6, 7, 4, 2, 5, 0, 1, 3 }, 0x81 },
+ { { 7, 5, 1, 0, 2, 4, 6, 3 }, 0xea },
+ }
+ },
+ {
+ { 12, 10, 8 },
+ {
+ { { 6, 5, 4, 3, 2, 1, 0, 7 }, 0x90 },
+ { { 2, 4, 0, 7, 5, 6, 3, 1 }, 0x32 },
+ { { 7, 1, 0, 6, 5, 2, 3, 4 }, 0xa9 },
+ { { 2, 0, 3, 5, 1, 4, 6, 7 }, 0xa2 },
+ { { 3, 0, 6, 5, 2, 1, 4, 7 }, 0x02 },
+ { { 0, 1, 6, 4, 5, 2, 7, 3 }, 0x30 },
+ { { 3, 5, 2, 7, 6, 1, 4, 0 }, 0x0a },
+ { { 0, 6, 4, 2, 7, 3, 1, 5 }, 0x81 },
+ }
+ },
+ },
+ { 12, 9, 11, 8, 10 }
+};
-#endif
+void astrocorp_state::init_astoneag()
+{
+ decrypt_rom(astoneag_table);
}
GAME( 2000, showhand, 0, showhand, showhand, astrocorp_state, init_showhand, ROT0, "Astro Corp.", "Show Hand (Italy)", MACHINE_SUPPORTS_SAVE )
diff --git a/src/mame/drivers/astrocde.cpp b/src/mame/drivers/astrocde.cpp
index 087a24728d5..a9e5c09ba90 100644
--- a/src/mame/drivers/astrocde.cpp
+++ b/src/mame/drivers/astrocde.cpp
@@ -394,8 +394,8 @@ WRITE8_MEMBER(tenpindx_state::lights_w)
WRITE8_MEMBER(astrocde_state::votrax_speech_w)
{
- m_votrax->inflection_w(space, 0, data >> 6);
- m_votrax->write(space, 0, data);
+ m_votrax->inflection_w(data >> 6);
+ m_votrax->write(data & 0x3f);
/* Note : We should really also use volume in this as well as frequency */
}
@@ -1475,8 +1475,8 @@ void demndrgn_state::demndrgn(machine_config &config)
outlatch.bit_handler<4>().set(FUNC(demndrgn_state::input_select_w));
m_astrocade_sound1->so_cb<4>().set("outlatch", FUNC(output_latch_device::bus_w));
- m_astrocade_sound1->set_pot_tag<0>("FIREX");
- m_astrocade_sound1->set_pot_tag<1>("FIREY");
+ m_astrocade_sound1->pot_cb<0>().set_ioport("FIREX");
+ m_astrocade_sound1->pot_cb<1>().set_ioport("FIREY");
}
void tenpindx_state::tenpindx(machine_config &config)
diff --git a/src/mame/drivers/astrof.cpp b/src/mame/drivers/astrof.cpp
index 954418c4465..7864d161b7c 100644
--- a/src/mame/drivers/astrof.cpp
+++ b/src/mame/drivers/astrof.cpp
@@ -913,81 +913,79 @@ INPUT_PORTS_END
*
*************************************/
-MACHINE_CONFIG_START(astrof_state::base)
-
+void astrof_state::base(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M6502, MAIN_CPU_CLOCK)
- MCFG_TIMER_DRIVER_ADD_SCANLINE("vblank", astrof_state, irq_callback, "screen", VBSTART, 0)
+ M6502(config, m_maincpu, MAIN_CPU_CLOCK);
+ TIMER(config, "vblank").configure_scanline(FUNC(astrof_state::irq_callback), "screen", VBSTART, 0);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_RAW_PARAMS(PIXEL_CLOCK, HTOTAL, HBEND, HBSTART, VTOTAL, VBEND, VBSTART)
-MACHINE_CONFIG_END
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_raw(PIXEL_CLOCK, HTOTAL, HBEND, HBSTART, VTOTAL, VBEND, VBSTART);
+}
-MACHINE_CONFIG_START(astrof_state::astrof)
+void astrof_state::astrof(machine_config &config)
+{
base(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(astrof_map)
+ m_maincpu->set_addrmap(AS_PROGRAM, &astrof_state::astrof_map);
MCFG_MACHINE_START_OVERRIDE(astrof_state,astrof)
/* video hardware */
- MCFG_SCREEN_MODIFY("screen")
- MCFG_SCREEN_UPDATE_DRIVER(astrof_state, screen_update_astrof)
+ m_screen->set_screen_update(FUNC(astrof_state::screen_update_astrof));
/* audio hardware */
astrof_audio(config);
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(astrof_state::abattle)
+void astrof_state::abattle(machine_config &config)
+{
astrof(config);
/* basic machine hardware */
MCFG_MACHINE_START_OVERRIDE(astrof_state,abattle)
MCFG_MACHINE_RESET_OVERRIDE(astrof_state,abattle)
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(astrof_state::spfghmk2)
+void astrof_state::spfghmk2(machine_config &config)
+{
base(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(spfghmk2_map)
+ m_maincpu->set_addrmap(AS_PROGRAM, &astrof_state::spfghmk2_map);
MCFG_MACHINE_START_OVERRIDE(astrof_state,spfghmk2)
/* video hardware */
- MCFG_SCREEN_MODIFY("screen")
- MCFG_SCREEN_UPDATE_DRIVER(astrof_state, screen_update_astrof)
+ m_screen->set_screen_update(FUNC(astrof_state::screen_update_astrof));
/* audio hardware */
spfghmk2_audio(config);
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(astrof_state::tomahawk)
+void astrof_state::tomahawk(machine_config &config)
+{
base(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(tomahawk_map)
+ m_maincpu->set_addrmap(AS_PROGRAM, &astrof_state::tomahawk_map);
MCFG_MACHINE_START_OVERRIDE(astrof_state,tomahawk)
/* video hardware */
- MCFG_SCREEN_MODIFY("screen")
- MCFG_SCREEN_UPDATE_DRIVER(astrof_state, screen_update_tomahawk)
+ m_screen->set_screen_update(FUNC(astrof_state::screen_update_tomahawk));
/* audio hardware */
tomahawk_audio(config);
-MACHINE_CONFIG_END
+}
diff --git a/src/mame/drivers/astrohome.cpp b/src/mame/drivers/astrohome.cpp
index ceceb0c6dc5..b4e49c93224 100644
--- a/src/mame/drivers/astrohome.cpp
+++ b/src/mame/drivers/astrohome.cpp
@@ -17,6 +17,8 @@
#include "bus/astrocde/rom.h"
#include "bus/astrocde/exp.h"
#include "bus/astrocde/ram.h"
+#include "bus/astrocde/ctrl.h"
+#include "bus/astrocde/accessory.h"
#include "softlist.h"
#include "speaker.h"
@@ -29,6 +31,8 @@ public:
: astrocde_state(mconfig, type, tag)
, m_cart(*this, "cartslot")
, m_exp(*this, "exp")
+ , m_ctrl(*this, "ctrl%u", 1U)
+ , m_accessory(*this, "accessory")
, m_keypad(*this, "KEYPAD%u", 0U)
{ }
@@ -42,6 +46,8 @@ private:
required_device<astrocade_cart_slot_device> m_cart;
required_device<astrocade_exp_device> m_exp;
+ required_device_array<astrocade_ctrl_port_device, 4> m_ctrl;
+ required_device<astrocade_accessory_port_device> m_accessory;
required_ioport_array<4> m_keypad;
};
@@ -104,42 +110,10 @@ READ8_MEMBER(astrocde_home_state::inputs_r)
if (BIT(offset, 2))
return m_keypad[offset & 3]->read();
else
- return m_handle[offset & 3]->read();
+ return m_ctrl[offset & 3]->read_handle();
}
static INPUT_PORTS_START( astrocde )
- PORT_START("P1HANDLE")
- PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP) PORT_PLAYER(1) PORT_8WAY
- PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN) PORT_PLAYER(1) PORT_8WAY
- PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT) PORT_PLAYER(1) PORT_8WAY
- PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT) PORT_PLAYER(1) PORT_8WAY
- PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_BUTTON1) PORT_PLAYER(1)
- PORT_BIT(0xe0, IP_ACTIVE_HIGH, IPT_UNUSED)
-
- PORT_START("P2HANDLE")
- PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP) PORT_PLAYER(2) PORT_8WAY
- PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN) PORT_PLAYER(2) PORT_8WAY
- PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT) PORT_PLAYER(2) PORT_8WAY
- PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT) PORT_PLAYER(2) PORT_8WAY
- PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_BUTTON1) PORT_PLAYER(2)
- PORT_BIT(0xe0, IP_ACTIVE_HIGH, IPT_UNUSED)
-
- PORT_START("P3HANDLE")
- PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP) PORT_PLAYER(3) PORT_8WAY
- PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN) PORT_PLAYER(3) PORT_8WAY
- PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT) PORT_PLAYER(3) PORT_8WAY
- PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT) PORT_PLAYER(3) PORT_8WAY
- PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_BUTTON1) PORT_PLAYER(3)
- PORT_BIT(0xe0, IP_ACTIVE_HIGH, IPT_UNUSED)
-
- PORT_START("P4HANDLE")
- PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP) PORT_PLAYER(4) PORT_8WAY
- PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN) PORT_PLAYER(4) PORT_8WAY
- PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT) PORT_PLAYER(4) PORT_8WAY
- PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT) PORT_PLAYER(4) PORT_8WAY
- PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_BUTTON1) PORT_PLAYER(4)
- PORT_BIT(0xe0, IP_ACTIVE_HIGH, IPT_UNUSED)
-
PORT_START("KEYPAD0")
PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("% \xC3\xB7 [ ] LIST") PORT_CODE(KEYCODE_O)
PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("/ x J K L NEXT") PORT_CODE(KEYCODE_SLASH_PAD)
@@ -175,18 +149,6 @@ static INPUT_PORTS_START( astrocde )
PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("1 SPACE $ , ?") PORT_CODE(KEYCODE_1)
PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("CE GREEN Shift") PORT_CODE(KEYCODE_E)
PORT_BIT(0xc0, IP_ACTIVE_HIGH, IPT_UNUSED)
-
- PORT_START("P1_KNOB")
- PORT_BIT(0xff, 0x00, IPT_PADDLE) PORT_INVERT PORT_SENSITIVITY(85) PORT_KEYDELTA(10) PORT_CENTERDELTA(0) PORT_MINMAX(0,255) PORT_CODE_DEC(KEYCODE_Z) PORT_CODE_INC(KEYCODE_X) PORT_PLAYER(1)
-
- PORT_START("P2_KNOB")
- PORT_BIT(0xff, 0x00, IPT_PADDLE) PORT_INVERT PORT_SENSITIVITY(85) PORT_KEYDELTA(10) PORT_CENTERDELTA(0) PORT_MINMAX(0,255) PORT_CODE_DEC(KEYCODE_N) PORT_CODE_INC(KEYCODE_M) PORT_PLAYER(2)
-
- PORT_START("P3_KNOB")
- PORT_BIT(0xff, 0x00, IPT_PADDLE) PORT_INVERT PORT_SENSITIVITY(85) PORT_KEYDELTA(10) PORT_CENTERDELTA(0) PORT_MINMAX(0,255) PORT_CODE_DEC(KEYCODE_Q) PORT_CODE_INC(KEYCODE_W) PORT_PLAYER(3)
-
- PORT_START("P4_KNOB")
- PORT_BIT(0xff, 0x00, IPT_PADDLE) PORT_INVERT PORT_SENSITIVITY(85) PORT_KEYDELTA(10) PORT_CENTERDELTA(0) PORT_MINMAX(0,255) PORT_CODE_DEC(KEYCODE_Y) PORT_CODE_INC(KEYCODE_U) PORT_PLAYER(4)
INPUT_PORTS_END
@@ -201,6 +163,7 @@ static void astrocade_cart(device_slot_interface &device)
device.option_add_internal("rom", ASTROCADE_ROM_STD);
device.option_add_internal("rom_256k", ASTROCADE_ROM_256K);
device.option_add_internal("rom_512k", ASTROCADE_ROM_512K);
+ device.option_add_internal("rom_cass", ASTROCADE_ROM_CASS);
}
static void astrocade_exp(device_slot_interface &device)
@@ -221,6 +184,8 @@ void astrocde_home_state::astrocde(machine_config &config)
m_maincpu->set_addrmap(AS_PROGRAM, &astrocde_home_state::astrocade_mem);
m_maincpu->set_addrmap(AS_IO, &astrocde_home_state::astrocade_io);
+ config.m_perfect_cpu_quantum = subtag("maincpu");
+
MCFG_MACHINE_START_OVERRIDE(astrocde_home_state, astrocde)
/* video hardware */
@@ -231,14 +196,21 @@ void astrocde_home_state::astrocde(machine_config &config)
PALETTE(config, "palette", FUNC(astrocde_home_state::astrocade_palette), 512);
+ /* control ports */
+ for (uint32_t port = 0; port < 4; port++)
+ {
+ ASTROCADE_CTRL_PORT(config, m_ctrl[port], astrocade_controllers, port == 0 ? "joy" : nullptr);
+ m_ctrl[port]->ltpen_handler().set(FUNC(astrocde_home_state::lightpen_trigger_w));
+ }
+
/* sound hardware */
SPEAKER(config, "mono").front_center();
ASTROCADE_IO(config, m_astrocade_sound1, ASTROCADE_CLOCK/4);
m_astrocade_sound1->si_cb().set(FUNC(astrocde_home_state::inputs_r));
- m_astrocade_sound1->set_pot_tag<0>("P1_KNOB");
- m_astrocade_sound1->set_pot_tag<1>("P2_KNOB");
- m_astrocade_sound1->set_pot_tag<2>("P3_KNOB");
- m_astrocade_sound1->set_pot_tag<3>("P4_KNOB");
+ m_astrocade_sound1->pot_cb<0>().set(m_ctrl[0], FUNC(astrocade_ctrl_port_device::read_knob));
+ m_astrocade_sound1->pot_cb<1>().set(m_ctrl[1], FUNC(astrocade_ctrl_port_device::read_knob));
+ m_astrocade_sound1->pot_cb<2>().set(m_ctrl[2], FUNC(astrocade_ctrl_port_device::read_knob));
+ m_astrocade_sound1->pot_cb<3>().set(m_ctrl[3], FUNC(astrocade_ctrl_port_device::read_knob));
m_astrocade_sound1->add_route(ALL_OUTPUTS, "mono", 1.0);
/* expansion port */
@@ -247,6 +219,10 @@ void astrocde_home_state::astrocde(machine_config &config)
/* cartridge */
ASTROCADE_CART_SLOT(config, m_cart, astrocade_cart, nullptr);
+ /* cartridge */
+ ASTROCADE_ACCESSORY_PORT(config, m_accessory, m_screen, astrocade_accessories, nullptr);
+ m_accessory->ltpen_handler().set(FUNC(astrocde_home_state::lightpen_trigger_w));
+
/* Software lists */
SOFTWARE_LIST(config, "cart_list").set_original("astrocde");
}
@@ -281,7 +257,7 @@ ROM_END
void astrocde_state::init_astrocde()
{
- m_video_config = AC_SOUND_PRESENT | AC_LIGHTPEN_INTS;
+ m_video_config = AC_SOUND_PRESENT;
}
MACHINE_START_MEMBER(astrocde_home_state, astrocde)
@@ -292,7 +268,10 @@ MACHINE_START_MEMBER(astrocde_home_state, astrocde)
// if no RAM is mounted and the handlers are installed, the system starts with garbage on screen and a RESET is necessary
// thus, install RAM only if an expansion is mounted
if (m_exp->get_card_mounted())
+ {
m_maincpu->space(AS_PROGRAM).install_readwrite_handler(0x5000, 0xffff, read8_delegate(FUNC(astrocade_exp_device::read),(astrocade_exp_device*)m_exp), write8_delegate(FUNC(astrocade_exp_device::write),(astrocade_exp_device*)m_exp));
+ m_maincpu->space(AS_IO).install_readwrite_handler(0x0080, 0x00ff, 0x0000, 0x0000, 0xff00, read8_delegate(FUNC(astrocade_exp_device::read_io),(astrocade_exp_device*)m_exp), write8_delegate(FUNC(astrocade_exp_device::write_io),(astrocade_exp_device*)m_exp));
+ }
}
/*************************************
diff --git a/src/mame/drivers/astropc.cpp b/src/mame/drivers/astropc.cpp
index 810a97b111c..f9fd2241caa 100644
--- a/src/mame/drivers/astropc.cpp
+++ b/src/mame/drivers/astropc.cpp
@@ -51,12 +51,13 @@ INPUT_PORTS_END
-MACHINE_CONFIG_START(astropc_state::astropc)
+void astropc_state::astropc(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", I486, 40000000 ) // ??
- MCFG_DEVICE_PROGRAM_MAP(astropc_map)
- MCFG_DEVICE_IO_MAP(astropc_io)
-MACHINE_CONFIG_END
+ I486(config, m_maincpu, 40000000 ); // ??
+ m_maincpu->set_addrmap(AS_PROGRAM, &astropc_state::astropc_map);
+ m_maincpu->set_addrmap(AS_IO, &astropc_state::astropc_io);
+}
ROM_START( blackbd )
diff --git a/src/mame/drivers/asuka.cpp b/src/mame/drivers/asuka.cpp
index 5a56bfb3429..4e6dabd9abc 100644
--- a/src/mame/drivers/asuka.cpp
+++ b/src/mame/drivers/asuka.cpp
@@ -275,7 +275,7 @@ WRITE_LINE_MEMBER(asuka_state::asuka_msm5205_vck)
if (m_adpcm_ff)
{
- m_adpcm_select->write_ba(m_sound_data[m_adpcm_pos]);
+ m_adpcm_select->ba_w(m_sound_data[m_adpcm_pos]);
m_adpcm_pos = (m_adpcm_pos + 1) & 0xffff;
}
}
diff --git a/src/mame/drivers/at.cpp b/src/mame/drivers/at.cpp
index f9be6d14151..140882956b7 100644
--- a/src/mame/drivers/at.cpp
+++ b/src/mame/drivers/at.cpp
@@ -657,7 +657,8 @@ void megapc_state::megapc(machine_config &config)
// on board devices
ISA16(config, m_isabus, 0);
- m_isabus->set_cputag("maincpu");
+ m_isabus->set_memspace(m_maincpu, AS_PROGRAM);
+ m_isabus->set_iospace(m_maincpu, AS_IO);
m_isabus->iochck_callback().set(m_wd7600, FUNC(wd7600_device::iochck_w));
m_isabus->irq2_callback().set(m_wd7600, FUNC(wd7600_device::irq09_w));
m_isabus->irq3_callback().set(m_wd7600, FUNC(wd7600_device::irq03_w));
diff --git a/src/mame/drivers/atari400.cpp b/src/mame/drivers/atari400.cpp
index 03a5c7ba990..10c6bbcbdf3 100644
--- a/src/mame/drivers/atari400.cpp
+++ b/src/mame/drivers/atari400.cpp
@@ -2018,7 +2018,7 @@ TIMER_DEVICE_CALLBACK_MEMBER( a400_state::a5200_interrupt )
MACHINE_RESET_MEMBER( a400_state, a400 )
{
- m_pokey->write(machine().dummy_space(), 15, 0);
+ m_pokey->write(15, 0);
}
@@ -2158,7 +2158,7 @@ void a400_state::atari_common(machine_config &config)
atari_common_nodac(config);
DAC_1BIT(config, "dac", 0).add_route(ALL_OUTPUTS, "speaker", 0.03);
- VOLTAGE_REGULATOR(config, "vref", 0).set_output(5.0).add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT);
+ VOLTAGE_REGULATOR(config, "vref", 0).add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT);
/* internal ram */
RAM(config, m_ram).set_default_size("48K");
diff --git a/src/mame/drivers/atari_s1.cpp b/src/mame/drivers/atari_s1.cpp
index f8d785178b0..5b07c2a204e 100644
--- a/src/mame/drivers/atari_s1.cpp
+++ b/src/mame/drivers/atari_s1.cpp
@@ -450,10 +450,11 @@ void atari_s1_state::machine_reset()
m_audiores = 0;
}
-MACHINE_CONFIG_START(atari_s1_state::atari_s1)
+void atari_s1_state::atari_s1(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M6800, MASTER_CLK)
- MCFG_DEVICE_PROGRAM_MAP(atari_s1_map)
+ M6800(config, m_maincpu, MASTER_CLK);
+ m_maincpu->set_addrmap(AS_PROGRAM, &atari_s1_state::atari_s1_map);
WATCHDOG_TIMER(config, "watchdog");
@@ -461,28 +462,29 @@ MACHINE_CONFIG_START(atari_s1_state::atari_s1)
genpin_audio(config);
SPEAKER(config, "speaker").front_center();
- MCFG_DEVICE_ADD("dac", DAC_4BIT_R2R, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 0.3) // unknown DAC
- MCFG_DEVICE_ADD("vref", VOLTAGE_REGULATOR, 0) MCFG_VOLTAGE_REGULATOR_OUTPUT(5.0)
- MCFG_SOUND_ROUTE(0, "dac", 1.0, DAC_VREF_POS_INPUT) MCFG_SOUND_ROUTE(0, "dac", -1.0, DAC_VREF_NEG_INPUT)
+ DAC_4BIT_R2R(config, m_dac, 0).add_route(ALL_OUTPUTS, "speaker", 0.3); // unknown DAC
+ voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref"));
+ vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT);
+ vref.add_route(0, "dac", -1.0, DAC_VREF_NEG_INPUT);
/* Video */
config.set_default_layout(layout_atari_s1);
- MCFG_TIMER_DRIVER_ADD_PERIODIC("nmi", atari_s1_state, nmi, attotime::from_hz(NMI_INT))
- MCFG_TIMER_DRIVER_ADD_PERIODIC("timer_s", atari_s1_state, timer_s, attotime::from_hz(AUDIO_CLK))
-MACHINE_CONFIG_END
+ TIMER(config, "nmi").configure_periodic(FUNC(atari_s1_state::nmi), attotime::from_hz(NMI_INT));
+ TIMER(config, "timer_s").configure_periodic(FUNC(atari_s1_state::timer_s), attotime::from_hz(AUDIO_CLK));
+}
-MACHINE_CONFIG_START(atari_s1_state::atarians)
+void atari_s1_state::atarians(machine_config &config)
+{
atari_s1(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(atarians_map)
-MACHINE_CONFIG_END
+ m_maincpu->set_addrmap(AS_PROGRAM, &atari_s1_state::atarians_map);
+}
-MACHINE_CONFIG_START(atari_s1_state::midearth)
+void atari_s1_state::midearth(machine_config &config)
+{
atari_s1(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(midearth_map)
-MACHINE_CONFIG_END
+ m_maincpu->set_addrmap(AS_PROGRAM, &atari_s1_state::midearth_map);
+}
/*-------------------------------------------------------------------
/ The Atarians (11/1976)
diff --git a/src/mame/drivers/atari_s2.cpp b/src/mame/drivers/atari_s2.cpp
index ff198642ed3..46db7f2d67c 100644
--- a/src/mame/drivers/atari_s2.cpp
+++ b/src/mame/drivers/atari_s2.cpp
@@ -479,10 +479,11 @@ void atari_s2_state::machine_reset()
}
-MACHINE_CONFIG_START(atari_s2_state::atari_s2)
+void atari_s2_state::atari_s2(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M6800, XTAL(4'000'000) / 4)
- MCFG_DEVICE_PROGRAM_MAP(atari_s2_map)
+ M6800(config, m_maincpu, XTAL(4'000'000) / 4);
+ m_maincpu->set_addrmap(AS_PROGRAM, &atari_s2_state::atari_s2_map);
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
WATCHDOG_TIMER(config, "watchdog");
@@ -490,24 +491,24 @@ MACHINE_CONFIG_START(atari_s2_state::atari_s2)
genpin_audio(config);
SPEAKER(config, "speaker").front_center();
- MCFG_DEVICE_ADD("dac", DAC_4BIT_BINARY_WEIGHTED, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 0.15) // r23-r26 (68k,33k,18k,8.2k)
- MCFG_DEVICE_ADD("dac1", DAC_3BIT_BINARY_WEIGHTED, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 0.15) // r18-r20 (100k,47k,100k)
- MCFG_DEVICE_ADD("vref", VOLTAGE_REGULATOR, 0) MCFG_VOLTAGE_REGULATOR_OUTPUT(5.0)
- MCFG_SOUND_ROUTE(0, "dac", 1.0, DAC_VREF_POS_INPUT) MCFG_SOUND_ROUTE(0, "dac", -1.0, DAC_VREF_NEG_INPUT)
- MCFG_SOUND_ROUTE(0, "dac1", 1.0, DAC_VREF_POS_INPUT) MCFG_SOUND_ROUTE(0, "dac1", -1.0, DAC_VREF_NEG_INPUT)
+ DAC_4BIT_BINARY_WEIGHTED(config, m_dac, 0).add_route(ALL_OUTPUTS, "speaker", 0.15); // r23-r26 (68k,33k,18k,8.2k)
+ DAC_3BIT_BINARY_WEIGHTED(config, m_dac1, 0).add_route(ALL_OUTPUTS, "speaker", 0.15); // r18-r20 (100k,47k,100k)
+ voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref"));
+ vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT).add_route(0, "dac", -1.0, DAC_VREF_NEG_INPUT);
+ vref.add_route(0, "dac1", 1.0, DAC_VREF_POS_INPUT).add_route(0, "dac1", -1.0, DAC_VREF_NEG_INPUT);
/* Video */
config.set_default_layout(layout_atari_s2);
- MCFG_TIMER_DRIVER_ADD_PERIODIC("irq", atari_s2_state, irq, attotime::from_hz(XTAL(4'000'000) / 8192))
- MCFG_TIMER_DRIVER_ADD_PERIODIC("timer_s", atari_s2_state, timer_s, attotime::from_hz(150000))
-MACHINE_CONFIG_END
+ TIMER(config, "irq").configure_periodic(FUNC(atari_s2_state::irq), attotime::from_hz(XTAL(4'000'000) / 8192));
+ TIMER(config, "timer_s").configure_periodic(FUNC(atari_s2_state::timer_s), attotime::from_hz(150000));
+}
-MACHINE_CONFIG_START(atari_s2_state::atari_s3)
+void atari_s2_state::atari_s3(machine_config &config)
+{
atari_s2(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(atari_s3_map)
-MACHINE_CONFIG_END
+ m_maincpu->set_addrmap(AS_PROGRAM, &atari_s2_state::atari_s3_map);
+}
/*-------------------------------------------------------------------
diff --git a/src/mame/drivers/atarifb.cpp b/src/mame/drivers/atarifb.cpp
index 578b377fcac..127bfcbab2b 100644
--- a/src/mame/drivers/atarifb.cpp
+++ b/src/mame/drivers/atarifb.cpp
@@ -557,74 +557,70 @@ void atarifb_state::machine_reset()
m_counter_y_in2b = 0;
}
-MACHINE_CONFIG_START(atarifb_state::atarifb)
-
+void atarifb_state::atarifb(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M6502, 750000)
- MCFG_DEVICE_PROGRAM_MAP(atarifb_map)
- MCFG_DEVICE_PERIODIC_INT_DRIVER(atarifb_state, irq0_line_hold, 4*60)
+ M6502(config, m_maincpu, 750000);
+ m_maincpu->set_addrmap(AS_PROGRAM, &atarifb_state::atarifb_map);
+ m_maincpu->set_periodic_int(FUNC(atarifb_state::irq0_line_hold), attotime::from_hz(4*60));
WATCHDOG_TIMER(config, "watchdog");
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2037) /* 16.3ms * 1/8 = 2037.5. Is it 1/8th or 3/32nds? (1528?) */)
- MCFG_SCREEN_SIZE(38*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 38*8-1, 1*8, 31*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(atarifb_state, screen_update_atarifb)
- MCFG_SCREEN_PALETTE(m_palette)
-
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, m_palette, gfx_atarifb)
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_refresh_hz(60);
+ m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(2037) /* 16.3ms * 1/8 = 2037.5. Is it 1/8th or 3/32nds? (1528?) */);
+ m_screen->set_size(38*8, 32*8);
+ m_screen->set_visarea(0*8, 38*8-1, 1*8, 31*8-1);
+ m_screen->set_screen_update(FUNC(atarifb_state::screen_update_atarifb));
+ m_screen->set_palette(m_palette);
+
+ GFXDECODE(config, m_gfxdecode, m_palette, gfx_atarifb);
PALETTE(config, m_palette, FUNC(atarifb_state::atarifb_palette), 12);
/* sound hardware */
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("discrete", DISCRETE, atarifb_discrete)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.18)
-MACHINE_CONFIG_END
+ DISCRETE(config, m_discrete, atarifb_discrete).add_route(ALL_OUTPUTS, "mono", 0.18);
+}
-MACHINE_CONFIG_START(atarifb_state::atarifb4)
+void atarifb_state::atarifb4(machine_config &config)
+{
atarifb(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(atarifb4_map)
-MACHINE_CONFIG_END
+ m_maincpu->set_addrmap(AS_PROGRAM, &atarifb_state::atarifb4_map);
+}
-MACHINE_CONFIG_START(atarifb_state::abaseb)
+void atarifb_state::abaseb(machine_config &config)
+{
atarifb(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(abaseb_map)
+ m_maincpu->set_addrmap(AS_PROGRAM, &atarifb_state::abaseb_map);
/* video hardware */
- MCFG_SCREEN_MODIFY("screen")
- MCFG_SCREEN_UPDATE_DRIVER(atarifb_state, screen_update_abaseb)
+ m_screen->set_screen_update(FUNC(atarifb_state::screen_update_abaseb));
/* sound hardware */
- MCFG_DEVICE_REPLACE("discrete", DISCRETE, abaseb_discrete)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.24)
-MACHINE_CONFIG_END
+ DISCRETE(config.replace(), m_discrete, abaseb_discrete).add_route(ALL_OUTPUTS, "mono", 0.24);
+}
-MACHINE_CONFIG_START(atarifb_state::soccer)
+void atarifb_state::soccer(machine_config &config)
+{
atarifb(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(soccer_map)
+ m_maincpu->set_addrmap(AS_PROGRAM, &atarifb_state::soccer_map);
/* video hardware */
- MCFG_SCREEN_MODIFY("screen")
- MCFG_SCREEN_VISIBLE_AREA(0*8, 38*8-1, 2*8, 32*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(atarifb_state, screen_update_soccer)
- MCFG_GFXDECODE_MODIFY("gfxdecode", gfx_soccer)
-MACHINE_CONFIG_END
+ m_screen->set_visarea(0*8, 38*8-1, 2*8, 32*8-1);
+ m_screen->set_screen_update(FUNC(atarifb_state::screen_update_soccer));
+ m_gfxdecode->set_info(gfx_soccer);
+}
diff --git a/src/mame/drivers/atarig1.cpp b/src/mame/drivers/atarig1.cpp
index 4e360ca8267..a4d3de4453d 100644
--- a/src/mame/drivers/atarig1.cpp
+++ b/src/mame/drivers/atarig1.cpp
@@ -78,14 +78,14 @@ WRITE16_MEMBER(atarig1_state::mo_command_w)
WRITE16_MEMBER(atarig1_state::a2d_select_w)
{
if (m_adc.found())
- m_adc->address_offset_start_w(space, offset, 0);
+ m_adc->address_offset_start_w(offset, 0);
}
READ16_MEMBER(atarig1_state::a2d_data_r)
{
if (m_adc.found())
- return m_adc->data_r(space, offset) << 8;
+ return m_adc->data_r() << 8;
else
return m_in1->read();
}
@@ -396,11 +396,11 @@ static const atari_rle_objects_config modesc_pitfight =
*
*************************************/
-MACHINE_CONFIG_START(atarig1_state::atarig1)
-
+void atarig1_state::atarig1(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M68000, ATARI_CLOCK_14MHz)
- MCFG_DEVICE_PROGRAM_MAP(main_map)
+ M68000(config, m_maincpu, ATARI_CLOCK_14MHz);
+ m_maincpu->set_addrmap(AS_PROGRAM, &atarig1_state::main_map);
MCFG_MACHINE_START_OVERRIDE(atarig1_state,atarig1)
MCFG_MACHINE_RESET_OVERRIDE(atarig1_state,atarig1)
@@ -410,20 +410,20 @@ MACHINE_CONFIG_START(atarig1_state::atarig1)
WATCHDOG_TIMER(config, "watchdog");
/* video hardware */
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_atarig1)
+ GFXDECODE(config, m_gfxdecode, "palette", gfx_atarig1);
PALETTE(config, "palette").set_format(palette_device::IRGB_1555, 1280);
/* initialize the playfield */
- MCFG_TILEMAP_ADD_STANDARD("playfield", "gfxdecode", 2, atarig1_state, get_playfield_tile_info, 8,8, SCAN_ROWS, 64,64)
- MCFG_TILEMAP_ADD_STANDARD_TRANSPEN("alpha", "gfxdecode", 2, atarig1_state, get_alpha_tile_info, 8,8, SCAN_ROWS, 64,32, 0)
+ TILEMAP(config, m_playfield_tilemap, m_gfxdecode, 2, 8,8, TILEMAP_SCAN_ROWS, 64,64).set_info_callback(FUNC(atarig1_state::get_playfield_tile_info));
+ TILEMAP(config, m_alpha_tilemap, m_gfxdecode, 2, 8,8, TILEMAP_SCAN_ROWS, 64,32, 0).set_info_callback(FUNC(atarig1_state::get_alpha_tile_info));
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_VIDEO_ATTRIBUTES(VIDEO_UPDATE_BEFORE_VBLANK)
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_video_attributes(VIDEO_UPDATE_BEFORE_VBLANK);
/* note: these parameters are from published specs, not derived */
- MCFG_SCREEN_RAW_PARAMS(ATARI_CLOCK_14MHz/2, 456, 0, 336, 262, 0, 240)
- MCFG_SCREEN_UPDATE_DRIVER(atarig1_state, screen_update_atarig1)
- MCFG_SCREEN_PALETTE("palette")
- MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE(*this, atarig1_state, video_int_write_line))
+ m_screen->set_raw(ATARI_CLOCK_14MHz/2, 456, 0, 336, 262, 0, 240);
+ m_screen->set_screen_update(FUNC(atarig1_state::screen_update_atarig1));
+ m_screen->set_palette("palette");
+ m_screen->screen_vblank().set(FUNC(atarig1_state::video_int_write_line));
MCFG_VIDEO_START_OVERRIDE(atarig1_state,atarig1)
@@ -434,7 +434,7 @@ MACHINE_CONFIG_START(atarig1_state::atarig1)
m_jsa->main_int_cb().set_inputline(m_maincpu, M68K_IRQ_2);
m_jsa->test_read_cb().set_ioport("IN0").bit(14);
m_jsa->add_route(ALL_OUTPUTS, "mono", 1.0);
-MACHINE_CONFIG_END
+}
void atarig1_state::hydrap(machine_config &config)
diff --git a/src/mame/drivers/atarig42.cpp b/src/mame/drivers/atarig42.cpp
index 520a76e39a8..8878331f30f 100644
--- a/src/mame/drivers/atarig42.cpp
+++ b/src/mame/drivers/atarig42.cpp
@@ -67,7 +67,7 @@ void atarig42_state::machine_reset()
WRITE8_MEMBER(atarig42_state::a2d_select_w)
{
if (m_adc.found())
- m_adc->address_offset_start_w(space, offset, 0);
+ m_adc->address_offset_start_w(offset, 0);
}
@@ -76,9 +76,9 @@ READ8_MEMBER(atarig42_state::a2d_data_r)
if (!m_adc.found())
return 0xff;
- uint8_t result = m_adc->data_r(space, 0);
+ uint8_t result = m_adc->data_r();
if (!machine().side_effects_disabled())
- m_adc->address_offset_start_w(space, offset, 0);
+ m_adc->address_offset_start_w(offset, 0);
return result;
}
@@ -515,30 +515,29 @@ static const atari_rle_objects_config modesc_0x400 =
*************************************/
MACHINE_CONFIG_START(atarig42_state::atarig42)
-
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M68000, ATARI_CLOCK_14MHz)
- MCFG_DEVICE_PROGRAM_MAP(main_map)
+ M68000(config, m_maincpu, ATARI_CLOCK_14MHz);
+ m_maincpu->set_addrmap(AS_PROGRAM, &atarig42_state::main_map);
EEPROM_2816(config, "eeprom").lock_after_write(true);
WATCHDOG_TIMER(config, "watchdog");
/* video hardware */
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_atarig42)
+ GFXDECODE(config, m_gfxdecode, "palette", gfx_atarig42);
PALETTE(config, "palette").set_format(palette_device::IRGB_1555, 2048);
MCFG_TILEMAP_ADD_CUSTOM("playfield", "gfxdecode", 2, atarig42_state, get_playfield_tile_info, 8,8, atarig42_playfield_scan, 128,64)
- MCFG_TILEMAP_ADD_STANDARD_TRANSPEN("alpha", "gfxdecode", 2, atarig42_state, get_alpha_tile_info, 8,8, SCAN_ROWS, 64,32, 0)
+ TILEMAP(config, m_alpha_tilemap, m_gfxdecode, 2, 8,8, TILEMAP_SCAN_ROWS, 64,32, 0).set_info_callback(FUNC(atarig42_state::get_alpha_tile_info));
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_VIDEO_ATTRIBUTES(VIDEO_UPDATE_BEFORE_VBLANK)
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_video_attributes(VIDEO_UPDATE_BEFORE_VBLANK);
/* note: these parameters are from published specs, not derived */
/* the board uses an SOS chip to generate video signals */
- MCFG_SCREEN_RAW_PARAMS(ATARI_CLOCK_14MHz/2, 456, 0, 336, 262, 0, 240)
- MCFG_SCREEN_UPDATE_DRIVER(atarig42_state, screen_update_atarig42)
- MCFG_SCREEN_PALETTE("palette")
- MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE(*this, atarig42_state, video_int_write_line))
+ m_screen->set_raw(ATARI_CLOCK_14MHz/2, 456, 0, 336, 262, 0, 240);
+ m_screen->set_screen_update(FUNC(atarig42_state::screen_update_atarig42));
+ m_screen->set_palette("palette");
+ m_screen->screen_vblank().set(FUNC(atarig42_state::video_int_write_line));
MCFG_VIDEO_START_OVERRIDE(atarig42_state,atarig42)
diff --git a/src/mame/drivers/atarigt.cpp b/src/mame/drivers/atarigt.cpp
index 78ce47bb16a..d5850333303 100644
--- a/src/mame/drivers/atarigt.cpp
+++ b/src/mame/drivers/atarigt.cpp
@@ -185,9 +185,9 @@ READ8_MEMBER(atarigt_state::analog_port_r)
return 0xff;
}
#else
- uint8_t result = m_adc->data_r(space, 0);
+ uint8_t result = m_adc->data_r();
if (!machine().side_effects_disabled())
- m_adc->address_offset_start_w(space, offset, 0);
+ m_adc->address_offset_start_w(offset, 0);
return result;
#endif
}
@@ -806,28 +806,28 @@ static const atari_rle_objects_config modesc =
MACHINE_CONFIG_START(atarigt_state::atarigt)
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M68EC020, ATARI_CLOCK_50MHz/2)
- MCFG_DEVICE_PROGRAM_MAP(main_map)
- MCFG_DEVICE_PERIODIC_INT_DRIVER(atarigt_state, scanline_int_gen, 250)
+ M68EC020(config, m_maincpu, ATARI_CLOCK_50MHz/2);
+ m_maincpu->set_addrmap(AS_PROGRAM, &atarigt_state::main_map);
+ m_maincpu->set_periodic_int(FUNC(atarigt_state::scanline_int_gen), attotime::from_hz(250));
MCFG_MACHINE_RESET_OVERRIDE(atarigt_state,atarigt)
EEPROM_2816(config, "eeprom").lock_after_write(true);
/* video hardware */
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_atarigt)
- MCFG_PALETTE_ADD("palette", MRAM_ENTRIES)
+ GFXDECODE(config, m_gfxdecode, m_palette, gfx_atarigt);
+ PALETTE(config, m_palette).set_entries(MRAM_ENTRIES);
MCFG_TILEMAP_ADD_CUSTOM("playfield", "gfxdecode", 2, atarigt_state, get_playfield_tile_info, 8,8, atarigt_playfield_scan, 128,64)
- MCFG_TILEMAP_ADD_STANDARD("alpha", "gfxdecode", 2, atarigt_state, get_alpha_tile_info, 8,8, SCAN_ROWS, 64, 32)
+ TILEMAP(config, m_alpha_tilemap, m_gfxdecode, 2, 8,8, TILEMAP_SCAN_ROWS, 64, 32).set_info_callback(FUNC(atarigt_state::get_alpha_tile_info));
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_VIDEO_ATTRIBUTES(VIDEO_UPDATE_BEFORE_VBLANK)
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_video_attributes(VIDEO_UPDATE_BEFORE_VBLANK);
/* note: these parameters are from published specs, not derived */
/* the board uses a pair of GALs to determine H and V parameters */
- MCFG_SCREEN_RAW_PARAMS(ATARI_CLOCK_14MHz/2, 456, 0, 336, 262, 0, 240)
- MCFG_SCREEN_UPDATE_DRIVER(atarigt_state, screen_update_atarigt)
- MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE(*this, atarigt_state, video_int_write_line))
+ m_screen->set_raw(ATARI_CLOCK_14MHz/2, 456, 0, 336, 262, 0, 240);
+ m_screen->set_screen_update(FUNC(atarigt_state::screen_update_atarigt));
+ m_screen->screen_vblank().set(FUNC(atarigt_state::video_int_write_line));
MCFG_VIDEO_START_OVERRIDE(atarigt_state,atarigt)
diff --git a/src/mame/drivers/atarigx2.cpp b/src/mame/drivers/atarigx2.cpp
index 330245e37e5..f29764b4113 100644
--- a/src/mame/drivers/atarigx2.cpp
+++ b/src/mame/drivers/atarigx2.cpp
@@ -77,9 +77,9 @@ READ32_MEMBER(atarigx2_state::special_port3_r)
READ8_MEMBER(atarigx2_state::a2d_data_r)
{
- uint8_t result = m_adc->data_r(space, 0);
+ uint8_t result = m_adc->data_r();
if (!machine().side_effects_disabled())
- m_adc->address_offset_start_w(space, offset, 0);
+ m_adc->address_offset_start_w(offset, 0);
return result;
}
@@ -1488,8 +1488,8 @@ static const atari_rle_objects_config modesc_0x400 =
MACHINE_CONFIG_START(atarigx2_state::atarigx2)
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M68EC020, ATARI_CLOCK_14MHz)
- MCFG_DEVICE_PROGRAM_MAP(main_map)
+ M68EC020(config, m_maincpu, ATARI_CLOCK_14MHz);
+ m_maincpu->set_addrmap(AS_PROGRAM, &atarigx2_state::main_map);
ADC0809(config, m_adc, ATARI_CLOCK_14MHz/16);
m_adc->in_callback<0>().set_ioport("A2D0");
@@ -1504,20 +1504,20 @@ MACHINE_CONFIG_START(atarigx2_state::atarigx2)
EEPROM_2816(config, "eeprom").lock_after_write(true);
/* video hardware */
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_atarigx2)
+ GFXDECODE(config, m_gfxdecode, "palette", gfx_atarigx2);
PALETTE(config, "palette").set_format(palette_device::IRGB_1555, 2048);
MCFG_TILEMAP_ADD_CUSTOM("playfield", "gfxdecode", 2, atarigx2_state, get_playfield_tile_info, 8,8, atarigx2_playfield_scan, 128,64)
- MCFG_TILEMAP_ADD_STANDARD_TRANSPEN("alpha", "gfxdecode", 2, atarigx2_state, get_alpha_tile_info, 8,8, SCAN_ROWS, 64,32, 0)
+ TILEMAP(config, m_alpha_tilemap, m_gfxdecode, 2, 8,8, TILEMAP_SCAN_ROWS, 64,32, 0).set_info_callback(FUNC(atarigx2_state::get_alpha_tile_info));
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_VIDEO_ATTRIBUTES(VIDEO_UPDATE_BEFORE_VBLANK)
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_video_attributes(VIDEO_UPDATE_BEFORE_VBLANK);
/* note: these parameters are from published specs, not derived */
/* the board uses a pair of GALs to determine H and V parameters */
- MCFG_SCREEN_RAW_PARAMS(ATARI_CLOCK_14MHz/2, 456, 0, 336, 262, 0, 240)
- MCFG_SCREEN_UPDATE_DRIVER(atarigx2_state, screen_update_atarigx2)
- MCFG_SCREEN_PALETTE("palette")
- MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE(*this, atarigx2_state, video_int_write_line))
+ m_screen->set_raw(ATARI_CLOCK_14MHz/2, 456, 0, 336, 262, 0, 240);
+ m_screen->set_screen_update(FUNC(atarigx2_state::screen_update_atarigx2));
+ m_screen->set_palette("palette");
+ m_screen->screen_vblank().set(FUNC(atarigx2_state::video_int_write_line));
/* sound hardware */
SPEAKER(config, "lspeaker").front_left();
diff --git a/src/mame/drivers/atarist.cpp b/src/mame/drivers/atarist.cpp
index c50ddb578ff..a6eb2d80444 100644
--- a/src/mame/drivers/atarist.cpp
+++ b/src/mame/drivers/atarist.cpp
@@ -1867,7 +1867,7 @@ void st_state::machine_start()
configure_memory();
if (m_cart->exists())
- m_maincpu->space(AS_PROGRAM).install_read_handler(0xfa0000, 0xfbffff, read16_delegate(FUNC(generic_slot_device::read16_rom),(generic_slot_device*)m_cart));
+ m_maincpu->space(AS_PROGRAM).install_read_handler(0xfa0000, 0xfbffff, read16s_delegate(FUNC(generic_slot_device::read16_rom),(generic_slot_device*)m_cart));
// allocate timers
if (m_mousex.found())
@@ -1922,7 +1922,7 @@ void ste_state::machine_start()
configure_memory();
if (m_cart->exists())
- m_maincpu->space(AS_PROGRAM).install_read_handler(0xfa0000, 0xfbffff, read16_delegate(FUNC(generic_slot_device::read16_rom),(generic_slot_device*)m_cart));
+ m_maincpu->space(AS_PROGRAM).install_read_handler(0xfa0000, 0xfbffff, read16s_delegate(FUNC(generic_slot_device::read16_rom),(generic_slot_device*)m_cart));
/* allocate timers */
m_dmasound_timer = timer_alloc(TIMER_DMASOUND_TICK);
@@ -1969,7 +1969,7 @@ void stbook_state::machine_start()
}
if (m_cart->exists())
- m_maincpu->space(AS_PROGRAM).install_read_handler(0xfa0000, 0xfbffff, read16_delegate(FUNC(generic_slot_device::read16_rom),(generic_slot_device*)m_cart));
+ m_maincpu->space(AS_PROGRAM).install_read_handler(0xfa0000, 0xfbffff, read16s_delegate(FUNC(generic_slot_device::read16_rom),(generic_slot_device*)m_cart));
/* register for state saving */
ste_state::state_save();
@@ -2074,7 +2074,7 @@ void st_state::keyboard(machine_config &config)
}
//-------------------------------------------------
-// MACHINE_CONFIG( st )
+// machine_config( st )
//-------------------------------------------------
void st_state::st(machine_config &config)
@@ -2106,7 +2106,7 @@ void st_state::st(machine_config &config)
//-------------------------------------------------
-// MACHINE_CONFIG( megast )
+// machine_config( megast )
//-------------------------------------------------
void megast_state::megast(machine_config &config)
@@ -2141,7 +2141,7 @@ void megast_state::megast(machine_config &config)
//-------------------------------------------------
-// MACHINE_CONFIG( ste )
+// machine_config( ste )
//-------------------------------------------------
void ste_state::ste(machine_config &config)
@@ -2171,7 +2171,7 @@ void ste_state::ste(machine_config &config)
LMC1992(config, LMC1992_TAG);
// cartridge
-// MCFG_SOFTWARE_LIST_ADD("cart_list", "ste_cart")
+// SOFTWARE_LIST(config, "cart_list").set_original("ste_cart");
// internal ram
RAM(config, m_ram);
@@ -2181,7 +2181,7 @@ void ste_state::ste(machine_config &config)
//-------------------------------------------------
-// MACHINE_CONFIG( megaste )
+// machine_config( megaste )
//-------------------------------------------------
void megaste_state::megaste(machine_config &config)
@@ -2198,7 +2198,7 @@ void megaste_state::megaste(machine_config &config)
//-------------------------------------------------
-// MACHINE_CONFIG( stbook )
+// machine_config( stbook )
//-------------------------------------------------
#if 0
void stbook_state::stbook(machine_config &config)
@@ -2282,7 +2282,7 @@ void stbook_state::stbook(machine_config &config)
#endif
//-------------------------------------------------
-// MACHINE_CONFIG( tt030 )
+// machine_config( tt030 )
//-------------------------------------------------
void ste_state::tt030(machine_config &config)
@@ -2292,7 +2292,7 @@ void ste_state::tt030(machine_config &config)
//-------------------------------------------------
-// MACHINE_CONFIG( falcon )
+// machine_config( falcon )
//-------------------------------------------------
void ste_state::falcon(machine_config &config)
@@ -2302,7 +2302,7 @@ void ste_state::falcon(machine_config &config)
//-------------------------------------------------
-// MACHINE_CONFIG( falcon40 )
+// machine_config( falcon40 )
//-------------------------------------------------
void ste_state::falcon40(machine_config &config)
diff --git a/src/mame/drivers/atarisy1.cpp b/src/mame/drivers/atarisy1.cpp
index 251ecf21fb5..7c9b8fbff0b 100644
--- a/src/mame/drivers/atarisy1.cpp
+++ b/src/mame/drivers/atarisy1.cpp
@@ -261,7 +261,7 @@ READ8_MEMBER(atarisy1_state::adc_r)
if (!m_adc.found())
return 0xff;
- int value = m_adc->data_r(space, 0);
+ int value = m_adc->data_r();
if (!machine().side_effects_disabled())
adc_w(space, offset, 0);
@@ -275,7 +275,7 @@ WRITE8_MEMBER(atarisy1_state::adc_w)
if (!m_adc.found())
return;
- m_adc->address_offset_start_w(space, offset & 7, 0);
+ m_adc->address_offset_start_w(offset & 7, 0);
/* the A4 bit enables/disables joystick IRQs */
m_ajsint->in_w<0>(!BIT(offset, 3));
@@ -724,14 +724,14 @@ void atarisy1_state::add_adc(machine_config &config)
m_ajsint->output_handler().set(FUNC(atarisy1_state::joystick_int));
}
-MACHINE_CONFIG_START(atarisy1_state::atarisy1)
-
+void atarisy1_state::atarisy1(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M68010, ATARI_CLOCK_14MHz/2)
- MCFG_DEVICE_PROGRAM_MAP(main_map)
+ M68010(config, m_maincpu, ATARI_CLOCK_14MHz/2);
+ m_maincpu->set_addrmap(AS_PROGRAM, &atarisy1_state::main_map);
- MCFG_DEVICE_ADD("audiocpu", M6502, ATARI_CLOCK_14MHz/8)
- MCFG_DEVICE_PROGRAM_MAP(sound_map)
+ M6502(config, m_audiocpu, ATARI_CLOCK_14MHz/8);
+ m_audiocpu->set_addrmap(AS_PROGRAM, &atarisy1_state::sound_map);
MCFG_MACHINE_START_OVERRIDE(atarisy1_state,atarisy1)
MCFG_MACHINE_RESET_OVERRIDE(atarisy1_state,atarisy1)
@@ -747,29 +747,29 @@ MACHINE_CONFIG_START(atarisy1_state::atarisy1)
WATCHDOG_TIMER(config, "watchdog");
- MCFG_TIMER_DRIVER_ADD("scan_timer", atarisy1_state, atarisy1_int3_callback)
- MCFG_TIMER_DRIVER_ADD("int3off_timer", atarisy1_state, atarisy1_int3off_callback)
- MCFG_TIMER_DRIVER_ADD("yreset_timer", atarisy1_state, atarisy1_reset_yscroll_callback)
+ TIMER(config, m_scanline_timer).configure_generic(FUNC(atarisy1_state::atarisy1_int3_callback));
+ TIMER(config, m_int3off_timer).configure_generic(FUNC(atarisy1_state::atarisy1_int3off_callback));
+ TIMER(config, m_yscroll_reset_timer).configure_generic(FUNC(atarisy1_state::atarisy1_reset_yscroll_callback));
/* video hardware */
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_atarisy1)
+ GFXDECODE(config, m_gfxdecode, m_palette, gfx_atarisy1);
PALETTE(config, m_palette).set_format(palette_device::IRGB_4444, 1024);
- MCFG_TILEMAP_ADD_STANDARD("playfield", "gfxdecode", 2, atarisy1_state, get_playfield_tile_info, 8,8, SCAN_ROWS, 64,64)
- MCFG_TILEMAP_ADD_STANDARD_TRANSPEN("alpha", "gfxdecode", 2, atarisy1_state, get_alpha_tile_info, 8,8, SCAN_ROWS, 64,32, 0)
+ TILEMAP(config, m_playfield_tilemap, m_gfxdecode, 2, 8,8, TILEMAP_SCAN_ROWS, 64,64).set_info_callback(FUNC(atarisy1_state::get_playfield_tile_info));
+ TILEMAP(config, m_alpha_tilemap, m_gfxdecode, 2, 8,8, TILEMAP_SCAN_ROWS, 64,32, 0).set_info_callback(FUNC(atarisy1_state::get_alpha_tile_info));
ATARI_MOTION_OBJECTS(config, m_mob, 0, m_screen, atarisy1_state::s_mob_config);
m_mob->set_gfxdecode(m_gfxdecode);
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_VIDEO_ATTRIBUTES(VIDEO_UPDATE_BEFORE_VBLANK)
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_video_attributes(VIDEO_UPDATE_BEFORE_VBLANK);
/* note: these parameters are from published specs, not derived */
/* video timing comes from an 82S163 (H) and an 82S129 (V) */
- MCFG_SCREEN_RAW_PARAMS(ATARI_CLOCK_14MHz/2, 456, 0, 336, 262, 0, 240)
- MCFG_SCREEN_UPDATE_DRIVER(atarisy1_state, screen_update_atarisy1)
- MCFG_SCREEN_PALETTE(m_palette)
- MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE(*this, atarisy1_state, video_int_write_line))
+ m_screen->set_raw(ATARI_CLOCK_14MHz/2, 456, 0, 336, 262, 0, 240);
+ m_screen->set_screen_update(FUNC(atarisy1_state::screen_update_atarisy1));
+ m_screen->set_palette(m_palette);
+ m_screen->screen_vblank().set(FUNC(atarisy1_state::video_int_write_line));
MCFG_VIDEO_START_OVERRIDE(atarisy1_state,atarisy1)
@@ -784,13 +784,13 @@ MACHINE_CONFIG_START(atarisy1_state::atarisy1)
ymsnd.add_route(0, "lspeaker", 0.80);
ymsnd.add_route(1, "rspeaker", 0.80);
- MCFG_DEVICE_ADD("pokey", POKEY, ATARI_CLOCK_14MHz/8)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 0.40)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 0.40)
+ pokey_device &pokey(POKEY(config, "pokey", ATARI_CLOCK_14MHz/8));
+ pokey.add_route(ALL_OUTPUTS, "lspeaker", 0.40);
+ pokey.add_route(ALL_OUTPUTS, "rspeaker", 0.40);
- MCFG_DEVICE_ADD("tms", TMS5220C, ATARI_CLOCK_14MHz/2/11)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 1.0)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 1.0)
+ TMS5220C(config, m_tms, ATARI_CLOCK_14MHz/2/11);
+ m_tms->add_route(ALL_OUTPUTS, "lspeaker", 1.0);
+ m_tms->add_route(ALL_OUTPUTS, "rspeaker", 1.0);
/* via */
via6522_device &via(VIA6522(config, "via6522_0", ATARI_CLOCK_14MHz/8));
@@ -798,7 +798,7 @@ MACHINE_CONFIG_START(atarisy1_state::atarisy1)
via.readpb_handler().set(FUNC(atarisy1_state::via_pb_r));
via.writepa_handler().set(FUNC(atarisy1_state::via_pa_w));
via.writepb_handler().set(FUNC(atarisy1_state::via_pb_w));
-MACHINE_CONFIG_END
+}
void atarisy1_state::marble(machine_config &config)
{
diff --git a/src/mame/drivers/atarittl.cpp b/src/mame/drivers/atarittl.cpp
index 3d969530dce..4db1900cf0d 100644
--- a/src/mame/drivers/atarittl.cpp
+++ b/src/mame/drivers/atarittl.cpp
@@ -37,7 +37,6 @@
TM-019 Pursuit (1975) K8P-B 90128 NO
TM-012,029,034 Quadrapong (1974) A000845 NO
TM-009 Qwak!/Quack (1974) A000937,A000953 YES 72074/37-2530N (K9)
- TM-001,023,029,032 Rebound/Spike/Volleyball (1974) A000517,A000846,SPIKE-(A or B) NO
TM-047 Shark JAWS (1975) A003806 YES 004182, 004183
TM-008,029 Space Race (1973) A000803 NO
TM-046 Steeplechase/Astroturf (1975) A003750 YES 003774 ROM Bugle (C8), 003773-01 "A" Horse (C4), 003773-02 "B" Horse (D4)
@@ -65,7 +64,6 @@
7406 Hex Inverter Buffers/Drivers with O.C. H.V. Outputs (note: Might not be needed, could just clone from 7404)
7414 Hex Schmitt-Trigger Inverters
7417 Hex Buffers/Drivers
- 74164 8-bit Serial-In, Parallel-Out Shift Register
9301 1-of-10 Decoder
LM339 Quad Comparator
@@ -202,10 +200,14 @@ class gtrak10_state : public driver_device
public:
gtrak10_state(const machine_config &mconfig, device_type type, const char *tag)
: driver_device(mconfig, type, tag)
+ , m_video(*this, "fixfreq")
{
}
void gtrak10(machine_config &config);
+
+private:
+ required_device<fixedfreq_device> m_video;
};
static NETLIST_START(atarikee)
@@ -324,27 +326,29 @@ uint32_t stuntcyc_state::screen_update_stuntcyc(screen_device &screen, bitmap_rg
return 0;
}
-MACHINE_CONFIG_START(atarikee_state::atarikee)
+void atarikee_state::atarikee(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", NETLIST_CPU, NETLIST_CLOCK)
- MCFG_NETLIST_SETUP(atarikee)
+ NETLIST_CPU(config, m_maincpu, NETLIST_CLOCK);
+ m_maincpu->set_constructor(netlist_atarikee);
/* video hardware */
- MCFG_FIXFREQ_ADD("fixfreq", "screen")
- MCFG_FIXFREQ_MONITOR_CLOCK(MASTER_CLOCK)
- MCFG_FIXFREQ_HORZ_PARAMS(H_TOTAL-67,H_TOTAL-40,H_TOTAL-8,H_TOTAL)
- MCFG_FIXFREQ_VERT_PARAMS(V_TOTAL-22,V_TOTAL-19,V_TOTAL-12,V_TOTAL)
- MCFG_FIXFREQ_FIELDCOUNT(1)
- MCFG_FIXFREQ_SYNC_THRESHOLD(0.30)
-MACHINE_CONFIG_END
+ SCREEN(config, "screen", SCREEN_TYPE_RASTER);
+ FIXFREQ(config, m_video).set_screen("screen");
+ m_video->set_monitor_clock(MASTER_CLOCK);
+ m_video->set_horz_params(H_TOTAL-67,H_TOTAL-40,H_TOTAL-8,H_TOTAL);
+ m_video->set_vert_params(V_TOTAL-22,V_TOTAL-19,V_TOTAL-12,V_TOTAL);
+ m_video->set_fieldcount(1);
+ m_video->set_threshold(0.30);
+}
//#define STUNTCYC_NL_CLOCK (14318181*69)
#define STUNTCYC_NL_CLOCK (SC_HTOTAL*SC_VTOTAL*60*140)
MACHINE_CONFIG_START(stuntcyc_state::stuntcyc)
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", NETLIST_CPU, STUNTCYC_NL_CLOCK)
- MCFG_NETLIST_SETUP(stuntcyc)
+ NETLIST_CPU(config, m_maincpu, STUNTCYC_NL_CLOCK);
+ m_maincpu->set_constructor(netlist_stuntcyc);
//MCFG_NETLIST_ANALOG_OUTPUT("maincpu", "vid0", "VIDEO_OUT", fixedfreq_device, update_vid, "fixfreq")
MCFG_NETLIST_LOGIC_OUTPUT("maincpu", "probe_bit0", "probe_bit0", stuntcyc_state, probe_bit0_cb, "")
@@ -357,23 +361,22 @@ MACHINE_CONFIG_START(stuntcyc_state::stuntcyc)
MCFG_NETLIST_LOGIC_OUTPUT("maincpu", "probe_clock", "probe_clock", stuntcyc_state, probe_clock_cb, "")
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_UPDATE_DRIVER(stuntcyc_state, screen_update_stuntcyc)
- MCFG_SCREEN_RAW_PARAMS(SC_HTOTAL*SC_VTOTAL*60, SC_HTOTAL, 0, SC_HTOTAL, SC_VTOTAL, 0, SC_VTOTAL)
- //MCFG_FIXFREQ_ADD("fixfreq", "screen")
- //MCFG_FIXFREQ_MONITOR_CLOCK(SC_VIDCLOCK)
- //MCFG_FIXFREQ_HORZ_PARAMS(SC_HTOTAL-67,SC_HTOTAL-40,SC_HTOTAL-8, SC_HTOTAL)
- //MCFG_FIXFREQ_VERT_PARAMS(SC_VTOTAL-22,SC_VTOTAL-19,SC_VTOTAL-12,SC_VTOTAL)
- //MCFG_FIXFREQ_FIELDCOUNT(1)
- //MCFG_FIXFREQ_SYNC_THRESHOLD(0.30)
+ SCREEN(config, m_probe_screen, SCREEN_TYPE_RASTER);
+ m_probe_screen->set_screen_update(FUNC(stuntcyc_state::screen_update_stuntcyc));
+ m_probe_screen->set_raw(SC_HTOTAL*SC_VTOTAL*60, SC_HTOTAL, 0, SC_HTOTAL, SC_VTOTAL, 0, SC_VTOTAL);
+ //FIXFREQ(config, m_video).set_screen("screen");
+ //m_video->set_monitor_clock(SC_VIDCLOCK);
+ //m_video->set_horz_params(SC_HTOTAL-67,SC_HTOTAL-40,SC_HTOTAL-8, SC_HTOTAL);
+ //m_video->set_vert_params(SC_VTOTAL-22,SC_VTOTAL-19,SC_VTOTAL-12,SC_VTOTAL);
+ //m_video->set_fieldcount(1);
+ //m_video->set_threshold(0.30);
MACHINE_CONFIG_END
MACHINE_CONFIG_START(gtrak10_state::gtrak10)
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", NETLIST_CPU, NETLIST_CLOCK)
- MCFG_NETLIST_SETUP(gtrak10)
+ NETLIST_CPU(config, "maincpu", NETLIST_CLOCK).set_constructor(netlist_gtrak10);
- MCFG_NETLIST_ANALOG_OUTPUT("maincpu", "vid0", "VIDEO_OUT", fixedfreq_device, update_vid, "fixfreq")
+ MCFG_NETLIST_ANALOG_OUTPUT("maincpu", "vid0", "VIDEO_OUT", fixedfreq_device, update_composite_monochrome, "fixfreq")
/* video hardware */
@@ -396,15 +399,16 @@ MACHINE_CONFIG_START(gtrak10_state::gtrak10)
Vert Back Porch = 0
*/
- MCFG_FIXFREQ_ADD("fixfreq", "screen")
- MCFG_FIXFREQ_MONITOR_CLOCK(GTRAK10_VIDCLOCK)
+ SCREEN(config, "screen", SCREEN_TYPE_RASTER);
+ FIXFREQ(config, m_video).set_screen("screen");
+ m_video->set_monitor_clock(GTRAK10_VIDCLOCK);
// Length of active video, end of front-porch, end of sync signal, end of line/frame
- MCFG_FIXFREQ_HORZ_PARAMS(GTRAK10_HTOTAL*1 - 32, GTRAK10_HTOTAL*1 - 32, GTRAK10_HTOTAL*1 - 31, GTRAK10_HTOTAL*1)
- //MCFG_FIXFREQ_HORZ_PARAMS(GTRAK10_HTOTAL - 32, GTRAK10_HTOTAL - 32, GTRAK10_HTOTAL - 31, GTRAK10_HTOTAL)
- MCFG_FIXFREQ_VERT_PARAMS( GTRAK10_VTOTAL - 8, GTRAK10_VTOTAL - 8, GTRAK10_VTOTAL, GTRAK10_VTOTAL)
- MCFG_FIXFREQ_FIELDCOUNT(2)
- MCFG_FIXFREQ_SYNC_THRESHOLD(1.0)
- //MCFG_FIXFREQ_GAIN(1.50)
+ m_video->set_horz_params(GTRAK10_HTOTAL*1 - 32, GTRAK10_HTOTAL*1 - 32, GTRAK10_HTOTAL*1 - 31, GTRAK10_HTOTAL*1);
+ //m_video->set_horz_params(GTRAK10_HTOTAL - 32, GTRAK10_HTOTAL - 32, GTRAK10_HTOTAL - 31, GTRAK10_HTOTAL);
+ m_video->set_vert_params( GTRAK10_VTOTAL - 8, GTRAK10_VTOTAL - 8, GTRAK10_VTOTAL, GTRAK10_VTOTAL);
+ m_video->set_fieldcount(2);
+ m_video->set_threshold(1.0);
+ //m_video->set_gain(1.50);
MACHINE_CONFIG_END
@@ -679,10 +683,6 @@ ROM_START( quadpong )
ROM_REGION( 0x10000, "maincpu", ROMREGION_ERASE00 )
ROM_END
-ROM_START( rebound )
- ROM_REGION( 0x10000, "maincpu", ROMREGION_ERASE00 )
-ROM_END
-
ROM_START( spacrace )
ROM_REGION( 0x10000, "maincpu", ROMREGION_ERASE00 )
ROM_END
@@ -738,7 +738,6 @@ GAME(1975, tankii, 0, atarikee, 0, atarikee_state, empty_init,
//GAME(1974, pinpong, 0, atarikee, 0, atarikee_state, empty_init, ROT0, "Atari", "Pin Pong [TTL]", MACHINE_IS_SKELETON)
//GAME(1975, pursuit, 0, atarikee, 0, atarikee_state, empty_init, ROT0, "Atari", "Pursuit [TTL]", MACHINE_IS_SKELETON)
//GAME(1974, quadpong, eliminat, atarikee, 0, atarikee_state, empty_init, ROT0, "Atari", "Quadrapong [TTL]", MACHINE_IS_SKELETON)
-//GAME(1974, rebound, 0, atarikee, 0, atarikee_state, empty_init, ROT0, "Atari/Kee", "Rebound/Spike/Volleyball [TTL]", MACHINE_IS_SKELETON)
//GAME(1973, spacrace, 0, atarikee, 0, atarikee_state, empty_init, ROT0, "Atari", "Space Race [TTL]", MACHINE_IS_SKELETON)
//GAME(1974, touchme, 0, atarikee, 0, atarikee_state, empty_init, ROT0, "Atari", "Touch-Me [TTL]", MACHINE_IS_SKELETON) //?
//GAME(1974, worldcup, 0, atarikee, 0, atarikee_state, empty_init, ROT0, "Atari", "World Cup/World Cup Football [TTL]", MACHINE_IS_SKELETON)
diff --git a/src/mame/drivers/atetris.cpp b/src/mame/drivers/atetris.cpp
index 1f87ca5c03a..1b9d58ee07d 100644
--- a/src/mame/drivers/atetris.cpp
+++ b/src/mame/drivers/atetris.cpp
@@ -195,9 +195,9 @@ void atetris_state::atetrisb2_map(address_map &map)
map(0x1000, 0x1fff).ram().w(FUNC(atetris_state::videoram_w)).share("videoram");
map(0x2000, 0x20ff).ram().w("palette", FUNC(palette_device::write8)).share("palette");
map(0x2400, 0x25ff).rw("eeprom", FUNC(eeprom_parallel_28xx_device::read), FUNC(eeprom_parallel_28xx_device::write));
- map(0x2802, 0x2802).w("sn1", FUNC(sn76496_device::command_w));
- map(0x2804, 0x2804).w("sn2", FUNC(sn76496_device::command_w));
- map(0x2806, 0x2806).w("sn3", FUNC(sn76496_device::command_w));
+ map(0x2802, 0x2802).w("sn1", FUNC(sn76496_device::write));
+ map(0x2804, 0x2804).w("sn2", FUNC(sn76496_device::write));
+ map(0x2806, 0x2806).w("sn3", FUNC(sn76496_device::write));
map(0x2808, 0x2808).portr("IN0");
map(0x2808, 0x280f).nopw();
map(0x2818, 0x2818).portr("IN1");
diff --git a/src/mame/drivers/atlantis.cpp b/src/mame/drivers/atlantis.cpp
index 0ad435ef004..87d344b0d0d 100644
--- a/src/mame/drivers/atlantis.cpp
+++ b/src/mame/drivers/atlantis.cpp
@@ -333,7 +333,7 @@ WRITE32_MEMBER(atlantis_state::board_ctrl_w)
m_cmos_write_enabled = true;
break;
case WDOG:
- m_rtc->watchdog_write(space, offset, data);
+ m_rtc->watchdog_write();
break;
default:
if (LOG_IRQ)
@@ -345,7 +345,7 @@ WRITE32_MEMBER(atlantis_state::board_ctrl_w)
READ8_MEMBER(atlantis_state::cmos_r)
{
- uint8_t result = m_rtc->read(space, offset);
+ uint8_t result = m_rtc->read(offset);
// Initial RTC check expects reads to the RTC to take some time
if (offset == 0x7ff9)
m_maincpu->eat_cycles(30);
@@ -367,7 +367,7 @@ WRITE8_MEMBER(atlantis_state::cmos_w)
m_serial_count = 0;
}
else if (m_cmos_write_enabled) {
- m_rtc->write(space, offset, data);
+ m_rtc->write(offset, data);
m_cmos_write_enabled = false;
if (LOG_RTC || offset >= 0x7ff0)
logerror("%s:RTC write to offset %04X = %08X & %08X\n", machine().describe_context(), offset, data, mem_mask);
diff --git a/src/mame/drivers/atm.cpp b/src/mame/drivers/atm.cpp
index ee761f51e36..99c9ffe7a0f 100644
--- a/src/mame/drivers/atm.cpp
+++ b/src/mame/drivers/atm.cpp
@@ -187,25 +187,28 @@ static GFXDECODE_START( gfx_atmtb2 )
GFXDECODE_END
-MACHINE_CONFIG_START(atm_state::atm)
+void atm_state::atm(machine_config &config)
+{
spectrum_128(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(atm_mem)
- MCFG_DEVICE_IO_MAP(atm_io)
- MCFG_DEVICE_OPCODES_MAP(atm_switch)
+
+ m_maincpu->set_addrmap(AS_PROGRAM, &atm_state::atm_mem);
+ m_maincpu->set_addrmap(AS_IO, &atm_state::atm_io);
+ m_maincpu->set_addrmap(AS_OPCODES, &atm_state::atm_switch);
+
MCFG_MACHINE_RESET_OVERRIDE(atm_state, atm )
BETA_DISK(config, m_beta, 0);
- MCFG_GFXDECODE_MODIFY("gfxdecode", gfx_atm)
+ subdevice<gfxdecode_device>("gfxdecode")->set_info(gfx_atm);
- MCFG_DEVICE_REMOVE("exp")
-MACHINE_CONFIG_END
+ config.device_remove("exp");
+}
-MACHINE_CONFIG_START(atm_state::atmtb2)
+void atm_state::atmtb2(machine_config &config)
+{
atm(config);
- MCFG_GFXDECODE_MODIFY("gfxdecode", gfx_atmtb2)
-MACHINE_CONFIG_END
+ subdevice<gfxdecode_device>("gfxdecode")->set_info(gfx_atmtb2);
+}
/***************************************************************************
diff --git a/src/mame/drivers/atom.cpp b/src/mame/drivers/atom.cpp
index 7e3588e92d3..5a46cf62aaa 100644
--- a/src/mame/drivers/atom.cpp
+++ b/src/mame/drivers/atom.cpp
@@ -220,7 +220,7 @@ WRITE8_MEMBER( atomeb_state::eprom_w )
READ8_MEMBER( atomeb_state::ext_r )
{
if (m_ext[m_eprom & 0x0f]->exists())
- return m_ext[m_eprom & 0x0f]->read_rom(space, offset);
+ return m_ext[m_eprom & 0x0f]->read_rom(offset);
else
return 0xff;
}
@@ -232,9 +232,9 @@ READ8_MEMBER( atomeb_state::ext_r )
READ8_MEMBER( atomeb_state::dos_r )
{
if (m_e0->exists() && !BIT(m_eprom, 7))
- return m_e0->read_rom(space, offset);
+ return m_e0->read_rom(offset);
else if (m_e1->exists() && BIT(m_eprom, 7))
- return m_e1->read_rom(space, offset);
+ return m_e1->read_rom(offset);
else
return 0xff;
}
@@ -663,7 +663,7 @@ void atom_state::machine_start()
m_baseram[0x0b] = machine().rand() & 0x0ff;
if (m_cart.found() && m_cart->exists())
- m_maincpu->space(AS_PROGRAM).install_read_handler(0xa000, 0xafff, read8_delegate(FUNC(generic_slot_device::read_rom), &*m_cart));
+ m_maincpu->space(AS_PROGRAM).install_read_handler(0xa000, 0xafff, read8sm_delegate(FUNC(generic_slot_device::read_rom), &*m_cart));
}
/*-------------------------------------------------
@@ -710,22 +710,22 @@ FLOPPY_FORMATS_END0
MACHINE_CONFIG_START(atom_state::atom)
/* basic machine hardware */
- MCFG_DEVICE_ADD(SY6502_TAG, M6502, X2/4)
- MCFG_DEVICE_PROGRAM_MAP(atom_mem)
+ M6502(config, m_maincpu, X2/4);
+ m_maincpu->set_addrmap(AS_PROGRAM, &atom_state::atom_mem);
/* video hardware */
- MCFG_SCREEN_MC6847_PAL_ADD(SCREEN_TAG, MC6847_TAG)
+ SCREEN(config, SCREEN_TAG, SCREEN_TYPE_RASTER);
- MCFG_DEVICE_ADD(MC6847_TAG, MC6847_PAL, XTAL(4'433'619))
- MCFG_MC6847_INPUT_CALLBACK(READ8(*this, atom_state, vdg_videoram_r))
+ MC6847_PAL(config, m_vdg, XTAL(4'433'619));
+ m_vdg->input_callback().set(FUNC(atom_state::vdg_videoram_r));
+ m_vdg->set_screen(SCREEN_TAG);
/* sound hardware */
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("speaker", SPEAKER_SOUND)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.00)
+ SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 1.00);
/* devices */
- MCFG_TIMER_DRIVER_ADD_PERIODIC("hz2400", atom_state, cassette_output_tick, attotime::from_hz(4806))
+ TIMER(config, "hz2400").configure_periodic(FUNC(atom_state::cassette_output_tick), attotime::from_hz(4806));
via6522_device &via(VIA6522(config, R6522_TAG, X2/4));
via.writepa_handler().set("cent_data_out", FUNC(output_latch_device::bus_w));
@@ -741,23 +741,22 @@ MACHINE_CONFIG_START(atom_state::atom)
I8271(config, m_fdc, 0);
m_fdc->intrq_wr_callback().set(FUNC(atom_state::atom_8271_interrupt_callback));
m_fdc->hdl_wr_callback().set(FUNC(atom_state::motor_w));
- MCFG_FLOPPY_DRIVE_ADD(I8271_TAG ":0", atom_floppies, "525sssd", atom_state::floppy_formats)
- MCFG_FLOPPY_DRIVE_SOUND(true)
- MCFG_FLOPPY_DRIVE_ADD(I8271_TAG ":1", atom_floppies, "525sssd", atom_state::floppy_formats)
- MCFG_FLOPPY_DRIVE_SOUND(true)
+ FLOPPY_CONNECTOR(config, I8271_TAG ":0", atom_floppies, "525sssd", atom_state::floppy_formats).enable_sound(true);
+ FLOPPY_CONNECTOR(config, I8271_TAG ":1", atom_floppies, "525sssd", atom_state::floppy_formats).enable_sound(true);
- MCFG_DEVICE_ADD(m_centronics, CENTRONICS, centronics_devices, "printer")
- MCFG_CENTRONICS_ACK_HANDLER(WRITELINE(R6522_TAG, via6522_device, write_ca1))
- MCFG_CENTRONICS_BUSY_HANDLER(WRITELINE(R6522_TAG, via6522_device, write_pa7))
+ CENTRONICS(config, m_centronics, centronics_devices, "printer");
+ m_centronics->ack_handler().set(R6522_TAG, FUNC(via6522_device::write_ca1));
+ m_centronics->busy_handler().set(R6522_TAG, FUNC(via6522_device::write_pa7));
- MCFG_CENTRONICS_OUTPUT_LATCH_ADD("cent_data_out", CENTRONICS_TAG)
+ output_latch_device &cent_data_out(OUTPUT_LATCH(config, "cent_data_out"));
+ m_centronics->set_output_latch(cent_data_out);
- MCFG_CASSETTE_ADD("cassette")
- MCFG_CASSETTE_FORMATS(atom_cassette_formats)
- MCFG_CASSETTE_DEFAULT_STATE(CASSETTE_STOPPED | CASSETTE_MOTOR_ENABLED | CASSETTE_SPEAKER_MUTED)
- MCFG_CASSETTE_INTERFACE("atom_cass")
+ CASSETTE(config, m_cassette);
+ m_cassette->set_formats(atom_cassette_formats);
+ m_cassette->set_default_state(CASSETTE_STOPPED | CASSETTE_MOTOR_ENABLED | CASSETTE_SPEAKER_MUTED);
+ m_cassette->set_interface("atom_cass");
- MCFG_QUICKLOAD_ADD("quickload", atom_state, atom_atm, "atm", 0)
+ MCFG_QUICKLOAD_ADD("quickload", atom_state, atom_atm, "atm")
/* utility rom slot */
MCFG_GENERIC_CARTSLOT_ADD("cartslot", generic_linear_slot, "atom_cart")
@@ -768,9 +767,9 @@ MACHINE_CONFIG_START(atom_state::atom)
RAM(config, RAM_TAG).set_default_size("32K").set_extra_options("2K,4K,6K,8K,10K,12K").set_default_value(0x00);
/* Software lists */
- MCFG_SOFTWARE_LIST_ADD("rom_list","atom_rom")
- MCFG_SOFTWARE_LIST_ADD("cass_list","atom_cass")
- MCFG_SOFTWARE_LIST_ADD("flop_list","atom_flop")
+ SOFTWARE_LIST(config, "rom_list").set_original("atom_rom");
+ SOFTWARE_LIST(config, "cass_list").set_original("atom_cass");
+ SOFTWARE_LIST(config, "flop_list").set_original("atom_flop");
MACHINE_CONFIG_END
/*-------------------------------------------------
@@ -784,11 +783,10 @@ MACHINE_CONFIG_END
MACHINE_CONFIG_START(atomeb_state::atomeb)
atom(config);
- MCFG_DEVICE_MODIFY(SY6502_TAG)
- MCFG_DEVICE_PROGRAM_MAP(atomeb_mem)
+ m_maincpu->set_addrmap(AS_PROGRAM, &atomeb_state::atomeb_mem);
/* cartridges */
- MCFG_DEVICE_REMOVE("cartslot")
+ config.device_remove("cartslot");
MCFG_ATOM_ROM_ADD("rom_a0", ext_load<0x0>)
MCFG_ATOM_ROM_ADD("rom_a1", ext_load<0x1>)
@@ -815,24 +813,25 @@ MACHINE_CONFIG_END
MACHINE_DRIVER( atombb )
-------------------------------------------------*/
-MACHINE_CONFIG_START(atom_state::atombb)
+void atom_state::atombb(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD(SY6502_TAG, M6502, X2/4)
- MCFG_DEVICE_PROGRAM_MAP(atombb_mem)
+ M6502(config, m_maincpu, X2/4);
+ m_maincpu->set_addrmap(AS_PROGRAM, &atom_state::atombb_mem);
/* video hardware */
- MCFG_SCREEN_MC6847_PAL_ADD(SCREEN_TAG, MC6847_TAG)
+ SCREEN(config, SCREEN_TAG, SCREEN_TYPE_RASTER);
- MCFG_DEVICE_ADD(MC6847_TAG, MC6847_PAL, XTAL(4'433'619))
- MCFG_MC6847_INPUT_CALLBACK(READ8(*this, atom_state, vdg_videoram_r))
+ MC6847_PAL(config, m_vdg, XTAL(4'433'619));
+ m_vdg->input_callback().set(FUNC(atom_state::vdg_videoram_r));
+ m_vdg->set_screen(SCREEN_TAG);
/* sound hardware */
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("speaker", SPEAKER_SOUND)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.00)
+ SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 1.00);
/* devices */
- MCFG_TIMER_DRIVER_ADD_PERIODIC("hz2400", atom_state, cassette_output_tick, attotime::from_hz(4806))
+ TIMER(config, "hz2400").configure_periodic(FUNC(atom_state::cassette_output_tick), attotime::from_hz(4806));
via6522_device &via(VIA6522(config, R6522_TAG, X2/4));
via.writepa_handler().set("cent_data_out", FUNC(output_latch_device::bus_w));
@@ -845,73 +844,73 @@ MACHINE_CONFIG_START(atom_state::atombb)
ppi.in_pc_callback().set(FUNC(atom_state::ppi_pc_r));
ppi.out_pc_callback().set(FUNC(atom_state::ppi_pc_w));
- MCFG_DEVICE_ADD(m_centronics, CENTRONICS, centronics_devices, "printer")
- MCFG_CENTRONICS_ACK_HANDLER(WRITELINE(R6522_TAG, via6522_device, write_ca1))
- MCFG_CENTRONICS_BUSY_HANDLER(WRITELINE(R6522_TAG, via6522_device, write_pa7))
+ CENTRONICS(config, m_centronics, centronics_devices, "printer");
+ m_centronics->ack_handler().set(R6522_TAG, FUNC(via6522_device::write_ca1));
+ m_centronics->busy_handler().set(R6522_TAG, FUNC(via6522_device::write_pa7));
- MCFG_CENTRONICS_OUTPUT_LATCH_ADD("cent_data_out", CENTRONICS_TAG)
+ output_latch_device &cent_data_out(OUTPUT_LATCH(config, "cent_data_out"));
+ m_centronics->set_output_latch(cent_data_out);
- MCFG_CASSETTE_ADD("cassette")
- MCFG_CASSETTE_FORMATS(atom_cassette_formats)
- MCFG_CASSETTE_DEFAULT_STATE(CASSETTE_STOPPED | CASSETTE_MOTOR_ENABLED | CASSETTE_SPEAKER_MUTED)
- MCFG_CASSETTE_INTERFACE("atom_cass")
+ CASSETTE(config, m_cassette);
+ m_cassette->set_formats(atom_cassette_formats);
+ m_cassette->set_default_state(CASSETTE_STOPPED | CASSETTE_MOTOR_ENABLED | CASSETTE_SPEAKER_MUTED);
+ m_cassette->set_interface("atom_cass");
/* internal ram */
RAM(config, RAM_TAG).set_default_size("16K").set_extra_options("8K,12K");
-MACHINE_CONFIG_END
+}
/*-------------------------------------------------
MACHINE_DRIVER( prophet2 )
-------------------------------------------------*/
-//static MACHINE_CONFIG_START( prophet2 )
+//void atom_state::prophet2(machine_config &config)
+//{
// atom(config);
// /* basic machine hardware */
-// MCFG_DEVICE_MODIFY(SY6502_TAG)
-// MCFG_DEVICE_PROGRAM_MAP(prophet_mem)
+// m_maincpu->set_addrmap(AS_PROGRAM, &atom_state::prophet_mem);
//
// /* fdc */
-// MCFG_DEVICE_REMOVE(I8271_TAG)
-// MCFG_DEVICE_REMOVE(I8271_TAG ":0")
-// MCFG_DEVICE_REMOVE(I8271_TAG ":1")
+// config.device_remove(I8271_TAG);
+// config.device_remove(I8271_TAG ":0");
+// config.device_remove(I8271_TAG ":1");
//
// /* internal ram */
-// MCFG_RAM_MODIFY(RAM_TAG)
-// MCFG_RAM_DEFAULT_SIZE("32K")
+// subdevice<ram_device>(RAM_TAG)->set_default_size("32K");
// /* Software lists */
-// MCFG_SOFTWARE_LIST_REMOVE("rom_list")
-// MCFG_SOFTWARE_LIST_REMOVE("flop_list")
-//MACHINE_CONFIG_END
+// config.device_remove("rom_list");
+// config.device_remove("flop_list");
+//}
/*-------------------------------------------------
MACHINE_DRIVER( prophet3 )
-------------------------------------------------*/
-//static MACHINE_CONFIG_START( prophet3 )
+//void atom_state::prophet3(machine_config &config)
+//{
// atom(config);
// /* basic machine hardware */
-// MCFG_DEVICE_MODIFY(SY6502_TAG)
-// MCFG_DEVICE_PROGRAM_MAP(prophet_mem)
+// m_maincpu->set_addrmap(AS_PROGRAM, &atom_state::prophet_mem);
//
// /* internal ram */
-// MCFG_RAM_MODIFY(RAM_TAG)
-// MCFG_RAM_DEFAULT_SIZE("32K")
+// subdevice<ram_device>(RAM_TAG)->set_default_size("32K");
// /* Software lists */
-// MCFG_SOFTWARE_LIST_REMOVE("rom_list")
-//MACHINE_CONFIG_END
+// config.device_remove("rom_list");
+//}
/*-------------------------------------------------
MACHINE_DRIVER( atommc )
-------------------------------------------------*/
-//static MACHINE_CONFIG_START( atommc )
+//void atom_state::atommc(machine_config &config)
+//{
// atom(config);
// /* Software lists */
-// MCFG_SOFTWARE_LIST_ADD("mmc_list","atom_mmc")
-// MCFG_SOFTWARE_LIST_REMOVE("flop_list")
-//MACHINE_CONFIG_END
+// SOFTWARE_LIST(config, "mmc_list").set_original("atom_mmc");
+// config.device_remove("flop_list");
+//}
/***************************************************************************
ROMS
diff --git a/src/mame/drivers/atronic.cpp b/src/mame/drivers/atronic.cpp
index f198a5e0e23..76f28412ad7 100644
--- a/src/mame/drivers/atronic.cpp
+++ b/src/mame/drivers/atronic.cpp
@@ -65,24 +65,24 @@ static INPUT_PORTS_START( atronic )
INPUT_PORTS_END
-MACHINE_CONFIG_START(atronic_state::atronic)
+void atronic_state::atronic(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z180, 6000000)
- MCFG_DEVICE_PROGRAM_MAP(atronic_map)
- MCFG_DEVICE_IO_MAP(atronic_portmap)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", atronic_state, irq0_line_hold)
-
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500))
- MCFG_SCREEN_UPDATE_DRIVER(atronic_state, screen_update)
- MCFG_SCREEN_SIZE(32*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 0*8, 32*8-1)
- MCFG_SCREEN_PALETTE("palette")
-
- MCFG_PALETTE_ADD("palette", 8)
-
-MACHINE_CONFIG_END
+ Z180(config, m_maincpu, 6000000);
+ m_maincpu->set_addrmap(AS_PROGRAM, &atronic_state::atronic_map);
+ m_maincpu->set_addrmap(AS_IO, &atronic_state::atronic_portmap);
+ m_maincpu->set_vblank_int("screen", FUNC(atronic_state::irq0_line_hold));
+
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500));
+ screen.set_screen_update(FUNC(atronic_state::screen_update));
+ screen.set_size(32*8, 32*8);
+ screen.set_visarea_full();
+ screen.set_palette("palette");
+
+ PALETTE(config, "palette").set_entries(8);
+}
ROM_START( atronic )
diff --git a/src/mame/drivers/att4425.cpp b/src/mame/drivers/att4425.cpp
index 358703a5c43..66ddf53740e 100644
--- a/src/mame/drivers/att4425.cpp
+++ b/src/mame/drivers/att4425.cpp
@@ -237,7 +237,8 @@ static const z80_daisy_config att4425_daisy_chain[] =
{ nullptr }
};
-MACHINE_CONFIG_START(att4425_state::att4425)
+void att4425_state::att4425(machine_config &config)
+{
/* basic machine hardware */
Z80(config, m_maincpu, XTAL(32'000'000)/8); // XXX
m_maincpu->set_addrmap(AS_PROGRAM, &att4425_state::att4425_mem);
@@ -245,14 +246,14 @@ MACHINE_CONFIG_START(att4425_state::att4425)
m_maincpu->set_daisy_config(att4425_daisy_chain);
/* video hardware */
- MCFG_SCREEN_ADD_MONOCHROME("screen", RASTER, rgb_t::green())
- MCFG_SCREEN_REFRESH_RATE(50)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */
- MCFG_SCREEN_UPDATE_DRIVER(att4425_state, screen_update)
- MCFG_SCREEN_PALETTE("palette")
- MCFG_SCREEN_SIZE(720, 351)
- MCFG_SCREEN_VISIBLE_AREA(0, 720-1, 0, 351-1)
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_att4425)
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER, rgb_t::green());
+ m_screen->set_refresh_hz(50);
+ m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */
+ m_screen->set_screen_update(FUNC(att4425_state::screen_update));
+ m_screen->set_palette("palette");
+ m_screen->set_size(720, 351);
+ m_screen->set_visarea(0, 720-1, 0, 351-1);
+ GFXDECODE(config, "gfxdecode", "palette", gfx_att4425);
PALETTE(config, "palette", palette_device::MONOCHROME_HIGHLIGHT);
// ch.3 -- timer?
@@ -282,8 +283,8 @@ MACHINE_CONFIG_START(att4425_state::att4425)
rs232b.rxd_handler().set(m_sio, FUNC(z80sio_device::rxb_w));
// XXX
- MCFG_DEVICE_ADD("line_clock", CLOCK, 9600*64)
- MCFG_CLOCK_SIGNAL_HANDLER(WRITELINE(*this, att4425_state, write_line_clock))
+ clock_device &line_clock(CLOCK(config, "line_clock", 9600*64));
+ line_clock.signal_handler().set(FUNC(att4425_state::write_line_clock));
I8251(config, m_i8251, 0);
m_i8251->txd_handler().set("rs232", FUNC(rs232_port_device::write_txd));
@@ -296,11 +297,11 @@ MACHINE_CONFIG_START(att4425_state::att4425)
rs232.dsr_handler().set(m_i8251, FUNC(i8251_device::write_dsr));
// XXX
- MCFG_DEVICE_ADD("keyboard_clock", CLOCK, 4800*64)
- MCFG_CLOCK_SIGNAL_HANDLER(WRITELINE(*this, att4425_state, write_keyboard_clock))
+ clock_device &keyboard_clock(CLOCK(config, "keyboard_clock", 4800*64));
+ keyboard_clock.signal_handler().set(FUNC(att4425_state::write_keyboard_clock));
RAM(config, RAM_TAG).set_default_size("32K").set_default_value(0);
-MACHINE_CONFIG_END
+}
/* ROMs */
diff --git a/src/mame/drivers/att630.cpp b/src/mame/drivers/att630.cpp
index 2aff41ae86e..c45953b84ec 100644
--- a/src/mame/drivers/att630.cpp
+++ b/src/mame/drivers/att630.cpp
@@ -48,18 +48,20 @@ void att630_state::mem_map(address_map &map)
static INPUT_PORTS_START( att630 )
INPUT_PORTS_END
-MACHINE_CONFIG_START(att630_state::att630)
- MCFG_DEVICE_ADD("maincpu", M68000, XTAL(40'000'000) / 4) // clock not confirmed
- MCFG_DEVICE_PROGRAM_MAP(mem_map)
+void att630_state::att630(machine_config &config)
+{
+ M68000(config, m_maincpu, 40_MHz_XTAL / 4); // clock not confirmed
+ m_maincpu->set_addrmap(AS_PROGRAM, &att630_state::mem_map);
+ // TODO: interrupt vector callback
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_RAW_PARAMS(XTAL(87'183'360), 1376, 0, 1024, 1056, 0, 1024)
- MCFG_SCREEN_UPDATE_DRIVER(att630_state, screen_update)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_raw(87.18336_MHz_XTAL, 1376, 0, 1024, 1056, 0, 1024);
+ screen.set_screen_update(FUNC(att630_state::screen_update));
- MCFG_DEVICE_ADD("duart1", SCN2681, XTAL(3'686'400))
+ SCN2681(config, "duart1", 3.6864_MHz_XTAL);
- MCFG_DEVICE_ADD("duart2", SCN2681, XTAL(3'686'400))
-MACHINE_CONFIG_END
+ SCN2681(config, "duart2", 3.6864_MHz_XTAL);
+}
/**************************************************************************************************************
diff --git a/src/mame/drivers/attache.cpp b/src/mame/drivers/attache.cpp
index 027b4f252a9..71349b6ee7f 100644
--- a/src/mame/drivers/attache.cpp
+++ b/src/mame/drivers/attache.cpp
@@ -506,7 +506,7 @@ READ8_MEMBER(attache_state::pio_portA_r)
switch(m_pio_select)
{
case PIO_SEL_8910_DATA:
- ret = m_psg->data_r(space,0);
+ ret = m_psg->data_r();
logerror("PSG: data read %02x\n",ret);
break;
case PIO_SEL_5832_WRITE:
@@ -560,10 +560,10 @@ void attache_state::operation_strobe(address_space& space, uint8_t data)
switch(m_pio_select)
{
case PIO_SEL_8910_ADDR:
- m_psg->address_w(space,0,data);
+ m_psg->address_w(data);
break;
case PIO_SEL_8910_DATA:
- m_psg->data_w(space,0,data);
+ m_psg->data_w(data);
break;
case PIO_SEL_5832_WRITE:
m_rtc->cs_w(1);
@@ -771,12 +771,12 @@ WRITE8_MEMBER(attache_state::memmap_w)
READ8_MEMBER(attache_state::dma_mask_r)
{
- return m_dma->read(space,0x0f);
+ return m_dma->read(0x0f);
}
WRITE8_MEMBER(attache_state::dma_mask_w)
{
- m_dma->write(space,0x0f,data);
+ m_dma->write(0x0f,data);
}
READ8_MEMBER(attache_state::fdc_dma_r)
@@ -1121,17 +1121,18 @@ void attache816_state::machine_reset()
attache_state::machine_reset();
}
-MACHINE_CONFIG_START(attache_state::attache)
+void attache_state::attache(machine_config &config)
+{
Z80(config, m_maincpu, 8_MHz_XTAL / 2);
m_maincpu->set_addrmap(AS_PROGRAM, &attache_state::attache_map);
m_maincpu->set_addrmap(AS_IO, &attache_state::attache_io);
m_maincpu->set_daisy_config(attache_daisy_chain);
- MCFG_QUANTUM_TIME(attotime::from_hz(60))
+ config.m_minimum_quantum = attotime::from_hz(60);
- MCFG_SCREEN_ADD_MONOCHROME("screen", RASTER, rgb_t::green())
- MCFG_SCREEN_RAW_PARAMS(12.324_MHz_XTAL, 784, 0, 640, 262, 0, 240)
- MCFG_SCREEN_UPDATE_DRIVER(attache_state, screen_update)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER, rgb_t::green()));
+ screen.set_raw(12.324_MHz_XTAL, 784, 0, 640, 262, 0, 240);
+ screen.set_screen_update(FUNC(attache_state::screen_update));
PALETTE(config, m_palette, palette_device::MONOCHROME_HIGHLIGHT);
@@ -1194,25 +1195,26 @@ MACHINE_CONFIG_START(attache_state::attache)
RAM(config, RAM_TAG).set_default_size("64K");
- MCFG_SOFTWARE_LIST_ADD("disk_list","attache")
-MACHINE_CONFIG_END
+ SOFTWARE_LIST(config, "disk_list").set_original("attache");
+}
-MACHINE_CONFIG_START(attache816_state::attache816)
+void attache816_state::attache816(machine_config &config)
+{
Z80(config, m_maincpu, 8_MHz_XTAL / 2);
m_maincpu->set_addrmap(AS_PROGRAM, &attache816_state::attache_map);
m_maincpu->set_addrmap(AS_IO, &attache816_state::attache_io);
m_maincpu->set_daisy_config(attache_daisy_chain);
- MCFG_QUANTUM_TIME(attotime::from_hz(60))
+ config.m_minimum_quantum = attotime::from_hz(60);
- MCFG_DEVICE_ADD("extcpu", I8086, 24_MHz_XTAL / 3)
- MCFG_DEVICE_PROGRAM_MAP(attache_x86_map)
- MCFG_DEVICE_IO_MAP(attache_x86_io)
- MCFG_QUANTUM_PERFECT_CPU("extcpu")
+ I8086(config, m_extcpu, 24_MHz_XTAL / 3);
+ m_extcpu->set_addrmap(AS_PROGRAM, &attache816_state::attache_x86_map);
+ m_extcpu->set_addrmap(AS_IO, &attache816_state::attache_x86_io);
+ config.m_perfect_cpu_quantum = subtag("extcpu");
- MCFG_SCREEN_ADD_MONOCHROME("screen", RASTER, rgb_t::green())
- MCFG_SCREEN_RAW_PARAMS(12.324_MHz_XTAL, 784, 0, 640, 262, 0, 240)
- MCFG_SCREEN_UPDATE_DRIVER(attache_state, screen_update)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER, rgb_t::green()));
+ screen.set_raw(12.324_MHz_XTAL, 784, 0, 640, 262, 0, 240);
+ screen.set_screen_update(FUNC(attache_state::screen_update));
PALETTE(config, m_palette, palette_device::MONOCHROME_HIGHLIGHT);
@@ -1282,8 +1284,8 @@ MACHINE_CONFIG_START(attache816_state::attache816)
RAM(config, RAM_TAG).set_default_size("64K");
- MCFG_SOFTWARE_LIST_ADD("disk_list","attache")
-MACHINE_CONFIG_END
+ SOFTWARE_LIST(config, "disk_list").set_original("attache");
+}
ROM_START( attache )
ROM_REGION(0x10000, "maincpu", 0)
diff --git a/src/mame/drivers/attckufo.cpp b/src/mame/drivers/attckufo.cpp
index b2b120b85c4..3f2e507c411 100644
--- a/src/mame/drivers/attckufo.cpp
+++ b/src/mame/drivers/attckufo.cpp
@@ -119,9 +119,10 @@ READ8_MEMBER(attckufo_state::vic_colorram_r)
// MACHINE DEFINTIONS
//**************************************************************************
-MACHINE_CONFIG_START(attckufo_state::attckufo)
- MCFG_DEVICE_ADD("maincpu", M6502, XTAL(14'318'181) / 14)
- MCFG_DEVICE_PROGRAM_MAP(cpu_map)
+void attckufo_state::attckufo(machine_config &config)
+{
+ M6502(config, m_maincpu, XTAL(14'318'181) / 14);
+ m_maincpu->set_addrmap(AS_PROGRAM, &attckufo_state::cpu_map);
pia6821_device &pia(PIA6821(config, "pia", 0));
pia.readpa_handler().set_ioport("DSW");
@@ -129,19 +130,19 @@ MACHINE_CONFIG_START(attckufo_state::attckufo)
SPEAKER(config, "mono").front_center();
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(MOS6560_VRETRACERATE)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500))
- MCFG_SCREEN_SIZE((MOS6560_XSIZE + 7) & ~7, MOS6560_YSIZE)
- MCFG_SCREEN_VISIBLE_AREA(0, 23*8 - 1, 0, 22*8 - 1)
- MCFG_SCREEN_UPDATE_DEVICE("mos6560", mos6560_device, screen_update)
-
- MCFG_DEVICE_ADD("mos6560", MOS656X_ATTACK_UFO, XTAL(14'318'181) / 14)
- MCFG_VIDEO_SET_SCREEN("screen")
- MCFG_DEVICE_ADDRESS_MAP(0, vic_videoram_map)
- MCFG_DEVICE_ADDRESS_MAP(1, vic_colorram_map)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25)
-MACHINE_CONFIG_END
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(MOS6560_VRETRACERATE);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500));
+ screen.set_size((MOS6560_XSIZE + 7) & ~7, MOS6560_YSIZE);
+ screen.set_visarea(0, 23*8 - 1, 0, 22*8 - 1);
+ screen.set_screen_update("mos6560", FUNC(mos6560_device::screen_update));
+
+ mos6560_device &mos6560(MOS656X_ATTACK_UFO(config, "mos6560", XTAL(14'318'181) / 14));
+ mos6560.set_screen("screen");
+ mos6560.set_addrmap(0, &attckufo_state::vic_videoram_map);
+ mos6560.set_addrmap(1, &attckufo_state::vic_colorram_map);
+ mos6560.add_route(ALL_OUTPUTS, "mono", 0.25);
+}
//**************************************************************************
diff --git a/src/mame/drivers/aussiebyte.cpp b/src/mame/drivers/aussiebyte.cpp
index e92a8d691a4..26e79698bd5 100644
--- a/src/mame/drivers/aussiebyte.cpp
+++ b/src/mame/drivers/aussiebyte.cpp
@@ -522,7 +522,8 @@ MACHINE_CONFIG_START(aussiebyte_state::aussiebyte)
m_centronics->set_data_input_buffer("cent_data_in");
m_centronics->busy_handler().set(FUNC(aussiebyte_state::write_centronics_busy));
INPUT_BUFFER(config, "cent_data_in");
- MCFG_CENTRONICS_OUTPUT_LATCH_ADD("cent_data_out", "centronics")
+ output_latch_device &cent_data_out(OUTPUT_LATCH(config, "cent_data_out"));
+ m_centronics->set_output_latch(cent_data_out);
Z80CTC(config, m_ctc, 16_MHz_XTAL / 4);
m_ctc->intr_callback().set_inputline(m_maincpu, INPUT_LINE_IRQ0);
@@ -575,10 +576,8 @@ MACHINE_CONFIG_START(aussiebyte_state::aussiebyte)
WD2797(config, m_fdc, 16_MHz_XTAL / 16);
m_fdc->intrq_wr_callback().set(FUNC(aussiebyte_state::fdc_intrq_w));
m_fdc->drq_wr_callback().set(FUNC(aussiebyte_state::fdc_drq_w));
- MCFG_FLOPPY_DRIVE_ADD("fdc:0", aussiebyte_floppies, "525qd", floppy_image_device::default_floppy_formats)
- MCFG_FLOPPY_DRIVE_SOUND(true)
- MCFG_FLOPPY_DRIVE_ADD("fdc:1", aussiebyte_floppies, "525qd", floppy_image_device::default_floppy_formats)
- MCFG_FLOPPY_DRIVE_SOUND(true)
+ FLOPPY_CONNECTOR(config, "fdc:0", aussiebyte_floppies, "525qd", floppy_image_device::default_floppy_formats).enable_sound(true);
+ FLOPPY_CONNECTOR(config, "fdc:1", aussiebyte_floppies, "525qd", floppy_image_device::default_floppy_formats).enable_sound(true);
/* devices */
SY6545_1(config, m_crtc, 16_MHz_XTAL / 8);
@@ -591,7 +590,7 @@ MACHINE_CONFIG_START(aussiebyte_state::aussiebyte)
MSM5832(config, m_rtc, 32.768_kHz_XTAL);
/* quickload */
- MCFG_QUICKLOAD_ADD("quickload", aussiebyte_state, aussiebyte, "com,cpm", 3)
+ MCFG_QUICKLOAD_ADD("quickload", aussiebyte_state, aussiebyte, "com,cpm", attotime::from_seconds(3))
MACHINE_CONFIG_END
diff --git a/src/mame/drivers/avalnche.cpp b/src/mame/drivers/avalnche.cpp
index 2789147e5b1..4782401e76e 100644
--- a/src/mame/drivers/avalnche.cpp
+++ b/src/mame/drivers/avalnche.cpp
@@ -215,12 +215,12 @@ void avalnche_state::machine_start()
save_item(NAME(m_avalance_video_inverted));
}
-MACHINE_CONFIG_START(avalnche_state::avalnche_base)
-
+void avalnche_state::avalnche_base(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M6502, 12.096_MHz_XTAL / 16) /* clock input is the "2H" signal divided by two */
- MCFG_DEVICE_PROGRAM_MAP(main_map)
- MCFG_DEVICE_PERIODIC_INT_DRIVER(avalnche_state, nmi_line_pulse, 8*60)
+ M6502(config, m_maincpu, 12.096_MHz_XTAL / 16); /* clock input is the "2H" signal divided by two */
+ m_maincpu->set_addrmap(AS_PROGRAM, &avalnche_state::main_map);
+ m_maincpu->set_periodic_int(FUNC(avalnche_state::nmi_line_pulse), attotime::from_hz(8*60));
F9334(config, m_latch); // F8
m_latch->q_out_cb<0>().set_output("led0"); // 1 CREDIT LAMP
@@ -232,27 +232,28 @@ MACHINE_CONFIG_START(avalnche_state::avalnche_base)
WATCHDOG_TIMER(config, "watchdog");
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_RAW_PARAMS(12.096_MHz_XTAL / 2, 384, 0, 256, 262, 16, 256)
- MCFG_SCREEN_UPDATE_DRIVER(avalnche_state, screen_update_avalnche)
-MACHINE_CONFIG_END
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_raw(12.096_MHz_XTAL / 2, 384, 0, 256, 262, 16, 256);
+ screen.set_screen_update(FUNC(avalnche_state::screen_update_avalnche));
+}
-MACHINE_CONFIG_START(avalnche_state::avalnche)
+void avalnche_state::avalnche(machine_config &config)
+{
avalnche_base(config);
/* sound hardware */
avalnche_sound(config);
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(avalnche_state::acatch)
+void avalnche_state::acatch(machine_config &config)
+{
avalnche_base(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(catch_map)
+ m_maincpu->set_addrmap(AS_PROGRAM, &avalnche_state::catch_map);
/* sound hardware... */
acatch_sound(config);
-MACHINE_CONFIG_END
+}
/*************************************
diff --git a/src/mame/drivers/ave_arb.cpp b/src/mame/drivers/ave_arb.cpp
new file mode 100644
index 00000000000..3ca879b461f
--- /dev/null
+++ b/src/mame/drivers/ave_arb.cpp
@@ -0,0 +1,255 @@
+// license:BSD-3-Clause
+// copyright-holders:hap
+// thanks-to:Berger
+/******************************************************************************
+*
+* ave_arb.cpp, subdriver of machine/chessbase.cpp
+
+AVE Micro Systems ARB chess computer driver, in some regions redistributed
+by Chafitz, and in Germany by Sandy Electronic.
+
+*******************************************************************************
+
+Auto Response Board (ARB) overview:
+- R6502P CPU @ 2MHz(4MHz XTAL), R6522P VIA
+- 2KB RAM(4*2114), cartridge port
+- magnetic chessboard, 8*8+12 leds
+- PCB label AV001C01 REV A
+
+The electronic magnetic chessboard is the first of is kind. AVE later licensed
+it to Fidelity (see fidel_elite.cpp).
+ARB is a romless system, the program ROM is on a cartridge.
+
+Known modules (*denotes not dumped yet):
+- Sargon 2.5
+- *Grand Master Series 3
+- *Grand Master Series 3.5
+- *Grand Master Series 4.0
+
+Newer modules included button label stickers for OPTIONS, Verify, Take Back, Clear.
+
+******************************************************************************/
+
+#include "emu.h"
+#include "includes/chessbase.h"
+
+#include "cpu/m6502/m6502.h"
+#include "machine/6522via.h"
+#include "machine/nvram.h"
+#include "sound/dac.h"
+#include "sound/volt_reg.h"
+#include "speaker.h"
+#include "bus/generic/slot.h"
+#include "bus/generic/carts.h"
+#include "softlist.h"
+
+// internal artwork
+#include "ave_arb.lh" // clickable
+
+
+namespace {
+
+class arb_state : public chessbase_state
+{
+public:
+ arb_state(const machine_config &mconfig, device_type type, const char *tag) :
+ chessbase_state(mconfig, type, tag),
+ m_maincpu(*this, "maincpu"),
+ m_via(*this, "via"),
+ m_dac(*this, "dac"),
+ m_cart(*this, "cartslot")
+ { }
+
+ // halt button is tied to NMI, reset button to RESET(but only if halt button is held)
+ void update_reset() { m_maincpu->set_input_line(INPUT_LINE_RESET, (m_inp_matrix[9]->read() == 3) ? ASSERT_LINE : CLEAR_LINE); }
+ DECLARE_INPUT_CHANGED_MEMBER(reset_button) { update_reset(); }
+ DECLARE_INPUT_CHANGED_MEMBER(halt_button) { m_maincpu->set_input_line(M6502_NMI_LINE, newval ? ASSERT_LINE : CLEAR_LINE); update_reset(); }
+
+ // machine drivers
+ void arb(machine_config &config);
+
+private:
+ // devices/pointers
+ required_device<cpu_device> m_maincpu;
+ required_device<via6522_device> m_via;
+ required_device<dac_bit_interface> m_dac;
+ required_device<generic_slot_device> m_cart;
+
+ // address maps
+ void main_map(address_map &map);
+
+ // cartridge
+ DECLARE_DEVICE_IMAGE_LOAD_MEMBER(cartridge);
+ DECLARE_READ8_MEMBER(cartridge_r);
+ u32 m_cart_mask;
+
+ // I/O handlers
+ void prepare_display();
+ DECLARE_WRITE8_MEMBER(leds_w);
+ DECLARE_WRITE8_MEMBER(control_w);
+ DECLARE_READ8_MEMBER(input_r);
+};
+
+
+/******************************************************************************
+ Devices, I/O
+******************************************************************************/
+
+// cartridge
+
+DEVICE_IMAGE_LOAD_MEMBER(arb_state, cartridge)
+{
+ u32 size = m_cart->common_get_size("rom");
+ m_cart_mask = ((1 << (31 - count_leading_zeros(size))) - 1) & 0x7fff;
+
+ m_cart->rom_alloc(size, GENERIC_ROM8_WIDTH, ENDIANNESS_LITTLE);
+ m_cart->common_load_rom(m_cart->get_rom_base(), size, "rom");
+
+ // extra ram (optional)
+ if (image.get_feature("ram"))
+ m_maincpu->space(AS_PROGRAM).install_ram(0x0800, 0x0fff, 0x1000, nullptr);
+
+ return image_init_result::PASS;
+}
+
+READ8_MEMBER(arb_state::cartridge_r)
+{
+ return m_cart->read_rom(offset & m_cart_mask);
+}
+
+
+// R6522 ports
+
+void arb_state::prepare_display()
+{
+ // 12 led column data lines via 3 7475
+ u16 mask = 0;
+ mask |= (m_led_select & 1) ? 0xf00 : 0;
+ mask |= (m_led_select & 2) ? 0x0ff : 0;
+
+ m_led_data = (m_led_data & ~mask) | ((m_led_latch << 8 | m_led_latch) & mask);
+ display_matrix(12, 9+1, m_led_data, m_inp_mux | 0x200);
+}
+
+WRITE8_MEMBER(arb_state::leds_w)
+{
+ // PA0-PA7: led latch input
+ m_led_latch = ~data & 0xff;
+ prepare_display();
+}
+
+WRITE8_MEMBER(arb_state::control_w)
+{
+ // PB0-PB3: 74145 A-D
+ // 74145 0-8: input mux, led row select
+ m_inp_mux = 1 << (data & 0xf) & 0x1ff;
+
+ // PB4,PB5: led group select
+ m_led_select = data >> 4 & 3;
+ prepare_display();
+
+ // PB7: speaker out
+ m_dac->write(BIT(data, 7));
+}
+
+READ8_MEMBER(arb_state::input_r)
+{
+ // PA0-PA7: multiplexed inputs
+ return ~read_inputs(9);
+}
+
+
+
+/******************************************************************************
+ Address Maps
+******************************************************************************/
+
+void arb_state::main_map(address_map &map)
+{
+ // external slot is A0-A14, potential bus conflict with RAM/VIA
+ map(0x0000, 0x7fff).mirror(0x8000).r(FUNC(arb_state::cartridge_r));
+ map(0x0000, 0x07ff).mirror(0x1000).ram().share("nvram");
+ map(0x8000, 0x800f).mirror(0x1ff0).rw(m_via, FUNC(via6522_device::read), FUNC(via6522_device::write));
+}
+
+
+
+/******************************************************************************
+ Input Ports
+******************************************************************************/
+
+static INPUT_PORTS_START( arb )
+ PORT_INCLUDE( generic_cb_magnets )
+
+ PORT_START("IN.8")
+ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_H) PORT_CODE(KEYCODE_7) PORT_NAME("Hint / Black")
+ PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_V) PORT_CODE(KEYCODE_6) PORT_NAME("Variable / Clear / White / 6")
+ PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_M) PORT_CODE(KEYCODE_5) PORT_NAME("Monitor / Take Back / King / 5")
+ PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_S) PORT_CODE(KEYCODE_4) PORT_NAME("Self Play / Verify / Queen / 4")
+ PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_B) PORT_CODE(KEYCODE_3) PORT_NAME("Change Board / Rook / 3")
+ PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_C) PORT_CODE(KEYCODE_2) PORT_NAME("Change Color / Bishop / 2")
+ PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_L) PORT_CODE(KEYCODE_1) PORT_NAME("Change Level / Knight / 1")
+ PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_N) PORT_CODE(KEYCODE_0) PORT_NAME("New Game / Options / Pawn / 0")
+
+ PORT_START("IN.9")
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_R) PORT_CODE(KEYCODE_F2) PORT_NAME("Reset") PORT_CHANGED_MEMBER(DEVICE_SELF, arb_state, reset_button, nullptr)
+ PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_T) PORT_CODE(KEYCODE_F2) PORT_NAME("Halt") PORT_CHANGED_MEMBER(DEVICE_SELF, arb_state, halt_button, nullptr)
+INPUT_PORTS_END
+
+
+
+/******************************************************************************
+ Machine Drivers
+******************************************************************************/
+
+void arb_state::arb(machine_config &config)
+{
+ /* basic machine hardware */
+ M6502(config, m_maincpu, 4_MHz_XTAL/2);
+ m_maincpu->set_addrmap(AS_PROGRAM, &arb_state::main_map);
+
+ VIA6522(config, m_via, 4_MHz_XTAL/4);
+ m_via->writepa_handler().set(FUNC(arb_state::leds_w));
+ m_via->writepb_handler().set(FUNC(arb_state::control_w));
+ m_via->readpa_handler().set(FUNC(arb_state::input_r));
+ m_via->irq_handler().set_inputline(m_maincpu, M6502_IRQ_LINE);
+
+ NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
+
+ TIMER(config, "display_decay").configure_periodic(FUNC(arb_state::display_decay_tick), attotime::from_msec(1));
+ config.set_default_layout(layout_ave_arb);
+
+ /* sound hardware */
+ SPEAKER(config, "speaker").front_center();
+ DAC_1BIT(config, m_dac).add_route(ALL_OUTPUTS, "speaker", 0.25);
+ VOLTAGE_REGULATOR(config, "vref").add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT);
+
+ /* cartridge */
+ GENERIC_CARTSLOT(config, m_cart, generic_plain_slot, "arb", "bin");
+ m_cart->set_device_load(device_image_load_delegate(&arb_state::device_image_load_cartridge, this));
+ m_cart->set_must_be_loaded(true);
+
+ SOFTWARE_LIST(config, "cart_list").set_original("arb");
+}
+
+
+
+/******************************************************************************
+ ROM Definitions
+******************************************************************************/
+
+ROM_START( arb )
+ ROM_REGION( 0x10000, "maincpu", ROMREGION_ERASE00 )
+ // none here, it's in the module slot
+ROM_END
+
+} // anonymous namespace
+
+
+
+/******************************************************************************
+ Drivers
+******************************************************************************/
+
+/* YEAR NAME PARENT CMP MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS */
+CONS( 1980, arb, 0, 0, arb, arb, arb_state, empty_init, "AVE Micro Systems", "Auto Response Board", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
diff --git a/src/mame/drivers/avigo.cpp b/src/mame/drivers/avigo.cpp
index 797564ebbf9..c9984604763 100644
--- a/src/mame/drivers/avigo.cpp
+++ b/src/mame/drivers/avigo.cpp
@@ -751,10 +751,10 @@ void avigo_state::nvram_init(nvram_device &nvram, void *base, size_t size)
MACHINE_CONFIG_START(avigo_state::avigo)
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, 4000000)
- MCFG_DEVICE_PROGRAM_MAP(avigo_mem)
- MCFG_DEVICE_IO_MAP(avigo_io)
- MCFG_QUANTUM_TIME(attotime::from_hz(60))
+ Z80(config, m_maincpu, 4000000);
+ m_maincpu->set_addrmap(AS_PROGRAM, &avigo_state::avigo_mem);
+ m_maincpu->set_addrmap(AS_IO, &avigo_state::avigo_io);
+ config.m_minimum_quantum = attotime::from_hz(60);
NS16550(config, m_uart, XTAL(1'843'200));
m_uart->out_tx_callback().set(m_serport, FUNC(rs232_port_device::write_txd));
@@ -770,13 +770,13 @@ MACHINE_CONFIG_START(avigo_state::avigo)
m_serport->cts_handler().set(m_uart, FUNC(ins8250_uart_device::cts_w));
/* video hardware */
- MCFG_SCREEN_ADD("screen", LCD)
- MCFG_SCREEN_REFRESH_RATE(50)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */
- MCFG_SCREEN_UPDATE_DRIVER(avigo_state, screen_update)
- MCFG_SCREEN_SIZE(AVIGO_SCREEN_WIDTH, AVIGO_SCREEN_HEIGHT + AVIGO_PANEL_HEIGHT)
- MCFG_SCREEN_VISIBLE_AREA(0, AVIGO_SCREEN_WIDTH-1, 0, AVIGO_SCREEN_HEIGHT + AVIGO_PANEL_HEIGHT -1)
- MCFG_SCREEN_PALETTE(m_palette)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_LCD));
+ screen.set_refresh_hz(50);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */
+ screen.set_screen_update(FUNC(avigo_state::screen_update));
+ screen.set_size(AVIGO_SCREEN_WIDTH, AVIGO_SCREEN_HEIGHT + AVIGO_PANEL_HEIGHT);
+ screen.set_visarea_full();
+ screen.set_palette(m_palette);
config.set_default_layout(layout_avigo);
@@ -805,13 +805,13 @@ MACHINE_CONFIG_START(avigo_state::avigo)
NVRAM(config, "nvram").set_custom_handler(FUNC(avigo_state::nvram_init));
// IRQ 1 is used for scan the pen and for cursor blinking
- MCFG_TIMER_DRIVER_ADD_PERIODIC("scan_timer", avigo_state, avigo_scan_timer, attotime::from_hz(50))
+ TIMER(config, "scan_timer").configure_periodic(FUNC(avigo_state::avigo_scan_timer), attotime::from_hz(50));
// IRQ 4 is generated every second, used for auto power off
- MCFG_TIMER_DRIVER_ADD_PERIODIC("1hz_timer", avigo_state, avigo_1hz_timer, attotime::from_hz(1))
+ TIMER(config, "1hz_timer").configure_periodic(FUNC(avigo_state::avigo_1hz_timer), attotime::from_hz(1));
/* quickload */
- MCFG_QUICKLOAD_ADD("quickload", avigo_state, avigo, "app", 0)
+ MCFG_QUICKLOAD_ADD("quickload", avigo_state, avigo, "app")
MACHINE_CONFIG_END
diff --git a/src/mame/drivers/avt.cpp b/src/mame/drivers/avt.cpp
index b1d9b9767f3..2fca9828c07 100644
--- a/src/mame/drivers/avt.cpp
+++ b/src/mame/drivers/avt.cpp
@@ -568,12 +568,12 @@ uint32_t avt_state::screen_update_avt(screen_device &screen, bitmap_ind16 &bitma
void avt_state::avt_palette(palette_device &palette) const
{
/* prom bits
- 7654 3210
- ---- ---x Intensity?.
- ---- --x- Red component.
- ---- -x-- Green component.
- ---- x--- Blue component.
- xxxx ---- Unused.
+ 7654 3210
+ ---- ---x Intensity?.
+ ---- --x- Red component.
+ ---- -x-- Green component.
+ ---- x--- Blue component.
+ xxxx ---- Unused.
*/
/* 0000BGRI */
@@ -624,19 +624,19 @@ void avt_state::avt_palette(palette_device &palette) const
WRITE8_MEMBER( avt_state::avt_6845_address_w )
{
m_crtc_index = data;
- m_crtc->address_w(space, offset, data);
+ m_crtc->address_w(data);
}
WRITE8_MEMBER( avt_state::avt_6845_data_w )
{
m_crtc_vreg[m_crtc_index] = data;
- m_crtc->register_w(space, offset, data);
+ m_crtc->register_w(data);
}
READ8_MEMBER( avt_state::avt_6845_data_r )
{
//m_crtc_vreg[m_crtc_index] = data;
- return m_crtc->register_r(space, offset);
+ return m_crtc->register_r();
}
/*********************************************
@@ -956,7 +956,8 @@ WRITE_LINE_MEMBER( avt_state::avtbingo_w )
m_pio0->port_b_write(ioport("IN0")->read());
}
-MACHINE_CONFIG_START(avt_state::avt)
+void avt_state::avt(machine_config &config)
+{
/* basic machine hardware */
Z80(config, m_maincpu, CPU_CLOCK); /* guess */
m_maincpu->set_daisy_config(daisy_chain);
@@ -964,13 +965,13 @@ MACHINE_CONFIG_START(avt_state::avt)
m_maincpu->set_addrmap(AS_IO, &avt_state::avt_portmap);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(32*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 0*8, 32*8-1) /* 240x224 (through CRTC) */
- MCFG_SCREEN_UPDATE_DRIVER(avt_state, screen_update_avt)
- MCFG_SCREEN_PALETTE(m_palette)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(32*8, 32*8);
+ screen.set_visarea_full(); /* 240x224 (through CRTC) */
+ screen.set_screen_update(FUNC(avt_state::screen_update_avt));
+ screen.set_palette(m_palette);
GFXDECODE(config, m_gfxdecode, m_palette, gfx_avt);
PALETTE(config, m_palette, FUNC(avt_state::avt_palette), 8*16);
@@ -1004,7 +1005,7 @@ MACHINE_CONFIG_START(avt_state::avt)
// PORT A d0-d7 = TP13,TP12,TP11,TP10,TP8,TP7,TP5,TP3
// PORT B d0-d7 = "Player2", DCOM, CCOM, BCOM, ACOM, LOCKOUT/TP6, TP4, 50/60HZ (held high, jumper on JP13 grounds it)
// DCOM,CCOM,BCOM,ACOM appear to be muxes
-MACHINE_CONFIG_END
+}
// Leave avtnfl as it was until more is learnt.
WRITE_LINE_MEMBER( avt_state::avtnfl_w )
diff --git a/src/mame/drivers/ax20.cpp b/src/mame/drivers/ax20.cpp
index 7cb4ff858f6..456de221e05 100644
--- a/src/mame/drivers/ax20.cpp
+++ b/src/mame/drivers/ax20.cpp
@@ -132,29 +132,29 @@ static void ax20_floppies(device_slot_interface &device)
device.option_add("525dd", FLOPPY_525_DD);
}
-MACHINE_CONFIG_START(ax20_state::ax20)
+void ax20_state::ax20(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", I8088, XTAL(14'318'181)/3)
- MCFG_DEVICE_PROGRAM_MAP(ax20_map)
- MCFG_DEVICE_IO_MAP(ax20_io)
+ I8088(config, m_maincpu, XTAL(14'318'181)/3);
+ m_maincpu->set_addrmap(AS_PROGRAM, &ax20_state::ax20_map);
+ m_maincpu->set_addrmap(AS_IO, &ax20_state::ax20_io);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_COLOR(rgb_t::green())
- MCFG_SCREEN_REFRESH_RATE(50)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */
- MCFG_SCREEN_UPDATE_DRIVER(ax20_state, screen_update)
- MCFG_SCREEN_SIZE(80*8, 24*12)
- MCFG_SCREEN_VISIBLE_AREA(0, 80*8-1, 0, 24*12-1)
- MCFG_SCREEN_PALETTE(m_palette)
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_ax20)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER, rgb_t::green()));
+ screen.set_refresh_hz(50);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */
+ screen.set_screen_update(FUNC(ax20_state::screen_update));
+ screen.set_size(80*8, 24*12);
+ screen.set_visarea(0, 80*8-1, 0, 24*12-1);
+ screen.set_palette(m_palette);
+ GFXDECODE(config, m_gfxdecode, m_palette, gfx_ax20);
PALETTE(config, m_palette, palette_device::MONOCHROME);
I8272A(config, m_fdc, 8'000'000, true);
/* Devices */
- MCFG_FLOPPY_DRIVE_ADD("fdc:0", ax20_floppies, "525dd", isa8_fdc_device::floppy_formats)
-MACHINE_CONFIG_END
+ FLOPPY_CONNECTOR(config, "fdc:0", ax20_floppies, "525dd", isa8_fdc_device::floppy_formats);
+}
/* ROM definition */
ROM_START( ax20 )
diff --git a/src/mame/drivers/aztarac.cpp b/src/mame/drivers/aztarac.cpp
index 083fb952962..65b66adb159 100644
--- a/src/mame/drivers/aztarac.cpp
+++ b/src/mame/drivers/aztarac.cpp
@@ -149,29 +149,29 @@ INPUT_PORTS_END
*
*************************************/
-MACHINE_CONFIG_START(aztarac_state::aztarac)
-
+void aztarac_state::aztarac(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M68000, 8000000)
- MCFG_DEVICE_PROGRAM_MAP(main_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", aztarac_state, irq4_line_hold)
- MCFG_DEVICE_IRQ_ACKNOWLEDGE_DRIVER(aztarac_state, irq_callback)
+ M68000(config, m_maincpu, 8000000);
+ m_maincpu->set_addrmap(AS_PROGRAM, &aztarac_state::main_map);
+ m_maincpu->set_vblank_int("screen", FUNC(aztarac_state::irq4_line_hold));
+ m_maincpu->set_irq_acknowledge_callback(FUNC(aztarac_state::irq_callback));
- MCFG_DEVICE_ADD("audiocpu", Z80, 2000000)
- MCFG_DEVICE_PROGRAM_MAP(sound_map)
- MCFG_DEVICE_PERIODIC_INT_DRIVER(aztarac_state, snd_timed_irq, 100)
+ Z80(config, m_audiocpu, 2000000);
+ m_audiocpu->set_addrmap(AS_PROGRAM, &aztarac_state::sound_map);
+ m_audiocpu->set_periodic_int(FUNC(aztarac_state::snd_timed_irq), attotime::from_hz(100));
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_1);
WATCHDOG_TIMER(config, "watchdog");
/* video hardware */
- MCFG_VECTOR_ADD("vector")
- MCFG_SCREEN_ADD("screen", VECTOR)
- MCFG_SCREEN_REFRESH_RATE(40)
- MCFG_SCREEN_SIZE(400, 300)
- MCFG_SCREEN_VISIBLE_AREA(0, 1024-1, 0, 768-1)
- MCFG_SCREEN_UPDATE_DEVICE("vector", vector_device, screen_update)
+ VECTOR(config, m_vector, 0);
+ SCREEN(config, m_screen, SCREEN_TYPE_VECTOR);
+ m_screen->set_refresh_hz(40);
+ m_screen->set_size(400, 300);
+ m_screen->set_visarea(0, 1024-1, 0, 768-1);
+ m_screen->set_screen_update("vector", FUNC(vector_device::screen_update));
/* sound hardware */
@@ -186,7 +186,7 @@ MACHINE_CONFIG_START(aztarac_state::aztarac)
AY8910(config, "ay3", 2000000).add_route(ALL_OUTPUTS, "mono", 0.15);
AY8910(config, "ay4", 2000000).add_route(ALL_OUTPUTS, "mono", 0.15);
-MACHINE_CONFIG_END
+}
diff --git a/src/mame/drivers/b16.cpp b/src/mame/drivers/b16.cpp
index b98ce63364b..343c4eaf055 100644
--- a/src/mame/drivers/b16.cpp
+++ b/src/mame/drivers/b16.cpp
@@ -142,13 +142,13 @@ READ16_MEMBER( b16_state::vblank_r )
WRITE8_MEMBER( b16_state::b16_6845_address_w )
{
m_crtc_index = data;
- m_mc6845->address_w(space,offset, data);
+ m_mc6845->address_w(data);
}
WRITE8_MEMBER( b16_state::b16_6845_data_w )
{
m_crtc_vreg[m_crtc_index] = data;
- m_mc6845->register_w(space, offset, data);
+ m_mc6845->register_w(data);
}
/*
@@ -266,20 +266,21 @@ WRITE8_MEMBER(b16_state::memory_write_byte)
}
-MACHINE_CONFIG_START(b16_state::b16)
+void b16_state::b16(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD(m_maincpu, I8086, XTAL(14'318'181)/2) //unknown xtal
- MCFG_DEVICE_PROGRAM_MAP(b16_map)
- MCFG_DEVICE_IO_MAP(b16_io)
+ I8086(config, m_maincpu, XTAL(14'318'181)/2); //unknown xtal
+ m_maincpu->set_addrmap(AS_PROGRAM, &b16_state::b16_map);
+ m_maincpu->set_addrmap(AS_IO, &b16_state::b16_io);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */
- MCFG_SCREEN_UPDATE_DRIVER(b16_state, screen_update)
- MCFG_SCREEN_SIZE(640, 400)
- MCFG_SCREEN_VISIBLE_AREA(0, 640-1, 0, 400-1)
- MCFG_SCREEN_PALETTE("palette")
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */
+ screen.set_screen_update(FUNC(b16_state::screen_update));
+ screen.set_size(640, 400);
+ screen.set_visarea_full();
+ screen.set_palette(m_palette);
H46505(config, m_mc6845, XTAL(14'318'181)/5); /* unknown clock, hand tuned to get ~60 fps */
m_mc6845->set_screen("screen");
@@ -290,11 +291,10 @@ MACHINE_CONFIG_START(b16_state::b16)
m_dma8237->in_memr_callback().set(FUNC(b16_state::memory_read_byte));
m_dma8237->out_memw_callback().set(FUNC(b16_state::memory_write_byte));
- MCFG_DEVICE_ADD(m_gfxdecode, GFXDECODE, m_palette, gfx_b16)
- MCFG_PALETTE_ADD(m_palette, 8)
+ GFXDECODE(config, m_gfxdecode, m_palette, gfx_b16);
+ PALETTE(config, m_palette).set_entries(8);
// MCFG_PALETTE_INIT_STANDARD(black_and_white) // TODO
-
-MACHINE_CONFIG_END
+}
/* ROM definition */
ROM_START( b16 )
diff --git a/src/mame/drivers/b2m.cpp b/src/mame/drivers/b2m.cpp
index 96ba19c551d..2312cc3a958 100644
--- a/src/mame/drivers/b2m.cpp
+++ b/src/mame/drivers/b2m.cpp
@@ -187,22 +187,23 @@ static void b2m_floppies(device_slot_interface &device)
/* Machine driver */
-MACHINE_CONFIG_START(b2m_state::b2m)
+void b2m_state::b2m(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", I8080, 2000000)
- MCFG_DEVICE_PROGRAM_MAP(b2m_mem)
- MCFG_DEVICE_IO_MAP(b2m_io)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", b2m_state, b2m_vblank_interrupt)
- MCFG_DEVICE_IRQ_ACKNOWLEDGE_DEVICE("pic8259", pic8259_device, inta_cb)
+ I8080(config, m_maincpu, 2000000);
+ m_maincpu->set_addrmap(AS_PROGRAM, &b2m_state::b2m_mem);
+ m_maincpu->set_addrmap(AS_IO, &b2m_state::b2m_io);
+ m_maincpu->set_vblank_int("screen", FUNC(b2m_state::b2m_vblank_interrupt));
+ m_maincpu->set_irq_acknowledge_callback("pic8259", FUNC(pic8259_device::inta_cb));
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(50)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */
- MCFG_SCREEN_SIZE(384, 256)
- MCFG_SCREEN_VISIBLE_AREA(0, 384-1, 0, 256-1)
- MCFG_SCREEN_UPDATE_DRIVER(b2m_state, screen_update_b2m)
- MCFG_SCREEN_PALETTE(m_palette)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(50);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */
+ screen.set_size(384, 256);
+ screen.set_visarea_full();
+ screen.set_screen_update(FUNC(b2m_state::screen_update_b2m));
+ screen.set_palette(m_palette);
PALETTE(config, m_palette, FUNC(b2m_state::b2m_palette), 4);
@@ -233,28 +234,27 @@ MACHINE_CONFIG_START(b2m_state::b2m)
/* sound */
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("speaker", SPEAKER_SOUND)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25)
+ SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25);
/* uart */
- MCFG_DEVICE_ADD("uart", I8251, 0)
+ I8251(config, "uart", 0);
FD1793(config, m_fdc, 8_MHz_XTAL / 8);
m_fdc->drq_wr_callback().set(FUNC(b2m_state::b2m_fdc_drq));
- MCFG_FLOPPY_DRIVE_ADD("fd0", b2m_floppies, "525qd", b2m_state::b2m_floppy_formats)
- MCFG_FLOPPY_DRIVE_ADD("fd1", b2m_floppies, "525qd", b2m_state::b2m_floppy_formats)
- MCFG_SOFTWARE_LIST_ADD("flop_list","b2m")
+ FLOPPY_CONNECTOR(config, "fd0", b2m_floppies, "525qd", b2m_state::b2m_floppy_formats);
+ FLOPPY_CONNECTOR(config, "fd1", b2m_floppies, "525qd", b2m_state::b2m_floppy_formats);
+ SOFTWARE_LIST(config, "flop_list").set_original("b2m");
/* internal ram */
RAM(config, RAM_TAG).set_default_size("128K").set_default_value(0x00);
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(b2m_state::b2mrom)
+void b2m_state::b2mrom(machine_config &config)
+{
b2m(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_IO_MAP(b2m_rom_io)
-MACHINE_CONFIG_END
+ m_maincpu->set_addrmap(AS_IO, &b2m_state::b2m_rom_io);
+}
/* ROM definition */
diff --git a/src/mame/drivers/backfire.cpp b/src/mame/drivers/backfire.cpp
index 7cc6d9a3bc7..9a3eb889adb 100644
--- a/src/mame/drivers/backfire.cpp
+++ b/src/mame/drivers/backfire.cpp
@@ -194,7 +194,7 @@ template<int Layer> WRITE32_MEMBER(backfire_state::pf_rowscroll_w){ data &= 0x00
READ32_MEMBER(backfire_state::pot_select_r)
{
if (!machine().side_effects_disabled())
- m_adc->address_offset_start_w(space, offset, 0);
+ m_adc->address_offset_start_w(offset, 0);
return 0;
}
@@ -362,11 +362,11 @@ void backfire_state::machine_start()
{
}
-MACHINE_CONFIG_START(backfire_state::backfire)
-
+void backfire_state::backfire(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", ARM, 28000000/4) /* Unconfirmed */
- MCFG_DEVICE_PROGRAM_MAP(backfire_map)
+ ARM(config, m_maincpu, 28000000/4); /* Unconfirmed */
+ m_maincpu->set_addrmap(AS_PROGRAM, &backfire_state::backfire_map);
EEPROM_93C46_16BIT(config, "eeprom");
@@ -377,25 +377,25 @@ MACHINE_CONFIG_START(backfire_state::backfire)
/* video hardware */
PALETTE(config, m_palette).set_format(palette_device::xBGR_555, 2048);
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_backfire)
+ GFXDECODE(config, "gfxdecode", m_palette, gfx_backfire);
config.set_default_layout(layout_dualhsxs);
- MCFG_SCREEN_ADD("lscreen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */)
- MCFG_SCREEN_SIZE(40*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 40*8-1, 1*8, 31*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(backfire_state, screen_update_left)
- MCFG_SCREEN_PALETTE(m_palette)
- MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE(*this, backfire_state, vbl_interrupt))
-
- MCFG_SCREEN_ADD("rscreen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */)
- MCFG_SCREEN_SIZE(40*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 40*8-1, 1*8, 31*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(backfire_state, screen_update_right)
- MCFG_SCREEN_PALETTE(m_palette)
+ SCREEN(config, m_lscreen, SCREEN_TYPE_RASTER);
+ m_lscreen->set_refresh_hz(60);
+ m_lscreen->set_vblank_time(ATTOSECONDS_IN_USEC(2500) /* not accurate */);
+ m_lscreen->set_size(40*8, 32*8);
+ m_lscreen->set_visarea(0*8, 40*8-1, 1*8, 31*8-1);
+ m_lscreen->set_screen_update(FUNC(backfire_state::screen_update_left));
+ m_lscreen->set_palette(m_palette);
+ m_lscreen->screen_vblank().set(FUNC(backfire_state::vbl_interrupt));
+
+ screen_device &rscreen(SCREEN(config, "rscreen", SCREEN_TYPE_RASTER));
+ rscreen.set_refresh_hz(60);
+ rscreen.set_vblank_time(ATTOSECONDS_IN_USEC(2500) /* not accurate */);
+ rscreen.set_size(40*8, 32*8);
+ rscreen.set_visarea(0*8, 40*8-1, 1*8, 31*8-1);
+ rscreen.set_screen_update(FUNC(backfire_state::screen_update_right));
+ rscreen.set_palette(m_palette);
DECO16IC(config, m_deco_tilegen[0], 0);
m_deco_tilegen[0]->set_screen(m_lscreen);
@@ -447,10 +447,10 @@ MACHINE_CONFIG_START(backfire_state::backfire)
SPEAKER(config, "lspeaker").front_left();
SPEAKER(config, "rspeaker").front_right();
- MCFG_DEVICE_ADD("ymz", YMZ280B, 28000000 / 2)
- MCFG_SOUND_ROUTE(0, "lspeaker", 1.0)
- MCFG_SOUND_ROUTE(1, "rspeaker", 1.0)
-MACHINE_CONFIG_END
+ ymz280b_device &ymz(YMZ280B(config, "ymz", 28000000 / 2));
+ ymz.add_route(0, "lspeaker", 1.0);
+ ymz.add_route(1, "rspeaker", 1.0);
+}
/*
diff --git a/src/mame/drivers/badlands.cpp b/src/mame/drivers/badlands.cpp
index 9c5eedaa968..d2d51288124 100644
--- a/src/mame/drivers/badlands.cpp
+++ b/src/mame/drivers/badlands.cpp
@@ -440,16 +440,16 @@ GFXDECODE_END
*
*************************************/
-MACHINE_CONFIG_START(badlands_state::badlands)
-
+void badlands_state::badlands(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M68000, ATARI_CLOCK_14MHz/2)
- MCFG_DEVICE_PROGRAM_MAP(main_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", badlands_state, vblank_int)
+ M68000(config, m_maincpu, ATARI_CLOCK_14MHz/2);
+ m_maincpu->set_addrmap(AS_PROGRAM, &badlands_state::main_map);
+ m_maincpu->set_vblank_int("screen", FUNC(badlands_state::vblank_int));
- MCFG_DEVICE_ADD("audiocpu", M6502, ATARI_CLOCK_14MHz/8)
- MCFG_DEVICE_PROGRAM_MAP(audio_map)
- MCFG_TIMER_DRIVER_ADD_SCANLINE("scantimer", badlands_state, sound_scanline, "screen", 0, 1)
+ M6502(config, m_audiocpu, ATARI_CLOCK_14MHz/8);
+ m_audiocpu->set_addrmap(AS_PROGRAM, &badlands_state::audio_map);
+ TIMER(config, "scantimer").configure_scanline(FUNC(badlands_state::sound_scanline), "screen", 0, 1);
MCFG_MACHINE_START_OVERRIDE(badlands_state,badlands)
MCFG_MACHINE_RESET_OVERRIDE(badlands_state,badlands)
@@ -459,23 +459,23 @@ MACHINE_CONFIG_START(badlands_state::badlands)
WATCHDOG_TIMER(config, "watchdog");
/* video hardware */
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_badlands)
+ GFXDECODE(config, m_gfxdecode, "palette", gfx_badlands);
palette_device &palette(PALETTE(config, "palette"));
palette.set_format(palette_device::IRGB_1555, 256);
palette.set_membits(8);
- MCFG_TILEMAP_ADD_STANDARD("playfield", "gfxdecode", 2, badlands_state, get_playfield_tile_info, 8,8, SCAN_ROWS, 64,32)
+ TILEMAP(config, m_playfield_tilemap, m_gfxdecode, 2, 8,8, TILEMAP_SCAN_ROWS, 64,32).set_info_callback(FUNC(badlands_state::get_playfield_tile_info));
ATARI_MOTION_OBJECTS(config, m_mob, 0, m_screen, badlands_state::s_mob_config);
m_mob->set_gfxdecode(m_gfxdecode);
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_VIDEO_ATTRIBUTES(VIDEO_UPDATE_BEFORE_VBLANK)
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_video_attributes(VIDEO_UPDATE_BEFORE_VBLANK);
/* note: these parameters are from published specs, not derived */
/* the board uses an SOS-2 chip to generate video signals */
- MCFG_SCREEN_RAW_PARAMS(ATARI_CLOCK_14MHz/2, 456, 0, 336, 262, 0, 240)
- MCFG_SCREEN_UPDATE_DRIVER(badlands_state, screen_update_badlands)
- MCFG_SCREEN_PALETTE("palette")
+ m_screen->set_raw(ATARI_CLOCK_14MHz/2, 456, 0, 336, 262, 0, 240);
+ m_screen->set_screen_update(FUNC(badlands_state::screen_update_badlands));
+ m_screen->set_palette("palette");
MCFG_VIDEO_START_OVERRIDE(badlands_state,badlands)
@@ -485,7 +485,7 @@ MACHINE_CONFIG_START(badlands_state::badlands)
SPEAKER(config, "mono").front_center();
YM2151(config, "ymsnd", ATARI_CLOCK_14MHz/4).add_route(0, "mono", 0.30).add_route(1, "mono", 0.30);
-MACHINE_CONFIG_END
+}
diff --git a/src/mame/drivers/badlandsbl.cpp b/src/mame/drivers/badlandsbl.cpp
index a4c5acfd147..fc49343a059 100644
--- a/src/mame/drivers/badlandsbl.cpp
+++ b/src/mame/drivers/badlandsbl.cpp
@@ -218,41 +218,41 @@ TIMER_DEVICE_CALLBACK_MEMBER(badlandsbl_state::bootleg_sound_scanline)
m_audiocpu->set_input_line(0, HOLD_LINE);
}
-MACHINE_CONFIG_START(badlandsbl_state::badlandsb)
-
+void badlandsbl_state::badlandsb(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M68000, XTAL(28'000'000)/4) /* Divisor estimated */
- MCFG_DEVICE_PROGRAM_MAP(bootleg_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", badlandsbl_state, irq1_line_hold) //vblank_int)
+ M68000(config, m_maincpu, XTAL(28'000'000)/4); /* Divisor estimated */
+ m_maincpu->set_addrmap(AS_PROGRAM, &badlandsbl_state::bootleg_map);
+ m_maincpu->set_vblank_int("screen", FUNC(badlandsbl_state::irq1_line_hold)); //vblank_int)
- MCFG_DEVICE_ADD("audiocpu", Z80, XTAL(20'000'000)/12) /* Divisor estimated */
- MCFG_DEVICE_PROGRAM_MAP(bootleg_audio_map)
- MCFG_TIMER_DRIVER_ADD_SCANLINE("scantimer", badlandsbl_state, bootleg_sound_scanline, "screen", 0, 1)
+ Z80(config, m_audiocpu, XTAL(20'000'000)/12); /* Divisor estimated */
+ m_audiocpu->set_addrmap(AS_PROGRAM, &badlandsbl_state::bootleg_audio_map);
+ TIMER(config, "scantimer").configure_scanline(FUNC(badlandsbl_state::bootleg_sound_scanline), "screen", 0, 1);
-// MCFG_QUANTUM_PERFECT_CPU("maincpu")
+// config.m_perfect_cpu_quantum = subtag("maincpu");
MCFG_MACHINE_START_OVERRIDE(badlands_state,badlands)
EEPROM_2816(config, "eeprom").lock_after_write(true);
/* video hardware */
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_badlandsb)
+ GFXDECODE(config, m_gfxdecode, "palette", gfx_badlandsb);
palette_device &palette(PALETTE(config, "palette"));
palette.set_format(palette_device::IRGB_1555, 256);
palette.set_membits(8);
- MCFG_TILEMAP_ADD_STANDARD("playfield", "gfxdecode", 2, badlands_state, get_playfield_tile_info, 8,8, SCAN_ROWS, 64,32)
+ TILEMAP(config, m_playfield_tilemap, m_gfxdecode, 2, 8,8, TILEMAP_SCAN_ROWS, 64,32).set_info_callback(FUNC(badlands_state::get_playfield_tile_info));
// ATARI_MOTION_OBJECTS(config, m_mob, 0, m_screen, badlands_state::s_mob_config);
// m_mob->set_gfxdecode(m_gfxdecode);
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_VIDEO_ATTRIBUTES(VIDEO_UPDATE_BEFORE_VBLANK)
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_video_attributes(VIDEO_UPDATE_BEFORE_VBLANK);
/* note: these parameters are from published specs, not derived */
/* the board uses an SOS-2 chip to generate video signals */
- MCFG_SCREEN_RAW_PARAMS(ATARI_CLOCK_14MHz/2, 456, 0, 336, 262, 0, 240)
- MCFG_SCREEN_UPDATE_DRIVER(badlandsbl_state, screen_update_badlandsbl)
- MCFG_SCREEN_PALETTE("palette")
+ m_screen->set_raw(ATARI_CLOCK_14MHz/2, 456, 0, 336, 262, 0, 240);
+ m_screen->set_screen_update(FUNC(badlandsbl_state::screen_update_badlandsbl));
+ m_screen->set_palette("palette");
MCFG_VIDEO_START_OVERRIDE(badlands_state,badlands)
@@ -260,7 +260,7 @@ MACHINE_CONFIG_START(badlandsbl_state::badlandsb)
SPEAKER(config, "mono").front_center();
YM2151(config, "ymsnd", XTAL(20'000'000)/8).add_route(0, "mono", 0.30).add_route(1, "mono", 0.30); /* Divisor estimated */
-MACHINE_CONFIG_END
+}
diff --git a/src/mame/drivers/bailey.cpp b/src/mame/drivers/bailey.cpp
index 5b3598ebf1b..e77823ba5de 100644
--- a/src/mame/drivers/bailey.cpp
+++ b/src/mame/drivers/bailey.cpp
@@ -88,20 +88,21 @@ void bailey_state::video_start()
{
}
-MACHINE_CONFIG_START(bailey_state::bailey)
-
+void bailey_state::bailey(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", NETLIST_CPU, NETLIST_CLOCK)
- MCFG_NETLIST_SETUP(bailey)
+ NETLIST_CPU(config, m_maincpu, NETLIST_CLOCK);
+ m_maincpu->set_constructor(netlist_bailey);
/* video hardware */
- MCFG_FIXFREQ_ADD("fixfreq", "screen")
- MCFG_FIXFREQ_MONITOR_CLOCK(MASTER_CLOCK)
- MCFG_FIXFREQ_HORZ_PARAMS(H_TOTAL-67,H_TOTAL-40,H_TOTAL-8,H_TOTAL)
- MCFG_FIXFREQ_VERT_PARAMS(V_TOTAL-22,V_TOTAL-19,V_TOTAL-12,V_TOTAL)
- MCFG_FIXFREQ_FIELDCOUNT(1)
- MCFG_FIXFREQ_SYNC_THRESHOLD(0.30)
-MACHINE_CONFIG_END
+ SCREEN(config, "screen", SCREEN_TYPE_RASTER);
+ FIXFREQ(config, m_video).set_screen("screen");
+ m_video->set_monitor_clock(MASTER_CLOCK);
+ m_video->set_horz_params(H_TOTAL-67,H_TOTAL-40,H_TOTAL-8,H_TOTAL);
+ m_video->set_vert_params(V_TOTAL-22,V_TOTAL-19,V_TOTAL-12,V_TOTAL);
+ m_video->set_fieldcount(1);
+ m_video->set_threshold(0.30);
+}
/***************************************************************************
diff --git a/src/mame/drivers/banctec.cpp b/src/mame/drivers/banctec.cpp
index ca00bb3ec98..5daea29a7ac 100644
--- a/src/mame/drivers/banctec.cpp
+++ b/src/mame/drivers/banctec.cpp
@@ -136,26 +136,27 @@ static GFXDECODE_START( gfx_banctec )
GFXDECODE_ENTRY( "chargen", 0x00000, banctec_gfx_layout, 0, 1 )
GFXDECODE_END
-MACHINE_CONFIG_START(banctec_state::banctec)
+void banctec_state::banctec(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", I80C31, XTAL(11'059'200))
- MCFG_DEVICE_PROGRAM_MAP(banctec_mem)
+ I80C31(config, m_maincpu, XTAL(11'059'200));
+ m_maincpu->set_addrmap(AS_PROGRAM, &banctec_state::banctec_mem);
- MCFG_DEVICE_ADD("mcu", M6803, 4000000) /* Actual MCU is a Motorola 6803 and the clock frequency is still unknown */
- MCFG_DEVICE_PROGRAM_MAP(banctec_mcu_mem)
+ m6803_cpu_device &mcu(M6803(config, "mcu", 4000000)); /* Actual MCU is a Motorola 6803 and the clock frequency is still unknown */
+ mcu.set_addrmap(AS_PROGRAM, &banctec_state::banctec_mcu_mem);
// The video signal is generated by a R6545EAP character generator chip
// The U20 EPROM holds the image data for the character set.
// video hardware
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_SIZE((52+1)*8, (31+1)*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 40*8-1, 0*8, 25*8-1)
- MCFG_SCREEN_UPDATE_DEVICE("crtc", mc6845_device, screen_update)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_size((52+1)*8, (31+1)*8);
+ screen.set_visarea(0*8, 40*8-1, 0*8, 25*8-1);
+ screen.set_screen_update("crtc", FUNC(mc6845_device::screen_update));
PALETTE(config, m_palette, palette_device::MONOCHROME);
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_banctec)
+ GFXDECODE(config, "gfxdecode", m_palette, gfx_banctec);
r6545_1_device &crtc(R6545_1(config, "crtc", XTAL(2'000'000))); /* (?) */
crtc.set_screen("screen");
@@ -163,7 +164,7 @@ MACHINE_CONFIG_START(banctec_state::banctec)
crtc.set_char_width(8);
crtc.set_update_row_callback(FUNC(banctec_state::crtc_update_row), this);
crtc.set_on_update_addr_change_callback(FUNC(banctec_state::crtc_addr), this);
-MACHINE_CONFIG_END
+}
ROM_START(banctec)
ROM_REGION(0x800, "maincpu", 0)
diff --git a/src/mame/drivers/bankp.cpp b/src/mame/drivers/bankp.cpp
index adc9223bfbc..843c6e9296e 100644
--- a/src/mame/drivers/bankp.cpp
+++ b/src/mame/drivers/bankp.cpp
@@ -137,9 +137,9 @@ void bankp_state::bankp_map(address_map &map)
void bankp_state::bankp_io_map(address_map &map)
{
map.global_mask(0xff);
- map(0x00, 0x00).portr("IN0").w("sn1", FUNC(sn76489_device::command_w));
- map(0x01, 0x01).portr("IN1").w("sn2", FUNC(sn76489_device::command_w));
- map(0x02, 0x02).portr("IN2").w("sn3", FUNC(sn76489_device::command_w));
+ map(0x00, 0x00).portr("IN0").w("sn1", FUNC(sn76489_device::write));
+ map(0x01, 0x01).portr("IN1").w("sn2", FUNC(sn76489_device::write));
+ map(0x02, 0x02).portr("IN2").w("sn3", FUNC(sn76489_device::write));
map(0x04, 0x04).portr("DSW1");
map(0x05, 0x05).w(FUNC(bankp_state::scroll_w));
map(0x07, 0x07).w(FUNC(bankp_state::out_w));
@@ -293,20 +293,20 @@ INTERRUPT_GEN_MEMBER(bankp_state::vblank_irq)
device.execute().pulse_input_line(INPUT_LINE_NMI, attotime::zero);
}
-MACHINE_CONFIG_START(bankp_state::bankp)
-
+void bankp_state::bankp(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, MASTER_CLOCK/6)
- MCFG_DEVICE_PROGRAM_MAP(bankp_map)
- MCFG_DEVICE_IO_MAP(bankp_io_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", bankp_state, vblank_irq)
+ Z80(config, m_maincpu, MASTER_CLOCK/6);
+ m_maincpu->set_addrmap(AS_PROGRAM, &bankp_state::bankp_map);
+ m_maincpu->set_addrmap(AS_IO, &bankp_state::bankp_io_map);
+ m_maincpu->set_vblank_int("screen", FUNC(bankp_state::vblank_irq));
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_RAW_PARAMS(PIXEL_CLOCK, HTOTAL, HBEND, HBSTART, VTOTAL, VBEND, VBSTART)
- MCFG_SCREEN_UPDATE_DRIVER(bankp_state, screen_update)
- MCFG_SCREEN_PALETTE(m_palette)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_raw(PIXEL_CLOCK, HTOTAL, HBEND, HBSTART, VTOTAL, VBEND, VBSTART);
+ screen.set_screen_update(FUNC(bankp_state::screen_update));
+ screen.set_palette(m_palette);
GFXDECODE(config, m_gfxdecode, m_palette, gfx_bankp);
PALETTE(config, m_palette, FUNC(bankp_state::bankp_palette), 32*4+16*8, 32);
@@ -314,15 +314,12 @@ MACHINE_CONFIG_START(bankp_state::bankp)
/* sound hardware */
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("sn1", SN76489, MASTER_CLOCK/6)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
+ SN76489(config, "sn1", MASTER_CLOCK/6).add_route(ALL_OUTPUTS, "mono", 1.0);
- MCFG_DEVICE_ADD("sn2", SN76489, MASTER_CLOCK/6)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
+ SN76489(config, "sn2", MASTER_CLOCK/6).add_route(ALL_OUTPUTS, "mono", 1.0);
- MCFG_DEVICE_ADD("sn3", SN76489, MASTER_CLOCK/6)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
-MACHINE_CONFIG_END
+ SN76489(config, "sn3", MASTER_CLOCK/6).add_route(ALL_OUTPUTS, "mono", 1.0);
+}
diff --git a/src/mame/drivers/barata.cpp b/src/mame/drivers/barata.cpp
index 90e72d01e12..6e3e193ca05 100644
--- a/src/mame/drivers/barata.cpp
+++ b/src/mame/drivers/barata.cpp
@@ -307,7 +307,8 @@ READ8_MEMBER(barata_state::port2_r)
* Machine Drivers *
************************/
-MACHINE_CONFIG_START(barata_state::barata)
+void barata_state::barata(machine_config &config)
+{
/* basic machine hardware */
I8051(config, m_maincpu, CPU_CLOCK);
m_maincpu->port_out_cb<0>().set(FUNC(barata_state::port0_w));
@@ -322,7 +323,7 @@ MACHINE_CONFIG_START(barata_state::barata)
SPEAKER(config, "speaker").front_center();
/* TODO: add sound samples */
-MACHINE_CONFIG_END
+}
/*************************
* Rom Load *
diff --git a/src/mame/drivers/barni.cpp b/src/mame/drivers/barni.cpp
index 98e94382618..ff225775bd8 100644
--- a/src/mame/drivers/barni.cpp
+++ b/src/mame/drivers/barni.cpp
@@ -1,18 +1,18 @@
// license:BSD-3-Clause
// copyright-holders:Ivan Vangelista
// PINBALL
-// Skeleton driver for Barni pinballs. At this time only Red Baron is dumped.
+// Skeleton driver for Barni pinballs.
// Known pinballs to be dumped: Shield (1985)
// Hardware listing and ROM definitions from PinMAME.
/*
- Hardware:
-CPU: 2 x 6809E, optional MC6802 which may replace second 6809E
+ Hardware:
+ CPU: 2 x 6809E, optional MC6802 which may replace second 6809E
INT: IRQ on CPU 0, FIRQ on CPU 1
-IO: 2x PIA 6821
- 1x VIA 6522
-DISPLAY: 5x6 digit 7 or 16 segment display
-SOUND: basically the same as Bally's Squalk & Talk -61 board but missing AY8912 synth chip
+ IO: 2x PIA 6821
+ 1x VIA 6522
+ DISPLAY: 5x6 digit 7 or 16 segment display
+ SOUND: basically the same as Bally's Squalk & Talk -61 board but missing AY8912 synth chip
*/
#include "emu.h"
@@ -62,19 +62,20 @@ void barni_state::audiocpu_map(address_map &map)
static INPUT_PORTS_START( barni )
INPUT_PORTS_END
-MACHINE_CONFIG_START(barni_state::barni)
+void barni_state::barni(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", MC6809E, XTAL(4'000'000) / 4)
- MCFG_DEVICE_PROGRAM_MAP(maincpu_map)
+ MC6809E(config, m_maincpu, XTAL(4'000'000) / 4);
+ m_maincpu->set_addrmap(AS_PROGRAM, &barni_state::maincpu_map);
- MCFG_DEVICE_ADD("subcpu", MC6809E, XTAL(4'000'000) / 4)
- MCFG_DEVICE_PROGRAM_MAP(subcpu_map)
+ mc6809e_device &subcpu(MC6809E(config, "subcpu", XTAL(4'000'000) / 4));
+ subcpu.set_addrmap(AS_PROGRAM, &barni_state::subcpu_map);
- MCFG_DEVICE_ADD("audiocpu", M6802, 4000000) // uses own XTAL, but what is the value?
- MCFG_DEVICE_PROGRAM_MAP(audiocpu_map)
+ m6802_cpu_device &audiocpu(M6802(config, "audiocpu", 4000000)); // uses own XTAL, but what is the value?
+ audiocpu.set_addrmap(AS_PROGRAM, &barni_state::audiocpu_map);
/* video hardware */
- //MCFG_DEFAULT_LAYOUT()
+ //config.set_default_layout();
//6522via
//6821pia
@@ -83,7 +84,26 @@ MACHINE_CONFIG_START(barni_state::barni)
//tmms5220
//dac
genpin_audio(config);
-MACHINE_CONFIG_END
+}
+
+
+/*--------------------------------
+/ Champion 85
+/-------------------------------*/
+ROM_START(champion)
+ ROM_REGION(0x10000, "maincpu", 0)
+ ROM_LOAD("che.bin", 0xe000, 0x2000, CRC(c5dc9228) SHA1(5306980a9c73118cfb843dbce0d56f516d054220))
+ ROM_LOAD("chc.bin", 0xc000, 0x2000, CRC(6ab0f232) SHA1(0638d33f86c62ee93dff924a16a5b9309392d9e8))
+
+ ROM_REGION(0x10000, "subcpu", 0)
+ ROM_LOAD("chan.bin", 0xe000, 0x2000, CRC(3f148587) SHA1(e44dc9cce15830f522dc781aaa13c659a43371f3))
+
+ ROM_REGION(0x10000, "audiocpu", 0)
+ ROM_LOAD("voz1.bin", 0xf000, 0x1000, CRC(48665778) SHA1(c295dfe7f4a98756f508391eb326f37a5aac37ff))
+ ROM_LOAD("voz2.bin", 0xe000, 0x1000, CRC(30e7da5e) SHA1(3054cf9b09e0f89c242e1ad35bb31d9bd77248e4))
+ ROM_LOAD("voz3.bin", 0xd000, 0x1000, CRC(3cd8058e) SHA1(fa4fd0cf4124263d4021c5a86033af9e5aa66eed))
+ ROM_LOAD("voz4.bin", 0xc000, 0x1000, CRC(0d00d8cc) SHA1(10f64d2fc3fc3e276bbd0e108815a3b395dcf0c9))
+ROM_END
/*--------------------------------
@@ -105,4 +125,5 @@ ROM_START(redbarnp)
ROM_END
+GAME( 1985, champion, 0, barni, barni, barni_state, empty_init, ROT0, "Barni", "Champion 85", MACHINE_IS_SKELETON_MECHANICAL )
GAME( 1985, redbarnp, 0, barni, barni, barni_state, empty_init, ROT0, "Barni", "Red Baron (Pinball)", MACHINE_IS_SKELETON_MECHANICAL )
diff --git a/src/mame/drivers/bartop52.cpp b/src/mame/drivers/bartop52.cpp
index 0fd035e6c41..6cfff80a172 100644
--- a/src/mame/drivers/bartop52.cpp
+++ b/src/mame/drivers/bartop52.cpp
@@ -118,7 +118,7 @@ void bartop52_state::machine_reset()
{
atari_common_state::machine_reset();
- m_pokey->write(machine().dummy_space(), 15, 0);
+ m_pokey->write(15, 0);
}
TIMER_DEVICE_CALLBACK_MEMBER( bartop52_state::bartop_interrupt )
diff --git a/src/mame/drivers/batman.cpp b/src/mame/drivers/batman.cpp
index f2d15cb1737..54f76b81007 100644
--- a/src/mame/drivers/batman.cpp
+++ b/src/mame/drivers/batman.cpp
@@ -183,18 +183,18 @@ GFXDECODE_END
*
*************************************/
-MACHINE_CONFIG_START(batman_state::batman)
-
+void batman_state::batman(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M68000, ATARI_CLOCK_14MHz)
- MCFG_DEVICE_PROGRAM_MAP(main_map)
+ M68000(config, m_maincpu, ATARI_CLOCK_14MHz);
+ m_maincpu->set_addrmap(AS_PROGRAM, &batman_state::main_map);
EEPROM_2816(config, "eeprom").lock_after_write(true);
WATCHDOG_TIMER(config, "watchdog");
/* video hardware */
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_batman)
+ GFXDECODE(config, "gfxdecode", "palette", gfx_batman);
PALETTE(config, "palette").set_format(palette_device::IRGB_1555, 2048);
ATARI_VAD(config, m_vad, 0, m_screen);
@@ -204,13 +204,13 @@ MACHINE_CONFIG_START(batman_state::batman)
TILEMAP(config, "vad:alpha", "gfxdecode", 2, 8, 8, TILEMAP_SCAN_ROWS, 64, 32, 0).set_info_callback(DEVICE_SELF_OWNER, FUNC(batman_state::get_alpha_tile_info));
ATARI_MOTION_OBJECTS(config, "vad:mob", 0, m_screen, batman_state::s_mob_config).set_gfxdecode("gfxdecode");
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_VIDEO_ATTRIBUTES(VIDEO_UPDATE_BEFORE_VBLANK)
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_video_attributes(VIDEO_UPDATE_BEFORE_VBLANK);
/* note: these parameters are from published specs, not derived */
/* the board uses a VAD chip to generate video signals */
- MCFG_SCREEN_RAW_PARAMS(ATARI_CLOCK_14MHz/2, 456, 0, 336, 262, 0, 240)
- MCFG_SCREEN_UPDATE_DRIVER(batman_state, screen_update_batman)
- MCFG_SCREEN_PALETTE("palette")
+ m_screen->set_raw(ATARI_CLOCK_14MHz/2, 456, 0, 336, 262, 0, 240);
+ m_screen->set_screen_update(FUNC(batman_state::screen_update_batman));
+ m_screen->set_palette("palette");
/* sound hardware */
SPEAKER(config, "mono").front_center();
@@ -219,7 +219,7 @@ MACHINE_CONFIG_START(batman_state::batman)
m_jsa->main_int_cb().set_inputline(m_maincpu, M68K_IRQ_6);
m_jsa->test_read_cb().set_ioport("260010").bit(6);
m_jsa->add_route(ALL_OUTPUTS, "mono", 1.0);
-MACHINE_CONFIG_END
+}
diff --git a/src/mame/drivers/battlane.cpp b/src/mame/drivers/battlane.cpp
index 0b0ba86ee43..018aa01f1f4 100644
--- a/src/mame/drivers/battlane.cpp
+++ b/src/mame/drivers/battlane.cpp
@@ -274,11 +274,11 @@ void battlane_state::machine_reset()
void battlane_state::battlane(machine_config &config)
{
/* basic machine hardware */
- M6809(config, m_maincpu, 1500000); /* 1.5 MHz ? */
+ M6809(config, m_maincpu, 1500000); /* 1.5 MHz ? */
m_maincpu->set_addrmap(AS_PROGRAM, &battlane_state::battlane_map);
m_maincpu->set_vblank_int("screen", FUNC(battlane_state::battlane_cpu1_interrupt));
- M6809(config, m_subcpu, 1500000); /* 1.5 MHz ? */
+ M6809(config, m_subcpu, 1500000); /* 1.5 MHz ? */
m_subcpu->set_addrmap(AS_PROGRAM, &battlane_state::battlane_map);
config.m_minimum_quantum = attotime::from_hz(6000);
diff --git a/src/mame/drivers/battlera.cpp b/src/mame/drivers/battlera.cpp
index 0151c326346..66bf74e0a6e 100644
--- a/src/mame/drivers/battlera.cpp
+++ b/src/mame/drivers/battlera.cpp
@@ -108,6 +108,7 @@ void battlera_state::machine_reset()
{
m_control_port_select = 0;
m_msm5205next = 0;
+ m_toggle = 0;
}
/******************************************************************************/
@@ -156,7 +157,8 @@ WRITE_LINE_MEMBER(battlera_state::adpcm_int)
m_msm->write_data(m_msm5205next >> 4);
m_msm5205next <<= 4;
- if (state)
+ m_toggle = 1 - m_toggle;
+ if (m_toggle)
m_audiocpu->set_input_line(1, HOLD_LINE);
}
@@ -295,7 +297,7 @@ void battlera_state::battlera(machine_config &config)
YM2203(config, "ymsnd", 12000000 / 8).add_route(ALL_OUTPUTS, "mono", 0.40);
MSM5205(config, m_msm, 384000);
- m_msm->vck_callback().set(FUNC(battlera_state::adpcm_int));
+ m_msm->vck_legacy_callback().set(FUNC(battlera_state::adpcm_int));
m_msm->set_prescaler_selector(msm5205_device::S48_4B); /* 8KHz */
m_msm->add_route(ALL_OUTPUTS, "mono", 0.85);
}
diff --git a/src/mame/drivers/battlex.cpp b/src/mame/drivers/battlex.cpp
index 5d8377e2d67..da2d2a9f05d 100644
--- a/src/mame/drivers/battlex.cpp
+++ b/src/mame/drivers/battlex.cpp
@@ -291,42 +291,42 @@ void battlex_state::machine_reset()
m_in0_b4 = 0;
}
-MACHINE_CONFIG_START(battlex_state::battlex)
-
+void battlex_state::battlex(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80,XTAL(10'000'000)/4 ) // ?
- MCFG_DEVICE_PROGRAM_MAP(battlex_map)
- MCFG_DEVICE_IO_MAP(io_map)
- MCFG_DEVICE_PERIODIC_INT_DRIVER(battlex_state, battlex_interrupt, 400) /* controls game speed? */
+ Z80(config, m_maincpu, XTAL(10'000'000)/4 ); // ?
+ m_maincpu->set_addrmap(AS_PROGRAM, &battlex_state::battlex_map);
+ m_maincpu->set_addrmap(AS_IO, &battlex_state::io_map);
+ m_maincpu->set_periodic_int(FUNC(battlex_state::battlex_interrupt), attotime::from_hz(400)); /* controls game speed? */
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(32*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(battlex_state, screen_update_battlex)
- MCFG_SCREEN_PALETTE("palette")
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(32*8, 32*8);
+ screen.set_visarea(0*8, 32*8-1, 2*8, 30*8-1);
+ screen.set_screen_update(FUNC(battlex_state::screen_update_battlex));
+ screen.set_palette(m_palette);
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_battlex)
- MCFG_PALETTE_ADD("palette", 64 + 128)
+ GFXDECODE(config, m_gfxdecode, m_palette, gfx_battlex);
+ PALETTE(config, m_palette).set_entries(64 + 128);
/* sound hardware */
SPEAKER(config, "mono").front_center();
AY8910(config, "ay1", XTAL(10'000'000)/8).add_route(ALL_OUTPUTS, "mono", 0.40); // ?
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(battlex_state::dodgeman)
+void battlex_state::dodgeman(machine_config &config)
+{
battlex(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_IO_MAP(dodgeman_io_map)
+ m_maincpu->set_addrmap(AS_IO, &battlex_state::dodgeman_io_map);
MCFG_VIDEO_START_OVERRIDE(battlex_state, dodgeman)
AY8910(config, "ay2", XTAL(10'000'000)/8).add_route(ALL_OUTPUTS, "mono", 0.40); // ?
-MACHINE_CONFIG_END
+}
/*************************************
diff --git a/src/mame/drivers/battlnts.cpp b/src/mame/drivers/battlnts.cpp
index 63108a148de..10af6e61f14 100644
--- a/src/mame/drivers/battlnts.cpp
+++ b/src/mame/drivers/battlnts.cpp
@@ -231,26 +231,26 @@ void battlnts_state::machine_reset()
m_spritebank = 0;
}
-MACHINE_CONFIG_START(battlnts_state::battlnts)
-
+void battlnts_state::battlnts(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", HD6309, XTAL(24'000'000) / 2 /* 3000000*4? */)
- MCFG_DEVICE_PROGRAM_MAP(battlnts_map)
+ HD6309(config, m_maincpu, XTAL(24'000'000) / 2 /* 3000000*4? */);
+ m_maincpu->set_addrmap(AS_PROGRAM, &battlnts_state::battlnts_map);
- MCFG_DEVICE_ADD("audiocpu", Z80, XTAL(24'000'000) / 6 /* 3579545? */)
- MCFG_DEVICE_PROGRAM_MAP(battlnts_sound_map)
+ Z80(config, m_audiocpu, XTAL(24'000'000) / 6 /* 3579545? */);
+ m_audiocpu->set_addrmap(AS_PROGRAM, &battlnts_state::battlnts_sound_map);
WATCHDOG_TIMER(config, "watchdog");
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(32*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(battlnts_state, screen_update_battlnts)
- MCFG_SCREEN_PALETTE("palette")
- MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE(*this, battlnts_state, vblank_irq))
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(32*8, 32*8);
+ screen.set_visarea(0*8, 32*8-1, 2*8, 30*8-1);
+ screen.set_screen_update(FUNC(battlnts_state::screen_update_battlnts));
+ screen.set_palette("palette");
+ screen.screen_vblank().set(FUNC(battlnts_state::vblank_irq));
GFXDECODE(config, m_gfxdecode, "palette", gfx_battlnts);
PALETTE(config, "palette").set_format(palette_device::xBGR_555, 128);
@@ -270,12 +270,10 @@ MACHINE_CONFIG_START(battlnts_state::battlnts)
GENERIC_LATCH_8(config, "soundlatch");
- MCFG_DEVICE_ADD("ym1", YM3812, XTAL(24'000'000) / 8)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
+ YM3812(config, "ym1", XTAL(24'000'000) / 8).add_route(ALL_OUTPUTS, "mono", 1.0);
- MCFG_DEVICE_ADD("ym2", YM3812, XTAL(24'000'000) / 8)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
-MACHINE_CONFIG_END
+ YM3812(config, "ym2", XTAL(24'000'000) / 8).add_route(ALL_OUTPUTS, "mono", 1.0);
+}
/*************************************
diff --git a/src/mame/drivers/bbc.cpp b/src/mame/drivers/bbc.cpp
index 3452810516c..581ccc03efe 100644
--- a/src/mame/drivers/bbc.cpp
+++ b/src/mame/drivers/bbc.cpp
@@ -907,14 +907,10 @@ void bbc_state::bbca(machine_config &config)
m_via6522_0->irq_handler().set(m_irqs, FUNC(input_merger_device::in_w<1>));
/* eprom sockets */
- GENERIC_SOCKET(config, m_rom[12], generic_linear_slot, "bbc_rom", "bin,rom"); /* ic101 */
- m_rom[12]->set_device_load(device_image_load_delegate(&bbc_state::device_image_load_romc, this));
- GENERIC_SOCKET(config, m_rom[13], generic_linear_slot, "bbc_rom", "bin,rom"); /* ic100 */
- m_rom[13]->set_device_load(device_image_load_delegate(&bbc_state::device_image_load_romd, this));
- GENERIC_SOCKET(config, m_rom[14], generic_linear_slot, "bbc_rom", "bin,rom"); /* ic88 */
- m_rom[14]->set_device_load(device_image_load_delegate(&bbc_state::device_image_load_rome, this));
- GENERIC_SOCKET(config, m_rom[15], generic_linear_slot, "bbc_rom", "bin,rom"); /* ic52 */
- m_rom[15]->set_device_load(device_image_load_delegate(&bbc_state::device_image_load_romf, this));
+ BBC_ROMSLOT16(config, m_rom[0x0c], bbc_rom_devices, nullptr); /* ic101 */
+ BBC_ROMSLOT16(config, m_rom[0x0d], bbc_rom_devices, nullptr); /* ic100 */
+ BBC_ROMSLOT16(config, m_rom[0x0e], bbc_rom_devices, nullptr); /* ic88 */
+ BBC_ROMSLOT16(config, m_rom[0x0f], bbc_rom_devices, nullptr); /* ic52 */
/* software lists */
SOFTWARE_LIST(config, "cass_ls_a").set_original("bbca_cass");
@@ -950,7 +946,7 @@ void bbc_state::bbcb(machine_config &config)
m_via6522_1->irq_handler().set(m_irqs, FUNC(input_merger_device::in_w<2>));
/* adc */
- UPD7002(config, m_upd7002, 0);
+ UPD7002(config, m_upd7002, 16_MHz_XTAL / 16);
m_upd7002->set_get_analogue_callback(FUNC(bbc_state::get_analogue_input), this);
m_upd7002->set_eoc_callback(FUNC(bbc_state::upd7002_eoc), this);
@@ -1050,7 +1046,7 @@ void bbc_state::bbcb_us(machine_config &config)
FLOPPY_CONNECTOR(config, "i8271:1", bbc_floppies, "525qd", bbc_state::floppy_formats).enable_sound(true);
/* software lists */
- SOFTWARE_LIST(config, "flop_ls_b_us").set_original("bbcb_cass_us");
+ SOFTWARE_LIST(config, "flop_ls_b_us").set_original("bbcb_flop_us");
}
@@ -1133,16 +1129,11 @@ void bbcbp_state::bbcbp(machine_config &config)
FLOPPY_CONNECTOR(config, "wd1770:1", bbc_floppies, "525qd", bbc_state::floppy_formats).enable_sound(true);
/* eprom sockets */
- GENERIC_SOCKET(config, m_rom[2], generic_linear_slot, "bbc_rom", "bin,rom"); /* ic35 */
- m_rom[2]->set_device_load(device_image_load_delegate(&bbc_state::device_image_load_rom23, this));
- GENERIC_SOCKET(config, m_rom[4], generic_linear_slot, "bbc_rom", "bin,rom"); /* ic44 */
- m_rom[4]->set_device_load(device_image_load_delegate(&bbc_state::device_image_load_rom45, this));
- GENERIC_SOCKET(config, m_rom[6], generic_linear_slot, "bbc_rom", "bin,rom"); /* ic57 */
- m_rom[6]->set_device_load(device_image_load_delegate(&bbc_state::device_image_load_rom67, this));
- GENERIC_SOCKET(config, m_rom[8], generic_linear_slot, "bbc_rom", "bin,rom"); /* ic62 */
- m_rom[8]->set_device_load(device_image_load_delegate(&bbc_state::device_image_load_rom89, this));
- GENERIC_SOCKET(config, m_rom[10], generic_linear_slot, "bbc_rom", "bin,rom"); /* ic68 */
- m_rom[10]->set_device_load(device_image_load_delegate(&bbc_state::device_image_load_romab, this));
+ BBC_ROMSLOT32(config, m_rom[0x02], bbc_rom_devices, nullptr); /* ic35 */
+ BBC_ROMSLOT32(config, m_rom[0x04], bbc_rom_devices, nullptr); /* ic44 */
+ BBC_ROMSLOT32(config, m_rom[0x06], bbc_rom_devices, nullptr); /* ic57 */
+ BBC_ROMSLOT32(config, m_rom[0x08], bbc_rom_devices, nullptr); /* ic62 */
+ BBC_ROMSLOT32(config, m_rom[0x0a], bbc_rom_devices, nullptr); /* ic68 */
config.device_remove("romslot12");
config.device_remove("romslot13");
config.device_remove("romslot14");
@@ -1410,7 +1401,7 @@ void bbcm_state::bbcm(machine_config &config)
m_acia_clock->signal_handler().set(FUNC(bbc_state::write_acia_clock));
/* adc */
- UPD7002(config, m_upd7002, 0);
+ UPD7002(config, m_upd7002, 16_MHz_XTAL / 16);
m_upd7002->set_get_analogue_callback(FUNC(bbc_state::get_analogue_input), this);
m_upd7002->set_eoc_callback(FUNC(bbc_state::upd7002_eoc), this);
@@ -1479,12 +1470,9 @@ void bbcm_state::bbcm(machine_config &config)
m_cart[1]->set_device_load(device_image_load_delegate(&bbc_state::device_image_load_cart2, this));
/* eprom sockets */
- GENERIC_SOCKET(config, m_rom[8], generic_linear_slot, "bbc_rom", "bin,rom"); /* ic27 */
- m_rom[8]->set_device_load(device_image_load_delegate(&bbc_state::device_image_load_rom8, this));
- GENERIC_SOCKET(config, m_rom[4], generic_linear_slot, "bbc_rom", "bin,rom"); /* ic41 */
- m_rom[4]->set_device_load(device_image_load_delegate(&bbc_state::device_image_load_rom45, this));
- GENERIC_SOCKET(config, m_rom[6], generic_linear_slot, "bbc_rom", "bin,rom"); /* ic37 */
- m_rom[6]->set_device_load(device_image_load_delegate(&bbc_state::device_image_load_rom67, this));
+ BBC_ROMSLOT16(config, m_rom[0x08], bbc_rom_devices, nullptr); /* ic27 */
+ BBC_ROMSLOT32(config, m_rom[0x04], bbc_rom_devices, nullptr); /* ic41 */
+ BBC_ROMSLOT32(config, m_rom[0x06], bbc_rom_devices, nullptr); /* ic37 */
/* software lists */
SOFTWARE_LIST(config, "cass_ls_m").set_original("bbcm_cass");
@@ -1686,14 +1674,13 @@ void bbcm_state::bbcmc(machine_config &config)
config.device_remove("cartslot2");
/* eprom sockets */
- GENERIC_SOCKET(config, m_rom[2], generic_linear_slot, "bbc_rom", "bin,rom"); /* ic23 */
- m_rom[2]->set_device_load(device_image_load_delegate(&bbc_state::device_image_load_rom2, this));
- GENERIC_SOCKET(config, m_rom[3], generic_linear_slot, "bbc_rom", "bin,rom"); /* ic17 */
- m_rom[3]->set_device_load(device_image_load_delegate(&bbc_state::device_image_load_rom3, this));
- GENERIC_SOCKET(config, m_rom[0], generic_linear_slot, "bbc_rom", "bin,rom"); /* ic38 */
- m_rom[0]->set_device_load(device_image_load_delegate(&bbc_state::device_image_load_rom01, this));
config.device_remove("romslot4");
config.device_remove("romslot6");
+ config.device_remove("romslot8");
+ BBC_ROMSLOT16(config, m_rom[0x03], bbc_rom_devices, nullptr); /* ic17 */
+ BBC_ROMSLOT16(config, m_rom[0x02], bbc_rom_devices, nullptr); /* ic23 */
+ BBC_ROMSLOT32(config, m_rom[0x00], bbc_rom_devices, nullptr); /* ic38 */
+ BBC_ROMSLOT16(config, m_rom[0x08], bbc_rom_devices, nullptr); /* ic29 */
/* software lists */
SOFTWARE_LIST(config, "flop_ls_mc").set_original("bbcmc_flop");
diff --git a/src/mame/drivers/bbcbc.cpp b/src/mame/drivers/bbcbc.cpp
index 005ac12cd9b..dabea1029f1 100644
--- a/src/mame/drivers/bbcbc.cpp
+++ b/src/mame/drivers/bbcbc.cpp
@@ -82,8 +82,7 @@ void bbcbc_state::io_map(address_map &map)
[this](address_space &space, offs_t offset, u8 data, u8 mem_mask) {
m_z80pio->write(space, offset >> 5, data, mem_mask);
});
- map(0x80, 0x80).rw("tms9129", FUNC(tms9129_device::vram_r), FUNC(tms9129_device::vram_w));
- map(0x81, 0x81).rw("tms9129", FUNC(tms9129_device::register_r), FUNC(tms9129_device::register_w));
+ map(0x80, 0x81).rw("tms9129", FUNC(tms9129_device::read), FUNC(tms9129_device::write));
}
// Input bits are read through the PIO four at a time, then stored individually in RAM at E030-E03B
@@ -118,7 +117,8 @@ static const z80_daisy_config bbcbc_daisy_chain[] =
};
-MACHINE_CONFIG_START(bbcbc_state::bbcbc)
+void bbcbc_state::bbcbc(machine_config &config)
+{
Z80(config, m_maincpu, 10.6875_MHz_XTAL / 3);
m_maincpu->set_addrmap(AS_PROGRAM, &bbcbc_state::mem_map);
m_maincpu->set_addrmap(AS_IO, &bbcbc_state::io_map);
@@ -136,9 +136,9 @@ MACHINE_CONFIG_START(bbcbc_state::bbcbc)
SCREEN(config, "screen", SCREEN_TYPE_RASTER);
// Software on ROM cartridges
- MCFG_GENERIC_CARTSLOT_ADD("cartslot", generic_plain_slot, "bbcbc_cart")
- MCFG_SOFTWARE_LIST_ADD("cart_list","bbcbc")
-MACHINE_CONFIG_END
+ GENERIC_CARTSLOT(config, "cartslot", generic_plain_slot, "bbcbc_cart");
+ SOFTWARE_LIST(config, "cart_list").set_original("bbcbc");
+}
void bbcbc_state::machine_start()
diff --git a/src/mame/drivers/bcs3.cpp b/src/mame/drivers/bcs3.cpp
index 7e7fbca8d44..f9d9f12cc8a 100644
--- a/src/mame/drivers/bcs3.cpp
+++ b/src/mame/drivers/bcs3.cpp
@@ -384,8 +384,8 @@ void bcs3_state::init_bcs3d()
s_cols = 29;
}
-MACHINE_CONFIG_START(bcs3_state::bcs3)
-
+void bcs3_state::bcs3(machine_config &config)
+{
/* basic machine hardware */
Z80(config, m_maincpu, XTAL(5'000'000) /2);
m_maincpu->set_addrmap(AS_PROGRAM, &bcs3_state::bcs3_mem);
@@ -393,14 +393,14 @@ MACHINE_CONFIG_START(bcs3_state::bcs3)
m_maincpu->set_daisy_config(daisy_chain_intf);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(50)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */
- MCFG_SCREEN_SIZE(28*8, 12*10)
- MCFG_SCREEN_VISIBLE_AREA(0,28*8-1,0,12*10-1)
- MCFG_SCREEN_UPDATE_DRIVER(bcs3_state, screen_update_bcs3)
- MCFG_SCREEN_PALETTE("palette")
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_bcs3)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(50);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */
+ screen.set_size(28*8, 12*10);
+ screen.set_visarea_full();
+ screen.set_screen_update(FUNC(bcs3_state::screen_update_bcs3));
+ screen.set_palette("palette");
+ GFXDECODE(config, "gfxdecode", "palette", gfx_bcs3);
PALETTE(config, "palette", palette_device::MONOCHROME);
Z80CTC(config, m_ctc, XTAL(5'000'000) / 2);
@@ -408,11 +408,11 @@ MACHINE_CONFIG_START(bcs3_state::bcs3)
m_ctc->zc_callback<0>().set(FUNC(bcs3_state::ctc_z0_w));
m_ctc->zc_callback<1>().set(FUNC(bcs3_state::ctc_z1_w));
- MCFG_CASSETTE_ADD( "cassette" )
-MACHINE_CONFIG_END
-
-MACHINE_CONFIG_START(bcs3_state::bcs3a)
+ CASSETTE(config, m_cass);
+}
+void bcs3_state::bcs3a(machine_config &config)
+{
/* basic machine hardware */
Z80(config, m_maincpu, XTAL(7'000'000) /2);
m_maincpu->set_addrmap(AS_PROGRAM, &bcs3_state::bcs3a_mem);
@@ -420,14 +420,14 @@ MACHINE_CONFIG_START(bcs3_state::bcs3a)
m_maincpu->set_daisy_config(daisy_chain_intf);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(50)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */
- MCFG_SCREEN_SIZE(29*8, 12*10)
- MCFG_SCREEN_VISIBLE_AREA(0,29*8-1,0,12*10-1)
- MCFG_SCREEN_UPDATE_DRIVER(bcs3_state, screen_update_bcs3a)
- MCFG_SCREEN_PALETTE("palette")
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_bcs3)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(50);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */
+ screen.set_size(29*8, 12*10);
+ screen.set_visarea_full();
+ screen.set_screen_update(FUNC(bcs3_state::screen_update_bcs3a));
+ screen.set_palette("palette");
+ GFXDECODE(config, "gfxdecode", "palette", gfx_bcs3);
PALETTE(config, "palette", palette_device::MONOCHROME);
Z80CTC(config, m_ctc, XTAL(7'000'000) / 2);
@@ -435,15 +435,15 @@ MACHINE_CONFIG_START(bcs3_state::bcs3a)
m_ctc->zc_callback<0>().set(FUNC(bcs3_state::ctc_z0_w));
m_ctc->zc_callback<1>().set(FUNC(bcs3_state::ctc_z1_w));
- MCFG_CASSETTE_ADD( "cassette" )
-MACHINE_CONFIG_END
+ CASSETTE(config, m_cass);
+}
-MACHINE_CONFIG_START(bcs3_state::bcs3b)
+void bcs3_state::bcs3b(machine_config &config)
+{
bcs3a(config);
- MCFG_SCREEN_MODIFY("screen")
- MCFG_SCREEN_SIZE(40*8, 24*10)
- MCFG_SCREEN_VISIBLE_AREA(0,40*8-1,0,24*10-1)
-MACHINE_CONFIG_END
+ subdevice<screen_device>("screen")->set_size(40*8, 24*10);
+ subdevice<screen_device>("screen")->set_visarea(0, 40*8-1, 0, 24*10-1);
+}
/* ROM definition */
diff --git a/src/mame/drivers/beaminv.cpp b/src/mame/drivers/beaminv.cpp
index 4648b557265..3de767c935e 100644
--- a/src/mame/drivers/beaminv.cpp
+++ b/src/mame/drivers/beaminv.cpp
@@ -340,22 +340,21 @@ INPUT_PORTS_END
*
*************************************/
-MACHINE_CONFIG_START(beaminv_state::beaminv)
-
+void beaminv_state::beaminv(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, 2000000) /* 2 MHz ? */
- MCFG_DEVICE_PROGRAM_MAP(main_map)
- MCFG_DEVICE_IO_MAP(main_io_map)
+ Z80(config, m_maincpu, 2000000); /* 2 MHz ? */
+ m_maincpu->set_addrmap(AS_PROGRAM, &beaminv_state::main_map);
+ m_maincpu->set_addrmap(AS_IO, &beaminv_state::main_io_map);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_SIZE(256, 256)
- MCFG_SCREEN_VISIBLE_AREA(0, 247, 16, 231)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_UPDATE_DRIVER(beaminv_state, screen_update_beaminv)
-
-MACHINE_CONFIG_END
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_size(256, 256);
+ m_screen->set_visarea(0, 247, 16, 231);
+ m_screen->set_refresh_hz(60);
+ m_screen->set_screen_update(FUNC(beaminv_state::screen_update_beaminv));
+}
diff --git a/src/mame/drivers/beathead.cpp b/src/mame/drivers/beathead.cpp
index 23456f11fdc..e5590015a80 100644
--- a/src/mame/drivers/beathead.cpp
+++ b/src/mame/drivers/beathead.cpp
@@ -333,26 +333,26 @@ INPUT_PORTS_END
*
*************************************/
-MACHINE_CONFIG_START(beathead_state::beathead)
-
+void beathead_state::beathead(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", ASAP, ATARI_CLOCK_14MHz)
- MCFG_DEVICE_PROGRAM_MAP(main_map)
+ ASAP(config, m_maincpu, ATARI_CLOCK_14MHz);
+ m_maincpu->set_addrmap(AS_PROGRAM, &beathead_state::main_map);
EEPROM_2804(config, "eeprom").lock_after_write(true);
WATCHDOG_TIMER(config, "watchdog");
- MCFG_TIMER_DRIVER_ADD(m_scan_timer, beathead_state, scanline_callback)
+ TIMER(config, m_scan_timer).configure_generic(FUNC(beathead_state::scanline_callback));
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_VIDEO_ATTRIBUTES(VIDEO_UPDATE_BEFORE_VBLANK)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_UPDATE_DRIVER(beathead_state, screen_update)
- MCFG_SCREEN_SIZE(42*8, 262)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 42*8-1, 0*8, 30*8-1)
- MCFG_SCREEN_PALETTE(m_palette)
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_video_attributes(VIDEO_UPDATE_BEFORE_VBLANK);
+ m_screen->set_refresh_hz(60);
+ m_screen->set_screen_update(FUNC(beathead_state::screen_update));
+ m_screen->set_size(42*8, 262);
+ m_screen->set_visarea(0*8, 42*8-1, 0*8, 30*8-1);
+ m_screen->set_palette(m_palette);
PALETTE(config, m_palette);
m_palette->set_format(palette_device::IRGB_1555, 32768);
@@ -364,7 +364,7 @@ MACHINE_CONFIG_START(beathead_state::beathead)
ATARI_JSA_III(config, m_jsa, 0);
m_jsa->test_read_cb().set_ioport("IN2").bit(6);
m_jsa->add_route(ALL_OUTPUTS, "mono", 1.0);
-MACHINE_CONFIG_END
+}
diff --git a/src/mame/drivers/bebox.cpp b/src/mame/drivers/bebox.cpp
index 7a8d888907a..c73482722b8 100644
--- a/src/mame/drivers/bebox.cpp
+++ b/src/mame/drivers/bebox.cpp
@@ -28,8 +28,8 @@
#include "formats/pc_dsk.h"
#include "machine/8042kbdc.h"
-READ8_MEMBER(bebox_state::at_dma8237_1_r) { return m_dma8237[1]->read(space, offset / 2); }
-WRITE8_MEMBER(bebox_state::at_dma8237_1_w) { m_dma8237[1]->write(space, offset / 2, data); }
+READ8_MEMBER(bebox_state::at_dma8237_1_r) { return m_dma8237[1]->read(offset / 2); }
+WRITE8_MEMBER(bebox_state::at_dma8237_1_w) { m_dma8237[1]->write(offset / 2, data); }
void bebox_state::main_mem(address_map &map)
{
@@ -117,8 +117,9 @@ FLOPPY_FORMATS_END
void bebox_state::mpc105_config(device_t *device)
{
- MCFG_MPC105_CPU( "ppc1" )
- MCFG_MPC105_BANK_BASE_DEFAULT( 0 )
+ mpc105_device &mpc105 = *downcast<mpc105_device *>(device);
+ mpc105.set_cpu(":ppc1");
+ mpc105.set_bank_base_default(0);
}
/*************************************
@@ -220,7 +221,7 @@ void bebox_state::bebox_peripherals(machine_config &config)
pcislot0.set_option_machine_config("mpc105", mpc105_config);
add_pci_slot(config, "pcibus:1", 1, "cirrus");
- /*MCFG_PCI_BUS_DEVICE(12, nullptr, scsi53c810_pci_read, scsi53c810_pci_write)*/
+ /*MCFG_PCI_BUS_LEGACY_DEVICE(12, nullptr, scsi53c810_pci_read, scsi53c810_pci_write)*/
SMC37C78(config, m_smc37c78, 24'000'000);
m_smc37c78->intrq_wr_callback().set(FUNC(bebox_state::fdc_interrupt));
diff --git a/src/mame/drivers/beehive.cpp b/src/mame/drivers/beehive.cpp
index 9d5983ff196..deb24a5ef15 100644
--- a/src/mame/drivers/beehive.cpp
+++ b/src/mame/drivers/beehive.cpp
@@ -291,23 +291,24 @@ uint32_t beehive_state::screen_update(screen_device &screen, bitmap_ind16 &bitma
return 0;
}
-MACHINE_CONFIG_START(beehive_state::beehive)
+void beehive_state::beehive(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu",I8085A, XTAL(4'000'000))
- MCFG_DEVICE_PROGRAM_MAP(beehive_mem)
- MCFG_DEVICE_IO_MAP(beehive_io)
+ I8085A(config, m_maincpu, XTAL(4'000'000));
+ m_maincpu->set_addrmap(AS_PROGRAM, &beehive_state::beehive_mem);
+ m_maincpu->set_addrmap(AS_IO, &beehive_state::beehive_io);
/* video hardware */
- MCFG_SCREEN_ADD_MONOCHROME("screen", RASTER, rgb_t::green())
- MCFG_SCREEN_REFRESH_RATE(50)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */
- MCFG_SCREEN_UPDATE_DRIVER(beehive_state, screen_update)
- MCFG_SCREEN_SIZE(640, 250)
- MCFG_SCREEN_VISIBLE_AREA(0, 639, 0, 249)
- MCFG_SCREEN_PALETTE("palette")
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER, rgb_t::green()));
+ screen.set_refresh_hz(50);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */
+ screen.set_screen_update(FUNC(beehive_state::screen_update));
+ screen.set_size(640, 250);
+ screen.set_visarea(0, 639, 0, 249);
+ screen.set_palette("palette");
PALETTE(config, "palette", palette_device::MONOCHROME);
-MACHINE_CONFIG_END
+}
/* ROM definition */
ROM_START( beehive )
diff --git a/src/mame/drivers/beezer.cpp b/src/mame/drivers/beezer.cpp
index 12eedb3a903..c8c7b38e165 100644
--- a/src/mame/drivers/beezer.cpp
+++ b/src/mame/drivers/beezer.cpp
@@ -278,9 +278,9 @@ void beezer_state::palette_init(palette_device &device)
WRITE8_MEMBER( beezer_state::palette_w )
{
- int r = combine_3_weights(m_weights_r, BIT(data, 0), BIT(data, 1), BIT(data, 2));
- int g = combine_3_weights(m_weights_g, BIT(data, 3), BIT(data, 4), BIT(data, 5));
- int b = combine_2_weights(m_weights_b, BIT(data, 6), BIT(data, 7));
+ int r = combine_weights(m_weights_r, BIT(data, 0), BIT(data, 1), BIT(data, 2));
+ int g = combine_weights(m_weights_g, BIT(data, 3), BIT(data, 4), BIT(data, 5));
+ int b = combine_weights(m_weights_b, BIT(data, 6), BIT(data, 7));
m_palette->set_pen_color(offset, rgb_t(r, g, b));
}
diff --git a/src/mame/drivers/belatra.cpp b/src/mame/drivers/belatra.cpp
index 3f36955692a..39b3855f32c 100644
--- a/src/mame/drivers/belatra.cpp
+++ b/src/mame/drivers/belatra.cpp
@@ -70,14 +70,15 @@ void belatra_state::belatra_map(address_map &map)
static INPUT_PORTS_START( belatra )
INPUT_PORTS_END
-MACHINE_CONFIG_START(belatra_state::belatra)
- MCFG_DEVICE_ADD("maincpu", ARM7, 54000000) // guess...
- MCFG_DEVICE_PROGRAM_MAP(belatra_map)
+void belatra_state::belatra(machine_config &config)
+{
+ ARM7(config, m_maincpu, 54000000); // guess...
+ m_maincpu->set_addrmap(AS_PROGRAM, &belatra_state::belatra_map);
SPEAKER(config, "lspeaker").front_left();
SPEAKER(config, "rspeaker").front_right();
/* unknown sound */
-MACHINE_CONFIG_END
+}
ROM_START( merryjn )
diff --git a/src/mame/drivers/bert.cpp b/src/mame/drivers/bert.cpp
new file mode 100644
index 00000000000..5e279573349
--- /dev/null
+++ b/src/mame/drivers/bert.cpp
@@ -0,0 +1,121 @@
+// license:BSD-3-Clause
+// copyright-holders:AJR
+/*******************************************************************************
+
+ BERT apparently stands for "Basic Einplatinen Rechner für TV-Serie." It is
+ a small educational single-board computer manufactured by the West German
+ firm Thomsen-Elektronik, based on the Z8671 microcontroller with a built-in
+ BASIC/DEBUG ROM.
+
+ Besides a 5-pin DIN connector for the terminal or PC, the board makes four
+ generic input and/or output ports available to the user through pin headers.
+ The first two ports, including the fully bidirectional port A, are directly
+ wired to the processor. Two other ports are read or written through memory-
+ mapped latches, and a fifth port represents the onboard DIP switches.
+
+*******************************************************************************/
+
+#include "emu.h"
+#include "bus/rs232/rs232.h"
+#include "cpu/z8/z8.h"
+#include "machine/ram.h"
+
+class bert_state : public driver_device
+{
+public:
+ bert_state(const machine_config &mconfig, device_type type, const char *tag)
+ : driver_device(mconfig, type, tag)
+ , m_mpu(*this, "mpu")
+ , m_ram(*this, RAM_TAG)
+ , m_serial(*this, "serial")
+ {
+ }
+
+ void bert(machine_config &config);
+
+protected:
+ virtual void machine_start() override;
+
+private:
+ void portb_w(u8 data);
+ void portd_w(u8 data);
+
+ void mem_map(address_map &map);
+
+ required_device<z8_device> m_mpu;
+ required_device<ram_device> m_ram;
+ required_device<rs232_port_device> m_serial;
+};
+
+void bert_state::machine_start()
+{
+ m_mpu->space(AS_PROGRAM).install_ram(0x2000, 0x2000 + m_ram->size() - 1, 0x8000, m_ram->pointer());
+}
+
+void bert_state::portb_w(u8 data)
+{
+ m_serial->write_txd(BIT(data, 7));
+}
+
+void bert_state::portd_w(u8 data)
+{
+}
+
+void bert_state::mem_map(address_map &map)
+{
+ // A15 (P07) is only decoded internally
+ map(0x0800, 0x0fff).mirror(0x8000).noprw();
+ map(0x1000, 0x1fff).mirror(0x8000).rom().region("eprom", 0).nopw(); // 2732
+ map(0x5000, 0x5000).mirror(0x8fff).portr("PORTC"); // 74LS373
+ map(0x6000, 0x6000).mirror(0x8fff).w(FUNC(bert_state::portd_w)); // 74LS373
+ map(0x7000, 0x7000).mirror(0x8fff).portr("PORTE"); // 74LS368
+}
+
+static INPUT_PORTS_START(bert)
+ PORT_START("PORTA")
+ PORT_BIT(0xff, IP_ACTIVE_LOW, IPT_UNKNOWN)
+
+ PORT_START("PORTC")
+ PORT_BIT(0xff, IP_ACTIVE_LOW, IPT_UNKNOWN)
+
+ PORT_START("PORTE")
+ PORT_DIPNAME(0x07, 0x02, "Baud Rate") PORT_DIPLOCATION("E:!1,!2,!3")
+ PORT_DIPSETTING(0x06, "110")
+ PORT_DIPSETTING(0x00, "150")
+ PORT_DIPSETTING(0x07, "300")
+ PORT_DIPSETTING(0x05, "1200")
+ PORT_DIPSETTING(0x04, "2400")
+ PORT_DIPSETTING(0x03, "4800")
+ PORT_DIPSETTING(0x02, "9600")
+ PORT_DIPSETTING(0x01, "19200")
+ PORT_DIPNAME(0x08, 0x00, DEF_STR(Unused)) PORT_DIPLOCATION("E:!4")
+ PORT_DIPSETTING(0x00, DEF_STR(Off))
+ PORT_DIPSETTING(0x08, DEF_STR(On))
+ PORT_DIPNAME(0x10, 0x00, DEF_STR(Unused)) PORT_DIPLOCATION("E:!5")
+ PORT_DIPSETTING(0x00, DEF_STR(Off))
+ PORT_DIPSETTING(0x10, DEF_STR(On))
+ PORT_DIPNAME(0x20, 0x00, DEF_STR(Unused)) PORT_DIPLOCATION("E:!6")
+ PORT_DIPSETTING(0x00, DEF_STR(Off))
+ PORT_DIPSETTING(0x20, DEF_STR(On))
+ PORT_BIT(0xc0, IP_ACTIVE_LOW, IPT_UNUSED)
+INPUT_PORTS_END
+
+void bert_state::bert(machine_config &config)
+{
+ Z8671(config, m_mpu, 7.3728_MHz_XTAL);
+ m_mpu->set_addrmap(AS_PROGRAM, &bert_state::mem_map);
+ m_mpu->p2_in_cb().set_ioport("PORTA");
+ m_mpu->p3_out_cb().set(FUNC(bert_state::portb_w));
+
+ RAM(config, m_ram).set_default_size("2K").set_extra_options("4K"); // two 6116 sockets
+
+ RS232_PORT(config, m_serial, default_rs232_devices, "terminal"); // TTL-level, not EIA/CCITT ±12V
+ m_serial->rxd_handler().set_inputline(m_mpu, INPUT_LINE_IRQ3).invert(); // no actual inverter
+}
+
+ROM_START(bert)
+ ROM_REGION(0x1000, "eprom", 0)
+ ROM_LOAD("bert.bin", 0x0000, 0x1000, CRC(52ece0e7) SHA1(d39cc9b6248547cfa8fd49d43532abf9399348a5))
+ROM_END
+
+COMP(1987, bert, 0, 0, bert, bert, bert_state, empty_init, "VGS Verlagsgesellschaft", "BERT", MACHINE_NOT_WORKING | MACHINE_NO_SOUND_HW)
diff --git a/src/mame/drivers/berzerk.cpp b/src/mame/drivers/berzerk.cpp
index ad462685c16..18cde8158e8 100644
--- a/src/mame/drivers/berzerk.cpp
+++ b/src/mame/drivers/berzerk.cpp
@@ -476,9 +476,9 @@ void berzerk_state::get_pens(rgb_t *pens)
uint8_t b_bit = (color >> 2) & 0x01;
uint8_t i_bit = (color >> 3) & 0x01;
- uint8_t r = combine_2_weights(color_weights, r_bit & i_bit, r_bit);
- uint8_t g = combine_2_weights(color_weights, g_bit & i_bit, g_bit);
- uint8_t b = combine_2_weights(color_weights, b_bit & i_bit, b_bit);
+ uint8_t r = combine_weights(color_weights, r_bit & i_bit, r_bit);
+ uint8_t g = combine_weights(color_weights, g_bit & i_bit, g_bit);
+ uint8_t b = combine_weights(color_weights, b_bit & i_bit, b_bit);
pens[color] = rgb_t(r, g, b);
}
@@ -793,7 +793,7 @@ static INPUT_PORTS_START( berzerk )
PORT_BIT( 0xf0, IP_ACTIVE_LOW, IPT_UNUSED )
INPUT_PORTS_END
-// this set has French speech roms, so default the language to French
+// this set has French speech ROMs, so default the language to French
static INPUT_PORTS_START( berzerkf )
PORT_INCLUDE( berzerk )
@@ -805,7 +805,7 @@ static INPUT_PORTS_START( berzerkf )
PORT_DIPSETTING( 0xc0, DEF_STR( Spanish ) )
INPUT_PORTS_END
-// this set has German speech roms, so default the language to German
+// this set has German speech ROMs, so default the language to German
static INPUT_PORTS_START( berzerkg )
PORT_INCLUDE( berzerk )
@@ -817,7 +817,7 @@ static INPUT_PORTS_START( berzerkg )
PORT_DIPSETTING( 0xc0, DEF_STR( Spanish ) )
INPUT_PORTS_END
-// this set has a Spanish speech rom, so default the language to Spanish
+// this set has a Spanish speech ROM, so default the language to Spanish
static INPUT_PORTS_START( berzerks )
PORT_INCLUDE( berzerk )
@@ -1120,39 +1120,38 @@ INPUT_PORTS_END
*
*************************************/
-MACHINE_CONFIG_START(berzerk_state::berzerk)
-
+void berzerk_state::berzerk(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, MAIN_CPU_CLOCK)
- MCFG_DEVICE_PROGRAM_MAP(berzerk_map)
- MCFG_DEVICE_IO_MAP(berzerk_io_map)
+ Z80(config, m_maincpu, MAIN_CPU_CLOCK);
+ m_maincpu->set_addrmap(AS_PROGRAM, &berzerk_state::berzerk_map);
+ m_maincpu->set_addrmap(AS_IO, &berzerk_state::berzerk_io_map);
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
- MCFG_DEVICE_ADD("ls181_10c", TTL74181)
- MCFG_DEVICE_ADD("ls181_12c", TTL74181)
+ TTL74181(config, m_ls181_10c);
+ TTL74181(config, m_ls181_12c);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_RAW_PARAMS(PIXEL_CLOCK, HTOTAL, HBEND, HBSTART, VTOTAL, VBEND, VBSTART)
- MCFG_SCREEN_UPDATE_DRIVER(berzerk_state, screen_update)
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_raw(PIXEL_CLOCK, HTOTAL, HBEND, HBSTART, VTOTAL, VBEND, VBSTART);
+ m_screen->set_screen_update(FUNC(berzerk_state::screen_update));
/* audio hardware */
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("speech", S14001A, S14001_CLOCK/16/8) /* placeholder - the clock is software controllable */
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.00)
+ S14001A(config, m_s14001a, S14001_CLOCK/16/8).add_route(ALL_OUTPUTS, "mono", 1.00); /* placeholder - the clock is software controllable */
EXIDY(config, m_custom, 0).add_route(ALL_OUTPUTS, "mono", 0.33);
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(berzerk_state::frenzy)
+void berzerk_state::frenzy(machine_config &config)
+{
berzerk(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(frenzy_map)
-MACHINE_CONFIG_END
+ m_maincpu->set_addrmap(AS_PROGRAM, &berzerk_state::frenzy_map);
+}
@@ -1166,7 +1165,7 @@ MACHINE_CONFIG_END
Berzerk program labels follow this format:
-BERZERK (C) <-- rom socket silkscreened ROM0
+BERZERK (C) <-- ROM socket silkscreened ROM0
RC31 1C
1980 STERN
@@ -1182,7 +1181,7 @@ So PCB location and silkscreen are as follows as they appear on an actual PCB:
NOTE: No known set uses ROM6
-Sound roms for Berzerk / Frenzy have been found labeled as:
+Sound ROMs for Berzerk / Frenzy have been found labeled as:
BERZERK BERZERK
R VO 1C R VO 2C
@@ -1194,9 +1193,7 @@ E169-1CVO E169-2CVO
RVO 1C (-9) RVO 2C (-9)
1982 STERN 1982 STERN
-Both sets of roms contain the same data.
-
-We need to have actual verfied rom labels for all the sets below (other then voice roms :-)
+Both sets of ROMs contain the same data.
*/
@@ -1208,7 +1205,7 @@ ROM_START( berzerk )
ROM_LOAD( "berzerk_rc31_5d.rom3.5d", 0x2000, 0x0800, CRC(fcaefa95) SHA1(07f849aa39f1e3db938187ffde4a46a588156ddc) )
ROM_LOAD( "berzerk_rc31_6d.rom4.6d", 0x2800, 0x0800, CRC(1e35b9a0) SHA1(5a5e549ec0e4803ab2d1eac6b3e7171aedf28244) )
ROM_LOAD( "berzerk_rc31_5c.rom5.5c", 0x3000, 0x0800, CRC(c8c665e5) SHA1(e9eca4b119549e0061384abf52327c14b0d56624) )
- ROM_FILL( 0x3800, 0x0800, 0xff ) /* rom socket ROM6 at 3C is unpopulated */
+ ROM_FILL( 0x3800, 0x0800, 0xff ) /* ROM socket ROM6 at 3C is unpopulated */
ROM_REGION( 0x01000, "speech", 0 ) /* voice data */
ROM_LOAD( "berzerk_r_vo_1c.1c", 0x0000, 0x0800, CRC(2cfe825d) SHA1(f12fed8712f20fa8213f606c4049a8144bfea42e) ) /* VSU-1000 board */
@@ -1223,7 +1220,7 @@ ROM_START( berzerk1 )
ROM_LOAD( "berzerk_rc28_5d.rom3.5d", 0x2000, 0x0800, CRC(6a1936b4) SHA1(f1635e9d2f25514c35559d2a247c3bc4b4034c19) )
ROM_LOAD( "berzerk_rc28_6d.rom4.6d", 0x2800, 0x0800, CRC(fa5dce40) SHA1(b3a3ee52bf65bbb3a20f905d3e4ebdf6871dcb5d) )
ROM_LOAD( "berzerk_rc28_5c.rom5.5c", 0x3000, 0x0800, CRC(2579b9f4) SHA1(890f0237afbb194166eae88c98de81989f408548) )
- ROM_FILL( 0x3800, 0x0800, 0xff ) /* rom socket ROM6 at 3C is unpopulated */
+ ROM_FILL( 0x3800, 0x0800, 0xff ) /* ROM socket ROM6 at 3C is unpopulated */
ROM_REGION( 0x01000, "speech", 0 ) /* voice data */
ROM_LOAD( "berzerk_r_vo_1c.1c", 0x0000, 0x0800, CRC(2cfe825d) SHA1(f12fed8712f20fa8213f606c4049a8144bfea42e) ) /* VSU-1000 board */
@@ -1238,26 +1235,26 @@ ROM_START( berzerkf )
ROM_LOAD( "berzerk_rc31f_5d.rom3.5d", 0x2000, 0x0800, CRC(316192b5) SHA1(50f4ba2b59423a48c1d51fc6e4d9ea098d6f3743) )
ROM_LOAD( "berzerk_rc31f_6d.rom4.6d", 0x2800, 0x0800, CRC(cd51238c) SHA1(f0b65bdd1f225c151a93ea62812b4bb64969acac) )
ROM_LOAD( "berzerk_rc31f_5c.rom5.5c", 0x3000, 0x0800, CRC(563b13b6) SHA1(f8d137cd26535efe92780560d2f69f12d3f0fa42) )
- ROM_FILL( 0x3800, 0x0800, 0xff ) /* rom socket ROM6 at 3C is unpopulated */
+ ROM_FILL( 0x3800, 0x0800, 0xff ) /* ROM socket ROM6 at 3C is unpopulated */
ROM_REGION( 0x01000, "speech", 0 ) /* voice data */
- ROM_LOAD( "berzerk_rvof_1c.1c", 0x0000, 0x0800, CRC(d7bfaca2) SHA1(b8c22db0f6e86d90f3c2ac9ff9e9d0ccff314919) ) /* VSU-1000 board */
- ROM_LOAD( "berzerk_rvof_2c.2c", 0x0800, 0x0800, CRC(7bdc3573) SHA1(f346f0ac9813812f2e3fe68ebbf79151975babcb) ) /* ditto */
+ ROM_LOAD( "berzerk_rvof_1c.1c", 0x0000, 0x0800, CRC(d7bfaca2) SHA1(b8c22db0f6e86d90f3c2ac9ff9e9d0ccff314919) ) /* VSU-1000 board */
+ ROM_LOAD( "berzerk_rvof_2c.2c", 0x0800, 0x0800, CRC(7bdc3573) SHA1(f346f0ac9813812f2e3fe68ebbf79151975babcb) ) /* ditto */
ROM_END
ROM_START( berzerkg )
ROM_REGION( 0x10000, "maincpu", 0 )
- ROM_LOAD( "cpu rom 00.1c", 0x0000, 0x0800, CRC(77923a9e) SHA1(3760800b7aa1245f2141897b2406f0f5af5a8d71) )
+ ROM_LOAD( "cpu rom 00.1c", 0x0000, 0x0800, CRC(77923a9e) SHA1(3760800b7aa1245f2141897b2406f0f5af5a8d71) ) /* Need to verify ROM labels for this set */
ROM_LOAD( "cpu rom 01.1d", 0x1000, 0x0800, CRC(19bb3aac) SHA1(11341521fd880d55ea01bceb4a321ec571f0b759) )
ROM_LOAD( "cpu rom 02.3d", 0x1800, 0x0800, CRC(b0888ff7) SHA1(ac76400482fe37b6c8e309cd9b10855dac86ed24) )
ROM_LOAD( "cpu rom 03.5d", 0x2000, 0x0800, CRC(e23239a9) SHA1(a0505efdee4cb1962243638c641e94983673f70f) )
ROM_LOAD( "cpu rom 04.6d", 0x2800, 0x0800, CRC(651b31b7) SHA1(890f424a5a73a95af642435c1b0cca78a9413aae) )
ROM_LOAD( "cpu rom 05.5c", 0x3000, 0x0800, CRC(8a403bba) SHA1(686a9b58a245df6c947d14991a2e4cbaf511e2ca) )
- ROM_FILL( 0x3800, 0x0800, 0xff ) /* rom socket ROM6 at 3C is unpopulated */
+ ROM_FILL( 0x3800, 0x0800, 0xff ) /* ROM socket ROM6 at 3C is unpopulated */
ROM_REGION( 0x01000, "speech", 0 ) /* voice data */
- ROM_LOAD( "berzerk_rvog_1c.1c", 0x0000, 0x0800, CRC(fc1da15f) SHA1(f759a017d9e95acf0e1d35b16d8820acee7d7e3d) ) /* VSU-1000 board */
- ROM_LOAD( "berzerk_rvog_2c.2c", 0x0800, 0x0800, CRC(7f6808fb) SHA1(8a9c43597f924221f68d1b31e033f1dc492cddc5) ) /* ditto */
+ ROM_LOAD( "berzerk_rvog_1c.1c", 0x0000, 0x0800, CRC(fc1da15f) SHA1(f759a017d9e95acf0e1d35b16d8820acee7d7e3d) ) /* VSU-1000 board */
+ ROM_LOAD( "berzerk_rvog_2c.2c", 0x0800, 0x0800, CRC(7f6808fb) SHA1(8a9c43597f924221f68d1b31e033f1dc492cddc5) ) /* ditto */
ROM_END
ROM_START( berzerks )
@@ -1268,28 +1265,28 @@ ROM_START( berzerks )
ROM_LOAD( "berzerk_rc32_5d.rom3.5d", 0x2000, 0x0800, CRC(e23239a9) SHA1(a0505efdee4cb1962243638c641e94983673f70f) ) /* Same as the German set */
ROM_LOAD( "berzerk_rc32_6d.rom4.6d", 0x2800, 0x0800, CRC(959efd86) SHA1(3401f86ed6202e8790cef00c73af29cc282d322e) )
ROM_LOAD( "berzerk_rc32s_5c.rom5.5c", 0x3000, 0x0800, CRC(9ad80e4e) SHA1(f79a86dd3dee5d53c2a60eda5b5181816bd73bc3) )
- ROM_FILL( 0x3800, 0x0800, 0xff ) /* rom socket ROM6 at 3C is unpopulated */
+ ROM_FILL( 0x3800, 0x0800, 0xff ) /* ROM socket ROM6 at 3C is unpopulated */
ROM_REGION( 0x01000, "speech", 0 ) /* voice data */
- ROM_LOAD( "berzerk_rvos_1c.1c", 0x0000, 0x0800, CRC(0b51409c) SHA1(75333853a82029f080e3db61441ba6091c1aab55) ) /* VSU-1000 board */
- /* rom socket 2C is unpopulated */
+ ROM_LOAD( "berzerk_rvos_1c.1c", 0x0000, 0x0800, CRC(0b51409c) SHA1(75333853a82029f080e3db61441ba6091c1aab55) ) /* VSU-1000 board */
+ /* ROM socket 2C is unpopulated */
ROM_END
ROM_START( frenzy )
ROM_REGION( 0x10000, "maincpu", 0 )
- ROM_LOAD( "1c-0", 0x0000, 0x1000, CRC(abdd25b8) SHA1(e6a3ab826b51b2c6ddd63d55681848fccad800dd) )
+ ROM_LOAD( "1c-0", 0x0000, 0x1000, CRC(abdd25b8) SHA1(e6a3ab826b51b2c6ddd63d55681848fccad800dd) ) /* Need to verify ROM labels for this set */
ROM_LOAD( "1d-1", 0x1000, 0x1000, CRC(536e4ae8) SHA1(913385c43b8902d3d3ad2194a3137e19e61c6573) )
ROM_LOAD( "3d-2", 0x2000, 0x1000, CRC(3eb9bc9b) SHA1(1e43e76ae0606a6d41d9006005d6001bdee48694) )
ROM_LOAD( "5d-3", 0x3000, 0x1000, CRC(e1d3133c) SHA1(2af4a9bc2b29735a548ae770f872127bc009cc42) )
ROM_LOAD( "6d-4", 0xc000, 0x1000, CRC(5581a7b1) SHA1(1f633c1c29d3b64f701c601feba26da66a6c6f23) )
ROM_REGION( 0x01000, "speech", 0 ) /* voice data */
- ROM_LOAD( "e169-1cvo.1c", 0x0000, 0x0800, CRC(2cfe825d) SHA1(f12fed8712f20fa8213f606c4049a8144bfea42e) ) /* VSU-1000 board */
- ROM_LOAD( "e169-2cvo.2c", 0x0800, 0x0800, CRC(d2b6324e) SHA1(20a6611ad6ec19409ac138bdae7bdfaeab6c47cf) ) /* ditto */
+ ROM_LOAD( "e169-1cvo.1c", 0x0000, 0x0800, CRC(2cfe825d) SHA1(f12fed8712f20fa8213f606c4049a8144bfea42e) ) /* VSU-1000 board */
+ ROM_LOAD( "e169-2cvo.2c", 0x0800, 0x0800, CRC(d2b6324e) SHA1(20a6611ad6ec19409ac138bdae7bdfaeab6c47cf) ) /* ditto */
ROM_REGION( 0x0020, "proms", 0 )
- ROM_LOAD( "prom.6e", 0x0000, 0x0020, CRC(4471ca5d) SHA1(ba8dca2ec076818f8ad8c17b15c77965e36fa05e) ) /* address decoder/rom select prom (N82S123N) */
+ ROM_LOAD( "prom.6e", 0x0000, 0x0020, CRC(4471ca5d) SHA1(ba8dca2ec076818f8ad8c17b15c77965e36fa05e) ) /* address decoder/ROM select PROM (N82S123N) */
ROM_END
@@ -1299,8 +1296,8 @@ ROM_END
The more common version of Moon War runs on modified Super Cobra (scobra.c) hardware and is often called
'Moon War 2' because it is the second version, and many of the PCBs are labeled as such.
- So far only 2 original boards of this have been found, one with only the sound roms on it, and the other
- with only the program roms on it. This set is a combination of dumps from those two boards, so there
+ So far only 2 original boards of this have been found, one with only the sound ROMs on it, and the other
+ with only the program ROMs on it. This set is a combination of dumps from those two boards, so there
is a small chance they could be mismatched.
*/
ROM_START( moonwarp )
@@ -1312,12 +1309,12 @@ ROM_START( moonwarp )
ROM_LOAD( "5c.bin", 0xc000, 0x1000, CRC(a3d551ab) SHA1(a32352727b5475a6ec6c495c55f01ccd6e024f98) )
ROM_REGION( 0x01000, "speech", 0 ) /* voice data */
- ROM_LOAD( "moonwar.1c.bin", 0x0000, 0x0800, CRC(9e9a653f) SHA1(cf49a38ef343ace271ba1e5dde38bd8b9c0bd876) ) /* VSU-1000 board */
- ROM_LOAD( "moonwar.2c.bin", 0x0800, 0x0800, CRC(73fd988d) SHA1(08a2aeb4d87eee58e38e4e3f749a95f2308aceb0) ) /* ditto */
+ ROM_LOAD( "moonwar.1c.bin", 0x0000, 0x0800, CRC(9e9a653f) SHA1(cf49a38ef343ace271ba1e5dde38bd8b9c0bd876) ) /* VSU-1000 board */
+ ROM_LOAD( "moonwar.2c.bin", 0x0800, 0x0800, CRC(73fd988d) SHA1(08a2aeb4d87eee58e38e4e3f749a95f2308aceb0) ) /* ditto */
ROM_REGION( 0x0020, "proms", 0 )
- ROM_LOAD( "n82s123 po. e6 select decoder", 0x0000, 0x0020, CRC(4471ca5d) SHA1(ba8dca2ec076818f8ad8c17b15c77965e36fa05e) ) /* address decoder/rom select prom - from board with prg roms, same as Frenzy*/
- ROM_LOAD( "prom.6e", 0x0000, 0x0020, CRC(56bffba3) SHA1(c8e24f6361c50bcb4c9d3f39cdaf4172c2a2b318) ) /* address decoder/rom select prom - from the sound rom only set, is it bad? */
+ ROM_LOAD( "n82s123.6e", 0x0000, 0x0020, CRC(4471ca5d) SHA1(ba8dca2ec076818f8ad8c17b15c77965e36fa05e) ) /* address decoder/ROM select PROM - from board with prg ROMs, same as Frenzy */
+ ROM_LOAD( "prom.6e", 0x0000, 0x0020, CRC(56bffba3) SHA1(c8e24f6361c50bcb4c9d3f39cdaf4172c2a2b318) ) /* address decoder/ROM select PROM - from the sound ROM only set, is it bad? */
ROM_END
void berzerk_state::init_moonwarp()
diff --git a/src/mame/drivers/besta.cpp b/src/mame/drivers/besta.cpp
index 88c280dab56..0e427c0c51b 100644
--- a/src/mame/drivers/besta.cpp
+++ b/src/mame/drivers/besta.cpp
@@ -13,18 +13,6 @@
#include "machine/68230pit.h"
#include "machine/terminal.h"
-#define VERBOSE_DBG 1 /* general debug messages */
-
-#define DBG_LOG(N,M,A) \
- do { \
- if(VERBOSE_DBG>=N) \
- { \
- if( M ) \
- logerror("%11.6f at %s: %-24s",machine().time().as_double(),machine().describe_context(),(char*)M ); \
- logerror A; \
- } \
- } while (0)
-
class besta_state : public driver_device
{
@@ -62,11 +50,6 @@ READ8_MEMBER( besta_state::mpcc_reg_r )
{
uint8_t ret;
- if (!(offset == 0 && !m_mpcc_regs[0])) {
- DBG_LOG(1,"mpcc_reg_r",("(%d) = %02X at %s\n", offset,
- (offset > 31 ? -1 : m_mpcc_regs[offset]), machine().describe_context()));
- }
-
switch (offset) {
case 0: /* r_stat aka ... */
return (m_term_data) ? 0x80 : 0;
@@ -81,14 +64,12 @@ READ8_MEMBER( besta_state::mpcc_reg_r )
WRITE8_MEMBER( besta_state::mpcc_reg_w )
{
- DBG_LOG(1,"mpcc_reg_w",("(%d) <- %02X at %s\n", offset, data, machine().describe_context()));
-
switch (offset) {
case 2:
kbd_put(data);
break;
case 10:
- m_terminal->write(generic_space(), 0, data);
+ m_terminal->write(data);
default:
m_mpcc_regs[offset] = data;
break;
diff --git a/src/mame/drivers/bestleag.cpp b/src/mame/drivers/bestleag.cpp
index d8907d8e910..8916f5382fd 100644
--- a/src/mame/drivers/bestleag.cpp
+++ b/src/mame/drivers/bestleag.cpp
@@ -381,18 +381,19 @@ static GFXDECODE_START( gfx_bestleag )
GFXDECODE_ENTRY( "gfx2", 0, bestleag_char16layout, 0x300, 16 )
GFXDECODE_END
-MACHINE_CONFIG_START(bestleag_state::bestleag)
- MCFG_DEVICE_ADD("maincpu", M68000, 12000000)
- MCFG_DEVICE_PROGRAM_MAP(bestleag_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", bestleag_state, irq6_line_hold)
-
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(32*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(bestleag_state, screen_update_bestleag)
- MCFG_SCREEN_PALETTE(m_palette)
+void bestleag_state::bestleag(machine_config &config)
+{
+ M68000(config, m_maincpu, 12000000);
+ m_maincpu->set_addrmap(AS_PROGRAM, &bestleag_state::bestleag_map);
+ m_maincpu->set_vblank_int("screen", FUNC(bestleag_state::irq6_line_hold));
+
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(32*8, 32*8);
+ screen.set_visarea(0*8, 32*8-1, 2*8, 30*8-1);
+ screen.set_screen_update(FUNC(bestleag_state::screen_update_bestleag));
+ screen.set_palette(m_palette);
GFXDECODE(config, m_gfxdecode, m_palette, gfx_bestleag);
PALETTE(config, m_palette).set_format(palette_device::RRRRGGGGBBBBRGBx, 0x800);
@@ -400,16 +401,16 @@ MACHINE_CONFIG_START(bestleag_state::bestleag)
SPEAKER(config, "lspeaker").front_left();
SPEAKER(config, "rspeaker").front_right();
- MCFG_DEVICE_ADD("oki", OKIM6295, 1000000, okim6295_device::PIN7_HIGH) /* Hand-tuned */
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 1.00)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 1.00)
-MACHINE_CONFIG_END
+ OKIM6295(config, m_oki, 1000000, okim6295_device::PIN7_HIGH); /* Hand-tuned */
+ m_oki->add_route(ALL_OUTPUTS, "lspeaker", 1.00);
+ m_oki->add_route(ALL_OUTPUTS, "rspeaker", 1.00);
+}
-MACHINE_CONFIG_START(bestleag_state::bestleaw)
+void bestleag_state::bestleaw(machine_config &config)
+{
bestleag(config);
- MCFG_SCREEN_MODIFY("screen")
- MCFG_SCREEN_UPDATE_DRIVER(bestleag_state, screen_update_bestleaw)
-MACHINE_CONFIG_END
+ subdevice<screen_device>("screen")->set_screen_update(FUNC(bestleag_state::screen_update_bestleaw));
+}
/* Rom Loading */
diff --git a/src/mame/drivers/beta.cpp b/src/mame/drivers/beta.cpp
index 0eaa9a12240..45ad006e090 100644
--- a/src/mame/drivers/beta.cpp
+++ b/src/mame/drivers/beta.cpp
@@ -347,24 +347,23 @@ void beta_state::machine_start()
MACHINE_CONFIG_START(beta_state::beta)
/* basic machine hardware */
- MCFG_DEVICE_ADD(M6502_TAG, M6502, XTAL(4'000'000)/4)
- MCFG_DEVICE_PROGRAM_MAP(beta_mem)
+ M6502(config, m_maincpu, XTAL(4'000'000)/4);
+ m_maincpu->set_addrmap(AS_PROGRAM, &beta_state::beta_mem);
/* video hardware */
config.set_default_layout(layout_beta);
/* sound hardware */
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("speaker", SPEAKER_SOUND)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25)
+ SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25);
/* devices */
- MCFG_DEVICE_ADD(M6532_TAG, MOS6532_NEW, XTAL(4'000'000)/4)
- MCFG_MOS6530n_IN_PA_CB(READ8(*this, beta_state, riot_pa_r))
- MCFG_MOS6530n_OUT_PA_CB(WRITE8(*this, beta_state, riot_pa_w))
- MCFG_MOS6530n_IN_PB_CB(READ8(*this, beta_state, riot_pb_r))
- MCFG_MOS6530n_OUT_PB_CB(WRITE8(*this, beta_state, riot_pb_w))
- MCFG_MOS6530n_IRQ_CB(INPUTLINE(M6502_TAG, M6502_IRQ_LINE))
+ mos6532_new_device &m6532(MOS6532_NEW(config, M6532_TAG, XTAL(4'000'000)/4));
+ m6532.pa_rd_callback().set(FUNC(beta_state::riot_pa_r));
+ m6532.pa_wr_callback().set(FUNC(beta_state::riot_pa_w));
+ m6532.pb_rd_callback().set(FUNC(beta_state::riot_pb_r));
+ m6532.pb_wr_callback().set(FUNC(beta_state::riot_pb_w));
+ m6532.irq_wr_callback().set_inputline(m_maincpu, M6502_IRQ_LINE);
/* EPROM socket */
MCFG_GENERIC_CARTSLOT_ADD(EPROM_TAG, generic_plain_slot, nullptr)
diff --git a/src/mame/drivers/bfcobra.cpp b/src/mame/drivers/bfcobra.cpp
index 4025c0d7ac1..f406329a2cd 100644
--- a/src/mame/drivers/bfcobra.cpp
+++ b/src/mame/drivers/bfcobra.cpp
@@ -1638,28 +1638,29 @@ INTERRUPT_GEN_MEMBER(bfcobra_state::vblank_gen)
update_irqs();
}
-MACHINE_CONFIG_START(bfcobra_state::bfcobra)
- MCFG_DEVICE_ADD("maincpu", Z80, Z80_XTAL)
- MCFG_DEVICE_PROGRAM_MAP(z80_prog_map)
- MCFG_DEVICE_IO_MAP(z80_io_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", bfcobra_state, vblank_gen)
+void bfcobra_state::bfcobra(machine_config &config)
+{
+ Z80(config, m_maincpu, Z80_XTAL);
+ m_maincpu->set_addrmap(AS_PROGRAM, &bfcobra_state::z80_prog_map);
+ m_maincpu->set_addrmap(AS_IO, &bfcobra_state::z80_io_map);
+ m_maincpu->set_vblank_int("screen", FUNC(bfcobra_state::vblank_gen));
- MCFG_DEVICE_ADD("audiocpu", MC6809, M6809_XTAL) // MC6809P
- MCFG_DEVICE_PROGRAM_MAP(m6809_prog_map)
- MCFG_DEVICE_PERIODIC_INT_DRIVER(bfcobra_state, timer_irq, 1000)
+ MC6809(config, m_audiocpu, M6809_XTAL); // MC6809P
+ m_audiocpu->set_addrmap(AS_PROGRAM, &bfcobra_state::m6809_prog_map);
+ m_audiocpu->set_periodic_int(FUNC(bfcobra_state::timer_irq), attotime::from_hz(1000));
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
/* TODO */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(50)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */)
- MCFG_SCREEN_SIZE(512, 256)
- MCFG_SCREEN_VISIBLE_AREA(0, 512 - 1, 0, 256 - 1)
- MCFG_SCREEN_UPDATE_DRIVER(bfcobra_state, screen_update_bfcobra)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(50);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500) /* not accurate */);
+ screen.set_size(512, 256);
+ screen.set_visarea_full();
+ screen.set_screen_update(FUNC(bfcobra_state::screen_update_bfcobra));
- MCFG_PALETTE_ADD("palette", 256)
+ PALETTE(config, m_palette).set_entries(256);
ramdac_device &ramdac(RAMDAC(config, "ramdac", 0, m_palette)); // MUSIC Semiconductor TR9C1710 RAMDAC or equivalent
ramdac.set_addrmap(0, &bfcobra_state::ramdac_map);
@@ -1669,8 +1670,7 @@ MACHINE_CONFIG_START(bfcobra_state::bfcobra)
AY8910(config, "aysnd", M6809_XTAL / 4).add_route(ALL_OUTPUTS, "mono", 0.20);
- MCFG_DEVICE_ADD("upd", UPD7759)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.40)
+ UPD7759(config, m_upd7759).add_route(ALL_OUTPUTS, "mono", 0.40);
/* ACIAs */
ACIA6850(config, m_acia6850_0, 0);
@@ -1684,12 +1684,11 @@ MACHINE_CONFIG_START(bfcobra_state::bfcobra)
m_acia6850_2->txd_handler().set(FUNC(bfcobra_state::data_acia_tx_w));
m_acia6850_2->irq_handler().set(FUNC(bfcobra_state::m6809_data_irq));
- MCFG_DEVICE_ADD("acia_clock", CLOCK, 31250*16) // What are the correct ACIA clocks ?
- MCFG_CLOCK_SIGNAL_HANDLER(WRITELINE(*this, bfcobra_state, write_acia_clock))
+ clock_device &acia_clock(CLOCK(config, "acia_clock", 31250*16)); // What are the correct ACIA clocks ?
+ acia_clock.signal_handler().set(FUNC(bfcobra_state::write_acia_clock));
- MCFG_DEVICE_ADD("meters", METERS, 0)
- MCFG_METERS_NUMBER(8)
-MACHINE_CONFIG_END
+ METERS(config, m_meters, 0).set_number(8);
+}
/***************************************************************************
diff --git a/src/mame/drivers/bfm_ad5.cpp b/src/mame/drivers/bfm_ad5.cpp
index 746983a4e41..b97d231501a 100644
--- a/src/mame/drivers/bfm_ad5.cpp
+++ b/src/mame/drivers/bfm_ad5.cpp
@@ -79,15 +79,16 @@ INTERRUPT_GEN_MEMBER(adder5_state::ad5_fake_timer_int)
// m_maincpu->set_input_line_and_vector(5, HOLD_LINE, 0x8c);
}
-MACHINE_CONFIG_START(adder5_state::bfm_ad5)
- MCFG_DEVICE_ADD("maincpu", MCF5206E, 40000000) /* MCF5206eFT */
- MCFG_DEVICE_PROGRAM_MAP(ad5_map)
- MCFG_DEVICE_PERIODIC_INT_DRIVER(adder5_state, ad5_fake_timer_int, 1000)
- MCFG_MCF5206E_PERIPHERAL_ADD("maincpu_onboard")
+void adder5_state::bfm_ad5(machine_config &config)
+{
+ MCF5206E(config, m_maincpu, 40000000); /* MCF5206eFT */
+ m_maincpu->set_addrmap(AS_PROGRAM, &adder5_state::ad5_map);
+ m_maincpu->set_periodic_int(FUNC(adder5_state::ad5_fake_timer_int), attotime::from_hz(1000));
+ MCF5206E_PERIPHERAL(config, "maincpu_onboard", 0);
SPEAKER(config, "lspeaker").front_left();
SPEAKER(config, "rspeaker").front_right();
/* unknown sound */
-MACHINE_CONFIG_END
+}
#include "bfm_ad5sw.hxx"
diff --git a/src/mame/drivers/bfm_sc1.cpp b/src/mame/drivers/bfm_sc1.cpp
index fbd459e45ec..17dd7bd50b6 100644
--- a/src/mame/drivers/bfm_sc1.cpp
+++ b/src/mame/drivers/bfm_sc1.cpp
@@ -1073,10 +1073,11 @@ INPUT_PORTS_END
// machine driver for scorpion1 board ///////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////
-MACHINE_CONFIG_START(bfm_sc1_state::scorpion1)
- MCFG_DEVICE_ADD("maincpu", M6809, MASTER_CLOCK/4) // 6809 CPU at 1 Mhz
- MCFG_DEVICE_PROGRAM_MAP(sc1_base) // setup read and write memorymap
- MCFG_DEVICE_PERIODIC_INT_DRIVER(bfm_sc1_state, timer_irq, 1000) // generate 1000 IRQ's per second
+void bfm_sc1_state::scorpion1(machine_config &config)
+{
+ M6809(config, m_maincpu, MASTER_CLOCK/4); // 6809 CPU at 1 Mhz
+ m_maincpu->set_addrmap(AS_PROGRAM, &bfm_sc1_state::sc1_base); // setup read and write memorymap
+ m_maincpu->set_periodic_int(FUNC(bfm_sc1_state::timer_irq), attotime::from_hz(1000)); // generate 1000 IRQ's per second
WATCHDOG_TIMER(config, "watchdog").set_time(PERIOD_OF_555_MONOSTABLE(120000,100e-9));
@@ -1102,37 +1103,37 @@ MACHINE_CONFIG_START(bfm_sc1_state::scorpion1)
REEL(config, m_reels[5], STARPOINT_48STEP_REEL, 1, 3, 0x09, 4);
m_reels[5]->optic_handler().set(FUNC(bfm_sc1_state::reel_optic_cb<5>));
- MCFG_DEVICE_ADD("meters", METERS, 0)
- MCFG_METERS_NUMBER(8)
-MACHINE_CONFIG_END
+ METERS(config, m_meters, 0).set_number(8);
+}
/////////////////////////////////////////////////////////////////////////////////////
// machine driver for scorpion1 board + adder2 extension ////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////
-MACHINE_CONFIG_START(bfm_sc1_state::scorpion1_adder2)
+void bfm_sc1_state::scorpion1_adder2(machine_config &config)
+{
scorpion1(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(sc1_adder2) // setup read and write memorymap
+ m_maincpu->set_addrmap(AS_PROGRAM, &bfm_sc1_state::sc1_adder2); // setup read and write memorymap
config.set_default_layout(layout_sc1_vid);
BFM_ADDER2(config, "adder2", 0);
-MACHINE_CONFIG_END
+}
/////////////////////////////////////////////////////////////////////////////////////
// machine driver for scorpion1 board ///////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////
-MACHINE_CONFIG_START(bfm_sc1_state::scorpion1_viper)
+void bfm_sc1_state::scorpion1_viper(machine_config &config)
+{
scorpion1(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(sc1_viper) // setup read and write memorymap
- MCFG_DEVICE_ADD("upd",UPD7759)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.50)
-MACHINE_CONFIG_END
+ m_maincpu->set_addrmap(AS_PROGRAM, &bfm_sc1_state::sc1_viper); // setup read and write memorymap
+
+ UPD7759(config, m_upd7759);
+ m_upd7759->add_route(ALL_OUTPUTS, "mono", 0.50);
+}
void bfm_sc1_state::sc1_common_init(int reels, int decrypt, int defaultbank)
diff --git a/src/mame/drivers/bfm_sc2.cpp b/src/mame/drivers/bfm_sc2.cpp
index 7255d669bd1..048bef99198 100644
--- a/src/mame/drivers/bfm_sc2.cpp
+++ b/src/mame/drivers/bfm_sc2.cpp
@@ -201,9 +201,9 @@ public:
, m_upd7759(*this, "upd")
, m_vfd0(*this, "vfd0")
, m_vfd1(*this, "vfd1")
+ , m_ym2413(*this, "ymsnd")
, m_strobein(*this, "STROBE%u", 0)
, m_rombank1(*this, "bank1")
- , m_ym2413(*this, "ymsnd")
, m_meters(*this, "meters")
, m_lamps(*this, "lamp%u", 0U)
{
@@ -272,6 +272,7 @@ protected:
required_device<cpu_device> m_maincpu;
required_device<upd7759_device> m_upd7759;
optional_device<bfm_bd1_device> m_vfd0, m_vfd1;
+ optional_device<ym2413_device> m_ym2413;
int m_sc2_show_door;
int m_sc2_door_state;
@@ -287,7 +288,6 @@ protected:
private:
required_ioport_array<12> m_strobein;
optional_memory_bank m_rombank1;
- optional_device<ym2413_device> m_ym2413;
optional_device<meters_device> m_meters; // scorpion2_vid doesn't use this (scorpion2_vidm does)
@@ -2248,20 +2248,20 @@ INPUT_PORTS_END
// machine config fragments for different meters numbers //////////////////
///////////////////////////////////////////////////////////////////////////
-MACHINE_CONFIG_START(bfm_sc2_state::_3meters)
- MCFG_DEVICE_ADD("meters", METERS, 0)
- MCFG_METERS_NUMBER(3)
-MACHINE_CONFIG_END
+void bfm_sc2_state::_3meters(machine_config &config)
+{
+ METERS(config, m_meters, 0).set_number(3);
+}
-MACHINE_CONFIG_START(bfm_sc2_state::_5meters)
- MCFG_DEVICE_ADD("meters", METERS, 0)
- MCFG_METERS_NUMBER(5)
-MACHINE_CONFIG_END
+void bfm_sc2_state::_5meters(machine_config &config)
+{
+ METERS(config, m_meters, 0).set_number(5);
+}
-MACHINE_CONFIG_START(bfm_sc2_state::_8meters)
- MCFG_DEVICE_ADD("meters", METERS, 0)
- MCFG_METERS_NUMBER(8)
-MACHINE_CONFIG_END
+void bfm_sc2_state::_8meters(machine_config &config)
+{
+ METERS(config, m_meters, 0).set_number(8);
+}
///////////////////////////////////////////////////////////////////////////
// machine driver for scorpion2 board + adder2 expansion //////////////////
@@ -2277,11 +2277,12 @@ void bfm_sc2_state::machine_start()
save_state();
}
-MACHINE_CONFIG_START(bfm_sc2_vid_state::scorpion2_vid)
- MCFG_DEVICE_ADD("maincpu", M6809, MASTER_CLOCK/4 ) // 6809 CPU at 2 Mhz
- MCFG_DEVICE_PROGRAM_MAP(memmap_vid) // setup scorpion2 board memorymap
- MCFG_DEVICE_PERIODIC_INT_DRIVER(bfm_sc2_vid_state, timer_irq, 1000) // generate 1000 IRQ's per second
- MCFG_QUANTUM_TIME(attotime::from_hz(960)) // needed for serial communication !!
+void bfm_sc2_vid_state::scorpion2_vid(machine_config &config)
+{
+ M6809(config, m_maincpu, MASTER_CLOCK/4); // 6809 CPU at 2 Mhz
+ m_maincpu->set_addrmap(AS_PROGRAM, &bfm_sc2_vid_state::memmap_vid); // setup scorpion2 board memorymap
+ m_maincpu->set_periodic_int(FUNC(bfm_sc2_vid_state::timer_irq), attotime::from_hz(1000)); // generate 1000 IRQ's per second
+ config.m_minimum_quantum = attotime::from_hz(960); // needed for serial communication !!
WATCHDOG_TIMER(config, "watchdog").set_time(PERIOD_OF_555_MONOSTABLE(120000,100e-9));
@@ -2295,18 +2296,17 @@ MACHINE_CONFIG_START(bfm_sc2_vid_state::scorpion2_vid)
BFM_ADDER2(config, "adder2", 0);
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("upd", UPD7759)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.50)
+ UPD7759(config, m_upd7759).add_route(ALL_OUTPUTS, "mono", 0.50);
- MCFG_DEVICE_ADD("ymsnd", YM2413, XTAL(3'579'545))
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
-MACHINE_CONFIG_END
+ YM2413(config, m_ym2413, XTAL(3'579'545)).add_route(ALL_OUTPUTS, "mono", 1.0);
+}
/* machine driver for scorpion2_vid board with meters (i.e. quintoon uk). Are we really sure the other games don't?*/
-MACHINE_CONFIG_START(bfm_sc2_vid_state::scorpion2_vidm)
+void bfm_sc2_vid_state::scorpion2_vidm(machine_config &config)
+{
scorpion2_vid(config);
_8meters(config);
-MACHINE_CONFIG_END
+}
@@ -3747,10 +3747,11 @@ void bfm_sc2_dmd_state::machine_start()
/* machine driver for scorpion2 board */
-MACHINE_CONFIG_START(bfm_sc2_awp_state::scorpion2)
- MCFG_DEVICE_ADD("maincpu", M6809, MASTER_CLOCK/4 )
- MCFG_DEVICE_PROGRAM_MAP(memmap_no_vid)
- MCFG_DEVICE_PERIODIC_INT_DRIVER(bfm_sc2_awp_state, timer_irq, 1000)
+void bfm_sc2_awp_state::scorpion2(machine_config &config)
+{
+ M6809(config, m_maincpu, MASTER_CLOCK/4);
+ m_maincpu->set_addrmap(AS_PROGRAM, &bfm_sc2_awp_state::memmap_no_vid);
+ m_maincpu->set_periodic_int(FUNC(bfm_sc2_awp_state::timer_irq), attotime::from_hz(1000));
WATCHDOG_TIMER(config, "watchdog").set_time(PERIOD_OF_555_MONOSTABLE(120000,100e-9));
@@ -3758,11 +3759,9 @@ MACHINE_CONFIG_START(bfm_sc2_awp_state::scorpion2)
BFM_BD1(config, m_vfd1, 60, 1);
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("upd",UPD7759)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.50)
+ UPD7759(config, m_upd7759).add_route(ALL_OUTPUTS, "mono", 0.50);
- MCFG_DEVICE_ADD("ymsnd",YM2413, XTAL(3'579'545))
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
+ YM2413(config, m_ym2413, XTAL(3'579'545)).add_route(ALL_OUTPUTS, "mono", 1.0);
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
NVRAM(config, "e2ram").set_custom_handler(FUNC(bfm_sc2_awp_state::e2ram_init));
@@ -3784,41 +3783,42 @@ MACHINE_CONFIG_START(bfm_sc2_awp_state::scorpion2)
m_reel[5]->optic_handler().set(FUNC(bfm_sc2_awp_state::reel_optic_cb<5>));
_8meters(config);
-MACHINE_CONFIG_END
+}
#if 0
-MACHINE_CONFIG_START(bfm_sc2_awp_state::scorpion2_3m)
+void bfm_sc2_awp_state::scorpion2_3m(machine_config &config)
+{
scorpion2(config);
- MCFG_DEVICE_REMOVE("meters")
+ config.device_remove("meters");
_3meters(config);
-MACHINE_CONFIG_END
+}
#endif
/* machine driver for scorpion3 board */
-MACHINE_CONFIG_START(bfm_sc2_awp_state::scorpion3)
+void bfm_sc2_awp_state::scorpion3(machine_config &config)
+{
scorpion2(config);
- MCFG_DEVICE_REMOVE("meters")
+ config.device_remove("meters");
_5meters(config);
-MACHINE_CONFIG_END
+}
/* machine driver for scorpion2 board + matrix board */
-MACHINE_CONFIG_START(bfm_sc2_dmd_state::scorpion2_dm01)
- MCFG_QUANTUM_TIME(attotime::from_hz(960)) // needed for serial communication !!
- MCFG_DEVICE_ADD("maincpu", M6809, MASTER_CLOCK/4 )
- MCFG_DEVICE_PROGRAM_MAP(memmap_no_vid)
- MCFG_DEVICE_PERIODIC_INT_DRIVER(bfm_sc2_dmd_state, timer_irq, 1000)
+void bfm_sc2_dmd_state::scorpion2_dm01(machine_config &config)
+{
+ config.m_minimum_quantum = attotime::from_hz(960); // needed for serial communication !!
+ M6809(config, m_maincpu, MASTER_CLOCK/4);
+ m_maincpu->set_addrmap(AS_PROGRAM, &bfm_sc2_dmd_state::memmap_no_vid);
+ m_maincpu->set_periodic_int(FUNC(bfm_sc2_dmd_state::timer_irq), attotime::from_hz(1000));
WATCHDOG_TIMER(config, "watchdog").set_time(PERIOD_OF_555_MONOSTABLE(120000,100e-9));
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("ymsnd",YM2413, XTAL(3'579'545))
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
+ YM2413(config, m_ym2413, XTAL(3'579'545)).add_route(ALL_OUTPUTS, "mono", 1.0);
- MCFG_DEVICE_ADD("upd",UPD7759)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.50)
+ UPD7759(config, m_upd7759).add_route(ALL_OUTPUTS, "mono", 0.50);
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
NVRAM(config, "e2ram").set_custom_handler(FUNC(bfm_sc2_dmd_state::e2ram_init));
@@ -3842,19 +3842,21 @@ MACHINE_CONFIG_START(bfm_sc2_dmd_state::scorpion2_dm01)
m_reel[5]->optic_handler().set(FUNC(bfm_sc2_dmd_state::reel_optic_cb<5>));
_8meters(config);
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(bfm_sc2_dmd_state::scorpion2_dm01_3m)
+void bfm_sc2_dmd_state::scorpion2_dm01_3m(machine_config &config)
+{
scorpion2_dm01(config);
- MCFG_DEVICE_REMOVE("meters")
+ config.device_remove("meters");
_3meters(config);
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(bfm_sc2_dmd_state::scorpion2_dm01_5m)
+void bfm_sc2_dmd_state::scorpion2_dm01_5m(machine_config &config)
+{
scorpion2_dm01(config);
- MCFG_DEVICE_REMOVE("meters")
+ config.device_remove("meters");
_5meters(config);
-MACHINE_CONFIG_END
+}
void bfm_sc2_novid_state::sc2awp_common_init(int reels, int decrypt)
{
diff --git a/src/mame/drivers/bfm_sc4.cpp b/src/mame/drivers/bfm_sc4.cpp
index 7810fe2b3bd..b7e39d7c19f 100644
--- a/src/mame/drivers/bfm_sc4.cpp
+++ b/src/mame/drivers/bfm_sc4.cpp
@@ -402,10 +402,10 @@ READ16_MEMBER(sc4_state::sc4_mem_r)
return ioport("IN-20")->read();
case 0x1244:
- return m_ymz->read(space,0);
+ return m_ymz->read(0);
case 0x1246:
- return m_ymz->read(space,1);
+ return m_ymz->read(1);
default:
logerror("%08x maincpu read access offset %08x mem_mask %04x cs %d (LAMPS etc.)\n", pc, offset*2, mem_mask, cs);
@@ -563,11 +563,11 @@ WRITE16_MEMBER(sc4_state::sc4_mem_w)
break;
case 0x1248:
- m_ymz->write(space,0, data & 0xff);
+ m_ymz->write(0, data & 0xff);
break;
case 0x124a:
- m_ymz->write(space,1, data & 0xff);
+ m_ymz->write(1, data & 0xff);
break;
case 0x1330:
@@ -895,7 +895,8 @@ WRITE_LINE_MEMBER(sc4_state::bfmdm01_busy)
// Must tie back to inputs somehow!
}
-MACHINE_CONFIG_START(sc4_state::sc4_common)
+void sc4_state::sc4_common(machine_config &config)
+{
M68307(config, m_maincpu, 16000000); // 68307! (EC000 core)
m_maincpu->set_addrmap(AS_PROGRAM, &sc4_state::sc4_map);
m_maincpu->serial_a_tx_callback().set(FUNC(sc4_state::m68307_duart_txa));
@@ -907,20 +908,20 @@ MACHINE_CONFIG_START(sc4_state::sc4_common)
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_1);
- MCFG_DEVICE_ADD("duart68681", MC68681, 16000000/4) // ?? Mhz
- MCFG_MC68681_SET_EXTERNAL_CLOCKS(XTAL(16'000'000)/2/8, XTAL(16'000'000)/2/16, XTAL(16'000'000)/2/16, XTAL(16'000'000)/2/8)
- MCFG_MC68681_IRQ_CALLBACK(WRITELINE(*this, sc4_state, bfm_sc4_duart_irq_handler))
- MCFG_MC68681_A_TX_CALLBACK(WRITELINE(*this, sc4_state, bfm_sc4_duart_txa))
- MCFG_MC68681_INPORT_CALLBACK(READ8(*this, sc4_state, bfm_sc4_duart_input_r))
- MCFG_MC68681_OUTPORT_CALLBACK(WRITE8(*this, sc4_state, bfm_sc4_duart_output_w))
+ MC68681(config, m_duart, 16000000/4); // ?? Mhz
+ m_duart->set_clocks(XTAL(16'000'000)/2/8, XTAL(16'000'000)/2/16, XTAL(16'000'000)/2/16, XTAL(16'000'000)/2/8);
+ m_duart->irq_cb().set(FUNC(sc4_state::bfm_sc4_duart_irq_handler));
+ m_duart->a_tx_cb().set(FUNC(sc4_state::bfm_sc4_duart_txa));
+ m_duart->inport_cb().set(FUNC(sc4_state::bfm_sc4_duart_input_r));;
+ m_duart->outport_cb().set(FUNC(sc4_state::bfm_sc4_duart_output_w));;
BFM_BDA(config, m_vfd0, 60, 0);
// config.set_default_layout(layout_bfm_sc4);
- MCFG_DEVICE_ADD("ymz", YMZ280B, 16000000) // ?? Mhz
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
-MACHINE_CONFIG_END
+ YMZ280B(config, m_ymz, 16000000); // ?? Mhz
+ m_ymz->add_route(ALL_OUTPUTS, "mono", 1.0);
+}
//Standard 6 reels all connected
void sc4_state::sc4(machine_config &config)
diff --git a/src/mame/drivers/bfm_sc5.cpp b/src/mame/drivers/bfm_sc5.cpp
index 75b0ae9b351..047f908e2c6 100644
--- a/src/mame/drivers/bfm_sc5.cpp
+++ b/src/mame/drivers/bfm_sc5.cpp
@@ -210,27 +210,28 @@ WRITE8_MEMBER(bfm_sc5_state::bfm_sc5_duart_output_w)
logerror("bfm_sc5_duart_output_w\n");
}
-MACHINE_CONFIG_START(bfm_sc5_state::bfm_sc5)
- MCFG_DEVICE_ADD("maincpu", MCF5206E, 40000000) /* MCF5206eFT */
- MCFG_DEVICE_PROGRAM_MAP(sc5_map)
- MCFG_MCF5206E_PERIPHERAL_ADD("maincpu_onboard")
+void bfm_sc5_state::bfm_sc5(machine_config &config)
+{
+ MCF5206E(config, m_maincpu, 40000000); /* MCF5206eFT */
+ m_maincpu->set_addrmap(AS_PROGRAM, &bfm_sc5_state::sc5_map);
+ MCF5206E_PERIPHERAL(config, "maincpu_onboard", 0);
/* sound hardware */
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("duart68681", MC68681, 16000000/4) // ?? Mhz
- MCFG_MC68681_SET_EXTERNAL_CLOCKS(16000000/2/8, 16000000/2/16, 16000000/2/16, 16000000/2/8)
- MCFG_MC68681_IRQ_CALLBACK(WRITELINE(*this, bfm_sc5_state, bfm_sc5_duart_irq_handler))
- MCFG_MC68681_A_TX_CALLBACK(WRITELINE(*this, bfm_sc5_state, bfm_sc5_duart_txa))
- MCFG_MC68681_INPORT_CALLBACK(READ8(*this, bfm_sc5_state, bfm_sc5_duart_input_r))
- MCFG_MC68681_OUTPORT_CALLBACK(WRITE8(*this, bfm_sc5_state, bfm_sc5_duart_output_w))
+ MC68681(config, m_duart, 16000000/4); // ?? Mhz
+ m_duart->set_clocks(16000000/2/8, 16000000/2/16, 16000000/2/16, 16000000/2/8);
+ m_duart->irq_cb().set(FUNC(bfm_sc5_state::bfm_sc5_duart_irq_handler));
+ m_duart->a_tx_cb().set(FUNC(bfm_sc5_state::bfm_sc5_duart_txa));
+ m_duart->inport_cb().set(FUNC(bfm_sc5_state::bfm_sc5_duart_input_r));;
+ m_duart->outport_cb().set(FUNC(bfm_sc5_state::bfm_sc5_duart_output_w));;
BFM_BDA(config, m_vfd0, 60, 0);
config.set_default_layout(layout_bfm_sc5);
- MCFG_DEVICE_ADD("ymz", YMZ280B, 16000000) // ?? Mhz
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
-MACHINE_CONFIG_END
+ YMZ280B(config, m_ymz, 16000000); // ?? Mhz
+ m_ymz->add_route(ALL_OUTPUTS, "mono", 1.0);
+}
#include "bfm_sc5sw.hxx"
diff --git a/src/mame/drivers/bfm_swp.cpp b/src/mame/drivers/bfm_swp.cpp
index 737fb1f05f7..85e2b22ab64 100644
--- a/src/mame/drivers/bfm_swp.cpp
+++ b/src/mame/drivers/bfm_swp.cpp
@@ -201,25 +201,24 @@ void bfm_swp_state::machine_start()
}
-MACHINE_CONFIG_START(bfm_swp_state::bfm_swp)
-
+void bfm_swp_state::bfm_swp(machine_config &config)
+{
/* basic machine hardware */
M68340(config, m_maincpu, 16000000);
m_maincpu->set_addrmap(AS_PROGRAM, &bfm_swp_state::bfm_swp_map);
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_UPDATE_DRIVER(bfm_swp_state, screen_update)
- MCFG_SCREEN_SIZE(64*8, 64*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 0*8, 32*8-1)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_screen_update(FUNC(bfm_swp_state::screen_update));
+ screen.set_size(64*8, 64*8);
+ screen.set_visarea(0*8, 32*8-1, 0*8, 32*8-1);
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("ymz", YMZ280B, 10000000 )
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
-MACHINE_CONFIG_END
+ YMZ280B(config, "ymz", 10000000).add_route(ALL_OUTPUTS, "mono", 1.0);
+}
ROM_START( c3_rtime )
ROM_REGION( 0x100000, "maincpu", 0 )
diff --git a/src/mame/drivers/bfmsys85.cpp b/src/mame/drivers/bfmsys85.cpp
index 88a423de51c..ac14291e3a2 100644
--- a/src/mame/drivers/bfmsys85.cpp
+++ b/src/mame/drivers/bfmsys85.cpp
@@ -400,17 +400,19 @@ void bfmsys85_state::memmap(address_map &map)
// machine driver for system85 board //////////////////////////////////////
-MACHINE_CONFIG_START(bfmsys85_state::bfmsys85)
- MCFG_DEVICE_ADD("maincpu", M6809, MASTER_CLOCK/4) // 6809 CPU at 1 Mhz
- MCFG_DEVICE_PROGRAM_MAP(memmap) // setup read and write memorymap
- MCFG_DEVICE_PERIODIC_INT_DRIVER(bfmsys85_state, timer_irq, 1000) // generate 1000 IRQ's per second
+void bfmsys85_state::bfmsys85(machine_config &config)
+{
+ M6809(config, m_maincpu, MASTER_CLOCK/4); // 6809 CPU at 1 Mhz
+ m_maincpu->set_addrmap(AS_PROGRAM, &bfmsys85_state::memmap); // setup read and write memorymap
+ m_maincpu->set_periodic_int(FUNC(bfmsys85_state::timer_irq), attotime::from_hz(1000)); // generate 1000 IRQ's per second
+
MSC1937(config, m_vfd);
ACIA6850(config, m_acia6850_0, 0);
m_acia6850_0->txd_handler().set(FUNC(bfmsys85_state::sys85_data_w));
- MCFG_DEVICE_ADD("acia_clock", CLOCK, 31250*16) // What are the correct ACIA clocks ?
- MCFG_CLOCK_SIGNAL_HANDLER(WRITELINE(*this, bfmsys85_state, write_acia_clock))
+ clock_device &acia_clock(CLOCK(config, "acia_clock", 31250*16)); // What are the correct ACIA clocks ?
+ acia_clock.signal_handler().set(FUNC(bfmsys85_state::write_acia_clock));
SPEAKER(config, "mono").front_center();
AY8912(config, "aysnd", MASTER_CLOCK/4).add_route(ALL_OUTPUTS, "mono", 0.25);
@@ -426,11 +428,10 @@ MACHINE_CONFIG_START(bfmsys85_state::bfmsys85)
REEL(config, m_reel[3], STARPOINT_48STEP_REEL, 1, 3, 0x09, 4);
m_reel[3]->optic_handler().set(FUNC(bfmsys85_state::reel_optic_cb<3>));
- MCFG_DEVICE_ADD("meters", METERS, 0)
- MCFG_METERS_NUMBER(8)
+ METERS(config, m_meters, 0).set_number(8);
config.set_default_layout(layout_bfmsys85);
-MACHINE_CONFIG_END
+}
// input ports for system85 board /////////////////////////////////////////
diff --git a/src/mame/drivers/bgt.cpp b/src/mame/drivers/bgt.cpp
index 4f2f90354a6..f9e6c432114 100644
--- a/src/mame/drivers/bgt.cpp
+++ b/src/mame/drivers/bgt.cpp
@@ -49,11 +49,12 @@ static INPUT_PORTS_START( bgt )
INPUT_PORTS_END
-MACHINE_CONFIG_START(bgt_state::bgt)
- MCFG_DEVICE_ADD("maincpu", V30, 12000000 ) // ? unknown CPU.. definitely x86 based tho
- MCFG_DEVICE_PROGRAM_MAP(bgt_map)
- MCFG_DEVICE_IO_MAP(bgt_io)
-MACHINE_CONFIG_END
+void bgt_state::bgt(machine_config &config)
+{
+ V30(config, m_maincpu, 12000000); // ? unknown CPU.. definitely x86 based tho
+ m_maincpu->set_addrmap(AS_PROGRAM, &bgt_state::bgt_map);
+ m_maincpu->set_addrmap(AS_IO, &bgt_state::bgt_io);
+}
ROM_START( bg_ddb )
ROM_REGION( 0x100000, "maincpu", 0 )
diff --git a/src/mame/drivers/bigbord2.cpp b/src/mame/drivers/bigbord2.cpp
index c1656a00c19..0c49250c480 100644
--- a/src/mame/drivers/bigbord2.cpp
+++ b/src/mame/drivers/bigbord2.cpp
@@ -548,7 +548,8 @@ MC6845_UPDATE_ROW( bigbord2_state::crtc_update_row )
#define MAIN_CLOCK 8_MHz_XTAL / 2
-MACHINE_CONFIG_START(bigbord2_state::bigbord2)
+void bigbord2_state::bigbord2(machine_config &config)
+{
/* basic machine hardware */
Z80(config, m_maincpu, MAIN_CLOCK);
m_maincpu->set_addrmap(AS_PROGRAM, &bigbord2_state::bigbord2_mem);
@@ -556,10 +557,10 @@ MACHINE_CONFIG_START(bigbord2_state::bigbord2)
m_maincpu->set_daisy_config(daisy_chain);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_RAW_PARAMS(10.69425_MHz_XTAL, 700, 0, 560, 260, 0, 240)
- MCFG_SCREEN_UPDATE_DEVICE("crtc", mc6845_device, screen_update)
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_crt8002)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_raw(10.69425_MHz_XTAL, 700, 0, 560, 260, 0, 240);
+ screen.set_screen_update("crtc", FUNC(mc6845_device::screen_update));
+ GFXDECODE(config, "gfxdecode", m_palette, gfx_crt8002);
PALETTE(config, m_palette, palette_device::MONOCHROME);
CLOCK(config, "ctc_clock", MAIN_CLOCK).signal_handler().set(FUNC(bigbord2_state::clock_w));
@@ -590,10 +591,8 @@ MACHINE_CONFIG_START(bigbord2_state::bigbord2)
MB8877(config, m_fdc, 16_MHz_XTAL / 8); // 2MHz for 8 inch, or 1MHz otherwise (jumper-selectable)
//m_fdc->intrq_wr_callback().set_inputline(m_maincpu, ??); // info missing from schematic
- MCFG_FLOPPY_DRIVE_ADD("fdc:0", bigbord2_floppies, "8dsdd", floppy_image_device::default_floppy_formats)
- MCFG_FLOPPY_DRIVE_SOUND(true)
- MCFG_FLOPPY_DRIVE_ADD("fdc:1", bigbord2_floppies, "8dsdd", floppy_image_device::default_floppy_formats)
- MCFG_FLOPPY_DRIVE_SOUND(true)
+ FLOPPY_CONNECTOR(config, "fdc:0", bigbord2_floppies, "8dsdd", floppy_image_device::default_floppy_formats).enable_sound(true);
+ FLOPPY_CONNECTOR(config, "fdc:1", bigbord2_floppies, "8dsdd", floppy_image_device::default_floppy_formats).enable_sound(true);
mc6845_device &crtc(MC6845(config, "crtc", 16_MHz_XTAL / 8));
crtc.set_screen("screen");
@@ -617,7 +616,7 @@ MACHINE_CONFIG_START(bigbord2_state::bigbord2)
m_syslatch1->q_out_cb<6>().set(FUNC(bigbord2_state::disk_motor_w)); // MOTOR
m_syslatch1->q_out_cb<7>().set("beeper", FUNC(beep_device::set_state)); // BELL
- MCFG_DEVICE_ADD("outlatch1", LS259, 0) // U96
+ LS259(config, "outlatch1", 0); // U96
/* keyboard */
generic_keyboard_device &keyboard(GENERIC_KEYBOARD(config, "keyboard", 0));
@@ -625,9 +624,8 @@ MACHINE_CONFIG_START(bigbord2_state::bigbord2)
/* sound hardware */
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("beeper", BEEP, 950) // actual frequency is unknown
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.50)
-MACHINE_CONFIG_END
+ BEEP(config, "beeper", 950).add_route(ALL_OUTPUTS, "mono", 0.50); // actual frequency is unknown
+}
/* ROMs */
diff --git a/src/mame/drivers/bigevglf.cpp b/src/mame/drivers/bigevglf.cpp
index abd4c2f179f..b1db2003440 100644
--- a/src/mame/drivers/bigevglf.cpp
+++ b/src/mame/drivers/bigevglf.cpp
@@ -394,7 +394,7 @@ void bigevglf_state::bigevglf(machine_config &config)
m_audiocpu->set_periodic_int(FUNC(bigevglf_state::irq0_line_hold), attotime::from_hz(2*60)); /* IRQ generated by ???;
2 irqs/frame give good music tempo but also SOUND ERROR in test mode,
4 irqs/frame give SOUND OK in test mode but music seems to be running too fast */
- /* Clearly, then, there should be some sort of IRQ acknowledge mechanism, duh. -R */
+ /* Clearly, then, there should be some sort of IRQ acknowledge mechanism, duh. -R */
GENERIC_LATCH_8(config, m_soundlatch[0]);
m_soundlatch[0]->data_pending_callback().set("soundnmi", FUNC(input_merger_device::in_w<0>));
@@ -440,7 +440,6 @@ void bigevglf_state::bigevglf(machine_config &config)
DAC_8BIT_R2R(config, "dac", 0).add_route(ALL_OUTPUTS, "mono", 0.50); // unknown DAC
voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref", 0));
- vref.set_output(5.0);
vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT);
vref.add_route(0, "dac", -1.0, DAC_VREF_NEG_INPUT);
}
diff --git a/src/mame/drivers/bigstrkb.cpp b/src/mame/drivers/bigstrkb.cpp
index e77eedb6992..a74d01c7885 100644
--- a/src/mame/drivers/bigstrkb.cpp
+++ b/src/mame/drivers/bigstrkb.cpp
@@ -200,21 +200,21 @@ GFXDECODE_END
/* Machine Driver */
-MACHINE_CONFIG_START(bigstrkb_state::bigstrkb)
-
- MCFG_DEVICE_ADD("maincpu", M68000, 12000000)
- MCFG_DEVICE_PROGRAM_MAP(bigstrkb_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", bigstrkb_state, irq6_line_hold)
+void bigstrkb_state::bigstrkb(machine_config &config)
+{
+ M68000(config, m_maincpu, 12000000);
+ m_maincpu->set_addrmap(AS_PROGRAM, &bigstrkb_state::bigstrkb_map);
+ m_maincpu->set_vblank_int("screen", FUNC(bigstrkb_state::irq6_line_hold));
GFXDECODE(config, m_gfxdecode, m_palette, gfx_bigstrkb);
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(32*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(bigstrkb_state, screen_update)
- MCFG_SCREEN_PALETTE(m_palette)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(32*8, 32*8);
+ screen.set_visarea(0*8, 32*8-1, 2*8, 30*8-1);
+ screen.set_screen_update(FUNC(bigstrkb_state::screen_update));
+ screen.set_palette(m_palette);
PALETTE(config, m_palette).set_format(palette_device::RRRRGGGGBBBBRGBx, 0x400);
@@ -222,14 +222,14 @@ MACHINE_CONFIG_START(bigstrkb_state::bigstrkb)
SPEAKER(config, "rspeaker").front_right();
// YM2151(config, "ymsnd", 4000000);
- MCFG_DEVICE_ADD("oki1", OKIM6295, 4000000, okim6295_device::PIN7_HIGH)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 0.30)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 0.30)
+ okim6295_device &oki1(OKIM6295(config, "oki1", 4000000, okim6295_device::PIN7_HIGH));
+ oki1.add_route(ALL_OUTPUTS, "lspeaker", 0.30);
+ oki1.add_route(ALL_OUTPUTS, "rspeaker", 0.30);
- MCFG_DEVICE_ADD("oki2", OKIM6295, 4000000, okim6295_device::PIN7_HIGH)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 0.30)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 0.30)
-MACHINE_CONFIG_END
+ okim6295_device &oki2(OKIM6295(config, "oki2", 4000000, okim6295_device::PIN7_HIGH));
+ oki2.add_route(ALL_OUTPUTS, "lspeaker", 0.30);
+ oki2.add_route(ALL_OUTPUTS, "rspeaker", 0.30);
+}
/* Rom Loading */
diff --git a/src/mame/drivers/binbug.cpp b/src/mame/drivers/binbug.cpp
index 58d130d8e4e..4996932999b 100644
--- a/src/mame/drivers/binbug.cpp
+++ b/src/mame/drivers/binbug.cpp
@@ -336,8 +336,8 @@ void binbug_state::binbug(machine_config &config)
RS232_PORT(config, m_rs232, default_rs232_devices, "keyboard").set_option_device_input_defaults("keyboard", DEVICE_INPUT_DEFAULTS_NAME(keyboard));
/* quickload */
- quickload_image_device &quickload(QUICKLOAD(config, "quickload", 0));
- quickload.set_handler(snapquick_load_delegate(&QUICKLOAD_LOAD_NAME(binbug_state, binbug), this), "pgm", 1);
+ quickload_image_device &quickload(QUICKLOAD(config, "quickload"));
+ quickload.set_handler(snapquick_load_delegate(&QUICKLOAD_LOAD_NAME(binbug_state, binbug), this), "pgm", attotime::from_seconds(1));
}
@@ -424,7 +424,7 @@ public:
: binbug_state(mconfig, type, tag)
, m_ctc(*this, "z80ctc")
, m_pio(*this, "z80pio")
- { }
+ { }
DECLARE_READ8_MEMBER(porta_r);
DECLARE_READ8_MEMBER(portb_r);
diff --git a/src/mame/drivers/bingo.cpp b/src/mame/drivers/bingo.cpp
index 1be53b0a822..b00b4794f7b 100644
--- a/src/mame/drivers/bingo.cpp
+++ b/src/mame/drivers/bingo.cpp
@@ -46,11 +46,12 @@ void bingo_state::init_bingo()
{
}
-MACHINE_CONFIG_START(bingo_state::bingo)
+void bingo_state::bingo(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", S2650, 1000000)
- MCFG_DEVICE_PROGRAM_MAP(bingo_map)
-MACHINE_CONFIG_END
+ S2650(config, m_maincpu, 1000000);
+ m_maincpu->set_addrmap(AS_PROGRAM, &bingo_state::bingo_map);
+}
class seeben_state : public driver_device
{
@@ -89,11 +90,12 @@ void seeben_state::init_seeben()
{
}
-MACHINE_CONFIG_START(seeben_state::seeben)
+void seeben_state::seeben(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", I8085A, 1000000)
- MCFG_DEVICE_PROGRAM_MAP(seeben_map)
-MACHINE_CONFIG_END
+ I8085A(config, m_maincpu, 1000000);
+ m_maincpu->set_addrmap(AS_PROGRAM, &seeben_state::seeben_map);
+}
class splin_state : public driver_device
{
@@ -134,11 +136,12 @@ void splin_state::init_splin()
{
}
-MACHINE_CONFIG_START(splin_state::splin)
+void splin_state::splin(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", I80186, 16000000)
- MCFG_DEVICE_PROGRAM_MAP(splin_map)
-MACHINE_CONFIG_END
+ I80186(config, m_maincpu, 16000000);
+ m_maincpu->set_addrmap(AS_PROGRAM, &splin_state::splin_map);
+}
ROM_START(cntinntl)
ROM_REGION(0x8000, "maincpu", 0)
diff --git a/src/mame/drivers/bingoc.cpp b/src/mame/drivers/bingoc.cpp
index e6a55bd123d..65861f43ff7 100644
--- a/src/mame/drivers/bingoc.cpp
+++ b/src/mame/drivers/bingoc.cpp
@@ -168,40 +168,40 @@ static INPUT_PORTS_START( bingoc )
INPUT_PORTS_END
-MACHINE_CONFIG_START(bingoc_state::bingoc)
-
- MCFG_DEVICE_ADD("maincpu", M68000,8000000) /* ? MHz */
- MCFG_DEVICE_PROGRAM_MAP(main_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", bingoc_state, irq2_line_hold)
+void bingoc_state::bingoc(machine_config &config)
+{
+ M68000(config, m_maincpu, 8000000); /* ? MHz */
+ m_maincpu->set_addrmap(AS_PROGRAM, &bingoc_state::main_map);
+ m_maincpu->set_vblank_int("screen", FUNC(bingoc_state::irq2_line_hold));
- MCFG_DEVICE_ADD("soundcpu", Z80,4000000) /* ? MHz */
- MCFG_DEVICE_PROGRAM_MAP(sound_map)
- MCFG_DEVICE_IO_MAP(sound_io)
+ Z80(config, m_soundcpu, 4000000); /* ? MHz */
+ m_soundcpu->set_addrmap(AS_PROGRAM, &bingoc_state::sound_map);
+ m_soundcpu->set_addrmap(AS_IO, &bingoc_state::sound_io);
#if SOUND_TEST
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", bingoc_state, nmi_line_pulse)
+ m_soundcpu->set_vblank_int("screen", FUNC(bingoc_state::nmi_line_pulse));
#endif
- MCFG_DEVICE_ADD("uart1", I8251, 4000000) // unknown
- MCFG_DEVICE_ADD("uart2", I8251, 4000000) // unknown
- MCFG_DEVICE_ADD("uart3", I8251, 4000000) // unknown
- MCFG_DEVICE_ADD("uart4", I8251, 4000000) // unknown
- MCFG_DEVICE_ADD("uart5", I8251, 4000000) // unknown
- MCFG_DEVICE_ADD("uart6", I8251, 4000000) // unknown
- MCFG_DEVICE_ADD("uart7", I8251, 4000000) // unknown
- MCFG_DEVICE_ADD("uart8", I8251, 4000000) // unknown
+ I8251(config, "uart1", 4000000); // unknown
+ I8251(config, "uart2", 4000000); // unknown
+ I8251(config, "uart3", 4000000); // unknown
+ I8251(config, "uart4", 4000000); // unknown
+ I8251(config, "uart5", 4000000); // unknown
+ I8251(config, "uart6", 4000000); // unknown
+ I8251(config, "uart7", 4000000); // unknown
+ I8251(config, "uart8", 4000000); // unknown
- MCFG_DEVICE_ADD("io", SEGA_315_5338A, 0) // ?
+ SEGA_315_5338A(config, "io", 0); // ?
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(512, 256)
- MCFG_SCREEN_VISIBLE_AREA(0, 512-1, 0, 256-1)
- MCFG_SCREEN_UPDATE_DRIVER(bingoc_state, screen_update_bingoc)
- MCFG_SCREEN_PALETTE("palette")
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(512, 256);
+ screen.set_visarea_full();
+ screen.set_screen_update(FUNC(bingoc_state::screen_update_bingoc));
+ screen.set_palette("palette");
- MCFG_PALETTE_ADD("palette", 0x100)
+ PALETTE(config, "palette").set_entries(0x100);
SPEAKER(config, "lspeaker").front_left(); //might just be mono...
@@ -211,10 +211,10 @@ MACHINE_CONFIG_START(bingoc_state::bingoc)
YM2151(config, "ymsnd", 7159160/2).add_route(0, "lspeaker", 1.0).add_route(1, "rspeaker", 1.0);
- MCFG_DEVICE_ADD("upd", UPD7759)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 1.0)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 1.0)
-MACHINE_CONFIG_END
+ UPD7759(config, m_upd7759);
+ m_upd7759->add_route(ALL_OUTPUTS, "lspeaker", 1.0);
+ m_upd7759->add_route(ALL_OUTPUTS, "rspeaker", 1.0);
+}
ROM_START( bingoc )
ROM_REGION( 0x40000, "maincpu", 0 )
diff --git a/src/mame/drivers/bingoman.cpp b/src/mame/drivers/bingoman.cpp
index 17da5720752..db3196dd5fb 100644
--- a/src/mame/drivers/bingoman.cpp
+++ b/src/mame/drivers/bingoman.cpp
@@ -379,28 +379,28 @@ void bingoman_state::bingoman_palette(palette_device &palette) const
{
}
-MACHINE_CONFIG_START(bingoman_state::bingoman)
-
+void bingoman_state::bingoman(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", H83002, XTAL(20'000'000)) /* TODO: correct CPU type */
- MCFG_DEVICE_PROGRAM_MAP(bingoman_prg_map)
- MCFG_DEVICE_IO_MAP(bingoman_io_map)
+ H83002(config, m_maincpu, XTAL(20'000'000)); /* TODO: correct CPU type */
+ m_maincpu->set_addrmap(AS_PROGRAM, &bingoman_state::bingoman_prg_map);
+ m_maincpu->set_addrmap(AS_IO, &bingoman_state::bingoman_io_map);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500))
- MCFG_SCREEN_UPDATE_DRIVER(bingoman_state, screen_update)
- MCFG_SCREEN_SIZE(32*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 0*8, 32*8-1)
- MCFG_SCREEN_PALETTE("palette")
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500));
+ screen.set_screen_update(FUNC(bingoman_state::screen_update));
+ screen.set_size(32*8, 32*8);
+ screen.set_visarea_full();
+ screen.set_palette("palette");
GFXDECODE(config, "gfxdecode", "palette", gfx_bingoman);
PALETTE(config, "palette", FUNC(bingoman_state::bingoman_palette), 8);
/* sound hardware */
SPEAKER(config, "mono").front_center();
-MACHINE_CONFIG_END
+}
/***************************************************************************
diff --git a/src/mame/drivers/bingowav.cpp b/src/mame/drivers/bingowav.cpp
index f2284300fc5..9286efd3343 100644
--- a/src/mame/drivers/bingowav.cpp
+++ b/src/mame/drivers/bingowav.cpp
@@ -82,7 +82,6 @@ void bingowav_state::bingowav_main_map(address_map &map)
map(0x140000, 0x140001).nopr();
map(0x150001, 0x150001).w("tc0140syt", FUNC(tc0140syt_device::master_port_w));
map(0x150003, 0x150003).rw("tc0140syt", FUNC(tc0140syt_device::master_comm_r), FUNC(tc0140syt_device::master_comm_w));
- map(0xfffc00, 0xffffff).rw("maintmp", FUNC(tmp68301_device::regs_r), FUNC(tmp68301_device::regs_w));
}
void bingowav_state::bingowav_audio_map(address_map &map)
@@ -114,12 +113,9 @@ INPUT_PORTS_END
void bingowav_state::bingowav(machine_config &config)
{
- M68000(config, m_maincpu, 12000000); // actually TMP63803F-16
+ TMP68301(config, m_maincpu, 12000000); // actually TMP63803F-16
m_maincpu->set_addrmap(AS_PROGRAM, &bingowav_state::bingowav_main_map);
- tmp68301_device &tmp68301(TMP68301(config, "maintmp", 0)); // wrong
- tmp68301.set_cputag(m_maincpu);
-
te7750_device &mainioh(TE7750(config, "mainioh"));
mainioh.ios_cb().set_constant(5);
diff --git a/src/mame/drivers/bionicc.cpp b/src/mame/drivers/bionicc.cpp
index 35c0fa36d9d..5a69d4abef7 100644
--- a/src/mame/drivers/bionicc.cpp
+++ b/src/mame/drivers/bionicc.cpp
@@ -388,21 +388,21 @@ void bionicc_state::machine_reset()
m_scroll[3] = 0;
}
-MACHINE_CONFIG_START(bionicc_state::bionicc)
-
+void bionicc_state::bionicc(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M68000, XTAL(24'000'000) / 2) /* 12 MHz - verified in schematics */
- MCFG_DEVICE_PROGRAM_MAP(main_map)
- MCFG_TIMER_DRIVER_ADD_SCANLINE("scantimer", bionicc_state, scanline, "screen", 0, 1)
+ M68000(config, m_maincpu, XTAL(24'000'000) / 2); /* 12 MHz - verified in schematics */
+ m_maincpu->set_addrmap(AS_PROGRAM, &bionicc_state::main_map);
+ TIMER(config, "scantimer").configure_scanline(FUNC(bionicc_state::scanline), "screen", 0, 1);
- MCFG_DEVICE_ADD("audiocpu", Z80, XTAL(14'318'181) / 4) /* EXO3 C,B=GND, A=5V ==> Divisor 2^2 */
- MCFG_DEVICE_PROGRAM_MAP(sound_map)
+ z80_device &audiocpu(Z80(config, "audiocpu", XTAL(14'318'181) / 4)); /* EXO3 C,B=GND, A=5V ==> Divisor 2^2 */
+ audiocpu.set_addrmap(AS_PROGRAM, &bionicc_state::sound_map);
/* FIXME: interrupt timing
* schematics indicate that nmi_line is set on M680000 access with AB1=1
* and IOCS=0 (active low), see pages A-1/10, A-4/10 in schematics
*/
- MCFG_DEVICE_PERIODIC_INT_DRIVER(bionicc_state, nmi_line_pulse, 4*60)
+ audiocpu.set_periodic_int(FUNC(bionicc_state::nmi_line_pulse), attotime::from_hz(4*60));
/* Protection MCU Intel C8751H-88 runs at 24MHz / 4 = 6MHz */
I8751(config, m_mcu, XTAL(24'000'000) / 4);
@@ -411,27 +411,27 @@ MACHINE_CONFIG_START(bionicc_state::bionicc)
m_mcu->port_out_cb<3>().set(FUNC(bionicc_state::out3_w));
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
/* FIXME: should be 257 visible horizontal pixels, first visible pixel should be repeated, back porch/front porch should be separated */
- MCFG_SCREEN_RAW_PARAMS(XTAL(24'000'000) / 4, 386, 0, 256, 260, 16, 240)
- MCFG_SCREEN_UPDATE_DRIVER(bionicc_state, screen_update)
- MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE("spriteram", buffered_spriteram16_device, vblank_copy_rising))
- MCFG_SCREEN_PALETTE(m_palette)
+ screen.set_raw(XTAL(24'000'000) / 4, 386, 0, 256, 260, 16, 240);
+ screen.set_screen_update(FUNC(bionicc_state::screen_update));
+ screen.screen_vblank().set(m_spriteram, FUNC(buffered_spriteram16_device::vblank_copy_rising));
+ screen.set_palette(m_palette);
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_bionicc)
+ GFXDECODE(config, m_gfxdecode, m_palette, gfx_bionicc);
- MCFG_DEVICE_ADD("spritegen", TIGEROAD_SPRITE, 0)
+ TIGEROAD_SPRITE(config, m_spritegen, 0);
PALETTE(config, m_palette).set_format(2, &bionicc_state::RRRRGGGGBBBBIIII, 1024);
- MCFG_DEVICE_ADD("spriteram", BUFFERED_SPRITERAM16)
+ BUFFERED_SPRITERAM16(config, m_spriteram);
SPEAKER(config, "mono").front_center();
GENERIC_LATCH_8(config, m_soundlatch);
YM2151(config, "ymsnd", XTAL(14'318'181) / 4).add_route(0, "mono", 0.60).add_route(1, "mono", 0.60);
-MACHINE_CONFIG_END
+}
@@ -573,6 +573,50 @@ ROM_START( bionicc2 ) /* "Not for use outside of USA or Canada" 1st release */
ROM_LOAD( "63s141.18f", 0x0000, 0x0100, CRC(b58d0023) SHA1(e8a4a2e2951bf73b3d9eed6957e9ee1e61c9c58a) ) /* priority (not used), Labeled "TSB" */
ROM_END
+ROM_START( topsecrt2 ) /* "Not for use in any other country but Japan" */
+ ROM_REGION( 0x40000, "maincpu", 0 ) /* 68000 code */
+ ROM_LOAD16_BYTE( "ts_02b.1a", 0x00000, 0x10000, CRC(0b84497f) SHA1(f7e9412d37a1e4b7a437d3f7bc5dc448c8a22079) ) /* 68000 code */
+ ROM_LOAD16_BYTE( "ts_04b.1b", 0x00001, 0x10000, CRC(9ab6de8d) SHA1(04445bc183364ebb6a8833a147b694234b509634) ) /* 68000 code */
+ ROM_LOAD16_BYTE( "ts_03b.2a", 0x20000, 0x10000, CRC(1b3f8a82) SHA1(2f9cad83b7bd10617bbd5172a1d31f41b194d3ac) ) /* 68000 code */
+ ROM_LOAD16_BYTE( "ts_05b.2b", 0x20001, 0x10000, CRC(962a89d8) SHA1(4aa5b0fd68a59ff74716253b0ba4c1933e92855b) ) /* 68000 code */
+
+ ROM_REGION( 0x10000, "audiocpu", 0 )
+ ROM_LOAD( "ts_01b.4e", 0x00000, 0x8000, CRC(a9a6cafa) SHA1(55e0a0e6ca11e8e73339d5b4604e130031211291) )
+
+ ROM_REGION( 0x1000, "mcu", 0 ) /* i8751 microcontroller */
+ ROM_LOAD( "ts.2f", 0x0000, 0x1000, CRC(3ed7f0be) SHA1(db9e972065c8e60b5d74762dc3424271ea9524cb) ) /* from 'topsecrt' bootleg, but appears to be original */
+
+ ROM_REGION( 0x08000, "gfx1", 0 )
+ ROM_LOAD( "ts_08.8l", 0x00000, 0x8000, CRC(96ad379e) SHA1(accd3a560b259c186bc28cdc004ed8de0b12f9d5) ) /* VIDEORAM (text layer) tiles */
+
+ ROM_REGION( 0x10000, "gfx2", 0 )
+ ROM_LOAD( "ts_07.5l", 0x00000, 0x8000, CRC(25cdf8b2) SHA1(316f6acc46878682dabeab12722e6a64504d23bd) ) /* SCROLL2 Layer Tiles */
+ ROM_LOAD( "ts_06.4l", 0x08000, 0x8000, CRC(314fb12d) SHA1(dab0519a49b64fe7a837b3c6383f6147e1ab6ffd) )
+
+ ROM_REGION( 0x40000, "gfx3", 0 )
+ ROM_LOAD( "ts_12.17f", 0x00000, 0x8000, CRC(e4b4619e) SHA1(3bec8399ffb28fd50ce6ae88d90b091eadf8bda1) ) /* SCROLL1 Layer Tiles */
+ ROM_LOAD( "ts_11.15f", 0x08000, 0x8000, CRC(ab30237a) SHA1(ea6c07df992ba48f9eca7daa4ea775faa94358d2) )
+ ROM_LOAD( "ts_17.17g", 0x10000, 0x8000, CRC(deb657e4) SHA1(b36b468f9bbb7a4937286230d3f6caa14c61d4dd) )
+ ROM_LOAD( "ts_16.15g", 0x18000, 0x8000, CRC(d363b5f9) SHA1(1dd3991d99db2d6bcbdb12879ba50a01fef95004) )
+ ROM_LOAD( "ts_13.18f", 0x20000, 0x8000, CRC(a8f5a004) SHA1(36ab0cb8ec9ce0519876f7461ccc5020c9c5b597) )
+ ROM_LOAD( "ts_18.18g", 0x28000, 0x8000, CRC(3b36948c) SHA1(d85fcc0265ba1729c587b046cc5a7ba6f25363dd) )
+ ROM_LOAD( "ts_23.18j", 0x30000, 0x8000, CRC(bbfbe58a) SHA1(9b1d5672b6f3c5c0952f8dcd0da71acc68a97a5e) )
+ ROM_LOAD( "ts_24.18k", 0x38000, 0x8000, CRC(f156e564) SHA1(a6cad05bcc6d9ded6294f9b5aa856d05641aed02) )
+
+ ROM_REGION( 0x40000, "gfx4", 0 )
+ ROM_LOAD( "ts_10.13f", 0x00000, 0x8000, CRC(c3587d05) SHA1(ad0898a5d4cf110783ef092bf8e65b6ef31a8ae0) ) /* Sprites */
+ ROM_LOAD( "ts_09.11f", 0x08000, 0x8000, CRC(6b63eef2) SHA1(5d1580db7f49c5994c2a08a36c2d05f3e246930d) )
+ ROM_LOAD( "ts_15.13g", 0x10000, 0x8000, CRC(db8cebb0) SHA1(1cc9eac14851cde95fb2d69d6f5ffb08bc9c0d93) )
+ ROM_LOAD( "ts_14.11g", 0x18000, 0x8000, CRC(e2e41abf) SHA1(d002d0d8fdbb9ec3e2eac218f6338f733953ca82) )
+ ROM_LOAD( "ts_20.13j", 0x20000, 0x8000, CRC(bfd1a695) SHA1(bf93486b96bfa1a1d5015189043b07e6130e6df1) )
+ ROM_LOAD( "ts_19.11j", 0x28000, 0x8000, CRC(928b669e) SHA1(98ea9d23a46b0700490fd2fa7ab4fb0988dd5ca6) )
+ ROM_LOAD( "ts_22.17j", 0x30000, 0x8000, CRC(3fe05d9a) SHA1(32e28ef03fb82785019d1ae8b3859215b5368c2b) )
+ ROM_LOAD( "ts_21.15j", 0x38000, 0x8000, CRC(27a9bb7c) SHA1(bb60332c0ecde4d7797960dec39c1079498175c3) )
+
+ ROM_REGION( 0x0100, "proms", 0 )
+ ROM_LOAD( "63s141.18f", 0x0000, 0x0100, CRC(b58d0023) SHA1(e8a4a2e2951bf73b3d9eed6957e9ee1e61c9c58a) ) /* priority (not used), Labeled "TSB" */
+ROM_END
+
ROM_START( topsecrt ) /* "Not for use in any other country but Japan" */
ROM_REGION( 0x40000, "maincpu", 0 ) /* 68000 code */
ROM_LOAD16_BYTE( "ts_02.1a", 0x00000, 0x10000, CRC(b2fe1ddb) SHA1(892f19124993add96edabdba3aafeecc6668c5d9) ) /* 68000 code */
@@ -712,7 +756,8 @@ GAME( 1987, bionicc, 0, bionicc, bionicc, bionicc_state, empty_init, RO
GAME( 1987, bionicc1, bionicc, bionicc, bionicc, bionicc_state, empty_init, ROT0, "Capcom", "Bionic Commando (US set 1)", MACHINE_SUPPORTS_SAVE )
GAME( 1987, bionicc2, bionicc, bionicc, bionicc, bionicc_state, empty_init, ROT0, "Capcom", "Bionic Commando (US set 2)", MACHINE_SUPPORTS_SAVE )
GAME( 1987, topsecrt, bionicc, bionicc, bionicc, bionicc_state, empty_init, ROT0, "Capcom", "Top Secret (Japan, old revision)", MACHINE_SUPPORTS_SAVE )
+GAME( 1987, topsecrt2, bionicc, bionicc, bionicc, bionicc_state, empty_init, ROT0, "Capcom", "Top Secret (Japan, revision B)", MACHINE_SUPPORTS_SAVE )
GAME( 1987, bioniccbl, bionicc, bionicc, bionicc, bionicc_state, empty_init, ROT0, "bootleg", "Bionic Commandos (bootleg, set 1)", MACHINE_SUPPORTS_SAVE )
GAME( 1987, bioniccbl2, bionicc, bionicc, bionicc, bionicc_state, empty_init, ROT0, "bootleg", "Bionic Commandos (bootleg, set 2)", MACHINE_SUPPORTS_SAVE )
-// there's also an undumped JP new revision on which there are no extra lives after 1 million points, plus other bug-fixes / changes
+// there's also an undumped JP new revision on which there are no extra lives after 1 million points, plus other bug-fixes / changes (possibly topsecrt2 set?)
diff --git a/src/mame/drivers/bitgraph.cpp b/src/mame/drivers/bitgraph.cpp
index be66a7c5163..4d8c2f6e2c6 100644
--- a/src/mame/drivers/bitgraph.cpp
+++ b/src/mame/drivers/bitgraph.cpp
@@ -75,17 +75,18 @@
#define PSG_TAG "psg"
#define EAROM_TAG "earom"
-#define VERBOSE_DBG 1 /* general debug messages */
-
-#define DBG_LOG(N,M,A) \
- do { \
- if(VERBOSE_DBG>=N) \
- { \
- if( M ) \
- logerror("%11.6f at %s: %-24s",machine().time().as_double(),machine().describe_context(),(char*)M ); \
- logerror A; \
- } \
- } while (0)
+
+//#define LOG_GENERAL (1U << 0) //defined in logmacro.h already
+#define LOG_PIA (1U << 1)
+#define LOG_DEBUG (1U << 2)
+
+//#define VERBOSE (LOG_DEBUG)
+//#define LOG_OUTPUT_FUNC printf
+#include "logmacro.h"
+
+#define LOGPIA(...) LOGMASKED(LOG_PIA, __VA_ARGS__)
+#define LOGDBG(...) LOGMASKED(LOG_DEBUG, __VA_ARGS__)
+
class bitgraph_state : public driver_device
{
@@ -222,14 +223,14 @@ DEVICE_INPUT_DEFAULTS_END
READ8_MEMBER(bitgraph_state::pia_r)
{
- DBG_LOG(3, "PIA", ("R %d\n", offset));
- return m_pia->read(space, 3 - offset);
+ LOGPIA("PIA R %d\n", offset);
+ return m_pia->read(3 - offset);
}
WRITE8_MEMBER(bitgraph_state::pia_w)
{
- DBG_LOG(3, "PIA", ("W %d < %02X\n", offset, data));
- return m_pia->write(space, 3 - offset, data);
+ LOGPIA("PIA W %d < %02X\n", offset, data);
+ return m_pia->write(3 - offset, data);
}
READ_LINE_MEMBER(bitgraph_state::pia_ca1_r)
@@ -245,13 +246,13 @@ WRITE_LINE_MEMBER(bitgraph_state::pia_cb2_w)
READ8_MEMBER(bitgraph_state::pia_pa_r)
{
uint8_t data = BIT(m_pia_b, 3) ? m_earom->data() : m_pia_a;
- DBG_LOG(2, "PIA", ("A == %02X (%s)\n", data, BIT(m_pia_b, 3) ? "earom" : "pia"));
+ LOGDBG("PIA A == %02X (%s)\n", data, BIT(m_pia_b, 3) ? "earom" : "pia");
return data;
}
WRITE8_MEMBER(bitgraph_state::pia_pa_w)
{
- DBG_LOG(2, "PIA", ("A <- %02X\n", data));
+ LOGDBG("PIA A <- %02X\n", data);
m_pia_a = data;
}
@@ -267,28 +268,28 @@ WRITE8_MEMBER(bitgraph_state::pia_pa_w)
*/
READ8_MEMBER(bitgraph_state::pia_pb_r)
{
- DBG_LOG(2, "PIA", ("B == %02X\n", m_pia_b));
+ LOGDBG("PIA B == %02X\n", m_pia_b);
return m_pia_b;
}
WRITE8_MEMBER(bitgraph_state::pia_pb_w)
{
- DBG_LOG(2, "PIA", ("B <- %02X\n", data));
+ LOGDBG("PIA B <- %02X\n", data);
m_pia_b = data;
switch (m_pia_b & 0x03)
{
case 2:
- m_psg->data_w(space, 0, m_pia_a);
+ m_psg->data_w(m_pia_a);
break;
case 3:
- m_psg->address_w(space, 0, m_pia_a);
+ m_psg->address_w(m_pia_a);
break;
}
if (BIT(m_pia_b, 3))
{
- DBG_LOG(2, "EAROM", ("data <- %02X\n", m_pia_a));
+ LOGDBG("EAROM data <- %02X\n", m_pia_a);
m_earom->set_data(m_pia_a);
}
// CS1, ~CS2, C1, C2
@@ -303,14 +304,14 @@ WRITE8_MEMBER(bitgraph_state::pia_pb_w)
WRITE8_MEMBER(bitgraph_state::earom_write)
{
- DBG_LOG(2, "EAROM", ("addr <- %02X (%02X)\n", data & 0x3f, data));
+ LOGDBG("EAROM addr <- %02X (%02X)\n", data & 0x3f, data);
m_earom->set_address(data & 0x3f);
}
// written once and never changed
WRITE8_MEMBER(bitgraph_state::misccr_write)
{
- DBG_LOG(1, "MISCCR", ("<- %02X (DTR %d MAP %d)\n", data, BIT(data, 3), (data & 3)));
+ LOG("MISCCR <- %02X (DTR %d MAP %d)\n", data, BIT(data, 3), (data & 3));
m_misccr = data;
}
@@ -335,11 +336,11 @@ WRITE_LINE_MEMBER(bitgraph_state::system_clock_write)
// rev B writes EE5E -- 9600 HOST, 9600 PNT, 300 KBD, 9600 DBG
WRITE16_MEMBER(bitgraph_state::baud_write)
{
- DBG_LOG(1,"Baud", ("%04X\n", data));
- m_dbrgb->write_str(data & 15); // 2 DBG
- m_dbrga->write_stt((data >> 4) & 15); // 1 KBD
- m_dbrgb->write_stt((data >> 8) & 15); // 3 PNT
- m_dbrga->write_str((data >> 12) & 15); // 0 HOST
+ LOG("Baud %04X\n", data);
+ m_dbrgb->str_w(data & 15); // 2 DBG
+ m_dbrga->stt_w((data >> 4) & 15); // 1 KBD
+ m_dbrgb->stt_w((data >> 8) & 15); // 3 PNT
+ m_dbrga->str_w((data >> 12) & 15); // 0 HOST
}
WRITE_LINE_MEMBER(bitgraph_state::com8116_a_fr_w)
@@ -362,7 +363,7 @@ WRITE_LINE_MEMBER(bitgraph_state::com8116_b_fr_w)
WRITE_LINE_MEMBER(bitgraph_state::com8116_b_ft_w)
{
- if (m_acia3)
+ if (m_acia3.found())
{
m_acia3->write_txc(state);
m_acia3->write_rxc(state);
@@ -371,14 +372,14 @@ WRITE_LINE_MEMBER(bitgraph_state::com8116_b_ft_w)
READ8_MEMBER(bitgraph_state::adlc_r)
{
- DBG_LOG(1, "ADLC", ("R %d\n", offset));
- return m_adlc ? m_adlc->read(space, 3 - offset) : 0xff;
+ LOG("ADLC R %d\n", offset);
+ return m_adlc.found() ? m_adlc->read(3 - offset) : 0xff;
}
WRITE8_MEMBER(bitgraph_state::adlc_w)
{
- DBG_LOG(1, "ADLC", ("W %d < %02X\n", offset, data));
- if (m_adlc) return m_adlc->write(space, 3 - offset, data);
+ LOG("ADLC W %d < %02X\n", offset, data);
+ if (m_adlc.found()) return m_adlc->write(3 - offset, data);
}
uint32_t bitgraph_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
@@ -421,13 +422,13 @@ uint32_t bitgraph_state::screen_update(screen_device &screen, bitmap_ind16 &bitm
READ8_MEMBER(bitgraph_state::ppu_read)
{
uint8_t data = m_ppu[offset];
- DBG_LOG(2, "PPU", ("%d == %02X\n", offset, data));
+ LOGDBG("PPU %d == %02X\n", offset, data);
return data;
}
WRITE8_MEMBER(bitgraph_state::ppu_write)
{
- DBG_LOG(2, "PPU", ("%d <- %02X\n", offset, data));
+ LOGDBG("PPU %d <- %02X\n", offset, data);
m_ppu[offset] = data;
}
@@ -446,7 +447,7 @@ void bitgraph_state::ppu_io(address_map &map)
*/
WRITE8_MEMBER(bitgraph_state::ppu_i8243_w)
{
- DBG_LOG(1, "PPU", ("8243 %d <- %02X\n", offset + 4, data));
+ LOG("PPU 8243 %d <- %02X\n", offset + 4, data);
switch (offset)
{
case 0:
@@ -491,14 +492,15 @@ void bitgraph_state::machine_reset()
}
-MACHINE_CONFIG_START(bitgraph_state::bg_motherboard)
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(40)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */
- MCFG_SCREEN_SIZE(1024, 768)
- MCFG_SCREEN_VISIBLE_AREA(0, 1024-1, 0, 768-1)
- MCFG_SCREEN_UPDATE_DRIVER(bitgraph_state, screen_update)
- MCFG_SCREEN_PALETTE("palette")
+void bitgraph_state::bg_motherboard(machine_config &config)
+{
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_refresh_hz(40);
+ m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */
+ m_screen->set_size(1024, 768);
+ m_screen->set_visarea_full();
+ m_screen->set_screen_update(FUNC(bitgraph_state::screen_update));
+ m_screen->set_palette("palette");
PALETTE(config, "palette", palette_device::MONOCHROME);
@@ -550,16 +552,17 @@ MACHINE_CONFIG_START(bitgraph_state::bg_motherboard)
m_pia->readpb_handler().set(FUNC(bitgraph_state::pia_pb_r));
m_pia->writepb_handler().set(FUNC(bitgraph_state::pia_pb_w));
- MCFG_DEVICE_ADD(EAROM_TAG, ER2055, 0)
+ ER2055(config, m_earom, 0);
SPEAKER(config, "mono").front_center();
AY8912(config, m_psg, XTAL(1'294'400));
m_psg->port_a_write_callback().set(FUNC(bitgraph_state::earom_write));
m_psg->add_route(ALL_OUTPUTS, "mono", 1.00);
-MACHINE_CONFIG_END
+}
#ifdef UNUSED_FUNCTION
-MACHINE_CONFIG_START(bitgraph_state::bg_ppu)
+void bitgraph_state::bg_ppu(machine_config &config)
+{
i8035_device &ppu(I8035(config, PPU_TAG, XTAL(6'900'000)));
ppu.set_addrmap(AS_IO, &bitgraph_state::ppu_io);
// ppu.t0_in_cb().set(FUNC(bitgraph_state::ppu_t0_r));
@@ -569,16 +572,17 @@ MACHINE_CONFIG_START(bitgraph_state::bg_ppu)
i8243.read_handler().set_nop();
i8243.write_handler().set(FUNC(bitgraph_state::ppu_i8243_w));
- MCFG_CENTRONICS_ADD("centronics", centronics_devices, "printer")
- MCFG_CENTRONICS_ACK_HANDLER(WRITELINE("cent_status_in", input_buffer_device, write_bit6))
- MCFG_CENTRONICS_BUSY_HANDLER(WRITELINE("cent_status_in", input_buffer_device, write_bit7))
- MCFG_CENTRONICS_FAULT_HANDLER(WRITELINE("cent_status_in", input_buffer_device, write_bit4))
- MCFG_CENTRONICS_PERROR_HANDLER(WRITELINE("cent_status_in", input_buffer_device, write_bit5))
+ CENTRONICS(config, m_centronics, centronics_devices, "printer");
+ m_centronics->ack_handler().set("cent_status_in", FUNC(input_buffer_device::write_bit6));
+ m_centronics->busy_handler().set("cent_status_in", FUNC(input_buffer_device::write_bit7));
+ m_centronics->fault_handler().set("cent_status_in", FUNC(input_buffer_device::write_bit4));
+ m_centronics->perror_handler().set("cent_status_in", FUNC(input_buffer_device::write_bit5));
- MCFG_DEVICE_ADD("cent_status_in", INPUT_BUFFER, 0)
+ INPUT_BUFFER(config, "cent_status_in");
- MCFG_CENTRONICS_OUTPUT_LATCH_ADD("cent_data_out", "centronics")
-MACHINE_CONFIG_END
+ output_latch_device &cent_data_out(OUTPUT_LATCH(config, "cent_data_out"));
+ m_centronics->set_output_latch(cent_data_out);
+}
#endif
void bitgraph_state::bitgrpha(machine_config &config)
diff --git a/src/mame/drivers/bk.cpp b/src/mame/drivers/bk.cpp
index 60dd90a8033..5094b821dde 100644
--- a/src/mame/drivers/bk.cpp
+++ b/src/mame/drivers/bk.cpp
@@ -193,12 +193,12 @@ void bk_state::bk0010(machine_config &config)
SOFTWARE_LIST(config, "cass_list").set_original("bk0010");
}
-MACHINE_CONFIG_START(bk_state::bk0010fd)
+void bk_state::bk0010fd(machine_config &config)
+{
bk0010(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(bk0010fd_mem)
-MACHINE_CONFIG_END
+ m_maincpu->set_addrmap(AS_PROGRAM, &bk_state::bk0010fd_mem);
+}
/* ROM definition */
diff --git a/src/mame/drivers/bking.cpp b/src/mame/drivers/bking.cpp
index d9344ee4259..930b4417530 100644
--- a/src/mame/drivers/bking.cpp
+++ b/src/mame/drivers/bking.cpp
@@ -389,33 +389,33 @@ MACHINE_RESET_MEMBER(bking_state,bking3)
m_addr_l = 0;
}
-MACHINE_CONFIG_START(bking_state::bking)
-
+void bking_state::bking(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("main_cpu", Z80, XTAL(12'000'000)/4) /* 3 MHz */
- MCFG_DEVICE_PROGRAM_MAP(bking_map)
- MCFG_DEVICE_IO_MAP(bking_io_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", bking_state, irq0_line_hold)
+ z80_device &maincpu(Z80(config, "main_cpu", XTAL(12'000'000)/4)); /* 3 MHz */
+ maincpu.set_addrmap(AS_PROGRAM, &bking_state::bking_map);
+ maincpu.set_addrmap(AS_IO, &bking_state::bking_io_map);
+ maincpu.set_vblank_int("screen", FUNC(bking_state::irq0_line_hold));
- MCFG_DEVICE_ADD("audiocpu", Z80, XTAL(6'000'000)/2) /* 3 MHz */
- MCFG_DEVICE_PROGRAM_MAP(bking_audio_map)
+ Z80(config, m_audiocpu, XTAL(6'000'000)/2); /* 3 MHz */
+ m_audiocpu->set_addrmap(AS_PROGRAM, &bking_state::bking_audio_map);
/* interrupts (from Jungle King hardware, might be wrong): */
/* - no interrupts synced with vblank */
/* - NMI triggered by the main CPU */
/* - periodic IRQ, with frequency 6000000/(4*16*16*10*16) = 36.621 Hz, */
- MCFG_DEVICE_PERIODIC_INT_DRIVER(bking_state, irq0_line_hold, (double)6000000/(4*16*16*10*16))
+ m_audiocpu->set_periodic_int(FUNC(bking_state::irq0_line_hold), attotime::from_hz((double)6000000/(4*16*16*10*16)));
WATCHDOG_TIMER(config, "watchdog");
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(32*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(bking_state, screen_update_bking)
- MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE(*this, bking_state, screen_vblank_bking))
- MCFG_SCREEN_PALETTE(m_palette)
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_refresh_hz(60);
+ m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ m_screen->set_size(32*8, 32*8);
+ m_screen->set_visarea(0*8, 32*8-1, 2*8, 30*8-1);
+ m_screen->set_screen_update(FUNC(bking_state::screen_update_bking));
+ m_screen->screen_vblank().set(FUNC(bking_state::screen_vblank_bking));
+ m_screen->set_palette(m_palette);
GFXDECODE(config, m_gfxdecode, m_palette, gfx_bking);
PALETTE(config, m_palette, FUNC(bking_state::bking_palette), 4*8 + 4*4 + 4*2 + 4*2);
@@ -434,25 +434,26 @@ MACHINE_CONFIG_START(bking_state::bking)
ay2.port_b_write_callback().set(FUNC(bking_state::port_b_w));
ay2.add_route(ALL_OUTPUTS, "speaker", 0.25);
- MCFG_DEVICE_ADD("dac", DAC_8BIT_R2R, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 0.25) // unknown DAC
- MCFG_DEVICE_ADD("vref", VOLTAGE_REGULATOR, 0) MCFG_VOLTAGE_REGULATOR_OUTPUT(5.0)
- MCFG_SOUND_ROUTE(0, "dac", 1.0, DAC_VREF_POS_INPUT) MCFG_SOUND_ROUTE(0, "dac", -1.0, DAC_VREF_NEG_INPUT)
-MACHINE_CONFIG_END
+ DAC_8BIT_R2R(config, "dac", 0).add_route(ALL_OUTPUTS, "speaker", 0.25); // unknown DAC
+ voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref"));
+ vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT);
+ vref.add_route(0, "dac", -1.0, DAC_VREF_NEG_INPUT);
+}
-MACHINE_CONFIG_START(bking_state::bking3)
+void bking_state::bking3(machine_config &config)
+{
bking(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("main_cpu")
- MCFG_DEVICE_IO_MAP(bking3_io_map)
+ subdevice<z80_device>("main_cpu")->set_addrmap(AS_IO, &bking_state::bking3_io_map);
- MCFG_DEVICE_ADD("bmcu", TAITO68705_MCU, XTAL(3'000'000)) /* xtal is 3MHz, divided by 4 internally */
+ TAITO68705_MCU(config, m_bmcu, XTAL(3'000'000)); /* xtal is 3MHz, divided by 4 internally */
MCFG_MACHINE_START_OVERRIDE(bking_state,bking3)
MCFG_MACHINE_RESET_OVERRIDE(bking_state,bking3)
- MCFG_QUANTUM_TIME(attotime::from_hz(6000))
-MACHINE_CONFIG_END
+ config.m_minimum_quantum = attotime::from_hz(6000);
+}
/***************************************************************************
diff --git a/src/mame/drivers/blackt96.cpp b/src/mame/drivers/blackt96.cpp
index 28bb8f2f685..690fab53182 100644
--- a/src/mame/drivers/blackt96.cpp
+++ b/src/mame/drivers/blackt96.cpp
@@ -447,14 +447,14 @@ WRITE8_MEMBER(blackt96_state::blackt96_soundio_port_c_w)
if (((data & 0x02) == 0x00) && ((m_port_c_data & 0x02) == 0x02)) // high -> low on bit 0x02 writes to selected OKI
{
//logerror("%s: blackt96_soundio_port_c_w (write to OKI %02x) (oki selected is %02x)\n", machine().describe_context().c_str(), m_port_b_latch, m_oki_selected);
- if (m_oki_selected == 0) m_oki[0]->write(space, 0, m_port_b_latch);
- else if (m_oki_selected == 1) m_oki[1]->write(space, 0, m_port_b_latch);
+ if (m_oki_selected == 0) m_oki[0]->write(m_port_b_latch);
+ else if (m_oki_selected == 1) m_oki[1]->write(m_port_b_latch);
}
if (((data & 0x01) == 0x00) && ((m_port_c_data & 0x01) == 0x01)) // high -> low on bit 0x01 reads to selected OKI
{
- if (m_oki_selected == 0) m_port_b_latch = m_oki[0]->read(space, 0);
- else if (m_oki_selected == 1) m_port_b_latch = m_oki[1]->read(space, 0);
+ if (m_oki_selected == 0) m_port_b_latch = m_oki[0]->read();
+ else if (m_oki_selected == 1) m_port_b_latch = m_oki[1]->read();
}
m_port_c_data = data;
@@ -477,10 +477,11 @@ void blackt96_state::tile_callback(int &tile, int& fx, int& fy, int& region)
}
-MACHINE_CONFIG_START(blackt96_state::blackt96)
- MCFG_DEVICE_ADD("maincpu", M68000, 18000000 /2)
- MCFG_DEVICE_PROGRAM_MAP(blackt96_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", blackt96_state, irq1_line_hold)
+void blackt96_state::blackt96(machine_config &config)
+{
+ M68000(config, m_maincpu, 18000000 /2);
+ m_maincpu->set_addrmap(AS_PROGRAM, &blackt96_state::blackt96_map);
+ m_maincpu->set_vblank_int("screen", FUNC(blackt96_state::irq1_line_hold));
pic16c57_device &audiocpu(PIC16C57(config, "audiocpu", 8000000)); /* ? */
audiocpu.write_a().set(FUNC(blackt96_state::blackt96_soundio_port_a_w));
@@ -489,16 +490,16 @@ MACHINE_CONFIG_START(blackt96_state::blackt96)
audiocpu.read_c().set(FUNC(blackt96_state::blackt96_soundio_port_c_r));
audiocpu.write_c().set(FUNC(blackt96_state::blackt96_soundio_port_c_w));
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_blackt96)
+ GFXDECODE(config, m_gfxdecode, m_palette, gfx_blackt96);
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(256, 256)
-// MCFG_SCREEN_VISIBLE_AREA(0*8, 16*32-1, 0*8, 16*32-1)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 256-1, 2*8, 240-1)
- MCFG_SCREEN_UPDATE_DRIVER(blackt96_state, screen_update_blackt96)
- MCFG_SCREEN_PALETTE(m_palette)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(256, 256);
+// screen.set_visarea(0*8, 16*32-1, 0*8, 16*32-1);
+ screen.set_visarea(0*8, 256-1, 2*8, 240-1);
+ screen.set_screen_update(FUNC(blackt96_state::screen_update_blackt96));
+ screen.set_palette(m_palette);
PALETTE(config, m_palette).set_format(palette_device::xRGB_444, 0x800);
@@ -510,15 +511,15 @@ MACHINE_CONFIG_START(blackt96_state::blackt96)
SPEAKER(config, "lspeaker").front_left();
SPEAKER(config, "rspeaker").front_right();
- MCFG_DEVICE_ADD("oki1", OKIM6295, 8000000/8, okim6295_device::PIN7_HIGH) // music
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 0.47)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 0.47)
- MCFG_DEVICE_ADDRESS_MAP(0, oki1_map)
+ OKIM6295(config, m_oki[0], 8000000/8, okim6295_device::PIN7_HIGH); // music
+ m_oki[0]->add_route(ALL_OUTPUTS, "lspeaker", 0.47);
+ m_oki[0]->add_route(ALL_OUTPUTS, "rspeaker", 0.47);
+ m_oki[0]->set_addrmap(0, &blackt96_state::oki1_map);
- MCFG_DEVICE_ADD("oki2", OKIM6295, 8000000/8, okim6295_device::PIN7_HIGH) // sfx
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 0.47)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 0.47)
-MACHINE_CONFIG_END
+ OKIM6295(config, m_oki[1], 8000000/8, okim6295_device::PIN7_HIGH); // sfx
+ m_oki[1]->add_route(ALL_OUTPUTS, "lspeaker", 0.47);
+ m_oki[1]->add_route(ALL_OUTPUTS, "rspeaker", 0.47);
+}
ROM_START( blackt96 )
diff --git a/src/mame/drivers/bladestl.cpp b/src/mame/drivers/bladestl.cpp
index 8c64fb7ad7d..13d982f6de9 100644
--- a/src/mame/drivers/bladestl.cpp
+++ b/src/mame/drivers/bladestl.cpp
@@ -303,28 +303,28 @@ void bladestl_state::machine_reset()
m_soundlatch->acknowledge_w(machine().dummy_space(), 0, 0);
}
-MACHINE_CONFIG_START(bladestl_state::bladestl)
-
+void bladestl_state::bladestl(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD(m_maincpu, HD6309E, XTAL(24'000'000) / 8) // divider not verified (from 007342 custom)
- MCFG_DEVICE_PROGRAM_MAP(main_map)
- MCFG_TIMER_DRIVER_ADD_SCANLINE("scantimer", bladestl_state, bladestl_scanline, "screen", 0, 1)
+ HD6309E(config, m_maincpu, XTAL(24'000'000) / 8); // divider not verified (from 007342 custom)
+ m_maincpu->set_addrmap(AS_PROGRAM, &bladestl_state::main_map);
+ TIMER(config, "scantimer").configure_scanline(FUNC(bladestl_state::bladestl_scanline), "screen", 0, 1);
- MCFG_DEVICE_ADD(m_audiocpu, MC6809E, XTAL(24'000'000) / 16)
- MCFG_DEVICE_PROGRAM_MAP(sound_map)
+ MC6809E(config, m_audiocpu, XTAL(24'000'000) / 16);
+ m_audiocpu->set_addrmap(AS_PROGRAM, &bladestl_state::sound_map);
- MCFG_QUANTUM_TIME(attotime::from_hz(600))
+ config.m_minimum_quantum = attotime::from_hz(600);
WATCHDOG_TIMER(config, "watchdog");
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(32*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(bladestl_state, screen_update_bladestl)
- MCFG_SCREEN_PALETTE("palette")
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(32*8, 32*8);
+ screen.set_visarea(0*8, 32*8-1, 2*8, 30*8-1);
+ screen.set_screen_update(FUNC(bladestl_state::screen_update_bladestl));
+ screen.set_palette("palette");
GFXDECODE(config, m_gfxdecode, "palette", gfx_bladestl);
PALETTE(config, "palette", FUNC(bladestl_state::bladestl_palette)).set_format(palette_device::xBGR_555, 32 + 16*16, 32+16);
@@ -360,13 +360,10 @@ MACHINE_CONFIG_START(bladestl_state::bladestl)
ymsnd.add_route(2, "filter3", 0.45);
ymsnd.add_route(3, "mono", 0.45);
- MCFG_DEVICE_ADD(m_filter1, FILTER_RC)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
- MCFG_DEVICE_ADD(m_filter2, FILTER_RC)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
- MCFG_DEVICE_ADD(m_filter3, FILTER_RC)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
-MACHINE_CONFIG_END
+ FILTER_RC(config, m_filter1).add_route(ALL_OUTPUTS, "mono", 1.0);
+ FILTER_RC(config, m_filter2).add_route(ALL_OUTPUTS, "mono", 1.0);
+ FILTER_RC(config, m_filter3).add_route(ALL_OUTPUTS, "mono", 1.0);
+}
/*************************************
diff --git a/src/mame/drivers/blitz68k.cpp b/src/mame/drivers/blitz68k.cpp
index 944a3cdd7c8..30df7046f1b 100644
--- a/src/mame/drivers/blitz68k.cpp
+++ b/src/mame/drivers/blitz68k.cpp
@@ -925,17 +925,17 @@ WRITE16_MEMBER(blitz68k_state::cjffruit_leds3_w)
READ8_MEMBER(blitz68k_state::crtc_r)
{
if (offset)
- return m_crtc->register_r(space, 0);
+ return m_crtc->register_r();
else
- return m_crtc->status_r(space, 0);
+ return m_crtc->status_r();
}
WRITE8_MEMBER(blitz68k_state::crtc_w)
{
if (offset)
- m_crtc->register_w(space, 0, data);
+ m_crtc->register_w(data);
else
- m_crtc->address_w(space, 0, data);
+ m_crtc->address_w(data);
}
WRITE16_MEMBER(blitz68k_state::crtc_lpen_w)
@@ -1720,24 +1720,25 @@ void blitz68k_state::ramdac_config(machine_config &config)
ramdac.set_addrmap(0, &blitz68k_state::ramdac_map);
}
-MACHINE_CONFIG_START(blitz68k_state::ilpag)
- MCFG_DEVICE_ADD(m_maincpu, M68000, 11059200 ) // ?
- MCFG_DEVICE_PROGRAM_MAP(ilpag_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", blitz68k_state, irq4_line_hold) //3 & 6 used, mcu comms?
+void blitz68k_state::ilpag(machine_config &config)
+{
+ M68000(config, m_maincpu, 11059200 ); // ?
+ m_maincpu->set_addrmap(AS_PROGRAM, &blitz68k_state::ilpag_map);
+ m_maincpu->set_vblank_int("screen", FUNC(blitz68k_state::irq4_line_hold)); //3 & 6 used, mcu comms?
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(512, 256)
- MCFG_SCREEN_VISIBLE_AREA(0, 512-1, 0, 256-1)
- MCFG_SCREEN_UPDATE_DRIVER(blitz68k_state, screen_update_blitz68k)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(512, 256);
+ screen.set_visarea_full();
+ screen.set_screen_update(FUNC(blitz68k_state::screen_update_blitz68k));
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
ramdac_config(config);
MCFG_VIDEO_START_OVERRIDE(blitz68k_state,blitz68k)
-MACHINE_CONFIG_END
+}
/*
20089f = 1 -> menu
@@ -1777,29 +1778,30 @@ TIMER_DEVICE_CALLBACK_MEMBER(blitz68k_state::steaser_mcu_sim)
}
-MACHINE_CONFIG_START(blitz68k_state::steaser)
+void blitz68k_state::steaser(machine_config &config)
+{
ilpag(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(steaser_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", blitz68k_state, irq5_line_hold) //3, 4 & 6 used, mcu comms?
+ m_maincpu->set_addrmap(AS_PROGRAM, &blitz68k_state::steaser_map);
+ m_maincpu->set_vblank_int("screen", FUNC(blitz68k_state::irq5_line_hold)); //3, 4 & 6 used, mcu comms?
- MCFG_TIMER_DRIVER_ADD_PERIODIC("coinsim", blitz68k_state, steaser_mcu_sim, attotime::from_hz(10000))
-MACHINE_CONFIG_END
+ TIMER(config, "coinsim").configure_periodic(FUNC(blitz68k_state::steaser_mcu_sim), attotime::from_hz(10000));
+}
-MACHINE_CONFIG_START(blitz68k_state::cjffruit)
- MCFG_DEVICE_ADD(m_maincpu, M68000, XTAL(22'118'400)/2)
- MCFG_DEVICE_PROGRAM_MAP(cjffruit_map)
+void blitz68k_state::cjffruit(machine_config &config)
+{
+ M68000(config, m_maincpu, XTAL(22'118'400)/2);
+ m_maincpu->set_addrmap(AS_PROGRAM, &blitz68k_state::cjffruit_map);
// MC68HC705C8P (Sound MCU)
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(512, 256)
- MCFG_SCREEN_VISIBLE_AREA(0, 512-1, 0, 256-8-1)
- MCFG_SCREEN_UPDATE_DRIVER(blitz68k_state, screen_update_blitz68k)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(512, 256);
+ screen.set_visarea(0, 512-1, 0, 256-8-1);
+ screen.set_screen_update(FUNC(blitz68k_state::screen_update_blitz68k));
R6545_1(config, m_crtc, XTAL(22'118'400)/8);
m_crtc->set_screen("screen");
@@ -1811,13 +1813,14 @@ MACHINE_CONFIG_START(blitz68k_state::cjffruit)
ramdac_config(config);
MCFG_VIDEO_START_OVERRIDE(blitz68k_state,blitz68k)
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(blitz68k_state::bankrob)
- MCFG_DEVICE_ADD(m_maincpu, M68000, XTAL(11'059'200))
- MCFG_DEVICE_PROGRAM_MAP(bankrob_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", blitz68k_state, irq3_line_hold) // protection prevents correct irq frequency by crtc
+void blitz68k_state::bankrob(machine_config &config)
+{
+ M68000(config, m_maincpu, XTAL(11'059'200));
+ m_maincpu->set_addrmap(AS_PROGRAM, &blitz68k_state::bankrob_map);
+ m_maincpu->set_vblank_int("screen", FUNC(blitz68k_state::irq3_line_hold)); // protection prevents correct irq frequency by crtc
// irq 2 reads from MCUs
// MC68HC705C8P (MCU1)
@@ -1826,12 +1829,12 @@ MACHINE_CONFIG_START(blitz68k_state::bankrob)
// NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(512, 256)
- MCFG_SCREEN_VISIBLE_AREA(0, 512-1, 0+4, 256-1-4)
- MCFG_SCREEN_UPDATE_DRIVER(blitz68k_state, screen_update_blitz68k)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(512, 256);
+ screen.set_visarea(0, 512-1, 0+4, 256-1-4);
+ screen.set_screen_update(FUNC(blitz68k_state::screen_update_blitz68k));
H46505(config, m_crtc, XTAL(11'059'200)/4);
m_crtc->set_screen("screen");
@@ -1843,25 +1846,26 @@ MACHINE_CONFIG_START(blitz68k_state::bankrob)
ramdac_config(config);
MCFG_VIDEO_START_OVERRIDE(blitz68k_state,blitz68k)
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(blitz68k_state::bankroba)
- MCFG_DEVICE_ADD(m_maincpu, M68000, XTAL(11'059'200) )
- MCFG_DEVICE_PROGRAM_MAP(bankroba_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", blitz68k_state, irq5_line_hold) // protection prevents correct irq frequency by crtc
+void blitz68k_state::bankroba(machine_config &config)
+{
+ M68000(config, m_maincpu, XTAL(11'059'200));
+ m_maincpu->set_addrmap(AS_PROGRAM, &blitz68k_state::bankroba_map);
+ m_maincpu->set_vblank_int("screen", FUNC(blitz68k_state::irq5_line_hold)); // protection prevents correct irq frequency by crtc
// irq 3,4 read from MCUs
// MC68HC705C8P (MCU)
// NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(512, 256)
- MCFG_SCREEN_VISIBLE_AREA(0, 512-1, 0+7, 256-1)
- MCFG_SCREEN_UPDATE_DRIVER(blitz68k_state, screen_update_blitz68k)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(512, 256);
+ screen.set_visarea(0, 512-1, 0+7, 256-1);
+ screen.set_screen_update(FUNC(blitz68k_state::screen_update_blitz68k));
H46505(config, m_crtc, XTAL(11'059'200)/4);
m_crtc->set_screen("screen");
@@ -1873,24 +1877,25 @@ MACHINE_CONFIG_START(blitz68k_state::bankroba)
ramdac_config(config);
MCFG_VIDEO_START_OVERRIDE(blitz68k_state,blitz68k_addr_factor1)
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(blitz68k_state::deucesw2)
- MCFG_DEVICE_ADD(m_maincpu, M68000, XTAL(22'118'400) / 2)
- MCFG_DEVICE_PROGRAM_MAP(deucesw2_map)
+void blitz68k_state::deucesw2(machine_config &config)
+{
+ M68000(config, m_maincpu, XTAL(22'118'400) / 2);
+ m_maincpu->set_addrmap(AS_PROGRAM, &blitz68k_state::deucesw2_map);
// irq 2 reads from MCUs
// MC68HC705C8P (MCU)
// NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(512, 256)
- MCFG_SCREEN_VISIBLE_AREA(0, 512-1, 0, 256-1)
- MCFG_SCREEN_UPDATE_DRIVER(blitz68k_state, screen_update_blitz68k)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(512, 256);
+ screen.set_visarea_full();
+ screen.set_screen_update(FUNC(blitz68k_state::screen_update_blitz68k));
R6545_1(config, m_crtc, XTAL(22'118'400)/8);
m_crtc->set_screen("screen");
@@ -1902,13 +1907,14 @@ MACHINE_CONFIG_START(blitz68k_state::deucesw2)
ramdac_config(config);
MCFG_VIDEO_START_OVERRIDE(blitz68k_state,blitz68k)
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(blitz68k_state::dualgame)
- MCFG_DEVICE_ADD(m_maincpu, M68000, XTAL(11'059'200) )
- MCFG_DEVICE_PROGRAM_MAP(dualgame_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", blitz68k_state, irq2_line_hold) // lev 2 = MCUs, lev 3 = vblank
+void blitz68k_state::dualgame(machine_config &config)
+{
+ M68000(config, m_maincpu, XTAL(11'059'200));
+ m_maincpu->set_addrmap(AS_PROGRAM, &blitz68k_state::dualgame_map);
+ m_maincpu->set_vblank_int("screen", FUNC(blitz68k_state::irq2_line_hold)); // lev 2 = MCUs, lev 3 = vblank
// MC68HC705C8P (MCU1)
@@ -1916,12 +1922,12 @@ MACHINE_CONFIG_START(blitz68k_state::dualgame)
// NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(512, 256)
- MCFG_SCREEN_VISIBLE_AREA(0, 512-1, 0+4, 256-1-4)
- MCFG_SCREEN_UPDATE_DRIVER(blitz68k_state, screen_update_blitz68k)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(512, 256);
+ screen.set_visarea(0, 512-1, 0+4, 256-1-4);
+ screen.set_screen_update(FUNC(blitz68k_state::screen_update_blitz68k));
H46505(config, m_crtc, XTAL(11'059'200)/4);
m_crtc->set_screen("screen");
@@ -1933,24 +1939,25 @@ MACHINE_CONFIG_START(blitz68k_state::dualgame)
ramdac_config(config);
MCFG_VIDEO_START_OVERRIDE(blitz68k_state,blitz68k)
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(blitz68k_state::hermit)
- MCFG_DEVICE_ADD(m_maincpu, M68000, XTAL(22'118'400)/2 )
- MCFG_DEVICE_PROGRAM_MAP(hermit_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", blitz68k_state, irq1_line_hold) // protection prevents correct irq frequency by crtc
+void blitz68k_state::hermit(machine_config &config)
+{
+ M68000(config, m_maincpu, XTAL(22'118'400)/2);
+ m_maincpu->set_addrmap(AS_PROGRAM, &blitz68k_state::hermit_map);
+ m_maincpu->set_vblank_int("screen", FUNC(blitz68k_state::irq1_line_hold)); // protection prevents correct irq frequency by crtc
// MC68HC705C8P (MCU)
// NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(512, 256)
- MCFG_SCREEN_VISIBLE_AREA(0, 512-1, 0+4, 256-1-4)
- MCFG_SCREEN_UPDATE_DRIVER(blitz68k_state, screen_update_blitz68k)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(512, 256);
+ screen.set_visarea(0, 512-1, 0+4, 256-1-4);
+ screen.set_screen_update(FUNC(blitz68k_state::screen_update_blitz68k));
H46505(config, m_crtc, XTAL(22'118'400)/8);
m_crtc->set_screen("screen");
@@ -1962,12 +1969,13 @@ MACHINE_CONFIG_START(blitz68k_state::hermit)
ramdac_config(config);
MCFG_VIDEO_START_OVERRIDE(blitz68k_state,blitz68k)
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(blitz68k_state::maxidbl)
- MCFG_DEVICE_ADD(m_maincpu, M68000, XTAL(11'059'200))
- MCFG_DEVICE_PROGRAM_MAP(maxidbl_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", blitz68k_state, irq3_line_hold) // protection prevents correct irq frequency by crtc
+void blitz68k_state::maxidbl(machine_config &config)
+{
+ M68000(config, m_maincpu, XTAL(11'059'200));
+ m_maincpu->set_addrmap(AS_PROGRAM, &blitz68k_state::maxidbl_map);
+ m_maincpu->set_vblank_int("screen", FUNC(blitz68k_state::irq3_line_hold)); // protection prevents correct irq frequency by crtc
// irq 2 reads from MCUs
// MC68HC705C8P (MCU1)
@@ -1978,12 +1986,12 @@ MACHINE_CONFIG_START(blitz68k_state::maxidbl)
// NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(512, 256)
- MCFG_SCREEN_VISIBLE_AREA(0, 512-1, 0, 256-1)
- MCFG_SCREEN_UPDATE_DRIVER(blitz68k_state, screen_update_blitz68k_noblit)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(512, 256);
+ screen.set_visarea_full();
+ screen.set_screen_update(FUNC(blitz68k_state::screen_update_blitz68k_noblit));
H46505(config, m_crtc, XTAL(11'059'200)/4);
m_crtc->set_screen("screen");
diff --git a/src/mame/drivers/blktiger.cpp b/src/mame/drivers/blktiger.cpp
index 65828878eb4..d5cc4cc9d31 100644
--- a/src/mame/drivers/blktiger.cpp
+++ b/src/mame/drivers/blktiger.cpp
@@ -292,12 +292,12 @@ void blktiger_state::machine_reset()
void blktiger_state::blktiger(machine_config &config)
{
/* basic machine hardware */
- Z80(config, m_maincpu, XTAL(24'000'000)/4); /* verified on pcb */
+ Z80(config, m_maincpu, XTAL(24'000'000)/4); /* verified on pcb */
m_maincpu->set_addrmap(AS_PROGRAM, &blktiger_state::blktiger_map);
m_maincpu->set_addrmap(AS_IO, &blktiger_state::blktiger_io_map);
m_maincpu->set_vblank_int("screen", FUNC(blktiger_state::irq0_line_hold));
- Z80(config, m_audiocpu, XTAL(3'579'545)); /* verified on pcb */
+ Z80(config, m_audiocpu, XTAL(3'579'545)); /* verified on pcb */
m_audiocpu->set_addrmap(AS_PROGRAM, &blktiger_state::blktiger_sound_map);
I8751(config, m_mcu, XTAL(24'000'000)/4); /* ??? */
diff --git a/src/mame/drivers/blmbycar.cpp b/src/mame/drivers/blmbycar.cpp
index 82c428c8e57..827c4be384f 100644
--- a/src/mame/drivers/blmbycar.cpp
+++ b/src/mame/drivers/blmbycar.cpp
@@ -364,26 +364,26 @@ MACHINE_RESET_MEMBER(blmbycar_state,blmbycar)
}
-MACHINE_CONFIG_START(blmbycar_state::blmbycar)
-
+void blmbycar_state::blmbycar(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M68000, XTAL(24'000'000)/2) /* 12MHz */
- MCFG_DEVICE_PROGRAM_MAP(blmbycar_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", blmbycar_state, irq1_line_hold)
+ M68000(config, m_maincpu, XTAL(24'000'000)/2); /* 12MHz */
+ m_maincpu->set_addrmap(AS_PROGRAM, &blmbycar_state::blmbycar_map);
+ m_maincpu->set_vblank_int("screen", FUNC(blmbycar_state::irq1_line_hold));
MCFG_MACHINE_START_OVERRIDE(blmbycar_state,blmbycar)
MCFG_MACHINE_RESET_OVERRIDE(blmbycar_state,blmbycar)
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(0x180, 0x100)
- MCFG_SCREEN_VISIBLE_AREA(0, 0x180-1, 0, 0x100-1)
- MCFG_SCREEN_UPDATE_DRIVER(blmbycar_state, screen_update)
- MCFG_SCREEN_PALETTE(m_palette)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(0x180, 0x100);
+ screen.set_visarea_full();
+ screen.set_screen_update(FUNC(blmbycar_state::screen_update));
+ screen.set_palette(m_palette);
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_blmbycar)
+ GFXDECODE(config, m_gfxdecode, m_palette, gfx_blmbycar);
PALETTE(config, m_palette).set_format(palette_device::xBRG_444, 0x2000);
@@ -394,10 +394,10 @@ MACHINE_CONFIG_START(blmbycar_state::blmbycar)
/* sound hardware */
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("oki", OKIM6295, XTAL(1'000'000), okim6295_device::PIN7_HIGH) // clock frequency & pin 7 not verified
- MCFG_DEVICE_ADDRESS_MAP(0, blmbycar_oki_map)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
-MACHINE_CONFIG_END
+ okim6295_device &oki(OKIM6295(config, "oki", XTAL(1'000'000), okim6295_device::PIN7_HIGH)); // clock frequency & pin 7 not verified
+ oki.set_addrmap(0, &blmbycar_state::blmbycar_oki_map);
+ oki.add_route(ALL_OUTPUTS, "mono", 1.0);
+}
MACHINE_START_MEMBER(blmbycar_state,watrball)
@@ -412,21 +412,21 @@ MACHINE_RESET_MEMBER(blmbycar_state,watrball)
m_retvalue = 0;
}
-MACHINE_CONFIG_START(blmbycar_state::watrball)
+void blmbycar_state::watrball(machine_config &config)
+{
blmbycar(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(watrball_map)
+ m_maincpu->set_addrmap(AS_PROGRAM, &blmbycar_state::watrball_map);
MCFG_MACHINE_START_OVERRIDE(blmbycar_state,watrball)
MCFG_MACHINE_RESET_OVERRIDE(blmbycar_state,watrball)
/* video hardware */
- MCFG_SCREEN_MODIFY("screen")
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */)
- MCFG_SCREEN_VISIBLE_AREA(0, 0x180-1, 16, 0x100-1)
-MACHINE_CONFIG_END
+ screen_device &screen(*subdevice<screen_device>("screen"));
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500) /* not accurate */);
+ screen.set_visarea(0, 0x180-1, 16, 0x100-1);
+}
/***************************************************************************
diff --git a/src/mame/drivers/blockout.cpp b/src/mame/drivers/blockout.cpp
index 3249c589183..17bff9d43fd 100644
--- a/src/mame/drivers/blockout.cpp
+++ b/src/mame/drivers/blockout.cpp
@@ -304,25 +304,25 @@ TIMER_DEVICE_CALLBACK_MEMBER(blockout_state::blockout_scanline)
m_maincpu->set_input_line(5, ASSERT_LINE);
}
-MACHINE_CONFIG_START(blockout_state::blockout)
-
+void blockout_state::blockout(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M68000, MAIN_CLOCK) /* MRH - 8.76 makes gfx/adpcm samples sync better -- but 10 is correct speed*/
- MCFG_DEVICE_PROGRAM_MAP(main_map)
- MCFG_TIMER_DRIVER_ADD_SCANLINE("scantimer", blockout_state, blockout_scanline, "screen", 0, 1)
+ M68000(config, m_maincpu, MAIN_CLOCK); /* MRH - 8.76 makes gfx/adpcm samples sync better -- but 10 is correct speed*/
+ m_maincpu->set_addrmap(AS_PROGRAM, &blockout_state::main_map);
+ TIMER(config, "scantimer").configure_scanline(FUNC(blockout_state::blockout_scanline), "screen", 0, 1);
- MCFG_DEVICE_ADD("audiocpu", Z80, AUDIO_CLOCK) /* 3.579545 MHz */
- MCFG_DEVICE_PROGRAM_MAP(audio_map)
+ Z80(config, m_audiocpu, AUDIO_CLOCK); /* 3.579545 MHz */
+ m_audiocpu->set_addrmap(AS_PROGRAM, &blockout_state::audio_map);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
/* assume same as ddragon3 with adjusted visible display area */
- MCFG_SCREEN_RAW_PARAMS(XTAL(28'000'000) / 4, 448, 0, 320, 272, 10, 250)
- MCFG_SCREEN_UPDATE_DRIVER(blockout_state, screen_update_blockout)
- MCFG_SCREEN_PALETTE("palette")
+ m_screen->set_raw(XTAL(28'000'000) / 4, 448, 0, 320, 272, 10, 250);
+ m_screen->set_screen_update(FUNC(blockout_state::screen_update_blockout));
+ m_screen->set_palette(m_palette);
- MCFG_PALETTE_ADD("palette", 513)
+ PALETTE(config, m_palette).set_entries(513);
/* sound hardware */
@@ -337,16 +337,16 @@ MACHINE_CONFIG_START(blockout_state::blockout)
ymsnd.add_route(0, "lspeaker", 0.60);
ymsnd.add_route(1, "rspeaker", 0.60);
- MCFG_DEVICE_ADD("oki", OKIM6295, 1056000, okim6295_device::PIN7_HIGH)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 0.50)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 0.50)
-MACHINE_CONFIG_END
+ okim6295_device &oki(OKIM6295(config, "oki", 1056000, okim6295_device::PIN7_HIGH));
+ oki.add_route(ALL_OUTPUTS, "lspeaker", 0.50);
+ oki.add_route(ALL_OUTPUTS, "rspeaker", 0.50);
+}
-MACHINE_CONFIG_START(blockout_state::agress)
+void blockout_state::agress(machine_config &config)
+{
blockout(config);
- MCFG_DEVICE_MODIFY( "maincpu" )
- MCFG_DEVICE_PROGRAM_MAP(agress_map)
-MACHINE_CONFIG_END
+ m_maincpu->set_addrmap(AS_PROGRAM, &blockout_state::agress_map);
+}
/*************************************
*
diff --git a/src/mame/drivers/blocktax.cpp b/src/mame/drivers/blocktax.cpp
index 396213fb843..1b43e664755 100644
--- a/src/mame/drivers/blocktax.cpp
+++ b/src/mame/drivers/blocktax.cpp
@@ -73,24 +73,24 @@ void blocktax_state::blocktax_map(address_map &map)
static INPUT_PORTS_START( blocktax )
INPUT_PORTS_END
-MACHINE_CONFIG_START(blocktax_state::blocktax)
- MCFG_DEVICE_ADD("maincpu", I80C51, 30_MHz_XTAL/2) /* P89C51RD2HBA (80C51 with internal flash rom) */
+void blocktax_state::blocktax(machine_config &config)
+{
+ I80C51(config, m_maincpu, 30_MHz_XTAL/2); /* P89C51RD2HBA (80C51 with internal flash rom) */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(64*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 0*8, 32*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(blocktax_state, screen_update_blocktax)
- MCFG_SCREEN_PALETTE("palette")
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(64*8, 32*8);
+ screen.set_visarea(0*8, 32*8-1, 0*8, 32*8-1);
+ screen.set_screen_update(FUNC(blocktax_state::screen_update_blocktax));
+ screen.set_palette("palette");
PALETTE(config, "palette").set_format(palette_device::xRGB_555, 0x200);
SPEAKER(config, "speaker").front_center();
- MCFG_DEVICE_ADD("oki", OKIM6295, 30_MHz_XTAL/16, okim6295_device::PIN7_HIGH) // clock frequency & pin 7 not verified
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 1.00)
-MACHINE_CONFIG_END
+ OKIM6295(config, "oki", 30_MHz_XTAL/16, okim6295_device::PIN7_HIGH).add_route(ALL_OUTPUTS, "speaker", 1.00); // clock frequency & pin 7 not verified
+}
ROM_START( blocktax )
ROM_REGION( 0x10000, "maincpu", 0 ) /* Internal MCU Flash */
diff --git a/src/mame/drivers/bloodbro.cpp b/src/mame/drivers/bloodbro.cpp
index 0f2e8c83ce1..e61c15023a6 100644
--- a/src/mame/drivers/bloodbro.cpp
+++ b/src/mame/drivers/bloodbro.cpp
@@ -222,7 +222,7 @@ WRITE8_MEMBER(bloodbro_state::weststry_opl_w)
{
// NMI cannot be accepted between address and data writes, or else registers get corrupted
m_weststry_soundnmi_mask = BIT(offset, 0);
- m_ymsnd->write(space, offset, data);
+ m_ymsnd->write(offset, data);
weststry_soundnmi_update();
}
diff --git a/src/mame/drivers/blstroid.cpp b/src/mame/drivers/blstroid.cpp
index bbbeb3f719c..2cb3789e2f1 100644
--- a/src/mame/drivers/blstroid.cpp
+++ b/src/mame/drivers/blstroid.cpp
@@ -175,11 +175,11 @@ GFXDECODE_END
*
*************************************/
-MACHINE_CONFIG_START(blstroid_state::blstroid)
-
+void blstroid_state::blstroid(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M68000, ATARI_CLOCK_14MHz/2)
- MCFG_DEVICE_PROGRAM_MAP(main_map)
+ M68000(config, m_maincpu, ATARI_CLOCK_14MHz/2);
+ m_maincpu->set_addrmap(AS_PROGRAM, &blstroid_state::main_map);
EEPROM_2804(config, "eeprom").lock_after_write(true);
@@ -190,19 +190,19 @@ MACHINE_CONFIG_START(blstroid_state::blstroid)
PALETTE(config, "palette").set_format(palette_device::xRGB_555, 512);
- MCFG_TILEMAP_ADD_STANDARD("playfield", "gfxdecode", 2, blstroid_state, get_playfield_tile_info, 16,8, SCAN_ROWS, 64,64)
+ TILEMAP(config, m_playfield_tilemap, m_gfxdecode, 2, 16,8, TILEMAP_SCAN_ROWS, 64,64).set_info_callback(FUNC(blstroid_state::get_playfield_tile_info));
ATARI_MOTION_OBJECTS(config, m_mob, 0, m_screen, blstroid_state::s_mob_config);
m_mob->set_gfxdecode(m_gfxdecode);
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_VIDEO_ATTRIBUTES(VIDEO_UPDATE_BEFORE_VBLANK)
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_video_attributes(VIDEO_UPDATE_BEFORE_VBLANK);
/* note: these parameters are from published specs, not derived */
/* the board uses an SOS-2 chip to generate video signals */
- MCFG_SCREEN_RAW_PARAMS(ATARI_CLOCK_14MHz, 456*2, 0, 320*2, 262, 0, 240)
- MCFG_SCREEN_UPDATE_DRIVER(blstroid_state, screen_update_blstroid)
- MCFG_SCREEN_PALETTE("palette")
- MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE(*this, blstroid_state, video_int_write_line))
+ m_screen->set_raw(ATARI_CLOCK_14MHz, 456*2, 0, 320*2, 262, 0, 240);
+ m_screen->set_screen_update(FUNC(blstroid_state::screen_update_blstroid));
+ m_screen->set_palette("palette");
+ m_screen->screen_vblank().set(FUNC(blstroid_state::video_int_write_line));
MCFG_VIDEO_START_OVERRIDE(blstroid_state,blstroid)
@@ -217,7 +217,7 @@ MACHINE_CONFIG_START(blstroid_state::blstroid)
m_jsa->add_route(1, "rspeaker", 1.0);
config.device_remove("jsa:pokey");
config.device_remove("jsa:tms");
-MACHINE_CONFIG_END
+}
diff --git a/src/mame/drivers/blueprnt.cpp b/src/mame/drivers/blueprnt.cpp
index f501af0d40d..604c520cad2 100644
--- a/src/mame/drivers/blueprnt.cpp
+++ b/src/mame/drivers/blueprnt.cpp
@@ -346,34 +346,35 @@ void blueprnt_state::machine_reset()
}
-MACHINE_CONFIG_START(blueprnt_state::blueprnt)
-
+void blueprnt_state::blueprnt(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, 7000000/2) // 3.5 MHz
- MCFG_DEVICE_PROGRAM_MAP(blueprnt_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", blueprnt_state, irq0_line_hold)
-
- MCFG_DEVICE_ADD("audiocpu", Z80, 10000000/2/2/2) // 1.25 MHz (2H)
- MCFG_DEVICE_PROGRAM_MAP(sound_map)
- MCFG_DEVICE_IO_MAP(sound_io)
- MCFG_DEVICE_PERIODIC_INT_DRIVER(blueprnt_state, irq0_line_hold, 4*60) // IRQs connected to 32V
+ Z80(config, m_maincpu, 7000000/2); // 3.5 MHz
+ m_maincpu->set_addrmap(AS_PROGRAM, &blueprnt_state::blueprnt_map);
+ m_maincpu->set_vblank_int("screen", FUNC(blueprnt_state::irq0_line_hold));
+
+ Z80(config, m_audiocpu, 10000000/2/2/2); // 1.25 MHz (2H)
+ m_audiocpu->set_addrmap(AS_PROGRAM, &blueprnt_state::sound_map);
+ m_audiocpu->set_addrmap(AS_IO, &blueprnt_state::sound_io);
+ m_audiocpu->set_periodic_int(FUNC(blueprnt_state::irq0_line_hold), attotime::from_hz(4*60)); // IRQs connected to 32V
// NMIs are caused by the main CPU
- MCFG_QUANTUM_PERFECT_CPU("maincpu")
+ config.m_perfect_cpu_quantum = subtag("maincpu");
WATCHDOG_TIMER(config, "watchdog");
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(32*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(32*8, 32*8);
+ screen.set_visarea(0*8, 32*8-1, 2*8, 30*8-1);
+ screen.set_screen_update(FUNC(blueprnt_state::screen_update_blueprnt));
+ screen.set_palette(m_palette);
+
MCFG_VIDEO_START_OVERRIDE(blueprnt_state, blueprnt)
- MCFG_SCREEN_UPDATE_DRIVER(blueprnt_state, screen_update_blueprnt)
- MCFG_SCREEN_PALETTE(m_palette)
- MCFG_DEVICE_ADD(m_gfxdecode, GFXDECODE, m_palette, gfx_blueprnt)
+ GFXDECODE(config, m_gfxdecode, m_palette, gfx_blueprnt);
PALETTE(config, m_palette, FUNC(blueprnt_state::blueprnt_palette), 128*4+8);
/* sound hardware */
@@ -390,15 +391,15 @@ MACHINE_CONFIG_START(blueprnt_state::blueprnt)
ay2.port_a_read_callback().set_ioport("DILSW1");
ay2.port_b_read_callback().set_ioport("DILSW2");
ay2.add_route(ALL_OUTPUTS, "mono", 0.25);
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(blueprnt_state::grasspin)
+void blueprnt_state::grasspin(machine_config &config)
+{
blueprnt(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(grasspin_map)
-MACHINE_CONFIG_END
+ m_maincpu->set_addrmap(AS_PROGRAM, &blueprnt_state::grasspin_map);
+}
/*************************************
*
diff --git a/src/mame/drivers/blw700i.cpp b/src/mame/drivers/blw700i.cpp
index b0471c08b22..8fec247e2b5 100644
--- a/src/mame/drivers/blw700i.cpp
+++ b/src/mame/drivers/blw700i.cpp
@@ -268,19 +268,20 @@ static INPUT_PORTS_START( lw700i )
INPUT_PORTS_END
-MACHINE_CONFIG_START(lw700i_state::lw700i)
- MCFG_DEVICE_ADD("maincpu", H83003, XTAL(16'000'000))
- MCFG_DEVICE_PROGRAM_MAP(main_map)
- MCFG_DEVICE_IO_MAP(io_map)
- MCFG_TIMER_DRIVER_ADD_SCANLINE("scantimer", lw700i_state, vbl_interrupt, "screen", 0, 1)
-
- MCFG_SCREEN_ADD("screen", LCD)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */)
- MCFG_SCREEN_UPDATE_DRIVER(lw700i_state, screen_update)
- MCFG_SCREEN_SIZE(640, 400)
- MCFG_SCREEN_VISIBLE_AREA(0, 480, 0, 128)
-MACHINE_CONFIG_END
+void lw700i_state::lw700i(machine_config &config)
+{
+ H83003(config, m_maincpu, XTAL(16'000'000));
+ m_maincpu->set_addrmap(AS_PROGRAM, &lw700i_state::main_map);
+ m_maincpu->set_addrmap(AS_IO, &lw700i_state::io_map);
+ TIMER(config, "scantimer").configure_scanline(FUNC(lw700i_state::vbl_interrupt), "screen", 0, 1);
+
+ SCREEN(config, m_screen, SCREEN_TYPE_LCD);
+ m_screen->set_refresh_hz(60);
+ m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(2500) /* not accurate */);
+ m_screen->set_screen_update(FUNC(lw700i_state::screen_update));
+ m_screen->set_size(640, 400);
+ m_screen->set_visarea(0, 480, 0, 128);
+}
ROM_START(blw700i)
ROM_REGION(0x200000, "maincpu", 0) /* H8/3003 program ROM */
diff --git a/src/mame/drivers/bmjr.cpp b/src/mame/drivers/bmjr.cpp
index e2f14a49778..a1bee2628d3 100644
--- a/src/mame/drivers/bmjr.cpp
+++ b/src/mame/drivers/bmjr.cpp
@@ -337,24 +337,25 @@ void bmjr_state::machine_reset()
m_cass->change_state(CASSETTE_MOTOR_DISABLED,CASSETTE_MASK_MOTOR);
}
-MACHINE_CONFIG_START(bmjr_state::bmjr)
+void bmjr_state::bmjr(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu",M6800, XTAL(4'000'000)/4) //unknown clock / divider
- MCFG_DEVICE_PROGRAM_MAP(bmjr_mem)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", bmjr_state, irq0_line_hold)
+ M6800(config, m_maincpu, XTAL(4'000'000)/4); //unknown clock / divider
+ m_maincpu->set_addrmap(AS_PROGRAM, &bmjr_state::bmjr_mem);
+ m_maincpu->set_vblank_int("screen", FUNC(bmjr_state::irq0_line_hold));
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(50)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */
- MCFG_SCREEN_SIZE(256, 192)
- MCFG_SCREEN_VISIBLE_AREA(0, 256-1, 0, 192-1)
- MCFG_SCREEN_UPDATE_DRIVER(bmjr_state, screen_update_bmjr)
- MCFG_SCREEN_PALETTE("palette")
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(50);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */
+ screen.set_size(256, 192);
+ screen.set_visarea_full();
+ screen.set_screen_update(FUNC(bmjr_state::screen_update_bmjr));
+ screen.set_palette("palette");
PALETTE(config, "palette", palette_device::BRG_3BIT);
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_bmjr)
+ GFXDECODE(config, "gfxdecode", "palette", gfx_bmjr);
/* Audio */
SPEAKER(config, "mono").front_center();
@@ -362,8 +363,8 @@ MACHINE_CONFIG_START(bmjr_state::bmjr)
WAVE(config, "wave", "cassette").add_route(ALL_OUTPUTS, "mono", 0.25);
/* Devices */
- MCFG_CASSETTE_ADD( "cassette" )
-MACHINE_CONFIG_END
+ CASSETTE(config, m_cass);
+}
/* ROM definition */
ROM_START( bmjr )
diff --git a/src/mame/drivers/bml3.cpp b/src/mame/drivers/bml3.cpp
index 600ee5e2b3b..1764a848202 100644
--- a/src/mame/drivers/bml3.cpp
+++ b/src/mame/drivers/bml3.cpp
@@ -107,9 +107,6 @@ public:
DECLARE_WRITE8_MEMBER(bml3_firq_mask_w);
DECLARE_READ8_MEMBER(bml3_firq_status_r);
DECLARE_WRITE8_MEMBER(relay_w);
- DECLARE_WRITE_LINE_MEMBER(bml3bus_nmi_w);
- DECLARE_WRITE_LINE_MEMBER(bml3bus_irq_w);
- DECLARE_WRITE_LINE_MEMBER(bml3bus_firq_w);
DECLARE_WRITE_LINE_MEMBER(bml3_acia_tx_w);
DECLARE_WRITE_LINE_MEMBER(bml3_acia_rts_w);
DECLARE_WRITE_LINE_MEMBER(bml3_acia_irq_w);
@@ -195,9 +192,9 @@ private:
READ8_MEMBER( bml3_state::bml3_6845_r )
{
if (offset)
- return m_crtc->register_r(space, 0);
+ return m_crtc->register_r();
else
- return m_crtc->status_r(space, 0);
+ return m_crtc->status_r();
}
WRITE8_MEMBER( bml3_state::bml3_6845_w )
@@ -205,12 +202,12 @@ WRITE8_MEMBER( bml3_state::bml3_6845_w )
if(offset == 0)
{
m_crtc_index = data;
- m_crtc->address_w(space, 0, data);
+ m_crtc->address_w(data);
}
else
{
m_crtc_vreg[m_crtc_index] = data;
- m_crtc->register_w(space, 0, data);
+ m_crtc->register_w(data);
}
}
@@ -305,14 +302,14 @@ READ8_MEMBER(bml3_state::bml3_ym2203_r)
{
u8 dev_offs = ((m_psg_latch & 3) != 3);
- return m_ym2203->read(space, dev_offs);
+ return m_ym2203->read(dev_offs);
}
WRITE8_MEMBER(bml3_state::bml3_ym2203_w)
{
u8 dev_offs = ((m_psg_latch & 3) != 3);
- m_ym2203->write(space, dev_offs, data);
+ m_ym2203->write(dev_offs, data);
}
READ8_MEMBER( bml3_state::bml3_vram_attr_r)
@@ -386,21 +383,6 @@ READ8_MEMBER( bml3_state::bml3_firq_status_r )
return res;
}
-WRITE_LINE_MEMBER(bml3_state::bml3bus_nmi_w)
-{
- m_maincpu->set_input_line(INPUT_LINE_NMI, state);
-}
-
-WRITE_LINE_MEMBER(bml3_state::bml3bus_irq_w)
-{
- m_maincpu->set_input_line(M6809_IRQ_LINE, state);
-}
-
-WRITE_LINE_MEMBER(bml3_state::bml3bus_firq_w)
-{
- m_maincpu->set_input_line(M6809_FIRQ_LINE, state);
-}
-
void bml3_state::bml3_mem(address_map &map)
{
@@ -957,21 +939,22 @@ static void bml3_cards(device_slot_interface &device)
}
-MACHINE_CONFIG_START(bml3_state::bml3_common)
+void bml3_state::bml3_common(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu",M6809, CPU_CLOCK)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", bml3_state, bml3_timer_firq)
-// MCFG_DEVICE_PERIODIC_INT_DRIVER(bml3_state, bml3_firq, 45)
+ MC6809(config, m_maincpu, CPU_EXT_CLOCK);
+ m_maincpu->set_vblank_int("screen", FUNC(bml3_state::bml3_timer_firq));
+// m_maincpu->set_periodic_int(FUNC(bml3_state::bml3_firq), attotime::fromhz(45));
// MCFG_MACHINE_RESET_OVERRIDE(bml3_state,bml3)
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2400)) /* Service manual specifies "Raster return period" as 2.4 ms (p.64), although the total vertical non-displaying time seems to be 4 ms. */
- MCFG_SCREEN_SIZE(640, 400)
- MCFG_SCREEN_VISIBLE_AREA(0, 320-1, 0, 200-1)
- MCFG_SCREEN_UPDATE_DEVICE("crtc", mc6845_device, screen_update)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2400)); /* Service manual specifies "Raster return period" as 2.4 ms (p.64), although the total vertical non-displaying time seems to be 4 ms. */
+ screen.set_size(640, 400);
+ screen.set_visarea(0, 320-1, 0, 200-1);
+ screen.set_screen_update("crtc", FUNC(mc6845_device::screen_update));
PALETTE(config, m_palette, palette_device::BRG_3BIT);
/* Devices */
@@ -984,9 +967,9 @@ MACHINE_CONFIG_START(bml3_state::bml3_common)
// fire once per scan of an individual key
// According to the service manual (p.65), the keyboard timer is driven by the horizontal video sync clock.
- MCFG_TIMER_DRIVER_ADD_PERIODIC("keyboard_timer", bml3_state, keyboard_callback, attotime::from_hz(H_CLOCK/2))
- MCFG_TIMER_DRIVER_ADD_PERIODIC("bml3_c", bml3_state, bml3_c, attotime::from_hz(4800))
- MCFG_TIMER_DRIVER_ADD_PERIODIC("bml3_p", bml3_state, bml3_p, attotime::from_hz(40000))
+ TIMER(config, "keyboard_timer").configure_periodic(FUNC(bml3_state::keyboard_callback), attotime::from_hz(H_CLOCK/2));
+ TIMER(config, "bml3_c").configure_periodic(FUNC(bml3_state::bml3_c), attotime::from_hz(4800));
+ TIMER(config, "bml3_p").configure_periodic(FUNC(bml3_state::bml3_p), attotime::from_hz(40000));
pia6821_device &pia(PIA6821(config, "pia", 0));
pia.writepa_handler().set(FUNC(bml3_state::bml3_piaA_w));
@@ -1000,7 +983,7 @@ MACHINE_CONFIG_START(bml3_state::bml3_common)
acia_clock.signal_handler().set(m_acia, FUNC(acia6850_device::write_txc));
acia_clock.signal_handler().append(m_acia, FUNC(acia6850_device::write_rxc));
- MCFG_CASSETTE_ADD( "cassette" )
+ CASSETTE(config, m_cass);
/* Audio */
SPEAKER(config, "mono").front_center();
@@ -1008,29 +991,28 @@ MACHINE_CONFIG_START(bml3_state::bml3_common)
SPEAKER_SOUND(config, "speaker").add_route(ALL_OUTPUTS, "mono", 0.50);
/* slot devices */
- MCFG_DEVICE_ADD("bml3bus", BML3BUS, 0)
- MCFG_BML3BUS_CPU("maincpu")
- MCFG_BML3BUS_OUT_NMI_CB(WRITELINE(*this, bml3_state, bml3bus_nmi_w))
- MCFG_BML3BUS_OUT_IRQ_CB(WRITELINE(*this, bml3_state, bml3bus_irq_w))
- MCFG_BML3BUS_OUT_FIRQ_CB(WRITELINE(*this, bml3_state, bml3bus_firq_w))
+ bml3bus_device &bus(BML3BUS(config, "bml3bus", 0));
+ bus.set_space(m_maincpu, AS_PROGRAM);
+ bus.nmi_callback().set_inputline(m_maincpu, INPUT_LINE_NMI);
+ bus.irq_callback().set_inputline(m_maincpu, M6809_IRQ_LINE);
+ bus.firq_callback().set_inputline(m_maincpu, M6809_FIRQ_LINE);
/* Default to MP-1805 disk (3" or 5.25" SS/SD), as our MB-6892 ROM dump includes
the MP-1805 ROM.
User may want to switch this to MP-1802 (5.25" DS/DD).
Note it isn't feasible to use both, as they each place boot ROM at F800.
*/
- MCFG_BML3BUS_SLOT_ADD("bml3bus", "sl1", bml3_cards, "bml3mp1805")
- MCFG_BML3BUS_SLOT_ADD("bml3bus", "sl2", bml3_cards, nullptr)
- MCFG_BML3BUS_SLOT_ADD("bml3bus", "sl3", bml3_cards, nullptr)
- MCFG_BML3BUS_SLOT_ADD("bml3bus", "sl4", bml3_cards, nullptr)
- MCFG_BML3BUS_SLOT_ADD("bml3bus", "sl5", bml3_cards, nullptr)
- MCFG_BML3BUS_SLOT_ADD("bml3bus", "sl6", bml3_cards, "bml3kanji")
-
-MACHINE_CONFIG_END
+ BML3BUS_SLOT(config, "sl1", "bml3bus", bml3_cards, "bml3mp1805");
+ BML3BUS_SLOT(config, "sl2", "bml3bus", bml3_cards, nullptr);
+ BML3BUS_SLOT(config, "sl3", "bml3bus", bml3_cards, nullptr);
+ BML3BUS_SLOT(config, "sl4", "bml3bus", bml3_cards, nullptr);
+ BML3BUS_SLOT(config, "sl5", "bml3bus", bml3_cards, nullptr);
+ BML3BUS_SLOT(config, "sl6", "bml3bus", bml3_cards, "bml3kanji");
+}
-MACHINE_CONFIG_START(bml3_state::bml3)
+void bml3_state::bml3(machine_config &config)
+{
bml3_common(config);
- MCFG_DEVICE_MODIFY( "maincpu" )
- MCFG_DEVICE_PROGRAM_MAP(bml3_mem)
+ m_maincpu->set_addrmap(AS_PROGRAM, &bml3_state::bml3_mem);
#if 0
// TODO: slot device for sound card
@@ -1042,23 +1024,23 @@ MACHINE_CONFIG_START(bml3_state::bml3)
m_ym2203->add_route(2, "mono", 0.50);
m_ym2203->add_route(3, "mono", 0.50);
#endif
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(bml3_state::bml3mk2)
+void bml3_state::bml3mk2(machine_config &config)
+{
bml3_common(config);
- MCFG_DEVICE_MODIFY( "maincpu" )
- MCFG_DEVICE_PROGRAM_MAP(bml3mk2_mem)
+ m_maincpu->set_addrmap(AS_PROGRAM, &bml3_state::bml3mk2_mem);
// TODO: anything to add here?
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(bml3_state::bml3mk5)
+void bml3_state::bml3mk5(machine_config &config)
+{
bml3_common(config);
- MCFG_DEVICE_MODIFY( "maincpu" )
- MCFG_DEVICE_PROGRAM_MAP(bml3mk5_mem)
+ m_maincpu->set_addrmap(AS_PROGRAM, &bml3_state::bml3mk5_mem);
// TODO: anything to add here?
-MACHINE_CONFIG_END
+}
diff --git a/src/mame/drivers/bnstars.cpp b/src/mame/drivers/bnstars.cpp
index 00d1aaf266e..62be3100cf4 100644
--- a/src/mame/drivers/bnstars.cpp
+++ b/src/mame/drivers/bnstars.cpp
@@ -809,21 +809,21 @@ void bnstars_state::bnstars_sound_map(address_map &map)
}
-MACHINE_CONFIG_START(bnstars_state::bnstars)
-
+void bnstars_state::bnstars(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", V70, 20000000) // 20MHz
- MCFG_DEVICE_PROGRAM_MAP(bnstars_map)
- MCFG_DEVICE_IRQ_ACKNOWLEDGE_DRIVER(ms32_state,irq_callback)
+ V70(config, m_maincpu, 20000000); // 20MHz
+ m_maincpu->set_addrmap(AS_PROGRAM, &bnstars_state::bnstars_map);
+ m_maincpu->set_irq_acknowledge_callback(FUNC(ms32_state::irq_callback));
- MCFG_TIMER_DRIVER_ADD_SCANLINE("scantimer", bnstars_state, ms32_interrupt, "lscreen", 0, 1)
+ TIMER(config, "scantimer").configure_scanline(FUNC(bnstars_state::ms32_interrupt), "lscreen", 0, 1);
- MCFG_DEVICE_ADD("audiocpu", Z80, 4000000) // Unverified; it's possibly higher than 4MHz
- MCFG_DEVICE_PROGRAM_MAP(bnstars_sound_map)
+ Z80(config, m_audiocpu, 4000000); // Unverified; it's possibly higher than 4MHz
+ m_audiocpu->set_addrmap(AS_PROGRAM, &bnstars_state::bnstars_sound_map);
- MCFG_QUANTUM_TIME(attotime::from_hz(60000))
+ config.m_minimum_quantum = attotime::from_hz(60000);
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_bnstars)
+ GFXDECODE(config, m_gfxdecode, m_palette, gfx_bnstars);
auto &palette(PALETTE(config, "palette"));
palette.set_format(palette_device::xBRG_888, 0x8000);
@@ -835,21 +835,21 @@ MACHINE_CONFIG_START(bnstars_state::bnstars)
config.set_default_layout(layout_dualhsxs);
- MCFG_SCREEN_ADD("lscreen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(40*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 40*8-1, 0*8, 28*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(bnstars_state, screen_update_bnstars_left)
- MCFG_SCREEN_PALETTE("palette")
+ screen_device &lscreen(SCREEN(config, "lscreen", SCREEN_TYPE_RASTER));
+ lscreen.set_refresh_hz(60);
+ lscreen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ lscreen.set_size(40*8, 32*8);
+ lscreen.set_visarea(0*8, 40*8-1, 0*8, 28*8-1);
+ lscreen.set_screen_update(FUNC(bnstars_state::screen_update_bnstars_left));
+ lscreen.set_palette("palette");
- MCFG_SCREEN_ADD("rscreen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(40*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 40*8-1, 0*8, 28*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(bnstars_state, screen_update_bnstars_right)
- MCFG_SCREEN_PALETTE("palette2")
+ screen_device &rscreen(SCREEN(config, "rscreen", SCREEN_TYPE_RASTER));
+ rscreen.set_refresh_hz(60);
+ rscreen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ rscreen.set_size(40*8, 32*8);
+ rscreen.set_visarea(0*8, 40*8-1, 0*8, 28*8-1);
+ rscreen.set_screen_update(FUNC(bnstars_state::screen_update_bnstars_right));
+ rscreen.set_palette("palette2");
/* sound hardware */
@@ -859,19 +859,18 @@ MACHINE_CONFIG_START(bnstars_state::bnstars)
GENERIC_LATCH_8(config, m_soundlatch);
m_soundlatch->data_pending_callback().set_inputline(m_audiocpu, INPUT_LINE_NMI);
- MCFG_DEVICE_ADD("ymf1", YMF271, 16934400)
- MCFG_SOUND_ROUTE(0, "lspeaker", 1.0)
- MCFG_SOUND_ROUTE(1, "rspeaker", 1.0)
-// MCFG_SOUND_ROUTE(2, "lspeaker", 1.0) Output 2/3 not used?
-// MCFG_SOUND_ROUTE(3, "rspeaker", 1.0)
-
- MCFG_DEVICE_ADD("ymf2", YMF271, 16934400)
- MCFG_SOUND_ROUTE(0, "lspeaker", 1.0)
- MCFG_SOUND_ROUTE(1, "rspeaker", 1.0)
-// MCFG_SOUND_ROUTE(2, "lspeaker", 1.0) Output 2/3 not used?
-// MCFG_SOUND_ROUTE(3, "rspeaker", 1.0)
-
-MACHINE_CONFIG_END
+ ymf271_device &ymf1(YMF271(config, "ymf1", 16934400));
+ ymf1.add_route(0, "lspeaker", 1.0);
+ ymf1.add_route(1, "rspeaker", 1.0);
+// ymf1.add_route(2, "lspeaker", 1.0); Output 2/3 not used?
+// ymf1.add_route(3, "rspeaker", 1.0);
+
+ ymf271_device &ymf2(YMF271(config, "ymf2", 16934400));
+ ymf2.add_route(0, "lspeaker", 1.0);
+ ymf2.add_route(1, "rspeaker", 1.0);
+// ymf2.add_route(2, "lspeaker", 1.0); Output 2/3 not used?
+// ymf2.add_route(3, "rspeaker", 1.0);
+}
ROM_START( bnstars1 )
diff --git a/src/mame/drivers/bntyhunt.cpp b/src/mame/drivers/bntyhunt.cpp
index 780947f4050..d77a0ee1e28 100644
--- a/src/mame/drivers/bntyhunt.cpp
+++ b/src/mame/drivers/bntyhunt.cpp
@@ -53,22 +53,23 @@ static INPUT_PORTS_START( bntyhunt )
INPUT_PORTS_END
-MACHINE_CONFIG_START(bntyhunt_state::bntyhunt)
+void bntyhunt_state::bntyhunt(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", PENTIUM, 200000000) /* Probably a Pentium or higher .. ?? Mhz*/
- MCFG_DEVICE_PROGRAM_MAP(bntyhunt_map)
+ PENTIUM(config, m_maincpu, 200000000); /* Probably a Pentium or higher .. ?? Mhz*/
+ m_maincpu->set_addrmap(AS_PROGRAM, &bntyhunt_state::bntyhunt_map);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_UPDATE_DRIVER(bntyhunt_state, screen_update)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(64*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 64*8-1, 0*8, 32*8-1)
- MCFG_SCREEN_PALETTE("palette")
-
- MCFG_PALETTE_ADD("palette", 0x100)
-MACHINE_CONFIG_END
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_screen_update(FUNC(bntyhunt_state::screen_update));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(64*8, 32*8);
+ screen.set_visarea_full();
+ screen.set_palette("palette");
+
+ PALETTE(config, "palette").set_entries(0x100);
+}
ROM_START(bntyhunt)
diff --git a/src/mame/drivers/bogeyman.cpp b/src/mame/drivers/bogeyman.cpp
index 6768a55426a..2b93e910767 100644
--- a/src/mame/drivers/bogeyman.cpp
+++ b/src/mame/drivers/bogeyman.cpp
@@ -37,11 +37,11 @@ WRITE8_MEMBER(bogeyman_state::ay8910_control_w)
// bit 5 goes to 8910 #0 BDIR pin
if ((m_last_write & 0x20) == 0x20 && (data & 0x20) == 0x00)
- m_ay1->data_address_w(space, m_last_write >> 4, m_psg_latch);
+ m_ay1->data_address_w(m_last_write >> 4, m_psg_latch);
// bit 7 goes to 8910 #1 BDIR pin
if ((m_last_write & 0x80) == 0x80 && (data & 0x80) == 0x00)
- m_ay2->data_address_w(space, m_last_write >> 6, m_psg_latch);
+ m_ay2->data_address_w(m_last_write >> 6, m_psg_latch);
m_last_write = data;
}
@@ -229,24 +229,24 @@ WRITE8_MEMBER(bogeyman_state::colbank_w)
}
}
-MACHINE_CONFIG_START(bogeyman_state::bogeyman)
-
+void bogeyman_state::bogeyman(machine_config &config)
+{
// basic machine hardware
- MCFG_DEVICE_ADD("maincpu", M6502, 1500000) /* Verified */
- MCFG_DEVICE_PROGRAM_MAP(bogeyman_map)
- MCFG_DEVICE_PERIODIC_INT_DRIVER(bogeyman_state, irq0_line_hold, 16*60) // Controls sound
+ M6502(config, m_maincpu, 1500000); /* Verified */
+ m_maincpu->set_addrmap(AS_PROGRAM, &bogeyman_state::bogeyman_map);
+ m_maincpu->set_periodic_int(FUNC(bogeyman_state::irq0_line_hold), attotime::from_hz(16*60)); // Controls sound
// video hardware
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_VIDEO_ATTRIBUTES(VIDEO_UPDATE_BEFORE_VBLANK)
-// MCFG_SCREEN_REFRESH_RATE(60)
-// MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */)
-// MCFG_SCREEN_SIZE(32*8, 32*8)
-// MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 1*8, 31*8-1)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_video_attributes(VIDEO_UPDATE_BEFORE_VBLANK);
+// screen.set_refresh_hz(60);
+// screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500) /* not accurate */);
+// screen.set_size(32*8, 32*8);
+// screen.set_visarea(0*8, 32*8-1, 1*8, 31*8-1);
// DECO video CRTC, unverified
- MCFG_SCREEN_RAW_PARAMS(XTAL(12'000'000)/2,384,0,256,272,8,248)
- MCFG_SCREEN_UPDATE_DRIVER(bogeyman_state, screen_update)
- MCFG_SCREEN_PALETTE(m_palette)
+ screen.set_raw(XTAL(12'000'000)/2,384,0,256,272,8,248);
+ screen.set_screen_update(FUNC(bogeyman_state::screen_update));
+ screen.set_palette(m_palette);
GFXDECODE(config, m_gfxdecode, m_palette, gfx_bogeyman);
PALETTE(config, m_palette, FUNC(bogeyman_state::bogeyman_palette)).set_format(palette_device::BGR_233_inverted, 16 + 256);
@@ -260,7 +260,7 @@ MACHINE_CONFIG_START(bogeyman_state::bogeyman)
m_ay1->add_route(ALL_OUTPUTS, "mono", 0.30);
YM2149(config, m_ay2, 1500000).add_route(ALL_OUTPUTS, "mono", 0.30); /* Verified */
-MACHINE_CONFIG_END
+}
/* ROMs */
diff --git a/src/mame/drivers/bombjack.cpp b/src/mame/drivers/bombjack.cpp
index b7a57d5e765..f9874712a8b 100644
--- a/src/mame/drivers/bombjack.cpp
+++ b/src/mame/drivers/bombjack.cpp
@@ -349,15 +349,15 @@ WRITE_LINE_MEMBER(bombjack_state::vblank_irq)
m_maincpu->set_input_line(INPUT_LINE_NMI, ASSERT_LINE);
}
-MACHINE_CONFIG_START(bombjack_state::bombjack)
-
+void bombjack_state::bombjack(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, XTAL(4'000'000)) /* Confirmed from PCB */
- MCFG_DEVICE_PROGRAM_MAP(main_map)
+ Z80(config, m_maincpu, XTAL(4'000'000)); /* Confirmed from PCB */
+ m_maincpu->set_addrmap(AS_PROGRAM, &bombjack_state::main_map);
- MCFG_DEVICE_ADD("audiocpu", Z80, XTAL(12'000'000)/4) /* Confirmed from PCB */
- MCFG_DEVICE_PROGRAM_MAP(audio_map)
- MCFG_DEVICE_IO_MAP(audio_io_map)
+ z80_device &audiocpu(Z80(config, "audiocpu", XTAL(12'000'000)/4)); /* Confirmed from PCB */
+ audiocpu.set_addrmap(AS_PROGRAM, &bombjack_state::audio_map);
+ audiocpu.set_addrmap(AS_IO, &bombjack_state::audio_io_map);
GENERIC_LATCH_8(config, m_soundlatch);
@@ -384,7 +384,7 @@ MACHINE_CONFIG_START(bombjack_state::bombjack)
AY8910(config, "ay2", XTAL(12'000'000)/8).add_route(ALL_OUTPUTS, "mono", 0.13);
AY8910(config, "ay3", XTAL(12'000'000)/8).add_route(ALL_OUTPUTS, "mono", 0.13);
-MACHINE_CONFIG_END
+}
diff --git a/src/mame/drivers/boogwing.cpp b/src/mame/drivers/boogwing.cpp
index 0241777f905..637dc465457 100644
--- a/src/mame/drivers/boogwing.cpp
+++ b/src/mame/drivers/boogwing.cpp
@@ -336,13 +336,13 @@ DECO16IC_BANK_CB_MEMBER(boogwing_state::bank_callback2)
return offset;
}
-MACHINE_CONFIG_START(boogwing_state::boogwing)
-
+void boogwing_state::boogwing(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M68000, MAIN_XTAL/2) /* DE102 */
- MCFG_DEVICE_PROGRAM_MAP(boogwing_map)
- MCFG_DEVICE_OPCODES_MAP(decrypted_opcodes_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", boogwing_state, irq6_line_hold)
+ M68000(config, m_maincpu, MAIN_XTAL/2); /* DE102 */
+ m_maincpu->set_addrmap(AS_PROGRAM, &boogwing_state::boogwing_map);
+ m_maincpu->set_addrmap(AS_OPCODES, &boogwing_state::decrypted_opcodes_map);
+ m_maincpu->set_vblank_int("screen", FUNC(boogwing_state::irq6_line_hold));
H6280(config, m_audiocpu, SOUND_XTAL/4);
m_audiocpu->set_addrmap(AS_PROGRAM, &boogwing_state::audio_map);
@@ -350,14 +350,14 @@ MACHINE_CONFIG_START(boogwing_state::boogwing)
m_audiocpu->add_route(ALL_OUTPUTS, "rspeaker", 0);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_RAW_PARAMS(MAIN_XTAL / 4, 442, 0, 320, 274, 8, 248) // same as robocop2(cninja.cpp)? verify this from real pcb.
- MCFG_SCREEN_UPDATE_DRIVER(boogwing_state, screen_update_boogwing)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_raw(MAIN_XTAL / 4, 442, 0, 320, 274, 8, 248); // same as robocop2(cninja.cpp)? verify this from real pcb.
+ screen.set_screen_update(FUNC(boogwing_state::screen_update_boogwing));
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, m_deco_ace, gfx_boogwing)
+ GFXDECODE(config, "gfxdecode", m_deco_ace, gfx_boogwing);
- MCFG_DEVICE_ADD("spriteram1", BUFFERED_SPRITERAM16)
- MCFG_DEVICE_ADD("spriteram2", BUFFERED_SPRITERAM16)
+ BUFFERED_SPRITERAM16(config, m_spriteram[0]);
+ BUFFERED_SPRITERAM16(config, m_spriteram[1]);
DECO_ACE(config, m_deco_ace, 0);
@@ -419,14 +419,14 @@ MACHINE_CONFIG_START(boogwing_state::boogwing)
ymsnd.add_route(0, "lspeaker", 0.80);
ymsnd.add_route(1, "rspeaker", 0.80);
- MCFG_DEVICE_ADD("oki1", OKIM6295, SOUND_XTAL/32, okim6295_device::PIN7_HIGH)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 1.40)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 1.40)
+ OKIM6295(config, m_oki[0], SOUND_XTAL/32, okim6295_device::PIN7_HIGH);
+ m_oki[0]->add_route(ALL_OUTPUTS, "lspeaker", 1.40);
+ m_oki[0]->add_route(ALL_OUTPUTS, "rspeaker", 1.40);
- MCFG_DEVICE_ADD("oki2", OKIM6295, SOUND_XTAL/16, okim6295_device::PIN7_HIGH)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 0.30)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 0.30)
-MACHINE_CONFIG_END
+ OKIM6295(config, m_oki[1], SOUND_XTAL/16, okim6295_device::PIN7_HIGH);
+ m_oki[1]->add_route(ALL_OUTPUTS, "lspeaker", 0.30);
+ m_oki[1]->add_route(ALL_OUTPUTS, "rspeaker", 0.30);
+}
/**********************************************************************************/
diff --git a/src/mame/drivers/bowltry.cpp b/src/mame/drivers/bowltry.cpp
index d22bf158a38..a9d16c6c9d1 100644
--- a/src/mame/drivers/bowltry.cpp
+++ b/src/mame/drivers/bowltry.cpp
@@ -99,24 +99,24 @@ uint32_t bowltry_state::screen_update_bowltry(screen_device &screen, bitmap_rgb3
-MACHINE_CONFIG_START(bowltry_state::bowltry)
- MCFG_DEVICE_ADD("maincpu", H83008, 16000000 )
- MCFG_DEVICE_PROGRAM_MAP( bowltry_map )
-// MCFG_DEVICE_VBLANK_INT_DRIVER("screen", bowltry_state, irq0_line_hold) // uses vector $64, IMIAB according to the manual (timer/compare B, internal to the CPU)
+void bowltry_state::bowltry(machine_config &config)
+{
+ H83008(config, m_maincpu, 16000000);
+ m_maincpu->set_addrmap(AS_PROGRAM, &bowltry_state::bowltry_map);
+// m_maincpu->set_vblank_int("screen", FUNC(bowltry_state::irq0_line_hold)); // uses vector $64, IMIAB according to the manual (timer/compare B, internal to the CPU)
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(64*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 64*8-1, 0*8, 32*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(bowltry_state, screen_update_bowltry)
- //MCFG_SCREEN_PALETTE("palette")
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(64*8, 32*8);
+ screen.set_visarea_full();
+ screen.set_screen_update(FUNC(bowltry_state::screen_update_bowltry));
+ //screen.set_palette("palette");
- //MCFG_PALETTE_ADD("palette", 65536)
+ //PALETTE(config, "palette").set_entries(65536);
/* tt5665 sound */
-
-MACHINE_CONFIG_END
+}
ROM_START( bowltry )
ROM_REGION( 0x080000, "maincpu", 0 )
diff --git a/src/mame/drivers/boxer.cpp b/src/mame/drivers/boxer.cpp
index cae7b4900d1..0eccc410514 100644
--- a/src/mame/drivers/boxer.cpp
+++ b/src/mame/drivers/boxer.cpp
@@ -491,27 +491,27 @@ void boxer_state::machine_reset()
}
-MACHINE_CONFIG_START(boxer_state::boxer)
-
+void boxer_state::boxer(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M6502, MASTER_CLOCK / 16)
- MCFG_DEVICE_PROGRAM_MAP(boxer_map)
+ M6502(config, m_maincpu, MASTER_CLOCK / 16);
+ m_maincpu->set_addrmap(AS_PROGRAM, &boxer_state::boxer_map);
WATCHDOG_TIMER(config, "watchdog");
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_SIZE(256, 262)
- MCFG_SCREEN_VISIBLE_AREA(8, 247, 0, 239)
- MCFG_SCREEN_UPDATE_DRIVER(boxer_state, screen_update)
- MCFG_SCREEN_PALETTE(m_palette)
-
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, m_palette, gfx_boxer)
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_refresh_hz(60);
+ m_screen->set_size(256, 262);
+ m_screen->set_visarea(8, 247, 0, 239);
+ m_screen->set_screen_update(FUNC(boxer_state::screen_update));
+ m_screen->set_palette(m_palette);
+
+ GFXDECODE(config, m_gfxdecode, m_palette, gfx_boxer);
PALETTE(config, m_palette, FUNC(boxer_state::boxer_palette), 4);
/* sound hardware */
-MACHINE_CONFIG_END
+}
/*************************************
diff --git a/src/mame/drivers/br8641.cpp b/src/mame/drivers/br8641.cpp
index 95c4d452321..b58495a71d5 100644
--- a/src/mame/drivers/br8641.cpp
+++ b/src/mame/drivers/br8641.cpp
@@ -158,7 +158,8 @@ static const z80_daisy_config daisy_chain_intf[] =
-MACHINE_CONFIG_START(brandt8641_state::brandt8641)
+void brandt8641_state::brandt8641(machine_config &config)
+{
/* basic machine hardware */
Z80(config, m_maincpu, XTAL(4'000'000)); // U4 ,4MHz crystal on board
m_maincpu->set_addrmap(AS_PROGRAM, &brandt8641_state::brandt8641_mem);
@@ -167,8 +168,7 @@ MACHINE_CONFIG_START(brandt8641_state::brandt8641)
/* sound hardware */
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("beeper", BEEP, 2000)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.50)
+ BEEP(config, m_beep, 2000).add_route(ALL_OUTPUTS, "mono", 0.50);
// Z80APIO U9
// Z80APIO U14
@@ -186,7 +186,7 @@ MACHINE_CONFIG_START(brandt8641_state::brandt8641)
m_pio3->out_int_callback().set_inputline(m_maincpu, INPUT_LINE_IRQ0);
Z80CTC(config, "ctc", XTAL(4'000'000)); // Z80CTC U8
-MACHINE_CONFIG_END
+}
/* ROM definition */
ROM_START( br8641 )
diff --git a/src/mame/drivers/brkthru.cpp b/src/mame/drivers/brkthru.cpp
index 5d91c6bfaef..7293fe25c9b 100644
--- a/src/mame/drivers/brkthru.cpp
+++ b/src/mame/drivers/brkthru.cpp
@@ -133,6 +133,12 @@ Notes:
Connectors:
2x flat cable to upper board
+
+brkthru, brkthruj and brkthrut have a Self Test Mode not mentioned anywhere
+in the manual. It is accessed by holding down both player 1 and player 2 start
+buttons while powering up the game. It can be accessed in MAME by holding the
+buttons down after the game has started then pressing F3 to reset the game.
+
***************************************************************************/
#include "emu.h"
@@ -460,10 +466,10 @@ WRITE_LINE_MEMBER(brkthru_state::vblank_irq)
void brkthru_state::brkthru(machine_config &config)
{
/* basic machine hardware */
- MC6809E(config, m_maincpu, MASTER_CLOCK/8); /* 1.5 MHz ? */
+ MC6809E(config, m_maincpu, MASTER_CLOCK/8); /* 1.5 MHz ? */
m_maincpu->set_addrmap(AS_PROGRAM, &brkthru_state::brkthru_map);
- MC6809(config, m_audiocpu, MASTER_CLOCK/2); /* 1.5 MHz ? */
+ MC6809(config, m_audiocpu, MASTER_CLOCK/2); /* 1.5 MHz ? */
m_audiocpu->set_addrmap(AS_PROGRAM, &brkthru_state::sound_map);
/* video hardware */
@@ -497,10 +503,10 @@ void brkthru_state::brkthru(machine_config &config)
void brkthru_state::darwin(machine_config &config)
{
/* basic machine hardware */
- MC6809E(config, m_maincpu, MASTER_CLOCK/8); /* 1.5 MHz ? */
+ MC6809E(config, m_maincpu, MASTER_CLOCK/8); /* 1.5 MHz ? */
m_maincpu->set_addrmap(AS_PROGRAM, &brkthru_state::darwin_map);
- MC6809(config, m_audiocpu, MASTER_CLOCK/2); /* 1.5 MHz ? */
+ MC6809(config, m_audiocpu, MASTER_CLOCK/2); /* 1.5 MHz ? */
m_audiocpu->set_addrmap(AS_PROGRAM, &brkthru_state::sound_map);
/* video hardware */
diff --git a/src/mame/drivers/bsktball.cpp b/src/mame/drivers/bsktball.cpp
index 14787c96615..d1b786f94ed 100644
--- a/src/mame/drivers/bsktball.cpp
+++ b/src/mame/drivers/bsktball.cpp
@@ -238,12 +238,12 @@ void bsktball_state::machine_reset()
}
-MACHINE_CONFIG_START(bsktball_state::bsktball)
-
+void bsktball_state::bsktball(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M6502,750000)
- MCFG_DEVICE_PROGRAM_MAP(main_map)
- MCFG_TIMER_DRIVER_ADD_SCANLINE("scantimer", bsktball_state, bsktball_scanline, "screen", 0, 1)
+ M6502(config, m_maincpu, 750000);
+ m_maincpu->set_addrmap(AS_PROGRAM, &bsktball_state::main_map);
+ TIMER(config, "scantimer").configure_scanline(FUNC(bsktball_state::bsktball_scanline), "screen", 0, 1);
f9334_device &outlatch(F9334(config, "outlatch")); // M6
outlatch.q_out_cb<1>().set_nop(); // Coin Counter
@@ -255,22 +255,22 @@ MACHINE_CONFIG_START(bsktball_state::bsktball)
outlatch.q_out_cb<7>().set(FUNC(bsktball_state::nmion_w)); // NMI On
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */)
- MCFG_SCREEN_SIZE(32*8, 28*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 0*8, 28*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(bsktball_state, screen_update_bsktball)
- MCFG_SCREEN_PALETTE(m_palette)
-
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, m_palette, gfx_bsktball)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500) /* not accurate */);
+ screen.set_size(32*8, 28*8);
+ screen.set_visarea_full();
+ screen.set_screen_update(FUNC(bsktball_state::screen_update_bsktball));
+ screen.set_palette(m_palette);
+
+ GFXDECODE(config, m_gfxdecode, m_palette, gfx_bsktball);
PALETTE(config, m_palette, FUNC(bsktball_state::bsktball_palette), 2*4 + 4*4*4*4, 4);
/* sound hardware */
SPEAKER(config, "mono").front_center();
DISCRETE(config, m_discrete, bsktball_discrete).add_route(ALL_OUTPUTS, "mono", 1.0);
-MACHINE_CONFIG_END
+}
diff --git a/src/mame/drivers/btime.cpp b/src/mame/drivers/btime.cpp
index e0b1873f6b6..8a7301793ae 100644
--- a/src/mame/drivers/btime.cpp
+++ b/src/mame/drivers/btime.cpp
@@ -1277,30 +1277,28 @@ MACHINE_RESET_MEMBER(btime_state,mmonkey)
m_protection_ret = 0;
}
-MACHINE_CONFIG_START(btime_state::btime)
-
+void btime_state::btime(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", DECO_CPU7, HCLK2) /* seletable between H2/H4 via jumper */
- MCFG_DEVICE_PROGRAM_MAP(btime_map)
+ DECO_CPU7(config, m_maincpu, HCLK2); /* selectable between H2/H4 via jumper */
+ m_maincpu->set_addrmap(AS_PROGRAM, &btime_state::btime_map);
- MCFG_DEVICE_ADD("audiocpu", M6502, HCLK1/3/2)
- MCFG_DEVICE_PROGRAM_MAP(audio_map)
- MCFG_TIMER_DRIVER_ADD_SCANLINE("8vck", btime_state, audio_nmi_gen, "screen", 0, 8)
+ M6502(config, m_audiocpu, HCLK1/3/2);
+ m_audiocpu->set_addrmap(AS_PROGRAM, &btime_state::audio_map);
+ TIMER(config, "8vck").configure_scanline(FUNC(btime_state::audio_nmi_gen), "screen", 0, 8);
- MCFG_INPUT_MERGER_ALL_HIGH("audionmi")
- MCFG_INPUT_MERGER_OUTPUT_HANDLER(INPUTLINE("audiocpu", INPUT_LINE_NMI))
+ INPUT_MERGER_ALL_HIGH(config, "audionmi").output_handler().set_inputline(m_audiocpu, INPUT_LINE_NMI);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_RAW_PARAMS(HCLK, 384, 8, 248, 272, 8, 248)
- MCFG_SCREEN_UPDATE_DRIVER(btime_state, screen_update_btime)
- MCFG_SCREEN_PALETTE(m_palette)
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_raw(HCLK, 384, 8, 248, 272, 8, 248);
+ m_screen->set_screen_update(FUNC(btime_state::screen_update_btime));
+ m_screen->set_palette(m_palette);
MCFG_MACHINE_START_OVERRIDE(btime_state,btime)
MCFG_MACHINE_RESET_OVERRIDE(btime_state,btime)
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, m_palette, gfx_btime)
-
+ GFXDECODE(config, m_gfxdecode, m_palette, gfx_btime);
PALETTE(config, m_palette, FUNC(btime_state::btime_palette)).set_format(palette_device::BGR_233_inverted, 16);
/* sound hardware */
@@ -1324,114 +1322,108 @@ MACHINE_CONFIG_START(btime_state::btime)
ay2.add_route(1, "discrete", 1.0, 4);
ay2.add_route(2, "discrete", 1.0, 5);
- MCFG_DEVICE_ADD("discrete", DISCRETE, btime_sound_discrete)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
-MACHINE_CONFIG_END
+ DISCRETE(config, "discrete", btime_sound_discrete).add_route(ALL_OUTPUTS, "mono", 1.0);
+}
-MACHINE_CONFIG_START(btime_state::cookrace)
+void btime_state::cookrace(machine_config &config)
+{
btime(config);
/* basic machine hardware */
- MCFG_DEVICE_REPLACE("maincpu", DECO_C10707, HCLK2)
- MCFG_DEVICE_PROGRAM_MAP(cookrace_map)
+ DECO_C10707(config.replace(), m_maincpu, HCLK2);
+ m_maincpu->set_addrmap(AS_PROGRAM, &btime_state::cookrace_map);
- MCFG_DEVICE_MODIFY("audiocpu")
- MCFG_DEVICE_PROGRAM_MAP(audio_map)
+ m_audiocpu->set_addrmap(AS_PROGRAM, &btime_state::audio_map);
/* video hardware */
- MCFG_GFXDECODE_MODIFY("gfxdecode", gfx_cookrace)
-
- MCFG_SCREEN_MODIFY("screen")
- MCFG_SCREEN_UPDATE_DRIVER(btime_state, screen_update_cookrace)
-MACHINE_CONFIG_END
+ m_gfxdecode->set_info(gfx_cookrace);
+ m_screen->set_screen_update(FUNC(btime_state::screen_update_cookrace));
+}
-MACHINE_CONFIG_START(btime_state::lnc)
+void btime_state::lnc(machine_config &config)
+{
btime(config);
/* basic machine hardware */
- MCFG_DEVICE_REPLACE("maincpu", DECO_C10707, HCLK2)
- MCFG_DEVICE_PROGRAM_MAP(lnc_map)
+ DECO_C10707(config.replace(), m_maincpu, HCLK2);
+ m_maincpu->set_addrmap(AS_PROGRAM, &btime_state::lnc_map);
MCFG_MACHINE_RESET_OVERRIDE(btime_state,lnc)
/* video hardware */
- MCFG_GFXDECODE_MODIFY("gfxdecode", gfx_lnc)
+ m_gfxdecode->set_info(gfx_lnc);
m_palette->set_entries(8);
m_palette->set_init(FUNC(btime_state::lnc_palette));
- MCFG_SCREEN_MODIFY("screen")
- MCFG_SCREEN_UPDATE_DRIVER(btime_state, screen_update_lnc)
-MACHINE_CONFIG_END
+ m_screen->set_screen_update(FUNC(btime_state::screen_update_lnc));
+}
-MACHINE_CONFIG_START(btime_state::wtennis)
+void btime_state::wtennis(machine_config &config)
+{
lnc(config);
- /* basic machine hardware */
-
/* video hardware */
- MCFG_SCREEN_MODIFY("screen")
- MCFG_SCREEN_UPDATE_DRIVER(btime_state, screen_update_eggs)
-MACHINE_CONFIG_END
+ m_screen->set_screen_update(FUNC(btime_state::screen_update_eggs));
+}
-MACHINE_CONFIG_START(btime_state::mmonkey)
+void btime_state::mmonkey(machine_config &config)
+{
wtennis(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(mmonkey_map)
+ m_maincpu->set_addrmap(AS_PROGRAM, &btime_state::mmonkey_map);
MCFG_MACHINE_START_OVERRIDE(btime_state,mmonkey)
MCFG_MACHINE_RESET_OVERRIDE(btime_state,mmonkey)
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(btime_state::bnj)
+void btime_state::bnj(machine_config &config)
+{
btime(config);
/* basic machine hardware */
- MCFG_DEVICE_REPLACE("maincpu", DECO_C10707, HCLK4)
- MCFG_DEVICE_CLOCK(HCLK4)
- MCFG_DEVICE_PROGRAM_MAP(bnj_map)
+ DECO_C10707(config.replace(), m_maincpu, HCLK4);
+ m_maincpu->set_addrmap(AS_PROGRAM, &btime_state::bnj_map);
/* video hardware */
- MCFG_GFXDECODE_MODIFY("gfxdecode", gfx_bnj)
+ m_gfxdecode->set_info(gfx_bnj);
MCFG_VIDEO_START_OVERRIDE(btime_state,bnj)
- MCFG_SCREEN_MODIFY("screen")
- MCFG_SCREEN_UPDATE_DRIVER(btime_state, screen_update_bnj)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 1*8, 31*8-1) // 256 * 240, confirmed
-MACHINE_CONFIG_END
+ m_screen->set_screen_update(FUNC(btime_state::screen_update_bnj));
+ m_screen->set_visarea(0*8, 32*8-1, 1*8, 31*8-1); // 256 * 240, confirmed
+}
-MACHINE_CONFIG_START(btime_state::sdtennis)
+void btime_state::sdtennis(machine_config &config)
+{
bnj(config);
/* basic machine hardware */
- MCFG_DEVICE_REPLACE("audiocpu", DECO_C10707, HCLK1/3/2)
- MCFG_DEVICE_PROGRAM_MAP(audio_map)
-MACHINE_CONFIG_END
+ DECO_C10707(config.replace(), m_audiocpu, HCLK1/3/2);
+ m_audiocpu->set_addrmap(AS_PROGRAM, &btime_state::audio_map);
+}
-MACHINE_CONFIG_START(btime_state::zoar)
+void btime_state::zoar(machine_config &config)
+{
btime(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(zoar_map)
+ m_maincpu->set_addrmap(AS_PROGRAM, &btime_state::zoar_map);
/* video hardware */
- MCFG_GFXDECODE_MODIFY("gfxdecode", gfx_zoar)
+ m_gfxdecode->set_info(gfx_zoar);
m_palette->set_entries(64);
- MCFG_SCREEN_MODIFY("screen")
- MCFG_SCREEN_UPDATE_DRIVER(btime_state, screen_update_zoar)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 1*8, 31*8-1) // 256 * 240, confirmed
+ m_screen->set_screen_update(FUNC(btime_state::screen_update_zoar));
+ m_screen->set_visarea(0*8, 32*8-1, 1*8, 31*8-1); // 256 * 240, confirmed
/* sound hardware */
ay8910_device &ay1(AY8910(config.replace(), "ay1", HCLK1));
@@ -1442,44 +1434,41 @@ MACHINE_CONFIG_START(btime_state::zoar)
ay8910_device &ay2(AY8910(config.replace(), "ay2", HCLK1));
ay2.add_route(ALL_OUTPUTS, "mono", 0.23);
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(btime_state::disco)
+void btime_state::disco(machine_config &config)
+{
btime(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_CLOCK(HCLK4)
- MCFG_DEVICE_PROGRAM_MAP(disco_map)
+ m_maincpu->set_clock(HCLK4);
+ m_maincpu->set_addrmap(AS_PROGRAM, &btime_state::disco_map);
- MCFG_DEVICE_MODIFY("audiocpu")
- MCFG_DEVICE_PROGRAM_MAP(disco_audio_map)
+ m_audiocpu->set_addrmap(AS_PROGRAM, &btime_state::disco_audio_map);
m_soundlatch->set_separate_acknowledge(true);
/* video hardware */
- MCFG_GFXDECODE_MODIFY("gfxdecode", gfx_disco)
-
+ m_gfxdecode->set_info(gfx_disco);
m_palette->set_entries(32);
MCFG_VIDEO_START_OVERRIDE(btime_state,disco)
- MCFG_SCREEN_MODIFY("screen")
- MCFG_SCREEN_UPDATE_DRIVER(btime_state, screen_update_disco)
-MACHINE_CONFIG_END
+ m_screen->set_screen_update(FUNC(btime_state::screen_update_disco));
+}
-MACHINE_CONFIG_START(btime_state::tisland)
+void btime_state::tisland(machine_config &config)
+{
btime(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(tisland_map)
+ m_maincpu->set_addrmap(AS_PROGRAM, &btime_state::tisland_map);
/* video hardware */
- MCFG_GFXDECODE_MODIFY("gfxdecode", gfx_zoar)
-MACHINE_CONFIG_END
+ m_gfxdecode->set_info(gfx_zoar);
+}
/***************************************************************************
diff --git a/src/mame/drivers/btoads.cpp b/src/mame/drivers/btoads.cpp
index f9b9ad9b1cf..e58548400f1 100644
--- a/src/mame/drivers/btoads.cpp
+++ b/src/mame/drivers/btoads.cpp
@@ -191,7 +191,6 @@ void btoads_state::main_map(address_map &map)
map(0xa8800000, 0xa8ffffff).nopw();
map(0xb0000000, 0xb03fffff).rw(FUNC(btoads_state::vram_bg0_r), FUNC(btoads_state::vram_bg0_w)).share("vram_bg0");
map(0xb4000000, 0xb43fffff).rw(FUNC(btoads_state::vram_bg1_r), FUNC(btoads_state::vram_bg1_w)).share("vram_bg1");
- map(0xc0000000, 0xc00003ff).rw(m_maincpu, FUNC(tms34020_device::io_register_r), FUNC(tms34020_device::io_register_w));
map(0xfc000000, 0xffffffff).rom().region("user1", 0);
}
@@ -303,8 +302,8 @@ INPUT_PORTS_END
*
*************************************/
-MACHINE_CONFIG_START(btoads_state::btoads)
-
+void btoads_state::btoads(machine_config &config)
+{
TMS34020(config, m_maincpu, CPU_CLOCK/2);
m_maincpu->set_addrmap(AS_PROGRAM, &btoads_state::main_map);
m_maincpu->set_halt_on_reset(false);
@@ -314,28 +313,28 @@ MACHINE_CONFIG_START(btoads_state::btoads)
m_maincpu->set_shiftreg_in_callback(FUNC(btoads_state::to_shiftreg));
m_maincpu->set_shiftreg_out_callback(FUNC(btoads_state::from_shiftreg));
- MCFG_DEVICE_ADD("audiocpu", Z80, SOUND_CLOCK/4)
- MCFG_DEVICE_PROGRAM_MAP(sound_map)
- MCFG_DEVICE_IO_MAP(sound_io_map)
- MCFG_DEVICE_PERIODIC_INT_DRIVER(btoads_state, irq0_line_assert, 183)
+ Z80(config, m_audiocpu, SOUND_CLOCK/4);
+ m_audiocpu->set_addrmap(AS_PROGRAM, &btoads_state::sound_map);
+ m_audiocpu->set_addrmap(AS_IO, &btoads_state::sound_io_map);
+ m_audiocpu->set_periodic_int(FUNC(btoads_state::irq0_line_assert), attotime::from_ticks(32768, SOUND_CLOCK/4));
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_1);
/* video hardware */
- MCFG_TLC34076_ADD("tlc34076", TLC34076_6_BIT)
+ TLC34076(config, m_tlc34076, tlc34076_device::TLC34076_6_BIT);
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_RAW_PARAMS(VIDEO_CLOCK/2, 640, 0, 512, 257, 0, 224)
- MCFG_SCREEN_UPDATE_DEVICE("maincpu", tms34020_device, tms340x0_rgb32)
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_raw(VIDEO_CLOCK/2, 640, 0, 512, 257, 0, 224);
+ m_screen->set_screen_update("maincpu", FUNC(tms34020_device::tms340x0_rgb32));
/* sound hardware */
SPEAKER(config, "lspeaker").front_left();
SPEAKER(config, "rspeaker").front_right();
- MCFG_DEVICE_ADD("bsmt", BSMT2000, SOUND_CLOCK)
- MCFG_SOUND_ROUTE(0, "lspeaker", 1.0)
- MCFG_SOUND_ROUTE(1, "rspeaker", 1.0)
-MACHINE_CONFIG_END
+ BSMT2000(config, m_bsmt, SOUND_CLOCK);
+ m_bsmt->add_route(0, "lspeaker", 1.0);
+ m_bsmt->add_route(1, "rspeaker", 1.0);
+}
diff --git a/src/mame/drivers/buggychl.cpp b/src/mame/drivers/buggychl.cpp
index 475fe490f3d..1b3e25cc09a 100644
--- a/src/mame/drivers/buggychl.cpp
+++ b/src/mame/drivers/buggychl.cpp
@@ -520,7 +520,7 @@ void buggychl_state::buggychl(machine_config &config)
Z80(config, m_audiocpu, 8_MHz_XTAL/2); /* 4 MHz according to schematics */
m_audiocpu->set_addrmap(AS_PROGRAM, &buggychl_state::sound_map);
m_audiocpu->set_periodic_int(FUNC(buggychl_state::irq0_line_hold), attotime::from_hz(8_MHz_XTAL/2/2/256/64)); // timer irq
- //MCFG_TIMER_DEVICE_ADD_PERIODIC("soundirq", "audiocpu", irq0_line_hold, 8_MHz_XTAL/2/2/256/64)
+ //TIMER(config, "soundirq").configure_periodic(m_audiocpu, FUNC(buggychl_state::irq0_line_hold), 8_MHz_XTAL/2/2/256/64);
// The schematics (which are at least partly for the wrong sound board) show a configurable timer with rates of
// 61.035Hz (8_MHz_XTAL/2/2/256/128)
// or 122.0Hz (8_MHz_XTAL/2/2/256/64)
diff --git a/src/mame/drivers/bullet.cpp b/src/mame/drivers/bullet.cpp
index 9c487187e11..c14f216c834 100644
--- a/src/mame/drivers/bullet.cpp
+++ b/src/mame/drivers/bullet.cpp
@@ -1103,10 +1103,11 @@ void bulletf_state::machine_reset()
//**************************************************************************
//-------------------------------------------------
-// MACHINE_CONFIG( bullet )
+// machine_config( bullet )
//-------------------------------------------------
-MACHINE_CONFIG_START(bullet_state::bullet)
+void bullet_state::bullet(machine_config &config)
+{
// basic machine hardware
Z80(config, m_maincpu, 16_MHz_XTAL / 4);
m_maincpu->set_addrmap(AS_PROGRAM, &bullet_state::bullet_mem);
@@ -1120,7 +1121,7 @@ MACHINE_CONFIG_START(bullet_state::bullet)
m_ctc->zc_callback<1>().set(m_dart, FUNC(z80dart_device::rxtxcb_w));
m_ctc->zc_callback<2>().set(m_ctc, FUNC(z80ctc_device::trg3));
- MCFG_TIMER_DRIVER_ADD_PERIODIC("ctc", bullet_state, ctc_tick, attotime::from_hz(4.9152_MHz_XTAL /4))
+ TIMER(config, "ctc").configure_periodic(FUNC(bullet_state::ctc_tick), attotime::from_hz(4.9152_MHz_XTAL / 4));
Z80DART(config, m_dart, 16_MHz_XTAL / 4);
m_dart->out_txda_callback().set(RS232_A_TAG, FUNC(rs232_port_device::write_txd));
@@ -1149,22 +1150,23 @@ MACHINE_CONFIG_START(bullet_state::bullet)
MB8877(config, m_fdc, 16_MHz_XTAL / 16);
m_fdc->intrq_wr_callback().set(m_dart, FUNC(z80dart_device::dcda_w));
m_fdc->drq_wr_callback().set(FUNC(bullet_state::fdc_drq_w));
- MCFG_FLOPPY_DRIVE_ADD(MB8877_TAG":0", bullet_525_floppies, "525qd", floppy_image_device::default_floppy_formats)
- MCFG_FLOPPY_DRIVE_ADD(MB8877_TAG":1", bullet_525_floppies, nullptr, floppy_image_device::default_floppy_formats)
- MCFG_FLOPPY_DRIVE_ADD(MB8877_TAG":2", bullet_525_floppies, nullptr, floppy_image_device::default_floppy_formats)
- MCFG_FLOPPY_DRIVE_ADD(MB8877_TAG":3", bullet_525_floppies, nullptr, floppy_image_device::default_floppy_formats)
- MCFG_FLOPPY_DRIVE_ADD(MB8877_TAG":4", bullet_8_floppies, nullptr, floppy_image_device::default_floppy_formats)
- MCFG_FLOPPY_DRIVE_ADD(MB8877_TAG":5", bullet_8_floppies, nullptr, floppy_image_device::default_floppy_formats)
- MCFG_FLOPPY_DRIVE_ADD(MB8877_TAG":6", bullet_8_floppies, nullptr, floppy_image_device::default_floppy_formats)
- MCFG_FLOPPY_DRIVE_ADD(MB8877_TAG":7", bullet_8_floppies, nullptr, floppy_image_device::default_floppy_formats)
-
- MCFG_DEVICE_ADD(m_centronics, CENTRONICS, centronics_devices, "printer")
- MCFG_CENTRONICS_BUSY_HANDLER(WRITELINE(*this, bullet_state, write_centronics_busy))
- MCFG_CENTRONICS_PERROR_HANDLER(WRITELINE(*this, bullet_state, write_centronics_perror))
- MCFG_CENTRONICS_SELECT_HANDLER(WRITELINE(*this, bullet_state, write_centronics_select))
- MCFG_CENTRONICS_FAULT_HANDLER(WRITELINE(*this, bullet_state, write_centronics_fault))
-
- MCFG_CENTRONICS_OUTPUT_LATCH_ADD("cent_data_out", CENTRONICS_TAG)
+ FLOPPY_CONNECTOR(config, MB8877_TAG":0", bullet_525_floppies, "525qd", floppy_image_device::default_floppy_formats);
+ FLOPPY_CONNECTOR(config, MB8877_TAG":1", bullet_525_floppies, nullptr, floppy_image_device::default_floppy_formats);
+ FLOPPY_CONNECTOR(config, MB8877_TAG":2", bullet_525_floppies, nullptr, floppy_image_device::default_floppy_formats);
+ FLOPPY_CONNECTOR(config, MB8877_TAG":3", bullet_525_floppies, nullptr, floppy_image_device::default_floppy_formats);
+ FLOPPY_CONNECTOR(config, MB8877_TAG":4", bullet_8_floppies, nullptr, floppy_image_device::default_floppy_formats);
+ FLOPPY_CONNECTOR(config, MB8877_TAG":5", bullet_8_floppies, nullptr, floppy_image_device::default_floppy_formats);
+ FLOPPY_CONNECTOR(config, MB8877_TAG":6", bullet_8_floppies, nullptr, floppy_image_device::default_floppy_formats);
+ FLOPPY_CONNECTOR(config, MB8877_TAG":7", bullet_8_floppies, nullptr, floppy_image_device::default_floppy_formats);
+
+ CENTRONICS(config, m_centronics, centronics_devices, "printer");
+ m_centronics->busy_handler().set(FUNC(bullet_state::write_centronics_busy));
+ m_centronics->perror_handler().set(FUNC(bullet_state::write_centronics_perror));
+ m_centronics->select_handler().set(FUNC(bullet_state::write_centronics_select));
+ m_centronics->fault_handler().set(FUNC(bullet_state::write_centronics_fault));
+
+ output_latch_device &cent_data_out(OUTPUT_LATCH(config, "cent_data_out"));
+ m_centronics->set_output_latch(cent_data_out);
rs232_port_device &rs232a(RS232_PORT(config, RS232_A_TAG, default_rs232_devices, "terminal"));
rs232a.rxd_handler().set(m_dart, FUNC(z80dart_device::rxa_w));
@@ -1174,18 +1176,19 @@ MACHINE_CONFIG_START(bullet_state::bullet)
rs232b.rxd_handler().set(m_dart, FUNC(z80dart_device::rxb_w));
// software lists
- MCFG_SOFTWARE_LIST_ADD("flop_list", "wmbullet")
+ SOFTWARE_LIST(config, "flop_list").set_original("wmbullet");
// internal ram
RAM(config, RAM_TAG).set_default_size("128K");
-MACHINE_CONFIG_END
+}
//-------------------------------------------------
-// MACHINE_CONFIG( bulletf )
+// machine_config( bulletf )
//-------------------------------------------------
-MACHINE_CONFIG_START(bulletf_state::bulletf)
+void bulletf_state::bulletf(machine_config &config)
+{
// basic machine hardware
Z80(config, m_maincpu, 16_MHz_XTAL / 4);
m_maincpu->set_addrmap(AS_PROGRAM, &bulletf_state::bulletf_mem);
@@ -1199,7 +1202,7 @@ MACHINE_CONFIG_START(bulletf_state::bulletf)
m_ctc->zc_callback<1>().set(m_dart, FUNC(z80dart_device::rxtxcb_w));
m_ctc->zc_callback<2>().set(m_ctc, FUNC(z80ctc_device::trg3));
- MCFG_TIMER_DRIVER_ADD_PERIODIC("ctc", bullet_state, ctc_tick, attotime::from_hz(4.9152_MHz_XTAL / 4))
+ TIMER(config, "ctc").configure_periodic(FUNC(bullet_state::ctc_tick), attotime::from_hz(4.9152_MHz_XTAL / 4));
Z80DART(config, m_dart, 16_MHz_XTAL / 4);
m_dart->out_txda_callback().set(RS232_A_TAG, FUNC(rs232_port_device::write_txd));
@@ -1230,21 +1233,22 @@ MACHINE_CONFIG_START(bulletf_state::bulletf)
MB8877(config, m_fdc, 16_MHz_XTAL / 16);
m_fdc->intrq_wr_callback().set(m_dart, FUNC(z80dart_device::rib_w));
m_fdc->drq_wr_callback().set(FUNC(bullet_state::fdc_drq_w));
- MCFG_FLOPPY_DRIVE_ADD(MB8877_TAG":0", bullet_525_floppies, "525qd", floppy_image_device::default_floppy_formats)
- MCFG_FLOPPY_DRIVE_ADD(MB8877_TAG":1", bullet_525_floppies, nullptr, floppy_image_device::default_floppy_formats)
- MCFG_FLOPPY_DRIVE_ADD(MB8877_TAG":2", bullet_525_floppies, nullptr, floppy_image_device::default_floppy_formats)
- MCFG_FLOPPY_DRIVE_ADD(MB8877_TAG":3", bullet_525_floppies, nullptr, floppy_image_device::default_floppy_formats)
- MCFG_FLOPPY_DRIVE_ADD(MB8877_TAG":4", bullet_8_floppies, nullptr, floppy_image_device::default_floppy_formats)
- MCFG_FLOPPY_DRIVE_ADD(MB8877_TAG":5", bullet_8_floppies, nullptr, floppy_image_device::default_floppy_formats)
- MCFG_FLOPPY_DRIVE_ADD(MB8877_TAG":6", bullet_8_floppies, nullptr, floppy_image_device::default_floppy_formats)
- MCFG_FLOPPY_DRIVE_ADD(MB8877_TAG":7", bullet_8_floppies, nullptr, floppy_image_device::default_floppy_formats)
- MCFG_FLOPPY_DRIVE_ADD(MB8877_TAG":8", bullet_35_floppies, nullptr, floppy_image_device::default_floppy_formats)
- MCFG_FLOPPY_DRIVE_ADD(MB8877_TAG":9", bullet_35_floppies, nullptr, floppy_image_device::default_floppy_formats)
-
- MCFG_DEVICE_ADD(m_centronics, CENTRONICS, centronics_devices, "printer")
- MCFG_CENTRONICS_BUSY_HANDLER(WRITELINE(*this, bullet_state, write_centronics_busy))
-
- MCFG_CENTRONICS_OUTPUT_LATCH_ADD("cent_data_out", CENTRONICS_TAG)
+ FLOPPY_CONNECTOR(config, MB8877_TAG":0", bullet_525_floppies, "525qd", floppy_image_device::default_floppy_formats);
+ FLOPPY_CONNECTOR(config, MB8877_TAG":1", bullet_525_floppies, nullptr, floppy_image_device::default_floppy_formats);
+ FLOPPY_CONNECTOR(config, MB8877_TAG":2", bullet_525_floppies, nullptr, floppy_image_device::default_floppy_formats);
+ FLOPPY_CONNECTOR(config, MB8877_TAG":3", bullet_525_floppies, nullptr, floppy_image_device::default_floppy_formats);
+ FLOPPY_CONNECTOR(config, MB8877_TAG":4", bullet_8_floppies, nullptr, floppy_image_device::default_floppy_formats);
+ FLOPPY_CONNECTOR(config, MB8877_TAG":5", bullet_8_floppies, nullptr, floppy_image_device::default_floppy_formats);
+ FLOPPY_CONNECTOR(config, MB8877_TAG":6", bullet_8_floppies, nullptr, floppy_image_device::default_floppy_formats);
+ FLOPPY_CONNECTOR(config, MB8877_TAG":7", bullet_8_floppies, nullptr, floppy_image_device::default_floppy_formats);
+ FLOPPY_CONNECTOR(config, MB8877_TAG":8", bullet_35_floppies, nullptr, floppy_image_device::default_floppy_formats);
+ FLOPPY_CONNECTOR(config, MB8877_TAG":9", bullet_35_floppies, nullptr, floppy_image_device::default_floppy_formats);
+
+ CENTRONICS(config, m_centronics, centronics_devices, "printer");
+ m_centronics->busy_handler().set(FUNC(bullet_state::write_centronics_busy));
+
+ output_latch_device &cent_data_out(OUTPUT_LATCH(config, "cent_data_out"));
+ m_centronics->set_output_latch(cent_data_out);
rs232_port_device &rs232a(RS232_PORT(config, RS232_A_TAG, default_rs232_devices, "terminal"));
rs232a.rxd_handler().set(m_dart, FUNC(z80dart_device::rxa_w));
@@ -1253,26 +1257,26 @@ MACHINE_CONFIG_START(bulletf_state::bulletf)
rs232_port_device &rs232b(RS232_PORT(config, RS232_B_TAG, default_rs232_devices, nullptr));
rs232b.rxd_handler().set(m_dart, FUNC(z80dart_device::rxb_w));
- MCFG_DEVICE_ADD(SCSIBUS_TAG, SCSI_PORT, 0)
- MCFG_SCSI_BSY_HANDLER(WRITELINE("scsi_ctrl_in", input_buffer_device, write_bit3))
- MCFG_SCSI_MSG_HANDLER(WRITELINE("scsi_ctrl_in", input_buffer_device, write_bit4))
- MCFG_SCSI_CD_HANDLER(WRITELINE("scsi_ctrl_in", input_buffer_device, write_bit5))
- MCFG_SCSI_REQ_HANDLER(WRITELINE(*this, bulletf_state, req_w))
- MCFG_SCSI_IO_HANDLER(WRITELINE("scsi_ctrl_in", input_buffer_device, write_bit7))
- MCFG_SCSI_DATA_INPUT_BUFFER("scsi_data_in")
+ SCSI_PORT(config, m_scsibus, 0);
+ m_scsibus->bsy_handler().set(m_scsi_ctrl_in, FUNC(input_buffer_device::write_bit3));
+ m_scsibus->msg_handler().set(m_scsi_ctrl_in, FUNC(input_buffer_device::write_bit4));
+ m_scsibus->cd_handler().set(m_scsi_ctrl_in, FUNC(input_buffer_device::write_bit5));
+ m_scsibus->req_handler().set(FUNC(bulletf_state::req_w));
+ m_scsibus->io_handler().set(m_scsi_ctrl_in, FUNC(input_buffer_device::write_bit7));
+ m_scsibus->set_data_input_buffer(m_scsi_data_in);
+ m_scsibus->set_slot_device(1, "harddisk", SCSIHD, DEVICE_INPUT_DEFAULTS_NAME(SCSI_ID_0));
- MCFG_SCSI_OUTPUT_LATCH_ADD("scsi_data_out", SCSIBUS_TAG)
- MCFG_DEVICE_ADD("scsi_ctrl_in", INPUT_BUFFER, 0)
- MCFG_DEVICE_ADD("scsi_data_in", INPUT_BUFFER, 0)
-
- MCFG_SCSIDEV_ADD(SCSIBUS_TAG ":" SCSI_PORT_DEVICE1, "harddisk", SCSIHD, SCSI_ID_0)
+ OUTPUT_LATCH(config, m_scsi_data_out);
+ m_scsibus->set_output_latch(*m_scsi_data_out);
+ INPUT_BUFFER(config, m_scsi_data_in);
+ INPUT_BUFFER(config, m_scsi_ctrl_in);
// software lists
- MCFG_SOFTWARE_LIST_ADD("flop_list", "wmbullet")
+ SOFTWARE_LIST(config, "flop_list").set_original("wmbullet");
// internal ram
RAM(config, RAM_TAG).set_default_size("128K");
-MACHINE_CONFIG_END
+}
diff --git a/src/mame/drivers/busicom.cpp b/src/mame/drivers/busicom.cpp
index 8ac487f27c4..c12e1a7f9a3 100644
--- a/src/mame/drivers/busicom.cpp
+++ b/src/mame/drivers/busicom.cpp
@@ -224,7 +224,8 @@ void busicom_state::machine_reset()
//static const char layout_busicom [] = "busicom";
-MACHINE_CONFIG_START(busicom_state::busicom)
+void busicom_state::busicom(machine_config &config)
+{
/* basic machine hardware */
I4004(config, m_maincpu, 750000);
m_maincpu->set_rom_map(&busicom_state::busicom_rom);
@@ -234,18 +235,18 @@ MACHINE_CONFIG_START(busicom_state::busicom)
m_maincpu->set_ram_ports_map(&busicom_state::busicom_mp);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(50)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */
- MCFG_SCREEN_SIZE(40*17, 44*11)
- MCFG_SCREEN_VISIBLE_AREA(0, 40*17-1, 0, 44*11-1)
- MCFG_SCREEN_UPDATE_DRIVER(busicom_state, screen_update_busicom)
- MCFG_SCREEN_PALETTE(m_palette)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(50);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */
+ screen.set_size(40*17, 44*11);
+ screen.set_visarea_full();
+ screen.set_screen_update(FUNC(busicom_state::screen_update_busicom));
+ screen.set_palette(m_palette);
PALETTE(config, m_palette, FUNC(busicom_state::busicom_palette), 16);
- MCFG_TIMER_DRIVER_ADD_PERIODIC("busicom_timer", busicom_state, timer_callback, attotime::from_msec(28*2))
-MACHINE_CONFIG_END
+ TIMER(config, "busicom_timer").configure_periodic(FUNC(busicom_state::timer_callback), attotime::from_msec(28*2));
+}
/* ROM definition */
ROM_START( busicom )
diff --git a/src/mame/drivers/buster.cpp b/src/mame/drivers/buster.cpp
index b2777b70680..c207b414280 100644
--- a/src/mame/drivers/buster.cpp
+++ b/src/mame/drivers/buster.cpp
@@ -322,34 +322,35 @@ static GFXDECODE_START( gfx_buster )
GFXDECODE_END
-MACHINE_CONFIG_START(buster_state::buster)
+void buster_state::buster(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80,XTAL(3'579'545)) /* ? MHz */
- MCFG_DEVICE_PROGRAM_MAP(mainmap)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", buster_state, irq0_line_hold)
+ Z80(config, m_maincpu, XTAL(3'579'545)); /* ? MHz */
+ m_maincpu->set_addrmap(AS_PROGRAM, &buster_state::mainmap);
+ m_maincpu->set_vblank_int("screen", FUNC(buster_state::irq0_line_hold));
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(256, 256)
- MCFG_SCREEN_VISIBLE_AREA(0, 256-1, 16, 256-16-1)
- MCFG_SCREEN_UPDATE_DRIVER(buster_state, screen_update_buster)
- MCFG_SCREEN_PALETTE(m_palette)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(256, 256);
+ screen.set_visarea(0, 256-1, 16, 256-16-1);
+ screen.set_screen_update(FUNC(buster_state::screen_update_buster));
+ screen.set_palette(m_palette);
mc6845_device &crtc(MC6845(config, "crtc", XTAL(3'579'545)/4)); //unknown clock / type
crtc.set_screen("screen");
crtc.set_show_border_area(false);
crtc.set_char_width(8);
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_buster)
+ GFXDECODE(config, m_gfxdecode, m_palette, gfx_buster);
PALETTE(config, m_palette, palette_device::RGB_3BIT);
SPEAKER(config, "mono").front_center();
AY8910(config, "aysnd", 1500000/2).add_route(ALL_OUTPUTS, "mono", 0.25);
-MACHINE_CONFIG_END
+}
ROM_START( buster )
diff --git a/src/mame/drivers/bw12.cpp b/src/mame/drivers/bw12.cpp
index cd9f2ba1423..ddee36e8bfe 100644
--- a/src/mame/drivers/bw12.cpp
+++ b/src/mame/drivers/bw12.cpp
@@ -549,21 +549,22 @@ GFXDECODE_END
/* Machine Driver */
-MACHINE_CONFIG_START(bw12_state::common)
+void bw12_state::common(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD(Z80_TAG, Z80, XTAL(16'000'000)/4)
- MCFG_DEVICE_PROGRAM_MAP(bw12_mem)
- MCFG_DEVICE_IO_MAP(bw12_io)
+ Z80(config, m_maincpu, XTAL(16'000'000)/4);
+ m_maincpu->set_addrmap(AS_PROGRAM, &bw12_state::bw12_mem);
+ m_maincpu->set_addrmap(AS_IO, &bw12_state::bw12_io);
/* video hardware */
- MCFG_SCREEN_ADD_MONOCHROME(SCREEN_TAG, RASTER, rgb_t::amber())
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */
- MCFG_SCREEN_UPDATE_DEVICE(MC6845_TAG, mc6845_device, screen_update)
- MCFG_SCREEN_SIZE(640, 200)
- MCFG_SCREEN_VISIBLE_AREA(0, 640-1, 0, 200-1)
-
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_bw12)
+ screen_device &screen(SCREEN(config, SCREEN_TAG, SCREEN_TYPE_RASTER, rgb_t::amber()));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */
+ screen.set_screen_update(MC6845_TAG, FUNC(mc6845_device::screen_update));
+ screen.set_size(640, 200);
+ screen.set_visarea(0, 640-1, 0, 200-1);
+
+ GFXDECODE(config, "gfxdecode", m_palette, gfx_bw12);
PALETTE(config, m_palette, palette_device::MONOCHROME);
MC6845(config, m_crtc, XTAL(16'000'000)/8);
@@ -574,12 +575,13 @@ MACHINE_CONFIG_START(bw12_state::common)
/* sound hardware */
SPEAKER(config, "speaker").front_center();
- MCFG_DEVICE_ADD("dac", MC1408, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 0.125) // ls273.ic5 + mc1408.ic4
- MCFG_DEVICE_ADD("vref", VOLTAGE_REGULATOR, 0) MCFG_VOLTAGE_REGULATOR_OUTPUT(5.0)
- MCFG_SOUND_ROUTE(0, "dac", 1.0, DAC_VREF_POS_INPUT) MCFG_SOUND_ROUTE(0, "dac", -1.0, DAC_VREF_NEG_INPUT)
+ MC1408(config, "dac", 0).add_route(ALL_OUTPUTS, "speaker", 0.125); // ls273.ic5 + mc1408.ic4
+ voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref"));
+ vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT);
+ vref.add_route(0, "dac", -1.0, DAC_VREF_NEG_INPUT);
/* devices */
- MCFG_TIMER_DRIVER_ADD(FLOPPY_TIMER_TAG, bw12_state, floppy_motor_off_tick)
+ TIMER(config, FLOPPY_TIMER_TAG).configure_generic(FUNC(bw12_state::floppy_motor_off_tick));
UPD765A(config, m_fdc, 8'000'000, false, true);
PIA6821(config, m_pia, 0);
@@ -632,40 +634,43 @@ MACHINE_CONFIG_START(bw12_state::common)
rs232b.cts_handler().set(m_sio, FUNC(z80dart_device::ctsb_w));
/* printer */
- MCFG_DEVICE_ADD(CENTRONICS_TAG, CENTRONICS, centronics_devices, "printer")
- MCFG_CENTRONICS_ACK_HANDLER(WRITELINE(PIA6821_TAG, pia6821_device, ca1_w))
- MCFG_CENTRONICS_BUSY_HANDLER(WRITELINE(*this, bw12_state, write_centronics_busy))
- MCFG_CENTRONICS_FAULT_HANDLER(WRITELINE(*this, bw12_state, write_centronics_fault))
- MCFG_CENTRONICS_PERROR_HANDLER(WRITELINE(*this, bw12_state, write_centronics_perror))
-
- MCFG_CENTRONICS_OUTPUT_LATCH_ADD("cent_data_out", CENTRONICS_TAG)
-MACHINE_CONFIG_END
+ CENTRONICS(config, m_centronics, centronics_devices, "printer");
+ m_centronics->ack_handler().set(m_pia, FUNC(pia6821_device::ca1_w));
+ m_centronics->busy_handler().set(FUNC(bw12_state::write_centronics_busy));
+ m_centronics->fault_handler().set(FUNC(bw12_state::write_centronics_fault));
+ m_centronics->perror_handler().set(FUNC(bw12_state::write_centronics_perror));
+
+ output_latch_device &cent_data_out(OUTPUT_LATCH(config, "cent_data_out"));
+ m_centronics->set_output_latch(cent_data_out);
+}
-MACHINE_CONFIG_START(bw12_state::bw12)
+void bw12_state::bw12(machine_config &config)
+{
common(config);
/* floppy drives */
- MCFG_FLOPPY_DRIVE_ADD(UPD765_TAG ":1", bw12_floppies, "525dd", bw12_state::bw12_floppy_formats)
- MCFG_FLOPPY_DRIVE_ADD(UPD765_TAG ":2", bw12_floppies, "525dd", bw12_state::bw12_floppy_formats)
+ FLOPPY_CONNECTOR(config, UPD765_TAG ":1", bw12_floppies, "525dd", bw12_state::bw12_floppy_formats);
+ FLOPPY_CONNECTOR(config, UPD765_TAG ":2", bw12_floppies, "525dd", bw12_state::bw12_floppy_formats);
// software lists
- MCFG_SOFTWARE_LIST_ADD("flop_list", "bw12")
+ SOFTWARE_LIST(config, "flop_list").set_original("bw12");
/* internal ram */
RAM(config, RAM_TAG).set_default_size("64K");
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(bw12_state::bw14)
+void bw12_state::bw14(machine_config &config)
+{
common(config);
/* floppy drives */
- MCFG_FLOPPY_DRIVE_ADD(UPD765_TAG ":1", bw14_floppies, "525dd", bw12_state::bw14_floppy_formats)
- MCFG_FLOPPY_DRIVE_ADD(UPD765_TAG ":2", bw14_floppies, "525dd", bw12_state::bw14_floppy_formats)
+ FLOPPY_CONNECTOR(config, UPD765_TAG ":1", bw14_floppies, "525dd", bw12_state::bw14_floppy_formats);
+ FLOPPY_CONNECTOR(config, UPD765_TAG ":2", bw14_floppies, "525dd", bw12_state::bw14_floppy_formats);
// software lists
- MCFG_SOFTWARE_LIST_ADD("flop_list", "bw14")
+ SOFTWARE_LIST(config, "flop_list").set_original("bw14");
/* internal ram */
RAM(config, RAM_TAG).set_default_size("128K");
-MACHINE_CONFIG_END
+ }
/* ROMs */
diff --git a/src/mame/drivers/bw2.cpp b/src/mame/drivers/bw2.cpp
index b65590f0f4e..43a624e86c2 100644
--- a/src/mame/drivers/bw2.cpp
+++ b/src/mame/drivers/bw2.cpp
@@ -108,7 +108,7 @@ READ8_MEMBER( bw2_state::read )
data = m_ram->pointer()[offset];
}
- return m_exp->cd_r(space, offset, data, ram2, ram3, ram4, ram5, ram6);
+ return m_exp->cd_r(offset, data, ram2, ram3, ram4, ram5, ram6);
}
@@ -159,7 +159,7 @@ WRITE8_MEMBER( bw2_state::write )
m_ram->pointer()[offset] = data;
}
- m_exp->cd_w(space, offset, data, ram2, ram3, ram4, ram5, ram6);
+ m_exp->cd_w(offset, data, ram2, ram3, ram4, ram5, ram6);
}
@@ -539,22 +539,24 @@ void bw2_state::machine_start()
//**************************************************************************
//-------------------------------------------------
-// MACHINE_CONFIG( bw2 )
+// machine_config( bw2 )
//-------------------------------------------------
-MACHINE_CONFIG_START(bw2_state::bw2)
+void bw2_state::bw2(machine_config &config)
+{
// basic machine hardware
- MCFG_DEVICE_ADD(Z80_TAG, Z80, 16_MHz_XTAL / 4)
- MCFG_DEVICE_PROGRAM_MAP(bw2_mem)
- MCFG_DEVICE_IO_MAP(bw2_io)
+ Z80(config, m_maincpu, 16_MHz_XTAL / 4);
+ m_maincpu->set_addrmap(AS_PROGRAM, &bw2_state::bw2_mem);
+ m_maincpu->set_addrmap(AS_IO, &bw2_state::bw2_io);
// video hardware
- MCFG_SCREEN_ADD(SCREEN_TAG, LCD)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_UPDATE_DEVICE( MSM6255_TAG, msm6255_device, screen_update )
- MCFG_SCREEN_SIZE(640, 200)
- MCFG_SCREEN_VISIBLE_AREA(0, 640-1, 0, 200-1)
- MCFG_SCREEN_PALETTE("palette")
+ screen_device &screen(SCREEN(config, SCREEN_TAG, SCREEN_TYPE_LCD));
+ screen.set_refresh_hz(60);
+ screen.set_screen_update(MSM6255_TAG, FUNC(msm6255_device::screen_update));
+ screen.set_size(640, 200);
+ screen.set_visarea(0, 640-1, 0, 200-1);
+ screen.set_palette("palette");
+
PALETTE(config, "palette", FUNC(bw2_state::bw2_palette), 2);
// devices
@@ -573,14 +575,15 @@ MACHINE_CONFIG_START(bw2_state::bw2)
ppi.in_pc_callback().set(FUNC(bw2_state::ppi_pc_r));
ppi.out_pc_callback().set(FUNC(bw2_state::ppi_pc_w));
- MCFG_DEVICE_ADD(MSM6255_TAG, MSM6255, 16_MHz_XTAL)
- MCFG_DEVICE_ADDRESS_MAP(0, lcdc_map)
- MCFG_VIDEO_SET_SCREEN(SCREEN_TAG)
+ MSM6255(config, m_lcdc, 16_MHz_XTAL);
+ m_lcdc->set_addrmap(0, &bw2_state::lcdc_map);
+ m_lcdc->set_screen(SCREEN_TAG);
- MCFG_DEVICE_ADD(m_centronics, CENTRONICS, centronics_devices, "printer")
- MCFG_CENTRONICS_BUSY_HANDLER(WRITELINE(*this, bw2_state, write_centronics_busy))
+ CENTRONICS(config, m_centronics, centronics_devices, "printer");
+ m_centronics->busy_handler().set(FUNC(bw2_state::write_centronics_busy));
- MCFG_CENTRONICS_OUTPUT_LATCH_ADD("cent_data_out", CENTRONICS_TAG)
+ output_latch_device &latch(OUTPUT_LATCH(config, "cent_data_out"));
+ m_centronics->set_output_latch(latch);
I8251(config, m_uart, 0);
m_uart->txd_handler().set(RS232_TAG, FUNC(rs232_port_device::write_txd));
@@ -595,16 +598,16 @@ MACHINE_CONFIG_START(bw2_state::bw2)
m_fdc->intrq_wr_callback().set_inputline(m_maincpu, INPUT_LINE_IRQ0);
m_fdc->drq_wr_callback().set(FUNC(bw2_state::fdc_drq_w));
- MCFG_FLOPPY_DRIVE_ADD(WD2797_TAG":0", bw2_floppies, "35dd", bw2_state::floppy_formats)
- MCFG_FLOPPY_DRIVE_ADD(WD2797_TAG":1", bw2_floppies, nullptr, bw2_state::floppy_formats)
- MCFG_BW2_EXPANSION_SLOT_ADD(BW2_EXPANSION_SLOT_TAG, 16_MHz_XTAL, bw2_expansion_cards, nullptr)
+ FLOPPY_CONNECTOR(config, WD2797_TAG":0", bw2_floppies, "35dd", bw2_state::floppy_formats);
+ FLOPPY_CONNECTOR(config, WD2797_TAG":1", bw2_floppies, nullptr, bw2_state::floppy_formats);
+ BW2_EXPANSION_SLOT(config, m_exp, 16_MHz_XTAL, bw2_expansion_cards, nullptr);
// software list
- MCFG_SOFTWARE_LIST_ADD("flop_list","bw2")
+ SOFTWARE_LIST(config, "flop_list").set_original("bw2");
// internal ram
RAM(config, RAM_TAG).set_default_size("64K").set_extra_options("96K,128K,160K,192K,224K");
-MACHINE_CONFIG_END
+}
diff --git a/src/mame/drivers/bwidow.cpp b/src/mame/drivers/bwidow.cpp
index 3cb71a0c334..e0879582c50 100644
--- a/src/mame/drivers/bwidow.cpp
+++ b/src/mame/drivers/bwidow.cpp
@@ -763,22 +763,22 @@ INPUT_PORTS_END
*
*************************************/
-MACHINE_CONFIG_START(bwidow_state::bwidow)
-
+void bwidow_state::bwidow(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M6502, MASTER_CLOCK / 8)
- MCFG_DEVICE_PROGRAM_MAP(bwidow_map)
- MCFG_DEVICE_PERIODIC_INT_DRIVER(bwidow_state, irq0_line_assert, CLOCK_3KHZ / 12)
+ M6502(config, m_maincpu, MASTER_CLOCK / 8);
+ m_maincpu->set_addrmap(AS_PROGRAM, &bwidow_state::bwidow_map);
+ m_maincpu->set_periodic_int(FUNC(bwidow_state::irq0_line_assert), attotime::from_hz(CLOCK_3KHZ / 12));
- MCFG_DEVICE_ADD("earom", ER2055)
+ ER2055(config, m_earom);
/* video hardware */
- MCFG_VECTOR_ADD("vector")
- MCFG_SCREEN_ADD("screen", VECTOR)
- MCFG_SCREEN_REFRESH_RATE(CLOCK_3KHZ / 12 / 4)
- MCFG_SCREEN_SIZE(400, 300)
- MCFG_SCREEN_VISIBLE_AREA(0, 480, 0, 440)
- MCFG_SCREEN_UPDATE_DEVICE("vector", vector_device, screen_update)
+ VECTOR(config, "vector", 0);
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_VECTOR));
+ screen.set_refresh_hz(CLOCK_3KHZ / 12 / 4);
+ screen.set_size(400, 300);
+ screen.set_visarea(0, 480, 0, 440);
+ screen.set_screen_update("vector", FUNC(vector_device::screen_update));
avg_device &avg(AVG(config, "avg", 0));
avg.set_vector_tag("vector");
@@ -786,54 +786,52 @@ MACHINE_CONFIG_START(bwidow_state::bwidow)
/* sound hardware */
bwidow_audio(config);
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(bwidow_state::bwidowp)
+void bwidow_state::bwidowp(machine_config &config)
+{
bwidow(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(bwidowp_map)
+ m_maincpu->set_addrmap(AS_PROGRAM, &bwidow_state::bwidowp_map);
WATCHDOG_TIMER(config, "watchdog");
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(bwidow_state::gravitar)
+void bwidow_state::gravitar(machine_config &config)
+{
bwidow(config);
/* basic machine hardware */
/* video hardware */
- MCFG_SCREEN_MODIFY("screen")
- MCFG_SCREEN_VISIBLE_AREA(0, 420, 0, 400)
+ subdevice<screen_device>("screen")->set_visarea(0, 420, 0, 400);
/* sound hardware */
gravitar_audio(config);
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(bwidow_state::lunarbat)
+void bwidow_state::lunarbat(machine_config &config)
+{
gravitar(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(spacduel_map)
+ m_maincpu->set_addrmap(AS_PROGRAM, &bwidow_state::spacduel_map);
/* video hardware */
- MCFG_SCREEN_MODIFY("screen")
- MCFG_SCREEN_VISIBLE_AREA(0, 500, 0, 440)
-MACHINE_CONFIG_END
+ subdevice<screen_device>("screen")->set_visarea(0, 500, 0, 440);
+}
-MACHINE_CONFIG_START(bwidow_state::spacduel)
+void bwidow_state::spacduel(machine_config &config)
+{
gravitar(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(spacduel_map)
+ m_maincpu->set_addrmap(AS_PROGRAM, &bwidow_state::spacduel_map);
/* video hardware */
- MCFG_SCREEN_MODIFY("screen")
- MCFG_SCREEN_VISIBLE_AREA(0, 540, 0, 400)
-MACHINE_CONFIG_END
+ subdevice<screen_device>("screen")->set_visarea(0, 540, 0, 400);
+}
diff --git a/src/mame/drivers/bwing.cpp b/src/mame/drivers/bwing.cpp
index 3ef91ecac5c..48f7c73023c 100644
--- a/src/mame/drivers/bwing.cpp
+++ b/src/mame/drivers/bwing.cpp
@@ -363,36 +363,36 @@ void bwing_state::bwing_postload()
}
-MACHINE_CONFIG_START(bwing_state::bwing)
-
+void bwing_state::bwing(machine_config &config)
+{
// basic machine hardware
- MCFG_DEVICE_ADD("maincpu", MC6809E, 2000000)
- MCFG_DEVICE_PROGRAM_MAP(bwp1_map)
+ MC6809E(config, m_maincpu, 2000000);
+ m_maincpu->set_addrmap(AS_PROGRAM, &bwing_state::bwp1_map);
- MCFG_DEVICE_ADD("sub", MC6809E, 2000000)
- MCFG_DEVICE_PROGRAM_MAP(bwp2_map)
+ MC6809E(config, m_subcpu, 2000000);
+ m_subcpu->set_addrmap(AS_PROGRAM, &bwing_state::bwp2_map);
- MCFG_DEVICE_ADD("audiocpu", DECO16, 2000000)
- MCFG_DEVICE_PROGRAM_MAP(bwp3_map)
- MCFG_DEVICE_IO_MAP(bwp3_io_map)
- MCFG_DEVICE_PERIODIC_INT_DRIVER(bwing_state, bwp3_interrupt, 1000)
+ DECO16(config, m_audiocpu, 2000000);
+ m_audiocpu->set_addrmap(AS_PROGRAM, &bwing_state::bwp3_map);
+ m_audiocpu->set_addrmap(AS_IO, &bwing_state::bwp3_io_map);
+ m_audiocpu->set_periodic_int(FUNC(bwing_state::bwp3_interrupt), attotime::from_hz(1000));
- MCFG_QUANTUM_TIME(attotime::from_hz(18000)) // high enough?
+ config.m_minimum_quantum = attotime::from_hz(18000); // high enough?
ADDRESS_MAP_BANK(config, "vrambank").set_map(&bwing_state::bank_map).set_options(ENDIANNESS_BIG, 8, 15, 0x2000);
// video hardware
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_VIDEO_ATTRIBUTES(VIDEO_UPDATE_BEFORE_VBLANK)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(600)) // must be long enough for polling
- MCFG_SCREEN_SIZE(32*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 1*8, 31*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(bwing_state, screen_update)
- MCFG_SCREEN_PALETTE("palette")
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_video_attributes(VIDEO_UPDATE_BEFORE_VBLANK);
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(600)); // must be long enough for polling
+ screen.set_size(32*8, 32*8);
+ screen.set_visarea(0*8, 32*8-1, 1*8, 31*8-1);
+ screen.set_screen_update(FUNC(bwing_state::screen_update));
+ screen.set_palette(m_palette);
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_bwing)
- MCFG_PALETTE_ADD("palette", 64)
+ GFXDECODE(config, m_gfxdecode, m_palette, gfx_bwing);
+ PALETTE(config, m_palette).set_entries(64);
// sound hardware
@@ -404,10 +404,11 @@ MACHINE_CONFIG_START(bwing_state::bwing)
AY8912(config, "ay2", XTAL(24'000'000) / 2 / 8).add_route(ALL_OUTPUTS, "speaker", 0.5);
- MCFG_DEVICE_ADD("dac", DAC08, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 0.1)
- MCFG_DEVICE_ADD("vref", VOLTAGE_REGULATOR, 0) MCFG_VOLTAGE_REGULATOR_OUTPUT(5.0)
- MCFG_SOUND_ROUTE(0, "dac", 1.0, DAC_VREF_POS_INPUT) MCFG_SOUND_ROUTE(0, "dac", -1.0, DAC_VREF_NEG_INPUT)
-MACHINE_CONFIG_END
+ DAC08(config, "dac", 0).add_route(ALL_OUTPUTS, "speaker", 0.1);
+ voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref"));
+ vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT);
+ vref.add_route(0, "dac", -1.0, DAC_VREF_NEG_INPUT);
+}
//****************************************************************************
// ROM Maps
diff --git a/src/mame/drivers/by17.cpp b/src/mame/drivers/by17.cpp
index 903a49048f2..4c3b1f4c25f 100644
--- a/src/mame/drivers/by17.cpp
+++ b/src/mame/drivers/by17.cpp
@@ -837,7 +837,7 @@ TIMER_DEVICE_CALLBACK_MEMBER( by17_state::u11_timer )
-+ +---+
*/
- m_display_refresh_timer->adjust(attotime::from_msec(2.85));
+ m_display_refresh_timer->adjust(attotime::from_usec(2850));
m_u11_ca1 = true;
m_pia_u11->ca1_w(m_u11_ca1);
@@ -993,10 +993,11 @@ void by17_state::machine_reset()
-MACHINE_CONFIG_START(by17_state::by17)
+void by17_state::by17(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M6800, 530000) // No xtal, just 2 chips forming a multivibrator oscillator around 530KHz
- MCFG_DEVICE_PROGRAM_MAP(by17_map)
+ M6800(config, m_maincpu, 530000); // No xtal, just 2 chips forming a multivibrator oscillator around 530KHz
+ m_maincpu->set_addrmap(AS_PROGRAM, &by17_state::by17_map);
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0); // 'F' filled causes Credit Display to be blank on first startup
@@ -1018,8 +1019,8 @@ MACHINE_CONFIG_START(by17_state::by17)
m_pia_u10->cb2_handler().set(FUNC(by17_state::u10_cb2_w));
m_pia_u10->irqa_handler().set_inputline("maincpu", M6800_IRQ_LINE);
m_pia_u10->irqb_handler().set_inputline("maincpu", M6800_IRQ_LINE);
- MCFG_TIMER_DRIVER_ADD_PERIODIC("timer_z_freq", by17_state, timer_z_freq, attotime::from_hz(100)) // Mains Line Frequency * 2
- MCFG_TIMER_DRIVER_ADD(m_zero_crossing_active_timer, by17_state, timer_z_pulse) // Active pulse length from Zero Crossing detector
+ TIMER(config, "timer_z_freq").configure_periodic(FUNC(by17_state::timer_z_freq), attotime::from_hz(100)); // Mains Line Frequency * 2
+ TIMER(config, m_zero_crossing_active_timer).configure_generic(FUNC(by17_state::timer_z_pulse)); // Active pulse length from Zero Crossing detector
PIA6821(config, m_pia_u11, 0);
m_pia_u11->readpa_handler().set(FUNC(by17_state::u11_a_r));
@@ -1031,9 +1032,9 @@ MACHINE_CONFIG_START(by17_state::by17)
m_pia_u11->cb2_handler().set(FUNC(by17_state::u11_cb2_w));
m_pia_u11->irqa_handler().set_inputline("maincpu", M6800_IRQ_LINE);
m_pia_u11->irqb_handler().set_inputline("maincpu", M6800_IRQ_LINE);
- MCFG_TIMER_DRIVER_ADD_PERIODIC("timer_d_freq", by17_state, u11_timer, attotime::from_hz(317)) // 555 timer
- MCFG_TIMER_DRIVER_ADD(m_display_refresh_timer, by17_state, timer_d_pulse) // 555 Active pulse length
-MACHINE_CONFIG_END
+ TIMER(config, "timer_d_freq").configure_periodic(FUNC(by17_state::u11_timer), attotime::from_hz(317)); // 555 timer
+ TIMER(config, m_display_refresh_timer).configure_generic(FUNC(by17_state::timer_d_pulse)); // 555 Active pulse length
+}
diff --git a/src/mame/drivers/by35.cpp b/src/mame/drivers/by35.cpp
index 90a62545b98..88e703ca13a 100644
--- a/src/mame/drivers/by35.cpp
+++ b/src/mame/drivers/by35.cpp
@@ -898,7 +898,7 @@ TIMER_DEVICE_CALLBACK_MEMBER( by35_state::u11_timer )
-+ +---+
*/
- m_display_refresh_timer->adjust(attotime::from_msec(2.85));
+ m_display_refresh_timer->adjust(attotime::from_usec(2850));
m_u11_ca1 = true;
m_pia_u11->ca1_w(m_u11_ca1);
@@ -1092,10 +1092,11 @@ DISCRETE_SOUND_END
-MACHINE_CONFIG_START(by35_state::by35)
+void by35_state::by35(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M6800, 530000) // No xtal, just 2 chips forming a multivibrator oscillator around 530KHz
- MCFG_DEVICE_PROGRAM_MAP(by35_map)
+ M6800(config, m_maincpu, 530000); // No xtal, just 2 chips forming a multivibrator oscillator around 530KHz
+ m_maincpu->set_addrmap(AS_PROGRAM, &by35_state::by35_map);
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0); // 'F' filled causes Credit Display to be blank on first startup
@@ -1117,8 +1118,8 @@ MACHINE_CONFIG_START(by35_state::by35)
m_pia_u10->cb2_handler().set(FUNC(by35_state::u10_cb2_w));
m_pia_u10->irqa_handler().set_inputline("maincpu", M6800_IRQ_LINE);
m_pia_u10->irqb_handler().set_inputline("maincpu", M6800_IRQ_LINE);
- MCFG_TIMER_DRIVER_ADD_PERIODIC("timer_z_freq", by35_state, timer_z_freq, attotime::from_hz(100)) // Mains Line Frequency * 2
- MCFG_TIMER_DRIVER_ADD(m_zero_crossing_active_timer, by35_state, timer_z_pulse) // Active pulse length from Zero Crossing detector
+ TIMER(config, "timer_z_freq").configure_periodic(FUNC(by35_state::timer_z_freq), attotime::from_hz(100)); // Mains Line Frequency * 2
+ TIMER(config, m_zero_crossing_active_timer).configure_generic(FUNC(by35_state::timer_z_pulse)); // Active pulse length from Zero Crossing detector
PIA6821(config, m_pia_u11, 0);
m_pia_u11->readpa_handler().set(FUNC(by35_state::u11_a_r));
@@ -1130,36 +1131,37 @@ MACHINE_CONFIG_START(by35_state::by35)
m_pia_u11->cb2_handler().set(FUNC(by35_state::u11_cb2_w));
m_pia_u11->irqa_handler().set_inputline("maincpu", M6800_IRQ_LINE);
m_pia_u11->irqb_handler().set_inputline("maincpu", M6800_IRQ_LINE);
- MCFG_TIMER_DRIVER_ADD_PERIODIC("timer_d_freq", by35_state, u11_timer, attotime::from_hz(317)) // 555 timer
- MCFG_TIMER_DRIVER_ADD(m_display_refresh_timer, by35_state, timer_d_pulse) // 555 Active pulse length
-MACHINE_CONFIG_END
+ TIMER(config, "timer_d_freq").configure_periodic(FUNC(by35_state::u11_timer), attotime::from_hz(317)); // 555 timer
+ TIMER(config, m_display_refresh_timer).configure_generic(FUNC(by35_state::timer_d_pulse)); // 555 Active pulse length
+}
-MACHINE_CONFIG_START(as2888_state::as2888_audio)
+void as2888_state::as2888_audio(machine_config &config)
+{
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("discrete", DISCRETE, as2888_discrete)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.00)
+ DISCRETE(config, m_discrete, as2888_discrete).add_route(ALL_OUTPUTS, "mono", 1.00);
m_pia_u11->writepb_handler().set(FUNC(as2888_state::u11_b_as2888_w));
m_pia_u11->cb2_handler().set(FUNC(as2888_state::u11_cb2_as2888_w));
- MCFG_TIMER_DRIVER_ADD_PERIODIC("timer_s_freq", as2888_state, timer_s, attotime::from_hz(353000)) // Inverter clock on AS-2888 sound board
- MCFG_TIMER_DRIVER_ADD(m_snd_sustain_timer, as2888_state, timer_as2888)
-MACHINE_CONFIG_END
+ TIMER(config, "timer_s_freq").configure_periodic(FUNC(as2888_state::timer_s), attotime::from_hz(353000)); // Inverter clock on AS-2888 sound board
+ TIMER(config, m_snd_sustain_timer).configure_generic(FUNC(as2888_state::timer_as2888));
+}
-MACHINE_CONFIG_START(as2888_state::as2888)
+void as2888_state::as2888(machine_config &config)
+{
by35(config);
as2888_audio(config);
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(by35_state::nuovo)
+void by35_state::nuovo(machine_config &config)
+{
by35(config);
- MCFG_DEVICE_REPLACE("maincpu", M6802, 2000000) // ? MHz ? Large crystal next to CPU, schematics don't indicate speed.
- MCFG_DEVICE_PROGRAM_MAP(nuovo_map)
-
-MACHINE_CONFIG_END
+ M6802(config.replace(), m_maincpu, 2000000); // ? MHz ? Large crystal next to CPU, schematics don't indicate speed.
+ m_maincpu->set_addrmap(AS_PROGRAM, &by35_state::nuovo_map);
+}
diff --git a/src/mame/drivers/by6803.cpp b/src/mame/drivers/by6803.cpp
index 0ff8dfa170b..d5ca10888f6 100644
--- a/src/mame/drivers/by6803.cpp
+++ b/src/mame/drivers/by6803.cpp
@@ -375,7 +375,8 @@ TIMER_DEVICE_CALLBACK_MEMBER( by6803_state::pia0_timer )
m_pia0->cb1_w(m_pia0_timer);
}
-MACHINE_CONFIG_START(by6803_state::by6803)
+void by6803_state::by6803(machine_config &config)
+{
/* basic machine hardware */
M6803(config, m_maincpu, XTAL(3'579'545));
m_maincpu->set_addrmap(AS_PROGRAM, &by6803_state::by6803_map);
@@ -402,7 +403,7 @@ MACHINE_CONFIG_START(by6803_state::by6803)
m_pia0->cb2_handler().set(FUNC(by6803_state::pia0_cb2_w));
m_pia0->irqa_handler().set_inputline("maincpu", M6803_IRQ_LINE);
m_pia0->irqb_handler().set_inputline("maincpu", M6803_IRQ_LINE);
- MCFG_TIMER_DRIVER_ADD_PERIODIC("timer_z", by6803_state, pia0_timer, attotime::from_hz(120)) // mains freq*2
+ TIMER(config, "timer_z").configure_periodic(FUNC(by6803_state::pia0_timer), attotime::from_hz(120)); // mains freq*2
PIA6821(config, m_pia1, 0);
m_pia1->readpa_handler().set(FUNC(by6803_state::pia1_a_r));
@@ -410,10 +411,9 @@ MACHINE_CONFIG_START(by6803_state::by6803)
m_pia1->writepb_handler().set(FUNC(by6803_state::pia1_b_w));
m_pia1->cb2_handler().set(FUNC(by6803_state::pia1_cb2_w));
- //MCFG_SPEAKER_STANDARD_MONO("speaker")
- //MCFG_DEVICE_ADD("tcs", MIDWAY_TURBO_CHEAP_SQUEAK) // Cheap Squeak Turbo
- //MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 1.0)
-MACHINE_CONFIG_END
+ //SPEAKER(config, "mono").front_center();
+ //MIDWAY_TURBO_CHEAP_SQUEAK(config, "tcs").add_route(ALL_OUTPUTS, "speaker", 1.0); // Cheap Squeak Turbo
+}
/*-----------------------------------------------------------
diff --git a/src/mame/drivers/by68701.cpp b/src/mame/drivers/by68701.cpp
index 4f341501499..9a95b171784 100644
--- a/src/mame/drivers/by68701.cpp
+++ b/src/mame/drivers/by68701.cpp
@@ -46,11 +46,12 @@ void by68701_state::init_by68701()
{
}
-MACHINE_CONFIG_START(by68701_state::by68701)
+void by68701_state::by68701(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M6803, 3579545/4)
- MCFG_DEVICE_PROGRAM_MAP(by68701_map)
-MACHINE_CONFIG_END
+ M6803(config, m_maincpu, 3579545/4);
+ m_maincpu->set_addrmap(AS_PROGRAM, &by68701_state::by68701_map);
+}
/*------------------
/ Flash Gordon
diff --git a/src/mame/drivers/byvid.cpp b/src/mame/drivers/byvid.cpp
index 7799837e073..89b3216dca3 100644
--- a/src/mame/drivers/byvid.cpp
+++ b/src/mame/drivers/byvid.cpp
@@ -166,8 +166,7 @@ void by133_state::video_map(address_map &map)
{ // U8 Vidiot
map(0x0000, 0x1fff).rw(FUNC(by133_state::sound_data_r), FUNC(by133_state::sound_data_w));
map(0x2000, 0x2003).mirror(0x0ffc).rw(m_pia_u7, FUNC(pia6821_device::read), FUNC(pia6821_device::write)); // PIA U7 Vidiot
- map(0x4000, 0x4000).mirror(0x0ffe).rw(m_crtc, FUNC(tms9928a_device::vram_r), FUNC(tms9928a_device::vram_w));
- map(0x4001, 0x4001).mirror(0x0ffe).rw(m_crtc, FUNC(tms9928a_device::register_r), FUNC(tms9928a_device::register_w));
+ map(0x4000, 0x4001).mirror(0x0ffe).rw(m_crtc, FUNC(tms9928a_device::read), FUNC(tms9928a_device::write));
map(0x6000, 0x63ff).mirror(0x1c00).ram();
map(0x8000, 0xffff).rom();
}
@@ -175,10 +174,8 @@ void by133_state::video_map(address_map &map)
void by133_state::granny_map(address_map &map)
{
map(0x0000, 0x0001).rw(FUNC(by133_state::sound_data_r), FUNC(by133_state::sound_data_w));
- map(0x0002, 0x0002).rw(m_crtc, FUNC(tms9928a_device::vram_r), FUNC(tms9928a_device::vram_w));
- map(0x0003, 0x0003).rw(m_crtc, FUNC(tms9928a_device::register_r), FUNC(tms9928a_device::register_w));
- map(0x0004, 0x0004).rw(m_crtc2, FUNC(tms9928a_device::vram_r), FUNC(tms9928a_device::vram_w));
- map(0x0005, 0x0005).rw(m_crtc2, FUNC(tms9928a_device::register_r), FUNC(tms9928a_device::register_w));
+ map(0x0002, 0x0003).rw(m_crtc, FUNC(tms9928a_device::read), FUNC(tms9928a_device::write));
+ map(0x0004, 0x0005).rw(m_crtc2, FUNC(tms9928a_device::read), FUNC(tms9928a_device::write));
map(0x0006, 0x0007).w(FUNC(by133_state::granny_crtc_w)); // can write to both at once
map(0x0008, 0x000b).rw(m_pia_u7, FUNC(pia6821_device::read), FUNC(pia6821_device::write));
map(0x2000, 0x27ff).ram();
@@ -536,16 +533,8 @@ INPUT_PORTS_END
WRITE8_MEMBER( by133_state::granny_crtc_w )
{
- if (offset)
- {
- m_crtc->register_write(data);
- m_crtc2->register_write(data);
- }
- else
- {
- m_crtc->vram_write(data);
- m_crtc2->vram_write(data);
- }
+ m_crtc->write(offset, data);
+ m_crtc2->write(offset, data);
}
READ8_MEMBER( by133_state::sound_data_r )
@@ -746,13 +735,14 @@ uint32_t by133_state::screen_update_granny(screen_device &screen, bitmap_rgb32 &
return 0;
}
-MACHINE_CONFIG_START(by133_state::babypac)
+void by133_state::babypac(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M6800, XTAL(3'579'545)/4) // no xtal, just 2 chips
- MCFG_DEVICE_PROGRAM_MAP(main_map)
+ M6800(config, m_maincpu, XTAL(3'579'545)/4); // no xtal, just 2 chips
+ m_maincpu->set_addrmap(AS_PROGRAM, &by133_state::main_map);
- MCFG_DEVICE_ADD("videocpu", MC6809, XTAL(3'579'545))
- MCFG_DEVICE_PROGRAM_MAP(video_map)
+ MC6809(config, m_videocpu, XTAL(3'579'545));
+ m_videocpu->set_addrmap(AS_PROGRAM, &by133_state::video_map);
M6803(config, m_audiocpu, XTAL(3'579'545));
m_audiocpu->set_addrmap(AS_PROGRAM, &by133_state::sound_map);
@@ -781,7 +771,7 @@ MACHINE_CONFIG_START(by133_state::babypac)
m_pia_u10->cb2_handler().set(FUNC(by133_state::u10_cb2_w));
m_pia_u10->irqa_handler().set_inputline("maincpu", M6800_IRQ_LINE);
m_pia_u10->irqb_handler().set_inputline("maincpu", M6800_IRQ_LINE);
- MCFG_TIMER_DRIVER_ADD_PERIODIC("babypac1", by133_state, u10_timer, attotime::from_hz(120)) // mains freq*2
+ TIMER(config, "babypac1").configure_periodic(FUNC(by133_state::u10_timer), attotime::from_hz(120)); // mains freq*2
PIA6821(config, m_pia_u11, 0);
m_pia_u11->readpa_handler().set(FUNC(by133_state::u11_a_r));
@@ -792,7 +782,7 @@ MACHINE_CONFIG_START(by133_state::babypac)
m_pia_u11->cb2_handler().set(FUNC(by133_state::u11_cb2_w));
m_pia_u11->irqa_handler().set_inputline("maincpu", M6800_IRQ_LINE);
m_pia_u11->irqb_handler().set_inputline("maincpu", M6800_IRQ_LINE);
- MCFG_TIMER_DRIVER_ADD_PERIODIC("babypac2", by133_state, u11_timer, attotime::from_hz(634)) // 555 timer*2
+ TIMER(config, "babypac2").configure_periodic(FUNC(by133_state::u11_timer), attotime::from_hz(634)); // 555 timer*2
/* video hardware */
TMS9928A(config, m_crtc, XTAL(10'738'635)).set_screen("screen");
@@ -802,28 +792,28 @@ MACHINE_CONFIG_START(by133_state::babypac)
/* sound hardware */
SPEAKER(config, "speaker").front_center();
- MCFG_DEVICE_ADD("dac", ZN429E, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 0.25) // U32 (Vidiot) or U6 (Cheap Squeak)
- MCFG_DEVICE_ADD("vref", VOLTAGE_REGULATOR, 0) MCFG_VOLTAGE_REGULATOR_OUTPUT(5.0)
- MCFG_SOUND_ROUTE(0, "dac", 1.0, DAC_VREF_POS_INPUT) MCFG_SOUND_ROUTE(0, "dac", -1.0, DAC_VREF_NEG_INPUT)
+ ZN429E(config, "dac", 0).add_route(ALL_OUTPUTS, "speaker", 0.25); // U32 (Vidiot) or U6 (Cheap Squeak)
+ voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref"));
+ vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT);
+ vref.add_route(0, "dac", -1.0, DAC_VREF_NEG_INPUT);
SPEAKER(config, "beee").front_center();
- MCFG_DEVICE_ADD("beeper", BEEP, 600)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "beee", 0.10)
-MACHINE_CONFIG_END
+ BEEP(config, m_beep, 600).add_route(ALL_OUTPUTS, "beee", 0.10);
+}
-MACHINE_CONFIG_START(by133_state::granny)
+void by133_state::granny(machine_config &config)
+{
babypac(config);
- MCFG_DEVICE_REMOVE("videocpu")
- MCFG_DEVICE_ADD("videocpu", MC6809, XTAL(8'000'000)) // MC68B09P (XTAL value hard to read)
- MCFG_DEVICE_PROGRAM_MAP(granny_map)
+
+ MC6809(config.replace(), m_videocpu, XTAL(8'000'000)); // MC68B09P (XTAL value hard to read)
+ m_videocpu->set_addrmap(AS_PROGRAM, &by133_state::granny_map);
TMS9928A(config, m_crtc2, XTAL(10'738'635)).set_screen("screen");
m_crtc2->set_vram_size(0x4000);
m_crtc2->int_callback().set_inputline(m_videocpu, M6809_IRQ_LINE);
- MCFG_DEVICE_MODIFY("screen")
- MCFG_SCREEN_UPDATE_DRIVER(by133_state, screen_update_granny)
-MACHINE_CONFIG_END
+ subdevice<screen_device>("screen")->set_screen_update(FUNC(by133_state::screen_update_granny));
+}
/*-----------------------------------------------------
diff --git a/src/mame/drivers/c10.cpp b/src/mame/drivers/c10.cpp
index c47ca0e0d43..59462dfbea2 100644
--- a/src/mame/drivers/c10.cpp
+++ b/src/mame/drivers/c10.cpp
@@ -159,23 +159,24 @@ static GFXDECODE_START( gfx_c10 )
GFXDECODE_END
-MACHINE_CONFIG_START(c10_state::c10)
+void c10_state::c10(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, XTAL(8'000'000) / 2)
- MCFG_DEVICE_PROGRAM_MAP(c10_mem)
- MCFG_DEVICE_IO_MAP(c10_io)
+ Z80(config, m_maincpu, XTAL(8'000'000) / 2);
+ m_maincpu->set_addrmap(AS_PROGRAM, &c10_state::c10_mem);
+ m_maincpu->set_addrmap(AS_IO, &c10_state::c10_io);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */
- MCFG_SCREEN_UPDATE_DRIVER(c10_state, screen_update)
- MCFG_SCREEN_SIZE(640, 250)
- MCFG_SCREEN_VISIBLE_AREA(0, 639, 0, 249)
- MCFG_SCREEN_PALETTE("palette")
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_c10)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */
+ screen.set_screen_update(FUNC(c10_state::screen_update));
+ screen.set_size(640, 250);
+ screen.set_visarea_full();
+ screen.set_palette("palette");
+ GFXDECODE(config, "gfxdecode", "palette", gfx_c10);
PALETTE(config, "palette", palette_device::MONOCHROME);
-MACHINE_CONFIG_END
+}
void c10_state::init_c10()
{
diff --git a/src/mame/drivers/c128.cpp b/src/mame/drivers/c128.cpp
index 2b406c91097..9e5c25375b1 100644
--- a/src/mame/drivers/c128.cpp
+++ b/src/mame/drivers/c128.cpp
@@ -131,8 +131,8 @@ public:
inline void check_interrupts();
int read_pla(offs_t offset, offs_t ca, offs_t vma, int ba, int rw, int aec, int z80io, int ms3, int ms2, int ms1, int ms0);
- uint8_t read_memory(address_space &space, offs_t offset, offs_t vma, int ba, int aec, int z80io);
- void write_memory(address_space &space, offs_t offset, offs_t vma, uint8_t data, int ba, int aec, int z80io);
+ uint8_t read_memory(offs_t offset, offs_t vma, int ba, int aec, int z80io);
+ void write_memory(offs_t offset, offs_t vma, uint8_t data, int ba, int aec, int z80io);
inline void update_iec();
DECLARE_READ8_MEMBER( z80_r );
@@ -335,7 +335,7 @@ int c128_state::read_pla(offs_t offset, offs_t ca, offs_t vma, int ba, int rw, i
// read_memory -
//-------------------------------------------------
-uint8_t c128_state::read_memory(address_space &space, offs_t offset, offs_t vma, int ba, int aec, int z80io)
+uint8_t c128_state::read_memory(offs_t offset, offs_t vma, int ba, int aec, int z80io)
{
int rw = 1, ms0 = 1, ms1 = 1, ms2 = 1, ms3 = 1, cas0 = 1, cas1 = 1;
int io1 = 1, io2 = 1;
@@ -406,37 +406,37 @@ uint8_t c128_state::read_memory(address_space &space, offs_t offset, offs_t vma,
}
if (!BIT(plaout, PLA_OUT_VIC))
{
- data = m_vic->read(space, offset & 0x3f);
+ data = m_vic->read(offset & 0x3f);
}
if (!BIT(plaout, PLA_OUT_FROM1) && m_from->exists())
{
- data = m_from->read_rom(space, offset & 0x7fff);
+ data = m_from->read_rom(offset & 0x7fff);
}
if (!BIT(plaout, PLA_OUT_IOCS) && BIT(offset, 10))
{
switch ((BIT(offset, 11) << 2) | ((offset >> 8) & 0x03))
{
case 0: // SID
- data = m_sid->read(space, offset & 0x1f);
+ data = m_sid->read(offset & 0x1f);
break;
case 2: // CS8563
if (BIT(offset, 0))
{
- data = m_vdc->register_r(space, 0);
+ data = m_vdc->register_r();
}
else
{
- data = m_vdc->status_r(space, 0);
+ data = m_vdc->status_r();
}
break;
case 4: // CIA1
- data = m_cia1->read(space, offset & 0x0f);
+ data = m_cia1->read(offset & 0x0f);
break;
case 5: // CIA2
- data = m_cia2->read(space, offset & 0x0f);
+ data = m_cia2->read(offset & 0x0f);
break;
case 6: // I/O1
@@ -452,7 +452,7 @@ uint8_t c128_state::read_memory(address_space &space, offs_t offset, offs_t vma,
int roml = BIT(plaout, PLA_OUT_ROML);
int romh = BIT(plaout, PLA_OUT_ROMH);
- data = m_exp->cd_r(space, ca, data, sphi2, ba, roml, romh, io1, io2);
+ data = m_exp->cd_r(ca, data, sphi2, ba, roml, romh, io1, io2);
return m_mmu->read(offset, data);
}
@@ -462,7 +462,7 @@ uint8_t c128_state::read_memory(address_space &space, offs_t offset, offs_t vma,
// write_memory -
//-------------------------------------------------
-void c128_state::write_memory(address_space &space, offs_t offset, offs_t vma, uint8_t data, int ba, int aec, int z80io)
+void c128_state::write_memory(offs_t offset, offs_t vma, uint8_t data, int ba, int aec, int z80io)
{
int rw = 0, ms0 = 1, ms1 = 1, ms2 = 1, ms3 = 1, cas0 = 1, cas1 = 1;
int io1 = 1, io2 = 1;
@@ -494,33 +494,33 @@ void c128_state::write_memory(address_space &space, offs_t offset, offs_t vma, u
}
if (!BIT(plaout, PLA_OUT_VIC))
{
- m_vic->write(space, offset & 0x3f, data);
+ m_vic->write(offset & 0x3f, data);
}
if (!BIT(plaout, PLA_OUT_IOCS) && BIT(offset, 10))
{
switch ((BIT(offset, 11) << 2) | ((offset >> 8) & 0x03))
{
case 0: // SID
- m_sid->write(space, offset & 0x1f, data);
+ m_sid->write(offset & 0x1f, data);
break;
case 2: // CS8563
if (BIT(offset, 0))
{
- m_vdc->register_w(space, 0, data);
+ m_vdc->register_w(data);
}
else
{
- m_vdc->address_w(space, 0, data);
+ m_vdc->address_w(data);
}
break;
case 4: // CIA1
- m_cia1->write(space, offset & 0x0f, data);
+ m_cia1->write(offset & 0x0f, data);
break;
case 5: // CIA2
- m_cia2->write(space, offset & 0x0f, data);
+ m_cia2->write(offset & 0x0f, data);
break;
case 6: // I/O1
@@ -536,9 +536,9 @@ void c128_state::write_memory(address_space &space, offs_t offset, offs_t vma, u
int roml = BIT(plaout, PLA_OUT_ROML);
int romh = BIT(plaout, PLA_OUT_ROMH);
- m_exp->cd_w(space, ca, data, sphi2, ba, roml, romh, io1, io2);
+ m_exp->cd_w(ca, data, sphi2, ba, roml, romh, io1, io2);
- m_mmu->write(space, offset, data);
+ m_mmu->write(offset, data);
}
@@ -551,7 +551,7 @@ READ8_MEMBER( c128_state::z80_r )
int ba = 1, aec = 1, z80io = 1;
offs_t vma = 0;
- return read_memory(space, offset, vma, ba, aec, z80io);
+ return read_memory(offset, vma, ba, aec, z80io);
}
@@ -564,7 +564,7 @@ WRITE8_MEMBER( c128_state::z80_w )
int ba = 1, aec = 1, z80io = 1;
offs_t vma = 0;
- write_memory(space, offset, vma, data, ba, aec, z80io);
+ write_memory(offset, vma, data, ba, aec, z80io);
}
@@ -577,7 +577,7 @@ READ8_MEMBER( c128_state::z80_io_r )
int ba = 1, aec = 1, z80io = 0;
offs_t vma = 0;
- return read_memory(space, offset, vma, ba, aec, z80io);
+ return read_memory(offset, vma, ba, aec, z80io);
}
@@ -590,7 +590,7 @@ WRITE8_MEMBER( c128_state::z80_io_w )
int ba = 1, aec = 1, z80io = 0;
offs_t vma = 0;
- write_memory(space, offset, vma, data, ba, aec, z80io);
+ write_memory(offset, vma, data, ba, aec, z80io);
}
@@ -603,7 +603,7 @@ READ8_MEMBER( c128_state::read )
int ba = 1, aec = 1, z80io = 1;
offs_t vma = 0;
- return read_memory(space, offset, vma, ba, aec, z80io);
+ return read_memory(offset, vma, ba, aec, z80io);
}
@@ -616,7 +616,7 @@ WRITE8_MEMBER( c128_state::write )
int ba = 1, aec = 1, z80io = 1;
offs_t vma = 0;
- write_memory(space, offset, vma, data, ba, aec, z80io);
+ write_memory(offset, vma, data, ba, aec, z80io);
}
@@ -628,7 +628,7 @@ READ8_MEMBER( c128_state::vic_videoram_r )
{
int ba = 0, aec = 0, z80io = 1;
- return read_memory(space, 0, offset, ba, aec, z80io);
+ return read_memory(0, offset, ba, aec, z80io);
}
@@ -1111,7 +1111,7 @@ READ8_MEMBER( c128_state::sid_potx_r )
{
uint8_t data = 0xff;
- switch (m_cia1->read_pa() >> 6)
+ switch (m_cia1->pa_r() >> 6)
{
case 1: data = m_joy1->read_pot_x(); break;
case 2: data = m_joy2->read_pot_x(); break;
@@ -1138,7 +1138,7 @@ READ8_MEMBER( c128_state::sid_poty_r )
{
uint8_t data = 0xff;
- switch (m_cia1->read_pa() >> 6)
+ switch (m_cia1->pa_r() >> 6)
{
case 1: data = m_joy1->read_pot_y(); break;
case 2: data = m_joy2->read_pot_y(); break;
@@ -1192,7 +1192,7 @@ READ8_MEMBER( c128_state::cia1_pa_r )
data &= ~(!BIT(joy_b, 5) << 4);
// keyboard
- uint8_t cia1_pb = m_cia1->read_pb();
+ uint8_t cia1_pb = m_cia1->pb_r();
uint32_t row[8] = { m_row[0]->read(), m_row[1]->read() & m_lock->read(), m_row[2]->read(), m_row[3]->read(),
m_row[4]->read(), m_row[5]->read(), m_row[6]->read(), m_row[7]->read() };
@@ -1260,7 +1260,7 @@ READ8_MEMBER( c128_state::cia1_pb_r )
data &= ~(!BIT(joy_a, 5) << 4);
// keyboard
- uint8_t cia1_pa = m_cia1->read_pa();
+ uint8_t cia1_pa = m_cia1->pa_r();
if (!BIT(cia1_pa, 7)) data &= m_row[7]->read();
if (!BIT(cia1_pa, 6)) data &= m_row[6]->read();
@@ -1512,7 +1512,7 @@ READ8_MEMBER( c128_state::exp_dma_cd_r )
int ba = 0, aec = 1, z80io = 1;
offs_t vma = 0;
- return read_memory(space, offset, vma, ba, aec, z80io);
+ return read_memory(offset, vma, ba, aec, z80io);
}
WRITE8_MEMBER( c128_state::exp_dma_cd_w )
@@ -1520,7 +1520,7 @@ WRITE8_MEMBER( c128_state::exp_dma_cd_w )
int ba = 0, aec = 1, z80io = 1;
offs_t vma = 0;
- return write_memory(space, offset, data, vma, ba, aec, z80io);
+ return write_memory(offset, data, vma, ba, aec, z80io);
}
WRITE_LINE_MEMBER( c128_state::exp_dma_w )
@@ -1629,7 +1629,7 @@ void c128_state::machine_reset()
//**************************************************************************
//-------------------------------------------------
-// MACHINE_CONFIG( ntsc )
+// machine_config( ntsc )
//-------------------------------------------------
void c128_state::ntsc(machine_config &config)
@@ -1755,8 +1755,8 @@ void c128_state::ntsc(machine_config &config)
m_user->pl_handler().set(FUNC(c128_state::write_user_pb7));
m_user->pm_handler().set(FUNC(c128_state::write_user_pa2));
- quickload_image_device &quickload(QUICKLOAD(config, "quickload", 0));
- quickload.set_handler(snapquick_load_delegate(&QUICKLOAD_LOAD_NAME(c128_state, cbm_c64), this), "p00,prg", CBM_QUICKLOAD_DELAY_SECONDS);
+ quickload_image_device &quickload(QUICKLOAD(config, "quickload"));
+ quickload.set_handler(snapquick_load_delegate(&QUICKLOAD_LOAD_NAME(c128_state, cbm_c64), this), "p00,prg", CBM_QUICKLOAD_DELAY);
// software list
SOFTWARE_LIST(config, "cart_list_vic10").set_original("vic10");
@@ -1783,7 +1783,7 @@ void c128_state::ntsc(machine_config &config)
//-------------------------------------------------
-// MACHINE_CONFIG( c128 )
+// machine_config( c128 )
//-------------------------------------------------
void c128_state::c128(machine_config &config)
@@ -1796,7 +1796,7 @@ void c128_state::c128(machine_config &config)
//-------------------------------------------------
-// MACHINE_CONFIG( c128dcr )
+// machine_config( c128dcr )
//-------------------------------------------------
void c128_state::c128dcr(machine_config &config)
@@ -1809,7 +1809,7 @@ void c128_state::c128dcr(machine_config &config)
//-------------------------------------------------
-// MACHINE_CONFIG( c128d81 )
+// machine_config( c128d81 )
//-------------------------------------------------
void c128_state::c128d81(machine_config &config)
@@ -1824,7 +1824,7 @@ void c128_state::c128d81(machine_config &config)
//-------------------------------------------------
-// MACHINE_CONFIG( pal )
+// machine_config( pal )
//-------------------------------------------------
void c128_state::pal(machine_config &config)
@@ -1950,8 +1950,8 @@ void c128_state::pal(machine_config &config)
m_user->pl_handler().set(FUNC(c128_state::write_user_pb7));
m_user->pm_handler().set(FUNC(c128_state::write_user_pa2));
- quickload_image_device &quickload(QUICKLOAD(config, "quickload", 0));
- quickload.set_handler(snapquick_load_delegate(&QUICKLOAD_LOAD_NAME(c128_state, cbm_c64), this), "p00,prg", CBM_QUICKLOAD_DELAY_SECONDS);
+ quickload_image_device &quickload(QUICKLOAD(config, "quickload"));
+ quickload.set_handler(snapquick_load_delegate(&QUICKLOAD_LOAD_NAME(c128_state, cbm_c64), this), "p00,prg", CBM_QUICKLOAD_DELAY);
// software list
SOFTWARE_LIST(config, "cart_list_vic10").set_original("vic10");
@@ -1978,7 +1978,7 @@ void c128_state::pal(machine_config &config)
//-------------------------------------------------
-// MACHINE_CONFIG( c128pal )
+// machine_config( c128pal )
//-------------------------------------------------
void c128_state::c128pal(machine_config &config)
@@ -1991,7 +1991,7 @@ void c128_state::c128pal(machine_config &config)
//-------------------------------------------------
-// MACHINE_CONFIG( c128dcrp )
+// machine_config( c128dcrp )
//-------------------------------------------------
void c128_state::c128dcrp(machine_config &config)
diff --git a/src/mame/drivers/c2color.cpp b/src/mame/drivers/c2color.cpp
new file mode 100644
index 00000000000..4164553a1a2
--- /dev/null
+++ b/src/mame/drivers/c2color.cpp
@@ -0,0 +1,127 @@
+// license:BSD-3-Clause
+// copyright-holders:David Haywood
+/******************************************************************************
+
+ basic information
+ https://gbatemp.net/threads/the-c2-color-game-console-an-obscure-chinese-handheld.509320/
+
+ "The C2 is a glorious console with a D-Pad, Local 2.4GHz WiFi, Cartridge slot, A, B, and C buttons,
+ and has micro usb power! Don't be fooled though, there is no lithium battery, so you have to put in
+ 3 AA batteries if you don't want to play with it tethered to a charger.
+
+ It comes with a built in game based on the roco kingdom characters.
+
+ In addition, there is a slot on the side of the console allowing cards to be swiped through. Those
+ cards can add characters to the game. The console scans the barcode and a new character or item appears in the game for you to use.
+
+ The C2 comes with 9 holographic game cards that will melt your eyes."
+
+ also includes a link to the following video
+ https://www.youtube.com/watch?v=D3XO4aTZEko
+
+ TODO:
+ identify CPU type, and if the system ROM is needed to run carts or not
+
+*******************************************************************************/
+
+#include "emu.h"
+
+#include "bus/generic/slot.h"
+#include "bus/generic/carts.h"
+
+#include "screen.h"
+#include "emupal.h"
+#include "softlist.h"
+#include "speaker.h"
+
+class c2_color_state : public driver_device
+{
+public:
+ c2_color_state(const machine_config &mconfig, device_type type, const char *tag)
+ : driver_device(mconfig, type, tag)
+ , m_cart(*this, "cartslot")
+ , m_cart_region(nullptr)
+ , m_palette(*this, "palette")
+ , m_screen(*this, "screen")
+ { }
+
+ void c2_color(machine_config &config);
+ void leapfrog_mfleappad(machine_config &config);
+
+private:
+ virtual void machine_start() override;
+ virtual void machine_reset() override;
+
+ uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
+
+ DECLARE_DEVICE_IMAGE_LOAD_MEMBER(cart);
+
+ required_device<generic_slot_device> m_cart;
+ memory_region *m_cart_region;
+ required_device<palette_device> m_palette;
+ required_device<screen_device> m_screen;
+};
+
+uint32_t c2_color_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
+{
+ return 0;
+}
+
+
+
+
+void c2_color_state::machine_start()
+{
+ // if there's a cart, override the standard mapping
+ if (m_cart && m_cart->exists())
+ {
+ std::string region_tag;
+ m_cart_region = memregion(region_tag.assign(m_cart->tag()).append(GENERIC_ROM_REGION_TAG).c_str());
+ }
+}
+
+void c2_color_state::machine_reset()
+{
+}
+
+DEVICE_IMAGE_LOAD_MEMBER(c2_color_state, cart)
+{
+ uint32_t size = m_cart->common_get_size("rom");
+
+ m_cart->rom_alloc(size, GENERIC_ROM16_WIDTH, ENDIANNESS_LITTLE);
+ m_cart->common_load_rom(m_cart->get_rom_base(), size, "rom");
+
+ return image_init_result::PASS;
+}
+
+static INPUT_PORTS_START( c2_color )
+INPUT_PORTS_END
+
+void c2_color_state::c2_color(machine_config &config)
+{
+ // unknown CPU
+
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_refresh_hz(60);
+ m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ m_screen->set_size(64*8, 32*8);
+ m_screen->set_visarea(0*8, 40*8-1, 0*8, 30*8-1);
+ m_screen->set_screen_update(FUNC(c2_color_state::screen_update));
+ m_screen->set_palette(m_palette);
+
+ PALETTE(config, m_palette).set_format(palette_device::xBGR_555, 0x200);
+
+ GENERIC_CARTSLOT(config, m_cart, generic_plain_slot, "c2color_cart");
+ m_cart->set_width(GENERIC_ROM16_WIDTH);
+ m_cart->set_device_load(device_image_load_delegate(&c2_color_state::device_image_load_cart, this));
+
+ SOFTWARE_LIST(config, "cart_list").set_original("c2color_cart");
+}
+
+ROM_START( c2color )
+ ROM_REGION( 0x800000, "maincpu", ROMREGION_ERASEFF )
+ ROM_LOAD( "system.rom", 0x000000, 0x400000, NO_DUMP ) // must have an internal rom for the built in game, unknown size etc.
+ROM_END
+
+// year, name, parent, compat, machine, input, class, init, company, fullname, flags
+CONS( 201?, c2color, 0, 0, c2_color, c2_color, c2_color_state, empty_init, "Baiyi Animation", "C2 Color (China)", MACHINE_IS_SKELETON )
diff --git a/src/mame/drivers/c64.cpp b/src/mame/drivers/c64.cpp
index f606bf6ce02..d532e00c410 100644
--- a/src/mame/drivers/c64.cpp
+++ b/src/mame/drivers/c64.cpp
@@ -332,14 +332,14 @@ uint8_t c64_state::read_memory(address_space &space, offs_t offset, offs_t va, i
case 1:
case 2:
case 3: // VIC
- data = m_vic->read(space, offset & 0x3f);
+ data = m_vic->read(offset & 0x3f);
break;
case 4:
case 5:
case 6:
case 7: // SID
- data = m_sid->read(space, offset & 0x1f);
+ data = m_sid->read(offset & 0x1f);
break;
case 0x8:
@@ -350,11 +350,11 @@ uint8_t c64_state::read_memory(address_space &space, offs_t offset, offs_t va, i
break;
case 0xc: // CIA1
- data = m_cia1->read(space, offset & 0x0f);
+ data = m_cia1->read(offset & 0x0f);
break;
case 0xd: // CIA2
- data = m_cia2->read(space, offset & 0x0f);
+ data = m_cia2->read(offset & 0x0f);
break;
case 0xe: // I/O1
@@ -369,7 +369,7 @@ uint8_t c64_state::read_memory(address_space &space, offs_t offset, offs_t va, i
int roml = BIT(plaout, PLA_OUT_ROML);
int romh = BIT(plaout, PLA_OUT_ROMH);
- return m_exp->cd_r(space, offset, data, sphi2, ba, roml, romh, io1, io2);
+ return m_exp->cd_r(offset, data, sphi2, ba, roml, romh, io1, io2);
}
@@ -404,14 +404,14 @@ void c64_state::write_memory(address_space &space, offs_t offset, uint8_t data,
case 1:
case 2:
case 3: // VIC
- m_vic->write(space, offset & 0x3f, data);
+ m_vic->write(offset & 0x3f, data);
break;
case 4:
case 5:
case 6:
case 7: // SID
- m_sid->write(space, offset & 0x1f, data);
+ m_sid->write(offset & 0x1f, data);
break;
case 0x8:
@@ -422,11 +422,11 @@ void c64_state::write_memory(address_space &space, offs_t offset, uint8_t data,
break;
case 0xc: // CIA1
- m_cia1->write(space, offset & 0x0f, data);
+ m_cia1->write(offset & 0x0f, data);
break;
case 0xd: // CIA2
- m_cia2->write(space, offset & 0x0f, data);
+ m_cia2->write(offset & 0x0f, data);
break;
case 0xe: // I/O1
@@ -441,7 +441,7 @@ void c64_state::write_memory(address_space &space, offs_t offset, uint8_t data,
int roml = BIT(plaout, PLA_OUT_ROML);
int romh = BIT(plaout, PLA_OUT_ROMH);
- m_exp->cd_w(space, offset, data, sphi2, ba, roml, romh, io1, io2);
+ m_exp->cd_w(offset, data, sphi2, ba, roml, romh, io1, io2);
}
@@ -692,7 +692,7 @@ READ8_MEMBER( c64_state::sid_potx_r )
{
uint8_t data = 0xff;
- switch (m_cia1->read_pa() >> 6)
+ switch (m_cia1->pa_r() >> 6)
{
case 1: data = m_joy1->read_pot_x(); break;
case 2: data = m_joy2->read_pot_x(); break;
@@ -719,7 +719,7 @@ READ8_MEMBER( c64_state::sid_poty_r )
{
uint8_t data = 0xff;
- switch (m_cia1->read_pa() >> 6)
+ switch (m_cia1->pa_r() >> 6)
{
case 1: data = m_joy1->read_pot_y(); break;
case 2: data = m_joy2->read_pot_y(); break;
@@ -773,7 +773,7 @@ READ8_MEMBER( c64_state::cia1_pa_r )
data &= ~(!BIT(joy_b, 5) << 4);
// keyboard
- uint8_t cia1_pb = m_cia1->read_pb();
+ uint8_t cia1_pb = m_cia1->pb_r();
uint32_t row[8] = { m_row[0]->read(), m_row[1]->read() & m_lock->read(), m_row[2]->read(), m_row[3]->read(),
m_row[4]->read(), m_row[5]->read(), m_row[6]->read(), m_row[7]->read() };
@@ -841,7 +841,7 @@ READ8_MEMBER( c64_state::cia1_pb_r )
data &= ~(!BIT(joy_a, 5) << 4);
// keyboard
- uint8_t cia1_pa = m_cia1->read_pa();
+ uint8_t cia1_pa = m_cia1->pa_r();
if (!BIT(cia1_pa, 7)) data &= m_row[7]->read();
if (!BIT(cia1_pa, 6)) data &= m_row[6]->read();
@@ -1260,7 +1260,7 @@ void c64_state::machine_reset()
//**************************************************************************
//-------------------------------------------------
-// MACHINE_CONFIG( ntsc )
+// machine_config( ntsc )
//-------------------------------------------------
void c64_state::ntsc(machine_config &config)
@@ -1361,8 +1361,8 @@ void c64_state::ntsc(machine_config &config)
m_user->pl_handler().set(FUNC(c64_state::write_user_pb7));
m_user->pm_handler().set(FUNC(c64_state::write_user_pa2));
- quickload_image_device &quickload(QUICKLOAD(config, "quickload", 0));
- quickload.set_handler(snapquick_load_delegate(&QUICKLOAD_LOAD_NAME(c64_state, cbm_c64), this), "p00,prg,t64", CBM_QUICKLOAD_DELAY_SECONDS);
+ quickload_image_device &quickload(QUICKLOAD(config, "quickload"));
+ quickload.set_handler(snapquick_load_delegate(&QUICKLOAD_LOAD_NAME(c64_state, cbm_c64), this), "p00,prg,t64", CBM_QUICKLOAD_DELAY);
// software list
SOFTWARE_LIST(config, "cart_list_vic10").set_original("vic10");
@@ -1380,7 +1380,7 @@ void c64_state::ntsc(machine_config &config)
//-------------------------------------------------
-// MACHINE_CONFIG( pet64 )
+// machine_config( pet64 )
//-------------------------------------------------
void c64_state::pet64(machine_config &config)
@@ -1391,7 +1391,7 @@ void c64_state::pet64(machine_config &config)
//-------------------------------------------------
-// MACHINE_CONFIG( ntsc_sx )
+// machine_config( ntsc_sx )
//-------------------------------------------------
void sx64_state::ntsc_sx(machine_config &config)
@@ -1409,7 +1409,7 @@ void sx64_state::ntsc_sx(machine_config &config)
//-------------------------------------------------
-// MACHINE_CONFIG( ntsc_dx )
+// machine_config( ntsc_dx )
//-------------------------------------------------
void sx64_state::ntsc_dx(machine_config &config)
@@ -1422,7 +1422,7 @@ void sx64_state::ntsc_dx(machine_config &config)
//-------------------------------------------------
-// MACHINE_CONFIG( ntsc_c )
+// machine_config( ntsc_c )
//-------------------------------------------------
void c64c_state::ntsc_c(machine_config &config)
@@ -1436,7 +1436,7 @@ void c64c_state::ntsc_c(machine_config &config)
//-------------------------------------------------
-// MACHINE_CONFIG( pal )
+// machine_config( pal )
//-------------------------------------------------
void c64_state::pal(machine_config &config)
@@ -1537,8 +1537,8 @@ void c64_state::pal(machine_config &config)
m_user->pl_handler().set(FUNC(c64_state::write_user_pb7));
m_user->pm_handler().set(FUNC(c64_state::write_user_pa2));
- quickload_image_device &quickload(QUICKLOAD(config, "quickload", 0));
- quickload.set_handler(snapquick_load_delegate(&QUICKLOAD_LOAD_NAME(c64_state, cbm_c64), this), "p00,prg,t64", CBM_QUICKLOAD_DELAY_SECONDS);
+ quickload_image_device &quickload(QUICKLOAD(config, "quickload"));
+ quickload.set_handler(snapquick_load_delegate(&QUICKLOAD_LOAD_NAME(c64_state, cbm_c64), this), "p00,prg,t64", CBM_QUICKLOAD_DELAY);
// software list
SOFTWARE_LIST(config, "cart_list_vic10").set_original("vic10");
@@ -1556,7 +1556,7 @@ void c64_state::pal(machine_config &config)
//-------------------------------------------------
-// MACHINE_CONFIG( pal_sx )
+// machine_config( pal_sx )
//-------------------------------------------------
void sx64_state::pal_sx(machine_config &config)
@@ -1574,7 +1574,7 @@ void sx64_state::pal_sx(machine_config &config)
//-------------------------------------------------
-// MACHINE_CONFIG( pal_c )
+// machine_config( pal_c )
//-------------------------------------------------
void c64c_state::pal_c(machine_config &config)
@@ -1588,7 +1588,7 @@ void c64c_state::pal_c(machine_config &config)
//-------------------------------------------------
-// MACHINE_CONFIG( pal_gs )
+// machine_config( pal_gs )
//-------------------------------------------------
void c64gs_state::pal_gs(machine_config &config)
@@ -1687,8 +1687,8 @@ void c64gs_state::pal_gs(machine_config &config)
m_user->pl_handler().set(FUNC(c64_state::write_user_pb7));
m_user->pm_handler().set(FUNC(c64_state::write_user_pa2));
- quickload_image_device &quickload(QUICKLOAD(config, "quickload", 0));
- quickload.set_handler(snapquick_load_delegate(&QUICKLOAD_LOAD_NAME(c64_state, cbm_c64), this), "p00,prg,t64", CBM_QUICKLOAD_DELAY_SECONDS);
+ quickload_image_device &quickload(QUICKLOAD(config, "quickload"));
+ quickload.set_handler(snapquick_load_delegate(&QUICKLOAD_LOAD_NAME(c64_state, cbm_c64), this), "p00,prg,t64", CBM_QUICKLOAD_DELAY);
// software list
SOFTWARE_LIST(config, "cart_list_vic10").set_original("vic10");
diff --git a/src/mame/drivers/c64dtv.cpp b/src/mame/drivers/c64dtv.cpp
index d8843f8b1ec..ba115565d03 100644
--- a/src/mame/drivers/c64dtv.cpp
+++ b/src/mame/drivers/c64dtv.cpp
@@ -49,14 +49,15 @@ INPUT_PORTS_END
// MACHINE DRIVERS
//**************************************************************************
-MACHINE_CONFIG_START(c64dtv_state::c64dtv)
+void c64dtv_state::c64dtv(machine_config &config)
+{
// video hardware
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_UPDATE_DRIVER(c64dtv_state, screen_update)
- MCFG_SCREEN_SIZE(640,480)
- MCFG_SCREEN_VISIBLE_AREA(0,639, 0,479)
- MCFG_SCREEN_REFRESH_RATE(30)
-MACHINE_CONFIG_END
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_screen_update(FUNC(c64dtv_state::screen_update));
+ screen.set_size(640,480);
+ screen.set_visarea_full();
+ screen.set_refresh_hz(30);
+}
diff --git a/src/mame/drivers/c65.cpp b/src/mame/drivers/c65.cpp
index 2795a1861ef..69d0e552db1 100644
--- a/src/mame/drivers/c65.cpp
+++ b/src/mame/drivers/c65.cpp
@@ -267,7 +267,7 @@ WRITE8_MEMBER(c65_state::vic4567_dummy_w)
m_VIC3_ControlB = data;
break;
default:
- printf("%02x %02x\n",offset,data);
+ printf("%02x %02x\n", offset, data);
break;
}
@@ -402,9 +402,9 @@ READ8_MEMBER(c65_state::CIASelect_r)
switch((offset & 0x700) | 0x800)
{
case 0xc00:
- return m_cia0->read(space,offset);
+ return m_cia0->read(offset);
case 0xd00:
- return m_cia1->read(space,offset);
+ return m_cia1->read(offset);
default:
printf("Unknown I/O access read to offset %04x\n",offset);
break;
@@ -425,14 +425,14 @@ WRITE8_MEMBER(c65_state::CIASelect_w)
switch((offset & 0x700) | 0x800)
{
case 0xc00:
- m_cia0->write(space,offset,data);
+ m_cia0->write(offset, data);
break;
case 0xd00:
- m_cia1->write(space,offset,data);
+ m_cia1->write(offset, data);
break;
default:
- printf("Unknown I/O access write to offset %04x data = %02x\n",offset,data);
+ printf("Unknown I/O access write to offset %04x data = %02x\n", offset, data);
break;
}
}
@@ -684,39 +684,39 @@ WRITE_LINE_MEMBER(c65_state::cia0_irq)
// c65_irq(state || m_vicirq);
}
-MACHINE_CONFIG_START(c65_state::c65)
-
+void c65_state::c65(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M4510, MAIN_CLOCK)
- MCFG_DEVICE_PROGRAM_MAP(c65_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", c65_state, vic3_vblank_irq)
+ M4510(config, m_maincpu, MAIN_CLOCK);
+ m_maincpu->set_addrmap(AS_PROGRAM, &c65_state::c65_map);
+ m_maincpu->set_vblank_int("screen", FUNC(c65_state::vic3_vblank_irq));
- MCFG_DEVICE_ADD("cia_0", MOS6526, MAIN_CLOCK)
- MCFG_MOS6526_TOD(60)
- MCFG_MOS6526_IRQ_CALLBACK(WRITELINE(*this, c65_state, cia0_irq))
- MCFG_MOS6526_PA_INPUT_CALLBACK(READ8(*this, c65_state, cia0_porta_r))
- MCFG_MOS6526_PA_OUTPUT_CALLBACK(WRITE8(*this, c65_state, cia0_porta_w))
- MCFG_MOS6526_PB_INPUT_CALLBACK(READ8(*this, c65_state, cia0_portb_r))
- MCFG_MOS6526_PB_OUTPUT_CALLBACK(WRITE8(*this, c65_state, cia0_portb_w))
+ MOS6526(config, m_cia0, MAIN_CLOCK);
+ m_cia0->set_tod_clock(60);
+ m_cia0->irq_wr_callback().set(FUNC(c65_state::cia0_irq));
+ m_cia0->pa_rd_callback().set(FUNC(c65_state::cia0_porta_r));
+ m_cia0->pa_wr_callback().set(FUNC(c65_state::cia0_porta_w));
+ m_cia0->pb_rd_callback().set(FUNC(c65_state::cia0_portb_r));
+ m_cia0->pb_wr_callback().set(FUNC(c65_state::cia0_portb_w));
- MCFG_DEVICE_ADD("cia_1", MOS6526, MAIN_CLOCK)
- MCFG_MOS6526_TOD(60)
-// MCFG_MOS6526_IRQ_CALLBACK(WRITELINE(*this, c65_state, c65_cia1_interrupt))
-// MCFG_MOS6526_PA_INPUT_CALLBACK(READ8(*this, c65_state, c65_cia1_port_a_r))
-// MCFG_MOS6526_PA_OUTPUT_CALLBACK(WRITE8(*this, c65_state, c65_cia1_port_a_w))
+ MOS6526(config, m_cia1, MAIN_CLOCK);
+ m_cia1->set_tod_clock(60);
+// m_cia1->irq_wr_callback().set(FUNC(c65_state::c65_cia1_interrupt));
+// m_cia1->pa_rd_callback().set(FUNC(c65_state::c65_cia1_port_a_r));
+// m_cia1->pa_wr_callback().set(FUNC(c65_state::c65_cia1_port_a_w));
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
-// MCFG_SCREEN_REFRESH_RATE(60)
-// MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500))
- MCFG_SCREEN_UPDATE_DRIVER(c65_state, screen_update)
-// MCFG_SCREEN_SIZE(32*8, 32*8)
-// MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 0*8, 32*8-1)
- MCFG_SCREEN_RAW_PARAMS(MAIN_CLOCK*4, 910, 0, 640, 262, 0, 200) // mods needed
- MCFG_SCREEN_PALETTE(m_palette)
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+// m_screen->set_refresh_hz(60);
+// m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(2500));
+ m_screen->set_screen_update(FUNC(c65_state::screen_update));
+// m_screen->set_size(32*8, 32*8);
+// m_screen->set_visarea(0*8, 32*8-1, 0*8, 32*8-1);
+ m_screen->set_raw(MAIN_CLOCK*4, 910, 0, 640, 262, 0, 200); // mods needed
+ m_screen->set_palette(m_palette);
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, m_palette, gfx_c65)
+ GFXDECODE(config, m_gfxdecode, m_palette, gfx_c65);
PALETTE(config, m_palette, FUNC(c65_state::c65_palette), 0x100);
@@ -726,8 +726,8 @@ MACHINE_CONFIG_START(c65_state::c65)
// 2x 8580 SID
// software list
- MCFG_SOFTWARE_LIST_ADD("flop_list", "c65_flop")
-MACHINE_CONFIG_END
+ SOFTWARE_LIST(config, "flop_list").set_original("c65_flop");
+}
/***************************************************************************
diff --git a/src/mame/drivers/c80.cpp b/src/mame/drivers/c80.cpp
index 6fc5b7466ef..44cd3b761fe 100644
--- a/src/mame/drivers/c80.cpp
+++ b/src/mame/drivers/c80.cpp
@@ -254,7 +254,8 @@ void c80_state::machine_start()
/* Machine Driver */
-MACHINE_CONFIG_START(c80_state::c80)
+void c80_state::c80(machine_config &config)
+{
/* basic machine hardware */
Z80(config, m_maincpu, 2500000); /* U880D */
m_maincpu->set_addrmap(AS_PROGRAM, &c80_state::c80_mem);
@@ -275,15 +276,15 @@ MACHINE_CONFIG_START(c80_state::c80)
z80pio_device& pio2(Z80PIO(config, Z80PIO2_TAG, XTAL(2500000)));
pio2.out_int_callback().set_inputline(m_maincpu, INPUT_LINE_IRQ0);
- MCFG_CASSETTE_ADD("cassette")
- MCFG_CASSETTE_DEFAULT_STATE(CASSETTE_STOPPED | CASSETTE_MOTOR_ENABLED | CASSETTE_SPEAKER_ENABLED )
+ CASSETTE(config, m_cassette);
+ m_cassette->set_default_state(CASSETTE_STOPPED | CASSETTE_MOTOR_ENABLED | CASSETTE_SPEAKER_ENABLED);
SPEAKER(config, "mono").front_center();
- WAVE(config, "wave", "cassette").add_route(ALL_OUTPUTS, "mono", 0.25);
+ WAVE(config, "wave", m_cassette).add_route(ALL_OUTPUTS, "mono", 0.25);
/* internal ram */
RAM(config, RAM_TAG).set_default_size("1K");
-MACHINE_CONFIG_END
+}
/* ROMs */
diff --git a/src/mame/drivers/c900.cpp b/src/mame/drivers/c900.cpp
index 3e969f1df97..bec1220521e 100644
--- a/src/mame/drivers/c900.cpp
+++ b/src/mame/drivers/c900.cpp
@@ -35,7 +35,9 @@ To Do:
#include "machine/z80scc.h"
#include "bus/rs232/rs232.h"
#include "machine/z8536.h"
+#include "sound/spkrdev.h"
#include "emupal.h"
+#include "speaker.h"
class c900_state : public driver_device
@@ -44,17 +46,26 @@ public:
c900_state(const machine_config &mconfig, device_type type, const char *tag)
: driver_device(mconfig, type, tag)
, m_maincpu(*this, "maincpu")
+ , m_spkrdev(*this, "speaker")
{ }
void c900(machine_config &config);
private:
+ void sound_pb_w(u8 data);
+
void data_map(address_map &map);
void io_map(address_map &map);
void mem_map(address_map &map);
required_device<cpu_device> m_maincpu;
+ required_device<speaker_sound_device> m_spkrdev;
};
+void c900_state::sound_pb_w(u8 data)
+{
+ m_spkrdev->level_w(BIT(data, 0));
+}
+
void c900_state::mem_map(address_map &map)
{
map(0x00000, 0x07fff).rom().region("roms", 0);
@@ -64,6 +75,7 @@ void c900_state::data_map(address_map &map)
{
map(0x00000, 0x07fff).rom().region("roms", 0);
map(0x08000, 0x6ffff).ram();
+ map(0xf0000, 0xf1fff).ram();
}
void c900_state::io_map(address_map &map)
@@ -93,19 +105,21 @@ static GFXDECODE_START( gfx_c900 )
GFXDECODE_ENTRY( "chargen", 0x0000, c900_charlayout, 0, 1 )
GFXDECODE_END
-MACHINE_CONFIG_START(c900_state::c900)
+void c900_state::c900(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z8001, XTAL(12'000'000) / 2)
- MCFG_DEVICE_PROGRAM_MAP(mem_map)
- MCFG_DEVICE_DATA_MAP(data_map)
- MCFG_DEVICE_IO_MAP(io_map)
+ Z8001(config, m_maincpu, 12_MHz_XTAL / 2);
+ m_maincpu->set_addrmap(AS_PROGRAM, &c900_state::mem_map);
+ m_maincpu->set_addrmap(AS_DATA, &c900_state::data_map);
+ m_maincpu->set_addrmap(AS_IO, &c900_state::io_map);
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_c900)
+ GFXDECODE(config, "gfxdecode", "palette", gfx_c900);
PALETTE(config, "palette", palette_device::MONOCHROME);
- Z8036(config, "cio", 6'000'000);
+ z8036_device &cio(Z8036(config, "cio", 12_MHz_XTAL / 16)); // SNDCLK = 750kHz
+ cio.pb_wr_cb().set(FUNC(c900_state::sound_pb_w));
- scc8030_device& scc(SCC8030(config, "scc", 6'000'000)); // 5'850'000 is the ideal figure
+ scc8030_device &scc(SCC8030(config, "scc", 12_MHz_XTAL / 2)); // 5'850'000 is the ideal figure
/* Port B */
scc.out_txdb_callback().set("rs232", FUNC(rs232_port_device::write_txd));
scc.out_dtrb_callback().set("rs232", FUNC(rs232_port_device::write_dtr));
@@ -115,7 +129,10 @@ MACHINE_CONFIG_START(c900_state::c900)
rs232_port_device &rs232(RS232_PORT(config, "rs232", default_rs232_devices, "terminal"));
rs232.rxd_handler().set("scc", FUNC(scc8030_device::rxb_w));
rs232.cts_handler().set("scc", FUNC(scc8030_device::ctsb_w));
-MACHINE_CONFIG_END
+
+ SPEAKER(config, "mono").front_center();
+ SPEAKER_SOUND(config, m_spkrdev).add_route(ALL_OUTPUTS, "mono", 0.05);
+}
ROM_START( c900 )
ROM_REGION16_LE( 0x8000, "roms", 0 )
diff --git a/src/mame/drivers/cabaret.cpp b/src/mame/drivers/cabaret.cpp
index ed7a8357389..eaf24dac033 100644
--- a/src/mame/drivers/cabaret.cpp
+++ b/src/mame/drivers/cabaret.cpp
@@ -365,12 +365,13 @@ INTERRUPT_GEN_MEMBER(cabaret_state::cabaret_interrupt)
device.execute().pulse_input_line(INPUT_LINE_NMI, attotime::zero);
}
-MACHINE_CONFIG_START(cabaret_state::cabaret)
+void cabaret_state::cabaret(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z180, XTAL(12'000'000) / 2)
- MCFG_DEVICE_PROGRAM_MAP(cabaret_map)
- MCFG_DEVICE_IO_MAP(cabaret_portmap)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", cabaret_state, cabaret_interrupt)
+ Z180(config, m_maincpu, XTAL(12'000'000) / 2);
+ m_maincpu->set_addrmap(AS_PROGRAM, &cabaret_state::cabaret_map);
+ m_maincpu->set_addrmap(AS_IO, &cabaret_state::cabaret_portmap);
+ m_maincpu->set_vblank_int("screen", FUNC(cabaret_state::cabaret_interrupt));
i8255_device &ppi1(I8255(config, "ppi1"));
ppi1.in_pa_callback().set_ioport("BUTTONS2");
@@ -389,22 +390,21 @@ MACHINE_CONFIG_START(cabaret_state::cabaret)
ppi3.in_pc_callback().set_ioport("DSW2");
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(512, 256)
- MCFG_SCREEN_VISIBLE_AREA(0, 512-1, 0, 256-1)
- MCFG_SCREEN_UPDATE_DRIVER(cabaret_state, screen_update_cabaret)
- MCFG_SCREEN_PALETTE(m_palette)
-
- MCFG_DEVICE_ADD(m_gfxdecode, GFXDECODE, m_palette, gfx_cabaret)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(512, 256);
+ screen.set_visarea_full();
+ screen.set_screen_update(FUNC(cabaret_state::screen_update_cabaret));
+ screen.set_palette(m_palette);
+
+ GFXDECODE(config, m_gfxdecode, m_palette, gfx_cabaret);
PALETTE(config, m_palette).set_format(palette_device::xBGR_555, 0x800);
/* sound hardware */
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("ymsnd", YM2413, XTAL(3'579'545))
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
-MACHINE_CONFIG_END
+ YM2413(config, "ymsnd", XTAL(3'579'545)).add_route(ALL_OUTPUTS, "mono", 1.0);
+}
void cabaret_state::init_cabaret()
diff --git a/src/mame/drivers/calchase.cpp b/src/mame/drivers/calchase.cpp
index c8303bb5c53..6d9f8322993 100644
--- a/src/mame/drivers/calchase.cpp
+++ b/src/mame/drivers/calchase.cpp
@@ -678,10 +678,10 @@ void calchase_state::machine_reset()
}
MACHINE_CONFIG_START(calchase_state::calchase)
- MCFG_DEVICE_ADD("maincpu", PENTIUM, 133000000) // Cyrix 686MX-PR200 CPU
- MCFG_DEVICE_PROGRAM_MAP(calchase_map)
- MCFG_DEVICE_IO_MAP(calchase_io)
- MCFG_DEVICE_IRQ_ACKNOWLEDGE_DEVICE("pic8259_1", pic8259_device, inta_cb)
+ PENTIUM(config, m_maincpu, 133000000); // Cyrix 686MX-PR200 CPU
+ m_maincpu->set_addrmap(AS_PROGRAM, &calchase_state::calchase_map);
+ m_maincpu->set_addrmap(AS_IO, &calchase_state::calchase_io);
+ m_maincpu->set_irq_acknowledge_callback("pic8259_1", FUNC(pic8259_device::inta_cb));
pcat_common(config);
@@ -702,18 +702,18 @@ MACHINE_CONFIG_START(calchase_state::calchase)
/* sound hardware */
SPEAKER(config, "lspeaker").front_left();
SPEAKER(config, "rspeaker").front_right();
- MCFG_DEVICE_ADD("ldac", DAC_12BIT_R2R, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 0.25) // unknown DAC
- MCFG_DEVICE_ADD("rdac", DAC_12BIT_R2R, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 0.25) // unknown DAC
- MCFG_DEVICE_ADD("vref", VOLTAGE_REGULATOR, 0) MCFG_VOLTAGE_REGULATOR_OUTPUT(5.0)
- MCFG_SOUND_ROUTE(0, "ldac", 1.0, DAC_VREF_POS_INPUT) MCFG_SOUND_ROUTE(0, "ldac", -1.0, DAC_VREF_NEG_INPUT)
- MCFG_SOUND_ROUTE(0, "rdac", 1.0, DAC_VREF_POS_INPUT) MCFG_SOUND_ROUTE(0, "rdac", -1.0, DAC_VREF_NEG_INPUT)
+ DAC_12BIT_R2R(config, "ldac", 0).add_route(ALL_OUTPUTS, "lspeaker", 0.25); // unknown DAC
+ DAC_12BIT_R2R(config, "rdac", 0).add_route(ALL_OUTPUTS, "rspeaker", 0.25); // unknown DAC
+ voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref"));
+ vref.add_route(0, "ldac", 1.0, DAC_VREF_POS_INPUT); vref.add_route(0, "ldac", -1.0, DAC_VREF_NEG_INPUT);
+ vref.add_route(0, "rdac", 1.0, DAC_VREF_POS_INPUT); vref.add_route(0, "rdac", -1.0, DAC_VREF_NEG_INPUT);
MACHINE_CONFIG_END
MACHINE_CONFIG_START(calchase_state::hostinv)
- MCFG_DEVICE_ADD("maincpu", PENTIUM, 133000000) // Cyrix 686MX-PR200 CPU
- MCFG_DEVICE_PROGRAM_MAP(calchase_map)
- MCFG_DEVICE_IO_MAP(calchase_io)
- MCFG_DEVICE_IRQ_ACKNOWLEDGE_DEVICE("pic8259_1", pic8259_device, inta_cb)
+ PENTIUM(config, m_maincpu, 133000000); // Cyrix 686MX-PR200 CPU
+ m_maincpu->set_addrmap(AS_PROGRAM, &calchase_state::calchase_map);
+ m_maincpu->set_addrmap(AS_IO, &calchase_state::calchase_io);
+ m_maincpu->set_irq_acknowledge_callback("pic8259_1", FUNC(pic8259_device::inta_cb));
pcat_common(config);
@@ -730,11 +730,11 @@ MACHINE_CONFIG_START(calchase_state::hostinv)
/* sound hardware */
SPEAKER(config, "lspeaker").front_left();
SPEAKER(config, "rspeaker").front_right();
- MCFG_DEVICE_ADD("ldac", DAC_12BIT_R2R, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 0.25) // unknown DAC
- MCFG_DEVICE_ADD("rdac", DAC_12BIT_R2R, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 0.25) // unknown DAC
- MCFG_DEVICE_ADD("vref", VOLTAGE_REGULATOR, 0) MCFG_VOLTAGE_REGULATOR_OUTPUT(5.0)
- MCFG_SOUND_ROUTE(0, "ldac", 1.0, DAC_VREF_POS_INPUT) MCFG_SOUND_ROUTE(0, "ldac", -1.0, DAC_VREF_NEG_INPUT)
- MCFG_SOUND_ROUTE(0, "rdac", 1.0, DAC_VREF_POS_INPUT) MCFG_SOUND_ROUTE(0, "rdac", -1.0, DAC_VREF_NEG_INPUT)
+ DAC_12BIT_R2R(config, "ldac", 0).add_route(ALL_OUTPUTS, "lspeaker", 0.25); // unknown DAC
+ DAC_12BIT_R2R(config, "rdac", 0).add_route(ALL_OUTPUTS, "rspeaker", 0.25); // unknown DAC
+ voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref"));
+ vref.add_route(0, "ldac", 1.0, DAC_VREF_POS_INPUT); vref.add_route(0, "ldac", -1.0, DAC_VREF_NEG_INPUT);
+ vref.add_route(0, "rdac", 1.0, DAC_VREF_POS_INPUT); vref.add_route(0, "rdac", -1.0, DAC_VREF_NEG_INPUT);
MACHINE_CONFIG_END
diff --git a/src/mame/drivers/calcune.cpp b/src/mame/drivers/calcune.cpp
index d2a544c0fbd..3ac491ca372 100644
--- a/src/mame/drivers/calcune.cpp
+++ b/src/mame/drivers/calcune.cpp
@@ -249,51 +249,51 @@ MACHINE_START_MEMBER(calcune_state,calcune)
m_vdp2->stop_timers();
}
-MACHINE_CONFIG_START(calcune_state::calcune)
- MCFG_DEVICE_ADD("maincpu", M68000, MASTER_CLOCK_NTSC / 7) /* 7.67 MHz */
- MCFG_DEVICE_PROGRAM_MAP(calcune_map)
- MCFG_DEVICE_IRQ_ACKNOWLEDGE_DRIVER(calcune_state,genesis_int_callback)
+void calcune_state::calcune(machine_config &config)
+{
+ M68000(config, m_maincpu, MASTER_CLOCK_NTSC / 7); /* 7.67 MHz */
+ m_maincpu->set_addrmap(AS_PROGRAM, &calcune_state::calcune_map);
+ m_maincpu->set_irq_acknowledge_callback(FUNC(calcune_state::genesis_int_callback));
- MCFG_DEVICE_ADD("z80", Z80, MASTER_CLOCK_NTSC / 15) /* 3.58 MHz */
- MCFG_DEVICE_DISABLE() /* no code is ever uploaded for the Z80, so it's unused here even if it is present on the PCB */
+ Z80(config, "z80", MASTER_CLOCK_NTSC / 15).set_disable(); /* 3.58 MHz, no code is ever uploaded for the Z80, so it's unused here even if it is present on the PCB */
MCFG_MACHINE_START_OVERRIDE(calcune_state,calcune)
MCFG_MACHINE_RESET_OVERRIDE(calcune_state,calcune)
- MCFG_SCREEN_ADD("megadriv", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) // Vblank handled manually.
- MCFG_SCREEN_SIZE(64*8, 620)
- MCFG_SCREEN_VISIBLE_AREA(0, 40*8-1, 0, 28*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(calcune_state, screen_update_calcune)
-
- MCFG_DEVICE_ADD("gen_vdp", SEGA315_5313, MASTER_CLOCK_NTSC, "maincpu")
- MCFG_SEGA315_5313_IS_PAL(false)
- MCFG_SEGA315_5313_SND_IRQ_CALLBACK(WRITELINE(*this, calcune_state, vdp_sndirqline_callback_genesis_z80));
- MCFG_SEGA315_5313_LV6_IRQ_CALLBACK(WRITELINE(*this, calcune_state, vdp_lv6irqline_callback_genesis_68k));
- MCFG_SEGA315_5313_LV4_IRQ_CALLBACK(WRITELINE(*this, calcune_state, vdp_lv4irqline_callback_genesis_68k));
- MCFG_SEGA315_5313_ALT_TIMING(1);
- MCFG_SEGA315_5313_PAL_WRITE_BASE(0x0000);
- MCFG_SEGA315_5313_PALETTE("palette")
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 0.25)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker",0.25)
-
- MCFG_DEVICE_ADD("gen_vdp2", SEGA315_5313, MASTER_CLOCK_NTSC, "maincpu")
- MCFG_SEGA315_5313_IS_PAL(false)
+ screen_device &screen(SCREEN(config, "megadriv", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0)); // Vblank handled manually.
+ screen.set_size(64*8, 620);
+ screen.set_visarea(0, 40*8-1, 0, 28*8-1);
+ screen.set_screen_update(FUNC(calcune_state::screen_update_calcune));
+
+ SEGA315_5313(config, m_vdp, MASTER_CLOCK_NTSC, m_maincpu);
+ m_vdp->set_is_pal(false);
+ m_vdp->snd_irq().set(FUNC(calcune_state::vdp_sndirqline_callback_genesis_z80));
+ m_vdp->lv6_irq().set(FUNC(calcune_state::vdp_lv6irqline_callback_genesis_68k));
+ m_vdp->lv4_irq().set(FUNC(calcune_state::vdp_lv4irqline_callback_genesis_68k));
+ m_vdp->set_alt_timing(1);
+ m_vdp->set_pal_write_base(0x0000);
+ m_vdp->set_palette(m_palette);
+ m_vdp->add_route(ALL_OUTPUTS, "lspeaker", 0.25);
+ m_vdp->add_route(ALL_OUTPUTS, "rspeaker", 0.25);
+
+ SEGA315_5313(config, m_vdp2, MASTER_CLOCK_NTSC, m_maincpu);
+ m_vdp2->set_is_pal(false);
// are these not hooked up or should they OR with the other lines?
-// MCFG_SEGA315_5313_SND_IRQ_CALLBACK(WRITELINE(*this, calcune_state, vdp_sndirqline_callback_genesis_z80));
-// MCFG_SEGA315_5313_LV6_IRQ_CALLBACK(WRITELINE(*this, calcune_state, vdp_lv6irqline_callback_genesis_68k));
-// MCFG_SEGA315_5313_LV4_IRQ_CALLBACK(WRITELINE(*this, calcune_state, vdp_lv4irqline_callback_genesis_68k));
- MCFG_SEGA315_5313_ALT_TIMING(1);
- MCFG_SEGA315_5313_PAL_WRITE_BASE(0x0c0);
- MCFG_SEGA315_5313_PALETTE("palette")
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 0.25)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker",0.25)
+// m_vdp2->snd_irq().set(FUNC(calcune_state::vdp_sndirqline_callback_genesis_z80));
+// m_vdp2->lv6_irq().set(FUNC(calcune_state::vdp_lv6irqline_callback_genesis_68k));
+// m_vdp2->lv4_irq().set(FUNC(calcune_state::vdp_lv4irqline_callback_genesis_68k));
+ m_vdp2->set_alt_timing(1);
+ m_vdp2->set_pal_write_base(0x0c0);
+ m_vdp2->set_palette(m_palette);
+ m_vdp2->add_route(ALL_OUTPUTS, "lspeaker", 0.25);
+ m_vdp2->add_route(ALL_OUTPUTS, "rspeaker", 0.25);
- MCFG_TIMER_DEVICE_ADD_SCANLINE("scantimer", "gen_vdp", sega315_5313_device, megadriv_scanline_timer_callback_alt_timing, "megadriv", 0, 1)
- MCFG_TIMER_DEVICE_ADD_SCANLINE("scantimer2", "gen_vdp2", sega315_5313_device, megadriv_scanline_timer_callback_alt_timing, "megadriv", 0, 1)
+ TIMER(config, "scantimer").configure_scanline("gen_vdp", FUNC(sega315_5313_device::megadriv_scanline_timer_callback_alt_timing), "megadriv", 0, 1);
+ TIMER(config, "scantimer2").configure_scanline("gen_vdp2", FUNC(sega315_5313_device::megadriv_scanline_timer_callback_alt_timing), "megadriv", 0, 1);
- MCFG_PALETTE_ADD("palette", 0xc0*2)
+ PALETTE(config, m_palette).set_entries(0xc0*2);
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
@@ -301,10 +301,10 @@ MACHINE_CONFIG_START(calcune_state::calcune)
SPEAKER(config, "lspeaker").front_left();
SPEAKER(config, "rspeaker").front_right();
- MCFG_DEVICE_ADD("ymz", YMZ280B, XTAL(16'934'400))
- MCFG_SOUND_ROUTE(0, "lspeaker", 1.0)
- MCFG_SOUND_ROUTE(1, "rspeaker", 1.0)
-MACHINE_CONFIG_END
+ ymz280b_device &ymz(YMZ280B(config, "ymz", XTAL(16'934'400)));
+ ymz.add_route(0, "lspeaker", 1.0);
+ ymz.add_route(1, "rspeaker", 1.0);
+}
void calcune_state::init_calcune()
{
diff --git a/src/mame/drivers/calomega.cpp b/src/mame/drivers/calomega.cpp
index ab1c504dae1..7ab70433082 100644
--- a/src/mame/drivers/calomega.cpp
+++ b/src/mame/drivers/calomega.cpp
@@ -2570,11 +2570,12 @@ WRITE_LINE_MEMBER(calomega_state::write_acia_clock)
* Machine Drivers *
*************************************************/
-MACHINE_CONFIG_START(calomega_state::sys903)
+void calomega_state::sys903(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M6502, CPU_CLOCK) /* confirmed */
- MCFG_DEVICE_PROGRAM_MAP(sys903_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", calomega_state, irq0_line_hold)
+ M6502(config, m_maincpu, CPU_CLOCK); /* confirmed */
+ m_maincpu->set_addrmap(AS_PROGRAM, &calomega_state::sys903_map);
+ m_maincpu->set_vblank_int("screen", FUNC(calomega_state::irq0_line_hold));
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
@@ -2588,13 +2589,13 @@ MACHINE_CONFIG_START(calomega_state::sys903)
m_pia[1]->writepb_handler().set(FUNC(calomega_state::s903_mux_w));
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE((39+1)*8, (31+1)*8) /* Taken from MC6845 init, registers 00 & 04. Normally programmed with (value-1) */
- MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 0*8, 31*8-1) /* Taken from MC6845 init, registers 01 & 06 */
- MCFG_SCREEN_UPDATE_DRIVER(calomega_state, screen_update_calomega)
- MCFG_SCREEN_PALETTE(m_palette)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size((39+1)*8, (31+1)*8); /* Taken from MC6845 init, registers 00 & 04. Normally programmed with (value-1) */
+ screen.set_visarea(0*8, 32*8-1, 0*8, 31*8-1); /* Taken from MC6845 init, registers 01 & 06 */
+ screen.set_screen_update(FUNC(calomega_state::screen_update_calomega));
+ screen.set_palette(m_palette);
GFXDECODE(config, m_gfxdecode, m_palette, gfx_calomega);
PALETTE(config, m_palette, FUNC(calomega_state::calomega_palette), 256); // or 128? is the upper half of the PROMs really valid colors?
@@ -2614,35 +2615,35 @@ MACHINE_CONFIG_START(calomega_state::sys903)
ACIA6850(config, m_acia6850_0, 0);
m_acia6850_0->txd_handler().set(FUNC(calomega_state::write_acia_tx));
- MCFG_DEVICE_ADD("aciabaud", CLOCK, UART_CLOCK)
- MCFG_CLOCK_SIGNAL_HANDLER(WRITELINE(*this, calomega_state, write_acia_clock))
-MACHINE_CONFIG_END
+ clock_device &aciabaud(CLOCK(config, "aciabaud", UART_CLOCK));
+ aciabaud.signal_handler().set(FUNC(calomega_state::write_acia_clock));
+}
-MACHINE_CONFIG_START(calomega_state::s903mod)
+void calomega_state::s903mod(machine_config &config)
+{
sys903(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(s903mod_map)
+ m_maincpu->set_addrmap(AS_PROGRAM, &calomega_state::s903mod_map);
/* sound hardware */
subdevice<ay8912_device>("ay8912")->port_a_read_callback().set_constant(0);
- MCFG_DEVICE_REMOVE("acia6850_0")
+ config.device_remove("acia6850_0");
- MCFG_DEVICE_REMOVE("aciabaud")
-MACHINE_CONFIG_END
+ config.device_remove("aciabaud");
+}
-MACHINE_CONFIG_START(calomega_state::sys905)
+void calomega_state::sys905(machine_config &config)
+{
sys903(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(sys905_map)
+ m_maincpu->set_addrmap(AS_PROGRAM, &calomega_state::sys905_map);
m_pia[0]->readpa_handler().set(FUNC(calomega_state::s905_mux_port_r));
m_pia[0]->writepb_handler().set(FUNC(calomega_state::lamps_905_w));
@@ -2652,19 +2653,20 @@ MACHINE_CONFIG_START(calomega_state::sys905)
/* sound hardware */
subdevice<ay8912_device>("ay8912")->port_a_read_callback().set_constant(0);
- MCFG_DEVICE_REMOVE("acia6850_0")
+ config.device_remove("acia6850_0");
- MCFG_DEVICE_REMOVE("aciabaud")
-MACHINE_CONFIG_END
+ config.device_remove("aciabaud");
+}
-MACHINE_CONFIG_START(calomega_state::sys906)
+void calomega_state::sys906(machine_config &config)
+{
sys903(config);
/* basic machine hardware */
- MCFG_DEVICE_REPLACE("maincpu", M65C02, CPU_CLOCK) /* guess */
- MCFG_DEVICE_PROGRAM_MAP(sys906_map)
+ M65C02(config.replace(), m_maincpu, CPU_CLOCK); /* guess */
+ m_maincpu->set_addrmap(AS_PROGRAM, &calomega_state::sys906_map);
m_pia[0]->readpa_handler().set(FUNC(calomega_state::pia0_ain_r));
m_pia[0]->readpb_handler().set(FUNC(calomega_state::pia0_bin_r));
@@ -2677,15 +2679,14 @@ MACHINE_CONFIG_START(calomega_state::sys906)
m_pia[1]->writepa_handler().set(FUNC(calomega_state::pia1_aout_w));
m_pia[1]->writepb_handler().set(FUNC(calomega_state::pia1_bout_w));
- MCFG_GFXDECODE_MODIFY("gfxdecode", gfx_sys906)
+ m_gfxdecode->set_info(gfx_sys906);
/* sound hardware */
subdevice<ay8912_device>("ay8912")->port_a_read_callback().set_ioport("SW2"); /* From PCB pic. Value is stored at $0539 */
- MCFG_DEVICE_REMOVE("acia6850_0")
-
- MCFG_DEVICE_REMOVE("aciabaud")
-MACHINE_CONFIG_END
+ config.device_remove("acia6850_0");
+ config.device_remove("aciabaud");
+}
/*************************************************
diff --git a/src/mame/drivers/calorie.cpp b/src/mame/drivers/calorie.cpp
index 7f834415829..5d3236a7d39 100644
--- a/src/mame/drivers/calorie.cpp
+++ b/src/mame/drivers/calorie.cpp
@@ -465,28 +465,28 @@ void calorie_state::machine_reset()
}
-MACHINE_CONFIG_START(calorie_state::calorie)
-
+void calorie_state::calorie(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80,4000000) /* 4 MHz */
- MCFG_DEVICE_PROGRAM_MAP(calorie_map)
- MCFG_DEVICE_OPCODES_MAP(decrypted_opcodes_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", calorie_state, irq0_line_hold)
+ Z80(config, m_maincpu, 4000000); /* 4 MHz */
+ m_maincpu->set_addrmap(AS_PROGRAM, &calorie_state::calorie_map);
+ m_maincpu->set_addrmap(AS_OPCODES, &calorie_state::decrypted_opcodes_map);
+ m_maincpu->set_vblank_int("screen", FUNC(calorie_state::irq0_line_hold));
- MCFG_DEVICE_ADD("audiocpu", Z80,3000000) /* 3 MHz */
- MCFG_DEVICE_PROGRAM_MAP(calorie_sound_map)
- MCFG_DEVICE_IO_MAP(calorie_sound_io_map)
- MCFG_DEVICE_PERIODIC_INT_DRIVER(calorie_state, irq0_line_hold, 64)
+ z80_device &audiocpu(Z80(config, "audiocpu", 3000000)); /* 3 MHz */
+ audiocpu.set_addrmap(AS_PROGRAM, &calorie_state::calorie_sound_map);
+ audiocpu.set_addrmap(AS_IO, &calorie_state::calorie_sound_io_map);
+ audiocpu.set_periodic_int(FUNC(calorie_state::irq0_line_hold), attotime::from_hz(64));
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(256, 256)
- MCFG_SCREEN_VISIBLE_AREA(0, 256-1, 16, 256-16-1)
- MCFG_SCREEN_UPDATE_DRIVER(calorie_state, screen_update_calorie)
- MCFG_SCREEN_PALETTE(m_palette)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(256, 256);
+ screen.set_visarea(0, 256-1, 16, 256-16-1);
+ screen.set_screen_update(FUNC(calorie_state::screen_update_calorie));
+ screen.set_palette(m_palette);
GFXDECODE(config, m_gfxdecode, m_palette, gfx_calorie);
PALETTE(config, m_palette).set_format(palette_device::xBGR_444, 0x100);
@@ -501,7 +501,7 @@ MACHINE_CONFIG_START(calorie_state::calorie)
YM2149(config, "ay2", 1500000).add_route(ALL_OUTPUTS, "mono", 0.8);
YM2149(config, "ay3", 1500000).add_route(ALL_OUTPUTS, "mono", 0.8);
-MACHINE_CONFIG_END
+}
void calorie_state::caloriee(machine_config &config)
{
diff --git a/src/mame/drivers/camplynx.cpp b/src/mame/drivers/camplynx.cpp
index 7f05a0cfd4c..4252753af13 100644
--- a/src/mame/drivers/camplynx.cpp
+++ b/src/mame/drivers/camplynx.cpp
@@ -856,8 +856,7 @@ void camplynx_state::lynx_common(machine_config &config)
/* sound hardware */
SPEAKER(config, "speaker").front_center();
DAC_6BIT_R2R(config, m_dac, 0).add_route(ALL_OUTPUTS, "speaker", 0.375); // unknown DAC
- VOLTAGE_REGULATOR(config, "vref").set_output(5.0)
- .add_route(0, m_dac, 1.0, DAC_VREF_POS_INPUT).add_route(0, m_dac, -1.0, DAC_VREF_NEG_INPUT);
+ VOLTAGE_REGULATOR(config, "vref").add_route(0, m_dac, 1.0, DAC_VREF_POS_INPUT).add_route(0, m_dac, -1.0, DAC_VREF_NEG_INPUT);
WAVE(config, "wave", "cassette").add_route(ALL_OUTPUTS, "speaker", 0.02);
}
@@ -868,7 +867,8 @@ void camplynx_state::lynx_disk(machine_config &config)
FLOPPY_CONNECTOR(config, m_floppy1, camplynx_floppies, "525qd", camplynx_state::camplynx_floppy_formats).enable_sound(true);
}
-MACHINE_CONFIG_START(camplynx_state::lynx48k)
+void camplynx_state::lynx48k(machine_config &config)
+{
/* basic machine hardware */
Z80(config, m_maincpu, 24_MHz_XTAL / 6);
m_maincpu->set_addrmap(AS_PROGRAM, &camplynx_state::lynx48k_mem);
@@ -877,19 +877,19 @@ MACHINE_CONFIG_START(camplynx_state::lynx48k)
MCFG_MACHINE_RESET_OVERRIDE(camplynx_state, lynx48k)
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(50)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */
- MCFG_SCREEN_SIZE(512, 480)
- MCFG_SCREEN_VISIBLE_AREA(0, 511, 0, 479)
- MCFG_SCREEN_UPDATE_DEVICE("crtc", mc6845_device, screen_update)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(50);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */
+ screen.set_size(512, 480);
+ screen.set_visarea_full();
+ screen.set_screen_update("crtc", FUNC(mc6845_device::screen_update));
lynx_common(config);
- MCFG_CASSETTE_ADD("cassette")
- MCFG_CASSETTE_FORMATS(lynx48k_cassette_formats)
- MCFG_CASSETTE_DEFAULT_STATE(CASSETTE_PLAY | CASSETTE_SPEAKER_ENABLED | CASSETTE_MOTOR_DISABLED)
- MCFG_CASSETTE_INTERFACE("camplynx_cass")
+ CASSETTE(config, m_cass);
+ m_cass->set_formats(lynx48k_cassette_formats);
+ m_cass->set_default_state(CASSETTE_PLAY | CASSETTE_SPEAKER_ENABLED | CASSETTE_MOTOR_DISABLED);
+ m_cass->set_interface("camplynx_cass");
/* devices */
MC6845(config, m_crtc, 12_MHz_XTAL / 8);
@@ -901,7 +901,7 @@ MACHINE_CONFIG_START(camplynx_state::lynx48k)
/* software lists */
SOFTWARE_LIST(config, "cass_list").set_original("camplynx_cass");
-MACHINE_CONFIG_END
+}
void camplynx_state::lynx96k(machine_config &config)
{
@@ -915,7 +915,8 @@ void camplynx_state::lynx96k(machine_config &config)
SOFTWARE_LIST(config, "flop_list").set_original("camplynx_flop").set_filter("96K");
}
-MACHINE_CONFIG_START(camplynx_state::lynx128k)
+void camplynx_state::lynx128k(machine_config &config)
+{
/* basic machine hardware */
Z80(config, m_maincpu, 24_MHz_XTAL / 4);
m_maincpu->set_addrmap(AS_PROGRAM, &camplynx_state::lynx128k_mem);
@@ -924,19 +925,19 @@ MACHINE_CONFIG_START(camplynx_state::lynx128k)
MCFG_MACHINE_RESET_OVERRIDE(camplynx_state, lynx128k)
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(50)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */
- MCFG_SCREEN_SIZE(512, 480)
- MCFG_SCREEN_VISIBLE_AREA(0, 511, 0, 479)
- MCFG_SCREEN_UPDATE_DEVICE("crtc", mc6845_device, screen_update)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(50);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */
+ screen.set_size(512, 480);
+ screen.set_visarea_full();
+ screen.set_screen_update("crtc", FUNC(mc6845_device::screen_update));
lynx_common(config);
- MCFG_CASSETTE_ADD("cassette")
- MCFG_CASSETTE_FORMATS(lynx128k_cassette_formats)
- MCFG_CASSETTE_DEFAULT_STATE(CASSETTE_PLAY | CASSETTE_SPEAKER_ENABLED | CASSETTE_MOTOR_DISABLED)
- MCFG_CASSETTE_INTERFACE("camplynx_cass")
+ CASSETTE(config, m_cass);
+ m_cass->set_formats(lynx128k_cassette_formats);
+ m_cass->set_default_state(CASSETTE_PLAY | CASSETTE_SPEAKER_ENABLED | CASSETTE_MOTOR_DISABLED);
+ m_cass->set_interface("camplynx_cass");
/* devices */
MC6845(config, m_crtc, 12_MHz_XTAL / 8);
@@ -951,7 +952,7 @@ MACHINE_CONFIG_START(camplynx_state::lynx128k)
/* software lists */
SOFTWARE_LIST(config, "cass_list").set_original("camplynx_cass");
SOFTWARE_LIST(config, "flop_list").set_original("camplynx_flop").set_filter("128K");
-MACHINE_CONFIG_END
+}
void camplynx_state::init_lynx48k()
{
diff --git a/src/mame/drivers/candela.cpp b/src/mame/drivers/candela.cpp
index d08f6cb02f5..09528cc6d03 100644
--- a/src/mame/drivers/candela.cpp
+++ b/src/mame/drivers/candela.cpp
@@ -305,19 +305,19 @@ READ8_MEMBER( can09t_state::read )
{
case X0XX: // ACIA
LOGPLA("-- ACIA\n");
- byte = m_acia->read(space, offset & 1);
+ byte = m_acia->read(offset & 1);
break;
case X1XX: // SYSPIA
LOGPLA("-- SYSPIA\n");
- byte = m_syspia->read_alt(space, offset & 3);
+ byte = m_syspia->read_alt(offset & 3);
break;
case X2XX: // USRPIA
LOGPLA("-- USRPIA\n");
- byte = m_usrpia->read_alt(space, offset & 3);
+ byte = m_usrpia->read_alt(offset & 3);
break;
case X3XX: // PTM
LOGPLA("-- PTM\n");
- byte = m_ptm->read(space, offset & 7);
+ byte = m_ptm->read(offset & 7);
break;
case X4XX: //
LOGPLA("-- XX4X\n");
@@ -387,19 +387,19 @@ WRITE8_MEMBER( can09t_state::write )
{
case X0XX: // ACIA
LOGPLA("-- ACIA\n");
- m_acia->write(space, offset & 1, data);
+ m_acia->write(offset & 1, data);
break;
case X1XX: // SYSPIA
LOGPLA("-- SYSPIA\n");
- m_syspia->write_alt(space, offset & 3, data);
+ m_syspia->write_alt(offset & 3, data);
break;
case X2XX: // USRPIA
LOGPLA("-- USRPIA\n");
- m_usrpia->write_alt(space, offset & 3, data);
+ m_usrpia->write_alt(offset & 3, data);
break;
case X3XX: // PTM
LOGPLA("-- PTM\n");
- m_ptm->write(space, offset & 7, data);
+ m_ptm->write(offset & 7, data);
break;
case X4XX: //
LOGPLA("-- XX4X\n");
@@ -714,9 +714,10 @@ void can09t_state::can09t(machine_config &config)
#define CAN09_X1_CLOCK 22.1184_MHz_XTAL /* UKI 22118.40 Khz */
#define CAN09_CPU_CLOCK (CAN09_X1_CLOCK / 16) /* ~1.38MHz Divider needs to be check but is the most likelly */
-MACHINE_CONFIG_START(can09_state::can09)
- MCFG_DEVICE_ADD("maincpu", MC6809E, CAN09_CPU_CLOCK) // MC68A09EP
- MCFG_DEVICE_PROGRAM_MAP(can09_map)
+void can09_state::can09(machine_config &config)
+{
+ MC6809E(config, m_maincpu, CAN09_CPU_CLOCK); // MC68A09EP
+ m_maincpu->set_addrmap(AS_PROGRAM, &can09_state::can09_map);
/* RAM banks */
RAM(config, RAM_TAG).set_default_size("768K");
@@ -752,18 +753,18 @@ MACHINE_CONFIG_START(can09_state::can09)
/* screen - totally faked value for now */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(50)
- MCFG_SCREEN_RAW_PARAMS(4_MHz_XTAL / 2, 512, 0, 512, 576, 0, 576)
- MCFG_SCREEN_UPDATE_DRIVER(can09_state, screen_update)
- MCFG_SCREEN_PALETTE("palette")
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(50);
+ screen.set_raw(4_MHz_XTAL / 2, 512, 0, 512, 576, 0, 576);
+ screen.set_screen_update(FUNC(can09_state::screen_update));
+ screen.set_palette("palette");
PALETTE(config, "palette", palette_device::MONOCHROME);
/* Floppy */
WD1770(config, "wd1770", 8_MHz_XTAL); // TODO: Verify 8MHz UKI crystal assumed to be used
#if 0
- MCFG_FLOPPY_DRIVE_ADD("wd1770:0", candela_floppies, "3dd", floppy_image_device::default_floppy_formats)
- MCFG_SOFTWARE_LIST_ADD("flop3_list", "candela")
+ FLOPPY_CONNECTOR(config, "wd1770:0", candela_floppies, "3dd", floppy_image_device::default_floppy_formats);
+ SOFTWARE_LIST(config, "flop3_list").set_original("candela");
#endif
/* --PIA inits----------------------- */
@@ -782,11 +783,11 @@ MACHINE_CONFIG_START(can09_state::can09)
/* 0xFF93 0xE034 (PIA1 Port B) = 0x18 - Write Data on Port B */
#if 1
- MCFG_DEVICE_ADD(PIA2_TAG, PIA6821, 0) // CPU board
- MCFG_DEVICE_ADD("acia1", ACIA6850, 0) // CPU board
- MCFG_DEVICE_ADD("acia2", ACIA6850, 0) // CPU board
+ PIA6821(config, PIA2_TAG, 0); // CPU board
+ ACIA6850(config, "acia1", 0); // CPU board
+ ACIA6850(config, "acia2", 0); // CPU board
#endif
-MACHINE_CONFIG_END
+}
ROM_START( can09t ) /* The smaller grey computer */
ROM_REGION(0x10000, "roms", 0)
diff --git a/src/mame/drivers/canon_s80.cpp b/src/mame/drivers/canon_s80.cpp
index ab08eab9614..d103fa2cfcc 100644
--- a/src/mame/drivers/canon_s80.cpp
+++ b/src/mame/drivers/canon_s80.cpp
@@ -39,11 +39,12 @@ void canons80_state::canons80_map(address_map &map)
map(0x8000, 0xffff).rom();
}
-MACHINE_CONFIG_START(canons80_state::canons80)
+void canons80_state::canons80(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", HD6301, 5000000) /* hd63a01xop 5 MHz guessed: TODO: check on PCB */
- MCFG_DEVICE_PROGRAM_MAP(canons80_map)
-MACHINE_CONFIG_END
+ hd6301_cpu_device &maincpu(HD6301(config, "maincpu", 5000000)); /* hd63a01xop 5 MHz guessed: TODO: check on PCB */
+ maincpu.set_addrmap(AS_PROGRAM, &canons80_state::canons80_map);
+}
void canons80_state::init_canons80()
{
diff --git a/src/mame/drivers/canyon.cpp b/src/mame/drivers/canyon.cpp
index cbb137f3ec6..22e5d3b0822 100644
--- a/src/mame/drivers/canyon.cpp
+++ b/src/mame/drivers/canyon.cpp
@@ -239,11 +239,11 @@ GFXDECODE_END
*
*************************************/
-MACHINE_CONFIG_START(canyon_state::canyon)
-
+void canyon_state::canyon(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M6502, 12.096_MHz_XTAL / 16)
- MCFG_DEVICE_PROGRAM_MAP(main_map)
+ M6502(config, m_maincpu, 12.096_MHz_XTAL / 16);
+ m_maincpu->set_addrmap(AS_PROGRAM, &canyon_state::main_map);
F9334(config, m_outlatch); // C7
m_outlatch->q_out_cb<0>().set("discrete", FUNC(discrete_device::write_line<CANYON_WHISTLE1_EN>));
@@ -256,23 +256,23 @@ MACHINE_CONFIG_START(canyon_state::canyon)
WATCHDOG_TIMER(config, m_watchdog).set_vblank_count("screen", 8);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_RAW_PARAMS(12.096_MHz_XTAL / 2, 384, 0, 256, 262, 0, 240) // HSYNC = 15,750 Hz
- MCFG_SCREEN_UPDATE_DRIVER(canyon_state, screen_update_canyon)
- MCFG_SCREEN_PALETTE(m_palette)
- MCFG_SCREEN_VBLANK_CALLBACK(INPUTLINE("maincpu", m6502_device::NMI_LINE))
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_raw(12.096_MHz_XTAL / 2, 384, 0, 256, 262, 0, 240); // HSYNC = 15,750 Hz
+ screen.set_screen_update(FUNC(canyon_state::screen_update_canyon));
+ screen.set_palette(m_palette);
+ screen.screen_vblank().set_inputline(m_maincpu, m6502_device::NMI_LINE);
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, m_palette, gfx_canyon)
+ GFXDECODE(config, m_gfxdecode, m_palette, gfx_canyon);
PALETTE(config, m_palette, FUNC(canyon_state::canyon_palette), 4);
/* sound hardware */
SPEAKER(config, "lspeaker").front_left();
SPEAKER(config, "rspeaker").front_right();
- MCFG_DEVICE_ADD("discrete", DISCRETE, canyon_discrete)
- MCFG_SOUND_ROUTE(0, "lspeaker", 1.0)
- MCFG_SOUND_ROUTE(1, "rspeaker", 1.0)
-MACHINE_CONFIG_END
+ DISCRETE(config, m_discrete, canyon_discrete);
+ m_discrete->add_route(0, "lspeaker", 1.0);
+ m_discrete->add_route(1, "rspeaker", 1.0);
+}
diff --git a/src/mame/drivers/capbowl.cpp b/src/mame/drivers/capbowl.cpp
index fec21ecd991..4475eb512b2 100644
--- a/src/mame/drivers/capbowl.cpp
+++ b/src/mame/drivers/capbowl.cpp
@@ -316,33 +316,35 @@ void capbowl_state::machine_reset()
}
-MACHINE_CONFIG_START(capbowl_state::capbowl)
-
+void capbowl_state::capbowl(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", MC6809E, MASTER_CLOCK / 4) // MC68B09EP
- MCFG_DEVICE_PROGRAM_MAP(capbowl_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", capbowl_state, interrupt)
+ MC6809E(config, m_maincpu, MASTER_CLOCK / 4); // MC68B09EP
+ m_maincpu->set_addrmap(AS_PROGRAM, &capbowl_state::capbowl_map);
+ m_maincpu->set_vblank_int("screen", FUNC(capbowl_state::interrupt));
- WATCHDOG_TIMER(config, m_watchdog).set_time(PERIOD_OF_555_ASTABLE(100000.0, 100000.0, 0.1e-6) * 15.5); // ~0.3s
+ // watchdog: 555 timer 16 cycles, edge triggered, ~0.3s
+ attotime const period = PERIOD_OF_555_ASTABLE(100000.0, 100000.0, 0.1e-6);
+ WATCHDOG_TIMER(config, m_watchdog).set_time(period * 16 - period / 2);
- MCFG_DEVICE_ADD("audiocpu", MC6809E, MASTER_CLOCK / 4) // MC68B09EP
- MCFG_DEVICE_PROGRAM_MAP(sound_map)
+ MC6809E(config, m_audiocpu, MASTER_CLOCK / 4); // MC68B09EP
+ m_audiocpu->set_addrmap(AS_PROGRAM, &capbowl_state::sound_map);
NVRAM(config, "nvram", nvram_device::DEFAULT_RANDOM);
- MCFG_TICKET_DISPENSER_ADD("ticket", attotime::from_msec(100), TICKET_MOTOR_ACTIVE_HIGH, TICKET_STATUS_ACTIVE_LOW)
+ TICKET_DISPENSER(config, "ticket", attotime::from_msec(100), TICKET_MOTOR_ACTIVE_HIGH, TICKET_STATUS_ACTIVE_LOW);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_SIZE(360, 256)
- MCFG_SCREEN_VISIBLE_AREA(0, 359, 0, 244)
- MCFG_SCREEN_REFRESH_RATE(57)
- MCFG_SCREEN_UPDATE_DRIVER(capbowl_state, screen_update)
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_size(360, 256);
+ m_screen->set_visarea(0, 359, 0, 244);
+ m_screen->set_refresh_hz(57);
+ m_screen->set_screen_update(FUNC(capbowl_state::screen_update));
- MCFG_DEVICE_ADD("tms34061", TMS34061, 0)
- MCFG_TMS34061_ROWSHIFT(8) /* VRAM address is (row << rowshift) | col */
- MCFG_TMS34061_VRAM_SIZE(0x10000) /* size of video RAM */
- MCFG_TMS34061_INTERRUPT_CB(INPUTLINE("maincpu", M6809_FIRQ_LINE)) /* interrupt gen callback */
+ TMS34061(config, m_tms34061, 0);
+ m_tms34061->set_rowshift(8); /* VRAM address is (row << rowshift) | col */
+ m_tms34061->set_vram_size(0x10000);
+ m_tms34061->int_callback().set_inputline("maincpu", M6809_FIRQ_LINE);
/* sound hardware */
SPEAKER(config, "speaker").front_center();
@@ -359,23 +361,23 @@ MACHINE_CONFIG_START(capbowl_state::capbowl)
ymsnd.add_route(3, "speaker", 0.75);
DAC0832(config, "dac", 0).add_route(ALL_OUTPUTS, "speaker", 0.5);
- MCFG_DEVICE_ADD("vref", VOLTAGE_REGULATOR, 0) MCFG_VOLTAGE_REGULATOR_OUTPUT(5.0)
- MCFG_SOUND_ROUTE(0, "dac", 1.0, DAC_VREF_POS_INPUT) MCFG_SOUND_ROUTE(0, "dac", -1.0, DAC_VREF_NEG_INPUT)
-MACHINE_CONFIG_END
+ voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref"));
+ vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT);
+ vref.add_route(0, "dac", -1.0, DAC_VREF_NEG_INPUT);
+}
-MACHINE_CONFIG_START(capbowl_state::bowlrama)
+void capbowl_state::bowlrama(machine_config &config)
+{
capbowl(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(bowlrama_map)
+ m_maincpu->set_addrmap(AS_PROGRAM, &capbowl_state::bowlrama_map);
/* video hardware */
- MCFG_SCREEN_MODIFY("screen")
- MCFG_SCREEN_VISIBLE_AREA(0, 359, 0, 239)
-MACHINE_CONFIG_END
+ m_screen->set_visarea(0, 359, 0, 239);
+}
diff --git a/src/mame/drivers/capcom.cpp b/src/mame/drivers/capcom.cpp
index 5bfc2af9c90..9ce5ced5903 100644
--- a/src/mame/drivers/capcom.cpp
+++ b/src/mame/drivers/capcom.cpp
@@ -46,11 +46,12 @@ void capcom_state::init_capcom()
{
}
-MACHINE_CONFIG_START(capcom_state::capcom)
+void capcom_state::capcom(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M68000, 16670000) // M68306
- MCFG_DEVICE_PROGRAM_MAP(capcom_map)
-MACHINE_CONFIG_END
+ M68000(config, m_maincpu, 16670000); // M68306
+ m_maincpu->set_addrmap(AS_PROGRAM, &capcom_state::capcom_map);
+}
/*-------------------------------------------------------------------
/ Airborne (03/96)
diff --git a/src/mame/drivers/caprcyc.cpp b/src/mame/drivers/caprcyc.cpp
index ef07509a8f3..c4debe1e3b6 100644
--- a/src/mame/drivers/caprcyc.cpp
+++ b/src/mame/drivers/caprcyc.cpp
@@ -63,17 +63,17 @@ INPUT_PORTS_END
***************************************************************************/
-MACHINE_CONFIG_START(caprcyc_state::caprcyc)
-
+void caprcyc_state::caprcyc(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", VR4300BE, 100000000) // cpu configuration is unknown
- MCFG_DEVICE_PROGRAM_MAP(caprcyc_map)
+ VR4300BE(config, m_maincpu, 100000000); // cpu configuration is unknown
+ m_maincpu->set_addrmap(AS_PROGRAM, &caprcyc_state::caprcyc_map);
/* no video! */
/* sound hardware */
//..
-MACHINE_CONFIG_END
+}
diff --git a/src/mame/drivers/cardinal.cpp b/src/mame/drivers/cardinal.cpp
index 586ac76c7a3..30890c3299f 100644
--- a/src/mame/drivers/cardinal.cpp
+++ b/src/mame/drivers/cardinal.cpp
@@ -16,10 +16,12 @@
#include "emu.h"
#include "cpu/mcs51/mcs51.h"
-//#include "bus/rs232/rs232.h"
+#include "bus/rs232/rs232.h"
#include "machine/eepromser.h"
-//#include "video/crt9028.h"
+#include "sound/spkrdev.h"
+#include "video/crt9028.h"
#include "screen.h"
+#include "speaker.h"
class cardinal_state : public driver_device
{
@@ -27,6 +29,9 @@ public:
cardinal_state(const machine_config &mconfig, device_type type, const char *tag)
: driver_device(mconfig, type, tag)
, m_eeprom(*this, "eeprom")
+ , m_vtlc(*this, "vtlc")
+ , m_speaker(*this, "speaker")
+ , m_rs232(*this, "rs232")
, m_address_select(false)
{
}
@@ -37,8 +42,6 @@ protected:
virtual void machine_start() override;
private:
- u32 screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
-
u8 p1_r();
void p1_w(u8 data);
@@ -47,9 +50,12 @@ private:
void prog_map(address_map &map);
void ext_map(address_map &map);
+ void ram_map(address_map &map);
required_device<eeprom_serial_93cxx_device> m_eeprom;
- //required_device<crt9028_device> m_vtlc;
+ required_device<crt9028_device> m_vtlc;
+ required_device<speaker_sound_device> m_speaker;
+ required_device<rs232_port_device> m_rs232;
bool m_address_select;
};
@@ -60,14 +66,9 @@ void cardinal_state::machine_start()
save_item(NAME(m_address_select));
}
-u32 cardinal_state::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect)
-{
- return 0;
-}
-
u8 cardinal_state::p1_r()
{
- return 0xdf | (m_eeprom->do_read() << 5);
+ return 0x9f | (m_eeprom->do_read() << 5) | (0 /*m_rs232->cts_r()*/ << 6);
}
void cardinal_state::p1_w(u8 data)
@@ -77,16 +78,19 @@ void cardinal_state::p1_w(u8 data)
m_eeprom->clk_write(BIT(data, 3));
m_address_select = BIT(data, 1);
+
+ m_speaker->level_w(!BIT(data, 2));
+ m_rs232->write_rts(BIT(data, 7));
}
u8 cardinal_state::vtlc_r()
{
- return 0xff;
+ return m_vtlc->read(m_address_select);
}
void cardinal_state::vtlc_w(u8 data)
{
- logerror("%s: Writing %02X to CRT9028 %s register\n", machine().describe_context(), data, m_address_select ? "address" : "data");
+ m_vtlc->write(m_address_select, data);
}
void cardinal_state::prog_map(address_map &map)
@@ -96,13 +100,27 @@ void cardinal_state::prog_map(address_map &map)
void cardinal_state::ext_map(address_map &map)
{
- map(0xff00, 0xff00).mirror(0xff).rw(FUNC(cardinal_state::vtlc_r), FUNC(cardinal_state::vtlc_w));
+ map(0, 0).mirror(0xffff).rw(FUNC(cardinal_state::vtlc_r), FUNC(cardinal_state::vtlc_w));
+}
+
+void cardinal_state::ram_map(address_map &map)
+{
+ map(0x000, 0x7ff).ram();
}
static INPUT_PORTS_START(cardinal)
+ PORT_START("P3")
+ PORT_DIPNAME(0x10, 0x00, "Keyboard Baud Rate")
+ PORT_DIPSETTING(0x10, "300")
+ PORT_DIPSETTING(0x00, "600")
+ PORT_BIT(0xef, IP_ACTIVE_LOW, IPT_UNUSED)
INPUT_PORTS_END
+static DEVICE_INPUT_DEFAULTS_START(keyboard)
+ DEVICE_INPUT_DEFAULTS("RS232_TXBAUD", 0xff, RS232_BAUD_600)
+DEVICE_INPUT_DEFAULTS_END
+
void cardinal_state::cardinal(machine_config &config)
{
@@ -111,15 +129,25 @@ void cardinal_state::cardinal(machine_config &config)
maincpu.set_addrmap(AS_IO, &cardinal_state::ext_map);
maincpu.port_in_cb<1>().set(FUNC(cardinal_state::p1_r));
maincpu.port_out_cb<1>().set(FUNC(cardinal_state::p1_w));
+ maincpu.port_in_cb<3>().set_ioport("P3");
EEPROM_93C06_16BIT(config, m_eeprom);
- //CRT9028_000(config, m_vtlc, 10.92_MHz_XTAL);
- //m_vtlc->set_screen("screen");
+ CRT9028_000(config, m_vtlc, 10.92_MHz_XTAL);
+ m_vtlc->set_screen("screen");
+ m_vtlc->set_addrmap(0, &cardinal_state::ram_map);
+ m_vtlc->vsync_callback().set_inputline("maincpu", MCS51_INT0_LINE).invert();
+
+ SCREEN(config, "screen", SCREEN_TYPE_RASTER);
+
+ SPEAKER(config, "mono").front_center();
+ SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.05);
+
+ RS232_PORT(config, m_rs232, default_rs232_devices, nullptr);
- screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
- screen.set_raw(10.92_MHz_XTAL, 700, 0, 560, 260, 0, 240);
- screen.set_screen_update(FUNC(cardinal_state::screen_update));
+ rs232_port_device &kb(RS232_PORT(config, "kb", default_rs232_devices, "keyboard"));
+ kb.set_option_device_input_defaults("keyboard", DEVICE_INPUT_DEFAULTS_NAME(keyboard));
+ kb.rxd_handler().set_inputline("maincpu", MCS51_INT1_LINE).invert();
}
diff --git a/src/mame/drivers/cardline.cpp b/src/mame/drivers/cardline.cpp
index 2b41aedbbf6..a9eeb335eda 100644
--- a/src/mame/drivers/cardline.cpp
+++ b/src/mame/drivers/cardline.cpp
@@ -326,8 +326,8 @@ void cardline_state::cardline_palette(palette_device &palette) const
}
}
-MACHINE_CONFIG_START(cardline_state::cardline)
-
+void cardline_state::cardline(machine_config &config)
+{
/* basic machine hardware */
I80C32(config, m_maincpu, MASTER_CLOCK);
m_maincpu->set_port_forced_input(1, 0x10);
@@ -338,14 +338,14 @@ MACHINE_CONFIG_START(cardline_state::cardline)
//m_maincpu->set_vblank_int("screen", FUNC(cardline_state::irq1_line_hold));
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(64*8, 35*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 64*8-1, 0*8, 32*8-1)
- //MCFG_SCREEN_UPDATE_DRIVER(cardline_state, screen_update_cardline)
- //MCFG_SCREEN_PALETTE(m_palette)
- MCFG_SCREEN_UPDATE_DEVICE("crtc", mc6845_device, screen_update)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(64*8, 35*8);
+ screen.set_visarea(0*8, 64*8-1, 0*8, 32*8-1);
+ //screen.set_screen_update(FUNC(cardline_state::screen_update_cardline));
+ //screen.set_palette(m_palette);
+ screen.set_screen_update("crtc", FUNC(mc6845_device::screen_update));
GFXDECODE(config, m_gfxdecode, m_palette, gfx_cardline);
PALETTE(config, m_palette, FUNC(cardline_state::cardline_palette), 512);
@@ -365,11 +365,10 @@ MACHINE_CONFIG_START(cardline_state::cardline)
SPEAKER(config, "lspeaker").front_left();
SPEAKER(config, "rspeaker").front_right();
- MCFG_DEVICE_ADD("oki", OKIM6295, 1056000, okim6295_device::PIN7_HIGH) // clock frequency & pin 7 not verified
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 1.0)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 1.0)
-
-MACHINE_CONFIG_END
+ okim6295_device &oki(OKIM6295(config, "oki", 1056000, okim6295_device::PIN7_HIGH)); // clock frequency & pin 7 not verified
+ oki.add_route(ALL_OUTPUTS, "lspeaker", 1.0);
+ oki.add_route(ALL_OUTPUTS, "rspeaker", 1.0);
+}
/***************************************************************************
diff --git a/src/mame/drivers/carjmbre.cpp b/src/mame/drivers/carjmbre.cpp
index 57be932e911..e482a16d989 100644
--- a/src/mame/drivers/carjmbre.cpp
+++ b/src/mame/drivers/carjmbre.cpp
@@ -356,25 +356,25 @@ static GFXDECODE_START( gfx_carjmbre )
GFXDECODE_END
-MACHINE_CONFIG_START(carjmbre_state::carjmbre)
-
+void carjmbre_state::carjmbre(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, XTAL(18'432'000)/6)
- MCFG_DEVICE_PROGRAM_MAP(main_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", carjmbre_state, vblank_nmi)
+ Z80(config, m_maincpu, XTAL(18'432'000)/6);
+ m_maincpu->set_addrmap(AS_PROGRAM, &carjmbre_state::main_map);
+ m_maincpu->set_vblank_int("screen", FUNC(carjmbre_state::vblank_nmi));
- MCFG_DEVICE_ADD("audiocpu", Z80, XTAL(18'432'000)/6/2)
- MCFG_DEVICE_PROGRAM_MAP(sound_map)
- MCFG_DEVICE_IO_MAP(sound_io_map)
+ Z80(config, m_audiocpu, XTAL(18'432'000)/6/2);
+ m_audiocpu->set_addrmap(AS_PROGRAM, &carjmbre_state::sound_map);
+ m_audiocpu->set_addrmap(AS_IO, &carjmbre_state::sound_io_map);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */)
- MCFG_SCREEN_SIZE(32*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(carjmbre_state, screen_update)
- MCFG_SCREEN_PALETTE(m_palette)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500) /* not accurate */);
+ screen.set_size(32*8, 32*8);
+ screen.set_visarea(0*8, 32*8-1, 2*8, 30*8-1);
+ screen.set_screen_update(FUNC(carjmbre_state::screen_update));
+ screen.set_palette(m_palette);
GFXDECODE(config, m_gfxdecode, m_palette, gfx_carjmbre);
PALETTE(config, m_palette, FUNC(carjmbre_state::carjmbre_palette), 64);
@@ -387,7 +387,7 @@ MACHINE_CONFIG_START(carjmbre_state::carjmbre)
AY8910(config, "ay1", XTAL(18'432'000)/6/2).add_route(ALL_OUTPUTS, "mono", 0.25);
AY8910(config, "ay2", XTAL(18'432'000)/6/2).add_route(ALL_OUTPUTS, "mono", 0.25);
-MACHINE_CONFIG_END
+}
diff --git a/src/mame/drivers/carpolo.cpp b/src/mame/drivers/carpolo.cpp
index 07f3b2906e9..3063e809d50 100644
--- a/src/mame/drivers/carpolo.cpp
+++ b/src/mame/drivers/carpolo.cpp
@@ -231,8 +231,8 @@ GFXDECODE_END
*
*************************************/
-MACHINE_CONFIG_START(carpolo_state::carpolo)
-
+void carpolo_state::carpolo(machine_config &config)
+{
/* basic machine hardware */
M6502(config, m_maincpu, XTAL(11'289'000)/12); /* 940.75 kHz */
m_maincpu->set_addrmap(AS_PROGRAM, &carpolo_state::main_map);
@@ -279,18 +279,18 @@ MACHINE_CONFIG_START(carpolo_state::carpolo)
m_ttl74153_1k->zb_cb().set(FUNC(carpolo_state::ls153_zb_w)); // pia1 pb4
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */)
- MCFG_SCREEN_SIZE(256, 256)
- MCFG_SCREEN_VISIBLE_AREA(0, 239, 0, 255)
- MCFG_SCREEN_UPDATE_DRIVER(carpolo_state, screen_update)
- MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE(*this, carpolo_state, screen_vblank))
- MCFG_SCREEN_PALETTE(m_palette)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500) /* not accurate */);
+ screen.set_size(256, 256);
+ screen.set_visarea(0, 239, 0, 255);
+ screen.set_screen_update(FUNC(carpolo_state::screen_update));
+ screen.screen_vblank().set(FUNC(carpolo_state::screen_vblank));
+ screen.set_palette(m_palette);
GFXDECODE(config, m_gfxdecode, m_palette, gfx_carpolo);
PALETTE(config, m_palette, FUNC(carpolo_state::carpolo_palette), 12*2+2*16+4*2);
-MACHINE_CONFIG_END
+}
diff --git a/src/mame/drivers/carrera.cpp b/src/mame/drivers/carrera.cpp
index 6ba9a74ecc3..5cccb69c5c6 100644
--- a/src/mame/drivers/carrera.cpp
+++ b/src/mame/drivers/carrera.cpp
@@ -315,20 +315,21 @@ void carrera_state::carrera_palette(palette_device &palette) const
}
-MACHINE_CONFIG_START(carrera_state::carrera)
+void carrera_state::carrera(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, MASTER_CLOCK / 6)
- MCFG_DEVICE_PROGRAM_MAP(carrera_map)
- MCFG_DEVICE_IO_MAP(io_map)
+ Z80(config, m_maincpu, MASTER_CLOCK / 6);
+ m_maincpu->set_addrmap(AS_PROGRAM, &carrera_state::carrera_map);
+ m_maincpu->set_addrmap(AS_IO, &carrera_state::io_map);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(512, 256)
- MCFG_SCREEN_VISIBLE_AREA(0, 512-1, 0, 256-1)
- MCFG_SCREEN_UPDATE_DRIVER(carrera_state, screen_update_carrera)
- MCFG_SCREEN_PALETTE(m_palette)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(512, 256);
+ screen.set_visarea_full();
+ screen.set_screen_update(FUNC(carrera_state::screen_update_carrera));
+ screen.set_palette(m_palette);
mc6845_device &crtc(MC6845(config, "crtc", MASTER_CLOCK / 16));
crtc.set_screen("screen");
@@ -347,7 +348,7 @@ MACHINE_CONFIG_START(carrera_state::carrera)
aysnd.port_a_read_callback().set(FUNC(carrera_state::unknown_r));
aysnd.port_b_read_callback().set(FUNC(carrera_state::unknown_r));
aysnd.add_route(ALL_OUTPUTS, "mono", 1.00);
-MACHINE_CONFIG_END
+}
ROM_START( carrera )
diff --git a/src/mame/drivers/casloopy.cpp b/src/mame/drivers/casloopy.cpp
index 060dfdd4a95..a11cf3b67c6 100644
--- a/src/mame/drivers/casloopy.cpp
+++ b/src/mame/drivers/casloopy.cpp
@@ -421,7 +421,7 @@ WRITE8_MEMBER(casloopy_state::bitmap_w)
READ32_MEMBER(casloopy_state::cart_r)
{
- return m_cart->read32_rom(space, offset, mem_mask);
+ return m_cart->read32_rom(offset, mem_mask);
}
@@ -520,26 +520,25 @@ DEVICE_IMAGE_LOAD_MEMBER( casloopy_state, loopy_cart )
MACHINE_CONFIG_START(casloopy_state::casloopy)
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu",SH2A,8000000)
- MCFG_DEVICE_PROGRAM_MAP(casloopy_map)
+ SH2A(config, m_maincpu, 8000000);
+ m_maincpu->set_addrmap(AS_PROGRAM, &casloopy_state::casloopy_map);
-// MCFG_DEVICE_ADD("subcpu",V60,8000000)
-// MCFG_DEVICE_PROGRAM_MAP(casloopy_sub_map)
+// v60_device &subcpu(V60(config, "subcpu", 8000000));
+// subcpu.set_addrmap(AS_PROGRAM, &casloopy_state::casloopy_sub_map);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_RAW_PARAMS(8000000, 444, 0, 256, 263, 0, 224)
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_raw(8000000, 444, 0, 256, 263, 0, 224);
+// m_screen->set_refresh_hz(60);
+// m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(2500));
+// m_screen->set_size(444, 263);
+// m_screen->set_visarea(0*8, 32*8-1, 0*8, 32*8-1);
+ m_screen->set_screen_update(FUNC(casloopy_state::screen_update));
+ m_screen->set_palette(m_palette);
-// MCFG_SCREEN_REFRESH_RATE(60)
-// MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500))
-// MCFG_SCREEN_SIZE(444, 263)
-// MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 0*8, 32*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(casloopy_state, screen_update)
- MCFG_SCREEN_PALETTE("palette")
+ PALETTE(config, m_palette).set_entries(512);
- MCFG_PALETTE_ADD("palette", 512)
-
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfxdecode_device::empty)
+ GFXDECODE(config, m_gfxdecode, m_palette, gfxdecode_device::empty);
MCFG_GENERIC_CARTSLOT_ADD("cartslot", generic_plain_slot, "loopy_cart")
MCFG_GENERIC_EXTENSIONS("bin,ic1")
@@ -549,7 +548,7 @@ MACHINE_CONFIG_START(casloopy_state::casloopy)
MCFG_GENERIC_LOAD(casloopy_state, loopy_cart)
/* software lists */
- MCFG_SOFTWARE_LIST_ADD("cart_list","casloopy")
+ SOFTWARE_LIST(config, "cart_list").set_original("casloopy");
/* sound hardware */
SPEAKER(config, "mono").front_center();
diff --git a/src/mame/drivers/castle.cpp b/src/mame/drivers/castle.cpp
index 1ab9a1b4209..7a10dfd8331 100644
--- a/src/mame/drivers/castle.cpp
+++ b/src/mame/drivers/castle.cpp
@@ -84,13 +84,14 @@ static INPUT_PORTS_START( castrev )
INPUT_PORTS_END
-MACHINE_CONFIG_START(castle_state::castle_V1rvE)
- MCFG_DEVICE_ADD("maincpu", HD6303Y, 1000000)
- MCFG_DEVICE_PROGRAM_MAP(V1rvE_mastermap)
+void castle_state::castle_V1rvE(machine_config &config)
+{
+ HD6303Y(config, m_maincpu, 1000000);
+ m_maincpu->set_addrmap(AS_PROGRAM, &castle_state::V1rvE_mastermap);
- MCFG_DEVICE_ADD("slavecpu", HD6303Y, 1000000)
- MCFG_DEVICE_PROGRAM_MAP(V1rvE_slavemap)
-MACHINE_CONFIG_END
+ hd6303y_cpu_device &slavecpu(HD6303Y(config, "slavecpu", 1000000));
+ slavecpu.set_addrmap(AS_PROGRAM, &castle_state::V1rvE_slavemap);
+}
@@ -102,12 +103,13 @@ void castle_state::V2rvA_map(address_map &map)
}
-MACHINE_CONFIG_START(castle_state::castle_V2rvA)
- MCFG_DEVICE_ADD("maincpu", HD6303Y, 1000000)
- MCFG_DEVICE_PROGRAM_MAP(V2rvA_map)
+void castle_state::castle_V2rvA(machine_config &config)
+{
+ HD6303Y(config, m_maincpu, 1000000);
+ m_maincpu->set_addrmap(AS_PROGRAM, &castle_state::V2rvA_map);
- MCFG_DEVICE_ADD("pia", PIA6821)
-MACHINE_CONFIG_END
+ PIA6821(config, "pia");
+}
ROM_START( castrev )
diff --git a/src/mame/drivers/caswin.cpp b/src/mame/drivers/caswin.cpp
index 3482f04c3e3..36dd70252f3 100644
--- a/src/mame/drivers/caswin.cpp
+++ b/src/mame/drivers/caswin.cpp
@@ -333,25 +333,26 @@ void caswin_state::caswin_palette(palette_device &palette) const
}
-MACHINE_CONFIG_START(caswin_state::vvillage)
+void caswin_state::vvillage(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, 4000000) /* ? MHz */
- MCFG_DEVICE_PROGRAM_MAP(vvillage_mem)
- MCFG_DEVICE_IO_MAP(vvillage_io)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", caswin_state, irq0_line_hold)
+ Z80(config, m_maincpu, 4000000); /* ? MHz */
+ m_maincpu->set_addrmap(AS_PROGRAM, &caswin_state::vvillage_mem);
+ m_maincpu->set_addrmap(AS_IO, &caswin_state::vvillage_io);
+ m_maincpu->set_vblank_int("screen", FUNC(caswin_state::irq0_line_hold));
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(256, 256)
- MCFG_SCREEN_VISIBLE_AREA(0, 256-1, 16, 256-16-1)
- MCFG_SCREEN_UPDATE_DRIVER(caswin_state, screen_update_vvillage)
- MCFG_SCREEN_PALETTE("palette")
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(256, 256);
+ screen.set_visarea(0, 256-1, 16, 256-16-1);
+ screen.set_screen_update(FUNC(caswin_state::screen_update_vvillage));
+ screen.set_palette("palette");
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_vvillage)
+ GFXDECODE(config, m_gfxdecode, "palette", gfx_vvillage);
PALETTE(config, "palette", FUNC(caswin_state::caswin_palette), 0x40);
SPEAKER(config, "mono").front_center();
@@ -360,7 +361,7 @@ MACHINE_CONFIG_START(caswin_state::vvillage)
aysnd.port_a_read_callback().set_ioport("DSW1");
aysnd.port_b_read_callback().set_ioport("DSW2");
aysnd.add_route(ALL_OUTPUTS, "mono", 0.40);
-MACHINE_CONFIG_END
+}
ROM_START( caswin )
ROM_REGION( 0x8000, "maincpu", 0 )
diff --git a/src/mame/drivers/cat.cpp b/src/mame/drivers/cat.cpp
index f56118d5591..8fb88335a64 100644
--- a/src/mame/drivers/cat.cpp
+++ b/src/mame/drivers/cat.cpp
@@ -773,7 +773,7 @@ void cat_state::cat_mem(address_map &map)
map(0x80000c, 0x80000d).r(FUNC(cat_state::cat_0080_r)).mirror(0x18FFE0); // Open bus?
map(0x80000e, 0x80000f).rw(FUNC(cat_state::cat_battery_r), FUNC(cat_state::cat_printer_control_w)).mirror(0x18FFE0); // Centronics Printer Control, keyboard led and country code enable
map(0x800010, 0x80001f).r(FUNC(cat_state::cat_0080_r)).mirror(0x18FFE0); // Open bus?
- map(0x810000, 0x81001f).rw("duartn68681", FUNC(mc68681_device::read), FUNC(mc68681_device::write)).umask16(0x00ff).mirror(0x18FFE0);
+ map(0x810000, 0x81001f).rw(m_duart, FUNC(mc68681_device::read), FUNC(mc68681_device::write)).umask16(0x00ff).mirror(0x18FFE0);
map(0x820000, 0x82003f).rw(FUNC(cat_state::cat_modem_r), FUNC(cat_state::cat_modem_w)).mirror(0x18FFC0); // AMI S35213 Modem Chip, all access is on bit 7
map(0x830000, 0x830001).r(FUNC(cat_state::cat_6ms_counter_r)).mirror(0x18FFFE); // 16bit 6ms counter clocked by output of another 16bit counter clocked at 10mhz
map(0x840000, 0x840001).rw(FUNC(cat_state::cat_2e80_r), FUNC(cat_state::cat_opr_w)).mirror(0x18FFFE); // GA2 Output port register (video enable, invert, watchdog reset, phone relays)
@@ -1054,42 +1054,44 @@ WRITE_LINE_MEMBER(cat_state::prn_ack_ff) // switch the flipflop state on the ris
#endif
}
-MACHINE_CONFIG_START(cat_state::cat)
-
+void cat_state::cat(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu",M68000, XTAL(19'968'000)/4)
- MCFG_DEVICE_PROGRAM_MAP(cat_mem)
- MCFG_DEVICE_IRQ_ACKNOWLEDGE_DRIVER(cat_state,cat_int_ack)
+ M68000(config, m_maincpu, XTAL(19'968'000)/4);
+ m_maincpu->set_addrmap(AS_PROGRAM, &cat_state::cat_mem);
+ m_maincpu->set_irq_acknowledge_callback(FUNC(cat_state::cat_int_ack));
MCFG_MACHINE_START_OVERRIDE(cat_state,cat)
MCFG_MACHINE_RESET_OVERRIDE(cat_state,cat)
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(50)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */
- MCFG_SCREEN_SIZE(672, 344)
- MCFG_SCREEN_VISIBLE_AREA(0, 672-1, 0, 344-1)
- MCFG_SCREEN_UPDATE_DRIVER(cat_state, screen_update_cat)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(50);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */
+ screen.set_size(672, 344);
+ screen.set_visarea_full();
+ screen.set_screen_update(FUNC(cat_state::screen_update_cat));
MCFG_VIDEO_START_OVERRIDE(cat_state,cat)
- MCFG_DEVICE_ADD( "duartn68681", MC68681, (XTAL(19'968'000)*2)/11 ) // duart is normally clocked by 3.6864mhz xtal, but cat seemingly uses a divider from the main xtal instead which probably yields 3.63054545Mhz. There is a trace to cut and a mounting area to allow using an actual 3.6864mhz xtal if you so desire
- MCFG_MC68681_IRQ_CALLBACK(WRITELINE(*this, cat_state, cat_duart_irq_handler))
- MCFG_MC68681_A_TX_CALLBACK(WRITELINE(*this, cat_state, cat_duart_txa))
- MCFG_MC68681_B_TX_CALLBACK(WRITELINE(*this, cat_state, cat_duart_txb))
- MCFG_MC68681_OUTPORT_CALLBACK(WRITE8(*this, cat_state, cat_duart_output))
+ MC68681(config, m_duart, (XTAL(19'968'000)*2)/11); // duart is normally clocked by 3.6864mhz xtal, but cat seemingly uses a divider from the main xtal instead which probably yields 3.63054545Mhz. There is a trace to cut and a mounting area to allow using an actual 3.6864mhz xtal if you so desire
+ m_duart->irq_cb().set(FUNC(cat_state::cat_duart_irq_handler));
+ m_duart->a_tx_cb().set(FUNC(cat_state::cat_duart_txa));
+ m_duart->b_tx_cb().set(FUNC(cat_state::cat_duart_txb));
+ m_duart->outport_cb().set(FUNC(cat_state::cat_duart_output));;
CENTRONICS(config, m_ctx, centronics_devices, "printer");
m_ctx->ack_handler().set(FUNC(cat_state::prn_ack_ff));
- m_ctx->busy_handler().set("duartn68681", FUNC(mc68681_device::ip4_w)).invert();
- MCFG_CENTRONICS_OUTPUT_LATCH_ADD("ctx_data_out", "ctx")
+ m_ctx->busy_handler().set(m_duart, FUNC(mc68681_device::ip4_w)).invert();
+
+ OUTPUT_LATCH(config, m_ctx_data_out);
+ m_ctx->set_output_latch(*m_ctx_data_out);
SPEAKER(config, "mono").front_center();
SPEAKER_SOUND(config, "speaker").add_route(ALL_OUTPUTS, "mono", 1.00);
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
-MACHINE_CONFIG_END
+}
ROM_START( cat )
ROM_REGION( 0x40000, "maincpu", ROMREGION_ERASEFF )
diff --git a/src/mame/drivers/cavepc.cpp b/src/mame/drivers/cavepc.cpp
index b5d03cd967a..56455c256db 100644
--- a/src/mame/drivers/cavepc.cpp
+++ b/src/mame/drivers/cavepc.cpp
@@ -112,23 +112,24 @@ void cavepc_state::machine_reset()
membank("bank1")->set_base(memregion("bios")->base() + 0x30000);
}
-MACHINE_CONFIG_START(cavepc_state::cavepc)
+void cavepc_state::cavepc(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", PENTIUM3, 200000000) /* AMD Athlon 64 X2 5050e Brisbane 2.60GHz, 1024KB L2 Cache ! */
- MCFG_DEVICE_PROGRAM_MAP(cavepc_map)
- MCFG_DEVICE_IO_MAP(cavepc_io)
+ PENTIUM3(config, m_maincpu, 200000000); /* AMD Athlon 64 X2 5050e Brisbane 2.60GHz, 1024KB L2 Cache ! */
+ m_maincpu->set_addrmap(AS_PROGRAM, &cavepc_state::cavepc_map);
+ m_maincpu->set_addrmap(AS_IO, &cavepc_state::cavepc_io);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(640, 480)
- MCFG_SCREEN_VISIBLE_AREA(0, 639, 0, 199)
- MCFG_SCREEN_UPDATE_DRIVER(cavepc_state, screen_update_cavepc)
- MCFG_SCREEN_PALETTE("palette")
-
- MCFG_PALETTE_ADD("palette", 16)
-MACHINE_CONFIG_END
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(640, 480);
+ screen.set_visarea(0, 639, 0, 199);
+ screen.set_screen_update(FUNC(cavepc_state::screen_update_cavepc));
+ screen.set_palette("palette");
+
+ PALETTE(config, "palette").set_entries(16);
+}
diff --git a/src/mame/drivers/cball.cpp b/src/mame/drivers/cball.cpp
index 9cd61182816..31cfcddf6fe 100644
--- a/src/mame/drivers/cball.cpp
+++ b/src/mame/drivers/cball.cpp
@@ -264,27 +264,27 @@ static GFXDECODE_START( gfx_cball )
GFXDECODE_END
-MACHINE_CONFIG_START(cball_state::cball)
-
+void cball_state::cball(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M6800, XTAL(12'096'000) / 16) /* ? */
- MCFG_DEVICE_PROGRAM_MAP(cpu_map)
+ M6800(config, m_maincpu, XTAL(12'096'000) / 16); /* ? */
+ m_maincpu->set_addrmap(AS_PROGRAM, &cball_state::cpu_map);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_SIZE(256, 262)
- MCFG_SCREEN_VISIBLE_AREA(0, 255, 0, 223)
- MCFG_SCREEN_UPDATE_DRIVER(cball_state, screen_update)
- MCFG_SCREEN_PALETTE(m_palette)
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_refresh_hz(60);
+ m_screen->set_size(256, 262);
+ m_screen->set_visarea(0, 255, 0, 223);
+ m_screen->set_screen_update(FUNC(cball_state::screen_update));
+ m_screen->set_palette(m_palette);
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, m_palette, gfx_cball)
+ GFXDECODE(config, m_gfxdecode, m_palette, gfx_cball);
PALETTE(config, m_palette, FUNC(cball_state::cball_palette), 6);
/* sound hardware */
-MACHINE_CONFIG_END
+}
ROM_START( cball )
diff --git a/src/mame/drivers/cbasebal.cpp b/src/mame/drivers/cbasebal.cpp
index c508d933452..84cb59ac879 100644
--- a/src/mame/drivers/cbasebal.cpp
+++ b/src/mame/drivers/cbasebal.cpp
@@ -261,40 +261,38 @@ void cbasebal_state::machine_reset()
m_scroll_y[1] = 0;
}
-MACHINE_CONFIG_START(cbasebal_state::cbasebal)
-
+void cbasebal_state::cbasebal(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, 6000000) /* ??? */
- MCFG_DEVICE_PROGRAM_MAP(cbasebal_map)
- MCFG_DEVICE_IO_MAP(cbasebal_portmap)
- MCFG_DEVICE_OPCODES_MAP(decrypted_opcodes_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", cbasebal_state, irq0_line_hold) /* ??? */
+ Z80(config, m_maincpu, 6000000); /* ??? */
+ m_maincpu->set_addrmap(AS_PROGRAM, &cbasebal_state::cbasebal_map);
+ m_maincpu->set_addrmap(AS_IO, &cbasebal_state::cbasebal_portmap);
+ m_maincpu->set_addrmap(AS_OPCODES, &cbasebal_state::decrypted_opcodes_map);
+ m_maincpu->set_vblank_int("screen", FUNC(cbasebal_state::irq0_line_hold)); /* ??? */
EEPROM_93C46_16BIT(config, "eeprom");
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_VIDEO_ATTRIBUTES(VIDEO_UPDATE_BEFORE_VBLANK)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */)
- MCFG_SCREEN_SIZE(64*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(8*8, (64-8)*8-1, 2*8, 30*8-1 )
- MCFG_SCREEN_UPDATE_DRIVER(cbasebal_state, screen_update_cbasebal)
- MCFG_SCREEN_PALETTE(m_palette)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_video_attributes(VIDEO_UPDATE_BEFORE_VBLANK);
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500) /* not accurate */);
+ screen.set_size(64*8, 32*8);
+ screen.set_visarea(8*8, (64-8)*8-1, 2*8, 30*8-1 );
+ screen.set_screen_update(FUNC(cbasebal_state::screen_update_cbasebal));
+ screen.set_palette(m_palette);
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_cbasebal)
+ GFXDECODE(config, m_gfxdecode, m_palette, gfx_cbasebal);
PALETTE(config, m_palette).set_format(palette_device::xBRG_444, 1024);
/* sound hardware */
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("oki", OKIM6295, 1056000, okim6295_device::PIN7_HIGH) // clock frequency & pin 7 not verified
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.50)
+ OKIM6295(config, "oki", 1056000, okim6295_device::PIN7_HIGH).add_route(ALL_OUTPUTS, "mono", 0.50); // clock frequency & pin 7 not verified
- MCFG_DEVICE_ADD("ymsnd", YM2413, 3579545)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
-MACHINE_CONFIG_END
+ YM2413(config, "ymsnd", 3579545).add_route(ALL_OUTPUTS, "mono", 1.0);
+}
diff --git a/src/mame/drivers/cbm2.cpp b/src/mame/drivers/cbm2.cpp
index ce010831c67..069ee861e7e 100644
--- a/src/mame/drivers/cbm2.cpp
+++ b/src/mame/drivers/cbm2.cpp
@@ -285,8 +285,8 @@ public:
int *csbank1, int *csbank2, int *csbank3, int *basiclocs, int *basichics, int *kernalcs,
int *cs1, int *sidcs, int *extprtcs, int *ciacs, int *aciacs, int *tript1cs, int *tript2cs, int *aec, int *vsysaden);
- uint8_t read_memory(address_space &space, offs_t offset, offs_t va, int ba, int ae);
- void write_memory(address_space &space, offs_t offset, uint8_t data, int ba, int ae);
+ uint8_t read_memory(offs_t offset, offs_t va, int ba, int ae);
+ void write_memory(offs_t offset, uint8_t data, int ba, int ae);
DECLARE_READ8_MEMBER( read );
DECLARE_WRITE8_MEMBER( write );
@@ -521,39 +521,39 @@ READ8_MEMBER( cbm2_state::read )
{
if (A0)
{
- data = m_crtc->register_r(space, 0);
+ data = m_crtc->register_r();
}
else
{
- data = m_crtc->status_r(space, 0);
+ data = m_crtc->status_r();
}
}
if (!sidcs)
{
- data = m_sid->read(space, offset & 0x1f);
+ data = m_sid->read(offset & 0x1f);
}
if (!extprtcs && m_ext_cia)
{
- data = m_ext_cia->read(space, offset & 0x0f);
+ data = m_ext_cia->read(offset & 0x0f);
}
if (!ciacs)
{
- data = m_cia->read(space, offset & 0x0f);
+ data = m_cia->read(offset & 0x0f);
}
if (!aciacs)
{
- data = m_acia->read(space, offset & 0x03);
+ data = m_acia->read(offset & 0x03);
}
if (!tript1cs)
{
- data = m_tpi1->read(space, offset & 0x07);
+ data = m_tpi1->read(offset & 0x07);
}
if (!tript2cs)
{
- data = m_tpi2->read(space, offset & 0x07);
+ data = m_tpi2->read(offset & 0x07);
}
- data = m_exp->read(space, offset & 0x1fff, data, csbank1, csbank2, csbank3);
+ data = m_exp->read(offset & 0x1fff, data, csbank1, csbank2, csbank3);
}
return data;
@@ -614,39 +614,39 @@ WRITE8_MEMBER( cbm2_state::write )
{
if (A0)
{
- m_crtc->register_w(space, 0, data);
+ m_crtc->register_w(data);
}
else
{
- m_crtc->address_w(space, 0, data);
+ m_crtc->address_w(data);
}
}
if (!sidcs)
{
- m_sid->write(space, offset & 0x1f, data);
+ m_sid->write(offset & 0x1f, data);
}
if (!extprtcs && m_ext_cia)
{
- m_ext_cia->write(space, offset & 0x0f, data);
+ m_ext_cia->write(offset & 0x0f, data);
}
if (!ciacs)
{
- m_cia->write(space, offset & 0x0f, data);
+ m_cia->write(offset & 0x0f, data);
}
if (!aciacs)
{
- m_acia->write(space, offset & 0x03, data);
+ m_acia->write(offset & 0x03, data);
}
if (!tript1cs)
{
- m_tpi1->write(space, offset & 0x07, data);
+ m_tpi1->write(offset & 0x07, data);
}
if (!tript2cs)
{
- m_tpi2->write(space, offset & 0x07, data);
+ m_tpi2->write(offset & 0x07, data);
}
- m_exp->write(space, offset & 0x1fff, data, csbank1, csbank2, csbank3);
+ m_exp->write(offset & 0x1fff, data, csbank1, csbank2, csbank3);
}
}
@@ -850,7 +850,7 @@ void p500_state::bankswitch(offs_t offset, offs_t va, int srw, int ba, int ae, i
// read_memory -
//-------------------------------------------------
-uint8_t p500_state::read_memory(address_space &space, offs_t offset, offs_t va, int ba, int ae)
+uint8_t p500_state::read_memory(offs_t offset, offs_t va, int ba, int ae)
{
int srw = 1, busy2 = 1, refen = 0;
@@ -917,30 +917,30 @@ uint8_t p500_state::read_memory(address_space &space, offs_t offset, offs_t va,
}
if (!viccs && !viddaten && viddat_tr)
{
- data = m_vic->read(space, offset & 0x3f);
+ data = m_vic->read(offset & 0x3f);
}
if (!sidcs)
{
- data = m_sid->read(space, offset & 0x1f);
+ data = m_sid->read(offset & 0x1f);
}
if (!ciacs)
{
- data = m_cia->read(space, offset & 0x0f);
+ data = m_cia->read(offset & 0x0f);
}
if (!aciacs)
{
- data = m_acia->read(space, offset & 0x03);
+ data = m_acia->read(offset & 0x03);
}
if (!tript1cs)
{
- data = m_tpi1->read(space, offset & 0x07);
+ data = m_tpi1->read(offset & 0x07);
}
if (!tript2cs)
{
- data = m_tpi2->read(space, offset & 0x07);
+ data = m_tpi2->read(offset & 0x07);
}
- data = m_exp->read(space, offset & 0x1fff, data, csbank1, csbank2, csbank3);
+ data = m_exp->read(offset & 0x1fff, data, csbank1, csbank2, csbank3);
}
return data;
@@ -951,7 +951,7 @@ uint8_t p500_state::read_memory(address_space &space, offs_t offset, offs_t va,
// write_memory -
//-------------------------------------------------
-void p500_state::write_memory(address_space &space, offs_t offset, uint8_t data, int ba, int ae)
+void p500_state::write_memory(offs_t offset, uint8_t data, int ba, int ae)
{
int srw = 0, busy2 = 1, refen = 0;
offs_t va = 0xffff;
@@ -1005,30 +1005,30 @@ void p500_state::write_memory(address_space &space, offs_t offset, uint8_t data,
}
if (!viccs && !viddaten && !viddat_tr)
{
- m_vic->write(space, offset & 0x3f, data);
+ m_vic->write(offset & 0x3f, data);
}
if (!sidcs)
{
- m_sid->write(space, offset & 0x1f, data);
+ m_sid->write(offset & 0x1f, data);
}
if (!ciacs)
{
- m_cia->write(space, offset & 0x0f, data);
+ m_cia->write(offset & 0x0f, data);
}
if (!aciacs)
{
- m_acia->write(space, offset & 0x03, data);
+ m_acia->write(offset & 0x03, data);
}
if (!tript1cs)
{
- m_tpi1->write(space, offset & 0x07, data);
+ m_tpi1->write(offset & 0x07, data);
}
if (!tript2cs)
{
- m_tpi2->write(space, offset & 0x07, data);
+ m_tpi2->write(offset & 0x07, data);
}
- m_exp->write(space, offset & 0x1fff, data, csbank1, csbank2, csbank3);
+ m_exp->write(offset & 0x1fff, data, csbank1, csbank2, csbank3);
}
}
@@ -1042,7 +1042,7 @@ READ8_MEMBER( p500_state::read )
int ba = 0, ae = 1;
offs_t va = 0xffff;
- return read_memory(space, offset, va, ba, ae);
+ return read_memory(offset, va, ba, ae);
}
@@ -1054,7 +1054,7 @@ WRITE8_MEMBER( p500_state::write )
{
int ba = 0, ae = 1;
- write_memory(space, offset, data, ba, ae);
+ write_memory(offset, data, ba, ae);
}
@@ -1789,7 +1789,7 @@ READ8_MEMBER( cbm2_state::cia_pa_r )
data |= m_ieee1->read(space, 0);
// user port
- data &= m_user->d1_r(space, 0);
+ data &= m_user->d1_r();
// joystick
data &= ~(!BIT(m_joy1->read_joy(), 5) << 6);
@@ -1819,7 +1819,7 @@ WRITE8_MEMBER( cbm2_state::cia_pa_w )
m_ieee1->write(space, 0, data);
// user port
- m_user->d1_w(space, 0, data);
+ m_user->d1_w(data);
// joystick
m_cia_pa = data;
@@ -1849,7 +1849,7 @@ READ8_MEMBER( cbm2_state::cia_pb_r )
data |= (m_joy2->read_joy() & 0x0f) << 4;
// user port
- data &= m_user->d2_r(space, 0);
+ data &= m_user->d2_r();
return data;
}
@@ -2219,7 +2219,7 @@ MACHINE_RESET_MEMBER( p500_state, p500 )
//**************************************************************************
//-------------------------------------------------
-// MACHINE_CONFIG( 128k )
+// machine_config( 128k )
//-------------------------------------------------
void cbm2_state::_128k(machine_config &config)
@@ -2229,7 +2229,7 @@ void cbm2_state::_128k(machine_config &config)
//-------------------------------------------------
-// MACHINE_CONFIG( 256k )
+// machine_config( 256k )
//-------------------------------------------------
void cbm2_state::_256k(machine_config &config)
@@ -2239,7 +2239,7 @@ void cbm2_state::_256k(machine_config &config)
//-------------------------------------------------
-// MACHINE_CONFIG( p500_ntsc )
+// machine_config( p500_ntsc )
//-------------------------------------------------
void p500_state::p500_ntsc(machine_config &config)
@@ -2361,8 +2361,8 @@ void p500_state::p500_ntsc(machine_config &config)
rs232.dsr_handler().set(m_acia, FUNC(mos6551_device::write_dsr));
rs232.cts_handler().set(m_acia, FUNC(mos6551_device::write_cts));
- quickload_image_device &quickload(QUICKLOAD(config, "quickload", 0));
- quickload.set_handler(snapquick_load_delegate(&QUICKLOAD_LOAD_NAME(p500_state, p500), this), "p00,prg", CBM_QUICKLOAD_DELAY_SECONDS);
+ quickload_image_device &quickload(QUICKLOAD(config, "quickload"));
+ quickload.set_handler(snapquick_load_delegate(&QUICKLOAD_LOAD_NAME(p500_state, p500), this), "p00,prg", CBM_QUICKLOAD_DELAY);
// internal ram
_128k(config);
@@ -2376,7 +2376,7 @@ void p500_state::p500_ntsc(machine_config &config)
//-------------------------------------------------
-// MACHINE_CONFIG( p500_pal )
+// machine_config( p500_pal )
//-------------------------------------------------
void p500_state::p500_pal(machine_config &config)
@@ -2495,8 +2495,8 @@ void p500_state::p500_pal(machine_config &config)
rs232.dsr_handler().set(m_acia, FUNC(mos6551_device::write_dsr));
rs232.cts_handler().set(m_acia, FUNC(mos6551_device::write_cts));
- quickload_image_device &quickload(QUICKLOAD(config, "quickload", 0));
- quickload.set_handler(snapquick_load_delegate(&QUICKLOAD_LOAD_NAME(p500_state, p500), this), "p00,prg", CBM_QUICKLOAD_DELAY_SECONDS);
+ quickload_image_device &quickload(QUICKLOAD(config, "quickload"));
+ quickload.set_handler(snapquick_load_delegate(&QUICKLOAD_LOAD_NAME(p500_state, p500), this), "p00,prg", CBM_QUICKLOAD_DELAY);
// internal ram
_128k(config);
@@ -2510,7 +2510,7 @@ void p500_state::p500_pal(machine_config &config)
//-------------------------------------------------
-// MACHINE_CONFIG( cbm2lp_ntsc )
+// machine_config( cbm2lp_ntsc )
//-------------------------------------------------
void cbm2_state::cbm2lp_ntsc(machine_config &config)
@@ -2628,8 +2628,8 @@ void cbm2_state::cbm2lp_ntsc(machine_config &config)
rs232.dsr_handler().set(m_acia, FUNC(mos6551_device::write_dsr));
rs232.cts_handler().set(m_acia, FUNC(mos6551_device::write_cts));
- quickload_image_device &quickload(QUICKLOAD(config, "quickload", 0));
- quickload.set_handler(snapquick_load_delegate(&QUICKLOAD_LOAD_NAME(cbm2_state, cbmb), this), "p00,prg,t64", CBM_QUICKLOAD_DELAY_SECONDS);
+ quickload_image_device &quickload(QUICKLOAD(config, "quickload"));
+ quickload.set_handler(snapquick_load_delegate(&QUICKLOAD_LOAD_NAME(cbm2_state, cbmb), this), "p00,prg,t64", CBM_QUICKLOAD_DELAY);
// software list
SOFTWARE_LIST(config, "cart_list").set_original("cbm2_cart");
@@ -2640,7 +2640,7 @@ void cbm2_state::cbm2lp_ntsc(machine_config &config)
//-------------------------------------------------
-// MACHINE_CONFIG( b128 )
+// machine_config( b128 )
//-------------------------------------------------
void cbm2_state::b128(machine_config &config)
@@ -2651,7 +2651,7 @@ void cbm2_state::b128(machine_config &config)
//-------------------------------------------------
-// MACHINE_CONFIG( b256 )
+// machine_config( b256 )
//-------------------------------------------------
void cbm2_state::b256(machine_config &config)
@@ -2662,7 +2662,7 @@ void cbm2_state::b256(machine_config &config)
//-------------------------------------------------
-// MACHINE_CONFIG( cbm2lp_pal )
+// machine_config( cbm2lp_pal )
//-------------------------------------------------
void cbm2_state::cbm2lp_pal(machine_config &config)
@@ -2674,7 +2674,7 @@ void cbm2_state::cbm2lp_pal(machine_config &config)
//-------------------------------------------------
-// MACHINE_CONFIG( cbm610 )
+// machine_config( cbm610 )
//-------------------------------------------------
void cbm2_state::cbm610(machine_config &config)
@@ -2685,7 +2685,7 @@ void cbm2_state::cbm610(machine_config &config)
//-------------------------------------------------
-// MACHINE_CONFIG( cbm620 )
+// machine_config( cbm620 )
//-------------------------------------------------
void cbm2_state::cbm620(machine_config &config)
@@ -2696,7 +2696,7 @@ void cbm2_state::cbm620(machine_config &config)
//-------------------------------------------------
-// MACHINE_CONFIG( cbm2hp_ntsc )
+// machine_config( cbm2hp_ntsc )
//-------------------------------------------------
void cbm2_state::cbm2hp_ntsc(machine_config &config)
@@ -2707,7 +2707,7 @@ void cbm2_state::cbm2hp_ntsc(machine_config &config)
//-------------------------------------------------
-// MACHINE_CONFIG( b128hp )
+// machine_config( b128hp )
//-------------------------------------------------
void cbm2hp_state::b128hp(machine_config &config)
@@ -2718,7 +2718,7 @@ void cbm2hp_state::b128hp(machine_config &config)
//-------------------------------------------------
-// MACHINE_CONFIG( b256hp )
+// machine_config( b256hp )
//-------------------------------------------------
void cbm2hp_state::b256hp(machine_config &config)
@@ -2729,7 +2729,7 @@ void cbm2hp_state::b256hp(machine_config &config)
//-------------------------------------------------
-// MACHINE_CONFIG( bx256hp )
+// machine_config( bx256hp )
//-------------------------------------------------
void cbm2hp_state::bx256hp(machine_config &config)
@@ -2763,7 +2763,7 @@ void cbm2hp_state::bx256hp(machine_config &config)
//-------------------------------------------------
-// MACHINE_CONFIG( cbm2hp_pal )
+// machine_config( cbm2hp_pal )
//-------------------------------------------------
void cbm2_state::cbm2hp_pal(machine_config &config)
@@ -2778,7 +2778,7 @@ void cbm2_state::cbm2hp_pal(machine_config &config)
//-------------------------------------------------
-// MACHINE_CONFIG( cbm710 )
+// machine_config( cbm710 )
//-------------------------------------------------
void cbm2hp_state::cbm710(machine_config &config)
@@ -2789,7 +2789,7 @@ void cbm2hp_state::cbm710(machine_config &config)
//-------------------------------------------------
-// MACHINE_CONFIG( cbm720 )
+// machine_config( cbm720 )
//-------------------------------------------------
void cbm2hp_state::cbm720(machine_config &config)
@@ -2800,7 +2800,7 @@ void cbm2hp_state::cbm720(machine_config &config)
//-------------------------------------------------
-// MACHINE_CONFIG( cbm730 )
+// machine_config( cbm730 )
//-------------------------------------------------
void cbm2hp_state::cbm730(machine_config &config)
diff --git a/src/mame/drivers/cbuster.cpp b/src/mame/drivers/cbuster.cpp
index 725689db30d..6bfd645ed19 100644
--- a/src/mame/drivers/cbuster.cpp
+++ b/src/mame/drivers/cbuster.cpp
@@ -299,28 +299,28 @@ void cbuster_state::machine_reset()
m_pri = 0;
}
-MACHINE_CONFIG_START(cbuster_state::twocrude)
-
+void cbuster_state::twocrude(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M68000, XTAL(24'000'000)/2) /* Custom chip 59 @ 12MHz Verified */
- MCFG_DEVICE_PROGRAM_MAP(twocrude_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", cbuster_state, irq4_line_assert)/* VBL */
+ M68000(config, m_maincpu, XTAL(24'000'000)/2); /* Custom chip 59 @ 12MHz Verified */
+ m_maincpu->set_addrmap(AS_PROGRAM, &cbuster_state::twocrude_map);
+ m_maincpu->set_vblank_int("screen", FUNC(cbuster_state::irq4_line_assert)); /* VBL */
H6280(config, m_audiocpu, XTAL(24'000'000)/4); /* Custom chip 45, 6MHz Verified */
m_audiocpu->set_addrmap(AS_PROGRAM, &cbuster_state::sound_map);
m_audiocpu->add_route(ALL_OUTPUTS, "mono", 0); // internal sound unused
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(58)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(529))
- MCFG_SCREEN_SIZE(32*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 1*8, 31*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(cbuster_state, screen_update_twocrude)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(58);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(529));
+ screen.set_size(32*8, 32*8);
+ screen.set_visarea(0*8, 32*8-1, 1*8, 31*8-1);
+ screen.set_screen_update(FUNC(cbuster_state::screen_update_twocrude));
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_cbuster)
+ GFXDECODE(config, "gfxdecode", m_palette, gfx_cbuster);
PALETTE(config, m_palette).set_format(palette_device::xBGR_888, 2048);
- MCFG_DEVICE_ADD("spriteram", BUFFERED_SPRITERAM16)
+ BUFFERED_SPRITERAM16(config, m_spriteram);
DECO16IC(config, m_deco_tilegen[0], 0);
m_deco_tilegen[0]->set_split(0);
@@ -365,19 +365,16 @@ MACHINE_CONFIG_START(cbuster_state::twocrude)
m_soundlatch->data_pending_callback().set_inputline(m_audiocpu, 0);
// YM2203_PITCH_HACK - Pitch is too low at 1.3425MHz (see also stfight.cpp)
- MCFG_DEVICE_ADD("ym1", YM2203, XTAL(32'220'000)/24 * 3) /* 1.3425MHz Verified */
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.60)
+ YM2203(config, "ym1", XTAL(32'220'000)/24 * 3).add_route(ALL_OUTPUTS, "mono", 0.60); /* 1.3425MHz Verified */
ym2151_device &ym2(YM2151(config, "ym2", XTAL(32'220'000)/9)); /* 3.58MHz Verified */
ym2.irq_handler().set_inputline(m_audiocpu, 1); /* IRQ2 */
ym2.add_route(ALL_OUTPUTS, "mono", 0.45);
- MCFG_DEVICE_ADD("oki1", OKIM6295, XTAL(32'220'000)/32, okim6295_device::PIN7_HIGH) /* 1.0068MHz Verified */
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.75)
+ OKIM6295(config, "oki1", XTAL(32'220'000)/32, okim6295_device::PIN7_HIGH).add_route(ALL_OUTPUTS, "mono", 0.75); /* 1.0068MHz Verified */
- MCFG_DEVICE_ADD("oki2", OKIM6295, XTAL(32'220'000)/16, okim6295_device::PIN7_HIGH) /* 2.01375MHz Verified */
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.60)
-MACHINE_CONFIG_END
+ OKIM6295(config, "oki2", XTAL(32'220'000)/16, okim6295_device::PIN7_HIGH).add_route(ALL_OUTPUTS, "mono", 0.60); /* 2.01375MHz Verified */
+}
/******************************************************************************/
diff --git a/src/mame/drivers/cc40.cpp b/src/mame/drivers/cc40.cpp
index 9440d942c8a..e333a96ba3a 100644
--- a/src/mame/drivers/cc40.cpp
+++ b/src/mame/drivers/cc40.cpp
@@ -408,11 +408,11 @@ INPUT_CHANGED_MEMBER(cc40_state::sysram_size_changed)
static INPUT_PORTS_START( cc40 )
PORT_START("RAMSIZE")
- PORT_CONFNAME( 0x07, 0x01, "RAM Chip 1") PORT_CHANGED_MEMBER(DEVICE_SELF, cc40_state, sysram_size_changed, (void *)0)
+ PORT_CONFNAME( 0x07, 0x01, "RAM Chip 1") PORT_CHANGED_MEMBER(DEVICE_SELF, cc40_state, sysram_size_changed, 0)
PORT_CONFSETTING( 0x00, "None" )
PORT_CONFSETTING( 0x01, "2KB" )
PORT_CONFSETTING( 0x04, "8KB" )
- PORT_CONFNAME( 0x70, 0x10, "RAM Chip 2") PORT_CHANGED_MEMBER(DEVICE_SELF, cc40_state, sysram_size_changed, (void *)1)
+ PORT_CONFNAME( 0x70, 0x10, "RAM Chip 2") PORT_CHANGED_MEMBER(DEVICE_SELF, cc40_state, sysram_size_changed, 1)
PORT_CONFSETTING( 0x00, "None" ) // note: invalid configuration, unless Chip 1 is also 0x00
PORT_CONFSETTING( 0x10, "2KB" )
PORT_CONFSETTING( 0x40, "8KB" )
@@ -598,33 +598,33 @@ MACHINE_CONFIG_START(cc40_state::cc40)
NVRAM(config, "sysram.2", nvram_device::DEFAULT_ALL_0);
/* video hardware */
- MCFG_SCREEN_ADD("screen", LCD)
- MCFG_SCREEN_REFRESH_RATE(60) // arbitrary
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500))
- MCFG_SCREEN_SIZE(6*31+1, 9*1+1+1)
- MCFG_SCREEN_VISIBLE_AREA(0, 6*31, 0, 9*1+1)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_LCD));
+ screen.set_refresh_hz(60); // arbitrary
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500));
+ screen.set_size(6*31+1, 9*1+1+1);
+ screen.set_visarea_full();
config.set_default_layout(layout_cc40);
- MCFG_SCREEN_UPDATE_DEVICE("hd44780", hd44780_device, screen_update)
- MCFG_SCREEN_PALETTE("palette")
+ screen.set_screen_update("hd44780", FUNC(hd44780_device::screen_update));
+ screen.set_palette("palette");
PALETTE(config, "palette", FUNC(cc40_state::cc40_palette), 3);
- MCFG_HD44780_ADD("hd44780")
- MCFG_HD44780_LCD_SIZE(2, 16) // 2*16 internal
- MCFG_HD44780_PIXEL_UPDATE_CB(cc40_state, cc40_pixel_update)
+ hd44780_device &hd44780(HD44780(config, "hd44780", 0));
+ hd44780.set_lcd_size(2, 16); // 2*16 internal
+ hd44780.set_pixel_update_cb(FUNC(cc40_state::cc40_pixel_update), this);
/* sound hardware */
SPEAKER(config, "speaker").front_center();
- MCFG_DEVICE_ADD("dac", DAC_1BIT, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 0.25)
- MCFG_DEVICE_ADD("vref", VOLTAGE_REGULATOR, 0) MCFG_VOLTAGE_REGULATOR_OUTPUT(5.0)
- MCFG_SOUND_ROUTE(0, "dac", 1.0, DAC_VREF_POS_INPUT)
+ DAC_1BIT(config, "dac", 0).add_route(ALL_OUTPUTS, "speaker", 0.25);
+ voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref", 0));
+ vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT);
/* cartridge */
MCFG_GENERIC_CARTSLOT_ADD("cartslot", generic_plain_slot, "cc40_cart")
MCFG_GENERIC_EXTENSIONS("bin,rom,256")
MCFG_GENERIC_LOAD(cc40_state, cc40_cartridge)
- MCFG_SOFTWARE_LIST_ADD("cart_list", "cc40_cart")
+ SOFTWARE_LIST(config, "cart_list").set_original("cc40_cart");
MACHINE_CONFIG_END
diff --git a/src/mame/drivers/cchance.cpp b/src/mame/drivers/cchance.cpp
index e3d9a4cd3af..a57966eaee3 100644
--- a/src/mame/drivers/cchance.cpp
+++ b/src/mame/drivers/cchance.cpp
@@ -217,11 +217,11 @@ void cchance_state::machine_reset()
m_bell_io = 0;
}
-MACHINE_CONFIG_START(cchance_state::cchance)
-
- MCFG_DEVICE_ADD("maincpu", Z80,4000000) /* ? MHz */
- MCFG_DEVICE_PROGRAM_MAP(main_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", cchance_state, irq0_line_hold)
+void cchance_state::cchance(machine_config &config)
+{
+ Z80(config, m_maincpu, 4000000); /* ? MHz */
+ m_maincpu->set_addrmap(AS_PROGRAM, &cchance_state::main_map);
+ m_maincpu->set_vblank_int("screen", FUNC(cchance_state::irq0_line_hold));
GFXDECODE(config, "gfxdecode", m_palette, gfx_cchance);
@@ -229,14 +229,14 @@ MACHINE_CONFIG_START(cchance_state::cchance)
m_seta001->set_gfxdecode_tag("gfxdecode");
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(57.5)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(32*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(cchance_state, screen_update_tnzs)
- MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE(*this, cchance_state, screen_vblank_tnzs))
- MCFG_SCREEN_PALETTE(m_palette)
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_refresh_hz(57.5);
+ m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ m_screen->set_size(32*8, 32*8);
+ m_screen->set_visarea(0*8, 32*8-1, 2*8, 30*8-1);
+ m_screen->set_screen_update(FUNC(cchance_state::screen_update_tnzs));
+ m_screen->screen_vblank().set(FUNC(cchance_state::screen_vblank_tnzs));
+ m_screen->set_palette(m_palette);
PALETTE(config, m_palette, FUNC(cchance_state::prompalette), 512);
@@ -246,7 +246,7 @@ MACHINE_CONFIG_START(cchance_state::cchance)
aysnd.port_a_read_callback().set_ioport("DSW1");
aysnd.port_b_read_callback().set_ioport("DSW2");
aysnd.add_route(ALL_OUTPUTS, "mono", 0.25);
-MACHINE_CONFIG_END
+}
ROM_START( cchance )
ROM_REGION( 0x10000, "maincpu", 0 )
diff --git a/src/mame/drivers/cchasm.cpp b/src/mame/drivers/cchasm.cpp
index 31fc3f6c001..4982db9d9d2 100644
--- a/src/mame/drivers/cchasm.cpp
+++ b/src/mame/drivers/cchasm.cpp
@@ -146,11 +146,11 @@ static const z80_daisy_config daisy_chain[] =
*
*************************************/
-MACHINE_CONFIG_START(cchasm_state::cchasm)
-
+void cchasm_state::cchasm(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M68000, CCHASM_68K_CLOCK) /* 8 MHz (from schematics) */
- MCFG_DEVICE_PROGRAM_MAP(memmap)
+ M68000(config, m_maincpu, CCHASM_68K_CLOCK); /* 8 MHz (from schematics) */
+ m_maincpu->set_addrmap(AS_PROGRAM, &cchasm_state::memmap);
Z80(config, m_audiocpu, 3584229); /* 3.58 MHz (from schematics) */
m_audiocpu->set_daisy_config(daisy_chain);
@@ -165,12 +165,12 @@ MACHINE_CONFIG_START(cchasm_state::cchasm)
WATCHDOG_TIMER(config, "watchdog");
/* video hardware */
- MCFG_VECTOR_ADD("vector")
- MCFG_SCREEN_ADD("screen", VECTOR)
- MCFG_SCREEN_REFRESH_RATE(40)
- MCFG_SCREEN_SIZE(400, 300)
- MCFG_SCREEN_VISIBLE_AREA(0, 1024-1, 0, 768-1)
- MCFG_SCREEN_UPDATE_DEVICE("vector", vector_device, screen_update)
+ VECTOR(config, m_vector, 0);
+ SCREEN(config, m_screen, SCREEN_TYPE_VECTOR);
+ m_screen->set_refresh_hz(40);
+ m_screen->set_size(400, 300);
+ m_screen->set_visarea(0, 1024-1, 0, 768-1);
+ m_screen->set_screen_update("vector", FUNC(vector_device::screen_update));
/* sound hardware */
SPEAKER(config, "speaker").front_center();
@@ -184,17 +184,17 @@ MACHINE_CONFIG_START(cchasm_state::cchasm)
AY8910(config, "ay2", 1818182).add_route(ALL_OUTPUTS, "speaker", 0.2);
- MCFG_DEVICE_ADD("dac1", DAC_1BIT, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 0.5)
- MCFG_DEVICE_ADD("dac2", DAC_1BIT, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 0.5)
- MCFG_DEVICE_ADD("vref", VOLTAGE_REGULATOR, 0) MCFG_VOLTAGE_REGULATOR_OUTPUT(5.0)
- MCFG_SOUND_ROUTE(0, "dac1", 1.0, DAC_VREF_POS_INPUT)
- MCFG_SOUND_ROUTE(0, "dac2", 1.0, DAC_VREF_POS_INPUT)
+ DAC_1BIT(config, m_dac1, 0).add_route(ALL_OUTPUTS, "speaker", 0.5);
+ DAC_1BIT(config, m_dac2, 0).add_route(ALL_OUTPUTS, "speaker", 0.5);
+ voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref"));
+ vref.add_route(0, "dac1", 1.0, DAC_VREF_POS_INPUT);
+ vref.add_route(0, "dac2", 1.0, DAC_VREF_POS_INPUT);
/* 6840 PTM */
ptm6840_device &ptm(PTM6840(config, "6840ptm", CCHASM_68K_CLOCK/10));
ptm.set_external_clocks(0, (CCHASM_68K_CLOCK / 10).value(), 0);
ptm.irq_callback().set_inputline("maincpu", 4);
-MACHINE_CONFIG_END
+}
diff --git a/src/mame/drivers/cclimber.cpp b/src/mame/drivers/cclimber.cpp
index 8a7d325b701..1025f696fa0 100644
--- a/src/mame/drivers/cclimber.cpp
+++ b/src/mame/drivers/cclimber.cpp
@@ -1105,33 +1105,33 @@ WRITE_LINE_MEMBER(cclimber_state::bagmanf_vblank_irq)
m_maincpu->set_input_line(0, HOLD_LINE);
}
-MACHINE_CONFIG_START(cclimber_state::root)
-
+void cclimber_state::root(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD(m_maincpu, Z80, XTAL(18'432'000)/3/2) /* 3.072 MHz */
- MCFG_DEVICE_PROGRAM_MAP(cclimber_map)
- MCFG_DEVICE_IO_MAP(cclimber_portmap)
+ Z80(config, m_maincpu, XTAL(18'432'000)/3/2); /* 3.072 MHz */
+ m_maincpu->set_addrmap(AS_PROGRAM, &cclimber_state::cclimber_map);
+ m_maincpu->set_addrmap(AS_IO, &cclimber_state::cclimber_portmap);
- MCFG_DEVICE_ADD(m_mainlatch, LS259, 0)
+ LS259(config, m_mainlatch, 0);
m_mainlatch->q_out_cb<0>().set(FUNC(cclimber_state::nmi_mask_w));
m_mainlatch->q_out_cb<1>().set(FUNC(cclimber_state::flip_screen_x_w));
m_mainlatch->q_out_cb<2>().set(FUNC(cclimber_state::flip_screen_y_w));
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(32*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(cclimber_state, screen_update_cclimber)
- MCFG_SCREEN_PALETTE(m_palette)
- MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE(*this, cclimber_state, vblank_irq))
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(32*8, 32*8);
+ screen.set_visarea(0*8, 32*8-1, 2*8, 30*8-1);
+ screen.set_screen_update(FUNC(cclimber_state::screen_update_cclimber));
+ screen.set_palette(m_palette);
+ screen.screen_vblank().set(FUNC(cclimber_state::vblank_irq));
GFXDECODE(config, m_gfxdecode, m_palette, gfx_cclimber);
PALETTE(config, m_palette, FUNC(cclimber_state::cclimber_palette), 16*4+8*4);
MCFG_VIDEO_START_OVERRIDE(cclimber_state,cclimber)
-MACHINE_CONFIG_END
+}
void cclimber_state::cclimber(machine_config &config)
@@ -1160,7 +1160,8 @@ void cclimber_state::ckongb(machine_config &config)
}
-MACHINE_CONFIG_START(cclimber_state::cannonb)
+void cclimber_state::cannonb(machine_config &config)
+{
cclimber(config);
/* basic machine hardware */
@@ -1171,8 +1172,8 @@ MACHINE_CONFIG_START(cclimber_state::cannonb)
m_mainlatch->q_out_cb<2>().set_nop(); // not used
/* video hardware */
- MCFG_GFXDECODE_MODIFY("gfxdecode", gfx_cannonb)
-MACHINE_CONFIG_END
+ m_gfxdecode->set_info(gfx_cannonb);
+}
void cclimber_state::bagmanf(machine_config &config)
{
@@ -1185,7 +1186,8 @@ void cclimber_state::bagmanf(machine_config &config)
}
-MACHINE_CONFIG_START(cclimber_state::yamato)
+void cclimber_state::yamato(machine_config &config)
+{
root(config);
/* basic machine hardware */
@@ -1195,15 +1197,15 @@ MACHINE_CONFIG_START(cclimber_state::yamato)
maincpu.set_addrmap(AS_OPCODES, &cclimber_state::yamato_decrypted_opcodes_map);
maincpu.set_decrypted_tag(":decrypted_opcodes");
- MCFG_DEVICE_ADD("audiocpu", Z80, 3072000) /* 3.072 MHz ? */
- MCFG_DEVICE_PROGRAM_MAP(yamato_audio_map)
- MCFG_DEVICE_IO_MAP(yamato_audio_portmap)
+ Z80(config, m_audiocpu, 3072000); /* 3.072 MHz ? */
+ m_audiocpu->set_addrmap(AS_PROGRAM, &cclimber_state::yamato_audio_map);
+ m_audiocpu->set_addrmap(AS_IO, &cclimber_state::yamato_audio_portmap);
/* video hardware */
m_palette->set_entries(16*4+8*4+256);
m_palette->set_init(FUNC(cclimber_state::yamato_palette));
- MCFG_SCREEN_MODIFY("screen")
- MCFG_SCREEN_UPDATE_DRIVER(cclimber_state, screen_update_yamato)
+
+ subdevice<screen_device>("screen")->set_screen_update(FUNC(cclimber_state::screen_update_yamato));
/* audio hardware */
SPEAKER(config, "speaker").front_center();
@@ -1211,10 +1213,11 @@ MACHINE_CONFIG_START(cclimber_state::yamato)
AY8910(config, "ay1", XTAL(18'432'000)/12).add_route(ALL_OUTPUTS, "speaker", 0.25); /* 1.536 MHz */
AY8910(config, "ay2", XTAL(18'432'000)/12).add_route(ALL_OUTPUTS, "speaker", 0.25); /* 1.536 MHz */
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(cclimber_state::toprollr)
+void cclimber_state::toprollr(machine_config &config)
+{
cclimber(config);
sega_315_5018_device &maincpu(SEGA_315_5018(config.replace(), m_maincpu, XTAL(18'432'000)/3/2)); /* 3.072 MHz */
@@ -1229,43 +1232,42 @@ MACHINE_CONFIG_START(cclimber_state::toprollr)
m_mainlatch->q_out_cb<6>().set(FUNC(cclimber_state::toprollr_rombank_w));
/* video hardware */
- MCFG_GFXDECODE_MODIFY("gfxdecode", gfx_toprollr)
+ m_gfxdecode->set_info(gfx_toprollr);
m_palette->set_entries(32*5);
m_palette->set_init(FUNC(cclimber_state::toprollr_palette));
MCFG_VIDEO_START_OVERRIDE(cclimber_state,toprollr)
- MCFG_SCREEN_MODIFY("screen")
- MCFG_SCREEN_UPDATE_DRIVER(cclimber_state, screen_update_toprollr)
-MACHINE_CONFIG_END
-
+ subdevice<screen_device>("screen")->set_screen_update(FUNC(cclimber_state::screen_update_toprollr));
+}
-MACHINE_CONFIG_START(cclimber_state::swimmer)
+void cclimber_state::swimmer(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD(m_maincpu, Z80, XTAL(18'432'000)/6) /* verified on pcb */
- MCFG_DEVICE_PROGRAM_MAP(swimmer_map)
+ Z80(config, m_maincpu, XTAL(18'432'000)/6); /* verified on pcb */
+ m_maincpu->set_addrmap(AS_PROGRAM, &cclimber_state::swimmer_map);
- MCFG_DEVICE_ADD(m_mainlatch, LS259, 0)
+ LS259(config, m_mainlatch, 0);
m_mainlatch->q_out_cb<0>().set(FUNC(cclimber_state::nmi_mask_w));
m_mainlatch->q_out_cb<1>().set(FUNC(cclimber_state::flip_screen_x_w));
m_mainlatch->q_out_cb<2>().set(FUNC(cclimber_state::flip_screen_y_w));
m_mainlatch->q_out_cb<3>().set(FUNC(cclimber_state::sidebg_enable_w));
m_mainlatch->q_out_cb<4>().set(FUNC(cclimber_state::palette_bank_w));
- MCFG_DEVICE_ADD("audiocpu", Z80,XTAL(4'000'000)/2) /* verified on pcb */
- MCFG_DEVICE_PROGRAM_MAP(swimmer_audio_map)
- MCFG_DEVICE_IO_MAP(swimmer_audio_portmap)
- MCFG_DEVICE_PERIODIC_INT_DRIVER(cclimber_state, nmi_line_pulse, (double)4000000/16384) /* IRQs are triggered by the main CPU */
+ Z80(config, m_audiocpu, XTAL(4'000'000)/2); /* verified on pcb */
+ m_audiocpu->set_addrmap(AS_PROGRAM, &cclimber_state::swimmer_audio_map);
+ m_audiocpu->set_addrmap(AS_IO, &cclimber_state::swimmer_audio_portmap);
+ m_audiocpu->set_periodic_int(FUNC(cclimber_state::nmi_line_pulse), attotime::from_hz((double)4000000/16384)); /* IRQs are triggered by the main CPU */
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60.57) /* verified on pcb */
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(32*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(cclimber_state, screen_update_swimmer)
- MCFG_SCREEN_PALETTE(m_palette)
- MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE(*this, cclimber_state, vblank_irq))
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60.57); /* verified on pcb */
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(32*8, 32*8);
+ screen.set_visarea(0*8, 32*8-1, 2*8, 30*8-1);
+ screen.set_screen_update(FUNC(cclimber_state::screen_update_swimmer));
+ screen.set_palette(m_palette);
+ screen.screen_vblank().set(FUNC(cclimber_state::vblank_irq));
GFXDECODE(config, m_gfxdecode, m_palette, gfx_swimmer);
PALETTE(config, m_palette, FUNC(cclimber_state::swimmer_palette), 32*8+4*8+1);
@@ -1280,11 +1282,12 @@ MACHINE_CONFIG_START(cclimber_state::swimmer)
AY8910(config, "ay1", XTAL(4'000'000)/2).add_route(ALL_OUTPUTS, "speaker", 0.25); /* verified on pcb */
AY8910(config, "ay2", XTAL(4'000'000)/2).add_route(ALL_OUTPUTS, "speaker", 0.25); /* verified on pcb */
-MACHINE_CONFIG_END
+}
void cclimber_state::guzzler(machine_config &config)
{
swimmer(config);
+
/* basic machine hardware */
m_maincpu->set_addrmap(AS_PROGRAM, &cclimber_state::guzzler_map);
}
diff --git a/src/mame/drivers/ccs2810.cpp b/src/mame/drivers/ccs2810.cpp
index 3f7497f9f0e..0c31b362ec6 100644
--- a/src/mame/drivers/ccs2810.cpp
+++ b/src/mame/drivers/ccs2810.cpp
@@ -910,11 +910,12 @@ static void ccs_floppies(device_slot_interface &device)
//device.option_add("525dd", FLOPPY_525_DD);
-MACHINE_CONFIG_START(ccs_state::ccs2810)
+void ccs_state::ccs2810(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, 16_MHz_XTAL / 4)
- MCFG_DEVICE_PROGRAM_MAP(ccs2810_mem)
- MCFG_DEVICE_IO_MAP(ccs2810_io)
+ Z80(config, m_maincpu, 16_MHz_XTAL / 4);
+ m_maincpu->set_addrmap(AS_PROGRAM, &ccs_state::ccs2810_mem);
+ m_maincpu->set_addrmap(AS_IO, &ccs_state::ccs2810_io);
RAM(config, RAM_TAG).set_default_size("64K");
@@ -931,13 +932,14 @@ MACHINE_CONFIG_START(ccs_state::ccs2810)
rs232.dcd_handler().set(m_ins8250, FUNC(ins8250_device::dcd_w));
rs232.dsr_handler().set(m_ins8250, FUNC(ins8250_device::dsr_w));
rs232.cts_handler().set(m_ins8250, FUNC(ins8250_device::cts_w));
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(ccs_state::ccs2422)
+void ccs_state::ccs2422(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, 16_MHz_XTAL / 4)
- MCFG_DEVICE_PROGRAM_MAP(ccs2810_mem)
- MCFG_DEVICE_IO_MAP(ccs2422_io)
+ Z80(config, m_maincpu, 16_MHz_XTAL / 4);
+ m_maincpu->set_addrmap(AS_PROGRAM, &ccs_state::ccs2810_mem);
+ m_maincpu->set_addrmap(AS_IO, &ccs_state::ccs2422_io);
RAM(config, RAM_TAG).set_default_size("64K");
@@ -956,9 +958,8 @@ MACHINE_CONFIG_START(ccs_state::ccs2422)
rs232.cts_handler().set(m_ins8250, FUNC(ins8250_device::cts_w));
MB8877(config, m_fdc, 16_MHz_XTAL / 8); // UB1793 or MB8877
- MCFG_FLOPPY_DRIVE_ADD("fdc:0", ccs_floppies, "8sssd", floppy_image_device::default_floppy_formats)
- MCFG_FLOPPY_DRIVE_SOUND(true)
-MACHINE_CONFIG_END
+ FLOPPY_CONNECTOR(config, "fdc:0", ccs_floppies, "8sssd", floppy_image_device::default_floppy_formats).enable_sound(true);
+}
/* ROM definition */
ROM_START( ccs2810 )
diff --git a/src/mame/drivers/cd2650.cpp b/src/mame/drivers/cd2650.cpp
index a0520110d61..38c84b29046 100644
--- a/src/mame/drivers/cd2650.cpp
+++ b/src/mame/drivers/cd2650.cpp
@@ -314,8 +314,8 @@ void cd2650_state::cd2650(machine_config &config)
PALETTE(config, "palette", palette_device::MONOCHROME);
/* quickload */
- quickload_image_device &quickload(QUICKLOAD(config, "quickload", 0));
- quickload.set_handler(snapquick_load_delegate(&QUICKLOAD_LOAD_NAME(cd2650_state, cd2650), this), "pgm", 1);
+ quickload_image_device &quickload(QUICKLOAD(config, "quickload"));
+ quickload.set_handler(snapquick_load_delegate(&QUICKLOAD_LOAD_NAME(cd2650_state, cd2650), this), "pgm", attotime::from_seconds(1));
/* Sound */
SPEAKER(config, "mono").front_center();
diff --git a/src/mame/drivers/cdc721.cpp b/src/mame/drivers/cdc721.cpp
index aa0a75f986b..c6825c48a8e 100644
--- a/src/mame/drivers/cdc721.cpp
+++ b/src/mame/drivers/cdc721.cpp
@@ -268,7 +268,7 @@ uint32_t cdc721_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap
{
uint16_t ma = m_videoram[y * 2] | m_videoram[y * 2 + 1] << 8;
- for (ra = 0; ra < 16; ra++)
+ for (ra = 0; ra < 15; ra++)
{
uint16_t *p = &bitmap.pix16(sy++);
@@ -304,12 +304,13 @@ uint32_t cdc721_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap
return 0;
}
-MACHINE_CONFIG_START(cdc721_state::cdc721)
+void cdc721_state::cdc721(machine_config &config)
+{
// basic machine hardware
- MCFG_DEVICE_ADD("maincpu", Z80, 6_MHz_XTAL) // Zilog Z8400B (Z80B)
- MCFG_DEVICE_PROGRAM_MAP(mem_map)
- MCFG_DEVICE_IO_MAP(io_map)
- MCFG_DEVICE_IRQ_ACKNOWLEDGE_DRIVER(cdc721_state, restart_cb)
+ Z80(config, m_maincpu, 6_MHz_XTAL); // Zilog Z8400B (Z80B)
+ m_maincpu->set_addrmap(AS_PROGRAM, &cdc721_state::mem_map);
+ m_maincpu->set_addrmap(AS_IO, &cdc721_state::io_map);
+ m_maincpu->set_irq_acknowledge_callback(FUNC(cdc721_state::restart_cb));
ADDRESS_MAP_BANK(config, "block0").set_map(&cdc721_state::block0_map).set_options(ENDIANNESS_LITTLE, 8, 32, 0x4000);
ADDRESS_MAP_BANK(config, "block4").set_map(&cdc721_state::block4_map).set_options(ENDIANNESS_LITTLE, 8, 32, 0x4000);
@@ -319,15 +320,12 @@ MACHINE_CONFIG_START(cdc721_state::cdc721)
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0); // MCM51L01C45 (256x4) + battery
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */
- MCFG_SCREEN_UPDATE_DRIVER(cdc721_state, screen_update)
- MCFG_SCREEN_SIZE(640, 480)
- MCFG_SCREEN_VISIBLE_AREA(0, 639, 0, 479)
- MCFG_SCREEN_PALETTE("palette")
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_raw(12.936_MHz_XTAL, 800, 0, 640, 539, 0, 450);
+ screen.set_screen_update(FUNC(cdc721_state::screen_update));
+ screen.set_palette("palette");
PALETTE(config, "palette", FUNC(cdc721_state::cdc721_palette), 3);
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_cdc721)
+ GFXDECODE(config, "gfxdecode", "palette", gfx_cdc721);
CRT5037(config, m_crtc, 12.936_MHz_XTAL / 8).set_char_width(8);
m_crtc->set_screen("screen");
@@ -397,9 +395,8 @@ MACHINE_CONFIG_START(cdc721_state::cdc721)
chb.cts_handler().set("pbuart", FUNC(ins8250_device::cts_w));
chb.ri_handler().set("pbuart", FUNC(ins8250_device::ri_w));
- MCFG_INPUT_MERGER_ANY_HIGH("int2") // 74S05 (open collector)
- MCFG_INPUT_MERGER_OUTPUT_HANDLER(WRITELINE(*this, cdc721_state, int_w<2>))
-MACHINE_CONFIG_END
+ INPUT_MERGER_ANY_HIGH(config, "int2").output_handler().set(FUNC(cdc721_state::int_w<2>)); // 74S05 (open collector)
+}
ROM_START( cdc721 )
ROM_REGION( 0x4000, "resident", 0 )
diff --git a/src/mame/drivers/cdi.cpp b/src/mame/drivers/cdi.cpp
index 00c987e9332..6df32896e33 100644
--- a/src/mame/drivers/cdi.cpp
+++ b/src/mame/drivers/cdi.cpp
@@ -748,181 +748,179 @@ WRITE8_MEMBER( cdi_state::slave_io_w )
*************************/
// CD-i Mono-I system base
-MACHINE_CONFIG_START(cdi_state::cdimono1_base)
- MCFG_DEVICE_ADD("maincpu", SCC68070, CLOCK_A/2)
- MCFG_DEVICE_PROGRAM_MAP(cdimono1_mem)
+void cdi_state::cdimono1_base(machine_config &config)
+{
+ SCC68070(config, m_maincpu, CLOCK_A/2);
+ m_maincpu->set_addrmap(AS_PROGRAM, &cdi_state::cdimono1_mem);
- MCFG_DEVICE_ADD("mcd212", MCD212, 0)
- MCFG_VIDEO_SET_SCREEN("screen")
+ MCD212(config, m_mcd212, 0);
+ m_mcd212->set_screen("screen");
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(384, 302)
- MCFG_SCREEN_VISIBLE_AREA(0, 384-1, 22, 302-1) // TODO: dynamic resolution
- MCFG_SCREEN_UPDATE_DRIVER(cdi_state, screen_update_cdimono1)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(384, 302);
+ screen.set_visarea(0, 384-1, 22, 302-1); // TODO: dynamic resolution
+ screen.set_screen_update(FUNC(cdi_state::screen_update_cdimono1));
- MCFG_SCREEN_ADD("lcd", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(192, 22)
- MCFG_SCREEN_VISIBLE_AREA(0, 192-1, 0, 22-1)
- MCFG_SCREEN_UPDATE_DRIVER(cdi_state, screen_update_cdimono1_lcd)
+ SCREEN(config, m_lcd, SCREEN_TYPE_RASTER);
+ m_lcd->set_refresh_hz(60);
+ m_lcd->set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ m_lcd->set_size(192, 22);
+ m_lcd->set_visarea(0, 192-1, 0, 22-1);
+ m_lcd->set_screen_update(FUNC(cdi_state::screen_update_cdimono1_lcd));
- MCFG_PALETTE_ADD("palette", 0x100)
+ PALETTE(config, "palette").set_entries(0x100);
config.set_default_layout(layout_cdi);
- MCFG_DEVICE_ADD("scc68070", CDI_68070, 0, "maincpu")
+ CDI_68070(config, m_scc, 0, "maincpu");
- MCFG_DEVICE_ADD("cdic", CDI_CDIC, 0)
- MCFG_DEVICE_ADD("slave_hle", CDI_SLAVE, 0)
+ CDI_CDIC(config, m_cdic, 0);
+ CDI_SLAVE(config, m_slave_hle, 0);
/* sound hardware */
SPEAKER(config, "lspeaker").front_left();
SPEAKER(config, "rspeaker").front_right();
- MCFG_DEVICE_ADD( "dac1", DMADAC )
- MCFG_SOUND_ROUTE( ALL_OUTPUTS, "lspeaker", 1.0 )
+ DMADAC(config, m_dmadac[0]);
+ m_dmadac[0]->add_route(ALL_OUTPUTS, "lspeaker", 1.0);
- MCFG_DEVICE_ADD( "dac2", DMADAC )
- MCFG_SOUND_ROUTE( ALL_OUTPUTS, "rspeaker", 1.0 )
+ DMADAC(config, m_dmadac[1]);
+ m_dmadac[1]->add_route(ALL_OUTPUTS, "rspeaker", 1.0);
- MCFG_DEVICE_ADD( "cdda", CDDA )
- MCFG_SOUND_ROUTE( ALL_OUTPUTS, "lspeaker", 1.0 )
- MCFG_SOUND_ROUTE( ALL_OUTPUTS, "rspeaker", 1.0 )
+ CDDA(config, m_cdda);
+ m_cdda->add_route(ALL_OUTPUTS, "lspeaker", 1.0);
+ m_cdda->add_route(ALL_OUTPUTS, "rspeaker", 1.0);
- MCFG_DEVICE_ADD("mk48t08", MK48T08, 0)
-MACHINE_CONFIG_END
+ MK48T08(config, "mk48t08", 0);
+}
// CD-i model 220 (Mono-II, NTSC)
-MACHINE_CONFIG_START(cdi_state::cdimono2)
- MCFG_DEVICE_ADD("maincpu", SCC68070, CLOCK_A/2)
- MCFG_DEVICE_PROGRAM_MAP(cdimono2_mem)
+void cdi_state::cdimono2(machine_config &config)
+{
+ SCC68070(config, m_maincpu, CLOCK_A/2);
+ m_maincpu->set_addrmap(AS_PROGRAM, &cdi_state::cdimono2_mem);
- MCFG_DEVICE_ADD("mcd212", MCD212, 0)
- MCFG_VIDEO_SET_SCREEN("screen")
+ MCD212(config, m_mcd212, 0);
+ m_mcd212->set_screen("screen");
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(384, 302)
- MCFG_SCREEN_VISIBLE_AREA(0, 384-1, 22, 302-1) // TODO: dynamic resolution
- MCFG_SCREEN_UPDATE_DRIVER(cdi_state, screen_update_cdimono1)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(384, 302);
+ screen.set_visarea(0, 384-1, 22, 302-1); // TODO: dynamic resolution
+ screen.set_screen_update(FUNC(cdi_state::screen_update_cdimono1));
- MCFG_SCREEN_ADD("lcd", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(192, 22)
- MCFG_SCREEN_VISIBLE_AREA(0, 192-1, 0, 22-1)
- MCFG_SCREEN_UPDATE_DRIVER(cdi_state, screen_update_cdimono1_lcd)
+ SCREEN(config, m_lcd, SCREEN_TYPE_RASTER);
+ m_lcd->set_refresh_hz(60);
+ m_lcd->set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ m_lcd->set_size(192, 22);
+ m_lcd->set_visarea(0, 192-1, 0, 22-1);
+ m_lcd->set_screen_update(FUNC(cdi_state::screen_update_cdimono1_lcd));
- MCFG_PALETTE_ADD("palette", 0x100)
+ PALETTE(config, "palette").set_entries(0x100);
config.set_default_layout(layout_cdi);
MCFG_MACHINE_RESET_OVERRIDE( cdi_state, cdimono2 )
- MCFG_DEVICE_ADD("scc68070", CDI_68070, 0, "maincpu")
- MCFG_DEVICE_ADD("servo", M68HC05EG, 2000000) /* Unknown clock speed, docs say 2MHz internal clock */
- MCFG_DEVICE_PROGRAM_MAP(cdimono2_servo_mem)
- MCFG_DEVICE_ADD("slave", M68HC05EG, 2000000) /* Unknown clock speed, docs say 2MHz internal clock */
- MCFG_DEVICE_PROGRAM_MAP(cdimono2_slave_mem)
+ CDI_68070(config, m_scc, 0, "maincpu");
+ M68HC05EG(config, m_servo, 2000000); /* Unknown clock speed, docs say 2MHz internal clock */
+ m_servo->set_addrmap(AS_PROGRAM, &cdi_state::cdimono2_servo_mem);
+ M68HC05EG(config, m_slave, 2000000); /* Unknown clock speed, docs say 2MHz internal clock */
+ m_slave->set_addrmap(AS_PROGRAM, &cdi_state::cdimono2_slave_mem);
- MCFG_CDROM_ADD("cdrom")
- MCFG_CDROM_INTERFACE("cdi_cdrom")
- MCFG_SOFTWARE_LIST_ADD("cd_list","cdi")
- MCFG_SOFTWARE_LIST_FILTER("cd_list","!DVC")
+ CDROM(config, "cdrom").set_interface("cdi_cdrom");
+ SOFTWARE_LIST(config, "cd_list").set_original("cdi").set_filter("!DVC");
/* sound hardware */
SPEAKER(config, "lspeaker").front_left();
SPEAKER(config, "rspeaker").front_right();
- MCFG_DEVICE_ADD( "dac1", DMADAC )
- MCFG_SOUND_ROUTE( ALL_OUTPUTS, "lspeaker", 1.0 )
+ DMADAC(config, m_dmadac[0]);
+ m_dmadac[0]->add_route(ALL_OUTPUTS, "lspeaker", 1.0);
- MCFG_DEVICE_ADD( "dac2", DMADAC )
- MCFG_SOUND_ROUTE( ALL_OUTPUTS, "rspeaker", 1.0 )
+ DMADAC(config, m_dmadac[1]);
+ m_dmadac[1]->add_route(ALL_OUTPUTS, "rspeaker", 1.0);
- MCFG_DEVICE_ADD( "cdda", CDDA )
- MCFG_SOUND_ROUTE( ALL_OUTPUTS, "lspeaker", 1.0 )
- MCFG_SOUND_ROUTE( ALL_OUTPUTS, "rspeaker", 1.0 )
+ CDDA(config, m_cdda);
+ m_cdda->add_route(ALL_OUTPUTS, "lspeaker", 1.0);
+ m_cdda->add_route(ALL_OUTPUTS, "rspeaker", 1.0);
- MCFG_DEVICE_ADD("mk48t08", MK48T08, 0)
-MACHINE_CONFIG_END
+ MK48T08(config, "mk48t08", 0);
+}
-MACHINE_CONFIG_START(cdi_state::cdi910)
- MCFG_DEVICE_ADD("maincpu", SCC68070, CLOCK_A/2)
- MCFG_DEVICE_PROGRAM_MAP(cdi910_mem)
+void cdi_state::cdi910(machine_config &config)
+{
+ SCC68070(config, m_maincpu, CLOCK_A/2);
+ m_maincpu->set_addrmap(AS_PROGRAM, &cdi_state::cdi910_mem);
- MCFG_DEVICE_ADD("mcd212", MCD212, 0)
- MCFG_VIDEO_SET_SCREEN("screen")
+ MCD212(config, m_mcd212, 0);
+ m_mcd212->set_screen("screen");
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(384, 302)
- MCFG_SCREEN_VISIBLE_AREA(0, 384-1, 22, 302-1) // TODO: dynamic resolution
- MCFG_SCREEN_UPDATE_DRIVER(cdi_state, screen_update_cdimono1)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(384, 302);
+ screen.set_visarea(0, 384-1, 22, 302-1); // TODO: dynamic resolution
+ screen.set_screen_update(FUNC(cdi_state::screen_update_cdimono1));
- MCFG_SCREEN_ADD("lcd", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(192, 22)
- MCFG_SCREEN_VISIBLE_AREA(0, 192-1, 0, 22-1)
- MCFG_SCREEN_UPDATE_DRIVER(cdi_state, screen_update_cdimono1_lcd)
+ SCREEN(config, m_lcd, SCREEN_TYPE_RASTER);
+ m_lcd->set_refresh_hz(60);
+ m_lcd->set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ m_lcd->set_size(192, 22);
+ m_lcd->set_visarea(0, 192-1, 0, 22-1);
+ m_lcd->set_screen_update(FUNC(cdi_state::screen_update_cdimono1_lcd));
- MCFG_PALETTE_ADD("palette", 0x100)
+ PALETTE(config, "palette").set_entries(0x100);
config.set_default_layout(layout_cdi);
MCFG_MACHINE_RESET_OVERRIDE( cdi_state, cdimono2 )
- MCFG_DEVICE_ADD("scc68070", CDI_68070, 0, "maincpu")
- MCFG_DEVICE_ADD("servo", M68HC05EG, 2000000) /* Unknown clock speed, docs say 2MHz internal clock */
- MCFG_DEVICE_PROGRAM_MAP(cdimono2_servo_mem)
- MCFG_DEVICE_ADD("slave", M68HC05EG, 2000000) /* Unknown clock speed, docs say 2MHz internal clock */
- MCFG_DEVICE_PROGRAM_MAP(cdimono2_slave_mem)
+ CDI_68070(config, m_scc, 0, "maincpu");
+ M68HC05EG(config, m_servo, 2000000); /* Unknown clock speed, docs say 2MHz internal clock */
+ m_servo->set_addrmap(AS_PROGRAM, &cdi_state::cdimono2_servo_mem);
+ M68HC05EG(config, m_slave, 2000000); /* Unknown clock speed, docs say 2MHz internal clock */
+ m_slave->set_addrmap(AS_PROGRAM, &cdi_state::cdimono2_slave_mem);
- MCFG_CDROM_ADD( "cdrom" )
- MCFG_CDROM_INTERFACE("cdi_cdrom")
- MCFG_SOFTWARE_LIST_ADD("cd_list","cdi")
- MCFG_SOFTWARE_LIST_FILTER("cd_list","!DVC")
+ CDROM(config, "cdrom").set_interface("cdi_cdrom");
+ SOFTWARE_LIST(config, "cd_list").set_original("cdi").set_filter("!DVC");
/* sound hardware */
SPEAKER(config, "lspeaker").front_left();
SPEAKER(config, "rspeaker").front_right();
- MCFG_DEVICE_ADD( "dac1", DMADAC )
- MCFG_SOUND_ROUTE( ALL_OUTPUTS, "lspeaker", 1.0 )
+ DMADAC(config, m_dmadac[0]);
+ m_dmadac[0]->add_route(ALL_OUTPUTS, "lspeaker", 1.0);
- MCFG_DEVICE_ADD( "dac2", DMADAC )
- MCFG_SOUND_ROUTE( ALL_OUTPUTS, "rspeaker", 1.0 )
+ DMADAC(config, m_dmadac[1]);
+ m_dmadac[1]->add_route(ALL_OUTPUTS, "rspeaker", 1.0);
- MCFG_DEVICE_ADD( "cdda", CDDA )
- MCFG_SOUND_ROUTE( ALL_OUTPUTS, "lspeaker", 1.0 )
- MCFG_SOUND_ROUTE( ALL_OUTPUTS, "rspeaker", 1.0 )
+ CDDA(config, m_cdda);
+ m_cdda->add_route(ALL_OUTPUTS, "lspeaker", 1.0);
+ m_cdda->add_route(ALL_OUTPUTS, "rspeaker", 1.0);
- MCFG_DEVICE_ADD("mk48t08", MK48T08, 0)
-MACHINE_CONFIG_END
+ MK48T08(config, "mk48t08", 0);
+}
// CD-i Mono-I, with CD-ROM image device (MESS) and Software List (MESS)
-MACHINE_CONFIG_START(cdi_state::cdimono1)
+void cdi_state::cdimono1(machine_config &config)
+{
cdimono1_base(config);
MCFG_MACHINE_RESET_OVERRIDE(cdi_state, cdimono1)
- MCFG_CDROM_ADD( "cdrom" )
- MCFG_CDROM_INTERFACE("cdi_cdrom")
- MCFG_SOFTWARE_LIST_ADD("cd_list","cdi")
- MCFG_SOFTWARE_LIST_FILTER("cd_list","!DVC")
-MACHINE_CONFIG_END
+ CDROM(config, "cdrom").set_interface("cdi_cdrom");
+ SOFTWARE_LIST(config, "cd_list").set_original("cdi").set_filter("!DVC");
+}
-MACHINE_CONFIG_START(cdi_state::quizard)
+void cdi_state::quizard(machine_config &config)
+{
cdimono1_base(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(cdimono1_mem)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", cdi_state, mcu_frame)
-MACHINE_CONFIG_END
+ m_maincpu->set_addrmap(AS_PROGRAM, &cdi_state::cdimono1_mem);
+ m_maincpu->set_vblank_int("screen", FUNC(cdi_state::mcu_frame));
+}
READ8_MEMBER( cdi_state::quizard_mcu_p1_r )
diff --git a/src/mame/drivers/cedar_magnet.cpp b/src/mame/drivers/cedar_magnet.cpp
index ab81f0bfecc..4c545df2b14 100644
--- a/src/mame/drivers/cedar_magnet.cpp
+++ b/src/mame/drivers/cedar_magnet.cpp
@@ -172,34 +172,34 @@ private:
required_device<z80pio_device> m_ic48_pio;
required_device<z80pio_device> m_ic49_pio;
- DECLARE_READ8_MEMBER(ic48_pio_pa_r);
- DECLARE_WRITE8_MEMBER(ic48_pio_pa_w);
+ uint8_t ic48_pio_pa_r();
+ void ic48_pio_pa_w(uint8_t data);
- DECLARE_READ8_MEMBER(ic48_pio_pb_r);
- DECLARE_WRITE8_MEMBER(ic48_pio_pb_w);
+ uint8_t ic48_pio_pb_r();
+ void ic48_pio_pb_w(uint8_t data);
- DECLARE_READ8_MEMBER(ic49_pio_pb_r);
- DECLARE_WRITE8_MEMBER(ic49_pio_pb_w);
+ uint8_t ic49_pio_pb_r();
+ void ic49_pio_pb_w(uint8_t data);
// 1x range ports
- DECLARE_WRITE8_MEMBER(port18_w);
- DECLARE_WRITE8_MEMBER(port19_w);
- DECLARE_WRITE8_MEMBER(port1b_w);
+ void port18_w(uint8_t data);
+ void port19_w(uint8_t data);
+ void port1b_w(uint8_t data);
- DECLARE_READ8_MEMBER(port18_r);
- DECLARE_READ8_MEMBER(port19_r);
- DECLARE_READ8_MEMBER(port1a_r);
+ uint8_t port18_r();
+ uint8_t port19_r();
+ uint8_t port1a_r();
// 7x range ports
- DECLARE_WRITE8_MEMBER(rambank_palbank_w);
- DECLARE_WRITE8_MEMBER(palupload_w);
- DECLARE_WRITE8_MEMBER(paladdr_w);
- DECLARE_READ8_MEMBER(watchdog_r);
- DECLARE_READ8_MEMBER(port7c_r);
+ void rambank_palbank_w(uint8_t data);
+ void palupload_w(uint8_t data);
+ void paladdr_w(uint8_t data);
+ uint8_t watchdog_r();
+ uint8_t port7c_r();
// other ports
- DECLARE_READ8_MEMBER(other_cpu_r);
- DECLARE_WRITE8_MEMBER(other_cpu_w);
+ uint8_t other_cpu_r(offs_t offset);
+ void other_cpu_w(offs_t offset, uint8_t data);
uint8_t m_paladdr;
int m_palbank;
@@ -209,9 +209,9 @@ private:
uint8_t m_ic49_pio_pb_val;
void set_palette(int offset);
- DECLARE_WRITE8_MEMBER(palette_r_w);
- DECLARE_WRITE8_MEMBER(palette_g_w);
- DECLARE_WRITE8_MEMBER(palette_b_w);
+ void palette_r_w(offs_t offset, uint8_t data);
+ void palette_g_w(offs_t offset, uint8_t data);
+ void palette_b_w(offs_t offset, uint8_t data);
void handle_sub_board_cpu_lines(cedar_magnet_board_interface &dev, int old_data, int data);
INTERRUPT_GEN_MEMBER(irq);
@@ -317,7 +317,7 @@ void cedar_magnet_state::cedar_bank0(address_map &map)
***********************/
-WRITE8_MEMBER(cedar_magnet_state::rambank_palbank_w)
+void cedar_magnet_state::rambank_palbank_w(uint8_t data)
{
// ---- --xx
// xx = program bank
@@ -329,17 +329,17 @@ WRITE8_MEMBER(cedar_magnet_state::rambank_palbank_w)
m_sub_pal_bankdev->set_bank(palbank);
}
-WRITE8_MEMBER(cedar_magnet_state::palupload_w)
+void cedar_magnet_state::palupload_w(uint8_t data)
{
- m_sub_pal_bankdev->write8(space, m_paladdr, data);
+ m_sub_pal_bankdev->write8(m_paladdr, data);
}
-WRITE8_MEMBER(cedar_magnet_state::paladdr_w)
+void cedar_magnet_state::paladdr_w(uint8_t data)
{
m_paladdr = data;
}
-READ8_MEMBER(cedar_magnet_state::watchdog_r)
+uint8_t cedar_magnet_state::watchdog_r()
{
// watchdog
return 0x00;
@@ -352,7 +352,7 @@ READ8_MEMBER(cedar_magnet_state::watchdog_r)
***********************/
-READ8_MEMBER(cedar_magnet_state::port7c_r)
+uint8_t cedar_magnet_state::port7c_r()
{
//logerror("%s: port7c_r\n", machine().describe_context());
return 0x01;
@@ -366,18 +366,18 @@ READ8_MEMBER(cedar_magnet_state::port7c_r)
***********************/
-READ8_MEMBER(cedar_magnet_state::port18_r)
+uint8_t cedar_magnet_state::port18_r()
{
// logerror("%s: port18_r\n", machine().describe_context());
return 0x00;
}
-WRITE8_MEMBER(cedar_magnet_state::port18_w)
+void cedar_magnet_state::port18_w(uint8_t data)
{
// logerror("%s: port18_w %02x\n", machine().describe_context(), data);
}
-READ8_MEMBER(cedar_magnet_state::port19_r)
+uint8_t cedar_magnet_state::port19_r()
{
uint8_t ret = 0x00;
// logerror("%s: port19_r\n", machine().describe_context());
@@ -390,19 +390,19 @@ READ8_MEMBER(cedar_magnet_state::port19_r)
return ret;
}
-READ8_MEMBER(cedar_magnet_state::port1a_r)
+uint8_t cedar_magnet_state::port1a_r()
{
// logerror("%s: port1a_r\n", machine().describe_context());
return 0x00;
}
-WRITE8_MEMBER(cedar_magnet_state::port19_w)
+void cedar_magnet_state::port19_w(uint8_t data)
{
// logerror("%s: port19_w %02x\n", machine().describe_context(), data);
}
-WRITE8_MEMBER(cedar_magnet_state::port1b_w)
+void cedar_magnet_state::port1b_w(uint8_t data)
{
// logerror("%s: port1b_w %02x\n", machine().describe_context(), data);
}
@@ -418,19 +418,19 @@ void cedar_magnet_state::set_palette(int offset)
m_palette->set_pen_color(offset^0xff, pal4bit(m_pal_r[offset]), pal4bit(m_pal_g[offset]), pal4bit(m_pal_b[offset]));
}
-WRITE8_MEMBER(cedar_magnet_state::palette_r_w)
+void cedar_magnet_state::palette_r_w(offs_t offset, uint8_t data)
{
m_pal_r[offset] = data;
set_palette(offset);
}
-WRITE8_MEMBER(cedar_magnet_state::palette_g_w)
+void cedar_magnet_state::palette_g_w(offs_t offset, uint8_t data)
{
m_pal_g[offset] = data;
set_palette(offset);
}
-WRITE8_MEMBER(cedar_magnet_state::palette_b_w)
+void cedar_magnet_state::palette_b_w(offs_t offset, uint8_t data)
{
m_pal_b[offset] = data;
set_palette(offset);
@@ -460,7 +460,7 @@ void cedar_magnet_state::video_start()
***********************/
-READ8_MEMBER(cedar_magnet_state::other_cpu_r)
+uint8_t cedar_magnet_state::other_cpu_r(offs_t offset)
{
int bankbit0 = (m_ic48_pio_pa_val & 0x60) >> 5;
int plane0select = (m_ic48_pio_pa_val & 0x07) >> 0;
@@ -509,7 +509,7 @@ READ8_MEMBER(cedar_magnet_state::other_cpu_r)
return ret;
}
-WRITE8_MEMBER(cedar_magnet_state::other_cpu_w)
+void cedar_magnet_state::other_cpu_w(offs_t offset, uint8_t data)
{
int bankbit0 = (m_ic48_pio_pa_val & 0x60) >> 5;
int plane0select = (m_ic48_pio_pa_val & 0x07) >> 0;
@@ -579,7 +579,7 @@ void cedar_magnet_state::handle_sub_board_cpu_lines(cedar_magnet_board_interface
***********************/
-READ8_MEMBER( cedar_magnet_state::ic48_pio_pa_r ) // 0x20
+uint8_t cedar_magnet_state::ic48_pio_pa_r() // 0x20
{
uint8_t ret = m_ic48_pio_pa_val & ~0x08;
@@ -593,7 +593,7 @@ READ8_MEMBER( cedar_magnet_state::ic48_pio_pa_r ) // 0x20
return ret;
}
-WRITE8_MEMBER( cedar_magnet_state::ic48_pio_pa_w ) // 0x20
+void cedar_magnet_state::ic48_pio_pa_w(uint8_t data) // 0x20
{
int oldplane0select = (m_ic48_pio_pa_val & 0x07) >> 0;
@@ -621,7 +621,7 @@ WRITE8_MEMBER( cedar_magnet_state::ic48_pio_pa_w ) // 0x20
}
-READ8_MEMBER( cedar_magnet_state::ic48_pio_pb_r ) // 0x22
+uint8_t cedar_magnet_state::ic48_pio_pb_r() // 0x22
{
uint8_t ret = m_ic48_pio_pb_val & ~0x80;
@@ -634,7 +634,7 @@ READ8_MEMBER( cedar_magnet_state::ic48_pio_pb_r ) // 0x22
return ret;
}
-WRITE8_MEMBER(cedar_magnet_state::ic48_pio_pb_w) // 0x22
+void cedar_magnet_state::ic48_pio_pb_w(uint8_t data) // 0x22
{
int oldplane1select = (m_ic48_pio_pb_val & 0x07) >> 0;
int oldspriteselect = (m_ic48_pio_pb_val & 0x70) >> 4;
@@ -667,7 +667,7 @@ WRITE8_MEMBER(cedar_magnet_state::ic48_pio_pb_w) // 0x22
***********************/
-READ8_MEMBER( cedar_magnet_state::ic49_pio_pb_r ) // 0x42
+uint8_t cedar_magnet_state::ic49_pio_pb_r() // 0x42
{
uint8_t ret = m_ic49_pio_pb_val;
@@ -677,7 +677,7 @@ READ8_MEMBER( cedar_magnet_state::ic49_pio_pb_r ) // 0x42
return ret;
}
-WRITE8_MEMBER( cedar_magnet_state::ic49_pio_pb_w ) // 0x42
+void cedar_magnet_state::ic49_pio_pb_w(uint8_t data) // 0x42
{
int oldsoundselect = (m_ic49_pio_pb_val & 0x70) >> 4;
@@ -767,13 +767,13 @@ INTERRUPT_GEN_MEMBER(cedar_magnet_state::irq)
m_cedsprite->irq_hold();
}
-MACHINE_CONFIG_START(cedar_magnet_state::cedar_magnet)
-
+void cedar_magnet_state::cedar_magnet(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80,4000000) /* ? MHz */
- MCFG_DEVICE_PROGRAM_MAP(cedar_magnet_map)
- MCFG_DEVICE_IO_MAP(cedar_magnet_io)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", cedar_magnet_state, irq)
+ Z80(config, m_maincpu, 4000000); /* ? MHz */
+ m_maincpu->set_addrmap(AS_PROGRAM, &cedar_magnet_state::cedar_magnet_map);
+ m_maincpu->set_addrmap(AS_IO, &cedar_magnet_state::cedar_magnet_io);
+ m_maincpu->set_vblank_int("screen", FUNC(cedar_magnet_state::irq));
ADDRESS_MAP_BANK(config, "bank0").set_map(&cedar_magnet_state::cedar_bank0).set_options(ENDIANNESS_LITTLE, 8, 18, 0x10000);
ADDRESS_MAP_BANK(config, "mb_sub_ram").set_map(&cedar_magnet_state::cedar_magnet_mainboard_sub_ram_map).set_options(ENDIANNESS_LITTLE, 8, 18, 0x10000);
@@ -794,15 +794,15 @@ MACHINE_CONFIG_START(cedar_magnet_state::cedar_magnet)
m_ic49_pio->out_pb_callback().set(FUNC(cedar_magnet_state::ic49_pio_pb_w));
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(50)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(256, 256)
- MCFG_SCREEN_VISIBLE_AREA(0, 256-8-1, 0, 192-1)
- MCFG_SCREEN_UPDATE_DRIVER(cedar_magnet_state, screen_update_cedar_magnet)
- MCFG_SCREEN_PALETTE("palette")
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(50);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(256, 256);
+ screen.set_visarea(0, 256-8-1, 0, 192-1);
+ screen.set_screen_update(FUNC(cedar_magnet_state::screen_update_cedar_magnet));
+ screen.set_palette(m_palette);
- MCFG_PALETTE_ADD("palette", 0x400)
+ PALETTE(config, m_palette).set_entries(0x400);
CEDAR_MAGNET_SOUND(config, m_cedsound, 0);
CEDAR_MAGNET_PLANE(config, m_cedplane0, 0);
@@ -811,8 +811,8 @@ MACHINE_CONFIG_START(cedar_magnet_state::cedar_magnet)
CEDAR_MAGNET_FLOP(config, "flop", 0);
- MCFG_QUANTUM_PERFECT_CPU("maincpu")
-MACHINE_CONFIG_END
+ config.m_perfect_cpu_quantum = subtag("maincpu");
+}
#define BIOS_ROM \
diff --git a/src/mame/drivers/centiped.cpp b/src/mame/drivers/centiped.cpp
index e887a21948b..02a1e5668af 100644
--- a/src/mame/drivers/centiped.cpp
+++ b/src/mame/drivers/centiped.cpp
@@ -761,14 +761,14 @@ void centiped_state::caterplr_map(address_map &map)
WRITE8_MEMBER(centiped_state::caterplr_AY8910_w)
{
- m_aysnd->address_w(space, 0, offset);
- m_aysnd->data_w(space, 0, data);
+ m_aysnd->address_w(offset);
+ m_aysnd->data_w(data);
}
READ8_MEMBER(centiped_state::caterplr_AY8910_r)
{
- m_aysnd->address_w(space, 0, offset);
- return m_aysnd->data_r(space, 0);
+ m_aysnd->address_w(offset);
+ return m_aysnd->data_r();
}
@@ -985,7 +985,7 @@ void centiped_state::bullsdrt_port_map(address_map &map)
void centiped_state::bullsdrt_data_map(address_map &map)
{
- map(S2650_DATA_PORT, S2650_DATA_PORT).r(FUNC(centiped_state::bullsdrt_data_port_r)).w("snsnd", FUNC(sn76496_device::command_w));
+ map(S2650_DATA_PORT, S2650_DATA_PORT).r(FUNC(centiped_state::bullsdrt_data_port_r)).w("snsnd", FUNC(sn76496_device::write));
}
diff --git a/src/mame/drivers/cesclass.cpp b/src/mame/drivers/cesclass.cpp
index abbe6c160c1..a8633d13ae7 100644
--- a/src/mame/drivers/cesclass.cpp
+++ b/src/mame/drivers/cesclass.cpp
@@ -248,29 +248,28 @@ void cesclassic_state::cesclassic_palette(palette_device &palette) const
palette.set_pen_color(i, pal2bit(i), 0, 0);
}
-MACHINE_CONFIG_START(cesclassic_state::cesclassic)
-
- MCFG_DEVICE_ADD("maincpu", M68000, 24000000/2 )
- MCFG_DEVICE_PROGRAM_MAP(cesclassic_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("l_lcd", cesclassic_state, irq2_line_assert) // TODO: unknown sources
- MCFG_DEVICE_PERIODIC_INT_DRIVER(cesclassic_state, irq3_line_assert, 60*8)
+void cesclassic_state::cesclassic(machine_config &config)
+{
+ M68000(config, m_maincpu, 24000000/2);
+ m_maincpu->set_addrmap(AS_PROGRAM, &cesclassic_state::cesclassic_map);
+ m_maincpu->set_vblank_int("l_lcd", FUNC(cesclassic_state::irq2_line_assert)); // TODO: unknown sources
+ m_maincpu->set_periodic_int(FUNC(cesclassic_state::irq3_line_assert), attotime::from_hz(60*8));
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
/* video hardware */
- MCFG_SCREEN_ADD("l_lcd", LCD)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500))
- MCFG_SCREEN_UPDATE_DRIVER(cesclassic_state, screen_update)
- MCFG_SCREEN_SIZE(8*16*2, 8*8+3*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 8*16*2-1, 0*8, 8*8-1)
+ screen_device &screen(SCREEN(config, "l_lcd", SCREEN_TYPE_LCD));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500));
+ screen.set_screen_update(FUNC(cesclassic_state::screen_update));
+ screen.set_size(8*16*2, 8*8+3*8);
+ screen.set_visarea(0*8, 8*16*2-1, 0*8, 8*8-1);
PALETTE(config, m_palette, FUNC(cesclassic_state::cesclassic_palette), 4);
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("oki", OKIM6295, 24000000/16, okim6295_device::PIN7_LOW)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.5)
-MACHINE_CONFIG_END
+ OKIM6295(config, m_oki, 24000000/16, okim6295_device::PIN7_LOW).add_route(ALL_OUTPUTS, "mono", 0.5);
+}
ROM_START(hrclass)
diff --git a/src/mame/drivers/cgc7900.cpp b/src/mame/drivers/cgc7900.cpp
index 58508504108..6a9ee61a639 100644
--- a/src/mame/drivers/cgc7900.cpp
+++ b/src/mame/drivers/cgc7900.cpp
@@ -458,17 +458,19 @@ void cgc7900_state::machine_reset()
MACHINE_DRIVER( cgc7900 )
-------------------------------------------------*/
-MACHINE_CONFIG_START(cgc7900_state::cgc7900)
+void cgc7900_state::cgc7900(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD(M68000_TAG, M68000, XTAL(28'480'000)/4)
- MCFG_DEVICE_PROGRAM_MAP(cgc7900_mem)
+ M68000(config, m_maincpu, XTAL(28'480'000)/4);
+ m_maincpu->set_addrmap(AS_PROGRAM, &cgc7900_state::cgc7900_mem);
i8035_device &kbmcu(I8035(config, I8035_TAG, 1000000));
kbmcu.set_addrmap(AS_PROGRAM, &cgc7900_state::keyboard_mem);
kbmcu.set_disable();
-/* MCFG_DEVICE_ADD(AM2910_TAG, AM2910, XTAL(17'360'000))
- MCFG_DEVICE_PROGRAM_MAP(omti10_mem)*/
+// am2910_device &am2910(AM2910(config, AM2910_TAG, XTAL(17'360'000)));
+// am2910.set_addrmap(AS_PROGRAM, &cgc7900_state::omti10_mem);
+
/* video hardware */
cgc7900_video(config);
@@ -481,8 +483,8 @@ MACHINE_CONFIG_START(cgc7900_state::cgc7900)
generic_keyboard_device &keyboard(GENERIC_KEYBOARD(config, "keyboard", 0));
keyboard.set_keyboard_callback(FUNC(cgc7900_state::kbd_put));
- MCFG_DEVICE_ADD(MM58167_TAG, MM58167, XTAL(32'768))
- MCFG_MM58167_IRQ_CALLBACK(WRITELINE(*this, cgc7900_state, irq<0x0>))
+ mm58167_device &rtc(MM58167(config, MM58167_TAG, XTAL(32'768)));
+ rtc.irq().set(FUNC(cgc7900_state::irq<0x0>));
com8116_device &k1135a(COM8116(config, K1135A_TAG, XTAL(5'068'800)));
k1135a.fr_handler().set(m_i8251_0, FUNC(i8251_device::write_txc));
@@ -511,7 +513,7 @@ MACHINE_CONFIG_START(cgc7900_state::cgc7900)
rs232_port_device &rs449(RS232_PORT(config, "rs449", default_rs232_devices, nullptr));
rs449.rxd_handler().set(m_i8251_1, FUNC(i8251_device::write_rxd));
rs449.dsr_handler().set(m_i8251_1, FUNC(i8251_device::write_dsr));
-MACHINE_CONFIG_END
+}
/***************************************************************************
ROMS
diff --git a/src/mame/drivers/cgenie.cpp b/src/mame/drivers/cgenie.cpp
index 65dcfeb85ca..b8728da66b5 100644
--- a/src/mame/drivers/cgenie.cpp
+++ b/src/mame/drivers/cgenie.cpp
@@ -306,10 +306,6 @@ void cgenie_state::machine_start()
{
// setup ram
m_maincpu->space(AS_PROGRAM).install_ram(0x4000, 0x4000 + m_ram->size() - 1, m_ram->pointer());
-
- // setup expansion bus
- m_exp->set_program_space(&m_maincpu->space(AS_PROGRAM));
- m_exp->set_io_space(&m_maincpu->space(AS_IO));
}
@@ -438,16 +434,17 @@ const rgb_t cgenie_state::m_palette_nz[] =
// MACHINE DEFINTIONS
//**************************************************************************
-MACHINE_CONFIG_START(cgenie_state::cgenie)
+void cgenie_state::cgenie(machine_config &config)
+{
// basic machine hardware
- MCFG_DEVICE_ADD("maincpu", Z80, XTAL(17'734'470) / 8) // 2.2168 MHz
- MCFG_DEVICE_PROGRAM_MAP(cgenie_mem)
- MCFG_DEVICE_IO_MAP(cgenie_io)
+ Z80(config, m_maincpu, XTAL(17'734'470) / 8); // 2.2168 MHz
+ m_maincpu->set_addrmap(AS_PROGRAM, &cgenie_state::cgenie_mem);
+ m_maincpu->set_addrmap(AS_IO, &cgenie_state::cgenie_io);
// video hardware
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_RAW_PARAMS(XTAL(17'734'470) / 2, 568, 32, 416, 312, 28, 284)
- MCFG_SCREEN_UPDATE_DEVICE("crtc", hd6845_device, screen_update)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_raw(XTAL(17'734'470) / 2, 568, 32, 416, 312, 28, 284);
+ screen.set_screen_update("crtc", FUNC(hd6845_device::screen_update));
HD6845(config, m_crtc, XTAL(17'734'470) / 16);
m_crtc->set_screen("screen");
@@ -465,12 +462,12 @@ MACHINE_CONFIG_START(cgenie_state::cgenie)
ay8910.port_b_write_callback().set("par", FUNC(cg_parallel_slot_device::pb_w));
ay8910.add_route(ALL_OUTPUTS, "mono", 0.75);
- MCFG_CASSETTE_ADD("cassette")
- MCFG_CASSETTE_FORMATS(cgenie_cassette_formats)
- MCFG_CASSETTE_DEFAULT_STATE(CASSETTE_STOPPED)
- MCFG_CASSETTE_INTERFACE("cgenie_cass")
+ CASSETTE(config, m_cassette);
+ m_cassette->set_formats(cgenie_cassette_formats);
+ m_cassette->set_default_state(CASSETTE_STOPPED);
+ m_cassette->set_interface("cgenie_cass");
- MCFG_SOFTWARE_LIST_ADD("cass_list", "cgenie_cass")
+ SOFTWARE_LIST(config, "cass_list").set_original("cgenie_cass");
// serial port
rs232_port_device &rs232(RS232_PORT(config, "rs232", default_rs232_devices, nullptr));
@@ -478,15 +475,17 @@ MACHINE_CONFIG_START(cgenie_state::cgenie)
rs232.dcd_handler().set(FUNC(cgenie_state::rs232_dcd_w));
// cartridge expansion slot
- MCFG_CG_EXP_SLOT_ADD("exp")
- MCFG_CG_EXP_SLOT_INT_HANDLER(INPUTLINE("maincpu", INPUT_LINE_IRQ0))
+ CG_EXP_SLOT(config, m_exp);
+ m_exp->set_program_space(m_maincpu, AS_PROGRAM);
+ m_exp->set_io_space(m_maincpu, AS_IO);
+ m_exp->int_handler().set_inputline(m_maincpu, INPUT_LINE_IRQ0);
// parallel slot
- MCFG_CG_PARALLEL_SLOT_ADD("par")
+ CG_PARALLEL_SLOT(config, "par");
// internal ram
RAM(config, RAM_TAG).set_default_size("16K").set_extra_options("32K");
-MACHINE_CONFIG_END
+}
//**************************************************************************
diff --git a/src/mame/drivers/chaknpop.cpp b/src/mame/drivers/chaknpop.cpp
index 9da44e2bae3..01feb17a84e 100644
--- a/src/mame/drivers/chaknpop.cpp
+++ b/src/mame/drivers/chaknpop.cpp
@@ -362,24 +362,24 @@ void chaknpop_state::machine_reset()
m_flip_y = 0;
}
-MACHINE_CONFIG_START(chaknpop_state::chaknpop)
-
+void chaknpop_state::chaknpop(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, XTAL(18'000'000) / 6) // Verified on PCB
- MCFG_DEVICE_PROGRAM_MAP(chaknpop_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", chaknpop_state, irq0_line_hold)
+ Z80(config, m_maincpu, XTAL(18'000'000) / 6); // Verified on PCB
+ m_maincpu->set_addrmap(AS_PROGRAM, &chaknpop_state::chaknpop_map);
+ m_maincpu->set_vblank_int("screen", FUNC(chaknpop_state::irq0_line_hold));
- MCFG_DEVICE_ADD("bmcu", TAITO68705_MCU, XTAL(18'000'000) / 6) // Verified on PCB
- MCFG_QUANTUM_TIME(attotime::from_hz(6000)) // 100 CPU slices per frame - a high value to ensure proper synchronization of the CPUs
+ TAITO68705_MCU(config, m_bmcu, XTAL(18'000'000) / 6); // Verified on PCB
+ config.m_minimum_quantum = attotime::from_hz(6000); // 100 CPU slices per frame - a high value to ensure proper synchronization of the CPUs
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(59.1828)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(32*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(chaknpop_state, screen_update)
- MCFG_SCREEN_PALETTE(m_palette)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(59.1828);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(32*8, 32*8);
+ screen.set_visarea(0*8, 32*8-1, 2*8, 30*8-1);
+ screen.set_screen_update(FUNC(chaknpop_state::screen_update));
+ screen.set_palette(m_palette);
GFXDECODE(config, m_gfxdecode, m_palette, gfx_chaknpop);
PALETTE(config, m_palette, FUNC(chaknpop_state::chaknpop_palette), 1024);
@@ -396,7 +396,7 @@ MACHINE_CONFIG_START(chaknpop_state::chaknpop)
ay2.port_a_write_callback().set(FUNC(chaknpop_state::unknown_port_1_w)); // ??
ay2.port_b_write_callback().set(FUNC(chaknpop_state::unknown_port_2_w)); // ??
ay2.add_route(ALL_OUTPUTS, "mono", 0.10);
-MACHINE_CONFIG_END
+}
/***************************************************************************
diff --git a/src/mame/drivers/champbas.cpp b/src/mame/drivers/champbas.cpp
index 0d928689e43..8bc7082d3a3 100644
--- a/src/mame/drivers/champbas.cpp
+++ b/src/mame/drivers/champbas.cpp
@@ -512,13 +512,6 @@ void champbas_state::machine_start()
save_item(NAME(m_gfx_bank));
}
-void champbas_state::machine_reset()
-{
- // 74LS259 is auto CLR on reset
- for (int i = 0; i < 8; i++)
- m_maincpu->space(AS_PROGRAM).write_byte(0xa000 + i, 0);
-}
-
INTERRUPT_GEN_MEMBER(champbas_state::vblank_irq)
{
if (m_irq_mask)
@@ -526,12 +519,12 @@ INTERRUPT_GEN_MEMBER(champbas_state::vblank_irq)
}
-MACHINE_CONFIG_START(champbas_state::talbot)
-
+void champbas_state::talbot(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, XTAL(18'432'000)/6)
- MCFG_DEVICE_PROGRAM_MAP(champbasj_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", champbas_state, vblank_irq)
+ Z80(config, m_maincpu, XTAL(18'432'000)/6);
+ m_maincpu->set_addrmap(AS_PROGRAM, &champbas_state::champbasj_map);
+ m_maincpu->set_vblank_int("screen", FUNC(champbas_state::vblank_irq));
LS259(config, m_mainlatch);
m_mainlatch->q_out_cb<0>().set(FUNC(champbas_state::irq_enable_w));
@@ -543,20 +536,20 @@ MACHINE_CONFIG_START(champbas_state::talbot)
m_mainlatch->q_out_cb<6>().set(FUNC(champbas_state::mcu_start_w));
m_mainlatch->q_out_cb<7>().set(FUNC(champbas_state::mcu_switch_w));
- MCFG_DEVICE_ADD("alpha_8201", ALPHA_8201, XTAL(18'432'000)/6/8)
- MCFG_QUANTUM_PERFECT_CPU("alpha_8201:mcu")
+ ALPHA_8201(config, m_alpha_8201, XTAL(18'432'000)/6/8);
+ config.m_perfect_cpu_quantum = subtag("alpha_8201:mcu");
WATCHDOG_TIMER(config, m_watchdog).set_vblank_count("screen", 0x10);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_SIZE(32*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0, 32*8-1, 2*8, 30*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(champbas_state, screen_update_champbas)
- MCFG_SCREEN_PALETTE(m_palette)
-
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, m_palette, gfx_talbot)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_size(32*8, 32*8);
+ screen.set_visarea(0, 32*8-1, 2*8, 30*8-1);
+ screen.set_screen_update(FUNC(champbas_state::screen_update_champbas));
+ screen.set_palette(m_palette);
+
+ GFXDECODE(config, m_gfxdecode, m_palette, gfx_talbot);
PALETTE(config, m_palette, FUNC(champbas_state::champbas_palette), 512, 32);
/* sound hardware */
@@ -565,15 +558,15 @@ MACHINE_CONFIG_START(champbas_state::talbot)
GENERIC_LATCH_8(config, "soundlatch");
AY8910(config, "ay1", XTAL(18'432'000)/12).add_route(ALL_OUTPUTS, "speaker", 0.5);
-MACHINE_CONFIG_END
-
+}
-MACHINE_CONFIG_START(champbas_state::champbas)
+void champbas_state::champbas(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, XTAL(18'432'000)/6)
- MCFG_DEVICE_PROGRAM_MAP(champbas_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", champbas_state, vblank_irq)
+ Z80(config, m_maincpu, XTAL(18'432'000)/6);
+ m_maincpu->set_addrmap(AS_PROGRAM, &champbas_state::champbas_map);
+ m_maincpu->set_vblank_int("screen", FUNC(champbas_state::vblank_irq));
LS259(config, m_mainlatch); // 9D; 8G on Champion Baseball II Double Board Configuration
m_mainlatch->q_out_cb<0>().set(FUNC(champbas_state::irq_enable_w));
@@ -585,20 +578,20 @@ MACHINE_CONFIG_START(champbas_state::champbas)
m_mainlatch->q_out_cb<6>().set_nop(); // no MCU
m_mainlatch->q_out_cb<7>().set_nop(); // no MCU
- MCFG_DEVICE_ADD("audiocpu", Z80, XTAL(18'432'000)/6)
- MCFG_DEVICE_PROGRAM_MAP(champbas_sound_map)
+ z80_device &audiocpu(Z80(config, "audiocpu", XTAL(18'432'000)/6));
+ audiocpu.set_addrmap(AS_PROGRAM, &champbas_state::champbas_sound_map);
WATCHDOG_TIMER(config, m_watchdog).set_vblank_count("screen", 0x10);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_SIZE(32*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(champbas_state, screen_update_champbas)
- MCFG_SCREEN_PALETTE(m_palette)
-
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, m_palette, gfx_champbas)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_size(32*8, 32*8);
+ screen.set_visarea(0*8, 32*8-1, 2*8, 30*8-1);
+ screen.set_screen_update(FUNC(champbas_state::screen_update_champbas));
+ screen.set_palette(m_palette);
+
+ GFXDECODE(config, m_gfxdecode, m_palette, gfx_champbas);
PALETTE(config, m_palette, FUNC(champbas_state::champbas_palette), 512, 32);
/* sound hardware */
@@ -608,73 +601,74 @@ MACHINE_CONFIG_START(champbas_state::champbas)
AY8910(config, "ay1", XTAL(18'432'000)/12).add_route(ALL_OUTPUTS, "speaker", 0.3);
- MCFG_DEVICE_ADD("dac", DAC_6BIT_R2R, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 0.7) // unknown DAC
- MCFG_DEVICE_ADD("vref", VOLTAGE_REGULATOR, 0) MCFG_VOLTAGE_REGULATOR_OUTPUT(5.0)
- MCFG_SOUND_ROUTE(0, "dac", 1.0, DAC_VREF_POS_INPUT) MCFG_SOUND_ROUTE(0, "dac", -1.0, DAC_VREF_NEG_INPUT)
-MACHINE_CONFIG_END
+ DAC_6BIT_R2R(config, "dac", 0).add_route(ALL_OUTPUTS, "speaker", 0.7); // unknown DAC
+ voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref"));
+ vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT);
+ vref.add_route(0, "dac", -1.0, DAC_VREF_NEG_INPUT);
+}
-MACHINE_CONFIG_START(champbas_state::champbasj)
+void champbas_state::champbasj(machine_config &config)
+{
champbas(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(champbasj_map)
+ m_maincpu->set_addrmap(AS_PROGRAM, &champbas_state::champbasj_map);
m_mainlatch->q_out_cb<6>().set(FUNC(champbas_state::mcu_start_w));
m_mainlatch->q_out_cb<7>().set(FUNC(champbas_state::mcu_switch_w));
- MCFG_DEVICE_ADD("alpha_8201", ALPHA_8201, XTAL(18'432'000)/6/8) // note: 8302 rom on champbb2 (same device!)
- MCFG_QUANTUM_PERFECT_CPU("alpha_8201:mcu")
-MACHINE_CONFIG_END
+ ALPHA_8201(config, m_alpha_8201, XTAL(18'432'000)/6/8); // note: 8302 rom on champbb2 (same device!)
+ config.m_perfect_cpu_quantum = subtag("alpha_8201:mcu");
+}
-MACHINE_CONFIG_START(champbas_state::champbasja)
+void champbas_state::champbasja(machine_config &config)
+{
champbas(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(champbasja_map)
-MACHINE_CONFIG_END
+ m_maincpu->set_addrmap(AS_PROGRAM, &champbas_state::champbasja_map);
+}
-MACHINE_CONFIG_START(champbas_state::champbasjb)
+void champbas_state::champbasjb(machine_config &config)
+{
champbas(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(champbasjb_map)
-MACHINE_CONFIG_END
+ m_maincpu->set_addrmap(AS_PROGRAM, &champbas_state::champbasjb_map);
+}
-MACHINE_CONFIG_START(champbas_state::champbb2)
+void champbas_state::champbb2(machine_config &config)
+{
champbasj(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(champbb2_map)
-MACHINE_CONFIG_END
+ m_maincpu->set_addrmap(AS_PROGRAM, &champbas_state::champbb2_map);
+}
-MACHINE_CONFIG_START(champbas_state::champbb2j)
+void champbas_state::champbb2j(machine_config &config)
+{
champbb2(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(champbb2j_map)
-MACHINE_CONFIG_END
+ m_maincpu->set_addrmap(AS_PROGRAM, &champbas_state::champbb2j_map);
+}
-MACHINE_CONFIG_START(champbas_state::tbasebal)
+void champbas_state::tbasebal(machine_config &config)
+{
champbas(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(tbasebal_map)
-
- MCFG_DEVICE_ADD("mcu", M68705P3, XTAL(18'432'000)/6) // ?Mhz
-MACHINE_CONFIG_END
+ m_maincpu->set_addrmap(AS_PROGRAM, &champbas_state::tbasebal_map);
+ M68705P3(config, "mcu", XTAL(18'432'000)/6); // ?Mhz
+}
-MACHINE_CONFIG_START(exctsccr_state::exctsccr)
+void exctsccr_state::exctsccr(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, XTAL(18'432'000)/6 )
- MCFG_DEVICE_PROGRAM_MAP(exctsccr_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", exctsccr_state, vblank_irq)
+ Z80(config, m_maincpu, XTAL(18'432'000)/6);
+ m_maincpu->set_addrmap(AS_PROGRAM, &exctsccr_state::exctsccr_map);
+ m_maincpu->set_vblank_int("screen", FUNC(exctsccr_state::vblank_irq));
LS259(config, m_mainlatch);
m_mainlatch->q_out_cb<0>().set(FUNC(exctsccr_state::irq_enable_w));
@@ -686,28 +680,29 @@ MACHINE_CONFIG_START(exctsccr_state::exctsccr)
m_mainlatch->q_out_cb<6>().set(FUNC(exctsccr_state::mcu_start_w));
m_mainlatch->q_out_cb<7>().set(FUNC(exctsccr_state::mcu_switch_w));
- MCFG_DEVICE_ADD("audiocpu", Z80, XTAL(14'318'181)/4 )
- MCFG_DEVICE_PROGRAM_MAP(exctsccr_sound_map)
- MCFG_DEVICE_IO_MAP(exctsccr_sound_io_map)
- MCFG_DEVICE_PERIODIC_INT_DRIVER(exctsccr_state, nmi_line_pulse, 4000) // 4 kHz, updates the dac
+ Z80(config, m_audiocpu, XTAL(14'318'181)/4);
+ m_audiocpu->set_addrmap(AS_PROGRAM, &exctsccr_state::exctsccr_sound_map);
+ m_audiocpu->set_addrmap(AS_IO, &exctsccr_state::exctsccr_sound_io_map);
+ m_audiocpu->set_periodic_int(FUNC(exctsccr_state::nmi_line_pulse), attotime::from_hz(4000)); // 4 kHz, updates the dac
- MCFG_TIMER_DRIVER_ADD_PERIODIC("exc_snd_irq", exctsccr_state, exctsccr_sound_irq, attotime::from_hz(75)) // irq source unknown, determines music tempo
- MCFG_TIMER_START_DELAY(attotime::from_hz(75))
+ timer_device &exc_snd_irq(TIMER(config, "exc_snd_irq"));
+ exc_snd_irq.configure_periodic(FUNC(exctsccr_state::exctsccr_sound_irq), attotime::from_hz(75)); // irq source unknown, determines music tempo
+ exc_snd_irq.set_start_delay(attotime::from_hz(75));
- MCFG_DEVICE_ADD("alpha_8201", ALPHA_8201, XTAL(18'432'000)/6/8) // note: 8302 rom, or 8303 on exctscc2 (same device!)
- MCFG_QUANTUM_PERFECT_CPU("alpha_8201:mcu")
+ ALPHA_8201(config, m_alpha_8201, XTAL(18'432'000)/6/8); // note: 8302 rom, or 8303 on exctscc2 (same device!)
+ config.m_perfect_cpu_quantum = subtag("alpha_8201:mcu");
WATCHDOG_TIMER(config, m_watchdog).set_vblank_count("screen", 0x10);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60.54)
- MCFG_SCREEN_SIZE(32*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(exctsccr_state, screen_update_exctsccr)
- MCFG_SCREEN_PALETTE(m_palette)
-
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, m_palette, gfx_exctsccr)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60.54);
+ screen.set_size(32*8, 32*8);
+ screen.set_visarea(0*8, 32*8-1, 2*8, 30*8-1);
+ screen.set_screen_update(FUNC(exctsccr_state::screen_update_exctsccr));
+ screen.set_palette(m_palette);
+
+ GFXDECODE(config, m_gfxdecode, m_palette, gfx_exctsccr);
PALETTE(config, m_palette, FUNC(exctsccr_state::exctsccr_palette), 512, 32);
/* sound hardware */
@@ -724,20 +719,20 @@ MACHINE_CONFIG_START(exctsccr_state::exctsccr)
AY8910(config, "ay4", XTAL(14'318'181)/8).add_route(ALL_OUTPUTS, "speaker", 0.08);
- MCFG_DEVICE_ADD("dac1", DAC_6BIT_R2R, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 0.3) // unknown DAC
- MCFG_DEVICE_ADD("dac2", DAC_6BIT_R2R, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 0.3) // unknown DAC
- MCFG_DEVICE_ADD("vref", VOLTAGE_REGULATOR, 0) MCFG_VOLTAGE_REGULATOR_OUTPUT(5.0)
- MCFG_SOUND_ROUTE(0, "dac1", 1.0, DAC_VREF_POS_INPUT) MCFG_SOUND_ROUTE(0, "dac1", -1.0, DAC_VREF_NEG_INPUT)
- MCFG_SOUND_ROUTE(0, "dac2", 1.0, DAC_VREF_POS_INPUT) MCFG_SOUND_ROUTE(0, "dac2", -1.0, DAC_VREF_NEG_INPUT)
-MACHINE_CONFIG_END
+ DAC_6BIT_R2R(config, "dac1", 0).add_route(ALL_OUTPUTS, "speaker", 0.3); // unknown DAC
+ DAC_6BIT_R2R(config, "dac2", 0).add_route(ALL_OUTPUTS, "speaker", 0.3); // unknown DAC
+ voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref"));
+ vref.add_route(0, "dac1", 1.0, DAC_VREF_POS_INPUT); vref.add_route(0, "dac1", -1.0, DAC_VREF_NEG_INPUT);
+ vref.add_route(0, "dac2", 1.0, DAC_VREF_POS_INPUT); vref.add_route(0, "dac2", -1.0, DAC_VREF_NEG_INPUT);
+}
/* Bootleg running on a modified Champion Baseball board */
-MACHINE_CONFIG_START(exctsccr_state::exctsccrb)
-
+void exctsccr_state::exctsccrb(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, XTAL(18'432'000)/6)
- MCFG_DEVICE_PROGRAM_MAP(exctsccrb_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", exctsccr_state, vblank_irq)
+ Z80(config, m_maincpu, XTAL(18'432'000)/6);
+ m_maincpu->set_addrmap(AS_PROGRAM, &exctsccr_state::exctsccrb_map);
+ m_maincpu->set_vblank_int("screen", FUNC(exctsccr_state::vblank_irq));
LS259(config, m_mainlatch);
m_mainlatch->q_out_cb<0>().set(FUNC(exctsccr_state::irq_enable_w));
@@ -749,23 +744,23 @@ MACHINE_CONFIG_START(exctsccr_state::exctsccrb)
m_mainlatch->q_out_cb<6>().set(FUNC(exctsccr_state::mcu_start_w));
m_mainlatch->q_out_cb<7>().set(FUNC(exctsccr_state::mcu_switch_w));
- MCFG_DEVICE_ADD("audiocpu", Z80, XTAL(18'432'000)/6)
- MCFG_DEVICE_PROGRAM_MAP(champbas_sound_map)
+ Z80(config, m_audiocpu, XTAL(18'432'000)/6);
+ m_audiocpu->set_addrmap(AS_PROGRAM, &exctsccr_state::champbas_sound_map);
- MCFG_DEVICE_ADD("alpha_8201", ALPHA_8201, XTAL(18'432'000)/6/8) // champbasj 8201 on pcb, though unused
- MCFG_QUANTUM_PERFECT_CPU("alpha_8201:mcu")
+ ALPHA_8201(config, m_alpha_8201, XTAL(18'432'000)/6/8); // champbasj 8201 on pcb, though unused
+ config.m_perfect_cpu_quantum = subtag("alpha_8201:mcu");
WATCHDOG_TIMER(config, m_watchdog).set_vblank_count("screen", 0x10);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_SIZE(32*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(exctsccr_state, screen_update_exctsccr)
- MCFG_SCREEN_PALETTE(m_palette)
-
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, m_palette, gfx_exctsccr)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_size(32*8, 32*8);
+ screen.set_visarea(0*8, 32*8-1, 2*8, 30*8-1);
+ screen.set_screen_update(FUNC(exctsccr_state::screen_update_exctsccr));
+ screen.set_palette(m_palette);
+
+ GFXDECODE(config, m_gfxdecode, m_palette, gfx_exctsccr);
PALETTE(config, m_palette, FUNC(exctsccr_state::exctsccr_palette), 512, 32);
/* sound hardware */
@@ -775,10 +770,11 @@ MACHINE_CONFIG_START(exctsccr_state::exctsccrb)
AY8910(config, "ay1", XTAL(18'432'000)/12).add_route(ALL_OUTPUTS, "speaker", 0.3);
- MCFG_DEVICE_ADD("dac", DAC_6BIT_R2R, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 0.7) // unknown DAC
- MCFG_DEVICE_ADD("vref", VOLTAGE_REGULATOR, 0) MCFG_VOLTAGE_REGULATOR_OUTPUT(5.0)
- MCFG_SOUND_ROUTE(0, "dac", 1.0, DAC_VREF_POS_INPUT) MCFG_SOUND_ROUTE(0, "dac", -1.0, DAC_VREF_NEG_INPUT)
-MACHINE_CONFIG_END
+ DAC_6BIT_R2R(config, "dac", 0).add_route(ALL_OUTPUTS, "speaker", 0.7); // unknown DAC
+ voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref"));
+ vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT);
+ vref.add_route(0, "dac", -1.0, DAC_VREF_NEG_INPUT);
+}
diff --git a/src/mame/drivers/champbwl.cpp b/src/mame/drivers/champbwl.cpp
index 5ef96219ec0..2998b5b976c 100644
--- a/src/mame/drivers/champbwl.cpp
+++ b/src/mame/drivers/champbwl.cpp
@@ -489,12 +489,12 @@ WRITE_LINE_MEMBER(champbwl_state::screen_vblank_champbwl)
}
-MACHINE_CONFIG_START(champbwl_state::champbwl)
-
+void champbwl_state::champbwl(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, 16000000/4) /* 4MHz */
- MCFG_DEVICE_PROGRAM_MAP(champbwl_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", champbwl_state, irq0_line_hold)
+ Z80(config, m_maincpu, 16000000/4); /* 4MHz */
+ m_maincpu->set_addrmap(AS_PROGRAM, &champbwl_state::champbwl_map);
+ m_maincpu->set_vblank_int("screen", FUNC(champbwl_state::irq0_line_hold));
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
@@ -505,14 +505,14 @@ MACHINE_CONFIG_START(champbwl_state::champbwl)
m_seta001->set_gfxdecode_tag("gfxdecode");
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(57.5)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(64*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 48*8-1, 1*8, 31*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(champbwl_state, screen_update_champbwl)
- MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE(*this, champbwl_state, screen_vblank_champbwl))
- MCFG_SCREEN_PALETTE(m_palette)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(57.5);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(64*8, 32*8);
+ screen.set_visarea(0*8, 48*8-1, 1*8, 31*8-1);
+ screen.set_screen_update(FUNC(champbwl_state::screen_update_champbwl));
+ screen.screen_vblank().set(FUNC(champbwl_state::screen_vblank_champbwl));
+ screen.set_palette(m_palette);
GFXDECODE(config, "gfxdecode", m_palette, gfx_champbwl);
PALETTE(config, m_palette, FUNC(champbwl_state::champbwl_palette), 512);
@@ -521,10 +521,10 @@ MACHINE_CONFIG_START(champbwl_state::champbwl)
SPEAKER(config, "lspeaker").front_left();
SPEAKER(config, "rspeaker").front_right();
- MCFG_DEVICE_ADD("x1snd", X1_010, 16000000)
- MCFG_SOUND_ROUTE(0, "lspeaker", 1.0)
- MCFG_SOUND_ROUTE(1, "rspeaker", 1.0)
-MACHINE_CONFIG_END
+ X1_010(config, m_x1, 16000000);
+ m_x1->add_route(0, "lspeaker", 1.0);
+ m_x1->add_route(1, "rspeaker", 1.0);
+}
@@ -553,40 +553,39 @@ MACHINE_START_MEMBER(champbwl_state,doraemon)
m_mainbank->configure_entries(0, 4, &ROM[0], 0x4000);
}
-MACHINE_CONFIG_START(champbwl_state::doraemon)
-
+void champbwl_state::doraemon(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, XTAL(14'318'181)/4)
- MCFG_DEVICE_PROGRAM_MAP(doraemon_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", champbwl_state, irq0_line_hold)
+ Z80(config, m_maincpu, XTAL(14'318'181)/4);
+ m_maincpu->set_addrmap(AS_PROGRAM, &champbwl_state::doraemon_map);
+ m_maincpu->set_vblank_int("screen", FUNC(champbwl_state::irq0_line_hold));
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
SETA001_SPRITE(config, m_seta001, 0);
m_seta001->set_gfxdecode_tag("gfxdecode");
- MCFG_TICKET_DISPENSER_ADD("hopper", attotime::from_msec(2000), TICKET_MOTOR_ACTIVE_LOW, TICKET_STATUS_ACTIVE_LOW )
+ TICKET_DISPENSER(config, m_hopper, attotime::from_msec(2000), TICKET_MOTOR_ACTIVE_LOW, TICKET_STATUS_ACTIVE_LOW );
MCFG_MACHINE_START_OVERRIDE(champbwl_state,doraemon)
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(320, 256)
- MCFG_SCREEN_VISIBLE_AREA(0, 320-1, 16, 256-16-1)
- MCFG_SCREEN_UPDATE_DRIVER(champbwl_state, screen_update_doraemon)
- MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE(*this, champbwl_state, screen_vblank_doraemon))
- MCFG_SCREEN_PALETTE(m_palette)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(320, 256);
+ screen.set_visarea(0, 320-1, 16, 256-16-1);
+ screen.set_screen_update(FUNC(champbwl_state::screen_update_doraemon));
+ screen.screen_vblank().set(FUNC(champbwl_state::screen_vblank_doraemon));
+ screen.set_palette(m_palette);
GFXDECODE(config, "gfxdecode", m_palette, gfx_champbwl);
PALETTE(config, m_palette, FUNC(champbwl_state::champbwl_palette), 512);
/* sound hardware */
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("x1snd", X1_010, XTAL(14'318'181))
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
-MACHINE_CONFIG_END
+ X1_010(config, m_x1, XTAL(14'318'181)).add_route(ALL_OUTPUTS, "mono", 1.0);
+}
diff --git a/src/mame/drivers/chanbara.cpp b/src/mame/drivers/chanbara.cpp
index 4c4c8e00776..352aeb368de 100644
--- a/src/mame/drivers/chanbara.cpp
+++ b/src/mame/drivers/chanbara.cpp
@@ -394,24 +394,24 @@ void chanbara_state::machine_reset()
m_scrollhi = 0;
}
-MACHINE_CONFIG_START(chanbara_state::chanbara)
-
- MCFG_DEVICE_ADD("maincpu", MC6809E, XTAL(12'000'000)/8)
- MCFG_DEVICE_PROGRAM_MAP(chanbara_map)
+void chanbara_state::chanbara(machine_config &config)
+{
+ MC6809E(config, m_maincpu, XTAL(12'000'000)/8);
+ m_maincpu->set_addrmap(AS_PROGRAM, &chanbara_state::chanbara_map);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
-// MCFG_SCREEN_REFRESH_RATE(57.4122)
-// MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */)
-// MCFG_SCREEN_SIZE(32*8, 32*8)
-// MCFG_SCREEN_VISIBLE_AREA(0, 32*8-1, 2*8, 30*8-1)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+// screen.set_refresh_hz(57.4122);
+// screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500) /* not accurate */);
+// screen.set_size(32*8, 32*8);
+// screen.set_visarea(0, 32*8-1, 2*8, 30*8-1);
// DECO video CRTC
- MCFG_SCREEN_RAW_PARAMS(XTAL(12'000'000)/2,384,0,256,272,16,240)
- MCFG_SCREEN_UPDATE_DRIVER(chanbara_state, screen_update_chanbara)
- MCFG_SCREEN_PALETTE(m_palette)
+ screen.set_raw(XTAL(12'000'000)/2,384,0,256,272,16,240);
+ screen.set_screen_update(FUNC(chanbara_state::screen_update_chanbara));
+ screen.set_palette(m_palette);
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, m_palette, gfx_chanbara)
+ GFXDECODE(config, m_gfxdecode, m_palette, gfx_chanbara);
PALETTE(config, m_palette, FUNC(chanbara_state::chanbara_palette), 256);
@@ -422,7 +422,7 @@ MACHINE_CONFIG_START(chanbara_state::chanbara)
ymsnd.port_a_write_callback().set(FUNC(chanbara_state::chanbara_ay_out_0_w));
ymsnd.port_b_write_callback().set(FUNC(chanbara_state::chanbara_ay_out_1_w));
ymsnd.add_route(ALL_OUTPUTS, "mono", 1.0);
-MACHINE_CONFIG_END
+}
ROM_START( chanbara )
diff --git a/src/mame/drivers/chance32.cpp b/src/mame/drivers/chance32.cpp
index 7169627c897..4e95975b043 100644
--- a/src/mame/drivers/chance32.cpp
+++ b/src/mame/drivers/chance32.cpp
@@ -458,23 +458,23 @@ void chance32_state::machine_reset()
}
-MACHINE_CONFIG_START(chance32_state::chance32)
-
+void chance32_state::chance32(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80,12000000/2)
- MCFG_DEVICE_PROGRAM_MAP(chance32_map)
- MCFG_DEVICE_IO_MAP(chance32_portmap)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", chance32_state, irq0_line_hold)
+ Z80(config, m_maincpu, 12000000/2);
+ m_maincpu->set_addrmap(AS_PROGRAM, &chance32_state::chance32_map);
+ m_maincpu->set_addrmap(AS_IO, &chance32_state::chance32_portmap);
+ m_maincpu->set_vblank_int("screen", FUNC(chance32_state::irq0_line_hold));
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(52.786)
-// MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(40*16, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0, 35*16-1, 0, 29*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(chance32_state, screen_update_chance32)
- MCFG_SCREEN_PALETTE("palette")
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(52.786);
+// screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(40*16, 32*8);
+ screen.set_visarea(0, 35*16-1, 0, 29*8-1);
+ screen.set_screen_update(FUNC(chance32_state::screen_update_chance32));
+ screen.set_palette("palette");
h46505_device &crtc(H46505(config, "crtc", 12000000/16)); /* 52.786 Hz (similar to Major Poker) */
crtc.set_screen("screen");
@@ -488,9 +488,8 @@ MACHINE_CONFIG_START(chance32_state::chance32)
SPEAKER(config, "mono").front_center();
/* clock at 1050 kHz match the 8000 Hz samples stored inside the ROM */
- MCFG_DEVICE_ADD("oki", OKIM6295, 1.056_MHz_XTAL, okim6295_device::PIN7_HIGH) // clock frequency & pin 7 not verified
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
-MACHINE_CONFIG_END
+ OKIM6295(config, "oki", 1.056_MHz_XTAL, okim6295_device::PIN7_HIGH).add_route(ALL_OUTPUTS, "mono", 1.0); // clock frequency & pin 7 not verified
+}
ROM_START( chance32 )
diff --git a/src/mame/drivers/channelf.cpp b/src/mame/drivers/channelf.cpp
index 848dae8d73c..529a911e10d 100644
--- a/src/mame/drivers/channelf.cpp
+++ b/src/mame/drivers/channelf.cpp
@@ -12,6 +12,10 @@
* also spanning from $3000 to $FFFF. Added clones
* Fabio "etabeta" Priuli, moved carts to be slot devices
*
+ * TODO:
+ * - hook up F3851 and F3853 devices (note: from a black box pov there's
+ * currently no problem, nothing uses the timer or irq)
+ *
******************************************************************/
#include "emu.h"
@@ -21,9 +25,6 @@
#include "softlist.h"
#include "speaker.h"
-#define MASTER_CLOCK_PAL 2000000 /* PAL unit has a separate crystal at 4.000 MHz */
-#define PAL_VBLANK_TIME 4623
-
/* The F8 has latches on its port pins
* These mimic's their behavior
@@ -197,119 +198,116 @@ static void cf_cart(device_slot_interface &device)
}
-MACHINE_CONFIG_START(channelf_state::channelf_cart)
+void channelf_state::channelf_cart(machine_config &config)
+{
/* cartridge */
- MCFG_CHANNELF_CARTRIDGE_ADD("cartslot", cf_cart, nullptr)
+ CHANF_CART_SLOT(config, m_cart, cf_cart, nullptr);
/* Software lists */
- MCFG_SOFTWARE_LIST_ADD("cart_list","channelf")
-MACHINE_CONFIG_END
+ SOFTWARE_LIST(config, "cart_list").set_original("channelf");
+}
-MACHINE_CONFIG_START(channelf_state::channelf)
+void channelf_state::channelf(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", F8, 3579545/2) /* Colorburst/2 */
- MCFG_DEVICE_PROGRAM_MAP(channelf_map)
- MCFG_DEVICE_IO_MAP(channelf_io)
- MCFG_QUANTUM_TIME(attotime::from_hz(60))
+ F8(config, m_maincpu, 3.579545_MHz_XTAL/2); /* Colorburst/2 */
+ m_maincpu->set_addrmap(AS_PROGRAM, &channelf_state::channelf_map);
+ m_maincpu->set_addrmap(AS_IO, &channelf_state::channelf_io);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */
- MCFG_SCREEN_SIZE(128, 64)
- MCFG_SCREEN_VISIBLE_AREA(4, 112 - 7, 4, 64 - 3)
- MCFG_SCREEN_UPDATE_DRIVER(channelf_state, screen_update_channelf)
- MCFG_SCREEN_PALETTE("palette")
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */
+ screen.set_size(128, 64);
+ screen.set_visarea(4, 112 - 7, 4, 64 - 3);
+ screen.set_screen_update(FUNC(channelf_state::screen_update_channelf));
+ screen.set_palette("palette");
PALETTE(config, "palette", FUNC(channelf_state::channelf_palette), 8);
/* sound hardware */
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("custom", CHANNELF_SOUND)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.00)
+ CHANNELF_SOUND(config, m_custom).add_route(ALL_OUTPUTS, "mono", 1.00);
channelf_cart(config);
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(channelf_state::sabavdpl)
+void channelf_state::sabavdpl(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", F8, MASTER_CLOCK_PAL) /* PAL speed */
- MCFG_DEVICE_PROGRAM_MAP(channelf_map)
- MCFG_DEVICE_IO_MAP(channelf_io)
- MCFG_QUANTUM_TIME(attotime::from_hz(50))
+ F8(config, m_maincpu, 4_MHz_XTAL/2); /* PAL speed */
+ m_maincpu->set_addrmap(AS_PROGRAM, &channelf_state::channelf_map);
+ m_maincpu->set_addrmap(AS_IO, &channelf_state::channelf_io);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(50)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(PAL_VBLANK_TIME)) /* approximate */
- MCFG_SCREEN_SIZE(128, 64)
- MCFG_SCREEN_VISIBLE_AREA(4, 112 - 7, 4, 64 - 3)
- MCFG_SCREEN_UPDATE_DRIVER(channelf_state, screen_update_channelf)
- MCFG_SCREEN_PALETTE("palette")
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(50);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(4623)); /* approximate */
+ screen.set_size(128, 64);
+ screen.set_visarea(4, 112 - 7, 4, 64 - 3);
+ screen.set_screen_update(FUNC(channelf_state::screen_update_channelf));
+ screen.set_palette("palette");
PALETTE(config, "palette", FUNC(channelf_state::channelf_palette), 8);
/* sound hardware */
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("custom", CHANNELF_SOUND)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.00)
+ CHANNELF_SOUND(config, m_custom).add_route(ALL_OUTPUTS, "mono", 1.00);
channelf_cart(config);
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(channelf_state::channlf2)
+void channelf_state::channlf2(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", F8, 3579545/2) /* Colorburst / 2 */
- MCFG_DEVICE_PROGRAM_MAP(channelf_map)
- MCFG_DEVICE_IO_MAP(channelf_io)
- MCFG_QUANTUM_TIME(attotime::from_hz(60))
+ F8(config, m_maincpu, 3.579545_MHz_XTAL/2); /* Colorburst / 2 */
+ m_maincpu->set_addrmap(AS_PROGRAM, &channelf_state::channelf_map);
+ m_maincpu->set_addrmap(AS_IO, &channelf_state::channelf_io);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */
- MCFG_SCREEN_SIZE(128, 64)
- MCFG_SCREEN_VISIBLE_AREA(4, 112 - 7, 4, 64 - 3)
- MCFG_SCREEN_UPDATE_DRIVER(channelf_state, screen_update_channelf)
- MCFG_SCREEN_PALETTE("palette")
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */
+ screen.set_size(128, 64);
+ screen.set_visarea(4, 112 - 7, 4, 64 - 3);
+ screen.set_screen_update(FUNC(channelf_state::screen_update_channelf));
+ screen.set_palette("palette");
PALETTE(config, "palette", FUNC(channelf_state::channelf_palette), 8);
/* sound hardware */
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("custom", CHANNELF_SOUND)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.00)
+ CHANNELF_SOUND(config, m_custom).add_route(ALL_OUTPUTS, "mono", 1.00);
channelf_cart(config);
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(channelf_state::sabavpl2)
+void channelf_state::sabavpl2(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", F8, MASTER_CLOCK_PAL) /* PAL speed */
- MCFG_DEVICE_PROGRAM_MAP(channelf_map)
- MCFG_DEVICE_IO_MAP(channelf_io)
- MCFG_QUANTUM_TIME(attotime::from_hz(50))
+ F8(config, m_maincpu, 4_MHz_XTAL/2); /* PAL speed */
+ m_maincpu->set_addrmap(AS_PROGRAM, &channelf_state::channelf_map);
+ m_maincpu->set_addrmap(AS_IO, &channelf_state::channelf_io);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(50)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(PAL_VBLANK_TIME)) /* not accurate */
- MCFG_SCREEN_SIZE(128, 64)
- MCFG_SCREEN_VISIBLE_AREA(4, 112 - 7, 4, 64 - 3)
- MCFG_SCREEN_UPDATE_DRIVER(channelf_state, screen_update_channelf)
- MCFG_SCREEN_PALETTE("palette")
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(50);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(4623)); /* approximate */
+ screen.set_size(128, 64);
+ screen.set_visarea(4, 112 - 7, 4, 64 - 3);
+ screen.set_screen_update(FUNC(channelf_state::screen_update_channelf));
+ screen.set_palette("palette");
PALETTE(config, "palette", FUNC(channelf_state::channelf_palette), 8);
/* sound hardware */
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("custom", CHANNELF_SOUND)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.50)
+ CHANNELF_SOUND(config, m_custom).add_route(ALL_OUTPUTS, "mono", 0.50);
channelf_cart(config);
-MACHINE_CONFIG_END
+}
ROM_START( channelf )
ROM_REGION(0x10000,"maincpu",0)
diff --git a/src/mame/drivers/chaos.cpp b/src/mame/drivers/chaos.cpp
index b785edcc42a..b21f9ec811b 100644
--- a/src/mame/drivers/chaos.cpp
+++ b/src/mame/drivers/chaos.cpp
@@ -110,10 +110,10 @@ WRITE8_MEMBER( chaos_state::port1f_w )
if (!data)
data = 0x24;
- m_terminal->write(space, 0, data);
+ m_terminal->write(data);
if (data == 0x0d)
- m_terminal->write(space, 0, 0x0a);
+ m_terminal->write(0x0a);
}
READ8_MEMBER( chaos_state::port90_r )
@@ -148,17 +148,18 @@ void chaos_state::machine_reset()
memcpy(m_p_ram+0x7000, ROM+0x3000, 0x1000);
}
-MACHINE_CONFIG_START(chaos_state::chaos)
+void chaos_state::chaos(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", S2650, XTAL(1'000'000))
- MCFG_DEVICE_PROGRAM_MAP(mem_map)
- MCFG_DEVICE_IO_MAP(io_map)
- MCFG_DEVICE_DATA_MAP(data_map)
+ S2650(config, m_maincpu, XTAL(1'000'000));
+ m_maincpu->set_addrmap(AS_PROGRAM, &chaos_state::mem_map);
+ m_maincpu->set_addrmap(AS_IO, &chaos_state::io_map);
+ m_maincpu->set_addrmap(AS_DATA, &chaos_state::data_map);
/* video hardware */
GENERIC_TERMINAL(config, m_terminal, 0);
m_terminal->set_keyboard_callback(FUNC(chaos_state::kbd_put));
-MACHINE_CONFIG_END
+}
/* ROM definition */
ROM_START( chaos )
diff --git a/src/mame/drivers/cheekyms.cpp b/src/mame/drivers/cheekyms.cpp
index a13c1bc7f9f..e1d29578682 100644
--- a/src/mame/drivers/cheekyms.cpp
+++ b/src/mame/drivers/cheekyms.cpp
@@ -121,30 +121,30 @@ INTERRUPT_GEN_MEMBER(cheekyms_state::vblank_irq)
}
-MACHINE_CONFIG_START(cheekyms_state::cheekyms)
-
+void cheekyms_state::cheekyms(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80,5000000/2) /* 2.5 MHz */
- MCFG_DEVICE_PROGRAM_MAP(main_map)
- MCFG_DEVICE_IO_MAP(io_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", cheekyms_state, vblank_irq)
+ Z80(config, m_maincpu, 5000000/2); /* 2.5 MHz */
+ m_maincpu->set_addrmap(AS_PROGRAM, &cheekyms_state::main_map);
+ m_maincpu->set_addrmap(AS_IO, &cheekyms_state::io_map);
+ m_maincpu->set_vblank_int("screen", FUNC(cheekyms_state::vblank_irq));
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(32*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 4*8, 28*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(cheekyms_state, screen_update)
- MCFG_SCREEN_PALETTE(m_palette)
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_refresh_hz(60);
+ m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ m_screen->set_size(32*8, 32*8);
+ m_screen->set_visarea(0*8, 32*8-1, 4*8, 28*8-1);
+ m_screen->set_screen_update(FUNC(cheekyms_state::screen_update));
+ m_screen->set_palette(m_palette);
GFXDECODE(config, m_gfxdecode, m_palette, gfx_cheekyms);
PALETTE(config, m_palette, FUNC(cheekyms_state::cheekyms_palette), 0xc0);
/* audio hardware */
CHEEKY_MOUSE_AUDIO(config, m_sound_board, 0);
-MACHINE_CONFIG_END
+}
diff --git a/src/mame/drivers/chessmst.cpp b/src/mame/drivers/chessmst.cpp
index 5b8669f7782..0e29d45d49f 100644
--- a/src/mame/drivers/chessmst.cpp
+++ b/src/mame/drivers/chessmst.cpp
@@ -30,16 +30,16 @@
class chessmst_state : public driver_device
{
public:
- chessmst_state(const machine_config &mconfig, device_type type, const char *tag)
- : driver_device(mconfig, type, tag)
- , m_maincpu(*this, "maincpu")
- , m_pia2(*this, "z80pio2")
- , m_speaker(*this, "speaker")
- , m_beeper(*this, "beeper")
- , m_extra(*this, "EXTRA")
- , m_buttons(*this, "BUTTONS")
- , m_digits(*this, "digit%u", 0U)
- , m_leds(*this, "led_%c%u", unsigned('a'), 1U)
+ chessmst_state(const machine_config &mconfig, device_type type, const char *tag) :
+ driver_device(mconfig, type, tag),
+ m_maincpu(*this, "maincpu"),
+ m_pio(*this, "z80pio%u", 0),
+ m_speaker(*this, "speaker"),
+ m_beeper(*this, "beeper"),
+ m_extra(*this, "EXTRA"),
+ m_buttons(*this, "BUTTONS"),
+ m_digits(*this, "digit%u", 0U),
+ m_leds(*this, "led_%c%u", unsigned('a'), 1U)
{ }
DECLARE_INPUT_CHANGED_MEMBER(chessmst_sensor);
@@ -71,7 +71,7 @@ private:
void update_display();
required_device<z80_device> m_maincpu;
- required_device<z80pio_device> m_pia2;
+ required_device_array<z80pio_device, 2> m_pio;
optional_device<speaker_sound_device> m_speaker;
optional_device<beep_device> m_beeper;
required_ioport m_extra;
@@ -109,8 +109,8 @@ void chessmst_state::chessmst_io(address_map &map)
map.unmap_value_high();
map.global_mask(0xff);
//AM_RANGE(0x00, 0x03) AM_MIRROR(0xf0) read/write in both, not used by the software
- map(0x04, 0x07).mirror(0xf0).rw("z80pio1", FUNC(z80pio_device::read), FUNC(z80pio_device::write));
- map(0x08, 0x0b).mirror(0xf0).rw(m_pia2, FUNC(z80pio_device::read), FUNC(z80pio_device::write));
+ map(0x04, 0x07).mirror(0xf0).rw(m_pio[0], FUNC(z80pio_device::read), FUNC(z80pio_device::write));
+ map(0x08, 0x0b).mirror(0xf0).rw(m_pio[1], FUNC(z80pio_device::read), FUNC(z80pio_device::write));
}
void chessmst_state::chessmstdm_io(address_map &map)
@@ -121,8 +121,8 @@ void chessmst_state::chessmstdm_io(address_map &map)
WRITE_LINE_MEMBER( chessmst_state::timer_555_w )
{
- m_pia2->strobe_b(state);
- m_pia2->data_b_write(m_matrix);
+ m_pio[1]->strobe_b(state);
+ m_pio[1]->data_b_write(m_matrix);
}
INPUT_CHANGED_MEMBER(chessmst_state::reset_button)
@@ -237,7 +237,7 @@ static INPUT_PORTS_START( chessmst )
PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("New Game [0]") PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_ENTER)
PORT_START("EXTRA")
- PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Halt") PORT_CODE(KEYCODE_F2) PORT_WRITE_LINE_DEVICE_MEMBER("z80pio1", z80pio_device, strobe_a) // -> PIO(1) ASTB pin
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Halt") PORT_CODE(KEYCODE_F2) PORT_WRITE_LINE_DEVICE_MEMBER("z80pio0", z80pio_device, strobe_a) // -> PIO(0) ASTB pin
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Reset") PORT_CODE(KEYCODE_F1) PORT_CHANGED_MEMBER(DEVICE_SELF, chessmst_state, reset_button, 0) // -> Z80 RESET pin
INPUT_PORTS_END
@@ -368,97 +368,94 @@ WRITE8_MEMBER( chessmst_state::pio2_port_b_w )
static const z80_daisy_config chessmst_daisy_chain[] =
{
- { "z80pio1" },
+ { "z80pio0" },
{ nullptr }
};
static const z80_daisy_config chessmstdm_daisy_chain[] =
{
- { "z80pio2" },
+ { "z80pio1" },
{ nullptr }
};
-MACHINE_CONFIG_START(chessmst_state::chessmst)
-
+void chessmst_state::chessmst(machine_config &config)
+{
/* basic machine hardware */
- Z80(config, m_maincpu, 9.8304_MHz_XTAL/4); // U880 Z80 clone
+ Z80(config, m_maincpu, 9.8304_MHz_XTAL/4); // UB880 Z80 clone
m_maincpu->set_addrmap(AS_PROGRAM, &chessmst_state::chessmst_mem);
m_maincpu->set_addrmap(AS_IO, &chessmst_state::chessmst_io);
m_maincpu->set_daisy_config(chessmst_daisy_chain);
- z80pio_device& pio1(Z80PIO(config, "z80pio1", 9.8304_MHz_XTAL/4));
- pio1.out_int_callback().set_inputline(m_maincpu, INPUT_LINE_IRQ0);
- pio1.out_pa_callback().set(FUNC(chessmst_state::pio1_port_a_w));
- pio1.out_pb_callback().set(FUNC(chessmst_state::pio1_port_b_w));
+ Z80PIO(config, m_pio[0], 9.8304_MHz_XTAL/4);
+ m_pio[0]->out_int_callback().set_inputline(m_maincpu, INPUT_LINE_IRQ0);
+ m_pio[0]->out_pa_callback().set(FUNC(chessmst_state::pio1_port_a_w));
+ m_pio[0]->out_pb_callback().set(FUNC(chessmst_state::pio1_port_b_w));
- Z80PIO(config, m_pia2, 9.8304_MHz_XTAL/4);
- m_pia2->in_pa_callback().set(FUNC(chessmst_state::pio2_port_a_r));
- m_pia2->out_pb_callback().set(FUNC(chessmst_state::pio2_port_b_w));
+ Z80PIO(config, m_pio[1], 9.8304_MHz_XTAL/4);
+ m_pio[1]->in_pa_callback().set(FUNC(chessmst_state::pio2_port_a_r));
+ m_pio[1]->out_pb_callback().set(FUNC(chessmst_state::pio2_port_b_w));
config.set_default_layout(layout_chessmst);
/* sound hardware */
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("speaker", SPEAKER_SOUND)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.50)
-MACHINE_CONFIG_END
-
-MACHINE_CONFIG_START(chessmst_state::chessmsta)
+ SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.50);
+}
+void chessmst_state::chessmsta(machine_config &config)
+{
/* basic machine hardware */
- Z80(config, m_maincpu, 8_MHz_XTAL/4); // U880 Z80 clone
+ Z80(config, m_maincpu, 8_MHz_XTAL/2); // UA880 Z80 clone
m_maincpu->set_addrmap(AS_PROGRAM, &chessmst_state::chessmst_mem);
m_maincpu->set_addrmap(AS_IO, &chessmst_state::chessmst_io);
m_maincpu->set_daisy_config(chessmst_daisy_chain);
- z80pio_device& pio1(Z80PIO(config, "z80pio1", 8_MHz_XTAL/4));
- pio1.out_int_callback().set_inputline(m_maincpu, INPUT_LINE_IRQ0);
- pio1.out_pa_callback().set(FUNC(chessmst_state::pio1_port_a_w));
- pio1.out_pb_callback().set(FUNC(chessmst_state::pio1_port_b_w));
+ Z80PIO(config, m_pio[0], 8_MHz_XTAL/2);
+ m_pio[0]->out_int_callback().set_inputline(m_maincpu, INPUT_LINE_IRQ0);
+ m_pio[0]->out_pa_callback().set(FUNC(chessmst_state::pio1_port_a_w));
+ m_pio[0]->out_pb_callback().set(FUNC(chessmst_state::pio1_port_b_w));
- Z80PIO(config, m_pia2, 8_MHz_XTAL/4);
- m_pia2->in_pa_callback().set(FUNC(chessmst_state::pio2_port_a_r));
- m_pia2->out_pb_callback().set(FUNC(chessmst_state::pio2_port_b_w));
+ Z80PIO(config, m_pio[1], 8_MHz_XTAL/2);
+ m_pio[1]->in_pa_callback().set(FUNC(chessmst_state::pio2_port_a_r));
+ m_pio[1]->out_pb_callback().set(FUNC(chessmst_state::pio2_port_b_w));
config.set_default_layout(layout_chessmst);
/* sound hardware */
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("speaker", SPEAKER_SOUND)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.50)
-MACHINE_CONFIG_END
-
-MACHINE_CONFIG_START(chessmst_state::chessmstdm)
+ SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.50);
+}
+void chessmst_state::chessmstdm(machine_config &config)
+{
/* basic machine hardware */
- Z80(config, m_maincpu, 8_MHz_XTAL/2); // U880 Z80 clone
+ Z80(config, m_maincpu, 8_MHz_XTAL/2); // UA880 Z80 clone
m_maincpu->set_addrmap(AS_PROGRAM, &chessmst_state::chessmstdm_mem);
m_maincpu->set_addrmap(AS_IO, &chessmst_state::chessmstdm_io);
m_maincpu->set_daisy_config(chessmstdm_daisy_chain);
- z80pio_device& pio1(Z80PIO(config, "z80pio1", 8_MHz_XTAL/4));
- pio1.out_pa_callback().set(FUNC(chessmst_state::pio1_port_a_w));
- pio1.out_pb_callback().set(FUNC(chessmst_state::pio1_port_b_dm_w));
- pio1.in_pb_callback().set_ioport("EXTRA");
+ Z80PIO(config, m_pio[0], 8_MHz_XTAL/2);
+ m_pio[0]->out_pa_callback().set(FUNC(chessmst_state::pio1_port_a_w));
+ m_pio[0]->out_pb_callback().set(FUNC(chessmst_state::pio1_port_b_dm_w));
+ m_pio[0]->in_pb_callback().set_ioport("EXTRA");
- Z80PIO(config, m_pia2, 8_MHz_XTAL/4);
- m_pia2->out_int_callback().set_inputline(m_maincpu, INPUT_LINE_IRQ0);
- m_pia2->in_pa_callback().set(FUNC(chessmst_state::pio2_port_a_r));
- m_pia2->out_pb_callback().set(FUNC(chessmst_state::pio2_port_b_w));
+ Z80PIO(config, m_pio[1], 8_MHz_XTAL/2);
+ m_pio[1]->out_int_callback().set_inputline(m_maincpu, INPUT_LINE_IRQ0);
+ m_pio[1]->in_pa_callback().set(FUNC(chessmst_state::pio2_port_a_r));
+ m_pio[1]->out_pb_callback().set(FUNC(chessmst_state::pio2_port_b_w));
config.set_default_layout(layout_chessmstdm);
- MCFG_DEVICE_ADD("555_timer", CLOCK, 500) // from 555 timer
- MCFG_CLOCK_SIGNAL_HANDLER(WRITELINE(*this, chessmst_state, timer_555_w))
+ clock_device &_555_timer(CLOCK(config, "555_timer", 500)); // from 555 timer
+ _555_timer.signal_handler().set(FUNC(chessmst_state::timer_555_w));
/* sound hardware */
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("beeper", BEEP, 1000)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.50)
+ BEEP(config, m_beeper, 1000).add_route(ALL_OUTPUTS, "mono", 0.50);
- MCFG_GENERIC_CARTSLOT_ADD("cartslot", generic_plain_slot, "chessmstdm_cart")
- MCFG_SOFTWARE_LIST_ADD("cart_list", "chessmstdm")
-MACHINE_CONFIG_END
+ GENERIC_CARTSLOT(config, "cartslot", generic_plain_slot, "chessmstdm_cart");
+ SOFTWARE_LIST(config, "cart_list").set_original("chessmstdm");
+}
/* ROM definition */
diff --git a/src/mame/drivers/chesstrv.cpp b/src/mame/drivers/chesstrv.cpp
index b7e97f1d7f0..873e34bba5d 100644
--- a/src/mame/drivers/chesstrv.cpp
+++ b/src/mame/drivers/chesstrv.cpp
@@ -1,323 +1,239 @@
// license:BSD-3-Clause
-// copyright-holders:Sandro Ronco
+// copyright-holders:Sandro Ronco, hap
+// thanks-to:Sean Riddle
/******************************************************************************
- Acetronic Chess Traveller
+SciSys Chess Traveler
- TODO:
- - Add emulation of the 3870 MCU to the F8 core, including timer interrupt
- that is used by the Boris Diplomat.
+- Fairchild 3870 MCU, label SL90387 (does not use the timer or irq at all)
+- 256 bytes RAM(3539)
+- 4-digit 7seg led panel
+
+It was also redistributed by Acetronic as "Chess Traveller"(British spelling there),
+and by Prinztronic as well, another British brand
+
+SciSys/Novag's "Chess Champion: Pocket Chess" is assumed to be the same game,
+with the exception that they added battery low voltage detection to it (rightmost
+digit DP lights up).
******************************************************************************/
#include "emu.h"
#include "cpu/f8/f8.h"
+#include "machine/f3853.h"
#include "machine/timer.h"
-#include "chesstrv.lh"
-#include "borisdpl.lh"
-
-class chesstrv_base_state : public driver_device
-{
-protected:
- chesstrv_base_state(const machine_config &mconfig, device_type type, const char *tag)
- : driver_device(mconfig, type, tag)
- , m_maincpu(*this, "maincpu")
- {
- }
-
- virtual void machine_start() override;
- DECLARE_READ8_MEMBER(ram_addr_r);
- DECLARE_WRITE8_MEMBER(ram_addr_w);
- DECLARE_READ8_MEMBER(ram_r);
- DECLARE_WRITE8_MEMBER(ram_w);
- DECLARE_WRITE8_MEMBER(matrix_w);
+// internal artwork
+#include "chesstrv.lh" // clickable
- void chesstrv_mem(address_map &map);
- uint8_t m_ram_addr;
- uint8_t *m_ram;
- uint8_t m_matrix;
- required_device<cpu_device> m_maincpu;
-};
+namespace {
-class chesstrv_state : public chesstrv_base_state
+class chesstrv_state : public driver_device
{
public:
- chesstrv_state(const machine_config &mconfig, device_type type, const char *tag)
- : chesstrv_base_state(mconfig, type, tag)
- , m_digits(*this, "digit%u", 0U)
- , m_keypad(*this, "LINE%u", 1U)
- {
- }
+ chesstrv_state(const machine_config &mconfig, device_type type, const char *tag) :
+ driver_device(mconfig, type, tag),
+ m_maincpu(*this, "maincpu"),
+ m_keypad(*this, "LINE%u", 1U),
+ m_delay_display(*this, "delay_display_%u", 0),
+ m_out_digit(*this, "digit%u", 0U)
+ { }
void chesstrv(machine_config &config);
+
protected:
virtual void machine_start() override;
+
private:
+ // devices/pointers
+ required_device<cpu_device> m_maincpu;
+ required_ioport_array<4> m_keypad;
+ required_device_array<timer_device, 4> m_delay_display;
+ output_finder<4> m_out_digit;
+
+ void chesstrv_mem(address_map &map);
void chesstrv_io(address_map &map);
- DECLARE_WRITE8_MEMBER(display_w);
- DECLARE_READ8_MEMBER(keypad_r);
+ TIMER_DEVICE_CALLBACK_MEMBER(delay_display);
- output_finder<4> m_digits;
- required_ioport_array<4> m_keypad;
+ DECLARE_WRITE8_MEMBER(matrix_w);
+ DECLARE_WRITE8_MEMBER(digit_w);
+ DECLARE_READ8_MEMBER(input_r);
+
+ // 256 bytes data RAM accessed via I/O ports
+ DECLARE_READ8_MEMBER(ram_address_r) { return m_ram_address; }
+ DECLARE_WRITE8_MEMBER(ram_address_w) { m_ram_address = data; }
+ DECLARE_READ8_MEMBER(ram_data_r) { return m_ram[m_ram_address]; }
+ DECLARE_WRITE8_MEMBER(ram_data_w) { m_ram[m_ram_address] = data; }
+
+ std::unique_ptr<u8[]> m_ram;
+ u8 m_ram_address;
+ u8 m_matrix;
};
-class borisdpl_state : public chesstrv_base_state
+void chesstrv_state::machine_start()
{
-public:
- borisdpl_state(const machine_config &mconfig, device_type type, const char *tag)
- : chesstrv_base_state(mconfig, type, tag)
- , m_digits(*this, "digit%u", 0U)
- , m_keypad(*this, "LINE%u", 1U)
- {
- }
-
- void borisdpl(machine_config &config);
-protected:
- virtual void machine_start() override;
-private:
- void borisdpl_io(address_map &map);
+ // resolve handlers
+ m_out_digit.resolve();
- DECLARE_WRITE8_MEMBER(display_w);
- DECLARE_READ8_MEMBER(keypad_r);
+ // zerofill
+ m_ram = make_unique_clear<u8[]>(0x100);
+ m_ram_address = 0;
+ m_matrix = 0;
- //TIMER_DEVICE_CALLBACK_MEMBER(timer_interrupt);
+ // register for savestates
+ save_pointer(NAME(m_ram), 0x100);
+ save_item(NAME(m_ram_address));
+ save_item(NAME(m_matrix));
+}
- output_finder<8> m_digits;
- required_ioport_array<4> m_keypad;
-};
-WRITE8_MEMBER(chesstrv_base_state::ram_addr_w)
-{
- m_ram_addr = data;
-}
-READ8_MEMBER(chesstrv_base_state::ram_addr_r)
-{
- return m_ram_addr;
-}
+/******************************************************************************
+ Devices, I/O
+******************************************************************************/
-READ8_MEMBER(chesstrv_base_state::ram_r)
-{
- return m_ram[m_ram_addr];
-}
+// F3870 ports
-WRITE8_MEMBER(chesstrv_base_state::ram_w)
+TIMER_DEVICE_CALLBACK_MEMBER(chesstrv_state::delay_display)
{
- m_ram[m_ram_addr] = data;
+ // clear digits if inactive
+ if (BIT(m_matrix, 3 - param))
+ m_out_digit[param] = 0;
}
-WRITE8_MEMBER(chesstrv_state::display_w)
+WRITE8_MEMBER(chesstrv_state::digit_w)
{
- uint8_t seg_data = bitswap<8>(data,0,1,2,3,4,5,6,7);
-
- for (int digit = 0; digit < 4; digit++)
- if (!BIT(m_matrix, 3 - digit))
- m_digits[digit] = seg_data;
+ // digit segments, update display here
+ for (int i = 0; i < 4; i++)
+ if (!BIT(m_matrix, 3 - i))
+ m_out_digit[i] = bitswap<8>(data,0,1,2,3,4,5,6,7) & 0x7f;
}
-WRITE8_MEMBER(chesstrv_base_state::matrix_w)
+WRITE8_MEMBER(chesstrv_state::matrix_w)
{
+ // d0-d3: input/digit select (active low)
+ // they're strobed, so on rising edge, delay them going off to prevent flicker or stuck display
+ for (int i = 0; i < 4; i++)
+ if (BIT(~m_matrix & data, 3 - i))
+ m_delay_display[i]->adjust(attotime::from_msec(20), i);
+
m_matrix = data;
}
-READ8_MEMBER(chesstrv_state::keypad_r)
+READ8_MEMBER(chesstrv_state::input_r)
{
- uint8_t data = 0;
+ u8 data = m_matrix;
- data |= m_keypad[0]->read();
- data |= m_keypad[1]->read();
- data |= m_keypad[2]->read();
- data |= m_keypad[3]->read();
- data |= (m_keypad[0]->read() ? 0x10 : 0);
- data |= (m_keypad[1]->read() ? 0x20 : 0);
- data |= (m_keypad[2]->read() ? 0x40 : 0);
- data |= (m_keypad[3]->read() ? 0x80 : 0);
+ // d0-d3: multiplexed inputs from d4-d7
+ for (int i = 0; i < 4; i++)
+ if (BIT(m_matrix, i+4))
+ data |= m_keypad[i]->read();
- return data;
-}
+ // d4-d7: multiplexed inputs from d0-d3
+ for (int i = 0; i < 4; i++)
+ if (m_matrix & m_keypad[i]->read())
+ data |= 1 << (i+4);
-WRITE8_MEMBER(borisdpl_state::display_w)
-{
- m_digits[m_matrix & 7] = data ^ 0xff;
+ return data;
}
-READ8_MEMBER(borisdpl_state::keypad_r)
-{
- uint8_t data = m_matrix & 0x07;
-
- switch (m_matrix & 7)
- {
- case 0: data |= m_keypad[0]->read(); break;
- case 1: data |= m_keypad[1]->read(); break;
- case 2: data |= m_keypad[2]->read(); break;
- case 3: data |= m_keypad[3]->read(); break;
- }
- return data;
-}
+/******************************************************************************
+ Address Maps
+******************************************************************************/
-void chesstrv_base_state::chesstrv_mem(address_map &map)
+void chesstrv_state::chesstrv_mem(address_map &map)
{
map.global_mask(0x7ff);
map(0x0000, 0x07ff).rom();
}
-
void chesstrv_state::chesstrv_io(address_map &map)
{
- map(0x00, 0x00).rw(FUNC(chesstrv_state::ram_addr_r), FUNC(chesstrv_state::ram_addr_w));
- map(0x01, 0x01).w(FUNC(chesstrv_state::display_w));
- map(0x04, 0x04).rw(FUNC(chesstrv_state::ram_r), FUNC(chesstrv_state::ram_w));
- map(0x05, 0x05).rw(FUNC(chesstrv_state::keypad_r), FUNC(chesstrv_state::matrix_w));
-}
-
-void borisdpl_state::borisdpl_io(address_map &map)
-{
- map(0x00, 0x00).rw(FUNC(borisdpl_state::keypad_r), FUNC(borisdpl_state::matrix_w));
- map(0x01, 0x01).w(FUNC(borisdpl_state::display_w));
- map(0x04, 0x04).rw(FUNC(borisdpl_state::ram_r), FUNC(borisdpl_state::ram_w));
- map(0x05, 0x05).rw(FUNC(borisdpl_state::ram_addr_r), FUNC(borisdpl_state::ram_addr_w));
+ map(0x00, 0x00).rw(FUNC(chesstrv_state::ram_address_r), FUNC(chesstrv_state::ram_address_w));
+ map(0x01, 0x01).w(FUNC(chesstrv_state::digit_w));
+ map(0x04, 0x07).rw("psu", FUNC(f38t56_device::read), FUNC(f38t56_device::write));
}
-static INPUT_PORTS_START( chesstrv )
- PORT_START("LINE1")
- PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("A1") PORT_CODE(KEYCODE_A) PORT_CODE(KEYCODE_1)
- PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("B2") PORT_CODE(KEYCODE_B) PORT_CODE(KEYCODE_2)
- PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("C3") PORT_CODE(KEYCODE_C) PORT_CODE(KEYCODE_3)
- PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("D4") PORT_CODE(KEYCODE_D) PORT_CODE(KEYCODE_4)
- PORT_BIT(0xf0, IP_ACTIVE_HIGH, IPT_UNUSED)
-
- PORT_START("LINE2")
- PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("E5") PORT_CODE(KEYCODE_E) PORT_CODE(KEYCODE_5)
- PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("F6") PORT_CODE(KEYCODE_F) PORT_CODE(KEYCODE_6)
- PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("G7") PORT_CODE(KEYCODE_G) PORT_CODE(KEYCODE_7)
- PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("H8") PORT_CODE(KEYCODE_H) PORT_CODE(KEYCODE_8)
- PORT_BIT(0xf0, IP_ACTIVE_HIGH, IPT_UNUSED)
- PORT_START("LINE3")
- PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("LV") PORT_CODE(KEYCODE_L)
- PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("FP") PORT_CODE(KEYCODE_K)
- PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("EP") PORT_CODE(KEYCODE_O)
- PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("CB") PORT_CODE(KEYCODE_Q)
- PORT_BIT(0xf0, IP_ACTIVE_HIGH, IPT_UNUSED)
- PORT_START("LINE4")
- PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("CE") PORT_CODE(KEYCODE_DEL)
- PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("ENTER") PORT_CODE(KEYCODE_ENTER)
- PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("MM") PORT_CODE(KEYCODE_M)
- PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_UNUSED)
- PORT_BIT(0xf0, IP_ACTIVE_HIGH, IPT_UNUSED)
-INPUT_PORTS_END
+/******************************************************************************
+ Input Ports
+******************************************************************************/
-static INPUT_PORTS_START( borisdpl )
+static INPUT_PORTS_START( chesstrv )
PORT_START("LINE1")
- PORT_BIT(0x0f, IP_ACTIVE_HIGH, IPT_UNUSED)
- PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("0") PORT_CODE(KEYCODE_0)
- PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("-") PORT_CODE(KEYCODE_MINUS)
- PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("B/W") PORT_CODE(KEYCODE_W)
- PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("ENTER") PORT_CODE(KEYCODE_ENTER)
+ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_A) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("A 1 / Pawn")
+ PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_B) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("B 2 / Knight")
+ PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_C) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("C 3 / Bishop")
+ PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_D) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("D 4 / Rook")
PORT_START("LINE2")
- PORT_BIT(0x0f, IP_ACTIVE_HIGH, IPT_UNUSED)
- PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("A1") PORT_CODE(KEYCODE_A) PORT_CODE(KEYCODE_1)
- PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("B2") PORT_CODE(KEYCODE_B) PORT_CODE(KEYCODE_2)
- PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("C3") PORT_CODE(KEYCODE_C) PORT_CODE(KEYCODE_3)
- PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("RANK") PORT_CODE(KEYCODE_R)
+ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_E) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("E 5 / Queen")
+ PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_F) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("F 6 / King")
+ PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_G) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("G 7 / White")
+ PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_H) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("H 8 / Black")
PORT_START("LINE3")
- PORT_BIT(0x0f, IP_ACTIVE_HIGH, IPT_UNUSED)
- PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("D4") PORT_CODE(KEYCODE_D) PORT_CODE(KEYCODE_4)
- PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("E5") PORT_CODE(KEYCODE_E) PORT_CODE(KEYCODE_5)
- PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("F6") PORT_CODE(KEYCODE_F) PORT_CODE(KEYCODE_6)
- PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("TIME") PORT_CODE(KEYCODE_T)
+ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_L) PORT_NAME("LV / CS") // level/clear square
+ PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_K) PORT_NAME("FP") // find position
+ PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_O) PORT_NAME("EP") // enter position
+ PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_Q) PORT_NAME("CB") // clear board
PORT_START("LINE4")
- PORT_BIT(0x0f, IP_ACTIVE_HIGH, IPT_UNUSED)
- PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("G7") PORT_CODE(KEYCODE_G) PORT_CODE(KEYCODE_7)
- PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("H8") PORT_CODE(KEYCODE_H) PORT_CODE(KEYCODE_8)
- PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("9/SET") PORT_CODE(KEYCODE_S) PORT_CODE(KEYCODE_9)
- PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("CE") PORT_CODE(KEYCODE_DEL)
-
+ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_DEL) PORT_CODE(KEYCODE_BACKSPACE) PORT_NAME("CE") // clear entry
+ PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("Enter")
+ PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_M) PORT_NAME("MM") // multi move
+ PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_UNUSED)
INPUT_PORTS_END
-/*
-TIMER_DEVICE_CALLBACK_MEMBER(borisdpl_state::timer_interrupt)
-{
- m_maincpu->set_input_line_and_vector(F8_INPUT_LINE_INT_REQ, HOLD_LINE, 0x20);
-}
-*/
-
-void chesstrv_base_state::machine_start()
-{
- m_ram = memregion("ram")->base();
- save_item(NAME(m_ram_addr));
- save_item(NAME(m_matrix));
-}
-void chesstrv_state::machine_start()
-{
- chesstrv_base_state::machine_start();
- m_digits.resolve();
-}
+/******************************************************************************
+ Machine Configs
+******************************************************************************/
-void borisdpl_state::machine_start()
+void chesstrv_state::chesstrv(machine_config &config)
{
- chesstrv_base_state::machine_start();
- m_digits.resolve();
-}
-
-MACHINE_CONFIG_START(chesstrv_state::chesstrv)
/* basic machine hardware */
- MCFG_DEVICE_ADD( "maincpu", F8, 3000000 ) // Fairchild 3870
- MCFG_DEVICE_PROGRAM_MAP( chesstrv_mem )
- MCFG_DEVICE_IO_MAP( chesstrv_io )
+ F8(config, m_maincpu, 3000000/2); // Fairchild 3870, measured ~3MHz
+ m_maincpu->set_addrmap(AS_PROGRAM, &chesstrv_state::chesstrv_mem);
+ m_maincpu->set_addrmap(AS_IO, &chesstrv_state::chesstrv_io);
+
+ f38t56_device &psu(F38T56(config, "psu", 3000000/2));
+ psu.read_a().set(FUNC(chesstrv_state::ram_data_r));
+ psu.write_a().set(FUNC(chesstrv_state::ram_data_w));
+ psu.read_b().set(FUNC(chesstrv_state::input_r));
+ psu.write_b().set(FUNC(chesstrv_state::matrix_w));
/* video hardware */
- config.set_default_layout(layout_chesstrv);
-MACHINE_CONFIG_END
+ for (int i = 0; i < 4; i++)
+ TIMER(config, m_delay_display[i]).configure_generic(FUNC(chesstrv_state::delay_display));
-MACHINE_CONFIG_START(borisdpl_state::borisdpl)
- /* basic machine hardware */
- MCFG_DEVICE_ADD( "maincpu", F8, 30000000 ) // Motorola SC80265P
- MCFG_DEVICE_PROGRAM_MAP( chesstrv_mem )
- MCFG_DEVICE_IO_MAP( borisdpl_io )
+ config.set_default_layout(layout_chesstrv);
+}
- /* video hardware */
- config.set_default_layout(layout_borisdpl);
- //MCFG_TIMER_DRIVER_ADD_PERIODIC("timer_interrupt", borisdpl_state, timer_interrupt, attotime::from_hz(40))
-MACHINE_CONFIG_END
+/******************************************************************************
+ ROM Definitions
+******************************************************************************/
ROM_START( chesstrv )
- ROM_REGION(0x0800, "maincpu", 0)
- ROM_LOAD("3870-sl90387", 0x0000, 0x0800, CRC(b76214d8) SHA1(7760903a64d9c513eb54c4787f535dabec62eb64))
-
- ROM_REGION(0x0100, "ram", ROMREGION_ERASE)
+ ROM_REGION( 0x0800, "maincpu", 0 )
+ ROM_LOAD("3870-sl90387", 0x0000, 0x0800, CRC(b76214d8) SHA1(7760903a64d9c513eb54c4787f535dabec62eb64) )
ROM_END
-ROM_START( boris )
- ROM_REGION(0x0c00, "maincpu", 0)
- ROM_LOAD("007-7020-00_c10502_korea.bin", 0x0000, 0x0800, CRC(18182870) SHA1(cb717a4b5269b04b0d7ae61aaf4a8f6a019626a5))
- ROM_LOAD("007-7021-00_c10503_korea.bin", 0x0800, 0x0400, CRC(49b77505) SHA1(474b665ee2955497f6d70878d817f1783ba1a835))
+} // anonymous namespace
- ROM_REGION(0x0100, "ram", ROMREGION_ERASE)
-ROM_END
-
-ROM_START( borisdpl )
- ROM_REGION(0x0800, "maincpu", 0)
- ROM_LOAD("007-7024-00_7847.u8", 0x0000, 0x0800, CRC(e20bac03) SHA1(9e17b9d90522371fbf7018926356150f70b9a3b6))
- ROM_REGION(0x0100, "ram", ROMREGION_ERASE)
-ROM_END
+/******************************************************************************
+ Drivers
+******************************************************************************/
-// YEAR NAME PARENT COMPAT MACHINE INPUT STATE INIT COMPANY FULLNAME FLAGS
-CONS( 1980, chesstrv, 0, 0, chesstrv, chesstrv, chesstrv_state, empty_init, "Acetronic", "Chess Traveller", MACHINE_NOT_WORKING | MACHINE_NO_SOUND_HW | MACHINE_SUPPORTS_SAVE )
-CONS( 1979, boris, 0, 0, borisdpl, borisdpl, borisdpl_state, empty_init, "Applied Concepts", "Boris - Electronic Chess Computer", MACHINE_NOT_WORKING | MACHINE_NO_SOUND_HW | MACHINE_SUPPORTS_SAVE )
-CONS( 1979, borisdpl, 0, 0, borisdpl, borisdpl, borisdpl_state, empty_init, "Applied Concepts", "Boris Diplomat", MACHINE_NOT_WORKING | MACHINE_NO_SOUND_HW | MACHINE_SUPPORTS_SAVE )
+// YEAR NAME PARENT CMP MACHINE INPUT STATE INIT COMPANY, FULLNAME, FLAGS
+CONS( 1980, chesstrv, 0, 0, chesstrv, chesstrv, chesstrv_state, empty_init, "SciSys", "Chess Traveler", MACHINE_NO_SOUND_HW | MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK )
diff --git a/src/mame/drivers/chexx.cpp b/src/mame/drivers/chexx.cpp
index e263087927f..a7b9ee27d3a 100644
--- a/src/mame/drivers/chexx.cpp
+++ b/src/mame/drivers/chexx.cpp
@@ -261,12 +261,12 @@ WRITE8_MEMBER(faceoffh_state::ay_w)
if (m_ay_cmd == 0x00 && data == 0x03)
{
- m_aysnd->address_w(space, offset, m_ay_data, mem_mask);
+ m_aysnd->address_w(m_ay_data);
// logerror("%s: AY addr = %02X\n", machine().describe_context(), m_ay_data);
}
else if (m_ay_cmd == 0x00 && data == 0x02)
{
- m_aysnd->data_w(space, offset, m_ay_data, mem_mask);
+ m_aysnd->data_w(m_ay_data);
// logerror("%s: AY data = %02X\n", machine().describe_context(), m_ay_data);
}
m_ay_cmd = data;
diff --git a/src/mame/drivers/chicago.cpp b/src/mame/drivers/chicago.cpp
index 14b2d545572..aa26674789a 100644
--- a/src/mame/drivers/chicago.cpp
+++ b/src/mame/drivers/chicago.cpp
@@ -94,20 +94,21 @@ void chicago_state::video_start()
{
}
-MACHINE_CONFIG_START(chicago_state::chicago)
-
+void chicago_state::chicago(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", NETLIST_CPU, NETLIST_CLOCK)
- MCFG_NETLIST_SETUP(chicago)
+ NETLIST_CPU(config, m_maincpu, NETLIST_CLOCK);
+ m_maincpu->set_constructor(netlist_chicago);
/* video hardware */
- MCFG_FIXFREQ_ADD("fixfreq", "screen")
- MCFG_FIXFREQ_MONITOR_CLOCK(MASTER_CLOCK)
- MCFG_FIXFREQ_HORZ_PARAMS(H_TOTAL-67,H_TOTAL-40,H_TOTAL-8,H_TOTAL)
- MCFG_FIXFREQ_VERT_PARAMS(V_TOTAL-22,V_TOTAL-19,V_TOTAL-12,V_TOTAL)
- MCFG_FIXFREQ_FIELDCOUNT(1)
- MCFG_FIXFREQ_SYNC_THRESHOLD(0.30)
-MACHINE_CONFIG_END
+ SCREEN(config, "screen", SCREEN_TYPE_RASTER);
+ FIXFREQ(config, m_video).set_screen("screen");
+ m_video->set_monitor_clock(MASTER_CLOCK);
+ m_video->set_horz_params(H_TOTAL-67,H_TOTAL-40,H_TOTAL-8,H_TOTAL);
+ m_video->set_vert_params(V_TOTAL-22,V_TOTAL-19,V_TOTAL-12,V_TOTAL);
+ m_video->set_fieldcount(1);
+ m_video->set_threshold(0.30);
+}
/***************************************************************************
diff --git a/src/mame/drivers/chihiro.cpp b/src/mame/drivers/chihiro.cpp
index e3f1052e2ae..751dd6d191d 100644
--- a/src/mame/drivers/chihiro.cpp
+++ b/src/mame/drivers/chihiro.cpp
@@ -5,7 +5,8 @@ Chihiro is an Xbox-based arcade system from SEGA.
Games on this system include....
- yyyymmdd Game Manufacturer / Developer Media Number Key Chip
+GD build date
+ yyyymmdd Game Manufacturer / Developer Media Number Key Chip
+-+----------+----------------------------------------------------+--------------------------+--------+------------+--------------|
|*| 20021029 | The House of the Dead III | Sega / Wow Entertainment | GDROM | GDX-0001 | 317-0348-COM |
| | 2003 | Crazy Taxi High Roller | Sega / Hitmaker | GDROM | GDX-0002 | 317-0353-COM |
@@ -16,52 +17,58 @@ Games on this system include....
| | 20030226 | Virtua Cop 3 (Rev A) | Sega | CF | MDA-G0010 | 317-0354-COM |
|*| 20030521 | Virtua Cop 3 (Rev B) | Sega | GDROM | GDX-0003B | 317-0354-COM |
| | 2003 | OutRun 2 | Sega | GDROM | GDX-0004 | 317-0372-COM |
-|*| 200312 | OutRun 2 (Rev A) | Sega | GDROM | GDX-0004A | 317-0372-COM |
+|*| 20031017 | OutRun 2 (Rev A) | Sega | GDROM | GDX-0004A | 317-0372-COM |
| | 200312 | OutRun 2 (Rev A) | Sega | CF | MDA-G0011 | 317-0372-COM |
-| | 2003 | OutRun 2 prototype (Rev P) | Sega | GDROM | GDX-0004P | |
+| | 20030911 | OutRun 2 prototype (Rev P) | Sega | GDROM | GDX-0004P | 317-0372-COM |
| | 2004 | Sega Golf Club Network Pro Tour | Sega | GDROM | GDX-0005 | |
| | 2004 | Sega Network Taisen Mahjong MJ 2 | Sega | GDROM | GDX-0006 | 317-0374-JPN |
| | 2004 | Sega Network Taisen Mahjong MJ 2 (Rev A) | Sega | GDROM | GDX-0006A | 317-0374-JPN |
| | 2004 | Sega Network Taisen Mahjong MJ 2 (Rev B) | Sega | GDROM | GDX-0006B | 317-0374-JPN |
-|*| 200412 | Sega Network Taisen Mahjong MJ 2 (Rev C) | Sega | GDROM | GDX-0006C | 317-0374-JPN |
+|*| 20041102 | Sega Network Taisen Mahjong MJ 2 (Rev C) | Sega | GDROM | GDX-0006C | 317-0374-JPN |
| | 2004 | Sega Network Taisen Mahjong MJ 2 (Rev D) | Sega | GDROM | GDX-0006D | 317-0374-JPN |
| | 2005 | Sega Network Taisen Mahjong MJ 2 (Rev E) | Sega | GDROM | GDX-0006E | 317-0374-JPN |
-|*| 200502 | Sega Network Taisen Mahjong MJ 2 (Rev F) | Sega | GDROM | GDX-0006F | 317-0374-JPN |
+|*| 2005 | Sega Network Taisen Mahjong MJ 2 (Rev F) | Sega | GDROM | GDX-0006F | 317-0374-JPN |
|*| 20050202 | Sega Network Taisen Mahjong MJ 2 (Rev G) | Sega | GDROM | GDX-0006G | 317-0374-JPN |
-|*| 200403 | Ollie King | Sega / Amusement Vision | GDROM | GDX-0007 | 317-0377-COM |
+|*| 20031211 | Ollie King | Sega / Amusement Vision | GDROM | GDX-0007 | 317-0377-COM |
| | 2004 | Wangan Midnight Maximum Tune (Japan) | Namco | GDROM | GDX-0008 | 317-5101-JPN |
-| | 2004 | Wangan Midnight Maximum Tune (Japan) (Rev A) | Namco | GDROM | GDX-0008A | 317-5101-JPN |
-|*| 2004 | Wangan Midnight Maximum Tune (Japan) (Rev B) | Namco | GDROM | GDX-0008B | 317-5101-JPN |
+| | 2004 | Wangan Midnight Maximum Tune (Japan, Rev A) | Namco | GDROM | GDX-0008A | 317-5101-JPN |
+|*| 20040610 | Wangan Midnight Maximum Tune (Japan, Rev B) | Namco | GDROM | GDX-0008B | 317-5101-JPN |
| | 2004 | Wangan Midnight Maximum Tune (Export) | Namco | GDROM | GDX-0009 | 317-5101-COM |
-| | 2004 | Wangan Midnight Maximum Tune (Export) (Rev A) | Namco | GDROM | GDX-0009A | 317-5101-COM |
-|*| 2004 | Wangan Midnight Maximum Tune (Export) (Rev B) | Namco | GDROM | GDX-0009B | 317-5101-COM |
+| | 2004 | Wangan Midnight Maximum Tune (Export, Rev A) | Namco | GDROM | GDX-0009A | 317-5101-COM |
+|*| 20040610 | Wangan Midnight Maximum Tune (Export, Rev B) | Namco | GDROM | GDX-0009B | 317-5101-COM |
+| | 2004 | Sega Club Golf | Sega | GDROM | GDX-0010 | |
|*| 20040909 | OutRun 2 Special Tours (Japan) | Sega | GDROM | GDX-0011 | 317-0396-COM |
-|*| 20041229 | OutRun 2 Special Tours (Japan) (Rev A) | Sega | GDROM | GDX-0011A | 317-0396-COM |
-|*| 2004 | Ghost Squad | Sega | GDROM | GDX-0012 | 317-0398-COM |
+|*| 20041229 | OutRun 2 Special Tours (Japan, Rev A) | Sega | GDROM | GDX-0011A | 317-0396-COM |
+|*| 20040914 | Ghost Squad | Sega | GDROM | GDX-0012 | 317-0398-COM |
|*| 20041209 | Ghost Squad (Rev A) | Sega | GDROM | GDX-0012A | 317-0398-COM |
| | 20041209 | Ghost Squad (Rev A) | Sega | CF | MDA-G0013 | 317-0398-COM |
-|*| 2005 | Gundam Battle Operating Simulator | Banpresto | GDROM | GDX-0013 | 317-0400-JPN |
-|*| 2004 | OutRun 2 Special Tours | Sega | GDROM | GDX-0014 | 317-0396-COM |
-|*| 2004 | OutRun 2 Special Tours (Rev A) | Sega | GDROM | GDX-0014A | 317-0396-COM |
-| | 2004 | OutRun 2 Special Tours (Rev A) | Sega | CF | MDA-G0012 | 317-0396-COM |
-|*| 200504 | Wangan Midnight Maximum Tune 2 (Japan) | Namco | GDROM | GDX-0015 | 317-5106-JPN |
-|*| 20050908 | Wangan Midnight Maximum Tune 2 (Japan) (Rev A) | Namco | GDROM | GDX-0015A | 317-5106-JPN |
-|*| 2005 | Wangan Midnight Maximum Tune 2 (Export) | Namco | GDROM | GDX-0016 | 317-5106-COM |
-|*| 2005 | Wangan Midnight Maximum Tune 2 (Export) (Rev A) | Namco | GDROM | GDX-0016A | 317-5106-COM |
+|*| 20050208 | Gundam Battle Operating Simulator | Banpresto | GDROM | GDX-0013 | 317-0400-JPN |
+|*| 20040910 | OutRun 2 Special Tours | Sega | GDROM | GDX-0014 | 317-0396-COM |
+|*| 20041229 | OutRun 2 Special Tours (Rev A) | Sega | GDROM | GDX-0014A | 317-0396-COM |
+| | 20041229 | OutRun 2 Special Tours (Rev A) | Sega | CF | MDA-G0012 | 317-0396-COM |
+|*| 20050218 | Wangan Midnight Maximum Tune 2 (Japan) | Namco | GDROM | GDX-0015 | 317-5106-JPN |
+|*| 20050908 | Wangan Midnight Maximum Tune 2 (Japan, Rev A) | Namco | GDROM | GDX-0015A | 317-5106-JPN |
+|*| 20050218 | Wangan Midnight Maximum Tune 2 (Export) | Namco | GDROM | GDX-0016 | 317-5106-COM |
+|*| 20050908 | Wangan Midnight Maximum Tune 2 (Export, Rev A) | Namco | GDROM | GDX-0016A | 317-5106-COM |
| | 2005 | Sega Network Taisen Mahjong MJ 3 | Sega | GDROM | GDX-0017 | 317-0414-JPN |
| | 2005 | Sega Network Taisen Mahjong MJ 3 (Rev A) | Sega | GDROM | GDX-0017A | 317-0414-JPN |
| | 2005 | Sega Network Taisen Mahjong MJ 3 (Rev B) | Sega | GDROM | GDX-0017B | 317-0414-JPN |
-| | 2005 | Sega Network Taisen Mahjong MJ 3 (Rev C) | Sega | GDROM | GDX-0017C | 317-0414-JPN |
-|*| 2005 | Sega Network Taisen Mahjong MJ 3 (Rev D) | Sega | GDROM | GDX-0017D | 317-0414-JPN |
-| | 2005 | Sega Network Taisen Mahjong MJ 3 (Rev E) | Sega | GDROM | GDX-0017E | 317-0414-JPN |
-|*| 2005 | Sega Network Taisen Mahjong MJ 3 (Rev F) | Sega | GDROM | GDX-0017F | 317-0414-JPN |
+|*| 20051109 | Sega Network Taisen Mahjong MJ 3 (Rev C) | Sega | GDROM | GDX-0017C | 317-0414-JPN |
+|*| 20060217 | Sega Network Taisen Mahjong MJ 3 (Rev D) | Sega | GDROM | GDX-0017D | 317-0414-JPN |
+| | 2006 | Sega Network Taisen Mahjong MJ 3 (Rev E) | Sega | GDROM | GDX-0017E | 317-0414-JPN |
+|*| 2006 | Sega Network Taisen Mahjong MJ 3 (Rev F) | Sega | GDROM | GDX-0017F | 317-0414-JPN |
| | 2005 | Sega Club Golf 2006: Next Tours | Sega | GDROM | GDX-0018 | |
-|*| 2005 | Sega Club Golf 2006: Next Tours (Rev A) | Sega | GDROM | GDX-0018A | ? |
-| | 2006 | Sega Network Taisen Mahjong MJ 3 Evolution | Sega | GDROM | GDX-0021 | |
-| | 2006 | Sega Network Taisen Mahjong MJ 3 Evolution (Rev A) | Sega | GDROM | GDX-0021A | |
-|*| 2007 | Sega Network Taisen Mahjong MJ 3 Evolution (Rev B) | Sega | GDROM | GDX-0021B | ? |
+|*| 20051107 | Sega Club Golf 2006: Next Tours (Rev A) | Sega | GDROM | GDX-0018A | 317-0428-JPN |
+| | 2005 | Firmware Update For MJ 3 | Sega | GDROM | GDX-0019 | |
+| | 200? | Sega Club Golf 2006 | Sega | GDROM | GDX-0020 | |
+| | 2006 | Sega Network Taisen Mahjong MJ 3 Evolution | Sega | GDROM | GDX-0021 | 317-0457-JPN |
+|*| 20070217 | Sega Network Taisen Mahjong MJ 3 Evolution (Rev A) | Sega | GDROM | GDX-0021A | 317-0457-JPN |
+|*| 20070525 | Sega Network Taisen Mahjong MJ 3 Evolution (Rev B) | Sega | GDROM | GDX-0021B | 317-0457-JPN |
+| | 200? | Sega Network Taisen Mahjong MJ 3 Evo Test Ver | Sega | GDROM | GDX-0022 | |
+| | 200? | Firmware Update For MJ 3 Evo | Sega | GDROM | GDX-0023 | |
| | 2009 | Firmware Update For Compact Flash Box | Sega | GDROM | GDX-0024 | |
-|*| 2009 | Firmware Update For Compact Flash Box (Rev A) | Sega | GDROM | GDX-0024A | 317-0567-EXP |
+|*| 20090331 | Firmware Update For Compact Flash Box (Rev A) | Sega | GDROM | GDX-0024A | 317-0567-EXP |
+|*| 20030226 | Chihiro Change Region GD USA | Sega | GDROM | 611-0028A | 317-0351-EXP |
|*| 2004 | Quest Of D Ver.1.01C | Sega | CDROM | CDV-10005C | 317-0376-JPN |
|*| 2005 | Sangokushi Taisen Ver.1.002 | Sega | DVDROM | CDV-10009D | |
|*| 2005 | Mobile Suit Gundam 0079 Card Builder | Banpresto | DVDROM | CDV-10010 | 317-0415-JPN |
@@ -317,7 +324,7 @@ Notes:
CN11/12 - Network board connectors joining to Sega Network PCB
CN13 - Battery connector (maintains power to DIMM RAM)
CN14S - 100 pin connector joining to base board
- JP4-10 - Jumpers. Settings are as follows (taken from Wangan Midnight Maximum Tune 2 (Japan) (Rev A))
+ JP4-10 - Jumpers. Settings are as follows (taken from Wangan Midnight Maximum Tune 2 (Japan, Rev A))
JP4 2-3
JP5 2-3. Sets DIMM RAM size. 1-2 = 1GB (2x 512M sticks), 2-3 = 512MB (1x 512M stick)
JP6 1-2
@@ -350,7 +357,7 @@ Notes:
CN6 - 7-pin connector
SW1/2 - test/service buttons
DIN1 - 96-pin connector joining to Base Board
- DIPSW - 8-position DIP switch. On this game (Wangan Midnight Maximum Tune 2 (Japan) (Rev A)) DIPs 3, 4, 6, 7 & 8 are set ON. The others are OFF.
+ DIPSW - 8-position DIP switch. On this game (Wangan Midnight Maximum Tune 2 (Japan, Rev A)) DIPs 3, 4, 6, 7 & 8 are set ON. The others are OFF.
Dump info:
@@ -1667,7 +1674,7 @@ void chihiro_state::baseboard_ide_event(int type, uint8_t *read_buffer, uint8_t
// clear
write_buffer[0] = write_buffer[1] = write_buffer[2] = write_buffer[3] = 0;
// irq 10 active
- xbox_base_devs.pic8259_2->ir2_w(1);
+ mcpxlpc->irq10(1);
}
uint8_t *chihiro_state::baseboard_ide_dimmboard(uint32_t lba)
@@ -1704,7 +1711,7 @@ WRITE32_MEMBER(chihiro_state::mediaboard_w)
logerror("I/O port write %04x mask %08X value %08X\n", offset * 4 + 0x4000, mem_mask, data);
// irq 10
if ((offset == 0xe0/4) && ACCESSING_BITS_8_15)
- xbox_base_devs.pic8259_2->ir2_w(0);
+ mcpxlpc->irq10(0);
}
void chihiro_state::chihiro_map(address_map &map)
@@ -1855,24 +1862,20 @@ void chihiro_state::an2131sc_configuration(device_t *device)
MCFG_OHCI_HLEAN2131SC_REGION(":others", 0x2080)
}
-MACHINE_CONFIG_START(chihiro_state::chihiro_base)
+void chihiro_state::chihiro_base(machine_config &config)
+{
xbox_base(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(chihiro_map)
- MCFG_DEVICE_IO_MAP(chihiro_map_io)
+ m_maincpu->set_addrmap(AS_PROGRAM, &chihiro_state::chihiro_map);
+ m_maincpu->set_addrmap(AS_IO, &chihiro_state::chihiro_map_io);
- //BUS_MASTER_IDE_CONTROLLER(config, "ide").options(ide_baseboard, nullptr, "bb", true);
- MCFG_DEVICE_MODIFY(":pci:09.0:ide:0")
- MCFG_DEVICE_SLOT_INTERFACE(ide_baseboard, nullptr, true)
- MCFG_DEVICE_MODIFY(":pci:09.0:ide:1")
- MCFG_DEVICE_SLOT_INTERFACE(ide_baseboard, "bb", true)
+ subdevice<ide_controller_32_device>(":pci:09.0:ide")->options(ide_baseboard, nullptr, "bb", true);
OHCI_USB_CONNECTOR(config, ":pci:02.0:port1", usb_baseboard, "an2131qc", true).set_option_machine_config("an2131qc", an2131qc_configuration);
OHCI_USB_CONNECTOR(config, ":pci:02.0:port2", usb_baseboard, "an2131sc", true).set_option_machine_config("an2131sc", an2131sc_configuration);
OHCI_USB_CONNECTOR(config, ":pci:02.0:port3", usb_baseboard, nullptr, false);
OHCI_USB_CONNECTOR(config, ":pci:02.0:port4", usb_baseboard, nullptr, false);
- MCFG_DEVICE_ADD("jvs_master", JVS_MASTER, 0)
+ JVS_MASTER(config, "jvs_master", 0);
sega_837_13551_device &sega837(SEGA_837_13551(config, "837_13551", 0, "jvs_master"));
sega837.set_port_tag<0>("TILT");
sega837.set_port_tag<1>("P1");
@@ -1886,7 +1889,7 @@ MACHINE_CONFIG_START(chihiro_state::chihiro_base)
sega837.set_port_tag<9>("A6");
sega837.set_port_tag<10>("A7");
sega837.set_port_tag<11>("OUTPUT");
-MACHINE_CONFIG_END
+}
void chihiro_state::chihirogd(machine_config &config)
{
@@ -2243,6 +2246,16 @@ ROM_START( wangmid2 )
ROM_LOAD("317-5106-com.data", 0x00, 0x50, CRC(75c716aa) SHA1(5c2bcf3d28a80b336c6882d5aeb010d04327f8c1) )
ROM_END
+ROM_START( mj3c )
+ CHIHIRO_BIOS
+
+ DISK_REGION( "gdrom" )
+ DISK_IMAGE_READONLY( "gdx-0017c", 0, SHA1(72545708369aefe8fac82fb0b67774390bb956c6) )
+
+ ROM_REGION( 0x4000, "pic", ROMREGION_ERASEFF)
+ ROM_LOAD( "317-0414-jpn.pic", 0x000000, 0x004000, CRC(27d1c541) SHA1(c85a8229dd769af02ab43c97f09f995743cdb315) )
+ROM_END
+
ROM_START( mj3d )
CHIHIRO_BIOS
@@ -2270,7 +2283,17 @@ ROM_START( scg06nt )
DISK_IMAGE_READONLY( "gdx-0018a", 0, SHA1(3c10775aefc5e3e49837bf473fb32e94507ee892) )
ROM_REGION( 0x50, "pic", ROMREGION_ERASE)
- ROM_LOAD("gdx-0018.data", 0x00, 0x50, CRC(1a210abd) SHA1(43a54d028315d2dfa9f8ea6fb59265e0b980b02f) )
+ ROM_LOAD("317-0428-jpn.data", 0x00, 0x50, CRC(1a210abd) SHA1(43a54d028315d2dfa9f8ea6fb59265e0b980b02f) )
+ROM_END
+
+ROM_START( mj3evoa )
+ CHIHIRO_BIOS
+
+ DISK_REGION( "gdrom" )
+ DISK_IMAGE_READONLY( "gdx-0021a", 0, SHA1(02c67e8f618b6f4de54898b0c0033b4e0077f2b5) )
+
+ ROM_REGION( 0x4000, "pic", ROMREGION_ERASEFF)
+ ROM_LOAD( "317-0457-jpn.pic", 0x000000, 0x004000, CRC(650fcc94) SHA1(c88488900460fb3deecb3cf376fc043b10c020ef) )
ROM_END
ROM_START( mj3evo )
@@ -2279,9 +2302,8 @@ ROM_START( mj3evo )
DISK_REGION( "gdrom" )
DISK_IMAGE_READONLY( "gdx-0021b", 0, SHA1(c97d1dc95cdf1b4bd5d7cf6b4db0757f3d6bd723) )
- // PIC label is unknown
ROM_REGION( 0x4000, "pic", ROMREGION_ERASEFF)
- ROM_LOAD( "317-xxxx-jpn.pic", 0x000000, 0x004000, CRC(650fcc94) SHA1(c88488900460fb3deecb3cf376fc043b10c020ef) )
+ ROM_LOAD( "317-0457-jpn.pic", 0x000000, 0x004000, CRC(650fcc94) SHA1(c88488900460fb3deecb3cf376fc043b10c020ef) )
ROM_END
/*
@@ -2312,6 +2334,29 @@ ROM_START( ccfboxa )
ROM_LOAD("317-0567-exp.pic", 0x00, 0x4000, CRC(cd1d2b2d) SHA1(78203ee0339f76eb76da08d7de43e7e44e4b7d32) )
ROM_END
+/*
+Title CHIHIRO CHANGE REGION GD USA
+Checksum E588
+Media Config GD-ROM1/1
+Regions J
+Peripheral String 0000000
+Product Number 611-0028A
+Version V2.001
+Release Date 20030226
+*/
+ROM_START( cregchg )
+ CHIHIRO_BIOS
+
+ DISK_REGION( "gdrom" )
+ DISK_IMAGE_READONLY( "611-0028a", 0, SHA1(f88d2525ed8c68b380ebd95d22fac28383a7642f) )
+
+ ROM_REGION( 0x4000, "pic", ROMREGION_ERASEFF)
+ //PIC16C621A (317-0351-EXP)
+ //(sticker 253-5508-0351E)
+ ROM_LOAD("317-0351-exp.pic", 0x00, 0x4000, CRC(25f37472) SHA1(8ffdd637c1eb9989b3b635aface0def9e841f227) )
+ROM_END
+
+
/* CDV-1xxxx (Sega network CD-ROM and DVD-ROM games) */
ROM_START( questofd )
@@ -2471,47 +2516,50 @@ ROM_END
// 0006B GAME( 2004, mj2b, mj2, chihirogd, chihiro, chihiro_state, empty_init, ROT0, "Sega", "Sega Network Taisen Mahjong MJ 2 (Rev B) (GDX-0006B)", MACHINE_NO_SOUND|MACHINE_NOT_WORKING )
/* 0006C */ GAME( 2004, mj2c, mj2, chihirogd, chihiro, chihiro_state, empty_init, ROT0, "Sega", "Sega Network Taisen Mahjong MJ 2 (Rev C) (GDX-0006C)", MACHINE_NO_SOUND|MACHINE_NOT_WORKING )
// 0006D GAME( 2004, mj2d, mj2, chihirogd, chihiro, chihiro_state, empty_init, ROT0, "Sega", "Sega Network Taisen Mahjong MJ 2 (Rev D) (GDX-0006D)", MACHINE_NO_SOUND|MACHINE_NOT_WORKING )
-// 0006E GAME( 2004, mj2e, mj2, chihirogd, chihiro, chihiro_state, empty_init, ROT0, "Sega", "Sega Network Taisen Mahjong MJ 2 (Rev E) (GDX-0006E)", MACHINE_NO_SOUND|MACHINE_NOT_WORKING )
-/* 0006F */ GAME( 2004, mj2f, mj2, chihirogd, chihiro, chihiro_state, empty_init, ROT0, "Sega", "Sega Network Taisen Mahjong MJ 2 (Rev F) (GDX-0006F)", MACHINE_NO_SOUND|MACHINE_NOT_WORKING )
-/* 0006G */ GAME( 2004, mj2, chihiro, chihirogd, chihiro, chihiro_state, empty_init, ROT0, "Sega", "Sega Network Taisen Mahjong MJ 2 (Rev G) (GDX-0006G)", MACHINE_NO_SOUND|MACHINE_NOT_WORKING )
-/* 0007 */ GAME( 2004, ollie, chihiro, chihirogd, chihiro, chihiro_state, empty_init, ROT0, "Sega / Amusement Vision", "Ollie King (GDX-0007)", MACHINE_NO_SOUND|MACHINE_NOT_WORKING )
+// 0006E GAME( 2005, mj2e, mj2, chihirogd, chihiro, chihiro_state, empty_init, ROT0, "Sega", "Sega Network Taisen Mahjong MJ 2 (Rev E) (GDX-0006E)", MACHINE_NO_SOUND|MACHINE_NOT_WORKING )
+/* 0006F */ GAME( 2005, mj2f, mj2, chihirogd, chihiro, chihiro_state, empty_init, ROT0, "Sega", "Sega Network Taisen Mahjong MJ 2 (Rev F) (GDX-0006F)", MACHINE_NO_SOUND|MACHINE_NOT_WORKING )
+/* 0006G */ GAME( 2005, mj2, chihiro, chihirogd, chihiro, chihiro_state, empty_init, ROT0, "Sega", "Sega Network Taisen Mahjong MJ 2 (Rev G) (GDX-0006G)", MACHINE_NO_SOUND|MACHINE_NOT_WORKING )
+/* 0007 */ GAME( 2003, ollie, chihiro, chihirogd, chihiro, chihiro_state, empty_init, ROT0, "Sega / Amusement Vision", "Ollie King (GDX-0007)", MACHINE_NO_SOUND|MACHINE_NOT_WORKING )
// 0008 GAME( 2004, wangmidjo,wangmid, chihirogd, chihiro, chihiro_state, empty_init, ROT0, "Namco", "Wangan Midnight Maximum Tune (Japan) (GDX-0008)", MACHINE_NO_SOUND|MACHINE_NOT_WORKING )
-// 0008A GAME( 2004, wangmidja,wangmid, chihirogd, chihiro, chihiro_state, empty_init, ROT0, "Namco", "Wangan Midnight Maximum Tune (Japan) (Rev A) (GDX-0008A)", MACHINE_NO_SOUND|MACHINE_NOT_WORKING )
-/* 0008B */ GAME( 2004, wangmidj, wangmid, chihirogd, chihiro, chihiro_state, empty_init, ROT0, "Namco", "Wangan Midnight Maximum Tune (Japan) (Rev B) (GDX-0008B)", MACHINE_NO_SOUND|MACHINE_NOT_WORKING )
+// 0008A GAME( 2004, wangmidja,wangmid, chihirogd, chihiro, chihiro_state, empty_init, ROT0, "Namco", "Wangan Midnight Maximum Tune (Japan, Rev A) (GDX-0008A)", MACHINE_NO_SOUND|MACHINE_NOT_WORKING )
+/* 0008B */ GAME( 2004, wangmidj, wangmid, chihirogd, chihiro, chihiro_state, empty_init, ROT0, "Namco", "Wangan Midnight Maximum Tune (Japan, Rev B) (GDX-0008B)", MACHINE_NO_SOUND|MACHINE_NOT_WORKING )
// 0009 GAME( 2004, wangmido, wangmid, chihirogd, chihiro, chihiro_state, empty_init, ROT0, "Namco", "Wangan Midnight Maximum Tune (Export) (GDX-0009)", MACHINE_NO_SOUND|MACHINE_NOT_WORKING )
-// 0009A GAME( 2004, wangmida, wangmid, chihirogd, chihiro, chihiro_state, empty_init, ROT0, "Namco", "Wangan Midnight Maximum Tune (Export) (Rev A) (GDX-0009A)", MACHINE_NO_SOUND|MACHINE_NOT_WORKING )
-/* 0009B */ GAME( 2004, wangmid, chihiro, chihirogd, chihiro, chihiro_state, empty_init, ROT0, "Namco", "Wangan Midnight Maximum Tune (Export) (Rev B) (GDX-0009B)", MACHINE_NO_SOUND|MACHINE_NOT_WORKING )
-// 0010
+// 0009A GAME( 2004, wangmida, wangmid, chihirogd, chihiro, chihiro_state, empty_init, ROT0, "Namco", "Wangan Midnight Maximum Tune (Export, Rev A) (GDX-0009A)", MACHINE_NO_SOUND|MACHINE_NOT_WORKING )
+/* 0009B */ GAME( 2004, wangmid, chihiro, chihirogd, chihiro, chihiro_state, empty_init, ROT0, "Namco", "Wangan Midnight Maximum Tune (Export, Rev B) (GDX-0009B)", MACHINE_NO_SOUND|MACHINE_NOT_WORKING )
+// 0010 Sega Golf Club
/* 0011 */ GAME( 2004, outr2stjo,outr2st, chihirogd, chihiro, chihiro_state, empty_init, ROT0, "Sega", "OutRun 2 Special Tours (Japan) (GDX-0011)", MACHINE_NO_SOUND|MACHINE_NOT_WORKING|MACHINE_SUPPORTS_SAVE )
-/* 0011A */ GAME( 2004, outr2stj, outr2st, chihirogd, chihiro, chihiro_state, empty_init, ROT0, "Sega", "OutRun 2 Special Tours (Japan) (Rev A) (GDX-0011A)", MACHINE_NO_SOUND|MACHINE_NOT_WORKING|MACHINE_SUPPORTS_SAVE )
+/* 0011A */ GAME( 2004, outr2stj, outr2st, chihirogd, chihiro, chihiro_state, empty_init, ROT0, "Sega", "OutRun 2 Special Tours (Japan, Rev A) (GDX-0011A)", MACHINE_NO_SOUND|MACHINE_NOT_WORKING|MACHINE_SUPPORTS_SAVE )
/* 0012 */ GAME( 2004, ghostsqo, ghostsqu, chihirogd, chihiro, chihiro_state, empty_init, ROT0, "Sega", "Ghost Squad (GDX-0012)", MACHINE_NO_SOUND|MACHINE_NOT_WORKING )
/* 0012A */ GAME( 2004, ghostsqu, chihiro, chihirogd, chihiro, chihiro_state, empty_init, ROT0, "Sega", "Ghost Squad (Rev A) (GDX-0012A)", MACHINE_NO_SOUND|MACHINE_NOT_WORKING )
/* 0013 */ GAME( 2005, gundamos, chihiro, chihirogd, chihiro, chihiro_state, empty_init, ROT0, "Banpresto", "Gundam Battle Operating Simulator (GDX-0013)", MACHINE_NO_SOUND|MACHINE_NOT_WORKING )
/* 0014 */ GAME( 2004, outr2sto, outr2st, chihirogd, chihiro, chihiro_state, empty_init, ROT0, "Sega", "OutRun 2 Special Tours (GDX-0014)", MACHINE_NO_SOUND|MACHINE_NOT_WORKING )
/* 0014A */ GAME( 2004, outr2st, chihiro, chihirogd, chihiro, chihiro_state, empty_init, ROT0, "Sega", "OutRun 2 Special Tours (Rev A) (GDX-0014A)", MACHINE_NO_SOUND|MACHINE_NOT_WORKING )
/* 0015 */ GAME( 2005, wangmid2j,wangmid2, chihirogd, chihiro, chihiro_state, empty_init, ROT0, "Namco", "Wangan Midnight Maximum Tune 2 (Japan) (GDX-0015)", MACHINE_NO_SOUND|MACHINE_NOT_WORKING )
-/* 0015A */ GAME( 2005, wangmid2ja,wangmid2,chihirogd, chihiro, chihiro_state, empty_init, ROT0, "Namco", "Wangan Midnight Maximum Tune 2 (Japan) (Rev A) (GDX-0015A)", MACHINE_NO_SOUND|MACHINE_NOT_WORKING )
+/* 0015A */ GAME( 2005, wangmid2ja,wangmid2,chihirogd, chihiro, chihiro_state, empty_init, ROT0, "Namco", "Wangan Midnight Maximum Tune 2 (Japan, Rev A) (GDX-0015A)", MACHINE_NO_SOUND|MACHINE_NOT_WORKING )
/* 0016 */ GAME( 2005, wangmid2o,wangmid2, chihirogd, chihiro, chihiro_state, empty_init, ROT0, "Namco", "Wangan Midnight Maximum Tune 2 (Export) (GDX-0016)", MACHINE_NO_SOUND|MACHINE_NOT_WORKING )
-/* 0016A */ GAME( 2005, wangmid2, chihiro, chihirogd, chihiro, chihiro_state, empty_init, ROT0, "Namco", "Wangan Midnight Maximum Tune 2 (Export) (Rev A) (GDX-0016A)", MACHINE_NO_SOUND|MACHINE_NOT_WORKING )
+/* 0016A */ GAME( 2005, wangmid2, chihiro, chihirogd, chihiro, chihiro_state, empty_init, ROT0, "Namco", "Wangan Midnight Maximum Tune 2 (Export, Rev A) (GDX-0016A)", MACHINE_NO_SOUND|MACHINE_NOT_WORKING )
// 0017 GAME( 2005, mj3o, mj3, chihirogd, chihiro, chihiro_state, empty_init, ROT0, "Sega", "Sega Network Taisen Mahjong MJ 3 (GDX-0017)", MACHINE_NO_SOUND|MACHINE_NOT_WORKING )
// 0017A GAME( 2005, mj3a, mj3, chihirogd, chihiro, chihiro_state, empty_init, ROT0, "Sega", "Sega Network Taisen Mahjong MJ 3 (Rev A) (GDX-0017A)", MACHINE_NO_SOUND|MACHINE_NOT_WORKING )
// 0017B GAME( 2005, mj3b, mj3, chihirogd, chihiro, chihiro_state, empty_init, ROT0, "Sega", "Sega Network Taisen Mahjong MJ 3 (Rev B) (GDX-0017B)", MACHINE_NO_SOUND|MACHINE_NOT_WORKING )
-// 0017C GAME( 2005, mj3c, mj3, chihirogd, chihiro, chihiro_state, empty_init, ROT0, "Sega", "Sega Network Taisen Mahjong MJ 3 (Rev C) (GDX-0017C)", MACHINE_NO_SOUND|MACHINE_NOT_WORKING )
-/* 0017D */ GAME( 2005, mj3d, mj3, chihirogd, chihiro, chihiro_state, empty_init, ROT0, "Sega", "Sega Network Taisen Mahjong MJ 3 (Rev D) (GDX-0017D)", MACHINE_NO_SOUND|MACHINE_NOT_WORKING )
-// 0017E GAME( 2005, mj3e, mj3, chihirogd, chihiro, chihiro_state, empty_init, ROT0, "Sega", "Sega Network Taisen Mahjong MJ 3 (Rev E) (GDX-0017E)", MACHINE_NO_SOUND|MACHINE_NOT_WORKING )
-/* 0017F */ GAME( 2005, mj3, chihiro, chihirogd, chihiro, chihiro_state, empty_init, ROT0, "Sega", "Sega Network Taisen Mahjong MJ 3 (Rev F) (GDX-0017F)", MACHINE_NO_SOUND|MACHINE_NOT_WORKING )
+/* 0017C */ GAME( 2005, mj3c, mj3, chihirogd, chihiro, chihiro_state, empty_init, ROT0, "Sega", "Sega Network Taisen Mahjong MJ 3 (Rev C) (GDX-0017C)", MACHINE_NO_SOUND|MACHINE_NOT_WORKING )
+/* 0017D */ GAME( 2006, mj3d, mj3, chihirogd, chihiro, chihiro_state, empty_init, ROT0, "Sega", "Sega Network Taisen Mahjong MJ 3 (Rev D) (GDX-0017D)", MACHINE_NO_SOUND|MACHINE_NOT_WORKING )
+// 0017E GAME( 2006, mj3e, mj3, chihirogd, chihiro, chihiro_state, empty_init, ROT0, "Sega", "Sega Network Taisen Mahjong MJ 3 (Rev E) (GDX-0017E)", MACHINE_NO_SOUND|MACHINE_NOT_WORKING )
+/* 0017F */ GAME( 2006, mj3, chihiro, chihirogd, chihiro, chihiro_state, empty_init, ROT0, "Sega", "Sega Network Taisen Mahjong MJ 3 (Rev F) (GDX-0017F)", MACHINE_NO_SOUND|MACHINE_NOT_WORKING )
// 0018 GAME( 2005, scg06nto, scg06nt, chihirogd, chihiro, chihiro_state, empty_init, ROT0, "Sega", "Sega Club Golf 2006 Next Tours (GDX-0018)", MACHINE_NO_SOUND|MACHINE_NOT_WORKING )
/* 0018A */ GAME( 2005, scg06nt, chihiro, chihirogd, chihiro, chihiro_state, empty_init, ROT0, "Sega", "Sega Club Golf 2006 Next Tours (Rev A) (GDX-0018A)", MACHINE_NO_SOUND|MACHINE_NOT_WORKING )
-// 0019
-// 0020
+// 0019 Firmware Update For MJ 3
+// 0020 Sega Golf Club 2006
// 0021 GAME( 2006, mj3evoo, mj3evo, chihirogd, chihiro, chihiro_state, empty_init, ROT0, "Sega", "Sega Network Taisen Mahjong MJ 3 Evolution (GDX-0021)", MACHINE_NO_SOUND|MACHINE_NOT_WORKING )
-// 0021A GAME( 2006, mj3evoa, mj3evo, chihirogd, chihiro, chihiro_state, empty_init, ROT0, "Sega", "Sega Network Taisen Mahjong MJ 3 Evolution (Rev A) (GDX-0021A)", MACHINE_NO_SOUND|MACHINE_NOT_WORKING )
+/* 0021A */ GAME( 2007, mj3evoa, mj3evo, chihirogd, chihiro, chihiro_state, empty_init, ROT0, "Sega", "Sega Network Taisen Mahjong MJ 3 Evolution (Rev A) (GDX-0021A)", MACHINE_NO_SOUND|MACHINE_NOT_WORKING )
/* 0021B */ GAME( 2007, mj3evo, chihiro, chihirogd, chihiro, chihiro_state, empty_init, ROT0, "Sega", "Sega Network Taisen Mahjong MJ 3 Evolution (Rev B) (GDX-0021B)", MACHINE_NO_SOUND|MACHINE_NOT_WORKING )
-// 0022
-// 0023
+// 0022 Taisen Mahjong MJ 3 Evolution Test Version
+// 0023 Firmware Update For MJ 3 Evolution
// 0024 GAME( 2009, ccfboxo, ccfboxa, chihirogd, chihiro, chihiro_state, empty_init, ROT0, "Sega", "Chihiro Firmware Update For Compact Flash Box (GDX-0024)", MACHINE_NO_SOUND|MACHINE_NOT_WORKING )
/* 0024A */ GAME( 2009, ccfboxa, chihiro, chihirogd, chihiro, chihiro_state, empty_init, ROT0, "Sega", "Chihiro Firmware Update For Compact Flash Box (4.01) (GDX-0024A)", MACHINE_NO_SOUND|MACHINE_NOT_WORKING )
+/* 611-xxxx Sega (workshop/factory?) GD-ROMs */
+/* 0028A */ GAME( 2003, cregchg, chihiro, chihirogd, chihiro, chihiro_state, empty_init, ROT0, "Sega", "Chihiro Change Region GD USA (611-0028A)", MACHINE_NO_SOUND|MACHINE_NOT_WORKING )
+
/* CDV-1xxxx (Sega network CD-ROM and DVD-ROM games) */
/* 0005C */ GAME( 2004, questofd, chihiro, chihirogd, chihiro, chihiro_state, empty_init, ROT0, "Sega", "Quest of D (CDV-10005C)", MACHINE_NO_SOUND|MACHINE_NOT_WORKING )
/* 0010 */ GAME( 2005, gundcb79, chihiro, chihirogd, chihiro, chihiro_state, empty_init, ROT0, "Banpresto", "Mobile Suit Gundam 0079 Card Builder (CDV-10010)", MACHINE_NO_SOUND|MACHINE_NOT_WORKING )
diff --git a/src/mame/drivers/chinagat.cpp b/src/mame/drivers/chinagat.cpp
index cee77a87de1..a01a688822c 100644
--- a/src/mame/drivers/chinagat.cpp
+++ b/src/mame/drivers/chinagat.cpp
@@ -574,11 +574,11 @@ void chinagat_state::machine_reset()
void chinagat_state::chinagat(machine_config &config)
{
/* basic machine hardware */
- HD6309(config, m_maincpu, MAIN_CLOCK / 2); /* 1.5 MHz (12MHz oscillator / 4 internally) */
+ HD6309(config, m_maincpu, MAIN_CLOCK / 2); /* 1.5 MHz (12MHz oscillator / 4 internally) */
m_maincpu->set_addrmap(AS_PROGRAM, &chinagat_state::main_map);
TIMER(config, "scantimer").configure_scanline(FUNC(chinagat_state::chinagat_scanline), "screen", 0, 1);
- HD6309(config, m_subcpu, MAIN_CLOCK / 2); /* 1.5 MHz (12MHz oscillator / 4 internally) */
+ HD6309(config, m_subcpu, MAIN_CLOCK / 2); /* 1.5 MHz (12MHz oscillator / 4 internally) */
m_subcpu->set_addrmap(AS_PROGRAM, &chinagat_state::sub_map);
Z80(config, m_soundcpu, XTAL(3'579'545)); /* 3.579545 MHz */
@@ -613,14 +613,14 @@ void chinagat_state::chinagat(machine_config &config)
void chinagat_state::saiyugoub1(machine_config &config)
{
/* basic machine hardware */
- MC6809E(config, m_maincpu, MAIN_CLOCK / 8); /* 68B09EP 1.5 MHz (12MHz oscillator) */
+ MC6809E(config, m_maincpu, MAIN_CLOCK / 8); /* 68B09EP 1.5 MHz (12MHz oscillator) */
m_maincpu->set_addrmap(AS_PROGRAM, &chinagat_state::main_map);
TIMER(config, "scantimer").configure_scanline(FUNC(chinagat_state::chinagat_scanline), "screen", 0, 1);
- MC6809E(config, m_subcpu, MAIN_CLOCK / 8); /* 68B09EP 1.5 MHz (12MHz oscillator) */
+ MC6809E(config, m_subcpu, MAIN_CLOCK / 8); /* 68B09EP 1.5 MHz (12MHz oscillator) */
m_subcpu->set_addrmap(AS_PROGRAM, &chinagat_state::sub_map);
- Z80(config, m_soundcpu, XTAL(3'579'545)); /* 3.579545 MHz oscillator */
+ Z80(config, m_soundcpu, XTAL(3'579'545)); /* 3.579545 MHz oscillator */
m_soundcpu->set_addrmap(AS_PROGRAM, &chinagat_state::saiyugoub1_sound_map);
i8748_device &mcu(I8748(config, "mcu", 9263750)); /* 9.263750 MHz oscillator, divided by 3*5 internally */
@@ -655,21 +655,21 @@ void chinagat_state::saiyugoub1(machine_config &config)
MSM5205(config, m_adpcm, 9263750 / 24);
m_adpcm->vck_legacy_callback().set(FUNC(chinagat_state::saiyugoub1_m5205_irq_w)); /* Interrupt function */
- m_adpcm->set_prescaler_selector(msm5205_device::S64_4B); /* vclk input mode (6030Hz, 4-bit) */
+ m_adpcm->set_prescaler_selector(msm5205_device::S64_4B); /* vclk input mode (6030Hz, 4-bit) */
m_adpcm->add_route(ALL_OUTPUTS, "mono", 0.60);
}
void chinagat_state::saiyugoub2(machine_config &config)
{
/* basic machine hardware */
- MC6809E(config, m_maincpu, MAIN_CLOCK / 8); /* 1.5 MHz (12MHz oscillator) */
+ MC6809E(config, m_maincpu, MAIN_CLOCK / 8); /* 1.5 MHz (12MHz oscillator) */
m_maincpu->set_addrmap(AS_PROGRAM, &chinagat_state::main_map);
TIMER(config, "scantimer").configure_scanline(FUNC(chinagat_state::chinagat_scanline), "screen", 0, 1);
- MC6809E(config, m_subcpu, MAIN_CLOCK / 8); /* 1.5 MHz (12MHz oscillator) */
+ MC6809E(config, m_subcpu, MAIN_CLOCK / 8); /* 1.5 MHz (12MHz oscillator) */
m_subcpu->set_addrmap(AS_PROGRAM, &chinagat_state::sub_map);
- Z80(config, m_soundcpu, XTAL(3'579'545)); /* 3.579545 MHz oscillator */
+ Z80(config, m_soundcpu, XTAL(3'579'545)); /* 3.579545 MHz oscillator */
m_soundcpu->set_addrmap(AS_PROGRAM, &chinagat_state::ym2203c_sound_map);
config.m_minimum_quantum = attotime::from_hz(6000); /* heavy interleaving to sync up sprite<->main cpu's */
diff --git a/src/mame/drivers/chsuper.cpp b/src/mame/drivers/chsuper.cpp
index 786db5fe8ab..e8e4407e7c1 100644
--- a/src/mame/drivers/chsuper.cpp
+++ b/src/mame/drivers/chsuper.cpp
@@ -364,27 +364,27 @@ void chsuper_state::ramdac_map(address_map &map)
* Machine Drivers *
***************************/
-MACHINE_CONFIG_START(chsuper_state::chsuper)
-
+void chsuper_state::chsuper(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z180, XTAL(12'000'000) / 4) /* HD64180RP8, 8 MHz? */
- MCFG_DEVICE_PROGRAM_MAP(chsuper_prg_map)
- MCFG_DEVICE_IO_MAP(chsuper_portmap)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", chsuper_state, irq0_line_hold)
+ Z180(config, m_maincpu, XTAL(12'000'000) / 4); /* HD64180RP8, 8 MHz? */
+ m_maincpu->set_addrmap(AS_PROGRAM, &chsuper_state::chsuper_prg_map);
+ m_maincpu->set_addrmap(AS_IO, &chsuper_state::chsuper_portmap);
+ m_maincpu->set_vblank_int("screen", FUNC(chsuper_state::irq0_line_hold));
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(57)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_UPDATE_DRIVER(chsuper_state, screen_update)
- MCFG_SCREEN_SIZE(64*8, 64*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 48*8-1, 0, 30*8-1)
- MCFG_SCREEN_PALETTE("palette")
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(57);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_screen_update(FUNC(chsuper_state::screen_update));
+ screen.set_size(64*8, 64*8);
+ screen.set_visarea(0*8, 48*8-1, 0, 30*8-1);
+ screen.set_palette(m_palette);
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_chsuper)
- MCFG_PALETTE_ADD("palette", 0x100)
+ GFXDECODE(config, m_gfxdecode, m_palette, gfx_chsuper);
+ PALETTE(config, m_palette).set_entries(0x100);
ramdac_device &ramdac(RAMDAC(config, "ramdac", 0, m_palette));
ramdac.set_addrmap(0, &chsuper_state::ramdac_map);
@@ -392,10 +392,11 @@ MACHINE_CONFIG_START(chsuper_state::chsuper)
/* sound hardware */
SPEAKER(config, "speaker").front_center();
- MCFG_DEVICE_ADD("dac", DAC_8BIT_R2R, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 0.25) // unknown DAC
- MCFG_DEVICE_ADD("vref", VOLTAGE_REGULATOR, 0) MCFG_VOLTAGE_REGULATOR_OUTPUT(5.0)
- MCFG_SOUND_ROUTE(0, "dac", 1.0, DAC_VREF_POS_INPUT) MCFG_SOUND_ROUTE(0, "dac", -1.0, DAC_VREF_NEG_INPUT)
-MACHINE_CONFIG_END
+ DAC_8BIT_R2R(config, "dac", 0).add_route(ALL_OUTPUTS, "speaker", 0.25); // unknown DAC
+ voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref"));
+ vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT);
+ vref.add_route(0, "dac", -1.0, DAC_VREF_NEG_INPUT);
+}
/***************************
diff --git a/src/mame/drivers/cidelsa.cpp b/src/mame/drivers/cidelsa.cpp
index a731271fa6d..7a484d6d181 100644
--- a/src/mame/drivers/cidelsa.cpp
+++ b/src/mame/drivers/cidelsa.cpp
@@ -51,15 +51,15 @@ WRITE8_MEMBER( draco_state::sound_g_w )
switch (data)
{
case 0x01:
- m_psg->data_w(space, 0, m_psg_latch);
+ m_psg->data_w(m_psg_latch);
break;
case 0x02:
- m_psg_latch = m_psg->data_r(space, 0);
+ m_psg_latch = m_psg->data_r();
break;
case 0x03:
- m_psg->address_w(space, 0, m_psg_latch);
+ m_psg->address_w(m_psg_latch);
break;
}
}
diff --git a/src/mame/drivers/circusc.cpp b/src/mame/drivers/circusc.cpp
index 2dc7bbfb542..111971420a4 100644
--- a/src/mame/drivers/circusc.cpp
+++ b/src/mame/drivers/circusc.cpp
@@ -344,11 +344,11 @@ WRITE_LINE_MEMBER(circusc_state::vblank_irq)
m_maincpu->set_input_line(M6809_IRQ_LINE, ASSERT_LINE);
}
-MACHINE_CONFIG_START(circusc_state::circusc)
-
+void circusc_state::circusc(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", KONAMI1, 2048000) /* 2 MHz? */
- MCFG_DEVICE_PROGRAM_MAP(circusc_map)
+ KONAMI1(config, m_maincpu, 2048000); /* 2 MHz? */
+ m_maincpu->set_addrmap(AS_PROGRAM, &circusc_state::circusc_map);
ls259_device &mainlatch(LS259(config, "mainlatch")); // 2C
mainlatch.q_out_cb<0>().set(FUNC(circusc_state::flipscreen_w)); // FLIP
@@ -360,18 +360,18 @@ MACHINE_CONFIG_START(circusc_state::circusc)
WATCHDOG_TIMER(config, "watchdog").set_vblank_count("screen", 8);
- MCFG_DEVICE_ADD("audiocpu", Z80, XTAL(14'318'181)/4)
- MCFG_DEVICE_PROGRAM_MAP(sound_map)
+ Z80(config, m_audiocpu, XTAL(14'318'181)/4);
+ m_audiocpu->set_addrmap(AS_PROGRAM, &circusc_state::sound_map);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(32*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(circusc_state, screen_update_circusc)
- MCFG_SCREEN_PALETTE(m_palette)
- MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE(*this, circusc_state, vblank_irq))
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(32*8, 32*8);
+ screen.set_visarea(0*8, 32*8-1, 2*8, 30*8-1);
+ screen.set_screen_update(FUNC(circusc_state::screen_update_circusc));
+ screen.set_palette(m_palette);
+ screen.screen_vblank().set(FUNC(circusc_state::vblank_irq));
GFXDECODE(config, m_gfxdecode, m_palette, gfx_circusc);
PALETTE(config, m_palette, FUNC(circusc_state::circusc_palette), 16*16 + 16*16, 32);
@@ -381,20 +381,16 @@ MACHINE_CONFIG_START(circusc_state::circusc)
GENERIC_LATCH_8(config, "soundlatch");
- MCFG_DEVICE_ADD("sn1", SN76496, XTAL(14'318'181)/8)
- MCFG_SOUND_ROUTE(0, "fltdisc", 1.0, 0)
+ SN76496(config, m_sn_1, XTAL(14'318'181)/8).add_route(0, "fltdisc", 1.0, 0);
- MCFG_DEVICE_ADD("sn2", SN76496, XTAL(14'318'181)/8)
- MCFG_SOUND_ROUTE(0, "fltdisc", 1.0, 1)
+ SN76496(config, m_sn_2, XTAL(14'318'181)/8).add_route(0, "fltdisc", 1.0, 1);
- MCFG_DEVICE_ADD("dac", DAC_8BIT_R2R, 0) MCFG_SOUND_ROUTE(0, "fltdisc", 1.0, 2) // ls374.7g + r44+r45+r47+r48+r50+r56+r57+r58+r59 (20k) + r46+r49+r51+r52+r53+r54+r55 (10k) + upc324.3h
- MCFG_DEVICE_ADD("vref", VOLTAGE_REGULATOR, 0) MCFG_VOLTAGE_REGULATOR_OUTPUT(5.0)
- MCFG_SOUND_ROUTE(0, "dac", 1.0, DAC_VREF_POS_INPUT)
+ DAC_8BIT_R2R(config, "dac", 0).add_route(0, "fltdisc", 1.0, 2); // ls374.7g + r44+r45+r47+r48+r50+r56+r57+r58+r59 (20k) + r46+r49+r51+r52+r53+r54+r55 (10k) + upc324.3h
+ voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref", 0));
+ vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT);
- MCFG_DEVICE_ADD("fltdisc", DISCRETE, circusc_discrete)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
-
-MACHINE_CONFIG_END
+ DISCRETE(config, m_discrete, circusc_discrete).add_route(ALL_OUTPUTS, "mono", 1.0);
+}
diff --git a/src/mame/drivers/cischeat.cpp b/src/mame/drivers/cischeat.cpp
index 5095e5590df..f3917a6c2a9 100644
--- a/src/mame/drivers/cischeat.cpp
+++ b/src/mame/drivers/cischeat.cpp
@@ -1949,39 +1949,39 @@ WRITE_LINE_MEMBER(cischeat_state::sound_irq)
-MACHINE_CONFIG_START(cischeat_state::bigrun)
-
+void cischeat_state::bigrun(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("cpu1", M68000, 10000000)
- MCFG_DEVICE_PROGRAM_MAP(bigrun_map)
- MCFG_TIMER_DRIVER_ADD_SCANLINE("scantimer", cischeat_state, bigrun_scanline, "screen", 0, 1)
+ M68000(config, m_cpu1, 10000000);
+ m_cpu1->set_addrmap(AS_PROGRAM, &cischeat_state::bigrun_map);
+ TIMER(config, "scantimer").configure_scanline(FUNC(cischeat_state::bigrun_scanline), "screen", 0, 1);
- MCFG_DEVICE_ADD("cpu2", M68000, 10000000)
- MCFG_DEVICE_PROGRAM_MAP(bigrun_map2)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", cischeat_state, irq4_line_hold)
+ M68000(config, m_cpu2, 10000000);
+ m_cpu2->set_addrmap(AS_PROGRAM, &cischeat_state::bigrun_map2);
+ m_cpu2->set_vblank_int("screen", FUNC(cischeat_state::irq4_line_hold));
- MCFG_DEVICE_ADD("cpu3", M68000, 10000000)
- MCFG_DEVICE_PROGRAM_MAP(bigrun_map3)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", cischeat_state, irq4_line_hold)
+ M68000(config, m_cpu3, 10000000);
+ m_cpu3->set_addrmap(AS_PROGRAM, &cischeat_state::bigrun_map3);
+ m_cpu3->set_vblank_int("screen", FUNC(cischeat_state::irq4_line_hold));
- MCFG_DEVICE_ADD("soundcpu", M68000, 6000000)
- MCFG_DEVICE_PROGRAM_MAP(bigrun_sound_map)
+ M68000(config, m_soundcpu, 6000000);
+ m_soundcpu->set_addrmap(AS_PROGRAM, &cischeat_state::bigrun_sound_map);
// timing set by the YM irqhandler
-// MCFG_DEVICE_PERIODIC_INT_DRIVER(cischeat_state, irq4_line_hold, 16*30)
+// m_soundcpu->set_periodic_int(FUNC(cischeat_state::irq4_line_hold), attotime::from_hz(16*30));
- MCFG_QUANTUM_TIME(attotime::from_hz(1200))
+ config.m_minimum_quantum = attotime::from_hz(1200);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_VIDEO_ATTRIBUTES(VIDEO_UPDATE_AFTER_VBLANK)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */)
- MCFG_SCREEN_SIZE(256, 256)
- MCFG_SCREEN_VISIBLE_AREA(0, 256-1, 0+16, 256-16-1)
- MCFG_SCREEN_UPDATE_DRIVER(cischeat_state, screen_update_bigrun)
- MCFG_SCREEN_PALETTE(m_palette)
-
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_bigrun)
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_video_attributes(VIDEO_UPDATE_AFTER_VBLANK);
+ m_screen->set_refresh_hz(60);
+ m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(2500) /* not accurate */);
+ m_screen->set_size(256, 256);
+ m_screen->set_visarea(0, 256-1, 0+16, 256-16-1);
+ m_screen->set_screen_update(FUNC(cischeat_state::screen_update_bigrun));
+ m_screen->set_palette(m_palette);
+
+ GFXDECODE(config, m_gfxdecode, m_palette, gfx_bigrun);
PALETTE(config, m_palette, palette_device::BLACK).set_format(palette_device::RRRRGGGGBBBBRGBx, 0x4000/2);
m_palette->enable_shadows();
@@ -2002,38 +2002,34 @@ MACHINE_CONFIG_START(cischeat_state::bigrun)
ymsnd.add_route(0, "lspeaker", 0.50);
ymsnd.add_route(1, "rspeaker", 0.50);
- MCFG_DEVICE_ADD("oki1", OKIM6295, 4000000, okim6295_device::PIN7_HIGH) // clock frequency & pin 7 not verified
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 0.25)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 0.25)
+ OKIM6295(config, m_oki1, 4000000, okim6295_device::PIN7_HIGH); // clock frequency & pin 7 not verified
+ m_oki1->add_route(ALL_OUTPUTS, "lspeaker", 0.25);
+ m_oki1->add_route(ALL_OUTPUTS, "rspeaker", 0.25);
- MCFG_DEVICE_ADD("oki2", OKIM6295, 4000000, okim6295_device::PIN7_HIGH) // clock frequency & pin 7 not verified
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 0.25)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 0.25)
-MACHINE_CONFIG_END
+ OKIM6295(config, m_oki2, 4000000, okim6295_device::PIN7_HIGH); // clock frequency & pin 7 not verified
+ m_oki2->add_route(ALL_OUTPUTS, "lspeaker", 0.25);
+ m_oki2->add_route(ALL_OUTPUTS, "rspeaker", 0.25);
+}
-MACHINE_CONFIG_START(cischeat_state::cischeat)
+void cischeat_state::cischeat(machine_config &config)
+{
bigrun(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("cpu1")
- MCFG_DEVICE_PROGRAM_MAP(cischeat_map)
+ m_cpu1->set_addrmap(AS_PROGRAM, &cischeat_state::cischeat_map);
- MCFG_DEVICE_MODIFY("cpu2")
- MCFG_DEVICE_PROGRAM_MAP(cischeat_map2)
+ m_cpu2->set_addrmap(AS_PROGRAM, &cischeat_state::cischeat_map2);
- MCFG_DEVICE_MODIFY("cpu3")
- MCFG_DEVICE_PROGRAM_MAP(cischeat_map3)
+ m_cpu3->set_addrmap(AS_PROGRAM, &cischeat_state::cischeat_map3);
- MCFG_DEVICE_MODIFY("soundcpu")
- MCFG_DEVICE_PROGRAM_MAP(cischeat_sound_map)
+ m_soundcpu->set_addrmap(AS_PROGRAM, &cischeat_state::cischeat_sound_map);
/* video hardware */
- MCFG_SCREEN_MODIFY("screen")
- MCFG_SCREEN_VISIBLE_AREA(0, 256-1, 0+16, 256-16-8-1)
- MCFG_SCREEN_UPDATE_DRIVER(cischeat_state, screen_update_cischeat)
+ m_screen->set_visarea(0, 256-1, 0+16, 256-16-8-1);
+ m_screen->set_screen_update(FUNC(cischeat_state::screen_update_cischeat));
- MCFG_GFXDECODE_MODIFY("gfxdecode", gfx_cischeat)
+ m_gfxdecode->set_info(gfx_cischeat);
m_palette->set_format(palette_device::RRRRGGGGBBBBRGBx, 0x8000/2);
m_tmap[0]->set_colorbase(0x1c00/2);
@@ -2044,30 +2040,27 @@ MACHINE_CONFIG_START(cischeat_state::cischeat)
m_tmap[2]->set_colorbase(0x6c00/2);
m_tmap[2]->set_bits_per_color_code(5);
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(cischeat_state::f1gpstar)
+void cischeat_state::f1gpstar(machine_config &config)
+{
bigrun(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("cpu1")
- MCFG_DEVICE_CLOCK(12000000)
- MCFG_DEVICE_PROGRAM_MAP(f1gpstar_map)
+ m_cpu1->set_clock(12000000);
+ m_cpu1->set_addrmap(AS_PROGRAM, &cischeat_state::f1gpstar_map);
- MCFG_DEVICE_MODIFY("cpu2")
- MCFG_DEVICE_CLOCK(12000000)
- MCFG_DEVICE_PROGRAM_MAP(f1gpstar_map2)
+ m_cpu2->set_clock(12000000);
+ m_cpu2->set_addrmap(AS_PROGRAM, &cischeat_state::f1gpstar_map2);
- MCFG_DEVICE_MODIFY("cpu3")
- MCFG_DEVICE_CLOCK(12000000)
- MCFG_DEVICE_PROGRAM_MAP(f1gpstar_map3)
+ m_cpu3->set_clock(12000000);
+ m_cpu3->set_addrmap(AS_PROGRAM, &cischeat_state::f1gpstar_map3);
- MCFG_DEVICE_MODIFY("soundcpu")
- MCFG_DEVICE_PROGRAM_MAP(f1gpstar_sound_map)
+ m_soundcpu->set_addrmap(AS_PROGRAM, &cischeat_state::f1gpstar_sound_map);
/* video hardware */
- MCFG_GFXDECODE_MODIFY("gfxdecode", gfx_f1gpstar)
+ m_gfxdecode->set_info(gfx_f1gpstar);
m_palette->set_format(palette_device::RRRRGGGGBBBBRGBx, 0x8000/2);
m_tmap[0]->set_colorbase(0x1e00/2);
@@ -2076,34 +2069,32 @@ MACHINE_CONFIG_START(cischeat_state::f1gpstar)
m_tmap[2]->set_colorbase(0x6e00/2);
- MCFG_SCREEN_MODIFY("screen")
- MCFG_SCREEN_UPDATE_DRIVER(cischeat_state, screen_update_f1gpstar)
-MACHINE_CONFIG_END
+ m_screen->set_screen_update(FUNC(cischeat_state::screen_update_f1gpstar));
+}
-MACHINE_CONFIG_START(cischeat_state::f1gpstr2)
+void cischeat_state::f1gpstr2(machine_config &config)
+{
f1gpstar(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("cpu1")
- MCFG_DEVICE_PROGRAM_MAP(f1gpstr2_map)
+ m_cpu1->set_addrmap(AS_PROGRAM, &cischeat_state::f1gpstr2_map);
- MCFG_DEVICE_MODIFY("soundcpu")
- MCFG_DEVICE_PROGRAM_MAP(f1gpstr2_sound_map)
+ m_soundcpu->set_addrmap(AS_PROGRAM, &cischeat_state::f1gpstr2_sound_map);
- MCFG_DEVICE_ADD("cpu5", M68000, 10000000)
- MCFG_DEVICE_PROGRAM_MAP(f1gpstr2_io_map)
+ M68000(config, m_cpu5, 10000000);
+ m_cpu5->set_addrmap(AS_PROGRAM, &cischeat_state::f1gpstr2_io_map);
- MCFG_QUANTUM_TIME(attotime::from_hz(12000))
-MACHINE_CONFIG_END
+ config.m_minimum_quantum = attotime::from_hz(12000);
+}
-MACHINE_CONFIG_START(wildplt_state::wildplt)
+void wildplt_state::wildplt(machine_config &config)
+{
f1gpstr2(config);
- MCFG_DEVICE_MODIFY("cpu1")
- MCFG_DEVICE_PROGRAM_MAP(wildplt_map)
-MACHINE_CONFIG_END
+ m_cpu1->set_addrmap(AS_PROGRAM, &wildplt_state::wildplt_map);
+}
/**************************************************************************
@@ -2128,26 +2119,26 @@ TIMER_DEVICE_CALLBACK_MEMBER(cischeat_state::scudhamm_scanline)
m_maincpu->set_input_line(2, HOLD_LINE);
}
-MACHINE_CONFIG_START(cischeat_state::scudhamm)
-
+void cischeat_state::scudhamm(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu",M68000, 12000000)
- MCFG_DEVICE_PROGRAM_MAP(scudhamm_map)
- MCFG_TIMER_DRIVER_ADD_SCANLINE("scantimer", cischeat_state, scudhamm_scanline, "screen", 0, 1)
+ M68000(config, m_maincpu, 12000000);
+ m_maincpu->set_addrmap(AS_PROGRAM, &cischeat_state::scudhamm_map);
+ TIMER(config, "scantimer").configure_scanline(FUNC(cischeat_state::scudhamm_scanline), "screen", 0, 1);
WATCHDOG_TIMER(config, m_watchdog);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_VIDEO_ATTRIBUTES(VIDEO_UPDATE_AFTER_VBLANK)
- MCFG_SCREEN_REFRESH_RATE(30) //TODO: wrong!
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500 * 3) /* not accurate */)
- MCFG_SCREEN_SIZE(256, 256)
- MCFG_SCREEN_VISIBLE_AREA(0, 256-1, 0 +16, 256-1 -16)
- MCFG_SCREEN_UPDATE_DRIVER(cischeat_state, screen_update_scudhamm)
- MCFG_SCREEN_PALETTE(m_palette)
-
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_scudhamm)
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_video_attributes(VIDEO_UPDATE_AFTER_VBLANK);
+ m_screen->set_refresh_hz(30); //TODO: wrong!
+ m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(2500 * 3) /* not accurate */);
+ m_screen->set_size(256, 256);
+ m_screen->set_visarea(0, 256-1, 0 +16, 256-1 -16);
+ m_screen->set_screen_update(FUNC(cischeat_state::screen_update_scudhamm));
+ m_screen->set_palette(m_palette);
+
+ GFXDECODE(config, m_gfxdecode, m_palette, gfx_scudhamm);
PALETTE(config, m_palette, palette_device::BLACK).set_format(palette_device::RRRRGGGGBBBBRGBx, 0x8000/2);
m_palette->enable_shadows();
@@ -2158,14 +2149,14 @@ MACHINE_CONFIG_START(cischeat_state::scudhamm)
SPEAKER(config, "lspeaker").front_left();
SPEAKER(config, "rspeaker").front_right();
- MCFG_DEVICE_ADD("oki1", OKIM6295, 4000000/2, okim6295_device::PIN7_HIGH) // pin 7 not verified
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 0.5)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 0.5)
+ OKIM6295(config, m_oki1, 4000000/2, okim6295_device::PIN7_HIGH); // pin 7 not verified
+ m_oki1->add_route(ALL_OUTPUTS, "lspeaker", 0.5);
+ m_oki1->add_route(ALL_OUTPUTS, "rspeaker", 0.5);
- MCFG_DEVICE_ADD("oki2", OKIM6295, 4000000/2, okim6295_device::PIN7_HIGH) // pin 7 not verified
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 0.5)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 0.5)
-MACHINE_CONFIG_END
+ OKIM6295(config, m_oki2, 4000000/2, okim6295_device::PIN7_HIGH); // pin 7 not verified
+ m_oki2->add_route(ALL_OUTPUTS, "lspeaker", 0.5);
+ m_oki2->add_route(ALL_OUTPUTS, "rspeaker", 0.5);
+}
/**************************************************************************
@@ -2183,15 +2174,14 @@ TIMER_DEVICE_CALLBACK_MEMBER(cischeat_state::armchamp2_scanline)
m_maincpu->set_input_line(4, HOLD_LINE);
}
-MACHINE_CONFIG_START(cischeat_state::armchmp2)
+void cischeat_state::armchmp2(machine_config &config)
+{
scudhamm(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(armchmp2_map)
- MCFG_TIMER_MODIFY("scantimer")
- MCFG_TIMER_DRIVER_CALLBACK(cischeat_state, armchamp2_scanline)
-MACHINE_CONFIG_END
+ m_maincpu->set_addrmap(AS_PROGRAM, &cischeat_state::armchmp2_map);
+ subdevice<timer_device>("scantimer")->set_callback(FUNC(cischeat_state::armchamp2_scanline));
+}
/**************************************************************************
@@ -2216,29 +2206,29 @@ TIMER_DEVICE_CALLBACK_MEMBER(cischeat_state::captflag_scanline)
m_maincpu->set_input_line(3, HOLD_LINE);
}
-MACHINE_CONFIG_START(cischeat_state::captflag)
-
+void cischeat_state::captflag(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu",M68000, XTAL(24'000'000) / 2) // TMP68000P-12
- MCFG_DEVICE_PROGRAM_MAP(captflag_map)
- MCFG_TIMER_DRIVER_ADD_SCANLINE("scantimer", cischeat_state, captflag_scanline, "screen", 0, 1)
+ M68000(config, m_maincpu, XTAL(24'000'000) / 2); // TMP68000P-12
+ m_maincpu->set_addrmap(AS_PROGRAM, &cischeat_state::captflag_map);
+ TIMER(config, "scantimer").configure_scanline(FUNC(cischeat_state::captflag_scanline), "screen", 0, 1);
- MCFG_TICKET_DISPENSER_ADD("hopper", attotime::from_msec(2000), TICKET_MOTOR_ACTIVE_HIGH, TICKET_STATUS_ACTIVE_HIGH )
+ TICKET_DISPENSER(config, m_captflag_hopper, attotime::from_msec(2000), TICKET_MOTOR_ACTIVE_HIGH, TICKET_STATUS_ACTIVE_HIGH );
WATCHDOG_TIMER(config, m_watchdog);
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
-// MCFG_SCREEN_VIDEO_ATTRIBUTES(VIDEO_UPDATE_AFTER_VBLANK)
- MCFG_SCREEN_REFRESH_RATE(30) //TODO: wrong!
-// MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500 * 3) /* not accurate */)
- MCFG_SCREEN_SIZE(256, 256)
- MCFG_SCREEN_VISIBLE_AREA(0, 256-1, 0 +16, 256-1 -16)
- MCFG_SCREEN_UPDATE_DRIVER(cischeat_state, screen_update_scudhamm)
- MCFG_SCREEN_PALETTE("palette")
-
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_scudhamm)
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+// m_screen->set_video_attributes(VIDEO_UPDATE_AFTER_VBLANK);
+ m_screen->set_refresh_hz(30); //TODO: wrong!
+// m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(2500 * 3) /* not accurate */);
+ m_screen->set_size(256, 256);
+ m_screen->set_visarea(0, 256-1, 0 +16, 256-1 -16);
+ m_screen->set_screen_update(FUNC(cischeat_state::screen_update_scudhamm));
+ m_screen->set_palette(m_palette);
+
+ GFXDECODE(config, m_gfxdecode, m_palette, gfx_scudhamm);
PALETTE(config, m_palette, palette_device::BLACK).set_format(palette_device::RRRRGGGGBBBBRGBx, 0x8000/2);
m_palette->enable_shadows();
@@ -2246,8 +2236,8 @@ MACHINE_CONFIG_START(cischeat_state::captflag)
MEGASYS1_TILEMAP(config, m_tmap[2], m_palette, 0x4e00/2);
// Motors
- MCFG_TIMER_ADD_NONE("motor_left")
- MCFG_TIMER_ADD_NONE("motor_right")
+ TIMER(config, m_captflag_motor_left).configure_generic(timer_device::expired_delegate());
+ TIMER(config, m_captflag_motor_right).configure_generic(timer_device::expired_delegate());
// Layout
config.set_default_layout(layout_captflag);
@@ -2256,16 +2246,16 @@ MACHINE_CONFIG_START(cischeat_state::captflag)
SPEAKER(config, "lspeaker").front_left();
SPEAKER(config, "rspeaker").front_right();
- MCFG_DEVICE_ADD("oki1", OKIM6295, 4000000/2, okim6295_device::PIN7_HIGH) // pin 7 not verified
- MCFG_DEVICE_ADDRESS_MAP(0, captflag_oki1_map)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 0.5)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 0.5)
+ OKIM6295(config, m_oki1, 4000000/2, okim6295_device::PIN7_HIGH); // pin 7 not verified
+ m_oki1->set_addrmap(0, &cischeat_state::captflag_oki1_map);
+ m_oki1->add_route(ALL_OUTPUTS, "lspeaker", 0.5);
+ m_oki1->add_route(ALL_OUTPUTS, "rspeaker", 0.5);
- MCFG_DEVICE_ADD("oki2", OKIM6295, 4000000/2, okim6295_device::PIN7_HIGH) // pin 7 not verified
- MCFG_DEVICE_ADDRESS_MAP(0, captflag_oki2_map)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 0.5)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 0.5)
-MACHINE_CONFIG_END
+ OKIM6295(config, m_oki2, 4000000/2, okim6295_device::PIN7_HIGH); // pin 7 not verified
+ m_oki2->set_addrmap(0, &cischeat_state::captflag_oki2_map);
+ m_oki2->add_route(ALL_OUTPUTS, "lspeaker", 0.5);
+ m_oki2->add_route(ALL_OUTPUTS, "rspeaker", 0.5);
+}
/***************************************************************************
diff --git a/src/mame/drivers/citycon.cpp b/src/mame/drivers/citycon.cpp
index 307978e89dc..47ea952a56e 100644
--- a/src/mame/drivers/citycon.cpp
+++ b/src/mame/drivers/citycon.cpp
@@ -198,24 +198,24 @@ void citycon_state::machine_reset()
}
-MACHINE_CONFIG_START(citycon_state::citycon)
-
+void citycon_state::citycon(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", MC6809, CPU_CLOCK) // HD68B09P
- MCFG_DEVICE_PROGRAM_MAP(citycon_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", citycon_state, irq0_line_assert)
+ MC6809(config, m_maincpu, CPU_CLOCK); // HD68B09P
+ m_maincpu->set_addrmap(AS_PROGRAM, &citycon_state::citycon_map);
+ m_maincpu->set_vblank_int("screen", FUNC(citycon_state::irq0_line_assert));
- MCFG_DEVICE_ADD("audiocpu", MC6809E, MASTER_CLOCK / 32) // schematics allow for either a 6809 or 6809E; HD68A09EP found on one actual PCB
- MCFG_DEVICE_PROGRAM_MAP(sound_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", citycon_state, irq0_line_hold) // actually unused, probably it was during development
+ mc6809e_device &audiocpu(MC6809E(config, "audiocpu", MASTER_CLOCK / 32)); // schematics allow for either a 6809 or 6809E; HD68A09EP found on one actual PCB
+ audiocpu.set_addrmap(AS_PROGRAM, &citycon_state::sound_map);
+ audiocpu.set_vblank_int("screen", FUNC(citycon_state::irq0_line_hold)); // actually unused, probably it was during development
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_RAW_PARAMS(PIXEL_CLOCK, HTOTAL, HBEND, HBSTART, VTOTAL, VBEND, VBSTART)
- MCFG_SCREEN_UPDATE_DRIVER(citycon_state, screen_update_citycon)
- MCFG_SCREEN_PALETTE(m_palette)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_raw(PIXEL_CLOCK, HTOTAL, HBEND, HBSTART, VTOTAL, VBEND, VBSTART);
+ screen.set_screen_update(FUNC(citycon_state::screen_update_citycon));
+ screen.set_palette(m_palette);
- MCFG_DEVICE_ADD(m_gfxdecode, GFXDECODE, m_palette, gfx_citycon)
+ GFXDECODE(config, m_gfxdecode, m_palette, gfx_citycon);
PALETTE(config, m_palette, palette_device::BLACK).set_format(palette_device::RGBx_444, 640+1024); // 640 real palette + 1024 virtual palette
/* sound hardware */
@@ -233,7 +233,7 @@ MACHINE_CONFIG_START(citycon_state::citycon)
ymsnd.add_route(1, "mono", 0.40);
ymsnd.add_route(2, "mono", 0.40);
ymsnd.add_route(3, "mono", 0.20);
-MACHINE_CONFIG_END
+}
diff --git a/src/mame/drivers/cking_master.cpp b/src/mame/drivers/cking_master.cpp
new file mode 100644
index 00000000000..3de15ba8803
--- /dev/null
+++ b/src/mame/drivers/cking_master.cpp
@@ -0,0 +1,239 @@
+// license:BSD-3-Clause
+// copyright-holders:hap
+// thanks-to:Berger
+/******************************************************************************
+*
+* cking_master.cpp, subdriver of machine/chessbase.cpp
+
+TODO:
+- 1 WAIT CLK per M1, workaround with z80_set_cycle_tables is possible
+ (wait state is similar to MSX) but I can't be bothered, better solution
+ is to add M1 pin to the z80 core. Until then, it'll run ~20% too fast.
+
+*******************************************************************************
+
+Chess King Master overview (yes, it's plainly named "Master"):
+- Z80 CPU(NEC D780C-1) @ 4MHz(8MHz XTAL), IRQ from 555 timer
+- 8KB ROM(NEC D2764C-3), 2KB RAM(NEC D4016C), ROM is scrambled for easy PCB placement
+- simple I/O via 2*74373 and a 74145
+- 8*8 chessboard buttons, 32+1 border leds, piezo
+
+******************************************************************************/
+
+#include "emu.h"
+#include "includes/chessbase.h"
+
+#include "cpu/z80/z80.h"
+#include "machine/bankdev.h"
+#include "sound/dac.h"
+#include "sound/volt_reg.h"
+#include "speaker.h"
+
+// internal artwork
+#include "ck_master.lh" // clickable
+
+
+namespace {
+
+class master_state : public chessbase_state
+{
+public:
+ master_state(const machine_config &mconfig, device_type type, const char *tag) :
+ chessbase_state(mconfig, type, tag),
+ m_maincpu(*this, "maincpu"),
+ m_irq_on(*this, "irq_on"),
+ m_dac(*this, "dac"),
+ m_mainmap(*this, "mainmap")
+ { }
+
+ // machine drivers
+ void master(machine_config &config);
+
+ void init_master();
+
+private:
+ // devices/pointers
+ required_device<cpu_device> m_maincpu;
+ required_device<timer_device> m_irq_on;
+ required_device<dac_2bit_binary_weighted_ones_complement_device> m_dac;
+ required_device<address_map_bank_device> m_mainmap;
+
+ // periodic interrupts
+ template<int Line> TIMER_DEVICE_CALLBACK_MEMBER(irq_on) { m_maincpu->set_input_line(Line, ASSERT_LINE); }
+ template<int Line> TIMER_DEVICE_CALLBACK_MEMBER(irq_off) { m_maincpu->set_input_line(Line, CLEAR_LINE); }
+
+ // address maps
+ void main_map(address_map &map);
+ void main_trampoline(address_map &map);
+ u8 main_trampoline_r(offs_t offset);
+ void main_trampoline_w(offs_t offset, u8 data);
+
+ // I/O handlers
+ u8 input_r();
+ void control_w(u8 data);
+};
+
+
+
+/******************************************************************************
+ Devices, I/O
+******************************************************************************/
+
+// TTL/generic
+
+void master_state::control_w(u8 data)
+{
+ // d0-d3: 74145 A-D
+ // 74145 0-9: input mux, led select
+ u16 sel = 1 << (data & 0xf) & 0x3ff;
+ m_inp_mux = sel;
+
+ // d4,d5: led data
+ display_matrix(2, 9, data >> 4 & 3, sel & 0x1ff);
+
+ // d6,d7: speaker +/-
+ m_dac->write(data >> 6 & 3);
+}
+
+u8 master_state::input_r()
+{
+ // d0-d7: multiplexed inputs (active low)
+ return ~read_inputs(10);
+}
+
+void master_state::init_master()
+{
+ u8 *rom = memregion("maincpu")->base();
+ const u32 len = memregion("maincpu")->bytes();
+
+ // descramble data lines
+ for (int i = 0; i < len; i++)
+ rom[i] = bitswap<8>(rom[i], 4,5,0,7,6,1,3,2);
+
+ // descramble address lines
+ std::vector<u8> buf(len);
+ memcpy(&buf[0], rom, len);
+ for (int i = 0; i < len; i++)
+ rom[i] = buf[bitswap<16>(i, 15,14,13,12,11,3,7,9, 10,8,6,5,4,2,1,0)];
+}
+
+
+
+/******************************************************************************
+ Address Maps
+******************************************************************************/
+
+void master_state::main_map(address_map &map)
+{
+ map(0x0000, 0x1fff).mirror(0x6000).rom().region("maincpu", 0); // _A15
+ map(0xa000, 0xa000).mirror(0x1fff).rw(FUNC(master_state::input_r), FUNC(master_state::control_w)); // A13
+ map(0xc000, 0xc7ff).mirror(0x3800).ram(); // A14
+}
+
+// PCB design is prone to bus conflicts, but should be fine if software obeys
+void master_state::main_trampoline_w(offs_t offset, u8 data)
+{
+ if (offset & 0x2000)
+ m_mainmap->write8((offset & 0x3fff) | 0x8000, data);
+ if (offset & 0x4000)
+ m_mainmap->write8((offset & 0x7fff) | 0x8000, data);
+}
+
+u8 master_state::main_trampoline_r(offs_t offset)
+{
+ u8 data = 0xff;
+ if (~offset & 0x8000)
+ data &= m_mainmap->read8(offset);
+ if (offset & 0x2000)
+ data &= m_mainmap->read8((offset & 0x3fff) | 0x8000);
+ if (offset & 0x4000)
+ data &= m_mainmap->read8((offset & 0x7fff) | 0x8000);
+
+ return data;
+}
+
+void master_state::main_trampoline(address_map &map)
+{
+ map(0x0000, 0xffff).rw(FUNC(master_state::main_trampoline_r), FUNC(master_state::main_trampoline_w));
+}
+
+
+
+/******************************************************************************
+ Input Ports
+******************************************************************************/
+
+static INPUT_PORTS_START( master )
+ PORT_INCLUDE( generic_cb_buttons )
+
+ PORT_START("IN.8")
+ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_1) PORT_NAME("Change Position")
+ PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_2) PORT_NAME("Clear Board")
+ PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_3) PORT_NAME("New Game")
+ PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_4) PORT_NAME("Take Back")
+ PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_5) PORT_NAME("King")
+ PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_6) PORT_NAME("Queen")
+ PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_7) PORT_NAME("Rook")
+ PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_UNUSED)
+
+ PORT_START("IN.9")
+ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_8) PORT_NAME("Bishop")
+ PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_9) PORT_NAME("Knight")
+ PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_0) PORT_NAME("Pawn")
+ PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_Q) PORT_NAME("White")
+ PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_W) PORT_NAME("Black")
+ PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_E) PORT_NAME("Move")
+ PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_R) PORT_NAME("Level")
+ PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_T) PORT_NAME("Sound")
+INPUT_PORTS_END
+
+
+
+/******************************************************************************
+ Machine Drivers
+******************************************************************************/
+
+void master_state::master(machine_config &config)
+{
+ /* basic machine hardware */
+ Z80(config, m_maincpu, 8_MHz_XTAL/2);
+ m_maincpu->set_addrmap(AS_PROGRAM, &master_state::main_trampoline);
+ ADDRESS_MAP_BANK(config, "mainmap").set_map(&master_state::main_map).set_options(ENDIANNESS_LITTLE, 8, 16);
+
+ const attotime irq_period = attotime::from_hz(429); // theoretical frequency from 555 timer (22nF, 150K, 1K5), measurement was 418Hz
+ TIMER(config, m_irq_on).configure_periodic(FUNC(master_state::irq_on<INPUT_LINE_IRQ0>), irq_period);
+ m_irq_on->set_start_delay(irq_period - attotime::from_nsec(22870)); // active for 22.87us
+ TIMER(config, "irq_off").configure_periodic(FUNC(master_state::irq_off<INPUT_LINE_IRQ0>), irq_period);
+
+ TIMER(config, "display_decay").configure_periodic(FUNC(master_state::display_decay_tick), attotime::from_msec(1));
+ config.set_default_layout(layout_ck_master);
+
+ /* sound hardware */
+ SPEAKER(config, "speaker").front_center();
+ DAC_2BIT_BINARY_WEIGHTED_ONES_COMPLEMENT(config, m_dac).add_route(ALL_OUTPUTS, "speaker", 0.25);
+ voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref"));
+ vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT);
+ vref.add_route(0, "dac", -1.0, DAC_VREF_NEG_INPUT);
+}
+
+
+
+/******************************************************************************
+ ROM Definitions
+******************************************************************************/
+
+ROM_START( ckmaster )
+ ROM_REGION( 0x10000, "maincpu", 0 )
+ ROM_LOAD("ckmaster.ic2", 0x0000, 0x2000, CRC(59cbec9e) SHA1(2e0629e65778da62bed857406b91a334698d2fe8) ) // D2764C, no label
+ROM_END
+
+} // anonymous namespace
+
+
+
+/******************************************************************************
+ Drivers
+******************************************************************************/
+
+/* YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS */
+CONS( 1984, ckmaster, 0, 0, master, master, master_state, init_master, "Chess King", "Master (Chess King)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
diff --git a/src/mame/drivers/ckz80.cpp b/src/mame/drivers/ckz80.cpp
deleted file mode 100644
index 7e087426c20..00000000000
--- a/src/mame/drivers/ckz80.cpp
+++ /dev/null
@@ -1,473 +0,0 @@
-// license:BSD-3-Clause
-// copyright-holders:hap
-// thanks-to:Berger
-/******************************************************************************
-
- Chess King generic Z80 based chess computer driver
-
- NOTE: MAME doesn't include a generalized implementation for boardpieces yet,
- greatly affecting user playability of emulated electronic board games.
- As workaround for the chess games, use an external chess GUI on the side,
- such as Arena(in editmode).
-
- TODO:
- - ckmaster 1 WAIT CLK per M1, workaround with z80_set_cycle_tables is possible
- (wait state is similar to MSX) but I can't be bothered, better solution
- is to add M1 pin to the z80 core. Until then, it'll run ~20% too fast.
-
-******************************************************************************
-
-Master:
-- Z80 CPU(NEC D780C-1) @ 4MHz(8MHz XTAL), IRQ from 555 timer
-- 8KB ROM(NEC D2764C-3), 2KB RAM(NEC D4016C), ROM is scrambled for easy PCB placement
-- simple I/O via 2*74373 and a 74145
-- 8*8 chessboard buttons, 32+1 border leds, piezo
-
-******************************************************************************/
-
-#include "emu.h"
-#include "cpu/z80/z80.h"
-#include "machine/timer.h"
-#include "machine/bankdev.h"
-#include "sound/dac.h"
-#include "sound/volt_reg.h"
-#include "speaker.h"
-
-// internal artwork
-#include "ck_master.lh" // clickable
-
-
-class ckz80_state : public driver_device
-{
-public:
- ckz80_state(const machine_config &mconfig, device_type type, const char *tag)
- : driver_device(mconfig, type, tag),
- m_maincpu(*this, "maincpu"),
- m_dac(*this, "dac"),
- m_master_map(*this, "master_map"),
- m_inp_matrix(*this, "IN.%u", 0),
- m_out_x(*this, "%u.%u", 0U, 0U),
- m_out_a(*this, "%u.a", 0U),
- m_out_digit(*this, "digit%u", 0U),
- m_display_wait(33),
- m_display_maxy(1),
- m_display_maxx(0)
- { }
-
- // devices/pointers
- required_device<cpu_device> m_maincpu;
- required_device<dac_2bit_binary_weighted_ones_complement_device> m_dac;
- optional_device<address_map_bank_device> m_master_map;
- optional_ioport_array<10> m_inp_matrix; // max 10
- output_finder<0x20, 0x20> m_out_x;
- output_finder<0x20> m_out_a;
- output_finder<0x20> m_out_digit;
-
- TIMER_DEVICE_CALLBACK_MEMBER(irq_on) { m_maincpu->set_input_line(INPUT_LINE_IRQ0, ASSERT_LINE); }
- TIMER_DEVICE_CALLBACK_MEMBER(irq_off) { m_maincpu->set_input_line(INPUT_LINE_IRQ0, CLEAR_LINE); }
-
- // misc common
- u16 m_inp_mux; // multiplexed keypad mask
- u16 m_led_select;
- u16 m_led_data;
-
- u16 read_inputs(int columns);
-
- // display common
- int m_display_wait; // led/lamp off-delay in milliseconds (default 33ms)
- int m_display_maxy; // display matrix number of rows
- int m_display_maxx; // display matrix number of columns (max 31 for now)
-
- u32 m_display_state[0x20]; // display matrix rows data (last bit is used for always-on)
- u16 m_display_segmask[0x20]; // if not 0, display matrix row is a digit, mask indicates connected segments
- u8 m_display_decay[0x20][0x20]; // (internal use)
-
- TIMER_DEVICE_CALLBACK_MEMBER(display_decay_tick);
- void display_update();
- void set_display_size(int maxx, int maxy);
- void display_matrix(int maxx, int maxy, u32 setx, u32 sety, bool update = true);
-
- // Master
- DECLARE_READ8_MEMBER(master_input_r);
- DECLARE_WRITE8_MEMBER(master_control_w);
- void init_master();
- DECLARE_READ8_MEMBER(master_trampoline_r);
- DECLARE_WRITE8_MEMBER(master_trampoline_w);
- void master_map(address_map &map);
- void master_trampoline(address_map &map);
- void master(machine_config &config);
-
-protected:
- virtual void machine_start() override;
- virtual void machine_reset() override;
-};
-
-
-// machine start/reset
-
-void ckz80_state::machine_start()
-{
- // resolve handlers
- m_out_x.resolve();
- m_out_a.resolve();
- m_out_digit.resolve();
-
- // zerofill
- memset(m_display_state, 0, sizeof(m_display_state));
- memset(m_display_decay, 0, sizeof(m_display_decay));
- memset(m_display_segmask, 0, sizeof(m_display_segmask));
-
- m_inp_mux = 0;
- m_led_select = 0;
- m_led_data = 0;
-
- // register for savestates
- save_item(NAME(m_display_maxy));
- save_item(NAME(m_display_maxx));
- save_item(NAME(m_display_wait));
-
- save_item(NAME(m_display_state));
- save_item(NAME(m_display_decay));
- save_item(NAME(m_display_segmask));
-
- save_item(NAME(m_inp_mux));
- save_item(NAME(m_led_select));
- save_item(NAME(m_led_data));
-}
-
-void ckz80_state::machine_reset()
-{
-}
-
-
-
-/***************************************************************************
-
- Helper Functions
-
-***************************************************************************/
-
-// The device may strobe the outputs very fast, it is unnoticeable to the user.
-// To prevent flickering here, we need to simulate a decay.
-
-void ckz80_state::display_update()
-{
- for (int y = 0; y < m_display_maxy; y++)
- {
- u32 active_state = 0;
-
- for (int x = 0; x <= m_display_maxx; x++)
- {
- // turn on powered segments
- if (m_display_state[y] >> x & 1)
- m_display_decay[y][x] = m_display_wait;
-
- // determine active state
- u32 ds = (m_display_decay[y][x] != 0) ? 1 : 0;
- active_state |= (ds << x);
-
- // output to y.x, or y.a when always-on
- if (x != m_display_maxx)
- m_out_x[y][x] = ds;
- else
- m_out_a[y] = ds;
- }
-
- // output to digity
- if (m_display_segmask[y] != 0)
- m_out_digit[y] = active_state & m_display_segmask[y];
- }
-}
-
-TIMER_DEVICE_CALLBACK_MEMBER(ckz80_state::display_decay_tick)
-{
- // slowly turn off unpowered segments
- for (int y = 0; y < m_display_maxy; y++)
- for (int x = 0; x <= m_display_maxx; x++)
- if (m_display_decay[y][x] != 0)
- m_display_decay[y][x]--;
-
- display_update();
-}
-
-void ckz80_state::set_display_size(int maxx, int maxy)
-{
- m_display_maxx = maxx;
- m_display_maxy = maxy;
-}
-
-void ckz80_state::display_matrix(int maxx, int maxy, u32 setx, u32 sety, bool update)
-{
- set_display_size(maxx, maxy);
-
- // update current state
- u32 mask = (1 << maxx) - 1;
- for (int y = 0; y < maxy; y++)
- m_display_state[y] = (sety >> y & 1) ? ((setx & mask) | (1 << maxx)) : 0;
-
- if (update)
- display_update();
-}
-
-
-// generic input handlers
-
-u16 ckz80_state::read_inputs(int columns)
-{
- u16 ret = 0;
-
- // read selected input rows
- for (int i = 0; i < columns; i++)
- if (m_inp_mux >> i & 1)
- ret |= m_inp_matrix[i]->read();
-
- return ret;
-}
-
-
-
-// Devices, I/O
-
-/******************************************************************************
- Master
-******************************************************************************/
-
-// TTL/generic
-
-WRITE8_MEMBER(ckz80_state::master_control_w)
-{
- // d0-d3: 74145 A-D
- // 74145 0-9: input mux, led select
- u16 sel = 1 << (data & 0xf) & 0x3ff;
- m_inp_mux = sel;
-
- // d4,d5: led data
- display_matrix(2, 9, data >> 4 & 3, sel & 0x1ff);
-
- // d6,d7: speaker +/-
- m_dac->write(data >> 6 & 3);
-}
-
-READ8_MEMBER(ckz80_state::master_input_r)
-{
- // d0-d7: multiplexed inputs (active low)
- return ~read_inputs(10);
-}
-
-void ckz80_state::init_master()
-{
- u8 *rom = memregion("maincpu")->base();
- const u32 len = memregion("maincpu")->bytes();
-
- // descramble data lines
- for (int i = 0; i < len; i++)
- rom[i] = bitswap<8>(rom[i], 4,5,0,7,6,1,3,2);
-
- // descramble address lines
- std::vector<u8> buf(len);
- memcpy(&buf[0], rom, len);
- for (int i = 0; i < len; i++)
- rom[i] = buf[bitswap<16>(i, 15,14,13,12,11,3,7,9, 10,8,6,5,4,2,1,0)];
-}
-
-
-
-/******************************************************************************
- Address Maps
-******************************************************************************/
-
-// Master
-
-void ckz80_state::master_map(address_map &map)
-{
- map(0x0000, 0x1fff).mirror(0x6000).rom().region("maincpu", 0); // _A15
- map(0xa000, 0xa000).mirror(0x1fff).rw(FUNC(ckz80_state::master_input_r), FUNC(ckz80_state::master_control_w)); // A13
- map(0xc000, 0xc7ff).mirror(0x3800).ram(); // A14
-}
-
-// PCB design is prone to bus conflicts, but should be fine if software obeys
-WRITE8_MEMBER(ckz80_state::master_trampoline_w)
-{
- if (offset & 0x2000)
- m_master_map->write8(space, (offset & 0x3fff) | 0x8000, data);
- if (offset & 0x4000)
- m_master_map->write8(space, (offset & 0x7fff) | 0x8000, data);
-}
-
-READ8_MEMBER(ckz80_state::master_trampoline_r)
-{
- u8 data = 0xff;
- if (~offset & 0x8000)
- data &= m_master_map->read8(space, offset);
- if (offset & 0x2000)
- data &= m_master_map->read8(space, (offset & 0x3fff) | 0x8000);
- if (offset & 0x4000)
- data &= m_master_map->read8(space, (offset & 0x7fff) | 0x8000);
-
- return data;
-}
-
-void ckz80_state::master_trampoline(address_map &map)
-{
- map(0x0000, 0xffff).rw(FUNC(ckz80_state::master_trampoline_r), FUNC(ckz80_state::master_trampoline_w));
-}
-
-
-
-/******************************************************************************
- Input Ports
-******************************************************************************/
-
-static INPUT_PORTS_START( cb_buttons )
- PORT_START("IN.0")
- PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
- PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
- PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
- PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
- PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
- PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
- PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
- PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
-
- PORT_START("IN.1")
- PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
- PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
- PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
- PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
- PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
- PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
- PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
- PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
-
- PORT_START("IN.2")
- PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
- PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
- PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
- PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
- PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
- PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
- PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
- PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
-
- PORT_START("IN.3")
- PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
- PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
- PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
- PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
- PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
- PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
- PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
- PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
-
- PORT_START("IN.4")
- PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
- PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
- PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
- PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
- PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
- PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
- PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
- PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
-
- PORT_START("IN.5")
- PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
- PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
- PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
- PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
- PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
- PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
- PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
- PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
-
- PORT_START("IN.6")
- PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
- PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
- PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
- PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
- PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
- PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
- PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
- PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
-
- PORT_START("IN.7")
- PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
- PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
- PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
- PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
- PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
- PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
- PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
- PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
-INPUT_PORTS_END
-
-
-static INPUT_PORTS_START( master )
- PORT_INCLUDE( cb_buttons )
-
- PORT_START("IN.8")
- PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_1) PORT_NAME("Change Position")
- PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_2) PORT_NAME("Clear Board")
- PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_3) PORT_NAME("New Game")
- PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_4) PORT_NAME("Take Back")
- PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_5) PORT_NAME("King")
- PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_6) PORT_NAME("Queen")
- PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_7) PORT_NAME("Rook")
- PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_UNUSED)
-
- PORT_START("IN.9")
- PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_8) PORT_NAME("Bishop")
- PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_9) PORT_NAME("Knight")
- PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_0) PORT_NAME("Pawn")
- PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_Q) PORT_NAME("White")
- PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_W) PORT_NAME("Black")
- PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_E) PORT_NAME("Move")
- PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_R) PORT_NAME("Level")
- PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_T) PORT_NAME("Sound")
-INPUT_PORTS_END
-
-
-
-/******************************************************************************
- Machine Drivers
-******************************************************************************/
-
-MACHINE_CONFIG_START(ckz80_state::master)
-
- /* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, 8_MHz_XTAL/2)
- MCFG_DEVICE_PROGRAM_MAP(master_trampoline)
- MCFG_TIMER_DRIVER_ADD_PERIODIC("irq_on", ckz80_state, irq_on, attotime::from_hz(429)) // theoretical frequency from 555 timer (22nF, 150K, 1K5), measurement was 418Hz
- MCFG_TIMER_START_DELAY(attotime::from_hz(429) - attotime::from_nsec(22870)) // active for 22.87us
- MCFG_TIMER_DRIVER_ADD_PERIODIC("irq_off", ckz80_state, irq_off, attotime::from_hz(429))
-
- ADDRESS_MAP_BANK(config, "master_map").set_map(&ckz80_state::master_map).set_options(ENDIANNESS_LITTLE, 8, 16);
-
- MCFG_TIMER_DRIVER_ADD_PERIODIC("display_decay", ckz80_state, display_decay_tick, attotime::from_msec(1))
- config.set_default_layout(layout_ck_master);
-
- /* sound hardware */
- SPEAKER(config, "speaker").front_center();
- MCFG_DEVICE_ADD("dac", DAC_2BIT_BINARY_WEIGHTED_ONES_COMPLEMENT, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 0.25)
- MCFG_DEVICE_ADD("vref", VOLTAGE_REGULATOR, 0) MCFG_VOLTAGE_REGULATOR_OUTPUT(5.0)
- MCFG_SOUND_ROUTE(0, "dac", 1.0, DAC_VREF_POS_INPUT) MCFG_SOUND_ROUTE(0, "dac", -1.0, DAC_VREF_NEG_INPUT)
-MACHINE_CONFIG_END
-
-
-
-/******************************************************************************
- ROM Definitions
-******************************************************************************/
-
-ROM_START( ckmaster )
- ROM_REGION( 0x10000, "maincpu", 0 )
- ROM_LOAD("ckmaster.ic2", 0x0000, 0x2000, CRC(59cbec9e) SHA1(2e0629e65778da62bed857406b91a334698d2fe8) ) // D2764C, no label
-ROM_END
-
-
-
-/******************************************************************************
- Drivers
-******************************************************************************/
-
-/* YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS */
-CONS( 1984, ckmaster, 0, 0, master, master, ckz80_state, init_master, "Chess King", "Master (Chess King)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
diff --git a/src/mame/drivers/clayshoo.cpp b/src/mame/drivers/clayshoo.cpp
index bddff8b1082..3c571d811a0 100644
--- a/src/mame/drivers/clayshoo.cpp
+++ b/src/mame/drivers/clayshoo.cpp
@@ -322,30 +322,30 @@ void clayshoo_state::machine_reset()
m_analog_port_val = 0;
}
-MACHINE_CONFIG_START(clayshoo_state::clayshoo)
-
+void clayshoo_state::clayshoo(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80,5068000/4) /* 5.068/4 Mhz (divider is a guess) */
- MCFG_DEVICE_PROGRAM_MAP(main_map)
- MCFG_DEVICE_IO_MAP(main_io_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", clayshoo_state, irq0_line_hold)
+ Z80(config, m_maincpu, 5068000/4); /* 5.068/4 Mhz (divider is a guess) */
+ m_maincpu->set_addrmap(AS_PROGRAM, &clayshoo_state::main_map);
+ m_maincpu->set_addrmap(AS_IO, &clayshoo_state::main_io_map);
+ m_maincpu->set_vblank_int("screen", FUNC(clayshoo_state::irq0_line_hold));
WATCHDOG_TIMER(config, "watchdog");
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_SIZE(256, 256)
- MCFG_SCREEN_VISIBLE_AREA(0, 255, 64, 255)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */)
- MCFG_SCREEN_UPDATE_DRIVER(clayshoo_state, screen_update_clayshoo)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_size(256, 256);
+ screen.set_visarea(0, 255, 64, 255);
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500) /* not accurate */);
+ screen.set_screen_update(FUNC(clayshoo_state::screen_update_clayshoo));
I8255A(config, "ppi8255_0");
i8255_device &ppi1(I8255A(config, "ppi8255_1"));
ppi1.out_pa_callback().set(FUNC(clayshoo_state::input_port_select_w));
ppi1.in_pb_callback().set(FUNC(clayshoo_state::input_port_r));
-MACHINE_CONFIG_END
+}
diff --git a/src/mame/drivers/clcd.cpp b/src/mame/drivers/clcd.cpp
index 136ccc419de..4e2f60a1795 100644
--- a/src/mame/drivers/clcd.cpp
+++ b/src/mame/drivers/clcd.cpp
@@ -657,10 +657,11 @@ static INPUT_PORTS_START( clcd )
PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_UNKNOWN ) // clears screen and goes into infinite loop
INPUT_PORTS_END
-MACHINE_CONFIG_START(clcd_state::clcd)
+void clcd_state::clcd(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M65C02, 2000000)
- MCFG_DEVICE_PROGRAM_MAP(clcd_mem)
+ M65C02(config, m_maincpu, 2000000);
+ m_maincpu->set_addrmap(AS_PROGRAM, &clcd_state::clcd_mem);
INPUT_MERGER_ANY_HIGH(config, "mainirq").output_handler().set_inputline("maincpu", m65c02_device::IRQ_LINE);
@@ -712,24 +713,23 @@ MACHINE_CONFIG_START(clcd_state::clcd)
m_rtc->set_default_24h(true);
/* video hardware */
- MCFG_SCREEN_ADD("screen", LCD)
- MCFG_SCREEN_REFRESH_RATE(80)
- MCFG_SCREEN_UPDATE_DRIVER(clcd_state, screen_update)
- MCFG_SCREEN_SIZE(480, 128)
- MCFG_SCREEN_VISIBLE_AREA(0, 480-1, 0, 128-1)
- MCFG_SCREEN_PALETTE("palette")
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_LCD));
+ screen.set_refresh_hz(80);
+ screen.set_screen_update(FUNC(clcd_state::screen_update));
+ screen.set_size(480, 128);
+ screen.set_visarea_full();
+ screen.set_palette("palette");
PALETTE(config, "palette", FUNC(clcd_state::clcd_palette), 2);
// sound hardware
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("speaker", SPEAKER_SOUND)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25)
+ SPEAKER_SOUND(config, "speaker").add_route(ALL_OUTPUTS, "mono", 0.25);
RAM(config, "ram").set_default_size("128K").set_extra_options("32K,64K").set_default_value(0);
NVRAM(config, "nvram").set_custom_handler(FUNC(clcd_state::nvram_init));
-MACHINE_CONFIG_END
+}
ROM_START( clcd )
diff --git a/src/mame/drivers/clickstart.cpp b/src/mame/drivers/clickstart.cpp
new file mode 100644
index 00000000000..69d1fb1235e
--- /dev/null
+++ b/src/mame/drivers/clickstart.cpp
@@ -0,0 +1,441 @@
+// license:BSD-3-Clause
+// copyright-holders:Ryan Holtz, David Haywood
+/******************************************************************************
+
+ Leapfrog Clickstart Emulation
+
+ die markings show
+ "SunPlus QL8041C" ( known as Sunplus SPG2?? )
+
+ Status:
+
+ Some games have Checksums listed in the header area that appear to be
+ like the byte checksums on the Radica games in vii.cpp, however the
+ calculation doesn't add up correctly. There is also a checksum in
+ a footer area at the end of every ROM that does add up correctly in
+ all cases.
+
+ The ROM carts are marked for 4MByte ROMs at least so the sizes
+ should be correct.
+
+ What type of SPG is this?
+
+*******************************************************************************/
+
+#include "emu.h"
+
+#include "bus/generic/slot.h"
+#include "bus/generic/carts.h"
+
+#include "cpu/unsp/unsp.h"
+
+#include "machine/spg2xx.h"
+
+#include "screen.h"
+#include "softlist.h"
+#include "speaker.h"
+
+class clickstart_state : public driver_device
+{
+public:
+ clickstart_state(const machine_config &mconfig, device_type type, const char *tag)
+ : driver_device(mconfig, type, tag)
+ , m_maincpu(*this, "maincpu")
+ , m_screen(*this, "screen")
+ , m_spg(*this, "spg")
+ , m_cart(*this, "cartslot")
+ , m_system_region(*this, "maincpu")
+ , m_io_mouse_x(*this, "MOUSEX")
+ , m_io_mouse_y(*this, "MOUSEY")
+ , m_cart_region(nullptr)
+ , m_mouse_x(0)
+ , m_mouse_y(0)
+ , m_mouse_dx(0)
+ , m_mouse_dy(0)
+ , m_uart_tx_fifo_start(0)
+ , m_uart_tx_fifo_end(0)
+ , m_uart_tx_fifo_count(0)
+ , m_uart_tx_timer(nullptr)
+ , m_unk_portc_toggle(0)
+ { }
+
+ void clickstart(machine_config &config);
+
+ DECLARE_INPUT_CHANGED_MEMBER(mouse_update);
+ DECLARE_INPUT_CHANGED_MEMBER(key_update);
+
+private:
+ virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override;
+
+ static const device_timer_id TIMER_UART_TX = 0;
+
+ virtual void machine_start() override;
+ virtual void machine_reset() override;
+
+ void mem_map(address_map &map);
+
+ DECLARE_DEVICE_IMAGE_LOAD_MEMBER(cart);
+
+ DECLARE_READ16_MEMBER(rom_r);
+
+ DECLARE_WRITE16_MEMBER(porta_w);
+ DECLARE_WRITE16_MEMBER(portb_w);
+ DECLARE_WRITE16_MEMBER(portc_w);
+ DECLARE_READ16_MEMBER(porta_r);
+ DECLARE_READ16_MEMBER(portb_r);
+ DECLARE_READ16_MEMBER(portc_r);
+
+ DECLARE_WRITE8_MEMBER(chip_sel_w);
+
+ void handle_uart_tx();
+ void uart_tx_fifo_push(uint8_t value);
+
+ void update_mouse_buffer();
+
+ required_device<cpu_device> m_maincpu;
+ required_device<screen_device> m_screen;
+ required_device<spg2xx_device> m_spg;
+ required_device<generic_slot_device> m_cart;
+ required_memory_region m_system_region;
+ required_ioport m_io_mouse_x;
+ required_ioport m_io_mouse_y;
+ memory_region *m_cart_region;
+
+ uint16_t m_mouse_x;
+ uint16_t m_mouse_y;
+ int16_t m_mouse_dx;
+ int16_t m_mouse_dy;
+
+ uint8_t m_uart_tx_fifo[32]; // arbitrary size
+ uint8_t m_uart_tx_fifo_start;
+ uint8_t m_uart_tx_fifo_end;
+ uint8_t m_uart_tx_fifo_count;
+ emu_timer *m_uart_tx_timer;
+
+ uint16_t m_unk_portc_toggle;
+};
+
+void clickstart_state::machine_start()
+{
+ // if there's a cart, override the standard mapping
+ if (m_cart && m_cart->exists())
+ {
+ std::string region_tag;
+ m_cart_region = memregion(region_tag.assign(m_cart->tag()).append(GENERIC_ROM_REGION_TAG).c_str());
+ }
+
+ save_item(NAME(m_mouse_x));
+ save_item(NAME(m_mouse_y));
+ save_item(NAME(m_mouse_dx));
+ save_item(NAME(m_mouse_dy));
+
+ save_item(NAME(m_uart_tx_fifo));
+ save_item(NAME(m_uart_tx_fifo_start));
+ save_item(NAME(m_uart_tx_fifo_end));
+ save_item(NAME(m_uart_tx_fifo_count));
+
+ save_item(NAME(m_unk_portc_toggle));
+
+ m_uart_tx_timer = timer_alloc(TIMER_UART_TX);
+ m_uart_tx_timer->adjust(attotime::never);
+}
+
+void clickstart_state::machine_reset()
+{
+ m_mouse_x = 0xffff;
+ m_mouse_y = 0xffff;
+ m_mouse_dx = 0;
+ m_mouse_dy = 0;
+
+ memset(m_uart_tx_fifo, 0, ARRAY_LENGTH(m_uart_tx_fifo));
+ m_uart_tx_fifo_start = 0;
+ m_uart_tx_fifo_end = 0;
+ m_uart_tx_fifo_count = 0;
+ m_uart_tx_timer->adjust(attotime::from_hz(3200/10), 0, attotime::from_hz(3200/10));
+
+ m_unk_portc_toggle = 0;
+}
+
+DEVICE_IMAGE_LOAD_MEMBER(clickstart_state, cart)
+{
+ uint32_t size = m_cart->common_get_size("rom");
+
+ m_cart->rom_alloc(size, GENERIC_ROM16_WIDTH, ENDIANNESS_LITTLE);
+ m_cart->common_load_rom(m_cart->get_rom_base(), size, "rom");
+
+ return image_init_result::PASS;
+}
+
+void clickstart_state::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr)
+{
+ if (id == TIMER_UART_TX)
+ {
+ handle_uart_tx();
+ }
+}
+
+void clickstart_state::handle_uart_tx()
+{
+ if (m_uart_tx_fifo_count == 0)
+ return;
+
+ m_spg->uart_rx(m_uart_tx_fifo[m_uart_tx_fifo_start]);
+ m_uart_tx_fifo_start = (m_uart_tx_fifo_start + 1) % ARRAY_LENGTH(m_uart_tx_fifo);
+ m_uart_tx_fifo_count--;
+}
+
+void clickstart_state::uart_tx_fifo_push(uint8_t value)
+{
+ if (m_uart_tx_fifo_count >= ARRAY_LENGTH(m_uart_tx_fifo))
+ {
+ logerror("Warning: Trying to push too much data onto the mouse Tx FIFO, data will be lost.\n");
+ }
+
+ m_uart_tx_fifo[m_uart_tx_fifo_end] = value;
+ m_uart_tx_fifo_end = (m_uart_tx_fifo_end + 1) % ARRAY_LENGTH(m_uart_tx_fifo);
+ m_uart_tx_fifo_count++;
+}
+
+INPUT_CHANGED_MEMBER(clickstart_state::key_update)
+{
+ const size_t keycode = reinterpret_cast<size_t>(param);
+ printf("keycode:%02x, oldval:%02x, newval:%02x\n", (uint8_t)keycode, oldval, newval);
+
+ uint8_t buffer[5] = {};
+ buffer[0] = 0x01;
+ buffer[1] = newval ? keycode : 0x3f;
+ buffer[2] = 0x3f;
+ buffer[3] = 0x01;
+ buffer[4] = 0x01;
+
+ printf("Keyboard queueing: ");
+ uint16_t sum = 0;
+ for (int i = 0; i < 5; i++)
+ {
+ uart_tx_fifo_push(buffer[i] ^ 0xff);
+ sum += buffer[i];
+ printf("%02x/%02x ", buffer[i], buffer[i] ^ 0xff);
+ }
+ sum = (sum & 0xff) ^ 0xff;
+ uart_tx_fifo_push((uint8_t)sum);
+ printf("%02x\n", (uint8_t)sum);
+}
+
+INPUT_CHANGED_MEMBER(clickstart_state::mouse_update)
+{
+ uint16_t x = m_io_mouse_x->read();
+ uint16_t y = m_io_mouse_y->read();
+ uint16_t old_mouse_x = m_mouse_x;
+ uint16_t old_mouse_y = m_mouse_y;
+
+ if (m_mouse_x == 0xffff)
+ {
+ old_mouse_x = x;
+ old_mouse_y = y;
+ }
+
+ m_mouse_x = x;
+ m_mouse_y = y;
+
+ m_mouse_dx += (m_mouse_x - old_mouse_x);
+ m_mouse_dy += (m_mouse_y - old_mouse_y);
+
+ if (m_mouse_dx < -63)
+ m_mouse_dx = -63;
+ else if (m_mouse_dx > 62)
+ m_mouse_dx = 62;
+
+ if (m_mouse_dy < -63)
+ m_mouse_dy = -63;
+ else if (m_mouse_dy > 62)
+ m_mouse_dy = 62;
+
+ update_mouse_buffer();
+
+ m_mouse_dx = 0;
+ m_mouse_dy = 0;
+}
+
+void clickstart_state::update_mouse_buffer()
+{
+ if (m_mouse_dx == 0 && m_mouse_dy == 0)
+ return;
+
+ uint8_t buffer[5] = {};
+ buffer[0] = 0x01;
+ buffer[1] = 0x3f;
+ buffer[2] = 0x3f;
+ buffer[3] = (m_mouse_dx + 1) & 0x3f;
+ buffer[4] = (m_mouse_dy + 1) & 0x3f;
+
+ printf("Mouse queueing: ");
+ uint16_t sum = 0;
+ for (int i = 0; i < 5; i++)
+ {
+ uart_tx_fifo_push(buffer[i] ^ 0xff);
+ sum += buffer[i];
+ printf("%02x/%02x ", buffer[i], buffer[i] ^ 0xff);
+ }
+ sum = (sum & 0xff) ^ 0xff;
+ uart_tx_fifo_push((uint8_t)sum);
+ printf("%02x\n", (uint8_t)sum);
+}
+
+READ16_MEMBER(clickstart_state::rom_r)
+{
+ if (offset < 0x400000 / 2)
+ {
+ if (m_cart->exists())
+ return ((uint16_t*)m_cart_region->base())[offset];
+ else
+ return ((uint16_t*)m_system_region->base())[offset];
+ }
+ else
+ {
+ return ((uint16_t*)m_system_region->base())[offset];
+ }
+}
+
+WRITE16_MEMBER(clickstart_state::porta_w)
+{
+ //logerror("%s: porta_w: %04x & %04x\n", machine().describe_context(), data, mem_mask);
+}
+
+WRITE16_MEMBER(clickstart_state::portb_w)
+{
+ logerror("%s: portb_w: %04x & %04x\n", machine().describe_context(), data, mem_mask);
+}
+
+WRITE16_MEMBER(clickstart_state::portc_w)
+{
+ //logerror("%s: portc_w: %04x & %04x\n", machine().describe_context(), data, mem_mask);
+}
+
+READ16_MEMBER(clickstart_state::porta_r)
+{
+ uint16_t data = 0x4000;
+ //logerror("%s: porta_r: %04x & %04x\n", machine().describe_context(), data, mem_mask);
+ return data;
+}
+
+READ16_MEMBER(clickstart_state::portb_r)
+{
+ logerror("%s: portb_r: %04x\n", machine().describe_context(), mem_mask);
+ return 0;
+}
+
+READ16_MEMBER(clickstart_state::portc_r)
+{
+ uint16_t data = m_unk_portc_toggle;
+ m_unk_portc_toggle ^= 0x0400;
+ //logerror("%s: portc_r: %04x & %04x\n", machine().describe_context(), data, mem_mask);
+ return data;
+}
+
+WRITE8_MEMBER(clickstart_state::chip_sel_w)
+{
+ // Seems unused, currently
+}
+
+void clickstart_state::mem_map(address_map &map)
+{
+ map(0x000000, 0x3fffff).r(FUNC(clickstart_state::rom_r));
+ map(0x000000, 0x003fff).m(m_spg, FUNC(spg2xx_device::map));
+}
+
+static INPUT_PORTS_START( clickstart )
+ PORT_START("MOUSEX")
+ PORT_BIT(0x3e, 0x00, IPT_MOUSE_X) PORT_SENSITIVITY(100) PORT_KEYDELTA(10) PORT_CHANGED_MEMBER(DEVICE_SELF, clickstart_state, mouse_update, 0)
+
+ PORT_START("MOUSEY")
+ PORT_BIT(0x3e, 0x00, IPT_MOUSE_Y) PORT_SENSITIVITY(100) PORT_KEYDELTA(10) PORT_CHANGED_MEMBER(DEVICE_SELF, clickstart_state, mouse_update, 0)
+
+ PORT_START("KEYS0")
+ PORT_BIT(0x0001, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CHANGED_MEMBER(DEVICE_SELF, clickstart_state, key_update, 0x01) PORT_CODE(KEYCODE_A) PORT_CHAR('a') PORT_CHAR('A')
+ PORT_BIT(0x0002, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CHANGED_MEMBER(DEVICE_SELF, clickstart_state, key_update, 0x02) PORT_CODE(KEYCODE_B) PORT_CHAR('b') PORT_CHAR('B')
+ PORT_BIT(0x0004, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CHANGED_MEMBER(DEVICE_SELF, clickstart_state, key_update, 0x03) PORT_CODE(KEYCODE_C) PORT_CHAR('c') PORT_CHAR('C')
+ PORT_BIT(0x0008, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CHANGED_MEMBER(DEVICE_SELF, clickstart_state, key_update, 0x04) PORT_CODE(KEYCODE_D) PORT_CHAR('d') PORT_CHAR('D')
+ PORT_BIT(0x0010, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CHANGED_MEMBER(DEVICE_SELF, clickstart_state, key_update, 0x05) PORT_CODE(KEYCODE_E) PORT_CHAR('e') PORT_CHAR('E')
+ PORT_BIT(0x0020, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CHANGED_MEMBER(DEVICE_SELF, clickstart_state, key_update, 0x06) PORT_CODE(KEYCODE_F) PORT_CHAR('f') PORT_CHAR('F')
+ PORT_BIT(0x0040, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CHANGED_MEMBER(DEVICE_SELF, clickstart_state, key_update, 0x07) PORT_CODE(KEYCODE_G) PORT_CHAR('g') PORT_CHAR('G')
+ PORT_BIT(0x0080, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CHANGED_MEMBER(DEVICE_SELF, clickstart_state, key_update, 0x08) PORT_CODE(KEYCODE_H) PORT_CHAR('h') PORT_CHAR('H')
+ PORT_BIT(0x0100, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CHANGED_MEMBER(DEVICE_SELF, clickstart_state, key_update, 0x09) PORT_CODE(KEYCODE_I) PORT_CHAR('i') PORT_CHAR('I')
+ PORT_BIT(0x0200, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CHANGED_MEMBER(DEVICE_SELF, clickstart_state, key_update, 0x0a) PORT_CODE(KEYCODE_J) PORT_CHAR('j') PORT_CHAR('J')
+ PORT_BIT(0x0400, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CHANGED_MEMBER(DEVICE_SELF, clickstart_state, key_update, 0x0b) PORT_CODE(KEYCODE_K) PORT_CHAR('k') PORT_CHAR('K')
+ PORT_BIT(0x0800, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CHANGED_MEMBER(DEVICE_SELF, clickstart_state, key_update, 0x0c) PORT_CODE(KEYCODE_L) PORT_CHAR('l') PORT_CHAR('L')
+ PORT_BIT(0x1000, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CHANGED_MEMBER(DEVICE_SELF, clickstart_state, key_update, 0x0d) PORT_CODE(KEYCODE_M) PORT_CHAR('m') PORT_CHAR('M')
+ PORT_BIT(0x2000, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CHANGED_MEMBER(DEVICE_SELF, clickstart_state, key_update, 0x0e) PORT_CODE(KEYCODE_N) PORT_CHAR('n') PORT_CHAR('N')
+ PORT_BIT(0x4000, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CHANGED_MEMBER(DEVICE_SELF, clickstart_state, key_update, 0x0f) PORT_CODE(KEYCODE_O) PORT_CHAR('o') PORT_CHAR('O')
+ PORT_BIT(0x8000, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CHANGED_MEMBER(DEVICE_SELF, clickstart_state, key_update, 0x10) PORT_CODE(KEYCODE_P) PORT_CHAR('p') PORT_CHAR('P')
+
+ PORT_START("KEYS1")
+ PORT_BIT(0x0001, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CHANGED_MEMBER(DEVICE_SELF, clickstart_state, key_update, 0x11) PORT_CODE(KEYCODE_Q) PORT_CHAR('q') PORT_CHAR('q')
+ PORT_BIT(0x0002, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CHANGED_MEMBER(DEVICE_SELF, clickstart_state, key_update, 0x12) PORT_CODE(KEYCODE_R) PORT_CHAR('r') PORT_CHAR('r')
+ PORT_BIT(0x0004, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CHANGED_MEMBER(DEVICE_SELF, clickstart_state, key_update, 0x13) PORT_CODE(KEYCODE_S) PORT_CHAR('s') PORT_CHAR('s')
+ PORT_BIT(0x0008, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CHANGED_MEMBER(DEVICE_SELF, clickstart_state, key_update, 0x14) PORT_CODE(KEYCODE_T) PORT_CHAR('t') PORT_CHAR('t')
+ PORT_BIT(0x0010, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CHANGED_MEMBER(DEVICE_SELF, clickstart_state, key_update, 0x15) PORT_CODE(KEYCODE_U) PORT_CHAR('u') PORT_CHAR('u')
+ PORT_BIT(0x0020, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CHANGED_MEMBER(DEVICE_SELF, clickstart_state, key_update, 0x16) PORT_CODE(KEYCODE_V) PORT_CHAR('v') PORT_CHAR('v')
+ PORT_BIT(0x0040, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CHANGED_MEMBER(DEVICE_SELF, clickstart_state, key_update, 0x17) PORT_CODE(KEYCODE_W) PORT_CHAR('w') PORT_CHAR('w')
+ PORT_BIT(0x0080, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CHANGED_MEMBER(DEVICE_SELF, clickstart_state, key_update, 0x18) PORT_CODE(KEYCODE_X) PORT_CHAR('x') PORT_CHAR('x')
+ PORT_BIT(0x0100, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CHANGED_MEMBER(DEVICE_SELF, clickstart_state, key_update, 0x19) PORT_CODE(KEYCODE_Y) PORT_CHAR('y') PORT_CHAR('y')
+ PORT_BIT(0x0200, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CHANGED_MEMBER(DEVICE_SELF, clickstart_state, key_update, 0x1a) PORT_CODE(KEYCODE_Z) PORT_CHAR('z') PORT_CHAR('z')
+ PORT_BIT(0x0400, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CHANGED_MEMBER(DEVICE_SELF, clickstart_state, key_update, 0x1b) PORT_CODE(KEYCODE_0) PORT_CHAR('0')
+ PORT_BIT(0x0800, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CHANGED_MEMBER(DEVICE_SELF, clickstart_state, key_update, 0x1c) PORT_CODE(KEYCODE_1) PORT_CHAR('1')
+ PORT_BIT(0x1000, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CHANGED_MEMBER(DEVICE_SELF, clickstart_state, key_update, 0x1d) PORT_CODE(KEYCODE_2) PORT_CHAR('2')
+ PORT_BIT(0x2000, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CHANGED_MEMBER(DEVICE_SELF, clickstart_state, key_update, 0x1e) PORT_CODE(KEYCODE_3) PORT_CHAR('3')
+ PORT_BIT(0x4000, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CHANGED_MEMBER(DEVICE_SELF, clickstart_state, key_update, 0x1f) PORT_CODE(KEYCODE_4) PORT_CHAR('4')
+ PORT_BIT(0x8000, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CHANGED_MEMBER(DEVICE_SELF, clickstart_state, key_update, 0x20) PORT_CODE(KEYCODE_5) PORT_CHAR('5')
+
+ PORT_START("KEYS2")
+ PORT_BIT(0x0001, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CHANGED_MEMBER(DEVICE_SELF, clickstart_state, key_update, 0x21) PORT_CODE(KEYCODE_6) PORT_CHAR('6')
+ PORT_BIT(0x0002, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CHANGED_MEMBER(DEVICE_SELF, clickstart_state, key_update, 0x22) PORT_CODE(KEYCODE_7) PORT_CHAR('7')
+ PORT_BIT(0x0004, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CHANGED_MEMBER(DEVICE_SELF, clickstart_state, key_update, 0x23) PORT_CODE(KEYCODE_8) PORT_CHAR('8')
+ PORT_BIT(0x0008, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CHANGED_MEMBER(DEVICE_SELF, clickstart_state, key_update, 0x24) PORT_CODE(KEYCODE_9) PORT_CHAR('9')
+ PORT_BIT(0x0010, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CHANGED_MEMBER(DEVICE_SELF, clickstart_state, key_update, 0x27) PORT_CODE(KEYCODE_SPACE) PORT_CHAR(' ')
+ PORT_BIT(0x0020, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CHANGED_MEMBER(DEVICE_SELF, clickstart_state, key_update, 0xa9) PORT_CODE(KEYCODE_LSHIFT) PORT_NAME("Shift")
+ PORT_BIT(0xffc0, IP_ACTIVE_HIGH, IPT_UNUSED)
+INPUT_PORTS_END
+
+// There is a SEEPROM on the motherboard (type?)
+
+void clickstart_state::clickstart(machine_config &config)
+{
+ UNSP(config, m_maincpu, XTAL(27'000'000));
+ m_maincpu->set_addrmap(AS_PROGRAM, &clickstart_state::mem_map);
+
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_refresh_hz(60);
+ m_screen->set_size(320, 262);
+ m_screen->set_visarea(0, 320-1, 0, 240-1);
+ m_screen->set_screen_update("spg", FUNC(spg2xx_device::screen_update));
+ m_screen->screen_vblank().set(m_spg, FUNC(spg2xx_device::vblank));
+
+ SPEAKER(config, "lspeaker").front_left();
+ SPEAKER(config, "rspeaker").front_right();
+
+ SPG28X(config, m_spg, XTAL(27'000'000), m_maincpu, m_screen);
+ m_spg->porta_out().set(FUNC(clickstart_state::porta_w));
+ m_spg->portb_out().set(FUNC(clickstart_state::portb_w));
+ m_spg->portc_out().set(FUNC(clickstart_state::portc_w));
+ m_spg->porta_in().set(FUNC(clickstart_state::porta_r));
+ m_spg->portb_in().set(FUNC(clickstart_state::portb_r));
+ m_spg->portc_in().set(FUNC(clickstart_state::portc_r));
+ m_spg->adc_in<0>().set_constant(0x0fff);
+ m_spg->chip_select().set(FUNC(clickstart_state::chip_sel_w));
+ m_spg->add_route(ALL_OUTPUTS, "lspeaker", 0.5);
+ m_spg->add_route(ALL_OUTPUTS, "rspeaker", 0.5);
+
+ GENERIC_CARTSLOT(config, m_cart, generic_plain_slot, "clickstart_cart");
+ m_cart->set_width(GENERIC_ROM16_WIDTH);
+ m_cart->set_device_load(device_image_load_delegate(&clickstart_state::device_image_load_cart, this));
+
+ SOFTWARE_LIST(config, "cart_list").set_original("clickstart_cart");
+}
+
+ROM_START( clikstrt )
+ ROM_REGION( 0x800000, "maincpu", ROMREGION_ERASEFF )
+ ROM_LOAD16_WORD_SWAP( "clickstartbios.bin", 0x000000, 0x800000, CRC(7c833bd0) SHA1(2e9ef38e1a7582705920339e6b9944f6404fcf9b) )
+ROM_END
+
+// year, name, parent, compat, machine, input, class, init, company, fullname, flags
+CONS( 2007, clikstrt, 0, 0, clickstart, clickstart, clickstart_state, empty_init, "LeapFrog Enterprises", "ClickStart", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS | MACHINE_NOT_WORKING ) // 'My First Computer' tagline
diff --git a/src/mame/drivers/cliffhgr.cpp b/src/mame/drivers/cliffhgr.cpp
index 2096eedf939..e93fae702f3 100644
--- a/src/mame/drivers/cliffhgr.cpp
+++ b/src/mame/drivers/cliffhgr.cpp
@@ -26,15 +26,15 @@ More info on the LD-V1100:
http://www.laserdiscarchive.co.uk/laserdisc_archive/pioneer/pioneer_ld-1100/pioneer_ld-1100.htm
Interrupts:
-The frame decoder reads in the Phillips code from the composite signal into
+The frame decoder reads in the Philips code from the composite signal into
3x8 bit flip flops. If bit 7 of the code is set, then an IRQ is generated.
-Phillips codes come in scanline 17 and 18 of the composite signal for each
+Philips codes come in scanline 17 and 18 of the composite signal for each
field, so if we have valid codes, we would have 4 irq's per frame.
NMIs are triggered by the TMS9128NL chip. The TMS9128NL SYNC signal is hooked
up to the composite SYNC signal from the frame decoder.
Goal To Go Side detection:
-The side detection code expects to read a chapter Phillips code of 0x881DDD
+The side detection code expects to read a chapter Philips code of 0x881DDD
for Side 1, or 0x8F7DDD for Side 2. That would be chapter 1 for Side 1, or
chapter number 119 for Side 2.
@@ -47,13 +47,13 @@ IO Ports:
0x44: W TMS9128NL VRAM Port
0x45: R TMS9128NL VRAM Port
0x46: W Sound/Overlay
-0x50: R Reads lower byte of Phillips code
-0x51: R Reads middle byte of Phillips code
-0x52: R Reads high byte of Phillips code
+0x50: R Reads lower byte of Philips code
+0x51: R Reads middle byte of Philips code
+0x52: R Reads high byte of Philips code
0x53: R Clears the flip flop that generated the IRQ
0x54: W TMS9128NL REG Port
0x55: R TMS9128NL REG Port
-0x57: W Clears the serial->parallel chips of the Phillips code reader.
+0x57: W Clears the serial->parallel chips of the Philips code reader.
0x60: W Input Port/Dipswitch selector
0x62: R Input Port/Dipswitch data read
0x64: - Unused in the schematics, but used in the code (maybe as delay?)
@@ -97,7 +97,7 @@ public:
: driver_device(mconfig, type, tag)
, m_laserdisc(*this, "laserdisc")
, m_port_bank(0)
- , m_phillips_code(0)
+ , m_philips_code(0)
, m_maincpu(*this, "maincpu")
, m_discrete(*this, "discrete")
, m_screen(*this, "screen")
@@ -107,8 +107,8 @@ public:
DECLARE_WRITE8_MEMBER(cliff_test_led_w);
DECLARE_WRITE8_MEMBER(cliff_port_bank_w);
DECLARE_READ8_MEMBER(cliff_port_r);
- DECLARE_READ8_MEMBER(cliff_phillips_code_r);
- DECLARE_WRITE8_MEMBER(cliff_phillips_clear_w);
+ DECLARE_READ8_MEMBER(cliff_philips_code_r);
+ DECLARE_WRITE8_MEMBER(cliff_philips_clear_w);
DECLARE_WRITE8_MEMBER(cliff_coin_counter_w);
DECLARE_READ8_MEMBER(cliff_irq_ack_r);
DECLARE_WRITE8_MEMBER(cliff_ldwire_w);
@@ -127,7 +127,7 @@ private:
required_device<pioneer_pr8210_device> m_laserdisc;
int m_port_bank;
- uint32_t m_phillips_code;
+ uint32_t m_philips_code;
emu_timer *m_irq_timer;
@@ -167,12 +167,12 @@ READ8_MEMBER(cliffhgr_state::cliff_port_r)
return 0xff;
}
-READ8_MEMBER(cliffhgr_state::cliff_phillips_code_r)
+READ8_MEMBER(cliffhgr_state::cliff_philips_code_r)
{
- return (m_phillips_code >> (8 * offset)) & 0xff;
+ return (m_philips_code >> (8 * offset)) & 0xff;
}
-WRITE8_MEMBER(cliffhgr_state::cliff_phillips_clear_w)
+WRITE8_MEMBER(cliffhgr_state::cliff_philips_clear_w)
{
/* reset serial to parallel converters */
}
@@ -209,25 +209,25 @@ WRITE8_MEMBER(cliffhgr_state::cliff_ldwire_w)
TIMER_CALLBACK_MEMBER(cliffhgr_state::cliff_irq_callback)
{
- m_phillips_code = 0;
+ m_philips_code = 0;
switch (param)
{
case 17:
- m_phillips_code = m_laserdisc->get_field_code(LASERDISC_CODE_LINE17, true);
+ m_philips_code = m_laserdisc->get_field_code(LASERDISC_CODE_LINE17, true);
param = 18;
break;
case 18:
- m_phillips_code = m_laserdisc->get_field_code(LASERDISC_CODE_LINE18, true);
+ m_philips_code = m_laserdisc->get_field_code(LASERDISC_CODE_LINE18, true);
param = 17;
break;
}
/* if we have a valid code, trigger an IRQ */
- if (m_phillips_code & 0x800000)
+ if (m_philips_code & 0x800000)
{
-// printf("%2d:code = %06X\n", param, phillips_code);
+// printf("%2d:code = %06X\n", param, philips_code);
m_maincpu->set_input_line(0, ASSERT_LINE);
}
@@ -243,7 +243,7 @@ void cliffhgr_state::machine_start()
void cliffhgr_state::machine_reset()
{
m_port_bank = 0;
- m_phillips_code = 0;
+ m_philips_code = 0;
m_irq_timer->adjust(m_screen->time_until_pos(17), 17);
}
@@ -259,14 +259,14 @@ void cliffhgr_state::mainmem(address_map &map)
void cliffhgr_state::mainport(address_map &map)
{
map.global_mask(0xff);
- map(0x44, 0x44).w("tms9928a", FUNC(tms9928a_device::vram_w));
- map(0x45, 0x45).r("tms9928a", FUNC(tms9928a_device::vram_r));
+ map(0x44, 0x44).w("tms9928a", FUNC(tms9928a_device::vram_write));
+ map(0x45, 0x45).r("tms9928a", FUNC(tms9928a_device::vram_read));
map(0x46, 0x46).w(FUNC(cliffhgr_state::cliff_sound_overlay_w));
- map(0x50, 0x52).r(FUNC(cliffhgr_state::cliff_phillips_code_r));
+ map(0x50, 0x52).r(FUNC(cliffhgr_state::cliff_philips_code_r));
map(0x53, 0x53).r(FUNC(cliffhgr_state::cliff_irq_ack_r));
- map(0x54, 0x54).w("tms9928a", FUNC(tms9928a_device::register_w));
- map(0x55, 0x55).r("tms9928a", FUNC(tms9928a_device::register_r));
- map(0x57, 0x57).w(FUNC(cliffhgr_state::cliff_phillips_clear_w));
+ map(0x54, 0x54).w("tms9928a", FUNC(tms9928a_device::register_write));
+ map(0x55, 0x55).r("tms9928a", FUNC(tms9928a_device::register_read));
+ map(0x57, 0x57).w(FUNC(cliffhgr_state::cliff_philips_clear_w));
map(0x60, 0x60).w(FUNC(cliffhgr_state::cliff_port_bank_w));
map(0x62, 0x62).r(FUNC(cliffhgr_state::cliff_port_r));
map(0x64, 0x64).nopw(); /* unused in schematics, may be used as timing delay for IR interface */
@@ -689,17 +689,18 @@ INPUT_PORTS_END
*************************************/
MACHINE_CONFIG_START(cliffhgr_state::cliffhgr)
-
- MCFG_DEVICE_ADD("maincpu", Z80, 4000000) /* 4MHz */
- MCFG_DEVICE_PROGRAM_MAP(mainmem)
- MCFG_DEVICE_IO_MAP(mainport)
+ Z80(config, m_maincpu, 4000000); /* 4MHz */
+ m_maincpu->set_addrmap(AS_PROGRAM, &cliffhgr_state::mainmem);
+ m_maincpu->set_addrmap(AS_IO, &cliffhgr_state::mainport);
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
- MCFG_LASERDISC_PR8210_ADD("laserdisc")
- MCFG_LASERDISC_OVERLAY_DEVICE(tms9928a_device::TOTAL_HORZ, tms9928a_device::TOTAL_VERT_NTSC, "tms9928a", tms9928a_device, screen_update)
- MCFG_LASERDISC_OVERLAY_CLIP(tms9928a_device::HORZ_DISPLAY_START-12, tms9928a_device::HORZ_DISPLAY_START+32*8+12-1, tms9928a_device::VERT_DISPLAY_START_NTSC - 12, tms9928a_device::VERT_DISPLAY_START_NTSC+24*8+12-1)
+ PIONEER_PR8210(config, m_laserdisc, 0);
+ m_laserdisc->set_overlay(tms9928a_device::TOTAL_HORZ, tms9928a_device::TOTAL_VERT_NTSC, "tms9928a", FUNC(tms9928a_device::screen_update));
+ m_laserdisc->set_overlay_clip(tms9928a_device::HORZ_DISPLAY_START-12, tms9928a_device::HORZ_DISPLAY_START+32*8+12-1, tms9928a_device::VERT_DISPLAY_START_NTSC - 12, tms9928a_device::VERT_DISPLAY_START_NTSC+24*8+12-1);
+ m_laserdisc->add_route(0, "lspeaker", 1.0);
+ m_laserdisc->add_route(1, "rspeaker", 1.0);
/* start with the TMS9928a video configuration */
tms9128_device &vdp(TMS9128(config, "tms9928a", XTAL(10'738'635))); /* TMS9128NL on the board */
@@ -713,12 +714,7 @@ MACHINE_CONFIG_START(cliffhgr_state::cliffhgr)
SPEAKER(config, "lspeaker").front_left();
SPEAKER(config, "rspeaker").front_right();
- MCFG_DEVICE_MODIFY("laserdisc")
- MCFG_SOUND_ROUTE(0, "lspeaker", 1.0)
- MCFG_SOUND_ROUTE(1, "rspeaker", 1.0)
-
- MCFG_DEVICE_ADD("discrete", DISCRETE, cliffhgr_discrete)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 1.0)
+ DISCRETE(config, m_discrete, cliffhgr_discrete).add_route(ALL_OUTPUTS, "lspeaker", 1.0);
MACHINE_CONFIG_END
diff --git a/src/mame/drivers/clowndwn.cpp b/src/mame/drivers/clowndwn.cpp
index 2fe069950f8..e31862cef12 100644
--- a/src/mame/drivers/clowndwn.cpp
+++ b/src/mame/drivers/clowndwn.cpp
@@ -56,21 +56,21 @@ void clowndwn_state::machine_reset()
}
-MACHINE_CONFIG_START(clowndwn_state::clowndwn)
-
+void clowndwn_state::clowndwn(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M6802, 8000000) // unknown type and clock
- MCFG_DEVICE_PROGRAM_MAP(clowndwn_map)
+ M6802(config, m_maincpu, 8000000); // unknown type and clock
+ m_maincpu->set_addrmap(AS_PROGRAM, &clowndwn_state::clowndwn_map);
- MCFG_DEVICE_ADD("pia0", PIA6821, 0)
- MCFG_DEVICE_ADD("pia1", PIA6821, 0)
- MCFG_DEVICE_ADD("pia2", PIA6821, 0)
- MCFG_DEVICE_ADD("pia3", PIA6821, 0)
- MCFG_DEVICE_ADD("pia4", PIA6821, 0)
+ PIA6821(config, "pia0", 0);
+ PIA6821(config, "pia1", 0);
+ PIA6821(config, "pia2", 0);
+ PIA6821(config, "pia3", 0);
+ PIA6821(config, "pia4", 0);
/* sound hardware */
SPEAKER(config, "mono").front_center();
-MACHINE_CONFIG_END
+}
// has
diff --git a/src/mame/drivers/clpoker.cpp b/src/mame/drivers/clpoker.cpp
index 587e946bdfc..71f1c76c27a 100644
--- a/src/mame/drivers/clpoker.cpp
+++ b/src/mame/drivers/clpoker.cpp
@@ -253,11 +253,12 @@ static GFXDECODE_START( gfx_clpoker )
GFXDECODE_END
-MACHINE_CONFIG_START(clpoker_state::clpoker)
+void clpoker_state::clpoker(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, XTAL(12'000'000) / 3) // Z0840004PSC, divider not verified
- MCFG_DEVICE_PROGRAM_MAP(prg_map)
- MCFG_DEVICE_IO_MAP(io_map)
+ Z80(config, m_maincpu, XTAL(12'000'000) / 3); // Z0840004PSC, divider not verified
+ m_maincpu->set_addrmap(AS_PROGRAM, &clpoker_state::prg_map);
+ m_maincpu->set_addrmap(AS_IO, &clpoker_state::io_map);
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0); // HY6116ALP-12
@@ -271,22 +272,22 @@ MACHINE_CONFIG_START(clpoker_state::clpoker)
ppi_inputs.in_pb_callback().set_ioport("INB");
ppi_inputs.in_pc_callback().set_ioport("INC");
- MCFG_TICKET_DISPENSER_ADD("hopper", attotime::from_msec(60), TICKET_MOTOR_ACTIVE_HIGH, TICKET_STATUS_ACTIVE_LOW)
+ TICKET_DISPENSER(config, m_hopper, attotime::from_msec(60), TICKET_MOTOR_ACTIVE_HIGH, TICKET_STATUS_ACTIVE_LOW);
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60) // wrong
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) // wrong
- MCFG_SCREEN_SIZE(64*8, 32*8) // wrong
- MCFG_SCREEN_VISIBLE_AREA(0*8, 64*8-1, 0*8, 32*8-1) // probably right
- MCFG_SCREEN_UPDATE_DRIVER(clpoker_state, screen_update)
- MCFG_SCREEN_PALETTE("palette")
- MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE(*this, clpoker_state, vblank_w))
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60); // wrong
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0)); // wrong
+ screen.set_size(64*8, 32*8); // wrong
+ screen.set_visarea_full(); // probably right
+ screen.set_screen_update(FUNC(clpoker_state::screen_update));
+ screen.set_palette("palette");
+ screen.screen_vblank().set(FUNC(clpoker_state::vblank_w));
- MCFG_PALETTE_ADD("palette", 0x100)
+ PALETTE(config, "palette").set_entries(0x100);
ramdac_device &ramdac(RAMDAC(config, "ramdac", 0, "palette")); // HM86171
ramdac.set_addrmap(0, &clpoker_state::ramdac_map);
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_clpoker)
+ GFXDECODE(config, m_gfxdecode, "palette", gfx_clpoker);
/* sound hardware */
SPEAKER(config, "mono").front_center();
@@ -294,7 +295,7 @@ MACHINE_CONFIG_START(clpoker_state::clpoker)
aysnd.port_a_read_callback().set_ioport("DSW1");
aysnd.port_b_read_callback().set_ioport("DSW2");
aysnd.add_route(ALL_OUTPUTS, "mono", 0.30);
-MACHINE_CONFIG_END
+}
ROM_START( clpoker )
diff --git a/src/mame/drivers/clshroad.cpp b/src/mame/drivers/clshroad.cpp
index 4c443919ac8..f908f05a46b 100644
--- a/src/mame/drivers/clshroad.cpp
+++ b/src/mame/drivers/clshroad.cpp
@@ -272,16 +272,16 @@ INTERRUPT_GEN_MEMBER(clshroad_state::sound_timer_irq)
device.execute().set_input_line(0, HOLD_LINE);
}
-MACHINE_CONFIG_START(clshroad_state::firebatl)
-
+void clshroad_state::firebatl(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, MAIN_CLOCK) /* ? */
- MCFG_DEVICE_PROGRAM_MAP(clshroad_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", clshroad_state, vblank_irq)
+ Z80(config, m_maincpu, MAIN_CLOCK); /* ? */
+ m_maincpu->set_addrmap(AS_PROGRAM, &clshroad_state::clshroad_map);
+ m_maincpu->set_vblank_int("screen", FUNC(clshroad_state::vblank_irq));
- MCFG_DEVICE_ADD("audiocpu", Z80, MAIN_CLOCK) /* ? */
- MCFG_DEVICE_PROGRAM_MAP(clshroad_sound_map)
- MCFG_DEVICE_PERIODIC_INT_DRIVER(clshroad_state, sound_timer_irq, 120) /* periodic interrupt, don't know about the frequency */
+ Z80(config, m_audiocpu, MAIN_CLOCK); /* ? */
+ m_audiocpu->set_addrmap(AS_PROGRAM, &clshroad_state::clshroad_sound_map);
+ m_audiocpu->set_periodic_int(FUNC(clshroad_state::sound_timer_irq), attotime::from_hz(120)); /* periodic interrupt, don't know about the frequency */
ls259_device &mainlatch(LS259(config, "mainlatch"));
mainlatch.q_out_cb<0>().set_inputline(m_audiocpu, INPUT_LINE_RESET).invert();
@@ -290,13 +290,13 @@ MACHINE_CONFIG_START(clshroad_state::firebatl)
mainlatch.q_out_cb<4>().set(FUNC(clshroad_state::flipscreen_w));
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(0x120, 0x100)
- MCFG_SCREEN_VISIBLE_AREA(0, 0x120-1, 0x0+16, 0x100-16-1)
- MCFG_SCREEN_UPDATE_DRIVER(clshroad_state, screen_update)
- MCFG_SCREEN_PALETTE(m_palette)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(0x120, 0x100);
+ screen.set_visarea(0, 0x120-1, 0x0+16, 0x100-16-1);
+ screen.set_screen_update(FUNC(clshroad_state::screen_update));
+ screen.set_palette(m_palette);
GFXDECODE(config, m_gfxdecode, m_palette, gfx_firebatl);
PALETTE(config, m_palette, FUNC(clshroad_state::firebatl_palette), 512+64*4, 256);
@@ -306,21 +306,20 @@ MACHINE_CONFIG_START(clshroad_state::firebatl)
/* sound hardware */
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("custom", WIPING_CUSTOM, 96000)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
-MACHINE_CONFIG_END
-
-MACHINE_CONFIG_START(clshroad_state::clshroad)
+ WIPING_CUSTOM(config, "custom", 96000).add_route(ALL_OUTPUTS, "mono", 1.0);
+}
+void clshroad_state::clshroad(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, MAIN_CLOCK) /* ? real speed unknown. 3MHz is too low and causes problems */
- MCFG_DEVICE_PROGRAM_MAP(clshroad_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", clshroad_state, vblank_irq)
+ Z80(config, m_maincpu, MAIN_CLOCK); /* ? real speed unknown. 3MHz is too low and causes problems */
+ m_maincpu->set_addrmap(AS_PROGRAM, &clshroad_state::clshroad_map);
+ m_maincpu->set_vblank_int("screen", FUNC(clshroad_state::vblank_irq));
- MCFG_DEVICE_ADD("audiocpu", Z80, MAIN_CLOCK) /* ? */
- MCFG_DEVICE_PROGRAM_MAP(clshroad_sound_map)
- //MCFG_DEVICE_VBLANK_INT_DRIVER("screen", clshroad_state, irq0_line_hold) /* IRQ, no NMI */
- MCFG_DEVICE_PERIODIC_INT_DRIVER(clshroad_state, sound_timer_irq, 60) /* periodic interrupt, don't know about the frequency */
+ Z80(config, m_audiocpu, MAIN_CLOCK); /* ? */
+ m_audiocpu->set_addrmap(AS_PROGRAM, &clshroad_state::clshroad_sound_map);
+ //m_audiocpu->set_vblank_int("screen", FUNC(clshroad_state::irq0_line_hold)); /* IRQ, no NMI */
+ m_audiocpu->set_periodic_int(FUNC(clshroad_state::sound_timer_irq), attotime::from_hz(60)); /* periodic interrupt, don't know about the frequency */
ls259_device &mainlatch(LS259(config, "mainlatch"));
mainlatch.q_out_cb<0>().set_nop(); // never writes here?
@@ -329,13 +328,13 @@ MACHINE_CONFIG_START(clshroad_state::clshroad)
mainlatch.q_out_cb<4>().set(FUNC(clshroad_state::flipscreen_w));
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(0x120, 0x100)
- MCFG_SCREEN_VISIBLE_AREA(0, 0x120-1, 0x0+16, 0x100-16-1)
- MCFG_SCREEN_UPDATE_DRIVER(clshroad_state, screen_update)
- MCFG_SCREEN_PALETTE(m_palette)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(0x120, 0x100);
+ screen.set_visarea(0, 0x120-1, 0x0+16, 0x100-16-1);
+ screen.set_screen_update(FUNC(clshroad_state::screen_update));
+ screen.set_palette(m_palette);
GFXDECODE(config, m_gfxdecode, m_palette, gfx_clshroad);
PALETTE(config, m_palette, FUNC(clshroad_state::clshroad_palette), 256);
@@ -345,9 +344,8 @@ MACHINE_CONFIG_START(clshroad_state::clshroad)
/* sound hardware */
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("custom", WIPING_CUSTOM, 96000)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
-MACHINE_CONFIG_END
+ WIPING_CUSTOM(config, "custom", 96000).add_route(ALL_OUTPUTS, "mono", 1.0);
+}
/***************************************************************************
diff --git a/src/mame/drivers/cm1800.cpp b/src/mame/drivers/cm1800.cpp
index 9307be3cd83..f89a09c66d8 100644
--- a/src/mame/drivers/cm1800.cpp
+++ b/src/mame/drivers/cm1800.cpp
@@ -36,6 +36,7 @@ to be a save command.
#include "emu.h"
#include "cpu/i8085/i8085.h"
#include "machine/ay31015.h"
+#include "machine/clock.h"
#include "bus/rs232/rs232.h"
@@ -106,12 +107,14 @@ void cm1800_state::cm1800(machine_config &config)
/* video hardware */
AY51013(config, m_uart); // exact uart type is unknown
- m_uart->set_tx_clock(153600);
- m_uart->set_rx_clock(153600);
m_uart->read_si_callback().set("rs232", FUNC(rs232_port_device::rxd_r));
m_uart->write_so_callback().set("rs232", FUNC(rs232_port_device::write_txd));
m_uart->set_auto_rdav(true);
+ clock_device &uart_clock(CLOCK(config, "uart_clock", 153600));
+ uart_clock.signal_handler().set(m_uart, FUNC(ay31015_device::write_tcp));
+ uart_clock.signal_handler().append(m_uart, FUNC(ay31015_device::write_rcp));
+
RS232_PORT(config, "rs232", default_rs232_devices, "terminal");
}
diff --git a/src/mame/drivers/cmi.cpp b/src/mame/drivers/cmi.cpp
index cb7cbc5eca0..148e0386fd8 100644
--- a/src/mame/drivers/cmi.cpp
+++ b/src/mame/drivers/cmi.cpp
@@ -1519,7 +1519,7 @@ READ8_MEMBER( cmi_state::cmi02_r )
{
if (ch_mask & (1 << i))
{
- return m_channels[i]->read(space, offset & 0x1f, 0xff);
+ return m_channels[i]->read(offset & 0x1f);
}
}
@@ -1530,7 +1530,7 @@ READ8_MEMBER( cmi_state::cmi02_r )
switch (offset)
{
case 0x20: case 0x21: case 0x22: case 0x23:
- return m_cmi02_pia[0]->read(space, offset & 3);
+ return m_cmi02_pia[0]->read(offset & 3);
case 0x26:
m_maincpu2->set_input_line(INPUT_LINE_HALT, ASSERT_LINE);
@@ -1543,10 +1543,10 @@ READ8_MEMBER( cmi_state::cmi02_r )
return 0xff;
case 0x28: case 0x29: case 0x2a: case 0x2b:
- return m_cmi02_pia[1]->read(space, offset & 3);
+ return m_cmi02_pia[1]->read(offset & 3);
case 0x38: case 0x39: case 0x3a: case 0x3b: case 0x3c: case 0x3d: case 0x3e: case 0x3f:
- return m_cmi02_ptm->read(space, offset & 7);
+ return m_cmi02_ptm->read(offset & 7);
default:
logerror("CMI02 R: %x\n", offset);
@@ -1564,7 +1564,7 @@ WRITE8_MEMBER( cmi_state::cmi02_w )
for (int i = 0; i < 8; ++i)
{
if (ch_mask & (1 << i))
- m_channels[i]->write(space, offset & 0x1f, data, 0xff);
+ m_channels[i]->write(offset & 0x1f, data);
}
}
else
@@ -1572,11 +1572,11 @@ WRITE8_MEMBER( cmi_state::cmi02_w )
switch (offset)
{
case 0x20: case 0x21: case 0x22: case 0x23:
- m_cmi02_pia[0]->write(space, offset & 3, data);
+ m_cmi02_pia[0]->write(offset & 3, data);
break;
case 0x28: case 0x29: case 0x2a: case 0x2b:
- m_cmi02_pia[1]->write(space, offset & 3, data);
+ m_cmi02_pia[1]->write(offset & 3, data);
break;
case 0x30:
@@ -1595,7 +1595,7 @@ WRITE8_MEMBER( cmi_state::cmi02_w )
break;
case 0x38: case 0x39: case 0x3a: case 0x3b: case 0x3c: case 0x3d: case 0x3e: case 0x3f:
- m_cmi02_ptm->write(space, offset & 7, data);
+ m_cmi02_ptm->write(offset & 7, data);
break;
default:
@@ -1674,22 +1674,22 @@ void cmi_state::install_peripherals(int cpunum)
else
space->install_readwrite_handler(0xfc5f, 0xfc5f, read8_delegate(FUNC(cmi_state::map_r<0>),this), write8_delegate(FUNC(cmi_state::map_w<0>),this));
- space->install_readwrite_handler(0xfc80, 0xfc83, read8_delegate(FUNC(mos6551_device::read),m_q133_acia[0].target()), write8_delegate(FUNC(mos6551_device::write),m_q133_acia[0].target()));
- space->install_readwrite_handler(0xfc84, 0xfc87, read8_delegate(FUNC(mos6551_device::read),m_q133_acia[1].target()), write8_delegate(FUNC(mos6551_device::write),m_q133_acia[1].target()));
- space->install_readwrite_handler(0xfc88, 0xfc8b, read8_delegate(FUNC(mos6551_device::read),m_q133_acia[2].target()), write8_delegate(FUNC(mos6551_device::write),m_q133_acia[2].target()));
- space->install_readwrite_handler(0xfc8c, 0xfc8f, read8_delegate(FUNC(mos6551_device::read),m_q133_acia[3].target()), write8_delegate(FUNC(mos6551_device::write),m_q133_acia[3].target()));
- space->install_readwrite_handler(0xfc90, 0xfc97, read8_delegate(FUNC(ptm6840_device::read),m_q133_ptm.target()), write8_delegate(FUNC(ptm6840_device::write),m_q133_ptm.target()));
+ space->install_readwrite_handler(0xfc80, 0xfc83, read8sm_delegate(FUNC(mos6551_device::read),m_q133_acia[0].target()), write8sm_delegate(FUNC(mos6551_device::write),m_q133_acia[0].target()));
+ space->install_readwrite_handler(0xfc84, 0xfc87, read8sm_delegate(FUNC(mos6551_device::read),m_q133_acia[1].target()), write8sm_delegate(FUNC(mos6551_device::write),m_q133_acia[1].target()));
+ space->install_readwrite_handler(0xfc88, 0xfc8b, read8sm_delegate(FUNC(mos6551_device::read),m_q133_acia[2].target()), write8sm_delegate(FUNC(mos6551_device::write),m_q133_acia[2].target()));
+ space->install_readwrite_handler(0xfc8c, 0xfc8f, read8sm_delegate(FUNC(mos6551_device::read),m_q133_acia[3].target()), write8sm_delegate(FUNC(mos6551_device::write),m_q133_acia[3].target()));
+ space->install_readwrite_handler(0xfc90, 0xfc97, read8sm_delegate(FUNC(ptm6840_device::read),m_q133_ptm.target()), write8sm_delegate(FUNC(ptm6840_device::write),m_q133_ptm.target()));
space->install_readwrite_handler(0xfcbc, 0xfcbc, read8_delegate(FUNC(cmi_state::cmi07_r),this), write8_delegate(FUNC(cmi_state::cmi07_w),this));
space->install_read_handler(0xfcc0, 0xfcc3, read8_delegate(FUNC(cmi_state::lightpen_r),this));
- space->install_readwrite_handler(0xfcc4, 0xfcc7, read8_delegate(FUNC(pia6821_device::read),m_q219_pia.target()), write8_delegate(FUNC(pia6821_device::write),m_q219_pia.target()));
- space->install_readwrite_handler(0xfcc8, 0xfccf, read8_delegate(FUNC(ptm6840_device::read),m_q219_ptm.target()), write8_delegate(FUNC(ptm6840_device::write),m_q219_ptm.target()));
+ space->install_readwrite_handler(0xfcc4, 0xfcc7, read8sm_delegate(FUNC(pia6821_device::read),m_q219_pia.target()), write8sm_delegate(FUNC(pia6821_device::write),m_q219_pia.target()));
+ space->install_readwrite_handler(0xfcc8, 0xfccf, read8sm_delegate(FUNC(ptm6840_device::read),m_q219_ptm.target()), write8sm_delegate(FUNC(ptm6840_device::write),m_q219_ptm.target()));
space->install_readwrite_handler(0xfcd0, 0xfcdc, read8_delegate(FUNC(cmi_state::video_r),this), write8_delegate(FUNC(cmi_state::video_w),this));
space->install_readwrite_handler(0xfce0, 0xfce1, read8_delegate(FUNC(cmi_state::fdc_r),this), write8_delegate(FUNC(cmi_state::fdc_w),this));
space->nop_readwrite(0xfce2, 0xfcef); // Monitor ROM will attempt to detect floppy disk controller cards in this entire range
- space->install_readwrite_handler(0xfcf0, 0xfcf7, read8_delegate(FUNC(pia6821_device::read),m_q133_pia[0].target()), write8_delegate(FUNC(pia6821_device::write),m_q133_pia[0].target()));
- space->install_readwrite_handler(0xfcf8, 0xfcff, read8_delegate(FUNC(pia6821_device::read),m_q133_pia[1].target()), write8_delegate(FUNC(pia6821_device::write),m_q133_pia[1].target()));
+ space->install_readwrite_handler(0xfcf0, 0xfcf7, read8sm_delegate(FUNC(pia6821_device::read),m_q133_pia[0].target()), write8sm_delegate(FUNC(pia6821_device::write),m_q133_pia[0].target()));
+ space->install_readwrite_handler(0xfcf8, 0xfcff, read8sm_delegate(FUNC(pia6821_device::read),m_q133_pia[1].target()), write8sm_delegate(FUNC(pia6821_device::write),m_q133_pia[1].target()));
space->install_write_handler(0xfcfc, 0xfcfc, write8_delegate(FUNC(cmi_state::i8214_cpu1_w),this));
space->install_write_handler(0xfcfd, 0xfcfd, write8_delegate(FUNC(cmi_state::i8214_cpu2_w),this));
@@ -2158,43 +2158,44 @@ static void cmi2x_floppies(device_slot_interface &device)
device.option_add("8dssd", FLOPPY_8_DSSD);
}
-MACHINE_CONFIG_START(cmi_state::cmi2x)
- MCFG_DEVICE_ADD("maincpu1", MC6809E, Q209_CPU_CLOCK)
- MCFG_DEVICE_PROGRAM_MAP(maincpu1_map)
- MCFG_DEVICE_IRQ_ACKNOWLEDGE_DRIVER(cmi_state, cpu1_interrupt_callback)
- MCFG_QUANTUM_PERFECT_CPU("maincpu1")
+void cmi_state::cmi2x(machine_config &config)
+{
+ MC6809E(config, m_maincpu1, Q209_CPU_CLOCK);
+ m_maincpu1->set_addrmap(AS_PROGRAM, &cmi_state::maincpu1_map);
+ m_maincpu1->set_irq_acknowledge_callback(FUNC(cmi_state::cpu1_interrupt_callback));
+ config.m_perfect_cpu_quantum = subtag("maincpu1");
- MCFG_DEVICE_ADD("maincpu2", MC6809E, Q209_CPU_CLOCK)
- MCFG_DEVICE_PROGRAM_MAP(maincpu2_map)
- MCFG_DEVICE_IRQ_ACKNOWLEDGE_DRIVER(cmi_state, cpu2_interrupt_callback)
- MCFG_QUANTUM_PERFECT_CPU("maincpu2")
+ MC6809E(config, m_maincpu2, Q209_CPU_CLOCK);
+ m_maincpu2->set_addrmap(AS_PROGRAM, &cmi_state::maincpu2_map);
+ m_maincpu2->set_irq_acknowledge_callback(FUNC(cmi_state::cpu2_interrupt_callback));
+ config.m_perfect_cpu_quantum = subtag("maincpu2");
- MCFG_DEVICE_ADD("muskeys", M6802, 4_MHz_XTAL)
- MCFG_DEVICE_PROGRAM_MAP(muskeys_map)
+ M6802(config, m_muskeyscpu, 4_MHz_XTAL);
+ m_muskeyscpu->set_addrmap(AS_PROGRAM, &cmi_state::muskeys_map);
- MCFG_DEVICE_ADD("alphakeys", M6802, 3.84_MHz_XTAL)
- MCFG_DEVICE_PROGRAM_MAP(alphakeys_map)
- MCFG_DEVICE_PERIODIC_INT_DRIVER(cmi_state, irq0_line_hold, 3.84_MHz_XTAL / 400) // TODO: PIA controls this
+ M6802(config, m_alphakeyscpu, 3.84_MHz_XTAL);
+ m_alphakeyscpu->set_addrmap(AS_PROGRAM, &cmi_state::alphakeys_map);
+ m_alphakeyscpu->set_periodic_int(FUNC(cmi_state::irq0_line_hold), attotime::from_hz(3.84_MHz_XTAL / 400)); // TODO: PIA controls this
- MCFG_DEVICE_ADD("smptemidi", M68000, 20_MHz_XTAL / 2)
- MCFG_DEVICE_PROGRAM_MAP(midicpu_map)
+ M68000(config, m_midicpu, 20_MHz_XTAL / 2);
+ m_midicpu->set_addrmap(AS_PROGRAM, &cmi_state::midicpu_map);
- MCFG_DEVICE_ADD("cmi07cpu", MC6809E, Q209_CPU_CLOCK) // ?
- MCFG_DEVICE_PROGRAM_MAP(cmi07cpu_map)
+ MC6809E(config, m_cmi07cpu, Q209_CPU_CLOCK); // ?
+ m_cmi07cpu->set_addrmap(AS_PROGRAM, &cmi_state::cmi07cpu_map);
/* alpha-numeric display */
- MCFG_DEVICE_ADD("dp1", DL1416T, u32(0))
- MCFG_DL1416_UPDATE_HANDLER(WRITE16(*this, cmi_state, cmi_iix_update_dp<0>))
- MCFG_DEVICE_ADD("dp2", DL1416T, u32(0))
- MCFG_DL1416_UPDATE_HANDLER(WRITE16(*this, cmi_state, cmi_iix_update_dp<1>))
- MCFG_DEVICE_ADD("dp3", DL1416T, u32(0))
- MCFG_DL1416_UPDATE_HANDLER(WRITE16(*this, cmi_state, cmi_iix_update_dp<2>))
+ DL1416T(config, m_dp1, u32(0));
+ m_dp1->update().set(FUNC(cmi_state::cmi_iix_update_dp<0>));
+ DL1416T(config, m_dp2, u32(0));
+ m_dp2->update().set(FUNC(cmi_state::cmi_iix_update_dp<1>));
+ DL1416T(config, m_dp3, u32(0));
+ m_dp3->update().set(FUNC(cmi_state::cmi_iix_update_dp<2>));
/* video hardware */
- MCFG_SCREEN_ADD_MONOCHROME("screen", RASTER, rgb_t::green())
- MCFG_SCREEN_RAW_PARAMS(PIXEL_CLOCK, HTOTAL, HBLANK_END, HBLANK_START, VTOTAL, VBLANK_END, VBLANK_START)
- MCFG_SCREEN_UPDATE_DRIVER(cmi_state, screen_update_cmi2x)
- MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE(*this, cmi_state, cmi_iix_vblank))
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER, rgb_t::green());
+ m_screen->set_raw(PIXEL_CLOCK, HTOTAL, HBLANK_END, HBLANK_START, VTOTAL, VBLANK_END, VBLANK_START);
+ m_screen->set_screen_update(FUNC(cmi_state::screen_update_cmi2x));
+ m_screen->screen_vblank().set(FUNC(cmi_state::cmi_iix_vblank));
PALETTE(config, m_palette, palette_device::MONOCHROME);
@@ -2238,8 +2239,8 @@ MACHINE_CONFIG_START(cmi_state::cmi2x)
m_cmi02_ptm->o2_callback().set(FUNC(cmi_state::cmi02_ptm_o2));
m_cmi02_ptm->irq_callback().set(FUNC(cmi_state::cmi02_ptm_irq));
- MCFG_DEVICE_ADD("mkbd_acia_clock", CLOCK, 1.8432_MHz_XTAL / 12)
- MCFG_CLOCK_SIGNAL_HANDLER(WRITELINE(*this, cmi_state, mkbd_acia_clock))
+ clock_device &mkbd_acia_clock(CLOCK(config, "mkbd_acia_clock", 1.8432_MHz_XTAL / 12));
+ mkbd_acia_clock.signal_handler().set(FUNC(cmi_state::mkbd_acia_clock));
for (auto &acia : m_q133_acia)
MOS6551(config, acia, 1.8432_MHz_XTAL).set_xtal(1.8432_MHz_XTAL);
@@ -2265,8 +2266,7 @@ MACHINE_CONFIG_START(cmi_state::cmi2x)
m_acia_mkbd_kbd->rts_handler().set("ank_pia", FUNC(pia6821_device::ca2_w));
m_acia_mkbd_kbd->irq_handler().set(FUNC(cmi_state::mkbd_kbd_acia_int));
- MCFG_INPUT_MERGER_ANY_HIGH("irqs")
- MCFG_INPUT_MERGER_OUTPUT_HANDLER(INPUTLINE("alphakeys", M6802_IRQ_LINE))
+ INPUT_MERGER_ANY_HIGH(config, "irqs").output_handler().set_inputline(m_alphakeyscpu, M6802_IRQ_LINE);
m_ank_pia->readpa_handler().set(FUNC(cmi_state::ank_col_r));
m_ank_pia->readcb1_handler().set(FUNC(cmi_state::ank_rts_r));
@@ -2275,8 +2275,8 @@ MACHINE_CONFIG_START(cmi_state::cmi2x)
m_ank_pia->irqa_handler().set("irqs", FUNC(input_merger_device::in_w<0>));
m_ank_pia->irqb_handler().set("irqs", FUNC(input_merger_device::in_w<1>));
- MCFG_DEVICE_ADD("ank_pia_clock", CLOCK, 9600)
- MCFG_CLOCK_SIGNAL_HANDLER(WRITELINE("ank_pia", pia6821_device, ca1_w))
+ clock_device &ank_pia_clock(CLOCK(config, "ank_pia_clock", 9600));
+ ank_pia_clock.signal_handler().set(m_ank_pia, FUNC(pia6821_device::ca1_w));
PTM6840(config, m_cmi07_ptm, 2000000); // ptm_cmi07_config TODO
m_cmi07_ptm->irq_callback().set(FUNC(cmi_state::cmi07_irq));
@@ -2284,8 +2284,8 @@ MACHINE_CONFIG_START(cmi_state::cmi2x)
FD1791(config, m_wd1791, 16_MHz_XTAL / 8); // wd1791_interface
m_wd1791->intrq_wr_callback().set(FUNC(cmi_state::wd1791_irq));
m_wd1791->drq_wr_callback().set(FUNC(cmi_state::wd1791_drq));
- MCFG_FLOPPY_DRIVE_ADD("wd1791:0", cmi2x_floppies, "8dsdd", floppy_image_device::default_floppy_formats)
- MCFG_FLOPPY_DRIVE_ADD("wd1791:1", cmi2x_floppies, "8dsdd", floppy_image_device::default_floppy_formats)
+ FLOPPY_CONNECTOR(config, "wd1791:0", cmi2x_floppies, "8dsdd", floppy_image_device::default_floppy_formats);
+ FLOPPY_CONNECTOR(config, "wd1791:1", cmi2x_floppies, "8dsdd", floppy_image_device::default_floppy_formats);
/* Musical keyboard */
PIA6821(config, m_cmi10_pia_u20, 0);
@@ -2325,7 +2325,7 @@ MACHINE_CONFIG_START(cmi_state::cmi2x)
cmi01a_device &cmi01a_7(CMI01A_CHANNEL_CARD(config, "cmi01a_7", 0));
cmi01a_7.add_route(ALL_OUTPUTS, "mono", 0.25);
cmi01a_7.irq_callback().set(FUNC(cmi_state::channel_irq<0>));
-MACHINE_CONFIG_END
+}
ROM_START( cmi2x )
/* Q133 Processor control card */
diff --git a/src/mame/drivers/cmmb.cpp b/src/mame/drivers/cmmb.cpp
index ecf1a90ca71..8b8a811fe07 100644
--- a/src/mame/drivers/cmmb.cpp
+++ b/src/mame/drivers/cmmb.cpp
@@ -146,12 +146,12 @@ WRITE8_MEMBER(cmmb_state::cmmb_charram_w)
READ8_MEMBER(cmmb_state::flash_r)
{
- return m_flash->read(space, offset + 0x2000);
+ return m_flash->read(offset + 0x2000);
}
WRITE8_MEMBER(cmmb_state::flash_w)
{
- m_flash->write(space, offset + 0x2000, data);
+ m_flash->write(offset + 0x2000, data);
}
READ8_MEMBER(cmmb_state::cmmb_input_r)
@@ -416,31 +416,31 @@ void cmmb_state::machine_reset()
}
-MACHINE_CONFIG_START(cmmb_state::cmmb)
-
+void cmmb_state::cmmb(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M65SC02, MAIN_CLOCK/5) // Unknown clock, but chip rated for 14MHz
- MCFG_DEVICE_PROGRAM_MAP(cmmb_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", cmmb_state, vblank_irq)
+ M65SC02(config, m_maincpu, MAIN_CLOCK/5); // Unknown clock, but chip rated for 14MHz
+ m_maincpu->set_addrmap(AS_PROGRAM, &cmmb_state::cmmb_map);
+ m_maincpu->set_vblank_int("screen", FUNC(cmmb_state::vblank_irq));
AT29C020(config, "at29c020");
ADDRESS_MAP_BANK(config, "bnk2000").set_map(&cmmb_state::bnk2000_map).set_options(ENDIANNESS_LITTLE, 8, 32, 0x8000);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_RAW_PARAMS(MAIN_CLOCK/12, 384, 0, 256, 264, 0, 240) // TBD, not real measurements
- MCFG_SCREEN_UPDATE_DRIVER(cmmb_state, screen_update_cmmb)
- MCFG_SCREEN_PALETTE(m_palette)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_raw(MAIN_CLOCK/12, 384, 0, 256, 264, 0, 240); // TBD, not real measurements
+ screen.set_screen_update(FUNC(cmmb_state::screen_update_cmmb));
+ screen.set_palette(m_palette);
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_cmmb)
+ GFXDECODE(config, m_gfxdecode, m_palette, gfx_cmmb);
PALETTE(config, m_palette).set_format(palette_device::RGB_332_inverted, 512);
/* sound hardware */
// SPEAKER(config, "mono").front_center();
// AY8910(config, "aysnd", 8000000/4).add_route(ALL_OUTPUTS, "mono", 0.30);
-MACHINE_CONFIG_END
+}
/***************************************************************************
diff --git a/src/mame/drivers/cms.cpp b/src/mame/drivers/cms.cpp
index 4d9090a0577..02283669b7d 100644
--- a/src/mame/drivers/cms.cpp
+++ b/src/mame/drivers/cms.cpp
@@ -276,7 +276,7 @@ void cms_state::cms6502(machine_config &config)
/* 7 Slot Backplane */
ACORN_BUS(config, m_bus, 0);
- m_bus->set_cputag(m_maincpu);
+ m_bus->set_space(m_maincpu, AS_PROGRAM);
m_bus->out_irq_callback().set(m_irqs, FUNC(input_merger_device::in_w<1>));
m_bus->out_nmi_callback().set(FUNC(cms_state::bus_nmi_w));
ACORN_BUS_SLOT(config, "bus1", m_bus, cms_bus_devices, "4080term");
diff --git a/src/mame/drivers/cninja.cpp b/src/mame/drivers/cninja.cpp
index 6f2b1e92b90..5bd7276e6ca 100644
--- a/src/mame/drivers/cninja.cpp
+++ b/src/mame/drivers/cninja.cpp
@@ -791,11 +791,11 @@ MACHINE_RESET_MEMBER(cninja_state,robocop2)
m_priority = 0;
}
-MACHINE_CONFIG_START(cninja_state::cninja)
-
+void cninja_state::cninja(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M68000, XTAL(24'000'000) / 2)
- MCFG_DEVICE_PROGRAM_MAP(cninja_map)
+ M68000(config, m_maincpu, XTAL(24'000'000) / 2);
+ m_maincpu->set_addrmap(AS_PROGRAM, &cninja_state::cninja_map);
h6280_device &audiocpu(H6280(config, m_audiocpu, XTAL(32'220'000) / 8));
audiocpu.set_addrmap(AS_PROGRAM, &cninja_state::sound_map);
@@ -808,15 +808,15 @@ MACHINE_CONFIG_START(cninja_state::cninja)
irq.vblank_irq_callback().set_inputline(m_maincpu, 5);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_RAW_PARAMS(XTAL(24'000'000) / 4, 376, 0, 256, 274, 8, 248)
- MCFG_SCREEN_UPDATE_DRIVER(cninja_state, screen_update_cninja)
- MCFG_SCREEN_PALETTE(m_palette)
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_raw(XTAL(24'000'000) / 4, 376, 0, 256, 274, 8, 248);
+ m_screen->set_screen_update(FUNC(cninja_state::screen_update_cninja));
+ m_screen->set_palette(m_palette);
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_cninja)
+ GFXDECODE(config, m_gfxdecode, m_palette, gfx_cninja);
PALETTE(config, m_palette).set_format(palette_device::xBGR_888, 2048);
- MCFG_DEVICE_ADD("spriteram1", BUFFERED_SPRITERAM16)
+ BUFFERED_SPRITERAM16(config, m_spriteram[0]);
DECO16IC(config, m_deco_tilegen[0], 0);
m_deco_tilegen[0]->set_split(1);
@@ -863,8 +863,7 @@ MACHINE_CONFIG_START(cninja_state::cninja)
/* sound hardware */
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("ym1", YM2203, XTAL(32'220'000) / 8)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.60)
+ YM2203(config, "ym1", XTAL(32'220'000) / 8).add_route(ALL_OUTPUTS, "mono", 0.60);
ym2151_device &ym2(YM2151(config, "ym2", XTAL(32'220'000) / 9));
ym2.irq_handler().set_inputline(m_audiocpu, 1); /* IRQ2 */
@@ -872,22 +871,20 @@ MACHINE_CONFIG_START(cninja_state::cninja)
ym2.add_route(0, "mono", 0.45);
ym2.add_route(1, "mono", 0.45);
- MCFG_DEVICE_ADD("oki1", OKIM6295, XTAL(32'220'000) / 32, okim6295_device::PIN7_HIGH)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.75)
-
- MCFG_DEVICE_ADD("oki2", OKIM6295, XTAL(32'220'000) / 16, okim6295_device::PIN7_HIGH)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.60)
-MACHINE_CONFIG_END
+ OKIM6295(config, "oki1", XTAL(32'220'000) / 32, okim6295_device::PIN7_HIGH).add_route(ALL_OUTPUTS, "mono", 0.75);
+ OKIM6295(config, m_oki2, XTAL(32'220'000) / 16, okim6295_device::PIN7_HIGH).add_route(ALL_OUTPUTS, "mono", 0.60);
+}
-MACHINE_CONFIG_START(cninja_state::stoneage)
+void cninja_state::stoneage(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M68000, XTAL(24'000'000) / 2)
- MCFG_DEVICE_PROGRAM_MAP(cninja_map)
+ M68000(config, m_maincpu, XTAL(24'000'000) / 2);
+ m_maincpu->set_addrmap(AS_PROGRAM, &cninja_state::cninja_map);
- MCFG_DEVICE_ADD("audiocpu", Z80, 3579545)
- MCFG_DEVICE_PROGRAM_MAP(stoneage_s_map)
+ Z80(config, m_audiocpu, 3579545);
+ m_audiocpu->set_addrmap(AS_PROGRAM, &cninja_state::stoneage_s_map);
deco_irq_device &irq(DECO_IRQ(config, "irq", 0));
irq.set_screen_tag(m_screen);
@@ -896,17 +893,17 @@ MACHINE_CONFIG_START(cninja_state::stoneage)
irq.vblank_irq_callback().set_inputline(m_maincpu, 5);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_RAW_PARAMS(XTAL(24'000'000) / 4, 376, 0, 256, 274, 8, 248)
- MCFG_SCREEN_UPDATE_DRIVER(cninja_state, screen_update_cninja)
- MCFG_SCREEN_PALETTE(m_palette)
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_raw(XTAL(24'000'000) / 4, 376, 0, 256, 274, 8, 248);
+ m_screen->set_screen_update(FUNC(cninja_state::screen_update_cninja));
+ m_screen->set_palette(m_palette);
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_cninja)
+ GFXDECODE(config, m_gfxdecode, m_palette, gfx_cninja);
PALETTE(config, m_palette).set_format(palette_device::xBGR_888, 2048);
MCFG_VIDEO_START_OVERRIDE(cninja_state,stoneage)
- MCFG_DEVICE_ADD("spriteram1", BUFFERED_SPRITERAM16)
+ BUFFERED_SPRITERAM16(config, m_spriteram[0]);
DECO16IC(config, m_deco_tilegen[0], 0);
m_deco_tilegen[0]->set_split(1);
@@ -958,35 +955,33 @@ MACHINE_CONFIG_START(cninja_state::stoneage)
ymsnd.add_route(0, "mono", 0.45);
ymsnd.add_route(1, "mono", 0.45);
- MCFG_DEVICE_ADD("oki1", OKIM6295, XTAL(32'220'000) / 32, okim6295_device::PIN7_HIGH)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.75)
-MACHINE_CONFIG_END
+ OKIM6295(config, "oki1", XTAL(32'220'000) / 32, okim6295_device::PIN7_HIGH).add_route(ALL_OUTPUTS, "mono", 0.75);
+}
-MACHINE_CONFIG_START(cninja_state::cninjabl2)
+void cninja_state::cninjabl2(machine_config &config)
+{
stoneage(config);
- MCFG_DEVICE_MODIFY("audiocpu")
- MCFG_DEVICE_PROGRAM_MAP(cninjabl2_s_map)
+ m_audiocpu->set_addrmap(AS_PROGRAM, &cninja_state::cninjabl2_s_map);
- MCFG_SCREEN_MODIFY("screen")
- MCFG_SCREEN_UPDATE_DRIVER(cninja_state, screen_update_cninjabl2)
+ m_screen->set_screen_update(FUNC(cninja_state::screen_update_cninjabl2));
m_ioprot->soundlatch_irq_cb().set_inputline(m_audiocpu, INPUT_LINE_IRQ0);
- MCFG_DEVICE_REMOVE("ymsnd")
-
- MCFG_DEVICE_REPLACE("oki1", OKIM6295, XTAL(32'220'000) / 32, okim6295_device::PIN7_LOW)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
- MCFG_DEVICE_ADDRESS_MAP(0, cninjabl2_oki_map)
-MACHINE_CONFIG_END
+ config.device_remove("ymsnd");
-MACHINE_CONFIG_START(cninja_state::cninjabl)
+ okim6295_device &oki1(OKIM6295(config.replace(), "oki1", XTAL(32'220'000) / 32, okim6295_device::PIN7_LOW));
+ oki1.add_route(ALL_OUTPUTS, "mono", 1.0);
+ oki1.set_addrmap(0, &cninja_state::cninjabl2_oki_map);
+}
+void cninja_state::cninjabl(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M68000, XTAL(24'000'000) / 2)
- MCFG_DEVICE_PROGRAM_MAP(cninjabl_map)
+ M68000(config, m_maincpu, XTAL(24'000'000) / 2);
+ m_maincpu->set_addrmap(AS_PROGRAM, &cninja_state::cninjabl_map);
- MCFG_DEVICE_ADD("audiocpu", Z80, 3579545)
- MCFG_DEVICE_PROGRAM_MAP(cninjabl_sound_map)
+ Z80(config, m_audiocpu, 3579545);
+ m_audiocpu->set_addrmap(AS_PROGRAM, &cninja_state::cninjabl_sound_map);
deco_irq_device &irq(DECO_IRQ(config, "irq", 0));
irq.set_screen_tag(m_screen);
@@ -995,15 +990,15 @@ MACHINE_CONFIG_START(cninja_state::cninjabl)
irq.vblank_irq_callback().set_inputline(m_maincpu, 5);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_RAW_PARAMS(XTAL(24'000'000) / 4, 376, 0, 256, 274, 8, 248)
- MCFG_SCREEN_UPDATE_DRIVER(cninja_state, screen_update_cninjabl)
- MCFG_SCREEN_PALETTE(m_palette)
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_raw(XTAL(24'000'000) / 4, 376, 0, 256, 274, 8, 248);
+ m_screen->set_screen_update(FUNC(cninja_state::screen_update_cninjabl));
+ m_screen->set_palette(m_palette);
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_cninjabl)
+ GFXDECODE(config, m_gfxdecode, m_palette, gfx_cninjabl);
PALETTE(config, m_palette).set_format(palette_device::xBGR_888, 2048);
- MCFG_DEVICE_ADD("spriteram1", BUFFERED_SPRITERAM16)
+ BUFFERED_SPRITERAM16(config, m_spriteram[0]);
DECO16IC(config, m_deco_tilegen[0], 0);
m_deco_tilegen[0]->set_split(1);
@@ -1046,16 +1041,15 @@ MACHINE_CONFIG_START(cninja_state::cninjabl)
ymsnd.add_route(0, "mono", 0.45);
ymsnd.add_route(1, "mono", 0.45);
- MCFG_DEVICE_ADD("oki1", OKIM6295, XTAL(32'220'000) / 32, okim6295_device::PIN7_HIGH)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.75)
-MACHINE_CONFIG_END
-
+ OKIM6295(config, "oki1", XTAL(32'220'000) / 32, okim6295_device::PIN7_HIGH).add_route(ALL_OUTPUTS, "mono", 0.75);
+}
-MACHINE_CONFIG_START(cninja_state::edrandy)
+void cninja_state::edrandy(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M68000, XTAL(24'000'000) / 2)
- MCFG_DEVICE_PROGRAM_MAP(edrandy_map)
+ M68000(config, m_maincpu, XTAL(24'000'000) / 2);
+ m_maincpu->set_addrmap(AS_PROGRAM, &cninja_state::edrandy_map);
h6280_device &audiocpu(H6280(config, m_audiocpu, XTAL(32'220'000) / 8));
audiocpu.set_addrmap(AS_PROGRAM, &cninja_state::sound_map);
@@ -1068,15 +1062,15 @@ MACHINE_CONFIG_START(cninja_state::edrandy)
irq.vblank_irq_callback().set_inputline(m_maincpu, 5);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_RAW_PARAMS(XTAL(24'000'000) / 4, 376, 0, 256, 274, 8, 248)
- MCFG_SCREEN_UPDATE_DRIVER(cninja_state, screen_update_edrandy)
- MCFG_SCREEN_PALETTE(m_palette)
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_raw(XTAL(24'000'000) / 4, 376, 0, 256, 274, 8, 248);
+ m_screen->set_screen_update(FUNC(cninja_state::screen_update_edrandy));
+ m_screen->set_palette(m_palette);
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_cninja)
+ GFXDECODE(config, m_gfxdecode, m_palette, gfx_cninja);
PALETTE(config, m_palette).set_format(palette_device::xBGR_888, 2048);
- MCFG_DEVICE_ADD("spriteram1", BUFFERED_SPRITERAM16)
+ BUFFERED_SPRITERAM16(config, m_spriteram[0]);
DECO16IC(config, m_deco_tilegen[0], 0);
m_deco_tilegen[0]->set_split(0);
@@ -1122,8 +1116,7 @@ MACHINE_CONFIG_START(cninja_state::edrandy)
/* sound hardware */
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("ym1", YM2203, XTAL(32'220'000) / 8)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.60)
+ YM2203(config, "ym1", XTAL(32'220'000) / 8).add_route(ALL_OUTPUTS, "mono", 0.60);
ym2151_device &ym2(YM2151(config, "ym2", XTAL(32'220'000) / 9));
ym2.irq_handler().set_inputline(m_audiocpu, 1); /* IRQ2 */
@@ -1131,19 +1124,17 @@ MACHINE_CONFIG_START(cninja_state::edrandy)
ym2.add_route(0, "mono", 0.45);
ym2.add_route(1, "mono", 0.45);
- MCFG_DEVICE_ADD("oki1", OKIM6295, XTAL(32'220'000) / 32, okim6295_device::PIN7_HIGH)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.75)
-
- MCFG_DEVICE_ADD("oki2", OKIM6295, XTAL(32'220'000) / 16, okim6295_device::PIN7_HIGH)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.60)
-MACHINE_CONFIG_END
+ OKIM6295(config, "oki1", XTAL(32'220'000) / 32, okim6295_device::PIN7_HIGH).add_route(ALL_OUTPUTS, "mono", 0.75);
+ OKIM6295(config, m_oki2, XTAL(32'220'000) / 16, okim6295_device::PIN7_HIGH).add_route(ALL_OUTPUTS, "mono", 0.60);
+}
-MACHINE_CONFIG_START(cninja_state::robocop2)
+void cninja_state::robocop2(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M68000, XTAL(28'000'000) / 2)
- MCFG_DEVICE_PROGRAM_MAP(robocop2_map)
+ M68000(config, m_maincpu, XTAL(28'000'000) / 2);
+ m_maincpu->set_addrmap(AS_PROGRAM, &cninja_state::robocop2_map);
h6280_device &audiocpu(H6280(config, m_audiocpu, XTAL(32'220'000) / 8));
audiocpu.set_addrmap(AS_PROGRAM, &cninja_state::sound_map);
@@ -1157,18 +1148,18 @@ MACHINE_CONFIG_START(cninja_state::robocop2)
irq.vblank_irq_callback().set_inputline(m_maincpu, 5);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_RAW_PARAMS(XTAL(28'000'000) / 4, 442, 0, 320, 274, 8, 248)
- MCFG_SCREEN_UPDATE_DRIVER(cninja_state, screen_update_robocop2)
- MCFG_SCREEN_PALETTE(m_palette)
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_raw(XTAL(28'000'000) / 4, 442, 0, 320, 274, 8, 248);
+ m_screen->set_screen_update(FUNC(cninja_state::screen_update_robocop2));
+ m_screen->set_palette(m_palette);
MCFG_MACHINE_START_OVERRIDE(cninja_state,robocop2)
MCFG_MACHINE_RESET_OVERRIDE(cninja_state,robocop2)
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_robocop2)
+ GFXDECODE(config, m_gfxdecode, m_palette, gfx_robocop2);
PALETTE(config, m_palette).set_format(palette_device::xBGR_888, 2048);
- MCFG_DEVICE_ADD("spriteram1", BUFFERED_SPRITERAM16)
+ BUFFERED_SPRITERAM16(config, m_spriteram[0]);
DECO16IC(config, m_deco_tilegen[0], 0);
m_deco_tilegen[0]->set_split(0);
@@ -1217,9 +1208,9 @@ MACHINE_CONFIG_START(cninja_state::robocop2)
SPEAKER(config, "lspeaker").front_left();
SPEAKER(config, "rspeaker").front_right();
- MCFG_DEVICE_ADD("ym1", YM2203, XTAL(32'220'000) / 8)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 0.60)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 0.60)
+ ym2203_device &ym1(YM2203(config, "ym1", XTAL(32'220'000) / 8));
+ ym1.add_route(ALL_OUTPUTS, "lspeaker", 0.60);
+ ym1.add_route(ALL_OUTPUTS, "rspeaker", 0.60);
ym2151_device &ym2(YM2151(config, "ym2", XTAL(32'220'000) / 9));
ym2.irq_handler().set_inputline(m_audiocpu, 1); /* IRQ2 */
@@ -1227,22 +1218,22 @@ MACHINE_CONFIG_START(cninja_state::robocop2)
ym2.add_route(0, "lspeaker", 0.45);
ym2.add_route(1, "rspeaker", 0.45);
- MCFG_DEVICE_ADD("oki1", OKIM6295, XTAL(32'220'000) / 32, okim6295_device::PIN7_HIGH)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 0.75)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 0.75)
-
- MCFG_DEVICE_ADD("oki2", OKIM6295, XTAL(32'220'000) / 16, okim6295_device::PIN7_HIGH)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 0.60)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 0.60)
-MACHINE_CONFIG_END
+ okim6295_device &oki1(OKIM6295(config, "oki1", XTAL(32'220'000) / 32, okim6295_device::PIN7_HIGH));
+ oki1.add_route(ALL_OUTPUTS, "lspeaker", 0.75);
+ oki1.add_route(ALL_OUTPUTS, "rspeaker", 0.75);
+ OKIM6295(config, m_oki2, XTAL(32'220'000) / 16, okim6295_device::PIN7_HIGH);
+ m_oki2->add_route(ALL_OUTPUTS, "lspeaker", 0.60);
+ m_oki2->add_route(ALL_OUTPUTS, "rspeaker", 0.60);
+}
-MACHINE_CONFIG_START(cninja_state::mutantf)
+void cninja_state::mutantf(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M68000, XTAL(28'000'000) / 2)
- MCFG_DEVICE_PROGRAM_MAP(mutantf_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", cninja_state, irq6_line_hold)
+ M68000(config, m_maincpu, XTAL(28'000'000) / 2);
+ m_maincpu->set_addrmap(AS_PROGRAM, &cninja_state::mutantf_map);
+ m_maincpu->set_vblank_int("screen", FUNC(cninja_state::irq6_line_hold));
h6280_device &audiocpu(H6280(config, m_audiocpu, XTAL(32'220'000) / 8));
audiocpu.set_addrmap(AS_PROGRAM, &cninja_state::sound_map_mutantf);
@@ -1250,19 +1241,19 @@ MACHINE_CONFIG_START(cninja_state::mutantf)
audiocpu.add_route(ALL_OUTPUTS, "rspeaker", 0);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_RAW_PARAMS(XTAL(28'000'000) / 4, 442, 0, 320, 274, 8, 248) // same as robocop2? verify this from real pcb
- MCFG_SCREEN_UPDATE_DRIVER(cninja_state, screen_update_mutantf)
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_raw(XTAL(28'000'000) / 4, 442, 0, 320, 274, 8, 248); // same as robocop2? verify this from real pcb
+ m_screen->set_screen_update(FUNC(cninja_state::screen_update_mutantf));
MCFG_MACHINE_START_OVERRIDE(cninja_state,robocop2)
MCFG_MACHINE_RESET_OVERRIDE(cninja_state,robocop2)
MCFG_VIDEO_START_OVERRIDE(cninja_state,mutantf)
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_mutantf)
+ GFXDECODE(config, m_gfxdecode, m_palette, gfx_mutantf);
PALETTE(config, m_palette).set_format(palette_device::xBGR_888, 2048);
- MCFG_DEVICE_ADD("spriteram1", BUFFERED_SPRITERAM16)
- MCFG_DEVICE_ADD("spriteram2", BUFFERED_SPRITERAM16)
+ BUFFERED_SPRITERAM16(config, m_spriteram[0]);
+ BUFFERED_SPRITERAM16(config, m_spriteram[1]);
DECO16IC(config, m_deco_tilegen[0], 0);
m_deco_tilegen[0]->set_split(0);
@@ -1320,14 +1311,14 @@ MACHINE_CONFIG_START(cninja_state::mutantf)
ymsnd.add_route(0, "lspeaker", 0.45);
ymsnd.add_route(1, "rspeaker", 0.45);
- MCFG_DEVICE_ADD("oki1", OKIM6295, XTAL(32'220'000) / 32, okim6295_device::PIN7_HIGH)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 0.75)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 0.75)
+ okim6295_device &oki1(OKIM6295(config, "oki1", XTAL(32'220'000) / 32, okim6295_device::PIN7_HIGH));
+ oki1.add_route(ALL_OUTPUTS, "lspeaker", 0.75);
+ oki1.add_route(ALL_OUTPUTS, "rspeaker", 0.75);
- MCFG_DEVICE_ADD("oki2", OKIM6295, XTAL(32'220'000) / 16, okim6295_device::PIN7_HIGH)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 0.60)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 0.60)
-MACHINE_CONFIG_END
+ OKIM6295(config, m_oki2, XTAL(32'220'000) / 16, okim6295_device::PIN7_HIGH);
+ m_oki2->add_route(ALL_OUTPUTS, "lspeaker", 0.60);
+ m_oki2->add_route(ALL_OUTPUTS, "rspeaker", 0.60);
+}
/**********************************************************************************/
diff --git a/src/mame/drivers/cntsteer.cpp b/src/mame/drivers/cntsteer.cpp
index 5e79d57521d..8c51d520398 100644
--- a/src/mame/drivers/cntsteer.cpp
+++ b/src/mame/drivers/cntsteer.cpp
@@ -919,19 +919,19 @@ MACHINE_RESET_MEMBER(cntsteer_state,cntsteer)
MACHINE_RESET_CALL_MEMBER(zerotrgt);
}
-MACHINE_CONFIG_START(cntsteer_state::cntsteer)
-
+void cntsteer_state::cntsteer(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", MC6809E, 2000000) /* MC68B09E */
- MCFG_DEVICE_PROGRAM_MAP(cntsteer_cpu1_map)
+ MC6809E(config, m_maincpu, 2000000); /* MC68B09E */
+ m_maincpu->set_addrmap(AS_PROGRAM, &cntsteer_state::cntsteer_cpu1_map);
- MCFG_DEVICE_ADD("subcpu", MC6809E, 2000000) /* MC68B09E */
- MCFG_DEVICE_PROGRAM_MAP(cntsteer_cpu2_map)
-// MCFG_DEVICE_DISABLE()
+ MC6809E(config, m_subcpu, 2000000); /* MC68B09E */
+ m_subcpu->set_addrmap(AS_PROGRAM, &cntsteer_state::cntsteer_cpu2_map);
+// m_subcpu->set_disable();
- MCFG_DEVICE_ADD("audiocpu", M6502, 1500000) /* ? */
- MCFG_DEVICE_PROGRAM_MAP(sound_map)
- MCFG_DEVICE_PERIODIC_INT_DRIVER(cntsteer_state, sound_interrupt, 480)
+ M6502(config, m_audiocpu, 1500000); /* ? */
+ m_audiocpu->set_addrmap(AS_PROGRAM, &cntsteer_state::sound_map);
+ m_audiocpu->set_periodic_int(FUNC(cntsteer_state::sound_interrupt), attotime::from_hz(480));
MCFG_MACHINE_START_OVERRIDE(cntsteer_state,cntsteer)
MCFG_MACHINE_RESET_OVERRIDE(cntsteer_state,cntsteer)
@@ -947,8 +947,8 @@ MACHINE_CONFIG_START(cntsteer_state::cntsteer)
screen.screen_vblank().set_inputline(m_maincpu, INPUT_LINE_NMI); // ?
screen.screen_vblank().append(FUNC(cntsteer_state::subcpu_vblank_irq)); // ?
- MCFG_QUANTUM_PERFECT_CPU("maincpu")
- MCFG_QUANTUM_PERFECT_CPU("subcpu")
+ config.m_perfect_cpu_quantum = subtag("maincpu");
+ config.m_perfect_cpu_quantum = subtag("subcpu");
GFXDECODE(config, m_gfxdecode, m_palette, gfx_cntsteer);
PALETTE(config, m_palette).set_entries(256);
@@ -967,38 +967,39 @@ MACHINE_CONFIG_START(cntsteer_state::cntsteer)
AY8910(config, "ay2", 1500000).add_route(ALL_OUTPUTS, "speaker", 0.5);
- MCFG_DEVICE_ADD("dac", DAC_8BIT_R2R, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 0.25) // unknown DAC
- MCFG_DEVICE_ADD("vref", VOLTAGE_REGULATOR, 0) MCFG_VOLTAGE_REGULATOR_OUTPUT(5.0)
- MCFG_SOUND_ROUTE(0, "dac", 1.0, DAC_VREF_POS_INPUT) MCFG_SOUND_ROUTE(0, "dac", -1.0, DAC_VREF_NEG_INPUT)
-MACHINE_CONFIG_END
-
-MACHINE_CONFIG_START(cntsteer_state::zerotrgt)
+ DAC_8BIT_R2R(config, "dac", 0).add_route(ALL_OUTPUTS, "speaker", 0.25); // unknown DAC
+ voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref"));
+ vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT);
+ vref.add_route(0, "dac", -1.0, DAC_VREF_NEG_INPUT);
+}
+void cntsteer_state::zerotrgt(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", MC6809E, 2000000) /* ? */
- MCFG_DEVICE_PROGRAM_MAP(gekitsui_cpu1_map)
+ MC6809E(config, m_maincpu, 2000000); /* ? */
+ m_maincpu->set_addrmap(AS_PROGRAM, &cntsteer_state::gekitsui_cpu1_map);
- MCFG_DEVICE_ADD("subcpu", MC6809E, 2000000) /* ? */
- MCFG_DEVICE_PROGRAM_MAP(gekitsui_cpu2_map)
+ MC6809E(config, m_subcpu, 2000000); /* ? */
+ m_subcpu->set_addrmap(AS_PROGRAM, &cntsteer_state::gekitsui_cpu2_map);
- MCFG_DEVICE_ADD("audiocpu", M6502, 1500000) /* ? */
- MCFG_DEVICE_PROGRAM_MAP(sound_map)
- MCFG_DEVICE_PERIODIC_INT_DRIVER(cntsteer_state, sound_interrupt, 480)
+ M6502(config, m_audiocpu, 1500000); /* ? */
+ m_audiocpu->set_addrmap(AS_PROGRAM, &cntsteer_state::sound_map);
+ m_audiocpu->set_periodic_int(FUNC(cntsteer_state::sound_interrupt), attotime::from_hz(480));
- MCFG_QUANTUM_TIME(attotime::from_hz(6000))
+ config.m_minimum_quantum = attotime::from_hz(6000);
MCFG_MACHINE_START_OVERRIDE(cntsteer_state,zerotrgt)
MCFG_MACHINE_RESET_OVERRIDE(cntsteer_state,zerotrgt)
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */)
- MCFG_SCREEN_SIZE(256, 256)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 1*8, 31*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(cntsteer_state, screen_update_zerotrgt)
- MCFG_SCREEN_PALETTE(m_palette)
- MCFG_SCREEN_VBLANK_CALLBACK(INPUTLINE("maincpu", INPUT_LINE_NMI)) // ?
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500) /* not accurate */);
+ screen.set_size(256, 256);
+ screen.set_visarea(0*8, 32*8-1, 1*8, 31*8-1);
+ screen.set_screen_update(FUNC(cntsteer_state::screen_update_zerotrgt));
+ screen.set_palette(m_palette);
+ screen.screen_vblank().set_inputline(m_maincpu, INPUT_LINE_NMI); // ?
GFXDECODE(config, m_gfxdecode, m_palette, gfx_zerotrgt);
PALETTE(config, m_palette, FUNC(cntsteer_state::zerotrgt_palette), 256);
@@ -1013,7 +1014,7 @@ MACHINE_CONFIG_START(cntsteer_state::zerotrgt)
AY8910(config, "ay1", 1500000).add_route(ALL_OUTPUTS, "speaker", 0.5);
AY8910(config, "ay2", 1500000).add_route(ALL_OUTPUTS, "speaker", 0.5);
-MACHINE_CONFIG_END
+}
/***************************************************************************/
diff --git a/src/mame/drivers/cobra.cpp b/src/mame/drivers/cobra.cpp
index 3d358b5edaa..035c9ac6ea7 100644
--- a/src/mame/drivers/cobra.cpp
+++ b/src/mame/drivers/cobra.cpp
@@ -3305,25 +3305,23 @@ MACHINE_CONFIG_START(cobra_state::cobra)
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_SIZE(512, 400)
- MCFG_SCREEN_VISIBLE_AREA(0, 511, 0, 399)
- MCFG_SCREEN_UPDATE_DRIVER(cobra_state, screen_update_cobra)
- MCFG_PALETTE_ADD("palette", 65536)
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_refresh_hz(60);
+ m_screen->set_size(512, 400);
+ m_screen->set_visarea_full();
+ m_screen->set_screen_update(FUNC(cobra_state::screen_update_cobra));
+ PALETTE(config, m_palette).set_entries(65536);
SPEAKER(config, "lspeaker").front_left();
SPEAKER(config, "rspeaker").front_right();
- MCFG_DEVICE_ADD("rfsnd", RF5C400, XTAL(16'934'400))
- MCFG_SOUND_ROUTE(0, "lspeaker", 1.0)
- MCFG_SOUND_ROUTE(1, "rspeaker", 1.0)
+ rf5c400_device &rfsnd(RF5C400(config, "rfsnd", XTAL(16'934'400)));
+ rfsnd.add_route(0, "lspeaker", 1.0);
+ rfsnd.add_route(1, "rspeaker", 1.0);
- MCFG_DEVICE_ADD(m_dmadac[0], DMADAC)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 1.0)
+ DMADAC(config, m_dmadac[0]).add_route(ALL_OUTPUTS, "lspeaker", 1.0);
- MCFG_DEVICE_ADD(m_dmadac[1], DMADAC)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 1.0)
+ DMADAC(config, m_dmadac[1]).add_route(ALL_OUTPUTS, "rspeaker", 1.0);
M48T58(config, "m48t58", 0);
diff --git a/src/mame/drivers/coco12.cpp b/src/mame/drivers/coco12.cpp
index 2c4131efb74..45e0049cbef 100644
--- a/src/mame/drivers/coco12.cpp
+++ b/src/mame/drivers/coco12.cpp
@@ -378,27 +378,28 @@ void t4426_cart(device_slot_interface &device)
}
//-------------------------------------------------
-// MACHINE_CONFIG_START( coco_sound )
+// machine_config( coco_sound )
//-------------------------------------------------
-MACHINE_CONFIG_START(coco_state::coco_sound)
+void coco_state::coco_sound(machine_config &config)
+{
SPEAKER(config, "speaker").front_center();
// 6-bit D/A: R10-15 = 10K, 20K, 40.2K, 80.6K, 162K, 324K (according to parts list); output also controls joysticks
- MCFG_DEVICE_ADD("dac", DAC_6BIT_BINARY_WEIGHTED, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 0.125)
- MCFG_DEVICE_ADD("vref", VOLTAGE_REGULATOR, 0) MCFG_VOLTAGE_REGULATOR_OUTPUT(5.0)
- MCFG_SOUND_ROUTE(0, "dac", 1.0, DAC_VREF_POS_INPUT) MCFG_SOUND_ROUTE(0, "dac", -1.0, DAC_VREF_NEG_INPUT)
- MCFG_SOUND_ROUTE(0, "sbs", 1.0, DAC_VREF_POS_INPUT) MCFG_SOUND_ROUTE(0, "sbs", -1.0, DAC_VREF_NEG_INPUT)
+ DAC_6BIT_BINARY_WEIGHTED(config, m_dac, 0).add_route(ALL_OUTPUTS, "speaker", 0.125);
+ voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref"));
+ vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT); vref.add_route(0, "dac", -1.0, DAC_VREF_NEG_INPUT);
+ vref.add_route(0, "sbs", 1.0, DAC_VREF_POS_INPUT); vref.add_route(0, "sbs", -1.0, DAC_VREF_NEG_INPUT);
// Single-bit sound: R22 = 10K
DAC_1BIT(config, "sbs", 0).add_route(ALL_OUTPUTS, "speaker", 0.125);
WAVE(config, "wave", "cassette").add_route(ALL_OUTPUTS, "speaker", 0.25);
-MACHINE_CONFIG_END
+}
//-------------------------------------------------
-// MACHINE_CONFIG ( coco_floating )
+// machine_config ( coco_floating )
//-------------------------------------------------
void coco_state::coco_floating_map(address_map &map)
@@ -426,17 +427,17 @@ static DEVICE_INPUT_DEFAULTS_START( printer )
DEVICE_INPUT_DEFAULTS_END
//-------------------------------------------------
-// MACHINE_CONFIG
+// machine_config
//-------------------------------------------------
-MACHINE_CONFIG_START(coco12_state::coco)
- MCFG_DEVICE_MODIFY(":")
- MCFG_DEVICE_CLOCK(XTAL(14'318'181) / 16)
+void coco12_state::coco(machine_config &config)
+{
+ this->set_clock(XTAL(14'318'181) / 16);
// basic machine hardware
- MCFG_DEVICE_ADD(MAINCPU_TAG, MC6809E, DERIVED_CLOCK(1, 1))
- MCFG_DEVICE_PROGRAM_MAP(coco_mem)
- MCFG_DEVICE_DISASSEMBLE_OVERRIDE(coco_state, dasm_override)
+ MC6809E(config, m_maincpu, DERIVED_CLOCK(1, 1));
+ m_maincpu->set_addrmap(AS_PROGRAM, &coco12_state::coco_mem);
+ m_maincpu->set_dasm_override(FUNC(coco_state::dasm_override));
// devices
pia6821_device &pia0(PIA6821(config, PIA0_TAG, 0));
@@ -461,11 +462,11 @@ MACHINE_CONFIG_START(coco12_state::coco)
m_sam->res_rd_callback().set(FUNC(coco12_state::sam_read));
// Becker Port device
- MCFG_DEVICE_ADD(DWSOCK_TAG, COCO_DWSOCK, 0)
+ COCO_DWSOCK(config, DWSOCK_TAG, 0);
- MCFG_CASSETTE_ADD("cassette")
- MCFG_CASSETTE_FORMATS(coco_cassette_formats)
- MCFG_CASSETTE_DEFAULT_STATE(CASSETTE_PLAY | CASSETTE_MOTOR_DISABLED | CASSETTE_SPEAKER_MUTED)
+ CASSETTE(config, m_cassette);
+ m_cassette->set_formats(coco_cassette_formats);
+ m_cassette->set_default_state(CASSETTE_PLAY | CASSETTE_MOTOR_DISABLED | CASSETTE_SPEAKER_MUTED);
rs232_port_device &rs232(RS232_PORT(config, RS232_TAG, default_rs232_devices, "printer"));
rs232.dcd_handler().set(PIA1_TAG, FUNC(pia6821_device::ca1_w));
@@ -477,12 +478,13 @@ MACHINE_CONFIG_START(coco12_state::coco)
cartslot.halt_callback().set_inputline(m_maincpu, INPUT_LINE_HALT);
// video hardware
- MCFG_SCREEN_MC6847_NTSC_ADD(SCREEN_TAG, VDG_TAG)
+ SCREEN(config, "screen", SCREEN_TYPE_RASTER);
- MCFG_DEVICE_ADD(VDG_TAG, MC6847_NTSC, XTAL(14'318'181) / 4) // VClk output from MC6883
- MCFG_MC6847_HSYNC_CALLBACK(WRITELINE(*this, coco12_state, horizontal_sync))
- MCFG_MC6847_FSYNC_CALLBACK(WRITELINE(*this, coco12_state, field_sync))
- MCFG_MC6847_INPUT_CALLBACK(READ8(m_sam, sam6883_device, display_read))
+ MC6847_NTSC(config, m_vdg, XTAL(14'318'181) / 4); // VClk output from MC6883
+ m_vdg->set_screen("screen");
+ m_vdg->hsync_wr_callback().set(FUNC(coco12_state::horizontal_sync));
+ m_vdg->fsync_wr_callback().set(FUNC(coco12_state::field_sync));
+ m_vdg->input_callback().set(m_sam, FUNC(sam6883_device::display_read));
// sound hardware
coco_sound(config);
@@ -494,19 +496,18 @@ MACHINE_CONFIG_START(coco12_state::coco)
coco_floating(config);
// software lists
- MCFG_SOFTWARE_LIST_ADD("coco_cart_list", "coco_cart")
- MCFG_SOFTWARE_LIST_FILTER("coco_cart_list", "COCO")
- MCFG_SOFTWARE_LIST_ADD("coco_flop_list", "coco_flop")
- MCFG_SOFTWARE_LIST_FILTER("coco_flop_list", "COCO")
- MCFG_SOFTWARE_LIST_COMPATIBLE_ADD("dragon_cart_list", "dragon_cart")
-MACHINE_CONFIG_END
-
-MACHINE_CONFIG_START(coco12_state::cocoh)
+ SOFTWARE_LIST(config, "coco_cart_list").set_original("coco_cart").set_filter("COCO");
+ SOFTWARE_LIST(config, "coco_flop_list").set_original("coco_flop").set_filter("COCO");
+ SOFTWARE_LIST(config, "dragon_cart_list").set_compatible("dragon_cart");
+}
+
+void coco12_state::cocoh(machine_config &config)
+{
coco(config);
- MCFG_DEVICE_REPLACE(MAINCPU_TAG, HD6309E, DERIVED_CLOCK(1, 1))
- MCFG_DEVICE_PROGRAM_MAP(coco_mem)
+ HD6309E(config.replace(), m_maincpu, DERIVED_CLOCK(1, 1));
+ m_maincpu->set_addrmap(AS_PROGRAM, &coco12_state::coco_mem);
m_ram->set_default_size("64K");
-MACHINE_CONFIG_END
+}
void coco12_state::cocoe(machine_config &config)
{
@@ -515,16 +516,17 @@ void coco12_state::cocoe(machine_config &config)
cartslot.cart_callback().set([this] (int state) { cart_w(state != 0); }); // lambda because name is overloaded
cartslot.nmi_callback().set_inputline(m_maincpu, INPUT_LINE_NMI);
cartslot.halt_callback().set_inputline(m_maincpu, INPUT_LINE_HALT);
- COCO_VHD(config, m_vhd_0, 0);
- COCO_VHD(config, m_vhd_1, 0);
+ COCO_VHD(config, m_vhd_0, 0, m_maincpu);
+ COCO_VHD(config, m_vhd_1, 0, m_maincpu);
}
-MACHINE_CONFIG_START(coco12_state::cocoeh)
+void coco12_state::cocoeh(machine_config &config)
+{
cocoe(config);
- MCFG_DEVICE_REPLACE(MAINCPU_TAG, HD6309E, DERIVED_CLOCK(1, 1))
- MCFG_DEVICE_PROGRAM_MAP(coco_mem)
+ HD6309E(config.replace(), m_maincpu, DERIVED_CLOCK(1, 1));
+ m_maincpu->set_addrmap(AS_PROGRAM, &coco12_state::coco_mem);
m_ram->set_default_size("64K");
-MACHINE_CONFIG_END
+}
void coco12_state::coco2(machine_config &config)
{
@@ -533,32 +535,35 @@ void coco12_state::coco2(machine_config &config)
cartslot.cart_callback().set([this] (int state) { cart_w(state != 0); }); // lambda because name is overloaded
cartslot.nmi_callback().set_inputline(m_maincpu, INPUT_LINE_NMI);
cartslot.halt_callback().set_inputline(m_maincpu, INPUT_LINE_HALT);
- COCO_VHD(config, m_vhd_0, 0);
- COCO_VHD(config, m_vhd_1, 0);
+ COCO_VHD(config, m_vhd_0, 0, m_maincpu);
+ COCO_VHD(config, m_vhd_1, 0, m_maincpu);
}
-MACHINE_CONFIG_START(coco12_state::coco2h)
+void coco12_state::coco2h(machine_config &config)
+{
coco2(config);
- MCFG_DEVICE_REPLACE(MAINCPU_TAG, HD6309E, DERIVED_CLOCK(1, 1))
- MCFG_DEVICE_PROGRAM_MAP(coco_mem)
+ HD6309E(config.replace(), m_maincpu, DERIVED_CLOCK(1, 1));
+ m_maincpu->set_addrmap(AS_PROGRAM, &coco12_state::coco_mem);
m_ram->set_default_size("64K");
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(coco12_state::coco2b)
+void coco12_state::coco2b(machine_config &config)
+{
coco2(config);
- MCFG_DEVICE_REMOVE(VDG_TAG)
- MCFG_DEVICE_ADD(VDG_TAG, MC6847T1_NTSC, XTAL(14'318'181) / 4)
- MCFG_MC6847_HSYNC_CALLBACK(WRITELINE(*this, coco12_state, horizontal_sync))
- MCFG_MC6847_FSYNC_CALLBACK(WRITELINE(*this, coco12_state, field_sync))
- MCFG_MC6847_INPUT_CALLBACK(READ8(m_sam, sam6883_device, display_read))
-MACHINE_CONFIG_END
-
-MACHINE_CONFIG_START(coco12_state::coco2bh)
+ MC6847T1_NTSC(config.replace(), m_vdg, XTAL(14'318'181) / 4);
+ m_vdg->set_screen(SCREEN_TAG);
+ m_vdg->hsync_wr_callback().set(FUNC(coco12_state::horizontal_sync));
+ m_vdg->fsync_wr_callback().set(FUNC(coco12_state::field_sync));
+ m_vdg->input_callback().set(m_sam, FUNC(sam6883_device::display_read));
+}
+
+void coco12_state::coco2bh(machine_config &config)
+{
coco2b(config);
- MCFG_DEVICE_REPLACE(MAINCPU_TAG, HD6309E, DERIVED_CLOCK(1, 1))
- MCFG_DEVICE_PROGRAM_MAP(coco_mem)
+ HD6309E(config.replace(), m_maincpu, DERIVED_CLOCK(1, 1));
+ m_maincpu->set_addrmap(AS_PROGRAM, &coco12_state::coco_mem);
m_ram->set_default_size("64K");
-MACHINE_CONFIG_END
+}
void coco12_state::cp400(machine_config &config)
{
diff --git a/src/mame/drivers/coco3.cpp b/src/mame/drivers/coco3.cpp
index d7c8033b195..9c985218e0b 100644
--- a/src/mame/drivers/coco3.cpp
+++ b/src/mame/drivers/coco3.cpp
@@ -242,14 +242,14 @@ DEVICE_INPUT_DEFAULTS_END
// MACHINE CONFIGURATION
//**************************************************************************
-MACHINE_CONFIG_START(coco3_state::coco3)
- MCFG_DEVICE_MODIFY(":")
- MCFG_DEVICE_CLOCK(XTAL(28'636'363) / 32)
+void coco3_state::coco3(machine_config &config)
+{
+ this->set_clock(XTAL(28'636'363) / 32);
// basic machine hardware
- MCFG_DEVICE_ADD(MAINCPU_TAG, MC6809E, DERIVED_CLOCK(1, 1))
- MCFG_DEVICE_PROGRAM_MAP(coco3_mem)
- MCFG_DEVICE_DISASSEMBLE_OVERRIDE(coco_state, dasm_override)
+ MC6809E(config, m_maincpu, DERIVED_CLOCK(1, 1));
+ m_maincpu->set_addrmap(AS_PROGRAM, &coco3_state::coco3_mem);
+ m_maincpu->set_dasm_override(FUNC(coco_state::dasm_override));
// devices
pia6821_device &pia0(PIA6821(config, PIA0_TAG, 0));
@@ -271,11 +271,11 @@ MACHINE_CONFIG_START(coco3_state::coco3)
pia1.irqb_handler().set(FUNC(coco_state::pia1_firq_b));
// Becker Port device
- MCFG_DEVICE_ADD(DWSOCK_TAG, COCO_DWSOCK, 0)
+ COCO_DWSOCK(config, DWSOCK_TAG, 0);
- MCFG_CASSETTE_ADD("cassette")
- MCFG_CASSETTE_FORMATS(coco_cassette_formats)
- MCFG_CASSETTE_DEFAULT_STATE(CASSETTE_PLAY | CASSETTE_MOTOR_DISABLED | CASSETTE_SPEAKER_MUTED)
+ CASSETTE(config, m_cassette);
+ m_cassette->set_formats(coco_cassette_formats);
+ m_cassette->set_default_state(CASSETTE_PLAY | CASSETTE_MOTOR_DISABLED | CASSETTE_SPEAKER_MUTED);
rs232_port_device &rs232(RS232_PORT(config, RS232_TAG, default_rs232_devices, "printer"));
rs232.dcd_handler().set(PIA1_TAG, FUNC(pia6821_device::ca1_w));
@@ -286,13 +286,14 @@ MACHINE_CONFIG_START(coco3_state::coco3)
cartslot.nmi_callback().set_inputline(m_maincpu, INPUT_LINE_NMI);
cartslot.halt_callback().set_inputline(m_maincpu, INPUT_LINE_HALT);
- COCO_VHD(config, m_vhd_0, 0);
- COCO_VHD(config, m_vhd_1, 0);
+ COCO_VHD(config, m_vhd_0, 0, m_maincpu);
+ COCO_VHD(config, m_vhd_1, 0, m_maincpu);
// video hardware
config.set_default_layout(layout_coco3);
GIME_NTSC(config, m_gime, XTAL(28'636'363), MAINCPU_TAG, RAM_TAG, CARTRIDGE_TAG, MAINCPU_TAG);
+ m_gime->set_screen(COMPOSITE_SCREEN_TAG);
m_gime->hsync_wr_callback().set(PIA0_TAG, FUNC(pia6821_device::ca1_w));
m_gime->fsync_wr_callback().set(PIA0_TAG, FUNC(pia6821_device::cb1_w));
m_gime->irq_wr_callback().set(FUNC(coco3_state::gime_irq_w));
@@ -300,20 +301,20 @@ MACHINE_CONFIG_START(coco3_state::coco3)
m_gime->floating_bus_rd_callback().set(FUNC(coco3_state::floating_bus_r));
// composite monitor
- MCFG_SCREEN_ADD(COMPOSITE_SCREEN_TAG, RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_UPDATE_DRIVER(coco3_state, screen_update)
- MCFG_SCREEN_SIZE(640, 243)
- MCFG_SCREEN_VISIBLE_AREA(0, 640-1, 1, 241-1)
- MCFG_SCREEN_VBLANK_TIME(0)
+ screen_device &composite_screen(SCREEN(config, COMPOSITE_SCREEN_TAG, SCREEN_TYPE_RASTER));
+ composite_screen.set_refresh_hz(60);
+ composite_screen.set_screen_update(FUNC(coco3_state::screen_update));
+ composite_screen.set_size(640, 243);
+ composite_screen.set_visarea(0, 640-1, 1, 241-1);
+ composite_screen.set_vblank_time(0);
// RGB monitor
- MCFG_SCREEN_ADD(RGB_SCREEN_TAG, RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_UPDATE_DRIVER(coco3_state, screen_update)
- MCFG_SCREEN_SIZE(640, 243)
- MCFG_SCREEN_VISIBLE_AREA(0, 640-1, 1, 241-1)
- MCFG_SCREEN_VBLANK_TIME(0)
+ screen_device &rgb_screen(SCREEN(config, RGB_SCREEN_TAG, SCREEN_TYPE_RASTER));
+ rgb_screen.set_refresh_hz(60);
+ rgb_screen.set_screen_update(FUNC(coco3_state::screen_update));
+ rgb_screen.set_size(640, 243);
+ rgb_screen.set_visarea(0, 640-1, 1, 241-1);
+ rgb_screen.set_vblank_time(0);
// sound hardware
coco_sound(config);
@@ -325,32 +326,32 @@ MACHINE_CONFIG_START(coco3_state::coco3)
coco_floating(config);
// software lists
- MCFG_SOFTWARE_LIST_ADD("cart_list","coco_cart")
- MCFG_SOFTWARE_LIST_FILTER("cart_list","COCO3")
+ SOFTWARE_LIST(config, "cart_list").set_original("coco_cart").set_filter("COCO3");
- MCFG_SOFTWARE_LIST_ADD("flop_list","coco_flop")
- MCFG_SOFTWARE_LIST_FILTER("flop_list","COCO3")
-MACHINE_CONFIG_END
+ SOFTWARE_LIST(config, "flop_list").set_original("coco_flop").set_filter("COCO3");
+}
-MACHINE_CONFIG_START(coco3_state::coco3p)
+void coco3_state::coco3p(machine_config &config)
+{
coco3(config);
- MCFG_DEVICE_MODIFY(":")
- MCFG_DEVICE_CLOCK(XTAL(28'475'000) / 32)
+ this->set_clock(XTAL(28'475'000) / 32);
// An additional 4.433618 MHz XTAL is required for PAL color encoding
GIME_PAL(config.replace(), m_gime, XTAL(28'475'000), MAINCPU_TAG, RAM_TAG, CARTRIDGE_TAG, MAINCPU_TAG);
+ m_gime->set_screen(COMPOSITE_SCREEN_TAG);
m_gime->hsync_wr_callback().set(PIA0_TAG, FUNC(pia6821_device::ca1_w));
m_gime->fsync_wr_callback().set(PIA0_TAG, FUNC(pia6821_device::cb1_w));
m_gime->irq_wr_callback().set(FUNC(coco3_state::gime_irq_w));
m_gime->firq_wr_callback().set(FUNC(coco3_state::gime_firq_w));
m_gime->floating_bus_rd_callback().set(FUNC(coco3_state::floating_bus_r));
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(coco3_state::coco3h)
+void coco3_state::coco3h(machine_config &config)
+{
coco3(config);
- MCFG_DEVICE_REPLACE(MAINCPU_TAG, HD6309E, DERIVED_CLOCK(1, 1))
- MCFG_DEVICE_PROGRAM_MAP(coco3_mem)
-MACHINE_CONFIG_END
+ HD6309E(config.replace(), m_maincpu, DERIVED_CLOCK(1, 1));
+ m_maincpu->set_addrmap(AS_PROGRAM, &coco3_state::coco3_mem);
+}
void coco3_state::coco3dw1(machine_config &config)
{
diff --git a/src/mame/drivers/cocoloco.cpp b/src/mame/drivers/cocoloco.cpp
index 6b1f8bbd68a..202477886be 100644
--- a/src/mame/drivers/cocoloco.cpp
+++ b/src/mame/drivers/cocoloco.cpp
@@ -514,14 +514,14 @@ INPUT_PORTS_END
MACHINE_CONFIG_START(cocoloco_state::cocoloco)
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M6502, CPU_CLOCK)
- MCFG_DEVICE_PROGRAM_MAP(cocoloco_map)
+ M6502(config, m_maincpu, CPU_CLOCK);
+ m_maincpu->set_addrmap(AS_PROGRAM, &cocoloco_state::cocoloco_map);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_RAW_PARAMS(CPU_CLOCK * 4, 384, 0, 256, 262, 0, 256) // TODO: not accurate, ~50 Hz
- MCFG_SCREEN_UPDATE_DRIVER(cocoloco_state, screen_update)
- MCFG_SCREEN_PALETTE(m_palette)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_raw(CPU_CLOCK * 4, 384, 0, 256, 262, 0, 256); // TODO: not accurate, ~50 Hz
+ screen.set_screen_update(FUNC(cocoloco_state::screen_update));
+ screen.set_palette(m_palette);
PALETTE(config, m_palette, FUNC(cocoloco_state::cocoloco_palette), 0x10);
diff --git a/src/mame/drivers/coinmstr.cpp b/src/mame/drivers/coinmstr.cpp
index 69ad7079b9f..5abd1acc21e 100644
--- a/src/mame/drivers/coinmstr.cpp
+++ b/src/mame/drivers/coinmstr.cpp
@@ -1255,10 +1255,11 @@ uint32_t coinmstr_state::screen_update_coinmstr(screen_device &screen, bitmap_in
}
-MACHINE_CONFIG_START(coinmstr_state::coinmstr)
- MCFG_DEVICE_ADD("maincpu", Z80, CPU_CLOCK) // 7 MHz.
- MCFG_DEVICE_PROGRAM_MAP(coinmstr_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", coinmstr_state, irq0_line_hold)
+void coinmstr_state::coinmstr(machine_config &config)
+{
+ Z80(config, m_maincpu, CPU_CLOCK); // 7 MHz.
+ m_maincpu->set_addrmap(AS_PROGRAM, &coinmstr_state::coinmstr_map);
+ m_maincpu->set_vblank_int("screen", FUNC(coinmstr_state::irq0_line_hold));
pia6821_device &pia0(PIA6821(config, "pia0", 0));
pia0.readpa_handler().set_ioport("PIA0.A");
@@ -1273,16 +1274,16 @@ MACHINE_CONFIG_START(coinmstr_state::coinmstr)
pia2.readpb_handler().set_ioport("PIA2.B");
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(64*8, 64*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 46*8-1, 0*8, 32*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(coinmstr_state, screen_update_coinmstr)
- MCFG_SCREEN_PALETTE("palette")
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(64*8, 64*8);
+ screen.set_visarea(0*8, 46*8-1, 0*8, 32*8-1);
+ screen.set_screen_update(FUNC(coinmstr_state::screen_update_coinmstr));
+ screen.set_palette(m_palette);
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_coinmstr)
- MCFG_PALETTE_ADD("palette", 46*32*4)
+ GFXDECODE(config, m_gfxdecode, m_palette, gfx_coinmstr);
+ PALETTE(config, m_palette).set_entries(46*32*4);
h46505_device &crtc(H46505(config, "crtc", 14000000 / 16));
crtc.set_screen("screen");
@@ -1295,39 +1296,39 @@ MACHINE_CONFIG_START(coinmstr_state::coinmstr)
ay8910_device &aysnd(AY8910(config, "aysnd", SND_CLOCK));
aysnd.port_a_read_callback().set_ioport("DSW1");
aysnd.add_route(ALL_OUTPUTS, "mono", 0.25);
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(coinmstr_state::quizmstr)
+void coinmstr_state::quizmstr(machine_config &config)
+{
coinmstr(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_IO_MAP(quizmstr_io_map)
-MACHINE_CONFIG_END
+ m_maincpu->set_addrmap(AS_IO, &coinmstr_state::quizmstr_io_map);
+}
-MACHINE_CONFIG_START(coinmstr_state::trailblz)
+void coinmstr_state::trailblz(machine_config &config)
+{
coinmstr(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_IO_MAP(trailblz_io_map)
-MACHINE_CONFIG_END
+ m_maincpu->set_addrmap(AS_IO, &coinmstr_state::trailblz_io_map);
+}
-MACHINE_CONFIG_START(coinmstr_state::supnudg2)
+void coinmstr_state::supnudg2(machine_config &config)
+{
coinmstr(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_IO_MAP(supnudg2_io_map)
-MACHINE_CONFIG_END
+ m_maincpu->set_addrmap(AS_IO, &coinmstr_state::supnudg2_io_map);
+}
-MACHINE_CONFIG_START(coinmstr_state::pokeroul)
+void coinmstr_state::pokeroul(machine_config &config)
+{
coinmstr(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_IO_MAP(pokeroul_io_map)
-MACHINE_CONFIG_END
+ m_maincpu->set_addrmap(AS_IO, &coinmstr_state::pokeroul_io_map);
+}
-MACHINE_CONFIG_START(coinmstr_state::jpcoin)
+void coinmstr_state::jpcoin(machine_config &config)
+{
coinmstr(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(jpcoin_map)
- MCFG_DEVICE_IO_MAP(jpcoin_io_map)
+ m_maincpu->set_addrmap(AS_PROGRAM, &coinmstr_state::jpcoin_map);
+ m_maincpu->set_addrmap(AS_IO, &coinmstr_state::jpcoin_io_map);
// NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
-MACHINE_CONFIG_END
+}
/*
diff --git a/src/mame/drivers/coinmvga.cpp b/src/mame/drivers/coinmvga.cpp
index dc340e2f41b..3c3e47934dc 100644
--- a/src/mame/drivers/coinmvga.cpp
+++ b/src/mame/drivers/coinmvga.cpp
@@ -636,33 +636,33 @@ void coinmvga_state::ramdac2_map(address_map &map)
}
-MACHINE_CONFIG_START(coinmvga_state::coinmvga)
-
+void coinmvga_state::coinmvga(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", H83007, CPU_CLOCK) /* xtal */
- MCFG_DEVICE_PROGRAM_MAP(coinmvga_map)
- MCFG_DEVICE_IO_MAP(coinmvga_io_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", coinmvga_state, vblank_irq) /* wrong, fix me */
+ H83007(config, m_maincpu, CPU_CLOCK); /* xtal */
+ m_maincpu->set_addrmap(AS_PROGRAM, &coinmvga_state::coinmvga_map);
+ m_maincpu->set_addrmap(AS_IO, &coinmvga_state::coinmvga_io_map);
+ m_maincpu->set_vblank_int("screen", FUNC(coinmvga_state::vblank_irq)); /* wrong, fix me */
// NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(640,480)
- MCFG_SCREEN_VISIBLE_AREA(0, 640-1, 0, 480-1)
- MCFG_SCREEN_UPDATE_DRIVER(coinmvga_state, screen_update_coinmvga)
- MCFG_SCREEN_PALETTE("palette")
-
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_coinmvga)
- MCFG_DEVICE_ADD("gfxdecode2", GFXDECODE, "palette2", gfx_coinmvga2)
-
- MCFG_PALETTE_ADD("palette", 256)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(640,480);
+ screen.set_visarea_full();
+ screen.set_screen_update(FUNC(coinmvga_state::screen_update_coinmvga));
+ screen.set_palette(m_palette);
+
+ GFXDECODE(config, m_gfxdecode, m_palette, gfx_coinmvga);
+ GFXDECODE(config, "gfxdecode2", m_palette2, gfx_coinmvga2);
+
+ PALETTE(config, m_palette).set_entries(256);
ramdac_device &ramdac(RAMDAC(config, "ramdac", 0, m_palette));
ramdac.set_addrmap(0, &coinmvga_state::ramdac_map);
- MCFG_PALETTE_ADD("palette2", 16)
+ PALETTE(config, m_palette2).set_entries(16);
ramdac_device &ramdac2(RAMDAC(config, "ramdac2", 0, m_palette2));
ramdac2.set_addrmap(0, &coinmvga_state::ramdac2_map);
@@ -670,10 +670,10 @@ MACHINE_CONFIG_START(coinmvga_state::coinmvga)
SPEAKER(config, "lspeaker").front_left();
SPEAKER(config, "rspeaker").front_right();
- MCFG_DEVICE_ADD("ymz", YMZ280B, SND_CLOCK)
- MCFG_SOUND_ROUTE(0, "lspeaker", 1.0)
- MCFG_SOUND_ROUTE(1, "rspeaker", 1.0)
-MACHINE_CONFIG_END
+ ymz280b_device &ymz(YMZ280B(config, "ymz", SND_CLOCK));
+ ymz.add_route(0, "lspeaker", 1.0);
+ ymz.add_route(1, "rspeaker", 1.0);
+}
/*************************
diff --git a/src/mame/drivers/coleco.cpp b/src/mame/drivers/coleco.cpp
index c554f43ea91..8c44a8f89cd 100644
--- a/src/mame/drivers/coleco.cpp
+++ b/src/mame/drivers/coleco.cpp
@@ -105,10 +105,9 @@ void coleco_state::coleco_io_map(address_map &map)
{
map.global_mask(0xff);
map(0x80, 0x80).mirror(0x1f).w(FUNC(coleco_state::paddle_off_w));
- map(0xa0, 0xa0).mirror(0x1e).rw("tms9928a", FUNC(tms9928a_device::vram_r), FUNC(tms9928a_device::vram_w));
- map(0xa1, 0xa1).mirror(0x1e).rw("tms9928a", FUNC(tms9928a_device::register_r), FUNC(tms9928a_device::register_w));
+ map(0xa0, 0xa1).mirror(0x1e).rw("tms9928a", FUNC(tms9928a_device::read), FUNC(tms9928a_device::write));
map(0xc0, 0xc0).mirror(0x1f).w(FUNC(coleco_state::paddle_on_w));
- map(0xe0, 0xe0).mirror(0x1f).w("sn76489a", FUNC(sn76489a_device::command_w));
+ map(0xe0, 0xe0).mirror(0x1f).w("sn76489a", FUNC(sn76489a_device::write));
map(0xe0, 0xe0).mirror(0x1d).r(FUNC(coleco_state::paddle_1_r));
map(0xe2, 0xe2).mirror(0x1d).r(FUNC(coleco_state::paddle_2_r));
}
@@ -232,7 +231,7 @@ TIMER_DEVICE_CALLBACK_MEMBER(coleco_state::paddle_update_callback)
READ8_MEMBER( coleco_state::cart_r )
{
- return m_cart->bd_r(space, offset & 0x7fff, 0, 0, 0, 0, 0);
+ return m_cart->bd_r(offset & 0x7fff, 0, 0, 0, 0, 0);
}
uint8_t coleco_state::coleco_scan_paddles(uint8_t *joy_status0, uint8_t *joy_status1)
diff --git a/src/mame/drivers/comebaby.cpp b/src/mame/drivers/comebaby.cpp
index 65bf27731f4..da1e49c37a9 100644
--- a/src/mame/drivers/comebaby.cpp
+++ b/src/mame/drivers/comebaby.cpp
@@ -236,25 +236,26 @@ static INPUT_PORTS_START( comebaby )
INPUT_PORTS_END
-MACHINE_CONFIG_START(comebaby_state::comebaby)
+void comebaby_state::comebaby(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", PENTIUM2, (66666666*19)/2) /* Actually a Celeron */
- MCFG_DEVICE_PROGRAM_MAP(comebaby_map)
- MCFG_DEVICE_IO_MAP(comebaby_io)
+ PENTIUM2(config, m_maincpu, (66666666*19)/2); /* Actually a Celeron */
+ m_maincpu->set_addrmap(AS_PROGRAM, &comebaby_state::comebaby_map);
+ m_maincpu->set_addrmap(AS_IO, &comebaby_state::comebaby_io);
pcat_common(config);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_UPDATE_DRIVER(comebaby_state, screen_update)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(64*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 64*8-1, 0*8, 32*8-1)
- MCFG_SCREEN_PALETTE("palette")
-
- MCFG_PALETTE_ADD("palette", 0x100)
-MACHINE_CONFIG_END
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_screen_update(FUNC(comebaby_state::screen_update));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(64*8, 32*8);
+ screen.set_visarea_full();
+ screen.set_palette("palette");
+
+ PALETTE(config, "palette").set_entries(0x100);
+}
ROM_START(comebaby)
diff --git a/src/mame/drivers/commando.cpp b/src/mame/drivers/commando.cpp
index 2400b021dda..4c310d24464 100644
--- a/src/mame/drivers/commando.cpp
+++ b/src/mame/drivers/commando.cpp
@@ -252,16 +252,16 @@ void commando_state::machine_reset()
}
-MACHINE_CONFIG_START(commando_state::commando)
-
+void commando_state::commando(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, PHI_MAIN) // ???
- MCFG_DEVICE_PROGRAM_MAP(commando_map)
- MCFG_DEVICE_OPCODES_MAP(decrypted_opcodes_map)
+ Z80(config, m_maincpu, PHI_MAIN); // ???
+ m_maincpu->set_addrmap(AS_PROGRAM, &commando_state::commando_map);
+ m_maincpu->set_addrmap(AS_OPCODES, &commando_state::decrypted_opcodes_map);
- MCFG_DEVICE_ADD("audiocpu", Z80, PHI_B) // 3 MHz
- MCFG_DEVICE_PROGRAM_MAP(sound_map)
- MCFG_DEVICE_PERIODIC_INT_DRIVER(commando_state, irq0_line_hold, 4*60)
+ Z80(config, m_audiocpu, PHI_B); // 3 MHz
+ m_audiocpu->set_addrmap(AS_PROGRAM, &commando_state::sound_map);
+ m_audiocpu->set_periodic_int(FUNC(commando_state::irq0_line_hold), attotime::from_hz(4*60));
/* video hardware */
screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
@@ -274,7 +274,7 @@ MACHINE_CONFIG_START(commando_state::commando)
screen.screen_vblank().append(FUNC(commando_state::vblank_irq));
screen.set_palette(m_palette);
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_commando)
+ GFXDECODE(config, m_gfxdecode, m_palette, gfx_commando);
PALETTE(config, m_palette, palette_device::RGB_444_PROMS, "proms", 256);
BUFFERED_SPRITERAM8(config, m_spriteram);
@@ -287,7 +287,7 @@ MACHINE_CONFIG_START(commando_state::commando)
YM2203(config, "ym1", PHI_B/2).add_route(ALL_OUTPUTS, "mono", 0.15);
YM2203(config, "ym2", PHI_B/2).add_route(ALL_OUTPUTS, "mono", 0.15);
-MACHINE_CONFIG_END
+}
/* ROMs */
diff --git a/src/mame/drivers/compc.cpp b/src/mame/drivers/compc.cpp
index b6cc2124e9c..a13dc96603f 100644
--- a/src/mame/drivers/compc.cpp
+++ b/src/mame/drivers/compc.cpp
@@ -220,14 +220,15 @@ void compc_state::compciii_io(address_map &map)
map(0x0060, 0x0063).rw(FUNC(compc_state::pioiii_r), FUNC(compc_state::pioiii_w));
}
-MACHINE_CONFIG_START(compc_state::compc)
- MCFG_DEVICE_ADD("maincpu", I8088, 4772720*2)
- MCFG_DEVICE_PROGRAM_MAP(compc_map)
- MCFG_DEVICE_IO_MAP(compc_io)
- MCFG_DEVICE_IRQ_ACKNOWLEDGE_DEVICE("mb:pic8259", pic8259_device, inta_cb)
-
- MCFG_PCNOPPI_MOTHERBOARD_ADD("mb", "maincpu")
- MCFG_DEVICE_REMOVE("mb:pit8253")
+void compc_state::compc(machine_config &config)
+{
+ I8088(config, m_maincpu, 4772720*2);
+ m_maincpu->set_addrmap(AS_PROGRAM, &compc_state::compc_map);
+ m_maincpu->set_addrmap(AS_IO, &compc_state::compc_io);
+ m_maincpu->set_irq_acknowledge_callback("mb:pic8259", FUNC(pic8259_device::inta_cb));
+
+ PCNOPPI_MOTHERBOARD(config, "mb", 0).set_cputag(m_maincpu);
+ config.device_remove("mb:pit8253");
fe2010_pit_device &pit(FE2010_PIT(config, "mb:pit8253", 0));
pit.set_clk<0>(XTAL(14'318'181)/12.0); /* heartbeat IRQ */
pit.out_handler<0>().set("mb:pic8259", FUNC(pic8259_device::ir0_w));
@@ -237,25 +238,26 @@ MACHINE_CONFIG_START(compc_state::compc)
pit.out_handler<2>().set(m_mb, FUNC(ibm5160_mb_device::pc_pit8253_out2_changed));
// FIXME: determine ISA bus clock
- MCFG_DEVICE_ADD("isa1", ISA8_SLOT, 0, "mb:isa", pc_isa8_cards, "mda", false)
- MCFG_DEVICE_ADD("isa2", ISA8_SLOT, 0, "mb:isa", pc_isa8_cards, "lpt", false)
- MCFG_DEVICE_ADD("isa3", ISA8_SLOT, 0, "mb:isa", pc_isa8_cards, "com", false)
- MCFG_DEVICE_ADD("isa4", ISA8_SLOT, 0, "mb:isa", pc_isa8_cards, "fdc_xt", false)
+ ISA8_SLOT(config, "isa1", 0, "mb:isa", pc_isa8_cards, "mda", false);
+ ISA8_SLOT(config, "isa2", 0, "mb:isa", pc_isa8_cards, "lpt", false);
+ ISA8_SLOT(config, "isa3", 0, "mb:isa", pc_isa8_cards, "com", false);
+ ISA8_SLOT(config, "isa4", 0, "mb:isa", pc_isa8_cards, "fdc_xt", false);
- MCFG_PC_KEYB_ADD("pc_keyboard", WRITELINE("mb:pic8259", pic8259_device, ir1_w))
+ PC_KEYB(config, m_keyboard);
+ m_keyboard->keypress().set("mb:pic8259", FUNC(pic8259_device::ir1_w));
/* internal ram */
RAM(config, RAM_TAG).set_default_size("256K").set_extra_options("512K, 640K");
/* software lists */
- MCFG_SOFTWARE_LIST_ADD("disk_list", "ibm5150")
-MACHINE_CONFIG_END
+ SOFTWARE_LIST(config, "disk_list").set_original("ibm5150");
+}
-MACHINE_CONFIG_START(compc_state::pc10iii)
+void compc_state::pc10iii(machine_config &config)
+{
compc(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_IO_MAP(compciii_io)
-MACHINE_CONFIG_END
+ m_maincpu->set_addrmap(AS_IO, &compc_state::compciii_io);
+}
ROM_START(compc10)
ROM_REGION(0x10000, "bios", 0)
diff --git a/src/mame/drivers/compgolf.cpp b/src/mame/drivers/compgolf.cpp
index 1fef8268176..14c334fee6f 100644
--- a/src/mame/drivers/compgolf.cpp
+++ b/src/mame/drivers/compgolf.cpp
@@ -222,24 +222,24 @@ void compgolf_state::machine_reset()
m_scrolly_hi = 0;
}
-MACHINE_CONFIG_START(compgolf_state::compgolf)
-
+void compgolf_state::compgolf(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", MC6809E, 2000000) // HD68B09EP
- MCFG_DEVICE_PROGRAM_MAP(compgolf_map)
+ MC6809E(config, m_maincpu, 2000000); // HD68B09EP
+ m_maincpu->set_addrmap(AS_PROGRAM, &compgolf_state::compgolf_map);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */)
- MCFG_SCREEN_SIZE(256, 256)
- MCFG_SCREEN_VISIBLE_AREA(1*8, 32*8-1, 1*8, 31*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(compgolf_state, screen_update_compgolf)
- MCFG_SCREEN_PALETTE(m_palette)
- MCFG_SCREEN_VBLANK_CALLBACK(INPUTLINE("maincpu", INPUT_LINE_NMI))
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500) /* not accurate */);
+ screen.set_size(256, 256);
+ screen.set_visarea(1*8, 32*8-1, 1*8, 31*8-1);
+ screen.set_screen_update(FUNC(compgolf_state::screen_update_compgolf));
+ screen.set_palette(m_palette);
+ screen.screen_vblank().set_inputline(m_maincpu, INPUT_LINE_NMI);
PALETTE(config, m_palette, FUNC(compgolf_state::compgolf_palette), 0x100);
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, m_palette, gfx_compgolf)
+ GFXDECODE(config, m_gfxdecode, m_palette, gfx_compgolf);
SPEAKER(config, "mono").front_center();
@@ -249,7 +249,7 @@ MACHINE_CONFIG_START(compgolf_state::compgolf)
ymsnd.port_a_write_callback().set(FUNC(compgolf_state::compgolf_scrollx_lo_w));
ymsnd.port_b_write_callback().set(FUNC(compgolf_state::compgolf_scrolly_lo_w));
ymsnd.add_route(ALL_OUTPUTS, "mono", 1.0);
-MACHINE_CONFIG_END
+}
/*************************************
diff --git a/src/mame/drivers/compis.cpp b/src/mame/drivers/compis.cpp
index 54ac9883c88..b8d28f9254e 100644
--- a/src/mame/drivers/compis.cpp
+++ b/src/mame/drivers/compis.cpp
@@ -177,7 +177,7 @@ READ16_MEMBER( compis_state::pcs6_0_1_r )
}
else
{
- return m_graphics->dma_ack_r(space, offset);
+ return m_graphics->dma_ack_r(offset);
}
}
@@ -191,7 +191,7 @@ WRITE16_MEMBER( compis_state::pcs6_0_1_w )
}
else
{
- m_graphics->dma_ack_w(space, offset, data);
+ m_graphics->dma_ack_w(offset, data);
}
}
@@ -250,7 +250,7 @@ READ16_MEMBER( compis_state::pcs6_6_7_r )
{
if (ACCESSING_BITS_0_7)
{
- return m_graphics->pcs6_6_r(space, offset);
+ return m_graphics->pcs6_6_r(offset);
}
else
{
@@ -265,7 +265,7 @@ WRITE16_MEMBER( compis_state::pcs6_6_7_w )
{
if (ACCESSING_BITS_0_7)
{
- m_graphics->pcs6_6_w(space, offset, data);
+ m_graphics->pcs6_6_w(offset, data);
}
else
{
@@ -278,11 +278,11 @@ READ16_MEMBER( compis_state::pcs6_8_9_r )
{
if (ACCESSING_BITS_0_7)
{
- return m_isbx0->mcs0_r(space, offset);
+ return m_isbx0->mcs0_r(offset);
}
else
{
- return m_isbx0->mcs1_r(space, offset) << 8;
+ return m_isbx0->mcs1_r(offset) << 8;
}
}
@@ -290,11 +290,11 @@ WRITE16_MEMBER( compis_state::pcs6_8_9_w )
{
if (ACCESSING_BITS_0_7)
{
- m_isbx0->mcs0_w(space, offset, data);
+ m_isbx0->mcs0_w(offset, data);
}
else
{
- m_isbx0->mcs1_w(space, offset, data >> 8);
+ m_isbx0->mcs1_w(offset, data >> 8);
}
}
@@ -302,11 +302,11 @@ READ16_MEMBER( compis_state::pcs6_10_11_r )
{
if (ACCESSING_BITS_0_7)
{
- return m_isbx0->mcs1_r(space, offset);
+ return m_isbx0->mcs1_r(offset);
}
else
{
- return m_isbx0->mdack_r(space, offset) << 8;
+ return m_isbx0->mdack_r(offset) << 8;
}
}
@@ -314,11 +314,11 @@ WRITE16_MEMBER( compis_state::pcs6_10_11_w )
{
if (ACCESSING_BITS_0_7)
{
- m_isbx0->mcs1_w(space, offset, data);
+ m_isbx0->mcs1_w(offset, data);
}
else
{
- m_isbx0->mdack_w(space, offset, data >> 8);
+ m_isbx0->mdack_w(offset, data >> 8);
}
}
@@ -326,11 +326,11 @@ READ16_MEMBER( compis_state::pcs6_12_13_r )
{
if (ACCESSING_BITS_0_7)
{
- return m_isbx1->mcs0_r(space, offset);
+ return m_isbx1->mcs0_r(offset);
}
else
{
- return m_isbx1->mcs1_r(space, offset) << 8;
+ return m_isbx1->mcs1_r(offset) << 8;
}
}
@@ -338,11 +338,11 @@ WRITE16_MEMBER( compis_state::pcs6_12_13_w )
{
if (ACCESSING_BITS_0_7)
{
- m_isbx1->mcs0_w(space, offset, data);
+ m_isbx1->mcs0_w(offset, data);
}
else
{
- m_isbx1->mcs1_w(space, offset, data >> 8);
+ m_isbx1->mcs1_w(offset, data >> 8);
}
}
@@ -350,11 +350,11 @@ READ16_MEMBER( compis_state::pcs6_14_15_r )
{
if (ACCESSING_BITS_0_7)
{
- return m_isbx1->mcs1_r(space, offset);
+ return m_isbx1->mcs1_r(offset);
}
else
{
- return m_isbx1->mdack_r(space, offset) << 8;
+ return m_isbx1->mdack_r(offset) << 8;
}
}
@@ -362,11 +362,11 @@ WRITE16_MEMBER( compis_state::pcs6_14_15_w )
{
if (ACCESSING_BITS_0_7)
{
- m_isbx1->mcs1_w(space, offset, data);
+ m_isbx1->mcs1_w(offset, data);
}
else
{
- m_isbx1->mdack_w(space, offset, data >> 8);
+ m_isbx1->mdack_w(offset, data >> 8);
}
}
@@ -734,7 +734,7 @@ void compis_state::machine_reset()
//**************************************************************************
//-------------------------------------------------
-// MACHINE_CONFIG( compis )
+// machine_config( compis )
//-------------------------------------------------
void compis_state::compis(machine_config &config)
@@ -829,7 +829,7 @@ void compis_state::compis(machine_config &config)
//-------------------------------------------------
-// MACHINE_CONFIG( compis2 )
+// machine_config( compis2 )
//-------------------------------------------------
void compis_state::compis2(machine_config &config)
diff --git a/src/mame/drivers/compucolor.cpp b/src/mame/drivers/compucolor.cpp
index 487298f071c..7be709ab659 100644
--- a/src/mame/drivers/compucolor.cpp
+++ b/src/mame/drivers/compucolor.cpp
@@ -395,17 +395,18 @@ void compucolor2_state::machine_reset()
m_rs232->write_dtr(1);
}
-MACHINE_CONFIG_START(compucolor2_state::compucolor2)
+void compucolor2_state::compucolor2(machine_config &config)
+{
// basic machine hardware
- MCFG_DEVICE_ADD(I8080_TAG, I8080, XTAL(17'971'200)/9)
- MCFG_DEVICE_PROGRAM_MAP(compucolor2_mem)
- MCFG_DEVICE_IO_MAP(compucolor2_io)
- MCFG_DEVICE_IRQ_ACKNOWLEDGE_DRIVER(compucolor2_state,int_ack)
+ I8080(config, m_maincpu, XTAL(17'971'200)/9);
+ m_maincpu->set_addrmap(AS_PROGRAM, &compucolor2_state::compucolor2_mem);
+ m_maincpu->set_addrmap(AS_IO, &compucolor2_state::compucolor2_io);
+ m_maincpu->set_irq_acknowledge_callback(FUNC(compucolor2_state::int_ack));
// video hardware
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_RAW_PARAMS(XTAL(17'971'200)/2, 93*6, 0, 64*6, 268, 0, 256)
- MCFG_SCREEN_UPDATE_DRIVER(compucolor2_state, screen_update)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_raw(XTAL(17'971'200)/2, 93*6, 0, 64*6, 268, 0, 256);
+ screen.set_screen_update(FUNC(compucolor2_state::screen_update));
PALETTE(config, m_palette, palette_device::RGB_3BIT);
@@ -438,8 +439,8 @@ MACHINE_CONFIG_START(compucolor2_state::compucolor2)
RAM(config, RAM_TAG).set_default_size("32K").set_extra_options("8K,16K");
// software list
- MCFG_SOFTWARE_LIST_ADD("flop_list", "compclr2_flop")
-MACHINE_CONFIG_END
+ SOFTWARE_LIST(config, "flop_list").set_original("compclr2_flop");
+}
ROM_START( compclr2 )
ROM_REGION( 0x4000, I8080_TAG, 0 )
diff --git a/src/mame/drivers/comquest.cpp b/src/mame/drivers/comquest.cpp
index f0b194811e0..acec184d755 100644
--- a/src/mame/drivers/comquest.cpp
+++ b/src/mame/drivers/comquest.cpp
@@ -214,11 +214,12 @@ void comquest_state::machine_reset()
}
-MACHINE_CONFIG_START(comquest_state::comquest)
+void comquest_state::comquest(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M6805, 4000000) /* 4000000? */
- /*MCFG_DEVICE_ADD("maincpu", HD63705, 4000000) instruction set looks like m6805/m6808 */
- /*MCFG_DEVICE_ADD("maincpu", M68705, 4000000) instruction set looks like m6805/m6808 */
+ M6805(config, m_maincpu, 4000000); /* 4000000? */
+ /* HD63705(config, m_maincpu, 4000000); instruction set looks like m6805/m6808 */
+ /* M68705(config, m_maincpu, 4000000); instruction set looks like m6805/m6808 */
/*
8 bit bus, integrated io, serial io?,
@@ -244,25 +245,25 @@ MACHINE_CONFIG_START(comquest_state::comquest)
not epson e0c88
*/
- MCFG_DEVICE_PROGRAM_MAP(comquest_mem)
+ m_maincpu->set_addrmap(AS_PROGRAM, &comquest_state::comquest_mem);
/* video hardware */
- MCFG_SCREEN_ADD("screen", LCD)
- MCFG_SCREEN_REFRESH_RATE(30)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */
- MCFG_SCREEN_SIZE(64*4, 128) /* 160 x 102 */
- MCFG_SCREEN_VISIBLE_AREA(0, 64*4-1, 0, 128-1)
- MCFG_SCREEN_UPDATE_DRIVER(comquest_state, screen_update_comquest)
- MCFG_SCREEN_PALETTE("palette")
-
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_comquest )
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_LCD));
+ screen.set_refresh_hz(30);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */
+ screen.set_size(64*4, 128); /* 160 x 102 */
+ screen.set_visarea_full();
+ screen.set_screen_update(FUNC(comquest_state::screen_update_comquest));
+ screen.set_palette("palette");
+
+ GFXDECODE(config, "gfxdecode", "palette", gfx_comquest);
PALETTE(config, "palette", palette_device::MONOCHROME);
/* sound hardware */
/* unknown ? */
-MACHINE_CONFIG_END
+}
ROM_START(comquest)
// ROM_REGION(0x10000,"maincpu",0)
diff --git a/src/mame/drivers/comx35.cpp b/src/mame/drivers/comx35.cpp
index 5d245ccd2ad..c6b10c873db 100644
--- a/src/mame/drivers/comx35.cpp
+++ b/src/mame/drivers/comx35.cpp
@@ -209,7 +209,7 @@ READ8_MEMBER( comx35_state::mem_r )
{
int extrom = 1;
- uint8_t data = m_exp->mrd_r(space, offset, &extrom);
+ uint8_t data = m_exp->mrd_r(offset, &extrom);
if (offset < 0x4000)
{
@@ -234,7 +234,7 @@ READ8_MEMBER( comx35_state::mem_r )
WRITE8_MEMBER( comx35_state::mem_w )
{
- m_exp->mwr_w(space, offset, data);
+ m_exp->mwr_w(offset, data);
if (offset >= 0x4000 && offset < 0xc000)
{
@@ -257,7 +257,7 @@ WRITE8_MEMBER( comx35_state::mem_w )
READ8_MEMBER( comx35_state::io_r )
{
- uint8_t data = m_exp->io_r(space, offset);
+ uint8_t data = m_exp->io_r(offset);
if (offset == 3)
{
@@ -274,7 +274,7 @@ READ8_MEMBER( comx35_state::io_r )
WRITE8_MEMBER( comx35_state::io_w )
{
- m_exp->io_w(space, offset, data);
+ m_exp->io_w(offset, data);
if (offset >= 3)
{
@@ -592,7 +592,7 @@ void comx35_state::machine_reset()
//**************************************************************************
//-------------------------------------------------
-// MACHINE_CONFIG( pal )
+// machine_config( pal )
//-------------------------------------------------
void comx35_state::base(machine_config &config, const XTAL clock)
@@ -625,8 +625,8 @@ void comx35_state::base(machine_config &config, const XTAL clock)
m_kbe->d11_callback().set_ioport("D11");
m_kbe->da_callback().set_inputline(m_maincpu, COSMAC_INPUT_LINE_EF3);
- quickload_image_device &quickload(QUICKLOAD(config, "quickload", 0));
- quickload.set_handler(snapquick_load_delegate(&QUICKLOAD_LOAD_NAME(comx35_state, comx), this), "comx", 0);
+ quickload_image_device &quickload(QUICKLOAD(config, "quickload"));
+ quickload.set_handler(snapquick_load_delegate(&QUICKLOAD_LOAD_NAME(comx35_state, comx), this), "comx");
CASSETTE(config, m_cassette).set_default_state((cassette_state) (CASSETTE_STOPPED | CASSETTE_MOTOR_ENABLED | CASSETTE_SPEAKER_ENABLED));
diff --git a/src/mame/drivers/concept.cpp b/src/mame/drivers/concept.cpp
index 4251ecd123c..4fcba27ad13 100644
--- a/src/mame/drivers/concept.cpp
+++ b/src/mame/drivers/concept.cpp
@@ -13,7 +13,7 @@
LAN port (seems more or less similar to AppleTalk)
* 4 expansion ports enable to add expansion cards, namely floppy disk
and hard disk controllers (the expansion ports are partially compatible
- with Apple 2 expansion ports)
+ with Apple 2 expansion ports; DMA is not supported)
Video: monochrome bitmapped display, 720*560 visible area (bitmaps are 768
pixels wide in memory). One interesting feature is the fact that the
@@ -39,6 +39,7 @@
#include "bus/a2bus/corvfdc01.h"
#include "bus/a2bus/corvfdc02.h"
#include "bus/rs232/rs232.h"
+#include "machine/input_merger.h"
#include "emupal.h"
#include "screen.h"
#include "speaker.h"
@@ -49,7 +50,7 @@ void concept_state::concept_memmap(address_map &map)
map(0x000008, 0x000fff).ram(); /* static RAM */
map(0x010000, 0x011fff).rom().region("maincpu", 0x010000); /* boot ROM */
map(0x020000, 0x021fff).rom().region("macsbug", 0x0); /* macsbugs ROM (optional) */
- map(0x030000, 0x03ffff).rw(FUNC(concept_state::concept_io_r), FUNC(concept_state::concept_io_w)); /* I/O space */
+ map(0x030000, 0x03ffff).rw(FUNC(concept_state::io_r), FUNC(concept_state::io_w)).umask16(0x00ff); /* I/O space */
map(0x080000, 0x0fffff).ram().share("videoram");/* AM_RAMBANK(2) */ /* DRAM */
}
@@ -209,7 +210,7 @@ void concept_a2_cards(device_slot_interface &device)
void concept_state::concept(machine_config &config)
{
/* basic machine hardware */
- M68000(config, m_maincpu, 8182000); /* 16.364 MHz / 2 */
+ M68000(config, m_maincpu, 16.364_MHz_XTAL / 2);
m_maincpu->set_addrmap(AS_PROGRAM, &concept_state::concept_memmap);
config.m_minimum_quantum = attotime::from_hz(60);
@@ -232,12 +233,12 @@ void concept_state::concept(machine_config &config)
SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 1.00);
/* rtc */
- MM58274C(config, m_mm58274, 0);
+ MM58274C(config, m_mm58274, 32.768_kHz_XTAL);
m_mm58274->set_mode24(0); // 12 hour
m_mm58274->set_day1(1); // monday
/* via */
- VIA6522(config, m_via0, 1022750);
+ VIA6522(config, m_via0, 16.364_MHz_XTAL / 16);
m_via0->readpa_handler().set(FUNC(concept_state::via_in_a));
m_via0->readpb_handler().set(FUNC(concept_state::via_in_b));
m_via0->writepa_handler().set(FUNC(concept_state::via_out_a));
@@ -246,24 +247,28 @@ void concept_state::concept(machine_config &config)
m_via0->irq_handler().set(FUNC(concept_state::via_irq_func));
/* ACIAs */
- MOS6551(config, m_acia0, 0);
- m_acia0->set_xtal(XTAL(1'843'200));
+ MOS6551(config, m_acia0, 16.364_MHz_XTAL / 16);
+ m_acia0->set_xtal(16.364_MHz_XTAL / 9);
m_acia0->txd_handler().set("rs232a", FUNC(rs232_port_device::write_txd));
- MOS6551(config, m_acia1, 0);
- m_acia1->set_xtal(XTAL(1'843'200));
+ MOS6551(config, m_acia1, 16.364_MHz_XTAL / 16);
+ m_acia1->set_xtal(16.364_MHz_XTAL / 9);
m_acia1->txd_handler().set("rs232b", FUNC(rs232_port_device::write_txd));
- MOS6551(config, m_kbdacia, 0);
- m_kbdacia->set_xtal(XTAL(1'843'200));
+ MOS6551(config, m_kbdacia, 16.364_MHz_XTAL / 16);
+ m_kbdacia->set_xtal(16.364_MHz_XTAL / 9);
/* Apple II bus */
- A2BUS(config, m_a2bus, 0).set_cputag(m_maincpu);
+ A2BUS(config, m_a2bus, 0).set_space(m_maincpu, AS_PROGRAM);
+ m_a2bus->nmi_w().set("iocint", FUNC(input_merger_device::in_w<0>));
+ m_a2bus->irq_w().set("iocint", FUNC(input_merger_device::in_w<1>));
A2BUS_SLOT(config, "sl1", m_a2bus, concept_a2_cards, nullptr);
A2BUS_SLOT(config, "sl2", m_a2bus, concept_a2_cards, nullptr);
A2BUS_SLOT(config, "sl3", m_a2bus, concept_a2_cards, nullptr);
A2BUS_SLOT(config, "sl4", m_a2bus, concept_a2_cards, "fdc01");
+ INPUT_MERGER_ANY_HIGH(config, "iocint").output_handler().set(FUNC(concept_state::ioc_interrupt));
+
/* 2x RS232 ports */
rs232_port_device &rs232a(RS232_PORT(config, "rs232a", default_rs232_devices, nullptr));
rs232a.rxd_handler().set(m_acia0, FUNC(mos6551_device::write_rxd));
diff --git a/src/mame/drivers/contra.cpp b/src/mame/drivers/contra.cpp
index 56f86ed6c26..b8990718f0c 100644
--- a/src/mame/drivers/contra.cpp
+++ b/src/mame/drivers/contra.cpp
@@ -206,27 +206,27 @@ void contra_state::machine_reset()
m_audiocpu->set_input_line(M6809_IRQ_LINE, CLEAR_LINE);
}
-MACHINE_CONFIG_START(contra_state::contra)
-
+void contra_state::contra(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", HD6309E, XTAL(24'000'000) / 8) /* 3000000? (HD63C09EP) */
- MCFG_DEVICE_PROGRAM_MAP(contra_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", contra_state, contra_interrupt)
+ HD6309E(config, m_maincpu, XTAL(24'000'000) / 8); /* 3000000? (HD63C09EP) */
+ m_maincpu->set_addrmap(AS_PROGRAM, &contra_state::contra_map);
+ m_maincpu->set_vblank_int("screen", FUNC(contra_state::contra_interrupt));
- MCFG_DEVICE_ADD("audiocpu", MC6809E, XTAL(24'000'000)/8) /* 3000000? (HD68B09EP) */
- MCFG_DEVICE_PROGRAM_MAP(sound_map)
+ MC6809E(config, m_audiocpu, XTAL(24'000'000)/8); /* 3000000? (HD68B09EP) */
+ m_audiocpu->set_addrmap(AS_PROGRAM, &contra_state::sound_map);
- MCFG_QUANTUM_TIME(attotime::from_hz(6000)) /* enough for the sound CPU to read all commands */
+ config.m_minimum_quantum = attotime::from_hz(6000); /* enough for the sound CPU to read all commands */
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */)
- MCFG_SCREEN_SIZE(37*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 35*8-1, 2*8, 30*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(contra_state, screen_update_contra)
- MCFG_SCREEN_PALETTE(m_palette)
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_refresh_hz(60);
+ m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(2500) /* not accurate */);
+ m_screen->set_size(37*8, 32*8);
+ m_screen->set_visarea(0*8, 35*8-1, 2*8, 30*8-1);
+ m_screen->set_screen_update(FUNC(contra_state::screen_update_contra));
+ m_screen->set_palette(m_palette);
GFXDECODE(config, m_gfxdecode, m_palette, gfx_contra);
@@ -247,7 +247,7 @@ MACHINE_CONFIG_START(contra_state::contra)
GENERIC_LATCH_8(config, "soundlatch");
YM2151(config, "ymsnd", XTAL(3'579'545)).add_route(0, "lspeaker", 0.60).add_route(1, "rspeaker", 0.60);
-MACHINE_CONFIG_END
+}
ROM_START( contra )
diff --git a/src/mame/drivers/controlid.cpp b/src/mame/drivers/controlid.cpp
index 926eaea65f2..f026d795baa 100644
--- a/src/mame/drivers/controlid.cpp
+++ b/src/mame/drivers/controlid.cpp
@@ -144,7 +144,8 @@ void controlidx628_state::controlidx628_palette(palette_device &palette) const
* Machine Driver *
*************************/
-MACHINE_CONFIG_START(controlidx628_state::controlidx628)
+void controlidx628_state::controlidx628(machine_config &config)
+{
// basic machine hardware
at89s52_device &maincpu(AT89S52(config, "maincpu", XTAL(11'059'200)));
maincpu.set_addrmap(AS_IO, &controlidx628_state::io_map);
@@ -156,18 +157,18 @@ MACHINE_CONFIG_START(controlidx628_state::controlidx628)
maincpu.port_out_cb<3>().set(FUNC(controlidx628_state::p3_w));
// video hardware
- MCFG_SCREEN_ADD("screen", LCD)
- MCFG_SCREEN_REFRESH_RATE(50)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) // not accurate
- MCFG_SCREEN_SIZE(132, 65)
- MCFG_SCREEN_VISIBLE_AREA(3, 130, 0, 63)
- MCFG_SCREEN_UPDATE_DEVICE("nt7534", nt7534_device, screen_update)
- MCFG_SCREEN_PALETTE("palette")
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_LCD));
+ screen.set_refresh_hz(50);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500)); // not accurate
+ screen.set_size(132, 65);
+ screen.set_visarea(3, 130, 0, 63);
+ screen.set_screen_update("nt7534", FUNC(nt7534_device::screen_update));
+ screen.set_palette("palette");
PALETTE(config, "palette", FUNC(controlidx628_state::controlidx628_palette), 2);
NT7534(config, m_lcdc);
-MACHINE_CONFIG_END
+}
/*************************
diff --git a/src/mame/drivers/coolpool.cpp b/src/mame/drivers/coolpool.cpp
index 945c12246f9..c3c26b3ff4b 100644
--- a/src/mame/drivers/coolpool.cpp
+++ b/src/mame/drivers/coolpool.cpp
@@ -528,7 +528,6 @@ void coolpool_state::amerdart_map(address_map &map)
map(0x04000000, 0x0400000f).w(FUNC(coolpool_state::amerdart_misc_w));
map(0x05000000, 0x0500000f).r(m_dsp2main, FUNC(generic_latch_16_device::read)).w(m_main2dsp, FUNC(generic_latch_16_device::write));
map(0x06000000, 0x06007fff).ram().w(FUNC(coolpool_state::nvram_thrash_data_w)).share("nvram");
- map(0xc0000000, 0xc00001ff).rw(m_maincpu, FUNC(tms34010_device::io_register_r), FUNC(tms34010_device::io_register_w));
map(0xffb00000, 0xffffffff).rom().region("maincpu", 0);
}
@@ -541,7 +540,6 @@ void coolpool_state::coolpool_map(address_map &map)
map(0x03000000, 0x0300000f).w(FUNC(coolpool_state::coolpool_misc_w));
map(0x03000000, 0x03ffffff).rom().region("gfx1", 0);
map(0x06000000, 0x06007fff).ram().w(FUNC(coolpool_state::nvram_thrash_data_w)).share("nvram");
- map(0xc0000000, 0xc00001ff).rw(m_maincpu, FUNC(tms34010_device::io_register_r), FUNC(tms34010_device::io_register_w));
map(0xffe00000, 0xffffffff).rom().region("maincpu", 0);
}
@@ -553,7 +551,6 @@ void coolpool_state::nballsht_map(address_map &map)
map(0x03000000, 0x0300000f).w(FUNC(coolpool_state::coolpool_misc_w));
map(0x04000000, 0x040000ff).rw(m_tlc34076, FUNC(tlc34076_device::read), FUNC(tlc34076_device::write)).umask16(0x00ff); // IMSG176P-40
map(0x06000000, 0x0601ffff).mirror(0x00020000).ram().w(FUNC(coolpool_state::nvram_thrash_data_w)).share("nvram");
- map(0xc0000000, 0xc00001ff).rw(m_maincpu, FUNC(tms34010_device::io_register_r), FUNC(tms34010_device::io_register_w));
map(0xff000000, 0xff7fffff).rom().region("gfx1", 0);
map(0xffc00000, 0xffffffff).rom().region("maincpu", 0);
}
@@ -713,8 +710,8 @@ INPUT_PORTS_END
*
*************************************/
-MACHINE_CONFIG_START(coolpool_state::amerdart)
-
+void coolpool_state::amerdart(machine_config &config)
+{
/* basic machine hardware */
TMS34010(config, m_maincpu, XTAL(40'000'000));
m_maincpu->set_addrmap(AS_PROGRAM, &coolpool_state::amerdart_map);
@@ -731,7 +728,7 @@ MACHINE_CONFIG_START(coolpool_state::amerdart)
dsp.set_addrmap(AS_IO, &coolpool_state::amerdart_dsp_io_map);
dsp.bio().set(FUNC(coolpool_state::amerdart_dsp_bio_line_r));
- MCFG_TIMER_DRIVER_ADD_SCANLINE("audioint", coolpool_state, amerdart_audio_int_gen, "screen", 0, 1)
+ TIMER(config, "audioint").configure_scanline(FUNC(coolpool_state::amerdart_audio_int_gen), "screen", 0, 1);
GENERIC_LATCH_16(config, m_main2dsp);
GENERIC_LATCH_16(config, m_dsp2main);
@@ -740,23 +737,24 @@ MACHINE_CONFIG_START(coolpool_state::amerdart)
MCFG_MACHINE_RESET_OVERRIDE(coolpool_state,amerdart)
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
- MCFG_TIMER_DRIVER_ADD(m_nvram_timer, coolpool_state, nvram_write_timeout)
+ TIMER(config, m_nvram_timer).configure_generic(FUNC(coolpool_state::nvram_write_timeout));
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_RAW_PARAMS(XTAL(40'000'000)/6, 212*2, 0, 161*2, 262, 0, 241)
- MCFG_SCREEN_UPDATE_DEVICE("maincpu", tms34010_device, tms340x0_rgb32)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_raw(XTAL(40'000'000)/6, 212*2, 0, 161*2, 262, 0, 241);
+ screen.set_screen_update("maincpu", FUNC(tms34010_device::tms340x0_rgb32));
/* sound hardware */
SPEAKER(config, "speaker").front_center();
- MCFG_DEVICE_ADD("dac", MP1210, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 1.0)
- MCFG_DEVICE_ADD("vref", VOLTAGE_REGULATOR, 0) MCFG_VOLTAGE_REGULATOR_OUTPUT(5.0)
- MCFG_SOUND_ROUTE(0, "dac", 1.0, DAC_VREF_POS_INPUT) MCFG_SOUND_ROUTE(0, "dac", -1.0, DAC_VREF_NEG_INPUT)
-MACHINE_CONFIG_END
-
+ MP1210(config, "dac", 0).add_route(ALL_OUTPUTS, "speaker", 1.0);
+ voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref"));
+ vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT);
+ vref.add_route(0, "dac", -1.0, DAC_VREF_NEG_INPUT);
+}
-MACHINE_CONFIG_START(coolpool_state::coolpool)
+void coolpool_state::coolpool(machine_config &config)
+{
/* basic machine hardware */
TMS34010(config, m_maincpu, XTAL(40'000'000));
m_maincpu->set_addrmap(AS_PROGRAM, &coolpool_state::coolpool_map);
@@ -785,21 +783,22 @@ MACHINE_CONFIG_START(coolpool_state::coolpool)
MCFG_MACHINE_RESET_OVERRIDE(coolpool_state,coolpool)
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
- MCFG_TIMER_DRIVER_ADD(m_nvram_timer, coolpool_state, nvram_write_timeout)
+ TIMER(config, m_nvram_timer).configure_generic(FUNC(coolpool_state::nvram_write_timeout));
/* video hardware */
- MCFG_TLC34076_ADD("tlc34076", TLC34076_6_BIT)
+ TLC34076(config, m_tlc34076, tlc34076_device::TLC34076_6_BIT);
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_RAW_PARAMS(XTAL(40'000'000)/6, 424, 0, 320, 262, 0, 240)
- MCFG_SCREEN_UPDATE_DEVICE("maincpu", tms34010_device, tms340x0_rgb32)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_raw(XTAL(40'000'000)/6, 424, 0, 320, 262, 0, 240);
+ screen.set_screen_update("maincpu", FUNC(tms34010_device::tms340x0_rgb32));
/* sound hardware */
SPEAKER(config, "speaker").front_center();
- MCFG_DEVICE_ADD("dac", MP1210, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 1.0)
- MCFG_DEVICE_ADD("vref", VOLTAGE_REGULATOR, 0) MCFG_VOLTAGE_REGULATOR_OUTPUT(5.0)
- MCFG_SOUND_ROUTE(0, "dac", 1.0, DAC_VREF_POS_INPUT) MCFG_SOUND_ROUTE(0, "dac", -1.0, DAC_VREF_NEG_INPUT)
-MACHINE_CONFIG_END
+ MP1210(config, "dac", 0).add_route(ALL_OUTPUTS, "speaker", 1.0);
+ voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref"));
+ vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT);
+ vref.add_route(0, "dac", -1.0, DAC_VREF_NEG_INPUT);
+}
void coolpool_state::_9ballsht(machine_config &config)
diff --git a/src/mame/drivers/coolridr.cpp b/src/mame/drivers/coolridr.cpp
index 5e0840bd651..b58f7718fb7 100644
--- a/src/mame/drivers/coolridr.cpp
+++ b/src/mame/drivers/coolridr.cpp
@@ -3219,17 +3219,18 @@ WRITE_LINE_MEMBER(coolridr_state::scsp2_to_sh1_irq)
#define MAIN_CLOCK XTAL(28'636'363)
-MACHINE_CONFIG_START(coolridr_state::coolridr)
- MCFG_DEVICE_ADD("maincpu", SH2, MAIN_CLOCK) // 28 MHz
- MCFG_DEVICE_PROGRAM_MAP(system_h1_map)
- MCFG_TIMER_DRIVER_ADD_SCANLINE("scantimer", coolridr_state, interrupt_main, "screen", 0, 1)
+void coolridr_state::coolridr(machine_config &config)
+{
+ SH2(config, m_maincpu, MAIN_CLOCK); // 28 MHz
+ m_maincpu->set_addrmap(AS_PROGRAM, &coolridr_state::system_h1_map);
+ TIMER(config, "scantimer").configure_scanline(FUNC(coolridr_state::interrupt_main), "screen", 0, 1);
- MCFG_DEVICE_ADD("soundcpu", M68000, 22579000/2) // 22.579 MHz XTAL / 2 = 11.2895 MHz
- MCFG_DEVICE_PROGRAM_MAP(system_h1_sound_map)
+ M68000(config, m_soundcpu, 22579000/2); // 22.579 MHz XTAL / 2 = 11.2895 MHz
+ m_soundcpu->set_addrmap(AS_PROGRAM, &coolridr_state::system_h1_sound_map);
- MCFG_DEVICE_ADD("sub", SH1, 16000000) // SH7032 HD6417032F20!! 16 MHz
- MCFG_DEVICE_PROGRAM_MAP(coolridr_submap)
- MCFG_TIMER_DRIVER_ADD_SCANLINE("scantimer2", coolridr_state, interrupt_sub, "screen", 0, 1)
+ SH1(config, m_subcpu, 16000000); // SH7032 HD6417032F20!! 16 MHz
+ m_subcpu->set_addrmap(AS_PROGRAM, &coolridr_state::coolridr_submap);
+ TIMER(config, "scantimer2").configure_scanline(FUNC(coolridr_state::interrupt_sub), "screen", 0, 1);
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
@@ -3245,21 +3246,21 @@ MACHINE_CONFIG_START(coolridr_state::coolridr)
io.an_port_callback<5>().set_ioport("AN5");
io.an_port_callback<6>().set_ioport("AN6");
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_coolridr)
+ GFXDECODE(config, m_gfxdecode, m_palette, gfx_coolridr);
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_SIZE(640, 512)
- MCFG_SCREEN_VISIBLE_AREA(CLIPMINX_FULL,CLIPMAXX_FULL, CLIPMINY_FULL, CLIPMAXY_FULL)
- MCFG_SCREEN_UPDATE_DRIVER(coolridr_state, screen_update<0>)
- MCFG_SCREEN_PALETTE(m_palette)
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_refresh_hz(60);
+ m_screen->set_size(640, 512);
+ m_screen->set_visarea(CLIPMINX_FULL,CLIPMAXX_FULL, CLIPMINY_FULL, CLIPMAXY_FULL);
+ m_screen->set_screen_update(FUNC(coolridr_state::screen_update<0>));
+ m_screen->set_palette(m_palette);
- MCFG_SCREEN_ADD("screen2", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_SIZE(640, 512)
- MCFG_SCREEN_VISIBLE_AREA(CLIPMINX_FULL,CLIPMAXX_FULL, CLIPMINY_FULL, CLIPMAXY_FULL)
- MCFG_SCREEN_UPDATE_DRIVER(coolridr_state, screen_update<1>)
- MCFG_SCREEN_PALETTE(m_palette)
+ screen_device &screen2(SCREEN(config, "screen2", SCREEN_TYPE_RASTER));
+ screen2.set_refresh_hz(60);
+ screen2.set_size(640, 512);
+ screen2.set_visarea(CLIPMINX_FULL,CLIPMAXX_FULL, CLIPMINY_FULL, CLIPMAXY_FULL);
+ screen2.set_screen_update(FUNC(coolridr_state::screen_update<1>));
+ screen2.set_palette(m_palette);
PALETTE(config, m_palette, palette_device::RGB_555);
@@ -3280,20 +3281,19 @@ MACHINE_CONFIG_START(coolridr_state::coolridr)
scsp2.main_irq_cb().set(FUNC(coolridr_state::scsp2_to_sh1_irq));
scsp2.add_route(0, "lspeaker", 1.0);
scsp2.add_route(1, "rspeaker", 1.0);
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(coolridr_state::aquastge)
+void coolridr_state::aquastge(machine_config &config)
+{
coolridr(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(aquastge_h1_map)
+ m_maincpu->set_addrmap(AS_PROGRAM, &coolridr_state::aquastge_h1_map);
- MCFG_DEVICE_MODIFY("sub")
- MCFG_DEVICE_PROGRAM_MAP(aquastge_submap)
+ m_subcpu->set_addrmap(AS_PROGRAM, &coolridr_state::aquastge_submap);
sega_315_5649_device &io(SEGA_315_5649(config.replace(), "io", 0));
io.in_pc_callback().set_ioport("IN0");
io.in_pd_callback().set_ioport("IN1");
-MACHINE_CONFIG_END
+}
ROM_START( coolridr )
ROM_REGION( 0x200000, "maincpu", 0 ) /* SH2 code */
diff --git a/src/mame/drivers/cop01.cpp b/src/mame/drivers/cop01.cpp
index 31fe01d33ea..605268c84f0 100644
--- a/src/mame/drivers/cop01.cpp
+++ b/src/mame/drivers/cop01.cpp
@@ -446,27 +446,27 @@ void cop01_state::machine_reset()
}
-MACHINE_CONFIG_START(cop01_state::cop01)
-
+void cop01_state::cop01(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, MAINCPU_CLOCK/2) /* unknown clock / divider */
- MCFG_DEVICE_PROGRAM_MAP(cop01_map)
- MCFG_DEVICE_IO_MAP(io_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", cop01_state, irq0_line_assert)
+ Z80(config, m_maincpu, MAINCPU_CLOCK/2); /* unknown clock / divider */
+ m_maincpu->set_addrmap(AS_PROGRAM, &cop01_state::cop01_map);
+ m_maincpu->set_addrmap(AS_IO, &cop01_state::io_map);
+ m_maincpu->set_vblank_int("screen", FUNC(cop01_state::irq0_line_assert));
- MCFG_DEVICE_ADD("audiocpu", Z80, XTAL(3'000'000)) /* unknown clock / divider, hand-tuned to match audio reference */
- MCFG_DEVICE_PROGRAM_MAP(sound_map)
- MCFG_DEVICE_IO_MAP(audio_io_map)
+ Z80(config, m_audiocpu, XTAL(3'000'000)); /* unknown clock / divider, hand-tuned to match audio reference */
+ m_audiocpu->set_addrmap(AS_PROGRAM, &cop01_state::sound_map);
+ m_audiocpu->set_addrmap(AS_IO, &cop01_state::audio_io_map);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(32*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(cop01_state, screen_update_cop01)
- MCFG_SCREEN_PALETTE(m_palette)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(32*8, 32*8);
+ screen.set_visarea(0*8, 32*8-1, 2*8, 30*8-1);
+ screen.set_screen_update(FUNC(cop01_state::screen_update_cop01));
+ screen.set_palette(m_palette);
GFXDECODE(config, m_gfxdecode, m_palette, gfx_cop01);
PALETTE(config, m_palette, FUNC(cop01_state::cop01_palette), 16+8*16+16*16, 256);
@@ -481,31 +481,31 @@ MACHINE_CONFIG_START(cop01_state::cop01)
AY8910(config, "ay2", 1250000).add_route(ALL_OUTPUTS, "mono", 0.25); /* unknown clock / divider, hand-tuned to match audio reference */
AY8910(config, "ay3", 1250000).add_route(ALL_OUTPUTS, "mono", 0.25); /* unknown clock / divider, hand-tuned to match audio reference */
-MACHINE_CONFIG_END
-
-MACHINE_CONFIG_START(mightguy_state::mightguy)
+}
+void mightguy_state::mightguy(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, MAINCPU_CLOCK/2) /* unknown divider */
- MCFG_DEVICE_PROGRAM_MAP(cop01_map)
- MCFG_DEVICE_IO_MAP(mightguy_io_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", cop01_state, irq0_line_assert)
+ Z80(config, m_maincpu, MAINCPU_CLOCK/2); /* unknown divider */
+ m_maincpu->set_addrmap(AS_PROGRAM, &mightguy_state::cop01_map);
+ m_maincpu->set_addrmap(AS_IO, &mightguy_state::mightguy_io_map);
+ m_maincpu->set_vblank_int("screen", FUNC(cop01_state::irq0_line_assert));
- MCFG_DEVICE_ADD("audiocpu", Z80, AUDIOCPU_CLOCK/2) /* unknown divider */
- MCFG_DEVICE_PROGRAM_MAP(sound_map)
- MCFG_DEVICE_IO_MAP(mightguy_audio_io_map)
+ Z80(config, m_audiocpu, AUDIOCPU_CLOCK/2); /* unknown divider */
+ m_audiocpu->set_addrmap(AS_PROGRAM, &mightguy_state::sound_map);
+ m_audiocpu->set_addrmap(AS_IO, &mightguy_state::mightguy_audio_io_map);
NB1412M2(config, m_prot, XTAL(8'000'000)/2); // divided by 2 maybe
m_prot->dac_callback().set("dac", FUNC(dac_byte_interface::data_w));
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(32*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(cop01_state, screen_update_cop01)
- MCFG_SCREEN_PALETTE(m_palette)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(32*8, 32*8);
+ screen.set_visarea(0*8, 32*8-1, 2*8, 30*8-1);
+ screen.set_screen_update(FUNC(cop01_state::screen_update_cop01));
+ screen.set_palette(m_palette);
GFXDECODE(config, m_gfxdecode, m_palette, gfx_cop01);
PALETTE(config, m_palette, FUNC(cop01_state::cop01_palette), 16+8*16+16*16, 256);
@@ -515,14 +515,13 @@ MACHINE_CONFIG_START(mightguy_state::mightguy)
GENERIC_LATCH_8(config, m_soundlatch);
- MCFG_DEVICE_ADD("ymsnd", YM3526, AUDIOCPU_CLOCK/2) /* unknown divider */
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
+ YM3526(config, "ymsnd", AUDIOCPU_CLOCK/2).add_route(ALL_OUTPUTS, "mono", 1.0); /* unknown divider */
- MCFG_DEVICE_ADD("dac", DAC_8BIT_R2R, 0) // unknown DAC
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.5)
- MCFG_DEVICE_ADD("vref", VOLTAGE_REGULATOR, 0) MCFG_VOLTAGE_REGULATOR_OUTPUT(5.0)
- MCFG_SOUND_ROUTE(0, "dac", 1.0, DAC_VREF_POS_INPUT) MCFG_SOUND_ROUTE(0, "dac", -1.0, DAC_VREF_NEG_INPUT)
-MACHINE_CONFIG_END
+ DAC_8BIT_R2R(config, "dac", 0).add_route(ALL_OUTPUTS, "mono", 0.5); // unknown DAC
+ voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref"));
+ vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT);
+ vref.add_route(0, "dac", -1.0, DAC_VREF_NEG_INPUT);
+}
diff --git a/src/mame/drivers/copsnrob.cpp b/src/mame/drivers/copsnrob.cpp
index f55533f8aa3..061158521e4 100644
--- a/src/mame/drivers/copsnrob.cpp
+++ b/src/mame/drivers/copsnrob.cpp
@@ -248,11 +248,11 @@ void copsnrob_state::machine_reset()
}
-MACHINE_CONFIG_START(copsnrob_state::copsnrob)
-
+void copsnrob_state::copsnrob(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M6502,14318180/16) /* 894886.25 kHz */
- MCFG_DEVICE_PROGRAM_MAP(main_map)
+ M6502(config, m_maincpu, 14318180/16); /* 894886.25 kHz */
+ m_maincpu->set_addrmap(AS_PROGRAM, &copsnrob_state::main_map);
/* video hardware */
SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
@@ -263,11 +263,11 @@ MACHINE_CONFIG_START(copsnrob_state::copsnrob)
m_screen->set_screen_update(FUNC(copsnrob_state::screen_update_copsnrob));
m_screen->set_palette(m_palette);
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_copsnrob)
+ GFXDECODE(config, m_gfxdecode, m_palette, gfx_copsnrob);
PALETTE(config, m_palette, palette_device::MONOCHROME);
copsnrob_audio(config);
-MACHINE_CONFIG_END
+}
diff --git a/src/mame/drivers/corona.cpp b/src/mame/drivers/corona.cpp
index 83e220434c4..21453d8c290 100644
--- a/src/mame/drivers/corona.cpp
+++ b/src/mame/drivers/corona.cpp
@@ -1385,28 +1385,29 @@ INPUT_PORTS_END
* Machine Drivers *
*******************************************/
-MACHINE_CONFIG_START(corona_state::winner81)
+void corona_state::winner81(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, WC81_MAIN_XTAL/8) /* measured */
- MCFG_DEVICE_PROGRAM_MAP(winner81_map)
- MCFG_DEVICE_IO_MAP(winner81_cpu_io_map)
+ Z80(config, m_maincpu, WC81_MAIN_XTAL/8); /* measured */
+ m_maincpu->set_addrmap(AS_PROGRAM, &corona_state::winner81_map);
+ m_maincpu->set_addrmap(AS_IO, &corona_state::winner81_cpu_io_map);
- MCFG_DEVICE_ADD("soundcpu", Z80, WC81_MAIN_XTAL/10) /* measured */
- MCFG_DEVICE_PROGRAM_MAP(winner81_sound_map)
- MCFG_DEVICE_IO_MAP(winner81_sound_cpu_io_map)
- MCFG_DEVICE_PERIODIC_INT_DRIVER(corona_state, nmi_line_pulse, 244) /* 244 Hz (1MHz/16/16/16) */
+ Z80(config, m_soundcpu, WC81_MAIN_XTAL/10); /* measured */
+ m_soundcpu->set_addrmap(AS_PROGRAM, &corona_state::winner81_sound_map);
+ m_soundcpu->set_addrmap(AS_IO, &corona_state::winner81_sound_cpu_io_map);
+ m_soundcpu->set_periodic_int(FUNC(corona_state::nmi_line_pulse), attotime::from_hz(244)); /* 244 Hz (1MHz/16/16/16) */
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) //not accurate
- MCFG_SCREEN_SIZE(32*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 1*8, 31*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(corona_state, screen_update_winner)
- MCFG_SCREEN_PALETTE("palette")
- MCFG_SCREEN_VBLANK_CALLBACK(INPUTLINE("maincpu", INPUT_LINE_NMI))
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_refresh_hz(60);
+ m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(2500)); //not accurate
+ m_screen->set_size(32*8, 32*8);
+ m_screen->set_visarea(0*8, 32*8-1, 1*8, 31*8-1);
+ m_screen->set_screen_update(FUNC(corona_state::screen_update_winner));
+ m_screen->set_palette("palette");
+ m_screen->screen_vblank().set_inputline(m_maincpu, INPUT_LINE_NMI);
PALETTE(config, "palette", FUNC(corona_state::corona_palette), 0x100);
@@ -1415,30 +1416,31 @@ MACHINE_CONFIG_START(corona_state::winner81)
GENERIC_LATCH_8(config, m_soundlatch);
AY8912(config, "aysnd", AY_CLK1).add_route(ALL_OUTPUTS, "mono", 1.0); /* measured */
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(corona_state::winner82)
+void corona_state::winner82(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, WC82_MAIN_XTAL/8) /* measured */
- MCFG_DEVICE_PROGRAM_MAP(winner82_map)
- MCFG_DEVICE_IO_MAP(winner82_cpu_io_map)
+ Z80(config, m_maincpu, WC82_MAIN_XTAL/8); /* measured */
+ m_maincpu->set_addrmap(AS_PROGRAM, &corona_state::winner82_map);
+ m_maincpu->set_addrmap(AS_IO, &corona_state::winner82_cpu_io_map);
- MCFG_DEVICE_ADD("soundcpu", Z80, WC82_MAIN_XTAL/8) /* measured */
- MCFG_DEVICE_PROGRAM_MAP(winner82_sound_map) /* IM1 instead of NMI */
- MCFG_DEVICE_IO_MAP(winner82_sound_cpu_io_map)
+ Z80(config, m_soundcpu, WC82_MAIN_XTAL/8); /* measured */
+ m_soundcpu->set_addrmap(AS_PROGRAM, &corona_state::winner82_sound_map); /* IM1 instead of NMI */
+ m_soundcpu->set_addrmap(AS_IO, &corona_state::winner82_sound_cpu_io_map);
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) //not accurate
- MCFG_SCREEN_SIZE(32*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 1*8, 31*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(corona_state, screen_update_winner)
- MCFG_SCREEN_PALETTE("palette")
- MCFG_SCREEN_VBLANK_CALLBACK(INPUTLINE("maincpu", INPUT_LINE_NMI))
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_refresh_hz(60);
+ m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(2500)); //not accurate
+ m_screen->set_size(32*8, 32*8);
+ m_screen->set_visarea(0*8, 32*8-1, 1*8, 31*8-1);
+ m_screen->set_screen_update(FUNC(corona_state::screen_update_winner));
+ m_screen->set_palette("palette");
+ m_screen->screen_vblank().set_inputline(m_maincpu, INPUT_LINE_NMI);
PALETTE(config, "palette", FUNC(corona_state::corona_palette), 0x100);
@@ -1447,31 +1449,32 @@ MACHINE_CONFIG_START(corona_state::winner82)
GENERIC_LATCH_8(config, m_soundlatch);
AY8910(config, "aysnd", AY_CLK2).add_route(ALL_OUTPUTS, "mono", 1.0); /* measured */
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(corona_state::re800)
+void corona_state::re800(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, RE_MAIN_XTAL/8) /* measured 2MHz */
- MCFG_DEVICE_PROGRAM_MAP(re800_map)
- MCFG_DEVICE_IO_MAP(re800_cpu_io_map)
+ Z80(config, m_maincpu, RE_MAIN_XTAL/8); /* measured 2MHz */
+ m_maincpu->set_addrmap(AS_PROGRAM, &corona_state::re800_map);
+ m_maincpu->set_addrmap(AS_IO, &corona_state::re800_cpu_io_map);
- MCFG_DEVICE_ADD("soundcpu", Z80, RE_MAIN_XTAL/8) /* measured 2MHz */
- MCFG_DEVICE_PROGRAM_MAP(re800_sound_map)
- MCFG_DEVICE_IO_MAP(re800_sound_cpu_io_map)
- MCFG_DEVICE_PERIODIC_INT_DRIVER(corona_state, nmi_line_pulse, 244) /* 244 Hz (1MHz/16/16/16) */
+ Z80(config, m_soundcpu, RE_MAIN_XTAL/8); /* measured 2MHz */
+ m_soundcpu->set_addrmap(AS_PROGRAM, &corona_state::re800_sound_map);
+ m_soundcpu->set_addrmap(AS_IO, &corona_state::re800_sound_cpu_io_map);
+ m_soundcpu->set_periodic_int(FUNC(corona_state::nmi_line_pulse), attotime::from_hz(244)); /* 244 Hz (1MHz/16/16/16) */
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) //not accurate
- MCFG_SCREEN_SIZE(32*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 1*8, 32*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(corona_state, screen_update_winner)
- MCFG_SCREEN_PALETTE("palette")
- MCFG_SCREEN_VBLANK_CALLBACK(INPUTLINE("maincpu", INPUT_LINE_NMI))
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_refresh_hz(60);
+ m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(2500)); //not accurate
+ m_screen->set_size(32*8, 32*8);
+ m_screen->set_visarea(0*8, 32*8-1, 1*8, 32*8-1);
+ m_screen->set_screen_update(FUNC(corona_state::screen_update_winner));
+ m_screen->set_palette("palette");
+ m_screen->screen_vblank().set_inputline(m_maincpu, INPUT_LINE_NMI);
PALETTE(config, "palette", FUNC(corona_state::corona_palette), 0x100);
@@ -1480,30 +1483,31 @@ MACHINE_CONFIG_START(corona_state::re800)
GENERIC_LATCH_8(config, m_soundlatch);
AY8912(config, "aysnd", AY_CLK2).add_route(ALL_OUTPUTS, "mono", 1.0);
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(corona_state::rcirulet)
+void corona_state::rcirulet(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, RE_MAIN_XTAL/8) /* measured 2MHz */
- MCFG_DEVICE_PROGRAM_MAP(re800_map)
- MCFG_DEVICE_IO_MAP(re800_cpu_io_map)
+ Z80(config, m_maincpu, RE_MAIN_XTAL/8); /* measured 2MHz */
+ m_maincpu->set_addrmap(AS_PROGRAM, &corona_state::re800_map);
+ m_maincpu->set_addrmap(AS_IO, &corona_state::re800_cpu_io_map);
- MCFG_DEVICE_ADD("soundcpu", Z80, RE_MAIN_XTAL/8) /* measured 2MHz */
- MCFG_DEVICE_PROGRAM_MAP(winner82_sound_map) /* IM1 instead of NMI */
- MCFG_DEVICE_IO_MAP(winner82_sound_cpu_io_map)
+ Z80(config, m_soundcpu, RE_MAIN_XTAL/8); /* measured 2MHz */
+ m_soundcpu->set_addrmap(AS_PROGRAM, &corona_state::winner82_sound_map); /* IM1 instead of NMI */
+ m_soundcpu->set_addrmap(AS_IO, &corona_state::winner82_sound_cpu_io_map);
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) //not accurate
- MCFG_SCREEN_SIZE(32*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 1*8, 32*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(corona_state, screen_update_winner)
- MCFG_SCREEN_PALETTE("palette")
- MCFG_SCREEN_VBLANK_CALLBACK(INPUTLINE("maincpu", INPUT_LINE_NMI))
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_refresh_hz(60);
+ m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(2500)); //not accurate
+ m_screen->set_size(32*8, 32*8);
+ m_screen->set_visarea(0*8, 32*8-1, 1*8, 32*8-1);
+ m_screen->set_screen_update(FUNC(corona_state::screen_update_winner));
+ m_screen->set_palette("palette");
+ m_screen->screen_vblank().set_inputline(m_maincpu, INPUT_LINE_NMI);
PALETTE(config, "palette", FUNC(corona_state::corona_palette), 0x100);
@@ -1512,31 +1516,32 @@ MACHINE_CONFIG_START(corona_state::rcirulet)
GENERIC_LATCH_8(config, m_soundlatch);
AY8912(config, "aysnd", AY_CLK2).add_route(ALL_OUTPUTS, "mono", 1.0);
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(corona_state::luckyrlt)
+void corona_state::luckyrlt(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, RE_MAIN_XTAL/8) /* measured 2MHz */
- MCFG_DEVICE_PROGRAM_MAP(luckyrlt_map)
- MCFG_DEVICE_IO_MAP(luckyrlt_cpu_io_map)
+ Z80(config, m_maincpu, RE_MAIN_XTAL/8); /* measured 2MHz */
+ m_maincpu->set_addrmap(AS_PROGRAM, &corona_state::luckyrlt_map);
+ m_maincpu->set_addrmap(AS_IO, &corona_state::luckyrlt_cpu_io_map);
- MCFG_DEVICE_ADD("soundcpu", Z80, RE_MAIN_XTAL/8) /* measured 2MHz */
- MCFG_DEVICE_PROGRAM_MAP(luckyrlt_sound_map)
- MCFG_DEVICE_IO_MAP(luckyrlt_sound_cpu_io_map)
- MCFG_DEVICE_PERIODIC_INT_DRIVER(corona_state, nmi_line_pulse, 244) /* 244 Hz (1MHz/16/16/16) */
+ Z80(config, m_soundcpu, RE_MAIN_XTAL/8); /* measured 2MHz */
+ m_soundcpu->set_addrmap(AS_PROGRAM, &corona_state::luckyrlt_sound_map);
+ m_soundcpu->set_addrmap(AS_IO, &corona_state::luckyrlt_sound_cpu_io_map);
+ m_soundcpu->set_periodic_int(FUNC(corona_state::nmi_line_pulse), attotime::from_hz(244)); /* 244 Hz (1MHz/16/16/16) */
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) //not accurate
- MCFG_SCREEN_SIZE(32*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 1*8, 30*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(corona_state, screen_update_luckyrlt)
- MCFG_SCREEN_PALETTE("palette")
- MCFG_SCREEN_VBLANK_CALLBACK(INPUTLINE("maincpu", INPUT_LINE_NMI))
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_refresh_hz(60);
+ m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(2500)); //not accurate
+ m_screen->set_size(32*8, 32*8);
+ m_screen->set_visarea(0*8, 32*8-1, 1*8, 30*8-1);
+ m_screen->set_screen_update(FUNC(corona_state::screen_update_luckyrlt));
+ m_screen->set_palette("palette");
+ m_screen->screen_vblank().set_inputline(m_maincpu, INPUT_LINE_NMI);
PALETTE(config, "palette", FUNC(corona_state::corona_palette), 0x100);
@@ -1545,7 +1550,7 @@ MACHINE_CONFIG_START(corona_state::luckyrlt)
GENERIC_LATCH_8(config, m_soundlatch);
AY8912(config, "aysnd", AY_CLK1).add_route(ALL_OUTPUTS, "mono", 1.0);
-MACHINE_CONFIG_END
+}
/**************** Corona Co,LTD. Hardware ****************
diff --git a/src/mame/drivers/cortex.cpp b/src/mame/drivers/cortex.cpp
index e127ba600ab..11159292b18 100644
--- a/src/mame/drivers/cortex.cpp
+++ b/src/mame/drivers/cortex.cpp
@@ -90,26 +90,22 @@ void cortex_state::mem_map(address_map &map)
map(0x0000, 0x7fff).bankr("bankr0").bankw("bankw0");
map(0x8000, 0xefff).ram();
map(0xf100, 0xf11f).ram(); // memory mapping unit
- map(0xf120, 0xf120).rw("crtc", FUNC(tms9928a_device::vram_r), FUNC(tms9928a_device::vram_w));
- map(0xf121, 0xf121).rw("crtc", FUNC(tms9928a_device::register_r), FUNC(tms9928a_device::register_w));
- //AM_RANGE(0xf140, 0xf147) // fdc tms9909
+ map(0xf120, 0xf121).rw("crtc", FUNC(tms9928a_device::read), FUNC(tms9928a_device::write));
+ //map(0xf140, 0xf147) // fdc tms9909
}
void cortex_state::io_map(address_map &map)
{
map.unmap_value_high();
- map(0x0000, 0x0007).mirror(0x18).w("control", FUNC(ls259_device::write_d0));
- map(0x0000, 0x0000).r(FUNC(cortex_state::pio_r));
- map(0x0001, 0x0001).r(FUNC(cortex_state::keyboard_r));
- //AM_RANGE(0x0040, 0x005f) AM_DEVWRITE("uart1", tms9902_device, cruwrite) // RS232 (r12 = 80-bf)
- //AM_RANGE(0x0008, 0x000b) AM_DEVREAD("uart1", tms9902_device, cruread) // RS232
- //AM_RANGE(0x00c0, 0x00df) AM_DEVWRITE("uart2", tms9902_device, cruwrite) // Cassette (r12 = 180-1bf)
- //AM_RANGE(0x0018, 0x001b) AM_DEVREAD("uart2", tms9902_device, cruread) // Cassette
- //AM_RANGE(0x00e0, 0x00ff) AM_WRITE("dma", tms9911_device, write) // r12 = 1c0-1fe
- //AM_RANGE(0x001c, 0x001f) AM_READ("dma", tms9911_device, read) // if reading is needed
- //AM_RANGE(0x0400, 0x0407) AM_WRITE(cent_data_w) // r12 = 800-80e
- //AM_RANGE(0x0408, 0x0408) AM_WRITE(cent_strobe_w) // r12 = 810
- //AM_RANGE(0x0081, 0x0081) AM_READ(cent_stat_r) // CRU 409 (r12 = 812)
+ map(0x0000, 0x000f).mirror(0x30).w("control", FUNC(ls259_device::write_d0));
+ map(0x0000, 0x000f).r(FUNC(cortex_state::pio_r));
+ map(0x0010, 0x001f).r(FUNC(cortex_state::keyboard_r));
+ //map(0x0080, 0x00bf).rw("uart1", FUNC(tms9902_device::cruread), FUNC(tms9902_device::cruwrite)); // RS232 (r12 = 80-bf)
+ //map(0x0180, 0x01bf).rw("uart2", FUNC(tms9902_device::cruread), FUNC(tms9902_device::cruwrite)); // Cassette (r12 = 180-1bf)
+ //map(0x01c0, 0x01ff).rw("dma", FUNC(tms9911_device::read), FUNC(tms9911_device::write)); // r12 = 1c0-1fe
+ //map(0x0800, 0x080f).w(cortex_state::cent_data_w)); // r12 = 800-80e
+ //map(0x0810, 0x0811).w(FUNC(cortex_state::cent_strobe_w)); // r12 = 810
+ //map(0x0812, 0x0813).r(FUNC(cortex_state::cent_stat_r)); // CRU 409 (r12 = 812)
}
/* Input ports */
@@ -125,12 +121,26 @@ INPUT_PORTS_END
READ8_MEMBER( cortex_state::pio_r )
{
- return (m_kbd_ack ? 0x20 : 0) | (m_vdp_int ? 0x40 : 0) | m_io_dsw->read() | 0x93;
+ switch (offset)
+ {
+ case 5:
+ return m_kbd_ack;
+
+ case 6:
+ return m_vdp_int;
+
+ case 2:
+ case 3:
+ return BIT(m_io_dsw->read(), offset);
+
+ default:
+ return 1;
+ }
}
READ8_MEMBER( cortex_state::keyboard_r )
{
- return m_term_data;
+ return BIT(m_term_data, offset);
}
WRITE_LINE_MEMBER( cortex_state::keyboard_ack_w )
diff --git a/src/mame/drivers/cosmic.cpp b/src/mame/drivers/cosmic.cpp
index 3ef350824df..1413d03eb01 100644
--- a/src/mame/drivers/cosmic.cpp
+++ b/src/mame/drivers/cosmic.cpp
@@ -340,7 +340,15 @@ READ8_MEMBER(cosmic_state::cosmica_pixel_clock_r)
READ8_MEMBER(cosmic_state::cosmicg_port_0_r)
{
/* The top four address lines from the CRTC are bits 0-3 */
- return (m_in_ports[0]->read() & 0xf0) | ((m_screen->vpos() & 0xf0) >> 4);
+ if (offset >= 4)
+ return BIT(m_in_ports[0]->read(), offset);
+ else
+ return BIT(m_screen->vpos(), offset + 4);
+}
+
+READ8_MEMBER(cosmic_state::cosmicg_port_1_r)
+{
+ return BIT(m_in_ports[1]->read(), offset);
}
READ8_MEMBER(cosmic_state::magspot_coinage_dip_r)
@@ -415,10 +423,10 @@ void cosmic_state::cosmicg_map(address_map &map)
void cosmic_state::cosmicg_io_map(address_map &map)
{
- map(0x00, 0x00).r(FUNC(cosmic_state::cosmicg_port_0_r));
- map(0x01, 0x01).portr("IN1");
- map(0x00, 0x15).w(FUNC(cosmic_state::cosmicg_output_w));
- map(0x16, 0x17).w(FUNC(cosmic_state::cosmic_color_register_w));
+ map(0x0000, 0x000f).r(FUNC(cosmic_state::cosmicg_port_0_r));
+ map(0x0010, 0x001f).r(FUNC(cosmic_state::cosmicg_port_1_r));
+ map(0x0000, 0x002b).w(FUNC(cosmic_state::cosmicg_output_w));
+ map(0x002c, 0x002f).w(FUNC(cosmic_state::cosmic_color_register_w));
}
@@ -1057,7 +1065,6 @@ void cosmic_state::panic(machine_config &config)
DAC_1BIT(config, m_dac, 0).add_route(ALL_OUTPUTS, "speaker", 0.5);
voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref", 0));
- vref.set_output(5.0);
vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT);
}
@@ -1113,7 +1120,6 @@ void cosmic_state::cosmicg(machine_config &config)
DAC_1BIT(config, m_dac, 0).add_route(ALL_OUTPUTS, "speaker", 0.5); // NE556
voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref", 0));
- vref.set_output(5.0);
vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT);
// Other DACs include 3-bit binary-weighted (100K/50K/25K) DAC combined with another NE556 for attack march
}
@@ -1137,7 +1143,6 @@ void cosmic_state::magspot(machine_config &config)
DAC_1BIT(config, m_dac, 0).add_route(ALL_OUTPUTS, "speaker", 0.5);
voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref", 0));
- vref.set_output(5.0);
vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT);
}
@@ -1167,7 +1172,6 @@ void cosmic_state::nomnlnd(machine_config &config)
DAC_1BIT(config, m_dac, 0).add_route(ALL_OUTPUTS, "speaker", 0.5);
voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref", 0));
- vref.set_output(5.0);
vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT);
}
diff --git a/src/mame/drivers/cosmicos.cpp b/src/mame/drivers/cosmicos.cpp
index f3aa02eba41..628e0446309 100644
--- a/src/mame/drivers/cosmicos.cpp
+++ b/src/mame/drivers/cosmicos.cpp
@@ -524,17 +524,16 @@ MACHINE_CONFIG_START(cosmicos_state::cosmicos)
/* video hardware */
config.set_default_layout(layout_cosmicos);
- MCFG_DEVICE_ADD(DM9368_TAG, DM9368, 0)
- MCFG_TIMER_DRIVER_ADD_PERIODIC("digit", cosmicos_state, digit_tick, attotime::from_hz(100))
- MCFG_TIMER_DRIVER_ADD_PERIODIC("interrupt", cosmicos_state, int_tick, attotime::from_hz(1000))
+ DM9368(config, m_led, 0);
+ TIMER(config, "digit").configure_periodic(FUNC(cosmicos_state::digit_tick), attotime::from_hz(100));
+ TIMER(config, "interrupt").configure_periodic(FUNC(cosmicos_state::int_tick), attotime::from_hz(1000));
SCREEN(config, SCREEN_TAG, SCREEN_TYPE_RASTER);
/* sound hardware */
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("speaker", SPEAKER_SOUND)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25)
+ SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25);
CDP1864(config, m_cti, 1.75_MHz_XTAL).set_screen(SCREEN_TAG);
m_cti->inlace_cb().set_constant(0);
@@ -548,9 +547,9 @@ MACHINE_CONFIG_START(cosmicos_state::cosmicos)
m_cti->add_route(ALL_OUTPUTS, "mono", 0.25);
/* devices */
- MCFG_QUICKLOAD_ADD("quickload", cosmicos_state, cosmicos, "bin", 0)
- MCFG_CASSETTE_ADD("cassette")
- MCFG_CASSETTE_DEFAULT_STATE(CASSETTE_STOPPED | CASSETTE_MOTOR_ENABLED | CASSETTE_SPEAKER_MUTED)
+ MCFG_QUICKLOAD_ADD("quickload", cosmicos_state, cosmicos, "bin")
+ CASSETTE(config, m_cassette);
+ m_cassette->set_default_state(CASSETTE_STOPPED | CASSETTE_MOTOR_ENABLED | CASSETTE_SPEAKER_MUTED);
/* internal ram */
RAM(config, RAM_TAG).set_default_size("256").set_extra_options("4K,48K");
diff --git a/src/mame/drivers/cp1.cpp b/src/mame/drivers/cp1.cpp
index c94ab232131..a329130a81e 100644
--- a/src/mame/drivers/cp1.cpp
+++ b/src/mame/drivers/cp1.cpp
@@ -122,14 +122,14 @@ READ8_MEMBER(cp1_state::i8155_read)
if (!(m_port2 & 0x10))
{
- m_i8155->ale_w(space, BIT(m_port2, 7), offset);
- data |= m_i8155->read(space, offset);
+ m_i8155->ale_w(BIT(m_port2, 7), offset);
+ data |= m_i8155->data_r();
}
if ((m_io_config->read() & 0x02) && !(m_port2 & 0x20))
{
// CP3 RAM expansion
- m_i8155_cp3->ale_w(space, BIT(m_port2, 7), offset);
- data |= m_i8155_cp3->read(space, offset);
+ m_i8155_cp3->ale_w(BIT(m_port2, 7), offset);
+ data |= m_i8155_cp3->data_r();
}
return data;
@@ -139,14 +139,14 @@ WRITE8_MEMBER(cp1_state::i8155_write)
{
if (!(m_port2 & 0x10))
{
- m_i8155->ale_w(space, BIT(m_port2, 7), offset);
- m_i8155->write(space, offset, data);
+ m_i8155->ale_w(BIT(m_port2, 7), offset);
+ m_i8155->data_w(data);
}
if ((m_io_config->read() & 0x02) && !(m_port2 & 0x20))
{
// CP3 RAM expansion
- m_i8155_cp3->ale_w(space, BIT(m_port2, 7), offset);
- m_i8155_cp3->write(space, offset, data);
+ m_i8155_cp3->ale_w(BIT(m_port2, 7), offset);
+ m_i8155_cp3->data_w(data);
}
}
@@ -244,7 +244,6 @@ void cp1_state::machine_reset()
QUICKLOAD_LOAD_MEMBER( cp1_state, quickload )
{
- address_space &space = machine().dummy_space();
char line[0x10];
int addr = 0;
while (image.fgets(line, 10) && addr < 0x100)
@@ -252,8 +251,8 @@ QUICKLOAD_LOAD_MEMBER( cp1_state, quickload )
int op = 0, arg = 0;
if (sscanf(line, "%d.%d", &op, &arg) == 2)
{
- m_i8155->memory_w(space, addr++, op);
- m_i8155->memory_w(space, addr++, arg);
+ m_i8155->memory_w(addr++, op);
+ m_i8155->memory_w(addr++, arg);
}
else
{
@@ -264,7 +263,8 @@ QUICKLOAD_LOAD_MEMBER( cp1_state, quickload )
return image_init_result::PASS;
}
-MACHINE_CONFIG_START(cp1_state::cp1)
+void cp1_state::cp1(machine_config &config)
+{
/* basic machine hardware */
i8049_device &maincpu(I8049(config, m_maincpu, 6_MHz_XTAL));
maincpu.set_addrmap(AS_IO, &cp1_state::cp1_io);
@@ -287,10 +287,10 @@ MACHINE_CONFIG_START(cp1_state::cp1)
config.set_default_layout(layout_cp1);
- MCFG_CASSETTE_ADD("cassette")
+ CASSETTE(config, m_cassette);
- MCFG_QUICKLOAD_ADD("quickload", cp1_state, quickload, "obj", 1)
-MACHINE_CONFIG_END
+ QUICKLOAD(config, "quickload").set_handler(snapquick_load_delegate(&QUICKLOAD_LOAD_NAME(cp1_state, quickload), this), "obj", attotime::from_seconds(1));
+}
/* ROM definition */
/*
diff --git a/src/mame/drivers/cps1.cpp b/src/mame/drivers/cps1.cpp
index 888dc71291a..0d0394a4e40 100644
--- a/src/mame/drivers/cps1.cpp
+++ b/src/mame/drivers/cps1.cpp
@@ -3383,28 +3383,28 @@ MACHINE_START_MEMBER(cps_state,qsound)
membank("bank1")->configure_entries(0, 6, memregion("audiocpu")->base() + 0x10000, 0x4000);
}
-MACHINE_CONFIG_START(cps_state::cps1_10MHz)
-
+void cps_state::cps1_10MHz(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M68000, XTAL(10'000'000) ) /* verified on pcb */
- MCFG_DEVICE_PROGRAM_MAP(main_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", cps_state, cps1_interrupt)
- MCFG_DEVICE_IRQ_ACKNOWLEDGE_DRIVER(cps_state, cps1_int_ack)
+ M68000(config, m_maincpu, XTAL(10'000'000)); /* verified on pcb */
+ m_maincpu->set_addrmap(AS_PROGRAM, &cps_state::main_map);
+ m_maincpu->set_vblank_int("screen", FUNC(cps_state::cps1_interrupt));
+ m_maincpu->set_irq_acknowledge_callback(FUNC(cps_state::cps1_int_ack));
- MCFG_DEVICE_ADD("audiocpu", Z80, XTAL(3'579'545)) /* verified on pcb */
- MCFG_DEVICE_PROGRAM_MAP(sub_map)
+ Z80(config, m_audiocpu, XTAL(3'579'545)); /* verified on pcb */
+ m_audiocpu->set_addrmap(AS_PROGRAM, &cps_state::sub_map);
MCFG_MACHINE_START_OVERRIDE(cps_state,cps1)
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_RAW_PARAMS(CPS_PIXEL_CLOCK, CPS_HTOTAL, CPS_HBEND, CPS_HBSTART, CPS_VTOTAL, CPS_VBEND, CPS_VBSTART)
- MCFG_SCREEN_UPDATE_DRIVER(cps_state, screen_update_cps1)
- MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE(*this, cps_state, screen_vblank_cps1))
- MCFG_SCREEN_PALETTE("palette")
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_raw(CPS_PIXEL_CLOCK, CPS_HTOTAL, CPS_HBEND, CPS_HBSTART, CPS_VTOTAL, CPS_VBEND, CPS_VBSTART);
+ m_screen->set_screen_update(FUNC(cps_state::screen_update_cps1));
+ m_screen->screen_vblank().set(FUNC(cps_state::screen_vblank_cps1));
+ m_screen->set_palette(m_palette);
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_cps1)
- MCFG_PALETTE_ADD("palette", 0xc00)
+ GFXDECODE(config, m_gfxdecode, m_palette, gfx_cps1);
+ PALETTE(config, m_palette).set_entries(0xc00);
/* sound hardware */
SPEAKER(config, "mono").front_center();
@@ -3418,27 +3418,26 @@ MACHINE_CONFIG_START(cps_state::cps1_10MHz)
ym2151.add_route(1, "mono", 0.35);
/* CPS PPU is fed by a 16mhz clock,pin 117 outputs a 4mhz clock which is divided by 4 using 2 74ls74 */
- MCFG_DEVICE_ADD("oki", OKIM6295, XTAL(16'000'000)/4/4, okim6295_device::PIN7_HIGH) // pin 7 can be changed by the game code, see f006 on z80
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.30)
-MACHINE_CONFIG_END
+ OKIM6295(config, m_oki, XTAL(16'000'000)/4/4, okim6295_device::PIN7_HIGH).add_route(ALL_OUTPUTS, "mono", 0.30); // pin 7 can be changed by the game code, see f006 on z80
+}
-MACHINE_CONFIG_START(cps_state::forgottn)
+void cps_state::forgottn(machine_config &config)
+{
cps1_10MHz(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(forgottn_map)
+ m_maincpu->set_addrmap(AS_PROGRAM, &cps_state::forgottn_map);
upd4701_device &upd4701(UPD4701A(config, "upd4701"));
upd4701.set_portx_tag("DIAL0");
upd4701.set_porty_tag("DIAL1");
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(cps_state::cps1_12MHz)
+void cps_state::cps1_12MHz(machine_config &config)
+{
cps1_10MHz(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_CLOCK( XTAL(12'000'000) ) /* verified on pcb */
-MACHINE_CONFIG_END
+ m_maincpu->set_clock(XTAL(12'000'000)); /* verified on pcb */
+}
void cps_state::pang3(machine_config &config)
{
@@ -3448,48 +3447,46 @@ void cps_state::pang3(machine_config &config)
EEPROM_93C46_16BIT(config, "eeprom");
}
-MACHINE_CONFIG_START(cps_state::ganbare)
+void cps_state::ganbare(machine_config &config)
+{
cps1_10MHz(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_TIMER_DRIVER_ADD_SCANLINE("scantimer", cps_state, ganbare_interrupt, "screen", 0, 1) // need to investigate more
+ TIMER(config, "scantimer").configure_scanline(FUNC(cps_state::ganbare_interrupt), "screen", 0, 1); // need to investigate more
- MCFG_DEVICE_ADD("m48t35", M48T35, 0)
-MACHINE_CONFIG_END
+ M48T35(config, m_m48t35, 0);
+}
-MACHINE_CONFIG_START(cps_state::qsound)
+void cps_state::qsound(machine_config &config)
+{
cps1_12MHz(config);
/* basic machine hardware */
- MCFG_DEVICE_REPLACE("maincpu", M68000, XTAL(12'000'000) ) /* verified on pcb */
- MCFG_DEVICE_PROGRAM_MAP(qsound_main_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", cps_state, cps1_interrupt)
- MCFG_DEVICE_IRQ_ACKNOWLEDGE_DRIVER(cps_state, cps1_int_ack)
+ m_maincpu->set_addrmap(AS_PROGRAM, &cps_state::qsound_main_map);
- MCFG_DEVICE_REPLACE("audiocpu", Z80, XTAL(8'000'000)) /* verified on pcb */
- MCFG_DEVICE_PROGRAM_MAP(qsound_sub_map)
- MCFG_DEVICE_OPCODES_MAP(qsound_decrypted_opcodes_map)
- MCFG_DEVICE_PERIODIC_INT_DRIVER(cps_state, irq0_line_hold, 250) // measured (cps2.c)
+ Z80(config.replace(), m_audiocpu, XTAL(8'000'000)); /* verified on pcb */
+ m_audiocpu->set_addrmap(AS_PROGRAM, &cps_state::qsound_sub_map);
+ m_audiocpu->set_addrmap(AS_OPCODES, &cps_state::qsound_decrypted_opcodes_map);
+ m_audiocpu->set_periodic_int(FUNC(cps_state::irq0_line_hold), attotime::from_hz(250)); // measured (cps2.cpp)
MCFG_MACHINE_START_OVERRIDE(cps_state, qsound)
EEPROM_93C46_8BIT(config, "eeprom");
/* sound hardware */
- MCFG_DEVICE_REMOVE("mono")
+ config.device_remove("mono");
SPEAKER(config, "lspeaker").front_left();
SPEAKER(config, "rspeaker").front_right();
- MCFG_DEVICE_REMOVE("soundlatch")
- MCFG_DEVICE_REMOVE("soundlatch2")
- MCFG_DEVICE_REMOVE("2151")
- MCFG_DEVICE_REMOVE("oki")
+ config.device_remove("soundlatch");
+ config.device_remove("soundlatch2");
+ config.device_remove("2151");
+ config.device_remove("oki");
- MCFG_DEVICE_ADD("qsound", QSOUND)
- MCFG_SOUND_ROUTE(0, "lspeaker", 1.0)
- MCFG_SOUND_ROUTE(1, "rspeaker", 1.0)
-MACHINE_CONFIG_END
+ qsound_device &qsound(QSOUND(config, "qsound"));
+ qsound.add_route(0, "lspeaker", 1.0);
+ qsound.add_route(1, "rspeaker", 1.0);
+}
void cps_state::wofhfh(machine_config &config)
{
@@ -3499,23 +3496,23 @@ void cps_state::wofhfh(machine_config &config)
EEPROM_93C46_8BIT(config, "eeprom");
}
-MACHINE_CONFIG_START(cps_state::sf2m3)
+void cps_state::sf2m3(machine_config &config)
+{
cps1_12MHz(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(sf2m3_map)
-MACHINE_CONFIG_END
+ m_maincpu->set_addrmap(AS_PROGRAM, &cps_state::sf2m3_map);
+}
-MACHINE_CONFIG_START(cps_state::sf2cems6)
+void cps_state::sf2cems6(machine_config &config)
+{
cps1_10MHz(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(sf2cems6_map)
-MACHINE_CONFIG_END
+ m_maincpu->set_addrmap(AS_PROGRAM, &cps_state::sf2cems6_map);
+}
-MACHINE_CONFIG_START(cps_state::sf2m10)
+void cps_state::sf2m10(machine_config &config)
+{
cps1_12MHz(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(sf2m10_map)
-MACHINE_CONFIG_END
+ m_maincpu->set_addrmap(AS_PROGRAM, &cps_state::sf2m10_map);
+}
/***************************************************************************
@@ -9846,53 +9843,52 @@ Sound rom match various romset
ROM_START( sf2ceblp )
ROM_REGION( CODE_SIZE, "maincpu", 0 ) /* 68000 code */
+ ROM_LOAD16_BYTE( "1k.31.e13", 0x00000, 0x20000, CRC(ea78f9b4) SHA1(967f84615f6ef4d046df3593d5ffce0d43a3ac64) ) // 27c010
+ ROM_LOAD16_BYTE( "se.36.j13", 0x00001, 0x20000, CRC(d30c263e) SHA1(6d8b13f82dde3237115306d91f37ac95b8238e0a) ) // 27c010
+ ROM_LOAD16_BYTE( "0e.30.e11", 0x40000, 0x20000, CRC(005b54cc) SHA1(3d3d7742c11f31cc62d81931dc970cd1f4a26835) ) // 27c010
+ ROM_LOAD16_BYTE( "de.35.j11", 0x40001, 0x20000, CRC(c184d26d) SHA1(b1011e869d0b84c1ab609fcf193b46c7d9cc3b28) ) // 27c010
+ ROM_LOAD16_BYTE( "bk.29.e10", 0x80000, 0x20000, CRC(524f5c55) SHA1(67adfd36bb325c4a6d3e1e5b668c4dc983ac0a62) ) // 27c010
+ ROM_LOAD16_BYTE( "ff.34.j10", 0x80001, 0x20000, CRC(f06a12f2) SHA1(ddc431ce01392d4a7562760743abd9ea73b06cf3) ) // 27c010
+ ROM_LOAD16_BYTE( "8k.28.e9", 0xc0000, 0x40000, CRC(b7ad5214) SHA1(17b05e0aa9a4eb5f1aaafe35fa029d2a9aea530d) ) // 27c020
+ ROM_LOAD16_BYTE( "tf.33.j9", 0xc0001, 0x40000, CRC(6340b914) SHA1(443e37a06058548c8ce7a15ecd10a6635e69d09f) ) // 27c020
+
+ ROM_REGION( 0x600000, "gfx", 0 ) // all 27c020
+ ROMX_LOAD( "24.e7", 0x000000, 0x40000, CRC(a8b5633a) SHA1(6548a89d616910d06db126eb1a9c6b5979baff03) , ROM_SKIP(7) ) // sldh
+ ROMX_LOAD( "14.c7", 0x000001, 0x40000, CRC(5db24ca7) SHA1(0543e89174fecc866a08e0ecc7c31a6efca15da5) , ROM_SKIP(7) )
+ ROMX_LOAD( "26.e9", 0x000002, 0x40000, CRC(82e8e384) SHA1(a8849bdb97c496777ba87e8f1942585c0fc9a29b) , ROM_SKIP(7) ) // sldh
+ ROMX_LOAD( "16.c9", 0x000003, 0x40000, CRC(1fd98ad0) SHA1(c0edf8ad305d5f8ba72498024cacf28b08491a57) , ROM_SKIP(7) )
+ ROMX_LOAD( "20.e3", 0x000004, 0x40000, CRC(8d5d0045) SHA1(74691132c740cc28585ebe9469fa36fea28c1cef) , ROM_SKIP(7) )
+ ROMX_LOAD( "10.c3", 0x000005, 0x40000, CRC(eb48f7f2) SHA1(f1d269949a8e06434e2206842535d86a70bcf58f) , ROM_SKIP(7) )
+ ROMX_LOAD( "22.e5", 0x000006, 0x40000, CRC(4109d637) SHA1(f7b0961ae3053a0751749ab77f27503e03ae1e5b) , ROM_SKIP(7) )
+ ROMX_LOAD( "12.c5", 0x000007, 0x40000, CRC(5d21d8b3) SHA1(1e75a4bf8d750e0858d70a489b59b50839b8c720) , ROM_SKIP(7) )
+
+ ROMX_LOAD( "25.e8", 0x200000, 0x40000, CRC(72e923df) SHA1(f8db61f8a768fbf99a0be54af712aa19161978d1) , ROM_SKIP(7) ) // sldh
+ ROMX_LOAD( "15.c8", 0x200001, 0x40000, CRC(9a96be48) SHA1(c0a46aefba442196ead30d4f5de2b0370b1c03f0) , ROM_SKIP(7) )
+ ROMX_LOAD( "27.e10", 0x200002, 0x40000, CRC(4a3a8d09) SHA1(eaa7307963c7a5381a4d84a4ebcc483b55cc1411) , ROM_SKIP(7) ) // sldh
+ ROMX_LOAD( "17.c10", 0x200003, 0x40000, CRC(a917a922) SHA1(2186095f8473538756ca22dbdb2c68d17cbf24ab) , ROM_SKIP(7) )
+ ROMX_LOAD( "21.e4", 0x200004, 0x40000, CRC(55c2b455) SHA1(677ac8f988ea3c0564b2dd178ee2ab7077aeafc8) , ROM_SKIP(7) )
+ ROMX_LOAD( "11.c4", 0x200005, 0x40000, CRC(ff36859e) SHA1(7f5ab9daacfdb338913d6bca723efe3128dc931f) , ROM_SKIP(7) )
+ ROMX_LOAD( "23.e6", 0x200006, 0x40000, CRC(ef9c2d4d) SHA1(35c3ab5a3cc3ce2219b596c4c3e97d28b9cc2297) , ROM_SKIP(7) )
+ ROMX_LOAD( "13.c6", 0x200007, 0x40000, CRC(bc937c96) SHA1(772ff4e06093043f693729d8e94e7f8e3f8e866f) , ROM_SKIP(7) )
+
+ ROMX_LOAD( "6.a8", 0x400000, 0x40000, CRC(023baa18) SHA1(671600e629aff1cc161567ee4a5ceb2228731a36) , ROM_SKIP(7) )
+ ROMX_LOAD( "5.a7", 0x400001, 0x40000, CRC(a6ad6ef3) SHA1(c670931a98dfc6ca39d54d8cb8848421232d8c8c) , ROM_SKIP(7) )
+ ROMX_LOAD( "8.a10", 0x400002, 0x40000, CRC(26fb340c) SHA1(270455c10a0c7e4ba95a38ab7d815faedfe51fde) , ROM_SKIP(7) )
+ ROMX_LOAD( "7.a9", 0x400003, 0x40000, CRC(f56085ba) SHA1(ce8c33d7be271a501e770da5249778f62ca0e0a1) , ROM_SKIP(7) )
+ ROMX_LOAD( "1.a3", 0x400004, 0x40000, CRC(877b2b18) SHA1(36ebef5b534d2449b163df38b9a98f769c1d85ed) , ROM_SKIP(7) )
+ ROMX_LOAD( "2.a4", 0x400005, 0x40000, CRC(144aa4c9) SHA1(f00bf10f04ae774dda7e3a1c862aba67f70d61c3) , ROM_SKIP(7) )
+ ROMX_LOAD( "4.a6", 0x400006, 0x40000, CRC(f2c400b4) SHA1(090ff7184cd2a1b992cc9f1f8c03f8832bc11416) , ROM_SKIP(7) )
+ ROMX_LOAD( "3.a5", 0x400007, 0x40000, CRC(8053335d) SHA1(c653cb249401162fbf39f293e1999fe5e09c35c4) , ROM_SKIP(7) )
+
+ ROM_REGION( 0x18000, "audiocpu", 0 ) /* 64k for the audio CPU (+banks) */
+ ROM_LOAD( "snd.9.b13", 0x00000, 0x08000, CRC(08f6b60e) SHA1(8258fcaca4ac419312531eec67079b97f471179c) ) // 27c512
+ ROM_CONTINUE( 0x10000, 0x08000 )
- ROM_LOAD16_BYTE( "prg31.bin", 0x00000, 0x20000, CRC(ea78f9b4) SHA1(967f84615f6ef4d046df3593d5ffce0d43a3ac64) )
- ROM_LOAD16_BYTE( "prg36.bin", 0x00001, 0x20000, CRC(d30c263e) SHA1(6d8b13f82dde3237115306d91f37ac95b8238e0a) )
- ROM_LOAD16_BYTE( "prg30.bin", 0x40000, 0x20000, CRC(005b54cc) SHA1(3d3d7742c11f31cc62d81931dc970cd1f4a26835) )
- ROM_LOAD16_BYTE( "prg35.bin", 0x40001, 0x20000, CRC(c184d26d) SHA1(b1011e869d0b84c1ab609fcf193b46c7d9cc3b28) )
- ROM_LOAD16_BYTE( "prg29.bin", 0x80000, 0x20000, CRC(524f5c55) SHA1(67adfd36bb325c4a6d3e1e5b668c4dc983ac0a62) )
- ROM_LOAD16_BYTE( "prg34.bin", 0x80001, 0x20000, CRC(f06a12f2) SHA1(ddc431ce01392d4a7562760743abd9ea73b06cf3) )
- ROM_LOAD16_BYTE( "prg28.bin", 0xc0000, 0x40000, CRC(b7ad5214) SHA1(17b05e0aa9a4eb5f1aaafe35fa029d2a9aea530d) )
- ROM_LOAD16_BYTE( "prg33.bin", 0xc0001, 0x40000, CRC(6340b914) SHA1(443e37a06058548c8ce7a15ecd10a6635e69d09f) )
-
- ROM_REGION( 0x600000, "gfx", 0 )
- ROMX_LOAD( "24.bin", 0x000000, 0x40000, CRC(a8b5633a) SHA1(6548a89d616910d06db126eb1a9c6b5979baff03) , ROM_SKIP(7) ) // sldh
- ROMX_LOAD( "14.bin", 0x000001, 0x40000, CRC(5db24ca7) SHA1(0543e89174fecc866a08e0ecc7c31a6efca15da5) , ROM_SKIP(7) )
- ROMX_LOAD( "26.bin", 0x000002, 0x40000, CRC(82e8e384) SHA1(a8849bdb97c496777ba87e8f1942585c0fc9a29b) , ROM_SKIP(7) ) // sldh
- ROMX_LOAD( "16.bin", 0x000003, 0x40000, CRC(1fd98ad0) SHA1(c0edf8ad305d5f8ba72498024cacf28b08491a57) , ROM_SKIP(7) )
- ROMX_LOAD( "20.bin", 0x000004, 0x40000, CRC(8d5d0045) SHA1(74691132c740cc28585ebe9469fa36fea28c1cef) , ROM_SKIP(7) )
- ROMX_LOAD( "10.bin", 0x000005, 0x40000, CRC(eb48f7f2) SHA1(f1d269949a8e06434e2206842535d86a70bcf58f) , ROM_SKIP(7) )
- ROMX_LOAD( "22.bin", 0x000006, 0x40000, CRC(4109d637) SHA1(f7b0961ae3053a0751749ab77f27503e03ae1e5b) , ROM_SKIP(7) )
- ROMX_LOAD( "12.bin", 0x000007, 0x40000, CRC(5d21d8b3) SHA1(1e75a4bf8d750e0858d70a489b59b50839b8c720) , ROM_SKIP(7) )
-
- ROMX_LOAD( "25.bin", 0x200000, 0x40000, CRC(72e923df) SHA1(f8db61f8a768fbf99a0be54af712aa19161978d1) , ROM_SKIP(7) ) // sldh
- ROMX_LOAD( "15.bin", 0x200001, 0x40000, CRC(9a96be48) SHA1(c0a46aefba442196ead30d4f5de2b0370b1c03f0) , ROM_SKIP(7) )
- ROMX_LOAD( "27.bin", 0x200002, 0x40000, CRC(4a3a8d09) SHA1(eaa7307963c7a5381a4d84a4ebcc483b55cc1411) , ROM_SKIP(7) ) // sldh
- ROMX_LOAD( "17.bin", 0x200003, 0x40000, CRC(a917a922) SHA1(2186095f8473538756ca22dbdb2c68d17cbf24ab) , ROM_SKIP(7) )
- ROMX_LOAD( "21.bin", 0x200004, 0x40000, CRC(55c2b455) SHA1(677ac8f988ea3c0564b2dd178ee2ab7077aeafc8) , ROM_SKIP(7) )
- ROMX_LOAD( "11.bin", 0x200005, 0x40000, CRC(ff36859e) SHA1(7f5ab9daacfdb338913d6bca723efe3128dc931f) , ROM_SKIP(7) )
- ROMX_LOAD( "23.bin", 0x200006, 0x40000, CRC(ef9c2d4d) SHA1(35c3ab5a3cc3ce2219b596c4c3e97d28b9cc2297) , ROM_SKIP(7) )
- ROMX_LOAD( "13.bin", 0x200007, 0x40000, CRC(bc937c96) SHA1(772ff4e06093043f693729d8e94e7f8e3f8e866f) , ROM_SKIP(7) )
-
- ROMX_LOAD( "6.bin", 0x400000, 0x40000, CRC(023baa18) SHA1(671600e629aff1cc161567ee4a5ceb2228731a36) , ROM_SKIP(7) )
- ROMX_LOAD( "5.bin", 0x400001, 0x40000, CRC(a6ad6ef3) SHA1(c670931a98dfc6ca39d54d8cb8848421232d8c8c) , ROM_SKIP(7) )
- ROMX_LOAD( "8.bin", 0x400002, 0x40000, CRC(26fb340c) SHA1(270455c10a0c7e4ba95a38ab7d815faedfe51fde) , ROM_SKIP(7) )
- ROMX_LOAD( "7.bin", 0x400003, 0x40000, CRC(f56085ba) SHA1(ce8c33d7be271a501e770da5249778f62ca0e0a1) , ROM_SKIP(7) )
- ROMX_LOAD( "1.bin", 0x400004, 0x40000, CRC(877b2b18) SHA1(36ebef5b534d2449b163df38b9a98f769c1d85ed) , ROM_SKIP(7) )
- ROMX_LOAD( "2.bin", 0x400005, 0x40000, CRC(144aa4c9) SHA1(f00bf10f04ae774dda7e3a1c862aba67f70d61c3) , ROM_SKIP(7) )
- ROMX_LOAD( "4.bin", 0x400006, 0x40000, CRC(f2c400b4) SHA1(090ff7184cd2a1b992cc9f1f8c03f8832bc11416) , ROM_SKIP(7) )
- ROMX_LOAD( "3.bin", 0x400007, 0x40000, CRC(8053335d) SHA1(c653cb249401162fbf39f293e1999fe5e09c35c4) , ROM_SKIP(7) )
-
- ROM_REGION( 0x18000, "audiocpu", 0 ) /* 64k for the audio CPU (+banks) */
- ROM_LOAD( "s92_09.bin", 0x00000, 0x08000, CRC(08f6b60e) SHA1(8258fcaca4ac419312531eec67079b97f471179c) )
- ROM_CONTINUE( 0x10000, 0x08000 )
-
- ROM_REGION( 0x40000, "oki", 0 ) /* Samples */
- ROM_LOAD( "s92_18.bin", 0x00000, 0x20000, CRC(7f162009) SHA1(346bf42992b4c36c593e21901e22c87ae4a7d86d) )
- ROM_LOAD( "s92_19.bin", 0x20000, 0x20000, CRC(beade53f) SHA1(277c397dc12752719ec6b47d2224750bd1c07f79) )
+ ROM_REGION( 0x40000, "oki", 0 ) /* Samples, both 27c010 */
+ ROM_LOAD( "9k.18.c11", 0x00000, 0x20000, CRC(7f162009) SHA1(346bf42992b4c36c593e21901e22c87ae4a7d86d) )
+ ROM_LOAD( "lk.19.c13", 0x20000, 0x20000, CRC(beade53f) SHA1(277c397dc12752719ec6b47d2224750bd1c07f79) )
- ROM_REGION( 0x2000, "protectin_pic", 0 )
+ ROM_REGION( 0x2000, "protection_pic", 0 )
ROM_LOAD( "pic16c55", 0x00000, 0x2000, BAD_DUMP CRC(f22e2311) SHA1(320edfba140728599e91c01e863a8b6d071e4bbf) )
ROM_END
@@ -13168,7 +13164,7 @@ READ16_MEMBER(cps_state::ganbare_ram_r)
uint16_t result = 0xffff;
if (ACCESSING_BITS_0_7)
- result = (result & ~0x00ff) | m_m48t35->read(space, offset, 0xff);
+ result = (result & ~0x00ff) | m_m48t35->read(offset);
if (ACCESSING_BITS_8_15)
result = (result & ~0xff00) | (m_mainram[offset] & 0xff00);
@@ -13180,7 +13176,7 @@ WRITE16_MEMBER(cps_state::ganbare_ram_w)
COMBINE_DATA(&m_mainram[offset]);
if (ACCESSING_BITS_0_7)
- m_m48t35->write(space, offset, data & 0xff, 0xff);
+ m_m48t35->write(offset, data & 0xff);
}
void cps_state::init_ganbare()
diff --git a/src/mame/drivers/cps2.cpp b/src/mame/drivers/cps2.cpp
index 2f5ad6bd244..40abe058624 100644
--- a/src/mame/drivers/cps2.cpp
+++ b/src/mame/drivers/cps2.cpp
@@ -1295,63 +1295,62 @@ MACHINE_START_MEMBER(cps2_state,cps2)
}
-MACHINE_CONFIG_START(cps2_state::cps2)
-
+void cps2_state::cps2(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M68000, XTAL(16'000'000))
- MCFG_DEVICE_PROGRAM_MAP(cps2_map)
- MCFG_DEVICE_OPCODES_MAP(decrypted_opcodes_map)
- MCFG_TIMER_DRIVER_ADD_SCANLINE("scantimer", cps2_state, cps2_interrupt, "screen", 0, 1)
+ M68000(config, m_maincpu, XTAL(16'000'000));
+ m_maincpu->set_addrmap(AS_PROGRAM, &cps2_state::cps2_map);
+ m_maincpu->set_addrmap(AS_OPCODES, &cps2_state::decrypted_opcodes_map);
+ TIMER(config, "scantimer").configure_scanline(FUNC(cps2_state::cps2_interrupt), "screen", 0, 1);
- MCFG_DEVICE_ADD("audiocpu", Z80, XTAL(8'000'000))
- MCFG_DEVICE_PROGRAM_MAP(qsound_sub_map)
- MCFG_DEVICE_PERIODIC_INT_DRIVER(cps2_state, irq0_line_hold, 250) // measured
+ Z80(config, m_audiocpu, XTAL(8'000'000));
+ m_audiocpu->set_addrmap(AS_PROGRAM, &cps2_state::qsound_sub_map);
+ m_audiocpu->set_periodic_int(FUNC(cps2_state::irq0_line_hold), attotime::from_hz(250)); // measured
MCFG_MACHINE_START_OVERRIDE(cps2_state, cps2)
EEPROM_93C46_16BIT(config, "eeprom");
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_VIDEO_ATTRIBUTES(VIDEO_UPDATE_BEFORE_VBLANK)
- MCFG_SCREEN_RAW_PARAMS(CPS_PIXEL_CLOCK, CPS_HTOTAL, CPS_HBEND, CPS_HBSTART, CPS_VTOTAL, CPS_VBEND, CPS_VBSTART)
- MCFG_SCREEN_UPDATE_DRIVER(cps2_state, screen_update_cps2)
- MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE(*this, cps2_state, screen_vblank_cps1))
- MCFG_SCREEN_PALETTE("palette")
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_video_attributes(VIDEO_UPDATE_BEFORE_VBLANK);
+ m_screen->set_raw(CPS_PIXEL_CLOCK, CPS_HTOTAL, CPS_HBEND, CPS_HBSTART, CPS_VTOTAL, CPS_VBEND, CPS_VBSTART);
+ m_screen->set_screen_update(FUNC(cps2_state::screen_update_cps2));
+ m_screen->screen_vblank().set(FUNC(cps2_state::screen_vblank_cps1));
+ m_screen->set_palette(m_palette);
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_cps1)
- MCFG_PALETTE_ADD("palette", 0xc00)
+ GFXDECODE(config, m_gfxdecode, m_palette, gfx_cps1);
+ PALETTE(config, m_palette).set_entries(0xc00);
/* sound hardware */
SPEAKER(config, "lspeaker").front_left();
SPEAKER(config, "rspeaker").front_right();
- MCFG_DEVICE_ADD("qsound", QSOUND)
- MCFG_SOUND_ROUTE(0, "lspeaker", 1.0)
- MCFG_SOUND_ROUTE(1, "rspeaker", 1.0)
-MACHINE_CONFIG_END
+ QSOUND(config, m_qsound);
+ m_qsound->add_route(0, "lspeaker", 1.0);
+ m_qsound->add_route(1, "rspeaker", 1.0);
+}
-MACHINE_CONFIG_START(cps2_state::dead_cps2)
+void cps2_state::dead_cps2(machine_config &config)
+{
cps2(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(dead_cps2_map)
-MACHINE_CONFIG_END
+ m_maincpu->set_addrmap(AS_PROGRAM, &cps2_state::dead_cps2_map);
+}
-MACHINE_CONFIG_START(cps2_state::gigaman2)
+void cps2_state::gigaman2(machine_config &config)
+{
cps2(config);
- MCFG_DEVICE_REMOVE("audiocpu")
+ config.device_remove("audiocpu");
// gigaman2 has an AT89C4051 (8051) MCU as an audio cpu, no qsound.
- MCFG_DEVICE_REMOVE("qsound")
+ config.device_remove("qsound");
- MCFG_DEVICE_MODIFY("maincpu")
-
- MCFG_DEVICE_ADD("oki", OKIM6295, XTAL(32'000'000)/32, okim6295_device::PIN7_HIGH) // clock frequency & pin 7 not verified
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 0.47)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 0.47)
-MACHINE_CONFIG_END
+ OKIM6295(config, m_oki, XTAL(32'000'000)/32, okim6295_device::PIN7_HIGH); // clock frequency & pin 7 not verified
+ m_oki->add_route(ALL_OUTPUTS, "lspeaker", 0.47);
+ m_oki->add_route(ALL_OUTPUTS, "rspeaker", 0.47);
+}
/*************************************
*
diff --git a/src/mame/drivers/cps3.cpp b/src/mame/drivers/cps3.cpp
index 10f9558b8e2..3cf6d516ab2 100644
--- a/src/mame/drivers/cps3.cpp
+++ b/src/mame/drivers/cps3.cpp
@@ -464,9 +464,8 @@ hardware modification to the security cart.....
#include "machine/intelfsh.h"
#include "machine/nvram.h"
#include "includes/cps3.h"
-#include "bus/scsi/scsi.h"
-#include "bus/scsi/scsicd.h"
-#include "machine/wd33c93.h"
+#include "machine/nscsi_cd.h"
+#include "machine/wd33c9x.h"
#include "screen.h"
#include "speaker.h"
@@ -773,12 +772,6 @@ void cps3_state::cps3_decrypt_bios()
#endif
}
-void cps3_state::init_common(void)
-{
- m_eeprom = std::make_unique<uint32_t[]>(0x400/4);
- subdevice<nvram_device>("eeprom")->set_base(m_eeprom.get(), 0x400);
-}
-
void cps3_state::init_crypt(uint32_t key1, uint32_t key2, int altEncryption)
{
@@ -815,8 +808,6 @@ void cps3_state::init_crypt(uint32_t key1, uint32_t key2, int altEncryption)
m_maincpu->sh2drc_add_fastram(0x040C0030, 0x040C003b, 0, &m_tilemap30_regs_base[0]);
cps3_decrypt_bios();
-
- init_common();
}
void cps3_state::init_redearth() { init_crypt(0x9e300ab1, 0xa175b82c, 0); }
@@ -903,13 +894,8 @@ void cps3_state::cps3_set_mame_colours(int colournum, uint16_t data, uint32_t fa
void cps3_state::video_start()
{
- m_ss_ram = std::make_unique<uint32_t[]>(0x10000/4);
- memset(m_ss_ram.get(), 0x00, 0x10000);
- save_pointer(NAME(m_ss_ram), 0x10000/4);
-
- m_char_ram = std::make_unique<uint32_t[]>(0x800000/4);
- memset(m_char_ram.get(), 0x00, 0x800000);
- save_pointer(NAME(m_char_ram), 0x800000 /4);
+ m_ss_ram = make_unique_clear<uint32_t[]>(0x10000/4);
+ m_char_ram = make_unique_clear<uint32_t[]>(0x800000/4);
/* create the char set (gfx will then be updated dynamically from RAM) */
m_gfxdecode->set_gfx(0, std::make_unique<gfx_element>(m_palette, cps3_tiles8x8_layout, (uint8_t *)m_ss_ram.get(), 0, m_palette->entries() / 16, 0));
@@ -922,8 +908,7 @@ void cps3_state::video_start()
//decode_charram();
- m_mame_colours = std::make_unique<uint32_t[]>(0x80000/4);
- memset(m_mame_colours.get(), 0x00, 0x80000);
+ m_mame_colours = make_unique_clear<uint32_t[]>(0x80000/2);
m_screenwidth = 384;
@@ -934,6 +919,14 @@ void cps3_state::video_start()
m_renderbuffer_clip.set(0, m_screenwidth-1, 0, 224-1);
m_renderbuffer_bitmap.fill(0x3f, m_renderbuffer_clip);
+
+ save_item(NAME(m_ss_pal_base));
+ save_item(NAME(m_unk_vidregs));
+ save_item(NAME(m_ss_bank_base));
+
+ save_pointer(NAME(m_ss_ram), 0x10000/4);
+ save_pointer(NAME(m_char_ram), 0x800000/4);
+ save_pointer(NAME(m_mame_colours), 0x80000/2);
}
// the 0x400 bit in the tilemap regs is "draw it upside-down" (bios tilemap during flashing, otherwise capcom logo is flipped)
@@ -1087,10 +1080,16 @@ uint32_t cps3_state::screen_update_cps3(screen_device &screen, bitmap_rgb32 &bit
uint32_t fszx = (fullscreenzoomx << 16) / 0x40;
uint32_t fszy = (fullscreenzoomy << 16) / 0x40;
- m_renderbuffer_clip.set(
- 0, ((m_screenwidth*fszx) >> 16) - 1,
- 0, ((224 * fszx) >> 16) - 1);
-
+ if (fullscreenzoomx == 0x40 && fullscreenzoomy == 0x40)
+ {
+ m_renderbuffer_clip = cliprect;
+ }
+ else
+ {
+ m_renderbuffer_clip.set(
+ (cliprect.left() * fszx) >> 16, (((cliprect.right() + 1) * fszx + 0x8000) >> 16) - 1,
+ (cliprect.top() * fszy) >> 16, (((cliprect.bottom() + 1) * fszy + 0x8000) >> 16) - 1);
+ }
m_renderbuffer_bitmap.fill(0, m_renderbuffer_clip);
/* Sprites */
@@ -1165,7 +1164,7 @@ uint32_t cps3_state::screen_update_cps3(screen_device &screen, bitmap_rgb32 &bit
if (bg_drawn[tilemapnum] == 0)
{
- for (int uu = 0; uu < 1023; uu++)
+ for (int uu = m_renderbuffer_clip.top(); uu <= m_renderbuffer_clip.bottom(); uu++)
{
cps3_draw_tilemapsprite_line(tilemapnum, uu, m_renderbuffer_bitmap, m_renderbuffer_clip);
}
@@ -1270,21 +1269,35 @@ uint32_t cps3_state::screen_update_cps3(screen_device &screen, bitmap_rgb32 &bit
}
}
- /* copy render bitmap with zoom */
+ if (fullscreenzoomx == 0x40 && fullscreenzoomy == 0x40)
{
- uint32_t srcy = 0;
- for (uint32_t rendery = 0; rendery < 224; rendery++)
+ /* copy render bitmap without zoom */
+ for (uint32_t rendery = cliprect.top(); rendery <= cliprect.bottom(); rendery++)
+ {
+ uint32_t* dstbitmap = &bitmap.pix32(rendery);
+ uint32_t* srcbitmap = &m_renderbuffer_bitmap.pix32(rendery);
+
+ for (uint32_t renderx = cliprect.left(); renderx <= cliprect.right(); renderx++)
+ {
+ dstbitmap[renderx] = m_mame_colours[srcbitmap[renderx] & 0x1ffff];
+ }
+ }
+ }
+ else
+ {
+ /* copy render bitmap with zoom */
+ uint32_t srcy = cliprect.top() * fszy;
+ for (uint32_t rendery = cliprect.top(); rendery <= cliprect.bottom(); rendery++)
{
uint32_t* dstbitmap = &bitmap.pix32(rendery);
uint32_t* srcbitmap = &m_renderbuffer_bitmap.pix32(srcy >> 16);
- uint32_t srcx = 0;
+ uint32_t srcx = cliprect.left() * fszx;
- for (uint32_t renderx = 0; renderx < m_screenwidth; renderx++)
+ for (uint32_t renderx = cliprect.left(); renderx <= cliprect.right(); renderx++)
{
dstbitmap[renderx] = m_mame_colours[srcbitmap[srcx >> 16] & 0x1ffff];
srcx += fszx;
}
-
srcy += fszy;
}
}
@@ -1392,22 +1405,22 @@ READ32_MEMBER(cps3_state::cps3_gfxflash_r)
if (ACCESSING_BITS_24_31) // GFX Flash 1
{
//logerror("read GFX flash chip %s addr %02x\n", chip0->tag(), (offset<<1));
- result |= chip0->read(space, (offset<<1)) << 24;
+ result |= chip0->read(offset<<1) << 24;
}
if (ACCESSING_BITS_16_23) // GFX Flash 2
{
//logerror("read GFX flash chip %s addr %02x\n", chip1->tag(), (offset<<1));
- result |= chip1->read(space, (offset<<1)) << 16;
+ result |= chip1->read(offset<<1) << 16;
}
if (ACCESSING_BITS_8_15) // GFX Flash 1
{
//logerror("read GFX flash chip %s addr %02x\n", chip0->tag(), (offset<<1)+1);
- result |= chip0->read(space, (offset<<1)+0x1) << 8;
+ result |= chip0->read((offset<<1)+0x1) << 8;
}
if (ACCESSING_BITS_0_7) // GFX Flash 2
{
//logerror("read GFX flash chip %s addr %02x\n", chip1->tag(), (offset<<1)+1);
- result |= chip1->read(space, (offset<<1)+0x1) << 0;
+ result |= chip1->read((offset<<1)+0x1) << 0;
}
//printf("read GFX flash chips addr %02x returning %08x mem_mask %08x crambank %08x gfxbank %08x\n", offset*2, result,mem_mask, m_cram_bank, m_cram_gfxflash_bank );
@@ -1432,25 +1445,25 @@ WRITE32_MEMBER(cps3_state::cps3_gfxflash_w)
{
command = (data >> 24) & 0xff;
//logerror("write to GFX flash chip %s addr %02x cmd %02x\n", chip0->tag(), (offset<<1), command);
- chip0->write(space, (offset<<1), command);
+ chip0->write((offset<<1), command);
}
if (ACCESSING_BITS_16_23) // GFX Flash 2
{
command = (data >> 16) & 0xff;
//logerror("write to GFX flash chip %s addr %02x cmd %02x\n", chip1->tag(), (offset<<1), command);
- chip1->write(space, (offset<<1), command);
+ chip1->write((offset<<1), command);
}
if (ACCESSING_BITS_8_15) // GFX Flash 1
{
command = (data >> 8) & 0xff;
//logerror("write to GFX flash chip %s addr %02x cmd %02x\n", chip0->tag(), (offset<<1)+1, command);
- chip0->write(space, (offset<<1)+0x1, command);
+ chip0->write((offset<<1)+0x1, command);
}
if (ACCESSING_BITS_0_7) // GFX Flash 2
{
command = (data >> 0) & 0xff;
//if ( ((offset<<1)+1) != 0x555) printf("write to GFX flash chip %s addr %02x cmd %02x\n", chip1->tag(), (offset<<1)+1, command);
- chip1->write(space, (offset<<1)+0x1, command);
+ chip1->write((offset<<1)+0x1, command);
}
/* make a copy in the linear memory region we actually use for drawing etc. having it stored in interleaved flash roms isnt' very useful */
@@ -1483,22 +1496,22 @@ uint32_t cps3_state::cps3_flashmain_r(int which, uint32_t offset, uint32_t mem_m
if (ACCESSING_BITS_24_31) // Flash 1
{
//logerror("read flash chip %d addr %02x\n", base+0, offset*4 );
- result |= (m_simm[which][0]->read(machine().dummy_space(), offset)<<24);
+ result |= (m_simm[which][0]->read(offset)<<24);
}
if (ACCESSING_BITS_16_23) // Flash 1
{
//logerror("read flash chip %d addr %02x\n", base+1, offset*4 );
- result |= (m_simm[which][1]->read(machine().dummy_space(), offset)<<16);
+ result |= (m_simm[which][1]->read(offset)<<16);
}
if (ACCESSING_BITS_8_15) // Flash 1
{
//logerror("read flash chip %d addr %02x\n", base+2, offset*4 );
- result |= (m_simm[which][2]->read(machine().dummy_space(), offset)<<8);
+ result |= (m_simm[which][2]->read(offset)<<8);
}
if (ACCESSING_BITS_0_7) // Flash 1
{
//logerror("read flash chip %d addr %02x\n", base+3, offset*4 );
- result |= (m_simm[which][3]->read(machine().dummy_space(), offset)<<0);
+ result |= (m_simm[which][3]->read(offset)<<0);
}
// if (base==4) logerror("read flash chips addr %02x returning %08x\n", offset*4, result );
@@ -1539,25 +1552,25 @@ void cps3_state::cps3_flashmain_w(int which, uint32_t offset, uint32_t data, uin
{
command = (data >> 24) & 0xff;
//logerror("write to flash chip %s addr %02x cmd %02x\n", m_simm[which][0]->tag(), offset, command);
- m_simm[which][0]->write(machine().dummy_space(), offset, command);
+ m_simm[which][0]->write(offset, command);
}
if (ACCESSING_BITS_16_23) // Flash 2
{
command = (data >> 16) & 0xff;
//logerror("write to flash chip %s addr %02x cmd %02x\n", m_simm[which][1]->tag(), offset, command);
- m_simm[which][1]->write(machine().dummy_space(), offset, command);
+ m_simm[which][1]->write(offset, command);
}
if (ACCESSING_BITS_8_15) // Flash 2
{
command = (data >> 8) & 0xff;
//logerror("write to flash chip %s addr %02x cmd %02x\n", m_simm[which][2]->tag(), offset, command);
- m_simm[which][2]->write(machine().dummy_space(), offset, command);
+ m_simm[which][2]->write(offset, command);
}
if (ACCESSING_BITS_0_7) // Flash 2
{
command = (data >> 0) & 0xff;
//logerror("write to flash chip %s addr %02x cmd %02x\n", m_simm[which][3]->tag(), offset, command);
- m_simm[which][3]->write(machine().dummy_space(), offset, command);
+ m_simm[which][3]->write(offset, command);
}
/* copy data into regions to execute from */
@@ -2177,7 +2190,7 @@ void cps3_state::cps3_map(address_map &map)
map(0x05100000, 0x05100003).w(FUNC(cps3_state::cps3_irq12_ack_w));
map(0x05110000, 0x05110003).w(FUNC(cps3_state::cps3_irq10_ack_w));
- map(0x05140000, 0x05140003).rw("wd33c93", FUNC(wd33c93_device::read), FUNC(wd33c93_device::write)).umask32(0x00ff00ff);
+ map(0x05140000, 0x05140003).rw("scsi:7:wd33c93", FUNC(wd33c93_device::indir_r), FUNC(wd33c93_device::indir_w)).umask32(0x00ff00ff);
map(0x06000000, 0x067fffff).rw(FUNC(cps3_state::cps3_flash1_r), FUNC(cps3_state::cps3_flash1_w)); /* Flash ROMs simm 1 */
map(0x06800000, 0x06ffffff).rw(FUNC(cps3_state::cps3_flash2_r), FUNC(cps3_state::cps3_flash2_w)); /* Flash ROMs simm 2 */
@@ -2276,6 +2289,28 @@ INTERRUPT_GEN_MEMBER(cps3_state::cps3_other_interrupt)
}
+void cps3_state::machine_start()
+{
+ m_eeprom = std::make_unique<uint32_t[]>(0x400/4);
+ subdevice<nvram_device>("eeprom")->set_base(m_eeprom.get(), 0x400);
+
+ save_item(NAME(m_cram_gfxflash_bank));
+ save_item(NAME(m_cram_bank));
+ save_item(NAME(m_current_eeprom_read));
+ save_item(NAME(m_paldma_source));
+ save_item(NAME(m_paldma_realsource));
+ save_item(NAME(m_paldma_dest));
+ save_item(NAME(m_paldma_fade));
+ save_item(NAME(m_paldma_other2));
+ save_item(NAME(m_paldma_length));
+ save_item(NAME(m_chardma_source));
+ save_item(NAME(m_chardma_other));
+ save_item(NAME(m_current_table_address));
+
+ save_pointer(NAME(m_eeprom), 0x400/4);
+}
+
+
void cps3_state::machine_reset()
{
m_current_table_address = -1;
@@ -2285,6 +2320,12 @@ void cps3_state::machine_reset()
}
+void cps3_state::device_post_load()
+{
+ // copy data from flashroms back into user regions + decrypt into regions we execute/draw from.
+ copy_from_nvram();
+}
+
// make a copy in the regions we execute code / draw gfx from
void cps3_state::copy_from_nvram()
@@ -2510,11 +2551,9 @@ void cps3_state::cps3(machine_config &config)
m_maincpu->set_periodic_int(FUNC(cps3_state::cps3_other_interrupt), attotime::from_hz(80)); /* ?source? */
m_maincpu->set_dma_kludge_callback(FUNC(cps3_state::dma_callback));
- scsi_port_device &scsi(SCSI_PORT(config, "scsi"));
- scsi.set_slot_device(1, "cdrom", SCSICD, DEVICE_INPUT_DEFAULTS_NAME(SCSI_ID_1));
-
- wd33c93_device& wd33c93(WD33C93(config, "wd33c93"));
- wd33c93.set_scsi_port("scsi");
+ NSCSI_BUS(config, "scsi");
+ NSCSI_CONNECTOR(config, "scsi:1").option_set("cdrom", NSCSI_CDROM);
+ NSCSI_CONNECTOR(config, "scsi:7").option_set("wd33c93", WD33C93A).clock(10'000'000);
/* video hardware */
screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
@@ -2613,7 +2652,7 @@ ROM_START( redearth )
ROM_REGION32_BE( 0x080000, "bios", 0 ) /* bios region */
ROM_LOAD( "redearth_euro.29f400.u2", 0x000000, 0x080000, CRC(02e0f336) SHA1(acc37e830dfeb9674f5a0fb24f4cc23217ae4ff5) )
- DISK_REGION( "scsi:" SCSI_PORT_DEVICE1 ":cdrom" )
+ DISK_REGION( "scsi:1:cdrom" )
DISK_IMAGE_READONLY( "cap-wzd-5", 0, BAD_DUMP SHA1(e5676752b08283dc4a98c3d7b759e8aa6dcd0679) )
ROM_END
@@ -2621,7 +2660,7 @@ ROM_START( redearthr1 )
ROM_REGION32_BE( 0x080000, "bios", 0 ) /* bios region */
ROM_LOAD( "redearth_euro.29f400.u2", 0x000000, 0x080000, CRC(02e0f336) SHA1(acc37e830dfeb9674f5a0fb24f4cc23217ae4ff5) )
- DISK_REGION( "scsi:" SCSI_PORT_DEVICE1 ":cdrom" )
+ DISK_REGION( "scsi:1:cdrom" )
DISK_IMAGE_READONLY( "cap-wzd-3", 0, SHA1(a6ff67093db6bc80ee5fc46e4300e0177b213a52) )
ROM_END
@@ -2629,7 +2668,7 @@ ROM_START( warzard )
ROM_REGION32_BE( 0x080000, "bios", 0 ) /* bios region */
ROM_LOAD( "warzard_japan.29f400.u2", 0x000000, 0x080000, CRC(f8e2f0c6) SHA1(93d6a986f44c211fff014e55681eca4d2a2774d6) )
- DISK_REGION( "scsi:" SCSI_PORT_DEVICE1 ":cdrom" )
+ DISK_REGION( "scsi:1:cdrom" )
DISK_IMAGE_READONLY( "cap-wzd-5", 0, BAD_DUMP SHA1(e5676752b08283dc4a98c3d7b759e8aa6dcd0679) )
ROM_END
@@ -2637,7 +2676,7 @@ ROM_START( warzardr1 )
ROM_REGION32_BE( 0x080000, "bios", 0 ) /* bios region */
ROM_LOAD( "warzard_japan.29f400.u2", 0x000000, 0x080000, CRC(f8e2f0c6) SHA1(93d6a986f44c211fff014e55681eca4d2a2774d6) )
- DISK_REGION( "scsi:" SCSI_PORT_DEVICE1 ":cdrom" )
+ DISK_REGION( "scsi:1:cdrom" )
DISK_IMAGE_READONLY( "cap-wzd-3", 0, SHA1(a6ff67093db6bc80ee5fc46e4300e0177b213a52) )
ROM_END
@@ -2646,7 +2685,7 @@ ROM_START( sfiii )
ROM_REGION32_BE( 0x080000, "bios", 0 ) /* bios region */
ROM_LOAD( "sfiii_euro.29f400.u2", 0x000000, 0x080000, CRC(27699ddc) SHA1(d8b525cd27e584560b129598df31fd2c5b2a682a) )
- DISK_REGION( "scsi:" SCSI_PORT_DEVICE1 ":cdrom" )
+ DISK_REGION( "scsi:1:cdrom" )
DISK_IMAGE_READONLY( "cap-sf3-3", 0, BAD_DUMP SHA1(606e62cc5f46275e366e7dbb412dbaeb7e54cd0c) )
ROM_END
@@ -2654,7 +2693,7 @@ ROM_START( sfiiiu )
ROM_REGION32_BE( 0x080000, "bios", 0 ) /* bios region */
ROM_LOAD( "sfiii_usa_region_b1.29f400.u2", 0x000000, 0x080000, CRC(fb172a8e) SHA1(48ebf59910f246835f7dc0c588da30f7a908072f) )
- DISK_REGION( "scsi:" SCSI_PORT_DEVICE1 ":cdrom" )
+ DISK_REGION( "scsi:1:cdrom" )
DISK_IMAGE_READONLY( "cap-sf3-3", 0, BAD_DUMP SHA1(606e62cc5f46275e366e7dbb412dbaeb7e54cd0c) )
ROM_END
@@ -2662,7 +2701,7 @@ ROM_START( sfiiia )
ROM_REGION32_BE( 0x080000, "bios", 0 ) /* bios region */
ROM_LOAD( "sfiii_asia_region_bd.29f400.u2", 0x000000, 0x080000, CRC(cbd28de7) SHA1(9c15ecb73b9587d20850e62e8683930a45caa01b) )
- DISK_REGION( "scsi:" SCSI_PORT_DEVICE1 ":cdrom" )
+ DISK_REGION( "scsi:1:cdrom" )
DISK_IMAGE_READONLY( "cap-sf3-3", 0, BAD_DUMP SHA1(606e62cc5f46275e366e7dbb412dbaeb7e54cd0c) )
ROM_END
@@ -2670,7 +2709,7 @@ ROM_START( sfiiij )
ROM_REGION32_BE( 0x080000, "bios", 0 ) /* bios region */
ROM_LOAD( "sfiii_japan.29f400.u2", 0x000000, 0x080000, CRC(74205250) SHA1(c3e83ace7121d32da729162662ec6b5285a31211) )
- DISK_REGION( "scsi:" SCSI_PORT_DEVICE1 ":cdrom" )
+ DISK_REGION( "scsi:1:cdrom" )
DISK_IMAGE_READONLY( "cap-sf3-3", 0, BAD_DUMP SHA1(606e62cc5f46275e366e7dbb412dbaeb7e54cd0c) )
ROM_END
@@ -2678,7 +2717,7 @@ ROM_START( sfiiih )
ROM_REGION32_BE( 0x080000, "bios", 0 ) /* bios region */
ROM_LOAD( "sfiii_hispanic.29f400.u2", 0x000000, 0x080000, CRC(d2b3cd48) SHA1(00ebb270c24a66515c97e35331de54ff5358000e) )
- DISK_REGION( "scsi:" SCSI_PORT_DEVICE1 ":cdrom" )
+ DISK_REGION( "scsi:1:cdrom" )
DISK_IMAGE_READONLY( "cap-sf3-3", 0, BAD_DUMP SHA1(606e62cc5f46275e366e7dbb412dbaeb7e54cd0c) )
ROM_END
@@ -2687,7 +2726,7 @@ ROM_START( sfiii2 )
ROM_REGION32_BE( 0x080000, "bios", 0 ) /* bios region */
ROM_LOAD( "sfiii2_usa.29f400.u2", 0x000000, 0x080000, CRC(75dd72e0) SHA1(5a12d6ea6734df5de00ecee6f9ef470749d2f242) )
- DISK_REGION( "scsi:" SCSI_PORT_DEVICE1 ":cdrom" )
+ DISK_REGION( "scsi:1:cdrom" )
DISK_IMAGE_READONLY( "cap-3ga000", 0, BAD_DUMP SHA1(4e162885b0b3265a56e0265037bcf247e820f027) )
ROM_END
@@ -2695,7 +2734,7 @@ ROM_START( sfiii2j )
ROM_REGION32_BE( 0x080000, "bios", 0 ) /* bios region */
ROM_LOAD( "sfiii2_japan.29f400.u2", 0x000000, 0x080000, CRC(faea0a3e) SHA1(a03cd63bcf52e4d57f7a598c8bc8e243694624ec) )
- DISK_REGION( "scsi:" SCSI_PORT_DEVICE1 ":cdrom" )
+ DISK_REGION( "scsi:1:cdrom" )
DISK_IMAGE_READONLY( "cap-3ga000", 0, BAD_DUMP SHA1(4e162885b0b3265a56e0265037bcf247e820f027) )
ROM_END
@@ -2704,7 +2743,7 @@ ROM_START( jojo )
ROM_REGION32_BE( 0x080000, "bios", 0 ) /* bios region */
ROM_LOAD( "jojo_usa.29f400.u2", 0x000000, 0x080000, CRC(8d40f7be) SHA1(2a4bd83db2f959c33b071e517941aa55a0f919c0) )
- DISK_REGION( "scsi:" SCSI_PORT_DEVICE1 ":cdrom" )
+ DISK_REGION( "scsi:1:cdrom" )
DISK_IMAGE_READONLY( "cap-jjk-3", 0, SHA1(dc6e74b5e02e13f62cb8c4e234dd6061501e49c1) )
ROM_END
@@ -2712,7 +2751,7 @@ ROM_START( jojor1 )
ROM_REGION32_BE( 0x080000, "bios", 0 ) /* bios region */
ROM_LOAD( "jojo_usa.29f400.u2", 0x000000, 0x080000, CRC(8d40f7be) SHA1(2a4bd83db2f959c33b071e517941aa55a0f919c0) )
- DISK_REGION( "scsi:" SCSI_PORT_DEVICE1 ":cdrom" )
+ DISK_REGION( "scsi:1:cdrom" )
DISK_IMAGE_READONLY( "cap-jjk-2", 0, BAD_DUMP SHA1(0f5c09171409213e191a607ee89ca3a91fe9c96a) )
ROM_END
@@ -2720,7 +2759,7 @@ ROM_START( jojor2 )
ROM_REGION32_BE( 0x080000, "bios", 0 ) /* bios region */
ROM_LOAD( "jojo_usa.29f400.u2", 0x000000, 0x080000, CRC(8d40f7be) SHA1(2a4bd83db2f959c33b071e517941aa55a0f919c0) )
- DISK_REGION( "scsi:" SCSI_PORT_DEVICE1 ":cdrom" )
+ DISK_REGION( "scsi:1:cdrom" )
DISK_IMAGE_READONLY( "cap-jjk000", 0, BAD_DUMP SHA1(09869f6d8c032b527e02d815749dc8fab1289e86) )
ROM_END
@@ -2728,7 +2767,7 @@ ROM_START( jojoj )
ROM_REGION32_BE( 0x080000, "bios", 0 ) /* bios region */
ROM_LOAD( "jojo_japan.29f400.u2", 0x000000, 0x080000, CRC(02778f60) SHA1(a167f9ebe030592a0cdb0c6a3c75835c6a43be4c) )
- DISK_REGION( "scsi:" SCSI_PORT_DEVICE1 ":cdrom" )
+ DISK_REGION( "scsi:1:cdrom" )
DISK_IMAGE_READONLY( "cap-jjk-3", 0, SHA1(dc6e74b5e02e13f62cb8c4e234dd6061501e49c1) )
ROM_END
@@ -2736,7 +2775,7 @@ ROM_START( jojojr1 )
ROM_REGION32_BE( 0x080000, "bios", 0 ) /* bios region */
ROM_LOAD( "jojo_japan.29f400.u2", 0x000000, 0x080000, CRC(02778f60) SHA1(a167f9ebe030592a0cdb0c6a3c75835c6a43be4c) )
- DISK_REGION( "scsi:" SCSI_PORT_DEVICE1 ":cdrom" )
+ DISK_REGION( "scsi:1:cdrom" )
DISK_IMAGE_READONLY( "cap-jjk-2", 0, BAD_DUMP SHA1(0f5c09171409213e191a607ee89ca3a91fe9c96a) )
ROM_END
@@ -2744,7 +2783,7 @@ ROM_START( jojojr2 )
ROM_REGION32_BE( 0x080000, "bios", 0 ) /* bios region */
ROM_LOAD( "jojo_japan.29f400.u2", 0x000000, 0x080000, CRC(02778f60) SHA1(a167f9ebe030592a0cdb0c6a3c75835c6a43be4c) )
- DISK_REGION( "scsi:" SCSI_PORT_DEVICE1 ":cdrom" )
+ DISK_REGION( "scsi:1:cdrom" )
DISK_IMAGE_READONLY( "cap-jjk000", 0, BAD_DUMP SHA1(09869f6d8c032b527e02d815749dc8fab1289e86) )
ROM_END
@@ -2753,7 +2792,7 @@ ROM_START( sfiii3 )
ROM_REGION32_BE( 0x080000, "bios", 0 ) /* bios region */
ROM_LOAD( "sfiii3_euro.29f400.u2", 0x000000, 0x080000, CRC(30bbf293) SHA1(f094c2eeaf4f6709060197aca371a4532346bf78) )
- DISK_REGION( "scsi:" SCSI_PORT_DEVICE1 ":cdrom" )
+ DISK_REGION( "scsi:1:cdrom" )
DISK_IMAGE_READONLY( "cap-33s-2", 0, BAD_DUMP SHA1(41b0e246db91cbfc3f8f0f62d981734feb4b4ab5) )
ROM_END
@@ -2761,7 +2800,7 @@ ROM_START( sfiii3r1 )
ROM_REGION32_BE( 0x080000, "bios", 0 ) /* bios region */
ROM_LOAD( "sfiii3_euro.29f400.u2", 0x000000, 0x080000, CRC(30bbf293) SHA1(f094c2eeaf4f6709060197aca371a4532346bf78) )
- DISK_REGION( "scsi:" SCSI_PORT_DEVICE1 ":cdrom" )
+ DISK_REGION( "scsi:1:cdrom" )
DISK_IMAGE_READONLY( "cap-33s-1", 0, BAD_DUMP SHA1(2f4a9006a31903114f9f9dc09465ae253e565c51) )
ROM_END
@@ -2769,7 +2808,7 @@ ROM_START( sfiii3u )
ROM_REGION32_BE( 0x080000, "bios", 0 ) /* bios region */
ROM_LOAD( "sfiii3_usa.29f400.u2", 0x000000, 0x080000, CRC(ecc545c1) SHA1(e39083820aae914fd8b80c9765129bedb745ceba) )
- DISK_REGION( "scsi:" SCSI_PORT_DEVICE1 ":cdrom" )
+ DISK_REGION( "scsi:1:cdrom" )
DISK_IMAGE_READONLY( "cap-33s-2", 0, BAD_DUMP SHA1(41b0e246db91cbfc3f8f0f62d981734feb4b4ab5) )
ROM_END
@@ -2777,7 +2816,7 @@ ROM_START( sfiii3ur1 )
ROM_REGION32_BE( 0x080000, "bios", 0 ) /* bios region */
ROM_LOAD( "sfiii3_usa.29f400.u2", 0x000000, 0x080000, CRC(ecc545c1) SHA1(e39083820aae914fd8b80c9765129bedb745ceba) )
- DISK_REGION( "scsi:" SCSI_PORT_DEVICE1 ":cdrom" )
+ DISK_REGION( "scsi:1:cdrom" )
DISK_IMAGE_READONLY( "cap-33s-1", 0, BAD_DUMP SHA1(2f4a9006a31903114f9f9dc09465ae253e565c51) )
ROM_END
@@ -2785,7 +2824,7 @@ ROM_START( sfiii3j )
ROM_REGION32_BE( 0x080000, "bios", 0 ) /* bios region */
ROM_LOAD( "sfiii3_japan.29f400.u2", 0x000000, 0x080000, CRC(63f23d1f) SHA1(58559403c325454f8c8d3eb0f569a531aa22db26) )
- DISK_REGION( "scsi:" SCSI_PORT_DEVICE1 ":cdrom" )
+ DISK_REGION( "scsi:1:cdrom" )
DISK_IMAGE_READONLY( "cap-33s-2", 0, BAD_DUMP SHA1(41b0e246db91cbfc3f8f0f62d981734feb4b4ab5) )
ROM_END
@@ -2793,7 +2832,7 @@ ROM_START( sfiii3jr1 )
ROM_REGION32_BE( 0x080000, "bios", 0 ) /* bios region */
ROM_LOAD( "sfiii3_japan.29f400.u2", 0x000000, 0x080000, CRC(63f23d1f) SHA1(58559403c325454f8c8d3eb0f569a531aa22db26) )
- DISK_REGION( "scsi:" SCSI_PORT_DEVICE1 ":cdrom" )
+ DISK_REGION( "scsi:1:cdrom" )
DISK_IMAGE_READONLY( "cap-33s-1", 0, BAD_DUMP SHA1(2f4a9006a31903114f9f9dc09465ae253e565c51) )
ROM_END
@@ -2802,7 +2841,7 @@ ROM_START( jojoba )
ROM_REGION32_BE( 0x080000, "bios", 0 ) /* bios region */
ROM_LOAD( "jojoba_japan.29f400.u2", 0x000000, 0x080000, CRC(3085478c) SHA1(055eab1fc42816f370a44b17fd7e87ffcb10e8b7) )
- DISK_REGION( "scsi:" SCSI_PORT_DEVICE1 ":cdrom" )
+ DISK_REGION( "scsi:1:cdrom" )
DISK_IMAGE_READONLY( "cap-jjm-1", 0, SHA1(8628d3fa555fbd5f4121082e925c1834b76c5e65) )
ROM_END
@@ -2810,7 +2849,7 @@ ROM_START( jojobar1 )
ROM_REGION32_BE( 0x080000, "bios", 0 ) /* bios region */
ROM_LOAD( "jojoba_japan.29f400.u2", 0x000000, 0x080000, CRC(3085478c) SHA1(055eab1fc42816f370a44b17fd7e87ffcb10e8b7) )
- DISK_REGION( "scsi:" SCSI_PORT_DEVICE1 ":cdrom" )
+ DISK_REGION( "scsi:1:cdrom" )
DISK_IMAGE_READONLY( "cap-jjm-0", 0, BAD_DUMP SHA1(0678a0baeb853dcff1d230c14f0873cc9f143d7b) )
ROM_END
@@ -3671,7 +3710,7 @@ ROM_START( cps3boot ) // for cart with standard SH2
ROM_REGION32_BE( 0x080000, "bios", 0 ) /* bios region */
ROM_LOAD( "no-battery_bios_29f400_for_hd6417095_sh2.u2", 0x000000, 0x080000, CRC(cb9bd5b0) SHA1(ea7ecb3deb69f5307a62d8f0d7d8e68d49013d07))
- DISK_REGION( "scsi:" SCSI_PORT_DEVICE1 ":cdrom" )
+ DISK_REGION( "scsi:1:cdrom" )
DISK_IMAGE_READONLY( "unicd-cps3_for_standard_sh2_v4", 0, SHA1(099c52bd38753f0f4876243e7aa87ca482a2dcb7) )
ROM_END
@@ -3679,7 +3718,7 @@ ROM_START( cps3booto ) // for cart with standard SH2
ROM_REGION32_BE( 0x080000, "bios", 0 ) /* bios region */
ROM_LOAD( "no-battery_bios_29f400_for_hd6417095_sh2.u2", 0x000000, 0x080000, CRC(cb9bd5b0) SHA1(ea7ecb3deb69f5307a62d8f0d7d8e68d49013d07))
- DISK_REGION( "scsi:" SCSI_PORT_DEVICE1 ":cdrom" )
+ DISK_REGION( "scsi:1:cdrom" )
DISK_IMAGE_READONLY( "no-battery_multi-game_bootleg_cd_for_hd6417095_sh2", 0, SHA1(6057cc3ec7991c0c00a7ab9da6ac2f92c9fb1aed) )
ROM_END
@@ -3687,7 +3726,7 @@ ROM_START( cps3booto2 ) // for cart with standard SH2
ROM_REGION32_BE( 0x080000, "bios", 0 ) /* bios region */
ROM_LOAD( "no-battery_bios_29f400_for_hd6417095_sh2.u2", 0x000000, 0x080000, CRC(cb9bd5b0) SHA1(ea7ecb3deb69f5307a62d8f0d7d8e68d49013d07))
- DISK_REGION( "scsi:" SCSI_PORT_DEVICE1 ":cdrom" )
+ DISK_REGION( "scsi:1:cdrom" )
DISK_IMAGE_READONLY( "no-battery_multi-game_bootleg_cd_for_hd6417095_sh2_older", 0, SHA1(123f2fcb0f3dd3d6b859e82a51d0127e46763776) )
ROM_END
@@ -3695,7 +3734,7 @@ ROM_START( cps3bs32 ) // for cart with standard SH2
ROM_REGION32_BE( 0x080000, "bios", 0 ) /* bios region */
ROM_LOAD( "no-battery_bios_29f400_for_hd6417095_sh2.u2", 0x000000, 0x080000, CRC(cb9bd5b0) SHA1(ea7ecb3deb69f5307a62d8f0d7d8e68d49013d07))
- DISK_REGION( "scsi:" SCSI_PORT_DEVICE1 ":cdrom" )
+ DISK_REGION( "scsi:1:cdrom" )
DISK_IMAGE_READONLY( "sfiii_2nd_impact_converted_for_standard_sh2_v3", 0, SHA1(8f180d159e88042a1e819cefd39eef67f5e86e3d) )
ROM_END
@@ -3703,7 +3742,7 @@ ROM_START( cps3bs32a ) // for cart with standard SH2
ROM_REGION32_BE( 0x080000, "bios", 0 ) /* bios region */
ROM_LOAD( "no-battery_bios_29f400_for_hd6417095_sh2.u2", 0x000000, 0x080000, CRC(cb9bd5b0) SHA1(ea7ecb3deb69f5307a62d8f0d7d8e68d49013d07))
- DISK_REGION( "scsi:" SCSI_PORT_DEVICE1 ":cdrom" )
+ DISK_REGION( "scsi:1:cdrom" )
DISK_IMAGE_READONLY( "sfiii_2nd_impact_converted_for_standard_sh2_older", 0, SHA1(8a8e4138c3bf12435933ab9d9ace510513200843) ) // v1 or v2?
ROM_END
@@ -3711,7 +3750,7 @@ ROM_START( cps3boota ) // for cart with dead custom SH2 (or 2nd Impact CPU which
ROM_REGION32_BE( 0x080000, "bios", 0 ) /* bios region */
ROM_LOAD( "no-battery_bios_29f400_for_dead_security_cart.u2", 0x000000, 0x080000, CRC(0fd56fb3) SHA1(5a8bffc07eb7da73cf4bca6718df72e471296bfd) )
- DISK_REGION( "scsi:" SCSI_PORT_DEVICE1 ":cdrom" )
+ DISK_REGION( "scsi:1:cdrom" )
DISK_IMAGE_READONLY( "unicd-cps3_for_custom_sh2_v5", 0, SHA1(50a5b2845d3dd3de3bce15c4f1b58500db80cabe) )
ROM_END
@@ -3719,7 +3758,7 @@ ROM_START( cps3bootao ) // for cart with dead custom SH2 (or 2nd Impact CPU whic
ROM_REGION32_BE( 0x080000, "bios", 0 ) /* bios region */
ROM_LOAD( "no-battery_bios_29f400_for_dead_security_cart.u2", 0x000000, 0x080000, CRC(0fd56fb3) SHA1(5a8bffc07eb7da73cf4bca6718df72e471296bfd) )
- DISK_REGION( "scsi:" SCSI_PORT_DEVICE1 ":cdrom" )
+ DISK_REGION( "scsi:1:cdrom" )
DISK_IMAGE_READONLY( "no-battery_multi-game_bootleg_cd_for_dead_security_cart", 0, SHA1(1ede2f1ba197ee787208358a13eae7185a5ae3b2) )
ROM_END
@@ -3728,7 +3767,7 @@ ROM_START( cps3bootao2 ) // for cart with dead custom SH2 (or 2nd Impact CPU whi
ROM_REGION32_BE( 0x080000, "bios", 0 ) /* bios region */
ROM_LOAD( "no-battery_bios_29f400_for_dead_security_cart.u2", 0x000000, 0x080000, CRC(0fd56fb3) SHA1(5a8bffc07eb7da73cf4bca6718df72e471296bfd) )
- DISK_REGION( "scsi:" SCSI_PORT_DEVICE1 ":cdrom" )
+ DISK_REGION( "scsi:1:cdrom" )
DISK_IMAGE_READONLY( "no-battery_multi-game_bootleg_cd_for_dead_security_cart_older", 0, SHA1(4b0b673b45dac94da018576c0a7f8644653fc564) )
ROM_END
diff --git a/src/mame/drivers/craft.cpp b/src/mame/drivers/craft.cpp
index e04f678cc80..c63a1ca94af 100644
--- a/src/mame/drivers/craft.cpp
+++ b/src/mame/drivers/craft.cpp
@@ -267,7 +267,6 @@ void craft_state::craft(machine_config &config)
SPEAKER(config, "avr8").front_center();
DAC_6BIT_R2R(config, "dac", 0).add_route(0, "avr8", 0.25); // pd1/pd2/pd4/pd5/pd6/pd7 + 2k(x7) + 1k(x5)
voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref", 0));
- vref.set_output(5.0);
vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT);
vref.add_route(0, "dac", -1.0, DAC_VREF_NEG_INPUT);
}
diff --git a/src/mame/drivers/crbaloon.cpp b/src/mame/drivers/crbaloon.cpp
index 4d24798c54b..ff32e1de93e 100644
--- a/src/mame/drivers/crbaloon.cpp
+++ b/src/mame/drivers/crbaloon.cpp
@@ -361,31 +361,30 @@ INTERRUPT_GEN_MEMBER(crbaloon_state::vblank_irq)
}
-MACHINE_CONFIG_START(crbaloon_state::crbaloon)
-
+void crbaloon_state::crbaloon(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, CRBALOON_MASTER_XTAL / 3)
- MCFG_DEVICE_PROGRAM_MAP(main_map)
- MCFG_DEVICE_IO_MAP(main_io_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", crbaloon_state, vblank_irq)
+ Z80(config, m_maincpu, CRBALOON_MASTER_XTAL / 3);
+ m_maincpu->set_addrmap(AS_PROGRAM, &crbaloon_state::main_map);
+ m_maincpu->set_addrmap(AS_IO, &crbaloon_state::main_io_map);
+ m_maincpu->set_vblank_int("screen", FUNC(crbaloon_state::vblank_irq));
/* video hardware */
GFXDECODE(config, m_gfxdecode, "palette", gfx_crbaloon);
PALETTE(config, "palette", FUNC(crbaloon_state::crbaloon_palette), 32);
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_VIDEO_ATTRIBUTES(VIDEO_ALWAYS_UPDATE)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(32*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 0*8, 28*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(crbaloon_state, screen_update_crbaloon)
- MCFG_SCREEN_PALETTE("palette")
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_video_attributes(VIDEO_ALWAYS_UPDATE);
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(32*8, 32*8);
+ screen.set_visarea(0*8, 32*8-1, 0*8, 28*8-1);
+ screen.set_screen_update(FUNC(crbaloon_state::screen_update_crbaloon));
+ screen.set_palette("palette");
/* audio hardware */
crbaloon_audio(config);
-
-MACHINE_CONFIG_END
+}
diff --git a/src/mame/drivers/cromptons.cpp b/src/mame/drivers/cromptons.cpp
new file mode 100644
index 00000000000..fd1701f1977
--- /dev/null
+++ b/src/mame/drivers/cromptons.cpp
@@ -0,0 +1,150 @@
+// license:BSD-3-Clause
+// copyright-holders:AJR
+/*
+ Skeleton driver for Cromptons Leisure Machines' Frantic Fruits redemption game.
+
+ Hardware overview:
+ Main CPU: TS80C32X2-MCA
+ Sound: CD sound?
+ Other: M48T08 timekeeper RAM
+ OSC: 11.0592 MHz
+ Dips: 2 x 8 dips banks
+
+ Video: https://www.youtube.com/watch?v=89XJpor9dSQ
+*/
+
+#include "emu.h"
+#include "cpu/mcs51/mcs51.h"
+#include "machine/74259.h"
+#include "machine/timekpr.h"
+#include "screen.h"
+
+class cromptons_state : public driver_device
+{
+public:
+ cromptons_state(const machine_config &mconfig, device_type type, const char *tag)
+ : driver_device(mconfig, type, tag)
+ , m_maincpu(*this, "maincpu")
+ , m_outlatch(*this, "outlatch%u", 0U)
+ , m_inputs(*this, "IN%u", 0U)
+ { }
+
+ void cromptons(machine_config &config);
+
+protected:
+ virtual void machine_start() override;
+
+private:
+ u8 port_r();
+ void port_w(u8 data);
+
+ required_device<mcs51_cpu_device> m_maincpu;
+ required_device_array<hc259_device, 4> m_outlatch;
+ required_ioport_array<4> m_inputs;
+
+ void prg_map(address_map &map);
+ void io_map(address_map &map);
+
+ u8 m_port_select;
+};
+
+void cromptons_state::machine_start()
+{
+ save_item(NAME(m_port_select));
+}
+
+u8 cromptons_state::port_r()
+{
+ return BIT(m_inputs[(m_port_select & 0x18) >> 3]->read(), m_port_select & 0x07) ? 0xff : 0x7f;
+}
+
+void cromptons_state::port_w(u8 data)
+{
+ if (!BIT(data, 6))
+ m_outlatch[(data & 0x18) >> 3]->write_bit(data & 0x07, BIT(data, 5));
+
+ m_port_select = data;
+}
+
+void cromptons_state::prg_map(address_map &map)
+{
+ map(0x0000, 0xffff).rom().region("maincpu", 0);
+}
+
+void cromptons_state::io_map(address_map &map)
+{
+ map(0xe000, 0xffff).rw("timekpr", FUNC(timekeeper_device::read), FUNC(timekeeper_device::write));
+}
+
+static INPUT_PORTS_START( cromptons )
+ PORT_START("IN0")
+ PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_UNKNOWN)
+ PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_UNKNOWN)
+ PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_UNKNOWN)
+ PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_UNKNOWN)
+ PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_UNKNOWN)
+ PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_UNKNOWN)
+ PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_UNKNOWN)
+ PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_UNKNOWN)
+
+ PORT_START("IN1")
+ PORT_DIPUNKNOWN_DIPLOC(0x01, 0x01, "SW1:1")
+ PORT_DIPUNKNOWN_DIPLOC(0x02, 0x02, "SW1:2")
+ PORT_DIPUNKNOWN_DIPLOC(0x04, 0x04, "SW1:3")
+ PORT_DIPUNKNOWN_DIPLOC(0x08, 0x08, "SW1:4")
+ PORT_DIPUNKNOWN_DIPLOC(0x10, 0x10, "SW1:5")
+ PORT_DIPUNKNOWN_DIPLOC(0x20, 0x20, "SW1:6")
+ PORT_DIPUNKNOWN_DIPLOC(0x40, 0x40, "SW1:7")
+ PORT_DIPUNKNOWN_DIPLOC(0x80, 0x80, "SW1:8")
+
+ PORT_START("IN2")
+ PORT_DIPUNKNOWN_DIPLOC(0x01, 0x01, "SW2:1")
+ PORT_DIPUNKNOWN_DIPLOC(0x02, 0x02, "SW2:2")
+ PORT_DIPUNKNOWN_DIPLOC(0x04, 0x04, "SW2:3")
+ PORT_DIPUNKNOWN_DIPLOC(0x08, 0x08, "SW2:4")
+ PORT_DIPUNKNOWN_DIPLOC(0x10, 0x10, "SW2:5")
+ PORT_DIPUNKNOWN_DIPLOC(0x20, 0x20, "SW2:6")
+ PORT_DIPUNKNOWN_DIPLOC(0x40, 0x40, "SW2:7")
+ PORT_DIPUNKNOWN_DIPLOC(0x80, 0x80, "SW2:8")
+
+ PORT_START("IN3")
+ PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_UNKNOWN)
+ PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_UNKNOWN)
+ PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_UNKNOWN)
+ PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_UNKNOWN)
+ PORT_BIT(0xf0, IP_ACTIVE_LOW, IPT_UNUSED)
+INPUT_PORTS_END
+
+
+void cromptons_state::cromptons(machine_config &config)
+{
+ /* basic machine hardware */
+ I80C32(config, m_maincpu, 11.0592_MHz_XTAL); // TS80C32X2-MCA
+ m_maincpu->set_addrmap(AS_PROGRAM, &cromptons_state::prg_map);
+ m_maincpu->set_addrmap(AS_IO, &cromptons_state::io_map);
+ m_maincpu->port_in_cb<1>().set(FUNC(cromptons_state::port_r));
+ m_maincpu->port_out_cb<1>().set(FUNC(cromptons_state::port_w));
+
+ MK48T08(config, "timekpr");
+
+ HC259(config, m_outlatch[0]); // types not verified
+ HC259(config, m_outlatch[1]);
+ HC259(config, m_outlatch[2]);
+ HC259(config, m_outlatch[3]);
+
+ // sound ??
+}
+
+/***************************************************************************
+
+ Game drivers
+
+***************************************************************************/
+
+ROM_START( ffruits )
+ ROM_REGION(0x10000, "maincpu", 0)
+ ROM_LOAD( "frntf5v6.ic11", 0x00000, 0x10000, CRC(ca60c557) SHA1(6f356827f0c93ec0376a7edc03963ef0748dccdb) ) // 27c512
+ROM_END
+
+
+GAME( 2000, ffruits, 0, cromptons, cromptons, cromptons_state, empty_init, ROT0, "Cromptons Leisure Machines", "Frantic Fruits", MACHINE_IS_SKELETON_MECHANICAL )
diff --git a/src/mame/drivers/crospang.cpp b/src/mame/drivers/crospang.cpp
index fb3b3c4a6d0..1d0f7970c4b 100644
--- a/src/mame/drivers/crospang.cpp
+++ b/src/mame/drivers/crospang.cpp
@@ -40,15 +40,15 @@
/* main cpu */
-void crospang_state::crospang_base_map(address_map &map)
+void crospang_state::base_map(address_map &map)
{
map(0x000000, 0x0fffff).rom().nopw(); // writes to rom quite often
- map(0x100000, 0x100001).w(FUNC(crospang_state::bestri_tilebank_select_w));
- map(0x10000e, 0x10000f).w(FUNC(crospang_state::bestri_tilebank_data_w));
+ map(0x100000, 0x100001).w(FUNC(crospang_state::tilebank_select_w));
+ map(0x10000e, 0x10000f).w(FUNC(crospang_state::tilebank_data_w));
- map(0x120000, 0x1207ff).ram().w(FUNC(crospang_state::crospang_fg_videoram_w)).share("fg_videoram");
- map(0x122000, 0x1227ff).ram().w(FUNC(crospang_state::crospang_bg_videoram_w)).share("bg_videoram");
+ map(0x120000, 0x1207ff).ram().w(FUNC(crospang_state::fg_videoram_w)).share("fg_videoram");
+ map(0x122000, 0x1227ff).ram().w(FUNC(crospang_state::bg_videoram_w)).share("bg_videoram");
map(0x200000, 0x2005ff).ram().w("palette", FUNC(palette_device::write16)).share("palette");
map(0x210000, 0x2107ff).ram().share("spriteram");
map(0x270001, 0x270001).w(m_soundlatch, FUNC(generic_latch_8_device::write));
@@ -62,31 +62,31 @@ void crospang_state::crospang_base_map(address_map &map)
void crospang_state::crospang_map(address_map &map)
{
- crospang_base_map(map);
+ base_map(map);
- map(0x100002, 0x100003).w(FUNC(crospang_state::crospang_fg_scrolly_w));
- map(0x100004, 0x100005).w(FUNC(crospang_state::crospang_bg_scrollx_w));
- map(0x100006, 0x100007).w(FUNC(crospang_state::crospang_bg_scrolly_w));
- map(0x100008, 0x100009).w(FUNC(crospang_state::crospang_fg_scrollx_w));
+ map(0x100002, 0x100003).w(FUNC(crospang_state::fg_scrolly_w));
+ map(0x100004, 0x100005).w(FUNC(crospang_state::bg_scrollx_w));
+ map(0x100006, 0x100007).w(FUNC(crospang_state::bg_scrolly_w));
+ map(0x100008, 0x100009).w(FUNC(crospang_state::fg_scrollx_w));
map(0x320000, 0x32ffff).ram();
}
void crospang_state::pitapat_map(address_map &map)
{
- crospang_base_map(map);
+ base_map(map);
- map(0x100002, 0x100003).w(FUNC(crospang_state::crospang_fg_scrolly_w));
- map(0x100004, 0x100005).w(FUNC(crospang_state::crospang_bg_scrollx_w));
- map(0x100006, 0x100007).w(FUNC(crospang_state::crospang_bg_scrolly_w));
- map(0x100008, 0x100009).w(FUNC(crospang_state::crospang_fg_scrollx_w));
+ map(0x100002, 0x100003).w(FUNC(crospang_state::fg_scrolly_w));
+ map(0x100004, 0x100005).w(FUNC(crospang_state::bg_scrollx_w));
+ map(0x100006, 0x100007).w(FUNC(crospang_state::bg_scrolly_w));
+ map(0x100008, 0x100009).w(FUNC(crospang_state::fg_scrollx_w));
map(0x300000, 0x30ffff).ram();
}
void crospang_state::bestri_map(address_map &map)
{
- crospang_base_map(map);
+ base_map(map);
map(0x100004, 0x100005).w(FUNC(crospang_state::bestri_fg_scrollx_w));
map(0x100006, 0x100007).w(FUNC(crospang_state::bestri_fg_scrolly_w));
@@ -98,7 +98,7 @@ void crospang_state::bestri_map(address_map &map)
void crospang_state::bestria_map(address_map &map)
{
- crospang_base_map(map);
+ base_map(map);
map(0x100006, 0x100007).w(FUNC(crospang_state::bestri_fg_scrollx_w));
map(0x100008, 0x100009).w(FUNC(crospang_state::bestri_fg_scrolly_w));
@@ -110,13 +110,13 @@ void crospang_state::bestria_map(address_map &map)
/* sound cpu */
-void crospang_state::crospang_sound_map(address_map &map)
+void crospang_state::sound_map(address_map &map)
{
map(0x0000, 0xbfff).rom();
map(0xc000, 0xc7ff).ram();
}
-void crospang_state::crospang_sound_io_map(address_map &map)
+void crospang_state::sound_io_map(address_map &map)
{
map.global_mask(0xff);
map(0x00, 0x01).rw("ymsnd", FUNC(ym3812_device::read), FUNC(ym3812_device::write));
@@ -393,33 +393,42 @@ static const gfx_layout tlayout =
RGN_FRAC(1,2),
4,
{ RGN_FRAC(1,2)+8, RGN_FRAC(1,2)+0, 8, 0 },
- { 32*8+0, 32*8+1, 32*8+2, 32*8+3, 32*8+4, 32*8+5, 32*8+6, 32*8+7,
- 0, 1, 2, 3, 4, 5, 6, 7 },
- { 0*16, 1*16, 2*16, 3*16, 4*16, 5*16, 6*16, 7*16,
- 8*16, 9*16, 10*16, 11*16, 12*16, 13*16, 14*16, 15*16 },
+ { STEP8(8*2*16,1), STEP8(0,1) },
+ { STEP16(0,8*2) },
+ 64*8
+};
+
+static const gfx_layout tlayout_alt =
+{
+ 16,16,
+ RGN_FRAC(1,2),
+ 4,
+ { 8, 0, RGN_FRAC(1,2)+8, RGN_FRAC(1,2)+0 },
+ { STEP8(0,1), STEP8(8*2*16,1) },
+ { STEP16(0,8*2) },
64*8
};
static GFXDECODE_START( gfx_crospang )
- GFXDECODE_ENTRY( "gfx2", 0, tlayout, 0, 64 ) /* Tiles 16x16 */
- GFXDECODE_ENTRY( "gfx1", 0, tlayout, 0, 64 ) /* Sprites 16x16 */
+ GFXDECODE_ENTRY( "gfx2", 0, tlayout, 0, 64 ) /* Sprites 16x16 */
+ GFXDECODE_ENTRY( "gfx1", 0, tlayout_alt, 0, 64 ) /* Tiles 16x16 */
GFXDECODE_END
void crospang_state::machine_start()
{
- save_item(NAME(m_bestri_tilebank));
- save_item(NAME(m_bestri_tilebankselect));
+ save_item(NAME(m_tilebank));
+ save_item(NAME(m_tilebankselect));
}
void crospang_state::machine_reset()
{
- m_bestri_tilebank[0] = 0x00;
- m_bestri_tilebank[1] = 0x01;
- m_bestri_tilebank[2] = 0x02;
- m_bestri_tilebank[3] = 0x03;
+ m_tilebank[0] = 0x00;
+ m_tilebank[1] = 0x01;
+ m_tilebank[2] = 0x02;
+ m_tilebank[3] = 0x03;
- m_bestri_tilebankselect = 0;
+ m_tilebankselect = 0;
}
void crospang_state::crospang(machine_config &config)
@@ -430,8 +439,8 @@ void crospang_state::crospang(machine_config &config)
m_maincpu->set_vblank_int("screen", FUNC(crospang_state::irq6_line_hold));
z80_device &audiocpu(Z80(config, "audiocpu", XTAL(14'318'181)/4)); /* 3.579545MHz */
- audiocpu.set_addrmap(AS_PROGRAM, &crospang_state::crospang_sound_map);
- audiocpu.set_addrmap(AS_IO, &crospang_state::crospang_sound_io_map);
+ audiocpu.set_addrmap(AS_PROGRAM, &crospang_state::sound_map);
+ audiocpu.set_addrmap(AS_IO, &crospang_state::sound_io_map);
/* video hardware */
screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
@@ -439,7 +448,7 @@ void crospang_state::crospang(machine_config &config)
screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
screen.set_size(64*8, 64*8);
screen.set_visarea(0, 40*8-1, 0, 30*8-1);
- screen.set_screen_update(FUNC(crospang_state::screen_update_crospang));
+ screen.set_screen_update(FUNC(crospang_state::screen_update));
screen.set_palette("palette");
PALETTE(config, "palette").set_format(palette_device::xRGB_555, 0x300);
@@ -743,34 +752,9 @@ ROM_START( pitapat )
ROM_LOAD16_BYTE( "ud17", 0x080001, 0x40000, CRC(d4c67e2e) SHA1(e684b58333d64f5961983b42f56c61bb0bea2e5c) )
ROM_END
-void crospang_state::tumblepb_gfx1_rearrange()
-{
- uint8_t *rom = memregion("gfx1")->base();
- int len = memregion("gfx1")->bytes();
- int i;
-
- /* gfx data is in the wrong order */
- for (i = 0; i < len; i++)
- {
- if ((i & 0x20) == 0)
- {
- int t = rom[i]; rom[i] = rom[i + 0x20]; rom[i + 0x20] = t;
- }
- }
- /* low/high half are also swapped */
- for (i = 0; i < len / 2; i++)
- {
- int t = rom[i]; rom[i] = rom[i + len / 2]; rom[i + len / 2] = t;
- }
-}
-
-void crospang_state::init_crospang()
-{
- tumblepb_gfx1_rearrange();
-}
-GAME( 1998, crospang, 0, crospang, crospang, crospang_state, init_crospang, ROT0, "F2 System", "Cross Pang", MACHINE_SUPPORTS_SAVE )
-GAME( 1997, heuksun, 0, crospang, heuksun, crospang_state, init_crospang, ROT0, "Oksan / F2 System", "Heuk Sun Baek Sa (Korea)", MACHINE_SUPPORTS_SAVE )
-GAME( 1998, bestri, 0, bestri, bestri, crospang_state, init_crospang, ROT0, "F2 System", "Bestri (Korea, set 1)", MACHINE_SUPPORTS_SAVE )
-GAME( 1998, bestria, bestri, bestria, bestri, crospang_state, init_crospang, ROT0, "F2 System", "Bestri (Korea, set 2)", MACHINE_SUPPORTS_SAVE )
-GAME( 1997, pitapat, 0, pitapat, pitapat, crospang_state, init_crospang, ROT0, "F2 System", "Pitapat Puzzle", MACHINE_SUPPORTS_SAVE ) // Test Mode calls it 'Puzzle Ball'
+GAME( 1998, crospang, 0, crospang, crospang, crospang_state, empty_init, ROT0, "F2 System", "Cross Pang", MACHINE_SUPPORTS_SAVE )
+GAME( 1997, heuksun, 0, crospang, heuksun, crospang_state, empty_init, ROT0, "Oksan / F2 System", "Heuk Sun Baek Sa (Korea)", MACHINE_SUPPORTS_SAVE )
+GAME( 1998, bestri, 0, bestri, bestri, crospang_state, empty_init, ROT0, "F2 System", "Bestri (Korea, set 1)", MACHINE_SUPPORTS_SAVE )
+GAME( 1998, bestria, bestri, bestria, bestri, crospang_state, empty_init, ROT0, "F2 System", "Bestri (Korea, set 2)", MACHINE_SUPPORTS_SAVE )
+GAME( 1997, pitapat, 0, pitapat, pitapat, crospang_state, empty_init, ROT0, "F2 System", "Pitapat Puzzle", MACHINE_SUPPORTS_SAVE ) // Test Mode calls it 'Puzzle Ball'
diff --git a/src/mame/drivers/crvision.cpp b/src/mame/drivers/crvision.cpp
index 172241241ee..081d886b9fb 100644
--- a/src/mame/drivers/crvision.cpp
+++ b/src/mame/drivers/crvision.cpp
@@ -146,10 +146,8 @@ void crvision_state::crvision_map(address_map &map)
{
map(0x0000, 0x03ff).mirror(0x0c00).ram();
map(0x1000, 0x1003).mirror(0x0ffc).rw(m_pia, FUNC(pia6821_device::read), FUNC(pia6821_device::write));
- map(0x2000, 0x2000).mirror(0x0ffe).r(TMS9929_TAG, FUNC(tms9928a_device::vram_r));
- map(0x2001, 0x2001).mirror(0x0ffe).r(TMS9929_TAG, FUNC(tms9928a_device::register_r));
- map(0x3000, 0x3000).mirror(0x0ffe).w(TMS9929_TAG, FUNC(tms9928a_device::vram_w));
- map(0x3001, 0x3001).mirror(0x0ffe).w(TMS9929_TAG, FUNC(tms9928a_device::register_w));
+ map(0x2000, 0x2001).mirror(0x0ffe).r(TMS9929_TAG, FUNC(tms9928a_device::read));
+ map(0x3000, 0x3001).mirror(0x0ffe).w(TMS9929_TAG, FUNC(tms9928a_device::write));
map(0x4000, 0x7fff).bankr(BANK_ROM2);
map(0x8000, 0xbfff).bankr(BANK_ROM1);
// AM_RANGE(0xc000, 0xe7ff) AM_RAMBANK(3)
@@ -168,10 +166,8 @@ void laser2001_state::lasr2001_map(address_map &map)
{
map(0x0000, 0x03ff).mirror(0x0c00).ram();
map(0x1000, 0x1003).mirror(0x0ffc).rw(m_pia, FUNC(pia6821_device::read), FUNC(pia6821_device::write));
- map(0x2000, 0x2000).mirror(0x0ffe).r(TMS9929_TAG, FUNC(tms9928a_device::vram_r));
- map(0x2001, 0x2001).mirror(0x0ffe).r(TMS9929_TAG, FUNC(tms9928a_device::register_r));
- map(0x3000, 0x3000).mirror(0x0ffe).w(TMS9929_TAG, FUNC(tms9928a_device::vram_w));
- map(0x3001, 0x3001).mirror(0x0ffe).w(TMS9929_TAG, FUNC(tms9928a_device::register_w));
+ map(0x2000, 0x2001).mirror(0x0ffe).r(TMS9929_TAG, FUNC(tms9928a_device::read));
+ map(0x3000, 0x3001).mirror(0x0ffe).w(TMS9929_TAG, FUNC(tms9928a_device::write));
map(0x4000, 0x7fff).bankrw(BANK_ROM2);
map(0x8000, 0xbfff).bankrw(BANK_ROM1);
map(0xc000, 0xffff).rom().region(M6502_TAG, 0);
@@ -748,7 +744,7 @@ void crvision_state::creativision(machine_config &config)
m_pia->readpa_handler().set(FUNC(crvision_state::pia_pa_r));
m_pia->readpb_handler().set(FUNC(crvision_state::pia_pb_r));
m_pia->writepa_handler().set(FUNC(crvision_state::pia_pa_w));
- m_pia->writepb_handler().set(SN76489_TAG, FUNC(sn76496_base_device::command_w));
+ m_pia->writepb_handler().set(SN76489_TAG, FUNC(sn76496_base_device::write));
CASSETTE(config, m_cassette);
m_cassette->set_default_state((cassette_state)(CASSETTE_STOPPED | CASSETTE_MOTOR_DISABLED | CASSETTE_SPEAKER_ENABLED));
@@ -784,7 +780,7 @@ void crvision_state::creativision(machine_config &config)
}
/*-------------------------------------------------
- MACHINE_CONFIG_START( ntsc )
+ machine_config( ntsc )
-------------------------------------------------*/
void crvision_state::ntsc(machine_config &config)
@@ -799,7 +795,7 @@ void crvision_state::ntsc(machine_config &config)
}
/*-------------------------------------------------
- MACHINE_CONFIG_START( pal )
+ machine_config( pal )
-------------------------------------------------*/
void crvision_pal_state::pal(machine_config &config)
@@ -814,7 +810,7 @@ void crvision_pal_state::pal(machine_config &config)
}
/*-------------------------------------------------
- MACHINE_CONFIG_START( lasr2001 )
+ machine_config( lasr2001 )
-------------------------------------------------*/
void laser2001_state::lasr2001(machine_config &config)
diff --git a/src/mame/drivers/csplayh5.cpp b/src/mame/drivers/csplayh5.cpp
index 6ac1e75b7ec..bca9301e1ca 100644
--- a/src/mame/drivers/csplayh5.cpp
+++ b/src/mame/drivers/csplayh5.cpp
@@ -49,14 +49,12 @@ public:
csplayh5_state(const machine_config &mconfig, device_type type, const char *tag)
: driver_device(mconfig, type, tag),
m_maincpu(*this, "maincpu"),
- m_tmp68301(*this, "tmp68301"),
m_nichisnd(*this, "nichisnd"),
m_key(*this, "KEY.%u", 0),
m_region_maincpu(*this, "maincpu")
{ }
- required_device<cpu_device> m_maincpu;
- required_device<tmp68301_device> m_tmp68301;
+ required_device<tmp68301_device> m_maincpu;
required_device<nichisnd_device> m_nichisnd;
required_ioport_array<5> m_key;
required_memory_region m_region_maincpu;
@@ -142,8 +140,6 @@ void csplayh5_state::csplayh5_map(address_map &map)
map(0x800000, 0xbfffff).rom().region("blit_gfx", 0); // GFX ROM routes here
map(0xc00000, 0xc7ffff).ram().share("nvram").mirror(0x380000); // work RAM
-
- map(0xfffc00, 0xffffff).rw(m_tmp68301, FUNC(tmp68301_device::regs_r), FUNC(tmp68301_device::regs_w)); // TMP68301 Registers
}
#if USE_H8
@@ -330,7 +326,7 @@ TIMER_DEVICE_CALLBACK_MEMBER(csplayh5_state::csplayh5_irq)
int scanline = param;
if(scanline == 212*2)
- m_tmp68301->external_interrupt_0();
+ m_maincpu->external_interrupt_0();
}
WRITE_LINE_MEMBER(csplayh5_state::csplayh5_vdp0_interrupt)
@@ -361,16 +357,12 @@ WRITE16_MEMBER(csplayh5_state::tmp68301_parallel_port_w)
void csplayh5_state::csplayh5(machine_config &config)
{
/* basic machine hardware */
- M68000(config, m_maincpu, 16000000); /* TMP68301-16 */
+ TMP68301(config, m_maincpu, 16000000); /* TMP68301-16 */
m_maincpu->set_addrmap(AS_PROGRAM, &csplayh5_state::csplayh5_map);
- m_maincpu->set_irq_acknowledge_callback("tmp68301", FUNC(tmp68301_device::irq_callback));
+ m_maincpu->out_parallel_callback().set(FUNC(csplayh5_state::tmp68301_parallel_port_w));
TIMER(config, "scantimer", 0).configure_scanline(timer_device::expired_delegate(FUNC(csplayh5_state::csplayh5_irq), this), "screen", 0, 1);
- TMP68301(config, m_tmp68301, 0);
- m_tmp68301->set_cputag(m_maincpu);
- m_tmp68301->out_parallel_callback().set(FUNC(csplayh5_state::tmp68301_parallel_port_w));
-
#if USE_H8
h830002_device &subcpu(H83002(config, "subcpu", DVD_CLOCK/2)); /* unknown divider */
subcpu.set_addrmap(AS_PROGRAM, &csplayh5_state::csplayh5_sub_map);
diff --git a/src/mame/drivers/cswat.cpp b/src/mame/drivers/cswat.cpp
index 2c281e6a6e7..7052a3b98d3 100644
--- a/src/mame/drivers/cswat.cpp
+++ b/src/mame/drivers/cswat.cpp
@@ -257,30 +257,29 @@ void cswat_state::machine_start()
save_item(NAME(m_nmi_enabled));
}
-MACHINE_CONFIG_START(cswat_state::cswat)
-
+void cswat_state::cswat(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", MC6809E, XTAL(18'432'000)/3/4) // HD68A09EP, 1.5MHz?
- MCFG_DEVICE_PROGRAM_MAP(cswat_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", cswat_state, irq0_line_assert)
- MCFG_DEVICE_PERIODIC_INT_DRIVER(cswat_state, nmi_handler, 300) // ?
+ MC6809E(config, m_maincpu, XTAL(18'432'000)/3/4); // HD68A09EP, 1.5MHz?
+ m_maincpu->set_addrmap(AS_PROGRAM, &cswat_state::cswat_map);
+ m_maincpu->set_vblank_int("screen", FUNC(cswat_state::irq0_line_assert));
+ m_maincpu->set_periodic_int(FUNC(cswat_state::nmi_handler), attotime::from_hz(300)); // ?
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500))
- MCFG_SCREEN_SIZE(36*8, 28*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 36*8-1, 0*8, 28*8-1)
- MCFG_SCREEN_PALETTE("palette")
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500));
+ screen.set_size(36*8, 28*8);
+ screen.set_visarea_full();
+ screen.set_palette("palette");
+ screen.set_screen_update(FUNC(cswat_state::screen_update_cswat));
- MCFG_SCREEN_UPDATE_DRIVER(cswat_state, screen_update_cswat)
-
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_cswat)
- MCFG_PALETTE_ADD("palette", 4*256)
+ GFXDECODE(config, "gfxdecode", "palette", gfx_cswat);
+ PALETTE(config, "palette").set_entries(4*256);
/* sound hardware */
// TODO
-MACHINE_CONFIG_END
+}
/***************************************************************************
diff --git a/src/mame/drivers/ct486.cpp b/src/mame/drivers/ct486.cpp
index cc4dbe25081..0cd1035ad38 100644
--- a/src/mame/drivers/ct486.cpp
+++ b/src/mame/drivers/ct486.cpp
@@ -110,11 +110,12 @@ void ct486_state::ct486_io(address_map &map)
// MACHINE DRIVERS
//**************************************************************************
-MACHINE_CONFIG_START(ct486_state::ct486)
- MCFG_DEVICE_ADD("maincpu", I486, XTAL(25'000'000))
- MCFG_DEVICE_PROGRAM_MAP(ct486_map)
- MCFG_DEVICE_IO_MAP(ct486_io)
- MCFG_DEVICE_IRQ_ACKNOWLEDGE_DEVICE("cs4031", cs4031_device, int_ack_r)
+void ct486_state::ct486(machine_config &config)
+{
+ I486(config, m_maincpu, XTAL(25'000'000));
+ m_maincpu->set_addrmap(AS_PROGRAM, &ct486_state::ct486_map);
+ m_maincpu->set_addrmap(AS_IO, &ct486_state::ct486_io);
+ m_maincpu->set_irq_acknowledge_callback("cs4031", FUNC(cs4031_device::int_ack_r));
CS4031(config, m_cs4031, XTAL(25'000'000), "maincpu", "isa", "bios", "keybc");
// cpu connections
@@ -139,13 +140,14 @@ MACHINE_CONFIG_START(ct486_state::ct486)
keybc.kbd_clk().set("pc_kbdc", FUNC(pc_kbdc_device::clock_write_from_mb));
keybc.kbd_data().set("pc_kbdc", FUNC(pc_kbdc_device::data_write_from_mb));
- MCFG_DEVICE_ADD("pc_kbdc", PC_KBDC, 0)
- MCFG_PC_KBDC_OUT_CLOCK_CB(WRITELINE("keybc", at_kbc_device_base, kbd_clk_w))
- MCFG_PC_KBDC_OUT_DATA_CB(WRITELINE("keybc", at_kbc_device_base, kbd_data_w))
- MCFG_PC_KBDC_SLOT_ADD("pc_kbdc", "kbd", pc_at_keyboards, STR_KBD_MICROSOFT_NATURAL)
+ pc_kbdc_device &pc_kbdc(PC_KBDC(config, "pc_kbdc", 0));
+ pc_kbdc.out_clock_cb().set(keybc, FUNC(at_kbc_device_base::kbd_clk_w));
+ pc_kbdc.out_data_cb().set(keybc, FUNC(at_kbc_device_base::kbd_data_w));
+ PC_KBDC_SLOT(config, "kbd", pc_at_keyboards, STR_KBD_MICROSOFT_NATURAL).set_pc_kbdc_slot(&pc_kbdc);
ISA16(config, m_isabus, 0);
- m_isabus->set_cputag("maincpu");
+ m_isabus->set_memspace(m_maincpu, AS_PROGRAM);
+ m_isabus->set_iospace(m_maincpu, AS_IO);
m_isabus->iochck_callback().set(m_cs4031, FUNC(cs4031_device::iochck_w));
m_isabus->irq2_callback().set(m_cs4031, FUNC(cs4031_device::irq09_w));
m_isabus->irq3_callback().set(m_cs4031, FUNC(cs4031_device::irq03_w));
@@ -165,29 +167,28 @@ MACHINE_CONFIG_START(ct486_state::ct486)
m_isabus->drq5_callback().set(m_cs4031, FUNC(cs4031_device::dreq5_w));
m_isabus->drq6_callback().set(m_cs4031, FUNC(cs4031_device::dreq6_w));
m_isabus->drq7_callback().set(m_cs4031, FUNC(cs4031_device::dreq7_w));
- MCFG_DEVICE_ADD("board1", ISA16_SLOT, 0, "isabus", pc_isa16_cards, "fdcsmc", true)
- MCFG_DEVICE_ADD("board2", ISA16_SLOT, 0, "isabus", pc_isa16_cards, "comat", true)
- MCFG_DEVICE_ADD("board3", ISA16_SLOT, 0, "isabus", pc_isa16_cards, "ide", true)
- MCFG_DEVICE_ADD("board4", ISA16_SLOT, 0, "isabus", pc_isa16_cards, "lpt", true)
- MCFG_DEVICE_ADD("isa1", ISA16_SLOT, 0, "isabus", pc_isa16_cards, "svga_et4k", false)
- MCFG_DEVICE_ADD("isa2", ISA16_SLOT, 0, "isabus", pc_isa16_cards, nullptr, false)
- MCFG_DEVICE_ADD("isa3", ISA16_SLOT, 0, "isabus", pc_isa16_cards, nullptr, false)
- MCFG_DEVICE_ADD("isa4", ISA16_SLOT, 0, "isabus", pc_isa16_cards, nullptr, false)
- MCFG_DEVICE_ADD("isa5", ISA16_SLOT, 0, "isabus", pc_isa16_cards, nullptr, false)
+ ISA16_SLOT(config, "board1", 0, "isabus", pc_isa16_cards, "fdcsmc", true);
+ ISA16_SLOT(config, "board2", 0, "isabus", pc_isa16_cards, "comat", true);
+ ISA16_SLOT(config, "board3", 0, "isabus", pc_isa16_cards, "ide", true);
+ ISA16_SLOT(config, "board4", 0, "isabus", pc_isa16_cards, "lpt", true);
+ ISA16_SLOT(config, "isa1", 0, "isabus", pc_isa16_cards, "svga_et4k", false);
+ ISA16_SLOT(config, "isa2", 0, "isabus", pc_isa16_cards, nullptr, false);
+ ISA16_SLOT(config, "isa3", 0, "isabus", pc_isa16_cards, nullptr, false);
+ ISA16_SLOT(config, "isa4", 0, "isabus", pc_isa16_cards, nullptr, false);
+ ISA16_SLOT(config, "isa5", 0, "isabus", pc_isa16_cards, nullptr, false);
// sound hardware
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("speaker", SPEAKER_SOUND)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.50)
+ SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.50);
// video hardware
- MCFG_PALETTE_ADD("palette", 256) // todo: really needed?
+ PALETTE(config, "palette").set_entries(256); // todo: really needed?
/* software lists */
- MCFG_SOFTWARE_LIST_ADD("pc_disk_list","ibm5150")
- MCFG_SOFTWARE_LIST_ADD("at_disk_list","ibm5170")
- MCFG_SOFTWARE_LIST_ADD("at_cdrom_list","ibm5170_cdrom")
-MACHINE_CONFIG_END
+ SOFTWARE_LIST(config, "pc_disk_list").set_original("ibm5150");
+ SOFTWARE_LIST(config, "at_disk_list").set_original("ibm5170");
+ SOFTWARE_LIST(config, "at_cdrom_list").set_original("ibm5170_cdrom");
+}
//**************************************************************************
diff --git a/src/mame/drivers/cubeqst.cpp b/src/mame/drivers/cubeqst.cpp
index 03a089fcbc9..247d30ad1d2 100644
--- a/src/mame/drivers/cubeqst.cpp
+++ b/src/mame/drivers/cubeqst.cpp
@@ -574,7 +574,6 @@ void cubeqst_state::cubeqst(machine_config &config)
AD7521(config, m_dacs[i*2+1], 0).add_route(0, "lspeaker", 0.125);
}
voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref", 0));
- vref.set_output(5.0);
vref.add_route(0, "rdac0", 1.0, DAC_VREF_POS_INPUT); vref.add_route(0, "rdac0", -1.0, DAC_VREF_NEG_INPUT);
vref.add_route(0, "ldac0", 1.0, DAC_VREF_POS_INPUT); vref.add_route(0, "ldac0", -1.0, DAC_VREF_NEG_INPUT);
vref.add_route(0, "rdac1", 1.0, DAC_VREF_POS_INPUT); vref.add_route(0, "rdac1", -1.0, DAC_VREF_NEG_INPUT);
diff --git a/src/mame/drivers/cubo.cpp b/src/mame/drivers/cubo.cpp
index 2eafaa32783..4d2df329d95 100644
--- a/src/mame/drivers/cubo.cpp
+++ b/src/mame/drivers/cubo.cpp
@@ -411,7 +411,7 @@ WRITE8_MEMBER( cubo_state::akiko_cia_0_port_a_write )
/* bit 1 = Power Led on Amiga */
m_power_led = BIT(~data, 1);
- handle_joystick_cia(data, m_cia_0->read(space, 2));
+ handle_joystick_cia(data, m_cia_0->read(2));
}
@@ -1030,11 +1030,11 @@ static INPUT_PORTS_START( mgprem11 )
INPUT_PORTS_END
-MACHINE_CONFIG_START(cubo_state::cubo)
-
+void cubo_state::cubo(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M68EC020, amiga_state::CLK_28M_PAL / 2)
- MCFG_DEVICE_PROGRAM_MAP(cubo_mem)
+ M68EC020(config, m_maincpu, amiga_state::CLK_28M_PAL / 2);
+ m_maincpu->set_addrmap(AS_PROGRAM, &cubo_state::cubo_mem);
ADDRESS_MAP_BANK(config, "overlay").set_map(&amiga_state::overlay_2mb_map32).set_options(ENDIANNESS_BIG, 32, 22, 0x200000);
@@ -1050,9 +1050,8 @@ MACHINE_CONFIG_START(cubo_state::cubo)
// video hardware
pal_video(config);
- MCFG_DEVICE_MODIFY("screen")
- MCFG_SCREEN_UPDATE_DRIVER(amiga_state, screen_update_amiga_aga)
- MCFG_SCREEN_NO_PALETTE
+ m_screen->set_screen_update(FUNC(amiga_state::screen_update_amiga_aga));
+ m_screen->set_palette(finder_base::DUMMY_TAG);
MCFG_VIDEO_START_OVERRIDE(amiga_state, amiga_aga)
@@ -1068,23 +1067,23 @@ MACHINE_CONFIG_START(cubo_state::cubo)
paula.mem_read_cb().set(FUNC(amiga_state::chip_ram_r));
paula.int_cb().set(FUNC(amiga_state::paula_int_w));
- MCFG_DEVICE_ADD("cdda", CDDA)
- MCFG_SOUND_ROUTE(0, "lspeaker", 0.50)
- MCFG_SOUND_ROUTE(1, "rspeaker", 0.50)
+ CDDA(config, m_cdda);
+ m_cdda->add_route(0, "lspeaker", 0.50);
+ m_cdda->add_route(1, "rspeaker", 0.50);
/* cia */
// these are setup differently on other amiga drivers (needed for floppy to work) which is correct / why?
- MCFG_DEVICE_ADD("cia_0", MOS8520, amiga_state::CLK_E_PAL)
- MCFG_MOS6526_IRQ_CALLBACK(WRITELINE(*this, amiga_state, cia_0_irq))
- MCFG_MOS6526_PA_INPUT_CALLBACK(IOPORT("CIA0PORTA"))
- MCFG_MOS6526_PA_OUTPUT_CALLBACK(WRITE8(*this, cubo_state, akiko_cia_0_port_a_write))
- MCFG_DEVICE_ADD("cia_1", MOS8520, amiga_state::CLK_E_PAL)
- MCFG_MOS6526_IRQ_CALLBACK(WRITELINE(*this, amiga_state, cia_1_irq))
+ MOS8520(config, m_cia_0, amiga_state::CLK_E_PAL);
+ m_cia_0->irq_wr_callback().set(FUNC(amiga_state::cia_0_irq));
+ m_cia_0->pa_rd_callback().set_ioport("CIA0PORTA");
+ m_cia_0->pa_wr_callback().set(FUNC(cubo_state::akiko_cia_0_port_a_write));
- MCFG_MICROTOUCH_ADD("microtouch", 9600, WRITELINE(*this, cubo_state, rs232_rx_w))
+ MOS8520(config, m_cia_1, amiga_state::CLK_E_PAL);
+ m_cia_1->irq_wr_callback().set(FUNC(amiga_state::cia_1_irq));
- MCFG_CDROM_ADD("cd32_cdrom")
- MCFG_CDROM_INTERFACE("cd32_cdrom")
+ MICROTOUCH(config, m_microtouch, 9600).stx().set(FUNC(cubo_state::rs232_rx_w));
+
+ CDROM(config, "cd32_cdrom").set_interface("cd32_cdrom");
/* fdc */
AMIGA_FDC(config, m_fdc, amiga_state::CLK_7M_PAL);
@@ -1093,7 +1092,7 @@ MACHINE_CONFIG_START(cubo_state::cubo)
m_fdc->write_dma_callback().set(FUNC(amiga_state::chip_ram_w));
m_fdc->dskblk_callback().set(FUNC(amiga_state::fdc_dskblk_w));
m_fdc->dsksyn_callback().set(FUNC(amiga_state::fdc_dsksyn_w));
-MACHINE_CONFIG_END
+}
diff --git a/src/mame/drivers/cultures.cpp b/src/mame/drivers/cultures.cpp
index dcf6c5e9dee..51acf0d401b 100644
--- a/src/mame/drivers/cultures.cpp
+++ b/src/mame/drivers/cultures.cpp
@@ -405,35 +405,33 @@ void cultures_state::machine_reset()
MACHINE_CONFIG_START(cultures_state::cultures)
-
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, MCLK/2) /* 8.000 MHz */
- MCFG_DEVICE_PROGRAM_MAP(cultures_map)
- MCFG_DEVICE_IO_MAP(cultures_io_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", cultures_state, cultures_interrupt)
+ Z80(config, m_maincpu, MCLK/2); /* 8.000 MHz */
+ m_maincpu->set_addrmap(AS_PROGRAM, &cultures_state::cultures_map);
+ m_maincpu->set_addrmap(AS_IO, &cultures_state::cultures_io_map);
+ m_maincpu->set_vblank_int("screen", FUNC(cultures_state::cultures_interrupt));
ADDRESS_MAP_BANK(config, "vrambank").set_map(&cultures_state::vrambank_map).set_options(ENDIANNESS_LITTLE, 8, 15, 0x4000);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(64*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 48*8-1, 0*8, 30*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(cultures_state, screen_update_cultures)
- MCFG_SCREEN_PALETTE("palette")
-
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_cultures)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(64*8, 32*8);
+ screen.set_visarea(0*8, 48*8-1, 0*8, 30*8-1);
+ screen.set_screen_update(FUNC(cultures_state::screen_update_cultures));
+ screen.set_palette("palette");
+
+ GFXDECODE(config, m_gfxdecode, "palette", gfx_cultures);
MCFG_PALETTE_ADD("palette", 0x3000/2)
MCFG_PALETTE_FORMAT(xRGBRRRRGGGGBBBB_bit0)
/* sound hardware */
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("oki", OKIM6295, MCLK/8, okim6295_device::PIN7_HIGH) // clock frequency & pin 7 not verified
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.30)
- MCFG_DEVICE_ADDRESS_MAP(0, oki_map)
-
+ okim6295_device &oki(OKIM6295(config, "oki", MCLK/8, okim6295_device::PIN7_HIGH)); // clock frequency & pin 7 not verified
+ oki.add_route(ALL_OUTPUTS, "mono", 0.30);
+ oki.set_addrmap(0, &cultures_state::oki_map);
MACHINE_CONFIG_END
/*
diff --git a/src/mame/drivers/cupidon.cpp b/src/mame/drivers/cupidon.cpp
index 96cdaf46259..d6c776f615b 100644
--- a/src/mame/drivers/cupidon.cpp
+++ b/src/mame/drivers/cupidon.cpp
@@ -103,24 +103,25 @@ static INPUT_PORTS_START( cupidon )
INPUT_PORTS_END
-MACHINE_CONFIG_START(cupidon_state::cupidon)
+void cupidon_state::cupidon(machine_config &config)
+{
M68340(config, m_maincpu, 16000000); // The access to 3FF00 at the start would suggest this is a 68340 so probably 16 or 25 mhz?
m_maincpu->set_addrmap(AS_PROGRAM, &cupidon_state::cupidon_map);
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(64*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 64*8-1, 0*8, 32*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(cupidon_state, screen_update_cupidon)
- MCFG_SCREEN_PALETTE("palette")
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(64*8, 32*8);
+ screen.set_visarea(0*8, 64*8-1, 0*8, 32*8-1);
+ screen.set_screen_update(FUNC(cupidon_state::screen_update_cupidon));
+ screen.set_palette("palette");
- MCFG_PALETTE_ADD("palette", 0x10000)
+ PALETTE(config, "palette").set_entries(0x10000);
SPEAKER(config, "lspeaker").front_left();
SPEAKER(config, "rspeaker").front_right();
/* unknown sound, probably DAC driven using 68340 DMA */
-MACHINE_CONFIG_END
+}
diff --git a/src/mame/drivers/cvicny.cpp b/src/mame/drivers/cvicny.cpp
index 12a03f7ee71..7d5dca51587 100644
--- a/src/mame/drivers/cvicny.cpp
+++ b/src/mame/drivers/cvicny.cpp
@@ -135,14 +135,15 @@ static INPUT_PORTS_START( cvicny )
INPUT_PORTS_END
-MACHINE_CONFIG_START(cvicny_state::cvicny)
+void cvicny_state::cvicny(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu",Z80, XTAL(2'000'000))
- MCFG_DEVICE_PROGRAM_MAP(cvicny_mem)
+ Z80(config, m_maincpu, XTAL(2'000'000));
+ m_maincpu->set_addrmap(AS_PROGRAM, &cvicny_state::cvicny_mem);
/* video hardware */
config.set_default_layout(layout_cvicny);
-MACHINE_CONFIG_END
+}
/* ROM definition */
ROM_START( cvicny )
diff --git a/src/mame/drivers/cvs.cpp b/src/mame/drivers/cvs.cpp
index ed4b04ca199..66c87ae485f 100644
--- a/src/mame/drivers/cvs.cpp
+++ b/src/mame/drivers/cvs.cpp
@@ -1019,7 +1019,6 @@ void cvs_state::cvs(machine_config &config)
DAC_4BIT_R2R(config, m_dac2, 0).add_route(ALL_OUTPUTS, "speaker", 0.5); // unknown DAC
DAC_1BIT(config, m_dac3, 0).add_route(ALL_OUTPUTS, "speaker", 0.99);
voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref", 0));
- vref.set_output(5.0);
vref.add_route(0, "dac1", 1.0, DAC_VREF_POS_INPUT);
vref.add_route(0, "dac1", -1.0, DAC_VREF_NEG_INPUT);
vref.add_route(0, "dac2", 1.0, DAC_VREF_POS_INPUT);
diff --git a/src/mame/drivers/cxg_ch2001.cpp b/src/mame/drivers/cxg_ch2001.cpp
new file mode 100644
index 00000000000..047f0112143
--- /dev/null
+++ b/src/mame/drivers/cxg_ch2001.cpp
@@ -0,0 +1,193 @@
+// license:BSD-3-Clause
+// copyright-holders:hap
+// thanks-to:Berger
+/******************************************************************************
+*
+* cxg_ch2001.cpp, subdriver of machine/chessbase.cpp
+
+*******************************************************************************
+
+CXG Chess 2001 overview:
+- Zilog Z8400APS @ 4 MHz (8MHz XTAL)
+- 2KB RAM HM6116, 16KB ROM D27128D
+- TTL, piezo, 8*8+9 LEDs, magnetic sensors
+
+******************************************************************************/
+
+#include "emu.h"
+#include "includes/chessbase.h"
+
+#include "cpu/z80/z80.h"
+#include "sound/dac.h"
+#include "sound/volt_reg.h"
+#include "speaker.h"
+
+// internal artwork
+#include "cxg_ch2001.lh" // clickable
+
+
+namespace {
+
+class ch2001_state : public chessbase_state
+{
+public:
+ ch2001_state(const machine_config &mconfig, device_type type, const char *tag) :
+ chessbase_state(mconfig, type, tag),
+ m_maincpu(*this, "maincpu"),
+ m_irq_on(*this, "irq_on"),
+ m_dac(*this, "dac"),
+ m_speaker_off(*this, "speaker_off")
+ { }
+
+ // machine drivers
+ void ch2001(machine_config &config);
+
+private:
+ // devices/pointers
+ required_device<cpu_device> m_maincpu;
+ required_device<timer_device> m_irq_on;
+ required_device<dac_bit_interface> m_dac;
+ required_device<timer_device> m_speaker_off;
+
+ // periodic interrupts
+ template<int Line> TIMER_DEVICE_CALLBACK_MEMBER(irq_on) { m_maincpu->set_input_line(Line, ASSERT_LINE); }
+ template<int Line> TIMER_DEVICE_CALLBACK_MEMBER(irq_off) { m_maincpu->set_input_line(Line, CLEAR_LINE); }
+
+ TIMER_DEVICE_CALLBACK_MEMBER(speaker_off) { m_dac->write(0); }
+
+ // address maps
+ void main_map(address_map &map);
+
+ // I/O handlers
+ DECLARE_WRITE8_MEMBER(speaker_w);
+ DECLARE_WRITE8_MEMBER(leds_w);
+ DECLARE_READ8_MEMBER(input_r);
+};
+
+
+
+/******************************************************************************
+ Devices, I/O
+******************************************************************************/
+
+// TTL
+
+WRITE8_MEMBER(ch2001_state::speaker_w)
+{
+ // 74ls109 clock pulse to speaker
+ m_dac->write(1);
+ m_speaker_off->adjust(attotime::from_usec(200)); // not accurate
+}
+
+WRITE8_MEMBER(ch2001_state::leds_w)
+{
+ // d0-d7: 74ls273 (WR to CLK)
+ // 74ls273 Q1-Q4: 74ls145 A-D
+ // 74ls145 0-9: input mux/led select
+ m_inp_mux = 1 << (data & 0xf) & 0x3ff;
+
+ // 74ls273 Q5-Q8: MC14028 A-D
+ // MC14028 Q0-Q7: led data, Q8,Q9: N/C
+ u8 led_data = 1 << (data >> 4 & 0xf) & 0xff;
+ display_matrix(8, 10, led_data, m_inp_mux);
+}
+
+READ8_MEMBER(ch2001_state::input_r)
+{
+ // d0-d7: multiplexed inputs
+ return ~read_inputs(10);
+}
+
+
+
+/******************************************************************************
+ Address Maps
+******************************************************************************/
+
+void ch2001_state::main_map(address_map &map)
+{
+ map(0x0000, 0x3fff).rom();
+ map(0x4000, 0x47ff).mirror(0x3800).ram();
+ map(0x8000, 0x8000).mirror(0x3fff).rw(FUNC(ch2001_state::input_r), FUNC(ch2001_state::leds_w));
+ map(0xc000, 0xc000).mirror(0x3fff).w(FUNC(ch2001_state::speaker_w));
+}
+
+
+
+/******************************************************************************
+ Input Ports
+******************************************************************************/
+
+static INPUT_PORTS_START( ch2001 )
+ PORT_INCLUDE( generic_cb_magnets )
+
+ PORT_START("IN.8")
+ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_T) PORT_NAME("Black")
+ PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_2) PORT_NAME("King")
+ PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_3) PORT_NAME("Queen")
+ PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_4) PORT_NAME("Rook")
+ PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_W) PORT_NAME("Bishop")
+ PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_E) PORT_NAME("Knight")
+ PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_R) PORT_NAME("Pawn")
+ PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_5) PORT_NAME("White")
+
+ PORT_START("IN.9")
+ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_1) PORT_NAME("Set up")
+ PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_Q) PORT_NAME("New Game")
+ PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_U) PORT_NAME("Take Back")
+ PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_Y) PORT_NAME("Forward")
+ PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_6) PORT_NAME("Hint")
+ PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_I) PORT_NAME("Move")
+ PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_8) PORT_NAME("Level")
+ PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_7) PORT_NAME("Sound")
+INPUT_PORTS_END
+
+
+
+/******************************************************************************
+ Machine Drivers
+******************************************************************************/
+
+void ch2001_state::ch2001(machine_config &config)
+{
+ /* basic machine hardware */
+ Z80(config, m_maincpu, 8_MHz_XTAL/2);
+ m_maincpu->set_addrmap(AS_PROGRAM, &ch2001_state::main_map);
+
+ const attotime irq_period = attotime::from_hz(484); // theoretical frequency from 555 timer (22nF, 100K+33K, 1K2), measurement was 568Hz
+ TIMER(config, m_irq_on).configure_periodic(FUNC(ch2001_state::irq_on<INPUT_LINE_IRQ0>), irq_period);
+ m_irq_on->set_start_delay(irq_period - attotime::from_nsec(18300)); // active for 18.3us
+ TIMER(config, "irq_off").configure_periodic(FUNC(ch2001_state::irq_off<INPUT_LINE_IRQ0>), irq_period);
+
+ TIMER(config, m_speaker_off).configure_generic(FUNC(ch2001_state::speaker_off));
+
+ TIMER(config, "display_decay").configure_periodic(FUNC(ch2001_state::display_decay_tick), attotime::from_msec(1));
+ config.set_default_layout(layout_cxg_ch2001);
+
+ /* sound hardware */
+ SPEAKER(config, "speaker").front_center();
+ DAC_1BIT(config, m_dac).add_route(ALL_OUTPUTS, "speaker", 0.25);
+ VOLTAGE_REGULATOR(config, "vref").add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT);
+}
+
+
+
+/******************************************************************************
+ ROM Definitions
+******************************************************************************/
+
+ROM_START( ch2001 )
+ ROM_REGION( 0x10000, "maincpu", 0 )
+ ROM_LOAD("ch2001.bin", 0x0000, 0x4000, CRC(b3485c73) SHA1(f405c6f67fe70edf45dcc383a4049ee6bad387a9) ) // D27128D, no label
+ROM_END
+
+} // anonymous namespace
+
+
+
+/******************************************************************************
+ Drivers
+******************************************************************************/
+
+/* YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS */
+CONS( 1984, ch2001, 0, 0, ch2001, ch2001, ch2001_state, empty_init, "CXG", "Chess 2001", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
diff --git a/src/mame/drivers/cxgz80.cpp b/src/mame/drivers/cxgz80.cpp
deleted file mode 100644
index 32552430251..00000000000
--- a/src/mame/drivers/cxgz80.cpp
+++ /dev/null
@@ -1,437 +0,0 @@
-// license:BSD-3-Clause
-// copyright-holders:hap
-// thanks-to:Berger
-/******************************************************************************
-
- CXG* generic Z80 based chess computer driver
- *later known as CXG Newcrest Technology Ltd.
-
- NOTE: MAME doesn't include a generalized implementation for boardpieces yet,
- greatly affecting user playability of emulated electronic board games.
- As workaround for the chess games, use an external chess GUI on the side,
- such as Arena(in editmode).
-
- TODO:
- - nothing
-
-******************************************************************************
-
-Chess 2001:
-- Zilog Z8400APS @ 4 MHz (8MHz XTAL)
-- 2KB RAM HM6116, 16KB ROM D27128D
-- TTL, piezo, 8*8+9 LEDs, magnetic sensors
-
-******************************************************************************/
-
-#include "emu.h"
-#include "cpu/z80/z80.h"
-#include "machine/timer.h"
-#include "sound/dac.h"
-#include "sound/volt_reg.h"
-#include "speaker.h"
-
-// internal artwork
-#include "cxg_ch2001.lh" // clickable
-
-
-class cxgz80_state : public driver_device
-{
-public:
- cxgz80_state(const machine_config &mconfig, device_type type, const char *tag)
- : driver_device(mconfig, type, tag),
- m_maincpu(*this, "maincpu"),
- m_dac(*this, "dac"),
- m_speaker_off_timer(*this, "speaker_off"),
- m_inp_matrix(*this, "IN.%u", 0),
- m_out_x(*this, "%u.%u", 0U, 0U),
- m_out_a(*this, "%u.a", 0U),
- m_out_digit(*this, "digit%u", 0U),
- m_display_wait(33),
- m_display_maxy(1),
- m_display_maxx(0)
- { }
-
- // devices/pointers
- required_device<cpu_device> m_maincpu;
- required_device<dac_bit_interface> m_dac;
- required_device<timer_device> m_speaker_off_timer;
- optional_ioport_array<10> m_inp_matrix; // max 10
- output_finder<0x20, 0x20> m_out_x;
- output_finder<0x20> m_out_a;
- output_finder<0x20> m_out_digit;
-
- TIMER_DEVICE_CALLBACK_MEMBER(irq_on) { m_maincpu->set_input_line(INPUT_LINE_IRQ0, ASSERT_LINE); }
- TIMER_DEVICE_CALLBACK_MEMBER(irq_off) { m_maincpu->set_input_line(INPUT_LINE_IRQ0, CLEAR_LINE); }
-
- // misc common
- u16 m_inp_mux; // multiplexed keypad mask
- u16 m_led_select;
- u16 m_led_data;
-
- u16 read_inputs(int columns);
-
- // display common
- int m_display_wait; // led/lamp off-delay in milliseconds (default 33ms)
- int m_display_maxy; // display matrix number of rows
- int m_display_maxx; // display matrix number of columns (max 31 for now)
-
- u32 m_display_state[0x20]; // display matrix rows data (last bit is used for always-on)
- u16 m_display_segmask[0x20]; // if not 0, display matrix row is a digit, mask indicates connected segments
- u8 m_display_decay[0x20][0x20]; // (internal use)
-
- TIMER_DEVICE_CALLBACK_MEMBER(display_decay_tick);
- void display_update();
- void set_display_size(int maxx, int maxy);
- void display_matrix(int maxx, int maxy, u32 setx, u32 sety, bool update = true);
-
- // Chess 2001
- TIMER_DEVICE_CALLBACK_MEMBER(speaker_off_callback);
- DECLARE_WRITE8_MEMBER(ch2001_speaker_on_w);
- DECLARE_WRITE8_MEMBER(ch2001_leds_w);
- DECLARE_READ8_MEMBER(ch2001_input_r);
- void ch2001_map(address_map &map);
- void ch2001(machine_config &config);
-
-protected:
- virtual void machine_start() override;
- virtual void machine_reset() override;
-};
-
-
-// machine start/reset
-
-void cxgz80_state::machine_start()
-{
- // resolve handlers
- m_out_x.resolve();
- m_out_a.resolve();
- m_out_digit.resolve();
-
- // zerofill
- memset(m_display_state, 0, sizeof(m_display_state));
- memset(m_display_decay, 0, sizeof(m_display_decay));
- memset(m_display_segmask, 0, sizeof(m_display_segmask));
-
- m_inp_mux = 0;
- m_led_select = 0;
- m_led_data = 0;
-
- // register for savestates
- save_item(NAME(m_display_maxy));
- save_item(NAME(m_display_maxx));
- save_item(NAME(m_display_wait));
-
- save_item(NAME(m_display_state));
- save_item(NAME(m_display_decay));
- save_item(NAME(m_display_segmask));
-
- save_item(NAME(m_inp_mux));
- save_item(NAME(m_led_select));
- save_item(NAME(m_led_data));
-}
-
-void cxgz80_state::machine_reset()
-{
-}
-
-
-
-/***************************************************************************
-
- Helper Functions
-
-***************************************************************************/
-
-// The device may strobe the outputs very fast, it is unnoticeable to the user.
-// To prevent flickering here, we need to simulate a decay.
-
-void cxgz80_state::display_update()
-{
- for (int y = 0; y < m_display_maxy; y++)
- {
- u32 active_state = 0;
-
- for (int x = 0; x <= m_display_maxx; x++)
- {
- // turn on powered segments
- if (m_display_state[y] >> x & 1)
- m_display_decay[y][x] = m_display_wait;
-
- // determine active state
- u32 ds = (m_display_decay[y][x] != 0) ? 1 : 0;
- active_state |= (ds << x);
-
- // output to y.x, or y.a when always-on
- if (x != m_display_maxx)
- m_out_x[y][x] = ds;
- else
- m_out_a[y] = ds;
- }
-
- // output to digity
- if (m_display_segmask[y] != 0)
- m_out_digit[y] = active_state & m_display_segmask[y];
- }
-}
-
-TIMER_DEVICE_CALLBACK_MEMBER(cxgz80_state::display_decay_tick)
-{
- // slowly turn off unpowered segments
- for (int y = 0; y < m_display_maxy; y++)
- for (int x = 0; x <= m_display_maxx; x++)
- if (m_display_decay[y][x] != 0)
- m_display_decay[y][x]--;
-
- display_update();
-}
-
-void cxgz80_state::set_display_size(int maxx, int maxy)
-{
- m_display_maxx = maxx;
- m_display_maxy = maxy;
-}
-
-void cxgz80_state::display_matrix(int maxx, int maxy, u32 setx, u32 sety, bool update)
-{
- set_display_size(maxx, maxy);
-
- // update current state
- u32 mask = (1 << maxx) - 1;
- for (int y = 0; y < maxy; y++)
- m_display_state[y] = (sety >> y & 1) ? ((setx & mask) | (1 << maxx)) : 0;
-
- if (update)
- display_update();
-}
-
-
-// generic input handlers
-
-u16 cxgz80_state::read_inputs(int columns)
-{
- u16 ret = 0;
-
- // read selected input rows
- for (int i = 0; i < columns; i++)
- if (m_inp_mux >> i & 1)
- ret |= m_inp_matrix[i]->read();
-
- return ret;
-}
-
-
-
-// Devices, I/O
-
-/******************************************************************************
- Chess 2001
-******************************************************************************/
-
-// TTL
-
-TIMER_DEVICE_CALLBACK_MEMBER(cxgz80_state::speaker_off_callback)
-{
- m_dac->write(0);
-}
-
-WRITE8_MEMBER(cxgz80_state::ch2001_speaker_on_w)
-{
- // 74ls109 clock pulse to speaker
- m_dac->write(1);
- m_speaker_off_timer->adjust(attotime::from_usec(200)); // not accurate
-}
-
-WRITE8_MEMBER(cxgz80_state::ch2001_leds_w)
-{
- // d0-d7: 74ls273 (WR to CLK)
- // 74ls273 Q1-Q4: 74ls145 A-D
- // 74ls145 0-9: input mux/led select
- m_inp_mux = 1 << (data & 0xf) & 0x3ff;
-
- // 74ls273 Q5-Q8: MC14028 A-D
- // MC14028 Q0-Q7: led data, Q8,Q9: N/C
- u8 led_data = 1 << (data >> 4 & 0xf) & 0xff;
- display_matrix(8, 10, led_data, m_inp_mux);
-}
-
-READ8_MEMBER(cxgz80_state::ch2001_input_r)
-{
- // d0-d7: multiplexed inputs
- return ~read_inputs(10);
-}
-
-
-
-/******************************************************************************
- Address Maps
-******************************************************************************/
-
-// Chess 2001
-
-void cxgz80_state::ch2001_map(address_map &map)
-{
- map(0x0000, 0x3fff).rom();
- map(0x4000, 0x47ff).mirror(0x3800).ram();
- map(0x8000, 0x8000).mirror(0x3fff).rw(FUNC(cxgz80_state::ch2001_input_r), FUNC(cxgz80_state::ch2001_leds_w));
- map(0xc000, 0xc000).mirror(0x3fff).w(FUNC(cxgz80_state::ch2001_speaker_on_w));
-}
-
-
-
-/******************************************************************************
- Input Ports
-******************************************************************************/
-
-static INPUT_PORTS_START( cb_magnets )
- PORT_START("IN.0")
- PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
- PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
- PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
- PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
- PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
- PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
- PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
- PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
-
- PORT_START("IN.1")
- PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
- PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
- PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
- PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
- PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
- PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
- PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
- PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
-
- PORT_START("IN.2")
- PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
- PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
- PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
- PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
- PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
- PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
- PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
- PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
-
- PORT_START("IN.3")
- PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
- PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
- PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
- PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
- PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
- PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
- PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
- PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
-
- PORT_START("IN.4")
- PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
- PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
- PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
- PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
- PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
- PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
- PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
- PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
-
- PORT_START("IN.5")
- PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
- PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
- PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
- PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
- PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
- PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
- PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
- PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
-
- PORT_START("IN.6")
- PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
- PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
- PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
- PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
- PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
- PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
- PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
- PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
-
- PORT_START("IN.7")
- PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
- PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
- PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
- PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
- PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
- PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
- PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
- PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
-INPUT_PORTS_END
-
-
-static INPUT_PORTS_START( ch2001 )
- PORT_INCLUDE( cb_magnets )
-
- PORT_START("IN.8")
- PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_T) PORT_NAME("Black")
- PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_2) PORT_NAME("King")
- PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_3) PORT_NAME("Queen")
- PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_4) PORT_NAME("Rook")
- PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_W) PORT_NAME("Bishop")
- PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_E) PORT_NAME("Knight")
- PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_R) PORT_NAME("Pawn")
- PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_5) PORT_NAME("White")
-
- PORT_START("IN.9")
- PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_1) PORT_NAME("Set up")
- PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_Q) PORT_NAME("New Game")
- PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_U) PORT_NAME("Take Back")
- PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_Y) PORT_NAME("Forward")
- PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_6) PORT_NAME("Hint")
- PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_I) PORT_NAME("Move")
- PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_8) PORT_NAME("Level")
- PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_7) PORT_NAME("Sound")
-INPUT_PORTS_END
-
-
-
-/******************************************************************************
- Machine Drivers
-******************************************************************************/
-
-MACHINE_CONFIG_START(cxgz80_state::ch2001)
-
- /* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, 8_MHz_XTAL/2)
- MCFG_DEVICE_PROGRAM_MAP(ch2001_map)
- MCFG_TIMER_DRIVER_ADD_PERIODIC("irq_on", cxgz80_state, irq_on, attotime::from_hz(484)) // theoretical frequency from 555 timer (22nF, 100K+33K, 1K2), measurement was 568Hz
- MCFG_TIMER_START_DELAY(attotime::from_hz(484) - attotime::from_nsec(18300)) // active for 18.3us
- MCFG_TIMER_DRIVER_ADD_PERIODIC("irq_off", cxgz80_state, irq_off, attotime::from_hz(484))
-
- MCFG_TIMER_DRIVER_ADD("speaker_off", cxgz80_state, speaker_off_callback)
-
- MCFG_TIMER_DRIVER_ADD_PERIODIC("display_decay", cxgz80_state, display_decay_tick, attotime::from_msec(1))
- config.set_default_layout(layout_cxg_ch2001);
-
- /* sound hardware */
- SPEAKER(config, "speaker").front_center();
- MCFG_DEVICE_ADD("dac", DAC_1BIT, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 0.25)
- MCFG_DEVICE_ADD("vref", VOLTAGE_REGULATOR, 0) MCFG_VOLTAGE_REGULATOR_OUTPUT(5.0)
- MCFG_SOUND_ROUTE(0, "dac", 1.0, DAC_VREF_POS_INPUT)
-MACHINE_CONFIG_END
-
-
-
-/******************************************************************************
- ROM Definitions
-******************************************************************************/
-
-ROM_START( ch2001 )
- ROM_REGION( 0x10000, "maincpu", 0 )
- ROM_LOAD("ch2001.bin", 0x0000, 0x4000, CRC(b3485c73) SHA1(f405c6f67fe70edf45dcc383a4049ee6bad387a9) ) // D27128D, no label
-ROM_END
-
-
-
-/******************************************************************************
- Drivers
-******************************************************************************/
-
-/* YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS */
-CONS( 1984, ch2001, 0, 0, ch2001, ch2001, cxgz80_state, empty_init, "CXG", "Chess 2001", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
diff --git a/src/mame/drivers/cxhumax.cpp b/src/mame/drivers/cxhumax.cpp
index cd3ad8feaa8..3f990dd8a32 100644
--- a/src/mame/drivers/cxhumax.cpp
+++ b/src/mame/drivers/cxhumax.cpp
@@ -120,9 +120,9 @@ WRITE32_MEMBER ( cxhumax_state::flash_w )
{
offset *= 2;
if(ACCESSING_BITS_0_15)
- m_flash->write(space, offset, data);
+ m_flash->write(offset, data);
if(ACCESSING_BITS_16_31)
- m_flash->write(space, offset+1, data >> 16);
+ m_flash->write(offset+1, data >> 16);
verboselog(*this, 9, "(FLASH) %08X <- %08X\n", 0xF0000000 + (offset << 2), data);
}
@@ -131,9 +131,9 @@ READ32_MEMBER ( cxhumax_state::flash_r )
uint32_t res = 0;
offset *= 2;
if(ACCESSING_BITS_0_15)
- res |= m_flash->read(space, offset);
+ res |= m_flash->read(offset);
if(ACCESSING_BITS_16_31)
- res |= m_flash->read(space, offset+1) << 16;
+ res |= m_flash->read(offset+1) << 16;
//if(m_flash->m_flash_mode!=FM_NORMAL) verboselog(*this, 9, "(FLASH) %08X -> %08X\n", 0xF0000000 + (offset << 2), res);
return res;
}
@@ -167,7 +167,7 @@ READ32_MEMBER( cxhumax_state::cx_scratch_r )
int i = 0;
while ((temp=program.read_byte(m_maincpu->state_int(ARM7_R0)+i))) {
buf[i++]=temp;
- //m_terminal->write(space, 0, temp);
+ //m_terminal->write(temp);
}
osd_printf_debug("%s", buf);
verboselog(*this, 9, "(DEBUG) %s", buf);
@@ -412,7 +412,7 @@ WRITE32_MEMBER( cxhumax_state::cx_uart2_w )
case UART_FIFO_REG:
if(!(m_uart2_regs[UART_FRMC_REG]&UART_FRMC_BDS_BIT)) {
/* Sending byte... add logging */
- m_terminal->write(space, 0, data);
+ m_terminal->write(data);
/* Transmitter Idle Interrupt Enable */
if(m_uart2_regs[UART_IRQE_REG]&UART_IRQE_TIDE_BIT) {
@@ -1055,26 +1055,27 @@ void cxhumax_state::machine_reset()
memset(m_gxa_cmd_regs,0,sizeof(m_gxa_cmd_regs));
}
-MACHINE_CONFIG_START(cxhumax_state::cxhumax)
- MCFG_DEVICE_ADD("maincpu", ARM920T, 180000000) // CX24175 (RevC up?)
- MCFG_DEVICE_PROGRAM_MAP(cxhumax_map)
+void cxhumax_state::cxhumax(machine_config &config)
+{
+ ARM920T(config, m_maincpu, 180000000); // CX24175 (RevC up?)
+ m_maincpu->set_addrmap(AS_PROGRAM, &cxhumax_state::cxhumax_map);
INTEL_28F320J3D(config, "flash");
I2CMEM(config, "eeprom", 0).set_data_size(0x2000);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(50)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */
- MCFG_SCREEN_SIZE(1920, 1080)
- MCFG_SCREEN_VISIBLE_AREA(0, 1920-1, 0, 1080-1)
- MCFG_SCREEN_UPDATE_DRIVER(cxhumax_state, screen_update_cxhumax)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(50);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */
+ screen.set_size(1920, 1080);
+ screen.set_visarea_full();
+ screen.set_screen_update(FUNC(cxhumax_state::screen_update_cxhumax));
PALETTE(config, "palette", palette_device::MONOCHROME);
GENERIC_TERMINAL(config, m_terminal, 0);
-MACHINE_CONFIG_END
+}
ROM_START( hxhdci2k )
ROM_REGION( 0x400000, "flash", 0 )
diff --git a/src/mame/drivers/cyberbal.cpp b/src/mame/drivers/cyberbal.cpp
index 172eda403d4..dc1bb096aa3 100644
--- a/src/mame/drivers/cyberbal.cpp
+++ b/src/mame/drivers/cyberbal.cpp
@@ -392,8 +392,8 @@ GFXDECODE_END
*
*************************************/
-MACHINE_CONFIG_START(cyberbal_state::cyberbal_base)
-
+void cyberbal_state::cyberbal_base(machine_config &config)
+{
/* basic machine hardware */
M68000(config, m_maincpu, ATARI_CLOCK_14MHz/2);
m_maincpu->set_addrmap(AS_PROGRAM, &cyberbal_state::main_map);
@@ -405,9 +405,9 @@ MACHINE_CONFIG_START(cyberbal_state::cyberbal_base)
M68000(config, m_extracpu, ATARI_CLOCK_14MHz/2);
m_extracpu->set_addrmap(AS_PROGRAM, &cyberbal_state::extra_map);
- MCFG_DEVICE_ADD("dac", M68000, ATARI_CLOCK_14MHz/2)
- MCFG_DEVICE_PROGRAM_MAP(sound_68k_map)
- MCFG_DEVICE_PERIODIC_INT_DRIVER(cyberbal_state, sound_68k_irq_gen, 10000)
+ M68000(config, m_daccpu, ATARI_CLOCK_14MHz/2);
+ m_daccpu->set_addrmap(AS_PROGRAM, &cyberbal_state::sound_68k_map);
+ m_daccpu->set_periodic_int(FUNC(cyberbal_state::sound_68k_irq_gen), attotime::from_hz(10000));
config.m_minimum_quantum = attotime::from_hz(600);
@@ -466,12 +466,11 @@ MACHINE_CONFIG_START(cyberbal_state::cyberbal_base)
AM6012(config, m_rdac, 0).add_route(ALL_OUTPUTS, "rspeaker", 0.5); // AM6012.6j
AM6012(config, m_ldac, 0).add_route(ALL_OUTPUTS, "lspeaker", 0.5); // AM6012.6j
voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref", 0));
- vref.set_output(5.0);
vref.add_route(0, "rdac", 1.0, DAC_VREF_POS_INPUT);
vref.add_route(0, "rdac", -1.0, DAC_VREF_NEG_INPUT);
vref.add_route(0, "ldac", 1.0, DAC_VREF_POS_INPUT);
vref.add_route(0, "ldac", -1.0, DAC_VREF_NEG_INPUT);
-MACHINE_CONFIG_END
+}
void cyberbal_state::cyberbal(machine_config &config)
{
@@ -488,11 +487,11 @@ void cyberbal_state::cyberbalt(machine_config &config)
SLAPSTIC(config, "slapstic", 116, true);
}
-MACHINE_CONFIG_START(cyberbal2p_state::cyberbal2p)
-
+void cyberbal2p_state::cyberbal2p(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M68000, ATARI_CLOCK_14MHz/2)
- MCFG_DEVICE_PROGRAM_MAP(cyberbal2p_map)
+ M68000(config, m_maincpu, ATARI_CLOCK_14MHz/2);
+ m_maincpu->set_addrmap(AS_PROGRAM, &cyberbal2p_state::cyberbal2p_map);
EEPROM_2816(config, "eeprom").lock_after_write(true);
@@ -510,14 +509,14 @@ MACHINE_CONFIG_START(cyberbal2p_state::cyberbal2p)
m_mob->set_config(cyberbal2p_state::s_mob_config);
m_mob->set_gfxdecode("gfxdecode");
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_VIDEO_ATTRIBUTES(VIDEO_UPDATE_BEFORE_VBLANK)
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_video_attributes(VIDEO_UPDATE_BEFORE_VBLANK);
/* note: these parameters are from published specs, not derived */
/* the board uses an SOS-2 chip to generate video signals */
- MCFG_SCREEN_RAW_PARAMS(ATARI_CLOCK_14MHz, 456*2, 0, 336*2, 262, 0, 240)
- MCFG_SCREEN_UPDATE_DRIVER(cyberbal2p_state, screen_update_cyberbal2p)
- MCFG_SCREEN_PALETTE("palette")
- MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE(*this, cyberbal2p_state, video_int_write_line))
+ m_screen->set_raw(ATARI_CLOCK_14MHz, 456*2, 0, 336*2, 262, 0, 240);
+ m_screen->set_screen_update(FUNC(cyberbal2p_state::screen_update_cyberbal2p));
+ m_screen->set_palette("palette");
+ m_screen->screen_vblank().set(FUNC(cyberbal2p_state::video_int_write_line));
/* sound hardware */
SPEAKER(config, "mono").front_center();
@@ -526,7 +525,7 @@ MACHINE_CONFIG_START(cyberbal2p_state::cyberbal2p)
m_jsa->main_int_cb().set_inputline(m_maincpu, M68K_IRQ_3);
m_jsa->test_read_cb().set_ioport("IN2").bit(15);
m_jsa->add_route(ALL_OUTPUTS, "mono", 1.0);
-MACHINE_CONFIG_END
+}
diff --git a/src/mame/drivers/cybertnk.cpp b/src/mame/drivers/cybertnk.cpp
index 1a590d59513..c44fa12bf29 100644
--- a/src/mame/drivers/cybertnk.cpp
+++ b/src/mame/drivers/cybertnk.cpp
@@ -819,38 +819,39 @@ GFXDECODE_END
*/
-MACHINE_CONFIG_START(cybertnk_state::cybertnk)
- MCFG_DEVICE_ADD("maincpu", M68000,XTAL(20'000'000)/2)
- MCFG_DEVICE_PROGRAM_MAP(master_mem)
- MCFG_DEVICE_VBLANK_INT_DRIVER("lscreen", cybertnk_state, irq1_line_assert)
+void cybertnk_state::cybertnk(machine_config &config)
+{
+ M68000(config, m_maincpu, XTAL(20'000'000)/2);
+ m_maincpu->set_addrmap(AS_PROGRAM, &cybertnk_state::master_mem);
+ m_maincpu->set_vblank_int("lscreen", FUNC(cybertnk_state::irq1_line_assert));
- MCFG_DEVICE_ADD("slave", M68000,XTAL(20'000'000)/2)
- MCFG_DEVICE_PROGRAM_MAP(slave_mem)
- MCFG_DEVICE_VBLANK_INT_DRIVER("lscreen", cybertnk_state, irq3_line_hold)
+ m68000_device &slave(M68000(config, "slave", XTAL(20'000'000)/2));
+ slave.set_addrmap(AS_PROGRAM, &cybertnk_state::slave_mem);
+ slave.set_vblank_int("lscreen", FUNC(cybertnk_state::irq3_line_hold));
- MCFG_DEVICE_ADD("audiocpu", Z80,XTAL(3'579'545))
- MCFG_DEVICE_PROGRAM_MAP(sound_mem)
+ Z80(config, m_audiocpu, XTAL(3'579'545));
+ m_audiocpu->set_addrmap(AS_PROGRAM, &cybertnk_state::sound_mem);
- MCFG_QUANTUM_TIME(attotime::from_hz(60000))//arbitrary value,needed to get the communication to work
+ config.m_minimum_quantum = attotime::from_hz(60000); //arbitrary value, needed to get the communication to work
/* video hardware */
config.set_default_layout(layout_dualhsxs);
- MCFG_SCREEN_ADD("lscreen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(32*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 0*8, 28*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(cybertnk_state, screen_update_cybertnk_left)
- MCFG_SCREEN_PALETTE(m_palette)
-
- MCFG_SCREEN_ADD("rscreen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(32*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 0*8, 28*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(cybertnk_state, screen_update_cybertnk_right)
- MCFG_SCREEN_PALETTE(m_palette)
+ screen_device &lscreen(SCREEN(config, "lscreen", SCREEN_TYPE_RASTER));
+ lscreen.set_refresh_hz(60);
+ lscreen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ lscreen.set_size(32*8, 32*8);
+ lscreen.set_visarea(0*8, 32*8-1, 0*8, 28*8-1);
+ lscreen.set_screen_update(FUNC(cybertnk_state::screen_update_cybertnk_left));
+ lscreen.set_palette(m_palette);
+
+ screen_device &rscreen(SCREEN(config, "rscreen", SCREEN_TYPE_RASTER));
+ rscreen.set_refresh_hz(60);
+ rscreen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ rscreen.set_size(32*8, 32*8);
+ rscreen.set_visarea(0*8, 32*8-1, 0*8, 28*8-1);
+ rscreen.set_screen_update(FUNC(cybertnk_state::screen_update_cybertnk_right));
+ rscreen.set_palette(m_palette);
GFXDECODE(config, m_gfxdecode, m_palette, gfx_cybertnk);
PALETTE(config, m_palette).set_format(palette_device::xBGR_555, 0x4000);
@@ -862,13 +863,11 @@ MACHINE_CONFIG_START(cybertnk_state::cybertnk)
GENERIC_LATCH_8(config, m_soundlatch);
m_soundlatch->data_pending_callback().set_inputline(m_audiocpu, 0, HOLD_LINE);
- // Splited output per chip
- MCFG_DEVICE_ADD("ym1", Y8950, XTAL(3'579'545))
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 1.0)
+ // Split output per chip
+ Y8950(config, "ym1", XTAL(3'579'545)).add_route(ALL_OUTPUTS, "lspeaker", 1.0);
- MCFG_DEVICE_ADD("ym2", Y8950, XTAL(3'579'545))
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 1.0)
-MACHINE_CONFIG_END
+ Y8950(config, "ym2", XTAL(3'579'545)).add_route(ALL_OUTPUTS, "rspeaker", 1.0);
+}
/***************************************************************************
diff --git a/src/mame/drivers/cybiko.cpp b/src/mame/drivers/cybiko.cpp
index 440e770d2f7..4b5fa470899 100644
--- a/src/mame/drivers/cybiko.cpp
+++ b/src/mame/drivers/cybiko.cpp
@@ -426,8 +426,8 @@ void cybiko_state::cybikov1_base(machine_config &config)
m_debug_serial->set_option_device_input_defaults("pty", DEVICE_INPUT_DEFAULTS_NAME(debug_serial));
// quickload
- quickload_image_device &quickload(QUICKLOAD(config, "quickload", 0));
- quickload.set_handler(snapquick_load_delegate(&QUICKLOAD_LOAD_NAME(cybiko_state, cybiko), this), "bin,nv", 0);
+ quickload_image_device &quickload(QUICKLOAD(config, "quickload"));
+ quickload.set_handler(snapquick_load_delegate(&QUICKLOAD_LOAD_NAME(cybiko_state, cybiko), this), "bin,nv");
}
void cybiko_state::cybikov1_flash(machine_config &config)
@@ -498,8 +498,8 @@ void cybiko_state::cybikoxt(machine_config &config)
subdevice<h8_sci_device>("maincpu:sci2")->tx_handler().set("debug_serial", FUNC(rs232_port_device::write_txd));
// quickload
- quickload_image_device &quickload(QUICKLOAD(config.replace(), "quickload", 0));
- quickload.set_handler(snapquick_load_delegate(&QUICKLOAD_LOAD_NAME(cybiko_state, cybikoxt), this), "bin,nv", 0);
+ quickload_image_device &quickload(QUICKLOAD(config.replace(), "quickload"));
+ quickload.set_handler(snapquick_load_delegate(&QUICKLOAD_LOAD_NAME(cybiko_state, cybikoxt), this), "bin,nv");
}
/////////
diff --git a/src/mame/drivers/cybstorm.cpp b/src/mame/drivers/cybstorm.cpp
index 6310ef3755d..17ec3230508 100644
--- a/src/mame/drivers/cybstorm.cpp
+++ b/src/mame/drivers/cybstorm.cpp
@@ -222,11 +222,11 @@ GFXDECODE_END
*
*************************************/
-MACHINE_CONFIG_START(cybstorm_state::round2)
-
+void cybstorm_state::round2(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M68EC020, ATARI_CLOCK_14MHz)
- MCFG_DEVICE_PROGRAM_MAP(main_map)
+ M68EC020(config, m_maincpu, ATARI_CLOCK_14MHz);
+ m_maincpu->set_addrmap(AS_PROGRAM, &cybstorm_state::main_map);
EEPROM_2816(config, "eeprom").lock_after_write(true);
@@ -242,18 +242,17 @@ MACHINE_CONFIG_START(cybstorm_state::round2)
ADDRESS_MAP_BANK(config, "vadbank").set_map(&cybstorm_state::vadbank_map).set_options(ENDIANNESS_BIG, 16, 32, 0x90000);
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_cybstorm)
+ GFXDECODE(config, m_gfxdecode, "palette", gfx_cybstorm);
PALETTE(config, "palette").set_format(palette_device::IRGB_1555, 32768);
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_PALETTE("palette")
- MCFG_SCREEN_VIDEO_ATTRIBUTES(VIDEO_UPDATE_BEFORE_VBLANK)
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_palette("palette");
+ m_screen->set_video_attributes(VIDEO_UPDATE_BEFORE_VBLANK);
/* note: these parameters are from published specs, not derived */
/* the board uses an SOS-2 chip to generate video signals */
- MCFG_SCREEN_RAW_PARAMS(ATARI_CLOCK_14MHz/2, 456, 0, 336, 262, 0, 240)
-
- MCFG_SCREEN_UPDATE_DRIVER(cybstorm_state, screen_update_cybstorm)
-MACHINE_CONFIG_END
+ m_screen->set_raw(ATARI_CLOCK_14MHz/2, 456, 0, 336, 262, 0, 240);
+ m_screen->set_screen_update(FUNC(cybstorm_state::screen_update_cybstorm));
+}
void cybstorm_state::cybstorm(machine_config &config)
diff --git a/src/mame/drivers/cyclemb.cpp b/src/mame/drivers/cyclemb.cpp
index a41c93dca08..d60a7f808e8 100644
--- a/src/mame/drivers/cyclemb.cpp
+++ b/src/mame/drivers/cyclemb.cpp
@@ -976,26 +976,27 @@ static GFXDECODE_START( gfx_cyclemb )
GFXDECODE_ENTRY( "sprite_data", 0, spritelayout_32x32, 0x00, 0x40 )
GFXDECODE_END
-MACHINE_CONFIG_START(cyclemb_state::cyclemb)
+void cyclemb_state::cyclemb(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, XTAL(18'000'000)/3) // Z8400BPS
- MCFG_DEVICE_PROGRAM_MAP(cyclemb_map)
- MCFG_DEVICE_IO_MAP(cyclemb_io)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", cyclemb_state, irq0_line_hold)
+ Z80(config, m_maincpu, XTAL(18'000'000)/3); // Z8400BPS
+ m_maincpu->set_addrmap(AS_PROGRAM, &cyclemb_state::cyclemb_map);
+ m_maincpu->set_addrmap(AS_IO, &cyclemb_state::cyclemb_io);
+ m_maincpu->set_vblank_int("screen", FUNC(cyclemb_state::irq0_line_hold));
- MCFG_DEVICE_ADD("audiocpu", Z80, XTAL(18'000'000)/6)
- MCFG_DEVICE_PROGRAM_MAP(cyclemb_sound_map)
- MCFG_DEVICE_IO_MAP(cyclemb_sound_io)
- MCFG_DEVICE_PERIODIC_INT_DRIVER(cyclemb_state, irq0_line_hold, 60)
+ Z80(config, m_audiocpu, XTAL(18'000'000)/6);
+ m_audiocpu->set_addrmap(AS_PROGRAM, &cyclemb_state::cyclemb_sound_map);
+ m_audiocpu->set_addrmap(AS_IO, &cyclemb_state::cyclemb_sound_io);
+ m_audiocpu->set_periodic_int(FUNC(cyclemb_state::irq0_line_hold), attotime::from_hz(60));
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(32*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(cyclemb_state, screen_update_cyclemb)
- MCFG_SCREEN_PALETTE(m_palette)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(32*8, 32*8);
+ screen.set_visarea(0*8, 32*8-1, 2*8, 30*8-1);
+ screen.set_screen_update(FUNC(cyclemb_state::screen_update_cyclemb));
+ screen.set_palette(m_palette);
GFXDECODE(config, m_gfxdecode, m_palette, gfx_cyclemb);
PALETTE(config, m_palette, FUNC(cyclemb_state::cyclemb_palette), 256);
@@ -1010,20 +1011,20 @@ MACHINE_CONFIG_START(cyclemb_state::cyclemb)
// ymsnd.irq_handler().set(FUNC(cyclemb_state::ym_irq));
// ymsnd.port_b_read_callback().set_ioport("UNK");
ymsnd.add_route(ALL_OUTPUTS, "mono", 0.50);
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(cyclemb_state::skydest)
+void cyclemb_state::skydest(machine_config &config)
+{
cyclemb(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_IO_MAP(skydest_io)
+ m_maincpu->set_addrmap(AS_IO, &cyclemb_state::skydest_io);
- MCFG_SCREEN_MODIFY("screen")
- MCFG_SCREEN_SIZE(64*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(2*8, 34*8-1, 2*8, 30*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(cyclemb_state, screen_update_skydest)
+ screen_device &screen(*subdevice<screen_device>("screen"));
+ screen.set_size(64*8, 32*8);
+ screen.set_visarea(2*8, 34*8-1, 2*8, 30*8-1);
+ screen.set_screen_update(FUNC(cyclemb_state::screen_update_skydest));
-// MCFG_PALETTE_INIT_OWNER(cyclemb_state,skydest)
-MACHINE_CONFIG_END
+// m_palette->set_init(FUNC(cyclemb_state::skydest));
+}
/***************************************************************************
diff --git a/src/mame/drivers/cz101.cpp b/src/mame/drivers/cz101.cpp
index 93268c9dba6..3ece028eed4 100644
--- a/src/mame/drivers/cz101.cpp
+++ b/src/mame/drivers/cz101.cpp
@@ -381,7 +381,8 @@ void cz101_state::machine_reset()
// MACHINE DEFINTIONS
//**************************************************************************
-MACHINE_CONFIG_START( cz101_state::cz101 )
+void cz101_state::cz101(machine_config &config)
+{
UPD7810(config, m_maincpu, 10_MHz_XTAL); // actually 7811, but internal ROM disabled
m_maincpu->set_addrmap(AS_PROGRAM, &cz101_state::maincpu_map);
m_maincpu->pa_in_cb().set(FUNC(cz101_state::port_a_r));
@@ -392,22 +393,22 @@ MACHINE_CONFIG_START( cz101_state::cz101 )
CLOCK(config, "midi_clock", 2_MHz_XTAL)/*.signal_handler().set(m_maincpu, FUNC(upd7810_device::sck_w))*/; // not supported yet
// video hardware
- MCFG_SCREEN_ADD("screen", LCD)
- MCFG_SCREEN_REFRESH_RATE(50)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */
- MCFG_SCREEN_SIZE(6*16+1, 19)
- MCFG_SCREEN_VISIBLE_AREA(0, 6*16, 0, 19-1)
- MCFG_SCREEN_UPDATE_DEVICE("hd44780", hd44780_device, screen_update)
- MCFG_SCREEN_PALETTE("palette")
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_LCD));
+ screen.set_refresh_hz(50);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */
+ screen.set_size(6*16+1, 19);
+ screen.set_visarea_full();
+ screen.set_screen_update("hd44780", FUNC(hd44780_device::screen_update));
+ screen.set_palette("palette");
PALETTE(config, "palette", FUNC(cz101_state::cz101_palette), 3);
- MCFG_HD44780_ADD("hd44780")
- MCFG_HD44780_LCD_SIZE(2, 16)
- MCFG_HD44780_PIXEL_UPDATE_CB(cz101_state, lcd_pixel_update)
+ HD44780(config, m_hd44780, 0);
+ m_hd44780->set_lcd_size(2, 16);
+ m_hd44780->set_pixel_update_cb(FUNC(cz101_state::lcd_pixel_update), this);
config.set_default_layout(layout_cz101);
-MACHINE_CONFIG_END
+}
//**************************************************************************
diff --git a/src/mame/drivers/d6800.cpp b/src/mame/drivers/d6800.cpp
index d0776d1ee56..fac7892b7b5 100644
--- a/src/mame/drivers/d6800.cpp
+++ b/src/mame/drivers/d6800.cpp
@@ -16,10 +16,16 @@
The cassette has no checksum, header or blocks. It is simply a stream
of pulses. The successful loading of a tape is therefore a matter of luck.
+ To modify memory, press RST, then enter the 4-digit address (nothing happens
+ until the 4th digit is pressed), then press FN, then 0, then the 2 digit data.
+ It will enter the data (you won't see anything), then the address will increment.
+ Enter the data for this new address. If you want to skip this address, press FN.
+ When you're done, press RST. NOTE!!! Do NOT change any of these addresses:
+ 0000,0001,0006-007F, or the system may crash. It's recommended to start all
+ your programs at 0200.
+
Function keys:
- FN 0 - Modify memory - firstly enter a 4-digit address, then 2-digit data
- the address will increment by itself, enter the next byte.
- FN by itself will step to the next address.
+ FN 0 - Modify memory - see above paragraph.
FN 1 - Tape load. You must have entered the start address at 0002, and
the end address+1 at 0004 (big-endian).
@@ -27,14 +33,14 @@
FN 2 - Tape save. You must have entered the start address at 0002, and
the end address+1 at 0004 (big-endian).
- FN 3 - Run. You must have entered the 4-digit go address first.
+ FN 3 - Run. To use, press RST, then enter the 4-digit start address
+ (nothing happens until the 4th digit is pressed), then FN, then 3.
- All CHIP-8 programs load at 0x200 (max size 4k), and exec address
+ All CHIP-8 programs load at 0200 (max size 4k), and exec address
is C000.
Information and programs can be found at http://chip8.com/?page=78
-
**********************************************************************************/
@@ -75,6 +81,8 @@ public:
void d6800(machine_config &config);
+ DECLARE_INPUT_CHANGED_MEMBER(reset_button);
+
private:
DECLARE_READ8_MEMBER( d6800_cassette_r );
DECLARE_WRITE8_MEMBER( d6800_cassette_w );
@@ -185,13 +193,23 @@ static INPUT_PORTS_START( d6800 )
PORT_START("SHIFT")
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("FN") PORT_CODE(KEYCODE_LSHIFT)
+ PORT_START("RESET")
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("RST") PORT_CODE(KEYCODE_LALT) PORT_CHANGED_MEMBER(DEVICE_SELF, d6800_state, reset_button, nullptr)
+
PORT_START("VS")
/* vblank */
- PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_CUSTOM) PORT_VBLANK("screen")
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_CUSTOM) PORT_VBLANK("screen")
INPUT_PORTS_END
-/* Video */
+INPUT_CHANGED_MEMBER(d6800_state::reset_button)
+{
+ // RESET button wired to POR on the mc6875, which activates the Reset output pin which in turn connects to the CPU's Reset pin.
+ if (newval)
+ m_pia->reset();
+ m_maincpu->set_input_line(INPUT_LINE_RESET, newval ? ASSERT_LINE : CLEAR_LINE);
+}
+/* Video */
uint32_t d6800_state::screen_update_d6800(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{
uint8_t x,y,gfx=0;
@@ -390,23 +408,23 @@ QUICKLOAD_LOAD_MEMBER( d6800_state, d6800 )
MACHINE_CONFIG_START(d6800_state::d6800)
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu",M6800, XTAL(4'000'000)/4)
- MCFG_DEVICE_PROGRAM_MAP(d6800_map)
+ M6800(config, m_maincpu, XTAL(4'000'000)/4);
+ m_maincpu->set_addrmap(AS_PROGRAM, &d6800_state::d6800_map);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(50)
- MCFG_SCREEN_SIZE(64, 32)
- MCFG_SCREEN_VISIBLE_AREA(0, 63, 0, 31)
- MCFG_SCREEN_UPDATE_DRIVER(d6800_state, screen_update_d6800)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(25))
- MCFG_SCREEN_PALETTE("palette")
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(50);
+ screen.set_size(64, 32);
+ screen.set_visarea_full();
+ screen.set_screen_update(FUNC(d6800_state::screen_update_d6800));
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(25));
+ screen.set_palette("palette");
PALETTE(config, "palette", palette_device::MONOCHROME);
/* sound hardware */
SPEAKER(config, "mono").front_center();
- WAVE(config, "wave", "cassette").add_route(ALL_OUTPUTS, "mono", 0.50);
+ WAVE(config, "wave", m_cass).add_route(ALL_OUTPUTS, "mono", 0.50);
BEEP(config, "beeper", 1200).add_route(ALL_OUTPUTS, "mono", 0.50);
/* devices */
@@ -419,14 +437,14 @@ MACHINE_CONFIG_START(d6800_state::d6800)
m_pia->irqa_handler().set_inputline("maincpu", M6800_IRQ_LINE);
m_pia->irqb_handler().set_inputline("maincpu", M6800_IRQ_LINE);
- MCFG_CASSETTE_ADD("cassette")
- MCFG_CASSETTE_DEFAULT_STATE(CASSETTE_STOPPED | CASSETTE_MOTOR_ENABLED | CASSETTE_SPEAKER_MUTED)
+ CASSETTE(config, m_cass);
+ m_cass->set_default_state(CASSETTE_STOPPED | CASSETTE_MOTOR_ENABLED | CASSETTE_SPEAKER_MUTED);
- MCFG_TIMER_DRIVER_ADD_PERIODIC("d6800_c", d6800_state, d6800_c, attotime::from_hz(4800))
- MCFG_TIMER_DRIVER_ADD_PERIODIC("d6800_p", d6800_state, d6800_p, attotime::from_hz(40000))
+ TIMER(config, "d6800_c").configure_periodic(FUNC(d6800_state::d6800_c), attotime::from_hz(4800));
+ TIMER(config, "d6800_p").configure_periodic(FUNC(d6800_state::d6800_p), attotime::from_hz(40000));
/* quickload */
- MCFG_QUICKLOAD_ADD("quickload", d6800_state, d6800, "bin,c8,ch8", 1)
+ MCFG_QUICKLOAD_ADD("quickload", d6800_state, d6800, "bin,c8,ch8", attotime::from_seconds(1))
MACHINE_CONFIG_END
/* ROMs */
diff --git a/src/mame/drivers/d6809.cpp b/src/mame/drivers/d6809.cpp
index 9c5c8e1d543..24525bcc328 100644
--- a/src/mame/drivers/d6809.cpp
+++ b/src/mame/drivers/d6809.cpp
@@ -145,7 +145,7 @@ READ8_MEMBER( d6809_state::term_r )
WRITE8_MEMBER( d6809_state::term_w )
{
if ((data > 0) && (data < 0x80))
- m_terminal->write(space, 0, data);
+ m_terminal->write(data);
}
void d6809_state::mem_map(address_map &map)
@@ -189,13 +189,14 @@ static void floppies(device_slot_interface &device)
}
-MACHINE_CONFIG_START(d6809_state::d6809)
+void d6809_state::d6809(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", MC6809E, XTAL(14'745'600) / 8) // MC68B09EP
- MCFG_DEVICE_PROGRAM_MAP(mem_map)
+ MC6809E(config, m_maincpu, XTAL(14'745'600) / 8); // MC68B09EP
+ m_maincpu->set_addrmap(AS_PROGRAM, &d6809_state::mem_map);
- MCFG_DEVICE_ADD("acia1", MOS6551, XTAL(14'745'600) / 8) // uses Q clock
- MCFG_DEVICE_ADD("acia2", MOS6551, XTAL(14'745'600) / 8) // uses Q clock
+ MOS6551(config, "acia1", XTAL(14'745'600) / 8); // uses Q clock
+ MOS6551(config, "acia2", XTAL(14'745'600) / 8); // uses Q clock
/* video hardware */
GENERIC_TERMINAL(config, m_terminal, 0);
@@ -204,9 +205,8 @@ MACHINE_CONFIG_START(d6809_state::d6809)
// Floppy
UPD765A(config, m_fdc, 8'000'000, true, true);
//m_fdc->drq_wr_callback().set(m_fdc, FUNC(upd765a_device::dack_w)); // pin not emulated
- MCFG_FLOPPY_DRIVE_ADD("fdc:0", floppies, "525qd", floppy_image_device::default_floppy_formats)
- MCFG_FLOPPY_DRIVE_SOUND(true)
-MACHINE_CONFIG_END
+ FLOPPY_CONNECTOR(config, "fdc:0", floppies, "525qd", floppy_image_device::default_floppy_formats).enable_sound(true);
+}
/* ROM definition */
ROM_START( d6809 )
diff --git a/src/mame/drivers/d9final.cpp b/src/mame/drivers/d9final.cpp
index e1704b33ee1..7590a51ce4b 100644
--- a/src/mame/drivers/d9final.cpp
+++ b/src/mame/drivers/d9final.cpp
@@ -302,37 +302,36 @@ void d9final_state::machine_start()
membank("bank1")->set_entry(0);
}
-MACHINE_CONFIG_START(d9final_state::d9final)
+void d9final_state::d9final(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, 24000000/4)/* ? MHz */
- MCFG_DEVICE_PROGRAM_MAP(d9final_map)
- MCFG_DEVICE_IO_MAP(d9final_io)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", d9final_state, irq0_line_hold)
+ Z80(config, m_maincpu, 24000000/4); /* ? MHz */
+ m_maincpu->set_addrmap(AS_PROGRAM, &d9final_state::d9final_map);
+ m_maincpu->set_addrmap(AS_IO, &d9final_state::d9final_io);
+ m_maincpu->set_vblank_int("screen", FUNC(d9final_state::irq0_line_hold));
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0); // Sharp LH5116D-10 + battery
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(512, 256)
- MCFG_SCREEN_VISIBLE_AREA(0, 512-1, 16, 256-16-1)
- MCFG_SCREEN_UPDATE_DRIVER(d9final_state, screen_update)
- MCFG_SCREEN_PALETTE("palette")
-
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_d9final)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(512, 256);
+ screen.set_visarea(0, 512-1, 16, 256-16-1);
+ screen.set_screen_update(FUNC(d9final_state::screen_update));
+ screen.set_palette("palette");
+
+ GFXDECODE(config, m_gfxdecode, "palette", gfx_d9final);
PALETTE(config, "palette", palette_device::BLACK).set_format(palette_device::xBRG_444, 0x400);
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("ymsnd", YM2413, XTAL(3'579'545))
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.5)
+ YM2413(config, "ymsnd", XTAL(3'579'545)).add_route(ALL_OUTPUTS, "mono", 0.5);
- //MCFG_DEVICE_ADD("essnd", ES8712, 24000000/3) // clock unknown
- //MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
+ //ES8712(config, "essnd", 24000000/3).add_route(ALL_OUTPUTS, "mono", 1.0); // clock unknown
- MCFG_DEVICE_ADD("rtc", RTC62421, XTAL(32'768)) // internal oscillator
-MACHINE_CONFIG_END
+ RTC62421(config, "rtc", XTAL(32'768)); // internal oscillator
+}
ROM_START( d9final )
diff --git a/src/mame/drivers/dacholer.cpp b/src/mame/drivers/dacholer.cpp
index 5b3acce684b..26d330b5eab 100644
--- a/src/mame/drivers/dacholer.cpp
+++ b/src/mame/drivers/dacholer.cpp
@@ -649,18 +649,18 @@ void dacholer_state::dacholer_palette(palette_device &palette) const
bit0 = BIT(color_prom[i], 0);
bit1 = BIT(color_prom[i], 1);
bit2 = BIT(color_prom[i], 2);
- int const r = combine_3_weights(weights_rg, bit0, bit1, bit2);
+ int const r = combine_weights(weights_rg, bit0, bit1, bit2);
// green component
bit0 = BIT(color_prom[i], 3);
bit1 = BIT(color_prom[i], 4);
bit2 = BIT(color_prom[i], 5);
- int const g = combine_3_weights(weights_rg, bit0, bit1, bit2);
+ int const g = combine_weights(weights_rg, bit0, bit1, bit2);
// blue component
bit0 = BIT(color_prom[i], 6);
bit1 = BIT(color_prom[i], 7);
- int const b = combine_2_weights(weights_b, bit0, bit1);
+ int const b = combine_weights(weights_b, bit0, bit1);
palette.set_pen_color(i, rgb_t(r, g, b));
}
@@ -702,7 +702,7 @@ void dacholer_state::dacholer(machine_config &config)
AY8910(config, "ay3", XTAL(19'968'000)/16).add_route(ALL_OUTPUTS, "mono", 0.15);
MSM5205(config, m_msm, XTAL(384'000));
- m_msm->vck_legacy_callback().set(FUNC(dacholer_state::adpcm_int)); /* interrupt function */
+ m_msm->vck_legacy_callback().set(FUNC(dacholer_state::adpcm_int)); /* interrupt function */
m_msm->set_prescaler_selector(msm5205_device::S96_4B); /* 1 / 96 = 3906.25Hz playback - guess */
m_msm->add_route(ALL_OUTPUTS, "mono", 0.30);
}
diff --git a/src/mame/drivers/dai.cpp b/src/mame/drivers/dai.cpp
index 42425d3f928..9791381e4c0 100644
--- a/src/mame/drivers/dai.cpp
+++ b/src/mame/drivers/dai.cpp
@@ -187,13 +187,14 @@ static GFXDECODE_START( gfx_dai )
GFXDECODE_END
/* machine definition */
-MACHINE_CONFIG_START(dai_state::dai)
+void dai_state::dai(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", I8080, 2000000)
- MCFG_DEVICE_PROGRAM_MAP(dai_mem)
- MCFG_DEVICE_IO_MAP(dai_io)
- MCFG_DEVICE_IRQ_ACKNOWLEDGE_DRIVER(dai_state,int_ack)
- MCFG_QUANTUM_TIME(attotime::from_hz(60))
+ I8080(config, m_maincpu, 2000000);
+ m_maincpu->set_addrmap(AS_PROGRAM, &dai_state::dai_mem);
+ m_maincpu->set_addrmap(AS_IO, &dai_state::dai_io);
+ m_maincpu->set_irq_acknowledge_callback(FUNC(dai_state::int_ack));
+ config.m_minimum_quantum = attotime::from_hz(60);
PIT8253(config, m_pit, 0);
m_pit->set_clk<0>(2000000);
@@ -206,29 +207,29 @@ MACHINE_CONFIG_START(dai_state::dai)
I8255(config, "ppi8255");
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(50)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */
- MCFG_SCREEN_SIZE(1056, 542)
- MCFG_SCREEN_VISIBLE_AREA(0, 1056-1, 0, 302-1)
- MCFG_SCREEN_UPDATE_DRIVER(dai_state, screen_update_dai)
- MCFG_SCREEN_PALETTE(m_palette)
-
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, m_palette, gfx_dai)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(50);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */
+ screen.set_size(1056, 542);
+ screen.set_visarea(0, 1056-1, 0, 302-1);
+ screen.set_screen_update(FUNC(dai_state::screen_update_dai));
+ screen.set_palette(m_palette);
+
+ GFXDECODE(config, "gfxdecode", m_palette, gfx_dai);
PALETTE(config, m_palette, FUNC(dai_state::dai_palette), ARRAY_LENGTH(s_palette));
/* sound hardware */
SPEAKER(config, "mono").front_center();
- WAVE(config, "wave", "cassette").add_route(ALL_OUTPUTS, "mono", 0.25);
+ WAVE(config, "wave", m_cassette).add_route(ALL_OUTPUTS, "mono", 0.25);
SPEAKER(config, "lspeaker").front_left();
SPEAKER(config, "rspeaker").front_right();
DAI_SOUND(config, m_sound).add_route(0, "lspeaker", 0.50).add_route(1, "rspeaker", 0.50);
/* cassette */
- MCFG_CASSETTE_ADD( "cassette" )
- MCFG_CASSETTE_DEFAULT_STATE(CASSETTE_PLAY | CASSETTE_MOTOR_DISABLED | CASSETTE_SPEAKER_ENABLED)
- MCFG_CASSETTE_INTERFACE("dai_cass")
+ CASSETTE(config, m_cassette);
+ m_cassette->set_default_state(CASSETTE_PLAY | CASSETTE_MOTOR_DISABLED | CASSETTE_SPEAKER_ENABLED);
+ m_cassette->set_interface("dai_cass");
/* tms5501 */
TMS5501(config, m_tms5501, 2000000);
@@ -240,8 +241,8 @@ MACHINE_CONFIG_START(dai_state::dai)
RAM(config, RAM_TAG).set_default_size("48K");
/* software lists */
- MCFG_SOFTWARE_LIST_ADD("cass_list", "dai_cass")
-MACHINE_CONFIG_END
+ SOFTWARE_LIST(config, "cass_list").set_original("dai_cass");
+}
ROM_START(dai)
diff --git a/src/mame/drivers/dai3wksi.cpp b/src/mame/drivers/dai3wksi.cpp
index 5f434b5eced..2002ee353d8 100644
--- a/src/mame/drivers/dai3wksi.cpp
+++ b/src/mame/drivers/dai3wksi.cpp
@@ -5,7 +5,7 @@
-Galaxy Force
-Run Away
--------------------------
-Dai San Wakusei Meteor
+Dai 3 Wakusei
(c)1979 Sun Electronics
SIV-01-B
@@ -533,7 +533,7 @@ void dai3wksi_state::dai3wksi(machine_config &config)
m_ic81->set_enable(1);
m_ic81->add_route(ALL_OUTPUTS, "mono", 0.4);
#endif
-MACHINE_CONFIG_END
+}
/*************************************
@@ -557,4 +557,4 @@ ROM_END
*
*************************************/
-GAME( 1979, dai3wksi, 0, dai3wksi, dai3wksi, dai3wksi_state, empty_init, ROT270, "Sun Electronics", "Dai San Wakusei Meteor (Japan)", MACHINE_WRONG_COLORS | MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE )
+GAME( 1979, dai3wksi, 0, dai3wksi, dai3wksi, dai3wksi_state, empty_init, ROT270, "Sun Electronics", "Dai 3 Wakusei (Japan)", MACHINE_WRONG_COLORS | MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE )
diff --git a/src/mame/drivers/dambustr.cpp b/src/mame/drivers/dambustr.cpp
index a2b7a52340a..9c185d0b378 100644
--- a/src/mame/drivers/dambustr.cpp
+++ b/src/mame/drivers/dambustr.cpp
@@ -261,27 +261,28 @@ void dambustr_state::init_dambustr()
-MACHINE_CONFIG_START(dambustr_state::dambustr)
+void dambustr_state::dambustr(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, 18432000/6) /* 3.072 MHz */
- MCFG_DEVICE_PROGRAM_MAP(dambustr_map)
+ Z80(config, m_maincpu, 18432000/6); /* 3.072 MHz */
+ m_maincpu->set_addrmap(AS_PROGRAM, &dambustr_state::dambustr_map);
MCFG_MACHINE_RESET_OVERRIDE(dambustr_state,galaxold)
TTL7474(config, "7474_9m_1", 0).output_cb().set(FUNC(dambustr_state::galaxold_7474_9m_1_callback));
TTL7474(config, "7474_9m_2", 0).comp_output_cb().set(FUNC(dambustr_state::galaxold_7474_9m_2_q_callback));
- MCFG_TIMER_DRIVER_ADD("int_timer", dambustr_state, galaxold_interrupt_timer)
+ TIMER(config, "int_timer").configure_generic(FUNC(dambustr_state::galaxold_interrupt_timer));
WATCHDOG_TIMER(config, "watchdog");
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(16000.0/132/2)
- MCFG_SCREEN_SIZE(32*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(dambustr_state, screen_update_dambustr)
- MCFG_SCREEN_PALETTE(m_palette)
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_refresh_hz(16000.0/132/2);
+ m_screen->set_size(32*8, 32*8);
+ m_screen->set_visarea(0*8, 32*8-1, 2*8, 30*8-1);
+ m_screen->set_screen_update(FUNC(dambustr_state::screen_update_dambustr));
+ m_screen->set_palette(m_palette);
GFXDECODE(config, m_gfxdecode, m_palette, gfx_dambustr);
PALETTE(config, m_palette, FUNC(dambustr_state::dambustr_palette), 32+2+64+8); // 32 for the characters, 2 for the bullets, 64 for the stars, 8 for the background
@@ -292,7 +293,7 @@ MACHINE_CONFIG_START(dambustr_state::dambustr)
SPEAKER(config, "speaker").front_center();
galaxian_audio(config);
-MACHINE_CONFIG_END
+}
ROM_START( dambustr )
diff --git a/src/mame/drivers/darkmist.cpp b/src/mame/drivers/darkmist.cpp
index fd2c10f808e..58cd566b3e6 100644
--- a/src/mame/drivers/darkmist.cpp
+++ b/src/mame/drivers/darkmist.cpp
@@ -239,23 +239,24 @@ TIMER_DEVICE_CALLBACK_MEMBER(darkmist_state::scanline)
-MACHINE_CONFIG_START(darkmist_state::darkmist)
+void darkmist_state::darkmist(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80,4000000) /* ? MHz */
- MCFG_DEVICE_PROGRAM_MAP(memmap)
- MCFG_DEVICE_OPCODES_MAP(decrypted_opcodes_map)
- MCFG_TIMER_DRIVER_ADD_SCANLINE("scantimer", darkmist_state, scanline, "screen", 0, 1)
+ Z80(config, m_maincpu, 4000000); /* ? MHz */
+ m_maincpu->set_addrmap(AS_PROGRAM, &darkmist_state::memmap);
+ m_maincpu->set_addrmap(AS_OPCODES, &darkmist_state::decrypted_opcodes_map);
+ TIMER(config, "scantimer").configure_scanline(FUNC(darkmist_state::scanline), "screen", 0, 1);
- MCFG_DEVICE_ADD("t5182", T5182, 0)
+ T5182(config, m_t5182, 0);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(256, 256)
- MCFG_SCREEN_VISIBLE_AREA(0, 256-1, 16, 256-16-1)
- MCFG_SCREEN_UPDATE_DRIVER(darkmist_state, screen_update)
- MCFG_SCREEN_PALETTE(m_palette)
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_refresh_hz(60);
+ m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ m_screen->set_size(256, 256);
+ m_screen->set_visarea(0, 256-1, 16, 256-16-1);
+ m_screen->set_screen_update(FUNC(darkmist_state::screen_update));
+ m_screen->set_palette(m_palette);
GFXDECODE(config, m_gfxdecode, m_palette, gfx_darkmist);
PALETTE(config, m_palette, FUNC(darkmist_state::darkmist_palette));
@@ -269,7 +270,7 @@ MACHINE_CONFIG_START(darkmist_state::darkmist)
ymsnd.irq_handler().set(m_t5182, FUNC(t5182_device::ym2151_irq_handler));
ymsnd.add_route(0, "mono", 1.0);
ymsnd.add_route(1, "mono", 1.0);
-MACHINE_CONFIG_END
+}
ROM_START( darkmist )
ROM_REGION( 0x18000, "maincpu", 0 )
diff --git a/src/mame/drivers/darkseal.cpp b/src/mame/drivers/darkseal.cpp
index 9cea0a5512f..71fe922f2bd 100644
--- a/src/mame/drivers/darkseal.cpp
+++ b/src/mame/drivers/darkseal.cpp
@@ -201,30 +201,30 @@ GFXDECODE_END
/******************************************************************************/
-MACHINE_CONFIG_START(darkseal_state::darkseal)
-
+void darkseal_state::darkseal(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD(m_maincpu, M68000, XTAL(24'000'000)/2) /* Custom chip 59 */
- MCFG_DEVICE_PROGRAM_MAP(darkseal_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", darkseal_state, irq6_line_assert)/* VBL */
+ M68000(config, m_maincpu, XTAL(24'000'000)/2); /* Custom chip 59 */
+ m_maincpu->set_addrmap(AS_PROGRAM, &darkseal_state::darkseal_map);
+ m_maincpu->set_vblank_int("screen", FUNC(darkseal_state::irq6_line_assert)); /* VBL */
H6280(config, m_audiocpu, XTAL(32'220'000)/4); /* Custom chip 45, Audio section crystal is 32.220 MHz */
m_audiocpu->set_addrmap(AS_PROGRAM, &darkseal_state::sound_map);
m_audiocpu->add_route(ALL_OUTPUTS, "mono", 0); // internal sound unused
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(58)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(529))
- MCFG_SCREEN_SIZE(32*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 1*8, 31*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(darkseal_state, screen_update)
- MCFG_SCREEN_PALETTE("colors")
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(58);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(529));
+ screen.set_size(32*8, 32*8);
+ screen.set_visarea(0*8, 32*8-1, 1*8, 31*8-1);
+ screen.set_screen_update(FUNC(darkseal_state::screen_update));
+ screen.set_palette(m_palette);
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, m_palette, gfx_darkseal)
- MCFG_PALETTE_ADD(m_palette, 2048)
+ GFXDECODE(config, "gfxdecode", m_palette, gfx_darkseal);
+ PALETTE(config, m_palette).set_entries(2048);
- MCFG_DEVICE_ADD(m_spriteram, BUFFERED_SPRITERAM16)
+ BUFFERED_SPRITERAM16(config, m_spriteram);
DECO16IC(config, m_deco_tilegen[0], 0);
m_deco_tilegen[0]->set_split(0);
@@ -264,20 +264,17 @@ MACHINE_CONFIG_START(darkseal_state::darkseal)
GENERIC_LATCH_8(config, m_soundlatch);
m_soundlatch->data_pending_callback().set_inputline(m_audiocpu, 0);
- MCFG_DEVICE_ADD("ym1", YM2203, XTAL(32'220'000)/8)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.45)
+ YM2203(config, "ym1", XTAL(32'220'000)/8).add_route(ALL_OUTPUTS, "mono", 0.45);
ym2151_device &ym2(YM2151(config, "ym2", XTAL(32'220'000)/9));
ym2.irq_handler().set_inputline(m_audiocpu, 1); // IRQ2
ym2.add_route(0, "mono", 0.55);
ym2.add_route(1, "mono", 0.55);
- MCFG_DEVICE_ADD("oki1", OKIM6295, XTAL(32'220'000)/32, okim6295_device::PIN7_HIGH)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
+ OKIM6295(config, "oki1", XTAL(32'220'000)/32, okim6295_device::PIN7_HIGH).add_route(ALL_OUTPUTS, "mono", 1.0);
- MCFG_DEVICE_ADD("oki2", OKIM6295, XTAL(32'220'000)/16, okim6295_device::PIN7_HIGH)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.60)
-MACHINE_CONFIG_END
+ OKIM6295(config, "oki2", XTAL(32'220'000)/16, okim6295_device::PIN7_HIGH).add_route(ALL_OUTPUTS, "mono", 0.60);
+}
/******************************************************************************/
diff --git a/src/mame/drivers/daruma.cpp b/src/mame/drivers/daruma.cpp
index 2a4946ba9fb..1ac8fd665f1 100644
--- a/src/mame/drivers/daruma.cpp
+++ b/src/mame/drivers/daruma.cpp
@@ -118,17 +118,17 @@ static INPUT_PORTS_START( daruma )
INPUT_PORTS_END
-MACHINE_CONFIG_START(daruma_state::daruma)
+void daruma_state::daruma(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", I80C32,11059200) //verified on pcb
- MCFG_DEVICE_PROGRAM_MAP(mem_prg)
- MCFG_DEVICE_IO_MAP(mem_io)
+ I80C32(config, m_maincpu, 11059200); //verified on pcb
+ m_maincpu->set_addrmap(AS_PROGRAM, &daruma_state::mem_prg);
+ m_maincpu->set_addrmap(AS_IO, &daruma_state::mem_io);
// TODO: ports
/* sound hardware */
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("speaker", SPEAKER_SOUND)
- MCFG_SOUND_ROUTE(0, "mono", 1.00)
+ SPEAKER_SOUND(config, m_speaker).add_route(0, "mono", 1.00);
/* TODO:
config.set_default_layout(layout_daruma);
@@ -136,9 +136,9 @@ MACHINE_CONFIG_START(daruma_state::daruma)
Motors: MTA011
http://pdf.datasheetcatalog.com/datasheet/Shindengen/mXstzvq.pdf
- The motor controller suposedly is used to cut the paper strip out after finishing printing something.
+ The motor controller supposedly is used to cut the paper strip out after finishing printing something.
*/
-MACHINE_CONFIG_END
+}
ROM_START( ds348 )
ROM_REGION( 0x10000, "maincpu", 0 )
diff --git a/src/mame/drivers/dassault.cpp b/src/mame/drivers/dassault.cpp
index f69aba9b005..8ede1f49abb 100644
--- a/src/mame/drivers/dassault.cpp
+++ b/src/mame/drivers/dassault.cpp
@@ -522,39 +522,39 @@ void dassault_state::machine_reset()
m_priority = 0;
}
-MACHINE_CONFIG_START(dassault_state::dassault)
-
+void dassault_state::dassault(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M68000, XTAL(28'000'000)/2) /* 14MHz - Accurate */
- MCFG_DEVICE_PROGRAM_MAP(dassault_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", dassault_state, irq4_line_assert)
+ M68000(config, m_maincpu, XTAL(28'000'000)/2); /* 14MHz - Accurate */
+ m_maincpu->set_addrmap(AS_PROGRAM, &dassault_state::dassault_map);
+ m_maincpu->set_vblank_int("screen", FUNC(dassault_state::irq4_line_assert));
- MCFG_DEVICE_ADD("sub", M68000, XTAL(28'000'000)/2) /* 14MHz - Accurate */
- MCFG_DEVICE_PROGRAM_MAP(dassault_sub_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", dassault_state, irq5_line_assert)
+ M68000(config, m_subcpu, XTAL(28'000'000)/2); /* 14MHz - Accurate */
+ m_subcpu->set_addrmap(AS_PROGRAM, &dassault_state::dassault_sub_map);
+ m_subcpu->set_vblank_int("screen", FUNC(dassault_state::irq5_line_assert));
H6280(config, m_audiocpu, XTAL(32'220'000)/8); /* Accurate */
m_audiocpu->set_addrmap(AS_PROGRAM, &dassault_state::sound_map);
m_audiocpu->add_route(ALL_OUTPUTS, "lspeaker", 0); // internal sound unused
m_audiocpu->add_route(ALL_OUTPUTS, "rspeaker", 0);
-// MCFG_QUANTUM_TIME(attotime::from_hz(8400)) /* 140 CPU slices per frame */
- MCFG_QUANTUM_PERFECT_CPU("maincpu") // I was seeing random lockups.. let's see if this helps
+// config.m_minimum_quantum = attotime::from_hz(8400); /* 140 CPU slices per frame */
+ config.m_perfect_cpu_quantum = subtag("maincpu"); // I was seeing random lockups.. let's see if this helps
mb8421_mb8431_16_device &sharedram(MB8421_MB8431_16BIT(config, "sharedram"));
sharedram.intl_callback().set_inputline("maincpu", M68K_IRQ_5);
sharedram.intr_callback().set_inputline("sub", M68K_IRQ_6);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_RAW_PARAMS(XTAL(28'000'000) / 4, 442, 0, 320, 274, 8, 248) // same as robocop2(cninja.cpp)? verify this from real pcb.
- MCFG_SCREEN_UPDATE_DRIVER(dassault_state, screen_update_dassault)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_raw(XTAL(28'000'000) / 4, 442, 0, 320, 274, 8, 248); // same as robocop2(cninja.cpp)? verify this from real pcb.
+ screen.set_screen_update(FUNC(dassault_state::screen_update_dassault));
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_dassault)
+ GFXDECODE(config, "gfxdecode", m_palette, gfx_dassault);
PALETTE(config, m_palette).set_format(palette_device::xBGR_888, 4096);
- MCFG_DEVICE_ADD("spriteram1", BUFFERED_SPRITERAM16)
- MCFG_DEVICE_ADD("spriteram2", BUFFERED_SPRITERAM16)
+ BUFFERED_SPRITERAM16(config, m_spriteram[0]);
+ BUFFERED_SPRITERAM16(config, m_spriteram[1]);
DECO16IC(config, m_deco_tilegen[0], 0);
m_deco_tilegen[0]->set_split(0);
@@ -603,9 +603,9 @@ MACHINE_CONFIG_START(dassault_state::dassault)
GENERIC_LATCH_8(config, m_soundlatch);
m_soundlatch->data_pending_callback().set_inputline(m_audiocpu, 0); // IRQ1
- MCFG_DEVICE_ADD("ym1", YM2203, XTAL(32'220'000)/8)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 0.40)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 0.40)
+ ym2203_device &ym1(YM2203(config, "ym1", XTAL(32'220'000)/8));
+ ym1.add_route(ALL_OUTPUTS, "lspeaker", 0.40);
+ ym1.add_route(ALL_OUTPUTS, "rspeaker", 0.40);
ym2151_device &ym2(YM2151(config, "ym2", XTAL(32'220'000)/9));
ym2.irq_handler().set_inputline(m_audiocpu, 1);
@@ -613,14 +613,14 @@ MACHINE_CONFIG_START(dassault_state::dassault)
ym2.add_route(0, "lspeaker", 0.45);
ym2.add_route(1, "rspeaker", 0.45);
- MCFG_DEVICE_ADD("oki1", OKIM6295, XTAL(32'220'000)/32, okim6295_device::PIN7_HIGH) // verified
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 0.50)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 0.50)
+ okim6295_device &oki1(OKIM6295(config, "oki1", XTAL(32'220'000)/32, okim6295_device::PIN7_HIGH)); // verified
+ oki1.add_route(ALL_OUTPUTS, "lspeaker", 0.50);
+ oki1.add_route(ALL_OUTPUTS, "rspeaker", 0.50);
- MCFG_DEVICE_ADD("oki2", OKIM6295, XTAL(32'220'000)/16, okim6295_device::PIN7_HIGH) // verified
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 0.25)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 0.25)
-MACHINE_CONFIG_END
+ OKIM6295(config, m_oki2, XTAL(32'220'000)/16, okim6295_device::PIN7_HIGH); // verified
+ m_oki2->add_route(ALL_OUTPUTS, "lspeaker", 0.25);
+ m_oki2->add_route(ALL_OUTPUTS, "rspeaker", 0.25);
+}
/**********************************************************************************/
diff --git a/src/mame/drivers/datum.cpp b/src/mame/drivers/datum.cpp
index d774b737b66..6b957acd9a1 100644
--- a/src/mame/drivers/datum.cpp
+++ b/src/mame/drivers/datum.cpp
@@ -182,10 +182,11 @@ WRITE8_MEMBER( datum_state::pb_w )
}
-MACHINE_CONFIG_START(datum_state::datum)
+void datum_state::datum(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu",M6802, XTAL(4'000'000)) // internally divided to 1 MHz
- MCFG_DEVICE_PROGRAM_MAP(datum_mem)
+ M6802(config, m_maincpu, XTAL(4'000'000)); // internally divided to 1 MHz
+ m_maincpu->set_addrmap(AS_PROGRAM, &datum_state::datum_mem);
/* video hardware */
config.set_default_layout(layout_datum);
@@ -202,8 +203,8 @@ MACHINE_CONFIG_START(datum_state::datum)
pia2.irqa_handler().set_inputline("maincpu", M6802_IRQ_LINE);
pia2.irqb_handler().set_inputline("maincpu", M6802_IRQ_LINE);
- MCFG_DEVICE_ADD("acia", ACIA6850, 0) // rs232
-MACHINE_CONFIG_END
+ ACIA6850(config, "acia", 0); // rs232
+}
/* ROM definition */
diff --git a/src/mame/drivers/dblcrown.cpp b/src/mame/drivers/dblcrown.cpp
index 77399816668..55eab934533 100644
--- a/src/mame/drivers/dblcrown.cpp
+++ b/src/mame/drivers/dblcrown.cpp
@@ -599,26 +599,26 @@ It needs at least 64 instances because 0xa05b will be eventually nuked by the vb
}
-MACHINE_CONFIG_START(dblcrown_state::dblcrown)
-
+void dblcrown_state::dblcrown(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, CPU_CLOCK)
- MCFG_DEVICE_PROGRAM_MAP(dblcrown_map)
- MCFG_DEVICE_IO_MAP(dblcrown_io)
- MCFG_TIMER_DRIVER_ADD_SCANLINE("scantimer", dblcrown_state, dblcrown_irq_scanline, "screen", 0, 1)
+ Z80(config, m_maincpu, CPU_CLOCK);
+ m_maincpu->set_addrmap(AS_PROGRAM, &dblcrown_state::dblcrown_map);
+ m_maincpu->set_addrmap(AS_IO, &dblcrown_state::dblcrown_io);
+ TIMER(config, "scantimer").configure_scanline(FUNC(dblcrown_state::dblcrown_irq_scanline), "screen", 0, 1);
WATCHDOG_TIMER(config, m_watchdog).set_time(attotime::from_msec(1000)); /* 1000 ms. (minimal of MAX693A watchdog long timeout period with internal oscillator) */
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500))
- MCFG_SCREEN_UPDATE_DRIVER(dblcrown_state, screen_update)
- MCFG_SCREEN_SIZE(64*8, 64*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 40*8-1, 2*8, 30*8-1)
- MCFG_SCREEN_PALETTE(m_palette)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500));
+ screen.set_screen_update(FUNC(dblcrown_state::screen_update));
+ screen.set_size(64*8, 64*8);
+ screen.set_visarea(0*8, 40*8-1, 2*8, 30*8-1);
+ screen.set_palette(m_palette);
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, m_palette, gfx_dblcrown)
+ GFXDECODE(config, m_gfxdecode, m_palette, gfx_dblcrown);
PALETTE(config, m_palette, FUNC(dblcrown_state::dblcrown_palette), 0x100);
@@ -632,7 +632,7 @@ MACHINE_CONFIG_START(dblcrown_state::dblcrown)
/* sound hardware */
SPEAKER(config, "mono").front_center();
YMZ284(config, "ymz", SND_CLOCK).add_route(ALL_OUTPUTS, "mono", 0.75);
-MACHINE_CONFIG_END
+}
/***************************************************************************
diff --git a/src/mame/drivers/dblewing.cpp b/src/mame/drivers/dblewing.cpp
index f973a632dcd..8f45fc625a7 100644
--- a/src/mame/drivers/dblewing.cpp
+++ b/src/mame/drivers/dblewing.cpp
@@ -352,35 +352,34 @@ DECOSPR_PRIORITY_CB_MEMBER(dblewing_state::pri_callback)
return 0; // sprites always on top?
}
-MACHINE_CONFIG_START(dblewing_state::dblewing)
-
+void dblewing_state::dblewing(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M68000, XTAL(28'000'000)/2) /* DE102 */
- MCFG_DEVICE_PROGRAM_MAP(dblewing_map)
- MCFG_DEVICE_OPCODES_MAP(decrypted_opcodes_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", dblewing_state, irq6_line_hold)
+ M68000(config, m_maincpu, XTAL(28'000'000)/2); /* DE102 */
+ m_maincpu->set_addrmap(AS_PROGRAM, &dblewing_state::dblewing_map);
+ m_maincpu->set_addrmap(AS_OPCODES, &dblewing_state::decrypted_opcodes_map);
+ m_maincpu->set_vblank_int("screen", FUNC(dblewing_state::irq6_line_hold));
- MCFG_DEVICE_ADD("audiocpu", Z80, XTAL(32'220'000)/9)
- MCFG_DEVICE_PROGRAM_MAP(sound_map)
- MCFG_DEVICE_IO_MAP(sound_io)
+ Z80(config, m_audiocpu, XTAL(32'220'000)/9);
+ m_audiocpu->set_addrmap(AS_PROGRAM, &dblewing_state::sound_map);
+ m_audiocpu->set_addrmap(AS_IO, &dblewing_state::sound_io);
- MCFG_INPUT_MERGER_ANY_HIGH("soundirq")
- MCFG_INPUT_MERGER_OUTPUT_HANDLER(INPUTLINE("audiocpu", 0))
+ INPUT_MERGER_ANY_HIGH(config, "soundirq").output_handler().set_inputline(m_audiocpu, 0);
- MCFG_QUANTUM_TIME(attotime::from_hz(6000))
+ config.m_minimum_quantum = attotime::from_hz(6000);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(58.443)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */)
- MCFG_SCREEN_SIZE(64*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 40*8-1, 1*8, 31*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(dblewing_state, screen_update_dblewing)
- MCFG_SCREEN_PALETTE("palette")
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(58.443);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500) /* not accurate */);
+ screen.set_size(64*8, 32*8);
+ screen.set_visarea(0*8, 40*8-1, 1*8, 31*8-1);
+ screen.set_screen_update(FUNC(dblewing_state::screen_update_dblewing));
+ screen.set_palette("palette");
PALETTE(config, "palette").set_format(palette_device::xBGR_444, 4096);
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_dblewing)
+ GFXDECODE(config, "gfxdecode", "palette", gfx_dblewing);
DECO16IC(config, m_deco_tilegen, 0);
m_deco_tilegen->set_split(0);
@@ -419,9 +418,8 @@ MACHINE_CONFIG_START(dblewing_state::dblewing)
ymsnd.irq_handler().set("soundirq", FUNC(input_merger_device::in_w<1>));
ymsnd.add_route(ALL_OUTPUTS, "mono", 1.0);
- MCFG_DEVICE_ADD("oki", OKIM6295, XTAL(28'000'000)/28, okim6295_device::PIN7_HIGH)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.00)
-MACHINE_CONFIG_END
+ OKIM6295(config, "oki", XTAL(28'000'000)/28, okim6295_device::PIN7_HIGH).add_route(ALL_OUTPUTS, "mono", 1.00);
+}
diff --git a/src/mame/drivers/dbox.cpp b/src/mame/drivers/dbox.cpp
index 88e8b5e7bf4..51d635b7da4 100644
--- a/src/mame/drivers/dbox.cpp
+++ b/src/mame/drivers/dbox.cpp
@@ -603,7 +603,8 @@ void dbox_state::dbox_map(address_map &map)
static INPUT_PORTS_START( dbox )
INPUT_PORTS_END
-MACHINE_CONFIG_START(dbox_state::dbox)
+void dbox_state::dbox(machine_config &config)
+{
M68340(config, m_maincpu, 0); // The 68340 has an internal VCO as clock source, hence need no CPU clock
m_maincpu->set_crystal(XTAL(32'768)); // The dbox uses the VCO and has a crystal as VCO reference and to synthesize internal clocks from
m_maincpu->set_addrmap(AS_PROGRAM, &dbox_state::dbox_map);
@@ -614,9 +615,8 @@ MACHINE_CONFIG_START(dbox_state::dbox)
//m_maincpu->tgate2_in_callback().set("dsc", FUNC(descrambler_device::rxd_receiver));
/* Configure the serial ports */
- MCFG_DEVICE_MODIFY("maincpu:serial")
- MCFG_MC68340SER_A_TX_CALLBACK(WRITELINE("rs232", rs232_port_device, write_txd))
- MCFG_MC68340SER_B_TX_CALLBACK(WRITELINE("modem", rs232_port_device, write_txd))
+ subdevice<mc68340_serial_module_device>("maincpu:serial")->a_tx_cb().set("rs232", FUNC(rs232_port_device::write_txd));
+ subdevice<mc68340_serial_module_device>("maincpu:serial")->b_tx_cb().set("modem", FUNC(rs232_port_device::write_txd));
rs232_port_device &rs232(RS232_PORT(config, "rs232", default_rs232_devices, nullptr));
rs232.rxd_handler().set("maincpu:serial", FUNC(mc68340_serial_module_device::rx_a_w));
rs232_port_device &modem(RS232_PORT(config, "modem", default_rs232_devices, nullptr));
@@ -626,13 +626,13 @@ MACHINE_CONFIG_START(dbox_state::dbox)
AMD_29F800B_16BIT(config, "flash");
/* LED Matrix Display */
- MCFG_SDA5708_ADD("display")
+ SDA5708(config, m_display, 0);
config.set_default_layout(layout_sda5708);
/* IP16 74256 8 bit latch */
LATCH8(config, m_ip16_74259);
m_ip16_74259->write_cb<4>().set("display", FUNC(sda5708_device::reset_w));
-MACHINE_CONFIG_END
+}
void dbox_state::init_dbox()
{
diff --git a/src/mame/drivers/dbz.cpp b/src/mame/drivers/dbz.cpp
index 0044a9b50f5..2555c1aa644 100644
--- a/src/mame/drivers/dbz.cpp
+++ b/src/mame/drivers/dbz.cpp
@@ -324,25 +324,25 @@ void dbz_state::machine_reset()
m_control = 0;
}
-MACHINE_CONFIG_START(dbz_state::dbz)
-
+void dbz_state::dbz(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M68000, 16000000)
- MCFG_DEVICE_PROGRAM_MAP(dbz_map)
- MCFG_TIMER_DRIVER_ADD_SCANLINE("scantimer", dbz_state, dbz_scanline, "screen", 0, 1)
+ M68000(config, m_maincpu, 16000000);
+ m_maincpu->set_addrmap(AS_PROGRAM, &dbz_state::dbz_map);
+ TIMER(config, "scantimer").configure_scanline(FUNC(dbz_state::dbz_scanline), "screen", 0, 1);
- MCFG_DEVICE_ADD("audiocpu", Z80, 4000000)
- MCFG_DEVICE_PROGRAM_MAP(dbz_sound_map)
- MCFG_DEVICE_IO_MAP(dbz_sound_io_map)
+ Z80(config, m_audiocpu, 4000000);
+ m_audiocpu->set_addrmap(AS_PROGRAM, &dbz_state::dbz_sound_map);
+ m_audiocpu->set_addrmap(AS_IO, &dbz_state::dbz_sound_io_map);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(55)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(64*8, 40*8)
- MCFG_SCREEN_VISIBLE_AREA(0, 48*8-1, 0, 32*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(dbz_state, screen_update_dbz)
- MCFG_SCREEN_PALETTE("palette")
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(55);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(64*8, 40*8);
+ screen.set_visarea(0, 48*8-1, 0, 32*8-1);
+ screen.set_screen_update(FUNC(dbz_state::screen_update_dbz));
+ screen.set_palette("palette");
GFXDECODE(config, m_gfxdecode, "palette", gfx_dbz);
@@ -382,10 +382,10 @@ MACHINE_CONFIG_START(dbz_state::dbz)
ymsnd.add_route(0, "lspeaker", 1.0);
ymsnd.add_route(1, "rspeaker", 1.0);
- MCFG_DEVICE_ADD("oki", OKIM6295, 1056000, okim6295_device::PIN7_HIGH)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 1.0)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 1.0)
-MACHINE_CONFIG_END
+ okim6295_device &oki(OKIM6295(config, "oki", 1056000, okim6295_device::PIN7_HIGH));
+ oki.add_route(ALL_OUTPUTS, "lspeaker", 1.0);
+ oki.add_route(ALL_OUTPUTS, "rspeaker", 1.0);
+}
/**********************************************************************************/
diff --git a/src/mame/drivers/dccons.cpp b/src/mame/drivers/dccons.cpp
index e9e1be60cba..062def2d2e3 100644
--- a/src/mame/drivers/dccons.cpp
+++ b/src/mame/drivers/dccons.cpp
@@ -317,6 +317,18 @@ void dc_cons_state::init_dcjp()
init_dc();
}
+void dc_cons_state::init_tream()
+{
+ // Modchip connected to BIOS ROM chip changes 4 bytes (actually bits) as shown below, which allow to boot any region games.
+ u8 *rom = (u8 *)memregion("maincpu")->base();
+ rom[0x503] |= 0x40;
+ rom[0x50f] |= 0x40;
+ rom[0x523] |= 0x40;
+ rom[0x531] |= 0x40;
+
+ init_dcus();
+}
+
READ64_MEMBER(dc_cons_state::dc_pdtra_r )
{
uint64_t out = PCTRA<<32;
@@ -581,7 +593,8 @@ void dc_cons_state::gdrom_config(device_t *device)
MCFG_SOUND_ROUTE(1, "^^aica", 1.0)
}
-MACHINE_CONFIG_START(dc_cons_state::dc)
+void dc_cons_state::dc(machine_config &config)
+{
/* basic machine hardware */
SH4LE(config, m_maincpu, CPU_CLOCK);
m_maincpu->set_md(0, 1);
@@ -597,10 +610,10 @@ MACHINE_CONFIG_START(dc_cons_state::dc)
m_maincpu->set_addrmap(AS_PROGRAM, &dc_cons_state::dc_map);
m_maincpu->set_addrmap(AS_IO, &dc_cons_state::dc_port);
- MCFG_TIMER_DRIVER_ADD_SCANLINE("scantimer", dc_state, dc_scanline, "screen", 0, 1)
+ TIMER(config, "scantimer").configure_scanline(FUNC(dc_state::dc_scanline), "screen", 0, 1);
- MCFG_DEVICE_ADD("soundcpu", ARM7, ((XTAL(33'868'800)*2)/3)/8) // AICA bus clock is 2/3rds * 33.8688. ARM7 gets 1 bus cycle out of each 8.
- MCFG_DEVICE_PROGRAM_MAP(dc_audio_map)
+ ARM7(config, m_soundcpu, ((XTAL(33'868'800)*2)/3)/8); // AICA bus clock is 2/3rds * 33.8688. ARM7 gets 1 bus cycle out of each 8.
+ m_soundcpu->set_addrmap(AS_PROGRAM, &dc_cons_state::dc_audio_map);
MCFG_MACHINE_RESET_OVERRIDE(dc_cons_state,dc_console )
@@ -646,10 +659,10 @@ MACHINE_CONFIG_START(dc_cons_state::dc)
dcctrl3.set_port_tag<7>("P4:A5");
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_RAW_PARAMS(13458568*2, 857, 0, 640, 524, 0, 480) /* TODO: where pclk actually comes? */
- MCFG_SCREEN_UPDATE_DEVICE("powervr2", powervr2_device, screen_update)
- MCFG_PALETTE_ADD("palette", 0x1000)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_raw(13458568*2, 857, 0, 640, 524, 0, 480); /* TODO: where pclk actually comes? */
+ screen.set_screen_update("powervr2", FUNC(powervr2_device::screen_update));
+ PALETTE(config, "palette").set_entries(0x1000);
POWERVR2(config, m_powervr2, 0);
m_powervr2->irq_callback().set(FUNC(dc_state::pvr_irq));
@@ -668,13 +681,13 @@ MACHINE_CONFIG_START(dc_cons_state::dc)
ATA_INTERFACE(config, m_ata, 0);
m_ata->irq_handler().set(FUNC(dc_cons_state::ata_interrupt));
- MCFG_DEVICE_MODIFY("ata:0")
- MCFG_SLOT_OPTION_ADD("gdrom", GDROM)
- MCFG_SLOT_OPTION_MACHINE_CONFIG("gdrom", gdrom_config)
- MCFG_SLOT_DEFAULT_OPTION("gdrom")
+ ata_slot_device &ata_0(*subdevice<ata_slot_device>("ata:0"));
+ ata_0.option_add("gdrom", GDROM);
+ ata_0.set_option_machine_config("gdrom", gdrom_config);
+ ata_0.set_default_option("gdrom");
- MCFG_SOFTWARE_LIST_ADD("cd_list","dc")
-MACHINE_CONFIG_END
+ SOFTWARE_LIST(config, "cd_list").set_original("dc");
+}
#define ROM_LOAD_BIOS(bios,name,offset,length,hash) \
@@ -765,15 +778,15 @@ ROM_END
// unauthorised portable modification
ROM_START( dctream )
ROM_REGION(0x200000, "maincpu", 0)
- // multi-region hack of mpr-21931/1.01d BIOS, hardware checksum protection passes OK due to algorithm weakness
- ROM_LOAD( "dc_bios.bin", 0x000000, 0x200000, CRC(cff88d0d) SHA1(e3f84705b183ffded0a349ac7f2ab00be2ab74ee) ) // dumped in software way, ROM label unknown
+ // uses regular mpr-21931 BIOS chip, have region-free mod-chip installed, see driver init.
+ ROM_LOAD( "mpr-21931.ic501", 0x000000, 0x200000, CRC(89f2b1a1) SHA1(8951d1bb219ab2ff8583033d2119c899cc81f18c) )
ROM_REGION(0x020000, "dcflash", 0)
ROM_LOAD( "dc_flash.bin", 0x000000, 0x020000, CRC(9d5515c4) SHA1(78a86fd4e8b58fc9d3535eef6591178f1b97ecf9) ) // VA1 NTSC-US
ROM_END
-// normally, with DIP switch 4 off, HKT-100/110/120 AKA "Katana Set 5.xx", will be booted from flash ROM IC507 (first 2 dumps below)
-// otherwise it boots from EPROM which contain system checker software (last dump)
+// normally, with DIP switch 4 off, HKT-0100/0110/0120 AKA "Katana Set 5.xx", will be booted from flash ROM IC507 (first 2 dumps below)
+// otherwise it boots from EPROM which contain system checker software (last 2 dumps)
ROM_START( dcdev )
ROM_REGION(0x200000, "maincpu", 0)
ROM_SYSTEM_BIOS(0, "1011", "Katana Set5 v1.011 (World)") // BOOT flash rom update from Katana SDK R9-R11, WinCE SDK v2.1
@@ -782,11 +795,14 @@ ROM_START( dcdev )
ROM_LOAD_BIOS(1, "set5v1.001.ic507", 0x000000, 0x200000, CRC(5702d38f) SHA1(ea7a3ae1de73683008dd795c252941a4fc81b42e) )
// 27C160 EPROM (DIP42) IC??? labeled
+ // SET5 7676
+ // V0.71 98/11/13
+ ROM_SYSTEM_BIOS(2, "071", "Katana Set5 Checker v0.71")
+ ROM_LOAD_BIOS(2, "set5v0.71.bin", 0x000000, 0x200000, CRC(52d01969) SHA1(28aec4a01419d2d2a664c540bef30ea289ca0644) )
// SET5 FC52
// V0.41 98/08/27
- // also known to exists v0.71 98/11/13
- ROM_SYSTEM_BIOS(2, "041", "Katana Set5 Checker v0.41")
- ROM_LOAD_BIOS(2, "set5v0.41.bin", 0x000000, 0x200000, CRC(485877bd) SHA1(dc1af1f1248ffa87d57bc5ef2ea41aac95ecfc5e) )
+ ROM_SYSTEM_BIOS(3, "041", "Katana Set5 Checker v0.41")
+ ROM_LOAD_BIOS(3, "set5v0.41.bin", 0x000000, 0x200000, CRC(485877bd) SHA1(dc1af1f1248ffa87d57bc5ef2ea41aac95ecfc5e) )
ROM_REGION(0x020000, "dcflash", 0)
ROM_LOAD( "hkt-0120-flash.bin", 0x000000, 0x020000, CRC(7784c304) SHA1(31ef57f550d8cd13e40263cbc657253089e53034) ) // Dev.Boxes have empty (FF filled) flash ROM
@@ -796,5 +812,5 @@ ROM_END
CONS( 1999, dc, dcjp, 0, dc, dc, dc_cons_state, init_dcus, "Sega", "Dreamcast (USA, NTSC)", MACHINE_NOT_WORKING )
CONS( 1998, dcjp, 0, 0, dc, dc, dc_cons_state, init_dcjp, "Sega", "Dreamcast (Japan, NTSC)", MACHINE_NOT_WORKING )
CONS( 1999, dceu, dcjp, 0, dc, dc, dc_cons_state, init_dcus, "Sega", "Dreamcast (Europe, PAL)", MACHINE_NOT_WORKING )
-CONS( 200?, dctream, dcjp, 0, dc, dc, dc_cons_state, init_dcus, "<unknown>", "Treamcast", MACHINE_NOT_WORKING )
+CONS( 200?, dctream, dcjp, 0, dc, dc, dc_cons_state, init_tream,"<unknown>", "Treamcast", MACHINE_NOT_WORKING )
CONS( 1998, dcdev, 0, 0, dc, dc, dc_cons_state, init_dc, "Sega", "HKT-0120 Sega Dreamcast Development Box", MACHINE_NOT_WORKING )
diff --git a/src/mame/drivers/dcheese.cpp b/src/mame/drivers/dcheese.cpp
index beda6b290d3..ae549e95787 100644
--- a/src/mame/drivers/dcheese.cpp
+++ b/src/mame/drivers/dcheese.cpp
@@ -69,17 +69,17 @@ IRQ_CALLBACK_MEMBER(dcheese_state::irq_callback)
}
-void dcheese_state::dcheese_signal_irq(int which )
+void dcheese_state::signal_irq(u8 which)
{
m_irq_state[which] = 1;
update_irq_state();
}
-INTERRUPT_GEN_MEMBER(dcheese_state::dcheese_vblank)
+INTERRUPT_GEN_MEMBER(dcheese_state::vblank)
{
logerror("---- VBLANK ----\n");
- dcheese_signal_irq(4);
+ signal_irq(4);
}
@@ -117,7 +117,7 @@ WRITE16_MEMBER(dcheese_state::eeprom_control_w)
/* bits $0080-$0010 are probably lamps */
if (ACCESSING_BITS_0_7)
{
- ioport("EEPROMOUT")->write(data, 0xff);
+ m_eepromout_io->write(data, 0xff);
}
}
@@ -138,7 +138,7 @@ READ8_MEMBER(dcheese_state::sound_status_r)
WRITE8_MEMBER(dcheese_state::sound_control_w)
{
- uint8_t diff = data ^ m_sound_control;
+ u8 const diff = data ^ m_sound_control;
m_sound_control = data;
/* bit 0x20 = LED */
@@ -173,7 +173,7 @@ WRITE8_MEMBER(dcheese_state::bsmt_data_w)
void dcheese_state::main_cpu_map(address_map &map)
{
map.unmap_value_high();
- map(0x000000, 0x03ffff).rom();
+ map(0x000000, 0x03ffff).rom().region("maincpu", 0);
map(0x100000, 0x10ffff).ram();
map(0x200000, 0x200001).portr("200000").w("watchdog", FUNC(watchdog_timer_device::reset16_w));
map(0x220000, 0x220001).portr("220000").w(FUNC(dcheese_state::blitter_color_w));
@@ -200,7 +200,7 @@ void dcheese_state::sound_cpu_map(address_map &map)
map(0x0800, 0x0800).mirror(0x07ff).r(m_soundlatch, FUNC(generic_latch_8_device::read));
map(0x1000, 0x10ff).mirror(0x0700).w(FUNC(dcheese_state::bsmt_data_w));
map(0x1800, 0x1fff).ram();
- map(0x2000, 0xffff).rom();
+ map(0x2000, 0xffff).rom().region("audiocpu", 0x2000);
}
@@ -371,31 +371,31 @@ INPUT_PORTS_END
*
*************************************/
-MACHINE_CONFIG_START(dcheese_state::dcheese)
-
+void dcheese_state::dcheese(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M68000, MAIN_OSC)
- MCFG_DEVICE_PROGRAM_MAP(main_cpu_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", dcheese_state, dcheese_vblank)
- MCFG_DEVICE_IRQ_ACKNOWLEDGE_DRIVER(dcheese_state,irq_callback)
+ M68000(config, m_maincpu, MAIN_OSC);
+ m_maincpu->set_addrmap(AS_PROGRAM, &dcheese_state::main_cpu_map);
+ m_maincpu->set_vblank_int("screen", FUNC(dcheese_state::vblank));
+ m_maincpu->set_irq_acknowledge_callback(FUNC(dcheese_state::irq_callback));
- MCFG_DEVICE_ADD("audiocpu", M6809, SOUND_OSC/16)
- MCFG_DEVICE_PROGRAM_MAP(sound_cpu_map)
- MCFG_DEVICE_PERIODIC_INT_DRIVER(dcheese_state, irq1_line_hold, 480) /* accurate for fredmem */
+ M6809(config, m_audiocpu, SOUND_OSC/16); // TODO : Unknown CPU type
+ m_audiocpu->set_addrmap(AS_PROGRAM, &dcheese_state::sound_cpu_map);
+ m_audiocpu->set_periodic_int(FUNC(dcheese_state::irq1_line_hold), attotime::from_hz(480)); /* accurate for fredmem */
EEPROM_93C46_16BIT(config, "eeprom");
- MCFG_TICKET_DISPENSER_ADD("ticket", attotime::from_msec(200), TICKET_MOTOR_ACTIVE_HIGH, TICKET_STATUS_ACTIVE_LOW)
+ TICKET_DISPENSER(config, "ticket", attotime::from_msec(200), TICKET_MOTOR_ACTIVE_HIGH, TICKET_STATUS_ACTIVE_LOW);
WATCHDOG_TIMER(config, "watchdog");
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_SIZE(360, 262) /* guess, need to see what the games write to the vid registers */
- MCFG_SCREEN_VISIBLE_AREA(0, 319, 0, 239)
- MCFG_SCREEN_UPDATE_DRIVER(dcheese_state, screen_update_dcheese)
- MCFG_SCREEN_PALETTE("palette")
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_refresh_hz(60);
+ m_screen->set_size(360, 262); /* guess, need to see what the games write to the vid registers */
+ m_screen->set_visarea(0, 319, 0, 239);
+ m_screen->set_screen_update(FUNC(dcheese_state::screen_update));
+ m_screen->set_palette("palette");
PALETTE(config, "palette", FUNC(dcheese_state::dcheese_palette), 65536);
@@ -406,17 +406,18 @@ MACHINE_CONFIG_START(dcheese_state::dcheese)
GENERIC_LATCH_8(config, m_soundlatch);
m_soundlatch->data_pending_callback().set_inputline(m_audiocpu, 0);
- MCFG_DEVICE_ADD("bsmt", BSMT2000, SOUND_OSC)
- MCFG_SOUND_ROUTE(0, "lspeaker", 1.2)
- MCFG_SOUND_ROUTE(1, "rspeaker", 1.2)
-MACHINE_CONFIG_END
+ BSMT2000(config, m_bsmt, SOUND_OSC);
+ m_bsmt->add_route(0, "lspeaker", 1.2);
+ m_bsmt->add_route(1, "rspeaker", 1.2);
+}
-MACHINE_CONFIG_START(dcheese_state::fredmem)
+void dcheese_state::fredmem(machine_config &config)
+{
dcheese(config);
- MCFG_SCREEN_MODIFY("screen")
- MCFG_SCREEN_VISIBLE_AREA(0, 359, 0, 239)
-MACHINE_CONFIG_END
+
+ m_screen->set_visarea(0, 359, 0, 239);
+}
@@ -760,7 +761,7 @@ ROM_START( cecmatch )
ROM_RELOAD( 0x3c0000, 0x40000 )
ROM_REGION16_LE( 0x20000, "palrom", 0 )
- ROM_LOAD16_BYTE( "0.144", 0x00000, 0x10000, CRC(69b3cc85) SHA1(05f7204ac961274b5d2f42cc6c0d06e5fa146aef)) /* Palette - 0 at U144 */
+ ROM_LOAD16_BYTE( "0.144", 0x00000, 0x10000, CRC(69b3cc85) SHA1(05f7204ac961274b5d2f42cc6c0d06e5fa146aef) ) /* Palette - 0 at U144 */
ROM_LOAD16_BYTE( "1.145", 0x00001, 0x10000, CRC(e64a8511) SHA1(0e3a1fe936c841b8acfb150bf63e564b1dec2363) ) /* Palette - 1 at U145 */
ROM_END
diff --git a/src/mame/drivers/dday.cpp b/src/mame/drivers/dday.cpp
index 00d67128fb4..7a061fc3215 100644
--- a/src/mame/drivers/dday.cpp
+++ b/src/mame/drivers/dday.cpp
@@ -254,21 +254,21 @@ void dday_state::machine_reset()
}
-MACHINE_CONFIG_START(dday_state::dday)
-
+void dday_state::dday(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, 2000000) /* 2 MHz ? */
- MCFG_DEVICE_PROGRAM_MAP(dday_map)
+ Z80(config, m_maincpu, 2000000); /* 2 MHz ? */
+ m_maincpu->set_addrmap(AS_PROGRAM, &dday_state::dday_map);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */)
- MCFG_SCREEN_SIZE(32*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 0*8, 28*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(dday_state, screen_update_dday)
- MCFG_SCREEN_PALETTE(m_palette)
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_refresh_hz(60);
+ m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(2500) /* not accurate */);
+ m_screen->set_size(32*8, 32*8);
+ m_screen->set_visarea(0*8, 32*8-1, 0*8, 28*8-1);
+ m_screen->set_screen_update(FUNC(dday_state::screen_update_dday));
+ m_screen->set_palette(m_palette);
GFXDECODE(config, m_gfxdecode, m_palette, gfx_dday);
PALETTE(config, m_palette, FUNC(dday_state::dday_palette), 256).enable_shadows();
@@ -279,7 +279,7 @@ MACHINE_CONFIG_START(dday_state::dday)
AY8910(config, m_ay1, 1000000).add_route(ALL_OUTPUTS, "mono", 0.25);
AY8910(config, "ay2", 1000000).add_route(ALL_OUTPUTS, "mono", 0.25);
-MACHINE_CONFIG_END
+}
diff --git a/src/mame/drivers/ddayjlc.cpp b/src/mame/drivers/ddayjlc.cpp
index 1e4c1f1e2ea..9681a93f218 100644
--- a/src/mame/drivers/ddayjlc.cpp
+++ b/src/mame/drivers/ddayjlc.cpp
@@ -599,28 +599,28 @@ void ddayjlc_state::ddayjlc_palette(palette_device &palette) const
palette.set_pen_color(0x203, rgb_t(0xff, 0xff, 0xff));
}
-MACHINE_CONFIG_START(ddayjlc_state::ddayjlc)
-
+void ddayjlc_state::ddayjlc(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80,12000000/3)
- MCFG_DEVICE_PROGRAM_MAP(main_map)
+ Z80(config, m_maincpu, 12000000/3);
+ m_maincpu->set_addrmap(AS_PROGRAM, &ddayjlc_state::main_map);
- MCFG_DEVICE_ADD("audiocpu", Z80, 12000000/4)
- MCFG_DEVICE_PROGRAM_MAP(sound_map)
+ Z80(config, m_audiocpu, 12000000/4);
+ m_audiocpu->set_addrmap(AS_PROGRAM, &ddayjlc_state::sound_map);
- MCFG_QUANTUM_TIME(attotime::from_hz(6000))
+ config.m_minimum_quantum = attotime::from_hz(6000);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(32*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(ddayjlc_state, screen_update_ddayjlc)
- MCFG_SCREEN_PALETTE(m_palette)
- MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE(*this, ddayjlc_state, vblank_irq))
-
- MCFG_DEVICE_ADD(m_gfxdecode, GFXDECODE, m_palette, gfx_ddayjlc)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(32*8, 32*8);
+ screen.set_visarea(0*8, 32*8-1, 2*8, 30*8-1);
+ screen.set_screen_update(FUNC(ddayjlc_state::screen_update_ddayjlc));
+ screen.set_palette(m_palette);
+ screen.screen_vblank().set(FUNC(ddayjlc_state::vblank_irq));
+
+ GFXDECODE(config, m_gfxdecode, m_palette, gfx_ddayjlc);
PALETTE(config, m_palette, FUNC(ddayjlc_state::ddayjlc_palette), 0x200+4);
SPEAKER(config, "mono").front_center();
@@ -632,7 +632,7 @@ MACHINE_CONFIG_START(ddayjlc_state::ddayjlc)
ay1.add_route(ALL_OUTPUTS, "mono", 1.0);
AY8910(config, "ay2", 12000000/6).add_route(ALL_OUTPUTS, "mono", 1.0);
-MACHINE_CONFIG_END
+}
ROM_START( ddayjlc )
diff --git a/src/mame/drivers/ddealer.cpp b/src/mame/drivers/ddealer.cpp
index 834f0a91ddf..d46ca085054 100644
--- a/src/mame/drivers/ddealer.cpp
+++ b/src/mame/drivers/ddealer.cpp
@@ -628,33 +628,32 @@ void ddealer_state::machine_reset()
m_coin_input = 0;
}
-MACHINE_CONFIG_START(ddealer_state::ddealer)
-
- MCFG_DEVICE_ADD("maincpu" , M68000, XTAL(16'000'000)/2) /* 8MHz */
- MCFG_DEVICE_PROGRAM_MAP(ddealer_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", ddealer_state, irq4_line_hold)
- MCFG_DEVICE_PERIODIC_INT_DRIVER(ddealer_state, irq1_line_hold, 90)//guess, controls music tempo, 112 is way too fast
+void ddealer_state::ddealer(machine_config &config)
+{
+ M68000(config, m_maincpu, XTAL(16'000'000)/2); /* 8MHz */
+ m_maincpu->set_addrmap(AS_PROGRAM, &ddealer_state::ddealer_map);
+ m_maincpu->set_vblank_int("screen", FUNC(ddealer_state::irq4_line_hold));
+ m_maincpu->set_periodic_int(FUNC(ddealer_state::irq1_line_hold), attotime::from_hz(90)); //guess, controls music tempo, 112 is way too fast
// M50747 or NMK-110 8131 MCU
GFXDECODE(config, m_gfxdecode, m_palette, gfx_ddealer);
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(512, 256)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 48*8-1, 2*8, 30*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(ddealer_state, screen_update)
- MCFG_SCREEN_PALETTE(m_palette)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(512, 256);
+ screen.set_visarea(0*8, 48*8-1, 2*8, 30*8-1);
+ screen.set_screen_update(FUNC(ddealer_state::screen_update));
+ screen.set_palette(m_palette);
PALETTE(config, m_palette).set_format(palette_device::RRRRGGGGBBBBRGBx, 0x200);
- MCFG_TIMER_DRIVER_ADD_PERIODIC("coinsim", ddealer_state, mcu_sim, attotime::from_hz(10000))
+ TIMER(config, "coinsim").configure_periodic(FUNC(ddealer_state::mcu_sim), attotime::from_hz(10000));
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("ymsnd", YM2203, XTAL(6'000'000) / 8) /* 7.5KHz */
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.40)
-MACHINE_CONFIG_END
+ YM2203(config, "ymsnd", XTAL(6'000'000) / 8).add_route(ALL_OUTPUTS, "mono", 0.40); /* 7.5KHz */
+}
diff --git a/src/mame/drivers/ddenlovr.cpp b/src/mame/drivers/ddenlovr.cpp
index ef3e339ba7f..e05af0653f3 100644
--- a/src/mame/drivers/ddenlovr.cpp
+++ b/src/mame/drivers/ddenlovr.cpp
@@ -4331,8 +4331,8 @@ void dynax_state::htengoku_banked_map(address_map &map)
map(0x80000, 0x801ff).w(FUNC(dynax_state::tenkai_palette_w));
}
-MACHINE_CONFIG_START(ddenlovr_state::htengoku)
-
+void ddenlovr_state::htengoku(machine_config &config)
+{
/* basic machine hardware */
Z80(config, m_maincpu, 20000000 / 4);
m_maincpu->set_addrmap(AS_PROGRAM, &ddenlovr_state::htengoku_mem_map);
@@ -4392,7 +4392,7 @@ MACHINE_CONFIG_START(ddenlovr_state::htengoku)
/* devices */
msm6242_device &rtc(MSM6242(config, "rtc", XTAL(32'768)));
rtc.out_int_handler().set("mainirq", FUNC(rst_pos_buffer_device::rst1_w));
-MACHINE_CONFIG_END
+}
/***************************************************************************
@@ -9692,8 +9692,8 @@ WRITE_LINE_MEMBER(ddenlovr_state::ddenlovr_irq)
m_maincpu->set_input_line(M68K_IRQ_1, HOLD_LINE);
}
-MACHINE_CONFIG_START(ddenlovr_state::ddenlovr)
-
+void ddenlovr_state::ddenlovr(machine_config &config)
+{
/* basic machine hardware */
M68000(config, m_maincpu, XTAL(24'000'000) / 2);
m_maincpu->set_addrmap(AS_PROGRAM, &ddenlovr_state::ddenlovr_map);
@@ -9730,14 +9730,14 @@ MACHINE_CONFIG_START(ddenlovr_state::ddenlovr)
YMZ284(config, "aysnd", XTAL(28'636'363) / 16).add_route(ALL_OUTPUTS, "mono", 0.30); // or /8 ?
- okim6295_device &oki(OKIM6295(config, "oki", XTAL(28'636'363) / 28, okim6295_device::PIN7_HIGH));
- oki.add_route(ALL_OUTPUTS, "mono", 0.80);
+ OKIM6295(config, m_oki, XTAL(28'636'363) / 28, okim6295_device::PIN7_HIGH).add_route(ALL_OUTPUTS, "mono", 0.80);
/* devices */
RTC72421(config, "rtc", XTAL(32'768)); // internal oscillator
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(ddenlovr_state::ddenlovj)
+void ddenlovr_state::ddenlovj(machine_config &config)
+{
ddenlovr(config);
/* basic machine hardware */
@@ -9748,7 +9748,7 @@ MACHINE_CONFIG_START(ddenlovr_state::ddenlovj)
m_mainlatch->q_out_cb<5>().set(FUNC(ddenlovr_state::ddenlovr_blitter_irq_ack_w));
RTC62421(config.replace(), "rtc", XTAL(32'768)); // internal oscillator
-MACHINE_CONFIG_END
+}
void ddenlovr_state::ddenlovrk(machine_config &config)
{
@@ -10061,7 +10061,7 @@ void ddenlovr_state::kotbinyo(machine_config &config)
m_screen->set_visarea(0, 336-1-1, 1+4, 256-15-1+4);
m_screen->set_screen_update(FUNC(ddenlovr_state::screen_update_ddenlovr));
m_screen->set_video_attributes(VIDEO_ALWAYS_UPDATE);
- m_screen->set_palette("palette");
+ m_screen->set_palette(m_palette);
m_screen->screen_vblank().set(FUNC(ddenlovr_state::hanakanz_irq));
PALETTE(config, m_palette).set_entries(0x200);
@@ -10077,8 +10077,7 @@ void ddenlovr_state::kotbinyo(machine_config &config)
m_oki->add_route(ALL_OUTPUTS, "mono", 0.80);
/* devices */
-// MCFG_DEVICE_ADD("rtc", MSM6242, XTAL(32'768))
-// MCFG_MSM6242_OUT_INT_HANDLER(WRITELINE(*this, ddenlovr_state, hanakanz_rtc_irq))
+// MSM6242(config, "rtc", XTAL(32'768)).out_int_handler().set(FUNC(ddenlovr_state::hanakanz_rtc_irq));
}
void ddenlovr_state::kotbinsp(machine_config &config)
@@ -10432,7 +10431,8 @@ void ddenlovr_state::mjflove(machine_config &config)
AY8910(config, "aysnd", 28636363/8).add_route(ALL_OUTPUTS, "mono", 0.30);
}
-MACHINE_CONFIG_START(ddenlovr_state::hparadis)
+void ddenlovr_state::hparadis(machine_config &config)
+{
quizchq(config);
/* basic machine hardware */
@@ -10443,33 +10443,33 @@ MACHINE_CONFIG_START(ddenlovr_state::hparadis)
maincpu.out_pb_callback().set(FUNC(ddenlovr_state::hparadis_select_w));
// the RTC seems unused
- MCFG_DEVICE_REMOVE("rtc")
+ config.device_remove("rtc");
MCFG_MACHINE_START_OVERRIDE(ddenlovr_state,hparadis)
-MACHINE_CONFIG_END
-
-MACHINE_CONFIG_START(ddenlovr_state::jongtei)
+}
+void ddenlovr_state::jongtei(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu",Z80, XTAL(20'000'000) / 2) // KL5C80A12
- MCFG_DEVICE_PROGRAM_MAP(hanakanz_map)
- MCFG_DEVICE_IO_MAP(jongtei_portmap)
+ Z80(config, m_maincpu, XTAL(20'000'000) / 2); // KL5C80A12
+ m_maincpu->set_addrmap(AS_PROGRAM, &ddenlovr_state::hanakanz_map);
+ m_maincpu->set_addrmap(AS_IO, &ddenlovr_state::jongtei_portmap);
MCFG_MACHINE_START_OVERRIDE(ddenlovr_state,hanakanz)
MCFG_MACHINE_RESET_OVERRIDE(ddenlovr_state,ddenlovr)
/* video hardware */
- MCFG_SCREEN_ADD(m_screen, RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(336, 256)
- MCFG_SCREEN_VISIBLE_AREA(0, 336-1, 5, 256-11-1)
- MCFG_SCREEN_UPDATE_DRIVER(ddenlovr_state, screen_update_ddenlovr)
- MCFG_SCREEN_VIDEO_ATTRIBUTES(VIDEO_ALWAYS_UPDATE)
- MCFG_SCREEN_PALETTE("palette")
- MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE(*this, ddenlovr_state, hanakanz_irq))
-
- MCFG_PALETTE_ADD("palette", 0x200)
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_refresh_hz(60);
+ m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ m_screen->set_size(336, 256);
+ m_screen->set_visarea(0, 336-1, 5, 256-11-1);
+ m_screen->set_screen_update(FUNC(ddenlovr_state::screen_update_ddenlovr));
+ m_screen->set_video_attributes(VIDEO_ALWAYS_UPDATE);
+ m_screen->set_palette(m_palette);
+ m_screen->screen_vblank().set(FUNC(ddenlovr_state::hanakanz_irq));
+
+ PALETTE(config, m_palette).set_entries(0x200);
blitter_irq().set(FUNC(ddenlovr_state::mjflove_blitter_irq));
@@ -10480,30 +10480,27 @@ MACHINE_CONFIG_START(ddenlovr_state::jongtei)
YM2413(config, "ym2413", XTAL(28'636'363) / 8).add_route(ALL_OUTPUTS, "mono", 0.80);
- MCFG_DEVICE_ADD("oki", OKIM6295, XTAL(28'636'363) / 28, okim6295_device::PIN7_HIGH)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.80)
+ OKIM6295(config, m_oki, XTAL(28'636'363) / 28, okim6295_device::PIN7_HIGH).add_route(ALL_OUTPUTS, "mono", 0.80);
/* devices */
- MCFG_DEVICE_ADD("rtc", MSM6242, XTAL(32'768))
- MCFG_MSM6242_OUT_INT_HANDLER(WRITELINE(*this, ddenlovr_state, hanakanz_rtc_irq))
-MACHINE_CONFIG_END
+ MSM6242(config, "rtc", XTAL(32'768)).out_int_handler().set(FUNC(ddenlovr_state::hanakanz_rtc_irq));
+}
-MACHINE_CONFIG_START(ddenlovr_state::mjgnight)
+void ddenlovr_state::mjgnight(machine_config &config)
+{
jongtei(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_IO_MAP(mjgnight_portmap)
+ m_maincpu->set_addrmap(AS_IO, &ddenlovr_state::mjgnight_portmap);
- MCFG_SCREEN_MODIFY("screen")
- MCFG_SCREEN_SIZE(336, 256)
- MCFG_SCREEN_VISIBLE_AREA(0, 336-1, 5-4, 256-11-1-4)
-MACHINE_CONFIG_END
+ m_screen->set_size(336, 256);
+ m_screen->set_visarea(0, 336-1, 5-4, 256-11-1-4);
+}
/***************************************************************************
Mahjong Seiryu Densetsu
***************************************************************************/
-MACHINE_CONFIG_START(ddenlovr_state::sryudens)
-
+void ddenlovr_state::sryudens(machine_config &config)
+{
/* basic machine hardware */
tmpz84c015_device &maincpu(TMPZ84C015(config, m_maincpu, XTAL(16'000'000) / 2)); // ?
maincpu.set_addrmap(AS_PROGRAM, &ddenlovr_state::sryudens_map);
@@ -10515,17 +10512,17 @@ MACHINE_CONFIG_START(ddenlovr_state::sryudens)
MCFG_MACHINE_RESET_OVERRIDE(ddenlovr_state,ddenlovr)
/* video hardware */
- MCFG_SCREEN_ADD(m_screen, RASTER)
- MCFG_SCREEN_REFRESH_RATE(60.8532) // VSync 60.8532Hz, HSync 15.2790kHz
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(336, 256+22)
- MCFG_SCREEN_VISIBLE_AREA(0, 336-1, 0+5, 256-12-1)
- MCFG_SCREEN_UPDATE_DRIVER(ddenlovr_state, screen_update_ddenlovr)
- MCFG_SCREEN_VIDEO_ATTRIBUTES(VIDEO_ALWAYS_UPDATE)
- MCFG_SCREEN_PALETTE("palette")
- MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE("maincpu", tmpz84c015_device, trg0))
-
- MCFG_PALETTE_ADD("palette", 0x100)
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_refresh_hz(60.8532); // VSync 60.8532Hz, HSync 15.2790kHz
+ m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ m_screen->set_size(336, 256+22);
+ m_screen->set_visarea(0, 336-1, 0+5, 256-12-1);
+ m_screen->set_screen_update(FUNC(ddenlovr_state::screen_update_ddenlovr));
+ m_screen->set_video_attributes(VIDEO_ALWAYS_UPDATE);
+ m_screen->set_palette(m_palette);
+ m_screen->screen_vblank().set(m_maincpu, FUNC(tmpz84c015_device::trg0));
+
+ PALETTE(config, m_palette).set_entries(0x100);
blitter_irq().set(FUNC(ddenlovr_state::mjflove_blitter_irq));
@@ -10538,21 +10535,19 @@ MACHINE_CONFIG_START(ddenlovr_state::sryudens)
YMZ284(config, "aysnd", XTAL(28'636'363) / 8).add_route(ALL_OUTPUTS, "mono", 0.30);
- MCFG_DEVICE_ADD("oki", OKIM6295, XTAL(28'636'363) / 28, okim6295_device::PIN7_HIGH) // ?
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.80)
+ OKIM6295(config, m_oki, XTAL(28'636'363) / 28, okim6295_device::PIN7_HIGH).add_route(ALL_OUTPUTS, "mono", 0.80); // ?
/* devices */
- MCFG_DEVICE_ADD("rtc", RTC62421, XTAL(32'768)) // internal oscillator
- MCFG_MSM6242_OUT_INT_HANDLER(WRITELINE("maincpu", tmpz84c015_device, trg1))
-MACHINE_CONFIG_END
+ RTC62421(config, "rtc", XTAL(32'768)).out_int_handler().set(m_maincpu, FUNC(tmpz84c015_device::trg1)); // internal oscillator
+}
/***************************************************************************
Mahjong Janshin Plus
***************************************************************************/
// PCB: NM7001004
-MACHINE_CONFIG_START(ddenlovr_state::janshinp)
-
+void ddenlovr_state::janshinp(machine_config &config)
+{
/* basic machine hardware */
tmpz84c015_device &maincpu(TMPZ84C015(config, m_maincpu, XTAL(16'000'000) / 2));
maincpu.set_addrmap(AS_PROGRAM, &ddenlovr_state::janshinp_map);
@@ -10564,17 +10559,17 @@ MACHINE_CONFIG_START(ddenlovr_state::janshinp)
MCFG_MACHINE_RESET_OVERRIDE(ddenlovr_state,ddenlovr)
/* video hardware */
- MCFG_SCREEN_ADD(m_screen, RASTER)
- MCFG_SCREEN_REFRESH_RATE(60.8532) // VSync 60.8532Hz, HSync 15.2790kHz ?
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(336, 256+22)
- MCFG_SCREEN_VISIBLE_AREA(0, 336-1, 0+5, 256-12-1)
- MCFG_SCREEN_UPDATE_DRIVER(ddenlovr_state, screen_update_ddenlovr)
- MCFG_SCREEN_VIDEO_ATTRIBUTES(VIDEO_ALWAYS_UPDATE)
- MCFG_SCREEN_PALETTE("palette")
- MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE("maincpu", tmpz84c015_device, trg0))
-
- MCFG_PALETTE_ADD("palette", 0x100)
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_refresh_hz(60.8532); // VSync 60.8532Hz, HSync 15.2790kHz ?
+ m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ m_screen->set_size(336, 256+22);
+ m_screen->set_visarea(0, 336-1, 0+5, 256-12-1);
+ m_screen->set_screen_update(FUNC(ddenlovr_state::screen_update_ddenlovr));
+ m_screen->set_video_attributes(VIDEO_ALWAYS_UPDATE);
+ m_screen->set_palette(m_palette);
+ m_screen->screen_vblank().set(m_maincpu, FUNC(tmpz84c015_device::trg0));
+
+ PALETTE(config, m_palette).set_entries(0x100);
blitter_irq().set(FUNC(ddenlovr_state::mjflove_blitter_irq));
@@ -10587,13 +10582,11 @@ MACHINE_CONFIG_START(ddenlovr_state::janshinp)
YMZ284(config, "aysnd", XTAL(28'636'363) / 8).add_route(ALL_OUTPUTS, "mono", 0.30);
- MCFG_DEVICE_ADD("oki", OKIM6295, XTAL(28'636'363) / 28, okim6295_device::PIN7_HIGH) // ?
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.80)
+ OKIM6295(config, m_oki, XTAL(28'636'363) / 28, okim6295_device::PIN7_HIGH).add_route(ALL_OUTPUTS, "mono", 0.80); // ?
/* devices */
- MCFG_DEVICE_ADD("rtc", MSM6242, XTAL(32'768))
- MCFG_MSM6242_OUT_INT_HANDLER(WRITELINE("maincpu", tmpz84c015_device, trg1))
-MACHINE_CONFIG_END
+ MSM6242(config, "rtc", XTAL(32'768)).out_int_handler().set(m_maincpu, FUNC(tmpz84c015_device::trg1));
+}
// Same PCB as janshinp
void ddenlovr_state::dtoyoken(machine_config &config)
@@ -10622,8 +10615,8 @@ MACHINE_START_MEMBER(ddenlovr_state,seljan2)
MACHINE_START_CALL_MEMBER(ddenlovr);
}
-MACHINE_CONFIG_START(ddenlovr_state::seljan2)
-
+void ddenlovr_state::seljan2(machine_config &config)
+{
/* basic machine hardware */
tmpz84c015_device &maincpu(TMPZ84C015(config, m_maincpu, XTAL(16'000'000) / 2));
maincpu.set_addrmap(AS_PROGRAM, &ddenlovr_state::seljan2_map);
@@ -10635,17 +10628,17 @@ MACHINE_CONFIG_START(ddenlovr_state::seljan2)
MCFG_MACHINE_RESET_OVERRIDE(ddenlovr_state,ddenlovr)
/* video hardware */
- MCFG_SCREEN_ADD(m_screen, RASTER)
- MCFG_SCREEN_REFRESH_RATE(60.8532) // VSync 60.8532Hz, HSync 15.2790kHz ?
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(336, 256+22)
- MCFG_SCREEN_VISIBLE_AREA(0, 336-1, 0+5, 256-12-1)
- MCFG_SCREEN_UPDATE_DRIVER(ddenlovr_state, screen_update_ddenlovr)
- MCFG_SCREEN_VIDEO_ATTRIBUTES(VIDEO_ALWAYS_UPDATE)
- MCFG_SCREEN_PALETTE("palette")
- MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE("maincpu", tmpz84c015_device, trg0))
-
- MCFG_PALETTE_ADD("palette", 0x100)
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_refresh_hz(60.8532); // VSync 60.8532Hz, HSync 15.2790kHz ?
+ m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ m_screen->set_size(336, 256+22);
+ m_screen->set_visarea(0, 336-1, 0+5, 256-12-1);
+ m_screen->set_screen_update(FUNC(ddenlovr_state::screen_update_ddenlovr));
+ m_screen->set_video_attributes(VIDEO_ALWAYS_UPDATE);
+ m_screen->set_palette(m_palette);
+ m_screen->screen_vblank().set(m_maincpu, FUNC(tmpz84c015_device::trg0));
+
+ PALETTE(config, m_palette).set_entries(0x100);
blitter_irq().set("maincpu", FUNC(tmpz84c015_device::pa7_w)).invert(); // PA bit 7 = blitter busy
@@ -10661,13 +10654,11 @@ MACHINE_CONFIG_START(ddenlovr_state::seljan2)
aysnd.port_b_write_callback().set(FUNC(ddenlovr_state::ddenlovr_select_w));
aysnd.add_route(ALL_OUTPUTS, "mono", 0.30);
- MCFG_DEVICE_ADD("oki", OKIM6295, XTAL(28'636'363) / 28, okim6295_device::PIN7_HIGH) // ?
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.80)
+ OKIM6295(config, m_oki, XTAL(28'636'363) / 28, okim6295_device::PIN7_HIGH).add_route(ALL_OUTPUTS, "mono", 0.80); // ?
/* devices */
- MCFG_DEVICE_ADD("rtc", MSM6242, XTAL(32'768))
- MCFG_MSM6242_OUT_INT_HANDLER(WRITELINE("maincpu", tmpz84c015_device, trg1))
-MACHINE_CONFIG_END
+ MSM6242(config, "rtc", XTAL(32'768)).out_int_handler().set(m_maincpu, FUNC(tmpz84c015_device::trg1));
+}
/***************************************************************************
@@ -10675,28 +10666,28 @@ MACHINE_CONFIG_END
***************************************************************************/
-MACHINE_CONFIG_START(ddenlovr_state::daimyojn)
-
+void ddenlovr_state::daimyojn(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu",Z80, XTAL(20'000'000) / 2)
- MCFG_DEVICE_PROGRAM_MAP(hanakanz_map)
- MCFG_DEVICE_IO_MAP(daimyojn_portmap)
+ Z80(config, m_maincpu, XTAL(20'000'000) / 2);
+ m_maincpu->set_addrmap(AS_PROGRAM, &ddenlovr_state::hanakanz_map);
+ m_maincpu->set_addrmap(AS_IO, &ddenlovr_state::daimyojn_portmap);
MCFG_MACHINE_START_OVERRIDE(ddenlovr_state,mjflove)
MCFG_MACHINE_RESET_OVERRIDE(ddenlovr_state,ddenlovr)
/* video hardware */
- MCFG_SCREEN_ADD(m_screen, RASTER)
- MCFG_SCREEN_REFRESH_RATE(59.7922) // HSync 15.4248kHz
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(336, 256+22)
- MCFG_SCREEN_VISIBLE_AREA(0, 336-1-1, 1, 256-15-1)
- MCFG_SCREEN_UPDATE_DRIVER(ddenlovr_state, screen_update_ddenlovr)
- MCFG_SCREEN_VIDEO_ATTRIBUTES(VIDEO_ALWAYS_UPDATE)
- MCFG_SCREEN_PALETTE("palette")
- MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE(*this, ddenlovr_state, hanakanz_irq))
-
- MCFG_PALETTE_ADD("palette", 0x200)
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_refresh_hz(59.7922); // HSync 15.4248kHz
+ m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ m_screen->set_size(336, 256+22);
+ m_screen->set_visarea(0, 336-1-1, 1, 256-15-1);
+ m_screen->set_screen_update(FUNC(ddenlovr_state::screen_update_ddenlovr));
+ m_screen->set_video_attributes(VIDEO_ALWAYS_UPDATE);
+ m_screen->set_palette(m_palette);
+ m_screen->screen_vblank().set(FUNC(ddenlovr_state::hanakanz_irq));
+
+ PALETTE(config, m_palette).set_entries(0x200);
MCFG_VIDEO_START_OVERRIDE(ddenlovr_state,hanakanz) // blitter commands in the roms are shuffled around
@@ -10705,13 +10696,11 @@ MACHINE_CONFIG_START(ddenlovr_state::daimyojn)
YM2413(config, "ym2413", XTAL(28'636'363) / 8).add_route(ALL_OUTPUTS, "mono", 0.80);
- MCFG_DEVICE_ADD("oki", OKIM6295, XTAL(28'636'363) / 28, okim6295_device::PIN7_HIGH)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.80)
+ OKIM6295(config, m_oki, XTAL(28'636'363) / 28, okim6295_device::PIN7_HIGH).add_route(ALL_OUTPUTS, "mono", 0.80);
/* devices */
- MCFG_DEVICE_ADD("rtc", MSM6242, XTAL(32'768))
- MCFG_MSM6242_OUT_INT_HANDLER(WRITELINE(*this, ddenlovr_state, hanakanz_rtc_irq))
-MACHINE_CONFIG_END
+ MSM6242(config, "rtc", XTAL(32'768)).out_int_handler().set(FUNC(ddenlovr_state::hanakanz_rtc_irq));
+}
diff --git a/src/mame/drivers/ddragon.cpp b/src/mame/drivers/ddragon.cpp
index 192bd3140a3..19efd23349f 100644
--- a/src/mame/drivers/ddragon.cpp
+++ b/src/mame/drivers/ddragon.cpp
@@ -20,7 +20,7 @@ Removed now-unnecessary workarounds.
Modifications by Bryan McPhail, June-November 2003:
Correct video & interrupt timing derived from Xain schematics and confirmed on real DD board.
-Corrected interrupt handling, epecially to MCU (but one semi-hack remains).
+Corrected interrupt handling, especially to MCU (but one semi-hack remains).
TStrike now boots but sprites don't appear (I had them working at one point, can't remember what broke them again).
Dangerous Dungeons fixed.
World version of Double Dragon added (actually same roms as the bootleg, but confirmed from real board)
@@ -944,14 +944,14 @@ GFXDECODE_END
void ddragon_state::ddragon(machine_config &config)
{
/* basic machine hardware */
- HD6309E(config, m_maincpu, MAIN_CLOCK / 4); /* HD63C09EP, 3 MHz */
+ HD6309E(config, m_maincpu, MAIN_CLOCK / 4); /* HD63C09EP, 3 MHz */
m_maincpu->set_addrmap(AS_PROGRAM, &ddragon_state::ddragon_map);
TIMER(config, "scantimer").configure_scanline(FUNC(ddragon_state::ddragon_scanline), "screen", 0, 1);
- HD63701(config, m_subcpu, MAIN_CLOCK / 2); /* HD63701YOP, 6 MHz / 4 internally */
+ HD63701(config, m_subcpu, MAIN_CLOCK / 2); /* HD63701YOP, 6 MHz / 4 internally */
m_subcpu->set_addrmap(AS_PROGRAM, &ddragon_state::sub_map);
- MC6809(config, m_soundcpu, MAIN_CLOCK / 2); /* HD68A09P, 6 MHz / 4 internally */
+ MC6809(config, m_soundcpu, MAIN_CLOCK / 2); /* HD68A09P, 6 MHz / 4 internally */
m_soundcpu->set_addrmap(AS_PROGRAM, &ddragon_state::sound_map);
config.m_minimum_quantum = attotime::from_hz(60000); /* heavy interleaving to sync up sprite<->main CPUs */
@@ -1015,14 +1015,14 @@ void ddragon_state::ddragonba(machine_config &config)
void ddragon_state::ddragon6809(machine_config &config)
{
/* basic machine hardware */
- MC6809E(config, m_maincpu, MAIN_CLOCK / 8); /* 1.5 MHz */
+ MC6809E(config, m_maincpu, MAIN_CLOCK / 8); /* 1.5 MHz */
m_maincpu->set_addrmap(AS_PROGRAM, &ddragon_state::ddragon_map);
TIMER(config, "scantimer").configure_scanline(FUNC(ddragon_state::ddragon_scanline), "screen", 0, 1);
- MC6809E(config, m_subcpu, MAIN_CLOCK / 8); /* 1.5 Mhz */
+ MC6809E(config, m_subcpu, MAIN_CLOCK / 8); /* 1.5 Mhz */
m_subcpu->set_addrmap(AS_PROGRAM, &ddragon_state::sub_map);
- MC6809E(config, m_soundcpu, MAIN_CLOCK / 8); /* 1.5 MHz */
+ MC6809E(config, m_soundcpu, MAIN_CLOCK / 8); /* 1.5 MHz */
m_soundcpu->set_addrmap(AS_PROGRAM, &ddragon_state::sound_map);
config.m_minimum_quantum = attotime::from_hz(60000); /* heavy interleaving to sync up sprite<->main CPUs */
@@ -1066,11 +1066,11 @@ void ddragon_state::ddragon6809(machine_config &config)
void ddragon_state::ddragon2(machine_config &config)
{
/* basic machine hardware */
- HD6309E(config, m_maincpu, MAIN_CLOCK / 4); /* HD63C09EP, 3 MHz */
+ HD6309E(config, m_maincpu, MAIN_CLOCK / 4); /* HD63C09EP, 3 MHz */
m_maincpu->set_addrmap(AS_PROGRAM, &ddragon_state::dd2_map);
TIMER(config, "scantimer").configure_scanline(FUNC(ddragon_state::ddragon_scanline), "screen", 0, 1);
- Z80(config, m_subcpu, MAIN_CLOCK / 3); /* 4 MHz */
+ Z80(config, m_subcpu, MAIN_CLOCK / 3); /* 4 MHz */
m_subcpu->set_addrmap(AS_PROGRAM, &ddragon_state::dd2_sub_map);
Z80(config, m_soundcpu, 3579545);
@@ -1706,17 +1706,16 @@ ROM_START( ddragon2 )
ROM_LOAD( "prom.16", 0x0000, 0x0200, CRC(46339529) SHA1(64f4c42a826d67b7cbaa8a23a45ebc4eb6248891) ) /* sprite timing (same as ddragon) */
ROM_END
-// came from a dead board, 2 of the program roms were failing
-// if you attempt to use ROMs from another set it fails on Game Over due to code which should be different at 0x1800 in ic63
+
ROM_START( ddragon2j )
ROM_REGION( 0x30000, "maincpu", 0 )
ROM_LOAD( "26a9-0_j.ic38", 0x08000, 0x8000, CRC(5e4fcdff) SHA1(78bf79a0b4f248c3355fef40448c76eb028f9163) )
ROM_LOAD( "26aa-0_j.ic52", 0x10000, 0x8000, CRC(bfb4ee04) SHA1(3692bbdef7d5b7cc3eb76362945b91b4a0f6ad4b) )
- ROM_LOAD( "26ab-0.ic53", 0x18000, 0x8000, NO_DUMP) // proper dump might match other sets
- ROM_LOAD( "26ac-0_j.ic63", 0x20000, 0x8000, NO_DUMP) // should be different
+ ROM_LOAD( "26ab-0.ic53", 0x18000, 0x8000, CRC(49ddddcd) SHA1(91dc53718d04718b313f23d86e241027c89d1a03) )
+ ROM_LOAD( "26ac-0_j.ic63", 0x20000, 0x8000, CRC(165858c7) SHA1(a00953df924cff9e79d28061849070f5401014d7) )
ROM_REGION( 0x10000, "sub", 0 ) /* sprite CPU 64kb (Upper 16kb = 0) */
- ROM_LOAD( "26ae-0.bin", 0x00000, 0x10000, CRC(ea437867) SHA1(cd910203af0565f981b9bdef51ea6e9c33ee82d3) )
+ ROM_LOAD( "26ae-0.ic37", 0x00000, 0x10000, CRC(ea437867) SHA1(cd910203af0565f981b9bdef51ea6e9c33ee82d3) )
ROM_REGION( 0x10000, "soundcpu", 0 ) /* music CPU, 64kb */
ROM_LOAD( "26ad-0.ic41", 0x00000, 0x8000, CRC(3788af3b) SHA1(7f8833b01522553c767c470a9c27d24e638f37b9) ) // why is this different, label was the same
@@ -2214,7 +2213,7 @@ GAME( 1987, ddragon6809a, ddragon, ddragon6809, ddragon, ddragon_state, init_
GAME( 1988, ddragon2, 0, ddragon2, ddragon2, ddragon_state, init_ddragon2, ROT0, "Technos Japan", "Double Dragon II - The Revenge (World)", MACHINE_SUPPORTS_SAVE )
GAME( 1988, ddragon2u, ddragon2, ddragon2, ddragon2, ddragon_state, init_ddragon2, ROT0, "Technos Japan", "Double Dragon II - The Revenge (US)", MACHINE_SUPPORTS_SAVE )
-GAME( 1988, ddragon2j, ddragon2, ddragon2, ddragon2, ddragon_state, init_ddragon2, ROT0, "Technos Japan", "Double Dragon II - The Revenge (Japan)", MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE ) // bad dump
+GAME( 1988, ddragon2j, ddragon2, ddragon2, ddragon2, ddragon_state, init_ddragon2, ROT0, "Technos Japan", "Double Dragon II - The Revenge (Japan)", MACHINE_SUPPORTS_SAVE )
GAME( 1988, ddragon2b, ddragon2, ddragon2, ddragon2, ddragon_state, init_ddragon2, ROT0, "bootleg", "Double Dragon II - The Revenge (US, bootleg)", MACHINE_SUPPORTS_SAVE )
/* these were conversions of double dragon */
diff --git a/src/mame/drivers/ddragon3.cpp b/src/mame/drivers/ddragon3.cpp
index deee7c6d491..ac3c7c9a629 100644
--- a/src/mame/drivers/ddragon3.cpp
+++ b/src/mame/drivers/ddragon3.cpp
@@ -820,22 +820,22 @@ void ddragon3_state::machine_reset()
m_bg_tilebase = 0;
}
-MACHINE_CONFIG_START(ddragon3_state::ddragon3)
-
+void ddragon3_state::ddragon3(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M68000, 20_MHz_XTAL / 2)
- MCFG_DEVICE_PROGRAM_MAP(ddragon3_map)
- MCFG_TIMER_DRIVER_ADD_SCANLINE("scantimer", ddragon3_state, ddragon3_scanline, "screen", 0, 1)
+ M68000(config, m_maincpu, 20_MHz_XTAL / 2);
+ m_maincpu->set_addrmap(AS_PROGRAM, &ddragon3_state::ddragon3_map);
+ TIMER(config, "scantimer").configure_scanline(FUNC(ddragon3_state::ddragon3_scanline), "screen", 0, 1);
- MCFG_DEVICE_ADD("audiocpu", Z80, XTAL(3'579'545))
- MCFG_DEVICE_PROGRAM_MAP(sound_map)
+ Z80(config, m_audiocpu, XTAL(3'579'545));
+ m_audiocpu->set_addrmap(AS_PROGRAM, &ddragon3_state::sound_map);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_RAW_PARAMS(28_MHz_XTAL / 4, 448, 0, 320, 272, 8, 248) /* HTOTAL and VTOTAL are guessed */
- MCFG_SCREEN_UPDATE_DRIVER(ddragon3_state, screen_update_ddragon3)
- MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE("spriteram", buffered_spriteram16_device, vblank_copy_rising))
- MCFG_SCREEN_PALETTE(m_palette)
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_raw(28_MHz_XTAL / 4, 448, 0, 320, 272, 8, 248); /* HTOTAL and VTOTAL are guessed */
+ m_screen->set_screen_update(FUNC(ddragon3_state::screen_update_ddragon3));
+ m_screen->screen_vblank().set(m_spriteram, FUNC(buffered_spriteram16_device::vblank_copy_rising));
+ m_screen->set_palette(m_palette);
GFXDECODE(config, m_gfxdecode, m_palette, gfx_ddragon3);
PALETTE(config, m_palette).set_format(palette_device::xBGR_555, 768);
@@ -854,66 +854,62 @@ MACHINE_CONFIG_START(ddragon3_state::ddragon3)
ym2151.add_route(0, "lspeaker", 0.50);
ym2151.add_route(1, "rspeaker", 0.50);
- MCFG_DEVICE_ADD("oki", OKIM6295, 1.056_MHz_XTAL, okim6295_device::PIN7_HIGH)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 1.50)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 1.50)
-MACHINE_CONFIG_END
+ OKIM6295(config, m_oki, 1.056_MHz_XTAL, okim6295_device::PIN7_HIGH);
+ m_oki->add_route(ALL_OUTPUTS, "lspeaker", 1.50);
+ m_oki->add_route(ALL_OUTPUTS, "rspeaker", 1.50);
+}
-MACHINE_CONFIG_START(ddragon3_state::ddragon3b)
+void ddragon3_state::ddragon3b(machine_config &config)
+{
ddragon3(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(dd3b_map)
+ m_maincpu->set_addrmap(AS_PROGRAM, &ddragon3_state::dd3b_map);
- MCFG_SCREEN_MODIFY("screen")
- MCFG_SCREEN_VBLANK_CALLBACK(NOOP)
-MACHINE_CONFIG_END
+ m_screen->screen_vblank().set_nop();
+}
-MACHINE_CONFIG_START(ddragon3_state::ctribe)
+void ddragon3_state::ctribe(machine_config &config)
+{
ddragon3(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(ctribe_map)
+ m_maincpu->set_addrmap(AS_PROGRAM, &ddragon3_state::ctribe_map);
- MCFG_DEVICE_MODIFY("audiocpu")
- MCFG_DEVICE_PROGRAM_MAP(ctribe_sound_map)
+ m_audiocpu->set_addrmap(AS_PROGRAM, &ddragon3_state::ctribe_sound_map);
m_palette->set_format(palette_device::xBGR_444, 768);
- MCFG_SCREEN_MODIFY("screen")
- MCFG_SCREEN_UPDATE_DRIVER(ddragon3_state, screen_update_ctribe)
- MCFG_SCREEN_VBLANK_CALLBACK(NOOP)
+ m_screen->set_screen_update(FUNC(ddragon3_state::screen_update_ctribe));
+ m_screen->screen_vblank().set_nop();
- MCFG_DEVICE_MODIFY("ym2151")
- MCFG_SOUND_ROUTES_RESET()
- MCFG_SOUND_ROUTE(0, "lspeaker", 1.20)
- MCFG_SOUND_ROUTE(1, "rspeaker", 1.20)
-
- MCFG_DEVICE_MODIFY("oki")
- MCFG_SOUND_ROUTES_RESET()
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 0.80)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 0.80)
-MACHINE_CONFIG_END
+ ym2151_device &ym2151(*subdevice<ym2151_device>("ym2151"));
+ ym2151.reset_routes();
+ ym2151.add_route(0, "lspeaker", 1.20);
+ ym2151.add_route(1, "rspeaker", 1.20);
+ m_oki->reset_routes();
+ m_oki->add_route(ALL_OUTPUTS, "lspeaker", 0.80);
+ m_oki->add_route(ALL_OUTPUTS, "rspeaker", 0.80);
+}
-MACHINE_CONFIG_START(wwfwfest_state::wwfwfest)
+void wwfwfest_state::wwfwfest(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M68000, 24_MHz_XTAL / 2) /* 24 crystal, 12 rated chip */
- MCFG_DEVICE_PROGRAM_MAP(main_map)
- MCFG_TIMER_DRIVER_ADD_SCANLINE("scantimer", ddragon3_state, ddragon3_scanline, "screen", 0, 1)
+ M68000(config, m_maincpu, 24_MHz_XTAL / 2); /* 24 crystal, 12 rated chip */
+ m_maincpu->set_addrmap(AS_PROGRAM, &wwfwfest_state::main_map);
+ TIMER(config, "scantimer").configure_scanline(FUNC(ddragon3_state::ddragon3_scanline), "screen", 0, 1);
- MCFG_DEVICE_ADD("audiocpu", Z80, XTAL(3'579'545))
- MCFG_DEVICE_PROGRAM_MAP(sound_map)
+ Z80(config, m_audiocpu, XTAL(3'579'545));
+ m_audiocpu->set_addrmap(AS_PROGRAM, &wwfwfest_state::sound_map);
/* video hardware */
BUFFERED_SPRITERAM16(config, m_spriteram);
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_RAW_PARAMS(28_MHz_XTAL / 4, 448, 0, 320, 272, 8, 248) /* HTOTAL and VTOTAL are guessed */
- MCFG_SCREEN_UPDATE_DRIVER(wwfwfest_state, screen_update_wwfwfest)
- MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE("spriteram", buffered_spriteram16_device, vblank_copy_rising))
- MCFG_SCREEN_PALETTE(m_palette)
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_raw(28_MHz_XTAL / 4, 448, 0, 320, 272, 8, 248); /* HTOTAL and VTOTAL are guessed */
+ m_screen->set_screen_update(FUNC(wwfwfest_state::screen_update_wwfwfest));
+ m_screen->screen_vblank().set(m_spriteram, FUNC(buffered_spriteram16_device::vblank_copy_rising));
+ m_screen->set_palette(m_palette);
GFXDECODE(config, m_gfxdecode, m_palette, gfx_wwfwfest);
PALETTE(config, m_palette).set_format(palette_device::xBGR_444, 8192);
@@ -929,14 +925,14 @@ MACHINE_CONFIG_START(wwfwfest_state::wwfwfest)
ym2151.add_route(0, "mono", 0.45);
ym2151.add_route(1, "mono", 0.45);
- MCFG_DEVICE_ADD("oki", OKIM6295, 1.056_MHz_XTAL, okim6295_device::PIN7_HIGH) /* Verified - Pin 7 tied to +5VDC */
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.90)
-MACHINE_CONFIG_END
+ OKIM6295(config, m_oki, 1.056_MHz_XTAL, okim6295_device::PIN7_HIGH).add_route(ALL_OUTPUTS, "mono", 0.90); /* Verified - Pin 7 tied to +5VDC */
+}
-MACHINE_CONFIG_START(wwfwfest_state::wwfwfstb)
+void wwfwfest_state::wwfwfstb(machine_config &config)
+{
wwfwfest(config);
MCFG_VIDEO_START_OVERRIDE(wwfwfest_state,wwfwfstb)
-MACHINE_CONFIG_END
+}
/*************************************
diff --git a/src/mame/drivers/ddribble.cpp b/src/mame/drivers/ddribble.cpp
index 83cf4e806d0..e632afca03c 100644
--- a/src/mame/drivers/ddribble.cpp
+++ b/src/mame/drivers/ddribble.cpp
@@ -257,33 +257,33 @@ void ddribble_state::machine_reset()
m_charbank[1] = 0;
}
-MACHINE_CONFIG_START(ddribble_state::ddribble)
-
+void ddribble_state::ddribble(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD(m_maincpu, MC6809E, XTAL(18'432'000)/12) /* verified on pcb */
- MCFG_DEVICE_PROGRAM_MAP(cpu0_map)
+ MC6809E(config, m_maincpu, XTAL(18'432'000)/12); /* verified on pcb */
+ m_maincpu->set_addrmap(AS_PROGRAM, &ddribble_state::cpu0_map);
- MCFG_DEVICE_ADD(m_cpu1, MC6809E, XTAL(18'432'000)/12) /* verified on pcb */
- MCFG_DEVICE_PROGRAM_MAP(cpu1_map)
+ MC6809E(config, m_cpu1, XTAL(18'432'000)/12); /* verified on pcb */
+ m_cpu1->set_addrmap(AS_PROGRAM, &ddribble_state::cpu1_map);
- MCFG_DEVICE_ADD("cpu2", MC6809E, XTAL(18'432'000)/12) /* verified on pcb */
- MCFG_DEVICE_PROGRAM_MAP(cpu2_map)
+ mc6809e_device &cpu2(MC6809E(config, "cpu2", XTAL(18'432'000)/12)); /* verified on pcb */
+ cpu2.set_addrmap(AS_PROGRAM, &ddribble_state::cpu2_map);
- MCFG_QUANTUM_TIME(attotime::from_hz(6000)) /* we need heavy synch */
+ config.m_minimum_quantum = attotime::from_hz(6000); /* we need heavy synch */
WATCHDOG_TIMER(config, "watchdog");
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(32*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1)
-/* MCFG_SCREEN_SIZE(64*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 64*8-1, 2*8, 30*8-1) */
- MCFG_SCREEN_UPDATE_DRIVER(ddribble_state, screen_update_ddribble)
- MCFG_SCREEN_PALETTE("palette")
- MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE(*this, ddribble_state, vblank_irq))
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(32*8, 32*8);
+ screen.set_visarea(0*8, 32*8-1, 2*8, 30*8-1);
+/* screen.set_size(64*8, 32*8);
+ screen.set_visarea(0*8, 64*8-1, 2*8, 30*8-1); */
+ screen.set_screen_update(FUNC(ddribble_state::screen_update_ddribble));
+ screen.set_palette("palette");
+ screen.screen_vblank().set(FUNC(ddribble_state::vblank_irq));
GFXDECODE(config, m_gfxdecode, "palette", gfx_ddribble);
PALETTE(config, "palette", FUNC(ddribble_state::ddribble_palette)).set_format(palette_device::xBGR_555, 64 + 256, 64);
@@ -299,17 +299,16 @@ MACHINE_CONFIG_START(ddribble_state::ddribble)
ymsnd.add_route(2, "filter3", 0.25);
ymsnd.add_route(3, "mono", 0.25);
- MCFG_DEVICE_ADD(m_vlm, VLM5030, XTAL(3'579'545)) /* verified on pcb */
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
- MCFG_DEVICE_ADDRESS_MAP(0, vlm_map)
-
- MCFG_DEVICE_ADD(m_filter1, FILTER_RC)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
- MCFG_DEVICE_ADD(m_filter2, FILTER_RC)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
- MCFG_DEVICE_ADD(m_filter3, FILTER_RC)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
-MACHINE_CONFIG_END
+ VLM5030(config, m_vlm, XTAL(3'579'545)); /* verified on pcb */
+ m_vlm->add_route(ALL_OUTPUTS, "mono", 1.0);
+ m_vlm->set_addrmap(0, &ddribble_state::vlm_map);
+
+ FILTER_RC(config, m_filter1).add_route(ALL_OUTPUTS, "mono", 1.0);
+
+ FILTER_RC(config, m_filter2).add_route(ALL_OUTPUTS, "mono", 1.0);
+
+ FILTER_RC(config, m_filter3).add_route(ALL_OUTPUTS, "mono", 1.0);
+}
ROM_START( ddribble )
diff --git a/src/mame/drivers/de_3.cpp b/src/mame/drivers/de_3.cpp
index 98c21f0d7ae..2ca8097353d 100644
--- a/src/mame/drivers/de_3.cpp
+++ b/src/mame/drivers/de_3.cpp
@@ -1000,6 +1000,20 @@ ROM_START(stwr_106s)
ROM_LOAD("s-wars.u21", 0x080000, 0x40000, CRC(7b08fdf1) SHA1(489d21a10e97e886f948d81dedd7f8de3acecd2b))
ROM_END
+ROM_START(stwr_a046)
+ ROM_REGION(0x10000, "maincpu", 0)
+ ROM_LOAD("starcpua.106", 0x0000, 0x10000, CRC(35d3cfd9) SHA1(14d8960f3657d7cd977b0a749e995aadb3fd4c7c))
+ ROM_REGION(0x10000, "cpu3", ROMREGION_ERASEFF)
+ ROM_REGION(0x80000, "gfx3", 0)
+ ROM_LOAD("sw4mrom1.a046", 0x00000, 0x40000, CRC(5ceac219) SHA1(76b7acf378f83bacf6c4adb020d6e544eacbac7a))
+ ROM_LOAD("sw4mrom0.a046", 0x40000, 0x40000, CRC(305e45be) SHA1(fbdc90175467a9ee59dc11c5ccbe83130b3644c8))
+ ROM_REGION(0x010000, "soundcpu", 0)
+ ROM_LOAD("s-wars.u7", 0x8000, 0x8000, CRC(cefa19d5) SHA1(7ddf9cc85ab601514305bc46083a07a3d087b286))
+ ROM_REGION(0x1000000, "bsmt", 0)
+ ROM_LOAD("s-wars.u17", 0x000000, 0x80000, CRC(7950a147) SHA1(f5bcd5cf6b35f9e4f14d62b084495c3a743d92a1))
+ ROM_LOAD("s-wars.u21", 0x080000, 0x40000, CRC(7b08fdf1) SHA1(489d21a10e97e886f948d81dedd7f8de3acecd2b))
+ROM_END
+
ROM_START(stwr_104)
ROM_REGION(0x10000, "maincpu", 0)
ROM_LOAD("starcpua.104", 0x0000, 0x10000, CRC(12b87cfa) SHA1(12e0ab52f6784beefce8291d29b8aff01b2f2818))
@@ -1314,6 +1328,7 @@ GAME(1992, trek_110, trek_201, de_3_dmd1, de_3, de_3_state, empty_init, ROT0,
GAME(1992, trek_11a, trek_201, de_3_dmd1, de_3, de_3_state, empty_init, ROT0, "Data East", "Star Trek 25th Anniversary (1.10 Alpha Display)", MACHINE_IS_SKELETON_MECHANICAL)
GAME(1992, stwr_106, 0, de_3_dmd2, de_3, de_3_state, empty_init, ROT0, "Data East", "Star Wars (1.06)", MACHINE_IS_SKELETON_MECHANICAL)
GAME(1992, stwr_106s, stwr_106, de_3_dmd2, de_3, de_3_state, empty_init, ROT0, "Data East", "Star Wars (1.06, Display S1.05)", MACHINE_IS_SKELETON_MECHANICAL)
+GAME(1992, stwr_a046, stwr_106, de_3_dmd2, de_3, de_3_state, empty_init, ROT0, "Data East", "Star Wars (1.06, Display A0.46)", MACHINE_IS_SKELETON_MECHANICAL)
GAME(1992, stwr_104, stwr_106, de_3_dmd2, de_3, de_3_state, empty_init, ROT0, "Data East", "Star Wars (1.04)", MACHINE_IS_SKELETON_MECHANICAL)
GAME(1992, stwr_103, stwr_106, de_3_dmd2, de_3, de_3_state, empty_init, ROT0, "Data East", "Star Wars (1.03)", MACHINE_IS_SKELETON_MECHANICAL)
GAME(1992, stwr_g11, stwr_106, de_3_dmd2, de_3, de_3_state, empty_init, ROT0, "Data East", "Star Wars (1.01 Germany)", MACHINE_IS_SKELETON_MECHANICAL)
diff --git a/src/mame/drivers/dec0.cpp b/src/mame/drivers/dec0.cpp
index f06acb827e0..105f03a1b83 100644
--- a/src/mame/drivers/dec0.cpp
+++ b/src/mame/drivers/dec0.cpp
@@ -26,11 +26,16 @@
* Midnight Resistance (USA set)
* Midnight Resistance (Japanese set)
* Boulderdash (World set)
+ * Bandit (USA set)
Heavy Barrel, Bad Dudes, Robocop, Birdie Try & Hippodrome use the 'MEC-M1'
motherboard and varying game boards. Sly Spy, Midnight Resistance and
Boulderdash use the same graphics chips but are different pcbs.
+ Bandit (USA) is almost certainly a field test prototype, the software runs
+ on a Heavy Barrel board including the original Heavy Barrel MCU (which is effectively
+ not used). There is also Japanese version known to run on a DE-0321-1 top board.
+
There are Secret Agent (bootleg) and Robocop (bootleg) sets to add.
Thanks to Gouky & Richard Bush for information along the way, especially
@@ -335,6 +340,7 @@ Notes:
#include "cpu/m6502/m6502.h"
#include "cpu/z80/z80.h"
#include "cpu/m6805/m68705.h"
+#include "machine/upd4701.h"
#include "sound/2203intf.h"
#include "sound/3812intf.h"
#include "sound/okim6295.h"
@@ -386,7 +392,6 @@ WRITE16_MEMBER(dec0_state::dec0_control_w)
}
}
-
WRITE16_MEMBER(dec0_automat_state::automat_control_w)
{
switch (offset << 1)
@@ -455,8 +460,23 @@ void dec0_state::dec0_map(address_map &map)
map(0x30c018, 0x30c019).nopr(); // clr.w for irq ack
map(0x310000, 0x3107ff).ram().w(m_palette, FUNC(palette_device::write16)).share("palette");
map(0x314000, 0x3147ff).ram().w(m_palette, FUNC(palette_device::write16_ext)).share("palette_ext");
+
+ map(0x318000, 0x31bfff).ram().share("ram"); // Bandit uses 318000/31c000 which are mirrors but exact mirror patten is unclear
+ map(0x31c000, 0x31c7ff).ram().share("spriteram");
+
map(0xff8000, 0xffbfff).ram().share("ram"); /* Main ram */
- map(0xffc000, 0xffc7ff).ram().share("spriteram"); /* Sprites */
+ map(0xffc000, 0xffc7ff).ram().share("spriteram");
+}
+
+void dec0_state::dec0_tb_map(address_map &map)
+{
+ dec0_map(map);
+ map(0x300010, 0x300017).r("tb0", FUNC(upd4701_device::read_xy)).umask16(0x00ff);
+ map(0x300018, 0x30001f).r("tb1", FUNC(upd4701_device::read_xy)).umask16(0x00ff);
+ map(0x300001, 0x300001).w("tb0", FUNC(upd4701_device::reset_x_w));
+ map(0x300009, 0x300009).w("tb0", FUNC(upd4701_device::reset_y_w));
+ map(0x300011, 0x300011).w("tb1", FUNC(upd4701_device::reset_x_w));
+ map(0x300019, 0x300019).w("tb1", FUNC(upd4701_device::reset_y_w));
}
void dec0_state::robocop_map(address_map &map)
@@ -676,9 +696,9 @@ void dec0_state::midresb_map(address_map &map)
void dec0_state::dec0_s_map(address_map &map)
{
- map(0x0000, 0x05ff).ram();
- map(0x0800, 0x0801).w("ym1", FUNC(ym2203_device::write));
- map(0x1000, 0x1001).w("ym2", FUNC(ym3812_device::write));
+ map(0x0000, 0x07ff).ram();
+ map(0x0800, 0x0801).rw("ym1", FUNC(ym2203_device::read), FUNC(ym2203_device::write));
+ map(0x1000, 0x1001).rw("ym2", FUNC(ym3812_device::read), FUNC(ym3812_device::write));
map(0x3000, 0x3000).r(m_soundlatch, FUNC(generic_latch_8_device::read));
map(0x3800, 0x3800).rw("oki", FUNC(okim6295_device::read), FUNC(okim6295_device::write));
map(0x8000, 0xffff).rom();
@@ -964,6 +984,20 @@ static INPUT_PORTS_START( rotary_ports )
PORT_BIT( 0xffff, 0x0000, IPT_POSITIONAL ) PORT_POSITIONS(12) PORT_WRAPS PORT_SENSITIVITY(10) PORT_KEYDELTA(1) PORT_REMAP_TABLE(rotary_table) PORT_PLAYER(2) PORT_REVERSE PORT_FULL_TURN_COUNT(12)
INPUT_PORTS_END
+static INPUT_PORTS_START( trackball_ports )
+ PORT_START("track_0")
+ PORT_BIT( 0x0fff, 0, IPT_TRACKBALL_X ) PORT_SENSITIVITY(50) PORT_KEYDELTA(24) PORT_RESET PORT_REVERSE PORT_PLAYER(1)
+
+ PORT_START("track_1")
+ PORT_BIT( 0x0fff, 0, IPT_TRACKBALL_Y ) PORT_SENSITIVITY(50) PORT_KEYDELTA(24) PORT_RESET PORT_PLAYER(1)
+
+ PORT_START("track_2")
+ PORT_BIT( 0x0fff, 0, IPT_TRACKBALL_X ) PORT_SENSITIVITY(50) PORT_KEYDELTA(24) PORT_RESET PORT_REVERSE PORT_PLAYER(2)
+
+ PORT_START("track_3")
+ PORT_BIT( 0x0fff, 0, IPT_TRACKBALL_Y ) PORT_SENSITIVITY(50) PORT_KEYDELTA(24) PORT_RESET PORT_PLAYER(2)
+INPUT_PORTS_END
+
static INPUT_PORTS_START( rotary_null )
PORT_START("AN0")
PORT_BIT( 0xffff, IP_ACTIVE_LOW, IPT_UNKNOWN )
@@ -972,6 +1006,7 @@ static INPUT_PORTS_START( rotary_null )
PORT_BIT( 0xffff, IP_ACTIVE_LOW, IPT_UNKNOWN )
INPUT_PORTS_END
+
static INPUT_PORTS_START( hbarrel )
PORT_INCLUDE( dec0 )
@@ -1029,6 +1064,101 @@ static INPUT_PORTS_START( hbarrel )
PORT_INCLUDE( rotary_ports )
INPUT_PORTS_END
+static INPUT_PORTS_START( bandit )
+ PORT_INCLUDE( dec0 )
+
+ PORT_MODIFY("INPUTS")
+ PORT_BIT( 0x0010, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_NAME("P1 Fire")
+ PORT_BIT( 0x0020, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_NAME("P1 Bomb")
+ PORT_BIT( 0x00c0, IP_ACTIVE_LOW, IPT_UNUSED )
+ PORT_BIT( 0x1000, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_COCKTAIL PORT_NAME("P2 Fire")
+ PORT_BIT( 0x2000, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_COCKTAIL PORT_NAME("P2 Bomb")
+ PORT_BIT( 0xc000, IP_ACTIVE_LOW, IPT_UNUSED )
+
+#if 0
+ PORT_DIPNAME( 0x0001, 0x0001, "UNK_0" )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPSETTING( 0x0001, DEF_STR( Off ) )
+ PORT_DIPNAME( 0x0002, 0x0002, "UNK_1" )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPSETTING( 0x0002, DEF_STR( Off ) )
+ PORT_DIPNAME( 0x0004, 0x0004, "UNK_2" )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPSETTING( 0x0004, DEF_STR( Off ) )
+ PORT_DIPNAME( 0x0008, 0x0008, "UNK_3" )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPSETTING( 0x0008, DEF_STR( Off ) )
+ PORT_DIPNAME( 0x0010, 0x0010, "UNK_4" ) // Gun
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPSETTING( 0x0010, DEF_STR( Off ) )
+ PORT_DIPNAME( 0x0020, 0x0020, "UNK_5" ) // Missile
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPSETTING( 0x0020, DEF_STR( Off ) )
+ PORT_DIPNAME( 0x0040, 0x0040, "UNK_6" )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPSETTING( 0x0040, DEF_STR( Off ) )
+ PORT_DIPNAME( 0x0080, 0x0080, "UNK_7" )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPSETTING( 0x0080, DEF_STR( Off ) )
+#endif
+ PORT_MODIFY("SYSTEM")
+ PORT_BIT( 0x0003, IP_ACTIVE_LOW, IPT_UNUSED )
+
+ PORT_START("DSW")
+ PORT_DIPNAME( 0x0001, 0x0001, "Analog controls?" ) // ?
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPSETTING( 0x0001, DEF_STR( Off ) )
+ PORT_DIPNAME( 0x0002, 0x0002, "L/R control related (keep off)" )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPSETTING( 0x0002, DEF_STR( Off ) )
+ PORT_DIPNAME( 0x0004, 0x0004, "DSUNK_2" )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPSETTING( 0x0004, DEF_STR( Off ) )
+ PORT_DIPNAME( 0x0008, 0x0000, "Road select (debug)" ) // Debug mode
+ PORT_DIPSETTING( 0x0008, DEF_STR( On ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( Off ) )
+ PORT_DIPNAME( 0x0010, 0x0010, DEF_STR( Flip_Screen ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPSETTING( 0x0010, DEF_STR( Off ) )
+ PORT_DIPNAME( 0x0020, 0x0020, "DSUNK_5" )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPSETTING( 0x0020, DEF_STR( Off ) )
+ PORT_DIPNAME( 0x0040, 0x0040, "DSUNK_6" )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPSETTING( 0x0040, DEF_STR( Off ) )
+ PORT_DIPNAME( 0x0080, 0x0000, "Enable enemies" )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPSETTING( 0x0080, DEF_STR( Off ) )
+
+ PORT_DIPNAME( 0x0100, 0x0100, "DSUNK_8" )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPSETTING( 0x0100, DEF_STR( Off ) )
+ PORT_DIPNAME( 0x0200, 0x0200, "DSUNK_9" )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPSETTING( 0x0200, DEF_STR( Off ) )
+ PORT_DIPNAME( 0x0400, 0x0400, "DSUNK_A" )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPSETTING( 0x0400, DEF_STR( Off ) )
+ PORT_DIPNAME( 0x0800, 0x0800, "DSUNK_B" )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPSETTING( 0x0800, DEF_STR( Off ) )
+ PORT_DIPNAME( 0x1000, 0x1000, "DSUNK_C" )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPSETTING( 0x1000, DEF_STR( Off ) )
+ PORT_DIPNAME( 0x2000, 0x2000, "DSUNK_D" )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPSETTING( 0x2000, DEF_STR( Off ) )
+ PORT_DIPNAME( 0x4000, 0x4000, "DSUNK_E" )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPSETTING( 0x4000, DEF_STR( Off ) )
+ PORT_DIPNAME( 0x8000, 0x8000, "DSUNK_F" )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPSETTING( 0x8000, DEF_STR( Off ) )
+
+ PORT_INCLUDE( rotary_null )
+ PORT_INCLUDE( trackball_ports )
+INPUT_PORTS_END
+
static INPUT_PORTS_START( birdtry )
PORT_INCLUDE( dec0 )
@@ -1092,7 +1222,7 @@ static INPUT_PORTS_START( birdtry )
*/
PORT_INCLUDE( rotary_null )
-// TODO: trackball inputs
+ PORT_INCLUDE( trackball_ports )
INPUT_PORTS_END
static INPUT_PORTS_START( baddudes )
@@ -1665,6 +1795,7 @@ void dec0_state::dec0(machine_config &config)
ym1.add_route(1, "mono", 0.90);
ym1.add_route(2, "mono", 0.90);
ym1.add_route(3, "mono", 0.35);
+ ym1.irq_handler().set_inputline(m_audiocpu, 0); // Schematics show both ym2203 and ym3812 can trigger IRQ, but Bandit is only game to program 2203 to do so
ym3812_device &ym2(YM3812(config, "ym2", XTAL(12'000'000) / 4));
ym2.irq_handler().set_inputline(m_audiocpu, 0);
@@ -1898,6 +2029,31 @@ void dec0_state::hbarrel(machine_config &config)
m_screen->set_screen_update(FUNC(dec0_state::screen_update_hbarrel));
}
+void dec0_state::bandit(machine_config &config)
+{
+ dec0(config);
+
+ m_maincpu->set_addrmap(AS_PROGRAM, &dec0_state::dec0_tb_map);
+
+ upd4701_device &tb0(UPD4701A(config, "tb0"));
+ tb0.set_portx_tag("track_0");
+ tb0.set_porty_tag("track_1");
+
+ upd4701_device &tb1(UPD4701A(config, "tb1"));
+ tb1.set_portx_tag("track_2");
+ tb1.set_porty_tag("track_3");
+
+ i8751_device &mcu(I8751(config, m_mcu, XTAL(8'000'000)));
+ mcu.port_in_cb<0>().set(FUNC(dec0_state::dec0_mcu_port0_r));
+ mcu.port_out_cb<0>().set(FUNC(dec0_state::dec0_mcu_port0_w));
+ mcu.port_out_cb<1>().set(FUNC(dec0_state::dec0_mcu_port1_w));
+ mcu.port_out_cb<2>().set(FUNC(dec0_state::dec0_mcu_port2_w));
+ mcu.port_out_cb<3>().set(FUNC(dec0_state::dec0_mcu_port3_w));
+
+ /* video hardware */
+ m_screen->set_screen_update(FUNC(dec0_state::screen_update_bandit));
+}
+
void dec0_state::baddudes(machine_config &config)
{
dec0(config);
@@ -1925,6 +2081,16 @@ void dec0_state::birdtry(machine_config &config)
{
dec0(config);
+ m_maincpu->set_addrmap(AS_PROGRAM, &dec0_state::dec0_tb_map);
+
+ upd4701_device &tb0(UPD4701A(config, "tb0"));
+ tb0.set_portx_tag("track_0");
+ tb0.set_porty_tag("track_1");
+
+ upd4701_device &tb1(UPD4701A(config, "tb1"));
+ tb1.set_portx_tag("track_2");
+ tb1.set_porty_tag("track_3");
+
/* video hardware */
m_screen->set_screen_update(FUNC(dec0_state::screen_update_birdtry));
}
@@ -2836,6 +3002,51 @@ ROM_START( automat )
ROM_LOAD( "19.bin", 0x70000, 0x08000, CRC(118e7fc7) SHA1(fa6d8eef9da873579e19a9bf982643e061b8ca26) )
ROM_END
+ROM_START( bandit )
+ ROM_REGION( 0x60000, "maincpu", 0 ) /* 6*64k for 68000 code */
+ ROM_LOAD16_BYTE( "4.4", 0x00000, 0x10000, CRC(01a29133) SHA1(6a8e9b959828f82333ca17dbc751a9fbafae6935) )
+ ROM_LOAD16_BYTE( "1.1", 0x00001, 0x10000, CRC(dc61b11f) SHA1(3178a1247d2ef4d30f9c6c55b53db658214d2861) )
+ ROM_LOAD16_BYTE( "5.5", 0x20000, 0x10000, CRC(7dbfa088) SHA1(7046d84f0a00f86cfa0c4d77e43118adda111001) )
+ ROM_LOAD16_BYTE( "2.2", 0x20001, 0x10000, CRC(3e81e138) SHA1(b2eb57900fe110d64852a5c4c9d12c060ecb54e5) )
+ ROM_LOAD16_BYTE( "6.6", 0x40000, 0x10000, CRC(b12e33cc) SHA1(b551cc09d25bb8ae198415f75ac2a150f2789849) )
+ ROM_LOAD16_BYTE( "3.3", 0x40001, 0x10000, CRC(30bf52cf) SHA1(f45d3028d0e4e8c8f2c5968b52399a4e7eb9255f) )
+
+ ROM_REGION( 0x10000, "audiocpu", 0 ) /* 6502 Sound */
+ ROM_LOAD( "7.7", 0x8000, 0x8000, CRC(69259ca4) SHA1(ce014836c71e269569279a09abef20cf03d46e31) )
+
+ ROM_REGION( 0x1000, "mcu", 0 ) /* i8751 microcontroller */
+ ROM_LOAD( "hb31.9a", 0x0000, 0x1000, CRC(239d726f) SHA1(969f38ae981ffde6053ece93cc51614d492edbbb) )
+
+ ROM_REGION( 0x20000, "gfx1", 0 ) /* chars */
+ ROM_LOAD( "25.25", 0x00000, 0x10000, CRC(4047ff81) SHA1(56a82c7694e6dbbdb9b42ed134120a76f848f7a5) )
+ ROM_LOAD( "26.26", 0x10000, 0x10000, CRC(3a0a2f1e) SHA1(f06b44e4a8c29ee2c0a6e8f786fbee144138ba72) )
+
+ ROM_REGION( 0x80000, "gfx2", 0 ) /* tiles */
+ ROM_LOAD( "18.18", 0x00000, 0x10000, CRC(ac38e585) SHA1(c1a6fb083c096d119351883dea121ee6358d9298) )
+ ROM_LOAD( "20.20", 0x20000, 0x10000, CRC(2194f737) SHA1(fbe2f7d0d6b80bf62fb9c38f9f2a001a728f3b7c) )
+ ROM_LOAD( "22.22", 0x40000, 0x10000, CRC(fcc6cb4d) SHA1(548bd8688b255cdd1eef82e4fbec3d88e1d0ab53) )
+ ROM_LOAD( "24.24", 0x60000, 0x10000, CRC(aa3c33b6) SHA1(f7770daedb5c1d5dd5099f1378c5c292c68a6a12) )
+
+ ROM_REGION( 0x40000, "gfx3", 0 ) /* tiles */
+ ROM_LOAD( "29.29", 0x00000, 0x10000, CRC(32218c8a) SHA1(33e922ffd7000a03a8fa8bbe61483cd8e916ebd6) )
+ ROM_LOAD( "30.30", 0x10000, 0x10000, CRC(6a5fe9a9) SHA1(a750373e9fb1a0ad81d63a19bbac7a6079d3372f) )
+ ROM_LOAD( "27.27", 0x20000, 0x10000, CRC(62970304) SHA1(57606bedfd83429629593bbea50fb25db1f2d874) )
+ ROM_LOAD( "28.28", 0x30000, 0x10000, CRC(e018459f) SHA1(136ce96523988173425fa791742dab62ecaef5c9) )
+
+ ROM_REGION( 0x80000, "gfx4", 0 ) /* sprites */
+ ROM_LOAD( "15.15", 0x00000, 0x10000, CRC(84c03235) SHA1(3b5a8e24dd0aba1d1530d37685aaa46a35b0249a) )
+ ROM_LOAD( "16.16", 0x10000, 0x10000, CRC(eaa35477) SHA1(08763d7937a6fa76f6029974d5b909ba05c69d81) )
+ ROM_LOAD( "11.11", 0x20000, 0x10000, CRC(c9e6b57f) SHA1(9c12e0e7e25d48c7679ea65c3dfeaca9fdfdcbb3) )
+ ROM_LOAD( "12.12", 0x30000, 0x10000, CRC(317f7e4a) SHA1(7d20722e75d69ef4f408e1995a29338c452b63c9) )
+
+ ROM_LOAD( "13.13", 0x40000, 0x10000, CRC(0c063bec) SHA1(e9808d20dc9e450c6a880ca1d8383246aff1ab36) )
+ ROM_LOAD( "14.14", 0x50000, 0x10000, CRC(2ebf06d3) SHA1(6381f978c0e719bf80d2c16a8355a0892473720a) )
+ ROM_LOAD( "9.9", 0x60000, 0x10000, CRC(046f9d58) SHA1(a3078c13d27f365f900be3b55d1a917a8cd712f8) )
+ ROM_LOAD( "10.10", 0x70000, 0x10000, CRC(3d2d704e) SHA1(3dcf3dd8cc91c5629e014bc6e2ccce234cf549a5) )
+
+ ROM_REGION( 0x40000, "oki", 0 ) /* ADPCM samples */
+ ROM_LOAD( "8.8", 0x0000, 0x10000, CRC(b0e79b9f) SHA1(6613c41234b8305d8959d06d6b4e9127bfc5eebe) )
+ROM_END
ROM_START( hippodrm )
ROM_REGION( 0x60000, "maincpu", 0 ) /* 4*64k for 68000 code */
@@ -3769,6 +3980,7 @@ GAME( 1988, robocop, 0, robocop, robocop, dec0_state, empty_init
GAME( 1988, robocopw, robocop, robocop, robocop, dec0_state, empty_init, ROT0, "Data East Corporation", "Robocop (World revision 3)", MACHINE_SUPPORTS_SAVE )
GAME( 1988, robocopj, robocop, robocop, robocop, dec0_state, empty_init, ROT0, "Data East Corporation", "Robocop (Japan)", MACHINE_SUPPORTS_SAVE )
GAME( 1988, robocopu, robocop, robocop, robocop, dec0_state, empty_init, ROT0, "Data East USA", "Robocop (US revision 1)", MACHINE_SUPPORTS_SAVE )
+GAME( 1989, bandit, 0, bandit, bandit, dec0_state, init_hbarrel, ROT90, "Data East USA", "Bandit (US)", MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE )
GAME( 1988, robocopu0, robocop, robocop, robocop, dec0_state, empty_init, ROT0, "Data East USA", "Robocop (US revision 0)", MACHINE_SUPPORTS_SAVE )
GAME( 1989, hippodrm, 0, hippodrm, hippodrm, dec0_state, init_hippodrm, ROT0, "Data East USA", "Hippodrome (US)", MACHINE_SUPPORTS_SAVE )
GAME( 1989, ffantasy, hippodrm, hippodrm, ffantasy, dec0_state, init_hippodrm, ROT0, "Data East Corporation", "Fighting Fantasy (Japan revision 3)", MACHINE_SUPPORTS_SAVE )
diff --git a/src/mame/drivers/deco156.cpp b/src/mame/drivers/deco156.cpp
index 83c64367d83..df7bd749e1b 100644
--- a/src/mame/drivers/deco156.cpp
+++ b/src/mame/drivers/deco156.cpp
@@ -329,23 +329,23 @@ DECOSPR_PRIORITY_CB_MEMBER(deco156_state::pri_callback)
return 0;
}
-MACHINE_CONFIG_START(deco156_state::hvysmsh)
-
+void deco156_state::hvysmsh(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", ARM, 28000000) /* Unconfirmed */
- MCFG_DEVICE_PROGRAM_MAP(hvysmsh_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", deco156_state, deco32_vbl_interrupt)
+ ARM(config, m_maincpu, 28000000); /* Unconfirmed */
+ m_maincpu->set_addrmap(AS_PROGRAM, &deco156_state::hvysmsh_map);
+ m_maincpu->set_vblank_int("screen", FUNC(deco156_state::deco32_vbl_interrupt));
EEPROM_93C46_16BIT(config, "eeprom");
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(58)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(529))
- MCFG_SCREEN_SIZE(40*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 40*8-1, 1*8, 31*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(deco156_state, screen_update)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(58);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(529));
+ screen.set_size(40*8, 32*8);
+ screen.set_visarea(0*8, 40*8-1, 1*8, 31*8-1);
+ screen.set_screen_update(FUNC(deco156_state::screen_update));
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_hvysmsh)
+ GFXDECODE(config, "gfxdecode", m_palette, gfx_hvysmsh);
PALETTE(config, m_palette).set_format(palette_device::xBGR_888, 1024);
DECO16IC(config, m_deco_tilegen, 0);
@@ -373,32 +373,32 @@ MACHINE_CONFIG_START(deco156_state::hvysmsh)
SPEAKER(config, "lspeaker").front_left();
SPEAKER(config, "rspeaker").front_right();
- MCFG_DEVICE_ADD("oki1", OKIM6295, 28000000/28, okim6295_device::PIN7_HIGH)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 1.0)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 1.0)
-
- MCFG_DEVICE_ADD("oki2", OKIM6295, 28000000/14, okim6295_device::PIN7_HIGH)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 0.35)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 0.35)
-MACHINE_CONFIG_END
+ OKIM6295(config, m_oki1, 28000000/28, okim6295_device::PIN7_HIGH);
+ m_oki1->add_route(ALL_OUTPUTS, "lspeaker", 1.0);
+ m_oki1->add_route(ALL_OUTPUTS, "rspeaker", 1.0);
-MACHINE_CONFIG_START(deco156_state::wcvol95)
+ OKIM6295(config, m_oki2, 28000000/14, okim6295_device::PIN7_HIGH);
+ m_oki2->add_route(ALL_OUTPUTS, "lspeaker", 0.35);
+ m_oki2->add_route(ALL_OUTPUTS, "rspeaker", 0.35);
+}
+void deco156_state::wcvol95(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", ARM, 28000000) /* Unconfirmed */
- MCFG_DEVICE_PROGRAM_MAP(wcvol95_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", deco156_state, deco32_vbl_interrupt)
+ ARM(config, m_maincpu, 28000000); /* Unconfirmed */
+ m_maincpu->set_addrmap(AS_PROGRAM, &deco156_state::wcvol95_map);
+ m_maincpu->set_vblank_int("screen", FUNC(deco156_state::deco32_vbl_interrupt));
EEPROM_93C46_16BIT(config, "eeprom");
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(58)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(529))
- MCFG_SCREEN_SIZE(40*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 40*8-1, 1*8, 31*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(deco156_state, screen_update)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(58);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(529));
+ screen.set_size(40*8, 32*8);
+ screen.set_visarea(0*8, 40*8-1, 1*8, 31*8-1);
+ screen.set_screen_update(FUNC(deco156_state::screen_update));
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_hvysmsh)
+ GFXDECODE(config, "gfxdecode", m_palette, gfx_hvysmsh);
PALETTE(config, m_palette).set_format(palette_device::xBGR_555, 1024);
DECO16IC(config, m_deco_tilegen, 0);
@@ -426,10 +426,10 @@ MACHINE_CONFIG_START(deco156_state::wcvol95)
SPEAKER(config, "lspeaker").front_left();
SPEAKER(config, "rspeaker").front_right();
- MCFG_DEVICE_ADD("ymz", YMZ280B, 28000000 / 2)
- MCFG_SOUND_ROUTE(0, "lspeaker", 1.0)
- MCFG_SOUND_ROUTE(1, "rspeaker", 1.0)
-MACHINE_CONFIG_END
+ ymz280b_device &ymz(YMZ280B(config, "ymz", 28000000 / 2));
+ ymz.add_route(0, "lspeaker", 1.0);
+ ymz.add_route(1, "rspeaker", 1.0);
+}
/**********************************************************************************/
diff --git a/src/mame/drivers/deco32.cpp b/src/mame/drivers/deco32.cpp
index 2670ac4dd12..026b633b546 100644
--- a/src/mame/drivers/deco32.cpp
+++ b/src/mame/drivers/deco32.cpp
@@ -3664,7 +3664,7 @@ ROM_START( tattass )
ROM_LOAD16_BYTE( "ob2_c2.b3", 0x700000, 0x80000, CRC(90fe5f4f) SHA1(2149e9eae152556c632ebd4d0b2de49e40916a77) )
ROM_LOAD16_BYTE( "ob2_c3.b3", 0x700001, 0x80000, CRC(e3517e6e) SHA1(68ac60570423d8f0d7cff3db1901c9c050d0be91) )
- ROM_REGION(0x1000000, "bsmt", 0 ) // are the sample roms 100% confirmed as good? some sounds cause everything to cut out followed by a loud static pop? (did the same before the bsmt decap)
+ ROM_REGION(0x1000000, "bsmt", 0 )
ROM_LOAD( "u17.snd", 0x000000, 0x80000, CRC(b945c18d) SHA1(6556bbb4a7057df3680132f24687fa944006c784) )
ROM_LOAD( "u21.snd", 0x080000, 0x80000, CRC(10b2110c) SHA1(83e5938ed22da2874022e1dc8df76c72d95c448d) )
ROM_LOAD( "u36.snd", 0x100000, 0x80000, CRC(3b73abe2) SHA1(195096e2302e84123b23b4ccd982fb3ab9afe42c) )
diff --git a/src/mame/drivers/deco_ld.cpp b/src/mame/drivers/deco_ld.cpp
index bde3b0fcdc2..8caa719787b 100644
--- a/src/mame/drivers/deco_ld.cpp
+++ b/src/mame/drivers/deco_ld.cpp
@@ -465,24 +465,26 @@ void deco_ld_state::machine_start()
MACHINE_CONFIG_START(deco_ld_state::rblaster)
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu",M6502,8000000/2)
- MCFG_DEVICE_PROGRAM_MAP(rblaster_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", deco_ld_state, irq0_line_hold)
+ M6502(config, m_maincpu, 8000000/2);
+ m_maincpu->set_addrmap(AS_PROGRAM, &deco_ld_state::rblaster_map);
+ m_maincpu->set_vblank_int("screen", FUNC(deco_ld_state::irq0_line_hold));
- MCFG_DEVICE_ADD("audiocpu",M6502,8000000/2)
- MCFG_DEVICE_PROGRAM_MAP(rblaster_sound_map)
- MCFG_DEVICE_PERIODIC_INT_DRIVER(deco_ld_state, sound_interrupt, 640)
+ M6502(config, m_audiocpu, 8000000/2);
+ m_audiocpu->set_addrmap(AS_PROGRAM, &deco_ld_state::rblaster_sound_map);
+ m_audiocpu->set_periodic_int(FUNC(deco_ld_state::sound_interrupt), attotime::from_hz(640));
-// MCFG_QUANTUM_TIME(attotime::from_hz(6000))
+// config.m_minimum_quantum = attotime::from_hz(6000);
- MCFG_LASERDISC_LDP1000_ADD("laserdisc")
- MCFG_LASERDISC_OVERLAY_DRIVER(256, 256, deco_ld_state, screen_update_rblaster)
- //MCFG_LASERDISC_OVERLAY_CLIP(0, 256-1, 8, 240-1)
- MCFG_LASERDISC_OVERLAY_PALETTE(m_palette)
+ SONY_LDP1000(config, m_laserdisc, 0);
+ m_laserdisc->set_overlay(256, 256, FUNC(deco_ld_state::screen_update_rblaster));
+ //m_laserdisc->set_overlay_clip(0, 256-1, 8, 240-1);
+ m_laserdisc->set_overlay_palette(m_palette);
+ m_laserdisc->add_route(0, "lspeaker", 1.0);
+ m_laserdisc->add_route(1, "rspeaker", 1.0);
/* video hardware */
MCFG_LASERDISC_SCREEN_ADD_NTSC("screen", "laserdisc")
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_rblaster)
+ GFXDECODE(config, m_gfxdecode, m_palette, gfx_rblaster);
PALETTE(config, m_palette).set_format(palette_device::BGR_233_inverted, 0x800);
//ACIA6850(config, m_acia, 0);
@@ -500,10 +502,6 @@ MACHINE_CONFIG_START(deco_ld_state::rblaster)
AY8910(config, "ay1", 1500000).add_route(ALL_OUTPUTS, "lspeaker", 0.25).add_route(ALL_OUTPUTS, "rspeaker", 0.25);
AY8910(config, "ay2", 1500000).add_route(ALL_OUTPUTS, "lspeaker", 0.25).add_route(ALL_OUTPUTS, "rspeaker", 0.25);
-
- MCFG_DEVICE_MODIFY("laserdisc")
- MCFG_SOUND_ROUTE(0, "lspeaker", 1.0)
- MCFG_SOUND_ROUTE(1, "rspeaker", 1.0)
MACHINE_CONFIG_END
/***************************************************************************
diff --git a/src/mame/drivers/deco_mlc.cpp b/src/mame/drivers/deco_mlc.cpp
index bf49ae120e8..b3639af5000 100644
--- a/src/mame/drivers/deco_mlc.cpp
+++ b/src/mame/drivers/deco_mlc.cpp
@@ -507,61 +507,59 @@ void deco_mlc_state::machine_reset()
m_vbl_i = 0xffffffff;
}
-MACHINE_CONFIG_START(deco_mlc_state::avengrgs)
-
+void deco_mlc_state::avengrgs(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD(m_maincpu, SH2, 42000000/2) /* 21 MHz clock confirmed on real board */
- MCFG_DEVICE_PROGRAM_MAP(avengrgs_map)
+ SH2(config, m_maincpu, 42000000/2); /* 21 MHz clock confirmed on real board */
+ m_maincpu->set_addrmap(AS_PROGRAM, &deco_mlc_state::avengrgs_map);
EEPROM_93C46_16BIT(config, m_eeprom); /* Actually 93c45 */
- MCFG_TIMER_DRIVER_ADD(m_raster_irq_timer, deco_mlc_state, interrupt_gen)
+ TIMER(config, m_raster_irq_timer).configure_generic(FUNC(deco_mlc_state::interrupt_gen));
/* video hardware */
- MCFG_SCREEN_ADD(m_screen, RASTER)
- MCFG_SCREEN_REFRESH_RATE(58)
- MCFG_SCREEN_SIZE(40*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 40*8-1, 1*8, 31*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(deco_mlc_state, screen_update)
- MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE(*this, deco_mlc_state, screen_vblank_mlc))
- MCFG_SCREEN_VIDEO_ATTRIBUTES(VIDEO_UPDATE_SCANLINE)
-
- MCFG_DEVICE_ADD(m_gfxdecode, GFXDECODE, m_palette, gfx_deco_mlc)
- PALETTE(config, m_palette);
- m_palette->set_format(palette_device::xBGR_555, 2048);
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_refresh_hz(58);
+ m_screen->set_size(40*8, 32*8);
+ m_screen->set_visarea(0*8, 40*8-1, 1*8, 31*8-1);
+ m_screen->set_screen_update(FUNC(deco_mlc_state::screen_update));
+ m_screen->screen_vblank().set(FUNC(deco_mlc_state::screen_vblank_mlc));
+ m_screen->set_video_attributes(VIDEO_UPDATE_SCANLINE);
+
+ GFXDECODE(config, m_gfxdecode, m_palette, gfx_deco_mlc);
+ PALETTE(config, m_palette).set_format(palette_device::xBGR_555, 2048);
m_palette->set_membits(16);
/* sound hardware */
SPEAKER(config, "lspeaker").front_left();
SPEAKER(config, "rspeaker").front_right();
- MCFG_DEVICE_ADD(m_ymz, YMZ280B, 42000000 / 3)
- MCFG_SOUND_ROUTE(0, "lspeaker", 1.0)
- MCFG_SOUND_ROUTE(1, "rspeaker", 1.0)
-MACHINE_CONFIG_END
-
-MACHINE_CONFIG_START(deco_mlc_state::mlc)
+ YMZ280B(config, m_ymz, 42000000 / 3);
+ m_ymz->add_route(0, "lspeaker", 1.0);
+ m_ymz->add_route(1, "rspeaker", 1.0);
+}
+void deco_mlc_state::mlc(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD(m_maincpu, ARM,42000000/6) /* 42 MHz -> 7MHz clock confirmed on real board */
- MCFG_DEVICE_PROGRAM_MAP(decomlc_map)
+ ARM(config, m_maincpu, 42000000/6); /* 42 MHz -> 7MHz clock confirmed on real board */
+ m_maincpu->set_addrmap(AS_PROGRAM, &deco_mlc_state::decomlc_map);
EEPROM_93C46_16BIT(config, m_eeprom); /* Actually 93c45 */
- MCFG_TIMER_DRIVER_ADD(m_raster_irq_timer, deco_mlc_state, interrupt_gen)
+ TIMER(config, m_raster_irq_timer).configure_generic(FUNC(deco_mlc_state::interrupt_gen));
/* video hardware */
- MCFG_SCREEN_ADD(m_screen, RASTER)
- MCFG_SCREEN_REFRESH_RATE(58)
- MCFG_SCREEN_SIZE(40*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 40*8-1, 1*8, 31*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(deco_mlc_state, screen_update)
- MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE(*this, deco_mlc_state, screen_vblank_mlc))
- MCFG_SCREEN_VIDEO_ATTRIBUTES(VIDEO_UPDATE_SCANLINE)
-
- MCFG_DEVICE_ADD(m_gfxdecode, GFXDECODE, m_palette, gfx_deco_mlc)
- PALETTE(config, m_palette);
- m_palette->set_format(palette_device::xBGR_555, 2048);
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_refresh_hz(58);
+ m_screen->set_size(40*8, 32*8);
+ m_screen->set_visarea(0*8, 40*8-1, 1*8, 31*8-1);
+ m_screen->set_screen_update(FUNC(deco_mlc_state::screen_update));
+ m_screen->screen_vblank().set(FUNC(deco_mlc_state::screen_vblank_mlc));
+ m_screen->set_video_attributes(VIDEO_UPDATE_SCANLINE);
+
+ GFXDECODE(config, m_gfxdecode, m_palette, gfx_deco_mlc);
+ PALETTE(config, m_palette).set_format(palette_device::xBGR_555, 2048);
m_palette->set_membits(16);
DECO146PROT(config, m_deco146, 0);
@@ -571,25 +569,28 @@ MACHINE_CONFIG_START(deco_mlc_state::mlc)
SPEAKER(config, "lspeaker").front_left();
SPEAKER(config, "rspeaker").front_right();
- MCFG_DEVICE_ADD(m_ymz, YMZ280B, 42000000 / 3)
- MCFG_SOUND_ROUTE(0, "lspeaker", 1.0)
- MCFG_SOUND_ROUTE(1, "rspeaker", 1.0)
-MACHINE_CONFIG_END
+ YMZ280B(config, m_ymz, 42000000 / 3);
+ m_ymz->add_route(0, "lspeaker", 1.0);
+ m_ymz->add_route(1, "rspeaker", 1.0);
+}
-MACHINE_CONFIG_START(deco_mlc_state::mlc_6bpp)
+void deco_mlc_state::mlc_6bpp(machine_config &config)
+{
mlc(config);
- MCFG_GFXDECODE_MODIFY("gfxdecode", gfx_6bpp)
-MACHINE_CONFIG_END
-MACHINE_CONFIG_START(deco_mlc_state::mlc_5bpp)
+ m_gfxdecode->set_info(gfx_6bpp);
+}
+
+void deco_mlc_state::mlc_5bpp(machine_config &config)
+{
mlc(config);
- MCFG_GFXDECODE_MODIFY("gfxdecode", gfx_5bpp)
+
+ m_gfxdecode->set_info(gfx_5bpp);
// TODO: mono? ch.0 doesn't output any sound in-game
- MCFG_DEVICE_MODIFY("ymz")
- MCFG_SOUND_ROUTE(1, "lspeaker", 1.0)
- MCFG_SOUND_ROUTE(0, "rspeaker", 1.0)
-MACHINE_CONFIG_END
+ m_ymz->add_route(1, "lspeaker", 1.0);
+ m_ymz->add_route(0, "rspeaker", 1.0);
+}
/***************************************************************************/
diff --git a/src/mame/drivers/decocass.cpp b/src/mame/drivers/decocass.cpp
index 305ae5f7889..8f86b713c48 100644
--- a/src/mame/drivers/decocass.cpp
+++ b/src/mame/drivers/decocass.cpp
@@ -950,15 +950,15 @@ void decocass_state::decocass_palette(palette_device &palette) const
}
-MACHINE_CONFIG_START(decocass_state::decocass)
-
+void decocass_state::decocass(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", DECO_222, HCLK4) /* the earlier revision board doesn't have the 222 but must have the same thing implemented in logic for the M6502 */
- MCFG_DEVICE_PROGRAM_MAP(decocass_map)
+ DECO_222(config, m_maincpu, HCLK4); /* the earlier revision board doesn't have the 222 but must have the same thing implemented in logic for the M6502 */
+ m_maincpu->set_addrmap(AS_PROGRAM, &decocass_state::decocass_map);
- MCFG_DEVICE_ADD("audiocpu", M6502, HCLK1/3/2)
- MCFG_DEVICE_PROGRAM_MAP(decocass_sound_map)
- MCFG_TIMER_DRIVER_ADD_SCANLINE("audionmi", decocass_state, decocass_audio_nmi_gen, "screen", 0, 8)
+ M6502(config, m_audiocpu, HCLK1/3/2);
+ m_audiocpu->set_addrmap(AS_PROGRAM, &decocass_state::decocass_sound_map);
+ TIMER(config, "audionmi").configure_scanline(FUNC(decocass_state::decocass_audio_nmi_gen), "screen", 0, 8);
I8041(config, m_mcu, HCLK);
m_mcu->p1_in_cb().set(FUNC(decocass_state::i8041_p1_r));
@@ -966,19 +966,19 @@ MACHINE_CONFIG_START(decocass_state::decocass)
m_mcu->p2_in_cb().set(FUNC(decocass_state::i8041_p2_r));
m_mcu->p2_out_cb().set(FUNC(decocass_state::i8041_p2_w));
- MCFG_QUANTUM_TIME(attotime::from_hz(4200)) /* interleave CPUs */
+ config.m_minimum_quantum = attotime::from_hz(4200); /* interleave CPUs */
WATCHDOG_TIMER(config, m_watchdog);
DECOCASS_TAPE(config, m_cassette, 0);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_RAW_PARAMS(HCLK, 384, 0*8, 256, 272, 1*8, 248)
- MCFG_SCREEN_UPDATE_DRIVER(decocass_state, screen_update_decocass)
- MCFG_SCREEN_PALETTE(m_palette)
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_raw(HCLK, 384, 0*8, 256, 272, 1*8, 248);
+ m_screen->set_screen_update(FUNC(decocass_state::screen_update_decocass));
+ m_screen->set_palette(m_palette);
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, m_palette, gfx_decocass)
+ GFXDECODE(config, m_gfxdecode, m_palette, gfx_decocass);
PALETTE(config, m_palette, FUNC(decocass_state::decocass_palette), 64, 32);
/* sound hardware */
@@ -990,249 +990,280 @@ MACHINE_CONFIG_START(decocass_state::decocass)
AY8910(config, "ay1", HCLK2).add_route(ALL_OUTPUTS, "mono", 0.40);
AY8910(config, "ay2", HCLK2).add_route(ALL_OUTPUTS, "mono", 0.40);
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(decocass_type1_state::ctsttape)
+void decocass_type1_state::ctsttape(machine_config &config)
+{
decocass(config);
/* basic machine hardware */
MCFG_MACHINE_RESET_OVERRIDE(decocass_type1_state,ctsttape)
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(decocass_type1_state::cprogolfj)
+void decocass_type1_state::cprogolfj(machine_config &config)
+{
decocass(config);
/* basic machine hardware */
MCFG_MACHINE_RESET_OVERRIDE(decocass_type1_state,cprogolfj)
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(decocass_type1_state::cdsteljn)
+void decocass_type1_state::cdsteljn(machine_config &config)
+{
decocass(config);
/* basic machine hardware */
MCFG_MACHINE_RESET_OVERRIDE(decocass_type1_state,cdsteljn)
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(decocass_type1_state::cmanhat)
+void decocass_type1_state::cmanhat(machine_config &config)
+{
decocass(config);
/* basic machine hardware */
MCFG_MACHINE_RESET_OVERRIDE(decocass_type1_state,cmanhat)
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(decocass_type3_state::cfishing)
+void decocass_type3_state::cfishing(machine_config &config)
+{
decocass(config);
/* basic machine hardware */
MCFG_MACHINE_RESET_OVERRIDE(decocass_type3_state,cfishing)
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(decocass_type1_state::chwy)
+void decocass_type1_state::chwy(machine_config &config)
+{
decocass(config);
/* basic machine hardware */
MCFG_MACHINE_RESET_OVERRIDE(decocass_type1_state,chwy)
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(decocass_type1_state::cterrani)
+void decocass_type1_state::cterrani(machine_config &config)
+{
decocass(config);
/* basic machine hardware */
MCFG_MACHINE_RESET_OVERRIDE(decocass_type1_state,cterrani)
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(decocass_type1_state::castfant)
+void decocass_type1_state::castfant(machine_config &config)
+{
decocass(config);
/* basic machine hardware */
MCFG_MACHINE_RESET_OVERRIDE(decocass_type1_state,castfant)
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(decocass_type1_state::csuperas)
+void decocass_type1_state::csuperas(machine_config &config)
+{
decocass(config);
/* basic machine hardware */
MCFG_MACHINE_RESET_OVERRIDE(decocass_type1_state,csuperas)
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(decocass_type1_state::cocean1a) /* 10 */
+void decocass_type1_state::cocean1a(machine_config &config) /* 10 */
+{
decocass(config);
/* basic machine hardware */
MCFG_MACHINE_RESET_OVERRIDE(decocass_type1_state,cocean1a)
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(decocass_type1_state::clocknch)
+void decocass_type1_state::clocknch(machine_config &config)
+{
decocass(config);
/* basic machine hardware */
MCFG_MACHINE_RESET_OVERRIDE(decocass_type1_state,clocknch)
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(decocass_type1_state::clocknchj)
+void decocass_type1_state::clocknchj(machine_config &config)
+{
decocass(config);
/* basic machine hardware */
MCFG_MACHINE_RESET_OVERRIDE(decocass_type1_state,clocknchj)
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(decocass_type1_state::cfboy0a1) /* 12 */
+void decocass_type1_state::cfboy0a1(machine_config &config) /* 12 */
+{
decocass(config);
/* basic machine hardware */
MCFG_MACHINE_RESET_OVERRIDE(decocass_type1_state,cfboy0a1)
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(decocass_type1_state::cprogolf)
+void decocass_type1_state::cprogolf(machine_config &config)
+{
decocass(config);
/* basic machine hardware */
MCFG_MACHINE_RESET_OVERRIDE(decocass_type1_state,cprogolf)
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(decocass_type1_state::cluckypo)
+void decocass_type1_state::cluckypo(machine_config &config)
+{
decocass(config);
/* basic machine hardware */
MCFG_MACHINE_RESET_OVERRIDE(decocass_type1_state,cluckypo)
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(decocass_type1_state::ctisland)
+void decocass_type1_state::ctisland(machine_config &config)
+{
decocass(config);
/* basic machine hardware */
MCFG_MACHINE_RESET_OVERRIDE(decocass_type1_state,ctisland)
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(decocass_type1_state::ctisland3)
+void decocass_type1_state::ctisland3(machine_config &config)
+{
decocass(config);
/* basic machine hardware */
MCFG_MACHINE_RESET_OVERRIDE(decocass_type1_state,ctisland3)
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(decocass_type1_state::cexplore)
+void decocass_type1_state::cexplore(machine_config &config)
+{
decocass(config);
/* basic machine hardware */
MCFG_MACHINE_RESET_OVERRIDE(decocass_type1_state,cexplore)
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(decocass_type3_state::cbtime)
+void decocass_type3_state::cbtime(machine_config &config)
+{
decocass(config);
/* basic machine hardware */
MCFG_MACHINE_RESET_OVERRIDE(decocass_type3_state,cbtime)
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(decocass_type3_state::cburnrub)
+void decocass_type3_state::cburnrub(machine_config &config)
+{
decocass(config);
/* basic machine hardware */
MCFG_MACHINE_RESET_OVERRIDE(decocass_type3_state,cburnrub)
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(decocass_type3_state::cgraplop)
+void decocass_type3_state::cgraplop(machine_config &config)
+{
decocass(config);
/* basic machine hardware */
MCFG_MACHINE_RESET_OVERRIDE(decocass_type3_state,cgraplop)
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(decocass_type3_state::cgraplop2)
+void decocass_type3_state::cgraplop2(machine_config &config)
+{
decocass(config);
/* basic machine hardware */
MCFG_MACHINE_RESET_OVERRIDE(decocass_type3_state,cgraplop2)
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(decocass_type3_state::clapapa)
+void decocass_type3_state::clapapa(machine_config &config)
+{
decocass(config);
/* basic machine hardware */
MCFG_MACHINE_RESET_OVERRIDE(decocass_type3_state,clapapa)
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(decocass_type3_state::cskater)
+void decocass_type3_state::cskater(machine_config &config)
+{
decocass(config);
/* basic machine hardware */
MCFG_MACHINE_RESET_OVERRIDE(decocass_type3_state,cskater)
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(decocass_type3_state::cprobowl)
+void decocass_type3_state::cprobowl(machine_config &config)
+{
decocass(config);
/* basic machine hardware */
MCFG_MACHINE_RESET_OVERRIDE(decocass_type3_state,cprobowl)
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(decocass_type3_state::cnightst)
+void decocass_type3_state::cnightst(machine_config &config)
+{
decocass(config);
/* basic machine hardware */
MCFG_MACHINE_RESET_OVERRIDE(decocass_type3_state,cnightst)
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(decocass_type3_state::cpsoccer)
+void decocass_type3_state::cpsoccer(machine_config &config)
+{
decocass(config);
/* basic machine hardware */
MCFG_MACHINE_RESET_OVERRIDE(decocass_type3_state,cpsoccer)
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(decocass_type3_state::csdtenis)
+void decocass_type3_state::csdtenis(machine_config &config)
+{
decocass(config);
/* basic machine hardware */
MCFG_MACHINE_RESET_OVERRIDE(decocass_type3_state,csdtenis)
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(decocass_type3_state::czeroize)
+void decocass_type3_state::czeroize(machine_config &config)
+{
decocass(config);
/* basic machine hardware */
MCFG_MACHINE_RESET_OVERRIDE(decocass_type3_state,czeroize)
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(decocass_type3_state::cppicf)
+void decocass_type3_state::cppicf(machine_config &config)
+{
decocass(config);
/* basic machine hardware */
MCFG_MACHINE_RESET_OVERRIDE(decocass_type3_state,cppicf)
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(decocass_type3_state::cfghtice)
+void decocass_type3_state::cfghtice(machine_config &config)
+{
decocass(config);
/* basic machine hardware */
MCFG_MACHINE_RESET_OVERRIDE(decocass_type3_state,cfghtice)
-MACHINE_CONFIG_END
+}
diff --git a/src/mame/drivers/decstation.cpp b/src/mame/drivers/decstation.cpp
index c75668f2e13..4d7d412e1a9 100644
--- a/src/mame/drivers/decstation.cpp
+++ b/src/mame/drivers/decstation.cpp
@@ -73,6 +73,7 @@
#include "bus/rs232/rs232.h"
#include "screen.h"
#include "video/bt459.h"
+#include "video/decsfb.h"
class decstation_state : public driver_device
{
@@ -82,6 +83,7 @@ public:
m_maincpu(*this, "maincpu"),
m_screen(*this, "screen"),
m_scantimer(*this, "scantimer"),
+ m_sfb(*this, "sfb"),
m_lk201(*this, "lk201"),
m_ioga(*this, "ioga"),
m_rtc(*this, "rtc"),
@@ -103,6 +105,7 @@ public:
protected:
DECLARE_READ_LINE_MEMBER(brcond0_r) { return ASSERT_LINE; }
DECLARE_WRITE_LINE_MEMBER(ioga_irq_w);
+ DECLARE_WRITE_LINE_MEMBER(dz_irq_w);
DECLARE_READ32_MEMBER(cfb_r);
DECLARE_WRITE32_MEMBER(cfb_w);
@@ -130,9 +133,10 @@ private:
uint32_t kn01_screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
uint32_t screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
- required_device<mips1core_device_base> m_maincpu;
+ required_device<mips1_device_base> m_maincpu;
required_device<screen_device> m_screen;
optional_device<timer_device> m_scantimer;
+ optional_device<decsfb_device> m_sfb;
optional_device<lk201_device> m_lk201;
optional_device<dec_ioga_device> m_ioga;
required_device<mc146818_device> m_rtc;
@@ -148,9 +152,6 @@ private:
void threemin_map(address_map &map);
u8 *m_vrom_ptr;
- u32 m_vram[0x200000/4];
- u32 m_sfb[0x80];
- int m_copy_src;
u32 m_kn01_control, m_kn01_status;
u32 m_palette[256], m_overlay[256];
@@ -190,69 +191,27 @@ uint32_t decstation_state::kn01_screen_update(screen_device &screen, bitmap_rgb3
uint32_t decstation_state::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect)
{
- m_bt459->screen_update(screen, bitmap, cliprect, (uint8_t *)&m_vram[0]);
+ m_bt459->screen_update(screen, bitmap, cliprect, (uint8_t *)m_sfb->get_vram());
return 0;
}
-/*
- 0x100000 copy register 0
- 0x100004 copy register 1
- 0x100008 copy register 2
- 0x10000C copy register 3
- 0x100010 copy register 4
- 0x100014 copy register 5
- 0x100018 copy register 6
- 0x10001C copy register 7
- 0x100020 foreground register
- 0x100024 background register
- 0x100028 plane mask
- 0x10002C pixel mask
- 0x100030 cxt mode
- 0x100034 boolean operation
- 0x100038 pixel shift
- 0x10003C line address
- 0x100040 bresh 1
- 0x100044 bresh 2
- 0x100048 bresh 3
- 0x10004C bresh continue
- 0x100050 deep register
- 0x100054 start register
- 0x100058 Clear Interrupt
- 0x10005C reserved 2
- 0x100060 refresh count
- 0x100064 video horiz
- 0x100068 video vertical
- 0x10006C refresh base
- 0x100070 video valid
- 0x100074 Interrupt Enable
-*/
-
-#define MODE_SIMPLE 0
-#define MODE_OPAQUESTIPPLE 1
-#define MODE_OPAQUELINE 2
-#define MODE_TRANSPARENTSTIPPLE 5
-#define MODE_TRANSPARENTLINE 6
-#define MODE_COPY 7
-
READ32_MEMBER(decstation_state::cfb_r)
{
uint32_t addr = offset << 2;
-// logerror("cfb_r: reading at %x\n", addr);
+ //logerror("cfb_r: reading at %x\n", addr);
- if (addr < 0x800000)
+ if (addr < 0x80000)
{
return m_vrom_ptr[addr>>2] & 0xff;
}
if ((addr >= 0x100000) && (addr < 0x100200))
{
- return m_sfb[offset-(0x100000/4)];
}
if ((addr >= 0x200000) && (addr < 0x400000))
{
- return m_vram[offset-(0x200000/4)];
}
return 0xffffffff;
@@ -264,13 +223,6 @@ WRITE32_MEMBER(decstation_state::cfb_w)
if ((addr >= 0x100000) && (addr < 0x100200))
{
- //printf("SFB: %08x (mask %08x) @ %x\n", data, mem_mask, offset<<2);
- COMBINE_DATA(&m_sfb[offset-(0x100000/4)]);
-
- if ((addr == 0x100030) && (data = 7))
- {
- m_copy_src = 1;
- }
return;
}
@@ -282,70 +234,6 @@ WRITE32_MEMBER(decstation_state::cfb_w)
if ((addr >= 0x200000) && (addr < 0x400000))
{
- //printf("FB: %08x (mask %08x) @ %x\n", data, mem_mask, offset<<2);
-
- switch (m_sfb[0x30/4])
- {
- case MODE_SIMPLE: // simple
- COMBINE_DATA(&m_vram[offset-(0x200000/4)]);
- break;
-
- case MODE_TRANSPARENTSTIPPLE:
- {
- uint8_t *pVRAM = (uint8_t *)&m_vram[offset-(0x200000/4)];
- uint8_t fgs[4];
-
- fgs[0] = m_sfb[0x20/4] >> 24;
- fgs[1] = (m_sfb[0x20/4] >> 16) & 0xff;
- fgs[2] = (m_sfb[0x20/4] >> 8) & 0xff;
- fgs[3] = m_sfb[0x20/4] & 0xff;
- for (int x = 0; x < 32; x++)
- {
- if (data & (1<<(31-x)))
- {
- pVRAM[x] = fgs[x & 3];
- }
- }
- }
- break;
-
- case MODE_COPY:
- {
- uint8_t *pVRAM = (uint8_t *)&m_vram[offset-(0x200000/4)];
- uint8_t *pBuffer = (uint8_t *)&m_sfb[0]; // first 8 32-bit regs are the copy buffer
-
- if (m_copy_src)
- {
- m_copy_src = 0;
-
- for (int x = 0; x < 32; x++)
- {
- if (data & (1<<(31-x)))
- {
- pBuffer[x] = pVRAM[x];
- }
- }
- }
- else
- {
- m_copy_src = 1;
-
- for (int x = 0; x < 32; x++)
- {
- if (data & (1<<(31-x)))
- {
- pVRAM[x] = pBuffer[x];
- }
- }
- }
- }
- break;
-
- default:
- logerror("SFB: Unsupported VRAM write %08x (mask %08x) at %08x in mode %x\n", data, mem_mask, offset<<2, m_sfb[0x30/4]);
- break;
- }
- return;
}
}
@@ -551,18 +439,24 @@ WRITE_LINE_MEMBER(decstation_state::ioga_irq_w)
m_maincpu->set_input_line(INPUT_LINE_IRQ3, state);
}
+WRITE_LINE_MEMBER(decstation_state::dz_irq_w)
+{
+ m_maincpu->set_input_line(INPUT_LINE_IRQ2, state);
+}
+
void decstation_state::machine_start()
{
if (m_vrom)
m_vrom_ptr = m_vrom->base();
- save_item(NAME(m_vram));
- save_item(NAME(m_sfb));
- save_item(NAME(m_copy_src));
}
void decstation_state::machine_reset()
{
- m_copy_src = 1;
+ if (m_ioga)
+ {
+ m_ioga->set_dma_space(&m_maincpu->space(AS_PROGRAM));
+ }
+
m_entry = 0;
m_stage = 0;
m_r = m_g = m_b = 0;
@@ -612,8 +506,10 @@ void decstation_state::kn01_map(address_map &map)
void decstation_state::threemin_map(address_map &map)
{
map(0x00000000, 0x07ffffff).ram(); // full 128 MB
- map(0x10000000, 0x13ffffff).rw(FUNC(decstation_state::cfb_r), FUNC(decstation_state::cfb_w));
+ map(0x10000000, 0x1007ffff).rw(FUNC(decstation_state::cfb_r), FUNC(decstation_state::cfb_w));
+ map(0x10100000, 0x101001ff).rw(m_sfb, FUNC(decsfb_device::read), FUNC(decsfb_device::write));
map(0x101c0000, 0x101c000f).m("bt459", FUNC(bt459_device::map)).umask32(0x000000ff);
+ map(0x10200000, 0x103fffff).rw(m_sfb, FUNC(decsfb_device::vram_r), FUNC(decsfb_device::vram_w));
map(0x1c000000, 0x1c07ffff).m(m_ioga, FUNC(dec_ioga_device::map));
map(0x1c0c0000, 0x1c0c0007).rw(m_lance, FUNC(am79c90_device::regs_r), FUNC(am79c90_device::regs_w)).umask32(0x0000ffff);
map(0x1c100000, 0x1c100003).rw(m_scc0, FUNC(z80scc_device::ca_r), FUNC(z80scc_device::ca_w)).umask32(0x0000ff00);
@@ -647,10 +543,11 @@ static void dec_scsi_devices(device_slot_interface &device)
device.option_add_internal("asc", NCR53C94);
}
-MACHINE_CONFIG_START(decstation_state::kn01)
+void decstation_state::kn01(machine_config &config)
+{
R2000(config, m_maincpu, 16.67_MHz_XTAL, 65536, 131072);
m_maincpu->set_endianness(ENDIANNESS_LITTLE);
- m_maincpu->set_fpurev(0x340);
+ m_maincpu->set_fpu(mips1_device_base::MIPS_R3010Av4);
m_maincpu->in_brcond<0>().set(FUNC(decstation_state::brcond0_r));
m_maincpu->set_addrmap(AS_PROGRAM, &decstation_state::kn01_map);
@@ -662,17 +559,20 @@ MACHINE_CONFIG_START(decstation_state::kn01)
m_scantimer->configure_scanline(FUNC(decstation_state::scanline_timer), "screen", 0, 1);
DC7085(config, m_dz, 0);
+ m_dz->int_cb().set(FUNC(decstation_state::dz_irq_w));
+ m_dz->ch1_tx_cb().set("dc7085:ch1", FUNC(dc7085_channel::rx_w));
AM79C90(config, m_lance, XTAL(12'500'000));
MC146818(config, m_rtc, XTAL(32'768));
m_rtc->set_binary(true);
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(decstation_state::kn02ba)
+void decstation_state::kn02ba(machine_config &config)
+{
R3000A(config, m_maincpu, 33.333_MHz_XTAL, 65536, 131072);
m_maincpu->set_endianness(ENDIANNESS_LITTLE);
- m_maincpu->set_fpurev(0x340); // should be R3010A v4.0
+ m_maincpu->set_fpu(mips1_device_base::MIPS_R3010Av4);
m_maincpu->in_brcond<0>().set(FUNC(decstation_state::brcond0_r));
m_maincpu->set_addrmap(AS_PROGRAM, &decstation_state::threemin_map);
@@ -680,10 +580,15 @@ MACHINE_CONFIG_START(decstation_state::kn02ba)
m_screen->set_raw(130000000, 1704, 32, (1280+32), 1064, 3, (1024+3));
m_screen->set_screen_update(FUNC(decstation_state::screen_update));
+ DECSFB(config, m_sfb, 25'000'000); // clock based on white paper which quotes "40ns" gate array cycle times
+// m_sfb->int_cb().set(FUNC(dec_ioga_device::slot0_irq_w));
+
BT459(config, m_bt459, 83'020'800);
AM79C90(config, m_lance, XTAL(12'500'000));
m_lance->intr_out().set("ioga", FUNC(dec_ioga_device::lance_irq_w));
+ m_lance->dma_in().set("ioga", FUNC(dec_ioga_device::lance_dma_r));
+ m_lance->dma_out().set("ioga", FUNC(dec_ioga_device::lance_dma_w));
DECSTATION_IOGA(config, m_ioga, XTAL(12'500'000));
m_ioga->irq_out().set(FUNC(decstation_state::ioga_irq_w));
@@ -714,17 +619,16 @@ MACHINE_CONFIG_START(decstation_state::kn02ba)
rs232b.dcd_handler().set(m_scc0, FUNC(z80scc_device::dcdb_w));
rs232b.cts_handler().set(m_scc0, FUNC(z80scc_device::ctsb_w));
- MCFG_NSCSI_BUS_ADD("scsibus")
- MCFG_NSCSI_ADD("scsibus:0", dec_scsi_devices, "harddisk", false)
- MCFG_NSCSI_ADD("scsibus:1", dec_scsi_devices, "cdrom", false)
- MCFG_NSCSI_ADD("scsibus:2", dec_scsi_devices, nullptr, false)
- MCFG_NSCSI_ADD("scsibus:3", dec_scsi_devices, nullptr, false)
- MCFG_NSCSI_ADD("scsibus:4", dec_scsi_devices, nullptr, false)
- MCFG_NSCSI_ADD("scsibus:5", dec_scsi_devices, nullptr, false)
- MCFG_NSCSI_ADD("scsibus:6", dec_scsi_devices, nullptr, false)
- MCFG_NSCSI_ADD("scsibus:7", dec_scsi_devices, "asc", true)
- MCFG_SLOT_OPTION_MACHINE_CONFIG("asc", [this] (device_t *device) { ncr5394(device); })
-MACHINE_CONFIG_END
+ NSCSI_BUS(config, "scsibus");
+ NSCSI_CONNECTOR(config, "scsibus:0", dec_scsi_devices, "harddisk");
+ NSCSI_CONNECTOR(config, "scsibus:1", dec_scsi_devices, "cdrom");
+ NSCSI_CONNECTOR(config, "scsibus:2", dec_scsi_devices, nullptr);
+ NSCSI_CONNECTOR(config, "scsibus:3", dec_scsi_devices, nullptr);
+ NSCSI_CONNECTOR(config, "scsibus:4", dec_scsi_devices, nullptr);
+ NSCSI_CONNECTOR(config, "scsibus:5", dec_scsi_devices, nullptr);
+ NSCSI_CONNECTOR(config, "scsibus:6", dec_scsi_devices, nullptr);
+ NSCSI_CONNECTOR(config, "scsibus:7", dec_scsi_devices, "asc", true).set_option_machine_config("asc", [this] (device_t *device) { ncr5394(device); });
+}
static INPUT_PORTS_START( decstation )
PORT_START("UNUSED") // unused IN0
diff --git a/src/mame/drivers/dectalk.cpp b/src/mame/drivers/dectalk.cpp
index 4805da6c6bf..ee03a4ed2f3 100644
--- a/src/mame/drivers/dectalk.cpp
+++ b/src/mame/drivers/dectalk.cpp
@@ -876,16 +876,18 @@ TIMER_CALLBACK_MEMBER(dectalk_state::outfifo_read_cb)
m_duart->duart_rx_break(1, 0);*/
}
-MACHINE_CONFIG_START(dectalk_state::dectalk)
+void dectalk_state::dectalk(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M68000, XTAL(20'000'000)/2) /* E74 20MHz OSC (/2) */
- MCFG_DEVICE_PROGRAM_MAP(m68k_mem)
- MCFG_DEVICE_ADD(m_duart, SCN2681, XTAL(3'686'400)) // MC2681 DUART ; Y3 3.6864MHz xtal */
- MCFG_MC68681_IRQ_CALLBACK(WRITELINE(*this, dectalk_state, duart_irq_handler))
- MCFG_MC68681_A_TX_CALLBACK(WRITELINE(*this, dectalk_state, duart_txa))
- MCFG_MC68681_B_TX_CALLBACK(WRITELINE("rs232", rs232_port_device, write_txd))
- MCFG_MC68681_INPORT_CALLBACK(READ8(*this, dectalk_state, duart_input))
- MCFG_MC68681_OUTPORT_CALLBACK(WRITE8(*this, dectalk_state, duart_output))
+ M68000(config, m_maincpu, XTAL(20'000'000)/2); /* E74 20MHz OSC (/2) */
+ m_maincpu->set_addrmap(AS_PROGRAM, &dectalk_state::m68k_mem);
+
+ SCN2681(config, m_duart, XTAL(3'686'400)); // MC2681 DUART ; Y3 3.6864MHz xtal */
+ m_duart->irq_cb().set(FUNC(dectalk_state::duart_irq_handler));
+ m_duart->a_tx_cb().set(FUNC(dectalk_state::duart_txa));
+ m_duart->b_tx_cb().set("rs232", FUNC(rs232_port_device::write_txd));
+ m_duart->inport_cb().set(FUNC(dectalk_state::duart_input));
+ m_duart->outport_cb().set(FUNC(dectalk_state::duart_output));
TMS32010(config, m_dsp, XTAL(20'000'000)); /* Y1 20MHz xtal */
m_dsp->set_addrmap(AS_PROGRAM, &dectalk_state::tms32010_mem);
@@ -893,9 +895,9 @@ MACHINE_CONFIG_START(dectalk_state::dectalk)
m_dsp->bio().set(FUNC(dectalk_state::spc_semaphore_r)); //read infifo-has-data-in-it fifo readable status
#ifdef USE_LOOSE_TIMING
- MCFG_QUANTUM_TIME(attotime::from_hz(100))
+ config.m_minimum_quantum = attotime::from_hz(100);
#else
- MCFG_QUANTUM_PERFECT_CPU("dsp")
+ config.m_perfect_cpu_quantum = subtag("dsp");
#endif
X2212(config, "x2212");
@@ -904,15 +906,16 @@ MACHINE_CONFIG_START(dectalk_state::dectalk)
/* sound hardware */
SPEAKER(config, "speaker").front_center();
- MCFG_DEVICE_ADD("dac", AD7541, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 0.9) // ad7541.e107 (E88 10KHz OSC, handled by timer)
- MCFG_DEVICE_ADD("vref", VOLTAGE_REGULATOR, 0) MCFG_VOLTAGE_REGULATOR_OUTPUT(5.0)
- MCFG_SOUND_ROUTE(0, "dac", 1.0, DAC_VREF_POS_INPUT) MCFG_SOUND_ROUTE(0, "dac", -1.0, DAC_VREF_NEG_INPUT)
+ AD7541(config, m_dac, 0).add_route(ALL_OUTPUTS, "speaker", 0.9); // ad7541.e107 (E88 10KHz OSC, handled by timer)
+ voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref"));
+ vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT);
+ vref.add_route(0, "dac", -1.0, DAC_VREF_NEG_INPUT);
/* Y2 is a 3.579545 MHz xtal for the dtmf decoder chip */
rs232_port_device &rs232(RS232_PORT(config, "rs232", default_rs232_devices, "terminal"));
rs232.rxd_handler().set(m_duart, FUNC(scn2681_device::rx_b_w));
-MACHINE_CONFIG_END
+}
diff --git a/src/mame/drivers/decwritr.cpp b/src/mame/drivers/decwritr.cpp
index ead4c944006..bcd83f09b89 100644
--- a/src/mame/drivers/decwritr.cpp
+++ b/src/mame/drivers/decwritr.cpp
@@ -408,25 +408,25 @@ void decwriter_state::machine_reset()
// MACHINE DRIVERS
//**************************************************************************
-MACHINE_CONFIG_START(decwriter_state::la120)
-
- MCFG_DEVICE_ADD("maincpu", I8080A, XTAL(18'000'000) / 9) // 18Mhz xtal on schematics, using an i8224 clock divider/reset sanitizer IC
- MCFG_DEVICE_PROGRAM_MAP(la120_mem)
- MCFG_DEVICE_IO_MAP(la120_io)
- //MCFG_DEVICE_IRQ_ACKNOWLEDGE_DEVICE("prtlsi", dc305_device, inta_cb)
+void decwriter_state::la120(machine_config &config)
+{
+ I8080A(config, m_maincpu, XTAL(18'000'000) / 9); // 18Mhz xtal on schematics, using an i8224 clock divider/reset sanitizer IC
+ m_maincpu->set_addrmap(AS_PROGRAM, &decwriter_state::la120_mem);
+ m_maincpu->set_addrmap(AS_IO, &decwriter_state::la120_io);
+ //m_maincpu->set_irq_acknowledge_callback("prtlsi", FUNC(dc305_device::inta_cb));
/* video hardware */
//TODO: no actual screen! has 8 leds above the keyboard (similar to vt100/vk100) and has 4 7segment leds for showing an error code.
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_UPDATE_DRIVER(decwriter_state, screen_update)
- MCFG_SCREEN_SIZE(640,480)
- MCFG_SCREEN_VISIBLE_AREA(0,639, 0,479)
- MCFG_SCREEN_REFRESH_RATE(30)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_screen_update(FUNC(decwriter_state::screen_update));
+ screen.set_size(640,480);
+ screen.set_visarea_full();
+ screen.set_refresh_hz(30);
- //MCFG_DEVICE_ADD("prtlsi", DC305, XTAL(18'000'000) / 9)
- //MCFG_DC305_OUT_RXC_CB(WRITELINE("usart", i8251_device, write_rxc))
- //MCFG_DC305_OUT_TXC_CB(WRITELINE("usart", i8251_device, write_txc))
- //MCFG_DC305_OUT_INT_CB(WRITELINE("mainint", input_merger_device, in_w<0>))
+ //dc305_device &prtlsi(DC305(config, "prtlsi", XTAL(18'000'000) / 9));
+ //prtlsi.out_rxc_cb().set("usart", FUNC(i8251_device, write_rxc));
+ //prtlsi.out_txc_cb().set("usart", FUNC(i8251_device, write_txc));
+ //prtlsi.out_int_cb().set("mainint", FUNC(input_merger_device::in_w<0>));
LS259(config, m_ledlatch); // E2 on keyboard
m_ledlatch->q_out_cb<0>().set_output("led1").invert(); // ON LINE
@@ -442,8 +442,7 @@ MACHINE_CONFIG_START(decwriter_state::la120)
/* audio hardware */
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("beeper", BEEP, 786) // TODO: LA120 speaker is controlled by asic; VT100 has: 7.945us per serial clock = ~125865.324hz, / 160 clocks per char = ~ 786 hz
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.50)
+ BEEP(config, m_speaker, 786).add_route(ALL_OUTPUTS, "mono", 0.50); // TODO: LA120 speaker is controlled by asic; VT100 has: 7.945us per serial clock = ~125865.324hz, / 160 clocks per char = ~ 786 hz
/* i8251 */
I8251(config, "usart", XTAL(18'000'000) / 9);
@@ -453,8 +452,7 @@ MACHINE_CONFIG_START(decwriter_state::la120)
usart.rts_handler().set(RS232_TAG, FUNC(rs232_port_device::write_rts));
usart.rxrdy_handler().set("mainint", FUNC(input_merger_device::in_w<1>));
- MCFG_INPUT_MERGER_ANY_HIGH("mainint")
- MCFG_INPUT_MERGER_OUTPUT_HANDLER(INPUTLINE("maincpu", 0))
+ INPUT_MERGER_ANY_HIGH(config, "mainint").output_handler().set_inputline(m_maincpu, 0);
rs232_port_device &rs232(RS232_PORT(config, RS232_TAG, default_rs232_devices, nullptr));
rs232.rxd_handler().set("usart", FUNC(i8251_device::write_rxd));
@@ -462,7 +460,7 @@ MACHINE_CONFIG_START(decwriter_state::la120)
*/
ER1400(config, m_nvm);
-MACHINE_CONFIG_END
+}
diff --git a/src/mame/drivers/deniam.cpp b/src/mame/drivers/deniam.cpp
index 7823f6ccc77..d03c39074ee 100644
--- a/src/mame/drivers/deniam.cpp
+++ b/src/mame/drivers/deniam.cpp
@@ -253,11 +253,11 @@ void deniam_state::machine_reset()
void deniam_state::deniam16b(machine_config &config)
{
/* basic machine hardware */
- M68000(config, m_maincpu, XTAL(25'000'000)/2); /* 12.5Mhz verified */
+ M68000(config, m_maincpu, XTAL(25'000'000)/2); /* 12.5Mhz verified */
m_maincpu->set_addrmap(AS_PROGRAM, &deniam_state::deniam16b_map);
m_maincpu->set_vblank_int("screen", FUNC(deniam_state::irq4_line_assert));
- Z80(config, m_audiocpu, XTAL(25'000'000)/4); /* 6.25Mhz verified */
+ Z80(config, m_audiocpu, XTAL(25'000'000)/4); /* 6.25Mhz verified */
m_audiocpu->set_addrmap(AS_PROGRAM, &deniam_state::sound_map);
m_audiocpu->set_addrmap(AS_IO, &deniam_state::sound_io_map);
@@ -291,7 +291,7 @@ void deniam_state::deniam16b(machine_config &config)
void deniam_state::deniam16c(machine_config &config)
{
/* basic machine hardware */
- M68000(config, m_maincpu, XTAL(25'000'000)/2); /* 12.5Mhz verified */
+ M68000(config, m_maincpu, XTAL(25'000'000)/2); /* 12.5Mhz verified */
m_maincpu->set_addrmap(AS_PROGRAM, &deniam_state::deniam16c_map);
m_maincpu->set_vblank_int("screen", FUNC(deniam_state::irq4_line_assert));
diff --git a/src/mame/drivers/deshoros.cpp b/src/mame/drivers/deshoros.cpp
index cb489a945da..8dfda215b70 100644
--- a/src/mame/drivers/deshoros.cpp
+++ b/src/mame/drivers/deshoros.cpp
@@ -266,21 +266,21 @@ void destiny_state::machine_reset()
bank_select_w(m_maincpu->space(AS_PROGRAM), 0, 0);
}
-MACHINE_CONFIG_START(destiny_state::destiny)
-
+void destiny_state::destiny(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M6809, XTAL(4'000'000)/2)
- MCFG_DEVICE_PROGRAM_MAP(main_map)
- MCFG_DEVICE_PERIODIC_INT_DRIVER(destiny_state, irq0_line_hold, 50) // timer irq controls update speed, frequency needs to be determined yet (2MHz through three 74LS390)
+ M6809(config, m_maincpu, XTAL(4'000'000)/2);
+ m_maincpu->set_addrmap(AS_PROGRAM, &destiny_state::main_map);
+ m_maincpu->set_periodic_int(FUNC(destiny_state::irq0_line_hold), attotime::from_hz(50)); // timer irq controls update speed, frequency needs to be determined yet (2MHz through three 74LS390)
/* video hardware (dummy) */
- MCFG_SCREEN_ADD("screen", LCD)
- MCFG_SCREEN_REFRESH_RATE(50)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */
- MCFG_SCREEN_SIZE(6*16, 9*2)
- MCFG_SCREEN_VISIBLE_AREA(0, 6*16-1, 0, 9*2-1)
- MCFG_SCREEN_UPDATE_DRIVER(destiny_state, screen_update_destiny)
- MCFG_SCREEN_PALETTE("palette")
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_LCD));
+ screen.set_refresh_hz(50);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */
+ screen.set_size(6*16, 9*2);
+ screen.set_visarea_full();
+ screen.set_screen_update(FUNC(destiny_state::screen_update_destiny));
+ screen.set_palette("palette");
PALETTE(config, "palette", palette_device::MONOCHROME);
@@ -288,7 +288,7 @@ MACHINE_CONFIG_START(destiny_state::destiny)
SPEAKER(config, "mono").front_center();
BEEP(config, m_beeper, 800); // TODO: determine exact frequency thru schematics
m_beeper->add_route(ALL_OUTPUTS, "mono", 0.50);
-MACHINE_CONFIG_END
+}
diff --git a/src/mame/drivers/destroyr.cpp b/src/mame/drivers/destroyr.cpp
index bd91789eef2..33c33c66d7b 100644
--- a/src/mame/drivers/destroyr.cpp
+++ b/src/mame/drivers/destroyr.cpp
@@ -465,12 +465,12 @@ void destroyr_state::machine_start()
save_item(NAME(m_potsense));
}
-MACHINE_CONFIG_START(destroyr_state::destroyr)
-
+void destroyr_state::destroyr(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M6800, XTAL(12'096'000) / 16)
- MCFG_DEVICE_PROGRAM_MAP(destroyr_map)
- MCFG_DEVICE_PERIODIC_INT_DRIVER(destroyr_state, irq0_line_assert, 4*60)
+ M6800(config, m_maincpu, XTAL(12'096'000) / 16);
+ m_maincpu->set_addrmap(AS_PROGRAM, &destroyr_state::destroyr_map);
+ m_maincpu->set_periodic_int(FUNC(destroyr_state::irq0_line_assert), attotime::from_hz(4*60));
f9334_device &outlatch(F9334(config, "outlatch")); // F8
outlatch.q_out_cb<0>().set_output("led0").invert(); // LED 1
@@ -485,18 +485,18 @@ MACHINE_CONFIG_START(destroyr_state::destroyr)
WATCHDOG_TIMER(config, m_watchdog);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_SIZE(256, 262)
- MCFG_SCREEN_VISIBLE_AREA(0, 255, 0, 239)
- MCFG_SCREEN_UPDATE_DRIVER(destroyr_state, screen_update)
- MCFG_SCREEN_PALETTE(m_palette)
-
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, m_palette, gfx_destroyr)
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_refresh_hz(60);
+ m_screen->set_size(256, 262);
+ m_screen->set_visarea(0, 255, 0, 239);
+ m_screen->set_screen_update(FUNC(destroyr_state::screen_update));
+ m_screen->set_palette(m_palette);
+
+ GFXDECODE(config, m_gfxdecode, m_palette, gfx_destroyr);
PALETTE(config, m_palette, FUNC(destroyr_state::destroyr_palette), 8);
/* sound hardware */
-MACHINE_CONFIG_END
+}
ROM_START( destroyr )
diff --git a/src/mame/drivers/dfruit.cpp b/src/mame/drivers/dfruit.cpp
index 4e542240a84..634c4a59914 100644
--- a/src/mame/drivers/dfruit.cpp
+++ b/src/mame/drivers/dfruit.cpp
@@ -371,28 +371,28 @@ TIMER_DEVICE_CALLBACK_MEMBER(dfruit_state::dfruit_irq_scanline)
#define MASTER_CLOCK XTAL(14'000'000)
-MACHINE_CONFIG_START(dfruit_state::dfruit)
-
+void dfruit_state::dfruit(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu",Z80,MASTER_CLOCK/2) //!!! TC0091LVC !!!
- MCFG_DEVICE_PROGRAM_MAP(dfruit_map)
- MCFG_TIMER_DRIVER_ADD_SCANLINE("scantimer", dfruit_state, dfruit_irq_scanline, "screen", 0, 1)
+ Z80(config, m_maincpu, MASTER_CLOCK/2); //!!! TC0091LVC !!!
+ m_maincpu->set_addrmap(AS_PROGRAM, &dfruit_state::dfruit_map);
+ TIMER(config, "scantimer").configure_scanline(FUNC(dfruit_state::dfruit_irq_scanline), "screen", 0, 1);
//MCFG_MACHINE_START_OVERRIDE(dfruit_state,4enraya)
//MCFG_MACHINE_RESET_OVERRIDE(dfruit_state,4enraya)
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(64*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 40*8-1, 2*8, 30*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(dfruit_state, screen_update)
- MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE(*this, dfruit_state, screen_vblank))
- MCFG_SCREEN_PALETTE("palette")
-
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_dfruit )
- MCFG_PALETTE_ADD("palette", 0x100)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(64*8, 32*8);
+ screen.set_visarea(0*8, 40*8-1, 2*8, 30*8-1);
+ screen.set_screen_update(FUNC(dfruit_state::screen_update));
+ screen.screen_vblank().set(FUNC(dfruit_state::screen_vblank));
+ screen.set_palette("palette");
+
+ GFXDECODE(config, "gfxdecode", "palette", gfx_dfruit);
+ PALETTE(config, "palette").set_entries(0x100);
TC0091LVC(config, m_vdp, 0);
m_vdp->set_gfxdecode_tag("gfxdecode");
@@ -408,7 +408,7 @@ MACHINE_CONFIG_START(dfruit_state::dfruit)
opn.port_a_read_callback().set_ioport("IN4");
opn.port_b_read_callback().set_ioport("IN5");
opn.add_route(ALL_OUTPUTS, "mono", 0.30);
-MACHINE_CONFIG_END
+}
/***************************************************************************
diff --git a/src/mame/drivers/dgn_beta.cpp b/src/mame/drivers/dgn_beta.cpp
index 36048fc99de..3e635eab3d6 100644
--- a/src/mame/drivers/dgn_beta.cpp
+++ b/src/mame/drivers/dgn_beta.cpp
@@ -317,26 +317,27 @@ static void dgnbeta_floppies(device_slot_interface &device)
device.option_add("dd", FLOPPY_35_DD);
}
-MACHINE_CONFIG_START(dgn_beta_state::dgnbeta)
+void dgn_beta_state::dgnbeta(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD(MAINCPU_TAG, MC6809E, DGNBETA_CPU_SPEED_HZ) /* 2 MHz */
- MCFG_DEVICE_PROGRAM_MAP(dgnbeta_map)
- MCFG_DEVICE_DISASSEMBLE_OVERRIDE(dgn_beta_state, dgnbeta_dasm_override)
+ MC6809E(config, m_maincpu, DGNBETA_CPU_SPEED_HZ); /* 2 MHz */
+ m_maincpu->set_addrmap(AS_PROGRAM, &dgn_beta_state::dgnbeta_map);
+ m_maincpu->set_dasm_override(FUNC(dgn_beta_state::dgnbeta_dasm_override));
/* both cpus in the beta share the same address/data buses */
- MCFG_DEVICE_ADD(DMACPU_TAG, MC6809E, DGNBETA_CPU_SPEED_HZ) /* 2 MHz */
- MCFG_DEVICE_PROGRAM_MAP(dgnbeta_map)
+ MC6809E(config, m_dmacpu, DGNBETA_CPU_SPEED_HZ); /* 2 MHz */
+ m_dmacpu->set_addrmap(AS_PROGRAM, &dgn_beta_state::dgnbeta_map);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(DGNBETA_FRAMES_PER_SECOND)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(100))
- MCFG_SCREEN_SIZE(700,550)
- MCFG_SCREEN_VISIBLE_AREA(0, 699, 0, 549)
- MCFG_SCREEN_UPDATE_DEVICE( "crtc", hd6845_device, screen_update )
- MCFG_SCREEN_VIDEO_ATTRIBUTES(VIDEO_UPDATE_AFTER_VBLANK)
-
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, m_palette, gfx_dgnbeta)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(DGNBETA_FRAMES_PER_SECOND);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(100));
+ screen.set_size(700,550);
+ screen.set_visarea(0, 699, 0, 549);
+ screen.set_screen_update("crtc", FUNC(hd6845_device::screen_update));
+ screen.set_video_attributes(VIDEO_UPDATE_AFTER_VBLANK);
+
+ GFXDECODE(config, "gfxdecode", m_palette, gfx_dgnbeta);
PALETTE(config, m_palette, FUNC(dgn_beta_state::dgn_beta_palette), ARRAY_LENGTH(dgnbeta_pens));
/* PIA 0 at $FC20-$FC23 I46 */
@@ -373,14 +374,10 @@ MACHINE_CONFIG_START(dgn_beta_state::dgnbeta)
m_fdc->intrq_wr_callback().set(FUNC(dgn_beta_state::dgnbeta_fdc_intrq_w));
m_fdc->drq_wr_callback().set(FUNC(dgn_beta_state::dgnbeta_fdc_drq_w));
- MCFG_FLOPPY_DRIVE_ADD(FDC_TAG ":0", dgnbeta_floppies, "dd", dgn_beta_state::floppy_formats)
- MCFG_FLOPPY_DRIVE_SOUND(true)
- MCFG_FLOPPY_DRIVE_ADD(FDC_TAG ":1", dgnbeta_floppies, "dd", dgn_beta_state::floppy_formats)
- MCFG_FLOPPY_DRIVE_SOUND(true)
- MCFG_FLOPPY_DRIVE_ADD(FDC_TAG ":2", dgnbeta_floppies, nullptr, dgn_beta_state::floppy_formats)
- MCFG_FLOPPY_DRIVE_SOUND(true)
- MCFG_FLOPPY_DRIVE_ADD(FDC_TAG ":3", dgnbeta_floppies, nullptr, dgn_beta_state::floppy_formats)
- MCFG_FLOPPY_DRIVE_SOUND(true)
+ FLOPPY_CONNECTOR(config, FDC_TAG ":0", dgnbeta_floppies, "dd", dgn_beta_state::floppy_formats).enable_sound(true);
+ FLOPPY_CONNECTOR(config, FDC_TAG ":1", dgnbeta_floppies, "dd", dgn_beta_state::floppy_formats).enable_sound(true);
+ FLOPPY_CONNECTOR(config, FDC_TAG ":2", dgnbeta_floppies, nullptr, dgn_beta_state::floppy_formats).enable_sound(true);
+ FLOPPY_CONNECTOR(config, FDC_TAG ":3", dgnbeta_floppies, nullptr, dgn_beta_state::floppy_formats).enable_sound(true);
HD6845(config, m_mc6845, 12.288_MHz_XTAL / 16); //XTAL is guessed
m_mc6845->set_screen("screen");
@@ -398,8 +395,8 @@ MACHINE_CONFIG_START(dgn_beta_state::dgnbeta)
/* in blocks of 128K up to this maximum. */
/* software lists */
- MCFG_SOFTWARE_LIST_ADD("flop_list", "dgnbeta_flop")
-MACHINE_CONFIG_END
+ SOFTWARE_LIST(config, "flop_list").set_original("dgnbeta_flop");
+}
ROM_START(dgnbeta)
ROM_REGION(0x4000,MAINCPU_TAG,0)
diff --git a/src/mame/drivers/dgpix.cpp b/src/mame/drivers/dgpix.cpp
index ad3d02361e2..7e855c2e3c3 100644
--- a/src/mame/drivers/dgpix.cpp
+++ b/src/mame/drivers/dgpix.cpp
@@ -431,10 +431,11 @@ void dgpix_state::machine_reset()
}
-MACHINE_CONFIG_START(dgpix_state::dgpix)
- MCFG_DEVICE_ADD("maincpu", E132XT, 20000000*4) /* 4x internal multiplier */
- MCFG_DEVICE_PROGRAM_MAP(cpu_map)
- MCFG_DEVICE_IO_MAP(io_map)
+void dgpix_state::dgpix(machine_config &config)
+{
+ E132XT(config, m_maincpu, 20000000*4); /* 4x internal multiplier */
+ m_maincpu->set_addrmap(AS_PROGRAM, &dgpix_state::cpu_map);
+ m_maincpu->set_addrmap(AS_IO, &dgpix_state::io_map);
/*
unknown 16bit sound cpu, embedded inside the KS0164 sound chip
@@ -444,19 +445,19 @@ MACHINE_CONFIG_START(dgpix_state::dgpix)
NVRAM(config, "nvram", nvram_device::DEFAULT_NONE);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */)
- MCFG_SCREEN_SIZE(512, 256)
- MCFG_SCREEN_VISIBLE_AREA(0, 319, 0, 239)
- MCFG_SCREEN_UPDATE_DRIVER(dgpix_state, screen_update_dgpix)
- MCFG_SCREEN_PALETTE("palette")
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500) /* not accurate */);
+ screen.set_size(512, 256);
+ screen.set_visarea(0, 319, 0, 239);
+ screen.set_screen_update(FUNC(dgpix_state::screen_update_dgpix));
+ screen.set_palette("palette");
PALETTE(config, "palette", palette_device::BGR_555);
/* sound hardware */
// KS0164 sound chip
-MACHINE_CONFIG_END
+}
/*
diff --git a/src/mame/drivers/diablo1300.cpp b/src/mame/drivers/diablo1300.cpp
index 868a3f7867b..692ad0730c5 100644
--- a/src/mame/drivers/diablo1300.cpp
+++ b/src/mame/drivers/diablo1300.cpp
@@ -176,12 +176,13 @@ void diablo1300_state::machine_reset()
{
}
-MACHINE_CONFIG_START( diablo1300_state::diablo1300 )
+void diablo1300_state::diablo1300(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", DIABLO1300, XTAL(1'689'600))
- MCFG_DEVICE_PROGRAM_MAP(diablo1300_map)
- MCFG_DEVICE_DATA_MAP(diablo1300_data_map)
-MACHINE_CONFIG_END
+ DIABLO1300(config, m_maincpu, XTAL(1'689'600));
+ m_maincpu->set_addrmap(AS_PROGRAM, &diablo1300_state::diablo1300_map);
+ m_maincpu->set_addrmap(AS_DATA, &diablo1300_state::diablo1300_data_map);
+}
ROM_START( diablo )
ROM_REGION( 0x10000, "maincpu", ROMREGION_16BIT )
diff --git a/src/mame/drivers/didact.cpp b/src/mame/drivers/didact.cpp
index 5e2651d8be7..0fa835eb64f 100644
--- a/src/mame/drivers/didact.cpp
+++ b/src/mame/drivers/didact.cpp
@@ -2,13 +2,15 @@
// copyright-holders:Joakim Larsson Edstrom
/*
*
- * History of Didact
- *------------------
+ * History of Didact and Esselte Studium
+ *--------------------------------------
* Didact Laromedelsproduktion was started in Linkoping in Sweden by Anders Andersson, Arne Kullbjer and
* Lars Bjorklund. They constructed a series of microcomputers for educational purposes such as "Mikrodator 6802",
* Esselte 100 and the Candela computer for the swedish schools to educate the students in assembly programming
* and BASIC for electro mechanical applications such as stepper motors, simple process control, buttons
- * and LED:s. Didact designs were marketed by Esselte Studium to the swedish schools.
+ * and LED:s. Didact designs were marketed by Esselte Studium to the swedish schools. Late designs like the
+ * "Modulab v2" appears to have been owned or licensed to Esselte and enhanced with more modular monitor routines
+ * in a project driven by Alf Karlsson.
*
* The Esselte 1000 was an educational package based on Apple II plus software and litterature
* but the relation to Didact is at this point unknown so it is probably a pure Esselte software production.
@@ -21,28 +23,30 @@
* http://elektronikforumet.com/forum/viewtopic.php?f=2&t=79576&start=150#p1203915
*
* TODO:
- * Didact designs: mp68a, md6802, Modulab, Esselte 100
- * -------------------------------------------------------
- * - Add PCB layouts OK OK OK
- * - Dump ROM:s, OK OK rev2
- * - Keyboard OK OK rev2
- * - Display/CRT OK OK OK
- * - Clickable Artwork RQ RQ
+ * Didact designs: mp68a, md6802, Modulab
+ * ------------------------------------------
+ * - Add PCB layouts OK OK OK
+ * - Dump ROM:s, OK OK OK
+ * - Keyboard OK OK OK
+ * - Display/CRT OK OK OK
+ * - Clickable Artwork RQ RQ OK
* - Sound NA NA
- * - Cassette i/f OK
+ * - Cassette i/f
* - Expansion bus
* - Expansion overlay
- * - Interrupts OK OK
- * - Serial XX XX
+ * - Interrupts OK
+ * - Serial XX
* XX = needs debug
- ****************************************************************************/
+ *********************************************/
#include "emu.h"
-#include "cpu/m6800/m6800.h" // For mp68a, md6802
+#include "cpu/m6800/m6800.h" // For all boards
#include "machine/6821pia.h" // For all boards
#include "machine/74145.h" // For the md6802
-#include "machine/timer.h"
#include "video/dm9368.h" // For the mp68a
+#include "machine/ins8154.h" // For the modulab
+#include "machine/mm74c922.h"// For the modulab
+#include "machine/rescap.h" // For the modulab
// Features
#include "imagedev/cassette.h"
@@ -52,32 +56,25 @@
// Generated artwork includes
#include "mp68a.lh"
#include "md6802.lh"
+#include "modulab.lh"
//**************************************************************************
// MACROS / CONSTANTS
//**************************************************************************
-#define LOG_SETUP (1U << 1)
-#define LOG_SCAN (1U << 2)
-#define LOG_BANK (1U << 3)
-#define LOG_SCREEN (1U << 4)
-#define LOG_READ (1U << 5)
-#define LOG_CS (1U << 6)
-#define LOG_PLA (1U << 7)
-#define LOG_PROM (1U << 8)
+#define LOG_SETUP (1U << 1)
+#define LOG_READ (1U << 2)
+#define LOG_DISPLAY (1U << 3)
+#define LOG_KEYBOARD (1U << 4)
-//#define VERBOSE (LOG_READ | LOG_GENERAL | LOG_SETUP | LOG_PLA | LOG_BANK)
+//#define VERBOSE (LOG_KEYBOARD)
//#define LOG_OUTPUT_FUNC printf
#include "logmacro.h"
-#define LOGSETUP(...) LOGMASKED(LOG_SETUP, __VA_ARGS__)
-#define LOGSCAN(...) LOGMASKED(LOG_SCAN, __VA_ARGS__)
-#define LOGBANK(...) LOGMASKED(LOG_BANK, __VA_ARGS__)
-#define LOGSCREEN(...) LOGMASKED(LOG_SCREEN, __VA_ARGS__)
-#define LOGR(...) LOGMASKED(LOG_READ, __VA_ARGS__)
-#define LOGCS(...) LOGMASKED(LOG_CS, __VA_ARGS__)
-#define LOGPLA(...) LOGMASKED(LOG_PLA, __VA_ARGS__)
-#define LOGPROM(...) LOGMASKED(LOG_PROM, __VA_ARGS__)
+#define LOGSETUP(...) LOGMASKED(LOG_SETUP, __VA_ARGS__)
+#define LOGREAD(...) LOGMASKED(LOG_READ, __VA_ARGS__)
+#define LOGDISPLAY(...) LOGMASKED(LOG_DISPLAY, __VA_ARGS__)
+#define LOGKBD(...) LOGMASKED(LOG_KEYBOARD, __VA_ARGS__)
#ifdef _MSC_VER
#define FUNCNAME __func__
@@ -89,6 +86,7 @@
#define PIA2_TAG "pia2"
#define PIA3_TAG "pia3"
#define PIA4_TAG "pia4"
+#define MM74C923_TAG "74c923"
/* Didact base class */
class didact_state : public driver_device
@@ -98,23 +96,21 @@ class didact_state : public driver_device
: driver_device(mconfig, type, tag)
, m_io_lines(*this, "LINE%u", 0U)
, m_lines{ 0, 0, 0, 0 }
- , m_led(0)
, m_rs232(*this, "rs232")
- , m_leds(*this, "led%u", 0U)
+ , m_led(*this, "led1")
{ }
- TIMER_DEVICE_CALLBACK_MEMBER(scan_artwork);
-
+ DECLARE_INPUT_CHANGED_MEMBER(trigger_reset);
+ DECLARE_INPUT_CHANGED_MEMBER(trigger_shift);
protected:
- virtual void machine_start() override { m_leds.resolve(); }
+ virtual void machine_start() override { m_led.resolve(); }
required_ioport_array<5> m_io_lines;
uint8_t m_lines[4];
uint8_t m_reset;
uint8_t m_shift;
- uint8_t m_led;
optional_device<rs232_port_device> m_rs232;
- output_finder<2> m_leds;
+ output_finder<> m_led;
};
@@ -175,7 +171,7 @@ protected:
DECLARE_WRITE8_MEMBER( pia2_kbA_w );
DECLARE_READ8_MEMBER( pia2_kbB_r );
DECLARE_WRITE8_MEMBER( pia2_kbB_w );
- DECLARE_WRITE_LINE_MEMBER( pia2_ca2_w);
+ DECLARE_WRITE_LINE_MEMBER( pia2_ca2_w );
virtual void machine_reset() override;
virtual void machine_start() override;
@@ -212,7 +208,7 @@ READ8_MEMBER( md6802_state::pia2_kbA_r )
if (m_shift)
{
pa &= 0x7f; // Clear shift bit if button being pressed (PA7) to ground (internal pullup)
- LOG("SHIFT is pressed\n");
+ LOGKBD("SHIFT is pressed\n");
}
// Serial IN - needs debug/verification
@@ -251,8 +247,8 @@ WRITE8_MEMBER( md6802_state::pia2_kbB_w )
WRITE_LINE_MEMBER( md6802_state::pia2_ca2_w )
{
- LOG("--->%s(%02x) LED is connected through resisitor to +5v so logical 0 will lit it\n", FUNCNAME, state);
- m_leds[m_led] = state ? 0 :1;
+ LOGKBD("--->%s(%02x) LED is connected through resisitor to +5v so logical 0 will lit it\n", FUNCNAME, state);
+ m_led = state ? 0 :1;
// Serial Out - needs debug/verification
m_rs232->write_txd(state);
@@ -269,13 +265,11 @@ void md6802_state::machine_start()
save_item(NAME(m_reset));
save_item(NAME(m_shift));
- save_item(NAME(m_led));
}
void md6802_state::machine_reset()
{
LOG("--->%s()\n", FUNCNAME);
- m_led = 1;
m_maincpu->reset();
}
@@ -365,6 +359,20 @@ protected:
required_device<pia6820_device> m_pia2;
};
+INPUT_CHANGED_MEMBER(didact_state::trigger_shift)
+{
+ if (newval == CLEAR_LINE)
+ {
+ LOGKBD("SHIFT is released\n");
+ }
+ else
+ {
+ LOGKBD("SHIFT is pressed\n");
+ m_shift = 1;
+ m_led = 1;
+ }
+}
+
READ8_MEMBER( mp68a_state::pia2_kbA_r )
{
LOG("--->%s\n", FUNCNAME);
@@ -401,7 +409,7 @@ READ8_MEMBER( mp68a_state::pia2_kbB_r )
{
uint8_t a012, line, pb;
- LOG("--->%s %02x %02x %02x %02x %02x => ", FUNCNAME, m_lines[0], m_lines[1], m_lines[2], m_lines[3], m_shift);
+ LOGKBD("--->%s %02x %02x %02x %02x %02x => ", FUNCNAME, m_lines[0], m_lines[1], m_lines[2], m_lines[3], m_shift);
a012 = 0;
if ((line = (m_lines[0] | m_lines[1])) != 0)
@@ -422,11 +430,11 @@ READ8_MEMBER( mp68a_state::pia2_kbB_r )
{
pb |= 0x80; // Set shift bit (PB7)
m_shift = 0; // Reset flip flop
- m_leds[m_led] = m_shift ? 1 : 0;
- LOG("SHIFT is released\n");
+ m_led = 0;
+ LOGKBD(" SHIFT is released\n");
}
- LOG("%02x\n", pb);
+ LOGKBD("%02x\n", pb);
return pb;
}
@@ -441,10 +449,8 @@ READ_LINE_MEMBER( mp68a_state::pia2_cb1_r )
for (unsigned i = 0U; 4U > i; ++i)
m_lines[i] = m_io_lines[i]->read();
-#if VERBOSE
- if (m_lines[0] | m_lines[1] | m_lines[2] | m_lines[3])
+ if ((VERBOSE & LOG_GENERAL) && (m_lines[0] | m_lines[1] | m_lines[2] | m_lines[3]))
LOG("%s()-->%02x %02x %02x %02x\n", FUNCNAME, m_lines[0], m_lines[1], m_lines[2], m_lines[3]);
-#endif
return (m_lines[0] | m_lines[1] | m_lines[2] | m_lines[3]) ? 0 : 1;
}
@@ -464,7 +470,6 @@ void mp68a_state::machine_start()
/* register for state saving */
save_item(NAME(m_shift));
- save_item(NAME(m_led));
save_item(NAME(m_reset));
}
@@ -478,6 +483,213 @@ void mp68a_state::mp68a_map(address_map &map)
map(0x0800, 0x0bff).rom().mirror(0xf400).region("maincpu", 0x0800);
}
+//===================
+
+/* The Modulab CPU board, by Didact/Esselte ca 1984
+ * __________________________________________________________________________________________
+ * | ADRESS DATA |
+ * | PORT A +-_--++-_--++-_--++-_--+ +-_--++-_--+ VCC |
+ * | o o o o o o o o || | ||| | ||| | ||| | | || | ||| | | O |
+ * | 7 6 5 4 3 2 1 0 | - || - || - || - | | - || - | |
+ * | o o o o o o o o ||_|.|||_|.|||_|.|||_|.| ||_|.|||_|.| GND |
+ * | PORT B +----++----++----++----+ +----++----+ O |
+ * | o VCC +--+ +--+ +--+ +--+ +--+ +--+ |
+ * | |LS| |LS| |LS| |LS| |LS| |LS| |
+ * | o GND |164 |164 |164 |164 |164 |164 |
+ * \\ |-5|<-|-4|<-|-3|<-|-2| <- |-1|<-|-0|<- DB0 |
+ * |\\ ____ +--+ +--+ +--+ +--+ +--+ +--+ |
+ * | \/o O| +-------+-------+-------+-------+-------+
+ * | | |E +--------------------+ +--+ | | | | | |
+ * | | |X +----+ | PIA + 128x8 SRAM | |LS| | RUN | ADS | FWD | C/B | RESET |
+ * | | |P |4MHz| | INS8154N | |14| | | | | | |
+ * | | |A |XTAL| +--------------------+ | | +-------+-------+-------+-------+-------+
+ * | | |N |____| +--+ | | | | | |
+ * | |__ |S | | +--------------------+ +--+ | C | D | E | F | |
+ * | __| |I | CPU | |LS| | | | | | |
+ * | | |O | MC6802P | |138 +-------+-------+-------+-------+ |
+ * | | |N +--------------------+ | | | | | | | |
+ * | | |B +--+ | 8 | 9 | A | B | |
+ * | | |U IRQ +-------------+ +--+ | | | | | |
+ * | | |S o | EPROM | |74| +-------+-------+-------+-------+ |
+ * | /\o O| | 2764 | |C | | | | | | |
+ * |// ---- +-------------+ |923 | 4 | 5 | 6 | 7 | |
+ * // +-----------+ | | | | | | | |
+ * | | 2KB SRAM | +--+ +-------+-------+-------+-------+ |
+ * | | 6116 | +--+ | | | | | |
+ * | +-----------+ |LS| | 0 | 1 | 2 | 3 | |
+ * | ESSELTE +-------+ +---+ +--------+ |138 | | | | | |
+ * | STUDIUM |74LS123| |TRM| |SN74367 | | | +-------+-------+-------+-------+ |
+ * | +-------+ +---+ +--------+ +--+
+ * |__________________________________________________________________________________________|
+ *
+ */
+
+/* Didact modulab driver class */
+class modulab_state : public didact_state
+{
+ public:
+ modulab_state(const machine_config &mconfig, device_type type, const char * tag)
+ : didact_state(mconfig, type, tag)
+ , m_maincpu(*this, "maincpu")
+ , m_7segs(*this, "digit%u", 0U)
+ , m_pia1(*this, PIA1_TAG)
+ , m_kb(*this, MM74C923_TAG)
+ , m_da(0)
+ { }
+
+ required_device<m6802_cpu_device> m_maincpu;
+
+ output_finder<6> m_7segs;
+
+ virtual void machine_reset() override;
+ virtual void machine_start() override;
+ void modulab(machine_config &config);
+protected:
+ DECLARE_READ8_MEMBER( io_r );
+ DECLARE_WRITE8_MEMBER( io_w );
+ DECLARE_WRITE_LINE_MEMBER( da_w );
+private:
+ void modulab_map(address_map &map);
+ // Offsets for display and keyboard i/o
+ enum
+ {
+ DISPLAY = 0,
+ KEY_DATA = 2,
+ KEY_STROBE = 3
+ };
+
+ // Simple emulation of 6 cascaded 74164 that drives the AAAADD BCD display elements, right to left
+ class shift8
+ {
+ public:
+ shift8(){ byte = 0; }
+ void shiftIn(uint8_t in){ byte = ((byte << 1) & 0xfe) | (in & 1 ? 1 : 0); }
+ uint8_t byte;
+ };
+ shift8 m_74164[6];
+
+ required_device<ins8154_device> m_pia1;
+ required_device<mm74c922_device> m_kb;
+ uint8_t m_da;
+};
+
+WRITE_LINE_MEMBER( modulab_state::da_w )
+{
+ LOG("--->%s()\n", FUNCNAME);
+ m_da = state == CLEAR_LINE ? 0 : 1; // Capture data available signal
+}
+
+READ8_MEMBER(modulab_state::io_r)
+{
+ switch (offset)
+ {
+ case 3: // Poll Data available signal
+ return m_da & 0x01; // Data Available signal gated by an 8097 hexbuffer to DB0
+ break;
+ case 2:
+ LOG("--->%s Read Keyboard @ %04x\n", FUNCNAME, offset);
+ return m_kb->read();
+ break;
+ default:
+ LOG("--->%s BAD access @ %04x\n", FUNCNAME, offset);
+ break;
+ }
+ return 0;
+}
+
+WRITE8_MEMBER(modulab_state::io_w)
+{
+ LOG("--->%s()\n", FUNCNAME);
+ uint8_t b = data & 1;
+ switch (offset)
+ {
+ case DISPLAY:
+ // Update the BCD elements with a data bit b shifted in right to left, CS is used as clock for all 164's
+ for (int i = 0; i < 6; i++)
+ {
+ uint8_t c = (m_74164[i].byte & 0x80) ? 1 : 0; // Bit 7 is connected to the next BCD right to left
+ m_74164[i].shiftIn(b);
+ m_7segs[i] = ~m_74164[i].byte & 0x7f; // Bit 0 to 6 drives the 7 seg display
+ b = c; // bit 7 prior shift will be shifted in next (simultaneous in real life)
+ }
+ LOGDISPLAY("Shifted: %02x %02x %02x %02x %02x %02x\n",
+ ~m_74164[0].byte & 0x7f, ~m_74164[1].byte & 0x7f, ~m_74164[2].byte & 0x7f,
+ ~m_74164[3].byte & 0x7f, ~m_74164[4].byte & 0x7f, ~m_74164[5].byte & 0x7f);
+ break;
+ default:
+ break;
+ };
+}
+
+void modulab_state::machine_reset()
+{
+ LOG("--->%s()\n", FUNCNAME);
+
+ m_maincpu->reset();
+}
+
+void modulab_state::machine_start()
+{
+ LOG("--->%s()\n", FUNCNAME);
+
+ didact_state::machine_start();
+ m_7segs.resolve();
+
+ /* register for state saving */
+ save_item(NAME(m_shift));
+ save_item(NAME(m_reset));
+}
+
+// This address map is traced from pcb
+void modulab_state::modulab_map(address_map &map)
+{
+ //map(0x0000, 0x007f).ram() // Schematics holds RAM enable low so that the M6802 internal RAM is disabled.
+ map(0x0000, 0x03ff).ram().mirror(0xe000); // RAM0 always present 2114
+ map(0x0400, 0x07ff).ram().mirror(0xe000); // RAM1 optional 2114
+ // map(0x0800, 0x13ff).ram().mirror(0xe000); // expansion port area consisting of 3 chip selects each selecting 0x3ff byte addresses
+ map(0x1400, 0x17ff).rom().mirror(0xe000).region("maincpu", 0x0000);
+ map(0x1800, 0x187f).rw(FUNC(modulab_state::io_r), FUNC(modulab_state::io_w)).mirror(0xe200);
+ map(0x1900, 0x197f).rw(m_pia1, FUNC(ins8154_device::read_io), FUNC(ins8154_device::write_io)).mirror(0xe200);
+ map(0x1980, 0x19ff).rw(m_pia1, FUNC(ins8154_device::read_ram), FUNC(ins8154_device::write_ram)).mirror(0xe200);
+ map(0x1c00, 0x1fff).rom().mirror(0xe000).region("maincpu", 0x0400);
+}
+
+//===================
+
+static INPUT_PORTS_START( modulab )
+ PORT_START("LINE0") // X1
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_0) PORT_CHAR('0')
+ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_4) PORT_CHAR('4')
+ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_8) PORT_CHAR('8')
+ PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_C) PORT_CHAR('C')
+ PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("RUN") PORT_CODE(KEYCODE_R) PORT_CHAR('R')
+
+ PORT_START("LINE1") // X2
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_1) PORT_CHAR('1')
+ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_5) PORT_CHAR('5')
+ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_9) PORT_CHAR('9')
+ PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_D) PORT_CHAR('D')
+ PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("ADS") PORT_CODE(KEYCODE_Z) PORT_CHAR('Z')
+
+ PORT_START("LINE2") // X3
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_2) PORT_CHAR('2')
+ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_6) PORT_CHAR('6')
+ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_A) PORT_CHAR('A')
+ PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_E) PORT_CHAR('E')
+ PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("FWD") PORT_CODE(KEYCODE_W) PORT_CHAR('W')
+
+ PORT_START("LINE3") // X4
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_3) PORT_CHAR('3')
+ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_7) PORT_CHAR('7')
+ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_B) PORT_CHAR('B')
+ PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F) PORT_CHAR('F')
+ PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("C/B") PORT_CODE(KEYCODE_X) PORT_CHAR('X')
+
+ PORT_START("LINE4") /* Special KEY ROW for reset key */
+ PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Reset") PORT_CODE(KEYCODE_F12) PORT_CHANGED_MEMBER(DEVICE_SELF, modulab_state, trigger_reset, nullptr)
+ PORT_BIT(0xfb, 0x00, IPT_UNUSED )
+INPUT_PORTS_END
+
static INPUT_PORTS_START( md6802 )
PORT_START("LINE0") /* KEY ROW 0 */
PORT_BIT(0x01, 0x01, IPT_KEYBOARD) PORT_NAME("0") PORT_CODE(KEYCODE_0) PORT_CHAR('0')
@@ -508,8 +720,8 @@ static INPUT_PORTS_START( md6802 )
PORT_BIT(0xf0, 0x00, IPT_UNUSED )
PORT_START("LINE4") /* Special KEY ROW for reset and Shift/'*' keys */
- PORT_BIT(0x08, 0x00, IPT_KEYBOARD) PORT_NAME("*") PORT_CODE(KEYCODE_LSHIFT) PORT_CODE(KEYCODE_RSHIFT) PORT_CHAR('*')
- PORT_BIT(0x04, 0x00, IPT_KEYBOARD) PORT_NAME("Reset") PORT_CODE(KEYCODE_F12)
+ PORT_BIT(0x08, 0x00, IPT_KEYBOARD) PORT_NAME("*") PORT_CODE(KEYCODE_LSHIFT) PORT_CODE(KEYCODE_RSHIFT) PORT_CHAR('*') PORT_CHANGED_MEMBER(DEVICE_SELF, md6802_state, trigger_shift, nullptr)
+ PORT_BIT(0x04, 0x00, IPT_KEYBOARD) PORT_NAME("Reset") PORT_CODE(KEYCODE_F12) PORT_CHANGED_MEMBER(DEVICE_SELF, md6802_state, trigger_reset, nullptr)
PORT_BIT(0xf3, 0x00, IPT_UNUSED )
INPUT_PORTS_END
@@ -542,48 +754,53 @@ static INPUT_PORTS_START( mp68a )
PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("3") PORT_CODE(KEYCODE_3) PORT_CHAR('3')
PORT_BIT(0xf0, IP_ACTIVE_HIGH, IPT_UNUSED )
- PORT_START("LINE4") /* Special KEY ROW for reset and Shift/'*' keys */
- PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("*") PORT_CODE(KEYCODE_LSHIFT) PORT_CODE(KEYCODE_RSHIFT) PORT_CHAR('*')
- PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Reset") PORT_CODE(KEYCODE_F12)
+ PORT_START("LINE4") /* Special KEY ROW for reset and Shift/'*' keys, they are hard wired */
+ PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("*") PORT_CODE(KEYCODE_LSHIFT) PORT_CODE(KEYCODE_RSHIFT) PORT_CHAR('*') PORT_CHANGED_MEMBER(DEVICE_SELF, mp68a_state, trigger_shift, nullptr)
+ //PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Reset") PORT_CODE(KEYCODE_F12)
+ PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Reset") PORT_CODE(KEYCODE_F12) PORT_CHANGED_MEMBER(DEVICE_SELF, mp68a_state, trigger_reset, nullptr)
PORT_BIT(0xf3, IP_ACTIVE_HIGH, IPT_UNUSED )
INPUT_PORTS_END
-// TODO: Fix shift led for mp68a correctly, workaround doesn't work anymore! Shift works though...
-TIMER_DEVICE_CALLBACK_MEMBER(didact_state::scan_artwork)
+INPUT_CHANGED_MEMBER(didact_state::trigger_reset)
{
- // LOG("--->%s()\n", FUNCNAME);
-
- // Poll the artwork Reset key
- if (m_io_lines[4]->read() & 0x04)
+ if (newval == CLEAR_LINE)
{
- LOG("RESET is pressed, resetting the CPU\n");
+ LOGKBD("RESET is released, resetting the CPU\n");
+ machine_reset();
m_shift = 0;
- m_leds[m_led] = m_shift ? 1 : 0; // For mp68a only
- if (m_reset == 0)
- {
- machine_reset();
- }
- m_reset = 1; // Inhibit multiple resets
- }
- else if (m_io_lines[4]->read() & 0x08)
- {
- // Poll the artwork SHIFT/* key
- LOG("%s", !m_shift ? "SHIFT is set\n" : "");
- m_shift = 1;
- m_leds[m_led] = m_shift ? 1 : 0; // For mp68a only
- }
- else
- {
- if (m_reset == 1)
- {
- m_reset = 0; // Enable reset again
- }
+ m_led = 0;
}
}
-MACHINE_CONFIG_START(md6802_state::md6802)
- MCFG_DEVICE_ADD("maincpu", M6802, XTAL(4'000'000))
- MCFG_DEVICE_PROGRAM_MAP(md6802_map)
+
+void modulab_state::modulab(machine_config &config)
+{
+ M6802(config, m_maincpu, XTAL(4'000'000));
+ m_maincpu->set_addrmap(AS_PROGRAM, &modulab_state::modulab_map);
+ config.set_default_layout(layout_modulab);
+
+ /* Devices */
+ MM74C923(config, m_kb, 0);
+ m_kb->set_cap_osc(CAP_U(0.10));
+ m_kb->set_cap_debounce(CAP_U(1));
+ m_kb->da_wr_callback().set(FUNC(modulab_state::da_w));
+ m_kb->x1_rd_callback().set_ioport("LINE0");
+ m_kb->x2_rd_callback().set_ioport("LINE1");
+ m_kb->x3_rd_callback().set_ioport("LINE2");
+ m_kb->x4_rd_callback().set_ioport("LINE3");
+
+ /* PIA #1 0x????-0x??? - */
+ INS8154(config, m_pia1);
+ //m_ins8154->in_a().set(FUNC(modulab_state::ins8154_pa_r));
+ //m_ins8154->out_a().set(FUNC(modulab_state::ins8154_pa_w));
+
+ //RS232_PORT(config, m_rs232, default_rs232_devices, nullptr);
+}
+
+void md6802_state::md6802(machine_config &config)
+{
+ M6802(config, m_maincpu, XTAL(4'000'000));
+ m_maincpu->set_addrmap(AS_PROGRAM, &md6802_state::md6802_map);
config.set_default_layout(layout_md6802);
/* Devices */
@@ -610,16 +827,15 @@ MACHINE_CONFIG_START(md6802_state::md6802)
m_pia2->readpb_handler().set(FUNC(md6802_state::pia2_kbB_r));
m_pia2->ca2_handler().set(FUNC(md6802_state::pia2_ca2_w));
- MCFG_TIMER_DRIVER_ADD_PERIODIC("artwork_timer", md6802_state, scan_artwork, attotime::from_hz(10))
-
RS232_PORT(config, m_rs232, default_rs232_devices, nullptr);
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(mp68a_state::mp68a)
+void mp68a_state::mp68a(machine_config &config)
+{
// Clock source is based on a N9602N Dual Retriggerable Resettable Monostable Multivibrator oscillator at aprox 505KHz.
// Trimpot seems broken/stuck at 5K Ohm thu. ROM code 1Ms delay loops suggest 1MHz+
- MCFG_DEVICE_ADD("maincpu", M6800, 505000)
- MCFG_DEVICE_PROGRAM_MAP(mp68a_map)
+ M6800(config, m_maincpu, 505000);
+ m_maincpu->set_addrmap(AS_PROGRAM, &mp68a_state::mp68a_map);
config.set_default_layout(layout_mp68a);
/* Devices */
@@ -660,21 +876,27 @@ MACHINE_CONFIG_START(mp68a_state::mp68a)
/* 0x086B 0x600 (Port A) = 0x70 */
/* 0x086B 0x600 (Port A) = 0x50 */
/* 0x086B 0x600 (Port A) = 0x70 */
- MCFG_DEVICE_ADD("digit0", DM9368, 0)
- MCFG_DM9368_UPDATE_CALLBACK(WRITE8(*this, mp68a_state, digit_w<0>))
- MCFG_DEVICE_ADD("digit1", DM9368, 0)
- MCFG_DM9368_UPDATE_CALLBACK(WRITE8(*this, mp68a_state, digit_w<1>))
- MCFG_DEVICE_ADD("digit2", DM9368, 0)
- MCFG_DM9368_UPDATE_CALLBACK(WRITE8(*this, mp68a_state, digit_w<2>))
- MCFG_DEVICE_ADD("digit3", DM9368, 0)
- MCFG_DM9368_UPDATE_CALLBACK(WRITE8(*this, mp68a_state, digit_w<3>))
- MCFG_DEVICE_ADD("digit4", DM9368, 0)
- MCFG_DM9368_UPDATE_CALLBACK(WRITE8(*this, mp68a_state, digit_w<4>))
- MCFG_DEVICE_ADD("digit5", DM9368, 0)
- MCFG_DM9368_UPDATE_CALLBACK(WRITE8(*this, mp68a_state, digit_w<5>))
-
- MCFG_TIMER_DRIVER_ADD_PERIODIC("artwork_timer", mp68a_state, scan_artwork, attotime::from_hz(10))
-MACHINE_CONFIG_END
+ DM9368(config, m_digits[0], 0).update_cb().set(FUNC(mp68a_state::digit_w<0>));
+ DM9368(config, m_digits[1], 0).update_cb().set(FUNC(mp68a_state::digit_w<1>));
+ DM9368(config, m_digits[2], 0).update_cb().set(FUNC(mp68a_state::digit_w<2>));
+ DM9368(config, m_digits[3], 0).update_cb().set(FUNC(mp68a_state::digit_w<3>));
+ DM9368(config, m_digits[4], 0).update_cb().set(FUNC(mp68a_state::digit_w<4>));
+ DM9368(config, m_digits[5], 0).update_cb().set(FUNC(mp68a_state::digit_w<5>));
+}
+
+ROM_START( modulab )
+ ROM_REGION(0x10000, "maincpu", 0)
+ ROM_DEFAULT_BIOS("modulabvl")
+
+ ROM_SYSTEM_BIOS(0, "modulabv1", "Modulab Version 1")
+ ROMX_LOAD( "mlab1_00.bin", 0x0000, 0x0800, NO_DUMP, ROM_BIOS(0) )
+
+ ROM_SYSTEM_BIOS(1, "modulabv2", "Modulab Version 2")
+ ROMX_LOAD( "mlab2_00.bin", 0x0000, 0x0800, NO_DUMP, ROM_BIOS(1) )
+
+ ROM_SYSTEM_BIOS(2, "modulabvl", "Modulab Prototype")
+ ROMX_LOAD( "modulab_levererad.bin", 0x0000, 0x0800, CRC(40774ef4) SHA1(9cf188342993fbcff13dbbecc62d1ee49010d6f4), ROM_BIOS(2) )
+ROM_END
// TODO split ROM image into proper ROM set
ROM_START( md6802 ) // ROM image from http://elektronikforumet.com/forum/viewtopic.php?f=2&t=79576&start=135#p1203640
@@ -688,6 +910,7 @@ ROM_START( mp68a ) // ROM image from http://elektronikforumet.com/forum/viewtopi
ROM_LOAD( "didactb.bin", 0x0a00, 0x0200, CRC(592898dc) SHA1(2962f4817712cae97f3ab37b088fc73e66535ff8) )
ROM_END
-// YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS
-COMP( 1979, mp68a, 0, 0, mp68a, mp68a, mp68a_state, empty_init, "Didact AB", "mp68a", MACHINE_NO_SOUND_HW )
-COMP( 1983, md6802, 0, 0, md6802, md6802, md6802_state, empty_init, "Didact AB", "Mikrodator 6802", MACHINE_NO_SOUND_HW )
+// YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS
+COMP( 1979, mp68a, 0, 0, mp68a, mp68a, mp68a_state, empty_init, "Didact AB", "mp68a", MACHINE_NO_SOUND_HW )
+COMP( 1983, md6802, 0, 0, md6802, md6802, md6802_state, empty_init, "Didact AB", "Mikrodator 6802", MACHINE_NO_SOUND_HW )
+COMP( 1984, modulab, 0, 0, modulab, modulab, modulab_state, empty_init, "Esselte Studium AB", "Modulab", MACHINE_NO_SOUND_HW )
diff --git a/src/mame/drivers/dietgo.cpp b/src/mame/drivers/dietgo.cpp
index 12c462f31dc..12cfb54fb7a 100644
--- a/src/mame/drivers/dietgo.cpp
+++ b/src/mame/drivers/dietgo.cpp
@@ -205,30 +205,30 @@ DECO16IC_BANK_CB_MEMBER(dietgo_state::bank_callback)
return (bank & 0x70) << 8;
}
-MACHINE_CONFIG_START(dietgo_state::dietgo)
-
+void dietgo_state::dietgo(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M68000, XTAL(28'000'000)/2) /* DE102 (verified on pcb) */
- MCFG_DEVICE_PROGRAM_MAP(dietgo_map)
- MCFG_DEVICE_OPCODES_MAP(decrypted_opcodes_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", dietgo_state, irq6_line_hold)
+ M68000(config, m_maincpu, XTAL(28'000'000)/2); /* DE102 (verified on pcb) */
+ m_maincpu->set_addrmap(AS_PROGRAM, &dietgo_state::dietgo_map);
+ m_maincpu->set_addrmap(AS_OPCODES, &dietgo_state::decrypted_opcodes_map);
+ m_maincpu->set_vblank_int("screen", FUNC(dietgo_state::irq6_line_hold));
H6280(config, m_audiocpu, XTAL(32'220'000)/4/3); /* Custom chip 45; XIN is 32.220MHZ/4, verified on pcb */
m_audiocpu->set_addrmap(AS_PROGRAM, &dietgo_state::sound_map);
m_audiocpu->add_route(ALL_OUTPUTS, "mono", 0); // internal sound unused
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(58)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */)
- MCFG_SCREEN_SIZE(40*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 40*8-1, 1*8, 31*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(dietgo_state, screen_update)
- MCFG_SCREEN_PALETTE("palette")
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(58);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500) /* not accurate */);
+ screen.set_size(40*8, 32*8);
+ screen.set_visarea(0*8, 40*8-1, 1*8, 31*8-1);
+ screen.set_screen_update(FUNC(dietgo_state::screen_update));
+ screen.set_palette("palette");
PALETTE(config, "palette").set_format(palette_device::xBGR_888, 1024);
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_dietgo)
+ GFXDECODE(config, "gfxdecode", "palette", gfx_dietgo);
DECO16IC(config, m_deco_tilegen, 0);
m_deco_tilegen->set_split(0);
@@ -265,9 +265,8 @@ MACHINE_CONFIG_START(dietgo_state::dietgo)
ymsnd.irq_handler().set_inputline(m_audiocpu, 1); /* IRQ2 */
ymsnd.add_route(ALL_OUTPUTS, "mono", 0.45);
- MCFG_DEVICE_ADD("oki", OKIM6295, XTAL(32'220'000)/32, okim6295_device::PIN7_HIGH) /* verified on pcb */
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.60)
-MACHINE_CONFIG_END
+ OKIM6295(config, "oki", XTAL(32'220'000)/32, okim6295_device::PIN7_HIGH).add_route(ALL_OUTPUTS, "mono", 0.60); /* verified on pcb */
+}
/* Diet Go Go */
diff --git a/src/mame/drivers/digel804.cpp b/src/mame/drivers/digel804.cpp
index c9ea5eff85c..254f36741dc 100644
--- a/src/mame/drivers/digel804.cpp
+++ b/src/mame/drivers/digel804.cpp
@@ -424,44 +424,44 @@ INPUT_CHANGED_MEMBER( digel804_state::mode_change )
/* ACIA Trampolines */
READ8_MEMBER( digel804_state::acia_rxd_r )
{
- return m_acia->read(space, 0);
+ return m_acia->read(0);
}
WRITE8_MEMBER( digel804_state::acia_txd_w )
{
- m_acia->write(space, 0, data);
+ m_acia->write(0, data);
}
READ8_MEMBER( digel804_state::acia_status_r )
{
- return m_acia->read(space, 1);
+ return m_acia->read(1);
}
WRITE8_MEMBER( digel804_state::acia_reset_w )
{
- m_acia->write(space, 1, data);
+ m_acia->write(1, data);
}
READ8_MEMBER( digel804_state::acia_command_r )
{
- return m_acia->read(space, 2);
+ return m_acia->read(2);
}
WRITE8_MEMBER( digel804_state::acia_command_w )
{
data |= 0x08; // HACK for ep804 remote mode
- m_acia->write(space, 2, data);
+ m_acia->write(2, data);
}
READ8_MEMBER( digel804_state::acia_control_r )
{
- return m_acia->read(space, 3);
+ return m_acia->read(3);
}
WRITE8_MEMBER( digel804_state::acia_control_w )
{
- m_acia->write(space, 3, data);
+ m_acia->write(3, data);
}
@@ -631,24 +631,25 @@ WRITE_LINE_MEMBER( ep804_state::ep804_acia_irq_w )
{
}
-MACHINE_CONFIG_START(digel804_state::digel804)
+void digel804_state::digel804(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD(m_maincpu, Z80, 3.6864_MHz_XTAL/2) /* Z80A, X1(aka E0 on schematics): 3.6864Mhz */
- MCFG_DEVICE_PROGRAM_MAP(z80_mem_804_1_4)
- MCFG_DEVICE_IO_MAP(z80_io_1_4)
- MCFG_QUANTUM_TIME(attotime::from_hz(60))
+ Z80(config, m_maincpu, 3.6864_MHz_XTAL/2); /* Z80A, X1(aka E0 on schematics): 3.6864Mhz */
+ m_maincpu->set_addrmap(AS_PROGRAM, &digel804_state::z80_mem_804_1_4);
+ m_maincpu->set_addrmap(AS_IO, &digel804_state::z80_io_1_4);
+ config.m_minimum_quantum = attotime::from_hz(60);
ROC10937(config, m_vfd); // RIGHT_TO_LEFT
/* video hardware */
config.set_default_layout(layout_digel804);
- MCFG_DEVICE_ADD("74c923", MM74C923, 0)
- MCFG_MM74C922_DA_CALLBACK(WRITELINE(*this, digel804_state, da_w))
- MCFG_MM74C922_X1_CALLBACK(IOPORT("LINE0"))
- MCFG_MM74C922_X2_CALLBACK(IOPORT("LINE1"))
- MCFG_MM74C922_X3_CALLBACK(IOPORT("LINE2"))
- MCFG_MM74C922_X4_CALLBACK(IOPORT("LINE3"))
+ MM74C923(config, m_kb, 0);
+ m_kb->da_wr_callback().set(FUNC(digel804_state::da_w));
+ m_kb->x1_rd_callback().set_ioport("LINE0");
+ m_kb->x2_rd_callback().set_ioport("LINE1");
+ m_kb->x3_rd_callback().set_ioport("LINE2");
+ m_kb->x4_rd_callback().set_ioport("LINE3");
/* acia */
MOS6551(config, m_acia, 0);
@@ -669,9 +670,8 @@ MACHINE_CONFIG_START(digel804_state::digel804)
/* sound hardware */
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("speaker", SPEAKER_SOUND)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25)
-MACHINE_CONFIG_END
+ SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25);
+}
void ep804_state::ep804(machine_config &config)
{
diff --git a/src/mame/drivers/digijet.cpp b/src/mame/drivers/digijet.cpp
index 21da2bc0113..f7644ae3353 100644
--- a/src/mame/drivers/digijet.cpp
+++ b/src/mame/drivers/digijet.cpp
@@ -50,11 +50,12 @@ void digijet_state::io_map(address_map &map)
static INPUT_PORTS_START( digijet )
INPUT_PORTS_END
-MACHINE_CONFIG_START(digijet_state::digijet)
+void digijet_state::digijet(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD(I8049_TAG, I8049, XTAL(11'000'000))
- MCFG_DEVICE_IO_MAP(io_map)
-MACHINE_CONFIG_END
+ I8049(config, m_maincpu, XTAL(11'000'000));
+ m_maincpu->set_addrmap(AS_IO, &digijet_state::io_map);
+}
ROM_START( digijet )
ROM_REGION( 0x800, I8049_TAG, 0 )
diff --git a/src/mame/drivers/dim68k.cpp b/src/mame/drivers/dim68k.cpp
index 52476842985..ab51d8c4d88 100644
--- a/src/mame/drivers/dim68k.cpp
+++ b/src/mame/drivers/dim68k.cpp
@@ -311,30 +311,30 @@ void dim68k_state::kbd_put(u8 data)
m_term_data = data;
}
-MACHINE_CONFIG_START(dim68k_state::dim68k)
+void dim68k_state::dim68k(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M68000, XTAL(10'000'000))
- MCFG_DEVICE_PROGRAM_MAP(dim68k_mem)
+ M68000(config, m_maincpu, XTAL(10'000'000));
+ m_maincpu->set_addrmap(AS_PROGRAM, &dim68k_state::dim68k_mem);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(50)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */
- MCFG_SCREEN_UPDATE_DEVICE("crtc", mc6845_device, screen_update)
- MCFG_SCREEN_SIZE(640, 480)
- MCFG_SCREEN_VISIBLE_AREA(0, 640-1, 0, 250-1)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(50);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */
+ screen.set_screen_update("crtc", FUNC(mc6845_device::screen_update));
+ screen.set_size(640, 480);
+ screen.set_visarea(0, 640-1, 0, 250-1);
PALETTE(config, m_palette, palette_device::MONOCHROME);
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_dim68k)
+ GFXDECODE(config, "gfxdecode", m_palette, gfx_dim68k);
/* sound hardware */
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("speaker", SPEAKER_SOUND)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.50)
+ SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.50);
/* Devices */
UPD765A(config, "fdc", 8'000'000, true, true); // these options unknown
- MCFG_FLOPPY_DRIVE_ADD("fdc:0", dim68k_floppies, "525hd", floppy_image_device::default_floppy_formats)
- MCFG_FLOPPY_DRIVE_ADD("fdc:1", dim68k_floppies, "525hd", floppy_image_device::default_floppy_formats)
+ FLOPPY_CONNECTOR(config, "fdc:0", dim68k_floppies, "525hd", floppy_image_device::default_floppy_formats);
+ FLOPPY_CONNECTOR(config, "fdc:1", dim68k_floppies, "525hd", floppy_image_device::default_floppy_formats);
MC6845(config, m_crtc, 1790000);
m_crtc->set_screen("screen");
@@ -346,8 +346,8 @@ MACHINE_CONFIG_START(dim68k_state::dim68k)
keyboard.set_keyboard_callback(FUNC(dim68k_state::kbd_put));
// software lists
- MCFG_SOFTWARE_LIST_ADD("flop_list", "dim68k")
-MACHINE_CONFIG_END
+ SOFTWARE_LIST(config, "flop_list").set_original("dim68k");
+}
/*
68000
diff --git a/src/mame/drivers/discoboy.cpp b/src/mame/drivers/discoboy.cpp
index de5bc4d40f9..c351b4cc56c 100644
--- a/src/mame/drivers/discoboy.cpp
+++ b/src/mame/drivers/discoboy.cpp
@@ -456,31 +456,30 @@ WRITE_LINE_MEMBER(discoboy_state::yunsung8_adpcm_int)
m_audiocpu->set_input_line(INPUT_LINE_NMI, m_toggle);
}
-MACHINE_CONFIG_START(discoboy_state::discoboy)
-
+void discoboy_state::discoboy(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, XTAL(12'000'000)/2) /* 6 MHz? */
- MCFG_DEVICE_PROGRAM_MAP(discoboy_map)
- MCFG_DEVICE_IO_MAP(io_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", discoboy_state, irq0_line_hold)
+ Z80(config, m_maincpu, XTAL(12'000'000)/2); /* 6 MHz? */
+ m_maincpu->set_addrmap(AS_PROGRAM, &discoboy_state::discoboy_map);
+ m_maincpu->set_addrmap(AS_IO, &discoboy_state::io_map);
+ m_maincpu->set_vblank_int("screen", FUNC(discoboy_state::irq0_line_hold));
- MCFG_DEVICE_ADD("audiocpu", Z80, XTAL(10'000'000)/2) /* 5 MHz? */
- MCFG_DEVICE_PROGRAM_MAP(sound_map)
+ Z80(config, m_audiocpu, XTAL(10'000'000)/2); /* 5 MHz? */
+ m_audiocpu->set_addrmap(AS_PROGRAM, &discoboy_state::sound_map);
ADDRESS_MAP_BANK(config, "rambank1").set_map(&discoboy_state::rambank1_map).set_options(ENDIANNESS_BIG, 8, 13, 0x800);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(512, 256)
- MCFG_SCREEN_VISIBLE_AREA(8*8, 512-1-8*8, 0+8, 256-1-8)
- MCFG_SCREEN_UPDATE_DRIVER(discoboy_state, screen_update)
- MCFG_SCREEN_PALETTE("palette")
-
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_discoboy)
- MCFG_PALETTE_ADD("palette", 0x1000)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(512, 256);
+ screen.set_visarea(8*8, 512-1-8*8, 0+8, 256-1-8);
+ screen.set_screen_update(FUNC(discoboy_state::screen_update));
+ screen.set_palette(m_palette);
+ GFXDECODE(config, m_gfxdecode, m_palette, gfx_discoboy);
+ PALETTE(config, m_palette).set_entries(0x1000);
/* sound hardware */
SPEAKER(config, "lspeaker").front_left();
@@ -489,19 +488,19 @@ MACHINE_CONFIG_START(discoboy_state::discoboy)
GENERIC_LATCH_8(config, m_soundlatch);
m_soundlatch->data_pending_callback().set_inputline(m_audiocpu, 0);
- MCFG_DEVICE_ADD("ymsnd", YM3812, XTAL(10'000'000)/4) /* 2.5 MHz? */
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 0.6)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 0.6)
+ ym3812_device &ymsnd(YM3812(config, "ymsnd", XTAL(10'000'000)/4)); /* 2.5 MHz? */
+ ymsnd.add_route(ALL_OUTPUTS, "lspeaker", 0.6);
+ ymsnd.add_route(ALL_OUTPUTS, "rspeaker", 0.6);
LS157(config, m_adpcm_select, 0);
m_adpcm_select->out_callback().set("msm", FUNC(msm5205_device::data_w));
- MCFG_DEVICE_ADD("msm", MSM5205, XTAL(400'000))
- MCFG_MSM5205_VCLK_CB(WRITELINE(*this, discoboy_state, yunsung8_adpcm_int)) /* interrupt function */
- MCFG_MSM5205_PRESCALER_SELECTOR(S96_4B) /* 4KHz, 4 Bits */
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 0.80)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 0.80)
-MACHINE_CONFIG_END
+ MSM5205(config, m_msm, XTAL(400'000));
+ m_msm->vck_legacy_callback().set(FUNC(discoboy_state::yunsung8_adpcm_int)); /* interrupt function */
+ m_msm->set_prescaler_selector(msm5205_device::S96_4B); /* 4KHz, 4 Bits */
+ m_msm->add_route(ALL_OUTPUTS, "lspeaker", 0.80);
+ m_msm->add_route(ALL_OUTPUTS, "rspeaker", 0.80);
+}
ROM_START( discoboy )
diff --git a/src/mame/drivers/divebomb.cpp b/src/mame/drivers/divebomb.cpp
index 842a7cb903a..c33052b34a1 100644
--- a/src/mame/drivers/divebomb.cpp
+++ b/src/mame/drivers/divebomb.cpp
@@ -114,12 +114,12 @@ void divebomb_state::divebomb_fgcpu_map(address_map &map)
void divebomb_state::divebomb_fgcpu_iomap(address_map &map)
{
map.global_mask(0xff);
- map(0x00, 0x00).w("sn0", FUNC(sn76489_device::command_w));
- map(0x01, 0x01).w("sn1", FUNC(sn76489_device::command_w));
- map(0x02, 0x02).w("sn2", FUNC(sn76489_device::command_w));
- map(0x03, 0x03).w("sn3", FUNC(sn76489_device::command_w));
- map(0x04, 0x04).w("sn4", FUNC(sn76489_device::command_w));
- map(0x05, 0x05).w("sn5", FUNC(sn76489_device::command_w));
+ map(0x00, 0x00).w("sn0", FUNC(sn76489_device::write));
+ map(0x01, 0x01).w("sn1", FUNC(sn76489_device::write));
+ map(0x02, 0x02).w("sn2", FUNC(sn76489_device::write));
+ map(0x03, 0x03).w("sn3", FUNC(sn76489_device::write));
+ map(0x04, 0x04).w("sn4", FUNC(sn76489_device::write));
+ map(0x05, 0x05).w("sn5", FUNC(sn76489_device::write));
map(0x10, 0x10).r(m_roz2fg_latch, FUNC(generic_latch_8_device::read)).w("fg2roz", FUNC(generic_latch_8_device::write));
map(0x20, 0x20).r(m_spr2fg_latch, FUNC(generic_latch_8_device::read)).w("fg2spr", FUNC(generic_latch_8_device::write));
map(0x30, 0x30).portr("IN0");
@@ -386,24 +386,23 @@ GFXDECODE_END
*
*************************************/
-MACHINE_CONFIG_START(divebomb_state::divebomb)
-
- MCFG_DEVICE_ADD("fgcpu", Z80,XTAL1/4) // ?
- MCFG_DEVICE_PROGRAM_MAP(divebomb_fgcpu_map)
- MCFG_DEVICE_IO_MAP(divebomb_fgcpu_iomap)
+void divebomb_state::divebomb(machine_config &config)
+{
+ Z80(config, m_fgcpu, XTAL1/4); // ?
+ m_fgcpu->set_addrmap(AS_PROGRAM, &divebomb_state::divebomb_fgcpu_map);
+ m_fgcpu->set_addrmap(AS_IO, &divebomb_state::divebomb_fgcpu_iomap);
- MCFG_DEVICE_ADD("spritecpu", Z80,XTAL1/4) // ?
- MCFG_DEVICE_PROGRAM_MAP(divebomb_spritecpu_map)
- MCFG_DEVICE_IO_MAP(divebomb_spritecpu_iomap)
+ Z80(config, m_spritecpu, XTAL1/4); // ?
+ m_spritecpu->set_addrmap(AS_PROGRAM, &divebomb_state::divebomb_spritecpu_map);
+ m_spritecpu->set_addrmap(AS_IO, &divebomb_state::divebomb_spritecpu_iomap);
- MCFG_DEVICE_ADD("rozcpu", Z80,XTAL1/4) // ?
- MCFG_DEVICE_PROGRAM_MAP(divebomb_rozcpu_map)
- MCFG_DEVICE_IO_MAP(divebomb_rozcpu_iomap)
+ Z80(config, m_rozcpu, XTAL1/4); // ?
+ m_rozcpu->set_addrmap(AS_PROGRAM, &divebomb_state::divebomb_rozcpu_map);
+ m_rozcpu->set_addrmap(AS_IO, &divebomb_state::divebomb_rozcpu_iomap);
- MCFG_QUANTUM_PERFECT_CPU("fgcpu")
+ config.m_perfect_cpu_quantum = subtag("fgcpu");
- MCFG_INPUT_MERGER_ANY_HIGH("fgcpu_irq")
- MCFG_INPUT_MERGER_OUTPUT_HANDLER(INPUTLINE("fgcpu", INPUT_LINE_IRQ0))
+ INPUT_MERGER_ANY_HIGH(config, m_fgcpu_irq).output_handler().set_inputline(m_fgcpu, INPUT_LINE_IRQ0);
GENERIC_LATCH_8(config, "fg2spr").data_pending_callback().set_inputline(m_spritecpu, INPUT_LINE_IRQ0);
@@ -453,19 +452,13 @@ MACHINE_CONFIG_START(divebomb_state::divebomb)
SPEAKER(config, "mono").front_center();
// All frequencies unverified
- MCFG_DEVICE_ADD("sn0", SN76489, XTAL1/8)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.15)
- MCFG_DEVICE_ADD("sn1", SN76489, XTAL1/8)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.15)
- MCFG_DEVICE_ADD("sn2", SN76489, XTAL1/8)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.15)
- MCFG_DEVICE_ADD("sn3", SN76489, XTAL1/8)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.15)
- MCFG_DEVICE_ADD("sn4", SN76489, XTAL1/8)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.15)
- MCFG_DEVICE_ADD("sn5", SN76489, XTAL1/8)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.15)
-MACHINE_CONFIG_END
+ SN76489(config, "sn0", XTAL1/8).add_route(ALL_OUTPUTS, "mono", 0.15);
+ SN76489(config, "sn1", XTAL1/8).add_route(ALL_OUTPUTS, "mono", 0.15);
+ SN76489(config, "sn2", XTAL1/8).add_route(ALL_OUTPUTS, "mono", 0.15);
+ SN76489(config, "sn3", XTAL1/8).add_route(ALL_OUTPUTS, "mono", 0.15);
+ SN76489(config, "sn4", XTAL1/8).add_route(ALL_OUTPUTS, "mono", 0.15);
+ SN76489(config, "sn5", XTAL1/8).add_route(ALL_OUTPUTS, "mono", 0.15);
+}
diff --git a/src/mame/drivers/diverboy.cpp b/src/mame/drivers/diverboy.cpp
index 4305aaa37e1..63f3eafefec 100644
--- a/src/mame/drivers/diverboy.cpp
+++ b/src/mame/drivers/diverboy.cpp
@@ -274,25 +274,25 @@ void diverboy_state::machine_start()
{
}
-MACHINE_CONFIG_START(diverboy_state::diverboy)
-
- MCFG_DEVICE_ADD("maincpu", M68000, 12000000) /* guess */
- MCFG_DEVICE_PROGRAM_MAP(diverboy_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", diverboy_state, irq6_line_hold)
+void diverboy_state::diverboy(machine_config &config)
+{
+ M68000(config, m_maincpu, 12000000); /* guess */
+ m_maincpu->set_addrmap(AS_PROGRAM, &diverboy_state::diverboy_map);
+ m_maincpu->set_vblank_int("screen", FUNC(diverboy_state::irq6_line_hold));
- MCFG_DEVICE_ADD("audiocpu", Z80, 4000000)
- MCFG_DEVICE_PROGRAM_MAP(snd_map)
+ Z80(config, m_audiocpu, 4000000);
+ m_audiocpu->set_addrmap(AS_PROGRAM, &diverboy_state::snd_map);
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_diverboy)
+ GFXDECODE(config, m_gfxdecode, m_palette, gfx_diverboy);
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(64*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8+4, 40*8+1, 2*8, 32*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(diverboy_state, screen_update_diverboy)
- MCFG_SCREEN_PALETTE(m_palette)
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_refresh_hz(60);
+ m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ m_screen->set_size(64*8, 32*8);
+ m_screen->set_visarea(0*8+4, 40*8+1, 2*8, 32*8-1);
+ m_screen->set_screen_update(FUNC(diverboy_state::screen_update_diverboy));
+ m_screen->set_palette(m_palette);
PALETTE(config, m_palette).set_format(palette_device::xBGR_444, 0x400);
@@ -301,9 +301,8 @@ MACHINE_CONFIG_START(diverboy_state::diverboy)
GENERIC_LATCH_8(config, m_soundlatch);
- MCFG_DEVICE_ADD("oki", OKIM6295, 1320000, okim6295_device::PIN7_HIGH) // clock frequency & pin 7 not verified
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.50)
-MACHINE_CONFIG_END
+ OKIM6295(config, m_oki, 1320000, okim6295_device::PIN7_HIGH).add_route(ALL_OUTPUTS, "mono", 0.50); // clock frequency & pin 7 not verified
+}
/*
diff --git a/src/mame/drivers/djboy.cpp b/src/mame/drivers/djboy.cpp
index 0387de96fe4..23b4ea2caf6 100644
--- a/src/mame/drivers/djboy.cpp
+++ b/src/mame/drivers/djboy.cpp
@@ -478,22 +478,22 @@ void djboy_state::machine_reset()
m_scrolly = 0;
}
-MACHINE_CONFIG_START(djboy_state::djboy)
-
- MCFG_DEVICE_ADD("mastercpu", Z80, 12_MHz_XTAL / 2) // 6.000MHz, verified
- MCFG_DEVICE_PROGRAM_MAP(mastercpu_am)
- MCFG_DEVICE_IO_MAP(mastercpu_port_am)
- MCFG_TIMER_DRIVER_ADD_SCANLINE("scantimer", djboy_state, djboy_scanline, "screen", 0, 1)
+void djboy_state::djboy(machine_config &config)
+{
+ Z80(config, m_mastercpu, 12_MHz_XTAL / 2); // 6.000MHz, verified
+ m_mastercpu->set_addrmap(AS_PROGRAM, &djboy_state::mastercpu_am);
+ m_mastercpu->set_addrmap(AS_IO, &djboy_state::mastercpu_port_am);
+ TIMER(config, "scantimer").configure_scanline(FUNC(djboy_state::djboy_scanline), "screen", 0, 1);
- MCFG_DEVICE_ADD("slavecpu", Z80, 12_MHz_XTAL / 2) // 6.000MHz, verified
- MCFG_DEVICE_PROGRAM_MAP(slavecpu_am)
- MCFG_DEVICE_IO_MAP(slavecpu_port_am)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", djboy_state, irq0_line_hold)
+ Z80(config, m_slavecpu, 12_MHz_XTAL / 2); // 6.000MHz, verified
+ m_slavecpu->set_addrmap(AS_PROGRAM, &djboy_state::slavecpu_am);
+ m_slavecpu->set_addrmap(AS_IO, &djboy_state::slavecpu_port_am);
+ m_slavecpu->set_vblank_int("screen", FUNC(djboy_state::irq0_line_hold));
- MCFG_DEVICE_ADD("soundcpu", Z80, 12_MHz_XTAL / 2) // 6.000MHz, verified
- MCFG_DEVICE_PROGRAM_MAP(soundcpu_am)
- MCFG_DEVICE_IO_MAP(soundcpu_port_am)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", djboy_state, irq0_line_hold)
+ Z80(config, m_soundcpu, 12_MHz_XTAL / 2); // 6.000MHz, verified
+ m_soundcpu->set_addrmap(AS_PROGRAM, &djboy_state::soundcpu_am);
+ m_soundcpu->set_addrmap(AS_IO, &djboy_state::soundcpu_port_am);
+ m_soundcpu->set_vblank_int("screen", FUNC(djboy_state::irq0_line_hold));
I80C51(config, m_beast, 12_MHz_XTAL / 2); // 6.000MHz, verified
m_beast->port_in_cb<0>().set(FUNC(djboy_state::beast_p0_r));
@@ -505,7 +505,7 @@ MACHINE_CONFIG_START(djboy_state::djboy)
m_beast->port_in_cb<3>().set(FUNC(djboy_state::beast_p3_r));
m_beast->port_out_cb<3>().set(FUNC(djboy_state::beast_p3_w));
- MCFG_QUANTUM_TIME(attotime::from_hz(6000))
+ config.m_minimum_quantum = attotime::from_hz(6000);
GENERIC_LATCH_8(config, m_slavelatch);
@@ -513,17 +513,17 @@ MACHINE_CONFIG_START(djboy_state::djboy)
m_beastlatch->data_pending_callback().set_inputline(m_beast, INPUT_LINE_IRQ0);
m_beastlatch->set_separate_acknowledge(true);
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(57.5)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(256, 256)
- MCFG_SCREEN_VISIBLE_AREA(0, 256-1, 16, 256-16-1)
- MCFG_SCREEN_UPDATE_DRIVER(djboy_state, screen_update_djboy)
- MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE(*this, djboy_state, screen_vblank_djboy))
- MCFG_SCREEN_PALETTE("palette")
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(57.5);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(256, 256);
+ screen.set_visarea(0, 256-1, 16, 256-16-1);
+ screen.set_screen_update(FUNC(djboy_state::screen_update_djboy));
+ screen.screen_vblank().set(FUNC(djboy_state::screen_vblank_djboy));
+ screen.set_palette(m_palette);
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_djboy)
- MCFG_PALETTE_ADD("palette", 0x200)
+ GFXDECODE(config, m_gfxdecode, m_palette, gfx_djboy);
+ PALETTE(config, m_palette).set_entries(0x200);
KANEKO_PANDORA(config, m_pandora, 0);
m_pandora->set_gfxdecode_tag(m_gfxdecode);
@@ -534,22 +534,52 @@ MACHINE_CONFIG_START(djboy_state::djboy)
GENERIC_LATCH_8(config, m_soundlatch);
m_soundlatch->data_pending_callback().set_inputline(m_soundcpu, INPUT_LINE_NMI);
- MCFG_DEVICE_ADD("ymsnd", YM2203, 12_MHz_XTAL / 4) // 3.000MHz, verified
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 0.40)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 0.40)
+ ym2203_device &ymsnd(YM2203(config, "ymsnd", 12_MHz_XTAL / 4)); // 3.000MHz, verified
+ ymsnd.add_route(ALL_OUTPUTS, "lspeaker", 0.40);
+ ymsnd.add_route(ALL_OUTPUTS, "rspeaker", 0.40);
- MCFG_DEVICE_ADD("oki_l", OKIM6295, 12_MHz_XTAL / 8, okim6295_device::PIN7_LOW) // 1.500MHz, verified
- MCFG_DEVICE_ROM("oki")
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 0.50)
+ okim6295_device &oki_l(OKIM6295(config, "oki_l", 12_MHz_XTAL / 8, okim6295_device::PIN7_LOW)); // 1.500MHz, verified
+ oki_l.set_device_rom_tag("oki");
+ oki_l.add_route(ALL_OUTPUTS, "lspeaker", 0.50);
- MCFG_DEVICE_ADD("oki_r", OKIM6295, 12_MHz_XTAL / 8, okim6295_device::PIN7_LOW) // 1.500MHz, verified
- MCFG_DEVICE_ROM("oki")
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 0.50)
-MACHINE_CONFIG_END
+ okim6295_device &oki_r(OKIM6295(config, "oki_r", 12_MHz_XTAL / 8, okim6295_device::PIN7_LOW)); // 1.500MHz, verified
+ oki_r.set_device_rom_tag("oki");
+ oki_r.add_route(ALL_OUTPUTS, "rspeaker", 0.50);
+}
ROM_START( djboy )
ROM_REGION( 0x40000, "mastercpu", 0 )
+ ROM_LOAD( "djboy.4b", 0x00000, 0x20000, CRC(354531ec) SHA1(4722376601ca2d8fb79622fef35ab5b5b084555d) ) // verified on 2 PCBs, neither PCB had a label on the ROM
+ ROM_LOAD( "bs100.4d", 0x20000, 0x20000, CRC(081e8af8) SHA1(3589dab1cf31b109a40370b4db1f31785023e2ed) )
+
+ ROM_REGION( 0x30000, "slavecpu", 0 )
+ ROM_LOAD( "djboy.5y", 0x00000, 0x10000, CRC(91eb189a) SHA1(a6a2662369cd6c851ae45a49654f6150fa8cf42e) ) // mask ROM without label
+ ROM_LOAD( "bs101.6w", 0x10000, 0x20000, CRC(a7c85577) SHA1(8296b96d5f69f6c730b7ed77fa8c93496b33529c) )
+
+ ROM_REGION( 0x20000, "soundcpu", 0 ) /* sound */
+ ROM_LOAD( "bs200.8c", 0x00000, 0x20000, CRC(f6c19e51) SHA1(82193f71122df07cce0a7f057a87b89eb2d587a1) )
+
+ ROM_REGION( 0x1000, "beast", 0 ) /* MSM80C51F microcontroller */
+ ROM_LOAD( "beast.9s", 0x00000, 0x1000, CRC(ebe0f5f3) SHA1(6081343c9b4510c4c16b71f6340266a1f76170ac) ) // Internal ROM image
+
+ ROM_REGION( 0x200000, "gfx1", 0 ) /* sprites */
+ ROM_LOAD( "bs000.1h", 0x000000, 0x80000, CRC(be4bf805) SHA1(a73c564575fe89d26225ca8ec2d98b6ac319ac18) )
+ ROM_LOAD( "bs001.1f", 0x080000, 0x80000, CRC(fdf36e6b) SHA1(a8762458dfd5201304247c113ceb85e96e33d423) )
+ ROM_LOAD( "bs002.1d", 0x100000, 0x80000, CRC(c52fee7f) SHA1(bd33117f7a57899fd4ec0a77413107edd9c44629) )
+ ROM_LOAD( "bs003.1k", 0x180000, 0x80000, CRC(ed89acb4) SHA1(611af362606b73cd2cf501678b463db52dcf69c4) )
+ ROM_LOAD( "bs06.1b", 0x1f0000, 0x10000, CRC(22c8aa08) SHA1(5521c9d73b4ee82a2de1992d6edc7ef62788ad72) ) // replaces last 0x200 tiles - verified correct for the World set
+
+ ROM_REGION( 0x100000, "gfx2", 0 ) /* background */
+ ROM_LOAD( "bs004.1s", 0x000000, 0x80000, CRC(2f1392c3) SHA1(1bc3030b3612766a02133eef0b4d20013c0495a4) )
+ ROM_LOAD( "bs005.1u", 0x080000, 0x80000, CRC(46b400c4) SHA1(35f4823364bbff1fc935994498d462bbd3bc6044) )
+
+ ROM_REGION( 0x40000, "oki", 0 ) /* OKI-M6295 samples */
+ ROM_LOAD( "bs203.5j", 0x000000, 0x40000, CRC(805341fb) SHA1(fb94e400e2283aaa806814d5a39d6196457dc822) )
+ROM_END
+
+ROM_START( djboyu )
+ ROM_REGION( 0x40000, "mastercpu", 0 )
ROM_LOAD( "bs64.4b", 0x00000, 0x20000, CRC(b77aacc7) SHA1(78100d4695738a702f13807526eb1bcac759cce3) )
ROM_LOAD( "bs100.4d", 0x20000, 0x20000, CRC(081e8af8) SHA1(3589dab1cf31b109a40370b4db1f31785023e2ed) )
@@ -561,14 +591,14 @@ ROM_START( djboy )
ROM_LOAD( "bs200.8c", 0x00000, 0x20000, CRC(f6c19e51) SHA1(82193f71122df07cce0a7f057a87b89eb2d587a1) )
ROM_REGION( 0x1000, "beast", 0 ) /* MSM80C51F microcontroller */
- ROM_LOAD( "beast.9s", 0x00000, 0x1000, CRC(ebe0f5f3) SHA1(6081343c9b4510c4c16b71f6340266a1f76170ac) ) /* Internal ROM image */
+ ROM_LOAD( "beast.9s", 0x00000, 0x1000, CRC(ebe0f5f3) SHA1(6081343c9b4510c4c16b71f6340266a1f76170ac) ) // Internal ROM image
ROM_REGION( 0x200000, "gfx1", 0 ) /* sprites */
ROM_LOAD( "bs000.1h", 0x000000, 0x80000, CRC(be4bf805) SHA1(a73c564575fe89d26225ca8ec2d98b6ac319ac18) )
ROM_LOAD( "bs001.1f", 0x080000, 0x80000, CRC(fdf36e6b) SHA1(a8762458dfd5201304247c113ceb85e96e33d423) )
ROM_LOAD( "bs002.1d", 0x100000, 0x80000, CRC(c52fee7f) SHA1(bd33117f7a57899fd4ec0a77413107edd9c44629) )
ROM_LOAD( "bs003.1k", 0x180000, 0x80000, CRC(ed89acb4) SHA1(611af362606b73cd2cf501678b463db52dcf69c4) )
- ROM_LOAD( "bs07s.1b", 0x1f0000, 0x10000, CRC(d9b7a220) SHA1(ba3b528d50650c209c986268bb29b42ff1276eb2) ) // replaces last 0x200 tiles
+ ROM_LOAD( "bs07s.1b", 0x1f0000, 0x10000, CRC(d9b7a220) SHA1(ba3b528d50650c209c986268bb29b42ff1276eb2) ) // replaces last 0x200 tiles - found labeled as both BS07 and BS07S, same data - verified
ROM_REGION( 0x100000, "gfx2", 0 ) /* background */
ROM_LOAD( "bs004.1s", 0x000000, 0x80000, CRC(2f1392c3) SHA1(1bc3030b3612766a02133eef0b4d20013c0495a4) )
@@ -578,27 +608,27 @@ ROM_START( djboy )
ROM_LOAD( "bs203.5j", 0x000000, 0x40000, CRC(805341fb) SHA1(fb94e400e2283aaa806814d5a39d6196457dc822) )
ROM_END
-ROM_START( djboya )
+ROM_START( djboyua )
ROM_REGION( 0x40000, "mastercpu", 0 )
- ROM_LOAD( "bs19s.rom", 0x00000, 0x20000, CRC(17ce9f6c) SHA1(a0c1832b05dc46991e8949067ca0278f5498835f) )
+ ROM_LOAD( "bs19s.4b", 0x00000, 0x20000, CRC(17ce9f6c) SHA1(a0c1832b05dc46991e8949067ca0278f5498835f) ) // found labeled as both BS19 and BS19S, same data - verified
ROM_LOAD( "bs100.4d", 0x20000, 0x20000, CRC(081e8af8) SHA1(3589dab1cf31b109a40370b4db1f31785023e2ed) )
ROM_REGION( 0x30000, "slavecpu", 0 )
- ROM_LOAD( "bs15s.rom", 0x00000, 0x10000, CRC(e6f966b2) SHA1(f9df16035a8b09d87eb70315b216892e25d99b03) )
+ ROM_LOAD( "bs15s.5y", 0x00000, 0x10000, CRC(e6f966b2) SHA1(f9df16035a8b09d87eb70315b216892e25d99b03) ) // found labeled as both BS15 and BS15S, same data - verified
ROM_LOAD( "bs101.6w", 0x10000, 0x20000, CRC(a7c85577) SHA1(8296b96d5f69f6c730b7ed77fa8c93496b33529c) )
ROM_REGION( 0x20000, "soundcpu", 0 ) /* sound */
ROM_LOAD( "bs200.8c", 0x00000, 0x20000, CRC(f6c19e51) SHA1(82193f71122df07cce0a7f057a87b89eb2d587a1) )
ROM_REGION( 0x1000, "beast", 0 ) /* MSM80C51F microcontroller */
- ROM_LOAD( "beast.9s", 0x00000, 0x1000, CRC(ebe0f5f3) SHA1(6081343c9b4510c4c16b71f6340266a1f76170ac) ) /* Internal ROM image */
+ ROM_LOAD( "beast.9s", 0x00000, 0x1000, CRC(ebe0f5f3) SHA1(6081343c9b4510c4c16b71f6340266a1f76170ac) ) // Internal ROM image
ROM_REGION( 0x200000, "gfx1", 0 ) /* sprites */
ROM_LOAD( "bs000.1h", 0x000000, 0x80000, CRC(be4bf805) SHA1(a73c564575fe89d26225ca8ec2d98b6ac319ac18) )
ROM_LOAD( "bs001.1f", 0x080000, 0x80000, CRC(fdf36e6b) SHA1(a8762458dfd5201304247c113ceb85e96e33d423) )
ROM_LOAD( "bs002.1d", 0x100000, 0x80000, CRC(c52fee7f) SHA1(bd33117f7a57899fd4ec0a77413107edd9c44629) )
ROM_LOAD( "bs003.1k", 0x180000, 0x80000, CRC(ed89acb4) SHA1(611af362606b73cd2cf501678b463db52dcf69c4) )
- ROM_LOAD( "bs07s.1b", 0x1f0000, 0x10000, CRC(d9b7a220) SHA1(ba3b528d50650c209c986268bb29b42ff1276eb2) ) // replaces last 0x200 tiles
+ ROM_LOAD( "bs07s.1b", 0x1f0000, 0x10000, CRC(d9b7a220) SHA1(ba3b528d50650c209c986268bb29b42ff1276eb2) ) // replaces last 0x200 tiles - found labeled as both BS07 and BS07S, same data - verified
ROM_REGION( 0x100000, "gfx2", 0 ) /* background */
ROM_LOAD( "bs004.1s", 0x000000, 0x80000, CRC(2f1392c3) SHA1(1bc3030b3612766a02133eef0b4d20013c0495a4) )
@@ -621,14 +651,14 @@ ROM_START( djboyj )
ROM_LOAD( "bs200.8c", 0x00000, 0x20000, CRC(f6c19e51) SHA1(82193f71122df07cce0a7f057a87b89eb2d587a1) )
ROM_REGION( 0x1000, "beast", 0 ) /* MSM80C51F microcontroller */
- ROM_LOAD( "beast.9s", 0x00000, 0x1000, CRC(ebe0f5f3) SHA1(6081343c9b4510c4c16b71f6340266a1f76170ac) ) /* Internal ROM image */
+ ROM_LOAD( "beast.9s", 0x00000, 0x1000, CRC(ebe0f5f3) SHA1(6081343c9b4510c4c16b71f6340266a1f76170ac) ) // Internal ROM image
ROM_REGION( 0x200000, "gfx1", 0 ) /* sprites */
ROM_LOAD( "bs000.1h", 0x000000, 0x80000, CRC(be4bf805) SHA1(a73c564575fe89d26225ca8ec2d98b6ac319ac18) )
ROM_LOAD( "bs001.1f", 0x080000, 0x80000, CRC(fdf36e6b) SHA1(a8762458dfd5201304247c113ceb85e96e33d423) )
ROM_LOAD( "bs002.1d", 0x100000, 0x80000, CRC(c52fee7f) SHA1(bd33117f7a57899fd4ec0a77413107edd9c44629) )
ROM_LOAD( "bs003.1k", 0x180000, 0x80000, CRC(ed89acb4) SHA1(611af362606b73cd2cf501678b463db52dcf69c4) )
- ROM_LOAD( "bsxx.1b", 0x1f0000, 0x10000, CRC(22c8aa08) SHA1(5521c9d73b4ee82a2de1992d6edc7ef62788ad72) ) // replaces last 0x200 tiles
+ ROM_LOAD( "bs06.1b", 0x1f0000, 0x10000, CRC(22c8aa08) SHA1(5521c9d73b4ee82a2de1992d6edc7ef62788ad72) ) // replaces last 0x200 tiles
ROM_REGION( 0x100000, "gfx2", 0 ) /* background */
ROM_LOAD( "bs004.1s", 0x000000, 0x80000, CRC(2f1392c3) SHA1(1bc3030b3612766a02133eef0b4d20013c0495a4) )
@@ -638,6 +668,37 @@ ROM_START( djboyj )
ROM_LOAD( "bs-204.5j", 0x000000, 0x40000, CRC(510244f0) SHA1(afb502d46d268ad9cd209ae1da72c50e4e785626) )
ROM_END
+ROM_START( djboyja )
+ ROM_REGION( 0x40000, "mastercpu", 0 )
+ ROM_LOAD( "djboyja.4b", 0x00000, 0x20000, CRC(f7ac20ca) SHA1(1bf66bfaa6d98f4cff50bc4d15cebfb7f4b09ae5) ) // mask ROM without label
+ ROM_LOAD( "bs100.4d", 0x20000, 0x20000, CRC(081e8af8) SHA1(3589dab1cf31b109a40370b4db1f31785023e2ed) )
+
+ ROM_REGION( 0x30000, "slavecpu", 0 )
+ ROM_LOAD( "bs13.5y", 0x00000, 0x10000, CRC(5c3f2f96) SHA1(bb7ee028a2d8d3c76a78a29fba60bcc36e9399f5) )
+ ROM_LOAD( "bs101.6w", 0x10000, 0x20000, CRC(a7c85577) SHA1(8296b96d5f69f6c730b7ed77fa8c93496b33529c) )
+
+ ROM_REGION( 0x20000, "soundcpu", 0 ) /* sound */
+ ROM_LOAD( "bs200.8c", 0x00000, 0x20000, CRC(f6c19e51) SHA1(82193f71122df07cce0a7f057a87b89eb2d587a1) )
+
+ ROM_REGION( 0x1000, "beast", 0 ) /* MSM80C51F microcontroller */
+ ROM_LOAD( "beast.9s", 0x00000, 0x1000, CRC(ebe0f5f3) SHA1(6081343c9b4510c4c16b71f6340266a1f76170ac) ) // Internal ROM image
+
+ ROM_REGION( 0x200000, "gfx1", 0 ) /* sprites */
+ ROM_LOAD( "bs000.1h", 0x000000, 0x80000, CRC(be4bf805) SHA1(a73c564575fe89d26225ca8ec2d98b6ac319ac18) )
+ ROM_LOAD( "bs001.1f", 0x080000, 0x80000, CRC(fdf36e6b) SHA1(a8762458dfd5201304247c113ceb85e96e33d423) )
+ ROM_LOAD( "bs002.1d", 0x100000, 0x80000, CRC(c52fee7f) SHA1(bd33117f7a57899fd4ec0a77413107edd9c44629) )
+ ROM_LOAD( "bs003.1k", 0x180000, 0x80000, CRC(ed89acb4) SHA1(611af362606b73cd2cf501678b463db52dcf69c4) )
+ ROM_LOAD( "bs06.1b", 0x1f0000, 0x10000, CRC(22c8aa08) SHA1(5521c9d73b4ee82a2de1992d6edc7ef62788ad72) ) // replaces last 0x200 tiles
+
+ ROM_REGION( 0x100000, "gfx2", 0 ) /* background */
+ ROM_LOAD( "bs004.1s", 0x000000, 0x80000, CRC(2f1392c3) SHA1(1bc3030b3612766a02133eef0b4d20013c0495a4) )
+ ROM_LOAD( "bs005.1u", 0x080000, 0x80000, CRC(46b400c4) SHA1(35f4823364bbff1fc935994498d462bbd3bc6044) )
+
+ ROM_REGION( 0x40000, "oki", 0 ) /* OKI-M6295 samples */
+ ROM_LOAD( "bs24_l.5j", 0x000000, 0x20000, CRC(b0e0a452) SHA1(ff2d7ea750d43b1a05c55ad01296866af9aea444) ) // same data as bs-204.5j but split in halves
+ ROM_LOAD( "bs24_h.5l", 0x020000, 0x20000, CRC(d24988ad) SHA1(22c2b9823e5320cf4e659d3e3b54991617b1e6b1) )
+ROM_END
+
void djboy_state::init_djboy()
{
@@ -649,7 +710,9 @@ void djboy_state::init_djboyj()
m_bankxor = 0x1f;
}
-/* YEAR, NAME, PARENT, MACHINE, INPUT, STATE, INIT, MNTR, COMPANY, FULLNAME, FLAGS */
-GAME( 1989, djboy, 0, djboy, djboy, djboy_state, init_djboy, ROT0, "Kaneko (American Sammy license)", "DJ Boy (set 1)", MACHINE_SUPPORTS_SAVE) // Sammy & Williams logos in FG ROM
-GAME( 1989, djboya, djboy, djboy, djboy, djboy_state, init_djboy, ROT0, "Kaneko (American Sammy license)", "DJ Boy (set 2)", MACHINE_SUPPORTS_SAVE) // Sammy & Williams logos in FG ROM
-GAME( 1989, djboyj, djboy, djboy, djboy, djboy_state, init_djboyj, ROT0, "Kaneko (Sega license)", "DJ Boy (Japan)", MACHINE_SUPPORTS_SAVE ) // Sega logo in FG ROM
+/* YEAR, NAME, PARENT, MACHINE, INPUT, STATE, INIT, MNTR, COMPANY, FULLNAME, FLAGS */
+GAME( 1989, djboy, 0, djboy, djboy, djboy_state, init_djboy, ROT0, "Kaneko", "DJ Boy (World)", MACHINE_SUPPORTS_SAVE )
+GAME( 1990, djboyu, djboy, djboy, djboy, djboy_state, init_djboy, ROT0, "Kaneko (American Sammy license)", "DJ Boy (US, set 1)", MACHINE_SUPPORTS_SAVE ) // Sammy & Williams logos in FG ROM
+GAME( 1990, djboyua, djboy, djboy, djboy, djboy_state, init_djboy, ROT0, "Kaneko (American Sammy license)", "DJ Boy (US, set 2)", MACHINE_SUPPORTS_SAVE ) // Sammy & Williams logos in FG ROM
+GAME( 1989, djboyj, djboy, djboy, djboy, djboy_state, init_djboyj, ROT0, "Kaneko (Sega license)", "DJ Boy (Japan, set 1)", MACHINE_SUPPORTS_SAVE ) // Sega logo in FG ROM
+GAME( 1989, djboyja, djboy, djboy, djboy, djboy_state, init_djboyj, ROT0, "Kaneko (Sega license)", "DJ Boy (Japan, set 2)", MACHINE_SUPPORTS_SAVE ) // Sega logo in FG ROM
diff --git a/src/mame/drivers/djmain.cpp b/src/mame/drivers/djmain.cpp
index 1239d9c5df1..11354990fbc 100644
--- a/src/mame/drivers/djmain.cpp
+++ b/src/mame/drivers/djmain.cpp
@@ -1379,25 +1379,25 @@ void djmain_state::machine_reset()
*
*************************************/
-MACHINE_CONFIG_START(djmain_state::djmainj)
-
+void djmain_state::djmainj(machine_config &config)
+{
/* basic machine hardware */
// popn3 works 9.6 MHz or slower in some songs */
- //MCFG_DEVICE_ADD("maincpu", M68EC020, 18432000/2) /* 9.216 MHz!? */
- MCFG_DEVICE_ADD("maincpu", M68EC020, 32000000/4) /* 8.000 MHz!? */
- MCFG_DEVICE_PROGRAM_MAP(maincpu_djmainj)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", djmain_state, vb_interrupt)
+ //M68EC020(config, m_maincpu, 18432000/2); /* 9.216 MHz!? */
+ M68EC020(config, m_maincpu, 32000000/4); /* 8.000 MHz!? */
+ m_maincpu->set_addrmap(AS_PROGRAM, &djmain_state::maincpu_djmainj);
+ m_maincpu->set_vblank_int("screen", FUNC(djmain_state::vb_interrupt));
ATA_INTERFACE(config, m_ata).options(ata_devices, "hdd", nullptr, true);
m_ata->irq_handler().set(FUNC(djmain_state::ide_interrupt));
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(58)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(64*8, 64*8)
- MCFG_SCREEN_VISIBLE_AREA(12, 512-12-1, 0, 384-1)
- MCFG_SCREEN_UPDATE_DRIVER(djmain_state, screen_update_djmain)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(58);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(64*8, 64*8);
+ screen.set_visarea(12, 512-12-1, 0, 384-1);
+ screen.set_screen_update(FUNC(djmain_state::screen_update_djmain));
PALETTE(config, m_palette).set_format(palette_device::xBGR_888, 0x4440 / 4);
GFXDECODE(config, m_gfxdecode, m_palette, gfx_djmain);
@@ -1413,28 +1413,28 @@ MACHINE_CONFIG_START(djmain_state::djmainj)
SPEAKER(config, "lspeaker").front_left();
SPEAKER(config, "rspeaker").front_right();
- MCFG_DEVICE_ADD("k054539_1", K054539, XTAL(18'432'000))
- MCFG_DEVICE_ADDRESS_MAP(0, k054539_map)
- MCFG_SOUND_ROUTE(0, "lspeaker", 1.0)
- MCFG_SOUND_ROUTE(1, "rspeaker", 1.0)
+ k054539_device &k054539_1(K054539(config, "k054539_1", XTAL(18'432'000)));
+ k054539_1.set_addrmap(0, &djmain_state::k054539_map);
+ k054539_1.add_route(0, "lspeaker", 1.0);
+ k054539_1.add_route(1, "rspeaker", 1.0);
- MCFG_DEVICE_ADD("k054539_2", K054539, XTAL(18'432'000))
- MCFG_DEVICE_ADDRESS_MAP(0, k054539_map)
- MCFG_SOUND_ROUTE(0, "lspeaker", 1.0)
- MCFG_SOUND_ROUTE(1, "rspeaker", 1.0)
-MACHINE_CONFIG_END
+ k054539_device &k054539_2(K054539(config, "k054539_2", XTAL(18'432'000)));
+ k054539_2.set_addrmap(0, &djmain_state::k054539_map);
+ k054539_2.add_route(0, "lspeaker", 1.0);
+ k054539_2.add_route(1, "rspeaker", 1.0);
+}
-MACHINE_CONFIG_START(djmain_state::djmainu)
+void djmain_state::djmainu(machine_config &config)
+{
djmainj(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(maincpu_djmainu)
-MACHINE_CONFIG_END
+ m_maincpu->set_addrmap(AS_PROGRAM, &djmain_state::maincpu_djmainu);
+}
-MACHINE_CONFIG_START(djmain_state::djmaina)
+void djmain_state::djmaina(machine_config &config)
+{
djmainj(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(maincpu_djmaina)
-MACHINE_CONFIG_END
+ m_maincpu->set_addrmap(AS_PROGRAM, &djmain_state::maincpu_djmaina);
+}
diff --git a/src/mame/drivers/dkmb.cpp b/src/mame/drivers/dkmb.cpp
index 617f45138cf..02684188d89 100644
--- a/src/mame/drivers/dkmb.cpp
+++ b/src/mame/drivers/dkmb.cpp
@@ -119,24 +119,24 @@ static INPUT_PORTS_START( dkmb )
INPUT_PORTS_END
-MACHINE_CONFIG_START(dkmb_state::dkmb)
-
- MCFG_DEVICE_ADD("maincpu", PPC603R, 75'000'000) // Actually MPC603RRX266LC
- MCFG_DEVICE_PROGRAM_MAP(main_map)
+void dkmb_state::dkmb(machine_config &config)
+{
+ PPC603R(config, m_maincpu, 75'000'000); // Actually MPC603RRX266LC
+ m_maincpu->set_addrmap(AS_PROGRAM, &dkmb_state::main_map);
- MCFG_DEVICE_ADD("pic", PIC16C56, 4'000'000) // Actually PIC12C508, clock not verified
+ PIC16C56(config, "pic", 4'000'000); // Actually PIC12C508, clock not verified
- MCFG_SCREEN_ADD("screen", RASTER) // wrong
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_UPDATE_DRIVER(dkmb_state, screen_update)
- MCFG_SCREEN_SIZE(1024, 256)
- MCFG_SCREEN_VISIBLE_AREA(0, 1024-1, 0, 256-1)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER)); // wrong
+ screen.set_refresh_hz(60);
+ screen.set_screen_update(FUNC(dkmb_state::screen_update));
+ screen.set_size(1024, 256);
+ screen.set_visarea_full();
- MCFG_PALETTE_ADD("palette", 65536)
+ PALETTE(config, "palette").set_entries(65536);
SPEAKER(config, "lspeaker").front_left();
SPEAKER(config, "rspeaker").front_right();
-MACHINE_CONFIG_END
+}
ROM_START( dkmb )
diff --git a/src/mame/drivers/dkong.cpp b/src/mame/drivers/dkong.cpp
index 55af4b84ce7..9be28348ab8 100644
--- a/src/mame/drivers/dkong.cpp
+++ b/src/mame/drivers/dkong.cpp
@@ -1692,11 +1692,11 @@ WRITE_LINE_MEMBER(dkong_state::busreq_w )
m_dma8257->hlda_w(state);
}
-MACHINE_CONFIG_START(dkong_state::dkong_base)
-
+void dkong_state::dkong_base(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD(m_maincpu, Z80, CLOCK_1H)
- MCFG_DEVICE_PROGRAM_MAP(dkong_map)
+ Z80(config, m_maincpu, CLOCK_1H);
+ m_maincpu->set_addrmap(AS_PROGRAM, &dkong_state::dkong_map);
MCFG_MACHINE_START_OVERRIDE(dkong_state,dkong2b)
MCFG_MACHINE_RESET_OVERRIDE(dkong_state,dkong)
@@ -1710,19 +1710,20 @@ MACHINE_CONFIG_START(dkong_state::dkong_base)
m_dma8257->set_reverse_rw_mode(1); // why?
/* video hardware */
- MCFG_SCREEN_ADD(m_screen, RASTER)
- MCFG_SCREEN_RAW_PARAMS(PIXEL_CLOCK, HTOTAL, HBEND, HBSTART, VTOTAL, VBEND, VBSTART)
- MCFG_SCREEN_UPDATE_DRIVER(dkong_state, screen_update_dkong)
- MCFG_SCREEN_PALETTE(m_palette)
- MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE(*this, dkong_state, vblank_irq))
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_raw(PIXEL_CLOCK, HTOTAL, HBEND, HBSTART, VTOTAL, VBEND, VBSTART);
+ m_screen->set_screen_update(FUNC(dkong_state::screen_update_dkong));
+ m_screen->set_palette(m_palette);
+ m_screen->screen_vblank().set(FUNC(dkong_state::vblank_irq));
GFXDECODE(config, m_gfxdecode, m_palette, gfx_dkong);
PALETTE(config, m_palette, FUNC(dkong_state::dkong2b_palette), DK2B_PALETTE_LENGTH);
MCFG_VIDEO_START_OVERRIDE(dkong_state,dkong)
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(dkong_state::radarscp)
+void dkong_state::radarscp(machine_config &config)
+{
dkong_base(config);
/* basic machine hardware */
@@ -1732,9 +1733,10 @@ MACHINE_CONFIG_START(dkong_state::radarscp)
/* sound hardware */
radarscp_audio(config);
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(dkong_state::radarscp1)
+void dkong_state::radarscp1(machine_config &config)
+{
dkong_base(config);
/* basic machine hardware */
@@ -1744,10 +1746,11 @@ MACHINE_CONFIG_START(dkong_state::radarscp1)
/* sound hardware */
radarscp1_audio(config);
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(dkong_state::dkong2b)
+void dkong_state::dkong2b(machine_config &config)
+{
dkong_base(config);
/* basic machine hardware */
@@ -1758,7 +1761,7 @@ MACHINE_CONFIG_START(dkong_state::dkong2b)
dkong2b_audio(config);
WATCHDOG_TIMER(config, m_watchdog);
-MACHINE_CONFIG_END
+}
void dkong_state::dk_braze(machine_config &config)
{
@@ -1788,12 +1791,12 @@ void dkong_state::dk3_braze(machine_config &config)
EEPROM_93C46_8BIT(config, "eeprom");
}
-MACHINE_CONFIG_START(dkong_state::dkong3)
-
+void dkong_state::dkong3(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD(m_maincpu, Z80, XTAL(8'000'000) / 2) /* verified in schematics */
- MCFG_DEVICE_PROGRAM_MAP(dkong3_map)
- MCFG_DEVICE_IO_MAP(dkong3_io_map)
+ Z80(config, m_maincpu, XTAL(8'000'000) / 2); /* verified in schematics */
+ m_maincpu->set_addrmap(AS_PROGRAM, &dkong_state::dkong3_map);
+ m_maincpu->set_addrmap(AS_IO, &dkong_state::dkong3_io_map);
MCFG_MACHINE_START_OVERRIDE(dkong_state, dkong3)
@@ -1818,27 +1821,28 @@ MACHINE_CONFIG_START(dkong_state::dkong3)
/* sound hardware */
dkong3_audio(config);
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(dkong_state::dkongjr)
+void dkong_state::dkongjr(machine_config &config)
+{
dkong_base(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(dkongjr_map)
+ m_maincpu->set_addrmap(AS_PROGRAM, &dkong_state::dkongjr_map);
/* sound hardware */
dkongjr_audio(config);
WATCHDOG_TIMER(config, m_watchdog);
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(dkong_state::pestplce)
+void dkong_state::pestplce(machine_config &config)
+{
dkongjr(config);
/* video hardware */
m_palette->set_init(FUNC(dkong_state::dkong2b_palette)); // wrong!
m_screen->set_screen_update(FUNC(dkong_state::screen_update_pestplce));
-MACHINE_CONFIG_END
+}
void dkong_state::dkong3b(machine_config &config)
{
@@ -1893,35 +1897,35 @@ void dkong_state::spclforc(machine_config &config)
*
*************************************/
-MACHINE_CONFIG_START(dkong_state::strtheat)
+void dkong_state::strtheat(machine_config &config)
+{
dkong2b(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_IO_MAP(epos_readport)
+ m_maincpu->set_addrmap(AS_IO, &dkong_state::epos_readport);
MCFG_MACHINE_RESET_OVERRIDE(dkong_state,strtheat)
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(dkong_state::drakton)
+void dkong_state::drakton(machine_config &config)
+{
dkong2b(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_IO_MAP(epos_readport)
+ m_maincpu->set_addrmap(AS_IO, &dkong_state::epos_readport);
MCFG_MACHINE_RESET_OVERRIDE(dkong_state,drakton)
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(dkong_state::drktnjr)
+void dkong_state::drktnjr(machine_config &config)
+{
dkongjr(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_IO_MAP(epos_readport)
+ m_maincpu->set_addrmap(AS_IO, &dkong_state::epos_readport);
MCFG_MACHINE_RESET_OVERRIDE(dkong_state,drakton)
-MACHINE_CONFIG_END
+}
/*************************************
*
diff --git a/src/mame/drivers/dlair.cpp b/src/mame/drivers/dlair.cpp
index 6decd6ef2c7..2125123dc60 100644
--- a/src/mame/drivers/dlair.cpp
+++ b/src/mame/drivers/dlair.cpp
@@ -141,7 +141,7 @@ private:
optional_device<palette_device> m_palette;
optional_device<pioneer_ldv1000_device> m_ldv1000;
optional_device<pioneer_pr7820_device> m_pr7820;
- optional_device<phillips_22vp932_device> m_22vp932;
+ optional_device<philips_22vp932_device> m_22vp932;
optional_shared_ptr<uint8_t> m_videoram;
output_finder<16> m_digits;
@@ -744,18 +744,18 @@ void dlair_state::dlair_base(machine_config &config)
MACHINE_CONFIG_START(dlair_state::dlair_pr7820)
dlair_base(config);
- MCFG_LASERDISC_PR7820_ADD("ld_pr7820")
- MCFG_SOUND_ROUTE(0, "lspeaker", 1.0)
- MCFG_SOUND_ROUTE(1, "rspeaker", 1.0)
+ PIONEER_PR7820(config, m_pr7820, 0);
+ m_pr7820->add_route(0, "lspeaker", 1.0);
+ m_pr7820->add_route(1, "rspeaker", 1.0);
MCFG_LASERDISC_SCREEN_ADD_NTSC("screen", "ld_pr7820")
MACHINE_CONFIG_END
MACHINE_CONFIG_START(dlair_state::dlair_ldv1000)
dlair_base(config);
- MCFG_LASERDISC_LDV1000_ADD("ld_ldv1000")
- MCFG_SOUND_ROUTE(0, "lspeaker", 1.0)
- MCFG_SOUND_ROUTE(1, "rspeaker", 1.0)
+ PIONEER_LDV1000(config, m_ldv1000, 0);
+ m_ldv1000->add_route(0, "lspeaker", 1.0);
+ m_ldv1000->add_route(1, "rspeaker", 1.0);
MCFG_LASERDISC_SCREEN_ADD_NTSC("screen", "ld_ldv1000")
MACHINE_CONFIG_END
@@ -778,27 +778,25 @@ MACHINE_CONFIG_START(dlair_state::dleuro)
WATCHDOG_TIMER(config, "watchdog").set_time(attotime::from_hz(MASTER_CLOCK_EURO/(16*16*16*16*16*8)));
- MCFG_LASERDISC_22VP932_ADD("ld_22vp932")
- MCFG_LASERDISC_OVERLAY_DRIVER(256, 256, dlair_state, screen_update_dleuro)
- MCFG_LASERDISC_OVERLAY_PALETTE(m_palette)
+ PHILIPS_22VP932(config, m_22vp932, 0);
+ m_22vp932->set_overlay(256, 256, FUNC(dlair_state::screen_update_dleuro));
+ m_22vp932->set_overlay_palette(m_palette);
+ m_22vp932->add_route(0, "lspeaker", 1.0);
+ m_22vp932->add_route(1, "rspeaker", 1.0);
/* video hardware */
MCFG_LASERDISC_SCREEN_ADD_PAL("screen", "ld_22vp932")
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, m_palette, gfx_dlair)
+ GFXDECODE(config, m_gfxdecode, m_palette, gfx_dlair);
PALETTE(config, m_palette, FUNC(dlair_state::dleuro_palette), 16);
/* sound hardware */
SPEAKER(config, "lspeaker").front_left();
SPEAKER(config, "rspeaker").front_right();
- MCFG_DEVICE_ADD("speaker", SPEAKER_SOUND)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 0.33)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 0.33)
-
- MCFG_DEVICE_MODIFY("ld_22vp932")
- MCFG_SOUND_ROUTE(0, "lspeaker", 1.0)
- MCFG_SOUND_ROUTE(1, "rspeaker", 1.0)
+ SPEAKER_SOUND(config, m_speaker);
+ m_speaker->add_route(ALL_OUTPUTS, "lspeaker", 0.33);
+ m_speaker->add_route(ALL_OUTPUTS, "rspeaker", 0.33);
MACHINE_CONFIG_END
diff --git a/src/mame/drivers/dlair2.cpp b/src/mame/drivers/dlair2.cpp
index 2b0c600ed26..daf30d47ebb 100644
--- a/src/mame/drivers/dlair2.cpp
+++ b/src/mame/drivers/dlair2.cpp
@@ -183,30 +183,30 @@ INTERRUPT_GEN_MEMBER(dlair2_state::dlair2_timer_irq)
device.execute().set_input_line_and_vector(0,HOLD_LINE,0x20/4);
}
-MACHINE_CONFIG_START(dlair2_state::dlair2)
-
+void dlair2_state::dlair2(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", I8088 , MAIN_CLOCK/3) /* Schematics show I8088 "max" CPU */
- MCFG_DEVICE_PROGRAM_MAP(dlair2_map)
- MCFG_DEVICE_IO_MAP(dlair2_io)
- MCFG_DEVICE_PERIODIC_INT_DRIVER(dlair2_state, dlair2_timer_irq, 60) // timer irq, TODO: timing
+ I8088(config, m_maincpu, MAIN_CLOCK/3); /* Schematics show I8088 "max" CPU */
+ m_maincpu->set_addrmap(AS_PROGRAM, &dlair2_state::dlair2_map);
+ m_maincpu->set_addrmap(AS_IO, &dlair2_state::dlair2_io);
+ m_maincpu->set_periodic_int(FUNC(dlair2_state::dlair2_timer_irq), attotime::from_hz(60)); // timer irq, TODO: timing
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500))
- MCFG_SCREEN_UPDATE_DRIVER(dlair2_state, screen_update)
- MCFG_SCREEN_SIZE(32*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 0*8, 32*8-1)
- MCFG_SCREEN_PALETTE("palette")
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500));
+ screen.set_screen_update(FUNC(dlair2_state::screen_update));
+ screen.set_size(32*8, 32*8);
+ screen.set_visarea_full();
+ screen.set_palette("palette");
-// MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_dlair2)
+// GFXDECODE(config, "gfxdecode", "palette", gfx_dlair2);
PALETTE(config, "palette", FUNC(dlair2_state::dlair2_palette), 256);
/* sound hardware */
SPEAKER(config, "mono").front_center();
-MACHINE_CONFIG_END
+}
/***************************************************************************
diff --git a/src/mame/drivers/dm7000.cpp b/src/mame/drivers/dm7000.cpp
index 60d5868dcb0..4bde5a8ea1e 100644
--- a/src/mame/drivers/dm7000.cpp
+++ b/src/mame/drivers/dm7000.cpp
@@ -107,7 +107,7 @@ WRITE8_MEMBER( dm7000_state::dm7000_scc0_w )
switch(offset) {
case UART_THR:
if(!(m_scc0_lcr & UART_LCR_DLAB)) {
- m_terminal->write(space, 0, data);
+ m_terminal->write(data);
m_scc0_lsr = 1;
}
break;
diff --git a/src/mame/drivers/dmax8000.cpp b/src/mame/drivers/dmax8000.cpp
index 0f1358433ee..fea238d8e2e 100644
--- a/src/mame/drivers/dmax8000.cpp
+++ b/src/mame/drivers/dmax8000.cpp
@@ -152,11 +152,12 @@ static void floppies(device_slot_interface &device)
}
-MACHINE_CONFIG_START(dmax8000_state::dmax8000)
+void dmax8000_state::dmax8000(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, 4'000'000) // no idea what crystal is used, but 4MHz clock is confirmed
- MCFG_DEVICE_PROGRAM_MAP(dmax8000_mem)
- MCFG_DEVICE_IO_MAP(dmax8000_io)
+ Z80(config, m_maincpu, 4'000'000); // no idea what crystal is used, but 4MHz clock is confirmed
+ m_maincpu->set_addrmap(AS_PROGRAM, &dmax8000_state::dmax8000_mem);
+ m_maincpu->set_addrmap(AS_IO, &dmax8000_state::dmax8000_io);
MCFG_MACHINE_RESET_OVERRIDE(dmax8000_state, dmax8000)
z80ctc_device &ctc(Z80CTC(config, "ctc", 4_MHz_XTAL));
@@ -192,14 +193,13 @@ MACHINE_CONFIG_START(dmax8000_state::dmax8000)
FD1793(config, m_fdc, 2'000'000); // no idea
m_fdc->intrq_wr_callback().set_inputline(m_maincpu, INPUT_LINE_IRQ0);
m_fdc->drq_wr_callback().set(FUNC(dmax8000_state::fdc_drq_w));
- MCFG_FLOPPY_DRIVE_ADD("fdc:0", floppies, "8dsdd", floppy_image_device::default_floppy_formats)
- MCFG_FLOPPY_DRIVE_SOUND(true)
+ FLOPPY_CONNECTOR(config, "fdc:0", floppies, "8dsdd", floppy_image_device::default_floppy_formats).enable_sound(true);
- MCFG_DEVICE_ADD("rtc", MM58274C, 0) // MM58174
+ mm58274c_device &rtc(MM58274C(config, "rtc", 0)); // MM58174
// this is all guess
- MCFG_MM58274C_MODE24(0) // 12 hour
- MCFG_MM58274C_DAY1(1) // monday
-MACHINE_CONFIG_END
+ rtc.set_mode24(0); // 12 hour
+ rtc.set_day1(1); // monday
+}
/* ROM definition */
diff --git a/src/mame/drivers/dmndrby.cpp b/src/mame/drivers/dmndrby.cpp
index 0055bfe608d..0de837b2e2d 100644
--- a/src/mame/drivers/dmndrby.cpp
+++ b/src/mame/drivers/dmndrby.cpp
@@ -497,18 +497,18 @@ void dmndrby_state::dmndrby_palette(palette_device &palette) const
bit0 = BIT(color_prom[i], 0);
bit1 = BIT(color_prom[i], 1);
bit2 = BIT(color_prom[i], 2);
- int const r = combine_3_weights(rweights, bit0, bit1, bit2);
+ int const r = combine_weights(rweights, bit0, bit1, bit2);
// green component
bit0 = BIT(color_prom[i], 3);
bit1 = BIT(color_prom[i], 4);
bit2 = BIT(color_prom[i], 5);
- int const g = combine_3_weights(gweights, bit0, bit1, bit2);
+ int const g = combine_weights(gweights, bit0, bit1, bit2);
// blue component
bit0 = BIT(color_prom[i], 6);
bit1 = BIT(color_prom[i], 7);
- int const b = combine_2_weights(bweights, bit0, bit1);
+ int const b = combine_weights(bweights, bit0, bit1);
palette.set_indirect_color(i, rgb_t(r, g, b));
}
@@ -535,27 +535,28 @@ INTERRUPT_GEN_MEMBER(dmndrby_state::dderby_timer_irq)
m_maincpu->set_input_line_and_vector(0, HOLD_LINE, 0xcf); /* RST 08h */
}
-MACHINE_CONFIG_START(dmndrby_state::dderby)
+void dmndrby_state::dderby(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80,4000000) /* ? MHz */
- MCFG_DEVICE_PROGRAM_MAP(memmap)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", dmndrby_state, dderby_irq)
- MCFG_DEVICE_PERIODIC_INT_DRIVER(dmndrby_state, dderby_timer_irq, 244/2)
+ Z80(config, m_maincpu, 4000000); /* ? MHz */
+ m_maincpu->set_addrmap(AS_PROGRAM, &dmndrby_state::memmap);
+ m_maincpu->set_vblank_int("screen", FUNC(dmndrby_state::dderby_irq));
+ m_maincpu->set_periodic_int(FUNC(dmndrby_state::dderby_timer_irq), attotime::from_hz(244/2));
- MCFG_DEVICE_ADD("audiocpu", Z80, 4000000) /* verified on schematics */
- MCFG_DEVICE_PROGRAM_MAP(dderby_sound_map)
+ Z80(config, m_audiocpu, 4000000); /* verified on schematics */
+ m_audiocpu->set_addrmap(AS_PROGRAM, &dmndrby_state::dderby_sound_map);
- MCFG_QUANTUM_TIME(attotime::from_hz(6000))
+ config.m_minimum_quantum = attotime::from_hz(6000);
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(256, 256)
- MCFG_SCREEN_VISIBLE_AREA(0, 256-1, 16, 256-16-1)
- MCFG_SCREEN_UPDATE_DRIVER(dmndrby_state, screen_update_dderby)
- MCFG_SCREEN_PALETTE(m_palette)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(256, 256);
+ screen.set_visarea(0, 256-1, 16, 256-16-1);
+ screen.set_screen_update(FUNC(dmndrby_state::screen_update_dderby));
+ screen.set_palette(m_palette);
GFXDECODE(config, m_gfxdecode, m_palette, gfx_dmndrby);
PALETTE(config, m_palette, FUNC(dmndrby_state::dmndrby_palette), 0x300, 0x20);
@@ -565,7 +566,7 @@ MACHINE_CONFIG_START(dmndrby_state::dderby)
GENERIC_LATCH_8(config, m_soundlatch);
AY8910(config, "ay1", 1789750).add_route(ALL_OUTPUTS, "mono", 0.35); // frequency guessed
-MACHINE_CONFIG_END
+}
ROM_START( dmndrby )
diff --git a/src/mame/drivers/dms5000.cpp b/src/mame/drivers/dms5000.cpp
index 06e14ea41c0..1eb4a93cc4a 100644
--- a/src/mame/drivers/dms5000.cpp
+++ b/src/mame/drivers/dms5000.cpp
@@ -94,25 +94,26 @@ uint32_t dms5000_state::screen_update_dms5000(screen_device &screen, bitmap_ind1
return 0;
}
-MACHINE_CONFIG_START(dms5000_state::dms5000)
+void dms5000_state::dms5000(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu",I8086, XTAL(9'830'400))
- MCFG_DEVICE_PROGRAM_MAP(dms5000_mem)
- MCFG_DEVICE_IO_MAP(dms5000_io)
+ I8086(config, m_maincpu, XTAL(9'830'400));
+ m_maincpu->set_addrmap(AS_PROGRAM, &dms5000_state::dms5000_mem);
+ m_maincpu->set_addrmap(AS_IO, &dms5000_state::dms5000_io);
- MCFG_DEVICE_ADD("cntlatch", LS259, 0) // V34
+ LS259(config, "cntlatch", 0); // V34
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(50)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */
- MCFG_SCREEN_SIZE(640, 480)
- MCFG_SCREEN_VISIBLE_AREA(0, 640-1, 0, 480-1)
- MCFG_SCREEN_UPDATE_DRIVER(dms5000_state, screen_update_dms5000)
- MCFG_SCREEN_PALETTE("palette")
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_refresh_hz(50);
+ m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */
+ m_screen->set_size(640, 480);
+ m_screen->set_visarea_full();
+ m_screen->set_screen_update(FUNC(dms5000_state::screen_update_dms5000));
+ m_screen->set_palette("palette");
PALETTE(config, "palette", palette_device::MONOCHROME);
-MACHINE_CONFIG_END
+}
/* ROM definition */
ROM_START( dms5000 )
diff --git a/src/mame/drivers/dmv.cpp b/src/mame/drivers/dmv.cpp
index 23af1f0590d..4c98414e380 100644
--- a/src/mame/drivers/dmv.cpp
+++ b/src/mame/drivers/dmv.cpp
@@ -127,21 +127,21 @@ private:
DECLARE_FLOPPY_FORMATS( floppy_formats );
DECLARE_QUICKLOAD_LOAD_MEMBER(dmv);
- uint8_t program_read(address_space &space, int cas, offs_t offset);
- void program_write(address_space &space, int cas, offs_t offset, uint8_t data);
-
- void ifsel_r(address_space &space, int ifsel, offs_t offset, uint8_t &data);
- void ifsel_w(address_space &space, int ifsel, offs_t offset, uint8_t data);
- DECLARE_READ8_MEMBER(ifsel0_r) { uint8_t data = 0xff; ifsel_r(space, 0, offset, data); return data; }
- DECLARE_READ8_MEMBER(ifsel1_r) { uint8_t data = 0xff; ifsel_r(space, 1, offset, data); return data; }
- DECLARE_READ8_MEMBER(ifsel2_r) { uint8_t data = 0xff; ifsel_r(space, 2, offset, data); return data; }
- DECLARE_READ8_MEMBER(ifsel3_r) { uint8_t data = 0xff; ifsel_r(space, 3, offset, data); return data; }
- DECLARE_READ8_MEMBER(ifsel4_r) { uint8_t data = 0xff; ifsel_r(space, 4, offset, data); return data; }
- DECLARE_WRITE8_MEMBER(ifsel0_w) { ifsel_w(space, 0, offset, data); }
- DECLARE_WRITE8_MEMBER(ifsel1_w) { ifsel_w(space, 1, offset, data); }
- DECLARE_WRITE8_MEMBER(ifsel2_w) { ifsel_w(space, 2, offset, data); }
- DECLARE_WRITE8_MEMBER(ifsel3_w) { ifsel_w(space, 3, offset, data); }
- DECLARE_WRITE8_MEMBER(ifsel4_w) { ifsel_w(space, 4, offset, data); }
+ uint8_t program_read(int cas, offs_t offset);
+ void program_write(int cas, offs_t offset, uint8_t data);
+
+ void ifsel_r(int ifsel, offs_t offset, uint8_t &data);
+ void ifsel_w(int ifsel, offs_t offset, uint8_t data);
+ DECLARE_READ8_MEMBER(ifsel0_r) { uint8_t data = 0xff; ifsel_r(0, offset, data); return data; }
+ DECLARE_READ8_MEMBER(ifsel1_r) { uint8_t data = 0xff; ifsel_r(1, offset, data); return data; }
+ DECLARE_READ8_MEMBER(ifsel2_r) { uint8_t data = 0xff; ifsel_r(2, offset, data); return data; }
+ DECLARE_READ8_MEMBER(ifsel3_r) { uint8_t data = 0xff; ifsel_r(3, offset, data); return data; }
+ DECLARE_READ8_MEMBER(ifsel4_r) { uint8_t data = 0xff; ifsel_r(4, offset, data); return data; }
+ DECLARE_WRITE8_MEMBER(ifsel0_w) { ifsel_w(0, offset, data); }
+ DECLARE_WRITE8_MEMBER(ifsel1_w) { ifsel_w(1, offset, data); }
+ DECLARE_WRITE8_MEMBER(ifsel2_w) { ifsel_w(2, offset, data); }
+ DECLARE_WRITE8_MEMBER(ifsel3_w) { ifsel_w(3, offset, data); }
+ DECLARE_WRITE8_MEMBER(ifsel4_w) { ifsel_w(4, offset, data); }
UPD7220_DISPLAY_PIXELS_MEMBER( hgdc_display_pixels );
UPD7220_DRAW_TEXT_LINE_MEMBER( hgdc_draw_text );
@@ -426,38 +426,36 @@ static void dmv_floppies(device_slot_interface &device)
}
-void dmv_state::ifsel_r(address_space &space, int ifsel, offs_t offset, uint8_t &data)
+void dmv_state::ifsel_r(int ifsel, offs_t offset, uint8_t &data)
{
- dmvcart_slot_device *slots[] = { m_slot2, m_slot2a, m_slot3, m_slot4, m_slot5, m_slot6, m_slot7, m_slot7a };
- for(auto & slot : slots)
- slot->io_read(space, ifsel, offset, data);
+ for (auto &slot : { m_slot2, m_slot2a, m_slot3, m_slot4, m_slot5, m_slot6, m_slot7, m_slot7a })
+ slot->io_read(ifsel, offset, data);
}
-void dmv_state::ifsel_w(address_space &space, int ifsel, offs_t offset, uint8_t data)
+void dmv_state::ifsel_w(int ifsel, offs_t offset, uint8_t data)
{
- dmvcart_slot_device *slots[] = { m_slot2, m_slot2a, m_slot3, m_slot4, m_slot5, m_slot6, m_slot7, m_slot7a };
- for(auto & slot : slots)
- slot->io_write(space, ifsel, offset, data);
+ for(auto &slot : { m_slot2, m_slot2a, m_slot3, m_slot4, m_slot5, m_slot6, m_slot7, m_slot7a })
+ slot->io_write(ifsel, offset, data);
}
WRITE8_MEMBER(dmv_state::exp_program_w)
{
- program_write(space, (offset >> 16) & 0x07, offset, data);
+ program_write((offset >> 16) & 0x07, offset, data);
}
READ8_MEMBER(dmv_state::exp_program_r)
{
- return program_read(space, (offset >> 16) & 0x07, offset);
+ return program_read((offset >> 16) & 0x07, offset);
}
WRITE8_MEMBER(dmv_state::program_w)
{
- program_write(space, m_ram_bank, offset, data);
+ program_write(m_ram_bank, offset, data);
}
READ8_MEMBER(dmv_state::program_r)
{
- return program_read(space, m_ram_bank, offset);
+ return program_read(m_ram_bank, offset);
}
WRITE_LINE_MEMBER( dmv_state::thold7_w )
@@ -519,7 +517,7 @@ void dmv_state::update_irqs(int slot, int state)
}
}
-void dmv_state::program_write(address_space &space, int cas, offs_t offset, uint8_t data)
+void dmv_state::program_write(int cas, offs_t offset, uint8_t data)
{
bool tramd = false;
dmvcart_slot_device *slots[] = { m_slot2, m_slot2a, m_slot3, m_slot4, m_slot5, m_slot6, m_slot7, m_slot7a };
@@ -535,7 +533,7 @@ void dmv_state::program_write(address_space &space, int cas, offs_t offset, uint
}
}
-uint8_t dmv_state::program_read(address_space &space, int cas, offs_t offset)
+uint8_t dmv_state::program_read(int cas, offs_t offset)
{
uint8_t data = 0xff;
if (m_ramoutdis && offset < 0x2000)
@@ -775,37 +773,38 @@ static void dmv_slot7a(device_slot_interface &device)
device.option_add("k235", DMV_K235); // K235 Internal 8088 module with interrupt controller
}
-MACHINE_CONFIG_START(dmv_state::dmv)
+void dmv_state::dmv(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu",Z80, XTAL(24'000'000) / 6)
- MCFG_DEVICE_PROGRAM_MAP(dmv_mem)
- MCFG_DEVICE_IO_MAP(dmv_io)
+ Z80(config, m_maincpu, XTAL(24'000'000) / 6);
+ m_maincpu->set_addrmap(AS_PROGRAM, &dmv_state::dmv_mem);
+ m_maincpu->set_addrmap(AS_IO, &dmv_state::dmv_io);
i8741_device &kbmcu(I8741(config, "kb_ctrl_mcu", XTAL(6'000'000)));
kbmcu.p1_in_cb().set(FUNC(dmv_state::kb_mcu_port1_r)); // bit 0 data from kb
kbmcu.p1_out_cb().set(FUNC(dmv_state::kb_mcu_port1_w)); // bit 1 data to kb
kbmcu.p2_out_cb().set(FUNC(dmv_state::kb_mcu_port2_w));
- MCFG_QUANTUM_PERFECT_CPU("maincpu")
+ config.m_perfect_cpu_quantum = subtag("maincpu");
DMV_KEYBOARD(config, m_keyboard, 0);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(50)
- MCFG_SCREEN_UPDATE_DEVICE("upd7220", upd7220_device, screen_update)
- MCFG_SCREEN_SIZE(640, 400)
- MCFG_SCREEN_VISIBLE_AREA(0, 640-1, 0, 400-1)
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_refresh_hz(50);
+ m_screen->set_screen_update("upd7220", FUNC(upd7220_device::screen_update));
+ m_screen->set_size(640, 400);
+ m_screen->set_visarea(0, 640-1, 0, 400-1);
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_dmv)
+ GFXDECODE(config, "gfxdecode", m_palette, gfx_dmv);
PALETTE(config, m_palette, palette_device::RGB_3BIT);
config.set_default_layout(layout_dmv);
// devices
UPD7220(config, m_hgdc, XTAL(5'000'000)/2); // unk clock
m_hgdc->set_addrmap(0, &dmv_state::upd7220_map);
- m_hgdc->set_display_pixels_callback(FUNC(dmv_state::hgdc_display_pixels), this);
- m_hgdc->set_draw_text_callback(FUNC(dmv_state::hgdc_draw_text), this);
+ m_hgdc->set_display_pixels(FUNC(dmv_state::hgdc_display_pixels));
+ m_hgdc->set_draw_text(FUNC(dmv_state::hgdc_draw_text));
AM9517A(config, m_dmac, 4_MHz_XTAL);
m_dmac->out_hreq_callback().set(FUNC(dmv_state::dma_hrq_changed));
@@ -818,15 +817,15 @@ MACHINE_CONFIG_START(dmv_state::dmv)
m_dmac->out_iow_callback<1>().set_log("Write DMA CH2");
m_dmac->in_ior_callback<2>().set(m_hgdc, FUNC(upd7220_device::dack_r));
m_dmac->out_iow_callback<2>().set(m_hgdc, FUNC(upd7220_device::dack_w));
- m_dmac->in_ior_callback<3>().set(m_fdc, FUNC(i8272a_device::mdma_r));
- m_dmac->out_iow_callback<3>().set(m_fdc, FUNC(i8272a_device::mdma_w));
+ m_dmac->in_ior_callback<3>().set(m_fdc, FUNC(i8272a_device::dma_r));
+ m_dmac->out_iow_callback<3>().set(m_fdc, FUNC(i8272a_device::dma_w));
m_dmac->out_dack_callback<3>().set(FUNC(dmv_state::dmac_dack3));
I8272A(config, m_fdc, 8'000'000, true);
m_fdc->intrq_wr_callback().set(FUNC(dmv_state::fdc_irq));
m_fdc->drq_wr_callback().set(m_dmac, FUNC(am9517a_device::dreq3_w));
- MCFG_FLOPPY_DRIVE_ADD("i8272:0", dmv_floppies, "525dd", dmv_state::floppy_formats)
- MCFG_FLOPPY_DRIVE_ADD("i8272:1", dmv_floppies, "525dd", dmv_state::floppy_formats)
+ FLOPPY_CONNECTOR(config, "i8272:0", dmv_floppies, "525dd", dmv_state::floppy_formats);
+ FLOPPY_CONNECTOR(config, "i8272:1", dmv_floppies, "525dd", dmv_state::floppy_formats);
PIT8253(config, m_pit, 0);
m_pit->set_clk<0>(50);
@@ -836,54 +835,52 @@ MACHINE_CONFIG_START(dmv_state::dmv)
/* sound hardware */
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("speaker", SPEAKER_SOUND)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.50)
-
- MCFG_DEVICE_ADD("slot1", DMVCART_SLOT, 0)
- MCFG_DEVICE_SLOT_INTERFACE(dmv_slot1, nullptr, false)
- MCFG_DEVICE_ADD("slot2", DMVCART_SLOT, 0)
- MCFG_DEVICE_SLOT_INTERFACE(dmv_slot2_6, nullptr, false)
- MCFG_DMVCART_SLOT_OUT_INT_CB(WRITELINE(*this, dmv_state, busint2_w))
- MCFG_DMVCART_SLOT_OUT_IRQ_CB(WRITELINE(*this, dmv_state, irq2_w))
- MCFG_DEVICE_ADD("slot2a", DMVCART_SLOT, 0)
- MCFG_DEVICE_SLOT_INTERFACE(dmv_slot2a, nullptr, false)
- MCFG_DMVCART_SLOT_OUT_INT_CB(WRITELINE(*this, dmv_state, busint2a_w))
- MCFG_DMVCART_SLOT_OUT_IRQ_CB(WRITELINE(*this, dmv_state, irq2a_w))
- MCFG_DEVICE_ADD("slot3", DMVCART_SLOT, 0)
- MCFG_DEVICE_SLOT_INTERFACE(dmv_slot2_6, nullptr, false)
- MCFG_DMVCART_SLOT_OUT_INT_CB(WRITELINE(*this, dmv_state, busint3_w))
- MCFG_DMVCART_SLOT_OUT_IRQ_CB(WRITELINE(*this, dmv_state, irq3_w))
- MCFG_DEVICE_ADD("slot4", DMVCART_SLOT, 0)
- MCFG_DEVICE_SLOT_INTERFACE(dmv_slot2_6, nullptr, false)
- MCFG_DMVCART_SLOT_OUT_INT_CB(WRITELINE(*this, dmv_state, busint4_w))
- MCFG_DMVCART_SLOT_OUT_IRQ_CB(WRITELINE(*this, dmv_state, irq4_w))
- MCFG_DEVICE_ADD("slot5", DMVCART_SLOT, 0)
- MCFG_DEVICE_SLOT_INTERFACE(dmv_slot2_6, nullptr, false)
- MCFG_DMVCART_SLOT_OUT_INT_CB(WRITELINE(*this, dmv_state, busint5_w))
- MCFG_DMVCART_SLOT_OUT_IRQ_CB(WRITELINE(*this, dmv_state, irq5_w))
- MCFG_DEVICE_ADD("slot6", DMVCART_SLOT, 0)
- MCFG_DEVICE_SLOT_INTERFACE(dmv_slot2_6, nullptr, false)
- MCFG_DMVCART_SLOT_OUT_INT_CB(WRITELINE(*this, dmv_state, busint6_w))
- MCFG_DMVCART_SLOT_OUT_IRQ_CB(WRITELINE(*this, dmv_state, irq6_w))
-
- MCFG_DEVICE_ADD("slot7", DMVCART_SLOT, 0)
- MCFG_DEVICE_SLOT_INTERFACE(dmv_slot7, nullptr, false)
- MCFG_DMVCART_SLOT_PROGRAM_READWRITE_CB(READ8(*this, dmv_state, exp_program_r), WRITE8(*this, dmv_state, exp_program_w))
- MCFG_DMVCART_SLOT_OUT_THOLD_CB(WRITELINE(*this, dmv_state, thold7_w))
- MCFG_DMVCART_SLOT_OUT_INT_CB(WRITELINE(*this, dmv_state, busint7_w))
- MCFG_DMVCART_SLOT_OUT_IRQ_CB(WRITELINE(*this, dmv_state, irq7_w))
- MCFG_DEVICE_ADD("slot7a", DMVCART_SLOT, 0)
- MCFG_DEVICE_SLOT_INTERFACE(dmv_slot7a, "k230", false)
- MCFG_DMVCART_SLOT_PROGRAM_READWRITE_CB(READ8(*this, dmv_state, exp_program_r), WRITE8(*this, dmv_state, exp_program_w))
- MCFG_DMVCART_SLOT_OUT_THOLD_CB(WRITELINE(*this, dmv_state, thold7_w))
- MCFG_DMVCART_SLOT_OUT_INT_CB(WRITELINE(*this, dmv_state, busint7a_w))
- MCFG_DMVCART_SLOT_OUT_IRQ_CB(WRITELINE(*this, dmv_state, irq7a_w))
-
- MCFG_SOFTWARE_LIST_ADD("flop_list", "dmv")
-
- MCFG_QUICKLOAD_ADD("quickload", dmv_state, dmv, "com,cpm", 3)
-
-MACHINE_CONFIG_END
+ SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.50);
+
+ DMVCART_SLOT(config, m_slot1, dmv_slot1, nullptr);
+ DMVCART_SLOT(config, m_slot2, dmv_slot2_6, nullptr);
+ m_slot2->out_int().set(FUNC(dmv_state::busint2_w));
+ m_slot2->out_irq().set(FUNC(dmv_state::irq2_w));
+ DMVCART_SLOT(config, m_slot2a, dmv_slot2a, nullptr);
+ m_slot2a->out_int().set(FUNC(dmv_state::busint2a_w));
+ m_slot2a->out_irq().set(FUNC(dmv_state::irq2a_w));
+ DMVCART_SLOT(config, m_slot3, dmv_slot2_6, nullptr);
+ m_slot3->out_int().set(FUNC(dmv_state::busint3_w));
+ m_slot3->out_irq().set(FUNC(dmv_state::irq3_w));
+ DMVCART_SLOT(config, m_slot4, dmv_slot2_6, nullptr);
+ m_slot4->out_int().set(FUNC(dmv_state::busint4_w));
+ m_slot4->out_irq().set(FUNC(dmv_state::irq4_w));
+ DMVCART_SLOT(config, m_slot5, dmv_slot2_6, nullptr);
+ m_slot5->out_int().set(FUNC(dmv_state::busint5_w));
+ m_slot5->out_irq().set(FUNC(dmv_state::irq5_w));
+ DMVCART_SLOT(config, m_slot6, dmv_slot2_6, nullptr);
+ m_slot6->out_int().set(FUNC(dmv_state::busint6_w));
+ m_slot6->out_irq().set(FUNC(dmv_state::irq6_w));
+
+ DMVCART_SLOT(config, m_slot7, dmv_slot7, nullptr);
+ m_slot7->prog_read().set(FUNC(dmv_state::exp_program_r));
+ m_slot7->prog_write().set(FUNC(dmv_state::exp_program_w));
+ m_slot7->out_thold().set(FUNC(dmv_state::thold7_w));
+ m_slot7->out_int().set(FUNC(dmv_state::busint7_w));
+ m_slot7->out_irq().set(FUNC(dmv_state::irq7_w));
+ DMVCART_SLOT(config, m_slot7a, dmv_slot7a, "k230");
+ m_slot7a->prog_read().set(FUNC(dmv_state::exp_program_r));
+ m_slot7a->prog_write().set(FUNC(dmv_state::exp_program_w));
+ m_slot7a->out_thold().set(FUNC(dmv_state::thold7_w));
+ m_slot7a->out_int().set(FUNC(dmv_state::busint7a_w));
+ m_slot7a->out_irq().set(FUNC(dmv_state::irq7a_w));
+
+ for (auto &slot : { m_slot1, m_slot2, m_slot2a, m_slot3, m_slot4, m_slot5, m_slot6, m_slot7, m_slot7a })
+ {
+ slot->set_memspace(m_maincpu, AS_PROGRAM);
+ slot->set_iospace(m_maincpu, AS_IO);
+ }
+
+ SOFTWARE_LIST(config, "flop_list").set_original("dmv");
+
+ quickload_image_device &quickload(QUICKLOAD(config, "quickload"));
+ quickload.set_handler(snapquick_load_delegate(&QUICKLOAD_LOAD_NAME(dmv_state, dmv), this), "com,cpm", attotime::from_seconds(3));
+}
/* ROM definition */
ROM_START( dmv )
diff --git a/src/mame/drivers/docastle.cpp b/src/mame/drivers/docastle.cpp
index 567663b9d05..d90b12bf812 100644
--- a/src/mame/drivers/docastle.cpp
+++ b/src/mame/drivers/docastle.cpp
@@ -240,10 +240,10 @@ void docastle_state::docastle_map2(address_map &map)
map(0x8000, 0x87ff).ram();
map(0xa000, 0xa008).rw(FUNC(docastle_state::docastle_shared1_r), FUNC(docastle_state::docastle_shared0_w));
map(0xc000, 0xc007).select(0x0080).rw(FUNC(docastle_state::inputs_flipscreen_r), FUNC(docastle_state::flipscreen_w));
- map(0xe000, 0xe000).w("sn1", FUNC(sn76489a_device::command_w));
- map(0xe400, 0xe400).w("sn2", FUNC(sn76489a_device::command_w));
- map(0xe800, 0xe800).w("sn3", FUNC(sn76489a_device::command_w));
- map(0xec00, 0xec00).w("sn4", FUNC(sn76489a_device::command_w));
+ map(0xe000, 0xe000).w("sn1", FUNC(sn76489a_device::write));
+ map(0xe400, 0xe400).w("sn2", FUNC(sn76489a_device::write));
+ map(0xe800, 0xe800).w("sn3", FUNC(sn76489a_device::write));
+ map(0xec00, 0xec00).w("sn4", FUNC(sn76489a_device::write));
}
void docastle_state::docastle_map3(address_map &map)
@@ -280,10 +280,10 @@ void docastle_state::dorunrun_map2(address_map &map)
{
map(0x0000, 0x3fff).rom();
map(0x8000, 0x87ff).ram();
- map(0xa000, 0xa000).w("sn1", FUNC(sn76489a_device::command_w));
- map(0xa400, 0xa400).w("sn2", FUNC(sn76489a_device::command_w));
- map(0xa800, 0xa800).w("sn3", FUNC(sn76489a_device::command_w));
- map(0xac00, 0xac00).w("sn4", FUNC(sn76489a_device::command_w));
+ map(0xa000, 0xa000).w("sn1", FUNC(sn76489a_device::write));
+ map(0xa400, 0xa400).w("sn2", FUNC(sn76489a_device::write));
+ map(0xa800, 0xa800).w("sn3", FUNC(sn76489a_device::write));
+ map(0xac00, 0xac00).w("sn4", FUNC(sn76489a_device::write));
map(0xc000, 0xc007).select(0x0080).rw(FUNC(docastle_state::inputs_flipscreen_r), FUNC(docastle_state::flipscreen_w));
map(0xe000, 0xe008).rw(FUNC(docastle_state::docastle_shared1_r), FUNC(docastle_state::docastle_shared0_w));
}
@@ -580,18 +580,18 @@ void docastle_state::machine_start()
save_item(NAME(m_buffer1));
}
-MACHINE_CONFIG_START(docastle_state::docastle)
-
+void docastle_state::docastle(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, XTAL(4'000'000))
- MCFG_DEVICE_PROGRAM_MAP(docastle_map)
- MCFG_DEVICE_IO_MAP(docastle_io_map)
+ Z80(config, m_maincpu, XTAL(4'000'000));
+ m_maincpu->set_addrmap(AS_PROGRAM, &docastle_state::docastle_map);
+ m_maincpu->set_addrmap(AS_IO, &docastle_state::docastle_io_map);
- MCFG_DEVICE_ADD("slave", Z80, XTAL(4'000'000))
- MCFG_DEVICE_PROGRAM_MAP(docastle_map2)
+ Z80(config, m_slave, XTAL(4'000'000));
+ m_slave->set_addrmap(AS_PROGRAM, &docastle_state::docastle_map2);
- MCFG_DEVICE_ADD("cpu3", Z80, XTAL(4'000'000))
- MCFG_DEVICE_PROGRAM_MAP(docastle_map3)
+ Z80(config, m_cpu3, XTAL(4'000'000));
+ m_cpu3->set_addrmap(AS_PROGRAM, &docastle_state::docastle_map3);
TMS1025(config, m_inp[0]);
m_inp[0]->read_port1_callback().set_ioport("DSW2");
@@ -625,10 +625,10 @@ MACHINE_CONFIG_START(docastle_state::docastle)
m_crtc->out_vsync_callback().append_inputline(m_cpu3, INPUT_LINE_NMI);
m_crtc->out_hsync_callback().set(FUNC(docastle_state::docastle_tint));
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_RAW_PARAMS(XTAL(9'828'000)/2, 0x138, 8, 0x100-8, 0x108, 0, 0xc0) // from CRTC
- MCFG_SCREEN_UPDATE_DRIVER(docastle_state, screen_update_docastle)
- MCFG_SCREEN_PALETTE(m_palette)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_raw(XTAL(9'828'000)/2, 0x138, 8, 0x100-8, 0x108, 0, 0xc0); // from CRTC
+ screen.set_screen_update(FUNC(docastle_state::screen_update_docastle));
+ screen.set_palette(m_palette);
GFXDECODE(config, m_gfxdecode, m_palette, gfx_docastle);
PALETTE(config, m_palette, FUNC(docastle_state::docastle_palette), 512);
@@ -640,28 +640,26 @@ MACHINE_CONFIG_START(docastle_state::docastle)
SN76489A(config, "sn2", 4_MHz_XTAL).add_route(ALL_OUTPUTS, "mono", 0.25);
SN76489A(config, "sn3", 4_MHz_XTAL).add_route(ALL_OUTPUTS, "mono", 0.25);
SN76489A(config, "sn4", 4_MHz_XTAL).add_route(ALL_OUTPUTS, "mono", 0.25);
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(docastle_state::dorunrun)
+void docastle_state::dorunrun(machine_config &config)
+{
docastle(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(dorunrun_map)
-
- MCFG_DEVICE_MODIFY("slave")
- MCFG_DEVICE_PROGRAM_MAP(dorunrun_map2)
+ m_maincpu->set_addrmap(AS_PROGRAM, &docastle_state::dorunrun_map);
+ m_slave->set_addrmap(AS_PROGRAM, &docastle_state::dorunrun_map2);
/* video hardware */
MCFG_VIDEO_START_OVERRIDE(docastle_state,dorunrun)
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(docastle_state::idsoccer)
+void docastle_state::idsoccer(machine_config &config)
+{
docastle(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(idsoccer_map)
+ m_maincpu->set_addrmap(AS_PROGRAM, &docastle_state::idsoccer_map);
m_inp[0]->read_port4_callback().set_ioport("JOYS_RIGHT");
m_inp[1]->read_port4_callback().set_ioport("JOYS_RIGHT").rshift(4);
@@ -670,11 +668,11 @@ MACHINE_CONFIG_START(docastle_state::idsoccer)
MCFG_VIDEO_START_OVERRIDE(docastle_state,dorunrun)
/* sound hardware */
- MCFG_DEVICE_ADD("msm", MSM5205, XTAL(384'000)) // Crystal verified on American Soccer board.
- MCFG_MSM5205_VCLK_CB(WRITELINE(*this, docastle_state, idsoccer_adpcm_int)) // interrupt function
- MCFG_MSM5205_PRESCALER_SELECTOR(S64_4B) // 6 kHz ???
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.40)
-MACHINE_CONFIG_END
+ MSM5205(config, m_msm, XTAL(384'000)); // Crystal verified on American Soccer board.
+ m_msm->vck_legacy_callback().set(FUNC(docastle_state::idsoccer_adpcm_int)); // interrupt function
+ m_msm->set_prescaler_selector(msm5205_device::S64_4B); // 6 kHz ???
+ m_msm->add_route(ALL_OUTPUTS, "mono", 0.40);
+}
/* ROMs */
diff --git a/src/mame/drivers/dogfgt.cpp b/src/mame/drivers/dogfgt.cpp
index c588d603b85..b419707cf60 100644
--- a/src/mame/drivers/dogfgt.cpp
+++ b/src/mame/drivers/dogfgt.cpp
@@ -37,11 +37,11 @@ WRITE8_MEMBER(dogfgt_state::soundcontrol_w)
{
/* bit 5 goes to 8910 #0 BDIR pin */
if ((m_last_snd_ctrl & 0x20) == 0x20 && (data & 0x20) == 0x00)
- m_ay[0]->data_address_w(space, m_last_snd_ctrl >> 4, m_soundlatch);
+ m_ay[0]->data_address_w(m_last_snd_ctrl >> 4, m_soundlatch);
/* bit 7 goes to 8910 #1 BDIR pin */
if ((m_last_snd_ctrl & 0x80) == 0x80 && (data & 0x80) == 0x00)
- m_ay[1]->data_address_w(space, m_last_snd_ctrl >> 6, m_soundlatch);
+ m_ay[1]->data_address_w(m_last_snd_ctrl >> 6, m_soundlatch);
m_last_snd_ctrl = data;
}
@@ -227,26 +227,26 @@ void dogfgt_state::machine_reset()
}
-MACHINE_CONFIG_START(dogfgt_state::dogfgt)
-
+void dogfgt_state::dogfgt(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD(m_maincpu, M6502, 1500000) /* 1.5 MHz ???? */
- MCFG_DEVICE_PROGRAM_MAP(main_map)
- MCFG_DEVICE_PERIODIC_INT_DRIVER(dogfgt_state, irq0_line_hold, 16*60) /* ? controls music tempo */
+ M6502(config, m_maincpu, 1500000); /* 1.5 MHz ???? */
+ m_maincpu->set_addrmap(AS_PROGRAM, &dogfgt_state::main_map);
+ m_maincpu->set_periodic_int(FUNC(dogfgt_state::irq0_line_hold), attotime::from_hz(16*60)); /* ? controls music tempo */
- MCFG_DEVICE_ADD(m_subcpu, M6502, 1500000) /* 1.5 MHz ???? */
- MCFG_DEVICE_PROGRAM_MAP(sub_map)
+ M6502(config, m_subcpu, 1500000); /* 1.5 MHz ???? */
+ m_subcpu->set_addrmap(AS_PROGRAM, &dogfgt_state::sub_map);
- MCFG_QUANTUM_TIME(attotime::from_hz(6000))
+ config.m_minimum_quantum = attotime::from_hz(6000);
/* video hardware */
- MCFG_SCREEN_ADD(m_screen, RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */)
- MCFG_SCREEN_SIZE(32*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 1*8, 31*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(dogfgt_state, screen_update)
- MCFG_SCREEN_PALETTE(m_palette)
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_refresh_hz(60);
+ m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(2500) /* not accurate */);
+ m_screen->set_size(32*8, 32*8);
+ m_screen->set_visarea(0*8, 32*8-1, 1*8, 31*8-1);
+ m_screen->set_screen_update(FUNC(dogfgt_state::screen_update));
+ m_screen->set_palette(m_palette);
GFXDECODE(config, m_gfxdecode, m_palette, gfx_dogfgt);
PALETTE(config, m_palette, FUNC(dogfgt_state::dogfgt_palette)).set_format(palette_device::BGR_233, 16 + 64);
@@ -256,7 +256,7 @@ MACHINE_CONFIG_START(dogfgt_state::dogfgt)
AY8910(config, m_ay[0], 1500000).add_route(ALL_OUTPUTS, "mono", 0.30);
AY8910(config, m_ay[1], 1500000).add_route(ALL_OUTPUTS, "mono", 0.30);
-MACHINE_CONFIG_END
+}
diff --git a/src/mame/drivers/dominob.cpp b/src/mame/drivers/dominob.cpp
index 913b7da384e..3daa7ceede5 100644
--- a/src/mame/drivers/dominob.cpp
+++ b/src/mame/drivers/dominob.cpp
@@ -302,22 +302,22 @@ static GFXDECODE_START( gfx_dominob )
GFXDECODE_END
-MACHINE_CONFIG_START(dominob_state::dominob)
-
+void dominob_state::dominob(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80,XTAL(12'000'000)/2)
- MCFG_DEVICE_PROGRAM_MAP(memmap)
- MCFG_DEVICE_IO_MAP(portmap)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", dominob_state, irq0_line_hold)
+ Z80(config, m_maincpu, XTAL(12'000'000)/2);
+ m_maincpu->set_addrmap(AS_PROGRAM, &dominob_state::memmap);
+ m_maincpu->set_addrmap(AS_IO, &dominob_state::portmap);
+ m_maincpu->set_vblank_int("screen", FUNC(dominob_state::irq0_line_hold));
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(59.1524)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(32*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 32*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(dominob_state, screen_update_dominob)
- MCFG_SCREEN_PALETTE(m_palette)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(59.1524);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(32*8, 32*8);
+ screen.set_visarea(0*8, 32*8-1, 2*8, 32*8-1);
+ screen.set_screen_update(FUNC(dominob_state::screen_update_dominob));
+ screen.set_palette(m_palette);
GFXDECODE(config, m_gfxdecode, m_palette, gfx_dominob);
PALETTE(config, m_palette).set_format(palette_device::xRGB_444, 512);
@@ -327,7 +327,7 @@ MACHINE_CONFIG_START(dominob_state::dominob)
ym2149_device &aysnd(YM2149(config, "aysnd", XTAL(12'000'000)/4));
aysnd.port_b_read_callback().set_ioport("DSW");
aysnd.add_route(ALL_OUTPUTS, "mono", 0.30);
-MACHINE_CONFIG_END
+}
/***************************************************************************
diff --git a/src/mame/drivers/dooyong.cpp b/src/mame/drivers/dooyong.cpp
index d3545a18b82..64acce48ce0 100644
--- a/src/mame/drivers/dooyong.cpp
+++ b/src/mame/drivers/dooyong.cpp
@@ -1428,9 +1428,9 @@ READ8_MEMBER(dooyong_z80_ym2203_state::unk_r)
***************************************************************************/
-MACHINE_CONFIG_START(dooyong_z80_ym2203_state::sound_2203)
- MCFG_INPUT_MERGER_ANY_HIGH("soundirq")
- MCFG_INPUT_MERGER_OUTPUT_HANDLER(INPUTLINE("audiocpu", 0))
+void dooyong_z80_ym2203_state::sound_2203(machine_config &config)
+{
+ INPUT_MERGER_ANY_HIGH(config, "soundirq").output_handler().set_inputline(m_audiocpu, 0);
SPEAKER(config, "mono").front_center();
@@ -1445,9 +1445,10 @@ MACHINE_CONFIG_START(dooyong_z80_ym2203_state::sound_2203)
ym2.irq_handler().set("soundirq", FUNC(input_merger_any_high_device::in_w<1>));
ym2.port_a_read_callback().set(FUNC(dooyong_z80_ym2203_state::unk_r));
ym2.add_route(ALL_OUTPUTS, "mono", 0.40);
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(dooyong_z80_state::sound_2151)
+void dooyong_z80_state::sound_2151(machine_config &config)
+{
SPEAKER(config, "mono").front_center();
GENERIC_LATCH_8(config, "soundlatch");
@@ -1457,11 +1458,11 @@ MACHINE_CONFIG_START(dooyong_z80_state::sound_2151)
ymsnd.add_route(0, "mono", 0.50);
ymsnd.add_route(1, "mono", 0.50);
- MCFG_DEVICE_ADD("oki", OKIM6295, 1_MHz_XTAL, okim6295_device::PIN7_HIGH)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.60)
-MACHINE_CONFIG_END
+ OKIM6295(config, "oki", 1_MHz_XTAL, okim6295_device::PIN7_HIGH).add_route(ALL_OUTPUTS, "mono", 0.60);
+}
-MACHINE_CONFIG_START(dooyong_state::sound_2151_4mhz)
+void dooyong_state::sound_2151_4mhz(machine_config &config)
+{
SPEAKER(config, "mono").front_center();
GENERIC_LATCH_8(config, "soundlatch");
@@ -1471,33 +1472,32 @@ MACHINE_CONFIG_START(dooyong_state::sound_2151_4mhz)
ymsnd.add_route(0, "mono", 0.50);
ymsnd.add_route(1, "mono", 0.50);
- MCFG_DEVICE_ADD("oki", OKIM6295, 16_MHz_XTAL/16, okim6295_device::PIN7_HIGH) /* 1MHz (16MHz/16 for most, 8Mhz/8 for Super-X) */
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.60)
-MACHINE_CONFIG_END
-
-MACHINE_CONFIG_START(dooyong_z80_ym2203_state::lastday)
+ OKIM6295(config, "oki", 16_MHz_XTAL/16, okim6295_device::PIN7_HIGH).add_route(ALL_OUTPUTS, "mono", 0.60); /* 1MHz (16MHz/16 for most, 8Mhz/8 for Super-X) */
+}
+void dooyong_z80_ym2203_state::lastday(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, 16_MHz_XTAL/2) /* 8MHz verified for Last Day / D-day */
- MCFG_DEVICE_PROGRAM_MAP(lastday_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", dooyong_state, irq0_line_hold)
+ Z80(config, m_maincpu, 16_MHz_XTAL/2); /* 8MHz verified for Last Day / D-day */
+ m_maincpu->set_addrmap(AS_PROGRAM, &dooyong_z80_ym2203_state::lastday_map);
+ m_maincpu->set_vblank_int("screen", FUNC(dooyong_state::irq0_line_hold));
- MCFG_DEVICE_ADD("audiocpu", Z80, 16_MHz_XTAL/4) /* 4MHz verified for Last Day / D-day */
- MCFG_DEVICE_PROGRAM_MAP(lastday_sound_map)
+ Z80(config, m_audiocpu, 16_MHz_XTAL/4); /* 4MHz verified for Last Day / D-day */
+ m_audiocpu->set_addrmap(AS_PROGRAM, &dooyong_z80_ym2203_state::lastday_sound_map);
MCFG_MACHINE_START_OVERRIDE(dooyong_z80_ym2203_state, cpu_z80)
/* video hardware */
- MCFG_DEVICE_ADD(m_spriteram, BUFFERED_SPRITERAM8)
+ BUFFERED_SPRITERAM8(config, m_spriteram);
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */)
- MCFG_SCREEN_SIZE(64*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(8*8, (64-8)*8-1, 1*8, 31*8-1 )
- MCFG_SCREEN_UPDATE_DRIVER(dooyong_z80_ym2203_state, screen_update_lastday)
- MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE(m_spriteram, buffered_spriteram8_device, vblank_copy_rising))
- MCFG_SCREEN_PALETTE(m_palette)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500) /* not accurate */);
+ screen.set_size(64*8, 32*8);
+ screen.set_visarea(8*8, (64-8)*8-1, 1*8, 31*8-1 );
+ screen.set_screen_update(FUNC(dooyong_z80_ym2203_state::screen_update_lastday));
+ screen.screen_vblank().set(m_spriteram, FUNC(buffered_spriteram8_device::vblank_copy_rising));
+ screen.set_palette(m_palette);
GFXDECODE(config, m_gfxdecode, m_palette, gfx_lastday);
PALETTE(config, m_palette).set_format(palette_device::xBGR_444, 1024);
@@ -1509,8 +1509,7 @@ MACHINE_CONFIG_START(dooyong_z80_ym2203_state::lastday)
MCFG_VIDEO_START_OVERRIDE(dooyong_z80_ym2203_state, lastday)
/* sound hardware */
- MCFG_INPUT_MERGER_ANY_HIGH("soundirq")
- MCFG_INPUT_MERGER_OUTPUT_HANDLER(INPUTLINE("audiocpu", 0))
+ INPUT_MERGER_ANY_HIGH(config, "soundirq").output_handler().set_inputline(m_audiocpu, 0);
SPEAKER(config, "mono").front_center();
@@ -1525,31 +1524,31 @@ MACHINE_CONFIG_START(dooyong_z80_ym2203_state::lastday)
ym2.irq_handler().set("soundirq", FUNC(input_merger_any_high_device::in_w<1>));
ym2.port_a_read_callback().set(FUNC(dooyong_z80_ym2203_state::unk_r));
ym2.add_route(ALL_OUTPUTS, "mono", 0.40);
-MACHINE_CONFIG_END
-
-MACHINE_CONFIG_START(dooyong_z80_ym2203_state::gulfstrm)
+}
+void dooyong_z80_ym2203_state::gulfstrm(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, 8000000) /* ??? */
- MCFG_DEVICE_PROGRAM_MAP(gulfstrm_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", dooyong_state, irq0_line_hold)
+ Z80(config, m_maincpu, 8000000); /* ??? */
+ m_maincpu->set_addrmap(AS_PROGRAM, &dooyong_z80_ym2203_state::gulfstrm_map);
+ m_maincpu->set_vblank_int("screen", FUNC(dooyong_state::irq0_line_hold));
- MCFG_DEVICE_ADD("audiocpu", Z80, 8000000) /* ??? */
- MCFG_DEVICE_PROGRAM_MAP(lastday_sound_map)
+ Z80(config, m_audiocpu, 8000000); /* ??? */
+ m_audiocpu->set_addrmap(AS_PROGRAM, &dooyong_z80_ym2203_state::lastday_sound_map);
MCFG_MACHINE_START_OVERRIDE(dooyong_z80_ym2203_state, cpu_z80)
/* video hardware */
- MCFG_DEVICE_ADD(m_spriteram, BUFFERED_SPRITERAM8)
+ BUFFERED_SPRITERAM8(config, m_spriteram);
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */)
- MCFG_SCREEN_SIZE(64*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(8*8, (64-8)*8-1, 1*8, 31*8-1 )
- MCFG_SCREEN_UPDATE_DRIVER(dooyong_z80_ym2203_state, screen_update_gulfstrm)
- MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE(m_spriteram, buffered_spriteram8_device, vblank_copy_rising))
- MCFG_SCREEN_PALETTE(m_palette)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500) /* not accurate */);
+ screen.set_size(64*8, 32*8);
+ screen.set_visarea(8*8, (64-8)*8-1, 1*8, 31*8-1 );
+ screen.set_screen_update(FUNC(dooyong_z80_ym2203_state::screen_update_gulfstrm));
+ screen.screen_vblank().set(m_spriteram, FUNC(buffered_spriteram8_device::vblank_copy_rising));
+ screen.set_palette(m_palette);
GFXDECODE(config, m_gfxdecode, m_palette, gfx_lastday);
PALETTE(config, m_palette).set_format(palette_device::xRGB_555, 1024);
@@ -1562,31 +1561,31 @@ MACHINE_CONFIG_START(dooyong_z80_ym2203_state::gulfstrm)
/* sound hardware */
sound_2203(config); /* 3.579545MHz */
-MACHINE_CONFIG_END
-
-MACHINE_CONFIG_START(dooyong_z80_ym2203_state::pollux)
+}
+void dooyong_z80_ym2203_state::pollux(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, 16_MHz_XTAL/2) /* 8Mhz */
- MCFG_DEVICE_PROGRAM_MAP(pollux_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", dooyong_state, irq0_line_hold)
+ Z80(config, m_maincpu, 16_MHz_XTAL/2); /* 8Mhz */
+ m_maincpu->set_addrmap(AS_PROGRAM, &dooyong_z80_ym2203_state::pollux_map);
+ m_maincpu->set_vblank_int("screen", FUNC(dooyong_state::irq0_line_hold));
- MCFG_DEVICE_ADD("audiocpu", Z80, 16_MHz_XTAL/4) /* 4Mhz */
- MCFG_DEVICE_PROGRAM_MAP(pollux_sound_map)
+ Z80(config, m_audiocpu, 16_MHz_XTAL/4); /* 4Mhz */
+ m_audiocpu->set_addrmap(AS_PROGRAM, &dooyong_z80_ym2203_state::pollux_sound_map);
MCFG_MACHINE_START_OVERRIDE(dooyong_z80_ym2203_state, cpu_z80)
/* video hardware */
- MCFG_DEVICE_ADD(m_spriteram, BUFFERED_SPRITERAM8)
+ BUFFERED_SPRITERAM8(config, m_spriteram);
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */)
- MCFG_SCREEN_SIZE(64*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(8*8, (64-8)*8-1, 1*8, 31*8-1 )
- MCFG_SCREEN_UPDATE_DRIVER(dooyong_z80_ym2203_state, screen_update_pollux)
- MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE(m_spriteram, buffered_spriteram8_device, vblank_copy_rising))
- MCFG_SCREEN_PALETTE(m_palette)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500) /* not accurate */);
+ screen.set_size(64*8, 32*8);
+ screen.set_visarea(8*8, (64-8)*8-1, 1*8, 31*8-1 );
+ screen.set_screen_update(FUNC(dooyong_z80_ym2203_state::screen_update_pollux));
+ screen.screen_vblank().set(m_spriteram, FUNC(buffered_spriteram8_device::vblank_copy_rising));
+ screen.set_palette(m_palette);
GFXDECODE(config, m_gfxdecode, m_palette, gfx_lastday);
PALETTE(config, m_palette).set_format(palette_device::xRGB_555, 1024*2);
@@ -1599,31 +1598,31 @@ MACHINE_CONFIG_START(dooyong_z80_ym2203_state::pollux)
/* sound hardware */
sound_2203(config); /* 3.579545MHz or 4Mhz ??? */
-MACHINE_CONFIG_END
-
-MACHINE_CONFIG_START(dooyong_z80_state::bluehawk)
+}
+void dooyong_z80_state::bluehawk(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, 8000000) /* ??? */
- MCFG_DEVICE_PROGRAM_MAP(bluehawk_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", dooyong_state, irq0_line_hold)
+ Z80(config, m_maincpu, 8000000); /* ??? */
+ m_maincpu->set_addrmap(AS_PROGRAM, &dooyong_z80_state::bluehawk_map);
+ m_maincpu->set_vblank_int("screen", FUNC(dooyong_state::irq0_line_hold));
- MCFG_DEVICE_ADD("audiocpu", Z80, 4000000) /* ??? */
- MCFG_DEVICE_PROGRAM_MAP(bluehawk_sound_map)
+ Z80(config, m_audiocpu, 4000000); /* ??? */
+ m_audiocpu->set_addrmap(AS_PROGRAM, &dooyong_z80_state::bluehawk_sound_map);
MCFG_MACHINE_START_OVERRIDE(dooyong_z80_state, cpu_z80)
/* video hardware */
- MCFG_DEVICE_ADD(m_spriteram, BUFFERED_SPRITERAM8)
+ BUFFERED_SPRITERAM8(config, m_spriteram);
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */)
- MCFG_SCREEN_SIZE(64*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(8*8, (64-8)*8-1, 1*8, 31*8-1 )
- MCFG_SCREEN_UPDATE_DRIVER(dooyong_z80_state, screen_update_bluehawk)
- MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE(m_spriteram, buffered_spriteram8_device, vblank_copy_rising))
- MCFG_SCREEN_PALETTE(m_palette)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500) /* not accurate */);
+ screen.set_size(64*8, 32*8);
+ screen.set_visarea(8*8, (64-8)*8-1, 1*8, 31*8-1 );
+ screen.set_screen_update(FUNC(dooyong_z80_state::screen_update_bluehawk));
+ screen.screen_vblank().set(m_spriteram, FUNC(buffered_spriteram8_device::vblank_copy_rising));
+ screen.set_palette(m_palette);
GFXDECODE(config, m_gfxdecode, m_palette, gfx_bluehawk);
PALETTE(config, m_palette).set_format(palette_device::xRGB_555, 1024);
@@ -1638,31 +1637,31 @@ MACHINE_CONFIG_START(dooyong_z80_state::bluehawk)
/* sound hardware */
sound_2151(config); /* 3.579545MHz or 4Mhz ??? */
-MACHINE_CONFIG_END
-
-MACHINE_CONFIG_START(dooyong_z80_state::flytiger)
+}
+void dooyong_z80_state::flytiger(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, 16_MHz_XTAL/2) /* 8MHz */
- MCFG_DEVICE_PROGRAM_MAP(flytiger_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", dooyong_state, irq0_line_hold)
+ Z80(config, m_maincpu, 16_MHz_XTAL/2); /* 8MHz */
+ m_maincpu->set_addrmap(AS_PROGRAM, &dooyong_z80_state::flytiger_map);
+ m_maincpu->set_vblank_int("screen", FUNC(dooyong_state::irq0_line_hold));
- MCFG_DEVICE_ADD("audiocpu", Z80, 16_MHz_XTAL/4) /* 4Mhz */
- MCFG_DEVICE_PROGRAM_MAP(bluehawk_sound_map)
+ Z80(config, m_audiocpu, 16_MHz_XTAL/4); /* 4Mhz */
+ m_audiocpu->set_addrmap(AS_PROGRAM, &dooyong_z80_state::bluehawk_sound_map);
MCFG_MACHINE_START_OVERRIDE(dooyong_z80_state, cpu_z80)
/* video hardware */
- MCFG_DEVICE_ADD(m_spriteram, BUFFERED_SPRITERAM8)
+ BUFFERED_SPRITERAM8(config, m_spriteram);
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */)
- MCFG_SCREEN_SIZE(64*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(8*8, (64-8)*8-1, 1*8, 31*8-1 )
- MCFG_SCREEN_UPDATE_DRIVER(dooyong_z80_state, screen_update_flytiger)
- MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE(m_spriteram, buffered_spriteram8_device, vblank_copy_rising))
- MCFG_SCREEN_PALETTE(m_palette)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500) /* not accurate */);
+ screen.set_size(64*8, 32*8);
+ screen.set_visarea(8*8, (64-8)*8-1, 1*8, 31*8-1 );
+ screen.set_screen_update(FUNC(dooyong_z80_state::screen_update_flytiger));
+ screen.screen_vblank().set(m_spriteram, FUNC(buffered_spriteram8_device::vblank_copy_rising));
+ screen.set_palette(m_palette);
GFXDECODE(config, m_gfxdecode, m_palette, gfx_flytiger);
PALETTE(config, m_palette).set_format(palette_device::xRGB_555, 1024*2);
@@ -1676,28 +1675,28 @@ MACHINE_CONFIG_START(dooyong_z80_state::flytiger)
/* sound hardware */
sound_2151(config);
-MACHINE_CONFIG_END
-
-MACHINE_CONFIG_START(dooyong_z80_state::primella)
+}
+void dooyong_z80_state::primella(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, 16_MHz_XTAL/2) /* 8MHz */
- MCFG_DEVICE_PROGRAM_MAP(primella_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", dooyong_state, irq0_line_hold)
+ Z80(config, m_maincpu, 16_MHz_XTAL/2); /* 8MHz */
+ m_maincpu->set_addrmap(AS_PROGRAM, &dooyong_z80_state::primella_map);
+ m_maincpu->set_vblank_int("screen", FUNC(dooyong_state::irq0_line_hold));
- MCFG_DEVICE_ADD("audiocpu", Z80, 16_MHz_XTAL/4) /* 4MHz */
- MCFG_DEVICE_PROGRAM_MAP(bluehawk_sound_map)
+ Z80(config, m_audiocpu, 16_MHz_XTAL/4); /* 4MHz */
+ m_audiocpu->set_addrmap(AS_PROGRAM, &dooyong_z80_state::bluehawk_sound_map);
MCFG_MACHINE_START_OVERRIDE(dooyong_z80_state, cpu_z80)
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */)
- MCFG_SCREEN_SIZE(64*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(8*8, (64-8)*8-1, 0*8, 32*8-1 )
- MCFG_SCREEN_UPDATE_DRIVER(dooyong_z80_state, screen_update_primella)
- MCFG_SCREEN_PALETTE(m_palette)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500) /* not accurate */);
+ screen.set_size(64*8, 32*8);
+ screen.set_visarea(8*8, (64-8)*8-1, 0*8, 32*8-1 );
+ screen.set_screen_update(FUNC(dooyong_z80_state::screen_update_primella));
+ screen.set_palette(m_palette);
GFXDECODE(config, m_gfxdecode, m_palette, gfx_primella);
PALETTE(config, m_palette).set_format(palette_device::xRGB_555, 1024);
@@ -1712,7 +1711,7 @@ MACHINE_CONFIG_START(dooyong_z80_state::primella)
/* sound hardware */
sound_2151_4mhz(config); /* PCB has only 1 OSC at 16Mhz */
-MACHINE_CONFIG_END
+}
TIMER_DEVICE_CALLBACK_MEMBER(dooyong_68k_state::scanline)
@@ -1727,28 +1726,28 @@ TIMER_DEVICE_CALLBACK_MEMBER(dooyong_68k_state::scanline)
}
-MACHINE_CONFIG_START(rshark_state::dooyong_68k)
-
+void rshark_state::dooyong_68k(machine_config &config)
+{
// basic machine hardware
- MCFG_DEVICE_ADD("maincpu", M68000, 8_MHz_XTAL) // 8MHz measured on Super-X
- MCFG_TIMER_DRIVER_ADD_SCANLINE("scantimer", rshark_state, scanline, "screen", 0, 1)
+ M68000(config, m_maincpu, 8_MHz_XTAL); // 8MHz measured on Super-X
+ TIMER(config, "scantimer").configure_scanline(FUNC(rshark_state::scanline), "screen", 0, 1);
- MCFG_DEVICE_ADD("audiocpu", Z80, 8_MHz_XTAL/2) // 4MHz measured on Super-X
- MCFG_DEVICE_PROGRAM_MAP(bluehawk_sound_map)
+ Z80(config, m_audiocpu, 8_MHz_XTAL/2); // 4MHz measured on Super-X
+ m_audiocpu->set_addrmap(AS_PROGRAM, &rshark_state::bluehawk_sound_map);
// video hardware
- MCFG_DEVICE_ADD(m_spriteram, BUFFERED_SPRITERAM16)
-
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) // not accurate
- MCFG_SCREEN_SIZE(64*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(8*8, (64-8)*8-1, 1*8, 31*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(rshark_state, screen_update_rshark)
- MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE(m_spriteram, buffered_spriteram16_device, vblank_copy_rising))
- MCFG_SCREEN_PALETTE(m_palette)
-
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_rshark)
+ BUFFERED_SPRITERAM16(config, m_spriteram);
+
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500)); // not accurate
+ screen.set_size(64*8, 32*8);
+ screen.set_visarea(8*8, (64-8)*8-1, 1*8, 31*8-1);
+ screen.set_screen_update(FUNC(rshark_state::screen_update_rshark));
+ screen.screen_vblank().set(m_spriteram, FUNC(buffered_spriteram16_device::vblank_copy_rising));
+ screen.set_palette(m_palette);
+
+ GFXDECODE(config, m_gfxdecode, m_palette, gfx_rshark);
PALETTE(config, m_palette).set_format(palette_device::xRGB_555, 2048);
RSHARK_ROM_TILEMAP(config, m_bg[0], m_gfxdecode, 4, "gfx5", 0x00000, "gfx6", 0x60000);
@@ -1761,45 +1760,45 @@ MACHINE_CONFIG_START(rshark_state::dooyong_68k)
// sound hardware
sound_2151_4mhz(config);
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(rshark_state::rshark)
+void rshark_state::rshark(machine_config &config)
+{
dooyong_68k(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(rshark_map)
-MACHINE_CONFIG_END
+ m_maincpu->set_addrmap(AS_PROGRAM, &rshark_state::rshark_map);
+}
-MACHINE_CONFIG_START(rshark_state::superx)
+void rshark_state::superx(machine_config &config)
+{
dooyong_68k(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(superx_map)
-MACHINE_CONFIG_END
-
-MACHINE_CONFIG_START(popbingo_state::popbingo)
+ m_maincpu->set_addrmap(AS_PROGRAM, &rshark_state::superx_map);
+}
+void popbingo_state::popbingo(machine_config &config)
+{
// basic machine hardware
- MCFG_DEVICE_ADD("maincpu", M68000, 20_MHz_XTAL/2) // 10MHz measured
- MCFG_DEVICE_PROGRAM_MAP(popbingo_map)
- MCFG_TIMER_DRIVER_ADD_SCANLINE("scantimer", popbingo_state, scanline, "screen", 0, 1)
+ M68000(config, m_maincpu, 20_MHz_XTAL/2); // 10MHz measured
+ m_maincpu->set_addrmap(AS_PROGRAM, &popbingo_state::popbingo_map);
+ TIMER(config, "scantimer").configure_scanline(FUNC(popbingo_state::scanline), "screen", 0, 1);
- MCFG_DEVICE_ADD("audiocpu", Z80, 16_MHz_XTAL/4) // 4MHz measured
- MCFG_DEVICE_PROGRAM_MAP(bluehawk_sound_map)
+ Z80(config, m_audiocpu, 16_MHz_XTAL/4); // 4MHz measured
+ m_audiocpu->set_addrmap(AS_PROGRAM, &popbingo_state::bluehawk_sound_map);
// video hardware
- MCFG_DEVICE_ADD(m_spriteram, BUFFERED_SPRITERAM16)
-
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) // not accurate
- MCFG_SCREEN_SIZE(64*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(8*8, (64-8)*8-1, 1*8, 31*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(popbingo_state, screen_update_popbingo)
- MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE(m_spriteram, buffered_spriteram16_device, vblank_copy_rising))
- MCFG_SCREEN_PALETTE(m_palette)
-
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_popbingo)
+ BUFFERED_SPRITERAM16(config, m_spriteram);
+
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_refresh_hz(60);
+ m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(2500)); // not accurate
+ m_screen->set_size(64*8, 32*8);
+ m_screen->set_visarea(8*8, (64-8)*8-1, 1*8, 31*8-1);
+ m_screen->set_screen_update(FUNC(popbingo_state::screen_update_popbingo));
+ m_screen->screen_vblank().set(m_spriteram, FUNC(buffered_spriteram16_device::vblank_copy_rising));
+ m_screen->set_palette(m_palette);
+
+ GFXDECODE(config, m_gfxdecode, m_palette, gfx_popbingo);
PALETTE(config, m_palette).set_format(palette_device::xRGB_555, 2048);
DOOYONG_ROM_TILEMAP(config, m_bg[0], m_gfxdecode, 1, "gfx2", 0x00000);
@@ -1809,7 +1808,7 @@ MACHINE_CONFIG_START(popbingo_state::popbingo)
// sound hardware
sound_2151_4mhz(config);
-MACHINE_CONFIG_END
+}
} // anonymous namespace
diff --git a/src/mame/drivers/dorachan.cpp b/src/mame/drivers/dorachan.cpp
index a4c377f8cf2..9c08186054f 100644
--- a/src/mame/drivers/dorachan.cpp
+++ b/src/mame/drivers/dorachan.cpp
@@ -226,23 +226,23 @@ void dorachan_state::machine_reset()
m_prot_value = 0;
}
-MACHINE_CONFIG_START(dorachan_state::dorachan)
-
+void dorachan_state::dorachan(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, 2000000)
- MCFG_DEVICE_PROGRAM_MAP(dorachan_map)
- MCFG_DEVICE_IO_MAP(dorachan_io_map)
- MCFG_DEVICE_PERIODIC_INT_DRIVER(dorachan_state, irq0_line_hold, 2*60)
+ Z80(config, m_maincpu, 2000000);
+ m_maincpu->set_addrmap(AS_PROGRAM, &dorachan_state::dorachan_map);
+ m_maincpu->set_addrmap(AS_IO, &dorachan_state::dorachan_io_map);
+ m_maincpu->set_periodic_int(FUNC(dorachan_state::irq0_line_hold), attotime::from_hz(2*60));
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_SIZE(32*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 1*8, 31*8-1)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_UPDATE_DRIVER(dorachan_state, screen_update_dorachan)
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_size(32*8, 32*8);
+ m_screen->set_visarea(0*8, 32*8-1, 1*8, 31*8-1);
+ m_screen->set_refresh_hz(60);
+ m_screen->set_screen_update(FUNC(dorachan_state::screen_update_dorachan));
PALETTE(config, m_palette, palette_device::BGR_3BIT);
-MACHINE_CONFIG_END
+}
diff --git a/src/mame/drivers/dotrikun.cpp b/src/mame/drivers/dotrikun.cpp
index 0a224a121e5..0a379652e2c 100644
--- a/src/mame/drivers/dotrikun.cpp
+++ b/src/mame/drivers/dotrikun.cpp
@@ -197,26 +197,27 @@ void dotrikun_state::machine_reset()
m_color = 0;
}
-MACHINE_CONFIG_START(dotrikun_state::dotrikun)
-
+void dotrikun_state::dotrikun(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, MASTER_CLOCK)
- MCFG_DEVICE_PROGRAM_MAP(dotrikun_map)
- MCFG_DEVICE_IO_MAP(io_map)
- MCFG_TIMER_DRIVER_ADD_SCANLINE("scanline_on", dotrikun_state, scanline_on, "screen", 0, 1)
- MCFG_TIMER_DRIVER_ADD("scanline_off", dotrikun_state, scanline_off)
- MCFG_TIMER_DRIVER_ADD("interrupt", dotrikun_state, interrupt)
+ Z80(config, m_maincpu, MASTER_CLOCK);
+ m_maincpu->set_addrmap(AS_PROGRAM, &dotrikun_state::dotrikun_map);
+ m_maincpu->set_addrmap(AS_IO, &dotrikun_state::io_map);
+
+ TIMER(config, "scanline_on").configure_scanline(FUNC(dotrikun_state::scanline_on), "screen", 0, 1);
+ TIMER(config, m_scanline_off_timer).configure_generic(FUNC(dotrikun_state::scanline_off));
+ TIMER(config, m_interrupt_timer).configure_generic(FUNC(dotrikun_state::interrupt));
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_RAW_PARAMS(MASTER_CLOCK, 128+128, 0, 128, 192+64, 0, 192)
- MCFG_SCREEN_UPDATE_DRIVER(dotrikun_state, screen_update)
- MCFG_SCREEN_VIDEO_ATTRIBUTES(VIDEO_ALWAYS_UPDATE)
- MCFG_SCREEN_PALETTE("palette")
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_raw(MASTER_CLOCK, 128+128, 0, 128, 192+64, 0, 192);
+ m_screen->set_screen_update(FUNC(dotrikun_state::screen_update));
+ m_screen->set_video_attributes(VIDEO_ALWAYS_UPDATE);
+ m_screen->set_palette("palette");
PALETTE(config, "palette", palette_device::RGB_3BIT);
/* no sound hardware */
-MACHINE_CONFIG_END
+}
/***************************************************************************
diff --git a/src/mame/drivers/dps1.cpp b/src/mame/drivers/dps1.cpp
index 0690daab4f6..370c1673fa8 100644
--- a/src/mame/drivers/dps1.cpp
+++ b/src/mame/drivers/dps1.cpp
@@ -38,6 +38,9 @@ public:
void init_dps1();
+protected:
+ virtual void machine_reset() override;
+
private:
DECLARE_WRITE8_MEMBER(portb2_w);
DECLARE_WRITE8_MEMBER(portb4_w);
@@ -49,7 +52,6 @@ private:
DECLARE_READ8_MEMBER(portff_r);
DECLARE_WRITE8_MEMBER(portff_w);
DECLARE_WRITE_LINE_MEMBER(fdc_drq_w);
- DECLARE_MACHINE_RESET(dps1);
void io_map(address_map &map);
void mem_map(address_map &map);
@@ -156,18 +158,18 @@ WRITE_LINE_MEMBER( dps1_state::fdc_drq_w )
address_space& mem = m_maincpu->space(AS_PROGRAM);
if (m_dma_dir)
{ // disk to mem
- mem.write_byte(m_dma_adr, m_fdc->mdma_r(mem, 0));
+ mem.write_byte(m_dma_adr, m_fdc->dma_r());
}
else
{ // mem to disk
- m_fdc->mdma_w(mem, 0, mem.read_byte(m_dma_adr));
+ m_fdc->dma_w(mem.read_byte(m_dma_adr));
}
m_dma_adr++;
}
// else take /dack high (unsupported)
}
-MACHINE_RESET_MEMBER( dps1_state, dps1 )
+void dps1_state::machine_reset()
{
membank("bankr0")->set_entry(1); // point at rom
membank("bankw0")->set_entry(0); // always write to ram
@@ -196,14 +198,13 @@ static void floppies(device_slot_interface &device)
device.option_add("floppy0", FLOPPY_8_DSDD);
}
-MACHINE_CONFIG_START(dps1_state::dps1)
+void dps1_state::dps1(machine_config &config)
+{
// basic machine hardware
Z80(config, m_maincpu, 4_MHz_XTAL);
m_maincpu->set_addrmap(AS_PROGRAM, &dps1_state::mem_map);
m_maincpu->set_addrmap(AS_IO, &dps1_state::io_map);
- MCFG_MACHINE_RESET_OVERRIDE(dps1_state, dps1)
-
/* video hardware */
mc2661_device &uart(MC2661(config, "uart", 5.0688_MHz_XTAL)); // Signetics 2651N
uart.txd_handler().set("rs232", FUNC(rs232_port_device::write_txd));
@@ -222,14 +223,12 @@ MACHINE_CONFIG_START(dps1_state::dps1)
UPD765A(config, m_fdc, 16_MHz_XTAL / 2, false, true);
//m_fdc->intrq_wr_callback().set(FUNC(dps1_state::fdc_int_w)); // doesn't appear to be used
m_fdc->drq_wr_callback().set(FUNC(dps1_state::fdc_drq_w));
- MCFG_FLOPPY_DRIVE_ADD("fdc:0", floppies, "floppy0", floppy_image_device::default_floppy_formats)
- MCFG_FLOPPY_DRIVE_SOUND(true)
- //MCFG_FLOPPY_DRIVE_ADD("fdc:1", floppies, "floppy1", floppy_image_device::default_floppy_formats)
- //MCFG_FLOPPY_DRIVE_SOUND(true)
+ FLOPPY_CONNECTOR(config, "fdc:0", floppies, "floppy0", floppy_image_device::default_floppy_formats).enable_sound(true);
+ //FLOPPY_CONNECTOR(config, "fdc:1", floppies, "floppy1", floppy_image_device::default_floppy_formats).enable_sound(true);
// software lists
- MCFG_SOFTWARE_LIST_ADD("flop_list", "dps1")
-MACHINE_CONFIG_END
+ SOFTWARE_LIST(config, "flop_list").set_original("dps1");
+}
ROM_START( dps1 )
ROM_REGION( 0x800, "maincpu", 0 )
diff --git a/src/mame/drivers/dragon.cpp b/src/mame/drivers/dragon.cpp
index 17d373ef071..c336b62b628 100644
--- a/src/mame/drivers/dragon.cpp
+++ b/src/mame/drivers/dragon.cpp
@@ -187,13 +187,13 @@ static void dragon_alpha_floppies(device_slot_interface &device)
device.option_add("dd", FLOPPY_35_DD);
}
-MACHINE_CONFIG_START(dragon_state::dragon_base)
- MCFG_DEVICE_MODIFY(":")
- MCFG_DEVICE_CLOCK(14.218_MHz_XTAL / 16)
+void dragon_state::dragon_base(machine_config &config)
+{
+ this->set_clock(14.218_MHz_XTAL / 16);
// basic machine hardware
- MCFG_DEVICE_ADD("maincpu", MC6809E, DERIVED_CLOCK(1, 1))
- MCFG_DEVICE_PROGRAM_MAP(dragon_mem)
+ MC6809E(config, m_maincpu, DERIVED_CLOCK(1, 1));
+ m_maincpu->set_addrmap(AS_PROGRAM, &dragon_state::dragon_mem);
// devices
pia6821_device &pia0(PIA6821(config, PIA0_TAG, 0));
@@ -216,20 +216,21 @@ MACHINE_CONFIG_START(dragon_state::dragon_base)
SAM6883(config, m_sam, 14.218_MHz_XTAL, m_maincpu);
m_sam->res_rd_callback().set(FUNC(dragon_state::sam_read));
- MCFG_CASSETTE_ADD("cassette")
- MCFG_CASSETTE_FORMATS(coco_cassette_formats)
- MCFG_CASSETTE_DEFAULT_STATE(CASSETTE_PLAY | CASSETTE_MOTOR_DISABLED | CASSETTE_SPEAKER_MUTED)
- MCFG_CASSETTE_INTERFACE("dragon_cass")
+ CASSETTE(config, m_cassette);
+ m_cassette->set_formats(coco_cassette_formats);
+ m_cassette->set_default_state(CASSETTE_PLAY | CASSETTE_MOTOR_DISABLED | CASSETTE_SPEAKER_MUTED);
+ m_cassette->set_interface("dragon_cass");
- MCFG_DEVICE_ADD(PRINTER_TAG, PRINTER, 0)
+ PRINTER(config, m_printer, 0);
// video hardware
- MCFG_SCREEN_MC6847_PAL_ADD(SCREEN_TAG, VDG_TAG)
+ SCREEN(config, SCREEN_TAG, SCREEN_TYPE_RASTER);
- MCFG_DEVICE_ADD(VDG_TAG, MC6847_PAL, 4.433619_MHz_XTAL)
- MCFG_MC6847_HSYNC_CALLBACK(WRITELINE(*this, dragon_state, horizontal_sync))
- MCFG_MC6847_FSYNC_CALLBACK(WRITELINE(*this, dragon_state, field_sync))
- MCFG_MC6847_INPUT_CALLBACK(READ8(m_sam, sam6883_device, display_read))
+ MC6847_PAL(config, m_vdg, 4.433619_MHz_XTAL);
+ m_vdg->set_screen(SCREEN_TAG);
+ m_vdg->hsync_wr_callback().set(FUNC(dragon_state::horizontal_sync));
+ m_vdg->fsync_wr_callback().set(FUNC(dragon_state::field_sync));
+ m_vdg->input_callback().set(m_sam, FUNC(sam6883_device::display_read));
// sound hardware
coco_sound(config);
@@ -238,13 +239,14 @@ MACHINE_CONFIG_START(dragon_state::dragon_base)
coco_floating(config);
// software lists
- MCFG_SOFTWARE_LIST_ADD("dragon_cart_list", "dragon_cart")
- MCFG_SOFTWARE_LIST_ADD("dragon_cass_list", "dragon_cass")
- MCFG_SOFTWARE_LIST_ADD("dragon_flop_list", "dragon_flop")
- MCFG_SOFTWARE_LIST_COMPATIBLE_ADD("coco_cart_list", "coco_cart")
-MACHINE_CONFIG_END
+ SOFTWARE_LIST(config, "dragon_cart_list").set_original("dragon_cart");
+ SOFTWARE_LIST(config, "dragon_cass_list").set_original("dragon_cass");
+ SOFTWARE_LIST(config, "dragon_flop_list").set_original("dragon_flop");
+ SOFTWARE_LIST(config, "coco_cart_list").set_compatible("coco_cart");
+}
-MACHINE_CONFIG_START(dragon_state::dragon32)
+void dragon_state::dragon32(machine_config &config)
+{
dragon_base(config);
// internal ram
RAM(config, m_ram).set_default_size("32K").set_extra_options("64K");
@@ -254,9 +256,10 @@ MACHINE_CONFIG_START(dragon_state::dragon32)
cartslot.cart_callback().set([this] (int state) { cart_w(state != 0); }); // lambda because name is overloaded
cartslot.nmi_callback().set_inputline(m_maincpu, INPUT_LINE_NMI);
cartslot.halt_callback().set_inputline(m_maincpu, INPUT_LINE_HALT);
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(dragon64_state::dragon64)
+void dragon64_state::dragon64(machine_config &config)
+{
dragon_base(config);
// internal ram
RAM(config, m_ram).set_default_size("64K");
@@ -272,34 +275,36 @@ MACHINE_CONFIG_START(dragon64_state::dragon64)
acia.set_xtal(1.8432_MHz_XTAL);
// software lists
- MCFG_SOFTWARE_LIST_ADD("dragon_flex_list", "dragon_flex")
- MCFG_SOFTWARE_LIST_ADD("dragon_os9_list", "dragon_os9")
-MACHINE_CONFIG_END
+ SOFTWARE_LIST(config, "dragon_flex_list").set_original("dragon_flex");
+ SOFTWARE_LIST(config, "dragon_os9_list").set_original("dragon_os9");
+}
-MACHINE_CONFIG_START(dragon64_state::dragon64h)
+void dragon64_state::dragon64h(machine_config &config)
+{
dragon64(config);
// Replace M6809 with HD6309
- MCFG_DEVICE_REPLACE(MAINCPU_TAG, HD6309E, DERIVED_CLOCK(1, 1))
- MCFG_DEVICE_PROGRAM_MAP(dragon_mem)
+ HD6309E(config.replace(), m_maincpu, DERIVED_CLOCK(1, 1));
+ m_maincpu->set_addrmap(AS_PROGRAM, &dragon64_state::dragon_mem);
m_ram->set_default_size("64K");
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(dragon200e_state::dragon200e)
+void dragon200e_state::dragon200e(machine_config &config)
+{
dragon64(config);
// video hardware
- MCFG_DEVICE_MODIFY(VDG_TAG)
- MCFG_MC6847_CHARROM_CALLBACK(dragon200e_state, char_rom_r)
-MACHINE_CONFIG_END
+ m_vdg->set_get_char_rom(FUNC(dragon200e_state::char_rom_r));
+}
-MACHINE_CONFIG_START(d64plus_state::d64plus)
+void d64plus_state::d64plus(machine_config &config)
+{
dragon64(config);
// video hardware
- MCFG_SCREEN_ADD("plus_screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(50)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */
- MCFG_SCREEN_SIZE(640, 264)
- MCFG_SCREEN_VISIBLE_AREA(0, 640-1, 0, 264-1)
- MCFG_SCREEN_UPDATE_DEVICE("crtc", hd6845_device, screen_update)
+ screen_device &plus_screen(SCREEN(config, "plus_screen", SCREEN_TYPE_RASTER));
+ plus_screen.set_refresh_hz(50);
+ plus_screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */
+ plus_screen.set_size(640, 264);
+ plus_screen.set_visarea_full();
+ plus_screen.set_screen_update("crtc", FUNC(hd6845_device::screen_update));
PALETTE(config, m_palette, palette_device::MONOCHROME);
// crtc
@@ -308,9 +313,10 @@ MACHINE_CONFIG_START(d64plus_state::d64plus)
m_crtc->set_show_border_area(false);
m_crtc->set_char_width(8);
m_crtc->set_update_row_callback(FUNC(d64plus_state::crtc_update_row), this);
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(dragon_alpha_state::dgnalpha)
+void dragon_alpha_state::dgnalpha(machine_config &config)
+{
dragon_base(config);
// internal ram
RAM(config, RAM_TAG).set_default_size("64K");
@@ -330,14 +336,10 @@ MACHINE_CONFIG_START(dragon_alpha_state::dgnalpha)
m_fdc->intrq_wr_callback().set(FUNC(dragon_alpha_state::fdc_intrq_w));
m_fdc->drq_wr_callback().set(FUNC(dragon_alpha_state::fdc_drq_w));
- MCFG_FLOPPY_DRIVE_ADD(WD2797_TAG ":0", dragon_alpha_floppies, "dd", dragon_alpha_state::dragon_formats)
- MCFG_FLOPPY_DRIVE_SOUND(true)
- MCFG_FLOPPY_DRIVE_ADD(WD2797_TAG ":1", dragon_alpha_floppies, "dd", dragon_alpha_state::dragon_formats)
- MCFG_FLOPPY_DRIVE_SOUND(true)
- MCFG_FLOPPY_DRIVE_ADD(WD2797_TAG ":2", dragon_alpha_floppies, nullptr, dragon_alpha_state::dragon_formats)
- MCFG_FLOPPY_DRIVE_SOUND(true)
- MCFG_FLOPPY_DRIVE_ADD(WD2797_TAG ":3", dragon_alpha_floppies, nullptr, dragon_alpha_state::dragon_formats)
- MCFG_FLOPPY_DRIVE_SOUND(true)
+ FLOPPY_CONNECTOR(config, WD2797_TAG ":0", dragon_alpha_floppies, "dd", dragon_alpha_state::dragon_formats).enable_sound(true);
+ FLOPPY_CONNECTOR(config, WD2797_TAG ":1", dragon_alpha_floppies, "dd", dragon_alpha_state::dragon_formats).enable_sound(true);
+ FLOPPY_CONNECTOR(config, WD2797_TAG ":2", dragon_alpha_floppies, nullptr, dragon_alpha_state::dragon_formats).enable_sound(true);
+ FLOPPY_CONNECTOR(config, WD2797_TAG ":3", dragon_alpha_floppies, nullptr, dragon_alpha_state::dragon_formats).enable_sound(true);
// sound hardware
ay8912_device &ay8912(AY8912(config, AY8912_TAG, 1000000));
@@ -352,32 +354,37 @@ MACHINE_CONFIG_START(dragon_alpha_state::dgnalpha)
pia2.irqb_handler().set(FUNC(dragon_alpha_state::pia2_firq_b));
// software lists
- MCFG_SOFTWARE_LIST_ADD("dgnalpha_flop_list", "dgnalpha_flop")
- MCFG_SOFTWARE_LIST_ADD("dragon_flex_list", "dragon_flex")
- MCFG_SOFTWARE_LIST_ADD("dragon_os9_list", "dragon_os9")
-MACHINE_CONFIG_END
+ SOFTWARE_LIST(config, "dgnalpha_flop_list").set_original("dgnalpha_flop");
+ SOFTWARE_LIST(config, "dragon_flex_list").set_original("dragon_flex");
+ SOFTWARE_LIST(config, "dragon_os9_list").set_original("dragon_os9");
+}
-MACHINE_CONFIG_START(dragon64_state::tanodr64)
+void dragon64_state::tanodr64(machine_config &config)
+{
dragon64(config);
- MCFG_DEVICE_MODIFY(":")
- MCFG_DEVICE_CLOCK(14.318181_MHz_XTAL / 4)
+ this->set_clock(14.318181_MHz_XTAL / 16);
+
+ m_sam->set_clock(14.318181_MHz_XTAL);
// video hardware
- MCFG_SCREEN_MODIFY(SCREEN_TAG)
- MCFG_SCREEN_REFRESH_RATE(60)
+ MC6847_NTSC(config.replace(), m_vdg, 14.318181_MHz_XTAL / 4);
+ m_vdg->set_screen(SCREEN_TAG);
+ m_vdg->hsync_wr_callback().set(FUNC(dragon_state::horizontal_sync));
+ m_vdg->fsync_wr_callback().set(FUNC(dragon_state::field_sync));
+ m_vdg->input_callback().set(m_sam, FUNC(sam6883_device::display_read));
// cartridge
- MCFG_DEVICE_MODIFY(CARTRIDGE_TAG)
- MCFG_DEVICE_SLOT_INTERFACE(dragon_cart, "sdtandy_fdc", false)
-MACHINE_CONFIG_END
+ subdevice<cococart_slot_device>(CARTRIDGE_TAG)->set_default_option("sdtandy_fdc");
+}
-MACHINE_CONFIG_START(dragon64_state::tanodr64h)
+void dragon64_state::tanodr64h(machine_config &config)
+{
tanodr64(config);
// Replace M6809 CPU with HD6309 CPU
- MCFG_DEVICE_REPLACE(MAINCPU_TAG, HD6309E, DERIVED_CLOCK(1, 1))
- MCFG_DEVICE_PROGRAM_MAP(dragon_mem)
+ HD6309E(config.replace(), m_maincpu, DERIVED_CLOCK(1, 1));
+ m_maincpu->set_addrmap(AS_PROGRAM, &dragon64_state::dragon_mem);
m_ram->set_default_size("64K");
-MACHINE_CONFIG_END
+}
/***************************************************************************
diff --git a/src/mame/drivers/dragrace.cpp b/src/mame/drivers/dragrace.cpp
index 6b79539e335..876a8a1527c 100644
--- a/src/mame/drivers/dragrace.cpp
+++ b/src/mame/drivers/dragrace.cpp
@@ -272,35 +272,35 @@ void dragrace_state::machine_reset()
m_gear[1] = 0;
}
-MACHINE_CONFIG_START(dragrace_state::dragrace)
-
+void dragrace_state::dragrace(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M6800, 12.096_MHz_XTAL / 12)
- MCFG_DEVICE_PROGRAM_MAP(dragrace_map)
- MCFG_DEVICE_PERIODIC_INT_DRIVER(dragrace_state, irq0_line_hold, 4*60)
+ M6800(config, m_maincpu, 12.096_MHz_XTAL / 12);
+ m_maincpu->set_addrmap(AS_PROGRAM, &dragrace_state::dragrace_map);
+ m_maincpu->set_periodic_int(FUNC(dragrace_state::irq0_line_hold), attotime::from_hz(4*60));
WATCHDOG_TIMER(config, m_watchdog).set_vblank_count("screen", 8);
- MCFG_TIMER_DRIVER_ADD_PERIODIC("frame_timer", dragrace_state, dragrace_frame_callback, attotime::from_hz(60))
+ TIMER(config, "frame_timer").configure_periodic(FUNC(dragrace_state::dragrace_frame_callback), attotime::from_hz(60));
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_SIZE(256, 262)
- MCFG_SCREEN_VISIBLE_AREA(0, 255, 0, 239)
- MCFG_SCREEN_UPDATE_DRIVER(dragrace_state, screen_update_dragrace)
- MCFG_SCREEN_PALETTE("palette")
-
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_dragrace)
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_refresh_hz(60);
+ m_screen->set_size(256, 262);
+ m_screen->set_visarea(0, 255, 0, 239);
+ m_screen->set_screen_update(FUNC(dragrace_state::screen_update_dragrace));
+ m_screen->set_palette("palette");
+
+ GFXDECODE(config, m_gfxdecode, "palette", gfx_dragrace);
PALETTE(config, "palette", FUNC(dragrace_state::dragrace_palette), 16);
/* sound hardware */
SPEAKER(config, "lspeaker").front_left();
SPEAKER(config, "rspeaker").front_right();
- MCFG_DEVICE_ADD("discrete", DISCRETE, dragrace_discrete)
- MCFG_SOUND_ROUTE(0, "lspeaker", 1.0)
- MCFG_SOUND_ROUTE(1, "rspeaker", 1.0)
+ DISCRETE(config, m_discrete, dragrace_discrete);
+ m_discrete->add_route(0, "lspeaker", 1.0);
+ m_discrete->add_route(1, "rspeaker", 1.0);
f9334_device &latch_f5(F9334(config, "latch_f5")); // F5
latch_f5.parallel_out_cb().set(FUNC(dragrace_state::speed1_w)).mask(0x1f); // set 3SPEED1-7SPEED1
@@ -324,7 +324,7 @@ MACHINE_CONFIG_START(dragrace_state::dragrace)
latch_e5.q_out_cb<3>().set(m_discrete, FUNC(discrete_device::write_line<DRAGRACE_MOTOR2_EN>)); // Motor2 enable
latch_e5.q_out_cb<5>().set(m_discrete, FUNC(discrete_device::write_line<DRAGRACE_HITONE_EN>)); // HiTone enable
latch_e5.q_out_cb<7>().set_output("led1"); // Player 2 Start Lamp
-MACHINE_CONFIG_END
+}
ROM_START( dragrace )
diff --git a/src/mame/drivers/dreambal.cpp b/src/mame/drivers/dreambal.cpp
index 5401e207ffb..07169fefc68 100644
--- a/src/mame/drivers/dreambal.cpp
+++ b/src/mame/drivers/dreambal.cpp
@@ -311,24 +311,24 @@ void dreambal_state::machine_reset()
}
// xtals = 28.000, 9.8304
-MACHINE_CONFIG_START(dreambal_state::dreambal)
-
+void dreambal_state::dreambal(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M68000, 28000000/2)
- MCFG_DEVICE_PROGRAM_MAP(dreambal_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", dreambal_state, irq6_line_hold) // 5 valid too?
+ M68000(config, m_maincpu, 28000000/2);
+ m_maincpu->set_addrmap(AS_PROGRAM, &dreambal_state::dreambal_map);
+ m_maincpu->set_vblank_int("screen", FUNC(dreambal_state::irq6_line_hold)); // 5 valid too?
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(58)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */)
- MCFG_SCREEN_SIZE(64*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 40*8-1, 1*8, 31*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(dreambal_state, screen_update_dreambal)
- MCFG_SCREEN_PALETTE("palette")
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(58);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500) /* not accurate */);
+ screen.set_size(64*8, 32*8);
+ screen.set_visarea(0*8, 40*8-1, 1*8, 31*8-1);
+ screen.set_screen_update(FUNC(dreambal_state::screen_update_dreambal));
+ screen.set_palette("palette");
PALETTE(config, "palette").set_format(palette_device::xBGR_444, 0x400/2);
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_dreambal)
+ GFXDECODE(config, "gfxdecode", "palette", gfx_dreambal);
EEPROM_93C46_16BIT(config, "eeprom"); // 93lc46b
@@ -356,10 +356,8 @@ MACHINE_CONFIG_START(dreambal_state::dreambal)
/* sound hardware */
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("oki", OKIM6295, 9830400/8, okim6295_device::PIN7_HIGH)
-
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.00)
-MACHINE_CONFIG_END
+ OKIM6295(config, "oki", 9830400/8, okim6295_device::PIN7_HIGH).add_route(ALL_OUTPUTS, "mono", 1.00);
+}
diff --git a/src/mame/drivers/dreamwld.cpp b/src/mame/drivers/dreamwld.cpp
index cc93023d745..8267c94898b 100644
--- a/src/mame/drivers/dreamwld.cpp
+++ b/src/mame/drivers/dreamwld.cpp
@@ -746,48 +746,46 @@ void dreamwld_state::machine_reset()
}
-MACHINE_CONFIG_START(dreamwld_state::baryon)
-
+void dreamwld_state::baryon(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M68EC020, XTAL(32'000'000)/2) /* 16MHz verified */
- MCFG_DEVICE_PROGRAM_MAP(baryon_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", dreamwld_state, irq4_line_hold)
+ M68EC020(config, m_maincpu, XTAL(32'000'000)/2); /* 16MHz verified */
+ m_maincpu->set_addrmap(AS_PROGRAM, &dreamwld_state::baryon_map);
+ m_maincpu->set_vblank_int("screen", FUNC(dreamwld_state::irq4_line_hold));
- MCFG_DEVICE_ADD("mcu", AT89C52, XTAL(32'000'000)/2) /* AT89C52 or 87(C)52, unknown clock (value from docs) */
- MCFG_DEVICE_DISABLE() /* Internal ROM aren't dumped */
+ AT89C52(config, "mcu", XTAL(32'000'000)/2).set_disable(); /* AT89C52 or 87(C)52, unknown clock (value from docs), internal ROMs aren't dumped */
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(57.793)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500))
- MCFG_SCREEN_SIZE(512,256)
- MCFG_SCREEN_VISIBLE_AREA(0, 308-1, 0, 224-1)
- MCFG_SCREEN_UPDATE_DRIVER(dreamwld_state, screen_update_dreamwld)
- MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE(*this, dreamwld_state, screen_vblank_dreamwld))
- MCFG_SCREEN_PALETTE(m_palette)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(57.793);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500));
+ screen.set_size(512,256);
+ screen.set_visarea(0, 308-1, 0, 224-1);
+ screen.set_screen_update(FUNC(dreamwld_state::screen_update_dreamwld));
+ screen.screen_vblank().set(FUNC(dreamwld_state::screen_vblank_dreamwld));
+ screen.set_palette(m_palette);
PALETTE(config, m_palette).set_format(palette_device::xRGB_555, 0x1000);
GFXDECODE(config, m_gfxdecode, m_palette, gfx_dreamwld);
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("oki1", OKIM6295, XTAL(32'000'000)/32, okim6295_device::PIN7_LOW) /* 1MHz verified */
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.00)
- MCFG_DEVICE_ADDRESS_MAP(0, oki1_map)
-MACHINE_CONFIG_END
+ okim6295_device &oki1(OKIM6295(config, "oki1", XTAL(32'000'000)/32, okim6295_device::PIN7_LOW)); /* 1MHz verified */
+ oki1.add_route(ALL_OUTPUTS, "mono", 1.00);
+ oki1.set_addrmap(0, &dreamwld_state::oki1_map);
+}
-MACHINE_CONFIG_START(dreamwld_state::dreamwld)
+void dreamwld_state::dreamwld(machine_config &config)
+{
baryon(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(dreamwld_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", dreamwld_state, irq4_line_hold)
+ m_maincpu->set_addrmap(AS_PROGRAM, &dreamwld_state::dreamwld_map);
- MCFG_DEVICE_ADD("oki2", OKIM6295, XTAL(32'000'000)/32, okim6295_device::PIN7_LOW) /* 1MHz verified */
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.00)
- MCFG_DEVICE_ADDRESS_MAP(0, oki2_map)
-MACHINE_CONFIG_END
+ okim6295_device &oki2(OKIM6295(config, "oki2", XTAL(32'000'000)/32, okim6295_device::PIN7_LOW)); /* 1MHz verified */
+ oki2.add_route(ALL_OUTPUTS, "mono", 1.00);
+ oki2.set_addrmap(0, &dreamwld_state::oki2_map);
+}
/*
@@ -1023,7 +1021,7 @@ ROM_START( rolcrush )
ROM_LOAD( "mx27c4000_5.bin", 0x000000, 0x80000, CRC(7afa6adb) SHA1(d4049e1068a5f7abf0e14d0b9fbbbc6dfb5d0170) )
ROM_REGION( 0x80000, "oki2", ROMREGION_ERASE00 ) /* OKI Samples - 2nd chip (neither OKI or rom is present, empty sockets) */
- /* not populared */
+ /* not populated */
ROM_REGION( 0x400000, "gfx1", 0 ) /* Sprite Tiles - decoded */
ROM_LOAD( "m27c160.8.bin", 0x000000, 0x200000, CRC(a509bc36) SHA1(aaa008e07e4b24ff9dbcee5925d6516d1662931c) )
@@ -1057,7 +1055,7 @@ ROM_START( rolcrusha )
ROM_LOAD( "5", 0x000000, 0x80000, CRC(7afa6adb) SHA1(d4049e1068a5f7abf0e14d0b9fbbbc6dfb5d0170) )
ROM_REGION( 0x80000, "oki2", ROMREGION_ERASE00 ) /* OKI Samples - 2nd chip (neither OKI or rom is present, empty sockets) */
- /* not populared */
+ /* not populated */
ROM_REGION( 0x400000, "gfx1", 0 ) /* Sprite Tiles - decoded */
ROM_LOAD( "8", 0x000000, 0x200000, CRC(01446191) SHA1(b106ed6c085fad617552972db78866a3346e4553) )
@@ -1219,7 +1217,7 @@ ROM_START( gaialast )
ROM_LOAD( "1", 0x000000, 0x80000, CRC(2dbad410) SHA1(bb788ea14bb605be9af9c8f8adec94ad1c17ab55) )
ROM_REGION( 0x80000, "oki2", ROMREGION_ERASE00 ) /* OKI Samples - 2nd chip (neither OKI or rom is present, empty sockets) */
- /* not populared */
+ /* not populated */
ROM_REGION( 0x800000, "gfx1", 0 ) /* Sprite Tiles - decoded */
ROM_LOAD( "10", 0x000000, 0x200000, CRC(5822ef93) SHA1(8ce22c30f8027f35c5f72eb6ce57a74540dd55da) )
diff --git a/src/mame/drivers/drgnmst.cpp b/src/mame/drivers/drgnmst.cpp
index e731f9dbce3..5928ea8497c 100644
--- a/src/mame/drivers/drgnmst.cpp
+++ b/src/mame/drivers/drgnmst.cpp
@@ -77,8 +77,8 @@ READ8_MEMBER(drgnmst_state::snd_command_r)
switch (m_oki_control & 0x1f)
{
- case 0x12: data = (m_oki[1]->read(space, 0) & 0x0f); break;
- case 0x16: data = (m_oki[0]->read(space, 0) & 0x0f); break;
+ case 0x12: data = (m_oki[1]->read() & 0x0f); break;
+ case 0x16: data = (m_oki[0]->read() & 0x0f); break;
case 0x0b:
case 0x0f: data = m_snd_command; break;
default: break;
@@ -160,17 +160,17 @@ WRITE8_MEMBER(drgnmst_state::snd_control_w)
switch (m_oki_control & 0x1f)
{
- case 0x11:
+ case 0x11:
// logerror("Writing %02x to OKI1", m_oki_command);
// logerror(", PortC=%02x, Code=%02x, Bank0=%01x, Bank1=%01x\n", m_oki_control, m_snd_command, m_oki_bank[0], m_oki_bank[1]);
- m_oki[1]->write(space, 0, m_oki_command);
- break;
- case 0x15:
+ m_oki[1]->write(m_oki_command);
+ break;
+ case 0x15:
// logerror("Writing %02x to OKI0", m_oki_command);
// logerror(", PortC=%02x, Code=%02x, Bank0=%01x, Bank1=%01x\n", m_oki_control, m_snd_command, m_oki_bank[0], m_oki_bank[1]);
- m_oki[0]->write(space, 0, m_oki_command);
- break;
- default: break;
+ m_oki[0]->write(m_oki_command);
+ break;
+ default: break;
}
}
@@ -373,11 +373,11 @@ void drgnmst_state::machine_reset()
m_oki_bank[0] = 0;
}
-MACHINE_CONFIG_START(drgnmst_state::drgnmst)
-
- MCFG_DEVICE_ADD("maincpu", M68000, 12_MHz_XTAL) /* Confirmed */
- MCFG_DEVICE_PROGRAM_MAP(drgnmst_main_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", drgnmst_state, irq2_line_hold)
+void drgnmst_state::drgnmst(machine_config &config)
+{
+ M68000(config, m_maincpu, 12_MHz_XTAL); /* Confirmed */
+ m_maincpu->set_addrmap(AS_PROGRAM, &drgnmst_state::drgnmst_main_map);
+ m_maincpu->set_vblank_int("screen", FUNC(drgnmst_state::irq2_line_hold));
PIC16C55(config, m_audiocpu, 32_MHz_XTAL / 8); /* 4MHz - Confirmed */
m_audiocpu->read_a().set(FUNC(drgnmst_state::pic16c5x_port0_r));
@@ -389,26 +389,26 @@ MACHINE_CONFIG_START(drgnmst_state::drgnmst)
GFXDECODE(config, m_gfxdecode, m_palette, gfx_drgnmst);
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(64*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(8*8, 56*8-1, 2*8, 30*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(drgnmst_state, screen_update)
- MCFG_SCREEN_PALETTE(m_palette)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(64*8, 32*8);
+ screen.set_visarea(8*8, 56*8-1, 2*8, 30*8-1);
+ screen.set_screen_update(FUNC(drgnmst_state::screen_update));
+ screen.set_palette(m_palette);
PALETTE(config, m_palette).set_format(2, &drgnmst_state::drgnmst_IIIIRRRRGGGGBBBB, 0x2000);
/* sound hardware */
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("oki1", OKIM6295, 32_MHz_XTAL / 32, okim6295_device::PIN7_HIGH)
- MCFG_DEVICE_ADDRESS_MAP(0, drgnmst_oki1_map)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.00)
+ OKIM6295(config, m_oki[0], 32_MHz_XTAL / 32, okim6295_device::PIN7_HIGH);
+ m_oki[0]->set_addrmap(0, &drgnmst_state::drgnmst_oki1_map);
+ m_oki[0]->add_route(ALL_OUTPUTS, "mono", 1.00);
- MCFG_DEVICE_ADD("oki2", OKIM6295, 32_MHz_XTAL / 32, okim6295_device::PIN7_HIGH)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.00)
-MACHINE_CONFIG_END
+ OKIM6295(config, m_oki[1], 32_MHz_XTAL / 32, okim6295_device::PIN7_HIGH);
+ m_oki[1]->add_route(ALL_OUTPUTS, "mono", 1.00);
+}
ROM_START( drgnmst )
diff --git a/src/mame/drivers/dribling.cpp b/src/mame/drivers/dribling.cpp
index 736a9ed58fe..107dedfec10 100644
--- a/src/mame/drivers/dribling.cpp
+++ b/src/mame/drivers/dribling.cpp
@@ -268,13 +268,13 @@ void dribling_state::machine_reset()
}
-MACHINE_CONFIG_START(dribling_state::dribling)
-
+void dribling_state::dribling(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, 5000000)
- MCFG_DEVICE_PROGRAM_MAP(dribling_map)
- MCFG_DEVICE_IO_MAP(io_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", dribling_state, dribling_irq_gen)
+ Z80(config, m_maincpu, 20_MHz_XTAL / 4); // XTAL verified, divider not
+ m_maincpu->set_addrmap(AS_PROGRAM, &dribling_state::dribling_map);
+ m_maincpu->set_addrmap(AS_IO, &dribling_state::io_map);
+ m_maincpu->set_vblank_int("screen", FUNC(dribling_state::dribling_irq_gen));
I8255A(config, m_ppi8255_0);
m_ppi8255_0->in_pa_callback().set(FUNC(dribling_state::dsr_r));
@@ -290,19 +290,19 @@ MACHINE_CONFIG_START(dribling_state::dribling)
WATCHDOG_TIMER(config, m_watchdog);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_VIDEO_ATTRIBUTES(VIDEO_UPDATE_BEFORE_VBLANK)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */)
- MCFG_SCREEN_SIZE(256, 256)
- MCFG_SCREEN_VISIBLE_AREA(0, 255, 40, 255)
- MCFG_SCREEN_UPDATE_DRIVER(dribling_state, screen_update_dribling)
- MCFG_SCREEN_PALETTE("palette")
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_video_attributes(VIDEO_UPDATE_BEFORE_VBLANK);
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500) /* not accurate */);
+ screen.set_size(256, 256);
+ screen.set_visarea(0, 255, 40, 255);
+ screen.set_screen_update(FUNC(dribling_state::screen_update_dribling));
+ screen.set_palette("palette");
PALETTE(config, "palette", FUNC(dribling_state::dribling_palette), 256);
/* sound hardware */
-MACHINE_CONFIG_END
+}
diff --git a/src/mame/drivers/drmicro.cpp b/src/mame/drivers/drmicro.cpp
index 3aad808e81c..5dff7a2e260 100644
--- a/src/mame/drivers/drmicro.cpp
+++ b/src/mame/drivers/drmicro.cpp
@@ -87,9 +87,9 @@ void drmicro_state::drmicro_map(address_map &map)
void drmicro_state::io_map(address_map &map)
{
map.global_mask(0xff);
- map(0x00, 0x00).portr("P1").w("sn1", FUNC(sn76496_device::command_w));
- map(0x01, 0x01).portr("P2").w("sn2", FUNC(sn76496_device::command_w));
- map(0x02, 0x02).w("sn3", FUNC(sn76496_device::command_w));
+ map(0x00, 0x00).portr("P1").w("sn1", FUNC(sn76496_device::write));
+ map(0x01, 0x01).portr("P2").w("sn2", FUNC(sn76496_device::write));
+ map(0x02, 0x02).w("sn3", FUNC(sn76496_device::write));
map(0x03, 0x03).portr("DSW1").w(FUNC(drmicro_state::pcm_set_w));
map(0x04, 0x04).portr("DSW2").w(FUNC(drmicro_state::nmi_enable_w));
map(0x05, 0x05).noprw(); // unused? / watchdog?
@@ -240,25 +240,24 @@ void drmicro_state::machine_reset()
}
-MACHINE_CONFIG_START(drmicro_state::drmicro)
-
+void drmicro_state::drmicro(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80,MCLK/6) /* 3.072MHz? */
- MCFG_DEVICE_PROGRAM_MAP(drmicro_map)
- MCFG_DEVICE_IO_MAP(io_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", drmicro_state, drmicro_interrupt)
-
- MCFG_QUANTUM_TIME(attotime::from_hz(60))
+ Z80(config, m_maincpu, MCLK/6); /* 3.072MHz? */
+ m_maincpu->set_addrmap(AS_PROGRAM, &drmicro_state::drmicro_map);
+ m_maincpu->set_addrmap(AS_IO, &drmicro_state::io_map);
+ m_maincpu->set_vblank_int("screen", FUNC(drmicro_state::drmicro_interrupt));
+ config.m_minimum_quantum = attotime::from_hz(60);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */)
- MCFG_SCREEN_SIZE(32*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(drmicro_state, screen_update_drmicro)
- MCFG_SCREEN_PALETTE(m_palette)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */
+ screen.set_size(32*8, 32*8);
+ screen.set_visarea(0*8, 32*8-1, 2*8, 30*8-1);
+ screen.set_screen_update(FUNC(drmicro_state::screen_update_drmicro));
+ screen.set_palette(m_palette);
GFXDECODE(config, m_gfxdecode, m_palette, gfx_drmicro);
PALETTE(config, m_palette, FUNC(drmicro_state::drmicro_palette), 512, 32);
@@ -266,20 +265,15 @@ MACHINE_CONFIG_START(drmicro_state::drmicro)
/* sound hardware */
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("sn1", SN76496, MCLK/4)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.50)
+ SN76496(config, "sn1", MCLK/4).add_route(ALL_OUTPUTS, "mono", 0.50);
+ SN76496(config, "sn2", MCLK/4).add_route(ALL_OUTPUTS, "mono", 0.50);
+ SN76496(config, "sn3", MCLK/4).add_route(ALL_OUTPUTS, "mono", 0.50);
- MCFG_DEVICE_ADD("sn2", SN76496, MCLK/4)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.50)
-
- MCFG_DEVICE_ADD("sn3", SN76496, MCLK/4)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.50)
-
- MCFG_DEVICE_ADD("msm", MSM5205, 384000)
- MCFG_MSM5205_VCLK_CB(WRITELINE(*this, drmicro_state, pcm_w)) /* IRQ handler */
- MCFG_MSM5205_PRESCALER_SELECTOR(S64_4B) /* 6 KHz */
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.75)
-MACHINE_CONFIG_END
+ MSM5205(config, m_msm, 384000);
+ m_msm->vck_legacy_callback().set(FUNC(drmicro_state::pcm_w)); /* IRQ handler */
+ m_msm->set_prescaler_selector(msm5205_device::S64_4B); /* 6 KHz */
+ m_msm->add_route(ALL_OUTPUTS, "mono", 0.75);
+}
/*************************************
*
diff --git a/src/mame/drivers/drtomy.cpp b/src/mame/drivers/drtomy.cpp
index 35e0857e9cb..722585083db 100644
--- a/src/mame/drivers/drtomy.cpp
+++ b/src/mame/drivers/drtomy.cpp
@@ -306,22 +306,22 @@ void drtomy_state::machine_reset()
m_oki_bank = 0;
}
-MACHINE_CONFIG_START(drtomy_state::drtomy)
-
+void drtomy_state::drtomy(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M68000,24000000/2) /* ? MHz */
- MCFG_DEVICE_PROGRAM_MAP(drtomy_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", drtomy_state, irq6_line_hold)
+ M68000(config, m_maincpu, 24000000/2); /* ? MHz */
+ m_maincpu->set_addrmap(AS_PROGRAM, &drtomy_state::drtomy_map);
+ m_maincpu->set_vblank_int("screen", FUNC(drtomy_state::irq6_line_hold));
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */)
- MCFG_SCREEN_SIZE(32*16, 32*16)
- MCFG_SCREEN_VISIBLE_AREA(0, 320-1, 16, 256-1)
- MCFG_SCREEN_UPDATE_DRIVER(drtomy_state, screen_update_drtomy)
- MCFG_SCREEN_PALETTE(m_palette)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500) /* not accurate */);
+ screen.set_size(32*16, 32*16);
+ screen.set_visarea(0, 320-1, 16, 256-1);
+ screen.set_screen_update(FUNC(drtomy_state::screen_update_drtomy));
+ screen.set_palette(m_palette);
GFXDECODE(config, m_gfxdecode, m_palette, gfx_drtomy);
PALETTE(config, m_palette).set_format(palette_device::xRGB_555, 1024);
@@ -329,9 +329,8 @@ MACHINE_CONFIG_START(drtomy_state::drtomy)
/* sound hardware */
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("oki", OKIM6295, 26000000/16, okim6295_device::PIN7_LOW)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.8)
-MACHINE_CONFIG_END
+ OKIM6295(config, m_oki, 26000000/16, okim6295_device::PIN7_LOW).add_route(ALL_OUTPUTS, "mono", 0.8);
+}
ROM_START( drtomy )
diff --git a/src/mame/drivers/drw80pkr.cpp b/src/mame/drivers/drw80pkr.cpp
index 6396fef640c..4cbdce3e6f1 100644
--- a/src/mame/drivers/drw80pkr.cpp
+++ b/src/mame/drivers/drw80pkr.cpp
@@ -201,11 +201,11 @@ WRITE8_MEMBER(drw80pkr_state::io_w)
// ay8910 control port
if (m_p1 == 0xfc)
- m_aysnd->address_w(space, 0, data);
+ m_aysnd->address_w(data);
// ay8910_write_port_0_w
if (m_p1 == 0xfe)
- m_aysnd->data_w(space, 0, data);
+ m_aysnd->data_w(data);
}
}
@@ -451,7 +451,8 @@ INPUT_PORTS_END
* Machine Driver *
*************************/
-MACHINE_CONFIG_START(drw80pkr_state::drw80pkr)
+void drw80pkr_state::drw80pkr(machine_config &config)
+{
// basic machine hardware
I8039(config, m_maincpu, CPU_CLOCK);
m_maincpu->set_addrmap(AS_PROGRAM, &drw80pkr_state::map);
@@ -468,15 +469,15 @@ MACHINE_CONFIG_START(drw80pkr_state::drw80pkr)
m_maincpu->set_vblank_int("screen", FUNC(drw80pkr_state::irq0_line_hold));
// video hardware
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE((31+1)*8, (31+1)*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 24*8-1, 0*8, 27*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(drw80pkr_state, screen_update)
- MCFG_SCREEN_PALETTE("palette")
-
- MCFG_DEVICE_ADD(m_gfxdecode, GFXDECODE, "palette", gfx_drw80pkr)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size((31+1)*8, (31+1)*8);
+ screen.set_visarea(0*8, 24*8-1, 0*8, 27*8-1);
+ screen.set_screen_update(FUNC(drw80pkr_state::screen_update));
+ screen.set_palette("palette");
+
+ GFXDECODE(config, m_gfxdecode, "palette", gfx_drw80pkr);
PALETTE(config, "palette", FUNC(drw80pkr_state::drw80pkr_palette), 16 * 16);
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
@@ -485,7 +486,7 @@ MACHINE_CONFIG_START(drw80pkr_state::drw80pkr)
SPEAKER(config, "mono").front_center();
AY8912(config, m_aysnd, 20000000/12).add_route(ALL_OUTPUTS, "mono", 0.75);
-MACHINE_CONFIG_END
+}
/*************************
* Rom Load *
diff --git a/src/mame/drivers/dual68.cpp b/src/mame/drivers/dual68.cpp
index cb7d57789d4..e49dbf70b65 100644
--- a/src/mame/drivers/dual68.cpp
+++ b/src/mame/drivers/dual68.cpp
@@ -46,7 +46,7 @@ private:
WRITE16_MEMBER( dual68_state::terminal_w )
{
- m_terminal->write(space, 0, data >> 8);
+ m_terminal->write(data >> 8);
}
void dual68_state::dual68_mem(address_map &map)
@@ -93,24 +93,25 @@ void dual68_state::kbd_put(u8 data)
//m_term_data = data;
}
-MACHINE_CONFIG_START(dual68_state::dual68)
+void dual68_state::dual68(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M68000, 16_MHz_XTAL / 2) // MC68000L8
- MCFG_DEVICE_PROGRAM_MAP(dual68_mem)
+ M68000(config, m_maincpu, 16_MHz_XTAL / 2); // MC68000L8
+ m_maincpu->set_addrmap(AS_PROGRAM, &dual68_state::dual68_mem);
- MCFG_DEVICE_ADD("siocpu", I8085A, 9.8304_MHz_XTAL) // NEC D8085AC-2
- MCFG_DEVICE_PROGRAM_MAP(sio4_mem)
- MCFG_DEVICE_IO_MAP(sio4_io)
+ i8085a_cpu_device &siocpu(I8085A(config, "siocpu", 9.8304_MHz_XTAL)); // NEC D8085AC-2
+ siocpu.set_addrmap(AS_PROGRAM, &dual68_state::sio4_mem);
+ siocpu.set_addrmap(AS_IO, &dual68_state::sio4_io);
/* video hardware */
GENERIC_TERMINAL(config, m_terminal, 0);
m_terminal->set_keyboard_callback(FUNC(dual68_state::kbd_put));
- MCFG_DEVICE_ADD("usart1", MC2661, 9.8304_MHz_XTAL / 2) // SCN2661B
- MCFG_DEVICE_ADD("usart2", MC2661, 9.8304_MHz_XTAL / 2) // SCN2661B
- MCFG_DEVICE_ADD("usart3", MC2661, 9.8304_MHz_XTAL / 2) // SCN2661B
- MCFG_DEVICE_ADD("usart4", MC2661, 9.8304_MHz_XTAL / 2) // SCN2661B
-MACHINE_CONFIG_END
+ MC2661(config, "usart1", 9.8304_MHz_XTAL / 2); // SCN2661B
+ MC2661(config, "usart2", 9.8304_MHz_XTAL / 2); // SCN2661B
+ MC2661(config, "usart3", 9.8304_MHz_XTAL / 2); // SCN2661B
+ MC2661(config, "usart4", 9.8304_MHz_XTAL / 2); // SCN2661B
+}
/* ROM definition */
ROM_START( dual68 )
diff --git a/src/mame/drivers/duet16.cpp b/src/mame/drivers/duet16.cpp
index 3fb6656fb74..a0d31db2481 100644
--- a/src/mame/drivers/duet16.cpp
+++ b/src/mame/drivers/duet16.cpp
@@ -5,6 +5,7 @@
#include "cpu/i86/i86.h"
#include "cpu/mcs48/mcs48.h"
#include "imagedev/floppy.h"
+#include "machine/i8087.h"
#include "machine/i8251.h"
#include "machine/input_merger.h"
#include "machine/pit8253.h"
@@ -69,7 +70,7 @@ private:
MC6845_UPDATE_ROW(crtc_update_row);
void duet16_io(address_map &map);
void duet16_mem(address_map &map);
- required_device<cpu_device> m_maincpu;
+ required_device<i8086_cpu_device> m_maincpu;
required_device<pic8259_device> m_pic;
required_device<upd765a_device> m_fdc;
required_device<am9517a_device> m_dmac;
@@ -352,11 +353,19 @@ static DEVICE_INPUT_DEFAULTS_START(keyboard)
DEVICE_INPUT_DEFAULTS( "RS232_STOPBITS", 0xff, RS232_STOPBITS_2 )
DEVICE_INPUT_DEFAULTS_END
-MACHINE_CONFIG_START(duet16_state::duet16)
- MCFG_DEVICE_ADD("maincpu", I8086, 24_MHz_XTAL / 3)
- MCFG_DEVICE_PROGRAM_MAP(duet16_mem)
- MCFG_DEVICE_IO_MAP(duet16_io)
- MCFG_DEVICE_IRQ_ACKNOWLEDGE_DEVICE("pic", pic8259_device, inta_cb)
+void duet16_state::duet16(machine_config &config)
+{
+ I8086(config, m_maincpu, 24_MHz_XTAL / 3);
+ m_maincpu->set_addrmap(AS_PROGRAM, &duet16_state::duet16_mem);
+ m_maincpu->set_addrmap(AS_IO, &duet16_state::duet16_io);
+ m_maincpu->set_irq_acknowledge_callback("pic", FUNC(pic8259_device::inta_cb));
+ m_maincpu->esc_opcode_handler().set("i8087", FUNC(i8087_device::insn_w));
+ m_maincpu->esc_data_handler().set("i8087", FUNC(i8087_device::addr_w));
+
+ i8087_device &i8087(I8087(config, "i8087", 24_MHz_XTAL / 3));
+ i8087.set_space_86(m_maincpu, AS_PROGRAM);
+ i8087.irq().set(m_pic, FUNC(pic8259_device::ir2_w)); // INT87
+ i8087.busy().set_inputline(m_maincpu, INPUT_LINE_TEST);
I8741(config, "i8741", 20_MHz_XTAL / 4);
@@ -367,8 +376,8 @@ MACHINE_CONFIG_START(duet16_state::duet16)
m_dmac->out_hreq_callback().set(FUNC(duet16_state::hrq_w));
m_dmac->in_memr_callback().set(FUNC(duet16_state::dma_mem_r));
m_dmac->out_memw_callback().set(FUNC(duet16_state::dma_mem_w));
- m_dmac->in_ior_callback<0>().set(m_fdc, FUNC(upd765a_device::mdma_r));
- m_dmac->out_iow_callback<0>().set(m_fdc, FUNC(upd765a_device::mdma_w));
+ m_dmac->in_ior_callback<0>().set(m_fdc, FUNC(upd765a_device::dma_r));
+ m_dmac->out_iow_callback<0>().set(m_fdc, FUNC(upd765a_device::dma_w));
m_dmac->out_eop_callback().set(m_fdc, FUNC(upd765a_device::tc_line_w));
pit8253_device &bgpit(PIT8253(config, "bgpit", 0));
@@ -401,44 +410,40 @@ MACHINE_CONFIG_START(duet16_state::duet16)
kbd.rxd_handler().set("kbusart", FUNC(i8251_device::write_rxd));
kbd.set_option_device_input_defaults("keyboard", DEVICE_INPUT_DEFAULTS_NAME(keyboard));
- MCFG_INPUT_MERGER_ANY_HIGH("kbint")
- MCFG_INPUT_MERGER_OUTPUT_HANDLER(WRITELINE("pic", pic8259_device, ir5_w)) // INT2
+ INPUT_MERGER_ANY_HIGH(config, "kbint").output_handler().set(m_pic, FUNC(pic8259_device::ir5_w)); // INT2
- MCFG_INPUT_MERGER_ANY_HIGH("tmint")
- MCFG_INPUT_MERGER_OUTPUT_HANDLER(WRITELINE("pic", pic8259_device, ir0_w)) // INT6
+ INPUT_MERGER_ANY_HIGH(config, m_tmint).output_handler().set(m_pic, FUNC(pic8259_device::ir0_w)); // INT6
UPD765A(config, m_fdc, 8_MHz_XTAL, true, false);
m_fdc->drq_wr_callback().set(m_dmac, FUNC(am9517a_device::dreq0_w));
m_fdc->intrq_wr_callback().set(m_pic, FUNC(pic8259_device::ir3_w)); // INT4
- MCFG_FLOPPY_DRIVE_ADD("fdc:0", duet16_floppies, "525qd", floppy_image_device::default_floppy_formats)
- MCFG_SLOT_FIXED(true)
- MCFG_FLOPPY_DRIVE_ADD("fdc:1", duet16_floppies, "525qd", floppy_image_device::default_floppy_formats)
- MCFG_SLOT_FIXED(true)
+ FLOPPY_CONNECTOR(config, "fdc:0", duet16_floppies, "525qd", floppy_image_device::default_floppy_formats, true);
+ FLOPPY_CONNECTOR(config, "fdc:1", duet16_floppies, "525qd", floppy_image_device::default_floppy_formats, true);
h46505_device &crtc(H46505(config, "crtc", 2000000));
crtc.set_char_width(8);
crtc.set_update_row_callback(FUNC(duet16_state::crtc_update_row), this);
- MCFG_PALETTE_ADD("palette", 8)
+ PALETTE(config, m_pal).set_entries(8);
PALETTE(config, m_chrpal, palette_device::BRG_3BIT);
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "chrpal", gfx_duet16)
-
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_SIZE(640, 480)
- MCFG_SCREEN_VISIBLE_AREA(0, 640-1, 0, 480-1)
- MCFG_SCREEN_UPDATE_DEVICE("crtc", h46505_device, screen_update)
-
- MCFG_DEVICE_ADD("rtc", MSM58321, 32768_Hz_XTAL)
- MCFG_MSM58321_D0_HANDLER(WRITELINE(*this, duet16_state, rtc_d0_w))
- MCFG_MSM58321_D1_HANDLER(WRITELINE(*this, duet16_state, rtc_d1_w))
- MCFG_MSM58321_D2_HANDLER(WRITELINE(*this, duet16_state, rtc_d2_w))
- MCFG_MSM58321_D3_HANDLER(WRITELINE(*this, duet16_state, rtc_d3_w))
- MCFG_MSM58321_BUSY_HANDLER(WRITELINE(*this, duet16_state, rtc_busy_w))
- MCFG_MSM58321_YEAR0(1980)
- MCFG_MSM58321_DEFAULT_24H(true)
-MACHINE_CONFIG_END
+ GFXDECODE(config, "gfxdecode", m_chrpal, gfx_duet16);
+
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_refresh_hz(60);
+ m_screen->set_size(640, 480);
+ m_screen->set_visarea_full();
+ m_screen->set_screen_update("crtc", FUNC(h46505_device::screen_update));
+
+ MSM58321(config, m_rtc, 32768_Hz_XTAL);
+ m_rtc->d0_handler().set(FUNC(duet16_state::rtc_d0_w));
+ m_rtc->d1_handler().set(FUNC(duet16_state::rtc_d1_w));
+ m_rtc->d2_handler().set(FUNC(duet16_state::rtc_d2_w));
+ m_rtc->d3_handler().set(FUNC(duet16_state::rtc_d3_w));
+ m_rtc->busy_handler().set(FUNC(duet16_state::rtc_busy_w));
+ m_rtc->set_year0(1980);
+ m_rtc->set_default_24h(true);
+}
ROM_START(duet16)
ROM_REGION(0x2000, "rom", 0)
diff --git a/src/mame/drivers/dunhuang.cpp b/src/mame/drivers/dunhuang.cpp
index ab06b3d80db..2ef9246b647 100644
--- a/src/mame/drivers/dunhuang.cpp
+++ b/src/mame/drivers/dunhuang.cpp
@@ -804,27 +804,27 @@ void dunhuang_state::machine_reset()
}
-MACHINE_CONFIG_START(dunhuang_state::dunhuang)
-
+void dunhuang_state::dunhuang(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80,12000000/2)
- MCFG_DEVICE_PROGRAM_MAP(dunhuang_map)
- MCFG_DEVICE_IO_MAP(dunhuang_io_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", dunhuang_state, irq0_line_hold)
+ Z80(config, m_maincpu, 12000000/2);
+ m_maincpu->set_addrmap(AS_PROGRAM, &dunhuang_state::dunhuang_map);
+ m_maincpu->set_addrmap(AS_IO, &dunhuang_state::dunhuang_io_map);
+ m_maincpu->set_vblank_int("screen", FUNC(dunhuang_state::irq0_line_hold));
WATCHDOG_TIMER(config, "watchdog").set_time(attotime::from_seconds(5));
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(512, 256)
- MCFG_SCREEN_VISIBLE_AREA(0+8, 512-8-1, 0+16, 256-16-1)
- MCFG_SCREEN_UPDATE_DRIVER(dunhuang_state, screen_update)
- MCFG_SCREEN_PALETTE("palette")
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_refresh_hz(60);
+ m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ m_screen->set_size(512, 256);
+ m_screen->set_visarea(0+8, 512-8-1, 0+16, 256-16-1);
+ m_screen->set_screen_update(FUNC(dunhuang_state::screen_update));
+ m_screen->set_palette(m_palette);
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_dunhuang)
- MCFG_PALETTE_ADD("palette", 0x100)
+ GFXDECODE(config, m_gfxdecode, m_palette, gfx_dunhuang);
+ PALETTE(config, m_palette).set_entries(0x100);
ramdac_device &ramdac(RAMDAC(config, "ramdac", 0, m_palette)); // HMC HM86171 VGA 256 colour RAMDAC
ramdac.set_addrmap(0, &dunhuang_state::ramdac_map);
@@ -839,9 +839,8 @@ MACHINE_CONFIG_START(dunhuang_state::dunhuang)
ay8910.port_a_write_callback().set(FUNC(dunhuang_state::input_w));
ay8910.add_route(ALL_OUTPUTS, "mono", 0.30);
- MCFG_DEVICE_ADD("oki", OKIM6295, 12000000/8, okim6295_device::PIN7_HIGH)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.80)
-MACHINE_CONFIG_END
+ OKIM6295(config, "oki", 12000000/8, okim6295_device::PIN7_HIGH).add_route(ALL_OUTPUTS, "mono", 0.80);
+}
/***************************************************************************
diff --git a/src/mame/drivers/dvk_kcgd.cpp b/src/mame/drivers/dvk_kcgd.cpp
index 713cd0fc139..d654e026898 100644
--- a/src/mame/drivers/dvk_kcgd.cpp
+++ b/src/mame/drivers/dvk_kcgd.cpp
@@ -346,32 +346,34 @@ static GFXDECODE_START( gfx_kcgd )
GFXDECODE_ENTRY("maincpu", 0112236, kcgd_charlayout, 0, 1)
GFXDECODE_END
-MACHINE_CONFIG_START(kcgd_state::kcgd)
+void kcgd_state::kcgd(machine_config &config)
+{
K1801VM2(config, m_maincpu, XTAL(30'800'000)/4);
m_maincpu->set_addrmap(AS_PROGRAM, &kcgd_state::kcgd_mem);
m_maincpu->set_initial_mode(0100000);
- MCFG_TIMER_DRIVER_ADD_PERIODIC("scantimer", kcgd_state, scanline_callback, attotime::from_hz(50*28*11)) // XXX verify
- MCFG_TIMER_START_DELAY(attotime::from_hz(XTAL(30'800'000)/KCGD_HORZ_START))
+ timer_device &scantimer(TIMER(config, "scantimer"));
+ scantimer.configure_periodic(FUNC(kcgd_state::scanline_callback), attotime::from_hz(50*28*11)); // XXX verify
+ scantimer.set_start_delay(attotime::from_hz(XTAL(30'800'000)/KCGD_HORZ_START));
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_UPDATE_DRIVER(kcgd_state, screen_update)
- MCFG_SCREEN_RAW_PARAMS(XTAL(30'800'000), KCGD_TOTAL_HORZ, KCGD_HORZ_START,
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_screen_update(FUNC(kcgd_state::screen_update));
+ m_screen->set_raw(XTAL(30'800'000), KCGD_TOTAL_HORZ, KCGD_HORZ_START,
KCGD_HORZ_START+KCGD_DISP_HORZ, KCGD_TOTAL_VERT, KCGD_VERT_START,
KCGD_VERT_START+KCGD_DISP_VERT);
- MCFG_SCREEN_PALETTE(m_palette)
+ m_screen->set_palette(m_palette);
PALETTE(config, m_palette, FUNC(kcgd_state::kcgd_palette), 16);
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_kcgd)
+ GFXDECODE(config, "gfxdecode", m_palette, gfx_kcgd);
#if 0
MS7004(config, m_ms7004, 0);
m_ms7004->tx_handler().set("i8251kbd", FUNC(i8251_device::write_rxd));
- MCFG_DEVICE_ADD("keyboard_clock", CLOCK, 4800*16)
- MCFG_CLOCK_SIGNAL_HANDLER(WRITELINE(*this, kcgd_state, write_keyboard_clock))
+ clock_device &keyboard_clock(CLOCK(config, "keyboard_clock", 4800*16));
+ keyboard_clock.signal_handler().set(FUNC(kcgd_state::write_keyboard_clock));
#endif
-MACHINE_CONFIG_END
+}
ROM_START( dvk_kcgd )
ROM_REGION16_BE(0x100000,"maincpu", ROMREGION_ERASE00)
diff --git a/src/mame/drivers/dvk_ksm.cpp b/src/mame/drivers/dvk_ksm.cpp
index 1299bea8ee3..a1e0b109afa 100644
--- a/src/mame/drivers/dvk_ksm.cpp
+++ b/src/mame/drivers/dvk_ksm.cpp
@@ -78,17 +78,16 @@ ksm|DVK KSM,
#define KSM_STATUSLINE_VRAM 0xF8B0
-#define VERBOSE_DBG 0 /* general debug messages */
+//#define LOG_GENERAL (1U << 0) //defined in logmacro.h already
+#define LOG_KEYBOARD (1U << 1)
+#define LOG_DEBUG (1U << 2)
-#define DBG_LOG(N,M,A) \
- do { \
- if(VERBOSE_DBG>=N) \
- { \
- if( M ) \
- logerror("%11.6f at %s: %-24s",machine().time().as_double(),machine().describe_context(),(char*)M ); \
- logerror A; \
- } \
- } while (0)
+//#define VERBOSE (LOG_DEBUG)
+//#define LOG_OUTPUT_FUNC printf
+#include "logmacro.h"
+
+#define LOGKBD(...) LOGMASKED(LOG_KEYBOARD, __VA_ARGS__)
+#define LOGDBG(...) LOGMASKED(LOG_DEBUG, __VA_ARGS__)
class ksm_state : public driver_device
@@ -250,7 +249,7 @@ void ksm_state::video_start()
WRITE8_MEMBER(ksm_state::ksm_ppi_porta_w)
{
- DBG_LOG(1, "PPI port A", ("line %d\n", data));
+ LOG("PPI port A line %d\n", data);
m_video.line = data;
}
@@ -258,7 +257,7 @@ WRITE8_MEMBER(ksm_state::ksm_ppi_portc_w)
{
brgc = (data >> 5) & 3;
- DBG_LOG(1, "PPI port C", ("raw %02x blink %d speed %d\n", data, BIT(data, 7), brgc));
+ LOG("PPI port C raw %02x blink %d speed %d\n", data, BIT(data, 7), brgc);
update_brg(brga, brgb, brgc);
}
@@ -283,7 +282,7 @@ WRITE_LINE_MEMBER(ksm_state::write_brgb)
void ksm_state::update_brg(bool a, bool b, int c)
{
- DBG_LOG(2, "brg", ("%d %d %d\n", a, b, c));
+ LOGDBG("brg %d %d %d\n", a, b, c);
if (a && b) return;
@@ -371,9 +370,8 @@ TIMER_DEVICE_CALLBACK_MEMBER(ksm_state::scanline_callback)
uint16_t y = m_screen->vpos();
uint16_t offset;
- DBG_LOG(2,"scanline_cb",
- ("addr %02x frame %d x %.4d y %.3d row %.2d\n",
- m_video.line, (int)m_screen->frame_number(), m_screen->hpos(), y, y%11));
+ LOGDBG("scanline_cb addr %02x frame %d x %.4d y %.3d row %.2d\n",
+ m_video.line, (int)m_screen->frame_number(), m_screen->hpos(), y, y%11);
if (y < KSM_VERT_START) return;
y -= KSM_VERT_START;
@@ -416,23 +414,23 @@ static GFXDECODE_START( gfx_ksm )
GFXDECODE_ENTRY("chargen", 0x0000, ksm_charlayout, 0, 1)
GFXDECODE_END
-MACHINE_CONFIG_START(ksm_state::ksm)
- MCFG_DEVICE_ADD("maincpu", I8080, XTAL(15'400'000)/10)
- MCFG_DEVICE_PROGRAM_MAP(ksm_mem)
- MCFG_DEVICE_IO_MAP(ksm_io)
- MCFG_DEVICE_IRQ_ACKNOWLEDGE_DEVICE("pic8259", pic8259_device, inta_cb)
+void ksm_state::ksm(machine_config &config)
+{
+ I8080(config, m_maincpu, XTAL(15'400'000)/10);
+ m_maincpu->set_addrmap(AS_PROGRAM, &ksm_state::ksm_mem);
+ m_maincpu->set_addrmap(AS_IO, &ksm_state::ksm_io);
+ m_maincpu->set_irq_acknowledge_callback("pic8259", FUNC(pic8259_device::inta_cb));
- MCFG_TIMER_DRIVER_ADD_SCANLINE("scantimer", ksm_state, scanline_callback, "screen", 0, 1)
+ TIMER(config, "scantimer").configure_scanline(FUNC(ksm_state::scanline_callback), "screen", 0, 1);
- MCFG_SCREEN_ADD_MONOCHROME("screen", RASTER, rgb_t::green())
- MCFG_SCREEN_UPDATE_DRIVER(ksm_state, screen_update)
- MCFG_SCREEN_RAW_PARAMS(XTAL(15'400'000), KSM_TOTAL_HORZ, KSM_HORZ_START,
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER, rgb_t::green());
+ m_screen->set_screen_update(FUNC(ksm_state::screen_update));
+ m_screen->set_raw(XTAL(15'400'000), KSM_TOTAL_HORZ, KSM_HORZ_START,
KSM_HORZ_START+KSM_DISP_HORZ, KSM_TOTAL_VERT, KSM_VERT_START,
KSM_VERT_START+KSM_DISP_VERT);
+ m_screen->set_palette("palette");
- MCFG_SCREEN_PALETTE("palette")
-
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_ksm)
+ GFXDECODE(config, "gfxdecode", "palette", gfx_ksm);
PALETTE(config, "palette", palette_device::MONOCHROME);
PIC8259(config, m_pic8259, 0);
@@ -465,9 +463,9 @@ MACHINE_CONFIG_START(ksm_state::ksm)
m_ms7004->tx_handler().set(m_i8251kbd, FUNC(i8251_device::write_rxd));
// baud rate is supposed to be 4800 but keyboard is slightly faster
- MCFG_DEVICE_ADD("keyboard_clock", CLOCK, 4960*16)
- MCFG_CLOCK_SIGNAL_HANDLER(WRITELINE(*this, ksm_state, write_keyboard_clock))
-MACHINE_CONFIG_END
+ clock_device &keyboard_clock(CLOCK(config, "keyboard_clock", 4960*16));
+ keyboard_clock.signal_handler().set(FUNC(ksm_state::write_keyboard_clock));
+}
ROM_START( dvk_ksm )
ROM_REGION(0x1000, "maincpu", ROMREGION_ERASE00)
diff --git a/src/mame/drivers/dynadice.cpp b/src/mame/drivers/dynadice.cpp
index f1a30943fcf..73048c13abd 100644
--- a/src/mame/drivers/dynadice.cpp
+++ b/src/mame/drivers/dynadice.cpp
@@ -119,10 +119,10 @@ WRITE8_MEMBER(dynadice_state::sound_control_w)
*/
if ((data & 7) == 7)
- m_ay8910->address_w(space, 0, m_ay_data);
+ m_ay8910->address_w(m_ay_data);
if ((data & 7) == 6)
- m_ay8910->data_w(space, 0, m_ay_data);
+ m_ay8910->data_w(m_ay_data);
}
@@ -260,30 +260,30 @@ void dynadice_state::machine_reset()
m_ay_data = 0;
}
-MACHINE_CONFIG_START(dynadice_state::dynadice)
-
+void dynadice_state::dynadice(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD(m_maincpu, I8080, 18.432_MHz_XTAL / 8)
- MCFG_DEVICE_PROGRAM_MAP(dynadice_map)
- MCFG_DEVICE_IO_MAP(dynadice_io_map)
+ I8080(config, m_maincpu, 18.432_MHz_XTAL / 8);
+ m_maincpu->set_addrmap(AS_PROGRAM, &dynadice_state::dynadice_map);
+ m_maincpu->set_addrmap(AS_IO, &dynadice_state::dynadice_io_map);
- MCFG_DEVICE_ADD("audiocpu", Z80, 18.432_MHz_XTAL / 6)
- MCFG_DEVICE_PROGRAM_MAP(dynadice_sound_map)
- MCFG_DEVICE_IO_MAP(dynadice_sound_io_map)
+ z80_device &audiocpu(Z80(config, "audiocpu", 18.432_MHz_XTAL / 6));
+ audiocpu.set_addrmap(AS_PROGRAM, &dynadice_state::dynadice_sound_map);
+ audiocpu.set_addrmap(AS_IO, &dynadice_state::dynadice_sound_io_map);
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(256+16, 256)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 34*8-1, 3*8, 28*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(dynadice_state, screen_update)
- MCFG_SCREEN_PALETTE("palette")
-
- MCFG_DEVICE_ADD(m_gfxdecode, GFXDECODE, "palette", gfx_dynadice)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(256+16, 256);
+ screen.set_visarea(0*8, 34*8-1, 3*8, 28*8-1);
+ screen.set_screen_update(FUNC(dynadice_state::screen_update));
+ screen.set_palette("palette");
+
+ GFXDECODE(config, m_gfxdecode, "palette", gfx_dynadice);
PALETTE(config, "palette", palette_device::BRG_3BIT);
SPEAKER(config, "mono").front_center();
@@ -291,7 +291,7 @@ MACHINE_CONFIG_START(dynadice_state::dynadice)
GENERIC_LATCH_8(config, "soundlatch");
AY8910(config, m_ay8910, 2000000).add_route(ALL_OUTPUTS, "mono", 1.0);
-MACHINE_CONFIG_END
+}
ROM_START( dynadice )
ROM_REGION( 0x10000, "maincpu", 0 )
diff --git a/src/mame/drivers/dynax.cpp b/src/mame/drivers/dynax.cpp
index f0312250ca1..a8195352825 100644
--- a/src/mame/drivers/dynax.cpp
+++ b/src/mame/drivers/dynax.cpp
@@ -4192,13 +4192,13 @@ MACHINE_START_MEMBER(dynax_state,hanamai)
Castle Of Dracula
***************************************************************************/
-MACHINE_CONFIG_START(dynax_state::cdracula)
-
+void dynax_state::cdracula(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, XTAL(21'477'272)/4) /* 5.3693175MHz measured */
- MCFG_DEVICE_PROGRAM_MAP(cdracula_mem_map)
- MCFG_DEVICE_IO_MAP(cdracula_io_map)
- MCFG_DEVICE_IRQ_ACKNOWLEDGE_DEVICE("mainirq", rst_pos_buffer_device, inta_cb) // IM 0 needs an opcode on the data bus
+ Z80(config, m_maincpu, XTAL(21'477'272)/4); /* 5.3693175MHz measured */
+ m_maincpu->set_addrmap(AS_PROGRAM, &dynax_state::cdracula_mem_map);
+ m_maincpu->set_addrmap(AS_IO, &dynax_state::cdracula_io_map);
+ m_maincpu->set_irq_acknowledge_callback("mainirq", FUNC(rst_pos_buffer_device::inta_cb)); // IM 0 needs an opcode on the data bus
MCFG_MACHINE_START_OVERRIDE(dynax_state,dynax)
MCFG_MACHINE_RESET_OVERRIDE(dynax_state,dynax)
@@ -4235,22 +4235,22 @@ MACHINE_CONFIG_START(dynax_state::cdracula)
/* sound hardware */
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("oki", OKIM6295, XTAL(4'000'000) / 4, okim6295_device::PIN7_HIGH) /* 1MHz measured */
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.80)
-MACHINE_CONFIG_END
+ OKIM6295(config, m_oki, XTAL(4'000'000) / 4, okim6295_device::PIN7_HIGH); /* 1MHz measured */
+ m_oki->add_route(ALL_OUTPUTS, "mono", 0.80);
+}
/***************************************************************************
Hana no Mai
***************************************************************************/
-MACHINE_CONFIG_START(dynax_state::hanamai)
-
+void dynax_state::hanamai(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu",Z80,22000000 / 4) /* 5.5MHz */
- MCFG_DEVICE_PROGRAM_MAP(sprtmtch_mem_map)
- MCFG_DEVICE_IO_MAP(hanamai_io_map)
- MCFG_DEVICE_IRQ_ACKNOWLEDGE_DEVICE("mainirq", rst_pos_buffer_device, inta_cb) // IM 0 needs an opcode on the data bus
+ Z80(config, m_maincpu, 22000000 / 4); /* 5.5MHz */
+ m_maincpu->set_addrmap(AS_PROGRAM, &dynax_state::sprtmtch_mem_map);
+ m_maincpu->set_addrmap(AS_IO, &dynax_state::hanamai_io_map);
+ m_maincpu->set_irq_acknowledge_callback("mainirq", FUNC(rst_pos_buffer_device::inta_cb)); // IM 0 needs an opcode on the data bus
MCFG_MACHINE_START_OVERRIDE(dynax_state,hanamai)
MCFG_MACHINE_RESET_OVERRIDE(dynax_state,dynax)
@@ -4302,11 +4302,11 @@ MACHINE_CONFIG_START(dynax_state::hanamai)
ym2203.add_route(2, "mono", 0.20);
ym2203.add_route(3, "mono", 0.50);
- MCFG_DEVICE_ADD("msm", MSM5205, 384000)
- MCFG_MSM5205_VCLK_CB(WRITELINE(*this, dynax_state, adpcm_int)) /* IRQ handler */
- MCFG_MSM5205_PRESCALER_SELECTOR(S48_4B) /* 8 KHz, 4 Bits */
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
-MACHINE_CONFIG_END
+ MSM5205(config, m_msm, 384000);
+ m_msm->vck_legacy_callback().set(FUNC(dynax_state::adpcm_int)); /* IRQ handler */
+ m_msm->set_prescaler_selector(msm5205_device::S48_4B); /* 8 KHz, 4 Bits */
+ m_msm->add_route(ALL_OUTPUTS, "mono", 1.0);
+}
@@ -4314,13 +4314,13 @@ MACHINE_CONFIG_END
Hana Oriduru
***************************************************************************/
-MACHINE_CONFIG_START(dynax_state::hnoridur)
-
+void dynax_state::hnoridur(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu",Z80,XTAL(22'000'000) / 4) /* 5.5MHz */
- MCFG_DEVICE_PROGRAM_MAP(hnoridur_mem_map)
- MCFG_DEVICE_IO_MAP(hnoridur_io_map)
- MCFG_DEVICE_IRQ_ACKNOWLEDGE_DEVICE("mainirq", rst_pos_buffer_device, inta_cb) // IM 0 needs an opcode on the data bus
+ Z80(config, m_maincpu, XTAL(22'000'000) / 4); /* 5.5MHz */
+ m_maincpu->set_addrmap(AS_PROGRAM, &dynax_state::hnoridur_mem_map);
+ m_maincpu->set_addrmap(AS_IO, &dynax_state::hnoridur_io_map);
+ m_maincpu->set_irq_acknowledge_callback("mainirq", FUNC(rst_pos_buffer_device::inta_cb)); // IM 0 needs an opcode on the data bus
MCFG_MACHINE_START_OVERRIDE(dynax_state,dynax)
MCFG_MACHINE_RESET_OVERRIDE(dynax_state,dynax)
@@ -4370,24 +4370,24 @@ MACHINE_CONFIG_START(dynax_state::hnoridur)
YM2413(config, "ym2413", XTAL(3'579'545)).add_route(ALL_OUTPUTS, "mono", 1.0);
- MCFG_DEVICE_ADD("msm", MSM5205, XTAL(384'000))
- MCFG_MSM5205_VCLK_CB(WRITELINE(*this, dynax_state, adpcm_int)) /* IRQ handler */
- MCFG_MSM5205_PRESCALER_SELECTOR(S48_4B) /* 8 KHz, 4 Bits */
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
-MACHINE_CONFIG_END
+ MSM5205(config, m_msm, XTAL(384'000));
+ m_msm->vck_legacy_callback().set(FUNC(dynax_state::adpcm_int)); /* IRQ handler */
+ m_msm->set_prescaler_selector(msm5205_device::S48_4B); /* 8 KHz, 4 Bits */
+ m_msm->add_route(ALL_OUTPUTS, "mono", 1.0);
+}
/***************************************************************************
Hana Jingi
***************************************************************************/
-MACHINE_CONFIG_START(dynax_state::hjingi)
-
+void dynax_state::hjingi(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu",Z80, XTAL(22'000'000) / 4)
- MCFG_DEVICE_PROGRAM_MAP(hjingi_mem_map)
- MCFG_DEVICE_IO_MAP(hjingi_io_map)
- MCFG_DEVICE_IRQ_ACKNOWLEDGE_DEVICE("mainirq", rst_pos_buffer_device, inta_cb) // IM 0 needs an opcode on the data bus
+ Z80(config, m_maincpu, XTAL(22'000'000) / 4);
+ m_maincpu->set_addrmap(AS_PROGRAM, &dynax_state::hjingi_mem_map);
+ m_maincpu->set_addrmap(AS_IO, &dynax_state::hjingi_io_map);
+ m_maincpu->set_irq_acknowledge_callback("mainirq", FUNC(rst_pos_buffer_device::inta_cb)); // IM 0 needs an opcode on the data bus
MCFG_MACHINE_START_OVERRIDE(dynax_state,hjingi)
MCFG_MACHINE_RESET_OVERRIDE(dynax_state,dynax)
@@ -4439,24 +4439,24 @@ MACHINE_CONFIG_START(dynax_state::hjingi)
YM2413(config, "ym2413", XTAL(3'579'545)).add_route(ALL_OUTPUTS, "mono", 1.0);
- MCFG_DEVICE_ADD("msm", MSM5205, XTAL(384'000) )
- MCFG_MSM5205_VCLK_CB(WRITELINE(*this, dynax_state, adpcm_int)) /* IRQ handler */
- MCFG_MSM5205_PRESCALER_SELECTOR(S48_4B) /* 8 KHz, 4 Bits */
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
-MACHINE_CONFIG_END
+ MSM5205(config, m_msm, XTAL(384'000));
+ m_msm->vck_legacy_callback().set(FUNC(dynax_state::adpcm_int)); /* IRQ handler */
+ m_msm->set_prescaler_selector(msm5205_device::S48_4B); /* 8 KHz, 4 Bits */
+ m_msm->add_route(ALL_OUTPUTS, "mono", 1.0);
+}
/***************************************************************************
Sports Match
***************************************************************************/
-MACHINE_CONFIG_START(dynax_state::sprtmtch)
-
+void dynax_state::sprtmtch(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80,22000000 / 4) /* 5.5MHz */
- MCFG_DEVICE_PROGRAM_MAP(sprtmtch_mem_map)
- MCFG_DEVICE_IO_MAP(sprtmtch_io_map)
- MCFG_DEVICE_IRQ_ACKNOWLEDGE_DEVICE("mainirq", rst_pos_buffer_device, inta_cb) // IM 0 needs an opcode on the data bus
+ Z80(config, m_maincpu, 22000000 / 4); /* 5.5MHz */
+ m_maincpu->set_addrmap(AS_PROGRAM, &dynax_state::sprtmtch_mem_map);
+ m_maincpu->set_addrmap(AS_IO, &dynax_state::sprtmtch_io_map);
+ m_maincpu->set_irq_acknowledge_callback("mainirq", FUNC(rst_pos_buffer_device::inta_cb)); // IM 0 needs an opcode on the data bus
MCFG_MACHINE_START_OVERRIDE(dynax_state,hanamai)
MCFG_MACHINE_RESET_OVERRIDE(dynax_state,dynax)
@@ -4502,7 +4502,7 @@ MACHINE_CONFIG_START(dynax_state::sprtmtch)
ym2203.add_route(1, "mono", 0.20);
ym2203.add_route(2, "mono", 0.20);
ym2203.add_route(3, "mono", 1.0);
-MACHINE_CONFIG_END
+}
/***************************************************************************
@@ -4515,12 +4515,12 @@ WRITE_LINE_MEMBER(dynax_state::mjfriday_vblank_w)
m_maincpu->set_input_line(0, HOLD_LINE);
}
-MACHINE_CONFIG_START(dynax_state::mjfriday)
-
+void dynax_state::mjfriday(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu",Z80,24000000/4) /* 6 MHz? */
- MCFG_DEVICE_PROGRAM_MAP(sprtmtch_mem_map)
- MCFG_DEVICE_IO_MAP(mjfriday_io_map)
+ Z80(config, m_maincpu, 24000000/4); /* 6 MHz? */
+ m_maincpu->set_addrmap(AS_PROGRAM, &dynax_state::sprtmtch_mem_map);
+ m_maincpu->set_addrmap(AS_IO, &dynax_state::mjfriday_io_map);
MCFG_MACHINE_START_OVERRIDE(dynax_state,hanamai)
MCFG_MACHINE_RESET_OVERRIDE(dynax_state,dynax)
@@ -4560,87 +4560,85 @@ MACHINE_CONFIG_START(dynax_state::mjfriday)
SPEAKER(config, "mono").front_center();
YM2413(config, "ym2413", 24000000/6).add_route(ALL_OUTPUTS, "mono", 1.0);
-MACHINE_CONFIG_END
+}
/***************************************************************************
Mahjong Dial Q2
***************************************************************************/
-MACHINE_CONFIG_START(dynax_state::mjdialq2)
+void dynax_state::mjdialq2(machine_config &config)
+{
mjfriday(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(mjdialq2_mem_map)
-MACHINE_CONFIG_END
+ m_maincpu->set_addrmap(AS_PROGRAM, &dynax_state::mjdialq2_mem_map);
+}
/***************************************************************************
Yarunara / Quiz TV Q&Q / Mahjong Angels
***************************************************************************/
-MACHINE_CONFIG_START(dynax_state::yarunara)
+void dynax_state::yarunara(machine_config &config)
+{
hnoridur(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(yarunara_mem_map)
- MCFG_DEVICE_IO_MAP(yarunara_io_map)
+ m_maincpu->set_addrmap(AS_PROGRAM, &dynax_state::yarunara_mem_map);
+ m_maincpu->set_addrmap(AS_IO, &dynax_state::yarunara_io_map);
- MCFG_DEVICE_MODIFY("bankdev")
- MCFG_DEVICE_PROGRAM_MAP(yarunara_banked_map)
+ m_bankdev->set_addrmap(AS_PROGRAM, &dynax_state::yarunara_banked_map);
- MCFG_DEVICE_REMOVE("outlatch") // ???
+ config.device_remove("outlatch"); // ???
m_screen->set_visarea(0, 336-1, 8, 256-1-8-1);
/* devices */
MSM6242(config, "rtc", 32.768_kHz_XTAL).out_int_handler().set(m_mainirq, FUNC(rst_pos_buffer_device::rst1_w));
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(dynax_state::mjangels)
+void dynax_state::mjangels(machine_config &config)
+{
yarunara(config);
- MCFG_DEVICE_MODIFY("bankdev")
m_bankdev->set_map(&dynax_state::mjangels_banked_map).set_addr_width(21);
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(dynax_state::quiztvqq)
+void dynax_state::quiztvqq(machine_config &config)
+{
mjangels(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(quiztvqq_mem_map)
-MACHINE_CONFIG_END
+ m_maincpu->set_addrmap(AS_PROGRAM, &dynax_state::quiztvqq_mem_map);
+}
/***************************************************************************
Mahjong Campus Hunting
***************************************************************************/
-MACHINE_CONFIG_START(dynax_state::mcnpshnt)
+void dynax_state::mcnpshnt(machine_config &config)
+{
hnoridur(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(mcnpshnt_mem_map)
- MCFG_DEVICE_IO_MAP(mcnpshnt_io_map)
+ m_maincpu->set_addrmap(AS_PROGRAM, &dynax_state::mcnpshnt_mem_map);
+ m_maincpu->set_addrmap(AS_IO, &dynax_state::mcnpshnt_io_map);
MCFG_VIDEO_START_OVERRIDE(dynax_state,mcnpshnt) // different priorities
-MACHINE_CONFIG_END
+}
/***************************************************************************
7jigen
***************************************************************************/
-MACHINE_CONFIG_START(dynax_state::nanajign)
+void dynax_state::nanajign(machine_config &config)
+{
hnoridur(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(nanajign_mem_map)
- MCFG_DEVICE_IO_MAP(nanajign_io_map)
+ m_maincpu->set_addrmap(AS_PROGRAM, &dynax_state::nanajign_mem_map);
+ m_maincpu->set_addrmap(AS_IO, &dynax_state::nanajign_io_map);
- MCFG_DEVICE_MODIFY("bankdev")
- MCFG_DEVICE_PROGRAM_MAP(nanajign_banked_map)
-MACHINE_CONFIG_END
+ m_bankdev->set_addrmap(AS_PROGRAM, &dynax_state::nanajign_banked_map);
+}
/***************************************************************************
@@ -4661,18 +4659,18 @@ MACHINE_START_MEMBER(dynax_state,jantouki)
}
-MACHINE_CONFIG_START(dynax_state::jantouki)
-
+void dynax_state::jantouki(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu",Z80,22000000 / 4) /* 5.5MHz */
- MCFG_DEVICE_PROGRAM_MAP(jantouki_mem_map)
- MCFG_DEVICE_IO_MAP(jantouki_io_map)
- MCFG_DEVICE_IRQ_ACKNOWLEDGE_DEVICE("mainirq", rst_pos_buffer_device, inta_cb) // IM 0 needs an opcode on the data bus
+ Z80(config, m_maincpu, 22000000 / 4); /* 5.5MHz */
+ m_maincpu->set_addrmap(AS_PROGRAM, &dynax_state::jantouki_mem_map);
+ m_maincpu->set_addrmap(AS_IO, &dynax_state::jantouki_io_map);
+ m_maincpu->set_irq_acknowledge_callback("mainirq", FUNC(rst_pos_buffer_device::inta_cb)); // IM 0 needs an opcode on the data bus
- MCFG_DEVICE_ADD("soundcpu",Z80,22000000 / 4) /* 5.5MHz */
- MCFG_DEVICE_PROGRAM_MAP(jantouki_sound_mem_map)
- MCFG_DEVICE_IO_MAP(jantouki_sound_io_map)
- MCFG_DEVICE_IRQ_ACKNOWLEDGE_DEVICE("soundirq", rst_pos_buffer_device, inta_cb) // IM 0 needs an opcode on the data bus
+ Z80(config, m_soundcpu, 22000000 / 4); /* 5.5MHz */
+ m_soundcpu->set_addrmap(AS_PROGRAM, &dynax_state::jantouki_sound_mem_map);
+ m_soundcpu->set_addrmap(AS_IO, &dynax_state::jantouki_sound_io_map);
+ m_soundcpu->set_irq_acknowledge_callback("soundirq", FUNC(rst_pos_buffer_device::inta_cb)); // IM 0 needs an opcode on the data bus
MCFG_MACHINE_START_OVERRIDE(dynax_state,jantouki)
MCFG_MACHINE_RESET_OVERRIDE(dynax_state,dynax)
@@ -4680,7 +4678,6 @@ MACHINE_CONFIG_START(dynax_state::jantouki)
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
RST_POS_BUFFER(config, m_mainirq, 0).int_callback().set_inputline(m_maincpu, 0);
-
RST_POS_BUFFER(config, m_soundirq, 0).int_callback().set_inputline(m_soundcpu, 0);
LS259(config, m_mainlatch);
@@ -4741,14 +4738,14 @@ MACHINE_CONFIG_START(dynax_state::jantouki)
ym2203.add_route(2, "mono", 0.20);
ym2203.add_route(3, "mono", 0.50);
- MCFG_DEVICE_ADD("msm", MSM5205, 384000)
- MCFG_MSM5205_VCLK_CB(WRITELINE(*this, dynax_state, adpcm_int_cpu1)) /* IRQ handler */
- MCFG_MSM5205_PRESCALER_SELECTOR(S48_4B) /* 8 KHz, 4 Bits */
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
+ MSM5205(config, m_msm, 384000);
+ m_msm->vck_legacy_callback().set(FUNC(dynax_state::adpcm_int_cpu1)); /* IRQ handler */
+ m_msm->set_prescaler_selector(msm5205_device::S48_4B); /* 8 KHz, 4 Bits */
+ m_msm->add_route(ALL_OUTPUTS, "mono", 1.0);
/* devices */
MSM6242(config, "rtc", 32.768_kHz_XTAL);
-MACHINE_CONFIG_END
+}
void dynax_state::janyuki(machine_config &config)
{
@@ -4765,14 +4762,14 @@ void dynax_state::janyuki(machine_config &config)
0xfa and 0xfc are very similar, they should be triggered by the blitter
0xf8 is vblank */
-MACHINE_CONFIG_START(dynax_state::mjelctrn)
+void dynax_state::mjelctrn(machine_config &config)
+{
hnoridur(config);
TMPZ84C015(config.replace(), m_maincpu, XTAL(22'000'000) / 4);
m_maincpu->set_addrmap(AS_PROGRAM, &dynax_state::nanajign_mem_map);
m_maincpu->set_addrmap(AS_IO, &dynax_state::mjelctrn_io_map);
- MCFG_DEVICE_MODIFY("bankdev")
- MCFG_DEVICE_PROGRAM_MAP(mjelctrn_banked_map)
+ m_bankdev->set_addrmap(AS_PROGRAM, &dynax_state::mjelctrn_banked_map);
LS259(config.replace(), m_mainlatch);
m_mainlatch->q_out_cb<0>().set(FUNC(dynax_state::flipscreen_w));
@@ -4780,7 +4777,7 @@ MACHINE_CONFIG_START(dynax_state::mjelctrn)
m_mainlatch->q_out_cb<2>().set(FUNC(dynax_state::layer_half2_w));
// Q3, Q4 seem to be related to wrap around enable
- MCFG_DEVICE_REMOVE("mainirq")
+ config.device_remove("mainirq");
m_screen->screen_vblank().set(m_maincpu, FUNC(tmpz84c015_device::trg0)).invert();
@@ -4788,9 +4785,10 @@ MACHINE_CONFIG_START(dynax_state::mjelctrn)
m_blitter->ready_cb().append(m_maincpu, FUNC(tmpz84c015_device::trg2));
MCFG_VIDEO_START_OVERRIDE(dynax_state,mjelctrn)
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(dynax_state::mjembase)
+void dynax_state::mjembase(machine_config &config)
+{
mjelctrn(config);
tmpz84c015_device &maincpu(*subdevice<tmpz84c015_device>("maincpu"));
@@ -4802,10 +4800,10 @@ MACHINE_CONFIG_START(dynax_state::mjembase)
m_mainlatch->q_out_cb<3>().set(FUNC(dynax_state::coincounter_0_w));
m_mainlatch->q_out_cb<4>().set(FUNC(dynax_state::coincounter_1_w));
- MCFG_DEVICE_REMOVE("outlatch")
+ config.device_remove("outlatch");
MCFG_VIDEO_START_OVERRIDE(dynax_state,mjembase)
-MACHINE_CONFIG_END
+}
/***************************************************************************
Neruton
@@ -4816,10 +4814,11 @@ MACHINE_CONFIG_END
0x40 is vblank
0x46 is a periodic irq? */
-MACHINE_CONFIG_START(dynax_state::neruton)
+void dynax_state::neruton(machine_config &config)
+{
mjelctrn(config);
MCFG_VIDEO_START_OVERRIDE(dynax_state,neruton)
-MACHINE_CONFIG_END
+}
@@ -4842,8 +4841,8 @@ WRITE_LINE_MEMBER(dynax_state::tenkai_blitter_ack_w)
}
-MACHINE_CONFIG_START(dynax_state::tenkai)
-
+void dynax_state::tenkai(machine_config &config)
+{
/* basic machine hardware */
tmp91640_device &tmp(TMP91640(config, m_maincpu, 21472700 / 2));
tmp.set_addrmap(AS_PROGRAM, &dynax_state::tenkai_map);
@@ -4903,7 +4902,7 @@ MACHINE_CONFIG_START(dynax_state::tenkai)
/* devices */
MSM6242(config, "rtc", 32.768_kHz_XTAL).out_int_handler().set_inputline(m_maincpu, INPUT_LINE_IRQ2);
-MACHINE_CONFIG_END
+}
void dynax_state::majrjhdx(machine_config &config)
{
@@ -4922,8 +4921,8 @@ void dynax_state::mjreach(machine_config &config)
Mahjong Gekisha
***************************************************************************/
-MACHINE_CONFIG_START(dynax_state::gekisha)
-
+void dynax_state::gekisha(machine_config &config)
+{
/* basic machine hardware */
tmp90841_device &tmp(TMP90841(config, m_maincpu, XTAL(10'000'000))); // ?
tmp.set_addrmap(AS_PROGRAM, &dynax_state::gekisha_map);
@@ -4973,7 +4972,7 @@ MACHINE_CONFIG_START(dynax_state::gekisha)
ay8910.add_route(ALL_OUTPUTS, "mono", 0.20);
YM2413(config, "ym2413", XTAL(24'000'000) / 8).add_route(ALL_OUTPUTS, "mono", 1.0); // ?
-MACHINE_CONFIG_END
+}
/***************************************************************************
diff --git a/src/mame/drivers/e100.cpp b/src/mame/drivers/e100.cpp
index cd77707ade0..b239287e33e 100644
--- a/src/mame/drivers/e100.cpp
+++ b/src/mame/drivers/e100.cpp
@@ -258,12 +258,12 @@ WRITE8_MEMBER( e100_state::pia_w )
if ((offset & 0x08) == 0x08)
{
LOG("- PIA1\n");
- m_pia1->write(space, offset, data);
+ m_pia1->write(offset, data);
}
if ((offset & 0x10) == 0x10)
{
LOG("- PIA2\n");
- m_pia2->write(space, offset, data);
+ m_pia2->write(offset, data);
}
if (VERBOSE && (offset & 0x18) == 0x18)
{
@@ -284,19 +284,19 @@ READ8_MEMBER( e100_state::pia_r )
{
case 0x18: // read PIA1 and PIA2 at the same time, should really only happen for writes...
{
- uint8_t data1 = m_pia1->read(space, offset);
- uint8_t data2 = m_pia2->read(space, offset);
+ uint8_t data1 = m_pia1->read(offset);
+ uint8_t data2 = m_pia2->read(offset);
logerror("%s: Dual device read may have caused unpredictable results on real hardware\n", FUNCNAME);
data = data1 & data2; // We assume that the stable behaviour is that data lines with a low level by either device succeeds
LOGCS("%s %s[%02x] %02x & %02x -> %02x Dual device read!!\n", PIA1_TAG "/" PIA2_TAG, FUNCNAME, offset, data1, data2, data);
}
break;
case 0x08: // PIA1
- data = m_pia1->read(space, offset);
+ data = m_pia1->read(offset);
LOGCS("%s %s(%02x)\n", PIA1_TAG, FUNCNAME, data);
break;
case 0x10: // PIA2
- data = m_pia2->read(space, offset);
+ data = m_pia2->read(offset);
LOGCS("%s %s(%02x)\n", PIA2_TAG, FUNCNAME, data);
break;
default: // None of the devices are selected
@@ -538,9 +538,10 @@ static INPUT_PORTS_START( e100 )
PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_9_PAD) PORT_CHAR(UCHAR_MAMEKEY(9_PAD))
INPUT_PORTS_END
-MACHINE_CONFIG_START(e100_state::e100)
- MCFG_DEVICE_ADD("maincpu", M6802, XTAL(4'000'000))
- MCFG_DEVICE_PROGRAM_MAP(e100_map)
+void e100_state::e100(machine_config &config)
+{
+ M6802(config, m_maincpu, XTAL(4'000'000));
+ m_maincpu->set_addrmap(AS_PROGRAM, &e100_state::e100_map);
/* Devices */
TTL74145(config, m_kbd_74145, 0);
@@ -585,19 +586,19 @@ MACHINE_CONFIG_START(e100_state::e100)
* Once created it may be given on the commandline or mounted via TAB and select
* E100 supports cassette through the 'LOAD' and 'SAVE' commands with no arguments
*/
- MCFG_CASSETTE_ADD( "cassette" )
- MCFG_CASSETTE_DEFAULT_STATE(CASSETTE_STOPPED | CASSETTE_SPEAKER_MUTED | CASSETTE_MOTOR_ENABLED)
+ CASSETTE(config, m_cassette);
+ m_cassette->set_default_state(CASSETTE_STOPPED | CASSETTE_SPEAKER_MUTED | CASSETTE_MOTOR_ENABLED);
/* screen TODO: simplify the screen config, look at zx.cpp */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_RAW_PARAMS(XTAL(4'000'000)/2, 265, 0, 265, 265, 0, 265)
- MCFG_SCREEN_UPDATE_DRIVER(e100_state, screen_update)
- MCFG_SCREEN_PALETTE("palette")
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_raw(XTAL(4'000'000)/2, 265, 0, 265, 265, 0, 265);
+ screen.set_screen_update(FUNC(e100_state::screen_update));
+ screen.set_palette("palette");
PALETTE(config, "palette", palette_device::MONOCHROME);
/* There is a 50Hz signal from the video circuit to CA1 which generates interrupts and drives a software RTC */
- MCFG_TIMER_DRIVER_ADD_PERIODIC("video50hz", e100_state, rtc_w, attotime::from_hz(100)) /* Will be divided by two through toggle in the handler */
-MACHINE_CONFIG_END
+ TIMER(config, "video50hz").configure_periodic(FUNC(e100_state::rtc_w), attotime::from_hz(100)); /* Will be divided by two through toggle in the handler */
+}
/* ROM sets from Didact was not versioned in general, so the numbering are just assumptions */
ROM_START( e100 )
diff --git a/src/mame/drivers/eacc.cpp b/src/mame/drivers/eacc.cpp
index 54f40da22c3..be855d4e75c 100644
--- a/src/mame/drivers/eacc.cpp
+++ b/src/mame/drivers/eacc.cpp
@@ -245,10 +245,11 @@ WRITE8_MEMBER( eacc_state::eacc_digit_w )
Machine Drivers
******************************************************************************/
-MACHINE_CONFIG_START(eacc_state::eacc)
+void eacc_state::eacc(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M6802, XTAL(3'579'545)) /* Divided by 4 inside the m6802*/
- MCFG_DEVICE_PROGRAM_MAP(eacc_mem)
+ M6802(config, m_maincpu, XTAL(3'579'545)); /* Divided by 4 inside the m6802*/
+ m_maincpu->set_addrmap(AS_PROGRAM, &eacc_state::eacc_mem);
config.set_default_layout(layout_eacc);
@@ -264,9 +265,9 @@ MACHINE_CONFIG_START(eacc_state::eacc)
m_pia->irqb_handler().set_inputline("maincpu", M6802_IRQ_LINE);
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
- MCFG_TIMER_DRIVER_ADD_PERIODIC("eacc_nmi", eacc_state, eacc_nmi, attotime::from_hz(600))
- MCFG_TIMER_DRIVER_ADD_PERIODIC("eacc_cb1", eacc_state, eacc_cb1, attotime::from_hz(30))
-MACHINE_CONFIG_END
+ TIMER(config, "eacc_nmi").configure_periodic(FUNC(eacc_state::eacc_nmi), attotime::from_hz(600));
+ TIMER(config, "eacc_cb1").configure_periodic(FUNC(eacc_state::eacc_cb1), attotime::from_hz(30));
+}
diff --git a/src/mame/drivers/ec184x.cpp b/src/mame/drivers/ec184x.cpp
index 43f1901503b..98a3056406c 100644
--- a/src/mame/drivers/ec184x.cpp
+++ b/src/mame/drivers/ec184x.cpp
@@ -18,19 +18,20 @@
#include "machine/ram.h"
#include "softlist.h"
-#define EC1841_MEMBOARD_SIZE (512*1024)
-#define VERBOSE_DBG 1 /* general debug messages */
+//#define LOG_GENERAL (1U << 0) //defined in logmacro.h already
+#define LOG_KEYBOARD (1U << 1)
+#define LOG_DEBUG (1U << 2)
+
+//#define VERBOSE (LOG_DEBUG)
+//#define LOG_OUTPUT_FUNC printf
+#include "logmacro.h"
+
+#define LOGKBD(...) LOGMASKED(LOG_KEYBOARD, __VA_ARGS__)
+#define LOGDBG(...) LOGMASKED(LOG_DEBUG, __VA_ARGS__)
-#define DBG_LOG(N,M,A) \
- do { \
- if(VERBOSE_DBG>=N) \
- { \
- if( M ) \
- logerror("%11.6f at %s: %-24s",machine().time().as_double(),machine().describe_context(),(char*)M ); \
- logerror A; \
- } \
- } while (0)
+
+#define EC1841_MEMBOARD_SIZE (512*1024)
class ec184x_state : public driver_device
@@ -98,7 +99,7 @@ READ8_MEMBER(ec184x_state::memboard_r)
data = 0xff;
else
data = m_memory.enable[data];
- DBG_LOG(1, "ec1841_memboard", ("R (%d of %d) == %02X\n", offset + 1, m_memory.boards, data));
+ LOG("ec1841_memboard R (%d of %d) == %02X\n", offset + 1, m_memory.boards, data);
return data;
}
@@ -108,7 +109,7 @@ WRITE8_MEMBER(ec184x_state::memboard_w)
address_space &program = m_maincpu->space(AS_PROGRAM);
uint8_t current = m_memory.enable[offset];
- DBG_LOG(1, "ec1841_memboard", ("W (%d of %d) <- %02X (%02X)\n", offset + 1, m_memory.boards, data, current));
+ LOG("ec1841_memboard W (%d of %d) <- %02X (%02X)\n", offset + 1, m_memory.boards, data, current);
if (offset >= m_memory.boards)
{
@@ -119,14 +120,14 @@ WRITE8_MEMBER(ec184x_state::memboard_w)
{
// disable read access
program.unmap_read(0, EC1841_MEMBOARD_SIZE - 1);
- DBG_LOG(1, "ec1841_memboard_w", ("unmap_read(%d)\n", offset));
+ LOG("ec1841_memboard_w unmap_read(%d)\n", offset);
}
if (BIT(current, 3) && !BIT(data, 3))
{
// disable write access
program.unmap_write(0, EC1841_MEMBOARD_SIZE - 1);
- DBG_LOG(1, "ec1841_memboard_w", ("unmap_write(%d)\n", offset));
+ LOG("ec1841_memboard_w unmap_write(%d)\n", offset);
}
if (!BIT(current, 2) && BIT(data, 2))
@@ -136,7 +137,7 @@ WRITE8_MEMBER(ec184x_state::memboard_w)
// enable read access
membank("bank10")->set_base(m_ram->pointer() + offset * EC1841_MEMBOARD_SIZE);
program.install_read_bank(0, EC1841_MEMBOARD_SIZE - 1, "bank10");
- DBG_LOG(1, "ec1841_memboard_w", ("map_read(%d)\n", offset));
+ LOG("ec1841_memboard_w map_read(%d)\n", offset);
}
if (!BIT(current, 3) && BIT(data, 3))
@@ -146,7 +147,7 @@ WRITE8_MEMBER(ec184x_state::memboard_w)
// enable write access
membank("bank20")->set_base(m_ram->pointer() + offset * EC1841_MEMBOARD_SIZE);
program.install_write_bank(0, EC1841_MEMBOARD_SIZE - 1, "bank20");
- DBG_LOG(1, "ec1841_memboard_w", ("map_write(%d)\n", offset));
+ LOG("ec1841_memboard_w map_write(%d)\n", offset);
}
m_memory.enable[offset] = data;
@@ -224,75 +225,78 @@ void ec184x_state::ec1847_io(address_map &map)
// XXX verify everything
-MACHINE_CONFIG_START(ec184x_state::ec1840)
- MCFG_DEVICE_ADD("maincpu", I8088, 4096000)
- MCFG_DEVICE_PROGRAM_MAP(ec1840_map)
- MCFG_DEVICE_IO_MAP(ec1840_io)
- MCFG_DEVICE_IRQ_ACKNOWLEDGE_DEVICE("mb:pic8259", pic8259_device, inta_cb)
+void ec184x_state::ec1840(machine_config &config)
+{
+ I8088(config, m_maincpu, 4096000);
+ m_maincpu->set_addrmap(AS_PROGRAM, &ec184x_state::ec1840_map);
+ m_maincpu->set_addrmap(AS_IO, &ec184x_state::ec1840_io);
+ m_maincpu->set_irq_acknowledge_callback("mb:pic8259", FUNC(pic8259_device::inta_cb));
- MCFG_IBM5150_MOTHERBOARD_ADD("mb","maincpu")
+ IBM5150_MOTHERBOARD(config, "mb", 0).set_cputag(m_maincpu);
// FIXME: determine ISA bus clock
- MCFG_DEVICE_ADD("isa1", ISA8_SLOT, 0, "mb:isa", ec184x_isa8_cards, "ec1840.0002", false)
- MCFG_DEVICE_ADD("isa2", ISA8_SLOT, 0, "mb:isa", ec184x_isa8_cards, "ec1840.0003", false)
- MCFG_DEVICE_ADD("isa3", ISA8_SLOT, 0, "mb:isa", ec184x_isa8_cards, nullptr, false)
- MCFG_DEVICE_ADD("isa4", ISA8_SLOT, 0, "mb:isa", ec184x_isa8_cards, nullptr, false)
- MCFG_DEVICE_ADD("isa5", ISA8_SLOT, 0, "mb:isa", ec184x_isa8_cards, nullptr, false)
- MCFG_DEVICE_ADD("isa6", ISA8_SLOT, 0, "mb:isa", ec184x_isa8_cards, nullptr, false)
+ ISA8_SLOT(config, "isa1", 0, "mb:isa", ec184x_isa8_cards, "ec1840.0002", false);
+ ISA8_SLOT(config, "isa2", 0, "mb:isa", ec184x_isa8_cards, "ec1840.0003", false);
+ ISA8_SLOT(config, "isa3", 0, "mb:isa", ec184x_isa8_cards, nullptr, false);
+ ISA8_SLOT(config, "isa4", 0, "mb:isa", ec184x_isa8_cards, nullptr, false);
+ ISA8_SLOT(config, "isa5", 0, "mb:isa", ec184x_isa8_cards, nullptr, false);
+ ISA8_SLOT(config, "isa6", 0, "mb:isa", ec184x_isa8_cards, nullptr, false);
- MCFG_SOFTWARE_LIST_ADD("flop_list","ec1841")
+ SOFTWARE_LIST(config, "flop_list").set_original("ec1841");
- MCFG_PC_KBDC_SLOT_ADD("mb:pc_kbdc", "kbd", pc_xt_keyboards, STR_KBD_EC_1841)
+ PC_KBDC_SLOT(config, "kbd", pc_xt_keyboards, STR_KBD_EC_1841).set_pc_kbdc_slot(subdevice("mb:pc_kbdc"));
RAM(config, m_ram).set_default_size("512K");
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(ec184x_state::ec1841)
- MCFG_DEVICE_ADD("maincpu", I8086, XTAL(12'288'000) / 3)
- MCFG_DEVICE_PROGRAM_MAP(ec1841_map)
- MCFG_DEVICE_IO_MAP(ec1841_io)
- MCFG_DEVICE_IRQ_ACKNOWLEDGE_DEVICE("mb:pic8259", pic8259_device, inta_cb)
+void ec184x_state::ec1841(machine_config &config)
+{
+ I8086(config, m_maincpu, XTAL(12'288'000) / 3);
+ m_maincpu->set_addrmap(AS_PROGRAM, &ec184x_state::ec1841_map);
+ m_maincpu->set_addrmap(AS_IO, &ec184x_state::ec1841_io);
+ m_maincpu->set_irq_acknowledge_callback("mb:pic8259", FUNC(pic8259_device::inta_cb));
MCFG_MACHINE_RESET_OVERRIDE(ec184x_state, ec1841)
- MCFG_EC1841_MOTHERBOARD_ADD("mb", "maincpu")
+ EC1841_MOTHERBOARD(config, "mb", 0).set_cputag(m_maincpu);
// FIXME: determine ISA bus clock
- MCFG_DEVICE_ADD("isa1", ISA8_SLOT, 0, "mb:isa", ec184x_isa8_cards, "ec1841.0002", false) // cga
- MCFG_DEVICE_ADD("isa2", ISA8_SLOT, 0, "mb:isa", ec184x_isa8_cards, "ec1841.0003", false) // fdc (IRQ6) + mouse port (IRQ2..5)
- MCFG_DEVICE_ADD("isa3", ISA8_SLOT, 0, "mb:isa", ec184x_isa8_cards, "ec1841.0004", false) // lpt (IRQ7||5) [+ serial (IRQx)]
- MCFG_DEVICE_ADD("isa4", ISA8_SLOT, 0, "mb:isa", ec184x_isa8_cards, "hdc", false)
- MCFG_DEVICE_ADD("isa5", ISA8_SLOT, 0, "mb:isa", ec184x_isa8_cards, nullptr, false)
- MCFG_DEVICE_ADD("isa6", ISA8_SLOT, 0, "mb:isa", ec184x_isa8_cards, nullptr, false)
+ ISA8_SLOT(config, "isa1", 0, "mb:isa", ec184x_isa8_cards, "ec1841.0002", false); // cga
+ ISA8_SLOT(config, "isa2", 0, "mb:isa", ec184x_isa8_cards, "ec1841.0003", false); // fdc (IRQ6) + mouse port (IRQ2..5)
+ ISA8_SLOT(config, "isa3", 0, "mb:isa", ec184x_isa8_cards, "ec1841.0004", false); // lpt (IRQ7||5) [+ serial (IRQx)]
+ ISA8_SLOT(config, "isa4", 0, "mb:isa", ec184x_isa8_cards, "hdc", false);
+ ISA8_SLOT(config, "isa5", 0, "mb:isa", ec184x_isa8_cards, nullptr, false);
+ ISA8_SLOT(config, "isa6", 0, "mb:isa", ec184x_isa8_cards, nullptr, false);
- MCFG_SOFTWARE_LIST_ADD("flop_list","ec1841")
+ SOFTWARE_LIST(config, "flop_list").set_original("ec1841");
- MCFG_PC_KBDC_SLOT_ADD("mb:pc_kbdc", "kbd", pc_xt_keyboards, STR_KBD_EC_1841)
+ PC_KBDC_SLOT(config, "kbd", pc_xt_keyboards, STR_KBD_EC_1841).set_pc_kbdc_slot(subdevice("mb:pc_kbdc"));
RAM(config, m_ram).set_default_size("640K").set_extra_options("512K,1024K,1576K,2048K");
-MACHINE_CONFIG_END
+}
// XXX verify everything
-MACHINE_CONFIG_START(ec184x_state::ec1847)
- MCFG_DEVICE_ADD("maincpu", I8088, 4772720)
- MCFG_DEVICE_PROGRAM_MAP(ec1847_map)
- MCFG_DEVICE_IO_MAP(ec1847_io)
- MCFG_DEVICE_IRQ_ACKNOWLEDGE_DEVICE("mb:pic8259", pic8259_device, inta_cb)
+void ec184x_state::ec1847(machine_config &config)
+{
+ I8088(config, m_maincpu, 4772720);
+ m_maincpu->set_addrmap(AS_PROGRAM, &ec184x_state::ec1847_map);
+ m_maincpu->set_addrmap(AS_IO, &ec184x_state::ec1847_io);
+ m_maincpu->set_irq_acknowledge_callback("mb:pic8259", FUNC(pic8259_device::inta_cb));
- MCFG_IBM5160_MOTHERBOARD_ADD("mb","maincpu")
+ IBM5160_MOTHERBOARD(config, "mb", 0).set_cputag(m_maincpu);
// FIXME: determine ISA bus clock
- MCFG_DEVICE_ADD("isa1", ISA8_SLOT, 0, "mb:isa", pc_isa8_cards, "hercules", false) // cga, ega and vga(?) are options too
- MCFG_DEVICE_ADD("isa2", ISA8_SLOT, 0, "mb:isa", pc_isa8_cards, "fdc_xt", false)
- MCFG_DEVICE_ADD("isa3", ISA8_SLOT, 0, "mb:isa", pc_isa8_cards, nullptr, false) // native variant (wd1010 + z80) not emulated
- MCFG_DEVICE_ADD("isa4", ISA8_SLOT, 0, "mb:isa", pc_isa8_cards, nullptr, false) // native serial (2x8251) not emulated
- MCFG_DEVICE_ADD("isa5", ISA8_SLOT, 0, "mb:isa", pc_isa8_cards, nullptr, false)
- MCFG_DEVICE_ADD("isa6", ISA8_SLOT, 0, "mb:isa", pc_isa8_cards, nullptr, false)
+ ISA8_SLOT(config, "isa1", 0, "mb:isa", pc_isa8_cards, "hercules", false); // cga, ega and vga(?) are options too
+ ISA8_SLOT(config, "isa2", 0, "mb:isa", pc_isa8_cards, "fdc_xt", false);
+ ISA8_SLOT(config, "isa3", 0, "mb:isa", pc_isa8_cards, nullptr, false); // native variant (wd1010 + z80) not emulated
+ ISA8_SLOT(config, "isa4", 0, "mb:isa", pc_isa8_cards, nullptr, false); // native serial (2x8251) not emulated
+ ISA8_SLOT(config, "isa5", 0, "mb:isa", pc_isa8_cards, nullptr, false);
+ ISA8_SLOT(config, "isa6", 0, "mb:isa", pc_isa8_cards, nullptr, false);
- MCFG_PC_KBDC_SLOT_ADD("mb:pc_kbdc", "kbd", pc_xt_keyboards, STR_KBD_KEYTRONIC_PC3270)
+ PC_KBDC_SLOT(config, "kbd", pc_xt_keyboards, STR_KBD_KEYTRONIC_PC3270).set_pc_kbdc_slot(subdevice("mb:pc_kbdc"));
RAM(config, m_ram).set_default_size("640K");
-MACHINE_CONFIG_END
+}
ROM_START( ec1840 )
ROM_REGION16_LE(0x10000,"bios", 0)
diff --git a/src/mame/drivers/ec65.cpp b/src/mame/drivers/ec65.cpp
index 1efcc82d158..8a67d6ef703 100644
--- a/src/mame/drivers/ec65.cpp
+++ b/src/mame/drivers/ec65.cpp
@@ -171,21 +171,21 @@ static GFXDECODE_START( gfx_ec65 )
GFXDECODE_ENTRY( "chargen", 0x0000, ec65_charlayout, 0, 1 )
GFXDECODE_END
-MACHINE_CONFIG_START(ec65_state::ec65)
-
+void ec65_state::ec65(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu",M6502, XTAL(4'000'000) / 4)
- MCFG_DEVICE_PROGRAM_MAP(ec65_mem)
+ M6502(config, m_maincpu, XTAL(4'000'000) / 4);
+ m_maincpu->set_addrmap(AS_PROGRAM, &ec65_state::ec65_mem);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */
- MCFG_SCREEN_SIZE(640, 200)
- MCFG_SCREEN_VISIBLE_AREA(0, 640 - 1, 0, 200 - 1)
- MCFG_SCREEN_UPDATE_DEVICE(MC6845_TAG, mc6845_device, screen_update)
-
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_ec65)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */
+ screen.set_size(640, 200);
+ screen.set_visarea_full();
+ screen.set_screen_update(MC6845_TAG, FUNC(mc6845_device::screen_update));
+
+ GFXDECODE(config, "gfxdecode", m_palette, gfx_ec65);
PALETTE(config, "palette", palette_device::MONOCHROME);
mc6845_device &crtc(MC6845(config, MC6845_TAG, XTAL(16'000'000) / 8));
@@ -208,30 +208,30 @@ MACHINE_CONFIG_START(ec65_state::ec65)
generic_keyboard_device &keyboard(GENERIC_KEYBOARD(config, KEYBOARD_TAG, 0));
keyboard.set_keyboard_callback(FUNC(ec65_state::kbd_put));
-MACHINE_CONFIG_END
-
-MACHINE_CONFIG_START(ec65k_state::ec65k)
+}
+void ec65k_state::ec65k(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu",G65816, XTAL(4'000'000)) // can use 4,2 or 1 MHz
- MCFG_DEVICE_PROGRAM_MAP(ec65k_mem)
+ g65816_device &maincpu(G65816(config, "maincpu", XTAL(4'000'000))); // can use 4,2 or 1 MHz
+ maincpu.set_addrmap(AS_PROGRAM, &ec65k_state::ec65k_mem);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */
- MCFG_SCREEN_SIZE(640, 200)
- MCFG_SCREEN_VISIBLE_AREA(0, 640 - 1, 0, 200 - 1)
- MCFG_SCREEN_UPDATE_DEVICE(MC6845_TAG, mc6845_device, screen_update)
-
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_ec65)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */
+ screen.set_size(640, 200);
+ screen.set_visarea_full();
+ screen.set_screen_update(MC6845_TAG, FUNC(mc6845_device::screen_update));
+
+ GFXDECODE(config, "gfxdecode", "palette", gfx_ec65);
PALETTE(config, "palette", palette_device::MONOCHROME);
mc6845_device &crtc(MC6845(config, MC6845_TAG, XTAL(16'000'000) / 8));
crtc.set_screen("screen");
crtc.set_show_border_area(false);
crtc.set_char_width(8); /*?*/
-MACHINE_CONFIG_END
+}
/* ROM definition */
ROM_START( ec65 )
diff --git a/src/mame/drivers/ecoinf1.cpp b/src/mame/drivers/ecoinf1.cpp
index 39df2f05dab..f0853e9542c 100644
--- a/src/mame/drivers/ecoinf1.cpp
+++ b/src/mame/drivers/ecoinf1.cpp
@@ -253,12 +253,13 @@ static INPUT_PORTS_START( ecoinf1 )
INPUT_PORTS_END
-MACHINE_CONFIG_START(ecoinf1_state::ecoinf1_older)
+void ecoinf1_state::ecoinf1_older(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80,4000000)
- MCFG_DEVICE_PROGRAM_MAP(older_memmap)
- MCFG_DEVICE_IO_MAP(older_portmap)
-MACHINE_CONFIG_END
+ Z80(config, m_maincpu, 4000000);
+ m_maincpu->set_addrmap(AS_PROGRAM, &ecoinf1_state::older_memmap);
+ m_maincpu->set_addrmap(AS_IO, &ecoinf1_state::older_portmap);
+}
/********************************************************************************************************************
diff --git a/src/mame/drivers/ecoinf2.cpp b/src/mame/drivers/ecoinf2.cpp
index fef7051f799..c1d6844ba91 100644
--- a/src/mame/drivers/ecoinf2.cpp
+++ b/src/mame/drivers/ecoinf2.cpp
@@ -542,7 +542,7 @@ void ecoinf2_state::ecoinf2_oxo(machine_config &config)
m_reels[3]->optic_handler().set(FUNC(ecoinf2_state::reel_optic_cb<3>));
METERS(config, m_meters, 0);
- m_meters->set_number_meters(8);
+ m_meters->set_number(8);
// I8255(config, "ic25_dips", 0);
}
diff --git a/src/mame/drivers/ecoinf3.cpp b/src/mame/drivers/ecoinf3.cpp
index 13f690573ad..08aa113dd7c 100644
--- a/src/mame/drivers/ecoinf3.cpp
+++ b/src/mame/drivers/ecoinf3.cpp
@@ -446,7 +446,7 @@ void ecoinf3_state::pyramid_portmap(address_map &map)
map(0x58, 0x5b).rw("ppi8255_g", FUNC(i8255_device::read), FUNC(i8255_device::write));
map(0x5c, 0x5f).rw("ppi8255_h", FUNC(i8255_device::read), FUNC(i8255_device::write));
// frequently accesses DB after 5B, mirror? bug?
- map(0xDB, 0xDB).w("sn1", FUNC(sn76489_device::command_w)); // no idea what the sound chip is, this sounds terrible
+ map(0xDB, 0xDB).w("sn1", FUNC(sn76489_device::write)); // no idea what the sound chip is, this sounds terrible
}
diff --git a/src/mame/drivers/efdt.cpp b/src/mame/drivers/efdt.cpp
index df5618971ac..cf5bd51cdef 100644
--- a/src/mame/drivers/efdt.cpp
+++ b/src/mame/drivers/efdt.cpp
@@ -544,15 +544,15 @@ GFXDECODE_END
* Machine Driver *
*********************************************/
-MACHINE_CONFIG_START( efdt_state::efdt )
-
+void efdt_state::efdt(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, Z80_CLOCK)
- MCFG_DEVICE_PROGRAM_MAP(efdt_map)
+ Z80(config, m_maincpu, Z80_CLOCK);
+ m_maincpu->set_addrmap(AS_PROGRAM, &efdt_state::efdt_map);
- MCFG_DEVICE_ADD("audiocpu", M6802, F6802_CLOCK)
- MCFG_DEVICE_PROGRAM_MAP(efdt_snd_map)
- MCFG_DEVICE_PERIODIC_INT_DRIVER(efdt_state, irq0_line_hold, F6802_CLOCK / 8192)
+ M6802(config, m_audiocpu, F6802_CLOCK);
+ m_audiocpu->set_addrmap(AS_PROGRAM, &efdt_state::efdt_snd_map);
+ m_audiocpu->set_periodic_int(FUNC(efdt_state::irq0_line_hold), attotime::from_hz(F6802_CLOCK / 8192));
LS259(config, m_vlatch[0]);
m_vlatch[0]->q_out_cb<0>().set(FUNC(efdt_state::nmi_clear_w));
@@ -562,14 +562,14 @@ MACHINE_CONFIG_START( efdt_state::efdt )
WATCHDOG_TIMER(config, "watchdog");
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_SIZE(32*8, 32*8)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500))
- MCFG_SCREEN_VISIBLE_AREA(0, 32*8 - 1, 16, 30*8 - 1)
- MCFG_SCREEN_UPDATE_DRIVER(efdt_state, screen_update_efdt)
- MCFG_SCREEN_PALETTE(m_palette)
- MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE(*this, efdt_state, vblank_nmi_w))
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_size(32*8, 32*8);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500));
+ screen.set_visarea(0, 32*8 - 1, 16, 30*8 - 1);
+ screen.set_screen_update(FUNC(efdt_state::screen_update_efdt));
+ screen.set_palette(m_palette);
+ screen.screen_vblank().set(FUNC(efdt_state::vblank_nmi_w));
GFXDECODE(config, m_gfxdecode, m_palette, gfx_efdt);
PALETTE(config, m_palette, FUNC(efdt_state::efdt_palette), 256);
@@ -590,8 +590,7 @@ MACHINE_CONFIG_START( efdt_state::efdt )
ay2.port_b_read_callback().set(FUNC(efdt_state::soundlatch_3_r));
ay2.port_a_write_callback().set(FUNC(efdt_state::soundlatch_2_w));
ay2.port_b_write_callback().set(FUNC(efdt_state::soundlatch_3_w));
-
-MACHINE_CONFIG_END
+}
/*********************************************
diff --git a/src/mame/drivers/egghunt.cpp b/src/mame/drivers/egghunt.cpp
index 41f67502fcb..29d48c6fe2e 100644
--- a/src/mame/drivers/egghunt.cpp
+++ b/src/mame/drivers/egghunt.cpp
@@ -428,28 +428,28 @@ void egghunt_state::machine_reset()
m_vidram_bank = 0;
}
-MACHINE_CONFIG_START(egghunt_state::egghunt)
-
+void egghunt_state::egghunt(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80,12000000/2) /* 6 MHz ?*/
- MCFG_DEVICE_PROGRAM_MAP(egghunt_map)
- MCFG_DEVICE_IO_MAP(io_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", egghunt_state, irq0_line_hold) // or 2 like mitchell.c?
+ Z80(config, m_maincpu, 12000000/2); /* 6 MHz ?*/
+ m_maincpu->set_addrmap(AS_PROGRAM, &egghunt_state::egghunt_map);
+ m_maincpu->set_addrmap(AS_IO, &egghunt_state::io_map);
+ m_maincpu->set_vblank_int("screen", FUNC(egghunt_state::irq0_line_hold)); // or 2 like mitchell.cpp?
- MCFG_DEVICE_ADD("audiocpu", Z80,12000000/2) /* 6 MHz ?*/
- MCFG_DEVICE_PROGRAM_MAP(sound_map)
+ Z80(config, m_audiocpu, 12000000/2); /* 6 MHz ?*/
+ m_audiocpu->set_addrmap(AS_PROGRAM, &egghunt_state::sound_map);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(64*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(8*8, 56*8-1, 1*8, 31*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(egghunt_state, screen_update_egghunt)
- MCFG_SCREEN_PALETTE(m_palette)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(64*8, 32*8);
+ screen.set_visarea(8*8, 56*8-1, 1*8, 31*8-1);
+ screen.set_screen_update(FUNC(egghunt_state::screen_update_egghunt));
+ screen.set_palette(m_palette);
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_egghunt)
+ GFXDECODE(config, m_gfxdecode, m_palette, gfx_egghunt);
PALETTE(config, m_palette).set_format(palette_device::xRGB_555, 0x400);
@@ -458,9 +458,8 @@ MACHINE_CONFIG_START(egghunt_state::egghunt)
GENERIC_LATCH_8(config, m_soundlatch);
- MCFG_DEVICE_ADD("oki", OKIM6295, 1056000, okim6295_device::PIN7_HIGH) // clock frequency & pin 7 not verified
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
-MACHINE_CONFIG_END
+ OKIM6295(config, m_oki, 1056000, okim6295_device::PIN7_HIGH).add_route(ALL_OUTPUTS, "mono", 1.0); // clock frequency & pin 7 not verified
+}
ROM_START( egghunt )
ROM_REGION( 0x20000, "maincpu", 0 )
diff --git a/src/mame/drivers/einstein.cpp b/src/mame/drivers/einstein.cpp
index 9b06d8bfd80..b14aebedeb6 100644
--- a/src/mame/drivers/einstein.cpp
+++ b/src/mame/drivers/einstein.cpp
@@ -390,10 +390,6 @@ void einstein_state::machine_start()
m_bank1->configure_entry(1, m_bios->base());
m_bank2->set_base(m_ram->pointer());
m_bank3->set_base(m_ram->pointer() + 0x8000);
-
- // setup expansion slot
- m_pipe->set_program_space(&m_maincpu->space(AS_PROGRAM));
- m_pipe->set_io_space(&m_maincpu->space(AS_IO));
}
void einstein_state::machine_reset()
@@ -428,8 +424,7 @@ void einstein_state::einstein_io(address_map &map)
map(0x00, 0x00).mirror(0xff04).rw(FUNC(einstein_state::reset_r), FUNC(einstein_state::reset_w));
map(0x02, 0x02).mirror(0xff04).rw(m_psg, FUNC(ay8910_device::data_r), FUNC(ay8910_device::address_w));
map(0x03, 0x03).mirror(0xff04).w(m_psg, FUNC(ay8910_device::data_w));
- map(0x08, 0x08).mirror(0xff06).rw("vdp", FUNC(tms9129_device::vram_r), FUNC(tms9129_device::vram_w));
- map(0x09, 0x09).mirror(0xff06).rw("vdp", FUNC(tms9129_device::register_r), FUNC(tms9129_device::register_w));
+ map(0x08, 0x09).mirror(0xff06).rw("vdp", FUNC(tms9129_device::read), FUNC(tms9129_device::write));
map(0x10, 0x11).mirror(0xff06).rw(IC_I060, FUNC(i8251_device::read), FUNC(i8251_device::write));
map(0x18, 0x1b).mirror(0xff04).rw(m_fdc, FUNC(wd1770_device::read), FUNC(wd1770_device::write));
map(0x20, 0x20).mirror(0xff00).rw(FUNC(einstein_state::kybint_msk_r), FUNC(einstein_state::kybint_msk_w));
@@ -576,7 +571,8 @@ static void einstein_floppies(device_slot_interface &device)
device.option_add("35dd", FLOPPY_35_DD);
}
-MACHINE_CONFIG_START(einstein_state::einstein)
+void einstein_state::einstein(machine_config &config)
+{
/* basic machine hardware */
Z80(config, m_maincpu, XTAL_X002 / 2);
m_maincpu->set_addrmap(AS_PROGRAM, &einstein_state::einstein_mem);
@@ -585,7 +581,7 @@ MACHINE_CONFIG_START(einstein_state::einstein)
/* this is actually clocked at the system clock 4 MHz, but this would be too fast for our
driver. So we update at 50Hz and hope this is good enough. */
- MCFG_TIMER_DRIVER_ADD_PERIODIC("keyboard", einstein_state, keyboard_timer_callback, attotime::from_hz(50))
+ TIMER(config, "keyboard").configure_periodic(FUNC(einstein_state::keyboard_timer_callback), attotime::from_hz(50));
z80pio_device& pio(Z80PIO(config, IC_I063, XTAL_X002 / 2));
pio.out_int_callback().set(FUNC(einstein_state::int_w<0>));
@@ -633,15 +629,16 @@ MACHINE_CONFIG_START(einstein_state::einstein)
adc.ch4_callback().set_ioport("analogue_2_y");
/* printer */
- MCFG_DEVICE_ADD(m_centronics, CENTRONICS, centronics_devices, "printer")
- MCFG_CENTRONICS_ACK_HANDLER(WRITELINE(IC_I063, z80pio_device, strobe_a))
- MCFG_CENTRONICS_BUSY_HANDLER(WRITELINE(*this, einstein_state, write_centronics_busy))
- MCFG_CENTRONICS_PERROR_HANDLER(WRITELINE(*this, einstein_state, write_centronics_perror))
- MCFG_CENTRONICS_FAULT_HANDLER(WRITELINE(*this, einstein_state, write_centronics_fault))
+ CENTRONICS(config, m_centronics, centronics_devices, "printer");
+ m_centronics->ack_handler().set(IC_I063, FUNC(z80pio_device::strobe_a));
+ m_centronics->busy_handler().set(FUNC(einstein_state::write_centronics_busy));
+ m_centronics->perror_handler().set(FUNC(einstein_state::write_centronics_perror));
+ m_centronics->fault_handler().set(FUNC(einstein_state::write_centronics_fault));
- MCFG_CENTRONICS_OUTPUT_LATCH_ADD("cent_data_out", "centronics")
+ output_latch_device &cent_data_out(OUTPUT_LATCH(config, "cent_data_out"));
+ m_centronics->set_output_latch(cent_data_out);
- MCFG_TIMER_DRIVER_ADD("strobe", einstein_state, strobe_callback)
+ TIMER(config, m_strobe_timer).configure_generic(FUNC(einstein_state::strobe_callback));
// uart
i8251_device &ic_i060(I8251(config, IC_I060, XTAL_X002 / 4));
@@ -658,13 +655,13 @@ MACHINE_CONFIG_START(einstein_state::einstein)
// floppy
WD1770(config, m_fdc, XTAL_X002);
- MCFG_FLOPPY_DRIVE_ADD(IC_I042 ":0", einstein_floppies, "3ss", floppy_image_device::default_floppy_formats)
- MCFG_FLOPPY_DRIVE_ADD(IC_I042 ":1", einstein_floppies, "3ss", floppy_image_device::default_floppy_formats)
- MCFG_FLOPPY_DRIVE_ADD(IC_I042 ":2", einstein_floppies, "525qd", floppy_image_device::default_floppy_formats)
- MCFG_FLOPPY_DRIVE_ADD(IC_I042 ":3", einstein_floppies, "525qd", floppy_image_device::default_floppy_formats)
+ FLOPPY_CONNECTOR(config, IC_I042 ":0", einstein_floppies, "3ss", floppy_image_device::default_floppy_formats);
+ FLOPPY_CONNECTOR(config, IC_I042 ":1", einstein_floppies, "3ss", floppy_image_device::default_floppy_formats);
+ FLOPPY_CONNECTOR(config, IC_I042 ":2", einstein_floppies, "525qd", floppy_image_device::default_floppy_formats);
+ FLOPPY_CONNECTOR(config, IC_I042 ":3", einstein_floppies, "525qd", floppy_image_device::default_floppy_formats);
/* software lists */
- MCFG_SOFTWARE_LIST_ADD("disk_list","einstein")
+ SOFTWARE_LIST(config, "disk_list").set_original("einstein");
/* RAM is provided by 8k DRAM ICs i009, i010, i011, i012, i013, i014, i015 and i016 */
/* internal ram */
@@ -672,12 +669,13 @@ MACHINE_CONFIG_START(einstein_state::einstein)
// tatung pipe connector
TATUNG_PIPE(config, m_pipe, XTAL_X002 / 2, tatung_pipe_cards, nullptr);
+ m_pipe->set_program_space(m_maincpu, AS_PROGRAM);
+ m_pipe->set_io_space(m_maincpu, AS_IO);
m_pipe->nmi_handler().set_inputline(IC_I001, INPUT_LINE_NMI);
// user port
- MCFG_EINSTEIN_USERPORT_ADD("user")
- MCFG_EINSTEIN_USERPORT_BSTB_HANDLER(WRITELINE(IC_I063, z80pio_device, strobe_b))
-MACHINE_CONFIG_END
+ EINSTEIN_USERPORT(config, "user").bstb_handler().set(IC_I063, FUNC(z80pio_device::strobe_b));
+}
/***************************************************************************
diff --git a/src/mame/drivers/electra.cpp b/src/mame/drivers/electra.cpp
index 59dca302ffa..627f8215ce2 100644
--- a/src/mame/drivers/electra.cpp
+++ b/src/mame/drivers/electra.cpp
@@ -92,20 +92,21 @@ void electra_state::video_start()
{
}
-MACHINE_CONFIG_START(electra_state::electra)
-
+void electra_state::electra(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", NETLIST_CPU, NETLIST_CLOCK)
- MCFG_NETLIST_SETUP(electra)
+ NETLIST_CPU(config, m_maincpu, NETLIST_CLOCK);
+ m_maincpu->set_constructor(netlist_electra);
/* video hardware */
- MCFG_FIXFREQ_ADD("fixfreq", "screen")
- MCFG_FIXFREQ_MONITOR_CLOCK(MASTER_CLOCK)
- MCFG_FIXFREQ_HORZ_PARAMS(H_TOTAL-67,H_TOTAL-40,H_TOTAL-8,H_TOTAL)
- MCFG_FIXFREQ_VERT_PARAMS(V_TOTAL-22,V_TOTAL-19,V_TOTAL-12,V_TOTAL)
- MCFG_FIXFREQ_FIELDCOUNT(1)
- MCFG_FIXFREQ_SYNC_THRESHOLD(0.30)
-MACHINE_CONFIG_END
+ SCREEN(config, "screen", SCREEN_TYPE_RASTER);
+ FIXFREQ(config, m_video).set_screen("screen");
+ m_video->set_monitor_clock(MASTER_CLOCK);
+ m_video->set_horz_params(H_TOTAL-67,H_TOTAL-40,H_TOTAL-8,H_TOTAL);
+ m_video->set_vert_params(V_TOTAL-22,V_TOTAL-19,V_TOTAL-12,V_TOTAL);
+ m_video->set_fieldcount(1);
+ m_video->set_threshold(0.30);
+}
/***************************************************************************
diff --git a/src/mame/drivers/electron.cpp b/src/mame/drivers/electron.cpp
index f05545007ce..cc799facb50 100644
--- a/src/mame/drivers/electron.cpp
+++ b/src/mame/drivers/electron.cpp
@@ -106,7 +106,7 @@ void electron_state::electron64_opcodes(address_map &map)
INPUT_CHANGED_MEMBER(electron_state::trigger_reset)
{
m_maincpu->set_input_line(INPUT_LINE_RESET, newval ? ASSERT_LINE : CLEAR_LINE);
- if (newval)
+ if (!newval)
{
m_exp->reset();
}
@@ -211,7 +211,8 @@ static INPUT_PORTS_START( electron64 )
PORT_CONFSETTING(0x02, "64K")
INPUT_PORTS_END
-MACHINE_CONFIG_START(electron_state::electron)
+void electron_state::electron(machine_config &config)
+{
M6502(config, m_maincpu, 16_MHz_XTAL / 8);
m_maincpu->set_addrmap(AS_PROGRAM, &electron_state::electron_mem);
@@ -222,7 +223,7 @@ MACHINE_CONFIG_START(electron_state::electron)
m_screen->set_video_attributes(VIDEO_UPDATE_SCANLINE);
m_screen->set_palette("palette");
- PALETTE(config, "palette", FUNC(electron_state::electron_colours), 16);
+ PALETTE(config, "palette", FUNC(electron_state::electron_colours), 8);
SPEAKER(config, "mono").front_center();
BEEP(config, m_beeper, 300).add_route(ALL_OUTPUTS, "mono", 1.00);
@@ -235,33 +236,34 @@ MACHINE_CONFIG_START(electron_state::electron)
m_cassette->set_interface("electron_cass");
/* expansion port */
- MCFG_ELECTRON_EXPANSION_SLOT_ADD("exp", electron_expansion_devices, "plus3", false)
- MCFG_ELECTRON_EXPANSION_SLOT_IRQ_HANDLER(INPUTLINE("maincpu", M6502_IRQ_LINE))
- MCFG_ELECTRON_EXPANSION_SLOT_NMI_HANDLER(INPUTLINE("maincpu", M6502_NMI_LINE))
+ ELECTRON_EXPANSION_SLOT(config, m_exp, 16_MHz_XTAL, electron_expansion_devices, "plus3");
+ m_exp->irq_handler().set_inputline(m_maincpu, M6502_IRQ_LINE);
+ m_exp->nmi_handler().set_inputline(m_maincpu, M6502_NMI_LINE);
/* software lists */
SOFTWARE_LIST(config, "cass_list").set_original("electron_cass");
SOFTWARE_LIST(config, "cart_list").set_original("electron_cart");
SOFTWARE_LIST(config, "flop_list").set_original("electron_flop");
SOFTWARE_LIST(config, "rom_list").set_original("electron_rom");
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(electron_state::btm2105)
+void electron_state::btm2105(machine_config &config)
+{
electron(config);
m_screen->set_color(rgb_t::amber());
/* expansion port */
- MCFG_DEVICE_MODIFY("exp")
- MCFG_DEVICE_SLOT_INTERFACE(electron_expansion_devices, "m2105", true)
+ m_exp->set_default_option("m2105");
+ m_exp->set_fixed(true);
/* software lists */
config.device_remove("cass_list");
config.device_remove("cart_list");
config.device_remove("flop_list");
config.device_remove("rom_list");
-MACHINE_CONFIG_END
+}
void electron_state::electron64(machine_config &config)
@@ -275,7 +277,6 @@ void electron_state::electron64(machine_config &config)
}
-/* Electron Rom Load */
ROM_START(electron)
ROM_REGION( 0x4000, "mos", 0 )
ROM_LOAD( "b02_acornos-1.rom", 0x0000, 0x4000, CRC(a0c2cf43) SHA1(a27ce645472cc5497690e4bfab43710efbb0792d) )
diff --git a/src/mame/drivers/elekscmp.cpp b/src/mame/drivers/elekscmp.cpp
index da2cba712b3..41aa33323bd 100644
--- a/src/mame/drivers/elekscmp.cpp
+++ b/src/mame/drivers/elekscmp.cpp
@@ -144,14 +144,15 @@ static INPUT_PORTS_START( elekscmp )
PORT_BIT(0xfe, IP_ACTIVE_HIGH, IPT_UNUSED)
INPUT_PORTS_END
-MACHINE_CONFIG_START(elekscmp_state::elekscmp)
+void elekscmp_state::elekscmp(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu",INS8060, XTAL(4'000'000))
- MCFG_DEVICE_PROGRAM_MAP(mem_map)
+ INS8060(config, m_maincpu, XTAL(4'000'000));
+ m_maincpu->set_addrmap(AS_PROGRAM, &elekscmp_state::mem_map);
/* video hardware */
config.set_default_layout(layout_elekscmp);
-MACHINE_CONFIG_END
+}
/* ROM definition */
ROM_START( elekscmp )
diff --git a/src/mame/drivers/elektronmono.cpp b/src/mame/drivers/elektronmono.cpp
index 92fbd07775d..366f5e350a4 100644
--- a/src/mame/drivers/elektronmono.cpp
+++ b/src/mame/drivers/elektronmono.cpp
@@ -154,13 +154,14 @@ void elekmono_state::elektron_map(address_map &map)
map(0x10000000, 0x107fffff).rom().region("maincpu", 0);
}
-MACHINE_CONFIG_START(elekmono_state::elektron)
- MCFG_DEVICE_ADD("maincpu", MCF5206E, XTAL(25'447'000))
- MCFG_DEVICE_PROGRAM_MAP(elektron_map)
+void elekmono_state::elektron(machine_config &config)
+{
+ MCF5206E(config, m_maincpu, XTAL(25'447'000));
+ m_maincpu->set_addrmap(AS_PROGRAM, &elekmono_state::elektron_map);
SPEAKER(config, "lspeaker").front_left();
SPEAKER(config, "rspeaker").front_right();
-MACHINE_CONFIG_END
+}
static INPUT_PORTS_START( elektron )
INPUT_PORTS_END
diff --git a/src/mame/drivers/elf.cpp b/src/mame/drivers/elf.cpp
index f9ce8358370..316db189ac5 100644
--- a/src/mame/drivers/elf.cpp
+++ b/src/mame/drivers/elf.cpp
@@ -236,7 +236,8 @@ QUICKLOAD_LOAD_MEMBER( elf2_state, elf )
return image_init_result::PASS;
}
-MACHINE_CONFIG_START(elf2_state::elf2)
+void elf2_state::elf2(machine_config &config)
+{
/* basic machine hardware */
CDP1802(config, m_maincpu, XTAL(3'579'545)/2);
m_maincpu->set_addrmap(AS_PROGRAM, &elf2_state::elf2_mem);
@@ -259,28 +260,26 @@ MACHINE_CONFIG_START(elf2_state::elf2)
SCREEN(config, SCREEN_TAG, SCREEN_TYPE_RASTER);
/* devices */
- MCFG_DEVICE_ADD(MM74C923_TAG, MM74C923, 0)
- MCFG_MM74C922_OSC(CAP_U(0.15))
- MCFG_MM74C922_DEBOUNCE(CAP_U(1))
- MCFG_MM74C922_DA_CALLBACK(WRITELINE(*this, elf2_state, da_w))
- MCFG_MM74C922_X1_CALLBACK(IOPORT("X1"))
- MCFG_MM74C922_X2_CALLBACK(IOPORT("X2"))
- MCFG_MM74C922_X3_CALLBACK(IOPORT("X3"))
- MCFG_MM74C922_X4_CALLBACK(IOPORT("X4"))
+ MM74C923(config, m_kb, 0);
+ m_kb->set_cap_osc(CAP_U(0.15));
+ m_kb->set_cap_debounce(CAP_U(1));
+ m_kb->da_wr_callback().set(FUNC(elf2_state::da_w));
+ m_kb->x1_rd_callback().set_ioport("X1");
+ m_kb->x2_rd_callback().set_ioport("X2");
+ m_kb->x3_rd_callback().set_ioport("X3");
+ m_kb->x4_rd_callback().set_ioport("X4");
- MCFG_DEVICE_ADD(DM9368_H_TAG, DM9368, 0)
- MCFG_DM9368_UPDATE_CALLBACK(WRITE8(*this, elf2_state, digit_w<0>))
- MCFG_DEVICE_ADD(DM9368_L_TAG, DM9368, 0)
- MCFG_DM9368_UPDATE_CALLBACK(WRITE8(*this, elf2_state, digit_w<1>))
+ DM9368(config, m_led_h, 0).update_cb().set(FUNC(elf2_state::digit_w<0>));
+ DM9368(config, m_led_l, 0).update_cb().set(FUNC(elf2_state::digit_w<1>));
- MCFG_CASSETTE_ADD("cassette")
- MCFG_CASSETTE_DEFAULT_STATE(CASSETTE_STOPPED | CASSETTE_MOTOR_ENABLED | CASSETTE_SPEAKER_MUTED)
+ CASSETTE(config, m_cassette);
+ m_cassette->set_default_state(CASSETTE_STOPPED | CASSETTE_MOTOR_ENABLED | CASSETTE_SPEAKER_MUTED);
- MCFG_QUICKLOAD_ADD("quickload", elf2_state, elf, "bin", 0)
+ QUICKLOAD(config, "quickload").set_handler(snapquick_load_delegate(&QUICKLOAD_LOAD_NAME(elf2_state, elf), this), "bin");
/* internal ram */
RAM(config, RAM_TAG).set_default_size("256");
-MACHINE_CONFIG_END
+}
/* ROMs */
diff --git a/src/mame/drivers/elwro800.cpp b/src/mame/drivers/elwro800.cpp
index 30a59a8db30..476aae5a0f8 100644
--- a/src/mame/drivers/elwro800.cpp
+++ b/src/mame/drivers/elwro800.cpp
@@ -60,7 +60,7 @@ private:
/* NR signal */
uint8_t m_NR;
- DECLARE_READ8_MEMBER(nmi_r);
+ uint8_t nmi_r();
DECLARE_WRITE8_MEMBER(elwro800jr_fdc_control_w);
DECLARE_READ8_MEMBER(elwro800jr_io_r);
DECLARE_WRITE8_MEMBER(elwro800jr_io_w);
@@ -99,12 +99,12 @@ private:
*
*************************************/
-READ8_MEMBER(elwro800_state::nmi_r)
+uint8_t elwro800_state::nmi_r()
{
if (m_ram_at_0000)
return 0xdf;
else
- return m_bank1->read8(space, 0x66);
+ return m_bank1->read8(0x66);
}
/*************************************
@@ -284,11 +284,11 @@ READ8_MEMBER(elwro800_state::elwro800jr_io_r)
// CSFDC
if (offset & 1)
{
- return m_upd765->fifo_r(space, 0, 0xff);
+ return m_upd765->fifo_r();
}
else
{
- return m_upd765->msr_r(space, 0, 0xff);
+ return m_upd765->msr_r();
}
}
else if (!BIT(cs,4))
@@ -332,7 +332,7 @@ WRITE8_MEMBER(elwro800_state::elwro800jr_io_w)
// CSFDC
if (offset & 1)
{
- m_upd765->fifo_w(space, 0, data, 0xff);
+ m_upd765->fifo_w(data);
}
}
else if (!BIT(cs,4))
@@ -554,24 +554,24 @@ static GFXDECODE_START( gfx_elwro800 )
GFXDECODE_END
-MACHINE_CONFIG_START(elwro800_state::elwro800)
-
+void elwro800_state::elwro800(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu",Z80, 14_MHz_XTAL / 4) /* 3.5 MHz */
- MCFG_DEVICE_PROGRAM_MAP(elwro800_mem)
- MCFG_DEVICE_IO_MAP(elwro800_io)
- MCFG_DEVICE_OPCODES_MAP(elwro800_m1)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", elwro800_state, elwro800jr_interrupt)
+ Z80(config, m_maincpu, 14_MHz_XTAL / 4); /* 3.5 MHz */
+ m_maincpu->set_addrmap(AS_PROGRAM, &elwro800_state::elwro800_mem);
+ m_maincpu->set_addrmap(AS_IO, &elwro800_state::elwro800_io);
+ m_maincpu->set_addrmap(AS_OPCODES, &elwro800_state::elwro800_m1);
+ m_maincpu->set_vblank_int("screen", FUNC(elwro800_state::elwro800jr_interrupt));
MCFG_MACHINE_RESET_OVERRIDE(elwro800_state,elwro800)
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_RAW_PARAMS(14_MHz_XTAL / 2, 448, 0, SPEC_SCREEN_WIDTH, 312, 0, SPEC_SCREEN_HEIGHT)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_raw(14_MHz_XTAL / 2, 448, 0, SPEC_SCREEN_WIDTH, 312, 0, SPEC_SCREEN_HEIGHT);
// Sync and interrupt timings determined by 2716 EPROM
- MCFG_SCREEN_UPDATE_DRIVER(elwro800_state, screen_update_spectrum )
- MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE(*this, elwro800_state, screen_vblank_spectrum))
- MCFG_SCREEN_PALETTE("palette")
+ screen.set_screen_update(FUNC(elwro800_state::screen_update_spectrum));
+ screen.screen_vblank().set(FUNC(elwro800_state::screen_vblank_spectrum));
+ screen.set_palette("palette");
PALETTE(config, "palette", FUNC(elwro800_state::spectrum_palette), 16);
GFXDECODE(config, "gfxdecode", "palette", gfx_elwro800);
@@ -593,28 +593,29 @@ MACHINE_CONFIG_START(elwro800_state::elwro800)
m_centronics->ack_handler().set(FUNC(elwro800_state::write_centronics_ack));
INPUT_BUFFER(config, "cent_data_in");
- MCFG_CENTRONICS_OUTPUT_LATCH_ADD("cent_data_out", "centronics")
+ output_latch_device &cent_data_out(OUTPUT_LATCH(config, "cent_data_out"));
+ m_centronics->set_output_latch(cent_data_out);
I8251(config, m_i8251, 14_MHz_XTAL / 4);
/* sound hardware */
SPEAKER(config, "mono").front_center();
- WAVE(config, "wave", "cassette").add_route(ALL_OUTPUTS, "mono", 0.25);
+ WAVE(config, "wave", m_cassette).add_route(ALL_OUTPUTS, "mono", 0.25);
SPEAKER_SOUND(config, "speaker").add_route(ALL_OUTPUTS, "mono", 0.50);
- MCFG_CASSETTE_ADD( "cassette" )
- MCFG_CASSETTE_FORMATS(tzx_cassette_formats)
- MCFG_CASSETTE_DEFAULT_STATE(CASSETTE_STOPPED | CASSETTE_SPEAKER_ENABLED | CASSETTE_MOTOR_ENABLED)
+ CASSETTE(config, m_cassette);
+ m_cassette->set_formats(tzx_cassette_formats);
+ m_cassette->set_default_state(CASSETTE_STOPPED | CASSETTE_SPEAKER_ENABLED | CASSETTE_MOTOR_ENABLED);
- MCFG_FLOPPY_DRIVE_ADD("upd765:0", elwro800jr_floppies, "525hd", floppy_image_device::default_floppy_formats)
- MCFG_FLOPPY_DRIVE_ADD("upd765:1", elwro800jr_floppies, "525hd", floppy_image_device::default_floppy_formats)
+ FLOPPY_CONNECTOR(config, "upd765:0", elwro800jr_floppies, "525hd", floppy_image_device::default_floppy_formats);
+ FLOPPY_CONNECTOR(config, "upd765:1", elwro800jr_floppies, "525hd", floppy_image_device::default_floppy_formats);
/* internal ram */
RAM(config, RAM_TAG).set_default_size("64K");
ADDRESS_MAP_BANK(config, "bank1").set_map(&elwro800_state::elwro800_bank1).set_data_width(8).set_stride(0x2000);
ADDRESS_MAP_BANK(config, "bank2").set_map(&elwro800_state::elwro800_bank2).set_data_width(8).set_stride(0x2000);
-MACHINE_CONFIG_END
+}
/*************************************
*
diff --git a/src/mame/drivers/embargo.cpp b/src/mame/drivers/embargo.cpp
index 2468e88e6b5..241e1a712bf 100644
--- a/src/mame/drivers/embargo.cpp
+++ b/src/mame/drivers/embargo.cpp
@@ -266,22 +266,21 @@ void embargo_state::machine_reset()
*
*************************************/
-MACHINE_CONFIG_START(embargo_state::embargo)
-
+void embargo_state::embargo(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", S2650, 625000)
- MCFG_DEVICE_PROGRAM_MAP(main_map)
- MCFG_DEVICE_IO_MAP(main_io_map)
- MCFG_DEVICE_DATA_MAP(main_data_map)
+ S2650(config, m_maincpu, 625000);
+ m_maincpu->set_addrmap(AS_PROGRAM, &embargo_state::main_map);
+ m_maincpu->set_addrmap(AS_IO, &embargo_state::main_io_map);
+ m_maincpu->set_addrmap(AS_DATA, &embargo_state::main_data_map);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_SIZE(256, 256)
- MCFG_SCREEN_VISIBLE_AREA(0, 255, 0, 239)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_UPDATE_DRIVER(embargo_state, screen_update_embargo)
-
-MACHINE_CONFIG_END
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_size(256, 256);
+ screen.set_visarea(0, 255, 0, 239);
+ screen.set_refresh_hz(60);
+ screen.set_screen_update(FUNC(embargo_state::screen_update_embargo));
+}
diff --git a/src/mame/drivers/emma2.cpp b/src/mame/drivers/emma2.cpp
index 2a1fa2ebfdb..1c83b0c1d64 100644
--- a/src/mame/drivers/emma2.cpp
+++ b/src/mame/drivers/emma2.cpp
@@ -191,10 +191,11 @@ void emma2_state::machine_reset()
m_dig_change = 0;
}
-MACHINE_CONFIG_START(emma2_state::emma2)
+void emma2_state::emma2(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M6502, 1'000'000)
- MCFG_DEVICE_PROGRAM_MAP(mem_map)
+ M6502(config, m_maincpu, 1'000'000);
+ m_maincpu->set_addrmap(AS_PROGRAM, &emma2_state::mem_map);
/* video hardware */
config.set_default_layout(layout_emma2);
@@ -212,13 +213,13 @@ MACHINE_CONFIG_START(emma2_state::emma2)
m_pia->irqb_handler().set_inputline(m_maincpu, m6502_device::IRQ_LINE);
/* cassette */
- MCFG_CASSETTE_ADD( "cassette" )
- MCFG_CASSETTE_DEFAULT_STATE(CASSETTE_STOPPED | CASSETTE_MOTOR_ENABLED | CASSETTE_SPEAKER_ENABLED)
+ CASSETTE(config, m_cassette);
+ m_cassette->set_default_state(CASSETTE_STOPPED | CASSETTE_MOTOR_ENABLED | CASSETTE_SPEAKER_ENABLED);
/* sound hardware */
SPEAKER(config, "mono").front_center();
- WAVE(config, "wave", "cassette").add_route(ALL_OUTPUTS, "mono", 0.05);
-MACHINE_CONFIG_END
+ WAVE(config, "wave", m_cassette).add_route(ALL_OUTPUTS, "mono", 0.05);
+}
/* ROM definition */
diff --git a/src/mame/drivers/enigma2.cpp b/src/mame/drivers/enigma2.cpp
index 64cf7b590f7..e0f172e9501 100644
--- a/src/mame/drivers/enigma2.cpp
+++ b/src/mame/drivers/enigma2.cpp
@@ -605,21 +605,21 @@ static INPUT_PORTS_START( enigma2a )
INPUT_PORTS_END
-MACHINE_CONFIG_START(enigma2_state::enigma2)
-
+void enigma2_state::enigma2(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, CPU_CLOCK)
- MCFG_DEVICE_PROGRAM_MAP(enigma2_main_cpu_map)
+ Z80(config, m_maincpu, CPU_CLOCK);
+ m_maincpu->set_addrmap(AS_PROGRAM, &enigma2_state::enigma2_main_cpu_map);
- MCFG_DEVICE_ADD("audiocpu", Z80, 2500000)
- MCFG_DEVICE_PROGRAM_MAP(enigma2_audio_cpu_map)
- MCFG_DEVICE_PERIODIC_INT_DRIVER(enigma2_state, irq0_line_hold, 8*52)
+ Z80(config, m_audiocpu, 2500000);
+ m_audiocpu->set_addrmap(AS_PROGRAM, &enigma2_state::enigma2_audio_cpu_map);
+ m_audiocpu->set_periodic_int(FUNC(enigma2_state::irq0_line_hold), attotime::from_hz(8*52));
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_RAW_PARAMS(PIXEL_CLOCK, HTOTAL, HBEND, HBSTART, VTOTAL, VBEND, VBSTART)
- MCFG_SCREEN_UPDATE_DRIVER(enigma2_state, screen_update_enigma2)
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_raw(PIXEL_CLOCK, HTOTAL, HBEND, HBSTART, VTOTAL, VBEND, VBSTART);
+ m_screen->set_screen_update(FUNC(enigma2_state::screen_update_enigma2));
PALETTE(config, m_palette, palette_device::BGR_3BIT);
@@ -630,25 +630,25 @@ MACHINE_CONFIG_START(enigma2_state::enigma2)
aysnd.port_a_read_callback().set(FUNC(enigma2_state::sound_latch_r));
aysnd.port_b_write_callback().set(FUNC(enigma2_state::protection_data_w));
aysnd.add_route(ALL_OUTPUTS, "mono", 1.0);
-MACHINE_CONFIG_END
-
+}
-MACHINE_CONFIG_START(enigma2_state::enigma2a)
+void enigma2_state::enigma2a(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", I8080, CPU_CLOCK)
- MCFG_DEVICE_PROGRAM_MAP(enigma2a_main_cpu_map)
- MCFG_DEVICE_IO_MAP(enigma2a_main_cpu_io_map)
+ I8080(config, m_maincpu, CPU_CLOCK);
+ m_maincpu->set_addrmap(AS_PROGRAM, &enigma2_state::enigma2a_main_cpu_map);
+ m_maincpu->set_addrmap(AS_IO, &enigma2_state::enigma2a_main_cpu_io_map);
- MCFG_DEVICE_ADD("audiocpu", Z80, 2500000)
- MCFG_DEVICE_PROGRAM_MAP(enigma2_audio_cpu_map)
- MCFG_DEVICE_PERIODIC_INT_DRIVER(enigma2_state, irq0_line_hold, 8*52)
+ Z80(config, m_audiocpu, 2500000);
+ m_audiocpu->set_addrmap(AS_PROGRAM, &enigma2_state::enigma2_audio_cpu_map);
+ m_audiocpu->set_periodic_int(FUNC(enigma2_state::irq0_line_hold), attotime::from_hz(8*52));
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_RAW_PARAMS(PIXEL_CLOCK, HTOTAL, HBEND, HBSTART, VTOTAL, VBEND, VBSTART)
- MCFG_SCREEN_UPDATE_DRIVER(enigma2_state, screen_update_enigma2a)
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_raw(PIXEL_CLOCK, HTOTAL, HBEND, HBSTART, VTOTAL, VBEND, VBSTART);
+ m_screen->set_screen_update(FUNC(enigma2_state::screen_update_enigma2a));
/* audio hardware */
SPEAKER(config, "mono").front_center();
@@ -657,7 +657,7 @@ MACHINE_CONFIG_START(enigma2_state::enigma2a)
aysnd.port_a_read_callback().set(FUNC(enigma2_state::sound_latch_r));
aysnd.port_b_write_callback().set(FUNC(enigma2_state::protection_data_w));
aysnd.add_route(ALL_OUTPUTS, "mono", 1.0);
-MACHINE_CONFIG_END
+}
diff --git a/src/mame/drivers/eolith.cpp b/src/mame/drivers/eolith.cpp
index 2f812b13f8d..7608da87cac 100644
--- a/src/mame/drivers/eolith.cpp
+++ b/src/mame/drivers/eolith.cpp
@@ -557,8 +557,8 @@ void eolith_state::eolith45(machine_config &config)
.write_time(attotime::from_usec(250));
// for testing sound sync
-// MCFG_QUANTUM_PERFECT_CPU("maincpu")
-// MCFG_QUANTUM_TIME(attotime::from_hz(6000))
+// config.m_perfect_cpu_quantum = subtag("maincpu");
+// config.m_minimum_quantum = attotime::from_hz(6000);
/* video hardware */
SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
diff --git a/src/mame/drivers/eolith16.cpp b/src/mame/drivers/eolith16.cpp
index d7b6bac7c49..882c27ad7fd 100644
--- a/src/mame/drivers/eolith16.cpp
+++ b/src/mame/drivers/eolith16.cpp
@@ -159,31 +159,32 @@ void eolith16_state::eolith16_palette(palette_device &palette) const
}
-MACHINE_CONFIG_START(eolith16_state::eolith16)
- MCFG_DEVICE_ADD("maincpu", E116T, XTAL(60'000'000)) /* no internal multiplier */
- MCFG_DEVICE_PROGRAM_MAP(eolith16_map)
- MCFG_TIMER_DRIVER_ADD_SCANLINE("scantimer", eolith16_state, eolith_speedup, "screen", 0, 1)
+void eolith16_state::eolith16(machine_config &config)
+{
+ E116T(config, m_maincpu, XTAL(60'000'000)); /* no internal multiplier */
+ m_maincpu->set_addrmap(AS_PROGRAM, &eolith16_state::eolith16_map);
+ TIMER(config, "scantimer").configure_scanline(FUNC(eolith16_state::eolith_speedup), "screen", 0, 1);
EEPROM_93C66_8BIT(config, "eeprom");
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500))
- MCFG_SCREEN_SIZE(512, 262)
- MCFG_SCREEN_VISIBLE_AREA(0, 319, 0, 199)
- MCFG_SCREEN_UPDATE_DRIVER(eolith16_state, screen_update_eolith16)
- MCFG_SCREEN_PALETTE("palette")
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_refresh_hz(60);
+ m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(2500));
+ m_screen->set_size(512, 262);
+ m_screen->set_visarea(0, 319, 0, 199);
+ m_screen->set_screen_update(FUNC(eolith16_state::screen_update_eolith16));
+ m_screen->set_palette("palette");
PALETTE(config, "palette", FUNC(eolith16_state::eolith16_palette), 256);
SPEAKER(config, "lspeaker").front_left();
SPEAKER(config, "rspeaker").front_right();
- MCFG_DEVICE_ADD("oki", OKIM6295, XTAL(1'000'000), okim6295_device::PIN7_HIGH)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 1.0)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 1.0)
-MACHINE_CONFIG_END
+ okim6295_device &oki(OKIM6295(config, "oki", XTAL(1'000'000), okim6295_device::PIN7_HIGH));
+ oki.add_route(ALL_OUTPUTS, "lspeaker", 1.0);
+ oki.add_route(ALL_OUTPUTS, "rspeaker", 1.0);
+}
/*
diff --git a/src/mame/drivers/ep64.cpp b/src/mame/drivers/ep64.cpp
index 00df7844f3d..a5c271c6833 100644
--- a/src/mame/drivers/ep64.cpp
+++ b/src/mame/drivers/ep64.cpp
@@ -174,6 +174,7 @@ Notes: (All IC's shown)
#define CASSETTE1_TAG "cassette1"
#define CASSETTE2_TAG "cassette2"
#define SCREEN_TAG "screen"
+#define EP64_EXPANSION_BUS_TAG "exp"
class ep64_state : public driver_device
{
@@ -543,7 +544,7 @@ INPUT_PORTS_END
void ep64_state::machine_start()
{
if (m_cart->exists())
- m_dave->space(AS_PROGRAM).install_read_handler(0x010000, 0x01ffff, read8_delegate(FUNC(generic_slot_device::read_rom),(generic_slot_device*)m_cart));
+ m_dave->space(AS_PROGRAM).install_read_handler(0x010000, 0x01ffff, read8sm_delegate(FUNC(generic_slot_device::read_rom),(generic_slot_device*)m_cart));
// state saving
save_item(NAME(m_key));
@@ -569,7 +570,7 @@ void ep64_state::machine_reset()
//**************************************************************************
//-------------------------------------------------
-// MACHINE_CONFIG( ep64 )
+// machine_config( ep64 )
//-------------------------------------------------
void ep64_state::ep64(machine_config &config)
@@ -602,7 +603,8 @@ void ep64_state::ep64(machine_config &config)
// devices
EP64_EXPANSION_BUS_SLOT(config, m_exp, nullptr);
- m_exp->set_dave_tag(m_dave);
+ m_exp->set_program_space(m_dave, AS_PROGRAM);
+ m_exp->set_io_space(m_dave, AS_IO);
m_exp->irq_wr().set_inputline(m_maincpu, INPUT_LINE_IRQ0);
m_exp->nmi_wr().set_inputline(m_maincpu, INPUT_LINE_NMI);
m_exp->wait_wr().set_inputline(m_maincpu, Z80_INPUT_LINE_BOGUSWAIT);
@@ -637,7 +639,7 @@ void ep64_state::ep64(machine_config &config)
//-------------------------------------------------
-// MACHINE_CONFIG( ep128 )
+// machine_config( ep128 )
//-------------------------------------------------
void ep64_state::ep128(machine_config &config)
diff --git a/src/mame/drivers/epos.cpp b/src/mame/drivers/epos.cpp
index 65a4f7c3d9f..749408e6f13 100644
--- a/src/mame/drivers/epos.cpp
+++ b/src/mame/drivers/epos.cpp
@@ -457,39 +457,39 @@ MACHINE_START_MEMBER(epos_state,dealer)
MACHINE_START_CALL_MEMBER(epos);
}
-MACHINE_CONFIG_START(epos_state::epos) /* EPOS TRISTAR 8000 PCB */
-
+void epos_state::epos(machine_config &config) /* EPOS TRISTAR 8000 PCB */
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, XTAL(11'000'000)/4) /* 2.75 MHz schematics confirm 11MHz XTAL (see notes) */
- MCFG_DEVICE_PROGRAM_MAP(epos_map)
- MCFG_DEVICE_IO_MAP(epos_io_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", epos_state, irq0_line_hold)
+ Z80(config, m_maincpu, XTAL(11'000'000)/4); /* 2.75 MHz schematics confirm 11MHz XTAL (see notes) */
+ m_maincpu->set_addrmap(AS_PROGRAM, &epos_state::epos_map);
+ m_maincpu->set_addrmap(AS_IO, &epos_state::epos_io_map);
+ m_maincpu->set_vblank_int("screen", FUNC(epos_state::irq0_line_hold));
WATCHDOG_TIMER(config, "watchdog");
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */)
- MCFG_SCREEN_SIZE(272, 241)
- MCFG_SCREEN_VISIBLE_AREA(0, 271, 0, 235)
- MCFG_SCREEN_UPDATE_DRIVER(epos_state, screen_update)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500) /* not accurate */);
+ screen.set_size(272, 241);
+ screen.set_visarea(0, 271, 0, 235);
+ screen.set_screen_update(FUNC(epos_state::screen_update));
PALETTE(config, m_palette, FUNC(epos_state::epos_palette), 32);
/* sound hardware */
SPEAKER(config, "mono").front_center();
AY8912(config, "aysnd", XTAL(11'000'000)/16).add_route(ALL_OUTPUTS, "mono", 1.0); /* 0.6875 MHz, confirmed from schematics */
-MACHINE_CONFIG_END
-
+}
-MACHINE_CONFIG_START(epos_state::dealer) /* EPOS TRISTAR 9000 PCB */
+void epos_state::dealer(machine_config &config) /* EPOS TRISTAR 9000 PCB */
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, XTAL(22'118'400)/8) /* 2.7648 MHz (measured) */
- MCFG_DEVICE_PROGRAM_MAP(dealer_map)
- MCFG_DEVICE_IO_MAP(dealer_io_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", epos_state, irq0_line_hold)
+ Z80(config, m_maincpu, XTAL(22'118'400)/8); /* 2.7648 MHz (measured) */
+ m_maincpu->set_addrmap(AS_PROGRAM, &epos_state::dealer_map);
+ m_maincpu->set_addrmap(AS_IO, &epos_state::dealer_io_map);
+ m_maincpu->set_vblank_int("screen", FUNC(epos_state::irq0_line_hold));
i8255_device &ppi(I8255A(config, "ppi8255"));
ppi.in_pa_callback().set(FUNC(epos_state::i8255_porta_r));
@@ -505,12 +505,12 @@ MACHINE_CONFIG_START(epos_state::dealer) /* EPOS TRISTAR 9000 PCB */
WATCHDOG_TIMER(config, "watchdog");
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */)
- MCFG_SCREEN_SIZE(272, 241)
- MCFG_SCREEN_VISIBLE_AREA(0, 271, 0, 235)
- MCFG_SCREEN_UPDATE_DRIVER(epos_state, screen_update)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500) /* not accurate */);
+ screen.set_size(272, 241);
+ screen.set_visarea(0, 271, 0, 235);
+ screen.set_screen_update(FUNC(epos_state::screen_update));
/* sound hardware */
SPEAKER(config, "mono").front_center();
@@ -519,7 +519,7 @@ MACHINE_CONFIG_START(epos_state::dealer) /* EPOS TRISTAR 9000 PCB */
aysnd.port_a_read_callback().set(FUNC(epos_state::ay_porta_mpx_r));
// port a writes?
aysnd.port_b_write_callback().set(FUNC(epos_state::flip_screen_w)); // flipscreen and ay port a multiplex control
-MACHINE_CONFIG_END
+}
/*************************************
diff --git a/src/mame/drivers/eprom.cpp b/src/mame/drivers/eprom.cpp
index 4e12bfde4d1..f0443b42e3e 100644
--- a/src/mame/drivers/eprom.cpp
+++ b/src/mame/drivers/eprom.cpp
@@ -83,9 +83,9 @@ READ8_MEMBER(eprom_state::adc_r)
if (!m_adc.found())
return 0xff;
- uint8_t result = m_adc->data_r(space, 0);
+ uint8_t result = m_adc->data_r();
if (!machine().side_effects_disabled())
- m_adc->address_offset_start_w(space, offset, 0);
+ m_adc->address_offset_start_w(offset, 0);
return result;
}
@@ -380,16 +380,16 @@ GFXDECODE_END
*
*************************************/
-MACHINE_CONFIG_START(eprom_state::eprom)
-
+void eprom_state::eprom(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M68000, ATARI_CLOCK_14MHz/2)
- MCFG_DEVICE_PROGRAM_MAP(main_map)
+ M68000(config, m_maincpu, ATARI_CLOCK_14MHz/2);
+ m_maincpu->set_addrmap(AS_PROGRAM, &eprom_state::main_map);
- MCFG_DEVICE_ADD("extra", M68000, ATARI_CLOCK_14MHz/2)
- MCFG_DEVICE_PROGRAM_MAP(extra_map)
+ M68000(config, m_extra, ATARI_CLOCK_14MHz/2);
+ m_extra->set_addrmap(AS_PROGRAM, &eprom_state::extra_map);
- MCFG_QUANTUM_TIME(attotime::from_hz(6000))
+ config.m_minimum_quantum = attotime::from_hz(6000);
ADC0809(config, m_adc, ATARI_CLOCK_14MHz/16);
m_adc->in_callback<0>().set_ioport("ADC0");
@@ -402,23 +402,23 @@ MACHINE_CONFIG_START(eprom_state::eprom)
WATCHDOG_TIMER(config, "watchdog");
/* video hardware */
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_eprom)
- MCFG_PALETTE_ADD("palette", 2048)
+ GFXDECODE(config, m_gfxdecode, m_palette, gfx_eprom);
+ PALETTE(config, m_palette).set_entries(2048);
- MCFG_TILEMAP_ADD_STANDARD("playfield", "gfxdecode", 2, eprom_state, get_playfield_tile_info, 8,8, SCAN_COLS, 64,64)
- MCFG_TILEMAP_ADD_STANDARD_TRANSPEN("alpha", "gfxdecode", 2, eprom_state, get_alpha_tile_info, 8,8, SCAN_ROWS, 64,32, 0)
+ TILEMAP(config, m_playfield_tilemap, m_gfxdecode, 2, 8,8, TILEMAP_SCAN_COLS, 64,64).set_info_callback(FUNC(eprom_state::get_playfield_tile_info));
+ TILEMAP(config, m_alpha_tilemap, m_gfxdecode, 2, 8,8, TILEMAP_SCAN_ROWS, 64,32, 0).set_info_callback(FUNC(eprom_state::get_alpha_tile_info));
ATARI_MOTION_OBJECTS(config, m_mob, 0, m_screen, eprom_state::s_mob_config);
m_mob->set_gfxdecode(m_gfxdecode);
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_VIDEO_ATTRIBUTES(VIDEO_UPDATE_BEFORE_VBLANK)
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_video_attributes(VIDEO_UPDATE_BEFORE_VBLANK);
/* note: these parameters are from published specs, not derived */
/* the board uses a SYNGEN chip to generate video signals */
- MCFG_SCREEN_RAW_PARAMS(ATARI_CLOCK_14MHz/2, 456, 0, 336, 262, 0, 240)
- MCFG_SCREEN_UPDATE_DRIVER(eprom_state, screen_update_eprom)
- MCFG_SCREEN_PALETTE("palette")
- MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE(*this, eprom_state, video_int_write_line))
+ m_screen->set_raw(ATARI_CLOCK_14MHz/2, 456, 0, 336, 262, 0, 240);
+ m_screen->set_screen_update(FUNC(eprom_state::screen_update_eprom));
+ m_screen->set_palette(m_palette);
+ m_screen->screen_vblank().set(FUNC(eprom_state::video_int_write_line));
MCFG_VIDEO_START_OVERRIDE(eprom_state,eprom)
@@ -430,39 +430,39 @@ MACHINE_CONFIG_START(eprom_state::eprom)
m_jsa->test_read_cb().set_ioport("260010").bit(1);
m_jsa->add_route(ALL_OUTPUTS, "mono", 1.0);
config.device_remove("jsa:pokey");
-MACHINE_CONFIG_END
-
+}
-MACHINE_CONFIG_START(eprom_state::klaxp)
+void eprom_state::klaxp(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M68000, ATARI_CLOCK_14MHz/2)
- MCFG_DEVICE_PROGRAM_MAP(main_map)
+ M68000(config, m_maincpu, ATARI_CLOCK_14MHz/2);
+ m_maincpu->set_addrmap(AS_PROGRAM, &eprom_state::main_map);
- MCFG_QUANTUM_TIME(attotime::from_hz(600))
+ config.m_minimum_quantum = attotime::from_hz(600);
EEPROM_2804(config, "eeprom").lock_after_write(true);
WATCHDOG_TIMER(config, "watchdog");
/* video hardware */
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_eprom)
- MCFG_PALETTE_ADD("palette", 2048)
+ GFXDECODE(config, m_gfxdecode, m_palette, gfx_eprom);
+ PALETTE(config, m_palette).set_entries(2048);
- MCFG_TILEMAP_ADD_STANDARD("playfield", "gfxdecode", 2, eprom_state, get_playfield_tile_info, 8,8, SCAN_COLS, 64,64)
- MCFG_TILEMAP_ADD_STANDARD_TRANSPEN("alpha", "gfxdecode", 2, eprom_state, get_alpha_tile_info, 8,8, SCAN_ROWS, 64,32, 0)
+ TILEMAP(config, m_playfield_tilemap, m_gfxdecode, 2, 8,8, TILEMAP_SCAN_COLS, 64,64).set_info_callback(FUNC(eprom_state::get_playfield_tile_info));
+ TILEMAP(config, m_alpha_tilemap, m_gfxdecode, 2, 8,8, TILEMAP_SCAN_ROWS, 64,32, 0).set_info_callback(FUNC(eprom_state::get_alpha_tile_info));
ATARI_MOTION_OBJECTS(config, m_mob, 0, m_screen, eprom_state::s_mob_config);
m_mob->set_gfxdecode(m_gfxdecode);
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_VIDEO_ATTRIBUTES(VIDEO_UPDATE_BEFORE_VBLANK)
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_video_attributes(VIDEO_UPDATE_BEFORE_VBLANK);
/* note: these parameters are from published specs, not derived */
/* the board uses a SYNGEN chip to generate video signals */
- MCFG_SCREEN_RAW_PARAMS(ATARI_CLOCK_14MHz/2, 456, 0, 336, 262, 0, 240)
- MCFG_SCREEN_UPDATE_DRIVER(eprom_state, screen_update_eprom)
- MCFG_SCREEN_PALETTE("palette")
- MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE(*this, eprom_state, video_int_write_line))
+ m_screen->set_raw(ATARI_CLOCK_14MHz/2, 456, 0, 336, 262, 0, 240);
+ m_screen->set_screen_update(FUNC(eprom_state::screen_update_eprom));
+ m_screen->set_palette(m_palette);
+ m_screen->screen_vblank().set(FUNC(eprom_state::video_int_write_line));
MCFG_VIDEO_START_OVERRIDE(eprom_state,eprom)
@@ -473,16 +473,16 @@ MACHINE_CONFIG_START(eprom_state::klaxp)
m_jsa->main_int_cb().set_inputline(m_maincpu, M68K_IRQ_6);
m_jsa->test_read_cb().set_ioport("260010").bit(1);
m_jsa->add_route(ALL_OUTPUTS, "mono", 1.0);
-MACHINE_CONFIG_END
-
+}
-MACHINE_CONFIG_START(eprom_state::guts)
+void eprom_state::guts(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M68000, ATARI_CLOCK_14MHz/2)
- MCFG_DEVICE_PROGRAM_MAP(guts_map)
+ M68000(config, m_maincpu, ATARI_CLOCK_14MHz/2);
+ m_maincpu->set_addrmap(AS_PROGRAM, &eprom_state::guts_map);
- MCFG_QUANTUM_TIME(attotime::from_hz(600))
+ config.m_minimum_quantum = attotime::from_hz(600);
ADC0809(config, m_adc, ATARI_CLOCK_14MHz/16);
m_adc->in_callback<0>().set_ioport("ADC0");
@@ -495,23 +495,23 @@ MACHINE_CONFIG_START(eprom_state::guts)
WATCHDOG_TIMER(config, "watchdog");
/* video hardware */
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_guts)
- MCFG_PALETTE_ADD("palette", 2048)
+ GFXDECODE(config, m_gfxdecode, m_palette, gfx_guts);
+ PALETTE(config, m_palette).set_entries(2048);
- MCFG_TILEMAP_ADD_STANDARD("playfield", "gfxdecode", 2, eprom_state, guts_get_playfield_tile_info, 8,8, SCAN_COLS, 64,64)
- MCFG_TILEMAP_ADD_STANDARD_TRANSPEN("alpha", "gfxdecode", 2, eprom_state, get_alpha_tile_info, 8,8, SCAN_ROWS, 64,32, 0)
+ TILEMAP(config, m_playfield_tilemap, m_gfxdecode, 2, 8,8, TILEMAP_SCAN_COLS, 64,64).set_info_callback(FUNC(eprom_state::guts_get_playfield_tile_info));
+ TILEMAP(config, m_alpha_tilemap, m_gfxdecode, 2, 8,8, TILEMAP_SCAN_ROWS, 64,32, 0).set_info_callback(FUNC(eprom_state::get_alpha_tile_info));
ATARI_MOTION_OBJECTS(config, m_mob, 0, m_screen, eprom_state::s_guts_mob_config);
m_mob->set_gfxdecode(m_gfxdecode);
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_VIDEO_ATTRIBUTES(VIDEO_UPDATE_BEFORE_VBLANK)
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_video_attributes(VIDEO_UPDATE_BEFORE_VBLANK);
/* note: these parameters are from published specs, not derived */
/* the board uses a SYNGEN chip to generate video signals */
- MCFG_SCREEN_RAW_PARAMS(ATARI_CLOCK_14MHz/2, 456, 0, 336, 262, 0, 240)
- MCFG_SCREEN_UPDATE_DRIVER(eprom_state, screen_update_guts)
- MCFG_SCREEN_PALETTE("palette")
- MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE(*this, eprom_state, video_int_write_line))
+ m_screen->set_raw(ATARI_CLOCK_14MHz/2, 456, 0, 336, 262, 0, 240);
+ m_screen->set_screen_update(FUNC(eprom_state::screen_update_guts));
+ m_screen->set_palette(m_palette);
+ m_screen->screen_vblank().set(FUNC(eprom_state::video_int_write_line));
MCFG_VIDEO_START_OVERRIDE(eprom_state,guts)
@@ -522,7 +522,7 @@ MACHINE_CONFIG_START(eprom_state::guts)
m_jsa->main_int_cb().set_inputline(m_maincpu, M68K_IRQ_6);
m_jsa->test_read_cb().set_ioport("260010").bit(1);
m_jsa->add_route(ALL_OUTPUTS, "mono", 1.0);
-MACHINE_CONFIG_END
+}
diff --git a/src/mame/drivers/equites.cpp b/src/mame/drivers/equites.cpp
index 4996ea32a97..ebec71eb31d 100644
--- a/src/mame/drivers/equites.cpp
+++ b/src/mame/drivers/equites.cpp
@@ -1079,7 +1079,6 @@ void equites_state::common_sound(machine_config &config)
DAC_6BIT_R2R(config, m_dac_1, 0).add_route(ALL_OUTPUTS, "speaker", 0.5); // unknown DAC
DAC_6BIT_R2R(config, m_dac_2, 0).add_route(ALL_OUTPUTS, "speaker", 0.5); // unknown DAC
voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref", 0));
- vref.set_output(5.0);
vref.add_route(0, "dac1", 1.0, DAC_VREF_POS_INPUT);
vref.add_route(0, "dac1", -1.0, DAC_VREF_NEG_INPUT);
vref.add_route(0, "dac2", 1.0, DAC_VREF_POS_INPUT);
diff --git a/src/mame/drivers/ertictac.cpp b/src/mame/drivers/ertictac.cpp
index 7e3b1205c24..2686577a556 100644
--- a/src/mame/drivers/ertictac.cpp
+++ b/src/mame/drivers/ertictac.cpp
@@ -245,7 +245,6 @@ void ertictac_state::ertictac(machine_config &config)
DAC_16BIT_R2R_TWOS_COMPLEMENT(config, m_dac[i], 0).add_route(0, "speaker", 0.05); // unknown DAC
}
voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref", 0));
- vref.set_output(5.0);
vref.add_route(0, "dac0", 1.0, DAC_VREF_POS_INPUT); vref.add_route(0, "dac0", -1.0, DAC_VREF_NEG_INPUT);
vref.add_route(0, "dac1", 1.0, DAC_VREF_POS_INPUT); vref.add_route(0, "dac1", -1.0, DAC_VREF_NEG_INPUT);
vref.add_route(0, "dac2", 1.0, DAC_VREF_POS_INPUT); vref.add_route(0, "dac2", -1.0, DAC_VREF_NEG_INPUT);
diff --git a/src/mame/drivers/esd16.cpp b/src/mame/drivers/esd16.cpp
index ba3ae9dd816..ec6ec003c0e 100644
--- a/src/mame/drivers/esd16.cpp
+++ b/src/mame/drivers/esd16.cpp
@@ -85,70 +85,66 @@ ToDo:
***************************************************************************/
-WRITE16_MEMBER(esd16_state::esd16_sound_command_w)
+WRITE8_MEMBER(esd16_state::sound_command_w)
{
- if (ACCESSING_BITS_0_7)
- {
- m_soundlatch->write(space, 0, data & 0xff);
- m_audiocpu->set_input_line(0, ASSERT_LINE); // Generate an IRQ
- m_maincpu->spin_until_time(attotime::from_usec(50)); // Allow the other CPU to reply
- }
+ m_soundlatch->write(space, 0, data & 0xff);
+ m_maincpu->spin_until_time(attotime::from_usec(50)); // Allow the other CPU to reply
}
-WRITE16_MEMBER(esd16_state::hedpanic_platform_w)
+template<unsigned Layer>
+void esd16_state::vram_w(offs_t offset, u16 data, u16 mem_mask)
+{
+ COMBINE_DATA(&m_vram[Layer][offset]);
+ m_tilemap[Layer]->mark_tile_dirty(offset);
+ m_tilemap_16x16[Layer]->mark_tile_dirty(offset);
+}
+
+void esd16_state::hedpanic_platform_w(u16 data)
{
int offsets = m_headpanic_platform_x[0] + 0x40 * m_headpanic_platform_y[0];
- m_vram_1[offsets] = data;
- m_tilemap_1_16x16->mark_tile_dirty(offsets);
+ m_vram[1][offsets] = data;
+ m_tilemap[1]->mark_tile_dirty(offsets);
+ m_tilemap_16x16[1]->mark_tile_dirty(offsets);
}
-READ16_MEMBER(esd16_state::esd_eeprom_r)
+u8 esd16_state::eeprom_r()
{
- if (ACCESSING_BITS_8_15)
- {
- return ((m_eeprom->do_read() & 0x01) << 15);
- }
-
-// logerror("(0x%06x) unk EEPROM read: %04x\n", m_maincpu->pc(), mem_mask);
- return 0;
+ return ((m_eeprom->do_read() & 0x01) << 7);
}
-WRITE16_MEMBER(esd16_state::esd_eeprom_w)
+void esd16_state::eeprom_w(u8 data)
{
- if (ACCESSING_BITS_8_15)
- ioport("EEPROMOUT")->write(data, 0xffff);
-
-// logerror("(0x%06x) Unk EEPROM write: %04x %04x\n", m_maincpu->pc(), data, mem_mask);
+ m_io_eepromout->write(data, 0xff);
}
-void esd16_state::esd16_io_area_dsw(address_map &map, u32 base)
+void esd16_state::io_area_dsw(address_map &map, u32 base)
{
map(base + 0x0, base + 0x1).nopw(); /* Irq Ack */
map(base + 0x2, base + 0x3).portr("P1_P2");
map(base + 0x4, base + 0x5).portr("SYSTEM");
map(base + 0x6, base + 0x7).portr("DSW");
- map(base + 0x8, base + 0x9).w(FUNC(esd16_state::esd16_tilemap0_color_w));
+ map(base + 0x8, base + 0x9).w(FUNC(esd16_state::tilemap0_color_w));
map(base + 0xa, base + 0xb).nopw(); /* Unknown */
- map(base + 0xc, base + 0xd).w(FUNC(esd16_state::esd16_sound_command_w));
+ map(base + 0xd, base + 0xd).w(FUNC(esd16_state::sound_command_w));
map(base + 0xe, base + 0xf).nopw(); /* n/c */
}
-void esd16_state::esd16_io_area_eeprom(address_map &map, u32 base)
+void esd16_state::io_area_eeprom(address_map &map, u32 base)
{
map(base + 0x0, base + 0x1).nopw(); /* Irq Ack */
map(base + 0x2, base + 0x3).portr("P1_P2");
map(base + 0x4, base + 0x5).portr("SYSTEM");
- map(base + 0x6, base + 0x7).r(FUNC(esd16_state::esd_eeprom_r));
- map(base + 0x8, base + 0x9).w(FUNC(esd16_state::esd16_tilemap0_color_w));
+ map(base + 0x6, base + 0x6).r(FUNC(esd16_state::eeprom_r));
+ map(base + 0x8, base + 0x9).w(FUNC(esd16_state::tilemap0_color_w));
map(base + 0xa, base + 0xb).nopw(); /* Unknown */
- map(base + 0xc, base + 0xd).w(FUNC(esd16_state::esd16_sound_command_w));
- map(base + 0xe, base + 0xf).w(FUNC(esd16_state::esd_eeprom_w));
+ map(base + 0xd, base + 0xd).w(FUNC(esd16_state::sound_command_w));
+ map(base + 0xe, base + 0xf).w(FUNC(esd16_state::eeprom_w));
}
-void esd16_state::esd16_vid_attr_area(address_map &map, u32 base)
+void esd16_state::vid_attr_area(address_map &map, u32 base)
{
map(base + 0x0, base + 0x3).writeonly().share("scroll_0");
map(base + 0x4, base + 0x7).writeonly().share("scroll_1");
@@ -158,20 +154,20 @@ void esd16_state::esd16_vid_attr_area(address_map &map, u32 base)
map(base + 0xe, base + 0xf).writeonly().share("head_layersize");
}
-void esd16_state::esd16_palette_area(address_map &map, u32 base)
+void esd16_state::palette_area(address_map &map, u32 base)
{
map(base + 0x000, base + 0xfff).ram().w("palette", FUNC(palette_device::write16)).share("palette");
}
-void esd16_state::esd16_sprite_area(address_map &map, u32 base)
+void esd16_state::sprite_area(address_map &map, u32 base)
{
map(base + 0x000, base + 0x7ff).writeonly().share("spriteram").mirror(0x000800);
}
-void esd16_state::esd16_vram_area(address_map &map, u32 base)
+void esd16_state::vram_area(address_map &map, u32 base)
{
- map(base + 0x00000, base + 0x03fff).w(FUNC(esd16_state::esd16_vram_0_w)).share("vram_0").mirror(0x4000);
- map(base + 0x20000, base + 0x23fff).w(FUNC(esd16_state::esd16_vram_1_w)).share("vram_1").mirror(0x4000);
+ map(base + 0x00000, base + 0x03fff).w(FUNC(esd16_state::vram_w<0>)).share("vram_0").mirror(0x4000);
+ map(base + 0x20000, base + 0x23fff).w(FUNC(esd16_state::vram_w<1>)).share("vram_1").mirror(0x4000);
}
/*** Memory Maps ***/
@@ -181,11 +177,11 @@ void esd16_state::multchmp_map(address_map &map)
map(0x000000, 0x07ffff).rom();
map(0x100000, 0x10ffff).ram();
- esd16_palette_area(map, 0x200000);
- esd16_sprite_area(map, 0x300000);
- esd16_vram_area(map, 0x400000);
- esd16_vid_attr_area(map, 0x500000);
- esd16_io_area_dsw(map, 0x600000);
+ palette_area(map, 0x200000);
+ sprite_area(map, 0x300000);
+ vram_area(map, 0x400000);
+ vid_attr_area(map, 0x500000);
+ io_area_dsw(map, 0x600000);
map(0x700008, 0x70000b).nopr(); // unused protection?
}
@@ -196,13 +192,13 @@ void esd16_state::jumppop_map(address_map &map)
map(0x120000, 0x123fff).ram();
map(0x1a0000, 0x1a7fff).ram();
- esd16_palette_area(map, 0x140000);
- esd16_sprite_area(map, 0x160000);
- esd16_io_area_dsw(map, 0x180000);
- esd16_vram_area(map, 0x300000);
- esd16_vid_attr_area(map, 0x380000);
+ palette_area(map, 0x140000);
+ sprite_area(map, 0x160000);
+ io_area_dsw(map, 0x180000);
+ vram_area(map, 0x300000);
+ vid_attr_area(map, 0x380000);
- map(0x180008, 0x180009).w(FUNC(esd16_state::esd16_tilemap0_color_jumppop_w)); // todo
+ map(0x180008, 0x180009).w(FUNC(esd16_state::tilemap0_color_jumppop_w)); // todo
}
void esd16_state::hedpanic_map(address_map &map)
@@ -210,11 +206,11 @@ void esd16_state::hedpanic_map(address_map &map)
map(0x000000, 0x07ffff).rom();
map(0x100000, 0x10ffff).ram();
- esd16_palette_area(map, 0x800000);
- esd16_sprite_area(map, 0x900000);
- esd16_vram_area(map, 0xa00000);
- esd16_vid_attr_area(map, 0xb00000);
- esd16_io_area_eeprom(map, 0xc00000);
+ palette_area(map, 0x800000);
+ sprite_area(map, 0x900000);
+ vram_area(map, 0xa00000);
+ vid_attr_area(map, 0xb00000);
+ io_area_eeprom(map, 0xc00000);
map(0xd00008, 0xd00009).w(FUNC(esd16_state::hedpanic_platform_w)); // protection
}
@@ -226,11 +222,11 @@ void esd16_state::mchampdx_map(address_map &map)
map(0x000000, 0x07ffff).rom();
map(0x200000, 0x20ffff).ram();
- esd16_vram_area(map, 0x300000);
- esd16_palette_area(map, 0x400000);
- esd16_io_area_eeprom(map, 0x500000);
- esd16_sprite_area(map, 0x600000);
- esd16_vid_attr_area(map, 0x700000);
+ vram_area(map, 0x300000);
+ palette_area(map, 0x400000);
+ io_area_eeprom(map, 0x500000);
+ sprite_area(map, 0x600000);
+ vid_attr_area(map, 0x700000);
map(0xd00008, 0xd00009).w(FUNC(esd16_state::hedpanic_platform_w)); // not used in mchampdx?
}
@@ -242,11 +238,11 @@ void esd16_state::tangtang_map(address_map &map)
map(0x000000, 0x07ffff).rom();
map(0x700000, 0x70ffff).ram();
- esd16_palette_area(map, 0x100000);
- esd16_sprite_area(map, 0x200000);
- esd16_vram_area(map, 0x300000);
- esd16_vid_attr_area(map, 0x400000);
- esd16_io_area_eeprom(map, 0x500000);
+ palette_area(map, 0x100000);
+ sprite_area(map, 0x200000);
+ vram_area(map, 0x300000);
+ vid_attr_area(map, 0x400000);
+ io_area_eeprom(map, 0x500000);
map(0x600008, 0x600009).w(FUNC(esd16_state::hedpanic_platform_w));
}
@@ -259,34 +255,26 @@ void esd16_state::tangtang_map(address_map &map)
***************************************************************************/
-WRITE8_MEMBER(esd16_state::esd16_sound_rombank_w)
+void esd16_state::sound_rombank_w(u8 data)
{
- int bank = data & 0xf;
- membank("bank1")->set_entry(bank);
+ m_audiobank->set_entry(data & 0xf);
}
-void esd16_state::multchmp_sound_map(address_map &map)
+void esd16_state::sound_map(address_map &map)
{
map(0x0000, 0x7fff).rom(); // ROM
- map(0x8000, 0xbfff).bankr("bank1"); // Banked ROM
+ map(0x8000, 0xbfff).bankr("audiobank"); // Banked ROM
map(0xf800, 0xffff).ram(); // RAM
}
-READ8_MEMBER(esd16_state::esd16_sound_command_r)
-{
- /* Clear IRQ only after reading the command, or some get lost */
- m_audiocpu->set_input_line(0, CLEAR_LINE);
- return m_soundlatch->read(space, 0);
-}
-
-void esd16_state::multchmp_sound_io_map(address_map &map)
+void esd16_state::sound_io_map(address_map &map)
{
map.global_mask(0xff);
map(0x00, 0x01).w("ymsnd", FUNC(ym3812_device::write)); // YM3812
map(0x02, 0x02).rw("oki", FUNC(okim6295_device::read), FUNC(okim6295_device::write)); // M6295
- map(0x03, 0x03).r(FUNC(esd16_state::esd16_sound_command_r)); // From Main CPU
+ map(0x03, 0x03).r(m_soundlatch, FUNC(generic_latch_8_device::read)); // From Main CPU
map(0x04, 0x04).nopw(); // ? $00, $30
- map(0x05, 0x05).w(FUNC(esd16_state::esd16_sound_rombank_w)); // ROM Bank
+ map(0x05, 0x05).w(FUNC(esd16_state::sound_rombank_w)); // ROM Bank
map(0x06, 0x06).noprw(); // ? At the start / ? 1 (End of NMI routine)
}
@@ -484,9 +472,9 @@ static INPUT_PORTS_START( hedpanic )
PORT_BIT( 0xff00, IP_ACTIVE_LOW, IPT_UNKNOWN )
PORT_START( "EEPROMOUT" )
- PORT_BIT( 0x0100, IP_ACTIVE_HIGH, IPT_OUTPUT ) PORT_WRITE_LINE_DEVICE_MEMBER("eeprom", eeprom_serial_93cxx_device, cs_write)
- PORT_BIT( 0x0200, IP_ACTIVE_HIGH, IPT_OUTPUT ) PORT_WRITE_LINE_DEVICE_MEMBER("eeprom", eeprom_serial_93cxx_device, clk_write)
- PORT_BIT( 0x0400, IP_ACTIVE_HIGH, IPT_OUTPUT ) PORT_WRITE_LINE_DEVICE_MEMBER("eeprom", eeprom_serial_93cxx_device, di_write)
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_OUTPUT ) PORT_WRITE_LINE_DEVICE_MEMBER("eeprom", eeprom_serial_93cxx_device, cs_write)
+ PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_OUTPUT ) PORT_WRITE_LINE_DEVICE_MEMBER("eeprom", eeprom_serial_93cxx_device, clk_write)
+ PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_OUTPUT ) PORT_WRITE_LINE_DEVICE_MEMBER("eeprom", eeprom_serial_93cxx_device, di_write)
INPUT_PORTS_END
@@ -521,9 +509,9 @@ static INPUT_PORTS_START( swatpolc )
PORT_BIT( 0xff00, IP_ACTIVE_LOW, IPT_UNKNOWN )
PORT_START( "EEPROMOUT" )
- PORT_BIT( 0x0100, IP_ACTIVE_HIGH, IPT_OUTPUT ) PORT_WRITE_LINE_DEVICE_MEMBER("eeprom", eeprom_serial_93cxx_device, cs_write)
- PORT_BIT( 0x0200, IP_ACTIVE_HIGH, IPT_OUTPUT ) PORT_WRITE_LINE_DEVICE_MEMBER("eeprom", eeprom_serial_93cxx_device, clk_write)
- PORT_BIT( 0x0400, IP_ACTIVE_HIGH, IPT_OUTPUT ) PORT_WRITE_LINE_DEVICE_MEMBER("eeprom", eeprom_serial_93cxx_device, di_write)
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_OUTPUT ) PORT_WRITE_LINE_DEVICE_MEMBER("eeprom", eeprom_serial_93cxx_device, cs_write)
+ PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_OUTPUT ) PORT_WRITE_LINE_DEVICE_MEMBER("eeprom", eeprom_serial_93cxx_device, clk_write)
+ PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_OUTPUT ) PORT_WRITE_LINE_DEVICE_MEMBER("eeprom", eeprom_serial_93cxx_device, di_write)
INPUT_PORTS_END
/***************************************************************************
@@ -542,10 +530,8 @@ static const gfx_layout jumppop_sprite_16x16x4 =
RGN_FRAC(1,2),
4,
{ RGN_FRAC(1,2)+8, RGN_FRAC(1,2)+0, 8, 0 },
- { 32*8+0, 32*8+1, 32*8+2, 32*8+3, 32*8+4, 32*8+5, 32*8+6, 32*8+7,
- 0, 1, 2, 3, 4, 5, 6, 7 },
- { 0*16, 1*16, 2*16, 3*16, 4*16, 5*16, 6*16, 7*16,
- 8*16, 9*16, 10*16, 11*16, 12*16, 13*16, 14*16, 15*16 },
+ { STEP8(8*2*16,1), STEP8(0,1) },
+ { STEP16(0,8*2) },
64*8
};
@@ -554,9 +540,9 @@ static const gfx_layout hedpanic_sprite_16x16x5 =
16,16,
RGN_FRAC(1,3),
5,
- { RGN_FRAC(2,3), RGN_FRAC(0,3), RGN_FRAC(0,3)+8, RGN_FRAC(1,3),RGN_FRAC(1,3)+8 },
- { 256+0,256+1,256+2,256+3,256+4,256+5,256+6,256+7,0,1,2,3,4,5,6,7 },
- { 0*16,1*16,2*16,3*16,4*16,5*16,6*16,7*16,8*16,9*16,10*16,11*16,12*16,13*16,14*16,15*16 },
+ { RGN_FRAC(2,3), RGN_FRAC(0,3), RGN_FRAC(0,3)+8, RGN_FRAC(1,3),RGN_FRAC(1,3)+8 },
+ { STEP8(8*2*16,1), STEP8(0,1) },
+ { STEP16(0,8*2) },
16*32,
};
@@ -565,9 +551,9 @@ static const gfx_layout hedpanic_layout_8x8x8 =
8,8,
RGN_FRAC(1,1),
8,
- { 0,1,2,3,4,5,6,7 },
- { 0*8,2*8,1*8,3*8,4*8,6*8,5*8,7*8 },
- { 0*64,1*64,2*64,3*64,4*64,5*64,6*64,7*64 },
+ { STEP8(0,1) },
+ { STEP8(0,8) },
+ { STEP8(0,8*8) },
64*8,
};
@@ -576,12 +562,9 @@ static const gfx_layout hedpanic_layout_16x16x8 =
16,16,
RGN_FRAC(1,1),
8,
- { 0,1,2,3,4,5,6,7 },
- { 0*8,2*8,1*8,3*8,4*8,6*8,5*8,7*8,
- 64*8+0*8,64*8+2*8,64*8+1*8,64*8+3*8,64*8+4*8,64*8+6*8,64*8+5*8,64*8+7*8 },
- { 0*64,1*64,2*64,3*64,4*64,5*64,6*64,7*64,
- 128*8+0*64,128*8+1*64,128*8+2*64,128*8+3*64,128*8+4*64,128*8+5*64,128*8+6*64,128*8+7*64
- },
+ { STEP8(0,1) },
+ { STEP8(0,8), STEP8(8*8*8,8) },
+ { STEP8(0,8*8), STEP8(8*8*8*2,8*8) },
256*8,
};
@@ -611,19 +594,18 @@ void esd16_state::machine_start()
{
uint8_t *AUDIO = memregion("audiocpu")->base();
- membank("bank1")->configure_entries(0, 16, &AUDIO[0x0000], 0x4000);
+ m_audiobank->configure_entries(0, 16, &AUDIO[0x0000], 0x4000);
- save_item(NAME(m_tilemap0_color));
- save_item(NAME(m_tilemap1_color));
+ save_item(NAME(m_tilemap_color));
}
void esd16_state::machine_reset()
{
- m_tilemap0_color = 0;
- m_tilemap1_color = 0;
+ m_tilemap_color[0] = 0;
+ m_tilemap_color[1] = 0;
}
-DECOSPR_PRIORITY_CB_MEMBER(esd16_state::hedpanic_pri_callback)
+DECOSPR_PRIORITY_CB_MEMBER(esd16_state::pri_callback)
{
if (pri & 0x8000)
return 0xfffe; // under "tilemap 1"
@@ -631,82 +613,75 @@ DECOSPR_PRIORITY_CB_MEMBER(esd16_state::hedpanic_pri_callback)
return 0; // above everything
}
-MACHINE_CONFIG_START(esd16_state::esd16)
-
+void esd16_state::esd16(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu",M68000, XTAL(16'000'000)) /* 16MHz */
- MCFG_DEVICE_PROGRAM_MAP(multchmp_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", esd16_state, irq6_line_hold)
-
- MCFG_DEVICE_ADD("audiocpu", Z80, XTAL(16'000'000)/4) /* 4MHz */
- MCFG_DEVICE_PROGRAM_MAP(multchmp_sound_map)
- MCFG_DEVICE_IO_MAP(multchmp_sound_io_map)
- MCFG_DEVICE_PERIODIC_INT_DRIVER(esd16_state, nmi_line_pulse, 32*60) /* IRQ By Main CPU */
+ M68000(config, m_maincpu, XTAL(16'000'000)); /* 16MHz */
+ m_maincpu->set_addrmap(AS_PROGRAM, &esd16_state::multchmp_map);
+ m_maincpu->set_vblank_int("screen", FUNC(esd16_state::irq6_line_hold));
+ Z80(config, m_audiocpu, XTAL(16'000'000)/4); /* 4MHz */
+ m_audiocpu->set_addrmap(AS_PROGRAM, &esd16_state::sound_map);
+ m_audiocpu->set_addrmap(AS_IO, &esd16_state::sound_io_map);
+ m_audiocpu->set_periodic_int(FUNC(esd16_state::nmi_line_pulse), attotime::from_hz(32*60)); /* IRQ By Main CPU */
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(0x140, 0x100)
- MCFG_SCREEN_VISIBLE_AREA(0, 0x140-1, 0+8, 0x100-8-1)
- MCFG_SCREEN_UPDATE_DRIVER(esd16_state, screen_update_hedpanic)
- MCFG_SCREEN_PALETTE("palette")
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(0x140, 0x100);
+ screen.set_visarea(0, 0x140-1, 0+8, 0x100-8-1);
+ screen.set_screen_update(FUNC(esd16_state::screen_update));
+ screen.set_palette("palette");
DECO_SPRITE(config, m_sprgen, 0);
m_sprgen->set_gfx_region(0);
m_sprgen->set_is_bootleg(true);
- m_sprgen->set_pri_callback(FUNC(esd16_state::hedpanic_pri_callback), this);
+ m_sprgen->set_pri_callback(FUNC(esd16_state::pri_callback), this);
m_sprgen->set_flipallx(1);
m_sprgen->set_gfxdecode_tag(m_gfxdecode);
GFXDECODE(config, m_gfxdecode, "palette", gfx_esd16);
PALETTE(config, "palette").set_format(palette_device::xRGB_555, 0x1000/2);
-
/* sound hardware */
SPEAKER(config, "mono").front_center();
- GENERIC_LATCH_8(config, m_soundlatch);
+ GENERIC_LATCH_8(config, m_soundlatch).data_pending_callback().set_inputline(m_audiocpu, 0);
- MCFG_DEVICE_ADD("ymsnd", YM3812, XTAL(16'000'000)/4) /* 4MHz */
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.30)
+ YM3812(config, "ymsnd", XTAL(16'000'000)/4).add_route(ALL_OUTPUTS, "mono", 0.30); /* 4MHz */
- MCFG_DEVICE_ADD("oki", OKIM6295, XTAL(16'000'000)/16, okim6295_device::PIN7_HIGH) /* 1MHz */
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.60)
-MACHINE_CONFIG_END
+ OKIM6295(config, "oki", XTAL(16'000'000)/16, okim6295_device::PIN7_HIGH).add_route(ALL_OUTPUTS, "mono", 0.60); /* 1MHz */
+}
-MACHINE_CONFIG_START(esd16_state::jumppop)
+void esd16_state::jumppop(machine_config &config)
+{
esd16(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(jumppop_map)
+ m_maincpu->set_addrmap(AS_PROGRAM, &esd16_state::jumppop_map);
- MCFG_DEVICE_MODIFY("audiocpu")
- MCFG_DEVICE_CLOCK( XTAL(14'000'000)/4) /* 3.5MHz - Verified */
+ m_audiocpu->set_clock(XTAL(14'000'000)/4); /* 3.5MHz - Verified */
- MCFG_GFXDECODE_MODIFY("gfxdecode", gfx_jumppop)
+ m_gfxdecode->set_info(gfx_jumppop);
- MCFG_DEVICE_REPLACE("ymsnd", YM3812, XTAL(14'000'000)/4) /* 3.5MHz - Verified */
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.30)
+ subdevice<ym3812_device>("ymsnd")->set_clock(XTAL(14'000'000)/4); /* 3.5MHz - Verified */
- MCFG_DEVICE_REPLACE("oki", OKIM6295, XTAL(14'000'000)/16, okim6295_device::PIN7_HIGH) /* 875kHz - Verified */
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.60)
-MACHINE_CONFIG_END
+ subdevice<okim6295_device>("oki")->set_clock(XTAL(14'000'000)/16); /* 875kHz - Verified */
+}
/* The ESD 05-28-99 PCB adds an EEPROM */
-MACHINE_CONFIG_START(esd16_state::hedpanio)
+void esd16_state::hedpanio(machine_config &config)
+{
esd16(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(hedpanic_map)
+ m_maincpu->set_addrmap(AS_PROGRAM, &esd16_state::hedpanic_map);
EEPROM_93C46_16BIT(config, "eeprom");
-MACHINE_CONFIG_END
+}
/* The ESD 08-26-1999 PCBs take that further and modify the sprite offsets */
@@ -718,21 +693,17 @@ void esd16_state::hedpanic(machine_config &config)
/* ESD 08-26-1999 PCBs with different memory maps */
-MACHINE_CONFIG_START(esd16_state::mchampdx)
+void esd16_state::mchampdx(machine_config &config)
+{
hedpanic(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(mchampdx_map)
-MACHINE_CONFIG_END
+ m_maincpu->set_addrmap(AS_PROGRAM, &esd16_state::mchampdx_map);
+}
-MACHINE_CONFIG_START(esd16_state::tangtang)
+void esd16_state::tangtang(machine_config &config)
+{
hedpanic(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(tangtang_map)
-MACHINE_CONFIG_END
-
-
-
-
+ m_maincpu->set_addrmap(AS_PROGRAM, &esd16_state::tangtang_map);
+}
/***************************************************************************
@@ -817,12 +788,12 @@ ROM_START( multchmp )
ROM_REGION( 0x400000, "bgs", 0 ) /* Layers, 16x16x8 */
ROM_LOAD32_BYTE( "esd9.fu28", 0x000000, 0x080000, CRC(6652c04a) SHA1(178e1d42847506d869ef79db2f7e10df05e9ef76) )
- ROM_LOAD32_BYTE( "esd11.fu29", 0x000001, 0x080000, CRC(9bafd8ee) SHA1(db18be05431d4b6d4207e19fa4ed8701621aaa19) )
- ROM_LOAD32_BYTE( "esd7.fu26", 0x000002, 0x080000, CRC(a783a003) SHA1(1ff61a049485c5b599c458a8bf7f48027d14f8e0) )
+ ROM_LOAD32_BYTE( "esd11.fu29", 0x000002, 0x080000, CRC(9bafd8ee) SHA1(db18be05431d4b6d4207e19fa4ed8701621aaa19) )
+ ROM_LOAD32_BYTE( "esd7.fu26", 0x000001, 0x080000, CRC(a783a003) SHA1(1ff61a049485c5b599c458a8bf7f48027d14f8e0) )
ROM_LOAD32_BYTE( "esd5.fu27", 0x000003, 0x080000, CRC(299f32c2) SHA1(274752444f6ddba16eeefc02c3e78525c079b3d8) )
ROM_LOAD32_BYTE( "esd10.fu31", 0x200000, 0x080000, CRC(d815974b) SHA1(3e528a5df79fa7dc0f38b0ee7f2f3a0ebc97a369) )
- ROM_LOAD32_BYTE( "esd12.fu33", 0x200001, 0x080000, CRC(c6b86001) SHA1(11a63b56df30ab7b85ce4568d2a24e96a125735a) )
- ROM_LOAD32_BYTE( "esd8.fu30", 0x200002, 0x080000, CRC(22861af2) SHA1(1e74e85517cb8fd5fb4bda6e9d9d54046e31f653) )
+ ROM_LOAD32_BYTE( "esd12.fu33", 0x200002, 0x080000, CRC(c6b86001) SHA1(11a63b56df30ab7b85ce4568d2a24e96a125735a) )
+ ROM_LOAD32_BYTE( "esd8.fu30", 0x200001, 0x080000, CRC(22861af2) SHA1(1e74e85517cb8fd5fb4bda6e9d9d54046e31f653) )
ROM_LOAD32_BYTE( "esd6.fu32", 0x200003, 0x080000, CRC(e2689bb2) SHA1(1da9b1f7335d5c2d1c2f8353fccf91c0109d2e9d) )
ROM_REGION( 0x40000, "oki", 0 ) /* Samples */
@@ -846,12 +817,12 @@ ROM_START( multchmpk )
ROM_REGION( 0x400000, "bgs", 0 ) /* Layers, 16x16x8 */
ROM_LOAD32_BYTE( "multchmp.u31", 0x000000, 0x080000, CRC(b1e4e9e3) SHA1(1a7393e9073b028b4170393b3788ad8cb86c0c78) )
- ROM_LOAD32_BYTE( "multchmp.u33", 0x000001, 0x080000, CRC(e4c0ec96) SHA1(74152108e4d05f4aff9d38919f212fcb8c87cef3) )
- ROM_LOAD32_BYTE( "multchmp.u29", 0x000002, 0x080000, CRC(01bd1399) SHA1(b717ccffe0af92a42a0879736d34d3ad71840233) )
+ ROM_LOAD32_BYTE( "multchmp.u33", 0x000002, 0x080000, CRC(e4c0ec96) SHA1(74152108e4d05f4aff9d38919f212fcb8c87cef3) )
+ ROM_LOAD32_BYTE( "multchmp.u29", 0x000001, 0x080000, CRC(01bd1399) SHA1(b717ccffe0af92a42a0879736d34d3ad71840233) )
ROM_LOAD32_BYTE( "multchmp.u27", 0x000003, 0x080000, CRC(dc42704e) SHA1(58a04a47ffc6d6ae0e4d49e466b1c58b37ad741a) )
ROM_LOAD32_BYTE( "multchmp.u32", 0x200000, 0x080000, CRC(f05cb5b4) SHA1(1b33e60942238e39d61ae59e9317b99e83595ab1) )
- ROM_LOAD32_BYTE( "multchmp.u34", 0x200001, 0x080000, CRC(bffaaccc) SHA1(d9ab248e2c7c639666e3717cfc5d8c8468a1bde2) )
- ROM_LOAD32_BYTE( "multchmp.u30", 0x200002, 0x080000, CRC(c6b4cc18) SHA1(d9097b85584272cfe4989a40d622ef1feeee6775) )
+ ROM_LOAD32_BYTE( "multchmp.u34", 0x200002, 0x080000, CRC(bffaaccc) SHA1(d9ab248e2c7c639666e3717cfc5d8c8468a1bde2) )
+ ROM_LOAD32_BYTE( "multchmp.u30", 0x200001, 0x080000, CRC(c6b4cc18) SHA1(d9097b85584272cfe4989a40d622ef1feeee6775) )
ROM_LOAD32_BYTE( "multchmp.u28", 0x200003, 0x080000, CRC(449991fa) SHA1(fd93e420a04cb8bea5421aa9cbe079bd3e7d4924) )
ROM_REGION( 0x40000, "oki", 0 ) /* Samples */
@@ -875,12 +846,12 @@ ROM_START( multchmpa ) /* Also found on a ESD 10-10-98 PCB which looks identical
ROM_REGION( 0x400000, "bgs", 0 ) /* Layers, 16x16x8 */
ROM_LOAD32_BYTE( "esd9.fu28", 0x000000, 0x080000, CRC(a3cfe895) SHA1(a8dc0d5d9e64d4c5112177b8f20b5bdb86ca73af) )
- ROM_LOAD32_BYTE( "esd11.fu29", 0x000001, 0x080000, CRC(d3c1855e) SHA1(bb547d4a45a745e9ae4a6727087cdf325105de90) )
- ROM_LOAD32_BYTE( "esd7.fu26", 0x000002, 0x080000, CRC(042d59ff) SHA1(8e45a4757e07d8aaf50b151d8849c1a27424e64b) )
+ ROM_LOAD32_BYTE( "esd11.fu29", 0x000002, 0x080000, CRC(d3c1855e) SHA1(bb547d4a45a745e9ae4a6727087cdf325105de90) )
+ ROM_LOAD32_BYTE( "esd7.fu26", 0x000001, 0x080000, CRC(042d59ff) SHA1(8e45a4757e07d8aaf50b151d8849c1a27424e64b) )
ROM_LOAD32_BYTE( "esd5.fu27", 0x000003, 0x080000, CRC(ed5b4e58) SHA1(82c3ee9e2525c0b370a29d5560c21ec6380d1a43) )
ROM_LOAD32_BYTE( "esd10.fu31", 0x200000, 0x080000, CRC(396d77b6) SHA1(f22449a7f9f50e172e36db4f399c14e527409884) )
- ROM_LOAD32_BYTE( "esd12.fu33", 0x200001, 0x080000, CRC(a68848a8) SHA1(915239a961d76af6a1a567eb89b1569f158e714e) )
- ROM_LOAD32_BYTE( "esd8.fu30", 0x200002, 0x080000, CRC(fa8cd2d3) SHA1(ddc1b98867e6d2eee458bf35a933e7cdc59f4c7e) )
+ ROM_LOAD32_BYTE( "esd12.fu33", 0x200002, 0x080000, CRC(a68848a8) SHA1(915239a961d76af6a1a567eb89b1569f158e714e) )
+ ROM_LOAD32_BYTE( "esd8.fu30", 0x200001, 0x080000, CRC(fa8cd2d3) SHA1(ddc1b98867e6d2eee458bf35a933e7cdc59f4c7e) )
ROM_LOAD32_BYTE( "esd6.fu32", 0x200003, 0x080000, CRC(97fde7b1) SHA1(b3610f6fcc1367ff079dc01121c86bc1e1f4c7a2) )
ROM_REGION( 0x40000, "oki", 0 ) /* Samples */
@@ -958,8 +929,8 @@ ROM_START( mchampdx )
ROM_FILL( 0x500000, 0x100000, 0x00 )
ROM_REGION( 0x400000, "bgs", 0 ) /* Layers, 16x16x8 */
- ROM_LOAD16_BYTE( "rom.fu35", 0x000000, 0x200000, CRC(ba46f3dc) SHA1(4ac7695bdf4237654481f7f74f8650d70a51e691) )
- ROM_LOAD16_BYTE( "rom.fu34", 0x000001, 0x200000, CRC(2895cf09) SHA1(88756fcd589af1986c3881d4080f086afc11b498) )
+ ROM_LOAD32_WORD( "rom.fu35", 0x000000, 0x200000, CRC(ba46f3dc) SHA1(4ac7695bdf4237654481f7f74f8650d70a51e691) )
+ ROM_LOAD32_WORD( "rom.fu34", 0x000002, 0x200000, CRC(2895cf09) SHA1(88756fcd589af1986c3881d4080f086afc11b498) )
ROM_REGION( 0x40000, "oki", 0 ) /* Samples */
ROM_LOAD( "esd4.su10", 0x00000, 0x40000, CRC(2fbe94ab) SHA1(1bc4a33ec93a80fb598722d2b50bdf3ccaaa984a) )
@@ -984,8 +955,8 @@ ROM_START( mchampdxa )
ROM_FILL( 0x500000, 0x100000, 0x00 )
ROM_REGION( 0x400000, "bgs", 0 ) /* Layers, 16x16x8 */
- ROM_LOAD16_BYTE( "rom.fu35", 0x000000, 0x200000, CRC(ba46f3dc) SHA1(4ac7695bdf4237654481f7f74f8650d70a51e691) )
- ROM_LOAD16_BYTE( "rom.fu34", 0x000001, 0x200000, CRC(2895cf09) SHA1(88756fcd589af1986c3881d4080f086afc11b498) )
+ ROM_LOAD32_WORD( "rom.fu35", 0x000000, 0x200000, CRC(ba46f3dc) SHA1(4ac7695bdf4237654481f7f74f8650d70a51e691) )
+ ROM_LOAD32_WORD( "rom.fu34", 0x000002, 0x200000, CRC(2895cf09) SHA1(88756fcd589af1986c3881d4080f086afc11b498) )
ROM_REGION( 0x40000, "oki", 0 ) /* Samples */
ROM_LOAD( "esd4.su10", 0x00000, 0x40000, CRC(2fbe94ab) SHA1(1bc4a33ec93a80fb598722d2b50bdf3ccaaa984a) )
@@ -1010,8 +981,8 @@ ROM_START( mchampdxb )
ROM_FILL( 0x500000, 0x100000, 0x00 )
ROM_REGION( 0x400000, "bgs", 0 ) /* Layers, 16x16x8 */
- ROM_LOAD16_BYTE( "ver1114_fu35", 0x000000, 0x200000, CRC(c515c704) SHA1(c1657534314e66a25c38f70a12f14d2225ab89cc) ) // SMT Flash MX chips
- ROM_LOAD16_BYTE( "ver1114_fu34", 0x000001, 0x200000, CRC(39d448bb) SHA1(07cd6e30a25d1c0caeef0f95f23df0ca6a2c7a26) )
+ ROM_LOAD32_WORD( "ver1114_fu35", 0x000000, 0x200000, CRC(c515c704) SHA1(c1657534314e66a25c38f70a12f14d2225ab89cc) ) // SMT Flash MX chips
+ ROM_LOAD32_WORD( "ver1114_fu34", 0x000002, 0x200000, CRC(39d448bb) SHA1(07cd6e30a25d1c0caeef0f95f23df0ca6a2c7a26) )
ROM_REGION( 0x40000, "oki", 0 ) /* Samples */
ROM_LOAD( "esd4.su10", 0x00000, 0x40000, CRC(2fbe94ab) SHA1(1bc4a33ec93a80fb598722d2b50bdf3ccaaa984a) )
@@ -1123,8 +1094,8 @@ ROM_START( hedpanic ) /* Story line & game instructions in English */
ROM_FILL( 0x500000, 0x100000, 0x00 )
ROM_REGION( 0x400000, "bgs", 0 ) /* Layers, 16x16x8 */
- ROM_LOAD16_BYTE( "esd8.fu35", 0x000000, 0x200000, CRC(23aceb4f) SHA1(35d9ebc33b9e1515e47750cfcdfc0bf8bf44b71d) )
- ROM_LOAD16_BYTE( "esd9.fu34", 0x000001, 0x200000, CRC(76b46cd2) SHA1(679cbf50ae5935e8848868081ecef4ec66424f6c) )
+ ROM_LOAD32_WORD( "esd8.fu35", 0x000000, 0x200000, CRC(23aceb4f) SHA1(35d9ebc33b9e1515e47750cfcdfc0bf8bf44b71d) )
+ ROM_LOAD32_WORD( "esd9.fu34", 0x000002, 0x200000, CRC(76b46cd2) SHA1(679cbf50ae5935e8848868081ecef4ec66424f6c) )
ROM_REGION( 0x40000, "oki", 0 ) /* Samples */
ROM_LOAD( "esd4.su10", 0x000000, 0x020000, CRC(3c11c590) SHA1(cb33845c3dc0501fff8055c2d66f412881089df1) ) /* AT27010 mask rom */
@@ -1150,8 +1121,8 @@ ROM_START( hedpanicf ) /* Story line in Japanese, game instructions in English *
ROM_FILL( 0x500000, 0x100000, 0x00 )
ROM_REGION( 0x400000, "bgs", 0 ) /* Layers, 16x16x8 */
- ROM_LOAD16_BYTE( "esd8.fu35", 0x000000, 0x200000, CRC(23aceb4f) SHA1(35d9ebc33b9e1515e47750cfcdfc0bf8bf44b71d) )
- ROM_LOAD16_BYTE( "esd9.fu34", 0x000001, 0x200000, CRC(76b46cd2) SHA1(679cbf50ae5935e8848868081ecef4ec66424f6c) )
+ ROM_LOAD32_WORD( "esd8.fu35", 0x000000, 0x200000, CRC(23aceb4f) SHA1(35d9ebc33b9e1515e47750cfcdfc0bf8bf44b71d) )
+ ROM_LOAD32_WORD( "esd9.fu34", 0x000002, 0x200000, CRC(76b46cd2) SHA1(679cbf50ae5935e8848868081ecef4ec66424f6c) )
ROM_REGION( 0x40000, "oki", 0 ) /* Samples */
ROM_LOAD( "esd4.su10", 0x000000, 0x020000, CRC(3c11c590) SHA1(cb33845c3dc0501fff8055c2d66f412881089df1) ) /* AT27010 mask rom */
@@ -1177,8 +1148,8 @@ ROM_START( hedpanica ) /* Story line & game instructions in English, copyright y
ROM_FILL( 0x500000, 0x100000, 0x00 )
ROM_REGION( 0x400000, "bgs", 0 ) /* Layers, 16x16x8 */
- ROM_LOAD16_BYTE( "fu35", 0x000000, 0x200000, CRC(9b5a45c5) SHA1(fbd8bc6ccc068d2cc7fe4f575fa0847f53e786ab) )
- ROM_LOAD16_BYTE( "fu34", 0x000001, 0x200000, CRC(8f2099cc) SHA1(40795ae5fb8de613c2d5b6147992c153695bf698) )
+ ROM_LOAD32_WORD( "fu35", 0x000000, 0x200000, CRC(9b5a45c5) SHA1(fbd8bc6ccc068d2cc7fe4f575fa0847f53e786ab) )
+ ROM_LOAD32_WORD( "fu34", 0x000002, 0x200000, CRC(8f2099cc) SHA1(40795ae5fb8de613c2d5b6147992c153695bf698) )
ROM_REGION( 0x80000, "oki", 0 ) /* Samples */
ROM_LOAD( "esd4.bin", 0x000000, 0x080000, CRC(5692fe92) SHA1(4423039cb437ab36d198b212ef394bf1704be404) ) /* SU10 */
@@ -1204,8 +1175,8 @@ ROM_START( hedpanico ) /* Story line & game instructions in English, copyright y
ROM_FILL( 0x500000, 0x100000, 0x00 )
ROM_REGION( 0x400000, "bgs", 0 ) /* Layers, 16x16x8 */
- ROM_LOAD16_BYTE( "sm3.fu35", 0x000000, 0x200000, CRC(94dd4cfc) SHA1(a3f9c49611f0bc9d26166dafb44e2c5ebbb31127) )
- ROM_LOAD16_BYTE( "sm4.fu34", 0x000001, 0x200000, CRC(6da0fb9e) SHA1(c4e7487953f45c5f6ce2ebe558b4c325f6ec54eb) )
+ ROM_LOAD32_WORD( "sm3.fu35", 0x000000, 0x200000, CRC(94dd4cfc) SHA1(a3f9c49611f0bc9d26166dafb44e2c5ebbb31127) )
+ ROM_LOAD32_WORD( "sm4.fu34", 0x000002, 0x200000, CRC(6da0fb9e) SHA1(c4e7487953f45c5f6ce2ebe558b4c325f6ec54eb) )
ROM_REGION( 0x40000, "oki", 0 ) /* Samples */
ROM_LOAD( "esd4.rom", 0x000000, 0x020000, CRC(d7ca6806) SHA1(8ad668bfb5b7561cc0f3e36dfc3c936b136a4274) ) /* SU10 */
@@ -1282,8 +1253,8 @@ ROM_START( deluxe5 ) /* Deluxe 5 */
ROM_LOAD16_BYTE( "am27c020.ju07", 0x100000, 0x040000, CRC(d414c3af) SHA1(9299b07a8c7a3e30a1bb6028204a049a7cb510f7) )
ROM_REGION( 0x400000, "bgs", 0 ) /* Layers, 16x16x8 */
- ROM_LOAD16_BYTE( "fu35", 0x000000, 0x200000, CRC(ae10242a) SHA1(f3d18c0cb7951b5f7ee47aa2856b7554088328ed) ) /* No labels on the flash roms */
- ROM_LOAD16_BYTE( "fu34", 0x000001, 0x200000, CRC(248b8c05) SHA1(fe7bcc05ae0dd0a27c6ba4beb4ac155a8f3d7f7e) ) /* No labels on the flash roms */
+ ROM_LOAD32_WORD( "fu35", 0x000000, 0x200000, CRC(ae10242a) SHA1(f3d18c0cb7951b5f7ee47aa2856b7554088328ed) ) /* No labels on the flash roms */
+ ROM_LOAD32_WORD( "fu34", 0x000002, 0x200000, CRC(248b8c05) SHA1(fe7bcc05ae0dd0a27c6ba4beb4ac155a8f3d7f7e) ) /* No labels on the flash roms */
ROM_REGION( 0x40000, "oki", 0 ) /* Samples */
ROM_LOAD( "esd4.su10", 0x00000, 0x20000, CRC(23f2b7d9) SHA1(328c951d14674760df68486841c933bad0d59fe3) ) /* AT27C010 mask rom */
@@ -1308,8 +1279,8 @@ ROM_START( deluxe5a ) /* Deluxe 5 */
ROM_LOAD16_BYTE( "am27c020.ju07", 0x100000, 0x040000, CRC(d414c3af) SHA1(9299b07a8c7a3e30a1bb6028204a049a7cb510f7) )
ROM_REGION( 0x400000, "bgs", 0 ) /* Layers, 16x16x8 */
- ROM_LOAD16_BYTE( "fu35", 0x000000, 0x200000, CRC(ae10242a) SHA1(f3d18c0cb7951b5f7ee47aa2856b7554088328ed) ) /* No labels on the flash roms */
- ROM_LOAD16_BYTE( "fu34", 0x000001, 0x200000, CRC(248b8c05) SHA1(fe7bcc05ae0dd0a27c6ba4beb4ac155a8f3d7f7e) ) /* No labels on the flash roms */
+ ROM_LOAD32_WORD( "fu35", 0x000000, 0x200000, CRC(ae10242a) SHA1(f3d18c0cb7951b5f7ee47aa2856b7554088328ed) ) /* No labels on the flash roms */
+ ROM_LOAD32_WORD( "fu34", 0x000002, 0x200000, CRC(248b8c05) SHA1(fe7bcc05ae0dd0a27c6ba4beb4ac155a8f3d7f7e) ) /* No labels on the flash roms */
ROM_REGION( 0x40000, "oki", 0 ) /* Samples */
ROM_LOAD( "esd4.su10", 0x00000, 0x20000, CRC(23f2b7d9) SHA1(328c951d14674760df68486841c933bad0d59fe3) ) /* AT27C010 mask rom */
@@ -1334,8 +1305,8 @@ ROM_START( deluxe5b ) /* Deluxe 5 */
ROM_LOAD16_BYTE( "am27c020.ju07", 0x100000, 0x040000, CRC(d414c3af) SHA1(9299b07a8c7a3e30a1bb6028204a049a7cb510f7) )
ROM_REGION( 0x400000, "bgs", 0 ) /* Layers, 16x16x8 */
- ROM_LOAD16_BYTE( "fu35", 0x000000, 0x200000, CRC(ae10242a) SHA1(f3d18c0cb7951b5f7ee47aa2856b7554088328ed) ) /* No labels on the flash roms */
- ROM_LOAD16_BYTE( "fu34", 0x000001, 0x200000, CRC(248b8c05) SHA1(fe7bcc05ae0dd0a27c6ba4beb4ac155a8f3d7f7e) ) /* No labels on the flash roms */
+ ROM_LOAD32_WORD( "fu35", 0x000000, 0x200000, CRC(ae10242a) SHA1(f3d18c0cb7951b5f7ee47aa2856b7554088328ed) ) /* No labels on the flash roms */
+ ROM_LOAD32_WORD( "fu34", 0x000002, 0x200000, CRC(248b8c05) SHA1(fe7bcc05ae0dd0a27c6ba4beb4ac155a8f3d7f7e) ) /* No labels on the flash roms */
ROM_REGION( 0x40000, "oki", 0 ) /* Samples */
ROM_LOAD( "esd4.su10", 0x00000, 0x20000, CRC(23f2b7d9) SHA1(328c951d14674760df68486841c933bad0d59fe3) ) /* AT27C010 mask rom */
@@ -1361,8 +1332,8 @@ ROM_START( deluxe4u ) /* Deluxe 4 U - Removes Blackjack game, but otherwise same
ROM_LOAD16_BYTE( "am27c020.ju07", 0x100000, 0x040000, CRC(d414c3af) SHA1(9299b07a8c7a3e30a1bb6028204a049a7cb510f7) )
ROM_REGION( 0x400000, "bgs", 0 ) /* Layers, 16x16x8 */
- ROM_LOAD16_BYTE( "fu35", 0x000000, 0x200000, CRC(6df14570) SHA1(fa4fc64c984d6a94fe61ec809ec515e840388704) ) /* Specific to Deluxe 4 U - No labels on the flash roms */
- ROM_LOAD16_BYTE( "fu34", 0x000001, 0x200000, CRC(93175d6d) SHA1(691832134f43e17bb767dff080b2736288961414) ) /* Specific to Deluxe 4 U - No labels on the flash roms */
+ ROM_LOAD32_WORD( "fu35", 0x000000, 0x200000, CRC(6df14570) SHA1(fa4fc64c984d6a94fe61ec809ec515e840388704) ) /* Specific to Deluxe 4 U - No labels on the flash roms */
+ ROM_LOAD32_WORD( "fu34", 0x000002, 0x200000, CRC(93175d6d) SHA1(691832134f43e17bb767dff080b2736288961414) ) /* Specific to Deluxe 4 U - No labels on the flash roms */
ROM_REGION( 0x40000, "oki", 0 ) /* Samples */
ROM_LOAD( "esd4.su10", 0x00000, 0x20000, CRC(23f2b7d9) SHA1(328c951d14674760df68486841c933bad0d59fe3) ) /* AT27C010 mask rom */
@@ -1441,8 +1412,8 @@ ROM_START( tangtang )
ROM_LOAD16_BYTE( "xju08.bin", 0x100000, 0x040000, CRC(ecc2d8c7) SHA1(1aabdf7204fcdff8d46cb50de8b097e3775dddf3) )
ROM_REGION( 0x400000, "bgs", 0 ) /* Layers, 16x16x8 */
- ROM_LOAD16_BYTE( "fu35.bin", 0x000000, 0x200000, CRC(84f3f833) SHA1(f84e41d93dc47a58ada800b921a7e5902b7631cd) )
- ROM_LOAD16_BYTE( "fu34.bin", 0x000001, 0x200000, CRC(bf91f543) SHA1(7c149fed8b8044850cd6b798622a91c45336cd47) )
+ ROM_LOAD32_WORD( "fu35.bin", 0x000000, 0x200000, CRC(84f3f833) SHA1(f84e41d93dc47a58ada800b921a7e5902b7631cd) )
+ ROM_LOAD32_WORD( "fu34.bin", 0x000002, 0x200000, CRC(bf91f543) SHA1(7c149fed8b8044850cd6b798622a91c45336cd47) )
ROM_REGION( 0x40000, "oki", 0 ) /* Samples */
ROM_LOAD( "esd4.su10", 0x00000, 0x20000, CRC(f2dfb02d) SHA1(04001488697aad3e5b2d15c9f5a81dc2b7d0952c) )
@@ -1517,8 +1488,8 @@ ROM_START( swatpolc ) /* SWAT Police */
ROM_LOAD16_BYTE( "esd5.ju07", 0x200000, 0x080000, CRC(d2c27f03) SHA1(7cbdf7f7ff17df16ca81823f69e82ae1cf96b714) )
ROM_REGION( 0x400000, "bgs", 0 ) /* Layers, 16x16x8 */
- ROM_LOAD16_BYTE( "fu35", 0x000000, 0x200000, CRC(c55897c5) SHA1(f6e0ef1c2fcfe6a511fe787a3abeff4da16d1b54) ) /* No labels on the flash roms */
- ROM_LOAD16_BYTE( "fu34", 0x000001, 0x200000, CRC(7117a6a2) SHA1(17c0ab02698cffa0582ed2d2b7dbb7fed8cd9393) ) /* No labels on the flash roms */
+ ROM_LOAD32_WORD( "fu35", 0x000000, 0x200000, CRC(c55897c5) SHA1(f6e0ef1c2fcfe6a511fe787a3abeff4da16d1b54) ) /* No labels on the flash roms */
+ ROM_LOAD32_WORD( "fu34", 0x000002, 0x200000, CRC(7117a6a2) SHA1(17c0ab02698cffa0582ed2d2b7dbb7fed8cd9393) ) /* No labels on the flash roms */
ROM_REGION( 0x40000, "oki", 0 ) /* Samples */
ROM_LOAD( "at27c020.su10", 0x00000, 0x40000, CRC(c43efec2) SHA1(4ef328d8703b81328de09ecc4328763aba06e883) ) /* AT27C020 mask rom with no label */
@@ -1627,8 +1598,8 @@ ROM_START( jumppop )
ROM_LOAD( "sp1.bin", 0x100000, 0x100000, CRC(7eae782e) SHA1(a33c544ad9516ec409c209968e72f63e7cdb934b) )
ROM_REGION( 0x200000, "bgs", 0 )
- ROM_LOAD16_BYTE( "bg1.bin", 0x000000, 0x100000, CRC(5b37f943) SHA1(fe73b839f29d4c32823418711b22f85a5f583ec2) )
- ROM_LOAD16_BYTE( "bg0.bin", 0x000001, 0x100000, CRC(35a1363d) SHA1(66c550b0bdea7c8b079f186f5e044f731d31bc58) )
+ ROM_LOAD32_WORD( "bg1.bin", 0x000000, 0x100000, CRC(5b37f943) SHA1(fe73b839f29d4c32823418711b22f85a5f583ec2) )
+ ROM_LOAD32_WORD( "bg0.bin", 0x000002, 0x100000, CRC(35a1363d) SHA1(66c550b0bdea7c8b079f186f5e044f731d31bc58) )
ROM_REGION( 0x80000, "oki", 0 ) /* Oki samples */
ROM_LOAD( "samples.bin", 0x00000, 0x40000, CRC(066f30a7) SHA1(6bdd0210001c597819f7132ffa1dc1b1d55b4e0a) )
@@ -1651,8 +1622,8 @@ ROM_START( jumppope ) /* Running on an original ESD 11-09-98 PCB with original E
ROM_REGION( 0x200000, "bgs", 0 )
ROM_LOAD32_BYTE( "esd5.fu28", 0x000000, 0x080000, CRC(0d47f821) SHA1(fc1ef080eb05990909e25d5db59918f1f4e90a67) ) // [even 1/2] 99.769974%, [even 2/2] 99.267578%
- ROM_LOAD32_BYTE( "esd6.fu29", 0x000001, 0x080000, CRC(c01af40d) SHA1(fce0244027d4d4eb5cff1809cf8f404bfe016455) ) // [even 1/2] 99.778366%, [even 2/2] 99.267578%
- ROM_LOAD32_BYTE( "esd4.fu26", 0x000002, 0x080000, CRC(97b409be) SHA1(3a4344ca8ffb0aee046e3c0bab2d7c3f7c0eb204) ) // [odd 1/2] 99.763107%, [odd 2/2] 99.267578%
+ ROM_LOAD32_BYTE( "esd6.fu29", 0x000002, 0x080000, CRC(c01af40d) SHA1(fce0244027d4d4eb5cff1809cf8f404bfe016455) ) // [even 1/2] 99.778366%, [even 2/2] 99.267578%
+ ROM_LOAD32_BYTE( "esd4.fu26", 0x000001, 0x080000, CRC(97b409be) SHA1(3a4344ca8ffb0aee046e3c0bab2d7c3f7c0eb204) ) // [odd 1/2] 99.763107%, [odd 2/2] 99.267578%
ROM_LOAD32_BYTE( "esd3.fu27", 0x000003, 0x080000, CRC(3358a693) SHA1(2e368e5c26755bbe6d04838015fd4ca5e43ccfb5) ) // [odd 1/2] 99.784470%, [odd 2/2] 99.267578%
ROM_REGION( 0x80000, "oki", 0 ) /* Oki samples */
diff --git a/src/mame/drivers/esh.cpp b/src/mame/drivers/esh.cpp
index 4137a8e7b12..6fb6c3f2f08 100644
--- a/src/mame/drivers/esh.cpp
+++ b/src/mame/drivers/esh.cpp
@@ -361,17 +361,19 @@ void esh_state::machine_start()
/* DRIVER */
MACHINE_CONFIG_START(esh_state::esh)
/* main cpu */
- MCFG_DEVICE_ADD("maincpu", Z80, PCB_CLOCK/6) /* The denominator is a Daphne guess based on PacMan's hardware */
- MCFG_DEVICE_PROGRAM_MAP(z80_0_mem)
- MCFG_DEVICE_IO_MAP(z80_0_io)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", esh_state, vblank_callback_esh)
+ Z80(config, m_maincpu, PCB_CLOCK/6); /* The denominator is a Daphne guess based on PacMan's hardware */
+ m_maincpu->set_addrmap(AS_PROGRAM, &esh_state::z80_0_mem);
+ m_maincpu->set_addrmap(AS_IO, &esh_state::z80_0_io);
+ m_maincpu->set_vblank_int("screen", FUNC(esh_state::vblank_callback_esh));
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
- MCFG_LASERDISC_LDV1000_ADD("laserdisc")
- MCFG_LASERDISC_LDV1000_COMMAND_STROBE_CB(WRITELINE(*this, esh_state, ld_command_strobe_cb))
- MCFG_LASERDISC_OVERLAY_DRIVER(256, 256, esh_state, screen_update_esh)
- MCFG_LASERDISC_OVERLAY_PALETTE(m_palette)
+ PIONEER_LDV1000(config, m_laserdisc, 0);
+ m_laserdisc->command_strobe_callback().set(FUNC(esh_state::ld_command_strobe_cb));
+ m_laserdisc->set_overlay(256, 256, FUNC(esh_state::screen_update_esh));
+ m_laserdisc->set_overlay_palette(m_palette);
+ m_laserdisc->add_route(0, "lspeaker", 1.0);
+ m_laserdisc->add_route(1, "rspeaker", 1.0);
/* video hardware */
MCFG_LASERDISC_SCREEN_ADD_NTSC("screen", "laserdisc")
@@ -383,12 +385,8 @@ MACHINE_CONFIG_START(esh_state::esh)
SPEAKER(config, "lspeaker").front_left();
SPEAKER(config, "rspeaker").front_right();
- MCFG_DEVICE_MODIFY("laserdisc")
- MCFG_SOUND_ROUTE(0, "lspeaker", 1.0)
- MCFG_SOUND_ROUTE(1, "rspeaker", 1.0)
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("beeper", BEEP, 2000)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25)
+ BEEP(config, m_beep, 2000).add_route(ALL_OUTPUTS, "mono", 0.25);
MACHINE_CONFIG_END
// we just disable even lines so we can simulate line blinking
diff --git a/src/mame/drivers/espial.cpp b/src/mame/drivers/espial.cpp
index 47091a72620..a222b72a6d6 100644
--- a/src/mame/drivers/espial.cpp
+++ b/src/mame/drivers/espial.cpp
@@ -319,28 +319,28 @@ GFXDECODE_END
-MACHINE_CONFIG_START(espial_state::espial)
-
+void espial_state::espial(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, 3072000) /* 3.072 MHz */
- MCFG_DEVICE_PROGRAM_MAP(espial_map)
- MCFG_TIMER_DRIVER_ADD_SCANLINE("scantimer", espial_state, espial_scanline, "screen", 0, 1)
+ Z80(config, m_maincpu, 3072000); /* 3.072 MHz */
+ m_maincpu->set_addrmap(AS_PROGRAM, &espial_state::espial_map);
+ TIMER(config, "scantimer").configure_scanline(FUNC(espial_state::espial_scanline), "screen", 0, 1);
- MCFG_DEVICE_ADD("audiocpu", Z80, 3072000) /* 2 MHz?????? */
- MCFG_DEVICE_PROGRAM_MAP(espial_sound_map)
- MCFG_DEVICE_IO_MAP(espial_sound_io_map)
- MCFG_DEVICE_PERIODIC_INT_DRIVER(espial_state, espial_sound_nmi_gen, 4*60)
+ Z80(config, m_audiocpu, 3072000); /* 2 MHz?????? */
+ m_audiocpu->set_addrmap(AS_PROGRAM, &espial_state::espial_sound_map);
+ m_audiocpu->set_addrmap(AS_IO, &espial_state::espial_sound_io_map);
+ m_audiocpu->set_periodic_int(FUNC(espial_state::espial_sound_nmi_gen), attotime::from_hz(4*60));
WATCHDOG_TIMER(config, "watchdog");
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */)
- MCFG_SCREEN_SIZE(32*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(espial_state, screen_update_espial)
- MCFG_SCREEN_PALETTE(m_palette)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500) /* not accurate */);
+ screen.set_size(32*8, 32*8);
+ screen.set_visarea(0*8, 32*8-1, 2*8, 30*8-1);
+ screen.set_screen_update(FUNC(espial_state::screen_update_espial));
+ screen.set_palette(m_palette);
GFXDECODE(config, m_gfxdecode, m_palette, gfx_espial);
PALETTE(config, m_palette, FUNC(espial_state::espial_palette), 256);
@@ -352,22 +352,21 @@ MACHINE_CONFIG_START(espial_state::espial)
GENERIC_LATCH_8(config, "soundlatch2");
AY8910(config, "aysnd", 1500000).add_route(ALL_OUTPUTS, "mono", 0.50);
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(espial_state::netwars)
+void espial_state::netwars(machine_config &config)
+{
espial(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(netwars_map)
+ m_maincpu->set_addrmap(AS_PROGRAM, &espial_state::netwars_map);
/* video hardware */
- MCFG_SCREEN_MODIFY("screen")
- MCFG_SCREEN_SIZE(32*8, 64*8)
+ subdevice<screen_device>("screen")->set_size(32*8, 64*8);
MCFG_VIDEO_START_OVERRIDE(espial_state,netwars)
-MACHINE_CONFIG_END
+}
diff --git a/src/mame/drivers/esq5505.cpp b/src/mame/drivers/esq5505.cpp
index ba790ee8dd6..09dc834a0fa 100644
--- a/src/mame/drivers/esq5505.cpp
+++ b/src/mame/drivers/esq5505.cpp
@@ -222,6 +222,8 @@ private:
DECLARE_WRITE_LINE_MEMBER(duart_tx_b);
DECLARE_WRITE8_MEMBER(duart_output);
+ void es5505_clock_changed(u32 data);
+
int m_system_type;
uint8_t m_duart_io;
uint8_t otis_irq_state;
@@ -270,8 +272,6 @@ IRQ_CALLBACK_MEMBER(esq5505_state::maincpu_irq_acknowledge_callback)
void esq5505_state::machine_start()
{
driver_device::machine_start();
- // tell the pump about the ESP chips
- m_pump->set_esp(m_esp);
m_rom = (uint16_t *)(void *)memregion("osrom")->base();
m_ram = (uint16_t *)(void *)memshare("osram")->ptr();
@@ -435,6 +435,11 @@ WRITE_LINE_MEMBER(esq5505_state::esq5505_otis_irq)
update_irq_to_maincpu();
}
+void esq5505_state::es5505_clock_changed(u32 data)
+{
+ m_pump->set_unscaled_clock(data);
+}
+
WRITE16_MEMBER(esq5505_state::analog_w)
{
offset &= 0x7;
@@ -644,10 +649,12 @@ void esq5505_state::vfx(machine_config &config)
SPEAKER(config, "rspeaker").front_right();
ESQ_5505_5510_PUMP(config, m_pump, 10_MHz_XTAL / (16 * 21));
+ m_pump->set_esp(m_esp);
m_pump->add_route(0, "lspeaker", 1.0);
m_pump->add_route(1, "rspeaker", 1.0);
auto &es5505(ES5505(config, "otis", 10_MHz_XTAL));
+ es5505.sample_rate_changed().set(FUNC(esq5505_state::es5505_clock_changed));
es5505.set_region0("waverom"); /* Bank 0 */
es5505.set_region1("waverom2"); /* Bank 1 */
es5505.set_channels(4); /* channels */
@@ -733,10 +740,12 @@ void esq5505_state::vfx32(machine_config &config)
SPEAKER(config, "rspeaker").front_right();
ESQ_5505_5510_PUMP(config, m_pump, 30.4761_MHz_XTAL / (2 * 16 * 32));
+ m_pump->set_esp(m_esp);
m_pump->add_route(0, "lspeaker", 1.0);
m_pump->add_route(1, "rspeaker", 1.0);
auto &es5505(ES5505(config, "otis", 30.4761_MHz_XTAL / 2));
+ es5505.sample_rate_changed().set(FUNC(esq5505_state::es5505_clock_changed));
es5505.set_region0("waverom"); /* Bank 0 */
es5505.set_region1("waverom2"); /* Bank 1 */
es5505.set_channels(4); /* channels */
diff --git a/src/mame/drivers/esqasr.cpp b/src/mame/drivers/esqasr.cpp
index 139aeab4dea..890748050b0 100644
--- a/src/mame/drivers/esqasr.cpp
+++ b/src/mame/drivers/esqasr.cpp
@@ -76,18 +76,14 @@ private:
DECLARE_WRITE_LINE_MEMBER(esq5506_otto_irq);
DECLARE_READ16_MEMBER(esq5506_read_adc);
+ void es5506_clock_changed(u32 data);
+
void asr_map(address_map &map);
void asrx_map(address_map &map);
};
void esqasr_state::machine_start()
{
- if (m_pump.found())
- {
- // tell the pump about the ESP chips
- if (m_esp.found())
- m_pump->set_esp(m_esp);
- }
}
void esqasr_state::machine_reset()
@@ -116,6 +112,11 @@ READ16_MEMBER(esqasr_state::esq5506_read_adc)
return 0;
}
+void esqasr_state::es5506_clock_changed(u32 data)
+{
+ m_pump->set_unscaled_clock(data);
+}
+
void esqasr_state::asr(machine_config &config)
{
M68000(config, m_maincpu, XTAL(16'000'000)); // actually MC68302
@@ -130,10 +131,12 @@ void esqasr_state::asr(machine_config &config)
SPEAKER(config, "rspeaker").front_right();
ESQ_5505_5510_PUMP(config, m_pump, XTAL(16'000'000) / (16 * 32));
+ m_pump->set_esp(m_esp);
m_pump->add_route(0, "lspeaker", 1.0);
m_pump->add_route(1, "rspeaker", 1.0);
es5506_device &ensoniq(ES5506(config, "ensoniq", XTAL(16'000'000)));
+ ensoniq.sample_rate_changed().set(FUNC(esqasr_state::es5506_clock_changed));
ensoniq.set_region0("waverom"); /* Bank 0 */
ensoniq.set_region1("waverom2"); /* Bank 1 */
ensoniq.set_region2("waverom3"); /* Bank 0 */
@@ -165,10 +168,12 @@ void esqasr_state::asrx(machine_config &config)
SPEAKER(config, "rspeaker").front_right();
ESQ_5505_5510_PUMP(config, m_pump, XTAL(16'000'000) / (16 * 32)); // Actually ES5511
+ m_pump->set_esp(m_esp);
m_pump->add_route(0, "lspeaker", 1.0);
m_pump->add_route(1, "rspeaker", 1.0);
es5506_device &ensoniq(ES5506(config, "ensoniq", XTAL(16'000'000)));
+ ensoniq.sample_rate_changed().set(FUNC(esqasr_state::es5506_clock_changed));
ensoniq.set_region0("waverom"); /* Bank 0 */
ensoniq.set_region1("waverom2"); /* Bank 1 */
ensoniq.set_region2("waverom3"); /* Bank 0 */
diff --git a/src/mame/drivers/esqkt.cpp b/src/mame/drivers/esqkt.cpp
index 370c97ef0bb..0b53ebc8c17 100644
--- a/src/mame/drivers/esqkt.cpp
+++ b/src/mame/drivers/esqkt.cpp
@@ -139,13 +139,12 @@ private:
DECLARE_WRITE_LINE_MEMBER(esq5506_otto_irq);
DECLARE_READ16_MEMBER(esq5506_read_adc);
+ void es5506_clock_changed(u32 data);
void kt_map(address_map &map);
};
void esqkt_state::machine_start()
{
- // tell the pump about the ESP chips
- m_pump->set_esp(m_esp);
}
void esqkt_state::machine_reset()
@@ -194,6 +193,11 @@ READ16_MEMBER(esqkt_state::esq5506_read_adc)
}
}
+void esqkt_state::es5506_clock_changed(u32 data)
+{
+ m_pump->set_unscaled_clock(data);
+}
+
WRITE_LINE_MEMBER(esqkt_state::duart_irq_handler)
{
m_maincpu->set_input_line(M68K_IRQ_3, state);
@@ -244,10 +248,12 @@ void esqkt_state::kt(machine_config &config)
SPEAKER(config, "rspeaker").front_right();
ESQ_5505_5510_PUMP(config, m_pump, 16_MHz_XTAL / (16 * 32));
+ m_pump->set_esp(m_esp);
m_pump->add_route(0, "lspeaker", 1.0);
m_pump->add_route(1, "rspeaker", 1.0);
auto &es5506a(ES5506(config, "ensoniq1", 16_MHz_XTAL));
+ es5506a.sample_rate_changed().set(FUNC(esqkt_state::es5506_clock_changed)); // TODO : Sync with 2 chips?
es5506a.set_region0("waverom"); /* Bank 0 */
es5506a.set_region1("waverom2"); /* Bank 1 */
es5506a.set_region2("waverom3"); /* Bank 0 */
diff --git a/src/mame/drivers/esripsys.cpp b/src/mame/drivers/esripsys.cpp
index 16ddf2c927b..40b749ceae8 100644
--- a/src/mame/drivers/esripsys.cpp
+++ b/src/mame/drivers/esripsys.cpp
@@ -704,7 +704,6 @@ void esripsys_state::esripsys(machine_config &config)
dacvol.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT);
dacvol.add_route(0, "dac", -1.0, DAC_VREF_NEG_INPUT);
voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref", 0));
- vref.set_output(5.0);
vref.add_route(0, "dacvol", 1.0, DAC_VREF_POS_INPUT);
TMS5220(config, m_tms, 640000).add_route(ALL_OUTPUTS, "speaker", 1.0);
diff --git a/src/mame/drivers/et3400.cpp b/src/mame/drivers/et3400.cpp
index eb86741f3fc..e42a4b41111 100644
--- a/src/mame/drivers/et3400.cpp
+++ b/src/mame/drivers/et3400.cpp
@@ -219,10 +219,11 @@ static DEVICE_INPUT_DEFAULTS_START( terminal )
DEVICE_INPUT_DEFAULTS( "RS232_STOPBITS", 0xff, RS232_STOPBITS_2 )
DEVICE_INPUT_DEFAULTS_END
-MACHINE_CONFIG_START(et3400_state::et3400)
+void et3400_state::et3400(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M6800, XTAL(4'000'000) / 4 ) // 1MHz with memory i/o accessory, or 500khz without it
- MCFG_DEVICE_PROGRAM_MAP(mem_map)
+ M6800(config, m_maincpu, XTAL(4'000'000) / 4 ); // 1MHz with memory i/o accessory, or 500khz without it
+ m_maincpu->set_addrmap(AS_PROGRAM, &et3400_state::mem_map);
/* video hardware */
config.set_default_layout(layout_et3400);
@@ -247,11 +248,11 @@ MACHINE_CONFIG_START(et3400_state::et3400)
m_displatch[4]->parallel_out_cb().set(FUNC(et3400_state::led_w<5>));
m_displatch[5]->parallel_out_cb().set(FUNC(et3400_state::led_w<6>));
- MCFG_CASSETTE_ADD("cassette")
- MCFG_CASSETTE_DEFAULT_STATE(CASSETTE_STOPPED | CASSETTE_MOTOR_ENABLED | CASSETTE_SPEAKER_ENABLED)
+ CASSETTE(config, m_cass);
+ m_cass->set_default_state(CASSETTE_STOPPED | CASSETTE_MOTOR_ENABLED | CASSETTE_SPEAKER_ENABLED);
SPEAKER(config, "mono").front_center();
- WAVE(config, "wave", "cassette").add_route(ALL_OUTPUTS, "mono", 0.05);
-MACHINE_CONFIG_END
+ WAVE(config, "wave", m_cass).add_route(ALL_OUTPUTS, "mono", 0.05);
+}
/* ROM definition */
ROM_START( et3400 )
diff --git a/src/mame/drivers/eti660.cpp b/src/mame/drivers/eti660.cpp
index 9ca22647fc5..0aae8a216db 100644
--- a/src/mame/drivers/eti660.cpp
+++ b/src/mame/drivers/eti660.cpp
@@ -48,7 +48,7 @@ READ8_MEMBER( eti660_state::pia_r )
{
uint8_t pia_offset = m_maincpu->get_memory_address() & 0x03;
- return m_pia->read(space, pia_offset);
+ return m_pia->read(pia_offset);
}
WRITE8_MEMBER( eti660_state::pia_w )
@@ -66,7 +66,7 @@ WRITE8_MEMBER( eti660_state::pia_w )
data = 0x24;
}
- m_pia->write(space, pia_offset, data);
+ m_pia->write(pia_offset, data);
}
WRITE8_MEMBER( eti660_state::colorram_w )
@@ -342,14 +342,14 @@ MACHINE_CONFIG_START(eti660_state::eti660)
m_pia->irqa_handler().set_inputline(m_maincpu, COSMAC_INPUT_LINE_INT).invert(); // FIXME: use an input merger for these lines
m_pia->irqb_handler().set_inputline(m_maincpu, COSMAC_INPUT_LINE_INT).invert();
- MCFG_CASSETTE_ADD("cassette")
- MCFG_CASSETTE_DEFAULT_STATE(CASSETTE_STOPPED | CASSETTE_MOTOR_ENABLED | CASSETTE_SPEAKER_MUTED)
+ CASSETTE(config, m_cassette);
+ m_cassette->set_default_state(CASSETTE_STOPPED | CASSETTE_MOTOR_ENABLED | CASSETTE_SPEAKER_MUTED);
/* internal ram */
RAM(config, RAM_TAG).set_default_size("3K");
/* quickload */
- MCFG_QUICKLOAD_ADD("quickload", eti660_state, eti660, "bin,c8,ch8", 2)
+ MCFG_QUICKLOAD_ADD("quickload", eti660_state, eti660, "bin,c8,ch8", attotime::from_seconds(2))
MACHINE_CONFIG_END
/* ROMs */
diff --git a/src/mame/drivers/ettrivia.cpp b/src/mame/drivers/ettrivia.cpp
index abcead4b5eb..9ad1b40a8bb 100644
--- a/src/mame/drivers/ettrivia.cpp
+++ b/src/mame/drivers/ettrivia.cpp
@@ -138,20 +138,20 @@ WRITE8_MEMBER(ettrivia_state::b800_w)
/* special case to return the value written to 0xb000 */
/* does it reset the chips too ? */
case 0: break;
- case 0xc4: m_b000_ret = m_ay[0]->data_r(space, 0); break;
- case 0x94: m_b000_ret = m_ay[1]->data_r(space, 0); break;
- case 0x86: m_b000_ret = m_ay[2]->data_r(space, 0); break;
+ case 0xc4: m_b000_ret = m_ay[0]->data_r(); break;
+ case 0x94: m_b000_ret = m_ay[1]->data_r(); break;
+ case 0x86: m_b000_ret = m_ay[2]->data_r(); break;
case 0x80:
switch(m_b800_prev)
{
- case 0xe0: m_ay[0]->address_w(space,0,m_b000_val); break;
- case 0x98: m_ay[1]->address_w(space,0,m_b000_val); break;
- case 0x83: m_ay[2]->address_w(space,0,m_b000_val); break;
+ case 0xe0: m_ay[0]->address_w(m_b000_val); break;
+ case 0x98: m_ay[1]->address_w(m_b000_val); break;
+ case 0x83: m_ay[2]->address_w(m_b000_val); break;
- case 0xa0: m_ay[0]->data_w(space,0,m_b000_val); break;
- case 0x88: m_ay[1]->data_w(space,0,m_b000_val); break;
- case 0x81: m_ay[2]->data_w(space,0,m_b000_val); break;
+ case 0xa0: m_ay[0]->data_w(m_b000_val); break;
+ case 0x88: m_ay[1]->data_w(m_b000_val); break;
+ case 0x81: m_ay[2]->data_w(m_b000_val); break;
}
break;
@@ -258,17 +258,17 @@ void ettrivia_state::ettrivia_palette(palette_device &palette) const
// red component
bit0 = BIT(color_prom[i], 0);
bit1 = BIT(color_prom[i+0x100], 0);
- int const r = combine_2_weights(weights, bit0, bit1);
+ int const r = combine_weights(weights, bit0, bit1);
// green component
bit0 = BIT(color_prom[i], 2);
bit1 = BIT(color_prom[i+0x100], 2);
- int const g = combine_2_weights(weights, bit0, bit1);
+ int const g = combine_weights(weights, bit0, bit1);
// blue component
bit0 = BIT(color_prom[i], 1);
bit1 = BIT(color_prom[i+0x100], 1);
- int const b = combine_2_weights(weights, bit0, bit1);
+ int const b = combine_weights(weights, bit0, bit1);
palette.set_pen_color(bitswap<8>(i,5,7,6,2,1,0,4,3), rgb_t(r, g, b));
}
@@ -297,22 +297,23 @@ INTERRUPT_GEN_MEMBER(ettrivia_state::ettrivia_interrupt)
device.execute().set_input_line(0, HOLD_LINE);
}
-MACHINE_CONFIG_START(ettrivia_state::ettrivia)
- MCFG_DEVICE_ADD("maincpu", Z80,12000000/4-48000) //should be ok, it gives the 300 interrupts expected
- MCFG_DEVICE_PROGRAM_MAP(cpu_map)
- MCFG_DEVICE_IO_MAP(io_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", ettrivia_state, ettrivia_interrupt)
+void ettrivia_state::ettrivia(machine_config &config)
+{
+ Z80(config, m_maincpu, 12000000/4-48000); //should be ok, it gives the 300 interrupts expected
+ m_maincpu->set_addrmap(AS_PROGRAM, &ettrivia_state::cpu_map);
+ m_maincpu->set_addrmap(AS_IO, &ettrivia_state::io_map);
+ m_maincpu->set_vblank_int("screen", FUNC(ettrivia_state::ettrivia_interrupt));
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(256, 256)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 0*8, 28*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(ettrivia_state, screen_update_ettrivia)
- MCFG_SCREEN_PALETTE("palette")
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(256, 256);
+ screen.set_visarea(0*8, 32*8-1, 0*8, 28*8-1);
+ screen.set_screen_update(FUNC(ettrivia_state::screen_update_ettrivia));
+ screen.set_palette("palette");
GFXDECODE(config, m_gfxdecode, "palette", gfx_ettrivia);
PALETTE(config, "palette", FUNC(ettrivia_state::ettrivia_palette), 256);
@@ -329,7 +330,7 @@ MACHINE_CONFIG_START(ettrivia_state::ettrivia)
AY8912(config, m_ay[2], 1500000);
m_ay[2]->port_a_read_callback().set_ioport("IN0");
m_ay[2]->add_route(ALL_OUTPUTS, "mono", 0.25);
-MACHINE_CONFIG_END
+}
ROM_START( promutrv )
ROM_REGION( 0x10000, "maincpu", 0 )
diff --git a/src/mame/drivers/eurocom2.cpp b/src/mame/drivers/eurocom2.cpp
index cb14c154bfa..9f916f38183 100644
--- a/src/mame/drivers/eurocom2.cpp
+++ b/src/mame/drivers/eurocom2.cpp
@@ -51,17 +51,16 @@
#define VC_DISP_VERT 256
-#define VERBOSE_DBG 2 /* general debug messages */
+//#define LOG_GENERAL (1U << 0) //defined in logmacro.h already
+#define LOG_KEYBOARD (1U << 1)
+#define LOG_DEBUG (1U << 2)
-#define DBG_LOG(N,M,A) \
- do { \
- if(VERBOSE_DBG>=N) \
- { \
- if( M ) \
- logerror("%11.6f at %s: %-10s",machine().time().as_double(),machine().describe_context(),(char*)M ); \
- logerror A; \
- } \
- } while (0)
+//#define VERBOSE (LOG_DEBUG)
+//#define LOG_OUTPUT_FUNC printf
+#include "logmacro.h"
+
+#define LOGKBD(...) LOGMASKED(LOG_KEYBOARD, __VA_ARGS__)
+#define LOGDBG(...) LOGMASKED(LOG_DEBUG, __VA_ARGS__)
class eurocom2_state : public driver_device
@@ -172,7 +171,7 @@ READ8_MEMBER(eurocom2_state::fdc_aux_r)
data |= (m_fdc->intrq_r() << 6);
data |= (m_fdc->drq_r() << 7);
- DBG_LOG(3, "Floppy", ("%d == %02x\n", offset, data));
+ LOGDBG("Floppy %d == %02x\n", offset, data);
return data;
}
@@ -212,12 +211,12 @@ WRITE8_MEMBER(eurocom2_state::fdc_aux_w)
m_fdc->dden_w(BIT(data, 5));
- DBG_LOG(3, "Floppy", ("%d <- %02x\n", offset, data));
+ LOGDBG("Floppy %d <- %02x\n", offset, data);
}
WRITE8_MEMBER(eurocom2_state::vico_w)
{
- DBG_LOG(2, "VICO", ("%d <- %02x\n", offset, data));
+ LOG("VICO %d <- %02x\n", offset, data);
m_vico[offset & 1] = data;
}
@@ -225,21 +224,21 @@ WRITE8_MEMBER(eurocom2_state::vico_w)
READ_LINE_MEMBER(eurocom2_state::pia1_ca2_r)
{
- DBG_LOG(3, "PIA1", ("CA2 == %d (SST Q14)\n", m_sst_state));
+ LOGDBG("PIA1 CA2 == %d (SST Q14)\n", m_sst_state);
return m_sst_state;
}
READ_LINE_MEMBER(eurocom2_state::pia1_cb1_r)
{
- DBG_LOG(3, "PIA1", ("CB1 == %d (SST Q6)\n", m_sst_state));
+ LOGDBG("PIA1 CB1 == %d (SST Q6)\n", m_sst_state);
return m_sst_state;
}
WRITE_LINE_MEMBER(eurocom2_state::pia1_cb2_w)
{
- DBG_LOG(2, "PIA1", ("CB2 <- %d (SST reset)\n", state));
+ LOG("PIA1 CB2 <- %d (SST reset)\n", state);
// reset single-step timer
}
@@ -438,14 +437,15 @@ static void eurocom_floppies(device_slot_interface &device)
device.option_add("8dsdd", FLOPPY_8_DSDD);
}
-MACHINE_CONFIG_START(eurocom2_state::eurocom2)
- MCFG_DEVICE_ADD("maincpu", MC6809, 10.7172_MHz_XTAL / 2) // EXTAL = CLK/2 = 5.3586 MHz; Q = E = 1.33965 MHz
- MCFG_DEVICE_PROGRAM_MAP(eurocom2_map)
+void eurocom2_state::eurocom2(machine_config &config)
+{
+ MC6809(config, m_maincpu, 10.7172_MHz_XTAL / 2); // EXTAL = CLK/2 = 5.3586 MHz; Q = E = 1.33965 MHz
+ m_maincpu->set_addrmap(AS_PROGRAM, &eurocom2_state::eurocom2_map);
- MCFG_SCREEN_ADD_MONOCHROME("screen", RASTER, rgb_t::green())
- MCFG_SCREEN_RAW_PARAMS(10.7172_MHz_XTAL, VC_TOTAL_HORZ, 0, VC_DISP_HORZ, VC_TOTAL_VERT, 0, VC_DISP_VERT)
- MCFG_SCREEN_UPDATE_DRIVER(eurocom2_state, screen_update)
- MCFG_SCREEN_PALETTE("palette")
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER, rgb_t::green());
+ m_screen->set_raw(10.7172_MHz_XTAL, VC_TOTAL_HORZ, 0, VC_DISP_HORZ, VC_TOTAL_VERT, 0, VC_DISP_VERT);
+ m_screen->set_screen_update(FUNC(eurocom2_state::screen_update));
+ m_screen->set_palette("palette");
PALETTE(config, "palette", palette_device::MONOCHROME);
@@ -475,16 +475,14 @@ MACHINE_CONFIG_START(eurocom2_state::eurocom2)
FD1793(config, m_fdc, 2_MHz_XTAL / 2);
// m_fdc->intrq_wr_callback().set_inputline(m_maincpu, M6809_IRQ_LINE);
- MCFG_FLOPPY_DRIVE_ADD("fdc:0", eurocom_floppies, "525qd", eurocom2_state::floppy_formats)
-// MCFG_FLOPPY_DRIVE_SOUND(true)
- MCFG_FLOPPY_DRIVE_ADD("fdc:1", eurocom_floppies, "525qd", eurocom2_state::floppy_formats)
-// MCFG_FLOPPY_DRIVE_SOUND(true)
-MACHINE_CONFIG_END
+ FLOPPY_CONNECTOR(config, "fdc:0", eurocom_floppies, "525qd", eurocom2_state::floppy_formats);// enable_sound(true);
+ FLOPPY_CONNECTOR(config, "fdc:1", eurocom_floppies, "525qd", eurocom2_state::floppy_formats);// enable_sound(true);
+}
-MACHINE_CONFIG_START(waveterm_state::waveterm)
+void waveterm_state::waveterm(machine_config &config)
+{
eurocom2(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(waveterm_map)
+ m_maincpu->set_addrmap(AS_PROGRAM, &waveterm_state::waveterm_map);
m_pia2->cb2_handler().set(FUNC(waveterm_state::waveterm_kbh_w));
m_pia2->writepb_handler().set(FUNC(waveterm_state::waveterm_kb_w));
@@ -501,16 +499,17 @@ MACHINE_CONFIG_START(waveterm_state::waveterm)
m_pia3->readcb1_handler().set_ioport("FP");
// m_pia3->cb2_handler().set(FUNC(waveterm_state::pia3_cb2_w));
- MCFG_DEVICE_ADD("ptm", PTM6840, 0)
+ PTM6840(config, m_ptm, 0);
- MCFG_SOFTWARE_LIST_ADD("disk_list", "waveterm")
-MACHINE_CONFIG_END
+ SOFTWARE_LIST(config, "disk_list").set_original("waveterm");
+}
-MACHINE_CONFIG_START(eurocom2_state::microtrol)
+void eurocom2_state::microtrol(machine_config &config)
+{
eurocom2(config);
// TODO: Second board has WD2793A FDC and what looks like a RAM disk
-MACHINE_CONFIG_END
+}
ROM_START(eurocom2)
diff --git a/src/mame/drivers/europc.cpp b/src/mame/drivers/europc.cpp
index 1ac51ff2853..429def9e01b 100644
--- a/src/mame/drivers/europc.cpp
+++ b/src/mame/drivers/europc.cpp
@@ -31,6 +31,7 @@
#include "emu.h"
#include "cpu/i86/i86.h"
#include "bus/isa/aga.h"
+#include "bus/isa/fdc.h"
#include "machine/genpc.h"
#include "machine/nvram.h"
#include "machine/pckeybrd.h"
@@ -91,7 +92,6 @@ private:
{
TIMER_RTC
};
- static void cfg_builtin_720K(device_t *device);
void europc_io(address_map &map);
void europc_map(address_map &map);
};
@@ -514,32 +514,59 @@ void europc_pc_state::europc_io(address_map &map)
map(0x02e0, 0x02e0).r(FUNC(europc_pc_state::europc_jim2_r));
}
-/* single built-in 3.5" 720K drive, connector for optional external 3.5" or 5.25" drive */
-void europc_pc_state::cfg_builtin_720K(device_t *device)
+class europc_fdc_device : public isa8_fdc_device
{
- dynamic_cast<device_slot_interface &>(*device->subdevice("fdc:0")).set_default_option("35dd");
- dynamic_cast<device_slot_interface &>(*device->subdevice("fdc:0")).set_fixed(true);
- dynamic_cast<device_slot_interface &>(*device->subdevice("fdc:1")).set_default_option("");
+public:
+ europc_fdc_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+
+protected:
+ virtual void device_add_mconfig(machine_config &config) override;
+};
+
+DEFINE_DEVICE_TYPE(EUROPC_FDC, europc_fdc_device, "europc_fdc", "EURO PC FDC hookup")
+
+europc_fdc_device::europc_fdc_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+ : isa8_fdc_device(mconfig, EUROPC_FDC, tag, owner, clock)
+{
+}
+
+static void pc_dd_floppies(device_slot_interface &device)
+{
+ device.option_add("525dd", FLOPPY_525_DD);
+ device.option_add("35dd", FLOPPY_35_DD);
+}
+
+void europc_fdc_device::device_add_mconfig(machine_config &config)
+{
+ wd37c65c_device &fdc(WD37C65C(config, m_fdc, 16_MHz_XTAL));
+ fdc.intrq_wr_callback().set(FUNC(isa8_fdc_device::irq_w));
+ fdc.drq_wr_callback().set(FUNC(isa8_fdc_device::drq_w));
+ // single built-in 3.5" 720K drive, connector for optional external 3.5" or 5.25" drive
+ FLOPPY_CONNECTOR(config, "fdc:0", pc_dd_floppies, "35dd", isa8_fdc_device::floppy_formats).set_fixed(true);
+ FLOPPY_CONNECTOR(config, "fdc:1", pc_dd_floppies, "", isa8_fdc_device::floppy_formats);
+}
+
+static void europc_fdc(device_slot_interface &device)
+{
+ device.option_add("fdc", EUROPC_FDC);
}
//Euro PC
-MACHINE_CONFIG_START(europc_pc_state::europc)
- MCFG_DEVICE_ADD("maincpu", I8088, 4772720*2)
- MCFG_DEVICE_PROGRAM_MAP(europc_map)
- MCFG_DEVICE_IO_MAP(europc_io)
- MCFG_DEVICE_IRQ_ACKNOWLEDGE_DEVICE("mb:pic8259", pic8259_device, inta_cb)
-
- MCFG_PCNOPPI_MOTHERBOARD_ADD("mb", "maincpu")
-
- MCFG_DEVICE_ADD("isa1", ISA8_SLOT, 0, "mb:isa", pc_isa8_cards, "aga", false) // FIXME: determine ISA bus clock
- MCFG_DEVICE_ADD("isa2", ISA8_SLOT, 0, "mb:isa", pc_isa8_cards, "lpt", false)
- MCFG_SLOT_FIXED(true)
- MCFG_DEVICE_ADD("isa3", ISA8_SLOT, 0, "mb:isa", pc_isa8_cards, "com", false)
- MCFG_SLOT_FIXED(true)
- MCFG_DEVICE_ADD("isa4", ISA8_SLOT, 0, "mb:isa", pc_isa8_cards, "fdc_xt", false)
- MCFG_SLOT_OPTION_MACHINE_CONFIG("fdc_xt", cfg_builtin_720K)
- MCFG_SLOT_FIXED(true)
- MCFG_PC_KEYB_ADD("pc_keyboard", WRITELINE("mb:pic8259", pic8259_device, ir1_w))
+void europc_pc_state::europc(machine_config &config)
+{
+ I8088(config, m_maincpu, 4772720*2);
+ m_maincpu->set_addrmap(AS_PROGRAM, &europc_pc_state::europc_map);
+ m_maincpu->set_addrmap(AS_IO, &europc_pc_state::europc_io);
+ m_maincpu->set_irq_acknowledge_callback("mb:pic8259", FUNC(pic8259_device::inta_cb));
+
+ PCNOPPI_MOTHERBOARD(config, "mb", 0).set_cputag(m_maincpu);
+
+ ISA8_SLOT(config, "isa1", 0, "mb:isa", pc_isa8_cards, "aga", false); // FIXME: determine ISA bus clock
+ ISA8_SLOT(config, "isa2", 0, "mb:isa", pc_isa8_cards, "lpt", true);
+ ISA8_SLOT(config, "isa3", 0, "mb:isa", pc_isa8_cards, "com", true);
+ ISA8_SLOT(config, "isa4", 0, "mb:isa", europc_fdc, "fdc", true);
+ PC_KEYB(config, m_keyboard);
+ m_keyboard->keypress().set("mb:pic8259", FUNC(pic8259_device::ir1_w));
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);;
@@ -548,8 +575,8 @@ MACHINE_CONFIG_START(europc_pc_state::europc)
RAM(config, m_ram).set_default_size("512K").set_extra_options("256K, 640K");
/* software lists */
- MCFG_SOFTWARE_LIST_ADD("disk_list", "ibm5150")
-MACHINE_CONFIG_END
+ SOFTWARE_LIST(config, "disk_list").set_original("ibm5150");
+}
//Euro PC II
void europc_pc_state::europc2(machine_config &config)
@@ -560,18 +587,16 @@ void europc_pc_state::europc2(machine_config &config)
}
//Euro XT
-MACHINE_CONFIG_START(europc_pc_state::euroxt)
+void europc_pc_state::euroxt(machine_config &config)
+{
europc(config);
m_ram->set_default_size("768K");
- MCFG_DEVICE_MODIFY("isa2")
- MCFG_SLOT_DEFAULT_OPTION(nullptr)
- MCFG_DEVICE_ADD("isa5", ISA8_SLOT, 0, "mb:isa", pc_isa8_cards, "xtide", false) // FIXME: determine ISA bus clock
- MCFG_SLOT_FIXED(true)
- MCFG_DEVICE_ADD("isa6", ISA8_SLOT, 0, "mb:isa", pc_isa8_cards, "lpt", false)
- MCFG_SLOT_FIXED(true)
-MACHINE_CONFIG_END
+ subdevice<isa8_slot_device>("isa2")->set_default_option(nullptr);
+ ISA8_SLOT(config, "isa5", 0, "mb:isa", pc_isa8_cards, "xtide", true); // FIXME: determine ISA bus clock
+ ISA8_SLOT(config, "isa6", 0, "mb:isa", pc_isa8_cards, "lpt", true);
+}
ROM_START( europc )
ROM_REGION(0x10000,"bios", 0)
@@ -592,12 +617,18 @@ ROM_START( europc )
ROMX_LOAD("bios_v2.04.bin", 0x8000, 0x8000, CRC(e623967c) SHA1(5196b14018da1f3198e2950af0e6eab41425f556), ROM_BIOS(6))
ROM_SYSTEM_BIOS( 7, "v2.05", "EuroPC v2.05" )
ROMX_LOAD("bios_2.05.bin", 0x8000, 0x8000, CRC(372ceed6) SHA1(bb3d3957a22422f98be2225bdc47705bcab96f56), ROM_BIOS(7)) // v2.04 and v2.05 don't work yet, , see comment section
- ROM_END
+
+ ROM_REGION(0x1000, "kbdctrl", 0)
+ ROM_LOAD("zc86115p-mc6805u2.bin", 0x0000, 0x1000, CRC(d90c1fab) SHA1(ddb7060abddee7294723833c303090de35c1e79c))
+ROM_END
ROM_START( europc2 )
ROM_REGION(0x10000,"bios", 0)
// hdd bios integrated!
ROM_LOAD("europcii_bios_v3.01_500145.bin", 0x8000, 0x8000, CRC(ecca89c8) SHA1(802b89babdf0ab0a0a9c21d1234e529c8386d6fb))
+
+ ROM_REGION(0x1000, "kbdctrl", 0)
+ ROM_LOAD("zc86115p-mc6805u2.bin", 0x0000, 0x1000, CRC(d90c1fab) SHA1(ddb7060abddee7294723833c303090de35c1e79c))
ROM_END
ROM_START( euroxt )
diff --git a/src/mame/drivers/evmbug.cpp b/src/mame/drivers/evmbug.cpp
index 4d5669728b5..ad78722fbb7 100644
--- a/src/mame/drivers/evmbug.cpp
+++ b/src/mame/drivers/evmbug.cpp
@@ -59,10 +59,8 @@ void evmbug_state::mem_map(address_map &map)
void evmbug_state::io_map(address_map &map)
{
map.unmap_value_high();
- //AM_RANGE(0x0000, 0x0003) AM_DEVREAD("uart1", tms9902_device, cruread)
- //AM_RANGE(0x0000, 0x001f) AM_DEVWRITE("uart1", tms9902_device, cruwrite)
- map(0x0000, 0x0003).r(FUNC(evmbug_state::rs232_r));
- map(0x0000, 0x001f).w(FUNC(evmbug_state::rs232_w));
+ //map(0x0000, 0x003f).rw("uart1", FUNC(tms9902_device::cruread), FUNC(tms9902_device::cruwrite));
+ map(0x0000, 0x003f).rw(FUNC(evmbug_state::rs232_r), FUNC(evmbug_state::rs232_w));
}
/* Input ports */
@@ -71,16 +69,19 @@ INPUT_PORTS_END
READ8_MEMBER( evmbug_state::rs232_r )
{
- if (offset == 0)
- return m_term_data;
- else
- if (offset == 2)
- return (m_rbrl ? 0x20 : 0) | 0xc0;
- else
+ if (offset < 8)
+ return BIT(m_term_data, offset);
+ else if (offset == 21)
+ return m_rbrl;
+ else if (offset == 22 || offset == 23)
+ return 1;
+ else if (offset == 15)
{
m_rin ^= 1;
- return m_rin << 7;
+ return m_rin;
}
+ else
+ return 0;
}
WRITE8_MEMBER( evmbug_state::rs232_w )
@@ -93,7 +94,7 @@ WRITE8_MEMBER( evmbug_state::rs232_w )
m_term_out |= (data << offset);
if (offset == 7)
- m_terminal->write(space, 0, m_term_out & 0x7f);
+ m_terminal->write(m_term_out & 0x7f);
}
else
if (offset == 18)
diff --git a/src/mame/drivers/excali64.cpp b/src/mame/drivers/excali64.cpp
index caf29423c86..8779ce79392 100644
--- a/src/mame/drivers/excali64.cpp
+++ b/src/mame/drivers/excali64.cpp
@@ -75,6 +75,9 @@ public:
void excali64(machine_config &config);
+protected:
+ virtual void machine_reset() override;
+
private:
void excali64_palette(palette_device &palette);
DECLARE_WRITE8_MEMBER(ppib_w);
@@ -97,7 +100,7 @@ private:
DECLARE_WRITE_LINE_MEMBER(crtc_hs);
DECLARE_WRITE_LINE_MEMBER(crtc_vs);
DECLARE_WRITE_LINE_MEMBER(motor_w);
- DECLARE_MACHINE_RESET(excali64);
+
void io_map(address_map &map);
void mem_map(address_map &map);
@@ -412,7 +415,7 @@ WRITE8_MEMBER( excali64_state::port70_w )
membank("bankr1")->set_entry(2);
}
-MACHINE_RESET_MEMBER( excali64_state, excali64 )
+void excali64_state::machine_reset()
{
membank("bankr1")->set_entry(1); // read from ROM
membank("bankr2")->set_entry(1); // read from ROM
@@ -550,13 +553,12 @@ MC6845_UPDATE_ROW( excali64_state::update_row )
}
}
-MACHINE_CONFIG_START(excali64_state::excali64)
+void excali64_state::excali64(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, 16_MHz_XTAL / 4)
- MCFG_DEVICE_PROGRAM_MAP(mem_map)
- MCFG_DEVICE_IO_MAP(io_map)
-
- MCFG_MACHINE_RESET_OVERRIDE(excali64_state, excali64)
+ Z80(config, m_maincpu, 16_MHz_XTAL / 4);
+ m_maincpu->set_addrmap(AS_PROGRAM, &excali64_state::mem_map);
+ m_maincpu->set_addrmap(AS_IO, &excali64_state::io_map);
I8251(config, "uart", 0);
//uart.txd_handler().set("rs232", FUNC(rs232_port_device::write_txd));
@@ -581,12 +583,12 @@ MACHINE_CONFIG_START(excali64_state::excali64)
WAVE(config, "wave", "cassette").add_route(ALL_OUTPUTS, "mono", 0.05);
/* Video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(50)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */
- MCFG_SCREEN_SIZE(80*8, 24*12)
- MCFG_SCREEN_VISIBLE_AREA(0, 80*8-1, 0, 24*12-1)
- MCFG_SCREEN_UPDATE_DEVICE("crtc", mc6845_device, screen_update)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(50);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */
+ screen.set_size(80*8, 24*12);
+ screen.set_visarea_full();
+ screen.set_screen_update("crtc", FUNC(mc6845_device::screen_update));
PALETTE(config, m_palette, FUNC(excali64_state::excali64_palette), 40);
GFXDECODE(config, "gfxdecode", m_palette, gfx_excali64);
@@ -600,14 +602,12 @@ MACHINE_CONFIG_START(excali64_state::excali64)
m_crtc->out_vsync_callback().set(FUNC(excali64_state::crtc_vs));
/* Devices */
- MCFG_CASSETTE_ADD( "cassette" )
+ CASSETTE(config, m_cass);
WD2793(config, m_fdc, 16_MHz_XTAL / 16);
m_fdc->drq_wr_callback().set(m_dma, FUNC(z80dma_device::rdy_w));
- MCFG_FLOPPY_DRIVE_ADD("fdc:0", excali64_floppies, "525qd", excali64_state::floppy_formats)
- MCFG_FLOPPY_DRIVE_SOUND(true)
- MCFG_FLOPPY_DRIVE_ADD("fdc:1", excali64_floppies, "525qd", excali64_state::floppy_formats)
- MCFG_FLOPPY_DRIVE_SOUND(true)
+ FLOPPY_CONNECTOR(config, "fdc:0", excali64_floppies, "525qd", excali64_state::floppy_formats).enable_sound(true);
+ FLOPPY_CONNECTOR(config, "fdc:1", excali64_floppies, "525qd", excali64_state::floppy_formats).enable_sound(true);
Z80DMA(config, m_dma, 16_MHz_XTAL / 4);
m_dma->out_busreq_callback().set(FUNC(excali64_state::busreq_w));
@@ -625,10 +625,12 @@ MACHINE_CONFIG_START(excali64_state::excali64)
m_u12->set_clear_pin_value(1); /* Clear pin - pulled high */
m_u12->out_cb().set(FUNC(excali64_state::motor_w));
- MCFG_DEVICE_ADD(m_centronics, CENTRONICS, centronics_devices, "printer")
- MCFG_CENTRONICS_BUSY_HANDLER(WRITELINE(*this, excali64_state, cent_busy_w))
- MCFG_CENTRONICS_OUTPUT_LATCH_ADD("cent_data_out", "centronics")
-MACHINE_CONFIG_END
+ CENTRONICS(config, m_centronics, centronics_devices, "printer");
+ m_centronics->busy_handler().set(FUNC(excali64_state::cent_busy_w));
+
+ output_latch_device &cent_data_out(OUTPUT_LATCH(config, "cent_data_out"));
+ m_centronics->set_output_latch(cent_data_out);
+}
/* ROM definition */
ROM_START( excali64 )
diff --git a/src/mame/drivers/exedexes.cpp b/src/mame/drivers/exedexes.cpp
index d8214068174..66e5701f002 100644
--- a/src/mame/drivers/exedexes.cpp
+++ b/src/mame/drivers/exedexes.cpp
@@ -63,8 +63,8 @@ void exedexes_state::sound_map(address_map &map)
map(0x4000, 0x47ff).ram();
map(0x6000, 0x6000).r("soundlatch", FUNC(generic_latch_8_device::read));
map(0x8000, 0x8001).w("aysnd", FUNC(ay8910_device::address_data_w));
- map(0x8002, 0x8002).w("sn1", FUNC(sn76489_device::command_w));
- map(0x8003, 0x8003).w("sn2", FUNC(sn76489_device::command_w));
+ map(0x8002, 0x8002).w("sn1", FUNC(sn76489_device::write));
+ map(0x8003, 0x8003).w("sn2", FUNC(sn76489_device::write));
}
@@ -219,31 +219,31 @@ void exedexes_state::machine_reset()
m_sc2on = 0;
}
-MACHINE_CONFIG_START(exedexes_state::exedexes)
-
+void exedexes_state::exedexes(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, 4000000) /* 4 MHz (?) */
- MCFG_DEVICE_PROGRAM_MAP(exedexes_map)
- MCFG_TIMER_DRIVER_ADD_SCANLINE("scantimer", exedexes_state, exedexes_scanline, "screen", 0, 1)
+ Z80(config, m_maincpu, 4000000); /* 4 MHz (?) */
+ m_maincpu->set_addrmap(AS_PROGRAM, &exedexes_state::exedexes_map);
+ TIMER(config, "scantimer").configure_scanline(FUNC(exedexes_state::exedexes_scanline), "screen", 0, 1);
- MCFG_DEVICE_ADD("audiocpu", Z80, 3000000) /* 3 MHz ??? */
- MCFG_DEVICE_PROGRAM_MAP(sound_map)
- MCFG_DEVICE_PERIODIC_INT_DRIVER(exedexes_state, irq0_line_hold, 4*60)
+ z80_device &audiocpu(Z80(config, "audiocpu", 3000000)); /* 3 MHz ??? */
+ audiocpu.set_addrmap(AS_PROGRAM, &exedexes_state::sound_map);
+ audiocpu.set_periodic_int(FUNC(exedexes_state::irq0_line_hold), attotime::from_hz(4*60));
/* video hardware */
- MCFG_DEVICE_ADD("spriteram", BUFFERED_SPRITERAM8)
+ BUFFERED_SPRITERAM8(config, m_spriteram);
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(32*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(exedexes_state, screen_update_exedexes)
- MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE("spriteram", buffered_spriteram8_device, vblank_copy_rising))
- MCFG_SCREEN_PALETTE("palette")
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(32*8, 32*8);
+ screen.set_visarea(0*8, 32*8-1, 2*8, 30*8-1);
+ screen.set_screen_update(FUNC(exedexes_state::screen_update_exedexes));
+ screen.screen_vblank().set(m_spriteram, FUNC(buffered_spriteram8_device::vblank_copy_rising));
+ screen.set_palette(m_palette);
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_exedexes)
+ GFXDECODE(config, m_gfxdecode, m_palette, gfx_exedexes);
PALETTE(config, m_palette, FUNC(exedexes_state::exedexes_palette), 64*4+64*4+16*16+16*16, 256);
@@ -254,12 +254,10 @@ MACHINE_CONFIG_START(exedexes_state::exedexes)
AY8910(config, "aysnd", 1500000).add_route(ALL_OUTPUTS, "mono", 0.10);
- MCFG_DEVICE_ADD("sn1", SN76489, 3000000)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.36)
+ SN76489(config, "sn1", 3000000).add_route(ALL_OUTPUTS, "mono", 0.36);
- MCFG_DEVICE_ADD("sn2", SN76489, 3000000)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.36)
-MACHINE_CONFIG_END
+ SN76489(config, "sn2", 3000000).add_route(ALL_OUTPUTS, "mono", 0.36);
+}
diff --git a/src/mame/drivers/exelv.cpp b/src/mame/drivers/exelv.cpp
index 6c0be4d51ca..f4a8b03a942 100644
--- a/src/mame/drivers/exelv.cpp
+++ b/src/mame/drivers/exelv.cpp
@@ -380,7 +380,7 @@ WRITE8_MEMBER(exelv_state::tms7041_portd_w)
READ8_MEMBER(exelv_state::rom_r)
{
if (m_cart && m_cart->exists())
- return m_cart->read_rom(space, offset + 0x200);
+ return m_cart->read_rom(offset + 0x200);
return 0;
}
diff --git a/src/mame/drivers/exerion.cpp b/src/mame/drivers/exerion.cpp
index 1bce76d1346..93afe3231ea 100644
--- a/src/mame/drivers/exerion.cpp
+++ b/src/mame/drivers/exerion.cpp
@@ -372,20 +372,20 @@ void exerion_state::machine_reset()
m_background_latches[i] = 0;
}
-MACHINE_CONFIG_START(exerion_state::exerion)
-
- MCFG_DEVICE_ADD("maincpu", Z80, EXERION_CPU_CLOCK)
- MCFG_DEVICE_PROGRAM_MAP(main_map)
+void exerion_state::exerion(machine_config &config)
+{
+ Z80(config, m_maincpu, EXERION_CPU_CLOCK);
+ m_maincpu->set_addrmap(AS_PROGRAM, &exerion_state::main_map);
- MCFG_DEVICE_ADD("sub", Z80, EXERION_CPU_CLOCK)
- MCFG_DEVICE_PROGRAM_MAP(sub_map)
+ z80_device &sub(Z80(config, "sub", EXERION_CPU_CLOCK));
+ sub.set_addrmap(AS_PROGRAM, &exerion_state::sub_map);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_RAW_PARAMS(EXERION_PIXEL_CLOCK, EXERION_HTOTAL, EXERION_HBEND, EXERION_HBSTART, EXERION_VTOTAL, EXERION_VBEND, EXERION_VBSTART)
- MCFG_SCREEN_UPDATE_DRIVER(exerion_state, screen_update_exerion)
- MCFG_SCREEN_PALETTE(m_palette)
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_raw(EXERION_PIXEL_CLOCK, EXERION_HTOTAL, EXERION_HBEND, EXERION_HBSTART, EXERION_VTOTAL, EXERION_VBEND, EXERION_VBSTART);
+ m_screen->set_screen_update(FUNC(exerion_state::screen_update_exerion));
+ m_screen->set_palette(m_palette);
GFXDECODE(config, m_gfxdecode, m_palette, gfx_exerion);
PALETTE(config, m_palette, FUNC(exerion_state::exerion_palette), 256*3, 32);
@@ -401,7 +401,7 @@ MACHINE_CONFIG_START(exerion_state::exerion)
ay2.port_a_read_callback().set(FUNC(exerion_state::exerion_porta_r));
ay2.port_b_write_callback().set(FUNC(exerion_state::exerion_portb_w));
ay2.add_route(ALL_OUTPUTS, "mono", 0.30);
-MACHINE_CONFIG_END
+}
void exerion_state::irion(machine_config &config)
{
diff --git a/src/mame/drivers/exidy.cpp b/src/mame/drivers/exidy.cpp
index de262b538c4..79313769fb4 100644
--- a/src/mame/drivers/exidy.cpp
+++ b/src/mame/drivers/exidy.cpp
@@ -838,78 +838,77 @@ MACHINE_START_MEMBER(exidy_state,teetert)
*
*************************************/
-MACHINE_CONFIG_START(exidy_state::base)
-
+void exidy_state::base(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M6502, EXIDY_CPU_CLOCK)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", exidy_state, exidy_vblank_interrupt)
+ M6502(config, m_maincpu, EXIDY_CPU_CLOCK);
+ m_maincpu->set_vblank_int("screen", FUNC(exidy_state::exidy_vblank_interrupt));
/* video hardware */
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_exidy)
- MCFG_PALETTE_ADD("palette", 8)
-
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_VIDEO_ATTRIBUTES(VIDEO_ALWAYS_UPDATE)
- MCFG_SCREEN_RAW_PARAMS(EXIDY_PIXEL_CLOCK, EXIDY_HTOTAL, EXIDY_HBEND, EXIDY_HBSTART, EXIDY_VTOTAL, EXIDY_VBEND, EXIDY_VBSTART)
- MCFG_SCREEN_UPDATE_DRIVER(exidy_state, screen_update_exidy)
- MCFG_SCREEN_PALETTE("palette")
-
-MACHINE_CONFIG_END
+ GFXDECODE(config, m_gfxdecode, m_palette, gfx_exidy);
+ PALETTE(config, m_palette).set_entries(8);
+
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_video_attributes(VIDEO_ALWAYS_UPDATE);
+ m_screen->set_raw(EXIDY_PIXEL_CLOCK, EXIDY_HTOTAL, EXIDY_HBEND, EXIDY_HBSTART, EXIDY_VTOTAL, EXIDY_VBEND, EXIDY_VBSTART);
+ m_screen->set_screen_update(FUNC(exidy_state::screen_update_exidy));
+ m_screen->set_palette(m_palette);
+}
-MACHINE_CONFIG_START(exidy_state::sidetrac)
+void exidy_state::sidetrac(machine_config &config)
+{
base(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(sidetrac_map)
+ m_maincpu->set_addrmap(AS_PROGRAM, &exidy_state::sidetrac_map);
/* audio hardware */
spectar_audio(config);
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(exidy_state::targ)
+void exidy_state::targ(machine_config &config)
+{
base(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(targ_map)
+ m_maincpu->set_addrmap(AS_PROGRAM, &exidy_state::targ_map);
/* audio hardware */
targ_audio(config);
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(exidy_state::spectar)
+void exidy_state::spectar(machine_config &config)
+{
base(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(spectar_map)
+ m_maincpu->set_addrmap(AS_PROGRAM, &exidy_state::spectar_map);
/* audio hardware */
spectar_audio(config);
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(exidy_state::rallys)
+void exidy_state::rallys(machine_config &config)
+{
spectar(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(rallys_map)
-MACHINE_CONFIG_END
+ m_maincpu->set_addrmap(AS_PROGRAM, &exidy_state::rallys_map);
+}
-MACHINE_CONFIG_START(exidy_state::venture)
+void exidy_state::venture(machine_config &config)
+{
base(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(venture_map)
+ m_maincpu->set_addrmap(AS_PROGRAM, &exidy_state::venture_map);
- MCFG_QUANTUM_TIME(attotime::from_hz(600))
+ config.m_minimum_quantum = attotime::from_hz(600);
/* audio hardware */
pia6821_device &pia(PIA6821(config, "pia", 0));
@@ -923,29 +922,28 @@ MACHINE_CONFIG_START(exidy_state::venture)
soundbd.pb_callback().set("pia", FUNC(pia6821_device::porta_w));
soundbd.ca2_callback().set("pia", FUNC(pia6821_device::cb1_w));
soundbd.cb2_callback().set("pia", FUNC(pia6821_device::ca1_w));
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(exidy_state::teetert)
+void exidy_state::teetert(machine_config &config)
+{
venture(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PERIODIC_INT_DRIVER(exidy_state, nmi_line_pulse, 10*60)
+ m_maincpu->set_periodic_int(FUNC(exidy_state::nmi_line_pulse), attotime::from_hz(10*60));
MCFG_MACHINE_START_OVERRIDE(exidy_state, teetert )
-
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(exidy_state::mtrap)
+void exidy_state::mtrap(machine_config &config)
+{
base(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(mtrap_map)
+ m_maincpu->set_addrmap(AS_PROGRAM, &exidy_state::mtrap_map);
- MCFG_QUANTUM_TIME(attotime::from_hz(1920))
+ config.m_minimum_quantum = attotime::from_hz(1920);
/* audio hardware */
pia6821_device &pia(PIA6821(config, "pia", 0));
@@ -959,25 +957,25 @@ MACHINE_CONFIG_START(exidy_state::mtrap)
soundbd.pb_callback().set("pia", FUNC(pia6821_device::porta_w));
soundbd.ca2_callback().set("pia", FUNC(pia6821_device::cb1_w));
soundbd.cb2_callback().set("pia", FUNC(pia6821_device::ca1_w));
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(exidy_state::pepper2)
+void exidy_state::pepper2(machine_config &config)
+{
venture(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(pepper2_map)
-MACHINE_CONFIG_END
+ m_maincpu->set_addrmap(AS_PROGRAM, &exidy_state::pepper2_map);
+}
-MACHINE_CONFIG_START(exidy_state::fax)
+void exidy_state::fax(machine_config &config)
+{
pepper2(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(fax_map)
-MACHINE_CONFIG_END
+ m_maincpu->set_addrmap(AS_PROGRAM, &exidy_state::fax_map);
+}
diff --git a/src/mame/drivers/exidy440.cpp b/src/mame/drivers/exidy440.cpp
index 248b57d46a5..a71c7f05624 100644
--- a/src/mame/drivers/exidy440.cpp
+++ b/src/mame/drivers/exidy440.cpp
@@ -996,11 +996,11 @@ INPUT_PORTS_END
*
*************************************/
-MACHINE_CONFIG_START(exidy440_state::exidy440)
-
+void exidy440_state::exidy440(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", MC6809E, MAIN_CPU_CLOCK)
- MCFG_DEVICE_PROGRAM_MAP(exidy440_map)
+ MC6809E(config, m_maincpu, MAIN_CPU_CLOCK);
+ m_maincpu->set_addrmap(AS_PROGRAM, &exidy440_state::exidy440_map);
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
@@ -1011,20 +1011,19 @@ MACHINE_CONFIG_START(exidy440_state::exidy440)
SPEAKER(config, "lspeaker").front_left();
SPEAKER(config, "rspeaker").front_right();
- MCFG_DEVICE_ADD("440audio", EXIDY440, EXIDY440_MC3418_CLOCK)
- MCFG_SOUND_ROUTE(0, "lspeaker", 1.0)
- MCFG_SOUND_ROUTE(1, "rspeaker", 1.0)
-MACHINE_CONFIG_END
+ EXIDY440(config, m_custom, EXIDY440_MC3418_CLOCK);
+ m_custom->add_route(0, "lspeaker", 1.0);
+ m_custom->add_route(1, "rspeaker", 1.0);
+}
-MACHINE_CONFIG_START(topsecex_state::topsecex)
+void topsecex_state::topsecex(machine_config &config)
+{
exidy440(config);
- /* basic machine hardware */
-
/* video hardware */
topsecex_video(config);
-MACHINE_CONFIG_END
+}
diff --git a/src/mame/drivers/exidyttl.cpp b/src/mame/drivers/exidyttl.cpp
index 55e9650b4a1..296a716b609 100644
--- a/src/mame/drivers/exidyttl.cpp
+++ b/src/mame/drivers/exidyttl.cpp
@@ -95,35 +95,37 @@ void exidyttl_state::video_start()
{
}
-MACHINE_CONFIG_START(exidyttl_state::attack)
-
+void exidyttl_state::attack(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", NETLIST_CPU, NETLIST_CLOCK)
- MCFG_NETLIST_SETUP(attack)
+ NETLIST_CPU(config, m_maincpu, NETLIST_CLOCK);
+ m_maincpu->set_constructor(netlist_attack);
/* video hardware */
- MCFG_FIXFREQ_ADD("fixfreq", "screen")
- MCFG_FIXFREQ_MONITOR_CLOCK(MASTER_CLOCK)
- MCFG_FIXFREQ_HORZ_PARAMS(H_TOTAL-67,H_TOTAL-40,H_TOTAL-8,H_TOTAL)
- MCFG_FIXFREQ_VERT_PARAMS(V_TOTAL-22,V_TOTAL-19,V_TOTAL-12,V_TOTAL)
- MCFG_FIXFREQ_FIELDCOUNT(1)
- MCFG_FIXFREQ_SYNC_THRESHOLD(0.30)
-MACHINE_CONFIG_END
-
-MACHINE_CONFIG_START(exidyttl_state::deathrac)
+ SCREEN(config, "screen", SCREEN_TYPE_RASTER);
+ FIXFREQ(config, m_video).set_screen("screen");
+ m_video->set_monitor_clock(MASTER_CLOCK);
+ m_video->set_horz_params(H_TOTAL-67,H_TOTAL-40,H_TOTAL-8,H_TOTAL);
+ m_video->set_vert_params(V_TOTAL-22,V_TOTAL-19,V_TOTAL-12,V_TOTAL);
+ m_video->set_fieldcount(1);
+ m_video->set_threshold(0.30);
+}
+void exidyttl_state::deathrac(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", NETLIST_CPU, NETLIST_CLOCK)
- MCFG_NETLIST_SETUP(attack)
+ NETLIST_CPU(config, m_maincpu, NETLIST_CLOCK);
+ m_maincpu->set_constructor(netlist_attack);
/* video hardware */
- MCFG_FIXFREQ_ADD("fixfreq", "screen")
- MCFG_FIXFREQ_MONITOR_CLOCK(MASTER_CLOCK)
- MCFG_FIXFREQ_HORZ_PARAMS(H_TOTAL-67,H_TOTAL-40,H_TOTAL-8,H_TOTAL)
- MCFG_FIXFREQ_VERT_PARAMS(V_TOTAL-22,V_TOTAL-19,V_TOTAL-12,V_TOTAL)
- MCFG_FIXFREQ_FIELDCOUNT(1)
- MCFG_FIXFREQ_SYNC_THRESHOLD(0.30)
-MACHINE_CONFIG_END
+ SCREEN(config, "screen", SCREEN_TYPE_RASTER);
+ FIXFREQ(config, m_video).set_screen("screen");
+ m_video->set_monitor_clock(MASTER_CLOCK);
+ m_video->set_horz_params(H_TOTAL-67,H_TOTAL-40,H_TOTAL-8,H_TOTAL);
+ m_video->set_vert_params(V_TOTAL-22,V_TOTAL-19,V_TOTAL-12,V_TOTAL);
+ m_video->set_fieldcount(1);
+ m_video->set_threshold(0.30);
+}
/***************************************************************************
diff --git a/src/mame/drivers/expro02.cpp b/src/mame/drivers/expro02.cpp
index bc078757484..e4d9ab9537e 100644
--- a/src/mame/drivers/expro02.cpp
+++ b/src/mame/drivers/expro02.cpp
@@ -54,9 +54,9 @@ EXPRO-02
| GP-U27 PAL 41464 |---------| |
|J PAL GP-U41 41464 |KANEKO | |
|A MC-8282 PAL 41464 |VU-002 | PM006E.U83 PM018E.U94 |
-|M 6116 41464 | | |
+|M D42101C 41464 | | |
|M | | PM019U_U93-01.U93|
-|A 6116 |---------| PM206E.U82 |
+|A D42101C |---------| PM206E.U82 |
| HM53461 |
| PAL HM53461 PAL |-------| CALC1-CHIP |
| HM53461 PAL |KANEKO | PM016E.U92 |
@@ -82,6 +82,7 @@ EXPRO-02
CALC1-CHIP clock - 16.0MHz
GP-U41 clocks - pins 21 & 22 - 12.0MHz, pins 1 & 2 - 6.0MHz, pins 8 & 9 - 15.6249kHz (HSync?)
GP-U27 clock - none (so it's not an MCU)
+ D42101C - Line buffer for NTSC TV
(TODO: which is correct?)
OKI M6295 clock - 2.0MHz (12/6). pin7 = low
@@ -107,7 +108,7 @@ M6100575A GALS PANIC (PCB manufactured by Taito)
CPU: MC68000
Sound: M6295
OSC: 12.0000MHz, 16.0000MHz
-Custom: VU-002, VIEW2, CACL1
+Custom: VU-002, VIEW2, CALC1
ROMs:
PM109J.U88 (OKI M271000ZB) - Main programs
@@ -899,23 +900,23 @@ GFXDECODE_END
*
*************************************/
-MACHINE_CONFIG_START(expro02_state::expro02)
-
+void expro02_state::expro02(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M68000, 12000000)
- MCFG_DEVICE_PROGRAM_MAP(expro02_map)
- MCFG_TIMER_DRIVER_ADD_SCANLINE("scantimer", expro02_state, scanline, "screen", 0, 1)
+ M68000(config, m_maincpu, 12000000);
+ m_maincpu->set_addrmap(AS_PROGRAM, &expro02_state::expro02_map);
+ TIMER(config, "scantimer").configure_scanline(FUNC(expro02_state::scanline), "screen", 0, 1);
/* CALC01 MCU @ 16Mhz (unknown type, simulated) */
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */)
- MCFG_SCREEN_SIZE(256, 256)
- MCFG_SCREEN_VISIBLE_AREA(0, 256-1, 0, 256-32-1)
- MCFG_SCREEN_UPDATE_DRIVER(expro02_state, screen_update)
- MCFG_SCREEN_PALETTE(m_palette)
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_refresh_hz(60);
+ m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(2500) /* not accurate */);
+ m_screen->set_size(256, 256);
+ m_screen->set_visarea(0, 256-1, 0, 256-32-1);
+ m_screen->set_screen_update(FUNC(expro02_state::screen_update));
+ m_screen->set_palette(m_palette);
GFXDECODE(config, "gfxdecode", m_palette, gfx_expro02);
PALETTE(config, m_palette, FUNC(expro02_state::expro02_palette)).set_format(palette_device::GRBx_555, 2048 + 32768);
@@ -938,18 +939,18 @@ MACHINE_CONFIG_START(expro02_state::expro02)
/* sound hardware */
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("oki", OKIM6295, 12000000/6, okim6295_device::PIN7_LOW)
- MCFG_DEVICE_ADDRESS_MAP(0, oki_map)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
-
-MACHINE_CONFIG_END
+ okim6295_device &oki(OKIM6295(config, "oki", 12000000/6, okim6295_device::PIN7_LOW));
+ oki.set_addrmap(0, &expro02_state::oki_map);
+ oki.add_route(ALL_OUTPUTS, "mono", 1.0);
+}
-MACHINE_CONFIG_START(expro02_state::comad)
+void expro02_state::comad(machine_config &config)
+{
expro02(config);
+
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(fantasia_map)
+ m_maincpu->set_addrmap(AS_PROGRAM, &expro02_state::fantasia_map);
config.device_remove("calc1_mcu");
@@ -958,68 +959,76 @@ MACHINE_CONFIG_START(expro02_state::comad)
m_view2_0->set_offset(-256, -216, 256, 224);
subdevice<watchdog_timer_device>("watchdog")->set_time(attotime::from_seconds(0)); /* a guess, and certainly wrong */
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(expro02_state::comad_noview2)
+void expro02_state::comad_noview2(machine_config &config)
+{
comad(config);
+
config.device_remove("view2_0");
- MCFG_GFXDECODE_MODIFY("gfxdecode", gfx_expro02_noview2)
-MACHINE_CONFIG_END
+ subdevice<gfxdecode_device>("gfxdecode")->set_info(gfx_expro02_noview2);
+}
-MACHINE_CONFIG_START(expro02_state::fantasia)
+void expro02_state::fantasia(machine_config &config)
+{
comad_noview2(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_CLOCK(10000000)
- MCFG_DEVICE_PROGRAM_MAP(comad_map)
-MACHINE_CONFIG_END
+ m_maincpu->set_clock(10000000);
+ m_maincpu->set_addrmap(AS_PROGRAM, &expro02_state::comad_map);
+}
-MACHINE_CONFIG_START(expro02_state::supmodel)
+void expro02_state::supmodel(machine_config &config)
+{
comad_noview2(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(supmodel_map)
- MCFG_DEVICE_REPLACE("oki", OKIM6295, 1584000, okim6295_device::PIN7_HIGH) // clock frequency & pin 7 not verified
- MCFG_DEVICE_ADDRESS_MAP(0, oki_map)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
-MACHINE_CONFIG_END
-
-MACHINE_CONFIG_START(expro02_state::smissw) // 951127 PCB, 12 & 16 clocks
+
+ m_maincpu->set_addrmap(AS_PROGRAM, &expro02_state::supmodel_map);
+
+ okim6295_device &oki(OKIM6295(config.replace(), "oki", 1584000, okim6295_device::PIN7_HIGH)); // clock frequency & pin 7 not verified
+ oki.set_addrmap(0, &expro02_state::oki_map);
+ oki.add_route(ALL_OUTPUTS, "mono", 1.0);
+}
+
+void expro02_state::smissw(machine_config &config) // 951127 PCB, 12 & 16 clocks
+{
comad_noview2(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(smissw_map)
-MACHINE_CONFIG_END
-MACHINE_CONFIG_START(expro02_state::fantsia2)
+ m_maincpu->set_addrmap(AS_PROGRAM, &expro02_state::smissw_map);
+}
+
+void expro02_state::fantsia2(machine_config &config)
+{
comad_noview2(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(fantsia2_map)
-MACHINE_CONFIG_END
-MACHINE_CONFIG_START(expro02_state::galhustl)
+ m_maincpu->set_addrmap(AS_PROGRAM, &expro02_state::fantsia2_map);
+}
+
+void expro02_state::galhustl(machine_config &config)
+{
comad_noview2(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(galhustl_map)
- MCFG_DEVICE_REPLACE("oki", OKIM6295, 1056000, okim6295_device::PIN7_HIGH) // clock frequency & pin 7 not verified
- MCFG_DEVICE_ADDRESS_MAP(0, oki_map)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
- MCFG_SCREEN_MODIFY("screen")
- MCFG_SCREEN_UPDATE_DRIVER(expro02_state, screen_update_zipzap)
-MACHINE_CONFIG_END
+ m_maincpu->set_addrmap(AS_PROGRAM, &expro02_state::galhustl_map);
-MACHINE_CONFIG_START(expro02_state::zipzap)
+ okim6295_device &oki(OKIM6295(config.replace(), "oki", 1056000, okim6295_device::PIN7_HIGH)); // clock frequency & pin 7 not verified
+ oki.set_addrmap(0, &expro02_state::oki_map);
+ oki.add_route(ALL_OUTPUTS, "mono", 1.0);
+
+ m_screen->set_screen_update(FUNC(expro02_state::screen_update_zipzap));
+}
+
+void expro02_state::zipzap(machine_config &config)
+{
comad_noview2(config);
+
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(zipzap_map)
- MCFG_DEVICE_REPLACE("oki", OKIM6295, 1056000, okim6295_device::PIN7_HIGH) // clock frequency & pin 7 not verified
- MCFG_DEVICE_ADDRESS_MAP(0, oki_map)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
-
- MCFG_SCREEN_MODIFY("screen") // doesn't work with original kaneko_spr implementation
- MCFG_SCREEN_UPDATE_DRIVER(expro02_state, screen_update_zipzap)
-MACHINE_CONFIG_END
+ m_maincpu->set_addrmap(AS_PROGRAM, &expro02_state::zipzap_map);
+
+ okim6295_device &oki(OKIM6295(config.replace(), "oki", 1056000, okim6295_device::PIN7_HIGH)); // clock frequency & pin 7 not verified
+ oki.set_addrmap(0, &expro02_state::oki_map);
+ oki.add_route(ALL_OUTPUTS, "mono", 1.0);
+
+ m_screen->set_screen_update(FUNC(expro02_state::screen_update_zipzap)); // doesn't work with original kaneko_spr implementation
+}
/*************************************
*
diff --git a/src/mame/drivers/exterm.cpp b/src/mame/drivers/exterm.cpp
index 0ce68b6395a..fdc3b8337dc 100644
--- a/src/mame/drivers/exterm.cpp
+++ b/src/mame/drivers/exterm.cpp
@@ -92,13 +92,13 @@ void exterm_state::machine_start()
WRITE16_MEMBER(exterm_state::host_data_w)
{
- m_slave->host_w(space,offset / 0x0010000, data, 0xffff);
+ m_slave->host_w(offset / 0x0010000, data);
}
READ16_MEMBER(exterm_state::host_data_r)
{
- return m_slave->host_r(space,offset / 0x0010000, 0xffff);
+ return m_slave->host_r(offset / 0x0010000);
}
@@ -197,7 +197,7 @@ TIMER_DEVICE_CALLBACK_MEMBER(exterm_state::master_sound_nmi_callback)
WRITE8_MEMBER(exterm_state::ym2151_data_latch_w)
{
/* bit 7 of the sound control selects which port */
- m_ym2151->write(space, m_sound_control >> 7, data);
+ m_ym2151->write(m_sound_control >> 7, data);
}
@@ -253,7 +253,6 @@ void exterm_state::master_map(address_map &map)
map(0x01800000, 0x01807fff).mirror(0xfc7f8000).ram().w("palette", FUNC(palette_device::write16)).share("palette");
map(0x02800000, 0x02807fff).mirror(0xfc7f8000).ram().share("nvram");
map(0x03000000, 0x03ffffff).mirror(0xfc000000).rom().region("maincpu", 0);
- map(0xc0000000, 0xc00001ff).rw(m_maincpu, FUNC(tms34010_device::io_register_r), FUNC(tms34010_device::io_register_w));
}
@@ -261,7 +260,6 @@ void exterm_state::slave_map(address_map &map)
{
map(0x00000000, 0x000fffff).mirror(0xfbf00000).ram().share("slave_videoram");
map(0x04000000, 0x047fffff).mirror(0xfb800000).ram();
- map(0xc0000000, 0xc00001ff).rw(m_slave, FUNC(tms34010_device::io_register_r), FUNC(tms34010_device::io_register_w));
}
@@ -371,8 +369,8 @@ INPUT_PORTS_END
*
*************************************/
-MACHINE_CONFIG_START(exterm_state::exterm)
-
+void exterm_state::exterm(machine_config &config)
+{
/* basic machine hardware */
TMS34010(config, m_maincpu, 40000000);
m_maincpu->set_addrmap(AS_PROGRAM, &exterm_state::master_map);
@@ -401,30 +399,29 @@ MACHINE_CONFIG_START(exterm_state::exterm)
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
- MCFG_TIMER_DRIVER_ADD(m_nmi_timer, exterm_state, master_sound_nmi_callback)
+ TIMER(config, m_nmi_timer).configure_generic(FUNC(exterm_state::master_sound_nmi_callback));
WATCHDOG_TIMER(config, "watchdog");
/* video hardware */
PALETTE(config, "palette", FUNC(exterm_state::exterm_palette)).set_format(palette_device::xRGB_555, 2048+32768);
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_RAW_PARAMS(40000000/8, 318, 0, 256, 264, 0, 240)
- MCFG_SCREEN_UPDATE_DEVICE("maincpu", tms34010_device, tms340x0_ind16)
- MCFG_SCREEN_PALETTE("palette")
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_raw(40000000/8, 318, 0, 256, 264, 0, 240);
+ screen.set_screen_update("maincpu", FUNC(tms34010_device::tms340x0_ind16));
+ screen.set_palette("palette");
/* sound hardware */
SPEAKER(config, "speaker").front_center();
- MCFG_DEVICE_ADD("dac", AD7528, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 0.4) // ad7528j.e2
- MCFG_DEVICE_ADD("dacvol", AD7528, 0) // ad7528j.e2
- MCFG_SOUND_ROUTE(0, "dac", 1.0, DAC_VREF_POS_INPUT) MCFG_SOUND_ROUTE(0, "dac", -1.0, DAC_VREF_NEG_INPUT)
- MCFG_DEVICE_ADD("vref", VOLTAGE_REGULATOR, 0) MCFG_VOLTAGE_REGULATOR_OUTPUT(5.0)
- MCFG_SOUND_ROUTE(0, "dacvol", 1.0, DAC_VREF_POS_INPUT)
+ AD7528(config, "dac", 0).add_route(ALL_OUTPUTS, "speaker", 0.4); // ad7528j.e2
+ AD7528(config, "dacvol", 0).add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT).add_route(0, "dac", -1.0, DAC_VREF_NEG_INPUT); // ad7528j.e2
+ voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref"));
+ vref.add_route(0, "dacvol", 1.0, DAC_VREF_POS_INPUT);
YM2151(config, m_ym2151, 4000000).add_route(ALL_OUTPUTS, "speaker", 1.0);
-MACHINE_CONFIG_END
+}
diff --git a/src/mame/drivers/extrema.cpp b/src/mame/drivers/extrema.cpp
index 0229b3510af..9ede6984f97 100644
--- a/src/mame/drivers/extrema.cpp
+++ b/src/mame/drivers/extrema.cpp
@@ -51,12 +51,13 @@ static INPUT_PORTS_START( extrema )
INPUT_PORTS_END
-MACHINE_CONFIG_START(extrema_state::extrema)
+void extrema_state::extrema(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, 6000000)
- MCFG_DEVICE_PROGRAM_MAP(extrema_map)
- MCFG_DEVICE_IO_MAP(extrema_portmap)
-MACHINE_CONFIG_END
+ Z80(config, m_maincpu, 6000000);
+ m_maincpu->set_addrmap(AS_PROGRAM, &extrema_state::extrema_map);
+ m_maincpu->set_addrmap(AS_IO, &extrema_state::extrema_portmap);
+}
diff --git a/src/mame/drivers/exzisus.cpp b/src/mame/drivers/exzisus.cpp
index af75f3addec..5b9d2da76b1 100644
--- a/src/mame/drivers/exzisus.cpp
+++ b/src/mame/drivers/exzisus.cpp
@@ -229,36 +229,36 @@ GFXDECODE_END
/* All clocks are unconfirmed */
-MACHINE_CONFIG_START(exzisus_state::exzisus)
-
+void exzisus_state::exzisus(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("cpua", Z80, 6000000)
- MCFG_DEVICE_PROGRAM_MAP(cpua_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", exzisus_state, irq0_line_hold)
+ z80_device &cpua(Z80(config, "cpua", 6000000));
+ cpua.set_addrmap(AS_PROGRAM, &exzisus_state::cpua_map);
+ cpua.set_vblank_int("screen", FUNC(exzisus_state::irq0_line_hold));
- MCFG_DEVICE_ADD("cpub", Z80, 6000000)
- MCFG_DEVICE_PROGRAM_MAP(cpub_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", exzisus_state, irq0_line_hold)
+ z80_device &cpub(Z80(config, "cpub", 6000000));
+ cpub.set_addrmap(AS_PROGRAM, &exzisus_state::cpub_map);
+ cpub.set_vblank_int("screen", FUNC(exzisus_state::irq0_line_hold));
- MCFG_DEVICE_ADD("cpuc", Z80, 6000000)
- MCFG_DEVICE_PROGRAM_MAP(cpuc_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", exzisus_state, irq0_line_hold)
+ Z80(config, m_cpuc, 6000000);
+ m_cpuc->set_addrmap(AS_PROGRAM, &exzisus_state::cpuc_map);
+ m_cpuc->set_vblank_int("screen", FUNC(exzisus_state::irq0_line_hold));
- MCFG_DEVICE_ADD("audiocpu", Z80, 4000000)
- MCFG_DEVICE_PROGRAM_MAP(sound_map)
+ z80_device &audiocpu(Z80(config, "audiocpu", 4000000));
+ audiocpu.set_addrmap(AS_PROGRAM, &exzisus_state::sound_map);
- MCFG_QUANTUM_TIME(attotime::from_hz(600)) /* 10 CPU slices per frame - enough for the sound CPU to read all commands */
+ config.m_minimum_quantum = attotime::from_hz(600); /* 10 CPU slices per frame - enough for the sound CPU to read all commands */
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(32*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(exzisus_state, screen_update)
- MCFG_SCREEN_PALETTE(m_palette)
-
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_exzisus)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(32*8, 32*8);
+ screen.set_visarea(0*8, 32*8-1, 2*8, 30*8-1);
+ screen.set_screen_update(FUNC(exzisus_state::screen_update));
+ screen.set_palette(m_palette);
+
+ GFXDECODE(config, m_gfxdecode, m_palette, gfx_exzisus);
PALETTE(config, m_palette, palette_device::RGB_444_PROMS, "proms", 1024);
/* sound hardware */
@@ -272,7 +272,7 @@ MACHINE_CONFIG_START(exzisus_state::exzisus)
pc060ha_device &ciu(PC060HA(config, "ciu", 0));
ciu.set_master_tag("cpub");
ciu.set_slave_tag("audiocpu");
-MACHINE_CONFIG_END
+}
/***************************************************************************
diff --git a/src/mame/drivers/ez2d.cpp b/src/mame/drivers/ez2d.cpp
index 23a73cf93ab..9e8fcb043d5 100644
--- a/src/mame/drivers/ez2d.cpp
+++ b/src/mame/drivers/ez2d.cpp
@@ -87,20 +87,20 @@ void ez2d_state::machine_reset()
{
}
-MACHINE_CONFIG_START(ez2d_state::ez2d)
-
+void ez2d_state::ez2d(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", PENTIUM3, 100000000) // actually a Celeron at 533 MHz
- MCFG_DEVICE_PROGRAM_MAP(ez2d_map)
+ PENTIUM3(config, m_maincpu, 100000000); // actually a Celeron at 533 MHz
+ m_maincpu->set_addrmap(AS_PROGRAM, &ez2d_state::ez2d_map);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(640, 480)
- MCFG_SCREEN_VISIBLE_AREA(0, 640-1, 0, 480-1)
- MCFG_SCREEN_UPDATE_DRIVER(ez2d_state, screen_update)
-MACHINE_CONFIG_END
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(640, 480);
+ screen.set_visarea_full();
+ screen.set_screen_update(FUNC(ez2d_state::screen_update));
+}
/***************************************************************************
diff --git a/src/mame/drivers/f-32.cpp b/src/mame/drivers/f-32.cpp
index ee1c14f0272..65ababc1634 100644
--- a/src/mame/drivers/f-32.cpp
+++ b/src/mame/drivers/f-32.cpp
@@ -168,26 +168,26 @@ INPUT_PORTS_END
-MACHINE_CONFIG_START(mosaicf2_state::mosaicf2)
-
+void mosaicf2_state::mosaicf2(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", E132XN, XTAL(20'000'000)*4) /* 4x internal multiplier */
- MCFG_DEVICE_PROGRAM_MAP(common_map)
- MCFG_DEVICE_IO_MAP(mosaicf2_io)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", mosaicf2_state, irq0_line_hold)
+ E132XN(config, m_maincpu, XTAL(20'000'000)*4); /* 4x internal multiplier */
+ m_maincpu->set_addrmap(AS_PROGRAM, &mosaicf2_state::common_map);
+ m_maincpu->set_addrmap(AS_IO, &mosaicf2_state::mosaicf2_io);
+ m_maincpu->set_vblank_int("screen", FUNC(mosaicf2_state::irq0_line_hold));
EEPROM_93C46_16BIT(config, "eeprom")
.erase_time(attotime::from_usec(1))
.write_time(attotime::from_usec(1));
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */)
- MCFG_SCREEN_SIZE(512, 512)
- MCFG_SCREEN_VISIBLE_AREA(0, 319, 0, 223)
- MCFG_SCREEN_UPDATE_DRIVER(mosaicf2_state, screen_update_mosaicf2)
- MCFG_SCREEN_PALETTE("palette")
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500) /* not accurate */);
+ screen.set_size(512, 512);
+ screen.set_visarea(0, 319, 0, 223);
+ screen.set_screen_update(FUNC(mosaicf2_state::screen_update_mosaicf2));
+ screen.set_palette("palette");
PALETTE(config, "palette", palette_device::RGB_555);
@@ -199,10 +199,10 @@ MACHINE_CONFIG_START(mosaicf2_state::mosaicf2)
ymsnd.add_route(0, "lspeaker", 1.0);
ymsnd.add_route(1, "rspeaker", 1.0);
- MCFG_DEVICE_ADD("oki", OKIM6295, XTAL(14'318'181)/8, okim6295_device::PIN7_HIGH) /* 1.7897725 MHz */
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 1.0)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 1.0)
-MACHINE_CONFIG_END
+ okim6295_device &oki(OKIM6295(config, "oki", XTAL(14'318'181)/8, okim6295_device::PIN7_HIGH)); /* 1.7897725 MHz */
+ oki.add_route(ALL_OUTPUTS, "lspeaker", 1.0);
+ oki.add_route(ALL_OUTPUTS, "rspeaker", 1.0);
+}
@@ -247,26 +247,26 @@ void mosaicf2_state::royalpk2_io(address_map &map)
map(0x6a00, 0x6a03).portw("EEPROMOUT");
}
-MACHINE_CONFIG_START(mosaicf2_state::royalpk2)
-
+void mosaicf2_state::royalpk2(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", GMS30C2132, XTAL(50'000'000))
- MCFG_DEVICE_PROGRAM_MAP(royalpk2_map)
- MCFG_DEVICE_IO_MAP(royalpk2_io)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", mosaicf2_state, irq1_line_hold)
+ GMS30C2132(config, m_maincpu, XTAL(50'000'000));
+ m_maincpu->set_addrmap(AS_PROGRAM, &mosaicf2_state::royalpk2_map);
+ m_maincpu->set_addrmap(AS_IO, &mosaicf2_state::royalpk2_io);
+ m_maincpu->set_vblank_int("screen", FUNC(mosaicf2_state::irq1_line_hold));
EEPROM_93C46_16BIT(config, "eeprom")
.erase_time(attotime::from_usec(1))
.write_time(attotime::from_usec(1));
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */)
- MCFG_SCREEN_SIZE(512, 512)
- MCFG_SCREEN_VISIBLE_AREA(0, 319, 0, 223)
- MCFG_SCREEN_UPDATE_DRIVER(mosaicf2_state, screen_update_mosaicf2)
- MCFG_SCREEN_PALETTE("palette")
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500) /* not accurate */);
+ screen.set_size(512, 512);
+ screen.set_visarea(0, 319, 0, 223);
+ screen.set_screen_update(FUNC(mosaicf2_state::screen_update_mosaicf2));
+ screen.set_palette("palette");
PALETTE(config, "palette", palette_device::RGB_555);
@@ -278,12 +278,12 @@ MACHINE_CONFIG_START(mosaicf2_state::royalpk2)
// ymsnd.add_route(0, "lspeaker", 1.0);
// ymsnd.add_route(1, "rspeaker", 1.0);
- MCFG_DEVICE_ADD("oki", OKIM6295, XTAL(14'318'181)/8, okim6295_device::PIN7_HIGH) /* 1.7897725 MHz */
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 1.0)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 1.0)
+ okim6295_device &oki(OKIM6295(config, "oki", XTAL(14'318'181)/8, okim6295_device::PIN7_HIGH)); /* 1.7897725 MHz */
+ oki.add_route(ALL_OUTPUTS, "lspeaker", 1.0);
+ oki.add_route(ALL_OUTPUTS, "rspeaker", 1.0);
// there is a 16c550 for communication
-MACHINE_CONFIG_END
+}
/*
diff --git a/src/mame/drivers/fantland.cpp b/src/mame/drivers/fantland.cpp
index 771a3c8a043..4299704624b 100644
--- a/src/mame/drivers/fantland.cpp
+++ b/src/mame/drivers/fantland.cpp
@@ -808,29 +808,29 @@ INTERRUPT_GEN_MEMBER(fantland_state::fantland_sound_irq)
device.execute().set_input_line_and_vector(0, HOLD_LINE, 0x80 / 4);
}
-MACHINE_CONFIG_START(fantland_state::fantland)
-
+void fantland_state::fantland(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", I8086, 8000000) // ?
- MCFG_DEVICE_PROGRAM_MAP(fantland_map)
+ I8086(config, m_maincpu, 8000000); // ?
+ m_maincpu->set_addrmap(AS_PROGRAM, &fantland_state::fantland_map);
- MCFG_DEVICE_ADD("audiocpu", I8088, 8000000) // ?
- MCFG_DEVICE_PROGRAM_MAP(fantland_sound_map)
- MCFG_DEVICE_IO_MAP(fantland_sound_iomap)
- MCFG_DEVICE_PERIODIC_INT_DRIVER(fantland_state, fantland_sound_irq, 8000)
+ I8088(config, m_audiocpu, 8000000); // ?
+ m_audiocpu->set_addrmap(AS_PROGRAM, &fantland_state::fantland_sound_map);
+ m_audiocpu->set_addrmap(AS_IO, &fantland_state::fantland_sound_iomap);
+ m_audiocpu->set_periodic_int(FUNC(fantland_state::fantland_sound_irq), attotime::from_hz(8000));
// NMI when soundlatch is written
- MCFG_QUANTUM_TIME(attotime::from_hz(8000)) // sound irq must feed the DAC at 8kHz
+ config.m_minimum_quantum = attotime::from_hz(8000); // sound irq must feed the DAC at 8kHz
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(352,256)
- MCFG_SCREEN_VISIBLE_AREA(0, 352-1, 0, 256-1)
- MCFG_SCREEN_UPDATE_DRIVER(fantland_state, screen_update)
- MCFG_SCREEN_PALETTE(m_palette)
- MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE(*this, fantland_state, vblank_irq))
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_refresh_hz(60);
+ m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ m_screen->set_size(352,256);
+ m_screen->set_visarea_full();
+ m_screen->set_screen_update(FUNC(fantland_state::screen_update));
+ m_screen->set_palette(m_palette);
+ m_screen->screen_vblank().set(FUNC(fantland_state::vblank_irq));
GFXDECODE(config, m_gfxdecode, m_palette, gfx_fantland);
PALETTE(config, m_palette).set_format(palette_device::xRGB_555, 256);
@@ -842,10 +842,11 @@ MACHINE_CONFIG_START(fantland_state::fantland)
YM2151(config, "ymsnd", 3000000).add_route(0, "speaker", 0.35).add_route(1, "speaker", 0.35);
- MCFG_DEVICE_ADD("dac", DAC_8BIT_R2R, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 0.25) // unknown DAC
- MCFG_DEVICE_ADD("vref", VOLTAGE_REGULATOR, 0) MCFG_VOLTAGE_REGULATOR_OUTPUT(5.0)
- MCFG_SOUND_ROUTE(0, "dac", 1.0, DAC_VREF_POS_INPUT) MCFG_SOUND_ROUTE(0, "dac", -1.0, DAC_VREF_NEG_INPUT)
-MACHINE_CONFIG_END
+ DAC_8BIT_R2R(config, "dac", 0).add_route(ALL_OUTPUTS, "speaker", 0.25); // unknown DAC
+ voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref"));
+ vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT);
+ vref.add_route(0, "dac", -1.0, DAC_VREF_NEG_INPUT);
+}
WRITE_LINE_MEMBER(fantland_state::galaxygn_sound_irq)
@@ -853,26 +854,26 @@ WRITE_LINE_MEMBER(fantland_state::galaxygn_sound_irq)
m_audiocpu->set_input_line_and_vector(0, state ? ASSERT_LINE : CLEAR_LINE, 0x80/4);
}
-MACHINE_CONFIG_START(fantland_state::galaxygn)
-
+void fantland_state::galaxygn(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", I8088, XTAL(16'000'000) / 2) // AMD P8088-2
- MCFG_DEVICE_PROGRAM_MAP(galaxygn_map)
+ I8088(config, m_maincpu, XTAL(16'000'000) / 2); // AMD P8088-2
+ m_maincpu->set_addrmap(AS_PROGRAM, &fantland_state::galaxygn_map);
- MCFG_DEVICE_ADD("audiocpu", V20, XTAL(7'995'500)) // NEC D70108C-8
- MCFG_DEVICE_PROGRAM_MAP(fantland_sound_map)
- MCFG_DEVICE_IO_MAP(galaxygn_sound_iomap)
+ V20(config, m_audiocpu, XTAL(7'995'500)); // NEC D70108C-8
+ m_audiocpu->set_addrmap(AS_PROGRAM, &fantland_state::fantland_sound_map);
+ m_audiocpu->set_addrmap(AS_IO, &fantland_state::galaxygn_sound_iomap);
// IRQ by YM2151, NMI when soundlatch is written
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(352,256)
- MCFG_SCREEN_VISIBLE_AREA(0, 352-1, 0, 256-1)
- MCFG_SCREEN_UPDATE_DRIVER(fantland_state, screen_update)
- MCFG_SCREEN_PALETTE(m_palette)
- MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE(*this, fantland_state, vblank_irq))
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_refresh_hz(60);
+ m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ m_screen->set_size(352,256);
+ m_screen->set_visarea_full();
+ m_screen->set_screen_update(FUNC(fantland_state::screen_update));
+ m_screen->set_palette(m_palette);
+ m_screen->screen_vblank().set(FUNC(fantland_state::vblank_irq));
GFXDECODE(config, m_gfxdecode, m_palette, gfx_fantland);
PALETTE(config, m_palette).set_format(palette_device::xRGB_555, 256);
@@ -886,7 +887,7 @@ MACHINE_CONFIG_START(fantland_state::galaxygn)
ymsnd.irq_handler().set(FUNC(fantland_state::galaxygn_sound_irq));
ymsnd.add_route(0, "speaker", 1.0);
ymsnd.add_route(1, "speaker", 1.0);
-MACHINE_CONFIG_END
+}
void borntofi_state::machine_start()
@@ -934,10 +935,10 @@ void borntofi_state::machine_reset()
void borntofi_state::borntofi(machine_config &config)
{
/* basic machine hardware */
- V20(config, m_maincpu, 16000000/2); // D701080C-8 - NEC D70108C-8 V20 CPU, running at 8.000MHz [16/2]
+ V20(config, m_maincpu, 16000000/2); // D701080C-8 - NEC D70108C-8 V20 CPU, running at 8.000MHz [16/2]
m_maincpu->set_addrmap(AS_PROGRAM, &borntofi_state::main_map);
- I8088(config, m_audiocpu, 18432000/3); // 8088 - AMD P8088-2 CPU, running at 6.144MHz [18.432/3]
+ I8088(config, m_audiocpu, 18432000/3); // 8088 - AMD P8088-2 CPU, running at 6.144MHz [18.432/3]
m_audiocpu->set_addrmap(AS_PROGRAM, &borntofi_state::sound_map);
/* video hardware */
@@ -983,10 +984,10 @@ void borntofi_state::borntofi(machine_config &config)
void fantland_state::wheelrun(machine_config &config)
{
/* basic machine hardware */
- V20(config, m_maincpu, XTAL(18'000'000)/2); // D701080C-8 (V20)
+ V20(config, m_maincpu, XTAL(18'000'000)/2); // D701080C-8 (V20)
m_maincpu->set_addrmap(AS_PROGRAM, &fantland_state::wheelrun_map);
- Z80(config, m_audiocpu, XTAL(18'000'000)/2); // Z8400BB1 (Z80B)
+ Z80(config, m_audiocpu, XTAL(18'000'000)/2); // Z8400BB1 (Z80B)
m_audiocpu->set_addrmap(AS_PROGRAM, &fantland_state::wheelrun_sound_map);
// IRQ by YM3526, NMI when soundlatch is written
diff --git a/src/mame/drivers/fanucs15.cpp b/src/mame/drivers/fanucs15.cpp
index 211abbef1a6..823903768cd 100644
--- a/src/mame/drivers/fanucs15.cpp
+++ b/src/mame/drivers/fanucs15.cpp
@@ -370,23 +370,24 @@ void fanucs15_state::machine_reset()
{
}
-MACHINE_CONFIG_START(fanucs15_state::fanucs15)
+void fanucs15_state::fanucs15(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M68020, XTAL(12'000'000))
- MCFG_DEVICE_PROGRAM_MAP(maincpu_mem)
- MCFG_DEVICE_DISABLE()
+ M68020(config, m_maincpu, XTAL(12'000'000));
+ m_maincpu->set_addrmap(AS_PROGRAM, &fanucs15_state::maincpu_mem);
+ m_maincpu->set_disable();
- MCFG_DEVICE_ADD("pmccpu", M68000, XTAL(12'000'000))
- MCFG_DEVICE_PROGRAM_MAP(pmccpu_mem)
- MCFG_DEVICE_DISABLE()
+ M68000(config, m_pmccpu, XTAL(12'000'000));
+ m_pmccpu->set_addrmap(AS_PROGRAM, &fanucs15_state::pmccpu_mem);
+ m_pmccpu->set_disable();
- MCFG_DEVICE_ADD("gfxcpu", M68000, XTAL(10'000'000)) // wants bit 15 of 70500 to be set
- MCFG_DEVICE_PROGRAM_MAP(gfxcpu_mem)
- MCFG_DEVICE_DISABLE()
+ M68000(config, m_gfxcpu, XTAL(10'000'000)); // wants bit 15 of 70500 to be set
+ m_gfxcpu->set_addrmap(AS_PROGRAM, &fanucs15_state::gfxcpu_mem);
+ m_gfxcpu->set_disable();
- MCFG_DEVICE_ADD("convcpu", I80286, XTAL(8'000'000)) // wants 70500 to return 0x8000 (same as what gfxcpu looks for, basically)
- MCFG_DEVICE_PROGRAM_MAP(convcpu_mem)
-MACHINE_CONFIG_END
+ I80286(config, m_convcpu, XTAL(8'000'000)); // wants 70500 to return 0x8000 (same as what gfxcpu looks for, basically)
+ m_convcpu->set_addrmap(AS_PROGRAM, &fanucs15_state::convcpu_mem);
+}
/* ROM definition */
ROM_START( fanucs15 )
diff --git a/src/mame/drivers/fanucspmg.cpp b/src/mame/drivers/fanucspmg.cpp
index 03640e93f63..a898334a118 100644
--- a/src/mame/drivers/fanucspmg.cpp
+++ b/src/mame/drivers/fanucspmg.cpp
@@ -956,8 +956,7 @@ void fanucspmg_state::fanucspmg(machine_config &config)
m_maincpu->esc_data_handler().set("i8087", FUNC(i8087_device::addr_w));
i8087_device &i8087(I8087(config, "i8087", XTAL(15'000'000)/3));
- i8087.set_addrmap(AS_PROGRAM, &fanucspmg_state::maincpu_mem);
- i8087.set_data_width(16);
+ i8087.set_space_86(m_maincpu, AS_PROGRAM);
//i8087.irq().set_inputline("maincpu", INPUT_LINE_NMI); // TODO: presumably this is connected to the pic
i8087.busy().set_inputline("maincpu", INPUT_LINE_TEST);
diff --git a/src/mame/drivers/fastfred.cpp b/src/mame/drivers/fastfred.cpp
index 5a0cd8f3aed..025d9027b1a 100644
--- a/src/mame/drivers/fastfred.cpp
+++ b/src/mame/drivers/fastfred.cpp
@@ -632,15 +632,15 @@ INTERRUPT_GEN_MEMBER(fastfred_state::sound_timer_irq)
device.execute().pulse_input_line(INPUT_LINE_NMI, attotime::zero);
}
-MACHINE_CONFIG_START(fastfred_state::fastfred)
-
+void fastfred_state::fastfred(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, XTAL(12'432'000)/4) /* 3.108 MHz; xtal from pcb pics, divider not verified */
- MCFG_DEVICE_PROGRAM_MAP(fastfred_map)
+ Z80(config, m_maincpu, XTAL(12'432'000)/4); /* 3.108 MHz; xtal from pcb pics, divider not verified */
+ m_maincpu->set_addrmap(AS_PROGRAM, &fastfred_state::fastfred_map);
- MCFG_DEVICE_ADD("audiocpu", Z80, XTAL(12'432'000)/8) /* 1.554 MHz; xtal from pcb pics, divider not verified */
- MCFG_DEVICE_PROGRAM_MAP(sound_map)
- MCFG_DEVICE_PERIODIC_INT_DRIVER(fastfred_state, sound_timer_irq, 4*60)
+ Z80(config, m_audiocpu, XTAL(12'432'000)/8); /* 1.554 MHz; xtal from pcb pics, divider not verified */
+ m_audiocpu->set_addrmap(AS_PROGRAM, &fastfred_state::sound_map);
+ m_audiocpu->set_periodic_int(FUNC(fastfred_state::sound_timer_irq), attotime::from_hz(4*60));
LS259(config, m_outlatch); // "Control Signal Latch" at D10
m_outlatch->q_out_cb<1>().set(FUNC(fastfred_state::nmi_mask_w));
@@ -654,14 +654,14 @@ MACHINE_CONFIG_START(fastfred_state::fastfred)
WATCHDOG_TIMER(config, "watchdog");
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) //CLOCK/16/60
- MCFG_SCREEN_SIZE(32*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(fastfred_state, screen_update_fastfred)
- MCFG_SCREEN_PALETTE(m_palette)
- MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE(*this, fastfred_state, vblank_irq))
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_refresh_hz(60);
+ m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(0)); //CLOCK/16/60
+ m_screen->set_size(32*8, 32*8);
+ m_screen->set_visarea(0*8, 32*8-1, 2*8, 30*8-1);
+ m_screen->set_screen_update(FUNC(fastfred_state::screen_update_fastfred));
+ m_screen->set_palette(m_palette);
+ m_screen->screen_vblank().set(FUNC(fastfred_state::vblank_irq));
GFXDECODE(config, "gfxdecode", m_palette, gfx_fastfred);
@@ -676,31 +676,31 @@ MACHINE_CONFIG_START(fastfred_state::fastfred)
AY8910(config, "ay8910.1", XTAL(12'432'000)/8).add_route(ALL_OUTPUTS, "mono", 0.25); /* 1.554 MHz; xtal from pcb pics, divider not verified */
AY8910(config, "ay8910.2", XTAL(12'432'000)/8).add_route(ALL_OUTPUTS, "mono", 0.25); /* 1.554 MHz; xtal from pcb pics, divider not verified */
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(fastfred_state::jumpcoas)
+void fastfred_state::jumpcoas(machine_config &config)
+{
fastfred(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(jumpcoas_map)
+ m_maincpu->set_addrmap(AS_PROGRAM, &fastfred_state::jumpcoas_map);
- MCFG_DEVICE_REMOVE("audiocpu")
+ config.device_remove("audiocpu");
/* video hardware */
- MCFG_GFXDECODE_MODIFY("gfxdecode", gfx_jumpcoas)
+ subdevice<gfxdecode_device>("gfxdecode")->set_info(gfx_jumpcoas);
/* sound hardware */
- MCFG_DEVICE_REMOVE("soundlatch")
- MCFG_DEVICE_REMOVE("ay8910.2")
-MACHINE_CONFIG_END
+ config.device_remove("soundlatch");
+ config.device_remove("ay8910.2");
+}
-MACHINE_CONFIG_START(fastfred_state::imago)
+void fastfred_state::imago(machine_config &config)
+{
fastfred(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(imago_map)
+ m_maincpu->set_addrmap(AS_PROGRAM, &fastfred_state::imago_map);
m_outlatch->q_out_cb<0>().set_nop(); // writes 1 when level starts, 0 when game over
m_outlatch->q_out_cb<4>().set(FUNC(fastfred_state::imago_dma_irq_w));
@@ -710,12 +710,11 @@ MACHINE_CONFIG_START(fastfred_state::imago)
/* video hardware */
m_palette->set_entries(256+64+2); // 256 for characters, 64 for the stars and 2 for the web
- MCFG_GFXDECODE_MODIFY("gfxdecode", gfx_imago)
+ subdevice<gfxdecode_device>("gfxdecode")->set_info(gfx_imago);
MCFG_VIDEO_START_OVERRIDE(fastfred_state,imago)
- MCFG_SCREEN_MODIFY("screen")
- MCFG_SCREEN_UPDATE_DRIVER(fastfred_state, screen_update_imago)
-MACHINE_CONFIG_END
+ subdevice<screen_device>("screen")->set_screen_update(FUNC(fastfred_state::screen_update_imago));
+}
#undef CLOCK
@@ -917,6 +916,29 @@ ROM_START( boggy84b )
ROM_LOAD( "b12e", 0x0200, 0x0100, CRC(52b7f445) SHA1(6395ac705a35e602a355cbf700025ff917e89b37) )
ROM_END
+// main PCB is marked: "MC9003" and "MADE IN ITALY" on component side
+// main PCB is marked: "MADE IN ITALY" on solder side
+// ROMs PCB is marked: "MG25157" on component side
+ROM_START( boggy84b2 )
+ ROM_REGION( 0x10000, "maincpu", 0 )
+ ROM_LOAD( "boggy84-1.bin", 0x0000, 0x1000, CRC(97235e3a) SHA1(f493efd03331416a392cab7d73e39029d7e8098c) )
+ ROM_LOAD( "boggy84-2.bin", 0x1000, 0x1000, CRC(282f8830) SHA1(10c2c3d3b14fbe44ef4ad81607c61361fa2f25ae) )
+ ROM_LOAD( "boggy84-3.bin", 0x2000, 0x1000, CRC(b49c835a) SHA1(c6782643ff44e6cf972f0d2fc47ecc0a220c0e26) )
+ ROM_LOAD( "boggy84-4.bin", 0x3000, 0x1000, CRC(1f98ce07) SHA1(4145785ea55db3940ff4d3834ab736825e5c8712) )
+ ROM_LOAD( "boggy84-5.bin", 0x4000, 0x1000, CRC(7b3fd5fb) SHA1(630e7553fc76e59448cedca5dcb34dae3b08d9ba) )
+ ROM_LOAD( "boggy84-6.bin", 0x5000, 0x1000, CRC(a4083cc2) SHA1(a266ff0935288678d6e0286ac67ea17b9b42371a) )
+ ROM_LOAD( "boggy84-7.bin", 0x6000, 0x1000, CRC(9da29eb9) SHA1(d8802b9b67f9993aa26b8fe7941fc662a6719172) )
+ ROM_LOAD( "boggy84-8.bin", 0x7000, 0x1000, NO_DUMP ) // broken, unreadable
+
+ ROM_REGION( 0x3000, "gfx1", 0 )
+ ROM_LOAD( "boggy84-11.7a", 0x0000, 0x1000, CRC(f4238c68) SHA1(a14cedb126e49e40bab6f46870af64c04ccb01f4) )
+ ROM_LOAD( "boggy84-10.9a", 0x1000, 0x1000, CRC(1979d9a6) SHA1(9da387179e6f09ba113219689d3aa039e87bd5e1) )
+ ROM_LOAD( "boggy84-9.bin", 0x2000, 0x0800, CRC(de3d8f06) SHA1(0ccc261fe15f63d5bd000b3a7008e294b78837a2) )
+
+ ROM_REGION( 0x20, "proms", 0 )
+ ROM_LOAD( "6331.10f", 0x00, 0x20, CRC(24652bc4) SHA1(d89575f3749c75dc963317fe451ffeffd9856e4d) )
+ROM_END
+
ROM_START( redrobin )
ROM_REGION( 0x10000, "maincpu", 0 )
ROM_LOAD( "redro01f.16d", 0x0000, 0x1000, CRC(0788ce10) SHA1(32084714fe005d0489ab1a7e6684a49bd103ce5e) )
@@ -1079,7 +1101,8 @@ GAME( 1983, jumpcoas, 0, jumpcoas, jumpcoas, fastfred_state, init_jumpco
GAME( 1983, jumpcoasa, jumpcoas, jumpcoas, jumpcoas, fastfred_state, init_jumpcoas, ROT90, "Kaneko", "Jump Coaster", MACHINE_SUPPORTS_SAVE )
GAME( 1983, jumpcoast, jumpcoas, jumpcoas, jumpcoas, fastfred_state, init_jumpcoas, ROT90, "Kaneko (Taito license)", "Jump Coaster (Taito)", MACHINE_SUPPORTS_SAVE )
GAME( 1983, boggy84, 0, jumpcoas, boggy84, fastfred_state, init_boggy84, ROT90, "Kaneko", "Boggy '84", MACHINE_SUPPORTS_SAVE )
-GAME( 1983, boggy84b, boggy84, jumpcoas, boggy84, fastfred_state, init_boggy84b, ROT90, "bootleg (Eddie's Games)", "Boggy '84 (bootleg)", MACHINE_SUPPORTS_SAVE )
+GAME( 1983, boggy84b, boggy84, jumpcoas, boggy84, fastfred_state, init_boggy84b, ROT90, "bootleg (Eddie's Games)", "Boggy '84 (bootleg, set 1)", MACHINE_SUPPORTS_SAVE )
+GAME( 1983, boggy84b2, boggy84, jumpcoas, boggy84, fastfred_state, init_boggy84, ROT90, "bootleg", "Boggy '84 (bootleg, set 2)", MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE ) // one program ROM isn't dumped
GAME( 1986, redrobin, 0, fastfred, redrobin, fastfred_state, init_flyboyb, ROT90, "Elettronolo", "Red Robin", MACHINE_SUPPORTS_SAVE )
GAME( 1984, imago, 0, imago, imago, fastfred_state, init_imago, ROT90, "Acom", "Imago (cocktail set)", 0 )
GAME( 1983, imagoa, imago, imago, imagoa, fastfred_state, init_imago, ROT90, "Acom", "Imago (no cocktail set)", 0 )
diff --git a/src/mame/drivers/fb01.cpp b/src/mame/drivers/fb01.cpp
index 0cae2c6467a..21707c452cc 100644
--- a/src/mame/drivers/fb01.cpp
+++ b/src/mame/drivers/fb01.cpp
@@ -179,43 +179,43 @@ void fb01_state::fb01_palette(palette_device &palette) const
}
-MACHINE_CONFIG_START(fb01_state::fb01)
+void fb01_state::fb01(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, XTAL(12'000'000)/2)
- MCFG_DEVICE_PROGRAM_MAP(fb01_mem)
- MCFG_DEVICE_IO_MAP(fb01_io)
+ Z80(config, m_maincpu, XTAL(12'000'000)/2);
+ m_maincpu->set_addrmap(AS_PROGRAM, &fb01_state::fb01_mem);
+ m_maincpu->set_addrmap(AS_IO, &fb01_state::fb01_io);
/* video hardware */
- MCFG_SCREEN_ADD("screen", LCD)
- MCFG_SCREEN_REFRESH_RATE(50)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */
- MCFG_SCREEN_SIZE(6*16, 9)
- MCFG_SCREEN_VISIBLE_AREA(0, 6*16-1, 0, 9-1)
- MCFG_SCREEN_UPDATE_DEVICE("hd44780", hd44780_device, screen_update)
- MCFG_SCREEN_PALETTE("palette")
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_LCD));
+ screen.set_refresh_hz(50);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */
+ screen.set_size(6*16, 9);
+ screen.set_visarea_full();
+ screen.set_screen_update("hd44780", FUNC(hd44780_device::screen_update));
+ screen.set_palette("palette");
config.set_default_layout(layout_fb01);
PALETTE(config, "palette", FUNC(fb01_state::fb01_palette), 2);
- MCFG_HD44780_ADD("hd44780")
- MCFG_HD44780_LCD_SIZE(2, 8) // 2x8 displayed as 1x16
- MCFG_HD44780_PIXEL_UPDATE_CB(fb01_state,fb01_pixel_update)
+ hd44780_device &hd44780(HD44780(config, "hd44780", 0));
+ hd44780.set_lcd_size(2, 8); // 2x8 displayed as 1x16
+ hd44780.set_pixel_update_cb(FUNC(fb01_state::fb01_pixel_update), this);
I8251(config, m_upd71051, XTAL(4'000'000));
m_upd71051->rxrdy_handler().set(FUNC(fb01_state::upd71051_rxrdy_w));
m_upd71051->txrdy_handler().set(FUNC(fb01_state::upd71051_txrdy_w));
m_upd71051->txd_handler().set("mdout", FUNC(midi_port_device::write_txd));
- MCFG_DEVICE_ADD("usart_clock", CLOCK, XTAL(4'000'000) / 8) // 500KHz
- MCFG_CLOCK_SIGNAL_HANDLER(WRITELINE(*this, fb01_state, write_usart_clock))
+ clock_device &usart_clock(CLOCK(config, "usart_clock", XTAL(4'000'000) / 8)); // 500KHz
+ usart_clock.signal_handler().set(FUNC(fb01_state::write_usart_clock));
- MCFG_MIDI_PORT_ADD("mdin", midiin_slot, "midiin")
- MCFG_MIDI_RX_HANDLER(WRITELINE(*this, fb01_state, midi_in))
+ MIDI_PORT(config, "mdin", midiin_slot, "midiin").rxd_handler().set(FUNC(fb01_state::midi_in));
- MCFG_MIDI_PORT_ADD("mdout", midiout_slot, "midiout")
+ MIDI_PORT(config, "mdout", midiout_slot, "midiout");
- MCFG_MIDI_PORT_ADD("mdthru", midiout_slot, "midiout")
+ MIDI_PORT(config, "mdthru", midiout_slot, "midiout");
SPEAKER(config, "lspeaker").front_left();
SPEAKER(config, "rspeaker").front_right();
@@ -225,7 +225,7 @@ MACHINE_CONFIG_START(fb01_state::fb01)
ym2164.add_route(1, "rspeaker", 1.00);
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
-MACHINE_CONFIG_END
+}
/* ROM definition */
diff --git a/src/mame/drivers/fc100.cpp b/src/mame/drivers/fc100.cpp
index 2f4ad646d3c..41283265e66 100644
--- a/src/mame/drivers/fc100.cpp
+++ b/src/mame/drivers/fc100.cpp
@@ -472,7 +472,7 @@ void fc100_state::machine_start()
m_inv = 0;
if (m_cart->exists())
- m_maincpu->space(AS_PROGRAM).install_read_handler(0x6000, 0x6fff, read8_delegate(FUNC(generic_slot_device::read_rom),(generic_slot_device*)m_cart));
+ m_maincpu->space(AS_PROGRAM).install_read_handler(0x6000, 0x6fff, read8sm_delegate(FUNC(generic_slot_device::read_rom),(generic_slot_device*)m_cart));
save_item(NAME(m_ag));
save_item(NAME(m_gm2));
@@ -515,26 +515,28 @@ void fc100_state::init_fc100()
membank("bankr")->configure_entry(1, &ram[0]);
}
-MACHINE_CONFIG_START(fc100_state::fc100)
+void fc100_state::fc100(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu",Z80, XTAL(7'159'090)/2)
- MCFG_DEVICE_PROGRAM_MAP(fc100_mem)
- MCFG_DEVICE_IO_MAP(fc100_io)
+ Z80(config, m_maincpu, XTAL(7'159'090)/2);
+ m_maincpu->set_addrmap(AS_PROGRAM, &fc100_state::fc100_mem);
+ m_maincpu->set_addrmap(AS_IO, &fc100_state::fc100_io);
/* video hardware */
- MCFG_DEVICE_ADD("vdg", M5C6847P1, XTAL(7'159'090)/3) // Clock not verified
- MCFG_MC6847_INPUT_CALLBACK(READ8(*this, fc100_state, mc6847_videoram_r))
- MCFG_MC6847_CHARROM_CALLBACK(fc100_state, get_char_rom)
- MCFG_MC6847_FIXED_MODE(m5c6847p1_device::MODE_INTEXT)
+ M5C6847P1(config, m_vdg, XTAL(7'159'090)/3); // Clock not verified
+ m_vdg->set_screen("screen");
+ m_vdg->input_callback().set(FUNC(fc100_state::mc6847_videoram_r));
+ m_vdg->set_get_char_rom(FUNC(fc100_state::get_char_rom));
+ m_vdg->set_get_fixed_mode(m5c6847p1_device::MODE_INTEXT);
// other lines not connected
- MCFG_SCREEN_MC6847_NTSC_ADD("screen", "vdg")
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "f4palette", gfx_fc100)
+ SCREEN(config, "screen", SCREEN_TYPE_RASTER);
+ GFXDECODE(config, "gfxdecode", "f4palette", gfx_fc100);
PALETTE(config, "f4palette", palette_device::MONOCHROME);
/* sound hardware */
SPEAKER(config, "mono").front_center();
- WAVE(config, "wave", "cassette").add_route(ALL_OUTPUTS, "mono", 0.05);
+ WAVE(config, "wave", m_cass).add_route(ALL_OUTPUTS, "mono", 0.05);
ay8910_device &psg(AY8910(config, "psg", XTAL(7'159'090)/3/2)); /* AY-3-8910 - clock not verified */
psg.port_a_read_callback().set_ioport("JOY0");
psg.port_b_read_callback().set_ioport("JOY1");
@@ -543,9 +545,9 @@ MACHINE_CONFIG_START(fc100_state::fc100)
psg.add_route(ALL_OUTPUTS, "mono", 1.50);
/* Devices */
- MCFG_CASSETTE_ADD("cassette")
- MCFG_CASSETTE_FORMATS(fc100_cassette_formats)
- MCFG_CASSETTE_DEFAULT_STATE(CASSETTE_PLAY | CASSETTE_MOTOR_DISABLED | CASSETTE_SPEAKER_ENABLED)
+ CASSETTE(config, m_cass);
+ m_cass->set_formats(fc100_cassette_formats);
+ m_cass->set_default_state(CASSETTE_PLAY | CASSETTE_MOTOR_DISABLED | CASSETTE_SPEAKER_ENABLED);
I8251(config, m_uart, 0);
m_uart->txd_handler().set(FUNC(fc100_state::txdata_callback));
@@ -553,18 +555,21 @@ MACHINE_CONFIG_START(fc100_state::fc100)
uart_clock.signal_handler().set(m_uart, FUNC(i8251_device::write_txc));
uart_clock.signal_handler().append(m_uart, FUNC(i8251_device::write_rxc));
- MCFG_TIMER_DRIVER_ADD_PERIODIC("timer_c", fc100_state, timer_c, attotime::from_hz(4800)) // cass write
- MCFG_TIMER_DRIVER_ADD_PERIODIC("timer_p", fc100_state, timer_p, attotime::from_hz(40000)) // cass read
- MCFG_TIMER_DRIVER_ADD_PERIODIC("timer_k", fc100_state, timer_k, attotime::from_hz(300)) // keyb scan
+ TIMER(config, "timer_c").configure_periodic(FUNC(fc100_state::timer_c), attotime::from_hz(4800)); // cass write
+ TIMER(config, "timer_p").configure_periodic(FUNC(fc100_state::timer_p), attotime::from_hz(40000)); // cass read
+ TIMER(config, "timer_k").configure_periodic(FUNC(fc100_state::timer_k), attotime::from_hz(300)); // keyb scan
+
+ GENERIC_CARTSLOT(config, m_cart, generic_plain_slot, "fc100_cart");
- MCFG_GENERIC_CARTSLOT_ADD("cartslot", generic_plain_slot, "fc100_cart")
+ CENTRONICS(config, m_centronics, centronics_devices, "printer");
+ m_centronics->ack_handler().set("cent_status_in", FUNC(input_buffer_device::write_bit4));
+ m_centronics->busy_handler().set("cent_status_in", FUNC(input_buffer_device::write_bit5));
- MCFG_DEVICE_ADD(m_centronics, CENTRONICS, centronics_devices, "printer")
- MCFG_CENTRONICS_ACK_HANDLER(WRITELINE("cent_status_in", input_buffer_device, write_bit4))
- MCFG_CENTRONICS_BUSY_HANDLER(WRITELINE("cent_status_in", input_buffer_device, write_bit5))
- MCFG_CENTRONICS_OUTPUT_LATCH_ADD("cent_data_out", "centronics")
- MCFG_DEVICE_ADD("cent_status_in", INPUT_BUFFER, 0)
-MACHINE_CONFIG_END
+ output_latch_device &cent_data_out(OUTPUT_LATCH(config, "cent_data_out"));
+ m_centronics->set_output_latch(cent_data_out);
+
+ INPUT_BUFFER(config, "cent_status_in");
+}
/* ROM definition */
ROM_START( fc100 )
diff --git a/src/mame/drivers/fccpu20.cpp b/src/mame/drivers/fccpu20.cpp
index 16cec979f3a..df443f4841f 100644
--- a/src/mame/drivers/fccpu20.cpp
+++ b/src/mame/drivers/fccpu20.cpp
@@ -154,40 +154,47 @@ static void cpu21yb_vme_cards(device_slot_interface &device)
}
/* Machine configurations */
-MACHINE_CONFIG_START(cpu20_state::cpu20)
- MCFG_VME_DEVICE_ADD("vme")
- MCFG_VME_SLOT_ADD ("vme", 1, cpu20_vme_cards, "fccpu20")
-MACHINE_CONFIG_END
-
-MACHINE_CONFIG_START(cpu20_state::cpu21s)
- MCFG_VME_DEVICE_ADD("vme")
- MCFG_VME_SLOT_ADD ("vme", 1, cpu21s_vme_cards, "fccpu21s")
-MACHINE_CONFIG_END
-
-MACHINE_CONFIG_START(cpu20_state::cpu21)
- MCFG_VME_DEVICE_ADD("vme")
- MCFG_VME_SLOT_ADD ("vme", 1, cpu21_vme_cards, "fccpu21")
-MACHINE_CONFIG_END
-
-MACHINE_CONFIG_START(cpu20_state::cpu21a)
- MCFG_VME_DEVICE_ADD("vme")
- MCFG_VME_SLOT_ADD ("vme", 1, cpu21a_vme_cards, "fccpu21a")
-MACHINE_CONFIG_END
-
-MACHINE_CONFIG_START(cpu20_state::cpu21ya)
- MCFG_VME_DEVICE_ADD("vme")
- MCFG_VME_SLOT_ADD ("vme", 1, cpu21ya_vme_cards, "fccpu21ya")
-MACHINE_CONFIG_END
-
-MACHINE_CONFIG_START(cpu20_state::cpu21b)
- MCFG_VME_DEVICE_ADD("vme")
- MCFG_VME_SLOT_ADD ("vme", 1, cpu21b_vme_cards, "fccpu21b")
-MACHINE_CONFIG_END
-
-MACHINE_CONFIG_START(cpu20_state::cpu21yb)
- MCFG_VME_DEVICE_ADD("vme")
- MCFG_VME_SLOT_ADD ("vme", 1, cpu21yb_vme_cards, "fccpu21yb")
-MACHINE_CONFIG_END
+void cpu20_state::cpu20(machine_config &config)
+{
+ VME(config, "vme", 0);
+ VME_SLOT(config, "slot1", cpu20_vme_cards, "fccpu20", 1, "vme");
+}
+
+void cpu20_state::cpu21s(machine_config &config)
+{
+ VME(config, "vme", 0);
+ VME_SLOT(config, "slot1", cpu21s_vme_cards, "fccpu21s", 1, "vme");
+}
+
+void cpu20_state::cpu21(machine_config &config)
+{
+ VME(config, "vme", 0);
+ VME_SLOT(config, "slot1", cpu21_vme_cards, "fccpu21", 1, "vme");
+}
+
+void cpu20_state::cpu21a(machine_config &config)
+{
+ VME(config, "vme", 0);
+ VME_SLOT(config, "slot1", cpu21a_vme_cards, "fccpu21a", 1, "vme");
+}
+
+void cpu20_state::cpu21ya(machine_config &config)
+{
+ VME(config, "vme", 0);
+ VME_SLOT(config, "slot1", cpu21ya_vme_cards, "fccpu21ya", 1, "vme");
+}
+
+void cpu20_state::cpu21b(machine_config &config)
+{
+ VME(config, "vme", 0);
+ VME_SLOT(config, "slot1", cpu21b_vme_cards, "fccpu21b", 1, "vme");
+}
+
+void cpu20_state::cpu21yb(machine_config &config)
+{
+ VME(config, "vme", 0);
+ VME_SLOT(config, "slot1", cpu21yb_vme_cards, "fccpu21yb", 1, "vme");
+}
/* ROM configurations */
ROM_START(fccpu20sbc) ROM_END
diff --git a/src/mame/drivers/fccpu30.cpp b/src/mame/drivers/fccpu30.cpp
index 5c56648e275..9b11636e296 100644
--- a/src/mame/drivers/fccpu30.cpp
+++ b/src/mame/drivers/fccpu30.cpp
@@ -658,15 +658,16 @@ static void fccpu30_vme_cards(device_slot_interface &device)
/*
* Machine configuration
*/
-MACHINE_CONFIG_START(cpu30_state::cpu30)
+void cpu30_state::cpu30(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M68030, XTAL(25'000'000))
- MCFG_DEVICE_PROGRAM_MAP(cpu30_mem)
- MCFG_DEVICE_IRQ_ACKNOWLEDGE_DEVICE("fga002", fga002_device, iack)
+ M68030(config, m_maincpu, XTAL(25'000'000));
+ m_maincpu->set_addrmap(AS_PROGRAM, &cpu30_state::cpu30_mem);
+ m_maincpu->set_irq_acknowledge_callback("fga002", FUNC(fga002_device::iack));
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
- MCFG_VME_DEVICE_ADD("vme")
- MCFG_VME_SLOT_ADD("vme", 1, fccpu30_vme_cards, nullptr)
+ VME(config, "vme", 0);
+ VME_SLOT(config, "slot1", fccpu30_vme_cards, nullptr, 1, "vme");
/* Terminal Port config */
/* Force CPU30 series of boards has up to four serial ports, p1-p4, the FGA boot uses p4 as console and subsequent
firmware uses p1 as console and in an operating system environment there may be user login shells on the other.
@@ -749,67 +750,67 @@ MACHINE_CONFIG_START(cpu30_state::cpu30)
// m_pit2->timer_irq_callback().set(m_fga002, FUNC(fga002_device::lirq3_w)); // The timer interrupt seems to silence the terminal interrupt, needs invectigation
/* FGA-002, Force Gate Array */
- fga002_device &fga002(FGA002(config, m_fga002, 0));
- fga002.out_int().set(FUNC(cpu30_state::fga_irq_callback));
- fga002.liack4().set("duscc", FUNC(duscc_device::iack));
- fga002.liack5().set("duscc2", FUNC(duscc_device::iack));
+ FGA002(config, m_fga002, 0);
+ m_fga002->out_int().set(FUNC(cpu30_state::fga_irq_callback));
+ m_fga002->liack4().set("duscc", FUNC(duscc_device::iack));
+ m_fga002->liack5().set("duscc2", FUNC(duscc_device::iack));
// RTC
- MCFG_DEVICE_ADD("rtc", RTC72423, XTAL(32'768)) // Fake crystal value, the 72423 uses it own internal crystal
- MCFG_MSM6242_OUT_INT_HANDLER(WRITELINE("fga002", fga002_device, lirq0_w))
+ RTC72423(config, m_rtc, XTAL(32'768)); // Fake crystal value, the 72423 uses it own internal crystal
+ m_rtc->out_int_handler().set(m_fga002, FUNC(fga002_device::lirq0_w));
// dual ported ram
RAM(config, m_ram).set_default_size("4M").set_extra_options("8M, 16M, 32M");
-MACHINE_CONFIG_END
+}
/* SYS68K/CPU-30X Part No.1 01300: 16.7 MHz 68030 based CPU board with 68882 FPCP, DMAC, 1 Mbyte Dual Ported RAM capacity and VMEPROM. */
-MACHINE_CONFIG_START(cpu30_state::cpu30x)
+void cpu30_state::cpu30x(machine_config &config)
+{
cpu30(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_CLOCK(XTAL(16'777'216)) /* 16.7 MHz from description, crystal needs verification */
+ m_maincpu->set_clock(XTAL(16'777'216)); /* 16.7 MHz from description, crystal needs verification */
-// MCFG_DEVICE_REMOVE("")
+// config.device_remove("");
// dual ported ram
m_ram->set_default_size("1M").set_extra_options("1M, 2M, 4M");
-MACHINE_CONFIG_END
+}
/* SYS68K/CPU-30XA Part No.1 01301: 20.0 MHz 68030 based CPU board with 68882 FPCP, DMAC, 1 Mbyte Dual Ported RAM capacity and VMEPROM. Documentation included.*/
-MACHINE_CONFIG_START(cpu30_state::cpu30xa)
+void cpu30_state::cpu30xa(machine_config &config)
+{
cpu30x(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_CLOCK(XTAL(20'000'000)) /* 20.0 MHz from description, crystal needs verification */
-MACHINE_CONFIG_END
+ m_maincpu->set_clock(XTAL(20'000'000)); /* 20.0 MHz from description, crystal needs verification */
+}
/* SYS68K/CPU-30ZA Part No.1 01302: 20.0 MHz 68030 based CPU board with 68882 FPCP, DMAC, 4 Mbyte Dual Ported RAM capacity and VMEPROM. Documentation included.*/
-MACHINE_CONFIG_START(cpu30_state::cpu30za)
+void cpu30_state::cpu30za(machine_config &config)
+{
cpu30xa(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_CLOCK(XTAL(20'000'000)) /* 20.0 MHz from description, crystal needs verification */
+ m_maincpu->set_clock(XTAL(20'000'000)); /* 20.0 MHz from description, crystal needs verification */
// dual ported ram
m_ram->set_default_size("4M").set_extra_options("1M, 2M, 4M");
-MACHINE_CONFIG_END
+}
/* SYS68K/CPU-30ZBE 68030/68882 CPU, 25 MHz, 4 Mbyte shared DRAM, 4 Mbyte Flash, SCSI, Ethernet, Floppy disk, 4 serial I/O ports, 32-bit VMEbus interface */
-MACHINE_CONFIG_START(cpu30_state::cpu30zbe)
+void cpu30_state::cpu30zbe(machine_config &config)
+{
cpu30za(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_CLOCK(XTAL(25'000'000)) /* 25.0 MHz from description, crystal needs verification */
+ m_maincpu->set_clock(XTAL(25'000'000)); /* 25.0 MHz from description, crystal needs verification */
// dual ported ram
m_ram->set_default_size("4M").set_extra_options("256K, 512K, 1M, 2M, 4M, 8M, 16M, 32M");
-MACHINE_CONFIG_END
+}
/* SYS68K/CPU-33 */
-MACHINE_CONFIG_START(cpu30_state::cpu33)
+void cpu30_state::cpu33(machine_config &config)
+{
cpu30zbe(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_CLOCK(XTAL(25'000'000)) /* 25.0 MHz from description, crystal needs verification */
+ m_maincpu->set_clock(XTAL(25'000'000)); /* 25.0 MHz from description, crystal needs verification */
// dual ported ram
m_ram->set_default_size("4M").set_extra_options("256K, 512K, 1M, 2M, 4M, 8M, 16M, 32M");
-MACHINE_CONFIG_END
+}
/* SYS68K/CPU-30BE/8 68030/68882 CPU, 25 MHz, 8 Mbyte shared DRAM, 4 Mbyte Flash, SCSI, Ethernet, Floppy disk, 4 serial I/O ports, 32-bit VMEbus interface, VMEPROM firmware*/
void cpu30_state::cpu30be8(machine_config &config)
@@ -832,10 +833,10 @@ void cpu30_state::cpu30lite4(machine_config &config)
{
cpu30zbe(config);
// Enable these when added to main config
-// MCFG_DEVICE_REMOVE("fpu")
-// MCFG_DEVICE_REMOVE("scsi")
-// MCFG_DEVICE_REMOVE("eth")
-// MCFG_DEVICE_REMOVE("fdc")
+// config.device_remove("fpu");
+// config.device_remove("scsi");
+// config.device_remove("eth");
+// config.device_remove("fdc");
// dual ported ram
m_ram->set_default_size("4M").set_extra_options("256K, 512K, 1M, 2M, 4M, 8M, 16M, 32M");
}
diff --git a/src/mame/drivers/fcombat.cpp b/src/mame/drivers/fcombat.cpp
index 7a0e8954007..6273f47083f 100644
--- a/src/mame/drivers/fcombat.cpp
+++ b/src/mame/drivers/fcombat.cpp
@@ -288,20 +288,20 @@ void fcombat_state::machine_reset()
m_ty = 0;
}
-MACHINE_CONFIG_START(fcombat_state::fcombat)
-
+void fcombat_state::fcombat(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, 10000000/3)
- MCFG_DEVICE_PROGRAM_MAP(main_map)
+ Z80(config, m_maincpu, 10000000/3);
+ m_maincpu->set_addrmap(AS_PROGRAM, &fcombat_state::main_map);
- MCFG_DEVICE_ADD("audiocpu", Z80, 10000000/3)
- MCFG_DEVICE_PROGRAM_MAP(audio_map)
+ z80_device &audiocpu(Z80(config, "audiocpu", 10000000/3));
+ audiocpu.set_addrmap(AS_PROGRAM, &fcombat_state::audio_map);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_RAW_PARAMS(FCOMBAT_PIXEL_CLOCK, FCOMBAT_HTOTAL, FCOMBAT_HBEND, FCOMBAT_HBSTART, FCOMBAT_VTOTAL, FCOMBAT_VBEND, FCOMBAT_VBSTART)
- MCFG_SCREEN_UPDATE_DRIVER(fcombat_state, screen_update_fcombat)
- MCFG_SCREEN_PALETTE(m_palette)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_raw(FCOMBAT_PIXEL_CLOCK, FCOMBAT_HTOTAL, FCOMBAT_HBEND, FCOMBAT_HBSTART, FCOMBAT_VTOTAL, FCOMBAT_VBEND, FCOMBAT_VBSTART);
+ screen.set_screen_update(FUNC(fcombat_state::screen_update_fcombat));
+ screen.set_palette(m_palette);
GFXDECODE(config, m_gfxdecode, m_palette, gfx_fcombat);
PALETTE(config, m_palette, FUNC(fcombat_state::fcombat_palette), 256*3, 32);
@@ -316,7 +316,7 @@ MACHINE_CONFIG_START(fcombat_state::fcombat)
YM2149(config, "ay2", 1500000).add_route(ALL_OUTPUTS, "mono", 0.12);
YM2149(config, "ay3", 1500000).add_route(ALL_OUTPUTS, "mono", 0.12);
-MACHINE_CONFIG_END
+}
/*************************************
*
diff --git a/src/mame/drivers/fcrash.cpp b/src/mame/drivers/fcrash.cpp
index ea196c71bf7..0bc74f47002 100644
--- a/src/mame/drivers/fcrash.cpp
+++ b/src/mame/drivers/fcrash.cpp
@@ -68,8 +68,6 @@ dinopic2: no sound, one bad graphics ROM. Copying 8.bin from dinopic fixes it.
fcrash, kodb: old sprites show on next screen. Patch used.
-knightsb: sprites are entangled with the front layer.
-
punipic, punipic2: no sound. Problems in Central Park. Patches used.
punipic3: same as punipic, and doors are missing.
@@ -251,13 +249,25 @@ WRITE16_MEMBER(cps_state::knightsb_layer_w)
case 0x0000:
case 0x001f:
case 0x00ff:
+ case 0x07ff:
data = 0x12f2;
break;
case 0x2000:
- data = 0x06f2;
+ data = 0x06c0;
+ break;
+ case 0x5800:
+ case 0x5f00:
+ data = 0x12c0;
+ break;
+ case 0x80ff:
+ case 0x87ff:
+ data = 0x1380;
break;
case 0xa000:
- data = 0x24d0;
+ data = 0x24c0;
+ break;
+ case 0xd800:
+ data = 0x1380;
break;
default:
printf ("Unknown control word = %X\n",data);
@@ -310,6 +320,8 @@ WRITE16_MEMBER(cps_state::mtwinsb_layer_w)
WRITE16_MEMBER(cps_state::punipic_layer_w)
{
+ m_cps_a_regs[0x08/2] = 0;
+
switch (offset)
{
case 0x00:
@@ -348,14 +360,12 @@ WRITE16_MEMBER(cps_state::punipic_layer_w)
break;
}
- m_cps_a_regs[0x08 / 2] = m_mainram[0xdb90 / 2]; // fixes split objects
break;
case 0x07:
// unknown
break;
default:
logerror("%s: Unknown layer cmd %X %X\n",machine().describe_context(),offset<<1,data);
-
}
}
@@ -471,6 +481,34 @@ WRITE16_MEMBER(cps_state::sf2mdta_layer_w)
m_cps_a_regs[CPS1_ROWSCROLL_OFFS] = data; /* row scroll start */
break;
case 0x0a:
+ m_cps_a_regs[0x10 / 2] = 0xffce; /* scroll 2x */
+ break;
+ case 0x0b:
+ m_cps_a_regs[0x16 / 2] = data; /* scroll 3y */
+ break;
+ case 0x26:
+ m_cps_b_regs[m_layer_enable_reg / 2] = data;
+ }
+}
+
+WRITE16_MEMBER(cps_state::sf2b_layer_w)
+{
+ switch (offset)
+ {
+ case 0x06:
+ m_cps_a_regs[0x0c / 2] = data + 0xffbe; /* scroll 1x */
+ break;
+ case 0x07:
+ m_cps_a_regs[0x0e / 2] = data; /* scroll 1y */
+ break;
+ case 0x08:
+ m_cps_a_regs[0x14 / 2] = data + 0xffce; /* scroll 3x */
+ break;
+ case 0x09:
+ m_cps_a_regs[0x12 / 2] = data; /* scroll 2y */
+ m_cps_a_regs[CPS1_ROWSCROLL_OFFS] = data; /* row scroll start */
+ break;
+ case 0x0a:
m_cps_a_regs[0x10 / 2] = data + 0xffce; /* scroll 2x */
break;
case 0x0b:
@@ -478,6 +516,9 @@ WRITE16_MEMBER(cps_state::sf2mdta_layer_w)
break;
case 0x26:
m_cps_b_regs[m_layer_enable_reg / 2] = data;
+ break;
+ default:
+ printf("%X:%X ",offset,data);
}
}
@@ -712,7 +753,7 @@ void cps_state::knightsb_map(address_map &map)
map(0x900000, 0x93ffff).ram().w(FUNC(cps_state::cps1_gfxram_w)).share("gfxram");
map(0x980000, 0x98002f).w(FUNC(cps_state::knightsb_layer_w));
map(0x990000, 0x990001).nopw(); // same as 880000
- map(0xff0000, 0xffffff).ram();
+ map(0xff0000, 0xffffff).ram().share("mainram");
}
void cps_state::dinopic_map(address_map &map)
@@ -732,7 +773,7 @@ void cps_state::dinopic_map(address_map &map)
map(0xf1c000, 0xf1c001).portr("IN2"); /* Player 3 controls (later games) */
map(0xf1c004, 0xf1c005).w(FUNC(cps_state::cpsq_coinctrl2_w)); /* Coin control2 (later games) */
map(0xf1c006, 0xf1c007).portr("EEPROMIN").portw("EEPROMOUT");
- map(0xff0000, 0xffffff).ram();
+ map(0xff0000, 0xffffff).ram().share("mainram");
}
void cps_state::fcrash_map(address_map &map)
@@ -746,7 +787,7 @@ void cps_state::fcrash_map(address_map &map)
map(0x880008, 0x88000f).r(FUNC(cps_state::cps1_dsw_r)); /* System input ports / Dip Switches */
map(0x890000, 0x890001).nopw(); // palette related?
map(0x900000, 0x92ffff).ram().w(FUNC(cps_state::cps1_gfxram_w)).share("gfxram");
- map(0xff0000, 0xffffff).ram();
+ map(0xff0000, 0xffffff).ram().share("mainram");
}
void cps_state::mtwinsb_map(address_map &map)
@@ -797,7 +838,7 @@ void cps_state::sf2m1_map(address_map &map)
map(0x900000, 0x93ffff).ram().w(FUNC(cps_state::cps1_gfxram_w)).share("gfxram");
map(0x980000, 0x9801ff).w(FUNC(cps_state::sf2m1_layer_w));
map(0x990000, 0x990001).nopw(); // same as 880000
- map(0xff0000, 0xffffff).ram();
+ map(0xff0000, 0xffffff).ram().share("mainram");
}
void cps_state::sf2mdt_map(address_map &map)
@@ -813,13 +854,13 @@ void cps_state::sf2mdt_map(address_map &map)
map(0x800100, 0x80013f).ram().share("cps_a_regs"); /* CPS-A custom */
map(0x800140, 0x80017f).ram().share("cps_b_regs"); /* CPS-B custom */
map(0x900000, 0x92ffff).ram().w(FUNC(cps_state::cps1_gfxram_w)).share("gfxram");
- map(0xff0000, 0xffffff).ram();
+ map(0xff0000, 0xffffff).ram().share("mainram");
}
void cps_state::sf2b_map(address_map &map)
{
map(0x000000, 0x3fffff).rom();
- map(0x708100, 0x7081ff).w(FUNC(cps_state::sf2mdta_layer_w));
+ map(0x708100, 0x7081ff).w(FUNC(cps_state::sf2b_layer_w));
map(0x70c000, 0x70c001).portr("IN1");
map(0x70c008, 0x70c009).portr("IN2");
map(0x70c018, 0x70c01f).r(FUNC(cps_state::cps1_hack_dsw_r));
@@ -829,7 +870,7 @@ void cps_state::sf2b_map(address_map &map)
map(0x800100, 0x80013f).ram().share("cps_a_regs"); /* CPS-A custom */
map(0x800140, 0x80017f).rw(FUNC(cps_state::cps1_cps_b_r), FUNC(cps_state::cps1_cps_b_w)).share("cps_b_regs"); /* CPS-B custom */
map(0x900000, 0x92ffff).ram().w(FUNC(cps_state::cps1_gfxram_w)).share("gfxram");
- map(0xff0000, 0xffffff).ram();
+ map(0xff0000, 0xffffff).ram().share("mainram");
}
void cps_state::sgyxz_map(address_map &map)
@@ -846,7 +887,7 @@ void cps_state::sgyxz_map(address_map &map)
map(0x900000, 0x92ffff).ram().w(FUNC(cps_state::cps1_gfxram_w)).share("gfxram");
map(0xf1c004, 0xf1c005).w(FUNC(cps_state::cpsq_coinctrl2_w)); /* Coin control2 (later games) */
map(0xf1c006, 0xf1c007).portr("EEPROMIN").portw("EEPROMOUT");
- map(0xff0000, 0xffffff).ram();
+ map(0xff0000, 0xffffff).ram().share("mainram");
}
void cps_state::wofabl_map(address_map &map)
@@ -863,7 +904,7 @@ void cps_state::wofabl_map(address_map &map)
map(0x900000, 0x92ffff).ram().w(FUNC(cps_state::cps1_gfxram_w)).share("gfxram");
map(0xf1c004, 0xf1c005).w(FUNC(cps_state::cpsq_coinctrl2_w)); /* Coin control2 (later games) */
map(0xf1c006, 0xf1c007).portr("EEPROMIN").portw("EEPROMOUT");
- map(0xff0000, 0xffffff).ram();
+ map(0xff0000, 0xffffff).ram().share("mainram");
}
void cps_state::slampic_map(address_map &map)
@@ -884,7 +925,7 @@ void cps_state::slampic_map(address_map &map)
map(0xf1c004, 0xf1c005).w(FUNC(cps_state::cpsq_coinctrl2_w)); /* Coin control2 (later games) */
map(0xf1c006, 0xf1c007).portr("EEPROMIN").portw("EEPROMOUT");
map(0xf1f000, 0xf1ffff).noprw(); // writes 0 to range, then reads F1F6EC
- map(0xff0000, 0xffffff).ram();
+ map(0xff0000, 0xffffff).ram().share("mainram");
}
void cps_state::sound_map(address_map &map)
@@ -1635,11 +1676,11 @@ MACHINE_START_MEMBER(cps_state, knightsb)
membank("bank1")->configure_entries(0, 16, &ROM[0x10000], 0x4000);
- m_layer_enable_reg = 0x30;
- m_layer_mask_reg[0] = 0x28;
- m_layer_mask_reg[1] = 0x2a;
- m_layer_mask_reg[2] = 0x2c;
- m_layer_mask_reg[3] = 0x2e;
+ m_layer_enable_reg = 0x28;
+ m_layer_mask_reg[0] = 0x26;
+ m_layer_mask_reg[1] = 0x24;
+ m_layer_mask_reg[2] = 0x22;
+ m_layer_mask_reg[3] = 0x20;
m_layer_scroll1x_offset = 0x3e; //text
m_layer_scroll2x_offset = 0x3c; //bricks around scores
m_layer_scroll3x_offset = 0x40; //hill with sword going in
@@ -1675,95 +1716,95 @@ MACHINE_RESET_MEMBER(cps_state,fcrash)
m_sample_select2 = 0;
}
-MACHINE_CONFIG_START(cps_state::fcrash)
-
+void cps_state::fcrash(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M68000, 10000000)
- MCFG_DEVICE_PROGRAM_MAP(fcrash_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", cps_state, cps1_interrupt)
- MCFG_DEVICE_IRQ_ACKNOWLEDGE_DRIVER(cps_state, cps1_int_ack)
+ M68000(config, m_maincpu, 10000000);
+ m_maincpu->set_addrmap(AS_PROGRAM, &cps_state::fcrash_map);
+ m_maincpu->set_vblank_int("screen", FUNC(cps_state::cps1_interrupt));
+ m_maincpu->set_irq_acknowledge_callback(FUNC(cps_state::cps1_int_ack));
- MCFG_DEVICE_ADD("audiocpu", Z80, 24000000/6) /* ? */
- MCFG_DEVICE_PROGRAM_MAP(sound_map)
+ Z80(config, m_audiocpu, 24000000/6); /* ? */
+ m_audiocpu->set_addrmap(AS_PROGRAM, &cps_state::sound_map);
MCFG_MACHINE_START_OVERRIDE(cps_state,fcrash)
MCFG_MACHINE_RESET_OVERRIDE(cps_state,fcrash)
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(64*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(8*8, (64-8)*8-1, 2*8, 30*8-1 )
- MCFG_SCREEN_UPDATE_DRIVER(cps_state, screen_update_fcrash)
- MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE(*this, cps_state, screen_vblank_cps1))
- MCFG_SCREEN_PALETTE("palette")
-
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_cps1)
- MCFG_PALETTE_ADD("palette", 4096)
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_refresh_hz(60);
+ m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ m_screen->set_size(64*8, 32*8);
+ m_screen->set_visarea(8*8, (64-8)*8-1, 2*8, 30*8-1 );
+ m_screen->set_screen_update(FUNC(cps_state::screen_update_fcrash));
+ m_screen->screen_vblank().set(FUNC(cps_state::screen_vblank_cps1));
+ m_screen->set_palette(m_palette);
+
+ GFXDECODE(config, m_gfxdecode, m_palette, gfx_cps1);
+ PALETTE(config, m_palette).set_entries(4096);
// sound hardware
SPEAKER(config, "mono").front_center();
GENERIC_LATCH_8(config, m_soundlatch);
- MCFG_DEVICE_ADD("ym1", YM2203, 24000000/6) /* ? */
- MCFG_SOUND_ROUTE(0, "mono", 0.10)
- MCFG_SOUND_ROUTE(1, "mono", 0.10)
- MCFG_SOUND_ROUTE(2, "mono", 0.10)
- MCFG_SOUND_ROUTE(3, "mono", 1.0)
-
- MCFG_DEVICE_ADD("ym2", YM2203, 24000000/6) /* ? */
- MCFG_SOUND_ROUTE(0, "mono", 0.10)
- MCFG_SOUND_ROUTE(1, "mono", 0.10)
- MCFG_SOUND_ROUTE(2, "mono", 0.10)
- MCFG_SOUND_ROUTE(3, "mono", 1.0)
-
- MCFG_DEVICE_ADD("msm1", MSM5205, 24000000/64) /* ? */
- MCFG_MSM5205_VCLK_CB(WRITELINE(*this, cps_state, m5205_int1)) /* interrupt function */
- MCFG_MSM5205_PRESCALER_SELECTOR(S96_4B) /* 4KHz 4-bit */
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25)
-
- MCFG_DEVICE_ADD("msm2", MSM5205, 24000000/64) /* ? */
- MCFG_MSM5205_VCLK_CB(WRITELINE(*this, cps_state, m5205_int2)) /* interrupt function */
- MCFG_MSM5205_PRESCALER_SELECTOR(S96_4B) /* 4KHz 4-bit */
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25)
-MACHINE_CONFIG_END
-
-MACHINE_CONFIG_START(cps_state::cawingbl)
+ ym2203_device &ym1(YM2203(config, "ym1", 24000000/6)); /* ? */
+ ym1.add_route(0, "mono", 0.10);
+ ym1.add_route(1, "mono", 0.10);
+ ym1.add_route(2, "mono", 0.10);
+ ym1.add_route(3, "mono", 1.0);
+
+ ym2203_device &ym2(YM2203(config, "ym2", 24000000/6)); /* ? */
+ ym2.add_route(0, "mono", 0.10);
+ ym2.add_route(1, "mono", 0.10);
+ ym2.add_route(2, "mono", 0.10);
+ ym2.add_route(3, "mono", 1.0);
+
+ MSM5205(config, m_msm_1, 24000000/64); /* ? */
+ m_msm_1->vck_legacy_callback().set(FUNC(cps_state::m5205_int1)); /* interrupt function */
+ m_msm_1->set_prescaler_selector(msm5205_device::S96_4B); /* 4KHz 4-bit */
+ m_msm_1->add_route(ALL_OUTPUTS, "mono", 0.25);
+
+ MSM5205(config, m_msm_2, 24000000/64); /* ? */
+ m_msm_2->vck_legacy_callback().set(FUNC(cps_state::m5205_int2)); /* interrupt function */
+ m_msm_2->set_prescaler_selector(msm5205_device::S96_4B); /* 4KHz 4-bit */
+ m_msm_2->add_route(ALL_OUTPUTS, "mono", 0.25);
+}
+
+void cps_state::cawingbl(machine_config &config)
+{
fcrash(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", cps_state, irq6_line_hold) /* needed to write to scroll values */
+ m_maincpu->set_vblank_int("screen", FUNC(cps_state::irq6_line_hold)); /* needed to write to scroll values */
MCFG_MACHINE_START_OVERRIDE(cps_state, cawingbl)
-MACHINE_CONFIG_END
-
-MACHINE_CONFIG_START(cps_state::kodb)
+}
+void cps_state::kodb(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M68000, 10000000)
- MCFG_DEVICE_PROGRAM_MAP(fcrash_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", cps_state, cps1_interrupt)
- MCFG_DEVICE_IRQ_ACKNOWLEDGE_DRIVER(cps_state, cps1_int_ack)
+ M68000(config, m_maincpu, 10000000);
+ m_maincpu->set_addrmap(AS_PROGRAM, &cps_state::fcrash_map);
+ m_maincpu->set_vblank_int("screen", FUNC(cps_state::cps1_interrupt));
+ m_maincpu->set_irq_acknowledge_callback(FUNC(cps_state::cps1_int_ack));
- MCFG_DEVICE_ADD("audiocpu", Z80, 3579545)
- MCFG_DEVICE_PROGRAM_MAP(kodb_sound_map)
+ Z80(config, m_audiocpu, 3579545);
+ m_audiocpu->set_addrmap(AS_PROGRAM, &cps_state::kodb_sound_map);
MCFG_MACHINE_START_OVERRIDE(cps_state,kodb)
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(64*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(8*8, (64-8)*8-1, 2*8, 30*8-1 )
- MCFG_SCREEN_UPDATE_DRIVER(cps_state, screen_update_fcrash)
- MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE(*this, cps_state, screen_vblank_cps1))
- MCFG_SCREEN_PALETTE("palette")
-
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_cps1)
- MCFG_PALETTE_ADD("palette", 0xc00)
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_refresh_hz(60);
+ m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ m_screen->set_size(64*8, 32*8);
+ m_screen->set_visarea(8*8, (64-8)*8-1, 2*8, 30*8-1);
+ m_screen->set_screen_update(FUNC(cps_state::screen_update_fcrash));
+ m_screen->screen_vblank().set(FUNC(cps_state::screen_vblank_cps1));
+ m_screen->set_palette(m_palette);
+
+ GFXDECODE(config, m_gfxdecode, m_palette, gfx_cps1);
+ PALETTE(config, m_palette).set_entries(0xc00);
/* sound hardware */
SPEAKER(config, "mono").front_center();
@@ -1776,35 +1817,35 @@ MACHINE_CONFIG_START(cps_state::kodb)
ym2151.add_route(1, "mono", 0.35);
/* CPS PPU is fed by a 16mhz clock,pin 117 outputs a 4mhz clock which is divided by 4 using 2 74ls74 */
- MCFG_DEVICE_ADD("oki", OKIM6295, XTAL(16'000'000)/4/4, okim6295_device::PIN7_HIGH) // pin 7 can be changed by the game code, see f006 on z80
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.30)
-MACHINE_CONFIG_END
-
-MACHINE_CONFIG_START(cps_state::mtwinsb)
+ OKIM6295(config, m_oki, XTAL(16'000'000)/4/4, okim6295_device::PIN7_HIGH); // pin 7 can be changed by the game code, see f006 on z80
+ m_oki->add_route(ALL_OUTPUTS, "mono", 0.30);
+}
+void cps_state::mtwinsb(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M68000, 10000000)
- MCFG_DEVICE_PROGRAM_MAP(mtwinsb_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", cps_state, cps1_interrupt)
- MCFG_DEVICE_IRQ_ACKNOWLEDGE_DRIVER(cps_state, cps1_int_ack)
+ M68000(config, m_maincpu, 10000000);
+ m_maincpu->set_addrmap(AS_PROGRAM, &cps_state::mtwinsb_map);
+ m_maincpu->set_vblank_int("screen", FUNC(cps_state::cps1_interrupt));
+ m_maincpu->set_irq_acknowledge_callback(FUNC(cps_state::cps1_int_ack));
- MCFG_DEVICE_ADD("audiocpu", Z80, 3579545)
- MCFG_DEVICE_PROGRAM_MAP(sgyxz_sound_map)
+ Z80(config, m_audiocpu, 3579545);
+ m_audiocpu->set_addrmap(AS_PROGRAM, &cps_state::sgyxz_sound_map);
MCFG_MACHINE_START_OVERRIDE(cps_state, mtwinsb)
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(64*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(8*8, (64-8)*8-1, 2*8, 30*8-1 )
- MCFG_SCREEN_UPDATE_DRIVER(cps_state, screen_update_fcrash)
- MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE(*this, cps_state, screen_vblank_cps1))
- MCFG_SCREEN_PALETTE("palette")
-
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_cps1)
- MCFG_PALETTE_ADD("palette", 0xc00)
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_refresh_hz(60);
+ m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ m_screen->set_size(64*8, 32*8);
+ m_screen->set_visarea(8*8, (64-8)*8-1, 2*8, 30*8-1);
+ m_screen->set_screen_update(FUNC(cps_state::screen_update_fcrash));
+ m_screen->screen_vblank().set(FUNC(cps_state::screen_vblank_cps1));
+ m_screen->set_palette(m_palette);
+
+ GFXDECODE(config, m_gfxdecode, m_palette, gfx_cps1);
+ PALETTE(config, m_palette).set_entries(0xc00);
/* sound hardware */
SPEAKER(config, "mono").front_center();
@@ -1817,35 +1858,35 @@ MACHINE_CONFIG_START(cps_state::mtwinsb)
ym2151.add_route(0, "mono", 0.35);
ym2151.add_route(1, "mono", 0.35);
- MCFG_DEVICE_ADD("oki", OKIM6295, XTAL(16'000'000)/4/4, okim6295_device::PIN7_HIGH)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.30)
-MACHINE_CONFIG_END
-
-MACHINE_CONFIG_START(cps_state::sf2mdt)
+ OKIM6295(config, m_oki, XTAL(16'000'000)/4/4, okim6295_device::PIN7_HIGH);
+ m_oki->add_route(ALL_OUTPUTS, "mono", 0.30);
+}
+void cps_state::sf2mdt(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M68000, 12000000)
- MCFG_DEVICE_PROGRAM_MAP(sf2mdt_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", cps_state, irq4_line_hold) /* triggers the sprite ram and scroll writes */
+ M68000(config, m_maincpu, 12000000);
+ m_maincpu->set_addrmap(AS_PROGRAM, &cps_state::sf2mdt_map);
+ m_maincpu->set_vblank_int("screen", FUNC(cps_state::irq4_line_hold)); /* triggers the sprite ram and scroll writes */
- MCFG_DEVICE_ADD("audiocpu", Z80, 3579545)
- MCFG_DEVICE_PROGRAM_MAP(sf2mdt_z80map)
+ Z80(config, m_audiocpu, 3579545);
+ m_audiocpu->set_addrmap(AS_PROGRAM, &cps_state::sf2mdt_z80map);
MCFG_MACHINE_START_OVERRIDE(cps_state, sf2mdt)
MCFG_MACHINE_RESET_OVERRIDE(cps_state,fcrash)
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(64*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(8*8, (64-8)*8-1, 2*8, 30*8-1 )
- MCFG_SCREEN_UPDATE_DRIVER(cps_state, screen_update_fcrash)
- MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE(*this, cps_state, screen_vblank_cps1))
- MCFG_SCREEN_PALETTE("palette")
-
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_cps1)
- MCFG_PALETTE_ADD("palette", 4096)
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_refresh_hz(60);
+ m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ m_screen->set_size(64*8, 32*8);
+ m_screen->set_visarea(8*8, (64-8)*8-1, 2*8, 30*8-1);
+ m_screen->set_screen_update(FUNC(cps_state::screen_update_fcrash));
+ m_screen->screen_vblank().set(FUNC(cps_state::screen_vblank_cps1));
+ m_screen->set_palette(m_palette);
+
+ GFXDECODE(config, m_gfxdecode, m_palette, gfx_cps1);
+ PALETTE(config, m_palette).set_entries(4096);
/* sound hardware */
SPEAKER(config, "mono").front_center();
@@ -1855,48 +1896,48 @@ MACHINE_CONFIG_START(cps_state::sf2mdt)
YM2151(config, "2151", XTAL(3'579'545)).add_route(0, "mono", 0.35).add_route(1, "mono", 0.35);
/* has 2x MSM5205 instead of OKI6295 */
- MCFG_DEVICE_ADD("msm1", MSM5205, 24000000/64) /* ? */
- MCFG_MSM5205_VCLK_CB(WRITELINE(*this, cps_state, m5205_int1)) /* interrupt function */
- MCFG_MSM5205_PRESCALER_SELECTOR(S96_4B) /* 4KHz 4-bit */
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25)
-
- MCFG_DEVICE_ADD("msm2", MSM5205, 24000000/64) /* ? */
- MCFG_MSM5205_VCLK_CB(WRITELINE(*this, cps_state, m5205_int2)) /* interrupt function */
- MCFG_MSM5205_PRESCALER_SELECTOR(S96_4B) /* 4KHz 4-bit */
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25)
-MACHINE_CONFIG_END
-
-MACHINE_CONFIG_START(cps_state::sf2b)
- sf2mdt(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(sf2b_map)
-MACHINE_CONFIG_END
+ MSM5205(config, m_msm_1, 24000000/64); /* ? */
+ m_msm_1->vck_legacy_callback().set(FUNC(cps_state::m5205_int1)); /* interrupt function */
+ m_msm_1->set_prescaler_selector(msm5205_device::S96_4B); /* 4KHz 4-bit */
+ m_msm_1->add_route(ALL_OUTPUTS, "mono", 0.25);
-MACHINE_CONFIG_START(cps_state::knightsb)
+ MSM5205(config, m_msm_2, 24000000/64); /* ? */
+ m_msm_2->vck_legacy_callback().set(FUNC(cps_state::m5205_int2)); /* interrupt function */
+ m_msm_2->set_prescaler_selector(msm5205_device::S96_4B); /* 4KHz 4-bit */
+ m_msm_2->add_route(ALL_OUTPUTS, "mono", 0.25);
+}
+void cps_state::sf2b(machine_config &config)
+{
+ sf2mdt(config);
+ m_maincpu->set_addrmap(AS_PROGRAM, &cps_state::sf2b_map);
+}
+
+void cps_state::knightsb(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M68000, 24000000 / 2)
- MCFG_DEVICE_PROGRAM_MAP(knightsb_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", cps_state, cps1_interrupt)
- MCFG_DEVICE_IRQ_ACKNOWLEDGE_DRIVER(cps_state, cps1_int_ack)
+ M68000(config, m_maincpu, 24000000 / 2);
+ m_maincpu->set_addrmap(AS_PROGRAM, &cps_state::knightsb_map);
+ m_maincpu->set_vblank_int("screen", FUNC(cps_state::cps1_interrupt));
+ m_maincpu->set_irq_acknowledge_callback(FUNC(cps_state::cps1_int_ack));
- MCFG_DEVICE_ADD("audiocpu", Z80, 29821000 / 8)
- MCFG_DEVICE_PROGRAM_MAP(knightsb_z80map)
+ Z80(config, m_audiocpu, 29821000 / 8);
+ m_audiocpu->set_addrmap(AS_PROGRAM, &cps_state::knightsb_z80map);
MCFG_MACHINE_START_OVERRIDE(cps_state, knightsb)
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(64*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(8*8, (64-8)*8-1, 2*8, 30*8-1 )
- MCFG_SCREEN_UPDATE_DRIVER(cps_state, screen_update_fcrash)
- MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE(*this, cps_state, screen_vblank_cps1))
- MCFG_SCREEN_PALETTE("palette")
-
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_cps1)
- MCFG_PALETTE_ADD("palette", 0xc00)
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_refresh_hz(60);
+ m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ m_screen->set_size(64*8, 32*8);
+ m_screen->set_visarea(8*8, (64-8)*8-1, 2*8, 30*8-1);
+ m_screen->set_screen_update(FUNC(cps_state::screen_update_fcrash));
+ m_screen->screen_vblank().set(FUNC(cps_state::screen_vblank_cps1));
+ m_screen->set_palette(m_palette);
+
+ GFXDECODE(config, m_gfxdecode, m_palette, gfx_cps1);
+ PALETTE(config, m_palette).set_entries(0xc00);
/* sound hardware */
SPEAKER(config, "mono").front_center();
@@ -1909,16 +1950,16 @@ MACHINE_CONFIG_START(cps_state::knightsb)
ym2151.add_route(1, "mono", 0.35);
/* has 2x MSM5205 instead of OKI6295 */
- MCFG_DEVICE_ADD("msm1", MSM5205, 24000000/64) /* ? */
- MCFG_MSM5205_VCLK_CB(WRITELINE(*this, cps_state, m5205_int1)) /* interrupt function */
- MCFG_MSM5205_PRESCALER_SELECTOR(S96_4B) /* 4KHz 4-bit */
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25)
+ MSM5205(config, m_msm_1, 24000000/64); /* ? */
+ m_msm_1->vck_legacy_callback().set(FUNC(cps_state::m5205_int1)); /* interrupt function */
+ m_msm_1->set_prescaler_selector(msm5205_device::S96_4B); /* 4KHz 4-bit */
+ m_msm_1->add_route(ALL_OUTPUTS, "mono", 0.25);
- MCFG_DEVICE_ADD("msm2", MSM5205, 24000000/64) /* ? */
- MCFG_MSM5205_VCLK_CB(WRITELINE(*this, cps_state, m5205_int2)) /* interrupt function */
- MCFG_MSM5205_PRESCALER_SELECTOR(S96_4B) /* 4KHz 4-bit */
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25)
-MACHINE_CONFIG_END
+ MSM5205(config, m_msm_2, 24000000/64); /* ? */
+ m_msm_2->vck_legacy_callback().set(FUNC(cps_state::m5205_int2)); /* interrupt function */
+ m_msm_2->set_prescaler_selector(msm5205_device::S96_4B); /* 4KHz 4-bit */
+ m_msm_2->add_route(ALL_OUTPUTS, "mono", 0.25);
+}
#define CODE_SIZE 0x400000
@@ -2253,42 +2294,40 @@ MACHINE_START_MEMBER(cps_state, dinopic)
m_sprite_x_offset = 0;
}
-MACHINE_CONFIG_START(cps_state::dinopic)
-
+void cps_state::dinopic(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M68000, 12000000)
- MCFG_DEVICE_PROGRAM_MAP(dinopic_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", cps_state, cps1_interrupt)
- MCFG_DEVICE_IRQ_ACKNOWLEDGE_DRIVER(cps_state, cps1_int_ack)
+ M68000(config, m_maincpu, 12000000);
+ m_maincpu->set_addrmap(AS_PROGRAM, &cps_state::dinopic_map);
+ m_maincpu->set_vblank_int("screen", FUNC(cps_state::cps1_interrupt));
+ m_maincpu->set_irq_acknowledge_callback(FUNC(cps_state::cps1_int_ack));
- //MCFG_DEVICE_ADD("audiocpu", PIC16C57, 12000000)
- //MCFG_DEVICE_DISABLE() /* no valid dumps .. */
+ //PIC16C57(config, m_audiocpu, 12000000).set_disable(); /* no valid dumps .. */
MCFG_MACHINE_START_OVERRIDE(cps_state, dinopic)
EEPROM_93C46_8BIT(config, "eeprom");
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(64*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(8*8, (64-8)*8-1, 2*8, 30*8-1 )
- MCFG_SCREEN_UPDATE_DRIVER(cps_state, screen_update_fcrash)
- MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE(*this, cps_state, screen_vblank_cps1))
- MCFG_SCREEN_PALETTE("palette")
-
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_cps1)
- MCFG_PALETTE_ADD("palette", 0xc00)
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_refresh_hz(60);
+ m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ m_screen->set_size(64*8, 32*8);
+ m_screen->set_visarea(8*8, (64-8)*8-1, 2*8, 30*8-1 );
+ m_screen->set_screen_update(FUNC(cps_state::screen_update_fcrash));
+ m_screen->screen_vblank().set(FUNC(cps_state::screen_vblank_cps1));
+ m_screen->set_palette(m_palette);
+
+ GFXDECODE(config, m_gfxdecode, m_palette, gfx_cps1);
+ PALETTE(config, m_palette).set_entries(0xc00);
/* sound hardware */
SPEAKER(config, "mono").front_center();
GENERIC_LATCH_8(config, m_soundlatch);
- MCFG_DEVICE_ADD("oki", OKIM6295, 1000000, okim6295_device::PIN7_HIGH)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.30)
-MACHINE_CONFIG_END
+ OKIM6295(config, m_oki, 1000000, okim6295_device::PIN7_HIGH).add_route(ALL_OUTPUTS, "mono", 0.30);
+}
/*
@@ -2444,29 +2483,30 @@ void cps_state::init_mtwinsb()
// sound cpu is (239 V 249521 VC5006 KABUKI DL-030P-110V) - recycled Kabuki Z80 from genuine Capcom HW?
// 3x8 dsws
-MACHINE_CONFIG_START(cps_state::sgyxz)
+void cps_state::sgyxz(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M68000, 12000000)
- MCFG_DEVICE_PROGRAM_MAP(sgyxz_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", cps_state, cps1_interrupt)
- MCFG_DEVICE_IRQ_ACKNOWLEDGE_DRIVER(cps_state, cps1_int_ack)
+ M68000(config, m_maincpu, 12000000);
+ m_maincpu->set_addrmap(AS_PROGRAM, &cps_state::sgyxz_map);
+ m_maincpu->set_vblank_int("screen", FUNC(cps_state::cps1_interrupt));
+ m_maincpu->set_irq_acknowledge_callback(FUNC(cps_state::cps1_int_ack));
- MCFG_DEVICE_ADD("audiocpu", Z80, 3579545)
- MCFG_DEVICE_PROGRAM_MAP(sgyxz_sound_map)
+ Z80(config, m_audiocpu, 3579545);
+ m_audiocpu->set_addrmap(AS_PROGRAM, &cps_state::sgyxz_sound_map);
MCFG_MACHINE_START_OVERRIDE(cps_state,sgyxz)
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(64*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(8*8, (64-8)*8-1, 2*8, 30*8-1 )
- MCFG_SCREEN_UPDATE_DRIVER(cps_state, screen_update_fcrash)
- MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE(*this, cps_state, screen_vblank_cps1))
- MCFG_SCREEN_PALETTE("palette")
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_cps1)
- MCFG_PALETTE_ADD("palette", 0xc00)
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_refresh_hz(60);
+ m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ m_screen->set_size(64*8, 32*8);
+ m_screen->set_visarea(8*8, (64-8)*8-1, 2*8, 30*8-1 );
+ m_screen->set_screen_update(FUNC(cps_state::screen_update_fcrash));
+ m_screen->screen_vblank().set(FUNC(cps_state::screen_vblank_cps1));
+ m_screen->set_palette(m_palette);
+ GFXDECODE(config, m_gfxdecode, m_palette, gfx_cps1);
+ PALETTE(config, m_palette).set_entries(0xc00);
EEPROM_93C46_8BIT(config, "eeprom");
@@ -2482,9 +2522,8 @@ MACHINE_CONFIG_START(cps_state::sgyxz)
ym2151.add_route(1, "mono", 0.35);
/* CPS PPU is fed by a 16mhz clock,pin 117 outputs a 4mhz clock which is divided by 4 using 2 74ls74 */
- MCFG_DEVICE_ADD("oki", OKIM6295, XTAL(16'000'000)/4/4, okim6295_device::PIN7_HIGH) // pin 7 can be changed by the game code, see f006 on z80
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.30)
-MACHINE_CONFIG_END
+ OKIM6295(config, m_oki, XTAL(16'000'000)/4/4, okim6295_device::PIN7_HIGH).add_route(ALL_OUTPUTS, "mono", 0.30); // pin 7 can be changed by the game code, see f006 on z80
+}
ROM_START( sgyxz )
ROM_REGION( CODE_SIZE, "maincpu", 0 ) /* 68000 Code */
@@ -2519,12 +2558,12 @@ ROM_START( sgyxz )
ROM_LOAD( "sgyxz_snd1.bin", 0x00000, 0x40000, CRC(c15ac0f2) SHA1(8d9e5519d9820e4ac4f70555088c80e64d052c9d) )
ROM_END
-MACHINE_CONFIG_START(cps_state::wofabl)
+void cps_state::wofabl(machine_config &config)
+{
sgyxz(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(wofabl_map)
-MACHINE_CONFIG_END
+ m_maincpu->set_addrmap(AS_PROGRAM, &cps_state::wofabl_map);
+}
ROM_START( wofabl )
ROM_REGION( CODE_SIZE, "maincpu", 0 ) /* 68000 Code */
@@ -2567,42 +2606,40 @@ MACHINE_START_MEMBER(cps_state, punipic)
m_sprite_x_offset = 0;
}
-MACHINE_CONFIG_START(cps_state::punipic)
-
+void cps_state::punipic(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M68000, 12000000)
- MCFG_DEVICE_PROGRAM_MAP(punipic_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", cps_state, cps1_interrupt)
- MCFG_DEVICE_IRQ_ACKNOWLEDGE_DRIVER(cps_state, cps1_int_ack)
+ M68000(config, m_maincpu, 12000000);
+ m_maincpu->set_addrmap(AS_PROGRAM, &cps_state::punipic_map);
+ m_maincpu->set_vblank_int("screen", FUNC(cps_state::cps1_interrupt));
+ m_maincpu->set_irq_acknowledge_callback(FUNC(cps_state::cps1_int_ack));
- //MCFG_DEVICE_ADD("audiocpu", PIC16C57, 12000000)
- //MCFG_DEVICE_DISABLE() /* no valid dumps .. */
+ //PIC16C57(config, m_audiocpu, 12000000).set_disable(); /* no valid dumps .. */
MCFG_MACHINE_START_OVERRIDE(cps_state, punipic)
EEPROM_93C46_8BIT(config, "eeprom");
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(64*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(8*8, (64-8)*8-1, 2*8, 30*8-1 )
- MCFG_SCREEN_UPDATE_DRIVER(cps_state, screen_update_fcrash)
- MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE(*this, cps_state, screen_vblank_cps1))
- MCFG_SCREEN_PALETTE("palette")
-
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_cps1)
- MCFG_PALETTE_ADD("palette", 0xc00)
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_refresh_hz(60);
+ m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ m_screen->set_size(64*8, 32*8);
+ m_screen->set_visarea(8*8, (64-8)*8-1, 2*8, 30*8-1 );
+ m_screen->set_screen_update(FUNC(cps_state::screen_update_fcrash));
+ m_screen->screen_vblank().set(FUNC(cps_state::screen_vblank_cps1));
+ m_screen->set_palette(m_palette);
+
+ GFXDECODE(config, m_gfxdecode, m_palette, gfx_cps1);
+ PALETTE(config, m_palette).set_entries(0xc00);
/* sound hardware */
SPEAKER(config, "mono").front_center();
GENERIC_LATCH_8(config, m_soundlatch);
- MCFG_DEVICE_ADD("oki", OKIM6295, 1000000, okim6295_device::PIN7_HIGH)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.30)
-MACHINE_CONFIG_END
+ OKIM6295(config, m_oki, 1000000, okim6295_device::PIN7_HIGH).add_route(ALL_OUTPUTS, "mono", 0.30);
+}
/* bootleg with pic, like dinopic / dinopic2 */
ROM_START( punipic )
@@ -2761,28 +2798,28 @@ void cps_state::init_punipic3()
// ************************************************************************* SF2M1
-MACHINE_CONFIG_START(cps_state::sf2m1)
-
+void cps_state::sf2m1(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M68000, XTAL(12'000'000) )
- MCFG_DEVICE_PROGRAM_MAP(sf2m1_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", cps_state, cps1_interrupt)
- MCFG_DEVICE_IRQ_ACKNOWLEDGE_DRIVER(cps_state, cps1_int_ack)
+ M68000(config, m_maincpu, XTAL(12'000'000));
+ m_maincpu->set_addrmap(AS_PROGRAM, &cps_state::sf2m1_map);
+ m_maincpu->set_vblank_int("screen", FUNC(cps_state::cps1_interrupt));
+ m_maincpu->set_irq_acknowledge_callback(FUNC(cps_state::cps1_int_ack));
- MCFG_DEVICE_ADD("audiocpu", Z80, XTAL(3'579'545))
- MCFG_DEVICE_PROGRAM_MAP(sgyxz_sound_map)
+ Z80(config, m_audiocpu, XTAL(3'579'545));
+ m_audiocpu->set_addrmap(AS_PROGRAM, &cps_state::sgyxz_sound_map);
MCFG_MACHINE_START_OVERRIDE(cps_state,sf2m1)
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_RAW_PARAMS(CPS_PIXEL_CLOCK, CPS_HTOTAL, CPS_HBEND, CPS_HBSTART, CPS_VTOTAL, CPS_VBEND, CPS_VBSTART)
- MCFG_SCREEN_UPDATE_DRIVER(cps_state, screen_update_fcrash)
- MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE(*this, cps_state, screen_vblank_cps1))
- MCFG_SCREEN_PALETTE("palette")
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_raw(CPS_PIXEL_CLOCK, CPS_HTOTAL, CPS_HBEND, CPS_HBSTART, CPS_VTOTAL, CPS_VBEND, CPS_VBSTART);
+ m_screen->set_screen_update(FUNC(cps_state::screen_update_fcrash));
+ m_screen->screen_vblank().set(FUNC(cps_state::screen_vblank_cps1));
+ m_screen->set_palette(m_palette);
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_cps1)
- MCFG_PALETTE_ADD("palette", 0xc00)
+ GFXDECODE(config, m_gfxdecode, m_palette, gfx_cps1);
+ PALETTE(config, m_palette).set_entries(0xc00);
/* sound hardware */
SPEAKER(config, "mono").front_center();
@@ -2792,9 +2829,8 @@ MACHINE_CONFIG_START(cps_state::sf2m1)
ym2151.irq_handler().set_inputline(m_audiocpu, 0);
ym2151.add_route(0, "mono", 0.35);
ym2151.add_route(1, "mono", 0.35);
- MCFG_DEVICE_ADD("oki", OKIM6295, XTAL(16'000'000)/4/4, okim6295_device::PIN7_HIGH)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.30)
-MACHINE_CONFIG_END
+ OKIM6295(config, m_oki, XTAL(16'000'000)/4/4, okim6295_device::PIN7_HIGH).add_route(ALL_OUTPUTS, "mono", 0.30);
+}
ROM_START( sf2m1 )
ROM_REGION( CODE_SIZE, "maincpu", 0 ) /* 68000 code */
@@ -3137,40 +3173,38 @@ MACHINE_START_MEMBER(cps_state, slampic)
m_sprite_x_offset = 0;
}
-MACHINE_CONFIG_START(cps_state::slampic)
-
+void cps_state::slampic(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M68000, 12000000)
- MCFG_DEVICE_PROGRAM_MAP(slampic_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", cps_state, cps1_interrupt)
- MCFG_DEVICE_IRQ_ACKNOWLEDGE_DRIVER(cps_state, cps1_int_ack)
+ M68000(config, m_maincpu, 12000000);
+ m_maincpu->set_addrmap(AS_PROGRAM, &cps_state::slampic_map);
+ m_maincpu->set_vblank_int("screen", FUNC(cps_state::cps1_interrupt));
+ m_maincpu->set_irq_acknowledge_callback(FUNC(cps_state::cps1_int_ack));
- //MCFG_DEVICE_ADD("audiocpu", PIC16C57, 12000000)
- //MCFG_DEVICE_DISABLE() /* no valid dumps .. */
+ //PIC16C57(config, m_audiocpu, 12000000).set_disable(); /* no valid dumps .. */
MCFG_MACHINE_START_OVERRIDE(cps_state, slampic)
EEPROM_93C46_8BIT(config, "eeprom");
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(64*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(8*8, (64-8)*8-1, 2*8, 30*8-1 )
- MCFG_SCREEN_UPDATE_DRIVER(cps_state, screen_update_fcrash)
- MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE(*this, cps_state, screen_vblank_cps1))
- MCFG_SCREEN_PALETTE("palette")
-
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_cps1)
- MCFG_PALETTE_ADD("palette", 0xc00)
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_refresh_hz(60);
+ m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ m_screen->set_size(64*8, 32*8);
+ m_screen->set_visarea(8*8, (64-8)*8-1, 2*8, 30*8-1 );
+ m_screen->set_screen_update(FUNC(cps_state::screen_update_fcrash));
+ m_screen->screen_vblank().set(FUNC(cps_state::screen_vblank_cps1));
+ m_screen->set_palette(m_palette);
+
+ GFXDECODE(config, m_gfxdecode, m_palette, gfx_cps1);
+ PALETTE(config, m_palette).set_entries(0xc00);
/* sound hardware */
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("oki", OKIM6295, 1000000, okim6295_device::PIN7_HIGH)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.30)
-MACHINE_CONFIG_END
+ OKIM6295(config, m_oki, 1000000, okim6295_device::PIN7_HIGH).add_route(ALL_OUTPUTS, "mono", 0.30);
+}
ROM_START( slampic )
ROM_REGION( CODE_SIZE, "maincpu", 0 ) /* 68000 code */
@@ -3238,31 +3272,31 @@ void cps_state::varthb_map(address_map &map)
map(0xff0000, 0xffffff).ram().share("mainram");
}
-MACHINE_CONFIG_START(cps_state::varthb)
-
+void cps_state::varthb(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M68000, 12000000)
- MCFG_DEVICE_PROGRAM_MAP(varthb_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", cps_state, cps1_interrupt)
- MCFG_DEVICE_IRQ_ACKNOWLEDGE_DRIVER(cps_state, cps1_int_ack)
+ M68000(config, m_maincpu, 12000000);
+ m_maincpu->set_addrmap(AS_PROGRAM, &cps_state::varthb_map);
+ m_maincpu->set_vblank_int("screen", FUNC(cps_state::cps1_interrupt));
+ m_maincpu->set_irq_acknowledge_callback(FUNC(cps_state::cps1_int_ack));
- MCFG_DEVICE_ADD("audiocpu", Z80, 3579545)
- MCFG_DEVICE_PROGRAM_MAP(sgyxz_sound_map)
+ Z80(config, m_audiocpu, 3579545);
+ m_audiocpu->set_addrmap(AS_PROGRAM, &cps_state::sgyxz_sound_map);
MCFG_MACHINE_START_OVERRIDE(cps_state,cps1)
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(64*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(8*8, (64-8)*8-1, 2*8, 30*8-1 )
- MCFG_SCREEN_UPDATE_DRIVER(cps_state, screen_update_cps1)
- MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE(*this, cps_state, screen_vblank_cps1))
- MCFG_SCREEN_PALETTE("palette")
-
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_cps1)
- MCFG_PALETTE_ADD("palette", 0xc00)
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_refresh_hz(60);
+ m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ m_screen->set_size(64*8, 32*8);
+ m_screen->set_visarea(8*8, (64-8)*8-1, 2*8, 30*8-1 );
+ m_screen->set_screen_update(FUNC(cps_state::screen_update_cps1));
+ m_screen->screen_vblank().set(FUNC(cps_state::screen_vblank_cps1));
+ m_screen->set_palette(m_palette);
+
+ GFXDECODE(config, m_gfxdecode, m_palette, gfx_cps1);
+ PALETTE(config, m_palette).set_entries(0xc00);
/* sound hardware */
SPEAKER(config, "mono").front_center();
@@ -3275,9 +3309,8 @@ MACHINE_CONFIG_START(cps_state::varthb)
ym2151.add_route(0, "mono", 0.35);
ym2151.add_route(1, "mono", 0.35);
- MCFG_DEVICE_ADD("oki", OKIM6295, XTAL(16'000'000)/4/4, okim6295_device::PIN7_HIGH)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.30)
-MACHINE_CONFIG_END
+ OKIM6295(config, m_oki, XTAL(16'000'000)/4/4, okim6295_device::PIN7_HIGH).add_route(ALL_OUTPUTS, "mono", 0.30);
+}
ROM_START( varthb )
ROM_REGION( CODE_SIZE, "maincpu", 0 ) /* 68000 code */
@@ -3327,12 +3360,12 @@ GAME( 1990, ffightbla, ffight, fcrash, fcrash, cps_state, init_cps1,
GAME( 1991, kodb, kod, kodb, kodb, cps_state, init_kodb, ROT0, "bootleg (Playmark)", "The King of Dragons (bootleg)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE ) // 910731 "ETC"
-GAME( 1991, knightsb, knights, knightsb, knights, cps_state, init_dinopic, ROT0, "bootleg", "Knights of the Round (bootleg)", MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE ) // 911127 - based on World version
+GAME( 1991, knightsb, knights, knightsb, knights, cps_state, init_dinopic, ROT0, "bootleg", "Knights of the Round (bootleg)", MACHINE_SUPPORTS_SAVE ) // 911127 - based on World version
GAME( 1993, mtwinsb, mtwins, mtwinsb, mtwins, cps_state, init_mtwinsb, ROT0, "David Inc. (bootleg)", "Twins (Mega Twins bootleg)", MACHINE_SUPPORTS_SAVE ) // based on World version
-GAME( 1993, punipic, punisher, punipic, punisher, cps_state, init_punipic, ROT0, "bootleg", "The Punisher (bootleg with PIC16c57, set 1)", MACHINE_NO_SOUND | MACHINE_SUPPORTS_SAVE ) // 930422 ETC
-GAME( 1993, punipic2, punisher, punipic, punisher, cps_state, init_punipic, ROT0, "bootleg", "The Punisher (bootleg with PIC16c57, set 2)", MACHINE_NO_SOUND | MACHINE_SUPPORTS_SAVE ) // 930422 ETC
+GAME( 1993, punipic, punisher, punipic, punisher, cps_state, init_punipic, ROT0, "bootleg", "The Punisher (bootleg with PIC16c57, set 1)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_NO_SOUND | MACHINE_SUPPORTS_SAVE ) // 930422 ETC
+GAME( 1993, punipic2, punisher, punipic, punisher, cps_state, init_punipic, ROT0, "bootleg", "The Punisher (bootleg with PIC16c57, set 2)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_NO_SOUND | MACHINE_SUPPORTS_SAVE ) // 930422 ETC
GAME( 1993, punipic3, punisher, punipic, punisher, cps_state, init_punipic3, ROT0, "bootleg", "The Punisher (bootleg with PIC16c57, set 3)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_NO_SOUND | MACHINE_SUPPORTS_SAVE ) // 930422 ETC
GAME( 1992, sf2m1, sf2ce, sf2m1, sf2, cps_state, init_sf2m1, ROT0, "bootleg", "Street Fighter II': Champion Edition (M1, bootleg)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE ) // 920313 ETC
diff --git a/src/mame/drivers/feversoc.cpp b/src/mame/drivers/feversoc.cpp
index db22fe0ba17..552d2d81df5 100644
--- a/src/mame/drivers/feversoc.cpp
+++ b/src/mame/drivers/feversoc.cpp
@@ -286,29 +286,28 @@ void feversoc_state::machine_start()
m_lamps.resolve();
}
-MACHINE_CONFIG_START(feversoc_state::feversoc)
-
+void feversoc_state::feversoc(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu",SH2,MASTER_CLOCK)
- MCFG_DEVICE_PROGRAM_MAP(feversoc_map)
+ SH2(config, m_maincpu, MASTER_CLOCK);
+ m_maincpu->set_addrmap(AS_PROGRAM, &feversoc_state::feversoc_map);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(40*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 40*8-1, 0*8, 30*8-1) //dynamic resolution?
- MCFG_SCREEN_UPDATE_DRIVER(feversoc_state, screen_update_feversoc)
- MCFG_SCREEN_PALETTE(m_palette)
- MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE(*this, feversoc_state, feversoc_irq))
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(40*8, 32*8);
+ screen.set_visarea(0*8, 40*8-1, 0*8, 30*8-1); //dynamic resolution?
+ screen.set_screen_update(FUNC(feversoc_state::screen_update_feversoc));
+ screen.set_palette(m_palette);
+ screen.screen_vblank().set(FUNC(feversoc_state::feversoc_irq));
GFXDECODE(config, m_gfxdecode, m_palette, gfx_feversoc);
PALETTE(config, m_palette).set_format(palette_device::xBGR_555, 0x1000);
/* sound hardware */
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("oki", OKIM6295, MASTER_CLOCK/16, okim6295_device::PIN7_LOW) //pin 7 & frequency not verified (clock should be 28,6363 / n)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.6)
+ OKIM6295(config, m_oki, MASTER_CLOCK/16, okim6295_device::PIN7_LOW).add_route(ALL_OUTPUTS, "mono", 0.6); //pin 7 & frequency not verified (clock should be 28,6363 / n)
EEPROM_93C56_16BIT(config, "eeprom");
@@ -316,8 +315,8 @@ MACHINE_CONFIG_START(feversoc_state::feversoc)
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
- MCFG_TICKET_DISPENSER_ADD("hopper", attotime::from_msec(60), TICKET_MOTOR_ACTIVE_HIGH, TICKET_STATUS_ACTIVE_HIGH )
-MACHINE_CONFIG_END
+ TICKET_DISPENSER(config, m_hopper, attotime::from_msec(60), TICKET_MOTOR_ACTIVE_HIGH, TICKET_STATUS_ACTIVE_HIGH);
+}
/***************************************************************************
diff --git a/src/mame/drivers/fgoal.cpp b/src/mame/drivers/fgoal.cpp
index 8aee26d04be..e4014e1458c 100644
--- a/src/mame/drivers/fgoal.cpp
+++ b/src/mame/drivers/fgoal.cpp
@@ -359,28 +359,28 @@ void fgoal_state::machine_reset()
m_prev_coin = 0;
}
-MACHINE_CONFIG_START(fgoal_state::fgoal)
-
+void fgoal_state::fgoal(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M6800, 10065000 / 10) /* ? */
- MCFG_DEVICE_PROGRAM_MAP(cpu_map)
+ M6800(config, m_maincpu, 10065000 / 10); /* ? */
+ m_maincpu->set_addrmap(AS_PROGRAM, &fgoal_state::cpu_map);
/* add shifter */
MB14241(config, "mb14241");
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_SIZE(256, 263)
- MCFG_SCREEN_VISIBLE_AREA(0, 255, 16, 255)
- MCFG_SCREEN_UPDATE_DRIVER(fgoal_state, screen_update)
- MCFG_SCREEN_PALETTE(m_palette);
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_refresh_hz(60);
+ m_screen->set_size(256, 263);
+ m_screen->set_visarea(0, 255, 16, 255);
+ m_screen->set_screen_update(FUNC(fgoal_state::screen_update));
+ m_screen->set_palette(m_palette);
GFXDECODE(config, m_gfxdecode, m_palette, gfx_fgoal);
PALETTE(config, m_palette, FUNC(fgoal_state::fgoal_palette), 128 + 16 + 1);
/* sound hardware */
-MACHINE_CONFIG_END
+}
ROM_START( fgoal )
diff --git a/src/mame/drivers/fidel6502.cpp b/src/mame/drivers/fidel6502.cpp
deleted file mode 100644
index 6209284c169..00000000000
--- a/src/mame/drivers/fidel6502.cpp
+++ /dev/null
@@ -1,2902 +0,0 @@
-// license:BSD-3-Clause
-// copyright-holders:Kevin Horton,Jonathan Gevaryahu,Sandro Ronco,hap
-// thanks-to:Berger,yoyo_chessboard
-/******************************************************************************
-
- Fidelity Electronics 6502 based board driver
-
- NOTE: MAME doesn't include a generalized implementation for boardpieces yet,
- greatly affecting user playability of emulated electronic board games.
- As workaround for the chess games, use an external chess GUI on the side,
- such as Arena(in editmode).
-
- TODO:
- - Source organization is a big mess. Each machine family could be in its own
- sub driverclass, and separate files.
- - verify cpu speed and rom labels where unknown
- - improve EAS/SC12/etc CPU divider? it seems a little bit slower than the real machine.
- Currently, a dummy timer workaround is needed, or it's much worse.
- Is the problem here is due to timing of CPU addressbus changes? We can only 'sense'
- the addressbus at read or write accesses.
- - granits gives error beeps at start, need to press clear to play
- - finish fphantom emulation
-
-******************************************************************************
-
-Champion Sensory Chess Challenger (CSC)
----------------------------------------
-
-Memory map:
------------
-0000-07FF: 2K of RAM
-0800-0FFF: 1K of RAM (note: mirrored twice)
-1000-17FF: PIA 0 (display, TSI speech chip)
-1800-1FFF: PIA 1 (keypad, LEDs)
-2000-3FFF: 101-64019 ROM (also used on the regular sensory chess challenger)
-4000-7FFF: mirror of 0000-3FFF
-8000-9FFF: not used
-A000-BFFF: 101-1025A03 ROM
-C000-DFFF: 101-1025A02 ROM
-E000-FDFF: 101-1025A01 ROM
-FE00-FFFF: 512 byte 74S474 PROM
-
-CPU is a 6502 running at 1.95MHz (3.9MHz resonator, divided by 2)
-
-NMI is not used.
-IRQ is connected to a 600Hz oscillator (38.4KHz divided by 64).
-Reset is connected to a power-on reset circuit.
-
-PIA 0:
-------
-PA0 - 7seg segments E, TSI A0
-PA1 - 7seg segments D, TSI A1
-PA2 - 7seg segments C, TSI A2
-PA3 - 7seg segments H, TSI A3
-PA4 - 7seg segments G, TSI A4
-PA5 - 7seg segments F, TSI A5
-PA6 - 7seg segments B
-PA7 - 7seg segments A
-
-PB0 - A12 on speech ROM (if used... not used on this model, ROM is 4K)
-PB1 - START line on TSI
-PB2 - white wire
-PB3 - BUSY line from TSI
-PB4 - hi/lo TSI speaker volume
-PB5 - button row 9
-PB6 - selection jumper (resistor to 5V)
-PB7 - selection jumper (resistor to ground)
-
-CA1 - NC
-CA2 - violet wire
-
-CB1 - NC
-CB2 - NC (connects to pin 14 of soldered connector)
-
-PIA 1:
-------
-PA0 - button row 1
-PA1 - button row 2
-PA2 - button row 3
-PA3 - button row 4
-PA4 - button row 5
-PA5 - button row 6
-PA6 - 7442 selector bit 0
-PA7 - 7442 selector bit 1
-
-PB0 - LED row 1
-PB1 - LED row 2
-PB2 - LED row 3
-PB3 - LED row 4
-PB4 - LED row 5
-PB5 - LED row 6
-PB6 - LED row 7
-PB7 - LED row 8
-
-CA1 - button row 7
-CA2 - selector bit 3
-
-CB1 - button row 8
-CB2 - selector bit 2
-
-Selector: (attached to PIA 1, outputs 1 of 10 pins low. 7442)
----------
-output # (selected turns this column on, and all others off)
-0 - LED column A, button column A, 7seg digit 1
-1 - LED column B, button column B, 7seg digit 2
-2 - LED column C, button column C, 7seg digit 3
-3 - LED column D, button column D, 7seg digit 4
-4 - LED column E, button column E
-5 - LED column F, button column F
-6 - LED column G, button column G
-7 - LED column H, button column H
-8 - button column I
-9 - Tone line (toggle to make a tone in the buzzer)
-
-The rows/columns are indicated on the game board:
-
- ABCDEFGH I
---------------
-| | 8
-| | 7
-| | 6
-| | 5
-| | 4
-| | 3
-| | 2
-| | 1
---------------
-
-The "lone LED" is above the control column.
-column I is the "control column" on the right for starting a new game, etc.
-
-The upper 6 buttons are connected as such:
-
-column A - speak
-column B - RV
-column C - TM
-column D - LV
-column E - DM
-column F - ST
-
-these 6 buttons use row 9 (connects to PIA 0)
-
-LED display:
-------------
-43 21 (digit number)
------
-88:88
-
-The LED display is four 7 segment digits. normal ABCDEFG lettering is used for segments.
-
-The upper dot is connected to digit 3 common
-The lower dot is connected to digit 4 common
-The lone LED is connected to digit 1 common
-
-All three of the above are called "segment H".
-
-
-******************************************************************************
-
-Super 9 Sensory Chess Challenger (SU9/DS9)
-This is basically the Fidelity Elite A/S program on CSC hardware.
-Model DS9(Deluxe) has a 5MHz XTAL, but is otherwise same.
----------------------------------
-
-R6502AP CPU, 1.95MHz(3.9MHz resonator)
-2 RAM chips, assume 4KB
-2*8KB ROM + 1*2KB ROM
-built-in CB9 module
-
-See CSC description above for more information.
-
-
-******************************************************************************
-
-Reversi Sensory Challenger (RSC)
-The 1st version came out in 1980, a program revision was released in 1981.
-Another distinction is the board color and layout, the 1981 version is green.
----------------------------------
-
-8*(8+1) buttons, 8*8+1 LEDs
-1KB RAM(2*2114), 4KB ROM
-MOS MPS 6502B CPU, frequency unknown
-MOS MPS 6520 PIA, I/O is nearly same as CSC's PIA 1
-PCB label 510-1035A01
-
-
-******************************************************************************
-
-Elite A/S Challenger (EAS)
-This came out in 1982. 2 program updates were released in 1983 and 1984,
-named Budapest and Glasgow, places where Fidelity won chess computer matches.
-A/S stands for auto sensory, it's the 1st Fidelity board with magnet sensors.
----------------------------------
-
-8*8 magnet sensors, 11 buttons, 8*(8+1) LEDs + 4*7seg LEDs
-R65C02P4 or R6502BP CPU, default frequency 3MHz*
-4KB RAM (2*HM6116), 24KB ROM
-TSI S14001A + speech ROM
-I/O with 8255 PPI and bunch of TTL
-module slot and printer port
-PCB label 510-1071A01
-
-*It was advertised as 3.2, 3.6, or 4MHz, with unofficial modifications up to 8MHz.
-PCB photos show only a 3MHz XTAL.
-
-A condensator keeps RAM contents alive for a few hours when powered off.
-
-Elite Avant Garde (models 6081,6088,6089) is on the same hardware.
-
-Prestige Challenger (PC) hardware is very similar. They stripped the 8255 PPI,
-and added more RAM(7*TMM2016P). Some were released at 3.6MHz instead of 4MHz,
-perhaps due to hardware instability?
-
-
-******************************************************************************
-
-Sensory Chess Challenger "9" (SC9)
-3 versions were available, the newest "B" version was 2MHz and included the Budapest program.
-The Playmatic S was only released in Germany, it's basically a 'deluxe' version of SC9
-with magnet sensors and came with CB9 and CB16.
----------------------------------
-
-8*(8+1) buttons, 8*8+1 LEDs
-36-pin edge connector, assume same as SC12
-2KB RAM(TMM2016P), 2*8KB ROM(HN48364P)
-R6502-13, 1.4MHz from resonator, another pcb with the same resonator was measured 1.49MHz*
-PCB label 510-1046C01 2-1-82
-
-*: 2 other boards were measured 1.60MHz and 1.88MHz(newest serial). Online references
-suggest 3 versions of SC9(C01) total: 1.5MHz, 1.6MHz, and 1.9MHz.
-
-I/O is via TTL, not further documented here
-
-
-******************************************************************************
-
-Sensory 12 Chess Challenger (SC12-B, 6086)
-4 versions are known to exist: A,B,C, and X, with increasing CPU speed.
----------------------------------
-RE information from netlist by Berger
-
-8*(8+1) buttons, 8+8+2 red LEDs
-DIN 41524C printer port
-36-pin edge connector
-CPU is a R65C02P4, running at 4MHz*
-
-*By default, the CPU frequency is lowered on A13/A14 access, with a factory-set jumper:
-/2 on model SC12(1.5MHz), /4 on model 6086(1MHz)
-
-NE556 dual-timer IC:
-- timer#1, one-shot at power-on, to CPU _RESET
-- timer#2: R1=82K+50K pot at 26K, R2=1K, C=22nF, to CPU _IRQ: ~596Hz, active low=15.25us
-
-Memory map:
------------
-0000-0FFF: 4K RAM (2016 * 2)
-2000-5FFF: cartridge
-6000-7FFF: control(W)
-8000-9FFF: 8K ROM SSS SCM23C65E4
-A000-BFFF: keypad(R)
-C000-DFFF: 4K ROM TI TMS2732AJL-45
-E000-FFFF: 8K ROM Toshiba TMM2764D-2
-
-control: (74LS377)
---------
-Q0-Q3: 7442 A0-A3
-Q4: enable printer port pin 1 input
-Q5: printer port pin 5 output
-Q6,Q7: LEDs common anode
-
-7442 0-8: input mux and LEDs cathode
-7442 9: buzzer
-
-The keypad is read through a 74HC251, where S0,1,2 is from CPU A0,1,2, Y is connected to CPU D7.
-If control Q4 is set, printer data can be read from I0.
-
-
-******************************************************************************
-
-Voice Excellence (model 6092)
-----------------
-PCB 1: 510.1117A02, appears to be identical to other "Excellence" boards
-CPU: GTE G65SC102P-3, 32 KB PRG ROM: AMI 101-1080A01(IC5), 8192x8 SRAM SRM2264C10(IC6)
-2 rows of LEDs on the side: 1*8 green, 1*8 red
-
-PCB 2: 510.1117A01
-Speech: TSI S14001A, 32 KB ROM: AMI 101-1081A01(IC2)
-Dip Switches set ROM A13 and ROM A14, on the side of the board
-
-ROM A12 is tied to S14001A's A11 (yuck)
-ROM A11 is however tied to the CPU's XYZ
-
-0000_07FF - Spanish 1/4
-0800_0FFF - Spanish 3/4
-1000_17FF - Spanish 2/4
-1800_1FFF - Spanish 4/4
-
-2000_27FF - French 1/4
-2800_2FFF - French 3/4
-3000_3FFF - French 2/4
-3800_3FFF - French 4/4
-
-4000_47FF - German 1/4
-4800_4FFF - German 3/4
-5000_57FF - German 2/4
-5800_5FFF - German 4/4
-
-6000_67FF - English 1/2
-6800_6FFF - Bridge Challenger 1/2
-7000_77FF - English 2/2
-7800_7FFF - Bridge Challenger 2/2
-
-------------------
-RE info by hap, based on PCB photos
-
-Memory map:
------------
-0000-3FFF: 8K RAM (SRM2264)
-4000-7FFF: control (R/W)
-8000-FFFF: 32K ROM (M27256 compatible)
-
-control (W):
-------------
-CPU A0-A2 to 3*74259, CPU Dx to D (_C unused)
-
-CPU D0:
-- Q4,Q5: led commons
-- Q6,Q7,Q2,Q1: 7seg panel digit select
-- Q0-Q3: 7442 A0-A3
- + 0-7: led data
- + 0-8: keypad mux
- + 9: buzzer out
-
-CPU D1: (model 6093)
-- Q0-Q7: 7seg data
-
-CPU D2: (model 6092)
-- Q0-Q5: TSI C0-C5
-- Q6: TSI START pin
-- Q7: TSI ROM A11
-
-A11 from TSI is tied to TSI ROM A12(!)
-TSI ROM A13,A14 are hardwired to the 2 language switches.
-Sound comes from the Audio out pin, digital out pins are N/C.
-
-control (R):
-------------
-CPU A0-A2 to 2*74251, CPU Dx to output
-
-CPU D7 to Y:
-- D0-D7: keypad row data
-
-CPU D6 to W: (model 6092, tied to VCC otherwise)
-- D0,D1: language switches
-- D2-D6: VCC
-- D7: TSI BUSY
-
-------------------
-One interesting clone of The Excellence is the Computerchess Playmate-2. It was
-produced in 1989 by SPS(Bulgaria) and RRR(Riga Radio Factory). The chess program
-ROM is identical to Excellence EP12. All internal circuitry is the same, the only
-difference is the capacitor driving the 555 for IRQ is 10nf instead of 22nf.
-
-What makes it unique is the addition of a chess clock.
-
-connector pinout from main pcb:
-1) 5V
-2) GND
-3) 74HC259.pin9 (Q4) = Row LED driving
-4) 74HC259.pin10 (Q5) = Column LED driving
-5) 74HC259.pin12 (Q7) = Bat. Low signal
-6) 74HC42.pin4 (Q3) = Col-D/Row-4 -> 'White Move' if D-LED blinks
-
-The extra board has a 7474, a К1016ХЛ1 (RTC, or MCU clock driver), a 4-digit
-VFD display, and some buttons for controlling the clock. IRQ frequency is doubled
-presumedly for using the blinking led as seconds counter. It only tracks player time,
-not of the opponent. And it obviously doesn't show chessmove coordinates either.
-
-
-******************************************************************************
-
-Designer series:
-
-Designer 2000 (model 6102)
-----------------
-8KB RAM(KM6264AL-10), 32KB ROM(AMI 101.1077A01)
-Ricoh RP65C02G CPU, 3MHz XTAL
-PCB label 510.1129A01
-basically same as (Par) Excellence hardware, reskinned board
-
-Designer 2100 (model 6103): exactly same, but running at 5MHz
-
-Designer 2100 Display (model 6106)
-----------------
-8KB RAM(MS6264L-10), 2*32KB ROM(27C256)
-WDC W65C02P-6 CPU, 6MHz XTAL
-4-digit LCD panel
-PCB label 510.1130A01
-
-Designer 2000 Display (model 6105): same hardware, no bookrom, 3MHz
-
-Designer 1500 is on 80C50 hardware
-
-
-******************************************************************************
-
-Phantom (model 6100)
-----------------
-R65C02P4, XTAL marked 4.91?200
-2*32KB ROM 27C256-15, 8KB RAM MS6264L-10
-LCD driver, display panel for digits
-magnetized x/y motor under chessboard, chesspieces have magnet underneath
-piezo speaker, LEDs, 8*8 chessboard buttons
-PCB label 510.1128A01
-
-Fidelity licensed the design of the Milton/Phantom motorized chessboard and released
-their own version. It has a small LCD panel added, the rest looks nearly the same from
-the outside. After Fidelity was taken over by H&G, it was rereleased in 1990 as the
-Mephisto Phantom. This is assumed to be identical.
-
-
-******************************************************************************
-
-Chesster (model 6120)
-There is also a German version titled Kishon Chesster (model 6120G, or 6127)
-----------------
-
-8*(8+1) buttons, 8+8+1 LEDs
-8KB RAM(UM6264-12), 32KB ROM(M27C256B)
-Ricoh RP65C02G CPU, 5MHz XTAL
-8-bit DAC speech timed via IRQ, 128KB ROM(AMI custom label)
-PCB label 510.1141C01
-
-I/O is via TTL, very similar to Designer Display
-
-******************************************************************************/
-
-#include "emu.h"
-#include "includes/fidelbase.h"
-
-#include "cpu/m6502/m6502.h"
-#include "cpu/m6502/r65c02.h"
-#include "cpu/m6502/m65sc02.h"
-#include "machine/bankdev.h"
-#include "machine/6821pia.h"
-#include "machine/i8255.h"
-#include "machine/nvram.h"
-#include "sound/volt_reg.h"
-#include "speaker.h"
-
-// internal artwork
-#include "fidel_as12.lh" // clickable
-#include "fidel_chesster.lh" // clickable
-#include "fidel_csc.lh" // clickable, with preliminary boardpieces simulation
-#include "fidel_des.lh" // clickable
-#include "fidel_desdis.lh" // clickable
-#include "fidel_eag.lh" // clickable
-#include "fidel_eas.lh" // clickable
-#include "fidel_ex.lh" // clickable
-#include "fidel_exd.lh" // clickable
-#include "fidel_pc.lh" // clickable
-#include "fidel_playmatic.lh" // clickable
-#include "fidel_rsc_v2.lh" // clickable
-#include "fidel_sc9.lh" // clickable
-#include "fidel_sc12.lh" // clickable
-#include "fidel_su9.lh" // clickable
-
-
-class fidel6502_state : public fidelbase_state
-{
-public:
- fidel6502_state(const machine_config &mconfig, device_type type, const char *tag)
- : fidelbase_state(mconfig, type, tag),
- m_ppi8255(*this, "ppi8255"),
- m_rombank(*this, "rombank"),
- m_mainmap(*this, "mainmap"),
- m_div_config(*this, "div_config"),
- m_irq_on(*this, "irq_on")
- { }
-
- void csc(machine_config &config);
- void su9(machine_config &config);
- void rsc(machine_config &config);
- DECLARE_INPUT_CHANGED_MEMBER(su9_cpu_freq);
-
- void eas_base(machine_config &config);
- void eas(machine_config &config);
- void eag(machine_config &config);
- void pc(machine_config &config);
- void init_eag();
-
- void sc9b(machine_config &config);
- void sc9c(machine_config &config);
- void sc9d(machine_config &config);
- void playmatic(machine_config &config);
- DECLARE_INPUT_CHANGED_MEMBER(sc9c_cpu_freq);
-
- void sc12_map(address_map &map);
- void sc12(machine_config &config);
- void sc12b(machine_config &config);
-
- void as12(machine_config &config);
-
- void fexcel(machine_config &config);
- void fexcelb(machine_config &config);
- void fexcel4(machine_config &config);
- void fexceld(machine_config &config);
- void fexcelv(machine_config &config);
- void fexcelp(machine_config &config);
- void granits(machine_config &config);
- void fdes2100(machine_config &config);
- void fdes2000(machine_config &config);
- DECLARE_INPUT_CHANGED_MEMBER(fexcelv_bankswitch);
-
- void fdes2000d(machine_config &config);
- void fdes2100d(machine_config &config);
- void init_fdesdis();
-
- void fphantom(machine_config &config);
- void init_fphantom();
-
- void chesster(machine_config &config);
- void kishon(machine_config &config);
- void init_chesster();
-
-private:
- // devices/pointers
- optional_device<i8255_device> m_ppi8255;
- optional_memory_bank m_rombank;
- optional_device<address_map_bank_device> m_mainmap;
- optional_ioport m_div_config;
- optional_device<timer_device> m_irq_on;
-
- // common
- TIMER_DEVICE_CALLBACK_MEMBER(irq_on) { m_maincpu->set_input_line(M6502_IRQ_LINE, ASSERT_LINE); }
- TIMER_DEVICE_CALLBACK_MEMBER(irq_off) { m_maincpu->set_input_line(M6502_IRQ_LINE, CLEAR_LINE); }
- TIMER_DEVICE_CALLBACK_MEMBER(dummy) { ; } // MCFG_QUANTUM_PERFECT_CPU("maincpu") didn't work
-
- DECLARE_WRITE8_MEMBER(div_trampoline_w);
- DECLARE_READ8_MEMBER(div_trampoline_r);
- void div_set_cpu_freq(offs_t offset);
- void div_trampoline(address_map &map);
- u16 m_div_status;
-
- // CSC, SU9, RSC
- void csc_prepare_display();
- DECLARE_READ8_MEMBER(csc_speech_r);
- DECLARE_WRITE8_MEMBER(csc_pia0_pa_w);
- DECLARE_WRITE8_MEMBER(csc_pia0_pb_w);
- DECLARE_READ8_MEMBER(csc_pia0_pb_r);
- DECLARE_WRITE_LINE_MEMBER(csc_pia0_ca2_w);
- DECLARE_WRITE8_MEMBER(csc_pia1_pa_w);
- DECLARE_WRITE8_MEMBER(csc_pia1_pb_w);
- DECLARE_READ8_MEMBER(csc_pia1_pa_r);
- DECLARE_WRITE_LINE_MEMBER(csc_pia1_ca2_w);
- DECLARE_WRITE_LINE_MEMBER(csc_pia1_cb2_w);
- DECLARE_READ_LINE_MEMBER(csc_pia1_ca1_r);
- DECLARE_READ_LINE_MEMBER(csc_pia1_cb1_r);
- DECLARE_MACHINE_RESET(su9);
- void su9_set_cpu_freq();
- void csc_map(address_map &map);
- void su9_map(address_map &map);
- void rsc_map(address_map &map);
-
- // EAS, EAG, PC
- void eas_prepare_display();
- DECLARE_WRITE8_MEMBER(eas_segment_w);
- DECLARE_WRITE8_MEMBER(eas_led_w);
- DECLARE_READ8_MEMBER(eas_input_r);
- DECLARE_WRITE8_MEMBER(eas_ppi_porta_w);
- DECLARE_READ8_MEMBER(eas_ppi_portb_r);
- DECLARE_WRITE8_MEMBER(eas_ppi_portc_w);
- void eas_map(address_map &map);
- void eag_map(address_map &map);
- void pc_map(address_map &map);
-
- // SC9
- void sc9_prepare_display();
- DECLARE_WRITE8_MEMBER(sc9_control_w);
- DECLARE_WRITE8_MEMBER(sc9_led_w);
- DECLARE_READ8_MEMBER(sc9_input_r);
- DECLARE_READ8_MEMBER(sc9d_input_r);
- DECLARE_MACHINE_RESET(sc9c);
- void sc9c_set_cpu_freq();
- void sc9_map(address_map &map);
- void sc9d_map(address_map &map);
-
- // SC12
- DECLARE_WRITE8_MEMBER(sc12_control_w);
- DECLARE_READ8_MEMBER(sc12_input_r);
-
- // AS12
- void as12_prepare_display();
- DECLARE_WRITE8_MEMBER(as12_control_w);
- DECLARE_WRITE8_MEMBER(as12_led_w);
- DECLARE_READ8_MEMBER(as12_input_r);
- void as12_map(address_map &map);
-
- // Excellence
- DECLARE_READ8_MEMBER(fexcelv_speech_r);
- DECLARE_WRITE8_MEMBER(fexcel_ttl_w);
- DECLARE_READ8_MEMBER(fexcelb_ttl_r);
- DECLARE_READ8_MEMBER(fexcel_ttl_r);
- void fexcel_map(address_map &map);
- void fexcelb_map(address_map &map);
- void fexcelp_map(address_map &map);
-
- // Designer Display
- DECLARE_WRITE8_MEMBER(fdesdis_control_w);
- DECLARE_WRITE8_MEMBER(fdesdis_lcd_w);
- DECLARE_READ8_MEMBER(fdesdis_input_r);
- void fdesdis_map(address_map &map);
-
- // Phantom
- DECLARE_MACHINE_RESET(fphantom);
- void fphantom_map(address_map &map);
-
- // Chesster
- DECLARE_WRITE8_MEMBER(chesster_control_w);
- DECLARE_WRITE8_MEMBER(kishon_control_w);
- void chesster_map(address_map &map);
- void kishon_map(address_map &map);
-
-protected:
- virtual void machine_start() override;
- virtual void machine_reset() override;
-};
-
-
-// machine start/reset
-
-void fidel6502_state::machine_start()
-{
- fidelbase_state::machine_start();
-
- // register for savestates
- save_item(NAME(m_div_status));
-}
-
-void fidel6502_state::machine_reset()
-{
- fidelbase_state::machine_reset();
-
- m_div_status = ~0;
-}
-
-
-
-/***************************************************************************
-
- Helper Functions
-
-***************************************************************************/
-
-// Offset-dependent CPU divider on some machines
-
-void fidel6502_state::div_set_cpu_freq(offs_t offset)
-{
- static const u16 mask = 0x6000;
- u16 status = (offset & mask) | m_div_config->read();
-
- if (status != m_div_status && status & 2)
- {
- // when a13/a14 is high, XTAL goes through divider(s)
- // (depending on factory-set jumper, either one or two 7474)
- float div = (status & 1) ? 0.25 : 0.5;
- m_maincpu->set_clock_scale((offset & mask) ? div : 1.0);
- }
-
- m_div_status = status;
-}
-
-WRITE8_MEMBER(fidel6502_state::div_trampoline_w)
-{
- div_set_cpu_freq(offset);
- m_mainmap->write8(space, offset, data);
-}
-
-READ8_MEMBER(fidel6502_state::div_trampoline_r)
-{
- if (!machine().side_effects_disabled())
- div_set_cpu_freq(offset);
-
- return m_mainmap->read8(space, offset);
-}
-
-void fidel6502_state::div_trampoline(address_map &map)
-{
- map(0x0000, 0xffff).rw(FUNC(fidel6502_state::div_trampoline_r), FUNC(fidel6502_state::div_trampoline_w));
-}
-
-static INPUT_PORTS_START( cpu_div_2 )
- PORT_START("div_config") // hardwired, default to /2
- PORT_CONFNAME( 0x03, 0x02, "CPU Divider" )
- PORT_CONFSETTING( 0x00, "Disabled" )
- PORT_CONFSETTING( 0x02, "2" )
- PORT_CONFSETTING( 0x03, "4" )
-INPUT_PORTS_END
-
-static INPUT_PORTS_START( cpu_div_4 )
- PORT_START("div_config") // hardwired, default to /4
- PORT_CONFNAME( 0x03, 0x03, "CPU Divider" )
- PORT_CONFSETTING( 0x00, "Disabled" )
- PORT_CONFSETTING( 0x02, "2" )
- PORT_CONFSETTING( 0x03, "4" )
-INPUT_PORTS_END
-
-
-
-// Devices, I/O
-
-/******************************************************************************
- CSC, SU9, RSC
-******************************************************************************/
-
-// misc handlers
-
-void fidel6502_state::csc_prepare_display()
-{
- // 7442 0-8: led select, input mux
- m_inp_mux = 1 << m_led_select & 0x3ff;
-
- // 7442 9: speaker out
- m_dac->write(BIT(m_inp_mux, 9));
-
- // 7seg leds+H (not on all models), 8*8(+1) chessboard leds
- set_display_segmask(0xf, 0x7f);
- display_matrix(16, 9, m_led_data << 8 | m_7seg_data, m_inp_mux);
-}
-
-READ8_MEMBER(fidel6502_state::csc_speech_r)
-{
- return m_speech_rom[m_speech_bank << 12 | offset];
-}
-
-void fidel6502_state::su9_set_cpu_freq()
-{
- // SU9 CPU is clocked 1.95MHz, DS9 is 2.5MHz
- m_maincpu->set_unscaled_clock((ioport("FAKE")->read() & 1) ? (5_MHz_XTAL/2) : (3.9_MHz_XTAL/2));
-}
-
-MACHINE_RESET_MEMBER(fidel6502_state, su9)
-{
- fidel6502_state::machine_reset();
- su9_set_cpu_freq();
-}
-
-
-// 6821 PIA 0
-
-WRITE8_MEMBER(fidel6502_state::csc_pia0_pa_w)
-{
- // d0-d5: TSI C0-C5
- m_speech->data_w(space, 0, data & 0x3f);
-
- // d0-d7: data for the 4 7seg leds, bits are ABFGHCDE (H is extra led)
- m_7seg_data = bitswap<8>(data,0,1,5,6,7,2,3,4);
- csc_prepare_display();
-}
-
-WRITE8_MEMBER(fidel6502_state::csc_pia0_pb_w)
-{
- // d0: speech ROM A12
- m_speech->force_update(); // update stream to now
- m_speech_bank = data & 1;
-
- // d1: TSI START line
- m_speech->start_w(data >> 1 & 1);
-
- // d4: lower TSI volume
- m_speech->set_output_gain(0, (data & 0x10) ? 0.5 : 1.0);
-}
-
-READ8_MEMBER(fidel6502_state::csc_pia0_pb_r)
-{
- // d2: printer?
- u8 data = 0x04;
-
- // d3: TSI BUSY line
- if (m_speech->busy_r())
- data |= 0x08;
-
- // d5: button row 8 (active low)
- // d6,d7: language switches
- data |= (~read_inputs(9) >> 3 & 0x20) | (m_inp_matrix[9]->read() << 6 & 0xc0);
-
- return data;
-}
-
-WRITE_LINE_MEMBER(fidel6502_state::csc_pia0_ca2_w)
-{
- // printer?
-}
-
-
-// 6821 PIA 1
-
-READ8_MEMBER(fidel6502_state::csc_pia1_pa_r)
-{
- // d0-d5: button row 0-5 (active low)
- return (read_inputs(9) & 0x3f) ^ 0xff;
-}
-
-WRITE8_MEMBER(fidel6502_state::csc_pia1_pa_w)
-{
- // d6,d7: 7442 A0,A1
- m_led_select = (m_led_select & ~3) | (data >> 6 & 3);
- csc_prepare_display();
-}
-
-WRITE8_MEMBER(fidel6502_state::csc_pia1_pb_w)
-{
- // d0-d7: led row data
- m_led_data = data;
- csc_prepare_display();
-}
-
-READ_LINE_MEMBER(fidel6502_state::csc_pia1_ca1_r)
-{
- // button row 6 (active low)
- return ~read_inputs(9) >> 6 & 1;
-}
-
-READ_LINE_MEMBER(fidel6502_state::csc_pia1_cb1_r)
-{
- // button row 7 (active low)
- return ~read_inputs(9) >> 7 & 1;
-}
-
-WRITE_LINE_MEMBER(fidel6502_state::csc_pia1_cb2_w)
-{
- // 7442 A2
- m_led_select = (m_led_select & ~4) | (state ? 4 : 0);
- csc_prepare_display();
-}
-
-WRITE_LINE_MEMBER(fidel6502_state::csc_pia1_ca2_w)
-{
- // 7442 A3
- m_led_select = (m_led_select & ~8) | (state ? 8 : 0);
- csc_prepare_display();
-}
-
-
-
-/******************************************************************************
- EAS, EAG, PC
-******************************************************************************/
-
-// TTL/generic
-
-void fidel6502_state::eas_prepare_display()
-{
- // 4/8 7seg leds+H, 8*8(+1) chessboard leds
- set_display_segmask(0x1ef, 0x7f);
- display_matrix(16, 9, m_led_data << 8 | m_7seg_data, m_led_select);
-}
-
-WRITE8_MEMBER(fidel6502_state::eas_segment_w)
-{
- // a0-a2,d7: digit segment
- m_7seg_data = (data & 0x80) >> offset;
- m_7seg_data = bitswap<8>(m_7seg_data,7,6,4,5,0,2,1,3);
- eas_prepare_display();
-}
-
-WRITE8_MEMBER(fidel6502_state::eas_led_w)
-{
- // a0-a2,d0: led data
- m_led_data = (data & 1) << offset;
- eas_prepare_display();
-}
-
-READ8_MEMBER(fidel6502_state::eas_input_r)
-{
- // multiplexed inputs (active low)
- return read_inputs(9) ^ 0xff;
-}
-
-void fidel6502_state::init_eag()
-{
- m_rombank->configure_entries(0, 4, memregion("rombank")->base(), 0x2000);
-}
-
-
-// 8255 PPI (PC: done with TTL instead)
-
-WRITE8_MEMBER(fidel6502_state::eas_ppi_porta_w)
-{
- // d0-d5: TSI C0-C5
- // d6: TSI START line
- m_speech->data_w(space, 0, data & 0x3f);
- m_speech->start_w(data >> 6 & 1);
-
- // d7: printer? (black wire to LED pcb)
-}
-
-WRITE8_MEMBER(fidel6502_state::eas_ppi_portc_w)
-{
- // d0-d3: 7442 a0-a3
- // 7442 0-8: led select, input mux
- m_led_select = 1 << (data & 0xf) & 0x3ff;
- m_inp_mux = m_led_select & 0x1ff;
- eas_prepare_display();
-
- // 7442 9: speaker out
- m_dac->write(BIT(m_led_select, 9));
-
- // d4: speech ROM A12
- m_speech->force_update(); // update stream to now
- m_speech_bank = data >> 4 & 1;
-
- // d5: lower TSI volume
- m_speech->set_output_gain(0, (data & 0x20) ? 0.5 : 1.0);
-
- // d6,d7: bookrom bankswitch (model EAG)
- if (m_rombank != nullptr)
- m_rombank->set_entry(data >> 6 & 3);
-}
-
-READ8_MEMBER(fidel6502_state::eas_ppi_portb_r)
-{
- // d0: printer? white wire from LED pcb
- u8 data = 1;
-
- // d1: TSI BUSY line
- data |= (m_speech->busy_r()) ? 2 : 0;
-
- // d2,d3: language switches
- data |= m_inp_matrix[9]->read() << 2 & 0x0c;
-
- // d5: multiplexed inputs highest bit
- data |= (read_inputs(9) & 0x100) ? 0 : 0x20;
-
- // other: ?
- return data | 0xd0;
-}
-
-
-
-/******************************************************************************
- SC9
-******************************************************************************/
-
-// TTL/generic
-
-void fidel6502_state::sc9_prepare_display()
-{
- // 8*8 chessboard leds + 1 corner led
- display_matrix(8, 9, m_led_data, m_inp_mux);
-}
-
-WRITE8_MEMBER(fidel6502_state::sc9_control_w)
-{
- // d0-d3: 74245 P0-P3
- // 74245 Q0-Q8: input mux, led select
- u16 sel = 1 << (data & 0xf) & 0x3ff;
- m_inp_mux = sel & 0x1ff;
- sc9_prepare_display();
-
- // 74245 Q9: speaker out
- m_dac->write(BIT(sel, 9));
-
- // d4,d5: ?
- // d6,d7: N/C
-}
-
-WRITE8_MEMBER(fidel6502_state::sc9_led_w)
-{
- // a0-a2,d0: led data via NE591N
- m_led_data = (data & 1) << offset;
- sc9_prepare_display();
-}
-
-READ8_MEMBER(fidel6502_state::sc9_input_r)
-{
- // multiplexed inputs (active low)
- return read_inputs(9) ^ 0xff;
-}
-
-READ8_MEMBER(fidel6502_state::sc9d_input_r)
-{
- // a0-a2,d7: multiplexed inputs (active low)
- return (read_inputs(9) >> offset & 1) ? 0 : 0x80;
-}
-
-void fidel6502_state::sc9c_set_cpu_freq()
-{
- // SC9(C01) was released with 1.5MHz, 1.6MHz, or 1.9MHz CPU
- u8 inp = ioport("FAKE")->read();
- m_maincpu->set_unscaled_clock((inp & 2) ? 1900000 : ((inp & 1) ? 1600000 : 1500000));
-}
-
-MACHINE_RESET_MEMBER(fidel6502_state, sc9c)
-{
- fidel6502_state::machine_reset();
- sc9c_set_cpu_freq();
-}
-
-
-
-/******************************************************************************
- SC12
-******************************************************************************/
-
-// TTL/generic
-
-WRITE8_MEMBER(fidel6502_state::sc12_control_w)
-{
- // d0-d3: 7442 a0-a3
- // 7442 0-8: led data, input mux
- u16 sel = 1 << (data & 0xf) & 0x3ff;
- m_inp_mux = sel & 0x1ff;
-
- // 7442 9: speaker out
- m_dac->write(BIT(sel, 9));
-
- // d6,d7: led select (active low)
- display_matrix(9, 2, sel & 0x1ff, ~data >> 6 & 3);
-
- // d4,d5: printer
- //..
-}
-
-READ8_MEMBER(fidel6502_state::sc12_input_r)
-{
- // a0-a2,d7: multiplexed inputs (active low)
- return (read_inputs(9) >> offset & 1) ? 0 : 0x80;
-}
-
-
-
-/******************************************************************************
- AS12
-******************************************************************************/
-
-// TTL/generic
-
-void fidel6502_state::as12_prepare_display()
-{
- // 8*8(+1) chessboard leds
- display_matrix(8, 9, m_led_data, m_inp_mux);
-}
-
-WRITE8_MEMBER(fidel6502_state::as12_control_w)
-{
- // d0-d3: 74245 P0-P3
- // 74245 Q0-Q8: input mux, led select
- u16 sel = 1 << (data & 0xf) & 0x3ff;
- m_inp_mux = bitswap<9>(sel,5,8,7,6,4,3,1,0,2);
- as12_prepare_display();
-
- // 74245 Q9: speaker out
- m_dac->write(BIT(sel, 9));
-
- // d4,d5: printer?
- // d6,d7: N/C?
-}
-
-WRITE8_MEMBER(fidel6502_state::as12_led_w)
-{
- // a0-a2,d0: led data via NE591N
- m_led_data = (data & 1) << offset;
- as12_prepare_display();
-}
-
-READ8_MEMBER(fidel6502_state::as12_input_r)
-{
- // a0-a2,d7: multiplexed inputs (active low)
- u8 inp = bitswap<8>(read_inputs(9),4,3,2,1,0,5,6,7);
- return (inp >> offset & 1) ? 0 : 0x80;
-}
-
-
-
-/******************************************************************************
- Excellence
-******************************************************************************/
-
-// misc handlers
-
-INPUT_CHANGED_MEMBER(fidel6502_state::fexcelv_bankswitch)
-{
- // tied to speech ROM highest bits
- m_speech->force_update();
- m_speech_bank = (m_speech_bank & 1) | newval << 1;
-}
-
-READ8_MEMBER(fidel6502_state::fexcelv_speech_r)
-{
- // TSI A11 is A12, program controls A11, user controls A13,A14(language switches)
- offset = (offset & 0x7ff) | (offset << 1 & 0x1000);
- return m_speech_rom[offset | (m_speech_bank << 11 & 0x800) | (~m_speech_bank << 12 & 0x6000)];
-}
-
-
-// TTL
-
-WRITE8_MEMBER(fidel6502_state::fexcel_ttl_w)
-{
- // a0-a2,d0: 74259(1)
- u8 mask = 1 << offset;
- m_led_select = (m_led_select & ~mask) | ((data & 1) ? mask : 0);
-
- // 74259 Q0-Q3: 7442 a0-a3
- // 7442 0-8: led data, input mux
- u16 sel = 1 << (m_led_select & 0xf) & 0x3ff;
- u8 led_data = sel & 0xff;
- m_inp_mux = sel & 0x1ff;
-
- // 7442 9: speaker out
- m_dac->write(BIT(sel, 9));
-
- // 74259 Q4-Q7,Q2,Q1: digit/led select (active low)
- u8 led_sel = ~bitswap<8>(m_led_select,0,3,1,2,7,6,5,4) & 0x3f;
-
- // a0-a2,d1: digit segment data (model 6093)
- m_7seg_data = (m_7seg_data & ~mask) | ((data & 2) ? mask : 0);
- u8 seg_data = bitswap<8>(m_7seg_data,0,1,3,2,7,5,6,4);
-
- // update display: 4 7seg leds, 2*8 chessboard leds
- for (int i = 0; i < 6; i++)
- m_display_state[i] = (led_sel >> i & 1) ? ((i < 2) ? led_data : seg_data) : 0;
-
- set_display_size(8, 2+4);
- set_display_segmask(0x3c, 0x7f);
- display_update();
-
- // speech (model 6092)
- if (m_speech != nullptr)
- {
- // a0-a2,d2: 74259(2) to speech board
- m_speech_data = (m_speech_data & ~mask) | ((data & 4) ? mask : 0);
-
- // 74259 Q6: TSI ROM A11
- m_speech->force_update(); // update stream to now
- m_speech_bank = (m_speech_bank & ~1) | (m_speech_data >> 6 & 1);
-
- // Q0-Q5: TSI C0-C5
- // Q7: TSI START line
- m_speech->data_w(space, 0, m_speech_data & 0x3f);
- m_speech->start_w(m_speech_data >> 7 & 1);
- }
-}
-
-READ8_MEMBER(fidel6502_state::fexcelb_ttl_r)
-{
- // a0-a2,d6: from speech board: language switches and TSI BUSY line, otherwise tied to VCC
- u8 d6 = (m_inp_matrix[9].read_safe(0xff) >> offset & 1) ? 0x40 : 0;
-
- // a0-a2,d7: multiplexed inputs (active low)
- return d6 | ((read_inputs(9) >> offset & 1) ? 0 : 0x80);
-}
-
-READ8_MEMBER(fidel6502_state::fexcel_ttl_r)
-{
- u8 d7 = 0x80;
-
- // 74259(1) Q7 + 74251 I0: battery status
- if (m_inp_mux == 1 && ~m_led_select & 0x80)
- d7 = m_inp_matrix[9]->read() & 0x80;
-
- // a0-a2,d7: multiplexed inputs (active low)
- return d7 & ((read_inputs(9) >> offset & 1) ? 0 : 0x80);
-}
-
-
-
-/******************************************************************************
- Designer Display
-******************************************************************************/
-
-// TTL/generic
-
-WRITE8_MEMBER(fidel6502_state::fdesdis_control_w)
-{
- u8 q3_old = m_led_select & 8;
-
- // a0-a2,d7: 74259
- u8 mask = 1 << offset;
- m_led_select = (m_led_select & ~mask) | ((data & 0x80) ? mask : 0);
-
- // 74259 Q4-Q7: 7442 a0-a3
- // 7442 0-8: led data, input mux
- u16 sel = 1 << (m_led_select >> 4 & 0xf) & 0x3ff;
- m_inp_mux = sel & 0x1ff;
-
- // 7442 9: speaker out
- m_dac->write(BIT(sel, 9));
-
- // 74259 Q0,Q1: led select (active low)
- display_matrix(9, 2, m_inp_mux, ~m_led_select & 3, false);
-
- // 74259 Q2: book rom A14
- m_rombank->set_entry(~m_led_select >> 2 & 1);
-
- // 74259 Q3: lcd common, update on rising edge
- if (~q3_old & m_led_select & 8)
- {
- for (int i = 0; i < 4; i++)
- m_display_state[i+2] = m_7seg_data >> (8*i) & 0xff;
- }
-
- m_display_maxy += 4;
- set_display_segmask(0x3c, 0x7f);
- display_update();
-}
-
-WRITE8_MEMBER(fidel6502_state::fdesdis_lcd_w)
-{
- // a0-a2,d0-d3: 4*74259 to lcd digit segments
- u32 mask = bitswap<8>(1 << offset,3,7,6,0,1,2,4,5);
- for (int i = 0; i < 4; i++)
- {
- m_7seg_data = (m_7seg_data & ~mask) | ((data >> i & 1) ? 0 : mask);
- mask <<= 8;
- }
-}
-
-READ8_MEMBER(fidel6502_state::fdesdis_input_r)
-{
- // a0-a2,d7: multiplexed inputs (active low)
- return (read_inputs(9) >> offset & 1) ? 0 : 0x80;
-}
-
-void fidel6502_state::init_fdesdis()
-{
- m_rombank->configure_entries(0, 2, memregion("rombank")->base(), 0x4000);
-}
-
-
-
-/******************************************************************************
- Phantom
-******************************************************************************/
-
-// TTL/generic
-
-MACHINE_RESET_MEMBER(fidel6502_state, fphantom)
-{
- fidel6502_state::machine_reset();
- m_rombank->set_entry(0);
-}
-
-void fidel6502_state::init_fphantom()
-{
- m_rombank->configure_entries(0, 2, memregion("rombank")->base(), 0x4000);
-}
-
-
-
-/******************************************************************************
- Chesster
-******************************************************************************/
-
-// TTL/generic
-
-WRITE8_MEMBER(fidel6502_state::chesster_control_w)
-{
- // a0-a2,d7: 74259(1)
- u8 mask = 1 << offset;
- m_led_select = (m_led_select & ~mask) | ((data & 0x80) ? mask : 0);
-
- // 74259 Q4-Q7: 7442 a0-a3
- // 7442 0-8: led data, input mux
- u16 sel = 1 << (m_led_select >> 4 & 0xf) & 0x3ff;
- m_inp_mux = sel & 0x1ff;
-
- // 74259 Q0,Q1: led select (active low)
- display_matrix(9, 2, m_inp_mux, ~m_led_select & 3);
-
- // 74259 Q2,Q3: speechrom A14,A15
- // a0-a2,d0: 74259(2) where Q3 is speechrom A16, other outputs unconnected
- m_speech_bank = (m_speech_bank & ~mask) | ((data & 1) ? mask : 0);
- m_rombank->set_entry((m_led_select >> 2 & 3) | (m_speech_bank >> 1 & 4));
-}
-
-WRITE8_MEMBER(fidel6502_state::kishon_control_w)
-{
- chesster_control_w(space, offset, data);
-
- // 2 more bankswitch bits: 74259(2) Q2 to A17, Q0 to A18
- u8 bank = (m_led_select >> 2 & 3) | bitswap<3>(m_speech_bank, 0,2,3) << 2;
- m_rombank->set_entry(bank);
-}
-
-void fidel6502_state::init_chesster()
-{
- m_rombank->configure_entries(0, memregion("rombank")->bytes() / 0x4000, memregion("rombank")->base(), 0x4000);
-}
-
-
-
-/******************************************************************************
- Address Maps
-******************************************************************************/
-
-// CSC, SU9, RSC
-
-void fidel6502_state::csc_map(address_map &map)
-{
- map.unmap_value_high();
- map(0x0000, 0x07ff).mirror(0x4000).ram();
- map(0x0800, 0x0bff).mirror(0x4400).ram();
- map(0x1000, 0x1003).mirror(0x47fc).rw("pia0", FUNC(pia6821_device::read), FUNC(pia6821_device::write));
- map(0x1800, 0x1803).mirror(0x47fc).rw("pia1", FUNC(pia6821_device::read), FUNC(pia6821_device::write));
- map(0x2000, 0x3fff).mirror(0x4000).rom();
- map(0xa000, 0xffff).rom();
-}
-
-void fidel6502_state::su9_map(address_map &map)
-{
- map.unmap_value_high();
- map(0x0000, 0x0fff).ram();
- map(0x1000, 0x1003).rw("pia0", FUNC(pia6821_device::read), FUNC(pia6821_device::write));
- map(0x1800, 0x1803).rw("pia1", FUNC(pia6821_device::read), FUNC(pia6821_device::write));
- map(0x2000, 0x3fff).rom();
- map(0xa000, 0xa7ff).rom();
- map(0xc000, 0xffff).rom();
-}
-
-void fidel6502_state::rsc_map(address_map &map)
-{
- map.unmap_value_high();
- map(0x0000, 0x03ff).ram();
- map(0x2000, 0x2003).rw("pia", FUNC(pia6821_device::read), FUNC(pia6821_device::write));
- map(0xf000, 0xffff).rom();
-}
-
-
-// EAS, EAG, PC
-
-void fidel6502_state::eas_map(address_map &map)
-{
- map.unmap_value_high();
- map(0x0000, 0x0fff).ram().share("nvram");
- map(0x2000, 0x5fff).r(FUNC(fidel6502_state::cartridge_r));
- map(0x7000, 0x7003).rw(m_ppi8255, FUNC(i8255_device::read), FUNC(i8255_device::write));
- map(0x7020, 0x7027).w(FUNC(fidel6502_state::eas_segment_w)).nopr();
- map(0x7030, 0x7037).w(FUNC(fidel6502_state::eas_led_w)).nopr();
- map(0x7050, 0x7050).r(FUNC(fidel6502_state::eas_input_r));
- map(0x8000, 0x9fff).rom();
- map(0xc000, 0xffff).rom();
-}
-
-void fidel6502_state::eag_map(address_map &map)
-{
- map.unmap_value_high();
- map(0x0000, 0x1fff).ram().share("nvram");
- map(0x2000, 0x5fff).r(FUNC(fidel6502_state::cartridge_r));
- map(0x7000, 0x7003).rw(m_ppi8255, FUNC(i8255_device::read), FUNC(i8255_device::write));
- map(0x7020, 0x7027).w(FUNC(fidel6502_state::eas_segment_w)).nopr();
- map(0x7030, 0x7037).w(FUNC(fidel6502_state::eas_led_w)).nopr();
- map(0x7050, 0x7050).r(FUNC(fidel6502_state::eas_input_r));
- map(0x8000, 0x9fff).ram();
- map(0xa000, 0xbfff).bankr("rombank");
- map(0xc000, 0xffff).rom();
-}
-
-void fidel6502_state::pc_map(address_map &map)
-{
- map.unmap_value_high();
- map(0x0000, 0x17ff).ram();
- map(0x2000, 0x5fff).r(FUNC(fidel6502_state::cartridge_r));
- map(0x7000, 0x7000).w(FUNC(fidel6502_state::eas_ppi_porta_w));
- map(0x7010, 0x7010).r(FUNC(fidel6502_state::eas_ppi_portb_r));
- map(0x7020, 0x7027).w(FUNC(fidel6502_state::eas_segment_w)).nopr();
- map(0x7030, 0x7037).w(FUNC(fidel6502_state::eas_led_w)).nopr();
- map(0x7040, 0x7040).w(FUNC(fidel6502_state::eas_ppi_portc_w));
- map(0x7050, 0x7050).r(FUNC(fidel6502_state::eas_input_r));
- map(0x8000, 0x9fff).ram();
- map(0xb000, 0xffff).rom();
-}
-
-
-// SC9
-
-void fidel6502_state::sc9_map(address_map &map)
-{
- map.unmap_value_high();
- map(0x0000, 0x07ff).mirror(0x1800).ram();
- map(0x2000, 0x5fff).r(FUNC(fidel6502_state::cartridge_r));
- map(0x6000, 0x6000).mirror(0x1fff).w(FUNC(fidel6502_state::sc9_control_w));
- map(0x8000, 0x8007).mirror(0x1ff8).w(FUNC(fidel6502_state::sc9_led_w)).nopr();
- map(0xa000, 0xa000).mirror(0x1fff).r(FUNC(fidel6502_state::sc9_input_r));
- map(0xc000, 0xffff).rom();
-}
-
-void fidel6502_state::sc9d_map(address_map &map)
-{
- sc9_map(map);
- map(0xa000, 0xa007).mirror(0x1ff8).r(FUNC(fidel6502_state::sc9d_input_r));
-}
-
-
-// SC12, AS12
-
-void fidel6502_state::sc12_map(address_map &map)
-{
- map.unmap_value_high();
- map(0x0000, 0x0fff).ram();
- map(0x2000, 0x5fff).r(FUNC(fidel6502_state::cartridge_r));
- map(0x6000, 0x6000).mirror(0x1fff).w(FUNC(fidel6502_state::sc12_control_w));
- map(0x8000, 0x9fff).rom();
- map(0xa000, 0xa007).mirror(0x1ff8).r(FUNC(fidel6502_state::sc12_input_r));
- map(0xc000, 0xcfff).mirror(0x1000).rom();
- map(0xe000, 0xffff).rom();
-}
-
-void fidel6502_state::as12_map(address_map &map)
-{
- map.unmap_value_high();
- map(0x0000, 0x0fff).ram();
- map(0x1800, 0x1807).w(FUNC(fidel6502_state::as12_led_w)).nopr();
- map(0x2000, 0x5fff).r(FUNC(fidel6502_state::cartridge_r));
- map(0x6000, 0x6000).mirror(0x1fff).w(FUNC(fidel6502_state::as12_control_w));
- map(0x8000, 0x9fff).rom();
- map(0xa000, 0xa007).mirror(0x1ff8).r(FUNC(fidel6502_state::as12_input_r));
- map(0xc000, 0xffff).rom();
-}
-
-
-// Excellence
-
-void fidel6502_state::fexcel_map(address_map &map)
-{
- map(0x0000, 0x07ff).mirror(0x3800).ram();
- map(0x4000, 0x4007).mirror(0x3ff8).rw(FUNC(fidel6502_state::fexcel_ttl_r), FUNC(fidel6502_state::fexcel_ttl_w));
- //map(0x8000, 0x8000).nopr(); // checks for opening book module, but hw doesn't have a module slot
- map(0xc000, 0xffff).rom();
-}
-
-void fidel6502_state::fexcelp_map(address_map &map)
-{
- map(0x0000, 0x1fff).mirror(0x2000).ram();
- map(0x4000, 0x4007).mirror(0x3ff8).rw(FUNC(fidel6502_state::fexcel_ttl_r), FUNC(fidel6502_state::fexcel_ttl_w));
- map(0x8000, 0xffff).rom();
-}
-
-void fidel6502_state::fexcelb_map(address_map &map)
-{
- map(0x0000, 0x1fff).mirror(0x2000).ram();
- map(0x4000, 0x4007).mirror(0x3ff8).rw(FUNC(fidel6502_state::fexcelb_ttl_r), FUNC(fidel6502_state::fexcel_ttl_w));
- map(0x8000, 0xffff).rom();
-}
-
-
-// Designer Display, Phantom, Chesster
-
-void fidel6502_state::fdesdis_map(address_map &map)
-{
- map(0x0000, 0x1fff).ram();
- map(0x2000, 0x2007).mirror(0x1ff8).rw(FUNC(fidel6502_state::fdesdis_input_r), FUNC(fidel6502_state::fdesdis_control_w));
- map(0x4000, 0x7fff).bankr("rombank");
- map(0x6000, 0x6007).mirror(0x1ff8).w(FUNC(fidel6502_state::fdesdis_lcd_w));
- map(0x8000, 0xffff).rom();
-}
-
-void fidel6502_state::fphantom_map(address_map &map)
-{
- map(0x0000, 0x1fff).ram();
- map(0x4000, 0x7fff).bankr("rombank");
- map(0x8000, 0xffff).rom();
-}
-
-void fidel6502_state::chesster_map(address_map &map)
-{
- map(0x0000, 0x1fff).ram();
- map(0x2000, 0x2007).mirror(0x1ff8).rw(FUNC(fidel6502_state::fdesdis_input_r), FUNC(fidel6502_state::chesster_control_w));
- map(0x4000, 0x7fff).bankr("rombank");
- map(0x6000, 0x6000).mirror(0x1fff).w("dac8", FUNC(dac_byte_interface::data_w));
- map(0x8000, 0xffff).rom();
-}
-
-void fidel6502_state::kishon_map(address_map &map)
-{
- chesster_map(map);
- map(0x2000, 0x2007).mirror(0x1ff8).rw(FUNC(fidel6502_state::fdesdis_input_r), FUNC(fidel6502_state::kishon_control_w));
-}
-
-
-
-/******************************************************************************
- Input Ports
-******************************************************************************/
-
-static INPUT_PORTS_START( rsc )
- PORT_INCLUDE( fidel_cb_buttons )
-
- PORT_START("IN.8")
- PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("ST")
- PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("RV")
- PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("DM")
- PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("CL")
- PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("LV")
- PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("PV")
- PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_SPACE) PORT_NAME("Speaker")
- PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_R) PORT_NAME("RE")
-INPUT_PORTS_END
-
-
-static INPUT_PORTS_START( csc )
- PORT_INCLUDE( fidel_cb_buttons )
-
- PORT_MODIFY("IN.0")
- PORT_BIT(0x100, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_SPACE) PORT_NAME("Speaker")
-
- PORT_MODIFY("IN.1")
- PORT_BIT(0x100, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_V) PORT_NAME("RV")
-
- PORT_MODIFY("IN.2")
- PORT_BIT(0x100, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_T) PORT_NAME("TM")
-
- PORT_MODIFY("IN.3")
- PORT_BIT(0x100, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_L) PORT_NAME("LV")
-
- PORT_MODIFY("IN.4")
- PORT_BIT(0x100, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_M) PORT_NAME("DM")
-
- PORT_MODIFY("IN.5")
- PORT_BIT(0x100, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_S) PORT_NAME("ST")
-
- PORT_START("IN.8")
- PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("Pawn")
- PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("Rook")
- PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("Knight")
- PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("Bishop")
- PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("Queen")
- PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("King")
- PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_DEL) PORT_NAME("CL")
- PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_R) PORT_NAME("RE")
-
- PORT_START("IN.9") // language setting, hardwired with 2 resistors/jumpers (0: Spanish, 1: French, 2: German, 3: English)
- PORT_BIT(0x03, 0x03, IPT_CUSTOM)
-INPUT_PORTS_END
-
-static INPUT_PORTS_START( cscsp )
- PORT_INCLUDE( csc )
-
- PORT_MODIFY("IN.9") // set to Spanish
- PORT_BIT(0x03, 0x00, IPT_CUSTOM)
-INPUT_PORTS_END
-
-static INPUT_PORTS_START( cscg )
- PORT_INCLUDE( csc )
-
- PORT_MODIFY("IN.9") // set to German
- PORT_BIT(0x03, 0x02, IPT_CUSTOM)
-INPUT_PORTS_END
-
-static INPUT_PORTS_START( cscfr )
- PORT_INCLUDE( csc )
-
- PORT_MODIFY("IN.9") // set to French
- PORT_BIT(0x03, 0x01, IPT_CUSTOM)
-INPUT_PORTS_END
-
-
-static INPUT_PORTS_START( su9 )
- PORT_INCLUDE( csc )
-
- PORT_MODIFY("IN.8")
- PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("RV / Pawn")
- PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("DM / Knight")
- PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("TB / Bishop")
- PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("LV / Rook")
- PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("PV / Queen")
- PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("PB / King")
-
- PORT_START("FAKE")
- PORT_CONFNAME( 0x01, 0x00, "CPU Frequency" ) PORT_CHANGED_MEMBER(DEVICE_SELF, fidel6502_state, su9_cpu_freq, nullptr) // factory set
- PORT_CONFSETTING( 0x00, "1.95MHz (SU9)" )
- PORT_CONFSETTING( 0x01, "2.5MHz (DS9)" )
-INPUT_PORTS_END
-
-INPUT_CHANGED_MEMBER(fidel6502_state::su9_cpu_freq)
-{
- su9_set_cpu_freq();
-}
-
-static INPUT_PORTS_START( su9sp )
- PORT_INCLUDE( su9 )
-
- PORT_MODIFY("IN.9") // set to Spanish
- PORT_BIT(0x03, 0x00, IPT_CUSTOM)
-INPUT_PORTS_END
-
-static INPUT_PORTS_START( su9g )
- PORT_INCLUDE( su9 )
-
- PORT_MODIFY("IN.9") // set to German
- PORT_BIT(0x03, 0x02, IPT_CUSTOM)
-INPUT_PORTS_END
-
-static INPUT_PORTS_START( su9fr )
- PORT_INCLUDE( su9 )
-
- PORT_MODIFY("IN.9") // set to French
- PORT_BIT(0x03, 0x01, IPT_CUSTOM)
-INPUT_PORTS_END
-
-
-static INPUT_PORTS_START( eas )
- PORT_INCLUDE( fidel_cb_magnets )
- PORT_INCLUDE( cpu_div_4 )
-
- PORT_MODIFY("IN.0")
- PORT_BIT(0x100, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_M) PORT_NAME("DM")
-
- PORT_MODIFY("IN.1")
- PORT_BIT(0x100, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_DEL) PORT_NAME("CL")
-
- PORT_MODIFY("IN.2")
- PORT_BIT(0x100, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_V) PORT_NAME("RV")
-
- PORT_START("IN.8")
- PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_G) PORT_NAME("Game Control") // labeled RESET on the Prestige, but led display still says - G C -
- PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_SPACE) PORT_NAME("Speaker")
- PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("PB / King")
- PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("PV / Queen")
- PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("TM / Rook")
- PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("ST / Bishop")
- PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("TB / Knight")
- PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("LV / Pawn")
-
- PORT_START("IN.9") // language setting, hardwired (0: Spanish, 1: French, 2: German, 3: English)
- PORT_BIT(0x03, 0x03, IPT_CUSTOM)
-INPUT_PORTS_END
-
-static INPUT_PORTS_START( eassp )
- PORT_INCLUDE( eas )
-
- PORT_MODIFY("IN.9") // set to Spanish
- PORT_BIT(0x03, 0x00, IPT_CUSTOM)
-INPUT_PORTS_END
-
-static INPUT_PORTS_START( easg )
- PORT_INCLUDE( eas )
-
- PORT_MODIFY("IN.9") // set to German
- PORT_BIT(0x03, 0x02, IPT_CUSTOM)
-INPUT_PORTS_END
-
-static INPUT_PORTS_START( easfr )
- PORT_INCLUDE( eas )
-
- PORT_MODIFY("IN.9") // set to French
- PORT_BIT(0x03, 0x01, IPT_CUSTOM)
-INPUT_PORTS_END
-
-
-static INPUT_PORTS_START( eag )
- PORT_INCLUDE( fidel_cb_magnets )
- PORT_INCLUDE( cpu_div_4 )
-
- PORT_MODIFY("IN.0")
- PORT_BIT(0x100, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_DEL) PORT_NAME("CL")
-
- PORT_MODIFY("IN.1")
- PORT_BIT(0x100, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_M) PORT_NAME("DM")
-
- PORT_MODIFY("IN.2")
- PORT_BIT(0x100, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_R) PORT_CODE(KEYCODE_N) PORT_NAME("New Game")
-
- PORT_START("IN.8")
- PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_V) PORT_NAME("RV")
- PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_O) PORT_NAME("Option")
- PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("LV / Pawn")
- PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("TB / Knight")
- PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("ST / Bishop")
- PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("TM / Rook")
- PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("PV / Queen")
- PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("PB / King")
-
- PORT_START("IN.9") // language setting, hardwired (0: Spanish, 1: French, 2: German, 3: English)
- PORT_BIT(0x03, 0x03, IPT_CUSTOM)
-INPUT_PORTS_END
-
-static INPUT_PORTS_START( eagsp )
- PORT_INCLUDE( eag )
-
- PORT_MODIFY("IN.9") // set to Spanish
- PORT_BIT(0x03, 0x00, IPT_CUSTOM)
-INPUT_PORTS_END
-
-static INPUT_PORTS_START( eagg )
- PORT_INCLUDE( eag )
-
- PORT_MODIFY("IN.9") // set to German
- PORT_BIT(0x03, 0x02, IPT_CUSTOM)
-INPUT_PORTS_END
-
-static INPUT_PORTS_START( eagfr )
- PORT_INCLUDE( eag )
-
- PORT_MODIFY("IN.9") // set to French
- PORT_BIT(0x03, 0x01, IPT_CUSTOM)
-INPUT_PORTS_END
-
-
-static INPUT_PORTS_START( sc12_sidepanel )
- PORT_START("IN.8")
- PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("RV / Pawn")
- PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("DM / Knight")
- PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("TB / Bishop")
- PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("LV / Rook")
- PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("PV / Queen")
- PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("PB / King")
- PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_DEL) PORT_NAME("CL")
- PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_R) PORT_NAME("RE")
-INPUT_PORTS_END
-
-static INPUT_PORTS_START( sc12 )
- PORT_INCLUDE( fidel_cb_buttons )
- PORT_INCLUDE( sc12_sidepanel )
- PORT_INCLUDE( cpu_div_2 )
-INPUT_PORTS_END
-
-static INPUT_PORTS_START( sc12b )
- PORT_INCLUDE( fidel_cb_buttons )
- PORT_INCLUDE( sc12_sidepanel )
- PORT_INCLUDE( cpu_div_4 )
-INPUT_PORTS_END
-
-static INPUT_PORTS_START( as12 )
- PORT_INCLUDE( fidel_cb_magnets )
- PORT_INCLUDE( sc12_sidepanel )
- PORT_INCLUDE( cpu_div_4 )
-INPUT_PORTS_END
-
-static INPUT_PORTS_START( playmatic )
- PORT_INCLUDE( fidel_cb_magnets )
- PORT_INCLUDE( sc12_sidepanel )
-INPUT_PORTS_END
-
-static INPUT_PORTS_START( sc9 )
- PORT_INCLUDE( fidel_cb_buttons )
- PORT_INCLUDE( sc12_sidepanel )
-INPUT_PORTS_END
-
-static INPUT_PORTS_START( sc9c )
- PORT_INCLUDE( sc9 )
-
- PORT_START("FAKE")
- PORT_CONFNAME( 0x03, 0x00, "CPU Frequency" ) PORT_CHANGED_MEMBER(DEVICE_SELF, fidel6502_state, sc9c_cpu_freq, nullptr) // factory set
- PORT_CONFSETTING( 0x00, "1.5MHz" )
- PORT_CONFSETTING( 0x01, "1.6MHz" )
- PORT_CONFSETTING( 0x02, "1.9MHz" )
-INPUT_PORTS_END
-
-INPUT_CHANGED_MEMBER(fidel6502_state::sc9c_cpu_freq)
-{
- sc9c_set_cpu_freq();
-}
-
-
-static INPUT_PORTS_START( fexcelb )
- PORT_INCLUDE( fidel_cb_buttons )
-
- PORT_START("IN.8")
- PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_DEL) PORT_NAME("Clear")
- PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("Move / Pawn")
- PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("Hint / Knight")
- PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("Take Back / Bishop")
- PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("Level / Rook")
- PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("Options / Queen")
- PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("Verify / King")
- PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_R) PORT_CODE(KEYCODE_N) PORT_NAME("New Game")
-INPUT_PORTS_END
-
-static INPUT_PORTS_START( fexcelv )
- PORT_INCLUDE( fexcelb )
-
- PORT_START("IN.9")
- PORT_CONFNAME( 0x03, 0x00, DEF_STR( Language ) ) PORT_CHANGED_MEMBER(DEVICE_SELF, fidel6502_state, fexcelv_bankswitch, 0)
- PORT_CONFSETTING( 0x00, DEF_STR( English ) )
- PORT_CONFSETTING( 0x01, DEF_STR( German ) )
- PORT_CONFSETTING( 0x02, DEF_STR( French ) )
- PORT_CONFSETTING( 0x03, DEF_STR( Spanish ) )
- PORT_BIT(0x7c, IP_ACTIVE_HIGH, IPT_UNUSED)
- PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_CUSTOM) PORT_READ_LINE_DEVICE_MEMBER("speech", s14001a_device, busy_r)
-INPUT_PORTS_END
-
-static INPUT_PORTS_START( fexcel )
- PORT_INCLUDE( fexcelb )
-
- PORT_START("IN.9")
- PORT_CONFNAME( 0x80, 0x00, "Battery Status" )
- PORT_CONFSETTING( 0x80, "Low" )
- PORT_CONFSETTING( 0x00, DEF_STR( Normal ) )
-INPUT_PORTS_END
-
-static INPUT_PORTS_START( fdes )
- PORT_INCLUDE( fexcel )
-
- PORT_MODIFY("IN.9")
- PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_UNUSED) // no low-voltage detection circuit (still works in software though)
-INPUT_PORTS_END
-
-
-static INPUT_PORTS_START( fdesdis )
- PORT_INCLUDE( fidel_cb_buttons )
-
- PORT_START("IN.8")
- PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_DEL) PORT_NAME("Clear")
- PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_H) PORT_NAME("Move / Alternate")
- PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_G) PORT_NAME("Hint / Info")
- PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_F) PORT_NAME("Take Back / Replay")
- PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_C) PORT_NAME("Level / New")
- PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_B) PORT_NAME("Option / Time")
- PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_A) PORT_NAME("Verify / Problem")
- PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_LSHIFT) PORT_CODE(KEYCODE_RSHIFT) PORT_NAME("Shift")
-INPUT_PORTS_END
-
-static INPUT_PORTS_START( chesster )
- PORT_INCLUDE( fdesdis )
-
- PORT_MODIFY("IN.8")
- PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_H) PORT_NAME("Move / No")
- PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_G) PORT_NAME("Hint / Yes")
- PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_F) PORT_NAME("Take Back / Repeat")
- PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_B) PORT_NAME("Option / Replay")
-INPUT_PORTS_END
-
-
-static INPUT_PORTS_START( fphantom )
- PORT_INCLUDE( fidel_cb_buttons )
-INPUT_PORTS_END
-
-
-
-/******************************************************************************
- Machine Drivers
-******************************************************************************/
-
-void fidel6502_state::rsc(machine_config &config)
-{
- /* basic machine hardware */
- M6502(config, m_maincpu, 1800000); // measured approx 1.81MHz
- m_maincpu->set_addrmap(AS_PROGRAM, &fidel6502_state::rsc_map);
-
- TIMER(config, m_irq_on).configure_periodic(FUNC(fidel6502_state::irq_on), attotime::from_hz(546)); // from 555 timer, measured
- m_irq_on->set_start_delay(attotime::from_hz(546) - attotime::from_usec(38)); // active for 38us
-
- TIMER(config, "irq_off").configure_periodic(FUNC(fidel6502_state::irq_off), attotime::from_hz(546));
-
- pia6821_device &pia(PIA6821(config, "pia", 0)); // MOS 6520
- pia.readpa_handler().set(FUNC(fidel6502_state::csc_pia1_pa_r));
- pia.readca1_handler().set(FUNC(fidel6502_state::csc_pia1_ca1_r));
- pia.readcb1_handler().set(FUNC(fidel6502_state::csc_pia1_cb1_r));
- pia.writepa_handler().set(FUNC(fidel6502_state::csc_pia1_pa_w));
- pia.writepb_handler().set(FUNC(fidel6502_state::csc_pia1_pb_w));
- pia.ca2_handler().set(FUNC(fidel6502_state::csc_pia1_ca2_w));
- pia.cb2_handler().set(FUNC(fidel6502_state::csc_pia1_cb2_w));
-
- TIMER(config, "display_decay").configure_periodic(FUNC(fidelbase_state::display_decay_tick), attotime::from_msec(1));
- config.set_default_layout(layout_fidel_rsc_v2);
-
- /* sound hardware */
- SPEAKER(config, "speaker").front_center();
- DAC_1BIT(config, m_dac, 0).add_route(ALL_OUTPUTS, "speaker", 0.25);
- voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref"));
- vref.set_output(5.0);
- vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT);
-}
-
-void fidel6502_state::csc(machine_config &config)
-{
- /* basic machine hardware */
- M6502(config, m_maincpu, 3.9_MHz_XTAL/2); // from 3.9MHz resonator
- m_maincpu->set_addrmap(AS_PROGRAM, &fidel6502_state::csc_map);
-
- TIMER(config, m_irq_on).configure_periodic(FUNC(fidel6502_state::irq_on), attotime::from_hz(38.4_kHz_XTAL/64)); // through 4060 IC, 600Hz
- m_irq_on->set_start_delay(attotime::from_hz(38.4_kHz_XTAL/64) - attotime::from_hz(38.4_kHz_XTAL*2)); // edge!
- TIMER(config, "irq_off").configure_periodic(FUNC(fidel6502_state::irq_off), attotime::from_hz(38.4_kHz_XTAL/64));
-
- pia6821_device &pia0(PIA6821(config, "pia0", 0));
- pia0.readpb_handler().set(FUNC(fidel6502_state::csc_pia0_pb_r));
- pia0.writepa_handler().set(FUNC(fidel6502_state::csc_pia0_pa_w));
- pia0.writepb_handler().set(FUNC(fidel6502_state::csc_pia0_pb_w));
- pia0.ca2_handler().set(FUNC(fidel6502_state::csc_pia0_ca2_w));
-
- pia6821_device &pia1(PIA6821(config, "pia1", 0));
- pia1.readpa_handler().set(FUNC(fidel6502_state::csc_pia1_pa_r));
- pia1.readca1_handler().set(FUNC(fidel6502_state::csc_pia1_ca1_r));
- pia1.readcb1_handler().set(FUNC(fidel6502_state::csc_pia1_cb1_r));
- pia1.writepa_handler().set(FUNC(fidel6502_state::csc_pia1_pa_w));
- pia1.writepb_handler().set(FUNC(fidel6502_state::csc_pia1_pb_w));
- pia1.ca2_handler().set(FUNC(fidel6502_state::csc_pia1_ca2_w));
- pia1.cb2_handler().set(FUNC(fidel6502_state::csc_pia1_cb2_w));
-
- TIMER(config, "display_decay").configure_periodic(FUNC(fidelbase_state::display_decay_tick), attotime::from_msec(1));
- config.set_default_layout(layout_fidel_csc);
-
- /* sound hardware */
- SPEAKER(config, "speaker").front_center();
- s14001a_device &speech(S14001A(config, "speech", 25000)); // R/C circuit, around 25khz
- speech.ext_read().set(FUNC(fidel6502_state::csc_speech_r));
- speech.add_route(ALL_OUTPUTS, "speaker", 0.75);
-
- DAC_1BIT(config, m_dac, 0).add_route(ALL_OUTPUTS, "speaker", 0.25);
- voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref"));
- vref.set_output(5.0);
- vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT);
-}
-
-void fidel6502_state::su9(machine_config &config)
-{
- csc(config);
-
- m_maincpu->set_addrmap(AS_PROGRAM, &fidel6502_state::su9_map);
-
- MCFG_MACHINE_RESET_OVERRIDE(fidel6502_state, su9)
-
- config.set_default_layout(layout_fidel_su9);
-}
-
-void fidel6502_state::eas_base(machine_config &config)
-{
- /* basic machine hardware */
- R65C02(config, m_maincpu, 3_MHz_XTAL);
- m_maincpu->set_addrmap(AS_PROGRAM, &fidel6502_state::div_trampoline);
-
- TIMER(config, m_irq_on).configure_periodic(FUNC(fidel6502_state::irq_on), attotime::from_hz(38.4_kHz_XTAL/64)); // through 4060 IC, 600Hz
- m_irq_on->set_start_delay(attotime::from_hz(38.4_kHz_XTAL/64) - attotime::from_hz(38.4_kHz_XTAL*2)); // edge!
-
- TIMER(config, "irq_off").configure_periodic(FUNC(fidel6502_state::irq_off), attotime::from_hz(38.4_kHz_XTAL/64));
- TIMER(config, "dummy_timer").configure_periodic(FUNC(fidel6502_state::dummy), attotime::from_hz(3_MHz_XTAL));
-
- ADDRESS_MAP_BANK(config, m_mainmap).set_map(&fidel6502_state::eas_map).set_options(ENDIANNESS_LITTLE, 8, 16);
-
- TIMER(config, "display_decay").configure_periodic(FUNC(fidelbase_state::display_decay_tick), attotime::from_msec(1));
- config.set_default_layout(layout_fidel_eas);
-
- /* sound hardware */
- SPEAKER(config, "speaker").front_center();
- s14001a_device &speech(S14001A(config, "speech", 25000)); // R/C circuit, around 25khz
- speech.ext_read().set(FUNC(fidel6502_state::csc_speech_r));
- speech.add_route(ALL_OUTPUTS, "speaker", 0.75);
-
- DAC_1BIT(config, m_dac, 0).add_route(ALL_OUTPUTS, "speaker", 0.25);
- voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref"));
- vref.set_output(5.0);
- vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT);
-
- /* cartridge */
- generic_cartslot_device &cartslot(GENERIC_CARTSLOT(config, "cartslot", generic_plain_slot, "fidel_scc", "bin,dat"));
- cartslot.set_device_load(device_image_load_delegate(&fidelbase_state::device_image_load_scc_cartridge, this));
-
- SOFTWARE_LIST(config, "cart_list").set_original("fidel_scc");
-}
-
-void fidel6502_state::eas(machine_config &config)
-{
- eas_base(config);
-
- I8255(config, m_ppi8255); // port B: input, port A & C: output
- m_ppi8255->out_pa_callback().set(FUNC(fidel6502_state::eas_ppi_porta_w));
- m_ppi8255->tri_pa_callback().set_constant(0);
- m_ppi8255->in_pb_callback().set(FUNC(fidel6502_state::eas_ppi_portb_r));
- m_ppi8255->out_pc_callback().set(FUNC(fidel6502_state::eas_ppi_portc_w));
-
- NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
-}
-
-void fidel6502_state::pc(machine_config &config)
-{
- eas_base(config);
-
- /* basic machine hardware */
- m_maincpu->set_clock(4_MHz_XTAL); // R65C02P4
-
- TIMER(config.replace(), "dummy_timer").configure_periodic(FUNC(fidel6502_state::dummy), attotime::from_hz(4_MHz_XTAL));
-
- m_mainmap->set_addrmap(AS_PROGRAM, &fidel6502_state::pc_map);
-
- config.set_default_layout(layout_fidel_pc);
-}
-
-void fidel6502_state::eag(machine_config &config)
-{
- eas(config);
-
- /* basic machine hardware */
- m_maincpu->set_clock(5_MHz_XTAL); // R65C02P4
-
- TIMER(config.replace(), "dummy_timer").configure_periodic(FUNC(fidel6502_state::dummy), attotime::from_hz(5_MHz_XTAL));
-
- m_mainmap->set_addrmap(AS_PROGRAM, &fidel6502_state::eag_map);
-
- config.set_default_layout(layout_fidel_eag);
-}
-
-void fidel6502_state::sc9d(machine_config &config)
-{
- /* basic machine hardware */
- M6502(config, m_maincpu, 3.9_MHz_XTAL/2); // R6502AP, 3.9MHz resonator
- m_maincpu->set_addrmap(AS_PROGRAM, &fidel6502_state::sc9d_map);
- TIMER(config, m_irq_on).configure_periodic(FUNC(fidel6502_state::irq_on), attotime::from_hz(610)); // from 555 timer (22nF, 102K, 2.7K)
- m_irq_on->set_start_delay(attotime::from_hz(610) - attotime::from_usec(41)); // active for 41us
- TIMER(config, "irq_off").configure_periodic(FUNC(fidel6502_state::irq_off), attotime::from_hz(610));
-
- TIMER(config, "display_decay").configure_periodic(FUNC(fidelbase_state::display_decay_tick), attotime::from_msec(1));
- config.set_default_layout(layout_fidel_sc9);
-
- /* sound hardware */
- SPEAKER(config, "speaker").front_center();
-
- DAC_1BIT(config, m_dac, 0).add_route(ALL_OUTPUTS, "speaker", 0.25);
- voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref"));
- vref.set_output(5.0);
- vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT);
-
- /* cartridge */
- generic_cartslot_device &cartslot(GENERIC_CARTSLOT(config, "cartslot", generic_plain_slot, "fidel_scc", "bin,dat"));
- cartslot.set_device_load(device_image_load_delegate(&fidelbase_state::device_image_load_scc_cartridge, this));
-
- SOFTWARE_LIST(config, "cart_list").set_original("fidel_scc");
-}
-
-void fidel6502_state::sc9b(machine_config &config)
-{
- sc9d(config);
-
- /* basic machine hardware */
- M6502(config.replace(), m_maincpu, 1500000); // from ceramic resonator "681 JSA", measured
- m_maincpu->set_addrmap(AS_PROGRAM, &fidel6502_state::sc9_map);
-}
-
-void fidel6502_state::sc9c(machine_config &config)
-{
- sc9b(config);
-
- /* basic machine hardware */
- MCFG_MACHINE_RESET_OVERRIDE(fidel6502_state, sc9c)
-}
-
-void fidel6502_state::playmatic(machine_config &config)
-{
- sc9b(config);
-
- /* basic machine hardware */
- m_maincpu->set_clock(3100000); // approximation
-
- config.set_default_layout(layout_fidel_playmatic);
-}
-
-void fidel6502_state::sc12(machine_config &config)
-{
- /* basic machine hardware */
- R65C02(config, m_maincpu, 3_MHz_XTAL); // R65C02P3
- m_maincpu->set_addrmap(AS_PROGRAM, &fidel6502_state::div_trampoline);
- TIMER(config, m_irq_on).configure_periodic(FUNC(fidel6502_state::irq_on), attotime::from_hz(630)); // from 556 timer (22nF, 102K, 1K)
- m_irq_on->set_start_delay(attotime::from_hz(630) - attotime::from_nsec(15250)); // active for 15.25us
- TIMER(config, "irq_off").configure_periodic(FUNC(fidel6502_state::irq_off), attotime::from_hz(630));
-
- TIMER(config, "dummy_timer").configure_periodic(FUNC(fidel6502_state::dummy), attotime::from_hz(3_MHz_XTAL));
-
- ADDRESS_MAP_BANK(config, m_mainmap).set_map(&fidel6502_state::sc12_map).set_options(ENDIANNESS_LITTLE, 8, 16);
-
- TIMER(config, "display_decay").configure_periodic(FUNC(fidelbase_state::display_decay_tick), attotime::from_msec(1));
- config.set_default_layout(layout_fidel_sc12);
-
- /* sound hardware */
- SPEAKER(config, "speaker").front_center();
-
- DAC_1BIT(config, m_dac, 0).add_route(ALL_OUTPUTS, "speaker", 0.25);
- voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref"));
- vref.set_output(5.0);
- vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT);
-
- /* cartridge */
- generic_cartslot_device &cartslot(GENERIC_CARTSLOT(config, "cartslot", generic_plain_slot, "fidel_scc", "bin,dat"));
- cartslot.set_device_load(device_image_load_delegate(&fidelbase_state::device_image_load_scc_cartridge, this));
-
- SOFTWARE_LIST(config, "cart_list").set_original("fidel_scc");
-}
-
-void fidel6502_state::sc12b(machine_config &config)
-{
- sc12(config);
-
- /* basic machine hardware */
- m_maincpu->set_clock(4_MHz_XTAL); // R65C02P4
-
- // change irq timer frequency
- TIMER(config.replace(), m_irq_on).configure_periodic(FUNC(fidel6502_state::irq_on), attotime::from_hz(596)); // from 556 timer (22nF, 82K+26K, 1K)
- m_irq_on->set_start_delay(attotime::from_hz(596) - attotime::from_nsec(15250)); // active for 15.25us
- TIMER(config.replace(), "irq_off").configure_periodic(FUNC(fidel6502_state::irq_off), attotime::from_hz(596));
-
- TIMER(config.replace(), "dummy_timer").configure_periodic(FUNC(fidel6502_state::dummy), attotime::from_hz(4_MHz_XTAL));
-}
-
-void fidel6502_state::as12(machine_config &config)
-{
- sc12b(config);
-
- /* basic machine hardware */
- m_mainmap->set_addrmap(AS_PROGRAM, &fidel6502_state::as12_map);
-
- // change irq timer frequency
- TIMER(config.replace(), m_irq_on).configure_periodic(FUNC(fidel6502_state::irq_on), attotime::from_hz(585)); // from 556 timer (22nF, 110K, 1K)
- m_irq_on->set_start_delay(attotime::from_hz(585) - attotime::from_nsec(15250)); // active for 15.25us
- TIMER(config.replace(), "irq_off").configure_periodic(FUNC(fidel6502_state::irq_off), attotime::from_hz(585));
-
- config.set_default_layout(layout_fidel_as12);
-}
-
-void fidel6502_state::fexcel(machine_config &config)
-{
- /* basic machine hardware */
- M65SC02(config, m_maincpu, 12_MHz_XTAL/4); // G65SC102P-3, 12.0M ceramic resonator
- m_maincpu->set_addrmap(AS_PROGRAM, &fidel6502_state::fexcel_map);
- TIMER(config, m_irq_on).configure_periodic(FUNC(fidel6502_state::irq_on), attotime::from_hz(630)); // from 556 timer (22nF, 102K, 1K)
- m_irq_on->set_start_delay(attotime::from_hz(630) - attotime::from_nsec(15250)); // active for 15.25us
- TIMER(config, "irq_off").configure_periodic(FUNC(fidel6502_state::irq_off), attotime::from_hz(630));
-
- TIMER(config, "display_decay").configure_periodic(FUNC(fidelbase_state::display_decay_tick), attotime::from_msec(1));
- config.set_default_layout(layout_fidel_ex);
-
- /* sound hardware */
- SPEAKER(config, "speaker").front_center();
- DAC_1BIT(config, m_dac, 0).add_route(ALL_OUTPUTS, "speaker", 0.25);
- voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref"));
- vref.set_output(5.0);
- vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT);
-}
-
-void fidel6502_state::fexcel4(machine_config &config)
-{
- fexcel(config);
-
- /* basic machine hardware */
- R65C02(config.replace(), m_maincpu, 4_MHz_XTAL); // R65C02P4
- m_maincpu->set_addrmap(AS_PROGRAM, &fidel6502_state::fexcel_map);
-}
-
-void fidel6502_state::fexcelb(machine_config &config)
-{
- fexcel(config);
-
- /* basic machine hardware */
- m_maincpu->set_addrmap(AS_PROGRAM, &fidel6502_state::fexcelb_map);
-}
-
-void fidel6502_state::fexcelp(machine_config &config)
-{
- fexcel(config);
-
- /* basic machine hardware */
- R65C02(config.replace(), m_maincpu, 5_MHz_XTAL); // R65C02P4
- m_maincpu->set_addrmap(AS_PROGRAM, &fidel6502_state::fexcelp_map);
-}
-
-void fidel6502_state::granits(machine_config &config)
-{
- fexcelp(config);
-
- /* basic machine hardware */
- m_maincpu->set_clock(8_MHz_XTAL); // overclocked
-}
-
-void fidel6502_state::fdes2100(machine_config &config)
-{
- fexcel(config);
-
- /* basic machine hardware */
- M65C02(config.replace(), m_maincpu, 5_MHz_XTAL); // WDC 65C02
- m_maincpu->set_addrmap(AS_PROGRAM, &fidel6502_state::fexcelp_map);
-
- // change irq timer frequency
- TIMER(config.replace(), m_irq_on).configure_periodic(FUNC(fidel6502_state::irq_on), attotime::from_hz(585)); // from 556 timer (22nF, 110K, 1K)
- m_irq_on->set_start_delay(attotime::from_hz(585) - attotime::from_nsec(15250)); // active for 15.25us
- TIMER(config.replace(), "irq_off").configure_periodic(FUNC(fidel6502_state::irq_off), attotime::from_hz(585));
-
- config.set_default_layout(layout_fidel_des);
-}
-
-void fidel6502_state::fdes2000(machine_config &config)
-{
- fdes2100(config);
-
- /* basic machine hardware */
- R65C02(config.replace(), m_maincpu, 3_MHz_XTAL); // RP65C02G
- m_maincpu->set_addrmap(AS_PROGRAM, &fidel6502_state::fexcelp_map);
-}
-
-void fidel6502_state::fexcelv(machine_config &config)
-{
- fexcelb(config);
-
- /* sound hardware */
- S14001A(config, m_speech, 25000); // R/C circuit, around 25khz
- m_speech->ext_read().set(FUNC(fidel6502_state::fexcelv_speech_r));
- m_speech->add_route(ALL_OUTPUTS, "speaker", 0.75);
-}
-
-void fidel6502_state::fexceld(machine_config &config)
-{
- fexcelb(config);
-
- /* basic machine hardware */
- config.set_default_layout(layout_fidel_exd);
-}
-
-void fidel6502_state::fdes2100d(machine_config &config)
-{
- /* basic machine hardware */
- M65C02(config, m_maincpu, 6_MHz_XTAL); // W65C02P-6
- m_maincpu->set_addrmap(AS_PROGRAM, &fidel6502_state::fdesdis_map);
- TIMER(config, m_irq_on).configure_periodic(FUNC(fidel6502_state::irq_on), attotime::from_hz(630)); // from 556 timer (22nF, 102K, 1K)
- m_irq_on->set_start_delay(attotime::from_hz(630) - attotime::from_nsec(15250)); // active for 15.25us
- TIMER(config, "irq_off").configure_periodic(FUNC(fidel6502_state::irq_off), attotime::from_hz(630));
-
- TIMER(config, "display_decay").configure_periodic(FUNC(fidelbase_state::display_decay_tick), attotime::from_msec(1));
- config.set_default_layout(layout_fidel_desdis);
-
- /* sound hardware */
- SPEAKER(config, "speaker").front_center();
- DAC_1BIT(config, m_dac, 0).add_route(ALL_OUTPUTS, "speaker", 0.25);
- voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref"));
- vref.set_output(5.0);
- vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT);
-}
-
-void fidel6502_state::fdes2000d(machine_config &config)
-{
- fdes2100d(config);
-
- /* basic machine hardware */
- R65C02(config.replace(), m_maincpu, 3_MHz_XTAL); // R65C02P3
- m_maincpu->set_addrmap(AS_PROGRAM, &fidel6502_state::fdesdis_map);
-}
-
-void fidel6502_state::fphantom(machine_config &config)
-{
- /* basic machine hardware */
- R65C02(config, m_maincpu, 4.9152_MHz_XTAL); // R65C02P4
- m_maincpu->set_periodic_int(FUNC(fidel6502_state::irq0_line_hold), attotime::from_hz(600)); // guessed
- m_maincpu->set_addrmap(AS_PROGRAM, &fidel6502_state::fphantom_map);
-
- MCFG_MACHINE_RESET_OVERRIDE(fidel6502_state, fphantom)
-
- TIMER(config, "display_decay").configure_periodic(FUNC(fidelbase_state::display_decay_tick), attotime::from_msec(1));
- //config.set_default_layout(layout_fidel_phantom);
-
- /* sound hardware */
- SPEAKER(config, "speaker").front_center();
- DAC_1BIT(config, m_dac, 0).add_route(ALL_OUTPUTS, "speaker", 0.25);
- voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref"));
- vref.set_output(5.0);
- vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT);
-}
-
-void fidel6502_state::chesster(machine_config &config)
-{
- /* basic machine hardware */
- R65C02(config, m_maincpu, 5_MHz_XTAL); // RP65C02G
- m_maincpu->set_addrmap(AS_PROGRAM, &fidel6502_state::chesster_map);
- TIMER(config, m_irq_on).configure_periodic(FUNC(fidel6502_state::irq_on), attotime::from_hz(9615)); // R/C circuit, measured
- m_irq_on->set_start_delay(attotime::from_hz(9615) - attotime::from_nsec(2600)); // active for 2.6us
- TIMER(config, "irq_off").configure_periodic(FUNC(fidel6502_state::irq_off), attotime::from_hz(9615));
-
- TIMER(config, "display_decay").configure_periodic(FUNC(fidelbase_state::display_decay_tick), attotime::from_msec(1));
- config.set_default_layout(layout_fidel_chesster);
-
- /* sound hardware */
- SPEAKER(config, "speaker").front_center();
- DAC_8BIT_R2R(config, "dac8", 0).add_route(ALL_OUTPUTS, "speaker", 0.5); // m74hc374b1.ic1 + 8l513_02.z2
- voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref"));
- vref.set_output(5.0);
- vref.add_route(0, "dac8", 1.0, DAC_VREF_POS_INPUT);
- vref.add_route(0, "dac8", -1.0, DAC_VREF_NEG_INPUT);
-}
-
-void fidel6502_state::kishon(machine_config &config)
-{
- chesster(config);
-
- /* basic machine hardware */
- m_maincpu->set_clock(3.579545_MHz_XTAL);
- m_maincpu->set_addrmap(AS_PROGRAM, &fidel6502_state::kishon_map);
-}
-
-
-
-/******************************************************************************
- ROM Definitions
-******************************************************************************/
-
-ROM_START( reversic )
- ROM_REGION( 0x10000, "maincpu", 0 )
- ROM_LOAD("101-1000a01", 0xf000, 0x1000, CRC(ca7723a7) SHA1(bd92330f2d9494fa408f5a2ca300d7a755bdf489) )
-ROM_END
-
-
-ROM_START( csc )
- ROM_REGION( 0x10000, "maincpu", 0 )
- ROM_LOAD("101-64109", 0x2000, 0x2000, CRC(08a3577c) SHA1(69fe379d21a9d4b57c84c3832d7b3e7431eec341) )
- ROM_LOAD("1025a03", 0xa000, 0x2000, CRC(63982c07) SHA1(5ed4356323d5c80df216da55994abe94ba4aa94c) )
- ROM_LOAD("1025a02", 0xc000, 0x2000, CRC(9e6e7c69) SHA1(4f1ed9141b6596f4d2b1217d7a4ba48229f3f1b0) )
- ROM_LOAD("1025a01", 0xe000, 0x2000, CRC(57f068c3) SHA1(7d2ac4b9a2fba19556782863bdd89e2d2d94e97b) )
- ROM_LOAD("74s474", 0xfe00, 0x0200, CRC(4511ba31) SHA1(e275b1739f8c3aa445cccb6a2b597475f507e456) )
-
- ROM_REGION( 0x2000, "speech", 0 )
- ROM_LOAD("101-32107", 0x0000, 0x1000, CRC(f35784f9) SHA1(348e54a7fa1e8091f89ac656b4da22f28ca2e44d) )
- ROM_RELOAD( 0x1000, 0x1000)
-ROM_END
-
-ROM_START( cscsp )
- ROM_REGION( 0x10000, "maincpu", 0 )
- ROM_LOAD("101-64109", 0x2000, 0x2000, CRC(08a3577c) SHA1(69fe379d21a9d4b57c84c3832d7b3e7431eec341) )
- ROM_LOAD("1025a03", 0xa000, 0x2000, CRC(63982c07) SHA1(5ed4356323d5c80df216da55994abe94ba4aa94c) )
- ROM_LOAD("1025a02", 0xc000, 0x2000, CRC(9e6e7c69) SHA1(4f1ed9141b6596f4d2b1217d7a4ba48229f3f1b0) )
- ROM_LOAD("1025a01", 0xe000, 0x2000, CRC(57f068c3) SHA1(7d2ac4b9a2fba19556782863bdd89e2d2d94e97b) )
- ROM_LOAD("74s474", 0xfe00, 0x0200, CRC(4511ba31) SHA1(e275b1739f8c3aa445cccb6a2b597475f507e456) )
-
- ROM_REGION( 0x2000, "speech", 0 )
- ROM_LOAD("101-64106", 0x0000, 0x2000, BAD_DUMP CRC(8766e128) SHA1(78c7413bf240159720b131ab70bfbdf4e86eb1e9) ) // taken from vcc/fexcelv, assume correct
-ROM_END
-
-ROM_START( cscg )
- ROM_REGION( 0x10000, "maincpu", 0 )
- ROM_LOAD("101-64109", 0x2000, 0x2000, CRC(08a3577c) SHA1(69fe379d21a9d4b57c84c3832d7b3e7431eec341) )
- ROM_LOAD("1025a03", 0xa000, 0x2000, CRC(63982c07) SHA1(5ed4356323d5c80df216da55994abe94ba4aa94c) )
- ROM_LOAD("1025a02", 0xc000, 0x2000, CRC(9e6e7c69) SHA1(4f1ed9141b6596f4d2b1217d7a4ba48229f3f1b0) )
- ROM_LOAD("1025a01", 0xe000, 0x2000, CRC(57f068c3) SHA1(7d2ac4b9a2fba19556782863bdd89e2d2d94e97b) )
- ROM_LOAD("74s474", 0xfe00, 0x0200, CRC(4511ba31) SHA1(e275b1739f8c3aa445cccb6a2b597475f507e456) )
-
- ROM_REGION( 0x2000, "speech", 0 )
- ROM_LOAD("101-64101", 0x0000, 0x2000, BAD_DUMP CRC(6c85e310) SHA1(20d1d6543c1e6a1f04184a2df2a468f33faec3ff) ) // taken from fexcelv, assume correct
-ROM_END
-
-ROM_START( cscfr )
- ROM_REGION( 0x10000, "maincpu", 0 )
- ROM_LOAD("101-64109", 0x2000, 0x2000, CRC(08a3577c) SHA1(69fe379d21a9d4b57c84c3832d7b3e7431eec341) )
- ROM_LOAD("1025a03", 0xa000, 0x2000, CRC(63982c07) SHA1(5ed4356323d5c80df216da55994abe94ba4aa94c) )
- ROM_LOAD("1025a02", 0xc000, 0x2000, CRC(9e6e7c69) SHA1(4f1ed9141b6596f4d2b1217d7a4ba48229f3f1b0) )
- ROM_LOAD("1025a01", 0xe000, 0x2000, CRC(57f068c3) SHA1(7d2ac4b9a2fba19556782863bdd89e2d2d94e97b) )
- ROM_LOAD("74s474", 0xfe00, 0x0200, CRC(4511ba31) SHA1(e275b1739f8c3aa445cccb6a2b597475f507e456) )
-
- ROM_REGION( 0x2000, "speech", 0 )
- ROM_LOAD("101-64105", 0x0000, 0x2000, BAD_DUMP CRC(fe8c5c18) SHA1(2b64279ab3747ee81c86963c13e78321c6cfa3a3) ) // taken from fexcelv, assume correct
-ROM_END
-
-
-ROM_START( super9cc )
- ROM_REGION( 0x10000, "maincpu", 0 )
- ROM_LOAD("101-1050a01", 0x2000, 0x2000, CRC(421147e8) SHA1(ccf62f6f218e8992baf30973fe41b35e14a1cc1a) )
- ROM_LOAD("101-1024b03", 0xa000, 0x0800, CRC(e8c97455) SHA1(ed2958fc5474253ee8c2eaf27fc64226e12f80ea) )
- ROM_LOAD("101-1024b02", 0xc000, 0x2000, CRC(95004699) SHA1(ea79f43da73267344545df8ad61730f613876c2e) )
- ROM_LOAD("101-1024c01", 0xe000, 0x2000, CRC(03904e86) SHA1(bfa0dd9d8541e3ec359a247a3eba543501f727bc) )
-
- ROM_REGION( 0x2000, "speech", 0 )
- ROM_LOAD("101-32107", 0x0000, 0x1000, BAD_DUMP CRC(f35784f9) SHA1(348e54a7fa1e8091f89ac656b4da22f28ca2e44d) ) // taken from csc, assume correct
- ROM_RELOAD( 0x1000, 0x1000)
-ROM_END
-
-ROM_START( super9ccsp )
- ROM_REGION( 0x10000, "maincpu", 0 )
- ROM_LOAD("101-1050a01", 0x2000, 0x2000, CRC(421147e8) SHA1(ccf62f6f218e8992baf30973fe41b35e14a1cc1a) )
- ROM_LOAD("101-1024b03", 0xa000, 0x0800, CRC(e8c97455) SHA1(ed2958fc5474253ee8c2eaf27fc64226e12f80ea) )
- ROM_LOAD("101-1024b02", 0xc000, 0x2000, CRC(95004699) SHA1(ea79f43da73267344545df8ad61730f613876c2e) )
- ROM_LOAD("101-1024c01", 0xe000, 0x2000, CRC(03904e86) SHA1(bfa0dd9d8541e3ec359a247a3eba543501f727bc) )
-
- ROM_REGION( 0x2000, "speech", 0 )
- ROM_LOAD("101-64106", 0x0000, 0x2000, BAD_DUMP CRC(8766e128) SHA1(78c7413bf240159720b131ab70bfbdf4e86eb1e9) ) // taken from vcc/fexcelv, assume correct
-ROM_END
-
-ROM_START( super9ccg )
- ROM_REGION( 0x10000, "maincpu", 0 )
- ROM_LOAD("101-1050a01", 0x2000, 0x2000, CRC(421147e8) SHA1(ccf62f6f218e8992baf30973fe41b35e14a1cc1a) )
- ROM_LOAD("101-1024b03", 0xa000, 0x0800, CRC(e8c97455) SHA1(ed2958fc5474253ee8c2eaf27fc64226e12f80ea) )
- ROM_LOAD("101-1024b02", 0xc000, 0x2000, CRC(95004699) SHA1(ea79f43da73267344545df8ad61730f613876c2e) )
- ROM_LOAD("101-1024c01", 0xe000, 0x2000, CRC(03904e86) SHA1(bfa0dd9d8541e3ec359a247a3eba543501f727bc) )
-
- ROM_REGION( 0x2000, "speech", 0 )
- ROM_LOAD("101-64101", 0x0000, 0x2000, BAD_DUMP CRC(6c85e310) SHA1(20d1d6543c1e6a1f04184a2df2a468f33faec3ff) ) // taken from fexcelv, assume correct
-ROM_END
-
-ROM_START( super9ccfr )
- ROM_REGION( 0x10000, "maincpu", 0 )
- ROM_LOAD("101-1050a01", 0x2000, 0x2000, CRC(421147e8) SHA1(ccf62f6f218e8992baf30973fe41b35e14a1cc1a) )
- ROM_LOAD("101-1024b03", 0xa000, 0x0800, CRC(e8c97455) SHA1(ed2958fc5474253ee8c2eaf27fc64226e12f80ea) )
- ROM_LOAD("101-1024b02", 0xc000, 0x2000, CRC(95004699) SHA1(ea79f43da73267344545df8ad61730f613876c2e) )
- ROM_LOAD("101-1024c01", 0xe000, 0x2000, CRC(03904e86) SHA1(bfa0dd9d8541e3ec359a247a3eba543501f727bc) )
-
- ROM_REGION( 0x2000, "speech", 0 )
- ROM_LOAD("101-64105", 0x0000, 0x2000, BAD_DUMP CRC(fe8c5c18) SHA1(2b64279ab3747ee81c86963c13e78321c6cfa3a3) ) // taken from fexcelv, assume correct
-ROM_END
-
-
-ROM_START( feasbu )
- ROM_REGION( 0x10000, "mainmap", 0 )
- ROM_LOAD("eli_bu.6", 0x8000, 0x0800, CRC(93dcc23b) SHA1(2eb8c5a85e566948bc256d6b1804694e6b0ffa6f) ) // ST M27C64A, unknown label
- ROM_CONTINUE( 0x9000, 0x0800 )
- ROM_CONTINUE( 0x8800, 0x0800 )
- ROM_CONTINUE( 0x9800, 0x0800 )
- ROM_LOAD("101-1052a02.4", 0xc000, 0x2000, CRC(859d69f1) SHA1(a8b057683369e2387f22fc7e916b6f3c75d44b21) ) // Mostek MK36C63N-5
- ROM_LOAD("101-1052a01.5", 0xe000, 0x2000, CRC(571a33a7) SHA1(43b110cf0918caf16643178f401e58b2dc73894f) ) // Mostek MK36C63N-5
-
- ROM_REGION( 0x2000, "speech", 0 )
- ROM_LOAD("101-32107", 0x0000, 0x1000, CRC(f35784f9) SHA1(348e54a7fa1e8091f89ac656b4da22f28ca2e44d) ) // NEC D2332C
- ROM_RELOAD( 0x1000, 0x1000)
-ROM_END
-
-ROM_START( feasbusp )
- ROM_REGION( 0x10000, "mainmap", 0 )
- ROM_LOAD("eli_bu.6", 0x8000, 0x0800, CRC(93dcc23b) SHA1(2eb8c5a85e566948bc256d6b1804694e6b0ffa6f) )
- ROM_CONTINUE( 0x9000, 0x0800 )
- ROM_CONTINUE( 0x8800, 0x0800 )
- ROM_CONTINUE( 0x9800, 0x0800 )
- ROM_LOAD("101-1052a02.4", 0xc000, 0x2000, CRC(859d69f1) SHA1(a8b057683369e2387f22fc7e916b6f3c75d44b21) )
- ROM_LOAD("101-1052a01.5", 0xe000, 0x2000, CRC(571a33a7) SHA1(43b110cf0918caf16643178f401e58b2dc73894f) )
-
- ROM_REGION( 0x2000, "speech", 0 )
- ROM_LOAD("101-64106", 0x0000, 0x2000, BAD_DUMP CRC(8766e128) SHA1(78c7413bf240159720b131ab70bfbdf4e86eb1e9) ) // taken from vcc/fexcelv, assume correct
-ROM_END
-
-ROM_START( feasbug )
- ROM_REGION( 0x10000, "mainmap", 0 )
- ROM_LOAD("eli_bu.6", 0x8000, 0x0800, CRC(93dcc23b) SHA1(2eb8c5a85e566948bc256d6b1804694e6b0ffa6f) )
- ROM_CONTINUE( 0x9000, 0x0800 )
- ROM_CONTINUE( 0x8800, 0x0800 )
- ROM_CONTINUE( 0x9800, 0x0800 )
- ROM_LOAD("101-1052a02.4", 0xc000, 0x2000, CRC(859d69f1) SHA1(a8b057683369e2387f22fc7e916b6f3c75d44b21) )
- ROM_LOAD("101-1052a01.5", 0xe000, 0x2000, CRC(571a33a7) SHA1(43b110cf0918caf16643178f401e58b2dc73894f) )
-
- ROM_REGION( 0x2000, "speech", 0 )
- ROM_LOAD("101-64101", 0x0000, 0x2000, BAD_DUMP CRC(6c85e310) SHA1(20d1d6543c1e6a1f04184a2df2a468f33faec3ff) ) // taken from fexcelv, assume correct
-ROM_END
-
-ROM_START( feasbufr )
- ROM_REGION( 0x10000, "mainmap", 0 )
- ROM_LOAD("eli_bu.6", 0x8000, 0x0800, CRC(93dcc23b) SHA1(2eb8c5a85e566948bc256d6b1804694e6b0ffa6f) )
- ROM_CONTINUE( 0x9000, 0x0800 )
- ROM_CONTINUE( 0x8800, 0x0800 )
- ROM_CONTINUE( 0x9800, 0x0800 )
- ROM_LOAD("101-1052a02.4", 0xc000, 0x2000, CRC(859d69f1) SHA1(a8b057683369e2387f22fc7e916b6f3c75d44b21) )
- ROM_LOAD("101-1052a01.5", 0xe000, 0x2000, CRC(571a33a7) SHA1(43b110cf0918caf16643178f401e58b2dc73894f) )
-
- ROM_REGION( 0x2000, "speech", 0 )
- ROM_LOAD("101-64105", 0x0000, 0x2000, BAD_DUMP CRC(fe8c5c18) SHA1(2b64279ab3747ee81c86963c13e78321c6cfa3a3) ) // taken from fexcelv, assume correct
-ROM_END
-
-ROM_START( feasgla )
- ROM_REGION( 0x10000, "mainmap", 0 )
- ROM_LOAD("eli_gla.6", 0x8000, 0x0800, CRC(2fdddb4f) SHA1(6da0a328a45462f285ae6a0756f97c5a43148f97) )
- ROM_CONTINUE( 0x9000, 0x0800 )
- ROM_CONTINUE( 0x8800, 0x0800 )
- ROM_CONTINUE( 0x9800, 0x0800 )
- ROM_LOAD("eli_gla.4", 0xc000, 0x0800, CRC(f094e625) SHA1(fef84c6a3da504aac15988ec9af94417e5fedfbd) )
- ROM_CONTINUE( 0xd000, 0x0800 )
- ROM_CONTINUE( 0xc800, 0x0800 )
- ROM_CONTINUE( 0xd800, 0x0800 )
- ROM_LOAD("eli_gla.5", 0xe000, 0x0800, CRC(5f6845d1) SHA1(684eb16faf36a49560e5a73b55fd0022dc090e35) )
- ROM_CONTINUE( 0xf000, 0x0800 )
- ROM_CONTINUE( 0xe800, 0x0800 )
- ROM_CONTINUE( 0xf800, 0x0800 )
-
- ROM_REGION( 0x2000, "speech", 0 )
- ROM_LOAD("101-32107", 0x0000, 0x1000, CRC(f35784f9) SHA1(348e54a7fa1e8091f89ac656b4da22f28ca2e44d) ) // NEC D2332C
- ROM_RELOAD( 0x1000, 0x1000)
-ROM_END
-
-ROM_START( feasglasp )
- ROM_REGION( 0x10000, "mainmap", 0 )
- ROM_LOAD("eli_gla.6", 0x8000, 0x0800, CRC(2fdddb4f) SHA1(6da0a328a45462f285ae6a0756f97c5a43148f97) )
- ROM_CONTINUE( 0x9000, 0x0800 )
- ROM_CONTINUE( 0x8800, 0x0800 )
- ROM_CONTINUE( 0x9800, 0x0800 )
- ROM_LOAD("eli_gla.4", 0xc000, 0x0800, CRC(f094e625) SHA1(fef84c6a3da504aac15988ec9af94417e5fedfbd) )
- ROM_CONTINUE( 0xd000, 0x0800 )
- ROM_CONTINUE( 0xc800, 0x0800 )
- ROM_CONTINUE( 0xd800, 0x0800 )
- ROM_LOAD("eli_gla.5", 0xe000, 0x0800, CRC(5f6845d1) SHA1(684eb16faf36a49560e5a73b55fd0022dc090e35) )
- ROM_CONTINUE( 0xf000, 0x0800 )
- ROM_CONTINUE( 0xe800, 0x0800 )
- ROM_CONTINUE( 0xf800, 0x0800 )
-
- ROM_REGION( 0x2000, "speech", 0 )
- ROM_LOAD("101-64106", 0x0000, 0x2000, BAD_DUMP CRC(8766e128) SHA1(78c7413bf240159720b131ab70bfbdf4e86eb1e9) ) // taken from vcc/fexcelv, assume correct
-ROM_END
-
-ROM_START( feasglag )
- ROM_REGION( 0x10000, "mainmap", 0 )
- ROM_LOAD("eli_gla.6", 0x8000, 0x0800, CRC(2fdddb4f) SHA1(6da0a328a45462f285ae6a0756f97c5a43148f97) )
- ROM_CONTINUE( 0x9000, 0x0800 )
- ROM_CONTINUE( 0x8800, 0x0800 )
- ROM_CONTINUE( 0x9800, 0x0800 )
- ROM_LOAD("eli_gla.4", 0xc000, 0x0800, CRC(f094e625) SHA1(fef84c6a3da504aac15988ec9af94417e5fedfbd) )
- ROM_CONTINUE( 0xd000, 0x0800 )
- ROM_CONTINUE( 0xc800, 0x0800 )
- ROM_CONTINUE( 0xd800, 0x0800 )
- ROM_LOAD("eli_gla.5", 0xe000, 0x0800, CRC(5f6845d1) SHA1(684eb16faf36a49560e5a73b55fd0022dc090e35) )
- ROM_CONTINUE( 0xf000, 0x0800 )
- ROM_CONTINUE( 0xe800, 0x0800 )
- ROM_CONTINUE( 0xf800, 0x0800 )
-
- ROM_REGION( 0x2000, "speech", 0 )
- ROM_LOAD("101-64101", 0x0000, 0x2000, BAD_DUMP CRC(6c85e310) SHA1(20d1d6543c1e6a1f04184a2df2a468f33faec3ff) ) // taken from fexcelv, assume correct
-ROM_END
-
-ROM_START( feasglafr )
- ROM_REGION( 0x10000, "mainmap", 0 )
- ROM_LOAD("eli_gla.6", 0x8000, 0x0800, CRC(2fdddb4f) SHA1(6da0a328a45462f285ae6a0756f97c5a43148f97) )
- ROM_CONTINUE( 0x9000, 0x0800 )
- ROM_CONTINUE( 0x8800, 0x0800 )
- ROM_CONTINUE( 0x9800, 0x0800 )
- ROM_LOAD("eli_gla.4", 0xc000, 0x0800, CRC(f094e625) SHA1(fef84c6a3da504aac15988ec9af94417e5fedfbd) )
- ROM_CONTINUE( 0xd000, 0x0800 )
- ROM_CONTINUE( 0xc800, 0x0800 )
- ROM_CONTINUE( 0xd800, 0x0800 )
- ROM_LOAD("eli_gla.5", 0xe000, 0x0800, CRC(5f6845d1) SHA1(684eb16faf36a49560e5a73b55fd0022dc090e35) )
- ROM_CONTINUE( 0xf000, 0x0800 )
- ROM_CONTINUE( 0xe800, 0x0800 )
- ROM_CONTINUE( 0xf800, 0x0800 )
-
- ROM_REGION( 0x2000, "speech", 0 )
- ROM_LOAD("101-64105", 0x0000, 0x2000, BAD_DUMP CRC(fe8c5c18) SHA1(2b64279ab3747ee81c86963c13e78321c6cfa3a3) ) // taken from fexcelv, assume correct
-ROM_END
-
-
-ROM_START( fpres )
- ROM_REGION( 0x10000, "mainmap", 0 )
- ROM_LOAD("u09_yellow", 0xb000, 0x1000, CRC(03fac294) SHA1(5a9d72978318c61185efd4bc9e4a868c226465b8) )
- ROM_LOAD("u10_green", 0xc000, 0x1000, CRC(5d049d5e) SHA1(c7359bead92729e8a92d6cf1789d87ae43d23cbf) )
- ROM_LOAD("u11_black", 0xd000, 0x1000, CRC(98bd01b7) SHA1(48cc560c4ca736f54e30d757990ff403c05c39ae) )
- ROM_LOAD("u12_blue", 0xe000, 0x1000, CRC(6f18115f) SHA1(a08b3a66bfdc23f3400e03fe253a8b9a4967d14f) )
- ROM_LOAD("u13_red", 0xf000, 0x1000, CRC(dea8091d) SHA1(1d94a90ae076215c2c009e78ec4919dbd8467ef8) )
-
- ROM_REGION( 0x2000, "speech", 0 )
- ROM_LOAD("101-32107", 0x0000, 0x1000, BAD_DUMP CRC(f35784f9) SHA1(348e54a7fa1e8091f89ac656b4da22f28ca2e44d) ) // taken from csc, assume correct
- ROM_RELOAD( 0x1000, 0x1000)
-ROM_END
-
-ROM_START( fpressp )
- ROM_REGION( 0x10000, "mainmap", 0 )
- ROM_LOAD("u09_yellow", 0xb000, 0x1000, CRC(03fac294) SHA1(5a9d72978318c61185efd4bc9e4a868c226465b8) )
- ROM_LOAD("u10_green", 0xc000, 0x1000, CRC(5d049d5e) SHA1(c7359bead92729e8a92d6cf1789d87ae43d23cbf) )
- ROM_LOAD("u11_black", 0xd000, 0x1000, CRC(98bd01b7) SHA1(48cc560c4ca736f54e30d757990ff403c05c39ae) )
- ROM_LOAD("u12_blue", 0xe000, 0x1000, CRC(6f18115f) SHA1(a08b3a66bfdc23f3400e03fe253a8b9a4967d14f) )
- ROM_LOAD("u13_red", 0xf000, 0x1000, CRC(dea8091d) SHA1(1d94a90ae076215c2c009e78ec4919dbd8467ef8) )
-
- ROM_REGION( 0x2000, "speech", 0 )
- ROM_LOAD("101-64106", 0x0000, 0x2000, BAD_DUMP CRC(8766e128) SHA1(78c7413bf240159720b131ab70bfbdf4e86eb1e9) ) // taken from vcc/fexcelv, assume correct
-ROM_END
-
-ROM_START( fpresg )
- ROM_REGION( 0x10000, "mainmap", 0 )
- ROM_LOAD("u09_yellow", 0xb000, 0x1000, CRC(03fac294) SHA1(5a9d72978318c61185efd4bc9e4a868c226465b8) )
- ROM_LOAD("u10_green", 0xc000, 0x1000, CRC(5d049d5e) SHA1(c7359bead92729e8a92d6cf1789d87ae43d23cbf) )
- ROM_LOAD("u11_black", 0xd000, 0x1000, CRC(98bd01b7) SHA1(48cc560c4ca736f54e30d757990ff403c05c39ae) )
- ROM_LOAD("u12_blue", 0xe000, 0x1000, CRC(6f18115f) SHA1(a08b3a66bfdc23f3400e03fe253a8b9a4967d14f) )
- ROM_LOAD("u13_red", 0xf000, 0x1000, CRC(dea8091d) SHA1(1d94a90ae076215c2c009e78ec4919dbd8467ef8) )
-
- ROM_REGION( 0x2000, "speech", 0 )
- ROM_LOAD("101-64101", 0x0000, 0x2000, BAD_DUMP CRC(6c85e310) SHA1(20d1d6543c1e6a1f04184a2df2a468f33faec3ff) ) // taken from fexcelv, assume correct
-ROM_END
-
-ROM_START( fpresfr )
- ROM_REGION( 0x10000, "mainmap", 0 )
- ROM_LOAD("u09_yellow", 0xb000, 0x1000, CRC(03fac294) SHA1(5a9d72978318c61185efd4bc9e4a868c226465b8) )
- ROM_LOAD("u10_green", 0xc000, 0x1000, CRC(5d049d5e) SHA1(c7359bead92729e8a92d6cf1789d87ae43d23cbf) )
- ROM_LOAD("u11_black", 0xd000, 0x1000, CRC(98bd01b7) SHA1(48cc560c4ca736f54e30d757990ff403c05c39ae) )
- ROM_LOAD("u12_blue", 0xe000, 0x1000, CRC(6f18115f) SHA1(a08b3a66bfdc23f3400e03fe253a8b9a4967d14f) )
- ROM_LOAD("u13_red", 0xf000, 0x1000, CRC(dea8091d) SHA1(1d94a90ae076215c2c009e78ec4919dbd8467ef8) )
-
- ROM_REGION( 0x2000, "speech", 0 )
- ROM_LOAD("101-64105", 0x0000, 0x2000, BAD_DUMP CRC(fe8c5c18) SHA1(2b64279ab3747ee81c86963c13e78321c6cfa3a3) ) // taken from fexcelv, assume correct
-ROM_END
-
-ROM_START( fpresbu )
- ROM_REGION( 0x10000, "mainmap", 0 )
- ROM_LOAD("u09_yellow", 0xb000, 0x1000, CRC(bb1cb486) SHA1(b83f50a3ef361d254b88eefaa5aac657aaa72375) )
- ROM_LOAD("u10_green", 0xc000, 0x1000, CRC(af0aec0e) SHA1(8293d00a12efa1c142b9e37bc7786012250536d9) )
- ROM_LOAD("u11_black", 0xd000, 0x1000, CRC(214a91cc) SHA1(aab07ecdd66ac208874f4053fc4b0b0659b017aa) )
- ROM_LOAD("u12_blue", 0xe000, 0x1000, CRC(dae4d8e4) SHA1(f06dbb643f0324c0bddaaae9537d5829768bda22) )
- ROM_LOAD("u13_red", 0xf000, 0x1000, CRC(5fb67708) SHA1(1e9ee724c2be38daf39d5cf37b0ae587e408777c) )
-
- ROM_REGION( 0x2000, "speech", 0 )
- ROM_LOAD("101-32107", 0x0000, 0x1000, BAD_DUMP CRC(f35784f9) SHA1(348e54a7fa1e8091f89ac656b4da22f28ca2e44d) ) // taken from csc, assume correct
- ROM_RELOAD( 0x1000, 0x1000)
-ROM_END
-
-ROM_START( fpresbusp )
- ROM_REGION( 0x10000, "mainmap", 0 )
- ROM_LOAD("u09_yellow", 0xb000, 0x1000, CRC(bb1cb486) SHA1(b83f50a3ef361d254b88eefaa5aac657aaa72375) )
- ROM_LOAD("u10_green", 0xc000, 0x1000, CRC(af0aec0e) SHA1(8293d00a12efa1c142b9e37bc7786012250536d9) )
- ROM_LOAD("u11_black", 0xd000, 0x1000, CRC(214a91cc) SHA1(aab07ecdd66ac208874f4053fc4b0b0659b017aa) )
- ROM_LOAD("u12_blue", 0xe000, 0x1000, CRC(dae4d8e4) SHA1(f06dbb643f0324c0bddaaae9537d5829768bda22) )
- ROM_LOAD("u13_red", 0xf000, 0x1000, CRC(5fb67708) SHA1(1e9ee724c2be38daf39d5cf37b0ae587e408777c) )
-
- ROM_REGION( 0x2000, "speech", 0 )
- ROM_LOAD("101-64106", 0x0000, 0x2000, BAD_DUMP CRC(8766e128) SHA1(78c7413bf240159720b131ab70bfbdf4e86eb1e9) ) // taken from vcc/fexcelv, assume correct
-ROM_END
-
-ROM_START( fpresbug )
- ROM_REGION( 0x10000, "mainmap", 0 )
- ROM_LOAD("u09_yellow", 0xb000, 0x1000, CRC(bb1cb486) SHA1(b83f50a3ef361d254b88eefaa5aac657aaa72375) )
- ROM_LOAD("u10_green", 0xc000, 0x1000, CRC(af0aec0e) SHA1(8293d00a12efa1c142b9e37bc7786012250536d9) )
- ROM_LOAD("u11_black", 0xd000, 0x1000, CRC(214a91cc) SHA1(aab07ecdd66ac208874f4053fc4b0b0659b017aa) )
- ROM_LOAD("u12_blue", 0xe000, 0x1000, CRC(dae4d8e4) SHA1(f06dbb643f0324c0bddaaae9537d5829768bda22) )
- ROM_LOAD("u13_red", 0xf000, 0x1000, CRC(5fb67708) SHA1(1e9ee724c2be38daf39d5cf37b0ae587e408777c) )
-
- ROM_REGION( 0x2000, "speech", 0 )
- ROM_LOAD("101-64101", 0x0000, 0x2000, BAD_DUMP CRC(6c85e310) SHA1(20d1d6543c1e6a1f04184a2df2a468f33faec3ff) ) // taken from fexcelv, assume correct
-ROM_END
-
-ROM_START( fpresbufr )
- ROM_REGION( 0x10000, "mainmap", 0 )
- ROM_LOAD("u09_yellow", 0xb000, 0x1000, CRC(bb1cb486) SHA1(b83f50a3ef361d254b88eefaa5aac657aaa72375) )
- ROM_LOAD("u10_green", 0xc000, 0x1000, CRC(af0aec0e) SHA1(8293d00a12efa1c142b9e37bc7786012250536d9) )
- ROM_LOAD("u11_black", 0xd000, 0x1000, CRC(214a91cc) SHA1(aab07ecdd66ac208874f4053fc4b0b0659b017aa) )
- ROM_LOAD("u12_blue", 0xe000, 0x1000, CRC(dae4d8e4) SHA1(f06dbb643f0324c0bddaaae9537d5829768bda22) )
- ROM_LOAD("u13_red", 0xf000, 0x1000, CRC(5fb67708) SHA1(1e9ee724c2be38daf39d5cf37b0ae587e408777c) )
-
- ROM_REGION( 0x2000, "speech", 0 )
- ROM_LOAD("101-64105", 0x0000, 0x2000, BAD_DUMP CRC(fe8c5c18) SHA1(2b64279ab3747ee81c86963c13e78321c6cfa3a3) ) // taken from fexcelv, assume correct
-ROM_END
-
-
-ROM_START( feag2100 )
- ROM_REGION( 0x10000, "mainmap", 0 )
- ROM_LOAD("el2100.2", 0xc000, 0x2000, CRC(76fec42f) SHA1(34660edb8458919fd179e93fdab3fe428a6625d0) )
- ROM_LOAD("el2100.3", 0xe000, 0x2000, CRC(2079a506) SHA1(a7bb83138c7b6eff6ea96702d453a214697f4890) )
-
- ROM_REGION( 0x8000, "rombank", 0 )
- ROM_LOAD("el2100.1", 0x0000, 0x8000, CRC(9b62b7d5) SHA1(cfcaea2e36c2d52fe4a85c77dbc7fa135893860c) )
-
- ROM_REGION( 0x2000, "speech", 0 )
- ROM_LOAD("101-32107", 0x0000, 0x1000, BAD_DUMP CRC(f35784f9) SHA1(348e54a7fa1e8091f89ac656b4da22f28ca2e44d) ) // taken from csc, assume correct
- ROM_RELOAD( 0x1000, 0x1000)
-ROM_END
-
-ROM_START( feag2100sp )
- ROM_REGION( 0x10000, "mainmap", 0 )
- ROM_LOAD("el2100.2", 0xc000, 0x2000, CRC(76fec42f) SHA1(34660edb8458919fd179e93fdab3fe428a6625d0) )
- ROM_LOAD("el2100.3", 0xe000, 0x2000, CRC(2079a506) SHA1(a7bb83138c7b6eff6ea96702d453a214697f4890) )
-
- ROM_REGION( 0x8000, "rombank", 0 )
- ROM_LOAD("el2100.1", 0x0000, 0x8000, CRC(9b62b7d5) SHA1(cfcaea2e36c2d52fe4a85c77dbc7fa135893860c) )
-
- ROM_REGION( 0x2000, "speech", 0 )
- ROM_LOAD("101-64106", 0x0000, 0x2000, BAD_DUMP CRC(8766e128) SHA1(78c7413bf240159720b131ab70bfbdf4e86eb1e9) ) // taken from vcc/fexcelv, assume correct
-ROM_END
-
-ROM_START( feag2100g )
- ROM_REGION( 0x10000, "mainmap", 0 )
- ROM_LOAD("el2100.2", 0xc000, 0x2000, CRC(76fec42f) SHA1(34660edb8458919fd179e93fdab3fe428a6625d0) )
- ROM_LOAD("el2100.3", 0xe000, 0x2000, CRC(2079a506) SHA1(a7bb83138c7b6eff6ea96702d453a214697f4890) )
-
- ROM_REGION( 0x8000, "rombank", 0 )
- ROM_LOAD("el2100.1", 0x0000, 0x8000, CRC(9b62b7d5) SHA1(cfcaea2e36c2d52fe4a85c77dbc7fa135893860c) )
-
- ROM_REGION( 0x2000, "speech", 0 )
- ROM_LOAD("101-64101", 0x0000, 0x2000, BAD_DUMP CRC(6c85e310) SHA1(20d1d6543c1e6a1f04184a2df2a468f33faec3ff) ) // taken from fexcelv, assume correct
-ROM_END
-
-ROM_START( feag2100fr )
- ROM_REGION( 0x10000, "mainmap", 0 )
- ROM_LOAD("el2100.2", 0xc000, 0x2000, CRC(76fec42f) SHA1(34660edb8458919fd179e93fdab3fe428a6625d0) )
- ROM_LOAD("el2100.3", 0xe000, 0x2000, CRC(2079a506) SHA1(a7bb83138c7b6eff6ea96702d453a214697f4890) )
-
- ROM_REGION( 0x8000, "rombank", 0 )
- ROM_LOAD("el2100.1", 0x0000, 0x8000, CRC(9b62b7d5) SHA1(cfcaea2e36c2d52fe4a85c77dbc7fa135893860c) )
-
- ROM_REGION( 0x2000, "speech", 0 )
- ROM_LOAD("101-64105", 0x0000, 0x2000, BAD_DUMP CRC(fe8c5c18) SHA1(2b64279ab3747ee81c86963c13e78321c6cfa3a3) ) // taken from fexcelv, assume correct
-ROM_END
-
-
-ROM_START( fscc9 ) // PCB label 510-1046D01
- ROM_REGION( 0x10000, "maincpu", 0 )
- ROM_LOAD("101-1034b01", 0xc000, 0x2000, CRC(65288753) SHA1(651f5ca5969ddd72a20cbebdec2de83c4bf10650) )
- ROM_LOAD("101-1034c02", 0xe000, 0x2000, CRC(238b092f) SHA1(7ddffc6dba822aee9d8ad6815b23024ed5cdfd26) )
-ROM_END
-
-ROM_START( fscc9b ) // PCB label 510-1046B01
- ROM_REGION( 0x10000, "maincpu", 0 )
- ROM_LOAD("101-1034a01", 0xc000, 0x2000, CRC(b845c458) SHA1(d3fda65dbd9fae44fa4b93f8207839d8fa0c367a) )
- ROM_LOAD("101-1034a02", 0xe000, 0x2000, CRC(ecfa0a4c) SHA1(738df99a250fad0b1da5ebeb8c92a9ad1461417b) )
-ROM_END
-
-ROM_START( fscc9c ) // PCB label 510-1046C01
- ROM_REGION( 0x10000, "maincpu", 0 )
- ROM_LOAD("101-1034a01", 0xc000, 0x2000, CRC(b845c458) SHA1(d3fda65dbd9fae44fa4b93f8207839d8fa0c367a) ) // HN48364P
- ROM_LOAD("101-1034b02", 0xe000, 0x2000, CRC(cbaf97d7) SHA1(7ed8e68bb74713d9e2ff1d9c037012320b7bfcbf) ) // "
-ROM_END
-
-ROM_START( fscc9ps )
- ROM_REGION( 0x10000, "maincpu", 0 )
- ROM_LOAD("play64c1.bin", 0xc000, 0x2000, CRC(e96aa95d) SHA1(16d90cf0ef166aef579d442671290a2c43e24dfe) )
- ROM_LOAD("play64en.bin", 0xe000, 0x2000, CRC(6fa188d2) SHA1(1b9b0209c496c89ecb7f9ec07bfd9429ff9b275e) )
-ROM_END
-
-
-ROM_START( fscc12 ) // model SC12, PCB label 510-1084B01
- ROM_REGION( 0x10000, "mainmap", 0 )
- ROM_LOAD("101-1068a01.ic15", 0x8000, 0x2000, CRC(63c76cdd) SHA1(e0771c98d4483a6b1620791cb99a7e46b0db95c4) ) // SSS SCM23C65E4
- ROM_LOAD("orange.ic13", 0xc000, 0x1000, CRC(ed5289b2) SHA1(9b0c7f9ae4102d4a66eb8c91d4e84b9eec2ffb3d) ) // TI TMS2732AJL-45, no label, orange sticker
- ROM_LOAD("red.ic14", 0xe000, 0x2000, CRC(0c4968c4) SHA1(965a66870b0f8ce9549418cbda09d2ff262a1504) ) // TI TMS2764JL-25, no label, red sticker
-ROM_END
-
-ROM_START( fscc12b ) // model 6086, PCB label 510-1084B01
- ROM_REGION( 0x10000, "mainmap", 0 )
- ROM_LOAD("101-1068a01.ic15", 0x8000, 0x2000, CRC(63c76cdd) SHA1(e0771c98d4483a6b1620791cb99a7e46b0db95c4) ) // SSS SCM23C65E4
- ROM_LOAD("orange.ic13", 0xc000, 0x1000, CRC(45070a71) SHA1(8aeecff828f26fb7081902c757559903be272649) ) // TI TMS2732AJL-45, no label, orange sticker
- ROM_LOAD("red.ic14", 0xe000, 0x2000, CRC(183d3edc) SHA1(3296a4c3bce5209587d4a1694fce153558544e63) ) // Toshiba TMM2764D-2, no label, red sticker
-ROM_END
-
-
-ROM_START( feleg ) // model AS12(or 6085), PCB label 510-1084B01
- ROM_REGION( 0x10000, "mainmap", 0 )
- ROM_LOAD("feleg.1", 0x8000, 0x2000, CRC(e9df31e8) SHA1(31c52bb8f75580c82093eb950959c1bc294189a8) ) // TMM2764, no label
- ROM_LOAD("feleg.2", 0xc000, 0x2000, CRC(bed9c84b) SHA1(c12f39765b054d2ad81f747e698715ad4246806d) ) // "
- ROM_LOAD("feleg.3", 0xe000, 0x2000, CRC(b1fb49aa) SHA1(d8c9687dd564f0fa603e6d684effb1d113ac64b4) ) // "
-ROM_END
-
-
-ROM_START( fexcel ) // model 6080(B), PCB label 510.1117A02
- ROM_REGION( 0x10000, "maincpu", 0 )
- ROM_LOAD("101-1080a01.ic5", 0x8000, 0x8000, CRC(846f8e40) SHA1(4e1d5b08d5ff3422192b54fa82cb3f505a69a971) )
-ROM_END
-
-ROM_START( fexceld ) // model 6093, PCB label 510.1117A02
- ROM_REGION( 0x10000, "maincpu", 0 )
- ROM_LOAD("101-1080a01.ic5", 0x8000, 0x8000, CRC(846f8e40) SHA1(4e1d5b08d5ff3422192b54fa82cb3f505a69a971) ) // same rom as fexcel
-ROM_END
-
-ROM_START( fexcelv ) // model 6092, PCB label 510.1117A02, sound PCB 510.1117A01
- ROM_REGION( 0x10000, "maincpu", 0 )
- ROM_LOAD("101-1080a01.ic5", 0x8000, 0x8000, CRC(846f8e40) SHA1(4e1d5b08d5ff3422192b54fa82cb3f505a69a971) ) // PCB1, M27256, same rom as fexcel
-
- ROM_REGION( 0x8000, "speech", 0 )
- ROM_LOAD("101-1081a01.ic2", 0x0000, 0x8000, CRC(c8ae1607) SHA1(6491ce6be60ed77f3dd931c0ca17616f13af943e) ) // PCB2, M27256
-ROM_END
-
-ROM_START( fexcel12 ) // model EP12, PCB label 510-1099A01
- ROM_REGION( 0x10000, "maincpu", 0 )
- ROM_LOAD("101-1072a01.ic5", 0xc000, 0x4000, CRC(212b006d) SHA1(242ff851b0841cbec66bbada6a730da021010e2c) )
-ROM_END
-
-ROM_START( fexcel124 ) // model EP12, PCB label 510-1099A01
- ROM_REGION( 0x10000, "maincpu", 0 )
- ROM_LOAD("101-1073a01.ic5", 0xc000, 0x4000, CRC(3e221534) SHA1(7516bc6a8aab9d8ac30ac1a9317630a6aa9ac1a0) )
-ROM_END
-
-ROM_START( fexcela ) // model 6080, PCB label 510-1099A01(manuf.1985) or 510-1099B01(manuf.1986)
- ROM_REGION( 0x10000, "maincpu", 0 )
- ROM_LOAD("101-1072b01.ic5", 0xc000, 0x4000, CRC(fd2f6064) SHA1(f84bb98bdb9565a04891eb6820597d7aecc90c21) ) // RCA
-ROM_END
-
-
-ROM_START( fexcelp ) // model 6083, PCB label 510-1099A01
- ROM_REGION( 0x10000, "maincpu", 0 )
- ROM_LOAD("101-1077a01.ic5", 0x8000, 0x8000, CRC(62006320) SHA1(1d6370973dbae42c54639b261cc81e32cdfc1d5d) )
-ROM_END
-
-ROM_START( fexcelpb ) // model 6083, PCB label 510-1099B01
- ROM_REGION( 0x10000, "maincpu", 0 )
- ROM_LOAD("par_ex.ic5", 0x8000, 0x8000, CRC(0d17b0f0) SHA1(3a6070fd4718c62b62ff0f08637bb6eb84eb9a1c) ) // GI 27C256, no label, only 1 byte difference, assume bugfix in bookrom
-ROM_END
-
-ROM_START( granits ) // modified SC12 board, overclocked Par Excellence program
- ROM_REGION( 0x10000, "maincpu", 0 )
- ROM_LOAD("granit_s-4", 0x8000, 0x8000, CRC(274d6aff) SHA1(c8d943b2f15422ac62f539b568f5509cbce568a3) )
-ROM_END
-
-ROM_START( fdes2000 ) // model 6102, PCB label 510.1129A01
- ROM_REGION( 0x10000, "maincpu", 0 )
- ROM_LOAD("101-1077a01.ic5", 0x8000, 0x8000, CRC(62006320) SHA1(1d6370973dbae42c54639b261cc81e32cdfc1d5d) ) // AMI, same label as fexcelp
-ROM_END
-
-ROM_START( fdes2100 ) // model 6103, PCB label 510.1129A01
- ROM_REGION( 0x10000, "maincpu", 0 )
- ROM_LOAD("101-1077a01.ic5", 0x8000, 0x8000, CRC(62006320) SHA1(1d6370973dbae42c54639b261cc81e32cdfc1d5d) ) // same as fdes2000
-ROM_END
-
-
-ROM_START( fdes2100d ) // model 6106, PCB label 510.1130A01. The 'rev B' dump came from a post-release bugfix by Fidelity
- ROM_REGION( 0x10000, "maincpu", 0 )
- ROM_LOAD("i9_orange.ic9", 0x8000, 0x8000, CRC(83fec02a) SHA1(6f43ab05bc605061989b05d0592dbd184efff9d4) ) // WSI 27C256L-12
-
- ROM_REGION( 0x8000, "rombank", 0 )
- ROM_LOAD("bk3_white.ic10", 0x0000, 0x8000, CRC(3857cc35) SHA1(f073dafb9fd885c7ddb7fbff10e3653f343ef1c6) ) // WSI 27C256L-12
-ROM_END
-
-ROM_START( fdes2000d ) // model 6105, PCB label 510.1130A01
- ROM_REGION( 0x10000, "maincpu", 0 )
- ROM_LOAD("27c256.ic9", 0x8000, 0x8000, CRC(b136d1a1) SHA1(8438790a62f45284ff33a0255c5c89f526726d3e) ) // 27C256, no label
-
- ROM_REGION( 0x8000, "rombank", ROMREGION_ERASEFF ) // no rom in ic10
-ROM_END
-
-
-ROM_START( fphantom ) // model 6100, PCB label 510.1128A01
- ROM_REGION( 0x10000, "maincpu", 0 )
- ROM_LOAD("u_3c_yellow.u3", 0x8000, 0x8000, CRC(fb7c38ae) SHA1(a1aa7637705052cb4eec92644dc79aee7ba4d77c) ) // 27C256
-
- ROM_REGION( 0x8000, "rombank", 0 )
- ROM_LOAD("u_4_white.u4", 0x0000, 0x8000, CRC(e4181ba2) SHA1(1f77d1867c6f566be98645fc252a01108f412c96) ) // 27C256
-ROM_END
-
-
-ROM_START( chesster ) // model 6120, PCB label 510.1141C01
- ROM_REGION( 0x10000, "maincpu", 0 )
- ROM_LOAD("ch_1.3.ic9", 0x8000, 0x8000, CRC(8b42d1ad) SHA1(2161fc5ab2476fe7ca4ffc226e3cb329b8a57a01) ) // 27256, CH 1.3 on sticker
-
- ROM_REGION( 0x20000, "rombank", 0 )
- ROM_LOAD("101-1091b02.ic10", 0x0000, 0x20000, CRC(fa370e88) SHA1(a937c8f1ec295cf9539d12466993974e40771493) ) // AMI, 27C010 or equivalent
-ROM_END
-
-ROM_START( chesstera ) // model 6120, PCB label 510.1141C01
- ROM_REGION( 0x10000, "maincpu", 0 )
- ROM_LOAD("chesster.ic9", 0x8000, 0x8000, CRC(29f9a698) SHA1(4c83ca46fd5fc9c40302e9c7f16b4ae2c18b06e6) ) // M27C256B, sticker but no label
-
- ROM_REGION( 0x20000, "rombank", 0 )
- ROM_LOAD("101-1091a02.ic10", 0x0000, 0x20000, CRC(2b4d243c) SHA1(921e51978facb502b207b4f64a73b1e74127e826) ) // AMI, 27C010 or equivalent
-ROM_END
-
-ROM_START( kishon ) // model 6120G or 6127(same), PCB label 510.1141C01
- ROM_REGION( 0x10000, "maincpu", 0 )
- ROM_LOAD("kishon.ic9", 0x8000, 0x8000, CRC(121c007f) SHA1(652e9ea47b6bb1632d10eb0fcd7f98cdba22fce7) ) // 27C256
-
- ROM_REGION( 0x80000, "rombank", 0 )
- ROM_LOAD("kishon_v2.6_1-14-91.ic10", 0x0000, 0x80000, CRC(50598869) SHA1(2087e0c2f40a2408fe217a6502c8c3a247bdd063) ) // Toshiba TC544000P-12, aka 101-1094A01
-ROM_END
-
-
-
-/******************************************************************************
- Drivers
-******************************************************************************/
-
-// YEAR NAME PARENT CMP MACHINE INPUT STATE INIT COMPANY FULLNAME FLAGS
-CONS( 1981, reversic, 0, 0, rsc, rsc, fidel6502_state, empty_init, "Fidelity Electronics", "Reversi Sensory Challenger (green version)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
-
-CONS( 1981, csc, 0, 0, csc, csc, fidel6502_state, empty_init, "Fidelity Electronics", "Champion Sensory Chess Challenger (English)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
-CONS( 1981, cscsp, csc, 0, csc, cscsp, fidel6502_state, empty_init, "Fidelity Electronics", "Champion Sensory Chess Challenger (Spanish)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
-CONS( 1981, cscg, csc, 0, csc, cscg, fidel6502_state, empty_init, "Fidelity Electronics", "Champion Sensory Chess Challenger (German)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
-CONS( 1981, cscfr, csc, 0, csc, cscfr, fidel6502_state, empty_init, "Fidelity Electronics", "Champion Sensory Chess Challenger (French)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
-
-CONS( 1983, super9cc, 0, 0, su9, su9, fidel6502_state, empty_init, "Fidelity Electronics", "Super 9 Sensory Chess Challenger (English)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
-CONS( 1983, super9ccsp, super9cc, 0, su9, su9sp, fidel6502_state, empty_init, "Fidelity Electronics", "Super 9 Sensory Chess Challenger (Spanish)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
-CONS( 1983, super9ccg, super9cc, 0, su9, su9g, fidel6502_state, empty_init, "Fidelity Electronics", "Super 9 Sensory Chess Challenger (German)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
-CONS( 1983, super9ccfr, super9cc, 0, su9, su9fr, fidel6502_state, empty_init, "Fidelity Electronics", "Super 9 Sensory Chess Challenger (French)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
-
-CONS( 1983, feasbu, 0, 0, eas, eas, fidel6502_state, empty_init, "Fidelity Electronics", "Elite A/S Challenger (Budapest program, English)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
-CONS( 1983, feasbusp, feasbu, 0, eas, eassp, fidel6502_state, empty_init, "Fidelity Electronics", "Elite A/S Challenger (Budapest program, Spanish)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
-CONS( 1983, feasbug, feasbu, 0, eas, easg, fidel6502_state, empty_init, "Fidelity Electronics", "Elite A/S Challenger (Budapest program, German)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
-CONS( 1983, feasbufr, feasbu, 0, eas, easfr, fidel6502_state, empty_init, "Fidelity Electronics", "Elite A/S Challenger (Budapest program, French)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
-CONS( 1984, feasgla, feasbu, 0, eas, eas, fidel6502_state, empty_init, "Fidelity Electronics", "Elite A/S Challenger (Glasgow program, English)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
-CONS( 1984, feasglasp, feasbu, 0, eas, eassp, fidel6502_state, empty_init, "Fidelity Electronics", "Elite A/S Challenger (Glasgow program, Spanish)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
-CONS( 1984, feasglag, feasbu, 0, eas, easg, fidel6502_state, empty_init, "Fidelity Electronics", "Elite A/S Challenger (Glasgow program, German)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
-CONS( 1984, feasglafr, feasbu, 0, eas, easfr, fidel6502_state, empty_init, "Fidelity Electronics", "Elite A/S Challenger (Glasgow program, French)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
-
-CONS( 1982, fpres, 0, 0, pc, eas, fidel6502_state, empty_init, "Fidelity Electronics", "Prestige Challenger (original program, English)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
-CONS( 1982, fpressp, fpres, 0, pc, eassp, fidel6502_state, empty_init, "Fidelity Electronics", "Prestige Challenger (original program, Spanish)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
-CONS( 1982, fpresg, fpres, 0, pc, easg, fidel6502_state, empty_init, "Fidelity Electronics", "Prestige Challenger (original program, German)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
-CONS( 1982, fpresfr, fpres, 0, pc, easfr, fidel6502_state, empty_init, "Fidelity Electronics", "Prestige Challenger (original program, French)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
-CONS( 1983, fpresbu, fpres, 0, pc, eas, fidel6502_state, empty_init, "Fidelity Electronics", "Prestige Challenger (Budapest program, English)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
-CONS( 1983, fpresbusp, fpres, 0, pc, eassp, fidel6502_state, empty_init, "Fidelity Electronics", "Prestige Challenger (Budapest program, Spanish)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
-CONS( 1983, fpresbug, fpres, 0, pc, easg, fidel6502_state, empty_init, "Fidelity Electronics", "Prestige Challenger (Budapest program, German)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
-CONS( 1983, fpresbufr, fpres, 0, pc, easfr, fidel6502_state, empty_init, "Fidelity Electronics", "Prestige Challenger (Budapest program, French)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
-
-CONS( 1986, feag2100, 0, 0, eag, eag, fidel6502_state, init_eag, "Fidelity Electronics", "Elite Avant Garde 2100 (English)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
-CONS( 1986, feag2100sp, feag2100, 0, eag, eagsp, fidel6502_state, init_eag, "Fidelity Electronics", "Elite Avant Garde 2100 (Spanish)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
-CONS( 1986, feag2100g, feag2100, 0, eag, eagg, fidel6502_state, init_eag, "Fidelity Electronics", "Elite Avant Garde 2100 (German)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
-CONS( 1986, feag2100fr, feag2100, 0, eag, eagfr, fidel6502_state, init_eag, "Fidelity Electronics", "Elite Avant Garde 2100 (French)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
-
-CONS( 1982, fscc9, 0, 0, sc9d, sc9, fidel6502_state, empty_init, "Fidelity Electronics", "Sensory Chess Challenger 9 (rev. D)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS ) // aka version "B"
-CONS( 1982, fscc9b, fscc9, 0, sc9b, sc9, fidel6502_state, empty_init, "Fidelity Electronics", "Sensory Chess Challenger 9 (rev. B)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
-CONS( 1982, fscc9c, fscc9, 0, sc9c, sc9c, fidel6502_state, empty_init, "Fidelity Electronics", "Sensory Chess Challenger 9 (rev. C)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
-CONS( 1983, fscc9ps, fscc9, 0, playmatic, playmatic, fidel6502_state, empty_init, "Fidelity Electronics", "Sensory 9 Playmatic 'S'", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS ) // Fidelity West Germany
-
-CONS( 1984, fscc12, 0, 0, sc12, sc12, fidel6502_state, empty_init, "Fidelity Electronics", "Sensory Chess Challenger 12", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS | MACHINE_IMPERFECT_TIMING )
-CONS( 1984, fscc12b, fscc12, 0, sc12b, sc12b, fidel6502_state, empty_init, "Fidelity Electronics", "Sensory Chess Challenger 12-B", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS | MACHINE_IMPERFECT_TIMING )
-
-CONS( 1985, feleg, 0, 0, as12, as12, fidel6502_state, empty_init, "Fidelity Electronics", "Elegance Chess Challenger", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS | MACHINE_IMPERFECT_TIMING )
-
-CONS( 1987, fexcel, 0, 0, fexcelb, fexcelb, fidel6502_state, empty_init, "Fidelity Electronics", "The Excellence (model 6080B)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
-CONS( 1987, fexcelv, fexcel, 0, fexcelv, fexcelv, fidel6502_state, empty_init, "Fidelity Electronics", "Voice Excellence", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
-CONS( 1987, fexceld, fexcel, 0, fexceld, fexcelb, fidel6502_state, empty_init, "Fidelity Electronics", "Excel Display", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
-CONS( 1985, fexcel12, fexcel, 0, fexcel, fexcel, fidel6502_state, empty_init, "Fidelity Electronics", "The Excellence (model EP12, set 1)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS ) // 1st version of The Excellence
-CONS( 1985, fexcel124, fexcel, 0, fexcel4, fexcel, fidel6502_state, empty_init, "Fidelity Electronics", "The Excellence (model EP12, set 2)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
-CONS( 1985, fexcela, fexcel, 0, fexcel, fexcel, fidel6502_state, empty_init, "Fidelity Electronics", "The Excellence (model 6080)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
-
-CONS( 1986, fexcelp, 0, 0, fexcelp, fexcel, fidel6502_state, empty_init, "Fidelity Electronics", "The Par Excellence", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
-CONS( 1986, fexcelpb, fexcelp, 0, fexcelp, fexcel, fidel6502_state, empty_init, "Fidelity Electronics", "The Par Excellence (rev. B)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
-CONS( 1986, granits, fexcelp, 0, granits, fexcel, fidel6502_state, empty_init, "hack (RCS)", "Granit 'S'", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
-CONS( 1988, fdes2000, fexcelp, 0, fdes2000, fdes, fidel6502_state, empty_init, "Fidelity Electronics", "Designer 2000", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS ) // Excellence series hardware
-CONS( 1988, fdes2100, fexcelp, 0, fdes2100, fdes, fidel6502_state, empty_init, "Fidelity Electronics", "Designer 2100", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS ) // "
-
-CONS( 1988, fdes2100d, 0, 0, fdes2100d, fdesdis, fidel6502_state, init_fdesdis, "Fidelity Electronics", "Designer 2100 Display (rev. B)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
-CONS( 1988, fdes2000d, fdes2100d,0, fdes2000d, fdesdis, fidel6502_state, init_fdesdis, "Fidelity Electronics", "Designer 2000 Display", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
-
-CONS( 1988, fphantom, 0, 0, fphantom, fphantom, fidel6502_state, init_fphantom, "Fidelity Electronics", "Phantom (Fidelity)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS | MACHINE_MECHANICAL | MACHINE_NOT_WORKING )
-
-CONS( 1990, chesster, 0, 0, chesster, chesster, fidel6502_state, init_chesster, "Fidelity Electronics", "Chesster Challenger (V1.3)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
-CONS( 1990, chesstera, chesster, 0, chesster, chesster, fidel6502_state, init_chesster, "Fidelity Electronics", "Chesster Challenger", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
-CONS( 1991, kishon, chesster, 0, kishon, chesster, fidel6502_state, init_chesster, "Fidelity Electronics", "Kishon Chesster", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
diff --git a/src/mame/drivers/fidel68k.cpp b/src/mame/drivers/fidel68k.cpp
deleted file mode 100644
index 7b8046f62cc..00000000000
--- a/src/mame/drivers/fidel68k.cpp
+++ /dev/null
@@ -1,818 +0,0 @@
-// license:BSD-3-Clause
-// copyright-holders:hap
-// thanks-to:Berger,yoyo_chessboard
-/******************************************************************************
-
- Fidelity Electronics 68000 based board driver
-
- NOTE: MAME doesn't include a generalized implementation for boardpieces yet,
- greatly affecting user playability of emulated electronic board games.
- As workaround for the chess games, use an external chess GUI on the side,
- such as Arena(in editmode).
-
- TODO:
- - USART is not emulated
- - V9(68030 @ 32MHz) is faster than V10(68040 @ 25MHz) but it should be the other
- way around, culprit is unemulated cache?
- - V11 CPU should be M68EC060, not yet emulated. Now using M68EC040 in its place
- at twice the frequency due to lack of superscalar.
- - V11 beeper is too high pitched, obviously related to wrong CPU type too
-
-******************************************************************************
-
-Excel 68000 (model 6094)
-------------------------
-16KB RAM(2*SRM2264C-10 @ U8/U9), 64KB ROM(2*AT27C256-15DC @ U6/U7)
-HD68HC000P12 CPU, 12MHz XTAL
-PCB label 510-1129A01
-PCB has edge connector for module, but no external slot
-
-There's room for 2 SIMMs at U22 and U23, unpopulated in Excel 68000 and Mach III.
-Mach II has 2*64KB DRAM with a MB1422A DRAM controller @ 25MHz.
-Mach III has wire mods from U22/U23 to U8/U9(2*8KB + 2*32KB piggybacked).
-Mach IV has 2*256KB DRAM, and a daughterboard(510.1123B01) for the 68020.
-
-I/O is via TTL, overall very similar to EAG.
-
-
-******************************************************************************
-
-Designer Mach III Master 2265 (model 6113)
-------------------------------------------
-80KB RAM(2*KM6264AL-10, 2*KM62256AP-10), 64KB ROM(2*WSI 27C256L-12)
-MC68HC000P12F CPU, 16MHz XTAL
-IRQ(IPL2) from 555 timer, 1.67ms low, 6us high
-PCB label 510.1134A02
-
-ROM address/data lines are scrambled, presumed for easy placement on PCB and not
-for obfuscation. I/O is nearly the same as Designer Display on 6502 hardware.
-
-Designer Mach IV Master 2325 (model 6129)
------------------------------------------
-32KB(4*P5164-70) + 512KB(TC518512PL-80) RAM, 64KB ROM(TMS 27C512-120JL)
-MC68EC020RP25 CPU, 20MHz XTAL
-PCB label 510.1149A01
-It has a green "Shift" led instead of red, and ROM is not scrambled.
-
-
-******************************************************************************
-
-
-Elite Avant Garde (EAG, model 6114)
------------------------------------
-
-There are 5 versions of model 6114(V1 to V5). The one emulated here came from a V2,
-but is practically emulated as a V4.
-
-V1: 128KB DRAM, no EEPROM
-V2: 128KB DRAM
-V3: 512KB DRAM
-V4: 1MB DRAM
-V5: 128KB+64KB DRAM, dual-CPU! (2*68K @ 16MHz)
-
-V6-V11 are on model 6117. Older 1986 model 6081/6088/6089 uses a 6502 CPU.
-
-Hardware info:
---------------
-- MC68HC000P12F 16MHz CPU, 16MHz XTAL
-- MB1422A DRAM Controller, 25MHz XTAL near, 4 DRAM slots
- (V2: slot 2 & 3 64KB, V3: slot 2 & 3 256KB)
-- 2*27C512 64KB EPROM, 2*KM6264AL-10 8KB SRAM, 2*AT28C64X 8KB EEPROM
-- OKI M82C51A-2 USART, 4.9152MHz XTAL
-- other special: magnet sensors, external module slot, serial port
-
-IRQ source is a 4,9152MHz quartz crystal (Y3) connected to a 74HC4060 (U8,
-ripple counter/divider). From Q13 output (counter=8192) we obtain the IRQ signal
-applied to IPL1 of 68000 (pin 24) 4,9152 MHz / 8192 = 600 Hz.
-
-The module slot pinout is different from SCC series. The data on those appears
-to be compatible with EAG though and will load fine with an adapter.
-
-The USART allows for a serial connection between the chess computer and another
-device, for example a PC. Fidelity released a DOS tool called EAGLINK which
-featured PC printer support, complete I/O control, detailed information while
-the program is 'thinking', etc.
-
-Memory map: (of what is known)
------------
-000000-01FFFF: 128KB ROM
-104000-107FFF: 16KB SRAM
-200000-2FFFFF: hashtable DRAM (max. 1MB)
-300000-30000F W hi d0: NE591: 7seg data
-300000-30000F W lo d0: NE591: LED data
-300000-30000F R lo d7: 74259: keypad rows 0-7
-400000-400001 W lo d0-d3: 74145/7442: led/keypad mux, buzzer out
-400000-4????? R hi: external module slot
-700002-700003 R lo d7: 74251: keypad row 8
-604000-607FFF: 16KB EEPROM
-
-
-******************************************************************************
-
-Elite Avant Garde (EAG, model 6117)
------------------------------------
-
-There are 6 versions of model 6114(V6 to V11). From a programmer's point of view,
-the hardware is very similar to model 6114.
-
-V6: 68020, 512KB hashtable RAM
-V7: 68020, 1MB h.RAM
-V8: 2*68020, 512KB+128KB h.RAM
-V9: 68030, 1MB h.RAM
-V10: 68040, 1MB h.RAM
-V11: 68060, 2MB h.RAM, high speed
-
-V7 Hardware info:
------------------
-- MC68020RC25E CPU, 25MHz XTAL - this PCB was overclocked, original was 20MHz so let's use that
-- 4*AS7C164-20PC 8KB SRAM, 2*KM684000ALG-7L 512KB CMOS SRAM
-- 2*27C512? 64KB EPROM, 2*HM6264LP-15 8KB SRAM, 2*AT28C64B 8KB EEPROM, 2*GAL16V8C
-- same as 6114: M82C51A, NE555, SN74HC4060, module slot, chessboard, ..
-
-V7 Memory map:
---------------
-000000-01FFFF: 128KB ROM
-104000-107FFF: 16KB SRAM (unused?)
-200000-2FFFFF: hashtable SRAM
-300000-30000x: see model 6114
-400000-40000x: see model 6114
-700000-70000x: see model 6114
-604000-607FFF: 16KB EEPROM
-800000-807FFF: 32KB SRAM
-
-V10 Hardware info:
-------------------
-- 68040 CPU, 25MHz
-- other: assume same or very similar to V11(see below)
-
-The ROM dump came from the V11(see below). Built-in factory test proves
-that this program is a V10. Hold TB button immediately after power-on and
-press it for a sequence of tests:
-1) all LEDs on
-2) F40C: V10 program version
-3) 38b9: V10 ROM checksum
-4) xxxx: external module ROM checksum (0000 if no module present)
-5) xxxx: user settings (stored in EEPROM)
-6) xxxx: "
-7) 1024: hashtable RAM size
-8) return to game
-
-V11 Hardware info:
-------------------
-- MC68EC060RC75 CPU, 36MHz XTAL(36MHz bus, 72MHz CPU), CPU cooler required
-- 4*CXK5863AP-20 8KB SRAM, 4*K6X4008C1F-DF55 512KB CMOS SRAM
-- 4*M27C256B 32KB EPROM, 2*AT28C64 8KB EEPROM, 5*GAL16V8D
-- NEC D71051C USART, assume 8MHz, on quick glance it's same as the OKI USART
-- same as 6114: NE555, SN74HC4060, module slot, chessboard, ..
-
-This is a custom overclocked V10, manufactured by Wilfried Bucke. PCB is marked:
-"CHESS HW DESIGN COPYRIGHT 22-10-2002: REVA03 510.1136A01/510.1144B01 COMPONENT SIDE"
-There are two versions of this, one with a 66MHz CPU, one with a 72MHz CPU.
-Maybe other differences too?
-
-V1x Memory map:
----------------
-000000-01FFFF: 128KB ROM
-200000-3FFFFF: hashtable SRAM (less on V10?)
-B0000x-xxxxxx: see V7, -800000
-
-******************************************************************************/
-
-#include "emu.h"
-#include "includes/fidelbase.h"
-
-#include "cpu/m68000/m68000.h"
-#include "machine/ram.h"
-#include "machine/nvram.h"
-#include "sound/volt_reg.h"
-#include "speaker.h"
-
-// internal artwork
-#include "fidel_desdis_68kg.lh" // clickable
-#include "fidel_desdis_68kr.lh" // clickable
-#include "fidel_ex_68k.lh" // clickable
-#include "fidel_eag_68k.lh" // clickable
-
-
-class fidel68k_state : public fidelbase_state
-{
-public:
- fidel68k_state(const machine_config &mconfig, device_type type, const char *tag)
- : fidelbase_state(mconfig, type, tag),
- m_ram(*this, "ram")
- { }
-
- void fex68k(machine_config &config);
- void fex68km2(machine_config &config);
- void fex68km3(machine_config &config);
-
- void fdes2265(machine_config &config);
- void fdes2325(machine_config &config);
- void init_fdes2265();
-
- void eag_base(machine_config &config);
- void eag(machine_config &config);
- void eagv7(machine_config &config);
- void eagv9(machine_config &config);
- void eagv10(machine_config &config);
- void eagv11(machine_config &config);
- void init_eag();
-
-private:
- optional_device<ram_device> m_ram;
-
- TIMER_DEVICE_CALLBACK_MEMBER(irq_on) { m_maincpu->set_input_line(M68K_IRQ_2, ASSERT_LINE); }
- TIMER_DEVICE_CALLBACK_MEMBER(irq_off) { m_maincpu->set_input_line(M68K_IRQ_2, CLEAR_LINE); }
-
- // Excel 68000
- DECLARE_WRITE8_MEMBER(fex68k_mux_w);
- void fex68k_map(address_map &map);
- void fex68km2_map(address_map &map);
- void fex68km3_map(address_map &map);
-
- // Designer Master
- DECLARE_WRITE8_MEMBER(fdes68k_control_w);
- DECLARE_READ8_MEMBER(fdes68k_input_r);
- DECLARE_WRITE8_MEMBER(fdes68k_lcd_w);
- void fdes2265_map(address_map &map);
- void fdes2325_map(address_map &map);
-
- // EAG(6114/6117)
- void eag_prepare_display();
- DECLARE_READ8_MEMBER(eag_input1_r);
- DECLARE_WRITE8_MEMBER(eag_leds_w);
- DECLARE_WRITE8_MEMBER(eag_7seg_w);
- DECLARE_WRITE8_MEMBER(eag_mux_w);
- DECLARE_READ8_MEMBER(eag_input2_r);
- void eag_map(address_map &map);
- void eagv7_map(address_map &map);
- void eagv11_map(address_map &map);
-};
-
-
-
-// Devices, I/O
-
-/******************************************************************************
- Excel 68000
-******************************************************************************/
-
-WRITE8_MEMBER(fidel68k_state::fex68k_mux_w)
-{
- // a1-a3,d0: 74259
- u8 mask = 1 << offset;
- m_led_select = (m_led_select & ~mask) | ((data & 1) ? mask : 0);
-
- // 74259 Q0-Q3: 74145 A-D (Q4-Q7 N/C)
- eag_mux_w(space, offset, m_led_select & 0xf);
-}
-
-
-
-/******************************************************************************
- Designer Master
-******************************************************************************/
-
-WRITE8_MEMBER(fidel68k_state::fdes68k_control_w)
-{
- u8 q3_old = m_led_select & 8;
-
- // a1-a3,d0: 74259
- u8 mask = 1 << offset;
- m_led_select = (m_led_select & ~mask) | ((data & 1) ? mask : 0);
-
- // 74259 Q4-Q7: 7442 a0-a3
- // 7442 0-8: led data, input mux
- u16 sel = 1 << (m_led_select >> 4 & 0xf) & 0x3ff;
- m_inp_mux = sel & 0x1ff;
-
- // 7442 9: speaker out
- m_dac->write(BIT(sel, 9));
-
- // 74259 Q0,Q1: led select (active low)
- display_matrix(9, 2, m_inp_mux, ~m_led_select & 3, false);
-
- // 74259 Q3: lcd common, update on rising edge
- if (~q3_old & m_led_select & 8)
- {
- for (int i = 0; i < 4; i++)
- m_display_state[i+2] = m_7seg_data >> (8*i) & 0xff;
- }
-
- m_display_maxy += 4;
- set_display_segmask(0x3c, 0x7f);
- display_update();
-}
-
-READ8_MEMBER(fidel68k_state::fdes68k_input_r)
-{
- // a1-a3,d7(d15): multiplexed inputs (active low)
- return (read_inputs(9) >> offset & 1) ? 0 : 0x80;
-}
-
-WRITE8_MEMBER(fidel68k_state::fdes68k_lcd_w)
-{
- // a1-a3,d0-d3: 4*74259 to lcd digit segments
- u32 mask = bitswap<8>(1 << offset,3,7,6,0,1,2,4,5);
- for (int i = 0; i < 4; i++)
- {
- m_7seg_data = (m_7seg_data & ~mask) | ((data >> i & 1) ? mask : 0);
- mask <<= 8;
- }
-}
-
-void fidel68k_state::init_fdes2265()
-{
- u16 *rom = (u16*)memregion("maincpu")->base();
- const u32 len = memregion("maincpu")->bytes() / 2;
-
- // descramble data lines
- for (int i = 0; i < len; i++)
- rom[i] = bitswap<16>(rom[i], 15,14,8,13,9,12,10,11, 3,4,5,7,6,0,1,2);
-
- // descramble address lines
- std::vector<u16> buf(len);
- memcpy(&buf[0], rom, len*2);
- for (int i = 0; i < len; i++)
- rom[i] = buf[bitswap<24>(i, 23,22,21,20,19,18,17,16, 15,14,13,12,11,8,10,9, 7,6,5,4,3,2,1,0)];
-}
-
-
-
-/******************************************************************************
- EAG
-******************************************************************************/
-
-// TTL/generic
-
-void fidel68k_state::eag_prepare_display()
-{
- // Excel 68000: 4*7seg leds, 8*8 chessboard leds
- // EAG: 8*7seg leds(2 panels), (8+1)*8 chessboard leds
- u8 seg_data = bitswap<8>(m_7seg_data,0,1,3,2,7,5,6,4);
- set_display_segmask(0x1ff, 0x7f);
- display_matrix(16, 9, m_led_data << 8 | seg_data, m_inp_mux);
-}
-
-READ8_MEMBER(fidel68k_state::eag_input1_r)
-{
- // a1-a3,d7: multiplexed inputs (active low)
- return (read_inputs(9) >> offset & 1) ? 0 : 0x80;
-}
-
-READ8_MEMBER(fidel68k_state::eag_input2_r)
-{
- // d7: multiplexed inputs highest bit
- return (read_inputs(9) & 0x100) ? 0x80 : 0;
-}
-
-WRITE8_MEMBER(fidel68k_state::eag_leds_w)
-{
- // a1-a3,d0: led data
- m_led_data = (m_led_data & ~(1 << offset)) | ((data & 1) << offset);
- eag_prepare_display();
-}
-
-WRITE8_MEMBER(fidel68k_state::eag_7seg_w)
-{
- // a1-a3,d0(d8): digit segment data
- m_7seg_data = (m_7seg_data & ~(1 << offset)) | ((data & 1) << offset);
- eag_prepare_display();
-}
-
-WRITE8_MEMBER(fidel68k_state::eag_mux_w)
-{
- // d0-d3: 74145 A-D
- // 74145 0-8: input mux, digit/led select
- // 74145 9: speaker out
- u16 sel = 1 << (data & 0xf);
- m_dac->write(BIT(sel, 9));
- m_inp_mux = sel & 0x1ff;
- eag_prepare_display();
-}
-
-
-
-/******************************************************************************
- Address Maps
-******************************************************************************/
-
-// Excel 68000
-
-void fidel68k_state::fex68k_map(address_map &map)
-{
- map(0x000000, 0x00ffff).rom();
- map(0x000000, 0x00000f).mirror(0x00fff0).w(FUNC(fidel68k_state::eag_leds_w)).umask16(0x00ff);
- map(0x000000, 0x00000f).mirror(0x00fff0).w(FUNC(fidel68k_state::eag_7seg_w)).umask16(0xff00);
- map(0x044000, 0x047fff).ram();
- map(0x100000, 0x10000f).mirror(0x03fff0).r(FUNC(fidel68k_state::eag_input1_r)).umask16(0x00ff);
- map(0x140000, 0x14000f).mirror(0x03fff0).w(FUNC(fidel68k_state::fex68k_mux_w)).umask16(0x00ff);
-}
-
-void fidel68k_state::fex68km2_map(address_map &map)
-{
- fex68k_map(map);
- map(0x200000, 0x21ffff).ram();
-}
-
-void fidel68k_state::fex68km3_map(address_map &map)
-{
- fex68k_map(map);
- map(0x200000, 0x20ffff).ram();
-}
-
-
-// Designer Master
-
-void fidel68k_state::fdes2265_map(address_map &map)
-{
- map.unmap_value_high();
- map(0x000000, 0x00ffff).rom();
- map(0x000000, 0x00000f).w(FUNC(fidel68k_state::fdes68k_lcd_w)).umask16(0x00ff);
- map(0x044000, 0x047fff).ram();
- map(0x100000, 0x10ffff).ram();
- map(0x140000, 0x14000f).r(FUNC(fidel68k_state::fdes68k_input_r)).umask16(0xff00);
- map(0x140000, 0x14000f).w(FUNC(fidel68k_state::fdes68k_control_w)).umask16(0x00ff);
-}
-
-void fidel68k_state::fdes2325_map(address_map &map)
-{
- map.unmap_value_high();
- map(0x000000, 0x00ffff).rom();
- map(0x100000, 0x10000f).w(FUNC(fidel68k_state::fdes68k_lcd_w)).umask32(0x00ff00ff);
- map(0x140000, 0x14000f).w(FUNC(fidel68k_state::fdes68k_control_w)).umask32(0x00ff00ff);
- map(0x180000, 0x18000f).r(FUNC(fidel68k_state::fdes68k_input_r)).umask32(0xff00ff00);
- map(0x300000, 0x37ffff).ram();
- map(0x500000, 0x507fff).ram();
-}
-
-
-// EAG
-
-void fidel68k_state::init_eag()
-{
- // eag_map: DRAM slots at $200000-$2fffff - V1/V2: 128K, V3: 512K, V4: 1M
- m_maincpu->space(AS_PROGRAM).install_ram(0x200000, 0x200000 + m_ram->size() - 1, m_ram->pointer());
-}
-
-void fidel68k_state::eag_map(address_map &map)
-{
- map(0x000000, 0x01ffff).rom();
- map(0x104000, 0x107fff).ram();
- map(0x300000, 0x30000f).mirror(0x000010).w(FUNC(fidel68k_state::eag_7seg_w)).umask16(0xff00).nopr();
- map(0x300000, 0x30000f).mirror(0x000010).rw(FUNC(fidel68k_state::eag_input1_r), FUNC(fidel68k_state::eag_leds_w)).umask16(0x00ff);
- map(0x400000, 0x407fff).r(FUNC(fidel68k_state::cartridge_r)).umask16(0xff00);
- map(0x400001, 0x400001).w(FUNC(fidel68k_state::eag_mux_w));
- map(0x400002, 0x400007).nopw(); // ?
- map(0x604000, 0x607fff).ram().share("nvram");
- map(0x700003, 0x700003).r(FUNC(fidel68k_state::eag_input2_r));
-}
-
-void fidel68k_state::eagv7_map(address_map &map)
-{
- map(0x000000, 0x01ffff).rom();
- map(0x104000, 0x107fff).ram();
- map(0x200000, 0x2fffff).ram();
- map(0x300000, 0x30000f).mirror(0x000010).w(FUNC(fidel68k_state::eag_7seg_w)).umask32(0xff00ff00).nopr();
- map(0x300000, 0x30000f).mirror(0x000010).rw(FUNC(fidel68k_state::eag_input1_r), FUNC(fidel68k_state::eag_leds_w)).umask32(0x00ff00ff);
- map(0x400000, 0x407fff).r(FUNC(fidel68k_state::cartridge_r)).umask32(0xff00ff00);
- map(0x400001, 0x400001).w(FUNC(fidel68k_state::eag_mux_w));
- map(0x400004, 0x400007).nopw(); // ?
- map(0x604000, 0x607fff).ram().share("nvram");
- map(0x700003, 0x700003).r(FUNC(fidel68k_state::eag_input2_r));
- map(0x800000, 0x807fff).ram();
-}
-
-void fidel68k_state::eagv11_map(address_map &map)
-{
- map(0x00000000, 0x0001ffff).rom();
- map(0x00200000, 0x003fffff).ram();
- map(0x00b00000, 0x00b0000f).mirror(0x00000010).w(FUNC(fidel68k_state::eag_7seg_w)).umask32(0xff00ff00).nopr();
- map(0x00b00000, 0x00b0000f).mirror(0x00000010).rw(FUNC(fidel68k_state::eag_input1_r), FUNC(fidel68k_state::eag_leds_w)).umask32(0x00ff00ff);
- map(0x00c00000, 0x00c07fff).r(FUNC(fidel68k_state::cartridge_r)).umask32(0xff00ff00);
- map(0x00c00001, 0x00c00001).w(FUNC(fidel68k_state::eag_mux_w));
- map(0x00c00004, 0x00c00007).nopw(); // ?
- map(0x00e04000, 0x00e07fff).ram().share("nvram");
- map(0x00f00003, 0x00f00003).r(FUNC(fidel68k_state::eag_input2_r));
- map(0x01000000, 0x0101ffff).ram();
-}
-
-
-
-/******************************************************************************
- Input Ports
-******************************************************************************/
-
-static INPUT_PORTS_START( fex68k )
- PORT_INCLUDE( fidel_cb_buttons )
-
- PORT_START("IN.8")
- PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_DEL) PORT_NAME("Clear")
- PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("Move / Pawn")
- PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("Hint / Knight")
- PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("Take Back / Bishop")
- PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("Level / Rook")
- PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("Options / Queen")
- PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("Verify / King")
- PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_R) PORT_CODE(KEYCODE_N) PORT_NAME("New Game")
-INPUT_PORTS_END
-
-
-static INPUT_PORTS_START( fdes68k )
- PORT_INCLUDE( fidel_cb_buttons )
-
- PORT_START("IN.8")
- PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_DEL) PORT_NAME("Clear")
- PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_H) PORT_NAME("Move / Alternate")
- PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_G) PORT_NAME("Hint / Info")
- PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_F) PORT_NAME("Take Back / Replay")
- PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_C) PORT_NAME("Level / New")
- PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_B) PORT_NAME("Option / Time")
- PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_A) PORT_NAME("Verify / Problem")
- PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_LSHIFT) PORT_CODE(KEYCODE_RSHIFT) PORT_NAME("Shift")
-INPUT_PORTS_END
-
-
-static INPUT_PORTS_START( eag )
- PORT_INCLUDE( fidel_cb_magnets )
-
- PORT_MODIFY("IN.0")
- PORT_BIT(0x100, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_DEL) PORT_NAME("CL")
-
- PORT_MODIFY("IN.1")
- PORT_BIT(0x100, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_M) PORT_NAME("DM")
-
- PORT_MODIFY("IN.2")
- PORT_BIT(0x100, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_R) PORT_CODE(KEYCODE_N) PORT_NAME("New Game")
-
- PORT_START("IN.8")
- PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("PB / King")
- PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("PV / Queen")
- PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("TM / Rook")
- PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("ST / Bishop")
- PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("TB / Knight")
- PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("LV / Pawn")
- PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_O) PORT_NAME("Option")
- PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_V) PORT_NAME("RV")
-INPUT_PORTS_END
-
-
-
-/******************************************************************************
- Machine Drivers
-******************************************************************************/
-
-MACHINE_CONFIG_START(fidel68k_state::fex68k)
-
- /* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M68000, 12_MHz_XTAL) // HD68HC000P12
- MCFG_DEVICE_PROGRAM_MAP(fex68k_map)
- MCFG_TIMER_DRIVER_ADD_PERIODIC("irq_on", fidel68k_state, irq_on, attotime::from_hz(618)) // theoretical frequency from 556 timer (22nF, 91K + 20K POT @ 14.8K, 0.1K), measurement was 580Hz
- MCFG_TIMER_START_DELAY(attotime::from_hz(618) - attotime::from_nsec(1525)) // active for 1.525us
- MCFG_TIMER_DRIVER_ADD_PERIODIC("irq_off", fidel68k_state, irq_off, attotime::from_hz(618))
-
- MCFG_TIMER_DRIVER_ADD_PERIODIC("display_decay", fidelbase_state, display_decay_tick, attotime::from_msec(1))
- config.set_default_layout(layout_fidel_ex_68k);
-
- /* sound hardware */
- SPEAKER(config, "speaker").front_center();
- MCFG_DEVICE_ADD("dac", DAC_1BIT, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 0.25)
- MCFG_DEVICE_ADD("vref", VOLTAGE_REGULATOR, 0) MCFG_VOLTAGE_REGULATOR_OUTPUT(5.0)
- MCFG_SOUND_ROUTE(0, "dac", 1.0, DAC_VREF_POS_INPUT)
-MACHINE_CONFIG_END
-
-MACHINE_CONFIG_START(fidel68k_state::fex68km2)
- fex68k(config);
-
- /* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(fex68km2_map)
-MACHINE_CONFIG_END
-
-MACHINE_CONFIG_START(fidel68k_state::fex68km3)
- fex68k(config);
-
- /* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_CLOCK(16_MHz_XTAL) // factory overclock
- MCFG_DEVICE_PROGRAM_MAP(fex68km3_map)
-MACHINE_CONFIG_END
-
-MACHINE_CONFIG_START(fidel68k_state::fdes2265)
-
- /* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M68000, 16_MHz_XTAL) // MC68HC000P12F
- MCFG_DEVICE_PROGRAM_MAP(fdes2265_map)
- MCFG_TIMER_DRIVER_ADD_PERIODIC("irq_on", fidel68k_state, irq_on, attotime::from_hz(597)) // from 555 timer, measured
- MCFG_TIMER_START_DELAY(attotime::from_hz(597) - attotime::from_nsec(6000)) // active for 6us
- MCFG_TIMER_DRIVER_ADD_PERIODIC("irq_off", fidel68k_state, irq_off, attotime::from_hz(597))
-
- MCFG_TIMER_DRIVER_ADD_PERIODIC("display_decay", fidelbase_state, display_decay_tick, attotime::from_msec(1))
- config.set_default_layout(layout_fidel_desdis_68kr);
-
- /* sound hardware */
- SPEAKER(config, "speaker").front_center();
- MCFG_DEVICE_ADD("dac", DAC_1BIT, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 0.25)
- MCFG_DEVICE_ADD("vref", VOLTAGE_REGULATOR, 0) MCFG_VOLTAGE_REGULATOR_OUTPUT(5.0)
- MCFG_SOUND_ROUTE(0, "dac", 1.0, DAC_VREF_POS_INPUT)
-MACHINE_CONFIG_END
-
-MACHINE_CONFIG_START(fidel68k_state::fdes2325)
- fdes2265(config);
-
- /* basic machine hardware */
- MCFG_DEVICE_REPLACE("maincpu", M68EC020, 20_MHz_XTAL) // MC68EC020RP25
- MCFG_DEVICE_PROGRAM_MAP(fdes2325_map)
-
- config.set_default_layout(layout_fidel_desdis_68kg);
-MACHINE_CONFIG_END
-
-MACHINE_CONFIG_START(fidel68k_state::eag_base)
-
- /* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M68000, 16_MHz_XTAL)
- MCFG_DEVICE_PROGRAM_MAP(eag_map)
- MCFG_TIMER_DRIVER_ADD_PERIODIC("irq_on", fidel68k_state, irq_on, attotime::from_hz(4.9152_MHz_XTAL/0x2000)) // 600Hz
- MCFG_TIMER_START_DELAY(attotime::from_hz(4.9152_MHz_XTAL/0x2000) - attotime::from_nsec(8250)) // active for 8.25us
- MCFG_TIMER_DRIVER_ADD_PERIODIC("irq_off", fidel68k_state, irq_off, attotime::from_hz(4.9152_MHz_XTAL/0x2000))
-
- NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_1);
-
- MCFG_TIMER_DRIVER_ADD_PERIODIC("display_decay", fidelbase_state, display_decay_tick, attotime::from_msec(1))
- config.set_default_layout(layout_fidel_eag_68k);
-
- /* sound hardware */
- SPEAKER(config, "speaker").front_center();
- MCFG_DEVICE_ADD("dac", DAC_1BIT, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 0.25)
- MCFG_DEVICE_ADD("vref", VOLTAGE_REGULATOR, 0) MCFG_VOLTAGE_REGULATOR_OUTPUT(5.0)
- MCFG_SOUND_ROUTE(0, "dac", 1.0, DAC_VREF_POS_INPUT)
-
- /* cartridge */
- MCFG_GENERIC_CARTSLOT_ADD("cartslot", generic_plain_slot, "fidel_scc")
- MCFG_GENERIC_EXTENSIONS("bin,dat")
- MCFG_GENERIC_LOAD(fidelbase_state, scc_cartridge)
- MCFG_SOFTWARE_LIST_ADD("cart_list", "fidel_scc")
-MACHINE_CONFIG_END
-
-MACHINE_CONFIG_START(fidel68k_state::eag)
- eag_base(config);
- RAM(config, "ram").set_default_size("1M").set_extra_options("128K, 512K, 1M");
-MACHINE_CONFIG_END
-
-MACHINE_CONFIG_START(fidel68k_state::eagv7)
- eag_base(config);
-
- /* basic machine hardware */
- MCFG_DEVICE_REPLACE("maincpu", M68020, 20_MHz_XTAL)
- MCFG_DEVICE_PROGRAM_MAP(eagv7_map)
-MACHINE_CONFIG_END
-
-MACHINE_CONFIG_START(fidel68k_state::eagv9)
- eagv7(config);
-
- /* basic machine hardware */
- MCFG_DEVICE_REPLACE("maincpu", M68030, 32_MHz_XTAL)
- MCFG_DEVICE_PROGRAM_MAP(eagv7_map)
-MACHINE_CONFIG_END
-
-MACHINE_CONFIG_START(fidel68k_state::eagv10)
- eagv7(config);
-
- /* basic machine hardware */
- MCFG_DEVICE_REPLACE("maincpu", M68040, 25_MHz_XTAL)
- MCFG_DEVICE_PROGRAM_MAP(eagv11_map)
-MACHINE_CONFIG_END
-
-MACHINE_CONFIG_START(fidel68k_state::eagv11)
- eagv7(config);
-
- /* basic machine hardware */
- MCFG_DEVICE_REPLACE("maincpu", M68EC040, 36_MHz_XTAL*2*2) // wrong! should be M68EC060 @ 72MHz
- MCFG_DEVICE_PROGRAM_MAP(eagv11_map)
-
- MCFG_DEVICE_PERIODIC_INT_DRIVER(fidel68k_state, irq2_line_hold, 600)
- MCFG_DEVICE_REMOVE("irq_on") // 8.25us is too long
- MCFG_DEVICE_REMOVE("irq_off")
-MACHINE_CONFIG_END
-
-
-
-/******************************************************************************
- ROM Definitions
-******************************************************************************/
-
-ROM_START( fex68k ) // model 6094, PCB label 510.1120B01
- ROM_REGION16_BE( 0x10000, "maincpu", 0 )
- ROM_LOAD16_BYTE("e3_yellow.u6", 0x00000, 0x08000, CRC(a8a27714) SHA1(bc42a561eb39dd389c7831f1a25ad260510085d8) ) // AT27C256-15
- ROM_LOAD16_BYTE("o4_red.u7", 0x00001, 0x08000, CRC(560a14b7) SHA1(11f2375255bfa229314697f103e891ba1cf0c715) ) // "
-ROM_END
-
-ROM_START( fex68ka )
- ROM_REGION16_BE( 0x10000, "maincpu", 0 )
- ROM_LOAD16_BYTE("e3_yellow.u6", 0x00000, 0x08000, CRC(7dc60d05) SHA1(e47b4d4e64c4cac6c5a94a900c9f2dd017f849ce) )
- ROM_LOAD16_BYTE("o4_red.u7", 0x00001, 0x08000, CRC(4b738583) SHA1(ff506296ea460c7ed852339d2ab24aaae01730d8) )
-ROM_END
-
-ROM_START( fex68kb )
- ROM_REGION16_BE( 0x10000, "maincpu", 0 )
- ROM_LOAD16_BYTE("e3_yellow.u6", 0x00000, 0x08000, CRC(d9f252f5) SHA1(205cdbadb58a4cdd486d4e40d2fe6a5209d2f8a4) )
- ROM_LOAD16_BYTE("o4_red.u7", 0x00001, 0x08000, CRC(3bf8b3d7) SHA1(6ce419c63159501d2349abfd1e142e38e5466fbc) )
-ROM_END
-
-ROM_START( fex68km2 ) // model 6097, PCB label 510.1120B01
- ROM_REGION16_BE( 0x10000, "maincpu", 0 )
- ROM_LOAD16_BYTE("e6_yellow.u6", 0x00000, 0x08000, CRC(2e65e7ad) SHA1(4f3aec12041c9014d5d700909bac66bae1f9eadf) ) // 27c256
- ROM_LOAD16_BYTE("o7_red.u7", 0x00001, 0x08000, CRC(4c20334a) SHA1(2e575b88c41505cc89599d2fc13e1e84fe474469) ) // "
-ROM_END
-
-ROM_START( fex68km3 ) // model 6098, PCB label 510.1120B01
- ROM_REGION16_BE( 0x10000, "maincpu", 0 )
- ROM_LOAD16_BYTE("me_white.u6", 0x00000, 0x08000, CRC(4b14cd9f) SHA1(4d41196900a71bf0699dae50f4726acc0ed3dced) ) // 27c256
- ROM_LOAD16_BYTE("mo_yellow.u7", 0x00001, 0x08000, CRC(b96b0b5f) SHA1(281145be802efb38ed764aecb26b511dcd71cb87) ) // "
-ROM_END
-
-
-ROM_START( fdes2265 ) // model 6113, PCB label 510.1134A02
- ROM_REGION16_BE( 0x10000, "maincpu", 0 )
- ROM_LOAD16_BYTE("13e_red.ic11", 0x00000, 0x08000, CRC(15a35628) SHA1(8213862e129951c6943a80f73cd0b63a31bb1357) ) // 27c256
- ROM_LOAD16_BYTE("13o_blue.ic10", 0x00001, 0x08000, CRC(81ce7ab2) SHA1(f01a70bcf2fbfe66c7a77d3c4437d897e5cc682d) ) // "
-ROM_END
-
-ROM_START( fdes2325 ) // model 6129, PCB label 510.1149A01
- ROM_REGION( 0x10000, "maincpu", 0 )
- ROM_LOAD("61_29_white.ic10", 0x00000, 0x10000, CRC(f74157e1) SHA1(87f3f2d584e292f81593e053240d022cc477834d) ) // 27c512
-
- ROM_REGION( 0x100, "pals", 0 )
- ROM_LOAD("101-1097a01.ic19", 0x000, 0x100, NO_DUMP ) // PALCE16V8Q-25PC
-ROM_END
-
-
-ROM_START( feagv2 ) // from a V2 board
- ROM_REGION16_BE( 0x20000, "maincpu", 0 )
- ROM_LOAD16_BYTE("6114_e5_yellow.u22", 0x00000, 0x10000, CRC(f9c7bada) SHA1(60e545f829121b9a4f1100d9e85ac83797715e80) ) // 27c512
- ROM_LOAD16_BYTE("6114_o5_green.u19", 0x00001, 0x10000, CRC(04f97b22) SHA1(8b2845dd115498f7b385e8948eca6a5893c223d1) ) // "
-ROM_END
-
-ROM_START( feagv2a ) // from a V3 board
- ROM_REGION16_BE( 0x20000, "maincpu", 0 )
- ROM_LOAD16_BYTE("elite_1.6_e.u22", 0x00000, 0x10000, CRC(c8b89ccc) SHA1(d62e0a72f54b793ab8853468a81255b62f874658) )
- ROM_LOAD16_BYTE("elite_1.6_o.u19", 0x00001, 0x10000, CRC(904c7061) SHA1(742110576cf673321440bc81a4dae4c949b49e38) )
-ROM_END
-
-ROM_START( feagv7 )
- ROM_REGION( 0x20000, "maincpu", 0 )
- ROM_LOAD16_BYTE("eag-v7b", 0x00000, 0x10000, CRC(f2f68b63) SHA1(621e5073e9c5083ac9a9b467f3ef8aa29beac5ac) )
- ROM_LOAD16_BYTE("eag-v7a", 0x00001, 0x10000, CRC(506b688f) SHA1(0a091c35d0f01166b57f964b111cde51c5720d58) )
-ROM_END
-
-ROM_START( feagv7a )
- ROM_REGION( 0x20000, "maincpu", 0 )
- ROM_LOAD16_BYTE("eag-v7b", 0x00000, 0x10000, CRC(44baefbf) SHA1(dbc24340d7e3013cc8f111ebb2a59169c5dcb8e8) )
- ROM_LOAD16_BYTE("eag-v7a", 0x00001, 0x10000, CRC(951a7857) SHA1(dad21b049fd4f411a79d4faefb922c1277569c0e) )
-ROM_END
-
-ROM_START( feagv9 )
- ROM_REGION( 0x20000, "maincpu", 0 )
- ROM_LOAD16_BYTE("eag-v9b", 0x00000, 0x10000, CRC(60523199) SHA1(a308eb6b782732af1ab2fd0ed8b046de7a8dd24b) )
- ROM_LOAD16_BYTE("eag-v9a", 0x00001, 0x10000, CRC(255c63c0) SHA1(8aa0397bdb3731002f5b066cd04ec62531267e22) )
-ROM_END
-
-ROM_START( feagv10 )
- ROM_REGION( 0x20000, "maincpu", 0 )
- ROM_LOAD32_BYTE("16", 0x00000, 0x08000, CRC(8375d61f) SHA1(e042f6f01480c59ee09a458cf34f135664479824) ) // 27c256
- ROM_LOAD32_BYTE("17", 0x00001, 0x08000, CRC(bfd14916) SHA1(115af6dfd29ddd8ad6d2ce390f8ecc4d60de6fce) ) // "
- ROM_LOAD32_BYTE("18", 0x00002, 0x08000, CRC(9341dcaf) SHA1(686bd4799e89ffaf11a813d4cf5a2aedd4c2d97a) ) // "
- ROM_LOAD32_BYTE("19", 0x00003, 0x08000, CRC(a70c5468) SHA1(7f6b4f46577d5cfdaa84d387c7ce35d941e5bbc7) ) // "
-ROM_END
-
-ROM_START( feagv11 )
- ROM_REGION( 0x20000, "maincpu", 0 )
- ROM_LOAD32_BYTE("16", 0x00000, 0x08000, CRC(8375d61f) SHA1(e042f6f01480c59ee09a458cf34f135664479824) ) // 27c256
- ROM_LOAD32_BYTE("17", 0x00001, 0x08000, CRC(bfd14916) SHA1(115af6dfd29ddd8ad6d2ce390f8ecc4d60de6fce) ) // "
- ROM_LOAD32_BYTE("18", 0x00002, 0x08000, CRC(9341dcaf) SHA1(686bd4799e89ffaf11a813d4cf5a2aedd4c2d97a) ) // "
- ROM_LOAD32_BYTE("19", 0x00003, 0x08000, CRC(a70c5468) SHA1(7f6b4f46577d5cfdaa84d387c7ce35d941e5bbc7) ) // "
-ROM_END
-
-
-
-/******************************************************************************
- Drivers
-******************************************************************************/
-
-// YEAR NAME PARENT CMP MACHINE INPUT CLASS INIT COMPANY FULLNAME, FLAGS
-CONS( 1987, fex68k, 0, 0, fex68k, fex68k, fidel68k_state, empty_init, "Fidelity Electronics", "Excel 68000 (set 1)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
-CONS( 1987, fex68ka, fex68k, 0, fex68k, fex68k, fidel68k_state, empty_init, "Fidelity Electronics", "Excel 68000 (set 2)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
-CONS( 1987, fex68kb, fex68k, 0, fex68k, fex68k, fidel68k_state, empty_init, "Fidelity Electronics", "Excel 68000 (set 3)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
-CONS( 1988, fex68km2, fex68k, 0, fex68km2, fex68k, fidel68k_state, empty_init, "Fidelity Electronics", "Excel 68000 Mach II (rev. C+)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
-CONS( 1988, fex68km3, fex68k, 0, fex68km3, fex68k, fidel68k_state, empty_init, "Fidelity Electronics", "Excel 68000 Mach III Master", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
-
-CONS( 1989, fdes2265, 0, 0, fdes2265, fdes68k, fidel68k_state, init_fdes2265, "Fidelity Electronics", "Designer Mach III Master 2265", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
-CONS( 1991, fdes2325, fdes2265, 0, fdes2325, fdes68k, fidel68k_state, empty_init, "Fidelity Electronics", "Designer Mach IV Master 2325", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
-
-CONS( 1989, feagv2, 0, 0, eag, eag, fidel68k_state, init_eag, "Fidelity Electronics", "Elite Avant Garde (model 6114-2/3/4, set 1)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
-CONS( 1989, feagv2a, feagv2, 0, eag, eag, fidel68k_state, init_eag, "Fidelity Electronics", "Elite Avant Garde (model 6114-2/3/4, set 2)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
-CONS( 1990, feagv7, feagv2, 0, eagv7, eag, fidel68k_state, empty_init, "Fidelity Electronics", "Elite Avant Garde (model 6117-7, set 1)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
-CONS( 1990, feagv7a, feagv2, 0, eagv7, eag, fidel68k_state, empty_init, "Fidelity Electronics", "Elite Avant Garde (model 6117-7, set 2)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
-CONS( 1990, feagv9, feagv2, 0, eagv9, eag, fidel68k_state, empty_init, "Fidelity Electronics", "Elite Avant Garde (model 6117-9)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
-CONS( 1990, feagv10, feagv2, 0, eagv10, eag, fidel68k_state, empty_init, "Fidelity Electronics", "Elite Avant Garde (model 6117-10)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS | MACHINE_IMPERFECT_TIMING )
-CONS( 2002, feagv11, feagv2, 0, eagv11, eag, fidel68k_state, empty_init, "hack (Wilfried Bucke)", "Elite Avant Garde (model 6117-11)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS | MACHINE_IMPERFECT_TIMING )
diff --git a/src/mame/drivers/fidel_as12.cpp b/src/mame/drivers/fidel_as12.cpp
new file mode 100644
index 00000000000..9b27dc53940
--- /dev/null
+++ b/src/mame/drivers/fidel_as12.cpp
@@ -0,0 +1,192 @@
+// license:BSD-3-Clause
+// copyright-holders:hap
+// thanks-to:yoyo_chessboard
+/******************************************************************************
+*
+* fidel_as12.cpp, subdriver of machine/fidelbase.cpp, machine/chessbase.cpp
+
+*******************************************************************************
+
+Fidelity Elegance Chess Challenger (AS12) overview:
+- R65C02P4 CPU @ 4MHz
+- 3*8KB ROM(TMM2764), 2*2KB RAM(HM6116)
+- PCB label 510-1084B01
+
+This is on the SC12B board, with enough modifications to support more leds and
+magnetic chess board sensors. See fidel_sc12.cpp for a more technical description.
+
+******************************************************************************/
+
+#include "emu.h"
+#include "includes/fidelbase.h"
+
+#include "cpu/m6502/r65c02.h"
+#include "sound/volt_reg.h"
+#include "speaker.h"
+
+// internal artwork
+#include "fidel_as12.lh" // clickable
+
+
+namespace {
+
+class as12_state : public fidelbase_state
+{
+public:
+ as12_state(const machine_config &mconfig, device_type type, const char *tag) :
+ fidelbase_state(mconfig, type, tag)
+ { }
+
+ // machine drivers
+ void as12(machine_config &config);
+
+private:
+ // address maps
+ void main_map(address_map &map);
+
+ // I/O handlers
+ void prepare_display();
+ DECLARE_WRITE8_MEMBER(control_w);
+ DECLARE_WRITE8_MEMBER(led_w);
+ DECLARE_READ8_MEMBER(input_r);
+};
+
+
+/******************************************************************************
+ Devices, I/O
+******************************************************************************/
+
+// TTL/generic
+
+void as12_state::prepare_display()
+{
+ // 8*8(+1) chessboard leds
+ display_matrix(8, 9, m_led_data, m_inp_mux);
+}
+
+WRITE8_MEMBER(as12_state::control_w)
+{
+ // d0-d3: 74245 P0-P3
+ // 74245 Q0-Q8: input mux, led select
+ u16 sel = 1 << (data & 0xf) & 0x3ff;
+ m_inp_mux = bitswap<9>(sel,5,8,7,6,4,3,1,0,2);
+ prepare_display();
+
+ // 74245 Q9: speaker out
+ m_dac->write(BIT(sel, 9));
+
+ // d4,d5: printer?
+ // d6,d7: N/C?
+}
+
+WRITE8_MEMBER(as12_state::led_w)
+{
+ // a0-a2,d0: led data via NE591N
+ m_led_data = (data & 1) << offset;
+ prepare_display();
+}
+
+READ8_MEMBER(as12_state::input_r)
+{
+ // a0-a2,d7: multiplexed inputs (active low)
+ u8 inp = bitswap<8>(read_inputs(9),4,3,2,1,0,5,6,7);
+ return (inp >> offset & 1) ? 0 : 0x80;
+}
+
+
+
+/******************************************************************************
+ Address Maps
+******************************************************************************/
+
+void as12_state::main_map(address_map &map)
+{
+ map.unmap_value_high();
+ map(0x0000, 0x0fff).ram();
+ map(0x1800, 0x1807).w(FUNC(as12_state::led_w)).nopr();
+ map(0x2000, 0x5fff).r(FUNC(as12_state::cartridge_r));
+ map(0x6000, 0x6000).mirror(0x1fff).w(FUNC(as12_state::control_w));
+ map(0x8000, 0x9fff).rom();
+ map(0xa000, 0xa007).mirror(0x1ff8).r(FUNC(as12_state::input_r));
+ map(0xc000, 0xffff).rom();
+}
+
+
+
+/******************************************************************************
+ Input Ports
+******************************************************************************/
+
+static INPUT_PORTS_START( as12 )
+ PORT_INCLUDE( fidel_cpu_div_4 )
+ PORT_INCLUDE( generic_cb_magnets )
+
+ PORT_START("IN.8")
+ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("RV / Pawn")
+ PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("DM / Knight")
+ PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("TB / Bishop")
+ PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("LV / Rook")
+ PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("PV / Queen")
+ PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("PB / King")
+ PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_DEL) PORT_NAME("CL")
+ PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_R) PORT_NAME("RE")
+INPUT_PORTS_END
+
+
+
+/******************************************************************************
+ Machine Drivers
+******************************************************************************/
+
+void as12_state::as12(machine_config &config)
+{
+ /* basic machine hardware */
+ R65C02(config, m_maincpu, 4_MHz_XTAL); // R65C02P4
+ m_maincpu->set_addrmap(AS_PROGRAM, &as12_state::div_trampoline);
+ ADDRESS_MAP_BANK(config, m_mainmap).set_map(&as12_state::main_map).set_options(ENDIANNESS_LITTLE, 8, 16);
+
+ TIMER(config, "dummy_timer").configure_periodic(timer_device::expired_delegate(), attotime::from_hz(4_MHz_XTAL));
+
+ const attotime irq_period = attotime::from_hz(585); // from 556 timer (22nF, 110K, 1K)
+ TIMER(config, m_irq_on).configure_periodic(FUNC(as12_state::irq_on<M6502_IRQ_LINE>), irq_period);
+ m_irq_on->set_start_delay(irq_period - attotime::from_nsec(15250)); // active for 15.25us
+ TIMER(config, "irq_off").configure_periodic(FUNC(as12_state::irq_off<M6502_IRQ_LINE>), irq_period);
+
+ TIMER(config, "display_decay").configure_periodic(FUNC(as12_state::display_decay_tick), attotime::from_msec(1));
+ config.set_default_layout(layout_fidel_as12);
+
+ /* sound hardware */
+ SPEAKER(config, "speaker").front_center();
+ DAC_1BIT(config, m_dac).add_route(ALL_OUTPUTS, "speaker", 0.25);
+ VOLTAGE_REGULATOR(config, "vref").add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT);
+
+ /* cartridge */
+ GENERIC_CARTSLOT(config, m_cart, generic_plain_slot, "fidel_scc", "bin,dat");
+ m_cart->set_device_load(device_image_load_delegate(&as12_state::device_image_load_scc_cartridge, this));
+
+ SOFTWARE_LIST(config, "cart_list").set_original("fidel_scc");
+}
+
+
+
+/******************************************************************************
+ ROM Definitions
+******************************************************************************/
+
+ROM_START( feleg ) // model AS12(or 6085)
+ ROM_REGION( 0x10000, "mainmap", 0 )
+ ROM_LOAD("feleg.1", 0x8000, 0x2000, CRC(e9df31e8) SHA1(31c52bb8f75580c82093eb950959c1bc294189a8) ) // TMM2764, no label
+ ROM_LOAD("feleg.2", 0xc000, 0x2000, CRC(bed9c84b) SHA1(c12f39765b054d2ad81f747e698715ad4246806d) ) // "
+ ROM_LOAD("feleg.3", 0xe000, 0x2000, CRC(b1fb49aa) SHA1(d8c9687dd564f0fa603e6d684effb1d113ac64b4) ) // "
+ROM_END
+
+} // anonymous namespace
+
+
+
+/******************************************************************************
+ Drivers
+******************************************************************************/
+
+// YEAR NAME PARENT CMP MACHINE INPUT STATE INIT COMPANY, FULLNAME, FLAGS
+CONS( 1985, feleg, 0, 0, as12, as12, as12_state, empty_init, "Fidelity Electronics", "Elegance Chess Challenger", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS | MACHINE_IMPERFECT_TIMING )
diff --git a/src/mame/drivers/fidel_card.cpp b/src/mame/drivers/fidel_card.cpp
new file mode 100644
index 00000000000..ccb8d10ade2
--- /dev/null
+++ b/src/mame/drivers/fidel_card.cpp
@@ -0,0 +1,675 @@
+// license:BSD-3-Clause
+// copyright-holders:Kevin Horton, Jonathan Gevaryahu, Sandro Ronco, hap
+/******************************************************************************
+*
+* fidel_card.cpp, subdriver of machine/fidelbase.cpp, machine/chessbase.cpp
+
+Fidelity electronic card games
+- *Bridge Challenger (BRC)
+- Advanced Bridge Challenger (UBC)
+- Voice Bridge Challenger (VBRC)
+- Bridge Challenger III (English,*French) (BV3)
+- Gin & Cribbage Challenger (GIN)
+- *Skat Challenger (SKT)
+
+*: not dumped yet
+
+NOTE: The card scanner is simulated, but the player is kind of forced to cheat
+and has to peek at the card before it is scanned.
+
+TODO:
+- Z80 WAIT pin is not fully emulated, affecting VBRC speech busy state
+
+*******************************************************************************
+
+Voice Bridge Challenger (Model VBRC, later reissued as Model 7002)
+and Bridge Challenger 3 (Model 7014)
+(which both share the same* hardware)
+--------------------------------
+* The Bridge Challenger 3 does not actually have the 8 LEDs nor the
+latches which operate them populated and the plastic indicator cap locations
+are instead are covered by a piece of plastic, but they do work if manually
+added.
+
+RE notes by Kevin Horton
+
+This unit is similar in construction kinda to the chess challengers, however it
+has an 8041 which does ALL of the system I/O. The Z80 has NO IO AT ALL other than
+what is performed through the 8041!
+
+The main CPU is a Z80 running at 2.5MHz
+
+INT connects to VCC (not used)
+NMI connects to VCC (not used)
+RST connects to power on reset, and reset button
+
+The 8041 runs at 5MHz.
+
+Memory Map:
+-----------
+0000-1FFF: 8K 101-64108 ROM
+2000-3FFF: 8K 101-64109 ROM
+4000-5FFF: 8K 101-64110 ROM
+6000-7FFF: 1K of RAM (2114 * 2)
+8000-DFFF: unused
+E000-FFFF: write to TSI chip
+
+NOTE: when the TSI chip is written to, the CPU IS STOPPED. The CPU will run again
+when the word is done being spoken. This is because D0-D5 run to the TSI chip directly.
+
+The TSI chip's ROM is 4K, and is marked 101-32118. The clock is the same as the Chess
+Challengers- 470K/100pf which gives a frequency around 25KHz or so.
+
+Port Map:
+---------
+00-FF: 8041 I/O ports (A0 selects between the two)
+
+8041 pinout:
+------------
+(note: columns are pulled up with 10K resistors)
+
+P10 - column H, RD LED, VFD grid 0
+P11 - column G, DB LED, VFD grid 1
+P12 - column F, <>V LED, VFD grid 2
+P13 - column E, ^V LED, VFD grid 3
+P14 - column D, W LED, VFD grid 4
+P15 - column C, S LED, VFD grid 5
+P16 - column B, E LED, VFD grid 6
+P17 - column A, N LED, VFD grid 7
+
+P20 - I/O expander
+P21 - I/O expander
+P22 - I/O expander
+P23 - I/O expander
+P24 - row 0 through inverter
+P25 - row 1 through inverter
+P26 - row 2 through inverter
+P27 - row 3 through inverter
+
+PROG - I/O expander
+
+T0 - optical card sensor (high = bright/reflective, low = dark/non reflective)
+T1 - connects to inverter, then 5MHz/4
+
+D8243C I/O expander:
+--------------------
+P4.0 - segment M
+P4.1 - segment L
+P4.2 - segment N
+P4.3 - segment E
+
+P5.0 - segment D
+P5.1 - segment I
+P5.2 - segment K
+P5.3 - segment J
+
+P6.0 - segment A
+P6.1 - segment B
+P6.2 - segment F
+P6.3 - segment G
+
+P7.0 - LED enable (high = LEDs can be lit. low = LEDs will not light)
+P7.1 - goes through inverter, to pads that are not used
+P7.2 - segment C
+P7.3 - segment H
+
+button matrix:
+--------------
+the matrix is composed of 8 columns by 4 rows.
+
+ A B C D E F G H
+ -------------------------
+0- RE xx CL EN J Q K A
+1- BR PB DB SC 7 8 9 10
+2- DL CV VL PL 3 4 5 6
+3- cl di he sp NT P 1 2
+
+xx - speaker symbol
+cl - clubs symbol
+di - diamonds symbol
+he - hearts symbol
+sp - spades symbol
+
+NOTE: RE is not wired into the matrix, and is run separately out.
+
+There are 8 LEDs, and an 8 digit 14 segment VFD with commas and periods.
+This display is the same one as can be found on the speak and spell.
+
+ A * comma
+ *********** *
+ * *I *J K* *
+F* * * * *B
+ * * * * *
+ G**** *****H
+ * * * * *
+E* * * * *C
+ * *N *M L* *
+ *********** *decimal point
+ D
+
+The digits of the display are numbered left to right, 0 through 7 and are controlled
+by the grids. hi = grid on, hi = segment on.
+
+A detailed description of the hardware can be found also in the patent 4,373,719.
+
+cards:
+------
+Playing cards have a 9-bit barcode on the face side near the edge. Swipe them downward
+against the card scanner and the game will detect the card.
+Barcode sync bits(msb and lsb) are the same for each card so that leaves 7 bits of data:
+2 for suit, 4 for value, and 1 for parity so the card can't be scanned backwards.
+
+Two card decks exist (red and blue), each has the same set of barcodes.
+
+******************************************************************************/
+
+#include "emu.h"
+#include "includes/fidelbase.h"
+
+#include "cpu/z80/z80.h"
+#include "cpu/mcs48/mcs48.h"
+#include "machine/i8243.h"
+#include "machine/clock.h"
+#include "sound/volt_reg.h"
+#include "speaker.h"
+
+// internal artwork
+#include "fidel_brc.lh" // clickable
+#include "fidel_bv3.lh" // clickable
+#include "fidel_gin.lh" // clickable
+
+
+namespace {
+
+class card_state : public fidelbase_state
+{
+public:
+ card_state(const machine_config &mconfig, device_type type, const char *tag) :
+ fidelbase_state(mconfig, type, tag),
+ m_mcu(*this, "mcu"),
+ m_i8243(*this, "i8243")
+ { }
+
+ // machine drivers
+ void ubc(machine_config &config);
+ void vbrc(machine_config &config);
+ void bv3(machine_config &config);
+ void gin(machine_config &config);
+
+ virtual DECLARE_INPUT_CHANGED_MEMBER(reset_button) override;
+ DECLARE_INPUT_CHANGED_MEMBER(start_scan);
+
+protected:
+ virtual void machine_start() override;
+
+private:
+ void brc_base(machine_config &config);
+
+ // devices/pointers
+ required_device<i8041_device> m_mcu;
+ required_device<i8243_device> m_i8243;
+
+ // address maps
+ void main_map(address_map &map);
+ void main_io(address_map &map);
+
+ TIMER_DEVICE_CALLBACK_MEMBER(barcode_shift) { m_barcode >>= 1; }
+ u32 m_barcode;
+
+ // I/O handlers
+ void prepare_display();
+ DECLARE_WRITE8_MEMBER(speech_w);
+ DECLARE_WRITE8_MEMBER(mcu_p1_w);
+ DECLARE_READ8_MEMBER(mcu_p2_r);
+ DECLARE_READ_LINE_MEMBER(mcu_t0_r);
+ template<int P> void ioexp_port_w(uint8_t data);
+};
+
+void card_state::machine_start()
+{
+ fidelbase_state::machine_start();
+
+ // zerofill/register for savestates
+ m_barcode = 0;
+ save_item(NAME(m_barcode));
+}
+
+
+/******************************************************************************
+ Devices, I/O
+******************************************************************************/
+
+// misc handlers
+
+void card_state::prepare_display()
+{
+ // 14seg led segments, d15(12) is extra led
+ u16 outdata = bitswap<16>(m_7seg_data,12,13,1,6,5,2,0,7,15,11,10,14,4,3,9,8);
+ set_display_segmask(0xff, 0x3fff);
+ display_matrix(16, 8, outdata, m_led_select);
+}
+
+WRITE8_MEMBER(card_state::speech_w)
+{
+ if (m_speech == nullptr)
+ return;
+
+ m_speech->data_w(space, 0, data & 0x3f);
+ m_speech->start_w(1);
+ m_speech->start_w(0);
+}
+
+
+// I8243 I/O expander
+
+template<int P>
+void card_state::ioexp_port_w(uint8_t data)
+{
+ // P4x-P7x: digit segment data
+ m_7seg_data = (m_7seg_data & ~(0xf << (4*P))) | ((data & 0xf) << (4*P));
+ prepare_display();
+
+ // P71 is tone (not on speech model)
+ if (P == 3 && m_dac != nullptr)
+ m_dac->write(BIT(data, 1));
+}
+
+
+// I8041 MCU
+
+WRITE8_MEMBER(card_state::mcu_p1_w)
+{
+ // P10-P17: select digits, input mux
+ m_inp_mux = m_led_select = data;
+ prepare_display();
+}
+
+READ8_MEMBER(card_state::mcu_p2_r)
+{
+ // P20-P23: I8243 P2
+ // P24-P27: multiplexed inputs (active low)
+ return (m_i8243->p2_r() & 0x0f) | (read_inputs(8) << 4 ^ 0xf0);
+}
+
+READ_LINE_MEMBER(card_state::mcu_t0_r)
+{
+ // T0: card scanner light sensor (1=white/none, 0=black)
+ return ~m_barcode & 1;
+}
+
+
+
+/******************************************************************************
+ Address Maps
+******************************************************************************/
+
+void card_state::main_map(address_map &map)
+{
+ map.unmap_value_high();
+ map(0x0000, 0x5fff).rom();
+ map(0x6000, 0x63ff).mirror(0x1c00).ram();
+ map(0xe000, 0xe000).mirror(0x1fff).w(FUNC(card_state::speech_w));
+}
+
+void card_state::main_io(address_map &map)
+{
+ map.global_mask(0x01);
+ map(0x00, 0x01).rw(m_mcu, FUNC(i8041_device::upi41_master_r), FUNC(i8041_device::upi41_master_w));
+}
+
+
+
+/******************************************************************************
+ Input Ports
+******************************************************************************/
+
+INPUT_CHANGED_MEMBER(card_state::start_scan)
+{
+ if (!newval)
+ return;
+
+ u32 code = (u32)(uintptr_t)param;
+ m_barcode = 0;
+
+ // convert bits to rising/falling edges
+ for (int i = 0; i < 9; i++)
+ {
+ m_barcode <<= 2;
+ m_barcode |= 1 << (code & 1);
+ code >>= 1;
+ }
+
+ m_barcode <<= 1; // in case next barcode_shift timeout is soon
+}
+
+INPUT_CHANGED_MEMBER(card_state::reset_button)
+{
+ // reset button is directly wired to maincpu/mcu RESET pins
+ m_maincpu->set_input_line(INPUT_LINE_RESET, newval ? ASSERT_LINE : CLEAR_LINE);
+ m_mcu->set_input_line(INPUT_LINE_RESET, newval ? ASSERT_LINE : CLEAR_LINE);
+}
+
+static INPUT_PORTS_START( scanner )
+ PORT_START("CARDS.0") // spades + jokers
+ PORT_BIT(0x0001, IP_ACTIVE_HIGH, IPT_OTHER) PORT_CHANGED_MEMBER(DEVICE_SELF, card_state, start_scan, 0x6f) PORT_NAME("Scan: Spades A")
+ PORT_BIT(0x0002, IP_ACTIVE_HIGH, IPT_OTHER) PORT_CHANGED_MEMBER(DEVICE_SELF, card_state, start_scan, 0x47) PORT_NAME("Scan: Spades 2")
+ PORT_BIT(0x0004, IP_ACTIVE_HIGH, IPT_OTHER) PORT_CHANGED_MEMBER(DEVICE_SELF, card_state, start_scan, 0xd7) PORT_NAME("Scan: Spades 3")
+ PORT_BIT(0x0008, IP_ACTIVE_HIGH, IPT_OTHER) PORT_CHANGED_MEMBER(DEVICE_SELF, card_state, start_scan, 0x27) PORT_NAME("Scan: Spades 4")
+ PORT_BIT(0x0010, IP_ACTIVE_HIGH, IPT_OTHER) PORT_CHANGED_MEMBER(DEVICE_SELF, card_state, start_scan, 0xb7) PORT_NAME("Scan: Spades 5")
+ PORT_BIT(0x0020, IP_ACTIVE_HIGH, IPT_OTHER) PORT_CHANGED_MEMBER(DEVICE_SELF, card_state, start_scan, 0x77) PORT_NAME("Scan: Spades 6")
+ PORT_BIT(0x0040, IP_ACTIVE_HIGH, IPT_OTHER) PORT_CHANGED_MEMBER(DEVICE_SELF, card_state, start_scan, 0xe7) PORT_NAME("Scan: Spades 7")
+ PORT_BIT(0x0080, IP_ACTIVE_HIGH, IPT_OTHER) PORT_CHANGED_MEMBER(DEVICE_SELF, card_state, start_scan, 0x0f) PORT_NAME("Scan: Spades 8")
+ PORT_BIT(0x0100, IP_ACTIVE_HIGH, IPT_OTHER) PORT_CHANGED_MEMBER(DEVICE_SELF, card_state, start_scan, 0x9f) PORT_NAME("Scan: Spades 9")
+ PORT_BIT(0x0200, IP_ACTIVE_HIGH, IPT_OTHER) PORT_CHANGED_MEMBER(DEVICE_SELF, card_state, start_scan, 0x5f) PORT_NAME("Scan: Spades 10")
+ PORT_BIT(0x0400, IP_ACTIVE_HIGH, IPT_OTHER) PORT_CHANGED_MEMBER(DEVICE_SELF, card_state, start_scan, 0xcf) PORT_NAME("Scan: Spades J")
+ PORT_BIT(0x0800, IP_ACTIVE_HIGH, IPT_OTHER) PORT_CHANGED_MEMBER(DEVICE_SELF, card_state, start_scan, 0x3f) PORT_NAME("Scan: Spades Q")
+ PORT_BIT(0x1000, IP_ACTIVE_HIGH, IPT_OTHER) PORT_CHANGED_MEMBER(DEVICE_SELF, card_state, start_scan, 0xaf) PORT_NAME("Scan: Spades K")
+ PORT_BIT(0x2000, IP_ACTIVE_HIGH, IPT_OTHER) PORT_CHANGED_MEMBER(DEVICE_SELF, card_state, start_scan, 0xf9) PORT_NAME("Scan: Joker 1")
+ PORT_BIT(0x4000, IP_ACTIVE_HIGH, IPT_OTHER) PORT_CHANGED_MEMBER(DEVICE_SELF, card_state, start_scan, 0xed) PORT_NAME("Scan: Joker 2")
+
+ PORT_START("CARDS.1") // hearts
+ PORT_BIT(0x0001, IP_ACTIVE_HIGH, IPT_OTHER) PORT_CHANGED_MEMBER(DEVICE_SELF, card_state, start_scan, 0x7b) PORT_NAME("Scan: Hearts A")
+ PORT_BIT(0x0002, IP_ACTIVE_HIGH, IPT_OTHER) PORT_CHANGED_MEMBER(DEVICE_SELF, card_state, start_scan, 0x53) PORT_NAME("Scan: Hearts 2")
+ PORT_BIT(0x0004, IP_ACTIVE_HIGH, IPT_OTHER) PORT_CHANGED_MEMBER(DEVICE_SELF, card_state, start_scan, 0xc3) PORT_NAME("Scan: Hearts 3")
+ PORT_BIT(0x0008, IP_ACTIVE_HIGH, IPT_OTHER) PORT_CHANGED_MEMBER(DEVICE_SELF, card_state, start_scan, 0x33) PORT_NAME("Scan: Hearts 4")
+ PORT_BIT(0x0010, IP_ACTIVE_HIGH, IPT_OTHER) PORT_CHANGED_MEMBER(DEVICE_SELF, card_state, start_scan, 0xa3) PORT_NAME("Scan: Hearts 5")
+ PORT_BIT(0x0020, IP_ACTIVE_HIGH, IPT_OTHER) PORT_CHANGED_MEMBER(DEVICE_SELF, card_state, start_scan, 0x63) PORT_NAME("Scan: Hearts 6")
+ PORT_BIT(0x0040, IP_ACTIVE_HIGH, IPT_OTHER) PORT_CHANGED_MEMBER(DEVICE_SELF, card_state, start_scan, 0xf3) PORT_NAME("Scan: Hearts 7")
+ PORT_BIT(0x0080, IP_ACTIVE_HIGH, IPT_OTHER) PORT_CHANGED_MEMBER(DEVICE_SELF, card_state, start_scan, 0x1b) PORT_NAME("Scan: Hearts 8")
+ PORT_BIT(0x0100, IP_ACTIVE_HIGH, IPT_OTHER) PORT_CHANGED_MEMBER(DEVICE_SELF, card_state, start_scan, 0x8b) PORT_NAME("Scan: Hearts 9")
+ PORT_BIT(0x0200, IP_ACTIVE_HIGH, IPT_OTHER) PORT_CHANGED_MEMBER(DEVICE_SELF, card_state, start_scan, 0x4b) PORT_NAME("Scan: Hearts 10")
+ PORT_BIT(0x0400, IP_ACTIVE_HIGH, IPT_OTHER) PORT_CHANGED_MEMBER(DEVICE_SELF, card_state, start_scan, 0xdb) PORT_NAME("Scan: Hearts J")
+ PORT_BIT(0x0800, IP_ACTIVE_HIGH, IPT_OTHER) PORT_CHANGED_MEMBER(DEVICE_SELF, card_state, start_scan, 0x2b) PORT_NAME("Scan: Hearts Q")
+ PORT_BIT(0x1000, IP_ACTIVE_HIGH, IPT_OTHER) PORT_CHANGED_MEMBER(DEVICE_SELF, card_state, start_scan, 0xbb) PORT_NAME("Scan: Hearts K")
+
+ PORT_START("CARDS.2") // clubs
+ PORT_BIT(0x0001, IP_ACTIVE_HIGH, IPT_OTHER) PORT_CHANGED_MEMBER(DEVICE_SELF, card_state, start_scan, 0x69) PORT_NAME("Scan: Clubs A")
+ PORT_BIT(0x0002, IP_ACTIVE_HIGH, IPT_OTHER) PORT_CHANGED_MEMBER(DEVICE_SELF, card_state, start_scan, 0x95) PORT_NAME("Scan: Clubs 2")
+ PORT_BIT(0x0004, IP_ACTIVE_HIGH, IPT_OTHER) PORT_CHANGED_MEMBER(DEVICE_SELF, card_state, start_scan, 0xd1) PORT_NAME("Scan: Clubs 3")
+ PORT_BIT(0x0008, IP_ACTIVE_HIGH, IPT_OTHER) PORT_CHANGED_MEMBER(DEVICE_SELF, card_state, start_scan, 0x93) PORT_NAME("Scan: Clubs 4")
+ PORT_BIT(0x0010, IP_ACTIVE_HIGH, IPT_OTHER) PORT_CHANGED_MEMBER(DEVICE_SELF, card_state, start_scan, 0xb1) PORT_NAME("Scan: Clubs 5")
+ PORT_BIT(0x0020, IP_ACTIVE_HIGH, IPT_OTHER) PORT_CHANGED_MEMBER(DEVICE_SELF, card_state, start_scan, 0x71) PORT_NAME("Scan: Clubs 6")
+ PORT_BIT(0x0040, IP_ACTIVE_HIGH, IPT_OTHER) PORT_CHANGED_MEMBER(DEVICE_SELF, card_state, start_scan, 0xe1) PORT_NAME("Scan: Clubs 7")
+ PORT_BIT(0x0080, IP_ACTIVE_HIGH, IPT_OTHER) PORT_CHANGED_MEMBER(DEVICE_SELF, card_state, start_scan, 0x87) PORT_NAME("Scan: Clubs 8")
+ PORT_BIT(0x0100, IP_ACTIVE_HIGH, IPT_OTHER) PORT_CHANGED_MEMBER(DEVICE_SELF, card_state, start_scan, 0x99) PORT_NAME("Scan: Clubs 9")
+ PORT_BIT(0x0200, IP_ACTIVE_HIGH, IPT_OTHER) PORT_CHANGED_MEMBER(DEVICE_SELF, card_state, start_scan, 0x59) PORT_NAME("Scan: Clubs 10")
+ PORT_BIT(0x0400, IP_ACTIVE_HIGH, IPT_OTHER) PORT_CHANGED_MEMBER(DEVICE_SELF, card_state, start_scan, 0xc9) PORT_NAME("Scan: Clubs J")
+ PORT_BIT(0x0800, IP_ACTIVE_HIGH, IPT_OTHER) PORT_CHANGED_MEMBER(DEVICE_SELF, card_state, start_scan, 0x39) PORT_NAME("Scan: Clubs Q")
+ PORT_BIT(0x1000, IP_ACTIVE_HIGH, IPT_OTHER) PORT_CHANGED_MEMBER(DEVICE_SELF, card_state, start_scan, 0xa9) PORT_NAME("Scan: Clubs K")
+
+ PORT_START("CARDS.3") // diamonds
+ PORT_BIT(0x0001, IP_ACTIVE_HIGH, IPT_OTHER) PORT_CHANGED_MEMBER(DEVICE_SELF, card_state, start_scan, 0x7d) PORT_NAME("Scan: Diamonds A")
+ PORT_BIT(0x0002, IP_ACTIVE_HIGH, IPT_OTHER) PORT_CHANGED_MEMBER(DEVICE_SELF, card_state, start_scan, 0x55) PORT_NAME("Scan: Diamonds 2")
+ PORT_BIT(0x0004, IP_ACTIVE_HIGH, IPT_OTHER) PORT_CHANGED_MEMBER(DEVICE_SELF, card_state, start_scan, 0xc5) PORT_NAME("Scan: Diamonds 3")
+ PORT_BIT(0x0008, IP_ACTIVE_HIGH, IPT_OTHER) PORT_CHANGED_MEMBER(DEVICE_SELF, card_state, start_scan, 0x35) PORT_NAME("Scan: Diamonds 4")
+ PORT_BIT(0x0010, IP_ACTIVE_HIGH, IPT_OTHER) PORT_CHANGED_MEMBER(DEVICE_SELF, card_state, start_scan, 0xa5) PORT_NAME("Scan: Diamonds 5")
+ PORT_BIT(0x0020, IP_ACTIVE_HIGH, IPT_OTHER) PORT_CHANGED_MEMBER(DEVICE_SELF, card_state, start_scan, 0x65) PORT_NAME("Scan: Diamonds 6")
+ PORT_BIT(0x0040, IP_ACTIVE_HIGH, IPT_OTHER) PORT_CHANGED_MEMBER(DEVICE_SELF, card_state, start_scan, 0xf5) PORT_NAME("Scan: Diamonds 7")
+ PORT_BIT(0x0080, IP_ACTIVE_HIGH, IPT_OTHER) PORT_CHANGED_MEMBER(DEVICE_SELF, card_state, start_scan, 0x1d) PORT_NAME("Scan: Diamonds 8")
+ PORT_BIT(0x0100, IP_ACTIVE_HIGH, IPT_OTHER) PORT_CHANGED_MEMBER(DEVICE_SELF, card_state, start_scan, 0x8d) PORT_NAME("Scan: Diamonds 9")
+ PORT_BIT(0x0200, IP_ACTIVE_HIGH, IPT_OTHER) PORT_CHANGED_MEMBER(DEVICE_SELF, card_state, start_scan, 0x4d) PORT_NAME("Scan: Diamonds 10")
+ PORT_BIT(0x0400, IP_ACTIVE_HIGH, IPT_OTHER) PORT_CHANGED_MEMBER(DEVICE_SELF, card_state, start_scan, 0xdd) PORT_NAME("Scan: Diamonds J")
+ PORT_BIT(0x0800, IP_ACTIVE_HIGH, IPT_OTHER) PORT_CHANGED_MEMBER(DEVICE_SELF, card_state, start_scan, 0x2d) PORT_NAME("Scan: Diamonds Q")
+ PORT_BIT(0x1000, IP_ACTIVE_HIGH, IPT_OTHER) PORT_CHANGED_MEMBER(DEVICE_SELF, card_state, start_scan, 0xbd) PORT_NAME("Scan: Diamonds K")
+INPUT_PORTS_END
+
+static INPUT_PORTS_START( brc )
+ PORT_INCLUDE( scanner )
+
+ PORT_START("IN.0")
+ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_I) PORT_CODE(KEYCODE_PLUS_PAD) PORT_NAME("A")
+ PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_0_PAD) PORT_NAME("10")
+ PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("6")
+ PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("2")
+
+ PORT_START("IN.1")
+ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_U) PORT_CODE(KEYCODE_MINUS_PAD) PORT_NAME("K")
+ PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) PORT_NAME("9")
+ PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("5")
+ PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("1")
+
+ PORT_START("IN.2")
+ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_Y) PORT_CODE(KEYCODE_ASTERISK) PORT_NAME("Q")
+ PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("8")
+ PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("4")
+ PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_SLASH) PORT_NAME("P")
+
+ PORT_START("IN.3")
+ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_T) PORT_CODE(KEYCODE_SLASH_PAD) PORT_NAME("J")
+ PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("7")
+ PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("3")
+ PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_STOP) PORT_NAME("NT")
+
+ PORT_START("IN.4")
+ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_R) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("EN")
+ PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_F) PORT_NAME("SC")
+ PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_V) PORT_NAME("PL")
+ PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_COMMA) PORT_NAME("Spades")
+
+ PORT_START("IN.5")
+ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_E) PORT_CODE(KEYCODE_DEL) PORT_CODE(KEYCODE_BACKSPACE) PORT_NAME("CL")
+ PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_D) PORT_NAME("DB")
+ PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_C) PORT_NAME("VL")
+ PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_M) PORT_NAME("Hearts")
+
+ PORT_START("IN.6")
+ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_W) PORT_CODE(KEYCODE_SPACE) PORT_NAME("Speaker")
+ PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_S) PORT_NAME("PB")
+ PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_X) PORT_NAME("CV")
+ PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_N) PORT_NAME("Diamonds")
+
+ PORT_START("IN.7")
+ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD)
+ PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_A) PORT_NAME("BR")
+ PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_Z) PORT_NAME("DL")
+ PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_B) PORT_NAME("Clubs")
+
+ PORT_START("RESET") // is not on matrix IN.7 d0
+ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_Q) PORT_CHANGED_MEMBER(DEVICE_SELF, card_state, reset_button, nullptr) PORT_NAME("RE")
+INPUT_PORTS_END
+
+static INPUT_PORTS_START( bv3 )
+ PORT_INCLUDE( brc )
+
+ PORT_MODIFY("IN.0")
+ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_I) PORT_CODE(KEYCODE_PLUS_PAD) PORT_NAME("Ace")
+
+ PORT_MODIFY("IN.1")
+ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_U) PORT_CODE(KEYCODE_MINUS_PAD) PORT_NAME("King")
+
+ PORT_MODIFY("IN.2")
+ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_Y) PORT_CODE(KEYCODE_ASTERISK) PORT_NAME("Queen")
+ PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_SLASH) PORT_NAME("Quit")
+
+ PORT_MODIFY("IN.3")
+ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_T) PORT_CODE(KEYCODE_SLASH_PAD) PORT_NAME("Jack")
+ PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_STOP) PORT_NAME("No Trump")
+
+ PORT_MODIFY("IN.4")
+ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_R) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("Yes/Enter")
+ PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_F) PORT_NAME("No/Pass")
+ PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_V) PORT_NAME("Player")
+
+ PORT_MODIFY("IN.5")
+ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_E) PORT_CODE(KEYCODE_DEL) PORT_CODE(KEYCODE_BACKSPACE) PORT_NAME("Clear")
+ PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_D) PORT_NAME("Double")
+ PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_C) PORT_NAME("Score")
+
+ PORT_MODIFY("IN.6")
+ PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_S) PORT_NAME("Auto")
+ PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_X) PORT_NAME("Conv")
+
+ PORT_MODIFY("IN.7")
+ PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_A) PORT_NAME("Review")
+ PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_Z) PORT_NAME("Dealer")
+
+ PORT_MODIFY("RESET")
+ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_Q) PORT_CHANGED_MEMBER(DEVICE_SELF, card_state, reset_button, nullptr) PORT_NAME("Reset")
+INPUT_PORTS_END
+
+static INPUT_PORTS_START( gin )
+ PORT_INCLUDE( bv3 )
+
+ PORT_MODIFY("IN.2")
+ PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_SLASH) PORT_NAME("Human")
+
+ PORT_MODIFY("IN.3")
+ PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_STOP) PORT_NAME("Computer")
+
+ PORT_MODIFY("IN.4")
+ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_R) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("Yes/Go")
+ PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_F) PORT_NAME("No")
+ PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_V) PORT_NAME("Hand")
+
+ PORT_MODIFY("IN.5")
+ PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_D) PORT_NAME("Score")
+ PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_C) PORT_NAME("Conv")
+
+ PORT_MODIFY("IN.6")
+ PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_S) PORT_NAME("Quit")
+ PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_X) PORT_NAME("Language")
+
+ PORT_MODIFY("IN.7")
+ PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_A) PORT_NAME("Knock")
+ PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_Z) PORT_NAME("Dealer")
+INPUT_PORTS_END
+
+
+
+/******************************************************************************
+ Machine Drivers
+******************************************************************************/
+
+void card_state::brc_base(machine_config &config)
+{
+ /* basic machine hardware */
+ Z80(config, m_maincpu, 5_MHz_XTAL/2);
+ m_maincpu->set_addrmap(AS_PROGRAM, &card_state::main_map);
+ m_maincpu->set_addrmap(AS_IO, &card_state::main_io);
+ config.m_perfect_cpu_quantum = subtag("maincpu");
+
+ I8041(config, m_mcu, 5_MHz_XTAL);
+ m_mcu->p1_out_cb().set(FUNC(card_state::mcu_p1_w));
+ m_mcu->p2_in_cb().set(FUNC(card_state::mcu_p2_r));
+ m_mcu->p2_out_cb().set(m_i8243, FUNC(i8243_device::p2_w));
+ m_mcu->prog_out_cb().set(m_i8243, FUNC(i8243_device::prog_w));
+ m_mcu->t0_in_cb().set(FUNC(card_state::mcu_t0_r));
+
+ // MCU T1 tied to master clock / 4
+ CLOCK(config, "t1_clock", 5_MHz_XTAL/4).signal_handler().set_nop();
+ m_mcu->t1_in_cb().set("t1_clock", FUNC(clock_device::signal_r)).invert();
+
+ I8243(config, m_i8243);
+ m_i8243->p4_out_cb().set(FUNC(card_state::ioexp_port_w<0>));
+ m_i8243->p5_out_cb().set(FUNC(card_state::ioexp_port_w<1>));
+ m_i8243->p6_out_cb().set(FUNC(card_state::ioexp_port_w<2>));
+ m_i8243->p7_out_cb().set(FUNC(card_state::ioexp_port_w<3>));
+
+ TIMER(config, "barcode_shift").configure_periodic(FUNC(card_state::barcode_shift), attotime::from_msec(2));
+
+ TIMER(config, "display_decay").configure_periodic(FUNC(card_state::display_decay_tick), attotime::from_msec(1));
+ config.set_default_layout(layout_fidel_brc);
+}
+
+void card_state::ubc(machine_config &config)
+{
+ brc_base(config);
+
+ /* sound hardware */
+ SPEAKER(config, "speaker").front_center();
+ DAC_1BIT(config, m_dac).add_route(ALL_OUTPUTS, "speaker", 0.25);
+ VOLTAGE_REGULATOR(config, "vref").add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT);
+}
+
+void card_state::vbrc(machine_config &config)
+{
+ brc_base(config);
+
+ /* sound hardware */
+ SPEAKER(config, "speaker").front_center();
+ S14001A(config, m_speech, 25000); // R/C circuit, around 25khz
+ m_speech->bsy().set_inputline("maincpu", Z80_INPUT_LINE_WAIT);
+ m_speech->add_route(ALL_OUTPUTS, "speaker", 0.75);
+}
+
+void card_state::bv3(machine_config &config)
+{
+ vbrc(config);
+ config.set_default_layout(layout_fidel_bv3);
+}
+
+void card_state::gin(machine_config &config)
+{
+ ubc(config);
+ config.set_default_layout(layout_fidel_gin);
+}
+
+
+
+/******************************************************************************
+ ROM Definitions
+******************************************************************************/
+
+ROM_START( vbrc ) // model VBRC aka 7002
+ ROM_REGION( 0x10000, "maincpu", 0 )
+ ROM_LOAD("101-64108", 0x0000, 0x2000, CRC(08472223) SHA1(859865b13c908dbb474333263dc60f6a32461141) ) // NEC 2364
+ ROM_LOAD("101-64109", 0x2000, 0x2000, CRC(320afa0f) SHA1(90edfe0ac19b108d232cda376b03a3a24befad4c) ) // NEC 2364
+ ROM_LOAD("101-64110", 0x4000, 0x2000, CRC(3040d0bd) SHA1(caa55fc8d9196e408fb41e7171a68e5099519813) ) // NEC 2364
+
+ ROM_REGION( 0x0400, "mcu", 0 )
+ ROM_LOAD("100-1009", 0x0000, 0x0400, CRC(60eb343f) SHA1(8a63e95ebd62e123bdecc330c0484a47c354bd1a) )
+
+ ROM_REGION( 0x1000, "speech", 0 )
+ ROM_LOAD("101-32118", 0x0000, 0x1000, CRC(a0b8bb8f) SHA1(f56852108928d5c6caccfc8166fa347d6760a740) )
+ROM_END
+
+ROM_START( bridgeca ) // model UBC
+ ROM_REGION( 0x10000, "maincpu", 0 )
+ ROM_LOAD("101-64108", 0x0000, 0x2000, CRC(08472223) SHA1(859865b13c908dbb474333263dc60f6a32461141) )
+ ROM_LOAD("101-64109", 0x2000, 0x2000, CRC(320afa0f) SHA1(90edfe0ac19b108d232cda376b03a3a24befad4c) )
+ ROM_LOAD("101-64110", 0x4000, 0x2000, CRC(3040d0bd) SHA1(caa55fc8d9196e408fb41e7171a68e5099519813) )
+
+ ROM_REGION( 0x0400, "mcu", 0 )
+ ROM_LOAD("100-1009", 0x0000, 0x0400, CRC(60eb343f) SHA1(8a63e95ebd62e123bdecc330c0484a47c354bd1a) )
+ROM_END
+
+
+ROM_START( bridgec3 ) // model BV3 aka 7014, PCB label 510-1016 Rev.1
+ ROM_REGION( 0x10000, "maincpu", 0 )
+ ROM_LOAD("7014_white", 0x0000, 0x2000, CRC(eb1620ef) SHA1(987a9abc8c685f1a68678ea4ee65ec4a99419179) ) // TMM2764AD-20, white sticker
+ ROM_LOAD("7014_red", 0x2000, 0x2000, CRC(74af0019) SHA1(8dc05950c254ca050b95b93e5d0cf48f913a6d49) ) // TMM2764AD-20, red sticker
+ ROM_LOAD("7014_blue", 0x4000, 0x2000, CRC(341d9ca6) SHA1(370876573bb9408e75f4fc797304b6c64af0590a) ) // TMM2764AD-20, blue sticker
+
+ ROM_REGION( 0x0400, "mcu", 0 )
+ ROM_LOAD("100-1009", 0x0000, 0x0400, CRC(60eb343f) SHA1(8a63e95ebd62e123bdecc330c0484a47c354bd1a) ) // NEC P07021-027 || D8041C 563 100-1009
+
+ ROM_REGION( 0x1000, "speech", 0 )
+ ROM_LOAD("101-32118", 0x0000, 0x1000, CRC(a0b8bb8f) SHA1(f56852108928d5c6caccfc8166fa347d6760a740) ) // ea 101-32118 || (C) 1980 || EA 8332A247-4 || 8034
+ROM_END
+
+
+ROM_START( gincribc ) // model GIN, PCB label 510-4020-1C
+ ROM_REGION( 0x10000, "maincpu", ROMREGION_ERASEFF )
+ ROM_LOAD("101-1036a01", 0x0000, 0x2000, CRC(30d8d900) SHA1(b31a4acc52143baad28a35ec515ab30d7b39683a) ) // MOSTEK MK36974N-5
+ ROM_LOAD("101-1037a02", 0x2000, 0x2000, CRC(8802a71b) SHA1(416350acc1cbf38ff74194d49916b848bf6c2330) ) // MOSTEK MK36976N-5
+ ROM_LOAD("bridge-3", 0x4000, 0x1000, CRC(d3cda2e3) SHA1(69b62fa22b388a922abad4e89c78bdb01a5fb322) ) // NEC 2332C 188
+
+ ROM_REGION( 0x0400, "mcu", 0 )
+ ROM_LOAD("100-1009", 0x0000, 0x0400, CRC(60eb343f) SHA1(8a63e95ebd62e123bdecc330c0484a47c354bd1a) )
+ROM_END
+
+} // anonymous namespace
+
+
+
+/******************************************************************************
+ Drivers
+******************************************************************************/
+
+// YEAR NAME PARENT CMP MACHINE INPUT STATE INIT COMPANY, FULLNAME, FLAGS
+CONS( 1980, vbrc, 0, 0, vbrc, brc, card_state, empty_init, "Fidelity Electronics", "Voice Bridge Challenger", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
+CONS( 1980, bridgeca, vbrc, 0, ubc, brc, card_state, empty_init, "Fidelity Electronics", "Advanced Bridge Challenger", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
+
+CONS( 1982, bridgec3, 0, 0, bv3, bv3, card_state, empty_init, "Fidelity Electronics", "Bridge Challenger III", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
+
+CONS( 1982, gincribc, 0, 0, gin, gin, card_state, empty_init, "Fidelity Electronics", "Gin & Cribbage Challenger", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
diff --git a/src/mame/drivers/fidel_cc1.cpp b/src/mame/drivers/fidel_cc1.cpp
new file mode 100644
index 00000000000..cfee2fdda67
--- /dev/null
+++ b/src/mame/drivers/fidel_cc1.cpp
@@ -0,0 +1,221 @@
+// license:BSD-3-Clause
+// copyright-holders:hap
+// thanks-to:Berger, Sean Riddle
+/******************************************************************************
+*
+* fidel_cc1.cpp, subdriver of machine/fidelbase.cpp, machine/chessbase.cpp
+
+Fidelity's 1st generation chess computers:
+- *Chess Challenger
+- *Chess Challenger 3
+- *Chess Challenger 10 (UCC10)
+
+* denotes not dumped (actually CC1 is dumped, but with half of the contents missing)
+
+TODO:
+- driver is untested, but it should be easy to get working when a good dump
+ shows up (or a rom of CC3, even)
+
+*******************************************************************************
+
+Chess Challenger (1)
+--------------------
+This is the world's 1st released dedicated chess computer. Oddly, the rows/columns
+are reversed: left to right is 1-8, bottom to top is A-H, eg. pawn from D2 to D4
+is 4B to 4D here.
+
+PCB label PC-P-86, P179 C-2 7.77
+NEC 8080AF @ 2MHz(18MHz XTAL through a 8224)
+Everything goes via a NEC B8228, its special features are unused.
+NEC 2316A ROM(2KB), 4*2101AL RAM(0.5KB total)
+8255C for I/O, 4*7seg display + 2 extra leds, 12-key keypad
+
+Chess Challenger 3 is on the same hardware, but with double ROM size, and they
+corrected the reversed chess notation. It was also offered as an upgrade to CC1.
+
+Chess Challenger 10 version 'C'(model UCC10) is on (nearly) the same PCB too,
+label P179 C-3 9.77, with a small daughterboard for 8KB ROM. Again, it was also
+offered as an upgrade to CC1, or CC3.
+
+******************************************************************************/
+
+#include "emu.h"
+#include "includes/fidelbase.h"
+
+#include "cpu/i8085/i8085.h"
+#include "machine/i8255.h"
+
+// internal artwork
+#include "fidel_cc1.lh" // clickable
+
+
+namespace {
+
+class cc1_state : public fidelbase_state
+{
+public:
+ cc1_state(const machine_config &mconfig, device_type type, const char *tag) :
+ fidelbase_state(mconfig, type, tag),
+ m_ppi8255(*this, "ppi8255"),
+ m_delay(*this, "delay")
+ { }
+
+ // machine drivers
+ void cc1(machine_config &config);
+
+private:
+ // devices/pointers
+ required_device<i8255_device> m_ppi8255;
+ optional_device<timer_device> m_delay;
+
+ // address maps
+ void main_map(address_map &map);
+ void main_io(address_map &map);
+
+ // I/O handlers
+ void prepare_display();
+ DECLARE_READ8_MEMBER(ppi_porta_r);
+ DECLARE_WRITE8_MEMBER(ppi_portb_w);
+ DECLARE_WRITE8_MEMBER(ppi_portc_w);
+};
+
+
+/******************************************************************************
+ Devices, I/O
+******************************************************************************/
+
+// misc handlers
+
+void cc1_state::prepare_display()
+{
+ // 4 7segs + 2 leds
+ set_display_segmask(0xf, 0x7f);
+ display_matrix(7, 6, m_7seg_data, m_led_select);
+}
+
+
+// I8255 PPI
+
+READ8_MEMBER(cc1_state::ppi_porta_r)
+{
+ // 74148(priority encoder) I0-I7: inputs
+ // d0-d2: 74148 S0-S2, d3: 74148 GS
+ u8 data = count_leading_zeros(m_inp_matrix[0]->read()) - 24;
+
+ // d5-d7: more inputs (direct)
+ data |= ~m_inp_matrix[1]->read() << 5 & 0xe0;
+
+ // d4: 555 Q
+ return data | ((m_delay->enabled()) ? 0x10 : 0);
+}
+
+WRITE8_MEMBER(cc1_state::ppi_portb_w)
+{
+ // d0-d6: digit segment data
+ m_7seg_data = bitswap<7>(data,0,1,2,3,4,5,6);
+ prepare_display();
+}
+
+WRITE8_MEMBER(cc1_state::ppi_portc_w)
+{
+ // d6: trigger monostable 555 (R=15K, C=1uF)
+ if (~data & m_led_select & 0x40 && !m_delay->enabled())
+ m_delay->adjust(attotime::from_msec(17));
+
+ // d0-d3: digit select
+ // d4: check led, d5: lose led
+ m_led_select = data;
+ prepare_display();
+}
+
+
+
+/******************************************************************************
+ Address Maps
+******************************************************************************/
+
+void cc1_state::main_map(address_map &map)
+{
+ map.global_mask(0x1fff);
+ map(0x0000, 0x0fff).rom();
+ map(0x1000, 0x11ff).mirror(0x0e00).ram();
+}
+
+void cc1_state::main_io(address_map &map)
+{
+ map.global_mask(0x0f);
+ map(0x00, 0x03).mirror(0x04).rw(m_ppi8255, FUNC(i8255_device::read), FUNC(i8255_device::write));
+}
+
+
+
+/******************************************************************************
+ Input Ports
+******************************************************************************/
+
+static INPUT_PORTS_START( cc1 )
+ PORT_START("IN.0")
+ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("1") PORT_CODE(KEYCODE_1)
+ PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("2") PORT_CODE(KEYCODE_2)
+ PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("3") PORT_CODE(KEYCODE_3)
+ PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("4") PORT_CODE(KEYCODE_4)
+ PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("5") PORT_CODE(KEYCODE_5)
+ PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("6") PORT_CODE(KEYCODE_6)
+ PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("7") PORT_CODE(KEYCODE_7)
+ PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("8") PORT_CODE(KEYCODE_8)
+
+ PORT_START("IN.1")
+ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("9") PORT_CODE(KEYCODE_9)
+ PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("0") PORT_CODE(KEYCODE_0)
+ PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("-") PORT_CODE(KEYCODE_MINUS)
+
+ PORT_START("RESET")
+ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("RE") PORT_CODE(KEYCODE_R) PORT_CHANGED_MEMBER(DEVICE_SELF, cc1_state, reset_button, nullptr)
+INPUT_PORTS_END
+
+
+
+/******************************************************************************
+ Machine Drivers
+******************************************************************************/
+
+void cc1_state::cc1(machine_config &config)
+{
+ /* basic machine hardware */
+ I8080A(config, m_maincpu, 18_MHz_XTAL/9);
+ m_maincpu->set_addrmap(AS_PROGRAM, &cc1_state::main_map);
+ m_maincpu->set_addrmap(AS_IO, &cc1_state::main_io);
+
+ I8255(config, m_ppi8255);
+ m_ppi8255->in_pa_callback().set(FUNC(cc1_state::ppi_porta_r));
+ m_ppi8255->out_pb_callback().set(FUNC(cc1_state::ppi_portb_w));
+ m_ppi8255->tri_pb_callback().set_constant(0);
+ m_ppi8255->out_pc_callback().set(FUNC(cc1_state::ppi_portc_w));
+
+ TIMER(config, "delay").configure_generic(timer_device::expired_delegate());
+
+ TIMER(config, "display_decay").configure_periodic(FUNC(cc1_state::display_decay_tick), attotime::from_msec(1));
+ config.set_default_layout(layout_fidel_cc1);
+}
+
+
+
+/******************************************************************************
+ ROM Definitions
+******************************************************************************/
+
+ROM_START( cc1 )
+ ROM_REGION( 0x10000, "maincpu", ROMREGION_ERASEFF )
+ ROM_LOAD( "d2316ac_011", 0x0000, 0x0800, BAD_DUMP CRC(e27f9816) SHA1(ad9881b3bf8341829a27e86de27805fc2ccb5f7d) ) // A4 line was broken
+ROM_END
+
+} // anonymous namespace
+
+
+
+/******************************************************************************
+ Drivers
+******************************************************************************/
+
+// YEAR NAME PARENT CMP MACHINE INPUT STATE INIT COMPANY, FULLNAME, FLAGS
+CONS( 1977, cc1, 0, 0, cc1, cc1, cc1_state, empty_init, "Fidelity Electronics", "Chess Challenger", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_NO_SOUND_HW | MACHINE_NOT_WORKING )
diff --git a/src/mame/drivers/fidel_cc10.cpp b/src/mame/drivers/fidel_cc10.cpp
new file mode 100644
index 00000000000..128332a5001
--- /dev/null
+++ b/src/mame/drivers/fidel_cc10.cpp
@@ -0,0 +1,321 @@
+// license:BSD-3-Clause
+// copyright-holders:Jonathan Gevaryahu, Sandro Ronco, hap
+// thanks-to:Berger, Sean Riddle
+/******************************************************************************
+*
+* fidel_cc10.cpp, subdriver of machine/fidelbase.cpp, machine/chessbase.cpp
+
+TODO:
+- What is cc10 8255 PB.7 for? When set, maximum levels is 3, like in CC3. But
+ there is no CC3 with 16 buttons, and things get glitchy in this mode.
+
+*******************************************************************************
+
+Fidelity Chess Challenger 10 (CCX)
+-------------------
+3 versions are known to exist: A,B,C. Strangely, version C(UCC10) has an 8080
+instead of Z80 and no beeper, it's on CC1-based hardware.
+
+Z80A CPU @ 4MHz, NEC D8255C
+4KB ROM(NEC 2332A), 2*256 bytes RAM(4*NEC 2111AL-4)
+The beeper is via a 556 timer, fixed-frequency at around 1300-1400Hz.
+
+Checker Challenger 4 (ACR) is on the same PCB, twice less RAM and the beeper gone.
+
+******************************************************************************/
+
+#include "emu.h"
+#include "includes/fidelbase.h"
+
+#include "cpu/z80/z80.h"
+#include "machine/i8255.h"
+#include "sound/beep.h"
+#include "speaker.h"
+
+// internal artwork
+#include "fidel_acr.lh" // clickable
+#include "fidel_cc10.lh" // clickable
+
+
+namespace {
+
+class ccx_state : public fidelbase_state
+{
+public:
+ ccx_state(const machine_config &mconfig, device_type type, const char *tag) :
+ fidelbase_state(mconfig, type, tag),
+ m_ppi8255(*this, "ppi8255"),
+ m_beeper_off(*this, "beeper_off"),
+ m_beeper(*this, "beeper")
+ { }
+
+ // machine drivers
+ void acr(machine_config &config);
+ void ccx(machine_config &config);
+
+private:
+ // devices/pointers
+ required_device<i8255_device> m_ppi8255;
+ optional_device<timer_device> m_beeper_off;
+ optional_device<beep_device> m_beeper;
+
+ TIMER_DEVICE_CALLBACK_MEMBER(beeper_off) { m_beeper->set_state(0); }
+
+ // address maps
+ void acr_map(address_map &map);
+ void ccx_map(address_map &map);
+ void main_trampoline(address_map &map);
+ void main_io(address_map &map);
+
+ u8 main_trampoline_r(offs_t offset);
+ void main_trampoline_w(offs_t offset, u8 data);
+
+ // I/O handlers
+ void prepare_display();
+ DECLARE_WRITE8_MEMBER(ppi_porta_w);
+ DECLARE_WRITE8_MEMBER(ppi_portb_w);
+ DECLARE_READ8_MEMBER(ppi_portc_r);
+ DECLARE_WRITE8_MEMBER(ppi_portc_w);
+};
+
+
+/******************************************************************************
+ Devices, I/O
+******************************************************************************/
+
+// misc handlers
+
+void ccx_state::prepare_display()
+{
+ // 4 7segs + 2 leds
+ set_display_segmask(0xf, 0x7f);
+ display_matrix(8, 6, m_7seg_data, m_led_select);
+}
+
+
+// I8255 PPI
+
+WRITE8_MEMBER(ccx_state::ppi_porta_w)
+{
+ // d7: enable beeper on falling edge (556 monostable) (unpopulated on ACR)
+ if (m_beeper != nullptr && ~data & m_7seg_data & 0x80 && !m_beeper_off->enabled())
+ {
+ m_beeper->set_state(1);
+ m_beeper_off->adjust(attotime::from_msec(80)); // duration is approximate
+ }
+
+ // d0-d6: digit segment data
+ m_7seg_data = bitswap<8>(data,7,0,1,2,3,4,5,6);
+ prepare_display();
+}
+
+WRITE8_MEMBER(ccx_state::ppi_portb_w)
+{
+ // d0: lose led, d1: check(win) led
+ // d2-d5: digit select
+ m_led_select = bitswap<6>(data,0,1,5,4,3,2);
+ prepare_display();
+}
+
+READ8_MEMBER(ccx_state::ppi_portc_r)
+{
+ // d0-d3: multiplexed inputs (active low)
+ return ~read_inputs(4) & 0xf;
+}
+
+WRITE8_MEMBER(ccx_state::ppi_portc_w)
+{
+ // d4-d7: input mux (inverted)
+ m_inp_mux = ~data >> 4 & 0xf;
+}
+
+
+
+/******************************************************************************
+ Address Maps
+******************************************************************************/
+
+void ccx_state::acr_map(address_map &map)
+{
+ map.unmap_value_high();
+ map(0x0000, 0x0fff).rom().region("maincpu", 0); // _A12
+ map(0x2000, 0x20ff).mirror(0x0f00).ram(); // A13
+}
+
+void ccx_state::ccx_map(address_map &map)
+{
+ acr_map(map);
+ map(0x4000, 0x40ff).mirror(0x0f00).ram(); // A14
+}
+
+// PCB design is prone to bus conflicts, but assuming software behaves fine,
+// it will access ROM at $0xxx, RAM at $3xxx and $5xxx
+void ccx_state::main_trampoline_w(offs_t offset, u8 data)
+{
+ if (offset & 0x2000)
+ m_mainmap->write8(offset & 0x2fff, data);
+ if (offset & 0x4000)
+ m_mainmap->write8(offset & 0x4fff, data);
+}
+
+u8 ccx_state::main_trampoline_r(offs_t offset)
+{
+ u8 data = 0xff;
+ if (~offset & 0x1000)
+ data &= m_mainmap->read8(offset & 0x0fff);
+ if (offset & 0x2000)
+ data &= m_mainmap->read8(offset & 0x2fff);
+ if (offset & 0x4000)
+ data &= m_mainmap->read8(offset & 0x4fff);
+
+ return data;
+}
+
+void ccx_state::main_trampoline(address_map &map)
+{
+ map.global_mask(0x7fff);
+ map(0x0000, 0x7fff).rw(FUNC(ccx_state::main_trampoline_r), FUNC(ccx_state::main_trampoline_w));
+}
+
+void ccx_state::main_io(address_map &map)
+{
+ map.global_mask(0x03);
+ map(0x00, 0x03).rw(m_ppi8255, FUNC(i8255_device::read), FUNC(i8255_device::write));
+}
+
+
+
+/******************************************************************************
+ Input Ports
+******************************************************************************/
+
+static INPUT_PORTS_START( ccx )
+ PORT_START("IN.0")
+ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_UNUSED)
+ PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("LV") PORT_CODE(KEYCODE_L)
+ PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("A1") PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_CODE(KEYCODE_A)
+ PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("E5") PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_CODE(KEYCODE_E)
+
+ PORT_START("IN.1")
+ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Speaker") PORT_CODE(KEYCODE_SPACE)
+ PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("DM") PORT_CODE(KEYCODE_M)
+ PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("B2") PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_CODE(KEYCODE_B)
+ PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("F6") PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_CODE(KEYCODE_F)
+
+ PORT_START("IN.2")
+ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("CL") PORT_CODE(KEYCODE_DEL) PORT_CODE(KEYCODE_BACKSPACE)
+ PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("PB") PORT_CODE(KEYCODE_O)
+ PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("C3") PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_CODE(KEYCODE_C)
+ PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("G7") PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_CODE(KEYCODE_G)
+
+ PORT_START("IN.3")
+ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("EN") PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD)
+ PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("PV") PORT_CODE(KEYCODE_V)
+ PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("D4") PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_CODE(KEYCODE_D)
+ PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("H8") PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_CODE(KEYCODE_H)
+
+ PORT_START("RESET") // is not on matrix IN.0 d0
+ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("RE") PORT_CODE(KEYCODE_R) PORT_CHANGED_MEMBER(DEVICE_SELF, ccx_state, reset_button, nullptr)
+INPUT_PORTS_END
+
+static INPUT_PORTS_START( acr )
+ PORT_START("IN.0")
+ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_UNUSED)
+ PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("LV") PORT_CODE(KEYCODE_L)
+ PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("PV") PORT_CODE(KEYCODE_V)
+ PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("0") PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_0_PAD)
+
+ PORT_START("IN.1")
+ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("CL") PORT_CODE(KEYCODE_DEL) PORT_CODE(KEYCODE_BACKSPACE)
+ PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("7") PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD)
+ PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("4") PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD)
+ PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("1") PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD)
+
+ PORT_START("IN.2")
+ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("TO") PORT_CODE(KEYCODE_T)
+ PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("8") PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD)
+ PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("5") PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD)
+ PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("2") PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD)
+
+ PORT_START("IN.3")
+ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("EN") PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD)
+ PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("9") PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD)
+ PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("6") PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD)
+ PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("3") PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD)
+
+ PORT_START("RESET") // is not on matrix IN.0 d0
+ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("RE") PORT_CODE(KEYCODE_R) PORT_CHANGED_MEMBER(DEVICE_SELF, ccx_state, reset_button, nullptr)
+INPUT_PORTS_END
+
+
+
+/******************************************************************************
+ Machine Drivers
+******************************************************************************/
+
+void ccx_state::acr(machine_config &config)
+{
+ /* basic machine hardware */
+ Z80(config, m_maincpu, 4_MHz_XTAL);
+ m_maincpu->set_addrmap(AS_PROGRAM, &ccx_state::main_trampoline);
+ ADDRESS_MAP_BANK(config, m_mainmap).set_map(&ccx_state::acr_map).set_options(ENDIANNESS_LITTLE, 8, 16);
+ m_maincpu->set_addrmap(AS_IO, &ccx_state::main_io);
+
+ I8255(config, m_ppi8255);
+ m_ppi8255->out_pa_callback().set(FUNC(ccx_state::ppi_porta_w));
+ m_ppi8255->tri_pa_callback().set_constant(0);
+ m_ppi8255->in_pb_callback().set_constant(0);
+ m_ppi8255->out_pb_callback().set(FUNC(ccx_state::ppi_portb_w));
+ m_ppi8255->tri_pb_callback().set_constant(0);
+ m_ppi8255->in_pc_callback().set(FUNC(ccx_state::ppi_portc_r));
+ m_ppi8255->out_pc_callback().set(FUNC(ccx_state::ppi_portc_w));
+
+ TIMER(config, "display_decay").configure_periodic(FUNC(ccx_state::display_decay_tick), attotime::from_msec(1));
+ config.set_default_layout(layout_fidel_acr);
+}
+
+void ccx_state::ccx(machine_config &config)
+{
+ acr(config);
+
+ /* basic machine hardware */
+ m_mainmap->set_addrmap(AS_PROGRAM, &ccx_state::ccx_map);
+
+ config.set_default_layout(layout_fidel_cc10);
+
+ /* sound hardware */
+ SPEAKER(config, "speaker").front_center();
+ BEEP(config, m_beeper, 1360); // approximation, from 556 timer ic
+ m_beeper->add_route(ALL_OUTPUTS, "speaker", 0.25);
+ TIMER(config, "beeper_off").configure_generic(FUNC(ccx_state::beeper_off));
+}
+
+
+
+/******************************************************************************
+ ROM Definitions
+******************************************************************************/
+
+ROM_START( cc10 ) // model CCX, PCB label P241C-1
+ ROM_REGION( 0x10000, "maincpu", 0 )
+ ROM_LOAD( "cn19053n_cc10b", 0x0000, 0x1000, CRC(afd3ca99) SHA1(870d09b2b52ccb8572d69642c59b5215d5fb26ab) ) // 2332
+ROM_END
+
+
+ROM_START( checkc4 ) // model ACR, PCB label P241C
+ ROM_REGION( 0x10000, "maincpu", 0 )
+ ROM_LOAD( "d2332c_043", 0x0000, 0x1000, CRC(4c251d90) SHA1(474d54b05971f2a3208bab56dc6e27f03781c541) ) // no custom label
+ROM_END
+
+} // anonymous namespace
+
+
+
+/******************************************************************************
+ Drivers
+******************************************************************************/
+
+// YEAR NAME PARENT CMP MACHINE INPUT STATE INIT COMPANY, FULLNAME, FLAGS
+CONS( 1978, cc10, 0, 0, ccx, ccx, ccx_state, empty_init, "Fidelity Electronics", "Chess Challenger 10 (model CCX, rev. B)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK )
+
+CONS( 1978, checkc4, 0, 0, acr, acr, ccx_state, empty_init, "Fidelity Electronics", "Checker Challenger 4", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_NO_SOUND_HW )
diff --git a/src/mame/drivers/fidel_cc7.cpp b/src/mame/drivers/fidel_cc7.cpp
new file mode 100644
index 00000000000..36bd7756dc7
--- /dev/null
+++ b/src/mame/drivers/fidel_cc7.cpp
@@ -0,0 +1,245 @@
+// license:BSD-3-Clause
+// copyright-holders:hap
+// thanks-to:Berger
+/******************************************************************************
+*
+* fidel_cc7.cpp, subdriver of machine/fidelbase.cpp, machine/chessbase.cpp
+
+*******************************************************************************
+
+Fidelity Chess Challenger 7 (BCC)
+------------------------
+model CC7 is an older version
+RE information from netlist by Berger
+
+Zilog Z80A, 3.579MHz from XTAL
+Z80 IRQ/NMI unused, no timer IC.
+This is a cost-reduced design from CC10, no special I/O chips.
+
+Backgammon Challenger (BKC) is the same PCB, with the speaker connection going
+to the display panel instead.
+
+Memory map:
+-----------
+0000-0FFF: 4K 2332 ROM CN19103N BCC-REVB.
+2000-2FFF: ROM/RAM bus conflict!
+3000-3FFF: 256 bytes RAM (2111 SRAM x2)
+4000-FFFF: Z80 A14/A15 not connected
+
+Port map (Write):
+---------
+D0-D3: digit select and keypad mux
+D4: CHECK led
+D5: LOSE led
+A0-A2: NE591 A0-A2
+D7: NE591 D (_C not used)
+NE591 Q0-Q6: digit segments A-G
+NE591 Q7: buzzer
+
+Port map (Read):
+---------
+D0-D3: keypad row
+
+******************************************************************************/
+
+#include "emu.h"
+#include "includes/fidelbase.h"
+
+#include "cpu/z80/z80.h"
+#include "sound/volt_reg.h"
+#include "speaker.h"
+
+// internal artwork
+#include "fidel_bcc.lh" // clickable
+#include "fidel_bkc.lh" // clickable
+
+
+namespace {
+
+class bcc_state : public fidelbase_state
+{
+public:
+ bcc_state(const machine_config &mconfig, device_type type, const char *tag) :
+ fidelbase_state(mconfig, type, tag)
+ { }
+
+ // machine drivers
+ void bcc(machine_config &config);
+ void bkc(machine_config &config);
+
+private:
+ // address maps
+ void main_map(address_map &map);
+ void main_io(address_map &map);
+
+ // I/O handlers
+ DECLARE_READ8_MEMBER(input_r);
+ DECLARE_WRITE8_MEMBER(control_w);
+};
+
+
+
+/******************************************************************************
+ Devices, I/O
+******************************************************************************/
+
+// TTL
+
+WRITE8_MEMBER(bcc_state::control_w)
+{
+ // a0-a2,d7: digit segment data via NE591
+ u8 mask = 1 << (offset & 7);
+ m_7seg_data = (m_7seg_data & ~mask) | ((data & 0x80) ? mask : 0);
+
+ // BCC: NE591 Q7 is speaker out
+ if (m_dac != nullptr)
+ m_dac->write(BIT(m_7seg_data, 7));
+
+ // d0-d3: led select, input mux
+ // d4,d5: upper leds(direct)
+ set_display_segmask(0xf, 0x7f);
+ display_matrix(8, 6, m_7seg_data, data & 0x3f);
+ m_inp_mux = data & 0xf;
+}
+
+READ8_MEMBER(bcc_state::input_r)
+{
+ // d0-d3: multiplexed inputs
+ return read_inputs(4);
+}
+
+
+
+/******************************************************************************
+ Address Maps
+******************************************************************************/
+
+void bcc_state::main_map(address_map &map)
+{
+ map.unmap_value_high();
+ map.global_mask(0x3fff);
+ map(0x0000, 0x0fff).rom();
+ map(0x3000, 0x30ff).mirror(0x0f00).ram();
+}
+
+void bcc_state::main_io(address_map &map)
+{
+ map.global_mask(0x07);
+ map(0x00, 0x07).rw(FUNC(bcc_state::input_r), FUNC(bcc_state::control_w));
+}
+
+
+
+/******************************************************************************
+ Input Ports
+******************************************************************************/
+
+static INPUT_PORTS_START( bcc )
+ PORT_START("IN.0")
+ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("EN") PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD)
+ PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("PV") PORT_CODE(KEYCODE_V)
+ PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("D4") PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_CODE(KEYCODE_D)
+ PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("H8") PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_CODE(KEYCODE_H)
+
+ PORT_START("IN.1")
+ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("CL") PORT_CODE(KEYCODE_DEL) PORT_CODE(KEYCODE_BACKSPACE)
+ PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("PB") PORT_CODE(KEYCODE_O)
+ PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("C3") PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_CODE(KEYCODE_C)
+ PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("G7") PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_CODE(KEYCODE_G)
+
+ PORT_START("IN.2")
+ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("CB") PORT_CODE(KEYCODE_SPACE)
+ PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("DM") PORT_CODE(KEYCODE_M)
+ PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("B2") PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_CODE(KEYCODE_B)
+ PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("F6") PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_CODE(KEYCODE_F)
+
+ PORT_START("IN.3")
+ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("RE") PORT_CODE(KEYCODE_R)
+ PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("LV") PORT_CODE(KEYCODE_L)
+ PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("A1") PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_CODE(KEYCODE_A)
+ PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("E5") PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_CODE(KEYCODE_E)
+INPUT_PORTS_END
+
+static INPUT_PORTS_START( bkc )
+ PORT_START("IN.0")
+ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("EN") PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD)
+ PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("9") PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD)
+ PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("6") PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD)
+ PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("3") PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD)
+
+ PORT_START("IN.1")
+ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("CL") PORT_CODE(KEYCODE_DEL) PORT_CODE(KEYCODE_BACKSPACE)
+ PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("8") PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD)
+ PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("5") PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD)
+ PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("2") PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD)
+
+ PORT_START("IN.2")
+ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("GM") PORT_CODE(KEYCODE_SPACE)
+ PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("7") PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD)
+ PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("4") PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD)
+ PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("1") PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD)
+
+ PORT_START("IN.3")
+ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("RE") PORT_CODE(KEYCODE_R)
+ PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("PB") PORT_CODE(KEYCODE_O)
+ PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("PV") PORT_CODE(KEYCODE_V)
+ PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("0") PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_0_PAD)
+INPUT_PORTS_END
+
+
+
+/******************************************************************************
+ Machine Drivers
+******************************************************************************/
+
+void bcc_state::bkc(machine_config &config)
+{
+ /* basic machine hardware */
+ Z80(config, m_maincpu, 3.579545_MHz_XTAL);
+ m_maincpu->set_addrmap(AS_PROGRAM, &bcc_state::main_map);
+ m_maincpu->set_addrmap(AS_IO, &bcc_state::main_io);
+
+ TIMER(config, "display_decay").configure_periodic(FUNC(bcc_state::display_decay_tick), attotime::from_msec(1));
+ config.set_default_layout(layout_fidel_bkc);
+}
+
+void bcc_state::bcc(machine_config &config)
+{
+ bkc(config);
+ config.set_default_layout(layout_fidel_bcc);
+
+ /* sound hardware */
+ SPEAKER(config, "speaker").front_center();
+ DAC_1BIT(config, m_dac).add_route(ALL_OUTPUTS, "speaker", 0.25);
+ VOLTAGE_REGULATOR(config, "vref").add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT);
+}
+
+
+
+/******************************************************************************
+ ROM Definitions
+******************************************************************************/
+
+ROM_START( cc7 ) // model BCC
+ ROM_REGION( 0x10000, "maincpu", 0 )
+ ROM_LOAD( "cn19103n_bcc-revb", 0x0000, 0x1000, CRC(a397d471) SHA1(9b12bc442fccee40f4d8500c792bc9d886c5e1a5) ) // 2332
+ROM_END
+
+
+ROM_START( backgamc ) // model BKC, PCB label P-380A-5
+ ROM_REGION( 0x10000, "maincpu", 0 )
+ ROM_LOAD( "cn19255n_101-32012", 0x0000, 0x1000, CRC(0a8a19b7) SHA1(d6f0dd44b33c9b79570cf0ceac02a036ec91ba57) ) // 2332
+ROM_END
+
+} // anonymous namespace
+
+
+
+/******************************************************************************
+ Drivers
+******************************************************************************/
+
+// YEAR NAME PARENT CMP MACHINE INPUT STATE INIT COMPANY, FULLNAME, FLAGS
+CONS( 1979, cc7, 0, 0, bcc, bcc, bcc_state, empty_init, "Fidelity Electronics", "Chess Challenger 7 (model BCC, rev. B)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK )
+
+CONS( 1979, backgamc, 0, 0, bkc, bkc, bcc_state, empty_init, "Fidelity Electronics", "Backgammon Challenger", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_NO_SOUND_HW )
diff --git a/src/mame/drivers/fidel_chesster.cpp b/src/mame/drivers/fidel_chesster.cpp
new file mode 100644
index 00000000000..ac5ce242889
--- /dev/null
+++ b/src/mame/drivers/fidel_chesster.cpp
@@ -0,0 +1,227 @@
+// license:BSD-3-Clause
+// copyright-holders:hap
+// thanks-to:yoyo_chessboard, Berger
+/******************************************************************************
+*
+* fidel_chesster.cpp, subdriver of machine/fidelbase.cpp, machine/chessbase.cpp
+
+These were made after Hegener & Glaser took over Fidelity(design phase started
+before that). Kishon Chesster was released under both Fidelity, and Mephisto brands.
+
+*******************************************************************************
+
+Fidelity Chesster (model 6120)
+There is also a German version titled Kishon Chesster (model 6120G, or 6127)
+----------------
+8*(8+1) buttons, 8+8+1 LEDs
+8KB RAM(UM6264-12), 32KB ROM(M27C256B)
+Ricoh RP65C02G CPU, 5MHz XTAL
+8-bit DAC speech timed via IRQ, 128KB ROM(AMI custom label)
+PCB label 510.1141C01
+
+I/O is via TTL, memory map is similar to Designer Display
+
+The speech technology was invented by Forrest S. Mozer(same person that invented
+the S14001A in the 70s), this time a 65C02 software solution.
+
+******************************************************************************/
+
+#include "emu.h"
+#include "includes/fidelbase.h"
+
+#include "cpu/m6502/r65c02.h"
+#include "sound/volt_reg.h"
+#include "speaker.h"
+
+// internal artwork
+#include "fidel_chesster.lh" // clickable
+
+
+namespace {
+
+class chesster_state : public fidelbase_state
+{
+public:
+ chesster_state(const machine_config &mconfig, device_type type, const char *tag) :
+ fidelbase_state(mconfig, type, tag)
+ { }
+
+ // machine drivers
+ void chesster(machine_config &config);
+ void kishon(machine_config &config);
+
+ void init_chesster();
+
+private:
+ // address maps
+ void main_map(address_map &map);
+
+ int m_numbanks;
+
+ // I/O handlers
+ DECLARE_WRITE8_MEMBER(control_w);
+ DECLARE_READ8_MEMBER(input_r);
+};
+
+void chesster_state::init_chesster()
+{
+ m_numbanks = memregion("rombank")->bytes() / 0x4000;
+ m_rombank->configure_entries(0, m_numbanks, memregion("rombank")->base(), 0x4000);
+}
+
+
+/******************************************************************************
+ Devices, I/O
+******************************************************************************/
+
+// TTL/generic
+
+WRITE8_MEMBER(chesster_state::control_w)
+{
+ // a0-a2,d7: 74259(1)
+ u8 mask = 1 << offset;
+ m_led_select = (m_led_select & ~mask) | ((data & 0x80) ? mask : 0);
+
+ // 74259 Q4-Q7: 7442 a0-a3
+ // 7442 0-8: led data, input mux
+ u16 sel = 1 << (m_led_select >> 4 & 0xf) & 0x3ff;
+ m_inp_mux = sel & 0x1ff;
+
+ // 74259 Q0,Q1: led select (active low)
+ display_matrix(9, 2, m_inp_mux, ~m_led_select & 3);
+
+ // 74259 Q2,Q3: speechrom A14,A15
+ // a0-a2,d0: 74259(2) Q3,Q2,Q0 to A16,A17,A18
+ m_speech_bank = (m_speech_bank & ~mask) | ((data & 1) ? mask : 0);
+ u8 bank = (m_led_select >> 2 & 3) | bitswap<3>(m_speech_bank, 0,2,3) << 2;
+ m_rombank->set_entry(bank & (m_numbanks - 1));
+}
+
+READ8_MEMBER(chesster_state::input_r)
+{
+ // a0-a2,d7: multiplexed inputs (active low)
+ return (read_inputs(9) >> offset & 1) ? 0 : 0x80;
+}
+
+
+
+/******************************************************************************
+ Address Maps
+******************************************************************************/
+
+void chesster_state::main_map(address_map &map)
+{
+ map(0x0000, 0x1fff).ram();
+ map(0x2000, 0x2007).mirror(0x1ff8).rw(FUNC(chesster_state::input_r), FUNC(chesster_state::control_w));
+ map(0x4000, 0x7fff).bankr("rombank");
+ map(0x6000, 0x6000).mirror(0x1fff).w("dac8", FUNC(dac_byte_interface::data_w));
+ map(0x8000, 0xffff).rom();
+}
+
+
+
+/******************************************************************************
+ Input Ports
+******************************************************************************/
+
+static INPUT_PORTS_START( chesster )
+ PORT_INCLUDE( generic_cb_buttons )
+
+ PORT_START("IN.8")
+ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_DEL) PORT_NAME("Clear")
+ PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_H) PORT_NAME("Move / No")
+ PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_G) PORT_NAME("Hint / Yes")
+ PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_F) PORT_NAME("Take Back / Repeat")
+ PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_C) PORT_NAME("Level / New")
+ PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_B) PORT_NAME("Option / Replay")
+ PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_A) PORT_NAME("Verify / Problem")
+ PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_LSHIFT) PORT_CODE(KEYCODE_RSHIFT) PORT_NAME("Shift")
+INPUT_PORTS_END
+
+
+
+/******************************************************************************
+ Machine Drivers
+******************************************************************************/
+
+void chesster_state::chesster(machine_config &config)
+{
+ /* basic machine hardware */
+ R65C02(config, m_maincpu, 5_MHz_XTAL); // RP65C02G
+ m_maincpu->set_addrmap(AS_PROGRAM, &chesster_state::main_map);
+
+ const attotime irq_period = attotime::from_hz(9500); // from 555 timer, measured (9.6kHz on a Chesster, 9.3kHz on a Kishon)
+ TIMER(config, m_irq_on).configure_periodic(FUNC(chesster_state::irq_on<M6502_IRQ_LINE>), irq_period);
+ m_irq_on->set_start_delay(irq_period - attotime::from_nsec(2600)); // active for 2.6us
+ TIMER(config, "irq_off").configure_periodic(FUNC(chesster_state::irq_off<M6502_IRQ_LINE>), irq_period);
+
+ TIMER(config, "display_decay").configure_periodic(FUNC(chesster_state::display_decay_tick), attotime::from_msec(1));
+ config.set_default_layout(layout_fidel_chesster);
+
+ /* sound hardware */
+ SPEAKER(config, "speaker").front_center();
+ DAC_8BIT_R2R(config, "dac8").add_route(ALL_OUTPUTS, "speaker", 0.5); // m74hc374b1.ic1 + 8l513_02.z2
+ voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref"));
+ vref.add_route(0, "dac8", 1.0, DAC_VREF_POS_INPUT);
+ vref.add_route(0, "dac8", -1.0, DAC_VREF_NEG_INPUT);
+}
+
+void chesster_state::kishon(machine_config &config)
+{
+ chesster(config);
+
+ /* basic machine hardware */
+ m_maincpu->set_clock(3.579545_MHz_XTAL); // same CPU
+}
+
+
+
+/******************************************************************************
+ ROM Definitions
+******************************************************************************/
+
+ROM_START( chesster ) // model 6120, PCB label 510.1141C01
+ ROM_REGION( 0x10000, "maincpu", 0 )
+ ROM_LOAD("ch_1.3.ic9", 0x8000, 0x8000, CRC(8b42d1ad) SHA1(2161fc5ab2476fe7ca4ffc226e3cb329b8a57a01) ) // 27256, CH 1.3 on sticker
+
+ ROM_REGION( 0x20000, "rombank", 0 )
+ ROM_LOAD("101-1091b02.ic10", 0x0000, 0x20000, CRC(fa370e88) SHA1(a937c8f1ec295cf9539d12466993974e40771493) ) // AMI, 27C010 or equivalent
+ROM_END
+
+ROM_START( chesstera ) // model 6120, PCB label 510.1141C01
+ ROM_REGION( 0x10000, "maincpu", 0 )
+ ROM_LOAD("chesster.ic9", 0x8000, 0x8000, CRC(29f9a698) SHA1(4c83ca46fd5fc9c40302e9c7f16b4ae2c18b06e6) ) // M27C256B, sticker but no label
+
+ ROM_REGION( 0x20000, "rombank", 0 )
+ ROM_LOAD("101-1091a02.ic10", 0x0000, 0x20000, CRC(2b4d243c) SHA1(921e51978facb502b207b4f64a73b1e74127e826) ) // AMI, 27C010 or equivalent
+ROM_END
+
+ROM_START( kishon ) // possibly Mephisto brand?, PCB label 510.1141C01
+ ROM_REGION( 0x10000, "maincpu", 0 )
+ ROM_LOAD("german_chesster_v2.2.ic9", 0x8000, 0x8000, CRC(43e0cfcd) SHA1(961c7335f562b19fa96324c429ab70e8ab4d7647) ) // 27C256, 15.1.91
+
+ ROM_REGION( 0x80000, "rombank", 0 )
+ ROM_LOAD("kishon_chesster_v2.6.ic10", 0x0000, 0x80000, CRC(50598869) SHA1(2087e0c2f40a2408fe217a6502c8c3a247bdd063) ) // Toshiba TC544000P-12
+ROM_END
+
+ROM_START( kishona ) // model 6120G or 6127(same), PCB label 510.1141C01
+ ROM_REGION( 0x10000, "maincpu", 0 )
+ ROM_LOAD("kishon.ic9", 0x8000, 0x8000, CRC(121c007f) SHA1(652e9ea47b6bb1632d10eb0fcd7f98cdba22fce7) ) // 27C256, no label
+
+ ROM_REGION( 0x80000, "rombank", 0 )
+ ROM_LOAD("kishon_chesster_v2.6.ic10", 0x0000, 0x80000, CRC(50598869) SHA1(2087e0c2f40a2408fe217a6502c8c3a247bdd063) ) // Toshiba TC544000P-12, 1-14-91, aka 101-1094A01 on 6127
+ROM_END
+
+} // anonymous namespace
+
+
+
+/******************************************************************************
+ Drivers
+******************************************************************************/
+
+// YEAR NAME PARENT CMP MACHINE INPUT STATE INIT COMPANY, FULLNAME, FLAGS
+CONS( 1990, chesster, 0, 0, chesster, chesster, chesster_state, init_chesster, "Fidelity Electronics", "Chesster Challenger (v1.3)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
+CONS( 1990, chesstera, chesster, 0, chesster, chesster, chesster_state, init_chesster, "Fidelity Electronics", "Chesster Challenger", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
+CONS( 1991, kishon, chesster, 0, kishon, chesster, chesster_state, init_chesster, "Fidelity Electronics", "Kishon Chesster (v2.2)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
+CONS( 1991, kishona, chesster, 0, kishon, chesster, chesster_state, init_chesster, "Fidelity Electronics", "Kishon Chesster", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
diff --git a/src/mame/drivers/fidel_csc.cpp b/src/mame/drivers/fidel_csc.cpp
new file mode 100644
index 00000000000..f1ee6488c59
--- /dev/null
+++ b/src/mame/drivers/fidel_csc.cpp
@@ -0,0 +1,712 @@
+// license:BSD-3-Clause
+// copyright-holders:Kevin Horton, Jonathan Gevaryahu, Sandro Ronco, hap
+// thanks-to:Berger, yoyo_chessboard
+/******************************************************************************
+*
+* fidel_csc.cpp, subdriver of machine/fidelbase.cpp, machine/chessbase.cpp
+
+Fidelity CSC(and derived) hardware
+- Champion Sensory Chess Challenger
+- Elite Champion Challenger
+- Super 9 Sensory Chess Challenger
+- Reversi Sensory Challenger
+
+TODO:
+- verify csce original roms (current set came from an overclock mod)
+- hook up csce I/O properly, it doesn't have PIAs
+
+*******************************************************************************
+
+Champion Sensory Chess Challenger (CSC)
+---------------------------------------
+RE notes by Kevin Horton
+
+Memory map:
+-----------
+0000-07FF: 2K of RAM
+0800-0FFF: 1K of RAM (note: mirrored twice)
+1000-17FF: PIA 1 (display, TSI speech chip)
+1800-1FFF: PIA 0 (keypad, LEDs)
+2000-3FFF: 101-64019 ROM*
+4000-7FFF: mirror of 0000-3FFF
+8000-9FFF: not used
+A000-BFFF: 101-1025A03 ROM
+C000-DFFF: 101-1025A02 ROM
+E000-FDFF: 101-1025A01 ROM
+FE00-FFFF: 512 byte 74S474 PROM
+
+*: 101-64019 is also used on the VSC(fidel_vsc.cpp). It contains the opening book
+and "64 greatest games", as well as some Z80 code. Obviously the latter is unused
+on the CSC.
+
+CPU is a 6502 running at 1.95MHz (3.9MHz resonator, divided by 2)
+
+NMI is not used.
+IRQ is connected to a 600Hz oscillator (38.4KHz divided by 64).
+Reset is connected to a power-on reset circuit.
+
+PIA 1:
+------
+PA0 - 7seg segments E, TSI A0
+PA1 - 7seg segments D, TSI A1
+PA2 - 7seg segments C, TSI A2
+PA3 - 7seg segments H, TSI A3
+PA4 - 7seg segments G, TSI A4
+PA5 - 7seg segments F, TSI A5
+PA6 - 7seg segments B
+PA7 - 7seg segments A
+
+PB0 - A12 on speech ROM (if used... not used on this model, ROM is 4K)
+PB1 - START line on TSI
+PB2 - white wire
+PB3 - BUSY line from TSI
+PB4 - hi/lo TSI speaker volume
+PB5 - button row 9
+PB6 - selection jumper (resistor to 5V)
+PB7 - selection jumper (resistor to ground)
+
+CA1 - NC
+CA2 - violet wire
+
+CB1 - NC
+CB2 - NC (connects to pin 14 of soldered connector)
+
+PIA 0:
+------
+PA0 - button row 1
+PA1 - button row 2
+PA2 - button row 3
+PA3 - button row 4
+PA4 - button row 5
+PA5 - button row 6
+PA6 - 7442 selector bit 0
+PA7 - 7442 selector bit 1
+
+PB0 - LED row 1
+PB1 - LED row 2
+PB2 - LED row 3
+PB3 - LED row 4
+PB4 - LED row 5
+PB5 - LED row 6
+PB6 - LED row 7
+PB7 - LED row 8
+
+CA1 - button row 7
+CA2 - selector bit 3
+
+CB1 - button row 8
+CB2 - selector bit 2
+
+Selector: (attached to PIA 0, outputs 1 of 10 pins low. 7442)
+---------
+output # (selected turns this column on, and all others off)
+0 - LED column A, button column A, 7seg digit 1
+1 - LED column B, button column B, 7seg digit 2
+2 - LED column C, button column C, 7seg digit 3
+3 - LED column D, button column D, 7seg digit 4
+4 - LED column E, button column E
+5 - LED column F, button column F
+6 - LED column G, button column G
+7 - LED column H, button column H
+8 - button column I
+9 - Tone line (toggle to make a tone in the buzzer)
+
+The rows/columns are indicated on the game board:
+
+ ABCDEFGH I
+--------------
+| | 8
+| | 7
+| | 6
+| | 5
+| | 4
+| | 3
+| | 2
+| | 1
+--------------
+
+The "lone LED" is above the control column.
+column I is the "control column" on the right for starting a new game, etc.
+
+The upper 6 buttons are connected as such:
+
+column A - speak
+column B - RV
+column C - TM
+column D - LV
+column E - DM
+column F - ST
+
+these 6 buttons use row 9 (connects to PIA 1)
+
+LED display:
+------------
+43 21 (digit number)
+-----
+88:88
+
+The LED display is four 7 segment digits. normal ABCDEFG lettering is used for segments.
+
+The upper dot is connected to digit 3 common
+The lower dot is connected to digit 4 common
+The lone LED is connected to digit 1 common
+
+All three of the above are called "segment H".
+
+*******************************************************************************
+
+Elite Champion Challenger
+This is a limited-release chess computer based on the CSC. They removed the PIAs
+and did the I/O with TTL instead (PIAs will still work from software point of view).
+---------------------------------
+R6502B? CPU @ 4MHz
+32KB ROMs total size, 4KB RAM(8*HM6147P)
+
+In the 90s, Wilfried Bucke provided an upgrade to make it more similar to the one
+that won the 1981 Travemünde contest. CPU was changed to R65C02 or UM6502C at 5MHz.
+
+*******************************************************************************
+
+Super 9 Sensory Chess Challenger (SU9/DS9)
+This is basically the Fidelity Elite A/S program on CSC hardware.
+Model DS9(Deluxe) has a 5MHz XTAL, but is otherwise same.
+Septennial(SCC) is the same as well, but clocked even higher.
+---------------------------------
+R6502AP CPU, 1.95MHz(3.9MHz resonator)
+2 RAM chips, assume 4KB
+2*8KB ROM + 1*2KB ROM
+built-in CB9 module
+
+See CSC description above for more information.
+
+*******************************************************************************
+
+Reversi Sensory Challenger (RSC)
+The 1st version came out in 1980, a program revision was released in 1981.
+Another distinction is the board color and layout, the 1981 version is green.
+---------------------------------
+8*(8+1) buttons, 8*8+1 LEDs
+1KB RAM(2*2114), 4KB ROM
+MOS MPS 6502B CPU, frequency unknown
+MOS MPS 6520 PIA, I/O is nearly same as CSC's PIA 0
+PCB label 510-1035A01
+
+******************************************************************************/
+
+#include "emu.h"
+#include "includes/fidelbase.h"
+
+#include "cpu/m6502/m6502.h"
+#include "machine/6821pia.h"
+#include "sound/volt_reg.h"
+#include "speaker.h"
+
+// internal artwork
+#include "fidel_csc.lh" // clickable
+#include "fidel_rsc_v2.lh" // clickable
+#include "fidel_su9.lh" // clickable
+
+
+namespace {
+
+class csc_state : public fidelbase_state
+{
+public:
+ csc_state(const machine_config &mconfig, device_type type, const char *tag) :
+ fidelbase_state(mconfig, type, tag),
+ m_pia(*this, "pia%u", 0)
+ { }
+
+ // machine drivers
+ void csc(machine_config &config);
+ void csce(machine_config &config);
+ void su9(machine_config &config);
+ void rsc(machine_config &config);
+
+protected:
+ // devices/pointers
+ optional_device_array<pia6821_device, 2> m_pia;
+
+ // address maps
+ void csc_map(address_map &map);
+ void su9_map(address_map &map);
+ void rsc_map(address_map &map);
+
+ // I/O handlers
+ void prepare_display();
+ DECLARE_READ8_MEMBER(speech_r);
+ DECLARE_WRITE8_MEMBER(pia0_pa_w);
+ DECLARE_WRITE8_MEMBER(pia0_pb_w);
+ DECLARE_READ8_MEMBER(pia0_pa_r);
+ DECLARE_WRITE_LINE_MEMBER(pia0_ca2_w);
+ DECLARE_WRITE_LINE_MEMBER(pia0_cb2_w);
+ DECLARE_READ_LINE_MEMBER(pia0_ca1_r);
+ DECLARE_READ_LINE_MEMBER(pia0_cb1_r);
+ DECLARE_WRITE8_MEMBER(pia1_pa_w);
+ DECLARE_WRITE8_MEMBER(pia1_pb_w);
+ DECLARE_READ8_MEMBER(pia1_pb_r);
+ DECLARE_WRITE_LINE_MEMBER(pia1_ca2_w);
+};
+
+class su9_state : public csc_state
+{
+public:
+ su9_state(const machine_config &mconfig, device_type type, const char *tag) :
+ csc_state(mconfig, type, tag)
+ { }
+
+ DECLARE_INPUT_CHANGED_MEMBER(su9_cpu_freq) { su9_set_cpu_freq(); }
+
+protected:
+ virtual void machine_reset() override;
+ void su9_set_cpu_freq();
+};
+
+void su9_state::machine_reset()
+{
+ csc_state::machine_reset();
+ su9_set_cpu_freq();
+}
+
+void su9_state::su9_set_cpu_freq()
+{
+ // SU9 CPU is clocked 1.95MHz, DS9 is 2.5MHz, SCC is 3MHz
+ u8 inp = ioport("FAKE")->read();
+ m_maincpu->set_unscaled_clock((inp & 2) ? (3_MHz_XTAL) : ((inp & 1) ? (5_MHz_XTAL/2) : (3.9_MHz_XTAL/2)));
+}
+
+
+/******************************************************************************
+ Devices, I/O
+******************************************************************************/
+
+// misc handlers
+
+void csc_state::prepare_display()
+{
+ // 7442 0-8: led select, input mux
+ m_inp_mux = 1 << m_led_select & 0x3ff;
+
+ // 7442 9: speaker out
+ m_dac->write(BIT(m_inp_mux, 9));
+
+ // 7seg leds+H (not on all models), 8*8(+1) chessboard leds
+ set_display_segmask(0xf, 0x7f);
+ display_matrix(16, 9, m_led_data << 8 | m_7seg_data, m_inp_mux);
+}
+
+READ8_MEMBER(csc_state::speech_r)
+{
+ return m_speech_rom[m_speech_bank << 12 | offset];
+}
+
+
+// 6821 PIA 0
+
+READ8_MEMBER(csc_state::pia0_pa_r)
+{
+ // d0-d5: button row 0-5 (active low)
+ return (read_inputs(9) & 0x3f) ^ 0xff;
+}
+
+WRITE8_MEMBER(csc_state::pia0_pa_w)
+{
+ // d6,d7: 7442 A0,A1
+ m_led_select = (m_led_select & ~3) | (data >> 6 & 3);
+ prepare_display();
+}
+
+WRITE8_MEMBER(csc_state::pia0_pb_w)
+{
+ // d0-d7: led row data
+ m_led_data = data;
+ prepare_display();
+}
+
+READ_LINE_MEMBER(csc_state::pia0_ca1_r)
+{
+ // button row 6 (active low)
+ return ~read_inputs(9) >> 6 & 1;
+}
+
+READ_LINE_MEMBER(csc_state::pia0_cb1_r)
+{
+ // button row 7 (active low)
+ return ~read_inputs(9) >> 7 & 1;
+}
+
+WRITE_LINE_MEMBER(csc_state::pia0_cb2_w)
+{
+ // 7442 A2
+ m_led_select = (m_led_select & ~4) | (state ? 4 : 0);
+ prepare_display();
+}
+
+WRITE_LINE_MEMBER(csc_state::pia0_ca2_w)
+{
+ // 7442 A3
+ m_led_select = (m_led_select & ~8) | (state ? 8 : 0);
+ prepare_display();
+}
+
+
+// 6821 PIA 1
+
+WRITE8_MEMBER(csc_state::pia1_pa_w)
+{
+ // d0-d5: TSI C0-C5
+ m_speech->data_w(space, 0, data & 0x3f);
+
+ // d0-d7: data for the 4 7seg leds, bits are ABFGHCDE (H is extra led)
+ m_7seg_data = bitswap<8>(data,0,1,5,6,7,2,3,4);
+ prepare_display();
+}
+
+WRITE8_MEMBER(csc_state::pia1_pb_w)
+{
+ // d0: speech ROM A12
+ m_speech->force_update(); // update stream to now
+ m_speech_bank = data & 1;
+
+ // d1: TSI START line
+ m_speech->start_w(data >> 1 & 1);
+
+ // d4: lower TSI volume
+ m_speech->set_output_gain(0, (data & 0x10) ? 0.5 : 1.0);
+}
+
+READ8_MEMBER(csc_state::pia1_pb_r)
+{
+ // d2: printer?
+ u8 data = 0x04;
+
+ // d3: TSI BUSY line
+ if (m_speech->busy_r())
+ data |= 0x08;
+
+ // d5: button row 8 (active low)
+ // d6,d7: language switches(hardwired with 2 resistors/jumpers)
+ data |= (~read_inputs(9) >> 3 & 0x20) | (*m_language << 6 & 0xc0);
+
+ return data;
+}
+
+WRITE_LINE_MEMBER(csc_state::pia1_ca2_w)
+{
+ // printer?
+}
+
+
+
+/******************************************************************************
+ Address Maps
+******************************************************************************/
+
+void csc_state::csc_map(address_map &map)
+{
+ map.unmap_value_high();
+ map(0x0000, 0x07ff).mirror(0x4000).ram();
+ map(0x0800, 0x0bff).mirror(0x4400).ram();
+ map(0x1000, 0x1003).mirror(0x47fc).rw(m_pia[1], FUNC(pia6821_device::read), FUNC(pia6821_device::write));
+ map(0x1800, 0x1803).mirror(0x47fc).rw(m_pia[0], FUNC(pia6821_device::read), FUNC(pia6821_device::write));
+ map(0x2000, 0x3fff).mirror(0x4000).rom();
+ map(0xa000, 0xffff).rom();
+}
+
+void csc_state::su9_map(address_map &map)
+{
+ map.unmap_value_high();
+ map(0x0000, 0x0fff).ram();
+ map(0x1000, 0x1003).rw(m_pia[1], FUNC(pia6821_device::read), FUNC(pia6821_device::write));
+ map(0x1800, 0x1803).rw(m_pia[0], FUNC(pia6821_device::read), FUNC(pia6821_device::write));
+ map(0x2000, 0x3fff).rom();
+ map(0xa000, 0xffff).rom();
+}
+
+void csc_state::rsc_map(address_map &map)
+{
+ map.unmap_value_high();
+ map(0x0000, 0x03ff).ram();
+ map(0x2000, 0x2003).rw(m_pia[0], FUNC(pia6821_device::read), FUNC(pia6821_device::write));
+ map(0xf000, 0xffff).rom();
+}
+
+
+
+/******************************************************************************
+ Input Ports
+******************************************************************************/
+
+static INPUT_PORTS_START( csc )
+ PORT_INCLUDE( generic_cb_buttons )
+
+ PORT_MODIFY("IN.0")
+ PORT_BIT(0x100, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_SPACE) PORT_NAME("Speaker")
+
+ PORT_MODIFY("IN.1")
+ PORT_BIT(0x100, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_V) PORT_NAME("RV")
+
+ PORT_MODIFY("IN.2")
+ PORT_BIT(0x100, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_T) PORT_NAME("TM")
+
+ PORT_MODIFY("IN.3")
+ PORT_BIT(0x100, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_L) PORT_NAME("LV")
+
+ PORT_MODIFY("IN.4")
+ PORT_BIT(0x100, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_M) PORT_NAME("DM")
+
+ PORT_MODIFY("IN.5")
+ PORT_BIT(0x100, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_S) PORT_NAME("ST")
+
+ PORT_START("IN.8")
+ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("Pawn")
+ PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("Rook")
+ PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("Knight")
+ PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("Bishop")
+ PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("Queen")
+ PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("King")
+ PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_DEL) PORT_NAME("CL")
+ PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_R) PORT_NAME("RE")
+INPUT_PORTS_END
+
+static INPUT_PORTS_START( su9 )
+ PORT_INCLUDE( csc )
+
+ PORT_MODIFY("IN.8")
+ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("RV / Pawn")
+ PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("DM / Knight")
+ PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("TB / Bishop")
+ PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("LV / Rook")
+ PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("PV / Queen")
+ PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("PB / King")
+
+ PORT_START("FAKE")
+ PORT_CONFNAME( 0x03, 0x00, "CPU Frequency" ) PORT_CHANGED_MEMBER(DEVICE_SELF, su9_state, su9_cpu_freq, nullptr) // factory set
+ PORT_CONFSETTING( 0x00, "1.95MHz (original)" )
+ PORT_CONFSETTING( 0x01, "2.5MHz (Deluxe)" )
+ PORT_CONFSETTING( 0x02, "3MHz (Septennial)" )
+INPUT_PORTS_END
+
+static INPUT_PORTS_START( rsc )
+ PORT_INCLUDE( generic_cb_buttons )
+
+ PORT_START("IN.8")
+ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("ST")
+ PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("RV")
+ PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("DM")
+ PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("CL")
+ PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("LV")
+ PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("PV")
+ PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_SPACE) PORT_NAME("Speaker")
+ PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_R) PORT_NAME("RE")
+INPUT_PORTS_END
+
+
+
+/******************************************************************************
+ Machine Drivers
+******************************************************************************/
+
+void csc_state::csc(machine_config &config)
+{
+ /* basic machine hardware */
+ M6502(config, m_maincpu, 3.9_MHz_XTAL/2); // from 3.9MHz resonator
+ m_maincpu->set_addrmap(AS_PROGRAM, &csc_state::csc_map);
+
+ const attotime irq_period = attotime::from_hz(38.4_kHz_XTAL/64); // through 4060 IC, 600Hz
+ TIMER(config, m_irq_on).configure_periodic(FUNC(csc_state::irq_on<M6502_IRQ_LINE>), irq_period);
+ m_irq_on->set_start_delay(irq_period - attotime::from_hz(38.4_kHz_XTAL*2)); // edge!
+ TIMER(config, "irq_off").configure_periodic(FUNC(csc_state::irq_off<M6502_IRQ_LINE>), irq_period);
+
+ PIA6821(config, m_pia[0], 0);
+ m_pia[0]->readpa_handler().set(FUNC(csc_state::pia0_pa_r));
+ m_pia[0]->readca1_handler().set(FUNC(csc_state::pia0_ca1_r));
+ m_pia[0]->readcb1_handler().set(FUNC(csc_state::pia0_cb1_r));
+ m_pia[0]->writepa_handler().set(FUNC(csc_state::pia0_pa_w));
+ m_pia[0]->writepb_handler().set(FUNC(csc_state::pia0_pb_w));
+ m_pia[0]->ca2_handler().set(FUNC(csc_state::pia0_ca2_w));
+ m_pia[0]->cb2_handler().set(FUNC(csc_state::pia0_cb2_w));
+
+ PIA6821(config, m_pia[1], 0);
+ m_pia[1]->readpb_handler().set(FUNC(csc_state::pia1_pb_r));
+ m_pia[1]->writepa_handler().set(FUNC(csc_state::pia1_pa_w));
+ m_pia[1]->writepb_handler().set(FUNC(csc_state::pia1_pb_w));
+ m_pia[1]->ca2_handler().set(FUNC(csc_state::pia1_ca2_w));
+
+ TIMER(config, "display_decay").configure_periodic(FUNC(csc_state::display_decay_tick), attotime::from_msec(1));
+ config.set_default_layout(layout_fidel_csc);
+
+ /* sound hardware */
+ SPEAKER(config, "speaker").front_center();
+ S14001A(config, m_speech, 25000); // R/C circuit, around 25khz
+ m_speech->ext_read().set(FUNC(csc_state::speech_r));
+ m_speech->add_route(ALL_OUTPUTS, "speaker", 0.75);
+
+ DAC_1BIT(config, m_dac).add_route(ALL_OUTPUTS, "speaker", 0.25);
+ VOLTAGE_REGULATOR(config, "vref").add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT);
+}
+
+void csc_state::csce(machine_config &config)
+{
+ csc(config);
+
+ /* basic machine hardware */
+ m_maincpu->set_clock(4_MHz_XTAL);
+ m_maincpu->set_addrmap(AS_PROGRAM, &csc_state::su9_map);
+}
+
+void csc_state::su9(machine_config &config)
+{
+ csc(config);
+
+ /* basic machine hardware */
+ m_maincpu->set_addrmap(AS_PROGRAM, &csc_state::su9_map);
+ config.set_default_layout(layout_fidel_su9);
+}
+
+void csc_state::rsc(machine_config &config)
+{
+ /* basic machine hardware */
+ M6502(config, m_maincpu, 1800000); // measured approx 1.81MHz
+ m_maincpu->set_addrmap(AS_PROGRAM, &csc_state::rsc_map);
+
+ const attotime irq_period = attotime::from_hz(546); // from 555 timer, measured
+ TIMER(config, m_irq_on).configure_periodic(FUNC(csc_state::irq_on<M6502_IRQ_LINE>), irq_period);
+ m_irq_on->set_start_delay(irq_period - attotime::from_usec(38)); // active for 38us
+ TIMER(config, "irq_off").configure_periodic(FUNC(csc_state::irq_off<M6502_IRQ_LINE>), irq_period);
+
+ PIA6821(config, m_pia[0], 0); // MOS 6520
+ m_pia[0]->readpa_handler().set(FUNC(csc_state::pia0_pa_r));
+ m_pia[0]->readca1_handler().set(FUNC(csc_state::pia0_ca1_r));
+ m_pia[0]->readcb1_handler().set(FUNC(csc_state::pia0_cb1_r));
+ m_pia[0]->writepa_handler().set(FUNC(csc_state::pia0_pa_w));
+ m_pia[0]->writepb_handler().set(FUNC(csc_state::pia0_pb_w));
+ m_pia[0]->ca2_handler().set(FUNC(csc_state::pia0_ca2_w));
+ m_pia[0]->cb2_handler().set(FUNC(csc_state::pia0_cb2_w));
+
+ TIMER(config, "display_decay").configure_periodic(FUNC(csc_state::display_decay_tick), attotime::from_msec(1));
+ config.set_default_layout(layout_fidel_rsc_v2);
+
+ /* sound hardware */
+ SPEAKER(config, "speaker").front_center();
+ DAC_1BIT(config, m_dac).add_route(ALL_OUTPUTS, "speaker", 0.25);
+ VOLTAGE_REGULATOR(config, "vref").add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT);
+}
+
+
+
+/******************************************************************************
+ ROM Definitions
+******************************************************************************/
+
+ROM_START( csc )
+ ROM_REGION( 0x10000, "maincpu", 0 )
+ ROM_LOAD("101-64019", 0x2000, 0x2000, CRC(08a3577c) SHA1(69fe379d21a9d4b57c84c3832d7b3e7431eec341) )
+ ROM_LOAD("1025a03", 0xa000, 0x2000, CRC(63982c07) SHA1(5ed4356323d5c80df216da55994abe94ba4aa94c) )
+ ROM_LOAD("1025a02", 0xc000, 0x2000, CRC(9e6e7c69) SHA1(4f1ed9141b6596f4d2b1217d7a4ba48229f3f1b0) )
+ ROM_LOAD("1025a01", 0xe000, 0x2000, CRC(57f068c3) SHA1(7d2ac4b9a2fba19556782863bdd89e2d2d94e97b) )
+ ROM_LOAD("74s474", 0xfe00, 0x0200, CRC(4511ba31) SHA1(e275b1739f8c3aa445cccb6a2b597475f507e456) )
+
+ // speech ROM
+ ROM_DEFAULT_BIOS("en")
+ ROM_SYSTEM_BIOS(0, "en", "English")
+ ROM_SYSTEM_BIOS(1, "de", "German")
+ ROM_SYSTEM_BIOS(2, "fr", "French")
+ ROM_SYSTEM_BIOS(3, "sp", "Spanish")
+
+ ROM_REGION( 1, "language", 0 )
+ ROMX_FILL(0, 1, 3, ROM_BIOS(0) )
+ ROMX_FILL(0, 1, 2, ROM_BIOS(1) )
+ ROMX_FILL(0, 1, 1, ROM_BIOS(2) )
+ ROMX_FILL(0, 1, 0, ROM_BIOS(3) )
+
+ ROM_REGION( 0x2000, "speech", 0 )
+ ROMX_LOAD("101-32107", 0x0000, 0x1000, CRC(f35784f9) SHA1(348e54a7fa1e8091f89ac656b4da22f28ca2e44d), ROM_BIOS(0) )
+ ROM_RELOAD( 0x1000, 0x1000)
+ ROMX_LOAD("101-64101", 0x0000, 0x2000, CRC(6c85e310) SHA1(20d1d6543c1e6a1f04184a2df2a468f33faec3ff), ROM_BIOS(1) )
+ ROMX_LOAD("101-64105", 0x0000, 0x2000, CRC(fe8c5c18) SHA1(2b64279ab3747ee81c86963c13e78321c6cfa3a3), ROM_BIOS(2) )
+ ROMX_LOAD("101-64106", 0x0000, 0x2000, CRC(8766e128) SHA1(78c7413bf240159720b131ab70bfbdf4e86eb1e9), ROM_BIOS(3) )
+ROM_END
+
+ROM_START( csce )
+ ROM_REGION( 0x10000, "maincpu", 0 )
+ ROM_LOAD("03", 0x2000, 0x2000, CRC(22e43531) SHA1(696dc019bea3812ae6cf9c2b2c4d3a7b9017807d) )
+ ROM_LOAD("02", 0xa000, 0x2000, CRC(e593f114) SHA1(4dc5a2456a87c128235958f046cee9502cb3ac65) )
+ ROM_LOAD("06", 0xc000, 0x0800, CRC(5d41b1e5) SHA1(fe95d8811d8894688336b798212c397bdb216956) )
+ ROM_LOAD("07", 0xc800, 0x0800, CRC(9078d40a) SHA1(4ffd36a4fcde1988e42543652e29463bc6ad5a8f) )
+ ROM_LOAD("08", 0xd000, 0x0800, CRC(c9472cc1) SHA1(ef4b1ae99e81689efeae323fe6ed58cf2c773fd6) )
+ ROM_LOAD("09", 0xd800, 0x0800, CRC(255c94a0) SHA1(d8e79213b69710e9d94c698492ec7b7420c9c7d8) )
+ ROM_LOAD("04", 0xe000, 0x1000, CRC(098873bd) SHA1(86001129a57db390e565f59a5677ec0b34b41d99) )
+ ROM_LOAD("05", 0xf000, 0x1000, CRC(1a516bfe) SHA1(2a2b252ca5d425fdf162cbc53077aee448b94437) )
+
+ // speech ROM
+ ROM_DEFAULT_BIOS("en")
+ ROM_SYSTEM_BIOS(0, "en", "English")
+ ROM_SYSTEM_BIOS(1, "de", "German")
+ ROM_SYSTEM_BIOS(2, "fr", "French")
+ ROM_SYSTEM_BIOS(3, "sp", "Spanish")
+
+ ROM_REGION( 1, "language", 0 )
+ ROMX_FILL(0, 1, 3, ROM_BIOS(0) )
+ ROMX_FILL(0, 1, 2, ROM_BIOS(1) )
+ ROMX_FILL(0, 1, 1, ROM_BIOS(2) )
+ ROMX_FILL(0, 1, 0, ROM_BIOS(3) )
+
+ ROM_REGION( 0x2000, "speech", 0 )
+ ROMX_LOAD("101-32107", 0x0000, 0x1000, CRC(f35784f9) SHA1(348e54a7fa1e8091f89ac656b4da22f28ca2e44d), ROM_BIOS(0) )
+ ROM_RELOAD( 0x1000, 0x1000)
+ ROMX_LOAD("101-64101", 0x0000, 0x2000, CRC(6c85e310) SHA1(20d1d6543c1e6a1f04184a2df2a468f33faec3ff), ROM_BIOS(1) )
+ ROMX_LOAD("101-64105", 0x0000, 0x2000, CRC(fe8c5c18) SHA1(2b64279ab3747ee81c86963c13e78321c6cfa3a3), ROM_BIOS(2) )
+ ROMX_LOAD("101-64106", 0x0000, 0x2000, CRC(8766e128) SHA1(78c7413bf240159720b131ab70bfbdf4e86eb1e9), ROM_BIOS(3) )
+ROM_END
+
+
+ROM_START( super9cc )
+ ROM_REGION( 0x10000, "maincpu", ROMREGION_ERASEFF )
+ ROM_LOAD("101-1050a01", 0x2000, 0x2000, CRC(421147e8) SHA1(ccf62f6f218e8992baf30973fe41b35e14a1cc1a) )
+ ROM_LOAD("101-1024b03", 0xa000, 0x0800, CRC(e8c97455) SHA1(ed2958fc5474253ee8c2eaf27fc64226e12f80ea) )
+ ROM_LOAD("101-1024b02", 0xc000, 0x2000, CRC(95004699) SHA1(ea79f43da73267344545df8ad61730f613876c2e) )
+ ROM_LOAD("101-1024c01", 0xe000, 0x2000, CRC(03904e86) SHA1(bfa0dd9d8541e3ec359a247a3eba543501f727bc) )
+
+ // speech ROM
+ ROM_DEFAULT_BIOS("en")
+ ROM_SYSTEM_BIOS(0, "en", "English")
+ ROM_SYSTEM_BIOS(1, "de", "German")
+ ROM_SYSTEM_BIOS(2, "fr", "French")
+ ROM_SYSTEM_BIOS(3, "sp", "Spanish")
+
+ ROM_REGION( 1, "language", 0 )
+ ROMX_FILL(0, 1, 3, ROM_BIOS(0) )
+ ROMX_FILL(0, 1, 2, ROM_BIOS(1) )
+ ROMX_FILL(0, 1, 1, ROM_BIOS(2) )
+ ROMX_FILL(0, 1, 0, ROM_BIOS(3) )
+
+ ROM_REGION( 0x2000, "speech", 0 )
+ ROMX_LOAD("101-32107", 0x0000, 0x1000, CRC(f35784f9) SHA1(348e54a7fa1e8091f89ac656b4da22f28ca2e44d), ROM_BIOS(0) )
+ ROM_RELOAD( 0x1000, 0x1000)
+ ROMX_LOAD("101-64101", 0x0000, 0x2000, CRC(6c85e310) SHA1(20d1d6543c1e6a1f04184a2df2a468f33faec3ff), ROM_BIOS(1) )
+ ROMX_LOAD("101-64105", 0x0000, 0x2000, CRC(fe8c5c18) SHA1(2b64279ab3747ee81c86963c13e78321c6cfa3a3), ROM_BIOS(2) )
+ ROMX_LOAD("101-64106", 0x0000, 0x2000, CRC(8766e128) SHA1(78c7413bf240159720b131ab70bfbdf4e86eb1e9), ROM_BIOS(3) )
+ROM_END
+
+
+ROM_START( reversic )
+ ROM_REGION( 0x10000, "maincpu", 0 )
+ ROM_LOAD("101-1000a01", 0xf000, 0x1000, CRC(ca7723a7) SHA1(bd92330f2d9494fa408f5a2ca300d7a755bdf489) )
+ROM_END
+
+} // anonymous namespace
+
+
+
+/******************************************************************************
+ Drivers
+******************************************************************************/
+
+// YEAR NAME PARENT CMP MACHINE INPUT STATE INIT COMPANY, FULLNAME, FLAGS
+CONS( 1981, csc, 0, 0, csc, csc, csc_state, empty_init, "Fidelity Electronics", "Champion Sensory Chess Challenger", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
+CONS( 1981, csce, 0, 0, csce, csc, csc_state, empty_init, "Fidelity Electronics", "Elite Champion Challenger", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
+
+CONS( 1983, super9cc, 0, 0, su9, su9, su9_state, empty_init, "Fidelity Electronics", "Super 9 Sensory Chess Challenger", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
+
+CONS( 1981, reversic, 0, 0, rsc, rsc, csc_state, empty_init, "Fidelity Electronics", "Reversi Sensory Challenger (green version)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
diff --git a/src/mame/drivers/fidel_dames.cpp b/src/mame/drivers/fidel_dames.cpp
new file mode 100644
index 00000000000..083a0fbb8c6
--- /dev/null
+++ b/src/mame/drivers/fidel_dames.cpp
@@ -0,0 +1,180 @@
+// license:BSD-3-Clause
+// copyright-holders:hap
+// thanks-to:yoyo_chessboard
+/******************************************************************************
+*
+* fidel_dames.cpp, subdriver of machine/fidelbase.cpp, machine/chessbase.cpp
+
+*******************************************************************************
+
+Fidelity Dame Sensory Challenger (DSC) overview:
+- Z80A CPU @ 3.9MHz
+- 8KB ROM(MOS 2364), 1KB RAM(2*TMM314APL)
+- 4-digit 7seg panel, sensory board with 50 buttons
+- PCB label 510-1030A01
+
+It's a checkers game for once instead of chess
+
+******************************************************************************/
+
+#include "emu.h"
+#include "includes/fidelbase.h"
+
+#include "cpu/z80/z80.h"
+#include "sound/volt_reg.h"
+#include "speaker.h"
+
+// internal artwork
+#include "fidel_dsc.lh" // clickable
+
+
+namespace {
+
+class dsc_state : public fidelbase_state
+{
+public:
+ dsc_state(const machine_config &mconfig, device_type type, const char *tag) :
+ fidelbase_state(mconfig, type, tag)
+ { }
+
+ // machine drivers
+ void dsc(machine_config &config);
+
+private:
+ // address maps
+ void main_map(address_map &map);
+
+ // I/O handlers
+ void prepare_display();
+ DECLARE_WRITE8_MEMBER(control_w);
+ DECLARE_WRITE8_MEMBER(select_w);
+ DECLARE_READ8_MEMBER(input_r);
+};
+
+
+/******************************************************************************
+ Devices, I/O
+******************************************************************************/
+
+// TTL
+
+void dsc_state::prepare_display()
+{
+ // 4 7seg leds
+ set_display_segmask(0xf, 0x7f);
+ display_matrix(8, 4, m_7seg_data, m_led_select);
+}
+
+WRITE8_MEMBER(dsc_state::control_w)
+{
+ // d0-d7: input mux, 7seg data
+ m_inp_mux = ~data;
+ m_7seg_data = data;
+ prepare_display();
+}
+
+WRITE8_MEMBER(dsc_state::select_w)
+{
+ // d4: speaker out
+ m_dac->write(BIT(~data, 4));
+
+ // d0-d3: digit select
+ m_led_select = data & 0xf;
+ prepare_display();
+}
+
+READ8_MEMBER(dsc_state::input_r)
+{
+ // d0-d7: multiplexed inputs (active low)
+ return ~read_inputs(8);
+}
+
+
+
+/******************************************************************************
+ Address Maps
+******************************************************************************/
+
+void dsc_state::main_map(address_map &map)
+{
+ map.unmap_value_high();
+ map(0x0000, 0x1fff).rom();
+ map(0x4000, 0x4000).mirror(0x1fff).w(FUNC(dsc_state::control_w));
+ map(0x6000, 0x6000).mirror(0x1fff).w(FUNC(dsc_state::select_w));
+ map(0x8000, 0x8000).mirror(0x1fff).r(FUNC(dsc_state::input_r));
+ map(0xa000, 0xa3ff).mirror(0x1c00).ram();
+}
+
+
+
+/******************************************************************************
+ Input Ports
+******************************************************************************/
+
+static INPUT_PORTS_START( dsc )
+ PORT_INCLUDE( generic_cb_buttons )
+
+ PORT_MODIFY("IN.4")
+ PORT_BIT(0x8f, IP_ACTIVE_HIGH, IPT_UNUSED)
+
+ PORT_MODIFY("IN.6")
+ PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("Black King")
+
+ PORT_MODIFY("IN.7")
+ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("Black")
+ PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("White King")
+ PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("White")
+ PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("RV")
+ PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) PORT_NAME("RE")
+ PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("PB")
+ PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("LV")
+ PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("CL")
+INPUT_PORTS_END
+
+
+
+/******************************************************************************
+ Machine Drivers
+******************************************************************************/
+
+void dsc_state::dsc(machine_config &config)
+{
+ /* basic machine hardware */
+ Z80(config, m_maincpu, 3.9_MHz_XTAL); // 3.9MHz resonator
+ m_maincpu->set_addrmap(AS_PROGRAM, &dsc_state::main_map);
+
+ const attotime irq_period = attotime::from_hz(523); // from 555 timer (22nF, 120K, 2.7K)
+ TIMER(config, m_irq_on).configure_periodic(FUNC(dsc_state::irq_on<INPUT_LINE_IRQ0>), irq_period);
+ m_irq_on->set_start_delay(irq_period - attotime::from_usec(41)); // active for 41us
+ TIMER(config, "irq_off").configure_periodic(FUNC(dsc_state::irq_off<INPUT_LINE_IRQ0>), irq_period);
+
+ TIMER(config, "display_decay").configure_periodic(FUNC(dsc_state::display_decay_tick), attotime::from_msec(1));
+ config.set_default_layout(layout_fidel_dsc);
+
+ /* sound hardware */
+ SPEAKER(config, "speaker").front_center();
+ DAC_1BIT(config, m_dac).add_route(ALL_OUTPUTS, "speaker", 0.25);
+ VOLTAGE_REGULATOR(config, "vref").add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT);
+}
+
+
+
+/******************************************************************************
+ ROM Definitions
+******************************************************************************/
+
+ROM_START( damesc ) // model DSC
+ ROM_REGION( 0x10000, "maincpu", 0 )
+ ROM_LOAD( "101-1027a01", 0x0000, 0x2000, CRC(d86c985c) SHA1(20f923a24420050fd16e1172f5e889f144d17ac9) ) // MOS 2364
+ROM_END
+
+} // anonymous namespace
+
+
+
+/******************************************************************************
+ Drivers
+******************************************************************************/
+
+// YEAR NAME PARENT CMP MACHINE INPUT STATE INIT COMPANY, FULLNAME, FLAGS
+CONS( 1981, damesc, 0, 0, dsc, dsc, dsc_state, empty_init, "Fidelity Electronics", "Dame Sensory Challenger", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
diff --git a/src/mame/drivers/fidel_desdis.cpp b/src/mame/drivers/fidel_desdis.cpp
new file mode 100644
index 00000000000..0c59c8af683
--- /dev/null
+++ b/src/mame/drivers/fidel_desdis.cpp
@@ -0,0 +1,358 @@
+// license:BSD-3-Clause
+// copyright-holders:hap
+// thanks-to:Berger, yoyo_chessboard
+/******************************************************************************
+*
+* fidel_desdis.cpp, subdriver of machine/fidelbase.cpp, machine/chessbase.cpp
+
+Fidelity Designer Display series, 6502 and 68000
+(6502-based displayless Designer is in fidel_excel.cpp)
+
+*******************************************************************************
+
+Designer 2100 Display (model 6106) overview:
+- 8KB RAM(MS6264L-10), 2*32KB ROM(27C256)
+- WDC W65C02P-6 CPU, 6MHz XTAL
+- 4-digit LCD panel
+- PCB label 510.1130A01
+
+Designer 2000 Display (model 6105): same hardware, no bookrom, 3MHz
+
+*******************************************************************************
+
+Designer Mach III Master 2265 (model 6113) overview:
+- 80KB RAM(2*KM6264AL-10, 2*KM62256AP-10), 64KB ROM(2*WSI 27C256L-12)
+- MC68HC000P12F CPU, 16MHz XTAL
+- IRQ(IPL2) from 555 timer, 1.67ms low, 6us high
+- PCB label 510.1134A02
+
+ROM address/data lines are scrambled, presumed for easy placement on PCB and not
+for obfuscation. I/O is nearly the same as Designer Display on 6502 hardware.
+
+Designer Mach IV Master 2325 (model 6129) overview:
+- 32KB(4*P5164-70) + 512KB(TC518512PL-80) RAM, 64KB ROM(TMS 27C512-120JL)
+- MC68EC020RP25 CPU, 20MHz XTAL
+- PCB label 510.1149A01
+- It has a green "Shift" led instead of red, and ROM is not scrambled.
+
+******************************************************************************/
+
+#include "emu.h"
+#include "includes/fidelbase.h"
+
+#include "cpu/m6502/r65c02.h"
+#include "cpu/m6502/m65sc02.h"
+#include "cpu/m68000/m68000.h"
+#include "sound/volt_reg.h"
+#include "speaker.h"
+
+// internal artwork
+#include "fidel_desdis.lh" // clickable
+#include "fidel_desdis_68kg.lh" // clickable
+#include "fidel_desdis_68kr.lh" // clickable
+
+
+namespace {
+
+class desdis_state : public fidelbase_state
+{
+public:
+ desdis_state(const machine_config &mconfig, device_type type, const char *tag) :
+ fidelbase_state(mconfig, type, tag)
+ { }
+
+ // machine drivers
+ void fdes2000d(machine_config &config);
+ void fdes2100d(machine_config &config);
+
+ void init_fdes2100d();
+
+protected:
+ // address maps
+ void fdes2100d_map(address_map &map);
+
+ // I/O handlers
+ virtual DECLARE_WRITE8_MEMBER(control_w);
+ virtual DECLARE_WRITE8_MEMBER(lcd_w);
+ virtual DECLARE_READ8_MEMBER(input_r);
+};
+
+class desmas_state : public desdis_state
+{
+public:
+ desmas_state(const machine_config &mconfig, device_type type, const char *tag) :
+ desdis_state(mconfig, type, tag)
+ { }
+
+ // machine drivers
+ void fdes2265(machine_config &config);
+ void fdes2325(machine_config &config);
+
+ void init_fdes2265();
+
+private:
+ // address maps
+ void fdes2265_map(address_map &map);
+ void fdes2325_map(address_map &map);
+
+ // I/O handlers, slightly different (control_w is d0 instead of d7, lcd_w is inverted)
+ virtual DECLARE_WRITE8_MEMBER(control_w) override { desdis_state::control_w(space, offset, data << 7); }
+ virtual DECLARE_WRITE8_MEMBER(lcd_w) override { desdis_state::lcd_w(space, offset, ~data); }
+};
+
+
+// init
+
+void desdis_state::init_fdes2100d()
+{
+ m_rombank->configure_entries(0, 2, memregion("rombank")->base(), 0x4000);
+}
+
+void desmas_state::init_fdes2265()
+{
+ u16 *rom = (u16*)memregion("maincpu")->base();
+ const u32 len = memregion("maincpu")->bytes() / 2;
+
+ // descramble data lines
+ for (int i = 0; i < len; i++)
+ rom[i] = bitswap<16>(rom[i], 15,14,8,13,9,12,10,11, 3,4,5,7,6,0,1,2);
+
+ // descramble address lines
+ std::vector<u16> buf(len);
+ memcpy(&buf[0], rom, len*2);
+ for (int i = 0; i < len; i++)
+ rom[i] = buf[bitswap<24>(i, 23,22,21,20,19,18,17,16, 15,14,13,12,11,8,10,9, 7,6,5,4,3,2,1,0)];
+}
+
+
+/******************************************************************************
+ Devices, I/O
+******************************************************************************/
+
+// TTL/generic
+
+WRITE8_MEMBER(desdis_state::control_w)
+{
+ u8 q3_old = m_led_select & 8;
+
+ // a0-a2,d7: 74259
+ u8 mask = 1 << offset;
+ m_led_select = (m_led_select & ~mask) | ((data & 0x80) ? mask : 0);
+
+ // 74259 Q4-Q7: 7442 a0-a3
+ // 7442 0-8: led data, input mux
+ u16 sel = 1 << (m_led_select >> 4 & 0xf) & 0x3ff;
+ m_inp_mux = sel & 0x1ff;
+
+ // 7442 9: speaker out
+ m_dac->write(BIT(sel, 9));
+
+ // 74259 Q0,Q1: led select (active low)
+ display_matrix(9, 2, m_inp_mux, ~m_led_select & 3, false);
+
+ // 74259 Q2: book rom A14
+ if (m_rombank != nullptr)
+ m_rombank->set_entry(~m_led_select >> 2 & 1);
+
+ // 74259 Q3: lcd common, update on rising edge
+ if (~q3_old & m_led_select & 8)
+ {
+ for (int i = 0; i < 4; i++)
+ m_display_state[i+2] = m_7seg_data >> (8*i) & 0xff;
+ }
+
+ m_display_maxy += 4;
+ set_display_segmask(0x3c, 0x7f);
+ display_update();
+}
+
+WRITE8_MEMBER(desdis_state::lcd_w)
+{
+ // a0-a2,d0-d3: 4*74259 to lcd digit segments
+ u32 mask = bitswap<8>(1 << offset,3,7,6,0,1,2,4,5);
+ for (int i = 0; i < 4; i++)
+ {
+ m_7seg_data = (m_7seg_data & ~mask) | ((data >> i & 1) ? 0 : mask);
+ mask <<= 8;
+ }
+}
+
+READ8_MEMBER(desdis_state::input_r)
+{
+ // a0-a2,d7: multiplexed inputs (active low)
+ return (read_inputs(9) >> offset & 1) ? 0 : 0x80;
+}
+
+
+
+/******************************************************************************
+ Address Maps
+******************************************************************************/
+
+void desdis_state::fdes2100d_map(address_map &map)
+{
+ map(0x0000, 0x1fff).ram();
+ map(0x2000, 0x2007).mirror(0x1ff8).rw(FUNC(desdis_state::input_r), FUNC(desdis_state::control_w));
+ map(0x4000, 0x7fff).bankr("rombank");
+ map(0x6000, 0x6007).mirror(0x1ff8).w(FUNC(desdis_state::lcd_w));
+ map(0x8000, 0xffff).rom();
+}
+
+void desmas_state::fdes2265_map(address_map &map)
+{
+ map.unmap_value_high();
+ map(0x000000, 0x00ffff).rom();
+ map(0x000000, 0x00000f).w(FUNC(desmas_state::lcd_w)).umask16(0x00ff);
+ map(0x044000, 0x047fff).ram();
+ map(0x100000, 0x10ffff).ram();
+ map(0x140000, 0x14000f).r(FUNC(desmas_state::input_r)).umask16(0xff00);
+ map(0x140000, 0x14000f).w(FUNC(desmas_state::control_w)).umask16(0x00ff);
+}
+
+void desmas_state::fdes2325_map(address_map &map)
+{
+ map.unmap_value_high();
+ map(0x000000, 0x00ffff).rom();
+ map(0x100000, 0x10000f).w(FUNC(desmas_state::lcd_w)).umask32(0x00ff00ff);
+ map(0x140000, 0x14000f).w(FUNC(desmas_state::control_w)).umask32(0x00ff00ff);
+ map(0x180000, 0x18000f).r(FUNC(desmas_state::input_r)).umask32(0xff00ff00);
+ map(0x300000, 0x37ffff).ram();
+ map(0x500000, 0x507fff).ram();
+}
+
+
+
+/******************************************************************************
+ Input Ports
+******************************************************************************/
+
+static INPUT_PORTS_START( desdis )
+ PORT_INCLUDE( generic_cb_buttons )
+
+ PORT_START("IN.8")
+ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_DEL) PORT_NAME("Clear")
+ PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_H) PORT_NAME("Move / Alternate")
+ PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_G) PORT_NAME("Hint / Info")
+ PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_F) PORT_NAME("Take Back / Replay")
+ PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_C) PORT_NAME("Level / New")
+ PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_B) PORT_NAME("Option / Time")
+ PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_A) PORT_NAME("Verify / Problem")
+ PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_LSHIFT) PORT_CODE(KEYCODE_RSHIFT) PORT_NAME("Shift")
+INPUT_PORTS_END
+
+
+
+/******************************************************************************
+ Machine Drivers
+******************************************************************************/
+
+void desdis_state::fdes2100d(machine_config &config)
+{
+ /* basic machine hardware */
+ M65C02(config, m_maincpu, 6_MHz_XTAL); // W65C02P-6
+ m_maincpu->set_addrmap(AS_PROGRAM, &desdis_state::fdes2100d_map);
+
+ const attotime irq_period = attotime::from_hz(630); // from 556 timer (22nF, 102K, 1K)
+ TIMER(config, m_irq_on).configure_periodic(FUNC(desdis_state::irq_on<M6502_IRQ_LINE>), irq_period);
+ m_irq_on->set_start_delay(irq_period - attotime::from_nsec(15250)); // active for 15.25us
+ TIMER(config, "irq_off").configure_periodic(FUNC(desdis_state::irq_off<M6502_IRQ_LINE>), irq_period);
+
+ TIMER(config, "display_decay").configure_periodic(FUNC(desdis_state::display_decay_tick), attotime::from_msec(1));
+ config.set_default_layout(layout_fidel_desdis);
+
+ /* sound hardware */
+ SPEAKER(config, "speaker").front_center();
+ DAC_1BIT(config, m_dac).add_route(ALL_OUTPUTS, "speaker", 0.25);
+ VOLTAGE_REGULATOR(config, "vref").add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT);
+}
+
+void desdis_state::fdes2000d(machine_config &config)
+{
+ fdes2100d(config);
+
+ /* basic machine hardware */
+ R65C02(config.replace(), m_maincpu, 3_MHz_XTAL); // R65C02P3
+ m_maincpu->set_addrmap(AS_PROGRAM, &desdis_state::fdes2100d_map);
+}
+
+void desmas_state::fdes2265(machine_config &config)
+{
+ /* basic machine hardware */
+ M68000(config, m_maincpu, 16_MHz_XTAL); // MC68HC000P12F
+ m_maincpu->set_addrmap(AS_PROGRAM, &desmas_state::fdes2265_map);
+
+ const attotime irq_period = attotime::from_hz(597); // from 555 timer, measured
+ TIMER(config, m_irq_on).configure_periodic(FUNC(desmas_state::irq_on<M68K_IRQ_4>), irq_period);
+ m_irq_on->set_start_delay(irq_period - attotime::from_nsec(6000)); // active for 6us
+ TIMER(config, "irq_off").configure_periodic(FUNC(desmas_state::irq_off<M68K_IRQ_4>), irq_period);
+
+ TIMER(config, "display_decay").configure_periodic(FUNC(desmas_state::display_decay_tick), attotime::from_msec(1));
+ config.set_default_layout(layout_fidel_desdis_68kr);
+
+ /* sound hardware */
+ SPEAKER(config, "speaker").front_center();
+ DAC_1BIT(config, m_dac).add_route(ALL_OUTPUTS, "speaker", 0.25);
+ VOLTAGE_REGULATOR(config, "vref").add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT);
+}
+
+void desmas_state::fdes2325(machine_config &config)
+{
+ fdes2265(config);
+
+ /* basic machine hardware */
+ M68EC020(config.replace(), m_maincpu, 20_MHz_XTAL); // MC68EC020RP25
+ m_maincpu->set_addrmap(AS_PROGRAM, &desmas_state::fdes2325_map);
+
+ config.set_default_layout(layout_fidel_desdis_68kg);
+}
+
+
+
+/******************************************************************************
+ ROM Definitions
+******************************************************************************/
+
+ROM_START( fdes2100d ) // model 6106, PCB label 510.1130A01. The 'rev B' dump came from a post-release bugfix by Fidelity
+ ROM_REGION( 0x10000, "maincpu", 0 )
+ ROM_LOAD("i9_orange.ic9", 0x8000, 0x8000, CRC(83fec02a) SHA1(6f43ab05bc605061989b05d0592dbd184efff9d4) ) // WSI 27C256L-12
+
+ ROM_REGION( 0x8000, "rombank", 0 )
+ ROM_LOAD("bk3_white.ic10", 0x0000, 0x8000, CRC(3857cc35) SHA1(f073dafb9fd885c7ddb7fbff10e3653f343ef1c6) ) // WSI 27C256L-12
+ROM_END
+
+ROM_START( fdes2000d ) // model 6105, PCB label 510.1130A01
+ ROM_REGION( 0x10000, "maincpu", 0 )
+ ROM_LOAD("27c256.ic9", 0x8000, 0x8000, CRC(b136d1a1) SHA1(8438790a62f45284ff33a0255c5c89f526726d3e) ) // 27C256, no label
+
+ ROM_REGION( 0x8000, "rombank", ROMREGION_ERASEFF ) // no rom in ic10
+ROM_END
+
+
+ROM_START( fdes2265 ) // model 6113, PCB label 510.1134A02
+ ROM_REGION16_BE( 0x10000, "maincpu", 0 )
+ ROM_LOAD16_BYTE("13e_red.ic11", 0x00000, 0x08000, CRC(15a35628) SHA1(8213862e129951c6943a80f73cd0b63a31bb1357) ) // 27c256
+ ROM_LOAD16_BYTE("13o_blue.ic10", 0x00001, 0x08000, CRC(81ce7ab2) SHA1(f01a70bcf2fbfe66c7a77d3c4437d897e5cc682d) ) // "
+ROM_END
+
+ROM_START( fdes2325 ) // model 6129, PCB label 510.1149A01
+ ROM_REGION( 0x10000, "maincpu", 0 )
+ ROM_LOAD("61_29_white.ic10", 0x00000, 0x10000, CRC(f74157e1) SHA1(87f3f2d584e292f81593e053240d022cc477834d) ) // 27c512
+
+ ROM_REGION( 0x100, "pals", 0 )
+ ROM_LOAD("101-1097a01.ic19", 0x000, 0x100, NO_DUMP ) // PALCE16V8Q-25PC
+ROM_END
+
+} // anonymous namespace
+
+
+
+/******************************************************************************
+ Drivers
+******************************************************************************/
+
+// YEAR NAME PARENT CMP MACHINE INPUT STATE INIT COMPANY, FULLNAME, FLAGS
+CONS( 1988, fdes2100d, 0, 0, fdes2100d, desdis, desdis_state, init_fdes2100d, "Fidelity Electronics", "Designer 2100 Display (rev. B)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
+CONS( 1988, fdes2000d, fdes2100d, 0, fdes2000d, desdis, desdis_state, init_fdes2100d, "Fidelity Electronics", "Designer 2000 Display", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
+
+CONS( 1989, fdes2265, 0, 0, fdes2265, desdis, desmas_state, init_fdes2265, "Fidelity Electronics", "Designer Mach III Master 2265", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
+CONS( 1991, fdes2325, fdes2265, 0, fdes2325, desdis, desmas_state, empty_init, "Fidelity Electronics", "Designer Mach IV Master 2325", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
diff --git a/src/mame/drivers/fidel_eag68k.cpp b/src/mame/drivers/fidel_eag68k.cpp
new file mode 100644
index 00000000000..6405d2fc4b1
--- /dev/null
+++ b/src/mame/drivers/fidel_eag68k.cpp
@@ -0,0 +1,737 @@
+// license:BSD-3-Clause
+// copyright-holders:hap
+// thanks-to:Berger, yoyo_chessboard
+/******************************************************************************
+*
+* fidel_eag68k.cpp, subdriver of machine/fidelbase.cpp, machine/chessbase.cpp
+
+Fidelity 68000-based Elite Avant Garde driver
+For 6502-based EAG, see fidel_elite.cpp
+Excel 68000 I/O is very similar to EAG, so it's handled in this driver as well
+
+TODO:
+- USART is not emulated
+- V11 CPU should be M68EC060, not yet emulated. Now using M68EC040 in its place
+ at twice the frequency due to lack of superscalar.
+- V11 beeper is too high pitched, related to wrong CPU type too? But even at 72MHz
+ it's still wrong, so maybe waitstates or clock divider on I/O access.
+
+*******************************************************************************
+
+Excel 68000 (model 6094) overview:
+- 16KB RAM(2*SRM2264C-10 @ U8/U9), 64KB ROM(2*AT27C256-15DC @ U6/U7)
+- HD68HC000P12 CPU, 12MHz XTAL
+- PCB label 510-1129A01
+- PCB has edge connector for module, but no external slot
+
+There's room for 2 SIMMs at U22 and U23, unpopulated in Excel 68000 and Mach III.
+Mach II has 2*64KB DRAM with a MB1422A DRAM controller @ 25MHz.
+Mach III has wire mods from U22/U23 to U8/U9(2*8KB + 2*32KB piggybacked).
+Mach IV has 2*256KB DRAM, and a daughterboard(510.1123B01) for the 68020.
+
+I/O is via TTL, overall very similar to EAG.
+
+*******************************************************************************
+
+Elite Avant Garde (EAG, model 6114)
+-----------------------------------
+
+There are 5 versions of model 6114(V1 to V5):
+
+V1: 128KB DRAM, no EEPROM
+V2: 128KB DRAM
+V3: 512KB DRAM
+V4: 1MB DRAM
+V5: 128KB+16KB DRAM, dual-CPU! (2*68K @ 16MHz)
+
+V6-V11 are on model 6117. Older 1986 model 6081/6088/6089 uses a 6502 CPU.
+
+Hardware info:
+--------------
+- MC68HC000P12F 16MHz CPU, 16MHz XTAL
+- MB1422A DRAM Controller, 25MHz XTAL near, 4 DRAM slots
+ (V2: slot 2 & 3 64KB, V3: slot 2 & 3 256KB)
+- 2*27C512 64KB EPROM, 2*KM6264AL-10 8KB SRAM, 2*AT28C64X 8KB EEPROM
+- OKI M82C51A-2 USART, 4.9152MHz XTAL
+- other special: magnet sensors, external module slot, serial port
+
+IRQ source is a 4,9152MHz quartz crystal (Y3) connected to a 74HC4060 (U8,
+ripple counter/divider). From Q13 output (counter=8192) we obtain the IRQ signal
+applied to IPL1 of 68000 (pin 24) 4,9152 MHz / 8192 = 600 Hz.
+
+The module slot pinout is different from SCC series. The data on those appears
+to be compatible with EAG though and will load fine with an adapter.
+
+The USART allows for a serial connection between the chess computer and another
+device, for example a PC. Fidelity released a DOS tool called EAGLINK which
+featured PC printer support, complete I/O control, detailed information while
+the program is 'thinking', etc.
+
+Memory map: (of what is known)
+-----------
+000000-01FFFF: 128KB ROM
+104000-107FFF: 16KB SRAM
+200000-2FFFFF: hashtable DRAM (max. 1MB)
+300000-30000F W hi d0: NE591: 7seg data
+300000-30000F W lo d0: NE591: LED data
+300000-30000F R lo d7: 74259: keypad rows 0-7
+400000-400007 W lo d0: 74259,74145/7442: led/keypad mux, buzzer out
+400000-4????? R hi: external module slot
+700002-700003 R lo d7: 74251: keypad row 8
+604000-607FFF: 16KB EEPROM
+
+*******************************************************************************
+
+Elite Avant Garde (EAG, model 6117)
+-----------------------------------
+
+There are 6 versions of model 6117(V6 to V11). From a programmer's point of view,
+the hardware is very similar to model 6114.
+
+V6: 68020, 512KB hashtable RAM
+V7: 68020, 1MB h.RAM
+V8: 2*68020, 512KB+128KB h.RAM
+V9: 68030, 1MB h.RAM
+V10: 68040, 1MB h.RAM
+V11: 68060, 2MB h.RAM, high speed
+
+V7 Hardware info:
+-----------------
+- MC68020RC25E CPU, 25MHz XTAL - this PCB was overclocked, original was 20MHz so let's use that
+- 4*AS7C164-20PC 8KB SRAM, 2*KM684000ALG-7L 512KB CMOS SRAM
+- 2*27C512? 64KB EPROM, 2*HM6264LP-15 8KB SRAM, 2*AT28C64B 8KB EEPROM, 2*GAL16V8C
+- same as 6114: M82C51A, NE555, SN74HC4060, module slot, chessboard, ..
+
+V7 Memory map:
+--------------
+000000-01FFFF: 128KB ROM
+104000-107FFF: 16KB SRAM (unused?)
+200000-2FFFFF: hashtable SRAM
+300000-30000x: see model 6114
+400000-40000x: see model 6114
+700000-70000x: see model 6114
+604000-607FFF: 16KB EEPROM
+800000-807FFF: 32KB SRAM
+
+V10 Hardware info:
+------------------
+- 68040 CPU, 25MHz
+- other: assume same or very similar to V11(see below)
+
+The ROM dump came from the V11(see below). Built-in factory test proves
+that this program is a V10. Hold TB button immediately after power-on and
+press it for a sequence of tests:
+1) all LEDs on
+2) F40C: V10 program version
+3) 38b9: V10 ROM checksum
+4) xxxx: external module ROM checksum (0000 if no module present)
+5) xxxx: user settings (stored in EEPROM)
+6) xxxx: "
+7) 1024: hashtable RAM size
+8) return to game
+
+V11 Hardware info:
+------------------
+- MC68EC060RC75 CPU, 36MHz XTAL(36MHz bus, 72MHz CPU), CPU cooler required
+- 4*CXK5863AP-20 8KB SRAM, 4*K6X4008C1F-DF55 512KB CMOS SRAM
+- 4*M27C256B 32KB EPROM, 2*AT28C64 8KB EEPROM, 5*GAL16V8D
+- NEC D71051C USART, assume 8MHz, on quick glance it's same as the OKI USART
+- same as 6114: NE555, SN74HC4060, module slot, chessboard, ..
+
+This is a custom overclocked V10, manufactured by Wilfried Bucke. PCB is marked:
+"CHESS HW DESIGN COPYRIGHT 22-10-2002: REVA03 510.1136A01/510.1144B01 COMPONENT SIDE"
+There are two versions of this, one with a 66MHz CPU, one with a 72MHz CPU.
+Maybe other differences too?
+
+V1x Memory map:
+---------------
+000000-01FFFF: 128KB ROM
+200000-3FFFFF: hashtable SRAM (less on V10?)
+B0000x-xxxxxx: see V7, -800000
+
+******************************************************************************/
+
+#include "emu.h"
+#include "includes/fidelbase.h"
+
+#include "cpu/m68000/m68000.h"
+#include "machine/gen_latch.h"
+#include "machine/ram.h"
+#include "machine/nvram.h"
+#include "sound/volt_reg.h"
+#include "speaker.h"
+
+// internal artwork
+#include "fidel_ex_68k.lh" // clickable
+#include "fidel_eag_68k.lh" // clickable
+
+
+namespace {
+
+class eag_state : public fidelbase_state
+{
+public:
+ eag_state(const machine_config &mconfig, device_type type, const char *tag) :
+ fidelbase_state(mconfig, type, tag),
+ m_ram(*this, "ram")
+ { }
+
+ // machine drivers
+ void eagv2(machine_config &config);
+ void eagv3(machine_config &config);
+ void eagv5(machine_config &config);
+ void eagv7(machine_config &config);
+ void eagv9(machine_config &config);
+ void eagv10(machine_config &config);
+ void eagv11(machine_config &config);
+
+ void init_eag();
+
+protected:
+ void eag_base(machine_config &config);
+
+ // devices/pointers
+ optional_device<ram_device> m_ram;
+
+ // address maps
+ void eag_map(address_map &map);
+ void eagv7_map(address_map &map);
+ void eagv10_map(address_map &map);
+
+ // I/O handlers
+ void prepare_display();
+ virtual DECLARE_WRITE8_MEMBER(mux_w);
+ DECLARE_READ8_MEMBER(input1_r);
+ DECLARE_READ8_MEMBER(input2_r);
+ DECLARE_WRITE8_MEMBER(leds_w);
+ DECLARE_WRITE8_MEMBER(digit_w);
+};
+
+class eagv5_state : public eag_state
+{
+public:
+ eagv5_state(const machine_config &mconfig, device_type type, const char *tag) :
+ eag_state(mconfig, type, tag),
+ m_subcpu(*this, "subcpu"),
+ m_mainlatch(*this, "mainlatch"),
+ m_sublatch(*this, "sublatch")
+ { }
+
+ // machine drivers
+ void eagv5(machine_config &config);
+
+private:
+ // devices/pointers
+ required_device<cpu_device> m_subcpu;
+ required_device<generic_latch_8_device> m_mainlatch;
+ required_device<generic_latch_8_device> m_sublatch;
+
+ // address maps
+ void main_map(address_map &map);
+ void sub_map(address_map &map);
+
+ // I/O handlers
+ DECLARE_WRITE8_MEMBER(reset_subcpu_w);
+ DECLARE_READ8_MEMBER(main_ack_r);
+ DECLARE_READ8_MEMBER(sub_ack_r);
+};
+
+class excel68k_state : public eag_state
+{
+public:
+ excel68k_state(const machine_config &mconfig, device_type type, const char *tag) :
+ eag_state(mconfig, type, tag)
+ { }
+
+ // machine drivers
+ void fex68k(machine_config &config);
+ void fex68km2(machine_config &config);
+ void fex68km3(machine_config &config);
+
+private:
+ // address maps
+ void fex68k_map(address_map &map);
+ void fex68km2_map(address_map &map);
+ void fex68km3_map(address_map &map);
+};
+
+
+
+/******************************************************************************
+ Devices, I/O
+******************************************************************************/
+
+// TTL/generic
+
+void eag_state::prepare_display()
+{
+ // Excel 68000: 4*7seg leds, 8*8 chessboard leds
+ // EAG: 8*7seg leds(2 panels), (8+1)*8 chessboard leds
+ u8 seg_data = bitswap<8>(m_7seg_data,0,1,3,2,7,5,6,4);
+ set_display_segmask(0x1ff, 0x7f);
+ display_matrix(16, 9, m_led_data << 8 | seg_data, m_inp_mux);
+}
+
+WRITE8_MEMBER(eag_state::mux_w)
+{
+ // a1-a3,d0: 74259
+ u8 mask = 1 << offset;
+ m_led_select = (m_led_select & ~mask) | ((data & 1) ? mask : 0);
+
+ // 74259 Q0-Q3: 74145 A-D (Q4-Q7 N/C)
+ // 74145 0-8: input mux, digit/led select
+ // 74145 9: speaker out
+ u16 sel = 1 << (m_led_select & 0xf);
+ m_dac->write(BIT(sel, 9));
+ m_inp_mux = sel & 0x1ff;
+ prepare_display();
+}
+
+READ8_MEMBER(eag_state::input1_r)
+{
+ // a1-a3,d7: multiplexed inputs (active low)
+ return (read_inputs(9) >> offset & 1) ? 0 : 0x80;
+}
+
+READ8_MEMBER(eag_state::input2_r)
+{
+ // d7: multiplexed inputs highest bit
+ return (read_inputs(9) & 0x100) ? 0x80 : 0;
+}
+
+WRITE8_MEMBER(eag_state::leds_w)
+{
+ // a1-a3,d0: led data
+ m_led_data = (m_led_data & ~(1 << offset)) | ((data & 1) << offset);
+ prepare_display();
+}
+
+WRITE8_MEMBER(eag_state::digit_w)
+{
+ // a1-a3,d0(d8): digit segment data
+ m_7seg_data = (m_7seg_data & ~(1 << offset)) | ((data & 1) << offset);
+ prepare_display();
+}
+
+
+// EAG V5
+
+WRITE8_MEMBER(eagv5_state::reset_subcpu_w)
+{
+ // reset subcpu, from trigger to monostable 555 (R1=47K, C1=1uF)
+ m_subcpu->pulse_input_line(INPUT_LINE_RESET, attotime::from_msec(52));
+}
+
+READ8_MEMBER(eagv5_state::main_ack_r)
+{
+ // d8,d9: latches ack state
+ return (m_mainlatch->pending_r() << 1 ^ 2) | m_sublatch->pending_r();
+}
+
+READ8_MEMBER(eagv5_state::sub_ack_r)
+{
+ // d8,d9: latches ack state
+ return (m_sublatch->pending_r() << 1 ^ 2) | m_mainlatch->pending_r();
+}
+
+
+
+/******************************************************************************
+ Address Maps
+******************************************************************************/
+
+// Excel 68000
+
+void excel68k_state::fex68k_map(address_map &map)
+{
+ map(0x000000, 0x00ffff).rom();
+ map(0x000000, 0x00000f).mirror(0x00fff0).w(FUNC(excel68k_state::leds_w)).umask16(0x00ff);
+ map(0x000000, 0x00000f).mirror(0x00fff0).w(FUNC(excel68k_state::digit_w)).umask16(0xff00);
+ map(0x044000, 0x047fff).ram();
+ map(0x100000, 0x10000f).mirror(0x03fff0).r(FUNC(excel68k_state::input1_r)).umask16(0x00ff);
+ map(0x140000, 0x14000f).mirror(0x03fff0).w(FUNC(excel68k_state::mux_w)).umask16(0x00ff);
+}
+
+void excel68k_state::fex68km2_map(address_map &map)
+{
+ fex68k_map(map);
+ map(0x200000, 0x21ffff).ram();
+}
+
+void excel68k_state::fex68km3_map(address_map &map)
+{
+ fex68k_map(map);
+ map(0x200000, 0x20ffff).ram();
+}
+
+
+// EAG
+
+void eag_state::init_eag()
+{
+ // eag_map: DRAM slots at $200000-$2fffff - V1/V2/V5: 128K, V3: 512K, V4: 1M
+ m_maincpu->space(AS_PROGRAM).install_ram(0x200000, 0x200000 + m_ram->size() - 1, m_ram->pointer());
+}
+
+void eag_state::eag_map(address_map &map)
+{
+ map(0x000000, 0x01ffff).rom();
+ map(0x104000, 0x107fff).ram();
+ map(0x300000, 0x30000f).mirror(0x000010).w(FUNC(eag_state::digit_w)).umask16(0xff00).nopr();
+ map(0x300000, 0x30000f).mirror(0x000010).rw(FUNC(eag_state::input1_r), FUNC(eag_state::leds_w)).umask16(0x00ff);
+ map(0x400000, 0x400007).w(FUNC(eag_state::mux_w)).umask16(0x00ff);
+ map(0x400000, 0x407fff).r(FUNC(eag_state::cartridge_r)).umask16(0xff00);
+ map(0x604000, 0x607fff).ram().share("nvram");
+ map(0x700003, 0x700003).r(FUNC(eag_state::input2_r));
+}
+
+void eagv5_state::main_map(address_map &map)
+{
+ eag_map(map);
+ map(0x500000, 0x500000).r(m_sublatch, FUNC(generic_latch_8_device::read)).w(m_mainlatch, FUNC(generic_latch_8_device::write));
+ map(0x500002, 0x500002).rw(FUNC(eagv5_state::main_ack_r), FUNC(eagv5_state::reset_subcpu_w));
+}
+
+void eagv5_state::sub_map(address_map &map)
+{
+ map(0x000000, 0x00ffff).rom();
+ map(0x000001, 0x000001).mirror(0x00fffe).w(m_sublatch, FUNC(generic_latch_8_device::write));
+ map(0x044000, 0x047fff).ram();
+ map(0x140000, 0x140000).r(FUNC(eagv5_state::sub_ack_r));
+ map(0x140001, 0x140001).r(m_mainlatch, FUNC(generic_latch_8_device::read));
+}
+
+void eag_state::eagv7_map(address_map &map)
+{
+ map(0x000000, 0x01ffff).rom();
+ map(0x104000, 0x107fff).ram();
+ map(0x200000, 0x2fffff).ram();
+ map(0x300000, 0x30000f).mirror(0x000010).w(FUNC(eag_state::digit_w)).umask32(0xff00ff00).nopr();
+ map(0x300000, 0x30000f).mirror(0x000010).rw(FUNC(eag_state::input1_r), FUNC(eag_state::leds_w)).umask32(0x00ff00ff);
+ map(0x400000, 0x400007).w(FUNC(eag_state::mux_w)).umask32(0x00ff00ff);
+ map(0x400000, 0x407fff).r(FUNC(eag_state::cartridge_r)).umask32(0xff00ff00);
+ map(0x604000, 0x607fff).ram().share("nvram");
+ map(0x700003, 0x700003).r(FUNC(eag_state::input2_r));
+ map(0x800000, 0x807fff).ram();
+}
+
+void eag_state::eagv10_map(address_map &map)
+{
+ map(0x00000000, 0x0001ffff).rom();
+ map(0x00200000, 0x003fffff).ram();
+ map(0x00b00000, 0x00b0000f).mirror(0x00000010).w(FUNC(eag_state::digit_w)).umask32(0xff00ff00).nopr();
+ map(0x00b00000, 0x00b0000f).mirror(0x00000010).rw(FUNC(eag_state::input1_r), FUNC(eag_state::leds_w)).umask32(0x00ff00ff);
+ map(0x00c00000, 0x00c00007).w(FUNC(eag_state::mux_w)).umask32(0x00ff00ff);
+ map(0x00c00000, 0x00c07fff).r(FUNC(eag_state::cartridge_r)).umask32(0xff00ff00);
+ map(0x00e04000, 0x00e07fff).ram().share("nvram");
+ map(0x00f00003, 0x00f00003).r(FUNC(eag_state::input2_r));
+ map(0x01000000, 0x0101ffff).ram();
+}
+
+
+
+/******************************************************************************
+ Input Ports
+******************************************************************************/
+
+static INPUT_PORTS_START( excel68k )
+ PORT_INCLUDE( generic_cb_buttons )
+
+ PORT_START("IN.8")
+ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_DEL) PORT_NAME("Clear")
+ PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("Move / Pawn")
+ PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("Hint / Knight")
+ PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("Take Back / Bishop")
+ PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("Level / Rook")
+ PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("Options / Queen")
+ PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("Verify / King")
+ PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_R) PORT_CODE(KEYCODE_N) PORT_NAME("New Game")
+INPUT_PORTS_END
+
+
+static INPUT_PORTS_START( eag )
+ PORT_INCLUDE( generic_cb_magnets )
+
+ PORT_MODIFY("IN.0")
+ PORT_BIT(0x100, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_DEL) PORT_NAME("CL")
+
+ PORT_MODIFY("IN.1")
+ PORT_BIT(0x100, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_M) PORT_NAME("DM")
+
+ PORT_MODIFY("IN.2")
+ PORT_BIT(0x100, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_R) PORT_CODE(KEYCODE_N) PORT_NAME("New Game")
+
+ PORT_START("IN.8")
+ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("PB / King")
+ PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("PV / Queen")
+ PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("TM / Rook")
+ PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("ST / Bishop")
+ PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("TB / Knight")
+ PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("LV / Pawn")
+ PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_O) PORT_NAME("Option")
+ PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_V) PORT_NAME("RV")
+INPUT_PORTS_END
+
+
+
+/******************************************************************************
+ Machine Drivers
+******************************************************************************/
+
+void excel68k_state::fex68k(machine_config &config)
+{
+ /* basic machine hardware */
+ M68000(config, m_maincpu, 12_MHz_XTAL); // HD68HC000P12
+ m_maincpu->set_addrmap(AS_PROGRAM, &excel68k_state::fex68k_map);
+
+ const attotime irq_period = attotime::from_hz(618); // theoretical frequency from 556 timer (22nF, 91K + 20K POT @ 14.8K, 0.1K), measurement was 580Hz
+ TIMER(config, m_irq_on).configure_periodic(FUNC(excel68k_state::irq_on<M68K_IRQ_2>), irq_period);
+ m_irq_on->set_start_delay(irq_period - attotime::from_nsec(1528)); // active for 1.525us
+ TIMER(config, "irq_off").configure_periodic(FUNC(excel68k_state::irq_off<M68K_IRQ_2>), irq_period);
+
+ TIMER(config, "display_decay").configure_periodic(FUNC(excel68k_state::display_decay_tick), attotime::from_msec(1));
+ config.set_default_layout(layout_fidel_ex_68k);
+
+ /* sound hardware */
+ SPEAKER(config, "speaker").front_center();
+ DAC_1BIT(config, m_dac).add_route(ALL_OUTPUTS, "speaker", 0.25);
+ VOLTAGE_REGULATOR(config, "vref").add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT);
+}
+
+void excel68k_state::fex68km2(machine_config &config)
+{
+ fex68k(config);
+
+ /* basic machine hardware */
+ m_maincpu->set_addrmap(AS_PROGRAM, &excel68k_state::fex68km2_map);
+}
+
+void excel68k_state::fex68km3(machine_config &config)
+{
+ fex68k(config);
+
+ /* basic machine hardware */
+ m_maincpu->set_clock(16_MHz_XTAL); // factory overclock
+ m_maincpu->set_addrmap(AS_PROGRAM, &excel68k_state::fex68km3_map);
+}
+
+void eag_state::eag_base(machine_config &config)
+{
+ /* basic machine hardware */
+ M68000(config, m_maincpu, 16_MHz_XTAL);
+ m_maincpu->set_addrmap(AS_PROGRAM, &eag_state::eag_map);
+
+ const attotime irq_period = attotime::from_hz(4.9152_MHz_XTAL/0x2000); // 4060 Q13, 600Hz
+ TIMER(config, m_irq_on).configure_periodic(FUNC(eag_state::irq_on<M68K_IRQ_2>), irq_period);
+ m_irq_on->set_start_delay(irq_period - attotime::from_nsec(8250)); // active for 8.25us
+ TIMER(config, "irq_off").configure_periodic(FUNC(eag_state::irq_off<M68K_IRQ_2>), irq_period);
+
+ NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_1);
+
+ TIMER(config, "display_decay").configure_periodic(FUNC(eag_state::display_decay_tick), attotime::from_msec(1));
+ config.set_default_layout(layout_fidel_eag_68k);
+
+ /* sound hardware */
+ SPEAKER(config, "speaker").front_center();
+ DAC_1BIT(config, m_dac).add_route(ALL_OUTPUTS, "speaker", 0.25);
+ VOLTAGE_REGULATOR(config, "vref").add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT);
+
+ /* cartridge */
+ GENERIC_CARTSLOT(config, m_cart, generic_plain_slot, "fidel_scc", "bin,dat");
+ m_cart->set_device_load(device_image_load_delegate(&eag_state::device_image_load_scc_cartridge, this));
+
+ SOFTWARE_LIST(config, "cart_list").set_original("fidel_scc");
+}
+
+void eag_state::eagv2(machine_config &config)
+{
+ eag_base(config);
+
+ /* basic machine hardware */
+ RAM(config, m_ram).set_extra_options("128K, 512K, 1M");
+ m_ram->set_default_size("128K");
+}
+
+void eag_state::eagv3(machine_config &config)
+{
+ eagv2(config);
+
+ /* basic machine hardware */
+ m_ram->set_default_size("512K");
+}
+
+void eagv5_state::eagv5(machine_config &config)
+{
+ eagv2(config);
+
+ /* basic machine hardware */
+ m_maincpu->set_addrmap(AS_PROGRAM, &eagv5_state::main_map);
+
+ M68000(config, m_subcpu, 16_MHz_XTAL);
+ m_subcpu->set_addrmap(AS_PROGRAM, &eagv5_state::sub_map);
+ m_subcpu->set_periodic_int(FUNC(eagv5_state::irq2_line_hold), attotime::from_hz(16_MHz_XTAL/0x4000)); // 4060 Q14, ~1kHz
+
+ GENERIC_LATCH_8(config, m_mainlatch);
+ GENERIC_LATCH_8(config, m_sublatch);
+ m_sublatch->data_pending_callback().set_inputline(m_maincpu, M68K_IRQ_1); // IPL0
+
+ // gen_latch syncs on write, but this is still needed with tight cpu comms
+ // (not that it locks up or anything, but it will calculate moves much slower if timing is off)
+ config.m_perfect_cpu_quantum = subtag("maincpu");
+}
+
+void eag_state::eagv7(machine_config &config)
+{
+ eag_base(config);
+
+ /* basic machine hardware */
+ M68020(config.replace(), m_maincpu, 20_MHz_XTAL); // also seen with 25MHz XTAL
+ m_maincpu->set_addrmap(AS_PROGRAM, &eag_state::eagv7_map);
+}
+
+void eag_state::eagv9(machine_config &config)
+{
+ eagv7(config);
+
+ /* basic machine hardware */
+ M68030(config.replace(), m_maincpu, 32_MHz_XTAL/2); // also seen with 40MHz XTAL
+ m_maincpu->set_addrmap(AS_PROGRAM, &eag_state::eagv7_map);
+}
+
+void eag_state::eagv10(machine_config &config)
+{
+ eagv7(config);
+
+ /* basic machine hardware */
+ M68040(config.replace(), m_maincpu, 25_MHz_XTAL);
+ m_maincpu->set_addrmap(AS_PROGRAM, &eag_state::eagv10_map);
+}
+
+void eag_state::eagv11(machine_config &config)
+{
+ eagv7(config);
+
+ /* basic machine hardware */
+ M68EC040(config.replace(), m_maincpu, 36_MHz_XTAL*2*2); // wrong! should be M68EC060 @ 72MHz
+ m_maincpu->set_addrmap(AS_PROGRAM, &eag_state::eagv10_map);
+ m_maincpu->set_periodic_int(FUNC(eag_state::irq2_line_hold), attotime::from_hz(600));
+
+ config.device_remove("irq_on"); // 8.25us is too long
+ config.device_remove("irq_off");
+}
+
+
+
+/******************************************************************************
+ ROM Definitions
+******************************************************************************/
+
+ROM_START( fex68k ) // model 6094, PCB label 510.1120B01
+ ROM_REGION16_BE( 0x10000, "maincpu", 0 )
+ ROM_LOAD16_BYTE("e3_yellow.u6", 0x00000, 0x08000, CRC(a8a27714) SHA1(bc42a561eb39dd389c7831f1a25ad260510085d8) ) // AT27C256-15
+ ROM_LOAD16_BYTE("o4_red.u7", 0x00001, 0x08000, CRC(560a14b7) SHA1(11f2375255bfa229314697f103e891ba1cf0c715) ) // "
+ROM_END
+
+ROM_START( fex68ka )
+ ROM_REGION16_BE( 0x10000, "maincpu", 0 )
+ ROM_LOAD16_BYTE("e3_yellow.u6", 0x00000, 0x08000, CRC(7dc60d05) SHA1(e47b4d4e64c4cac6c5a94a900c9f2dd017f849ce) )
+ ROM_LOAD16_BYTE("o4_red.u7", 0x00001, 0x08000, CRC(4b738583) SHA1(ff506296ea460c7ed852339d2ab24aaae01730d8) )
+ROM_END
+
+ROM_START( fex68kb )
+ ROM_REGION16_BE( 0x10000, "maincpu", 0 )
+ ROM_LOAD16_BYTE("e3_yellow.u6", 0x00000, 0x08000, CRC(d9f252f5) SHA1(205cdbadb58a4cdd486d4e40d2fe6a5209d2f8a4) )
+ ROM_LOAD16_BYTE("o4_red.u7", 0x00001, 0x08000, CRC(3bf8b3d7) SHA1(6ce419c63159501d2349abfd1e142e38e5466fbc) )
+ROM_END
+
+ROM_START( fex68km2 ) // model 6097, PCB label 510.1120B01
+ ROM_REGION16_BE( 0x10000, "maincpu", 0 )
+ ROM_LOAD16_BYTE("e6_yellow.u6", 0x00000, 0x08000, CRC(2e65e7ad) SHA1(4f3aec12041c9014d5d700909bac66bae1f9eadf) ) // 27c256
+ ROM_LOAD16_BYTE("o7_red.u7", 0x00001, 0x08000, CRC(4c20334a) SHA1(2e575b88c41505cc89599d2fc13e1e84fe474469) ) // "
+ROM_END
+
+ROM_START( fex68km3 ) // model 6098, PCB label 510.1120B01
+ ROM_REGION16_BE( 0x10000, "maincpu", 0 )
+ ROM_LOAD16_BYTE("me_white.u6", 0x00000, 0x08000, CRC(4b14cd9f) SHA1(4d41196900a71bf0699dae50f4726acc0ed3dced) ) // 27c256
+ ROM_LOAD16_BYTE("mo_yellow.u7", 0x00001, 0x08000, CRC(b96b0b5f) SHA1(281145be802efb38ed764aecb26b511dcd71cb87) ) // "
+ROM_END
+
+
+ROM_START( feagv2 )
+ ROM_REGION16_BE( 0x20000, "maincpu", 0 )
+ ROM_LOAD16_BYTE("6114_e5_yellow.u22", 0x00000, 0x10000, CRC(f9c7bada) SHA1(60e545f829121b9a4f1100d9e85ac83797715e80) ) // 27c512
+ ROM_LOAD16_BYTE("6114_o5_green.u19", 0x00001, 0x10000, CRC(04f97b22) SHA1(8b2845dd115498f7b385e8948eca6a5893c223d1) ) // "
+ROM_END
+
+ROM_START( feagv3 )
+ ROM_REGION16_BE( 0x20000, "maincpu", 0 )
+ ROM_LOAD16_BYTE("elite_1.6_e.u22", 0x00000, 0x10000, CRC(c8b89ccc) SHA1(d62e0a72f54b793ab8853468a81255b62f874658) )
+ ROM_LOAD16_BYTE("elite_1.6_o.u19", 0x00001, 0x10000, CRC(904c7061) SHA1(742110576cf673321440bc81a4dae4c949b49e38) )
+ROM_END
+
+ROM_START( feagv5 )
+ ROM_REGION( 0x20000, "maincpu", 0 ) // PCB label 510.1136A01
+ ROM_LOAD16_BYTE("master_e", 0x00000, 0x10000, CRC(e424bddc) SHA1(ff03656addfe5c47f06df2efb4602f43a9e19d96) )
+ ROM_LOAD16_BYTE("master_o", 0x00001, 0x10000, CRC(33a00894) SHA1(849460332b1ac10d452ca3631eb99f5597511b73) )
+
+ ROM_REGION( 0x10000, "subcpu", 0 ) // PCB label 510.1138B01
+ ROM_LOAD16_BYTE("slave_e", 0x00000, 0x08000, CRC(eea4de52) SHA1(a64ca8a44b431e2fa7f00e44cab7e6aa2d4a9403) )
+ ROM_LOAD16_BYTE("slave_o", 0x00001, 0x08000, CRC(35fe2fdf) SHA1(731da12ee290bad9bc03cffe281c8cc48e555dfb) )
+ROM_END
+
+ROM_START( feagv7 )
+ ROM_REGION( 0x20000, "maincpu", 0 )
+ ROM_LOAD16_BYTE("eag-v7b", 0x00000, 0x10000, CRC(f2f68b63) SHA1(621e5073e9c5083ac9a9b467f3ef8aa29beac5ac) )
+ ROM_LOAD16_BYTE("eag-v7a", 0x00001, 0x10000, CRC(506b688f) SHA1(0a091c35d0f01166b57f964b111cde51c5720d58) )
+ROM_END
+
+ROM_START( feagv7a )
+ ROM_REGION( 0x20000, "maincpu", 0 )
+ ROM_LOAD16_BYTE("eag-v7b", 0x00000, 0x10000, CRC(44baefbf) SHA1(dbc24340d7e3013cc8f111ebb2a59169c5dcb8e8) )
+ ROM_LOAD16_BYTE("eag-v7a", 0x00001, 0x10000, CRC(951a7857) SHA1(dad21b049fd4f411a79d4faefb922c1277569c0e) )
+ROM_END
+
+ROM_START( feagv9 )
+ ROM_REGION( 0x20000, "maincpu", 0 )
+ ROM_LOAD16_BYTE("eag-v9b", 0x00000, 0x10000, CRC(60523199) SHA1(a308eb6b782732af1ab2fd0ed8b046de7a8dd24b) )
+ ROM_LOAD16_BYTE("eag-v9a", 0x00001, 0x10000, CRC(255c63c0) SHA1(8aa0397bdb3731002f5b066cd04ec62531267e22) )
+ROM_END
+
+ROM_START( feagv10 )
+ ROM_REGION( 0x20000, "maincpu", 0 )
+ ROM_LOAD32_BYTE("16", 0x00000, 0x08000, CRC(8375d61f) SHA1(e042f6f01480c59ee09a458cf34f135664479824) ) // 27c256
+ ROM_LOAD32_BYTE("17", 0x00001, 0x08000, CRC(bfd14916) SHA1(115af6dfd29ddd8ad6d2ce390f8ecc4d60de6fce) ) // "
+ ROM_LOAD32_BYTE("18", 0x00002, 0x08000, CRC(9341dcaf) SHA1(686bd4799e89ffaf11a813d4cf5a2aedd4c2d97a) ) // "
+ ROM_LOAD32_BYTE("19", 0x00003, 0x08000, CRC(a70c5468) SHA1(7f6b4f46577d5cfdaa84d387c7ce35d941e5bbc7) ) // "
+ROM_END
+
+ROM_START( feagv11 )
+ ROM_REGION( 0x20000, "maincpu", 0 )
+ ROM_LOAD32_BYTE("16", 0x00000, 0x08000, CRC(8375d61f) SHA1(e042f6f01480c59ee09a458cf34f135664479824) ) // 27c256
+ ROM_LOAD32_BYTE("17", 0x00001, 0x08000, CRC(bfd14916) SHA1(115af6dfd29ddd8ad6d2ce390f8ecc4d60de6fce) ) // "
+ ROM_LOAD32_BYTE("18", 0x00002, 0x08000, CRC(9341dcaf) SHA1(686bd4799e89ffaf11a813d4cf5a2aedd4c2d97a) ) // "
+ ROM_LOAD32_BYTE("19", 0x00003, 0x08000, CRC(a70c5468) SHA1(7f6b4f46577d5cfdaa84d387c7ce35d941e5bbc7) ) // "
+ROM_END
+
+} // anonymous namespace
+
+
+/******************************************************************************
+ Drivers
+******************************************************************************/
+
+// YEAR NAME PARENT CMP MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS
+CONS( 1987, fex68k, 0, 0, fex68k, excel68k, excel68k_state, empty_init, "Fidelity Electronics", "Excel 68000 (set 1)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
+CONS( 1987, fex68ka, fex68k, 0, fex68k, excel68k, excel68k_state, empty_init, "Fidelity Electronics", "Excel 68000 (set 2)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
+CONS( 1987, fex68kb, fex68k, 0, fex68k, excel68k, excel68k_state, empty_init, "Fidelity Electronics", "Excel 68000 (set 3)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
+CONS( 1988, fex68km2, fex68k, 0, fex68km2, excel68k, excel68k_state, empty_init, "Fidelity Electronics", "Excel 68000 Mach II (rev. C+)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
+CONS( 1988, fex68km3, fex68k, 0, fex68km3, excel68k, excel68k_state, empty_init, "Fidelity Electronics", "Excel 68000 Mach III Master", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
+
+CONS( 1989, feagv2, 0, 0, eagv2, eag, eag_state, init_eag, "Fidelity Electronics", "Elite Avant Garde (model 6114-2)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
+CONS( 1989, feagv3, feagv2, 0, eagv3, eag, eag_state, init_eag, "Fidelity Electronics", "Elite Avant Garde (model 6114-3)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
+CONS( 1989, feagv5, feagv2, 0, eagv5, eag, eagv5_state, init_eag, "Fidelity Electronics", "Elite Avant Garde (model 6114-5)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
+CONS( 1990, feagv7, feagv2, 0, eagv7, eag, eag_state, empty_init, "Fidelity Electronics", "Elite Avant Garde (model 6117-7, set 1)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
+CONS( 1990, feagv7a, feagv2, 0, eagv7, eag, eag_state, empty_init, "Fidelity Electronics", "Elite Avant Garde (model 6117-7, set 2)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
+CONS( 1990, feagv9, feagv2, 0, eagv9, eag, eag_state, empty_init, "Fidelity Electronics", "Elite Avant Garde (model 6117-9)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
+CONS( 1990, feagv10, feagv2, 0, eagv10, eag, eag_state, empty_init, "Fidelity Electronics", "Elite Avant Garde (model 6117-10)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
+CONS( 2002, feagv11, feagv2, 0, eagv11, eag, eag_state, empty_init, "hack (Wilfried Bucke)", "Elite Avant Garde (model 6117-11)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS | MACHINE_IMPERFECT_TIMING | MACHINE_IMPERFECT_SOUND )
diff --git a/src/mame/drivers/fidel_elite.cpp b/src/mame/drivers/fidel_elite.cpp
new file mode 100644
index 00000000000..b3b2bc3ac56
--- /dev/null
+++ b/src/mame/drivers/fidel_elite.cpp
@@ -0,0 +1,647 @@
+// license:BSD-3-Clause
+// copyright-holders:hap
+// thanks-to:Berger
+/******************************************************************************
+*
+* fidel_elite.cpp, subdriver of machine/fidelbase.cpp, machine/chessbase.cpp
+
+Fidelity Elite A/S series hardware (EAS, EAG, PC)
+see fidel_eag68k.cpp for 68000-based EAG hardware
+
+*******************************************************************************
+
+Elite A/S Challenger (EAS)
+---------------------------------
+This came out in 1982. 2 program updates were released in 1983 and 1984,
+named Budapest and Glasgow, places where Fidelity won chess computer matches.
+A/S stands for auto sensory, it's the 1st Fidelity board with magnet sensors.
+The magnetic chessboard was licensed from AVE Micro Systems, in fact it's the
+exact same one as in AVE's ARB (ave_arb.cpp driver).
+
+hardware overview:
+- 8*8 magnet sensors, 11 buttons, 8*(8+1) LEDs + 4*7seg LEDs
+- R65C02P4 or R6502BP CPU, default frequency 3MHz*
+- 4KB RAM (2*HM6116), 24KB ROM
+- TSI S14001A + speech ROM
+- I/O with 8255 PPI and bunch of TTL
+- module slot and printer port
+- PCB label 510-1071A01
+
+*In West Germany, some distributors released it with overclocked CPUs,
+advertised as 3.2, 3.6, or 4MHz. Unmodified EAS PCB photos show only a 3MHz XTAL.
+
+A condensator keeps RAM contents alive for a few hours when powered off.
+
+Prestige Challenger (PC) hardware is very similar. They stripped the 8255 PPI,
+and added more RAM(7*TMM2016P). Some were released at 3.6MHz instead of 4MHz,
+perhaps due to hardware instability? Opening module PC16 was included by default,
+this module is the same as CB16 but at different form factor.
+
+Elite Avant Garde (models 6081,6088,6089) is on the same hardware as EAS.
+
+Fidelity Private Line is a modified EAS Glasgow. They took out the motherboard
+and leds and placed them a little box separate from a (ledless) magnetic chessboard.
+It was probably only released in Germany.
+
+******************************************************************************/
+
+#include "emu.h"
+#include "includes/fidelbase.h"
+
+#include "cpu/m6502/m65c02.h"
+#include "cpu/m6502/r65c02.h"
+#include "machine/i8255.h"
+#include "machine/nvram.h"
+#include "sound/volt_reg.h"
+#include "speaker.h"
+
+// internal artwork
+#include "fidel_eag.lh" // clickable
+#include "fidel_eas.lh" // clickable
+#include "fidel_eas_priv.lh" // clickable
+#include "fidel_pc.lh" // clickable
+
+
+namespace {
+
+class elite_state : public fidelbase_state
+{
+public:
+ elite_state(const machine_config &mconfig, device_type type, const char *tag) :
+ fidelbase_state(mconfig, type, tag),
+ m_ppi8255(*this, "ppi8255")
+ { }
+
+ // machine drivers
+ void pc(machine_config &config);
+ void eas(machine_config &config);
+ void eas_priv(machine_config &config);
+ void eag(machine_config &config);
+ void eag2100(machine_config &config);
+
+ void init_eag2100();
+
+private:
+ // devices/pointers
+ optional_device<i8255_device> m_ppi8255;
+
+ // address maps
+ void eas_map(address_map &map);
+ void eag_map(address_map &map);
+ void eag2100_map(address_map &map);
+ void pc_map(address_map &map);
+
+ // I/O handlers
+ void prepare_display();
+ DECLARE_READ8_MEMBER(speech_r);
+ DECLARE_WRITE8_MEMBER(segment_w);
+ DECLARE_WRITE8_MEMBER(led_w);
+ DECLARE_READ8_MEMBER(input_r);
+ DECLARE_WRITE8_MEMBER(ppi_porta_w);
+ DECLARE_READ8_MEMBER(ppi_portb_r);
+ DECLARE_WRITE8_MEMBER(ppi_portc_w);
+};
+
+void elite_state::init_eag2100()
+{
+ m_rombank->configure_entries(0, 4, memregion("rombank")->base(), 0x2000);
+}
+
+
+/******************************************************************************
+ Devices, I/O
+******************************************************************************/
+
+// TTL/generic
+
+void elite_state::prepare_display()
+{
+ // 4/8 7seg leds+H, 8*8(+1) chessboard leds
+ set_display_segmask(0x1ef, 0x7f);
+ display_matrix(16, 9, m_led_data << 8 | m_7seg_data, m_led_select);
+}
+
+READ8_MEMBER(elite_state::speech_r)
+{
+ return m_speech_rom[m_speech_bank << 12 | offset];
+}
+
+WRITE8_MEMBER(elite_state::segment_w)
+{
+ // a0-a2,d7: digit segment
+ m_7seg_data = (data & 0x80) >> offset;
+ m_7seg_data = bitswap<8>(m_7seg_data,7,6,4,5,0,2,1,3);
+ prepare_display();
+}
+
+WRITE8_MEMBER(elite_state::led_w)
+{
+ // a0-a2,d0: led data
+ m_led_data = (data & 1) << offset;
+ prepare_display();
+}
+
+READ8_MEMBER(elite_state::input_r)
+{
+ // multiplexed inputs (active low)
+ return read_inputs(9) ^ 0xff;
+}
+
+
+// 8255 PPI (PC: done with TTL instead)
+
+WRITE8_MEMBER(elite_state::ppi_porta_w)
+{
+ // d0-d5: TSI C0-C5
+ // d6: TSI START line
+ m_speech->data_w(space, 0, data & 0x3f);
+ m_speech->start_w(data >> 6 & 1);
+
+ // d7: printer? (black wire to LED pcb)
+}
+
+WRITE8_MEMBER(elite_state::ppi_portc_w)
+{
+ // d0-d3: 7442 a0-a3
+ // 7442 0-8: led select, input mux
+ m_led_select = 1 << (data & 0xf) & 0x3ff;
+ m_inp_mux = m_led_select & 0x1ff;
+ prepare_display();
+
+ // 7442 9: speaker out
+ m_dac->write(BIT(m_led_select, 9));
+
+ // d4: speech ROM A12
+ m_speech->force_update(); // update stream to now
+ m_speech_bank = data >> 4 & 1;
+
+ // d5: lower TSI volume
+ m_speech->set_output_gain(0, (data & 0x20) ? 0.5 : 1.0);
+
+ // d6,d7: bookrom bankswitch (model EAG)
+ if (m_rombank != nullptr)
+ m_rombank->set_entry(data >> 6 & 3);
+}
+
+READ8_MEMBER(elite_state::ppi_portb_r)
+{
+ // d0: printer? white wire from LED pcb
+ u8 data = 1;
+
+ // d1: TSI BUSY line
+ data |= (m_speech->busy_r()) ? 2 : 0;
+
+ // d2,d3: language switches(hardwired)
+ data |= *m_language << 2 & 0x0c;
+
+ // d5: multiplexed inputs highest bit
+ data |= (read_inputs(9) & 0x100) ? 0 : 0x20;
+
+ // other: ?
+ return data | 0xd0;
+}
+
+
+
+/******************************************************************************
+ Address Maps
+******************************************************************************/
+
+void elite_state::eas_map(address_map &map)
+{
+ map.unmap_value_high();
+ map(0x0000, 0x0fff).ram().share("nvram");
+ map(0x2000, 0x5fff).r(FUNC(elite_state::cartridge_r));
+ map(0x7000, 0x7003).rw(m_ppi8255, FUNC(i8255_device::read), FUNC(i8255_device::write));
+ map(0x7020, 0x7027).w(FUNC(elite_state::segment_w)).nopr();
+ map(0x7030, 0x7037).w(FUNC(elite_state::led_w)).nopr();
+ map(0x7050, 0x7050).r(FUNC(elite_state::input_r));
+ map(0x8000, 0x9fff).rom();
+ map(0xc000, 0xffff).rom();
+}
+
+void elite_state::eag_map(address_map &map)
+{
+ map.unmap_value_high();
+ map(0x0000, 0x1fff).ram().share("nvram.ic8");
+ map(0x2000, 0x5fff).r(FUNC(elite_state::cartridge_r));
+ map(0x7000, 0x7003).rw(m_ppi8255, FUNC(i8255_device::read), FUNC(i8255_device::write));
+ map(0x7020, 0x7027).w(FUNC(elite_state::segment_w)).nopr();
+ map(0x7030, 0x7037).w(FUNC(elite_state::led_w)).nopr();
+ map(0x7050, 0x7050).r(FUNC(elite_state::input_r));
+ map(0x8000, 0x9fff).ram().share("nvram.ic6");
+ map(0xa000, 0xffff).rom();
+}
+
+void elite_state::eag2100_map(address_map &map)
+{
+ eag_map(map);
+ map(0xa000, 0xbfff).bankr("rombank");
+}
+
+void elite_state::pc_map(address_map &map)
+{
+ map.unmap_value_high();
+ map(0x0000, 0x17ff).ram();
+ map(0x2000, 0x5fff).r(FUNC(elite_state::cartridge_r));
+ map(0x7000, 0x7000).w(FUNC(elite_state::ppi_porta_w));
+ map(0x7010, 0x7010).r(FUNC(elite_state::ppi_portb_r));
+ map(0x7020, 0x7027).w(FUNC(elite_state::segment_w)).nopr();
+ map(0x7030, 0x7037).w(FUNC(elite_state::led_w)).nopr();
+ map(0x7040, 0x7040).w(FUNC(elite_state::ppi_portc_w));
+ map(0x7050, 0x7050).r(FUNC(elite_state::input_r));
+ map(0x8000, 0x9fff).ram();
+ map(0xb000, 0xffff).rom();
+}
+
+
+
+/******************************************************************************
+ Input Ports
+******************************************************************************/
+
+static INPUT_PORTS_START( eas )
+ PORT_INCLUDE( fidel_cpu_div_4 )
+ PORT_INCLUDE( generic_cb_magnets )
+
+ PORT_MODIFY("IN.0")
+ PORT_BIT(0x100, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_M) PORT_NAME("DM")
+
+ PORT_MODIFY("IN.1")
+ PORT_BIT(0x100, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_DEL) PORT_NAME("CL")
+
+ PORT_MODIFY("IN.2")
+ PORT_BIT(0x100, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_V) PORT_NAME("RV")
+
+ PORT_START("IN.8")
+ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_G) PORT_NAME("Game Control") // labeled RESET on the Prestige, but led display still says - G C -
+ PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_SPACE) PORT_NAME("Speaker")
+ PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("PB / King")
+ PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("PV / Queen")
+ PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("TM / Rook")
+ PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("ST / Bishop")
+ PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("TB / Knight")
+ PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("LV / Pawn")
+INPUT_PORTS_END
+
+static INPUT_PORTS_START( eag )
+ PORT_INCLUDE( fidel_cpu_div_4 )
+ PORT_INCLUDE( generic_cb_magnets )
+
+ PORT_MODIFY("IN.0")
+ PORT_BIT(0x100, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_DEL) PORT_NAME("CL")
+
+ PORT_MODIFY("IN.1")
+ PORT_BIT(0x100, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_M) PORT_NAME("DM")
+
+ PORT_MODIFY("IN.2")
+ PORT_BIT(0x100, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_R) PORT_CODE(KEYCODE_N) PORT_NAME("New Game")
+
+ PORT_START("IN.8")
+ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_V) PORT_NAME("RV")
+ PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_O) PORT_NAME("Option")
+ PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("LV / Pawn")
+ PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("TB / Knight")
+ PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("ST / Bishop")
+ PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("TM / Rook")
+ PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("PV / Queen")
+ PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("PB / King")
+INPUT_PORTS_END
+
+
+
+/******************************************************************************
+ Machine Drivers
+******************************************************************************/
+
+void elite_state::pc(machine_config &config)
+{
+ /* basic machine hardware */
+ R65C02(config, m_maincpu, 4_MHz_XTAL); // R65C02P4
+ m_maincpu->set_addrmap(AS_PROGRAM, &elite_state::div_trampoline);
+ ADDRESS_MAP_BANK(config, m_mainmap).set_map(&elite_state::pc_map).set_options(ENDIANNESS_LITTLE, 8, 16);
+
+ TIMER(config, "dummy_timer").configure_periodic(timer_device::expired_delegate(), attotime::from_hz(4_MHz_XTAL));
+
+ const attotime irq_period = attotime::from_hz(38.4_kHz_XTAL/64); // through 4060 IC, 600Hz
+ TIMER(config, m_irq_on).configure_periodic(FUNC(elite_state::irq_on<M6502_IRQ_LINE>), irq_period);
+ m_irq_on->set_start_delay(irq_period - attotime::from_hz(38.4_kHz_XTAL*2)); // edge!
+ TIMER(config, "irq_off").configure_periodic(FUNC(elite_state::irq_off<M6502_IRQ_LINE>), irq_period);
+
+ TIMER(config, "display_decay").configure_periodic(FUNC(elite_state::display_decay_tick), attotime::from_msec(1));
+ config.set_default_layout(layout_fidel_pc);
+
+ /* sound hardware */
+ SPEAKER(config, "speaker").front_center();
+ S14001A(config, m_speech, 25000); // R/C circuit, around 25khz
+ m_speech->ext_read().set(FUNC(elite_state::speech_r));
+ m_speech->add_route(ALL_OUTPUTS, "speaker", 0.75);
+
+ DAC_1BIT(config, m_dac).add_route(ALL_OUTPUTS, "speaker", 0.25);
+ VOLTAGE_REGULATOR(config, "vref").add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT);
+
+ /* cartridge */
+ GENERIC_CARTSLOT(config, m_cart, generic_plain_slot, "fidel_scc", "bin,dat");
+ m_cart->set_device_load(device_image_load_delegate(&elite_state::device_image_load_scc_cartridge, this));
+
+ SOFTWARE_LIST(config, "cart_list").set_original("fidel_scc");
+}
+
+void elite_state::eas(machine_config &config)
+{
+ pc(config);
+
+ /* basic machine hardware */
+ m_maincpu->set_clock(3_MHz_XTAL);
+ m_mainmap->set_addrmap(AS_PROGRAM, &elite_state::eas_map);
+ TIMER(config.replace(), "dummy_timer").configure_periodic(timer_device::expired_delegate(), attotime::from_hz(3_MHz_XTAL));
+
+ I8255(config, m_ppi8255); // port B: input, port A & C: output
+ m_ppi8255->out_pa_callback().set(FUNC(elite_state::ppi_porta_w));
+ m_ppi8255->tri_pa_callback().set_constant(0);
+ m_ppi8255->in_pb_callback().set(FUNC(elite_state::ppi_portb_r));
+ m_ppi8255->out_pc_callback().set(FUNC(elite_state::ppi_portc_w));
+
+ NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
+
+ config.set_default_layout(layout_fidel_eas);
+}
+
+void elite_state::eas_priv(machine_config &config)
+{
+ eas(config);
+
+ /* basic machine hardware */
+ M65C02(config.replace(), m_maincpu, 3.579545_MHz_XTAL); // UM6502C
+ m_maincpu->set_addrmap(AS_PROGRAM, &elite_state::div_trampoline);
+ TIMER(config.replace(), "dummy_timer").configure_periodic(timer_device::expired_delegate(), attotime::from_hz(3.579545_MHz_XTAL));
+
+ config.set_default_layout(layout_fidel_eas_priv);
+}
+
+void elite_state::eag(machine_config &config)
+{
+ eas(config);
+
+ /* basic machine hardware */
+ m_maincpu->set_clock(5_MHz_XTAL); // R65C02P4
+ m_mainmap->set_addrmap(AS_PROGRAM, &elite_state::eag_map);
+ TIMER(config.replace(), "dummy_timer").configure_periodic(timer_device::expired_delegate(), attotime::from_hz(5_MHz_XTAL));
+
+ config.device_remove("nvram");
+ NVRAM(config, "nvram.ic8", nvram_device::DEFAULT_ALL_0);
+ NVRAM(config, "nvram.ic6", nvram_device::DEFAULT_ALL_0);
+
+ config.set_default_layout(layout_fidel_eag);
+}
+
+void elite_state::eag2100(machine_config &config)
+{
+ eag(config);
+
+ /* basic machine hardware */
+ m_mainmap->set_addrmap(AS_PROGRAM, &elite_state::eag2100_map);
+}
+
+
+
+/******************************************************************************
+ ROM Definitions
+******************************************************************************/
+
+ROM_START( feasbu )
+ ROM_REGION( 0x10000, "mainmap", 0 )
+ ROM_LOAD("eli_bu.6", 0x8000, 0x0800, CRC(93dcc23b) SHA1(2eb8c5a85e566948bc256d6b1804694e6b0ffa6f) ) // ST M27C64A, unknown label
+ ROM_CONTINUE( 0x9000, 0x0800 )
+ ROM_CONTINUE( 0x8800, 0x0800 )
+ ROM_CONTINUE( 0x9800, 0x0800 )
+ ROM_LOAD("101-1052a02.5", 0xc000, 0x2000, CRC(859d69f1) SHA1(a8b057683369e2387f22fc7e916b6f3c75d44b21) ) // Mostek MK36C63N-5
+ ROM_LOAD("101-1052a01.4", 0xe000, 0x2000, CRC(571a33a7) SHA1(43b110cf0918caf16643178f401e58b2dc73894f) ) // Mostek MK36C63N-5
+
+ // speech ROM
+ ROM_DEFAULT_BIOS("en")
+ ROM_SYSTEM_BIOS(0, "en", "English")
+ ROM_SYSTEM_BIOS(1, "de", "German")
+ ROM_SYSTEM_BIOS(2, "fr", "French")
+ ROM_SYSTEM_BIOS(3, "sp", "Spanish")
+
+ ROM_REGION( 1, "language", 0 )
+ ROMX_FILL(0, 1, 3, ROM_BIOS(0) )
+ ROMX_FILL(0, 1, 2, ROM_BIOS(1) )
+ ROMX_FILL(0, 1, 1, ROM_BIOS(2) )
+ ROMX_FILL(0, 1, 0, ROM_BIOS(3) )
+
+ ROM_REGION( 0x2000, "speech", 0 )
+ ROMX_LOAD("101-32107", 0x0000, 0x1000, CRC(f35784f9) SHA1(348e54a7fa1e8091f89ac656b4da22f28ca2e44d), ROM_BIOS(0) ) // NEC D2332C
+ ROM_RELOAD( 0x1000, 0x1000)
+ ROMX_LOAD("101-64101", 0x0000, 0x2000, CRC(6c85e310) SHA1(20d1d6543c1e6a1f04184a2df2a468f33faec3ff), ROM_BIOS(1) )
+ ROMX_LOAD("101-64105", 0x0000, 0x2000, CRC(fe8c5c18) SHA1(2b64279ab3747ee81c86963c13e78321c6cfa3a3), ROM_BIOS(2) )
+ ROMX_LOAD("101-64106", 0x0000, 0x2000, CRC(8766e128) SHA1(78c7413bf240159720b131ab70bfbdf4e86eb1e9), ROM_BIOS(3) )
+ROM_END
+
+ROM_START( feasgla )
+ ROM_REGION( 0x10000, "mainmap", 0 )
+ ROM_LOAD("eli_gla.6", 0x8000, 0x0800, CRC(2fdddb4f) SHA1(6da0a328a45462f285ae6a0756f97c5a43148f97) )
+ ROM_CONTINUE( 0x9000, 0x0800 )
+ ROM_CONTINUE( 0x8800, 0x0800 )
+ ROM_CONTINUE( 0x9800, 0x0800 )
+ ROM_LOAD("eli_gla.5", 0xc000, 0x0800, CRC(f094e625) SHA1(fef84c6a3da504aac15988ec9af94417e5fedfbd) )
+ ROM_CONTINUE( 0xd000, 0x0800 )
+ ROM_CONTINUE( 0xc800, 0x0800 )
+ ROM_CONTINUE( 0xd800, 0x0800 )
+ ROM_LOAD("eli_gla.4", 0xe000, 0x0800, CRC(5f6845d1) SHA1(684eb16faf36a49560e5a73b55fd0022dc090e35) )
+ ROM_CONTINUE( 0xf000, 0x0800 )
+ ROM_CONTINUE( 0xe800, 0x0800 )
+ ROM_CONTINUE( 0xf800, 0x0800 )
+
+ // speech ROM
+ ROM_DEFAULT_BIOS("en")
+ ROM_SYSTEM_BIOS(0, "en", "English")
+ ROM_SYSTEM_BIOS(1, "de", "German")
+ ROM_SYSTEM_BIOS(2, "fr", "French")
+ ROM_SYSTEM_BIOS(3, "sp", "Spanish")
+
+ ROM_REGION( 1, "language", 0 )
+ ROMX_FILL(0, 1, 3, ROM_BIOS(0) )
+ ROMX_FILL(0, 1, 2, ROM_BIOS(1) )
+ ROMX_FILL(0, 1, 1, ROM_BIOS(2) )
+ ROMX_FILL(0, 1, 0, ROM_BIOS(3) )
+
+ ROM_REGION( 0x2000, "speech", 0 )
+ ROMX_LOAD("101-32107", 0x0000, 0x1000, CRC(f35784f9) SHA1(348e54a7fa1e8091f89ac656b4da22f28ca2e44d), ROM_BIOS(0) ) // NEC D2332C
+ ROM_RELOAD( 0x1000, 0x1000)
+ ROMX_LOAD("101-64101", 0x0000, 0x2000, CRC(6c85e310) SHA1(20d1d6543c1e6a1f04184a2df2a468f33faec3ff), ROM_BIOS(1) )
+ ROMX_LOAD("101-64105", 0x0000, 0x2000, CRC(fe8c5c18) SHA1(2b64279ab3747ee81c86963c13e78321c6cfa3a3), ROM_BIOS(2) )
+ ROMX_LOAD("101-64106", 0x0000, 0x2000, CRC(8766e128) SHA1(78c7413bf240159720b131ab70bfbdf4e86eb1e9), ROM_BIOS(3) )
+ROM_END
+
+ROM_START( fepriv )
+ ROM_REGION( 0x10000, "mainmap", 0 )
+ ROM_LOAD("4,0_8.6", 0x8000, 0x0800, CRC(32784e2d) SHA1(dae060a5c49cc1993a78db293cd80464adfd892d) )
+ ROM_CONTINUE( 0x9000, 0x0800 )
+ ROM_CONTINUE( 0x8800, 0x0800 )
+ ROM_CONTINUE( 0x9800, 0x0800 )
+ ROM_LOAD("c.5", 0xc000, 0x0800, CRC(ddb80412) SHA1(b1d9435d9a71b8eb241a2169bfbaa0499f510769) )
+ ROM_CONTINUE( 0xd000, 0x0800 )
+ ROM_CONTINUE( 0xc800, 0x0800 )
+ ROM_CONTINUE( 0xd800, 0x0800 )
+ ROM_LOAD("4,0_e.4", 0xe000, 0x0800, CRC(62a5305a) SHA1(a361bd9a54b903d7b0fbacabe55ea5ccbbc1dc51) )
+ ROM_CONTINUE( 0xf000, 0x0800 )
+ ROM_CONTINUE( 0xe800, 0x0800 )
+ ROM_CONTINUE( 0xf800, 0x0800 )
+
+ // speech ROM
+ ROM_DEFAULT_BIOS("en")
+ ROM_SYSTEM_BIOS(0, "en", "English")
+ ROM_SYSTEM_BIOS(1, "de", "German")
+ ROM_SYSTEM_BIOS(2, "fr", "French")
+ ROM_SYSTEM_BIOS(3, "sp", "Spanish")
+
+ ROM_REGION( 1, "language", 0 )
+ ROMX_FILL(0, 1, 3, ROM_BIOS(0) )
+ ROMX_FILL(0, 1, 2, ROM_BIOS(1) )
+ ROMX_FILL(0, 1, 1, ROM_BIOS(2) )
+ ROMX_FILL(0, 1, 0, ROM_BIOS(3) )
+
+ ROM_REGION( 0x2000, "speech", 0 )
+ ROMX_LOAD("101-32107", 0x0000, 0x1000, CRC(f35784f9) SHA1(348e54a7fa1e8091f89ac656b4da22f28ca2e44d), ROM_BIOS(0) )
+ ROM_RELOAD( 0x1000, 0x1000)
+ ROMX_LOAD("101-64101", 0x0000, 0x2000, CRC(6c85e310) SHA1(20d1d6543c1e6a1f04184a2df2a468f33faec3ff), ROM_BIOS(1) )
+ ROMX_LOAD("101-64105", 0x0000, 0x2000, CRC(fe8c5c18) SHA1(2b64279ab3747ee81c86963c13e78321c6cfa3a3), ROM_BIOS(2) )
+ ROMX_LOAD("101-64106", 0x0000, 0x2000, CRC(8766e128) SHA1(78c7413bf240159720b131ab70bfbdf4e86eb1e9), ROM_BIOS(3) )
+ROM_END
+
+
+ROM_START( fpres )
+ ROM_REGION( 0x10000, "mainmap", 0 )
+ ROM_LOAD("u09_yellow", 0xb000, 0x1000, CRC(03fac294) SHA1(5a9d72978318c61185efd4bc9e4a868c226465b8) )
+ ROM_LOAD("u10_green", 0xc000, 0x1000, CRC(5d049d5e) SHA1(c7359bead92729e8a92d6cf1789d87ae43d23cbf) )
+ ROM_LOAD("u11_black", 0xd000, 0x1000, CRC(98bd01b7) SHA1(48cc560c4ca736f54e30d757990ff403c05c39ae) )
+ ROM_LOAD("u12_blue", 0xe000, 0x1000, CRC(6f18115f) SHA1(a08b3a66bfdc23f3400e03fe253a8b9a4967d14f) )
+ ROM_LOAD("u13_red", 0xf000, 0x1000, CRC(dea8091d) SHA1(1d94a90ae076215c2c009e78ec4919dbd8467ef8) )
+
+ // speech ROM
+ ROM_DEFAULT_BIOS("en")
+ ROM_SYSTEM_BIOS(0, "en", "English")
+ ROM_SYSTEM_BIOS(1, "de", "German")
+ ROM_SYSTEM_BIOS(2, "fr", "French")
+ ROM_SYSTEM_BIOS(3, "sp", "Spanish")
+
+ ROM_REGION( 1, "language", 0 )
+ ROMX_FILL(0, 1, 3, ROM_BIOS(0) )
+ ROMX_FILL(0, 1, 2, ROM_BIOS(1) )
+ ROMX_FILL(0, 1, 1, ROM_BIOS(2) )
+ ROMX_FILL(0, 1, 0, ROM_BIOS(3) )
+
+ ROM_REGION( 0x2000, "speech", 0 )
+ ROMX_LOAD("101-32107", 0x0000, 0x1000, CRC(f35784f9) SHA1(348e54a7fa1e8091f89ac656b4da22f28ca2e44d), ROM_BIOS(0) )
+ ROM_RELOAD( 0x1000, 0x1000)
+ ROMX_LOAD("101-64101", 0x0000, 0x2000, CRC(6c85e310) SHA1(20d1d6543c1e6a1f04184a2df2a468f33faec3ff), ROM_BIOS(1) )
+ ROMX_LOAD("101-64105", 0x0000, 0x2000, CRC(fe8c5c18) SHA1(2b64279ab3747ee81c86963c13e78321c6cfa3a3), ROM_BIOS(2) )
+ ROMX_LOAD("101-64106", 0x0000, 0x2000, CRC(8766e128) SHA1(78c7413bf240159720b131ab70bfbdf4e86eb1e9), ROM_BIOS(3) )
+ROM_END
+
+ROM_START( fpresbu )
+ ROM_REGION( 0x10000, "mainmap", 0 )
+ ROM_LOAD("u09_yellow", 0xb000, 0x1000, CRC(bb1cb486) SHA1(b83f50a3ef361d254b88eefaa5aac657aaa72375) )
+ ROM_LOAD("u10_green", 0xc000, 0x1000, CRC(af0aec0e) SHA1(8293d00a12efa1c142b9e37bc7786012250536d9) )
+ ROM_LOAD("u11_black", 0xd000, 0x1000, CRC(214a91cc) SHA1(aab07ecdd66ac208874f4053fc4b0b0659b017aa) )
+ ROM_LOAD("u12_blue", 0xe000, 0x1000, CRC(dae4d8e4) SHA1(f06dbb643f0324c0bddaaae9537d5829768bda22) )
+ ROM_LOAD("u13_red", 0xf000, 0x1000, CRC(5fb67708) SHA1(1e9ee724c2be38daf39d5cf37b0ae587e408777c) )
+
+ // speech ROM
+ ROM_DEFAULT_BIOS("en")
+ ROM_SYSTEM_BIOS(0, "en", "English")
+ ROM_SYSTEM_BIOS(1, "de", "German")
+ ROM_SYSTEM_BIOS(2, "fr", "French")
+ ROM_SYSTEM_BIOS(3, "sp", "Spanish")
+
+ ROM_REGION( 1, "language", 0 )
+ ROMX_FILL(0, 1, 3, ROM_BIOS(0) )
+ ROMX_FILL(0, 1, 2, ROM_BIOS(1) )
+ ROMX_FILL(0, 1, 1, ROM_BIOS(2) )
+ ROMX_FILL(0, 1, 0, ROM_BIOS(3) )
+
+ ROM_REGION( 0x2000, "speech", 0 )
+ ROMX_LOAD("101-32107", 0x0000, 0x1000, CRC(f35784f9) SHA1(348e54a7fa1e8091f89ac656b4da22f28ca2e44d), ROM_BIOS(0) )
+ ROM_RELOAD( 0x1000, 0x1000)
+ ROMX_LOAD("101-64101", 0x0000, 0x2000, CRC(6c85e310) SHA1(20d1d6543c1e6a1f04184a2df2a468f33faec3ff), ROM_BIOS(1) )
+ ROMX_LOAD("101-64105", 0x0000, 0x2000, CRC(fe8c5c18) SHA1(2b64279ab3747ee81c86963c13e78321c6cfa3a3), ROM_BIOS(2) )
+ ROMX_LOAD("101-64106", 0x0000, 0x2000, CRC(8766e128) SHA1(78c7413bf240159720b131ab70bfbdf4e86eb1e9), ROM_BIOS(3) )
+ROM_END
+
+
+ROM_START( feag ) // model 6081, aka "Mobile Master"
+ ROM_REGION( 0x10000, "mainmap", 0 )
+ ROM_LOAD("eg_orange.ic9", 0xa000, 0x2000, CRC(df9e7e74) SHA1(db76750eba5515213ecce07402c4d974c14e1a23) ) // M5L2764K, orange sticker
+ ROM_LOAD("eg_black.ic5", 0xc000, 0x2000, CRC(a5f6f295) SHA1(319f00d4b7a1704a3ca722c40f4096004b4b89d2) ) // M5L2764K, black sticker
+ ROM_LOAD("eg_green.ic4", 0xe000, 0x2000, CRC(1dc6508a) SHA1(6f2e730b216bfb900074d1d786124fc3cb038a8d) ) // M5L2764K, green sticker
+
+ // speech ROM
+ ROM_DEFAULT_BIOS("en")
+ ROM_SYSTEM_BIOS(0, "en", "English")
+ ROM_SYSTEM_BIOS(1, "de", "German")
+ ROM_SYSTEM_BIOS(2, "fr", "French")
+ ROM_SYSTEM_BIOS(3, "sp", "Spanish")
+
+ ROM_REGION( 1, "language", 0 )
+ ROMX_FILL(0, 1, 3, ROM_BIOS(0) )
+ ROMX_FILL(0, 1, 2, ROM_BIOS(1) )
+ ROMX_FILL(0, 1, 1, ROM_BIOS(2) )
+ ROMX_FILL(0, 1, 0, ROM_BIOS(3) )
+
+ ROM_REGION( 0x2000, "speech", 0 )
+ ROMX_LOAD("101-32107.ic16", 0x0000, 0x1000, CRC(f35784f9) SHA1(348e54a7fa1e8091f89ac656b4da22f28ca2e44d), ROM_BIOS(0) )
+ ROM_RELOAD( 0x1000, 0x1000)
+ ROMX_LOAD("101-64101.ic16", 0x0000, 0x2000, CRC(6c85e310) SHA1(20d1d6543c1e6a1f04184a2df2a468f33faec3ff), ROM_BIOS(1) )
+ ROMX_LOAD("101-64105.ic16", 0x0000, 0x2000, CRC(fe8c5c18) SHA1(2b64279ab3747ee81c86963c13e78321c6cfa3a3), ROM_BIOS(2) )
+ ROMX_LOAD("101-64106.ic16", 0x0000, 0x2000, CRC(8766e128) SHA1(78c7413bf240159720b131ab70bfbdf4e86eb1e9), ROM_BIOS(3) )
+ROM_END
+
+ROM_START( feag2100 )
+ ROM_REGION( 0x10000, "mainmap", 0 )
+ ROM_LOAD("el2100.2", 0xc000, 0x2000, CRC(76fec42f) SHA1(34660edb8458919fd179e93fdab3fe428a6625d0) )
+ ROM_LOAD("el2100.3", 0xe000, 0x2000, CRC(2079a506) SHA1(a7bb83138c7b6eff6ea96702d453a214697f4890) )
+
+ ROM_REGION( 0x8000, "rombank", 0 )
+ ROM_LOAD("el2100.1", 0x0000, 0x8000, CRC(9b62b7d5) SHA1(cfcaea2e36c2d52fe4a85c77dbc7fa135893860c) )
+
+ // speech ROM
+ ROM_DEFAULT_BIOS("en")
+ ROM_SYSTEM_BIOS(0, "en", "English")
+ ROM_SYSTEM_BIOS(1, "de", "German")
+ ROM_SYSTEM_BIOS(2, "fr", "French")
+ ROM_SYSTEM_BIOS(3, "sp", "Spanish")
+
+ ROM_REGION( 1, "language", 0 )
+ ROMX_FILL(0, 1, 3, ROM_BIOS(0) )
+ ROMX_FILL(0, 1, 2, ROM_BIOS(1) )
+ ROMX_FILL(0, 1, 1, ROM_BIOS(2) )
+ ROMX_FILL(0, 1, 0, ROM_BIOS(3) )
+
+ ROM_REGION( 0x2000, "speech", 0 )
+ ROMX_LOAD("101-32107.ic16", 0x0000, 0x1000, CRC(f35784f9) SHA1(348e54a7fa1e8091f89ac656b4da22f28ca2e44d), ROM_BIOS(0) )
+ ROM_RELOAD( 0x1000, 0x1000)
+ ROMX_LOAD("101-64101.ic16", 0x0000, 0x2000, CRC(6c85e310) SHA1(20d1d6543c1e6a1f04184a2df2a468f33faec3ff), ROM_BIOS(1) )
+ ROMX_LOAD("101-64105.ic16", 0x0000, 0x2000, CRC(fe8c5c18) SHA1(2b64279ab3747ee81c86963c13e78321c6cfa3a3), ROM_BIOS(2) )
+ ROMX_LOAD("101-64106.ic16", 0x0000, 0x2000, CRC(8766e128) SHA1(78c7413bf240159720b131ab70bfbdf4e86eb1e9), ROM_BIOS(3) )
+ROM_END
+
+} // anonymous namespace
+
+
+
+/******************************************************************************
+ Drivers
+******************************************************************************/
+
+// YEAR NAME PARENT CMP MACHINE INPUT STATE INIT COMPANY, FULLNAME, FLAGS
+CONS( 1983, feasbu, 0, 0, eas, eas, elite_state, empty_init, "Fidelity Electronics", "Elite A/S Challenger (Budapest program)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS | MACHINE_IMPERFECT_TIMING )
+CONS( 1984, feasgla, feasbu, 0, eas, eas, elite_state, empty_init, "Fidelity Electronics", "Elite A/S Challenger (Glasgow program)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS | MACHINE_IMPERFECT_TIMING )
+CONS( 1984, fepriv, feasbu, 0, eas_priv, eas, elite_state, empty_init, "Fidelity Deutschland", "Elite Private Line (red version)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS | MACHINE_IMPERFECT_TIMING )
+
+CONS( 1982, fpres, 0, 0, pc, eas, elite_state, empty_init, "Fidelity Electronics", "Prestige Challenger (original program)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS | MACHINE_IMPERFECT_TIMING )
+CONS( 1983, fpresbu, fpres, 0, pc, eas, elite_state, empty_init, "Fidelity Electronics", "Prestige Challenger (Budapest program)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS | MACHINE_IMPERFECT_TIMING )
+
+CONS( 1986, feag, 0, 0, eag, eag, elite_state, empty_init, "Fidelity Electronics", "Elite Avant Garde (model 6081)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS | MACHINE_IMPERFECT_TIMING )
+CONS( 1986, feag2100, feag, 0, eag2100, eag, elite_state, init_eag2100, "Fidelity Electronics", "Elite Avant Garde 2100", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS | MACHINE_IMPERFECT_TIMING )
diff --git a/src/mame/drivers/fidel_excel.cpp b/src/mame/drivers/fidel_excel.cpp
new file mode 100644
index 00000000000..11fc4f12107
--- /dev/null
+++ b/src/mame/drivers/fidel_excel.cpp
@@ -0,0 +1,523 @@
+// license:BSD-3-Clause
+// copyright-holders:hap
+// thanks-to:Berger, yoyo_chessboard
+/******************************************************************************
+*
+* fidel_vsc.cpp, subdriver of machine/fidelbase.cpp, machine/chessbase.cpp
+
+Fidelity Excellence series hardware
+(for Excel 68000, see fidel_eag68k.cpp)
+
+TODO:
+- granits gives error beeps at start, need to press clear to play
+- granits chessboard buttons seem too sensitive (detects input on falling edge if held too long)
+
+*******************************************************************************
+
+Voice Excellence (model 6092)
+----------------
+PCB 1: 510.1117A02, appears to be identical to other "Excellence" boards
+CPU: GTE G65SC102P-3, 32 KB PRG ROM: AMI 101-1080A01(IC5), 8192x8 SRAM SRM2264C10(IC6)
+2 rows of LEDs on the side: 1*8 green, 1*8 red
+
+PCB 2: 510.1117A01
+Speech: TSI S14001A, 32 KB ROM: AMI 101-1081A01(IC2)
+Dip Switches set ROM A13 and ROM A14, on the side of the board
+
+ROM A12 is tied to S14001A's A11 (yuck)
+ROM A11 is however tied to the CPU's XYZ
+
+0000_07FF - Spanish 1/4
+0800_0FFF - Spanish 3/4
+1000_17FF - Spanish 2/4
+1800_1FFF - Spanish 4/4
+
+2000_27FF - French 1/4
+2800_2FFF - French 3/4
+3000_3FFF - French 2/4
+3800_3FFF - French 4/4
+
+4000_47FF - German 1/4
+4800_4FFF - German 3/4
+5000_57FF - German 2/4
+5800_5FFF - German 4/4
+
+6000_67FF - English 1/2
+6800_6FFF - Bridge Challenger 1/2
+7000_77FF - English 2/2
+7800_7FFF - Bridge Challenger 2/2
+
+------------------
+RE info by hap, based on PCB photos
+
+Memory map:
+-----------
+0000-3FFF: 8K RAM (SRM2264)
+4000-7FFF: control (R/W)
+8000-FFFF: 32K ROM (M27256 compatible)
+
+control (W):
+------------
+CPU A0-A2 to 3*74259, CPU Dx to D (_C unused)
+
+CPU D0:
+- Q4,Q5: led commons
+- Q6,Q7,Q2,Q1: 7seg panel digit select
+- Q0-Q3: 7442 A0-A3
+ + 0-7: led data
+ + 0-8: keypad mux
+ + 9: buzzer out
+
+CPU D1: (model 6093)
+- Q0-Q7: 7seg data
+
+CPU D2: (model 6092)
+- Q0-Q5: TSI C0-C5
+- Q6: TSI START pin
+- Q7: TSI ROM A11
+
+A11 from TSI is tied to TSI ROM A12(!)
+TSI ROM A13,A14 are hardwired to the 2 language switches.
+Sound comes from the Audio out pin, digital out pins are N/C.
+
+control (R):
+------------
+CPU A0-A2 to 2*74251, CPU Dx to output
+
+CPU D7 to Y:
+- D0-D7: keypad row data
+
+CPU D6 to W: (model 6092, tied to VCC otherwise)
+- D0,D1: language switches
+- D2-D6: VCC
+- D7: TSI BUSY
+
+------------------
+One interesting clone of The Excellence is the Computerchess Playmate-2. It was
+produced in 1989 by SPS(Bulgaria) and RRR(Riga Radio Factory). The chess program
+ROM is identical to Excellence EP12. All internal circuitry is the same, the only
+difference is the capacitor driving the 555 for IRQ is 10nf instead of 22nf.
+
+What makes it unique is the addition of a chess clock.
+
+connector pinout from main pcb:
+1) 5V
+2) GND
+3) 74HC259.pin9 (Q4) = Row LED driving
+4) 74HC259.pin10 (Q5) = Column LED driving
+5) 74HC259.pin12 (Q7) = Bat. Low signal
+6) 74HC42.pin4 (Q3) = Col-D/Row-4 -> 'White Move' if D-LED blinks
+
+The extra board has a 7474, a К1016ХЛ1 (RTC, or MCU clock driver), a 4-digit
+VFD display, and some buttons for controlling the clock. IRQ frequency is doubled
+presumedly for using the blinking led as seconds counter. It only tracks player time,
+not of the opponent. And it obviously doesn't show chessmove coordinates either.
+
+*******************************************************************************
+
+Designer 2000 (model 6102)
+----------------
+8KB RAM(KM6264AL-10), 32KB ROM(AMI 101.1077A01)
+Ricoh RP65C02G CPU, 3MHz XTAL
+PCB label 510.1129A01
+basically same as (Par) Excellence hardware, reskinned board
+
+Designer 2100 (model 6103): exactly same, but running at 5MHz
+
+(Designer 1500 is on 80C50 hardware)
+
+******************************************************************************/
+
+#include "emu.h"
+#include "includes/fidelbase.h"
+
+#include "cpu/m6502/r65c02.h"
+#include "cpu/m6502/m65sc02.h"
+#include "sound/volt_reg.h"
+#include "speaker.h"
+
+// internal artwork
+#include "fidel_des.lh" // clickable
+#include "fidel_ex.lh" // clickable
+#include "fidel_exd.lh" // clickable
+
+
+namespace {
+
+class excel_state : public fidelbase_state
+{
+public:
+ excel_state(const machine_config &mconfig, device_type type, const char *tag) :
+ fidelbase_state(mconfig, type, tag)
+ { }
+
+ // machine drivers
+ void fexcel(machine_config &config);
+ void fexcelb(machine_config &config);
+ void fexcel4(machine_config &config);
+ void fexceld(machine_config &config);
+ void fexcelv(machine_config &config);
+ void fexcelp(machine_config &config);
+ void granits(machine_config &config);
+ void fdes2100(machine_config &config);
+ void fdes2000(machine_config &config);
+
+ DECLARE_INPUT_CHANGED_MEMBER(speech_bankswitch);
+
+private:
+ // address maps
+ void fexcel_map(address_map &map);
+ void fexcelb_map(address_map &map);
+
+ // I/O handlers
+ DECLARE_READ8_MEMBER(speech_r);
+ DECLARE_WRITE8_MEMBER(ttl_w);
+ DECLARE_READ8_MEMBER(ttl_r);
+};
+
+
+/******************************************************************************
+ Devices, I/O
+******************************************************************************/
+
+// misc handlers
+
+INPUT_CHANGED_MEMBER(excel_state::speech_bankswitch)
+{
+ // tied to speech ROM highest bits
+ m_speech->force_update();
+ m_speech_bank = (m_speech_bank & 1) | newval << 1;
+}
+
+READ8_MEMBER(excel_state::speech_r)
+{
+ // TSI A11 is A12, program controls A11, user controls A13,A14(language switches)
+ offset = (offset & 0x7ff) | (offset << 1 & 0x1000);
+ return m_speech_rom[offset | (m_speech_bank << 11 & 0x800) | (~m_speech_bank << 12 & 0x6000)];
+}
+
+
+// TTL
+
+WRITE8_MEMBER(excel_state::ttl_w)
+{
+ // a0-a2,d0: 74259(1)
+ u8 mask = 1 << offset;
+ m_led_select = (m_led_select & ~mask) | ((data & 1) ? mask : 0);
+
+ // 74259 Q0-Q3: 7442 a0-a3
+ // 7442 0-8: led data, input mux
+ u16 sel = 1 << (m_led_select & 0xf) & 0x3ff;
+ u8 led_data = sel & 0xff;
+ m_inp_mux = sel & 0x1ff;
+
+ // 7442 9: speaker out
+ m_dac->write(BIT(sel, 9));
+
+ // 74259 Q4-Q7,Q2,Q1: digit/led select (active low)
+ u8 led_sel = ~bitswap<8>(m_led_select,0,3,1,2,7,6,5,4) & 0x3f;
+
+ // a0-a2,d1: digit segment data (model 6093)
+ m_7seg_data = (m_7seg_data & ~mask) | ((data & 2) ? mask : 0);
+ u8 seg_data = bitswap<8>(m_7seg_data,0,1,3,2,7,5,6,4);
+
+ // update display: 4 7seg leds, 2*8 chessboard leds
+ for (int i = 0; i < 6; i++)
+ m_display_state[i] = (led_sel >> i & 1) ? ((i < 2) ? led_data : seg_data) : 0;
+
+ set_display_size(8, 2+4);
+ set_display_segmask(0x3c, 0x7f);
+ display_update();
+
+ // speech (model 6092)
+ if (m_speech != nullptr)
+ {
+ // a0-a2,d2: 74259(2) to speech board
+ m_speech_data = (m_speech_data & ~mask) | ((data & 4) ? mask : 0);
+
+ // 74259 Q6: TSI ROM A11
+ m_speech->force_update(); // update stream to now
+ m_speech_bank = (m_speech_bank & ~1) | (m_speech_data >> 6 & 1);
+
+ // Q0-Q5: TSI C0-C5
+ // Q7: TSI START line
+ m_speech->data_w(space, 0, m_speech_data & 0x3f);
+ m_speech->start_w(m_speech_data >> 7 & 1);
+ }
+}
+
+READ8_MEMBER(excel_state::ttl_r)
+{
+ u8 d7 = 0x80;
+
+ // 74259(1) Q7 + 74251 I0: battery status
+ if (m_inp_matrix[10] != nullptr && m_inp_mux == 1 && ~m_led_select & 0x80)
+ d7 = m_inp_matrix[10]->read() & 0x80;
+
+ // a0-a2,d6: from speech board: language switches and TSI BUSY line, otherwise tied to VCC
+ u8 d6 = (m_inp_matrix[9].read_safe(0xff) >> offset & 1) ? 0x40 : 0;
+
+ // a0-a2,d7: multiplexed inputs (active low)
+ return ((read_inputs(9) >> offset & 1) ? 0 : d7) | d6 | 0x3f;
+}
+
+
+
+/******************************************************************************
+ Address Maps
+******************************************************************************/
+
+void excel_state::fexcel_map(address_map &map)
+{
+ map(0x0000, 0x07ff).mirror(0x3800).ram();
+ map(0x4000, 0x4007).mirror(0x3ff8).rw(FUNC(excel_state::ttl_r), FUNC(excel_state::ttl_w));
+ //map(0x8000, 0x8000).nopr(); // checks for opening book module, but hw doesn't have a module slot
+ map(0xc000, 0xffff).rom();
+}
+
+void excel_state::fexcelb_map(address_map &map)
+{
+ map(0x0000, 0x1fff).mirror(0x2000).ram();
+ map(0x4000, 0x4007).mirror(0x3ff8).rw(FUNC(excel_state::ttl_r), FUNC(excel_state::ttl_w));
+ map(0x8000, 0xffff).rom();
+}
+
+
+
+/******************************************************************************
+ Input Ports
+******************************************************************************/
+
+static INPUT_PORTS_START( fexcelb )
+ PORT_INCLUDE( generic_cb_buttons )
+
+ PORT_START("IN.8")
+ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_DEL) PORT_NAME("Clear")
+ PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("Move / Pawn")
+ PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("Hint / Knight")
+ PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("Take Back / Bishop")
+ PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("Level / Rook")
+ PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("Options / Queen")
+ PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("Verify / King")
+ PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_R) PORT_CODE(KEYCODE_N) PORT_NAME("New Game")
+INPUT_PORTS_END
+
+static INPUT_PORTS_START( fexcelv )
+ PORT_INCLUDE( fexcelb )
+
+ PORT_START("IN.9")
+ PORT_CONFNAME( 0x03, 0x00, DEF_STR( Language ) ) PORT_CHANGED_MEMBER(DEVICE_SELF, excel_state, speech_bankswitch, 0)
+ PORT_CONFSETTING( 0x00, DEF_STR( English ) )
+ PORT_CONFSETTING( 0x01, DEF_STR( German ) )
+ PORT_CONFSETTING( 0x02, DEF_STR( French ) )
+ PORT_CONFSETTING( 0x03, DEF_STR( Spanish ) )
+ PORT_BIT(0x7c, IP_ACTIVE_HIGH, IPT_UNUSED)
+ PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_CUSTOM) PORT_READ_LINE_DEVICE_MEMBER("speech", s14001a_device, busy_r)
+INPUT_PORTS_END
+
+static INPUT_PORTS_START( fexcel )
+ PORT_INCLUDE( fexcelb )
+
+ PORT_START("IN.10")
+ PORT_CONFNAME( 0x80, 0x00, "Battery Status" )
+ PORT_CONFSETTING( 0x80, "Low" )
+ PORT_CONFSETTING( 0x00, DEF_STR( Normal ) )
+INPUT_PORTS_END
+
+static INPUT_PORTS_START( fdes )
+ PORT_INCLUDE( fexcel )
+
+ PORT_MODIFY("IN.10")
+ PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_UNUSED) // no low-voltage detection circuit (still works in software though)
+INPUT_PORTS_END
+
+
+
+/******************************************************************************
+ Machine Drivers
+******************************************************************************/
+
+void excel_state::fexcel(machine_config &config)
+{
+ /* basic machine hardware */
+ M65SC02(config, m_maincpu, 12_MHz_XTAL/4); // G65SC102P-3, 12.0M ceramic resonator
+ m_maincpu->set_addrmap(AS_PROGRAM, &excel_state::fexcel_map);
+
+ const attotime irq_period = attotime::from_hz(630); // from 556 timer (22nF, 102K, 1K)
+ TIMER(config, m_irq_on).configure_periodic(FUNC(excel_state::irq_on<M6502_IRQ_LINE>), irq_period);
+ m_irq_on->set_start_delay(irq_period - attotime::from_nsec(15250)); // active for 15.25us
+ TIMER(config, "irq_off").configure_periodic(FUNC(excel_state::irq_off<M6502_IRQ_LINE>), irq_period);
+
+ TIMER(config, "display_decay").configure_periodic(FUNC(excel_state::display_decay_tick), attotime::from_msec(1));
+ config.set_default_layout(layout_fidel_ex);
+
+ /* sound hardware */
+ SPEAKER(config, "speaker").front_center();
+ DAC_1BIT(config, m_dac).add_route(ALL_OUTPUTS, "speaker", 0.25);
+ VOLTAGE_REGULATOR(config, "vref").add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT);
+}
+
+void excel_state::fexcel4(machine_config &config)
+{
+ fexcel(config);
+
+ /* basic machine hardware */
+ R65C02(config.replace(), m_maincpu, 4_MHz_XTAL); // R65C02P4
+ m_maincpu->set_addrmap(AS_PROGRAM, &excel_state::fexcel_map);
+}
+
+void excel_state::fexcelb(machine_config &config)
+{
+ fexcel(config);
+
+ /* basic machine hardware */
+ m_maincpu->set_addrmap(AS_PROGRAM, &excel_state::fexcelb_map);
+}
+
+void excel_state::fexcelp(machine_config &config)
+{
+ fexcel(config);
+
+ /* basic machine hardware */
+ R65C02(config.replace(), m_maincpu, 5_MHz_XTAL); // R65C02P4
+ m_maincpu->set_addrmap(AS_PROGRAM, &excel_state::fexcelb_map);
+}
+
+void excel_state::granits(machine_config &config)
+{
+ fexcelp(config);
+
+ /* basic machine hardware */
+ m_maincpu->set_clock(8_MHz_XTAL/2);
+}
+
+void excel_state::fdes2100(machine_config &config)
+{
+ fexcel(config);
+
+ /* basic machine hardware */
+ M65C02(config.replace(), m_maincpu, 5_MHz_XTAL); // WDC 65C02
+ m_maincpu->set_addrmap(AS_PROGRAM, &excel_state::fexcelb_map);
+
+ // change irq timer frequency
+ const attotime irq_period = attotime::from_hz(630); // from 556 timer (22nF, 102K, 1K)
+ TIMER(config.replace(), m_irq_on).configure_periodic(FUNC(excel_state::irq_on<M6502_IRQ_LINE>), irq_period);
+ m_irq_on->set_start_delay(irq_period - attotime::from_nsec(15250)); // active for 15.25us
+ TIMER(config.replace(), "irq_off").configure_periodic(FUNC(excel_state::irq_off<M6502_IRQ_LINE>), irq_period);
+
+ config.set_default_layout(layout_fidel_des);
+}
+
+void excel_state::fdes2000(machine_config &config)
+{
+ fdes2100(config);
+
+ /* basic machine hardware */
+ R65C02(config.replace(), m_maincpu, 3_MHz_XTAL); // RP65C02G
+ m_maincpu->set_addrmap(AS_PROGRAM, &excel_state::fexcelb_map);
+}
+
+void excel_state::fexcelv(machine_config &config)
+{
+ fexcelb(config);
+
+ /* sound hardware */
+ S14001A(config, m_speech, 25000); // R/C circuit, around 25khz
+ m_speech->ext_read().set(FUNC(excel_state::speech_r));
+ m_speech->add_route(ALL_OUTPUTS, "speaker", 0.75);
+}
+
+void excel_state::fexceld(machine_config &config)
+{
+ fexcelb(config);
+
+ /* basic machine hardware */
+ config.set_default_layout(layout_fidel_exd);
+}
+
+
+
+/******************************************************************************
+ ROM Definitions
+******************************************************************************/
+
+ROM_START( fexcel ) // model 6080(B), PCB label 510.1117A02
+ ROM_REGION( 0x10000, "maincpu", 0 )
+ ROM_LOAD("101-1080a01.ic5", 0x8000, 0x8000, CRC(846f8e40) SHA1(4e1d5b08d5ff3422192b54fa82cb3f505a69a971) )
+ROM_END
+
+ROM_START( fexceld ) // model 6093, PCB label 510.1117A02
+ ROM_REGION( 0x10000, "maincpu", 0 )
+ ROM_LOAD("101-1080a01.ic5", 0x8000, 0x8000, CRC(846f8e40) SHA1(4e1d5b08d5ff3422192b54fa82cb3f505a69a971) ) // same rom as fexcel
+ROM_END
+
+ROM_START( fexcelv ) // model 6092, PCB label 510.1117A02, sound PCB 510.1117A01
+ ROM_REGION( 0x10000, "maincpu", 0 )
+ ROM_LOAD("101-1080a01.ic5", 0x8000, 0x8000, CRC(846f8e40) SHA1(4e1d5b08d5ff3422192b54fa82cb3f505a69a971) ) // PCB1, M27256, same rom as fexcel
+
+ ROM_REGION( 0x8000, "speech", 0 )
+ ROM_LOAD("101-1081a01.ic2", 0x0000, 0x8000, CRC(c8ae1607) SHA1(6491ce6be60ed77f3dd931c0ca17616f13af943e) ) // PCB2, M27256
+ROM_END
+
+ROM_START( fexcel12 ) // model EP12, PCB label 510-1099A01
+ ROM_REGION( 0x10000, "maincpu", 0 )
+ ROM_LOAD("101-1072a01.ic5", 0xc000, 0x4000, CRC(212b006d) SHA1(242ff851b0841cbec66bbada6a730da021010e2c) )
+ROM_END
+
+ROM_START( fexcel124 ) // model EP12, PCB label 510-1099A01
+ ROM_REGION( 0x10000, "maincpu", 0 )
+ ROM_LOAD("101-1073a01.ic5", 0xc000, 0x4000, CRC(3e221534) SHA1(7516bc6a8aab9d8ac30ac1a9317630a6aa9ac1a0) )
+ROM_END
+
+ROM_START( fexcela ) // model 6080, PCB label 510-1099A01(manuf.1985) or 510-1099B01(manuf.1986)
+ ROM_REGION( 0x10000, "maincpu", 0 )
+ ROM_LOAD("101-1072b01.ic5", 0xc000, 0x4000, CRC(fd2f6064) SHA1(f84bb98bdb9565a04891eb6820597d7aecc90c21) ) // RCA
+ROM_END
+
+
+ROM_START( fexcelp ) // model 6083, PCB label 510-1099A01
+ ROM_REGION( 0x10000, "maincpu", 0 )
+ ROM_LOAD("101-1077a01.ic5", 0x8000, 0x8000, CRC(62006320) SHA1(1d6370973dbae42c54639b261cc81e32cdfc1d5d) )
+ROM_END
+
+ROM_START( fexcelpb ) // model 6083, PCB label 510-1099B01
+ ROM_REGION( 0x10000, "maincpu", 0 )
+ ROM_LOAD("par_ex.ic5", 0x8000, 0x8000, CRC(0d17b0f0) SHA1(3a6070fd4718c62b62ff0f08637bb6eb84eb9a1c) ) // GI 27C256, no label, only 1 byte difference, assume bugfix in bookrom
+ROM_END
+
+ROM_START( granits ) // modified SC12 board, overclocked Par Excellence program
+ ROM_REGION( 0x10000, "maincpu", 0 )
+ ROM_LOAD("granit_s-4", 0x8000, 0x8000, CRC(274d6aff) SHA1(c8d943b2f15422ac62f539b568f5509cbce568a3) )
+ROM_END
+
+ROM_START( fdes2000 ) // model 6102, PCB label 510.1129A01
+ ROM_REGION( 0x10000, "maincpu", 0 )
+ ROM_LOAD("101-1077a01.ic5", 0x8000, 0x8000, CRC(62006320) SHA1(1d6370973dbae42c54639b261cc81e32cdfc1d5d) ) // AMI, same label as fexcelp
+ROM_END
+
+ROM_START( fdes2100 ) // model 6103, PCB label 510.1129A01
+ ROM_REGION( 0x10000, "maincpu", 0 )
+ ROM_LOAD("101-1077a01.ic5", 0x8000, 0x8000, CRC(62006320) SHA1(1d6370973dbae42c54639b261cc81e32cdfc1d5d) ) // same as fdes2000
+ROM_END
+
+} // anonymous namespace
+
+
+
+/******************************************************************************
+ Drivers
+******************************************************************************/
+
+// YEAR NAME PARENT CMP MACHINE INPUT STATE INIT COMPANY, FULLNAME, FLAGS
+CONS( 1987, fexcel, 0, 0, fexcelb, fexcelb, excel_state, empty_init, "Fidelity Electronics", "The Excellence (model 6080B)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
+CONS( 1987, fexcelv, fexcel, 0, fexcelv, fexcelv, excel_state, empty_init, "Fidelity Electronics", "Voice Excellence", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
+CONS( 1987, fexceld, fexcel, 0, fexceld, fexcelb, excel_state, empty_init, "Fidelity Electronics", "Excel Display", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
+CONS( 1985, fexcel12, fexcel, 0, fexcel, fexcel, excel_state, empty_init, "Fidelity Electronics", "The Excellence (model EP12, set 1)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS ) // 1st version of The Excellence
+CONS( 1985, fexcel124, fexcel, 0, fexcel4, fexcel, excel_state, empty_init, "Fidelity Electronics", "The Excellence (model EP12, set 2)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
+CONS( 1985, fexcela, fexcel, 0, fexcel, fexcel, excel_state, empty_init, "Fidelity Electronics", "The Excellence (model 6080)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
+
+CONS( 1986, fexcelp, 0, 0, fexcelp, fexcel, excel_state, empty_init, "Fidelity Electronics", "The Par Excellence", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
+CONS( 1986, fexcelpb, fexcelp, 0, fexcelp, fexcel, excel_state, empty_init, "Fidelity Electronics", "The Par Excellence (rev. B)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
+CONS( 1986, granits, fexcelp, 0, granits, fexcel, excel_state, empty_init, "hack (RCS)", "Granit S", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
+CONS( 1988, fdes2000, fexcelp, 0, fdes2000, fdes, excel_state, empty_init, "Fidelity Electronics", "Designer 2000", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
+CONS( 1988, fdes2100, fexcelp, 0, fdes2100, fdes, excel_state, empty_init, "Fidelity Electronics", "Designer 2100", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
diff --git a/src/mame/drivers/fidel_phantom.cpp b/src/mame/drivers/fidel_phantom.cpp
new file mode 100644
index 00000000000..f1862aa5c57
--- /dev/null
+++ b/src/mame/drivers/fidel_phantom.cpp
@@ -0,0 +1,143 @@
+// license:BSD-3-Clause
+// copyright-holders:hap
+/******************************************************************************
+*
+* fidel_phantom.cpp, subdriver of machine/fidelbase.cpp, machine/chessbase.cpp
+
+TODO:
+- everything, this is a skeleton driver
+
+*******************************************************************************
+
+Fidelity licensed the design of the Milton/Phantom motorized chessboard and released
+their own version. It has a small LCD panel added, the rest looks nearly the same from
+the outside. After Fidelity was taken over by H&G, it was rereleased in 1990 as the
+Mephisto Phantom. This is assumed to be identical.
+
+Fidelity Phantom (model 6100) overview:
+- R65C02P4, XTAL marked 4.91?200
+- 2*32KB ROM 27C256-15, 8KB RAM MS6264L-10
+- LCD driver, display panel for digits
+- magnetized x/y motor under chessboard, chesspieces have magnet underneath
+- piezo speaker, LEDs, 8*8 chessboard buttons
+- PCB label 510.1128A01
+
+******************************************************************************/
+
+#include "emu.h"
+#include "includes/fidelbase.h"
+
+#include "cpu/m6502/r65c02.h"
+#include "sound/volt_reg.h"
+#include "speaker.h"
+
+// internal artwork
+//#include "fidel_phantom.lh" // clickable
+
+
+namespace {
+
+class phantom_state : public fidelbase_state
+{
+public:
+ phantom_state(const machine_config &mconfig, device_type type, const char *tag) :
+ fidelbase_state(mconfig, type, tag)
+ { }
+
+ void fphantom(machine_config &config);
+ void init_fphantom();
+
+protected:
+ virtual void machine_reset() override;
+
+private:
+ void main_map(address_map &map);
+};
+
+void phantom_state::machine_reset()
+{
+ fidelbase_state::machine_reset();
+ m_rombank->set_entry(0);
+}
+
+void phantom_state::init_fphantom()
+{
+ m_rombank->configure_entries(0, 2, memregion("rombank")->base(), 0x4000);
+}
+
+
+/******************************************************************************
+ Devices, I/O
+******************************************************************************/
+
+//..
+
+
+
+/******************************************************************************
+ Address Maps
+******************************************************************************/
+
+void phantom_state::main_map(address_map &map)
+{
+ map(0x0000, 0x1fff).ram();
+ map(0x4000, 0x7fff).bankr("rombank");
+ map(0x8000, 0xffff).rom();
+}
+
+
+
+/******************************************************************************
+ Input Ports
+******************************************************************************/
+
+static INPUT_PORTS_START( fphantom )
+ PORT_INCLUDE( generic_cb_buttons )
+INPUT_PORTS_END
+
+
+
+/******************************************************************************
+ Machine Drivers
+******************************************************************************/
+
+void phantom_state::fphantom(machine_config &config)
+{
+ /* basic machine hardware */
+ R65C02(config, m_maincpu, 4.9152_MHz_XTAL); // R65C02P4
+ m_maincpu->set_periodic_int(FUNC(phantom_state::irq0_line_hold), attotime::from_hz(600)); // guessed
+ m_maincpu->set_addrmap(AS_PROGRAM, &phantom_state::main_map);
+
+ TIMER(config, "display_decay").configure_periodic(FUNC(phantom_state::display_decay_tick), attotime::from_msec(1));
+ //config.set_default_layout(layout_fidel_phantom);
+
+ /* sound hardware */
+ SPEAKER(config, "speaker").front_center();
+ DAC_1BIT(config, m_dac).add_route(ALL_OUTPUTS, "speaker", 0.25);
+ VOLTAGE_REGULATOR(config, "vref").add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT);
+}
+
+
+
+/******************************************************************************
+ ROM Definitions
+******************************************************************************/
+
+ROM_START( fphantom ) // model 6100, PCB label 510.1128A01
+ ROM_REGION( 0x10000, "maincpu", 0 )
+ ROM_LOAD("u_3c_yellow.u3", 0x8000, 0x8000, CRC(fb7c38ae) SHA1(a1aa7637705052cb4eec92644dc79aee7ba4d77c) ) // 27C256
+
+ ROM_REGION( 0x8000, "rombank", 0 )
+ ROM_LOAD("u_4_white.u4", 0x0000, 0x8000, CRC(e4181ba2) SHA1(1f77d1867c6f566be98645fc252a01108f412c96) ) // 27C256
+ROM_END
+
+} // anonymous namespace
+
+
+
+/******************************************************************************
+ Drivers
+******************************************************************************/
+
+// YEAR NAME PARENT CMP MACHINE INPUT STATE INIT COMPANY, FULLNAME, FLAGS
+CONS( 1988, fphantom, 0, 0, fphantom, fphantom, phantom_state, init_fphantom, "Fidelity Electronics", "Phantom Chess Challenger", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS | MACHINE_MECHANICAL | MACHINE_NOT_WORKING )
diff --git a/src/mame/drivers/fidel_sc12.cpp b/src/mame/drivers/fidel_sc12.cpp
new file mode 100644
index 00000000000..49859191df4
--- /dev/null
+++ b/src/mame/drivers/fidel_sc12.cpp
@@ -0,0 +1,244 @@
+// license:BSD-3-Clause
+// copyright-holders:hap
+// thanks-to:Berger, yoyo_chessboard
+/******************************************************************************
+*
+* fidel_sc12.cpp, subdriver of machine/fidelbase.cpp, machine/chessbase.cpp
+
+*******************************************************************************
+
+Fidelity Sensory 12 Chess Challenger (SC12-B, 6086)
+4 versions are known to exist: A,B,C, and X, with increasing CPU speed.
+---------------------------------
+RE information from netlist by Berger
+
+8*(8+1) buttons, 8+8+2 red LEDs
+DIN 41524C printer port
+36-pin edge connector
+CPU is a R65C02P4, running at 4MHz*
+
+*By default, the CPU frequency is lowered on A13/A14 access, with a factory-set jumper:
+/2 on model SC12(1.5MHz), /4 on model 6086(1MHz)
+
+NE556 dual-timer IC:
+- timer#1, one-shot at power-on, to CPU _RESET
+- timer#2: R1=82K+50K pot at 26K, R2=1K, C=22nF, to CPU _IRQ: ~596Hz, active low=15.25us
+
+Memory map:
+-----------
+0000-0FFF: 4K RAM (2016 * 2)
+2000-5FFF: cartridge
+6000-7FFF: control(W)
+8000-9FFF: 8K ROM SSS SCM23C65E4
+A000-BFFF: keypad(R)
+C000-DFFF: 4K ROM TI TMS2732AJL-45
+E000-FFFF: 8K ROM Toshiba TMM2764D-2
+
+control: (74LS377)
+--------
+Q0-Q3: 7442 A0-A3
+Q4: enable printer port pin 1 input
+Q5: printer port pin 5 output
+Q6,Q7: LEDs common anode
+
+7442 0-8: input mux and LEDs cathode
+7442 9: buzzer
+
+The keypad is read through a 74HC251, where S0,1,2 is from CPU A0,1,2, Y is connected to CPU D7.
+If control Q4 is set, printer data can be read from I0.
+
+******************************************************************************/
+
+#include "emu.h"
+#include "includes/fidelbase.h"
+
+#include "cpu/m6502/r65c02.h"
+#include "sound/volt_reg.h"
+#include "speaker.h"
+
+// internal artwork
+#include "fidel_sc12.lh" // clickable
+
+
+namespace {
+
+class sc12_state : public fidelbase_state
+{
+public:
+ sc12_state(const machine_config &mconfig, device_type type, const char *tag) :
+ fidelbase_state(mconfig, type, tag)
+ { }
+
+ // machine drivers
+ void sc12(machine_config &config);
+ void sc12b(machine_config &config);
+
+private:
+ // address maps
+ void main_map(address_map &map);
+
+ // I/O handlers
+ DECLARE_WRITE8_MEMBER(control_w);
+ DECLARE_READ8_MEMBER(input_r);
+};
+
+
+
+/******************************************************************************
+ Devices, I/O
+******************************************************************************/
+
+// TTL/generic
+
+WRITE8_MEMBER(sc12_state::control_w)
+{
+ // d0-d3: 7442 a0-a3
+ // 7442 0-8: led data, input mux
+ u16 sel = 1 << (data & 0xf) & 0x3ff;
+ m_inp_mux = sel & 0x1ff;
+
+ // 7442 9: speaker out
+ m_dac->write(BIT(sel, 9));
+
+ // d6,d7: led select (active low)
+ display_matrix(9, 2, sel & 0x1ff, ~data >> 6 & 3);
+
+ // d4,d5: printer
+ //..
+}
+
+READ8_MEMBER(sc12_state::input_r)
+{
+ // a0-a2,d7: multiplexed inputs (active low)
+ return (read_inputs(9) >> offset & 1) ? 0 : 0x80;
+}
+
+
+
+/******************************************************************************
+ Address Maps
+******************************************************************************/
+
+void sc12_state::main_map(address_map &map)
+{
+ map.unmap_value_high();
+ map(0x0000, 0x0fff).ram();
+ map(0x2000, 0x5fff).r(FUNC(sc12_state::cartridge_r));
+ map(0x6000, 0x6000).mirror(0x1fff).w(FUNC(sc12_state::control_w));
+ map(0x8000, 0x9fff).rom();
+ map(0xa000, 0xa007).mirror(0x1ff8).r(FUNC(sc12_state::input_r));
+ map(0xc000, 0xcfff).mirror(0x1000).rom();
+ map(0xe000, 0xffff).rom();
+}
+
+
+
+/******************************************************************************
+ Input Ports
+******************************************************************************/
+
+static INPUT_PORTS_START( sc12_sidepanel )
+ PORT_START("IN.8")
+ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("RV / Pawn")
+ PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("DM / Knight")
+ PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("TB / Bishop")
+ PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("LV / Rook")
+ PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("PV / Queen")
+ PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("PB / King")
+ PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_DEL) PORT_NAME("CL")
+ PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_R) PORT_NAME("RE")
+INPUT_PORTS_END
+
+static INPUT_PORTS_START( sc12 )
+ PORT_INCLUDE( fidel_cpu_div_2 )
+ PORT_INCLUDE( generic_cb_buttons )
+ PORT_INCLUDE( sc12_sidepanel )
+INPUT_PORTS_END
+
+static INPUT_PORTS_START( sc12b )
+ PORT_INCLUDE( fidel_cpu_div_4 )
+ PORT_INCLUDE( generic_cb_buttons )
+ PORT_INCLUDE( sc12_sidepanel )
+INPUT_PORTS_END
+
+
+
+/******************************************************************************
+ Machine Drivers
+******************************************************************************/
+
+void sc12_state::sc12(machine_config &config)
+{
+ /* basic machine hardware */
+ R65C02(config, m_maincpu, 3_MHz_XTAL); // R65C02P3
+ m_maincpu->set_addrmap(AS_PROGRAM, &sc12_state::div_trampoline);
+ ADDRESS_MAP_BANK(config, m_mainmap).set_map(&sc12_state::main_map).set_options(ENDIANNESS_LITTLE, 8, 16);
+
+ TIMER(config, "dummy_timer").configure_periodic(timer_device::expired_delegate(), attotime::from_hz(3_MHz_XTAL));
+
+ const attotime irq_period = attotime::from_hz(630); // from 556 timer (22nF, 102K, 1K)
+ TIMER(config, m_irq_on).configure_periodic(FUNC(sc12_state::irq_on<M6502_IRQ_LINE>), irq_period);
+ m_irq_on->set_start_delay(irq_period - attotime::from_nsec(15250)); // active for 15.25us
+ TIMER(config, "irq_off").configure_periodic(FUNC(sc12_state::irq_off<M6502_IRQ_LINE>), irq_period);
+
+ TIMER(config, "display_decay").configure_periodic(FUNC(sc12_state::display_decay_tick), attotime::from_msec(1));
+ config.set_default_layout(layout_fidel_sc12);
+
+ /* sound hardware */
+ SPEAKER(config, "speaker").front_center();
+ DAC_1BIT(config, m_dac).add_route(ALL_OUTPUTS, "speaker", 0.25);
+ VOLTAGE_REGULATOR(config, "vref").add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT);
+
+ /* cartridge */
+ GENERIC_CARTSLOT(config, m_cart, generic_plain_slot, "fidel_scc", "bin,dat");
+ m_cart->set_device_load(device_image_load_delegate(&sc12_state::device_image_load_scc_cartridge, this));
+
+ SOFTWARE_LIST(config, "cart_list").set_original("fidel_scc");
+}
+
+void sc12_state::sc12b(machine_config &config)
+{
+ sc12(config);
+
+ /* basic machine hardware */
+ m_maincpu->set_clock(4_MHz_XTAL); // R65C02P4
+ TIMER(config.replace(), "dummy_timer").configure_periodic(timer_device::expired_delegate(), attotime::from_hz(4_MHz_XTAL));
+
+ // change irq timer frequency
+ const attotime irq_period = attotime::from_hz(596); // from 556 timer (22nF, 82K+26K, 1K)
+ TIMER(config.replace(), m_irq_on).configure_periodic(FUNC(sc12_state::irq_on<M6502_IRQ_LINE>), irq_period);
+ m_irq_on->set_start_delay(irq_period - attotime::from_nsec(15250)); // active for 15.25us
+ TIMER(config.replace(), "irq_off").configure_periodic(FUNC(sc12_state::irq_off<M6502_IRQ_LINE>), irq_period);
+}
+
+
+
+/******************************************************************************
+ ROM Definitions
+******************************************************************************/
+
+ROM_START( fscc12 ) // model SC12, PCB label 510-1084B01
+ ROM_REGION( 0x10000, "mainmap", 0 )
+ ROM_LOAD("101-1068a01.ic15", 0x8000, 0x2000, CRC(63c76cdd) SHA1(e0771c98d4483a6b1620791cb99a7e46b0db95c4) ) // SSS SCM23C65E4
+ ROM_LOAD("orange.ic13", 0xc000, 0x1000, CRC(ed5289b2) SHA1(9b0c7f9ae4102d4a66eb8c91d4e84b9eec2ffb3d) ) // TI TMS2732AJL-45, no label, orange sticker
+ ROM_LOAD("red.ic14", 0xe000, 0x2000, CRC(0c4968c4) SHA1(965a66870b0f8ce9549418cbda09d2ff262a1504) ) // TI TMS2764JL-25, no label, red sticker
+ROM_END
+
+ROM_START( fscc12b ) // model 6086, PCB label 510-1084B01
+ ROM_REGION( 0x10000, "mainmap", 0 )
+ ROM_LOAD("101-1068a01.ic15", 0x8000, 0x2000, CRC(63c76cdd) SHA1(e0771c98d4483a6b1620791cb99a7e46b0db95c4) ) // SSS SCM23C65E4
+ ROM_LOAD("orange.ic13", 0xc000, 0x1000, CRC(45070a71) SHA1(8aeecff828f26fb7081902c757559903be272649) ) // TI TMS2732AJL-45, no label, orange sticker
+ ROM_LOAD("red.ic14", 0xe000, 0x2000, CRC(183d3edc) SHA1(3296a4c3bce5209587d4a1694fce153558544e63) ) // Toshiba TMM2764D-2, no label, red sticker
+ROM_END
+
+} // anonymous namespace
+
+
+
+/******************************************************************************
+ Drivers
+******************************************************************************/
+
+// YEAR NAME PARENT CMP MACHINE INPUT STATE INIT COMPANY, FULLNAME, FLAGS
+CONS( 1984, fscc12, 0, 0, sc12, sc12, sc12_state, empty_init, "Fidelity Electronics", "Sensory Chess Challenger 12", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS | MACHINE_IMPERFECT_TIMING )
+CONS( 1984, fscc12b, fscc12, 0, sc12b, sc12b, sc12_state, empty_init, "Fidelity Electronics", "Sensory Chess Challenger 12-B", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS | MACHINE_IMPERFECT_TIMING )
diff --git a/src/mame/drivers/fidelmcs48.cpp b/src/mame/drivers/fidel_sc6.cpp
index 7b49319751a..73096ca136d 100644
--- a/src/mame/drivers/fidelmcs48.cpp
+++ b/src/mame/drivers/fidel_sc6.cpp
@@ -2,25 +2,24 @@
// copyright-holders:hap
// thanks-to:yoyo_chessboard
/******************************************************************************
+*
+* fidel_sc6.cpp, subdriver of machine/fidelbase.cpp, machine/chessbase.cpp
- Fidelity Electronics generic MCS-48 based chess computer driver
+*******************************************************************************
- NOTE: MAME doesn't include a generalized implementation for boardpieces yet,
- greatly affecting user playability of emulated electronic board games.
- As workaround for the chess games, use an external chess GUI on the side,
- such as Arena(in editmode).
-
- TODO:
- - nothing
-
-******************************************************************************
-
-Sensory Chess Challenger 6 (model SC6):
+Fidelity Sensory Chess Challenger 6 (model SC6) overview:
- PCB label 510-1045B01
- INS8040N-11 MCU, 11MHz XTAL
- external 4KB ROM 2332 101-1035A01, in module slot
- buzzer, 2 7seg LEDs, 8*8 chessboard buttons
+released modules, * denotes not dumped yet:
+- *BO6: Book Openings I
+- *CG6: Greatest Chess Games 1
+- SC6: pack-in, original program
+
+SC6 program is contained in BO6 and CG6.
+
******************************************************************************/
#include "emu.h"
@@ -34,44 +33,72 @@ Sensory Chess Challenger 6 (model SC6):
#include "fidel_sc6.lh" // clickable
-class fidelmcs48_state : public fidelbase_state
+namespace {
+
+class sc6_state : public fidelbase_state
{
public:
- fidelmcs48_state(const machine_config &mconfig, device_type type, const char *tag)
- : fidelbase_state(mconfig, type, tag)
+ sc6_state(const machine_config &mconfig, device_type type, const char *tag) :
+ fidelbase_state(mconfig, type, tag),
+ m_maincpu(*this, "maincpu")
{ }
+ // machine drivers
void sc6(machine_config &config);
private:
- // SC6
- void sc6_prepare_display();
- DECLARE_WRITE8_MEMBER(sc6_mux_w);
- DECLARE_WRITE8_MEMBER(sc6_select_w);
- DECLARE_READ8_MEMBER(sc6_input_r);
- DECLARE_READ_LINE_MEMBER(sc6_input6_r);
- DECLARE_READ_LINE_MEMBER(sc6_input7_r);
- void sc6_map(address_map &map);
-};
+ // devices/pointers
+ required_device<mcs48_cpu_device> m_maincpu;
+
+ // address maps
+ void main_map(address_map &map);
+ DECLARE_DEVICE_IMAGE_LOAD_MEMBER(cartridge);
+ // I/O handlers
+ void prepare_display();
+ DECLARE_WRITE8_MEMBER(mux_w);
+ DECLARE_WRITE8_MEMBER(select_w);
+ DECLARE_READ8_MEMBER(input_r);
+ DECLARE_READ_LINE_MEMBER(input6_r);
+ DECLARE_READ_LINE_MEMBER(input7_r);
+};
-// Devices, I/O
/******************************************************************************
- SC6
+ Devices, I/O
******************************************************************************/
+// cartridge
+
+DEVICE_IMAGE_LOAD_MEMBER(sc6_state, cartridge)
+{
+ u32 size = m_cart->common_get_size("rom");
+
+ // 4KB ROM only?
+ if (size != 0x1000)
+ {
+ image.seterror(IMAGE_ERROR_UNSPECIFIED, "Invalid file size");
+ return image_init_result::FAIL;
+ }
+
+ m_cart->rom_alloc(size, GENERIC_ROM8_WIDTH, ENDIANNESS_LITTLE);
+ m_cart->common_load_rom(m_cart->get_rom_base(), size, "rom");
+
+ return image_init_result::PASS;
+}
+
+
// MCU ports/generic
-void fidelmcs48_state::sc6_prepare_display()
+void sc6_state::prepare_display()
{
// 2 7seg leds
set_display_segmask(3, 0x7f);
display_matrix(7, 2, m_7seg_data, m_led_select);
}
-WRITE8_MEMBER(fidelmcs48_state::sc6_mux_w)
+WRITE8_MEMBER(sc6_state::mux_w)
{
// P24-P27: 7442 A-D
u16 sel = 1 << (data >> 4 & 0xf) & 0x3ff;
@@ -79,32 +106,32 @@ WRITE8_MEMBER(fidelmcs48_state::sc6_mux_w)
// 7442 0-8: input mux, 7seg data
m_inp_mux = sel & 0x1ff;
m_7seg_data = sel & 0x7f;
- sc6_prepare_display();
+ prepare_display();
// 7442 9: speaker out
m_dac->write(BIT(sel, 9));
}
-WRITE8_MEMBER(fidelmcs48_state::sc6_select_w)
+WRITE8_MEMBER(sc6_state::select_w)
{
// P16,P17: digit select
m_led_select = ~data >> 6 & 3;
- sc6_prepare_display();
+ prepare_display();
}
-READ8_MEMBER(fidelmcs48_state::sc6_input_r)
+READ8_MEMBER(sc6_state::input_r)
{
// P10-P15: multiplexed inputs low
return (~read_inputs(9) & 0x3f) | 0xc0;
}
-READ_LINE_MEMBER(fidelmcs48_state::sc6_input6_r)
+READ_LINE_MEMBER(sc6_state::input6_r)
{
// T0: multiplexed inputs bit 6
return ~read_inputs(9) >> 6 & 1;
}
-READ_LINE_MEMBER(fidelmcs48_state::sc6_input7_r)
+READ_LINE_MEMBER(sc6_state::input7_r)
{
// T1: multiplexed inputs bit 7
return ~read_inputs(9) >> 7 & 1;
@@ -116,11 +143,9 @@ READ_LINE_MEMBER(fidelmcs48_state::sc6_input7_r)
Address Maps
******************************************************************************/
-// SC6
-
-void fidelmcs48_state::sc6_map(address_map &map)
+void sc6_state::main_map(address_map &map)
{
- map(0x0000, 0x0fff).rom();
+ map(0x0000, 0x0fff).r("cartslot", FUNC(generic_slot_device::read_rom));
}
@@ -130,7 +155,7 @@ void fidelmcs48_state::sc6_map(address_map &map)
******************************************************************************/
static INPUT_PORTS_START( sc6 )
- PORT_INCLUDE( fidel_cb_buttons )
+ PORT_INCLUDE( generic_cb_buttons )
PORT_START("IN.8")
PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("RV / Pawn")
@@ -149,26 +174,32 @@ INPUT_PORTS_END
Machine Drivers
******************************************************************************/
-MACHINE_CONFIG_START(fidelmcs48_state::sc6)
-
+void sc6_state::sc6(machine_config &config)
+{
/* basic machine hardware */
- i8040_device &maincpu(I8040(config, m_maincpu, 11_MHz_XTAL));
- maincpu.set_addrmap(AS_PROGRAM, &fidelmcs48_state::sc6_map);
- maincpu.p2_out_cb().set(FUNC(fidelmcs48_state::sc6_mux_w));
- maincpu.p1_in_cb().set(FUNC(fidelmcs48_state::sc6_input_r));
- maincpu.p1_out_cb().set(FUNC(fidelmcs48_state::sc6_select_w));
- maincpu.t0_in_cb().set(FUNC(fidelmcs48_state::sc6_input6_r));
- maincpu.t1_in_cb().set(FUNC(fidelmcs48_state::sc6_input7_r));
-
- MCFG_TIMER_DRIVER_ADD_PERIODIC("display_decay", fidelbase_state, display_decay_tick, attotime::from_msec(1))
+ I8040(config, m_maincpu, 11_MHz_XTAL);
+ m_maincpu->set_addrmap(AS_PROGRAM, &sc6_state::main_map);
+ m_maincpu->p2_out_cb().set(FUNC(sc6_state::mux_w));
+ m_maincpu->p1_in_cb().set(FUNC(sc6_state::input_r));
+ m_maincpu->p1_out_cb().set(FUNC(sc6_state::select_w));
+ m_maincpu->t0_in_cb().set(FUNC(sc6_state::input6_r));
+ m_maincpu->t1_in_cb().set(FUNC(sc6_state::input7_r));
+
+ TIMER(config, "display_decay").configure_periodic(FUNC(sc6_state::display_decay_tick), attotime::from_msec(1));
config.set_default_layout(layout_fidel_sc6);
/* sound hardware */
SPEAKER(config, "speaker").front_center();
- MCFG_DEVICE_ADD("dac", DAC_1BIT, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 0.25)
- MCFG_DEVICE_ADD("vref", VOLTAGE_REGULATOR, 0) MCFG_VOLTAGE_REGULATOR_OUTPUT(5.0)
- MCFG_SOUND_ROUTE(0, "dac", 1.0, DAC_VREF_POS_INPUT)
-MACHINE_CONFIG_END
+ DAC_1BIT(config, m_dac).add_route(ALL_OUTPUTS, "speaker", 0.25);
+ VOLTAGE_REGULATOR(config, "vref").add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT);
+
+ /* cartridge */
+ GENERIC_CARTSLOT(config, m_cart, generic_plain_slot, "fidel_sc6", "bin");
+ m_cart->set_device_load(device_image_load_delegate(&sc6_state::device_image_load_cartridge, this));
+ m_cart->set_must_be_loaded(true);
+
+ SOFTWARE_LIST(config, "cart_list").set_original("fidel_sc6");
+}
@@ -177,15 +208,17 @@ MACHINE_CONFIG_END
******************************************************************************/
ROM_START( fscc6 )
- ROM_REGION( 0x1000, "maincpu", 0 )
- ROM_LOAD("101-1035a01", 0x0000, 0x1000, CRC(0024971f) SHA1(76b16364913ada2fb94b9e6a8524b924e6832ddf) ) // 2332
+ ROM_REGION( 0x1000, "maincpu", ROMREGION_ERASE00 )
+ // none here, it's in the module slot
ROM_END
+} // anonymous namespace
+
/******************************************************************************
Drivers
******************************************************************************/
-// YEAR NAME PARENT CMP MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS
-CONS( 1982, fscc6, 0, 0, sc6, sc6, fidelmcs48_state, empty_init, "Fidelity Electronics", "Sensory Chess Challenger 6", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
+// YEAR NAME PARENT CMP MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS
+CONS( 1982, fscc6, 0, 0, sc6, sc6, sc6_state, empty_init, "Fidelity Electronics", "Sensory Chess Challenger 6", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
diff --git a/src/mame/drivers/fidel_sc8.cpp b/src/mame/drivers/fidel_sc8.cpp
new file mode 100644
index 00000000000..2e03a0458a4
--- /dev/null
+++ b/src/mame/drivers/fidel_sc8.cpp
@@ -0,0 +1,157 @@
+// license:BSD-3-Clause
+// copyright-holders:hap
+// thanks-to:yoyo_chessboard
+/******************************************************************************
+*
+* fidel_sc8.cpp, subdriver of machine/fidelbase.cpp, machine/chessbase.cpp
+
+*******************************************************************************
+
+Fidelity Sensory Chess Challenger 8 overview:
+- Z80A CPU @ 3.9MHz
+- 4KB ROM(MOS 2732), 256 bytes RAM(35391CP)
+- chessboard buttons, 8*8+1 leds
+- PCB label 510-1011 REV.2
+
+******************************************************************************/
+
+#include "emu.h"
+#include "includes/fidelbase.h"
+
+#include "cpu/z80/z80.h"
+#include "sound/volt_reg.h"
+#include "speaker.h"
+
+// internal artwork
+#include "fidel_sc8.lh" // clickable
+
+
+namespace {
+
+class scc_state : public fidelbase_state
+{
+public:
+ scc_state(const machine_config &mconfig, device_type type, const char *tag) :
+ fidelbase_state(mconfig, type, tag)
+ { }
+
+ // machine drivers
+ void scc(machine_config &config);
+
+private:
+ // address maps
+ void main_map(address_map &map);
+ void main_io(address_map &map);
+
+ // I/O handlers
+ DECLARE_READ8_MEMBER(input_r);
+ DECLARE_WRITE8_MEMBER(control_w);
+};
+
+
+/******************************************************************************
+ Devices, I/O
+******************************************************************************/
+
+// TTL
+
+WRITE8_MEMBER(scc_state::control_w)
+{
+ // a0-a2,d7: led data
+ u8 mask = 1 << (offset & 7);
+ m_led_data = (m_led_data & ~mask) | ((data & 0x80) ? mask : 0);
+
+ // d0-d3: led select, input mux (row 9 is speaker out)
+ // d4: corner led(direct)
+ m_inp_mux = 1 << (data & 0xf);
+ m_dac->write(BIT(m_inp_mux, 9));
+ display_matrix(8, 9, m_led_data, (m_inp_mux & 0xff) | (data << 4 & 0x100));
+}
+
+READ8_MEMBER(scc_state::input_r)
+{
+ // d0-d7: multiplexed inputs (active low)
+ return ~read_inputs(9);
+}
+
+
+
+/******************************************************************************
+ Address Maps
+******************************************************************************/
+
+void scc_state::main_map(address_map &map)
+{
+ map(0x0000, 0x0fff).rom();
+ map(0x5000, 0x50ff).ram();
+}
+
+void scc_state::main_io(address_map &map)
+{
+ map.global_mask(0x07);
+ map(0x00, 0x07).rw(FUNC(scc_state::input_r), FUNC(scc_state::control_w));
+}
+
+
+
+/******************************************************************************
+ Input Ports
+******************************************************************************/
+
+static INPUT_PORTS_START( scc )
+ PORT_INCLUDE( generic_cb_buttons )
+
+ PORT_START("IN.8")
+ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("Pawn")
+ PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("Rook")
+ PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("Knight")
+ PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("Bishop")
+ PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("Queen")
+ PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("King")
+ PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_DEL) PORT_NAME("CL")
+ PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_R) PORT_NAME("RE")
+INPUT_PORTS_END
+
+
+
+/******************************************************************************
+ Machine Drivers
+******************************************************************************/
+
+void scc_state::scc(machine_config &config)
+{
+ /* basic machine hardware */
+ Z80(config, m_maincpu, 3.9_MHz_XTAL);
+ m_maincpu->set_addrmap(AS_PROGRAM, &scc_state::main_map);
+ m_maincpu->set_addrmap(AS_IO, &scc_state::main_io);
+
+ TIMER(config, "display_decay").configure_periodic(FUNC(scc_state::display_decay_tick), attotime::from_msec(1));
+ config.set_default_layout(layout_fidel_sc8);
+
+ /* sound hardware */
+ SPEAKER(config, "speaker").front_center();
+ DAC_1BIT(config, m_dac).add_route(ALL_OUTPUTS, "speaker", 0.25);
+ VOLTAGE_REGULATOR(config, "vref").add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT);
+}
+
+
+
+/******************************************************************************
+ ROM Definitions
+******************************************************************************/
+
+ROM_START( fscc8 ) // model SCC
+ ROM_REGION( 0x10000, "maincpu", 0 )
+ ROM_LOAD( "101-32017", 0x0000, 0x1000, CRC(5340820d) SHA1(e3494c7624b3cacbbb9a0a8cc9e1ed3e00326dfd) ) // 2732
+ROM_END
+
+} // anonymous namespace
+
+
+
+/******************************************************************************
+ Drivers
+******************************************************************************/
+
+// YEAR NAME PARENT CMP MACHINE INPUT STATE INIT COMPANY, FULLNAME, FLAGS
+CONS( 1980, fscc8, 0, 0, scc, scc, scc_state, empty_init, "Fidelity Electronics", "Sensory Chess Challenger 8", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
diff --git a/src/mame/drivers/fidel_sc9.cpp b/src/mame/drivers/fidel_sc9.cpp
new file mode 100644
index 00000000000..97fe169a1d0
--- /dev/null
+++ b/src/mame/drivers/fidel_sc9.cpp
@@ -0,0 +1,295 @@
+// license:BSD-3-Clause
+// copyright-holders:hap
+// thanks-to:Berger, yoyo_chessboard
+/******************************************************************************
+*
+* fidel_sc9.cpp, subdriver of machine/fidelbase.cpp, machine/chessbase.cpp
+
+*******************************************************************************
+
+Fidelity Sensory Chess Challenger "9" (SC9) overview:
+- 8*(8+1) buttons, 8*8+1 LEDs
+- 36-pin edge connector, assume same as SC12
+- 2KB RAM(TMM2016P), 2*8KB ROM(HN48364P)
+- R6502-13, 1.4MHz from resonator, another pcb with the same resonator was measured 1.49MHz*
+- PCB label 510-1046C01 2-1-82
+
+*: 2 other boards were measured 1.60MHz and 1.88MHz(newest serial). Online references
+suggest 3 versions of SC9(C01) total: 1.5MHz, 1.6MHz, and 1.9MHz.
+
+I/O is via TTL, not further documented here
+
+3 versions were available, the newest "B" version was 2MHz and included the Budapest program.
+The Playmatic S was only released in Germany, it's basically a 'deluxe' version of SC9
+with magnet sensors and came with CB9 and CB16.
+
+******************************************************************************/
+
+#include "emu.h"
+#include "includes/fidelbase.h"
+
+#include "cpu/m6502/m6502.h"
+#include "sound/volt_reg.h"
+#include "speaker.h"
+
+// internal artwork
+#include "fidel_playmatic.lh" // clickable
+#include "fidel_sc9.lh" // clickable
+
+
+namespace {
+
+class sc9_state : public fidelbase_state
+{
+public:
+ sc9_state(const machine_config &mconfig, device_type type, const char *tag) :
+ fidelbase_state(mconfig, type, tag)
+ { }
+
+ // machine drivers
+ void sc9b(machine_config &config);
+ void sc9c(machine_config &config);
+ void sc9d(machine_config &config);
+ void playmatic(machine_config &config);
+
+protected:
+ // address maps
+ void sc9_map(address_map &map);
+ void sc9d_map(address_map &map);
+
+ // I/O handlers
+ void prepare_display();
+ DECLARE_WRITE8_MEMBER(control_w);
+ DECLARE_WRITE8_MEMBER(led_w);
+ DECLARE_READ8_MEMBER(input_r);
+ DECLARE_READ8_MEMBER(input_d7_r);
+};
+
+class sc9c_state : public sc9_state
+{
+public:
+ sc9c_state(const machine_config &mconfig, device_type type, const char *tag) :
+ sc9_state(mconfig, type, tag)
+ { }
+
+ DECLARE_INPUT_CHANGED_MEMBER(sc9c_cpu_freq) { sc9c_set_cpu_freq(); }
+
+protected:
+ virtual void machine_reset() override;
+ void sc9c_set_cpu_freq();
+};
+
+void sc9c_state::machine_reset()
+{
+ sc9_state::machine_reset();
+ sc9c_set_cpu_freq();
+}
+
+void sc9c_state::sc9c_set_cpu_freq()
+{
+ // SC9(C01) was released with 1.5MHz, 1.6MHz, or 1.9MHz CPU
+ u8 inp = ioport("FAKE")->read();
+ m_maincpu->set_unscaled_clock((inp & 2) ? 1900000 : ((inp & 1) ? 1600000 : 1500000));
+}
+
+
+/******************************************************************************
+ Devices, I/O
+******************************************************************************/
+
+// TTL/generic
+
+void sc9_state::prepare_display()
+{
+ // 8*8 chessboard leds + 1 corner led
+ display_matrix(8, 9, m_led_data, m_inp_mux);
+}
+
+WRITE8_MEMBER(sc9_state::control_w)
+{
+ // d0-d3: 74245 P0-P3
+ // 74245 Q0-Q8: input mux, led select
+ u16 sel = 1 << (data & 0xf) & 0x3ff;
+ m_inp_mux = sel & 0x1ff;
+ prepare_display();
+
+ // 74245 Q9: speaker out
+ m_dac->write(BIT(sel, 9));
+
+ // d4,d5: ?
+ // d6,d7: N/C
+}
+
+WRITE8_MEMBER(sc9_state::led_w)
+{
+ // a0-a2,d0: led data via NE591N
+ m_led_data = (data & 1) << offset;
+ prepare_display();
+}
+
+READ8_MEMBER(sc9_state::input_r)
+{
+ // multiplexed inputs (active low)
+ return read_inputs(9) ^ 0xff;
+}
+
+READ8_MEMBER(sc9_state::input_d7_r)
+{
+ // a0-a2,d7: multiplexed inputs (active low)
+ return (read_inputs(9) >> offset & 1) ? 0 : 0x80;
+}
+
+
+
+/******************************************************************************
+ Address Maps
+******************************************************************************/
+
+void sc9_state::sc9_map(address_map &map)
+{
+ map.unmap_value_high();
+ map(0x0000, 0x07ff).mirror(0x1800).ram();
+ map(0x2000, 0x5fff).r(FUNC(sc9_state::cartridge_r));
+ map(0x6000, 0x6000).mirror(0x1fff).w(FUNC(sc9_state::control_w));
+ map(0x8000, 0x8007).mirror(0x1ff8).w(FUNC(sc9_state::led_w)).nopr();
+ map(0xa000, 0xa000).mirror(0x1fff).r(FUNC(sc9_state::input_r));
+ map(0xc000, 0xffff).rom();
+}
+
+void sc9_state::sc9d_map(address_map &map)
+{
+ sc9_map(map);
+ map(0xa000, 0xa007).mirror(0x1ff8).r(FUNC(sc9_state::input_d7_r));
+}
+
+
+
+/******************************************************************************
+ Input Ports
+******************************************************************************/
+
+static INPUT_PORTS_START( sc9_sidepanel )
+ PORT_START("IN.8")
+ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("RV / Pawn")
+ PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("DM / Knight")
+ PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("TB / Bishop")
+ PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("LV / Rook")
+ PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("PV / Queen")
+ PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("PB / King")
+ PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_DEL) PORT_NAME("CL")
+ PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_R) PORT_NAME("RE")
+INPUT_PORTS_END
+
+static INPUT_PORTS_START( sc9 )
+ PORT_INCLUDE( generic_cb_buttons )
+ PORT_INCLUDE( sc9_sidepanel )
+INPUT_PORTS_END
+
+static INPUT_PORTS_START( playmatic )
+ PORT_INCLUDE( generic_cb_magnets )
+ PORT_INCLUDE( sc9_sidepanel )
+INPUT_PORTS_END
+
+static INPUT_PORTS_START( sc9c )
+ PORT_INCLUDE( sc9 )
+
+ PORT_START("FAKE")
+ PORT_CONFNAME( 0x03, 0x00, "CPU Frequency" ) PORT_CHANGED_MEMBER(DEVICE_SELF, sc9c_state, sc9c_cpu_freq, nullptr) // factory set
+ PORT_CONFSETTING( 0x00, "1.5MHz" )
+ PORT_CONFSETTING( 0x01, "1.6MHz" )
+ PORT_CONFSETTING( 0x02, "1.9MHz" )
+INPUT_PORTS_END
+
+
+
+/******************************************************************************
+ Machine Drivers
+******************************************************************************/
+
+void sc9_state::sc9d(machine_config &config)
+{
+ /* basic machine hardware */
+ M6502(config, m_maincpu, 3.9_MHz_XTAL/2); // R6502AP, 3.9MHz resonator
+ m_maincpu->set_addrmap(AS_PROGRAM, &sc9_state::sc9d_map);
+
+ const attotime irq_period = attotime::from_hz(610); // from 555 timer (22nF, 102K, 2.7K)
+ TIMER(config, m_irq_on).configure_periodic(FUNC(sc9_state::irq_on<M6502_IRQ_LINE>), irq_period);
+ m_irq_on->set_start_delay(irq_period - attotime::from_usec(41)); // active for 41us
+ TIMER(config, "irq_off").configure_periodic(FUNC(sc9_state::irq_off<M6502_IRQ_LINE>), irq_period);
+
+ TIMER(config, "display_decay").configure_periodic(FUNC(sc9_state::display_decay_tick), attotime::from_msec(1));
+ config.set_default_layout(layout_fidel_sc9);
+
+ /* sound hardware */
+ SPEAKER(config, "speaker").front_center();
+ DAC_1BIT(config, m_dac).add_route(ALL_OUTPUTS, "speaker", 0.25);
+ VOLTAGE_REGULATOR(config, "vref").add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT);
+
+ /* cartridge */
+ GENERIC_CARTSLOT(config, m_cart, generic_plain_slot, "fidel_scc", "bin,dat");
+ m_cart->set_device_load(device_image_load_delegate(&sc9_state::device_image_load_scc_cartridge, this));
+
+ SOFTWARE_LIST(config, "cart_list").set_original("fidel_scc");
+}
+
+void sc9_state::sc9b(machine_config &config)
+{
+ sc9d(config);
+
+ /* basic machine hardware */
+ m_maincpu->set_clock(1500000); // from ceramic resonator "681 JSA", measured
+ m_maincpu->set_addrmap(AS_PROGRAM, &sc9_state::sc9_map);
+}
+
+void sc9_state::playmatic(machine_config &config)
+{
+ sc9b(config);
+
+ /* basic machine hardware */
+ m_maincpu->set_clock(3100000); // approximation
+ config.set_default_layout(layout_fidel_playmatic);
+}
+
+
+
+/******************************************************************************
+ ROM Definitions
+******************************************************************************/
+
+ROM_START( fscc9 ) // PCB label 510-1046D01
+ ROM_REGION( 0x10000, "maincpu", 0 )
+ ROM_LOAD("101-1034b01", 0xc000, 0x2000, CRC(65288753) SHA1(651f5ca5969ddd72a20cbebdec2de83c4bf10650) )
+ ROM_LOAD("101-1034c02", 0xe000, 0x2000, CRC(238b092f) SHA1(7ddffc6dba822aee9d8ad6815b23024ed5cdfd26) )
+ROM_END
+
+ROM_START( fscc9b ) // PCB label 510-1046B01
+ ROM_REGION( 0x10000, "maincpu", 0 )
+ ROM_LOAD("101-1034a01", 0xc000, 0x2000, CRC(b845c458) SHA1(d3fda65dbd9fae44fa4b93f8207839d8fa0c367a) )
+ ROM_LOAD("101-1034a02", 0xe000, 0x2000, CRC(ecfa0a4c) SHA1(738df99a250fad0b1da5ebeb8c92a9ad1461417b) )
+ROM_END
+
+ROM_START( fscc9c ) // PCB label 510-1046C01
+ ROM_REGION( 0x10000, "maincpu", 0 )
+ ROM_LOAD("101-1034a01", 0xc000, 0x2000, CRC(b845c458) SHA1(d3fda65dbd9fae44fa4b93f8207839d8fa0c367a) ) // HN48364P
+ ROM_LOAD("101-1034b02", 0xe000, 0x2000, CRC(cbaf97d7) SHA1(7ed8e68bb74713d9e2ff1d9c037012320b7bfcbf) ) // "
+ROM_END
+
+ROM_START( fscc9ps )
+ ROM_REGION( 0x10000, "maincpu", 0 )
+ ROM_LOAD("play64c1.bin", 0xc000, 0x2000, CRC(e96aa95d) SHA1(16d90cf0ef166aef579d442671290a2c43e24dfe) )
+ ROM_LOAD("play64en.bin", 0xe000, 0x2000, CRC(6fa188d2) SHA1(1b9b0209c496c89ecb7f9ec07bfd9429ff9b275e) )
+ROM_END
+
+} // anonymous namespace
+
+
+
+/******************************************************************************
+ Drivers
+******************************************************************************/
+
+// YEAR NAME PARENT CMP MACHINE INPUT STATE INIT COMPANY, FULLNAME, FLAGS
+CONS( 1982, fscc9, 0, 0, sc9d, sc9, sc9_state, empty_init, "Fidelity Electronics", "Sensory Chess Challenger 9 (rev. D)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS ) // aka version "B"
+CONS( 1982, fscc9b, fscc9, 0, sc9b, sc9, sc9_state, empty_init, "Fidelity Electronics", "Sensory Chess Challenger 9 (rev. B)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
+CONS( 1982, fscc9c, fscc9, 0, sc9b, sc9c, sc9c_state, empty_init, "Fidelity Electronics", "Sensory Chess Challenger 9 (rev. C)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
+CONS( 1983, fscc9ps, fscc9, 0, playmatic, playmatic, sc9_state, empty_init, "Fidelity Deutschland", "Sensory 9 Playmatic S", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
diff --git a/src/mame/drivers/fidel_vcc.cpp b/src/mame/drivers/fidel_vcc.cpp
new file mode 100644
index 00000000000..b54bddd4990
--- /dev/null
+++ b/src/mame/drivers/fidel_vcc.cpp
@@ -0,0 +1,386 @@
+// license:BSD-3-Clause
+// copyright-holders:Kevin Horton, Jonathan Gevaryahu, Sandro Ronco, hap
+/******************************************************************************
+*
+* fidel_vcc.cpp, subdriver of machine/fidelbase.cpp, machine/chessbase.cpp
+
+Fidelity Voice Chess Challenger series hardware
+- Voice Chess Challenger (VCC) (version A and B?)
+- Advanced Voice Chess Challenger (UVC)
+- *Grandmaster Voice Chess Challenger
+- *Decorator Challenger (FCC)
+
+*: not dumped yet
+
+*******************************************************************************
+
+RE notes by Kevin Horton
+
+The CPU is a Z80 running at 4MHz. The TSI chip runs at around 25KHz, using a
+470K / 100pf RC network. This system is very very basic, and is composed of just
+the Z80, 4 ROMs, the TSI chip, and an 8255.
+
+The Z80's interrupt inputs are all pulled to VCC, so no interrupts are used.
+
+Reset is connected to a power-on reset circuit and a button on the keypad (marked RE).
+
+The TSI chip connects to a 4K ROM. All of the 'Voiced' Chess Challengers
+use this same ROM (three or four). The later chess boards use a slightly different part
+number, but the contents are identical.
+
+Memory map (VCC):
+-----------
+0000-0FFF: 4K 2332 ROM 101-32013
+1000-1FFF: 4K 2332 ROM VCC2
+2000-2FFF: 4K 2332 ROM VCC3
+4000-5FFF: 1K RAM (2114 SRAM x2)
+6000-FFFF: empty
+
+Memory map (UVC):
+-----------
+0000-1FFF: 8K 2364 ROM 101-64017
+2000-2FFF: 4K 2332 ROM 101-32010
+4000-5FFF: 1K RAM (2114 SRAM x2)
+6000-FFFF: empty
+
+Port map:
+---------
+00-03: 8255 port chip, mirrored over the 00-FF range; program accesses F4-F7
+
+8255 connections:
+-----------------
+PA.0 - segment G, TSI A0 (W)
+PA.1 - segment F, TSI A1 (W)
+PA.2 - segment E, TSI A2 (W)
+PA.3 - segment D, TSI A3 (W)
+PA.4 - segment C, TSI A4 (W)
+PA.5 - segment B, TSI A5 (W)
+PA.6 - segment A, language latch Data (W)
+PA.7 - TSI START line, language latch clock (W, see below)
+
+PB.0 - dot commons (W)
+PB.1 - NC
+PB.2 - digit 0, bottom dot (W)
+PB.3 - digit 1, top dot (W)
+PB.4 - digit 2 (W)
+PB.5 - digit 3 (W)
+PB.6 - enable language switches (W, see below)
+PB.7 - TSI BUSY line (R)
+
+(button rows pulled up to 5V through 2.2K resistors)
+PC.0 - button row 0, German language jumper (R)
+PC.1 - button row 1, French language jumper (R)
+PC.2 - button row 2, Spanish language jumper (R)
+PC.3 - button row 3, special language jumper (R)
+PC.4 - button column A (W)
+PC.5 - button column B (W)
+PC.6 - button column C (W)
+PC.7 - button column D (W)
+
+language switches:
+------------------
+When PB.6 is pulled low, the language switches can be read. There are four.
+They connect to the button rows. When enabled, the row(s) will read low if
+the jumper is present. English only VCC's do not have the 367 or any pads stuffed.
+The jumpers are labeled: French, German, Spanish, and special.
+
+language latch:
+---------------
+There's an unstuffed 7474 on the board that connects to PA.6 and PA.7. It allows
+one to latch the state of A12 to the speech ROM. The English version has the chip
+missing, and a jumper pulling "A12" to ground. This line is really a negative
+enable.
+
+To make the VCC multi-language, one would install the 74367 (note: it must be a 74367
+or possibly a 74LS367. A 74HC367 would not work since they rely on the input current
+to keep the inputs pulled up), solder a piggybacked ROM to the existing English
+speech ROM, and finally install a 7474 dual flipflop.
+
+This way, the game can then detect which secondary language is present, and then it can
+automatically select the correct ROM(s). I have to test whether it will do automatic
+determination and give you a language option on power up or something.
+
+******************************************************************************/
+
+#include "emu.h"
+#include "includes/fidelbase.h"
+
+#include "cpu/z80/z80.h"
+#include "machine/i8255.h"
+#include "speaker.h"
+
+// internal artwork
+#include "fidel_vcc.lh" // clickable
+
+
+namespace {
+
+class vcc_state : public fidelbase_state
+{
+public:
+ vcc_state(const machine_config &mconfig, device_type type, const char *tag) :
+ fidelbase_state(mconfig, type, tag),
+ m_ppi8255(*this, "ppi8255")
+ { }
+
+ // machine drivers
+ void vcc(machine_config &config);
+
+protected:
+ virtual void machine_start() override;
+
+private:
+ // devices/pointers
+ required_device<i8255_device> m_ppi8255;
+
+ // address maps
+ void main_map(address_map &map);
+ void main_io(address_map &map);
+
+ // I/O handlers
+ void prepare_display();
+ DECLARE_READ8_MEMBER(speech_r);
+ DECLARE_WRITE8_MEMBER(ppi_porta_w);
+ DECLARE_READ8_MEMBER(ppi_portb_r);
+ DECLARE_WRITE8_MEMBER(ppi_portb_w);
+ DECLARE_READ8_MEMBER(ppi_portc_r);
+ DECLARE_WRITE8_MEMBER(ppi_portc_w);
+};
+
+void vcc_state::machine_start()
+{
+ fidelbase_state::machine_start();
+
+ // game relies on RAM filled with FF at power-on
+ for (int i = 0; i < 0x400; i++)
+ m_maincpu->space(AS_PROGRAM).write_byte(i + 0x4000, 0xff);
+}
+
+
+/******************************************************************************
+ Devices, I/O
+******************************************************************************/
+
+// misc handlers
+
+void vcc_state::prepare_display()
+{
+ // 4 7seg leds (note: sel d0 for extra leds)
+ u8 outdata = (m_7seg_data & 0x7f) | (m_led_select << 7 & 0x80);
+ set_display_segmask(0xf, 0x7f);
+ display_matrix(8, 4, outdata, m_led_select >> 2 & 0xf);
+}
+
+READ8_MEMBER(vcc_state::speech_r)
+{
+ return m_speech_rom[m_speech_bank << 12 | offset];
+}
+
+
+// I8255 PPI
+
+WRITE8_MEMBER(vcc_state::ppi_porta_w)
+{
+ // d0-d6: digit segment data, bits are xABCDEFG
+ m_7seg_data = bitswap<8>(data,7,0,1,2,3,4,5,6);
+ prepare_display();
+
+ // d0-d5: TSI C0-C5
+ // d7: TSI START line
+ m_speech->data_w(space, 0, data & 0x3f);
+ m_speech->start_w(data >> 7 & 1);
+
+ // d6: language latch data
+ // d7: language latch clock (latch on high)
+ if (data & 0x80)
+ {
+ m_speech->force_update(); // update stream to now
+ m_speech_bank = data >> 6 & 1;
+ }
+}
+
+READ8_MEMBER(vcc_state::ppi_portb_r)
+{
+ // d7: TSI BUSY line
+ return (m_speech->busy_r()) ? 0x80 : 0x00;
+}
+
+WRITE8_MEMBER(vcc_state::ppi_portb_w)
+{
+ // d0,d2-d5: digit/led select
+ // _d6: enable language switches
+ m_led_select = data;
+ prepare_display();
+}
+
+READ8_MEMBER(vcc_state::ppi_portc_r)
+{
+ // d0-d3: multiplexed inputs (active low)
+ // also language switches, hardwired with 4 jumpers
+ // 0(none wired): English, 1: German, 2: French, 4: Spanish, 8:Special(unused)
+ u8 lan = (~m_led_select & 0x40) ? *m_language : 0;
+ return ~(lan | read_inputs(4)) & 0xf;
+}
+
+WRITE8_MEMBER(vcc_state::ppi_portc_w)
+{
+ // d4-d7: input mux (inverted)
+ m_inp_mux = ~data >> 4 & 0xf;
+}
+
+
+
+/******************************************************************************
+ Address Maps
+******************************************************************************/
+
+void vcc_state::main_map(address_map &map)
+{
+ map.unmap_value_high();
+ map(0x0000, 0x2fff).rom();
+ map(0x4000, 0x43ff).mirror(0x1c00).ram();
+}
+
+void vcc_state::main_io(address_map &map)
+{
+ map.global_mask(0x03);
+ map(0x00, 0x03).rw(m_ppi8255, FUNC(i8255_device::read), FUNC(i8255_device::write));
+}
+
+
+
+/******************************************************************************
+ Input Ports
+******************************************************************************/
+
+static INPUT_PORTS_START( vcc )
+ PORT_START("IN.0")
+ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_UNUSED)
+ PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("LV") PORT_CODE(KEYCODE_L)
+ PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("A1") PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_CODE(KEYCODE_A)
+ PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("E5") PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_CODE(KEYCODE_E)
+
+ PORT_START("IN.1")
+ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Speaker") PORT_CODE(KEYCODE_SPACE)
+ PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("DM") PORT_CODE(KEYCODE_M)
+ PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("B2") PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_CODE(KEYCODE_B)
+ PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("F6") PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_CODE(KEYCODE_F)
+
+ PORT_START("IN.2")
+ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("CL") PORT_CODE(KEYCODE_DEL) PORT_CODE(KEYCODE_BACKSPACE)
+ PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("PB") PORT_CODE(KEYCODE_O)
+ PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("C3") PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_CODE(KEYCODE_C)
+ PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("G7") PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_CODE(KEYCODE_G)
+
+ PORT_START("IN.3")
+ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("EN") PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD)
+ PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("PV") PORT_CODE(KEYCODE_V)
+ PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("D4") PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_CODE(KEYCODE_D)
+ PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("H8") PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_CODE(KEYCODE_H)
+
+ PORT_START("RESET") // is not on matrix IN.0 d0
+ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("RE") PORT_CODE(KEYCODE_R) PORT_CHANGED_MEMBER(DEVICE_SELF, vcc_state, reset_button, nullptr)
+INPUT_PORTS_END
+
+
+
+/******************************************************************************
+ Machine Drivers
+******************************************************************************/
+
+void vcc_state::vcc(machine_config &config)
+{
+ /* basic machine hardware */
+ Z80(config, m_maincpu, 4_MHz_XTAL);
+ m_maincpu->set_addrmap(AS_PROGRAM, &vcc_state::main_map);
+ m_maincpu->set_addrmap(AS_IO, &vcc_state::main_io);
+
+ I8255(config, m_ppi8255);
+ m_ppi8255->out_pa_callback().set(FUNC(vcc_state::ppi_porta_w));
+ m_ppi8255->tri_pa_callback().set_constant(0);
+ m_ppi8255->in_pb_callback().set(FUNC(vcc_state::ppi_portb_r));
+ m_ppi8255->out_pb_callback().set(FUNC(vcc_state::ppi_portb_w));
+ m_ppi8255->tri_pb_callback().set_constant(0);
+ m_ppi8255->in_pc_callback().set(FUNC(vcc_state::ppi_portc_r));
+ m_ppi8255->out_pc_callback().set(FUNC(vcc_state::ppi_portc_w));
+
+ TIMER(config, "display_decay").configure_periodic(FUNC(vcc_state::display_decay_tick), attotime::from_msec(1));
+ config.set_default_layout(layout_fidel_vcc);
+
+ /* sound hardware */
+ SPEAKER(config, "speaker").front_center();
+ S14001A(config, m_speech, 25000); // R/C circuit, around 25khz
+ m_speech->ext_read().set(FUNC(vcc_state::speech_r));
+ m_speech->add_route(ALL_OUTPUTS, "speaker", 0.75);
+}
+
+
+
+/******************************************************************************
+ ROM Definitions
+******************************************************************************/
+
+ROM_START( vcc )
+ ROM_REGION( 0x10000, "maincpu", 0 )
+ ROM_LOAD("cn19256n_101-32013", 0x0000, 0x1000, CRC(257bb5ab) SHA1(f7589225bb8e5f3eac55f23e2bd526be780b38b5) )
+ ROM_LOAD("cn19174n_vcc2", 0x1000, 0x1000, CRC(f33095e7) SHA1(692fcab1b88c910b74d04fe4d0660367aee3f4f0) )
+ ROM_LOAD("cn19175n_vcc3", 0x2000, 0x1000, CRC(624f0cd5) SHA1(7c1a4f4497fe5882904de1d6fecf510c07ee6fc6) )
+
+ // speech ROM
+ ROM_DEFAULT_BIOS("en")
+ ROM_SYSTEM_BIOS(0, "en", "English")
+ ROM_SYSTEM_BIOS(1, "de", "German")
+ ROM_SYSTEM_BIOS(2, "fr", "French")
+ ROM_SYSTEM_BIOS(3, "sp", "Spanish")
+
+ ROM_REGION( 1, "language", 0 )
+ ROMX_FILL(0, 1, 0, ROM_BIOS(0) )
+ ROMX_FILL(0, 1, 1, ROM_BIOS(1) )
+ ROMX_FILL(0, 1, 2, ROM_BIOS(2) )
+ ROMX_FILL(0, 1, 4, ROM_BIOS(3) )
+
+ ROM_REGION( 0x2000, "speech", 0 )
+ ROMX_LOAD("101-32107", 0x0000, 0x1000, CRC(f35784f9) SHA1(348e54a7fa1e8091f89ac656b4da22f28ca2e44d), ROM_BIOS(0) )
+ ROM_RELOAD( 0x1000, 0x1000)
+ ROMX_LOAD("101-64101", 0x0000, 0x2000, CRC(6c85e310) SHA1(20d1d6543c1e6a1f04184a2df2a468f33faec3ff), ROM_BIOS(1) )
+ ROMX_LOAD("101-64105", 0x0000, 0x2000, CRC(fe8c5c18) SHA1(2b64279ab3747ee81c86963c13e78321c6cfa3a3), ROM_BIOS(2) )
+ ROMX_LOAD("101-64106", 0x0000, 0x2000, CRC(8766e128) SHA1(78c7413bf240159720b131ab70bfbdf4e86eb1e9), ROM_BIOS(3) )
+ROM_END
+
+ROM_START( uvc )
+ ROM_REGION( 0x10000, "maincpu", 0 )
+ ROM_LOAD("101-64017", 0x0000, 0x2000, CRC(f1133abf) SHA1(09dd85051c4e7d364d43507c1cfea5c2d08d37f4) ) // MOS // 101-64017 // 3880
+ ROM_LOAD("101-32010", 0x2000, 0x1000, CRC(624f0cd5) SHA1(7c1a4f4497fe5882904de1d6fecf510c07ee6fc6) ) // NEC P9Z021 // D2332C 228 // 101-32010, == cn19175n_vcc3 on vcc
+
+ // speech ROM
+ ROM_DEFAULT_BIOS("en")
+ ROM_SYSTEM_BIOS(0, "en", "English")
+ ROM_SYSTEM_BIOS(1, "de", "German")
+ ROM_SYSTEM_BIOS(2, "fr", "French")
+ ROM_SYSTEM_BIOS(3, "sp", "Spanish")
+
+ ROM_REGION( 1, "language", 0 )
+ ROMX_FILL(0, 1, 0, ROM_BIOS(0) )
+ ROMX_FILL(0, 1, 1, ROM_BIOS(1) )
+ ROMX_FILL(0, 1, 2, ROM_BIOS(2) )
+ ROMX_FILL(0, 1, 4, ROM_BIOS(3) )
+
+ ROM_REGION( 0x2000, "speech", 0 )
+ ROMX_LOAD("101-32107", 0x0000, 0x1000, CRC(f35784f9) SHA1(348e54a7fa1e8091f89ac656b4da22f28ca2e44d), ROM_BIOS(0) ) // NEC P9Y019 // D2332C 229 // 101-32107
+ ROM_RELOAD( 0x1000, 0x1000)
+ ROMX_LOAD("101-64101", 0x0000, 0x2000, CRC(6c85e310) SHA1(20d1d6543c1e6a1f04184a2df2a468f33faec3ff), ROM_BIOS(1) )
+ ROMX_LOAD("101-64105", 0x0000, 0x2000, CRC(fe8c5c18) SHA1(2b64279ab3747ee81c86963c13e78321c6cfa3a3), ROM_BIOS(2) )
+ ROMX_LOAD("101-64106", 0x0000, 0x2000, CRC(8766e128) SHA1(78c7413bf240159720b131ab70bfbdf4e86eb1e9), ROM_BIOS(3) )
+ROM_END
+
+} // anonymous namespace
+
+
+
+/******************************************************************************
+ Drivers
+******************************************************************************/
+
+// YEAR NAME PARENT CMP MACHINE INPUT STATE INIT COMPANY, FULLNAME, FLAGS
+CONS( 1979, vcc, 0, 0, vcc, vcc, vcc_state, empty_init, "Fidelity Electronics", "Voice Chess Challenger", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK )
+CONS( 1980, uvc, vcc, 0, vcc, vcc, vcc_state, empty_init, "Fidelity Electronics", "Advanced Voice Chess Challenger", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK )
diff --git a/src/mame/drivers/fidel_vsc.cpp b/src/mame/drivers/fidel_vsc.cpp
new file mode 100644
index 00000000000..f31fbaf683a
--- /dev/null
+++ b/src/mame/drivers/fidel_vsc.cpp
@@ -0,0 +1,430 @@
+// license:BSD-3-Clause
+// copyright-holders:Kevin Horton, Jonathan Gevaryahu, Sandro Ronco, hap
+/******************************************************************************
+*
+* fidel_vsc.cpp, subdriver of machine/fidelbase.cpp, machine/chessbase.cpp
+
+*******************************************************************************
+
+Fidelity Voice Sensory Chess Challenger (VSC)
+---------------------------------------------
+RE notes by Kevin Horton
+
+The display/button/LED/speech technology is identical to Fidelity CSC.
+Only the CPU board was changed. As such, it works the same but is interfaced
+to different port chips this time.
+
+Hardware:
+---------
+On the board are 13 chips.
+
+The CPU is a Z80A running at 3.9MHz, with 20K of ROM and 1K of RAM mapped.
+I/O is composed of an 8255 triple port adaptor, and a Z80A PIO parallel I/O
+interface.
+
+There's the usual TSI S14001A speech synth with its requisite 4K ROM which is the
+same as on the other talking chess boards. The TSI chip is running at 26.37KHz.
+It uses a 470K resistor and a 100pf capacitor.
+
+The "perfect" clock would be 1/RC most likely (actually this will be skewed a tad by
+duty cycle of the oscillator) which with those parts values gives 21.27KHz. The
+formula is probably more likely to be 1/1.2RC or so.
+
+Rounding out the hardware are three driver chips for the LEDs, a 7404 inverter to
+run the crystal osc, a 555 timer to generate a clock, and a 74138 selector.
+
+NMI runs to a 555 oscillator that generates a 600Hz clock (measured: 598.9Hz.
+It has a multiturn pot to adjust).
+INT is pulled to 5V
+RST connects to a power-on reset circuit
+
+Memory map:
+-----------
+0000-1FFF: 8K ROM 101-64018
+2000-3FFF: 8K ROM 101-64019 (also used on the sensory champ. chess challenger)
+4000-5FFF: 4K ROM 101-32024
+6000-7FFF: 1K of RAM (2114 * 2)
+8000-FFFF: not used, maps to open bus
+
+Port map:
+---------
+There's only two chips in the portmap, an 8255 triple port chip, and a Z80A PIO
+parallel input/output device.
+
+Decoding isn't performed using a selector, but instead address lines are used.
+
+A2 connects to /CE on the 8255
+A3 connects to /CE on the Z80A PIO
+
+A0 connects to port A/B select on PIO & A0 of 8255
+A1 connects to control/data select on PIO & A1 of 8255
+
+So to enable only the 8255, you'd write/read to 08-0Bh for example
+To enable only the PIO, you'd write/read to 04-07h for example.
+
+writing to 00-03h will enable and write to BOTH chips, and reading 00-03h
+will return data from BOTH chips (and cause a bus conflict). The code probably
+never does either of these things.
+
+Likewise, writing/reading to 0Ch-0Fh will result in open bus, because neither chip's
+enable line will be low.
+
+This sequence repeats every 16 addresses. So to recap:
+
+00-03: both chips enabled (probably not used)
+04-07: PIO enabled
+08-0B: 8255 enabled
+0C-0F: neither enabled
+
+10-FF: mirrors of 00-0F.
+
+Refer to the Sensory Champ. Chess Chall. for explanations of the below
+I/O names and labels. It's the same.
+
+8255:
+-----
+PA.0 - segment D, TSI A0
+PA.1 - segment E, TSI A1
+PA.2 - segment F, TSI A2
+PA.3 - segment A, TSI A3
+PA.4 - segment B, TSI A4
+PA.5 - segment C, TSI A5
+PA.6 - segment G
+PA.7 - segment H
+
+PB.0 - LED row 1
+PB.1 - LED row 2
+PB.2 - LED row 3
+PB.3 - LED row 4
+PB.4 - LED row 5
+PB.5 - LED row 6
+PB.6 - LED row 7
+PB.7 - LED row 8
+
+PC.0 - LED column A, button column A, 7seg digit 1
+PC.1 - LED column B, button column B, 7seg digit 2
+PC.2 - LED column C, button column C, 7seg digit 3
+PC.3 - LED column D, button column D, 7seg digit 4
+PC.4 - LED column E, button column E
+PC.5 - LED column F, button column F
+PC.6 - LED column G, button column G
+PC.7 - LED column H, button column H
+
+Z80A PIO:
+---------
+PA.0 - button row 1
+PA.1 - button row 2
+PA.2 - button row 3
+PA.3 - button row 4
+PA.4 - button row 5
+PA.5 - button row 6
+PA.6 - button row 7
+PA.7 - button row 8
+
+PB.0 - button column I
+PB.1 - button column J
+PB.2 - hi/lo TSI speaker volume
+PB.3 - violet wire
+PB.4 - white wire (and TSI BUSY line)
+PB.5 - selection jumper input (see below)
+PB.6 - TSI start line
+PB.7 - TSI ROM A12 line
+
+selection jumpers:
+------------------
+These act like another row of buttons. It is composed of two diode locations,
+so there's up to 4 possible configurations. My board does not have either diode
+stuffed, so this most likely is "English". I suspect it selects which language to use
+for the speech synth. Of course you need the other speech ROMs for this to function
+properly.
+
+Anyways, the two jumpers are connected to button columns A and B and the common
+connects to Z80A PIO PB.5, which basically makes a 10th button row. I would
+expect that the software reads these once on startup only.
+
+******************************************************************************/
+
+#include "emu.h"
+#include "includes/fidelbase.h"
+
+#include "cpu/z80/z80.h"
+#include "machine/i8255.h"
+#include "machine/z80pio.h"
+#include "speaker.h"
+
+// internal artwork
+#include "fidel_vsc.lh" // clickable
+
+
+namespace {
+
+class vsc_state : public fidelbase_state
+{
+public:
+ vsc_state(const machine_config &mconfig, device_type type, const char *tag) :
+ fidelbase_state(mconfig, type, tag),
+ m_z80pio(*this, "z80pio"),
+ m_ppi8255(*this, "ppi8255")
+ { }
+
+ // machine drivers
+ void vsc(machine_config &config);
+
+private:
+ // devices/pointers
+ required_device<z80pio_device> m_z80pio;
+ required_device<i8255_device> m_ppi8255;
+
+ // address maps
+ void main_map(address_map &map);
+ void main_io(address_map &map);
+ DECLARE_READ8_MEMBER(main_io_trampoline_r);
+ DECLARE_WRITE8_MEMBER(main_io_trampoline_w);
+
+ // I/O handlers
+ void prepare_display();
+ DECLARE_READ8_MEMBER(speech_r);
+ DECLARE_WRITE8_MEMBER(ppi_porta_w);
+ DECLARE_WRITE8_MEMBER(ppi_portb_w);
+ DECLARE_WRITE8_MEMBER(ppi_portc_w);
+ DECLARE_READ8_MEMBER(pio_porta_r);
+ DECLARE_READ8_MEMBER(pio_portb_r);
+ DECLARE_WRITE8_MEMBER(pio_portb_w);
+};
+
+
+/******************************************************************************
+ Devices, I/O
+******************************************************************************/
+
+// misc handlers
+
+void vsc_state::prepare_display()
+{
+ // 4 7seg leds+H, 8*8 chessboard leds
+ set_display_segmask(0xf, 0x7f);
+ display_matrix(16, 8, m_led_data << 8 | m_7seg_data, m_led_select);
+}
+
+READ8_MEMBER(vsc_state::speech_r)
+{
+ return m_speech_rom[m_speech_bank << 12 | offset];
+}
+
+
+// I8255 PPI
+
+WRITE8_MEMBER(vsc_state::ppi_porta_w)
+{
+ // d0-d5: TSI C0-C5
+ m_speech->data_w(space, 0, data & 0x3f);
+
+ // d0-d7: data for the 4 7seg leds, bits are HGCBAFED (H is extra led)
+ m_7seg_data = bitswap<8>(data,7,6,2,1,0,5,4,3);
+ prepare_display();
+}
+
+WRITE8_MEMBER(vsc_state::ppi_portb_w)
+{
+ // d0-d7: led row data
+ m_led_data = data;
+ prepare_display();
+}
+
+WRITE8_MEMBER(vsc_state::ppi_portc_w)
+{
+ // d0-d3: select digits
+ // d0-d7: select leds, input mux low bits
+ m_inp_mux = (m_inp_mux & ~0xff) | data;
+ m_led_select = data;
+ prepare_display();
+}
+
+
+// Z80 PIO
+
+READ8_MEMBER(vsc_state::pio_porta_r)
+{
+ // d0-d7: multiplexed inputs
+ // also language switches(hardwired with 2 diodes)
+ u8 lan = (m_inp_mux & 0x400) ? *m_language : 0;
+ return read_inputs(10) | lan;
+}
+
+READ8_MEMBER(vsc_state::pio_portb_r)
+{
+ u8 data = 0;
+
+ // d4: TSI BUSY line
+ data |= (m_speech->busy_r()) ? 0 : 0x10;
+
+ return data;
+}
+
+WRITE8_MEMBER(vsc_state::pio_portb_w)
+{
+ // d0,d1: input mux highest bits
+ // d5: enable language switch
+ m_inp_mux = (m_inp_mux & 0xff) | (data << 8 & 0x300) | (data << 5 & 0x400);
+
+ // d7: TSI ROM A12
+ m_speech->force_update(); // update stream to now
+ m_speech_bank = data >> 7 & 1;
+
+ // d6: TSI START line
+ m_speech->start_w(data >> 6 & 1);
+
+ // d2: lower TSI volume
+ m_speech->set_output_gain(0, (data & 4) ? 0.5 : 1.0);
+}
+
+
+
+/******************************************************************************
+ Address Maps
+******************************************************************************/
+
+void vsc_state::main_map(address_map &map)
+{
+ map.unmap_value_high();
+ map(0x0000, 0x3fff).rom();
+ map(0x4000, 0x4fff).mirror(0x1000).rom();
+ map(0x6000, 0x63ff).mirror(0x1c00).ram();
+}
+
+// VSC io: A2 is 8255 _CE, A3 is Z80 PIO _CE - in theory, both chips can be accessed simultaneously
+READ8_MEMBER(vsc_state::main_io_trampoline_r)
+{
+ u8 data = 0xff; // open bus
+ if (~offset & 4)
+ data &= m_ppi8255->read(offset & 3);
+ if (~offset & 8)
+ data &= m_z80pio->read(space, offset & 3);
+
+ return data;
+}
+
+WRITE8_MEMBER(vsc_state::main_io_trampoline_w)
+{
+ if (~offset & 4)
+ m_ppi8255->write(offset & 3, data);
+ if (~offset & 8)
+ m_z80pio->write(space, offset & 3, data);
+}
+
+void vsc_state::main_io(address_map &map)
+{
+ map.global_mask(0x0f);
+ map(0x00, 0x0f).rw(FUNC(vsc_state::main_io_trampoline_r), FUNC(vsc_state::main_io_trampoline_w));
+}
+
+
+
+/******************************************************************************
+ Input Ports
+******************************************************************************/
+
+static INPUT_PORTS_START( vsc )
+ PORT_INCLUDE( generic_cb_buttons )
+
+ PORT_START("IN.8")
+ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("Pawn")
+ PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("Rook")
+ PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("Knight")
+ PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("Bishop")
+ PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("Queen")
+ PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("King")
+ PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_DEL) PORT_NAME("CL")
+ PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_R) PORT_NAME("RE")
+
+ PORT_START("IN.9")
+ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_T) PORT_NAME("TM")
+ PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_V) PORT_NAME("RV")
+ PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_SPACE) PORT_NAME("Speaker")
+ PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_L) PORT_NAME("LV")
+ PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_M) PORT_NAME("DM")
+ PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_S) PORT_NAME("ST")
+ PORT_BIT(0xc0, IP_ACTIVE_HIGH, IPT_UNUSED)
+INPUT_PORTS_END
+
+
+
+/******************************************************************************
+ Machine Drivers
+******************************************************************************/
+
+void vsc_state::vsc(machine_config &config)
+{
+ /* basic machine hardware */
+ Z80(config, m_maincpu, 3.9_MHz_XTAL); // 3.9MHz resonator
+ m_maincpu->set_addrmap(AS_PROGRAM, &vsc_state::main_map);
+ m_maincpu->set_addrmap(AS_IO, &vsc_state::main_io);
+
+ const attotime irq_period = attotime::from_hz(587); // 555 timer, measured
+ TIMER(config, m_irq_on).configure_periodic(FUNC(vsc_state::irq_on<INPUT_LINE_NMI>), irq_period);
+ m_irq_on->set_start_delay(irq_period - attotime::from_usec(845)); // active for 0.845ms (approx half)
+ TIMER(config, "irq_off").configure_periodic(FUNC(vsc_state::irq_off<INPUT_LINE_NMI>), irq_period);
+
+ I8255(config, m_ppi8255);
+ m_ppi8255->out_pa_callback().set(FUNC(vsc_state::ppi_porta_w));
+ m_ppi8255->out_pb_callback().set(FUNC(vsc_state::ppi_portb_w));
+ m_ppi8255->out_pc_callback().set(FUNC(vsc_state::ppi_portc_w));
+
+ Z80PIO(config, m_z80pio, 3.9_MHz_XTAL);
+ m_z80pio->in_pa_callback().set(FUNC(vsc_state::pio_porta_r));
+ m_z80pio->in_pb_callback().set(FUNC(vsc_state::pio_portb_r));
+ m_z80pio->out_pb_callback().set(FUNC(vsc_state::pio_portb_w));
+
+ TIMER(config, "display_decay").configure_periodic(FUNC(vsc_state::display_decay_tick), attotime::from_msec(1));
+ config.set_default_layout(layout_fidel_vsc);
+
+ /* sound hardware */
+ SPEAKER(config, "speaker").front_center();
+ S14001A(config, m_speech, 25000); // R/C circuit, around 25khz
+ m_speech->ext_read().set(FUNC(vsc_state::speech_r));
+ m_speech->add_route(ALL_OUTPUTS, "speaker", 0.75);
+}
+
+
+
+/******************************************************************************
+ ROM Definitions
+******************************************************************************/
+
+ROM_START( vsc )
+ ROM_REGION( 0x10000, "maincpu", 0 )
+ ROM_LOAD("101-64018", 0x0000, 0x2000, CRC(c9c98490) SHA1(e6db883df088d60463e75db51433a4b01a3e7626) )
+ ROM_LOAD("101-64019", 0x2000, 0x2000, CRC(08a3577c) SHA1(69fe379d21a9d4b57c84c3832d7b3e7431eec341) )
+ ROM_LOAD("101-32024", 0x4000, 0x1000, CRC(2a078676) SHA1(db2f0aba7e8ac0f84a17bae7155210cdf0813afb) )
+
+ // speech ROM
+ ROM_DEFAULT_BIOS("en")
+ ROM_SYSTEM_BIOS(0, "en", "English")
+ ROM_SYSTEM_BIOS(1, "de", "German")
+ ROM_SYSTEM_BIOS(2, "fr", "French")
+ ROM_SYSTEM_BIOS(3, "sp", "Spanish")
+
+ ROM_REGION( 1, "language", 0 )
+ ROMX_FILL(0, 1, 0, ROM_BIOS(0) )
+ ROMX_FILL(0, 1, 1, ROM_BIOS(1) )
+ ROMX_FILL(0, 1, 2, ROM_BIOS(2) )
+ ROMX_FILL(0, 1, 3, ROM_BIOS(3) )
+
+ ROM_REGION( 0x2000, "speech", 0 )
+ ROMX_LOAD("101-32107", 0x0000, 0x1000, CRC(f35784f9) SHA1(348e54a7fa1e8091f89ac656b4da22f28ca2e44d), ROM_BIOS(0) )
+ ROM_RELOAD( 0x1000, 0x1000)
+ ROMX_LOAD("101-64101", 0x0000, 0x2000, CRC(6c85e310) SHA1(20d1d6543c1e6a1f04184a2df2a468f33faec3ff), ROM_BIOS(1) )
+ ROMX_LOAD("101-64105", 0x0000, 0x2000, CRC(fe8c5c18) SHA1(2b64279ab3747ee81c86963c13e78321c6cfa3a3), ROM_BIOS(2) )
+ ROMX_LOAD("101-64106", 0x0000, 0x2000, CRC(8766e128) SHA1(78c7413bf240159720b131ab70bfbdf4e86eb1e9), ROM_BIOS(3) )
+ROM_END
+
+} // anonymous namespace
+
+
+
+/******************************************************************************
+ Drivers
+******************************************************************************/
+
+// YEAR NAME PARENT CMP MACHINE INPUT STATE INIT COMPANY, FULLNAME, FLAGS
+CONS( 1980, vsc, 0, 0, vsc, vsc, vsc_state, empty_init, "Fidelity Electronics", "Voice Sensory Chess Challenger", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
diff --git a/src/mame/drivers/fidelz80.cpp b/src/mame/drivers/fidelz80.cpp
deleted file mode 100644
index f5038d8b269..00000000000
--- a/src/mame/drivers/fidelz80.cpp
+++ /dev/null
@@ -1,2045 +0,0 @@
-// license:BSD-3-Clause
-// copyright-holders:Kevin Horton,Jonathan Gevaryahu,Sandro Ronco,hap
-// thanks-to:Berger,yoyo_chessboard
-/******************************************************************************
-
- Fidelity Electronics Z80 based board driver
- for 6502 based boards, see drivers/fidel6502.cpp
- for 68000 based boards, see drivers/fidel68k.cpp
-
- NOTE: MAME doesn't include a generalized implementation for boardpieces yet,
- greatly affecting user playability of emulated electronic board games.
- As workaround for the chess games, use an external chess GUI on the side,
- such as Arena(in editmode).
-
- TODO:
- - Source organization is a big mess. Each machine family could be in its own
- sub driverclass, and separate files.
- - VBRC card scanner
- - VBRC MCU T1 is unknown
- - Z80 WAIT pin is not fully emulated, affecting VBRC speech busy state
- - DSC: what controls the 2 middle leds? or unused?
-
- Read the official manual(s) on how to play.
-
- Keypad legend:
- - RE: Reset
- - CL: Clear
- - EN: Enter
- - PB: Problem Mode
- - PV: Position Verification
- - LV: Playing Levels
- - TB: Take Back
- - DM: Display Move/Double Move
- - RV: Reverse
- - ST: Set/Stop
- - TM: Time
-
- Peripherals, compatible with various boards:
- - Fidelity Challenger Printer - thermal printer, MCU=D8048C243
-
- Program/data cartridges, for various boards, some cross-compatible:
- - CG6: Greatest Chess Games 1
- - CAC: Challenger Advanced Chess - 8KB 101-1038A01
- - CB9: Challenger Book Openings 1 - 8KB (label not known)
- - CB16: Challenger Book Openings 2 - 8+8KB 101-1042A01,02
- - others are alt. titles of these?
-
- Board hardware descriptions below.
- Detailed RE work done by Kevin 'kevtris' Horton, except where noted
-
-******************************************************************************
-
-Voice Chess Challenger (VCC) (version A and B?)
-Advanced Voice Chess Challenger (UVC)
-Grandmaster Voice Chess Challenger
-Decorator Challenger (FCC)
-
-(which share the same hardware)
-----------------------
-The CPU is a Z80 running at 4MHz. The TSI chip runs at around 25KHz, using a
-470K / 100pf RC network. This system is very very basic, and is composed of just
-the Z80, 4 ROMs, the TSI chip, and an 8255.
-
-The Z80's interrupt inputs are all pulled to VCC, so no interrupts are used.
-
-Reset is connected to a power-on reset circuit and a button on the keypad (marked RE).
-
-The TSI chip connects to a 4K ROM. All of the 'Voiced' Chess Challengers
-use this same ROM (three or four). The later chess boards use a slightly different part
-number, but the contents are identical.
-
-Memory map (VCC):
------------
-0000-0FFF: 4K 2332 ROM 101-32103
-1000-1FFF: 4K 2332 ROM VCC2
-2000-2FFF: 4K 2332 ROM VCC3
-4000-5FFF: 1K RAM (2114 SRAM x2)
-6000-FFFF: empty
-
-Memory map (UVC):
------------
-0000-1FFF: 8K 2364 ROM 101-64017
-2000-2FFF: 4K 2332 ROM 101-32010
-4000-5FFF: 1K RAM (2114 SRAM x2)
-6000-FFFF: empty
-
-Port map:
----------
-00-03: 8255 port chip, mirrored over the 00-FF range; program accesses F4-F7
-
-8255 connections:
------------------
-PA.0 - segment G, TSI A0 (W)
-PA.1 - segment F, TSI A1 (W)
-PA.2 - segment E, TSI A2 (W)
-PA.3 - segment D, TSI A3 (W)
-PA.4 - segment C, TSI A4 (W)
-PA.5 - segment B, TSI A5 (W)
-PA.6 - segment A, language latch Data (W)
-PA.7 - TSI START line, language latch clock (W, see below)
-
-PB.0 - dot commons (W)
-PB.1 - NC
-PB.2 - digit 0, bottom dot (W)
-PB.3 - digit 1, top dot (W)
-PB.4 - digit 2 (W)
-PB.5 - digit 3 (W)
-PB.6 - enable language switches (W, see below)
-PB.7 - TSI BUSY line (R)
-
-(button rows pulled up to 5V through 2.2K resistors)
-PC.0 - button row 0, German language jumper (R)
-PC.1 - button row 1, French language jumper (R)
-PC.2 - button row 2, Spanish language jumper (R)
-PC.3 - button row 3, special language jumper (R)
-PC.4 - button column A (W)
-PC.5 - button column B (W)
-PC.6 - button column C (W)
-PC.7 - button column D (W)
-
-language switches:
-------------------
-When PB.6 is pulled low, the language switches can be read. There are four.
-They connect to the button rows. When enabled, the row(s) will read low if
-the jumper is present. English only VCC's do not have the 367 or any pads stuffed.
-The jumpers are labelled: French, German, Spanish, and special.
-
-language latch:
----------------
-There's an unstuffed 7474 on the board that connects to PA.6 and PA.7. It allows
-one to latch the state of A12 to the speech ROM. The English version has the chip
-missing, and a jumper pulling "A12" to ground. This line is really a negative
-enable.
-
-To make the VCC multi-language, one would install the 74367 (note: it must be a 74367
-or possibly a 74LS367. A 74HC367 would not work since they rely on the input current
-to keep the inputs pulled up), solder a piggybacked ROM to the existing English
-speech ROM, and finally install a 7474 dual flipflop.
-
-This way, the game can then detect which secondary language is present, and then it can
-automatically select the correct ROM(s). I have to test whether it will do automatic
-determination and give you a language option on power up or something.
-
-
-******************************************************************************
-
-Chess Challenger 10 (CC10)
--------------------
-4 versions are known to exist: A,B,C,D. Strangely, version C has an 8080
-instead of Z80. Chess Challenger 1,3 and 7 also run on very similar hardware.
-
-This is an earlier hardware upon which the VCC and UVC above were based on;
-The hardware is nearly the same; in fact the only significant differences are
-the RAM being located in a different place, the lack of a speech chip, and
-the connections to ports A and B on the PPI:
-
-8255 connections:
------------------
-PA.0 - segment G (W)
-PA.1 - segment F (W)
-PA.2 - segment E (W)
-PA.3 - segment D (W)
-PA.4 - segment C (W)
-PA.5 - segment B (W)
-PA.6 - segment A (W)
-PA.7 - 'beeper' direct speaker output (W)
-
-The beeper is via a 556 timer, fixed-frequency at around 1300-1400Hz.
-Not all hardware configurations include the beeper.
-
-PB.0 - dot commons (W)
-PB.1 - NC
-PB.2 - digit 0, bottom dot (W)
-PB.3 - digit 1, top dot (W)
-PB.4 - digit 2 (W)
-PB.5 - digit 3 (W)
-PB.6 - NC
-PB.7 - Mode select (cc3 vs cc10, R) - note: there is no CC3 with 16 buttons
-
-(button rows pulled up to 5V through 2.2K resistors)
-PC.0 - button row 0 (R)
-PC.1 - button row 1 (R)
-PC.2 - button row 2 (R)
-PC.3 - button row 3 (R)
-PC.4 - button column A (W)
-PC.5 - button column B (W)
-PC.6 - button column C (W)
-PC.7 - button column D (W)
-
-
-******************************************************************************
-
-Chess Challenger 7 (BCC)
-------------------------
-RE information from netlist by Berger
-
-Zilog Z80A, 3.579MHz from XTAL
-Z80 IRQ/NMI unused, no timer IC.
-This is a cost-reduced design from CC10, no special I/O chips.
-
-Memory map:
------------
-0000-0FFF: 4K 2332 ROM CN19103N BCC-REVB.
-2000-2FFF: ROM/RAM bus conflict!
-3000-3FFF: 256 bytes RAM (2111 SRAM x2)
-4000-FFFF: Z80 A14/A15 not connected
-
-Port map (Write):
----------
-D0-D3: digit select and keypad mux
-D4: LOSE led
-D5: CHECK led
-A0-A2: NE591 A0-A2
-D7: NE591 D (_C not used)
-NE591 Q0-Q6: digit segments A-G
-NE591 Q7: buzzer
-
-Port map (Read):
----------
-D0-D3: keypad row
-
-
-******************************************************************************
-
-Voice Bridge Challenger (Model VBRC, later reissued as Model 7002)
-and Bridge Challenger 3 (Model 7014)
-(which both share the same* hardware)
---------------------------------
-* The Bridge Challenger 3 does not actually have the 8 LEDs nor the
-latches which operate them populated and the plastic indicator cap locations
-are instead are covered by a piece of plastic, but they do work if manually
-added.
-
-This unit is similar in construction kinda to the chess challengers, however it
-has an 8041 which does ALL of the system I/O. The Z80 has NO IO AT ALL other than
-what is performed through the 8041!
-
-The main CPU is a Z80 running at 2.5MHz
-
-INT connects to VCC (not used)
-NMI connects to VCC (not used)
-RST connects to power on reset, and reset button
-
-The 8041 runs at 5MHz.
-
-Memory Map:
------------
-0000-1FFF: 8K 101-64108 ROM
-2000-3FFF: 8K 101-64109 ROM
-4000-5FFF: 8K 101-64110 ROM
-6000-7FFF: 1K of RAM (2114 * 2)
-8000-DFFF: unused
-E000-FFFF: write to TSI chip
-
-NOTE: when the TSI chip is written to, the CPU IS STOPPED. The CPU will run again
-when the word is done being spoken. This is because D0-D5 run to the TSI chip directly.
-
-The TSI chip's ROM is 4K, and is marked 101-32118. The clock is the same as the Chess
-Challengers- 470K/100pf which gives a frequency around 25KHz or so.
-
-Port Map:
----------
-00-FF: 8041 I/O ports (A0 selects between the two)
-
-8041 pinout:
-------------
-(note: columns are pulled up with 10K resistors)
-
-P10 - column H, RD LED, VFD grid 0
-P11 - column G, DB LED, VFD grid 1
-P12 - column F, <>V LED, VFD grid 2
-P13 - column E, ^V LED, VFD grid 3
-P14 - column D, W LED, VFD grid 4
-P15 - column C, S LED, VFD grid 5
-P16 - column B, E LED, VFD grid 6
-P17 - column A, N LED, VFD grid 7
-
-P20 - I/O expander
-P21 - I/O expander
-P22 - I/O expander
-P23 - I/O expander
-P24 - row 0 through inverter
-P25 - row 1 through inverter
-P26 - row 2 through inverter
-P27 - row 3 through inverter
-
-PROG - I/O expander
-
-T0 - optical card sensor (high = bright/reflective, low = dark/non reflective)
-T1 - connects to inverter, then nothing?
-
-D8243C I/O expander:
---------------------
-P4.0 - segment M
-P4.1 - segment L
-P4.2 - segment N
-P4.3 - segment E
-
-P5.0 - segment D
-P5.1 - segment I
-P5.2 - segment K
-P5.3 - segment J
-
-P6.0 - segment A
-P6.1 - segment B
-P6.2 - segment F
-P6.3 - segment G
-
-P7.0 - LED enable (high = LEDs can be lit. low = LEDs will not light)
-P7.1 - goes through inverter, to pads that are not used
-P7.2 - segment C
-P7.3 - segment H
-
-button matrix:
---------------
-the matrix is composed of 8 columns by 4 rows.
-
- A B C D E F G H
- -------------------------
-0- RE xx CL EN J Q K A
-1- BR PB DB SC 7 8 9 10
-2- DL CV VL PL 3 4 5 6
-3- cl di he sp NT P 1 2
-
-xx - speaker symbol
-cl - clubs symbol
-di - diamonds symbol
-he - hearts symbol
-sp - spades symbol
-
-NOTE: RE is not wired into the matrix, and is run separately out.
-
-There are 8 LEDs, and an 8 digit 14 segment VFD with commas and periods.
-This display is the same one as can be found on the speak and spell.
-
- A * comma
- *********** *
- * *I *J K* *
-F* * * * *B
- * * * * *
- G**** *****H
- * * * * *
-E* * * * *C
- * *N *M L* *
- *********** *decimal point
- D
-
-The digits of the display are numbered left to right, 0 through 7 and are controlled
-by the grids. hi = grid on, hi = segment on.
-
-A detailed description of the hardware can be found also in the patent 4,373,719.
-
-
-******************************************************************************
-
-Voice Sensory Chess Challenger (VSC)
-------------------------------------
-The display/button/LED/speech technology is identical to Fidelity CSC.
-Only the CPU board was changed. As such, it works the same but is interfaced
-to different port chips this time.
-
-Hardware:
----------
-On the board are 13 chips.
-
-The CPU is a Z80A running at 3.9MHz, with 20K of ROM and 1K of RAM mapped.
-I/O is composed of an 8255 triple port adaptor, and a Z80A PIO parallel I/O
-interface.
-
-There's the usual TSI S14001A speech synth with its requisite 4K ROM which is the
-same as on the other talking chess boards. The TSI chip is running at 26.37KHz.
-It uses a 470K resistor and a 100pf capacitor.
-
-The "perfect" clock would be 1/RC most likely (actually this will be skewed a tad by
-duty cycle of the oscillator) which with those parts values gives 21.27KHz. The
-formula is probably more likely to be 1/1.2RC or so.
-
-Rounding out the hardware are three driver chips for the LEDs, a 7404 inverter to
-run the crystal osc, a 555 timer to generate a clock, and a 74138 selector.
-
-NMI runs to a 555 oscillator that generates a 600Hz clock (measured: 598.9Hz. It has a multiturn pot to adjust).
-INT is pulled to 5V
-RST connects to a power-on reset circuit
-
-Memory map:
------------
-0000-1FFF: 8K ROM 101-64018
-2000-3FFF: 8K ROM 101-64019 (also used on the sensory champ. chess challenger)
-4000-5FFF: 4K ROM 101-32024
-6000-7FFF: 1K of RAM (2114 * 2)
-8000-FFFF: not used, maps to open bus
-
-Port map:
----------
-There's only two chips in the portmap, an 8255 triple port chip, and a Z80A PIO
-parallel input/output device.
-
-Decoding isn't performed using a selector, but instead address lines are used.
-
-A2 connects to /CE on the 8255
-A3 connects to /CE on the Z80A PIO
-
-A0 connects to port A/B select on PIO & A0 of 8255
-A1 connects to control/data select on PIO & A1 of 8255
-
-So to enable only the 8255, you'd write/read to 08-0Bh for example
-To enable only the PIO, you'd write/read to 04-07h for example.
-
-writing to 00-03h will enable and write to BOTH chips, and reading 00-03h
-will return data from BOTH chips (and cause a bus conflict). The code probably
-never does either of these things.
-
-Likewise, writing/reading to 0Ch-0Fh will result in open bus, because neither chip's
-enable line will be low.
-
-This sequence repeats every 16 addresses. So to recap:
-
-00-03: both chips enabled (probably not used)
-04-07: PIO enabled
-08-0B: 8255 enabled
-0C-0F: neither enabled
-
-10-FF: mirrors of 00-0F.
-
-Refer to the Sensory Champ. Chess Chall. for explanations of the below
-I/O names and labels. It's the same.
-
-8255:
------
-PA.0 - segment D, TSI A0
-PA.1 - segment E, TSI A1
-PA.2 - segment F, TSI A2
-PA.3 - segment A, TSI A3
-PA.4 - segment B, TSI A4
-PA.5 - segment C, TSI A5
-PA.6 - segment G
-PA.7 - segment H
-
-PB.0 - LED row 1
-PB.1 - LED row 2
-PB.2 - LED row 3
-PB.3 - LED row 4
-PB.4 - LED row 5
-PB.5 - LED row 6
-PB.6 - LED row 7
-PB.7 - LED row 8
-
-PC.0 - LED column A, button column A, 7seg digit 1
-PC.1 - LED column B, button column B, 7seg digit 2
-PC.2 - LED column C, button column C, 7seg digit 3
-PC.3 - LED column D, button column D, 7seg digit 4
-PC.4 - LED column E, button column E
-PC.5 - LED column F, button column F
-PC.6 - LED column G, button column G
-PC.7 - LED column H, button column H
-
-Z80A PIO:
----------
-PA.0 - button row 1
-PA.1 - button row 2
-PA.2 - button row 3
-PA.3 - button row 4
-PA.4 - button row 5
-PA.5 - button row 6
-PA.6 - button row 7
-PA.7 - button row 8
-
-PB.0 - button column I
-PB.1 - button column J
-PB.2 - hi/lo TSI speaker volume
-PB.3 - violet wire
-PB.4 - white wire (and TSI BUSY line)
-PB.5 - selection jumper input (see below)
-PB.6 - TSI start line
-PB.7 - TSI ROM A12 line
-
-selection jumpers:
-------------------
-These act like another row of buttons. It is composed of two diode locations,
-so there's up to 4 possible configurations. My board does not have either diode
-stuffed, so this most likely is "English". I suspect it selects which language to use
-for the speech synth. Of course you need the other speech ROMs for this to function
-properly.
-
-Anyways, the two jumpers are connected to button columns A and B and the common
-connects to Z80A PIO PB.5, which basically makes a 10th button row. I would
-expect that the software reads these once on startup only.
-
-******************************************************************************/
-
-#include "emu.h"
-#include "includes/fidelbase.h"
-
-#include "cpu/z80/z80.h"
-#include "cpu/mcs48/mcs48.h"
-#include "machine/i8255.h"
-#include "machine/i8243.h"
-#include "machine/z80pio.h"
-#include "sound/beep.h"
-#include "sound/volt_reg.h"
-#include "speaker.h"
-
-// internal artwork
-#include "fidel_cc.lh" // clickable
-#include "fidel_bcc.lh" // clickable
-#include "fidel_dsc.lh" // clickable
-#include "fidel_sc8.lh" // clickable
-#include "fidel_vcc.lh" // clickable
-#include "fidel_vbrc.lh"
-#include "fidel_vsc.lh" // clickable
-
-
-class fidelz80_state : public fidelbase_state
-{
-public:
- fidelz80_state(const machine_config &mconfig, device_type type, const char *tag)
- : fidelbase_state(mconfig, type, tag),
- m_mcu(*this, "mcu"),
- m_z80pio(*this, "z80pio"),
- m_ppi8255(*this, "ppi8255"),
- m_i8243(*this, "i8243"),
- m_beeper_off(*this, "beeper_off"),
- m_beeper(*this, "beeper"),
- m_irq_on(*this, "irq_on")
- { }
-
- void cc10(machine_config &config);
- void vcc(machine_config &config);
-
- void bcc(machine_config &config);
-
- void scc(machine_config &config);
-
- void vsc(machine_config &config);
-
- void vbrc(machine_config &config);
-
- void dsc(machine_config &config);
-
- DECLARE_INPUT_CHANGED_MEMBER(reset_button);
-
-private:
- // devices/pointers
- optional_device<i8041_device> m_mcu;
- optional_device<z80pio_device> m_z80pio;
- optional_device<i8255_device> m_ppi8255;
- optional_device<i8243_device> m_i8243;
- optional_device<timer_device> m_beeper_off;
- optional_device<beep_device> m_beeper;
- optional_device<timer_device> m_irq_on;
-
- TIMER_DEVICE_CALLBACK_MEMBER(irq_on) { m_maincpu->set_input_line(INPUT_LINE_IRQ0, ASSERT_LINE); }
- TIMER_DEVICE_CALLBACK_MEMBER(irq_off) { m_maincpu->set_input_line(INPUT_LINE_IRQ0, CLEAR_LINE); }
-
- // CC10 and VCC/UVC
- void vcc_prepare_display();
- DECLARE_READ8_MEMBER(vcc_speech_r);
- DECLARE_WRITE8_MEMBER(vcc_ppi_porta_w);
- DECLARE_READ8_MEMBER(vcc_ppi_portb_r);
- DECLARE_WRITE8_MEMBER(vcc_ppi_portb_w);
- DECLARE_READ8_MEMBER(vcc_ppi_portc_r);
- DECLARE_WRITE8_MEMBER(vcc_ppi_portc_w);
- DECLARE_WRITE8_MEMBER(cc10_ppi_porta_w);
- TIMER_DEVICE_CALLBACK_MEMBER(beeper_off_callback);
- DECLARE_MACHINE_START(vcc);
- void cc10_map(address_map &map);
- void vcc_io(address_map &map);
- void vcc_map(address_map &map);
-
- // BCC
- DECLARE_READ8_MEMBER(bcc_input_r);
- DECLARE_WRITE8_MEMBER(bcc_control_w);
- void bcc_io(address_map &map);
- void bcc_map(address_map &map);
-
- // SCC
- DECLARE_READ8_MEMBER(scc_input_r);
- DECLARE_WRITE8_MEMBER(scc_control_w);
- void scc_io(address_map &map);
- void scc_map(address_map &map);
-
- // VSC
- void vsc_prepare_display();
- DECLARE_READ8_MEMBER(vsc_io_trampoline_r);
- DECLARE_WRITE8_MEMBER(vsc_io_trampoline_w);
- DECLARE_WRITE8_MEMBER(vsc_ppi_porta_w);
- DECLARE_WRITE8_MEMBER(vsc_ppi_portb_w);
- DECLARE_WRITE8_MEMBER(vsc_ppi_portc_w);
- DECLARE_READ8_MEMBER(vsc_pio_porta_r);
- DECLARE_READ8_MEMBER(vsc_pio_portb_r);
- DECLARE_WRITE8_MEMBER(vsc_pio_portb_w);
- void vsc_io(address_map &map);
- void vsc_map(address_map &map);
-
- // VBRC
- void vbrc_prepare_display();
- DECLARE_WRITE8_MEMBER(vbrc_speech_w);
- DECLARE_WRITE8_MEMBER(vbrc_mcu_p1_w);
- DECLARE_READ_LINE_MEMBER(vbrc_mcu_t0_r);
- DECLARE_READ_LINE_MEMBER(vbrc_mcu_t1_r);
- DECLARE_READ8_MEMBER(vbrc_mcu_p2_r);
- template<int P> void vbrc_ioexp_port_w(uint8_t data);
- void vbrc_main_io(address_map &map);
- void vbrc_main_map(address_map &map);
-
- // DSC
- void dsc_prepare_display();
- DECLARE_WRITE8_MEMBER(dsc_control_w);
- DECLARE_WRITE8_MEMBER(dsc_select_w);
- DECLARE_READ8_MEMBER(dsc_input_r);
- void dsc_map(address_map &map);
-};
-
-
-// machine start/reset
-
-void fidelbase_state::machine_start()
-{
- // resolve handlers
- m_out_x.resolve();
- m_out_a.resolve();
- m_out_digit.resolve();
-
- // zerofill
- memset(m_display_state, 0, sizeof(m_display_state));
- memset(m_display_decay, 0, sizeof(m_display_decay));
- memset(m_display_segmask, 0, sizeof(m_display_segmask));
-
- m_inp_mux = 0;
- m_led_select = 0;
- m_led_data = 0;
- m_7seg_data = 0;
- m_speech_data = 0;
- m_speech_bank = 0;
-
- // register for savestates
- save_item(NAME(m_display_maxy));
- save_item(NAME(m_display_maxx));
- save_item(NAME(m_display_wait));
-
- save_item(NAME(m_display_state));
- save_item(NAME(m_display_decay));
- save_item(NAME(m_display_segmask));
-
- save_item(NAME(m_inp_mux));
- save_item(NAME(m_led_select));
- save_item(NAME(m_led_data));
- save_item(NAME(m_7seg_data));
- save_item(NAME(m_speech_data));
- save_item(NAME(m_speech_bank));
-}
-
-void fidelbase_state::machine_reset()
-{
-}
-
-
-
-/***************************************************************************
-
- Helper Functions
-
-***************************************************************************/
-
-// The device may strobe the outputs very fast, it is unnoticeable to the user.
-// To prevent flickering here, we need to simulate a decay.
-
-void fidelbase_state::display_update()
-{
- for (int y = 0; y < m_display_maxy; y++)
- {
- u32 active_state = 0;
-
- for (int x = 0; x <= m_display_maxx; x++)
- {
- // turn on powered segments
- if (m_display_state[y] >> x & 1)
- m_display_decay[y][x] = m_display_wait;
-
- // determine active state
- u32 ds = (m_display_decay[y][x] != 0) ? 1 : 0;
- active_state |= (ds << x);
-
- // output to y.x, or y.a when always-on
- if (x != m_display_maxx)
- m_out_x[y][x] = ds;
- else
- m_out_a[y] = ds;
- }
-
- // output to digity
- if (m_display_segmask[y] != 0)
- m_out_digit[y] = active_state & m_display_segmask[y];
- }
-}
-
-TIMER_DEVICE_CALLBACK_MEMBER(fidelbase_state::display_decay_tick)
-{
- // slowly turn off unpowered segments
- for (int y = 0; y < m_display_maxy; y++)
- for (int x = 0; x <= m_display_maxx; x++)
- if (m_display_decay[y][x] != 0)
- m_display_decay[y][x]--;
-
- display_update();
-}
-
-void fidelbase_state::set_display_size(int maxx, int maxy)
-{
- m_display_maxx = maxx;
- m_display_maxy = maxy;
-}
-
-void fidelbase_state::set_display_segmask(u32 digits, u32 mask)
-{
- // set a segment mask per selected digit, but leave unselected ones alone
- for (int i = 0; i < 0x20; i++)
- {
- if (digits & 1)
- m_display_segmask[i] = mask;
- digits >>= 1;
- }
-}
-
-void fidelbase_state::display_matrix(int maxx, int maxy, u32 setx, u32 sety, bool update)
-{
- set_display_size(maxx, maxy);
-
- // update current state
- u32 mask = (1 << maxx) - 1;
- for (int y = 0; y < maxy; y++)
- m_display_state[y] = (sety >> y & 1) ? ((setx & mask) | (1 << maxx)) : 0;
-
- if (update)
- display_update();
-}
-
-
-// generic input handlers
-
-u16 fidelbase_state::read_inputs(int columns)
-{
- u16 ret = 0;
-
- // read selected input rows
- for (int i = 0; i < columns; i++)
- if (m_inp_mux >> i & 1)
- ret |= m_inp_matrix[i]->read();
-
- return ret;
-}
-
-INPUT_CHANGED_MEMBER(fidelz80_state::reset_button)
-{
- // when RE button is directly wired to RESET pin(s)
- m_maincpu->set_input_line(INPUT_LINE_RESET, newval ? ASSERT_LINE : CLEAR_LINE);
-
- if (m_mcu)
- m_mcu->set_input_line(INPUT_LINE_RESET, newval ? ASSERT_LINE : CLEAR_LINE);
-}
-
-
-// cartridge
-
-DEVICE_IMAGE_LOAD_MEMBER(fidelbase_state, scc_cartridge)
-{
- u32 size = m_cart->common_get_size("rom");
-
- // max size is 16KB?
- if (size > 0x4000)
- {
- image.seterror(IMAGE_ERROR_UNSPECIFIED, "Invalid file size");
- return image_init_result::FAIL;
- }
-
- m_cart->rom_alloc(size, GENERIC_ROM8_WIDTH, ENDIANNESS_LITTLE);
- m_cart->common_load_rom(m_cart->get_rom_base(), size, "rom");
-
- return image_init_result::PASS;
-}
-
-READ8_MEMBER(fidelbase_state::cartridge_r)
-{
- if (m_cart->exists())
- return m_cart->read_rom(space, offset);
- else
- return 0;
-}
-
-
-
-// Devices, I/O
-
-/******************************************************************************
- CC10 and VCC/UVC
-******************************************************************************/
-
-// misc handlers
-
-void fidelz80_state::vcc_prepare_display()
-{
- // 4 7seg leds (note: sel d0 for extra leds)
- u8 outdata = (m_7seg_data & 0x7f) | (m_led_select << 7 & 0x80);
- set_display_segmask(0xf, 0x7f);
- display_matrix(8, 4, outdata, m_led_select >> 2 & 0xf);
-}
-
-READ8_MEMBER(fidelz80_state::vcc_speech_r)
-{
- return m_speech_rom[m_speech_bank << 12 | offset];
-}
-
-MACHINE_START_MEMBER(fidelz80_state,vcc)
-{
- machine_start();
-
- // game relies on RAM initialized filled with 1
- for (int i = 0; i < 0x400; i++)
- m_maincpu->space(AS_PROGRAM).write_byte(i + 0x4000, 0xff);
-}
-
-
-// I8255 PPI
-
-WRITE8_MEMBER(fidelz80_state::vcc_ppi_porta_w)
-{
- // d0-d6: digit segment data, bits are xABCDEFG
- m_7seg_data = bitswap<8>(data,7,0,1,2,3,4,5,6);
- vcc_prepare_display();
-
- // d0-d5: TSI C0-C5
- // d7: TSI START line
- m_speech->data_w(space, 0, data & 0x3f);
- m_speech->start_w(data >> 7 & 1);
-
- // d6: language latch data
- // d7: language latch clock (latch on high)
- if (data & 0x80)
- {
- m_speech->force_update(); // update stream to now
- m_speech_bank = data >> 6 & 1;
- }
-}
-
-READ8_MEMBER(fidelz80_state::vcc_ppi_portb_r)
-{
- // d7: TSI BUSY line
- return (m_speech->busy_r()) ? 0x80 : 0x00;
-}
-
-WRITE8_MEMBER(fidelz80_state::vcc_ppi_portb_w)
-{
- // d0,d2-d5: digit/led select
- // _d6: enable language switches
- m_led_select = data;
- vcc_prepare_display();
-}
-
-READ8_MEMBER(fidelz80_state::vcc_ppi_portc_r)
-{
- // d0-d3: multiplexed inputs (active low), also language switches
- u8 lan = (~m_led_select & 0x40) ? m_inp_matrix[4]->read() : 0;
- return ~(lan | read_inputs(4)) & 0xf;
-}
-
-WRITE8_MEMBER(fidelz80_state::vcc_ppi_portc_w)
-{
- // d4-d7: input mux (inverted)
- m_inp_mux = ~data >> 4 & 0xf;
-}
-
-
-// CC10-specific (no speech chip, 1-bit beeper instead)
-
-TIMER_DEVICE_CALLBACK_MEMBER(fidelz80_state::beeper_off_callback)
-{
- m_beeper->set_state(0);
-}
-
-WRITE8_MEMBER(fidelz80_state::cc10_ppi_porta_w)
-{
- // d7: enable beeper on falling edge
- if (m_beeper && ~data & m_7seg_data & 0x80)
- {
- m_beeper->set_state(1);
- m_beeper_off->adjust(attotime::from_msec(80)); // duration is approximate
- }
-
- // d0-d6: digit segment data (same as VCC)
- m_7seg_data = bitswap<8>(data,7,0,1,2,3,4,5,6);
- vcc_prepare_display();
-}
-
-
-
-/******************************************************************************
- BCC
-******************************************************************************/
-
-// TTL
-
-WRITE8_MEMBER(fidelz80_state::bcc_control_w)
-{
- // a0-a2,d7: digit segment data via NE591, Q7 is speaker out
- u8 mask = 1 << (offset & 7);
- m_7seg_data = (m_7seg_data & ~mask) | ((data & 0x80) ? mask : 0);
- m_dac->write(BIT(m_7seg_data, 7));
-
- // d0-d3: led select, input mux
- // d4,d5: check,lose leds(direct)
- set_display_segmask(0xf, 0x7f);
- display_matrix(7, 6, m_7seg_data & 0x7f, data & 0x3f);
- m_inp_mux = data & 0xf;
-}
-
-READ8_MEMBER(fidelz80_state::bcc_input_r)
-{
- // d0-d3: multiplexed inputs
- return read_inputs(4);
-}
-
-
-
-/******************************************************************************
- SCC
-******************************************************************************/
-
-// TTL
-
-WRITE8_MEMBER(fidelz80_state::scc_control_w)
-{
- // a0-a2,d7: led data
- u8 mask = 1 << (offset & 7);
- m_led_data = (m_led_data & ~mask) | ((data & 0x80) ? mask : 0);
-
- // d0-d3: led select, input mux (row 9 is speaker out)
- // d4: corner led(direct)
- m_inp_mux = 1 << (data & 0xf);
- m_dac->write(BIT(m_inp_mux, 9));
- display_matrix(8, 9, m_led_data, (m_inp_mux & 0xff) | (data << 4 & 0x100));
-}
-
-READ8_MEMBER(fidelz80_state::scc_input_r)
-{
- // d0-d7: multiplexed inputs (active low)
- return ~read_inputs(9);
-}
-
-
-
-/******************************************************************************
- VSC
-******************************************************************************/
-
-// misc handlers
-
-void fidelz80_state::vsc_prepare_display()
-{
- // 4 7seg leds+H, 8*8 chessboard leds
- set_display_segmask(0xf, 0x7f);
- display_matrix(16, 8, m_led_data << 8 | m_7seg_data, m_led_select);
-}
-
-
-// I8255 PPI
-
-WRITE8_MEMBER(fidelz80_state::vsc_ppi_porta_w)
-{
- // d0-d5: TSI C0-C5
- m_speech->data_w(space, 0, data & 0x3f);
-
- // d0-d7: data for the 4 7seg leds, bits are HGCBAFED (H is extra led)
- m_7seg_data = bitswap<8>(data,7,6,2,1,0,5,4,3);
- vsc_prepare_display();
-}
-
-WRITE8_MEMBER(fidelz80_state::vsc_ppi_portb_w)
-{
- // d0-d7: led row data
- m_led_data = data;
- vsc_prepare_display();
-}
-
-WRITE8_MEMBER(fidelz80_state::vsc_ppi_portc_w)
-{
- // d0-d3: select digits
- // d0-d7: select leds, input mux low bits
- m_inp_mux = (m_inp_mux & ~0xff) | data;
- m_led_select = data;
- vsc_prepare_display();
-}
-
-
-// Z80 PIO
-
-READ8_MEMBER(fidelz80_state::vsc_pio_porta_r)
-{
- // d0-d7: multiplexed inputs
- return read_inputs(11);
-}
-
-READ8_MEMBER(fidelz80_state::vsc_pio_portb_r)
-{
- u8 data = 0;
-
- // d4: TSI BUSY line
- data |= (m_speech->busy_r()) ? 0 : 0x10;
-
- return data;
-}
-
-WRITE8_MEMBER(fidelz80_state::vsc_pio_portb_w)
-{
- // d0,d1: input mux highest bits
- // d5: enable language switch
- m_inp_mux = (m_inp_mux & 0xff) | (data << 8 & 0x300) | (data << 5 & 0x400);
-
- // d7: TSI ROM A12
- m_speech->force_update(); // update stream to now
- m_speech_bank = data >> 7 & 1;
-
- // d6: TSI START line
- m_speech->start_w(data >> 6 & 1);
-
- // d2: lower TSI volume
- m_speech->set_output_gain(0, (data & 4) ? 0.5 : 1.0);
-}
-
-
-
-/******************************************************************************
- VBRC
-******************************************************************************/
-
-// misc handlers
-
-void fidelz80_state::vbrc_prepare_display()
-{
- // 14seg led segments, d15 is extra led, d14 is unused (tone on prototype?)
- u16 outdata = bitswap<16>(m_7seg_data,12,13,1,6,5,2,0,7,15,11,10,14,4,3,9,8);
- set_display_segmask(0xff, 0x3fff);
- display_matrix(16, 8, outdata, m_led_select);
-}
-
-WRITE8_MEMBER(fidelz80_state::vbrc_speech_w)
-{
- m_speech->data_w(space, 0, data & 0x3f);
- m_speech->start_w(1);
- m_speech->start_w(0);
-}
-
-
-// I8243 I/O expander
-
-template<int P>
-void fidelz80_state::vbrc_ioexp_port_w(uint8_t data)
-{
- // P4-P7: digit segment data
- m_7seg_data = (m_7seg_data & ~(0xf << (4*P))) | ((data & 0xf) << (4*P));
- vbrc_prepare_display();
-}
-
-
-// I8041 MCU
-
-WRITE8_MEMBER(fidelz80_state::vbrc_mcu_p1_w)
-{
- // P10-P17: select digits, input mux
- m_inp_mux = m_led_select = data;
- vbrc_prepare_display();
-}
-
-READ8_MEMBER(fidelz80_state::vbrc_mcu_p2_r)
-{
- // P20-P23: I8243 P2
- // P24-P27: multiplexed inputs (active low)
- return (m_i8243->p2_r() & 0x0f) | (read_inputs(8) << 4 ^ 0xf0);
-}
-
-READ_LINE_MEMBER(fidelz80_state::vbrc_mcu_t0_r)
-{
- // T0: card scanner?
- return 0;
-}
-
-READ_LINE_MEMBER(fidelz80_state::vbrc_mcu_t1_r)
-{
- // T1: ? (locks up on const 0 or 1)
- return machine().rand() & 1;
-}
-
-
-
-/******************************************************************************
- DSC
-******************************************************************************/
-
-// TTL
-
-void fidelz80_state::dsc_prepare_display()
-{
- // 4 7seg leds
- set_display_segmask(0xf, 0x7f);
- display_matrix(8, 4, m_7seg_data, m_led_select);
-}
-
-WRITE8_MEMBER(fidelz80_state::dsc_control_w)
-{
- // d0-d7: input mux, 7seg data
- m_inp_mux = ~data;
- m_7seg_data = data;
- dsc_prepare_display();
-}
-
-WRITE8_MEMBER(fidelz80_state::dsc_select_w)
-{
- // d4: speaker out
- m_dac->write(BIT(~data, 4));
-
- // d0-d3: digit select
- m_led_select = data & 0xf;
- dsc_prepare_display();
-}
-
-READ8_MEMBER(fidelz80_state::dsc_input_r)
-{
- // d0-d7: multiplexed inputs (active low)
- return ~read_inputs(8);
-}
-
-
-
-/******************************************************************************
- Address Maps
-******************************************************************************/
-
-// CC10 and VCC/UVC
-
-void fidelz80_state::cc10_map(address_map &map)
-{
- map.unmap_value_high();
- map.global_mask(0x3fff);
- map(0x0000, 0x0fff).rom();
- map(0x1000, 0x10ff).mirror(0x0f00).ram();
- map(0x3000, 0x30ff).mirror(0x0f00).ram();
-}
-
-void fidelz80_state::vcc_map(address_map &map)
-{
- map.unmap_value_high();
- map(0x0000, 0x2fff).rom();
- map(0x4000, 0x43ff).mirror(0x1c00).ram();
-}
-
-void fidelz80_state::vcc_io(address_map &map)
-{
- map.global_mask(0x03);
- map(0x00, 0x03).rw(m_ppi8255, FUNC(i8255_device::read), FUNC(i8255_device::write));
-}
-
-
-// BCC
-
-void fidelz80_state::bcc_map(address_map &map)
-{
- map.unmap_value_high();
- map.global_mask(0x3fff);
- map(0x0000, 0x0fff).rom();
- map(0x3000, 0x30ff).mirror(0x0f00).ram();
-}
-
-void fidelz80_state::bcc_io(address_map &map)
-{
- map.global_mask(0x07);
- map(0x00, 0x07).rw(FUNC(fidelz80_state::bcc_input_r), FUNC(fidelz80_state::bcc_control_w));
-}
-
-
-// SCC
-
-void fidelz80_state::scc_map(address_map &map)
-{
- map(0x0000, 0x0fff).rom();
- map(0x5000, 0x50ff).ram();
-}
-
-void fidelz80_state::scc_io(address_map &map)
-{
- map.global_mask(0x07);
- map(0x00, 0x07).rw(FUNC(fidelz80_state::scc_input_r), FUNC(fidelz80_state::scc_control_w));
-}
-
-
-// VSC
-
-void fidelz80_state::vsc_map(address_map &map)
-{
- map.unmap_value_high();
- map(0x0000, 0x3fff).rom();
- map(0x4000, 0x4fff).mirror(0x1000).rom();
- map(0x6000, 0x63ff).mirror(0x1c00).ram();
-}
-
-// VSC io: A2 is 8255 _CE, A3 is Z80 PIO _CE - in theory, both chips can be accessed simultaneously
-READ8_MEMBER(fidelz80_state::vsc_io_trampoline_r)
-{
- u8 data = 0xff; // open bus
- if (~offset & 4)
- data &= m_ppi8255->read(offset & 3);
- if (~offset & 8)
- data &= m_z80pio->read(space, offset & 3);
-
- return data;
-}
-
-WRITE8_MEMBER(fidelz80_state::vsc_io_trampoline_w)
-{
- if (~offset & 4)
- m_ppi8255->write(offset & 3, data);
- if (~offset & 8)
- m_z80pio->write(space, offset & 3, data);
-}
-
-void fidelz80_state::vsc_io(address_map &map)
-{
- map.global_mask(0x0f);
- map(0x00, 0x0f).rw(FUNC(fidelz80_state::vsc_io_trampoline_r), FUNC(fidelz80_state::vsc_io_trampoline_w));
-}
-
-
-// VBRC
-
-void fidelz80_state::vbrc_main_map(address_map &map)
-{
- map.unmap_value_high();
- map(0x0000, 0x5fff).rom();
- map(0x6000, 0x63ff).mirror(0x1c00).ram();
- map(0xe000, 0xe000).mirror(0x1fff).w(FUNC(fidelz80_state::vbrc_speech_w));
-}
-
-void fidelz80_state::vbrc_main_io(address_map &map)
-{
- map.global_mask(0x01);
- map(0x00, 0x01).rw(m_mcu, FUNC(i8041_device::upi41_master_r), FUNC(i8041_device::upi41_master_w));
-}
-
-
-// DSC
-
-void fidelz80_state::dsc_map(address_map &map)
-{
- map.unmap_value_high();
- map(0x0000, 0x1fff).rom();
- map(0x4000, 0x4000).mirror(0x1fff).w(FUNC(fidelz80_state::dsc_control_w));
- map(0x6000, 0x6000).mirror(0x1fff).w(FUNC(fidelz80_state::dsc_select_w));
- map(0x8000, 0x8000).mirror(0x1fff).r(FUNC(fidelz80_state::dsc_input_r));
- map(0xa000, 0xa3ff).mirror(0x1c00).ram();
-}
-
-
-
-/******************************************************************************
- Input Ports
-******************************************************************************/
-
-// static or boardless games
-
-static INPUT_PORTS_START( vcc_base )
- PORT_START("IN.0")
- PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_UNUSED)
- PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("LV") PORT_CODE(KEYCODE_L)
- PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("A1") PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_CODE(KEYCODE_A)
- PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("E5") PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_CODE(KEYCODE_E)
-
- PORT_START("IN.1")
- PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Speaker") PORT_CODE(KEYCODE_SPACE)
- PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("DM") PORT_CODE(KEYCODE_M)
- PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("B2") PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_CODE(KEYCODE_B)
- PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("F6") PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_CODE(KEYCODE_F)
-
- PORT_START("IN.2")
- PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("CL") PORT_CODE(KEYCODE_DEL)
- PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("PB") PORT_CODE(KEYCODE_P)
- PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("C3") PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_CODE(KEYCODE_C)
- PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("G7") PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_CODE(KEYCODE_G)
-
- PORT_START("IN.3")
- PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("EN") PORT_CODE(KEYCODE_ENTER)
- PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("PV") PORT_CODE(KEYCODE_V)
- PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("D4") PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_CODE(KEYCODE_D)
- PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("H8") PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_CODE(KEYCODE_H)
-
- PORT_START("RESET") // is not on matrix IN.0 d0
- PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("RE") PORT_CODE(KEYCODE_R) PORT_CHANGED_MEMBER(DEVICE_SELF, fidelz80_state, reset_button, nullptr)
-INPUT_PORTS_END
-
-static INPUT_PORTS_START( cc10 )
- PORT_INCLUDE( vcc_base )
-
- PORT_START("IN.4")
- PORT_BIT(0x0f, IP_ACTIVE_HIGH, IPT_UNUSED)
-
- PORT_START("LEVEL") // hardwired (VCC/GND?)
- PORT_CONFNAME( 0x80, 0x00, "Maximum Levels" )
- PORT_CONFSETTING( 0x00, "10" ) // factory setting
- PORT_CONFSETTING( 0x80, "3" )
-INPUT_PORTS_END
-
-static INPUT_PORTS_START( vcc )
- PORT_INCLUDE( vcc_base )
-
- PORT_START("IN.4") // language setting, hardwired with 4 jumpers (0: English, 1: German, 2: French, 4: Spanish, 8:Special(unused))
- PORT_BIT(0x0f, 0x00, IPT_CUSTOM)
-INPUT_PORTS_END
-
-static INPUT_PORTS_START( vccsp )
- PORT_INCLUDE( vcc )
-
- PORT_MODIFY("IN.4") // set to Spanish
- PORT_BIT(0x0f, 0x04, IPT_CUSTOM)
-INPUT_PORTS_END
-
-static INPUT_PORTS_START( vccg )
- PORT_INCLUDE( vcc )
-
- PORT_MODIFY("IN.4") // set to German
- PORT_BIT(0x0f, 0x01, IPT_CUSTOM)
-INPUT_PORTS_END
-
-static INPUT_PORTS_START( vccfr )
- PORT_INCLUDE( vcc )
-
- PORT_MODIFY("IN.4") // set to French
- PORT_BIT(0x0f, 0x02, IPT_CUSTOM)
-INPUT_PORTS_END
-
-
-static INPUT_PORTS_START( bcc )
- PORT_START("IN.0")
- PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("EN") PORT_CODE(KEYCODE_ENTER)
- PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("PV") PORT_CODE(KEYCODE_V)
- PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("D4") PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_CODE(KEYCODE_D)
- PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("H8") PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_CODE(KEYCODE_H)
-
- PORT_START("IN.1")
- PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("CL") PORT_CODE(KEYCODE_DEL)
- PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("PB") PORT_CODE(KEYCODE_P)
- PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("C3") PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_CODE(KEYCODE_C)
- PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("G7") PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_CODE(KEYCODE_G)
-
- PORT_START("IN.2")
- PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("CB") PORT_CODE(KEYCODE_SPACE)
- PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("DM") PORT_CODE(KEYCODE_M)
- PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("B2") PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_CODE(KEYCODE_B)
- PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("F6") PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_CODE(KEYCODE_F)
-
- PORT_START("IN.3")
- PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("RE") PORT_CODE(KEYCODE_R)
- PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("LV") PORT_CODE(KEYCODE_L)
- PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("A1") PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_CODE(KEYCODE_A)
- PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("E5") PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_CODE(KEYCODE_E)
-INPUT_PORTS_END
-
-
-static INPUT_PORTS_START( vbrc )
- PORT_START("IN.0")
- PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_A) PORT_NAME("A")
- PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_0) PORT_NAME("10")
- PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_6) PORT_NAME("6")
- PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_2) PORT_NAME("2")
-
- PORT_START("IN.1")
- PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_K) PORT_NAME("K")
- PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_9) PORT_NAME("9")
- PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_5) PORT_NAME("5")
- PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_1) PORT_NAME("1")
-
- PORT_START("IN.2")
- PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_Q) PORT_NAME("Q")
- PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_8) PORT_NAME("8")
- PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_4) PORT_NAME("4")
- PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_Z) PORT_NAME("P")
-
- PORT_START("IN.3")
- PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_J) PORT_NAME("J")
- PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_7) PORT_NAME("7")
- PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_3) PORT_NAME("3")
- PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_N) PORT_NAME("NT")
-
- PORT_START("IN.4")
- PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_E) PORT_NAME("EN")
- PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_S) PORT_NAME("SC")
- PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_X) PORT_NAME("PL")
- PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("Spades")
-
- PORT_START("IN.5")
- PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_C) PORT_NAME("CL")
- PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_D) PORT_NAME("DB")
- PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_V) PORT_NAME("VL")
- PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("Hearts")
-
- PORT_START("IN.6")
- PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_SPACE) PORT_NAME("Speaker")
- PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_B) PORT_NAME("PB")
- PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_G) PORT_NAME("CV")
- PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("Diamonds")
-
- PORT_START("IN.7")
- PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_UNUSED)
- PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_T) PORT_NAME("BR")
- PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_L) PORT_NAME("DL")
- PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("Clubs")
-
- PORT_START("RESET") // is not on matrix IN.7 d0
- PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_R) PORT_CHANGED_MEMBER(DEVICE_SELF, fidelz80_state, reset_button, nullptr) PORT_NAME("RE")
-INPUT_PORTS_END
-
-
-// sensory board games
-
-INPUT_PORTS_START( fidel_cb_buttons )
- PORT_START("IN.0")
- PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
- PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
- PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
- PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
- PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
- PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
- PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
- PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
-
- PORT_START("IN.1")
- PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
- PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
- PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
- PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
- PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
- PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
- PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
- PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
-
- PORT_START("IN.2")
- PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
- PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
- PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
- PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
- PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
- PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
- PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
- PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
-
- PORT_START("IN.3")
- PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
- PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
- PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
- PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
- PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
- PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
- PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
- PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
-
- PORT_START("IN.4")
- PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
- PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
- PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
- PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
- PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
- PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
- PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
- PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
-
- PORT_START("IN.5")
- PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
- PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
- PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
- PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
- PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
- PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
- PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
- PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
-
- PORT_START("IN.6")
- PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
- PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
- PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
- PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
- PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
- PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
- PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
- PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
-
- PORT_START("IN.7")
- PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
- PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
- PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
- PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
- PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
- PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
- PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
- PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
-INPUT_PORTS_END
-
-INPUT_PORTS_START( fidel_cb_magnets )
- PORT_START("IN.0")
- PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
- PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
- PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
- PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
- PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
- PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
- PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
- PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
-
- PORT_START("IN.1")
- PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
- PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
- PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
- PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
- PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
- PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
- PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
- PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
-
- PORT_START("IN.2")
- PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
- PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
- PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
- PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
- PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
- PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
- PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
- PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
-
- PORT_START("IN.3")
- PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
- PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
- PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
- PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
- PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
- PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
- PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
- PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
-
- PORT_START("IN.4")
- PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
- PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
- PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
- PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
- PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
- PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
- PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
- PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
-
- PORT_START("IN.5")
- PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
- PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
- PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
- PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
- PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
- PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
- PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
- PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
-
- PORT_START("IN.6")
- PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
- PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
- PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
- PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
- PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
- PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
- PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
- PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
-
- PORT_START("IN.7")
- PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
- PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
- PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
- PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
- PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
- PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
- PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
- PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
-INPUT_PORTS_END
-
-
-static INPUT_PORTS_START( scc )
- PORT_INCLUDE( fidel_cb_buttons )
-
- PORT_START("IN.8")
- PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("Pawn")
- PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("Rook")
- PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("Knight")
- PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("Bishop")
- PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("Queen")
- PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("King")
- PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_DEL) PORT_NAME("CL")
- PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_R) PORT_NAME("RE")
-INPUT_PORTS_END
-
-
-static INPUT_PORTS_START( vsc )
- PORT_INCLUDE( scc )
-
- PORT_START("IN.9")
- PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_T) PORT_NAME("TM")
- PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_V) PORT_NAME("RV")
- PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_SPACE) PORT_NAME("Speaker")
- PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_L) PORT_NAME("LV")
- PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_M) PORT_NAME("DM")
- PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_S) PORT_NAME("ST")
- PORT_BIT(0xc0, IP_ACTIVE_HIGH, IPT_UNUSED)
-
- PORT_START("IN.10") // language setting, hardwired with 2 diodes (0: English, 1: German, 2: French, 3: Spanish)
- PORT_BIT(0x03, 0x00, IPT_CUSTOM)
-INPUT_PORTS_END
-
-static INPUT_PORTS_START( vscsp )
- PORT_INCLUDE( vsc )
-
- PORT_MODIFY("IN.10") // set to Spanish
- PORT_BIT(0x03, 0x03, IPT_CUSTOM)
-INPUT_PORTS_END
-
-static INPUT_PORTS_START( vscg )
- PORT_INCLUDE( vsc )
-
- PORT_MODIFY("IN.10") // set to German
- PORT_BIT(0x03, 0x01, IPT_CUSTOM)
-INPUT_PORTS_END
-
-static INPUT_PORTS_START( vscfr )
- PORT_INCLUDE( vsc )
-
- PORT_MODIFY("IN.10") // set to French
- PORT_BIT(0x03, 0x02, IPT_CUSTOM)
-INPUT_PORTS_END
-
-
-static INPUT_PORTS_START( dsc )
- PORT_INCLUDE( fidel_cb_buttons )
-
- PORT_MODIFY("IN.4")
- PORT_BIT(0x8f, IP_ACTIVE_HIGH, IPT_UNUSED)
-
- PORT_MODIFY("IN.6")
- PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("Black King")
-
- PORT_MODIFY("IN.7")
- PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("Black")
- PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("White King")
- PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("White")
- PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("RV")
- PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) PORT_NAME("RE")
- PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("PB")
- PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("LV")
- PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("CL")
-INPUT_PORTS_END
-
-
-
-/******************************************************************************
- Machine Drivers
-******************************************************************************/
-
-void fidelz80_state::bcc(machine_config &config)
-{
- /* basic machine hardware */
- Z80(config, m_maincpu, 3.579545_MHz_XTAL);
- m_maincpu->set_addrmap(AS_PROGRAM, &fidelz80_state::bcc_map);
- m_maincpu->set_addrmap(AS_IO, &fidelz80_state::bcc_io);
-
- TIMER(config, "display_decay").configure_periodic(FUNC(fidelbase_state::display_decay_tick), attotime::from_msec(1));
- config.set_default_layout(layout_fidel_bcc);
-
- /* sound hardware */
- SPEAKER(config, "speaker").front_center();
- DAC_1BIT(config, m_dac, 0).add_route(ALL_OUTPUTS, "speaker", 0.25);
- voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref", 0));
- vref.set_output(5.0);
- vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT);
-}
-
-void fidelz80_state::scc(machine_config &config)
-{
- /* basic machine hardware */
- Z80(config, m_maincpu, 3.9_MHz_XTAL);
- m_maincpu->set_addrmap(AS_PROGRAM, &fidelz80_state::scc_map);
- m_maincpu->set_addrmap(AS_IO, &fidelz80_state::scc_io);
-
- TIMER(config, "display_decay").configure_periodic(FUNC(fidelbase_state::display_decay_tick), attotime::from_msec(1));
- config.set_default_layout(layout_fidel_sc8);
-
- /* sound hardware */
- SPEAKER(config, "speaker").front_center();
- DAC_1BIT(config, m_dac, 0).add_route(ALL_OUTPUTS, "speaker", 0.25);
- voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref", 0));
- vref.set_output(5.0);
- vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT);
-}
-
-void fidelz80_state::cc10(machine_config &config)
-{
- /* basic machine hardware */
- Z80(config, m_maincpu, 4_MHz_XTAL);
- m_maincpu->set_addrmap(AS_PROGRAM, &fidelz80_state::cc10_map);
- m_maincpu->set_addrmap(AS_IO, &fidelz80_state::vcc_io);
-
- I8255(config, m_ppi8255);
- m_ppi8255->out_pa_callback().set(FUNC(fidelz80_state::cc10_ppi_porta_w));
- m_ppi8255->tri_pa_callback().set_constant(0);
- m_ppi8255->in_pb_callback().set_ioport("LEVEL");
- m_ppi8255->out_pb_callback().set(FUNC(fidelz80_state::vcc_ppi_portb_w));
- m_ppi8255->in_pc_callback().set(FUNC(fidelz80_state::vcc_ppi_portc_r));
- m_ppi8255->tri_pb_callback().set_constant(0);
- m_ppi8255->out_pc_callback().set(FUNC(fidelz80_state::vcc_ppi_portc_w));
-
- TIMER(config, "display_decay").configure_periodic(FUNC(fidelbase_state::display_decay_tick), attotime::from_msec(1));
- config.set_default_layout(layout_fidel_cc);
-
- /* sound hardware */
- SPEAKER(config, "speaker").front_center();
- BEEP(config, m_beeper, 1360); // approximation, from 556 timer ic
- m_beeper->add_route(ALL_OUTPUTS, "speaker", 0.25);
- TIMER(config, "beeper_off").configure_generic(FUNC(fidelz80_state::beeper_off_callback));
-}
-
-void fidelz80_state::vcc(machine_config &config)
-{
- /* basic machine hardware */
- Z80(config, m_maincpu, 4_MHz_XTAL);
- m_maincpu->set_addrmap(AS_PROGRAM, &fidelz80_state::vcc_map);
- m_maincpu->set_addrmap(AS_IO, &fidelz80_state::vcc_io);
-
- I8255(config, m_ppi8255);
- m_ppi8255->out_pa_callback().set(FUNC(fidelz80_state::vcc_ppi_porta_w));
- m_ppi8255->tri_pa_callback().set_constant(0);
- m_ppi8255->in_pb_callback().set(FUNC(fidelz80_state::vcc_ppi_portb_r));
- m_ppi8255->out_pb_callback().set(FUNC(fidelz80_state::vcc_ppi_portb_w));
- m_ppi8255->tri_pb_callback().set_constant(0);
- m_ppi8255->in_pc_callback().set(FUNC(fidelz80_state::vcc_ppi_portc_r));
- m_ppi8255->out_pc_callback().set(FUNC(fidelz80_state::vcc_ppi_portc_w));
-
- TIMER(config, "display_decay").configure_periodic(FUNC(fidelbase_state::display_decay_tick), attotime::from_msec(1));
- config.set_default_layout(layout_fidel_vcc);
-
- MCFG_MACHINE_START_OVERRIDE(fidelz80_state,vcc)
-
- /* sound hardware */
- SPEAKER(config, "speaker").front_center();
- S14001A(config, m_speech, 25000); // R/C circuit, around 25khz
- m_speech->ext_read().set(FUNC(fidelz80_state::vcc_speech_r));
- m_speech->add_route(ALL_OUTPUTS, "speaker", 0.75);
-}
-
-void fidelz80_state::vsc(machine_config &config)
-{
- /* basic machine hardware */
- Z80(config, m_maincpu, 3.9_MHz_XTAL); // 3.9MHz resonator
- m_maincpu->set_addrmap(AS_PROGRAM, &fidelz80_state::vsc_map);
- m_maincpu->set_addrmap(AS_IO, &fidelz80_state::vsc_io);
- m_maincpu->set_periodic_int(FUNC(fidelz80_state::nmi_line_pulse), attotime::from_hz(587)); // 555 timer, measured
-
- I8255(config, m_ppi8255);
- m_ppi8255->out_pa_callback().set(FUNC(fidelz80_state::vsc_ppi_porta_w));
- m_ppi8255->out_pb_callback().set(FUNC(fidelz80_state::vsc_ppi_portb_w));
- m_ppi8255->out_pc_callback().set(FUNC(fidelz80_state::vsc_ppi_portc_w));
-
- Z80PIO(config, m_z80pio, 3.9_MHz_XTAL);
- m_z80pio->in_pa_callback().set(FUNC(fidelz80_state::vsc_pio_porta_r));
- m_z80pio->in_pb_callback().set(FUNC(fidelz80_state::vsc_pio_portb_r));
- m_z80pio->out_pb_callback().set(FUNC(fidelz80_state::vsc_pio_portb_w));
-
- TIMER(config, "display_decay").configure_periodic(FUNC(fidelbase_state::display_decay_tick), attotime::from_msec(1));
- config.set_default_layout(layout_fidel_vsc);
-
- /* sound hardware */
- SPEAKER(config, "speaker").front_center();
- S14001A(config, m_speech, 25000); // R/C circuit, around 25khz
- m_speech->ext_read().set(FUNC(fidelz80_state::vcc_speech_r));
- m_speech->add_route(ALL_OUTPUTS, "speaker", 0.75);
-}
-
-void fidelz80_state::vbrc(machine_config &config)
-{
- /* basic machine hardware */
- Z80(config, m_maincpu, 5_MHz_XTAL/2);
- m_maincpu->set_addrmap(AS_PROGRAM, &fidelz80_state::vbrc_main_map);
- m_maincpu->set_addrmap(AS_IO, &fidelz80_state::vbrc_main_io);
- config.m_perfect_cpu_quantum = subtag("maincpu");
-
- I8041(config, m_mcu, 5_MHz_XTAL);
- m_mcu->p1_out_cb().set(FUNC(fidelz80_state::vbrc_mcu_p1_w));
- m_mcu->p2_in_cb().set(FUNC(fidelz80_state::vbrc_mcu_p2_r));
- m_mcu->p2_out_cb().set(m_i8243, FUNC(i8243_device::p2_w));
- m_mcu->prog_out_cb().set(m_i8243, FUNC(i8243_device::prog_w));
- m_mcu->t0_in_cb().set(FUNC(fidelz80_state::vbrc_mcu_t0_r));
- m_mcu->t1_in_cb().set(FUNC(fidelz80_state::vbrc_mcu_t1_r));
-
- I8243(config, m_i8243);
- m_i8243->p4_out_cb().set(FUNC(fidelz80_state::vbrc_ioexp_port_w<0>));
- m_i8243->p5_out_cb().set(FUNC(fidelz80_state::vbrc_ioexp_port_w<1>));
- m_i8243->p6_out_cb().set(FUNC(fidelz80_state::vbrc_ioexp_port_w<2>));
- m_i8243->p7_out_cb().set(FUNC(fidelz80_state::vbrc_ioexp_port_w<3>));
-
- TIMER(config, "display_decay").configure_periodic(FUNC(fidelbase_state::display_decay_tick), attotime::from_msec(1));
- config.set_default_layout(layout_fidel_vbrc);
-
- /* sound hardware */
- SPEAKER(config, "speaker").front_center();
- S14001A(config, m_speech, 25000); // R/C circuit, around 25khz
- m_speech->bsy().set_inputline("maincpu", Z80_INPUT_LINE_WAIT);
- m_speech->add_route(ALL_OUTPUTS, "speaker", 0.75);
-}
-
-void fidelz80_state::dsc(machine_config &config)
-{
- /* basic machine hardware */
- Z80(config, m_maincpu, 3.9_MHz_XTAL); // 3.9MHz resonator
- m_maincpu->set_addrmap(AS_PROGRAM, &fidelz80_state::dsc_map);
- TIMER(config, m_irq_on).configure_periodic(FUNC(fidelz80_state::irq_on), attotime::from_hz(523)); // from 555 timer (22nF, 120K, 2.7K)
- m_irq_on->set_start_delay(attotime::from_hz(523) - attotime::from_usec(41)); // active for 41us
- TIMER(config, "irq_off").configure_periodic(FUNC(fidelz80_state::irq_off), attotime::from_hz(523));
-
- TIMER(config, "display_decay").configure_periodic(FUNC(fidelbase_state::display_decay_tick), attotime::from_msec(1));
- config.set_default_layout(layout_fidel_dsc);
-
- /* sound hardware */
- SPEAKER(config, "speaker").front_center();
- DAC_1BIT(config, m_dac, 0).add_route(ALL_OUTPUTS, "speaker", 0.25);
- voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref", 0));
- vref.set_output(5.0);
- vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT);
-}
-
-
-
-/******************************************************************************
- ROM Definitions
-******************************************************************************/
-
-ROM_START( cc10 )
- ROM_REGION( 0x10000, "maincpu", 0 )
- ROM_LOAD( "cc10b", 0x0000, 0x1000, CRC(afd3ca99) SHA1(870d09b2b52ccb8572d69642c59b5215d5fb26ab) ) // 2332
-ROM_END
-
-
-ROM_START( cc7 ) // model BCC
- ROM_REGION( 0x10000, "maincpu", 0 )
- ROM_LOAD( "cn19103n_bcc-revb", 0x0000, 0x1000, CRC(a397d471) SHA1(9b12bc442fccee40f4d8500c792bc9d886c5e1a5) ) // 2332
-ROM_END
-
-
-ROM_START( fscc8 ) // model SCC, PCB label 510-1011 REV.2
- ROM_REGION( 0x10000, "maincpu", 0 )
- ROM_LOAD( "101-32017", 0x0000, 0x1000, CRC(5340820d) SHA1(e3494c7624b3cacbbb9a0a8cc9e1ed3e00326dfd) ) // 2732
-ROM_END
-
-
-ROM_START( vcc )
- ROM_REGION( 0x10000, "maincpu", 0 )
- ROM_LOAD("101-32103.bin", 0x0000, 0x1000, CRC(257bb5ab) SHA1(f7589225bb8e5f3eac55f23e2bd526be780b38b5) ) // 32014.VCC??? at location b3?
- ROM_LOAD("vcc2.bin", 0x1000, 0x1000, CRC(f33095e7) SHA1(692fcab1b88c910b74d04fe4d0660367aee3f4f0) ) // at location a2?
- ROM_LOAD("vcc3.bin", 0x2000, 0x1000, CRC(624f0cd5) SHA1(7c1a4f4497fe5882904de1d6fecf510c07ee6fc6) ) // at location a1?
-
- ROM_REGION( 0x2000, "speech", 0 )
- ROM_LOAD("101-32107", 0x0000, 0x1000, CRC(f35784f9) SHA1(348e54a7fa1e8091f89ac656b4da22f28ca2e44d) ) // at location c4?
- ROM_RELOAD( 0x1000, 0x1000)
-ROM_END
-
-ROM_START( vccsp )
- ROM_REGION( 0x10000, "maincpu", 0 )
- ROM_LOAD("101-32103.bin", 0x0000, 0x1000, CRC(257bb5ab) SHA1(f7589225bb8e5f3eac55f23e2bd526be780b38b5) )
- ROM_LOAD("vcc2.bin", 0x1000, 0x1000, CRC(f33095e7) SHA1(692fcab1b88c910b74d04fe4d0660367aee3f4f0) )
- ROM_LOAD("vcc3.bin", 0x2000, 0x1000, CRC(624f0cd5) SHA1(7c1a4f4497fe5882904de1d6fecf510c07ee6fc6) )
-
- ROM_REGION( 0x2000, "speech", 0 )
- ROM_LOAD("101-64106", 0x0000, 0x2000, CRC(8766e128) SHA1(78c7413bf240159720b131ab70bfbdf4e86eb1e9) ) // dumped from Spanish VCC, is same as data in fexcelv
-ROM_END
-
-ROM_START( vccg )
- ROM_REGION( 0x10000, "maincpu", 0 )
- ROM_LOAD("101-32103.bin", 0x0000, 0x1000, CRC(257bb5ab) SHA1(f7589225bb8e5f3eac55f23e2bd526be780b38b5) )
- ROM_LOAD("vcc2.bin", 0x1000, 0x1000, CRC(f33095e7) SHA1(692fcab1b88c910b74d04fe4d0660367aee3f4f0) )
- ROM_LOAD("vcc3.bin", 0x2000, 0x1000, CRC(624f0cd5) SHA1(7c1a4f4497fe5882904de1d6fecf510c07ee6fc6) )
-
- ROM_REGION( 0x2000, "speech", 0 )
- ROM_LOAD("101-64101", 0x0000, 0x2000, BAD_DUMP CRC(6c85e310) SHA1(20d1d6543c1e6a1f04184a2df2a468f33faec3ff) ) // taken from fexcelv, assume correct
-ROM_END
-
-ROM_START( vccfr )
- ROM_REGION( 0x10000, "maincpu", 0 )
- ROM_LOAD("101-32103.bin", 0x0000, 0x1000, CRC(257bb5ab) SHA1(f7589225bb8e5f3eac55f23e2bd526be780b38b5) )
- ROM_LOAD("vcc2.bin", 0x1000, 0x1000, CRC(f33095e7) SHA1(692fcab1b88c910b74d04fe4d0660367aee3f4f0) )
- ROM_LOAD("vcc3.bin", 0x2000, 0x1000, CRC(624f0cd5) SHA1(7c1a4f4497fe5882904de1d6fecf510c07ee6fc6) )
-
- ROM_REGION( 0x2000, "speech", 0 )
- ROM_LOAD("101-64105", 0x0000, 0x2000, BAD_DUMP CRC(fe8c5c18) SHA1(2b64279ab3747ee81c86963c13e78321c6cfa3a3) ) // taken from fexcelv, assume correct
-ROM_END
-
-
-ROM_START( uvc )
- ROM_REGION( 0x10000, "maincpu", 0 )
- ROM_LOAD("101-64017.b3", 0x0000, 0x2000, CRC(f1133abf) SHA1(09dd85051c4e7d364d43507c1cfea5c2d08d37f4) ) // "MOS // 101-64017 // 3880"
- ROM_LOAD("101-32010.a1", 0x2000, 0x1000, CRC(624f0cd5) SHA1(7c1a4f4497fe5882904de1d6fecf510c07ee6fc6) ) // "NEC P9Z021 // D2332C 228 // 101-32010", == vcc3.bin on vcc
-
- ROM_REGION( 0x2000, "speech", 0 )
- ROM_LOAD("101-32107.c4", 0x0000, 0x1000, CRC(f35784f9) SHA1(348e54a7fa1e8091f89ac656b4da22f28ca2e44d) ) // "NEC P9Y019 // D2332C 229 // 101-32107", == 101-32107 on vcc
- ROM_RELOAD( 0x1000, 0x1000)
-ROM_END
-
-ROM_START( uvcsp )
- ROM_REGION( 0x10000, "maincpu", 0 )
- ROM_LOAD("101-64017.b3", 0x0000, 0x2000, CRC(f1133abf) SHA1(09dd85051c4e7d364d43507c1cfea5c2d08d37f4) )
- ROM_LOAD("101-32010.a1", 0x2000, 0x1000, CRC(624f0cd5) SHA1(7c1a4f4497fe5882904de1d6fecf510c07ee6fc6) )
-
- ROM_REGION( 0x2000, "speech", 0 )
- ROM_LOAD("101-64106", 0x0000, 0x2000, CRC(8766e128) SHA1(78c7413bf240159720b131ab70bfbdf4e86eb1e9) )
-ROM_END
-
-ROM_START( uvcg )
- ROM_REGION( 0x10000, "maincpu", 0 )
- ROM_LOAD("101-64017.b3", 0x0000, 0x2000, CRC(f1133abf) SHA1(09dd85051c4e7d364d43507c1cfea5c2d08d37f4) )
- ROM_LOAD("101-32010.a1", 0x2000, 0x1000, CRC(624f0cd5) SHA1(7c1a4f4497fe5882904de1d6fecf510c07ee6fc6) )
-
- ROM_REGION( 0x2000, "speech", 0 )
- ROM_LOAD("101-64101", 0x0000, 0x2000, BAD_DUMP CRC(6c85e310) SHA1(20d1d6543c1e6a1f04184a2df2a468f33faec3ff) ) // taken from fexcelv, assume correct
-ROM_END
-
-ROM_START( uvcfr )
- ROM_REGION( 0x10000, "maincpu", 0 )
- ROM_LOAD("101-64017.b3", 0x0000, 0x2000, CRC(f1133abf) SHA1(09dd85051c4e7d364d43507c1cfea5c2d08d37f4) )
- ROM_LOAD("101-32010.a1", 0x2000, 0x1000, CRC(624f0cd5) SHA1(7c1a4f4497fe5882904de1d6fecf510c07ee6fc6) )
-
- ROM_REGION( 0x2000, "speech", 0 )
- ROM_LOAD("101-64105", 0x0000, 0x2000, BAD_DUMP CRC(fe8c5c18) SHA1(2b64279ab3747ee81c86963c13e78321c6cfa3a3) ) // taken from fexcelv, assume correct
-ROM_END
-
-
-ROM_START( vsc )
- ROM_REGION( 0x10000, "maincpu", 0 )
- ROM_LOAD("101-64108.bin", 0x0000, 0x2000, CRC(c9c98490) SHA1(e6db883df088d60463e75db51433a4b01a3e7626) )
- ROM_LOAD("101-64109.bin", 0x2000, 0x2000, CRC(08a3577c) SHA1(69fe379d21a9d4b57c84c3832d7b3e7431eec341) )
- ROM_LOAD("101-32024.bin", 0x4000, 0x1000, CRC(2a078676) SHA1(db2f0aba7e8ac0f84a17bae7155210cdf0813afb) )
-
- ROM_REGION( 0x2000, "speech", 0 )
- ROM_LOAD("101-32107.bin", 0x0000, 0x1000, CRC(f35784f9) SHA1(348e54a7fa1e8091f89ac656b4da22f28ca2e44d) )
- ROM_RELOAD( 0x1000, 0x1000)
-ROM_END
-
-ROM_START( vscsp )
- ROM_REGION( 0x10000, "maincpu", 0 )
- ROM_LOAD("101-64108.bin", 0x0000, 0x2000, CRC(c9c98490) SHA1(e6db883df088d60463e75db51433a4b01a3e7626) )
- ROM_LOAD("101-64109.bin", 0x2000, 0x2000, CRC(08a3577c) SHA1(69fe379d21a9d4b57c84c3832d7b3e7431eec341) )
- ROM_LOAD("101-32024.bin", 0x4000, 0x1000, CRC(2a078676) SHA1(db2f0aba7e8ac0f84a17bae7155210cdf0813afb) )
-
- ROM_REGION( 0x2000, "speech", 0 )
- ROM_LOAD("101-64106", 0x0000, 0x2000, BAD_DUMP CRC(8766e128) SHA1(78c7413bf240159720b131ab70bfbdf4e86eb1e9) ) // taken from vcc/fexcelv, assume correct
-ROM_END
-
-ROM_START( vscg )
- ROM_REGION( 0x10000, "maincpu", 0 )
- ROM_LOAD("101-64108.bin", 0x0000, 0x2000, CRC(c9c98490) SHA1(e6db883df088d60463e75db51433a4b01a3e7626) )
- ROM_LOAD("101-64109.bin", 0x2000, 0x2000, CRC(08a3577c) SHA1(69fe379d21a9d4b57c84c3832d7b3e7431eec341) )
- ROM_LOAD("101-32024.bin", 0x4000, 0x1000, CRC(2a078676) SHA1(db2f0aba7e8ac0f84a17bae7155210cdf0813afb) )
-
- ROM_REGION( 0x2000, "speech", 0 )
- ROM_LOAD("101-64101", 0x0000, 0x2000, BAD_DUMP CRC(6c85e310) SHA1(20d1d6543c1e6a1f04184a2df2a468f33faec3ff) ) // taken from fexcelv, assume correct
-ROM_END
-
-ROM_START( vscfr )
- ROM_REGION( 0x10000, "maincpu", 0 )
- ROM_LOAD("101-64108.bin", 0x0000, 0x2000, CRC(c9c98490) SHA1(e6db883df088d60463e75db51433a4b01a3e7626) )
- ROM_LOAD("101-64109.bin", 0x2000, 0x2000, CRC(08a3577c) SHA1(69fe379d21a9d4b57c84c3832d7b3e7431eec341) )
- ROM_LOAD("101-32024.bin", 0x4000, 0x1000, CRC(2a078676) SHA1(db2f0aba7e8ac0f84a17bae7155210cdf0813afb) )
-
- ROM_REGION( 0x2000, "speech", 0 )
- ROM_LOAD("101-64105", 0x0000, 0x2000, BAD_DUMP CRC(fe8c5c18) SHA1(2b64279ab3747ee81c86963c13e78321c6cfa3a3) ) // taken from fexcelv, assume correct
-ROM_END
-
-
-ROM_START( vbrc ) // AKA model 7002
- ROM_REGION( 0x10000, "maincpu", 0 )
- // nec 2364 mask roms; pin 27 (PGM, probably NC here due to mask roms) goes to the pcb
- ROM_LOAD("101-64108.g3", 0x0000, 0x2000, CRC(08472223) SHA1(859865b13c908dbb474333263dc60f6a32461141) )
- ROM_LOAD("101-64109.f3", 0x2000, 0x2000, CRC(320afa0f) SHA1(90edfe0ac19b108d232cda376b03a3a24befad4c) )
- ROM_LOAD("101-64110.e3", 0x4000, 0x2000, CRC(3040d0bd) SHA1(caa55fc8d9196e408fb41e7171a68e5099519813) )
-
- ROM_REGION( 0x0400, "mcu", 0 )
- ROM_LOAD("100-1009.a3", 0x0000, 0x0400, CRC(60eb343f) SHA1(8a63e95ebd62e123bdecc330c0484a47c354bd1a) )
-
- ROM_REGION( 0x1000, "speech", 0 )
- ROM_LOAD("101-32118.i2", 0x0000, 0x1000, CRC(a0b8bb8f) SHA1(f56852108928d5c6caccfc8166fa347d6760a740) )
-ROM_END
-
-ROM_START( bridgec3 ) // 510-1016 Rev.1 PCB has neither locations nor ic labels, so I declare the big heatsink is at C1, numbers count on the shorter length of pcb
- ROM_REGION( 0x10000, "maincpu", 0 )
- // TMM2764AD-20 EPROMS with tiny hole-punch sized colored stickers (mostly) covering the quartz windows. pin 27 (PGM) is tied to vcc with small rework wires and does not connect to pcb.
- ROM_LOAD("7014_white.g3", 0x0000, 0x2000, CRC(eb1620ef) SHA1(987a9abc8c685f1a68678ea4ee65ec4a99419179) ) // white sticker
- ROM_LOAD("7014_red.f3", 0x2000, 0x2000, CRC(74af0019) SHA1(8dc05950c254ca050b95b93e5d0cf48f913a6d49) ) // red sticker
- ROM_LOAD("7014_blue.e3", 0x4000, 0x2000, CRC(341d9ca6) SHA1(370876573bb9408e75f4fc797304b6c64af0590a) ) // blue sticker
-
- ROM_REGION( 0x0400, "mcu", 0 )
- ROM_LOAD("100-1009.a3", 0x0000, 0x0400, CRC(60eb343f) SHA1(8a63e95ebd62e123bdecc330c0484a47c354bd1a) ) // "NEC P07021-027 || D8041C 563 100-1009"
-
- ROM_REGION( 0x1000, "speech", 0 )
- ROM_LOAD("101-32118.i2", 0x0000, 0x1000, CRC(a0b8bb8f) SHA1(f56852108928d5c6caccfc8166fa347d6760a740) ) // "ea 101-32118 || (C) 1980 || EA 8332A247-4 || 8034"
-ROM_END
-
-
-ROM_START( damesc ) // model DSC, PCB label 510-1030A01
- ROM_REGION( 0x10000, "maincpu", 0 )
- ROM_LOAD( "101-1027a01", 0x0000, 0x2000, CRC(d86c985c) SHA1(20f923a24420050fd16e1172f5e889f144d17ac9) ) // MOS 2364
-ROM_END
-
-
-
-/******************************************************************************
- Drivers
-******************************************************************************/
-
-// YEAR NAME PARENT CMP MACHINE INPUT CLASS INIT COMPANY FULLNAME, FLAGS
-CONS( 1978, cc10, 0, 0, cc10, cc10, fidelz80_state, empty_init, "Fidelity Electronics", "Chess Challenger 10 (rev. B)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK )
-CONS( 1979, cc7, 0, 0, bcc, bcc, fidelz80_state, empty_init, "Fidelity Electronics", "Chess Challenger 7 (rev. B)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK )
-
-CONS( 1980, fscc8, 0, 0, scc, scc, fidelz80_state, empty_init, "Fidelity Electronics", "Sensory Chess Challenger 8", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
-
-CONS( 1979, vcc, 0, 0, vcc, vcc, fidelz80_state, empty_init, "Fidelity Electronics", "Voice Chess Challenger (English)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK )
-CONS( 1979, vccsp, vcc, 0, vcc, vccsp, fidelz80_state, empty_init, "Fidelity Electronics", "Voice Chess Challenger (Spanish)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK )
-CONS( 1979, vccg, vcc, 0, vcc, vccg, fidelz80_state, empty_init, "Fidelity Electronics", "Voice Chess Challenger (German)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK )
-CONS( 1979, vccfr, vcc, 0, vcc, vccfr, fidelz80_state, empty_init, "Fidelity Electronics", "Voice Chess Challenger (French)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK )
-
-CONS( 1980, uvc, vcc, 0, vcc, vcc, fidelz80_state, empty_init, "Fidelity Electronics", "Advanced Voice Chess Challenger (English)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK )
-CONS( 1980, uvcsp, vcc, 0, vcc, vccsp, fidelz80_state, empty_init, "Fidelity Electronics", "Advanced Voice Chess Challenger (Spanish)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK )
-CONS( 1980, uvcg, vcc, 0, vcc, vccg, fidelz80_state, empty_init, "Fidelity Electronics", "Advanced Voice Chess Challenger (German)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK )
-CONS( 1980, uvcfr, vcc, 0, vcc, vccfr, fidelz80_state, empty_init, "Fidelity Electronics", "Advanced Voice Chess Challenger (French)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK )
-
-CONS( 1980, vsc, 0, 0, vsc, vsc, fidelz80_state, empty_init, "Fidelity Electronics", "Voice Sensory Chess Challenger (English)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
-CONS( 1980, vscsp, vsc, 0, vsc, vscsp, fidelz80_state, empty_init, "Fidelity Electronics", "Voice Sensory Chess Challenger (Spanish)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
-CONS( 1980, vscg, vsc, 0, vsc, vscg, fidelz80_state, empty_init, "Fidelity Electronics", "Voice Sensory Chess Challenger (German)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
-CONS( 1980, vscfr, vsc, 0, vsc, vscfr, fidelz80_state, empty_init, "Fidelity Electronics", "Voice Sensory Chess Challenger (French)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
-
-CONS( 1979, vbrc, 0, 0, vbrc, vbrc, fidelz80_state, empty_init, "Fidelity Electronics", "Voice Bridge Challenger", MACHINE_SUPPORTS_SAVE | MACHINE_NOT_WORKING )
-CONS( 1980, bridgec3, vbrc, 0, vbrc, vbrc, fidelz80_state, empty_init, "Fidelity Electronics", "Bridge Challenger III", MACHINE_SUPPORTS_SAVE | MACHINE_NOT_WORKING )
-
-CONS( 1981, damesc, 0, 0, dsc, dsc, fidelz80_state, empty_init, "Fidelity Electronics", "Dame Sensory Challenger", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
diff --git a/src/mame/drivers/finalizr.cpp b/src/mame/drivers/finalizr.cpp
index e4a2e9b6fbb..1f4a85cc9e8 100644
--- a/src/mame/drivers/finalizr.cpp
+++ b/src/mame/drivers/finalizr.cpp
@@ -117,7 +117,7 @@ void finalizr_state::main_map(address_map &map)
map(0x0813, 0x0813).portr("DSW1");
map(0x0818, 0x0818).w("watchdog", FUNC(watchdog_timer_device::reset_w));
map(0x0819, 0x0819).w(FUNC(finalizr_state::finalizr_coin_w));
- map(0x081a, 0x081a).w("snsnd", FUNC(sn76489a_device::command_w)); /* This address triggers the SN chip to read the data port. */
+ map(0x081a, 0x081a).w("snsnd", FUNC(sn76489a_device::write)); /* This address triggers the SN chip to read the data port. */
map(0x081b, 0x081b).nopw(); /* Loads the snd command into the snd latch */
map(0x081c, 0x081c).w(FUNC(finalizr_state::finalizr_i8039_irq_w)); /* custom sound chip */
map(0x081d, 0x081d).w("soundlatch", FUNC(generic_latch_8_device::write)); /* custom sound chip */
@@ -195,7 +195,7 @@ static INPUT_PORTS_START( finalizr )
PORT_BIT( 0xf0, IP_ACTIVE_LOW, IPT_UNKNOWN )
INPUT_PORTS_END
-static INPUT_PORTS_START( finalizrb )
+static INPUT_PORTS_START( finalizra )
PORT_INCLUDE( finalizr )
PORT_MODIFY("DSW2")
@@ -262,12 +262,12 @@ void finalizr_state::machine_reset()
m_irq_enable = 0;
}
-MACHINE_CONFIG_START(finalizr_state::finalizr)
-
+void finalizr_state::finalizr(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", KONAMI1, XTAL(18'432'000)/6) /* ??? */
- MCFG_DEVICE_PROGRAM_MAP(main_map)
- MCFG_TIMER_DRIVER_ADD_SCANLINE("scantimer", finalizr_state, finalizr_scanline, "screen", 0, 1)
+ KONAMI1(config, m_maincpu, XTAL(18'432'000)/6); /* ??? */
+ m_maincpu->set_addrmap(AS_PROGRAM, &finalizr_state::main_map);
+ TIMER(config, "scantimer").configure_scanline(FUNC(finalizr_state::finalizr_scanline), "screen", 0, 1);
I8039(config, m_audiocpu, XTAL(18'432'000)/2); /* 9.216MHz clkin ?? */
m_audiocpu->set_addrmap(AS_PROGRAM, &finalizr_state::sound_map);
@@ -279,13 +279,13 @@ MACHINE_CONFIG_START(finalizr_state::finalizr)
WATCHDOG_TIMER(config, "watchdog");
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */)
- MCFG_SCREEN_SIZE(36*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(1*8, 35*8-1, 2*8, 30*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(finalizr_state, screen_update_finalizr)
- MCFG_SCREEN_PALETTE(m_palette)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500) /* not accurate */);
+ screen.set_size(36*8, 32*8);
+ screen.set_visarea(1*8, 35*8-1, 2*8, 30*8-1);
+ screen.set_screen_update(FUNC(finalizr_state::screen_update_finalizr));
+ screen.set_palette(m_palette);
GFXDECODE(config, m_gfxdecode, m_palette, gfx_finalizr);
PALETTE(config, m_palette, FUNC(finalizr_state::finalizr_palette), 2*16*16, 32);
@@ -295,13 +295,13 @@ MACHINE_CONFIG_START(finalizr_state::finalizr)
GENERIC_LATCH_8(config, "soundlatch");
- MCFG_DEVICE_ADD("snsnd", SN76489A, XTAL(18'432'000)/12)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 0.75)
+ SN76489A(config, "snsnd", XTAL(18'432'000)/12).add_route(ALL_OUTPUTS, "speaker", 0.75);
- MCFG_DEVICE_ADD("dac", DAC_8BIT_R2R, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 0.325) // unknown DAC
- MCFG_DEVICE_ADD("vref", VOLTAGE_REGULATOR, 0) MCFG_VOLTAGE_REGULATOR_OUTPUT(5.0)
- MCFG_SOUND_ROUTE(0, "dac", 1.0, DAC_VREF_POS_INPUT) MCFG_SOUND_ROUTE(0, "dac", -1.0, DAC_VREF_NEG_INPUT)
-MACHINE_CONFIG_END
+ DAC_8BIT_R2R(config, "dac", 0).add_route(ALL_OUTPUTS, "speaker", 0.325); // unknown DAC
+ voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref"));
+ vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT);
+ vref.add_route(0, "dac", -1.0, DAC_VREF_NEG_INPUT);
+}
@@ -336,6 +336,31 @@ ROM_START( finalizr )
ROM_LOAD( "523h12.10f", 0x0140, 0x0100, CRC(53166a2a) SHA1(6cdde206036df7176679711f7888d72acee27c8f) ) /* sprites */
ROM_END
+ROM_START( finalizra )
+ ROM_REGION( 0x10000, "maincpu", 0 )
+ ROM_LOAD( "1.9c", 0x4000, 0x4000, CRC(7d464e5c) SHA1(45b1591a6be713dfc58ab657e61531ea2b9263c1) )
+ ROM_LOAD( "2.12c", 0x8000, 0x4000, CRC(383dc94e) SHA1(f192e16e83ae34cc97af07072a4dc68e7c4c362c) )
+ ROM_LOAD( "3.13c", 0xc000, 0x4000, CRC(ce177f6e) SHA1(034cbe0c1e2baf9577741b3c222a8b4a8ac8c919) )
+
+ ROM_REGION( 0x1000, "audiocpu", 0 ) /* 8039 */
+ ROM_LOAD( "d8749hd.bin", 0x0000, 0x0800, BAD_DUMP CRC(978dfc33) SHA1(13d24ce577b88bf6ec2e970d36dc67a7ec691c55) ) /* this comes from the bootleg, the original has a custom IC */
+
+ ROM_REGION( 0x20000, "gfx1", 0 )
+ ROM_LOAD16_BYTE( "523h04.5e", 0x00000, 0x4000, CRC(c056d710) SHA1(3fe0ab7ef3bce7298c2a073d0985c33f9dc40062) )
+ ROM_LOAD16_BYTE( "523h07.5f", 0x00001, 0x4000, CRC(50e512ba) SHA1(f916afb9df1872f9de571d20b9045b20d9172eaa) )
+ ROM_LOAD16_BYTE( "523h05.6e", 0x08000, 0x4000, CRC(ae0d0f76) SHA1(6dd0119e4ba7ebb32ba1ca6395f80d18f1617ce8) )
+ ROM_LOAD16_BYTE( "523h08.6f", 0x08001, 0x4000, CRC(79f44e17) SHA1(cb32edc4df9f2209f13fc258fec4e67ee91badef) )
+ ROM_LOAD16_BYTE( "523h06.7e", 0x10000, 0x4000, CRC(d2db9689) SHA1(ceb5913716b4da2ddff2e837ddaa04d91e52f9e1) )
+ ROM_LOAD16_BYTE( "523h09.7f", 0x10001, 0x4000, CRC(8896dc85) SHA1(91493c6b69655de482f0c2a0cb3662fc0d1b6e45) )
+ /* 18000-1ffff empty */
+
+ ROM_REGION( 0x0240, "proms", 0 ) /* PROMs at 2F & 3F are MMI 63S081N (or compatibles), PROMs at 10F & 11F are MMI 6301-1N (or compatibles) */
+ ROM_LOAD( "523h10.2f", 0x0000, 0x0020, CRC(ec15dd15) SHA1(710384b154a9363fdc88edffda252f1d60e000dc) ) /* palette */
+ ROM_LOAD( "523h11.3f", 0x0020, 0x0020, CRC(54be2e83) SHA1(3200abc7f2238d62d7204ef57a6daa2df150538d) ) /* palette */
+ ROM_LOAD( "523h13.11f", 0x0040, 0x0100, CRC(4e0647a0) SHA1(fb87f878456b8b76bb2c028cb890d2a5c1c3e388) ) /* characters */
+ ROM_LOAD( "523h12.10f", 0x0140, 0x0100, CRC(53166a2a) SHA1(6cdde206036df7176679711f7888d72acee27c8f) ) /* sprites */
+ROM_END
+
ROM_START( finalizrb )
ROM_REGION( 0x10000, "maincpu", 0 )
ROM_LOAD( "finalizr.5", 0x4000, 0x8000, CRC(a55e3f14) SHA1(47f6da214b36cc56be547fa4313afcc5572508a2) )
@@ -362,5 +387,6 @@ ROM_END
-GAME( 1985, finalizr, 0, finalizr, finalizr, finalizr_state, empty_init, ROT90, "Konami", "Finalizer - Super Transformation", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE )
-GAME( 1985, finalizrb, finalizr, finalizr, finalizrb, finalizr_state, empty_init, ROT90, "bootleg", "Finalizer - Super Transformation (bootleg)", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE )
+GAME( 1985, finalizr, 0, finalizr, finalizr, finalizr_state, empty_init, ROT90, "Konami", "Finalizer - Super Transformation (set 1)", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE )
+GAME( 1985, finalizra, finalizr, finalizr, finalizra, finalizr_state, empty_init, ROT90, "Konami", "Finalizer - Super Transformation (set 2)", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE )
+GAME( 1985, finalizrb, finalizr, finalizr, finalizra, finalizr_state, empty_init, ROT90, "bootleg", "Finalizer - Super Transformation (bootleg)", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE )
diff --git a/src/mame/drivers/fireball.cpp b/src/mame/drivers/fireball.cpp
index c95f1cfade6..3d897c55fdd 100644
--- a/src/mame/drivers/fireball.cpp
+++ b/src/mame/drivers/fireball.cpp
@@ -250,21 +250,21 @@ WRITE8_MEMBER(fireball_state::io_06_w)
//address_w
if (LOG_AY8912)
logerror("write to 0x06 bc1=1\n");
- m_ay->address_w(space,0,to_ay_data );
+ m_ay->address_w(to_ay_data);
if (LOG_AY8912)
logerror("AY8912 address latch write=%02X\n",to_ay_data);
}else{
//data_w
if (LOG_AY8912)
logerror("write to 0x06 bc1=0\n");
- m_ay->data_w(space,0,to_ay_data );
+ m_ay->data_w(to_ay_data);
if (LOG_AY8912)
logerror("AY8912 data write=%02X\n",to_ay_data);
}
}else{
if (LOG_AY8912)
logerror("write to 0x06 bdir=0\n");
- ay_data=m_ay->data_r(space,0);
+ ay_data=m_ay->data_r();
}
m_p1_data=data;
@@ -492,7 +492,8 @@ TIMER_DEVICE_CALLBACK_MEMBER( fireball_state::int_0 )
*************************/
-MACHINE_CONFIG_START(fireball_state::fireball)
+void fireball_state::fireball(machine_config &config)
+{
/* basic machine hardware */
I8031(config, m_maincpu, CPU_CLK); //
m_maincpu->set_addrmap(AS_PROGRAM, &fireball_state::fireball_map);
@@ -513,7 +514,7 @@ MACHINE_CONFIG_START(fireball_state::fireball)
/* Video */
config.set_default_layout(layout_fireball);
-MACHINE_CONFIG_END
+}
/*************************
diff --git a/src/mame/drivers/firebeat.cpp b/src/mame/drivers/firebeat.cpp
index 90b4a2aae13..2bb69eb3511 100644
--- a/src/mame/drivers/firebeat.cpp
+++ b/src/mame/drivers/firebeat.cpp
@@ -1175,8 +1175,8 @@ static void firebeat_ata_devices(device_slot_interface &device)
device.option_add("cdrom", ATAPI_FIXED_CDROM);
}
-MACHINE_CONFIG_START(firebeat_state::firebeat)
-
+void firebeat_state::firebeat(machine_config &config)
+{
/* basic machine hardware */
PPC403GCX(config, m_maincpu, XTAL(64'000'000));
m_maincpu->set_addrmap(AS_PROGRAM, &firebeat_state::firebeat_map);
diff --git a/src/mame/drivers/firefox.cpp b/src/mame/drivers/firefox.cpp
index e660eea76cb..5f0329ae858 100644
--- a/src/mame/drivers/firefox.cpp
+++ b/src/mame/drivers/firefox.cpp
@@ -103,14 +103,14 @@ private:
uint32_t screen_update_firefox(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
TIMER_DEVICE_CALLBACK_MEMBER(video_timer_callback);
void set_rgba( int start, int index, unsigned char *palette_ram );
- void firq_gen(phillips_22vp931_device &laserdisc, int state);
+ void firq_gen(philips_22vp931_device &laserdisc, int state);
virtual void machine_start() override;
virtual void video_start() override;
void audio_map(address_map &map);
void main_map(address_map &map);
- required_device<phillips_22vp931_device> m_laserdisc;
+ required_device<philips_22vp931_device> m_laserdisc;
required_shared_ptr<unsigned char> m_tileram;
required_shared_ptr<uint8_t> m_spriteram;
required_shared_ptr<unsigned char> m_sprite_palette;
@@ -445,7 +445,7 @@ WRITE_LINE_MEMBER(firefox_state::coin_counter_left_w)
}
-void firefox_state::firq_gen(phillips_22vp931_device &laserdisc, int state)
+void firefox_state::firq_gen(philips_22vp931_device &laserdisc, int state)
{
if (state)
m_maincpu->set_input_line(M6809_FIRQ_LINE, ASSERT_LINE );
@@ -456,7 +456,7 @@ void firefox_state::machine_start()
{
m_mainbank->configure_entries(0, 32, memregion("maincpu")->base() + 0x10000, 0x1000);
- m_laserdisc->set_data_ready_callback(phillips_22vp931_device::data_ready_delegate(&firefox_state::firq_gen, this));
+ m_laserdisc->set_data_ready_callback(philips_22vp931_device::data_ready_delegate(&firefox_state::firq_gen, this));
m_sprite_bank = 0;
}
@@ -650,15 +650,15 @@ GFXDECODE_END
MACHINE_CONFIG_START(firefox_state::firefox)
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", MC6809E, MASTER_XTAL/8) // 68B09E
- MCFG_DEVICE_PROGRAM_MAP(main_map)
+ MC6809E(config, m_maincpu, MASTER_XTAL/8); // 68B09E
+ m_maincpu->set_addrmap(AS_PROGRAM, &firefox_state::main_map);
/* interrupts count starting at end of VBLANK, which is 44, so add 44 */
- MCFG_TIMER_DRIVER_ADD_SCANLINE("32v", firefox_state, video_timer_callback, "screen", 96+44, 128)
+ TIMER(config, "32v").configure_scanline(FUNC(firefox_state::video_timer_callback), "screen", 96+44, 128);
- MCFG_DEVICE_ADD("audiocpu", M6502, MASTER_XTAL/8)
- MCFG_DEVICE_PROGRAM_MAP(audio_map)
+ M6502(config, m_audiocpu, MASTER_XTAL/8);
+ m_audiocpu->set_addrmap(AS_PROGRAM, &firefox_state::audio_map);
- MCFG_QUANTUM_TIME(attotime::from_hz(60000))
+ config.m_minimum_quantum = attotime::from_hz(60000);
adc0809_device &adc(ADC0809(config, "adc", MASTER_XTAL/16)); // nominally 900 kHz
adc.in_callback<0>().set_ioport("PITCH");
@@ -687,13 +687,15 @@ MACHINE_CONFIG_START(firefox_state::firefox)
WATCHDOG_TIMER(config, "watchdog").set_time(attotime::from_hz(MASTER_XTAL/8/16/16/16/16));
/* video hardware */
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_firefox)
- MCFG_PALETTE_ADD("palette", 512)
+ GFXDECODE(config, m_gfxdecode, m_palette, gfx_firefox);
+ PALETTE(config, m_palette).set_entries(512);
- MCFG_LASERDISC_22VP931_ADD("laserdisc")
- MCFG_LASERDISC_OVERLAY_DRIVER(64*8, 525, firefox_state, screen_update_firefox)
- MCFG_LASERDISC_OVERLAY_CLIP(7*8, 53*8-1, 44, 480+44)
- MCFG_LASERDISC_OVERLAY_PALETTE("palette")
+ PHILIPS_22VP931(config, m_laserdisc, 0);
+ m_laserdisc->set_overlay(64*8, 525, FUNC(firefox_state::screen_update_firefox));
+ m_laserdisc->set_overlay_clip(7*8, 53*8-1, 44, 480+44);
+ m_laserdisc->set_overlay_palette(m_palette);
+ m_laserdisc->add_route(0, "lspeaker", 0.50);
+ m_laserdisc->add_route(1, "rspeaker", 0.50);
MCFG_LASERDISC_SCREEN_ADD_NTSC("screen", "laserdisc")
@@ -716,29 +718,25 @@ MACHINE_CONFIG_START(firefox_state::firefox)
GENERIC_LATCH_8(config, m_soundlatch2);
- MCFG_DEVICE_ADD("pokey1", POKEY, MASTER_XTAL/8)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 0.30)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 0.30)
+ pokey_device &pokey1(POKEY(config, "pokey1", MASTER_XTAL/8));
+ pokey1.add_route(ALL_OUTPUTS, "lspeaker", 0.30);
+ pokey1.add_route(ALL_OUTPUTS, "rspeaker", 0.30);
- MCFG_DEVICE_ADD("pokey2", POKEY, MASTER_XTAL/8)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 0.30)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 0.30)
+ pokey_device &pokey2(POKEY(config, "pokey2", MASTER_XTAL/8));
+ pokey2.add_route(ALL_OUTPUTS, "lspeaker", 0.30);
+ pokey2.add_route(ALL_OUTPUTS, "rspeaker", 0.30);
- MCFG_DEVICE_ADD("pokey3", POKEY, MASTER_XTAL/8)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 0.30)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 0.30)
+ pokey_device &pokey3(POKEY(config, "pokey3", MASTER_XTAL/8));
+ pokey3.add_route(ALL_OUTPUTS, "lspeaker", 0.30);
+ pokey3.add_route(ALL_OUTPUTS, "rspeaker", 0.30);
- MCFG_DEVICE_ADD("pokey4", POKEY, MASTER_XTAL/8)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 0.30)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 0.30)
+ pokey_device &pokey4(POKEY(config, "pokey4", MASTER_XTAL/8));
+ pokey4.add_route(ALL_OUTPUTS, "lspeaker", 0.30);
+ pokey4.add_route(ALL_OUTPUTS, "rspeaker", 0.30);
- MCFG_DEVICE_ADD("tms", TMS5220, MASTER_XTAL/2/11)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 0.75)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 0.75)
-
- MCFG_DEVICE_MODIFY("laserdisc")
- MCFG_SOUND_ROUTE(0, "lspeaker", 0.50)
- MCFG_SOUND_ROUTE(1, "rspeaker", 0.50)
+ TMS5220(config, m_tms, MASTER_XTAL/2/11);
+ m_tms->add_route(ALL_OUTPUTS, "lspeaker", 0.75);
+ m_tms->add_route(ALL_OUTPUTS, "rspeaker", 0.75);
MACHINE_CONFIG_END
diff --git a/src/mame/drivers/firetrap.cpp b/src/mame/drivers/firetrap.cpp
index 815564c257a..638303b51ca 100644
--- a/src/mame/drivers/firetrap.cpp
+++ b/src/mame/drivers/firetrap.cpp
@@ -339,7 +339,7 @@ WRITE_LINE_MEMBER(firetrap_state::firetrap_adpcm_int)
WRITE8_MEMBER(firetrap_state::adpcm_data_w)
{
m_audiocpu->set_input_line(M6502_IRQ_LINE, CLEAR_LINE);
- m_adpcm_select->write_ba(data);
+ m_adpcm_select->ba_w(data);
}
WRITE8_MEMBER(firetrap_state::flip_screen_w)
@@ -615,33 +615,32 @@ void firetrap_state::machine_reset()
m_coin_command_pending = 0;
}
-MACHINE_CONFIG_START(firetrap_state::firetrap)
-
+void firetrap_state::firetrap(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, FIRETRAP_XTAL/2) // 6 MHz
- MCFG_DEVICE_PROGRAM_MAP(firetrap_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", firetrap_state, firetrap_irq)
+ Z80(config, m_maincpu, FIRETRAP_XTAL/2); // 6 MHz
+ m_maincpu->set_addrmap(AS_PROGRAM, &firetrap_state::firetrap_map);
+ m_maincpu->set_vblank_int("screen", FUNC(firetrap_state::firetrap_irq));
- MCFG_DEVICE_ADD("audiocpu", M6502, FIRETRAP_XTAL/8) // 1.5 MHz
- MCFG_DEVICE_PROGRAM_MAP(sound_map)
- /* IRQs are caused by the ADPCM chip */
- /* NMIs are caused by the main CPU */
+ M6502(config, m_audiocpu, FIRETRAP_XTAL/8); // 1.5 MHz
+ m_audiocpu->set_addrmap(AS_PROGRAM, &firetrap_state::sound_map);
+ /* IRQs are caused by the ADPCM chip */
+ /* NMIs are caused by the main CPU */
- MCFG_DEVICE_ADD("mcu", I8751, XTAL(8'000'000))
- MCFG_DEVICE_DISABLE()
+ I8751(config, "mcu", XTAL(8'000'000)).set_disable();
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
-// MCFG_SCREEN_REFRESH_RATE(57.4034) // PCB measurement
-// MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */)
-// MCFG_SCREEN_SIZE(32*8, 32*8)
-// MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 1*8, 31*8-1)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+// screen.set_refresh_hz(57.4034); // PCB measurement
+// screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */
+// screen.set_size(32*8, 32*8);
+// screen.set_visarea(0*8, 32*8-1, 1*8, 31*8-1);
// DECO video CRTC, unverified
- MCFG_SCREEN_RAW_PARAMS(FIRETRAP_XTAL/2,384,0,256,272,8,248)
- MCFG_SCREEN_UPDATE_DRIVER(firetrap_state, screen_update_firetrap)
- MCFG_SCREEN_PALETTE(m_palette)
+ screen.set_raw(FIRETRAP_XTAL/2,384,0,256,272,8,248);
+ screen.set_screen_update(FUNC(firetrap_state::screen_update_firetrap));
+ screen.set_palette(m_palette);
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, m_palette, gfx_firetrap)
+ GFXDECODE(config, m_gfxdecode, m_palette, gfx_firetrap);
PALETTE(config, m_palette, FUNC(firetrap_state::firetrap_palette), 256);
/* sound hardware */
@@ -650,42 +649,42 @@ MACHINE_CONFIG_START(firetrap_state::firetrap)
GENERIC_LATCH_8(config, m_soundlatch);
m_soundlatch->data_pending_callback().set_inputline(m_audiocpu, INPUT_LINE_NMI);
- MCFG_DEVICE_ADD("ymsnd", YM3526, FIRETRAP_XTAL/4) // 3 MHz
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
+ ym3526_device &ymsnd(YM3526(config, "ymsnd", FIRETRAP_XTAL/4)); // 3 MHz
+ ymsnd.add_route(ALL_OUTPUTS, "mono", 1.0);
LS157(config, m_adpcm_select, 0);
m_adpcm_select->out_callback().set("msm", FUNC(msm5205_device::data_w));
- MCFG_DEVICE_ADD("msm", MSM5205, FIRETRAP_XTAL/32) // 375 kHz
- MCFG_MSM5205_VCK_CALLBACK(WRITELINE(*this, firetrap_state, firetrap_adpcm_int))
- MCFG_MSM5205_PRESCALER_SELECTOR(S48_4B) /* 7.8125kHz */
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.30)
-MACHINE_CONFIG_END
-
-MACHINE_CONFIG_START(firetrap_state::firetrapbl)
+ MSM5205(config, m_msm, FIRETRAP_XTAL/32); // 375 kHz
+ m_msm->vck_callback().set(FUNC(firetrap_state::firetrap_adpcm_int));
+ m_msm->set_prescaler_selector(msm5205_device::S48_4B); /* 7.8125kHz */
+ m_msm->add_route(ALL_OUTPUTS, "mono", 0.30);
+}
+void firetrap_state::firetrapbl(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, FIRETRAP_XTAL/2) // 6 MHz
- MCFG_DEVICE_PROGRAM_MAP(firetrap_bootleg_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", firetrap_state, firetrap_irq)
+ Z80(config, m_maincpu, FIRETRAP_XTAL/2); // 6 MHz
+ m_maincpu->set_addrmap(AS_PROGRAM, &firetrap_state::firetrap_bootleg_map);
+ m_maincpu->set_vblank_int("screen", FUNC(firetrap_state::firetrap_irq));
- MCFG_DEVICE_ADD("audiocpu", M6502, FIRETRAP_XTAL/8) // 1.5 MHz
- MCFG_DEVICE_PROGRAM_MAP(sound_map)
- /* IRQs are caused by the ADPCM chip */
- /* NMIs are caused by the main CPU */
+ M6502(config, m_audiocpu, FIRETRAP_XTAL/8); // 1.5 MHz
+ m_audiocpu->set_addrmap(AS_PROGRAM, &firetrap_state::sound_map);
+ /* IRQs are caused by the ADPCM chip */
+ /* NMIs are caused by the main CPU */
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
-// MCFG_SCREEN_REFRESH_RATE(57.4034)
-// MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */)
-// MCFG_SCREEN_SIZE(32*8, 32*8)
-// MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 1*8, 31*8-1)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+// screen.set_refresh_hz(57.4034);
+// screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */
+// screen.set_size(32*8, 32*8);
+// screen.set_visarea(0*8, 32*8-1, 1*8, 31*8-1);
// DECO video CRTC, unverified
- MCFG_SCREEN_RAW_PARAMS(FIRETRAP_XTAL/2,384,0,256,272,8,248)
- MCFG_SCREEN_UPDATE_DRIVER(firetrap_state, screen_update_firetrap)
- MCFG_SCREEN_PALETTE(m_palette)
+ screen.set_raw(FIRETRAP_XTAL/2,384,0,256,272,8,248);
+ screen.set_screen_update(FUNC(firetrap_state::screen_update_firetrap));
+ screen.set_palette(m_palette);
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, m_palette, gfx_firetrap)
+ GFXDECODE(config, m_gfxdecode, m_palette, gfx_firetrap);
PALETTE(config, m_palette, FUNC(firetrap_state::firetrap_palette), 256);
/* sound hardware */
@@ -694,17 +693,17 @@ MACHINE_CONFIG_START(firetrap_state::firetrapbl)
GENERIC_LATCH_8(config, m_soundlatch);
m_soundlatch->data_pending_callback().set_inputline(m_audiocpu, INPUT_LINE_NMI);
- MCFG_DEVICE_ADD("ymsnd", YM3526, FIRETRAP_XTAL/4) // 3 MHz
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
+ ym3526_device &ymsnd(YM3526(config, "ymsnd", FIRETRAP_XTAL/4)); // 3 MHz
+ ymsnd.add_route(ALL_OUTPUTS, "mono", 1.0);
LS157(config, m_adpcm_select, 0);
m_adpcm_select->out_callback().set("msm", FUNC(msm5205_device::data_w));
- MCFG_DEVICE_ADD("msm", MSM5205, FIRETRAP_XTAL/32) // 375 kHz
- MCFG_MSM5205_VCK_CALLBACK(WRITELINE(*this, firetrap_state, firetrap_adpcm_int))
- MCFG_MSM5205_PRESCALER_SELECTOR(S48_4B) /* 7.8125kHz */
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.30)
-MACHINE_CONFIG_END
+ MSM5205(config, m_msm, FIRETRAP_XTAL/32); // 375 kHz
+ m_msm->vck_callback().set(FUNC(firetrap_state::firetrap_adpcm_int));
+ m_msm->set_prescaler_selector(msm5205_device::S48_4B); /* 7.8125kHz */
+ m_msm->add_route(ALL_OUTPUTS, "mono", 0.30);
+}
diff --git a/src/mame/drivers/firetrk.cpp b/src/mame/drivers/firetrk.cpp
index 1c3085dbbaf..6e7d25d71a6 100644
--- a/src/mame/drivers/firetrk.cpp
+++ b/src/mame/drivers/firetrk.cpp
@@ -854,75 +854,69 @@ static GFXDECODE_START( gfx_montecar )
GFXDECODE_END
-MACHINE_CONFIG_START(firetrk_state::firetrk)
-
+void firetrk_state::firetrk(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M6800, MASTER_CLOCK/12) /* 750Khz during service mode */
- MCFG_DEVICE_PROGRAM_MAP(firetrk_map)
- MCFG_TIMER_DRIVER_ADD_SCANLINE("scantimer", firetrk_state, firetrk_scanline, "screen", 0, 1)
+ M6800(config, m_maincpu, MASTER_CLOCK/12); /* 750Khz during service mode */
+ m_maincpu->set_addrmap(AS_PROGRAM, &firetrk_state::firetrk_map);
+ TIMER(config, "scantimer").configure_scanline(FUNC(firetrk_state::firetrk_scanline), "screen", 0, 1);
WATCHDOG_TIMER(config, m_watchdog).set_vblank_count("screen", 5);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_VIDEO_ATTRIBUTES(VIDEO_ALWAYS_UPDATE)
- MCFG_SCREEN_RAW_PARAMS(MASTER_CLOCK/2, 384, 0, 320, 262, 0, 240)
- MCFG_SCREEN_UPDATE_DRIVER(firetrk_state, screen_update_firetrk)
- MCFG_SCREEN_PALETTE(m_palette)
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_video_attributes(VIDEO_ALWAYS_UPDATE);
+ m_screen->set_raw(MASTER_CLOCK/2, 384, 0, 320, 262, 0, 240);
+ m_screen->set_screen_update(FUNC(firetrk_state::screen_update_firetrk));
+ m_screen->set_palette(m_palette);
PALETTE(config, m_palette, FUNC(firetrk_state::firetrk_palette), 28);
-
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, m_palette, gfx_firetrk)
+ GFXDECODE(config, m_gfxdecode, m_palette, gfx_firetrk);
/* sound hardware */
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("discrete", DISCRETE, firetrk_discrete)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
-MACHINE_CONFIG_END
+ DISCRETE(config, m_discrete, firetrk_discrete).add_route(ALL_OUTPUTS, "mono", 1.0);
+}
-MACHINE_CONFIG_START(firetrk_state::superbug)
+void firetrk_state::superbug(machine_config &config)
+{
firetrk(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(superbug_map)
+ m_maincpu->set_addrmap(AS_PROGRAM, &firetrk_state::superbug_map);
/* video hardware */
- MCFG_SCREEN_MODIFY("screen")
- MCFG_SCREEN_UPDATE_DRIVER(firetrk_state, screen_update_superbug)
+ m_screen->set_screen_update(FUNC(firetrk_state::screen_update_superbug));
MCFG_VIDEO_START_OVERRIDE(firetrk_state,superbug)
- MCFG_GFXDECODE_MODIFY("gfxdecode", gfx_superbug)
+ m_gfxdecode->set_info(gfx_superbug);
/* sound hardware */
- MCFG_DEVICE_REPLACE("discrete", DISCRETE, superbug_discrete)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
-MACHINE_CONFIG_END
+ DISCRETE(config.replace(), m_discrete, superbug_discrete).add_route(ALL_OUTPUTS, "mono", 1.0);
+}
-MACHINE_CONFIG_START(firetrk_state::montecar)
+void firetrk_state::montecar(machine_config &config)
+{
firetrk(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(montecar_map)
+ m_maincpu->set_addrmap(AS_PROGRAM, &firetrk_state::montecar_map);
/* video hardware */
- MCFG_SCREEN_MODIFY("screen")
- MCFG_SCREEN_UPDATE_DRIVER(firetrk_state, screen_update_montecar)
+ m_screen->set_screen_update(FUNC(firetrk_state::screen_update_montecar));
MCFG_VIDEO_START_OVERRIDE(firetrk_state,montecar)
- MCFG_GFXDECODE_MODIFY("gfxdecode", gfx_montecar)
+ m_gfxdecode->set_info(gfx_montecar);
m_palette->set_entries(46);
m_palette->set_init(FUNC(firetrk_state::montecar_palette));
/* sound hardware */
- MCFG_DEVICE_REPLACE("discrete", DISCRETE, montecar_discrete)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
-MACHINE_CONFIG_END
+ DISCRETE(config.replace(), m_discrete, montecar_discrete).add_route(ALL_OUTPUTS, "mono", 1.0);
+}
ROM_START( firetrk )
diff --git a/src/mame/drivers/fitfight.cpp b/src/mame/drivers/fitfight.cpp
index 6db1ba3f3ff..a75e86a61fc 100644
--- a/src/mame/drivers/fitfight.cpp
+++ b/src/mame/drivers/fitfight.cpp
@@ -720,11 +720,11 @@ void fitfight_state::machine_reset()
m_fof_700000_data = 0;
}
-MACHINE_CONFIG_START(fitfight_state::fitfight)
-
- MCFG_DEVICE_ADD("maincpu",M68000, 12000000)
- MCFG_DEVICE_PROGRAM_MAP(fitfight_main_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", fitfight_state, irq2_line_hold)
+void fitfight_state::fitfight(machine_config &config)
+{
+ M68000(config, m_maincpu, 12000000);
+ m_maincpu->set_addrmap(AS_PROGRAM, &fitfight_state::fitfight_main_map);
+ m_maincpu->set_vblank_int("screen", FUNC(fitfight_state::irq2_line_hold));
upd7810_device &audiocpu(UPD7810(config, m_audiocpu, 12000000));
audiocpu.set_addrmap(AS_PROGRAM, &fitfight_state::snd_mem);
@@ -750,33 +750,31 @@ MACHINE_CONFIG_START(fitfight_state::fitfight)
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("oki", OKIM6295, 1333333, okim6295_device::PIN7_LOW) // ~8080Hz ??? TODO: find out the real frequency
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
-MACHINE_CONFIG_END
-
-MACHINE_CONFIG_START(fitfight_state::bbprot)
+ OKIM6295(config, "oki", 1333333, okim6295_device::PIN7_LOW).add_route(ALL_OUTPUTS, "mono", 1.0); // ~8080Hz ??? TODO: find out the real frequency
+}
- MCFG_DEVICE_ADD("maincpu",M68000, 12000000)
- MCFG_DEVICE_PROGRAM_MAP(bbprot_main_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", fitfight_state, irq2_line_hold)
+void fitfight_state::bbprot(machine_config &config)
+{
+ M68000(config, m_maincpu, 12000000);
+ m_maincpu->set_addrmap(AS_PROGRAM, &fitfight_state::bbprot_main_map);
+ m_maincpu->set_vblank_int("screen", FUNC(fitfight_state::irq2_line_hold));
GFXDECODE(config, m_gfxdecode, m_palette, gfx_prot);
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(40*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(2*8, 39*8-1, 2*8, 30*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(fitfight_state, screen_update_fitfight)
- MCFG_SCREEN_PALETTE("palette")
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(40*8, 32*8);
+ screen.set_visarea(2*8, 39*8-1, 2*8, 30*8-1);
+ screen.set_screen_update(FUNC(fitfight_state::screen_update_fitfight));
+ screen.set_palette(m_palette);
PALETTE(config, m_palette).set_format(palette_device::xRGB_555, 0x2000);
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("oki", OKIM6295, 1333333, okim6295_device::PIN7_LOW) // ~8080Hz ??? TODO: find out the real frequency
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
-MACHINE_CONFIG_END
+ OKIM6295(config, "oki", 1333333, okim6295_device::PIN7_LOW).add_route(ALL_OUTPUTS, "mono", 1.0); // ~8080Hz ??? TODO: find out the real frequency
+}
/***
diff --git a/src/mame/drivers/fk1.cpp b/src/mame/drivers/fk1.cpp
index aa63afa7fac..a75e3ff7a6b 100644
--- a/src/mame/drivers/fk1.cpp
+++ b/src/mame/drivers/fk1.cpp
@@ -412,21 +412,22 @@ uint32_t fk1_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, c
return 0;
}
-MACHINE_CONFIG_START(fk1_state::fk1)
+void fk1_state::fk1(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu",Z80, XTAL(8'000'000) / 2)
- MCFG_DEVICE_PROGRAM_MAP(fk1_mem)
- MCFG_DEVICE_IO_MAP(fk1_io)
- MCFG_DEVICE_IRQ_ACKNOWLEDGE_DRIVER(fk1_state,fk1_irq_callback)
+ Z80(config, m_maincpu, XTAL(8'000'000) / 2);
+ m_maincpu->set_addrmap(AS_PROGRAM, &fk1_state::fk1_mem);
+ m_maincpu->set_addrmap(AS_IO, &fk1_state::fk1_io);
+ m_maincpu->set_irq_acknowledge_callback(FUNC(fk1_state::fk1_irq_callback));
/* video hardware */
- MCFG_SCREEN_ADD_MONOCHROME("screen", RASTER, rgb_t::green())
- MCFG_SCREEN_REFRESH_RATE(50)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */
- MCFG_SCREEN_UPDATE_DRIVER(fk1_state, screen_update)
- MCFG_SCREEN_SIZE(512, 256)
- MCFG_SCREEN_VISIBLE_AREA(0, 512-1, 0, 256-1)
- MCFG_SCREEN_PALETTE("palette")
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER, rgb_t::green()));
+ screen.set_refresh_hz(50);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */
+ screen.set_screen_update(FUNC(fk1_state::screen_update));
+ screen.set_size(512, 256);
+ screen.set_visarea(0, 512-1, 0, 256-1);
+ screen.set_palette("palette");
PALETTE(config, "palette", palette_device::MONOCHROME);
@@ -466,9 +467,9 @@ MACHINE_CONFIG_START(fk1_state::fk1)
/* internal ram */
RAM(config, RAM_TAG).set_default_size("80K"); // 64 + 16
- MCFG_TIMER_DRIVER_ADD_PERIODIC("keyboard_timer", fk1_state, keyboard_callback, attotime::from_hz(24000))
- MCFG_TIMER_DRIVER_ADD_PERIODIC("vsync_timer", fk1_state, vsync_callback, attotime::from_hz(50))
-MACHINE_CONFIG_END
+ TIMER(config, "keyboard_timer").configure_periodic(FUNC(fk1_state::keyboard_callback), attotime::from_hz(24000));
+ TIMER(config, "vsync_timer").configure_periodic(FUNC(fk1_state::vsync_callback), attotime::from_hz(50));
+}
/* ROM definition */
ROM_START( fk1 )
diff --git a/src/mame/drivers/flipjack.cpp b/src/mame/drivers/flipjack.cpp
index 2a5445693e3..49710b33951 100644
--- a/src/mame/drivers/flipjack.cpp
+++ b/src/mame/drivers/flipjack.cpp
@@ -419,8 +419,8 @@ void flipjack_state::machine_start()
}
-MACHINE_CONFIG_START(flipjack_state::flipjack)
-
+void flipjack_state::flipjack(machine_config &config)
+{
/* basic machine hardware */
Z80(config, m_maincpu, MASTER_CLOCK/4);
m_maincpu->set_addrmap(AS_PROGRAM, &flipjack_state::main_map);
@@ -462,7 +462,7 @@ MACHINE_CONFIG_START(flipjack_state::flipjack)
ay1.add_route(ALL_OUTPUTS, "mono", 0.50);
AY8910(config, "ay2", MASTER_CLOCK/8).add_route(ALL_OUTPUTS, "mono", 0.50);
-MACHINE_CONFIG_END
+}
ROM_START( flipjack )
diff --git a/src/mame/drivers/flower.cpp b/src/mame/drivers/flower.cpp
index e6b0f672a05..eca0e8d727e 100644
--- a/src/mame/drivers/flower.cpp
+++ b/src/mame/drivers/flower.cpp
@@ -494,36 +494,36 @@ INTERRUPT_GEN_MEMBER(flower_state::slave_vblank_irq)
}
-MACHINE_CONFIG_START(flower_state::flower)
- MCFG_DEVICE_ADD("mastercpu",Z80,MASTER_CLOCK/4)
- MCFG_DEVICE_PROGRAM_MAP(shared_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", flower_state, master_vblank_irq)
+void flower_state::flower(machine_config &config)
+{
+ Z80(config, m_mastercpu, MASTER_CLOCK/4);
+ m_mastercpu->set_addrmap(AS_PROGRAM, &flower_state::shared_map);
+ m_mastercpu->set_vblank_int("screen", FUNC(flower_state::master_vblank_irq));
- MCFG_DEVICE_ADD("slavecpu",Z80,MASTER_CLOCK/4)
- MCFG_DEVICE_PROGRAM_MAP(shared_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", flower_state, slave_vblank_irq)
+ Z80(config, m_slavecpu, MASTER_CLOCK/4);
+ m_slavecpu->set_addrmap(AS_PROGRAM, &flower_state::shared_map);
+ m_slavecpu->set_vblank_int("screen", FUNC(flower_state::slave_vblank_irq));
- MCFG_DEVICE_ADD("audiocpu",Z80,MASTER_CLOCK/4)
- MCFG_DEVICE_PROGRAM_MAP(audio_map)
- MCFG_DEVICE_PERIODIC_INT_DRIVER(flower_state, irq0_line_hold, 90)
+ Z80(config, m_audiocpu, MASTER_CLOCK/4);
+ m_audiocpu->set_addrmap(AS_PROGRAM, &flower_state::audio_map);
+ m_audiocpu->set_periodic_int(FUNC(flower_state::irq0_line_hold), attotime::from_hz(90));
- MCFG_QUANTUM_PERFECT_CPU("mastercpu")
+ config.m_perfect_cpu_quantum = subtag("mastercpu");
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_UPDATE_DRIVER(flower_state, screen_update)
- MCFG_SCREEN_RAW_PARAMS(MASTER_CLOCK/3,384,0,288,264,16,240) // derived from Galaxian HW, 60.606060
- MCFG_SCREEN_PALETTE(m_palette)
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_screen_update(FUNC(flower_state::screen_update));
+ m_screen->set_raw(MASTER_CLOCK/3,384,0,288,264,16,240); // derived from Galaxian HW, 60.606060
+ m_screen->set_palette(m_palette);
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_flower)
+ GFXDECODE(config, m_gfxdecode, m_palette, gfx_flower);
PALETTE(config, m_palette, palette_device::RGB_444_PROMS, "proms", 256);
GENERIC_LATCH_8(config, m_soundlatch);
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("flower", FLOWER_CUSTOM, 96000)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
-MACHINE_CONFIG_END
+ FLOWER_CUSTOM(config, "flower", 96000).add_route(ALL_OUTPUTS, "mono", 1.0);
+}
ROM_START( flower ) /* Komax version */
diff --git a/src/mame/drivers/flstory.cpp b/src/mame/drivers/flstory.cpp
index e35a9756418..8f2ad9132fd 100644
--- a/src/mame/drivers/flstory.cpp
+++ b/src/mame/drivers/flstory.cpp
@@ -788,7 +788,6 @@ void flstory_state::common(machine_config &config)
DAC_8BIT_R2R(config, "dac", 0).add_route(ALL_OUTPUTS, "speaker", 0.1); // unknown DAC
voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref", 0));
- vref.set_output(5.0);
vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT);
vref.add_route(0, "dac", -1.0, DAC_VREF_NEG_INPUT);
}
diff --git a/src/mame/drivers/flyball.cpp b/src/mame/drivers/flyball.cpp
index 992fd3f8752..ac8ef621f9b 100644
--- a/src/mame/drivers/flyball.cpp
+++ b/src/mame/drivers/flyball.cpp
@@ -459,11 +459,11 @@ void flyball_state::machine_reset()
}
-MACHINE_CONFIG_START(flyball_state::flyball)
-
+void flyball_state::flyball(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M6502, MASTER_CLOCK/16)
- MCFG_DEVICE_PROGRAM_MAP(flyball_map)
+ M6502(config, m_maincpu, MASTER_CLOCK/16);
+ m_maincpu->set_addrmap(AS_PROGRAM, &flyball_state::flyball_map);
F9334(config, m_outlatch); // F7
m_outlatch->q_out_cb<2>().set_nop(); // bat hit
@@ -474,19 +474,19 @@ MACHINE_CONFIG_START(flyball_state::flyball)
m_outlatch->q_out_cb<7>().set(FUNC(flyball_state::lamp_w)); // 1 player lamp
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_SIZE(256, 262)
- MCFG_SCREEN_VISIBLE_AREA(0, 255, 0, 239)
- MCFG_SCREEN_UPDATE_DRIVER(flyball_state, screen_update)
- MCFG_SCREEN_PALETTE(m_palette)
- MCFG_SCREEN_VBLANK_CALLBACK(INPUTLINE("maincpu", INPUT_LINE_NMI))
-
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, m_palette, gfx_flyball)
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_refresh_hz(60);
+ m_screen->set_size(256, 262);
+ m_screen->set_visarea(0, 255, 0, 239);
+ m_screen->set_screen_update(FUNC(flyball_state::screen_update));
+ m_screen->set_palette(m_palette);
+ m_screen->screen_vblank().set_inputline(m_maincpu, INPUT_LINE_NMI);
+
+ GFXDECODE(config, m_gfxdecode, m_palette, gfx_flyball);
PALETTE(config, m_palette, FUNC(flyball_state::flyball_palette), 4);
/* sound hardware */
-MACHINE_CONFIG_END
+}
/*************************************
diff --git a/src/mame/drivers/fm7.cpp b/src/mame/drivers/fm7.cpp
index 4ed9ba92b60..8c77675510f 100644
--- a/src/mame/drivers/fm7.cpp
+++ b/src/mame/drivers/fm7.cpp
@@ -851,8 +851,6 @@ READ8_MEMBER(fm7_state::fm77av_boot_mode_r)
*/
void fm7_state::fm7_update_psg()
{
- address_space &space = m_maincpu->space(AS_PROGRAM);
-
if(m_type == SYS_FM7)
{
switch(m_psg_regsel)
@@ -862,15 +860,15 @@ void fm7_state::fm7_update_psg()
break;
case 0x01:
// Data read
- m_psg_data = m_psg->data_r(space, 0);
+ m_psg_data = m_psg->data_r();
break;
case 0x02:
// Data write
- m_psg->data_w(space, 0,m_psg_data);
+ m_psg->data_w(m_psg_data);
break;
case 0x03:
// Address latch
- m_psg->address_w(space, 0,m_psg_data);
+ m_psg->address_w(m_psg_data);
break;
}
}
@@ -883,21 +881,21 @@ void fm7_state::fm7_update_psg()
break;
case 0x01:
// Data read
- m_psg_data = m_ym->read(space, 1);
+ m_psg_data = m_ym->read(1);
break;
case 0x02:
// Data write
- m_ym->write(space, 1,m_psg_data);
+ m_ym->write(1,m_psg_data);
logerror("YM: data write 0x%02x\n",m_psg_data);
break;
case 0x03:
// Address latch
- m_ym->write(space, 0,m_psg_data);
+ m_ym->write(0,m_psg_data);
logerror("YM: address latch 0x%02x\n",m_psg_data);
break;
case 0x04:
// Status register
- m_psg_data = m_ym->read(space, 0);
+ m_psg_data = m_ym->read(0);
break;
case 0x09:
// Joystick port read
@@ -1148,7 +1146,7 @@ void fm7_state::fm7_mmr_refresh(address_space& space)
}
else
{
- space.install_readwrite_handler(0x7000,0x7fff,read8_delegate(FUNC(address_map_bank_device::read8),(address_map_bank_device*)m_avbank[7]),write8_delegate(FUNC(address_map_bank_device::write8),(address_map_bank_device*)m_avbank[7]));
+ space.install_readwrite_handler(0x7000,0x7fff,read8sm_delegate(FUNC(address_map_bank_device::read8),(address_map_bank_device*)m_avbank[7]),write8sm_delegate(FUNC(address_map_bank_device::write8),(address_map_bank_device*)m_avbank[7]));
}
if(m_init_rom_en)
{
@@ -2033,38 +2031,39 @@ static void fm7_floppies(device_slot_interface &device)
}
-MACHINE_CONFIG_START(fm7_state::fm7)
+void fm7_state::fm7(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", MC6809, 16.128_MHz_XTAL / 2)
- MCFG_DEVICE_PROGRAM_MAP(fm7_mem)
- MCFG_DEVICE_IRQ_ACKNOWLEDGE_DRIVER(fm7_state,fm7_irq_ack)
- MCFG_QUANTUM_PERFECT_CPU("maincpu")
+ MC6809(config, m_maincpu, 16.128_MHz_XTAL / 2);
+ m_maincpu->set_addrmap(AS_PROGRAM, &fm7_state::fm7_mem);
+ m_maincpu->set_irq_acknowledge_callback(FUNC(fm7_state::fm7_irq_ack));
+ config.m_perfect_cpu_quantum = subtag("maincpu");
- MCFG_DEVICE_ADD("sub", MC6809, 16.128_MHz_XTAL / 2)
- MCFG_DEVICE_PROGRAM_MAP(fm7_sub_mem)
- MCFG_DEVICE_IRQ_ACKNOWLEDGE_DRIVER(fm7_state,fm7_sub_irq_ack)
- MCFG_QUANTUM_PERFECT_CPU("sub")
+ MC6809(config, m_sub, 16.128_MHz_XTAL / 2);
+ m_sub->set_addrmap(AS_PROGRAM, &fm7_state::fm7_sub_mem);
+ m_sub->set_irq_acknowledge_callback(FUNC(fm7_state::fm7_sub_irq_ack));
+ config.m_perfect_cpu_quantum = subtag("sub");
SPEAKER(config, "mono").front_center();
AY8910(config, m_psg, 4.9152_MHz_XTAL / 4).add_route(ALL_OUTPUTS,"mono", 1.00);
BEEP(config, "beeper", 1200).add_route(ALL_OUTPUTS, "mono", 0.50);
- WAVE(config, "wave", "cassette").add_route(ALL_OUTPUTS, "mono", 0.25);
+ WAVE(config, "wave", m_cassette).add_route(ALL_OUTPUTS, "mono", 0.25);
MCFG_MACHINE_START_OVERRIDE(fm7_state,fm7)
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_RAW_PARAMS(16.128_MHz_XTAL, 1024, 0, 640, 262, 0, 200) // H = 15.75 KHz, V = 60.1145 Hz
- MCFG_SCREEN_UPDATE_DRIVER(fm7_state, screen_update_fm7)
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_raw(16.128_MHz_XTAL, 1024, 0, 640, 262, 0, 200); // H = 15.75 KHz, V = 60.1145 Hz
+ m_screen->set_screen_update(FUNC(fm7_state::screen_update_fm7));
PALETTE(config, m_palette, palette_device::BRG_3BIT);
- MCFG_CASSETTE_ADD("cassette")
- MCFG_CASSETTE_FORMATS(fm7_cassette_formats)
- MCFG_CASSETTE_DEFAULT_STATE(CASSETTE_STOPPED | CASSETTE_MOTOR_DISABLED | CASSETTE_SPEAKER_ENABLED)
- MCFG_CASSETTE_INTERFACE("fm7_cass")
+ CASSETTE(config, m_cassette);
+ m_cassette->set_formats(fm7_cassette_formats);
+ m_cassette->set_default_state(CASSETTE_STOPPED | CASSETTE_MOTOR_DISABLED | CASSETTE_SPEAKER_ENABLED);
+ m_cassette->set_interface("fm7_cass");
- MCFG_SOFTWARE_LIST_ADD("cass_list","fm7_cass")
+ SOFTWARE_LIST(config, "cass_list").set_original("fm7_cass");
MB8877(config, m_fdc, 8_MHz_XTAL / 8);
m_fdc->intrq_wr_callback().set(FUNC(fm7_state::fm7_fdc_intrq_w));
@@ -2073,47 +2072,49 @@ MACHINE_CONFIG_START(fm7_state::fm7)
FLOPPY_CONNECTOR(config, m_floppy0, fm7_floppies, "qd", floppy_image_device::default_floppy_formats);
FLOPPY_CONNECTOR(config, m_floppy1, fm7_floppies, "qd", floppy_image_device::default_floppy_formats);
- MCFG_SOFTWARE_LIST_ADD("flop_list","fm7_disk")
+ SOFTWARE_LIST(config, "flop_list").set_original("fm7_disk");
- MCFG_DEVICE_ADD("centronics", CENTRONICS, centronics_devices, "printer")
- MCFG_SLOT_OPTION_ADD( "dsjoy", DEMPA_SHINBUNSHA_JOYSTICK )
- MCFG_CENTRONICS_BUSY_HANDLER(WRITELINE(*this, fm7_state, write_centronics_busy))
- MCFG_CENTRONICS_FAULT_HANDLER(WRITELINE(*this, fm7_state, write_centronics_fault))
- MCFG_CENTRONICS_ACK_HANDLER(WRITELINE(*this, fm7_state, write_centronics_ack))
- MCFG_CENTRONICS_PERROR_HANDLER(WRITELINE(*this, fm7_state, write_centronics_perror))
+ CENTRONICS(config, m_centronics, centronics_devices, "printer");
+ m_centronics->option_add("dsjoy", DEMPA_SHINBUNSHA_JOYSTICK);
+ m_centronics->busy_handler().set(FUNC(fm7_state::write_centronics_busy));
+ m_centronics->fault_handler().set(FUNC(fm7_state::write_centronics_fault));
+ m_centronics->ack_handler().set(FUNC(fm7_state::write_centronics_ack));
+ m_centronics->perror_handler().set(FUNC(fm7_state::write_centronics_perror));
- MCFG_CENTRONICS_OUTPUT_LATCH_ADD("cent_data_out", "centronics")
-MACHINE_CONFIG_END
+ OUTPUT_LATCH(config, m_cent_data_out);
+ m_centronics->set_output_latch(*m_cent_data_out);
+}
-MACHINE_CONFIG_START(fm7_state::fm8)
+void fm7_state::fm8(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", MC6809, 4.9152_MHz_XTAL) // 1.2MHz 68A09
- MCFG_DEVICE_PROGRAM_MAP(fm8_mem)
- MCFG_DEVICE_IRQ_ACKNOWLEDGE_DRIVER(fm7_state,fm7_irq_ack)
- MCFG_QUANTUM_PERFECT_CPU("maincpu")
+ MC6809(config, m_maincpu, 4.9152_MHz_XTAL); // 1.2MHz 68A09
+ m_maincpu->set_addrmap(AS_PROGRAM, &fm7_state::fm8_mem);
+ m_maincpu->set_irq_acknowledge_callback(FUNC(fm7_state::fm7_irq_ack));
+ config.m_perfect_cpu_quantum = subtag("maincpu");
- MCFG_DEVICE_ADD("sub", MC6809, 16.128_MHz_XTAL / 2)
- MCFG_DEVICE_PROGRAM_MAP(fm7_sub_mem)
- MCFG_DEVICE_IRQ_ACKNOWLEDGE_DRIVER(fm7_state,fm7_sub_irq_ack)
- MCFG_QUANTUM_PERFECT_CPU("sub")
+ MC6809(config, m_sub, 16.128_MHz_XTAL / 2);
+ m_sub->set_addrmap(AS_PROGRAM, &fm7_state::fm7_sub_mem);
+ m_sub->set_irq_acknowledge_callback(FUNC(fm7_state::fm7_sub_irq_ack));
+ config.m_perfect_cpu_quantum = subtag("sub");
SPEAKER(config, "mono").front_center();
BEEP(config, m_beeper, 1200).add_route(ALL_OUTPUTS, "mono", 0.50);
- WAVE(config, "wave", "cassette").add_route(ALL_OUTPUTS, "mono", 0.25);
+ WAVE(config, "wave", m_cassette).add_route(ALL_OUTPUTS, "mono", 0.25);
MCFG_MACHINE_START_OVERRIDE(fm7_state,fm7)
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_RAW_PARAMS(16.128_MHz_XTAL, 1024, 0, 640, 262, 0, 200)
- MCFG_SCREEN_UPDATE_DRIVER(fm7_state, screen_update_fm7)
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_raw(16.128_MHz_XTAL, 1024, 0, 640, 262, 0, 200);
+ m_screen->set_screen_update(FUNC(fm7_state::screen_update_fm7));
PALETTE(config, m_palette, palette_device::BRG_3BIT);
- MCFG_CASSETTE_ADD("cassette")
- MCFG_CASSETTE_FORMATS(fm7_cassette_formats)
- MCFG_CASSETTE_DEFAULT_STATE(CASSETTE_STOPPED | CASSETTE_MOTOR_DISABLED | CASSETTE_SPEAKER_ENABLED)
- MCFG_CASSETTE_INTERFACE("fm7_cass")
+ CASSETTE(config, m_cassette);
+ m_cassette->set_formats(fm7_cassette_formats);
+ m_cassette->set_default_state(CASSETTE_STOPPED | CASSETTE_MOTOR_DISABLED | CASSETTE_SPEAKER_ENABLED);
+ m_cassette->set_interface("fm7_cass");
MB8877(config, m_fdc, 8_MHz_XTAL / 8);
m_fdc->intrq_wr_callback().set(FUNC(fm7_state::fm7_fdc_intrq_w));
@@ -2122,26 +2123,28 @@ MACHINE_CONFIG_START(fm7_state::fm8)
FLOPPY_CONNECTOR(config, m_floppy0, fm7_floppies, "qd", floppy_image_device::default_floppy_formats);
FLOPPY_CONNECTOR(config, m_floppy1, fm7_floppies, "qd", floppy_image_device::default_floppy_formats);
- MCFG_DEVICE_ADD("centronics", CENTRONICS, centronics_devices, "printer")
- MCFG_CENTRONICS_BUSY_HANDLER(WRITELINE(*this, fm7_state, write_centronics_busy))
- MCFG_CENTRONICS_FAULT_HANDLER(WRITELINE(*this, fm7_state, write_centronics_fault))
- MCFG_CENTRONICS_ACK_HANDLER(WRITELINE(*this, fm7_state, write_centronics_ack))
- MCFG_CENTRONICS_PERROR_HANDLER(WRITELINE(*this, fm7_state, write_centronics_perror))
+ CENTRONICS(config, m_centronics, centronics_devices, "printer");
+ m_centronics->busy_handler().set(FUNC(fm7_state::write_centronics_busy));
+ m_centronics->fault_handler().set(FUNC(fm7_state::write_centronics_fault));
+ m_centronics->ack_handler().set(FUNC(fm7_state::write_centronics_ack));
+ m_centronics->perror_handler().set(FUNC(fm7_state::write_centronics_perror));
- MCFG_CENTRONICS_OUTPUT_LATCH_ADD("cent_data_out", "centronics")
-MACHINE_CONFIG_END
+ OUTPUT_LATCH(config, m_cent_data_out);
+ m_centronics->set_output_latch(*m_cent_data_out);
+}
-MACHINE_CONFIG_START(fm7_state::fm77av)
+void fm7_state::fm77av(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", MC6809E, 16.128_MHz_XTAL / 8)
- MCFG_DEVICE_PROGRAM_MAP(fm77av_mem)
- MCFG_DEVICE_IRQ_ACKNOWLEDGE_DRIVER(fm7_state,fm7_irq_ack)
- MCFG_QUANTUM_PERFECT_CPU("maincpu")
+ MC6809E(config, m_maincpu, 16.128_MHz_XTAL / 8);
+ m_maincpu->set_addrmap(AS_PROGRAM, &fm7_state::fm77av_mem);
+ m_maincpu->set_irq_acknowledge_callback(FUNC(fm7_state::fm7_irq_ack));
+ config.m_perfect_cpu_quantum = subtag("maincpu");
- MCFG_DEVICE_ADD("sub", MC6809E, 16.128_MHz_XTAL / 8)
- MCFG_DEVICE_PROGRAM_MAP(fm77av_sub_mem)
- MCFG_DEVICE_IRQ_ACKNOWLEDGE_DRIVER(fm7_state,fm7_sub_irq_ack)
- MCFG_QUANTUM_PERFECT_CPU("sub")
+ MC6809E(config, m_sub, 16.128_MHz_XTAL / 8);
+ m_sub->set_addrmap(AS_PROGRAM, &fm7_state::fm77av_sub_mem);
+ m_sub->set_irq_acknowledge_callback(FUNC(fm7_state::fm7_sub_irq_ack));
+ config.m_perfect_cpu_quantum = subtag("sub");
SPEAKER(config, "mono").front_center();
YM2203(config, m_ym, 4.9152_MHz_XTAL / 4);
@@ -2150,7 +2153,7 @@ MACHINE_CONFIG_START(fm7_state::fm77av)
m_ym->port_b_read_callback().set(FUNC(fm7_state::fm77av_joy_2_r));
m_ym->add_route(ALL_OUTPUTS,"mono", 1.00);
BEEP(config, "beeper", 1200).add_route(ALL_OUTPUTS, "mono", 0.50);
- WAVE(config, "wave", "cassette").add_route(ALL_OUTPUTS, "mono", 0.25);
+ WAVE(config, "wave", m_cassette).add_route(ALL_OUTPUTS, "mono", 0.25);
MCFG_MACHINE_START_OVERRIDE(fm7_state,fm77av)
@@ -2160,19 +2163,19 @@ MACHINE_CONFIG_START(fm7_state::fm77av)
}
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_RAW_PARAMS(16.128_MHz_XTAL, 1024, 0, 640, 262, 0, 200)
- MCFG_SCREEN_UPDATE_DRIVER(fm7_state, screen_update_fm7)
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_raw(16.128_MHz_XTAL, 1024, 0, 640, 262, 0, 200);
+ m_screen->set_screen_update(FUNC(fm7_state::screen_update_fm7));
PALETTE(config, m_palette, palette_device::BRG_3BIT);
- MCFG_PALETTE_ADD("av_palette", 4096)
+ PALETTE(config, m_av_palette).set_entries(4096);
- MCFG_CASSETTE_ADD("cassette")
- MCFG_CASSETTE_FORMATS(fm7_cassette_formats)
- MCFG_CASSETTE_DEFAULT_STATE(CASSETTE_STOPPED | CASSETTE_MOTOR_DISABLED | CASSETTE_SPEAKER_ENABLED)
- MCFG_CASSETTE_INTERFACE("fm7_cass")
+ CASSETTE(config, m_cassette);
+ m_cassette->set_formats(fm7_cassette_formats);
+ m_cassette->set_default_state(CASSETTE_STOPPED | CASSETTE_MOTOR_DISABLED | CASSETTE_SPEAKER_ENABLED);
+ m_cassette->set_interface("fm7_cass");
- MCFG_SOFTWARE_LIST_COMPATIBLE_ADD("cass_list", "fm7_cass")
+ SOFTWARE_LIST(config, "cass_list").set_compatible("fm7_cass");
MB8877(config, m_fdc, 8_MHz_XTAL / 8);
m_fdc->intrq_wr_callback().set(FUNC(fm7_state::fm7_fdc_intrq_w));
@@ -2181,37 +2184,39 @@ MACHINE_CONFIG_START(fm7_state::fm77av)
FLOPPY_CONNECTOR(config, m_floppy0, fm7_floppies, "qd", floppy_image_device::default_floppy_formats);
FLOPPY_CONNECTOR(config, m_floppy1, fm7_floppies, "qd", floppy_image_device::default_floppy_formats);
- MCFG_SOFTWARE_LIST_ADD("av_flop_list", "fm77av")
- MCFG_SOFTWARE_LIST_COMPATIBLE_ADD("flop_list", "fm7_disk")
+ SOFTWARE_LIST(config, "av_flop_list").set_original("fm77av");
+ SOFTWARE_LIST(config, "flop_list").set_compatible("fm7_disk");
- MCFG_DEVICE_ADD("centronics", CENTRONICS, centronics_devices, "printer")
- MCFG_CENTRONICS_BUSY_HANDLER(WRITELINE(*this, fm7_state, write_centronics_busy))
- MCFG_CENTRONICS_FAULT_HANDLER(WRITELINE(*this, fm7_state, write_centronics_fault))
- MCFG_CENTRONICS_ACK_HANDLER(WRITELINE(*this, fm7_state, write_centronics_ack))
- MCFG_CENTRONICS_PERROR_HANDLER(WRITELINE(*this, fm7_state, write_centronics_perror))
+ CENTRONICS(config, m_centronics, centronics_devices, "printer");
+ m_centronics->busy_handler().set(FUNC(fm7_state::write_centronics_busy));
+ m_centronics->fault_handler().set(FUNC(fm7_state::write_centronics_fault));
+ m_centronics->ack_handler().set(FUNC(fm7_state::write_centronics_ack));
+ m_centronics->perror_handler().set(FUNC(fm7_state::write_centronics_perror));
- MCFG_CENTRONICS_OUTPUT_LATCH_ADD("cent_data_out", "centronics")
-MACHINE_CONFIG_END
+ OUTPUT_LATCH(config, m_cent_data_out);
+ m_centronics->set_output_latch(*m_cent_data_out);
+}
-MACHINE_CONFIG_START(fm7_state::fm11)
+void fm7_state::fm11(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", MC6809E, 2000000) // 2MHz 68B09E
- MCFG_DEVICE_PROGRAM_MAP(fm11_mem)
- MCFG_DEVICE_IRQ_ACKNOWLEDGE_DRIVER(fm7_state,fm7_irq_ack)
- MCFG_QUANTUM_PERFECT_CPU("maincpu")
+ MC6809E(config, m_maincpu, 2000000); // 2MHz 68B09E
+ m_maincpu->set_addrmap(AS_PROGRAM, &fm7_state::fm11_mem);
+ m_maincpu->set_irq_acknowledge_callback(FUNC(fm7_state::fm7_irq_ack));
+ config.m_perfect_cpu_quantum = subtag("maincpu");
- MCFG_DEVICE_ADD("sub", MC6809, 8000000) // 2MHz 68B09
- MCFG_DEVICE_PROGRAM_MAP(fm11_sub_mem)
- MCFG_DEVICE_IRQ_ACKNOWLEDGE_DRIVER(fm7_state,fm7_sub_irq_ack)
- MCFG_QUANTUM_PERFECT_CPU("sub")
+ MC6809(config, m_sub, 8000000); // 2MHz 68B09
+ m_sub->set_addrmap(AS_PROGRAM, &fm7_state::fm11_sub_mem);
+ m_sub->set_irq_acknowledge_callback(FUNC(fm7_state::fm7_sub_irq_ack));
+ config.m_perfect_cpu_quantum = subtag("sub");
- MCFG_DEVICE_ADD("x86", I8088, 8000000) // 8MHz i8088
- MCFG_DEVICE_PROGRAM_MAP(fm11_x86_mem)
- MCFG_DEVICE_IO_MAP(fm11_x86_io)
+ I8088(config, m_x86, 8000000); // 8MHz i8088
+ m_x86->set_addrmap(AS_PROGRAM, &fm7_state::fm11_x86_mem);
+ m_x86->set_addrmap(AS_IO, &fm7_state::fm11_x86_io);
SPEAKER(config, "mono").front_center();
BEEP(config, m_beeper, 1200).add_route(ALL_OUTPUTS, "mono", 0.50);
- WAVE(config, "wave", "cassette").add_route(ALL_OUTPUTS, "mono", 0.25);
+ WAVE(config, "wave", m_cassette).add_route(ALL_OUTPUTS, "mono", 0.25);
MCFG_MACHINE_START_OVERRIDE(fm7_state,fm11)
@@ -2221,16 +2226,16 @@ MACHINE_CONFIG_START(fm7_state::fm11)
}
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_RAW_PARAMS(16128000, 1024, 0, 640, 262, 0, 200)
- MCFG_SCREEN_UPDATE_DRIVER(fm7_state, screen_update_fm7)
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_raw(16128000, 1024, 0, 640, 262, 0, 200);
+ m_screen->set_screen_update(FUNC(fm7_state::screen_update_fm7));
PALETTE(config, m_palette, palette_device::BRG_3BIT);
- MCFG_CASSETTE_ADD("cassette")
- MCFG_CASSETTE_FORMATS(fm7_cassette_formats)
- MCFG_CASSETTE_DEFAULT_STATE(CASSETTE_STOPPED | CASSETTE_MOTOR_DISABLED | CASSETTE_SPEAKER_ENABLED)
- MCFG_CASSETTE_INTERFACE("fm7_cass")
+ CASSETTE(config, m_cassette);
+ m_cassette->set_formats(fm7_cassette_formats);
+ m_cassette->set_default_state(CASSETTE_STOPPED | CASSETTE_MOTOR_DISABLED | CASSETTE_SPEAKER_ENABLED);
+ m_cassette->set_interface("fm7_cass");
MB8877(config, m_fdc, 8_MHz_XTAL / 8);
m_fdc->intrq_wr_callback().set(FUNC(fm7_state::fm7_fdc_intrq_w));
@@ -2239,44 +2244,46 @@ MACHINE_CONFIG_START(fm7_state::fm11)
FLOPPY_CONNECTOR(config, m_floppy0, fm7_floppies, "qd", floppy_image_device::default_floppy_formats);
FLOPPY_CONNECTOR(config, m_floppy1, fm7_floppies, "qd", floppy_image_device::default_floppy_formats);
- MCFG_DEVICE_ADD("centronics", CENTRONICS, centronics_devices, "printer")
- MCFG_CENTRONICS_BUSY_HANDLER(WRITELINE(*this, fm7_state, write_centronics_busy))
- MCFG_CENTRONICS_FAULT_HANDLER(WRITELINE(*this, fm7_state, write_centronics_fault))
- MCFG_CENTRONICS_ACK_HANDLER(WRITELINE(*this, fm7_state, write_centronics_ack))
- MCFG_CENTRONICS_PERROR_HANDLER(WRITELINE(*this, fm7_state, write_centronics_perror))
+ CENTRONICS(config, m_centronics, centronics_devices, "printer");
+ m_centronics->busy_handler().set(FUNC(fm7_state::write_centronics_busy));
+ m_centronics->fault_handler().set(FUNC(fm7_state::write_centronics_fault));
+ m_centronics->ack_handler().set(FUNC(fm7_state::write_centronics_ack));
+ m_centronics->perror_handler().set(FUNC(fm7_state::write_centronics_perror));
- MCFG_CENTRONICS_OUTPUT_LATCH_ADD("cent_data_out", "centronics")
-MACHINE_CONFIG_END
+ OUTPUT_LATCH(config, m_cent_data_out);
+ m_centronics->set_output_latch(*m_cent_data_out);
+}
-MACHINE_CONFIG_START(fm7_state::fm16beta)
+void fm7_state::fm16beta(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", I8086, 8000000) // 8MHz i8086
- MCFG_DEVICE_PROGRAM_MAP(fm16_mem)
- MCFG_DEVICE_IO_MAP(fm16_io)
- MCFG_QUANTUM_PERFECT_CPU("maincpu")
+ I8086(config, m_maincpu, 8000000); // 8MHz i8086
+ m_maincpu->set_addrmap(AS_PROGRAM, &fm7_state::fm16_mem);
+ m_maincpu->set_addrmap(AS_IO, &fm7_state::fm16_io);
+ config.m_perfect_cpu_quantum = subtag("maincpu");
- MCFG_DEVICE_ADD("sub", MC6809, 8000000)
- MCFG_DEVICE_IRQ_ACKNOWLEDGE_DRIVER(fm7_state,fm7_sub_irq_ack)
- MCFG_DEVICE_PROGRAM_MAP(fm16_sub_mem)
- MCFG_QUANTUM_PERFECT_CPU("sub")
+ MC6809(config, m_sub, 8000000);
+ m_sub->set_irq_acknowledge_callback(FUNC(fm7_state::fm7_sub_irq_ack));
+ m_sub->set_addrmap(AS_PROGRAM, &fm7_state::fm16_sub_mem);
+ config.m_perfect_cpu_quantum = subtag("sub");
SPEAKER(config, "mono").front_center();
BEEP(config, m_beeper, 1200).add_route(ALL_OUTPUTS, "mono", 0.50);
- WAVE(config, "wave", "cassette").add_route(ALL_OUTPUTS, "mono", 0.25);
+ WAVE(config, "wave", m_cassette).add_route(ALL_OUTPUTS, "mono", 0.25);
MCFG_MACHINE_START_OVERRIDE(fm7_state,fm16)
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_RAW_PARAMS(16128000, 1024, 0, 640, 262, 0, 200)
- MCFG_SCREEN_UPDATE_DRIVER(fm7_state, screen_update_fm7)
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_raw(16128000, 1024, 0, 640, 262, 0, 200);
+ m_screen->set_screen_update(FUNC(fm7_state::screen_update_fm7));
PALETTE(config, m_palette, palette_device::BRG_3BIT);
- MCFG_CASSETTE_ADD("cassette")
- MCFG_CASSETTE_FORMATS(fm7_cassette_formats)
- MCFG_CASSETTE_DEFAULT_STATE(CASSETTE_STOPPED | CASSETTE_MOTOR_DISABLED | CASSETTE_SPEAKER_ENABLED)
- MCFG_CASSETTE_INTERFACE("fm7_cass")
+ CASSETTE(config, m_cassette);
+ m_cassette->set_formats(fm7_cassette_formats);
+ m_cassette->set_default_state(CASSETTE_STOPPED | CASSETTE_MOTOR_DISABLED | CASSETTE_SPEAKER_ENABLED);
+ m_cassette->set_interface("fm7_cass");
MB8877(config, m_fdc, 8_MHz_XTAL / 8);
m_fdc->intrq_wr_callback().set(FUNC(fm7_state::fm7_fdc_intrq_w));
@@ -2285,14 +2292,15 @@ MACHINE_CONFIG_START(fm7_state::fm16beta)
FLOPPY_CONNECTOR(config, m_floppy0, fm7_floppies, "qd", floppy_image_device::default_floppy_formats);
FLOPPY_CONNECTOR(config, m_floppy1, fm7_floppies, "qd", floppy_image_device::default_floppy_formats);
- MCFG_DEVICE_ADD("centronics", CENTRONICS, centronics_devices, "printer")
- MCFG_CENTRONICS_BUSY_HANDLER(WRITELINE(*this, fm7_state, write_centronics_busy))
- MCFG_CENTRONICS_FAULT_HANDLER(WRITELINE(*this, fm7_state, write_centronics_fault))
- MCFG_CENTRONICS_ACK_HANDLER(WRITELINE(*this, fm7_state, write_centronics_ack))
- MCFG_CENTRONICS_PERROR_HANDLER(WRITELINE(*this, fm7_state, write_centronics_perror))
+ CENTRONICS(config, m_centronics, centronics_devices, "printer");
+ m_centronics->busy_handler().set(FUNC(fm7_state::write_centronics_busy));
+ m_centronics->fault_handler().set(FUNC(fm7_state::write_centronics_fault));
+ m_centronics->ack_handler().set(FUNC(fm7_state::write_centronics_ack));
+ m_centronics->perror_handler().set(FUNC(fm7_state::write_centronics_perror));
- MCFG_CENTRONICS_OUTPUT_LATCH_ADD("cent_data_out", "centronics")
-MACHINE_CONFIG_END
+ OUTPUT_LATCH(config, m_cent_data_out);
+ m_centronics->set_output_latch(*m_cent_data_out);
+}
/* ROM definition */
ROM_START( fm8 )
diff --git a/src/mame/drivers/fontwriter.cpp b/src/mame/drivers/fontwriter.cpp
index 0663d015b89..62289cdfb36 100644
--- a/src/mame/drivers/fontwriter.cpp
+++ b/src/mame/drivers/fontwriter.cpp
@@ -112,35 +112,37 @@ void fontwriter_state::fw600_map(address_map &map)
static INPUT_PORTS_START( fontwriter )
INPUT_PORTS_END
-MACHINE_CONFIG_START(fontwriter_state::fontwriter)
- MCFG_DEVICE_ADD("maincpu", M37720S1, XTAL(16'000'000)) /* M37720S1 @ 16MHz - main CPU */
- MCFG_DEVICE_PROGRAM_MAP(main_map)
- MCFG_DEVICE_IO_MAP(io_map)
-
- MCFG_DEVICE_ADD("at28c16", AT28C16, 0)
-
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */)
- MCFG_SCREEN_UPDATE_DRIVER(fontwriter_state, screen_update)
- MCFG_SCREEN_SIZE(640, 400)
- MCFG_SCREEN_VISIBLE_AREA(0, 639, 0, 399)
-MACHINE_CONFIG_END
-
-MACHINE_CONFIG_START(fontwriter_state::fw600)
- MCFG_DEVICE_ADD("maincpu", M37720S1, XTAL(16'000'000)) /* M37720S1 @ 16MHz - main CPU */
- MCFG_DEVICE_PROGRAM_MAP(fw600_map)
- MCFG_DEVICE_IO_MAP(io_map)
-
- MCFG_DEVICE_ADD("at28c16", AT28C16, 0)
-
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */)
- MCFG_SCREEN_UPDATE_DRIVER(fontwriter_state, screen_update)
- MCFG_SCREEN_SIZE(640, 400)
- MCFG_SCREEN_VISIBLE_AREA(0, 639, 0, 399)
-MACHINE_CONFIG_END
+void fontwriter_state::fontwriter(machine_config &config)
+{
+ M37720S1(config, m_maincpu, XTAL(16'000'000)); /* M37720S1 @ 16MHz - main CPU */
+ m_maincpu->set_addrmap(AS_PROGRAM, &fontwriter_state::main_map);
+ m_maincpu->set_addrmap(AS_IO, &fontwriter_state::io_map);
+
+ AT28C16(config, "at28c16", 0);
+
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500) /* not accurate */);
+ screen.set_screen_update(FUNC(fontwriter_state::screen_update));
+ screen.set_size(640, 400);
+ screen.set_visarea_full();
+}
+
+void fontwriter_state::fw600(machine_config &config)
+{
+ M37720S1(config, m_maincpu, XTAL(16'000'000)); /* M37720S1 @ 16MHz - main CPU */
+ m_maincpu->set_addrmap(AS_PROGRAM, &fontwriter_state::fw600_map);
+ m_maincpu->set_addrmap(AS_IO, &fontwriter_state::io_map);
+
+ AT28C16(config, "at28c16", 0);
+
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500) /* not accurate */);
+ screen.set_screen_update(FUNC(fontwriter_state::screen_update));
+ screen.set_size(640, 400);
+ screen.set_visarea_full();
+}
ROM_START(fw600)
ROM_REGION(0x200000, "maincpu", 0) /* M37720 program ROM */
diff --git a/src/mame/drivers/foodf.cpp b/src/mame/drivers/foodf.cpp
index 245a9f8c002..d23a6b336bb 100644
--- a/src/mame/drivers/foodf.cpp
+++ b/src/mame/drivers/foodf.cpp
@@ -386,7 +386,7 @@ void foodf_state::foodf(machine_config &config)
pokey_device &pokey3(POKEY(config, "pokey3", MASTER_CLOCK/2/10));
pokey3.add_route(ALL_OUTPUTS, "mono", 0.33);
-MACHINE_CONFIG_END
+}
diff --git a/src/mame/drivers/force68k.cpp b/src/mame/drivers/force68k.cpp
index cb7a66ad7d7..e3c94231600 100644
--- a/src/mame/drivers/force68k.cpp
+++ b/src/mame/drivers/force68k.cpp
@@ -510,7 +510,7 @@ MACHINE_CONFIG_START(force68k_state::fccpu1_eprom_sockets)
MCFG_GENERIC_WIDTH(GENERIC_ROM16_WIDTH)
MCFG_GENERIC_ENDIAN(ENDIANNESS_BIG)
MCFG_GENERIC_LOAD(force68k_state, exp1_load)
-// MCFG_SOFTWARE_LIST_ADD("cart_list", "fccpu1_cart")
+// SOFTWARE_LIST(config, "cart_list").set_original("fccpu1_cart");
MACHINE_CONFIG_END
/***************************
@@ -543,15 +543,16 @@ static void fccpu1_vme_cards(device_slot_interface &device)
/*
* Machine configuration
*/
-MACHINE_CONFIG_START(force68k_state::fccpu1)
+void force68k_state::fccpu1(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M68000, XTAL(16'000'000) / 2)
- MCFG_DEVICE_PROGRAM_MAP(force68k_mem)
+ M68000(config, m_maincpu, XTAL(16'000'000) / 2);
+ m_maincpu->set_addrmap(AS_PROGRAM, &force68k_state::force68k_mem);
/* P3/Host Port config
* LO command causes ROM monitor to expect S-records on HOST port by default
* Implementation through nullmodem currently does not support handshakes so
- * the ROM momitor is over-run while checking for checksums etc if used with
+ * the ROM monitor is over-run while checking for checksums etc if used with
* UI mount <file> feature.
*/
ACIA6850(config, m_aciahost, 0);
@@ -595,49 +596,56 @@ MACHINE_CONFIG_START(force68k_state::fccpu1)
m_pit->h2_out_callback().set(m_centronics, FUNC(centronics_device::write_strobe));
// Centronics
- MCFG_DEVICE_ADD(m_centronics, CENTRONICS, centronics_devices, "printer")
- MCFG_CENTRONICS_ACK_HANDLER(WRITELINE (*this, force68k_state, centronics_ack_w))
- MCFG_CENTRONICS_BUSY_HANDLER(WRITELINE (*this, force68k_state, centronics_busy_w))
- MCFG_CENTRONICS_PERROR_HANDLER(WRITELINE (*this, force68k_state, centronics_perror_w))
- MCFG_CENTRONICS_SELECT_HANDLER(WRITELINE (*this, force68k_state, centronics_select_w))
- MCFG_CENTRONICS_OUTPUT_LATCH_ADD("cent_data_out", "centronics")
+ CENTRONICS(config, m_centronics, centronics_devices, "printer");
+ m_centronics->ack_handler().set(FUNC(force68k_state::centronics_ack_w));
+ m_centronics->busy_handler().set(FUNC(force68k_state::centronics_busy_w));
+ m_centronics->perror_handler().set(FUNC(force68k_state::centronics_perror_w));
+ m_centronics->select_handler().set(FUNC(force68k_state::centronics_select_w));
+
+ output_latch_device &latch(OUTPUT_LATCH(config, "cent_data_out"));
+ m_centronics->set_output_latch(latch);
// EPROM sockets
fccpu1_eprom_sockets(config);
// VME interface
- MCFG_VME_DEVICE_ADD("vme")
- MCFG_VME_SLOT_ADD("vme", 1, fccpu1_vme_cards, nullptr)
-MACHINE_CONFIG_END
+ VME(config, "vme", 0);
+ VME_SLOT(config, "slot1", fccpu1_vme_cards, nullptr, 1, "vme");
+}
#if 0 /*
* CPU-6 family is device and adressmap compatible with CPU-1 but with additions
* such as an optional 68881 FPU
*/
-MACHINE_CONFIG_START (force68k_state::fccpu6)
- MCFG_DEVICE_ADD ("maincpu", M68000, XTAL(8'000'000)) /* Jumper B10 Mode B */
- MCFG_DEVICE_PROGRAM_MAP (force68k_mem)
-MACHINE_CONFIG_END
+void force68k_state::fccpu6(machine_config &config)
+{
+ M68000(config, m_maincpu, XTAL(8'000'000)); /* Jumper B10 Mode B */
+ m_maincpu->set_addrmap(AS_PROGRAM, &force68k_state::force68k_mem);
+}
-MACHINE_CONFIG_START (force68k_state::fccpu6a)
- MCFG_DEVICE_ADD ("maincpu", M68000, XTAL(12'500'000)) /* Jumper B10 Mode A */
- MCFG_DEVICE_PROGRAM_MAP (force68k_mem)
-MACHINE_CONFIG_END
+void force68k_state::fccpu6a(machine_config &config)
+{
+ M68000(config, m_maincpu, XTAL(12'500'000)); /* Jumper B10 Mode A */
+ m_maincpu->set_addrmap(AS_PROGRAM, &force68k_state::force68k_mem);
+}
-MACHINE_CONFIG_START (force68k_state::fccpu6v)
- MCFG_DEVICE_ADD ("maincpu", M68010, XTAL(8'000'000)) /* Jumper B10 Mode B */
- MCFG_DEVICE_PROGRAM_MAP (force68k_mem)
-MACHINE_CONFIG_END
+void force68k_state::fccpu6v(machine_config &config)
+{
+ M68010(config, m_maincpu, XTAL(8'000'000)); /* Jumper B10 Mode B */
+ m_maincpu->set_addrmap(AS_PROGRAM, &force68k_state::force68k_mem);
+}
-MACHINE_CONFIG_START (force68k_state::fccpu6va)
- MCFG_DEVICE_ADD ("maincpu", M68010, XTAL(12'500'000)) /* Jumper B10 Mode A */
- MCFG_DEVICE_PROGRAM_MAP (force68k_mem)
-MACHINE_CONFIG_END
+void force68k_state::fccpu6va(machine_config &config)
+{
+ M68010(config, m_maincpu, XTAL(12'500'000)); /* Jumper B10 Mode A */
+ m_maincpu->set_addrmap(AS_PROGRAM, &force68k_state::force68k_mem);
+}
-MACHINE_CONFIG_START (force68k_state::fccpu6vb)
- MCFG_DEVICE_ADD ("maincpu", M68010, XTAL(12'500'000)) /* Jumper B10 Mode A */
- MCFG_DEVICE_PROGRAM_MAP (force68k_mem)
-MACHINE_CONFIG_END
+void force68k_state::fccpu6vb(machine_config &config)
+{
+ M68010(config, m_maincpu, XTAL(12'500'000)); /* Jumper B10 Mode A */
+ m_maincpu->set_addrmap(AS_PROGRAM, &force68k_state::force68k_mem);
+}
#endif
/* ROM definitions */
diff --git a/src/mame/drivers/forte2.cpp b/src/mame/drivers/forte2.cpp
index c2327fcedd4..68a74089f7a 100644
--- a/src/mame/drivers/forte2.cpp
+++ b/src/mame/drivers/forte2.cpp
@@ -81,8 +81,7 @@ void forte2_state::io_mem(address_map &map)
{
map.unmap_value_high();
map.global_mask(0xff);
- map(0x98, 0x98).rw("tms9928a", FUNC(tms9928a_device::vram_r), FUNC(tms9928a_device::vram_w));
- map(0x99, 0x99).rw("tms9928a", FUNC(tms9928a_device::register_r), FUNC(tms9928a_device::register_w));
+ map(0x98, 0x99).rw("tms9928a", FUNC(tms9928a_device::read), FUNC(tms9928a_device::write));
map(0xa0, 0xa1).w("aysnd", FUNC(ay8910_device::address_data_w));
map(0xa2, 0xa2).r("aysnd", FUNC(ay8910_device::data_r));
// AM_RANGE(0xa8, 0xa8) AM_RAM // Ports a8-ab are originally for communicating with the i8255 PPI on MSX.
diff --git a/src/mame/drivers/fortecar.cpp b/src/mame/drivers/fortecar.cpp
index c6efb77ede0..38b45db6503 100644
--- a/src/mame/drivers/fortecar.cpp
+++ b/src/mame/drivers/fortecar.cpp
@@ -441,18 +441,18 @@ R = 82 Ohms Pull Down.
bit0 = BIT(color_prom[i], 0);
bit1 = BIT(color_prom[i], 1);
bit2 = BIT(color_prom[i], 2);
- int const r = combine_3_weights(weights_r, bit0, bit1, bit2);
+ int const r = combine_weights(weights_r, bit0, bit1, bit2);
// green component
bit0 = BIT(color_prom[i], 3);
bit1 = BIT(color_prom[i], 4);
bit2 = BIT(color_prom[i], 5);
- int const g = combine_3_weights(weights_g, bit0, bit1, bit2);
+ int const g = combine_weights(weights_g, bit0, bit1, bit2);
// blue component
bit0 = BIT(color_prom[i], 6);
bit1 = BIT(color_prom[i], 7);
- int const b = combine_2_weights(weights_b, bit0, bit1);
+ int const b = combine_weights(weights_b, bit0, bit1);
palette.set_pen_color(i, rgb_t(r, g, b));
}
@@ -682,24 +682,25 @@ void fortecar_state::machine_reset()
* Machine Drivers *
***********************************/
-MACHINE_CONFIG_START(fortecar_state::fortecar)
+void fortecar_state::fortecar(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, CPU_CLOCK) /* 3 MHz, measured */
- MCFG_DEVICE_PROGRAM_MAP(fortecar_map)
- MCFG_DEVICE_IO_MAP(fortecar_ports)
+ Z80(config, m_maincpu, CPU_CLOCK); /* 3 MHz, measured */
+ m_maincpu->set_addrmap(AS_PROGRAM, &fortecar_state::fortecar_map);
+ m_maincpu->set_addrmap(AS_IO, &fortecar_state::fortecar_ports);
WATCHDOG_TIMER(config, m_watchdog).set_time(attotime::from_msec(200)); /* guess */
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(640, 256)
- MCFG_SCREEN_VISIBLE_AREA(0, 600-1, 0, 240-1) /* driven by CRTC */
- MCFG_SCREEN_UPDATE_DRIVER(fortecar_state, screen_update)
- MCFG_SCREEN_PALETTE(m_palette)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(640, 256);
+ screen.set_visarea(0, 600-1, 0, 240-1); /* driven by CRTC */
+ screen.set_screen_update(FUNC(fortecar_state::screen_update));
+ screen.set_palette(m_palette);
EEPROM_93C56_16BIT(config, "eeprom").default_value(0);
@@ -728,7 +729,7 @@ MACHINE_CONFIG_START(fortecar_state::fortecar)
aysnd.port_a_write_callback().set(FUNC(fortecar_state::ayporta_w));
aysnd.port_b_write_callback().set(FUNC(fortecar_state::ayportb_w));
aysnd.add_route(ALL_OUTPUTS, "mono", 0.50);
-MACHINE_CONFIG_END
+}
/*******************************
diff --git a/src/mame/drivers/fp1100.cpp b/src/mame/drivers/fp1100.cpp
index cfa68976a50..a6dd5521607 100644
--- a/src/mame/drivers/fp1100.cpp
+++ b/src/mame/drivers/fp1100.cpp
@@ -638,12 +638,13 @@ void fp1100_state::init_fp1100()
membank("bankw0")->configure_entry(0, &wram[0x0000]);
}
-MACHINE_CONFIG_START(fp1100_state::fp1100)
+void fp1100_state::fp1100(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, MAIN_CLOCK/4)
- MCFG_DEVICE_PROGRAM_MAP(main_map)
- MCFG_DEVICE_IO_MAP(io_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", fp1100_state, vblank_irq)
+ Z80(config, m_maincpu, MAIN_CLOCK/4);
+ m_maincpu->set_addrmap(AS_PROGRAM, &fp1100_state::main_map);
+ m_maincpu->set_addrmap(AS_IO, &fp1100_state::io_map);
+ m_maincpu->set_vblank_int("screen", FUNC(fp1100_state::vblank_irq));
upd7801_device &sub(UPD7801(config, m_subcpu, MAIN_CLOCK/4));
sub.set_addrmap(AS_PROGRAM, &fp1100_state::sub_map);
@@ -655,14 +656,14 @@ MACHINE_CONFIG_START(fp1100_state::fp1100)
sub.txd_func().set(FUNC(fp1100_state::cass_w));
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */
- MCFG_SCREEN_SIZE(640, 480)
- MCFG_SCREEN_VISIBLE_AREA(0, 640-1, 0, 480-1)
- MCFG_SCREEN_UPDATE_DEVICE("crtc", h46505_device, screen_update)
- MCFG_PALETTE_ADD("palette", 8)
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_fp1100)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */
+ screen.set_size(640, 480);
+ screen.set_visarea_full();
+ screen.set_screen_update("crtc", FUNC(h46505_device::screen_update));
+ PALETTE(config, m_palette).set_entries(8);
+ GFXDECODE(config, "gfxdecode", m_palette, gfx_fp1100);
/* sound hardware */
SPEAKER(config, "mono").front_center();
@@ -677,15 +678,17 @@ MACHINE_CONFIG_START(fp1100_state::fp1100)
m_crtc->set_update_row_callback(FUNC(fp1100_state::crtc_update_row), this);
/* Printer */
- MCFG_DEVICE_ADD(m_centronics, CENTRONICS, centronics_devices, "printer")
- MCFG_CENTRONICS_BUSY_HANDLER(WRITELINE(*this, fp1100_state, centronics_busy_w))
- MCFG_CENTRONICS_OUTPUT_LATCH_ADD("cent_data_out", "centronics")
+ CENTRONICS(config, m_centronics, centronics_devices, "printer");
+ m_centronics->busy_handler().set(FUNC(fp1100_state::centronics_busy_w));
+
+ output_latch_device &latch(OUTPUT_LATCH(config, "cent_data_out"));
+ m_centronics->set_output_latch(latch);
/* Cassette */
- MCFG_CASSETTE_ADD("cassette")
- MCFG_CASSETTE_DEFAULT_STATE(CASSETTE_PLAY | CASSETTE_MOTOR_DISABLED | CASSETTE_SPEAKER_ENABLED)
- MCFG_TIMER_DRIVER_ADD_PERIODIC("timer_c", fp1100_state, timer_c, attotime::from_hz(4800)) // cass write
-MACHINE_CONFIG_END
+ CASSETTE(config, m_cass);
+ m_cass->set_default_state(CASSETTE_PLAY | CASSETTE_MOTOR_DISABLED | CASSETTE_SPEAKER_ENABLED);
+ TIMER(config, "timer_c").configure_periodic(FUNC(fp1100_state::timer_c), attotime::from_hz(4800)); // cass write
+}
/* ROM definition */
ROM_START( fp1100 )
diff --git a/src/mame/drivers/fp6000.cpp b/src/mame/drivers/fp6000.cpp
index a819645df5f..ef42b50c823 100644
--- a/src/mame/drivers/fp6000.cpp
+++ b/src/mame/drivers/fp6000.cpp
@@ -170,13 +170,13 @@ WRITE8_MEMBER(fp6000_state::fp6000_pcg_w)
WRITE8_MEMBER(fp6000_state::fp6000_6845_address_w)
{
m_crtc_index = data;
- m_crtc->address_w(space, offset, data);
+ m_crtc->address_w(data);
}
WRITE8_MEMBER(fp6000_state::fp6000_6845_data_w)
{
m_crtc_vreg[m_crtc_index] = data;
- m_crtc->register_w(space, offset, data);
+ m_crtc->register_w(data);
}
void fp6000_state::fp6000_map(address_map &map)
@@ -297,31 +297,31 @@ void fp6000_state::machine_reset()
{
}
-MACHINE_CONFIG_START(fp6000_state::fp6000)
+void fp6000_state::fp6000(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", I8086, 16000000/2)
- MCFG_DEVICE_PROGRAM_MAP(fp6000_map)
- MCFG_DEVICE_IO_MAP(fp6000_io)
+ I8086(config, m_maincpu, 16000000/2);
+ m_maincpu->set_addrmap(AS_PROGRAM, &fp6000_state::fp6000_map);
+ m_maincpu->set_addrmap(AS_IO, &fp6000_state::fp6000_io);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */
- MCFG_SCREEN_SIZE(640, 480)
- MCFG_SCREEN_VISIBLE_AREA(0, 640-1, 0, 480-1)
- MCFG_SCREEN_UPDATE_DRIVER(fp6000_state, screen_update_fp6000)
- MCFG_SCREEN_PALETTE("palette")
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */
+ screen.set_size(640, 480);
+ screen.set_visarea_full();
+ screen.set_screen_update(FUNC(fp6000_state::screen_update_fp6000));
+ screen.set_palette(m_palette);
H46505(config, m_crtc, 16000000/5); /* unknown clock, hand tuned to get ~60 fps */
m_crtc->set_screen("screen");
m_crtc->set_show_border_area(false);
m_crtc->set_char_width(8);
- MCFG_PALETTE_ADD("palette", 8)
-// MCFG_PALETTE_INIT(black_and_white)
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_fp6000)
+ PALETTE(config, m_palette).set_entries(8);
-MACHINE_CONFIG_END
+ GFXDECODE(config, m_gfxdecode, m_palette, gfx_fp6000);
+}
/* ROM definition */
ROM_START( fp6000 )
diff --git a/src/mame/drivers/freekick.cpp b/src/mame/drivers/freekick.cpp
index 3d891327045..e39596ebe03 100644
--- a/src/mame/drivers/freekick.cpp
+++ b/src/mame/drivers/freekick.cpp
@@ -42,6 +42,68 @@ TODO:
To enter Test Mode - press Button1 durning RESET (code at $79d)
+****************************************************************************
+
+ Perfect Billiard/Gigas Omega
+ ---------------------- -----
+
+ GND A1 B1 GND GND 1A 1B GND
+ GND A2 B2 GND GND 2A 2B GND
+ +5V A3 B3 +5V +5V 3A 3B GND
+ +5V A4 B4 +5V +5V 4A 4B GND
+ +12V A5 B5 +12V +12V 5A 5B GND
+ SPEAKER(+) A6 B6 SPEAKER(-) SPEAKER(+) 6A 6B SPEAKER(-)
+ COIN METER 1 A7 B7 COIN METER 2 COIN A 7A 7B COUNTER B
+ COIN SW1 A8 B8 COIN SW2 COUNTER A 8A 8B COIN B
+ 1P START A9 B9 2P START 1P START 9A 9B 2P START
+ 1P UP A10 B10 2P UP COIN EMPTY SW 10A 10B
+ 1P DOWN A11 B11 2P DOWN 11A 11B
+ 1P LEFT A12 B12 2P LEFT 12A 12B
+ 1P RIGHT A13 B13 2P RIGHT 13A 13B
+ 1P SHOOT A14 B14 2P SHOOT 1P SHOOT 14A 14B 2P SHOOT
+ A15 B15 15A 15B
+ RED A16 B16 BLUE RED 16A 16B BLUE
+ GREEN A17 B17 SYNC GREEN 17A 17B SYNC
+ GND A18 B18 GND GND 18A 18B GND
+ 1P L 19A 19B 2P L
+ 1P R 20A 20B 2P R
+ +5V 21A 21B GND
+ AC IN 22A 22B AC OUT
+
+ Counter Run/Free Kick
+ ---------------------
+
+ GND 1B 1A GND
+ GND 2B 2A GND
+ +5V 3B 3A +5V
+ +5V 4B 4A +5V
+ 5B 5A
+ +12V 6B 6A +12V
+ INPUT PREVENTION KEY 7B 7A INPUT PREVENTION KEY
+ COUNTER B 8B 8A COUNTER A
+ 9B 9A
+ SPEAKER(-) 10B 10A SPEAKER(+)
+ 11B 11A
+ GREEN 12B 12A RED
+ SYNC 13B 13A BLUE
+ 14B 14A GND
+ 15B 15A
+ COIN B(SERVICE) 16B 16A COIN A
+ 2P START 17B 17A 1P START
+ 2P UP 18B 18A 1P UP
+ 2P DOWN 19B 19A 1P DOWN
+ 2P LEFT 20B 20A 1P LEFT
+ 2P RIGHT 21B 21A 1P RIGHT
+ 2P PUSH 1 22B 22A 1P PUSH 1
+ 2P PUSH 2 23B 23A 1P PUSH 2
+ 24B 24A
+ 2PL (Sensor Dial) 25B 25A 1PL (Sensor Dial)
+ 2PR (Sensor Dial) 26B 26A 1PR (Sensor Dial)
+ GND 27B 27A GND
+ GND 28B 28A GND
+
+****************************************************************************
+
*/
#include "emu.h"
@@ -206,10 +268,10 @@ void freekick_state::omega_map(address_map &map)
map(0xe800, 0xe800).portr("IN1");
map(0xf000, 0xf000).portr("DSW1").nopw(); //bankswitch ?
map(0xf800, 0xf800).portr("DSW2");
- map(0xfc00, 0xfc00).w("sn1", FUNC(sn76489a_device::command_w));
- map(0xfc01, 0xfc01).w("sn2", FUNC(sn76489a_device::command_w));
- map(0xfc02, 0xfc02).w("sn3", FUNC(sn76489a_device::command_w));
- map(0xfc03, 0xfc03).w("sn4", FUNC(sn76489a_device::command_w));
+ map(0xfc00, 0xfc00).w("sn1", FUNC(sn76489a_device::write));
+ map(0xfc01, 0xfc01).w("sn2", FUNC(sn76489a_device::write));
+ map(0xfc02, 0xfc02).w("sn3", FUNC(sn76489a_device::write));
+ map(0xfc03, 0xfc03).w("sn4", FUNC(sn76489a_device::write));
}
void freekick_state::pbillrd_map(address_map &map)
@@ -225,10 +287,10 @@ void freekick_state::pbillrd_map(address_map &map)
map(0xe800, 0xe800).portr("IN1");
map(0xf000, 0xf000).portr("DSW1").w(FUNC(freekick_state::pbillrd_bankswitch_w));
map(0xf800, 0xf800).portr("DSW2");
- map(0xfc00, 0xfc00).w("sn1", FUNC(sn76489a_device::command_w));
- map(0xfc01, 0xfc01).w("sn2", FUNC(sn76489a_device::command_w));
- map(0xfc02, 0xfc02).w("sn3", FUNC(sn76489a_device::command_w));
- map(0xfc03, 0xfc03).w("sn4", FUNC(sn76489a_device::command_w));
+ map(0xfc00, 0xfc00).w("sn1", FUNC(sn76489a_device::write));
+ map(0xfc01, 0xfc01).w("sn2", FUNC(sn76489a_device::write));
+ map(0xfc02, 0xfc02).w("sn3", FUNC(sn76489a_device::write));
+ map(0xfc03, 0xfc03).w("sn4", FUNC(sn76489a_device::write));
}
void freekick_state::decrypted_opcodes_map(address_map &map)
@@ -250,10 +312,10 @@ void freekick_state::freekick_map(address_map &map)
map(0xf802, 0xf802).nopr(); //MUST return bit 0 = 0, otherwise game resets
map(0xf803, 0xf803).r(FUNC(freekick_state::spinner_r));
map(0xf800, 0xf807).w(m_outlatch, FUNC(ls259_device::write_d0));
- map(0xfc00, 0xfc00).w("sn1", FUNC(sn76489a_device::command_w));
- map(0xfc01, 0xfc01).w("sn2", FUNC(sn76489a_device::command_w));
- map(0xfc02, 0xfc02).w("sn3", FUNC(sn76489a_device::command_w));
- map(0xfc03, 0xfc03).w("sn4", FUNC(sn76489a_device::command_w));
+ map(0xfc00, 0xfc00).w("sn1", FUNC(sn76489a_device::write));
+ map(0xfc01, 0xfc01).w("sn2", FUNC(sn76489a_device::write));
+ map(0xfc02, 0xfc02).w("sn3", FUNC(sn76489a_device::write));
+ map(0xfc03, 0xfc03).w("sn4", FUNC(sn76489a_device::write));
}
void freekick_state::gigas_map(address_map &map)
@@ -268,10 +330,10 @@ void freekick_state::gigas_map(address_map &map)
map(0xe800, 0xe800).portr("IN1");
map(0xf000, 0xf000).portr("DSW1").nopw(); //bankswitch ?
map(0xf800, 0xf800).portr("DSW2");
- map(0xfc00, 0xfc00).w("sn1", FUNC(sn76489a_device::command_w));
- map(0xfc01, 0xfc01).w("sn2", FUNC(sn76489a_device::command_w));
- map(0xfc02, 0xfc02).w("sn3", FUNC(sn76489a_device::command_w));
- map(0xfc03, 0xfc03).w("sn4", FUNC(sn76489a_device::command_w));
+ map(0xfc00, 0xfc00).w("sn1", FUNC(sn76489a_device::write));
+ map(0xfc01, 0xfc01).w("sn2", FUNC(sn76489a_device::write));
+ map(0xfc02, 0xfc02).w("sn3", FUNC(sn76489a_device::write));
+ map(0xfc03, 0xfc03).w("sn4", FUNC(sn76489a_device::write));
}
void freekick_state::omega_io_map(address_map &map)
@@ -730,12 +792,13 @@ MACHINE_RESET_MEMBER(freekick_state,oigas)
m_cnt = 0;
}
-MACHINE_CONFIG_START(freekick_state::omega)
- MCFG_DEVICE_ADD("maincpu", MC8123, XTAL(18'432'000)/6) // unknown divisor
- MCFG_DEVICE_PROGRAM_MAP(omega_map)
- MCFG_DEVICE_IO_MAP(omega_io_map)
- MCFG_DEVICE_OPCODES_MAP(decrypted_opcodes_map)
- MCFG_DEVICE_PERIODIC_INT_DRIVER(freekick_state, irq0_line_hold, 120) // measured on PCB
+void freekick_state::omega(machine_config &config)
+{
+ MC8123(config, m_maincpu, XTAL(18'432'000)/6); // unknown divisor
+ m_maincpu->set_addrmap(AS_PROGRAM, &freekick_state::omega_map);
+ m_maincpu->set_addrmap(AS_IO, &freekick_state::omega_io_map);
+ m_maincpu->set_addrmap(AS_OPCODES, &freekick_state::decrypted_opcodes_map);
+ m_maincpu->set_periodic_int(FUNC(freekick_state::irq0_line_hold), attotime::from_hz(120)); // measured on PCB
LS259(config, m_outlatch); // 3M
m_outlatch->q_out_cb<0>().set(FUNC(freekick_state::flipscreen_w));
@@ -745,37 +808,33 @@ MACHINE_CONFIG_START(freekick_state::omega)
m_outlatch->q_out_cb<5>().set_nop(); // ???
// video hardware
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_RAW_PARAMS(XTAL(18'432'000)/3, 768/2, 0, 512/2, 263, 0+16, 224+16) // unknown divisor
- MCFG_SCREEN_UPDATE_DRIVER(freekick_state, screen_update_gigas)
- MCFG_SCREEN_PALETTE(m_palette)
- MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE(*this, freekick_state, vblank_irq))
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_raw(XTAL(18'432'000)/3, 768/2, 0, 512/2, 263, 0+16, 224+16); // unknown divisor
+ screen.set_screen_update(FUNC(freekick_state::screen_update_gigas));
+ screen.set_palette(m_palette);
+ screen.screen_vblank().set(FUNC(freekick_state::vblank_irq));
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_freekick)
+ GFXDECODE(config, m_gfxdecode, m_palette, gfx_freekick);
PALETTE(config, m_palette, palette_device::RGB_444_PROMS, "proms", 0x200);
// sound hardware
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("sn1", SN76489A, XTAL(18'432'000)/6) // unknown divisor
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.50)
-
- MCFG_DEVICE_ADD("sn2", SN76489A, XTAL(18'432'000)/6) // unknown divisor
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.50)
+ SN76489A(config, "sn1", XTAL(18'432'000)/6).add_route(ALL_OUTPUTS, "mono", 0.50); // unknown divisor
- MCFG_DEVICE_ADD("sn3", SN76489A, XTAL(18'432'000)/6) // unknown divisor
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.50)
+ SN76489A(config, "sn2", XTAL(18'432'000)/6).add_route(ALL_OUTPUTS, "mono", 0.50); // unknown divisor
- MCFG_DEVICE_ADD("sn4", SN76489A, XTAL(18'432'000)/6) // unknown divisor
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.50)
-MACHINE_CONFIG_END
+ SN76489A(config, "sn3", XTAL(18'432'000)/6).add_route(ALL_OUTPUTS, "mono", 0.50); // unknown divisor
-MACHINE_CONFIG_START(freekick_state::base)
+ SN76489A(config, "sn4", XTAL(18'432'000)/6).add_route(ALL_OUTPUTS, "mono", 0.50); // unknown divisor
+}
+void freekick_state::base(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, XTAL(12'000'000)/4)
- MCFG_DEVICE_PROGRAM_MAP(pbillrd_map)
- MCFG_DEVICE_PERIODIC_INT_DRIVER(freekick_state, irq0_line_hold, 120) // measured on PCB
+ Z80(config, m_maincpu, XTAL(12'000'000)/4);
+ m_maincpu->set_addrmap(AS_PROGRAM, &freekick_state::pbillrd_map);
+ m_maincpu->set_periodic_int(FUNC(freekick_state::irq0_line_hold), attotime::from_hz(120)); // measured on PCB
LS259(config, m_outlatch);
m_outlatch->q_out_cb<2>().set(FUNC(freekick_state::coin1_w));
@@ -783,30 +842,26 @@ MACHINE_CONFIG_START(freekick_state::base)
m_outlatch->q_out_cb<4>().set(FUNC(freekick_state::nmi_enable_w));
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_RAW_PARAMS(XTAL(12'000'000)/2, 768/2, 0, 512/2, 263, 0+16, 224+16)
- MCFG_SCREEN_UPDATE_DRIVER(freekick_state, screen_update_pbillrd)
- MCFG_SCREEN_PALETTE(m_palette)
- MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE(*this, freekick_state, vblank_irq))
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_raw(XTAL(12'000'000)/2, 768/2, 0, 512/2, 263, 0+16, 224+16);
+ screen.set_screen_update(FUNC(freekick_state::screen_update_pbillrd));
+ screen.set_palette(m_palette);
+ screen.screen_vblank().set(FUNC(freekick_state::vblank_irq));
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_freekick)
+ GFXDECODE(config, m_gfxdecode, m_palette, gfx_freekick);
PALETTE(config, m_palette, palette_device::RGB_444_PROMS, "proms", 0x200);
/* sound hardware */
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("sn1", SN76489A, XTAL(12'000'000)/4)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.50)
+ SN76489A(config, "sn1", XTAL(12'000'000)/4).add_route(ALL_OUTPUTS, "mono", 0.50);
- MCFG_DEVICE_ADD("sn2", SN76489A, XTAL(12'000'000)/4)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.50)
+ SN76489A(config, "sn2", XTAL(12'000'000)/4).add_route(ALL_OUTPUTS, "mono", 0.50);
- MCFG_DEVICE_ADD("sn3", SN76489A, XTAL(12'000'000)/4)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.50)
+ SN76489A(config, "sn3", XTAL(12'000'000)/4).add_route(ALL_OUTPUTS, "mono", 0.50);
- MCFG_DEVICE_ADD("sn4", SN76489A, XTAL(12'000'000)/4)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.50)
-MACHINE_CONFIG_END
+ SN76489A(config, "sn4", XTAL(12'000'000)/4).add_route(ALL_OUTPUTS, "mono", 0.50);
+}
void freekick_state::pbillrd(machine_config &config)
{
@@ -821,21 +876,22 @@ void freekick_state::pbillrd(machine_config &config)
MCFG_MACHINE_RESET_OVERRIDE(freekick_state,freekick)
}
-MACHINE_CONFIG_START(freekick_state::pbillrdm)
+void freekick_state::pbillrdm(machine_config &config)
+{
pbillrd(config);
- MCFG_DEVICE_REPLACE("maincpu", MC8123, XTAL(12'000'000)/4)
- MCFG_DEVICE_PROGRAM_MAP(pbillrd_map)
- MCFG_DEVICE_OPCODES_MAP(decrypted_opcodes_map)
- MCFG_DEVICE_PERIODIC_INT_DRIVER(freekick_state, irq0_line_hold, 120) // measured on PCB
-MACHINE_CONFIG_END
+ MC8123(config.replace(), m_maincpu, XTAL(12'000'000)/4);
+ m_maincpu->set_addrmap(AS_PROGRAM, &freekick_state::pbillrd_map);
+ m_maincpu->set_addrmap(AS_OPCODES, &freekick_state::decrypted_opcodes_map);
+ m_maincpu->set_periodic_int(FUNC(freekick_state::irq0_line_hold), attotime::from_hz(120)); // measured on PCB
+}
-MACHINE_CONFIG_START(freekick_state::freekick)
+void freekick_state::freekick(machine_config &config)
+{
base(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(freekick_map)
- MCFG_DEVICE_IO_MAP(freekick_io_map)
+ m_maincpu->set_addrmap(AS_PROGRAM, &freekick_state::freekick_map);
+ m_maincpu->set_addrmap(AS_IO, &freekick_state::freekick_io_map);
// 5C
m_outlatch->q_out_cb<0>().set(FUNC(freekick_state::flipscreen_w));
@@ -855,18 +911,17 @@ MACHINE_CONFIG_START(freekick_state::freekick)
ppi1.in_pc_callback().set_ioport("DSW3");
/* video hardware */
- MCFG_SCREEN_MODIFY("screen")
- MCFG_SCREEN_UPDATE_DRIVER(freekick_state, screen_update_freekick)
-MACHINE_CONFIG_END
+ subdevice<screen_device>("screen")->set_screen_update(FUNC(freekick_state::screen_update_freekick));
+}
-MACHINE_CONFIG_START(freekick_state::gigas)
+void freekick_state::gigas(machine_config &config)
+{
base(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(gigas_map)
- MCFG_DEVICE_IO_MAP(gigas_io_map)
- MCFG_DEVICE_OPCODES_MAP(decrypted_opcodes_map)
+ m_maincpu->set_addrmap(AS_PROGRAM, &freekick_state::gigas_map);
+ m_maincpu->set_addrmap(AS_IO, &freekick_state::gigas_io_map);
+ m_maincpu->set_addrmap(AS_OPCODES, &freekick_state::decrypted_opcodes_map);
m_outlatch->q_out_cb<0>().set(FUNC(freekick_state::flipscreen_w));
m_outlatch->q_out_cb<5>().set_nop(); // ???
@@ -875,19 +930,19 @@ MACHINE_CONFIG_START(freekick_state::gigas)
MCFG_MACHINE_RESET_OVERRIDE(freekick_state,freekick)
/* video hardware */
- MCFG_SCREEN_MODIFY("screen")
- MCFG_SCREEN_UPDATE_DRIVER(freekick_state, screen_update_gigas)
-MACHINE_CONFIG_END
+ subdevice<screen_device>("screen")->set_screen_update(FUNC(freekick_state::screen_update_gigas));
+}
-MACHINE_CONFIG_START(freekick_state::gigasm)
+void freekick_state::gigasm(machine_config &config)
+{
base(config);
/* basic machine hardware */
- MCFG_DEVICE_REPLACE("maincpu", MC8123, XTAL(12'000'000)/4)
- MCFG_DEVICE_PROGRAM_MAP(gigas_map)
- MCFG_DEVICE_IO_MAP(gigas_io_map)
- MCFG_DEVICE_OPCODES_MAP(decrypted_opcodes_map)
- MCFG_DEVICE_PERIODIC_INT_DRIVER(freekick_state, irq0_line_hold, 120) // measured on PCB
+ MC8123(config.replace(), m_maincpu, XTAL(12'000'000)/4);
+ m_maincpu->set_addrmap(AS_PROGRAM, &freekick_state::gigas_map);
+ m_maincpu->set_addrmap(AS_IO, &freekick_state::gigas_io_map);
+ m_maincpu->set_addrmap(AS_OPCODES, &freekick_state::decrypted_opcodes_map);
+ m_maincpu->set_periodic_int(FUNC(freekick_state::irq0_line_hold), attotime::from_hz(120)); // measured on PCB
m_outlatch->q_out_cb<0>().set(FUNC(freekick_state::flipscreen_w));
m_outlatch->q_out_cb<5>().set_nop(); // ???
@@ -896,20 +951,19 @@ MACHINE_CONFIG_START(freekick_state::gigasm)
MCFG_MACHINE_RESET_OVERRIDE(freekick_state,freekick)
/* video hardware */
- MCFG_SCREEN_MODIFY("screen")
- MCFG_SCREEN_UPDATE_DRIVER(freekick_state, screen_update_gigas)
-MACHINE_CONFIG_END
+ subdevice<screen_device>("screen")->set_screen_update(FUNC(freekick_state::screen_update_gigas));
+}
-MACHINE_CONFIG_START(freekick_state::oigas)
+void freekick_state::oigas(machine_config &config)
+{
gigas(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_IO_MAP(oigas_io_map)
+ m_maincpu->set_addrmap(AS_IO, &freekick_state::oigas_io_map);
MCFG_MACHINE_START_OVERRIDE(freekick_state,oigas)
MCFG_MACHINE_RESET_OVERRIDE(freekick_state,oigas)
-MACHINE_CONFIG_END
+}
@@ -1288,20 +1342,20 @@ Note: MCU dump (in oigas?) has fixed bits, but read is good. If not correct, it'
*/
ROM_START( gigasb )
ROM_REGION( 2*0xc000, "maincpu", 0 )
- ROM_LOAD( "g-7", 0x0c000, 0x4000, CRC(daf4e88d) SHA1(391dff914ce8e9b7975fc8827c066d7db16c4171) )
- ROM_CONTINUE( 0x00000, 0x4000 )
- ROM_LOAD( "g-8", 0x10000, 0x8000, CRC(4ab4c1f1) SHA1(63d8f489c7a8271e99a66d97e6eb0eb252cb2b67) )
- ROM_CONTINUE( 0x04000, 0x8000 )
+ ROM_LOAD( "g-7.r8", 0x0c000, 0x4000, CRC(daf4e88d) SHA1(391dff914ce8e9b7975fc8827c066d7db16c4171) )
+ ROM_CONTINUE( 0x00000, 0x4000 )
+ ROM_LOAD( "g-8.t8", 0x10000, 0x8000, CRC(4ab4c1f1) SHA1(63d8f489c7a8271e99a66d97e6eb0eb252cb2b67) )
+ ROM_CONTINUE( 0x04000, 0x8000 )
ROM_REGION( 0xc000, "gfx1", 0 ) /* GFX */
- ROM_LOAD( "g-4", 0x00000, 0x04000, CRC(8ed78981) SHA1(1f2c0584fcc6d04b042638c7b9a7e21fc560ca3d) )
- ROM_LOAD( "g-5", 0x04000, 0x04000, CRC(0645ec2d) SHA1(ecf8b1ce98f845b5b32e7fc959cea7679a149d74) )
- ROM_LOAD( "g-6", 0x08000, 0x04000, CRC(99e9cb27) SHA1(d141d6caa077e3cd182eb64cf803613ac17e7d09) )
+ ROM_LOAD( "g-4.3l", 0x00000, 0x04000, CRC(8ed78981) SHA1(1f2c0584fcc6d04b042638c7b9a7e21fc560ca3d) )
+ ROM_LOAD( "g-5.3k", 0x04000, 0x04000, CRC(0645ec2d) SHA1(ecf8b1ce98f845b5b32e7fc959cea7679a149d74) )
+ ROM_LOAD( "g-6.3fh", 0x08000, 0x04000, CRC(99e9cb27) SHA1(d141d6caa077e3cd182eb64cf803613ac17e7d09) )
ROM_REGION( 0xc000, "gfx2", 0 ) /* GFX */
- ROM_LOAD( "g-1", 0x00000, 0x04000, CRC(d78fae6e) SHA1(a7bf3b213f2a3a51b964959bd45003351670575a) )
- ROM_LOAD( "g-3", 0x04000, 0x04000, CRC(37df4a4c) SHA1(ab996db636d89845474529ba2573307046fb96ee) )
- ROM_LOAD( "g-2", 0x08000, 0x04000, CRC(3a46e354) SHA1(ebd6a5db4c9cdfc6fabe6b412a704aaf03c32d7c) )
+ ROM_LOAD( "g-1.3t", 0x00000, 0x04000, CRC(d78fae6e) SHA1(a7bf3b213f2a3a51b964959bd45003351670575a) )
+ ROM_LOAD( "g-3.3p", 0x04000, 0x04000, CRC(37df4a4c) SHA1(ab996db636d89845474529ba2573307046fb96ee) )
+ ROM_LOAD( "g-2.3r", 0x08000, 0x04000, CRC(3a46e354) SHA1(ebd6a5db4c9cdfc6fabe6b412a704aaf03c32d7c) )
ROM_REGION( 0x0600, "proms", 0 )
ROM_LOAD( "1.pr", 0x0000, 0x0100, CRC(a784e71f) SHA1(1741ce98d719bad6cc5ea42337ef897f2435bbab) ) /* 24S10N, 82S129 or compatible? */
@@ -1403,31 +1457,63 @@ ROM_END
// Omega code/gfx looks to be based on gigas mk2, given the "MarkII" graphic in the gfx roms and gigas MarkII style continue numbers etc
// PCB is marked "K.K NS6102-A" and seems to be somewhere between gigas hardware and freekick hardware (3x dipswitch arrays)
// Supposedly an extremely limited release with ~10 PCBs produced.
-ROM_START( omega )
+// A second PCB found with the CPU (under a metal cap) to be a NEC MC-8123 317-5002 - same as Gigas & Gigas Mark II, however
+// neither Omega set will work with the 317-5002 key in MAME, so maybe the CPU was factory reprogrammed?
+// A single byte difference at 0x1120 in 17.M10 (when decoded) looks like a legit bug fix as it changes a branch
+// which incorrectly jumps over a bit of initialization code
+
+ROM_START( omega ) // ROM at M10 labeled "17" to indicate a later Bug fix version
+ ROM_REGION(0xc000, "maincpu", 0) // encrypted
+ ROM_LOAD( "17.m10", 0x0000, 0x4000, CRC(c7de0993) SHA1(35ecd464935faba1dc7d0dbf48e1b17153626bfd) ) // 27128
+ ROM_LOAD( "8.n10", 0x4000, 0x8000, CRC(9bb61910) SHA1(f8a1210dbf93e901e246e6adf4cd905acc3ef376) ) // 27256
+
+ ROM_REGION(0x2000, "maincpu:key", 0) // MC8123 key
+ ROM_LOAD( "omega.key", 0x0000, 0x2000, CRC(0a63943f) SHA1(9e581ea0c5bf6c0ed5d402d3bab053766b8e44c2) )
+
+ ROM_REGION(0xc000, "gfx1", 0)
+ ROM_LOAD( "4.f10", 0x00000, 0x04000, CRC(bf780a8e) SHA1(53bfabf74f1a7782c6c1803498a24da0bf8db995) ) // 27128
+ ROM_LOAD( "5.h10", 0x04000, 0x04000, CRC(b491647f) SHA1(88017033a781ecc49a83241bc49e2077a480ac2b) ) // 27128
+ ROM_LOAD( "6.j10", 0x08000, 0x04000, CRC(65beba5b) SHA1(e6d61dc52dcbb30570b48d7b1d7807dd0be41400) ) // 27128
+
+ ROM_REGION(0xc000, "gfx2", 0)
+ ROM_LOAD( "3.d10", 0x00000, 0x04000, CRC(c678b202) SHA1(ee93385e11158ccaf51a22d813bd7020c04cfdad) ) // 27128
+ ROM_LOAD( "1.a10", 0x04000, 0x04000, CRC(e0aeada9) SHA1(ed00f6dca4f9701ff89390922d39341b179597c7) ) // 27128
+ ROM_LOAD( "2.c10", 0x08000, 0x04000, CRC(dbc0a47f) SHA1(b617c5a10c655e7befaeaecd9ce736e972285e6b) ) // 27128
+
+ ROM_REGION(0x600, "proms", 0)
+ ROM_LOAD( "tbp24s10n.3f", 0x0000, 0x100, CRC(75ec7472) SHA1(868811e838c570a0f576a0ece249cab2d4274d65) ) /* Or compatible type prom like the 82S129 */
+ ROM_LOAD( "tbp24s10n.4f", 0x0100, 0x100, CRC(5113a114) SHA1(3a5ab68c93d1f2c05ceb0311e12a54fd124d8435) )
+ ROM_LOAD( "tbp24s10n.3g", 0x0200, 0x100, CRC(b6b5d4a0) SHA1(2b7ba59a6c185326e11ce8ccd96b3c8cfd652fdf) )
+ ROM_LOAD( "tbp24s10n.4g", 0x0300, 0x100, CRC(931bc299) SHA1(f116f1d6a4324b86b0aae0a5a040236b3a4fd12d) )
+ ROM_LOAD( "tbp24s10n.3e", 0x0400, 0x100, CRC(899e089d) SHA1(5a485d3ef7d2102451ff76452cac106061cc5cd6) )
+ ROM_LOAD( "tbp24s10n.4e", 0x0500, 0x100, CRC(28321dd8) SHA1(4ba0f6c381ef929a476d4d7aa71b1397c48a644e) )
+ROM_END
+
+ROM_START( omegaa ) // ROM at M10 labeled "7" to indicate the original version skipping some initialization code
ROM_REGION(0xc000, "maincpu", 0) // encrypted
- ROM_LOAD("17.m10", 0x0000, 0x4000, CRC(c7de0993) SHA1(35ecd464935faba1dc7d0dbf48e1b17153626bfd)) // 27128
- ROM_LOAD("8.n10", 0x4000, 0x8000, CRC(9bb61910) SHA1(f8a1210dbf93e901e246e6adf4cd905acc3ef376)) // 27256
+ ROM_LOAD(" 7.m10", 0x0000, 0x4000, CRC(6e7d77e1) SHA1(7675cea41391595cd7a3e1893478185989f4c319) ) // 27128
+ ROM_LOAD(" 8.n10", 0x4000, 0x8000, CRC(9bb61910) SHA1(f8a1210dbf93e901e246e6adf4cd905acc3ef376) ) // 27256
ROM_REGION(0x2000, "maincpu:key", 0) // MC8123 key
- ROM_LOAD("omega.key", 0x0000, 0x2000, CRC(0a63943f) SHA1(9e581ea0c5bf6c0ed5d402d3bab053766b8e44c2))
+ ROM_LOAD( "omega.key", 0x0000, 0x2000, CRC(0a63943f) SHA1(9e581ea0c5bf6c0ed5d402d3bab053766b8e44c2) )
ROM_REGION(0xc000, "gfx1", 0)
- ROM_LOAD("4.f10", 0x00000, 0x04000, CRC(bf780a8e) SHA1(53bfabf74f1a7782c6c1803498a24da0bf8db995)) // 27128
- ROM_LOAD("5.h10", 0x04000, 0x04000, CRC(b491647f) SHA1(88017033a781ecc49a83241bc49e2077a480ac2b)) // 27128
- ROM_LOAD("6.j10", 0x08000, 0x04000, CRC(65beba5b) SHA1(e6d61dc52dcbb30570b48d7b1d7807dd0be41400)) // 27128
+ ROM_LOAD( "4.f10", 0x00000, 0x04000, CRC(bf780a8e) SHA1(53bfabf74f1a7782c6c1803498a24da0bf8db995) ) // 27128
+ ROM_LOAD( "5.h10", 0x04000, 0x04000, CRC(b491647f) SHA1(88017033a781ecc49a83241bc49e2077a480ac2b) ) // 27128
+ ROM_LOAD( "6.j10", 0x08000, 0x04000, CRC(65beba5b) SHA1(e6d61dc52dcbb30570b48d7b1d7807dd0be41400) ) // 27128
ROM_REGION(0xc000, "gfx2", 0)
- ROM_LOAD("3.d10", 0x00000, 0x04000, CRC(c678b202) SHA1(ee93385e11158ccaf51a22d813bd7020c04cfdad)) // 27128
- ROM_LOAD("1.a10", 0x04000, 0x04000, CRC(e0aeada9) SHA1(ed00f6dca4f9701ff89390922d39341b179597c7)) // 27128
- ROM_LOAD("2.c10", 0x08000, 0x04000, CRC(dbc0a47f) SHA1(b617c5a10c655e7befaeaecd9ce736e972285e6b)) // 27128
+ ROM_LOAD( "3.d10", 0x00000, 0x04000, CRC(c678b202) SHA1(ee93385e11158ccaf51a22d813bd7020c04cfdad) ) // 27128
+ ROM_LOAD( "1.a10", 0x04000, 0x04000, CRC(e0aeada9) SHA1(ed00f6dca4f9701ff89390922d39341b179597c7) ) // 27128
+ ROM_LOAD( "2.c10", 0x08000, 0x04000, CRC(dbc0a47f) SHA1(b617c5a10c655e7befaeaecd9ce736e972285e6b) ) // 27128
ROM_REGION(0x600, "proms", 0)
- ROM_LOAD("tbp24s10n.3f", 0x0000, 0x100, CRC(75ec7472) SHA1(868811e838c570a0f576a0ece249cab2d4274d65) ) /* Or compatible type prom like the 82S129 */
- ROM_LOAD("tbp24s10n.4f", 0x0100, 0x100, CRC(5113a114) SHA1(3a5ab68c93d1f2c05ceb0311e12a54fd124d8435) )
- ROM_LOAD("tbp24s10n.3g", 0x0200, 0x100, CRC(b6b5d4a0) SHA1(2b7ba59a6c185326e11ce8ccd96b3c8cfd652fdf) )
- ROM_LOAD("tbp24s10n.4g", 0x0300, 0x100, CRC(931bc299) SHA1(f116f1d6a4324b86b0aae0a5a040236b3a4fd12d) )
- ROM_LOAD("tbp24s10n.3e", 0x0400, 0x100, CRC(899e089d) SHA1(5a485d3ef7d2102451ff76452cac106061cc5cd6) )
- ROM_LOAD("tbp24s10n.4e", 0x0500, 0x100, CRC(28321dd8) SHA1(4ba0f6c381ef929a476d4d7aa71b1397c48a644e) )
+ ROM_LOAD( "tbp24s10n.3f", 0x0000, 0x100, CRC(75ec7472) SHA1(868811e838c570a0f576a0ece249cab2d4274d65) ) /* Or compatible type prom like the 82S129 */
+ ROM_LOAD( "tbp24s10n.4f", 0x0100, 0x100, CRC(5113a114) SHA1(3a5ab68c93d1f2c05ceb0311e12a54fd124d8435) )
+ ROM_LOAD( "tbp24s10n.3g", 0x0200, 0x100, CRC(b6b5d4a0) SHA1(2b7ba59a6c185326e11ce8ccd96b3c8cfd652fdf) )
+ ROM_LOAD( "tbp24s10n.4g", 0x0300, 0x100, CRC(931bc299) SHA1(f116f1d6a4324b86b0aae0a5a040236b3a4fd12d) )
+ ROM_LOAD( "tbp24s10n.3e", 0x0400, 0x100, CRC(899e089d) SHA1(5a485d3ef7d2102451ff76452cac106061cc5cd6) )
+ ROM_LOAD( "tbp24s10n.4e", 0x0500, 0x100, CRC(28321dd8) SHA1(4ba0f6c381ef929a476d4d7aa71b1397c48a644e) )
ROM_END
@@ -1473,7 +1559,8 @@ GAME( 1986, gigasb, gigas, gigas, gigas, freekick_state, init_gigas
GAME( 1986, oigas, gigas , oigas, gigas, freekick_state, init_gigasb, ROT270, "bootleg", "Oigas (bootleg)", MACHINE_SUPPORTS_SAVE )
GAME( 1986, gigasm2, 0, gigasm, gigasm2, freekick_state, init_gigas, ROT270, "Sega", "Gigas Mark II (MC-8123, 317-5002)", MACHINE_SUPPORTS_SAVE )
GAME( 1986, gigasm2b, gigasm2, gigas, gigasm2, freekick_state, init_gigasb, ROT270, "bootleg", "Gigas Mark II (bootleg)", MACHINE_SUPPORTS_SAVE )
-GAME( 1986, omega, 0, omega, omega, freekick_state, init_gigas, ROT270, "Nihon System", "Omega", MACHINE_SUPPORTS_SAVE )
+GAME( 1986, omega, 0, omega, omega, freekick_state, init_gigas, ROT270, "Nihon System", "Omega", MACHINE_SUPPORTS_SAVE ) // Bug fix version
+GAME( 1986, omegaa, omega, omega, omega, freekick_state, init_gigas, ROT270, "Nihon System", "Omega (earlier)", MACHINE_SUPPORTS_SAVE )
GAME( 1987, pbillrd, 0, pbillrd, pbillrd, freekick_state, empty_init, ROT0, "Nihon System", "Perfect Billiard", MACHINE_SUPPORTS_SAVE )
GAME( 1987, pbillrds, pbillrd, pbillrdm, pbillrd, freekick_state, init_pbillrds, ROT0, "Nihon System", "Perfect Billiard (MC-8123, 317-0030)", MACHINE_SUPPORTS_SAVE )
GAME( 1987, pbillrdsa, pbillrd, pbillrdm, pbillrd, freekick_state, init_pbillrds, ROT0, "Nihon System", "Perfect Billiard (MC-8123, 317-5008)", MACHINE_SUPPORTS_SAVE ) // sticker on CPU module different (wrong?) functionality the same
diff --git a/src/mame/drivers/freeway.cpp b/src/mame/drivers/freeway.cpp
new file mode 100644
index 00000000000..38db5cdcc93
--- /dev/null
+++ b/src/mame/drivers/freeway.cpp
@@ -0,0 +1,191 @@
+// license:BSD-3-Clause
+// copyright-holders:AJR
+/*********************************************************************
+
+ FreeWay (c) 1999 NVC Electronica Ltd.
+
+ Skeleton driver.
+
+*********************************************************************/
+
+#include "emu.h"
+#include "bus/rs232/rs232.h"
+#include "cpu/i86/i86.h"
+#include "machine/ins8250.h"
+#include "machine/pit8253.h"
+#include "machine/pic8259.h"
+#include "machine/timekpr.h"
+#include "video/mc6845.h"
+#include "emupal.h"
+#include "screen.h"
+
+class freeway_state : public driver_device
+{
+public:
+ freeway_state(const machine_config &mconfig, device_type type, const char *tag)
+ : driver_device(mconfig, type, tag)
+ , m_maincpu(*this, "maincpu")
+ , m_pic(*this, "pic")
+ , m_charram(*this, "charram")
+ , m_colorram(*this, "colorram")
+ , m_lamps(*this, "lamp%u", 1U)
+ {
+ }
+
+ void freeway(machine_config &config);
+
+ DECLARE_WRITE_LINE_MEMBER(nmi_w);
+
+protected:
+ virtual void machine_start() override;
+
+private:
+ MC6845_UPDATE_ROW(update_row);
+
+ void lamps_w(u8 data);
+
+ void mem_map(address_map &map);
+ void io_map(address_map &map);
+
+ required_device<cpu_device> m_maincpu;
+ required_device<pic8259_device> m_pic;
+
+ required_shared_ptr<u8> m_charram;
+ required_shared_ptr<u8> m_colorram;
+
+ output_finder<3> m_lamps;
+};
+
+void freeway_state::machine_start()
+{
+ m_lamps.resolve();
+}
+
+MC6845_UPDATE_ROW(freeway_state::update_row)
+{
+}
+
+void freeway_state::lamps_w(u8 data)
+{
+ for (int n = 0; n < 3; n++)
+ m_lamps[n] = BIT(data, n);
+}
+
+WRITE_LINE_MEMBER(freeway_state::nmi_w)
+{
+ m_maincpu->set_input_line(INPUT_LINE_NMI, state);
+}
+
+void freeway_state::mem_map(address_map &map)
+{
+ map(0x00000, 0x07fff).ram();
+ map(0x08000, 0x09fff).rw("timekpr", FUNC(timekeeper_device::read), FUNC(timekeeper_device::write));
+ map(0xa0000, 0xa0fff).ram().share("charram");
+ map(0xa4000, 0xa4fff).ram().share("colorram");
+ map(0xf0000, 0xfffff).rom().region("program", 0);
+}
+
+void freeway_state::io_map(address_map &map)
+{
+ map(0x0020, 0x0021).rw(m_pic, FUNC(pic8259_device::read), FUNC(pic8259_device::write));
+ map(0x0030, 0x0033).w("pit", FUNC(pit8254_device::write));
+ map(0x0040, 0x0047).rw("uart", FUNC(ns16450_device::ins8250_r), FUNC(ns16450_device::ins8250_w));
+ map(0x00a3, 0x00a3).w(FUNC(freeway_state::lamps_w));
+ map(0x00d0, 0x00d0).portr("CONFIG");
+ map(0x03d0, 0x03d0).w("crtc", FUNC(mc6845_device::address_w));
+ map(0x03d1, 0x03d1).w("crtc", FUNC(mc6845_device::register_w));
+}
+
+static INPUT_PORTS_START(freeway)
+ PORT_START("CONFIG")
+ PORT_DIPNAME(0x01, 0x00, "Screen Format")
+ PORT_DIPSETTING(0x00, "PAL")
+ PORT_DIPSETTING(0x01, "NTSC?") // 268 lines total, 58.3 Hz refresh
+ PORT_BIT(0x08, 0x08, IPT_UNKNOWN)
+ PORT_BIT(0xf6, 0xf6, IPT_UNKNOWN) // probably unused
+
+ PORT_START("RESET")
+ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_MEMORY_RESET) PORT_WRITE_LINE_DEVICE_MEMBER(DEVICE_SELF, freeway_state, nmi_w)
+INPUT_PORTS_END
+
+static const gfx_layout char_layout =
+{
+ 8,8,
+ RGN_FRAC(1,3),
+ 3,
+ { RGN_FRAC(2,3), RGN_FRAC(1,3), RGN_FRAC(0,3) },
+ { 0, 1, 2, 3, 4, 5, 6, 7 },
+ { 0*8, 1*8, 2*8, 3*8, 4*8, 5*8, 6*8, 7*8 },
+ 8*8,
+};
+
+static GFXDECODE_START(gfx_freeway)
+ GFXDECODE_ENTRY("gfx", 0, char_layout, 0x0, 1)
+GFXDECODE_END
+
+void freeway_state::freeway(machine_config &config)
+{
+ I8088(config, m_maincpu, 10_MHz_XTAL / 2); // divider unknown
+ m_maincpu->set_addrmap(AS_PROGRAM, &freeway_state::mem_map);
+ m_maincpu->set_addrmap(AS_IO, &freeway_state::io_map);
+ m_maincpu->set_irq_acknowledge_callback("pic", FUNC(pic8259_device::inta_cb));
+
+ PIC8259(config, m_pic);
+ m_pic->out_int_callback().set_inputline(m_maincpu, 0);
+
+ pit8254_device &pit(PIT8254(config, "pit"));
+ pit.out_handler<0>().set(m_pic, FUNC(pic8259_device::ir0_w));
+
+ M48T58(config, "timekpr");
+
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_raw(10_MHz_XTAL / 2, 320, 0, 256, 312, 0, 256);
+ screen.set_screen_update("crtc", FUNC(mc6845_device::screen_update));
+
+ PALETTE(config, "palette").set_entries(0x10);
+ GFXDECODE(config, "gfxdecode", "palette", gfx_freeway);
+
+ mc6845_device &crtc(MC6845(config, "crtc", 10_MHz_XTAL / 16));
+ crtc.set_char_width(8);
+ crtc.set_show_border_area(false);
+ crtc.set_screen("screen");
+ crtc.set_update_row_callback(FUNC(freeway_state::update_row), this);
+ crtc.out_hsync_callback().set("pit", FUNC(pit8254_device::write_clk0)); // guess
+
+ ns16450_device &uart(NS16450(config, "uart", 10_MHz_XTAL / 8)); // type unknown
+ uart.out_int_callback().set(m_pic, FUNC(pic8259_device::ir2_w));
+ uart.out_tx_callback().set("rs232", FUNC(rs232_port_device::write_txd));
+ uart.out_rts_callback().set("rs232", FUNC(rs232_port_device::write_rts));
+ uart.out_dtr_callback().set("rs232", FUNC(rs232_port_device::write_dtr));
+
+ rs232_port_device &rs232(RS232_PORT(config, "rs232", default_rs232_devices, nullptr));
+ rs232.rxd_handler().set("uart", FUNC(ns16450_device::rx_w));
+ rs232.cts_handler().set("uart", FUNC(ns16450_device::cts_w));
+ rs232.dsr_handler().set("uart", FUNC(ns16450_device::dsr_w));
+ rs232.dcd_handler().set("uart", FUNC(ns16450_device::dcd_w));
+}
+
+// 8088 CPU
+// Intel 8254 Programmable Interval Timer
+// Intel 8259
+// 2x 8k SRAM
+// 1x 32k SRAM
+// 6845 video chip
+// 5 roms
+// Oscillator 10 MHz
+
+ROM_START(freeway)
+ ROM_REGION(0x10000, "program", 0)
+ ROM_LOAD("vip88.bin", 0x00000, 0x10000, CRC(aeba6d5e) SHA1(bb84f7040bf1b6976cb2c50b1ffdc59ae88df223))
+
+ ROM_REGION(0x18000, "gfx", 0)
+ ROM_LOAD("sb_51.bin", 0x00000, 0x8000, CRC(d25bd328) SHA1(b8c692298f6dc5fd5ae2f9e7701e14b0436a95bb)) // xxx0xxxxxxxxxxx = 0xFF
+ ROM_LOAD("sb_52.bin", 0x08000, 0x8000, CRC(f2b33acd) SHA1(e4786b4f00871d771aadacd9d6ec767691f4d939))
+ ROM_LOAD("sb_53.bin", 0x10000, 0x8000, CRC(50407ae6) SHA1(2c6c4803905bed5f27c6783f99a24f8dee62c19b))
+
+ ROM_REGION(0x8000, "cor", 0)
+ ROM_LOAD("sb_cor.bin", 0x0000, 0x8000, CRC(5f86a160) SHA1(f21b7e0e6a407371c252d6fde6fcb32a2682824c)) // all 0xFF fill until 0x7C00; valid data is only 4 bits wide
+ROM_END
+
+
+GAME(1999, freeway, 0, freeway, freeway, freeway_state, empty_init, ROT0, "NVC Electronica", "FreeWay (V5.12)", MACHINE_IS_SKELETON)
diff --git a/src/mame/drivers/fresh.cpp b/src/mame/drivers/fresh.cpp
index 7201533c326..d097612ba12 100644
--- a/src/mame/drivers/fresh.cpp
+++ b/src/mame/drivers/fresh.cpp
@@ -597,21 +597,21 @@ TIMER_DEVICE_CALLBACK_MEMBER(fresh_state::fake_scanline)
}
-MACHINE_CONFIG_START(fresh_state::fresh)
-
+void fresh_state::fresh(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M68000, 24000000/2 )
- MCFG_DEVICE_PROGRAM_MAP(fresh_map)
- MCFG_TIMER_DRIVER_ADD_SCANLINE("scantimer", fresh_state, fake_scanline, "screen", 0, 1)
+ M68000(config, m_maincpu, 24000000/2);
+ m_maincpu->set_addrmap(AS_PROGRAM, &fresh_state::fresh_map);
+ TIMER(config, "scantimer").configure_scanline(FUNC(fresh_state::fake_scanline), "screen", 0, 1);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(64*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 64*8-1, 0*8, 32*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(fresh_state, screen_update_fresh)
- MCFG_SCREEN_PALETTE(m_palette)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(64*8, 32*8);
+ screen.set_visarea_full();
+ screen.set_screen_update(FUNC(fresh_state::screen_update_fresh));
+ screen.set_palette(m_palette);
PALETTE(config, m_palette).set_format(palette_device::xBGR_888, 0x1000); // or 0xc00
GFXDECODE(config, m_gfxdecode, m_palette, gfx_fresh);
@@ -619,9 +619,8 @@ MACHINE_CONFIG_START(fresh_state::fresh)
/* sound hw? */
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("ymsnd", YM2413, 4000000) // actual clock and type unknown
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
-MACHINE_CONFIG_END
+ YM2413(config, "ymsnd", 4000000).add_route(ALL_OUTPUTS, "mono", 1.0); // actual clock and type unknown
+}
ROM_START( fresh )
diff --git a/src/mame/drivers/fromance.cpp b/src/mame/drivers/fromance.cpp
index 61ea744dabd..184a0416983 100644
--- a/src/mame/drivers/fromance.cpp
+++ b/src/mame/drivers/fromance.cpp
@@ -900,16 +900,16 @@ MACHINE_RESET_MEMBER(fromance_state,fromance)
m_flipscreen = 0;
}
-MACHINE_CONFIG_START(fromance_state::nekkyoku)
-
+void fromance_state::nekkyoku(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80,12000000/2) /* 6.00 Mhz ? */
- MCFG_DEVICE_PROGRAM_MAP(nekkyoku_main_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", fromance_state, irq0_line_hold)
+ Z80(config, m_maincpu, 12000000/2); /* 6.00 Mhz ? */
+ m_maincpu->set_addrmap(AS_PROGRAM, &fromance_state::nekkyoku_main_map);
+ m_maincpu->set_vblank_int("screen", FUNC(fromance_state::irq0_line_hold));
- MCFG_DEVICE_ADD("sub", Z80,12000000/2) /* 6.00 Mhz ? */
- MCFG_DEVICE_PROGRAM_MAP(nekkyoku_sub_map)
- MCFG_DEVICE_IO_MAP(nekkyoku_sub_io_map)
+ Z80(config, m_subcpu, 12000000/2); /* 6.00 Mhz ? */
+ m_subcpu->set_addrmap(AS_PROGRAM, &fromance_state::nekkyoku_sub_map);
+ m_subcpu->set_addrmap(AS_IO, &fromance_state::nekkyoku_sub_io_map);
GENERIC_LATCH_8(config, m_sublatch);
m_sublatch->set_separate_acknowledge(true);
@@ -918,15 +918,15 @@ MACHINE_CONFIG_START(fromance_state::nekkyoku)
MCFG_MACHINE_RESET_OVERRIDE(fromance_state,fromance)
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_SIZE(512, 256)
- MCFG_SCREEN_VISIBLE_AREA(0, 352-1, 0, 240-1)
- MCFG_SCREEN_UPDATE_DRIVER(fromance_state, screen_update_fromance)
- MCFG_SCREEN_PALETTE("palette")
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_refresh_hz(60);
+ m_screen->set_size(512, 256);
+ m_screen->set_visarea(0, 352-1, 0, 240-1);
+ m_screen->set_screen_update(FUNC(fromance_state::screen_update_fromance));
+ m_screen->set_palette(m_palette);
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_fromance)
- MCFG_PALETTE_ADD("palette", 1024)
+ GFXDECODE(config, m_gfxdecode, m_palette, gfx_fromance);
+ PALETTE(config, m_palette).set_entries(1024);
VSYSTEM_GGA(config, m_gga, 14318181 / 2); // clock not verified
m_gga->write_cb().set(FUNC(fromance_state::fromance_gga_data_w));
@@ -938,23 +938,22 @@ MACHINE_CONFIG_START(fromance_state::nekkyoku)
AY8910(config, "aysnd", 12000000/6).add_route(ALL_OUTPUTS, "mono", 0.15); // type not verified
- MCFG_DEVICE_ADD("msm", MSM5205, 384000)
- MCFG_MSM5205_VCLK_CB(WRITELINE(*this, fromance_state, fromance_adpcm_int)) /* IRQ handler */
- MCFG_MSM5205_PRESCALER_SELECTOR(S48_4B) /* 8 KHz */
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.80)
-MACHINE_CONFIG_END
-
-
-MACHINE_CONFIG_START(fromance_state::idolmj)
+ MSM5205(config, m_msm, 384000);
+ m_msm->vck_legacy_callback().set(FUNC(fromance_state::fromance_adpcm_int)); /* IRQ handler */
+ m_msm->set_prescaler_selector(msm5205_device::S48_4B); /* 8 KHz */
+ m_msm->add_route(ALL_OUTPUTS, "mono", 0.80);
+}
+void fromance_state::idolmj(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, XTAL(12'000'000) / 2) /* 6.00 Mhz ? */
- MCFG_DEVICE_PROGRAM_MAP(fromance_main_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", fromance_state, irq0_line_hold)
+ Z80(config, m_maincpu, XTAL(12'000'000) / 2); /* 6.00 Mhz ? */
+ m_maincpu->set_addrmap(AS_PROGRAM, &fromance_state::fromance_main_map);
+ m_maincpu->set_vblank_int("screen", FUNC(fromance_state::irq0_line_hold));
- MCFG_DEVICE_ADD("sub", Z80, XTAL(12'000'000) / 2) /* 6.00 Mhz ? */
- MCFG_DEVICE_PROGRAM_MAP(fromance_sub_map)
- MCFG_DEVICE_IO_MAP(idolmj_sub_io_map)
+ Z80(config, m_subcpu, XTAL(12'000'000) / 2); /* 6.00 Mhz ? */
+ m_subcpu->set_addrmap(AS_PROGRAM, &fromance_state::fromance_sub_map);
+ m_subcpu->set_addrmap(AS_IO, &fromance_state::idolmj_sub_io_map);
GENERIC_LATCH_8(config, m_sublatch);
m_sublatch->set_separate_acknowledge(true);
@@ -963,15 +962,15 @@ MACHINE_CONFIG_START(fromance_state::idolmj)
MCFG_MACHINE_RESET_OVERRIDE(fromance_state,fromance)
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_SIZE(512, 256)
- MCFG_SCREEN_VISIBLE_AREA(0, 352-1, 0, 240-1)
- MCFG_SCREEN_UPDATE_DRIVER(fromance_state, screen_update_fromance)
- MCFG_SCREEN_PALETTE("palette")
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_refresh_hz(60);
+ m_screen->set_size(512, 256);
+ m_screen->set_visarea(0, 352-1, 0, 240-1);
+ m_screen->set_screen_update(FUNC(fromance_state::screen_update_fromance));
+ m_screen->set_palette(m_palette);
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_fromance)
- MCFG_PALETTE_ADD("palette", 2048)
+ GFXDECODE(config, m_gfxdecode, m_palette, gfx_fromance);
+ PALETTE(config, m_palette).set_entries(2048);
VSYSTEM_GGA(config, m_gga, XTAL(14'318'181) / 2); // divider not verified
m_gga->write_cb().set(FUNC(fromance_state::fromance_gga_data_w));
@@ -983,23 +982,23 @@ MACHINE_CONFIG_START(fromance_state::idolmj)
YM2149(config, "aysnd", 12000000/6).add_route(ALL_OUTPUTS, "mono", 0.15);
- MCFG_DEVICE_ADD("msm", MSM5205, 384000)
- MCFG_MSM5205_VCLK_CB(WRITELINE(*this, fromance_state, fromance_adpcm_int)) /* IRQ handler */
- MCFG_MSM5205_PRESCALER_SELECTOR(S48_4B) /* 8 KHz */
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.80)
-MACHINE_CONFIG_END
-
+ MSM5205(config, m_msm, 384000);
+ m_msm->vck_legacy_callback().set(FUNC(fromance_state::fromance_adpcm_int)); /* IRQ handler */
+ m_msm->set_prescaler_selector(msm5205_device::S48_4B); /* 8 KHz */
+ m_msm->add_route(ALL_OUTPUTS, "mono", 0.80);
+}
-MACHINE_CONFIG_START(fromance_state::fromance)
+void fromance_state::fromance(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, XTAL(12'000'000) / 2) /* 6.00 Mhz ? */
- MCFG_DEVICE_PROGRAM_MAP(fromance_main_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", fromance_state, irq0_line_hold)
+ Z80(config, m_maincpu, XTAL(12'000'000) / 2); /* 6.00 Mhz ? */
+ m_maincpu->set_addrmap(AS_PROGRAM, &fromance_state::fromance_main_map);
+ m_maincpu->set_vblank_int("screen", FUNC(fromance_state::irq0_line_hold));
- MCFG_DEVICE_ADD("sub", Z80, XTAL(12'000'000) / 2) /* 6.00 Mhz ? */
- MCFG_DEVICE_PROGRAM_MAP(fromance_sub_map)
- MCFG_DEVICE_IO_MAP(fromance_sub_io_map)
+ Z80(config, m_subcpu, XTAL(12'000'000) / 2); /* 6.00 Mhz ? */
+ m_subcpu->set_addrmap(AS_PROGRAM, &fromance_state::fromance_sub_map);
+ m_subcpu->set_addrmap(AS_IO, &fromance_state::fromance_sub_io_map);
GENERIC_LATCH_8(config, m_sublatch);
m_sublatch->set_separate_acknowledge(true);
@@ -1008,15 +1007,15 @@ MACHINE_CONFIG_START(fromance_state::fromance)
MCFG_MACHINE_RESET_OVERRIDE(fromance_state,fromance)
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_SIZE(512, 256)
- MCFG_SCREEN_VISIBLE_AREA(0, 352-1, 0, 240-1)
- MCFG_SCREEN_UPDATE_DRIVER(fromance_state, screen_update_fromance)
- MCFG_SCREEN_PALETTE("palette")
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_refresh_hz(60);
+ m_screen->set_size(512, 256);
+ m_screen->set_visarea(0, 352-1, 0, 240-1);
+ m_screen->set_screen_update(FUNC(fromance_state::screen_update_fromance));
+ m_screen->set_palette(m_palette);
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_fromance)
- MCFG_PALETTE_ADD("palette", 2048)
+ GFXDECODE(config, m_gfxdecode, m_palette, gfx_fromance);
+ PALETTE(config, m_palette).set_entries(2048);
VSYSTEM_GGA(config, m_gga, XTAL(14'318'181) / 2); // divider not verified
m_gga->write_cb().set(FUNC(fromance_state::fromance_gga_data_w));
@@ -1026,14 +1025,13 @@ MACHINE_CONFIG_START(fromance_state::fromance)
/* sound hardware */
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("ymsnd", YM2413, 3579545)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.90)
+ YM2413(config, "ymsnd", 3579545).add_route(ALL_OUTPUTS, "mono", 0.90);
- MCFG_DEVICE_ADD("msm", MSM5205, 384000)
- MCFG_MSM5205_VCLK_CB(WRITELINE(*this, fromance_state, fromance_adpcm_int)) /* IRQ handler */
- MCFG_MSM5205_PRESCALER_SELECTOR(S48_4B) /* 8 KHz */
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.10)
-MACHINE_CONFIG_END
+ MSM5205(config, m_msm, 384000);
+ m_msm->vck_legacy_callback().set(FUNC(fromance_state::fromance_adpcm_int)); /* IRQ handler */
+ m_msm->set_prescaler_selector(msm5205_device::S48_4B); /* 8 KHz */
+ m_msm->add_route(ALL_OUTPUTS, "mono", 0.10);
+}
diff --git a/src/mame/drivers/fruitpc.cpp b/src/mame/drivers/fruitpc.cpp
index 111c91e26fa..096292da98b 100644
--- a/src/mame/drivers/fruitpc.cpp
+++ b/src/mame/drivers/fruitpc.cpp
@@ -115,11 +115,12 @@ void fruitpc_state::fruitpc_sb_conf(device_t *device)
MCFG_DEVICE_SLOT_INTERFACE(pc_joysticks, nullptr, true) // remove joystick
}
-MACHINE_CONFIG_START(fruitpc_state::fruitpc)
- MCFG_DEVICE_ADD("maincpu", I486, 66000000) // ST STPCD0166BTC3 66 MHz 486 CPU
- MCFG_DEVICE_PROGRAM_MAP(fruitpc_map)
- MCFG_DEVICE_IO_MAP(fruitpc_io)
- MCFG_DEVICE_IRQ_ACKNOWLEDGE_DEVICE("pic8259_1", pic8259_device, inta_cb)
+void fruitpc_state::fruitpc(machine_config &config)
+{
+ I486(config, m_maincpu, 66000000); // ST STPCD0166BTC3 66 MHz 486 CPU
+ m_maincpu->set_addrmap(AS_PROGRAM, &fruitpc_state::fruitpc_map);
+ m_maincpu->set_addrmap(AS_IO, &fruitpc_state::fruitpc_io);
+ m_maincpu->set_irq_acknowledge_callback("pic8259_1", FUNC(pic8259_device::inta_cb));
pcat_common(config);
@@ -132,7 +133,8 @@ MACHINE_CONFIG_START(fruitpc_state::fruitpc)
m_dma8237_1->out_iow_callback<1>().set(FUNC(fruitpc_state::dma8237_1_dack_w));
ISA8(config, m_isabus, 0);
- m_isabus->set_cputag("maincpu");
+ m_isabus->set_memspace("maincpu", AS_PROGRAM);
+ m_isabus->set_iospace("maincpu", AS_IO);
m_isabus->irq2_callback().set("pic8259_2", FUNC(pic8259_device::ir2_w));
m_isabus->irq3_callback().set("pic8259_1", FUNC(pic8259_device::ir3_w));
m_isabus->irq4_callback().set("pic8259_1", FUNC(pic8259_device::ir4_w));
@@ -144,10 +146,10 @@ MACHINE_CONFIG_START(fruitpc_state::fruitpc)
m_isabus->drq3_callback().set("dma8237_1", FUNC(am9517a_device::dreq3_w));
// FIXME: determine ISA bus clock
- MCFG_DEVICE_ADD("isa1", ISA8_SLOT, 0, "isa", fruitpc_isa8_cards, "sb15", true)
- MCFG_SLOT_OPTION_DEVICE_INPUT_DEFAULTS("sb15", fruitpc_sb_def)
- MCFG_SLOT_OPTION_MACHINE_CONFIG("sb15", fruitpc_sb_conf)
-MACHINE_CONFIG_END
+ isa8_slot_device &isa1(ISA8_SLOT(config, "isa1", 0, "isa", fruitpc_isa8_cards, "sb15", true));
+ isa1.set_option_device_input_defaults("sb15", DEVICE_INPUT_DEFAULTS_NAME(fruitpc_sb_def));
+ isa1.set_option_machine_config("sb15", fruitpc_sb_conf);
+}
ROM_START( fruitpc )
ROM_REGION( 0x20000, "bios", 0 )
diff --git a/src/mame/drivers/fs3216.cpp b/src/mame/drivers/fs3216.cpp
index 1f7587af9a3..cbe6aa178df 100644
--- a/src/mame/drivers/fs3216.cpp
+++ b/src/mame/drivers/fs3216.cpp
@@ -12,7 +12,7 @@
//#include "bus/rs232/rs232.h"
#include "cpu/m68000/m68000.h"
#include "cpu/8x300/8x300.h"
-//#include "imagedev/floppy.h"
+#include "imagedev/floppy.h"
#include "machine/bankdev.h"
//#include "machine/com8116.h"
#include "machine/upd765.h"
@@ -32,7 +32,9 @@ public:
, m_clb(*this, "clb")
, m_ctc(*this, "ctc")
, m_fdc(*this, "fdc")
+ , m_floppy(*this, "fdc:%u", 0U)
, m_earom(*this, "earom")
+ , m_vecprom(*this, "vecprom")
, m_videoram(*this, "videoram")
, m_chargen(*this, "chargen")
{
@@ -47,20 +49,32 @@ protected:
private:
MC6845_UPDATE_ROW(crt_update_row);
- DECLARE_READ16_MEMBER(mmu_read);
- DECLARE_WRITE16_MEMBER(mmu_write);
+ void mmu_reg_w(offs_t offset, u16 data);
+ u16 mmu_read(offs_t offset, u16 mem_mask);
+ void mmu_write(offs_t offset, u16 data, u16 mem_mask);
DECLARE_WRITE_LINE_MEMBER(mmu_reset_w);
void mmu_init_w(u16 data);
+ u16 irq_r();
+ IRQ_CALLBACK_MEMBER(intack);
+
DECLARE_READ8_MEMBER(ctc_r);
DECLARE_WRITE8_MEMBER(ctc_w);
- void floppy_select_w(u8 data);
+ u16 earom_recall_r();
+ u16 earom_store_r();
+
+ DECLARE_WRITE_LINE_MEMBER(fdc_int_w);
+ DECLARE_WRITE_LINE_MEMBER(fdc_drq_w);
+ DECLARE_WRITE_LINE_MEMBER(fdc_hdl_w);
+ DECLARE_WRITE_LINE_MEMBER(floppy_idx_w);
+ void fdc_us_w(u8 data);
+ u16 floppy_select_r(offs_t offset);
+ void floppy_select_w(offs_t offset, u16 data);
+ void floppy_control_w(u8 data);
u8 floppy_status_r();
- void fdc_reset_w(u16 data);
+ TIMER_CALLBACK_MEMBER(fdc_dma);
u8 fdc_ram_r(offs_t offset);
void fdc_ram_w(offs_t offset, u8 data);
- u16 earom_recall_r();
- u16 earom_store_r();
void main_map(address_map &map);
void clb_map(address_map &map);
@@ -71,34 +85,59 @@ private:
required_device<address_map_bank_device> m_clb;
required_device<z80ctc_device> m_ctc;
required_device<upd765a_device> m_fdc;
+ required_device_array<floppy_connector, 4> m_floppy;
required_device<x2212_device> m_earom;
+ required_region_ptr<u8> m_vecprom;
required_shared_ptr<u16> m_videoram;
required_region_ptr<u8> m_chargen;
- std::unique_ptr<u8[]> m_fdc_ram;
+ u32 m_mmu_reg[4];
+ bool m_from_reset;
- bool m_in_reset;
- bool m_mmu_init;
+ u8 m_floppy_status;
+ u8 m_floppy_control;
+ u8 m_floppy_select;
+ u8 m_fdc_select;
+ u16 m_fdc_dma_count;
+ emu_timer *m_fdc_dma_timer;
+ std::unique_ptr<u8[]> m_fdc_ram;
};
void fs3216_state::machine_start()
{
- m_fdc_ram = make_unique_clear<u8[]>(0x400);
- save_pointer(NAME(m_fdc_ram), 0x400);
-
- save_item(NAME(m_in_reset));
- save_item(NAME(m_mmu_init));
+ m_fdc_ram = make_unique_clear<u8[]>(0x800);
+ save_pointer(NAME(m_fdc_ram), 0x800);
+
+ std::fill(std::begin(m_mmu_reg), std::end(m_mmu_reg), 0);
+
+ m_floppy_status = 0x80;
+ m_floppy_control = 0;
+ m_floppy_select = 0;
+ m_fdc_select = 0;
+ m_fdc_dma_count = 0;
+
+ m_fdc_dma_timer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(fs3216_state::fdc_dma), this));
+
+ save_item(NAME(m_mmu_reg));
+ save_item(NAME(m_from_reset));
+ save_item(NAME(m_floppy_status));
+ save_item(NAME(m_floppy_control));
+ save_item(NAME(m_floppy_select));
+ save_item(NAME(m_fdc_select));
+ save_item(NAME(m_fdc_dma_count));
}
void fs3216_state::machine_reset()
{
- m_in_reset = true;
- m_mmu_init = false;
+ m_from_reset = true;
// FIXME: fix the 68000 so that it doesn't read vectors during device_reset
m_maincpu->reset();
+
+ floppy_control_w(0);
+ floppy_select_w(0, 0);
}
@@ -109,56 +148,82 @@ MC6845_UPDATE_ROW(fs3216_state::crt_update_row)
for (int i = 0; i < x_count; i++)
{
u16 chr = m_videoram[(ma + i) & 0x7ff];
- rgb_t fg = rgb_t::white();
+ rgb_t fg = BIT(chr, 13) ? rgb_t::white() : rgb_t(0xc0, 0xc0, 0xc0);
rgb_t bg = rgb_t::black();
u16 dots = m_chargen[(chr & 0xff) << 4 | ra] << 1;
+ if (ra == 9 && BIT(chr, 12))
+ dots = 0x1ff;
+
for (int n = 9; n > 0; n--, dots <<= 1)
*px++ = BIT(dots, 8) ? fg : bg;
}
}
-READ16_MEMBER(fs3216_state::mmu_read)
+void fs3216_state::mmu_reg_w(offs_t offset, u16 data)
{
- if (m_in_reset)
+ // 3x SN74LS374N for each of the four spaces
+ u32 &reg = m_mmu_reg[offset >> 1];
+ if (BIT(offset, 0))
+ reg = (reg & 0xff0000) | data;
+ else
+ reg = (reg & 0x00ffff) | (data & 0x00ff) << 16;
+}
+
+u16 fs3216_state::mmu_read(offs_t offset, u16 mem_mask)
+{
+ const bool a23 = BIT(offset, 22);
+ const bool mmu_disable = !a23 && BIT(m_maincpu->get_fc(), 2);
+ const u32 mmu_reg = mmu_disable ? (m_from_reset ? 0xfffe00 : 0xfff000) : m_mmu_reg[(offset >> 20) & 3];
+
+ if (!mmu_disable && !machine().side_effects_disabled())
{
- if (m_mmu_init && !BIT(offset, 22) && !machine().side_effects_disabled())
- m_in_reset = false;
- else
- offset = (offset & 0x03ffff) | 0x1c0000;
+ // TODO: do limit check and cause BERR on failure
}
- // TODO: MMU segments
- return m_clb->read16(space, offset & 0x1fffff, mem_mask);
+ offs_t clbaddr = offset + ((mmu_reg & 0x000fff) << 9);
+ clbaddr = (clbaddr & 0x1fffff) | (clbaddr & 0x100000) << 1;
+ return m_clb->read16(clbaddr, mem_mask);
}
-WRITE16_MEMBER(fs3216_state::mmu_write)
+void fs3216_state::mmu_write(offs_t offset, u16 data, u16 mem_mask)
{
- if (m_in_reset)
+ const bool a23 = BIT(offset, 22);
+ const bool mmu_disable = !a23 && BIT(m_maincpu->get_fc(), 2);
+ const u32 mmu_reg = mmu_disable ? (m_from_reset ? 0xfffe00 : 0xfff000) : m_mmu_reg[(offset >> 20) & 3];
+
+ if (!mmu_disable && !machine().side_effects_disabled())
{
- if (m_mmu_init && !BIT(offset, 22) && !machine().side_effects_disabled())
- m_in_reset = false;
- else
- offset = (offset & 0x03ffff) | 0x1c0000;
+ // TODO: do limit/write protect check and cause BERR on failure
}
- // TODO: MMU segments
- m_clb->write16(space, offset & 0x1fffff, data, mem_mask);
+ offs_t clbaddr = offset + ((mmu_reg & 0x000fff) << 9);
+ clbaddr = (clbaddr & 0x1fffff) | (clbaddr & 0x100000) << 1;
+ m_clb->write16(clbaddr, data, mem_mask);
}
WRITE_LINE_MEMBER(fs3216_state::mmu_reset_w)
{
if (state)
- {
- m_in_reset = true;
- m_mmu_init = false;
- }
+ m_from_reset = true;
}
void fs3216_state::mmu_init_w(u16 data)
{
- m_mmu_init = true;
+ m_from_reset = BIT(data, 0);
+}
+
+u16 fs3216_state::irq_r()
+{
+ // TODO
+ return 0xfff8;
+}
+
+IRQ_CALLBACK_MEMBER(fs3216_state::intack)
+{
+ // FIXME: not all levels are vectored this way
+ return m_vecprom[irqline];
}
READ8_MEMBER(fs3216_state::ctc_r)
@@ -191,28 +256,155 @@ u16 fs3216_state::earom_store_r()
return 0xffff;
}
-void fs3216_state::floppy_select_w(u8 data)
+WRITE_LINE_MEMBER(fs3216_state::fdc_int_w)
+{
+ if (state)
+ m_floppy_status |= 0x02;
+ else
+ m_floppy_status &= 0xfd;
+}
+
+WRITE_LINE_MEMBER(fs3216_state::fdc_drq_w)
+{
+ if (state)
+ {
+ m_floppy_status |= 0x01;
+ if (BIT(m_floppy_control, 3) && !m_fdc_dma_timer->enabled())
+ {
+ m_fdc_dma_timer->adjust(attotime::from_hz(16_MHz_XTAL / 64));
+ m_floppy_status |= 0x04;
+ }
+ }
+ else
+ {
+ m_floppy_status &= 0xfa;
+ m_fdc_dma_timer->adjust(attotime::never);
+ }
+}
+
+WRITE_LINE_MEMBER(fs3216_state::fdc_hdl_w)
{
+ if (state)
+ m_floppy_status |= 0x40;
+ else
+ m_floppy_status &= 0xbf;
+}
+
+WRITE_LINE_MEMBER(fs3216_state::floppy_idx_w)
+{
+ if (state)
+ m_floppy_status |= 0x20;
+ else
+ m_floppy_status &= 0xdf;
+
+ if (BIT(m_floppy_select, 2))
+ m_fdc->ready_w(state);
+}
+
+void fs3216_state::fdc_us_w(u8 data)
+{
+ m_fdc_select = data;
+ if (!BIT(m_floppy_select, 2))
+ m_fdc->set_floppy(m_floppy[m_fdc_select]->get_device());
+}
+
+u16 fs3216_state::floppy_select_r(offs_t offset)
+{
+ if (!machine().side_effects_disabled())
+ floppy_select_w(offset, 0);
+ return 0xffff;
+}
+
+void fs3216_state::floppy_select_w(offs_t offset, u16 data)
+{
+ if (m_floppy_select == offset)
+ return;
+
+ m_floppy_select = offset;
+ if (BIT(offset, 2))
+ m_fdc->set_floppy(m_floppy[offset & 3]->get_device());
+ else
+ m_fdc->set_floppy(m_floppy[m_fdc_select]->get_device());
+}
+
+void fs3216_state::floppy_control_w(u8 data)
+{
+ m_floppy_control = data;
+
+ floppy_image_device *fd = m_floppy[BIT(m_floppy_select, 2) ? (m_floppy_select & 3) : m_fdc_select]->get_device();
+ if (BIT(data, 5))
+ {
+ if (fd != nullptr)
+ fd->mon_w(0);
+ m_floppy_status |= 0x10;
+ }
+ else
+ {
+ if (fd != nullptr)
+ fd->mon_w(1);
+ m_floppy_status &= 0xef;
+ }
+
+ if (!BIT(data, 1))
+ {
+ m_fdc->soft_reset();
+ m_fdc_dma_count = 0;
+ m_fdc->tc_w(0);
+ }
+
+ if (BIT(data, 3) && BIT(m_floppy_status, 0))
+ {
+ if (!m_fdc_dma_timer->enabled())
+ {
+ m_fdc_dma_timer->adjust(attotime::from_hz(16_MHz_XTAL / 64));
+ m_floppy_status |= 0x04;
+ }
+ }
+ else
+ {
+ m_fdc_dma_timer->adjust(attotime::never);
+ m_floppy_status &= 0xfb;
+ }
+
+ m_fdc->set_unscaled_clock(16_MHz_XTAL / (BIT(data, 0) ? 4 : 2));
}
u8 fs3216_state::floppy_status_r()
{
- return 0xff;
+ return m_floppy_status;
}
-void fs3216_state::fdc_reset_w(u16 data)
+TIMER_CALLBACK_MEMBER(fs3216_state::fdc_dma)
{
- m_fdc->soft_reset();
+ if (BIT(m_floppy_control, 4))
+ m_fdc_ram[m_fdc_dma_count & 0x7ff] = m_fdc->dma_r();
+ else
+ m_fdc->dma_w(m_fdc_ram[m_fdc_dma_count & 0x7ff]);
+ m_floppy_status &= 0xfb;
+
+ ++m_fdc_dma_count;
+ if (BIT(m_fdc_dma_count, 11))
+ m_fdc->tc_w(1);
}
u8 fs3216_state::fdc_ram_r(offs_t offset)
{
- return m_fdc_ram[offset];
+ if (!machine().side_effects_disabled())
+ {
+ m_fdc_dma_count = offset;
+ m_fdc->tc_w(BIT(offset, 11));
+ }
+ return m_fdc_ram[offset & 0x7ff];
}
void fs3216_state::fdc_ram_w(offs_t offset, u8 data)
{
- m_fdc_ram[offset] = data;
+ if (!machine().side_effects_disabled())
+ {
+ m_fdc_dma_count = offset;
+ m_fdc->tc_w(BIT(offset, 11));
+ }
+ m_fdc_ram[offset & 0x7ff] = data;
}
@@ -224,33 +416,36 @@ void fs3216_state::main_map(address_map &map)
void fs3216_state::clb_map(address_map &map)
{
map(0x000000, 0x017fff).ram();
- map(0x380000, 0x383fff).rom().region("momrom", 0);
- map(0x392000, 0x392003).m(m_fdc, FUNC(upd765a_device::map)).umask16(0x00ff);
- map(0x392041, 0x392041).w(FUNC(fs3216_state::floppy_select_w));
- map(0x392051, 0x392051).r(FUNC(fs3216_state::floppy_status_r));
- map(0x394680, 0x39468f).rw(FUNC(fs3216_state::ctc_r), FUNC(fs3216_state::ctc_w)).umask16(0x00ff);
- map(0x394701, 0x394701).rw("dart", FUNC(z80dart_device::da_r), FUNC(z80dart_device::da_w));
- map(0x394709, 0x394709).rw("dart", FUNC(z80dart_device::ca_r), FUNC(z80dart_device::ca_w));
- map(0x394711, 0x394711).rw("dart", FUNC(z80dart_device::db_r), FUNC(z80dart_device::db_w));
- map(0x394719, 0x394719).rw("dart", FUNC(z80dart_device::cb_r), FUNC(z80dart_device::cb_w));
- map(0x3a0000, 0x3a1fff).rom().region("video", 0);
- map(0x3a4001, 0x3a4001).w("crtc", FUNC(mc6845_device::address_w));
- map(0x3a4003, 0x3a4003).rw("crtc", FUNC(mc6845_device::register_r), FUNC(mc6845_device::register_w));
- map(0x3a8000, 0x3a8fff).ram().share("videoram"); // 2x M58725P
- map(0x3b0000, 0x3b1fff).rom().region("comm_a", 0);
- map(0x3c0000, 0x3c1fff).rom().region("comm_b", 0);
- map(0x3e0000, 0x3e1fff).rom().region("wd1001_clb", 0);
- map(0x3f5000, 0x3f5001).w(FUNC(fs3216_state::mmu_init_w));
- map(0x3f6000, 0x3f6001).w(FUNC(fs3216_state::fdc_reset_w));
- map(0x3f6800, 0x3f6fff).rw(FUNC(fs3216_state::fdc_ram_r), FUNC(fs3216_state::fdc_ram_w)).umask16(0x00ff);
- map(0x3f7000, 0x3f7001).r(FUNC(fs3216_state::earom_store_r));
- map(0x3f7200, 0x3f7201).r(FUNC(fs3216_state::earom_recall_r));
- map(0x3f7400, 0x3f75ff).rw(m_earom, FUNC(x2212_device::read), FUNC(x2212_device::write)).umask16(0x00ff);
+ map(0x780000, 0x783fff).rom().region("momrom", 0);
+ map(0x792000, 0x792003).m(m_fdc, FUNC(upd765a_device::map)).umask16(0x00ff);
+ map(0x792010, 0x79201f).rw(FUNC(fs3216_state::floppy_select_r), FUNC(fs3216_state::floppy_select_w));
+ map(0x792041, 0x792041).w(FUNC(fs3216_state::floppy_control_w));
+ map(0x792051, 0x792051).r(FUNC(fs3216_state::floppy_status_r));
+ map(0x794680, 0x79468f).rw(FUNC(fs3216_state::ctc_r), FUNC(fs3216_state::ctc_w)).umask16(0x00ff);
+ map(0x794701, 0x794701).rw("dart", FUNC(z80dart_device::da_r), FUNC(z80dart_device::da_w));
+ map(0x794709, 0x794709).rw("dart", FUNC(z80dart_device::ca_r), FUNC(z80dart_device::ca_w));
+ map(0x794711, 0x794711).rw("dart", FUNC(z80dart_device::db_r), FUNC(z80dart_device::db_w));
+ map(0x794719, 0x794719).rw("dart", FUNC(z80dart_device::cb_r), FUNC(z80dart_device::cb_w));
+ map(0x796000, 0x797fff).rw(FUNC(fs3216_state::fdc_ram_r), FUNC(fs3216_state::fdc_ram_w)).umask16(0x00ff);
+ map(0x7a0000, 0x7a1fff).rom().region("video", 0);
+ map(0x7a4001, 0x7a4001).w("crtc", FUNC(mc6845_device::address_w));
+ map(0x7a4003, 0x7a4003).rw("crtc", FUNC(mc6845_device::register_r), FUNC(mc6845_device::register_w));
+ map(0x7a8000, 0x7a8fff).ram().share("videoram"); // 2x M58725P
+ map(0x7b0000, 0x7b1fff).rom().region("comm_a", 0);
+ map(0x7c0000, 0x7c1fff).rom().region("comm_b", 0);
+ //map(0x7e0000, 0x7e1fff).rom().region("wd1001_clb", 0);
+ map(0x7f1000, 0x7f1001).r(FUNC(fs3216_state::irq_r));
+ map(0x7f3000, 0x7f300f).w(FUNC(fs3216_state::mmu_reg_w));
+ map(0x7f5000, 0x7f5001).w(FUNC(fs3216_state::mmu_init_w));
+ map(0x7f6000, 0x7f6001).nopw();
+ map(0x7f7000, 0x7f7001).r(FUNC(fs3216_state::earom_store_r));
+ map(0x7f7200, 0x7f7201).r(FUNC(fs3216_state::earom_recall_r));
+ map(0x7f7400, 0x7f75ff).rw(m_earom, FUNC(x2212_device::read), FUNC(x2212_device::write)).umask16(0x00ff);
}
void fs3216_state::wdcpu_prog_map(address_map &map)
{
- map(0x000, 0x7ff).rom().region("wdcpu", 0);
+ map(0x0000, 0x03ff).rom().region("wdcpu", 0);
}
void fs3216_state::wdcpu_bank_map(address_map &map)
@@ -259,11 +454,17 @@ void fs3216_state::wdcpu_bank_map(address_map &map)
}
+static void fs3216_floppies(device_slot_interface &device)
+{
+ device.option_add("525dd", FLOPPY_525_DD);
+}
+
void fs3216_state::fs3216(machine_config &config)
{
M68000(config, m_maincpu, 44.2368_MHz_XTAL / 8); // 5.5 MHz
m_maincpu->set_addrmap(AS_PROGRAM, &fs3216_state::main_map);
m_maincpu->set_reset_callback(write_line_delegate(FUNC(fs3216_state::mmu_reset_w), this));
+ m_maincpu->set_irq_acknowledge_callback(FUNC(fs3216_state::intack));
ADDRESS_MAP_BANK(config, m_clb);
m_clb->set_addrmap(0, &fs3216_state::clb_map);
@@ -277,10 +478,20 @@ void fs3216_state::fs3216(machine_config &config)
m_ctc->zc_callback<0>().set("dart", FUNC(z80dart_device::rxca_w));
m_ctc->zc_callback<0>().append("dart", FUNC(z80dart_device::txca_w));
m_ctc->zc_callback<1>().set("dart", FUNC(z80dart_device::rxtxcb_w));
+ m_ctc->zc_callback<1>().append(m_ctc, FUNC(z80ctc_device::trg2));
+ m_ctc->zc_callback<2>().set(m_ctc, FUNC(z80ctc_device::trg3));
Z80DART(config, "dart", 44.2368_MHz_XTAL / 8); // Z8470BPS
- UPD765A(config, m_fdc, 16_MHz_XTAL / 2, true, false);
+ UPD765A(config, m_fdc, 16_MHz_XTAL / 2, false, false);
+ m_fdc->intrq_wr_callback().set(FUNC(fs3216_state::fdc_int_w));
+ m_fdc->drq_wr_callback().set(FUNC(fs3216_state::fdc_drq_w));
+ m_fdc->hdl_wr_callback().set(FUNC(fs3216_state::fdc_hdl_w));
+ m_fdc->idx_wr_callback().set(FUNC(fs3216_state::floppy_idx_w));
+ m_fdc->us_wr_callback().set(FUNC(fs3216_state::fdc_us_w));
+
+ for (int i = 0; i < 4; i++)
+ FLOPPY_CONNECTOR(config, m_floppy[i], fs3216_floppies, i < 1 ? "525dd" : nullptr, floppy_image_device::default_floppy_formats);
X2212(config, m_earom);
@@ -290,10 +501,11 @@ void fs3216_state::fs3216(machine_config &config)
crtc.set_update_row_callback(FUNC(fs3216_state::crt_update_row), this);
screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_color(rgb_t::green());
screen.set_raw(14.58_MHz_XTAL, 900, 0, 720, 270, 0, 250);
screen.set_screen_update("crtc", FUNC(mc6845_device::screen_update));
- n8x300_cpu_device &wdcpu(N8X300(config, "wdcpu", 20_MHz_XTAL / 2)); // N8X305I
+ n8x305_cpu_device &wdcpu(N8X305(config, "wdcpu", 8_MHz_XTAL)); // N8X305I
wdcpu.set_addrmap(AS_PROGRAM, &fs3216_state::wdcpu_prog_map);
wdcpu.set_addrmap(AS_IO, &fs3216_state::wdcpu_bank_map);
}
@@ -307,7 +519,7 @@ INPUT_PORTS_END
// XTALs on Comm A board (1000014-01 2 Port / 1000171-01 4 Port Rev. 7; 10000065-01 Rev. 3): two K1135CM Dual Baud Rate Generators (7D, 8D)
// XTALs on Comm B board (1001651-01 Rev. G): none
// XTALs on Video Controller board (1000443-1 Rev. I): 14.580 MHz (1H)
-// XTALs on WD-1001 CLB Disk Controller board (1473-008): 20.000 (Y1), 8.00? [somewhat defaced] (Y2)
+// XTALs on WD-1001 CLB Disk Controller board (1473-008): 20.000 (Y1), 8.000 (Y2)
ROM_START(fs3216)
ROM_REGION16_BE(0x4000, "momrom", 0)
ROM_LOAD16_BYTE("17k_1260-02_h.bin", 0x0000, 0x2000, CRC(75ed6de8) SHA1(0360548493b778995ae436da475b6356945e1872))
@@ -316,6 +528,9 @@ ROM_START(fs3216)
ROM_REGION(0x100, "earom", 0)
ROM_LOAD("sn1000044-08_x2212.bin", 0x000, 0x100, CRC(2bf1fec8) SHA1(e1bdda558364415131e68443013c608bb9c01451))
+ ROM_REGION(0x20, "vecprom", 0)
+ ROM_LOAD("12j_74s288.bin", 0x00, 0x20, CRC(8f7bf087) SHA1(de785f7ab79f0e58e411ec5cbc42991d1d8486b1))
+
ROM_REGION16_BE(0x2000, "comm_a", 0)
ROM_LOAD16_BYTE("1896-01_c90c3cb92588a2b4bb28bcf4bb8e2023.bin", 0x0000, 0x1000, CRC(ac4cdbd2) SHA1(e448a01a9809cccfb526ac1d4e97d9be3af1e5eb))
ROM_LOAD16_BYTE("1895-01_fb20aa682a17028cdae2687fc47daef1.bin", 0x0001, 0x1000, CRC(82ebffb5) SHA1(3888b7ba07d0b25bfb9e0444215d4fa9ecd66273))
diff --git a/src/mame/drivers/fungames.cpp b/src/mame/drivers/fungames.cpp
index 481c3ba604d..88ed2745748 100644
--- a/src/mame/drivers/fungames.cpp
+++ b/src/mame/drivers/fungames.cpp
@@ -88,20 +88,21 @@ void fungames_state::video_start()
{
}
-MACHINE_CONFIG_START(fungames_state::fungames)
-
+void fungames_state::fungames(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", NETLIST_CPU, NETLIST_CLOCK)
- MCFG_NETLIST_SETUP(fungames)
+ NETLIST_CPU(config, m_maincpu, NETLIST_CLOCK);
+ m_maincpu->set_constructor(netlist_fungames);
/* video hardware */
- MCFG_FIXFREQ_ADD("fixfreq", "screen")
- MCFG_FIXFREQ_MONITOR_CLOCK(MASTER_CLOCK)
- MCFG_FIXFREQ_HORZ_PARAMS(H_TOTAL-67,H_TOTAL-40,H_TOTAL-8,H_TOTAL)
- MCFG_FIXFREQ_VERT_PARAMS(V_TOTAL-22,V_TOTAL-19,V_TOTAL-12,V_TOTAL)
- MCFG_FIXFREQ_FIELDCOUNT(1)
- MCFG_FIXFREQ_SYNC_THRESHOLD(0.30)
-MACHINE_CONFIG_END
+ SCREEN(config, "screen", SCREEN_TYPE_RASTER);
+ FIXFREQ(config, m_video).set_screen("screen");
+ m_video->set_monitor_clock(MASTER_CLOCK);
+ m_video->set_horz_params(H_TOTAL-67,H_TOTAL-40,H_TOTAL-8,H_TOTAL);
+ m_video->set_vert_params(V_TOTAL-22,V_TOTAL-19,V_TOTAL-12,V_TOTAL);
+ m_video->set_fieldcount(1);
+ m_video->set_threshold(0.30);
+}
/***************************************************************************
diff --git a/src/mame/drivers/funkball.cpp b/src/mame/drivers/funkball.cpp
index a44fae46407..7fc0c1f59f1 100644
--- a/src/mame/drivers/funkball.cpp
+++ b/src/mame/drivers/funkball.cpp
@@ -764,10 +764,10 @@ static DEVICE_INPUT_DEFAULTS_START( terminal )
DEVICE_INPUT_DEFAULTS_END
MACHINE_CONFIG_START(funkball_state::funkball)
- MCFG_DEVICE_ADD("maincpu", MEDIAGX, 66666666*3.5) // 66,6 MHz x 3.5
- MCFG_DEVICE_PROGRAM_MAP(funkball_map)
- MCFG_DEVICE_IO_MAP(funkball_io)
- MCFG_DEVICE_IRQ_ACKNOWLEDGE_DEVICE("pic8259_1", pic8259_device, inta_cb)
+ MEDIAGX(config, m_maincpu, 66666666*3.5); // 66,6 MHz x 3.5
+ m_maincpu->set_addrmap(AS_PROGRAM, &funkball_state::funkball_map);
+ m_maincpu->set_addrmap(AS_IO, &funkball_state::funkball_io);
+ m_maincpu->set_irq_acknowledge_callback("pic8259_1", FUNC(pic8259_device::inta_cb));
pcat_common(config);
@@ -781,18 +781,18 @@ MACHINE_CONFIG_START(funkball_state::funkball)
ADDRESS_MAP_BANK(config, "flashbank").set_map(&funkball_state::flashbank_map).set_options(ENDIANNESS_LITTLE, 32, 32, 0x10000);
/* video hardware */
- MCFG_DEVICE_ADD("voodoo_0", VOODOO_1, STD_VOODOO_1_CLOCK)
- MCFG_VOODOO_FBMEM(2)
- MCFG_VOODOO_TMUMEM(4,0)
- MCFG_VOODOO_SCREEN_TAG("screen")
- MCFG_VOODOO_CPU_TAG("maincpu")
-
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_UPDATE_DRIVER(funkball_state, screen_update)
- MCFG_SCREEN_SIZE(1024, 1024)
- MCFG_SCREEN_VISIBLE_AREA(0, 511, 16, 447)
+ VOODOO_1(config, m_voodoo, STD_VOODOO_1_CLOCK);
+ m_voodoo->set_fbmem(2);
+ m_voodoo->set_tmumem(4, 0);
+ m_voodoo->set_screen_tag("screen");
+ m_voodoo->set_cpu_tag(m_maincpu);
+
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_screen_update(FUNC(funkball_state::screen_update));
+ screen.set_size(1024, 1024);
+ screen.set_visarea(0, 511, 16, 447);
ns16550_device &uart(NS16550(config, "uart", 1843200)); // exact type unknown
uart.out_tx_callback().set("rs232", FUNC(rs232_port_device::write_txd));
diff --git a/src/mame/drivers/funkybee.cpp b/src/mame/drivers/funkybee.cpp
index 654adcbd71e..f87c6932220 100644
--- a/src/mame/drivers/funkybee.cpp
+++ b/src/mame/drivers/funkybee.cpp
@@ -285,13 +285,13 @@ void funkybee_state::machine_start()
m_gfx_bank = 0;
}
-MACHINE_CONFIG_START(funkybee_state::funkybee)
-
+void funkybee_state::funkybee(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, 3072000) /* 3.072 MHz */
- MCFG_DEVICE_PROGRAM_MAP(funkybee_map)
- MCFG_DEVICE_IO_MAP(io_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", funkybee_state, irq0_line_hold)
+ Z80(config, m_maincpu, 3072000); /* 3.072 MHz */
+ m_maincpu->set_addrmap(AS_PROGRAM, &funkybee_state::funkybee_map);
+ m_maincpu->set_addrmap(AS_IO, &funkybee_state::io_map);
+ m_maincpu->set_vblank_int("screen", FUNC(funkybee_state::irq0_line_hold));
ls259_device &mainlatch(LS259(config, "mainlatch"));
mainlatch.q_out_cb<0>().set(FUNC(funkybee_state::flipscreen_w));
@@ -302,13 +302,13 @@ MACHINE_CONFIG_START(funkybee_state::funkybee)
WATCHDOG_TIMER(config, m_watchdog);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */)
- MCFG_SCREEN_SIZE(32*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(12, 32*8-8-1, 0*8, 28*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(funkybee_state, screen_update_funkybee)
- MCFG_SCREEN_PALETTE(m_palette)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500) /* not accurate */);
+ screen.set_size(32*8, 32*8);
+ screen.set_visarea(12, 32*8-8-1, 0*8, 28*8-1);
+ screen.set_screen_update(FUNC(funkybee_state::screen_update_funkybee));
+ screen.set_palette(m_palette);
GFXDECODE(config, m_gfxdecode, m_palette, gfx_funkybee);
PALETTE(config, m_palette, FUNC(funkybee_state::funkybee_palette), 32);
@@ -319,7 +319,7 @@ MACHINE_CONFIG_START(funkybee_state::funkybee)
ay8912_device &ay8912(AY8912(config, "aysnd", 1500000)); // AY-3-8912 verified for Sky Lancer
ay8912.port_a_read_callback().set_ioport("DSW");
ay8912.add_route(ALL_OUTPUTS, "mono", 0.50);
-MACHINE_CONFIG_END
+}
/***************************************************************************
diff --git a/src/mame/drivers/funkyjet.cpp b/src/mame/drivers/funkyjet.cpp
index 00cda7b6019..2c2b8f0cef0 100644
--- a/src/mame/drivers/funkyjet.cpp
+++ b/src/mame/drivers/funkyjet.cpp
@@ -302,12 +302,12 @@ GFXDECODE_END
/******************************************************************************/
-MACHINE_CONFIG_START(funkyjet_state::funkyjet)
-
+void funkyjet_state::funkyjet(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD(m_maincpu, M68000, XTAL(28'000'000)/2) /* 28 MHz crystal */
- MCFG_DEVICE_PROGRAM_MAP(funkyjet_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", funkyjet_state, irq6_line_hold)
+ M68000(config, m_maincpu, XTAL(28'000'000)/2); /* 28 MHz crystal */
+ m_maincpu->set_addrmap(AS_PROGRAM, &funkyjet_state::funkyjet_map);
+ m_maincpu->set_vblank_int("screen", FUNC(funkyjet_state::irq6_line_hold));
H6280(config, m_audiocpu, XTAL(32'220'000)/4); /* Custom chip 45, Audio section crystal is 32.220 MHz */
m_audiocpu->set_addrmap(AS_PROGRAM, &funkyjet_state::sound_map);
@@ -315,13 +315,13 @@ MACHINE_CONFIG_START(funkyjet_state::funkyjet)
m_audiocpu->add_route(ALL_OUTPUTS, "rspeaker", 0);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(58)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(529))
- MCFG_SCREEN_SIZE(40*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 40*8-1, 1*8, 31*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(funkyjet_state, screen_update)
- MCFG_SCREEN_PALETTE("palette")
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(58);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(529));
+ screen.set_size(40*8, 32*8);
+ screen.set_visarea(0*8, 40*8-1, 1*8, 31*8-1);
+ screen.set_screen_update(FUNC(funkyjet_state::screen_update));
+ screen.set_palette("palette");
DECO146PROT(config, m_deco146, 0);
m_deco146->port_a_cb().set_ioport("INPUTS");
@@ -330,7 +330,7 @@ MACHINE_CONFIG_START(funkyjet_state::funkyjet)
m_deco146->soundlatch_irq_cb().set_inputline(m_audiocpu, 0);
m_deco146->set_interface_scramble_interleave();
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_funkyjet)
+ GFXDECODE(config, "gfxdecode", "palette", gfx_funkyjet);
PALETTE(config, "palette").set_format(palette_device::xBGR_444, 1024);
DECO16IC(config, m_deco_tilegen, 0);
@@ -360,10 +360,10 @@ MACHINE_CONFIG_START(funkyjet_state::funkyjet)
ymsnd.add_route(0, "lspeaker", 0.45);
ymsnd.add_route(1, "rspeaker", 0.45);
- MCFG_DEVICE_ADD("oki", OKIM6295, XTAL(28'000'000)/28, okim6295_device::PIN7_HIGH)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 0.50)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 0.50)
-MACHINE_CONFIG_END
+ okim6295_device &oki(OKIM6295(config, "oki", XTAL(28'000'000)/28, okim6295_device::PIN7_HIGH));
+ oki.add_route(ALL_OUTPUTS, "lspeaker", 0.50);
+ oki.add_route(ALL_OUTPUTS, "rspeaker", 0.50);
+}
/******************************************************************************/
diff --git a/src/mame/drivers/funtech.cpp b/src/mame/drivers/funtech.cpp
index 32e8d9949e7..47e48e8ac9e 100644
--- a/src/mame/drivers/funtech.cpp
+++ b/src/mame/drivers/funtech.cpp
@@ -487,35 +487,35 @@ void fun_tech_corp_state::machine_start()
}
-MACHINE_CONFIG_START(fun_tech_corp_state::funtech)
-
+void fun_tech_corp_state::funtech(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, 4000000) /* ? MHz */
- MCFG_DEVICE_PROGRAM_MAP(funtech_map)
- MCFG_DEVICE_IO_MAP(funtech_io_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", fun_tech_corp_state, vblank_interrupt)
+ Z80(config, m_maincpu, 4000000); /* ? MHz */
+ m_maincpu->set_addrmap(AS_PROGRAM, &fun_tech_corp_state::funtech_map);
+ m_maincpu->set_addrmap(AS_IO, &fun_tech_corp_state::funtech_io_map);
+ m_maincpu->set_vblank_int("screen", FUNC(fun_tech_corp_state::vblank_interrupt));
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(512, 256)
- MCFG_SCREEN_VISIBLE_AREA(0, 512-1, 8, 256-8-1)
- MCFG_SCREEN_UPDATE_DRIVER(fun_tech_corp_state, screen_update)
- MCFG_SCREEN_PALETTE("palette")
-
- MCFG_DEVICE_ADD(m_gfxdecode, GFXDECODE, "palette", gfx_funtech)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(512, 256);
+ screen.set_visarea(0, 512-1, 8, 256-8-1);
+ screen.set_screen_update(FUNC(fun_tech_corp_state::screen_update));
+ screen.set_palette("palette");
+
+ GFXDECODE(config, m_gfxdecode, "palette", gfx_funtech);
PALETTE(config, "palette").set_format(palette_device::xBGR_555, 0x200);
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_1);
- MCFG_TICKET_DISPENSER_ADD("hopper", attotime::from_msec(50), TICKET_MOTOR_ACTIVE_HIGH, TICKET_STATUS_ACTIVE_HIGH)
+ TICKET_DISPENSER(config, m_hopper, attotime::from_msec(50), TICKET_MOTOR_ACTIVE_HIGH, TICKET_STATUS_ACTIVE_HIGH);
/* sound hardware */
SPEAKER(config, "mono").front_center();
AY8910(config, "aysnd", 1500000).add_route(ALL_OUTPUTS, "mono", 1.00); /* M5255, ? MHz */
-MACHINE_CONFIG_END
+}
diff --git a/src/mame/drivers/funworld.cpp b/src/mame/drivers/funworld.cpp
index ea489963e5f..313a1b7a88a 100644
--- a/src/mame/drivers/funworld.cpp
+++ b/src/mame/drivers/funworld.cpp
@@ -3067,10 +3067,11 @@ void lunapark_state::machine_reset()
* Machine Drivers *
**************************/
-MACHINE_CONFIG_START(funworld_state::fw1stpal)
+void funworld_state::fw1stpal(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M65SC02, CPU_CLOCK) /* 2MHz */
- MCFG_DEVICE_PROGRAM_MAP(funworld_map)
+ M65SC02(config, m_maincpu, CPU_CLOCK); /* 2MHz */
+ m_maincpu->set_addrmap(AS_PROGRAM, &funworld_state::funworld_map);
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
@@ -3085,17 +3086,16 @@ MACHINE_CONFIG_START(funworld_state::fw1stpal)
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE((124+1)*4, (30+1)*8) /* Taken from MC6845 init, registers 00 & 04. Normally programmed with (value-1) */
- MCFG_SCREEN_VISIBLE_AREA(0*4, 96*4-1, 0*8, 29*8-1) /* Taken from MC6845 init, registers 01 & 06 */
- MCFG_SCREEN_UPDATE_DRIVER(funworld_state, screen_update_funworld)
- MCFG_SCREEN_PALETTE("palette")
-
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_fw1stpal)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size((124+1)*4, (30+1)*8); /* Taken from MC6845 init, registers 00 & 04. Normally programmed with (value-1) */
+ screen.set_visarea(0*4, 96*4-1, 0*8, 29*8-1); /* Taken from MC6845 init, registers 01 & 06 */
+ screen.set_screen_update(FUNC(funworld_state::screen_update_funworld));
+ screen.set_palette(m_palette);
- PALETTE(config, "palette", FUNC(funworld_state::funworld_palette), 0x200);
+ GFXDECODE(config, m_gfxdecode, m_palette, gfx_fw1stpal);
+ PALETTE(config, m_palette, FUNC(funworld_state::funworld_palette), 0x200);
mc6845_device &crtc(MC6845(config, "crtc", CRTC_CLOCK)); /* 2MHz, verified on jollycrd & royalcrd */
crtc.set_screen("screen");
@@ -3110,33 +3110,38 @@ MACHINE_CONFIG_START(funworld_state::fw1stpal)
ay8910.port_a_write_callback().set(FUNC(funworld_state::funworld_lamp_a_w));
ay8910.port_b_write_callback().set(FUNC(funworld_state::funworld_lamp_b_w));
ay8910.add_route(ALL_OUTPUTS, "mono", 2.5); /* analyzed to avoid clips */
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(funworld_state::fw2ndpal)
+void funworld_state::fw2ndpal(machine_config &config)
+{
fw1stpal(config);
- MCFG_DEVICE_REPLACE("maincpu", R65C02, CPU_CLOCK) /* 2MHz */
- MCFG_DEVICE_PROGRAM_MAP(funworld_map)
- MCFG_GFXDECODE_MODIFY("gfxdecode", gfx_fw2ndpal)
-MACHINE_CONFIG_END
+ R65C02(config.replace(), m_maincpu, CPU_CLOCK); /* 2MHz */
+ m_maincpu->set_addrmap(AS_PROGRAM, &funworld_state::funworld_map);
+ m_gfxdecode->set_info(gfx_fw2ndpal);
+}
-MACHINE_CONFIG_START(funworld_state::funquiz)
+
+
+void funworld_state::funquiz(machine_config &config)
+{
fw1stpal(config);
// fw2ndpal(config);
- MCFG_DEVICE_REPLACE("maincpu", R65C02, CPU_CLOCK) /* 2MHz */
- MCFG_DEVICE_PROGRAM_MAP(funquiz_map)
+ R65C02(config.replace(), m_maincpu, CPU_CLOCK); /* 2MHz */
+ m_maincpu->set_addrmap(AS_PROGRAM, &funworld_state::funquiz_map);
subdevice<ay8910_device>("ay8910")->port_a_read_callback().set(FUNC(funworld_state::funquiz_ay8910_a_r));
subdevice<ay8910_device>("ay8910")->port_b_read_callback().set(FUNC(funworld_state::funquiz_ay8910_b_r));
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(magicrd2_state::magicrd2)
+void magicrd2_state::magicrd2(machine_config &config)
+{
fw1stpal(config);
- MCFG_DEVICE_REPLACE("maincpu", R65C02, CPU_CLOCK) /* 2MHz */
- MCFG_DEVICE_PROGRAM_MAP(magicrd2_map)
+ R65C02(config.replace(), m_maincpu, CPU_CLOCK); /* 2MHz */
+ m_maincpu->set_addrmap(AS_PROGRAM, &magicrd2_state::magicrd2_map);
subdevice<mc6845_device>("crtc")->set_visarea_adjust(0, -56, 0, 0);
@@ -3144,632 +3149,99 @@ MACHINE_CONFIG_START(magicrd2_state::magicrd2)
ay8910.port_a_write_callback().set(FUNC(magicrd2_state::funworld_lamp_a_w));
ay8910.port_b_write_callback().set(FUNC(magicrd2_state::funworld_lamp_b_w));
ay8910.add_route(ALL_OUTPUTS, "mono", 1.5); /* analyzed to avoid clips */
-MACHINE_CONFIG_END
-
-
-MACHINE_CONFIG_START(funworld_state::royalcd1)
- fw1stpal(config);
- MCFG_DEVICE_REPLACE("maincpu", R65C02, CPU_CLOCK) /* (G65SC02P in pro version) 2MHz */
- MCFG_DEVICE_PROGRAM_MAP(magicrd2_map)
-MACHINE_CONFIG_END
-
-
-MACHINE_CONFIG_START(funworld_state::royalcd2)
- fw2ndpal(config);
- MCFG_DEVICE_REPLACE("maincpu", R65C02, CPU_CLOCK) /* 2MHz */
- MCFG_DEVICE_PROGRAM_MAP(magicrd2_map)
-MACHINE_CONFIG_END
-
-
-MACHINE_CONFIG_START(funworld_state::cuoreuno)
- fw1stpal(config);
- MCFG_DEVICE_REPLACE("maincpu", R65C02, CPU_CLOCK) /* 2MHz */
- MCFG_DEVICE_PROGRAM_MAP(cuoreuno_map)
-MACHINE_CONFIG_END
-
-
-MACHINE_CONFIG_START(funworld_state::saloon)
- fw1stpal(config);
- MCFG_DEVICE_REPLACE("maincpu", R65C02, CPU_CLOCK) /* 2MHz */
- MCFG_DEVICE_PROGRAM_MAP(saloon_map)
-MACHINE_CONFIG_END
-
-
-MACHINE_CONFIG_START(funworld_state::witchryl)
- fw1stpal(config);
- MCFG_DEVICE_REPLACE("maincpu", R65C02, CPU_CLOCK) /* 2MHz */
- MCFG_DEVICE_PROGRAM_MAP(witchryl_map)
-MACHINE_CONFIG_END
-
-
-MACHINE_CONFIG_START(lunapark_state::lunapark)
- fw1stpal(config);
- MCFG_DEVICE_REPLACE("maincpu", R65C02, CPU_CLOCK) /* 2MHz */
- MCFG_DEVICE_PROGRAM_MAP(lunapark_map) // mirrored video RAM (4000/5000 to 6000/7000).
-MACHINE_CONFIG_END
-
-
-MACHINE_CONFIG_START(chinatow_state::chinatow)
- fw2ndpal(config);
- MCFG_DEVICE_REPLACE("maincpu", R65C02, CPU_CLOCK) /* 2MHz */
- MCFG_DEVICE_PROGRAM_MAP(chinatow_map)
-MACHINE_CONFIG_END
-
-MACHINE_CONFIG_START(chinatow_state::rcdino4)
- fw1stpal(config);
- MCFG_DEVICE_REPLACE("maincpu", R65C02, CPU_CLOCK) /* 2MHz */
- MCFG_DEVICE_PROGRAM_MAP(chinatow_map)
-MACHINE_CONFIG_END
-
-
-MACHINE_CONFIG_START(funworld_state::intrgmes)
- fw1stpal(config);
- MCFG_DEVICE_REPLACE("maincpu", R65C02, CPU_CLOCK) /* 2MHz */
- MCFG_DEVICE_PROGRAM_MAP(intergames_map)
- MCFG_GFXDECODE_MODIFY("gfxdecode", gfx_fw2ndpal)
-MACHINE_CONFIG_END
-
-
-MACHINE_CONFIG_START(funworld_state::fw_brick_1)
- fw1stpal(config);
- MCFG_DEVICE_REPLACE("maincpu", R65C02, CPU_CLOCK) /* 2MHz */
- MCFG_DEVICE_PROGRAM_MAP(fw_a7_11_map)
-// MCFG_GFXDECODE_MODIFY("gfxdecode", gfx_fw2ndpal)
-MACHINE_CONFIG_END
-
-
-MACHINE_CONFIG_START(funworld_state::fw_brick_2)
- fw2ndpal(config);
- MCFG_DEVICE_REPLACE("maincpu", R65C02, CPU_CLOCK) /* 2MHz */
- MCFG_DEVICE_PROGRAM_MAP(fw_a7_11_map)
-// MCFG_GFXDECODE_MODIFY("gfxdecode", gfx_fw2ndpal)
-MACHINE_CONFIG_END
-
-// TO-DO: clean up and relocate, when convenient, all the opcode-encryption stuff
-
-class royalcrdf_state : public funworld_state
-{
-public:
- royalcrdf_state(const machine_config &mconfig, device_type type, const char* tag)
- : funworld_state(mconfig, type, tag)
- {
- }
-
- void royalcrdf(machine_config& config);
-
- void driver_init() override;
-
-private:
- cpu_device* _maincpu {};
- DECLARE_READ8_MEMBER(royalcrdf_opcode_r);
-
- void royalcrdf_opcodes_map(address_map& map);
-};
-
-READ8_MEMBER(royalcrdf_state::royalcrdf_opcode_r)
-{
- // address-based data bitswap; 4 address bits are involved, but only
- // 5 different bitswaps exist, with clear regularities, so the
- // hardware is probably selecting the appropiate one by
- // applying passive logic to the address bits; we encode it
- // indexed by all the involved address bits instead. A notable fact is that
- // all the permutations in royalcrdf & multiwin are odd-parity ones,
- // so an intriguing possibility is that the hardware be applying
- // a fixed odd number (3 would suffice) of address-dependent
- // 1-bit-to-1-bit bitswaps; furthermore, in both sets one of the
- // bitswaps is equal to the one applied to all the data (but notice
- // that, in those cases, we are applying it twice to opcodes here)
- constexpr std::array<std::array<int,4>,16> bs{ // bitswaps for data bits 1,2,5 & 7, in that order
- 1,5,2,7,
- 1,5,2,7,
- 5,1,7,2,
- 7,2,5,1,
- 1,5,2,7,
- 1,5,2,7,
- 5,2,1,7,
- 7,2,5,1,
- 1,5,2,7,
- 1,5,2,7,
- 5,1,7,2,
- 1,7,5,2,
- 1,5,2,7,
- 1,5,2,7,
- 5,2,1,7,
- 1,7,5,2,
- };
-
- // xor masks, dependent on the same address bits than the bitswaps,
- // and with the same 5-values structure
- constexpr std::array<uint8_t,16> xm {
- 0x02, 0x02, 0xa6, 0x82, 0x02, 0x02, 0x06, 0x82, 0x02, 0x02, 0xa6, 0x00, 0x02, 0x02, 0x06, 0x00
- };
-
- uint8_t data {_maincpu->space(AS_PROGRAM).read_byte(offset)};
- unsigned idx {bitswap<4>(offset, 8,5,2,1)};
-
- return bitswap<8>(data, bs[idx][3],6,bs[idx][2],4,3,bs[idx][1],bs[idx][0],0) ^ xm[idx];
}
-void royalcrdf_state::royalcrdf_opcodes_map(address_map &map)
-{
- map(0x8000, 0xffff).r(FUNC(royalcrdf_state::royalcrdf_opcode_r));
-}
-void royalcrdf_state::driver_init()
+void funworld_state::royalcd1(machine_config &config)
{
- uint8_t *ROM = memregion("maincpu")->base();
- for (int x = 0x8000; x < 0x10000; x++)
- {
- ROM[x] = bitswap<8>(ROM[x]^0x22,2,6,7,4,3,1,5,0);
- }
+ fw1stpal(config);
+ R65C02(config.replace(), m_maincpu, CPU_CLOCK); /* (G65SC02P in pro version) 2MHz */
+ m_maincpu->set_addrmap(AS_PROGRAM, &funworld_state::magicrd2_map);
}
-void royalcrdf_state::royalcrdf(machine_config &config)
+
+void funworld_state::royalcd2(machine_config &config)
{
fw2ndpal(config);
-
- _maincpu = reinterpret_cast<cpu_device*>(config.device("maincpu"));
- _maincpu->set_addrmap(AS_OPCODES, &royalcrdf_state::royalcrdf_opcodes_map);
+ R65C02(config.replace(), m_maincpu, CPU_CLOCK); /* 2MHz */
+ m_maincpu->set_addrmap(AS_PROGRAM, &funworld_state::magicrd2_map);
}
-class multiwin_state : public funworld_state
-{
-public:
- multiwin_state(const machine_config &mconfig, device_type type, const char* tag)
- : funworld_state(mconfig, type, tag)
- {
- }
-
- void multiwin(machine_config& config);
-
- void driver_init() override;
-
-private:
- cpu_device* _maincpu {};
- DECLARE_READ8_MEMBER(multiwin_opcode_r);
-
- void multiwin_opcodes_map(address_map& map);
-};
-READ8_MEMBER(multiwin_state::multiwin_opcode_r)
-{
- // same general encryption scheme than the one used by the EVONA Royald Card set;
- // 4 address bits determine which bitswap+xor is applied to the opcodes; in this case,
- // one of the address bits don't have effect on the bitswap, just on the xor;
- // again, we have just five different bitswaps, and the hardware is probably using
- // passive logic on the address bits to do the selection
- constexpr std::array<std::array<int,5>,8> bs { // bitswaps for data bits 0,2,4,5 & 7, in that order
- 5,2,4,0,7,
- 4,0,2,7,5,
- 7,4,5,2,0,
- 4,0,2,7,5,
- 2,7,0,5,4,
- 4,0,2,7,5,
- 0,5,7,4,2,
- 4,0,2,7,5,
- };
-
- // xor masks
- constexpr std::array<uint8_t,16> xm {
- 0x00, 0x00, 0x10, 0x00, 0x20, 0x00, 0x30, 0x00, 0x00, 0xb5, 0x10, 0xb5, 0x20, 0xb5, 0x30, 0xb5
- };
-
- uint8_t data {_maincpu->space(AS_PROGRAM).read_byte(offset)};
- unsigned idx {bitswap<4>(offset, 6,9,5,3)};
-
- return bitswap<8>(data, bs[idx&7][4],6,bs[idx&7][3],bs[idx&7][2],3,bs[idx&7][1],1,bs[idx&7][0]) ^ xm[idx];
-}
-
-void multiwin_state::multiwin_opcodes_map(address_map &map)
+void funworld_state::cuoreuno(machine_config &config)
{
- map(0x8000, 0xffff).r(FUNC(multiwin_state::multiwin_opcode_r));
+ fw1stpal(config);
+ R65C02(config.replace(), m_maincpu, CPU_CLOCK); /* 2MHz */
+ m_maincpu->set_addrmap(AS_PROGRAM, &funworld_state::cuoreuno_map);
}
-void multiwin_state::driver_init()
-{
- uint8_t *ROM = memregion("maincpu")->base();
- for (int x = 0x8000; x < 0x10000; x++)
- {
- ROM[x] = bitswap<8>(ROM[x]^0x91,5,6,7,2,3,0,1,4);
- }
-}
-void multiwin_state::multiwin(machine_config &config)
+void funworld_state::saloon(machine_config &config)
{
- fw2ndpal(config);
-
- _maincpu = reinterpret_cast<cpu_device*>(config.device("maincpu"));
- _maincpu->set_addrmap(AS_OPCODES, &multiwin_state::multiwin_opcodes_map);
+ fw1stpal(config);
+ R65C02(config.replace(), m_maincpu, CPU_CLOCK); /* 2MHz */
+ m_maincpu->set_addrmap(AS_PROGRAM, &funworld_state::saloon_map);
}
-class powercrd_state : public funworld_state
+void funworld_state::witchryl(machine_config &config)
{
-public:
- powercrd_state(const machine_config &mconfig, device_type type, const char* tag)
- : funworld_state(mconfig, type, tag)
- {
- }
-
- void powercrd(machine_config& config);
-
-private:
- cpu_device* _maincpu {};
- DECLARE_READ8_MEMBER(powercrd_opcode_r);
-
- void powercrd_opcodes_map(address_map& map);
-};
-
-READ8_MEMBER(powercrd_state::powercrd_opcode_r)
-{
- // encryption controlled by the lower two bits of the address; no clear structure is
- // seen in the tables, so it looks like a lookup into randomly or pseudorandomly
- // generated permutation tables; all opcodes in the [8da0, 9e0b) & [c000, ef80) are
- // believed to be covered by these tables; errors could be lurking in the least used opcodes;
- // this same encryption scheme (with different tables) is seen in megacard & jokercrd
-
- constexpr uint8_t UNKN {0xfc};
-
- constexpr std::array<std::array<uint8_t,256>,4> decryption_tables
- {
- //_0 _1 _2 _3 _4 _5 _6 _7 _8 _9 _a _b _c _d _e _f
- 0xe8, 0x29, UNKN, UNKN, 0x85, UNKN, 0x18, UNKN, UNKN, UNKN, UNKN, UNKN, UNKN, UNKN, UNKN, 0xd5, // 0_
- UNKN, UNKN, 0xa6, 0x4c, UNKN, UNKN, 0x84, UNKN, UNKN, UNKN, 0x69, UNKN, 0x91, 0x38, 0xa8, UNKN, // 1_
- UNKN, 0x9d, 0xd8, 0x49, 0xc0, UNKN, 0x66, UNKN, UNKN, 0xe6, 0xb9, 0xad, UNKN, UNKN, UNKN, 0x10, // 2_
- UNKN, 0xd0, UNKN, 0x92, UNKN, UNKN, 0x74, UNKN, 0x9e, UNKN, UNKN, UNKN, UNKN, 0xb1, UNKN, 0x3d, // 3_
- 0xa5, 0xc4, UNKN, UNKN, UNKN, 0xce, 0x6a, 0x3a, UNKN, UNKN, UNKN, UNKN, 0xa2, UNKN, UNKN, UNKN, // 4_
- 0x9c, UNKN, UNKN, UNKN, UNKN, 0x79, UNKN, UNKN, UNKN, UNKN, UNKN, UNKN, UNKN, UNKN, UNKN, UNKN, // 5_
- UNKN, 0xed, UNKN, UNKN, UNKN, UNKN, 0xc9, 0x99, UNKN, 0xa9, UNKN, UNKN, UNKN, UNKN, UNKN, UNKN, // 6_
- UNKN, UNKN, 0xc8, UNKN, 0xe0, 0x2d, UNKN, 0x7d, UNKN, UNKN, 0x80, 0x64, 0xf0, UNKN, UNKN, UNKN, // 7_
- UNKN, UNKN, UNKN, UNKN, 0x98, UNKN, UNKN, UNKN, 0xbd, UNKN, UNKN, UNKN, 0x1a, UNKN, UNKN, UNKN, // 8_
- UNKN, 0x30, UNKN, UNKN, 0xc6, 0x90, UNKN, UNKN, UNKN, 0x6d, 0xee, UNKN, UNKN, UNKN, 0xe4, UNKN, // 9_
- UNKN, 0x68, UNKN, UNKN, UNKN, UNKN, UNKN, 0x0d, 0x95, UNKN, 0x8e, 0x40, UNKN, 0x20, 0xb2, UNKN, // a_
- UNKN, UNKN, UNKN, UNKN, UNKN, 0x65, UNKN, UNKN, UNKN, UNKN, UNKN, 0xa4, UNKN, UNKN, 0x05, UNKN, // b_
- UNKN, UNKN, 0xba, 0x8a, UNKN, UNKN, UNKN, 0x60, 0xf8, UNKN, UNKN, UNKN, UNKN, UNKN, UNKN, UNKN, // c_
- 0xdd, UNKN, UNKN, UNKN, 0xaa, 0xe9, 0x8d, 0xa0, UNKN, 0xb5, UNKN, 0xca, UNKN, UNKN, 0x0a, UNKN, // d_
- 0x2a, UNKN, UNKN, UNKN, 0xb0, UNKN, UNKN, 0x48, UNKN, UNKN, UNKN, UNKN, UNKN, 0x4a, 0xcd, 0x45, // e_
- UNKN, UNKN, UNKN, 0x09, UNKN, UNKN, 0xc5, UNKN, UNKN, 0x88, 0xae, UNKN, 0x86, UNKN, 0xda, 0x8c, // f_
-
- //_0 _1 _2 _3 _4 _5 _6 _7 _8 _9 _a _b _c _d _e _f
- UNKN, UNKN, UNKN, 0xae, UNKN, 0x4e, 0xda, UNKN, UNKN, UNKN, 0x60, UNKN, UNKN, UNKN, UNKN, 0x64, // 0_
- 0xa0, UNKN, UNKN, UNKN, UNKN, UNKN, UNKN, UNKN, 0x86, 0x9c, 0x88, 0xe4, 0xc4, UNKN, UNKN, 0x95, // 1_
- 0x2a, UNKN, 0xe0, UNKN, UNKN, 0x99, UNKN, UNKN, 0x90, UNKN, UNKN, UNKN, 0x6c, 0x49, UNKN, UNKN, // 2_
- 0xf0, UNKN, UNKN, UNKN, UNKN, UNKN, UNKN, UNKN, UNKN, 0x66, UNKN, 0x11, 0xee, UNKN, UNKN, 0x4c, // 3_
- 0xb0, UNKN, UNKN, 0x45, 0xc6, UNKN, UNKN, UNKN, UNKN, 0xcd, UNKN, UNKN, 0xc8, 0x1a, UNKN, UNKN, // 4_
- UNKN, UNKN, 0x09, 0x91, UNKN, 0xc9, 0xf8, UNKN, UNKN, UNKN, UNKN, UNKN, UNKN, 0x92, 0x20, 0xa4, // 5_
- UNKN, 0x65, UNKN, 0xe8, UNKN, 0xd8, 0x3d, UNKN, UNKN, UNKN, UNKN, UNKN, 0x80, 0xbd, 0x84, UNKN, // 6_
- UNKN, UNKN, UNKN, 0x68, UNKN, UNKN, UNKN, UNKN, UNKN, UNKN, UNKN, UNKN, UNKN, UNKN, UNKN, UNKN, // 7_
- 0xaa, UNKN, UNKN, UNKN, UNKN, UNKN, 0x0d, 0x18, UNKN, UNKN, UNKN, 0x8a, UNKN, UNKN, UNKN, 0x26, // 8_
- 0xc0, UNKN, UNKN, UNKN, 0x3a, 0xc5, UNKN, 0x6d, 0xe9, UNKN, 0x4a, 0xb9, UNKN, 0x05, 0x0a, UNKN, // 9_
- UNKN, 0xfa, UNKN, UNKN, UNKN, 0xd5, UNKN, UNKN, UNKN, UNKN, UNKN, UNKN, UNKN, UNKN, 0x48, UNKN, // a_
- 0x10, UNKN, 0xf9, 0x5a, UNKN, 0xa2, UNKN, UNKN, UNKN, UNKN, UNKN, 0xa9, UNKN, 0xa6, UNKN, UNKN, // b_
- 0xca, UNKN, UNKN, 0x85, UNKN, UNKN, UNKN, UNKN, UNKN, 0xb2, UNKN, UNKN, UNKN, 0x9d, UNKN, 0x7a, // c_
- UNKN, 0x79, 0xa5, UNKN, UNKN, 0xb1, UNKN, 0x8e, 0xad, UNKN, UNKN, UNKN, UNKN, UNKN, UNKN, UNKN, // d_
- UNKN, UNKN, UNKN, UNKN, UNKN, UNKN, 0x2d, UNKN, UNKN, UNKN, 0x8d, UNKN, UNKN, UNKN, 0xb5, 0xce, // e_
- UNKN, UNKN, 0x38, UNKN, 0xe6, UNKN, UNKN, 0xd0, 0x69, UNKN, UNKN, 0x29, UNKN, UNKN, UNKN, UNKN, // f_
-
- //_0 _1 _2 _3 _4 _5 _6 _7 _8 _9 _a _b _c _d _e _f
- UNKN, UNKN, 0x30, 0xb5, 0x49, 0xb0, UNKN, 0xc5, UNKN, 0x1a, UNKN, UNKN, UNKN, UNKN, 0x90, UNKN, // 0_
- UNKN, UNKN, UNKN, UNKN, 0xaa, UNKN, UNKN, 0x2d, UNKN, UNKN, UNKN, UNKN, UNKN, UNKN, UNKN, UNKN, // 1_
- UNKN, UNKN, UNKN, UNKN, UNKN, UNKN, 0x4a, 0x9a, UNKN, 0xfa, UNKN, UNKN, 0x5a, UNKN, 0xae, UNKN, // 2_
- UNKN, UNKN, 0xe0, UNKN, UNKN, UNKN, 0x8d, 0x0a, UNKN, UNKN, 0xed, UNKN, 0x88, UNKN, UNKN, UNKN, // 3_
- UNKN, UNKN, UNKN, UNKN, UNKN, UNKN, UNKN, 0xee, UNKN, UNKN, UNKN, 0xb1, UNKN, 0x9c, UNKN, 0x0d, // 4_
- 0x4c, UNKN, 0x69, UNKN, UNKN, 0xa9, UNKN, UNKN, 0x05, 0xa4, UNKN, 0x4e, UNKN, UNKN, UNKN, UNKN, // 5_
- 0xc6, UNKN, UNKN, 0xbd, 0x09, UNKN, UNKN, UNKN, UNKN, 0x20, UNKN, 0x3a, 0xc0, UNKN, UNKN, UNKN, // 6_
- 0xa0, UNKN, UNKN, UNKN, 0x80, UNKN, 0x95, UNKN, UNKN, UNKN, 0xe8, UNKN, 0xd0, UNKN, UNKN, UNKN, // 7_
- 0x60, 0xe9, UNKN, UNKN, UNKN, UNKN, UNKN, UNKN, UNKN, 0x40, UNKN, UNKN, UNKN, UNKN, UNKN, UNKN, // 8_
- UNKN, UNKN, 0x9d, UNKN, UNKN, UNKN, UNKN, 0xa5, UNKN, UNKN, 0xf0, UNKN, UNKN, UNKN, UNKN, UNKN, // 9_
- UNKN, 0x38, UNKN, 0xca, 0xa2, 0x8e, UNKN, 0xb9, UNKN, 0xa6, 0xcd, 0x2a, UNKN, UNKN, UNKN, UNKN, // a_
- UNKN, UNKN, 0xad, UNKN, UNKN, UNKN, UNKN, UNKN, 0xf8, UNKN, UNKN, 0x11, 0xce, UNKN, UNKN, UNKN, // b_
- UNKN, UNKN, 0xda, UNKN, UNKN, UNKN, 0x6c, UNKN, UNKN, UNKN, UNKN, 0x8a, UNKN, UNKN, UNKN, UNKN, // c_
- UNKN, UNKN, UNKN, 0x84, UNKN, UNKN, UNKN, UNKN, 0xc9, UNKN, 0x7a, UNKN, 0x48, 0xd8, UNKN, 0x18, // d_
- 0xe6, UNKN, UNKN, 0x68, UNKN, 0x29, UNKN, UNKN, 0xc4, 0x65, UNKN, UNKN, 0xa8, UNKN, 0x85, UNKN, // e_
- UNKN, 0xc8, 0xd5, 0xe4, UNKN, 0x7d, 0x10, UNKN, UNKN, UNKN, 0x25, UNKN, UNKN, 0x1d, 0x64, UNKN, // f_
-
- //_0 _1 _2 _3 _4 _5 _6 _7 _8 _9 _a _b _c _d _e _f
- UNKN, 0x99, 0xf0, UNKN, UNKN, UNKN, 0xae, UNKN, UNKN, UNKN, UNKN, 0x64, UNKN, UNKN, 0x2a, UNKN, // 0_
- 0xb5, UNKN, 0xa6, UNKN, UNKN, 0x65, UNKN, 0xf8, UNKN, UNKN, UNKN, 0x58, UNKN, UNKN, 0xc8, UNKN, // 1_
- 0x1a, UNKN, UNKN, UNKN, 0x09, 0x91, UNKN, 0xe0, UNKN, UNKN, UNKN, 0xad, UNKN, UNKN, UNKN, UNKN, // 2_
- UNKN, 0xa4, 0xb0, UNKN, 0xd9, 0xe4, 0xd0, UNKN, UNKN, 0x5a, 0x2d, UNKN, UNKN, 0x4c, 0xa0, UNKN, // 3_
- 0x85, UNKN, 0x49, UNKN, UNKN, UNKN, UNKN, UNKN, 0x88, UNKN, UNKN, 0xbd, 0x69, 0x95, UNKN, UNKN, // 4_
- UNKN, 0xe9, UNKN, UNKN, UNKN, UNKN, UNKN, 0x80, 0x0d, UNKN, UNKN, 0x30, UNKN, UNKN, UNKN, 0x9d, // 5_
- UNKN, UNKN, UNKN, 0x26, UNKN, 0xd5, 0x1d, UNKN, 0x4e, UNKN, 0xe8, UNKN, UNKN, UNKN, UNKN, 0x05, // 6_
- 0xa5, UNKN, UNKN, UNKN, 0x68, UNKN, UNKN, 0xcd, UNKN, UNKN, UNKN, UNKN, UNKN, 0x25, UNKN, UNKN, // 7_
- UNKN, UNKN, UNKN, 0xc9, UNKN, UNKN, UNKN, 0xa2, UNKN, UNKN, 0x45, UNKN, UNKN, 0xa8, UNKN, UNKN, // 8_
- 0x9a, UNKN, 0xca, UNKN, UNKN, UNKN, UNKN, UNKN, 0xe6, UNKN, UNKN, UNKN, UNKN, UNKN, 0x60, 0x8d, // 9_
- UNKN, UNKN, UNKN, UNKN, UNKN, 0xda, 0xee, 0xb2, 0x7d, UNKN, UNKN, 0x84, UNKN, UNKN, 0xaa, UNKN, // a_
- 0x90, UNKN, UNKN, 0x6d, 0xb1, UNKN, UNKN, UNKN, UNKN, 0x78, UNKN, UNKN, 0x8e, UNKN, 0xc0, 0x40, // b_
- UNKN, UNKN, 0x38, 0xc6, UNKN, UNKN, UNKN, UNKN, UNKN, 0xd8, UNKN, UNKN, 0x0a, UNKN, UNKN, 0xb9, // c_
- UNKN, UNKN, UNKN, UNKN, UNKN, UNKN, UNKN, UNKN, UNKN, 0xfa, UNKN, UNKN, UNKN, UNKN, 0x10, 0x20, // d_
- UNKN, UNKN, UNKN, UNKN, UNKN, UNKN, UNKN, UNKN, UNKN, 0xa9, UNKN, UNKN, UNKN, UNKN, 0xc5, UNKN, // e_
- UNKN, 0x86, 0x29, 0x4a, UNKN, UNKN, 0x18, 0x98, UNKN, UNKN, UNKN, 0x9c, UNKN, 0x7a, UNKN, 0x48, // f_
- };
-
- uint8_t data {_maincpu->space(AS_PROGRAM).read_byte(offset)};
- return decryption_tables[offset&3][data];
+ fw1stpal(config);
+ R65C02(config.replace(), m_maincpu, CPU_CLOCK); /* 2MHz */
+ m_maincpu->set_addrmap(AS_PROGRAM, &funworld_state::witchryl_map);
}
-void powercrd_state::powercrd_opcodes_map(address_map &map)
+
+void lunapark_state::lunapark(machine_config &config)
{
- map(0x8000, 0xffff).r(FUNC(powercrd_state::powercrd_opcode_r));
+ fw1stpal(config);
+ R65C02(config.replace(), m_maincpu, CPU_CLOCK); /* 2MHz */
+ m_maincpu->set_addrmap(AS_PROGRAM, &lunapark_state::lunapark_map); // mirrored video RAM (4000/5000 to 6000/7000).
}
-void powercrd_state::powercrd(machine_config &config)
+
+void chinatow_state::chinatow(machine_config &config)
{
fw2ndpal(config);
-
- _maincpu = reinterpret_cast<cpu_device*>(config.device("maincpu"));
- _maincpu->set_addrmap(AS_OPCODES, &powercrd_state::powercrd_opcodes_map);
+ R65C02(config.replace(), m_maincpu, CPU_CLOCK); /* 2MHz */
+ m_maincpu->set_addrmap(AS_PROGRAM, &chinatow_state::chinatow_map);
}
-class megacard_state : public funworld_state
+void chinatow_state::rcdino4(machine_config &config)
{
-public:
- megacard_state(const machine_config &mconfig, device_type type, const char* tag)
- : funworld_state(mconfig, type, tag)
- {
- }
-
- void megacard(machine_config& config);
-
-private:
- cpu_device* _maincpu {};
- DECLARE_READ8_MEMBER(megacard_opcode_r);
-
- void megacard_opcodes_map(address_map& map);
-};
-
-READ8_MEMBER(megacard_state::megacard_opcode_r)
-{
- // all opcodes in the [c000, fc80) range are believed to be covered by these tables;
- // errors could be lurking in the least used opcodes
-
- constexpr uint8_t UNKN {0xfc};
-
- constexpr std::array<std::array<uint8_t,256>,4> decryption_tables
- {
- //_0 _1 _2 _3 _4 _5 _6 _7 _8 _9 _a _b _c _d _e _f
- UNKN, 0x6c, UNKN, UNKN, UNKN, 0xfa, 0x38, UNKN, UNKN, 0x4c, 0xd8, UNKN, 0xe8, UNKN, 0xc5, UNKN, // 0_
- UNKN, 0xa6, 0x91, UNKN, UNKN, UNKN, UNKN, 0x58, 0xa0, 0xe0, 0xb9, 0x4e, UNKN, UNKN, UNKN, 0x78, // 1_
- 0xe9, 0xee, UNKN, 0xca, 0x85, UNKN, 0xe6, UNKN, UNKN, UNKN, 0xcd, UNKN, UNKN, UNKN, UNKN, UNKN, // 2_
- UNKN, UNKN, UNKN, UNKN, 0x90, UNKN, UNKN, 0x64, UNKN, UNKN, 0x45, 0x60, UNKN, UNKN, 0x69, UNKN, // 3_
- UNKN, UNKN, 0xea, 0xf8, 0x7a, UNKN, UNKN, 0x1a, UNKN, UNKN, UNKN, UNKN, UNKN, 0xb1, UNKN, 0x80, // 4_
- UNKN, UNKN, 0x84, UNKN, UNKN, UNKN, UNKN, 0x49, UNKN, UNKN, 0x7c, UNKN, 0x20, 0x8a, 0xed, UNKN, // 5_
- 0x8c, UNKN, UNKN, UNKN, 0x5a, UNKN, UNKN, UNKN, 0xa8, 0xa9, UNKN, 0x6d, 0xc9, 0x95, UNKN, 0xda, // 6_
- 0xaa, 0xe4, UNKN, UNKN, UNKN, UNKN, 0x8e, 0xae, 0x3a, 0xc0, UNKN, 0xd5, 0x92, UNKN, UNKN, UNKN, // 7_
- 0xc6, UNKN, UNKN, UNKN, UNKN, UNKN, 0x48, UNKN, UNKN, 0x86, 0x9c, UNKN, UNKN, 0xc8, UNKN, UNKN, // 8_
- UNKN, 0x68, UNKN, UNKN, UNKN, UNKN, UNKN, 0xd0, 0xa2, UNKN, UNKN, UNKN, UNKN, 0x25, UNKN, 0xa5, // 9_
- UNKN, 0x9d, UNKN, UNKN, UNKN, UNKN, UNKN, UNKN, 0xbd, UNKN, UNKN, UNKN, UNKN, UNKN, UNKN, 0xa4, // a_
- UNKN, UNKN, UNKN, 0xb2, UNKN, 0x29, UNKN, 0x09, UNKN, UNKN, UNKN, 0xb0, UNKN, UNKN, 0xb5, UNKN, // b_
- UNKN, UNKN, UNKN, UNKN, UNKN, UNKN, UNKN, UNKN, 0x0a, UNKN, UNKN, 0x7d, UNKN, 0xf0, UNKN, 0x00, // c_
- UNKN, UNKN, UNKN, UNKN, 0x2d, UNKN, UNKN, UNKN, 0x4a, 0x88, 0x05, UNKN, UNKN, 0x10, 0xce, UNKN, // d_
- UNKN, UNKN, 0xc4, UNKN, 0x18, UNKN, UNKN, UNKN, 0x99, 0xf9, UNKN, UNKN, UNKN, UNKN, UNKN, 0xdd, // e_
- 0x11, UNKN, 0x26, UNKN, 0x65, 0x98, UNKN, 0xad, 0x2a, UNKN, UNKN, 0x8d, UNKN, UNKN, UNKN, UNKN, // f_
-
- //_0 _1 _2 _3 _4 _5 _6 _7 _8 _9 _a _b _c _d _e _f
- UNKN, UNKN, UNKN, 0x18, UNKN, UNKN, UNKN, 0x8e, UNKN, UNKN, UNKN, UNKN, UNKN, 0xaa, 0xcd, 0x0a, // 0_
- 0xe6, UNKN, UNKN, UNKN, UNKN, UNKN, UNKN, UNKN, UNKN, UNKN, UNKN, 0xad, UNKN, UNKN, UNKN, UNKN, // 1_
- UNKN, UNKN, UNKN, UNKN, UNKN, UNKN, 0x69, UNKN, 0xd0, UNKN, UNKN, UNKN, UNKN, UNKN, 0x2d, UNKN, // 2_
- UNKN, 0x88, UNKN, UNKN, UNKN, 0x98, UNKN, 0x99, UNKN, 0xb1, UNKN, UNKN, 0x9c, 0x1a, UNKN, UNKN, // 3_
- UNKN, 0x7a, 0xae, 0xa2, 0xca, 0xba, UNKN, 0x25, UNKN, UNKN, 0x10, UNKN, 0xea, 0x79, 0x8a, UNKN, // 4_
- UNKN, 0x60, UNKN, UNKN, UNKN, UNKN, 0x84, 0xd8, 0xa9, UNKN, UNKN, UNKN, 0xe9, UNKN, 0xda, UNKN, // 5_
- 0xc0, UNKN, UNKN, 0x3d, 0x8d, UNKN, UNKN, UNKN, UNKN, 0x68, UNKN, 0x92, UNKN, 0x48, UNKN, UNKN, // 6_
- 0x9d, 0x49, 0x95, 0xc6, 0xb0, UNKN, 0x40, UNKN, UNKN, UNKN, 0x05, UNKN, UNKN, UNKN, UNKN, UNKN, // 7_
- UNKN, 0x0d, UNKN, UNKN, UNKN, UNKN, 0xa4, UNKN, UNKN, 0x30, UNKN, 0x66, UNKN, UNKN, 0xa5, UNKN, // 8_
- 0x64, UNKN, 0x29, UNKN, UNKN, 0x86, UNKN, 0xb2, UNKN, UNKN, UNKN, UNKN, UNKN, 0x2a, 0x6d, 0x3a, // 9_
- 0x38, UNKN, UNKN, 0x91, UNKN, UNKN, UNKN, 0xbd, UNKN, UNKN, UNKN, UNKN, UNKN, UNKN, 0xd5, UNKN, // a_
- UNKN, UNKN, UNKN, UNKN, 0xb5, 0xf8, UNKN, UNKN, UNKN, 0xc5, UNKN, UNKN, UNKN, 0x09, UNKN, UNKN, // b_
- UNKN, UNKN, UNKN, UNKN, 0x11, 0x90, 0x4c, UNKN, 0x85, UNKN, UNKN, UNKN, 0x4a, UNKN, UNKN, UNKN, // c_
- UNKN, UNKN, 0x20, 0xb9, UNKN, UNKN, UNKN, UNKN, 0x00, UNKN, UNKN, UNKN, UNKN, UNKN, UNKN, UNKN, // d_
- UNKN, 0x80, 0x65, UNKN, UNKN, 0xe8, 0xc9, UNKN, UNKN, UNKN, UNKN, UNKN, 0xee, 0xf0, UNKN, UNKN, // e_
- UNKN, 0xa0, 0xc8, UNKN, UNKN, UNKN, 0xc4, UNKN, 0x4e, 0xe0, 0xa8, UNKN, 0x45, UNKN, UNKN, 0xa6, // f_
-
- //_0 _1 _2 _3 _4 _5 _6 _7 _8 _9 _a _b _c _d _e _f
- UNKN, 0x86, UNKN, UNKN, 0xe6, 0xc9, UNKN, 0x1a, UNKN, 0xdd, 0x88, UNKN, UNKN, UNKN, UNKN, 0x8e, // 0_
- UNKN, 0xe0, UNKN, UNKN, 0x4c, 0xd0, UNKN, 0x64, UNKN, 0xa4, UNKN, UNKN, UNKN, UNKN, UNKN, UNKN, // 1_
- UNKN, UNKN, UNKN, UNKN, UNKN, UNKN, UNKN, 0xee, UNKN, 0x74, UNKN, 0xa0, UNKN, 0xed, UNKN, 0xe9, // 2_
- UNKN, 0xd9, UNKN, UNKN, UNKN, UNKN, 0x0a, UNKN, 0x49, UNKN, 0x1d, 0xa2, UNKN, 0x8d, UNKN, 0x00, // 3_
- 0xa9, UNKN, UNKN, 0xea, UNKN, UNKN, UNKN, UNKN, UNKN, 0xf0, 0xfa, UNKN, UNKN, UNKN, UNKN, 0x84, // 4_
- UNKN, UNKN, 0x38, UNKN, 0xbd, UNKN, 0x9d, 0x92, 0xb1, UNKN, 0x95, UNKN, 0xe8, 0x45, UNKN, UNKN, // 5_
- UNKN, UNKN, 0xb5, UNKN, UNKN, UNKN, UNKN, UNKN, UNKN, UNKN, UNKN, UNKN, UNKN, 0x85, UNKN, UNKN, // 6_
- UNKN, UNKN, UNKN, UNKN, 0xa6, 0xa5, 0xe4, 0x09, UNKN, 0x29, UNKN, 0x5a, 0x90, UNKN, 0xc0, UNKN, // 7_
- 0xca, UNKN, UNKN, UNKN, 0x18, UNKN, UNKN, UNKN, UNKN, 0x66, UNKN, UNKN, UNKN, 0x68, UNKN, UNKN, // 8_
- 0x98, 0xb0, 0x26, 0xc4, UNKN, 0x2d, UNKN, UNKN, UNKN, UNKN, 0xc6, UNKN, UNKN, UNKN, 0xd8, UNKN, // 9_
- UNKN, UNKN, UNKN, UNKN, UNKN, UNKN, UNKN, 0x3d, UNKN, UNKN, UNKN, UNKN, UNKN, 0xaa, UNKN, UNKN, // a_
- 0xce, 0x10, UNKN, 0x05, 0x80, 0x48, UNKN, UNKN, UNKN, 0xf8, 0x0d, UNKN, UNKN, UNKN, UNKN, UNKN, // b_
- UNKN, UNKN, UNKN, UNKN, 0x91, 0xc5, UNKN, UNKN, UNKN, 0x9c, UNKN, 0x30, 0xc8, UNKN, UNKN, UNKN, // c_
- 0x69, 0x60, 0x9a, 0xb2, UNKN, UNKN, 0x2a, UNKN, 0x65, UNKN, UNKN, UNKN, 0x25, UNKN, 0x79, 0x6a, // d_
- UNKN, 0x20, 0xb9, UNKN, 0x3a, 0xd5, UNKN, 0x4a, UNKN, UNKN, UNKN, UNKN, UNKN, UNKN, 0x99, 0xa8, // e_
- UNKN, UNKN, UNKN, UNKN, 0xda, UNKN, UNKN, UNKN, UNKN, 0xcd, UNKN, 0x7a, 0xad, UNKN, UNKN, UNKN, // f_
-
- //_0 _1 _2 _3 _4 _5 _6 _7 _8 _9 _a _b _c _d _e _f
- UNKN, UNKN, UNKN, 0x60, UNKN, UNKN, 0xb1, UNKN, UNKN, UNKN, 0x29, UNKN, 0x8e, 0x74, 0x9a, 0xea, // 0_
- UNKN, 0x6d, UNKN, 0x92, 0xb5, UNKN, UNKN, UNKN, UNKN, UNKN, UNKN, 0x7d, 0xb9, 0xa2, UNKN, 0x6a, // 1_
- UNKN, UNKN, UNKN, 0xb0, 0xc4, UNKN, UNKN, 0x2d, UNKN, 0x79, 0x8a, UNKN, UNKN, UNKN, 0xa0, UNKN, // 2_
- UNKN, UNKN, UNKN, UNKN, UNKN, UNKN, UNKN, UNKN, UNKN, 0xa4, 0x1a, UNKN, 0xaa, 0x80, UNKN, UNKN, // 3_
- UNKN, UNKN, 0x10, UNKN, 0x3a, UNKN, UNKN, UNKN, 0x8d, UNKN, UNKN, UNKN, UNKN, 0xf8, UNKN, 0x25, // 4_
- UNKN, UNKN, 0x40, UNKN, 0x85, UNKN, 0x95, UNKN, UNKN, 0xcd, UNKN, UNKN, 0x4c, 0x98, UNKN, UNKN, // 5_
- UNKN, 0x68, UNKN, 0xe9, 0x9e, 0x09, UNKN, UNKN, UNKN, UNKN, UNKN, UNKN, UNKN, UNKN, 0x5a, 0xee, // 6_
- UNKN, 0x86, UNKN, UNKN, UNKN, 0xd5, UNKN, 0xa5, 0x65, UNKN, UNKN, UNKN, UNKN, 0x4e, 0xe0, 0x90, // 7_
- UNKN, UNKN, 0xc0, 0xce, UNKN, UNKN, UNKN, 0xad, UNKN, UNKN, UNKN, 0x88, UNKN, UNKN, UNKN, UNKN, // 8_
- UNKN, 0xda, UNKN, UNKN, UNKN, 0xb2, UNKN, 0x7a, UNKN, UNKN, UNKN, UNKN, 0x91, UNKN, UNKN, 0xc5, // 9_
- UNKN, UNKN, 0x05, 0xe6, UNKN, UNKN, 0x49, UNKN, UNKN, 0x0d, 0x9d, 0x4a, UNKN, UNKN, 0xc8, UNKN, // a_
- UNKN, UNKN, UNKN, UNKN, 0x20, UNKN, 0x1d, UNKN, UNKN, 0xd0, UNKN, UNKN, 0xfa, UNKN, 0xbd, UNKN, // b_
- UNKN, UNKN, UNKN, UNKN, 0x2a, UNKN, UNKN, 0x0a, UNKN, UNKN, 0xca, UNKN, 0x9c, 0x69, UNKN, UNKN, // c_
- 0x00, 0xd8, 0x38, UNKN, UNKN, UNKN, 0xa6, UNKN, UNKN, UNKN, 0xc6, UNKN, UNKN, UNKN, UNKN, UNKN, // d_
- UNKN, 0xc9, UNKN, UNKN, UNKN, UNKN, 0x64, 0x48, UNKN, UNKN, 0xa8, UNKN, 0xe8, UNKN, UNKN, UNKN, // e_
- UNKN, UNKN, 0xa9, UNKN, 0xf0, UNKN, UNKN, UNKN, UNKN, UNKN, UNKN, 0x18, UNKN, UNKN, UNKN, UNKN, // f_
- };
-
- uint8_t data {_maincpu->space(AS_PROGRAM).read_byte(offset)};
- return decryption_tables[offset&3][data];
+ fw1stpal(config);
+ R65C02(config.replace(), m_maincpu, CPU_CLOCK); /* 2MHz */
+ m_maincpu->set_addrmap(AS_PROGRAM, &chinatow_state::chinatow_map);
}
-void megacard_state::megacard_opcodes_map(address_map &map)
-{
- map(0x8000, 0xffff).r(FUNC(megacard_state::megacard_opcode_r));
-}
-void megacard_state::megacard(machine_config &config)
+void funworld_state::intrgmes(machine_config &config)
{
- fw2ndpal(config);
-
- _maincpu = reinterpret_cast<cpu_device*>(config.device("maincpu"));
- _maincpu->set_addrmap(AS_OPCODES, &megacard_state::megacard_opcodes_map);
+ fw1stpal(config);
+ R65C02(config.replace(), m_maincpu, CPU_CLOCK); /* 2MHz */
+ m_maincpu->set_addrmap(AS_PROGRAM, &funworld_state::intergames_map);
+ m_gfxdecode->set_info(gfx_fw2ndpal);
}
-class jokercrd_state : public funworld_state
-{
-public:
- jokercrd_state(const machine_config &mconfig, device_type type, const char* tag)
- : funworld_state(mconfig, type, tag)
- {
- }
-
- void jokercrd(machine_config& config);
-
-private:
- cpu_device* _maincpu {};
- DECLARE_READ8_MEMBER(jokercrd_opcode_r);
-
- void jokercrd_opcodes_map(address_map& map);
-};
-
-READ8_MEMBER(jokercrd_state::jokercrd_opcode_r)
-{
- // even when errors could be lurking in the least used opcodes,
- // all of them in the [8050,b369) & [c000, f063) ranges are believed
- // to be covered by these tables, with the exception of the one @c0f1:
-
- // c0da: a6 6a ldx $6a
- // c0dc: ad 5c 00 lda $005c
- // c0df: 29 3f and #$3f
- // c0e1: 85 70 sta $70
- // c0e3: 20 fa c0 jsr $c0fa
- // c0e6: a5 70 lda $70
- // c0e8: 9d 33 02 sta $0233, x
- // c0eb: a2 00 ldx #$00
- // c0ed: e4 6a cpx $6a
- // c0ef: f0 08 beq $c0f9
- // c0f1: XX 33 02 nop #$33 #$02 [YYY $0233, x]
- // c0f4: f0 e4 beq $c0da
- // c0f6: e8 inx
- // c0f7: 80 f4 bra $c0ed
- // c0f9: 60 rts
- //
- // c0fa: ad 4b 07 lda $074b
- // c0fd: 0d 4c 07 ora $074c
- // c100: d0 01 bne $c103
- // c102: 60 rts
- // c103: a5 70 lda $70
- // c105: 29 30 and #$30
- // c107: 09 01 ora #$01
- // c109: 85 70 sta $70
- // c10b: 60 rts
-
- // it should be noted, however, that the subroutine @c0da seems to be called just from here:
- // c044: 64 6a stz $6a
- // c046: 20 da c0 jsr $c0da
- // and, if no interrupt is messing with the accesed data, the STZ @c044 should make the BEQ @c0ef
- // become an inconditional jump, converting the opcode @c0f1 in dead code
-
-
- constexpr uint8_t UNKN {0xfc};
-
- constexpr std::array<std::array<uint8_t,256>,4> decryption_tables
- {
- //_0 _1 _2 _3 _4 _5 _6 _7 _8 _9 _a _b _c _d _e _f
- UNKN, UNKN, UNKN, 0x3d, 0xe0, UNKN, UNKN, 0xb0, UNKN, 0xa0, UNKN, UNKN, UNKN, UNKN, UNKN, UNKN, // 0_
- UNKN, UNKN, 0x4a, 0x65, 0x18, 0x64, 0xad, UNKN, 0x90, UNKN, UNKN, UNKN, UNKN, UNKN, UNKN, UNKN, // 1_
- UNKN, UNKN, 0x49, UNKN, 0xa8, 0x8c, 0x20, UNKN, UNKN, 0xf8, UNKN, UNKN, 0xe6, UNKN, 0x88, UNKN, // 2_
- UNKN, UNKN, UNKN, UNKN, 0xb2, UNKN, UNKN, UNKN, UNKN, 0x58, 0x38, 0x45, UNKN, UNKN, UNKN, UNKN, // 3_
- UNKN, UNKN, UNKN, UNKN, UNKN, UNKN, 0xd5, 0xa5, 0xa9, UNKN, UNKN, UNKN, UNKN, UNKN, UNKN, UNKN, // 4_
- UNKN, UNKN, UNKN, UNKN, 0xda, 0xa2, UNKN, 0x4e, 0x1a, UNKN, 0xe4, UNKN, UNKN, UNKN, 0x0c, 0x98, // 5_
- 0xa6, UNKN, UNKN, UNKN, 0x9c, 0xfa, UNKN, 0xbd, UNKN, 0xae, UNKN, UNKN, UNKN, UNKN, UNKN, UNKN, // 6_
- UNKN, UNKN, 0xc0, 0xc5, UNKN, UNKN, UNKN, UNKN, UNKN, 0xcd, UNKN, UNKN, UNKN, 0x8a, UNKN, 0x80, // 7_
- UNKN, UNKN, 0x95, UNKN, UNKN, UNKN, UNKN, UNKN, 0x8e, UNKN, UNKN, UNKN, UNKN, 0x68, UNKN, UNKN, // 8_
- 0xb1, UNKN, UNKN, UNKN, UNKN, 0xd0, 0x0d, 0xc9, UNKN, UNKN, UNKN, UNKN, 0x29, 0x3a, 0xc8, 0x8d, // 9_
- 0xc6, 0xee, 0x25, UNKN, 0x05, 0x6e, UNKN, 0x2a, UNKN, 0x85, UNKN, UNKN, 0xd8, UNKN, 0xce, UNKN, // a_
- UNKN, UNKN, UNKN, 0xe9, 0xc4, 0xe8, UNKN, UNKN, 0x99, 0x6a, 0x0a, UNKN, 0x84, UNKN, UNKN, UNKN, // b_
- UNKN, UNKN, UNKN, 0x9d, 0x2d, 0x10, UNKN, UNKN, UNKN, UNKN, UNKN, 0xaa, UNKN, UNKN, 0x11, UNKN, // c_
- UNKN, 0xb9, 0x86, UNKN, 0xca, UNKN, UNKN, UNKN, UNKN, UNKN, 0x7a, UNKN, 0xf0, 0x09, 0x4c, UNKN, // d_
- 0x60, 0x78, UNKN, UNKN, UNKN, 0x48, 0x5a, UNKN, UNKN, UNKN, 0x79, UNKN, UNKN, UNKN, UNKN, 0xba, // e_
- UNKN, UNKN, 0x6d, 0x92, UNKN, 0x26, UNKN, UNKN, 0xb5, UNKN, 0x69, UNKN, UNKN, 0xa4, UNKN, 0x1d, // f_
-
- //_0 _1 _2 _3 _4 _5 _6 _7 _8 _9 _a _b _c _d _e _f
- UNKN, UNKN, UNKN, UNKN, 0x48, UNKN, UNKN, 0x0c, UNKN, 0x60, 0x6d, 0x20, 0xda, UNKN, 0xf0, UNKN, // 0_
- UNKN, 0xcd, 0x95, UNKN, UNKN, 0xae, UNKN, UNKN, UNKN, UNKN, UNKN, UNKN, 0x8e, UNKN, 0x29, UNKN, // 1_
- 0x90, UNKN, UNKN, UNKN, 0x69, 0xb5, UNKN, UNKN, UNKN, UNKN, 0xd0, 0xad, UNKN, UNKN, UNKN, 0x9a, // 2_
- 0xb6, 0x40, UNKN, 0xd5, 0xfa, UNKN, UNKN, UNKN, UNKN, UNKN, UNKN, UNKN, 0xa4, UNKN, 0x88, UNKN, // 3_
- UNKN, UNKN, UNKN, UNKN, UNKN, UNKN, 0x2a, UNKN, UNKN, UNKN, 0xa2, UNKN, UNKN, UNKN, UNKN, UNKN, // 4_
- 0xee, UNKN, UNKN, UNKN, 0x64, UNKN, 0xb0, 0x9d, UNKN, UNKN, UNKN, 0x80, UNKN, 0xf8, 0xe8, UNKN, // 5_
- UNKN, UNKN, UNKN, UNKN, UNKN, UNKN, UNKN, 0x91, UNKN, 0xb9, 0x8a, UNKN, UNKN, UNKN, 0x10, UNKN, // 6_
- 0x4a, UNKN, UNKN, 0xc8, 0x9c, 0x4e, UNKN, UNKN, UNKN, UNKN, 0xb2, 0x85, 0x45, 0xc9, UNKN, UNKN, // 7_
- 0x1a, UNKN, UNKN, 0xe9, UNKN, UNKN, UNKN, UNKN, UNKN, 0xca, UNKN, 0xc6, UNKN, 0xb1, UNKN, UNKN, // 8_
- 0x1d, UNKN, 0xa8, UNKN, UNKN, UNKN, UNKN, UNKN, UNKN, UNKN, UNKN, UNKN, UNKN, UNKN, UNKN, 0xc5, // 9_
- 0xe0, UNKN, 0xa0, UNKN, UNKN, UNKN, UNKN, UNKN, UNKN, UNKN, UNKN, 0x30, UNKN, 0x0d, UNKN, 0x8d, // a_
- UNKN, 0x86, UNKN, UNKN, 0xd9, 0xbd, UNKN, UNKN, 0x05, 0xaa, UNKN, 0x38, UNKN, 0x18, 0xe4, UNKN, // b_
- UNKN, 0xa6, UNKN, 0xa5, 0xc0, 0x2d, UNKN, UNKN, UNKN, UNKN, UNKN, 0x4c, 0x84, UNKN, 0x6e, UNKN, // c_
- UNKN, UNKN, UNKN, UNKN, UNKN, UNKN, UNKN, 0x19, 0x65, UNKN, UNKN, UNKN, 0xce, 0x7a, UNKN, 0x3a, // d_
- UNKN, 0x7d, UNKN, 0x0a, 0x49, UNKN, UNKN, UNKN, 0xe6, 0xd8, UNKN, UNKN, UNKN, UNKN, UNKN, UNKN, // e_
- UNKN, UNKN, UNKN, UNKN, 0x09, 0xa9, 0x25, UNKN, UNKN, UNKN, UNKN, UNKN, UNKN, 0x5a, UNKN, 0x68, // f_
-
- //_0 _1 _2 _3 _4 _5 _6 _7 _8 _9 _a _b _c _d _e _f
- UNKN, 0x20, UNKN, UNKN, UNKN, 0x8e, UNKN, UNKN, UNKN, 0xb0, 0x85, 0x3d, UNKN, 0x86, UNKN, UNKN, // 0_
- 0x18, UNKN, UNKN, UNKN, 0x8a, 0xad, 0x79, 0x98, UNKN, UNKN, 0xc0, UNKN, 0x30, UNKN, 0x10, UNKN, // 1_
- UNKN, UNKN, UNKN, UNKN, UNKN, UNKN, UNKN, 0xe4, UNKN, UNKN, UNKN, 0x29, UNKN, UNKN, UNKN, UNKN, // 2_
- 0x9e, 0x6d, 0xa6, UNKN, 0xc9, 0x6e, UNKN, UNKN, UNKN, UNKN, UNKN, UNKN, UNKN, UNKN, UNKN, UNKN, // 3_
- UNKN, UNKN, UNKN, UNKN, UNKN, UNKN, UNKN, 0xaa, UNKN, 0x9c, 0x09, UNKN, UNKN, UNKN, 0xfa, UNKN, // 4_
- UNKN, 0x69, UNKN, UNKN, 0x2d, UNKN, UNKN, UNKN, UNKN, UNKN, 0xc4, UNKN, 0x1a, 0x4c, 0x5a, UNKN, // 5_
- UNKN, UNKN, 0xe9, UNKN, 0xb1, UNKN, 0x0c, 0xee, 0xda, 0xb2, 0xce, UNKN, 0x74, UNKN, UNKN, UNKN, // 6_
- 0x7d, 0x0d, 0x48, UNKN, UNKN, UNKN, 0xf8, 0xd8, UNKN, UNKN, 0x0a, UNKN, UNKN, 0x45, 0xc6, UNKN, // 7_
- UNKN, UNKN, UNKN, UNKN, UNKN, 0x26, UNKN, UNKN, UNKN, 0xc5, UNKN, UNKN, UNKN, 0xae, UNKN, UNKN, // 8_
- 0xa9, UNKN, 0x90, 0x3a, UNKN, UNKN, 0x6c, UNKN, 0x64, UNKN, UNKN, 0xd5, UNKN, UNKN, UNKN, UNKN, // 9_
- UNKN, 0x7a, UNKN, 0x05, 0xa8, UNKN, UNKN, 0x60, UNKN, UNKN, 0xa4, 0x8d, 0x2a, UNKN, UNKN, UNKN, // a_
- UNKN, UNKN, UNKN, UNKN, 0xa0, UNKN, UNKN, UNKN, UNKN, UNKN, UNKN, UNKN, UNKN, UNKN, 0x92, 0x66, // b_
- UNKN, UNKN, 0xd0, 0xf0, UNKN, UNKN, 0x38, 0xbd, 0xa2, UNKN, 0xed, 0x9d, 0x80, UNKN, 0xa5, UNKN, // c_
- UNKN, UNKN, UNKN, UNKN, UNKN, UNKN, UNKN, UNKN, UNKN, 0x99, UNKN, 0x88, UNKN, 0xcd, UNKN, 0xe8, // d_
- 0xca, 0xb5, 0x49, 0x68, UNKN, UNKN, UNKN, UNKN, UNKN, UNKN, UNKN, UNKN, 0xe6, 0xe0, 0x4a, UNKN, // e_
- UNKN, UNKN, UNKN, 0xc8, UNKN, 0xb9, 0x91, UNKN, UNKN, UNKN, UNKN, 0x65, 0x95, UNKN, UNKN, UNKN, // f_
-
- //_0 _1 _2 _3 _4 _5 _6 _7 _8 _9 _a _b _c _d _e _f
- 0x65, UNKN, UNKN, UNKN, 0x30, UNKN, UNKN, UNKN, 0x8e, UNKN, UNKN, 0xda, 0x2d, 0xc4, UNKN, 0x68, // 0_
- UNKN, 0xa2, UNKN, UNKN, 0x2a, 0xa6, UNKN, UNKN, UNKN, 0x86, UNKN, UNKN, 0x60, UNKN, 0xe6, 0xa4, // 1_
- UNKN, 0x84, UNKN, UNKN, 0xbd, UNKN, UNKN, UNKN, UNKN, UNKN, 0xce, 0xe4, 0xf8, 0xa0, UNKN, 0x8d, // 2_
- UNKN, 0xcd, UNKN, UNKN, UNKN, 0x88, 0x4a, UNKN, UNKN, UNKN, UNKN, UNKN, UNKN, UNKN, UNKN, UNKN, // 3_
- 0xd8, UNKN, UNKN, UNKN, 0x40, 0x11, UNKN, UNKN, 0xaa, 0x79, UNKN, 0x98, UNKN, 0x85, UNKN, UNKN, // 4_
- 0x9a, 0xc6, UNKN, UNKN, 0x74, UNKN, UNKN, UNKN, UNKN, 0x95, 0xdd, UNKN, UNKN, 0x6d, UNKN, UNKN, // 5_
- 0x8a, 0x6e, UNKN, UNKN, 0x18, 0xc5, UNKN, 0xf9, UNKN, 0xb0, 0x7a, UNKN, UNKN, UNKN, UNKN, 0xc0, // 6_
- 0x99, UNKN, UNKN, 0x10, 0x90, 0x38, 0x09, UNKN, UNKN, UNKN, 0xe0, UNKN, UNKN, UNKN, UNKN, UNKN, // 7_
- UNKN, UNKN, UNKN, 0xb5, UNKN, 0x4c, UNKN, UNKN, UNKN, UNKN, UNKN, UNKN, UNKN, 0xfa, UNKN, UNKN, // 8_
- UNKN, UNKN, 0x6a, 0x29, UNKN, UNKN, 0x5a, 0xae, UNKN, 0x3a, UNKN, 0x9c, UNKN, 0x0d, 0x49, 0xee, // 9_
- UNKN, UNKN, UNKN, UNKN, 0xa5, 0x69, 0xf0, UNKN, 0x80, UNKN, 0xc8, UNKN, UNKN, UNKN, 0xb9, UNKN, // a_
- 0x1a, UNKN, UNKN, UNKN, UNKN, UNKN, UNKN, UNKN, UNKN, UNKN, 0x0c, UNKN, UNKN, UNKN, UNKN, UNKN, // b_
- UNKN, UNKN, UNKN, UNKN, 0x64, UNKN, UNKN, 0xb2, 0x9d, UNKN, UNKN, 0xca, UNKN, UNKN, 0x0a, 0x05, // c_
- UNKN, UNKN, UNKN, 0x91, UNKN, UNKN, UNKN, 0x92, UNKN, UNKN, UNKN, 0xed, UNKN, UNKN, UNKN, UNKN, // d_
- UNKN, 0xec, 0x20, UNKN, 0xad, 0xd0, UNKN, 0x3d, UNKN, 0xb1, 0x6c, 0x66, UNKN, 0x4e, UNKN, 0xd5, // e_
- 0xe9, UNKN, UNKN, 0xa9, UNKN, UNKN, 0xe8, UNKN, UNKN, 0xc9, 0xa8, UNKN, UNKN, 0x48, UNKN, UNKN, // f_
- };
-
- uint8_t data {_maincpu->space(AS_PROGRAM).read_byte(offset)};
- return decryption_tables[offset&3][data];
-}
-void jokercrd_state::jokercrd_opcodes_map(address_map &map)
+void funworld_state::fw_brick_1(machine_config &config)
{
- map(0x8000, 0xffff).r(FUNC(jokercrd_state::jokercrd_opcode_r));
+ fw1stpal(config);
+ R65C02(config.replace(), m_maincpu, CPU_CLOCK); /* 2MHz */
+ m_maincpu->set_addrmap(AS_PROGRAM, &funworld_state::fw_a7_11_map);
+// m_gfxdecode->set_info(gfx_fw2ndpal);
}
-void jokercrd_state::jokercrd(machine_config &config)
+
+void funworld_state::fw_brick_2(machine_config &config)
{
fw2ndpal(config);
-
- _maincpu = reinterpret_cast<cpu_device*>(config.device("maincpu"));
- _maincpu->set_addrmap(AS_OPCODES, &jokercrd_state::jokercrd_opcodes_map);
+ R65C02(config.replace(), m_maincpu, CPU_CLOCK); /* 2MHz */
+ m_maincpu->set_addrmap(AS_PROGRAM, &funworld_state::fw_a7_11_map);
+// m_gfxdecode->set_info(gfx_fw2ndpal);
}
-
/*************************
* Rom Load *
*************************/
@@ -7247,6 +6719,75 @@ void funworld_state::init_saloon()
m_palette->update();
}
+
+void funworld_state::init_multiwin()
+/*****************************************************
+
+ This only decrypt the text strings.
+ Need more work to get the opcodes properly decrypted
+
+******************************************************/
+{
+ uint8_t *ROM = memregion("maincpu")->base();
+ for (int x = 0x8000; x < 0x10000; x++)
+ {
+ ROM[x] = ROM[x] ^ 0x91;
+ ROM[x] = bitswap<8>(ROM[x],5,6,7,2,3,0,1,4);
+
+ uint8_t code = ROM[x];
+
+ /* decrypt code here */
+ ROM[x+0x10000] = code;
+ }
+}
+
+
+void funworld_state::init_royalcdc()
+{
+/*****************************************************
+
+ This only decrypt the text strings.
+ The opcode encryption seems to be conditional, and
+ bits of the XOR (and bitswap?) can be turned on and
+ off, possibly depending on the address
+
+******************************************************/
+
+ uint8_t *ROM = memregion("maincpu")->base();
+ for (int x = 0x8000; x < 0x10000; x++)
+ {
+ ROM[x] = ROM[x] ^ 0x22;
+ // this seems correct for the data, plaintext decrypts fine
+ ROM[x] = bitswap<8>(ROM[x],2,6,7,4,3,1,5,0);
+
+ // the code uses different encryption, there are conflicts here
+ // so it's probably address based
+ uint8_t code = ROM[x];
+ if (code==0x12) code = 0x10; // ^0x02
+ else if (code==0x1a) code = 0x18; // ^0x02
+ else if (code==0x20) code = 0xa2; // ^0x82
+ else if (code==0x26) code = 0xa2; // ^0x84
+ else if (code==0x39) code = 0xbd; // ^0x84
+ else if (code==0x5a) code = 0x58; // ^0x02
+ else if (code==0x5c) code = 0xd8; // ^0x84
+ else if (code==0x84) code = 0xa2; // ^0x26
+ else if (code==0x8f) code = 0xa9; // ^0x26
+ else if (code==0xaf) code = 0xa9; // ^0x06
+ else if (code==0xa2) code = 0x80; // ^0x22
+ else if (code==0xa3) code = 0x85; // ^0x26
+ else if (code==0xa8) code = 0x8e; // ^0x26
+ else if (code==0xa9) code = 0x8d; // ^0x24
+ else if (code==0xbb) code = 0xbd; // ^0x06
+ else if (code==0xc8) code = 0xca; // ^0x02
+ else if (code==0xc6) code = 0xe0; // ^0x26
+ else if (code==0xce) code = 0xe8; // ^0x26
+ else if (code==0xf4) code = 0xd0; // ^0x24
+
+ ROM[x+0x10000] = code;
+ }
+}
+
+
void funworld_state::init_dino4()
/*****************************************************
@@ -7698,7 +7239,7 @@ GAMEL( 1991, royalcrdc, royalcrd, royalcd2, royalcrd, funworld_state, empty_ini
GAMEL( 1991, royalcrdd, royalcrd, royalcd1, royalcrd, funworld_state, empty_init, ROT0, "TAB Austria", "Royal Card (Austrian, set 5)", 0, layout_royalcrd )
GAMEL( 1991, royalcrde, royalcrd, royalcd1, royalcrd, funworld_state, empty_init, ROT0, "TAB Austria", "Royal Card (Austrian, set 6)", 0, layout_jollycrd )
GAMEL( 1991, royalcrdt, royalcrd, royalcd1, royalcrd, funworld_state, empty_init, ROT0, "TAB Austria", "Royal Card (TAB original)", 0, layout_jollycrd )
-GAME( 1991, royalcrdf, royalcrd, royalcrdf,royalcrd, royalcrdf_state,driver_init, ROT0, "Evona Electronic","Royal Card (Slovak, encrypted)", MACHINE_NOT_WORKING )
+GAME( 1991, royalcrdf, royalcrd, royalcd1, royalcrd, funworld_state, init_royalcdc, ROT0, "Evona Electronic","Royal Card (Slovak, encrypted)", MACHINE_NOT_WORKING )
GAMEL( 1990, royalcrdg, royalcrd, royalcd1, royalcrd, funworld_state, empty_init, ROT0, "bootleg", "Royal Card (Austrian, set 7, CMC C1030 HW)", 0, layout_jollycrd ) // big CPLD
GAMEL( 1991, royalcrdh, royalcrd, royalcd2, royalcrd, funworld_state, empty_init, ROT0, "TAB Austria", "Royal Card (Austrian, set 8)", 0, layout_jollycrd )
GAMEL( 1991, royalcdfr, royalcrd, royalcd1, royalcrd, funworld_state, empty_init, ROT0, "TAB Austria", "Royal Card (French)", 0, layout_jollycrd )
@@ -7729,10 +7270,10 @@ GAMEL( 198?, jolyjokrb, jolyjokr, fw1stpal, funworld, funworld_state, empty_ini
GAMEL( 198?, jolyjokrc, jolyjokr, fw1stpal, funworld, funworld_state, empty_init, ROT0, "Apple Time", "Jolly Joker (Apple Time)", MACHINE_NOT_WORKING, layout_jollycrd ) // bad program ROM...
// Encrypted games...
-GAME( 1992, multiwin, 0, multiwin, funworld, multiwin_state, driver_init, ROT0, "Fun World", "Multi Win (Ver.0167, encrypted)", MACHINE_NOT_WORKING)
-GAME( 1993, powercrd, 0, powercrd, funworld, powercrd_state, empty_init, ROT0, "Fun World", "Power Card (Ver 0263, encrypted)", MACHINE_NOT_WORKING ) // clone of Bonus Card.
-GAME( 1993, megacard, 0, megacard, funworld, megacard_state, empty_init, ROT0, "Fun World", "Mega Card (Ver.0210, encrypted)", MACHINE_NOT_WORKING )
-GAME( 1993, jokercrd, 0, jokercrd, funworld, jokercrd_state, empty_init, ROT0, "Vesely Svet", "Joker Card (Ver.A267BC, encrypted)", MACHINE_NOT_WORKING )
+GAME( 1992, multiwin, 0, fw1stpal, funworld, funworld_state, init_multiwin, ROT0, "Fun World", "Multi Win (Ver.0167, encrypted)", MACHINE_NOT_WORKING )
+GAME( 1993, powercrd, 0, fw2ndpal, funworld, funworld_state, empty_init, ROT0, "Fun World", "Power Card (Ver 0263, encrypted)", MACHINE_NOT_WORKING ) // clone of Bonus Card.
+GAME( 1993, megacard, 0, fw2ndpal, funworld, funworld_state, empty_init, ROT0, "Fun World", "Mega Card (Ver.0210, encrypted)", MACHINE_NOT_WORKING )
+GAME( 1993, jokercrd, 0, fw2ndpal, funworld, funworld_state, empty_init, ROT0, "Vesely Svet", "Joker Card (Ver.A267BC, encrypted)", MACHINE_NOT_WORKING )
GAME( 198?, saloon, 0, saloon, saloon, funworld_state, init_saloon, ROT0, "<unknown>", "Saloon (French, encrypted)", MACHINE_NOT_WORKING )
// Encrypted TAB blue PCB...
@@ -7750,7 +7291,7 @@ GAME( 199?, mongolnw, 0, royalcd1, royalcrd, funworld_state, init_mong
GAME( 199?, soccernw, 0, royalcd1, royalcrd, funworld_state, init_soccernw, ROT0, "<unknown>", "Soccer New (Italian)", MACHINE_UNEMULATED_PROTECTION )
// Other games...
-GAME( 198?, funquiz, 0, funquiz, funquiz, funworld_state, empty_init, ROT0, "Fun World / Oehlinger", "Fun World Quiz (Austrian)", 0 )
+GAME( 198?, funquiz, 0, funquiz, funquiz, funworld_state, empty_init, ROT0, "Fun World", "Fun World Quiz (Austrian)", 0 )
GAMEL( 1986, novoplay, 0, fw2ndpal, novoplay, funworld_state, empty_init, ROT0, "Admiral/Novomatic","Novo Play Multi Card / Club Card", 0, layout_novoplay )
GAME( 1991, intrgmes, 0, intrgmes, funworld, funworld_state, empty_init, ROT0, "Inter Games", "unknown Inter Games poker", MACHINE_NOT_WORKING )
GAMEL( 1985, fw_a7_11, 0, fw_brick_2, funworld, funworld_state, empty_init, ROT0, "Fun World", "unknown Fun World A7-11 game 1", MACHINE_NOT_WORKING, layout_jollycrd )
diff --git a/src/mame/drivers/funybubl.cpp b/src/mame/drivers/funybubl.cpp
index b244d949740..61d0199f67e 100644
--- a/src/mame/drivers/funybubl.cpp
+++ b/src/mame/drivers/funybubl.cpp
@@ -217,28 +217,28 @@ void funybubl_state::machine_start()
}
-MACHINE_CONFIG_START(funybubl_state::funybubl)
-
+void funybubl_state::funybubl(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80,12000000/2) /* 6 MHz?? */
- MCFG_DEVICE_PROGRAM_MAP(funybubl_map)
- MCFG_DEVICE_IO_MAP(io_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", funybubl_state, irq0_line_hold)
+ Z80(config, m_maincpu, 12000000/2); /* 6 MHz?? */
+ m_maincpu->set_addrmap(AS_PROGRAM, &funybubl_state::funybubl_map);
+ m_maincpu->set_addrmap(AS_IO, &funybubl_state::io_map);
+ m_maincpu->set_vblank_int("screen", FUNC(funybubl_state::irq0_line_hold));
- MCFG_DEVICE_ADD("audiocpu", Z80,8000000/2) /* 4 MHz?? */
- MCFG_DEVICE_PROGRAM_MAP(sound_map)
+ Z80(config, m_audiocpu, 8000000/2); /* 4 MHz?? */
+ m_audiocpu->set_addrmap(AS_PROGRAM, &funybubl_state::sound_map);
ADDRESS_MAP_BANK(config, m_vrambank).set_map(&funybubl_state::vrambank_map).set_options(ENDIANNESS_LITTLE, 8, 13, 0x1000);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(512, 256)
- MCFG_SCREEN_VISIBLE_AREA(12*8, 512-12*8-1, 16, 256-16-1)
-// MCFG_SCREEN_VISIBLE_AREA(0*8, 512-1, 0, 256-1)
- MCFG_SCREEN_UPDATE_DRIVER(funybubl_state, screen_update)
- MCFG_SCREEN_PALETTE(m_palette)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(512, 256);
+ screen.set_visarea(12*8, 512-12*8-1, 16, 256-16-1);
+// screen.set_visarea(0*8, 512-1, 0, 256-1);
+ screen.set_screen_update(FUNC(funybubl_state::screen_update));
+ screen.set_palette(m_palette);
GFXDECODE(config, m_gfxdecode, m_palette, gfx_funybubl);
PALETTE(config, m_palette).set_format(4, &funybubl_state::funybubl_R6B6G6, 0xc00/4);
@@ -249,10 +249,10 @@ MACHINE_CONFIG_START(funybubl_state::funybubl)
GENERIC_LATCH_8(config, m_soundlatch);
m_soundlatch->data_pending_callback().set_inputline(m_audiocpu, 0);
- MCFG_DEVICE_ADD("oki", OKIM6295, 8000000/8, okim6295_device::PIN7_HIGH) // clock frequency & pin 7 not verified
- MCFG_DEVICE_ADDRESS_MAP(0, oki_map)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
-MACHINE_CONFIG_END
+ OKIM6295(config, m_oki, 8000000/8, okim6295_device::PIN7_HIGH); // clock frequency & pin 7 not verified
+ m_oki->set_addrmap(0, &funybubl_state::oki_map);
+ m_oki->add_route(ALL_OUTPUTS, "mono", 1.0);
+}
diff --git a/src/mame/drivers/fuukifg2.cpp b/src/mame/drivers/fuukifg2.cpp
index eb94eda7e41..c30d173c010 100644
--- a/src/mame/drivers/fuukifg2.cpp
+++ b/src/mame/drivers/fuukifg2.cpp
@@ -448,10 +448,10 @@ void fuuki16_state::machine_reset()
void fuuki16_state::fuuki16(machine_config &config)
{
/* basic machine hardware */
- M68000(config, m_maincpu, XTAL(32'000'000) / 2); /* 16 MHz */
+ M68000(config, m_maincpu, XTAL(32'000'000) / 2); /* 16 MHz */
m_maincpu->set_addrmap(AS_PROGRAM, &fuuki16_state::fuuki16_map);
- Z80(config, m_audiocpu, XTAL(12'000'000) / 2); /* 6 MHz */
+ Z80(config, m_audiocpu, XTAL(12'000'000) / 2); /* 6 MHz */
m_audiocpu->set_addrmap(AS_PROGRAM, &fuuki16_state::fuuki16_sound_map);
m_audiocpu->set_addrmap(AS_IO, &fuuki16_state::fuuki16_sound_io_map);
diff --git a/src/mame/drivers/g627.cpp b/src/mame/drivers/g627.cpp
index b4a999530d8..fafee6d0a15 100644
--- a/src/mame/drivers/g627.cpp
+++ b/src/mame/drivers/g627.cpp
@@ -296,11 +296,12 @@ WRITE8_MEMBER( g627_state::lamp_w )
}
}
-MACHINE_CONFIG_START(g627_state::g627)
+void g627_state::g627(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, 14138000/8)
- MCFG_DEVICE_PROGRAM_MAP(mem_map)
- MCFG_DEVICE_IO_MAP(io_map)
+ Z80(config, m_maincpu, 14138000/8);
+ m_maincpu->set_addrmap(AS_PROGRAM, &g627_state::mem_map);
+ m_maincpu->set_addrmap(AS_IO, &g627_state::io_map);
i8156_device &i8156(I8156(config, "i8156", 14138000/8));
i8156.in_pa_callback().set(FUNC(g627_state::porta_r));
@@ -313,12 +314,11 @@ MACHINE_CONFIG_START(g627_state::g627)
/* Sound */
genpin_audio(config);
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("astrocade", ASTROCADE_IO, 14138000/8) // 0066-117XX audio chip
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
+ ASTROCADE_IO(config, "astrocade", 14138000/8).add_route(ALL_OUTPUTS, "mono", 1.0); // 0066-117XX audio chip
/* Video */
config.set_default_layout(layout_g627);
-MACHINE_CONFIG_END
+}
/*-------------------------------------------------------------------
/ Rotation VIII (09/1978)
diff --git a/src/mame/drivers/gaelco.cpp b/src/mame/drivers/gaelco.cpp
index e7a2407fd3c..dd67f05b271 100644
--- a/src/mame/drivers/gaelco.cpp
+++ b/src/mame/drivers/gaelco.cpp
@@ -644,17 +644,17 @@ void gaelco_state::machine_start()
m_okibank->configure_entries(0, 16, memregion("oki")->base(), 0x10000);
}
-MACHINE_CONFIG_START(gaelco_state::bigkarnk)
-
+void gaelco_state::bigkarnk(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M68000, 10000000) /* MC68000P10, 10 MHz */
- MCFG_DEVICE_PROGRAM_MAP(bigkarnk_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", gaelco_state, irq6_line_hold)
+ M68000(config, m_maincpu, 10000000); /* MC68000P10, 10 MHz */
+ m_maincpu->set_addrmap(AS_PROGRAM, &gaelco_state::bigkarnk_map);
+ m_maincpu->set_vblank_int("screen", FUNC(gaelco_state::irq6_line_hold));
- MCFG_DEVICE_ADD("audiocpu", MC6809E, 8867000/4) /* 68B09EP, 2.21675 MHz? */
- MCFG_DEVICE_PROGRAM_MAP(bigkarnk_snd_map)
+ MC6809E(config, m_audiocpu, 8867000/4); /* 68B09EP, 2.21675 MHz? */
+ m_audiocpu->set_addrmap(AS_PROGRAM, &gaelco_state::bigkarnk_snd_map);
- MCFG_QUANTUM_TIME(attotime::from_hz(600))
+ config.m_minimum_quantum = attotime::from_hz(600);
LS259(config, m_outlatch);
m_outlatch->q_out_cb<0>().set(FUNC(gaelco_state::coin1_lockout_w)).invert();
@@ -663,13 +663,13 @@ MACHINE_CONFIG_START(gaelco_state::bigkarnk)
m_outlatch->q_out_cb<3>().set(FUNC(gaelco_state::coin2_counter_w));
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */)
- MCFG_SCREEN_SIZE(32*16, 32*16)
- MCFG_SCREEN_VISIBLE_AREA(0, 320-1, 16, 256-1)
- MCFG_SCREEN_UPDATE_DRIVER(gaelco_state, screen_update_bigkarnk)
- MCFG_SCREEN_PALETTE(m_palette)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500) /* not accurate */);
+ screen.set_size(32*16, 32*16);
+ screen.set_visarea(0, 320-1, 16, 256-1);
+ screen.set_screen_update(FUNC(gaelco_state::screen_update_bigkarnk));
+ screen.set_palette(m_palette);
GFXDECODE(config, m_gfxdecode, m_palette, gfx_gaelco);
PALETTE(config, m_palette).set_format(palette_device::xBGR_555, 1024);
@@ -682,28 +682,26 @@ MACHINE_CONFIG_START(gaelco_state::bigkarnk)
GENERIC_LATCH_8(config, m_soundlatch);
m_soundlatch->data_pending_callback().set_inputline(m_audiocpu, M6809_FIRQ_LINE);
- MCFG_DEVICE_ADD("ymsnd", YM3812, 3580000)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
-
- MCFG_DEVICE_ADD("oki", OKIM6295, 1056000, okim6295_device::PIN7_HIGH) // clock frequency & pin 7 not verified
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
-MACHINE_CONFIG_END
+ YM3812(config, "ymsnd", 3580000).add_route(ALL_OUTPUTS, "mono", 1.0);
-MACHINE_CONFIG_START(gaelco_state::maniacsq)
+ OKIM6295(config, "oki", 1056000, okim6295_device::PIN7_HIGH).add_route(ALL_OUTPUTS, "mono", 1.0); // clock frequency & pin 7 not verified
+}
+void gaelco_state::maniacsq(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M68000, XTAL(24'000'000)/2 ) /* verified on pcb */
- MCFG_DEVICE_PROGRAM_MAP(maniacsq_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", gaelco_state, irq6_line_hold)
+ M68000(config, m_maincpu, XTAL(24'000'000)/2); /* verified on pcb */
+ m_maincpu->set_addrmap(AS_PROGRAM, &gaelco_state::maniacsq_map);
+ m_maincpu->set_vblank_int("screen", FUNC(gaelco_state::irq6_line_hold));
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */)
- MCFG_SCREEN_SIZE(32*16, 32*16)
- MCFG_SCREEN_VISIBLE_AREA(0, 320-1, 16, 256-1)
- MCFG_SCREEN_UPDATE_DRIVER(gaelco_state, screen_update_maniacsq)
- MCFG_SCREEN_PALETTE(m_palette)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500) /* not accurate */);
+ screen.set_size(32*16, 32*16);
+ screen.set_visarea(0, 320-1, 16, 256-1);
+ screen.set_screen_update(FUNC(gaelco_state::screen_update_maniacsq));
+ screen.set_palette(m_palette);
GFXDECODE(config, m_gfxdecode, m_palette, gfx_gaelco);
PALETTE(config, m_palette).set_format(palette_device::xBGR_555, 1024);
@@ -713,19 +711,19 @@ MACHINE_CONFIG_START(gaelco_state::maniacsq)
/* sound hardware */
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("oki", OKIM6295, XTAL(1'000'000), okim6295_device::PIN7_HIGH) // pin 7 not verified
- MCFG_DEVICE_ADDRESS_MAP(0, oki_map)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
-MACHINE_CONFIG_END
-
-MACHINE_CONFIG_START(gaelco_state::squash)
+ okim6295_device &oki(OKIM6295(config, "oki", XTAL(1'000'000), okim6295_device::PIN7_HIGH)); // pin 7 not verified
+ oki.set_addrmap(0, &gaelco_state::oki_map);
+ oki.add_route(ALL_OUTPUTS, "mono", 1.0);
+}
+void gaelco_state::squash(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M68000, XTAL(20'000'000)/2 ) /* verified on pcb */
- MCFG_DEVICE_PROGRAM_MAP(squash_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", gaelco_state, irq6_line_hold)
+ M68000(config, m_maincpu, XTAL(20'000'000)/2); /* verified on pcb */
+ m_maincpu->set_addrmap(AS_PROGRAM, &gaelco_state::squash_map);
+ m_maincpu->set_vblank_int("screen", FUNC(gaelco_state::irq6_line_hold));
- MCFG_QUANTUM_TIME(attotime::from_hz(600))
+ config.m_minimum_quantum = attotime::from_hz(600);
LS259(config, m_outlatch); // B8
m_outlatch->q_out_cb<0>().set(FUNC(gaelco_state::coin1_lockout_w)).invert();
@@ -735,13 +733,13 @@ MACHINE_CONFIG_START(gaelco_state::squash)
m_outlatch->q_out_cb<4>().set_nop(); // used
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(58)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */)
- MCFG_SCREEN_SIZE(32*16, 32*16)
- MCFG_SCREEN_VISIBLE_AREA(0, 320-1, 16, 256-1)
- MCFG_SCREEN_UPDATE_DRIVER(gaelco_state, screen_update_maniacsq)
- MCFG_SCREEN_PALETTE(m_palette)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(58);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500) /* not accurate */);
+ screen.set_size(32*16, 32*16);
+ screen.set_visarea(0, 320-1, 16, 256-1);
+ screen.set_screen_update(FUNC(gaelco_state::screen_update_maniacsq));
+ screen.set_palette(m_palette);
GFXDECODE(config, m_gfxdecode, m_palette, gfx_gaelco);
PALETTE(config, m_palette).set_format(palette_device::xBGR_555, 1024);
@@ -751,19 +749,19 @@ MACHINE_CONFIG_START(gaelco_state::squash)
/* sound hardware */
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("oki", OKIM6295, XTAL(1'000'000), okim6295_device::PIN7_HIGH) /* verified on pcb */
- MCFG_DEVICE_ADDRESS_MAP(0, oki_map)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
-MACHINE_CONFIG_END
-
-MACHINE_CONFIG_START(gaelco_state::thoop)
+ okim6295_device &oki(OKIM6295(config, "oki", XTAL(1'000'000), okim6295_device::PIN7_HIGH)); /* verified on pcb */
+ oki.set_addrmap(0, &gaelco_state::oki_map);
+ oki.add_route(ALL_OUTPUTS, "mono", 1.0);
+}
+void gaelco_state::thoop(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M68000, XTAL(24'000'000)/2 ) /* verified on pcb */
- MCFG_DEVICE_PROGRAM_MAP(thoop_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", gaelco_state, irq6_line_hold)
+ M68000(config, m_maincpu, XTAL(24'000'000)/2); /* verified on pcb */
+ m_maincpu->set_addrmap(AS_PROGRAM, &gaelco_state::thoop_map);
+ m_maincpu->set_vblank_int("screen", FUNC(gaelco_state::irq6_line_hold));
- MCFG_QUANTUM_TIME(attotime::from_hz(600))
+ config.m_minimum_quantum = attotime::from_hz(600);
LS259(config, m_outlatch); // B8
m_outlatch->q_out_cb<0>().set(FUNC(gaelco_state::coin1_lockout_w)); // not inverted
@@ -773,13 +771,13 @@ MACHINE_CONFIG_START(gaelco_state::thoop)
m_outlatch->q_out_cb<4>().set_nop(); // used
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */)
- MCFG_SCREEN_SIZE(32*16, 32*16)
- MCFG_SCREEN_VISIBLE_AREA(0, 320-1, 16, 256-1)
- MCFG_SCREEN_UPDATE_DRIVER(gaelco_state, screen_update_maniacsq)
- MCFG_SCREEN_PALETTE(m_palette)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500) /* not accurate */);
+ screen.set_size(32*16, 32*16);
+ screen.set_visarea(0, 320-1, 16, 256-1);
+ screen.set_screen_update(FUNC(gaelco_state::screen_update_maniacsq));
+ screen.set_palette(m_palette);
GFXDECODE(config, m_gfxdecode, m_palette, gfx_gaelco);
PALETTE(config, m_palette).set_format(palette_device::xBGR_555, 1024);
@@ -789,10 +787,10 @@ MACHINE_CONFIG_START(gaelco_state::thoop)
/* sound hardware */
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("oki", OKIM6295, XTAL(1'000'000), okim6295_device::PIN7_HIGH) // pin 7 not verified
- MCFG_DEVICE_ADDRESS_MAP(0, oki_map)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
-MACHINE_CONFIG_END
+ okim6295_device &oki(OKIM6295(config, "oki", XTAL(1'000'000), okim6295_device::PIN7_HIGH)); // pin 7 not verified
+ oki.set_addrmap(0, &gaelco_state::oki_map);
+ oki.add_route(ALL_OUTPUTS, "mono", 1.0);
+}
/*************************************
diff --git a/src/mame/drivers/gaelco2.cpp b/src/mame/drivers/gaelco2.cpp
index 8bd5a577435..5faa1cf89aa 100644
--- a/src/mame/drivers/gaelco2.cpp
+++ b/src/mame/drivers/gaelco2.cpp
@@ -85,18 +85,18 @@ void gaelco2_state::mcu_hostmem_map(address_map &map)
void gaelco2_state::maniacsq_map(address_map &map)
{
- map(0x000000, 0x03ffff).rom(); /* ROM */
- map(0x200000, 0x20ffff).ram().w(FUNC(gaelco2_state::gaelco2_vram_w)).share("spriteram"); /* Video RAM */
+ map(0x000000, 0x03ffff).rom(); /* ROM */
+ map(0x200000, 0x20ffff).ram().w(FUNC(gaelco2_state::vram_w)).share("spriteram"); /* Video RAM */
map(0x202890, 0x2028ff).rw("gaelco", FUNC(gaelco_gae1_device::gaelcosnd_r), FUNC(gaelco_gae1_device::gaelcosnd_w)); /* Sound Registers */
- map(0x210000, 0x211fff).ram().w(FUNC(gaelco2_state::gaelco2_palette_w)).share("paletteram"); /* Palette */
- map(0x218004, 0x218009).ram().share("vregs"); /* Video Registers */
- map(0x300000, 0x300001).portr("IN0"); /* DSW #1 + Input 1P */
- map(0x300002, 0x300003).portr("IN1"); /* DSW #2 + Input 2P */
- map(0x30004a, 0x30004b).nopw(); /* Sound muting? */
- map(0x320000, 0x320001).portr("COIN"); /* COINSW + SERVICESW */
- map(0x500000, 0x500001).w(FUNC(gaelco2_state::alighunt_coin_w)); /* Coin lockout + counters */
- map(0xfe0000, 0xfe7fff).ram(); /* Work RAM */
- map(0xfe8000, 0xfeffff).ram().share("shareram"); /* Work RAM */
+ map(0x210000, 0x211fff).ram().w(FUNC(gaelco2_state::palette_w)).share("paletteram"); /* Palette */
+ map(0x218004, 0x218009).ram().w(FUNC(gaelco2_state::vregs_w)).share("vregs"); /* Video Registers */
+ map(0x300000, 0x300001).portr("IN0"); /* DSW #1 + Input 1P */
+ map(0x300002, 0x300003).portr("IN1"); /* DSW #2 + Input 2P */
+ map(0x30004a, 0x30004b).nopw(); /* Sound muting? */
+ map(0x320000, 0x320001).portr("COIN"); /* COINSW + SERVICESW */
+ map(0x500000, 0x500001).w(FUNC(gaelco2_state::alighunt_coin_w)); /* Coin lockout + counters */
+ map(0xfe0000, 0xfe7fff).ram(); /* Work RAM */
+ map(0xfe8000, 0xfeffff).ram().share("shareram"); /* Work RAM */
}
@@ -193,7 +193,7 @@ void gaelco2_state::maniacsq(machine_config &config)
screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */
screen.set_size(64*16, 32*16);
screen.set_visarea(0, 320-1, 16, 256-1);
- screen.set_screen_update(FUNC(gaelco2_state::screen_update_gaelco2));
+ screen.set_screen_update(FUNC(gaelco2_state::screen_update));
screen.screen_vblank().set("spriteram", FUNC(buffered_spriteram16_device::vblank_copy_rising));
screen.set_palette(m_palette);
@@ -449,10 +449,10 @@ INPUT_PORTS_END
void gaelco2_state::saltcrdi_map(address_map &map)
{
map(0x000000, 0x03ffff).rom();
- map(0x200000, 0x20ffff).ram().w(FUNC(gaelco2_state::gaelco2_vram_w)).share("spriteram");
+ map(0x200000, 0x20ffff).ram().w(FUNC(gaelco2_state::vram_w)).share("spriteram");
map(0x202890, 0x2028ff).rw("gaelco", FUNC(gaelco_gae1_device::gaelcosnd_r), FUNC(gaelco_gae1_device::gaelcosnd_w));
- map(0x210000, 0x211fff).ram().w(FUNC(gaelco2_state::gaelco2_palette_w)).share("paletteram");
- map(0x218004, 0x218009).ram().share("vregs");
+ map(0x210000, 0x211fff).ram().w(FUNC(gaelco2_state::palette_w)).share("paletteram");
+ map(0x218004, 0x218009).ram().w(FUNC(gaelco2_state::vregs_w)).share("vregs");
map(0x300000, 0x300001).portr("IN0");
map(0x310000, 0x310001).portr("DSW");
map(0x320000, 0x320001).portr("COIN");
@@ -476,7 +476,7 @@ void gaelco2_state::saltcrdi(machine_config &config)
screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */
screen.set_size(64*16, 32*16);
screen.set_visarea(0, 384-1, 16, 256-1);
- screen.set_screen_update(FUNC(gaelco2_state::screen_update_gaelco2));
+ screen.set_screen_update(FUNC(gaelco2_state::screen_update));
screen.screen_vblank().set("spriteram", FUNC(buffered_spriteram16_device::vblank_copy_rising));
screen.set_palette(m_palette);
@@ -513,11 +513,11 @@ ROM_START( saltcrdi ) // REF 970410
ROM_LOAD( "bi-41-bank1-27c1001.u41", 0x01a0000, 0x0020000, CRC(c4d24254) SHA1(e6ff7624e628dc6ace11a50b6ff89812844b52c5) )
ROM_FILL( 0x0220000, 0x0020000, 0x00 ) /* to decode GFX as 5bpp */
- ROM_REGION( 0x1000, "iomcu", 0 ) // on IO board
- ROM_LOAD( "st62t15c6", 0x0000, 0x1000, NO_DUMP ) // size?
+ ROM_REGION( 0x0800, "iomcu", 0 ) // on IO board
+ ROM_LOAD( "st62t15c6", 0x0000, 0x0800, NO_DUMP ) // 2KBytes internal ROM
- ROM_REGION( 0x100, "pals", 0 )
- ROM_LOAD( "6.pal16l8.u12", 0x0000, 0x100, NO_DUMP ) // size?
+ ROM_REGION( 0x0104, "pals", 0 )
+ ROM_LOAD( "6.pal16l8.u12", 0x0000, 0x0104, NO_DUMP )
ROM_END
@@ -554,100 +554,94 @@ Note 1x 28x2 edge connector
1x trimmer (volume)
1x battery 3V (bt1)
-see
-http://web.archive.org/web/20001206204300/http://luckysunshine.com/products/gameboards/play2000.html
-
*/
-
-READ16_MEMBER(gaelco2_state::play2000_shareram_68k_r)
+void gaelco2_state::play2000_map(address_map &map)
{
- int pc = m_maincpu->pc();
- uint16_t ret = m_shareram[offset];
-
- // checks at 0x00814, 0x23504, 0x2340a after writing command?
- if (offset * 2 == 0x4020)
- {
- if (pc == 0x00814) return 0x0900;
- else return 0x0000;
- }
-
- // checks at 0x23310, 0x2334a
- if (offset * 2 == 0x4008)
- {
- return 0x0000;
- }
-
- if (offset * 2 < 0x1000)
- {
- // It seems one of the commands puts a 0x1000 worth of data at the start of shared RAM
- // the game checks various values in it before booting. It's possible the game is primarily
- // using the DS5002FP for the SRAM capabilities rather than protection.
- if (offset * 2 == 0x42c) return 0x0000;
- if (offset * 2 == 0x42e) return 0x00f0;
- if (offset * 2 == 0xc04) return 0x7171;
- // return 0x0000;
- }
-
- logerror("%04x read from shareram %04x %04x %04x\n", pc, offset * 2, mem_mask, ret & mem_mask);
- return ret;
+ map(0x000000, 0x03ffff).rom(); /* ROM */
+ map(0x100000, 0x100001).portr("IN0"); /* Coins + other buttons? */
+ map(0x110000, 0x110001).portr("IN1");
+ map(0x200000, 0x20ffff).ram().w(FUNC(gaelco2_state::vram_w)).share("spriteram"); /* Video RAM */
+ map(0x202890, 0x2028ff).rw("gaelco", FUNC(gaelco_gae1_device::gaelcosnd_r), FUNC(gaelco_gae1_device::gaelcosnd_w)); /* Sound Registers */
+ map(0x214000, 0x214fff).ram().w(FUNC(gaelco2_state::palette_w)).share("paletteram"); /* Palette */
+ map(0x215000, 0x217fff).ram(); /* Written to, but unused? */
+ map(0x218000, 0x218003).ram(); /* Written to, but unused? */
+ map(0x218004, 0x218009).ram().w(FUNC(gaelco2_state::vregs_w)).share("vregs"); /* Video Registers */
+ map(0x21800a, 0x218fff).ram(); /* Written to, but unused? */
+ // AM_RANGE(0x843100, 0x84315e) ?
+ map(0xfe0000, 0xfe7fff).ram(); /* Work RAM */
+ map(0xfe8000, 0xfeffff).ram().share("shareram"); /* Work RAM */
}
-WRITE16_MEMBER(gaelco2_state::play2000_shareram_68k_w)
-{
- int pc = m_maincpu->pc();
+static INPUT_PORTS_START( play2000 )
+ PORT_START("IN0")
+ PORT_BIT( 0x0001, IP_ACTIVE_LOW, IPT_COIN1 ) // Coin1
+ PORT_BIT( 0x0002, IP_ACTIVE_LOW, IPT_COIN2 ) // NoteA
+ PORT_BIT( 0x0004, IP_ACTIVE_LOW, IPT_POKER_HOLD1 ) // cycles through games in attract?
+ PORT_BIT( 0x0008, IP_ACTIVE_LOW, IPT_POKER_HOLD2 ) // shows odds if coins are present?
+ PORT_BIT( 0x0010, IP_ACTIVE_LOW, IPT_POKER_HOLD3 )
+ PORT_BIT( 0x0020, IP_ACTIVE_LOW, IPT_POKER_HOLD4 )
+ PORT_BIT( 0x0040, IP_ACTIVE_LOW, IPT_POKER_HOLD5 )
+ PORT_BIT( 0x0080, IP_ACTIVE_LOW, IPT_UNUSED )
+ PORT_BIT( 0xff00, IP_ACTIVE_LOW, IPT_UNKNOWN )
- COMBINE_DATA(&m_shareram[offset]);
+ PORT_START("IN1")
+ PORT_BIT( 0x0001, IP_ACTIVE_LOW, IPT_COIN3 ) // NoteB
+ PORT_BIT( 0x0002, IP_ACTIVE_LOW, IPT_COIN4 ) // NoteC
+ PORT_BIT( 0x0004, IP_ACTIVE_LOW, IPT_COIN5 ) // NoteD
+ PORT_BIT( 0x0008, IP_ACTIVE_LOW, IPT_OTHER ) PORT_NAME("Incassa") PORT_CODE(KEYCODE_H) // what standard button would this be?
+ PORT_BIT( 0x0010, IP_ACTIVE_LOW, IPT_GAMBLE_D_UP ) // "Play"
+ PORT_BIT( 0x0020, IP_ACTIVE_LOW, IPT_START1 )
+ PORT_SERVICE_NO_TOGGLE( 0x0040, IP_ACTIVE_LOW )
+ PORT_BIT( 0x0080, IP_ACTIVE_LOW, IPT_OTHER ) PORT_NAME("Collect") PORT_CODE(KEYCODE_G) // what standard button would this be?
+ PORT_BIT( 0xff00, IP_ACTIVE_LOW, IPT_UNKNOWN )
+INPUT_PORTS_END
- if (pc == 0x00552) return; // initial RAM check
- if (pc == 0x232f4) return; // 'updating board'
- logerror("%04x write to shareram %04x %04x %04x\n", pc, offset * 2, mem_mask, data & mem_mask);
+void gaelco2_state::init_play2000()
+{
+ m_global_spritexoff = 1; // aligns flashing sprites with backgrounds
}
+ROM_START( play2000 )
+ ROM_REGION( 0x100000, "maincpu", 0 ) /* 68000 code */
+ ROM_LOAD16_BYTE( "tms27c010a.2", 0x000000, 0x020000, CRC(598102f9) SHA1(66fb6d321c886099b99d048d1f9f13cf016b9c43) )
+ ROM_LOAD16_BYTE( "tms27c010a.1", 0x000001, 0x020000, CRC(e2b5d79a) SHA1(f004352ddb9bc92aab126627689b45b2ef8583b1) )
-void gaelco2_state::play2000_map(address_map &map)
-{
- map(0x000000, 0x03ffff).rom(); /* ROM */
- map(0x100000, 0x100001).portr("IN0"); /* Coins + other buttons? */
- // AM_RANGE(0x110000, 0x110001) ?
- map(0x200000, 0x20ffff).ram().w(FUNC(gaelco2_state::gaelco2_vram_w)).share("spriteram"); /* Video RAM */
- map(0x202890, 0x2028ff).rw("gaelco", FUNC(gaelco_gae1_device::gaelcosnd_r), FUNC(gaelco_gae1_device::gaelcosnd_w)); /* Sound Registers */
- map(0x214000, 0x214fff).ram().w(FUNC(gaelco2_state::gaelco2_palette_w)).share("paletteram"); /* Palette */
- map(0x215000, 0x217fff).ram(); /* Written to, but unused? */
- map(0x218000, 0x218003).ram(); /* Written to, but unused? */
- map(0x218004, 0x218009).ram().share("vregs"); /* Video Registers */
- map(0x21800a, 0x218fff).ram(); /* Written to, but unused? */
- // AM_RANGE(0x843100, 0x84315e) ?
- map(0xfe0000, 0xfe7fff).ram(); /* Work RAM */
- map(0xfe8000, 0xfeffff).rw(FUNC(gaelco2_state::play2000_shareram_68k_r), FUNC(gaelco2_state::play2000_shareram_68k_w)).share("shareram"); /* Work RAM */
-}
+ ROM_REGION( 0x8000, "gaelco_ds5002fp:sram", 0 ) /* DS5002FP code - had 7.0 sticker on too */
+ // This has only been dumped from a single MCU, so there is potential for bad bits as there is risk in the dumping process. The majority of the ROM is data and thus difficult to verify.
+ ROM_LOAD( "ds5002fp_70i.mcu", 0x00000, 0x8000, BAD_DUMP CRC(b51ad3da) SHA1(4a730238b4b875c74dd2e4df6e7880d03659b7d5) )
-static INPUT_PORTS_START( play2000 )
- PORT_START("IN0")
- PORT_BIT( 0x0001, IP_ACTIVE_LOW, IPT_COIN1 )
- PORT_BIT( 0x0002, IP_ACTIVE_LOW, IPT_BUTTON1 )
- PORT_BIT( 0x0004, IP_ACTIVE_LOW, IPT_BUTTON2 ) // cycles through games in attract?
- PORT_BIT( 0x0008, IP_ACTIVE_LOW, IPT_BUTTON3 ) // shows odds if coins are present?
- PORT_BIT( 0x0010, IP_ACTIVE_LOW, IPT_BUTTON4 )
- PORT_BIT( 0x0020, IP_ACTIVE_LOW, IPT_BUTTON5 )
- PORT_BIT( 0x0040, IP_ACTIVE_LOW, IPT_BUTTON6 )
- PORT_BIT( 0x0080, IP_ACTIVE_LOW, IPT_BUTTON7 )
- PORT_BIT( 0xff00, IP_ACTIVE_HIGH, IPT_UNKNOWN )
-INPUT_PORTS_END
+ ROM_REGION( 0x100, "gaelco_ds5002fp:mcu:internal", ROMREGION_ERASE00 )
+ DS5002FP_SET_MON( 0x79 )
+ DS5002FP_SET_RPCTL( 0x00 )
+ DS5002FP_SET_CRCR( 0x80 )
+
+ ROM_REGION( 0x0a00000, "gfx1", 0 ) /* GFX + Sound */
+ ROM_LOAD( "6.u51", 0x0000000, 0x0100000, CRC(6dafc11c) SHA1(2aa3d6318418578433b3060bda6e27adf794dea4) ) /* GFX + Sound*/
+ ROM_LOAD( "4.u53", 0x0200000, 0x0080000, CRC(94dc37a7) SHA1(28f9832b61541b292682a6e2d2264abccd138a2e) ) /* GFX only */
+ ROM_LOAD( "7.u50", 0x0400000, 0x0080000, CRC(e80c6d39) SHA1(b3ae5d66c48c2ba6665a181e311b0c834384258a) ) /* GFX only */
+ ROM_LOAD( "5.u52", 0x0600000, 0x0080000, CRC(19b939f4) SHA1(7281709aa3ab1decb84bf7ab10492fb6ec197c80) ) /* GFX only */
+ ROM_LOAD( "3.u54", 0x0800000, 0x0080000, CRC(085008ed) SHA1(06eb4f972d79eab13b1b3b6829ef280e079abdb6) ) /* GFX only */
-ROM_START( play2000 ) /* there are version 4.0 and version 1.0 strings in this, go with the higher one */
+ ROM_REGION( 0x0600, "plds", 0 )
+ ROM_LOAD( "palce16v8h.u29", 0x0000, 0x0117, BAD_DUMP CRC(4a0a6f39) SHA1(57351e471649391c9abf110828fe2f128fe84eee) )
+ROM_END
+
+
+ROM_START( play2000_40i ) /* there are version 4.0 and version 1.0 strings in this, go with the higher one */
ROM_REGION( 0x100000, "maincpu", 0 ) /* 68000 code */
ROM_LOAD16_BYTE( "2.u39_v4", 0x000000, 0x020000, CRC(fff16141) SHA1(8493c3e58a231c03b152b336f43422a9a2d2618c) )
ROM_LOAD16_BYTE( "1.u40_v4", 0x000001, 0x020000, CRC(39f9d58e) SHA1(1cbdae2adc570f2a2e10a707075312ef717e2643) )
ROM_REGION( 0x8000, "gaelco_ds5002fp:sram", 0 ) /* DS5002FP code */
- ROM_LOAD( "ds5002fp.bin", 0x00000, 0x8000, NO_DUMP )
+ // this is the same dump as from the play7000 MCU but with valid default data for this set
+ ROM_LOAD( "ds5002fp_40i.mcu", 0x00000, 0x8000, BAD_DUMP CRC(7c45cdf2) SHA1(64aee4d77e0715342634e6eadb83dae4a2db9dfd) )
ROM_REGION( 0x100, "gaelco_ds5002fp:mcu:internal", ROMREGION_ERASE00 )
- //DS5002FP_SET_MON( x )
- //DS5002FP_SET_RPCTL( x )
- //DS5002FP_SET_CRCR( x )
+ DS5002FP_SET_MON( 0x79 )
+ DS5002FP_SET_RPCTL( 0x00 )
+ DS5002FP_SET_CRCR( 0x80 )
ROM_REGION( 0x0a00000, "gfx1", 0 ) /* GFX + Sound */
ROM_LOAD( "6.u51", 0x0000000, 0x0100000, CRC(6dafc11c) SHA1(2aa3d6318418578433b3060bda6e27adf794dea4) ) /* GFX + Sound*/
@@ -695,19 +689,20 @@ REF: 990315
| |------------| |
-----------------------------------------------------------------------------|
*/
-ROM_START( play2000a )
+ROM_START( play2000_50i )
/*at least 1.u40 is bad, on every 0x40 bytes the first four are always 0xff.*/
ROM_REGION( 0x100000, "maincpu", 0 ) /* 68000 code */
ROM_LOAD16_BYTE( "2.u39", 0x000000, 0x020000, BAD_DUMP CRC(9939299e) SHA1(55303a2adf199f4b5a60f57be7480b0e119f8624) )
ROM_LOAD16_BYTE( "1.u40", 0x000001, 0x020000, BAD_DUMP CRC(311c2f94) SHA1(963d6b5f479598145146fcb8b7c6ce77fbc92b07) )
ROM_REGION( 0x8000, "gaelco_ds5002fp:sram", 0 ) /* DS5002FP code */
- ROM_LOAD( "ds5002fp.bin", 0x00000, 0x8000, NO_DUMP )
+ // can't create an initialized default for this one as the main program is bad
+ ROM_LOAD( "ds5002fp_50i.mcu", 0x00000, 0x8000, NO_DUMP )
ROM_REGION( 0x100, "gaelco_ds5002fp:mcu:internal", ROMREGION_ERASE00 )
- //DS5002FP_SET_MON( x )
- //DS5002FP_SET_RPCTL( x )
- //DS5002FP_SET_CRCR( x )
+ DS5002FP_SET_MON( 0x79 )
+ DS5002FP_SET_RPCTL( 0x00 )
+ DS5002FP_SET_CRCR( 0x80 )
ROM_REGION( 0x0a00000, "gfx1", 0 ) /* GFX + Sound */
ROM_LOAD( "6.u51", 0x0000000, 0x0100000, CRC(6dafc11c) SHA1(2aa3d6318418578433b3060bda6e27adf794dea4) ) /* GFX + Sound*/
@@ -727,8 +722,7 @@ void gaelco2_state::play2000(machine_config &config)
m_maincpu->set_addrmap(AS_PROGRAM, &gaelco2_state::play2000_map);
m_maincpu->set_vblank_int("screen", FUNC(gaelco2_state::irq6_line_hold));
- // MCFG_DEVICE_ADD("gaelco_ds5002fp", GAELCO_DS5002FP, XTAL(11'059'200)) /* 11.0592MHz */
- // MCFG_DEVICE_ADDRESS_MAP(0, mcu_hostmem_map)
+ GAELCO_DS5002FP(config, "gaelco_ds5002fp", XTAL(32'000'000) / 2).set_addrmap(0, &gaelco2_state::mcu_hostmem_map); /* 16 MHz */
/* video hardware */
BUFFERED_SPRITERAM16(config, m_spriteram);
@@ -738,7 +732,7 @@ void gaelco2_state::play2000(machine_config &config)
screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */
screen.set_size(64*16, 32*16);
screen.set_visarea(0, 384-1, 16, 256-1);
- screen.set_screen_update(FUNC(gaelco2_state::screen_update_gaelco2));
+ screen.set_screen_update(FUNC(gaelco2_state::screen_update));
screen.screen_vblank().set("spriteram", FUNC(buffered_spriteram16_device::vblank_copy_rising));
screen.set_palette(m_palette);
@@ -751,9 +745,9 @@ void gaelco2_state::play2000(machine_config &config)
SPEAKER(config, "lspeaker").front_left();
SPEAKER(config, "rspeaker").front_right();
- gaelco_gae1_device &gaelco(GAELCO_GAE1(config, "gaelco")); /* unused? ROMs contain no sound data */
+ gaelco_gae1_device &gaelco(GAELCO_GAE1(config, "gaelco"));
gaelco.set_snd_data_tag("gfx1");
- gaelco.set_bank_offsets(1 * 0x0080000, 1 * 0x0080000, 1 * 0x0080000, 1 * 0x0080000); // ?
+ gaelco.set_bank_offsets(0 * 0x080000, 0 * 0x080000, 0 * 0x080000, 0 * 0x080000);
gaelco.add_route(0, "lspeaker", 1.0);
gaelco.add_route(1, "rspeaker", 1.0);
}
@@ -763,30 +757,30 @@ void gaelco2_state::play2000(machine_config &config)
BANG
============================================================================*/
-READ16_MEMBER(bang_state::p1_gun_x){return (m_light0_x->read() * 320 / 0x100) + 1;}
-READ16_MEMBER(bang_state::p1_gun_y){return (m_light0_y->read() * 240 / 0x100) - 4;}
-READ16_MEMBER(bang_state::p2_gun_x){return (m_light1_x->read() * 320 / 0x100) + 1;}
-READ16_MEMBER(bang_state::p2_gun_y){return (m_light1_y->read() * 240 / 0x100) - 4;}
+u16 bang_state::p1_gun_x(){return (m_light0_x->read() * 320 / 0x100) + 1;}
+u16 bang_state::p1_gun_y(){return (m_light0_y->read() * 240 / 0x100) - 4;}
+u16 bang_state::p2_gun_x(){return (m_light1_x->read() * 320 / 0x100) + 1;}
+u16 bang_state::p2_gun_y(){return (m_light1_y->read() * 240 / 0x100) - 4;}
void bang_state::bang_map(address_map &map)
{
- map(0x000000, 0x0fffff).rom(); /* ROM */
- map(0x200000, 0x20ffff).ram().w(FUNC(bang_state::gaelco2_vram_w)).share("spriteram"); /* Video RAM */
+ map(0x000000, 0x0fffff).rom(); /* ROM */
+ map(0x200000, 0x20ffff).ram().w(FUNC(bang_state::vram_w)).share("spriteram"); /* Video RAM */
map(0x202890, 0x2028ff).rw("gaelco", FUNC(gaelco_cg1v_device::gaelcosnd_r), FUNC(gaelco_cg1v_device::gaelcosnd_w)); /* Sound Registers */
- map(0x210000, 0x211fff).ram().w(FUNC(bang_state::gaelco2_palette_w)).share("paletteram"); /* Palette */
- map(0x218004, 0x218009).readonly(); /* Video Registers */
- map(0x218004, 0x218007).writeonly().share("vregs"); /* Video Registers */
- map(0x218008, 0x218009).nopw(); /* CLR INT Video */
+ map(0x210000, 0x211fff).ram().w(FUNC(bang_state::palette_w)).share("paletteram"); /* Palette */
+ map(0x218004, 0x218009).readonly(); /* Video Registers */
+ map(0x218004, 0x218007).w(FUNC(bang_state::vregs_w)).share("vregs"); /* Video Registers */
+ map(0x218008, 0x218009).nopw(); /* CLR INT Video */
map(0x300000, 0x300001).portr("P1");
- map(0x300002, 0x300003).nopr(); /* Random number generator? */
- map(0x300000, 0x30000f).w(m_mainlatch, FUNC(ls259_device::write_d0)).umask16(0x00ff); /* Coin Counters & serial EEPROM */
+ map(0x300002, 0x300003).nopr(); /* Random number generator? */
+ map(0x300000, 0x30000f).w(m_mainlatch, FUNC(ls259_device::write_d0)).umask16(0x00ff); /* Coin Counters & serial EEPROM */
map(0x300010, 0x300011).portr("P2");
map(0x300020, 0x300021).portr("COIN");
- map(0x310000, 0x310001).r(FUNC(bang_state::p1_gun_x)).w(FUNC(bang_state::bang_clr_gun_int_w)); /* Gun 1P X */ /* CLR INT Gun */
- map(0x310002, 0x310003).r(FUNC(bang_state::p2_gun_x)); /* Gun 2P X */
- map(0x310004, 0x310005).r(FUNC(bang_state::p1_gun_y)); /* Gun 1P Y */
- map(0x310006, 0x310007).r(FUNC(bang_state::p2_gun_y)); /* Gun 2P Y */
- map(0xfe0000, 0xfeffff).ram(); /* Work RAM */
+ map(0x310000, 0x310001).r(FUNC(bang_state::p1_gun_x)).w(FUNC(bang_state::bang_clr_gun_int_w)); /* Gun 1P X */ /* CLR INT Gun */
+ map(0x310002, 0x310003).r(FUNC(bang_state::p2_gun_x)); /* Gun 2P X */
+ map(0x310004, 0x310005).r(FUNC(bang_state::p1_gun_y)); /* Gun 1P Y */
+ map(0x310006, 0x310007).r(FUNC(bang_state::p2_gun_y)); /* Gun 2P Y */
+ map(0xfe0000, 0xfeffff).ram(); /* Work RAM */
}
@@ -844,7 +838,7 @@ void bang_state::bang(machine_config &config)
screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */
screen.set_size(64*16, 32*16);
screen.set_visarea(0, 320-1, 16, 256-1);
- screen.set_screen_update(FUNC(gaelco2_state::screen_update_gaelco2));
+ screen.set_screen_update(FUNC(gaelco2_state::screen_update));
screen.screen_vblank().set("spriteram", FUNC(buffered_spriteram16_device::vblank_copy_rising));
screen.set_palette(m_palette);
@@ -976,18 +970,18 @@ ROM_END
void gaelco2_state::alighunt_map(address_map &map)
{
- map(0x000000, 0x0fffff).rom(); /* ROM */
- map(0x200000, 0x20ffff).ram().w(FUNC(gaelco2_state::gaelco2_vram_w)).share("spriteram"); /* Video RAM */
- map(0x202890, 0x2028ff).rw("gaelco", FUNC(gaelco_gae1_device::gaelcosnd_r), FUNC(gaelco_gae1_device::gaelcosnd_w)); /* Sound Registers */
- map(0x210000, 0x211fff).ram().w(FUNC(gaelco2_state::gaelco2_palette_w)).share("paletteram"); /* Palette */
- map(0x218004, 0x218009).ram().share("vregs"); /* Video Registers */
- map(0x300000, 0x300001).portr("IN0"); /* DSW #1 + Input 1P */
- map(0x300002, 0x300003).portr("IN1"); /* DSW #2 + Input 2P */
- map(0x320000, 0x320001).portr("COIN"); /* COINSW + SERVICESW */
- map(0x500000, 0x500001).w(FUNC(gaelco2_state::alighunt_coin_w)); /* Coin lockout + counters */
- map(0x500006, 0x500007).nopw(); /* ??? */
- map(0xfe0000, 0xfe7fff).ram(); /* Work RAM */
- map(0xfe8000, 0xfeffff).ram().share("shareram"); /* Work RAM (shared with D5002FP) */
+ map(0x000000, 0x0fffff).rom(); /* ROM */
+ map(0x200000, 0x20ffff).ram().w(FUNC(gaelco2_state::vram_w)).share("spriteram"); /* Video RAM */
+ map(0x202890, 0x2028ff).rw("gaelco", FUNC(gaelco_gae1_device::gaelcosnd_r), FUNC(gaelco_gae1_device::gaelcosnd_w)); /* Sound Registers */
+ map(0x210000, 0x211fff).ram().w(FUNC(gaelco2_state::palette_w)).share("paletteram"); /* Palette */
+ map(0x218004, 0x218009).ram().w(FUNC(gaelco2_state::vregs_w)).share("vregs"); /* Video Registers */
+ map(0x300000, 0x300001).portr("IN0"); /* DSW #1 + Input 1P */
+ map(0x300002, 0x300003).portr("IN1"); /* DSW #2 + Input 2P */
+ map(0x320000, 0x320001).portr("COIN"); /* COINSW + SERVICESW */
+ map(0x500000, 0x500001).w(FUNC(gaelco2_state::alighunt_coin_w)); /* Coin lockout + counters */
+ map(0x500006, 0x500007).nopw(); /* ??? */
+ map(0xfe0000, 0xfe7fff).ram(); /* Work RAM */
+ map(0xfe8000, 0xfeffff).ram().share("shareram"); /* Work RAM (shared with D5002FP) */
}
@@ -1083,7 +1077,7 @@ void gaelco2_state::alighunt(machine_config &config)
screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */
screen.set_size(64*16, 32*16);
screen.set_visarea(0, 320-1, 16, 256-1);
- screen.set_screen_update(FUNC(gaelco2_state::screen_update_gaelco2));
+ screen.set_screen_update(FUNC(gaelco2_state::screen_update));
screen.screen_vblank().set("spriteram", FUNC(buffered_spriteram16_device::vblank_copy_rising));
screen.set_palette(m_palette);
@@ -1246,18 +1240,18 @@ ROM_END
void gaelco2_state::touchgo_map(address_map &map)
{
- map(0x000000, 0x0fffff).rom(); /* ROM */
- map(0x200000, 0x20ffff).ram().w(FUNC(gaelco2_state::gaelco2_vram_w)).share("spriteram"); /* Video RAM */
- map(0x202890, 0x2028ff).rw("gaelco", FUNC(gaelco_gae1_device::gaelcosnd_r), FUNC(gaelco_gae1_device::gaelcosnd_w)); /* Sound Registers */
- map(0x210000, 0x211fff).ram().w(FUNC(gaelco2_state::gaelco2_palette_w)).share("paletteram"); /* Palette */
- map(0x218004, 0x218009).ram().share("vregs"); /* Video Registers */
- map(0x300000, 0x300001).portr("IN0"); /* DSW #1 + Input 1P */
- map(0x300002, 0x300003).portr("IN1"); /* DSW #2 + Input 2P */
- map(0x300004, 0x300005).portr("IN2"); /* COINSW + Input 3P */
- map(0x300006, 0x300007).portr("IN3"); /* SERVICESW + Input 4P */
- map(0x500000, 0x500001).select(0x0038).w(FUNC(gaelco2_state::wrally2_latch_w)); /* Coin counters */
- map(0xfe0000, 0xfe7fff).ram(); /* Work RAM */
- map(0xfe8000, 0xfeffff).ram().share("shareram"); /* Work RAM (shared with D5002FP) */
+ map(0x000000, 0x0fffff).rom(); /* ROM */
+ map(0x200000, 0x20ffff).ram().w(FUNC(gaelco2_state::vram_w)).share("spriteram"); /* Video RAM */
+ map(0x202890, 0x2028ff).rw("gaelco", FUNC(gaelco_gae1_device::gaelcosnd_r), FUNC(gaelco_gae1_device::gaelcosnd_w)); /* Sound Registers */
+ map(0x210000, 0x211fff).ram().w(FUNC(gaelco2_state::palette_w)).share("paletteram"); /* Palette */
+ map(0x218004, 0x218009).ram().w(FUNC(gaelco2_state::vregs_w)).share("vregs"); /* Video Registers */
+ map(0x300000, 0x300001).portr("IN0"); /* DSW #1 + Input 1P */
+ map(0x300002, 0x300003).portr("IN1"); /* DSW #2 + Input 2P */
+ map(0x300004, 0x300005).portr("IN2"); /* COINSW + Input 3P */
+ map(0x300006, 0x300007).portr("IN3"); /* SERVICESW + Input 4P */
+ map(0x500000, 0x500001).select(0x0038).w(FUNC(gaelco2_state::wrally2_latch_w)); /* Coin counters */
+ map(0xfe0000, 0xfe7fff).ram(); /* Work RAM */
+ map(0xfe8000, 0xfeffff).ram().share("shareram"); /* Work RAM (shared with D5002FP) */
}
@@ -1392,7 +1386,7 @@ void gaelco2_state::touchgo(machine_config &config)
lscreen.set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */
lscreen.set_size(64*16, 32*16);
lscreen.set_visarea(0, 480-1, 16, 256-1);
- lscreen.set_screen_update(FUNC(gaelco2_state::screen_update_gaelco2_left));
+ lscreen.set_screen_update(FUNC(gaelco2_state::screen_update_left));
lscreen.set_palette(m_palette);
screen_device &rscreen(SCREEN(config, "rscreen", SCREEN_TYPE_RASTER));
@@ -1400,7 +1394,7 @@ void gaelco2_state::touchgo(machine_config &config)
rscreen.set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */
rscreen.set_size(64*16, 32*16);
rscreen.set_visarea(0, 480-1, 16, 256-1);
- rscreen.set_screen_update(FUNC(gaelco2_state::screen_update_gaelco2_right));
+ rscreen.set_screen_update(FUNC(gaelco2_state::screen_update_right));
rscreen.screen_vblank().set("spriteram", FUNC(buffered_spriteram16_device::vblank_copy_rising));
rscreen.set_palette(m_palette);
@@ -1626,18 +1620,18 @@ ROM_END
void gaelco2_state::snowboar_map(address_map &map)
{
- map(0x000000, 0x0fffff).rom(); /* ROM */
- map(0x200000, 0x20ffff).ram().w(FUNC(gaelco2_state::gaelco2_vram_w)).share("spriteram"); /* Video RAM */
- map(0x202890, 0x2028ff).rw("gaelco", FUNC(gaelco_cg1v_device::gaelcosnd_r), FUNC(gaelco_cg1v_device::gaelcosnd_w)); /* Sound Registers */
- map(0x210000, 0x211fff).ram().w(FUNC(gaelco2_state::gaelco2_palette_w)).share("paletteram"); /* Palette */
- map(0x212000, 0x213fff).ram(); /* Extra RAM */
- map(0x218004, 0x218009).ram().share("vregs"); /* Video Registers */
+ map(0x000000, 0x0fffff).rom(); /* ROM */
+ map(0x200000, 0x20ffff).ram().w(FUNC(gaelco2_state::vram_w)).share("spriteram"); /* Video RAM */
+ map(0x202890, 0x2028ff).rw("gaelco", FUNC(gaelco_cg1v_device::gaelcosnd_r), FUNC(gaelco_cg1v_device::gaelcosnd_w)); /* Sound Registers */
+ map(0x210000, 0x211fff).ram().w(FUNC(gaelco2_state::palette_w)).share("paletteram"); /* Palette */
+ map(0x212000, 0x213fff).ram(); /* Extra RAM */
+ map(0x218004, 0x218009).ram().w(FUNC(gaelco2_state::vregs_w)).share("vregs"); /* Video Registers */
map(0x300000, 0x300001).portr("P1");
- map(0x300000, 0x30000f).w(m_mainlatch, FUNC(ls259_device::write_d0)).umask16(0x00ff); /* Coin Counters & serial EEPROM */
+ map(0x300000, 0x30000f).w(m_mainlatch, FUNC(ls259_device::write_d0)).umask16(0x00ff); /* Coin Counters & serial EEPROM */
map(0x300010, 0x300011).portr("P2");
map(0x300020, 0x300021).portr("COIN");
map(0x310000, 0x31ffff).rw(FUNC(gaelco2_state::snowboar_protection_r), FUNC(gaelco2_state::snowboar_protection_w)).share("snowboar_prot"); /* Protection */
- map(0xfe0000, 0xfeffff).ram(); /* Work RAM */
+ map(0xfe0000, 0xfeffff).ram(); /* Work RAM */
}
@@ -1697,7 +1691,7 @@ void gaelco2_state::snowboar(machine_config &config)
screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */
screen.set_size(64*16, 32*16);
screen.set_visarea(0, 384-1, 16, 256-1);
- screen.set_screen_update(FUNC(gaelco2_state::screen_update_gaelco2));
+ screen.set_screen_update(FUNC(gaelco2_state::screen_update));
screen.screen_vblank().set(m_spriteram, FUNC(buffered_spriteram16_device::vblank_copy_rising));
screen.set_palette(m_palette);
@@ -1741,7 +1735,7 @@ void gaelco2_state::maniacsqs(machine_config &config)
screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */
screen.set_size(64*16, 32*16);
screen.set_visarea(0, 320-1, 16, 256-1);
- screen.set_screen_update(FUNC(gaelco2_state::screen_update_gaelco2));
+ screen.set_screen_update(FUNC(gaelco2_state::screen_update));
screen.screen_vblank().set(m_spriteram, FUNC(buffered_spriteram16_device::vblank_copy_rising));
screen.set_palette(m_palette);
@@ -1859,19 +1853,19 @@ ROM_END
void wrally2_state::wrally2_map(address_map &map)
{
- map(0x000000, 0x0fffff).rom(); /* ROM */
- map(0x200000, 0x20ffff).ram().w(FUNC(wrally2_state::gaelco2_vram_w)).share("spriteram"); /* Video RAM */
+ map(0x000000, 0x0fffff).rom(); /* ROM */
+ map(0x200000, 0x20ffff).ram().w(FUNC(wrally2_state::vram_w)).share("spriteram"); /* Video RAM */
map(0x202890, 0x2028ff).rw("gaelco", FUNC(gaelco_gae1_device::gaelcosnd_r), FUNC(gaelco_gae1_device::gaelcosnd_w)); /* Sound Registers */
- map(0x210000, 0x211fff).ram().w(FUNC(wrally2_state::gaelco2_palette_w)).share("paletteram"); /* Palette */
- map(0x212000, 0x213fff).ram(); /* Extra RAM */
- map(0x218004, 0x218009).ram().share("vregs"); /* Video Registers */
- map(0x300000, 0x300001).portr("IN0"); /* DIPSW #2 + Inputs 1P */
- map(0x300002, 0x300003).portr("IN1"); /* DIPSW #1 */
- map(0x300004, 0x300005).portr("IN2"); /* Inputs 2P + COINSW */
- map(0x300006, 0x300007).portr("IN3"); /* SERVICESW */
- map(0x400000, 0x400001).select(0x0038).w(FUNC(wrally2_state::wrally2_latch_w)); /* Coin counters, etc. */
- map(0xfe0000, 0xfe7fff).ram(); /* Work RAM */
- map(0xfe8000, 0xfeffff).ram().share("shareram"); /* Work RAM (shared with D5002FP) */
+ map(0x210000, 0x211fff).ram().w(FUNC(wrally2_state::palette_w)).share("paletteram"); /* Palette */
+ map(0x212000, 0x213fff).ram(); /* Extra RAM */
+ map(0x218004, 0x218009).ram().w(FUNC(wrally2_state::vregs_w)).share("vregs"); /* Video Registers */
+ map(0x300000, 0x300001).portr("IN0"); /* DIPSW #2 + Inputs 1P */
+ map(0x300002, 0x300003).portr("IN1"); /* DIPSW #1 */
+ map(0x300004, 0x300005).portr("IN2"); /* Inputs 2P + COINSW */
+ map(0x300006, 0x300007).portr("IN3"); /* SERVICESW */
+ map(0x400000, 0x400001).select(0x0038).w(FUNC(wrally2_state::wrally2_latch_w)); /* Coin counters, etc. */
+ map(0xfe0000, 0xfe7fff).ram(); /* Work RAM */
+ map(0xfe8000, 0xfeffff).ram().share("shareram"); /* Work RAM (shared with D5002FP) */
}
@@ -1990,7 +1984,7 @@ void wrally2_state::wrally2(machine_config &config)
lscreen.set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */
lscreen.set_size(384, 32*16);
lscreen.set_visarea(0, 384-1, 16, 256-1);
- lscreen.set_screen_update(FUNC(gaelco2_state::screen_update_gaelco2_left));
+ lscreen.set_screen_update(FUNC(gaelco2_state::screen_update_left));
lscreen.set_palette(m_palette);
screen_device &rscreen(SCREEN(config, "rscreen", SCREEN_TYPE_RASTER));
@@ -1998,7 +1992,7 @@ void wrally2_state::wrally2(machine_config &config)
rscreen.set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */
rscreen.set_size(384, 32*16);
rscreen.set_visarea(0, 384-1, 16, 256-1);
- rscreen.set_screen_update(FUNC(gaelco2_state::screen_update_gaelco2_right));
+ rscreen.set_screen_update(FUNC(gaelco2_state::screen_update_right));
rscreen.screen_vblank().set(m_spriteram, FUNC(buffered_spriteram16_device::vblank_copy_rising));
rscreen.set_palette(m_palette);
@@ -2304,34 +2298,36 @@ ROM_END
-GAME( 1994, aligator, 0, alighunt_d5002fp, alighunt, gaelco2_state, init_alighunt, ROT0, "Gaelco", "Alligator Hunt (World, protected)", 0 )
-GAME( 1994, aligators, aligator, alighunt_d5002fp, alighunt, gaelco2_state, init_alighunt, ROT0, "Gaelco", "Alligator Hunt (Spain, protected)", 0 )
-GAME( 1994, aligatorun, aligator, alighunt, alighunt, gaelco2_state, init_alighunt, ROT0, "Gaelco", "Alligator Hunt (unprotected, set 1)", 0 )
-GAME( 1994, aligatoruna, aligator, alighunt, alighunt, gaelco2_state, init_alighunt, ROT0, "Gaelco", "Alligator Hunt (unprotected, set 2)", 0 ) // strange version, starts on space stages, but clearly a recompile not a trivial hack of the above, show version maybe?
+GAME( 1994, aligator, 0, alighunt_d5002fp, alighunt, gaelco2_state, init_alighunt, ROT0, "Gaelco", "Alligator Hunt (World, protected)", 0 )
+GAME( 1994, aligators, aligator, alighunt_d5002fp, alighunt, gaelco2_state, init_alighunt, ROT0, "Gaelco", "Alligator Hunt (Spain, protected)", 0 )
+GAME( 1994, aligatorun, aligator, alighunt, alighunt, gaelco2_state, init_alighunt, ROT0, "Gaelco", "Alligator Hunt (unprotected, set 1)", 0 )
+GAME( 1994, aligatoruna, aligator, alighunt, alighunt, gaelco2_state, init_alighunt, ROT0, "Gaelco", "Alligator Hunt (unprotected, set 2)", 0 ) // strange version, starts on space stages, but clearly a recompile not a trivial hack of the above, show version maybe?
-GAME( 1995, touchgo, 0, touchgo_d5002fp, touchgo, gaelco2_state, init_touchgo, ROT0, "Gaelco", "Touch & Go (World)", MACHINE_IMPERFECT_SOUND )
-GAME( 1995, touchgon, touchgo, touchgo_d5002fp, touchgo, gaelco2_state, init_touchgo, ROT0, "Gaelco", "Touch & Go (Non North America)", MACHINE_IMPERFECT_SOUND )
-GAME( 1995, touchgoe, touchgo, touchgo_d5002fp, touchgo, gaelco2_state, init_touchgo, ROT0, "Gaelco", "Touch & Go (earlier revision)", MACHINE_IMPERFECT_SOUND )
-GAME( 1995, touchgok, touchgo, touchgo, touchgo, gaelco2_state, init_touchgo, ROT0, "Gaelco", "Touch & Go (Korea, unprotected)", MACHINE_IMPERFECT_SOUND ) // doesn't say 'Korea' but was sourced there, shows 2 copyright lines like the 'earlier revision'
+GAME( 1995, touchgo, 0, touchgo_d5002fp, touchgo, gaelco2_state, init_touchgo, ROT0, "Gaelco", "Touch & Go (World)", MACHINE_IMPERFECT_SOUND )
+GAME( 1995, touchgon, touchgo, touchgo_d5002fp, touchgo, gaelco2_state, init_touchgo, ROT0, "Gaelco", "Touch & Go (Non North America)", MACHINE_IMPERFECT_SOUND )
+GAME( 1995, touchgoe, touchgo, touchgo_d5002fp, touchgo, gaelco2_state, init_touchgo, ROT0, "Gaelco", "Touch & Go (earlier revision)", MACHINE_IMPERFECT_SOUND )
+GAME( 1995, touchgok, touchgo, touchgo, touchgo, gaelco2_state, init_touchgo, ROT0, "Gaelco", "Touch & Go (Korea, unprotected)", MACHINE_IMPERFECT_SOUND ) // doesn't say 'Korea' but was sourced there, shows 2 copyright lines like the 'earlier revision'
-GAME( 1995, wrally2, 0, wrally2, wrally2, wrally2_state, init_wrally2, ROT0, "Gaelco", "World Rally 2: Twin Racing (mask ROM version)", 0 )
-GAME( 1995, wrally2a, wrally2, wrally2, wrally2, wrally2_state, empty_init, ROT0, "Gaelco", "World Rally 2: Twin Racing (EPROM version)", 0 )
+GAME( 1995, wrally2, 0, wrally2, wrally2, wrally2_state, init_wrally2, ROT0, "Gaelco", "World Rally 2: Twin Racing (mask ROM version)", 0 )
+GAME( 1995, wrally2a, wrally2, wrally2, wrally2, wrally2_state, empty_init, ROT0, "Gaelco", "World Rally 2: Twin Racing (EPROM version)", 0 )
// All sets identify as Version 1.0, but are clearly different revisions
-GAME( 1996, maniacsq, 0, maniacsq_d5002fp, maniacsq, gaelco2_state, empty_init, ROT0, "Gaelco", "Maniac Square (protected, Version 1.0, Checksum DEEE)", 0 )
-GAME( 1996, maniacsqa, maniacsq, maniacsq_d5002fp, maniacsq, gaelco2_state, empty_init, ROT0, "Gaelco", "Maniac Square (protected, Version 1.0, Checksum CF2D)", 0 )
-GAME( 1996, maniacsqu, maniacsq, maniacsq, maniacsq, gaelco2_state, empty_init, ROT0, "Gaelco", "Maniac Square (unprotected, Version 1.0, Checksum BB73)", 0 )
-GAME( 1996, maniacsqs, maniacsq, maniacsqs, snowboar, gaelco2_state, empty_init, ROT0, "Gaelco", "Maniac Square (unprotected, Version 1.0, Checksum 66B1, 960419/1 PCB)", 0 ) // Official version on Snow Board Championship PCB, doesn't use the protection
+GAME( 1996, maniacsq, 0, maniacsq_d5002fp, maniacsq, gaelco2_state, empty_init, ROT0, "Gaelco", "Maniac Square (protected, Version 1.0, Checksum DEEE)", 0 )
+GAME( 1996, maniacsqa, maniacsq, maniacsq_d5002fp, maniacsq, gaelco2_state, empty_init, ROT0, "Gaelco", "Maniac Square (protected, Version 1.0, Checksum CF2D)", 0 )
+GAME( 1996, maniacsqu, maniacsq, maniacsq, maniacsq, gaelco2_state, empty_init, ROT0, "Gaelco", "Maniac Square (unprotected, Version 1.0, Checksum BB73)", 0 )
+GAME( 1996, maniacsqs, maniacsq, maniacsqs, snowboar, gaelco2_state, empty_init, ROT0, "Gaelco", "Maniac Square (unprotected, Version 1.0, Checksum 66B1, 960419/1 PCB)", 0 ) // Official version on Snow Board Championship PCB, doesn't use the protection
-GAME( 1996, snowboar, 0, snowboar, snowboar, gaelco2_state, empty_init, ROT0, "Gaelco", "Snow Board Championship (Version 2.1)", 0 )
-GAME( 1996, snowboara, snowboar, snowboar, snowboar, gaelco2_state, init_snowboar, ROT0, "Gaelco", "Snow Board Championship (Version 2.0)", 0 )
+GAME( 1996, snowboar, 0, snowboar, snowboar, gaelco2_state, init_snowboar, ROT0, "Gaelco", "Snow Board Championship (Version 2.1)", 0 )
+GAME( 1996, snowboara, snowboar, snowboar, snowboar, gaelco2_state, init_snowboara, ROT0, "Gaelco", "Snow Board Championship (Version 2.0)", 0 )
-GAME( 1998, bang, 0, bang, bang, bang_state, init_bang, ROT0, "Gaelco", "Bang!", 0 )
-GAME( 1998, bangj, bang, bang, bang, bang_state, init_bang, ROT0, "Gaelco", "Gun Gabacho (Japan)", 0 )
+GAME( 1998, bang, 0, bang, bang, bang_state, init_bang, ROT0, "Gaelco", "Bang!", 0 )
+GAME( 1998, bangj, bang, bang, bang, bang_state, init_bang, ROT0, "Gaelco", "Gun Gabacho (Japan)", 0 )
// 2-in-1 gambling game, appears to be cloned Gaelco hardware complete with DS5002FP, or possibly manufactured by Gaelco for Nova Desitec but without any Gaelco branding.
-GAME( 1999, play2000, 0, play2000, play2000, gaelco2_state, empty_init, ROT0, "Nova Desitec", "Play 2000 (Super Slot & Gran Tesoro) (v4.0) (Italy)", MACHINE_UNEMULATED_PROTECTION | MACHINE_NOT_WORKING )
-GAME( 1999, play2000a, play2000, play2000, play2000, gaelco2_state, empty_init, ROT0, "Nova Desitec", "Play 2000 (Super Slot & Gran Tesoro) (v5.01) (Italy)", MACHINE_UNEMULATED_PROTECTION | MACHINE_NOT_WORKING ) // bad dump
+// these are Italian versions, English versions also exist
+GAME( 1999, play2000, 0, play2000, play2000, gaelco2_state, init_play2000, ROT0, "Nova Desitec", "Play 2000 (Super Slot & Gran Tesoro) (v7.0i) (Italy)", 0 )
+GAME( 1999, play2000_50i,play2000, play2000, play2000, gaelco2_state, empty_init, ROT0, "Nova Desitec", "Play 2000 (Super Slot & Gran Tesoro) (v5.0i) (Italy)", MACHINE_NOT_WORKING ) // bad dump
+GAME( 1999, play2000_40i,play2000, play2000, play2000, gaelco2_state, init_play2000, ROT0, "Nova Desitec", "Play 2000 (Super Slot & Gran Tesoro) (v4.0i) (Italy)", 0 )
// Gym exercise bike
-GAME( 1997, saltcrdi, 0, saltcrdi, saltcrdi, gaelco2_state, empty_init, ROT0, "Salter Fitness / Gaelco", "Pro Tele Cardioline (Salter Fitness Bike V.1.0, Checksum 02AB)", MACHINE_NOT_WORKING ) // there are other machines in the Cardioline series, without TV displays
+GAME( 1997, saltcrdi, 0, saltcrdi, saltcrdi, gaelco2_state, empty_init, ROT0, "Salter Fitness / Gaelco", "Pro Tele Cardioline (Salter Fitness Bike V.1.0, Checksum 02AB)", MACHINE_NOT_WORKING ) // there are other machines in the Cardioline series, without TV displays
diff --git a/src/mame/drivers/gaelcopc.cpp b/src/mame/drivers/gaelcopc.cpp
index 600feb982a9..b3762621ec1 100644
--- a/src/mame/drivers/gaelcopc.cpp
+++ b/src/mame/drivers/gaelcopc.cpp
@@ -71,22 +71,23 @@ static INPUT_PORTS_START( gaelcopc )
INPUT_PORTS_END
-MACHINE_CONFIG_START(gaelcopc_state::gaelcopc)
+void gaelcopc_state::gaelcopc(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", PENTIUM, 2000000000) /* Pentium4? */
- MCFG_DEVICE_PROGRAM_MAP(gaelcopc_map)
+ PENTIUM(config, m_maincpu, 2000000000); /* Pentium4? */
+ m_maincpu->set_addrmap(AS_PROGRAM, &gaelcopc_state::gaelcopc_map);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_UPDATE_DRIVER(gaelcopc_state, screen_update)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(64*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 64*8-1, 0*8, 32*8-1)
- MCFG_SCREEN_PALETTE("palette")
-
- MCFG_PALETTE_ADD("palette", 0x100)
-MACHINE_CONFIG_END
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_screen_update(FUNC(gaelcopc_state::screen_update));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(64*8, 32*8);
+ screen.set_visarea(0*8, 64*8-1, 0*8, 32*8-1);
+ screen.set_palette("palette");
+
+ PALETTE(config, "palette").set_entries(0x100);
+}
ROM_START(tokyocop)
diff --git a/src/mame/drivers/gaiden.cpp b/src/mame/drivers/gaiden.cpp
index 1e487fed8b8..c730fb3d311 100644
--- a/src/mame/drivers/gaiden.cpp
+++ b/src/mame/drivers/gaiden.cpp
@@ -758,7 +758,7 @@ void gaiden_state::shadoww(machine_config &config)
m_maincpu->set_vblank_int("screen", FUNC(gaiden_state::irq5_line_assert));
Z80(config, m_audiocpu, 4000000); /* 4 MHz */
- m_audiocpu->set_addrmap(AS_PROGRAM, &gaiden_state::sound_map); /* IRQs are triggered by the YM2203 */
+ m_audiocpu->set_addrmap(AS_PROGRAM, &gaiden_state::sound_map); /* IRQs are triggered by the YM2203 */
WATCHDOG_TIMER(config, "watchdog");
diff --git a/src/mame/drivers/gal3.cpp b/src/mame/drivers/gal3.cpp
index 5843b92e73f..45ed3935b97 100644
--- a/src/mame/drivers/gal3.cpp
+++ b/src/mame/drivers/gal3.cpp
@@ -610,44 +610,45 @@ static GFXDECODE_START( gfx_gal3_r )
GFXDECODE_ENTRY( "obj_board2", 0x000000, tile_layout, 0x000, 0x20 )
GFXDECODE_END
-MACHINE_CONFIG_START(gal3_state::gal3)
- MCFG_DEVICE_ADD("maincpu", M68020, 49152000/2)
- MCFG_DEVICE_PROGRAM_MAP(cpu_mst_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("lscreen", gal3_state, irq1_line_hold)
+void gal3_state::gal3(machine_config &config)
+{
+ m68020_device &maincpu(M68020(config, "maincpu", 49152000/2));
+ maincpu.set_addrmap(AS_PROGRAM, &gal3_state::cpu_mst_map);
+ maincpu.set_vblank_int("lscreen", FUNC(gal3_state::irq1_line_hold));
- MCFG_DEVICE_ADD("cpuslv", M68020, 49152000/2)
- MCFG_DEVICE_PROGRAM_MAP(cpu_slv_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("lscreen", gal3_state, irq1_line_hold)
+ m68020_device &cpusly(M68020(config, "cpuslv", 49152000/2));
+ cpusly.set_addrmap(AS_PROGRAM, &gal3_state::cpu_slv_map);
+ cpusly.set_vblank_int("lscreen", FUNC(gal3_state::irq1_line_hold));
- MCFG_DEVICE_ADD("rs_cpu", M68000, 49152000/4)
- MCFG_DEVICE_PROGRAM_MAP(rs_cpu_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("lscreen", gal3_state, irq5_line_hold) /// programmable via 148 IC
+ m68000_device &rs_cpu(M68000(config, "rs_cpu", 49152000/4));
+ rs_cpu.set_addrmap(AS_PROGRAM, &gal3_state::rs_cpu_map);
+ rs_cpu.set_vblank_int("lscreen", FUNC(gal3_state::irq5_line_hold)); /// programmable via 148 IC
- MCFG_DEVICE_ADD("sound_cpu", M68000, 12000000) // ??
- MCFG_DEVICE_PROGRAM_MAP(sound_cpu_map)
+ m68000_device &sound_cpu(M68000(config, "sound_cpu", 12000000)); // ??
+ sound_cpu.set_addrmap(AS_PROGRAM, &gal3_state::sound_cpu_map);
- MCFG_DEVICE_ADD("psn_b1_cpu", M68000, 12000000) // ??
- MCFG_DEVICE_PROGRAM_MAP(psn_b1_cpu_map)
+ m68000_device &psn_b1_cpu(M68000(config, "psn_b1_cpu", 12000000)); // ??
+ psn_b1_cpu.set_addrmap(AS_PROGRAM, &gal3_state::psn_b1_cpu_map);
/*
- MCFG_DEVICE_ADD("psn_b2_cpu", M68000, 12000000) // ??
- MCFG_DEVICE_PROGRAM_MAP(psn_b1_cpu_map,0)
+ m68000_device &psn_b2_cpu(M68000(config, "psn_b2_cpu", 12000000)); // ??
+ psn_b2_cpu.set_addrmap(AS_PROGRAM, &gal3_state::psn_b1_cpu_map);
- MCFG_DEVICE_ADD("psn_b3_cpu", M68000, 12000000) // ??
- MCFG_DEVICE_PROGRAM_MAP(psn_b1_cpu_map,0)
+ m68000_device &psn_b3_cpu(M68000(config, "psn_b3_cpu", 12000000)); // ??
+ psn_b3_cpu.set_addrmap(AS_PROGRAM, &gal3_state::psn_b1_cpu_map);
*/
- MCFG_QUANTUM_TIME(attotime::from_hz(60*8000)) /* 8000 CPU slices per frame */
+ config.m_minimum_quantum = attotime::from_hz(60*8000); /* 8000 CPU slices per frame */
NVRAM(config, "nvmem", nvram_device::DEFAULT_ALL_0);
// video chain 1
- MCFG_SCREEN_ADD("lscreen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(64*8, 64*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 512-1, 0*8, 512-1)
- MCFG_SCREEN_UPDATE_DRIVER(gal3_state, screen_update_left)
- MCFG_SCREEN_PALETTE("palette_1")
+ screen_device &lscreen(SCREEN(config, "lscreen", SCREEN_TYPE_RASTER));
+ lscreen.set_refresh_hz(60);
+ lscreen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ lscreen.set_size(64*8, 64*8);
+ lscreen.set_visarea(0*8, 512-1, 0*8, 512-1);
+ lscreen.set_screen_update(FUNC(gal3_state::screen_update_left));
+ lscreen.set_palette(m_palette[0]);
GFXDECODE(config, "gfxdecode_1", m_palette[0], gfx_gal3_l);
PALETTE(config, m_palette[0]).set_format(palette_device::xBRG_888, NAMCOS21_NUM_COLORS);
@@ -671,13 +672,13 @@ MACHINE_CONFIG_START(gal3_state::gal3)
// video chain 2
- MCFG_SCREEN_ADD("rscreen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(64*8, 64*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 512-1, 0*8, 512-1)
- MCFG_SCREEN_UPDATE_DRIVER(gal3_state, screen_update_right)
- MCFG_SCREEN_PALETTE("palette_2")
+ screen_device &rscreen(SCREEN(config, "rscreen", SCREEN_TYPE_RASTER));
+ rscreen.set_refresh_hz(60);
+ rscreen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ rscreen.set_size(64*8, 64*8);
+ rscreen.set_visarea(0*8, 512-1, 0*8, 512-1);
+ rscreen.set_screen_update(FUNC(gal3_state::screen_update_right));
+ rscreen.set_palette(m_palette[1]);
GFXDECODE(config, "gfxdecode_2", m_palette[1], gfx_gal3_r);
PALETTE(config, m_palette[1]).set_format(palette_device::xBRG_888, NAMCOS21_NUM_COLORS);
@@ -712,7 +713,7 @@ MACHINE_CONFIG_START(gal3_state::gal3)
m_c140_16a->set_bank_type(c140_device::C140_TYPE::SYSTEM21);
m_c140_16a->add_route(0, "lspeaker", 0.50);
m_c140_16a->add_route(1, "rspeaker", 0.50);
-MACHINE_CONFIG_END
+}
/*
diff --git a/src/mame/drivers/galaga.cpp b/src/mame/drivers/galaga.cpp
index bcad96fa4c7..649b386f8d1 100644
--- a/src/mame/drivers/galaga.cpp
+++ b/src/mame/drivers/galaga.cpp
@@ -1651,7 +1651,7 @@ void bosco_state::bosco(machine_config &config)
WATCHDOG_TIMER(config, "watchdog").set_vblank_count(m_screen, 8);
- config.m_minimum_quantum = attotime::from_hz(6000); /* 100 CPU slices per frame - an high value to ensure proper synchronization of the CPUs */
+ config.m_minimum_quantum = attotime::from_hz(6000); /* 100 CPU slices per frame - a high value to ensure proper synchronization of the CPUs */
/* video hardware */
SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
@@ -1721,7 +1721,7 @@ void galaga_state::galaga(machine_config &config)
WATCHDOG_TIMER(config, "watchdog").set_vblank_count(m_screen, 8);
- config.m_minimum_quantum = attotime::from_hz(6000); /* 100 CPU slices per frame - an high value to ensure proper synchronization of the CPUs */
+ config.m_minimum_quantum = attotime::from_hz(6000); /* 100 CPU slices per frame - a high value to ensure proper synchronization of the CPUs */
/* video hardware */
SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
@@ -1823,7 +1823,7 @@ void xevious_state::xevious(machine_config &config)
WATCHDOG_TIMER(config, "watchdog").set_vblank_count(m_screen, 8);
- config.m_minimum_quantum = attotime::from_hz(60000); /* 1000 CPU slices per frame - an high value to ensure proper synchronization of the CPUs */
+ config.m_minimum_quantum = attotime::from_hz(60000); /* 1000 CPU slices per frame - a high value to ensure proper synchronization of the CPUs */
/* video hardware */
SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
@@ -1931,7 +1931,7 @@ void digdug_state::digdug(machine_config &config)
m_videolatch->q_out_cb<3>().set(FUNC(digdug_state::bg_disable_w));
m_videolatch->q_out_cb<7>().set(FUNC(digdug_state::flip_screen_w));
- config.m_minimum_quantum = attotime::from_hz(6000); /* 100 CPU slices per frame - an high value to ensure proper synchronization of the CPUs */
+ config.m_minimum_quantum = attotime::from_hz(6000); /* 100 CPU slices per frame - a high value to ensure proper synchronization of the CPUs */
ER2055(config, m_earom);
diff --git a/src/mame/drivers/galastrm.cpp b/src/mame/drivers/galastrm.cpp
index f6c6357fae4..2e4e8ce4380 100644
--- a/src/mame/drivers/galastrm.cpp
+++ b/src/mame/drivers/galastrm.cpp
@@ -38,7 +38,6 @@ $300.b debugmode
$305.b invincibility
TODO:
-- convert to use device implementation of TC0110PCR
- device-ify TC0610? (no other known users)
*/
@@ -61,28 +60,13 @@ INTERRUPT_GEN_MEMBER(galastrm_state::interrupt)
device.execute().set_input_line(5, HOLD_LINE);
}
-WRITE32_MEMBER(galastrm_state::palette_w)
+template<int Chip>
+WRITE16_MEMBER(galastrm_state::tc0610_w)
{
- if (ACCESSING_BITS_16_31)
- m_tc0110pcr_addr = data >> 16;
- if ((ACCESSING_BITS_0_15) && (m_tc0110pcr_addr < 4096))
- m_palette->set_pen_color(m_tc0110pcr_addr, pal5bit(data >> 10), pal5bit(data >> 5), pal5bit(data >> 0));
-}
-
-WRITE32_MEMBER(galastrm_state::tc0610_0_w)
-{
- if (ACCESSING_BITS_16_31)
- m_tc0610_0_addr = data >> 16;
- if ((ACCESSING_BITS_0_15) && (m_tc0610_0_addr < 8))
- m_tc0610_ctrl_reg[0][m_tc0610_0_addr] = data;
-}
-
-WRITE32_MEMBER(galastrm_state::tc0610_1_w)
-{
- if (ACCESSING_BITS_16_31)
- m_tc0610_1_addr = data >> 16;
- if ((ACCESSING_BITS_0_15) && (m_tc0610_1_addr < 8))
- m_tc0610_ctrl_reg[1][m_tc0610_1_addr] = data;
+ if (offset == 0)
+ m_tc0610_addr[Chip] = data;
+ else if (m_tc0610_addr[Chip] < 8)
+ m_tc0610_ctrl_reg[Chip][m_tc0610_addr[Chip]] = data;
}
@@ -107,7 +91,7 @@ WRITE8_MEMBER(galastrm_state::coin_word_w)
void galastrm_state::main_map(address_map &map)
{
map(0x000000, 0x0fffff).rom();
- map(0x200000, 0x21ffff).ram().share("ram"); /* main CPUA ram */
+ map(0x200000, 0x21ffff).ram(); /* main CPU ram */
map(0x300000, 0x303fff).ram().share("spriteram");
map(0x400000, 0x400007).rw("tc0510nio", FUNC(tc0510nio_device::read), FUNC(tc0510nio_device::write));
map(0x40fff0, 0x40fff3).nopw();
@@ -115,9 +99,9 @@ void galastrm_state::main_map(address_map &map)
map(0x600000, 0x6007ff).rw("taito_en:dpram", FUNC(mb8421_device::left_r), FUNC(mb8421_device::left_w)); /* Sound shared ram */
map(0x800000, 0x80ffff).rw(m_tc0480scp, FUNC(tc0480scp_device::long_r), FUNC(tc0480scp_device::long_w)); /* tilemaps */
map(0x830000, 0x83002f).rw(m_tc0480scp, FUNC(tc0480scp_device::ctrl_long_r), FUNC(tc0480scp_device::ctrl_long_w));
- map(0x900000, 0x900003).w(FUNC(galastrm_state::palette_w)); /* TC0110PCR */
- map(0xb00000, 0xb00003).w(FUNC(galastrm_state::tc0610_0_w)); /* TC0610 */
- map(0xc00000, 0xc00003).w(FUNC(galastrm_state::tc0610_1_w));
+ map(0x900000, 0x900003).rw(m_tc0110pcr, FUNC(tc0110pcr_device::word_r), FUNC(tc0110pcr_device::step1_rbswap_word_w)); /* TC0110PCR */
+ map(0xb00000, 0xb00003).w(FUNC(galastrm_state::tc0610_w<0>)); /* TC0610 */
+ map(0xc00000, 0xc00003).w(FUNC(galastrm_state::tc0610_w<1>));
map(0xd00000, 0xd0ffff).rw(m_tc0100scn, FUNC(tc0100scn_device::long_r), FUNC(tc0100scn_device::long_w)); /* piv tilemaps */
map(0xd20000, 0xd2000f).rw(m_tc0100scn, FUNC(tc0100scn_device::ctrl_long_r), FUNC(tc0100scn_device::ctrl_long_w));
}
@@ -252,6 +236,8 @@ void galastrm_state::galastrm(machine_config &config)
m_tc0480scp->set_offsets(-40, -3);
m_tc0480scp->set_gfxdecode_tag(m_gfxdecode);
+ TC0110PCR(config, m_tc0110pcr, 0, m_palette);
+
/* sound hardware */
TAITO_EN(config, "taito_en", 0);
}
@@ -279,7 +265,7 @@ ROM_START( galastrm )
ROM_LOAD32_BYTE( "c99-04.ic66", 0x000002, 0x100000, CRC(a681760f) SHA1(23d4fc7eb778c8a25c4bc7cee1d0c8cdd828a996) )
ROM_LOAD32_BYTE( "c99-03.ic67", 0x000003, 0x100000, CRC(a2807a27) SHA1(977e395ea2ab2fb82807d3cf5fe5f1dbbde99da0) )
- ROM_REGION16_LE( 0x80000, "user1", 0 )
+ ROM_REGION16_LE( 0x80000, "sprmaprom", 0 )
ROM_LOAD16_WORD( "c99-11.ic90", 0x00000, 0x80000, CRC(26a6926c) SHA1(918860e2829131e9ecfe983b2ae3e49e1c9ecd72) ) /* STY, spritemap */
ROM_REGION16_BE( 0x1000000, "ensoniq.0", ROMREGION_ERASE00 )
diff --git a/src/mame/drivers/galaxi.cpp b/src/mame/drivers/galaxi.cpp
index 805810875e4..7eafa021b35 100644
--- a/src/mame/drivers/galaxi.cpp
+++ b/src/mame/drivers/galaxi.cpp
@@ -463,23 +463,23 @@ void galaxi_state::machine_reset()
Machine Drivers
***************************************************************************/
-MACHINE_CONFIG_START(galaxi_state::galaxi)
-
+void galaxi_state::galaxi(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M68000, CPU_CLOCK)
- MCFG_DEVICE_PROGRAM_MAP(galaxi_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", galaxi_state, irq4_line_hold)
+ M68000(config, m_maincpu, CPU_CLOCK);
+ m_maincpu->set_addrmap(AS_PROGRAM, &galaxi_state::galaxi_map);
+ m_maincpu->set_vblank_int("screen", FUNC(galaxi_state::irq4_line_hold));
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(512, 256)
- MCFG_SCREEN_VISIBLE_AREA(16*5, 512-16*2-1, 16*1, 256-1)
- MCFG_SCREEN_UPDATE_DRIVER(galaxi_state, screen_update)
- MCFG_SCREEN_PALETTE(m_palette)
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_refresh_hz(60);
+ m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ m_screen->set_size(512, 256);
+ m_screen->set_visarea(16*5, 512-16*2-1, 16*1, 256-1);
+ m_screen->set_screen_update(FUNC(galaxi_state::screen_update));
+ m_screen->set_palette(m_palette);
GFXDECODE(config, m_gfxdecode, m_palette, gfx_galaxi);
PALETTE(config, m_palette).set_format(palette_device::xRGB_555, 0x400);
@@ -487,30 +487,29 @@ MACHINE_CONFIG_START(galaxi_state::galaxi)
/* sound hardware */
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("oki", OKIM6295, SND_CLOCK, okim6295_device::PIN7_LOW) // ?
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
-MACHINE_CONFIG_END
+ OKIM6295(config, "oki", SND_CLOCK, okim6295_device::PIN7_LOW).add_route(ALL_OUTPUTS, "mono", 1.0); // ?
+}
-MACHINE_CONFIG_START(galaxi_state::magjoker)
+void galaxi_state::magjoker(machine_config &config)
+{
galaxi(config);
/* sound hardware */
- MCFG_DEVICE_MODIFY("oki")
/* ADPCM samples are recorded with extremely low volume */
- MCFG_SOUND_ROUTES_RESET()
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 4.0)
-MACHINE_CONFIG_END
+ subdevice<okim6295_device>("oki")->reset_routes();
+ subdevice<okim6295_device>("oki")->add_route(ALL_OUTPUTS, "mono", 4.0);
+}
-MACHINE_CONFIG_START(galaxi_state::lastfour)
+void galaxi_state::lastfour(machine_config &config)
+{
galaxi(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(lastfour_map)
-MACHINE_CONFIG_END
+ m_maincpu->set_addrmap(AS_PROGRAM, &galaxi_state::lastfour_map);
+}
/***************************************************************************
diff --git a/src/mame/drivers/galaxian.cpp b/src/mame/drivers/galaxian.cpp
index e942ef73940..1cbe080ddcf 100644
--- a/src/mame/drivers/galaxian.cpp
+++ b/src/mame/drivers/galaxian.cpp
@@ -681,17 +681,15 @@ WRITE_LINE_MEMBER(galaxian_state::vblank_interrupt_w)
m_maincpu->set_input_line(m_irq_line, ASSERT_LINE);
}
-WRITE_LINE_MEMBER(galaxian_state::tenspot_interrupt_w)
+INPUT_CHANGED_MEMBER(galaxian_state::tenspot_fake)
{
- vblank_interrupt_w(state);
-
- if (m_fake_select.read_safe(0x00))
+ if (newval)
{
m_tenspot_current_game++;
m_tenspot_current_game%=10;
tenspot_set_game_bank(m_tenspot_current_game, 1);
- m_maincpu->pulse_input_line(INPUT_LINE_RESET, attotime::zero);
}
+ m_maincpu->set_input_line(INPUT_LINE_RESET, newval ? ASSERT_LINE : CLEAR_LINE);
}
WRITE8_MEMBER(galaxian_state::irq_enable_w)
@@ -748,8 +746,8 @@ READ8_MEMBER(galaxian_state::konami_ay8910_r)
{
/* the decoding here is very simplistic, and you can address both simultaneously */
uint8_t result = 0xff;
- if (offset & 0x20) result &= m_ay8910[1]->data_r(space, 0);
- if (offset & 0x80) result &= m_ay8910[0]->data_r(space, 0);
+ if (offset & 0x20) result &= m_ay8910[1]->data_r();
+ if (offset & 0x80) result &= m_ay8910[0]->data_r();
return result;
}
@@ -759,14 +757,14 @@ WRITE8_MEMBER(galaxian_state::konami_ay8910_w)
/* AV 4,5 ==> AY8910 #2 */
/* the decoding here is very simplistic, and you can address two simultaneously */
if (offset & 0x10)
- m_ay8910[1]->address_w(space, 0, data);
+ m_ay8910[1]->address_w(data);
else if (offset & 0x20)
- m_ay8910[1]->data_w(space, 0, data);
+ m_ay8910[1]->data_w(data);
/* AV6,7 ==> AY8910 #1 */
if (offset & 0x40)
- m_ay8910[0]->address_w(space, 0, data);
+ m_ay8910[0]->address_w(data);
else if (offset & 0x80)
- m_ay8910[0]->data_w(space, 0, data);
+ m_ay8910[0]->data_w(data);
}
@@ -1082,7 +1080,7 @@ READ8_MEMBER(galaxian_state::frogger_ay8910_r)
{
/* the decoding here is very simplistic */
uint8_t result = 0xff;
- if (offset & 0x40) result &= m_ay8910[0]->data_r(space, 0);
+ if (offset & 0x40) result &= m_ay8910[0]->data_r();
return result;
}
@@ -1092,9 +1090,9 @@ WRITE8_MEMBER(galaxian_state::frogger_ay8910_w)
/* the decoding here is very simplistic */
/* AV6,7 ==> AY8910 #1 */
if (offset & 0x40)
- m_ay8910[0]->data_w(space, 0, data);
+ m_ay8910[0]->data_w(data);
else if (offset & 0x80)
- m_ay8910[0]->address_w(space, 0, data);
+ m_ay8910[0]->address_w(data);
}
@@ -1167,9 +1165,9 @@ READ8_MEMBER(galaxian_state::scorpion_ay8910_r)
{
/* the decoding here is very simplistic, and you can address both simultaneously */
uint8_t result = 0xff;
- if (offset & 0x08) result &= m_ay8910[2]->data_r(space, 0);
- if (offset & 0x20) result &= m_ay8910[1]->data_r(space, 0);
- if (offset & 0x80) result &= m_ay8910[0]->data_r(space, 0);
+ if (offset & 0x08) result &= m_ay8910[2]->data_r();
+ if (offset & 0x20) result &= m_ay8910[1]->data_r();
+ if (offset & 0x80) result &= m_ay8910[0]->data_r();
return result;
}
@@ -1177,12 +1175,12 @@ READ8_MEMBER(galaxian_state::scorpion_ay8910_r)
WRITE8_MEMBER(galaxian_state::scorpion_ay8910_w)
{
/* the decoding here is very simplistic, and you can address all six simultaneously */
- if (offset & 0x04) m_ay8910[2]->address_w(space, 0, data);
- if (offset & 0x08) m_ay8910[2]->data_w(space, 0, data);
- if (offset & 0x10) m_ay8910[1]->address_w(space, 0, data);
- if (offset & 0x20) m_ay8910[1]->data_w(space, 0, data);
- if (offset & 0x40) m_ay8910[0]->address_w(space, 0, data);
- if (offset & 0x80) m_ay8910[0]->data_w(space, 0, data);
+ if (offset & 0x04) m_ay8910[2]->address_w(data);
+ if (offset & 0x08) m_ay8910[2]->data_w(data);
+ if (offset & 0x10) m_ay8910[1]->address_w(data);
+ if (offset & 0x20) m_ay8910[1]->data_w(data);
+ if (offset & 0x40) m_ay8910[0]->address_w(data);
+ if (offset & 0x80) m_ay8910[0]->data_w(data);
}
@@ -1285,7 +1283,7 @@ WRITE8_MEMBER(galaxian_state::zigzag_ay8910_w)
/* bit 0 = WRITE */
/* bit 1 = C/D */
if ((offset & 1) != 0)
- m_ay8910[0]->data_address_w(space, offset >> 1, m_zigzag_ay8910_latch);
+ m_ay8910[0]->data_address_w(offset >> 1, m_zigzag_ay8910_latch);
break;
case 0x100:
@@ -1377,21 +1375,21 @@ WRITE8_MEMBER(galaxian_state::mshuttle_ay8910_cs_w)
WRITE8_MEMBER(galaxian_state::mshuttle_ay8910_control_w)
{
if (!m_mshuttle_ay8910_cs)
- m_ay8910_cclimber->address_w(space, offset, data);
+ m_ay8910_cclimber->address_w(data);
}
WRITE8_MEMBER(galaxian_state::mshuttle_ay8910_data_w)
{
if (!m_mshuttle_ay8910_cs)
- m_ay8910_cclimber->data_w(space, offset, data);
+ m_ay8910_cclimber->data_w(data);
}
READ8_MEMBER(galaxian_state::mshuttle_ay8910_data_r)
{
if (!m_mshuttle_ay8910_cs)
- return m_ay8910_cclimber->data_r(space, offset);
+ return m_ay8910_cclimber->data_r();
return 0xff;
}
@@ -3254,7 +3252,7 @@ static INPUT_PORTS_START( tenspot )
PORT_DIPUNKNOWN( 0x80, 0x80 )
PORT_START("FAKE_SELECT") /* fake button to move onto next game - until select rom is understood! */
- PORT_BIT( 0x0001, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_NAME("Next Game (Fake)") PORT_IMPULSE(1)
+ PORT_BIT( 0x0001, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_NAME("Next Game (Fake)") PORT_IMPULSE(1) PORT_CHANGED_MEMBER(DEVICE_SELF, galaxian_state, tenspot_fake, nullptr)
PORT_MODIFY("IN0")
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_4WAY
@@ -5988,42 +5986,40 @@ DISCRETE_SOUND_END
*
*************************************/
-MACHINE_CONFIG_START(galaxian_state::galaxian_base)
-
- /* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, GALAXIAN_PIXEL_CLOCK/3/2)
- MCFG_DEVICE_PROGRAM_MAP(galaxian_map)
+void galaxian_state::galaxian_base(machine_config &config)
+{
+ // basic machine hardware
+ Z80(config, m_maincpu, GALAXIAN_PIXEL_CLOCK/3/2);
+ m_maincpu->set_addrmap(AS_PROGRAM, &galaxian_state::galaxian_map);
WATCHDOG_TIMER(config, "watchdog").set_vblank_count("screen", 8);
- /* video hardware */
+ // video hardware
GFXDECODE(config, m_gfxdecode, m_palette, gfx_galaxian);
PALETTE(config, m_palette, FUNC(galaxian_state::galaxian_palette), 32);
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_RAW_PARAMS(GALAXIAN_PIXEL_CLOCK, GALAXIAN_HTOTAL, GALAXIAN_HBEND, GALAXIAN_HBSTART, GALAXIAN_VTOTAL, GALAXIAN_VBEND, GALAXIAN_VBSTART)
- MCFG_SCREEN_UPDATE_DRIVER(galaxian_state, screen_update_galaxian)
- MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE(*this, galaxian_state, vblank_interrupt_w))
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_raw(GALAXIAN_PIXEL_CLOCK, GALAXIAN_HTOTAL, GALAXIAN_HBEND, GALAXIAN_HBSTART, GALAXIAN_VTOTAL, GALAXIAN_VBEND, GALAXIAN_VBSTART);
+ m_screen->set_screen_update(FUNC(galaxian_state::screen_update_galaxian));
+ m_screen->screen_vblank().set(FUNC(galaxian_state::vblank_interrupt_w));
- /* sound hardware */
+ // sound hardware
SPEAKER(config, "speaker").front_center();
-MACHINE_CONFIG_END
-
+}
-MACHINE_CONFIG_START(galaxian_state::sidam_bootleg_base)
+void galaxian_state::sidam_bootleg_base(machine_config &config)
+{
galaxian_base(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_CLOCK(12_MHz_XTAL / 2 / 2)
+ m_maincpu->set_clock(12_MHz_XTAL / 2 / 2);
/* video hardware */
- MCFG_GFXDECODE_MODIFY("gfxdecode", gfx_sidam)
+ m_gfxdecode->set_info(gfx_sidam);
- MCFG_SCREEN_MODIFY("screen")
- MCFG_SCREEN_RAW_PARAMS(12_MHz_XTAL, SIDAM_HTOTAL, SIDAM_HBEND, SIDAM_HBSTART, GALAXIAN_VTOTAL, GALAXIAN_VBEND, GALAXIAN_VBSTART)
-MACHINE_CONFIG_END
+ m_screen->set_raw(12_MHz_XTAL, SIDAM_HTOTAL, SIDAM_HBEND, SIDAM_HBSTART, GALAXIAN_VTOTAL, GALAXIAN_VBEND, GALAXIAN_VBSTART);
+}
void galaxian_state::konami_base(machine_config &config)
@@ -6044,12 +6040,12 @@ void galaxian_state::konami_base(machine_config &config)
}
-MACHINE_CONFIG_START(galaxian_state::konami_sound_1x_ay8910)
-
+void galaxian_state::konami_sound_1x_ay8910(machine_config &config)
+{
/* 2nd CPU to drive sound */
- MCFG_DEVICE_ADD("audiocpu", Z80, KONAMI_SOUND_CLOCK/8)
- MCFG_DEVICE_PROGRAM_MAP(frogger_sound_map)
- MCFG_DEVICE_IO_MAP(frogger_sound_portmap)
+ Z80(config, m_audiocpu, KONAMI_SOUND_CLOCK/8);
+ m_audiocpu->set_addrmap(AS_PROGRAM, &galaxian_state::frogger_sound_map);
+ m_audiocpu->set_addrmap(AS_IO, &galaxian_state::frogger_sound_portmap);
GENERIC_LATCH_8(config, m_soundlatch);
@@ -6063,17 +6059,16 @@ MACHINE_CONFIG_START(galaxian_state::konami_sound_1x_ay8910)
m_ay8910[0]->add_route(1, "konami", 1.0, 1);
m_ay8910[0]->add_route(2, "konami", 1.0, 2);
- MCFG_DEVICE_ADD("konami", DISCRETE, konami_sound_discrete)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 0.75)
-MACHINE_CONFIG_END
-
+ DISCRETE(config, m_discrete, konami_sound_discrete).add_route(ALL_OUTPUTS, "speaker", 0.75);
+}
-MACHINE_CONFIG_START(galaxian_state::konami_sound_2x_ay8910)
+void galaxian_state::konami_sound_2x_ay8910(machine_config &config)
+{
/* 2nd CPU to drive sound */
- MCFG_DEVICE_ADD("audiocpu", Z80, KONAMI_SOUND_CLOCK/8)
- MCFG_DEVICE_PROGRAM_MAP(konami_sound_map)
- MCFG_DEVICE_IO_MAP(konami_sound_portmap)
+ Z80(config, m_audiocpu, KONAMI_SOUND_CLOCK/8);
+ m_audiocpu->set_addrmap(AS_PROGRAM, &galaxian_state::konami_sound_map);
+ m_audiocpu->set_addrmap(AS_IO, &galaxian_state::konami_sound_portmap);
GENERIC_LATCH_8(config, m_soundlatch);
@@ -6094,18 +6089,18 @@ MACHINE_CONFIG_START(galaxian_state::konami_sound_2x_ay8910)
m_ay8910[1]->add_route(1, "konami", 1.0, 4);
m_ay8910[1]->add_route(2, "konami", 1.0, 5);
- MCFG_DEVICE_ADD("konami", DISCRETE, konami_sound_discrete)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 0.5)
-MACHINE_CONFIG_END
+ DISCRETE(config, m_discrete, konami_sound_discrete).add_route(ALL_OUTPUTS, "speaker", 0.5);
+}
-MACHINE_CONFIG_START(galaxian_state::scramble_base)
+void galaxian_state::scramble_base(machine_config &config)
+{
konami_base(config);
konami_sound_2x_ay8910(config);
/* blinking frequency is determined by 555 counter with Ra=100k, Rb=10k, C=10uF */
- MCFG_TIMER_DRIVER_ADD_PERIODIC("stars", galaxian_state, scramble_stars_blink_timer, PERIOD_OF_555_ASTABLE(100000, 10000, 0.00001))
-MACHINE_CONFIG_END
+ TIMER(config, "stars").configure_periodic(FUNC(galaxian_state::scramble_stars_blink_timer), PERIOD_OF_555_ASTABLE(100000, 10000, 0.00001));
+}
@@ -6115,147 +6110,148 @@ MACHINE_CONFIG_END
*
*************************************/
-MACHINE_CONFIG_START(galaxian_state::galaxian)
+void galaxian_state::galaxian(machine_config &config)
+{
galaxian_base(config);
- MCFG_DEVICE_ADD("cust", GALAXIAN, 0)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 0.4)
+ GALAXIAN(config, "cust", 0).add_route(ALL_OUTPUTS, "speaker", 0.4);
- MCFG_DEVICE_ADD(GAL_AUDIO, DISCRETE, galaxian_discrete)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 1.0)
-MACHINE_CONFIG_END
+ DISCRETE(config, GAL_AUDIO, galaxian_discrete).add_route(ALL_OUTPUTS, "speaker", 1.0);
+}
-MACHINE_CONFIG_START(galaxian_state::victoryc)
+void galaxian_state::victoryc(machine_config &config)
+{
galaxian(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(victoryc_map)
-MACHINE_CONFIG_END
+ m_maincpu->set_addrmap(AS_PROGRAM, &galaxian_state::victoryc_map);
+}
-MACHINE_CONFIG_START(galaxian_state::spactrai)
+void galaxian_state::spactrai(machine_config &config)
+{
galaxian(config);
- /* strange memory map with RAM in the middle of ROM, there's a large block on the ROM board */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(spactrai_map)
-MACHINE_CONFIG_END
+ // strange memory map with RAM in the middle of ROM, there's a large block on the ROM board
+ m_maincpu->set_addrmap(AS_PROGRAM, &galaxian_state::spactrai_map);
+}
-MACHINE_CONFIG_START(galaxian_state::frogg)
+void galaxian_state::frogg(machine_config &config)
+{
galaxian(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(frogg_map)
-MACHINE_CONFIG_END
+ m_maincpu->set_addrmap(AS_PROGRAM, &galaxian_state::frogg_map);
+}
-MACHINE_CONFIG_START(galaxian_state::mandingarf)
+void galaxian_state::mandingarf(machine_config &config)
+{
galaxian(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(mandingarf_map)
-MACHINE_CONFIG_END
+ m_maincpu->set_addrmap(AS_PROGRAM, &galaxian_state::mandingarf_map);
+}
-MACHINE_CONFIG_START(galaxian_state::pacmanbl)
+void galaxian_state::pacmanbl(machine_config &config)
+{
galaxian(config);
/* separate tile/sprite ROMs */
- MCFG_GFXDECODE_MODIFY("gfxdecode", gfx_pacmanbl)
-MACHINE_CONFIG_END
+ m_gfxdecode->set_info(gfx_pacmanbl);
+}
-MACHINE_CONFIG_START(galaxian_state::tenspot)
+void galaxian_state::tenspot(machine_config &config)
+{
galaxian(config);
/* basic machine hardware */
- MCFG_DEVICE_ADD("selectcpu", Z80, GALAXIAN_PIXEL_CLOCK/3/2) // ?? mhz
- MCFG_DEVICE_PROGRAM_MAP(tenspot_select_map)
- //MCFG_CPU_VBLANK_INT("screen", nmi_line_pulse)
+ z80_device &selectcpu(Z80(config, "selectcpu", GALAXIAN_PIXEL_CLOCK/3/2)); // ?? mhz
+ selectcpu.set_addrmap(AS_PROGRAM, &galaxian_state::tenspot_select_map);
+ //selectcpu.set_vblank_int("screen", FUNC(galaxian_state::nmi_line_pulse));
/* separate tile/sprite ROMs */
- MCFG_GFXDECODE_MODIFY("gfxdecode", gfx_tenspot)
- // MCFG_CPU_VBLANK_INT("screen", nmi_line_pulse)
-
- /* video hardware */
- MCFG_SCREEN_MODIFY("screen")
- MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE(*this, galaxian_state, tenspot_interrupt_w))
-MACHINE_CONFIG_END
+ m_gfxdecode->set_info(gfx_tenspot);
+}
-MACHINE_CONFIG_START(galaxian_state::zigzag)
+void galaxian_state::zigzag(machine_config &config)
+{
galaxian_base(config);
/* separate tile/sprite ROMs */
- MCFG_GFXDECODE_MODIFY("gfxdecode", gfx_pacmanbl)
+ m_gfxdecode->set_info(gfx_pacmanbl);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(zigzag_map)
+ m_maincpu->set_addrmap(AS_PROGRAM, &galaxian_state::zigzag_map);
/* sound hardware */
AY8910(config, m_ay8910[0], GALAXIAN_PIXEL_CLOCK/3/2).add_route(ALL_OUTPUTS, "speaker", 0.5); /* matches PCB video - unconfirmed */
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(galaxian_state::gmgalax)
+void galaxian_state::gmgalax(machine_config &config)
+{
galaxian(config);
/* banked video hardware */
- MCFG_GFXDECODE_MODIFY("gfxdecode", gfx_gmgalax)
+ m_gfxdecode->set_info(gfx_gmgalax);
m_palette->set_entries(64);
m_palette->set_init(FUNC(galaxian_state::galaxian_palette));
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(galaxian_state::mooncrst)
+void galaxian_state::mooncrst(machine_config &config)
+{
galaxian_base(config);
- /* alternate memory map */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(mooncrst_map)
+ // alternate memory map
+ m_maincpu->set_addrmap(AS_PROGRAM, &galaxian_state::mooncrst_map);
+
+ GALAXIAN(config, "cust", 0).add_route(ALL_OUTPUTS, "speaker", 0.4);
- MCFG_DEVICE_ADD("cust", GALAXIAN, 0)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 0.4)
+ DISCRETE(config, GAL_AUDIO, mooncrst_discrete).add_route(ALL_OUTPUTS, "speaker", 1.0);
+}
- MCFG_DEVICE_ADD(GAL_AUDIO, DISCRETE, mooncrst_discrete)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 1.0)
-MACHINE_CONFIG_END
+void galaxian_state::eagle(machine_config &config)
+{
+ mooncrst(config);
+ m_palette->set_init(FUNC(galaxian_state::eagle_palette));
+}
-MACHINE_CONFIG_START(galaxian_state::moonqsr)
+void galaxian_state::moonqsr(machine_config &config)
+{
mooncrst(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_OPCODES_MAP(moonqsr_decrypted_opcodes_map)
-MACHINE_CONFIG_END
+ m_maincpu->set_addrmap(AS_OPCODES, &galaxian_state::moonqsr_decrypted_opcodes_map);
+}
-MACHINE_CONFIG_START(galaxian_state::thepitm)
+void galaxian_state::thepitm(machine_config &config)
+{
mooncrst(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(thepitm_map)
-MACHINE_CONFIG_END
+ m_maincpu->set_addrmap(AS_PROGRAM, &galaxian_state::thepitm_map);
+}
-MACHINE_CONFIG_START(galaxian_state::skybase)
+void galaxian_state::skybase(machine_config &config)
+{
mooncrst(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(skybase_map)
-MACHINE_CONFIG_END
+ m_maincpu->set_addrmap(AS_PROGRAM, &galaxian_state::skybase_map);
+}
-MACHINE_CONFIG_START(galaxian_state::kong)
+void galaxian_state::kong(machine_config &config)
+{
mooncrst(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(kong_map)
-MACHINE_CONFIG_END
+ m_maincpu->set_addrmap(AS_PROGRAM, &galaxian_state::kong_map);
+}
-MACHINE_CONFIG_START(galaxian_state::scorpnmc)
+void galaxian_state::scorpnmc(machine_config &config)
+{
mooncrst(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(scorpnmc_map)
-MACHINE_CONFIG_END
+ m_maincpu->set_addrmap(AS_PROGRAM, &galaxian_state::scorpnmc_map);
+}
-MACHINE_CONFIG_START(galaxian_state::fantastc)
+void galaxian_state::fantastc(machine_config &config)
+{
galaxian_base(config);
- /* alternate memory map */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(fantastc_map)
+ // alternate memory map
+ m_maincpu->set_addrmap(AS_PROGRAM, &galaxian_state::fantastc_map);
- /* sound hardware */
+ // sound hardware
AY8910(config, m_ay8910[0], GALAXIAN_PIXEL_CLOCK/3/2).add_route(ALL_OUTPUTS, "speaker", 0.25); // 3.072MHz
AY8910(config, m_ay8910[1], GALAXIAN_PIXEL_CLOCK/3/2).add_route(ALL_OUTPUTS, "speaker", 0.25); // 3.072MHz
-MACHINE_CONFIG_END
+}
TIMER_DEVICE_CALLBACK_MEMBER(galaxian_state::timefgtr_scanline)
@@ -6271,216 +6267,219 @@ TIMER_DEVICE_CALLBACK_MEMBER(galaxian_state::timefgtr_scanline)
}
}
-MACHINE_CONFIG_START(galaxian_state::timefgtr)
+void galaxian_state::timefgtr(machine_config &config)
+{
fantastc(config);
- MCFG_TIMER_DRIVER_ADD_SCANLINE("scantimer", galaxian_state, timefgtr_scanline, "screen", 0, 1)
-MACHINE_CONFIG_END
+ TIMER(config, "scantimer").configure_scanline(FUNC(galaxian_state::timefgtr_scanline), "screen", 0, 1);
+}
-MACHINE_CONFIG_START(galaxian_state::jumpbug)
+void galaxian_state::jumpbug(machine_config &config)
+{
galaxian_base(config);
- MCFG_DEVICE_REMOVE("watchdog")
+ config.device_remove("watchdog");
- /* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(jumpbug_map)
+ // basic machine hardware
+ m_maincpu->set_addrmap(AS_PROGRAM, &galaxian_state::jumpbug_map);
- /* sound hardware */
- AY8910(config, m_ay8910[0], GALAXIAN_PIXEL_CLOCK/3/2/2).add_route(ALL_OUTPUTS, "speaker", 0.5); /* matches PCB video - unconfirmed */
-MACHINE_CONFIG_END
+ // sound hardware
+ AY8910(config, m_ay8910[0], GALAXIAN_PIXEL_CLOCK/3/2/2).add_route(ALL_OUTPUTS, "speaker", 0.5); // matches PCB video - unconfirmed
+}
-MACHINE_CONFIG_START(galaxian_state::checkman)
+void galaxian_state::checkman(machine_config &config)
+{
mooncrst(config);
/* basic machine hardware */
- MCFG_DEVICE_ADD("audiocpu", Z80, 1620000) /* 1.62 MHz */
- MCFG_DEVICE_PROGRAM_MAP(checkman_sound_map)
- MCFG_DEVICE_IO_MAP(checkman_sound_portmap)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", galaxian_state, irq0_line_hold) /* NMIs are triggered by the main CPU */
+ Z80(config, m_audiocpu, 1620000); /* 1.62 MHz */
+ m_audiocpu->set_addrmap(AS_PROGRAM, &galaxian_state::checkman_sound_map);
+ m_audiocpu->set_addrmap(AS_IO, &galaxian_state::checkman_sound_portmap);
+ m_audiocpu->set_vblank_int("screen", FUNC(galaxian_state::irq0_line_hold)); /* NMIs are triggered by the main CPU */
GENERIC_LATCH_8(config, m_soundlatch);
/* sound hardware */
AY8910(config, m_ay8910[0], 1789750).add_route(ALL_OUTPUTS, "speaker", 0.5);
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(galaxian_state::checkmaj)
+void galaxian_state::checkmaj(machine_config &config)
+{
galaxian_base(config);
- /* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(galaxian_map_base) /* no discrete sound */
+ // basic machine hardware
+ m_maincpu->set_addrmap(AS_PROGRAM, &galaxian_state::galaxian_map_base); // no discrete sound
- /* basic machine hardware */
- MCFG_DEVICE_ADD("audiocpu", Z80, 1620000)
- MCFG_DEVICE_PROGRAM_MAP(checkmaj_sound_map)
+ Z80(config, m_audiocpu, 1620000);
+ m_audiocpu->set_addrmap(AS_PROGRAM, &galaxian_state::checkmaj_sound_map);
- MCFG_TIMER_DRIVER_ADD_SCANLINE("irq0", galaxian_state, checkmaj_irq0_gen, "screen", 0, 8)
+ TIMER(config, "irq0").configure_scanline(FUNC(galaxian_state::checkmaj_irq0_gen), "screen", 0, 8);
GENERIC_LATCH_8(config, m_soundlatch);
- /* sound hardware */
+ // sound hardware
AY8910(config, m_ay8910[0], 1620000);
m_ay8910[0]->port_a_read_callback().set(m_soundlatch, FUNC(generic_latch_8_device::read));
m_ay8910[0]->add_route(ALL_OUTPUTS, "speaker", 2);
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(galaxian_state::mshuttle)
+void galaxian_state::mshuttle(machine_config &config)
+{
galaxian_base(config);
- /* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(mshuttle_map)
- MCFG_DEVICE_OPCODES_MAP(mshuttle_decrypted_opcodes_map)
- MCFG_DEVICE_IO_MAP(mshuttle_portmap)
+ // basic machine hardware
+ m_maincpu->set_addrmap(AS_PROGRAM, &galaxian_state::mshuttle_map);
+ m_maincpu->set_addrmap(AS_OPCODES, &galaxian_state::mshuttle_decrypted_opcodes_map);
+ m_maincpu->set_addrmap(AS_IO, &galaxian_state::mshuttle_portmap);
- /* sound hardware */
- MCFG_DEVICE_ADD("cclimber_audio", CCLIMBER_AUDIO, 0)
-MACHINE_CONFIG_END
+ // sound hardware
+ CCLIMBER_AUDIO(config, "cclimber_audio", 0);
+}
-MACHINE_CONFIG_START(galaxian_state::kingball)
+void galaxian_state::kingball(machine_config &config)
+{
mooncrst(config);
/* basic machine hardware */
- MCFG_DEVICE_ADD("audiocpu", Z80,5000000/2)
- MCFG_DEVICE_PROGRAM_MAP(kingball_sound_map)
- MCFG_DEVICE_IO_MAP(kingball_sound_portmap)
+ Z80(config, m_audiocpu, 5000000/2);
+ m_audiocpu->set_addrmap(AS_PROGRAM, &galaxian_state::kingball_sound_map);
+ m_audiocpu->set_addrmap(AS_IO, &galaxian_state::kingball_sound_portmap);
GENERIC_LATCH_8(config, m_soundlatch);
/* sound hardware */
- MCFG_DEVICE_ADD("dac", DAC_4BIT_R2R, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 0.53) // unknown DAC
- MCFG_DEVICE_ADD("vref", VOLTAGE_REGULATOR, 0) MCFG_VOLTAGE_REGULATOR_OUTPUT(5.0)
- MCFG_SOUND_ROUTE(0, "dac", 1.0, DAC_VREF_POS_INPUT) MCFG_SOUND_ROUTE(0, "dac", -1.0, DAC_VREF_NEG_INPUT)
-MACHINE_CONFIG_END
+ DAC_4BIT_R2R(config, m_dac, 0).add_route(ALL_OUTPUTS, "speaker", 0.53); // unknown DAC
+ voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref"));
+ vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT);
+ vref.add_route(0, "dac", -1.0, DAC_VREF_NEG_INPUT);
+}
-MACHINE_CONFIG_START(galaxian_state::frogger)
+void galaxian_state::frogger(machine_config &config)
+{
konami_base(config);
konami_sound_1x_ay8910(config);
- /* alternate memory map */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(frogger_map)
-MACHINE_CONFIG_END
+ // alternate memory map
+ m_maincpu->set_addrmap(AS_PROGRAM, &galaxian_state::frogger_map);
+}
-MACHINE_CONFIG_START(galaxian_state::froggermc)
+void galaxian_state::froggermc(machine_config &config)
+{
galaxian_base(config);
konami_sound_1x_ay8910(config);
- /* alternate memory map */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(froggermc_map)
+ // alternate memory map
+ m_maincpu->set_addrmap(AS_PROGRAM, &galaxian_state::froggermc_map);
- MCFG_DEVICE_MODIFY("audiocpu")
- MCFG_DEVICE_IRQ_ACKNOWLEDGE_DEVICE(DEVICE_SELF, galaxian_state, froggermc_audiocpu_irq_ack)
-MACHINE_CONFIG_END
+ m_audiocpu->set_irq_acknowledge_callback(FUNC(galaxian_state::froggermc_audiocpu_irq_ack));
+}
-MACHINE_CONFIG_START(galaxian_state::froggers)
+void galaxian_state::froggers(machine_config &config)
+{
konami_base(config);
konami_sound_1x_ay8910(config);
- /* alternate memory map */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(theend_map)
-MACHINE_CONFIG_END
+ // alternate memory map
+ m_maincpu->set_addrmap(AS_PROGRAM, &galaxian_state::theend_map);
+}
-MACHINE_CONFIG_START(galaxian_state::froggervd)
+void galaxian_state::froggervd(machine_config &config)
+{
konami_base(config);
konami_sound_1x_ay8910(config);
- /* alternate memory map */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(froggervd_map)
-MACHINE_CONFIG_END
+ // alternate memory map
+ m_maincpu->set_addrmap(AS_PROGRAM, &galaxian_state::froggervd_map);
+}
-MACHINE_CONFIG_START(galaxian_state::frogf)
+void galaxian_state::frogf(machine_config &config)
+{
konami_base(config);
konami_sound_1x_ay8910(config);
- /* alternate memory map */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(frogf_map)
-MACHINE_CONFIG_END
+ // alternate memory map
+ m_maincpu->set_addrmap(AS_PROGRAM, &galaxian_state::frogf_map);
+}
-MACHINE_CONFIG_START(galaxian_state::turtles)
+void galaxian_state::turtles(machine_config &config)
+{
konami_base(config);
konami_sound_2x_ay8910(config);
- /* alternate memory map */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(turtles_map)
-MACHINE_CONFIG_END
+ // alternate memory map
+ m_maincpu->set_addrmap(AS_PROGRAM, &galaxian_state::turtles_map);
+}
-MACHINE_CONFIG_START(galaxian_state::theend)
+void galaxian_state::theend(machine_config &config)
+{
konami_base(config);
konami_sound_2x_ay8910(config);
- /* alternate memory map */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(theend_map)
+ // alternate memory map
+ m_maincpu->set_addrmap(AS_PROGRAM, &galaxian_state::theend_map);
m_ppi8255[0]->out_pc_callback().set(FUNC(galaxian_state::theend_coin_counter_w));
m_ppi8255[1]->in_pc_callback().set(FUNC(galaxian_state::theend_protection_r));
m_ppi8255[1]->out_pc_callback().set(FUNC(galaxian_state::theend_protection_w));
-MACHINE_CONFIG_END
+}
-/* TODO: should be derived from theend, resort machine configs later */
-MACHINE_CONFIG_START(galaxian_state::scramble)
+// TODO: should be derived from theend, re-sort machine configs later
+void galaxian_state::scramble(machine_config &config)
+{
scramble_base(config);
- /* alternate memory map */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(theend_map)
+
+ // alternate memory map
+ m_maincpu->set_addrmap(AS_PROGRAM, &galaxian_state::theend_map);
m_ppi8255[1]->in_pc_callback().set(FUNC(galaxian_state::theend_protection_r));
m_ppi8255[1]->out_pc_callback().set(FUNC(galaxian_state::theend_protection_w));
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(galaxian_state::jungsub)
+void galaxian_state::jungsub(machine_config &config)
+{
galaxian_base(config);
- /* alternate memory map */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(jungsub_map)
- MCFG_DEVICE_IO_MAP(jungsub_io_map)
+ // alternate memory map
+ m_maincpu->set_addrmap(AS_PROGRAM, &galaxian_state::jungsub_map);
+ m_maincpu->set_addrmap(AS_IO, &galaxian_state::jungsub_io_map);
- MCFG_DEVICE_ADD("audiocpu", Z80, GALAXIAN_PIXEL_CLOCK / 3 / 2) // clock not verified
- MCFG_DEVICE_PROGRAM_MAP(checkman_sound_map)
- MCFG_DEVICE_IO_MAP(checkman_sound_portmap)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", galaxian_state, irq0_line_hold)
+ Z80(config, m_audiocpu, GALAXIAN_PIXEL_CLOCK / 3 / 2); // clock not verified
+ m_audiocpu->set_addrmap(AS_PROGRAM, &galaxian_state::checkman_sound_map);
+ m_audiocpu->set_addrmap(AS_IO, &galaxian_state::checkman_sound_portmap);
+ m_audiocpu->set_vblank_int("screen", FUNC(galaxian_state::irq0_line_hold));
GENERIC_LATCH_8(config, m_soundlatch);
m_soundlatch->data_pending_callback().set_inputline(m_audiocpu, INPUT_LINE_NMI);
/* sound hardware */
AY8910(config, m_ay8910[0], GALAXIAN_PIXEL_CLOCK / 3 / 2 / 2).add_route(ALL_OUTPUTS, "speaker", 0.5); // clock not verified
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(galaxian_state::explorer) // Sidam 10800
+void galaxian_state::explorer(machine_config &config) // Sidam 10800
+{
sidam_bootleg_base(config);
- /* alternate memory map */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(explorer_map)
+ // alternate memory map
+ m_maincpu->set_addrmap(AS_PROGRAM, &galaxian_state::explorer_map);
/* 2nd CPU to drive sound */
- MCFG_DEVICE_ADD("audiocpu", Z80, 12_MHz_XTAL / 2 / 2 / 2) /* clock not verified */
- MCFG_DEVICE_PROGRAM_MAP(konami_sound_map)
- MCFG_DEVICE_IO_MAP(konami_sound_portmap)
+ Z80(config, m_audiocpu, 12_MHz_XTAL / 2 / 2 / 2); /* clock not verified */
+ m_audiocpu->set_addrmap(AS_PROGRAM, &galaxian_state::konami_sound_map);
+ m_audiocpu->set_addrmap(AS_IO, &galaxian_state::konami_sound_portmap);
GENERIC_LATCH_8(config, m_soundlatch);
@@ -6492,15 +6491,15 @@ MACHINE_CONFIG_START(galaxian_state::explorer) // Sidam 10800
AY8912(config, m_ay8910[1], 12_MHz_XTAL / 2 / 2 / 2); /* matches PCB, needs verification */
m_ay8910[0]->port_a_read_callback().set(FUNC(galaxian_state::konami_sound_timer_r));
m_ay8910[0]->add_route(ALL_OUTPUTS, "speaker", 0.25);
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(galaxian_state::takeoff) // Sidam 10900, with 1 x AY-3-8912
+void galaxian_state::takeoff(machine_config &config) // Sidam 10900, with 1 x AY-3-8912
+{
explorer(config);
/* 2nd CPU to drive sound */
- MCFG_DEVICE_MODIFY("audiocpu")
- MCFG_DEVICE_PROGRAM_MAP(takeoff_sound_map)
- MCFG_DEVICE_IO_MAP(takeoff_sound_portmap)
+ m_audiocpu->set_addrmap(AS_PROGRAM, &galaxian_state::takeoff_sound_map);
+ m_audiocpu->set_addrmap(AS_IO, &galaxian_state::takeoff_sound_portmap);
/* sound hardware */
config.device_remove("8910.0");
@@ -6509,19 +6508,20 @@ MACHINE_CONFIG_START(galaxian_state::takeoff) // Sidam 10900, with 1 x AY-3-8912
ay8912_device &ay8912(AY8912(config, "8912", XTAL(12'000'000) / 8));
ay8912.port_a_read_callback().set(FUNC(galaxian_state::explorer_sound_latch_r));
ay8912.add_route(ALL_OUTPUTS, "speaker", 0.25);
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(galaxian_state::amigo2) // marked "AMI", but similar to above
+void galaxian_state::amigo2(machine_config &config) // marked "AMI", but similar to above
+{
sidam_bootleg_base(config);
- /* alternate memory map */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(amigo2_map)
+ // alternate memory map
+ m_maincpu->set_addrmap(AS_PROGRAM, &galaxian_state::amigo2_map);
+
+ // 2nd CPU to drive sound
+ Z80(config, m_audiocpu, 12_MHz_XTAL / 2 / 2 / 2); // clock not verified
+ m_audiocpu->set_addrmap(AS_PROGRAM, &galaxian_state::konami_sound_map);
+ m_audiocpu->set_addrmap(AS_IO, &galaxian_state::konami_sound_portmap);
- /* 2nd CPU to drive sound */
- MCFG_DEVICE_ADD("audiocpu", Z80, 12_MHz_XTAL / 2 / 2 / 2) /* clock not verified */
- MCFG_DEVICE_PROGRAM_MAP(konami_sound_map)
- MCFG_DEVICE_IO_MAP(konami_sound_portmap)
GENERIC_LATCH_8(config, m_soundlatch);
/* sound hardware */
@@ -6531,17 +6531,17 @@ MACHINE_CONFIG_START(galaxian_state::amigo2) // marked "AMI", but similar to abo
m_ay8910[0]->add_route(ALL_OUTPUTS, "speaker", 0.25);
AY8910(config, m_ay8910[1], 12_MHz_XTAL / 2 / 2 / 2).add_route(ALL_OUTPUTS, "speaker", 0.25); /* matches PCB, needs verification */
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(galaxian_state::scorpion)
+void galaxian_state::scorpion(machine_config &config)
+{
scramble_base(config);
- /* alternate memory map */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(scorpion_map)
- MCFG_DEVICE_MODIFY("audiocpu")
- MCFG_DEVICE_PROGRAM_MAP(scorpion_sound_map)
- MCFG_DEVICE_IO_MAP(scorpion_sound_portmap)
+ // alternate memory map
+ m_maincpu->set_addrmap(AS_PROGRAM, &galaxian_state::scorpion_map);
+
+ m_audiocpu->set_addrmap(AS_PROGRAM, &galaxian_state::scorpion_sound_map);
+ m_audiocpu->set_addrmap(AS_IO, &galaxian_state::scorpion_sound_portmap);
m_ppi8255[1]->in_pc_callback().set(FUNC(galaxian_state::scorpion_protection_r));
m_ppi8255[1]->out_pc_callback().set(FUNC(galaxian_state::scorpion_protection_w));
@@ -6553,21 +6553,22 @@ MACHINE_CONFIG_START(galaxian_state::scorpion)
m_ay8910[2]->add_route(ALL_OUTPUTS, "speaker", 0.25);
DIGITALKER(config, m_digitalker, 4_MHz_XTAL).add_route(ALL_OUTPUTS, "speaker", 0.16);
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(galaxian_state::sfx)
+void galaxian_state::sfx(machine_config &config)
+{
scramble_base(config);
- MCFG_DEVICE_REMOVE("watchdog")
- /* alternate memory map */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(sfx_map)
+ config.device_remove("watchdog");
+
+ // alternate memory map
+ m_maincpu->set_addrmap(AS_PROGRAM, &galaxian_state::sfx_map);
/* 3rd CPU for the sample player */
- MCFG_DEVICE_ADD("audio2", Z80, KONAMI_SOUND_CLOCK/8)
- MCFG_DEVICE_PROGRAM_MAP(sfx_sample_map)
- MCFG_DEVICE_IO_MAP(sfx_sample_portmap)
+ Z80(config, m_audio2, KONAMI_SOUND_CLOCK/8);
+ m_audio2->set_addrmap(AS_PROGRAM, &galaxian_state::sfx_sample_map);
+ m_audio2->set_addrmap(AS_IO, &galaxian_state::sfx_sample_portmap);
I8255A(config, m_ppi8255[2]);
m_ppi8255[2]->in_pa_callback().set("soundlatch2", FUNC(generic_latch_8_device::read));
@@ -6579,43 +6580,43 @@ MACHINE_CONFIG_START(galaxian_state::sfx)
m_ay8910[1]->port_b_write_callback().set(FUNC(galaxian_state::sfx_sample_control_w));
/* DAC for the sample player */
- MCFG_DEVICE_ADD("dac", DAC_8BIT_R2R, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 1.0) // 16-pin IC (not identified by schematics)
- MCFG_DEVICE_ADD("vref", VOLTAGE_REGULATOR, 0) MCFG_VOLTAGE_REGULATOR_OUTPUT(5.0)
- MCFG_SOUND_ROUTE(0, "dac", 1.0, DAC_VREF_POS_INPUT) MCFG_SOUND_ROUTE(0, "dac", -1.0, DAC_VREF_NEG_INPUT)
-MACHINE_CONFIG_END
+ DAC_8BIT_R2R(config, m_dac, 0).add_route(ALL_OUTPUTS, "speaker", 1.0); // 16-pin IC (not identified by schematics)
+ voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref"));
+ vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT);
+ vref.add_route(0, "dac", -1.0, DAC_VREF_NEG_INPUT);
+}
-MACHINE_CONFIG_START(galaxian_state::monsterz)
+void galaxian_state::monsterz(machine_config &config)
+{
sfx(config);
- /* alternate memory map */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(monsterz_map)
+ // alternate memory map
+ m_maincpu->set_addrmap(AS_PROGRAM, &galaxian_state::monsterz_map);
- MCFG_DEVICE_MODIFY("ppi8255_1")
m_ppi8255[1]->out_pa_callback().set(FUNC(galaxian_state::monsterz_porta_1_w));
m_ppi8255[1]->out_pb_callback().set(FUNC(galaxian_state::monsterz_portb_1_w));
m_ppi8255[1]->out_pc_callback().set(FUNC(galaxian_state::monsterz_portc_1_w));
- /* there are likely other differences too, but those can wait until after protection is sorted out */
-
-MACHINE_CONFIG_END
+ // there are likely other differences too, but those can wait until after protection is sorted out
+}
-MACHINE_CONFIG_START(galaxian_state::scobra)
+void galaxian_state::scobra(machine_config &config)
+{
scramble_base(config);
- /* alternate memory map */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(scobra_map)
-MACHINE_CONFIG_END
-MACHINE_CONFIG_START(galaxian_state::anteatergg)
+ // alternate memory map
+ m_maincpu->set_addrmap(AS_PROGRAM, &galaxian_state::scobra_map);
+}
+
+void galaxian_state::anteatergg(machine_config &config)
+{
galaxian(config);
- /* alternate memory map */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(anteatergg_map)
-MACHINE_CONFIG_END
+ // alternate memory map
+ m_maincpu->set_addrmap(AS_PROGRAM, &galaxian_state::anteatergg_map);
+}
/*
@@ -6665,96 +6666,97 @@ Silkscreened label: "10041"
*/
-MACHINE_CONFIG_START(galaxian_state::quaak)
+void galaxian_state::quaak(machine_config &config)
+{
konami_base(config);
konami_sound_2x_ay8910(config);
m_ay8910[0]->port_b_read_callback().set(FUNC(galaxian_state::frogger_sound_timer_r));
- /* alternate memory map */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(scobra_map)
-MACHINE_CONFIG_END
+ // alternate memory map
+ m_maincpu->set_addrmap(AS_PROGRAM, &galaxian_state::scobra_map);
+}
-MACHINE_CONFIG_START(galaxian_state::froggeram)
+void galaxian_state::froggeram(machine_config &config)
+{
quaak(config);
- /* alternate memory map */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(froggeram_map)
-MACHINE_CONFIG_END
+ // alternate memory map
+ m_maincpu->set_addrmap(AS_PROGRAM, &galaxian_state::froggeram_map);
+}
-MACHINE_CONFIG_START(galaxian_state::turpins) // the ROMs came from a blister, so there aren't PCB infos available. Chip types and clocks are guessed.
+void galaxian_state::turpins(machine_config &config) // the ROMs came from a blister, so there aren't PCB infos available. Chip types and clocks are guessed.
+{
scobra(config);
- /* alternate memory map */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(turpins_map)
+ // alternate memory map
+ m_maincpu->set_addrmap(AS_PROGRAM, &galaxian_state::turpins_map);
- MCFG_DEVICE_MODIFY("audiocpu")
- MCFG_DEVICE_PROGRAM_MAP(turpins_sound_map)
-MACHINE_CONFIG_END
+ m_audiocpu->set_addrmap(AS_PROGRAM, &galaxian_state::turpins_sound_map);
+}
-MACHINE_CONFIG_START(galaxian_state::anteater)
+void galaxian_state::anteater(machine_config &config)
+{
scobra(config);
/* quiet down the sounds */
- MCFG_DEVICE_MODIFY("konami")
- MCFG_SOUND_ROUTES_RESET()
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 0.25)
-MACHINE_CONFIG_END
+ m_discrete->reset_routes();
+ m_discrete->add_route(ALL_OUTPUTS, "speaker", 0.25);
+}
-MACHINE_CONFIG_START(galaxian_state::anteateruk)
+void galaxian_state::anteateruk(machine_config &config)
+{
anteater(config);
- /* strange memory map, maybe a kind of protection */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(anteateruk_map)
-MACHINE_CONFIG_END
+ // strange memory map, maybe a kind of protection
+ m_maincpu->set_addrmap(AS_PROGRAM, &galaxian_state::anteateruk_map);
+}
-MACHINE_CONFIG_START(galaxian_state::anteaterg)
+void galaxian_state::anteaterg(machine_config &config)
+{
anteater(config);
- /* strange memory map, maybe a kind of protection */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(anteaterg_map)
-MACHINE_CONFIG_END
+ // strange memory map, maybe a kind of protection
+ m_maincpu->set_addrmap(AS_PROGRAM, &galaxian_state::anteaterg_map);
+}
-MACHINE_CONFIG_START(galaxian_state::moonwar)
+void galaxian_state::moonwar(machine_config &config)
+{
scobra(config);
m_ppi8255[0]->out_pc_callback().set(FUNC(galaxian_state::moonwar_port_select_w));
m_palette->set_init(FUNC(galaxian_state::moonwar_palette)); // bullets are less yellow
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(galaxian_state::fourplay)
+void galaxian_state::fourplay(machine_config &config)
+{
galaxian(config);
- /* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(fourplay_map)
+
+ // basic machine hardware
+ m_maincpu->set_addrmap(AS_PROGRAM, &galaxian_state::fourplay_map);
/* video hardware */
- MCFG_GFXDECODE_MODIFY("gfxdecode", gfx_gmgalax)
+ m_gfxdecode->set_info(gfx_gmgalax);
m_palette->set_entries(64);
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(galaxian_state::videight)
+void galaxian_state::videight(machine_config &config)
+{
galaxian(config);
- /* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(videight_map)
+ // basic machine hardware
+ m_maincpu->set_addrmap(AS_PROGRAM, &galaxian_state::videight_map);
/* video hardware */
- MCFG_GFXDECODE_MODIFY("gfxdecode", gfx_videight)
+ m_gfxdecode->set_info(gfx_videight);
m_palette->set_entries(8 * 32);
-MACHINE_CONFIG_END
+}
/*************************************
@@ -7033,6 +7035,12 @@ void galaxian_state::init_nolock()
space.unmap_write(0x6002, 0x6002, 0x7f8);
}
+// The first rom loads at 0800, then 1800, 2800?, 3800 and 4800.
+// Unfortunately the 3rd rom appears to be total garbage.
+// Each block of 256 bytes is in reverse order. Some code
+// is missing: 00xx, 4Axx, 10xx, 11xx at least. The game
+// uses 0200-05FF as RAM. It also accesses 6000, 6800, 700x, 7800.
+// Perhaps the missing code was stored in battery-backed RAM?
void galaxian_state::init_warofbugg()
{
uint8_t* romdata = memregion("maincpu")->base();
@@ -7040,9 +7048,10 @@ void galaxian_state::init_warofbugg()
uint8_t buf[0x4000];
memcpy(buf, romdata, 0x4000);
- // the rom data is at the very least, backwards, but there still seems to be missing code
- for (int i = 0; i < 0x4000; i++)
- romdata[i] = buf[i^0x7ff];
+ // unscramble each block
+ for (int i = 0; i < 0x40; i++)
+ for (int j = 0; j < 0x100; j++)
+ romdata[i*256+j] = buf[i*256+(j^0xff)];
init_nolock();
@@ -8458,11 +8467,11 @@ ROM_END
ROM_START( warofbugg )
ROM_REGION( 0x4000, "maincpu", 0 )
- ROM_LOAD( "wotbg-u-1.bin", 0x0000, 0x0800, CRC(f43ff0a8) SHA1(b87abeb8af9105fa8fba78f9a68363bd89066e7f) )
- ROM_LOAD( "wotbg-v-2.bin", 0x0800, 0x0800, CRC(eb7a028b) SHA1(8c822ae11d3cc04f749a7cd639d15b9fc830ab35) )
- ROM_LOAD( "wotbg-w-3.bin", 0x1000, 0x0800, CRC(693e0e50) SHA1(00b19969cee0f95bfb8251c2df133ff2c9ae3b00) )
- ROM_LOAD( "wotbg-y-4.bin", 0x1800, 0x0800, CRC(885d4982) SHA1(4aeaf514a9413a9cb9a971fd258c6cf46ca66fc4) )
- ROM_LOAD( "wotbg-z-5.bin", 0x2000, 0x0800, CRC(60041ef2) SHA1(cced5837a037ac5cd8fa6260d69d8e33de5ecd48) )
+ ROM_LOAD( "wotbg-u-1.bin", 0x0000, 0x0800, CRC(f43ff0a8) SHA1(b87abeb8af9105fa8fba78f9a68363bd89066e7f) ) // -> 0800
+ ROM_LOAD( "wotbg-v-2.bin", 0x0800, 0x0800, CRC(eb7a028b) SHA1(8c822ae11d3cc04f749a7cd639d15b9fc830ab35) ) // -> 1800
+ ROM_LOAD( "wotbg-w-3.bin", 0x1000, 0x0800, CRC(693e0e50) SHA1(00b19969cee0f95bfb8251c2df133ff2c9ae3b00) ) // -> ???? garbage
+ ROM_LOAD( "wotbg-y-4.bin", 0x1800, 0x0800, CRC(885d4982) SHA1(4aeaf514a9413a9cb9a971fd258c6cf46ca66fc4) ) // -> 3800
+ ROM_LOAD( "wotbg-z-5.bin", 0x2000, 0x0800, CRC(60041ef2) SHA1(cced5837a037ac5cd8fa6260d69d8e33de5ecd48) ) // -> 4800
ROM_REGION( 0x1000, "gfx1", 0 )
ROM_LOAD( "warofbug.1k", 0x0000, 0x0800, CRC(8100fa85) SHA1(06641c431cace36dec98b87555f62e72f3e53a31) )
@@ -11617,6 +11626,31 @@ ROM_START( scramblebb ) // no PCB, just eproms...
ROM_LOAD( "c01s.6e", 0x0000, 0x0020, BAD_DUMP CRC(4e3caeab) SHA1(a25083c3e36d28afdefe4af6e6d4f3155e303625) ) // need proper dump
ROM_END
+// Two PCBs, labeled MU-1A and MU-2A
+ROM_START( kamikazesp )
+ ROM_REGION( 0x10000, "maincpu", 0 )
+ ROM_LOAD( "4-b.2c", 0x0000, 0x0800, CRC(ab0eef23) SHA1(53ebb2011969c3eb8d60ce30f118e6627201d2a0) ) // 2716
+ ROM_LOAD( "5-b.2e", 0x0800, 0x0800, CRC(43cb40a4) SHA1(4e500f63a06865a5fd9a7d920eb866ea610a4d92) ) // 2716
+ ROM_LOAD( "6-b.2f", 0x1000, 0x0800, CRC(eec265ee) SHA1(29b6cf6b93220414eb58cddeba591dc8813c4935) ) // 2716
+ ROM_LOAD( "7-b.2h", 0x1800, 0x0800, CRC(dd380a22) SHA1(125e713a58cc5f2c1e38f67dad29f8c985ce5a8b) ) // 2716
+ ROM_LOAD( "8-b.2j", 0x2000, 0x0800, CRC(92980e72) SHA1(7e0605b461ace534f8f91028bb82968ecd907ca1) ) // 2716
+ ROM_LOAD( "9-b.2l", 0x2800, 0x0800, CRC(9fd96374) SHA1(c8456dd8a012353a023a2d3fa5d508e49c36ace8) ) // 2716
+ ROM_LOAD( "10-b.2m", 0x3000, 0x0800, CRC(88ac07a0) SHA1(c57061db5984b472039356bf84a050b5b66e3813) ) // 2716
+ ROM_LOAD( "11-b.2p", 0x3800, 0x0800, CRC(75232e09) SHA1(b0da201bf05c63031cdbe9f7059e3c710557f33d) ) // 2716
+
+ ROM_REGION( 0x10000, "audiocpu", 0 )
+ ROM_LOAD( "1-a.5c", 0x0000, 0x0800, CRC(be037cf6) SHA1(f28e5ead496e70beaada24775aa58bd5d75f2d25) ) // 2716
+ ROM_LOAD( "2-a.5d", 0x0800, 0x0800, CRC(31bb79e4) SHA1(9f5370f7b1911c6a9f2c82ef2bab3f14cb0e9657) ) // 2716
+ ROM_LOAD( "3-a.5e", 0x1000, 0x0800, CRC(ba2fa933) SHA1(1f976d8595706730e29f93027e7ab4620075c078) ) // 2716
+
+ ROM_REGION( 0x1000, "gfx1", 0 )
+ ROM_LOAD( "12-b.5f", 0x0000, 0x0800, CRC(4708845b) SHA1(a8b1ad19a95a9d35050a2ab7194cc96fc5afcdc9) ) // MB8516, dumped as 2716
+ ROM_LOAD( "13-b.5h", 0x0800, 0x0800, CRC(11fd2887) SHA1(69844e48bb4d372cac7ae83c953df573c7ecbb7f) ) // 2716
+
+ ROM_REGION( 0x0020, "proms", 0 )
+ ROM_LOAD( "prom.6e", 0x0000, 0x0020, CRC(4e3caeab) SHA1(a25083c3e36d28afdefe4af6e6d4f3155e303625) ) // MB7051, dumped as 82S123
+ROM_END
+
ROM_START( strfbomb )
ROM_REGION( 0x10000, "maincpu", 0 )
ROM_LOAD( "1.2c", 0x0000, 0x0800, CRC(b102aaa0) SHA1(00560da7a2ded6afcdc1d46e12cc3c795654639a) )
@@ -12096,6 +12130,30 @@ ROM_START( scobrag )
ROM_END
+// Super Cobra bootleg (Cocamatic). PCB by "GGI Corp."
+ROM_START( scobraggi )
+ ROM_REGION( 0x10000, "maincpu", 0 )
+ ROM_LOAD( "2c_b.bin", 0x0000, 0x1000, CRC(04ffab61) SHA1(302ae8b224d98c405aadd363623eddf88bdc3f0e) ) // 2732
+ ROM_LOAD( "2e_b.bin", 0x1000, 0x1000, CRC(4e29d35f) SHA1(f48358f30e886c65b0e38220a44d3c2d09a31fee) ) // 2732
+ ROM_LOAD( "2f_b.bin", 0x2000, 0x1000, CRC(9dee81cc) SHA1(e842ad873cd5370f2c5d23334a320ebc448bfcdc) ) // 2732
+ ROM_LOAD( "2h_b.bin", 0x3000, 0x1000, CRC(99dee0c6) SHA1(1f026a40f59fe33cb2ac54a7712d6d259db3ecc8) ) // 2732
+ ROM_LOAD( "2j_b.bin", 0x4000, 0x1000, CRC(db7fb865) SHA1(94f1382dae4f3c12d177fd74b3493e91989b4654) ) // 2732
+ ROM_LOAD( "2l_b.bin", 0x5000, 0x1000, CRC(5825d73b) SHA1(482128d723986fdf586f9ac53a0139b687cb0b58) ) // 2732
+
+ ROM_REGION( 0x10000, "audiocpu", 0 )
+ ROM_LOAD( "1_13_a.bin", 0x0000, 0x0800, CRC(d4346959) SHA1(5eab4505beb69a5bdd88b23db60e1193371250cf) ) // MB8516 readed as 2716
+ ROM_LOAD( "2_13_a.bin", 0x0800, 0x0800, CRC(cc025d95) SHA1(2b0784c4d05c466e0b7648f16e14f34393d792c3) ) // 2716
+ ROM_LOAD( "3_13_a.bin", 0x1000, 0x0800, CRC(1628c53f) SHA1(ec79a73e4a2d7373454b227dd7eff255f1cc60cc) ) // MB8516 readed as 2716
+
+ ROM_REGION( 0x1000, "gfx1", 0 )
+ ROM_LOAD( "5h_b.bin", 0x0000, 0x0800, CRC(64d113b4) SHA1(7b439bb74d5ecc792e0ca8964bcca8c6b7a51262) ) // 2716
+ ROM_LOAD( "5f_b.bin", 0x0800, 0x0800, CRC(a96316d3) SHA1(9de0e94932e91dc34aea7c81880bde6a486d103b) ) // 2716
+
+ ROM_REGION( 0x0020, "proms", 0 )
+ ROM_LOAD( "6e_b.bin", 0x0000, 0x0020, CRC(4e3caeab) SHA1(a25083c3e36d28afdefe4af6e6d4f3155e303625) ) // MB7051 readed as N82S123
+ROM_END
+
+
ROM_START( suprheli )
/* this is a bootleg of Super Cobra */
ROM_REGION( 0x10000, "maincpu", 0 )
@@ -12534,7 +12592,7 @@ GAME( 1980, galaxrcgg, galaxian, galaxian, galaxrf, galaxian_state, init_
GAME( 1979, moonaln, galaxian, galaxian, superg, galaxian_state, init_galaxian, ROT90, "Namco / Nichibutsu (Karateco license?)", "Moon Alien", MACHINE_SUPPORTS_SAVE ) // or bootleg?
GAME( 1979, galapx, galaxian, galaxian, superg, galaxian_state, init_galaxian, ROT90, "hack", "Galaxian Part X (moonaln hack)", MACHINE_SUPPORTS_SAVE )
// like above but does have the energy bar, also GFX changed to planes.
-GAME( 1979, kamikazp, galaxian, galaxian, kamikazp, galaxian_state, init_galaxian, ROT90, "bootleg (Potomac Games)", "Kamikaze (Potomac Games)", MACHINE_SUPPORTS_SAVE )
+GAME( 1979, kamikazp, galaxian, galaxian, kamikazp, galaxian_state, init_galaxian, ROT90, "bootleg (Potomac Games)", "Kamikaze (Potomac Games, bootleg of Galaxian)", MACHINE_SUPPORTS_SAVE )
// this has the tiles to display the energy bar, but use the flag gfx for the 'linescroll effect' title screen, also doesn't work due to bad rom.
GAME( 1980, supergx, galaxian, galaxian, superg, galaxian_state, init_galaxian, ROT90, "Namco / Nichibutsu", "Super GX", MACHINE_NOT_WORKING | MACHINE_WRONG_COLORS | MACHINE_SUPPORTS_SAVE )
// these have the energy bar, and the tiles needed to display a less corrupt 'linescroll effect' title, but don't display one
@@ -12638,9 +12696,9 @@ GAME( 1980, mooncrstu, mooncrst, mooncrst, mooncrst, galaxian_state, init_
GAME( 1980, mooncrsto, mooncrst, mooncrst, mooncrsa, galaxian_state, init_mooncrst, ROT90, "Nichibutsu", "Moon Cresta (Nichibutsu, old rev)", MACHINE_SUPPORTS_SAVE )
GAME( 1980, mooncrstg, mooncrst, mooncrst, mooncrsg, galaxian_state, init_mooncrsu, ROT90, "Nichibutsu (Gremlin license)", "Moon Cresta (Gremlin)", MACHINE_SUPPORTS_SAVE )
/* straight Moon Cresta ripoffs on basic mooncrst hardware */
-GAME( 1980, eagle, mooncrst, mooncrst, mooncrsa, galaxian_state, init_mooncrsu, ROT90, "Nichibutsu (Centuri license)", "Eagle (set 1)", MACHINE_SUPPORTS_SAVE ) // or bootleg?
-GAME( 1980, eagle2, mooncrst, mooncrst, eagle2, galaxian_state, init_mooncrsu, ROT90, "Nichibutsu (Centuri license)", "Eagle (set 2)", MACHINE_SUPPORTS_SAVE ) // "
-GAME( 1980, eagle3, mooncrst, mooncrst, mooncrsa, galaxian_state, init_mooncrsu, ROT90, "Nichibutsu (Centuri license)", "Eagle (set 3)", MACHINE_SUPPORTS_SAVE ) // "
+GAME( 1980, eagle, mooncrst, eagle, mooncrsa, galaxian_state, init_mooncrsu, ROT90, "Nichibutsu (Centuri license)", "Eagle (set 1)", MACHINE_SUPPORTS_SAVE ) // or bootleg?
+GAME( 1980, eagle2, mooncrst, eagle, eagle2, galaxian_state, init_mooncrsu, ROT90, "Nichibutsu (Centuri license)", "Eagle (set 2)", MACHINE_SUPPORTS_SAVE ) // "
+GAME( 1980, eagle3, mooncrst, eagle, mooncrsa, galaxian_state, init_mooncrsu, ROT90, "Nichibutsu (Centuri license)", "Eagle (set 3)", MACHINE_SUPPORTS_SAVE ) // "
GAME( 1980, mooncrsb, mooncrst, mooncrst, mooncrsa, galaxian_state, init_mooncrsu, ROT90, "bootleg", "Moon Cresta (bootleg set 1)", MACHINE_SUPPORTS_SAVE )
GAME( 1980, mooncrs2, mooncrst, mooncrst, mooncrsa, galaxian_state, init_mooncrsu, ROT90, "bootleg", "Moon Cresta (bootleg set 2)", MACHINE_SUPPORTS_SAVE )
GAME( 1980, mooncrs3, mooncrst, mooncrst, mooncrst, galaxian_state, init_mooncrsu, ROT90, "bootleg (Jeutel)", "Moon Cresta (bootleg set 3)", MACHINE_SUPPORTS_SAVE ) /* Jeutel bootleg, similar to bootleg set 2 */
@@ -12728,12 +12786,9 @@ GAME( 1981, quaak, frogger, quaak, frogger, galaxian_state, init_
GAME( 1981, froggeram, frogger, froggeram, froggeram, galaxian_state, init_quaak, ROT90, "bootleg", "Frogger (bootleg on Amigo? hardware)", MACHINE_SUPPORTS_SAVE ) // meant to be Amigo hardware, but maybe a different bootleg than the one we have?
-/*
- Turtles based hardware
-
- CPU/Video Board: KT-4108-2
- Sound Board: KT-4108-1
-*/
+// Turtles based hardware
+// CPU/Video Board: KT-4108-2
+// Sound Board: KT-4108-1
GAME( 1981, turtles, 0, turtles, turtles, galaxian_state, init_turtles, ROT90, "Konami (Stern Electronics license)", "Turtles", MACHINE_SUPPORTS_SAVE )
GAME( 1981, turpin, turtles, turtles, turpin, galaxian_state, init_turtles, ROT90, "Konami (Sega license)", "Turpin", MACHINE_SUPPORTS_SAVE )
GAME( 1981, 600, turtles, turtles, turtles, galaxian_state, init_turtles, ROT90, "Konami", "600", MACHINE_SUPPORTS_SAVE )
@@ -12757,21 +12812,22 @@ GAME( 1980, theend, 0, theend, theend, galaxian_state, init_
GAME( 1980, theends, theend, theend, theend, galaxian_state, init_theend, ROT90, "Konami (Stern Electronics license)", "The End (Stern Electronics)", MACHINE_SUPPORTS_SAVE )
GAME( 1981, takeoff, theend, takeoff, explorer, galaxian_state, init_explorer, ROT90, "bootleg (Sidam)", "Take Off (bootleg of The End)", MACHINE_WRONG_COLORS | MACHINE_SUPPORTS_SAVE ) // colors likely need bitswap<8> somewhere; needs different sound timer. reference: https://www.youtube.com/watch?v=iPYX3yJORTE
-GAME( 1981, scramble, 0, scramble, scramble, galaxian_state, init_scramble, ROT90, "Konami", "Scramble", MACHINE_SUPPORTS_SAVE )
-GAME( 1981, scrambles, scramble, scramble, scramble, galaxian_state, init_scramble, ROT90, "Konami (Stern Electronics license)", "Scramble (Stern Electronics set 1)", MACHINE_SUPPORTS_SAVE )
-GAME( 1981, scrambles2, scramble, scramble, scramble, galaxian_state, init_scramble, ROT90, "Konami (Stern Electronics license)", "Scramble (Stern Electronics set 2)", MACHINE_SUPPORTS_SAVE )
-GAME( 1981, strfbomb, scramble, scramble, strfbomb, galaxian_state, init_scramble, ROT90, "bootleg (Omni)", "Strafe Bomb (bootleg of Scramble)", MACHINE_SUPPORTS_SAVE )
-GAME( 1981, explorer, scramble, explorer, explorer, galaxian_state, init_explorer, ROT90, "bootleg (Sidam)", "Explorer (bootleg of Scramble)", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE ) // needs different sound timer
-GAME( 1981, scramblebf, scramble, scramble, scramble, galaxian_state, init_scramble, ROT90, "bootleg (Karateco)", "Scramble (Karateco, French bootleg)", MACHINE_SUPPORTS_SAVE )
-GAME( 1981, scrambp, scramble, scramble, scramble, galaxian_state, init_scramble, ROT90, "bootleg (Billport S.A.)", "Impacto (Billport S.A., Spanish bootleg of Scramble)", MACHINE_SUPPORTS_SAVE ) // similar to the Karateco set above
-GAME( 1981, scramce, scramble, scramble, scramble, galaxian_state, init_scramble, ROT90, "bootleg (Centromatic S.A.)", "Scramble (Centromatic S.A., Spanish bootleg)", MACHINE_SUPPORTS_SAVE ) // similar to above
-GAME( 1981, scrampt, scramble, scramble, scramble, galaxian_state, init_scramble, ROT90, "bootleg (Petaco S.A.)", "Scramble (Petaco S.A., Spanish bootleg)", MACHINE_SUPPORTS_SAVE ) // ^^
-GAME( 1981, scramrf, scramble, scramble, scramble, galaxian_state, init_scramble, ROT90, "bootleg (Recreativos Franco)", "Scramble (Recreativos Franco, Spanish bootleg)", MACHINE_SUPPORTS_SAVE )
-GAME( 1981, offensiv, scramble, scramble, scramble, galaxian_state, init_scramble, ROT90, "bootleg (Video Dens)", "Offensive (Spanish bootleg of Scramble)", MACHINE_SUPPORTS_SAVE )
-GAME( 1981, ncentury, scramble, scramble, scramble, galaxian_state, init_scramble, ROT90, "bootleg (Petaco S.A.)", "New Century (Spanish bootleg of Scramble)", MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE ) // irq isn't enabled correctly
-GAME( 1981, scrammr, scramble, scramble, scramble, galaxian_state, init_scramble, ROT90, "bootleg (Model Racing)", "Scramble (Model Racing, Italian bootleg)", MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE ) // irq isn't enabled correctly
-GAME( 1981, scramblebb, scramble, scramble, scramble, galaxian_state, init_scramble, ROT90, "bootleg?", "Scramble (bootleg?)", MACHINE_SUPPORTS_SAVE )
-GAME( 198?, bomber, scramble, scramble, scramble, galaxian_state, init_scramble, ROT90, "bootleg (Alca)", "Bomber (bootleg of Scramble)", MACHINE_SUPPORTS_SAVE )
+GAME( 1981, scramble, 0, scramble, scramble, galaxian_state, init_scramble, ROT90, "Konami", "Scramble", MACHINE_SUPPORTS_SAVE )
+GAME( 1981, scrambles, scramble, scramble, scramble, galaxian_state, init_scramble, ROT90, "Konami (Stern Electronics license)", "Scramble (Stern Electronics set 1)", MACHINE_SUPPORTS_SAVE )
+GAME( 1981, scrambles2, scramble, scramble, scramble, galaxian_state, init_scramble, ROT90, "Konami (Stern Electronics license)", "Scramble (Stern Electronics set 2)", MACHINE_SUPPORTS_SAVE )
+GAME( 1981, strfbomb, scramble, scramble, strfbomb, galaxian_state, init_scramble, ROT90, "bootleg (Omni)", "Strafe Bomb (bootleg of Scramble)", MACHINE_SUPPORTS_SAVE )
+GAME( 1981, explorer, scramble, explorer, explorer, galaxian_state, init_explorer, ROT90, "bootleg (Sidam)", "Explorer (bootleg of Scramble)", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE ) // needs different sound timer
+GAME( 1981, scramblebf, scramble, scramble, scramble, galaxian_state, init_scramble, ROT90, "bootleg (Karateco)", "Scramble (Karateco, French bootleg)", MACHINE_SUPPORTS_SAVE )
+GAME( 1981, scrambp, scramble, scramble, scramble, galaxian_state, init_scramble, ROT90, "bootleg (Billport S.A.)", "Impacto (Billport S.A., Spanish bootleg of Scramble)", MACHINE_SUPPORTS_SAVE ) // similar to the Karateco set above
+GAME( 1981, scramce, scramble, scramble, scramble, galaxian_state, init_scramble, ROT90, "bootleg (Centromatic S.A.)", "Scramble (Centromatic S.A., Spanish bootleg)", MACHINE_SUPPORTS_SAVE ) // similar to above
+GAME( 1981, scrampt, scramble, scramble, scramble, galaxian_state, init_scramble, ROT90, "bootleg (Petaco S.A.)", "Scramble (Petaco S.A., Spanish bootleg)", MACHINE_SUPPORTS_SAVE ) // ^^
+GAME( 1981, scramrf, scramble, scramble, scramble, galaxian_state, init_scramble, ROT90, "bootleg (Recreativos Franco)", "Scramble (Recreativos Franco, Spanish bootleg)", MACHINE_SUPPORTS_SAVE )
+GAME( 1981, offensiv, scramble, scramble, scramble, galaxian_state, init_scramble, ROT90, "bootleg (Video Dens)", "Offensive (Spanish bootleg of Scramble)", MACHINE_SUPPORTS_SAVE )
+GAME( 1981, ncentury, scramble, scramble, scramble, galaxian_state, init_scramble, ROT90, "bootleg (Petaco S.A.)", "New Century (Spanish bootleg of Scramble)", MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE ) // irq isn't enabled correctly
+GAME( 1981, scrammr, scramble, scramble, scramble, galaxian_state, init_scramble, ROT90, "bootleg (Model Racing)", "Scramble (Model Racing, Italian bootleg)", MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE ) // irq isn't enabled correctly
+GAME( 1981, scramblebb, scramble, scramble, scramble, galaxian_state, init_scramble, ROT90, "bootleg?", "Scramble (bootleg?)", MACHINE_SUPPORTS_SAVE )
+GAME( 1981, kamikazesp, scramble, scramble, scramble, galaxian_state, init_scramble, ROT90, "bootleg (Euromatic S.A.)", "Kamikaze (Euromatic S.A., Spanish bootleg of Scramble)", MACHINE_SUPPORTS_SAVE )
+GAME( 198?, bomber, scramble, scramble, scramble, galaxian_state, init_scramble, ROT90, "bootleg (Alca)", "Bomber (bootleg of Scramble)", MACHINE_SUPPORTS_SAVE )
GAME( 1981, atlantis, 0, theend, atlantis, galaxian_state, init_atlantis, ROT90, "Comsoft", "Battle of Atlantis (set 1)", MACHINE_SUPPORTS_SAVE )
GAME( 1981, atlantis2, atlantis, theend, atlantis, galaxian_state, init_atlantis, ROT90, "Comsoft", "Battle of Atlantis (set 2)", MACHINE_SUPPORTS_SAVE )
@@ -12798,13 +12854,14 @@ GAME( 1982, monsterz, 0, monsterz, sfx, galaxian_state, init_
CPU/Video Board: A969
Sound Board: A970
*/
-GAME( 1981, scobra, 0, scobra, scobra, galaxian_state, init_scobra, ROT90, "Konami", "Super Cobra", MACHINE_SUPPORTS_SAVE )
-GAME( 1981, scobrase, scobra, scobra, scobra, galaxian_state, init_scobra, ROT90, "Konami (Sega license)", "Super Cobra (Sega)", MACHINE_SUPPORTS_SAVE )
-GAME( 1981, scobras, scobra, scobra, scobras, galaxian_state, init_scobra, ROT90, "Konami (Stern Electronics license)", "Super Cobra (Stern Electronics)", MACHINE_SUPPORTS_SAVE )
+GAME( 1981, scobra, 0, scobra, scobra, galaxian_state, init_scobra, ROT90, "Konami", "Super Cobra", MACHINE_SUPPORTS_SAVE )
+GAME( 1981, scobrase, scobra, scobra, scobra, galaxian_state, init_scobra, ROT90, "Konami (Sega license)", "Super Cobra (Sega)", MACHINE_SUPPORTS_SAVE )
+GAME( 1981, scobras, scobra, scobra, scobras, galaxian_state, init_scobra, ROT90, "Konami (Stern Electronics license)", "Super Cobra (Stern Electronics)", MACHINE_SUPPORTS_SAVE )
GAME( 1981, scobrae, scobra, scobra, scobras, galaxian_state, init_scobrae, ROT90, "Konami (Stern Electronics license)", "Super Cobra (Stern Electronics) (encrypted, KONATEC XC-103SS CPU)", MACHINE_SUPPORTS_SAVE )
-GAME( 1981, scobrab, scobra, scobra, scobras, galaxian_state, init_scobra, ROT90, "bootleg (Karateco)", "Super Cobra (bootleg, set 1)", MACHINE_SUPPORTS_SAVE )
-GAME( 1981, scobrag, scobra, scobra, scobras, galaxian_state, init_scobra, ROT90, "bootleg (A.V.G. by Zaccaria)", "Super Cobra (bootleg, set 2)", MACHINE_WRONG_COLORS | MACHINE_SUPPORTS_SAVE ) // uses the scramble color PROM
-GAME( 1981, suprheli, scobra, scobra, scobras, galaxian_state, init_scobra, ROT90, "bootleg", "Super Heli (Super Cobra bootleg)", MACHINE_SUPPORTS_SAVE )
+GAME( 1981, scobrab, scobra, scobra, scobras, galaxian_state, init_scobra, ROT90, "bootleg (Karateco)", "Super Cobra (bootleg, set 1)", MACHINE_SUPPORTS_SAVE )
+GAME( 1981, scobrag, scobra, scobra, scobras, galaxian_state, init_scobra, ROT90, "bootleg (A.V.G. by Zaccaria)", "Super Cobra (bootleg, set 2)", MACHINE_WRONG_COLORS | MACHINE_SUPPORTS_SAVE ) // uses the scramble color PROM
+GAME( 1981, scobraggi, scobra, scobra, scobras, galaxian_state, init_scobra, ROT90, "bootleg (Cocamatic)", "Super Cobra (bootleg, set 3)", MACHINE_WRONG_COLORS | MACHINE_SUPPORTS_SAVE ) // uses the scramble color PROM
+GAME( 1981, suprheli, scobra, scobra, scobras, galaxian_state, init_scobra, ROT90, "bootleg", "Super Heli (Super Cobra bootleg)", MACHINE_SUPPORTS_SAVE )
GAME( 1981, moonwar, 0, moonwar, moonwar, galaxian_state, init_moonwar, ROT90, "Stern Electronics", "Moonwar", MACHINE_SUPPORTS_SAVE )
GAME( 1981, moonwara, moonwar, moonwar, moonwara, galaxian_state, init_moonwar, ROT90, "Stern Electronics", "Moonwar (older)", MACHINE_SUPPORTS_SAVE )
diff --git a/src/mame/drivers/galaxold.cpp b/src/mame/drivers/galaxold.cpp
index 7679ae3cdbc..45ed0e73615 100644
--- a/src/mame/drivers/galaxold.cpp
+++ b/src/mame/drivers/galaxold.cpp
@@ -588,7 +588,7 @@ void galaxold_state::dkongjrmc_map(address_map &map)
}
-void galaxold_state::tazzmang(address_map &map)
+void galaxold_state::tazzmang_map(address_map &map)
{
map(0x0000, 0x5fff).rom();
map(0x7000, 0x7000).portr("DSW0"); /* mirror */
@@ -614,7 +614,7 @@ void galaxold_state::tazzmang(address_map &map)
}
-void galaxold_state::bongo(address_map &map)
+void galaxold_state::bongo_map(address_map &map)
{
map(0x0000, 0x5fff).rom();
map(0x8000, 0x83ff).ram();
@@ -668,7 +668,7 @@ void galaxold_state::ozon1_io_map(address_map &map)
}
-void galaxold_state::hunchbkg(address_map &map)
+void galaxold_state::hunchbkg_map(address_map &map)
{
map(0x0000, 0x0fff).rom();
map(0x1480, 0x14bf).mirror(0x6000).ram().w(FUNC(galaxold_state::galaxold_attributesram_w)).share("attributesram");
@@ -694,7 +694,7 @@ void galaxold_state::hunchbkg(address_map &map)
}
/* hunchbkg style */
-void galaxold_state::spcwarp(address_map &map)
+void galaxold_state::spcwarp_map(address_map &map)
{
map(0x0000, 0x0fff).rom();
map(0x1480, 0x14bf).mirror(0x6000).ram().w(FUNC(galaxold_state::galaxold_attributesram_w)).share("attributesram");
@@ -780,7 +780,7 @@ void galaxold_state::racknrol_map(address_map &map)
void galaxold_state::racknrol_io(address_map &map)
{
- map(0x1d, 0x1d).w("snsnd", FUNC(sn76489a_device::command_w));
+ map(0x1d, 0x1d).w("snsnd", FUNC(sn76489a_device::write));
// AM_RANGE(0x1e, 0x1e) AM_WRITENOP
// AM_RANGE(0x1f, 0x1f) AM_WRITENOP
map(0x20, 0x3f).w(FUNC(galaxold_state::racknrol_tiles_bank_w)).share("racknrol_tbank");
@@ -808,7 +808,7 @@ void galaxold_state::hexpoola_io(address_map &map)
void galaxold_state::hexpoola_data(address_map &map)
{
- map(S2650_DATA_PORT, S2650_DATA_PORT).r(FUNC(galaxold_state::hexpoola_data_port_r)).w("snsnd", FUNC(sn76496_device::command_w));
+ map(S2650_DATA_PORT, S2650_DATA_PORT).r(FUNC(galaxold_state::hexpoola_data_port_r)).w("snsnd", FUNC(sn76496_device::write));
}
READ8_MEMBER(galaxold_state::bullsdrtg_data_port_r)
@@ -834,7 +834,7 @@ READ8_MEMBER(galaxold_state::bullsdrtg_data_port_r)
void galaxold_state::bullsdrtg_data_map(address_map &map)
{
- map(S2650_DATA_PORT, S2650_DATA_PORT).r(FUNC(galaxold_state::bullsdrtg_data_port_r)).w("snsnd", FUNC(sn76496_device::command_w));
+ map(S2650_DATA_PORT, S2650_DATA_PORT).r(FUNC(galaxold_state::bullsdrtg_data_port_r)).w("snsnd", FUNC(sn76496_device::write));
}
/* Lives Dips are spread across two input ports */
@@ -2253,11 +2253,11 @@ static GFXDECODE_START( gfx_4in1 )
GFXDECODE_END
-MACHINE_CONFIG_START(galaxold_state::galaxold_base)
-
+void galaxold_state::galaxold_base(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, PIXEL_CLOCK/2) /* 3.072 MHz */
- MCFG_DEVICE_PROGRAM_MAP(galaxold_map)
+ Z80(config, m_maincpu, PIXEL_CLOCK/2); /* 3.072 MHz */
+ m_maincpu->set_addrmap(AS_PROGRAM, &galaxold_state::galaxold_map);
MCFG_MACHINE_RESET_OVERRIDE(galaxold_state,galaxold)
@@ -2267,7 +2267,7 @@ MACHINE_CONFIG_START(galaxold_state::galaxold_base)
TTL7474(config, m_7474_9m_2, 0);
m_7474_9m_2->comp_output_cb().set(FUNC(galaxold_state::galaxold_7474_9m_2_q_callback));
- MCFG_TIMER_DRIVER_ADD("int_timer", galaxold_state, galaxold_interrupt_timer)
+ TIMER(config, "int_timer").configure_generic(FUNC(galaxold_state::galaxold_interrupt_timer));
WATCHDOG_TIMER(config, "watchdog");
@@ -2275,58 +2275,56 @@ MACHINE_CONFIG_START(galaxold_state::galaxold_base)
GFXDECODE(config, m_gfxdecode, m_palette, gfx_galaxian);
PALETTE(config, m_palette, FUNC(galaxold_state::galaxold_palette), 32+2+64); // 32 for the characters, 2 for the bullets, 64 for the stars
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_RAW_PARAMS(PIXEL_CLOCK, HTOTAL, HBEND, HBSTART, VTOTAL, VBEND, VBSTART)
- MCFG_SCREEN_UPDATE_DRIVER(galaxold_state, screen_update_galaxold)
- MCFG_SCREEN_PALETTE(m_palette)
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_raw(PIXEL_CLOCK, HTOTAL, HBEND, HBSTART, VTOTAL, VBEND, VBSTART);
+ m_screen->set_screen_update(FUNC(galaxold_state::screen_update_galaxold));
+ m_screen->set_palette(m_palette);
MCFG_VIDEO_START_OVERRIDE(galaxold_state,galaxold)
/* sound hardware */
SPEAKER(config, "speaker").front_center();
-MACHINE_CONFIG_END
-
-MACHINE_CONFIG_START(galaxold_state::galaxian_audio)
- MCFG_DEVICE_ADD("cust", GALAXIAN, 0)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 0.4)
+}
- MCFG_DEVICE_ADD(GAL_AUDIO, DISCRETE, galaxian_discrete)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 1.0)
-MACHINE_CONFIG_END
+void galaxold_state::galaxian_audio(machine_config &config)
+{
+ GALAXIAN(config, "cust", 0).add_route(ALL_OUTPUTS, "speaker", 0.4);
-MACHINE_CONFIG_START(galaxold_state::mooncrst_audio)
- MCFG_DEVICE_ADD("cust", GALAXIAN, 0)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 0.4)
+ DISCRETE(config, GAL_AUDIO, galaxian_discrete).add_route(ALL_OUTPUTS, "speaker", 1.0);
+}
- MCFG_DEVICE_ADD(GAL_AUDIO, DISCRETE, mooncrst_discrete)
+void galaxold_state::mooncrst_audio(machine_config &config)
+{
+ GALAXIAN(config, "cust", 0).add_route(ALL_OUTPUTS, "speaker", 0.4);
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 1.0)
-MACHINE_CONFIG_END
+ DISCRETE(config, GAL_AUDIO, mooncrst_discrete).add_route(ALL_OUTPUTS, "speaker", 1.0);
+}
-MACHINE_CONFIG_START(galaxold_state::galaxian)
+void galaxold_state::galaxian(machine_config &config)
+{
galaxold_base(config);
/* basic machine hardware */
/* sound hardware */
galaxian_audio(config);
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(galaxold_state::mooncrst)
+void galaxold_state::mooncrst(machine_config &config)
+{
galaxold_base(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(mooncrst_map)
+ m_maincpu->set_addrmap(AS_PROGRAM, &galaxold_state::mooncrst_map);
/* video hardware */
MCFG_VIDEO_START_OVERRIDE(galaxold_state,mooncrst)
/* sound hardware */
mooncrst_audio(config);
-MACHINE_CONFIG_END
+}
// 'Videotron'
// this is a 'cartridge' based system, taking plug-in game boards.
@@ -2334,84 +2332,85 @@ MACHINE_CONFIG_END
// but neither of the games we have (froggerv and hustlerb3) make use of either. There are a number
// of unpopulated positions on the game board which presumably can be populated with code for the
// 2nd Z80.
-MACHINE_CONFIG_START(galaxold_state::videotron)
+void galaxold_state::videotron(machine_config &config)
+{
galaxian(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(hustlerb3_map)
+ m_maincpu->set_addrmap(AS_PROGRAM, &galaxold_state::hustlerb3_map);
/* video hardware */
MCFG_VIDEO_START_OVERRIDE(galaxold_state,mooncrst)
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(galaxold_state::porter)
+void galaxold_state::porter(machine_config &config)
+{
mooncrst(config);
/* video hardware */
MCFG_VIDEO_START_OVERRIDE(galaxold_state, pisces)
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(galaxold_state::scramblb)
+void galaxold_state::scramblb(machine_config &config)
+{
galaxian(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(scramblb_map)
+ m_maincpu->set_addrmap(AS_PROGRAM, &galaxold_state::scramblb_map);
/* video hardware */
m_palette->set_entries(32+2+64+1); // 32 for the characters, 2 for the bullets, 64 for the stars, 1 for background
m_palette->set_init(FUNC(galaxold_state::scrambold_palette));
MCFG_VIDEO_START_OVERRIDE(galaxold_state,scrambold)
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(galaxold_state::scramb2)
+void galaxold_state::scramb2(machine_config &config)
+{
galaxian(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(scramb2_map)
+ m_maincpu->set_addrmap(AS_PROGRAM, &galaxold_state::scramb2_map);
/* video hardware */
m_palette->set_entries(32+2+64+1); // 32 for the characters, 2 for the bullets, 64 for the stars, 1 for background
m_palette->set_init(FUNC(galaxold_state::scrambold_palette));
MCFG_VIDEO_START_OVERRIDE(galaxold_state,scrambold)
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(galaxold_state::scramb3)
+void galaxold_state::scramb3(machine_config &config)
+{
scramb2(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(scramb3_map)
-MACHINE_CONFIG_END
+ m_maincpu->set_addrmap(AS_PROGRAM, &galaxold_state::scramb3_map);
+}
-MACHINE_CONFIG_START(galaxold_state::scrambler)
+void galaxold_state::scrambler(machine_config &config)
+{
galaxian(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(scrambler_map)
+ m_maincpu->set_addrmap(AS_PROGRAM, &galaxold_state::scrambler_map);
/* video hardware */
m_palette->set_entries(32+2+64+1); // 32 for the characters, 2 for the bullets, 64 for the stars, 1 for background
m_palette->set_init(FUNC(galaxold_state::scrambold_palette));
MCFG_VIDEO_START_OVERRIDE(galaxold_state,scrambold)
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(galaxold_state::guttang)
+void galaxold_state::guttang(machine_config &config)
+{
galaxian(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(guttang_map)
+ m_maincpu->set_addrmap(AS_PROGRAM, &galaxold_state::guttang_map);
/* video hardware */
m_palette->set_entries(32+2+64+1); // 32 for the characters, 2 for the bullets, 64 for the stars, 1 for background
@@ -2419,84 +2418,83 @@ MACHINE_CONFIG_START(galaxold_state::guttang)
// m_palette->set_init(FUNC(galaxold_state::scrambold_palette));
MCFG_VIDEO_START_OVERRIDE(galaxold_state,mooncrst)
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(galaxold_state::_4in1)
+void galaxold_state::_4in1(machine_config &config)
+{
galaxian(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(_4in1_map)
+ m_maincpu->set_addrmap(AS_PROGRAM, &galaxold_state::_4in1_map);
/* video hardware */
- MCFG_GFXDECODE_MODIFY("gfxdecode", gfx_4in1)
+ m_gfxdecode->set_info(gfx_4in1);
MCFG_VIDEO_START_OVERRIDE(galaxold_state,pisces)
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(galaxold_state::bagmanmc)
+void galaxold_state::bagmanmc(machine_config &config)
+{
mooncrst(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(bagmanmc_map)
+ m_maincpu->set_addrmap(AS_PROGRAM, &galaxold_state::bagmanmc_map);
MCFG_MACHINE_RESET_OVERRIDE(galaxold_state, devilfsg )
/* video hardware */
MCFG_VIDEO_START_OVERRIDE(galaxold_state, bagmanmc)
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(galaxold_state::dkongjrm)
+void galaxold_state::dkongjrm(machine_config &config)
+{
mooncrst(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(dkongjrm_map)
+ m_maincpu->set_addrmap(AS_PROGRAM, &galaxold_state::dkongjrm_map);
/* video hardware */
MCFG_VIDEO_START_OVERRIDE(galaxold_state,dkongjrm)
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(galaxold_state::dkongjrmc)
+void galaxold_state::dkongjrmc(machine_config &config)
+{
mooncrst(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(dkongjrmc_map)
+ m_maincpu->set_addrmap(AS_PROGRAM, &galaxold_state::dkongjrmc_map);
MCFG_VIDEO_START_OVERRIDE(galaxold_state,dkongjrmc)
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(galaxold_state::rockclim)
+void galaxold_state::rockclim(machine_config &config)
+{
mooncrst(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(rockclim_map)
- MCFG_GFXDECODE_MODIFY("gfxdecode", gfx_rockclim)
+ m_maincpu->set_addrmap(AS_PROGRAM, &galaxold_state::rockclim_map);
+ m_gfxdecode->set_info(gfx_rockclim);
/* video hardware */
MCFG_VIDEO_START_OVERRIDE(galaxold_state,rockclim)
m_palette->set_entries(64+64+2); // 64 colors only, but still uses bullets so we need to keep the palette big
m_palette->set_init(FUNC(galaxold_state::rockclim_palette));
- MCFG_SCREEN_MODIFY("screen")
- MCFG_SCREEN_SIZE(64*8, 32*8)
-MACHINE_CONFIG_END
+ m_screen->set_size(64*8, 32*8);
+}
-MACHINE_CONFIG_START(galaxold_state::ozon1)
+void galaxold_state::ozon1(machine_config &config)
+{
galaxold_base(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(ozon1_map)
- MCFG_DEVICE_IO_MAP(ozon1_io_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", galaxold_state, nmi_line_pulse)
+ m_maincpu->set_addrmap(AS_PROGRAM, &galaxold_state::ozon1_map);
+ m_maincpu->set_addrmap(AS_IO, &galaxold_state::ozon1_io_map);
+ m_maincpu->set_vblank_int("screen", FUNC(galaxold_state::nmi_line_pulse));
MCFG_MACHINE_RESET_REMOVE()
@@ -2506,11 +2504,11 @@ MACHINE_CONFIG_START(galaxold_state::ozon1)
MCFG_VIDEO_START_OVERRIDE(galaxold_state,ozon1)
AY8910(config, "aysnd", PIXEL_CLOCK/4).add_route(ALL_OUTPUTS, "speaker", 0.5);
-MACHINE_CONFIG_END
-
+}
-MACHINE_CONFIG_START(galaxold_state::drivfrcg)
+void galaxold_state::drivfrcg(machine_config &config)
+{
/* basic machine hardware */
s2650_device &maincpu(S2650(config, m_maincpu, MASTER_CLOCK/6));
maincpu.set_addrmap(AS_PROGRAM, &galaxold_state::drivfrcg_program);
@@ -2519,13 +2517,13 @@ MACHINE_CONFIG_START(galaxold_state::drivfrcg)
maincpu.sense_handler().set("screen", FUNC(screen_device::vblank));
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(16000.0/132/2)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */)
- MCFG_SCREEN_SIZE(32*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(galaxold_state, screen_update_galaxold)
- MCFG_SCREEN_PALETTE(m_palette)
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_refresh_hz(16000.0/132/2);
+ m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(2500) /* not accurate */);
+ m_screen->set_size(32*8, 32*8);
+ m_screen->set_visarea(0*8, 32*8-1, 2*8, 30*8-1);
+ m_screen->set_screen_update(FUNC(galaxold_state::screen_update_galaxold));
+ m_screen->set_palette(m_palette);
PALETTE(config, m_palette, FUNC(galaxold_state::rockclim_palette), 64);
@@ -2537,38 +2535,38 @@ MACHINE_CONFIG_START(galaxold_state::drivfrcg)
SPEAKER(config, "speaker").front_center();
galaxian_audio(config);
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(galaxold_state::bongo)
+void galaxold_state::bongo(machine_config &config)
+{
galaxold_base(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(bongo)
- MCFG_DEVICE_IO_MAP(bongo_io)
+ m_maincpu->set_addrmap(AS_PROGRAM, &galaxold_state::bongo_map);
+ m_maincpu->set_addrmap(AS_IO, &galaxold_state::bongo_io);
/* video hardware */
MCFG_VIDEO_START_OVERRIDE(galaxold_state,bongo)
- MCFG_SCREEN_MODIFY("screen")
- MCFG_SCREEN_UPDATE_DRIVER(galaxold_state, screen_update_galaxold)
+
+ m_screen->set_screen_update(FUNC(galaxold_state::screen_update_galaxold));
/* sound hardware */
ay8910_device &aysnd(AY8910(config, "aysnd", PIXEL_CLOCK/4));
aysnd.port_a_read_callback().set_ioport("DSW1");
aysnd.add_route(ALL_OUTPUTS, "speaker", 0.5);
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(galaxold_state::hunchbkg)
+void galaxold_state::hunchbkg(machine_config &config)
+{
galaxold_base(config);
/* basic machine hardware */
- MCFG_DEVICE_REPLACE("maincpu", S2650, PIXEL_CLOCK / 4)
-
- MCFG_DEVICE_PROGRAM_MAP(hunchbkg)
- MCFG_DEVICE_DATA_MAP(hunchbkg_data)
- MCFG_DEVICE_IRQ_ACKNOWLEDGE_DRIVER(galaxold_state,hunchbkg_irq_callback)
+ S2650(config.replace(), m_maincpu, PIXEL_CLOCK / 4);
+ m_maincpu->set_addrmap(AS_PROGRAM, &galaxold_state::hunchbkg_map);
+ m_maincpu->set_addrmap(AS_DATA, &galaxold_state::hunchbkg_data);
+ m_maincpu->set_irq_acknowledge_callback(FUNC(galaxold_state::hunchbkg_irq_callback));
/* the nmi line seems to be inverted on the cpu plugin board */
m_7474_9m_1->comp_output_cb().set_inputline("maincpu", S2650_SENSE_LINE);
@@ -2576,115 +2574,113 @@ MACHINE_CONFIG_START(galaxold_state::hunchbkg)
MCFG_MACHINE_RESET_OVERRIDE(galaxold_state,hunchbkg)
galaxian_audio(config);
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(galaxold_state::spcwarp)
+void galaxold_state::spcwarp(machine_config &config)
+{
hunchbkg(config);
/* hunchbkg, but with a different memory map */
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(spcwarp)
-MACHINE_CONFIG_END
+ m_maincpu->set_addrmap(AS_PROGRAM, &galaxold_state::spcwarp_map);
+}
-MACHINE_CONFIG_START(galaxold_state::tazzmang)
+void galaxold_state::tazzmang(machine_config &config)
+{
galaxian(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(tazzmang)
-MACHINE_CONFIG_END
-
+ m_maincpu->set_addrmap(AS_PROGRAM, &galaxold_state::tazzmang_map);
+}
-MACHINE_CONFIG_START(galaxold_state::racknrol)
+void galaxold_state::racknrol(machine_config &config)
+{
/* basic machine hardware */
s2650_device &maincpu(S2650(config, m_maincpu, PIXEL_CLOCK/2));
maincpu.set_addrmap(AS_PROGRAM, &galaxold_state::racknrol_map);
maincpu.set_addrmap(AS_IO, &galaxold_state::racknrol_io);
maincpu.sense_handler().set(m_screen, FUNC(screen_device::vblank)).invert(); // ???
- device = &maincpu; // FIXME: kill the following line - convert to a screen vblank callback
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", galaxold_state, hunchbks_vh_interrupt)
+ // FIXME: kill the following line - convert to a screen vblank callback
+ maincpu.set_vblank_int("screen", FUNC(galaxold_state::hunchbks_vh_interrupt));
/* video hardware */
GFXDECODE(config, m_gfxdecode, m_palette, gfx_galaxian);
PALETTE(config, m_palette, FUNC(galaxold_state::rockclim_palette), 32);
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_RAW_PARAMS(PIXEL_CLOCK, HTOTAL, HBEND, HBSTART, VTOTAL, VBEND, VBSTART)
- MCFG_SCREEN_UPDATE_DRIVER(galaxold_state, screen_update_galaxold)
- MCFG_SCREEN_PALETTE(m_palette)
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_raw(PIXEL_CLOCK, HTOTAL, HBEND, HBSTART, VTOTAL, VBEND, VBSTART);
+ m_screen->set_screen_update(FUNC(galaxold_state::screen_update_galaxold));
+ m_screen->set_palette(m_palette);
MCFG_VIDEO_START_OVERRIDE(galaxold_state,racknrol)
/* sound hardware */
SPEAKER(config, "speaker").front_center();
- MCFG_DEVICE_ADD("snsnd", SN76489A, PIXEL_CLOCK/2) // SN76489AN
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 1.0)
-MACHINE_CONFIG_END
-
+ SN76489A(config, "snsnd", PIXEL_CLOCK/2).add_route(ALL_OUTPUTS, "speaker", 1.0); // SN76489AN
+}
-MACHINE_CONFIG_START(galaxold_state::hexpoola)
+void galaxold_state::hexpoola(machine_config &config)
+{
/* basic machine hardware */
s2650_device &maincpu(S2650(config, m_maincpu, PIXEL_CLOCK/2));
maincpu.set_addrmap(AS_PROGRAM, &galaxold_state::racknrol_map);
maincpu.set_addrmap(AS_IO, &galaxold_state::hexpoola_io);
maincpu.set_addrmap(AS_DATA, &galaxold_state::hexpoola_data);
maincpu.sense_handler().set(m_screen, FUNC(screen_device::vblank)).invert(); // ???
- device = &maincpu; // FIXME: kill the following line - convert to a screen vblank callback
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", galaxold_state, hunchbks_vh_interrupt)
+ // FIXME: kill the following line - convert to a screen vblank callback
+ maincpu.set_vblank_int("screen", FUNC(galaxold_state::hunchbks_vh_interrupt));
GFXDECODE(config, m_gfxdecode, m_palette, gfx_galaxian);
PALETTE(config, m_palette, FUNC(galaxold_state::rockclim_palette), 32);
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_RAW_PARAMS(PIXEL_CLOCK, HTOTAL, HBEND, HBSTART, VTOTAL, VBEND, VBSTART)
- MCFG_SCREEN_UPDATE_DRIVER(galaxold_state, screen_update_galaxold)
- MCFG_SCREEN_PALETTE(m_palette)
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_raw(PIXEL_CLOCK, HTOTAL, HBEND, HBSTART, VTOTAL, VBEND, VBSTART);
+ m_screen->set_screen_update(FUNC(galaxold_state::screen_update_galaxold));
+ m_screen->set_palette(m_palette);
MCFG_VIDEO_START_OVERRIDE(galaxold_state,racknrol)
/* sound hardware */
SPEAKER(config, "speaker").front_center();
- MCFG_DEVICE_ADD("snsnd", SN76496, PIXEL_CLOCK/2)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 1.0)
-MACHINE_CONFIG_END
+ SN76496(config, "snsnd", PIXEL_CLOCK/2).add_route(ALL_OUTPUTS, "speaker", 1.0);
+}
-MACHINE_CONFIG_START(galaxold_state::ckongg)
+void galaxold_state::ckongg(machine_config &config)
+{
galaxian(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(ckongg_map)
+ m_maincpu->set_addrmap(AS_PROGRAM, &galaxold_state::ckongg_map);
- MCFG_GFXDECODE_MODIFY("gfxdecode", gfx_gmgalax)
+ m_gfxdecode->set_info(gfx_gmgalax);
MCFG_VIDEO_START_OVERRIDE(galaxold_state,ckongs)
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(galaxold_state::ckongmc)
+void galaxold_state::ckongmc(machine_config &config)
+{
mooncrst(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(ckongmc_map)
+ m_maincpu->set_addrmap(AS_PROGRAM, &galaxold_state::ckongmc_map);
- MCFG_GFXDECODE_MODIFY("gfxdecode", gfx_gmgalax)
+ m_gfxdecode->set_info(gfx_gmgalax);
MCFG_VIDEO_START_OVERRIDE(galaxold_state,ckongs)
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(galaxold_state::bullsdrtg)
+void galaxold_state::bullsdrtg(machine_config &config)
+{
hexpoola(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_DATA_MAP(bullsdrtg_data_map)
-MACHINE_CONFIG_END
+ m_maincpu->set_addrmap(AS_DATA, &galaxold_state::bullsdrtg_data_map);
+}
/***************************************************************************
diff --git a/src/mame/drivers/galaxy.cpp b/src/mame/drivers/galaxy.cpp
index 1c81aed7705..22cf4cd0f99 100644
--- a/src/mame/drivers/galaxy.cpp
+++ b/src/mame/drivers/galaxy.cpp
@@ -178,37 +178,36 @@ GFXDECODE_END
MACHINE_CONFIG_START(galaxy_state::galaxy)
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, XTAL / 2)
- MCFG_DEVICE_PROGRAM_MAP(galaxy_mem)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", galaxy_state, galaxy_interrupt)
- MCFG_DEVICE_IRQ_ACKNOWLEDGE_DRIVER(galaxy_state,galaxy_irq_callback)
-
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(50)
- MCFG_SCREEN_PALETTE("palette")
+ Z80(config, m_maincpu, XTAL / 2);
+ m_maincpu->set_addrmap(AS_PROGRAM, &galaxy_state::galaxy_mem);
+ m_maincpu->set_vblank_int("screen", FUNC(galaxy_state::galaxy_interrupt));
+ m_maincpu->set_irq_acknowledge_callback(FUNC(galaxy_state::galaxy_irq_callback));
MCFG_MACHINE_RESET_OVERRIDE(galaxy_state, galaxy )
/* video hardware */
- MCFG_SCREEN_SIZE(384, 212)
- MCFG_SCREEN_VISIBLE_AREA(0, 384-1, 0, 208-1)
- MCFG_SCREEN_UPDATE_DRIVER(galaxy_state, screen_update_galaxy)
-
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_galaxy)
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_refresh_hz(50);
+ m_screen->set_palette("palette");
+ m_screen->set_size(384, 212);
+ m_screen->set_visarea(0, 384-1, 0, 208-1);
+ m_screen->set_screen_update(FUNC(galaxy_state::screen_update_galaxy));
+
+ GFXDECODE(config, "gfxdecode", "palette", gfx_galaxy);
PALETTE(config, "palette", palette_device::MONOCHROME);
/* snapshot */
- MCFG_SNAPSHOT_ADD("snapshot", galaxy_state, galaxy, "gal", 0)
+ MCFG_SNAPSHOT_ADD("snapshot", galaxy_state, galaxy, "gal")
SPEAKER(config, "mono").front_center();
- WAVE(config, "wave", "cassette").add_route(ALL_OUTPUTS, "mono", 0.25);
+ WAVE(config, "wave", m_cassette).add_route(ALL_OUTPUTS, "mono", 0.25);
- MCFG_CASSETTE_ADD( "cassette" )
- MCFG_CASSETTE_FORMATS(gtp_cassette_formats)
- MCFG_CASSETTE_DEFAULT_STATE(CASSETTE_STOPPED | CASSETTE_SPEAKER_ENABLED | CASSETTE_MOTOR_ENABLED)
- MCFG_CASSETTE_INTERFACE("galaxy_cass")
+ CASSETTE(config, m_cassette);
+ m_cassette->set_formats(gtp_cassette_formats);
+ m_cassette->set_default_state(CASSETTE_STOPPED | CASSETTE_SPEAKER_ENABLED | CASSETTE_MOTOR_ENABLED);
+ m_cassette->set_interface("galaxy_cass");
- MCFG_SOFTWARE_LIST_ADD("cass_list","galaxy")
+ SOFTWARE_LIST(config, "cass_list").set_original("galaxy");
/* internal ram */
RAM(config, RAM_TAG).set_default_size("6K").set_extra_options("2K,22K,38K,54K");
@@ -216,40 +215,39 @@ MACHINE_CONFIG_END
MACHINE_CONFIG_START(galaxy_state::galaxyp)
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, XTAL / 2)
- MCFG_DEVICE_PROGRAM_MAP(galaxyp_mem)
- MCFG_DEVICE_IO_MAP(galaxyp_io)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", galaxy_state, galaxy_interrupt)
- MCFG_DEVICE_IRQ_ACKNOWLEDGE_DRIVER(galaxy_state,galaxy_irq_callback)
-
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(50)
- MCFG_SCREEN_PALETTE("palette")
+ Z80(config, m_maincpu, XTAL / 2);
+ m_maincpu->set_addrmap(AS_PROGRAM, &galaxy_state::galaxyp_mem);
+ m_maincpu->set_addrmap(AS_IO, &galaxy_state::galaxyp_io);
+ m_maincpu->set_vblank_int("screen", FUNC(galaxy_state::galaxy_interrupt));
+ m_maincpu->set_irq_acknowledge_callback(FUNC(galaxy_state::galaxy_irq_callback));
MCFG_MACHINE_RESET_OVERRIDE(galaxy_state, galaxyp )
/* video hardware */
- MCFG_SCREEN_SIZE(384, 208)
- MCFG_SCREEN_VISIBLE_AREA(0, 384-1, 0, 208-1)
- MCFG_SCREEN_UPDATE_DRIVER(galaxy_state, screen_update_galaxy)
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_refresh_hz(50);
+ m_screen->set_palette("palette");
+ m_screen->set_size(384, 208);
+ m_screen->set_visarea(0, 384-1, 0, 208-1);
+ m_screen->set_screen_update(FUNC(galaxy_state::screen_update_galaxy));
PALETTE(config, "palette", palette_device::MONOCHROME);
/* snapshot */
- MCFG_SNAPSHOT_ADD("snapshot", galaxy_state, galaxy, "gal", 0)
+ MCFG_SNAPSHOT_ADD("snapshot", galaxy_state, galaxy, "gal")
/* sound hardware */
SPEAKER(config, "mono").front_center();
AY8910(config, "ay8910", XTAL/4); // FIXME: really no output routes for this AY?
WAVE(config, "wave", "cassette").add_route(ALL_OUTPUTS, "mono", 0.25);
- MCFG_CASSETTE_ADD( "cassette" )
- MCFG_CASSETTE_FORMATS(gtp_cassette_formats)
- MCFG_CASSETTE_DEFAULT_STATE(CASSETTE_STOPPED | CASSETTE_SPEAKER_ENABLED | CASSETTE_MOTOR_ENABLED)
- MCFG_CASSETTE_INTERFACE("galaxy_cass")
+ CASSETTE(config, m_cassette);
+ m_cassette->set_formats(gtp_cassette_formats);
+ m_cassette->set_default_state(CASSETTE_STOPPED | CASSETTE_SPEAKER_ENABLED | CASSETTE_MOTOR_ENABLED);
+ m_cassette->set_interface("galaxy_cass");
- MCFG_SOFTWARE_LIST_ADD("cass_list","galaxy")
+ SOFTWARE_LIST(config, "cass_list").set_original("galaxy");
/* internal ram */
RAM(config, RAM_TAG).set_default_size("38K");
diff --git a/src/mame/drivers/galeb.cpp b/src/mame/drivers/galeb.cpp
index cc7cd4cf938..7073a7f9860 100644
--- a/src/mame/drivers/galeb.cpp
+++ b/src/mame/drivers/galeb.cpp
@@ -164,31 +164,31 @@ static INPUT_PORTS_START( galeb )
INPUT_PORTS_END
/* Machine driver */
-MACHINE_CONFIG_START(galeb_state::galeb)
+void galeb_state::galeb(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M6502, 1000000)
- MCFG_DEVICE_PROGRAM_MAP(galeb_mem)
+ M6502(config, m_maincpu, 1000000);
+ m_maincpu->set_addrmap(AS_PROGRAM, &galeb_state::galeb_mem);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(50)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */
- MCFG_SCREEN_SIZE(48*8, 16*8)
- MCFG_SCREEN_VISIBLE_AREA(0, 48*8-1, 0, 16*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(galeb_state, screen_update_galeb)
- MCFG_SCREEN_PALETTE(m_palette)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(50);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */
+ screen.set_size(48*8, 16*8);
+ screen.set_visarea(0, 48*8-1, 0, 16*8-1);
+ screen.set_screen_update(FUNC(galeb_state::screen_update_galeb));
+ screen.set_palette(m_palette);
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_galeb )
+ GFXDECODE(config, m_gfxdecode, m_palette, gfx_galeb);
PALETTE(config, m_palette, palette_device::MONOCHROME);
-
/* audio hardware */
SPEAKER(config, "speaker").front_center();
- MCFG_DEVICE_ADD("dac", DAC_1BIT, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 0.0625) // unknown DAC
- MCFG_DEVICE_ADD("vref", VOLTAGE_REGULATOR, 0) MCFG_VOLTAGE_REGULATOR_OUTPUT(5.0)
- MCFG_SOUND_ROUTE(0, "dac", 1.0, DAC_VREF_POS_INPUT)
-MACHINE_CONFIG_END
+ DAC_1BIT(config, m_dac, 0).add_route(ALL_OUTPUTS, "speaker", 0.0625); // unknown DAC
+ voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref", 0));
+ vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT);
+}
/* ROM definition */
ROM_START( galeb )
diff --git a/src/mame/drivers/galgames.cpp b/src/mame/drivers/galgames.cpp
index 58b8c7f7aaf..f584bc10fe7 100644
--- a/src/mame/drivers/galgames.cpp
+++ b/src/mame/drivers/galgames.cpp
@@ -67,13 +67,16 @@ class galgames_cart_device : public device_t, public device_rom_interface
{
public:
// construction/destruction
- galgames_cart_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) :
- galgames_cart_device(mconfig, GALGAMES_CART, tag, owner, clock)
- { }
+
+ galgames_cart_device(const machine_config &mconfig, const char *tag, device_t *owner, uint8_t cart)
+ : galgames_cart_device(mconfig, GALGAMES_CART, tag, owner, (uint32_t)0)
+ {
+ set_cart(cart);
+ }
// static configuration
- static void static_set_cart(device_t &device, uint8_t cart) { downcast<galgames_cart_device &>(device).m_cart = cart; }
- static void static_set_pic_bits(device_t &device, int clk, int in, int out, int dis) { downcast<galgames_cart_device &>(device).set_pic_bits(clk, in, out, dis); }
+ void set_cart(uint8_t cart) { m_cart = cart; }
+ void set_pic_bits(int clk, int in, int out, int dis);
// ROM
DECLARE_READ16_MEMBER(rom_r) { return read_word(offset*2); }
@@ -122,7 +125,6 @@ protected:
uint8_t m_pic_iobits, m_pic_data, m_pic_data_rdy, m_pic_data_bit, m_pic_data_clk;
uint8_t m_pic_clk_mask, m_pic_in_mask, m_pic_out_mask, m_pic_dis_mask;
- void set_pic_bits(int clk, int in, int out, int dis);
void log_cart_comm(const char *text, uint8_t data);
void pic_comm_reset();
};
@@ -130,17 +132,6 @@ protected:
// device type definition
DEFINE_DEVICE_TYPE(GALGAMES_CART, galgames_cart_device, "starpak_cart", "Galaxy Games StarPak Cartridge")
-#define MCFG_GALGAMES_CART_INDEX(_cart) \
- galgames_cart_device::static_set_cart(*device, _cart);
-
-#define MCFG_GALGAMES_PIC_BITS(_clk, _in, _out, _dis) \
- galgames_cart_device::static_set_pic_bits(*device, _clk, _in, _out, _dis);
-
-#define MCFG_GALGAMES_EMPTY_CART_ADD(_tag, _cart) \
- MCFG_DEVICE_ADD(_tag, GALGAMES_CART, 0) \
- MCFG_GALGAMES_CART_INDEX(_cart)
-
-
// BIOS "cart"
@@ -148,9 +139,12 @@ class galgames_bios_cart_device : public galgames_cart_device
{
public:
// construction/destruction
- galgames_bios_cart_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) :
- galgames_cart_device(mconfig, GALGAMES_BIOS_CART, tag, owner, clock)
- { }
+ galgames_bios_cart_device(const machine_config &mconfig, const char *tag, device_t *owner, uint8_t cart)
+ : galgames_cart_device(mconfig, GALGAMES_BIOS_CART, tag, owner, (uint32_t)0)
+ {
+ set_cart(cart);
+ }
+
protected:
// device-level overrides
virtual void device_add_mconfig(machine_config &config) override;
@@ -163,11 +157,6 @@ void galgames_bios_cart_device::device_add_mconfig(machine_config &config)
EEPROM_93C76_8BIT(config, "eeprom");
}
-#define MCFG_GALGAMES_BIOS_CART_ADD(_tag, _cart) \
- MCFG_DEVICE_ADD(_tag, GALGAMES_BIOS_CART, 0) \
- MCFG_GALGAMES_CART_INDEX(_cart)
-
-
// STARPAK2 cart
@@ -175,9 +164,13 @@ class galgames_starpak2_cart_device : public galgames_cart_device
{
public:
// construction/destruction
- galgames_starpak2_cart_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) :
- galgames_cart_device(mconfig, GALGAMES_STARPAK2_CART, tag, owner, clock)
- { }
+ galgames_starpak2_cart_device(const machine_config &mconfig, const char *tag, device_t *owner, uint8_t cart)
+ : galgames_cart_device(mconfig, GALGAMES_STARPAK2_CART, tag, owner, (uint32_t)0)
+ {
+ set_cart(cart);
+ set_pic_bits(5, 4, 2, 1);
+ }
+
protected:
// device-level overrides
virtual void device_add_mconfig(machine_config &config) override;
@@ -194,12 +187,6 @@ void galgames_starpak2_cart_device::device_add_mconfig(machine_config &config)
EEPROM_93C76_8BIT(config, "eeprom");
}
-#define MCFG_GALGAMES_STARPAK2_CART_ADD(_tag, _cart) \
- MCFG_DEVICE_ADD(_tag, GALGAMES_STARPAK2_CART, 0) \
- MCFG_GALGAMES_CART_INDEX(_cart) \
- MCFG_GALGAMES_PIC_BITS(5, 4, 2, 1)
-
-
// STARPAK3 cart
@@ -207,9 +194,13 @@ class galgames_starpak3_cart_device : public galgames_cart_device
{
public:
// construction/destruction
- galgames_starpak3_cart_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) :
- galgames_cart_device(mconfig, GALGAMES_STARPAK3_CART, tag, owner, clock)
- { }
+ galgames_starpak3_cart_device(const machine_config &mconfig, const char *tag, device_t *owner, uint8_t cart)
+ : galgames_cart_device(mconfig, GALGAMES_STARPAK3_CART, tag, owner, (uint32_t)0)
+ {
+ set_cart(cart);
+ set_pic_bits(0, 2, 3, 4);
+ }
+
protected:
// device-level overrides
virtual void device_add_mconfig(machine_config &config) override;
@@ -227,12 +218,6 @@ void galgames_starpak3_cart_device::device_add_mconfig(machine_config &config)
EEPROM_93C76_8BIT(config, "eeprom");
}
-#define MCFG_GALGAMES_STARPAK3_CART_ADD(_tag, _cart) \
- MCFG_DEVICE_ADD(_tag, GALGAMES_STARPAK3_CART, 0) \
- MCFG_GALGAMES_CART_INDEX(_cart) \
- MCFG_GALGAMES_PIC_BITS(0, 2, 3, 4)
-
-
/***************************************************************************
@@ -315,9 +300,6 @@ device_memory_interface::space_config_vector galgames_slot_device::memory_space_
// device type definition
DEFINE_DEVICE_TYPE(GALGAMES_SLOT, galgames_slot_device, "starpak_slot", "Galaxy Games Slot")
-#define MCFG_GALGAMES_SLOT_ADD(_tag) \
- MCFG_DEVICE_ADD(_tag, GALGAMES_SLOT, 0)
-
// CART implementation
galgames_cart_device::galgames_cart_device(
@@ -981,60 +963,63 @@ int galgames_compute_addr(uint16_t reg_low, uint16_t reg_mid, uint16_t reg_high)
return reg_low | (reg_mid << 16);
}
-MACHINE_CONFIG_START(galgames_state::galgames_base)
- MCFG_DEVICE_ADD("maincpu", M68000, XTAL(24'000'000) / 2)
- MCFG_DEVICE_PROGRAM_MAP(galgames_map)
- MCFG_TIMER_DRIVER_ADD_SCANLINE("scantimer", galgames_state, scanline_interrupt, "screen", 0, 1)
+void galgames_state::galgames_base(machine_config &config)
+{
+ M68000(config, m_maincpu, XTAL(24'000'000) / 2);
+ m_maincpu->set_addrmap(AS_PROGRAM, &galgames_state::galgames_map);
+ TIMER(config, "scantimer").configure_scanline(FUNC(galgames_state::scanline_interrupt), "screen", 0, 1);
WATCHDOG_TIMER(config, "watchdog");
- MCFG_GALGAMES_SLOT_ADD("slot")
- MCFG_GALGAMES_BIOS_CART_ADD( "cart0", 0)
+ GALGAMES_SLOT(config, m_slot, 0);
+ GALGAMES_BIOS_CART(config, "cart0", 0);
// video hardware
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(400, 256)
- MCFG_SCREEN_VISIBLE_AREA(0, 400-1, 0, 256-1)
- MCFG_SCREEN_UPDATE_DRIVER(galgames_state, screen_update)
- MCFG_SCREEN_PALETTE(m_palette)
-
- MCFG_CESBLIT_ADD("blitter", "screen", XTAL(24'000'000))
- MCFG_CESBLIT_MAP(blitter_map)
- MCFG_CESBLIT_COMPUTE_ADDR(galgames_compute_addr)
- MCFG_CESBLIT_IRQ_CB(WRITELINE(*this, galgames_state, blitter_irq_callback))
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_refresh_hz(60);
+ m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ m_screen->set_size(400, 256);
+ m_screen->set_visarea(0, 400-1, 0, 256-1);
+ m_screen->set_screen_update(FUNC(galgames_state::screen_update));
+ m_screen->set_palette(m_palette);
+
+ CESBLIT(config, m_blitter, XTAL(24'000'000), m_screen);
+ m_blitter->set_addrmap(AS_PROGRAM, &galgames_state::blitter_map);
+ m_blitter->set_compute_addr(galgames_compute_addr);
+ m_blitter->irq_callback().set(FUNC(galgames_state::blitter_irq_callback));
PALETTE(config, m_palette).set_format(palette_device::xBGR_555, 0x1000); // only 0x100 used
// sound hardware
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("oki", OKIM6295, XTAL(24'000'000) / 16, okim6295_device::PIN7_HIGH) // clock frequency & pin 7 not verified (voices in galgame4 seem ok)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
-MACHINE_CONFIG_END
+ OKIM6295(config, m_oki, XTAL(24'000'000) / 16, okim6295_device::PIN7_HIGH).add_route(ALL_OUTPUTS, "mono", 1.0); // clock frequency & pin 7 not verified (voices in galgame4 seem ok)
+}
-MACHINE_CONFIG_START(galgames_state::galgbios)
+void galgames_state::galgbios(machine_config &config)
+{
galgames_base(config);
- MCFG_GALGAMES_EMPTY_CART_ADD("cart1", 1)
- MCFG_GALGAMES_EMPTY_CART_ADD("cart2", 2)
- MCFG_GALGAMES_EMPTY_CART_ADD("cart3", 3)
- MCFG_GALGAMES_EMPTY_CART_ADD("cart4", 4)
-MACHINE_CONFIG_END
+ GALGAMES_CART(config, "cart1", 1);
+ GALGAMES_CART(config, "cart2", 2);
+ GALGAMES_CART(config, "cart3", 3);
+ GALGAMES_CART(config, "cart4", 4);
+}
-MACHINE_CONFIG_START(galgames_state::galgame2)
+void galgames_state::galgame2(machine_config &config)
+{
galgames_base(config);
- MCFG_GALGAMES_STARPAK2_CART_ADD("cart1", 1)
- MCFG_GALGAMES_EMPTY_CART_ADD("cart2", 2)
- MCFG_GALGAMES_EMPTY_CART_ADD("cart3", 3)
- MCFG_GALGAMES_EMPTY_CART_ADD("cart4", 4)
-MACHINE_CONFIG_END
+ GALGAMES_STARPAK2_CART(config, "cart1", 1);
+ GALGAMES_CART(config, "cart2", 2);
+ GALGAMES_CART(config, "cart3", 3);
+ GALGAMES_CART(config, "cart4", 4);
+}
-MACHINE_CONFIG_START(galgames_state::galgame3)
+void galgames_state::galgame3(machine_config &config)
+{
galgames_base(config);
- MCFG_GALGAMES_STARPAK3_CART_ADD("cart1", 1)
- MCFG_GALGAMES_EMPTY_CART_ADD("cart2", 2)
- MCFG_GALGAMES_EMPTY_CART_ADD("cart3", 3)
- MCFG_GALGAMES_EMPTY_CART_ADD("cart4", 4)
-MACHINE_CONFIG_END
+ GALGAMES_STARPAK3_CART(config, "cart1", 1);
+ GALGAMES_CART(config, "cart2", 2);
+ GALGAMES_CART(config, "cart3", 3);
+ GALGAMES_CART(config, "cart4", 4);
+}
/***************************************************************************
diff --git a/src/mame/drivers/galivan.cpp b/src/mame/drivers/galivan.cpp
index 75a20127ed5..1bcf2709313 100644
--- a/src/mame/drivers/galivan.cpp
+++ b/src/mame/drivers/galivan.cpp
@@ -429,33 +429,33 @@ MACHINE_RESET_MEMBER(galivan_state,ninjemak)
m_ninjemak_dispdisable = 0;
}
-MACHINE_CONFIG_START(galivan_state::galivan)
-
+void galivan_state::galivan(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, XTAL(12'000'000)/2) /* 6 MHz? */
- MCFG_DEVICE_PROGRAM_MAP(galivan_map)
- MCFG_DEVICE_IO_MAP(io_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", galivan_state, irq0_line_hold)
+ Z80(config, m_maincpu, XTAL(12'000'000)/2); /* 6 MHz? */
+ m_maincpu->set_addrmap(AS_PROGRAM, &galivan_state::galivan_map);
+ m_maincpu->set_addrmap(AS_IO, &galivan_state::io_map);
+ m_maincpu->set_vblank_int("screen", FUNC(galivan_state::irq0_line_hold));
- MCFG_DEVICE_ADD("audiocpu", Z80, XTAL(8'000'000)/2) /* 4 MHz? */
- MCFG_DEVICE_PROGRAM_MAP(sound_map)
- MCFG_DEVICE_IO_MAP(sound_io_map)
- MCFG_DEVICE_PERIODIC_INT_DRIVER(galivan_state, irq0_line_hold, XTAL(8'000'000)/2/512) // ?
+ z80_device &audiocpu(Z80(config, "audiocpu", XTAL(8'000'000)/2)); /* 4 MHz? */
+ audiocpu.set_addrmap(AS_PROGRAM, &galivan_state::sound_map);
+ audiocpu.set_addrmap(AS_IO, &galivan_state::sound_io_map);
+ audiocpu.set_periodic_int(FUNC(galivan_state::irq0_line_hold), attotime::from_hz(XTAL(8'000'000)/2/512)); // ?
MCFG_MACHINE_START_OVERRIDE(galivan_state,galivan)
MCFG_MACHINE_RESET_OVERRIDE(galivan_state,galivan)
/* video hardware */
- MCFG_DEVICE_ADD("spriteram", BUFFERED_SPRITERAM8)
+ BUFFERED_SPRITERAM8(config, m_spriteram);
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(32*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(galivan_state, screen_update_galivan)
- MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE("spriteram", buffered_spriteram8_device, vblank_copy_rising))
- MCFG_SCREEN_PALETTE(m_palette)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(32*8, 32*8);
+ screen.set_visarea(0*8, 32*8-1, 2*8, 30*8-1);
+ screen.set_screen_update(FUNC(galivan_state::screen_update_galivan));
+ screen.screen_vblank().set(m_spriteram, FUNC(buffered_spriteram8_device::vblank_copy_rising));
+ screen.set_palette(m_palette);
GFXDECODE(config, m_gfxdecode, m_palette, gfx_galivan);
PALETTE(config, m_palette, FUNC(galivan_state::galivan_palette), 8*16+16*16+256*16, 256);
@@ -467,53 +467,52 @@ MACHINE_CONFIG_START(galivan_state::galivan)
GENERIC_LATCH_8(config, m_soundlatch);
- MCFG_DEVICE_ADD("ymsnd", YM3526, XTAL(8'000'000)/2)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 1.0)
+ YM3526(config, "ymsnd", XTAL(8'000'000)/2).add_route(ALL_OUTPUTS, "speaker", 1.0);
- MCFG_DEVICE_ADD("dac1", DAC_8BIT_R2R, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 0.25) // unknown DAC
- MCFG_DEVICE_ADD("dac2", DAC_8BIT_R2R, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 0.25) // unknown DAC
- MCFG_DEVICE_ADD("vref", VOLTAGE_REGULATOR, 0) MCFG_VOLTAGE_REGULATOR_OUTPUT(5.0)
- MCFG_SOUND_ROUTE(0, "dac1", 1.0, DAC_VREF_POS_INPUT) MCFG_SOUND_ROUTE(0, "dac1", -1.0, DAC_VREF_NEG_INPUT)
- MCFG_SOUND_ROUTE(0, "dac2", 1.0, DAC_VREF_POS_INPUT) MCFG_SOUND_ROUTE(0, "dac2", -1.0, DAC_VREF_NEG_INPUT)
-MACHINE_CONFIG_END
+ DAC_8BIT_R2R(config, "dac1", 0).add_route(ALL_OUTPUTS, "speaker", 0.25); // unknown DAC
+ DAC_8BIT_R2R(config, "dac2", 0).add_route(ALL_OUTPUTS, "speaker", 0.25); // unknown DAC
+ voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref"));
+ vref.add_route(0, "dac1", 1.0, DAC_VREF_POS_INPUT); vref.add_route(0, "dac1", -1.0, DAC_VREF_NEG_INPUT);
+ vref.add_route(0, "dac2", 1.0, DAC_VREF_POS_INPUT); vref.add_route(0, "dac2", -1.0, DAC_VREF_NEG_INPUT);
+}
-MACHINE_CONFIG_START(dangarj_state::dangarj)
+void dangarj_state::dangarj(machine_config &config)
+{
galivan(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_IO_MAP(dangarj_io_map)
+ m_maincpu->set_addrmap(AS_IO, &dangarj_state::dangarj_io_map);
NB1412M2(config, m_prot, XTAL(8'000'000)); // divided by 2 maybe
-MACHINE_CONFIG_END
-
-MACHINE_CONFIG_START(galivan_state::ninjemak)
+}
+void galivan_state::ninjemak(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, XTAL(12'000'000)/2) /* 6 MHz? */
- MCFG_DEVICE_PROGRAM_MAP(ninjemak_map)
- MCFG_DEVICE_IO_MAP(ninjemak_io_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", galivan_state, irq0_line_hold)
+ Z80(config, m_maincpu, XTAL(12'000'000)/2); /* 6 MHz? */
+ m_maincpu->set_addrmap(AS_PROGRAM, &galivan_state::ninjemak_map);
+ m_maincpu->set_addrmap(AS_IO, &galivan_state::ninjemak_io_map);
+ m_maincpu->set_vblank_int("screen", FUNC(galivan_state::irq0_line_hold));
- MCFG_DEVICE_ADD("audiocpu", Z80, XTAL(8'000'000)/2) /* 4 MHz? */
- MCFG_DEVICE_PROGRAM_MAP(sound_map)
- MCFG_DEVICE_IO_MAP(sound_io_map)
- MCFG_DEVICE_PERIODIC_INT_DRIVER(galivan_state, irq0_line_hold, XTAL(8'000'000)/2/512) // ?
+ z80_device &audiocpu(Z80(config, "audiocpu", XTAL(8'000'000)/2)); /* 4 MHz? */
+ audiocpu.set_addrmap(AS_PROGRAM, &galivan_state::sound_map);
+ audiocpu.set_addrmap(AS_IO, &galivan_state::sound_io_map);
+ audiocpu.set_periodic_int(FUNC(galivan_state::irq0_line_hold), attotime::from_hz(XTAL(8'000'000)/2/512)); // ?
MCFG_MACHINE_START_OVERRIDE(galivan_state,ninjemak)
MCFG_MACHINE_RESET_OVERRIDE(galivan_state,ninjemak)
- MCFG_DEVICE_ADD("nb1414m4", NB1414M4, 0)
+ NB1414M4(config, m_nb1414m4, 0);
/* video hardware */
- MCFG_DEVICE_ADD("spriteram", BUFFERED_SPRITERAM8)
+ BUFFERED_SPRITERAM8(config, m_spriteram);
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(32*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(galivan_state, screen_update_ninjemak)
- MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE("spriteram", buffered_spriteram8_device, vblank_copy_rising))
- MCFG_SCREEN_PALETTE(m_palette)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(32*8, 32*8);
+ screen.set_visarea(0*8, 32*8-1, 2*8, 30*8-1);
+ screen.set_screen_update(FUNC(galivan_state::screen_update_ninjemak));
+ screen.screen_vblank().set(m_spriteram, FUNC(buffered_spriteram8_device::vblank_copy_rising));
+ screen.set_palette(m_palette);
GFXDECODE(config, m_gfxdecode, m_palette, gfx_galivan);
PALETTE(config, m_palette, FUNC(galivan_state::galivan_palette), 8*16+16*16+256*16, 256);
@@ -525,22 +524,22 @@ MACHINE_CONFIG_START(galivan_state::ninjemak)
GENERIC_LATCH_8(config, m_soundlatch);
- MCFG_DEVICE_ADD("ymsnd", YM3526, XTAL(8'000'000)/2)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 1.0)
+ YM3526(config, "ymsnd", XTAL(8'000'000)/2).add_route(ALL_OUTPUTS, "speaker", 1.0);
- MCFG_DEVICE_ADD("dac1", DAC_8BIT_R2R, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 0.25) // unknown DAC
- MCFG_DEVICE_ADD("dac2", DAC_8BIT_R2R, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 0.25) // unknown DAC
- MCFG_DEVICE_ADD("vref", VOLTAGE_REGULATOR, 0) MCFG_VOLTAGE_REGULATOR_OUTPUT(5.0)
- MCFG_SOUND_ROUTE(0, "dac1", 1.0, DAC_VREF_POS_INPUT) MCFG_SOUND_ROUTE(0, "dac1", -1.0, DAC_VREF_NEG_INPUT)
- MCFG_SOUND_ROUTE(0, "dac2", 1.0, DAC_VREF_POS_INPUT) MCFG_SOUND_ROUTE(0, "dac2", -1.0, DAC_VREF_NEG_INPUT)
-MACHINE_CONFIG_END
+ DAC_8BIT_R2R(config, "dac1", 0).add_route(ALL_OUTPUTS, "speaker", 0.25); // unknown DAC
+ DAC_8BIT_R2R(config, "dac2", 0).add_route(ALL_OUTPUTS, "speaker", 0.25); // unknown DAC
+ voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref"));
+ vref.add_route(0, "dac1", 1.0, DAC_VREF_POS_INPUT); vref.add_route(0, "dac1", -1.0, DAC_VREF_NEG_INPUT);
+ vref.add_route(0, "dac2", 1.0, DAC_VREF_POS_INPUT); vref.add_route(0, "dac2", -1.0, DAC_VREF_NEG_INPUT);
+}
-MACHINE_CONFIG_START(galivan_state::youmab)
+void galivan_state::youmab(machine_config &config)
+{
ninjemak(config);
- MCFG_DEVICE_REMOVE("nb1414m4")
-MACHINE_CONFIG_END
+ config.device_remove("nb1414m4");
+}
/***************************************************************************
Game driver(s)
diff --git a/src/mame/drivers/galpani2.cpp b/src/mame/drivers/galpani2.cpp
index dde79ee7b85..2f35d25cde9 100644
--- a/src/mame/drivers/galpani2.cpp
+++ b/src/mame/drivers/galpani2.cpp
@@ -622,27 +622,27 @@ TIMER_DEVICE_CALLBACK_MEMBER(galpani2_state::galpani2_interrupt2)
m_subcpu->set_input_line(3, HOLD_LINE);
}
-MACHINE_CONFIG_START(galpani2_state::galpani2)
-
+void galpani2_state::galpani2(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M68000, XTAL(27'000'000)/2) /* Confirmed on galpani2i PCB */
- MCFG_DEVICE_PROGRAM_MAP(galpani2_mem1)
- MCFG_TIMER_DRIVER_ADD_SCANLINE("m_scantimer", galpani2_state, galpani2_interrupt1, "screen", 0, 1)
- //MCFG_QUANTUM_PERFECT_CPU("maincpu")
+ M68000(config, m_maincpu, XTAL(27'000'000)/2); /* Confirmed on galpani2i PCB */
+ m_maincpu->set_addrmap(AS_PROGRAM, &galpani2_state::galpani2_mem1);
+ TIMER(config, "m_scantimer").configure_scanline(FUNC(galpani2_state::galpani2_interrupt1), "screen", 0, 1);
+ //config.m_perfect_cpu_quantum = subtag("maincpu");
- MCFG_DEVICE_ADD("sub", M68000, XTAL(27'000'000)/2) /* Confirmed on galpani2i PCB */
- MCFG_DEVICE_PROGRAM_MAP(galpani2_mem2)
- MCFG_TIMER_DRIVER_ADD_SCANLINE("s_scantimer", galpani2_state, galpani2_interrupt2, "screen", 0, 1)
+ M68000(config, m_subcpu, XTAL(27'000'000)/2); /* Confirmed on galpani2i PCB */
+ m_subcpu->set_addrmap(AS_PROGRAM, &galpani2_state::galpani2_mem2);
+ TIMER(config, "s_scantimer").configure_scanline(FUNC(galpani2_state::galpani2_interrupt2), "screen", 0, 1);
EEPROM_93C46_16BIT(config, "eeprom");
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(320, 256)
- MCFG_SCREEN_VISIBLE_AREA(0, 320-1, 0, 256-1-16)
- MCFG_SCREEN_UPDATE_DRIVER(galpani2_state, screen_update_galpani2)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(320, 256);
+ screen.set_visarea(0, 320-1, 0, 256-1-16);
+ screen.set_screen_update(FUNC(galpani2_state::screen_update_galpani2));
GFXDECODE(config, "gfxdecode", m_palette, gfx_galpani2);
PALETTE(config, m_palette).set_format(palette_device::xGRB_555, 0x4000); // sprites
@@ -657,12 +657,10 @@ MACHINE_CONFIG_START(galpani2_state::galpani2)
SPEAKER(config, "lspeaker").front_left();
SPEAKER(config, "rspeaker").front_right();
- MCFG_DEVICE_ADD("oki1", OKIM6295, XTAL(20'000'000)/10, okim6295_device::PIN7_HIGH) /* Confirmed on galpani2i PCB */
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 1.0)
+ OKIM6295(config, "oki1", XTAL(20'000'000)/10, okim6295_device::PIN7_HIGH).add_route(ALL_OUTPUTS, "lspeaker", 1.0); /* Confirmed on galpani2i PCB */
- MCFG_DEVICE_ADD("oki2", OKIM6295, XTAL(20'000'000)/10, okim6295_device::PIN7_HIGH) /* Confirmed on galpani2i PCB */
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 1.0)
-MACHINE_CONFIG_END
+ OKIM6295(config, m_oki2, XTAL(20'000'000)/10, okim6295_device::PIN7_HIGH).add_route(ALL_OUTPUTS, "rspeaker", 1.0); /* Confirmed on galpani2i PCB */
+}
/***************************************************************************
diff --git a/src/mame/drivers/galpani3.cpp b/src/mame/drivers/galpani3.cpp
index 8e04a9e25f5..aa1d2cc619f 100644
--- a/src/mame/drivers/galpani3.cpp
+++ b/src/mame/drivers/galpani3.cpp
@@ -450,45 +450,43 @@ void galpani3_state::galpani3_map(address_map &map)
}
-MACHINE_CONFIG_START(galpani3_state::galpani3)
- MCFG_DEVICE_ADD("maincpu", M68000, XTAL(28'636'363)/2) // Confirmed from PCB
- MCFG_DEVICE_PROGRAM_MAP(galpani3_map)
- MCFG_TIMER_DRIVER_ADD_SCANLINE("scantimer", galpani3_state, galpani3_vblank, "screen", 0, 1)
-
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(64*8, 64*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 40*8-1, 0*8, 30*8-1)
- //MCFG_SCREEN_VISIBLE_AREA(0*8, 64*8-1, 0*8, 64*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(galpani3_state, screen_update_galpani3)
+void galpani3_state::galpani3(machine_config &config)
+{
+ M68000(config, m_maincpu, XTAL(28'636'363)/2); // Confirmed from PCB
+ m_maincpu->set_addrmap(AS_PROGRAM, &galpani3_state::galpani3_map);
+ TIMER(config, "scantimer").configure_scanline(FUNC(galpani3_state::galpani3_vblank), "screen", 0, 1);
+
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(64*8, 64*8);
+ screen.set_visarea(0*8, 40*8-1, 0*8, 30*8-1);
+ //screen.set_visarea(0*8, 64*8-1, 0*8, 64*8-1);
+ screen.set_screen_update(FUNC(galpani3_state::screen_update_galpani3));
EEPROM_93C46_16BIT(config, "eeprom");
WATCHDOG_TIMER(config, "watchdog");
- MCFG_DEVICE_ADD("toybox", KANEKO_TOYBOX, "eeprom", "DSW1", "mcuram", "mcudata")
+ KANEKO_TOYBOX(config, "toybox", "eeprom", "DSW1", "mcuram", "mcudata");
PALETTE(config, m_palette).set_format(palette_device::xGRB_555, 0x4000);
- MCFG_DEVICE_ADD("spritegen", SKNS_SPRITE, 0)
+ SKNS_SPRITE(config, m_spritegen, 0);
- MCFG_DEVICE_ADD("grap2_0", KANEKO_GRAP2, 0)
- MCFG_DEVICE_ROM("rlebg")
+ KANEKO_GRAP2(config, m_grap2[0], 0).set_device_rom_tag("rlebg");
- MCFG_DEVICE_ADD("grap2_1", KANEKO_GRAP2, 0)
- MCFG_DEVICE_ROM("rlebg")
+ KANEKO_GRAP2(config, m_grap2[1], 0).set_device_rom_tag("rlebg");
- MCFG_DEVICE_ADD("grap2_2", KANEKO_GRAP2, 0)
- MCFG_DEVICE_ROM("rlebg")
+ KANEKO_GRAP2(config, m_grap2[2], 0).set_device_rom_tag("rlebg");
/* sound hardware */
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("ymz", YMZ280B, XTAL(33'333'000) / 2) // Confirmed from PCB
- MCFG_SOUND_ROUTE(0, "mono", 1.0)
- MCFG_SOUND_ROUTE(1, "mono", 1.0)
-MACHINE_CONFIG_END
+ ymz280b_device &ymz(YMZ280B(config, "ymz", XTAL(33'333'000) / 2)); // Confirmed from PCB
+ ymz.add_route(0, "mono", 1.0);
+ ymz.add_route(1, "mono", 1.0);
+}
ROM_START( galpani3 ) /* All game text in English */
diff --git a/src/mame/drivers/galpanic.cpp b/src/mame/drivers/galpanic.cpp
index 382c04155dd..b4a5aee7345 100644
--- a/src/mame/drivers/galpanic.cpp
+++ b/src/mame/drivers/galpanic.cpp
@@ -232,24 +232,24 @@ static GFXDECODE_START( gfx_galpanic )
GFXDECODE_END
-MACHINE_CONFIG_START(galpanic_state::galpanic)
-
+void galpanic_state::galpanic(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M68000, XTAL(12'000'000)) /* verified on pcb */
- MCFG_DEVICE_PROGRAM_MAP(galpanic_map)
- MCFG_TIMER_DRIVER_ADD_SCANLINE("scantimer", galpanic_state, scanline, "screen", 0, 1)
+ M68000(config, m_maincpu, XTAL(12'000'000)); /* verified on pcb */
+ m_maincpu->set_addrmap(AS_PROGRAM, &galpanic_state::galpanic_map);
+ TIMER(config, "scantimer").configure_scanline(FUNC(galpanic_state::scanline), "screen", 0, 1);
WATCHDOG_TIMER(config, "watchdog");
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0) /* frames per second, vblank duration */)
- MCFG_SCREEN_SIZE(256, 256)
- MCFG_SCREEN_VISIBLE_AREA(0, 256-1, 0, 224-1)
- MCFG_SCREEN_UPDATE_DRIVER(galpanic_state, screen_update)
- MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE(*this, galpanic_state, screen_vblank))
- MCFG_SCREEN_PALETTE(m_palette)
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_refresh_hz(60);
+ m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(0) /* frames per second, vblank duration */);
+ m_screen->set_size(256, 256);
+ m_screen->set_visarea(0, 256-1, 0, 224-1);
+ m_screen->set_screen_update(FUNC(galpanic_state::screen_update));
+ m_screen->screen_vblank().set(FUNC(galpanic_state::screen_vblank));
+ m_screen->set_palette(m_palette);
GFXDECODE(config, m_gfxdecode, m_palette, gfx_galpanic);
// fg palette RAM, bit 0 seems to be a transparency flag for the front bitmap
@@ -262,23 +262,23 @@ MACHINE_CONFIG_START(galpanic_state::galpanic)
/* sound hardware */
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("oki", OKIM6295, XTAL(12'000'000)/6, okim6295_device::PIN7_LOW) /* verified on pcb */
- MCFG_DEVICE_ADDRESS_MAP(0, galpanic_oki_map)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
-MACHINE_CONFIG_END
+ okim6295_device &oki(OKIM6295(config, "oki", XTAL(12'000'000)/6, okim6295_device::PIN7_LOW)); /* verified on pcb */
+ oki.set_addrmap(0, &galpanic_state::galpanic_oki_map);
+ oki.add_route(ALL_OUTPUTS, "mono", 1.0);
+}
-MACHINE_CONFIG_START(galpanic_state::galpanica)
+void galpanic_state::galpanica(machine_config &config)
+{
galpanic(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(galpanica_map)
+ m_maincpu->set_addrmap(AS_PROGRAM, &galpanic_state::galpanica_map);
/* basic machine hardware */
KANEKO_HIT(config, "calc1_mcu").set_type(0);
/* arm watchdog */
subdevice<watchdog_timer_device>("watchdog")->set_time(attotime::from_seconds(3)); /* a guess, and certainly wrong */
-MACHINE_CONFIG_END
+}
/***************************************************************************
diff --git a/src/mame/drivers/galspnbl.cpp b/src/mame/drivers/galspnbl.cpp
index 5fda8a45d87..266975edcf0 100644
--- a/src/mame/drivers/galspnbl.cpp
+++ b/src/mame/drivers/galspnbl.cpp
@@ -217,12 +217,12 @@ void galspnbl_state::machine_start()
void galspnbl_state::galspnbl(machine_config &config)
{
/* basic machine hardware */
- M68000(config, m_maincpu, XTAL(12'000'000)); /* 12 MHz ??? - Use value from Tecmo's Super Pinball Action - NEEDS VERIFICATION!! */
+ M68000(config, m_maincpu, XTAL(12'000'000)); /* 12 MHz ??? - Use value from Tecmo's Super Pinball Action - NEEDS VERIFICATION!! */
m_maincpu->set_addrmap(AS_PROGRAM, &galspnbl_state::main_map);
m_maincpu->set_vblank_int("screen", FUNC(galspnbl_state::irq3_line_hold)); /* also has vector for 6, but it does nothing */
- Z80(config, m_audiocpu, XTAL(4'000'000)); /* 4 MHz ??? - Use value from Tecmo's Super Pinball Action - NEEDS VERIFICATION!! */
- m_audiocpu->set_addrmap(AS_PROGRAM, &galspnbl_state::audio_map); /* NMI is caused by the main CPU */
+ Z80(config, m_audiocpu, XTAL(4'000'000)); /* 4 MHz ??? - Use value from Tecmo's Super Pinball Action - NEEDS VERIFICATION!! */
+ m_audiocpu->set_addrmap(AS_PROGRAM, &galspnbl_state::audio_map); /* NMI is caused by the main CPU */
/* video hardware */
SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
diff --git a/src/mame/drivers/gamate.cpp b/src/mame/drivers/gamate.cpp
index b94b5160c3d..ece663eb042 100644
--- a/src/mame/drivers/gamate.cpp
+++ b/src/mame/drivers/gamate.cpp
@@ -94,14 +94,14 @@ READ8_MEMBER( gamate_state::gamate_nmi_r )
READ8_MEMBER(gamate_state::sound_r)
{
- m_ay->address_w(space, 0, offset);
- return m_ay->data_r(space, 0);
+ m_ay->address_w(offset);
+ return m_ay->data_r();
}
WRITE8_MEMBER(gamate_state::sound_w)
{
- m_ay->address_w(space, 0, offset);
- m_ay->data_w(space, 0, data);
+ m_ay->address_w(offset);
+ m_ay->data_w(data);
}
WRITE8_MEMBER(gamate_state::write_cart)
@@ -176,9 +176,10 @@ TIMER_CALLBACK_MEMBER(gamate_state::gamate_timer2)
timer2->reset(m_maincpu->cycles_to_attotime(32768/2));
}
-MACHINE_CONFIG_START(gamate_state::gamate)
- MCFG_DEVICE_ADD("maincpu", M6502, 4433000/2) // NCR 65CX02
- MCFG_DEVICE_PROGRAM_MAP(gamate_mem)
+void gamate_state::gamate(machine_config &config)
+{
+ M6502(config, m_maincpu, 4433000/2); // NCR 65CX02
+ m_maincpu->set_addrmap(AS_PROGRAM, &gamate_state::gamate_mem);
GAMATE_VIDEO(config, "video", 0);
@@ -191,10 +192,10 @@ MACHINE_CONFIG_START(gamate_state::gamate)
m_ay->add_route(2, "lspeaker", 0.25);
m_ay->add_route(2, "rspeaker", 0.25);
- MCFG_GAMATE_CARTRIDGE_ADD("cartslot", gamate_cart, nullptr)
+ GAMATE_CART_SLOT(config, m_cartslot, gamate_cart, nullptr);
- MCFG_SOFTWARE_LIST_ADD("cart_list","gamate")
-MACHINE_CONFIG_END
+ SOFTWARE_LIST(config, "cart_list").set_original("gamate");
+}
/* ROM notes:
diff --git a/src/mame/drivers/gambl186.cpp b/src/mame/drivers/gambl186.cpp
index fb24cd27511..96c7bd1b3fa 100644
--- a/src/mame/drivers/gambl186.cpp
+++ b/src/mame/drivers/gambl186.cpp
@@ -472,26 +472,25 @@ INPUT_PORTS_END
-MACHINE_CONFIG_START(gambl186_state::gambl186)
- MCFG_DEVICE_ADD("maincpu", I80186, XTAL(40'000'000))
- MCFG_DEVICE_PROGRAM_MAP(gambl186_map)
- MCFG_DEVICE_IO_MAP(gambl186_io)
+void gambl186_state::gambl186(machine_config &config)
+{
+ I80186(config, m_maincpu, XTAL(40'000'000));
+ m_maincpu->set_addrmap(AS_PROGRAM, &gambl186_state::gambl186_map);
+ m_maincpu->set_addrmap(AS_IO, &gambl186_state::gambl186_io);
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_RAW_PARAMS(XTAL(25'174'800),900,0,640,526,0,480)
- MCFG_SCREEN_UPDATE_DEVICE("vga", cirrus_gd5428_device, screen_update)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_raw(XTAL(25'174'800),900,0,640,526,0,480);
+ screen.set_screen_update("vga", FUNC(cirrus_gd5428_device::screen_update));
- MCFG_DEVICE_ADD("vga", CIRRUS_GD5428, 0)
- MCFG_VIDEO_SET_SCREEN("screen")
+ CIRRUS_GD5428(config, "vga", 0).set_screen("screen");
/* sound hardware */
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("7759", UPD7759)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.75)
-
-MACHINE_CONFIG_END
+ UPD7759(config, m_upd7759);
+ m_upd7759->add_route(ALL_OUTPUTS, "mono", 0.75);
+}
diff --git a/src/mame/drivers/gamecom.cpp b/src/mame/drivers/gamecom.cpp
index e0747c767d4..480840cd550 100644
--- a/src/mame/drivers/gamecom.cpp
+++ b/src/mame/drivers/gamecom.cpp
@@ -263,18 +263,18 @@ MACHINE_CONFIG_START(gamecom_state::gamecom)
m_maincpu->timer_cb().set(FUNC(gamecom_state::gamecom_update_timers));
m_maincpu->set_vblank_int("screen", FUNC(gamecom_state::gamecom_interrupt));
- MCFG_QUANTUM_TIME(attotime::from_hz(60))
+ config.m_minimum_quantum = attotime::from_hz(60);
//NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
/* video hardware */
- MCFG_SCREEN_ADD("screen", LCD)
- MCFG_SCREEN_REFRESH_RATE( 59.732155 )
- MCFG_SCREEN_VBLANK_TIME(500)
- MCFG_SCREEN_UPDATE_DRIVER(gamecom_state, screen_update)
- MCFG_SCREEN_SIZE( 200, 160 )
- MCFG_SCREEN_VISIBLE_AREA( 0, 199, 0, 159 )
- MCFG_SCREEN_PALETTE("palette")
+ SCREEN(config, m_screen, SCREEN_TYPE_LCD);
+ m_screen->set_refresh_hz(59.732155);
+ m_screen->set_vblank_time(500);
+ m_screen->set_screen_update(FUNC(gamecom_state::screen_update));
+ m_screen->set_size(200, 160);
+ m_screen->set_visarea_full();
+ m_screen->set_palette("palette");
config.set_default_layout(layout_gamecom);
PALETTE(config, "palette", FUNC(gamecom_state::gamecom_palette), 5);
@@ -282,13 +282,13 @@ MACHINE_CONFIG_START(gamecom_state::gamecom)
/* sound hardware */
SPEAKER(config, "speaker").front_center();
/* TODO: much more complex than this */
- MCFG_DEVICE_ADD("dac", DAC_8BIT_R2R, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 0.5) // unknown DAC (Digital audio)
- MCFG_DEVICE_ADD("dac0", DAC_4BIT_R2R, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 0.05) // unknown DAC (Frequency modulation)
- MCFG_DEVICE_ADD("dac1", DAC_4BIT_R2R, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 0.05) // unknown DAC (Frequency modulation)
- MCFG_DEVICE_ADD("vref", VOLTAGE_REGULATOR, 0) MCFG_VOLTAGE_REGULATOR_OUTPUT(5.0)
- MCFG_SOUND_ROUTE(0, "dac", 1.0, DAC_VREF_POS_INPUT) MCFG_SOUND_ROUTE(0, "dac", -1.0, DAC_VREF_NEG_INPUT)
- MCFG_SOUND_ROUTE(0, "dac0", 1.0, DAC_VREF_POS_INPUT) MCFG_SOUND_ROUTE(0, "dac0", -1.0, DAC_VREF_NEG_INPUT)
- MCFG_SOUND_ROUTE(0, "dac1", 1.0, DAC_VREF_POS_INPUT) MCFG_SOUND_ROUTE(0, "dac1", -1.0, DAC_VREF_NEG_INPUT)
+ DAC_8BIT_R2R(config, m_dac, 0).add_route(ALL_OUTPUTS, "speaker", 0.5); // unknown DAC (Digital audio)
+ DAC_4BIT_R2R(config, m_dac0, 0).add_route(ALL_OUTPUTS, "speaker", 0.05); // unknown DAC (Frequency modulation)
+ DAC_4BIT_R2R(config, m_dac1, 0).add_route(ALL_OUTPUTS, "speaker", 0.05); // unknown DAC (Frequency modulation)
+ voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref"));
+ vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT); vref.add_route(0, "dac", -1.0, DAC_VREF_NEG_INPUT);
+ vref.add_route(0, "dac0", 1.0, DAC_VREF_POS_INPUT); vref.add_route(0, "dac0", -1.0, DAC_VREF_NEG_INPUT);
+ vref.add_route(0, "dac1", 1.0, DAC_VREF_POS_INPUT); vref.add_route(0, "dac1", -1.0, DAC_VREF_NEG_INPUT);
/* cartridge */
MCFG_GENERIC_CARTSLOT_ADD("cartslot1", generic_linear_slot, "gamecom_cart")
@@ -299,7 +299,7 @@ MACHINE_CONFIG_START(gamecom_state::gamecom)
MCFG_GENERIC_EXTENSIONS("bin,tgc")
MCFG_GENERIC_LOAD(gamecom_state, gamecom_cart2)
- MCFG_SOFTWARE_LIST_ADD("cart_list","gamecom")
+ SOFTWARE_LIST(config, "cart_list").set_original("gamecom");
MACHINE_CONFIG_END
ROM_START( gamecom )
@@ -311,4 +311,4 @@ ROM_START( gamecom )
ROM_END
// YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS
-CONS( 1997, gamecom, 0, 0, gamecom, gamecom, gamecom_state, init_gamecom, "Tiger", "Game.com", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND)
+CONS( 1997, gamecom, 0, 0, gamecom, gamecom, gamecom_state, init_gamecom, "Tiger", "Game.com", MACHINE_IMPERFECT_SOUND)
diff --git a/src/mame/drivers/gamecstl.cpp b/src/mame/drivers/gamecstl.cpp
index 45a9ffbc1da..4e9c30d33f5 100644
--- a/src/mame/drivers/gamecstl.cpp
+++ b/src/mame/drivers/gamecstl.cpp
@@ -446,10 +446,10 @@ void gamecstl_state::machine_reset()
MACHINE_CONFIG_START(gamecstl_state::gamecstl)
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", PENTIUM3, 200000000)
- MCFG_DEVICE_PROGRAM_MAP(gamecstl_map)
- MCFG_DEVICE_IO_MAP(gamecstl_io)
- MCFG_DEVICE_IRQ_ACKNOWLEDGE_DEVICE("pic8259_1", pic8259_device, inta_cb)
+ PENTIUM3(config, m_maincpu, 200000000);
+ m_maincpu->set_addrmap(AS_PROGRAM, &gamecstl_state::gamecstl_map);
+ m_maincpu->set_addrmap(AS_IO, &gamecstl_state::gamecstl_io);
+ m_maincpu->set_irq_acknowledge_callback("pic8259_1", FUNC(pic8259_device::inta_cb));
pcat_common(config);
@@ -461,18 +461,16 @@ MACHINE_CONFIG_START(gamecstl_state::gamecstl)
ide.irq_handler().set("pic8259_2", FUNC(pic8259_device::ir6_w));
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(640, 480)
- MCFG_SCREEN_VISIBLE_AREA(0, 639, 0, 199)
- MCFG_SCREEN_UPDATE_DRIVER(gamecstl_state, screen_update_gamecstl)
- MCFG_SCREEN_PALETTE("palette")
-
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_cga)
- MCFG_PALETTE_ADD("palette", 16)
-
-
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(640, 480);
+ screen.set_visarea(0, 639, 0, 199);
+ screen.set_screen_update(FUNC(gamecstl_state::screen_update_gamecstl));
+ screen.set_palette(m_palette);
+
+ GFXDECODE(config, m_gfxdecode, m_palette, gfx_cga);
+ PALETTE(config, m_palette).set_entries(16);
MACHINE_CONFIG_END
void gamecstl_state::init_gamecstl()
diff --git a/src/mame/drivers/gamecube.cpp b/src/mame/drivers/gamecube.cpp
index cf6884285c9..3917e09d375 100644
--- a/src/mame/drivers/gamecube.cpp
+++ b/src/mame/drivers/gamecube.cpp
@@ -142,10 +142,11 @@ void gamecube_state::machine_reset()
// MACHINE DEFINITIONS
//**************************************************************************
-MACHINE_CONFIG_START(gamecube_state::gc)
- MCFG_DEVICE_ADD("maincpu", PPC603, 485000000 / 100) // 485 MHz IBM "Gekko" (750CXe/750FX based)
- MCFG_DEVICE_PROGRAM_MAP(ppc_mem)
-MACHINE_CONFIG_END
+void gamecube_state::gc(machine_config &config)
+{
+ PPC603(config, m_cpu, 485000000 / 100); // 485 MHz IBM "Gekko" (750CXe/750FX based)
+ m_cpu->set_addrmap(AS_PROGRAM, &gamecube_state::ppc_mem);
+}
//**************************************************************************
diff --git a/src/mame/drivers/gameking.cpp b/src/mame/drivers/gameking.cpp
index 5870b1130ff..86dbffe3875 100644
--- a/src/mame/drivers/gameking.cpp
+++ b/src/mame/drivers/gameking.cpp
@@ -288,17 +288,17 @@ INTERRUPT_GEN_MEMBER(gameking_state::gameking_frame_int) // guess to get over bi
MACHINE_CONFIG_START(gameking_state::gameking)
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", R65C02, 6000000)
- MCFG_DEVICE_PROGRAM_MAP(gameking_mem)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", gameking_state, gameking_frame_int)
+ R65C02(config, m_maincpu, 6000000);
+ m_maincpu->set_addrmap(AS_PROGRAM, &gameking_state::gameking_mem);
+ m_maincpu->set_vblank_int("screen", FUNC(gameking_state::gameking_frame_int));
/* video hardware */
- MCFG_SCREEN_ADD("screen", LCD)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_SIZE(48, 32)
- MCFG_SCREEN_VISIBLE_AREA(0, 48-1, 0, 32-1)
- MCFG_SCREEN_UPDATE_DRIVER(gameking_state, screen_update_gameking)
- MCFG_SCREEN_PALETTE(m_palette)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_LCD));
+ screen.set_refresh_hz(60);
+ screen.set_size(48, 32);
+ screen.set_visarea_full();
+ screen.set_screen_update(FUNC(gameking_state::screen_update_gameking));
+ screen.set_palette(m_palette);
PALETTE(config, m_palette, FUNC(gameking_state::gameking_palette), ARRAY_LENGTH(gameking_pens));
@@ -308,16 +308,18 @@ MACHINE_CONFIG_START(gameking_state::gameking)
MCFG_GENERIC_LOAD(gameking_state, gameking_cart)
MACHINE_CONFIG_END
-MACHINE_CONFIG_START(gameking_state::gameking1)
+void gameking_state::gameking1(machine_config &config)
+{
gameking(config);
- MCFG_SOFTWARE_LIST_ADD("cart_list", "gameking")
-MACHINE_CONFIG_END
+ SOFTWARE_LIST(config, "cart_list").set_original("gameking");
+}
-MACHINE_CONFIG_START(gameking_state::gameking3)
+void gameking_state::gameking3(machine_config &config)
+{
gameking(config);
- MCFG_SOFTWARE_LIST_ADD("cart_list", "gameking")
- MCFG_SOFTWARE_LIST_ADD("cart_list_3", "gameking3")
-MACHINE_CONFIG_END
+ SOFTWARE_LIST(config, "cart_list").set_original("gameking");
+ SOFTWARE_LIST(config, "cart_list_3").set_original("gameking3");
+}
ROM_START(gameking)
diff --git a/src/mame/drivers/gamemachine.cpp b/src/mame/drivers/gamemachine.cpp
new file mode 100644
index 00000000000..7f4ae26cdd9
--- /dev/null
+++ b/src/mame/drivers/gamemachine.cpp
@@ -0,0 +1,419 @@
+// license:BSD-3-Clause
+// copyright-holders:hap
+// thanks-to:Sean Riddle, Couriersud
+/******************************************************************************
+
+Waddingtons 2001: The Game Machine
+
+It's a tabletop electronic game machine + calculator.
+It was possibly created by VTech, but they didn't distribute it by themselves
+until later in 1980 as the Computer Game System. There's also a handheld version
+"Mini Game Machine". VTech later made a sequel "Game Machine 2" with 5 games.
+
+hardware notes:
+- Mostek MK3870 MCU, 2KB internal ROM
+- 12 digits 7seg VFD panel
+- MC1455P(555 timer) + bunch of discrete components for sound
+
+TODO:
+- MCU frequency was measured approx 2.1MHz on its XTL2 pin, but considering that
+ the MK3870 has an internal /2 divider, this is way too slow when compared to
+ video references of the game
+
+*******************************************************************************
+
+After boot, press a number to start a game:
+0: 4 Function Calculator (not a game)
+1: Shooting Gallery
+2: Black Jack
+3: Code Hunter
+4: Grand Prix
+
+Screen and keypad overlays were provided for each game, though the default keypad
+labels already show the alternate functions.
+
+keypad reference (mapped to PC keyboard A-row and Z-row by default)
+
+Calculator:
+ [RET] [MS ] [MR ] [+/-] [. ] [+= ] [-= ] [x ] [/ ] [CL ]
+ [0 ] [1 ] [2 ] [3 ] [4 ] [5 ] [6 ] [7 ] [8 ] [9 ]
+
+Shooting Gallery:
+ [RET] [Cyc] [Zig] [Rnd] [ ] [ ] [ ] [ ] [ ] [ ] * Cyclic, Zigzag, Random
+ [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] * + any of 20 buttons for shooting target
+
+Black Jack:
+ [RET] [Dl ] [ ] [ ] [ ] [ ] [ ] [ ] [Hit] [Stn] * Deal, Hit, Stand
+ [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ]
+
+Code Hunter:
+ [RET] [Sta] [Dis] [ ] [ ] [Ent] [ ] [Crs] [R< ] [R> ] * Start, Display, Enter, Cursor key, Review back, Review ahead
+ [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ]
+
+Grand Prix:
+ [RET] [Go ] [ ] [ ] [ ] [ ] [ ] [Up ] [Up ] [Up ]
+ [Brk] [Gas] [ ] [ ] [ ] [ ] [ ] [Dwn] [Dwn] [Dwn]
+
+******************************************************************************/
+
+#include "emu.h"
+#include "cpu/f8/f8.h"
+#include "machine/f3853.h"
+#include "machine/timer.h"
+#include "speaker.h"
+#include "machine/netlist.h"
+#include "netlist/devices/net_lib.h"
+#include "tgm.lh"
+
+/*
+ * Netlist below provided under Creative Commons CC0
+ */
+
+static NETLIST_START(nl_gamemachine)
+
+ /* Standard stuff */
+
+ SOLVER(Solver, 48000)
+ PARAM(Solver.ACCURACY, 1e-7)
+ ANALOG_INPUT(V5, 5)
+
+ /* Schematics: http://seanriddle.com/gamemachineaudio.JPG
+ *
+ * 3870 datasheet: http://nice.kaze.com/MK3870.pdf
+ *
+ * The 3870 has mask-programmable outputs (page VIII-7 in datasheet).
+ *
+ * Given the schematics, in this case the OPENDRAIN configuration is the
+ * most probable.
+ *
+ */
+
+ NET_MODEL("OPENDRAIN FAMILY(OVL=0.0 OVH=0.0 ORL=1.0 ORH=1e12)")
+ NET_MODEL("TYPE6K FAMILY(OVL=0.05 OVH=0.05 ORL=1.0 ORH=6000)")
+ NET_MODEL("DIRECTDRIVE FAMILY(OVL=0.05 OVH=0.05 ORL=1.0 ORH=1000)")
+
+ LOGIC_INPUT(P08, 1, "OPENDRAIN")
+ LOGIC_INPUT(P09, 1, "OPENDRAIN")
+ LOGIC_INPUT(P10, 1, "OPENDRAIN")
+ LOGIC_INPUT(P11, 1, "OPENDRAIN")
+ LOGIC_INPUT(P12, 1, "OPENDRAIN")
+ LOGIC_INPUT(P13, 1, "OPENDRAIN")
+ LOGIC_INPUT(P14, 1, "OPENDRAIN")
+ LOGIC_INPUT(P15, 1, "OPENDRAIN")
+
+ RES(R1, RES_K(2.4))
+ RES(R2, RES_K(10))
+ RES(R3, RES_K(4.3))
+ RES(R4, RES_K(150))
+ RES(R5, RES_K(240))
+ RES(R6, RES_K(2.4))
+ RES(SPK1, 8)
+
+ CAP(C1, CAP_P(50))
+ CAP(C2, CAP_U(0.001))
+ CAP(C3, CAP_U(0.002)) // Schematics state this as 2pF, doesn't make sense, this looks like a ladder layout
+ CAP(C4, CAP_U(0.005))
+ CAP(C5, CAP_U(0.010))
+
+ CAP(C6, CAP_P(50))
+ CAP(C7, CAP_U(0.01))
+ CAP(C8, CAP_U(470))
+
+ QBJT_EB(Q1, "9013")
+
+ MC1455P_DIP(IC1)
+
+ NET_C(P08.Q, R2.2, IC1.4)
+ NET_C(P09.Q, C8.2)
+ NET_C(P15.Q, R1.2)
+
+ NET_C(C1.1, P10.Q)
+ NET_C(C2.1, P11.Q)
+ NET_C(C3.1, P12.Q)
+ NET_C(C4.1, P13.Q)
+ NET_C(C5.1, P14.Q)
+
+ NET_C(C1.2, C2.2, C3.2, C4.2, C5.2, C6.2, IC1.2, IC1.6, R5.2)
+ NET_C(GND, C6.1, IC1.1, Q1.E)
+ NET_C(R5.1, R4.2, IC1.7)
+ NET_C(V5, R4.1, R2.1, IC1.8, SPK1.1, R3.1)
+
+ NET_C(C7.1, R6.1, IC1.3)
+
+ NET_C(C7.2, R6.2, Q1.B)
+ NET_C(Q1.C, SPK1.2)
+
+ NET_C(C8.1, R1.1, R3.2, IC1.5)
+
+NETLIST_END()
+
+
+namespace {
+
+class tgm_state : public driver_device
+{
+public:
+ tgm_state(const machine_config &mconfig, device_type type, const char *tag) :
+ driver_device(mconfig, type, tag),
+ m_maincpu(*this, "maincpu"),
+ m_audio_pin(*this, "snd_nl:p%02u", 8U),
+ m_keypad(*this, "IN.%u", 0),
+ m_delay_display(*this, "delay_display_%u", 0),
+ m_out_digit(*this, "digit%u", 0U),
+ m_inp_mux(0),
+ m_digit_select(0),
+ m_digit_data(0)
+ { }
+
+ void tgm(machine_config &config);
+
+protected:
+ virtual void machine_start() override;
+
+private:
+ // devices/pointers
+ required_device<cpu_device> m_maincpu;
+ required_device_array<netlist_mame_logic_input_device, 8> m_audio_pin;
+ required_ioport_array<10> m_keypad;
+ required_device_array<timer_device, 12> m_delay_display;
+ output_finder<12> m_out_digit;
+
+ void main_map(address_map &map);
+ void main_io(address_map &map);
+
+ TIMER_DEVICE_CALLBACK_MEMBER(delay_display);
+
+ void update_display(u16 edge);
+ DECLARE_WRITE8_MEMBER(mux1_w);
+ DECLARE_WRITE8_MEMBER(mux2_w);
+ DECLARE_WRITE8_MEMBER(digit_w);
+ DECLARE_READ8_MEMBER(input_r);
+ DECLARE_WRITE8_MEMBER(sound_w);
+
+ u16 m_inp_mux;
+ u16 m_digit_select;
+ u8 m_digit_data;
+};
+
+void tgm_state::machine_start()
+{
+ // resolve handlers
+ m_out_digit.resolve();
+
+ // register for savestates
+ save_item(NAME(m_inp_mux));
+ save_item(NAME(m_digit_select));
+ save_item(NAME(m_digit_data));
+}
+
+
+
+/******************************************************************************
+ Devices, I/O
+******************************************************************************/
+
+// display handling
+
+TIMER_DEVICE_CALLBACK_MEMBER(tgm_state::delay_display)
+{
+ // clear VFD outputs
+ if (!BIT(m_digit_select, param))
+ m_out_digit[param] = 0;
+}
+
+void tgm_state::update_display(u16 edge)
+{
+ for (int i = 0; i < 12; i++)
+ {
+ // output VFD digit data
+ if (BIT(m_digit_select, i))
+ m_out_digit[i] = m_digit_data;
+
+ // they're strobed, so on falling edge, delay them going off to prevent flicker or stuck display
+ // BTANB: some digit segments get stuck after crashing in the GP game, it's not due to the simulated delay here
+ else if (BIT(edge, i))
+ m_delay_display[i]->adjust(attotime::from_msec(20), i);
+ }
+}
+
+
+// MK3870 ports
+
+WRITE8_MEMBER(tgm_state::mux1_w)
+{
+ // P00-P06: input mux part
+ m_inp_mux = (m_inp_mux & 7) | (data << 3 & 0x3f8);
+
+ // P00-P07: digit select part
+ u16 prev = m_digit_select;
+ m_digit_select = (m_digit_select & 0xf) | (data << 4);
+ update_display(m_digit_select ^ prev);
+}
+
+WRITE8_MEMBER(tgm_state::mux2_w)
+{
+ // P15-P17: input mux part
+ m_inp_mux = (m_inp_mux & 0x3f8) | (data >> 5 & 7);
+
+ // P14-P17: digit select part
+ u16 prev = m_digit_select;
+ m_digit_select = (m_digit_select & 0xff0) | (data >> 4 & 0xf);
+ update_display(m_digit_select ^ prev);
+}
+
+WRITE8_MEMBER(tgm_state::digit_w)
+{
+ // P50-P57: digit 7seg data
+ m_digit_data = bitswap<8>(data,0,1,2,3,4,5,6,7);
+ update_display(0);
+}
+
+READ8_MEMBER(tgm_state::input_r)
+{
+ u8 data = 0;
+
+ // P12,P13: multiplexed inputs
+ for (int i = 0; i < 10; i++)
+ if (m_inp_mux >> i & 1)
+ data |= m_keypad[i]->read();
+
+ return data << 2;
+}
+
+WRITE8_MEMBER(tgm_state::sound_w)
+{
+ // P40-P47: 555 to speaker (see netlist above)
+ for (int i = 0; i < 8; i++)
+ m_audio_pin[i]->write_line(BIT(~data, i));
+}
+
+
+
+/******************************************************************************
+ Address Maps
+******************************************************************************/
+
+void tgm_state::main_map(address_map &map)
+{
+ map.global_mask(0x07ff);
+ map(0x0000, 0x07ff).rom();
+}
+
+void tgm_state::main_io(address_map &map)
+{
+ map(0x00, 0x00).w(FUNC(tgm_state::mux1_w));
+ map(0x01, 0x01).rw(FUNC(tgm_state::input_r), FUNC(tgm_state::mux2_w));
+ map(0x04, 0x07).rw("psu", FUNC(f38t56_device::read), FUNC(f38t56_device::write));
+}
+
+
+
+/******************************************************************************
+ Input Ports
+******************************************************************************/
+
+static INPUT_PORTS_START( tgm )
+ PORT_START("IN.0")
+ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_COLON) PORT_CODE(KEYCODE_DEL) PORT_CODE(KEYCODE_BACKSPACE) PORT_CODE(KEYCODE_RIGHT) PORT_NAME("CL")
+ PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_SLASH) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) PORT_NAME("9")
+
+ PORT_START("IN.1")
+ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_L) PORT_CODE(KEYCODE_SLASH_PAD) PORT_CODE(KEYCODE_LEFT) PORT_NAME(UTF8_DIVIDE)
+ PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_STOP) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("8")
+
+ PORT_START("IN.2")
+ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_K) PORT_CODE(KEYCODE_ASTERISK) PORT_CODE(KEYCODE_UP) PORT_NAME(UTF8_MULTIPLY)
+ PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_COMMA) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_CODE(KEYCODE_DOWN) PORT_NAME("7")
+
+ PORT_START("IN.3")
+ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_J) PORT_CODE(KEYCODE_MINUS_PAD) PORT_NAME("-=")
+ PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_M) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("6")
+
+ PORT_START("IN.4")
+ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_H) PORT_CODE(KEYCODE_PLUS_PAD) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("+=")
+ PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_N) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("5")
+
+ PORT_START("IN.5")
+ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_G) PORT_CODE(KEYCODE_DEL_PAD) PORT_NAME(".")
+ PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_B) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("4")
+
+ PORT_START("IN.6")
+ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_F) PORT_CODE(KEYCODE_MINUS) PORT_NAME("+/-")
+ PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_V) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("3")
+
+ PORT_START("IN.7")
+ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_D) PORT_CODE(KEYCODE_END) PORT_NAME("MR")
+ PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_C) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("2")
+
+ PORT_START("IN.8")
+ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_S) PORT_CODE(KEYCODE_HOME) PORT_NAME("MS")
+ PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_X) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("1")
+
+ PORT_START("IN.9")
+ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_A) PORT_CODE(KEYCODE_R) PORT_NAME("Return")
+ PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_Z) PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_0_PAD) PORT_NAME("0")
+INPUT_PORTS_END
+
+
+
+/******************************************************************************
+ Machine Configs
+******************************************************************************/
+
+void tgm_state::tgm(machine_config &config)
+{
+ /* basic machine hardware */
+ F8(config, m_maincpu, 4000000/2); // MK3870, frequency is approximate
+ m_maincpu->set_addrmap(AS_PROGRAM, &tgm_state::main_map);
+ m_maincpu->set_addrmap(AS_IO, &tgm_state::main_io);
+
+ f38t56_device &psu(F38T56(config, "psu", 4000000/2));
+ psu.write_a().set(FUNC(tgm_state::sound_w));
+ psu.write_b().set(FUNC(tgm_state::digit_w));
+
+ /* video hardware */
+ for (int i = 0; i < 12; i++)
+ TIMER(config, m_delay_display[i]).configure_generic(FUNC(tgm_state::delay_display));
+
+ config.set_default_layout(layout_tgm);
+
+ /* sound hardware */
+ SPEAKER(config, "speaker").front_center();
+ netlist_mame_sound_device &snd_nl(NETLIST_SOUND(config, "snd_nl", 48000));
+
+ snd_nl.set_constructor(netlist_nl_gamemachine);
+ snd_nl.add_route(ALL_OUTPUTS, "speaker", 1.0);
+
+ NETLIST_STREAM_OUTPUT(config, "snd_nl:cout0", 0, "SPK1.2").set_mult_offset(-10000.0, 10000.0 * 3.75);
+
+ NETLIST_LOGIC_INPUT(config, "snd_nl:p08", "P08.IN", 0);
+ NETLIST_LOGIC_INPUT(config, "snd_nl:p09", "P09.IN", 0);
+ NETLIST_LOGIC_INPUT(config, "snd_nl:p10", "P10.IN", 0);
+ NETLIST_LOGIC_INPUT(config, "snd_nl:p11", "P11.IN", 0);
+ NETLIST_LOGIC_INPUT(config, "snd_nl:p12", "P12.IN", 0);
+ NETLIST_LOGIC_INPUT(config, "snd_nl:p13", "P13.IN", 0);
+ NETLIST_LOGIC_INPUT(config, "snd_nl:p14", "P14.IN", 0);
+ NETLIST_LOGIC_INPUT(config, "snd_nl:p15", "P15.IN", 0);
+}
+
+
+
+/******************************************************************************
+ ROM Definitions
+******************************************************************************/
+
+ROM_START( 2001tgm )
+ ROM_REGION( 0x0800, "maincpu", 0 )
+ ROM_LOAD("mk14154n_2001", 0x0000, 0x0800, CRC(6d524c32) SHA1(73d84e59952b751c76dff8bf259b98e1f9136b41) )
+ROM_END
+
+} // anonymous namespace
+
+
+
+/******************************************************************************
+ Drivers
+******************************************************************************/
+
+// YEAR NAME PARENT CMP MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS
+COMP( 1978, 2001tgm, 0, 0, tgm, tgm, tgm_state, empty_init, "Waddingtons", "2001: The Game Machine", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND )
diff --git a/src/mame/drivers/gamepock.cpp b/src/mame/drivers/gamepock.cpp
index 098b1bb1f98..1b31660c55d 100644
--- a/src/mame/drivers/gamepock.cpp
+++ b/src/mame/drivers/gamepock.cpp
@@ -42,7 +42,8 @@ static INPUT_PORTS_START( gamepock )
INPUT_PORTS_END
-MACHINE_CONFIG_START(gamepock_state::gamepock)
+void gamepock_state::gamepock(machine_config &config)
+{
upd78c06_device &upd(UPD78C06(config, m_maincpu, 6_MHz_XTAL)); // uPD78C06AG
upd.set_addrmap(AS_PROGRAM, &gamepock_state::gamepock_mem);
upd.pa_out_cb().set(FUNC(gamepock_state::port_a_w));
@@ -65,11 +66,11 @@ MACHINE_CONFIG_START(gamepock_state::gamepock)
SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.50);
/* cartridge */
- MCFG_GENERIC_CARTSLOT_ADD("cartslot", generic_plain_slot, "gamepock_cart")
+ GENERIC_CARTSLOT(config, m_cart, generic_plain_slot, "gamepock_cart");
/* Software lists */
- MCFG_SOFTWARE_LIST_ADD("cart_list","gamepock")
-MACHINE_CONFIG_END
+ SOFTWARE_LIST(config, "cart_list").set_original("gamepock");
+}
ROM_START( gamepock )
diff --git a/src/mame/drivers/gammagic.cpp b/src/mame/drivers/gammagic.cpp
index da8ff25b76d..55e1477f347 100644
--- a/src/mame/drivers/gammagic.cpp
+++ b/src/mame/drivers/gammagic.cpp
@@ -131,21 +131,20 @@ void gammagic_state::machine_start()
}
MACHINE_CONFIG_START(gammagic_state::gammagic)
- MCFG_DEVICE_ADD("maincpu", PENTIUM, 133000000) // Intel Pentium 133
- MCFG_DEVICE_PROGRAM_MAP(gammagic_map)
- MCFG_DEVICE_IO_MAP(gammagic_io)
- MCFG_DEVICE_IRQ_ACKNOWLEDGE_DEVICE("pic8259_1", pic8259_device, inta_cb)
+ PENTIUM(config, m_maincpu, 133000000); // Intel Pentium 133
+ m_maincpu->set_addrmap(AS_PROGRAM, &gammagic_state::gammagic_map);
+ m_maincpu->set_addrmap(AS_IO, &gammagic_state::gammagic_io);
+ m_maincpu->set_irq_acknowledge_callback("pic8259_1", FUNC(pic8259_device::inta_cb));
pcat_common(config);
// I82371SB(config, "i82371sb", 0);
// MCFG_I82439TX_ADD("i82439tx", "maincpu", "user")
MCFG_PCI_BUS_LEGACY_ADD("pcibus", 0)
-// MCFG_PCI_BUS_DEVICE(0, "i82439tx", i82439tx_pci_read, i82439tx_pci_write)
-// MCFG_PCI_BUS_DEVICE(1, "i82371sb", i82371sb_pci_read, i82371sb_pci_write)
+// MCFG_PCI_BUS_LEGACY_DEVICE(0, "i82439tx", i82439tx_pci_read, i82439tx_pci_write)
+// MCFG_PCI_BUS_LEGACY_DEVICE(1, "i82371sb", i82371sb_pci_read, i82371sb_pci_write)
/* video hardware */
pcvideo_vga(config);
-
MACHINE_CONFIG_END
diff --git a/src/mame/drivers/gamtor.cpp b/src/mame/drivers/gamtor.cpp
index 0e756f2d3f3..02800959be0 100644
--- a/src/mame/drivers/gamtor.cpp
+++ b/src/mame/drivers/gamtor.cpp
@@ -85,23 +85,23 @@ INPUT_PORTS_END
-MACHINE_CONFIG_START(gaminator_state::gaminator)
- MCFG_DEVICE_ADD("maincpu", MCF5206E, 40000000) /* definitely Coldfire, model / clock uncertain */
- MCFG_DEVICE_PROGRAM_MAP(gaminator_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", gaminator_state, irq6_line_hold) // irq6 seems to be needed to get past the ROM checking
- MCFG_MCF5206E_PERIPHERAL_ADD("maincpu_onboard")
+void gaminator_state::gaminator(machine_config &config)
+{
+ MCF5206E(config, m_maincpu, 40000000); /* definitely Coldfire, model / clock uncertain */
+ m_maincpu->set_addrmap(AS_PROGRAM, &gaminator_state::gaminator_map);
+ m_maincpu->set_vblank_int("screen", FUNC(gaminator_state::irq6_line_hold)); // irq6 seems to be needed to get past the ROM checking
+ MCF5206E_PERIPHERAL(config, "maincpu_onboard", 0);
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_RAW_PARAMS(XTAL(25'174'800),900,0,640,526,0,480)
- MCFG_SCREEN_UPDATE_DEVICE("vga", gamtor_vga_device, screen_update)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_raw(XTAL(25'174'800),900,0,640,526,0,480);
+ screen.set_screen_update("vga", FUNC(gamtor_vga_device::screen_update));
- MCFG_DEVICE_ADD("vga", GAMTOR_VGA, 0)
- MCFG_VIDEO_SET_SCREEN("screen")
+ GAMTOR_VGA(config, "vga", 0).set_screen("screen");
SPEAKER(config, "lspeaker").front_left();
SPEAKER(config, "rspeaker").front_right();
/* unknown sound */
-MACHINE_CONFIG_END
+}
diff --git a/src/mame/drivers/gatron.cpp b/src/mame/drivers/gatron.cpp
index 69ba8132478..78c4691b1c3 100644
--- a/src/mame/drivers/gatron.cpp
+++ b/src/mame/drivers/gatron.cpp
@@ -450,7 +450,7 @@ void gatron_state::gat_map(address_map &map)
map(0x0000, 0x5fff).rom();
map(0x6000, 0x63ff).ram().w(FUNC(gatron_state::videoram_w)).share("videoram");
map(0x8000, 0x87ff).ram().share("nvram"); /* battery backed RAM */
- map(0xa000, 0xa000).w("snsnd", FUNC(sn76489_device::command_w)); /* PSG */
+ map(0xa000, 0xa000).w("snsnd", FUNC(sn76489_device::write)); /* PSG */
map(0xe000, 0xe000).w(FUNC(gatron_state::output_port_0_w)); /* lamps */
}
@@ -563,12 +563,12 @@ GFXDECODE_END
* Machine Drivers *
*************************/
-MACHINE_CONFIG_START(gatron_state::gat)
-
+void gatron_state::gat(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, CPU_CLOCK)
- MCFG_DEVICE_PROGRAM_MAP(gat_map)
- MCFG_DEVICE_IO_MAP(gat_portmap)
+ Z80(config, m_maincpu, CPU_CLOCK);
+ m_maincpu->set_addrmap(AS_PROGRAM, &gatron_state::gat_map);
+ m_maincpu->set_addrmap(AS_IO, &gatron_state::gat_portmap);
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
@@ -578,23 +578,22 @@ MACHINE_CONFIG_START(gatron_state::gat)
ppi.out_pc_callback().set(FUNC(gatron_state::output_port_1_w));
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(48*8, 16*16)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 48*8-1, 0*8, 16*16-1)
- MCFG_SCREEN_UPDATE_DRIVER(gatron_state, screen_update)
- MCFG_SCREEN_PALETTE("palette")
- MCFG_SCREEN_VBLANK_CALLBACK(INPUTLINE("maincpu", INPUT_LINE_NMI))
-
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_gat)
- MCFG_PALETTE_ADD("palette", 8)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(48*8, 16*16);
+ screen.set_visarea(0*8, 48*8-1, 0*8, 16*16-1);
+ screen.set_screen_update(FUNC(gatron_state::screen_update));
+ screen.set_palette("palette");
+ screen.screen_vblank().set_inputline(m_maincpu, INPUT_LINE_NMI);
+
+ GFXDECODE(config, m_gfxdecode, "palette", gfx_gat);
+ PALETTE(config, "palette").set_entries(8);
/* sound hardware */
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("snsnd", SN76489, MASTER_CLOCK/8 ) // Present in Bingo PCB. Clock need to be verified.
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 2.00)
-MACHINE_CONFIG_END
+ SN76489(config, "snsnd", MASTER_CLOCK/8).add_route(ALL_OUTPUTS, "mono", 2.00); // Present in Bingo PCB. Clock need to be verified.
+}
/*************************
diff --git a/src/mame/drivers/gauntlet.cpp b/src/mame/drivers/gauntlet.cpp
index f4ef4cec567..7f3f1b05ac5 100644
--- a/src/mame/drivers/gauntlet.cpp
+++ b/src/mame/drivers/gauntlet.cpp
@@ -488,42 +488,42 @@ GFXDECODE_END
*
*************************************/
-MACHINE_CONFIG_START(gauntlet_state::gauntlet_base)
-
+void gauntlet_state::gauntlet_base(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M68010, ATARI_CLOCK_14MHz/2)
- MCFG_DEVICE_PROGRAM_MAP(main_map)
+ M68010(config, m_maincpu, ATARI_CLOCK_14MHz/2);
+ m_maincpu->set_addrmap(AS_PROGRAM, &gauntlet_state::main_map);
- MCFG_DEVICE_ADD("audiocpu", M6502, ATARI_CLOCK_14MHz/8)
- MCFG_DEVICE_PROGRAM_MAP(sound_map)
+ M6502(config, m_audiocpu, ATARI_CLOCK_14MHz/8);
+ m_audiocpu->set_addrmap(AS_PROGRAM, &gauntlet_state::sound_map);
EEPROM_2804(config, "eeprom").lock_after_write(true);
WATCHDOG_TIMER(config, "watchdog");
/* video hardware */
- GFXDECODE(config, "gfxdecode", "palette", gfx_gauntlet);
+ GFXDECODE(config, m_gfxdecode, "palette", gfx_gauntlet);
PALETTE(config, "palette").set_format(palette_device::IRGB_4444, 1024);
- MCFG_TILEMAP_ADD_STANDARD("playfield", "gfxdecode", 2, gauntlet_state, get_playfield_tile_info, 8,8, SCAN_COLS, 64,64)
- MCFG_TILEMAP_ADD_STANDARD_TRANSPEN("alpha", "gfxdecode", 2, gauntlet_state, get_alpha_tile_info, 8,8, SCAN_ROWS, 64,32, 0)
+ TILEMAP(config, m_playfield_tilemap, m_gfxdecode, 2, 8,8, TILEMAP_SCAN_COLS, 64,64).set_info_callback(FUNC(gauntlet_state::get_playfield_tile_info));
+ TILEMAP(config, m_alpha_tilemap, m_gfxdecode, 2, 8,8, TILEMAP_SCAN_ROWS, 64,32, 0).set_info_callback(FUNC(gauntlet_state::get_alpha_tile_info));
ATARI_MOTION_OBJECTS(config, m_mob, 0, m_screen, gauntlet_state::s_mob_config);
m_mob->set_gfxdecode(m_gfxdecode);
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_VIDEO_ATTRIBUTES(VIDEO_UPDATE_BEFORE_VBLANK)
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_video_attributes(VIDEO_UPDATE_BEFORE_VBLANK);
/* note: these parameters are from published specs, not derived */
/* the board uses a SYNGEN chip to generate video signals */
- MCFG_SCREEN_RAW_PARAMS(ATARI_CLOCK_14MHz/2, 456, 0, 336, 262, 0, 240)
- MCFG_SCREEN_UPDATE_DRIVER(gauntlet_state, screen_update_gauntlet)
- MCFG_SCREEN_PALETTE("palette")
- MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE(*this, gauntlet_state, video_int_write_line))
+ m_screen->set_raw(ATARI_CLOCK_14MHz/2, 456, 0, 336, 262, 0, 240);
+ m_screen->set_screen_update(FUNC(gauntlet_state::screen_update_gauntlet));
+ m_screen->set_palette("palette");
+ m_screen->screen_vblank().set(FUNC(gauntlet_state::video_int_write_line));
/* sound hardware */
- ATARI_SOUND_COMM(config, "soundcomm", "audiocpu")
- .int_callback().set_inputline("maincpu", M68K_IRQ_6);
+ ATARI_SOUND_COMM(config, m_soundcomm, m_audiocpu)
+ .int_callback().set_inputline(m_maincpu, M68K_IRQ_6);
SPEAKER(config, "lspeaker").front_left();
SPEAKER(config, "rspeaker").front_right();
@@ -531,22 +531,22 @@ MACHINE_CONFIG_START(gauntlet_state::gauntlet_base)
m_ym2151->add_route(1, "lspeaker", 0.48);
m_ym2151->add_route(0, "rspeaker", 0.48);
- MCFG_DEVICE_ADD("pokey", POKEY, ATARI_CLOCK_14MHz/8)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 0.32)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 0.32)
+ POKEY(config, m_pokey, ATARI_CLOCK_14MHz/8);
+ m_pokey->add_route(ALL_OUTPUTS, "lspeaker", 0.32);
+ m_pokey->add_route(ALL_OUTPUTS, "rspeaker", 0.32);
- MCFG_DEVICE_ADD("tms", TMS5220C, ATARI_CLOCK_14MHz/2/11) /* potentially ATARI_CLOCK_14MHz/2/9 as well */
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 0.80)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 0.80)
+ TMS5220C(config, m_tms5220, ATARI_CLOCK_14MHz/2/11); /* potentially ATARI_CLOCK_14MHz/2/9 as well */
+ m_tms5220->add_route(ALL_OUTPUTS, "lspeaker", 0.80);
+ m_tms5220->add_route(ALL_OUTPUTS, "rspeaker", 0.80);
LS259(config, m_soundctl); // 16T/U
- m_soundctl->q_out_cb<0>().set("ymsnd", FUNC(ym2151_device::reset_w)); // music reset, low reset
- m_soundctl->q_out_cb<1>().set("tms", FUNC(tms5220_device::wsq_w)); // speech write, active low
- m_soundctl->q_out_cb<2>().set("tms", FUNC(tms5220_device::rsq_w)); // speech reset, active low
+ m_soundctl->q_out_cb<0>().set(m_ym2151, FUNC(ym2151_device::reset_w)); // music reset, low reset
+ m_soundctl->q_out_cb<1>().set(m_tms5220, FUNC(tms5220_device::wsq_w)); // speech write, active low
+ m_soundctl->q_out_cb<2>().set(m_tms5220, FUNC(tms5220_device::rsq_w)); // speech reset, active low
m_soundctl->q_out_cb<3>().set(FUNC(gauntlet_state::speech_squeak_w)); // speech squeak, low = 650 Hz
m_soundctl->q_out_cb<4>().set(FUNC(gauntlet_state::coin_counter_right_w));
m_soundctl->q_out_cb<5>().set(FUNC(gauntlet_state::coin_counter_left_w));
-MACHINE_CONFIG_END
+}
void gauntlet_state::gauntlet(machine_config & config)
@@ -1259,7 +1259,7 @@ ROM_START( gaunt2 )
ROM_LOAD( "136043-1119.16s", 0x008000, 0x008000, CRC(dc3591e7) SHA1(6d0d8493609974bd5a63be858b045fe4db35d8df) )
ROM_REGION( 0x04000, "gfx1", 0 )
- ROM_LOAD( "136043-1104.6p", 0x000000, 0x002000, CRC(1343cf6f) SHA1(4a9542bc8ede305e7e8f860eb4b47ca2f3017275) )
+ ROM_LOAD( "136043-1104.6p", 0x000000, 0x004000, CRC(bddc3dfc) SHA1(2e1279041ed62fb28ac8a8909e8fedab2556f39e) ) // second half 0x00
ROM_REGION( 0x60000, "gfx2", ROMREGION_INVERT )
ROM_LOAD( "136043-1111.1a", 0x000000, 0x008000, CRC(09df6e23) SHA1(726984275c6a338c12ec0c4cc449f92f4a7a138c) )
@@ -1280,9 +1280,9 @@ ROM_START( gaunt2 )
ROM_RELOAD( 0x05c000, 0x004000 )
ROM_REGION( 0x500, "proms", 0 )
- ROM_LOAD( "74s472-136037-101.7u", 0x000, 0x200, CRC(2964f76f) SHA1(da966c35557ec1b95e1c39cd950c38a19bce2d67) ) /* MO timing */
- ROM_LOAD( "74s472-136037-102.5l", 0x200, 0x200, CRC(4d4fec6c) SHA1(3541b5c6405ad5742a3121dfd6acb227933de25a) ) /* MO flip control */
- ROM_LOAD( "74s287-136037-103.4r", 0x400, 0x100, CRC(6c5ccf08) SHA1(ff5dbadd85aa2e07b383a302fa399e875db8f84f) ) /* MO position/size */
+ ROM_LOAD( "74s472-136037-101.7u", 0x000, 0x200, CRC(2964f76f) SHA1(da966c35557ec1b95e1c39cd950c38a19bce2d67) ) /* MO timing */
+ ROM_LOAD( "74s472-136037-102.5l", 0x200, 0x200, CRC(4d4fec6c) SHA1(3541b5c6405ad5742a3121dfd6acb227933de25a) ) /* MO flip control */
+ ROM_LOAD( "82s129-136043-1103.4r", 0x400, 0x100, CRC(32ae1fa9) SHA1(09eb56a0798456d73015909973ce2ba9660c1164) ) /* MO position/size */
ROM_END
@@ -1302,7 +1302,7 @@ ROM_START( gaunt2g )
ROM_LOAD( "136043-1119.16s", 0x008000, 0x008000, CRC(dc3591e7) SHA1(6d0d8493609974bd5a63be858b045fe4db35d8df) )
ROM_REGION( 0x04000, "gfx1", 0 )
- ROM_LOAD( "136043-1104.6p", 0x000000, 0x002000, CRC(1343cf6f) SHA1(4a9542bc8ede305e7e8f860eb4b47ca2f3017275) )
+ ROM_LOAD( "136043-1104.6p", 0x000000, 0x004000, CRC(bddc3dfc) SHA1(2e1279041ed62fb28ac8a8909e8fedab2556f39e) ) // second half 0x00
ROM_REGION( 0x60000, "gfx2", ROMREGION_INVERT )
ROM_LOAD( "136043-1111.1a", 0x000000, 0x008000, CRC(09df6e23) SHA1(726984275c6a338c12ec0c4cc449f92f4a7a138c) )
@@ -1323,9 +1323,9 @@ ROM_START( gaunt2g )
ROM_RELOAD( 0x05c000, 0x004000 )
ROM_REGION( 0x500, "proms", 0 )
- ROM_LOAD( "74s472-136037-101.7u", 0x000, 0x200, CRC(2964f76f) SHA1(da966c35557ec1b95e1c39cd950c38a19bce2d67) ) /* MO timing */
- ROM_LOAD( "74s472-136037-102.5l", 0x200, 0x200, CRC(4d4fec6c) SHA1(3541b5c6405ad5742a3121dfd6acb227933de25a) ) /* MO flip control */
- ROM_LOAD( "74s287-136037-103.4r", 0x400, 0x100, CRC(6c5ccf08) SHA1(ff5dbadd85aa2e07b383a302fa399e875db8f84f) ) /* MO position/size */
+ ROM_LOAD( "74s472-136037-101.7u", 0x000, 0x200, CRC(2964f76f) SHA1(da966c35557ec1b95e1c39cd950c38a19bce2d67) ) /* MO timing */
+ ROM_LOAD( "74s472-136037-102.5l", 0x200, 0x200, CRC(4d4fec6c) SHA1(3541b5c6405ad5742a3121dfd6acb227933de25a) ) /* MO flip control */
+ ROM_LOAD( "82s129-136043-1103.4r", 0x400, 0x100, CRC(32ae1fa9) SHA1(09eb56a0798456d73015909973ce2ba9660c1164) ) /* MO position/size */
ROM_END
@@ -1345,7 +1345,7 @@ ROM_START( gaunt22p )
ROM_LOAD( "136043-1119.16s", 0x008000, 0x008000, CRC(dc3591e7) SHA1(6d0d8493609974bd5a63be858b045fe4db35d8df) )
ROM_REGION( 0x04000, "gfx1", 0 )
- ROM_LOAD( "136043-1104.6p", 0x000000, 0x002000, CRC(1343cf6f) SHA1(4a9542bc8ede305e7e8f860eb4b47ca2f3017275) )
+ ROM_LOAD( "136043-1104.6p", 0x000000, 0x004000, CRC(bddc3dfc) SHA1(2e1279041ed62fb28ac8a8909e8fedab2556f39e) ) // second half 0x00
ROM_REGION( 0x60000, "gfx2", ROMREGION_INVERT )
ROM_LOAD( "136043-1111.1a", 0x000000, 0x008000, CRC(09df6e23) SHA1(726984275c6a338c12ec0c4cc449f92f4a7a138c) )
@@ -1366,9 +1366,9 @@ ROM_START( gaunt22p )
ROM_RELOAD( 0x05c000, 0x004000 )
ROM_REGION( 0x500, "proms", 0 )
- ROM_LOAD( "74s472-136037-101.7u", 0x000, 0x200, CRC(2964f76f) SHA1(da966c35557ec1b95e1c39cd950c38a19bce2d67) ) /* MO timing */
- ROM_LOAD( "74s472-136037-102.5l", 0x200, 0x200, CRC(4d4fec6c) SHA1(3541b5c6405ad5742a3121dfd6acb227933de25a) ) /* MO flip control */
- ROM_LOAD( "74s287-136037-103.4r", 0x400, 0x100, CRC(6c5ccf08) SHA1(ff5dbadd85aa2e07b383a302fa399e875db8f84f) ) /* MO position/size */
+ ROM_LOAD( "74s472-136037-101.7u", 0x000, 0x200, CRC(2964f76f) SHA1(da966c35557ec1b95e1c39cd950c38a19bce2d67) ) /* MO timing */
+ ROM_LOAD( "74s472-136037-102.5l", 0x200, 0x200, CRC(4d4fec6c) SHA1(3541b5c6405ad5742a3121dfd6acb227933de25a) ) /* MO flip control */
+ ROM_LOAD( "82s129-136043-1103.4r", 0x400, 0x100, CRC(32ae1fa9) SHA1(09eb56a0798456d73015909973ce2ba9660c1164) ) /* MO position/size */
ROM_END
@@ -1388,7 +1388,7 @@ ROM_START( gaunt22p1 )
ROM_LOAD( "136043-1119.16s", 0x008000, 0x008000, CRC(dc3591e7) SHA1(6d0d8493609974bd5a63be858b045fe4db35d8df) )
ROM_REGION( 0x04000, "gfx1", 0 )
- ROM_LOAD( "136043-1104.6p", 0x000000, 0x002000, CRC(1343cf6f) SHA1(4a9542bc8ede305e7e8f860eb4b47ca2f3017275) )
+ ROM_LOAD( "136043-1104.6p", 0x000000, 0x004000, CRC(bddc3dfc) SHA1(2e1279041ed62fb28ac8a8909e8fedab2556f39e) ) // second half 0x00
ROM_REGION( 0x60000, "gfx2", ROMREGION_INVERT )
ROM_LOAD( "136043-1111.1a", 0x000000, 0x008000, CRC(09df6e23) SHA1(726984275c6a338c12ec0c4cc449f92f4a7a138c) )
@@ -1409,9 +1409,9 @@ ROM_START( gaunt22p1 )
ROM_RELOAD( 0x05c000, 0x004000 )
ROM_REGION( 0x500, "proms", 0 )
- ROM_LOAD( "74s472-136037-101.7u", 0x000, 0x200, CRC(2964f76f) SHA1(da966c35557ec1b95e1c39cd950c38a19bce2d67) ) /* MO timing */
- ROM_LOAD( "74s472-136037-102.5l", 0x200, 0x200, CRC(4d4fec6c) SHA1(3541b5c6405ad5742a3121dfd6acb227933de25a) ) /* MO flip control */
- ROM_LOAD( "74s287-136037-103.4r", 0x400, 0x100, CRC(6c5ccf08) SHA1(ff5dbadd85aa2e07b383a302fa399e875db8f84f) ) /* MO position/size */
+ ROM_LOAD( "74s472-136037-101.7u", 0x000, 0x200, CRC(2964f76f) SHA1(da966c35557ec1b95e1c39cd950c38a19bce2d67) ) /* MO timing */
+ ROM_LOAD( "74s472-136037-102.5l", 0x200, 0x200, CRC(4d4fec6c) SHA1(3541b5c6405ad5742a3121dfd6acb227933de25a) ) /* MO flip control */
+ ROM_LOAD( "82s129-136043-1103.4r", 0x400, 0x100, CRC(32ae1fa9) SHA1(09eb56a0798456d73015909973ce2ba9660c1164) ) /* MO position/size */
ROM_END
@@ -1431,7 +1431,7 @@ ROM_START( gaunt22pg )
ROM_LOAD( "136043-1119.16s", 0x008000, 0x008000, CRC(dc3591e7) SHA1(6d0d8493609974bd5a63be858b045fe4db35d8df) )
ROM_REGION( 0x04000, "gfx1", 0 )
- ROM_LOAD( "136043-1104.6p", 0x000000, 0x002000, CRC(1343cf6f) SHA1(4a9542bc8ede305e7e8f860eb4b47ca2f3017275) )
+ ROM_LOAD( "136043-1104.6p", 0x000000, 0x004000, CRC(bddc3dfc) SHA1(2e1279041ed62fb28ac8a8909e8fedab2556f39e) ) // second half 0x00
ROM_REGION( 0x60000, "gfx2", ROMREGION_INVERT )
ROM_LOAD( "136043-1111.1a", 0x000000, 0x008000, CRC(09df6e23) SHA1(726984275c6a338c12ec0c4cc449f92f4a7a138c) )
@@ -1452,9 +1452,9 @@ ROM_START( gaunt22pg )
ROM_RELOAD( 0x05c000, 0x004000 )
ROM_REGION( 0x500, "proms", 0 )
- ROM_LOAD( "74s472-136037-101.7u", 0x000, 0x200, CRC(2964f76f) SHA1(da966c35557ec1b95e1c39cd950c38a19bce2d67) ) /* MO timing */
- ROM_LOAD( "74s472-136037-102.5l", 0x200, 0x200, CRC(4d4fec6c) SHA1(3541b5c6405ad5742a3121dfd6acb227933de25a) ) /* MO flip control */
- ROM_LOAD( "74s287-136037-103.4r", 0x400, 0x100, CRC(6c5ccf08) SHA1(ff5dbadd85aa2e07b383a302fa399e875db8f84f) ) /* MO position/size */
+ ROM_LOAD( "74s472-136037-101.7u", 0x000, 0x200, CRC(2964f76f) SHA1(da966c35557ec1b95e1c39cd950c38a19bce2d67) ) /* MO timing */
+ ROM_LOAD( "74s472-136037-102.5l", 0x200, 0x200, CRC(4d4fec6c) SHA1(3541b5c6405ad5742a3121dfd6acb227933de25a) ) /* MO flip control */
+ ROM_LOAD( "82s129-136043-1103.4r", 0x400, 0x100, CRC(32ae1fa9) SHA1(09eb56a0798456d73015909973ce2ba9660c1164) ) /* MO position/size */
ROM_END
diff --git a/src/mame/drivers/gb.cpp b/src/mame/drivers/gb.cpp
index b7219a8633b..ec88044b7e9 100644
--- a/src/mame/drivers/gb.cpp
+++ b/src/mame/drivers/gb.cpp
@@ -289,7 +289,7 @@ space. This mapper uses 32KB sized banks.
READ8_MEMBER(gb_state::gb_cart_r)
{
if (m_bios_disable && m_cartslot)
- return m_cartslot->read_rom(space, offset);
+ return m_cartslot->read_rom(offset);
else
{
if (offset < 0x100)
@@ -309,7 +309,7 @@ READ8_MEMBER(gb_state::gb_cart_r)
}
else if (m_cartslot)
{
- return m_cartslot->read_rom(space, offset);
+ return m_cartslot->read_rom(offset);
}
else
return 0xff;
@@ -319,7 +319,7 @@ READ8_MEMBER(gb_state::gb_cart_r)
READ8_MEMBER(gb_state::gbc_cart_r)
{
if (m_bios_disable && m_cartslot)
- return m_cartslot->read_rom(space, offset);
+ return m_cartslot->read_rom(offset);
else
{
if (offset < 0x100)
@@ -344,7 +344,7 @@ READ8_MEMBER(gb_state::gbc_cart_r)
}
else if (m_cartslot)
{
- return m_cartslot->read_rom(space, offset);
+ return m_cartslot->read_rom(offset);
}
else
return 0xff;
@@ -354,13 +354,13 @@ READ8_MEMBER(gb_state::gbc_cart_r)
WRITE8_MEMBER(gb_state::gb_bank_w)
{
if (m_cartslot)
- m_cartslot->write_bank(space, offset, data);
+ m_cartslot->write_bank(offset, data);
}
READ8_MEMBER(gb_state::gb_ram_r)
{
if (m_cartslot)
- return m_cartslot->read_ram(space, offset);
+ return m_cartslot->read_ram(offset);
else
return 0xff;
}
@@ -368,7 +368,7 @@ READ8_MEMBER(gb_state::gb_ram_r)
WRITE8_MEMBER(gb_state::gb_ram_w)
{
if (m_cartslot)
- m_cartslot->write_ram(space, offset, data);
+ m_cartslot->write_ram(offset, data);
}
READ8_MEMBER(gb_state::gb_echo_r)
@@ -384,7 +384,7 @@ WRITE8_MEMBER(gb_state::gb_echo_w)
READ8_MEMBER(megaduck_state::cart_r)
{
if (m_cartslot)
- return m_cartslot->read_rom(space, offset);
+ return m_cartslot->read_rom(offset);
else
return 0xff;
}
@@ -392,13 +392,13 @@ READ8_MEMBER(megaduck_state::cart_r)
WRITE8_MEMBER(megaduck_state::bank1_w)
{
if (m_cartslot)
- m_cartslot->write_bank(space, offset, data);
+ m_cartslot->write_bank(offset, data);
}
WRITE8_MEMBER(megaduck_state::bank2_w)
{
if (m_cartslot)
- m_cartslot->write_ram(space, offset, data); /* used for bankswitch, but we re-use GB name */
+ m_cartslot->write_ram(offset, data); /* used for bankswitch, but we re-use GB name */
}
diff --git a/src/mame/drivers/gba.cpp b/src/mame/drivers/gba.cpp
index e1cfdf6f537..fa351f8e558 100644
--- a/src/mame/drivers/gba.cpp
+++ b/src/mame/drivers/gba.cpp
@@ -1430,37 +1430,37 @@ static void gba_cart(device_slot_interface &device)
}
-MACHINE_CONFIG_START(gba_state::gbadv)
-
- MCFG_DEVICE_ADD("maincpu", ARM7, XTAL(16'777'216))
- MCFG_DEVICE_PROGRAM_MAP(gba_map)
+void gba_state::gbadv(machine_config &config)
+{
+ ARM7(config, m_maincpu, XTAL(16'777'216));
+ m_maincpu->set_addrmap(AS_PROGRAM, &gba_state::gba_map);
- MCFG_GBA_LCD_ADD("lcd")
- MCFG_GBA_LCD_INT_HBLANK(WRITELINE(*this, gba_state, int_hblank_callback))
- MCFG_GBA_LCD_INT_VBLANK(WRITELINE(*this, gba_state, int_vblank_callback))
- MCFG_GBA_LCD_INT_VCOUNT(WRITELINE(*this, gba_state, int_vcount_callback))
- MCFG_GBA_LCD_DMA_HBLANK(WRITELINE(*this, gba_state, dma_hblank_callback))
- MCFG_GBA_LCD_DMA_VBLANK(WRITELINE(*this, gba_state, dma_vblank_callback))
+ gba_lcd_device &lcd(GBA_LCD(config, "lcd", 0));
+ lcd.int_hblank_callback().set(FUNC(gba_state::int_hblank_callback));
+ lcd.int_vblank_callback().set(FUNC(gba_state::int_vblank_callback));
+ lcd.int_vcount_callback().set(FUNC(gba_state::int_vcount_callback));
+ lcd.dma_hblank_callback().set(FUNC(gba_state::dma_hblank_callback));
+ lcd.dma_vblank_callback().set(FUNC(gba_state::dma_vblank_callback));
SPEAKER(config, "lspeaker").front_left();
SPEAKER(config, "rspeaker").front_right();
- MCFG_DEVICE_ADD("custom", CGB04_APU, XTAL(16'777'216)/4)
- MCFG_SOUND_ROUTE(0, "lspeaker", 0.5)
- MCFG_SOUND_ROUTE(1, "rspeaker", 0.5)
-
- MCFG_DEVICE_ADD("ldaca", DAC_8BIT_R2R_TWOS_COMPLEMENT, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 0.5) // unknown DAC
- MCFG_DEVICE_ADD("rdaca", DAC_8BIT_R2R_TWOS_COMPLEMENT, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 0.5) // unknown DAC
- MCFG_DEVICE_ADD("ldacb", DAC_8BIT_R2R_TWOS_COMPLEMENT, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 0.5) // unknown DAC
- MCFG_DEVICE_ADD("rdacb", DAC_8BIT_R2R_TWOS_COMPLEMENT, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 0.5) // unknown DAC
- MCFG_DEVICE_ADD("vref", VOLTAGE_REGULATOR, 0) MCFG_VOLTAGE_REGULATOR_OUTPUT(5.0)
- MCFG_SOUND_ROUTE(0, "ldaca", 1.0, DAC_VREF_POS_INPUT) MCFG_SOUND_ROUTE(0, "ldaca", -1.0, DAC_VREF_NEG_INPUT)
- MCFG_SOUND_ROUTE(0, "rdaca", 1.0, DAC_VREF_POS_INPUT) MCFG_SOUND_ROUTE(0, "rdaca", -1.0, DAC_VREF_NEG_INPUT)
- MCFG_SOUND_ROUTE(0, "ldacb", 1.0, DAC_VREF_POS_INPUT) MCFG_SOUND_ROUTE(0, "ldacb", -1.0, DAC_VREF_NEG_INPUT)
- MCFG_SOUND_ROUTE(0, "rdacb", 1.0, DAC_VREF_POS_INPUT) MCFG_SOUND_ROUTE(0, "rdacb", -1.0, DAC_VREF_NEG_INPUT)
-
- MCFG_GBA_CARTRIDGE_ADD("cartslot", gba_cart, nullptr)
- MCFG_SOFTWARE_LIST_ADD("cart_list","gba")
-MACHINE_CONFIG_END
+ CGB04_APU(config, m_gbsound, XTAL(16'777'216)/4);
+ m_gbsound->add_route(0, "lspeaker", 0.5);
+ m_gbsound->add_route(1, "rspeaker", 0.5);
+
+ DAC_8BIT_R2R_TWOS_COMPLEMENT(config, m_ldaca, 0).add_route(ALL_OUTPUTS, "lspeaker", 0.5); // unknown DAC
+ DAC_8BIT_R2R_TWOS_COMPLEMENT(config, m_rdaca, 0).add_route(ALL_OUTPUTS, "rspeaker", 0.5); // unknown DAC
+ DAC_8BIT_R2R_TWOS_COMPLEMENT(config, m_ldacb, 0).add_route(ALL_OUTPUTS, "lspeaker", 0.5); // unknown DAC
+ DAC_8BIT_R2R_TWOS_COMPLEMENT(config, m_rdacb, 0).add_route(ALL_OUTPUTS, "rspeaker", 0.5); // unknown DAC
+ voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref", 0));
+ vref.add_route(0, "ldaca", 1.0, DAC_VREF_POS_INPUT); vref.add_route(0, "ldaca", -1.0, DAC_VREF_NEG_INPUT);
+ vref.add_route(0, "rdaca", 1.0, DAC_VREF_POS_INPUT); vref.add_route(0, "rdaca", -1.0, DAC_VREF_NEG_INPUT);
+ vref.add_route(0, "ldacb", 1.0, DAC_VREF_POS_INPUT); vref.add_route(0, "ldacb", -1.0, DAC_VREF_NEG_INPUT);
+ vref.add_route(0, "rdacb", 1.0, DAC_VREF_POS_INPUT); vref.add_route(0, "rdacb", -1.0, DAC_VREF_NEG_INPUT);
+
+ GBA_CART_SLOT(config, m_cart, gba_cart, nullptr);
+ SOFTWARE_LIST(config, "cart_list").set_original("gba");
+}
ROM_START( gba )
diff --git a/src/mame/drivers/gberet.cpp b/src/mame/drivers/gberet.cpp
index 51f1e7048bb..c361e9e33af 100644
--- a/src/mame/drivers/gberet.cpp
+++ b/src/mame/drivers/gberet.cpp
@@ -227,7 +227,7 @@ void gberet_state::gberetb_map(address_map &map)
map(0xe900, 0xe9ff).ram().share("spriteram");
map(0xf000, 0xf000).nopw(); // coin counter not supported
map(0xf200, 0xf200).portr("DSW2");
- map(0xf400, 0xf400).w(m_sn, FUNC(sn76489a_device::command_w));
+ map(0xf400, 0xf400).w(m_sn, FUNC(sn76489a_device::write));
map(0xf600, 0xf600).portr("P2");
map(0xf601, 0xf601).portr("DSW1");
map(0xf602, 0xf602).portr("P1");
@@ -408,25 +408,25 @@ MACHINE_RESET_MEMBER(gberet_state,gberet)
m_spritebank = 0;
}
-MACHINE_CONFIG_START(gberet_state::gberet)
-
+void gberet_state::gberet(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, XTAL(18'432'000)/6) // X1S (generated by a custom IC)
- MCFG_DEVICE_PROGRAM_MAP(gberet_map)
- MCFG_TIMER_DRIVER_ADD_SCANLINE("scantimer", gberet_state, gberet_interrupt_tick, "screen", 0, 16)
+ Z80(config, m_maincpu, XTAL(18'432'000)/6); // X1S (generated by a custom IC)
+ m_maincpu->set_addrmap(AS_PROGRAM, &gberet_state::gberet_map);
+ TIMER(config, "scantimer").configure_scanline(FUNC(gberet_state::gberet_interrupt_tick), "screen", 0, 16);
WATCHDOG_TIMER(config, "watchdog");
MCFG_MACHINE_START_OVERRIDE(gberet_state,gberet)
MCFG_MACHINE_RESET_OVERRIDE(gberet_state,gberet)
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60.60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(32*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(1*8, 31*8-1, 2*8, 30*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(gberet_state, screen_update_gberet)
- MCFG_SCREEN_PALETTE(m_palette)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60.60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(32*8, 32*8);
+ screen.set_visarea(1*8, 31*8-1, 2*8, 30*8-1);
+ screen.set_screen_update(FUNC(gberet_state::screen_update_gberet));
+ screen.set_palette(m_palette);
GFXDECODE(config, m_gfxdecode, m_palette, gfx_gberet);
PALETTE(config, m_palette, FUNC(gberet_state::gberet_palette), 2*16*16, 32);
@@ -435,37 +435,36 @@ MACHINE_CONFIG_START(gberet_state::gberet)
/* sound hardware */
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("snsnd", SN76489A, XTAL(18'432'000)/12) /* type verified on real and bootleg pcb */
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
-MACHINE_CONFIG_END
+ SN76489A(config, m_sn, XTAL(18'432'000)/12).add_route(ALL_OUTPUTS, "mono", 1.0); /* type verified on real and bootleg pcb */
+}
-MACHINE_CONFIG_START(gberet_state::mrgoemon)
+void gberet_state::mrgoemon(machine_config &config)
+{
gberet(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(mrgoemon_map)
-MACHINE_CONFIG_END
-
-MACHINE_CONFIG_START(gberet_state::gberetb)
+ m_maincpu->set_addrmap(AS_PROGRAM, &gberet_state::mrgoemon_map);
+}
+void gberet_state::gberetb(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, XTAL(20'000'000)/4) // divider guessed
- MCFG_DEVICE_PROGRAM_MAP(gberetb_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", gberet_state, irq0_line_assert)
- MCFG_DEVICE_PERIODIC_INT_DRIVER(gberet_state, nmi_line_assert, XTAL(20'000'000)/0x8000) // divider guessed
+ Z80(config, m_maincpu, XTAL(20'000'000)/4); // divider guessed
+ m_maincpu->set_addrmap(AS_PROGRAM, &gberet_state::gberetb_map);
+ m_maincpu->set_vblank_int("screen", FUNC(gberet_state::irq0_line_assert));
+ m_maincpu->set_periodic_int(FUNC(gberet_state::nmi_line_assert), attotime::from_hz(XTAL(20'000'000)/0x8000)); // divider guessed
MCFG_MACHINE_START_OVERRIDE(gberet_state,gberet)
MCFG_MACHINE_RESET_OVERRIDE(gberet_state,gberet)
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(32*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(1*8, 31*8-1, 2*8, 30*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(gberet_state, screen_update_gberetb)
- MCFG_SCREEN_PALETTE(m_palette)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(32*8, 32*8);
+ screen.set_visarea(1*8, 31*8-1, 2*8, 30*8-1);
+ screen.set_screen_update(FUNC(gberet_state::screen_update_gberetb));
+ screen.set_palette(m_palette);
GFXDECODE(config, m_gfxdecode, m_palette, gfx_gberetb);
PALETTE(config, m_palette, FUNC(gberet_state::gberet_palette), 2*16*16, 32);
@@ -474,9 +473,8 @@ MACHINE_CONFIG_START(gberet_state::gberetb)
/* sound hardware */
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("snsnd", SN76489A, XTAL(20'000'000)/12) // divider guessed
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
-MACHINE_CONFIG_END
+ SN76489A(config, m_sn, XTAL(20'000'000)/12).add_route(ALL_OUTPUTS, "mono", 1.0); // divider guessed
+}
/*************************************
diff --git a/src/mame/drivers/gcpinbal.cpp b/src/mame/drivers/gcpinbal.cpp
index 9b02f4a3d76..72ca5c21482 100644
--- a/src/mame/drivers/gcpinbal.cpp
+++ b/src/mame/drivers/gcpinbal.cpp
@@ -352,26 +352,26 @@ void gcpinbal_state::machine_reset()
m_msm_bank = 0;
}
-MACHINE_CONFIG_START(gcpinbal_state::gcpinbal)
-
+void gcpinbal_state::gcpinbal(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M68000, 32_MHz_XTAL/2) /* 16 MHz */
- MCFG_DEVICE_PROGRAM_MAP(gcpinbal_map)
+ M68000(config, m_maincpu, 32_MHz_XTAL/2); /* 16 MHz */
+ m_maincpu->set_addrmap(AS_PROGRAM, &gcpinbal_state::gcpinbal_map);
- MCFG_TIMER_DRIVER_ADD_SCANLINE("scantimer", gcpinbal_state, scanline_cb, "screen", 0, 1)
+ TIMER(config, "scantimer").configure_scanline(FUNC(gcpinbal_state::scanline_cb), "screen", 0, 1);
EEPROM_93C46_16BIT(config, "eeprom");
- MCFG_DEVICE_ADD("watchdog", MB3773, 0)
+ MB3773(config, m_watchdog, 0);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0) /* frames per second, vblank duration */)
- MCFG_SCREEN_SIZE(40*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 40*8-1, 2*8, 30*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(gcpinbal_state, screen_update_gcpinbal)
- MCFG_SCREEN_PALETTE(m_palette)
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_refresh_hz(60);
+ m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(0) /* frames per second, vblank duration */);
+ m_screen->set_size(40*8, 32*8);
+ m_screen->set_visarea(0*8, 40*8-1, 2*8, 30*8-1);
+ m_screen->set_screen_update(FUNC(gcpinbal_state::screen_update_gcpinbal));
+ m_screen->set_palette(m_palette);
GFXDECODE(config, m_gfxdecode, m_palette, gfx_gcpinbal);
PALETTE(config, m_palette).set_format(palette_device::RRRRGGGGBBBBRGBx, 4096);
@@ -381,8 +381,7 @@ MACHINE_CONFIG_START(gcpinbal_state::gcpinbal)
/* sound hardware */
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("oki", OKIM6295, 1.056_MHz_XTAL, okim6295_device::PIN7_HIGH)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.30)
+ OKIM6295(config, m_oki, 1.056_MHz_XTAL, okim6295_device::PIN7_HIGH).add_route(ALL_OUTPUTS, "mono", 0.30);
ES8712(config, m_essnd, 0);
m_essnd->reset_handler().set_inputline("maincpu", 3);
@@ -393,7 +392,7 @@ MACHINE_CONFIG_START(gcpinbal_state::gcpinbal)
msm.vck_legacy_callback().set("essnd", FUNC(es8712_device::msm_int));
msm.set_prescaler_selector(msm6585_device::S40); /* 16 kHz */
msm.add_route(ALL_OUTPUTS, "mono", 1.0);
-MACHINE_CONFIG_END
+}
diff --git a/src/mame/drivers/gei.cpp b/src/mame/drivers/gei.cpp
index 38935e17f2c..f6726c18c9d 100644
--- a/src/mame/drivers/gei.cpp
+++ b/src/mame/drivers/gei.cpp
@@ -978,19 +978,20 @@ INTERRUPT_GEN_MEMBER(gei_state::vblank_irq)
}
-MACHINE_CONFIG_START(gei_state::getrivia)
- MCFG_DEVICE_ADD("maincpu",Z80,4000000) /* 4 MHz */
- MCFG_DEVICE_PROGRAM_MAP(getrivia_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", gei_state, vblank_irq)
+void gei_state::getrivia(machine_config &config)
+{
+ Z80(config, m_maincpu, 4000000); /* 4 MHz */
+ m_maincpu->set_addrmap(AS_PROGRAM, &gei_state::getrivia_map);
+ m_maincpu->set_vblank_int("screen", FUNC(gei_state::vblank_irq));
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_UPDATE_DRIVER(gei_state, screen_update)
- MCFG_SCREEN_SIZE(512, 256)
- MCFG_SCREEN_VISIBLE_AREA(48, 511-48, 16, 255-16)
- MCFG_SCREEN_PALETTE("palette")
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_refresh_hz(60);
+ m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ m_screen->set_screen_update(FUNC(gei_state::screen_update));
+ m_screen->set_size(512, 256);
+ m_screen->set_visarea(48, 511-48, 16, 255-16);
+ m_screen->set_palette("palette");
PALETTE(config, "palette", palette_device::GBR_3BIT);
@@ -1006,99 +1007,99 @@ MACHINE_CONFIG_START(gei_state::getrivia)
m_ppi[1]->out_pb_callback().set(FUNC(gei_state::lamps_w));
m_ppi[1]->out_pc_callback().set(FUNC(gei_state::lamps2_w));
- MCFG_TICKET_DISPENSER_ADD("ticket", attotime::from_msec(100), TICKET_MOTOR_ACTIVE_HIGH, TICKET_STATUS_ACTIVE_HIGH)
+ TICKET_DISPENSER(config, m_ticket, attotime::from_msec(100), TICKET_MOTOR_ACTIVE_HIGH, TICKET_STATUS_ACTIVE_HIGH);
/* sound hardware */
SPEAKER(config, "speaker").front_center();
- MCFG_DEVICE_ADD("dac", DAC_1BIT, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 0.99)
- MCFG_DEVICE_ADD("vref", VOLTAGE_REGULATOR, 0) MCFG_VOLTAGE_REGULATOR_OUTPUT(5.0)
- MCFG_SOUND_ROUTE(0, "dac", 1.0, DAC_VREF_POS_INPUT)
-MACHINE_CONFIG_END
+ DAC_1BIT(config, m_dac, 0).add_route(ALL_OUTPUTS, "speaker", 0.99);
+ voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref", 0));
+ vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT);
+}
-MACHINE_CONFIG_START(gei_state::findout)
+void gei_state::findout(machine_config &config)
+{
getrivia(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(findout_map)
+ m_maincpu->set_addrmap(AS_PROGRAM, &gei_state::findout_map);
m_ppi[1]->in_pc_callback().set(FUNC(gei_state::portC_r));
m_ppi[1]->out_pc_callback().set_nop();
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(gei_state::quizvid)
+void gei_state::quizvid(machine_config &config)
+{
findout(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(quizvid_map)
+ m_maincpu->set_addrmap(AS_PROGRAM, &gei_state::quizvid_map);
PALETTE(config.replace(), "palette", palette_device::GRB_3BIT);
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(gei_state::gselect)
+void gei_state::gselect(machine_config &config)
+{
getrivia(config);
/* basic machine hardware */
- MCFG_DEVICE_REMOVE("ticket")
+ config.device_remove("ticket");
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(gselect_map)
+ m_maincpu->set_addrmap(AS_PROGRAM, &gei_state::gselect_map);
m_ppi[0]->out_pc_callback().set(FUNC(gei_state::sound2_w));
m_ppi[1]->in_pc_callback().set_ioport("IN2");
m_ppi[1]->out_pc_callback().set(FUNC(gei_state::nmi_w));
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(gei_state::jokpokera)
+void gei_state::jokpokera(machine_config &config)
+{
getrivia(config);
/* basic machine hardware */
- MCFG_DEVICE_REMOVE("ticket")
+ config.device_remove("ticket");
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(gselect_map)
-MACHINE_CONFIG_END
+ m_maincpu->set_addrmap(AS_PROGRAM, &gei_state::gselect_map);
+}
-MACHINE_CONFIG_START(gei_state::amuse)
+void gei_state::amuse(machine_config &config)
+{
getrivia(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(amuse_map)
-MACHINE_CONFIG_END
+ m_maincpu->set_addrmap(AS_PROGRAM, &gei_state::amuse_map);
+}
-MACHINE_CONFIG_START(gei_state::gepoker)
+void gei_state::gepoker(machine_config &config)
+{
getrivia(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(gepoker_map)
-MACHINE_CONFIG_END
+ m_maincpu->set_addrmap(AS_PROGRAM, &gei_state::gepoker_map);
+}
-MACHINE_CONFIG_START(gei_state::amuse1)
+void gei_state::amuse1(machine_config &config)
+{
getrivia(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(amuse1_map)
-MACHINE_CONFIG_END
+ m_maincpu->set_addrmap(AS_PROGRAM, &gei_state::amuse1_map);
+}
-MACHINE_CONFIG_START(gei_state::suprpokr)
+void gei_state::suprpokr(machine_config &config)
+{
getrivia(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(suprpokr_map)
-MACHINE_CONFIG_END
+ m_maincpu->set_addrmap(AS_PROGRAM, &gei_state::suprpokr_map);
+}
-MACHINE_CONFIG_START(gei_state::sprtauth)
+void gei_state::sprtauth(machine_config &config)
+{
getrivia(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(sprtauth_map)
-MACHINE_CONFIG_END
+ m_maincpu->set_addrmap(AS_PROGRAM, &gei_state::sprtauth_map);
+}
/***************************************************
diff --git a/src/mame/drivers/geneve.cpp b/src/mame/drivers/geneve.cpp
index d0849d802be..dac68a00d45 100644
--- a/src/mame/drivers/geneve.cpp
+++ b/src/mame/drivers/geneve.cpp
@@ -230,11 +230,11 @@ public:
private:
// CRU (Communication Register Unit) handling
- DECLARE_READ8_MEMBER(cruread);
- DECLARE_WRITE8_MEMBER(cruwrite);
+ uint8_t cruread(offs_t offset);
+ void cruwrite(offs_t offset, uint8_t data);
// Connections with the system interface TMS9901
- DECLARE_READ8_MEMBER(read_by_9901);
+ uint8_t read_by_9901(offs_t offset);
DECLARE_WRITE_LINE_MEMBER(peripheral_bus_reset);
DECLARE_WRITE_LINE_MEMBER(VDP_reset);
DECLARE_WRITE_LINE_MEMBER(joystick_select);
@@ -244,9 +244,9 @@ private:
DECLARE_WRITE_LINE_MEMBER(clock_out);
DECLARE_WRITE_LINE_MEMBER(dbin_line);
- DECLARE_WRITE8_MEMBER(external_operation);
+ void external_operation(offs_t offset, uint8_t data);
- DECLARE_WRITE8_MEMBER(tms9901_interrupt);
+ void tms9901_interrupt(offs_t offset, uint8_t data);
DECLARE_WRITE_LINE_MEMBER( keyboard_interrupt );
@@ -306,11 +306,8 @@ void geneve_state::memmap_setoffset(address_map &map)
*/
void geneve_state::crumap(address_map &map)
{
- map(0x0000, 0x0fff).r(FUNC(geneve_state::cruread));
- map(0x0000, 0x0003).r(m_tms9901, FUNC(tms9901_device::read));
-
- map(0x0000, 0x7fff).w(FUNC(geneve_state::cruwrite));
- map(0x0000, 0x001f).w(m_tms9901, FUNC(tms9901_device::write));
+ map(0x0000, 0xffff).rw(FUNC(geneve_state::cruread), FUNC(geneve_state::cruwrite));
+ map(0x0000, 0x003f).rw(m_tms9901, FUNC(tms9901_device::read), FUNC(tms9901_device::write));
}
static INPUT_PORTS_START(geneve_common)
@@ -360,7 +357,7 @@ INPUT_PORTS_END
#define CRU_CONTROL_BASE 0x1ee0
#define CRU_SSTEP_BASE 0x13c0
-WRITE8_MEMBER ( geneve_state::cruwrite )
+void geneve_state::cruwrite(offs_t offset, uint8_t data)
{
int addroff = offset << 1;
@@ -427,14 +424,14 @@ WRITE8_MEMBER ( geneve_state::cruwrite )
}
else
{
- m_peribox->cruwrite(space, addroff, data);
+ m_peribox->cruwrite(addroff, data);
}
}
-READ8_MEMBER( geneve_state::cruread )
+uint8_t geneve_state::cruread(offs_t offset)
{
uint8_t value = 0;
- int addroff = offset << 4;
+ uint16_t addroff = offset << 1;
// Single step
// 13c0 - 13fe: 0001 0011 11xx xxx0
@@ -449,7 +446,7 @@ READ8_MEMBER( geneve_state::cruread )
// so we just don't arrive here
// Propagate the CRU access to external devices
- m_peribox->crureadz(space, addroff, &value);
+ m_peribox->crureadz(addroff, &value);
return value;
}
@@ -457,7 +454,7 @@ READ8_MEMBER( geneve_state::cruread )
CRU callbacks
***********************************************************************/
-READ8_MEMBER( geneve_state::read_by_9901 )
+uint8_t geneve_state::read_by_9901(offs_t offset)
{
int answer = 0;
@@ -565,7 +562,7 @@ WRITE_LINE_MEMBER( geneve_state::video_wait_states )
but again it is ignored. Anyway, the TMS9995 has only two external inputs
(INT1 and INT4).
*/
-WRITE8_MEMBER( geneve_state::tms9901_interrupt )
+void geneve_state::tms9901_interrupt(offs_t offset, uint8_t data)
{
/* INTREQ is connected to INT1. */
m_cpu->set_input_line(INT_9995_INT1, data);
@@ -635,7 +632,7 @@ WRITE_LINE_MEMBER( geneve_state::keyboard_interrupt )
m_tms9901->set_single_int(8, state);
}
-WRITE8_MEMBER( geneve_state::external_operation )
+void geneve_state::external_operation(offs_t offset, uint8_t data)
{
static char const *const extop[8] = { "inv1", "inv2", "IDLE", "RSET", "inv3", "CKON", "CKOF", "LREX" };
if (offset != IDLE_OP)
@@ -647,6 +644,7 @@ WRITE8_MEMBER( geneve_state::external_operation )
*/
WRITE_LINE_MEMBER( geneve_state::clock_out )
{
+ m_tms9901->phi_line(state);
m_mapper->clock_in(state);
}
@@ -694,7 +692,8 @@ void geneve_state::machine_reset()
m_joyport->write_port(0x01); // select Joystick 1
}
-MACHINE_CONFIG_START(geneve_state::geneve)
+void geneve_state::geneve(machine_config &config)
+{
geneve_common(config);
// Mapper
@@ -706,9 +705,10 @@ MACHINE_CONFIG_START(geneve_state::geneve)
m_peribox->inta_cb().set(FUNC(geneve_state::inta));
m_peribox->intb_cb().set(FUNC(geneve_state::intb));
m_peribox->ready_cb().set(FUNC(geneve_state::ext_ready));
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(geneve_state::genmod)
+void geneve_state::genmod(machine_config &config)
+{
geneve_common(config);
// Mapper
@@ -720,9 +720,10 @@ MACHINE_CONFIG_START(geneve_state::genmod)
m_peribox->inta_cb().set(FUNC(geneve_state::inta));
m_peribox->intb_cb().set(FUNC(geneve_state::intb));
m_peribox->ready_cb().set(FUNC(geneve_state::ext_ready));
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(geneve_state::geneve_common)
+void geneve_state::geneve_common(machine_config &config)
+{
// basic machine hardware
// TMS9995 CPU @ 12.0 MHz
TMS9995(config, m_cpu, 12000000);
@@ -749,7 +750,7 @@ MACHINE_CONFIG_START(geneve_state::geneve_common)
screen.set_screen_update(TI_VDP_TAG, FUNC(v99x8_device::screen_update));
// Main board components
- TMS9901(config, m_tms9901, 3000000);
+ TMS9901(config, m_tms9901, 0);
m_tms9901->read_cb().set(FUNC(geneve_state::read_by_9901));
m_tms9901->p_out_cb(0).set(FUNC(geneve_state::peripheral_bus_reset));
m_tms9901->p_out_cb(1).set(FUNC(geneve_state::VDP_reset));
@@ -785,7 +786,7 @@ MACHINE_CONFIG_START(geneve_state::geneve_common)
// SRAM 384K (max; stock Geneve: 32K, but later MDOS releases require 64K)
RAM(config, GENEVE_SRAM_TAG).set_default_size("384K").set_default_value(0);
-MACHINE_CONFIG_END
+}
/*
ROM loading
diff --git a/src/mame/drivers/geniusiq.cpp b/src/mame/drivers/geniusiq.cpp
index fc916f4daf7..ea3d83e356b 100644
--- a/src/mame/drivers/geniusiq.cpp
+++ b/src/mame/drivers/geniusiq.cpp
@@ -700,18 +700,18 @@ DEVICE_IMAGE_UNLOAD_MEMBER(geniusiq_state,iq128_cart)
MACHINE_CONFIG_START(geniusiq_state::iq128)
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M68000, XTAL(32'000'000)/2) // The main crystal is at 32MHz, not sure whats the CPU freq
- MCFG_DEVICE_PROGRAM_MAP(geniusiq_mem)
- MCFG_DEVICE_PERIODIC_INT_DRIVER(geniusiq_state, irq6_line_hold, 125) // the internal clock is increased by 1 sec every 125 interrupts
+ M68000(config, m_maincpu, XTAL(32'000'000)/2); // The main crystal is at 32MHz, not sure whats the CPU freq
+ m_maincpu->set_addrmap(AS_PROGRAM, &geniusiq_state::geniusiq_mem);
+ m_maincpu->set_periodic_int(FUNC(geniusiq_state::irq6_line_hold), attotime::from_hz(125)); // the internal clock is increased by 1 sec every 125 interrupts
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(50)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */
- MCFG_SCREEN_SIZE(512, 256)
- MCFG_SCREEN_VISIBLE_AREA(0, 512-1, 0, 256-1)
- MCFG_SCREEN_UPDATE_DRIVER( geniusiq_state, screen_update )
- MCFG_SCREEN_PALETTE("palette")
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(50);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */
+ screen.set_size(512, 256);
+ screen.set_visarea_full();
+ screen.set_screen_update(FUNC(geniusiq_state::screen_update));
+ screen.set_palette("palette");
PALETTE(config, "palette", FUNC(geniusiq_state::geniusiq_palette), 16);
@@ -724,7 +724,7 @@ MACHINE_CONFIG_START(geniusiq_state::iq128)
MCFG_GENERIC_UNLOAD(geniusiq_state, iq128_cart)
/* Software lists */
- MCFG_SOFTWARE_LIST_ADD("cart_list", "iq128")
+ SOFTWARE_LIST(config, "cart_list").set_original("iq128");
MACHINE_CONFIG_END
void geniusiq_state::iqtv512(machine_config &config)
diff --git a/src/mame/drivers/genpc.cpp b/src/mame/drivers/genpc.cpp
index e6fc7c16bc0..da5d14d25b9 100644
--- a/src/mame/drivers/genpc.cpp
+++ b/src/mame/drivers/genpc.cpp
@@ -54,63 +54,62 @@ static DEVICE_INPUT_DEFAULTS_START(vga)
DEVICE_INPUT_DEFAULTS("DSW0",0x30, 0x00)
DEVICE_INPUT_DEFAULTS_END
-MACHINE_CONFIG_START(genpc_state::pcmda)
+void genpc_state::pcmda(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", I8088, 4772720)
- MCFG_DEVICE_PROGRAM_MAP(pc8_map)
- MCFG_DEVICE_IO_MAP(pc8_io)
- MCFG_DEVICE_IRQ_ACKNOWLEDGE_DEVICE("mb:pic8259", pic8259_device, inta_cb)
+ I8088(config, m_maincpu, 4772720);
+ m_maincpu->set_addrmap(AS_PROGRAM, &genpc_state::pc8_map);
+ m_maincpu->set_addrmap(AS_IO, &genpc_state::pc8_io);
+ m_maincpu->set_irq_acknowledge_callback("mb:pic8259", FUNC(pic8259_device::inta_cb));
- MCFG_IBM5160_MOTHERBOARD_ADD("mb","maincpu")
+ IBM5160_MOTHERBOARD(config, "mb", 0).set_cputag(m_maincpu);
- MCFG_DEVICE_ADD("isa1", ISA8_SLOT, 0, "mb:isa", pc_isa8_cards, "mda", false) // FIXME: determine ISA bus clock
- MCFG_DEVICE_ADD("isa2", ISA8_SLOT, 0, "mb:isa", pc_isa8_cards, "com", false)
- MCFG_DEVICE_ADD("isa3", ISA8_SLOT, 0, "mb:isa", pc_isa8_cards, "fdc_xt", false)
- MCFG_DEVICE_ADD("isa4", ISA8_SLOT, 0, "mb:isa", pc_isa8_cards, "hdc", false)
- MCFG_DEVICE_ADD("isa5", ISA8_SLOT, 0, "mb:isa", pc_isa8_cards, "adlib", false)
- MCFG_DEVICE_ADD("isa6", ISA8_SLOT, 0, "mb:isa", pc_isa8_cards, nullptr, false)
+ ISA8_SLOT(config, "isa1", 0, "mb:isa", pc_isa8_cards, "mda", false); // FIXME: determine ISA bus clock
+ ISA8_SLOT(config, "isa2", 0, "mb:isa", pc_isa8_cards, "com", false);
+ ISA8_SLOT(config, "isa3", 0, "mb:isa", pc_isa8_cards, "fdc_xt", false);
+ ISA8_SLOT(config, "isa4", 0, "mb:isa", pc_isa8_cards, "hdc", false);
+ ISA8_SLOT(config, "isa5", 0, "mb:isa", pc_isa8_cards, "adlib", false);
+ ISA8_SLOT(config, "isa6", 0, "mb:isa", pc_isa8_cards, nullptr, false);
/* keyboard */
- MCFG_PC_KBDC_SLOT_ADD("mb:pc_kbdc", "kbd", pc_xt_keyboards, STR_KBD_IBM_PC_XT_83)
+ PC_KBDC_SLOT(config, "kbd", pc_xt_keyboards, STR_KBD_IBM_PC_XT_83).set_pc_kbdc_slot(subdevice("mb:pc_kbdc"));
/* internal ram */
RAM(config, RAM_TAG).set_default_size("640K").set_extra_options("64K, 128K, 256K, 512K");
/* software lists */
- MCFG_SOFTWARE_LIST_ADD("disk_list","ibm5150")
-MACHINE_CONFIG_END
+ SOFTWARE_LIST(config, "disk_list").set_original("ibm5150");
+}
-MACHINE_CONFIG_START(genpc_state::pcherc)
+void genpc_state::pcherc(machine_config &config)
+{
pcmda(config);
- MCFG_DEVICE_MODIFY("isa1")
- MCFG_DEVICE_SLOT_INTERFACE(pc_isa8_cards, "hercules", false)
-MACHINE_CONFIG_END
+ subdevice<isa8_slot_device>("isa1")->set_default_option("hercules");
+}
-MACHINE_CONFIG_START(genpc_state::pccga)
+void genpc_state::pccga(machine_config &config)
+{
pcmda(config);
- MCFG_DEVICE_MODIFY("mb")
- MCFG_DEVICE_INPUT_DEFAULTS(cga)
- MCFG_DEVICE_MODIFY("isa1")
- MCFG_DEVICE_SLOT_INTERFACE(pc_isa8_cards, "cga", false)
-MACHINE_CONFIG_END
+ subdevice<ibm5160_mb_device>("mb")->set_input_default(DEVICE_INPUT_DEFAULTS_NAME(cga));
+ subdevice<isa8_slot_device>("isa1")->set_default_option("cga");
+}
-MACHINE_CONFIG_START(genpc_state::pcega)
+void genpc_state::pcega(machine_config &config)
+{
pccga(config);
- MCFG_DEVICE_MODIFY("isa1")
- MCFG_DEVICE_SLOT_INTERFACE(pc_isa8_cards, "ega", false)
- MCFG_DEVICE_MODIFY("mb")
- MCFG_DEVICE_INPUT_DEFAULTS(vga)
-MACHINE_CONFIG_END
+ subdevice<isa8_slot_device>("isa1")->set_default_option("ega");
+ subdevice<ibm5160_mb_device>("mb")->set_input_default(DEVICE_INPUT_DEFAULTS_NAME(vga));
+}
-MACHINE_CONFIG_START(genpc_state::pcvga)
+void genpc_state::pcvga(machine_config &config)
+{
pcega(config);
- MCFG_DEVICE_MODIFY("isa1")
- MCFG_DEVICE_SLOT_INTERFACE(pc_isa8_cards, "vga", false)
-MACHINE_CONFIG_END
+ subdevice<isa8_slot_device>("isa1")->set_default_option("vga");
+}
ROM_START(pc)
ROM_REGION(0x02000, "bios", 0)
diff --git a/src/mame/drivers/ggconnie.cpp b/src/mame/drivers/ggconnie.cpp
index 4507667f359..0bb0e881fda 100644
--- a/src/mame/drivers/ggconnie.cpp
+++ b/src/mame/drivers/ggconnie.cpp
@@ -37,20 +37,33 @@ public:
: pce_common_state(mconfig, type, tag)
, m_rtc(*this, "rtc")
, m_oki(*this, "oki")
+ , m_okibank(*this, "okibank")
{ }
void ggconnie(machine_config &config);
+protected:
+ virtual void machine_start() override;
+
private:
DECLARE_WRITE8_MEMBER(lamp_w);
DECLARE_WRITE8_MEMBER(output_w);
DECLARE_WRITE8_MEMBER(oki_bank_w);
void sgx_io(address_map &map);
void sgx_mem(address_map &map);
+ void oki_map(address_map &map);
+
required_device <msm6242_device> m_rtc;
required_device <okim6295_device> m_oki;
+ required_memory_bank m_okibank;
};
+
+void ggconnie_state::machine_start()
+{
+ m_okibank->configure_entries(0, 8, memregion("oki")->base(), 0x10000);
+}
+
WRITE8_MEMBER(ggconnie_state::lamp_w)
{
output().set_value("lamp", !BIT(data,0));
@@ -61,10 +74,11 @@ WRITE8_MEMBER(ggconnie_state::output_w)
// written in "Output Test" in test mode
}
-/* TODO: banking not understood (is the ROM dumped correctly btw?) */
+// TODO: banking not understood for ggconnie (writes to 0x01f7400-03 range, while smf only to 00). Is the ROM dumped correctly btw?
WRITE8_MEMBER(ggconnie_state::oki_bank_w)
{
- m_oki->set_rom_bank(data != 0);
+ m_okibank->set_entry(data & 0x07);
+ // popmessage("offset: %02x, bank: %02x\n", offset, data);
}
@@ -78,7 +92,7 @@ void ggconnie_state::sgx_mem(address_map &map)
map(0x1f7100, 0x1f7100).portr("SWB");
map(0x1f7200, 0x1f7200).portr("SWC");
map(0x1f7300, 0x1f7300).rw(m_oki, FUNC(okim6295_device::read), FUNC(okim6295_device::write));
- map(0x1f7400, 0x1f74ff).w(FUNC(ggconnie_state::oki_bank_w));
+ map(0x1f7400, 0x1f7403).w(FUNC(ggconnie_state::oki_bank_w));
map(0x1f7500, 0x1f750f).rw(m_rtc, FUNC(msm6242_device::read), FUNC(msm6242_device::write));
map(0x1f7700, 0x1f7700).portr("IN1");
map(0x1f7800, 0x1f7800).w(FUNC(ggconnie_state::output_w));
@@ -93,6 +107,11 @@ void ggconnie_state::sgx_io(address_map &map)
map(0x00, 0x03).rw("huc6202", FUNC(huc6202_device::io_read), FUNC(huc6202_device::io_write));
}
+void ggconnie_state::oki_map(address_map &map)
+{
+ map(0x00000, 0x0ffff).bankr(m_okibank);
+ map(0x10000, 0x3ffff).rom().region("oki", 0);
+}
static INPUT_PORTS_START(ggconnie)
PORT_START("IN0")
@@ -262,7 +281,8 @@ static INPUT_PORTS_START(smf)
INPUT_PORTS_END
-MACHINE_CONFIG_START(ggconnie_state::ggconnie)
+void ggconnie_state::ggconnie(machine_config &config)
+{
/* basic machine hardware */
H6280(config, m_maincpu, PCE_MAIN_CLOCK/3);
m_maincpu->set_addrmap(AS_PROGRAM, &ggconnie_state::sgx_mem);
@@ -273,45 +293,49 @@ MACHINE_CONFIG_START(ggconnie_state::ggconnie)
m_maincpu->add_route(1, "rspeaker", 1.00);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_RAW_PARAMS(PCE_MAIN_CLOCK/3, huc6260_device::WPF, 64, 64 + 1024 + 64, huc6260_device::LPF, 18, 18 + 242)
- MCFG_SCREEN_UPDATE_DRIVER( ggconnie_state, screen_update )
- MCFG_SCREEN_PALETTE("huc6260")
-
- MCFG_DEVICE_ADD("huc6260", HUC6260, PCE_MAIN_CLOCK/3)
- MCFG_HUC6260_NEXT_PIXEL_DATA_CB(READ16("huc6202", huc6202_device, next_pixel))
- MCFG_HUC6260_TIME_TIL_NEXT_EVENT_CB(READ16("huc6202", huc6202_device, time_until_next_event))
- MCFG_HUC6260_VSYNC_CHANGED_CB(WRITELINE("huc6202", huc6202_device, vsync_changed))
- MCFG_HUC6260_HSYNC_CHANGED_CB(WRITELINE("huc6202", huc6202_device, hsync_changed))
- MCFG_DEVICE_ADD( "huc6270_0", HUC6270, 0 )
- MCFG_HUC6270_VRAM_SIZE(0x10000)
- MCFG_HUC6270_IRQ_CHANGED_CB(INPUTLINE("maincpu", 0))
- MCFG_DEVICE_ADD( "huc6270_1", HUC6270, 0 )
- MCFG_HUC6270_VRAM_SIZE(0x10000)
- MCFG_HUC6270_IRQ_CHANGED_CB(INPUTLINE("maincpu", 0))
- MCFG_DEVICE_ADD( "huc6202", HUC6202, 0 )
- MCFG_HUC6202_NEXT_PIXEL_0_CB(READ16("huc6270_0", huc6270_device, next_pixel))
- MCFG_HUC6202_TIME_TIL_NEXT_EVENT_0_CB(READ16("huc6270_0", huc6270_device, time_until_next_event))
- MCFG_HUC6202_VSYNC_CHANGED_0_CB(WRITELINE("huc6270_0", huc6270_device, vsync_changed))
- MCFG_HUC6202_HSYNC_CHANGED_0_CB(WRITELINE("huc6270_0", huc6270_device, hsync_changed))
- MCFG_HUC6202_READ_0_CB(READ8("huc6270_0", huc6270_device, read))
- MCFG_HUC6202_WRITE_0_CB(WRITE8("huc6270_0", huc6270_device, write))
- MCFG_HUC6202_NEXT_PIXEL_1_CB(READ16("huc6270_1", huc6270_device, next_pixel))
- MCFG_HUC6202_TIME_TIL_NEXT_EVENT_1_CB(READ16("huc6270_1", huc6270_device, time_until_next_event))
- MCFG_HUC6202_VSYNC_CHANGED_1_CB(WRITELINE("huc6270_1", huc6270_device, vsync_changed))
- MCFG_HUC6202_HSYNC_CHANGED_1_CB(WRITELINE("huc6270_1", huc6270_device, hsync_changed))
- MCFG_HUC6202_READ_1_CB(READ8("huc6270_1", huc6270_device, read))
- MCFG_HUC6202_WRITE_1_CB(WRITE8("huc6270_1", huc6270_device, write))
-
- MCFG_DEVICE_ADD("rtc", MSM6242, XTAL(32'768))
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_raw(PCE_MAIN_CLOCK, huc6260_device::WPF, 64, 64 + 1024 + 64, huc6260_device::LPF, 18, 18 + 242);
+ screen.set_screen_update(FUNC(ggconnie_state::screen_update));
+ screen.set_palette(m_huc6260);
+
+ HUC6260(config, m_huc6260, PCE_MAIN_CLOCK);
+ m_huc6260->next_pixel_data().set("huc6202", FUNC(huc6202_device::next_pixel));
+ m_huc6260->time_til_next_event().set("huc6202", FUNC(huc6202_device::time_until_next_event));
+ m_huc6260->vsync_changed().set("huc6202", FUNC(huc6202_device::vsync_changed));
+ m_huc6260->hsync_changed().set("huc6202", FUNC(huc6202_device::hsync_changed));
+
+ huc6270_device &huc6270_0(HUC6270(config, "huc6270_0", 0));
+ huc6270_0.set_vram_size(0x10000);
+ huc6270_0.irq().set_inputline(m_maincpu, 0);
+
+ huc6270_device &huc6270_1(HUC6270(config, "huc6270_1", 0));
+ huc6270_1.set_vram_size(0x10000);
+ huc6270_1.irq().set_inputline(m_maincpu, 0);
+
+ huc6202_device &huc6202(HUC6202(config, "huc6202", 0 ));
+ huc6202.next_pixel_0_callback().set("huc6270_0", FUNC(huc6270_device::next_pixel));
+ huc6202.time_til_next_event_0_callback().set("huc6270_0", FUNC(huc6270_device::time_until_next_event));
+ huc6202.vsync_changed_0_callback().set("huc6270_0", FUNC(huc6270_device::vsync_changed));
+ huc6202.hsync_changed_0_callback().set("huc6270_0", FUNC(huc6270_device::hsync_changed));
+ huc6202.read_0_callback().set("huc6270_0", FUNC(huc6270_device::read));
+ huc6202.write_0_callback().set("huc6270_0", FUNC(huc6270_device::write));
+ huc6202.next_pixel_1_callback().set("huc6270_1", FUNC(huc6270_device::next_pixel));
+ huc6202.time_til_next_event_1_callback().set("huc6270_1", FUNC(huc6270_device::time_until_next_event));
+ huc6202.vsync_changed_1_callback().set("huc6270_1", FUNC(huc6270_device::vsync_changed));
+ huc6202.hsync_changed_1_callback().set("huc6270_1", FUNC(huc6270_device::hsync_changed));
+ huc6202.read_1_callback().set("huc6270_1", FUNC(huc6270_device::read));
+ huc6202.write_1_callback().set("huc6270_1", FUNC(huc6270_device::write));
+
+ MSM6242(config, m_rtc, XTAL(32'768));
SPEAKER(config, "lspeaker").front_left();
SPEAKER(config, "rspeaker").front_right();
- MCFG_DEVICE_ADD("oki", OKIM6295, PCE_MAIN_CLOCK/12, okim6295_device::PIN7_HIGH) /* unknown clock / pin 7 */
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 1.00)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 1.00)
-MACHINE_CONFIG_END
+ OKIM6295(config, m_oki, PCE_MAIN_CLOCK/12, okim6295_device::PIN7_HIGH); /* unknown clock / pin 7 */
+ m_oki->set_addrmap(0, &ggconnie_state::oki_map);
+ m_oki->add_route(ALL_OUTPUTS, "lspeaker", 1.00);
+ m_oki->add_route(ALL_OUTPUTS, "rspeaker", 1.00);
+}
ROM_START(ggconnie)
ROM_REGION( 0x180000, "maincpu", 0 )
@@ -323,7 +347,7 @@ ROM_START(ggconnie)
ROM_LOAD( "adpcm_u31.bin", 0x00000, 0x80000, CRC(de514c2b) SHA1(da73aa825d73646f556f6d4dbb46f43acf7c3357) )
ROM_END
-// TODO: runs too slow (seems to run ok removing the /3 divider), OKI banking, hopper, lamps
+// TODO: verify OKI banking, hopper, lamps
ROM_START(smf)
ROM_REGION( 0x180000, "maincpu", 0 )
ROM_LOAD( "smf03.u3", 0x000000, 0x80000, CRC(2435ff3d) SHA1(4de1c5c2ed4ce2be5f3bb3fd31e176c8e24c7155) ) // 27c040
diff --git a/src/mame/drivers/ghosteo.cpp b/src/mame/drivers/ghosteo.cpp
index f893214d78c..2ef6214f5f8 100644
--- a/src/mame/drivers/ghosteo.cpp
+++ b/src/mame/drivers/ghosteo.cpp
@@ -93,6 +93,7 @@ public:
, m_maincpu(*this, "maincpu")
, m_i2cmem(*this, "i2cmem")
, m_s3c2410(*this, "s3c2410")
+ , m_qs1000(*this, "qs1000")
, m_soundlatch(*this, "soundlatch")
, m_system_memory(*this, "systememory")
, m_flash(*this, "flash")
@@ -110,6 +111,7 @@ private:
required_device<cpu_device> m_maincpu;
required_device<i2cmem_device> m_i2cmem;
required_device<s3c2410_device> m_s3c2410;
+ required_device<qs1000_device> m_qs1000;
required_device<generic_latch_8_device> m_soundlatch;
required_shared_ptr<uint32_t> m_system_memory;
required_region_ptr<uint8_t> m_flash;
@@ -592,7 +594,7 @@ READ32_MEMBER(ghosteo_state::bballoon_speedup_r)
void ghosteo_state::machine_start()
{
// Set up the QS1000 program ROM banking, taking care not to overlap the internal RAM
- machine().device("qs1000:cpu")->memory().space(AS_IO).install_read_bank(0x0100, 0xffff, "bank");
+ m_qs1000->cpu().space(AS_IO).install_read_bank(0x0100, 0xffff, "bank");
membank("qs1000:bank")->configure_entries(0, 8, memregion("qs1000:cpu")->base()+0x100, 0x10000);
}
@@ -640,17 +642,17 @@ void ghosteo_state::ghosteo(machine_config &config)
SPEAKER(config, "rspeaker").front_right();
GENERIC_LATCH_8(config, m_soundlatch);
- m_soundlatch->data_pending_callback().set("qs1000", FUNC(qs1000_device::set_irq));
+ m_soundlatch->data_pending_callback().set(m_qs1000, FUNC(qs1000_device::set_irq));
m_soundlatch->set_separate_acknowledge(true);
- qs1000_device &qs1000(QS1000(config, "qs1000", XTAL(24'000'000)));
- qs1000.set_external_rom(true);
- qs1000.p1_in().set("soundlatch", FUNC(generic_latch_8_device::read));
- qs1000.p1_out().set(FUNC(ghosteo_state::qs1000_p1_w));
- qs1000.p2_out().set(FUNC(ghosteo_state::qs1000_p2_w));
- qs1000.p3_out().set(FUNC(ghosteo_state::qs1000_p3_w));
- qs1000.add_route(0, "lspeaker", 1.0);
- qs1000.add_route(1, "rspeaker", 1.0);
+ QS1000(config, m_qs1000, XTAL(24'000'000));
+ m_qs1000->set_external_rom(true);
+ m_qs1000->p1_in().set("soundlatch", FUNC(generic_latch_8_device::read));
+ m_qs1000->p1_out().set(FUNC(ghosteo_state::qs1000_p1_w));
+ m_qs1000->p2_out().set(FUNC(ghosteo_state::qs1000_p2_w));
+ m_qs1000->p3_out().set(FUNC(ghosteo_state::qs1000_p3_w));
+ m_qs1000->add_route(0, "lspeaker", 1.0);
+ m_qs1000->add_route(1, "rspeaker", 1.0);
}
void ghosteo_state::bballoon(machine_config &config)
diff --git a/src/mame/drivers/giclassic.cpp b/src/mame/drivers/giclassic.cpp
index 0e06edbaa0b..7e0c2a7377e 100644
--- a/src/mame/drivers/giclassic.cpp
+++ b/src/mame/drivers/giclassic.cpp
@@ -295,21 +295,21 @@ void giclassicsvr_state::machine_reset()
{
}
-MACHINE_CONFIG_START(giclassic_state::giclassic)
-
+void giclassic_state::giclassic(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M68000, XTAL(20'000'000) / 2) // PCB is marked "68000 12 MHz", but only visible osc is 20 MHz
- MCFG_DEVICE_PROGRAM_MAP(satellite_main)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", giclassic_state, giclassic_interrupt)
+ M68000(config, m_maincpu, XTAL(20'000'000) / 2); // PCB is marked "68000 12 MHz", but only visible osc is 20 MHz
+ m_maincpu->set_addrmap(AS_PROGRAM, &giclassic_state::satellite_main);
+ m_maincpu->set_vblank_int("screen", FUNC(giclassic_state::giclassic_interrupt));
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(59.62)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(600, 384)
- MCFG_SCREEN_VISIBLE_AREA(0, 599, 0, 383)
- MCFG_SCREEN_UPDATE_DRIVER(giclassic_state, screen_update_giclassic)
- MCFG_SCREEN_PALETTE(m_palette)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(59.62);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(600, 384);
+ screen.set_visarea_full();
+ screen.set_screen_update(FUNC(giclassic_state::screen_update_giclassic));
+ screen.set_palette(m_palette);
PALETTE(config, m_palette).set_format(palette_device::xBGR_444, 256);
m_palette->enable_shadows();
@@ -318,23 +318,22 @@ MACHINE_CONFIG_START(giclassic_state::giclassic)
m_k056832->set_tile_callback(FUNC(giclassic_state::tile_callback), this);
m_k056832->set_config("gfx1", K056832_BPP_4PIRATESH, 1, 0);
m_k056832->set_palette(m_palette);
-MACHINE_CONFIG_END
-
-MACHINE_CONFIG_START(giclassicsvr_state::giclassvr)
+}
+void giclassicsvr_state::giclassvr(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M68000, XTAL(16'000'000)) // unknown speed
- MCFG_DEVICE_PROGRAM_MAP(server_main)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", giclassicsvr_state, giclassicsvr_interrupt)
+ M68000(config, m_maincpu, XTAL(16'000'000)); // unknown speed
+ m_maincpu->set_addrmap(AS_PROGRAM, &giclassicsvr_state::server_main);
+ m_maincpu->set_vblank_int("screen", FUNC(giclassicsvr_state::giclassicsvr_interrupt));
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(59.62)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(600, 384)
- MCFG_SCREEN_VISIBLE_AREA(0, 599, 0, 383)
- MCFG_SCREEN_UPDATE_DRIVER(giclassicsvr_state, screen_update_giclassicsvr)
- MCFG_SCREEN_PALETTE(m_palette)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(59.62);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_visarea_full();
+ screen.set_screen_update(FUNC(giclassicsvr_state::screen_update_giclassicsvr));
+ screen.set_palette(m_palette);
PALETTE(config, m_palette).set_format(palette_device::xBGR_444, 16384);
m_palette->enable_shadows();
@@ -351,7 +350,7 @@ MACHINE_CONFIG_START(giclassicsvr_state::giclassvr)
K053252(config, "k053252a", XTAL(32'000'000)/4).set_offsets(40, 16); // TODO
K053252(config, "k053252b", XTAL(32'000'000)/4).set_offsets(40, 16); // TODO
-MACHINE_CONFIG_END
+}
ROM_START( giclasex )
ROM_REGION( 0x80000, "maincpu", 0 ) /* main program */
diff --git a/src/mame/drivers/gimix.cpp b/src/mame/drivers/gimix.cpp
index 9bb836521ca..172067f6c6a 100644
--- a/src/mame/drivers/gimix.cpp
+++ b/src/mame/drivers/gimix.cpp
@@ -481,14 +481,15 @@ static void gimix_floppies(device_slot_interface &device)
device.option_add("8dd", FLOPPY_8_DSDD);
}
-MACHINE_CONFIG_START(gimix_state::gimix)
+void gimix_state::gimix(machine_config &config)
+{
// basic machine hardware
- MCFG_DEVICE_ADD("maincpu", MC6809, 8_MHz_XTAL)
- MCFG_DEVICE_PROGRAM_MAP(gimix_mem)
+ MC6809(config, m_maincpu, 8_MHz_XTAL);
+ m_maincpu->set_addrmap(AS_PROGRAM, &gimix_state::gimix_mem);
/* rtc */
- MCFG_DEVICE_ADD("rtc", MM58167, 32.768_kHz_XTAL)
- MCFG_MM58167_IRQ_CALLBACK(WRITELINE(*this, gimix_state,irq_w))
+ mm58167_device &rtc(MM58167(config, "rtc", 32.768_kHz_XTAL));
+ rtc.irq().set(FUNC(gimix_state::irq_w));
/* timer */
ptm6840_device &ptm(PTM6840(config, "timer", 2'000'000)); // clock is a guess
@@ -499,8 +500,8 @@ MACHINE_CONFIG_START(gimix_state::gimix)
m_fdc->intrq_wr_callback().set(FUNC(gimix_state::fdc_irq_w));
m_fdc->drq_wr_callback().set(FUNC(gimix_state::fdc_drq_w));
m_fdc->set_force_ready(true);
- MCFG_FLOPPY_DRIVE_ADD("fdc:0", gimix_floppies, "525hd", gimix_state::floppy_formats)
- MCFG_FLOPPY_DRIVE_ADD("fdc:1", gimix_floppies, "525hd", gimix_state::floppy_formats)
+ FLOPPY_CONNECTOR(config, "fdc:0", gimix_floppies, "525hd", gimix_state::floppy_formats);
+ FLOPPY_CONNECTOR(config, "fdc:1", gimix_floppies, "525hd", gimix_state::floppy_formats);
/* parallel ports */
pia6821_device &pia1(PIA6821(config, "pia1", 2'000'000));
@@ -559,12 +560,12 @@ MACHINE_CONFIG_START(gimix_state::gimix)
/* internal ram */
RAM(config, RAM_TAG).set_default_size("128K").set_extra_options("56K,256K,512K");
- MCFG_SOFTWARE_LIST_ADD("flop_list","gimix")
+ SOFTWARE_LIST(config, "flop_list").set_original("gimix");
// uncomment this timer to use a hack that generates a regular IRQ, this will get OS-9 to boot
// for some unknown reason, OS-9 does not touch the 6840, and only clears/disables IRQs on the RTC
- //MCFG_TIMER_DRIVER_ADD_PERIODIC("test_timer",gimix_state,test_timer_w,attotime::from_msec(100))
-MACHINE_CONFIG_END
+ //TIMER(config, "test_timer").configure_periodic(FUNC(gimix_state::test_timer_w), attotime::from_msec(100));
+}
ROM_START( gimix )
ROM_REGION( 0x10000, "roms", 0)
diff --git a/src/mame/drivers/ginganin.cpp b/src/mame/drivers/ginganin.cpp
index e8953a789e4..6e41e76af36 100644
--- a/src/mame/drivers/ginganin.cpp
+++ b/src/mame/drivers/ginganin.cpp
@@ -245,15 +245,15 @@ WRITE_LINE_MEMBER(ginganin_state::ptm_irq)
}
-MACHINE_CONFIG_START(ginganin_state::ginganin)
-
+void ginganin_state::ginganin(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M68000, MAIN_CLOCK)
- MCFG_DEVICE_PROGRAM_MAP(ginganin_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", ginganin_state, irq1_line_hold) /* ? (vectors 1-7 cointain the same address) */
+ M68000(config, m_maincpu, MAIN_CLOCK);
+ m_maincpu->set_addrmap(AS_PROGRAM, &ginganin_state::ginganin_map);
+ m_maincpu->set_vblank_int("screen", FUNC(ginganin_state::irq1_line_hold)); /* ? (vectors 1-7 contain the same address) */
- MCFG_DEVICE_ADD("audiocpu", MC6809, SOUND_CLOCK) // MBL68B09?
- MCFG_DEVICE_PROGRAM_MAP(sound_map)
+ MC6809(config, m_audiocpu, SOUND_CLOCK); // MBL68B09?
+ m_audiocpu->set_addrmap(AS_PROGRAM, &ginganin_state::sound_map);
ptm6840_device &ptm(PTM6840(config, "6840ptm", SOUND_CLOCK/2));
@@ -261,15 +261,15 @@ MACHINE_CONFIG_START(ginganin_state::ginganin)
ptm.o1_callback().set(FUNC(ginganin_state::ptm_irq));
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(256, 256)
- MCFG_SCREEN_VISIBLE_AREA(0, 255, 0 + 16 , 255 - 16)
- MCFG_SCREEN_UPDATE_DRIVER(ginganin_state, screen_update_ginganin)
- MCFG_SCREEN_PALETTE(m_palette)
-
- MCFG_DEVICE_ADD(m_gfxdecode, GFXDECODE, m_palette, gfx_ginganin)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(256, 256);
+ screen.set_visarea(0, 255, 0 + 16 , 255 - 16);
+ screen.set_screen_update(FUNC(ginganin_state::screen_update_ginganin));
+ screen.set_palette(m_palette);
+
+ GFXDECODE(config, m_gfxdecode, m_palette, gfx_ginganin);
PALETTE(config, m_palette).set_format(palette_device::RGBx_444, 1024);
/* sound hardware */
@@ -279,9 +279,8 @@ MACHINE_CONFIG_START(ginganin_state::ginganin)
YM2149(config, "psg", SOUND_CLOCK / 2).add_route(ALL_OUTPUTS, "mono", 0.10);
- MCFG_DEVICE_ADD("ymsnd", Y8950, SOUND_CLOCK) /* The Y8950 is basically a YM3526 with ADPCM built in */
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
-MACHINE_CONFIG_END
+ Y8950(config, "ymsnd", SOUND_CLOCK).add_route(ALL_OUTPUTS, "mono", 1.0); /* The Y8950 is basically a YM3526 with ADPCM built in */
+}
diff --git a/src/mame/drivers/gizmondo.cpp b/src/mame/drivers/gizmondo.cpp
index 744d9f54e1e..4a2d253795c 100644
--- a/src/mame/drivers/gizmondo.cpp
+++ b/src/mame/drivers/gizmondo.cpp
@@ -189,18 +189,19 @@ void gizmondo_state::init_gizmondo()
// do nothing
}
-MACHINE_CONFIG_START(gizmondo_state::gizmondo)
- MCFG_DEVICE_ADD("maincpu", ARM9, 40000000)
- MCFG_DEVICE_PROGRAM_MAP(gizmondo_map)
+void gizmondo_state::gizmondo(machine_config &config)
+{
+ ARM9(config, m_maincpu, 40000000);
+ m_maincpu->set_addrmap(AS_PROGRAM, &gizmondo_state::gizmondo_map);
- MCFG_PALETTE_ADD("palette", 32768)
+ PALETTE(config, "palette").set_entries(32768);
- MCFG_SCREEN_ADD("screen", LCD)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */
- MCFG_SCREEN_SIZE(320, 240)
- MCFG_SCREEN_VISIBLE_AREA(0, 320 - 1, 0, 240 - 1)
- MCFG_SCREEN_UPDATE_DEVICE("gf4500", gf4500_device, screen_update)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_LCD));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */
+ screen.set_size(320, 240);
+ screen.set_visarea_full();
+ screen.set_screen_update("gf4500", FUNC(gf4500_device::screen_update));
GF4500(config, m_gf4500, 0);
@@ -215,7 +216,7 @@ MACHINE_CONFIG_START(gizmondo_state::gizmondo)
#if 0
MCFG_QUICKLOAD_ADD("quickload", gizmondo_state, wince, "bin", 0)
#endif
-MACHINE_CONFIG_END
+}
static INPUT_PORTS_START( gizmondo )
PORT_START( "PORTF-01" )
diff --git a/src/mame/drivers/gkigt.cpp b/src/mame/drivers/gkigt.cpp
index 93f59f3fa01..4d5a4c41046 100644
--- a/src/mame/drivers/gkigt.cpp
+++ b/src/mame/drivers/gkigt.cpp
@@ -86,7 +86,7 @@ PCB board that connects to 044 boards via J6 & J7
or 039 EPROM + SIMM software
More chips (from eBay auction):
- 2x Phillips / NXT 28C94 quad UART (8 serial channels total)
+ 2x Philips / NXT 28C94 quad UART (8 serial channels total)
ADV476 256 color RAMDAC
*/
@@ -607,35 +607,35 @@ static DEVICE_INPUT_DEFAULTS_START( terminal )
DEVICE_INPUT_DEFAULTS( "RS232_STOPBITS", 0xff, RS232_STOPBITS_1 )
DEVICE_INPUT_DEFAULTS_END
-MACHINE_CONFIG_START(igt_gameking_state::igt_gameking)
-
+void igt_gameking_state::igt_gameking(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", I960, XTAL(24'000'000))
- MCFG_DEVICE_PROGRAM_MAP(igt_gameking_map)
+ I960(config, m_maincpu, XTAL(24'000'000));
+ m_maincpu->set_addrmap(AS_PROGRAM, &igt_gameking_state::igt_gameking_map);
- MCFG_DEVICE_ADD("quart1", SC28C94, XTAL(24'000'000) / 6)
- MCFG_SC28C94_D_TX_CALLBACK(WRITELINE("diag", rs232_port_device, write_txd))
+ SC28C94(config, m_quart1, XTAL(24'000'000) / 6);
+ m_quart1->d_tx_cb().set("diag", FUNC(rs232_port_device::write_txd));
- MCFG_DEVICE_ADD("quart2", SC28C94, XTAL(24'000'000) / 6)
- MCFG_MC68681_IRQ_CALLBACK(INPUTLINE("maincpu", I960_IRQ0))
+ sc28c94_device &quart2(SC28C94(config, "quart2", XTAL(24'000'000) / 6));
+ quart2.irq_cb().set_inputline(m_maincpu, I960_IRQ0);
rs232_port_device &diag(RS232_PORT(config, "diag", default_rs232_devices, nullptr));
diag.rxd_handler().set("quart1", FUNC(sc28c94_device::rx_d_w));
diag.set_option_device_input_defaults("terminal", DEVICE_INPUT_DEFAULTS_NAME(terminal));
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_igt_gameking)
+ GFXDECODE(config, "gfxdecode", m_palette, gfx_igt_gameking);
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(1024, 512)
- MCFG_SCREEN_VISIBLE_AREA(0, 640-1, 0, 480-1)
- MCFG_SCREEN_UPDATE_DRIVER(igt_gameking_state, screen_update_igt_gameking)
- MCFG_SCREEN_PALETTE("palette")
- MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE(*this, igt_gameking_state, vblank_irq))
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_refresh_hz(60);
+ m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ m_screen->set_size(1024, 512);
+ m_screen->set_visarea(0, 640-1, 0, 480-1);
+ m_screen->set_screen_update(FUNC(igt_gameking_state::screen_update_igt_gameking));
+ m_screen->set_palette(m_palette);
+ m_screen->screen_vblank().set(FUNC(igt_gameking_state::vblank_irq));
// Xilinx used as video chip XTAL(26'666'666) on board
- MCFG_PALETTE_ADD("palette", 0x100)
+ PALETTE(config, m_palette).set_entries(0x100);
ramdac_device &ramdac(RAMDAC(config, "ramdac", 0, m_palette));
ramdac.set_addrmap(0, &igt_gameking_state::ramdac_map);
@@ -643,17 +643,16 @@ MACHINE_CONFIG_START(igt_gameking_state::igt_gameking)
/* sound hardware */
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("ymz", YMZ280B, XTAL(16'934'400)) // enhanced sound on optional Media-Lite sub board
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
+ YMZ280B(config, "ymz", XTAL(16'934'400)).add_route(ALL_OUTPUTS, "mono", 1.0); // enhanced sound on optional Media-Lite sub board
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_1);
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(igt_gameking_state::igt_ms72c)
+void igt_gameking_state::igt_ms72c(machine_config &config)
+{
igt_gameking(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(igt_ms72c_map)
-MACHINE_CONFIG_END
+ m_maincpu->set_addrmap(AS_PROGRAM, &igt_gameking_state::igt_ms72c_map);
+}
ROM_START( ms3 )
ROM_REGION( 0x80000, "maincpu", 0 )
diff --git a/src/mame/drivers/gladiatr.cpp b/src/mame/drivers/gladiatr.cpp
index fcf1e61e9f4..a641ea11a38 100644
--- a/src/mame/drivers/gladiatr.cpp
+++ b/src/mame/drivers/gladiatr.cpp
@@ -938,23 +938,23 @@ GFXDECODE_END
-MACHINE_CONFIG_START(ppking_state::ppking)
-
+void ppking_state::ppking(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, 12_MHz_XTAL/2) /* verified on pcb */
- MCFG_DEVICE_PROGRAM_MAP(ppking_cpu1_map)
- MCFG_DEVICE_IO_MAP(ppking_cpu1_io)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", ppking_state, irq0_line_hold)
+ Z80(config, m_maincpu, 12_MHz_XTAL/2); /* verified on pcb */
+ m_maincpu->set_addrmap(AS_PROGRAM, &ppking_state::ppking_cpu1_map);
+ m_maincpu->set_addrmap(AS_IO, &ppking_state::ppking_cpu1_io);
+ m_maincpu->set_vblank_int("screen", FUNC(ppking_state::irq0_line_hold));
- MCFG_DEVICE_ADD("sub", Z80, 12_MHz_XTAL/4) /* verified on pcb */
- MCFG_DEVICE_PROGRAM_MAP(cpu2_map)
- MCFG_DEVICE_IO_MAP(ppking_cpu2_io)
- MCFG_DEVICE_PERIODIC_INT_DRIVER(ppking_state, irq0_line_assert, 60)
+ Z80(config, m_subcpu, 12_MHz_XTAL/4); /* verified on pcb */
+ m_subcpu->set_addrmap(AS_PROGRAM, &ppking_state::cpu2_map);
+ m_subcpu->set_addrmap(AS_IO, &ppking_state::ppking_cpu2_io);
+ m_subcpu->set_periodic_int(FUNC(ppking_state::irq0_line_assert), attotime::from_hz(60));
- MCFG_DEVICE_ADD("audiocpu", MC6809, 12_MHz_XTAL/4) /* verified on pcb */
- MCFG_DEVICE_PROGRAM_MAP(ppking_cpu3_map)
+ MC6809(config, m_audiocpu, 12_MHz_XTAL/4); /* verified on pcb */
+ m_audiocpu->set_addrmap(AS_PROGRAM, &ppking_state::ppking_cpu3_map);
- MCFG_QUANTUM_TIME(attotime::from_hz(6000))
+ config.m_minimum_quantum = attotime::from_hz(6000);
MCFG_MACHINE_RESET_OVERRIDE(ppking_state, ppking)
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
@@ -969,17 +969,17 @@ MACHINE_CONFIG_START(ppking_state::ppking)
mainlatch.q_out_cb<7>().set(FUNC(ppking_state::flipscreen_w));
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
-// MCFG_SCREEN_REFRESH_RATE(60)
-// MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
-// MCFG_SCREEN_SIZE(32*8, 32*8)
-// MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1)
- MCFG_SCREEN_RAW_PARAMS(12_MHz_XTAL/2,384,0,256,264,16,240) // assume same as Arkanoid
- MCFG_SCREEN_UPDATE_DRIVER(ppking_state, screen_update_ppking)
- MCFG_SCREEN_PALETTE("palette")
-
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_ppking)
- MCFG_PALETTE_ADD("palette", 1024)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+// screen.set_refresh_hz(60);
+// screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+// screen.set_size(32*8, 32*8);
+// screen.set_visarea(0*8, 32*8-1, 2*8, 30*8-1);
+ screen.set_raw(12_MHz_XTAL/2,384,0,256,264,16,240); // assume same as Arkanoid
+ screen.set_screen_update(FUNC(ppking_state::screen_update_ppking));
+ screen.set_palette(m_palette);
+
+ GFXDECODE(config, m_gfxdecode, m_palette, gfx_ppking);
+ PALETTE(config, m_palette).set_entries(1024);
MCFG_VIDEO_START_OVERRIDE(ppking_state, ppking)
@@ -998,25 +998,25 @@ MACHINE_CONFIG_START(ppking_state::ppking)
ymsnd.add_route(2, "mono", 0.60);
ymsnd.add_route(3, "mono", 0.50);
- MCFG_DEVICE_ADD("msm", MSM5205, 455_kHz_XTAL) /* verified on pcb */
- MCFG_MSM5205_PRESCALER_SELECTOR(SEX_4B) /* vclk input mode */
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.60)
-MACHINE_CONFIG_END
-
-MACHINE_CONFIG_START(gladiatr_state::gladiatr)
+ MSM5205(config, m_msm, 455_kHz_XTAL); /* verified on pcb */
+ m_msm->set_prescaler_selector(msm5205_device::SEX_4B); /* vclk input mode */
+ m_msm->add_route(ALL_OUTPUTS, "mono", 0.60);
+}
+void gladiatr_state::gladiatr(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, 12_MHz_XTAL/2) /* verified on pcb */
- MCFG_DEVICE_PROGRAM_MAP(gladiatr_cpu1_map)
- MCFG_DEVICE_IO_MAP(gladiatr_cpu1_io)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", gladiatr_state, irq0_line_hold)
+ Z80(config, m_maincpu, 12_MHz_XTAL/2); /* verified on pcb */
+ m_maincpu->set_addrmap(AS_PROGRAM, &gladiatr_state::gladiatr_cpu1_map);
+ m_maincpu->set_addrmap(AS_IO, &gladiatr_state::gladiatr_cpu1_io);
+ m_maincpu->set_vblank_int("screen", FUNC(gladiatr_state::irq0_line_hold));
- MCFG_DEVICE_ADD("sub", Z80, 12_MHz_XTAL/4) /* verified on pcb */
- MCFG_DEVICE_PROGRAM_MAP(cpu2_map)
- MCFG_DEVICE_IO_MAP(gladiatr_cpu2_io)
+ Z80(config, m_subcpu, 12_MHz_XTAL/4); /* verified on pcb */
+ m_subcpu->set_addrmap(AS_PROGRAM, &gladiatr_state::cpu2_map);
+ m_subcpu->set_addrmap(AS_IO, &gladiatr_state::gladiatr_cpu2_io);
- MCFG_DEVICE_ADD("audiocpu", MC6809, 12_MHz_XTAL/4) /* verified on pcb */
- MCFG_DEVICE_PROGRAM_MAP(gladiatr_cpu3_map)
+ MC6809(config, m_audiocpu, 12_MHz_XTAL/4); /* verified on pcb */
+ m_audiocpu->set_addrmap(AS_PROGRAM, &gladiatr_state::gladiatr_cpu3_map);
MCFG_MACHINE_RESET_OVERRIDE(gladiatr_state,gladiator)
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0); // NEC uPD449 CMOS SRAM
@@ -1056,22 +1056,22 @@ MACHINE_CONFIG_START(gladiatr_state::gladiatr)
m_csnd->t1_in_cb().set(FUNC(gladiatr_state::csnd_t1_r));
/* lazy way to make polled serial between MCUs work */
- MCFG_QUANTUM_PERFECT_CPU("ucpu")
+ config.m_perfect_cpu_quantum = subtag("ucpu");
- MCFG_CLOCK_ADD("tclk", 12_MHz_XTAL/8/128/2) /* verified on pcb */
- MCFG_CLOCK_SIGNAL_HANDLER(WRITELINE(*this, gladiatr_state, tclk_w));
+ CLOCK(config, "tclk", 12_MHz_XTAL/8/128/2) /* verified on pcb */
+ .signal_handler().set(FUNC(gladiatr_state::tclk_w));
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(32*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(gladiatr_state, screen_update_gladiatr)
- MCFG_SCREEN_PALETTE("palette")
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(32*8, 32*8);
+ screen.set_visarea(0*8, 32*8-1, 2*8, 30*8-1);
+ screen.set_screen_update(FUNC(gladiatr_state::screen_update_gladiatr));
+ screen.set_palette(m_palette);
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_gladiatr)
- MCFG_PALETTE_ADD("palette", 1024)
+ GFXDECODE(config, m_gfxdecode, m_palette, gfx_gladiatr);
+ PALETTE(config, m_palette).set_entries(1024);
MCFG_VIDEO_START_OVERRIDE(gladiatr_state,gladiatr)
@@ -1089,12 +1089,12 @@ MACHINE_CONFIG_START(gladiatr_state::gladiatr)
ymsnd.add_route(2, "mono", 0.60);
ymsnd.add_route(3, "mono", 0.50);
- MCFG_DEVICE_ADD("msm", MSM5205, 455_kHz_XTAL) /* verified on pcb */
- MCFG_MSM5205_PRESCALER_SELECTOR(SEX_4B) /* vclk input mode */
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.60)
+ MSM5205(config, m_msm, 455_kHz_XTAL); /* verified on pcb */
+ m_msm->set_prescaler_selector(msm5205_device::SEX_4B); /* vclk input mode */
+ m_msm->add_route(ALL_OUTPUTS, "mono", 0.60);
- MCFG_DEVICE_ADD("filtlatch", LS259, 0) // 9R - filters on sound output
-MACHINE_CONFIG_END
+ LS259(config, "filtlatch", 0); // 9R - filters on sound output
+}
/***************************************************************************
diff --git a/src/mame/drivers/glasgow.cpp b/src/mame/drivers/glasgow.cpp
index b11fcb4368a..a8ff923dd62 100644
--- a/src/mame/drivers/glasgow.cpp
+++ b/src/mame/drivers/glasgow.cpp
@@ -311,10 +311,11 @@ static INPUT_PORTS_START( old_keyboard ) //Glasgow,Dallas
INPUT_PORTS_END
-MACHINE_CONFIG_START(glasgow_state::glasgow)
+void glasgow_state::glasgow(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M68000, 12_MHz_XTAL)
- MCFG_DEVICE_PROGRAM_MAP(glasgow_mem)
+ M68000(config, m_maincpu, 12_MHz_XTAL);
+ m_maincpu->set_addrmap(AS_PROGRAM, &glasgow_state::glasgow_mem);
MEPHISTO_SENSORS_BOARD(config, m_board, 0);
@@ -322,30 +323,30 @@ MACHINE_CONFIG_START(glasgow_state::glasgow)
config.set_default_layout(layout_glasgow);
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("beeper", BEEP, 44)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.50)
+ BEEP(config, m_beep, 44).add_route(ALL_OUTPUTS, "mono", 0.50);
- MCFG_TIMER_DRIVER_ADD_PERIODIC("nmi_timer", glasgow_state, update_nmi, attotime::from_hz(50))
-MACHINE_CONFIG_END
+ TIMER(config, "nmi_timer").configure_periodic(FUNC(glasgow_state::update_nmi), attotime::from_hz(50));
+}
-MACHINE_CONFIG_START(amsterd_state::amsterd)
+void amsterd_state::amsterd(machine_config &config)
+{
glasgow(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(amsterd_mem)
-MACHINE_CONFIG_END
+ m_maincpu->set_addrmap(AS_PROGRAM, &amsterd_state::amsterd_mem);
+}
-MACHINE_CONFIG_START(amsterd_state::dallas32)
+void amsterd_state::dallas32(machine_config &config)
+{
glasgow(config);
/* basic machine hardware */
- MCFG_DEVICE_REPLACE("maincpu", M68020, 14_MHz_XTAL)
- MCFG_DEVICE_PROGRAM_MAP(dallas32_mem)
+ M68020(config.replace(), m_maincpu, 14_MHz_XTAL);
+ m_maincpu->set_addrmap(AS_PROGRAM, &amsterd_state::dallas32_mem);
- MCFG_DEVICE_REMOVE("nmi_timer")
- MCFG_TIMER_DRIVER_ADD_PERIODIC("nmi_timer", amsterd_state, update_nmi32, attotime::from_hz(50))
-MACHINE_CONFIG_END
+ config.device_remove("nmi_timer");
+ TIMER(config, "nmi_timer").configure_periodic(FUNC(amsterd_state::update_nmi32), attotime::from_hz(50));
+}
/***************************************************************************
diff --git a/src/mame/drivers/glass.cpp b/src/mame/drivers/glass.cpp
index 89244939895..1c4b85ea17f 100644
--- a/src/mame/drivers/glass.cpp
+++ b/src/mame/drivers/glass.cpp
@@ -220,12 +220,12 @@ void glass_state::machine_reset()
m_blitter_command = 0;
}
-MACHINE_CONFIG_START(glass_state::glass)
-
+void glass_state::glass(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M68000, XTAL(24'000'000)/2) /* 12 MHz verified on PCB */
- MCFG_DEVICE_PROGRAM_MAP(glass_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", glass_state, interrupt)
+ M68000(config, m_maincpu, XTAL(24'000'000)/2); /* 12 MHz verified on PCB */
+ m_maincpu->set_addrmap(AS_PROGRAM, &glass_state::glass_map);
+ m_maincpu->set_vblank_int("screen", FUNC(glass_state::interrupt));
LS259(config, m_outlatch);
m_outlatch->q_out_cb<0>().set(FUNC(glass_state::coin1_lockout_w));
@@ -235,30 +235,31 @@ MACHINE_CONFIG_START(glass_state::glass)
m_outlatch->q_out_cb<4>().set_nop(); // Sound Muting (if bit 0 == 1, sound output stream = 0)
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */)
- MCFG_SCREEN_SIZE(32*16, 32*16)
- MCFG_SCREEN_VISIBLE_AREA(0, 368-1, 16, 256-1)
- MCFG_SCREEN_UPDATE_DRIVER(glass_state, screen_update)
- MCFG_SCREEN_PALETTE(m_palette)
-
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, m_palette, gfx_glass)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500) /* not accurate */);
+ screen.set_size(32*16, 32*16);
+ screen.set_visarea(0, 368-1, 16, 256-1);
+ screen.set_screen_update(FUNC(glass_state::screen_update));
+ screen.set_palette(m_palette);
+
+ GFXDECODE(config, m_gfxdecode, m_palette, gfx_glass);
PALETTE(config, m_palette).set_format(palette_device::xBGR_555, 1024);
/* sound hardware */
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("oki", OKIM6295, XTAL(1'000'000), okim6295_device::PIN7_HIGH) /* 1MHz Resonator & pin 7 high verified on PCB */
- MCFG_DEVICE_ADDRESS_MAP(0, oki_map)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
-MACHINE_CONFIG_END
+ okim6295_device &oki(OKIM6295(config, "oki", XTAL(1'000'000), okim6295_device::PIN7_HIGH)); /* 1MHz Resonator & pin 7 high verified on PCB */
+ oki.set_addrmap(0, &glass_state::oki_map);
+ oki.add_route(ALL_OUTPUTS, "mono", 1.0);
+}
-MACHINE_CONFIG_START(glass_state::glass_ds5002fp)
+void glass_state::glass_ds5002fp(machine_config &config)
+{
glass(config);
- MCFG_DEVICE_ADD("gaelco_ds5002fp", GAELCO_DS5002FP, XTAL(24'000'000) / 2) /* verified on pcb */
- MCFG_DEVICE_ADDRESS_MAP(0, mcu_hostmem_map)
-MACHINE_CONFIG_END
+ gaelco_ds5002fp_device &ds5002fp(GAELCO_DS5002FP(config, "gaelco_ds5002fp", XTAL(24'000'000) / 2)); /* verified on pcb */
+ ds5002fp.set_addrmap(0, &glass_state::mcu_hostmem_map);
+}
ROM_START( glass ) /* Version 1.1 */
ROM_REGION( 0x100000, "maincpu", 0 ) /* 68000 code */
diff --git a/src/mame/drivers/globalvr.cpp b/src/mame/drivers/globalvr.cpp
index a85b4201d3f..0e969bcd8b5 100644
--- a/src/mame/drivers/globalvr.cpp
+++ b/src/mame/drivers/globalvr.cpp
@@ -87,11 +87,12 @@ static INPUT_PORTS_START( globalvr )
INPUT_PORTS_END
-MACHINE_CONFIG_START(globalvr_state::globalvr)
+void globalvr_state::globalvr(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", PENTIUM, 100000000) /* ? MHz */
- MCFG_DEVICE_PROGRAM_MAP(globalvr_map)
-MACHINE_CONFIG_END
+ PENTIUM(config, m_maincpu, 100000000); /* ? MHz */
+ m_maincpu->set_addrmap(AS_PROGRAM, &globalvr_state::globalvr_map);
+}
ROM_START( hyperv2 )
diff --git a/src/mame/drivers/gluck2.cpp b/src/mame/drivers/gluck2.cpp
index 66cec436edf..f595c168bd8 100644
--- a/src/mame/drivers/gluck2.cpp
+++ b/src/mame/drivers/gluck2.cpp
@@ -484,28 +484,28 @@ GFXDECODE_END
* Machine Drivers *
*********************************************/
-MACHINE_CONFIG_START(gluck2_state::gluck2)
-
+void gluck2_state::gluck2(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M6502, MASTER_CLOCK/16) /* guess */
- MCFG_DEVICE_PROGRAM_MAP(gluck2_map)
+ M6502(config, m_maincpu, MASTER_CLOCK/16); /* guess */
+ m_maincpu->set_addrmap(AS_PROGRAM, &gluck2_state::gluck2_map);
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
/* CRTC Register: 00 01 02 03 04 05 06
CRTC Value : 0x27 0x20 0x23 0x03 0x26 0x00 0x20
*/
- MCFG_SCREEN_SIZE((39+1)*8, (38+1)*8) /* from MC6845 init, registers 00 & 04. (value - 1) */
- MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 0*8, 32*8-1) /* from MC6845 init, registers 01 & 06. */
- MCFG_SCREEN_UPDATE_DRIVER(gluck2_state, screen_update)
- MCFG_SCREEN_PALETTE("palette")
+ screen.set_size((39+1)*8, (38+1)*8); /* from MC6845 init, registers 00 & 04. (value - 1) */
+ screen.set_visarea(0*8, 32*8-1, 0*8, 32*8-1); /* from MC6845 init, registers 01 & 06. */
+ screen.set_screen_update(FUNC(gluck2_state::screen_update));
+ screen.set_palette("palette");
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_gluck2)
+ GFXDECODE(config, m_gfxdecode, "palette", gfx_gluck2);
PALETTE(config, "palette", palette_device::RGB_444_PROMS, "proms", 256);
mc6845_device &crtc(MC6845(config, "crtc", MASTER_CLOCK/16)); /* guess */
@@ -525,10 +525,8 @@ MACHINE_CONFIG_START(gluck2_state::gluck2)
*/
ay8910.add_route(ALL_OUTPUTS, "mono", 1.0);
- MCFG_DEVICE_ADD("ymsnd", YM2413, SND_CLOCK)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
-
-MACHINE_CONFIG_END
+ YM2413(config, "ymsnd", SND_CLOCK).add_route(ALL_OUTPUTS, "mono", 1.0);
+}
/*********************************************
diff --git a/src/mame/drivers/gmaster.cpp b/src/mame/drivers/gmaster.cpp
index 9c9104b9b8c..f379b2bd0fd 100644
--- a/src/mame/drivers/gmaster.cpp
+++ b/src/mame/drivers/gmaster.cpp
@@ -313,7 +313,7 @@ uint32_t gmaster_state::screen_update_gmaster(screen_device &screen, bitmap_ind1
void gmaster_state::machine_start()
{
if (m_cart->exists())
- m_maincpu->space(AS_PROGRAM).install_read_handler(0x8000, 0xfeff, read8_delegate(FUNC(generic_slot_device::read_rom),(generic_slot_device*)m_cart));
+ m_maincpu->space(AS_PROGRAM).install_read_handler(0x8000, 0xfeff, read8sm_delegate(FUNC(generic_slot_device::read_rom),(generic_slot_device*)m_cart));
save_item(NAME(m_video.data));
save_item(NAME(m_video.index));
@@ -327,7 +327,8 @@ void gmaster_state::machine_start()
}
-MACHINE_CONFIG_START(gmaster_state::gmaster)
+void gmaster_state::gmaster(machine_config &config)
+{
upd7810_device &upd(UPD7810(config, m_maincpu, 12_MHz_XTAL/2/*?*/)); // µPD78C11 in the unit
upd.set_addrmap(AS_PROGRAM, &gmaster_state::gmaster_mem);
upd.pa_in_cb().set_ioport("JOY");
@@ -353,11 +354,11 @@ MACHINE_CONFIG_START(gmaster_state::gmaster)
SPEAKER(config, "mono").front_center();
SPEAKER_SOUND(config, m_speaker).add_route(0, "mono", 0.50);
- MCFG_GENERIC_CARTSLOT_ADD("cartslot", generic_linear_slot, "gmaster_cart")
- MCFG_GENERIC_MANDATORY
+ GENERIC_CARTSLOT(config, m_cart, generic_linear_slot, "gmaster_cart").set_must_be_loaded(true);
+
- MCFG_SOFTWARE_LIST_ADD("cart_list","gmaster")
-MACHINE_CONFIG_END
+ SOFTWARE_LIST(config, "cart_list").set_original("gmaster");
+}
ROM_START(gmaster)
diff --git a/src/mame/drivers/gng.cpp b/src/mame/drivers/gng.cpp
index 11b6df45206..7c013a48f85 100644
--- a/src/mame/drivers/gng.cpp
+++ b/src/mame/drivers/gng.cpp
@@ -378,16 +378,16 @@ void gng_state::machine_reset()
}
}
-MACHINE_CONFIG_START(gng_state::gng)
-
+void gng_state::gng(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", MC6809, XTAL(12'000'000)/2) /* verified on pcb */
- MCFG_DEVICE_PROGRAM_MAP(gng_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", gng_state, irq0_line_hold)
+ MC6809(config, m_maincpu, XTAL(12'000'000)/2); /* verified on pcb */
+ m_maincpu->set_addrmap(AS_PROGRAM, &gng_state::gng_map);
+ m_maincpu->set_vblank_int("screen", FUNC(gng_state::irq0_line_hold));
- MCFG_DEVICE_ADD("audiocpu", Z80, XTAL(12'000'000)/4) /* verified on pcb */
- MCFG_DEVICE_PROGRAM_MAP(sound_map)
- MCFG_DEVICE_PERIODIC_INT_DRIVER(gng_state, irq0_line_hold, 4*60)
+ z80_device &audiocpu(Z80(config, "audiocpu", XTAL(12'000'000)/4)); /* verified on pcb */
+ audiocpu.set_addrmap(AS_PROGRAM, &gng_state::sound_map);
+ audiocpu.set_periodic_int(FUNC(gng_state::irq0_line_hold), attotime::from_hz(4*60));
ls259_device &mainlatch(LS259(config, "mainlatch")); // 9B on A board
mainlatch.q_out_cb<0>().set(FUNC(gng_state::flipscreen_w));
@@ -397,18 +397,18 @@ MACHINE_CONFIG_START(gng_state::gng)
mainlatch.q_out_cb<3>().set([this] (int state) { machine().bookkeeping().coin_counter_w(1, state); });
/* video hardware */
- MCFG_DEVICE_ADD("spriteram", BUFFERED_SPRITERAM8)
+ BUFFERED_SPRITERAM8(config, m_spriteram);
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(59.59) /* verified on pcb */
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(32*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(gng_state, screen_update_gng)
- MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE("spriteram", buffered_spriteram8_device, vblank_copy_rising))
- MCFG_SCREEN_PALETTE(m_palette)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(59.59); /* verified on pcb */
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(32*8, 32*8);
+ screen.set_visarea(0*8, 32*8-1, 2*8, 30*8-1);
+ screen.set_screen_update(FUNC(gng_state::screen_update_gng));
+ screen.screen_vblank().set(m_spriteram, FUNC(buffered_spriteram8_device::vblank_copy_rising));
+ screen.set_palette(m_palette);
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_gng)
+ GFXDECODE(config, m_gfxdecode, m_palette, gfx_gng);
PALETTE(config, m_palette).set_format(palette_device::RGBx_444, 256);
@@ -417,26 +417,26 @@ MACHINE_CONFIG_START(gng_state::gng)
GENERIC_LATCH_8(config, "soundlatch");
- MCFG_DEVICE_ADD("ym1", YM2203, XTAL(12'000'000)/8) /* verified on pcb */
- MCFG_SOUND_ROUTE(0, "mono", 0.40)
- MCFG_SOUND_ROUTE(1, "mono", 0.40)
- MCFG_SOUND_ROUTE(2, "mono", 0.40)
- MCFG_SOUND_ROUTE(3, "mono", 0.20)
-
- MCFG_DEVICE_ADD("ym2", YM2203, XTAL(12'000'000)/8) /* verified on pcb */
- MCFG_SOUND_ROUTE(0, "mono", 0.40)
- MCFG_SOUND_ROUTE(1, "mono", 0.40)
- MCFG_SOUND_ROUTE(2, "mono", 0.40)
- MCFG_SOUND_ROUTE(3, "mono", 0.20)
-MACHINE_CONFIG_END
+ YM2203(config, m_ym[0], XTAL(12'000'000)/8); /* verified on pcb */
+ m_ym[0]->add_route(0, "mono", 0.40);
+ m_ym[0]->add_route(1, "mono", 0.40);
+ m_ym[0]->add_route(2, "mono", 0.40);
+ m_ym[0]->add_route(3, "mono", 0.20);
+
+ YM2203(config, m_ym[1], XTAL(12'000'000)/8); /* verified on pcb */
+ m_ym[1]->add_route(0, "mono", 0.40);
+ m_ym[1]->add_route(1, "mono", 0.40);
+ m_ym[1]->add_route(2, "mono", 0.40);
+ m_ym[1]->add_route(3, "mono", 0.20);
+}
-MACHINE_CONFIG_START(gng_state::diamond)
+void gng_state::diamond(machine_config &config)
+{
gng(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(diamond_map)
+ m_maincpu->set_addrmap(AS_PROGRAM, &gng_state::diamond_map);
- MCFG_DEVICE_REMOVE("mainlatch")
-MACHINE_CONFIG_END
+ config.device_remove("mainlatch");
+}
diff --git a/src/mame/drivers/go2000.cpp b/src/mame/drivers/go2000.cpp
index 4d41829dfbd..a841c6a9f03 100644
--- a/src/mame/drivers/go2000.cpp
+++ b/src/mame/drivers/go2000.cpp
@@ -344,26 +344,26 @@ void go2000_state::machine_start()
}
-MACHINE_CONFIG_START(go2000_state::go2000)
-
- MCFG_DEVICE_ADD("maincpu", M68000, 10000000)
- MCFG_DEVICE_PROGRAM_MAP(go2000_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", go2000_state, irq1_line_hold)
+void go2000_state::go2000(machine_config &config)
+{
+ M68000(config, m_maincpu, 10000000);
+ m_maincpu->set_addrmap(AS_PROGRAM, &go2000_state::go2000_map);
+ m_maincpu->set_vblank_int("screen", FUNC(go2000_state::irq1_line_hold));
- MCFG_DEVICE_ADD("soundcpu", Z80, 4000000)
- MCFG_DEVICE_PROGRAM_MAP(go2000_sound_map)
- MCFG_DEVICE_IO_MAP(go2000_sound_io)
+ Z80(config, m_soundcpu, 4000000);
+ m_soundcpu->set_addrmap(AS_PROGRAM, &go2000_state::go2000_sound_map);
+ m_soundcpu->set_addrmap(AS_IO, &go2000_state::go2000_sound_io);
GFXDECODE(config, m_gfxdecode, m_palette, gfx_go2000);
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(64*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 48*8-1, 2*8, 30*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(go2000_state, screen_update_go2000)
- MCFG_SCREEN_PALETTE(m_palette)
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_refresh_hz(60);
+ m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ m_screen->set_size(64*8, 32*8);
+ m_screen->set_visarea(0*8, 48*8-1, 2*8, 30*8-1);
+ m_screen->set_screen_update(FUNC(go2000_state::screen_update_go2000));
+ m_screen->set_palette(m_palette);
PALETTE(config, m_palette).set_format(palette_device::xBGR_555, 0x800);
@@ -371,10 +371,11 @@ MACHINE_CONFIG_START(go2000_state::go2000)
GENERIC_LATCH_8(config, m_soundlatch);
SPEAKER(config, "speaker").front_center();
- MCFG_DEVICE_ADD("dac", DAC_8BIT_R2R, 0) MCFG_SOUND_ROUTE(0, "speaker", 0.25) // unknown DAC
- MCFG_DEVICE_ADD("vref", VOLTAGE_REGULATOR, 0) MCFG_VOLTAGE_REGULATOR_OUTPUT(5.0)
- MCFG_SOUND_ROUTE(0, "dac", 1.0, DAC_VREF_POS_INPUT) MCFG_SOUND_ROUTE(0, "dac", -1.0, DAC_VREF_NEG_INPUT)
-MACHINE_CONFIG_END
+ DAC_8BIT_R2R(config, "dac", 0).add_route(0, "speaker", 0.25); // unknown DAC
+ voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref"));
+ vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT);
+ vref.add_route(0, "dac", -1.0, DAC_VREF_NEG_INPUT);
+}
ROM_START( go2000 )
ROM_REGION( 0x80000, "maincpu", 0 ) /* 68000 Code */
diff --git a/src/mame/drivers/goal92.cpp b/src/mame/drivers/goal92.cpp
index 3d1477d42d7..11828b83cf4 100644
--- a/src/mame/drivers/goal92.cpp
+++ b/src/mame/drivers/goal92.cpp
@@ -304,7 +304,7 @@ void goal92_state::goal92(machine_config &config)
m_maincpu->set_vblank_int("screen", FUNC(goal92_state::irq6_line_hold)); /* VBL */
Z80(config, m_audiocpu, 2500000);
- m_audiocpu->set_addrmap(AS_PROGRAM, &goal92_state::sound_cpu); /* IRQs are triggered by the main CPU */
+ m_audiocpu->set_addrmap(AS_PROGRAM, &goal92_state::sound_cpu); /* IRQs are triggered by the main CPU */
/* video hardware */
screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
diff --git a/src/mame/drivers/goindol.cpp b/src/mame/drivers/goindol.cpp
index 80ad3052be6..0e80a2e447f 100644
--- a/src/mame/drivers/goindol.cpp
+++ b/src/mame/drivers/goindol.cpp
@@ -235,28 +235,27 @@ void goindol_state::machine_reset()
m_prot_toggle = 0;
}
-MACHINE_CONFIG_START(goindol_state::goindol)
-
+void goindol_state::goindol(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, XTAL(12'000'000)/2) /* XTAL confirmed, divisor is not */
- MCFG_DEVICE_PROGRAM_MAP(goindol_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", goindol_state, irq0_line_hold)
-
- MCFG_DEVICE_ADD("audiocpu", Z80, XTAL(12'000'000)/2) /* XTAL confirmed, divisor is not */
- MCFG_DEVICE_PROGRAM_MAP(sound_map)
- MCFG_DEVICE_PERIODIC_INT_DRIVER(goindol_state, irq0_line_hold, 4*60)
+ Z80(config, m_maincpu, XTAL(12'000'000)/2); /* XTAL confirmed, divisor is not */
+ m_maincpu->set_addrmap(AS_PROGRAM, &goindol_state::goindol_map);
+ m_maincpu->set_vblank_int("screen", FUNC(goindol_state::irq0_line_hold));
+ z80_device &audiocpu(Z80(config, "audiocpu", XTAL(12'000'000)/2)); /* XTAL confirmed, divisor is not */
+ audiocpu.set_addrmap(AS_PROGRAM, &goindol_state::sound_map);
+ audiocpu.set_periodic_int(FUNC(goindol_state::irq0_line_hold), attotime::from_hz(4*60));
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(32*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(goindol_state, screen_update_goindol)
- MCFG_SCREEN_PALETTE(m_palette)
-
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_goindol)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(32*8, 32*8);
+ screen.set_visarea(0*8, 32*8-1, 2*8, 30*8-1);
+ screen.set_screen_update(FUNC(goindol_state::screen_update_goindol));
+ screen.set_palette(m_palette);
+
+ GFXDECODE(config, m_gfxdecode, m_palette, gfx_goindol);
PALETTE(config, m_palette, palette_device::RGB_444_PROMS, "proms", 256);
/* sound hardware */
@@ -264,9 +263,8 @@ MACHINE_CONFIG_START(goindol_state::goindol)
GENERIC_LATCH_8(config, "soundlatch");
- MCFG_DEVICE_ADD("ymsnd", YM2203, XTAL(12'000'000)/8) /* Confirmed pitch from recording */
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25)
-MACHINE_CONFIG_END
+ YM2203(config, "ymsnd", XTAL(12'000'000)/8).add_route(ALL_OUTPUTS, "mono", 0.25); /* Confirmed pitch from recording */
+}
@@ -326,7 +324,7 @@ ROM_START( goindolu )
ROM_LOAD( "am27s21.pr3", 0x0200, 0x0100, CRC(8534cfb5) SHA1(337b6d5e9ceb2116aea73a7a4ac7e70716460323) ) /* palette blue bits */
ROM_END
-ROM_START( goindolk )
+ROM_START( goindolj )
ROM_REGION( 0x20000, "maincpu", 0 )
ROM_LOAD( "r1j", 0x00000, 0x8000, CRC(dde33ad3) SHA1(23cdb3494f5eeaeae2657a0101d5827aa32c526d) ) /* Code 0000-7fff */
ROM_LOAD( "r2", 0x10000, 0x8000, CRC(1ff6e3a2) SHA1(321d32b5236f8fadc55b00412081cd17fbdb42bf) ) /* Paged data */
@@ -411,5 +409,5 @@ void goindol_state::init_goindol()
GAME( 1987, goindol, 0, goindol, goindol, goindol_state, init_goindol, ROT90, "SunA", "Goindol (World)", MACHINE_UNEMULATED_PROTECTION | MACHINE_SUPPORTS_SAVE )
GAME( 1987, goindolu, goindol, goindol, goindol, goindol_state, init_goindol, ROT90, "SunA", "Goindol (US)", MACHINE_UNEMULATED_PROTECTION | MACHINE_SUPPORTS_SAVE )
-GAME( 1987, goindolk, goindol, goindol, goindol, goindol_state, init_goindol, ROT90, "SunA", "Goindol (Korea)", MACHINE_UNEMULATED_PROTECTION | MACHINE_SUPPORTS_SAVE )
+GAME( 1987, goindolj, goindol, goindol, goindol, goindol_state, init_goindol, ROT90, "SunA", "Goindol (Japan)", MACHINE_UNEMULATED_PROTECTION | MACHINE_SUPPORTS_SAVE )
GAME( 1987, homo, goindol, goindol, homo, goindol_state, empty_init, ROT90, "bootleg", "Homo", MACHINE_SUPPORTS_SAVE )
diff --git a/src/mame/drivers/gokidetor.cpp b/src/mame/drivers/gokidetor.cpp
index 2ed9b01c8a9..a1683cda21c 100644
--- a/src/mame/drivers/gokidetor.cpp
+++ b/src/mame/drivers/gokidetor.cpp
@@ -121,9 +121,10 @@ void gokidetor_state::sound_map(address_map &map)
}
-MACHINE_CONFIG_START(gokidetor_state::gokidetor)
- MCFG_DEVICE_ADD("maincpu", Z80, XTAL(16'000'000) / 4) // divider not verified
- MCFG_DEVICE_PROGRAM_MAP(main_map)
+void gokidetor_state::gokidetor(machine_config &config)
+{
+ Z80(config, m_maincpu, XTAL(16'000'000) / 4); // divider not verified
+ m_maincpu->set_addrmap(AS_PROGRAM, &gokidetor_state::main_map);
// IRQ from ???
// NMI related to E002 input and TE7750 port 7
@@ -140,8 +141,8 @@ MACHINE_CONFIG_START(gokidetor_state::gokidetor)
te7750.out_port8_cb().set(FUNC(gokidetor_state::out8_w));
te7750.out_port9_cb().set(FUNC(gokidetor_state::out9_w));
- MCFG_DEVICE_ADD("soundcpu", Z80, 4000000)
- MCFG_DEVICE_PROGRAM_MAP(sound_map)
+ z80_device &soundcpu(Z80(config, "soundcpu", 4000000));
+ soundcpu.set_addrmap(AS_PROGRAM, &gokidetor_state::sound_map);
pc060ha_device &ciu(PC060HA(config, "ciu", 0));
ciu.set_master_tag(m_maincpu);
@@ -157,9 +158,8 @@ MACHINE_CONFIG_START(gokidetor_state::gokidetor)
ymsnd.add_route(2, "mono", 0.25);
ymsnd.add_route(3, "mono", 0.80);
- MCFG_DEVICE_ADD("oki", OKIM6295, 1056000, okim6295_device::PIN7_HIGH) // clock frequency & pin 7 not verified
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.50)
-MACHINE_CONFIG_END
+ OKIM6295(config, "oki", 1056000, okim6295_device::PIN7_HIGH).add_route(ALL_OUTPUTS, "mono", 0.50); // clock frequency & pin 7 not verified
+}
INPUT_PORTS_START( gokidetor )
PORT_START("IN1")
diff --git a/src/mame/drivers/goldnpkr.cpp b/src/mame/drivers/goldnpkr.cpp
index ea4c97d9cde..2c1cf7f9dcd 100644
--- a/src/mame/drivers/goldnpkr.cpp
+++ b/src/mame/drivers/goldnpkr.cpp
@@ -1303,9 +1303,9 @@ public:
m_pia(*this, "pia%u", 0U),
m_gfxdecode(*this, "gfxdecode"),
m_palette(*this, "palette"),
+ m_discrete(*this, "discrete"),
m_videoram(*this, "videoram"),
m_colorram(*this, "colorram"),
- m_discrete(*this, "discrete"),
m_ay8910(*this, "ay8910"),
m_lamps(*this, "lamp%u", 0U)
{ }
@@ -1366,6 +1366,7 @@ protected:
required_device_array<pia6821_device, 2> m_pia;
required_device<gfxdecode_device> m_gfxdecode;
required_device<palette_device> m_palette;
+ optional_device<discrete_device> m_discrete;
private:
DECLARE_READ8_MEMBER(goldnpkr_mux_port_r);
@@ -1403,7 +1404,6 @@ private:
required_shared_ptr<uint8_t> m_videoram;
required_shared_ptr<uint8_t> m_colorram;
- optional_device<discrete_device> m_discrete;
optional_device<ay8910_device> m_ay8910;
output_finder<5> m_lamps;
@@ -1696,11 +1696,11 @@ WRITE8_MEMBER(goldnpkr_state::wcfalcon_snd_w)
{
if (wcfalcon_flag == 0)
{
- m_ay8910->data_address_w(space, 0, data);
+ m_ay8910->data_address_w(0, data);
}
else
{
- m_ay8910->data_address_w(space, 1, data);
+ m_ay8910->data_address_w(1, data);
}
wcfalcon_flag = wcfalcon_flag ^ 1;
@@ -4403,7 +4403,7 @@ void goldnpkr_state::wildcard(machine_config &config)
m_pia[0]->writepa_handler().set(FUNC(goldnpkr_state::mux_port_w));
/* video hardware */
-// MCFG_GFXDECODE_MODIFY("gfxdecode", gfx_wildcard)
+// m_gfxdecode->set_info(gfx_wildcard);
m_palette->set_init(FUNC(goldnpkr_state::witchcrd_palette));
// MCFG_VIDEO_START_OVERRIDE(goldnpkr_state,wildcard)
@@ -4447,7 +4447,7 @@ void goldnpkr_state::wildcrdb(machine_config &config)
m_pia[1]->writepa_handler().set(FUNC(goldnpkr_state::wcfalcon_snd_w));
/* video hardware */
-// MCFG_GFXDECODE_MODIFY("gfxdecode", gfx_wildcard)
+// m_gfxdecode->set_info(gfx_wildcard);
m_palette->set_init(FUNC(goldnpkr_state::witchcrd_palette));
// MCFG_VIDEO_START_OVERRIDE(goldnpkr_state,wildcard)
@@ -4653,11 +4653,11 @@ static INPUT_PORTS_START( megadpkr )
INPUT_PORTS_END
-MACHINE_CONFIG_START(blitz_state::megadpkr)
-
+void blitz_state::megadpkr(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M6502, CPU_CLOCK)
- MCFG_DEVICE_PROGRAM_MAP(megadpkr_map)
+ M6502(config, m_maincpu, CPU_CLOCK);
+ m_maincpu->set_addrmap(AS_PROGRAM, &blitz_state::megadpkr_map);
ADDRESS_MAP_BANK(config, "bankdev").set_map(&blitz_state::megadpkr_banked_map).set_data_width(8).set_addr_width(16).set_stride(0x4000);
@@ -4677,13 +4677,13 @@ MACHINE_CONFIG_START(blitz_state::megadpkr)
m_pia[1]->writepb_handler().set(FUNC(goldnpkr_state::mux_w));
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE((32)*8, (32)*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 0*8, 32*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(goldnpkr_state, screen_update_goldnpkr)
- MCFG_SCREEN_PALETTE(m_palette)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size((32)*8, (32)*8);
+ screen.set_visarea_full();
+ screen.set_screen_update(FUNC(goldnpkr_state::screen_update_goldnpkr));
+ screen.set_palette(m_palette);
mc6845_device &crtc(MC6845(config, "crtc", CPU_CLOCK));
crtc.set_screen("screen");
@@ -4696,9 +4696,8 @@ MACHINE_CONFIG_START(blitz_state::megadpkr)
/* sound hardware */
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("discrete", DISCRETE, goldnpkr_discrete)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
-MACHINE_CONFIG_END
+ DISCRETE(config, m_discrete, goldnpkr_discrete).add_route(ALL_OUTPUTS, "mono", 1.0);
+}
/*********************************************
diff --git a/src/mame/drivers/goldstar.cpp b/src/mame/drivers/goldstar.cpp
index e540c466f71..199eb02f203 100644
--- a/src/mame/drivers/goldstar.cpp
+++ b/src/mame/drivers/goldstar.cpp
@@ -628,7 +628,7 @@ void cb3_state::ncb3_map(address_map &map)
map(0xf840, 0xf840).w("aysnd", FUNC(ay8910_device::address_w));
map(0xf850, 0xf850).w(FUNC(cb3_state::p1_lamps_w)); /* Control Set 1 lamps */
map(0xf860, 0xf860).w(FUNC(cb3_state::p2_lamps_w)); /* Control Set 2 lamps */
- map(0xf870, 0xf870).w("snsnd", FUNC(sn76489_device::command_w)); /* guess... device is initialized, but doesn't seems to be used.*/
+ map(0xf870, 0xf870).w("snsnd", FUNC(sn76489_device::write)); /* guess... device is initialized, but doesn't seems to be used.*/
}
void goldstar_state::ncb3_readwriteport(address_map &map)
@@ -700,7 +700,7 @@ void goldstar_state::wcherry_map(address_map &map)
map(0xf640, 0xf640).w("aysnd", FUNC(ay8910_device::address_w));
map(0xf650, 0xf650).nopw(); // AM_WRITE(output_w) // unknown register: 0x3e
map(0xf660, 0xf660).nopw(); // AM_WRITE(output_w) // unknown register: 0x3e
- map(0xf670, 0xf670).w("snsnd", FUNC(sn76489_device::command_w)); /* guess... device is initialized, but doesn't seems to be used.*/
+ map(0xf670, 0xf670).w("snsnd", FUNC(sn76489_device::write)); /* guess... device is initialized, but doesn't seems to be used.*/
map(0xf800, 0xffff).ram();
}
@@ -900,7 +900,7 @@ void goldstar_state::lucky8_map(address_map &map)
map(0xb840, 0xb840).w("aysnd", FUNC(ay8910_device::address_w)); /* no sound... only use both ports for DSWs */
map(0xb850, 0xb850).w(FUNC(goldstar_state::p1_lamps_w));
map(0xb860, 0xb860).w(FUNC(goldstar_state::p2_lamps_w));
- map(0xb870, 0xb870).w("snsnd", FUNC(sn76489_device::command_w)); /* sound */
+ map(0xb870, 0xb870).w("snsnd", FUNC(sn76489_device::write)); /* sound */
map(0xc000, 0xf7ff).rom(); // could be used by some sets like super972.
map(0xf800, 0xffff).ram();
}
@@ -933,7 +933,7 @@ void goldstar_state::flaming7_map(address_map &map)
map(0xb840, 0xb840).w("aysnd", FUNC(ay8910_device::address_w)); /* no sound... only use both ports for DSWs */
map(0xb850, 0xb850).w(FUNC(goldstar_state::p1_lamps_w));
map(0xb860, 0xb860).w(FUNC(goldstar_state::p2_lamps_w));
- map(0xb870, 0xb870).w("snsnd", FUNC(sn76489_device::command_w)); /* sound */
+ map(0xb870, 0xb870).w("snsnd", FUNC(sn76489_device::write)); /* sound */
// AM_RANGE(0xc000, 0xd3ff) AM_RAM
map(0xf800, 0xffff).ram();
}
@@ -985,7 +985,7 @@ void goldstar_state::mbstar_map(address_map &map)
map(0xb840, 0xb840).w("aysnd", FUNC(ay8910_device::address_w)); /* no sound... only use both ports for DSWs */
map(0xb850, 0xb850).w(FUNC(goldstar_state::p1_lamps_w));
map(0xb860, 0xb860).w(FUNC(goldstar_state::p2_lamps_w));
- map(0xb870, 0xb870).w("snsnd", FUNC(sn76489_device::command_w)); /* sound */
+ map(0xb870, 0xb870).w("snsnd", FUNC(sn76489_device::write)); /* sound */
map(0xc000, 0xf7ff).rom();
map(0xf800, 0xffff).ram();
}
@@ -1038,7 +1038,7 @@ void wingco_state::magodds_map(address_map &map)
map(0xb840, 0xb840).w("aysnd", FUNC(ay8910_device::address_w)); /* no sound... only use both ports for DSWs */
map(0xb850, 0xb850).w(FUNC(wingco_state::magodds_outb850_w)); /* lamps */
map(0xb860, 0xb860).w(FUNC(wingco_state::magodds_outb860_w)); /* watchdog */
- map(0xb870, 0xb870).w("snsnd", FUNC(sn76489_device::command_w)); /* sound */
+ map(0xb870, 0xb870).w("snsnd", FUNC(sn76489_device::write)); /* sound */
map(0xc000, 0xffff).rom().region("maincpu", 0xc000);
}
@@ -1061,7 +1061,7 @@ void goldstar_state::kkotnoli_map(address_map &map)
map(0xb830, 0xb830).nopw(); /* no ay8910 */
map(0xb840, 0xb840).nopw(); /* no ay8910 */
map(0xb850, 0xb850).w(FUNC(goldstar_state::p1_lamps_w));
- map(0xb870, 0xb870).w("snsnd", FUNC(sn76489_device::command_w)); /* sound */
+ map(0xb870, 0xb870).w("snsnd", FUNC(sn76489_device::write)); /* sound */
map(0xf800, 0xffff).ram();
}
@@ -1100,7 +1100,7 @@ void goldstar_state::ladylinr_map(address_map &map)
map(0xb830, 0xb830).w("aysnd", FUNC(ay8910_device::address_w)); /* no sound... unused? */
map(0xb840, 0xb840).rw("aysnd", FUNC(ay8910_device::data_r), FUNC(ay8910_device::data_w));
map(0xb850, 0xb850).nopw(); /* just turn off the lamps, if exist */
- map(0xb870, 0xb870).w("snsnd", FUNC(sn76489_device::command_w)); /* sound */
+ map(0xb870, 0xb870).w("snsnd", FUNC(sn76489_device::write)); /* sound */
map(0xf800, 0xffff).ram();
}
@@ -1123,7 +1123,7 @@ void goldstar_state::wcat3_map(address_map &map)
map(0xb830, 0xb830).rw("aysnd", FUNC(ay8910_device::data_r), FUNC(ay8910_device::data_w));
map(0xb840, 0xb840).w("aysnd", FUNC(ay8910_device::address_w)); /* no sound... only use both ports for DSWs */
map(0xb850, 0xb850).w(FUNC(goldstar_state::p1_lamps_w));
- map(0xb870, 0xb870).w("snsnd", FUNC(sn76489_device::command_w)); /* sound */
+ map(0xb870, 0xb870).w("snsnd", FUNC(sn76489_device::write)); /* sound */
// AM_RANGE(0xc000, 0xc003) AM_DEVREADWRITE("ppi8255_3", i8255_device, read, write) /* Other PPI initialized? */
map(0xd000, 0xefff).rom();
map(0xf000, 0xffff).ram();
@@ -1273,9 +1273,9 @@ void unkch_state::megaline_map(address_map &map)
void goldstar_state::megaline_portmap(address_map &map)
{
map.global_mask(0xff);
- map(0xa0, 0xa0).w("sn1", FUNC(sn76489_device::command_w)); /* SN76489 #1 */
- map(0xc0, 0xc0).w("sn2", FUNC(sn76489_device::command_w)); /* SN76489 #2 */
- map(0xe0, 0xe0).w("sn3", FUNC(sn76489_device::command_w)); /* SN76489 #3 */
+ map(0xa0, 0xa0).w("sn1", FUNC(sn76489_device::write)); /* SN76489 #1 */
+ map(0xc0, 0xc0).w("sn2", FUNC(sn76489_device::write)); /* SN76489 #2 */
+ map(0xe0, 0xe0).w("sn3", FUNC(sn76489_device::write)); /* SN76489 #3 */
map(0x60, 0x60).w("aysnd", FUNC(ay8910_device::address_w)); /* AY8910 control? */
map(0x80, 0x80).rw("aysnd", FUNC(ay8910_device::data_r), FUNC(ay8910_device::data_w)); /* AY8910 Input? */
// AM_RANGE(0x01, 0x01) AM_DEVREAD("aysnd", ay8910_device, data_r)
@@ -1330,10 +1330,10 @@ void goldstar_state::bonusch_portmap(address_map &map)
map.global_mask(0xff);
map(0x10, 0x10).portr("IN0");
map(0x20, 0x20).portr("IN1");
- map(0x50, 0x50).w("sn1", FUNC(sn76489_device::command_w)); /* SN76489 #1 */
- map(0x51, 0x51).w("sn2", FUNC(sn76489_device::command_w)); /* SN76489 #2 */
- map(0x52, 0x52).w("sn3", FUNC(sn76489_device::command_w)); /* SN76489 #3 */
- map(0x53, 0x53).w("sn4", FUNC(sn76489_device::command_w)); /* SN76489 #4 */
+ map(0x50, 0x50).w("sn1", FUNC(sn76489_device::write)); /* SN76489 #1 */
+ map(0x51, 0x51).w("sn2", FUNC(sn76489_device::write)); /* SN76489 #2 */
+ map(0x52, 0x52).w("sn3", FUNC(sn76489_device::write)); /* SN76489 #3 */
+ map(0x53, 0x53).w("sn4", FUNC(sn76489_device::write)); /* SN76489 #4 */
map(0x60, 0x60).portr("IN3");
}
@@ -1369,9 +1369,9 @@ void goldstar_state::feverch_portmap(address_map &map)
map(0x00, 0x03).rw("ppi8255_0", FUNC(i8255_device::read), FUNC(i8255_device::write));
map(0x08, 0x0b).rw("ppi8255_1", FUNC(i8255_device::read), FUNC(i8255_device::write));
map(0x10, 0x13).rw("ppi8255_2", FUNC(i8255_device::read), FUNC(i8255_device::write));
- map(0x20, 0x20).w("sn1", FUNC(sn76489_device::command_w));
- map(0x28, 0x28).w("sn2", FUNC(sn76489_device::command_w));
- map(0x30, 0x30).w("sn3", FUNC(sn76489_device::command_w));
+ map(0x20, 0x20).w("sn1", FUNC(sn76489_device::write));
+ map(0x28, 0x28).w("sn2", FUNC(sn76489_device::write));
+ map(0x30, 0x30).w("sn3", FUNC(sn76489_device::write));
//map(0x38, 0x3b)
}
@@ -8443,22 +8443,22 @@ WRITE8_MEMBER(goldstar_state::ay8910_outputb_w)
}
-MACHINE_CONFIG_START(goldstar_state::goldstar)
-
+void goldstar_state::goldstar(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, CPU_CLOCK)
- MCFG_DEVICE_PROGRAM_MAP(goldstar_map)
- MCFG_DEVICE_IO_MAP(goldstar_readport)
+ Z80(config, m_maincpu, CPU_CLOCK);
+ m_maincpu->set_addrmap(AS_PROGRAM, &goldstar_state::goldstar_map);
+ m_maincpu->set_addrmap(AS_IO, &goldstar_state::goldstar_readport);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(64*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 64*8-1, 2*8, 30*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(goldstar_state, screen_update_goldstar)
- MCFG_SCREEN_PALETTE(m_palette)
- MCFG_SCREEN_VBLANK_CALLBACK(HOLDLINE("maincpu", 0))
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(64*8, 32*8);
+ screen.set_visarea(0*8, 64*8-1, 2*8, 30*8-1);
+ screen.set_screen_update(FUNC(goldstar_state::screen_update_goldstar));
+ screen.set_palette(m_palette);
+ screen.screen_vblank().set_inputline(m_maincpu, 0, HOLD_LINE);
GFXDECODE(config, m_gfxdecode, m_palette, gfx_goldstar);
PALETTE(config, m_palette).set_format(palette_device::BGR_233, 256);
@@ -8473,28 +8473,26 @@ MACHINE_CONFIG_START(goldstar_state::goldstar)
aysnd.port_b_read_callback().set_ioport("DSW3");
aysnd.add_route(ALL_OUTPUTS, "mono", 0.50);
- MCFG_DEVICE_ADD("oki", OKIM6295, OKI_CLOCK, okim6295_device::PIN7_HIGH) /* clock frequency & pin 7 not verified */
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
-
-MACHINE_CONFIG_END
-
+ OKIM6295(config, "oki", OKI_CLOCK, okim6295_device::PIN7_HIGH).add_route(ALL_OUTPUTS, "mono", 1.0); /* clock frequency & pin 7 not verified */
+}
-MACHINE_CONFIG_START(goldstar_state::goldstbl)
+void goldstar_state::goldstbl(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, CPU_CLOCK)
- MCFG_DEVICE_PROGRAM_MAP(goldstar_map)
- MCFG_DEVICE_IO_MAP(goldstar_readport)
+ Z80(config, m_maincpu, CPU_CLOCK);
+ m_maincpu->set_addrmap(AS_PROGRAM, &goldstar_state::goldstar_map);
+ m_maincpu->set_addrmap(AS_IO, &goldstar_state::goldstar_readport);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
-// MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(64*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 64*8-1, 2*8, 30*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(goldstar_state, screen_update_goldstar)
- MCFG_SCREEN_PALETTE(m_palette)
- MCFG_SCREEN_VBLANK_CALLBACK(HOLDLINE("maincpu", 0))
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+// screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(64*8, 32*8);
+ screen.set_visarea(0*8, 64*8-1, 2*8, 30*8-1);
+ screen.set_screen_update(FUNC(goldstar_state::screen_update_goldstar));
+ screen.set_palette(m_palette);
+ screen.screen_vblank().set_inputline(m_maincpu, 0, HOLD_LINE);
GFXDECODE(config, m_gfxdecode, m_palette, gfx_bl);
PALETTE(config, m_palette).set_format(palette_device::BGR_233, 256);
@@ -8509,37 +8507,38 @@ MACHINE_CONFIG_START(goldstar_state::goldstbl)
aysnd.port_b_read_callback().set_ioport("DSW3");
aysnd.add_route(ALL_OUTPUTS, "mono", 0.50);
- MCFG_DEVICE_ADD("oki", OKIM6295, OKI_CLOCK, okim6295_device::PIN7_HIGH) /* clock frequency & pin 7 not verified */
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
-MACHINE_CONFIG_END
+ OKIM6295(config, "oki", OKI_CLOCK, okim6295_device::PIN7_HIGH).add_route(ALL_OUTPUTS, "mono", 1.0); /* clock frequency & pin 7 not verified */
+}
-MACHINE_CONFIG_START(goldstar_state::moonlght)
+void goldstar_state::moonlght(machine_config &config)
+{
goldstbl(config);
- MCFG_GFXDECODE_MODIFY("gfxdecode", gfx_ml)
-MACHINE_CONFIG_END
+ m_gfxdecode->set_info(gfx_ml);
+}
-MACHINE_CONFIG_START(goldstar_state::goldfrui)
+void goldstar_state::goldfrui(machine_config &config)
+{
goldstbl(config);
- MCFG_GFXDECODE_MODIFY("gfxdecode", gfx_goldfrui)
-MACHINE_CONFIG_END
-
+ m_gfxdecode->set_info(gfx_goldfrui);
+}
-MACHINE_CONFIG_START(sanghopm_state::star100)
+void sanghopm_state::star100(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, CPU_CLOCK)
- MCFG_DEVICE_PROGRAM_MAP(star100_map)
- MCFG_DEVICE_IO_MAP(star100_readport)
+ Z80(config, m_maincpu, CPU_CLOCK);
+ m_maincpu->set_addrmap(AS_PROGRAM, &sanghopm_state::star100_map);
+ m_maincpu->set_addrmap(AS_IO, &sanghopm_state::star100_readport);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(64*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 64*8-1, 2*8, 30*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(sanghopm_state, screen_update_sangho)
- MCFG_SCREEN_PALETTE(m_palette)
- MCFG_SCREEN_VBLANK_CALLBACK(HOLDLINE("maincpu", 0))
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(64*8, 32*8);
+ screen.set_visarea(0*8, 64*8-1, 2*8, 30*8-1);
+ screen.set_screen_update(FUNC(sanghopm_state::screen_update_sangho));
+ screen.set_palette(m_palette);
+ screen.screen_vblank().set_inputline(m_maincpu, 0, HOLD_LINE);
PALETTE(config, m_palette).set_entries(0x100);
RAMDAC(config, "ramdac", 0, "palette").set_addrmap(0, &sanghopm_state::ramdac_map);
@@ -8557,30 +8556,28 @@ MACHINE_CONFIG_START(sanghopm_state::star100)
aysnd.port_b_read_callback().set_ioport("DSW6");
aysnd.add_route(ALL_OUTPUTS, "mono", 0.50);
- MCFG_DEVICE_ADD("oki", OKIM6295, OKI_CLOCK, okim6295_device::PIN7_HIGH) /* clock frequency & pin 7 not verified */
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
-
-MACHINE_CONFIG_END
-
+ OKIM6295(config, "oki", OKI_CLOCK, okim6295_device::PIN7_HIGH).add_route(ALL_OUTPUTS, "mono", 1.0); /* clock frequency & pin 7 not verified */
+}
-MACHINE_CONFIG_START(goldstar_state::super9)
+void goldstar_state::super9(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, CPU_CLOCK)
- MCFG_DEVICE_PROGRAM_MAP(goldstar_map)
-// MCFG_DEVICE_PROGRAM_MAP(nfm_map)
- MCFG_DEVICE_IO_MAP(goldstar_readport)
-// MCFG_DEVICE_IO_MAP(unkch_portmap)
+ Z80(config, m_maincpu, CPU_CLOCK);
+ m_maincpu->set_addrmap(AS_PROGRAM, &goldstar_state::goldstar_map);
+// m_maincpu->set_addrmap(AS_PROGRAM, &goldstar_state::nfm_map);
+ m_maincpu->set_addrmap(AS_IO, &goldstar_state::goldstar_readport);
+// m_maincpu->set_addrmap(AS_IO, &goldstar_state::unkch_portmap);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
-// MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(64*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 64*8-1, 2*8, 30*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(goldstar_state, screen_update_goldstar)
- MCFG_SCREEN_PALETTE(m_palette)
- MCFG_SCREEN_VBLANK_CALLBACK(HOLDLINE("maincpu", 0))
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+// screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(64*8, 32*8);
+ screen.set_visarea(0*8, 64*8-1, 2*8, 30*8-1);
+ screen.set_screen_update(FUNC(goldstar_state::screen_update_goldstar));
+ screen.set_palette(m_palette);
+ screen.screen_vblank().set_inputline(m_maincpu, 0, HOLD_LINE);
GFXDECODE(config, m_gfxdecode, m_palette, gfx_super9);
PALETTE(config, m_palette).set_format(palette_device::BGR_233, 256);
@@ -8595,9 +8592,8 @@ MACHINE_CONFIG_START(goldstar_state::super9)
aysnd.port_b_read_callback().set_ioport("DSW3");
aysnd.add_route(ALL_OUTPUTS, "mono", 0.50);
- MCFG_DEVICE_ADD("oki", OKIM6295, OKI_CLOCK, okim6295_device::PIN7_HIGH) /* clock frequency & pin 7 not verified */
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
-MACHINE_CONFIG_END
+ OKIM6295(config, "oki", OKI_CLOCK, okim6295_device::PIN7_HIGH).add_route(ALL_OUTPUTS, "mono", 1.0); /* clock frequency & pin 7 not verified */
+}
void goldstar_state::cm_palette(palette_device &palette) const
@@ -8645,12 +8641,12 @@ void goldstar_state::lucky8_palette(palette_device &palette) const
}
-MACHINE_CONFIG_START(cb3_state::ncb3)
-
+void cb3_state::ncb3(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, CPU_CLOCK)
- MCFG_DEVICE_PROGRAM_MAP(ncb3_map)
- MCFG_DEVICE_IO_MAP(ncb3_readwriteport)
+ Z80(config, m_maincpu, CPU_CLOCK);
+ m_maincpu->set_addrmap(AS_PROGRAM, &cb3_state::ncb3_map);
+ m_maincpu->set_addrmap(AS_IO, &cb3_state::ncb3_readwriteport);
I8255A(config, m_ppi[0]);
m_ppi[0]->in_pa_callback().set_ioport("IN0");
@@ -8665,14 +8661,14 @@ MACHINE_CONFIG_START(cb3_state::ncb3)
m_ppi[2]->in_pa_callback().set_ioport("DSW2");
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
-// MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(64*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 64*8-1, 2*8, 30*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(goldstar_state, screen_update_goldstar)
- MCFG_SCREEN_PALETTE(m_palette)
- MCFG_SCREEN_VBLANK_CALLBACK(HOLDLINE("maincpu", 0))
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+// screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(64*8, 32*8);
+ screen.set_visarea(0*8, 64*8-1, 2*8, 30*8-1);
+ screen.set_screen_update(FUNC(goldstar_state::screen_update_goldstar));
+ screen.set_palette(m_palette);
+ screen.screen_vblank().set_inputline(m_maincpu, 0, HOLD_LINE);
GFXDECODE(config, m_gfxdecode, m_palette, gfx_ncb3);
PALETTE(config, m_palette, FUNC(goldstar_state::cm_palette), 256);
@@ -8684,47 +8680,51 @@ MACHINE_CONFIG_START(cb3_state::ncb3)
/* sound hardware */
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("snsnd", SN76489, PSG_CLOCK)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.80)
+ SN76489(config, "snsnd", PSG_CLOCK).add_route(ALL_OUTPUTS, "mono", 0.80);
ay8910_device &aysnd(AY8910(config, "aysnd", AY_CLOCK));
aysnd.port_a_read_callback().set_ioport("DSW4");
aysnd.port_b_read_callback().set_ioport("DSW3");
aysnd.add_route(ALL_OUTPUTS, "mono", 0.50);
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(cb3_state::cb3c)
+void cb3_state::cb3c(machine_config &config)
+{
ncb3(config);
- MCFG_GFXDECODE_MODIFY("gfxdecode", gfx_cb3c)
-MACHINE_CONFIG_END
+ m_gfxdecode->set_info(gfx_cb3c);
+}
-MACHINE_CONFIG_START(cb3_state::cb3e)
+void cb3_state::cb3e(machine_config &config)
+{
ncb3(config);
- MCFG_GFXDECODE_MODIFY("gfxdecode", gfx_cb3e)
-MACHINE_CONFIG_END
+ m_gfxdecode->set_info(gfx_cb3e);
+}
-MACHINE_CONFIG_START(cb3_state::chrygld)
+void cb3_state::chrygld(machine_config &config)
+{
ncb3(config);
- MCFG_GFXDECODE_MODIFY("gfxdecode", gfx_chry10)
-MACHINE_CONFIG_END
+ m_gfxdecode->set_info(gfx_chry10);
+}
-MACHINE_CONFIG_START(cb3_state::cherrys)
+void cb3_state::cherrys(machine_config &config)
+{
ncb3(config);
- MCFG_GFXDECODE_MODIFY("gfxdecode", gfx_cherrys)
-MACHINE_CONFIG_END
+ m_gfxdecode->set_info(gfx_cherrys);
+}
-MACHINE_CONFIG_START(cb3_state::cm97)
+void cb3_state::cm97(machine_config &config)
+{
ncb3(config);
- MCFG_GFXDECODE_MODIFY("gfxdecode", gfx_cm97)
-MACHINE_CONFIG_END
-
+ m_gfxdecode->set_info(gfx_cm97);
+}
-MACHINE_CONFIG_START(goldstar_state::wcherry)
+void goldstar_state::wcherry(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, CPU_CLOCK)
- MCFG_DEVICE_PROGRAM_MAP(wcherry_map)
- MCFG_DEVICE_IO_MAP(wcherry_readwriteport)
+ Z80(config, m_maincpu, CPU_CLOCK);
+ m_maincpu->set_addrmap(AS_PROGRAM, &goldstar_state::wcherry_map);
+ m_maincpu->set_addrmap(AS_IO, &goldstar_state::wcherry_readwriteport);
I8255A(config, m_ppi[0]);
m_ppi[0]->in_pa_callback().set_ioport("IN0");
@@ -8739,14 +8739,14 @@ MACHINE_CONFIG_START(goldstar_state::wcherry)
m_ppi[2]->in_pa_callback().set_ioport("DSW2");
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
-// MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(64*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 64*8-1, 2*8, 30*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(goldstar_state, screen_update_goldstar)
- MCFG_SCREEN_PALETTE(m_palette)
- MCFG_SCREEN_VBLANK_CALLBACK(HOLDLINE("maincpu", 0))
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+// screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(64*8, 32*8);
+ screen.set_visarea(0*8, 64*8-1, 2*8, 30*8-1);
+ screen.set_screen_update(FUNC(goldstar_state::screen_update_goldstar));
+ screen.set_palette(m_palette);
+ screen.screen_vblank().set_inputline(m_maincpu, 0, HOLD_LINE);
GFXDECODE(config, m_gfxdecode, m_palette, gfx_cb3e);
PALETTE(config, m_palette, FUNC(goldstar_state::cm_palette), 256);
@@ -8757,22 +8757,21 @@ MACHINE_CONFIG_START(goldstar_state::wcherry)
/* sound hardware */
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("snsnd", SN76489, PSG_CLOCK)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.80)
+ SN76489(config, "snsnd", PSG_CLOCK).add_route(ALL_OUTPUTS, "mono", 0.80);
ay8910_device &aysnd(AY8910(config, "aysnd", AY_CLOCK));
aysnd.port_a_read_callback().set_ioport("DSW4");
aysnd.port_b_read_callback().set_ioport("DSW3");
aysnd.add_route(ALL_OUTPUTS, "mono", 0.50);
-MACHINE_CONFIG_END
-
+}
-MACHINE_CONFIG_START(cmaster_state::cm)
+void cmaster_state::cm(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, CPU_CLOCK)
- MCFG_DEVICE_PROGRAM_MAP(cm_map)
- MCFG_DEVICE_IO_MAP(cm_portmap)
+ Z80(config, m_maincpu, CPU_CLOCK);
+ m_maincpu->set_addrmap(AS_PROGRAM, &cmaster_state::cm_map);
+ m_maincpu->set_addrmap(AS_IO, &cmaster_state::cm_portmap);
I8255A(config, m_ppi[0]);
m_ppi[0]->in_pa_callback().set_ioport("IN0");
@@ -8785,14 +8784,14 @@ MACHINE_CONFIG_START(cmaster_state::cm)
m_ppi[1]->in_pc_callback().set_ioport("DSW3");
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
-// MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(64*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 64*8-1, 2*8, 30*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(goldstar_state, screen_update_goldstar)
- MCFG_SCREEN_PALETTE(m_palette)
- MCFG_SCREEN_VBLANK_CALLBACK(HOLDLINE("maincpu", 0))
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+// screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(64*8, 32*8);
+ screen.set_visarea(0*8, 64*8-1, 2*8, 30*8-1);
+ screen.set_screen_update(FUNC(goldstar_state::screen_update_goldstar));
+ screen.set_palette(m_palette);
+ screen.screen_vblank().set_inputline(m_maincpu, 0, HOLD_LINE);
GFXDECODE(config, m_gfxdecode, m_palette, gfx_cmbitmap);
PALETTE(config, m_palette, FUNC(goldstar_state::cm_palette), 256);
@@ -8806,20 +8805,21 @@ MACHINE_CONFIG_START(cmaster_state::cm)
aysnd.port_a_read_callback().set_ioport("DSW4");
aysnd.port_b_read_callback().set_ioport("DSW5");
aysnd.add_route(ALL_OUTPUTS, "mono", 0.50);
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(cmaster_state::cmasterc)
+void cmaster_state::cmasterc(machine_config &config)
+{
cm(config);
- MCFG_GFXDECODE_MODIFY("gfxdecode", gfx_cmasterc)
-MACHINE_CONFIG_END
-
+ m_gfxdecode->set_info(gfx_cmasterc);
+}
-MACHINE_CONFIG_START(goldstar_state::cmast91)
+void goldstar_state::cmast91(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, CPU_CLOCK)
- MCFG_DEVICE_PROGRAM_MAP(cm_map)
- MCFG_DEVICE_IO_MAP(cmast91_portmap)
+ Z80(config, m_maincpu, CPU_CLOCK);
+ m_maincpu->set_addrmap(AS_PROGRAM, &goldstar_state::cm_map);
+ m_maincpu->set_addrmap(AS_IO, &goldstar_state::cmast91_portmap);
I8255A(config, m_ppi[0]);
m_ppi[0]->in_pa_callback().set_ioport("IN0");
@@ -8832,14 +8832,14 @@ MACHINE_CONFIG_START(goldstar_state::cmast91)
m_ppi[1]->in_pc_callback().set_ioport("DSW3");
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
-// MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(64*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 64*8-1, 1*8, 31*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(goldstar_state, screen_update_cmast91)
- MCFG_SCREEN_PALETTE(m_palette)
- MCFG_SCREEN_VBLANK_CALLBACK(HOLDLINE("maincpu", 0))
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+// screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(64*8, 32*8);
+ screen.set_visarea(0*8, 64*8-1, 1*8, 31*8-1);
+ screen.set_screen_update(FUNC(goldstar_state::screen_update_cmast91));
+ screen.set_palette(m_palette);
+ screen.screen_vblank().set_inputline(m_maincpu, 0, HOLD_LINE);
GFXDECODE(config, m_gfxdecode, m_palette, gfx_cmast91);
PALETTE(config, m_palette, FUNC(goldstar_state::cmast91_palette), 256);
@@ -8853,7 +8853,7 @@ MACHINE_CONFIG_START(goldstar_state::cmast91)
aysnd.port_a_read_callback().set_ioport("DSW4");
aysnd.port_b_read_callback().set_ioport("DSW5");
aysnd.add_route(ALL_OUTPUTS, "mono", 0.50);
-MACHINE_CONFIG_END
+}
@@ -8863,12 +8863,12 @@ WRITE_LINE_MEMBER(wingco_state::masked_irq)
m_maincpu->set_input_line(INPUT_LINE_NMI, ASSERT_LINE);
}
-MACHINE_CONFIG_START(wingco_state::lucky8)
-
+void wingco_state::lucky8(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, CPU_CLOCK)
- MCFG_DEVICE_PROGRAM_MAP(lucky8_map)
- //MCFG_DEVICE_IO_MAP(goldstar_readport)
+ Z80(config, m_maincpu, CPU_CLOCK);
+ m_maincpu->set_addrmap(AS_PROGRAM, &wingco_state::lucky8_map);
+ //->m_maincpu->set_addrmap(AS_IO, &wingco_state::goldstar_readport);
I8255A(config, m_ppi[0]);
m_ppi[0]->in_pa_callback().set_ioport("IN0");
@@ -8887,14 +8887,14 @@ MACHINE_CONFIG_START(wingco_state::lucky8)
m_ppi[2]->out_pc_callback().set(FUNC(wingco_state::system_outputc_w));
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
-// MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(64*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 64*8-1, 2*8, 30*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(goldstar_state, screen_update_goldstar)
- MCFG_SCREEN_PALETTE(m_palette)
- MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE(*this, wingco_state, masked_irq))
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+// screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(64*8, 32*8);
+ screen.set_visarea(0*8, 64*8-1, 2*8, 30*8-1);
+ screen.set_screen_update(FUNC(goldstar_state::screen_update_goldstar));
+ screen.set_palette(m_palette);
+ screen.screen_vblank().set(FUNC(wingco_state::masked_irq));
GFXDECODE(config, m_gfxdecode, m_palette, gfx_ncb3);
PALETTE(config, m_palette, FUNC(goldstar_state::lucky8_palette)).set_format(palette_device::BGR_233, 256);
@@ -8905,8 +8905,7 @@ MACHINE_CONFIG_START(wingco_state::lucky8)
/* sound hardware */
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("snsnd", SN76489, PSG_CLOCK)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.80)
+ SN76489(config, "snsnd", PSG_CLOCK).add_route(ALL_OUTPUTS, "mono", 0.80);
ym2149_device &aysnd(YM2149(config, "aysnd", AY_CLOCK));
aysnd.port_a_read_callback().set_ioport("DSW3");
@@ -8914,14 +8913,14 @@ MACHINE_CONFIG_START(wingco_state::lucky8)
aysnd.port_a_write_callback().set(FUNC(goldstar_state::ay8910_outputa_w));
aysnd.port_b_write_callback().set(FUNC(goldstar_state::ay8910_outputb_w));
aysnd.add_route(ALL_OUTPUTS, "mono", 0.50);
-MACHINE_CONFIG_END
-
-MACHINE_CONFIG_START(wingco_state::bingowng)
+}
+void wingco_state::bingowng(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, CPU_CLOCK)
- MCFG_DEVICE_PROGRAM_MAP(lucky8_map)
- //MCFG_DEVICE_IO_MAP(goldstar_readport)
+ Z80(config, m_maincpu, CPU_CLOCK);
+ m_maincpu->set_addrmap(AS_PROGRAM, &wingco_state::lucky8_map);
+ //m_maincpu->set_addrmap(AS_IO, &wingco_state::goldstar_readport);
I8255A(config, m_ppi[0]);
m_ppi[0]->in_pa_callback().set_ioport("IN0");
@@ -8940,14 +8939,14 @@ MACHINE_CONFIG_START(wingco_state::bingowng)
m_ppi[2]->out_pc_callback().set(FUNC(wingco_state::system_outputc_w));
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
-// MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(64*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 64*8-1, 2*8, 30*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(wingco_state, screen_update_bingowng)
- MCFG_SCREEN_PALETTE(m_palette)
- MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE(*this, wingco_state, masked_irq))
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+// screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(64*8, 32*8);
+ screen.set_visarea(0*8, 64*8-1, 2*8, 30*8-1);
+ screen.set_screen_update(FUNC(wingco_state::screen_update_bingowng));
+ screen.set_palette(m_palette);
+ screen.screen_vblank().set(FUNC(wingco_state::masked_irq));
GFXDECODE(config, m_gfxdecode, m_palette, gfx_ncb3);
PALETTE(config, m_palette, FUNC(goldstar_state::lucky8_palette), 256);
@@ -8958,8 +8957,7 @@ MACHINE_CONFIG_START(wingco_state::bingowng)
/* sound hardware */
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("snsnd", SN76489, PSG_CLOCK)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.80)
+ SN76489(config, "snsnd", PSG_CLOCK).add_route(ALL_OUTPUTS, "mono", 0.80);
ay8910_device &aysnd(AY8910(config, "aysnd", AY_CLOCK));
aysnd.port_a_read_callback().set_ioport("DSW3");
@@ -8967,62 +8965,62 @@ MACHINE_CONFIG_START(wingco_state::bingowng)
aysnd.port_a_write_callback().set(FUNC(goldstar_state::ay8910_outputa_w));
aysnd.port_b_write_callback().set(FUNC(goldstar_state::ay8910_outputb_w));
aysnd.add_route(ALL_OUTPUTS, "mono", 0.50);
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(wingco_state::bingownga)
+void wingco_state::bingownga(machine_config &config)
+{
bingowng(config);
- MCFG_GFXDECODE_MODIFY("gfxdecode", gfx_bingownga)
-MACHINE_CONFIG_END
+ m_gfxdecode->set_info(gfx_bingownga);
+}
-MACHINE_CONFIG_START(wingco_state::flam7_w4)
+void wingco_state::flam7_w4(machine_config &config)
+{
lucky8(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(flaming7_map)
+ m_maincpu->set_addrmap(AS_PROGRAM, &wingco_state::flaming7_map);
m_ppi[0]->out_pc_callback().set(FUNC(wingco_state::fl7w4_outc802_w));
- MCFG_DEVICE_ADD(m_fl7w4_id, DS2401)
-MACHINE_CONFIG_END
+ DS2401(config, m_fl7w4_id);
+}
-MACHINE_CONFIG_START(wingco_state::flaming7)
+void wingco_state::flaming7(machine_config &config)
+{
lucky8(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(flaming7_map)
+ m_maincpu->set_addrmap(AS_PROGRAM, &wingco_state::flaming7_map);
- MCFG_GFXDECODE_MODIFY("gfxdecode", gfx_flaming7)
+ m_gfxdecode->set_info(gfx_flaming7);
// to do serial protection.
m_ppi[0]->out_pc_callback().set(FUNC(wingco_state::fl7w4_outc802_w));
- MCFG_DEVICE_ADD(m_fl7w4_id, DS2401)
-MACHINE_CONFIG_END
+ DS2401(config, m_fl7w4_id);
+}
-MACHINE_CONFIG_START(wingco_state::flam7_tw)
+void wingco_state::flam7_tw(machine_config &config)
+{
lucky8(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(flaming7_map)
+ m_maincpu->set_addrmap(AS_PROGRAM, &wingco_state::flaming7_map);
- MCFG_GFXDECODE_MODIFY("gfxdecode", gfx_flam7_tw)
+ m_gfxdecode->set_info(gfx_flam7_tw);
// to do serial protection.
m_ppi[0]->out_pc_callback().set(FUNC(wingco_state::fl7w4_outc802_w));
- MCFG_DEVICE_ADD(m_fl7w4_id, DS2401)
-MACHINE_CONFIG_END
+ DS2401(config, m_fl7w4_id);
+}
-MACHINE_CONFIG_START(wingco_state::mbstar)
+void wingco_state::mbstar(machine_config &config)
+{
lucky8(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(mbstar_map)
+ m_maincpu->set_addrmap(AS_PROGRAM, &wingco_state::mbstar_map);
- MCFG_SCREEN_MODIFY("screen")
- MCFG_SCREEN_UPDATE_DRIVER(wingco_state, screen_update_mbstar)
-MACHINE_CONFIG_END
+ subdevice<screen_device>("screen")->set_screen_update(FUNC(wingco_state::screen_update_mbstar));
+}
@@ -9039,12 +9037,12 @@ void wingco_state::magodds_palette(palette_device &palette) const
}
}
-MACHINE_CONFIG_START(wingco_state::magodds)
-
+void wingco_state::magodds(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, CPU_CLOCK)
- MCFG_DEVICE_PROGRAM_MAP(magodds_map)
- //MCFG_DEVICE_IO_MAP(goldstar_readport)
+ Z80(config, m_maincpu, CPU_CLOCK);
+ m_maincpu->set_addrmap(AS_PROGRAM, &wingco_state::magodds_map);
+ //m_maincpu->set_addrmap(AS_IO, &wingco_state::goldstar_readport);
I8255A(config, m_ppi[0]);
m_ppi[0]->in_pa_callback().set_ioport("IN0");
@@ -9063,14 +9061,14 @@ MACHINE_CONFIG_START(wingco_state::magodds)
m_ppi[2]->out_pc_callback().set(FUNC(wingco_state::system_outputc_w));
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
-// MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(64*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 64*8-1, 2*8, 30*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(wingco_state, screen_update_magical)
- MCFG_SCREEN_PALETTE(m_palette)
- MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE(*this, wingco_state, masked_irq))
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+// screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(64*8, 32*8);
+ screen.set_visarea(0*8, 64*8-1, 2*8, 30*8-1);
+ screen.set_screen_update(FUNC(wingco_state::screen_update_magical));
+ screen.set_palette(m_palette);
+ screen.screen_vblank().set(FUNC(wingco_state::masked_irq));
GFXDECODE(config, m_gfxdecode, m_palette, gfx_magodds);
PALETTE(config, m_palette, FUNC(wingco_state::magodds_palette), 256);
@@ -9081,8 +9079,7 @@ MACHINE_CONFIG_START(wingco_state::magodds)
/* sound hardware */
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("snsnd", SN76489, PSG_CLOCK)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.00) // shut up annoying whine
+ SN76489(config, "snsnd", PSG_CLOCK).add_route(ALL_OUTPUTS, "mono", 0.00); // shut up annoying whine
ay8910_device &aysnd(AY8910(config, "aysnd", AY_CLOCK));
aysnd.port_a_read_callback().set_ioport("DSW3");
@@ -9090,15 +9087,15 @@ MACHINE_CONFIG_START(wingco_state::magodds)
aysnd.port_a_write_callback().set(FUNC(goldstar_state::ay8910_outputa_w));
aysnd.port_b_write_callback().set(FUNC(goldstar_state::ay8910_outputb_w));
aysnd.add_route(ALL_OUTPUTS, "mono", 0.80);
-MACHINE_CONFIG_END
-
+}
-MACHINE_CONFIG_START(goldstar_state::kkotnoli)
+void goldstar_state::kkotnoli(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, CPU_CLOCK)
- MCFG_DEVICE_PROGRAM_MAP(kkotnoli_map)
- //MCFG_DEVICE_IO_MAP(goldstar_readport)
+ Z80(config, m_maincpu, CPU_CLOCK);
+ m_maincpu->set_addrmap(AS_PROGRAM, &goldstar_state::kkotnoli_map);
+ //m_maincpu->set_addrmap(AS_IO, &goldstar_state::goldstar_readport);
I8255A(config, m_ppi[0]);
m_ppi[0]->in_pa_callback().set_ioport("IN0");
@@ -9113,14 +9110,14 @@ MACHINE_CONFIG_START(goldstar_state::kkotnoli)
m_ppi[2]->in_pa_callback().set_ioport("DSW1");
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
-// MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(64*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 64*8-1, 2*8, 30*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(goldstar_state, screen_update_goldstar)
- MCFG_SCREEN_PALETTE(m_palette)
- MCFG_SCREEN_VBLANK_CALLBACK(INPUTLINE("maincpu", INPUT_LINE_NMI))
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+// screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(64*8, 32*8);
+ screen.set_visarea(0*8, 64*8-1, 2*8, 30*8-1);
+ screen.set_screen_update(FUNC(goldstar_state::screen_update_goldstar));
+ screen.set_palette(m_palette);
+ screen.screen_vblank().set_inputline(m_maincpu, INPUT_LINE_NMI);
GFXDECODE(config, m_gfxdecode, m_palette, gfx_ncb3);
PALETTE(config, m_palette, FUNC(goldstar_state::lucky8_palette), 256);
@@ -9130,18 +9127,16 @@ MACHINE_CONFIG_START(goldstar_state::kkotnoli)
/* sound hardware */
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("snsnd", SN76489, PSG_CLOCK)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.80)
-
-MACHINE_CONFIG_END
-
+ SN76489(config, "snsnd", PSG_CLOCK).add_route(ALL_OUTPUTS, "mono", 0.80);
+}
-MACHINE_CONFIG_START(goldstar_state::ladylinr)
+void goldstar_state::ladylinr(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, CPU_CLOCK)
- MCFG_DEVICE_PROGRAM_MAP(ladylinr_map)
- //MCFG_DEVICE_IO_MAP(goldstar_readport)
+ Z80(config, m_maincpu, CPU_CLOCK);
+ m_maincpu->set_addrmap(AS_PROGRAM, &goldstar_state::ladylinr_map);
+ //m_maincpu->set_addrmap(AS_IO, &goldstar_state::goldstar_readport);
I8255A(config, m_ppi[0]);
m_ppi[0]->in_pa_callback().set_ioport("IN0");
@@ -9152,14 +9147,14 @@ MACHINE_CONFIG_START(goldstar_state::ladylinr)
m_ppi[1]->in_pa_callback().set_ioport("DSW1");
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
-// MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(64*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 64*8-1, 2*8, 30*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(goldstar_state, screen_update_goldstar)
- MCFG_SCREEN_PALETTE(m_palette)
- MCFG_SCREEN_VBLANK_CALLBACK(INPUTLINE("maincpu", INPUT_LINE_NMI))
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+// screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(64*8, 32*8);
+ screen.set_visarea(0*8, 64*8-1, 2*8, 30*8-1);
+ screen.set_screen_update(FUNC(goldstar_state::screen_update_goldstar));
+ screen.set_palette(m_palette);
+ screen.screen_vblank().set_inputline(m_maincpu, INPUT_LINE_NMI);
GFXDECODE(config, m_gfxdecode, m_palette, gfx_ncb3);
PALETTE(config, m_palette, FUNC(goldstar_state::lucky8_palette), 256);
@@ -9170,19 +9165,18 @@ MACHINE_CONFIG_START(goldstar_state::ladylinr)
/* sound hardware */
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("snsnd", SN76489, PSG_CLOCK)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.80)
+ SN76489(config, "snsnd", PSG_CLOCK).add_route(ALL_OUTPUTS, "mono", 0.80);
AY8930(config, "aysnd", AY_CLOCK).add_route(ALL_OUTPUTS, "mono", 0.50); // unused?
-MACHINE_CONFIG_END
-
+}
-MACHINE_CONFIG_START(wingco_state::wcat3)
+void wingco_state::wcat3(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, CPU_CLOCK)
- MCFG_DEVICE_PROGRAM_MAP(wcat3_map)
- //MCFG_DEVICE_IO_MAP(goldstar_readport)
+ Z80(config, m_maincpu, CPU_CLOCK);
+ m_maincpu->set_addrmap(AS_PROGRAM, &wingco_state::wcat3_map);
+ //m_maincpu->set_addrmap(AS_IO, &wingco_state::goldstar_readport);
I8255A(config, m_ppi[0]);
m_ppi[0]->in_pa_callback().set_ioport("IN0");
@@ -9201,14 +9195,14 @@ MACHINE_CONFIG_START(wingco_state::wcat3)
m_ppi[2]->out_pc_callback().set(FUNC(wingco_state::system_outputc_w));
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
-// MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(64*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 64*8-1, 2*8, 30*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(goldstar_state, screen_update_goldstar)
- MCFG_SCREEN_PALETTE(m_palette)
- MCFG_SCREEN_VBLANK_CALLBACK(INPUTLINE("maincpu", INPUT_LINE_NMI))
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+// screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(64*8, 32*8);
+ screen.set_visarea(0*8, 64*8-1, 2*8, 30*8-1);
+ screen.set_screen_update(FUNC(goldstar_state::screen_update_goldstar));
+ screen.set_palette(m_palette);
+ screen.screen_vblank().set_inputline(m_maincpu, INPUT_LINE_NMI);
GFXDECODE(config, m_gfxdecode, m_palette, gfx_ncb3);
PALETTE(config, m_palette, FUNC(goldstar_state::lucky8_palette), 256);
@@ -9219,8 +9213,7 @@ MACHINE_CONFIG_START(wingco_state::wcat3)
/* sound hardware */
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("snsnd", SN76489, PSG_CLOCK)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.80)
+ SN76489(config, "snsnd", PSG_CLOCK).add_route(ALL_OUTPUTS, "mono", 0.80);
ay8910_device &aysnd(AY8910(config, "aysnd", AY_CLOCK));
aysnd.port_a_read_callback().set_ioport("DSW3");
@@ -9228,17 +9221,16 @@ MACHINE_CONFIG_START(wingco_state::wcat3)
aysnd.port_a_write_callback().set(FUNC(goldstar_state::ay8910_outputa_w));
aysnd.port_b_write_callback().set(FUNC(goldstar_state::ay8910_outputb_w));
aysnd.add_route(ALL_OUTPUTS, "mono", 0.50);
-
-MACHINE_CONFIG_END
+}
/* diff with cm machine driver: gfxdecode, OKI & portmap */
-MACHINE_CONFIG_START(cmaster_state::amcoe1)
-
+void cmaster_state::amcoe1(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, CPU_CLOCK)
- MCFG_DEVICE_PROGRAM_MAP(cm_map)
- MCFG_DEVICE_IO_MAP(amcoe1_portmap)
+ Z80(config, m_maincpu, CPU_CLOCK);
+ m_maincpu->set_addrmap(AS_PROGRAM, &cmaster_state::cm_map);
+ m_maincpu->set_addrmap(AS_IO, &cmaster_state::amcoe1_portmap);
I8255A(config, m_ppi[0]);
m_ppi[0]->in_pa_callback().set_ioport("IN0");
@@ -9251,14 +9243,14 @@ MACHINE_CONFIG_START(cmaster_state::amcoe1)
m_ppi[1]->in_pc_callback().set_ioport("DSW3");
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
-// MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(64*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 64*8-1, 2*8, 30*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(goldstar_state, screen_update_goldstar)
- MCFG_SCREEN_PALETTE(m_palette)
- MCFG_SCREEN_VBLANK_CALLBACK(HOLDLINE("maincpu", 0))
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+// screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(64*8, 32*8);
+ screen.set_visarea(0*8, 64*8-1, 2*8, 30*8-1);
+ screen.set_screen_update(FUNC(goldstar_state::screen_update_goldstar));
+ screen.set_palette(m_palette);
+ screen.screen_vblank().set_inputline(m_maincpu, 0, HOLD_LINE);
GFXDECODE(config, m_gfxdecode, m_palette, gfx_cm);
PALETTE(config, m_palette, FUNC(goldstar_state::cm_palette), 256);
@@ -9273,28 +9265,27 @@ MACHINE_CONFIG_START(cmaster_state::amcoe1)
aysnd.port_b_read_callback().set_ioport("DSW5");
aysnd.add_route(ALL_OUTPUTS, "mono", 0.50);
- MCFG_DEVICE_ADD("oki", OKIM6295, OKI_CLOCK, okim6295_device::PIN7_HIGH) /* clock frequency & pin 7 not verified */
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
-MACHINE_CONFIG_END
+ OKIM6295(config, "oki", OKI_CLOCK, okim6295_device::PIN7_HIGH).add_route(ALL_OUTPUTS, "mono", 1.0); /* clock frequency & pin 7 not verified */
+}
/* diff with cm machine driver: gfxdecode, OKI, portmap & tilemaps rect size/position */
-MACHINE_CONFIG_START(cmaster_state::amcoe1a)
+void cmaster_state::amcoe1a(machine_config &config)
+{
amcoe1(config);
/* video hardware */
- MCFG_SCREEN_MODIFY("screen")
- MCFG_SCREEN_UPDATE_DRIVER(cmaster_state, screen_update_amcoe1a)
-MACHINE_CONFIG_END
+ subdevice<screen_device>("screen")->set_screen_update(FUNC(cmaster_state::screen_update_amcoe1a));
+}
/* diff with cm machine driver: gfxdecode, AY8910 volume & portmap */
-MACHINE_CONFIG_START(cmaster_state::amcoe2)
-
+void cmaster_state::amcoe2(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, CPU_CLOCK)
- MCFG_DEVICE_PROGRAM_MAP(cm_map)
- MCFG_DEVICE_IO_MAP(amcoe2_portmap)
+ Z80(config, m_maincpu, CPU_CLOCK);
+ m_maincpu->set_addrmap(AS_PROGRAM, &cmaster_state::cm_map);
+ m_maincpu->set_addrmap(AS_IO, &cmaster_state::amcoe2_portmap);
I8255A(config, m_ppi[0]);
m_ppi[0]->in_pa_callback().set_ioport("IN0");
@@ -9307,14 +9298,14 @@ MACHINE_CONFIG_START(cmaster_state::amcoe2)
m_ppi[1]->in_pc_callback().set_ioport("DSW3");
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
-// MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(64*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 64*8-1, 2*8, 30*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(goldstar_state, screen_update_goldstar)
- MCFG_SCREEN_PALETTE(m_palette)
- MCFG_SCREEN_VBLANK_CALLBACK(HOLDLINE("maincpu", 0))
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+// screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(64*8, 32*8);
+ screen.set_visarea(0*8, 64*8-1, 2*8, 30*8-1);
+ screen.set_screen_update(FUNC(goldstar_state::screen_update_goldstar));
+ screen.set_palette(m_palette);
+ screen.screen_vblank().set_inputline(m_maincpu, 0, HOLD_LINE);
GFXDECODE(config, m_gfxdecode, m_palette, gfx_cm);
PALETTE(config, m_palette, FUNC(goldstar_state::cm_palette), 256);
@@ -9328,17 +9319,17 @@ MACHINE_CONFIG_START(cmaster_state::amcoe2)
aysnd.port_a_read_callback().set_ioport("DSW4");
aysnd.port_b_read_callback().set_ioport("DSW5");
aysnd.add_route(ALL_OUTPUTS, "mono", 2.00); /* analyzed for clips */
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(cmaster_state::nfm)
+void cmaster_state::nfm(machine_config &config)
+{
amcoe2(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(nfm_map)
+ m_maincpu->set_addrmap(AS_PROGRAM, &cmaster_state::nfm_map);
- MCFG_GFXDECODE_MODIFY("gfxdecode", gfx_nfm)
-MACHINE_CONFIG_END
+ m_gfxdecode->set_info(gfx_nfm);
+}
WRITE_LINE_MEMBER(unkch_state::vblank_irq)
@@ -9347,24 +9338,24 @@ WRITE_LINE_MEMBER(unkch_state::vblank_irq)
m_maincpu->set_input_line(INPUT_LINE_NMI, ASSERT_LINE);
}
-MACHINE_CONFIG_START(unkch_state::unkch)
-
+void unkch_state::unkch(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, CPU_CLOCK)
- MCFG_DEVICE_PROGRAM_MAP(unkch_map)
- MCFG_DEVICE_IO_MAP(unkch_portmap)
+ Z80(config, m_maincpu, CPU_CLOCK);
+ m_maincpu->set_addrmap(AS_PROGRAM, &unkch_state::unkch_map);
+ m_maincpu->set_addrmap(AS_IO, &unkch_state::unkch_portmap);
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_1);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
-// MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(64*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 64*8-1, 1*8, 31*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(unkch_state, screen_update_unkch)
- MCFG_SCREEN_PALETTE(m_palette)
- MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE(*this, unkch_state, vblank_irq))
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+// screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(64*8, 32*8);
+ screen.set_visarea(0*8, 64*8-1, 1*8, 31*8-1);
+ screen.set_screen_update(FUNC(unkch_state::screen_update_unkch));
+ screen.set_palette(m_palette);
+ screen.screen_vblank().set(FUNC(unkch_state::vblank_irq));
GFXDECODE(config, m_gfxdecode, m_palette, gfx_unkch);
PALETTE(config, m_palette).set_format(palette_device::xBGR_555, 512);
@@ -9379,28 +9370,28 @@ MACHINE_CONFIG_START(unkch_state::unkch)
aysnd.add_route(ALL_OUTPUTS, "mono", 0.50);
/* payout hardware */
- MCFG_TICKET_DISPENSER_ADD("tickets", attotime::from_msec(200), TICKET_MOTOR_ACTIVE_HIGH, TICKET_STATUS_ACTIVE_LOW)
-MACHINE_CONFIG_END
+ TICKET_DISPENSER(config, m_ticket_dispenser, attotime::from_msec(200), TICKET_MOTOR_ACTIVE_HIGH, TICKET_STATUS_ACTIVE_LOW);
+}
// hw unknown - should be somewhat similar to cm
-MACHINE_CONFIG_START(goldstar_state::pkrmast)
-
+void goldstar_state::pkrmast(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, CPU_CLOCK)
- MCFG_DEVICE_PROGRAM_MAP(cm_map)
- MCFG_DEVICE_IO_MAP(pkrmast_portmap)
+ Z80(config, m_maincpu, CPU_CLOCK);
+ m_maincpu->set_addrmap(AS_PROGRAM, &goldstar_state::cm_map);
+ m_maincpu->set_addrmap(AS_IO, &goldstar_state::pkrmast_portmap);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
-// MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(64*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 64*8-1, 2*8, 30*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(goldstar_state, screen_update_goldstar)
- MCFG_SCREEN_PALETTE(m_palette)
- MCFG_SCREEN_VBLANK_CALLBACK(HOLDLINE("maincpu", 0))
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+// screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(64*8, 32*8);
+ screen.set_visarea(0*8, 64*8-1, 2*8, 30*8-1);
+ screen.set_screen_update(FUNC(goldstar_state::screen_update_goldstar));
+ screen.set_palette(m_palette);
+ screen.screen_vblank().set_inputline(m_maincpu, 0, HOLD_LINE);
GFXDECODE(config, m_gfxdecode, m_palette, gfx_pkrmast);
PALETTE(config, m_palette, FUNC(goldstar_state::cm_palette), 256);
@@ -9414,29 +9405,29 @@ MACHINE_CONFIG_START(goldstar_state::pkrmast)
aysnd.port_a_read_callback().set_ioport("DSW4");
aysnd.port_b_read_callback().set_ioport("DSW5");
aysnd.add_route(ALL_OUTPUTS, "mono", 0.50);
-MACHINE_CONFIG_END
-
+}
-MACHINE_CONFIG_START(unkch_state::megaline)
+void unkch_state::megaline(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, CPU_CLOCK)
- MCFG_DEVICE_PROGRAM_MAP(megaline_map)
- MCFG_DEVICE_IO_MAP(megaline_portmap)
+ Z80(config, m_maincpu, CPU_CLOCK);
+ m_maincpu->set_addrmap(AS_PROGRAM, &unkch_state::megaline_map);
+ m_maincpu->set_addrmap(AS_IO, &unkch_state::megaline_portmap);
- //MCFG_DEVICE_ADD("ppi8255_0", I8255A, 0)
- //MCFG_DEVICE_ADD("ppi8255_1", I8255A, 0)
- //MCFG_DEVICE_ADD("ppi8255_2", I8255A, 0)
+ //I8255A(config, m_ppi[0], 0);
+ //I8255A(config, m_ppi[1], 0);
+ //I8255A(config, m_ppi[2], 0);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
-// MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(64*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 64*8-1, 2*8, 30*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(goldstar_state, screen_update_goldstar)
- MCFG_SCREEN_PALETTE(m_palette)
- MCFG_SCREEN_VBLANK_CALLBACK(INPUTLINE("maincpu", INPUT_LINE_NMI))
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+// screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(64*8, 32*8);
+ screen.set_visarea(0*8, 64*8-1, 2*8, 30*8-1);
+ screen.set_screen_update(FUNC(goldstar_state::screen_update_goldstar));
+ screen.set_palette(m_palette);
+ screen.screen_vblank().set_inputline(m_maincpu, INPUT_LINE_NMI);
GFXDECODE(config, m_gfxdecode, m_palette, gfx_megaline);
PALETTE(config, m_palette, FUNC(goldstar_state::lucky8_palette), 256);
@@ -9447,14 +9438,11 @@ MACHINE_CONFIG_START(unkch_state::megaline)
/* sound hardware */
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("sn1", SN76489, PSG_CLOCK)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.80)
+ SN76489(config, "sn1", PSG_CLOCK).add_route(ALL_OUTPUTS, "mono", 0.80);
- MCFG_DEVICE_ADD("sn2", SN76489, PSG_CLOCK)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.80)
+ SN76489(config, "sn2", PSG_CLOCK).add_route(ALL_OUTPUTS, "mono", 0.80);
- MCFG_DEVICE_ADD("sn3", SN76489, PSG_CLOCK)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.80)
+ SN76489(config, "sn3", PSG_CLOCK).add_route(ALL_OUTPUTS, "mono", 0.80);
ay8910_device &aysnd(AY8910(config, "aysnd", AY_CLOCK));
aysnd.port_a_read_callback().set_ioport("DSW3");
@@ -9462,28 +9450,26 @@ MACHINE_CONFIG_START(unkch_state::megaline)
aysnd.port_a_write_callback().set(FUNC(goldstar_state::ay8910_outputa_w));
aysnd.port_b_write_callback().set(FUNC(goldstar_state::ay8910_outputb_w));
aysnd.add_route(ALL_OUTPUTS, "mono", 0.50);
+}
-MACHINE_CONFIG_END
-
-
-MACHINE_CONFIG_START(unkch_state::bonusch)
+void unkch_state::bonusch(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, 12_MHz_XTAL / 2)
- MCFG_DEVICE_PROGRAM_MAP(bonusch_map)
- MCFG_DEVICE_IO_MAP(bonusch_portmap)
+ Z80(config, m_maincpu, 12_MHz_XTAL / 2);
+ m_maincpu->set_addrmap(AS_PROGRAM, &unkch_state::bonusch_map);
+ m_maincpu->set_addrmap(AS_IO, &unkch_state::bonusch_portmap);
- MCFG_DEVICE_ADD("mcu", I80C51, 12_MHz_XTAL)
- MCFG_DEVICE_DISABLE()
+ I80C51(config, "mcu", 12_MHz_XTAL).set_disable();
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_SIZE(64*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 64*8-1, 2*8, 30*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(goldstar_state, screen_update_goldstar)
- MCFG_SCREEN_PALETTE(m_palette)
- MCFG_SCREEN_VBLANK_CALLBACK(INPUTLINE("maincpu", INPUT_LINE_NMI))
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_size(64*8, 32*8);
+ screen.set_visarea(0*8, 64*8-1, 2*8, 30*8-1);
+ screen.set_screen_update(FUNC(goldstar_state::screen_update_goldstar));
+ screen.set_palette(m_palette);
+ screen.screen_vblank().set_inputline(m_maincpu, INPUT_LINE_NMI);
GFXDECODE(config, m_gfxdecode, m_palette, gfx_megaline);
PALETTE(config, m_palette, FUNC(goldstar_state::lucky8_palette), 256);
@@ -9493,25 +9479,20 @@ MACHINE_CONFIG_START(unkch_state::bonusch)
/* sound hardware */
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("sn1", SN76489, PSG_CLOCK)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.80)
-
- MCFG_DEVICE_ADD("sn2", SN76489, PSG_CLOCK)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.80)
-
- MCFG_DEVICE_ADD("sn3", SN76489, PSG_CLOCK)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.80)
+ SN76489(config, "sn1", PSG_CLOCK).add_route(ALL_OUTPUTS, "mono", 0.80);
- MCFG_DEVICE_ADD("sn4", SN76489, PSG_CLOCK)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.80)
+ SN76489(config, "sn2", PSG_CLOCK).add_route(ALL_OUTPUTS, "mono", 0.80);
-MACHINE_CONFIG_END
+ SN76489(config, "sn3", PSG_CLOCK).add_route(ALL_OUTPUTS, "mono", 0.80);
-MACHINE_CONFIG_START(unkch_state::feverch)
+ SN76489(config, "sn4", PSG_CLOCK).add_route(ALL_OUTPUTS, "mono", 0.80);
+}
- MCFG_DEVICE_ADD("maincpu", Z80, 12'000'000 / 2) // clock not verified
- MCFG_DEVICE_PROGRAM_MAP(feverch_map)
- MCFG_DEVICE_IO_MAP(feverch_portmap)
+void unkch_state::feverch(machine_config &config)
+{
+ Z80(config, m_maincpu, 12'000'000 / 2); // clock not verified
+ m_maincpu->set_addrmap(AS_PROGRAM, &unkch_state::feverch_map);
+ m_maincpu->set_addrmap(AS_IO, &unkch_state::feverch_portmap);
I8255A(config, m_ppi[0]);
m_ppi[0]->in_pa_callback().set_ioport("IN0");
@@ -9528,13 +9509,13 @@ MACHINE_CONFIG_START(unkch_state::feverch)
m_ppi[2]->in_pb_callback().set_ioport("DSW2");
m_ppi[2]->in_pc_callback().set_ioport("DSW3");
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_SIZE(64*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 64*8-1, 2*8, 30*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(unkch_state, screen_update_unkch)
- MCFG_SCREEN_PALETTE(m_palette)
- MCFG_SCREEN_VBLANK_CALLBACK(INPUTLINE("maincpu", INPUT_LINE_NMI))
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_size(64*8, 32*8);
+ screen.set_visarea(0*8, 64*8-1, 2*8, 30*8-1);
+ screen.set_screen_update(FUNC(unkch_state::screen_update_unkch));
+ screen.set_palette(m_palette);
+ screen.screen_vblank().set_inputline(m_maincpu, INPUT_LINE_NMI);
GFXDECODE(config, m_gfxdecode, m_palette, gfx_ncb3);
PALETTE(config, m_palette, FUNC(goldstar_state::lucky8_palette)).set_format(palette_device::BGR_233, 256);
@@ -9543,15 +9524,12 @@ MACHINE_CONFIG_START(unkch_state::feverch)
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("sn1", SN76489A, 12'000'000 / 12) // actually SN76489AN, clock not verified
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.80)
+ SN76489A(config, "sn1", 12'000'000 / 12).add_route(ALL_OUTPUTS, "mono", 0.80); // actually SN76489AN, clock not verified
- MCFG_DEVICE_ADD("sn2", SN76489A, 12'000'000 / 12) // actually SN76489AN, clock not verified
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.80)
+ SN76489A(config, "sn2", 12'000'000 / 12).add_route(ALL_OUTPUTS, "mono", 0.80); // actually SN76489AN, clock not verified
- MCFG_DEVICE_ADD("sn3", SN76489A, 12'000'000 / 12) // actually SN76489AN, clock not verified
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.80)
-MACHINE_CONFIG_END
+ SN76489A(config, "sn3", 12'000'000 / 12).add_route(ALL_OUTPUTS, "mono", 0.80); // actually SN76489AN, clock not verified
+}
/***************************************************************************
@@ -14067,6 +14045,49 @@ ROM_START( nfb96seb )
ROM_LOAD( "chu1920.bin", 0x0000, 0x0100, CRC(71b0e11d) SHA1(1d2a2a31d8571f580c0cb7f4833823841072b31f) )
ROM_END
+ROM_START( nfb96sec )
+ ROM_REGION( 0x10000, "maincpu", 0 )
+ ROM_LOAD( "u34",0x00000, 0x1000, CRC(65e7a70d) SHA1(77b8b7e16e842d6debf9bb13d83dbf4289ab0bd4) )
+ ROM_CONTINUE(0x4000, 0x1000)
+ ROM_CONTINUE(0x3000, 0x1000)
+ ROM_CONTINUE(0x7000, 0x1000)
+ ROM_CONTINUE(0x1000, 0x1000)
+ ROM_CONTINUE(0x6000, 0x1000)
+ ROM_CONTINUE(0x2000, 0x1000)
+ ROM_CONTINUE(0x5000, 0x1000)
+ ROM_CONTINUE(0x8000, 0x1000)
+ ROM_CONTINUE(0x9000, 0x1000)
+ ROM_CONTINUE(0xa000, 0x1000)
+ ROM_CONTINUE(0xb000, 0x1000)
+ ROM_CONTINUE(0xc000, 0x1000)
+ ROM_CONTINUE(0xd000, 0x1000)
+ ROM_CONTINUE(0xe000, 0x1000)
+ ROM_CONTINUE(0xf000, 0x1000)
+
+ ROM_REGION( 0x10000, "user1", ROMREGION_ERASEFF )
+
+ ROM_REGION( 0x18000, "gfx1", 0 ) // Same data as other sets, arranged differently
+ ROM_LOAD( "u2", 0x00000, 0x08000, CRC(7d245ff8) SHA1(eebc3c0700aaa5e8d0be22d411f097607e179d5e) )
+ ROM_CONTINUE( 0x10000, 0x08000 )
+ ROM_CONTINUE( 0x08000, 0x08000 )
+ ROM_CONTINUE( 0x00000, 0x08000 )
+
+ ROM_REGION( 0x10000, "gfx2", 0 ) // Same data as other sets, arranged differently
+ ROM_LOAD( "u35", 0x0000, 0x4000, CRC(ddd6b7cb) SHA1(ff5161d7d25b216fd507a43f9102cde1e1518593) ) // 0xxxxxxxxxxxxxx = 0xFF
+ ROM_CONTINUE( 0x2000, 0x2000 )
+ ROM_CONTINUE( 0x0000, 0x2000 )
+ ROM_LOAD( "u1", 0x4000, 0x4000, CRC(fdbb5896) SHA1(edfcfcfbf6306ff40c517eeeb05f91b869ba40d2) ) // 0xxxxxxxxxxxxxx = 0xFF
+ ROM_CONTINUE( 0x6000, 0x2000 )
+ ROM_CONTINUE( 0x4000, 0x2000 )
+
+ // taken from new fruit bonus '96, might be wrong
+ ROM_REGION( 0x200, "proms", 0 ) // palette
+ ROM_LOAD( "chu19.bin", 0x0000, 0x0100, CRC(fafc43ad) SHA1(e94592b83f19e5f9b6205473c1e06b36405ebfc2) )
+ ROM_LOAD( "chu20.bin", 0x0100, 0x0100, CRC(05224f73) SHA1(051c3ee9c63f5436e4f6c355fc308f37910a88ef) )
+
+ ROM_REGION( 0x100, "proms2", 0 ) // colours again?
+ ROM_LOAD( "chu1920.bin", 0x0000, 0x0100, CRC(71b0e11d) SHA1(1d2a2a31d8571f580c0cb7f4833823841072b31f) )
+ROM_END
// this contains elephants etc. instead of the usual symbols, maybe
// it's meant to work with the above program roms?
@@ -16856,6 +16877,7 @@ GAME( 1996, roypok96c, roypok96, amcoe2, roypok96a, cmaster_state, init_rp96
GAME( 1996, nfb96se, nfb96, amcoe2, nfb96bl, cmaster_state, empty_init, ROT0, "bootleg", "New Fruit Bonus '96 Special Edition (bootleg set 1, v97-3.3c Portuguese)", 0 )
GAME( 1996, nfb96sea, nfb96, amcoe2, nfb96bl, cmaster_state, init_nfb96sea, ROT0, "bootleg", "New Fruit Bonus '96 Special Edition (bootleg set 2, v97-3.3c English)", MACHINE_WRONG_COLORS ) // encrypted program
GAME( 1996, nfb96seb, nfb96, amcoe2, nfb96bl, cmaster_state, empty_init, ROT0, "bootleg", "New Fruit Bonus '96 Special Edition (bootleg set 3, v97-3.3c Portuguese)", MACHINE_WRONG_COLORS )
+GAME( 1996, nfb96sec, nfb96, amcoe2, nfb96bl, cmaster_state, empty_init, ROT0, "bootleg", "New Fruit Bonus '96 Special Edition (bootleg set 4, v97-3.3c English)", MACHINE_WRONG_COLORS )
GAME( 2002, carb2002, nfb96, amcoe2, nfb96bl, cmaster_state, empty_init, ROT0, "bootleg", "Carriage Bonus 2002 (bootleg)", MACHINE_WRONG_COLORS )
GAME( 2003, carb2003, nfb96, amcoe2, nfb96bl, cmaster_state, empty_init, ROT0, "bootleg", "Carriage Bonus 2003 (bootleg)", MACHINE_WRONG_COLORS )
diff --git a/src/mame/drivers/gomoku.cpp b/src/mame/drivers/gomoku.cpp
index 43ef834bdfc..cccd0fedd64 100644
--- a/src/mame/drivers/gomoku.cpp
+++ b/src/mame/drivers/gomoku.cpp
@@ -122,11 +122,12 @@ static GFXDECODE_START( gfx_gomoku )
GFXDECODE_END
-MACHINE_CONFIG_START(gomoku_state::gomoku)
+void gomoku_state::gomoku(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, XTAL(18'432'000)/12) /* 1.536 MHz ? */
- MCFG_DEVICE_PROGRAM_MAP(gomoku_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", gomoku_state, irq0_line_hold)
+ Z80(config, m_maincpu, XTAL(18'432'000)/12); /* 1.536 MHz ? */
+ m_maincpu->set_addrmap(AS_PROGRAM, &gomoku_state::gomoku_map);
+ m_maincpu->set_vblank_int("screen", FUNC(gomoku_state::irq0_line_hold));
ls259_device &latch(LS259(config, "latch")); // 7J
latch.q_out_cb<1>().set(FUNC(gomoku_state::flipscreen_w));
@@ -134,13 +135,13 @@ MACHINE_CONFIG_START(gomoku_state::gomoku)
latch.q_out_cb<7>().set_nop(); // start LED?
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(256, 256)
- MCFG_SCREEN_VISIBLE_AREA(0, 256-1, 16, 256-16-1)
- MCFG_SCREEN_UPDATE_DRIVER(gomoku_state, screen_update_gomoku)
- MCFG_SCREEN_PALETTE("palette")
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_refresh_hz(60);
+ m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ m_screen->set_size(256, 256);
+ m_screen->set_visarea(0, 256-1, 16, 256-16-1);
+ m_screen->set_screen_update(FUNC(gomoku_state::screen_update_gomoku));
+ m_screen->set_palette("palette");
GFXDECODE(config, m_gfxdecode, "palette", gfx_gomoku);
PALETTE(config, "palette", FUNC(gomoku_state::gomoku_palette), 64);
@@ -148,9 +149,8 @@ MACHINE_CONFIG_START(gomoku_state::gomoku)
/* sound hardware */
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("gomoku", GOMOKU_SOUND)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
-MACHINE_CONFIG_END
+ GOMOKU_SOUND(config, "gomoku").add_route(ALL_OUTPUTS, "mono", 1.0);
+}
ROM_START( gomoku )
diff --git a/src/mame/drivers/good.cpp b/src/mame/drivers/good.cpp
index 0c34bc2de21..3de57828b26 100644
--- a/src/mame/drivers/good.cpp
+++ b/src/mame/drivers/good.cpp
@@ -291,31 +291,31 @@ static GFXDECODE_START( gfx_good )
GFXDECODE_END
-MACHINE_CONFIG_START(good_state::good)
-
- MCFG_DEVICE_ADD("maincpu", M68000, 16000000 /2)
- MCFG_DEVICE_PROGRAM_MAP(good_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", good_state, irq2_line_hold)
+void good_state::good(machine_config &config)
+{
+ M68000(config, m_maincpu, 16000000 /2);
+ m_maincpu->set_addrmap(AS_PROGRAM, &good_state::good_map);
+ m_maincpu->set_vblank_int("screen", FUNC(good_state::irq2_line_hold));
GFXDECODE(config, m_gfxdecode, "palette", gfx_good);
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(32*16, 32*16)
- MCFG_SCREEN_VISIBLE_AREA(1*16, 23*16-1, 0*16, 14*16-1)
- MCFG_SCREEN_UPDATE_DRIVER(good_state, screen_update_good)
- MCFG_SCREEN_PALETTE("palette")
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(32*16, 32*16);
+ screen.set_visarea(1*16, 23*16-1, 0*16, 14*16-1);
+ screen.set_screen_update(FUNC(good_state::screen_update_good));
+ screen.set_palette("palette");
PALETTE(config, "palette").set_format(palette_device::xRGB_555, 0x400);
SPEAKER(config, "lspeaker").front_left();
SPEAKER(config, "rspeaker").front_right();
- MCFG_DEVICE_ADD("oki", OKIM6295, 1000000, okim6295_device::PIN7_HIGH) // clock frequency & pin 7 not verified
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 0.47)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 0.47)
-MACHINE_CONFIG_END
+ okim6295_device &oki(OKIM6295(config, "oki", 1000000, okim6295_device::PIN7_HIGH)); // clock frequency & pin 7 not verified
+ oki.add_route(ALL_OUTPUTS, "lspeaker", 0.47);
+ oki.add_route(ALL_OUTPUTS, "rspeaker", 0.47);
+}
ROM_START( good )
diff --git a/src/mame/drivers/gotcha.cpp b/src/mame/drivers/gotcha.cpp
index d910eb2fff4..5c53762d266 100644
--- a/src/mame/drivers/gotcha.cpp
+++ b/src/mame/drivers/gotcha.cpp
@@ -260,14 +260,14 @@ void gotcha_state::machine_reset()
m_banksel = 0;
}
-MACHINE_CONFIG_START(gotcha_state::gotcha)
-
+void gotcha_state::gotcha(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M68000,14318180) /* 14.31818 MHz */
- MCFG_DEVICE_PROGRAM_MAP(gotcha_map)
+ M68000(config, m_maincpu, 14.318181_MHz_XTAL); /* 14.31818 MHz */
+ m_maincpu->set_addrmap(AS_PROGRAM, &gotcha_state::gotcha_map);
- MCFG_DEVICE_ADD("audiocpu", Z80,6000000) /* 6 MHz */
- MCFG_DEVICE_PROGRAM_MAP(sound_map)
+ Z80(config, m_audiocpu, 6_MHz_XTAL); /* 6 MHz */
+ m_audiocpu->set_addrmap(AS_PROGRAM, &gotcha_state::sound_map);
/* video hardware */
screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
@@ -294,14 +294,13 @@ MACHINE_CONFIG_START(gotcha_state::gotcha)
GENERIC_LATCH_8(config, "soundlatch");
- ym2151_device &ymsnd(YM2151(config, "ymsnd", 14318180/4));
+ ym2151_device &ymsnd(YM2151(config, "ymsnd", 14.318181_MHz_XTAL / 4));
ymsnd.irq_handler().set_inputline(m_audiocpu, 0);
ymsnd.add_route(0, "mono", 0.80);
ymsnd.add_route(1, "mono", 0.80);
- MCFG_DEVICE_ADD("oki", OKIM6295, 1000000, okim6295_device::PIN7_HIGH)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.60)
-MACHINE_CONFIG_END
+ OKIM6295(config, m_oki, 1_MHz_XTAL, okim6295_device::PIN7_HIGH).add_route(ALL_OUTPUTS, "mono", 0.60);
+}
@@ -383,5 +382,42 @@ ROM_START( ppchamp )
ROM_LOAD( "uz11", 0x00000, 0x80000, CRC(3d96274c) SHA1(c7a670af86194c370bf8fb30afbe027ab78a0227) )
ROM_END
-GAMEL( 1997, gotcha, 0, gotcha, gotcha, gotcha_state, empty_init, ROT0, "Dongsung / Para", "Got-cha Mini Game Festival", MACHINE_SUPPORTS_SAVE, layout_gotcha )
-GAMEL( 1997, ppchamp, gotcha, gotcha, gotcha, gotcha_state, empty_init, ROT0, "Dongsung / Para", "Pasha Pasha Champ Mini Game Festival (Korea)", MACHINE_SUPPORTS_SAVE, layout_gotcha )
+ROM_START( ppchampa )
+ ROM_REGION( 0x80000, "maincpu", 0 )
+ ROM_LOAD16_BYTE( "d8-d15.u8", 0x00000, 0x40000, CRC(e7f8b97a) SHA1(85216fc64d3482a1108bd1bf7792db441be5e999) )
+ ROM_LOAD16_BYTE( "d0-d7.u2", 0x00001, 0x40000, CRC(35ee8ad7) SHA1(ce721899b627935703c5b2fc4fa4d107192d3814) )
+
+ ROM_REGION( 0x10000, "audiocpu", 0 )
+ ROM_LOAD( "uz02", 0x00000, 0x10000, CRC(f4f6e16b) SHA1(a360c571bee7391c66e98e5e111e78ac9732390e) )
+
+ ROM_REGION( 0x200000, "gfx1", 0 )
+ ROM_LOAD( "u42a", 0x000000, 0x20000, CRC(f0b521d1) SHA1(fe44bfa13818eee08d112c2f75e14bfd67bbefbf) )
+ ROM_CONTINUE( 0x100000, 0x20000 )
+ ROM_CONTINUE( 0x020000, 0x20000 )
+ ROM_CONTINUE( 0x120000, 0x20000 )
+ ROM_LOAD( "u42b", 0x040000, 0x20000, CRC(1107918e) SHA1(bb508da36814f2954d6a9996b777d095f6e9c243) )
+ ROM_CONTINUE( 0x140000, 0x20000 )
+ ROM_CONTINUE( 0x060000, 0x20000 )
+ ROM_CONTINUE( 0x160000, 0x20000 )
+ ROM_LOAD( "u41a", 0x080000, 0x20000, CRC(3f567d33) SHA1(77122c1cdea663922fe570e005bfbb4c779f30da) )
+ ROM_CONTINUE( 0x180000, 0x20000 )
+ ROM_CONTINUE( 0x0a0000, 0x20000 )
+ ROM_CONTINUE( 0x1a0000, 0x20000 )
+ ROM_LOAD( "u41b", 0x0c0000, 0x20000, CRC(18a3497e) SHA1(7938f4e723bf4d29de6c9eda807c37d86b7ac78c) )
+ ROM_CONTINUE( 0x1c0000, 0x20000 )
+ ROM_CONTINUE( 0x0e0000, 0x20000 )
+ ROM_CONTINUE( 0x1e0000, 0x20000 )
+
+ ROM_REGION( 0x200000, "gfx2", 0 )
+ ROM_LOAD( "u56", 0x000000, 0x80000, CRC(160e46b3) SHA1(e2bec3388d41afb9f1025d66c15fcc6ca4d40703) )
+ ROM_LOAD( "u55", 0x080000, 0x80000, CRC(7351b61c) SHA1(2ef3011a7a1ff253f45186e46cfdce5f4ef17322) )
+ ROM_LOAD( "u54", 0x100000, 0x80000, CRC(a3d8c5ef) SHA1(f59874844934f3ce76a49e4a9618510537378387) )
+ ROM_LOAD( "u53", 0x180000, 0x80000, CRC(10ca65c4) SHA1(66ba3c6e1bda18c5668a609adc60bfe547205e53) )
+
+ ROM_REGION( 0x80000, "oki", 0 )
+ ROM_LOAD( "uz11", 0x00000, 0x80000, CRC(3d96274c) SHA1(c7a670af86194c370bf8fb30afbe027ab78a0227) )
+ROM_END
+
+GAMEL( 1997, gotcha, 0, gotcha, gotcha, gotcha_state, empty_init, ROT0, "Dongsung / Para", "Got-cha Mini Game Festival", MACHINE_SUPPORTS_SAVE, layout_gotcha )
+GAMEL( 1997, ppchamp, gotcha, gotcha, gotcha, gotcha_state, empty_init, ROT0, "Dongsung / Para", "Pasha Pasha Champ Mini Game Festival (Korea, set 1)", MACHINE_SUPPORTS_SAVE, layout_gotcha )
+GAMEL( 1997, ppchampa, gotcha, gotcha, gotcha, gotcha_state, empty_init, ROT0, "Dongsung / Para", "Pasha Pasha Champ Mini Game Festival (Korea, set 2)", MACHINE_SUPPORTS_SAVE, layout_gotcha )
diff --git a/src/mame/drivers/gottlieb.cpp b/src/mame/drivers/gottlieb.cpp
index 624e1756c34..974fefb172e 100644
--- a/src/mame/drivers/gottlieb.cpp
+++ b/src/mame/drivers/gottlieb.cpp
@@ -1892,14 +1892,14 @@ void gottlieb_state::cobram3(machine_config &config)
ROM_START( reactor )
ROM_REGION( 0x10000, "maincpu", 0 )
- ROM_LOAD( "rom7", 0x8000, 0x1000, CRC(a62d86fd) SHA1(9ffce668c6f0155568ccb62a6f12a9513f3c513f) )
- ROM_LOAD( "rom6", 0x9000, 0x1000, CRC(6ed841f3) SHA1(b94272457e6a2d0ec46b510d71d69b4ab92a44aa) )
- ROM_LOAD( "rom5", 0xa000, 0x1000, CRC(d90576a3) SHA1(52af7164dc59b9f7d8a1b3ef9d4c1fc81496899f) )
- ROM_LOAD( "rom4", 0xb000, 0x1000, CRC(0155daae) SHA1(3a94952c2830c7bea126cf39b84108936d96dc0e) )
- ROM_LOAD( "rom3", 0xc000, 0x1000, CRC(f8881385) SHA1(baa7ef7309aab9b382442b25ede5d7ecd6e2c370) )
- ROM_LOAD( "rom2", 0xd000, 0x1000, CRC(3caba35b) SHA1(4d3b894821a2cff0ef55cec2b1f62f2e33009b4d) )
- ROM_LOAD( "rom1", 0xe000, 0x1000, CRC(944e1ddf) SHA1(6b487f1cb405e2ba9345190e8ab6022c790882c1) )
- ROM_LOAD( "rom0", 0xf000, 0x1000, CRC(55930aed) SHA1(37ed60386935741e8cc0b8750bfcdf6f54c1bf9e) )
+ ROM_LOAD( "gv_100_rom7.rom7.c9-10", 0x8000, 0x1000, CRC(a62d86fd) SHA1(9ffce668c6f0155568ccb62a6f12a9513f3c513f) )
+ ROM_LOAD( "gv_100_rom6.rom6.c10-11", 0x9000, 0x1000, CRC(6ed841f3) SHA1(b94272457e6a2d0ec46b510d71d69b4ab92a44aa) )
+ ROM_LOAD( "gv_100_rom5.rom5.c11-12", 0xa000, 0x1000, CRC(d90576a3) SHA1(52af7164dc59b9f7d8a1b3ef9d4c1fc81496899f) )
+ ROM_LOAD( "gv_100_rom4.rom4.c12-13", 0xb000, 0x1000, CRC(0155daae) SHA1(3a94952c2830c7bea126cf39b84108936d96dc0e) )
+ ROM_LOAD( "gv_100_rom3.rom3.c13-14", 0xc000, 0x1000, CRC(f8881385) SHA1(baa7ef7309aab9b382442b25ede5d7ecd6e2c370) )
+ ROM_LOAD( "gv_100_rom2.rom2.c14-15", 0xd000, 0x1000, CRC(3caba35b) SHA1(4d3b894821a2cff0ef55cec2b1f62f2e33009b4d) )
+ ROM_LOAD( "gv_100_rom1.rom1.c16", 0xe000, 0x1000, CRC(944e1ddf) SHA1(6b487f1cb405e2ba9345190e8ab6022c790882c1) )
+ ROM_LOAD( "gv_100_rom0.rom0.c17", 0xf000, 0x1000, CRC(55930aed) SHA1(37ed60386935741e8cc0b8750bfcdf6f54c1bf9e) )
ROM_REGION( 0x10000, "r1sound:audiocpu", 0 )
ROM_LOAD( "snd1", 0x7000, 0x800, CRC(d958a0fd) SHA1(3c383076c68a929f96d844e89b09f3075f331906) )
@@ -1909,10 +1909,10 @@ ROM_START( reactor )
/* no ROMs; RAM is used instead */
ROM_REGION( 0x8000, "sprites", 0 )
- ROM_LOAD( "fg3", 0x1000, 0x1000, CRC(8416ad53) SHA1(f868259b97675e58b6a7f1dc3c2a4ecf6aa0570e) )
- ROM_LOAD( "fg2", 0x3000, 0x1000, CRC(5489605a) SHA1(f4bbaaa8cd881dc164b118d1e516edeeea54c1d8) )
- ROM_LOAD( "fg1", 0x5000, 0x1000, CRC(18396c57) SHA1(39d90a842a03091414ed58d4128b524ecc20c9f1) )
- ROM_LOAD( "fg0", 0x7000, 0x1000, CRC(d1f20e15) SHA1(dba9aa0fec8b720a33d78b3dd1d7f74040048f7e) )
+ ROM_LOAD( "gv_100_fg_3.fg3.k7-8", 0x1000, 0x1000, CRC(8416ad53) SHA1(f868259b97675e58b6a7f1dc3c2a4ecf6aa0570e) )
+ ROM_LOAD( "gv_100_fg_2.fg2.k6-7", 0x3000, 0x1000, CRC(5489605a) SHA1(f4bbaaa8cd881dc164b118d1e516edeeea54c1d8) )
+ ROM_LOAD( "gv_100_fg_1.fg1.k5-6", 0x5000, 0x1000, CRC(18396c57) SHA1(39d90a842a03091414ed58d4128b524ecc20c9f1) )
+ ROM_LOAD( "gv_100_fg_0.fg0.k4-5", 0x7000, 0x1000, CRC(d1f20e15) SHA1(dba9aa0fec8b720a33d78b3dd1d7f74040048f7e) )
ROM_END
diff --git a/src/mame/drivers/gp2x.cpp b/src/mame/drivers/gp2x.cpp
index d92c64215f7..5e9c92722ad 100644
--- a/src/mame/drivers/gp2x.cpp
+++ b/src/mame/drivers/gp2x.cpp
@@ -362,22 +362,23 @@ void gp2x_state::gp2x_map(address_map &map)
static INPUT_PORTS_START( gp2x )
INPUT_PORTS_END
-MACHINE_CONFIG_START(gp2x_state::gp2x)
- MCFG_DEVICE_ADD("maincpu", ARM9, 80000000)
- MCFG_DEVICE_PROGRAM_MAP(gp2x_map)
+void gp2x_state::gp2x(machine_config &config)
+{
+ ARM9(config, m_maincpu, 80000000);
+ m_maincpu->set_addrmap(AS_PROGRAM, &gp2x_state::gp2x_map);
- MCFG_PALETTE_ADD("palette", 32768)
+ PALETTE(config, "palette").set_entries(32768);
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */
- MCFG_SCREEN_SIZE(320, 240)
- MCFG_SCREEN_VISIBLE_AREA(0, 319, 0, 239)
- MCFG_SCREEN_UPDATE_DRIVER(gp2x_state, screen_update_gp2x)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */
+ screen.set_size(320, 240);
+ screen.set_visarea(0, 319, 0, 239);
+ screen.set_screen_update(FUNC(gp2x_state::screen_update_gp2x));
SPEAKER(config, "lspeaker").front_left();
SPEAKER(config, "rspeaker").front_right();
-MACHINE_CONFIG_END
+}
ROM_START(gp2x)
ROM_REGION( 0x600000, "maincpu", 0 ) // contents of NAND flash
diff --git a/src/mame/drivers/gp32.cpp b/src/mame/drivers/gp32.cpp
index 37cd654af55..9dcca0f150b 100644
--- a/src/mame/drivers/gp32.cpp
+++ b/src/mame/drivers/gp32.cpp
@@ -2,7 +2,7 @@
// copyright-holders:Tim Schuerewegen
/**************************************************************************
*
- * gp32.c - Game Park GP32
+ * gp32.cpp - Game Park GP32
* Driver by Tim Schuerewegen
*
* CPU: Samsung S3C2400X01 SoC
@@ -1609,7 +1609,7 @@ void gp32_state::s3c240x_machine_start()
m_s3c240x_iic_timer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(gp32_state::s3c240x_iic_timer_exp),this), (void *)(uintptr_t)0);
m_s3c240x_iis_timer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(gp32_state::s3c240x_iis_timer_exp),this), (void *)(uintptr_t)0);
m_s3c240x_lcd_timer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(gp32_state::s3c240x_lcd_timer_exp),this), (void *)(uintptr_t)0);
- m_eeprom_data = std::make_unique<uint8_t[]>(0x2000);
+ m_eeprom_data = std::make_unique<uint8_t[]>(0x2000); // a dump of the EEPROM (S524AB0X91) resulted to be 0x1000
m_nvram->set_base(m_eeprom_data.get(), 0x2000);
smc_init();
i2s_init();
@@ -1673,33 +1673,34 @@ void gp32_state::machine_reset()
s3c240x_machine_reset();
}
-MACHINE_CONFIG_START(gp32_state::gp32)
- MCFG_DEVICE_ADD("maincpu", ARM9, 40000000)
- MCFG_DEVICE_PROGRAM_MAP(gp32_map)
+void gp32_state::gp32(machine_config &config)
+{
+ ARM9(config, m_maincpu, 40000000);
+ m_maincpu->set_addrmap(AS_PROGRAM, &gp32_state::gp32_map);
- MCFG_PALETTE_ADD("palette", 32768)
+ PALETTE(config, m_palette).set_entries(32768);
- MCFG_SCREEN_ADD("screen", LCD)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */
- MCFG_SCREEN_SIZE(240, 320)
- MCFG_SCREEN_VISIBLE_AREA(0, 239, 0, 319)
- MCFG_SCREEN_UPDATE_DRIVER(gp32_state, screen_update_gp32)
+ SCREEN(config, m_screen, SCREEN_TYPE_LCD);
+ m_screen->set_refresh_hz(60);
+ m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */
+ m_screen->set_size(240, 320);
+ m_screen->set_visarea(0, 239, 0, 319);
+ m_screen->set_screen_update(FUNC(gp32_state::screen_update_gp32));
SPEAKER(config, "lspeaker").front_left();
SPEAKER(config, "rspeaker").front_right();
- MCFG_DEVICE_ADD("ldac", DAC_16BIT_R2R_TWOS_COMPLEMENT, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 1.0) // unknown DAC
- MCFG_DEVICE_ADD("rdac", DAC_16BIT_R2R_TWOS_COMPLEMENT, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 1.0) // unknown DAC
- MCFG_DEVICE_ADD("vref", VOLTAGE_REGULATOR, 0) MCFG_VOLTAGE_REGULATOR_OUTPUT(5.0)
- MCFG_SOUND_ROUTE(0, "ldac", 1.0, DAC_VREF_POS_INPUT) MCFG_SOUND_ROUTE(0, "ldac", -1.0, DAC_VREF_NEG_INPUT)
- MCFG_SOUND_ROUTE(0, "rdac", 1.0, DAC_VREF_POS_INPUT) MCFG_SOUND_ROUTE(0, "rdac", -1.0, DAC_VREF_NEG_INPUT)
+ DAC_16BIT_R2R_TWOS_COMPLEMENT(config, m_ldac, 0).add_route(ALL_OUTPUTS, "lspeaker", 1.0); // unknown DAC
+ DAC_16BIT_R2R_TWOS_COMPLEMENT(config, m_rdac, 0).add_route(ALL_OUTPUTS, "rspeaker", 1.0); // unknown DAC
+ voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref"));
+ vref.add_route(0, "ldac", 1.0, DAC_VREF_POS_INPUT); vref.add_route(0, "ldac", -1.0, DAC_VREF_NEG_INPUT);
+ vref.add_route(0, "rdac", 1.0, DAC_VREF_POS_INPUT); vref.add_route(0, "rdac", -1.0, DAC_VREF_NEG_INPUT);
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_1);
SMARTMEDIA(config, m_smartmedia, 0);
- MCFG_SOFTWARE_LIST_ADD("memc_list","gp32")
-MACHINE_CONFIG_END
+ SOFTWARE_LIST(config, "memc_list").set_original("gp32");
+}
ROM_START( gp32 )
ROM_REGION( 0x80000, "maincpu", 0 )
@@ -1717,6 +1718,9 @@ ROM_START( gp32 )
ROM_SYSTEM_BIOS( 5, "test", "test" )
ROMX_LOAD( "test.bin", 0x000000, 0x080000, CRC(00000000) SHA1(0000000000000000000000000000000000000000), ROM_BIOS(5) )
#endif
+
+ ROM_REGION( 0x4000, "plds", ROMREGION_ERASEFF )
+ ROM_LOAD( "x2c32.jed", 0, 0x3bbb, CRC(eeec10d8) SHA1(34c4b1b865511517a5de1fa352228d95cda387c5) ) // JEDEC format for the time being. X2C32: 32 Macrocell CoolRunner-II CPLD
ROM_END
CONS(2001, gp32, 0, 0, gp32, gp32, gp32_state, empty_init, "Game Park Holdings", "GP32", ROT270|MACHINE_NOT_WORKING|MACHINE_NO_SOUND)
diff --git a/src/mame/drivers/gp_2.cpp b/src/mame/drivers/gp_2.cpp
index 6056960d33a..394f44f5405 100644
--- a/src/mame/drivers/gp_2.cpp
+++ b/src/mame/drivers/gp_2.cpp
@@ -582,7 +582,8 @@ static const z80_daisy_config daisy_chain[] =
{ nullptr }
};
-MACHINE_CONFIG_START(gp_2_state::gp_2)
+void gp_2_state::gp_2(machine_config &config)
+{
/* basic machine hardware */
Z80(config, m_maincpu, 2457600);
m_maincpu->set_addrmap(AS_PROGRAM, &gp_2_state::gp_2_map);
@@ -605,8 +606,8 @@ MACHINE_CONFIG_START(gp_2_state::gp_2)
Z80CTC(config, m_ctc, 2457600);
m_ctc->intr_callback().set_inputline(m_maincpu, INPUT_LINE_IRQ0); // Todo: absence of ints will cause a watchdog reset
- MCFG_TIMER_DRIVER_ADD_PERIODIC("gp1", gp_2_state, zero_timer, attotime::from_hz(120)) // mains freq*2
-MACHINE_CONFIG_END
+ TIMER(config, "gp1").configure_periodic(FUNC(gp_2_state::zero_timer), attotime::from_hz(120)); // mains freq*2
+}
/*-------------------------------------------------------------------
/ Agents 777 (November 1984) - Model #770
diff --git a/src/mame/drivers/gpworld.cpp b/src/mame/drivers/gpworld.cpp
index 3a659c2f8ec..c1aa1838129 100644
--- a/src/mame/drivers/gpworld.cpp
+++ b/src/mame/drivers/gpworld.cpp
@@ -500,29 +500,27 @@ GFXDECODE_END
MACHINE_CONFIG_START(gpworld_state::gpworld)
/* main cpu */
- MCFG_DEVICE_ADD("maincpu", Z80, GUESSED_CLOCK)
- MCFG_DEVICE_PROGRAM_MAP(mainmem)
- MCFG_DEVICE_IO_MAP(mainport)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", gpworld_state, vblank_callback)
+ Z80(config, m_maincpu, GUESSED_CLOCK);
+ m_maincpu->set_addrmap(AS_PROGRAM, &gpworld_state::mainmem);
+ m_maincpu->set_addrmap(AS_IO, &gpworld_state::mainport);
+ m_maincpu->set_vblank_int("screen", FUNC(gpworld_state::vblank_callback));
- MCFG_LASERDISC_LDV1000_ADD("laserdisc")
- MCFG_LASERDISC_OVERLAY_DRIVER(512, 256, gpworld_state, screen_update)
- MCFG_LASERDISC_OVERLAY_PALETTE("palette")
+ PIONEER_LDV1000(config, m_laserdisc, 0);
+ m_laserdisc->set_overlay(512, 256, FUNC(gpworld_state::screen_update));
+ m_laserdisc->set_overlay_palette(m_palette);
+ m_laserdisc->add_route(0, "lspeaker", 1.0);
+ m_laserdisc->add_route(1, "rspeaker", 1.0);
/* video hardware */
MCFG_LASERDISC_SCREEN_ADD_NTSC("screen", "laserdisc")
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_gpworld)
- MCFG_PALETTE_ADD("palette", 1024)
+ GFXDECODE(config, m_gfxdecode, m_palette, gfx_gpworld);
+ PALETTE(config, m_palette).set_entries(1024);
/* sound hardware */
SPEAKER(config, "lspeaker").front_left();
SPEAKER(config, "rspeaker").front_right();
-
- MCFG_DEVICE_MODIFY("laserdisc")
- MCFG_SOUND_ROUTE(0, "lspeaker", 1.0)
- MCFG_SOUND_ROUTE(1, "rspeaker", 1.0)
MACHINE_CONFIG_END
diff --git a/src/mame/drivers/grchamp.cpp b/src/mame/drivers/grchamp.cpp
index 76df4032055..f81460c0491 100644
--- a/src/mame/drivers/grchamp.cpp
+++ b/src/mame/drivers/grchamp.cpp
@@ -735,37 +735,37 @@ INPUT_PORTS_END
*
*************************************/
-MACHINE_CONFIG_START(grchamp_state::grchamp)
-
+void grchamp_state::grchamp(machine_config &config)
+{
/* basic machine hardware */
/* CPU BOARD */
- MCFG_DEVICE_ADD("maincpu", Z80, PIXEL_CLOCK/2)
- MCFG_DEVICE_PROGRAM_MAP(main_map)
- MCFG_DEVICE_IO_MAP(main_portmap)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", grchamp_state, cpu0_interrupt)
+ Z80(config, m_maincpu, PIXEL_CLOCK/2);
+ m_maincpu->set_addrmap(AS_PROGRAM, &grchamp_state::main_map);
+ m_maincpu->set_addrmap(AS_IO, &grchamp_state::main_portmap);
+ m_maincpu->set_vblank_int("screen", FUNC(grchamp_state::cpu0_interrupt));
/* GAME BOARD */
- MCFG_DEVICE_ADD("sub", Z80, PIXEL_CLOCK/2)
- MCFG_DEVICE_PROGRAM_MAP(sub_map)
- MCFG_DEVICE_IO_MAP(sub_portmap)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", grchamp_state, cpu1_interrupt)
+ Z80(config, m_subcpu, PIXEL_CLOCK/2);
+ m_subcpu->set_addrmap(AS_PROGRAM, &grchamp_state::sub_map);
+ m_subcpu->set_addrmap(AS_IO, &grchamp_state::sub_portmap);
+ m_subcpu->set_vblank_int("screen", FUNC(grchamp_state::cpu1_interrupt));
/* SOUND BOARD */
- MCFG_DEVICE_ADD("audiocpu", Z80, SOUND_CLOCK/2)
- MCFG_DEVICE_PROGRAM_MAP(sound_map)
- MCFG_DEVICE_PERIODIC_INT_DRIVER(grchamp_state, irq0_line_hold, (double)SOUND_CLOCK/4/16/16/10/16)
+ Z80(config, m_audiocpu, SOUND_CLOCK/2);
+ m_audiocpu->set_addrmap(AS_PROGRAM, &grchamp_state::sound_map);
+ m_audiocpu->set_periodic_int(FUNC(grchamp_state::irq0_line_hold), attotime::from_hz((double)SOUND_CLOCK/4/16/16/10/16));
WATCHDOG_TIMER(config, m_watchdog).set_vblank_count(m_screen, 8);
- MCFG_QUANTUM_TIME(attotime::from_hz(6000))
+ config.m_minimum_quantum = attotime::from_hz(6000);
/* video hardware */
GFXDECODE(config, m_gfxdecode, m_palette, gfx_grchamp);
PALETTE(config, m_palette, FUNC(grchamp_state::grchamp_palette), 32);
- MCFG_SCREEN_ADD(m_screen, RASTER)
- MCFG_SCREEN_VIDEO_ATTRIBUTES(VIDEO_ALWAYS_UPDATE)
- MCFG_SCREEN_RAW_PARAMS(PIXEL_CLOCK, HTOTAL, HBEND, HBSTART, VTOTAL, VBEND, VBSTART)
- MCFG_SCREEN_UPDATE_DRIVER(grchamp_state, screen_update)
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_video_attributes(VIDEO_ALWAYS_UPDATE);
+ m_screen->set_raw(PIXEL_CLOCK, HTOTAL, HBEND, HBSTART, VTOTAL, VBEND, VBSTART);
+ m_screen->set_screen_update(FUNC(grchamp_state::screen_update));
/* sound hardware */
@@ -785,9 +785,8 @@ MACHINE_CONFIG_START(grchamp_state::grchamp)
ay3.port_b_write_callback().set(FUNC(grchamp_state::portB_2_w));
ay3.add_route(ALL_OUTPUTS, "mono", 0.2);
- MCFG_DEVICE_ADD("discrete", DISCRETE, grchamp_discrete)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
-MACHINE_CONFIG_END
+ DISCRETE(config, m_discrete, grchamp_discrete).add_route(ALL_OUTPUTS, "mono", 1.0);
+}
diff --git a/src/mame/drivers/grfd2301.cpp b/src/mame/drivers/grfd2301.cpp
index 2e0dc245288..ac6b2e442bf 100644
--- a/src/mame/drivers/grfd2301.cpp
+++ b/src/mame/drivers/grfd2301.cpp
@@ -116,23 +116,24 @@ uint32_t grfd2301_state::screen_update(screen_device &screen, bitmap_ind16 &bitm
return 0;
}
-MACHINE_CONFIG_START(grfd2301_state::grfd2301)
+void grfd2301_state::grfd2301(machine_config &config)
+{
// basic machine hardware
- MCFG_DEVICE_ADD("maincpu", Z80, 4000000)
- MCFG_DEVICE_PROGRAM_MAP(mem_map)
- MCFG_DEVICE_IO_MAP(io_map)
+ Z80(config, m_maincpu, 4000000);
+ m_maincpu->set_addrmap(AS_PROGRAM, &grfd2301_state::mem_map);
+ m_maincpu->set_addrmap(AS_IO, &grfd2301_state::io_map);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */
- MCFG_SCREEN_UPDATE_DRIVER(grfd2301_state, screen_update)
- MCFG_SCREEN_SIZE(640, 240)
- MCFG_SCREEN_VISIBLE_AREA(0, 639, 0, 239)
- MCFG_SCREEN_PALETTE("palette")
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */
+ screen.set_screen_update(FUNC(grfd2301_state::screen_update));
+ screen.set_size(640, 240);
+ screen.set_visarea_full();
+ screen.set_palette("palette");
PALETTE(config, "palette", palette_device::MONOCHROME);
-MACHINE_CONFIG_END
+}
ROM_START( grfd2301 )
ROM_REGION( 0x1000, "maincpu", 0 )
diff --git a/src/mame/drivers/gridcomp.cpp b/src/mame/drivers/gridcomp.cpp
index 6b3c59c609e..fca86b46762 100644
--- a/src/mame/drivers/gridcomp.cpp
+++ b/src/mame/drivers/gridcomp.cpp
@@ -82,17 +82,16 @@
#include "speaker.h"
-#define VERBOSE_DBG 1
+//#define LOG_GENERAL (1U << 0) //defined in logmacro.h already
+#define LOG_KEYBOARD (1U << 1)
+#define LOG_DEBUG (1U << 2)
-#define DBG_LOG(N,M,A) \
- do { \
- if(VERBOSE_DBG>=N) \
- { \
- if( M ) \
- logerror("%11.6f at %s: %-10s",machine().time().as_double(),machine().describe_context(),(char*)M ); \
- logerror A; \
- } \
- } while (0)
+//#define VERBOSE (LOG_DEBUG)
+//#define LOG_OUTPUT_FUNC printf
+#include "logmacro.h"
+
+#define LOGKBD(...) LOGMASKED(LOG_KEYBOARD, __VA_ARGS__)
+#define LOGDBG(...) LOGMASKED(LOG_DEBUG, __VA_ARGS__)
#define I80130_TAG "osp"
@@ -166,7 +165,7 @@ READ16_MEMBER(gridcomp_state::grid_9ff0_r)
break;
}
- DBG_LOG(1, "9FF0", ("%02x == %02x\n", 0x9ff00 + (offset << 1), data));
+ LOGDBG("9FF0: %02x == %02x\n", 0x9ff00 + (offset << 1), data);
return data;
}
@@ -189,14 +188,14 @@ READ16_MEMBER(gridcomp_state::grid_keyb_r)
break;
}
- DBG_LOG(1, "Keyb", ("%02x == %02x\n", 0xdffc0 + (offset << 1), data));
+ LOGKBD("%02x == %02x\n", 0xdffc0 + (offset << 1), data);
return data;
}
WRITE16_MEMBER(gridcomp_state::grid_keyb_w)
{
- DBG_LOG(1, "Keyb", ("%02x <- %02x\n", 0xdffc0 + (offset << 1), data));
+ LOGKBD("%02x <- %02x\n", 0xdffc0 + (offset << 1), data);
}
void gridcomp_state::kbd_put(u16 data)
@@ -224,7 +223,7 @@ READ16_MEMBER(gridcomp_state::grid_gpib_r)
break;
}
- DBG_LOG(1, "GPIB", ("%02x == %02x\n", 0xdff80 + (offset << 1), data));
+ LOG("GPIB %02x == %02x\n", 0xdff80 + (offset << 1), data);
return data;
}
@@ -238,7 +237,7 @@ WRITE16_MEMBER(gridcomp_state::grid_gpib_w)
break;
}
- DBG_LOG(1, "GPIB", ("%02x <- %02x\n", 0xdff80 + (offset << 1), data));
+ LOG("GPIB %02x <- %02x\n", 0xdff80 + (offset << 1), data);
}
@@ -292,15 +291,12 @@ uint32_t gridcomp_state::screen_update_113x(screen_device &screen, bitmap_ind16
void gridcomp_state::init_gridcomp()
{
- DBG_LOG(0, "init", ("driver_init()\n"));
}
MACHINE_START_MEMBER(gridcomp_state, gridcomp)
{
address_space &program = m_maincpu->space(AS_PROGRAM);
- DBG_LOG(0, "init", ("machine_start()\n"));
-
program.install_readwrite_bank(0, m_ram->size() - 1, "bank10");
membank("bank10")->set_base(m_ram->pointer());
@@ -309,8 +305,6 @@ MACHINE_START_MEMBER(gridcomp_state, gridcomp)
MACHINE_RESET_MEMBER(gridcomp_state, gridcomp)
{
- DBG_LOG(0, "init", ("machine_reset()\n"));
-
m_kbd_ready = false;
}
@@ -327,7 +321,7 @@ void gridcomp_state::grid1101_map(address_map &map)
map(0xdfea0, 0xdfeaf).unmaprw(); // ??
map(0xdfec0, 0xdfecf).rw(m_modem, FUNC(i8255_device::read), FUNC(i8255_device::write)).umask16(0x00ff); // incl. DTMF generator
map(0xdff40, 0xdff5f).noprw(); // ?? machine ID EAROM, RTC
- map(0xdff80, 0xdff8f).rw("hpib", FUNC(tms9914_device::reg8_r), FUNC(tms9914_device::reg8_w)).umask16(0x00ff);
+ map(0xdff80, 0xdff8f).rw("hpib", FUNC(tms9914_device::read), FUNC(tms9914_device::write)).umask16(0x00ff);
map(0xdffc0, 0xdffcf).rw(FUNC(gridcomp_state::grid_keyb_r), FUNC(gridcomp_state::grid_keyb_w)); // Intel 8741 MCU
map(0xfc000, 0xfffff).rom().region("user1", 0);
}
@@ -344,7 +338,7 @@ void gridcomp_state::grid1121_map(address_map &map)
map(0xdfea0, 0xdfeaf).unmaprw(); // ??
map(0xdfec0, 0xdfecf).rw(m_modem, FUNC(i8255_device::read), FUNC(i8255_device::write)).umask16(0x00ff); // incl. DTMF generator
map(0xdff40, 0xdff5f).noprw(); // ?? machine ID EAROM, RTC
- map(0xdff80, 0xdff8f).rw("hpib", FUNC(tms9914_device::reg8_r), FUNC(tms9914_device::reg8_w)).umask16(0x00ff);
+ map(0xdff80, 0xdff8f).rw("hpib", FUNC(tms9914_device::read), FUNC(tms9914_device::write)).umask16(0x00ff);
map(0xdffc0, 0xdffcf).rw(FUNC(gridcomp_state::grid_keyb_r), FUNC(gridcomp_state::grid_keyb_w)); // Intel 8741 MCU
map(0xfc000, 0xfffff).rom().region("user1", 0);
}
@@ -367,11 +361,12 @@ INPUT_PORTS_END
* IRQ6 8087
* IRQ7 ring
*/
-MACHINE_CONFIG_START(gridcomp_state::grid1101)
- MCFG_DEVICE_ADD("maincpu", I8086, XTAL(15'000'000) / 3)
- MCFG_DEVICE_PROGRAM_MAP(grid1101_map)
- MCFG_DEVICE_IO_MAP(grid1101_io)
- MCFG_DEVICE_IRQ_ACKNOWLEDGE_DRIVER(gridcomp_state, irq_callback)
+void gridcomp_state::grid1101(machine_config &config)
+{
+ I8086(config, m_maincpu, XTAL(15'000'000) / 3);
+ m_maincpu->set_addrmap(AS_PROGRAM, &gridcomp_state::grid1101_map);
+ m_maincpu->set_addrmap(AS_IO, &gridcomp_state::grid1101_io);
+ m_maincpu->set_irq_acknowledge_callback(FUNC(gridcomp_state::irq_callback));
MCFG_MACHINE_START_OVERRIDE(gridcomp_state, gridcomp)
MCFG_MACHINE_RESET_OVERRIDE(gridcomp_state, gridcomp)
@@ -380,14 +375,14 @@ MACHINE_CONFIG_START(gridcomp_state::grid1101)
m_osp->irq().set_inputline("maincpu", 0);
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("speaker", SPEAKER_SOUND)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.00)
+ SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 1.00);
- MCFG_SCREEN_ADD_MONOCHROME("screen", LCD, rgb_t::amber()) // actually a kind of EL display
- MCFG_SCREEN_UPDATE_DRIVER(gridcomp_state, screen_update_110x)
- MCFG_SCREEN_RAW_PARAMS(XTAL(15'000'000)/2, 424, 0, 320, 262, 0, 240) // XXX 66 Hz refresh
- MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE(I80130_TAG, i80130_device, ir3_w))
- MCFG_SCREEN_PALETTE("palette")
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_LCD)); // actually a kind of EL display
+ screen.set_color(rgb_t::amber());
+ screen.set_screen_update(FUNC(gridcomp_state::screen_update_110x));
+ screen.set_raw(XTAL(15'000'000)/2, 424, 0, 320, 262, 0, 240); // XXX 66 Hz refresh
+ screen.screen_vblank().set(m_osp, FUNC(i80130_device::ir3_w));
+ screen.set_palette("palette");
PALETTE(config, "palette", palette_device::MONOCHROME);
@@ -411,23 +406,24 @@ MACHINE_CONFIG_START(gridcomp_state::grid1101)
hpib.srq_write_cb().set(IEEE488_TAG, FUNC(ieee488_device::host_srq_w));
hpib.atn_write_cb().set(IEEE488_TAG, FUNC(ieee488_device::host_atn_w));
hpib.ren_write_cb().set(IEEE488_TAG, FUNC(ieee488_device::host_ren_w));
- MCFG_IEEE488_BUS_ADD()
- MCFG_IEEE488_EOI_CALLBACK(WRITELINE("hpib", tms9914_device, eoi_w))
- MCFG_IEEE488_DAV_CALLBACK(WRITELINE("hpib", tms9914_device, dav_w))
- MCFG_IEEE488_NRFD_CALLBACK(WRITELINE("hpib", tms9914_device, nrfd_w))
- MCFG_IEEE488_NDAC_CALLBACK(WRITELINE("hpib", tms9914_device, ndac_w))
- MCFG_IEEE488_IFC_CALLBACK(WRITELINE("hpib", tms9914_device, ifc_w))
- MCFG_IEEE488_SRQ_CALLBACK(WRITELINE("hpib", tms9914_device, srq_w))
- MCFG_IEEE488_ATN_CALLBACK(WRITELINE("hpib", tms9914_device, atn_w))
- MCFG_IEEE488_REN_CALLBACK(WRITELINE("hpib", tms9914_device, ren_w))
- MCFG_IEEE488_SLOT_ADD("ieee_rem", 0, remote488_devices, nullptr)
+
+ ieee488_device &ieee(IEEE488(config, IEEE488_TAG));
+ ieee.eoi_callback().set("hpib", FUNC(tms9914_device::eoi_w));
+ ieee.dav_callback().set("hpib", FUNC(tms9914_device::dav_w));
+ ieee.nrfd_callback().set("hpib", FUNC(tms9914_device::nrfd_w));
+ ieee.ndac_callback().set("hpib", FUNC(tms9914_device::ndac_w));
+ ieee.ifc_callback().set("hpib", FUNC(tms9914_device::ifc_w));
+ ieee.srq_callback().set("hpib", FUNC(tms9914_device::srq_w));
+ ieee.atn_callback().set("hpib", FUNC(tms9914_device::atn_w));
+ ieee.ren_callback().set("hpib", FUNC(tms9914_device::ren_w));
+ IEEE488_SLOT(config, "ieee_rem", 0, remote488_devices, nullptr);
I8274_NEW(config, m_uart8274, XTAL(4'032'000));
- MCFG_DEVICE_ADD("modem", I8255, 0)
+ I8255(config, "modem", 0);
RAM(config, m_ram).set_default_size("256K").set_default_value(0);
-MACHINE_CONFIG_END
+}
void gridcomp_state::grid1109(machine_config &config)
{
@@ -435,12 +431,12 @@ void gridcomp_state::grid1109(machine_config &config)
m_ram->set_default_size("512K");
}
-MACHINE_CONFIG_START(gridcomp_state::grid1121)
+void gridcomp_state::grid1121(machine_config &config)
+{
grid1101(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_CLOCK(XTAL(24'000'000) / 3) // XXX
- MCFG_DEVICE_PROGRAM_MAP(grid1121_map)
-MACHINE_CONFIG_END
+ m_maincpu->set_clock(XTAL(24'000'000) / 3); // XXX
+ m_maincpu->set_addrmap(AS_PROGRAM, &gridcomp_state::grid1121_map);
+}
void gridcomp_state::grid1129(machine_config &config)
{
@@ -448,12 +444,12 @@ void gridcomp_state::grid1129(machine_config &config)
m_ram->set_default_size("512K");
}
-MACHINE_CONFIG_START(gridcomp_state::grid1131)
+void gridcomp_state::grid1131(machine_config &config)
+{
grid1121(config);
- MCFG_SCREEN_MODIFY("screen")
- MCFG_SCREEN_UPDATE_DRIVER(gridcomp_state, screen_update_113x)
- MCFG_SCREEN_RAW_PARAMS(XTAL(15'000'000)/2, 720, 0, 512, 262, 0, 240) // XXX
-MACHINE_CONFIG_END
+ subdevice<screen_device>("screen")->set_screen_update(FUNC(gridcomp_state::screen_update_113x));
+ subdevice<screen_device>("screen")->set_raw(XTAL(15'000'000)/2, 720, 0, 512, 262, 0, 240); // XXX
+}
void gridcomp_state::grid1139(machine_config &config)
{
diff --git a/src/mame/drivers/groundfx.cpp b/src/mame/drivers/groundfx.cpp
index 145378de015..42dac3e78bc 100644
--- a/src/mame/drivers/groundfx.cpp
+++ b/src/mame/drivers/groundfx.cpp
@@ -235,12 +235,12 @@ INTERRUPT_GEN_MEMBER(groundfx_state::interrupt)
device.execute().set_input_line(4, HOLD_LINE);
}
-MACHINE_CONFIG_START(groundfx_state::groundfx)
-
+void groundfx_state::groundfx(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M68EC020, XTAL(40'000'000)/2) /* 20MHz - verified */
- MCFG_DEVICE_PROGRAM_MAP(groundfx_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", groundfx_state, interrupt)
+ M68EC020(config, m_maincpu, XTAL(40'000'000)/2); /* 20MHz - verified */
+ m_maincpu->set_addrmap(AS_PROGRAM, &groundfx_state::groundfx_map);
+ m_maincpu->set_vblank_int("screen", FUNC(groundfx_state::interrupt));
EEPROM_93C46_16BIT(config, "eeprom");
@@ -262,13 +262,13 @@ MACHINE_CONFIG_START(groundfx_state::groundfx)
tc0510nio.read_7_callback().set_ioport("SYSTEM");
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(40*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0, 40*8-1, 3*8, 32*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(groundfx_state, screen_update)
- MCFG_SCREEN_PALETTE(m_palette)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(40*8, 32*8);
+ screen.set_visarea(0, 40*8-1, 3*8, 32*8-1);
+ screen.set_screen_update(FUNC(groundfx_state::screen_update));
+ screen.set_palette(m_palette);
GFXDECODE(config, m_gfxdecode, m_palette, gfx_groundfx);
PALETTE(config, m_palette).set_format(palette_device::xRGB_888, 16384);
@@ -289,7 +289,7 @@ MACHINE_CONFIG_START(groundfx_state::groundfx)
/* sound hardware */
TAITO_EN(config, "taito_en", 0);
-MACHINE_CONFIG_END
+}
/***************************************************************************
DRIVERS
diff --git a/src/mame/drivers/gstream.cpp b/src/mame/drivers/gstream.cpp
index e24cc45e37b..42cc5dc63ad 100644
--- a/src/mame/drivers/gstream.cpp
+++ b/src/mame/drivers/gstream.cpp
@@ -828,23 +828,23 @@ void gstream_state::machine_reset()
m_oki_bank[0] = m_oki_bank[1] = 0;
}
-MACHINE_CONFIG_START(gstream_state::gstream)
-
+void gstream_state::gstream(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", E132XT, 16000000*4) /* 4x internal multiplier */
- MCFG_DEVICE_PROGRAM_MAP(gstream_32bit_map)
- MCFG_DEVICE_IO_MAP(gstream_io)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", gstream_state, irq0_line_hold)
+ E132XT(config, m_maincpu, 16000000*4); /* 4x internal multiplier */
+ m_maincpu->set_addrmap(AS_PROGRAM, &gstream_state::gstream_32bit_map);
+ m_maincpu->set_addrmap(AS_IO, &gstream_state::gstream_io);
+ m_maincpu->set_vblank_int("screen", FUNC(gstream_state::irq0_line_hold));
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_1);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(320, 240)
- MCFG_SCREEN_VISIBLE_AREA(0, 319, 0, 239)
- MCFG_SCREEN_UPDATE_DRIVER(gstream_state, screen_update)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(320, 240);
+ screen.set_visarea_full();
+ screen.set_screen_update(FUNC(gstream_state::screen_update));
PALETTE(config, m_palette).set_format(palette_device::BGR_565, 0x1000 + 0x400 + 0x400 + 0x400); // sprites + 3 bg layers
@@ -852,30 +852,28 @@ MACHINE_CONFIG_START(gstream_state::gstream)
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("oki1", OKIM6295, 1000000, okim6295_device::PIN7_HIGH) /* 1 Mhz? */
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.00)
-
- MCFG_DEVICE_ADD("oki2", OKIM6295, 1000000, okim6295_device::PIN7_HIGH) /* 1 Mhz? */
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.00)
-MACHINE_CONFIG_END
+ OKIM6295(config, m_oki[0], 1000000, okim6295_device::PIN7_HIGH).add_route(ALL_OUTPUTS, "mono", 1.00); /* 1 Mhz? */
-MACHINE_CONFIG_START(gstream_state::x2222)
+ OKIM6295(config, m_oki[1], 1000000, okim6295_device::PIN7_HIGH).add_route(ALL_OUTPUTS, "mono", 1.00); /* 1 Mhz? */
+}
+void gstream_state::x2222(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", E132XT, 16000000*4) /* 4x internal multiplier */
- MCFG_DEVICE_PROGRAM_MAP(x2222_32bit_map)
- MCFG_DEVICE_IO_MAP(x2222_io)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", gstream_state, irq0_line_hold)
+ E132XT(config, m_maincpu, 16000000*4); /* 4x internal multiplier */
+ m_maincpu->set_addrmap(AS_PROGRAM, &gstream_state::x2222_32bit_map);
+ m_maincpu->set_addrmap(AS_IO, &gstream_state::x2222_io);
+ m_maincpu->set_vblank_int("screen", FUNC(gstream_state::irq0_line_hold));
// NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_1);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(320, 240)
- MCFG_SCREEN_VISIBLE_AREA(0, 319, 0, 239)
- MCFG_SCREEN_UPDATE_DRIVER(gstream_state, screen_update)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(320, 240);
+ screen.set_visarea_full();
+ screen.set_screen_update(FUNC(gstream_state::screen_update));
PALETTE(config, m_palette, palette_device::BGR_565);
@@ -885,9 +883,8 @@ MACHINE_CONFIG_START(gstream_state::x2222)
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("oki1", OKIM6295, 1000000, okim6295_device::PIN7_HIGH) /* 1 Mhz? */
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.00)
-MACHINE_CONFIG_END
+ OKIM6295(config, m_oki[0], 1000000, okim6295_device::PIN7_HIGH).add_route(ALL_OUTPUTS, "mono", 1.00); /* 1 Mhz? */
+}
ROM_START( gstream )
diff --git a/src/mame/drivers/gsword.cpp b/src/mame/drivers/gsword.cpp
index ee65e641dcd..43ef1af09de 100644
--- a/src/mame/drivers/gsword.cpp
+++ b/src/mame/drivers/gsword.cpp
@@ -318,12 +318,12 @@ void gsword_state_base::machine_reset()
WRITE8_MEMBER(gsword_state_base::ay8910_control_port_0_w)
{
- m_ay0->address_w(space,offset,data);
+ m_ay0->address_w(data);
m_fake8910_0 = data;
}
WRITE8_MEMBER(gsword_state_base::ay8910_control_port_1_w)
{
- m_ay1->address_w(space,offset,data);
+ m_ay1->address_w(data);
m_fake8910_1 = data;
}
@@ -914,21 +914,21 @@ static GFXDECODE_START( gfx_gsword )
GFXDECODE_END
-MACHINE_CONFIG_START(gsword_state::gsword)
-
+void gsword_state::gsword(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD(m_maincpu, Z80, XTAL(18'000'000)/6) /* verified on pcb */
- MCFG_DEVICE_PROGRAM_MAP(cpu1_map)
- MCFG_DEVICE_IO_MAP(cpu1_io_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", gsword_state, irq0_line_hold)
+ Z80(config, m_maincpu, XTAL(18'000'000)/6); /* verified on pcb */
+ m_maincpu->set_addrmap(AS_PROGRAM, &gsword_state::cpu1_map);
+ m_maincpu->set_addrmap(AS_IO, &gsword_state::cpu1_io_map);
+ m_maincpu->set_vblank_int("screen", FUNC(gsword_state::irq0_line_hold));
- MCFG_DEVICE_ADD(m_subcpu, Z80, XTAL(18'000'000)/6) /* verified on pcb */
- MCFG_DEVICE_PROGRAM_MAP(cpu2_map)
- MCFG_DEVICE_IO_MAP(cpu2_io_map)
- MCFG_DEVICE_PERIODIC_INT_DRIVER(gsword_state, sound_interrupt, 4*60)
+ Z80(config, m_subcpu, XTAL(18'000'000)/6); /* verified on pcb */
+ m_subcpu->set_addrmap(AS_PROGRAM, &gsword_state::cpu2_map);
+ m_subcpu->set_addrmap(AS_IO, &gsword_state::cpu2_io_map);
+ m_subcpu->set_periodic_int(FUNC(gsword_state::sound_interrupt), attotime::from_hz(4*60));
- MCFG_DEVICE_ADD(m_audiocpu, Z80, XTAL(18'000'000)/6) /* verified on pcb */
- MCFG_DEVICE_PROGRAM_MAP(cpu3_map)
+ Z80(config, m_audiocpu, XTAL(18'000'000)/6); /* verified on pcb */
+ m_audiocpu->set_addrmap(AS_PROGRAM, &gsword_state::cpu3_map);
upi41_cpu_device &mcu1(I8041(config, "mcu1", 12'000'000/2)); // clock unknown, using value from gladiatr
mcu1.p1_in_cb().set([this] () { return ioport("MCU1.P1")->read() | BIT(m_mcu2_p1, 0); });
@@ -955,16 +955,16 @@ MACHINE_CONFIG_START(gsword_state::gsword)
CLOCK(config, "tclk", 12'000'000/8/128/2).signal_handler().set([this] (int state) { m_tclk_val = state != 0; });
// lazy way to ensure communication works
- MCFG_QUANTUM_PERFECT_CPU("mcu1")
+ config.m_perfect_cpu_quantum = subtag("mcu1");
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */)
- MCFG_SCREEN_SIZE(32*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(gsword_state, screen_update_gsword)
- MCFG_SCREEN_PALETTE(m_palette)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */
+ screen.set_size(32*8, 32*8);
+ screen.set_visarea(0*8, 32*8-1, 2*8, 30*8-1);
+ screen.set_screen_update(FUNC(gsword_state::screen_update_gsword));
+ screen.set_palette(m_palette);
GFXDECODE(config, m_gfxdecode, m_palette, gfx_gsword);
PALETTE(config, m_palette, FUNC(gsword_state::gsword_palette), 64*4 + 64*4, 256);
@@ -980,23 +980,23 @@ MACHINE_CONFIG_START(gsword_state::gsword)
m_ay1->port_a_write_callback().set(FUNC(gsword_state::nmi_set_w));
m_ay1->add_route(ALL_OUTPUTS, "mono", 0.30);
- MCFG_DEVICE_ADD("msm", MSM5205, XTAL(400'000)) /* verified on pcb */
- MCFG_MSM5205_PRESCALER_SELECTOR(SEX_4B) /* vclk input mode */
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.60)
-MACHINE_CONFIG_END
-
-MACHINE_CONFIG_START(josvolly_state::josvolly)
+ msm5205_device &msm(MSM5205(config, "msm", XTAL(400'000))); /* verified on pcb */
+ msm.set_prescaler_selector(msm5205_device::SEX_4B); /* vclk input mode */
+ msm.add_route(ALL_OUTPUTS, "mono", 0.60);
+}
+void josvolly_state::josvolly(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, 18000000/4) /* ? */
- MCFG_DEVICE_PROGRAM_MAP(cpu1_map)
- MCFG_DEVICE_IO_MAP(josvolly_cpu1_io_map)
- MCFG_DEVICE_PERIODIC_INT_DRIVER(josvolly_state, irq0_line_hold, 2*60)
+ Z80(config, m_maincpu, 18000000/4); /* ? */
+ m_maincpu->set_addrmap(AS_PROGRAM, &josvolly_state::cpu1_map);
+ m_maincpu->set_addrmap(AS_IO, &josvolly_state::josvolly_cpu1_io_map);
+ m_maincpu->set_periodic_int(FUNC(josvolly_state::irq0_line_hold), attotime::from_hz(2*60));
- MCFG_DEVICE_ADD("audiocpu", Z80, 12000000/4) /* ? */
- MCFG_DEVICE_PROGRAM_MAP(josvolly_cpu2_map)
- MCFG_DEVICE_IO_MAP(josvolly_cpu2_io_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", josvolly_state, irq0_line_assert)
+ Z80(config, m_audiocpu, 12000000/4); /* ? */
+ m_audiocpu->set_addrmap(AS_PROGRAM, &josvolly_state::josvolly_cpu2_map);
+ m_audiocpu->set_addrmap(AS_IO, &josvolly_state::josvolly_cpu2_io_map);
+ m_audiocpu->set_vblank_int("screen", FUNC(josvolly_state::irq0_line_assert));
upi41_cpu_device &mcu1(I8741(config, "mcu1", 18000000/2)); /* ? */
mcu1.p1_in_cb().set(FUNC(josvolly_state::mcu1_p1_r));
@@ -1019,17 +1019,16 @@ MACHINE_CONFIG_START(josvolly_state::josvolly)
ppi.in_pc_callback().set_ioport("IN0"); // START
// the second MCU polls the first MCU's outputs, so it needs tight sync
- MCFG_QUANTUM_PERFECT_CPU("mcu2")
-
+ config.m_perfect_cpu_quantum = subtag("mcu2");
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */)
- MCFG_SCREEN_SIZE(32*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(josvolly_state, screen_update_gsword)
- MCFG_SCREEN_PALETTE(m_palette)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */
+ screen.set_size(32*8, 32*8);
+ screen.set_visarea(0*8, 32*8-1, 2*8, 30*8-1);
+ screen.set_screen_update(FUNC(josvolly_state::screen_update_gsword));
+ screen.set_palette(m_palette);
GFXDECODE(config, m_gfxdecode, m_palette, gfx_gsword);
PALETTE(config, m_palette, FUNC(josvolly_state::josvolly_palette), 64*4 + 64*4, 256);
@@ -1038,14 +1037,12 @@ MACHINE_CONFIG_START(josvolly_state::josvolly)
SPEAKER(config, "mono").front_center();
AY8910(config, m_ay0, 1500000).add_route(ALL_OUTPUTS, "mono", 0.30);
-
AY8910(config, m_ay1, 1500000).add_route(ALL_OUTPUTS, "mono", 0.30);
#if 0
- MCFG_DEVICE_ADD("msm", MSM5205, 384000)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.60)
+ MSM5205(config, "msm", 384000).add_route(ALL_OUTPUTS, "mono", 0.60);
#endif
-MACHINE_CONFIG_END
+}
/***************************************************************************
diff --git a/src/mame/drivers/gts80a.cpp b/src/mame/drivers/gts80a.cpp
index 68fb7a4ff29..7d150b8e492 100644
--- a/src/mame/drivers/gts80a.cpp
+++ b/src/mame/drivers/gts80a.cpp
@@ -463,25 +463,25 @@ void caveman_state::video_io_map(address_map &map)
}
-MACHINE_CONFIG_START(caveman_state::caveman)
+void caveman_state::caveman(machine_config &config)
+{
gts80a_ss(config);
- MCFG_DEVICE_ADD("video_cpu", I8088, 5000000)
- MCFG_DEVICE_PROGRAM_MAP(video_map)
- MCFG_DEVICE_IO_MAP(video_io_map)
+ I8088(config, m_videocpu, 5000000);
+ m_videocpu->set_addrmap(AS_PROGRAM, &caveman_state::video_map);
+ m_videocpu->set_addrmap(AS_IO, &caveman_state::video_io_map);
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(256, 256)
- MCFG_SCREEN_VISIBLE_AREA(0, 256-1, 0, 248-1)
- MCFG_SCREEN_UPDATE_DRIVER(caveman_state, screen_update_caveman)
- MCFG_SCREEN_PALETTE("palette")
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(256, 256);
+ screen.set_visarea(0, 256-1, 0, 248-1);
+ screen.set_screen_update(FUNC(caveman_state::screen_update_caveman));
+ screen.set_palette("palette");
- MCFG_PALETTE_ADD("palette", 16)
+ PALETTE(config, "palette").set_entries(16);
config.set_default_layout(layout_gts80a_caveman);
-
-MACHINE_CONFIG_END
+}
static INPUT_PORTS_START( caveman )
PORT_INCLUDE(gts80a)
diff --git a/src/mame/drivers/guab.cpp b/src/mame/drivers/guab.cpp
index abda91a6d4b..7a59cc87bfd 100644
--- a/src/mame/drivers/guab.cpp
+++ b/src/mame/drivers/guab.cpp
@@ -241,10 +241,10 @@ WRITE16_MEMBER( guab_state::tms34061_w )
col = offset <<= 1;
if (ACCESSING_BITS_8_15)
- m_tms34061->write(space, col, row, func, data >> 8);
+ m_tms34061->write(col, row, func, data >> 8);
if (ACCESSING_BITS_0_7)
- m_tms34061->write(space, col | 1, row, func, data & 0xff);
+ m_tms34061->write(col | 1, row, func, data & 0xff);
}
READ16_MEMBER( guab_state::tms34061_r )
@@ -260,10 +260,10 @@ READ16_MEMBER( guab_state::tms34061_r )
col = offset <<= 1;
if (ACCESSING_BITS_8_15)
- data |= m_tms34061->read(space, col, row, func) << 8;
+ data |= m_tms34061->read(col, row, func) << 8;
if (ACCESSING_BITS_0_7)
- data |= m_tms34061->read(space, col | 1, row, func);
+ data |= m_tms34061->read(col | 1, row, func);
return data;
}
diff --git a/src/mame/drivers/gumbo.cpp b/src/mame/drivers/gumbo.cpp
index 6810d612ef8..cd845259328 100644
--- a/src/mame/drivers/gumbo.cpp
+++ b/src/mame/drivers/gumbo.cpp
@@ -237,45 +237,45 @@ static GFXDECODE_START( gfx_gumbo )
GFXDECODE_END
-MACHINE_CONFIG_START(gumbo_state::gumbo)
-
- MCFG_DEVICE_ADD("maincpu", M68000, XTAL(14'318'181)/2)
- MCFG_DEVICE_PROGRAM_MAP(gumbo_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", gumbo_state, irq1_line_hold) // all the same
+void gumbo_state::gumbo(machine_config &config)
+{
+ M68000(config, m_maincpu, XTAL(14'318'181)/2);
+ m_maincpu->set_addrmap(AS_PROGRAM, &gumbo_state::gumbo_map);
+ m_maincpu->set_vblank_int("screen", FUNC(gumbo_state::irq1_line_hold)); // all the same
GFXDECODE(config, m_gfxdecode, "palette", gfx_gumbo);
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(64*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(8*8, 48*8-1, 2*8, 30*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(gumbo_state, screen_update_gumbo)
- MCFG_SCREEN_PALETTE("palette")
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(64*8, 32*8);
+ screen.set_visarea(8*8, 48*8-1, 2*8, 30*8-1);
+ screen.set_screen_update(FUNC(gumbo_state::screen_update_gumbo));
+ screen.set_palette("palette");
PALETTE(config, "palette").set_format(palette_device::xRGB_555, 0x200);
SPEAKER(config, "lspeaker").front_left();
SPEAKER(config, "rspeaker").front_right();
- MCFG_DEVICE_ADD("oki", OKIM6295, XTAL(14'318'181)/16, okim6295_device::PIN7_HIGH) // clock frequency & pin 7 not verified
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 0.47)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 0.47)
-MACHINE_CONFIG_END
+ okim6295_device &oki(OKIM6295(config, "oki", XTAL(14'318'181)/16, okim6295_device::PIN7_HIGH)); // clock frequency & pin 7 not verified
+ oki.add_route(ALL_OUTPUTS, "lspeaker", 0.47);
+ oki.add_route(ALL_OUTPUTS, "rspeaker", 0.47);
+}
-MACHINE_CONFIG_START(gumbo_state::mspuzzle)
+void gumbo_state::mspuzzle(machine_config &config)
+{
gumbo(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(mspuzzle_map)
-MACHINE_CONFIG_END
+ m_maincpu->set_addrmap(AS_PROGRAM, &gumbo_state::mspuzzle_map);
+}
-MACHINE_CONFIG_START(gumbo_state::dblpoint)
+void gumbo_state::dblpoint(machine_config &config)
+{
gumbo(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(dblpoint_map)
-MACHINE_CONFIG_END
+ m_maincpu->set_addrmap(AS_PROGRAM, &gumbo_state::dblpoint_map);
+}
ROM_START( gumbo )
ROM_REGION( 0x40000, "maincpu", 0 ) /* 68000 Code */
diff --git a/src/mame/drivers/gunbustr.cpp b/src/mame/drivers/gunbustr.cpp
index 99efa095775..ce6c04deccd 100644
--- a/src/mame/drivers/gunbustr.cpp
+++ b/src/mame/drivers/gunbustr.cpp
@@ -230,12 +230,12 @@ GFXDECODE_END
MACHINE DRIVERS
***********************************************************/
-MACHINE_CONFIG_START(gunbustr_state::gunbustr)
-
+void gunbustr_state::gunbustr(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M68EC020, XTAL(16'000'000))
- MCFG_DEVICE_PROGRAM_MAP(gunbustr_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", gunbustr_state, gunbustr_interrupt) /* VBL */
+ M68EC020(config, m_maincpu, XTAL(16'000'000));
+ m_maincpu->set_addrmap(AS_PROGRAM, &gunbustr_state::gunbustr_map);
+ m_maincpu->set_vblank_int("screen", FUNC(gunbustr_state::gunbustr_interrupt)); /* VBL */
EEPROM_93C46_16BIT(config, "eeprom");
@@ -250,13 +250,13 @@ MACHINE_CONFIG_START(gunbustr_state::gunbustr)
tc0510nio.read_7_callback().set_ioport("SYSTEM");
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(40*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0, 40*8-1, 2*8, 32*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(gunbustr_state, screen_update_gunbustr)
- MCFG_SCREEN_PALETTE(m_palette)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(40*8, 32*8);
+ screen.set_visarea(0, 40*8-1, 2*8, 32*8-1);
+ screen.set_screen_update(FUNC(gunbustr_state::screen_update_gunbustr));
+ screen.set_palette(m_palette);
GFXDECODE(config, m_gfxdecode, m_palette, gfx_gunbustr);
PALETTE(config, m_palette).set_format(palette_device::xRGB_555, 4096);
@@ -271,7 +271,7 @@ MACHINE_CONFIG_START(gunbustr_state::gunbustr)
/* sound hardware */
TAITO_EN(config, "taito_en", 0);
-MACHINE_CONFIG_END
+}
/***************************************************************************/
diff --git a/src/mame/drivers/gundealr.cpp b/src/mame/drivers/gundealr.cpp
index e1feee5a3f4..86e0ca88beb 100644
--- a/src/mame/drivers/gundealr.cpp
+++ b/src/mame/drivers/gundealr.cpp
@@ -438,32 +438,31 @@ TIMER_DEVICE_CALLBACK_MEMBER(gundealr_state::scanline)
m_maincpu->set_input_line_and_vector(0, HOLD_LINE,0xcf); /* RST 10h */
}
-MACHINE_CONFIG_START(gundealr_state::gundealr)
-
+void gundealr_state::gundealr(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, XTAL(12'000'000)/2) /* 6 MHz verified for Yam! Yam!? */
- MCFG_DEVICE_PROGRAM_MAP(gundealr_main_map)
- MCFG_DEVICE_IO_MAP(main_portmap)
- MCFG_TIMER_DRIVER_ADD_SCANLINE("scantimer", gundealr_state, scanline, "screen", 0, 1)
+ Z80(config, m_maincpu, XTAL(12'000'000)/2); /* 6 MHz verified for Yam! Yam!? */
+ m_maincpu->set_addrmap(AS_PROGRAM, &gundealr_state::gundealr_main_map);
+ m_maincpu->set_addrmap(AS_IO, &gundealr_state::main_portmap);
+ TIMER(config, "scantimer").configure_scanline(FUNC(gundealr_state::scanline), "screen", 0, 1);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(32*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(gundealr_state, screen_update)
- MCFG_SCREEN_PALETTE("palette")
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(32*8, 32*8);
+ screen.set_visarea(0*8, 32*8-1, 2*8, 30*8-1);
+ screen.set_screen_update(FUNC(gundealr_state::screen_update));
+ screen.set_palette(m_palette);
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_gundealr)
- MCFG_PALETTE_ADD("palette", 512)
+ GFXDECODE(config, m_gfxdecode, m_palette, gfx_gundealr);
+ PALETTE(config, m_palette).set_entries(512);
/* sound hardware */
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("ymsnd", YM2203, XTAL(12'000'000)/8) /* 1.5Mhz verified for Yam! Yam!? */
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25)
-MACHINE_CONFIG_END
+ YM2203(config, "ymsnd", XTAL(12'000'000)/8).add_route(ALL_OUTPUTS, "mono", 0.25); /* 1.5Mhz verified for Yam! Yam!? */
+}
TIMER_DEVICE_CALLBACK_MEMBER(gundealr_state::yamyam_mcu_sim)
{
@@ -529,18 +528,19 @@ TIMER_DEVICE_CALLBACK_MEMBER(gundealr_state::yamyam_mcu_sim)
m_rambase[0x006] = m_port_in[0]->read();
}
-MACHINE_CONFIG_START(gundealr_state::yamyam)
+void gundealr_state::yamyam(machine_config &config)
+{
gundealr(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(yamyam_main_map)
+ m_maincpu->set_addrmap(AS_PROGRAM, &gundealr_state::yamyam_main_map);
- MCFG_TIMER_DRIVER_ADD_PERIODIC("mcusim", gundealr_state, yamyam_mcu_sim, attotime::from_hz(6000000/60)) /* 6mhz confirmed */
-MACHINE_CONFIG_END
+ TIMER(config, "mcusim").configure_periodic(FUNC(gundealr_state::yamyam_mcu_sim), attotime::from_hz(6000000/60)); /* 6mhz confirmed */
+}
-MACHINE_CONFIG_START(gundealr_state::gundealrbl)
+void gundealr_state::gundealrbl(machine_config &config)
+{
yamyam(config);
- MCFG_DEVICE_REMOVE("mcusim")
-MACHINE_CONFIG_END
+ config.device_remove("mcusim");
+}
/***************************************************************************
diff --git a/src/mame/drivers/gunpey.cpp b/src/mame/drivers/gunpey.cpp
index edeb8d227db..c90cdc9dd0b 100644
--- a/src/mame/drivers/gunpey.cpp
+++ b/src/mame/drivers/gunpey.cpp
@@ -1217,33 +1217,33 @@ TIMER_DEVICE_CALLBACK_MEMBER(gunpey_state::scanline)
}
/***************************************************************************************/
-MACHINE_CONFIG_START(gunpey_state::gunpey)
-
+void gunpey_state::gunpey(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", V30, 57242400 / 4)
- MCFG_DEVICE_PROGRAM_MAP(mem_map)
- MCFG_DEVICE_IO_MAP(io_map)
- MCFG_TIMER_DRIVER_ADD_SCANLINE("scantimer", gunpey_state, scanline, "screen", 0, 1)
+ V30(config, m_maincpu, 57242400 / 4);
+ m_maincpu->set_addrmap(AS_PROGRAM, &gunpey_state::mem_map);
+ m_maincpu->set_addrmap(AS_IO, &gunpey_state::io_map);
+ TIMER(config, "scantimer").configure_scanline(FUNC(gunpey_state::scanline), "screen", 0, 1);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_RAW_PARAMS(57242400/8, 442, 0, 320, 264, 0, 240) /* just to get ~60 Hz */
- MCFG_SCREEN_UPDATE_DRIVER(gunpey_state, screen_update)
- MCFG_SCREEN_PALETTE(m_palette)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_raw(57242400/8, 442, 0, 320, 264, 0, 240); /* just to get ~60 Hz */
+ screen.set_screen_update(FUNC(gunpey_state::screen_update));
+ screen.set_palette(m_palette);
PALETTE(config, m_palette, palette_device::RGB_555);
SPEAKER(config, "lspeaker").front_left();
SPEAKER(config, "rspeaker").front_right();
- MCFG_DEVICE_ADD("oki", OKIM6295, XTAL(16'934'400) / 8, okim6295_device::PIN7_LOW)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 0.25)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 0.25)
+ OKIM6295(config, m_oki, XTAL(16'934'400) / 8, okim6295_device::PIN7_LOW);
+ m_oki->add_route(ALL_OUTPUTS, "lspeaker", 0.25);
+ m_oki->add_route(ALL_OUTPUTS, "rspeaker", 0.25);
- MCFG_DEVICE_ADD("ymz", YMZ280B, XTAL(16'934'400))
- MCFG_SOUND_ROUTE(0, "lspeaker", 0.25)
- MCFG_SOUND_ROUTE(1, "rspeaker", 0.25)
-MACHINE_CONFIG_END
+ ymz280b_device &ymz(YMZ280B(config, "ymz", XTAL(16'934'400)));
+ ymz.add_route(0, "lspeaker", 0.25);
+ ymz.add_route(1, "rspeaker", 0.25);
+}
/***************************************************************************************/
diff --git a/src/mame/drivers/gunsmoke.cpp b/src/mame/drivers/gunsmoke.cpp
index 0c9f31fb998..c813db9703a 100644
--- a/src/mame/drivers/gunsmoke.cpp
+++ b/src/mame/drivers/gunsmoke.cpp
@@ -301,29 +301,29 @@ void gunsmoke_state::machine_reset()
m_sprite3bank = 0;
}
-MACHINE_CONFIG_START(gunsmoke_state::gunsmoke)
-
+void gunsmoke_state::gunsmoke(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, 4000000) // 4 MHz
- MCFG_DEVICE_PROGRAM_MAP(gunsmoke_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", gunsmoke_state, irq0_line_hold)
+ Z80(config, m_maincpu, 4000000); // 4 MHz
+ m_maincpu->set_addrmap(AS_PROGRAM, &gunsmoke_state::gunsmoke_map);
+ m_maincpu->set_vblank_int("screen", FUNC(gunsmoke_state::irq0_line_hold));
- MCFG_DEVICE_ADD("audiocpu", Z80, 3000000) // 3 MHz
- MCFG_DEVICE_PROGRAM_MAP(sound_map)
- MCFG_DEVICE_PERIODIC_INT_DRIVER(gunsmoke_state, irq0_line_hold, 4*60)
+ z80_device &audiocpu(Z80(config, "audiocpu", 3000000)); // 3 MHz
+ audiocpu.set_addrmap(AS_PROGRAM, &gunsmoke_state::sound_map);
+ audiocpu.set_periodic_int(FUNC(gunsmoke_state::irq0_line_hold), attotime::from_hz(4*60));
WATCHDOG_TIMER(config, "watchdog");
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(32*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(gunsmoke_state, screen_update_gunsmoke)
- MCFG_SCREEN_PALETTE(m_palette)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(32*8, 32*8);
+ screen.set_visarea(0*8, 32*8-1, 2*8, 30*8-1);
+ screen.set_screen_update(FUNC(gunsmoke_state::screen_update_gunsmoke));
+ screen.set_palette(m_palette);
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, m_palette, gfx_gunsmoke)
+ GFXDECODE(config, m_gfxdecode, m_palette, gfx_gunsmoke);
PALETTE(config, m_palette, FUNC(gunsmoke_state::gunsmoke_palette), 32*4 + 16*16 + 16*16, 256);
@@ -332,18 +332,18 @@ MACHINE_CONFIG_START(gunsmoke_state::gunsmoke)
GENERIC_LATCH_8(config, "soundlatch");
- MCFG_DEVICE_ADD("ym1", YM2203, 1500000)
- MCFG_SOUND_ROUTE(0, "mono", 0.22)
- MCFG_SOUND_ROUTE(1, "mono", 0.22)
- MCFG_SOUND_ROUTE(2, "mono", 0.22)
- MCFG_SOUND_ROUTE(3, "mono", 0.14)
-
- MCFG_DEVICE_ADD("ym2", YM2203, 1500000)
- MCFG_SOUND_ROUTE(0, "mono", 0.22)
- MCFG_SOUND_ROUTE(1, "mono", 0.22)
- MCFG_SOUND_ROUTE(2, "mono", 0.22)
- MCFG_SOUND_ROUTE(3, "mono", 0.14)
-MACHINE_CONFIG_END
+ ym2203_device &ym1(YM2203(config, "ym1", 1500000));
+ ym1.add_route(0, "mono", 0.22);
+ ym1.add_route(1, "mono", 0.22);
+ ym1.add_route(2, "mono", 0.22);
+ ym1.add_route(3, "mono", 0.14);
+
+ ym2203_device &ym2(YM2203(config, "ym2", 1500000));
+ ym2.add_route(0, "mono", 0.22);
+ ym2.add_route(1, "mono", 0.22);
+ ym2.add_route(2, "mono", 0.22);
+ ym2.add_route(3, "mono", 0.14);
+}
/* ROMs */
diff --git a/src/mame/drivers/gyruss.cpp b/src/mame/drivers/gyruss.cpp
index e597b5ae677..f6cfa52b263 100644
--- a/src/mame/drivers/gyruss.cpp
+++ b/src/mame/drivers/gyruss.cpp
@@ -473,18 +473,18 @@ WRITE_LINE_MEMBER(gyruss_state::vblank_irq)
m_subcpu->set_input_line(0, ASSERT_LINE);
}
-MACHINE_CONFIG_START(gyruss_state::gyruss)
-
+void gyruss_state::gyruss(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, MASTER_CLOCK/6) /* 3.072 MHz */
- MCFG_DEVICE_PROGRAM_MAP(main_cpu1_map)
+ Z80(config, m_maincpu, MASTER_CLOCK/6); /* 3.072 MHz */
+ m_maincpu->set_addrmap(AS_PROGRAM, &gyruss_state::main_cpu1_map);
- MCFG_DEVICE_ADD("sub", KONAMI1, MASTER_CLOCK/12) /* 1.536 MHz */
- MCFG_DEVICE_PROGRAM_MAP(main_cpu2_map)
+ KONAMI1(config, m_subcpu, MASTER_CLOCK/12); /* 1.536 MHz */
+ m_subcpu->set_addrmap(AS_PROGRAM, &gyruss_state::main_cpu2_map);
- MCFG_DEVICE_ADD("audiocpu", Z80, SOUND_CLOCK/4) /* 3.579545 MHz */
- MCFG_DEVICE_PROGRAM_MAP(audio_cpu1_map)
- MCFG_DEVICE_IO_MAP(audio_cpu1_io_map)
+ Z80(config, m_audiocpu, SOUND_CLOCK/4); /* 3.579545 MHz */
+ m_audiocpu->set_addrmap(AS_PROGRAM, &gyruss_state::audio_cpu1_map);
+ m_audiocpu->set_addrmap(AS_IO, &gyruss_state::audio_cpu1_io_map);
I8039(config, m_audiocpu_2, XTAL(8'000'000));
m_audiocpu_2->set_addrmap(AS_PROGRAM, &gyruss_state::audio_cpu2_map);
@@ -492,7 +492,7 @@ MACHINE_CONFIG_START(gyruss_state::gyruss)
m_audiocpu_2->p1_out_cb().set(FUNC(gyruss_state::gyruss_dac_w));
m_audiocpu_2->p2_out_cb().set(FUNC(gyruss_state::gyruss_irq_clear_w));
- MCFG_QUANTUM_TIME(attotime::from_hz(6000))
+ config.m_minimum_quantum = attotime::from_hz(6000);
ls259_device &mainlatch(LS259(config, "mainlatch")); // 3C
mainlatch.q_out_cb<0>().set(FUNC(gyruss_state::master_nmi_mask_w));
@@ -501,11 +501,11 @@ MACHINE_CONFIG_START(gyruss_state::gyruss)
mainlatch.q_out_cb<5>().set(FUNC(gyruss_state::flipscreen_w));
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_RAW_PARAMS(PIXEL_CLOCK, HTOTAL, HBEND, HBSTART, VTOTAL, VBEND, VBSTART)
- MCFG_SCREEN_UPDATE_DRIVER(gyruss_state, screen_update_gyruss)
- MCFG_SCREEN_PALETTE(m_palette)
- MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE(*this, gyruss_state, vblank_irq))
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_raw(PIXEL_CLOCK, HTOTAL, HBEND, HBSTART, VTOTAL, VBEND, VBSTART);
+ m_screen->set_screen_update(FUNC(gyruss_state::screen_update_gyruss));
+ m_screen->set_palette(m_palette);
+ m_screen->screen_vblank().set(FUNC(gyruss_state::vblank_irq));
GFXDECODE(config, m_gfxdecode, m_palette, gfx_gyruss);
PALETTE(config, m_palette, FUNC(gyruss_state::gyruss_palette), 16*4+16*16, 32);
@@ -555,10 +555,10 @@ MACHINE_CONFIG_START(gyruss_state::gyruss)
ay5.add_route(1, "discrete", 1.0, 13);
ay5.add_route(2, "discrete", 1.0, 14);
- MCFG_DEVICE_ADD("discrete", DISCRETE, gyruss_sound_discrete)
- MCFG_SOUND_ROUTE(0, "rspeaker", 1.0)
- MCFG_SOUND_ROUTE(1, "lspeaker", 1.0)
-MACHINE_CONFIG_END
+ DISCRETE(config, m_discrete, gyruss_sound_discrete);
+ m_discrete->add_route(0, "rspeaker", 1.0);
+ m_discrete->add_route(1, "lspeaker", 1.0);
+}
diff --git a/src/mame/drivers/h19.cpp b/src/mame/drivers/h19.cpp
index 35ad51af112..d445b869756 100644
--- a/src/mame/drivers/h19.cpp
+++ b/src/mame/drivers/h19.cpp
@@ -520,22 +520,23 @@ static GFXDECODE_START( gfx_h19 )
GFXDECODE_ENTRY( "chargen", 0x0000, h19_charlayout, 0, 1 )
GFXDECODE_END
-MACHINE_CONFIG_START(h19_state::h19)
+void h19_state::h19(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, H19_CLOCK) // From schematics
- MCFG_DEVICE_PROGRAM_MAP(mem_map)
- MCFG_DEVICE_IO_MAP(io_map)
+ Z80(config, m_maincpu, H19_CLOCK); // From schematics
+ m_maincpu->set_addrmap(AS_PROGRAM, &h19_state::mem_map);
+ m_maincpu->set_addrmap(AS_IO, &h19_state::io_map);
/* video hardware */
// TODO: make configurable, Heath offered 3 different CRTs - White, Green, Amber.
- MCFG_SCREEN_ADD_MONOCHROME("screen", RASTER, rgb_t::green())
- MCFG_SCREEN_REFRESH_RATE(60) // TODO- this is adjustable by dipswitch.
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */
- MCFG_SCREEN_UPDATE_DEVICE("crtc", mc6845_device, screen_update)
-
- MCFG_SCREEN_SIZE(640, 250)
- MCFG_SCREEN_VISIBLE_AREA(0, 640 - 1, 0, 250 - 1)
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_h19)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER, rgb_t::green()));
+ screen.set_refresh_hz(60); // TODO- this is adjustable by dipswitch.
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */
+ screen.set_screen_update("crtc", FUNC(mc6845_device::screen_update));
+ screen.set_size(640, 250);
+ screen.set_visarea(0, 640 - 1, 0, 250 - 1);
+
+ GFXDECODE(config, "gfxdecode", m_palette, gfx_h19);
PALETTE(config, "palette", palette_device::MONOCHROME);
MC6845(config, m_crtc, MC6845_CLOCK);
@@ -548,25 +549,24 @@ MACHINE_CONFIG_START(h19_state::h19)
ins8250_device &uart(INS8250(config, "ins8250", INS8250_CLOCK));
uart.out_int_callback().set_inputline("maincpu", INPUT_LINE_IRQ0);
- MCFG_DEVICE_ADD(KBDC_TAG, MM5740, MM5740_CLOCK)
- MCFG_MM5740_MATRIX_X1(IOPORT("X1"))
- MCFG_MM5740_MATRIX_X2(IOPORT("X2"))
- MCFG_MM5740_MATRIX_X3(IOPORT("X3"))
- MCFG_MM5740_MATRIX_X4(IOPORT("X4"))
- MCFG_MM5740_MATRIX_X5(IOPORT("X5"))
- MCFG_MM5740_MATRIX_X6(IOPORT("X6"))
- MCFG_MM5740_MATRIX_X7(IOPORT("X7"))
- MCFG_MM5740_MATRIX_X8(IOPORT("X8"))
- MCFG_MM5740_MATRIX_X9(IOPORT("X9"))
- MCFG_MM5740_SHIFT_CB(READLINE(*this, h19_state, mm5740_shift_r))
- MCFG_MM5740_CONTROL_CB(READLINE(*this, h19_state, mm5740_control_r))
- MCFG_MM5740_DATA_READY_CB(WRITELINE(*this, h19_state, mm5740_data_ready_w))
+ MM5740(config, m_mm5740, MM5740_CLOCK);
+ m_mm5740->x_cb<0>().set_ioport("X1");
+ m_mm5740->x_cb<1>().set_ioport("X2");
+ m_mm5740->x_cb<2>().set_ioport("X3");
+ m_mm5740->x_cb<3>().set_ioport("X4");
+ m_mm5740->x_cb<4>().set_ioport("X5");
+ m_mm5740->x_cb<5>().set_ioport("X6");
+ m_mm5740->x_cb<6>().set_ioport("X7");
+ m_mm5740->x_cb<7>().set_ioport("X8");
+ m_mm5740->x_cb<8>().set_ioport("X9");
+ m_mm5740->shift_cb().set(FUNC(h19_state::mm5740_shift_r));
+ m_mm5740->control_cb().set(FUNC(h19_state::mm5740_control_r));
+ m_mm5740->data_ready_cb().set(FUNC(h19_state::mm5740_data_ready_w));
/* sound hardware */
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("beeper", BEEP, H19_BEEP_FRQ)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.00)
-MACHINE_CONFIG_END
+ BEEP(config, m_beep, H19_BEEP_FRQ).add_route(ALL_OUTPUTS, "mono", 1.00);
+}
/* ROM definition */
ROM_START( h19 )
diff --git a/src/mame/drivers/halleys.cpp b/src/mame/drivers/halleys.cpp
index f000894af47..c4278cadb6f 100644
--- a/src/mame/drivers/halleys.cpp
+++ b/src/mame/drivers/halleys.cpp
@@ -1930,25 +1930,26 @@ void halleys_state::machine_reset()
}
-MACHINE_CONFIG_START(halleys_state::halleys)
- MCFG_DEVICE_ADD("maincpu", MC6809E, XTAL(19'968'000)/12) /* verified on pcb */
- MCFG_DEVICE_PROGRAM_MAP(halleys_map)
- MCFG_TIMER_DRIVER_ADD_SCANLINE("scantimer", halleys_state, halleys_scanline, "screen", 0, 1)
+void halleys_state::halleys(machine_config &config)
+{
+ MC6809E(config, m_maincpu, XTAL(19'968'000)/12); /* verified on pcb */
+ m_maincpu->set_addrmap(AS_PROGRAM, &halleys_state::halleys_map);
- MCFG_DEVICE_ADD("audiocpu", Z80, XTAL(6'000'000)/2) /* verified on pcb */
- MCFG_DEVICE_PROGRAM_MAP(sound_map)
- MCFG_DEVICE_PERIODIC_INT_DRIVER(halleys_state, irq0_line_hold, (double)6000000/(4*16*16*10*16))
+ TIMER(config, "scantimer").configure_scanline(FUNC(halleys_state::halleys_scanline), "screen", 0, 1);
+ Z80(config, m_audiocpu, XTAL(6'000'000)/2); /* verified on pcb */
+ m_audiocpu->set_addrmap(AS_PROGRAM, &halleys_state::sound_map);
+ m_audiocpu->set_periodic_int(FUNC(halleys_state::irq0_line_hold), attotime::from_hz((double)6000000/(4*16*16*10*16)));
- // video hardware
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(59.50) /* verified on PCB */
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(SCREEN_WIDTH, SCREEN_HEIGHT)
- MCFG_SCREEN_VISIBLE_AREA(VIS_MINX, VIS_MAXX, VIS_MINY, VIS_MAXY)
- MCFG_SCREEN_UPDATE_DRIVER(halleys_state, screen_update_halleys)
- MCFG_SCREEN_PALETTE(m_palette)
+ // video hardware
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(59.50); /* verified on PCB */
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(SCREEN_WIDTH, SCREEN_HEIGHT);
+ screen.set_visarea(VIS_MINX, VIS_MAXX, VIS_MINY, VIS_MAXY);
+ screen.set_screen_update(FUNC(halleys_state::screen_update_halleys));
+ screen.set_palette(m_palette);
PALETTE(config, m_palette, FUNC(halleys_state::halleys_palette), PALETTE_SIZE);
@@ -1966,19 +1967,19 @@ MACHINE_CONFIG_START(halleys_state::halleys)
ym2149_device &ay4(YM2149(config, "ay4", XTAL(6'000'000)/4)); /* verified on pcb */
ay4.port_b_write_callback().set(FUNC(halleys_state::sndnmi_msk_w));
ay4.add_route(ALL_OUTPUTS, "mono", 0.15);
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(halleys_state::benberob)
+void halleys_state::benberob(machine_config &config)
+{
halleys(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_CLOCK(XTAL(19'968'000)/12) /* not verified but pcb identical to halley's comet */
- MCFG_TIMER_MODIFY("scantimer")
- MCFG_TIMER_DRIVER_CALLBACK(halleys_state, benberob_scanline)
-
- MCFG_SCREEN_MODIFY("screen")
- MCFG_SCREEN_UPDATE_DRIVER(halleys_state, screen_update_benberob)
-MACHINE_CONFIG_END
+
+ m_maincpu->set_clock(XTAL(19'968'000)/12); /* not verified but pcb identical to halley's comet */
+
+ subdevice<timer_device>("scantimer")->set_callback(FUNC(halleys_state::benberob_scanline));
+
+ subdevice<screen_device>("screen")->set_screen_update(FUNC(halleys_state::screen_update_benberob));
+}
//**************************************************************************
diff --git a/src/mame/drivers/hanaawas.cpp b/src/mame/drivers/hanaawas.cpp
index 1b015188f85..30dc91670bb 100644
--- a/src/mame/drivers/hanaawas.cpp
+++ b/src/mame/drivers/hanaawas.cpp
@@ -215,23 +215,23 @@ void hanaawas_state::machine_reset()
m_mux = 0;
}
-MACHINE_CONFIG_START(hanaawas_state::hanaawas)
-
+void hanaawas_state::hanaawas(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80,18432000/6) /* 3.072 MHz ??? */
- MCFG_DEVICE_PROGRAM_MAP(hanaawas_map)
- MCFG_DEVICE_IO_MAP(io_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", hanaawas_state, irq0_line_assert)
+ Z80(config, m_maincpu, 18432000/6); /* 3.072 MHz ??? */
+ m_maincpu->set_addrmap(AS_PROGRAM, &hanaawas_state::hanaawas_map);
+ m_maincpu->set_addrmap(AS_IO, &hanaawas_state::io_map);
+ m_maincpu->set_vblank_int("screen", FUNC(hanaawas_state::irq0_line_assert));
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */)
- MCFG_SCREEN_SIZE(32*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 0*8, 32*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(hanaawas_state, screen_update_hanaawas)
- MCFG_SCREEN_PALETTE("palette")
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500) /* not accurate */);
+ screen.set_size(32*8, 32*8);
+ screen.set_visarea(0*8, 32*8-1, 0*8, 32*8-1);
+ screen.set_screen_update(FUNC(hanaawas_state::screen_update_hanaawas));
+ screen.set_palette("palette");
GFXDECODE(config, m_gfxdecode, "palette", gfx_hanaawas);
PALETTE(config, "palette", FUNC(hanaawas_state::hanaawas_palette), 32 * 8, 16);
@@ -243,7 +243,7 @@ MACHINE_CONFIG_START(hanaawas_state::hanaawas)
aysnd.port_a_read_callback().set_ioport("DSW");
aysnd.port_b_write_callback().set(FUNC(hanaawas_state::hanaawas_portB_w));
aysnd.add_route(ALL_OUTPUTS, "mono", 0.50);
-MACHINE_CONFIG_END
+}
/***************************************************************************
diff --git a/src/mame/drivers/hankin.cpp b/src/mame/drivers/hankin.cpp
index 28746abb8cb..d20282fff41 100644
--- a/src/mame/drivers/hankin.cpp
+++ b/src/mame/drivers/hankin.cpp
@@ -472,13 +472,14 @@ WRITE_LINE_MEMBER( hankin_state::ic2_cb2_w )
m_ic2_cb2 = state;
}
-MACHINE_CONFIG_START(hankin_state::hankin)
+void hankin_state::hankin(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M6802, 3276800)
- MCFG_DEVICE_PROGRAM_MAP(hankin_map)
+ M6802(config, m_maincpu, 3276800);
+ m_maincpu->set_addrmap(AS_PROGRAM, &hankin_state::hankin_map);
- MCFG_DEVICE_ADD("audiocpu", M6802, 3276800) // guess, xtal value not shown
- MCFG_DEVICE_PROGRAM_MAP(hankin_sub_map)
+ M6802(config, m_audiocpu, 3276800); // guess, xtal value not shown
+ m_audiocpu->set_addrmap(AS_PROGRAM, &hankin_state::hankin_sub_map);
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
@@ -489,9 +490,10 @@ MACHINE_CONFIG_START(hankin_state::hankin)
genpin_audio(config);
SPEAKER(config, "speaker").front_center();
- MCFG_DEVICE_ADD("dac", DAC_4BIT_R2R, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 0.5) // unknown DAC
- MCFG_DEVICE_ADD("vref", VOLTAGE_REGULATOR, 0) MCFG_VOLTAGE_REGULATOR_OUTPUT(5.0)
- MCFG_SOUND_ROUTE(0, "dac", 1.0, DAC_VREF_POS_INPUT) MCFG_SOUND_ROUTE(0, "dac", -1.0, DAC_VREF_NEG_INPUT)
+ DAC_4BIT_R2R(config, m_dac, 0).add_route(ALL_OUTPUTS, "speaker", 0.5); // unknown DAC
+ voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref"));
+ vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT);
+ vref.add_route(0, "dac", -1.0, DAC_VREF_NEG_INPUT);
/* Devices */
PIA6821(config, m_ic10, 0);
@@ -524,9 +526,9 @@ MACHINE_CONFIG_START(hankin_state::hankin)
m_ic2->irqa_handler().set_inputline("audiocpu", M6802_IRQ_LINE);
m_ic2->irqb_handler().set_inputline("audiocpu", M6802_IRQ_LINE);
- MCFG_TIMER_DRIVER_ADD_PERIODIC("timer_x", hankin_state, timer_x, attotime::from_hz(120)) // mains freq*2
- MCFG_TIMER_DRIVER_ADD_PERIODIC("timer_s", hankin_state, timer_s, attotime::from_hz(94000)) // 555 on sound board*2
-MACHINE_CONFIG_END
+ TIMER(config, "timer_x").configure_periodic(FUNC(hankin_state::timer_x), attotime::from_hz(120)); // mains freq*2
+ TIMER(config, "timer_s").configure_periodic(FUNC(hankin_state::timer_s), attotime::from_hz(94000)); // 555 on sound board*2
+}
/*--------------------------------
/ FJ Holden
diff --git a/src/mame/drivers/hapyfish.cpp b/src/mame/drivers/hapyfish.cpp
index 541e7c9c3ec..8681e2723af 100644
--- a/src/mame/drivers/hapyfish.cpp
+++ b/src/mame/drivers/hapyfish.cpp
@@ -241,27 +241,27 @@ void hapyfish_state::init_mini2440()
// do nothing
}
-MACHINE_CONFIG_START(hapyfish_state::hapyfish)
- MCFG_DEVICE_ADD("maincpu", ARM920T, 100000000)
- MCFG_DEVICE_PROGRAM_MAP(hapyfish_map)
-
- MCFG_PALETTE_ADD("palette", 32768)
+void hapyfish_state::hapyfish(machine_config &config)
+{
+ ARM920T(config, m_maincpu, 100000000);
+ m_maincpu->set_addrmap(AS_PROGRAM, &hapyfish_state::hapyfish_map);
- MCFG_SCREEN_ADD("screen", LCD)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */
- MCFG_SCREEN_SIZE(1024, 768)
- MCFG_SCREEN_VISIBLE_AREA(0, 639, 0, 479)
+ PALETTE(config, "palette").set_entries(32768);
- MCFG_SCREEN_UPDATE_DEVICE("s3c2440", s3c2440_device, screen_update)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_LCD));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */
+ screen.set_size(1024, 768);
+ screen.set_visarea(0, 639, 0, 479);
+ screen.set_screen_update("s3c2440", FUNC(s3c2440_device::screen_update));
SPEAKER(config, "lspeaker").front_left();
SPEAKER(config, "rspeaker").front_right();
- MCFG_DEVICE_ADD("ldac", UDA1341TS, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 1.0) // uda1341ts.u12
- MCFG_DEVICE_ADD("rdac", UDA1341TS, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 1.0) // uda1341ts.u12
- MCFG_DEVICE_ADD("vref", VOLTAGE_REGULATOR, 0) MCFG_VOLTAGE_REGULATOR_OUTPUT(5.0)
- MCFG_SOUND_ROUTE(0, "ldac", 1.0, DAC_VREF_POS_INPUT) MCFG_SOUND_ROUTE(0, "ldac", -1.0, DAC_VREF_NEG_INPUT)
- MCFG_SOUND_ROUTE(0, "rdac", 1.0, DAC_VREF_POS_INPUT) MCFG_SOUND_ROUTE(0, "rdac", -1.0, DAC_VREF_NEG_INPUT)
+ UDA1341TS(config, m_ldac, 0).add_route(ALL_OUTPUTS, "lspeaker", 1.0); // uda1341ts.u12
+ UDA1341TS(config, m_rdac, 0).add_route(ALL_OUTPUTS, "rspeaker", 1.0); // uda1341ts.u12
+ voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref"));
+ vref.add_route(0, "ldac", 1.0, DAC_VREF_POS_INPUT); vref.add_route(0, "ldac", -1.0, DAC_VREF_NEG_INPUT);
+ vref.add_route(0, "rdac", 1.0, DAC_VREF_POS_INPUT); vref.add_route(0, "rdac", -1.0, DAC_VREF_NEG_INPUT);
S3C2440(config, m_s3c2440, 12000000);
m_s3c2440->set_palette_tag("palette");
@@ -283,7 +283,7 @@ MACHINE_CONFIG_START(hapyfish_state::hapyfish)
NAND(config, m_nand2, 0);
m_nand2->set_nand_type(nand_device::chip::K9LAG08U0M);
m_nand2->rnb_wr_callback().set(m_s3c2440, FUNC(s3c2440_device::frnb_w));
-MACHINE_CONFIG_END
+}
static INPUT_PORTS_START( hapyfish )
INPUT_PORTS_END
diff --git a/src/mame/drivers/harddriv.cpp b/src/mame/drivers/harddriv.cpp
index 15fcf4bb041..721fbdde113 100644
--- a/src/mame/drivers/harddriv.cpp
+++ b/src/mame/drivers/harddriv.cpp
@@ -565,7 +565,6 @@ void harddriv_state::driver_gsp_map(address_map &map)
map.unmap_value_high();
map(0x00000000, 0x0000200f).noprw(); /* hit during self-test */
map(0x02000000, 0x0207ffff).rw(FUNC(harddriv_state::hdgsp_vram_2bpp_r), FUNC(harddriv_state::hdgsp_vram_1bpp_w));
- map(0xc0000000, 0xc00001ff).rw("gsp", FUNC(tms34010_device::io_register_r), FUNC(tms34010_device::io_register_w));
map(0xf4000000, 0xf40000ff).rw(FUNC(harddriv_state::hdgsp_control_lo_r), FUNC(harddriv_state::hdgsp_control_lo_w)).share("gsp_control_lo");
map(0xf4800000, 0xf48000ff).rw(FUNC(harddriv_state::hdgsp_control_hi_r), FUNC(harddriv_state::hdgsp_control_hi_w)).share("gsp_control_hi");
map(0xf5000000, 0xf5000fff).rw(FUNC(harddriv_state::hdgsp_paletteram_lo_r), FUNC(harddriv_state::hdgsp_paletteram_lo_w)).share("gsp_palram_lo");
@@ -579,7 +578,6 @@ void harddriv_state::driver_msp_map(address_map &map)
map.unmap_value_high();
map(0x00000000, 0x000fffff).ram().share("msp_ram");
map(0x00700000, 0x007fffff).ram().share("msp_ram");
- map(0xc0000000, 0xc00001ff).rw("msp", FUNC(tms34010_device::io_register_r), FUNC(tms34010_device::io_register_w));
map(0xfff00000, 0xffffffff).ram().share("msp_ram");
}
@@ -616,7 +614,6 @@ void harddriv_state::multisync_gsp_map(address_map &map)
map.unmap_value_high();
map(0x00000000, 0x0000200f).noprw(); /* hit during self-test */
map(0x02000000, 0x020fffff).rw(FUNC(harddriv_state::hdgsp_vram_2bpp_r), FUNC(harddriv_state::hdgsp_vram_2bpp_w));
- map(0xc0000000, 0xc00001ff).r("gsp", FUNC(tms34010_device::io_register_r)).w(FUNC(harddriv_state::hdgsp_io_w));
map(0xf4000000, 0xf40000ff).rw(FUNC(harddriv_state::hdgsp_control_lo_r), FUNC(harddriv_state::hdgsp_control_lo_w)).share("gsp_control_lo");
map(0xf4800000, 0xf48000ff).rw(FUNC(harddriv_state::hdgsp_control_hi_r), FUNC(harddriv_state::hdgsp_control_hi_w)).share("gsp_control_hi");
map(0xf5000000, 0xf5000fff).rw(FUNC(harddriv_state::hdgsp_paletteram_lo_r), FUNC(harddriv_state::hdgsp_paletteram_lo_w)).share("gsp_palram_lo");
@@ -658,7 +655,6 @@ void harddriv_state::multisync2_gsp_map(address_map &map)
map.unmap_value_high();
map(0x00000000, 0x0000200f).noprw(); /* hit during self-test */
map(0x02000000, 0x020fffff).rw(FUNC(harddriv_state::hdgsp_vram_2bpp_r), FUNC(harddriv_state::hdgsp_vram_2bpp_w));
- map(0xc0000000, 0xc00001ff).r("gsp", FUNC(tms34010_device::io_register_r)).w(FUNC(harddriv_state::hdgsp_io_w));
map(0xf4000000, 0xf40000ff).rw(FUNC(harddriv_state::hdgsp_control_lo_r), FUNC(harddriv_state::hdgsp_control_lo_w)).share("gsp_control_lo");
map(0xf4800000, 0xf48000ff).rw(FUNC(harddriv_state::hdgsp_control_hi_r), FUNC(harddriv_state::hdgsp_control_hi_w)).share("gsp_control_hi");
map(0xf5000000, 0xf5000fff).rw(FUNC(harddriv_state::hdgsp_paletteram_lo_r), FUNC(harddriv_state::hdgsp_paletteram_lo_w)).share("gsp_palram_lo");
@@ -1540,6 +1536,7 @@ void harddriv_state::multisync_nomsp(machine_config &config)
m_gsp->set_addrmap(AS_PROGRAM, &harddriv_state::multisync_gsp_map);
m_gsp->set_pixel_clock(6000000);
m_gsp->set_pixels_per_clock(2);
+ m_gsp->ioreg_pre_write().set(FUNC(harddriv_state::hdgsp_io_w));
m_gsp->set_scanline_ind16_callback(FUNC(harddriv_state::scanline_multisync));
/* video hardware */
@@ -1627,7 +1624,6 @@ void harddriv_state::ds3(machine_config &config)
DAC_16BIT_R2R(config, m_ldac, 0).add_route(ALL_OUTPUTS, "lspeaker", 1.0); // unknown DAC
DAC_16BIT_R2R(config, m_rdac, 0).add_route(ALL_OUTPUTS, "rspeaker", 1.0); // unknown DAC
voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref", 0));
- vref.set_output(5.0);
vref.add_route(0, "ldac", 1.0, DAC_VREF_POS_INPUT);
vref.add_route(0, "ldac", -1.0, DAC_VREF_NEG_INPUT);
vref.add_route(0, "rdac", 1.0, DAC_VREF_POS_INPUT);
@@ -2093,14 +2089,14 @@ void harddriv_new_state::racedriv_panorama_machine(machine_config &config)
RACEDRIVC_PANORAMA_SIDE_BOARD(config, "leftpcb", 0);
RACEDRIVC_PANORAMA_SIDE_BOARD(config, "rightpcb", 0);
-// MCFG_QUANTUM_TIME(attotime::from_hz(100000))
+// config.m_minimum_quantum = attotime::from_hz(100000);
subdevice<mc68681_device>("mainpcb:duartn68681")->a_tx_cb().set(FUNC(harddriv_new_state::tx_a));
// boots with 'PROGRAM OK' when using standard Hard Drivin' board type (needs 137412-115 slapstic)
subdevice<atari_slapstic_device>("mainpcb:slapstic")->set_chipnum(115);
TIMER(config, "hack_timer").configure_periodic(FUNC(harddriv_new_state::hack_timer), attotime::from_hz(60));
-// MCFG_QUANTUM_TIME(attotime::from_hz(60000))
+// config.m_minimum_quantum = attotime::from_hz(60000);
}
// this is an ugly hack, otherwise MAME's core can't seem to handle partial updates if you have multiple screens with different update frequencies.
diff --git a/src/mame/drivers/hazeltin.cpp b/src/mame/drivers/hazeltin.cpp
index 5fc7cf60776..df405e038b0 100644
--- a/src/mame/drivers/hazeltin.cpp
+++ b/src/mame/drivers/hazeltin.cpp
@@ -695,26 +695,25 @@ GFXDECODE_END
MACHINE_CONFIG_START(hazl1500_state::hazl1500)
/* basic machine hardware */
- MCFG_DEVICE_ADD(CPU_TAG, I8080, XTAL(18'000'000)/9) // 18MHz crystal on schematics, using an i8224 clock gen/driver IC
- MCFG_DEVICE_PROGRAM_MAP(hazl1500_mem)
- MCFG_DEVICE_IO_MAP(hazl1500_io)
- MCFG_QUANTUM_PERFECT_CPU(CPU_TAG)
+ I8080(config, m_maincpu, XTAL(18'000'000)/9); // 18MHz crystal on schematics, using an i8224 clock gen/driver IC
+ m_maincpu->set_addrmap(AS_PROGRAM, &hazl1500_state::hazl1500_mem);
+ m_maincpu->set_addrmap(AS_IO, &hazl1500_state::hazl1500_io);
+ config.m_perfect_cpu_quantum = subtag(CPU_TAG);
- MCFG_INPUT_MERGER_ANY_HIGH("mainint")
- MCFG_INPUT_MERGER_OUTPUT_HANDLER(INPUTLINE(CPU_TAG, INPUT_LINE_IRQ0))
+ INPUT_MERGER_ANY_HIGH(config, "mainint").output_handler().set_inputline(m_maincpu, INPUT_LINE_IRQ0);
/* video hardware */
- MCFG_SCREEN_ADD(SCREEN_TAG, RASTER)
- MCFG_SCREEN_UPDATE_DRIVER(hazl1500_state, screen_update_hazl1500)
- //MCFG_SCREEN_RAW_PARAMS(XTAL(33'264'000) / 2,
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_screen_update(FUNC(hazl1500_state::screen_update_hazl1500));
+ //m_screen->set_raw(XTAL(33'264'000) / 2,
// SCREEN_HTOTAL, SCREEN_HSTART, SCREEN_HSTART + SCREEN_HDISP,
// SCREEN_VTOTAL, SCREEN_VSTART, SCREEN_VSTART + SCREEN_VDISP); // TODO: Figure out exact visibility
- MCFG_SCREEN_RAW_PARAMS(XTAL(33'264'000) / 2,
+ m_screen->set_raw(XTAL(33'264'000) / 2,
SCREEN_HTOTAL, 0, SCREEN_HTOTAL,
SCREEN_VTOTAL, 0, SCREEN_VTOTAL);
PALETTE(config, "palette", palette_device::MONOCHROME);
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_hazl1500)
+ GFXDECODE(config, "gfxdecode", "palette", gfx_hazl1500);
com8116_device &baudgen(COM8116(config, BAUDGEN_TAG, XTAL(5'068'800)));
baudgen.fr_handler().set(m_uart, FUNC(ay51013_device::write_tcp));
diff --git a/src/mame/drivers/headonb.cpp b/src/mame/drivers/headonb.cpp
index c63694bf47b..f4577a1056e 100644
--- a/src/mame/drivers/headonb.cpp
+++ b/src/mame/drivers/headonb.cpp
@@ -166,29 +166,29 @@ static GFXDECODE_START( gfx_headonb )
GFXDECODE_ENTRY( "gfx1", 0, charlayout, 0, 1 )
GFXDECODE_END
-MACHINE_CONFIG_START(headonb_state::headonb)
-
+void headonb_state::headonb(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", I8080A, XTAL(20'000'000) / 10) // divider guessed
- MCFG_DEVICE_PROGRAM_MAP(headonb_map)
- MCFG_DEVICE_IO_MAP(headonb_io_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", headonb_state, irq0_line_hold) // where is irqack?
+ I8080A(config, m_maincpu, XTAL(20'000'000) / 10); // divider guessed
+ m_maincpu->set_addrmap(AS_PROGRAM, &headonb_state::headonb_map);
+ m_maincpu->set_addrmap(AS_IO, &headonb_state::headonb_io_map);
+ m_maincpu->set_vblank_int("screen", FUNC(headonb_state::irq0_line_hold)); // where is irqack?
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500))
- MCFG_SCREEN_SIZE(32*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 0*8, 28*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(headonb_state, screen_update)
- MCFG_SCREEN_PALETTE("palette")
-
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_headonb)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500));
+ screen.set_size(32*8, 32*8);
+ screen.set_visarea(0*8, 32*8-1, 0*8, 28*8-1);
+ screen.set_screen_update(FUNC(headonb_state::screen_update));
+ screen.set_palette("palette");
+
+ GFXDECODE(config, m_gfxdecode, "palette", gfx_headonb);
PALETTE(config, "palette", palette_device::MONOCHROME);
/* sound hardware */
// TODO
-MACHINE_CONFIG_END
+}
/***************************************************************************
diff --git a/src/mame/drivers/hec2hrp.cpp b/src/mame/drivers/hec2hrp.cpp
index bfa41800e1f..d1697dd1984 100644
--- a/src/mame/drivers/hec2hrp.cpp
+++ b/src/mame/drivers/hec2hrp.cpp
@@ -110,7 +110,7 @@ void hec2hrp_state::hecdisc2_io(address_map &map)
map(0x050, 0x05f).rw(FUNC(hec2hrp_state::disc2_io50_port_r), FUNC(hec2hrp_state::disc2_io50_port_w));
// uPD765 link
map(0x060, 0x061).m(m_upd_fdc, FUNC(upd765a_device::map));
- map(0x070, 0x07f).rw(m_upd_fdc, FUNC(upd765a_device::mdma_r), FUNC(upd765a_device::mdma_w));
+ map(0x070, 0x070).mirror(0x00f).rw(m_upd_fdc, FUNC(upd765a_device::dma_r), FUNC(upd765a_device::dma_w));
}
void hec2hrp_state::hec2hrp_mem(address_map &map)
@@ -394,212 +394,229 @@ static void minidisc_floppies(device_slot_interface &device)
}
-MACHINE_CONFIG_START(hec2hrp_state::hec2hr)
- MCFG_DEVICE_ADD("maincpu", Z80, 5_MHz_XTAL)
- MCFG_DEVICE_PROGRAM_MAP(hec2hrp_mem)
- MCFG_DEVICE_IO_MAP(hec2hrp_io)
- MCFG_DEVICE_PERIODIC_INT_DRIVER(hec2hrp_state, irq0_line_hold, 50) /* put on the Z80 irq in Hz*/
+void hec2hrp_state::hec2hr(machine_config &config)
+{
+ Z80(config, m_maincpu, 5_MHz_XTAL);
+ m_maincpu->set_addrmap(AS_PROGRAM, &hec2hrp_state::hec2hrp_mem);
+ m_maincpu->set_addrmap(AS_IO, &hec2hrp_state::hec2hrp_io);
+ m_maincpu->set_periodic_int(FUNC(hec2hrp_state::irq0_line_hold), attotime::from_hz(50)); /* put on the Z80 irq in Hz*/
+
MCFG_MACHINE_RESET_OVERRIDE(hec2hrp_state,hec2hrp)
MCFG_MACHINE_START_OVERRIDE(hec2hrp_state,hec2hrp)
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(50)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(400)) /* 2500 not accurate */
- MCFG_SCREEN_SIZE(512, 230)
- MCFG_SCREEN_VISIBLE_AREA(0, 243, 0, 227)
- MCFG_SCREEN_UPDATE_DRIVER(hec2hrp_state, screen_update_hec2hrp)
- MCFG_SCREEN_PALETTE("palette")
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(50);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(400)); /* 2500 not accurate */
+ screen.set_size(512, 230);
+ screen.set_visarea(0, 243, 0, 227);
+ screen.set_screen_update(FUNC(hec2hrp_state::screen_update_hec2hrp));
+ screen.set_palette(m_palette);
- MCFG_PALETTE_ADD("palette", 16)
+ PALETTE(config, m_palette).set_entries(16);
MCFG_VIDEO_START_OVERRIDE(hec2hrp_state,hec2hrp)
hector_audio(config);
- MCFG_CASSETTE_ADD( "cassette" )
- MCFG_CASSETTE_FORMATS(hector_cassette_formats)
- MCFG_CASSETTE_DEFAULT_STATE(CASSETTE_PLAY | CASSETTE_MOTOR_DISABLED | CASSETTE_SPEAKER_ENABLED)
+ CASSETTE(config, m_cassette);
+ m_cassette->set_formats(hector_cassette_formats);
+ m_cassette->set_default_state(CASSETTE_PLAY | CASSETTE_MOTOR_DISABLED | CASSETTE_SPEAKER_ENABLED);
+
+ PRINTER(config, m_printer, 0);
+}
- MCFG_DEVICE_ADD("printer", PRINTER, 0)
-MACHINE_CONFIG_END
+void hec2hrp_state::hec2hrp(machine_config &config)
+{
+ Z80(config, m_maincpu, 5_MHz_XTAL);
+ m_maincpu->set_addrmap(AS_PROGRAM, &hec2hrp_state::hec2hrp_mem);
+ m_maincpu->set_addrmap(AS_IO, &hec2hrp_state::hec2hrp_io);
+ m_maincpu->set_periodic_int(FUNC(hec2hrp_state::irq0_line_hold), attotime::from_hz(50)); /* put on the Z80 irq in Hz*/
-MACHINE_CONFIG_START(hec2hrp_state::hec2hrp)
- MCFG_DEVICE_ADD("maincpu", Z80, 5_MHz_XTAL)
- MCFG_DEVICE_PROGRAM_MAP(hec2hrp_mem)
- MCFG_DEVICE_IO_MAP(hec2hrp_io)
- MCFG_DEVICE_PERIODIC_INT_DRIVER(hec2hrp_state, irq0_line_hold, 50) /* put on the Z80 irq in Hz*/
MCFG_MACHINE_RESET_OVERRIDE(hec2hrp_state,hec2hrp)
MCFG_MACHINE_START_OVERRIDE(hec2hrp_state,hec2hrp)
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(50)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(400)) /* 2500 not accurate */
- MCFG_SCREEN_SIZE(512, 230)
- MCFG_SCREEN_VISIBLE_AREA(0, 243, 0, 227)
- MCFG_SCREEN_UPDATE_DRIVER(hec2hrp_state, screen_update_hec2hrp)
- MCFG_SCREEN_PALETTE("palette")
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(50);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(400)); /* 2500 not accurate */
+ screen.set_size(512, 230);
+ screen.set_visarea(0, 243, 0, 227);
+ screen.set_screen_update(FUNC(hec2hrp_state::screen_update_hec2hrp));
+ screen.set_palette(m_palette);
- MCFG_PALETTE_ADD("palette", 16)
+ PALETTE(config, m_palette).set_entries(16);
MCFG_VIDEO_START_OVERRIDE(hec2hrp_state,hec2hrp)
hector_audio(config);
- MCFG_CASSETTE_ADD( "cassette" )
- MCFG_CASSETTE_FORMATS(hector_cassette_formats)
- MCFG_CASSETTE_DEFAULT_STATE(CASSETTE_PLAY | CASSETTE_MOTOR_DISABLED | CASSETTE_SPEAKER_ENABLED)
+ CASSETTE(config, m_cassette);
+ m_cassette->set_formats(hector_cassette_formats);
+ m_cassette->set_default_state(CASSETTE_PLAY | CASSETTE_MOTOR_DISABLED | CASSETTE_SPEAKER_ENABLED);
- MCFG_DEVICE_ADD("printer", PRINTER, 0)
-MACHINE_CONFIG_END
+ PRINTER(config, m_printer, 0);
+}
static void hector_floppies(device_slot_interface &device)
{
device.option_add("525hd", FLOPPY_525_HD);
}
-MACHINE_CONFIG_START(hec2hrp_state::hec2mx40)
- MCFG_DEVICE_ADD("maincpu", Z80, 5_MHz_XTAL)
- MCFG_DEVICE_PROGRAM_MAP(hec2hrx_mem)
- MCFG_DEVICE_IO_MAP(hec2mx40_io)
- MCFG_DEVICE_PERIODIC_INT_DRIVER(hec2hrp_state, irq0_line_hold, 50) // put on the Z80 irq in Hz
+void hec2hrp_state::hec2mx40(machine_config &config)
+{
+ Z80(config, m_maincpu, 5_MHz_XTAL);
+ m_maincpu->set_addrmap(AS_PROGRAM, &hec2hrp_state::hec2hrx_mem);
+ m_maincpu->set_addrmap(AS_IO, &hec2hrp_state::hec2mx40_io);
+ m_maincpu->set_periodic_int(FUNC(hec2hrp_state::irq0_line_hold), attotime::from_hz(50)); /* put on the Z80 irq in Hz*/
+
+ Z80(config, m_disc2cpu, 4_MHz_XTAL);
+ m_disc2cpu->set_addrmap(AS_PROGRAM, &hec2hrp_state::hecdisc2_mem);
+ m_disc2cpu->set_addrmap(AS_IO, &hec2hrp_state::hecdisc2_io);
- MCFG_DEVICE_ADD("disc2cpu", Z80, 4_MHz_XTAL)
- MCFG_DEVICE_PROGRAM_MAP(hecdisc2_mem)
- MCFG_DEVICE_IO_MAP(hecdisc2_io)
UPD765A(config, m_upd_fdc, 8'000'000, false, true);
m_upd_fdc->intrq_wr_callback().set(FUNC(hec2hrp_state::disc2_fdc_interrupt));
m_upd_fdc->drq_wr_callback().set(FUNC(hec2hrp_state::disc2_fdc_dma_irq));
- MCFG_FLOPPY_DRIVE_ADD(m_upd_connector[0], hector_floppies, "525hd", floppy_image_device::default_floppy_formats)
- MCFG_FLOPPY_DRIVE_ADD(m_upd_connector[1], hector_floppies, "525hd", floppy_image_device::default_floppy_formats)
+
+ FLOPPY_CONNECTOR(config, m_upd_connector[0], hector_floppies, "525hd", floppy_image_device::default_floppy_formats);
+ FLOPPY_CONNECTOR(config, m_upd_connector[1], hector_floppies, "525hd", floppy_image_device::default_floppy_formats);
+
MCFG_MACHINE_RESET_OVERRIDE(hec2hrp_state,hec2hrx)
MCFG_MACHINE_START_OVERRIDE(hec2hrp_state,hec2hrx)
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(50)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(400)) /* 2500 not accurate */
- MCFG_SCREEN_SIZE(512, 230)
- MCFG_SCREEN_VISIBLE_AREA(0, 243, 0, 227)
- MCFG_SCREEN_UPDATE_DRIVER(hec2hrp_state, screen_update_hec2hrp)
- MCFG_SCREEN_PALETTE("palette")
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(50);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(400)); /* 2500 not accurate */
+ screen.set_size(512, 230);
+ screen.set_visarea(0, 243, 0, 227);
+ screen.set_screen_update(FUNC(hec2hrp_state::screen_update_hec2hrp));
+ screen.set_palette(m_palette);
- MCFG_PALETTE_ADD("palette", 16)
+ PALETTE(config, m_palette).set_entries(16);
MCFG_VIDEO_START_OVERRIDE(hec2hrp_state,hec2hrp)
hector_audio(config);
- MCFG_CASSETTE_ADD( "cassette" )
- MCFG_CASSETTE_FORMATS(hector_cassette_formats)
- MCFG_CASSETTE_DEFAULT_STATE(CASSETTE_PLAY | CASSETTE_MOTOR_DISABLED | CASSETTE_SPEAKER_ENABLED)
+ CASSETTE(config, m_cassette);
+ m_cassette->set_formats(hector_cassette_formats);
+ m_cassette->set_default_state(CASSETTE_PLAY | CASSETTE_MOTOR_DISABLED | CASSETTE_SPEAKER_ENABLED);
- MCFG_DEVICE_ADD("printer", PRINTER, 0)
-MACHINE_CONFIG_END
+ PRINTER(config, m_printer, 0);
+}
-MACHINE_CONFIG_START(hec2hrp_state::hec2hrx)
- MCFG_DEVICE_ADD("maincpu", Z80, 5_MHz_XTAL)
- MCFG_DEVICE_PROGRAM_MAP(hec2hrx_mem)
- MCFG_DEVICE_IO_MAP(hec2hrx_io)
- MCFG_DEVICE_PERIODIC_INT_DRIVER(hec2hrp_state, irq0_line_hold, 50) // put on the Z80 irq in Hz
+void hec2hrp_state::hec2hrx(machine_config &config)
+{
+ Z80(config, m_maincpu, 5_MHz_XTAL);
+ m_maincpu->set_addrmap(AS_PROGRAM, &hec2hrp_state::hec2hrx_mem);
+ m_maincpu->set_addrmap(AS_IO, &hec2hrp_state::hec2hrx_io);
+ m_maincpu->set_periodic_int(FUNC(hec2hrp_state::irq0_line_hold), attotime::from_hz(50)); /* put on the Z80 irq in Hz*/
+
MCFG_MACHINE_RESET_OVERRIDE(hec2hrp_state,hec2hrx)
MCFG_MACHINE_START_OVERRIDE(hec2hrp_state,hec2hrx)
- MCFG_DEVICE_ADD("disc2cpu", Z80, 4_MHz_XTAL)
- MCFG_DEVICE_PROGRAM_MAP(hecdisc2_mem)
- MCFG_DEVICE_IO_MAP(hecdisc2_io)
+ Z80(config, m_disc2cpu, 4_MHz_XTAL);
+ m_disc2cpu->set_addrmap(AS_PROGRAM, &hec2hrp_state::hecdisc2_mem);
+ m_disc2cpu->set_addrmap(AS_IO, &hec2hrp_state::hecdisc2_io);
+
UPD765A(config, m_upd_fdc, 8'000'000, false, true);
m_upd_fdc->intrq_wr_callback().set(FUNC(hec2hrp_state::disc2_fdc_interrupt));
m_upd_fdc->drq_wr_callback().set(FUNC(hec2hrp_state::disc2_fdc_dma_irq));
- MCFG_FLOPPY_DRIVE_ADD(m_upd_connector[0], hector_floppies, "525hd", floppy_image_device::default_floppy_formats)
- MCFG_FLOPPY_DRIVE_ADD(m_upd_connector[1], hector_floppies, "525hd", floppy_image_device::default_floppy_formats)
-
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(50)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(400)) /* 2500 not accurate */
- MCFG_SCREEN_SIZE(512, 230)
- MCFG_SCREEN_VISIBLE_AREA(0, 243, 0, 227)
- MCFG_SCREEN_UPDATE_DRIVER(hec2hrp_state, screen_update_hec2hrp)
- MCFG_SCREEN_PALETTE("palette")
-
- MCFG_PALETTE_ADD("palette", 16)
+
+ FLOPPY_CONNECTOR(config, m_upd_connector[0], hector_floppies, "525hd", floppy_image_device::default_floppy_formats);
+ FLOPPY_CONNECTOR(config, m_upd_connector[1], hector_floppies, "525hd", floppy_image_device::default_floppy_formats);
+
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(50);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(400)); /* 2500 not accurate */
+ screen.set_size(512, 230);
+ screen.set_visarea(0, 243, 0, 227);
+ screen.set_screen_update(FUNC(hec2hrp_state::screen_update_hec2hrp));
+ screen.set_palette(m_palette);
+
+ PALETTE(config, m_palette).set_entries(16);
MCFG_VIDEO_START_OVERRIDE(hec2hrp_state,hec2hrp)
hector_audio(config);
- MCFG_CASSETTE_ADD( "cassette" )
- MCFG_CASSETTE_FORMATS(hector_cassette_formats)
- MCFG_CASSETTE_DEFAULT_STATE(CASSETTE_PLAY | CASSETTE_MOTOR_DISABLED | CASSETTE_SPEAKER_ENABLED)
+ CASSETTE(config, m_cassette);
+ m_cassette->set_formats(hector_cassette_formats);
+ m_cassette->set_default_state(CASSETTE_PLAY | CASSETTE_MOTOR_DISABLED | CASSETTE_SPEAKER_ENABLED);
- MCFG_DEVICE_ADD("printer", PRINTER, 0)
-MACHINE_CONFIG_END
+ PRINTER(config, m_printer, 0);
+}
+
+void hec2hrp_state::hec2mdhrx(machine_config &config)
+{
+ Z80(config, m_maincpu, 5_MHz_XTAL);
+ m_maincpu->set_addrmap(AS_PROGRAM, &hec2hrp_state::hec2hrx_mem);
+ m_maincpu->set_addrmap(AS_IO, &hec2hrp_state::hec2mdhrx_io);
+ m_maincpu->set_periodic_int(FUNC(hec2hrp_state::irq0_line_hold), attotime::from_hz(50)); /* put on the Z80 irq in Hz*/
-MACHINE_CONFIG_START(hec2hrp_state::hec2mdhrx)
- MCFG_DEVICE_ADD("maincpu", Z80, 5_MHz_XTAL)
- MCFG_DEVICE_PROGRAM_MAP(hec2hrx_mem)
- MCFG_DEVICE_IO_MAP(hec2mdhrx_io)
- MCFG_DEVICE_PERIODIC_INT_DRIVER(hec2hrp_state, irq0_line_hold, 50) // put on the Z80 irq in Hz
MCFG_MACHINE_RESET_OVERRIDE(hec2hrp_state,hec2mdhrx)
MCFG_MACHINE_START_OVERRIDE(hec2hrp_state,hec2mdhrx)
/* 3.5" ("mini") disc */
FD1793(config, m_minidisc_fdc, 1_MHz_XTAL);
- MCFG_FLOPPY_DRIVE_ADD("wd179x:0", minidisc_floppies, "dd", hec2hrp_state::minidisc_formats)
+ FLOPPY_CONNECTOR(config, "wd179x:0", minidisc_floppies, "dd", hec2hrp_state::minidisc_formats);
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(50)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(400)) /* 2500 not accurate */
- MCFG_SCREEN_SIZE(512, 230)
- MCFG_SCREEN_VISIBLE_AREA(0, 243, 0, 227)
- MCFG_SCREEN_UPDATE_DRIVER(hec2hrp_state, screen_update_hec2hrp)
- MCFG_SCREEN_PALETTE("palette")
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(50);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(400)); /* 2500 not accurate */
+ screen.set_size(512, 230);
+ screen.set_visarea(0, 243, 0, 227);
+ screen.set_screen_update(FUNC(hec2hrp_state::screen_update_hec2hrp));
+ screen.set_palette(m_palette);
- MCFG_VIDEO_START_OVERRIDE(hec2hrp_state,hec2hrp)
- MCFG_PALETTE_ADD("palette", 16)
+ PALETTE(config, m_palette).set_entries(16);
MCFG_VIDEO_START_OVERRIDE(hec2hrp_state,hec2hrp)
hector_audio(config);
- MCFG_CASSETTE_ADD( "cassette" )
- MCFG_CASSETTE_FORMATS(hector_cassette_formats)
- MCFG_CASSETTE_DEFAULT_STATE(CASSETTE_PLAY | CASSETTE_MOTOR_DISABLED | CASSETTE_SPEAKER_ENABLED)
+ CASSETTE(config, m_cassette);
+ m_cassette->set_formats(hector_cassette_formats);
+ m_cassette->set_default_state(CASSETTE_PLAY | CASSETTE_MOTOR_DISABLED | CASSETTE_SPEAKER_ENABLED);
+
+ PRINTER(config, m_printer, 0);
+}
- MCFG_DEVICE_ADD("printer", PRINTER, 0)
-MACHINE_CONFIG_END
+void hec2hrp_state::hec2mx80(machine_config &config)
+{
+ Z80(config, m_maincpu, 5_MHz_XTAL);
+ m_maincpu->set_addrmap(AS_PROGRAM, &hec2hrp_state::hec2hrx_mem);
+ m_maincpu->set_addrmap(AS_IO, &hec2hrp_state::hec2mx80_io);
+ m_maincpu->set_periodic_int(FUNC(hec2hrp_state::irq0_line_hold), attotime::from_hz(50)); /* put on the Z80 irq in Hz*/
-MACHINE_CONFIG_START(hec2hrp_state::hec2mx80)
- MCFG_DEVICE_ADD("maincpu", Z80, 5_MHz_XTAL)
- MCFG_DEVICE_PROGRAM_MAP(hec2hrx_mem)
- MCFG_DEVICE_IO_MAP(hec2mx80_io)
- MCFG_DEVICE_PERIODIC_INT_DRIVER(hec2hrp_state, irq0_line_hold, 50) // put on the Z80 irq in Hz
MCFG_MACHINE_RESET_OVERRIDE(hec2hrp_state,hec2hrx)
MCFG_MACHINE_START_OVERRIDE(hec2hrp_state,hec2hrx)
- MCFG_DEVICE_ADD("disc2cpu", Z80, 4_MHz_XTAL)
- MCFG_DEVICE_PROGRAM_MAP(hecdisc2_mem)
- MCFG_DEVICE_IO_MAP(hecdisc2_io)
+ Z80(config, m_disc2cpu, 4_MHz_XTAL);
+ m_disc2cpu->set_addrmap(AS_PROGRAM, &hec2hrp_state::hecdisc2_mem);
+ m_disc2cpu->set_addrmap(AS_IO, &hec2hrp_state::hecdisc2_io);
+
UPD765A(config, m_upd_fdc, 8'000'000, false, true);
m_upd_fdc->intrq_wr_callback().set(FUNC(hec2hrp_state::disc2_fdc_interrupt));
m_upd_fdc->drq_wr_callback().set(FUNC(hec2hrp_state::disc2_fdc_dma_irq));
- MCFG_FLOPPY_DRIVE_ADD(m_upd_connector[0], hector_floppies, "525hd", floppy_image_device::default_floppy_formats)
- MCFG_FLOPPY_DRIVE_ADD(m_upd_connector[1], hector_floppies, "525hd", floppy_image_device::default_floppy_formats)
-
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(50)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(400)) /* 2500 not accurate */
- MCFG_SCREEN_SIZE(512, 230)
- MCFG_SCREEN_VISIBLE_AREA(0, 243, 0, 227)
- MCFG_SCREEN_UPDATE_DRIVER(hec2hrp_state, screen_update_hec2hrp)
- MCFG_SCREEN_PALETTE("palette")
-
- MCFG_PALETTE_ADD("palette", 16)
+
+ FLOPPY_CONNECTOR(config, m_upd_connector[0], hector_floppies, "525hd", floppy_image_device::default_floppy_formats);
+ FLOPPY_CONNECTOR(config, m_upd_connector[1], hector_floppies, "525hd", floppy_image_device::default_floppy_formats);
+
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(50);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(400)); /* 2500 not accurate */
+ screen.set_size(512, 230);
+ screen.set_visarea(0, 243, 0, 227);
+ screen.set_screen_update(FUNC(hec2hrp_state::screen_update_hec2hrp));
+ screen.set_palette(m_palette);
+
+ PALETTE(config, m_palette).set_entries(16);
MCFG_VIDEO_START_OVERRIDE(hec2hrp_state,hec2hrp)
hector_audio(config);
- MCFG_CASSETTE_ADD( "cassette" )
- MCFG_CASSETTE_FORMATS(hector_cassette_formats)
- MCFG_CASSETTE_DEFAULT_STATE(CASSETTE_PLAY | CASSETTE_MOTOR_DISABLED | CASSETTE_SPEAKER_ENABLED)
+ CASSETTE(config, m_cassette);
+ m_cassette->set_formats(hector_cassette_formats);
+ m_cassette->set_default_state(CASSETTE_PLAY | CASSETTE_MOTOR_DISABLED | CASSETTE_SPEAKER_ENABLED);
- MCFG_DEVICE_ADD("printer", PRINTER, 0)
-MACHINE_CONFIG_END
+ PRINTER(config, m_printer, 0);
+}
ROM_START( hec2hr )
ROM_REGION( 0x10000, "maincpu", ROMREGION_ERASEFF )
diff --git a/src/mame/drivers/hh_amis2k.cpp b/src/mame/drivers/hh_amis2k.cpp
index f0d4b354c68..5f97f5eb631 100644
--- a/src/mame/drivers/hh_amis2k.cpp
+++ b/src/mame/drivers/hh_amis2k.cpp
@@ -2,352 +2,396 @@
// copyright-holders:hap
/***************************************************************************
- Parker Brothers Wildfire, by Bob and Holly Doyle (prototype), and Garry Kitchen
- * AMI S2150, labeled C10641
-
- This is an electronic handheld pinball game. It has dozens of small leds
- to create the illusion of a moving ball, and even the flippers are leds.
- A drawing of a pinball table is added as overlay.
-
- NOTE!: MAME external artwork is required
-
+ AMI S2000 series handhelds or other simple devices.
TODO:
- - driver needs a cleanup when another AMI S2000 handheld gets dumped/added
-
- - sound emulation could still be improved
- - when the game strobes a led faster, it should appear brighter, for example when
- the ball hits one of the bumpers
- - 7seg decoder is guessed
- - MCU clock is unknown
+ - were any other handhelds with this MCU released?
+ - wildfire sound can be improved, volume decay should be more steep at the start,
+ and the pitch sounds wrong too (latter is an MCU emulation problem)
+ - leds are sometimes strobed faster/longer to appear at a different brightness,
+ eg. wildfire bumpers
***************************************************************************/
#include "emu.h"
+
#include "cpu/amis2000/amis2000.h"
#include "machine/timer.h"
#include "sound/spkrdev.h"
#include "speaker.h"
-#include "wildfire.lh" // this is a test layout, use external artwork
+// internal artwork
+#include "wildfire.lh"
-// master clock is a single stage RC oscillator: R=?K, C=?pf,
-// S2000 default frequency is 850kHz
-#define MASTER_CLOCK (850000)
+//#include "hh_amis2k_test.lh" // common test-layout - use external artwork
-class wildfire_state : public driver_device
+class hh_amis2k_state : public driver_device
{
public:
- wildfire_state(const machine_config &mconfig, device_type type, const char *tag) :
+ hh_amis2k_state(const machine_config &mconfig, device_type type, const char *tag) :
driver_device(mconfig, type, tag),
m_maincpu(*this, "maincpu"),
+ m_inp_matrix(*this, "IN.%u", 0),
+ m_out_x(*this, "%u.%u", 0U, 0U),
+ m_out_a(*this, "%u.a", 0U),
+ m_out_digit(*this, "digit%u", 0U),
m_speaker(*this, "speaker"),
- m_a12_decay_timer(*this, "a12_decay"),
- m_digits(*this, "digit%u", 0U),
- m_lamps(*this, "lamp%u", 0U)
+ m_display_wait(33),
+ m_display_maxy(1),
+ m_display_maxx(0)
{ }
- void wildfire(machine_config &config);
+ // devices
+ required_device<amis2000_base_device> m_maincpu;
+ optional_ioport_array<4> m_inp_matrix; // max 4
+ output_finder<0x20, 0x20> m_out_x;
+ output_finder<0x20> m_out_a;
+ output_finder<0x20> m_out_digit;
+ optional_device<speaker_sound_device> m_speaker;
-private:
- virtual void machine_start() override;
+ // misc common
+ u16 m_a; // MCU address bus
+ u8 m_d; // MCU data bus
+ int m_f; // MCU F_out pin
+ u16 m_inp_mux; // multiplexed inputs mask
- DECLARE_WRITE8_MEMBER(write_d);
- DECLARE_WRITE16_MEMBER(write_a);
- DECLARE_WRITE_LINE_MEMBER(write_f);
+ u8 read_inputs(int columns);
- TIMER_DEVICE_CALLBACK_MEMBER(display_decay_tick);
+ // display common
+ int m_display_wait; // led/lamp off-delay in milliseconds (default 33ms)
+ int m_display_maxy; // display matrix number of rows
+ int m_display_maxx; // display matrix number of columns (max 31 for now)
+
+ u32 m_display_state[0x20]; // display matrix rows data (last bit is used for always-on)
+ u16 m_display_segmask[0x20]; // if not 0, display matrix row is a digit, mask indicates connected segments
+ u8 m_display_decay[0x20][0x20]; // (internal use)
- bool index_is_7segled(int index);
+ TIMER_DEVICE_CALLBACK_MEMBER(display_decay_tick);
void display_update();
+ void set_display_size(int maxx, int maxy);
+ void set_display_segmask(u32 digits, u32 mask);
+ void display_matrix(int maxx, int maxy, u32 setx, u32 sety, bool update = true);
+
+protected:
+ virtual void machine_start() override;
+ virtual void machine_reset() override;
+};
- TIMER_DEVICE_CALLBACK_MEMBER(reset_q2);
- void write_a12(int state);
- void sound_update();
- required_device<amis2152_cpu_device> m_maincpu;
- required_device<speaker_sound_device> m_speaker;
- required_device<timer_device> m_a12_decay_timer;
+// machine start/reset
- output_finder<3> m_digits;
- output_finder<16 * 10> m_lamps; // only ones ending in 0-7 are used, 8-9 are unused
+void hh_amis2k_state::machine_start()
+{
+ // resolve handlers
+ m_out_x.resolve();
+ m_out_a.resolve();
+ m_out_digit.resolve();
- u8 m_d;
- u16 m_a;
- u8 m_q2;
- u8 m_q3;
+ // zerofill
+ memset(m_display_state, 0, sizeof(m_display_state));
+ memset(m_display_decay, 0, sizeof(m_display_decay));
+ memset(m_display_segmask, 0, sizeof(m_display_segmask));
- u16 m_display_state[0x10];
- u8 m_display_decay[0x100];
-};
+ m_a = 0;
+ m_d = 0;
+ m_f = 0;
+ m_inp_mux = 0;
+
+ // register for savestates
+ save_item(NAME(m_display_maxy));
+ save_item(NAME(m_display_maxx));
+ save_item(NAME(m_display_wait));
+
+ save_item(NAME(m_display_state));
+ save_item(NAME(m_display_decay));
+ save_item(NAME(m_display_segmask));
+
+ save_item(NAME(m_a));
+ save_item(NAME(m_d));
+ save_item(NAME(m_f));
+ save_item(NAME(m_inp_mux));
+}
+
+void hh_amis2k_state::machine_reset()
+{
+}
/***************************************************************************
- LED Display
+ Helper Functions
***************************************************************************/
-// The device strobes the outputs very fast, it is unnoticeable to the user.
+// The device may strobe the outputs very fast, it is unnoticeable to the user.
// To prevent flickering here, we need to simulate a decay.
-// decay time, in steps of 1ms
-#define DISPLAY_DECAY_TIME 40
-
-inline bool wildfire_state::index_is_7segled(int index)
-{
- // first 3 A are 7segleds
- return (index < 3);
-}
-
-// lamp translation table: Lzz from patent US4334679 FIG.4 = MAME lampxxy,
-// where xx is led column and y is led row, eg. lamp103 is output A10 D3
-// (note: 2 mistakes in the patent: the L19 between L12 and L14 should be L13, and L84 should of course be L48)
-/*
- L0 = - L10 = lamp60 L20 = lamp41 L30 = lamp53 L40 = lamp57 L50 = lamp110
- L1 = lamp107 L11 = lamp50 L21 = lamp42 L31 = lamp43 L41 = lamp66 L51 = lamp111
- L2 = lamp106 L12 = lamp61 L22 = lamp52 L32 = lamp54 L42 = lamp76 L52 = lamp112
- L3 = lamp105 L13 = lamp71 L23 = lamp63 L33 = lamp55 L43 = lamp86 L53 = lamp113
- L4 = lamp104 L14 = lamp81 L24 = lamp73 L34 = lamp117 L44 = lamp96 L60 = lamp30
- L5 = lamp103 L15 = lamp92 L25 = lamp115 L35 = lamp75 L45 = lamp67 L61 = lamp30(!)
- L6 = lamp102 L16 = lamp82 L26 = lamp93 L36 = lamp95 L46 = lamp77 L62 = lamp31
- L7 = lamp101 L17 = lamp72 L27 = lamp94 L37 = lamp56 L47 = lamp87 L63 = lamp31(!)
- L8 = lamp80 L18 = lamp114 L28 = lamp84 L38 = lamp65 L48 = lamp97 L70 = lamp33
- L9 = lamp70 L19 = lamp51 L29 = lamp116 L39 = lamp85 L49 = -
-*/
-
-void wildfire_state::display_update()
+void hh_amis2k_state::display_update()
{
- u16 active_state[0x10];
-
- for (int i = 0; i < 0x10; i++)
+ for (int y = 0; y < m_display_maxy; y++)
{
- // update current state
- m_display_state[i] = (m_a >> i & 1) ? m_d : 0;
-
- active_state[i] = 0;
+ u32 active_state = 0;
- for (int j = 0; j < 0x10; j++)
+ for (int x = 0; x <= m_display_maxx; x++)
{
- int di = j << 4 | i;
-
// turn on powered segments
- if (m_display_state[i] >> j & 1)
- m_display_decay[di] = DISPLAY_DECAY_TIME;
+ if (m_display_state[y] >> x & 1)
+ m_display_decay[y][x] = m_display_wait;
// determine active state
- int ds = (m_display_decay[di] != 0) ? 1 : 0;
- active_state[i] |= (ds << j);
+ u32 ds = (m_display_decay[y][x] != 0) ? 1 : 0;
+ active_state |= (ds << x);
+
+ // output to y.x, or y.a when always-on
+ if (x != m_display_maxx)
+ m_out_x[y][x] = ds;
+ else
+ m_out_a[y] = ds;
}
- }
- // on difference, send to output
- for (int i = 0; i < 0x10; i++)
- {
- if (index_is_7segled(i))
- m_digits[i] = bitswap<7>(active_state[i],0,1,2,3,4,5,6);
-
- for (int j = 0; j < 8; j++)
- m_lamps[(i * 10) + j] = BIT(active_state[i], j);
+ // output to digity
+ if (m_display_segmask[y] != 0)
+ m_out_digit[y] = active_state & m_display_segmask[y];
}
}
-TIMER_DEVICE_CALLBACK_MEMBER(wildfire_state::display_decay_tick)
+TIMER_DEVICE_CALLBACK_MEMBER(hh_amis2k_state::display_decay_tick)
{
// slowly turn off unpowered segments
- for (int i = 0; i < 0x100; i++)
- if (!(m_display_state[i & 0xf] >> (i>>4) & 1) && m_display_decay[i])
- m_display_decay[i]--;
+ for (int y = 0; y < m_display_maxy; y++)
+ for (int x = 0; x <= m_display_maxx; x++)
+ if (m_display_decay[y][x] != 0)
+ m_display_decay[y][x]--;
display_update();
}
-
-
-/***************************************************************************
-
- Sound
-
-***************************************************************************/
-
-// Sound output is via a speaker between transistors Q2(from A12) and Q3(from F_out)
-// A12 to Q2 has a little electronic circuit going, causing a slight delay.
-// (see patent US4334679 FIG.5, the 2 resistors are 10K and the cap is a 4.7uF electrolytic)
-
-// decay time, in steps of 1ms
-#define A12_DECAY_TIME 5 /* a complete guess */
-
-void wildfire_state::sound_update()
+void hh_amis2k_state::set_display_size(int maxx, int maxy)
{
- m_speaker->level_w(m_q2 & m_q3);
+ m_display_maxx = maxx;
+ m_display_maxy = maxy;
}
-WRITE_LINE_MEMBER(wildfire_state::write_f)
+void hh_amis2k_state::set_display_segmask(u32 digits, u32 mask)
{
- // F_out pin: speaker out
- m_q3 = (state) ? 1 : 0;
- sound_update();
+ // set a segment mask per selected digit, but leave unselected ones alone
+ for (int i = 0; i < 0x20; i++)
+ {
+ if (digits & 1)
+ m_display_segmask[i] = mask;
+ digits >>= 1;
+ }
}
-TIMER_DEVICE_CALLBACK_MEMBER(wildfire_state::reset_q2)
+void hh_amis2k_state::display_matrix(int maxx, int maxy, u32 setx, u32 sety, bool update)
{
- m_q2 = 0;
- sound_update();
+ set_display_size(maxx, maxy);
+
+ // update current state
+ u32 mask = (1 << maxx) - 1;
+ for (int y = 0; y < maxy; y++)
+ m_display_state[y] = (sety >> y & 1) ? ((setx & mask) | (1 << maxx)) : 0;
+
+ if (update)
+ display_update();
}
-void wildfire_state::write_a12(int state)
+
+// generic input handlers
+
+u8 hh_amis2k_state::read_inputs(int columns)
{
- if (state)
- {
- m_a12_decay_timer->adjust(attotime::never);
- m_q2 = state;
- sound_update();
- }
- else if (m_a >> 12 & 1)
- {
- // falling edge
- m_a12_decay_timer->adjust(attotime::from_msec(A12_DECAY_TIME));
- }
+ u8 ret = 0;
+
+ // read selected input rows
+ for (int i = 0; i < columns; i++)
+ if (m_inp_mux >> i & 1)
+ ret |= m_inp_matrix[i]->read();
+
+ return ret;
}
/***************************************************************************
- I/O
+ Minidrivers (subclass, I/O, Inputs, Machine Config, ROM Defs)
***************************************************************************/
-WRITE8_MEMBER(wildfire_state::write_d)
-{
- // D0-D7: leds out
- m_d = data;
- display_update();
-}
-
-WRITE16_MEMBER(wildfire_state::write_a)
-{
- data ^= 0x1fff; // active-low
+namespace {
- // A12: enable speaker
- write_a12(data >> 12 & 1);
+/***************************************************************************
- // A0-A2: select 7segleds
- // A3-A11: select other leds
- m_a = data;
- display_update();
-}
+ Parker Brothers Wildfire, by Bob and Holly Doyle (prototype), and Garry Kitchen
+ * AMI S2150, labeled C10641
+ * RC circuit for speaker volume decay (see patent US4334679 FIG.5,
+ the 2 resistors at A12 are 10K and the cap is 4.7uF)
+ This is an electronic handheld pinball game. It has dozens of small leds
+ to create the illusion of a moving ball, and even the flippers are leds.
+ A drawing of a pinball table is added as overlay.
+ led translation table: led Lzz from patent US4334679 FIG.4* = MAME y.x:
+ *note: 2 mistakes in it: L19 between L12 and L14 should be L13, and L84 should of course be L48
-/***************************************************************************
+ 0 = - 10 = 6.6 20 = 4.5 30 = 5.3 40 = 5.7 50 = 11.6
+ 1 = 10.7 11 = 5.6 21 = 4.4 31 = 4.3 41 = 6.0 51 = 11.5
+ 2 = 10.0 12 = 6.5 22 = 5.4 32 = 5.2 42 = 7.0 52 = 11.4
+ 3 = 10.1 13 = 7.5 23 = 6.3 33 = 5.1 43 = 8.0 53 = 11.3
+ 4 = 10.2 14 = 8.5 24 = 7.3 34 = 11.7 44 = 9.0 60 = 3.6
+ 5 = 10.3 15 = 9.4 25 = 11.1 35 = 7.1 45 = 6.7 61 = 3.6(!)
+ 6 = 10.4 16 = 8.4 26 = 9.3 36 = 9.1 46 = 7.7 62 = 3.5
+ 7 = 10.5 17 = 7.4 27 = 9.2 37 = 5.0 47 = 8.7 63 = 3.5(!)
+ 8 = 8.6 18 = 11.2 28 = 8.2 38 = 6.1 48 = 9.7 70 = 3.3
+ 9 = 7.6 19 = 5.5 29 = 11.0 39 = 8.1 49 = -
- Inputs
+ NOTE!: MAME external artwork is required
***************************************************************************/
-static INPUT_PORTS_START( wildfire )
- PORT_START("IN1") // I
- PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_NAME("Shooter Button")
- PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_NAME("Left Flipper")
- PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_NAME("Right Flipper")
- PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNUSED )
-INPUT_PORTS_END
+class wildfire_state : public hh_amis2k_state
+{
+public:
+ wildfire_state(const machine_config &mconfig, device_type type, const char *tag) :
+ hh_amis2k_state(mconfig, type, tag)
+ { }
+
+ void prepare_display();
+ DECLARE_WRITE8_MEMBER(write_d);
+ DECLARE_WRITE16_MEMBER(write_a);
+ DECLARE_WRITE_LINE_MEMBER(write_f);
+ void speaker_update();
+ TIMER_DEVICE_CALLBACK_MEMBER(speaker_decay_sim);
+ double m_speaker_volume;
+ void wildfire(machine_config &config);
+protected:
+ virtual void machine_start() override;
+};
-/***************************************************************************
+void wildfire_state::machine_start()
+{
+ hh_amis2k_state::machine_start();
- Machine Config
+ // zerofill/init
+ m_speaker_volume = 0;
+ save_item(NAME(m_speaker_volume));
+}
-***************************************************************************/
+// handlers
-void wildfire_state::machine_start()
+void wildfire_state::speaker_update()
{
- m_digits.resolve();
- m_lamps.resolve();
+ if (~m_a & 0x1000)
+ m_speaker_volume = 1.0;
- // zerofill
- memset(m_display_state, 0, sizeof(m_display_state));
- memset(m_display_decay, 0, sizeof(m_display_decay));
+ m_speaker->level_w(m_f * 0x7fff * m_speaker_volume);
+}
- m_d = 0;
- m_a = 0;
- m_q2 = 0;
- m_q3 = 0;
+TIMER_DEVICE_CALLBACK_MEMBER(wildfire_state::speaker_decay_sim)
+{
+ // volume decays when speaker is off (divisor and timer period determine duration)
+ speaker_update();
+ m_speaker_volume /= 1.0025;
+}
- // register for savestates
- save_item(NAME(m_display_state));
- save_item(NAME(m_display_decay));
+void wildfire_state::prepare_display()
+{
+ // A0-A2 are 7segs
+ set_display_segmask(7, 0x7f);
+ display_matrix(8, 12, m_d, ~m_a);
+}
- save_item(NAME(m_d));
- save_item(NAME(m_a));
- save_item(NAME(m_q2));
- save_item(NAME(m_q3));
+WRITE8_MEMBER(wildfire_state::write_d)
+{
+ // D0-D7: led/7seg data
+ m_d = bitswap<8>(data,7,0,1,2,3,4,5,6);
+ prepare_display();
}
-// LED segments A-G
-enum
+WRITE16_MEMBER(wildfire_state::write_a)
{
- lA = 0x40,
- lB = 0x20,
- lC = 0x10,
- lD = 0x08,
- lE = 0x04,
- lF = 0x02,
- lG = 0x01
-};
+ // A0-A11: digit/led select
+ m_a = data;
+ prepare_display();
+ // A12: speaker on
+ speaker_update();
+}
+
+WRITE_LINE_MEMBER(wildfire_state::write_f)
+{
+ // F: speaker out
+ m_f = state;
+ speaker_update();
+}
+
+// config
+
+static INPUT_PORTS_START( wildfire )
+ PORT_START("IN.0") // I
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_NAME("Shooter Button")
+ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_NAME("Left Flipper")
+ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_NAME("Right Flipper")
+ PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNUSED )
+INPUT_PORTS_END
+
+// 7seg decoder table differs from default, this one is made by hand
static const u8 wildfire_7seg_table[0x10] =
{
- 0x7e, 0x30, 0x6d, 0x79, 0x33, 0x5b, 0x5f, 0x70, 0x7f, 0x7b, // 0-9 unaltered
- 0x77, // A -> unused?
- lA+lB+lE+lF+lG, // b -> P
- 0x4e, // C -> unused?
- lD+lE+lF, // d -> L
- 0x4f, // E -> unused?
- lG // F -> -
+ 0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, // 0, 1, 2, 3, 4, 5, 6, 7
+ 0x7f, 0x6f, 0x77, 0x73, 0x39, 0x38, 0x79, 0x40 // 8, 9, ?, P, ?, L, ?, -
};
+static s16 wildfire_speaker_levels[0x8000];
void wildfire_state::wildfire(machine_config &config)
{
/* basic machine hardware */
- AMI_S2152(config, m_maincpu, MASTER_CLOCK);
+ AMI_S2152(config, m_maincpu, 850000); // approximation - RC osc. R=?, C=?
m_maincpu->set_7seg_table(wildfire_7seg_table);
- m_maincpu->read_i().set_ioport("IN1");
+ m_maincpu->read_i().set_ioport("IN.0");
m_maincpu->write_d().set(FUNC(wildfire_state::write_d));
m_maincpu->write_a().set(FUNC(wildfire_state::write_a));
m_maincpu->write_f().set(FUNC(wildfire_state::write_f));
- TIMER(config, "display_decay").configure_periodic(FUNC(wildfire_state::display_decay_tick), attotime::from_msec(1));
- TIMER(config, "a12_decay").configure_generic(FUNC(wildfire_state::reset_q2));
-
+ TIMER(config, "display_decay").configure_periodic(FUNC(hh_amis2k_state::display_decay_tick), attotime::from_msec(1));
config.set_default_layout(layout_wildfire);
- /* no video! */
-
/* sound hardware */
SPEAKER(config, "mono").front_center();
SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25);
-}
-
+ TIMER(config, "speaker_decay").configure_periodic(FUNC(wildfire_state::speaker_decay_sim), attotime::from_usec(100));
-/***************************************************************************
-
- Game driver(s)
+ // set volume levels (set_output_gain is too slow for sub-frame intervals)
+ for (int i = 0; i < 0x8000; i++)
+ wildfire_speaker_levels[i] = i;
+ m_speaker->set_levels(0x8000, wildfire_speaker_levels);
+}
-***************************************************************************/
+// roms
ROM_START( wildfire )
ROM_REGION( 0x0800, "maincpu", ROMREGION_ERASE00 )
- ROM_LOAD( "us4341385", 0x0000, 0x0400, CRC(84ac0f1f) SHA1(1e00ddd402acfc2cc267c34eed4b89d863e2144f) ) // from patent US4334679, data should be correct (it included checksums). 1st half was dumped/verfied too.
+ // Typed in from patent US4334679, data should be correct(it included checksums). 1st half was also dumped/verfied with release version.
+ ROM_LOAD( "us4341385", 0x0000, 0x0400, CRC(84ac0f1f) SHA1(1e00ddd402acfc2cc267c34eed4b89d863e2144f) )
ROM_CONTINUE( 0x0600, 0x0200 )
ROM_END
+
+} // anonymous namespace
+
+/***************************************************************************
+
+ Game driver(s)
+
+***************************************************************************/
+
// YEAR NAME PARENT CMP MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS
CONS( 1979, wildfire, 0, 0, wildfire, wildfire, wildfire_state, empty_init, "Parker Brothers", "Wildfire (patent)", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) // note: pretty sure that it matches the commercial release
diff --git a/src/mame/drivers/hh_cop400.cpp b/src/mame/drivers/hh_cop400.cpp
index ac2871d1a2d..66f827f7fbd 100644
--- a/src/mame/drivers/hh_cop400.cpp
+++ b/src/mame/drivers/hh_cop400.cpp
@@ -11,7 +11,7 @@
- vidchal: Add screen and gun cursor with brightness detection callback,
and softwarelist for the video tapes. We'd also need a VHS player device.
The emulated lightgun itself appears to be working fine(eg. add a 30hz
- timer to IN3 to score +100)
+ timer to IN.3 to score +100)
***************************************************************************/
@@ -22,7 +22,6 @@
#include "sound/spkrdev.h"
#include "sound/dac.h"
#include "sound/volt_reg.h"
-//#include "rendlay.h"
#include "screen.h"
#include "speaker.h"
@@ -48,8 +47,8 @@
class hh_cop400_state : public driver_device
{
public:
- hh_cop400_state(const machine_config &mconfig, device_type type, const char *tag)
- : driver_device(mconfig, type, tag),
+ hh_cop400_state(const machine_config &mconfig, device_type type, const char *tag) :
+ driver_device(mconfig, type, tag),
m_maincpu(*this, "maincpu"),
m_inp_matrix(*this, "IN.%u", 0),
m_out_x(*this, "%u.%u", 0U, 0U),
@@ -78,6 +77,7 @@ public:
u16 m_inp_mux; // multiplexed inputs mask
u16 read_inputs(int columns, u16 colmask = ~0);
+ virtual DECLARE_INPUT_CHANGED_MEMBER(reset_button);
// display common
int m_display_wait; // led/lamp off-delay in milliseconds (default 33ms)
@@ -239,14 +239,22 @@ u16 hh_cop400_state::read_inputs(int columns, u16 colmask)
return ret;
}
+INPUT_CHANGED_MEMBER(hh_cop400_state::reset_button)
+{
+ // when an input is directly wired to MCU reset pin
+ m_maincpu->set_input_line(INPUT_LINE_RESET, newval ? ASSERT_LINE : CLEAR_LINE);
+}
+
/***************************************************************************
- Minidrivers (subclass, I/O, Inputs, Machine Config)
+ Minidrivers (subclass, I/O, Inputs, Machine Config, ROM Defs)
***************************************************************************/
+namespace {
+
/***************************************************************************
Castle Toy Einstein
@@ -261,8 +269,8 @@ u16 hh_cop400_state::read_inputs(int columns, u16 colmask)
class ctstein_state : public hh_cop400_state
{
public:
- ctstein_state(const machine_config &mconfig, device_type type, const char *tag)
- : hh_cop400_state(mconfig, type, tag)
+ ctstein_state(const machine_config &mconfig, device_type type, const char *tag) :
+ hh_cop400_state(mconfig, type, tag)
{ }
DECLARE_WRITE8_MEMBER(write_g);
@@ -331,6 +339,13 @@ void ctstein_state::ctstein(machine_config &config)
SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25);
}
+// roms
+
+ROM_START( ctstein )
+ ROM_REGION( 0x0400, "maincpu", 0 )
+ ROM_LOAD( "cop421-nez_n", 0x0000, 0x0400, CRC(16148e03) SHA1(b2b74891d36813d9a1eefd56a925054997c4b7f7) ) // 2nd half empty
+ROM_END
+
@@ -348,14 +363,15 @@ void ctstein_state::ctstein(machine_config &config)
An earlier revision of this runs on TMS1000, see hh_tms1k.cpp driver. Model
numbers are the same. From the outside, an easy way to spot the difference is
the Start/Display button: TMS1000 version button label is D, COP420 one is a *.
+ The COP420 version also plays much slower.
***************************************************************************/
class h2hbaskbc_state : public hh_cop400_state
{
public:
- h2hbaskbc_state(const machine_config &mconfig, device_type type, const char *tag)
- : hh_cop400_state(mconfig, type, tag)
+ h2hbaskbc_state(const machine_config &mconfig, device_type type, const char *tag) :
+ hh_cop400_state(mconfig, type, tag)
{ }
DECLARE_WRITE8_MEMBER(write_d);
@@ -457,8 +473,8 @@ INPUT_PORTS_END
void h2hbaskbc_state::h2hbaskbc(machine_config &config)
{
/* basic machine hardware */
- COP420(config, m_maincpu, 850000); // approximation - RC osc. R=43K, C=101pF
- m_maincpu->set_config(COP400_CKI_DIVISOR_8, COP400_CKO_OSCILLATOR_OUTPUT, false); // guessed
+ COP420(config, m_maincpu, 1000000); // approximation - RC osc. R=43K, C=101pF
+ m_maincpu->set_config(COP400_CKI_DIVISOR_16, COP400_CKO_OSCILLATOR_OUTPUT, false); // guessed
m_maincpu->write_d().set(FUNC(h2hbaskbc_state::write_d));
m_maincpu->write_g().set(FUNC(h2hbaskbc_state::write_g));
m_maincpu->write_l().set(FUNC(h2hbaskbc_state::write_l));
@@ -485,6 +501,16 @@ void h2hbaskbc_state::h2hsoccerc(machine_config &config)
config.set_default_layout(layout_h2hsoccerc);
}
+// roms
+
+ROM_START( h2hbaskbc )
+ ROM_REGION( 0x0400, "maincpu", 0 )
+ ROM_LOAD( "cop420l-nmy", 0x0000, 0x0400, CRC(87152509) SHA1(acdb869b65d49b3b9855a557ed671cbbb0f61e2c) )
+ROM_END
+
+#define rom_h2hhockeyc rom_h2hbaskbc // dumped from Basketball
+#define rom_h2hsoccerc rom_h2hbaskbc // "
+
@@ -503,8 +529,8 @@ void h2hbaskbc_state::h2hsoccerc(machine_config &config)
class einvaderc_state : public hh_cop400_state
{
public:
- einvaderc_state(const machine_config &mconfig, device_type type, const char *tag)
- : hh_cop400_state(mconfig, type, tag)
+ einvaderc_state(const machine_config &mconfig, device_type type, const char *tag) :
+ hh_cop400_state(mconfig, type, tag)
{ }
void prepare_display();
@@ -594,7 +620,7 @@ void einvaderc_state::einvaderc(machine_config &config)
screen.set_svg_region("svg");
screen.set_refresh_hz(50);
screen.set_size(913, 1080);
- screen.set_visarea(0, 913-1, 0, 1080-1);
+ screen.set_visarea_full();
TIMER(config, "display_decay").configure_periodic(FUNC(hh_cop400_state::display_decay_tick), attotime::from_msec(1));
config.set_default_layout(layout_einvaderc);
@@ -604,6 +630,16 @@ void einvaderc_state::einvaderc(machine_config &config)
SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25);
}
+// roms
+
+ROM_START( einvaderc )
+ ROM_REGION( 0x0800, "maincpu", 0 )
+ ROM_LOAD( "copl444-hrz_n_inv_ii", 0x0000, 0x0800, CRC(76400f38) SHA1(0e92ab0517f7b7687293b189d30d57110df20fe0) )
+
+ ROM_REGION( 80636, "svg", 0)
+ ROM_LOAD( "einvaderc.svg", 0, 80636, CRC(a52d0166) SHA1(f69397ebcc518701f30a47b4d62e5a700825375a) )
+ROM_END
+
@@ -625,8 +661,8 @@ void einvaderc_state::einvaderc(machine_config &config)
class unkeinv_state : public hh_cop400_state
{
public:
- unkeinv_state(const machine_config &mconfig, device_type type, const char *tag)
- : hh_cop400_state(mconfig, type, tag)
+ unkeinv_state(const machine_config &mconfig, device_type type, const char *tag) :
+ hh_cop400_state(mconfig, type, tag)
{ }
void prepare_display();
@@ -635,7 +671,7 @@ public:
DECLARE_WRITE8_MEMBER(write_l);
DECLARE_READ8_MEMBER(read_l);
- DECLARE_INPUT_CHANGED_MEMBER(position_changed);
+ DECLARE_INPUT_CHANGED_MEMBER(position_changed) { prepare_display(); }
void unkeinv(machine_config &config);
};
@@ -694,11 +730,6 @@ READ8_MEMBER(unkeinv_state::read_l)
// config
-INPUT_CHANGED_MEMBER(unkeinv_state::position_changed)
-{
- prepare_display();
-}
-
static INPUT_PORTS_START( unkeinv )
PORT_START("IN.0")
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 )
@@ -727,6 +758,13 @@ void unkeinv_state::unkeinv(machine_config &config)
SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25);
}
+// roms
+
+ROM_START( unkeinv )
+ ROM_REGION( 0x0400, "maincpu", 0 )
+ ROM_LOAD( "cop421_us4345764", 0x0000, 0x0400, CRC(0068c3a3) SHA1(4e5fd566a5a26c066cc14623a9bd01e109ebf797) ) // typed in from patent US4345764, good print quality
+ROM_END
+
@@ -749,8 +787,8 @@ void unkeinv_state::unkeinv(machine_config &config)
class lchicken_state : public hh_cop400_state
{
public:
- lchicken_state(const machine_config &mconfig, device_type type, const char *tag)
- : hh_cop400_state(mconfig, type, tag)
+ lchicken_state(const machine_config &mconfig, device_type type, const char *tag) :
+ hh_cop400_state(mconfig, type, tag)
{ }
u8 m_motor_pos;
@@ -769,8 +807,22 @@ protected:
virtual void machine_start() override;
};
+void lchicken_state::machine_start()
+{
+ hh_cop400_state::machine_start();
+
+ // zerofill, register for savestates
+ m_motor_pos = 0;
+ save_item(NAME(m_motor_pos));
+}
+
// handlers
+CUSTOM_INPUT_MEMBER(lchicken_state::motor_switch)
+{
+ return m_motor_pos > 0xe8; // approximation
+}
+
TIMER_DEVICE_CALLBACK_MEMBER(lchicken_state::motor_sim_tick)
{
if (~m_inp_mux & 8)
@@ -848,20 +900,6 @@ static INPUT_PORTS_START( lchicken )
PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_CUSTOM ) PORT_CUSTOM_MEMBER(DEVICE_SELF, lchicken_state, motor_switch, nullptr)
INPUT_PORTS_END
-CUSTOM_INPUT_MEMBER(lchicken_state::motor_switch)
-{
- return m_motor_pos > 0xe8; // approximation
-}
-
-void lchicken_state::machine_start()
-{
- hh_cop400_state::machine_start();
-
- // zerofill, register for savestates
- m_motor_pos = 0;
- save_item(NAME(m_motor_pos));
-}
-
void lchicken_state::lchicken(machine_config &config)
{
/* basic machine hardware */
@@ -883,6 +921,13 @@ void lchicken_state::lchicken(machine_config &config)
SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25);
}
+// roms
+
+ROM_START( lchicken )
+ ROM_REGION( 0x0400, "maincpu", 0 )
+ ROM_LOAD( "cop421-njc_n", 0x0000, 0x0400, CRC(319e7985) SHA1(9714327518f65ebefe38ac7911bed2b9b9c77307) )
+ROM_END
+
@@ -898,8 +943,8 @@ void lchicken_state::lchicken(machine_config &config)
class funjacks_state : public hh_cop400_state
{
public:
- funjacks_state(const machine_config &mconfig, device_type type, const char *tag)
- : hh_cop400_state(mconfig, type, tag)
+ funjacks_state(const machine_config &mconfig, device_type type, const char *tag) :
+ hh_cop400_state(mconfig, type, tag)
{ }
DECLARE_WRITE8_MEMBER(write_d);
@@ -990,6 +1035,13 @@ void funjacks_state::funjacks(machine_config &config)
SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25);
}
+// roms
+
+ROM_START( funjacks )
+ ROM_REGION( 0x0200, "maincpu", 0 )
+ ROM_LOAD( "cop410l_b_ngs", 0x0000, 0x0200, CRC(863368ea) SHA1(f116cc27ae721b3a3e178fa13765808bdc275663) )
+ROM_END
+
@@ -1009,15 +1061,13 @@ void funjacks_state::funjacks(machine_config &config)
class funrlgl_state : public hh_cop400_state
{
public:
- funrlgl_state(const machine_config &mconfig, device_type type, const char *tag)
- : hh_cop400_state(mconfig, type, tag)
+ funrlgl_state(const machine_config &mconfig, device_type type, const char *tag) :
+ hh_cop400_state(mconfig, type, tag)
{ }
DECLARE_WRITE8_MEMBER(write_d);
DECLARE_WRITE8_MEMBER(write_l);
DECLARE_WRITE8_MEMBER(write_g);
-
- DECLARE_INPUT_CHANGED_MEMBER(reset_button);
void funrlgl(machine_config &config);
};
@@ -1056,15 +1106,9 @@ static INPUT_PORTS_START( funrlgl )
PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNUSED )
PORT_START("RESET")
- PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_MEMBER(DEVICE_SELF, funrlgl_state, reset_button, nullptr)
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_cop400_state, reset_button, nullptr)
INPUT_PORTS_END
-INPUT_CHANGED_MEMBER(funrlgl_state::reset_button)
-{
- // middle button is directly tied to MCU reset pin
- m_maincpu->set_input_line(INPUT_LINE_RESET, newval ? ASSERT_LINE : CLEAR_LINE);
-}
-
void funrlgl_state::funrlgl(machine_config &config)
{
/* basic machine hardware */
@@ -1084,6 +1128,13 @@ void funrlgl_state::funrlgl(machine_config &config)
SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25);
}
+// roms
+
+ROM_START( funrlgl )
+ ROM_REGION( 0x0200, "maincpu", 0 )
+ ROM_LOAD( "cop410l_b_nhz", 0x0000, 0x0200, CRC(4065c3ce) SHA1(f0bc8125d922949e0d7ab1ba89c805a836d20e09) )
+ROM_END
+
@@ -1101,8 +1152,8 @@ void funrlgl_state::funrlgl(machine_config &config)
class mdallas_state : public hh_cop400_state
{
public:
- mdallas_state(const machine_config &mconfig, device_type type, const char *tag)
- : hh_cop400_state(mconfig, type, tag)
+ mdallas_state(const machine_config &mconfig, device_type type, const char *tag) :
+ hh_cop400_state(mconfig, type, tag)
{ }
void prepare_display();
@@ -1219,6 +1270,13 @@ void mdallas_state::mdallas(machine_config &config)
SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25);
}
+// roms
+
+ROM_START( mdallas )
+ ROM_REGION( 0x0800, "maincpu", 0 )
+ ROM_LOAD( "copl444l-hyn_n", 0x0000, 0x0800, CRC(7848b78c) SHA1(778d24512180892f58c49df3c72ca77b2618d63b) )
+ROM_END
+
@@ -1237,8 +1295,8 @@ void mdallas_state::mdallas(machine_config &config)
class plus1_state : public hh_cop400_state
{
public:
- plus1_state(const machine_config &mconfig, device_type type, const char *tag)
- : hh_cop400_state(mconfig, type, tag)
+ plus1_state(const machine_config &mconfig, device_type type, const char *tag) :
+ hh_cop400_state(mconfig, type, tag)
{ }
DECLARE_WRITE8_MEMBER(write_d);
@@ -1300,6 +1358,13 @@ void plus1_state::plus1(machine_config &config)
SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25);
}
+// roms
+
+ROM_START( plus1 )
+ ROM_REGION( 0x0200, "maincpu", 0 )
+ ROM_LOAD( "cop410l_b_nne", 0x0000, 0x0200, CRC(d861b80c) SHA1(4652f8ee0dd4c3c48b625285bb4f094d96434071) )
+ROM_END
+
@@ -1327,8 +1392,8 @@ void plus1_state::plus1(machine_config &config)
class lightfgt_state : public hh_cop400_state
{
public:
- lightfgt_state(const machine_config &mconfig, device_type type, const char *tag)
- : hh_cop400_state(mconfig, type, tag)
+ lightfgt_state(const machine_config &mconfig, device_type type, const char *tag) :
+ hh_cop400_state(mconfig, type, tag)
{ }
void prepare_display();
@@ -1429,6 +1494,13 @@ void lightfgt_state::lightfgt(machine_config &config)
SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25);
}
+// roms
+
+ROM_START( lightfgt )
+ ROM_REGION( 0x0400, "maincpu", 0 )
+ ROM_LOAD( "cop421l-hla_n", 0x0000, 0x0400, CRC(aceb2d65) SHA1(2328cbb195faf93c575f3afa3a1fe0079180edd7) )
+ROM_END
+
@@ -1445,8 +1517,8 @@ void lightfgt_state::lightfgt(machine_config &config)
class bship82_state : public hh_cop400_state
{
public:
- bship82_state(const machine_config &mconfig, device_type type, const char *tag)
- : hh_cop400_state(mconfig, type, tag)
+ bship82_state(const machine_config &mconfig, device_type type, const char *tag) :
+ hh_cop400_state(mconfig, type, tag)
{ }
DECLARE_WRITE8_MEMBER(write_d);
@@ -1580,13 +1652,19 @@ void bship82_state::bship82(machine_config &config)
/* sound hardware */
SPEAKER(config, "mono").front_center();
- DAC_4BIT_BINARY_WEIGHTED_SIGN_MAGNITUDE(config, "dac", 0).add_route(ALL_OUTPUTS, "mono", 0.125); // see above
- voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref", 0));
- vref.set_output(5.0);
+ DAC_4BIT_BINARY_WEIGHTED_SIGN_MAGNITUDE(config, "dac").add_route(ALL_OUTPUTS, "mono", 0.125); // see above
+ voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref"));
vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT);
vref.add_route(0, "dac", -1.0, DAC_VREF_NEG_INPUT);
}
+// roms
+
+ROM_START( bship82 )
+ ROM_REGION( 0x0400, "maincpu", 0 )
+ ROM_LOAD( "cop420-jwe_n", 0x0000, 0x0400, CRC(5ea8111a) SHA1(34931463b806b48dce4f8ae2361512510bae0ebf) )
+ROM_END
+
@@ -1604,8 +1682,8 @@ void bship82_state::bship82(machine_config &config)
class qkracer_state : public hh_cop400_state
{
public:
- qkracer_state(const machine_config &mconfig, device_type type, const char *tag)
- : hh_cop400_state(mconfig, type, tag)
+ qkracer_state(const machine_config &mconfig, device_type type, const char *tag) :
+ hh_cop400_state(mconfig, type, tag)
{ }
void prepare_display();
@@ -1714,6 +1792,13 @@ void qkracer_state::qkracer(machine_config &config)
/* no sound! */
}
+// roms
+
+ROM_START( qkracer )
+ ROM_REGION( 0x0400, "maincpu", 0 )
+ ROM_LOAD( "cop420-npg_n", 0x0000, 0x0400, CRC(17f8e538) SHA1(23d1a1819e6ba552d8da83da2948af1cf5b13d5b) )
+ROM_END
+
@@ -1738,8 +1823,8 @@ void qkracer_state::qkracer(machine_config &config)
class vidchal_state : public hh_cop400_state
{
public:
- vidchal_state(const machine_config &mconfig, device_type type, const char *tag)
- : hh_cop400_state(mconfig, type, tag)
+ vidchal_state(const machine_config &mconfig, device_type type, const char *tag) :
+ hh_cop400_state(mconfig, type, tag)
{ }
void prepare_display();
@@ -1785,7 +1870,7 @@ static INPUT_PORTS_START( vidchal )
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON1 )
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNUSED )
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED )
- PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_CUSTOM ) // TODO: light sensor
+ PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_OTHER) PORT_CODE(KEYCODE_F1) PORT_NAME("Light Sensor")
INPUT_PORTS_END
void vidchal_state::vidchal(machine_config &config)
@@ -1804,119 +1889,33 @@ void vidchal_state::vidchal(machine_config &config)
/* sound hardware */
SPEAKER(config, "mono").front_center();
- DAC_4BIT_BINARY_WEIGHTED_SIGN_MAGNITUDE(config, "dac", 0).add_route(ALL_OUTPUTS, "mono", 0.125); // unknown DAC
- voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref", 0));
- vref.set_output(5.0);
+ DAC_4BIT_BINARY_WEIGHTED_SIGN_MAGNITUDE(config, "dac").add_route(ALL_OUTPUTS, "mono", 0.125); // unknown DAC
+ voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref"));
vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT);
vref.add_route(0, "dac", -1.0, DAC_VREF_NEG_INPUT);
}
+// roms
-
-
-
-/***************************************************************************
-
- Game driver(s)
-
-***************************************************************************/
-
-ROM_START( ctstein )
- ROM_REGION( 0x0400, "maincpu", 0 )
- ROM_LOAD( "cop421-nez_n", 0x0000, 0x0400, CRC(16148e03) SHA1(b2b74891d36813d9a1eefd56a925054997c4b7f7) ) // 2nd half empty
-ROM_END
-
-
-ROM_START( h2hbaskbc )
- ROM_REGION( 0x0400, "maincpu", 0 )
- ROM_LOAD( "cop420l-nmy", 0x0000, 0x0400, CRC(87152509) SHA1(acdb869b65d49b3b9855a557ed671cbbb0f61e2c) )
-ROM_END
-
-ROM_START( h2hhockeyc ) // dumped from Basketball
- ROM_REGION( 0x0400, "maincpu", 0 )
- ROM_LOAD( "cop420l-nmy", 0x0000, 0x0400, CRC(87152509) SHA1(acdb869b65d49b3b9855a557ed671cbbb0f61e2c) )
-ROM_END
-
-ROM_START( h2hsoccerc ) // dumped from Basketball
- ROM_REGION( 0x0400, "maincpu", 0 )
- ROM_LOAD( "cop420l-nmy", 0x0000, 0x0400, CRC(87152509) SHA1(acdb869b65d49b3b9855a557ed671cbbb0f61e2c) )
-ROM_END
-
-
-ROM_START( einvaderc )
- ROM_REGION( 0x0800, "maincpu", 0 )
- ROM_LOAD( "copl444-hrz_n_inv_ii", 0x0000, 0x0800, CRC(76400f38) SHA1(0e92ab0517f7b7687293b189d30d57110df20fe0) )
-
- ROM_REGION( 80636, "svg", 0)
- ROM_LOAD( "einvaderc.svg", 0, 80636, CRC(a52d0166) SHA1(f69397ebcc518701f30a47b4d62e5a700825375a) )
-ROM_END
-
-
-ROM_START( unkeinv )
- ROM_REGION( 0x0400, "maincpu", 0 )
- ROM_LOAD( "cop421_us4345764", 0x0000, 0x0400, CRC(0068c3a3) SHA1(4e5fd566a5a26c066cc14623a9bd01e109ebf797) ) // typed in from patent US4345764, good print quality
-ROM_END
-
-
-ROM_START( lchicken )
- ROM_REGION( 0x0400, "maincpu", 0 )
- ROM_LOAD( "cop421-njc_n", 0x0000, 0x0400, CRC(319e7985) SHA1(9714327518f65ebefe38ac7911bed2b9b9c77307) )
-ROM_END
-
-
-ROM_START( funjacks )
- ROM_REGION( 0x0200, "maincpu", 0 )
- ROM_LOAD( "cop410l_b_ngs", 0x0000, 0x0200, CRC(863368ea) SHA1(f116cc27ae721b3a3e178fa13765808bdc275663) )
-ROM_END
-
-
-ROM_START( funrlgl )
- ROM_REGION( 0x0200, "maincpu", 0 )
- ROM_LOAD( "cop410l_b_nhz", 0x0000, 0x0200, CRC(4065c3ce) SHA1(f0bc8125d922949e0d7ab1ba89c805a836d20e09) )
-ROM_END
-
-
-ROM_START( mdallas )
- ROM_REGION( 0x0800, "maincpu", 0 )
- ROM_LOAD( "copl444l-hyn_n", 0x0000, 0x0800, CRC(7848b78c) SHA1(778d24512180892f58c49df3c72ca77b2618d63b) )
-ROM_END
-
-
-ROM_START( plus1 )
- ROM_REGION( 0x0200, "maincpu", 0 )
- ROM_LOAD( "cop410l_b_nne", 0x0000, 0x0200, CRC(d861b80c) SHA1(4652f8ee0dd4c3c48b625285bb4f094d96434071) )
-ROM_END
-
-
-ROM_START( lightfgt )
- ROM_REGION( 0x0400, "maincpu", 0 )
- ROM_LOAD( "cop421l-hla_n", 0x0000, 0x0400, CRC(aceb2d65) SHA1(2328cbb195faf93c575f3afa3a1fe0079180edd7) )
-ROM_END
-
-
-ROM_START( bship82 )
+ROM_START( vidchal )
ROM_REGION( 0x0400, "maincpu", 0 )
- ROM_LOAD( "cop420-jwe_n", 0x0000, 0x0400, CRC(5ea8111a) SHA1(34931463b806b48dce4f8ae2361512510bae0ebf) )
+ ROM_LOAD( "cop420-tdx_n", 0x0000, 0x0400, CRC(c9bd041c) SHA1(ab0dcaf4741620fa4c28ab75337a23d646af7626) )
ROM_END
-ROM_START( qkracer )
- ROM_REGION( 0x0400, "maincpu", 0 )
- ROM_LOAD( "cop420-npg_n", 0x0000, 0x0400, CRC(17f8e538) SHA1(23d1a1819e6ba552d8da83da2948af1cf5b13d5b) )
-ROM_END
+} // anonymous namespace
-ROM_START( vidchal )
- ROM_REGION( 0x0400, "maincpu", 0 )
- ROM_LOAD( "cop420-tdx_n", 0x0000, 0x0400, CRC(c9bd041c) SHA1(ab0dcaf4741620fa4c28ab75337a23d646af7626) )
-ROM_END
+/***************************************************************************
+ Game driver(s)
+***************************************************************************/
// YEAR NAME PARENT CMP MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS
CONS( 1979, ctstein, 0, 0, ctstein, ctstein, ctstein_state, empty_init, "Castle Toy", "Einstein (Castle Toy)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK )
-CONS( 1980, h2hbaskbc, 0, 0, h2hbaskbc, h2hbaskbc, h2hbaskbc_state, empty_init, "Coleco", "Head to Head: Electronic Basketball (COP420L version)", MACHINE_SUPPORTS_SAVE )
+CONS( 1980, h2hbaskbc, h2hbaskb, 0, h2hbaskbc, h2hbaskbc, h2hbaskbc_state, empty_init, "Coleco", "Head to Head: Electronic Basketball (COP420L version)", MACHINE_SUPPORTS_SAVE )
CONS( 1980, h2hhockeyc, h2hhockey, 0, h2hhockeyc, h2hhockeyc, h2hbaskbc_state, empty_init, "Coleco", "Head to Head: Electronic Hockey (COP420L version)", MACHINE_SUPPORTS_SAVE )
CONS( 1980, h2hsoccerc, 0, 0, h2hsoccerc, h2hsoccerc, h2hbaskbc_state, empty_init, "Coleco", "Head to Head: Electronic Soccer (COP420L version)", MACHINE_SUPPORTS_SAVE )
diff --git a/src/mame/drivers/hh_hmcs40.cpp b/src/mame/drivers/hh_hmcs40.cpp
index e473e124db4..b1a48703efa 100644
--- a/src/mame/drivers/hh_hmcs40.cpp
+++ b/src/mame/drivers/hh_hmcs40.cpp
@@ -25,7 +25,7 @@
*41 HD38800A 1982, Gakken Puck Monster
*51 HD38800A 1981, Actronics(Hanzawa) Twinvader (larger white version)
@70 HD38800A 1982, Coleco Galaxian
- @73 HD38800A 1982, Bandai(Mattel) Star Hawk (PT-317B)
+ @73 HD38800A 1982, Mattel Star Hawk (PT-317B)
@77 HD38800A 1982, Bandai Frisky Tom (PT-327A)
@88 HD38800A 1984, Tomy Tron (THN-02)
@@ -70,7 +70,6 @@
TODO:
- - cdkong discrete sound (simple volume decay, simulated for now)
- cgalaxn discrete sound (alien attacking sound effect)
- gckong random lockups (tap the jump button repeatedly): mcu stack overflow,
works ok if stack levels is increased, 38800 B rev. has more stack levels?
@@ -98,10 +97,17 @@
#include "screen.h"
#include "speaker.h"
-// internal artwork
+// internal artwork (complete)
#include "pairmtch.lh"
#include "sag.lh"
+// internal artwork (bezel overlay)
+#include "bambball.lh"
+#include "gckong.lh"
+#include "mwcbaseb.lh"
+#include "msthawk.lh"
+#include "packmon.lh"
+
//#include "hh_hmcs40_test.lh" // common test-layout - no svg artwork(yet), use external artwork
@@ -334,10 +340,12 @@ INPUT_CHANGED_MEMBER(hh_hmcs40_state::single_interrupt_line)
/***************************************************************************
- Minidrivers (subclass, I/O, Inputs, Machine Config)
+ Minidrivers (subclass, I/O, Inputs, Machine Config, ROM Defs)
***************************************************************************/
+namespace {
+
/***************************************************************************
Bambino Dribble Away Basketball (manufactured in Japan)
@@ -350,8 +358,8 @@ INPUT_CHANGED_MEMBER(hh_hmcs40_state::single_interrupt_line)
class bambball_state : public hh_hmcs40_state
{
public:
- bambball_state(const machine_config &mconfig, device_type type, const char *tag)
- : hh_hmcs40_state(mconfig, type, tag)
+ bambball_state(const machine_config &mconfig, device_type type, const char *tag) :
+ hh_hmcs40_state(mconfig, type, tag)
{ }
DECLARE_WRITE8_MEMBER(plate_w);
@@ -438,15 +446,27 @@ void bambball_state::bambball(machine_config &config)
screen.set_svg_region("svg");
screen.set_refresh_hz(50);
screen.set_size(1920, 478);
- screen.set_visarea(0, 1920-1, 0, 478-1);
+ screen.set_visarea_full();
TIMER(config, "display_decay").configure_periodic(FUNC(hh_hmcs40_state::display_decay_tick), attotime::from_msec(1));
+ config.set_default_layout(layout_bambball);
/* sound hardware */
SPEAKER(config, "mono").front_center();
SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25);
}
+// roms
+
+ROM_START( bambball )
+ ROM_REGION( 0x1000, "maincpu", ROMREGION_ERASE00 )
+ ROM_LOAD( "hd38750a08", 0x0000, 0x0800, CRC(907fef18) SHA1(73fe7ca7c6332268a3a9abc5ac88ada2991012fb) )
+ ROM_CONTINUE( 0x0f00, 0x0080 )
+
+ ROM_REGION( 281988, "svg", 0)
+ ROM_LOAD( "bambball.svg", 0, 281988, CRC(63019194) SHA1(cbfb5b051d8f57f6b4d698796030850b3631ed56) )
+ROM_END
+
@@ -463,8 +483,8 @@ void bambball_state::bambball(machine_config &config)
class bmboxing_state : public hh_hmcs40_state
{
public:
- bmboxing_state(const machine_config &mconfig, device_type type, const char *tag)
- : hh_hmcs40_state(mconfig, type, tag)
+ bmboxing_state(const machine_config &mconfig, device_type type, const char *tag) :
+ hh_hmcs40_state(mconfig, type, tag)
{ }
void prepare_display();
@@ -575,7 +595,8 @@ void bmboxing_state::bmboxing(machine_config &config)
screen.set_svg_region("svg");
screen.set_refresh_hz(50);
screen.set_size(1920, 529);
- screen.set_visarea(0, 1920-1, 0, 529-1);
+ screen.set_visarea_full();
+
TIMER(config, "display_decay").configure_periodic(FUNC(hh_hmcs40_state::display_decay_tick), attotime::from_msec(1));
/* sound hardware */
@@ -583,6 +604,17 @@ void bmboxing_state::bmboxing(machine_config &config)
SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25);
}
+// roms
+
+ROM_START( bmboxing )
+ ROM_REGION( 0x1000, "maincpu", ROMREGION_ERASE00 )
+ ROM_LOAD( "hd38750a07", 0x0000, 0x0800, CRC(7f33e259) SHA1(c5fcdd6bf060c96666354f09f0570c754f6ed4e0) )
+ ROM_CONTINUE( 0x0f00, 0x0080 )
+
+ ROM_REGION( 257144, "svg", 0)
+ ROM_LOAD( "bmboxing.svg", 0, 257144, CRC(dab81477) SHA1(28b0c844a311e2023ffa71d754e799059b7d050f) )
+ROM_END
+
@@ -599,8 +631,8 @@ void bmboxing_state::bmboxing(machine_config &config)
class bfriskyt_state : public hh_hmcs40_state
{
public:
- bfriskyt_state(const machine_config &mconfig, device_type type, const char *tag)
- : hh_hmcs40_state(mconfig, type, tag)
+ bfriskyt_state(const machine_config &mconfig, device_type type, const char *tag) :
+ hh_hmcs40_state(mconfig, type, tag)
{ }
void prepare_display();
@@ -608,7 +640,7 @@ public:
DECLARE_WRITE16_MEMBER(grid_w);
void update_int1();
- DECLARE_INPUT_CHANGED_MEMBER(input_changed);
+ DECLARE_INPUT_CHANGED_MEMBER(input_changed) { update_int1(); }
void bfriskyt(machine_config &config);
};
@@ -675,14 +707,9 @@ static INPUT_PORTS_START( bfriskyt )
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_MEMBER(DEVICE_SELF, bfriskyt_state, input_changed, nullptr)
PORT_START("IN.5") // INT0
- PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_hmcs40_state, single_interrupt_line, (void *)0)
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_hmcs40_state, single_interrupt_line, 0)
INPUT_PORTS_END
-INPUT_CHANGED_MEMBER(bfriskyt_state::input_changed)
-{
- update_int1();
-}
-
void bfriskyt_state::bfriskyt(machine_config &config)
{
/* basic machine hardware */
@@ -698,7 +725,8 @@ void bfriskyt_state::bfriskyt(machine_config &config)
screen.set_svg_region("svg");
screen.set_refresh_hz(50);
screen.set_size(1920, 675);
- screen.set_visarea(0, 1920-1, 0, 675-1);
+ screen.set_visarea_full();
+
TIMER(config, "display_decay").configure_periodic(FUNC(hh_hmcs40_state::display_decay_tick), attotime::from_msec(1));
/* sound hardware */
@@ -706,6 +734,17 @@ void bfriskyt_state::bfriskyt(machine_config &config)
SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25);
}
+// roms
+
+ROM_START( bfriskyt )
+ ROM_REGION( 0x2000, "maincpu", ROMREGION_ERASE00 )
+ ROM_LOAD( "hd38800a77", 0x0000, 0x1000, CRC(a2445c4f) SHA1(0aaccfec90b66d27dae194d4462d88e654c41578) )
+ ROM_CONTINUE( 0x1e80, 0x0100 )
+
+ ROM_REGION( 413577, "svg", 0)
+ ROM_LOAD( "bfriskyt.svg", 0, 413577, CRC(17090264) SHA1(4512a8a91a459f2ddc258641c6d38c2f48f4160f) )
+ROM_END
+
@@ -728,8 +767,8 @@ void bfriskyt_state::bfriskyt(machine_config &config)
class packmon_state : public hh_hmcs40_state
{
public:
- packmon_state(const machine_config &mconfig, device_type type, const char *tag)
- : hh_hmcs40_state(mconfig, type, tag)
+ packmon_state(const machine_config &mconfig, device_type type, const char *tag) :
+ hh_hmcs40_state(mconfig, type, tag)
{ }
DECLARE_WRITE8_MEMBER(plate_w);
@@ -807,147 +846,27 @@ void packmon_state::packmon(machine_config &config)
screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_SVG));
screen.set_svg_region("svg");
screen.set_refresh_hz(50);
- screen.set_size(1920, 766);
- screen.set_visarea(0, 1920-1, 0, 766-1);
+ screen.set_size(1920, 680);
+ screen.set_visarea_full();
+
TIMER(config, "display_decay").configure_periodic(FUNC(hh_hmcs40_state::display_decay_tick), attotime::from_msec(1));
+ config.set_default_layout(layout_packmon);
/* sound hardware */
SPEAKER(config, "mono").front_center();
SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25);
}
+// roms
+ROM_START( packmon )
+ ROM_REGION( 0x2000, "maincpu", ROMREGION_ERASE00 )
+ ROM_LOAD( "hd38800a27", 0x0000, 0x1000, CRC(86e09e84) SHA1(ac7d3c43667d5720ca513f8ff51d146d9f2af124) )
+ ROM_CONTINUE( 0x1e80, 0x0100 )
-
-
-/***************************************************************************
-
- Bandai/Mattel Star Hawk (manufactured in Japan)
- * PCB label Kaken, PT-317B
- * Hitachi HD38800A73 MCU
- * cyan/red VFD display Futaba DM-41ZK, with partial color overlay + bezel
-
- Kaken was a subsidiary of Bandai. The original Japanese release is unknown,
- was it canceled and only released in the USA?
-
- known releases:
- - Japan: ?
- - USA: Star Hawk, published by Mattel
-
-***************************************************************************/
-
-class msthawk_state : public hh_hmcs40_state
-{
-public:
- msthawk_state(const machine_config &mconfig, device_type type, const char *tag)
- : hh_hmcs40_state(mconfig, type, tag)
- { }
-
- void prepare_display();
- DECLARE_WRITE8_MEMBER(plate_w);
- DECLARE_WRITE16_MEMBER(grid_w);
-
- void update_int0();
- DECLARE_INPUT_CHANGED_MEMBER(input_changed);
- void msthawk(machine_config &config);
-};
-
-// handlers
-
-void msthawk_state::prepare_display()
-{
- u16 grid = bitswap<16>(m_grid,15,14,13,12,11,10,0,1,2,3,4,5,6,7,8,9);
- u32 plate = bitswap<24>(m_plate,23,22,21,19,20,18,17,16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0);
- display_matrix(21, 10, plate, grid);
-}
-
-WRITE8_MEMBER(msthawk_state::plate_w)
-{
- // R0x-R3x: vfd plate
- int shift = offset * 4;
- m_plate = (m_plate & ~(0xf << shift)) | (data << shift);
- prepare_display();
-}
-
-WRITE16_MEMBER(msthawk_state::grid_w)
-{
- // D5: speaker out
- m_speaker->level_w(data >> 5 & 1);
-
- // D10-D15: input mux
- u8 inp_mux = data >> 10 & 0x3f;
- if (inp_mux != m_inp_mux)
- {
- m_inp_mux = inp_mux;
- update_int0();
- }
-
- // D6-D15: vfd grid
- m_grid = data >> 6 & 0x3ff;
-
- // D0-D4: more plates
- m_plate = (m_plate & 0x00ffff) | (data << 16 & 0x1f0000);
- prepare_display();
-}
-
-void msthawk_state::update_int0()
-{
- // INT0 on multiplexed inputs
- set_interrupt(0, read_inputs(6));
-}
-
-// config
-
-static INPUT_PORTS_START( msthawk )
- PORT_START("IN.0") // D10 INT0
- PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_MEMBER(DEVICE_SELF, msthawk_state, input_changed, nullptr) PORT_NAME("Score")
-
- PORT_START("IN.1") // D11 INT0
- PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_CHANGED_MEMBER(DEVICE_SELF, msthawk_state, input_changed, nullptr) PORT_NAME("Land")
-
- PORT_START("IN.2") // D12 INT0
- PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_MEMBER(DEVICE_SELF, msthawk_state, input_changed, nullptr)
-
- PORT_START("IN.3") // D13 INT0
- PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_MEMBER(DEVICE_SELF, msthawk_state, input_changed, nullptr)
-
- PORT_START("IN.4") // D14 INT0
- PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_MEMBER(DEVICE_SELF, msthawk_state, input_changed, nullptr)
-
- PORT_START("IN.5") // D15 INT0
- PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_MEMBER(DEVICE_SELF, msthawk_state, input_changed, nullptr)
-
- PORT_START("IN.6") // INT1
- PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_hmcs40_state, single_interrupt_line, (void *)1) PORT_NAME("Fire")
-INPUT_PORTS_END
-
-INPUT_CHANGED_MEMBER(msthawk_state::input_changed)
-{
- update_int0();
-}
-
-void msthawk_state::msthawk(machine_config &config)
-{
- /* basic machine hardware */
- HD38800(config, m_maincpu, 400000); // approximation
- m_maincpu->write_r<0>().set(FUNC(msthawk_state::plate_w));
- m_maincpu->write_r<1>().set(FUNC(msthawk_state::plate_w));
- m_maincpu->write_r<2>().set(FUNC(msthawk_state::plate_w));
- m_maincpu->write_r<3>().set(FUNC(msthawk_state::plate_w));
- m_maincpu->write_d().set(FUNC(msthawk_state::grid_w));
-
- /* video hardware */
- screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_SVG));
- screen.set_svg_region("svg");
- screen.set_refresh_hz(50);
- screen.set_size(1920, 696);
- screen.set_visarea(0, 1920-1, 0, 696-1);
- TIMER(config, "display_decay").configure_periodic(FUNC(hh_hmcs40_state::display_decay_tick), attotime::from_msec(1));
-
- /* sound hardware */
- SPEAKER(config, "mono").front_center();
- SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25);
-}
+ ROM_REGION( 224386, "svg", 0)
+ ROM_LOAD( "packmon.svg", 0, 224386, CRC(b2ee5b6b) SHA1(e53b4d5a4118cc5fbec4656580c2aab76af8f8d7) )
+ROM_END
@@ -966,15 +885,15 @@ void msthawk_state::msthawk(machine_config &config)
class bzaxxon_state : public hh_hmcs40_state
{
public:
- bzaxxon_state(const machine_config &mconfig, device_type type, const char *tag)
- : hh_hmcs40_state(mconfig, type, tag)
+ bzaxxon_state(const machine_config &mconfig, device_type type, const char *tag) :
+ hh_hmcs40_state(mconfig, type, tag)
{ }
DECLARE_WRITE8_MEMBER(plate_w);
DECLARE_WRITE16_MEMBER(grid_w);
void update_int1();
- DECLARE_INPUT_CHANGED_MEMBER(input_changed);
+ DECLARE_INPUT_CHANGED_MEMBER(input_changed) { update_int1(); }
void bzaxxon(machine_config &config);
};
@@ -1034,18 +953,13 @@ static INPUT_PORTS_START( bzaxxon )
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_MEMBER(DEVICE_SELF, bzaxxon_state, input_changed, nullptr)
PORT_START("IN.4") // INT0
- PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_hmcs40_state, single_interrupt_line, (void *)0)
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_hmcs40_state, single_interrupt_line, 0)
PORT_START("IN.5") // port D
PORT_BIT( 0x0008, IP_ACTIVE_HIGH, IPT_SELECT )
PORT_BIT( 0xfff7, IP_ACTIVE_HIGH, IPT_UNUSED )
INPUT_PORTS_END
-INPUT_CHANGED_MEMBER(bzaxxon_state::input_changed)
-{
- update_int1();
-}
-
void bzaxxon_state::bzaxxon(machine_config &config)
{
/* basic machine hardware */
@@ -1062,7 +976,8 @@ void bzaxxon_state::bzaxxon(machine_config &config)
screen.set_svg_region("svg");
screen.set_refresh_hz(50);
screen.set_size(613, 1080);
- screen.set_visarea(0, 613-1, 0, 1080-1);
+ screen.set_visarea_full();
+
TIMER(config, "display_decay").configure_periodic(FUNC(hh_hmcs40_state::display_decay_tick), attotime::from_msec(1));
/* sound hardware */
@@ -1070,6 +985,17 @@ void bzaxxon_state::bzaxxon(machine_config &config)
SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25);
}
+// roms
+
+ROM_START( bzaxxon )
+ ROM_REGION( 0x2000, "maincpu", ROMREGION_ERASE00 )
+ ROM_LOAD( "hd38800b19", 0x0000, 0x1000, CRC(4fecb80d) SHA1(7adf079480ffd3825ad5ae1eaa4d892eecbcc42d) )
+ ROM_CONTINUE( 0x1e80, 0x0100 )
+
+ ROM_REGION( 521080, "svg", 0)
+ ROM_LOAD( "bzaxxon.svg", 0, 521080, BAD_DUMP CRC(f4fbb2de) SHA1(83db400e67d91ae4bfee3e8568ae9df94ebede19) )
+ROM_END
+
@@ -1085,15 +1011,15 @@ void bzaxxon_state::bzaxxon(machine_config &config)
class zackman_state : public hh_hmcs40_state
{
public:
- zackman_state(const machine_config &mconfig, device_type type, const char *tag)
- : hh_hmcs40_state(mconfig, type, tag)
+ zackman_state(const machine_config &mconfig, device_type type, const char *tag) :
+ hh_hmcs40_state(mconfig, type, tag)
{ }
DECLARE_WRITE8_MEMBER(plate_w);
DECLARE_WRITE16_MEMBER(grid_w);
void update_int0();
- DECLARE_INPUT_CHANGED_MEMBER(input_changed);
+ DECLARE_INPUT_CHANGED_MEMBER(input_changed) { update_int0(); }
void zackman(machine_config &config);
};
@@ -1153,14 +1079,9 @@ static INPUT_PORTS_START( zackman )
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_MEMBER(DEVICE_SELF, zackman_state, input_changed, nullptr)
PORT_START("IN.4") // INT1
- PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_hmcs40_state, single_interrupt_line, (void *)1)
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_hmcs40_state, single_interrupt_line, 1)
INPUT_PORTS_END
-INPUT_CHANGED_MEMBER(zackman_state::input_changed)
-{
- update_int0();
-}
-
void zackman_state::zackman(machine_config &config)
{
/* basic machine hardware */
@@ -1179,7 +1100,8 @@ void zackman_state::zackman(machine_config &config)
screen.set_svg_region("svg");
screen.set_refresh_hz(50);
screen.set_size(487, 1080);
- screen.set_visarea(0, 487-1, 0, 1080-1);
+ screen.set_visarea_full();
+
TIMER(config, "display_decay").configure_periodic(FUNC(hh_hmcs40_state::display_decay_tick), attotime::from_msec(1));
/* sound hardware */
@@ -1187,6 +1109,17 @@ void zackman_state::zackman(machine_config &config)
SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25);
}
+// roms
+
+ROM_START( zackman )
+ ROM_REGION( 0x2000, "maincpu", ROMREGION_ERASE00 )
+ ROM_LOAD( "hd38820a49", 0x0000, 0x1000, CRC(b97f5ef6) SHA1(7fe20e8107361caf9ea657e504be1f8b10b8b03f) )
+ ROM_CONTINUE( 0x1e80, 0x0100 )
+
+ ROM_REGION( 910689, "svg", 0)
+ ROM_LOAD( "zackman.svg", 0, 910689, CRC(5f322820) SHA1(4210aff160e5de9a409aba8b915aaebff2a92647) )
+ROM_END
+
@@ -1203,8 +1136,8 @@ void zackman_state::zackman(machine_config &config)
class bpengo_state : public hh_hmcs40_state
{
public:
- bpengo_state(const machine_config &mconfig, device_type type, const char *tag)
- : hh_hmcs40_state(mconfig, type, tag)
+ bpengo_state(const machine_config &mconfig, device_type type, const char *tag) :
+ hh_hmcs40_state(mconfig, type, tag)
{ }
void prepare_display();
@@ -1212,7 +1145,7 @@ public:
DECLARE_WRITE16_MEMBER(grid_w);
void update_int0();
- DECLARE_INPUT_CHANGED_MEMBER(input_changed);
+ DECLARE_INPUT_CHANGED_MEMBER(input_changed) { update_int0(); }
void bpengo(machine_config &config);
};
@@ -1273,7 +1206,7 @@ static INPUT_PORTS_START( bpengo )
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_MEMBER(DEVICE_SELF, bpengo_state, input_changed, nullptr)
PORT_START("IN.4") // INT1
- PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_hmcs40_state, single_interrupt_line, (void *)1)
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_hmcs40_state, single_interrupt_line, 1)
PORT_START("IN.5") // port D
PORT_CONFNAME( 0x0800, 0x0000, "Factory Test" )
@@ -1282,11 +1215,6 @@ static INPUT_PORTS_START( bpengo )
PORT_BIT( 0xf7ff, IP_ACTIVE_HIGH, IPT_UNUSED )
INPUT_PORTS_END
-INPUT_CHANGED_MEMBER(bpengo_state::input_changed)
-{
- update_int0();
-}
-
void bpengo_state::bpengo(machine_config &config)
{
/* basic machine hardware */
@@ -1306,7 +1234,8 @@ void bpengo_state::bpengo(machine_config &config)
screen.set_svg_region("svg");
screen.set_refresh_hz(50);
screen.set_size(1920, 759);
- screen.set_visarea(0, 1920-1, 0, 759-1);
+ screen.set_visarea_full();
+
TIMER(config, "display_decay").configure_periodic(FUNC(hh_hmcs40_state::display_decay_tick), attotime::from_msec(1));
/* sound hardware */
@@ -1314,6 +1243,17 @@ void bpengo_state::bpengo(machine_config &config)
SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25);
}
+// roms
+
+ROM_START( bpengo )
+ ROM_REGION( 0x2000, "maincpu", ROMREGION_ERASE00 )
+ ROM_LOAD( "hd38820a63", 0x0000, 0x1000, CRC(ebd6bc64) SHA1(0a322c47b9553a2739a85908ce64b9650cf93d49) )
+ ROM_CONTINUE( 0x1e80, 0x0100 )
+
+ ROM_REGION( 744461, "svg", 0)
+ ROM_LOAD( "bpengo.svg", 0, 744461, BAD_DUMP CRC(2b9abaa5) SHA1(c70a6ac1fa757fdd3ababfe6e00573ef1410c1eb) )
+ROM_END
+
@@ -1330,8 +1270,8 @@ void bpengo_state::bpengo(machine_config &config)
class bbtime_state : public hh_hmcs40_state
{
public:
- bbtime_state(const machine_config &mconfig, device_type type, const char *tag)
- : hh_hmcs40_state(mconfig, type, tag)
+ bbtime_state(const machine_config &mconfig, device_type type, const char *tag) :
+ hh_hmcs40_state(mconfig, type, tag)
{ }
void prepare_display();
@@ -1339,7 +1279,7 @@ public:
DECLARE_WRITE16_MEMBER(grid_w);
void update_int0();
- DECLARE_INPUT_CHANGED_MEMBER(input_changed);
+ DECLARE_INPUT_CHANGED_MEMBER(input_changed) { update_int0(); }
void bbtime(machine_config &config);
};
@@ -1403,14 +1343,9 @@ static INPUT_PORTS_START( bbtime )
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_CHANGED_MEMBER(DEVICE_SELF, bbtime_state, input_changed, nullptr)
PORT_START("IN.5") // INT1
- PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_hmcs40_state, single_interrupt_line, (void *)1)
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_hmcs40_state, single_interrupt_line, 1)
INPUT_PORTS_END
-INPUT_CHANGED_MEMBER(bbtime_state::input_changed)
-{
- update_int0();
-}
-
void bbtime_state::bbtime(machine_config &config)
{
/* basic machine hardware */
@@ -1429,7 +1364,8 @@ void bbtime_state::bbtime(machine_config &config)
screen.set_svg_region("svg");
screen.set_refresh_hz(50);
screen.set_size(379, 1080);
- screen.set_visarea(0, 379-1, 0, 1080-1);
+ screen.set_visarea_full();
+
TIMER(config, "display_decay").configure_periodic(FUNC(hh_hmcs40_state::display_decay_tick), attotime::from_msec(1));
/* sound hardware */
@@ -1437,6 +1373,17 @@ void bbtime_state::bbtime(machine_config &config)
SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25);
}
+// roms
+
+ROM_START( bbtime )
+ ROM_REGION( 0x2000, "maincpu", ROMREGION_ERASE00 )
+ ROM_LOAD( "hd38820a65", 0x0000, 0x1000, CRC(33611faf) SHA1(29b6a30ed543688d31ec2aa18f7938fa4eef30b0) )
+ ROM_CONTINUE( 0x1e80, 0x0100 )
+
+ ROM_REGION( 461605, "svg", 0)
+ ROM_LOAD( "bbtime.svg", 0, 461605, BAD_DUMP CRC(5b335271) SHA1(46c45b711358e8397ae707668aecead9e341ab8a) )
+ROM_END
+
@@ -1453,8 +1400,8 @@ void bbtime_state::bbtime(machine_config &config)
class bdoramon_state : public hh_hmcs40_state
{
public:
- bdoramon_state(const machine_config &mconfig, device_type type, const char *tag)
- : hh_hmcs40_state(mconfig, type, tag)
+ bdoramon_state(const machine_config &mconfig, device_type type, const char *tag) :
+ hh_hmcs40_state(mconfig, type, tag)
{ }
DECLARE_WRITE8_MEMBER(plate_w);
@@ -1492,10 +1439,10 @@ WRITE16_MEMBER(bdoramon_state::grid_w)
static INPUT_PORTS_START( bdoramon )
PORT_START("IN.0") // INT0
- PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_hmcs40_state, single_interrupt_line, (void *)0)
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_hmcs40_state, single_interrupt_line, 0)
PORT_START("IN.1") // INT1
- PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_hmcs40_state, single_interrupt_line, (void *)1)
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_hmcs40_state, single_interrupt_line, 1)
PORT_START("IN.2") // port D
PORT_BIT( 0x0010, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP )
@@ -1527,7 +1474,8 @@ void bdoramon_state::bdoramon(machine_config &config)
screen.set_svg_region("svg");
screen.set_refresh_hz(50);
screen.set_size(1920, 668);
- screen.set_visarea(0, 1920-1, 0, 668-1);
+ screen.set_visarea_full();
+
TIMER(config, "display_decay").configure_periodic(FUNC(hh_hmcs40_state::display_decay_tick), attotime::from_msec(1));
/* sound hardware */
@@ -1535,6 +1483,17 @@ void bdoramon_state::bdoramon(machine_config &config)
SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25);
}
+// roms
+
+ROM_START( bdoramon )
+ ROM_REGION( 0x2000, "maincpu", ROMREGION_ERASE00 )
+ ROM_LOAD( "hd38800b43", 0x0000, 0x1000, CRC(9387ca42) SHA1(8937e208934b34bd9f49700aa50287dfc8bda76c) )
+ ROM_CONTINUE( 0x1e80, 0x0100 )
+
+ ROM_REGION( 624751, "svg", 0)
+ ROM_LOAD( "bdoramon.svg", 0, 624751, CRC(5dc4017c) SHA1(2091765de401969651b8eb22067572be72d12398) )
+ROM_END
+
@@ -1551,8 +1510,8 @@ void bdoramon_state::bdoramon(machine_config &config)
class bultrman_state : public hh_hmcs40_state
{
public:
- bultrman_state(const machine_config &mconfig, device_type type, const char *tag)
- : hh_hmcs40_state(mconfig, type, tag)
+ bultrman_state(const machine_config &mconfig, device_type type, const char *tag) :
+ hh_hmcs40_state(mconfig, type, tag)
{ }
DECLARE_WRITE8_MEMBER(plate_w);
@@ -1591,7 +1550,7 @@ WRITE16_MEMBER(bultrman_state::grid_w)
static INPUT_PORTS_START( bultrman )
PORT_START("IN.0") // INT0
- PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_hmcs40_state, single_interrupt_line, (void *)0)
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_hmcs40_state, single_interrupt_line, 0)
PORT_START("IN.1") // port D
PORT_CONFNAME( 0x0010, 0x0000, "Factory Test" )
@@ -1618,7 +1577,8 @@ void bultrman_state::bultrman(machine_config &config)
screen.set_svg_region("svg");
screen.set_refresh_hz(50);
screen.set_size(1920, 673);
- screen.set_visarea(0, 1920-1, 0, 673-1);
+ screen.set_visarea_full();
+
TIMER(config, "display_decay").configure_periodic(FUNC(hh_hmcs40_state::display_decay_tick), attotime::from_msec(1));
/* sound hardware */
@@ -1626,6 +1586,17 @@ void bultrman_state::bultrman(machine_config &config)
SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25);
}
+// roms
+
+ROM_START( bultrman )
+ ROM_REGION( 0x2000, "maincpu", ROMREGION_ERASE00 )
+ ROM_LOAD( "hd38800b52", 0x0000, 0x1000, CRC(88d372dc) SHA1(f2ac3b89be8afe6fb65914ccebe1a56316b9472a) )
+ ROM_CONTINUE( 0x1e80, 0x0100 )
+
+ ROM_REGION( 405717, "svg", 0)
+ ROM_LOAD( "bultrman.svg", 0, 405717, CRC(13367971) SHA1(f294898712d1e146ff267bb1e3cfd059f972b248) )
+ROM_END
+
@@ -1642,8 +1613,8 @@ void bultrman_state::bultrman(machine_config &config)
class machiman_state : public hh_hmcs40_state
{
public:
- machiman_state(const machine_config &mconfig, device_type type, const char *tag)
- : hh_hmcs40_state(mconfig, type, tag)
+ machiman_state(const machine_config &mconfig, device_type type, const char *tag) :
+ hh_hmcs40_state(mconfig, type, tag)
{ }
void prepare_display();
@@ -1682,7 +1653,7 @@ WRITE16_MEMBER(machiman_state::grid_w)
static INPUT_PORTS_START( machiman )
PORT_START("IN.0") // INT0
- PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_hmcs40_state, single_interrupt_line, (void *)0)
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_hmcs40_state, single_interrupt_line, 0)
PORT_START("IN.1") // port D
PORT_BIT( 0x3fff, IP_ACTIVE_HIGH, IPT_UNUSED )
@@ -1707,7 +1678,8 @@ void machiman_state::machiman(machine_config &config)
screen.set_svg_region("svg");
screen.set_refresh_hz(50);
screen.set_size(1534, 1080);
- screen.set_visarea(0, 1534-1, 0, 1080-1);
+ screen.set_visarea_full();
+
TIMER(config, "display_decay").configure_periodic(FUNC(hh_hmcs40_state::display_decay_tick), attotime::from_msec(1));
/* sound hardware */
@@ -1715,6 +1687,17 @@ void machiman_state::machiman(machine_config &config)
SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25);
}
+// roms
+
+ROM_START( machiman )
+ ROM_REGION( 0x2000, "maincpu", ROMREGION_ERASE00 )
+ ROM_LOAD( "hd38820a85", 0x0000, 0x1000, CRC(894b4954) SHA1(cab49638a326b031aa548301beb16f818759ef62) )
+ ROM_CONTINUE( 0x1e80, 0x0100 )
+
+ ROM_REGION( 374097, "svg", 0)
+ ROM_LOAD( "machiman.svg", 0, 374097, CRC(78af02ac) SHA1(1b4bbea3e46e1bf33149727d9725bc9b18652b9c) )
+ROM_END
+
@@ -1736,8 +1719,8 @@ void machiman_state::machiman(machine_config &config)
class pairmtch_state : public hh_hmcs40_state
{
public:
- pairmtch_state(const machine_config &mconfig, device_type type, const char *tag)
- : hh_hmcs40_state(mconfig, type, tag),
+ pairmtch_state(const machine_config &mconfig, device_type type, const char *tag) :
+ hh_hmcs40_state(mconfig, type, tag),
m_audiocpu(*this, "audiocpu"),
m_soundlatch(*this, "soundlatch%u", 0)
{ }
@@ -1793,7 +1776,6 @@ WRITE8_MEMBER(pairmtch_state::sound_w)
m_soundlatch[0]->write(space, 0, bitswap<8>(data,7,6,5,4,0,1,2,3));
}
-
// handlers: audiocpu side
WRITE8_MEMBER(pairmtch_state::sound2_w)
@@ -1873,6 +1855,18 @@ void pairmtch_state::pairmtch(machine_config &config)
GENERIC_LATCH_8(config, m_soundlatch[1]);
}
+// roms
+
+ROM_START( pairmtch )
+ ROM_REGION( 0x2000, "maincpu", ROMREGION_ERASE00 )
+ ROM_LOAD( "hd38820a88", 0x0000, 0x1000, CRC(ffa35730) SHA1(5a80b9025aaad2ac0ab0b1436a1355ae8cd3f868) )
+ ROM_CONTINUE( 0x1e80, 0x0100 )
+
+ ROM_REGION( 0x2000, "audiocpu", ROMREGION_ERASE00 )
+ ROM_LOAD( "hd38820a89", 0x0000, 0x1000, CRC(3533ec56) SHA1(556d69e78a0ee1bf766fce16ed58992d7272d57f) )
+ ROM_CONTINUE( 0x1e80, 0x0100 )
+ROM_END
+
@@ -1891,8 +1885,8 @@ void pairmtch_state::pairmtch(machine_config &config)
class alnattck_state : public hh_hmcs40_state
{
public:
- alnattck_state(const machine_config &mconfig, device_type type, const char *tag)
- : hh_hmcs40_state(mconfig, type, tag)
+ alnattck_state(const machine_config &mconfig, device_type type, const char *tag) :
+ hh_hmcs40_state(mconfig, type, tag)
{ }
DECLARE_WRITE8_MEMBER(plate_w);
@@ -1978,7 +1972,8 @@ void alnattck_state::alnattck(machine_config &config)
screen.set_svg_region("svg");
screen.set_refresh_hz(50);
screen.set_size(1920, 700);
- screen.set_visarea(0, 1920-1, 0, 700-1);
+ screen.set_visarea_full();
+
TIMER(config, "display_decay").configure_periodic(FUNC(hh_hmcs40_state::display_decay_tick), attotime::from_msec(1));
/* sound hardware */
@@ -1986,6 +1981,17 @@ void alnattck_state::alnattck(machine_config &config)
SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25);
}
+// roms
+
+ROM_START( alnattck )
+ ROM_REGION( 0x2000, "maincpu", ROMREGION_ERASE00 )
+ ROM_LOAD( "hd38800a25", 0x0000, 0x1000, CRC(18b50869) SHA1(11e9d5f7b4ae818b077b0ee14a3b43190e20bff3) )
+ ROM_CONTINUE( 0x1e80, 0x0100 )
+
+ ROM_REGION( 564271, "svg", 0)
+ ROM_LOAD( "alnattck.svg", 0, 564271, CRC(5466d1d4) SHA1(3295272015969e58fddc53272769e1fc1bd4b355) )
+ROM_END
+
@@ -2003,15 +2009,15 @@ void alnattck_state::alnattck(machine_config &config)
class cdkong_state : public hh_hmcs40_state
{
public:
- cdkong_state(const machine_config &mconfig, device_type type, const char *tag)
- : hh_hmcs40_state(mconfig, type, tag)
+ cdkong_state(const machine_config &mconfig, device_type type, const char *tag) :
+ hh_hmcs40_state(mconfig, type, tag)
{ }
void prepare_display();
DECLARE_WRITE8_MEMBER(plate_w);
DECLARE_WRITE16_MEMBER(grid_w);
- void speaker_decay_reset();
+ void speaker_update();
TIMER_DEVICE_CALLBACK_MEMBER(speaker_decay_sim);
double m_speaker_volume;
void cdkong(machine_config &config);
@@ -2020,21 +2026,31 @@ protected:
virtual void machine_start() override;
};
+void cdkong_state::machine_start()
+{
+ hh_hmcs40_state::machine_start();
+
+ // zerofill/init
+ m_speaker_volume = 0;
+ save_item(NAME(m_speaker_volume));
+}
+
// handlers
-void cdkong_state::speaker_decay_reset()
+void cdkong_state::speaker_update()
{
if (m_r[1] & 8)
m_speaker_volume = 1.0;
- m_speaker->set_output_gain(0, m_speaker_volume);
+ int level = (m_d & 8) ? 0x7fff : 0;
+ m_speaker->level_w(level * m_speaker_volume);
}
TIMER_DEVICE_CALLBACK_MEMBER(cdkong_state::speaker_decay_sim)
{
// volume decays when speaker is off (divisor and timer period determine duration)
- speaker_decay_reset();
- m_speaker_volume /= 1.015;
+ speaker_update();
+ m_speaker_volume /= 1.02;
}
void cdkong_state::prepare_display()
@@ -2047,7 +2063,7 @@ WRITE8_MEMBER(cdkong_state::plate_w)
{
// R13: speaker on
m_r[offset] = data;
- speaker_decay_reset();
+ speaker_update();
// R0x-R6x: vfd plate
int shift = offset * 4;
@@ -2058,7 +2074,8 @@ WRITE8_MEMBER(cdkong_state::plate_w)
WRITE16_MEMBER(cdkong_state::grid_w)
{
// D3: speaker out
- m_speaker->level_w(data >> 3 & 1);
+ m_d = data;
+ speaker_update();
// D4-D14: vfd grid
m_grid = data >> 4 & 0x7ff;
@@ -2069,7 +2086,7 @@ WRITE16_MEMBER(cdkong_state::grid_w)
static INPUT_PORTS_START( cdkong )
PORT_START("IN.0") // INT0
- PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_hmcs40_state, single_interrupt_line, (void *)0)
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_hmcs40_state, single_interrupt_line, 0)
PORT_START("IN.1") // port D
PORT_BIT( 0x0001, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP )
@@ -2079,14 +2096,7 @@ static INPUT_PORTS_START( cdkong )
PORT_BIT( 0x7ff8, IP_ACTIVE_HIGH, IPT_UNUSED )
INPUT_PORTS_END
-void cdkong_state::machine_start()
-{
- hh_hmcs40_state::machine_start();
-
- // zerofill/init
- m_speaker_volume = 0;
- save_item(NAME(m_speaker_volume));
-}
+static s16 cdkong_speaker_levels[0x8000];
void cdkong_state::cdkong(machine_config &config)
{
@@ -2107,15 +2117,33 @@ void cdkong_state::cdkong(machine_config &config)
screen.set_svg_region("svg");
screen.set_refresh_hz(50);
screen.set_size(605, 1080);
- screen.set_visarea(0, 605-1, 0, 1080-1);
+ screen.set_visarea_full();
+
TIMER(config, "display_decay").configure_periodic(FUNC(hh_hmcs40_state::display_decay_tick), attotime::from_msec(1));
/* sound hardware */
SPEAKER(config, "mono").front_center();
SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25);
+
TIMER(config, "speaker_decay").configure_periodic(FUNC(cdkong_state::speaker_decay_sim), attotime::from_msec(1));
+
+ // set volume levels (set_output_gain is too slow for sub-frame intervals)
+ for (int i = 0; i < 0x8000; i++)
+ cdkong_speaker_levels[i] = i;
+ m_speaker->set_levels(0x8000, cdkong_speaker_levels);
}
+// roms
+
+ROM_START( cdkong )
+ ROM_REGION( 0x2000, "maincpu", ROMREGION_ERASE00 )
+ ROM_LOAD( "hd38820a45", 0x0000, 0x1000, CRC(196b8070) SHA1(da85d1eb4b048b77f3168630662ab94ec9baa262) )
+ ROM_CONTINUE( 0x1e80, 0x0100 )
+
+ ROM_REGION( 359199, "svg", 0)
+ ROM_LOAD( "cdkong.svg", 0, 359199, CRC(ba159fd5) SHA1(3188e2ed3234f39ac9ee93a485a7e73314bc3457) )
+ROM_END
+
@@ -2139,8 +2167,8 @@ void cdkong_state::cdkong(machine_config &config)
class cgalaxn_state : public hh_hmcs40_state
{
public:
- cgalaxn_state(const machine_config &mconfig, device_type type, const char *tag)
- : hh_hmcs40_state(mconfig, type, tag)
+ cgalaxn_state(const machine_config &mconfig, device_type type, const char *tag) :
+ hh_hmcs40_state(mconfig, type, tag)
{ }
void prepare_display();
@@ -2161,6 +2189,13 @@ void cgalaxn_state::prepare_display()
display_matrix(15, 12, plate, grid);
}
+INPUT_CHANGED_MEMBER(cgalaxn_state::player_switch)
+{
+ // 2-player switch directly enables plate 14
+ m_plate = (m_plate & 0x3fff) | (newval ? 0 : 0x4000);
+ prepare_display();
+}
+
WRITE8_MEMBER(cgalaxn_state::grid_w)
{
// R10,R11: input mux
@@ -2207,19 +2242,12 @@ static INPUT_PORTS_START( cgalaxn )
PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED )
PORT_START("IN.2") // INT0
- PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_hmcs40_state, single_interrupt_line, (void *)0)
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_hmcs40_state, single_interrupt_line, 0)
PORT_START("IN.3") // INT1
- PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_PLAYER(2) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_hmcs40_state, single_interrupt_line, (void *)1)
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_PLAYER(2) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_hmcs40_state, single_interrupt_line, 1)
INPUT_PORTS_END
-INPUT_CHANGED_MEMBER(cgalaxn_state::player_switch)
-{
- // 2-player switch directly enables plate 14
- m_plate = (m_plate & 0x3fff) | (newval ? 0 : 0x4000);
- prepare_display();
-}
-
void cgalaxn_state::cgalaxn(machine_config &config)
{
/* basic machine hardware */
@@ -2235,7 +2263,8 @@ void cgalaxn_state::cgalaxn(machine_config &config)
screen.set_svg_region("svg");
screen.set_refresh_hz(50);
screen.set_size(526, 1080);
- screen.set_visarea(0, 526-1, 0, 1080-1);
+ screen.set_visarea_full();
+
TIMER(config, "display_decay").configure_periodic(FUNC(hh_hmcs40_state::display_decay_tick), attotime::from_msec(1));
/* sound hardware */
@@ -2243,6 +2272,17 @@ void cgalaxn_state::cgalaxn(machine_config &config)
SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25);
}
+// roms
+
+ROM_START( cgalaxn )
+ ROM_REGION( 0x2000, "maincpu", ROMREGION_ERASE00 )
+ ROM_LOAD( "hd38800a70", 0x0000, 0x1000, CRC(a4c5ed1d) SHA1(0f647cb78437d7e62411febf7c9ce3c5b6753a80) )
+ ROM_CONTINUE( 0x1e80, 0x0100 )
+
+ ROM_REGION( 712204, "svg", 0)
+ ROM_LOAD( "cgalaxn.svg", 0, 712204, CRC(67ec57bf) SHA1(195c9867b321da9768ce287d1060ceae50345dd4) )
+ROM_END
+
@@ -2271,8 +2311,8 @@ void cgalaxn_state::cgalaxn(machine_config &config)
class cpacman_state : public hh_hmcs40_state
{
public:
- cpacman_state(const machine_config &mconfig, device_type type, const char *tag)
- : hh_hmcs40_state(mconfig, type, tag)
+ cpacman_state(const machine_config &mconfig, device_type type, const char *tag) :
+ hh_hmcs40_state(mconfig, type, tag)
{ }
DECLARE_WRITE8_MEMBER(plate_w);
@@ -2356,7 +2396,8 @@ void cpacman_state::cpacman(machine_config &config)
screen.set_svg_region("svg");
screen.set_refresh_hz(50);
screen.set_size(484, 1080);
- screen.set_visarea(0, 484-1, 0, 1080-1);
+ screen.set_visarea_full();
+
TIMER(config, "display_decay").configure_periodic(FUNC(hh_hmcs40_state::display_decay_tick), attotime::from_msec(1));
/* sound hardware */
@@ -2364,6 +2405,26 @@ void cpacman_state::cpacman(machine_config &config)
SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25);
}
+// roms
+
+ROM_START( cpacman )
+ ROM_REGION( 0x2000, "maincpu", ROMREGION_ERASE00 )
+ ROM_LOAD( "hd38820a29", 0x0000, 0x1000, CRC(1082d577) SHA1(0ef73132bd41f6ca1e4c001ae19f7f7c97eaa8d1) )
+ ROM_CONTINUE( 0x1e80, 0x0100 )
+
+ ROM_REGION( 359765, "svg", 0)
+ ROM_LOAD( "cpacman.svg", 0, 359765, CRC(e3810a46) SHA1(d0994edd71a6adc8f238c71e360a8606ce397a14) )
+ROM_END
+
+ROM_START( cpacmanr1 )
+ ROM_REGION( 0x2000, "maincpu", ROMREGION_ERASE00 )
+ ROM_LOAD( "hd38820a28", 0x0000, 0x1000, CRC(d2ed57e5) SHA1(f56f1341485ac28ea9e6cc4d162fab18d8a4c977) )
+ ROM_CONTINUE( 0x1e80, 0x0100 )
+
+ ROM_REGION( 359765, "svg", 0)
+ ROM_LOAD( "cpacman.svg", 0, 359765, CRC(e3810a46) SHA1(d0994edd71a6adc8f238c71e360a8606ce397a14) )
+ROM_END
+
@@ -2387,8 +2448,8 @@ void cpacman_state::cpacman(machine_config &config)
class cmspacmn_state : public hh_hmcs40_state
{
public:
- cmspacmn_state(const machine_config &mconfig, device_type type, const char *tag)
- : hh_hmcs40_state(mconfig, type, tag)
+ cmspacmn_state(const machine_config &mconfig, device_type type, const char *tag) :
+ hh_hmcs40_state(mconfig, type, tag)
{ }
DECLARE_WRITE8_MEMBER(plate_w);
@@ -2472,7 +2533,8 @@ void cmspacmn_state::cmspacmn(machine_config &config)
screen.set_svg_region("svg");
screen.set_refresh_hz(50);
screen.set_size(481, 1080);
- screen.set_visarea(0, 481-1, 0, 1080-1);
+ screen.set_visarea_full();
+
TIMER(config, "display_decay").configure_periodic(FUNC(hh_hmcs40_state::display_decay_tick), attotime::from_msec(1));
/* sound hardware */
@@ -2480,6 +2542,17 @@ void cmspacmn_state::cmspacmn(machine_config &config)
SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25);
}
+// roms
+
+ROM_START( cmspacmn )
+ ROM_REGION( 0x2000, "maincpu", ROMREGION_ERASE00 )
+ ROM_LOAD( "hd38820a61", 0x0000, 0x1000, CRC(76276318) SHA1(9d6ff3f49b4cdaee5c9e238c1ed638bfb9b99aa7) )
+ ROM_CONTINUE( 0x1e80, 0x0100 )
+
+ ROM_REGION( 849327, "svg", 0)
+ ROM_LOAD( "cmspacmn.svg", 0, 849327, CRC(4110ad07) SHA1(76113a2ce0fb1c6dab4e26fd59a13dc89d950d75) )
+ROM_END
+
@@ -2500,8 +2573,8 @@ void cmspacmn_state::cmspacmn(machine_config &config)
class sag_state : public hh_hmcs40_state
{
public:
- sag_state(const machine_config &mconfig, device_type type, const char *tag)
- : hh_hmcs40_state(mconfig, type, tag)
+ sag_state(const machine_config &mconfig, device_type type, const char *tag) :
+ hh_hmcs40_state(mconfig, type, tag)
{ }
void prepare_display();
@@ -2619,6 +2692,26 @@ void sag_state::sag(machine_config &config)
SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25);
}
+// roms
+
+ROM_START( sag_si2 )
+ ROM_REGION( 0x2000, "maincpu", ROMREGION_ERASE00 )
+ ROM_LOAD( "inv2_hd38800a31", 0x0000, 0x1000, BAD_DUMP CRC(29c8c100) SHA1(41cd413065659c6d7d5b2408de2ca6d51c49629a) )
+ ROM_CONTINUE( 0x1e80, 0x0100 )
+ROM_END
+
+ROM_START( sag_bb4 )
+ ROM_REGION( 0x2000, "maincpu", ROMREGION_ERASE00 )
+ ROM_LOAD( "b-b5_hd38800a37", 0x0000, 0x1000, CRC(64852bd5) SHA1(fb1c24ca43934ceb6fc35ac7c35b71e6e843dbc5) )
+ ROM_CONTINUE( 0x1e80, 0x0100 )
+ROM_END
+
+ROM_START( sag_pb )
+ ROM_REGION( 0x2000, "maincpu", ROMREGION_ERASE00 )
+ ROM_LOAD( "pinb_hd38800a38", 0x0000, 0x1000, CRC(6e53a56b) SHA1(13f057eab2e4cfbb3ef1247a041abff15ae727c9) )
+ ROM_CONTINUE( 0x1e80, 0x0100 )
+ROM_END
+
@@ -2635,8 +2728,8 @@ void sag_state::sag(machine_config &config)
class egalaxn2_state : public hh_hmcs40_state
{
public:
- egalaxn2_state(const machine_config &mconfig, device_type type, const char *tag)
- : hh_hmcs40_state(mconfig, type, tag)
+ egalaxn2_state(const machine_config &mconfig, device_type type, const char *tag) :
+ hh_hmcs40_state(mconfig, type, tag)
{ }
void prepare_display();
@@ -2732,7 +2825,8 @@ void egalaxn2_state::egalaxn2(machine_config &config)
screen.set_svg_region("svg");
screen.set_refresh_hz(50);
screen.set_size(505, 1080);
- screen.set_visarea(0, 505-1, 0, 1080-1);
+ screen.set_visarea_full();
+
TIMER(config, "display_decay").configure_periodic(FUNC(hh_hmcs40_state::display_decay_tick), attotime::from_msec(1));
/* sound hardware */
@@ -2740,6 +2834,17 @@ void egalaxn2_state::egalaxn2(machine_config &config)
SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25);
}
+// roms
+
+ROM_START( egalaxn2 )
+ ROM_REGION( 0x2000, "maincpu", ROMREGION_ERASE00 )
+ ROM_LOAD( "hd38820a13", 0x0000, 0x1000, CRC(112b721b) SHA1(4a185bc57ea03fe64f61f7db4da37b16eeb0cb54) )
+ ROM_CONTINUE( 0x1e80, 0x0100 )
+
+ ROM_REGION( 507945, "svg", 0)
+ ROM_LOAD( "egalaxn2.svg", 0, 507945, CRC(b72a8721) SHA1(2d90fca6ce962710525b631e5bc8f75d79332b9d) )
+ROM_END
+
@@ -2758,8 +2863,8 @@ void egalaxn2_state::egalaxn2(machine_config &config)
class epacman2_state : public egalaxn2_state
{
public:
- epacman2_state(const machine_config &mconfig, device_type type, const char *tag)
- : egalaxn2_state(mconfig, type, tag)
+ epacman2_state(const machine_config &mconfig, device_type type, const char *tag) :
+ egalaxn2_state(mconfig, type, tag)
{ }
void epacman2(machine_config &config);
@@ -2804,10 +2909,31 @@ void epacman2_state::epacman2(machine_config &config)
egalaxn2(config);
/* video hardware */
- subdevice<screen_device>("screen")->set_size(505, 1080);
- subdevice<screen_device>("screen")->set_visarea(0, 505-1, 0, 1080-1);
+ screen_device *screen = subdevice<screen_device>("screen");
+ screen->set_size(505, 1080);
+ screen->set_visarea_full();
}
+// roms
+
+ROM_START( epacman2 )
+ ROM_REGION( 0x2000, "maincpu", ROMREGION_ERASE00 )
+ ROM_LOAD( "hd38820a23", 0x0000, 0x1000, CRC(6eab640f) SHA1(509bdd02be915089e13769f22a08e03509f03af4) )
+ ROM_CONTINUE( 0x1e80, 0x0100 )
+
+ ROM_REGION( 262480, "svg", 0)
+ ROM_LOAD( "epacman2.svg", 0, 262480, CRC(73bd9671) SHA1(a3ac754c0e060da50b65f3d0f9630d9c3d871650) )
+ROM_END
+
+ROM_START( epacman2r )
+ ROM_REGION( 0x2000, "maincpu", ROMREGION_ERASE00 )
+ ROM_LOAD( "hd38820a23", 0x0000, 0x1000, CRC(6eab640f) SHA1(509bdd02be915089e13769f22a08e03509f03af4) )
+ ROM_CONTINUE( 0x1e80, 0x0100 )
+
+ ROM_REGION( 262483, "svg", 0)
+ ROM_LOAD( "epacman2r.svg", 0, 262483, CRC(279b629a) SHA1(4c499fb143aadf4f6722b994a22a0d0d3c5150b6) )
+ROM_END
+
@@ -2825,8 +2951,8 @@ void epacman2_state::epacman2(machine_config &config)
class eturtles_state : public hh_hmcs40_state
{
public:
- eturtles_state(const machine_config &mconfig, device_type type, const char *tag)
- : hh_hmcs40_state(mconfig, type, tag),
+ eturtles_state(const machine_config &mconfig, device_type type, const char *tag) :
+ hh_hmcs40_state(mconfig, type, tag),
m_audiocpu(*this, "audiocpu"),
m_cop_irq(0)
{ }
@@ -2844,13 +2970,21 @@ public:
DECLARE_READ8_MEMBER(cop_ack_r);
void update_int();
- DECLARE_INPUT_CHANGED_MEMBER(input_changed);
+ DECLARE_INPUT_CHANGED_MEMBER(input_changed) { update_int(); }
void eturtles(machine_config &config);
protected:
virtual void machine_start() override;
};
+void eturtles_state::machine_start()
+{
+ hh_hmcs40_state::machine_start();
+
+ // register for savestates
+ save_item(NAME(m_cop_irq));
+}
+
// handlers: maincpu side
void eturtles_state::prepare_display()
@@ -2895,7 +3029,6 @@ void eturtles_state::update_int()
set_interrupt(1, inp & 2);
}
-
// handlers: COP side
WRITE_LINE_MEMBER(eturtles_state::speaker_w)
@@ -2955,19 +3088,6 @@ static INPUT_PORTS_START( eturtles )
PORT_CONFSETTING( 0x01, "2" )
INPUT_PORTS_END
-INPUT_CHANGED_MEMBER(eturtles_state::input_changed)
-{
- update_int();
-}
-
-void eturtles_state::machine_start()
-{
- hh_hmcs40_state::machine_start();
-
- // register for savestates
- save_item(NAME(m_cop_irq));
-}
-
void eturtles_state::eturtles(machine_config &config)
{
/* basic machine hardware */
@@ -2995,7 +3115,8 @@ void eturtles_state::eturtles(machine_config &config)
screen.set_svg_region("svg");
screen.set_refresh_hz(50);
screen.set_size(484, 1080);
- screen.set_visarea(0, 484-1, 0, 1080-1);
+ screen.set_visarea_full();
+
TIMER(config, "display_decay").configure_periodic(FUNC(hh_hmcs40_state::display_decay_tick), attotime::from_msec(1));
/* sound hardware */
@@ -3003,6 +3124,20 @@ void eturtles_state::eturtles(machine_config &config)
SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25);
}
+// roms
+
+ROM_START( eturtles )
+ ROM_REGION( 0x2000, "maincpu", ROMREGION_ERASE00 )
+ ROM_LOAD( "hd38820a43", 0x0000, 0x1000, CRC(446aa4e2) SHA1(d1c0fb14ea7081def53b1174964b39eed1e5d5e6) )
+ ROM_CONTINUE( 0x1e80, 0x0100 )
+
+ ROM_REGION( 0x0200, "audiocpu", 0 )
+ ROM_LOAD( "cop411l-ked_n", 0x0000, 0x0200, CRC(503d26e9) SHA1(a53d24d62195bfbceff2e4a43199846e0950aef6) )
+
+ ROM_REGION( 1027626, "svg", 0)
+ ROM_LOAD( "eturtles.svg", 0, 1027626, CRC(b4f7abff) SHA1(e9b065a3a3fef3c71495002945724a86c2a68eb4) )
+ROM_END
+
@@ -3020,8 +3155,8 @@ void eturtles_state::eturtles(machine_config &config)
class estargte_state : public eturtles_state
{
public:
- estargte_state(const machine_config &mconfig, device_type type, const char *tag)
- : eturtles_state(mconfig, type, tag)
+ estargte_state(const machine_config &mconfig, device_type type, const char *tag) :
+ eturtles_state(mconfig, type, tag)
{ }
virtual void prepare_display() override;
@@ -3103,7 +3238,8 @@ void estargte_state::estargte(machine_config &config)
screen.set_svg_region("svg");
screen.set_refresh_hz(50);
screen.set_size(1920, 854);
- screen.set_visarea(0, 1920-1, 0, 854-1);
+ screen.set_visarea_full();
+
TIMER(config, "display_decay").configure_periodic(FUNC(hh_hmcs40_state::display_decay_tick), attotime::from_msec(1));
/* sound hardware */
@@ -3111,6 +3247,20 @@ void estargte_state::estargte(machine_config &config)
SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25);
}
+// roms
+
+ROM_START( estargte )
+ ROM_REGION( 0x2000, "maincpu", ROMREGION_ERASE00 )
+ ROM_LOAD( "hd38820a42", 0x0000, 0x1000, CRC(5f6d55a6) SHA1(0da32149790fa5f16097338fc80536b462169e0c) )
+ ROM_CONTINUE( 0x1e80, 0x0100 )
+
+ ROM_REGION( 0x0200, "audiocpu", 0 )
+ ROM_LOAD( "cop411l-kec_n", 0x0000, 0x0200, CRC(fbd3c2d3) SHA1(65b8b24d38678c3fa970bfd639e9449a75a28927) )
+
+ ROM_REGION( 462214, "svg", 0)
+ ROM_LOAD( "estargte.svg", 0, 462214, CRC(282cc090) SHA1(b0f3c21e9a529e5f1e33b90ca25ce3a097fb75a0) )
+ROM_END
+
@@ -3130,8 +3280,8 @@ void estargte_state::estargte(machine_config &config)
class ghalien_state : public hh_hmcs40_state
{
public:
- ghalien_state(const machine_config &mconfig, device_type type, const char *tag)
- : hh_hmcs40_state(mconfig, type, tag)
+ ghalien_state(const machine_config &mconfig, device_type type, const char *tag) :
+ hh_hmcs40_state(mconfig, type, tag)
{ }
DECLARE_WRITE8_MEMBER(plate_w);
@@ -3218,7 +3368,8 @@ void ghalien_state::ghalien(machine_config &config)
screen.set_svg_region("svg");
screen.set_refresh_hz(50);
screen.set_size(1920, 699);
- screen.set_visarea(0, 1920-1, 0, 699-1);
+ screen.set_visarea_full();
+
TIMER(config, "display_decay").configure_periodic(FUNC(hh_hmcs40_state::display_decay_tick), attotime::from_msec(1));
/* sound hardware */
@@ -3226,6 +3377,17 @@ void ghalien_state::ghalien(machine_config &config)
SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25);
}
+// roms
+
+ROM_START( ghalien )
+ ROM_REGION( 0x2000, "maincpu", ROMREGION_ERASE00 )
+ ROM_LOAD( "hd38800a04", 0x0000, 0x1000, CRC(019c3328) SHA1(9f1029c5c479f78350952c4f18747341ba5ea7a0) )
+ ROM_CONTINUE( 0x1e80, 0x0100 )
+
+ ROM_REGION( 462749, "svg", 0)
+ ROM_LOAD( "ghalien.svg", 0, 462749, CRC(1acbb1e8) SHA1(7bdeb840bc9080792e24812eba923bf84f7865a6) )
+ROM_END
+
@@ -3246,15 +3408,15 @@ void ghalien_state::ghalien(machine_config &config)
class gckong_state : public hh_hmcs40_state
{
public:
- gckong_state(const machine_config &mconfig, device_type type, const char *tag)
- : hh_hmcs40_state(mconfig, type, tag)
+ gckong_state(const machine_config &mconfig, device_type type, const char *tag) :
+ hh_hmcs40_state(mconfig, type, tag)
{ }
DECLARE_WRITE8_MEMBER(plate_w);
DECLARE_WRITE16_MEMBER(grid_w);
void update_int1();
- DECLARE_INPUT_CHANGED_MEMBER(input_changed);
+ DECLARE_INPUT_CHANGED_MEMBER(input_changed) { update_int1(); }
void gckong(machine_config &config);
};
@@ -3314,7 +3476,7 @@ static INPUT_PORTS_START( gckong )
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_MEMBER(DEVICE_SELF, gckong_state, input_changed, nullptr)
PORT_START("IN.4") // INT0
- PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_hmcs40_state, single_interrupt_line, (void *)0)
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_hmcs40_state, single_interrupt_line, 0)
PORT_START("IN.5") // port D
PORT_CONFNAME( 0x0010, 0x0000, DEF_STR( Difficulty ) )
@@ -3323,11 +3485,6 @@ static INPUT_PORTS_START( gckong )
PORT_BIT( 0xffef, IP_ACTIVE_HIGH, IPT_UNUSED )
INPUT_PORTS_END
-INPUT_CHANGED_MEMBER(gckong_state::input_changed)
-{
- update_int1();
-}
-
void gckong_state::gckong(machine_config &config)
{
/* basic machine hardware */
@@ -3343,15 +3500,28 @@ void gckong_state::gckong(machine_config &config)
screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_SVG));
screen.set_svg_region("svg");
screen.set_refresh_hz(50);
- screen.set_size(506, 1080);
- screen.set_visarea(0, 506-1, 0, 1080-1);
+ screen.set_size(479, 1080);
+ screen.set_visarea_full();
+
TIMER(config, "display_decay").configure_periodic(FUNC(hh_hmcs40_state::display_decay_tick), attotime::from_msec(1));
+ config.set_default_layout(layout_gckong);
/* sound hardware */
SPEAKER(config, "mono").front_center();
SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25);
}
+// roms
+
+ROM_START( gckong )
+ ROM_REGION( 0x2000, "maincpu", ROMREGION_ERASE00 )
+ ROM_LOAD( "hd38800b01", 0x0000, 0x1000, CRC(d5a2cca3) SHA1(37bb5784383daab672ed1e0e2362c7a40d8d9b3f) )
+ ROM_CONTINUE( 0x1e80, 0x0100 )
+
+ ROM_REGION( 346588, "svg", 0)
+ ROM_LOAD( "gckong.svg", 0, 346588, CRC(317af984) SHA1(ff6323526d1f5e46eccf8fa8d979175895be75de) )
+ROM_END
+
@@ -3368,15 +3538,15 @@ void gckong_state::gckong(machine_config &config)
class gdigdug_state : public hh_hmcs40_state
{
public:
- gdigdug_state(const machine_config &mconfig, device_type type, const char *tag)
- : hh_hmcs40_state(mconfig, type, tag)
+ gdigdug_state(const machine_config &mconfig, device_type type, const char *tag) :
+ hh_hmcs40_state(mconfig, type, tag)
{ }
DECLARE_WRITE8_MEMBER(plate_w);
DECLARE_WRITE16_MEMBER(grid_w);
void update_int1();
- DECLARE_INPUT_CHANGED_MEMBER(input_changed);
+ DECLARE_INPUT_CHANGED_MEMBER(input_changed) { update_int1(); }
void gdigdug(machine_config &config);
};
@@ -3438,14 +3608,9 @@ static INPUT_PORTS_START( gdigdug )
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_MEMBER(DEVICE_SELF, gdigdug_state, input_changed, nullptr)
PORT_START("IN.5") // INT0
- PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_hmcs40_state, single_interrupt_line, (void *)0)
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_hmcs40_state, single_interrupt_line, 0)
INPUT_PORTS_END
-INPUT_CHANGED_MEMBER(gdigdug_state::input_changed)
-{
- update_int1();
-}
-
void gdigdug_state::gdigdug(machine_config &config)
{
/* basic machine hardware */
@@ -3464,7 +3629,8 @@ void gdigdug_state::gdigdug(machine_config &config)
screen.set_svg_region("svg");
screen.set_refresh_hz(50);
screen.set_size(476, 1080);
- screen.set_visarea(0, 476-1, 0, 1080-1);
+ screen.set_visarea_full();
+
TIMER(config, "display_decay").configure_periodic(FUNC(hh_hmcs40_state::display_decay_tick), attotime::from_msec(1));
/* sound hardware */
@@ -3472,6 +3638,17 @@ void gdigdug_state::gdigdug(machine_config &config)
SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25);
}
+// roms
+
+ROM_START( gdigdug )
+ ROM_REGION( 0x2000, "maincpu", ROMREGION_ERASE00 )
+ ROM_LOAD( "hd38820a69", 0x0000, 0x1000, CRC(501165a9) SHA1(8a15d00c4aa66e870cadde33148426463560d2e6) )
+ ROM_CONTINUE( 0x1e80, 0x0100 )
+
+ ROM_REGION( 807990, "svg", 0)
+ ROM_LOAD( "gdigdug.svg", 0, 807990, CRC(a5b8392d) SHA1(3503829bb1a626a9e70115fb60b656dff8908144) )
+ROM_END
+
@@ -3492,8 +3669,8 @@ void gdigdug_state::gdigdug(machine_config &config)
class mwcbaseb_state : public hh_hmcs40_state
{
public:
- mwcbaseb_state(const machine_config &mconfig, device_type type, const char *tag)
- : hh_hmcs40_state(mconfig, type, tag)
+ mwcbaseb_state(const machine_config &mconfig, device_type type, const char *tag) :
+ hh_hmcs40_state(mconfig, type, tag)
{ }
void prepare_display();
@@ -3624,8 +3801,10 @@ void mwcbaseb_state::mwcbaseb(machine_config &config)
screen.set_svg_region("svg");
screen.set_refresh_hz(50);
screen.set_size(1920, 478);
- screen.set_visarea(0, 1920-1, 0, 478-1);
+ screen.set_visarea_full();
+
TIMER(config, "display_decay").configure_periodic(FUNC(hh_hmcs40_state::display_decay_tick), attotime::from_msec(1));
+ config.set_default_layout(layout_mwcbaseb);
/* sound hardware */
SPEAKER(config, "mono").front_center();
@@ -3633,6 +3812,156 @@ void mwcbaseb_state::mwcbaseb(machine_config &config)
m_speaker->set_levels(8, mwcbaseb_speaker_levels);
}
+// roms
+
+ROM_START( mwcbaseb )
+ ROM_REGION( 0x2000, "maincpu", ROMREGION_ERASE00 )
+ ROM_LOAD( "hd38820a09", 0x0000, 0x1000, CRC(25ba7dc0) SHA1(69e0a867fdcf07b454b1faf835e576ae782432c0) )
+ ROM_CONTINUE( 0x1e80, 0x0100 )
+
+ ROM_REGION( 178441, "svg", 0)
+ ROM_LOAD( "mwcbaseb.svg", 0, 178441, CRC(0f631190) SHA1(74a10ad0630af5516f76d5bf5628483d21f6b7be) )
+ROM_END
+
+
+
+
+
+/***************************************************************************
+
+ Mattel Star Hawk (manufactured in Japan)
+ * PCB label Kaken, PT-317B
+ * Hitachi HD38800A73 MCU
+ * cyan/red VFD display Futaba DM-41ZK, with partial color overlay + bezel
+
+ Before release, it was advertised as "Space Battle"(a Mattel Intellivision game).
+ Kaken was a subsidiary of Bandai. Star Hawk shell design is the same as Bandai's
+ games from the same era. It's likely that this was made under contract exclusively
+ for Mattel. There is no indication that this game was released in Japan by Bandai.
+
+***************************************************************************/
+
+class msthawk_state : public hh_hmcs40_state
+{
+public:
+ msthawk_state(const machine_config &mconfig, device_type type, const char *tag) :
+ hh_hmcs40_state(mconfig, type, tag)
+ { }
+
+ void prepare_display();
+ DECLARE_WRITE8_MEMBER(plate_w);
+ DECLARE_WRITE16_MEMBER(grid_w);
+
+ void update_int0();
+ DECLARE_INPUT_CHANGED_MEMBER(input_changed) { update_int0(); }
+ void msthawk(machine_config &config);
+};
+
+// handlers
+
+void msthawk_state::prepare_display()
+{
+ u16 grid = bitswap<16>(m_grid,15,14,13,12,11,10,0,1,2,3,4,5,6,7,8,9);
+ u32 plate = bitswap<24>(m_plate,23,22,21,19,20,18,17,16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0);
+ display_matrix(21, 10, plate, grid);
+}
+
+WRITE8_MEMBER(msthawk_state::plate_w)
+{
+ // R0x-R3x: vfd plate
+ int shift = offset * 4;
+ m_plate = (m_plate & ~(0xf << shift)) | (data << shift);
+ prepare_display();
+}
+
+WRITE16_MEMBER(msthawk_state::grid_w)
+{
+ // D5: speaker out
+ m_speaker->level_w(data >> 5 & 1);
+
+ // D10-D15: input mux
+ u8 inp_mux = data >> 10 & 0x3f;
+ if (inp_mux != m_inp_mux)
+ {
+ m_inp_mux = inp_mux;
+ update_int0();
+ }
+
+ // D6-D15: vfd grid
+ m_grid = data >> 6 & 0x3ff;
+
+ // D0-D4: more plates
+ m_plate = (m_plate & 0x00ffff) | (data << 16 & 0x1f0000);
+ prepare_display();
+}
+
+void msthawk_state::update_int0()
+{
+ // INT0 on multiplexed inputs
+ set_interrupt(0, read_inputs(6));
+}
+
+// config
+
+static INPUT_PORTS_START( msthawk )
+ PORT_START("IN.0") // D10 INT0
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_MEMBER(DEVICE_SELF, msthawk_state, input_changed, nullptr) PORT_NAME("Score")
+
+ PORT_START("IN.1") // D11 INT0
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_CHANGED_MEMBER(DEVICE_SELF, msthawk_state, input_changed, nullptr) PORT_NAME("Land")
+
+ PORT_START("IN.2") // D12 INT0
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_MEMBER(DEVICE_SELF, msthawk_state, input_changed, nullptr)
+
+ PORT_START("IN.3") // D13 INT0
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_MEMBER(DEVICE_SELF, msthawk_state, input_changed, nullptr)
+
+ PORT_START("IN.4") // D14 INT0
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_MEMBER(DEVICE_SELF, msthawk_state, input_changed, nullptr)
+
+ PORT_START("IN.5") // D15 INT0
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_MEMBER(DEVICE_SELF, msthawk_state, input_changed, nullptr)
+
+ PORT_START("IN.6") // INT1
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_hmcs40_state, single_interrupt_line, 1) PORT_NAME("Fire")
+INPUT_PORTS_END
+
+void msthawk_state::msthawk(machine_config &config)
+{
+ /* basic machine hardware */
+ HD38800(config, m_maincpu, 400000); // approximation
+ m_maincpu->write_r<0>().set(FUNC(msthawk_state::plate_w));
+ m_maincpu->write_r<1>().set(FUNC(msthawk_state::plate_w));
+ m_maincpu->write_r<2>().set(FUNC(msthawk_state::plate_w));
+ m_maincpu->write_r<3>().set(FUNC(msthawk_state::plate_w));
+ m_maincpu->write_d().set(FUNC(msthawk_state::grid_w));
+
+ /* video hardware */
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_SVG));
+ screen.set_svg_region("svg");
+ screen.set_refresh_hz(50);
+ screen.set_size(1920, 696);
+ screen.set_visarea_full();
+
+ TIMER(config, "display_decay").configure_periodic(FUNC(hh_hmcs40_state::display_decay_tick), attotime::from_msec(1));
+ config.set_default_layout(layout_msthawk);
+
+ /* sound hardware */
+ SPEAKER(config, "mono").front_center();
+ SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25);
+}
+
+// roms
+
+ROM_START( msthawk )
+ ROM_REGION( 0x2000, "maincpu", ROMREGION_ERASE00 )
+ ROM_LOAD( "hd38800a73", 0x0000, 0x1000, CRC(a4f9a523) SHA1(465f06b02e2e7d2277218fd447830725790a816c) )
+ ROM_CONTINUE( 0x1e80, 0x0100 )
+
+ ROM_REGION( 191888, "svg", 0)
+ ROM_LOAD( "msthawk.svg", 0, 191888, CRC(a607fc0f) SHA1(282a412f6462128e09ee8bd18d682dda01297611) )
+ROM_END
+
@@ -3649,8 +3978,8 @@ void mwcbaseb_state::mwcbaseb(machine_config &config)
class pbqbert_state : public hh_hmcs40_state
{
public:
- pbqbert_state(const machine_config &mconfig, device_type type, const char *tag)
- : hh_hmcs40_state(mconfig, type, tag)
+ pbqbert_state(const machine_config &mconfig, device_type type, const char *tag) :
+ hh_hmcs40_state(mconfig, type, tag)
{ }
DECLARE_WRITE8_MEMBER(plate_w);
@@ -3713,7 +4042,8 @@ void pbqbert_state::pbqbert(machine_config &config)
screen.set_svg_region("svg");
screen.set_refresh_hz(50);
screen.set_size(603, 1080);
- screen.set_visarea(0, 603-1, 0, 1080-1);
+ screen.set_visarea_full();
+
TIMER(config, "display_decay").configure_periodic(FUNC(hh_hmcs40_state::display_decay_tick), attotime::from_msec(1));
/* sound hardware */
@@ -3721,6 +4051,17 @@ void pbqbert_state::pbqbert(machine_config &config)
SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25);
}
+// roms
+
+ROM_START( pbqbert )
+ ROM_REGION( 0x2000, "maincpu", ROMREGION_ERASE00 )
+ ROM_LOAD( "hd38820a70", 0x0000, 0x1000, CRC(be7c80b4) SHA1(0617a80ef7fe188ea221de32e760d45fd4318c67) )
+ ROM_CONTINUE( 0x1e80, 0x0100 )
+
+ ROM_REGION( 456567, "svg", 0)
+ ROM_LOAD( "pbqbert.svg", 0, 456567, CRC(49853a62) SHA1(869377109fb7163e5ef5efadb26ce3955231f6ca) )
+ROM_END
+
@@ -3737,8 +4078,8 @@ void pbqbert_state::pbqbert(machine_config &config)
class kingman_state : public hh_hmcs40_state
{
public:
- kingman_state(const machine_config &mconfig, device_type type, const char *tag)
- : hh_hmcs40_state(mconfig, type, tag)
+ kingman_state(const machine_config &mconfig, device_type type, const char *tag) :
+ hh_hmcs40_state(mconfig, type, tag)
{ }
void prepare_display();
@@ -3746,7 +4087,7 @@ public:
DECLARE_WRITE16_MEMBER(grid_w);
void update_int0();
- DECLARE_INPUT_CHANGED_MEMBER(input_changed);
+ DECLARE_INPUT_CHANGED_MEMBER(input_changed) { update_int0(); }
void kingman(machine_config &config);
};
@@ -3810,14 +4151,9 @@ static INPUT_PORTS_START( kingman )
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_MEMBER(DEVICE_SELF, kingman_state, input_changed, nullptr)
PORT_START("IN.4") // INT1
- PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_hmcs40_state, single_interrupt_line, (void *)1)
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_hmcs40_state, single_interrupt_line, 1)
INPUT_PORTS_END
-INPUT_CHANGED_MEMBER(kingman_state::input_changed)
-{
- update_int0();
-}
-
void kingman_state::kingman(machine_config &config)
{
/* basic machine hardware */
@@ -3833,7 +4169,8 @@ void kingman_state::kingman(machine_config &config)
screen.set_svg_region("svg");
screen.set_refresh_hz(50);
screen.set_size(374, 1080);
- screen.set_visarea(0, 374-1, 0, 1080-1);
+ screen.set_visarea_full();
+
TIMER(config, "display_decay").configure_periodic(FUNC(hh_hmcs40_state::display_decay_tick), attotime::from_msec(1));
/* sound hardware */
@@ -3841,6 +4178,17 @@ void kingman_state::kingman(machine_config &config)
SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25);
}
+// roms
+
+ROM_START( kingman )
+ ROM_REGION( 0x2000, "maincpu", ROMREGION_ERASE00 )
+ ROM_LOAD( "hd38800b23", 0x0000, 0x1000, CRC(f8dfe14f) SHA1(660610d92ae7e5f92bddf5a3bcc2296b2ec3946b) )
+ ROM_CONTINUE( 0x1e80, 0x0100 )
+
+ ROM_REGION( 396320, "svg", 0)
+ ROM_LOAD( "kingman.svg", 0, 396320, CRC(3f52d2a9) SHA1(9291f1a1da3d19c3d6dedb995de0a5feba75b442) )
+ROM_END
+
@@ -3857,8 +4205,8 @@ void kingman_state::kingman(machine_config &config)
class tmtron_state : public hh_hmcs40_state
{
public:
- tmtron_state(const machine_config &mconfig, device_type type, const char *tag)
- : hh_hmcs40_state(mconfig, type, tag)
+ tmtron_state(const machine_config &mconfig, device_type type, const char *tag) :
+ hh_hmcs40_state(mconfig, type, tag)
{ }
void prepare_display();
@@ -3866,7 +4214,7 @@ public:
DECLARE_WRITE16_MEMBER(grid_w);
void update_int1();
- DECLARE_INPUT_CHANGED_MEMBER(input_changed);
+ DECLARE_INPUT_CHANGED_MEMBER(input_changed) { update_int1(); }
void tmtron(machine_config &config);
};
@@ -3930,14 +4278,9 @@ static INPUT_PORTS_START( tmtron )
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_16WAY PORT_CHANGED_MEMBER(DEVICE_SELF, tmtron_state, input_changed, nullptr)
PORT_START("IN.4") // INT0
- PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_hmcs40_state, single_interrupt_line, (void *)0)
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_hmcs40_state, single_interrupt_line, 0)
INPUT_PORTS_END
-INPUT_CHANGED_MEMBER(tmtron_state::input_changed)
-{
- update_int1();
-}
-
void tmtron_state::tmtron(machine_config &config)
{
/* basic machine hardware */
@@ -3953,7 +4296,8 @@ void tmtron_state::tmtron(machine_config &config)
screen.set_svg_region("svg");
screen.set_refresh_hz(50);
screen.set_size(1920, 662);
- screen.set_visarea(0, 1920-1, 0, 662-1);
+ screen.set_visarea_full();
+
TIMER(config, "display_decay").configure_periodic(FUNC(hh_hmcs40_state::display_decay_tick), attotime::from_msec(1));
/* sound hardware */
@@ -3961,6 +4305,17 @@ void tmtron_state::tmtron(machine_config &config)
SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25);
}
+// roms
+
+ROM_START( tmtron )
+ ROM_REGION( 0x2000, "maincpu", ROMREGION_ERASE00 )
+ ROM_LOAD( "hd38800a88", 0x0000, 0x1000, CRC(33db9670) SHA1(d6f747a59356526698784047bcfdbb59e79b9a23) )
+ ROM_CONTINUE( 0x1e80, 0x0100 )
+
+ ROM_REGION( 384174, "svg", 0)
+ ROM_LOAD( "tmtron.svg", 0, 384174, CRC(06bd9e63) SHA1(fb93013ec42dc05f7029ef3c3073c84867f0d077) )
+ROM_END
+
@@ -3981,8 +4336,8 @@ void tmtron_state::tmtron(machine_config &config)
class vinvader_state : public hh_hmcs40_state
{
public:
- vinvader_state(const machine_config &mconfig, device_type type, const char *tag)
- : hh_hmcs40_state(mconfig, type, tag)
+ vinvader_state(const machine_config &mconfig, device_type type, const char *tag) :
+ hh_hmcs40_state(mconfig, type, tag)
{ }
DECLARE_WRITE8_MEMBER(plate_w);
@@ -4047,7 +4402,8 @@ void vinvader_state::vinvader(machine_config &config)
screen.set_svg_region("svg");
screen.set_refresh_hz(50);
screen.set_size(233, 1080);
- screen.set_visarea(0, 233-1, 0, 1080-1);
+ screen.set_visarea_full();
+
TIMER(config, "display_decay").configure_periodic(FUNC(hh_hmcs40_state::display_decay_tick), attotime::from_msec(1));
/* sound hardware */
@@ -4055,351 +4411,7 @@ void vinvader_state::vinvader(machine_config &config)
SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25);
}
-
-
-
-
-/***************************************************************************
-
- Game driver(s)
-
-***************************************************************************/
-
-ROM_START( bambball )
- ROM_REGION( 0x1000, "maincpu", ROMREGION_ERASE00 )
- ROM_LOAD( "hd38750a08", 0x0000, 0x0800, CRC(907fef18) SHA1(73fe7ca7c6332268a3a9abc5ac88ada2991012fb) )
- ROM_CONTINUE( 0x0f00, 0x0080 )
-
- ROM_REGION( 281988, "svg", 0)
- ROM_LOAD( "bambball.svg", 0, 281988, CRC(63019194) SHA1(cbfb5b051d8f57f6b4d698796030850b3631ed56) )
-ROM_END
-
-
-ROM_START( bmboxing )
- ROM_REGION( 0x1000, "maincpu", ROMREGION_ERASE00 )
- ROM_LOAD( "hd38750a07", 0x0000, 0x0800, CRC(7f33e259) SHA1(c5fcdd6bf060c96666354f09f0570c754f6ed4e0) )
- ROM_CONTINUE( 0x0f00, 0x0080 )
-
- ROM_REGION( 257144, "svg", 0)
- ROM_LOAD( "bmboxing.svg", 0, 257144, CRC(dab81477) SHA1(28b0c844a311e2023ffa71d754e799059b7d050f) )
-ROM_END
-
-
-ROM_START( bfriskyt )
- ROM_REGION( 0x2000, "maincpu", ROMREGION_ERASE00 )
- ROM_LOAD( "hd38800a77", 0x0000, 0x1000, CRC(a2445c4f) SHA1(0aaccfec90b66d27dae194d4462d88e654c41578) )
- ROM_CONTINUE( 0x1e80, 0x0100 )
-
- ROM_REGION( 413577, "svg", 0)
- ROM_LOAD( "bfriskyt.svg", 0, 413577, CRC(17090264) SHA1(4512a8a91a459f2ddc258641c6d38c2f48f4160f) )
-ROM_END
-
-
-ROM_START( packmon )
- ROM_REGION( 0x2000, "maincpu", ROMREGION_ERASE00 )
- ROM_LOAD( "hd38800a27", 0x0000, 0x1000, CRC(86e09e84) SHA1(ac7d3c43667d5720ca513f8ff51d146d9f2af124) )
- ROM_CONTINUE( 0x1e80, 0x0100 )
-
- ROM_REGION( 246356, "svg", 0)
- ROM_LOAD( "packmon.svg", 0, 246356, CRC(991eea96) SHA1(bf42765aea838e9c26453642b01a962399b3e74c) )
-ROM_END
-
-
-ROM_START( msthawk )
- ROM_REGION( 0x2000, "maincpu", ROMREGION_ERASE00 )
- ROM_LOAD( "hd38800a73", 0x0000, 0x1000, CRC(a4f9a523) SHA1(465f06b02e2e7d2277218fd447830725790a816c) )
- ROM_CONTINUE( 0x1e80, 0x0100 )
-
- ROM_REGION( 197907, "svg", 0)
- ROM_LOAD( "msthawk.svg", 0, 197907, CRC(b54efcb9) SHA1(76db2ca156d556bf578995196eca1170b39988bb) )
-ROM_END
-
-
-ROM_START( bzaxxon )
- ROM_REGION( 0x2000, "maincpu", ROMREGION_ERASE00 )
- ROM_LOAD( "hd38800b19", 0x0000, 0x1000, CRC(4fecb80d) SHA1(7adf079480ffd3825ad5ae1eaa4d892eecbcc42d) )
- ROM_CONTINUE( 0x1e80, 0x0100 )
-
- ROM_REGION( 521080, "svg", 0)
- ROM_LOAD( "bzaxxon.svg", 0, 521080, BAD_DUMP CRC(f4fbb2de) SHA1(83db400e67d91ae4bfee3e8568ae9df94ebede19) )
-ROM_END
-
-
-ROM_START( zackman )
- ROM_REGION( 0x2000, "maincpu", ROMREGION_ERASE00 )
- ROM_LOAD( "hd38820a49", 0x0000, 0x1000, CRC(b97f5ef6) SHA1(7fe20e8107361caf9ea657e504be1f8b10b8b03f) )
- ROM_CONTINUE( 0x1e80, 0x0100 )
-
- ROM_REGION( 910689, "svg", 0)
- ROM_LOAD( "zackman.svg", 0, 910689, CRC(5f322820) SHA1(4210aff160e5de9a409aba8b915aaebff2a92647) )
-ROM_END
-
-
-ROM_START( bpengo )
- ROM_REGION( 0x2000, "maincpu", ROMREGION_ERASE00 )
- ROM_LOAD( "hd38820a63", 0x0000, 0x1000, CRC(ebd6bc64) SHA1(0a322c47b9553a2739a85908ce64b9650cf93d49) )
- ROM_CONTINUE( 0x1e80, 0x0100 )
-
- ROM_REGION( 744461, "svg", 0)
- ROM_LOAD( "bpengo.svg", 0, 744461, BAD_DUMP CRC(2b9abaa5) SHA1(c70a6ac1fa757fdd3ababfe6e00573ef1410c1eb) )
-ROM_END
-
-
-ROM_START( bbtime )
- ROM_REGION( 0x2000, "maincpu", ROMREGION_ERASE00 )
- ROM_LOAD( "hd38820a65", 0x0000, 0x1000, CRC(33611faf) SHA1(29b6a30ed543688d31ec2aa18f7938fa4eef30b0) )
- ROM_CONTINUE( 0x1e80, 0x0100 )
-
- ROM_REGION( 461605, "svg", 0)
- ROM_LOAD( "bbtime.svg", 0, 461605, BAD_DUMP CRC(5b335271) SHA1(46c45b711358e8397ae707668aecead9e341ab8a) )
-ROM_END
-
-
-ROM_START( bdoramon )
- ROM_REGION( 0x2000, "maincpu", ROMREGION_ERASE00 )
- ROM_LOAD( "hd38800b43", 0x0000, 0x1000, CRC(9387ca42) SHA1(8937e208934b34bd9f49700aa50287dfc8bda76c) )
- ROM_CONTINUE( 0x1e80, 0x0100 )
-
- ROM_REGION( 624751, "svg", 0)
- ROM_LOAD( "bdoramon.svg", 0, 624751, CRC(5dc4017c) SHA1(2091765de401969651b8eb22067572be72d12398) )
-ROM_END
-
-
-ROM_START( bultrman )
- ROM_REGION( 0x2000, "maincpu", ROMREGION_ERASE00 )
- ROM_LOAD( "hd38800b52", 0x0000, 0x1000, CRC(88d372dc) SHA1(f2ac3b89be8afe6fb65914ccebe1a56316b9472a) )
- ROM_CONTINUE( 0x1e80, 0x0100 )
-
- ROM_REGION( 405717, "svg", 0)
- ROM_LOAD( "bultrman.svg", 0, 405717, CRC(13367971) SHA1(f294898712d1e146ff267bb1e3cfd059f972b248) )
-ROM_END
-
-
-ROM_START( machiman )
- ROM_REGION( 0x2000, "maincpu", ROMREGION_ERASE00 )
- ROM_LOAD( "hd38820a85", 0x0000, 0x1000, CRC(894b4954) SHA1(cab49638a326b031aa548301beb16f818759ef62) )
- ROM_CONTINUE( 0x1e80, 0x0100 )
-
- ROM_REGION( 374097, "svg", 0)
- ROM_LOAD( "machiman.svg", 0, 374097, CRC(78af02ac) SHA1(1b4bbea3e46e1bf33149727d9725bc9b18652b9c) )
-ROM_END
-
-
-ROM_START( pairmtch )
- ROM_REGION( 0x2000, "maincpu", ROMREGION_ERASE00 )
- ROM_LOAD( "hd38820a88", 0x0000, 0x1000, CRC(ffa35730) SHA1(5a80b9025aaad2ac0ab0b1436a1355ae8cd3f868) )
- ROM_CONTINUE( 0x1e80, 0x0100 )
-
- ROM_REGION( 0x2000, "audiocpu", ROMREGION_ERASE00 )
- ROM_LOAD( "hd38820a89", 0x0000, 0x1000, CRC(3533ec56) SHA1(556d69e78a0ee1bf766fce16ed58992d7272d57f) )
- ROM_CONTINUE( 0x1e80, 0x0100 )
-ROM_END
-
-
-ROM_START( alnattck )
- ROM_REGION( 0x2000, "maincpu", ROMREGION_ERASE00 )
- ROM_LOAD( "hd38800a25", 0x0000, 0x1000, CRC(18b50869) SHA1(11e9d5f7b4ae818b077b0ee14a3b43190e20bff3) )
- ROM_CONTINUE( 0x1e80, 0x0100 )
-
- ROM_REGION( 564271, "svg", 0)
- ROM_LOAD( "alnattck.svg", 0, 564271, CRC(5466d1d4) SHA1(3295272015969e58fddc53272769e1fc1bd4b355) )
-ROM_END
-
-
-ROM_START( cdkong )
- ROM_REGION( 0x2000, "maincpu", ROMREGION_ERASE00 )
- ROM_LOAD( "hd38820a45", 0x0000, 0x1000, CRC(196b8070) SHA1(da85d1eb4b048b77f3168630662ab94ec9baa262) )
- ROM_CONTINUE( 0x1e80, 0x0100 )
-
- ROM_REGION( 359199, "svg", 0)
- ROM_LOAD( "cdkong.svg", 0, 359199, CRC(ba159fd5) SHA1(3188e2ed3234f39ac9ee93a485a7e73314bc3457) )
-ROM_END
-
-
-ROM_START( cgalaxn )
- ROM_REGION( 0x2000, "maincpu", ROMREGION_ERASE00 )
- ROM_LOAD( "hd38800a70", 0x0000, 0x1000, CRC(a4c5ed1d) SHA1(0f647cb78437d7e62411febf7c9ce3c5b6753a80) )
- ROM_CONTINUE( 0x1e80, 0x0100 )
-
- ROM_REGION( 712204, "svg", 0)
- ROM_LOAD( "cgalaxn.svg", 0, 712204, CRC(67ec57bf) SHA1(195c9867b321da9768ce287d1060ceae50345dd4) )
-ROM_END
-
-
-ROM_START( cpacman )
- ROM_REGION( 0x2000, "maincpu", ROMREGION_ERASE00 )
- ROM_LOAD( "hd38820a29", 0x0000, 0x1000, CRC(1082d577) SHA1(0ef73132bd41f6ca1e4c001ae19f7f7c97eaa8d1) )
- ROM_CONTINUE( 0x1e80, 0x0100 )
-
- ROM_REGION( 359765, "svg", 0)
- ROM_LOAD( "cpacman.svg", 0, 359765, CRC(e3810a46) SHA1(d0994edd71a6adc8f238c71e360a8606ce397a14) )
-ROM_END
-
-ROM_START( cpacmanr1 )
- ROM_REGION( 0x2000, "maincpu", ROMREGION_ERASE00 )
- ROM_LOAD( "hd38820a28", 0x0000, 0x1000, CRC(d2ed57e5) SHA1(f56f1341485ac28ea9e6cc4d162fab18d8a4c977) )
- ROM_CONTINUE( 0x1e80, 0x0100 )
-
- ROM_REGION( 359765, "svg", 0)
- ROM_LOAD( "cpacman.svg", 0, 359765, CRC(e3810a46) SHA1(d0994edd71a6adc8f238c71e360a8606ce397a14) )
-ROM_END
-
-
-ROM_START( cmspacmn )
- ROM_REGION( 0x2000, "maincpu", ROMREGION_ERASE00 )
- ROM_LOAD( "hd38820a61", 0x0000, 0x1000, CRC(76276318) SHA1(9d6ff3f49b4cdaee5c9e238c1ed638bfb9b99aa7) )
- ROM_CONTINUE( 0x1e80, 0x0100 )
-
- ROM_REGION( 849327, "svg", 0)
- ROM_LOAD( "cmspacmn.svg", 0, 849327, CRC(4110ad07) SHA1(76113a2ce0fb1c6dab4e26fd59a13dc89d950d75) )
-ROM_END
-
-
-ROM_START( sag_si2 )
- ROM_REGION( 0x2000, "maincpu", ROMREGION_ERASE00 )
- ROM_LOAD( "inv2_hd38800a31", 0x0000, 0x1000, BAD_DUMP CRC(29c8c100) SHA1(41cd413065659c6d7d5b2408de2ca6d51c49629a) )
- ROM_CONTINUE( 0x1e80, 0x0100 )
-ROM_END
-
-
-ROM_START( sag_bb4 )
- ROM_REGION( 0x2000, "maincpu", ROMREGION_ERASE00 )
- ROM_LOAD( "b-b5_hd38800a37", 0x0000, 0x1000, CRC(64852bd5) SHA1(fb1c24ca43934ceb6fc35ac7c35b71e6e843dbc5) )
- ROM_CONTINUE( 0x1e80, 0x0100 )
-ROM_END
-
-
-ROM_START( sag_pb )
- ROM_REGION( 0x2000, "maincpu", ROMREGION_ERASE00 )
- ROM_LOAD( "pinb_hd38800a38", 0x0000, 0x1000, CRC(6e53a56b) SHA1(13f057eab2e4cfbb3ef1247a041abff15ae727c9) )
- ROM_CONTINUE( 0x1e80, 0x0100 )
-ROM_END
-
-
-ROM_START( egalaxn2 )
- ROM_REGION( 0x2000, "maincpu", ROMREGION_ERASE00 )
- ROM_LOAD( "hd38820a13", 0x0000, 0x1000, CRC(112b721b) SHA1(4a185bc57ea03fe64f61f7db4da37b16eeb0cb54) )
- ROM_CONTINUE( 0x1e80, 0x0100 )
-
- ROM_REGION( 507945, "svg", 0)
- ROM_LOAD( "egalaxn2.svg", 0, 507945, CRC(b72a8721) SHA1(2d90fca6ce962710525b631e5bc8f75d79332b9d) )
-ROM_END
-
-
-ROM_START( epacman2 )
- ROM_REGION( 0x2000, "maincpu", ROMREGION_ERASE00 )
- ROM_LOAD( "hd38820a23", 0x0000, 0x1000, CRC(6eab640f) SHA1(509bdd02be915089e13769f22a08e03509f03af4) )
- ROM_CONTINUE( 0x1e80, 0x0100 )
-
- ROM_REGION( 262480, "svg", 0)
- ROM_LOAD( "epacman2.svg", 0, 262480, CRC(73bd9671) SHA1(a3ac754c0e060da50b65f3d0f9630d9c3d871650) )
-ROM_END
-
-ROM_START( epacman2r )
- ROM_REGION( 0x2000, "maincpu", ROMREGION_ERASE00 )
- ROM_LOAD( "hd38820a23", 0x0000, 0x1000, CRC(6eab640f) SHA1(509bdd02be915089e13769f22a08e03509f03af4) )
- ROM_CONTINUE( 0x1e80, 0x0100 )
-
- ROM_REGION( 262483, "svg", 0)
- ROM_LOAD( "epacman2r.svg", 0, 262483, CRC(279b629a) SHA1(4c499fb143aadf4f6722b994a22a0d0d3c5150b6) )
-ROM_END
-
-
-ROM_START( estargte )
- ROM_REGION( 0x2000, "maincpu", ROMREGION_ERASE00 )
- ROM_LOAD( "hd38820a42", 0x0000, 0x1000, CRC(5f6d55a6) SHA1(0da32149790fa5f16097338fc80536b462169e0c) )
- ROM_CONTINUE( 0x1e80, 0x0100 )
-
- ROM_REGION( 0x0200, "audiocpu", 0 )
- ROM_LOAD( "cop411l-kec_n", 0x0000, 0x0200, CRC(fbd3c2d3) SHA1(65b8b24d38678c3fa970bfd639e9449a75a28927) )
-
- ROM_REGION( 462214, "svg", 0)
- ROM_LOAD( "estargte.svg", 0, 462214, CRC(282cc090) SHA1(b0f3c21e9a529e5f1e33b90ca25ce3a097fb75a0) )
-ROM_END
-
-
-ROM_START( eturtles )
- ROM_REGION( 0x2000, "maincpu", ROMREGION_ERASE00 )
- ROM_LOAD( "hd38820a43", 0x0000, 0x1000, CRC(446aa4e2) SHA1(d1c0fb14ea7081def53b1174964b39eed1e5d5e6) )
- ROM_CONTINUE( 0x1e80, 0x0100 )
-
- ROM_REGION( 0x0200, "audiocpu", 0 )
- ROM_LOAD( "cop411l-ked_n", 0x0000, 0x0200, CRC(503d26e9) SHA1(a53d24d62195bfbceff2e4a43199846e0950aef6) )
-
- ROM_REGION( 1027626, "svg", 0)
- ROM_LOAD( "eturtles.svg", 0, 1027626, CRC(b4f7abff) SHA1(e9b065a3a3fef3c71495002945724a86c2a68eb4) )
-ROM_END
-
-
-ROM_START( ghalien )
- ROM_REGION( 0x2000, "maincpu", ROMREGION_ERASE00 )
- ROM_LOAD( "hd38800a04", 0x0000, 0x1000, CRC(019c3328) SHA1(9f1029c5c479f78350952c4f18747341ba5ea7a0) )
- ROM_CONTINUE( 0x1e80, 0x0100 )
-
- ROM_REGION( 462749, "svg", 0)
- ROM_LOAD( "ghalien.svg", 0, 462749, CRC(1acbb1e8) SHA1(7bdeb840bc9080792e24812eba923bf84f7865a6) )
-ROM_END
-
-
-ROM_START( gckong )
- ROM_REGION( 0x2000, "maincpu", ROMREGION_ERASE00 )
- ROM_LOAD( "hd38800b01", 0x0000, 0x1000, CRC(d5a2cca3) SHA1(37bb5784383daab672ed1e0e2362c7a40d8d9b3f) )
- ROM_CONTINUE( 0x1e80, 0x0100 )
-
- ROM_REGION( 356769, "svg", 0)
- ROM_LOAD( "gckong.svg", 0, 356769, CRC(e2559b53) SHA1(519309c3a88b5d7f4c0ac5ae05dcdc1153377765) )
-ROM_END
-
-
-ROM_START( gdigdug )
- ROM_REGION( 0x2000, "maincpu", ROMREGION_ERASE00 )
- ROM_LOAD( "hd38820a69", 0x0000, 0x1000, CRC(501165a9) SHA1(8a15d00c4aa66e870cadde33148426463560d2e6) )
- ROM_CONTINUE( 0x1e80, 0x0100 )
-
- ROM_REGION( 807990, "svg", 0)
- ROM_LOAD( "gdigdug.svg", 0, 807990, CRC(a5b8392d) SHA1(3503829bb1a626a9e70115fb60b656dff8908144) )
-ROM_END
-
-
-ROM_START( mwcbaseb )
- ROM_REGION( 0x2000, "maincpu", ROMREGION_ERASE00 )
- ROM_LOAD( "hd38820a09", 0x0000, 0x1000, CRC(25ba7dc0) SHA1(69e0a867fdcf07b454b1faf835e576ae782432c0) )
- ROM_CONTINUE( 0x1e80, 0x0100 )
-
- ROM_REGION( 178441, "svg", 0)
- ROM_LOAD( "mwcbaseb.svg", 0, 178441, CRC(0f631190) SHA1(74a10ad0630af5516f76d5bf5628483d21f6b7be) )
-ROM_END
-
-
-ROM_START( pbqbert )
- ROM_REGION( 0x2000, "maincpu", ROMREGION_ERASE00 )
- ROM_LOAD( "hd38820a70", 0x0000, 0x1000, CRC(be7c80b4) SHA1(0617a80ef7fe188ea221de32e760d45fd4318c67) )
- ROM_CONTINUE( 0x1e80, 0x0100 )
-
- ROM_REGION( 456567, "svg", 0)
- ROM_LOAD( "pbqbert.svg", 0, 456567, CRC(49853a62) SHA1(869377109fb7163e5ef5efadb26ce3955231f6ca) )
-ROM_END
-
-
-ROM_START( kingman )
- ROM_REGION( 0x2000, "maincpu", ROMREGION_ERASE00 )
- ROM_LOAD( "hd38800b23", 0x0000, 0x1000, CRC(f8dfe14f) SHA1(660610d92ae7e5f92bddf5a3bcc2296b2ec3946b) )
- ROM_CONTINUE( 0x1e80, 0x0100 )
-
- ROM_REGION( 396320, "svg", 0)
- ROM_LOAD( "kingman.svg", 0, 396320, CRC(3f52d2a9) SHA1(9291f1a1da3d19c3d6dedb995de0a5feba75b442) )
-ROM_END
-
-
-ROM_START( tmtron )
- ROM_REGION( 0x2000, "maincpu", ROMREGION_ERASE00 )
- ROM_LOAD( "hd38800a88", 0x0000, 0x1000, CRC(33db9670) SHA1(d6f747a59356526698784047bcfdbb59e79b9a23) )
- ROM_CONTINUE( 0x1e80, 0x0100 )
-
- ROM_REGION( 384174, "svg", 0)
- ROM_LOAD( "tmtron.svg", 0, 384174, CRC(06bd9e63) SHA1(fb93013ec42dc05f7029ef3c3073c84867f0d077) )
-ROM_END
-
+// roms
ROM_START( vinvader )
ROM_REGION( 0x1000, "maincpu", ROMREGION_ERASE00 )
@@ -4412,13 +4424,20 @@ ROM_END
+} // anonymous namespace
+
+/***************************************************************************
+
+ Game driver(s)
+
+***************************************************************************/
+
// YEAR NAME PARENT CMP MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS
CONS( 1979, bambball, 0, 0, bambball, bambball, bambball_state, empty_init, "Bambino", "Dribble Away Basketball", MACHINE_SUPPORTS_SAVE )
CONS( 1979, bmboxing, 0, 0, bmboxing, bmboxing, bmboxing_state, empty_init, "Bambino", "Knock-Em Out Boxing", MACHINE_SUPPORTS_SAVE )
CONS( 1982, bfriskyt, 0, 0, bfriskyt, bfriskyt, bfriskyt_state, empty_init, "Bandai", "Frisky Tom (Bandai)", MACHINE_SUPPORTS_SAVE )
CONS( 1981, packmon, 0, 0, packmon, packmon, packmon_state, empty_init, "Bandai", "Packri Monster", MACHINE_SUPPORTS_SAVE )
-CONS( 1982, msthawk, 0, 0, msthawk, msthawk, msthawk_state, empty_init, "Bandai (Mattel license)", "Star Hawk (Mattel)", MACHINE_SUPPORTS_SAVE )
CONS( 1982, bzaxxon, 0, 0, bzaxxon, bzaxxon, bzaxxon_state, empty_init, "Bandai", "Zaxxon (Bandai)", MACHINE_SUPPORTS_SAVE )
CONS( 1983, zackman, 0, 0, zackman, zackman, zackman_state, empty_init, "Bandai", "Zackman", MACHINE_SUPPORTS_SAVE )
CONS( 1983, bpengo, 0, 0, bpengo, bpengo, bpengo_state, empty_init, "Bandai", "Pengo (Bandai)", MACHINE_SUPPORTS_SAVE )
@@ -4429,7 +4448,7 @@ CONS( 1984, machiman, 0, 0, machiman, machiman, machiman_state, empty_in
CONS( 1984, pairmtch, 0, 0, pairmtch, pairmtch, pairmtch_state, empty_init, "Bandai", "Pair Match", MACHINE_SUPPORTS_SAVE )
CONS( 1981, alnattck, 0, 0, alnattck, alnattck, alnattck_state, empty_init, "Coleco", "Alien Attack", MACHINE_SUPPORTS_SAVE )
-CONS( 1982, cdkong, 0, 0, cdkong, cdkong, cdkong_state, empty_init, "Coleco", "Donkey Kong (Coleco)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND )
+CONS( 1982, cdkong, 0, 0, cdkong, cdkong, cdkong_state, empty_init, "Coleco", "Donkey Kong (Coleco)", MACHINE_SUPPORTS_SAVE )
CONS( 1982, cgalaxn, 0, 0, cgalaxn, cgalaxn, cgalaxn_state, empty_init, "Coleco", "Galaxian (Coleco)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND )
CONS( 1981, cpacman, 0, 0, cpacman, cpacman, cpacman_state, empty_init, "Coleco", "Pac-Man (Coleco, Rev. 29)", MACHINE_SUPPORTS_SAVE )
CONS( 1981, cpacmanr1, cpacman, 0, cpacman, cpacman, cpacman_state, empty_init, "Coleco", "Pac-Man (Coleco, Rev. 28)", MACHINE_SUPPORTS_SAVE )
@@ -4441,14 +4460,15 @@ CONS( 1981, sag_pb, 0, 0, sag, sag, sag_state, empty_in
CONS( 1981, egalaxn2, 0, 0, egalaxn2, egalaxn2, egalaxn2_state, empty_init, "Entex", "Galaxian 2 (Entex)", MACHINE_SUPPORTS_SAVE )
CONS( 1981, epacman2, 0, 0, epacman2, epacman2, epacman2_state, empty_init, "Entex", "Pac Man 2 (Entex, cyan Pacman)", MACHINE_SUPPORTS_SAVE )
CONS( 1981, epacman2r, epacman2, 0, epacman2, epacman2, epacman2_state, empty_init, "Entex", "Pac Man 2 (Entex, red Pacman)", MACHINE_SUPPORTS_SAVE )
-CONS( 1982, estargte, 0, 0, estargte, estargte, estargte_state, empty_init, "Entex", "Stargate (Entex)", MACHINE_SUPPORTS_SAVE )
CONS( 1982, eturtles, 0, 0, eturtles, eturtles, eturtles_state, empty_init, "Entex", "Turtles (Entex)", MACHINE_SUPPORTS_SAVE )
+CONS( 1982, estargte, 0, 0, estargte, estargte, estargte_state, empty_init, "Entex", "Stargate (Entex)", MACHINE_SUPPORTS_SAVE )
CONS( 1980, ghalien, 0, 0, ghalien, ghalien, ghalien_state, empty_init, "Gakken", "Heiankyo Alien (Gakken)", MACHINE_SUPPORTS_SAVE )
CONS( 1982, gckong, 0, 0, gckong, gckong, gckong_state, empty_init, "Gakken", "Crazy Kong (Gakken)", MACHINE_SUPPORTS_SAVE | MACHINE_NOT_WORKING )
CONS( 1983, gdigdug, 0, 0, gdigdug, gdigdug, gdigdug_state, empty_init, "Gakken", "Dig Dug (Gakken)", MACHINE_SUPPORTS_SAVE )
CONS( 1980, mwcbaseb, 0, 0, mwcbaseb, mwcbaseb, mwcbaseb_state, empty_init, "Mattel", "World Championship Baseball", MACHINE_SUPPORTS_SAVE )
+CONS( 1982, msthawk, 0, 0, msthawk, msthawk, msthawk_state, empty_init, "Mattel", "Star Hawk (Mattel)", MACHINE_SUPPORTS_SAVE )
CONS( 1983, pbqbert, 0, 0, pbqbert, pbqbert, pbqbert_state, empty_init, "Parker Brothers", "Q*Bert (Parker Brothers)", MACHINE_SUPPORTS_SAVE )
diff --git a/src/mame/drivers/hh_melps4.cpp b/src/mame/drivers/hh_melps4.cpp
index 6b9f0e4f129..7d294433781 100644
--- a/src/mame/drivers/hh_melps4.cpp
+++ b/src/mame/drivers/hh_melps4.cpp
@@ -47,7 +47,7 @@ public:
u16 m_inp_mux; // multiplexed inputs mask
u8 read_inputs(int columns);
- DECLARE_INPUT_CHANGED_MEMBER(reset_button);
+ virtual DECLARE_INPUT_CHANGED_MEMBER(reset_button);
// display common
int m_display_wait; // led/lamp off-delay in milliseconds (default 33ms)
@@ -203,10 +203,12 @@ INPUT_CHANGED_MEMBER(hh_melps4_state::reset_button)
/***************************************************************************
- Minidrivers (subclass, I/O, Inputs, Machine Config)
+ Minidrivers (subclass, I/O, Inputs, Machine Config, ROM Defs)
***************************************************************************/
+namespace {
+
/***************************************************************************
Coleco Frogger (manufactured in Japan, licensed from Sega)
@@ -219,8 +221,8 @@ INPUT_CHANGED_MEMBER(hh_melps4_state::reset_button)
class cfrogger_state : public hh_melps4_state
{
public:
- cfrogger_state(const machine_config &mconfig, device_type type, const char *tag)
- : hh_melps4_state(mconfig, type, tag)
+ cfrogger_state(const machine_config &mconfig, device_type type, const char *tag) :
+ hh_melps4_state(mconfig, type, tag)
{ }
void prepare_display();
@@ -290,12 +292,12 @@ static INPUT_PORTS_START( cfrogger )
PORT_CONFSETTING( 0x00, "1" )
PORT_CONFSETTING( 0x08, "2" )
- PORT_START("IN.3") // fake
+ PORT_START("RESET")
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_melps4_state, reset_button, nullptr)
INPUT_PORTS_END
-MACHINE_CONFIG_START(cfrogger_state::cfrogger)
-
+void cfrogger_state::cfrogger(machine_config &config)
+{
/* basic machine hardware */
M58846(config, m_maincpu, 600_kHz_XTAL);
m_maincpu->read_k().set(FUNC(cfrogger_state::input_r));
@@ -306,17 +308,27 @@ MACHINE_CONFIG_START(cfrogger_state::cfrogger)
m_maincpu->write_t().set(FUNC(cfrogger_state::speaker_w));
/* video hardware */
- MCFG_SCREEN_SVG_ADD("screen", "svg")
- MCFG_SCREEN_REFRESH_RATE(50)
- MCFG_SCREEN_SIZE(500, 1080)
- MCFG_SCREEN_VISIBLE_AREA(0, 500-1, 0, 1080-1)
- MCFG_TIMER_DRIVER_ADD_PERIODIC("display_decay", hh_melps4_state, display_decay_tick, attotime::from_msec(1))
+ screen_device &screen(SCREEN(config, "screen", "svg"));
+ screen.set_refresh_hz(50);
+ screen.set_size(500, 1080);
+ screen.set_visarea_full();
+
+ TIMER(config, "display_decay").configure_periodic(FUNC(hh_melps4_state::display_decay_tick), attotime::from_msec(1));
/* sound hardware */
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("speaker", SPEAKER_SOUND)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25)
-MACHINE_CONFIG_END
+ SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25);
+}
+
+// roms
+
+ROM_START( cfrogger )
+ ROM_REGION( 0x1000, "maincpu", 0 )
+ ROM_LOAD( "m58846-701p", 0x0000, 0x1000, CRC(ba52a242) SHA1(7fa53b617f4bb54be32eb209e9b88131e11cb518) )
+
+ ROM_REGION( 786255, "svg", 0)
+ ROM_LOAD( "cfrogger.svg", 0, 786255, CRC(d8d6e2b6) SHA1(bc9a0260b211ed07021dfe1cc19a993569f4c544) )
+ROM_END
@@ -334,8 +346,8 @@ MACHINE_CONFIG_END
class gjungler_state : public hh_melps4_state
{
public:
- gjungler_state(const machine_config &mconfig, device_type type, const char *tag)
- : hh_melps4_state(mconfig, type, tag)
+ gjungler_state(const machine_config &mconfig, device_type type, const char *tag) :
+ hh_melps4_state(mconfig, type, tag)
{ }
void prepare_display();
@@ -405,12 +417,12 @@ static INPUT_PORTS_START( gjungler )
PORT_CONFSETTING( 0x00, "A" )
PORT_CONFSETTING( 0x08, "B" )
- PORT_START("IN.3") // fake
+ PORT_START("RESET")
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_melps4_state, reset_button, nullptr)
INPUT_PORTS_END
-MACHINE_CONFIG_START(gjungler_state::gjungler)
-
+void gjungler_state::gjungler(machine_config &config)
+{
/* basic machine hardware */
M58846(config, m_maincpu, 600_kHz_XTAL);
m_maincpu->read_k().set(FUNC(gjungler_state::input_r));
@@ -422,36 +434,19 @@ MACHINE_CONFIG_START(gjungler_state::gjungler)
m_maincpu->write_t().set(FUNC(gjungler_state::speaker_w));
/* video hardware */
- MCFG_SCREEN_SVG_ADD("screen", "svg")
- MCFG_SCREEN_REFRESH_RATE(50)
- MCFG_SCREEN_SIZE(481, 1080)
- MCFG_SCREEN_VISIBLE_AREA(0, 481-1, 0, 1080-1)
- MCFG_TIMER_DRIVER_ADD_PERIODIC("display_decay", hh_melps4_state, display_decay_tick, attotime::from_msec(1))
+ screen_device &screen(SCREEN(config, "screen", "svg"));
+ screen.set_refresh_hz(50);
+ screen.set_size(481, 1080);
+ screen.set_visarea_full();
+
+ TIMER(config, "display_decay").configure_periodic(FUNC(hh_melps4_state::display_decay_tick), attotime::from_msec(1));
/* sound hardware */
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("speaker", SPEAKER_SOUND)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25)
-MACHINE_CONFIG_END
-
-
-
-
-
-/***************************************************************************
-
- Game driver(s)
-
-***************************************************************************/
-
-ROM_START( cfrogger )
- ROM_REGION( 0x1000, "maincpu", 0 )
- ROM_LOAD( "m58846-701p", 0x0000, 0x1000, CRC(ba52a242) SHA1(7fa53b617f4bb54be32eb209e9b88131e11cb518) )
-
- ROM_REGION( 786255, "svg", 0)
- ROM_LOAD( "cfrogger.svg", 0, 786255, CRC(d8d6e2b6) SHA1(bc9a0260b211ed07021dfe1cc19a993569f4c544) )
-ROM_END
+ SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25);
+}
+// roms
ROM_START( gjungler )
ROM_REGION( 0x1000, "maincpu", 0 )
@@ -463,6 +458,14 @@ ROM_END
+} // anonymous namespace
+
+/***************************************************************************
+
+ Game driver(s)
+
+***************************************************************************/
+
// YEAR NAME PARENT CMP MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS
CONS( 1981, cfrogger, 0, 0, cfrogger, cfrogger, cfrogger_state, empty_init, "Coleco", "Frogger (Coleco)", MACHINE_SUPPORTS_SAVE )
diff --git a/src/mame/drivers/hh_pic16.cpp b/src/mame/drivers/hh_pic16.cpp
index 7fcc64da664..0301dea356b 100644
--- a/src/mame/drivers/hh_pic16.cpp
+++ b/src/mame/drivers/hh_pic16.cpp
@@ -9,6 +9,7 @@
serial device etc.
-----------------------------------------------------------
*020 1650 19??, GI Economega IV TV PPL Tuning System Control
+ *021 1650 1978, GI AY-3-8910 demo board
@024 1655 1979, Toytronic? Football
@033 1655A 1979, Toytronic Football (newer)
@036 1655A 1979, Ideal Maniac
@@ -39,7 +40,6 @@
- tweak MCU frequency for games when video/audio recording surfaces(YouTube etc.)
- some of the games rely on the fact that faster/longer strobed leds appear brighter,
eg. hccbaskb(player led), ..
- - leboom discrete sound for volume decay (simulated for now)
- ttfball: discrete sound part, for volume gating?
- what's the relation between hccbaskb and tbaskb? Is one the bootleg
of the other? Or are they both made by the same subcontractor?
@@ -70,8 +70,8 @@
class hh_pic16_state : public driver_device
{
public:
- hh_pic16_state(const machine_config &mconfig, device_type type, const char *tag)
- : driver_device(mconfig, type, tag),
+ hh_pic16_state(const machine_config &mconfig, device_type type, const char *tag) :
+ driver_device(mconfig, type, tag),
m_maincpu(*this, "maincpu"),
m_inp_matrix(*this, "IN.%u", 0),
m_out_x(*this, "%u.%u", 0U, 0U),
@@ -100,6 +100,7 @@ public:
u16 read_inputs(int columns, u16 colmask = ~0);
u8 read_rotated_inputs(int columns, u8 rowmask = ~0);
+ virtual DECLARE_INPUT_CHANGED_MEMBER(reset_button);
// display common
int m_display_wait; // led/lamp off-delay in milliseconds (default 33ms)
@@ -273,14 +274,22 @@ u8 hh_pic16_state::read_rotated_inputs(int columns, u8 rowmask)
return ~ret & rowmask;
}
+INPUT_CHANGED_MEMBER(hh_pic16_state::reset_button)
+{
+ // when an input is directly wired to MCU MCLR pin
+ m_maincpu->set_input_line(INPUT_LINE_RESET, newval ? ASSERT_LINE : CLEAR_LINE);
+}
+
/***************************************************************************
- Minidrivers (subclass, I/O, Inputs, Machine Config)
+ Minidrivers (subclass, I/O, Inputs, Machine Config, ROM Defs)
***************************************************************************/
+namespace {
+
/***************************************************************************
Atari Touch Me
@@ -298,8 +307,8 @@ u8 hh_pic16_state::read_rotated_inputs(int columns, u8 rowmask)
class touchme_state : public hh_pic16_state
{
public:
- touchme_state(const machine_config &mconfig, device_type type, const char *tag)
- : hh_pic16_state(mconfig, type, tag)
+ touchme_state(const machine_config &mconfig, device_type type, const char *tag) :
+ hh_pic16_state(mconfig, type, tag)
{ }
void prepare_display();
@@ -400,6 +409,13 @@ void touchme_state::touchme(machine_config &config)
m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25);
}
+// roms
+
+ROM_START( touchme )
+ ROM_REGION( 0x0400, "maincpu", 0 )
+ ROM_LOAD( "pic_1655a-053", 0x0000, 0x0400, CRC(f0858f0a) SHA1(53ffe111d43db1c110847590350ef62f02ed5e0e) )
+ROM_END
+
@@ -415,15 +431,13 @@ void touchme_state::touchme(machine_config &config)
class pabball_state : public hh_pic16_state
{
public:
- pabball_state(const machine_config &mconfig, device_type type, const char *tag)
- : hh_pic16_state(mconfig, type, tag)
+ pabball_state(const machine_config &mconfig, device_type type, const char *tag) :
+ hh_pic16_state(mconfig, type, tag)
{ }
void prepare_display();
DECLARE_WRITE8_MEMBER(write_b);
DECLARE_WRITE8_MEMBER(write_c);
-
- DECLARE_INPUT_CHANGED_MEMBER(reset_button);
void pabball(machine_config &config);
};
@@ -478,15 +492,9 @@ static INPUT_PORTS_START( pabball )
PORT_CONFSETTING( 0x20, "2" )
PORT_START("RESET")
- PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("P1 Reset") PORT_CHANGED_MEMBER(DEVICE_SELF, pabball_state, reset_button, nullptr)
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("P1 Reset") PORT_CHANGED_MEMBER(DEVICE_SELF, hh_pic16_state, reset_button, nullptr)
INPUT_PORTS_END
-INPUT_CHANGED_MEMBER(pabball_state::reset_button)
-{
- // reset button is directly tied to MCLR pin
- m_maincpu->set_input_line(INPUT_LINE_RESET, newval ? ASSERT_LINE : CLEAR_LINE);
-}
-
void pabball_state::pabball(machine_config &config)
{
/* basic machine hardware */
@@ -504,6 +512,13 @@ void pabball_state::pabball(machine_config &config)
SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25);
}
+// roms
+
+ROM_START( pabball )
+ ROM_REGION( 0x0400, "maincpu", 0 )
+ ROM_LOAD( "pic_1655a-043", 0x0000, 0x0400, CRC(43c9b765) SHA1(888a431bab9bcb241c14f33f70863fa2ad89c96b) )
+ROM_END
+
@@ -522,8 +537,8 @@ void pabball_state::pabball(machine_config &config)
class melodym_state : public hh_pic16_state
{
public:
- melodym_state(const machine_config &mconfig, device_type type, const char *tag)
- : hh_pic16_state(mconfig, type, tag)
+ melodym_state(const machine_config &mconfig, device_type type, const char *tag) :
+ hh_pic16_state(mconfig, type, tag)
{ }
DECLARE_WRITE8_MEMBER(write_b);
@@ -618,6 +633,13 @@ void melodym_state::melodym(machine_config &config)
SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25);
}
+// roms
+
+ROM_START( melodym )
+ ROM_REGION( 0x0400, "maincpu", 0 )
+ ROM_LOAD( "pic_1655a-094", 0x0000, 0x0400, CRC(6d35bd7b) SHA1(20e326085878f69a9d4ef1651ef4443f27188567) )
+ROM_END
+
@@ -640,8 +662,8 @@ void melodym_state::melodym(machine_config &config)
class maniac_state : public hh_pic16_state
{
public:
- maniac_state(const machine_config &mconfig, device_type type, const char *tag)
- : hh_pic16_state(mconfig, type, tag)
+ maniac_state(const machine_config &mconfig, device_type type, const char *tag) :
+ hh_pic16_state(mconfig, type, tag)
{ }
void prepare_display();
@@ -718,6 +740,13 @@ void maniac_state::maniac(machine_config &config)
m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25);
}
+// roms
+
+ROM_START( maniac )
+ ROM_REGION( 0x0400, "maincpu", 0 )
+ ROM_LOAD( "pic_1655a-036", 0x0000, 0x0400, CRC(a96f7011) SHA1(e97ae44d3c1e74c7e1024bb0bdab03eecdc9f827) )
+ROM_END
+
@@ -741,8 +770,8 @@ void maniac_state::maniac(machine_config &config)
class matchme_state : public hh_pic16_state
{
public:
- matchme_state(const machine_config &mconfig, device_type type, const char *tag)
- : hh_pic16_state(mconfig, type, tag)
+ matchme_state(const machine_config &mconfig, device_type type, const char *tag) :
+ hh_pic16_state(mconfig, type, tag)
{ }
DECLARE_WRITE8_MEMBER(write_b);
@@ -750,15 +779,28 @@ public:
DECLARE_READ8_MEMBER(read_c);
void set_clock();
- DECLARE_INPUT_CHANGED_MEMBER(speed_switch);
+ DECLARE_INPUT_CHANGED_MEMBER(speed_switch) { set_clock(); }
void matchme(machine_config &config);
protected:
virtual void machine_reset() override;
};
+void matchme_state::machine_reset()
+{
+ hh_pic16_state::machine_reset();
+ set_clock();
+}
+
// handlers
+void matchme_state::set_clock()
+{
+ // MCU clock is ~1.2MHz by default (R=18K, C=15pF), high speed setting adds a
+ // 10pF cap to speed it up by about 7.5%.
+ m_maincpu->set_unscaled_clock((m_inp_matrix[4]->read() & 1) ? 1300000 : 1200000);
+}
+
WRITE8_MEMBER(matchme_state::write_b)
{
// B0-B7: lamps
@@ -831,24 +873,6 @@ static INPUT_PORTS_START( matchme )
PORT_CONFSETTING( 0x00, "Auto" )
INPUT_PORTS_END
-INPUT_CHANGED_MEMBER(matchme_state::speed_switch)
-{
- set_clock();
-}
-
-void matchme_state::set_clock()
-{
- // MCU clock is ~1.2MHz by default (R=18K, C=15pF), high speed setting adds a
- // 10pF cap to speed it up by about 7.5%.
- m_maincpu->set_unscaled_clock((m_inp_matrix[4]->read() & 1) ? 1300000 : 1200000);
-}
-
-void matchme_state::machine_reset()
-{
- hh_pic16_state::machine_reset();
- set_clock();
-}
-
void matchme_state::matchme(machine_config &config)
{
/* basic machine hardware */
@@ -866,6 +890,13 @@ void matchme_state::matchme(machine_config &config)
SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25);
}
+// roms
+
+ROM_START( matchme )
+ ROM_REGION( 0x0400, "maincpu", 0 )
+ ROM_LOAD( "pic_1655a-049", 0x0000, 0x0400, CRC(fa3f4805) SHA1(57cbac18baa201927e99cd69cc2ffda4d2e642bb) )
+ROM_END
+
@@ -896,8 +927,8 @@ void matchme_state::matchme(machine_config &config)
class leboom_state : public hh_pic16_state
{
public:
- leboom_state(const machine_config &mconfig, device_type type, const char *tag)
- : hh_pic16_state(mconfig, type, tag)
+ leboom_state(const machine_config &mconfig, device_type type, const char *tag) :
+ hh_pic16_state(mconfig, type, tag)
{ }
DECLARE_READ8_MEMBER(read_a);
@@ -913,6 +944,15 @@ protected:
virtual void machine_start() override;
};
+void leboom_state::machine_start()
+{
+ hh_pic16_state::machine_start();
+
+ // zerofill/init
+ m_speaker_volume = 0;
+ save_item(NAME(m_speaker_volume));
+}
+
// handlers
void leboom_state::speaker_decay_reset()
@@ -995,15 +1035,6 @@ static INPUT_PORTS_START( leboom )
PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_N) PORT_NAME("Blue Button 8")
INPUT_PORTS_END
-void leboom_state::machine_start()
-{
- hh_pic16_state::machine_start();
-
- // zerofill/init
- m_speaker_volume = 0;
- save_item(NAME(m_speaker_volume));
-}
-
void leboom_state::leboom(machine_config &config)
{
/* basic machine hardware */
@@ -1022,6 +1053,13 @@ void leboom_state::leboom(machine_config &config)
TIMER(config, "speaker_decay").configure_periodic(FUNC(leboom_state::speaker_decay_sim), attotime::from_msec(25));
}
+// roms
+
+ROM_START( leboom )
+ ROM_REGION( 0x0400, "maincpu", 0 )
+ ROM_LOAD( "pic_1655a-061", 0x0000, 0x0400, CRC(5880eea1) SHA1(e3795b347fd5df9de084da36e33f6b70fbc0b0ae) )
+ROM_END
+
@@ -1040,8 +1078,8 @@ void leboom_state::leboom(machine_config &config)
class tbaskb_state : public hh_pic16_state
{
public:
- tbaskb_state(const machine_config &mconfig, device_type type, const char *tag)
- : hh_pic16_state(mconfig, type, tag)
+ tbaskb_state(const machine_config &mconfig, device_type type, const char *tag) :
+ hh_pic16_state(mconfig, type, tag)
{ }
void prepare_display();
@@ -1130,6 +1168,13 @@ void tbaskb_state::tbaskb(machine_config &config)
SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25);
}
+// roms
+
+ROM_START( tbaskb )
+ ROM_REGION( 0x0400, "maincpu", 0 )
+ ROM_LOAD( "pic_1655a-051", 0x0000, 0x0400, CRC(92534b40) SHA1(7055e32846c913e68f7d35f279cd537f6325f4f2) )
+ROM_END
+
@@ -1150,8 +1195,8 @@ void tbaskb_state::tbaskb(machine_config &config)
class rockpin_state : public hh_pic16_state
{
public:
- rockpin_state(const machine_config &mconfig, device_type type, const char *tag)
- : hh_pic16_state(mconfig, type, tag)
+ rockpin_state(const machine_config &mconfig, device_type type, const char *tag) :
+ hh_pic16_state(mconfig, type, tag)
{ }
void prepare_display();
@@ -1247,6 +1292,13 @@ void rockpin_state::rockpin(machine_config &config)
m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25);
}
+// roms
+
+ROM_START( rockpin )
+ ROM_REGION( 0x0400, "maincpu", 0 )
+ ROM_LOAD( "pic_1650a-110_69-11397", 0x0000, 0x0400, CRC(d5396e77) SHA1(952feaff70fde53a9eda84c54704520d50749e78) )
+ROM_END
+
@@ -1266,8 +1318,8 @@ void rockpin_state::rockpin(machine_config &config)
class hccbaskb_state : public hh_pic16_state
{
public:
- hccbaskb_state(const machine_config &mconfig, device_type type, const char *tag)
- : hh_pic16_state(mconfig, type, tag)
+ hccbaskb_state(const machine_config &mconfig, device_type type, const char *tag) :
+ hh_pic16_state(mconfig, type, tag)
{ }
void prepare_display();
@@ -1356,6 +1408,13 @@ void hccbaskb_state::hccbaskb(machine_config &config)
SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25);
}
+// roms
+
+ROM_START( hccbaskb )
+ ROM_REGION( 0x0400, "maincpu", 0 )
+ ROM_LOAD( "69-11557", 0x0000, 0x0400, CRC(56e81079) SHA1(1933f87f82c4c53f953534dba7757c9afc52d5bc) )
+ROM_END
+
@@ -1379,8 +1438,8 @@ void hccbaskb_state::hccbaskb(machine_config &config)
class ttfball_state : public hh_pic16_state
{
public:
- ttfball_state(const machine_config &mconfig, device_type type, const char *tag)
- : hh_pic16_state(mconfig, type, tag)
+ ttfball_state(const machine_config &mconfig, device_type type, const char *tag) :
+ hh_pic16_state(mconfig, type, tag)
{ }
void prepare_display();
@@ -1507,6 +1566,18 @@ void ttfball_state::ttfball(machine_config &config)
SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25);
}
+// roms
+
+ROM_START( ttfball )
+ ROM_REGION( 0x0400, "maincpu", 0 )
+ ROM_LOAD( "pic_1655a-033", 0x0000, 0x0400, CRC(2b500501) SHA1(f7fe464663c56e2181a31a1dc5f1f5239df57bed) )
+ROM_END
+
+ROM_START( ttfballa )
+ ROM_REGION( 0x0400, "maincpu", 0 )
+ ROM_LOAD( "pic_1655-024", 0x0000, 0x0400, CRC(9091102f) SHA1(ef72759f20b5a99e0366863caad1e26be114263f) )
+ROM_END
+
@@ -1526,8 +1597,8 @@ void ttfball_state::ttfball(machine_config &config)
class uspbball_state : public hh_pic16_state
{
public:
- uspbball_state(const machine_config &mconfig, device_type type, const char *tag)
- : hh_pic16_state(mconfig, type, tag)
+ uspbball_state(const machine_config &mconfig, device_type type, const char *tag) :
+ hh_pic16_state(mconfig, type, tag)
{ }
void prepare_display();
@@ -1617,6 +1688,13 @@ void uspbball_state::uspbball(machine_config &config)
SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25);
}
+// roms
+
+ROM_START( uspbball )
+ ROM_REGION( 0x0400, "maincpu", 0 )
+ ROM_LOAD( "pic_1650a-133", 0x0000, 0x0400, CRC(479e98be) SHA1(67437177b059dfa6e01940da26daf997cec96ead) )
+ROM_END
+
@@ -1636,8 +1714,8 @@ void uspbball_state::uspbball(machine_config &config)
class us2pfball_state : public hh_pic16_state
{
public:
- us2pfball_state(const machine_config &mconfig, device_type type, const char *tag)
- : hh_pic16_state(mconfig, type, tag)
+ us2pfball_state(const machine_config &mconfig, device_type type, const char *tag) :
+ hh_pic16_state(mconfig, type, tag)
{ }
void prepare_display();
@@ -1751,93 +1829,22 @@ void us2pfball_state::us2pfball(machine_config &config)
SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25);
}
+// roms
-
-
-
-/***************************************************************************
-
- Game driver(s)
-
-***************************************************************************/
-
-ROM_START( touchme )
- ROM_REGION( 0x0400, "maincpu", 0 )
- ROM_LOAD( "pic_1655a-053", 0x0000, 0x0400, CRC(f0858f0a) SHA1(53ffe111d43db1c110847590350ef62f02ed5e0e) )
-ROM_END
-
-
-ROM_START( pabball )
- ROM_REGION( 0x0400, "maincpu", 0 )
- ROM_LOAD( "pic_1655a-043", 0x0000, 0x0400, CRC(43c9b765) SHA1(888a431bab9bcb241c14f33f70863fa2ad89c96b) )
-ROM_END
-
-
-ROM_START( melodym )
- ROM_REGION( 0x0400, "maincpu", 0 )
- ROM_LOAD( "pic_1655a-094", 0x0000, 0x0400, CRC(6d35bd7b) SHA1(20e326085878f69a9d4ef1651ef4443f27188567) )
-ROM_END
-
-
-ROM_START( maniac )
- ROM_REGION( 0x0400, "maincpu", 0 )
- ROM_LOAD( "pic_1655a-036", 0x0000, 0x0400, CRC(a96f7011) SHA1(e97ae44d3c1e74c7e1024bb0bdab03eecdc9f827) )
-ROM_END
-
-
-ROM_START( matchme )
- ROM_REGION( 0x0400, "maincpu", 0 )
- ROM_LOAD( "pic_1655a-049", 0x0000, 0x0400, CRC(fa3f4805) SHA1(57cbac18baa201927e99cd69cc2ffda4d2e642bb) )
-ROM_END
-
-
-ROM_START( leboom )
- ROM_REGION( 0x0400, "maincpu", 0 )
- ROM_LOAD( "pic_1655a-061", 0x0000, 0x0400, CRC(5880eea1) SHA1(e3795b347fd5df9de084da36e33f6b70fbc0b0ae) )
-ROM_END
-
-
-ROM_START( tbaskb )
- ROM_REGION( 0x0400, "maincpu", 0 )
- ROM_LOAD( "pic_1655a-051", 0x0000, 0x0400, CRC(92534b40) SHA1(7055e32846c913e68f7d35f279cd537f6325f4f2) )
-ROM_END
-
-
-ROM_START( rockpin )
- ROM_REGION( 0x0400, "maincpu", 0 )
- ROM_LOAD( "pic_1650a-110_69-11397", 0x0000, 0x0400, CRC(d5396e77) SHA1(952feaff70fde53a9eda84c54704520d50749e78) )
-ROM_END
-
-
-ROM_START( hccbaskb )
- ROM_REGION( 0x0400, "maincpu", 0 )
- ROM_LOAD( "69-11557", 0x0000, 0x0400, CRC(56e81079) SHA1(1933f87f82c4c53f953534dba7757c9afc52d5bc) )
-ROM_END
-
-
-ROM_START( ttfball )
- ROM_REGION( 0x0400, "maincpu", 0 )
- ROM_LOAD( "pic_1655a-033", 0x0000, 0x0400, CRC(2b500501) SHA1(f7fe464663c56e2181a31a1dc5f1f5239df57bed) )
-ROM_END
-
-ROM_START( ttfballa )
+ROM_START( us2pfball )
ROM_REGION( 0x0400, "maincpu", 0 )
- ROM_LOAD( "pic_1655-024", 0x0000, 0x0400, CRC(9091102f) SHA1(ef72759f20b5a99e0366863caad1e26be114263f) )
+ ROM_LOAD( "pic_1650a-144", 0x0000, 0x0400, CRC(ef3677c9) SHA1(33f89c79e7e090710681dffe09eddaf66b5cb794) )
ROM_END
-ROM_START( uspbball )
- ROM_REGION( 0x0400, "maincpu", 0 )
- ROM_LOAD( "pic_1650a-133", 0x0000, 0x0400, CRC(479e98be) SHA1(67437177b059dfa6e01940da26daf997cec96ead) )
-ROM_END
+} // anonymous namespace
-ROM_START( us2pfball )
- ROM_REGION( 0x0400, "maincpu", 0 )
- ROM_LOAD( "pic_1650a-144", 0x0000, 0x0400, CRC(ef3677c9) SHA1(33f89c79e7e090710681dffe09eddaf66b5cb794) )
-ROM_END
+/***************************************************************************
+ Game driver(s)
+***************************************************************************/
// YEAR NAME PARENT CMP MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS
CONS( 1979, touchme, 0, 0, touchme, touchme, touchme_state, empty_init, "Atari", "Touch Me (handheld, Rev 2)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK )
@@ -1850,7 +1857,7 @@ CONS( 1979, maniac, 0, 0, maniac, maniac, maniac_state, empty_
CONS( 1980, matchme, 0, 0, matchme, matchme, matchme_state, empty_init, "Kingsford", "Match Me", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK )
-CONS( 1980, leboom, 0, 0, leboom, leboom, leboom_state, empty_init, "Lakeside", "Le Boom", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND | MACHINE_CLICKABLE_ARTWORK )
+CONS( 1980, leboom, 0, 0, leboom, leboom, leboom_state, empty_init, "Lakeside", "Le Boom", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK )
CONS( 1979, tbaskb, 0, 0, tbaskb, tbaskb, tbaskb_state, empty_init, "Tandy Radio Shack", "Electronic Basketball (Tandy)", MACHINE_SUPPORTS_SAVE )
diff --git a/src/mame/drivers/hh_sm510.cpp b/src/mame/drivers/hh_sm510.cpp
index 14f55c1aa53..a6d6e80b39d 100644
--- a/src/mame/drivers/hh_sm510.cpp
+++ b/src/mame/drivers/hh_sm510.cpp
@@ -3,17 +3,101 @@
// thanks-to:Igor, ChoccyHobNob, RColtrane
/***************************************************************************
- Sharp SM5xx family handhelds.
- List of child drivers:
- - rzone: Tiger R-Zone
-
- The LCD screen graphics are provided internally with an SVG file.
- MAME external artwork is recommended for the backgrounds inlays.
-
- TODO:
- - improve/redo SVGs of: gnw_mmouse, gnw_egg, exospace
- - confirm gnw_mmouse/gnw_egg rom (dumped from Soviet clone, but pretty confident that it's same)
- - identify lcd segments for tgaiden
+Sharp SM5xx family handhelds.
+List of child drivers:
+- rzone: Tiger R-Zone
+
+The LCD screen graphics are provided internally with an SVG file.
+MAME external artwork is recommended for the backgrounds inlays.
+
+TODO:
+- improve/redo SVGs of: gnw_mmouse, gnw_egg, exospace
+- confirm gnw_mmouse/gnw_egg rom (dumped from Soviet clone, but pretty
+ confident that it's same)
+- Currently there is no accurate way to dump the SM511/SM511 melody ROM
+ electronically. For the ones that weren't decapped, they were read by
+ playing back all melody data and reconstructing it to ROM. Visual(decap)
+ verification is wanted for: gnw_bfight, gnw_bjack, gnw_climber
+- identify lcd segments for tgaiden
+
+****************************************************************************
+
+Misc Nintendo Game & Watch notes:
+
+Trivia: Most of the Nintendo G&W have built-in cheats, likely kept in by
+Nintendo to test the game. These were not accessible to users of course,
+but for the sake of fun they're (usually) available on MAME.
+
+BTANB: On some of the earlier G&W games, eg. gnw_mmouse, gnw_pchute, gnw_fire,
+the controls still work after game over, this happens on the real thing too.
+
+Game list (* denotes not emulated yet)
+
+Serial Series MCU Title
+---------------------------------------------
+AC-01* s ? Ball (aka Toss-Up)
+FL-02* s ? Flagman
+MT-03* s ? Vermin (aka The Exterminator)
+RC-04* s ? Fire (aka Fireman Fireman)
+IP-05* g ? Judge
+MN-06* g ? Manhole
+CN-07* g ? Helmet (aka Headache)
+LN-08* g ? Lion
+PR-21 ws SM5A Parachute
+OC-22 ws SM5A Octopus
+PP-23* ws SM5A? Popeye
+FP-24* ws SM5A Chef
+MC-25 ws SM5A Mickey Mouse
+EG-26 ws SM5A Egg (near-certainly same ROM as MC-25, but LCD differs)
+FR-27 ws SM5A Fire
+TL-28 ws SM510 Turtle Bridge
+ID-29 ws SM510 Fire Attack
+SP-30 ws SM510 Snoopy Tennis
+OP-51 ms SM510 Oil Panic
+DK-52 ms SM510 Donkey Kong
+DM-53 ms SM510 Mickey & Donald
+GH-54 ms SM510 Green House
+JR-55 ms SM510 Donkey Kong II
+MW-56 ms SM510 Mario
+LP-57 ms SM510 Rain Shower
+TC-58 ms SM510 Life Boat
+PB-59* ms SM511? Pinball
+BJ-60 ms SM512 Black Jack
+MG-61 ms SM510 Squish
+BD-62* ms SM512 Bomb Sweeper
+JB-63* ms SM511? Safe Buster
+MV-64* ms SM511? Gold Cliff
+ZL-65* ms SM511? Zelda
+CJ-71* tt SM511? Donkey Kong Jr.
+CM-72* tt SM511? Mario's Cement Factory
+SM-73* tt SM511? Snoopy
+PG-74* tt SM511? Popeye
+SM-91* p SM511? Snoopy (assume same ROM & LCD as tabletop version)
+PG-92* p SM511? Popeye "
+CJ-93* p SM511? Donkey Kong Jr. "
+PB-94* p SM511? Mario's Bombs Away
+DC-95* p SM511? Mickey Mouse
+MK-96* p SM511? Donkey Kong Circus (same ROM as DC-95? LCD is different)
+DJ-101 nws SM510 Donkey Kong Jr.
+ML-102 nws SM510 Mario's Cement Factory
+NH-103 nws SM510 Manhole
+TF-104 nws SM510 Tropical Fish
+YM-105 nws SM511 Super Mario Bros.
+DR-106 nws SM511 Climber
+BF-107 nws SM511 Balloon Fight
+MJ-108* nws SM511? Mario The Juggler
+BU-201 sc SM510? Spitball Sparky
+UD-202* sc SM510? Crab Grab
+BX-301 mvs SM511 Boxing (aka Punch Out)
+AK-302* mvs SM511? Donkey Kong 3
+HK-303* mvs SM511? Donkey Kong Hockey
+YM-801* cs SM511 Super Mario Bros. (assume same ROM as nws version)
+DR-802* cs SM511 Climber "
+BF-803* cs SM511 Balloon Fight "
+YM-901-S* x SM511 Super Mario Bros. "
+
+RGW-001 (2010 Ball remake) is on different hardware, ATmega169PV MCU.
+The "Mini Classics" keychains are by Nelsonic, not Nintendo.
***************************************************************************/
@@ -21,13 +105,13 @@
#include "includes/hh_sm510.h"
#include "cpu/sm510/sm500.h"
-#include "rendlay.h"
#include "screen.h"
#include "speaker.h"
// internal artwork
#include "gnw_dualv.lh"
#include "gnw_dualh.lh"
+
//#include "hh_sm510_test.lh" // common test-layout - use external artwork
//#include "hh_sm500_test.lh" // "
@@ -39,10 +123,21 @@ void hh_sm510_state::machine_start()
// resolve handlers
m_out_x.resolve();
+ // determine number of input lines (set it in the subclass constructor if different)
+ if (m_inp_lines == 0 && m_inp_fixed < 0)
+ {
+ for (; m_inp_matrix[m_inp_lines] != nullptr; m_inp_lines++) { ; }
+
+ // when last input line is fixed(GND)
+ if (m_inp_fixed == -2)
+ {
+ m_inp_lines--;
+ m_inp_fixed = m_inp_lines;
+ }
+ }
+
// zerofill
m_inp_mux = 0;
- /* m_inp_lines = 0; */ // not here
- /* m_inp_fixed = -1; */ // not here
m_speaker_data = 0;
m_s = 0;
m_r = 0;
@@ -223,14 +318,14 @@ WRITE8_MEMBER(hh_sm510_state::piezo2bit_input_w)
-
-
/***************************************************************************
- Minidrivers (subclass, I/O, Inputs, Machine Config)
+ Minidrivers (subclass, I/O, Inputs, Machine Config, ROM Defs)
***************************************************************************/
+namespace {
+
/***************************************************************************
Konami Double Dribble
@@ -247,11 +342,9 @@ WRITE8_MEMBER(hh_sm510_state::piezo2bit_input_w)
class kdribble_state : public hh_sm510_state
{
public:
- kdribble_state(const machine_config &mconfig, device_type type, const char *tag)
- : hh_sm510_state(mconfig, type, tag)
- {
- m_inp_lines = 3;
- }
+ kdribble_state(const machine_config &mconfig, device_type type, const char *tag) :
+ hh_sm510_state(mconfig, type, tag)
+ { }
void kdribble(machine_config &config);
};
@@ -294,7 +387,7 @@ void kdribble_state::kdribble(machine_config &config)
screen.set_svg_region("svg");
screen.set_refresh_hz(50);
screen.set_size(1524, 1080);
- screen.set_visarea(0, 1524-1, 0, 1080-1);
+ screen.set_visarea_full();
TIMER(config, "display_decay").configure_periodic(FUNC(hh_sm510_state::display_decay_tick), attotime::from_msec(1));
@@ -303,6 +396,16 @@ void kdribble_state::kdribble(machine_config &config)
SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25);
}
+// roms
+
+ROM_START( kdribble )
+ ROM_REGION( 0x1000, "maincpu", 0 )
+ ROM_LOAD( "584", 0x0000, 0x1000, CRC(1d9022c8) SHA1(64567f9f161e830a0634d5c89917ab866c26c0f8) )
+
+ ROM_REGION( 450339, "svg", 0)
+ ROM_LOAD( "kdribble.svg", 0, 450339, CRC(86c3ecc4) SHA1(8dfaeb0f3b35d4b680daaa9f478a6f3decf6ea0a) )
+ROM_END
+
@@ -319,11 +422,9 @@ void kdribble_state::kdribble(machine_config &config)
class ktopgun_state : public hh_sm510_state
{
public:
- ktopgun_state(const machine_config &mconfig, device_type type, const char *tag)
- : hh_sm510_state(mconfig, type, tag)
- {
- m_inp_lines = 3;
- }
+ ktopgun_state(const machine_config &mconfig, device_type type, const char *tag) :
+ hh_sm510_state(mconfig, type, tag)
+ { }
void ktopgun(machine_config &config);
};
@@ -366,7 +467,7 @@ void ktopgun_state::ktopgun(machine_config &config)
screen.set_svg_region("svg");
screen.set_refresh_hz(50);
screen.set_size(1515, 1080);
- screen.set_visarea(0, 1515-1, 0, 1080-1);
+ screen.set_visarea_full();
TIMER(config, "display_decay").configure_periodic(FUNC(hh_sm510_state::display_decay_tick), attotime::from_msec(1));
@@ -376,6 +477,16 @@ void ktopgun_state::ktopgun(machine_config &config)
m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25);
}
+// roms
+
+ROM_START( ktopgun ) // except for filler/unused bytes, ROM listing in patent US5137277 "BH003 Top Gun" is same
+ ROM_REGION( 0x1000, "maincpu", 0 )
+ ROM_LOAD( "598", 0x0000, 0x1000, CRC(50870b35) SHA1(cda1260c2e1c180995eced04b7d7ff51616dcef5) )
+
+ ROM_REGION( 425832, "svg", 0)
+ ROM_LOAD( "ktopgun.svg", 0, 425832, CRC(dc488ac0) SHA1(5a47e5639cb1e61dad3f2169efb99efe3d75896f) )
+ROM_END
+
@@ -394,11 +505,9 @@ void ktopgun_state::ktopgun(machine_config &config)
class kcontra_state : public hh_sm510_state
{
public:
- kcontra_state(const machine_config &mconfig, device_type type, const char *tag)
- : hh_sm510_state(mconfig, type, tag)
- {
- m_inp_lines = 3;
- }
+ kcontra_state(const machine_config &mconfig, device_type type, const char *tag) :
+ hh_sm510_state(mconfig, type, tag)
+ { }
void kcontra(machine_config &config);
};
@@ -440,7 +549,7 @@ void kcontra_state::kcontra(machine_config &config)
screen.set_svg_region("svg");
screen.set_refresh_hz(50);
screen.set_size(1505, 1080);
- screen.set_visarea(0, 1505-1, 0, 1080-1);
+ screen.set_visarea_full();
TIMER(config, "display_decay").configure_periodic(FUNC(hh_sm510_state::display_decay_tick), attotime::from_msec(1));
@@ -450,6 +559,19 @@ void kcontra_state::kcontra(machine_config &config)
m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25);
}
+// roms
+
+ROM_START( kcontra ) // except for filler/unused bytes, ROM listing in patent US5120057 "BH002 C (Contra)" program/melody is same
+ ROM_REGION( 0x1000, "maincpu", 0 )
+ ROM_LOAD( "773.program", 0x0000, 0x1000, CRC(bf834877) SHA1(055dd56ec16d63afba61ab866481fd9c029fb54d) )
+
+ ROM_REGION( 0x100, "maincpu:melody", 0 )
+ ROM_LOAD( "773.melody", 0x000, 0x100, CRC(23d02b99) SHA1(703938e496db0eeacd14fe7605d4b5c39e0a5bc8) )
+
+ ROM_REGION( 721005, "svg", 0)
+ ROM_LOAD( "kcontra.svg", 0, 721005, CRC(b5370d0f) SHA1(2f401222d24fa32a4659ef2b64ddac8ac3973c69) )
+ROM_END
+
@@ -466,11 +588,9 @@ void kcontra_state::kcontra(machine_config &config)
class ktmnt_state : public hh_sm510_state
{
public:
- ktmnt_state(const machine_config &mconfig, device_type type, const char *tag)
- : hh_sm510_state(mconfig, type, tag)
- {
- m_inp_lines = 3;
- }
+ ktmnt_state(const machine_config &mconfig, device_type type, const char *tag) :
+ hh_sm510_state(mconfig, type, tag)
+ { }
void ktmnt(machine_config &config);
};
@@ -513,7 +633,7 @@ void ktmnt_state::ktmnt(machine_config &config)
screen.set_svg_region("svg");
screen.set_refresh_hz(50);
screen.set_size(1505, 1080);
- screen.set_visarea(0, 1505-1, 0, 1080-1);
+ screen.set_visarea_full();
TIMER(config, "display_decay").configure_periodic(FUNC(hh_sm510_state::display_decay_tick), attotime::from_msec(1));
@@ -523,6 +643,19 @@ void ktmnt_state::ktmnt(machine_config &config)
m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25);
}
+// roms
+
+ROM_START( ktmnt ) // except for filler/unused bytes, ROM listing in patent US5150899 "BH005 TMNT" program/melody is same
+ ROM_REGION( 0x1000, "maincpu", 0 )
+ ROM_LOAD( "774.program", 0x0000, 0x1000, CRC(a1064f87) SHA1(92156c35fbbb414007ee6804fe635128a741d5f1) )
+
+ ROM_REGION( 0x100, "maincpu:melody", 0 )
+ ROM_LOAD( "774.melody", 0x000, 0x100, CRC(8270d626) SHA1(bd91ca1d5cd7e2a62eef05c0033b19dcdbe441ca) )
+
+ ROM_REGION( 610270, "svg", 0)
+ ROM_LOAD( "ktmnt.svg", 0, 610270, CRC(ad9412ed) SHA1(154ee44efcd340dafa1cb84c37a9c3cd42cb42ab) )
+ROM_END
+
@@ -541,11 +674,9 @@ void ktmnt_state::ktmnt(machine_config &config)
class kgradius_state : public hh_sm510_state
{
public:
- kgradius_state(const machine_config &mconfig, device_type type, const char *tag)
- : hh_sm510_state(mconfig, type, tag)
- {
- m_inp_lines = 2;
- }
+ kgradius_state(const machine_config &mconfig, device_type type, const char *tag) :
+ hh_sm510_state(mconfig, type, tag)
+ { }
void kgradius(machine_config &config);
};
@@ -583,7 +714,7 @@ void kgradius_state::kgradius(machine_config &config)
screen.set_svg_region("svg");
screen.set_refresh_hz(50);
screen.set_size(1420, 1080);
- screen.set_visarea(0, 1420-1, 0, 1080-1);
+ screen.set_visarea_full();
TIMER(config, "display_decay").configure_periodic(FUNC(hh_sm510_state::display_decay_tick), attotime::from_msec(1));
@@ -593,6 +724,19 @@ void kgradius_state::kgradius(machine_config &config)
m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25);
}
+// roms
+
+ROM_START( kgradius )
+ ROM_REGION( 0x1000, "maincpu", 0 )
+ ROM_LOAD( "771.program", 0x0000, 0x1000, CRC(830c2afc) SHA1(bb9ebd4e52831cc02cd92dd4b37675f34cf37b8c) )
+
+ ROM_REGION( 0x100, "maincpu:melody", 0 )
+ ROM_LOAD( "771.melody", 0x000, 0x100, CRC(4c586b73) SHA1(14c5ab2898013a577f678970a648c374749cc66d) )
+
+ ROM_REGION( 638097, "svg", 0)
+ ROM_LOAD( "kgradius.svg", 0, 638097, CRC(3adbc0f1) SHA1(fe426bf2335ce30395ea14ecab6399a93c67816a) )
+ROM_END
+
@@ -609,11 +753,9 @@ void kgradius_state::kgradius(machine_config &config)
class kloneran_state : public hh_sm510_state
{
public:
- kloneran_state(const machine_config &mconfig, device_type type, const char *tag)
- : hh_sm510_state(mconfig, type, tag)
- {
- m_inp_lines = 2;
- }
+ kloneran_state(const machine_config &mconfig, device_type type, const char *tag) :
+ hh_sm510_state(mconfig, type, tag)
+ { }
void kloneran(machine_config &config);
};
@@ -651,7 +793,7 @@ void kloneran_state::kloneran(machine_config &config)
screen.set_svg_region("svg");
screen.set_refresh_hz(50);
screen.set_size(1497, 1080);
- screen.set_visarea(0, 1497-1, 0, 1080-1);
+ screen.set_visarea_full();
TIMER(config, "display_decay").configure_periodic(FUNC(hh_sm510_state::display_decay_tick), attotime::from_msec(1));
@@ -661,6 +803,19 @@ void kloneran_state::kloneran(machine_config &config)
m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25);
}
+// roms
+
+ROM_START( kloneran )
+ ROM_REGION( 0x1000, "maincpu", 0 )
+ ROM_LOAD( "781.program", 0x0000, 0x1000, CRC(52b9735f) SHA1(06c5ef6e7e781b1176d4c1f2445f765ccf18b3f7) )
+
+ ROM_REGION( 0x100, "maincpu:melody", 0 )
+ ROM_LOAD( "781.melody", 0x000, 0x100, CRC(a393de36) SHA1(55089f04833ccb318524ab2b584c4817505f4019) )
+
+ ROM_REGION( 633120, "svg", 0)
+ ROM_LOAD( "kloneran.svg", 0, 633120, CRC(f55e5292) SHA1(d0a91b5cd8a1894e7abc9c505fff4a8e1d3bec7a) )
+ROM_END
+
@@ -677,11 +832,9 @@ void kloneran_state::kloneran(machine_config &config)
class kblades_state : public hh_sm510_state
{
public:
- kblades_state(const machine_config &mconfig, device_type type, const char *tag)
- : hh_sm510_state(mconfig, type, tag)
- {
- m_inp_lines = 3;
- }
+ kblades_state(const machine_config &mconfig, device_type type, const char *tag) :
+ hh_sm510_state(mconfig, type, tag)
+ { }
void kblades(machine_config &config);
};
@@ -723,7 +876,8 @@ void kblades_state::kblades(machine_config &config)
screen.set_svg_region("svg");
screen.set_refresh_hz(50);
screen.set_size(1516, 1080);
- screen.set_visarea(0, 1516-1, 0, 1080-1);
+ screen.set_visarea_full();
+
TIMER(config, "display_decay").configure_periodic(FUNC(hh_sm510_state::display_decay_tick), attotime::from_msec(1));
/* sound hardware */
@@ -732,6 +886,19 @@ void kblades_state::kblades(machine_config &config)
m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25);
}
+// roms
+
+ROM_START( kblades )
+ ROM_REGION( 0x1000, "maincpu", 0 )
+ ROM_LOAD( "782.program", 0x0000, 0x1000, CRC(3351a35d) SHA1(84c64b65d3cabfa20c18f4649c9ede2578b82523) )
+
+ ROM_REGION( 0x100, "maincpu:melody", 0 )
+ ROM_LOAD( "782.melody", 0x000, 0x100, CRC(e8bf48ba) SHA1(3852c014dc9136566322b4f9e2aab0e3ec3a7387) )
+
+ ROM_REGION( 455113, "svg", 0)
+ ROM_LOAD( "kblades.svg", 0, 455113, CRC(e22f44c8) SHA1(ac95a837e20f87f3afc6c234f7407cbfcc438011) )
+ROM_END
+
@@ -750,11 +917,9 @@ void kblades_state::kblades(machine_config &config)
class knfl_state : public hh_sm510_state
{
public:
- knfl_state(const machine_config &mconfig, device_type type, const char *tag)
- : hh_sm510_state(mconfig, type, tag)
- {
- m_inp_lines = 3;
- }
+ knfl_state(const machine_config &mconfig, device_type type, const char *tag) :
+ hh_sm510_state(mconfig, type, tag)
+ { }
void knfl(machine_config &config);
};
@@ -796,7 +961,8 @@ void knfl_state::knfl(machine_config &config)
screen.set_svg_region("svg");
screen.set_refresh_hz(50);
screen.set_size(1449, 1080);
- screen.set_visarea(0, 1449-1, 0, 1080-1);
+ screen.set_visarea_full();
+
TIMER(config, "display_decay").configure_periodic(FUNC(hh_sm510_state::display_decay_tick), attotime::from_msec(1));
/* sound hardware */
@@ -805,6 +971,19 @@ void knfl_state::knfl(machine_config &config)
m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25);
}
+// roms
+
+ROM_START( knfl )
+ ROM_REGION( 0x1000, "maincpu", 0 )
+ ROM_LOAD( "786.program", 0x0000, 0x1000, CRC(0535c565) SHA1(44cdcd284713ff0b194b24beff9f1b94c8bc63b2) )
+
+ ROM_REGION( 0x100, "maincpu:melody", 0 )
+ ROM_LOAD( "786.melody", 0x000, 0x100, CRC(6c80263b) SHA1(d3c21e2f8491fef101907b8e0871b1e1c1ed58f5) )
+
+ ROM_REGION( 571134, "svg", 0)
+ ROM_LOAD( "knfl.svg", 0, 571134, CRC(f2c63235) SHA1(70b9232700f5498d3c63c63dd5904c0e19482cc2) )
+ROM_END
+
@@ -820,11 +999,9 @@ void knfl_state::knfl(machine_config &config)
class kbilly_state : public hh_sm510_state
{
public:
- kbilly_state(const machine_config &mconfig, device_type type, const char *tag)
- : hh_sm510_state(mconfig, type, tag)
- {
- m_inp_lines = 3;
- }
+ kbilly_state(const machine_config &mconfig, device_type type, const char *tag) :
+ hh_sm510_state(mconfig, type, tag)
+ { }
void kbilly(machine_config &config);
};
@@ -868,7 +1045,8 @@ void kbilly_state::kbilly(machine_config &config)
screen.set_svg_region("svg");
screen.set_refresh_hz(50);
screen.set_size(1490, 1080);
- screen.set_visarea(0, 1490-1, 0, 1080-1);
+ screen.set_visarea_full();
+
TIMER(config, "display_decay").configure_periodic(FUNC(hh_sm510_state::display_decay_tick), attotime::from_msec(1));
/* sound hardware */
@@ -877,6 +1055,19 @@ void kbilly_state::kbilly(machine_config &config)
m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25);
}
+// roms
+
+ROM_START( kbilly )
+ ROM_REGION( 0x1000, "maincpu", 0 )
+ ROM_LOAD( "788.program", 0x0000, 0x1000, CRC(b8b1f734) SHA1(619dd527187b43276d081cdb1b13e0a9a81f2c6a) )
+
+ ROM_REGION( 0x100, "maincpu:melody", 0 )
+ ROM_LOAD( "788.melody", 0x000, 0x100, CRC(cd488bea) SHA1(8fc60081f46e392978d6950c74711fb7ebd154de) )
+
+ ROM_REGION( 598276, "svg", 0)
+ ROM_LOAD( "kbilly.svg", 0, 598276, CRC(2969319e) SHA1(5cd1b0a6eee3168142c1d24f167b9ef38ad88402) )
+ROM_END
+
@@ -892,11 +1083,9 @@ void kbilly_state::kbilly(machine_config &config)
class kbucky_state : public hh_sm510_state
{
public:
- kbucky_state(const machine_config &mconfig, device_type type, const char *tag)
- : hh_sm510_state(mconfig, type, tag)
- {
- m_inp_lines = 2;
- }
+ kbucky_state(const machine_config &mconfig, device_type type, const char *tag) :
+ hh_sm510_state(mconfig, type, tag)
+ { }
void kbucky(machine_config &config);
};
@@ -934,7 +1123,8 @@ void kbucky_state::kbucky(machine_config &config)
screen.set_svg_region("svg");
screen.set_refresh_hz(50);
screen.set_size(1490, 1080);
- screen.set_visarea(0, 1490-1, 0, 1080-1);
+ screen.set_visarea_full();
+
TIMER(config, "display_decay").configure_periodic(FUNC(hh_sm510_state::display_decay_tick), attotime::from_msec(1));
/* sound hardware */
@@ -943,6 +1133,19 @@ void kbucky_state::kbucky(machine_config &config)
m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25);
}
+// roms
+
+ROM_START( kbucky )
+ ROM_REGION( 0x1000, "maincpu", 0 )
+ ROM_LOAD( "n58.program", 0x0000, 0x1000, CRC(7c36a0c4) SHA1(1b55ac64a71af746fd0a0f44266fcc92cca77482) )
+
+ ROM_REGION( 0x100, "maincpu:melody", 0 )
+ ROM_LOAD( "n58.melody", 0x000, 0x100, CRC(7e99e469) SHA1(3e9a3843c6ab392f5989f3366df87a2d26cb8620) )
+
+ ROM_REGION( 727841, "svg", 0)
+ ROM_LOAD( "kbucky.svg", 0, 727841, CRC(c1d78488) SHA1(9ba4fdbce977455b8f1ad4bd2b01faa44bd05bc7) )
+ROM_END
+
@@ -958,11 +1161,9 @@ void kbucky_state::kbucky(machine_config &config)
class kgarfld_state : public hh_sm510_state
{
public:
- kgarfld_state(const machine_config &mconfig, device_type type, const char *tag)
- : hh_sm510_state(mconfig, type, tag)
- {
- m_inp_lines = 3;
- }
+ kgarfld_state(const machine_config &mconfig, device_type type, const char *tag) :
+ hh_sm510_state(mconfig, type, tag)
+ { }
void kgarfld(machine_config &config);
};
@@ -1004,7 +1205,187 @@ void kgarfld_state::kgarfld(machine_config &config)
screen.set_svg_region("svg");
screen.set_refresh_hz(50);
screen.set_size(1500, 1080);
- screen.set_visarea(0, 1500-1, 0, 1080-1);
+ screen.set_visarea_full();
+
+ TIMER(config, "display_decay").configure_periodic(FUNC(hh_sm510_state::display_decay_tick), attotime::from_msec(1));
+
+ /* sound hardware */
+ SPEAKER(config, "mono").front_center();
+ SPEAKER_SOUND(config, m_speaker);
+ m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25);
+}
+
+// roms
+
+ROM_START( kgarfld )
+ ROM_REGION( 0x1000, "maincpu", 0 )
+ ROM_LOAD( "n62.program", 0x0000, 0x1000, CRC(5a762049) SHA1(26d4d891160d254dfd752734e1047126243f88dd) )
+
+ ROM_REGION( 0x100, "maincpu:melody", 0 )
+ ROM_LOAD( "n62.melody", 0x000, 0x100, CRC(232b7d55) SHA1(76f6a19e8182ee3f00c9f4ef007b5dde75a9c00d) )
+
+ ROM_REGION( 581107, "svg", 0)
+ ROM_LOAD( "kgarfld.svg", 0, 581107, CRC(bf09a170) SHA1(075cb95535873018409eb15675183490c61b29b9) )
+ROM_END
+
+
+
+
+
+/***************************************************************************
+
+ Nintendo Game & Watch: Parachute (model PR-21)
+ * PCB label PR-21Y
+ * Sharp SM5A label PR-21 52XC (no decap)
+ * lcd screen with custom segments, 1-bit sound
+
+***************************************************************************/
+
+class gnw_pchute_state : public hh_sm510_state
+{
+public:
+ gnw_pchute_state(const machine_config &mconfig, device_type type, const char *tag) :
+ hh_sm510_state(mconfig, type, tag)
+ { }
+
+ void gnw_pchute(machine_config &config);
+};
+
+// config
+
+static INPUT_PORTS_START( gnw_pchute )
+ PORT_START("IN.0") // R2
+ PORT_BIT( 0x0f, IP_ACTIVE_HIGH, IPT_UNUSED )
+
+ PORT_START("IN.1") // R3
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) // * Infinite lives cheat here, but configuring it is weird:
+ PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNUSED ) // * One of the R3 inputs needs to be held down, followed
+ PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) // * by pressing ACL, then release.
+ PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) // alarm test?
+
+ PORT_START("IN.2") // R4
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_sm510_state, input_changed, nullptr) PORT_NAME("Time")
+ PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START2 ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_sm510_state, input_changed, nullptr) PORT_NAME("Game B")
+ PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_START1 ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_sm510_state, input_changed, nullptr) PORT_NAME("Game A")
+ PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_SERVICE2 ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_sm510_state, input_changed, nullptr) PORT_NAME("Alarm")
+
+ PORT_START("BA")
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_sm510_state, input_changed, nullptr) PORT_16WAY
+
+ PORT_START("B")
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_sm510_state, input_changed, nullptr) PORT_16WAY
+
+ PORT_START("ACL")
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_sm510_state, acl_button, nullptr) PORT_NAME("ACL")
+INPUT_PORTS_END
+
+void gnw_pchute_state::gnw_pchute(machine_config &config)
+{
+ /* basic machine hardware */
+ SM5A(config, m_maincpu);
+ m_maincpu->set_r_mask_option(sm510_base_device::RMASK_DIRECT); // confirmed
+ m_maincpu->write_segs().set(FUNC(hh_sm510_state::sm500_lcd_segment_w));
+ m_maincpu->read_k().set(FUNC(hh_sm510_state::input_r));
+ m_maincpu->write_r().set(FUNC(hh_sm510_state::piezo_input_w));
+ m_maincpu->read_ba().set_ioport("BA");
+ m_maincpu->read_b().set_ioport("B");
+
+ /* video hardware */
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_SVG));
+ screen.set_svg_region("svg");
+ screen.set_refresh_hz(50);
+ screen.set_size(1602, 1080);
+ screen.set_visarea_full();
+
+ TIMER(config, "display_decay").configure_periodic(FUNC(hh_sm510_state::display_decay_tick), attotime::from_msec(1));
+
+ /* sound hardware */
+ SPEAKER(config, "mono").front_center();
+ SPEAKER_SOUND(config, m_speaker);
+ m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25);
+}
+
+// roms
+
+ROM_START( gnw_pchute )
+ ROM_REGION( 0x1000, "maincpu", 0 )
+ ROM_LOAD( "pr-21", 0x0000, 0x0740, CRC(392b545e) SHA1(e71940cd4cee07ba1e62c1c7d9e9b19410e7232d) )
+
+ ROM_REGION( 169486, "svg", 0)
+ ROM_LOAD( "gnw_pchute.svg", 0, 169486, CRC(bf86e0f9) SHA1(d2fba49453afc4bd1f16613f833a8748b6a36764) )
+ROM_END
+
+
+
+
+
+/***************************************************************************
+
+ Nintendo Game & Watch: Octopus (model OC-22)
+ * PCB label OC-22Y A
+ * Sharp SM5A label OC-22 204A (no decap)
+ * lcd screen with custom segments, 1-bit sound
+
+***************************************************************************/
+
+class gnw_octopus_state : public hh_sm510_state
+{
+public:
+ gnw_octopus_state(const machine_config &mconfig, device_type type, const char *tag) :
+ hh_sm510_state(mconfig, type, tag)
+ { }
+
+ void gnw_octopus(machine_config &config);
+};
+
+// config
+
+static INPUT_PORTS_START( gnw_octopus )
+ PORT_START("IN.0") // R2
+ PORT_CONFNAME( 0x01, 0x00, "Invincibility (Cheat)")
+ PORT_CONFSETTING( 0x00, DEF_STR( Off ) )
+ PORT_CONFSETTING( 0x01, DEF_STR( On ) )
+ PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNUSED ) // same as 0x01?
+ PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) // "
+ PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) // "
+
+ PORT_START("IN.1") // R3
+ PORT_BIT( 0x0f, IP_ACTIVE_HIGH, IPT_UNUSED ) // alarm test?
+
+ PORT_START("IN.2") // R4
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_sm510_state, input_changed, nullptr) PORT_NAME("Time")
+ PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START2 ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_sm510_state, input_changed, nullptr) PORT_NAME("Game B")
+ PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_START1 ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_sm510_state, input_changed, nullptr) PORT_NAME("Game A")
+ PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_SERVICE2 ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_sm510_state, input_changed, nullptr) PORT_NAME("Alarm")
+
+ PORT_START("BA")
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_sm510_state, input_changed, nullptr) PORT_16WAY
+
+ PORT_START("B")
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_sm510_state, input_changed, nullptr) PORT_16WAY
+
+ PORT_START("ACL")
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_sm510_state, acl_button, nullptr) PORT_NAME("ACL")
+INPUT_PORTS_END
+
+void gnw_octopus_state::gnw_octopus(machine_config &config)
+{
+ /* basic machine hardware */
+ SM5A(config, m_maincpu);
+ m_maincpu->set_r_mask_option(sm510_base_device::RMASK_DIRECT); // confirmed
+ m_maincpu->write_segs().set(FUNC(hh_sm510_state::sm500_lcd_segment_w));
+ m_maincpu->read_k().set(FUNC(hh_sm510_state::input_r));
+ m_maincpu->write_r().set(FUNC(hh_sm510_state::piezo_input_w));
+ m_maincpu->read_ba().set_ioport("BA");
+ m_maincpu->read_b().set_ioport("B");
+
+ /* video hardware */
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_SVG));
+ screen.set_svg_region("svg");
+ screen.set_refresh_hz(50);
+ screen.set_size(1586, 1080);
+ screen.set_visarea_full();
+
TIMER(config, "display_decay").configure_periodic(FUNC(hh_sm510_state::display_decay_tick), attotime::from_msec(1));
/* sound hardware */
@@ -1013,6 +1394,16 @@ void kgarfld_state::kgarfld(machine_config &config)
m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25);
}
+// roms
+
+ROM_START( gnw_octopus )
+ ROM_REGION( 0x1000, "maincpu", 0 )
+ ROM_LOAD( "oc-22", 0x0000, 0x0740, CRC(bd27781d) SHA1(07b4feb9265c83b159f96c7e8ee1c61a2cc17dc5) )
+
+ ROM_REGION( 119681, "svg", 0)
+ ROM_LOAD( "gnw_octopus.svg", 0, 119681, CRC(39900430) SHA1(61b71c475365966257f5479eab992538ec235c11) )
+ROM_END
+
@@ -1037,11 +1428,9 @@ void kgarfld_state::kgarfld(machine_config &config)
class gnw_mmouse_state : public hh_sm510_state
{
public:
- gnw_mmouse_state(const machine_config &mconfig, device_type type, const char *tag)
- : hh_sm510_state(mconfig, type, tag)
- {
- m_inp_lines = 3;
- }
+ gnw_mmouse_state(const machine_config &mconfig, device_type type, const char *tag) :
+ hh_sm510_state(mconfig, type, tag)
+ { }
void exospace(machine_config &config);
void nupogodi(machine_config &config);
@@ -1098,7 +1487,7 @@ void gnw_mmouse_state::gnw_mmouse(machine_config &config)
screen.set_svg_region("svg");
screen.set_refresh_hz(50);
screen.set_size(1711, 1080);
- screen.set_visarea(0, 1711-1, 0, 1080-1);
+ screen.set_visarea_full();
TIMER(config, "display_decay").configure_periodic(FUNC(hh_sm510_state::display_decay_tick), attotime::from_msec(1));
@@ -1113,8 +1502,9 @@ void gnw_mmouse_state::gnw_egg(machine_config &config)
gnw_mmouse(config);
/* video hardware */
- subdevice<screen_device>("screen")->set_size(1694, 1080);
- subdevice<screen_device>("screen")->set_visarea(0, 1694-1, 0, 1080-1);
+ screen_device *screen = subdevice<screen_device>("screen");
+ screen->set_size(1694, 1080);
+ screen->set_visarea_full();
}
void gnw_mmouse_state::nupogodi(machine_config &config)
@@ -1130,8 +1520,9 @@ void gnw_mmouse_state::nupogodi(machine_config &config)
m_maincpu->read_ba().set_ioport("BA");
/* video hardware */
- subdevice<screen_device>("screen")->set_size(1715, 1080);
- subdevice<screen_device>("screen")->set_visarea(0, 1715-1, 0, 1080-1);
+ screen_device *screen = subdevice<screen_device>("screen");
+ screen->set_size(1715, 1080);
+ screen->set_visarea_full();
}
void gnw_mmouse_state::exospace(machine_config &config)
@@ -1139,10 +1530,404 @@ void gnw_mmouse_state::exospace(machine_config &config)
nupogodi(config);
/* video hardware */
- subdevice<screen_device>("screen")->set_size(1756, 1080);
- subdevice<screen_device>("screen")->set_visarea(0, 1756-1, 0, 1080-1);
+ screen_device *screen = subdevice<screen_device>("screen");
+ screen->set_size(1756, 1080);
+ screen->set_visarea_full();
+}
+
+// roms
+
+ROM_START( gnw_mmouse )
+ ROM_REGION( 0x1000, "maincpu", 0 )
+ ROM_LOAD( "mc-25", 0x0000, 0x0740, BAD_DUMP CRC(cb820c32) SHA1(7e94fc255f32db725d5aa9e196088e490c1a1443) ) // dumped from Soviet clone
+
+ ROM_REGION( 102453, "svg", 0)
+ ROM_LOAD( "gnw_mmouse.svg", 0, 102453, BAD_DUMP CRC(88cc7c49) SHA1(c000d51d1b99750116b97f9bafc0314ea506366d) )
+ROM_END
+
+ROM_START( gnw_egg )
+ ROM_REGION( 0x1000, "maincpu", 0 )
+ ROM_LOAD( "eg-26", 0x0000, 0x0740, BAD_DUMP CRC(cb820c32) SHA1(7e94fc255f32db725d5aa9e196088e490c1a1443) ) // dumped from Soviet clone
+
+ ROM_REGION( 102848, "svg", 0)
+ ROM_LOAD( "gnw_egg.svg", 0, 102848, BAD_DUMP CRC(742c2605) SHA1(984d430ad2ff47ad7a3f9b25b7d3f3d51b10cca5) )
+ROM_END
+
+ROM_START( nupogodi )
+ ROM_REGION( 0x1000, "maincpu", 0 )
+ ROM_LOAD( "nupogodi.bin", 0x0000, 0x0740, CRC(cb820c32) SHA1(7e94fc255f32db725d5aa9e196088e490c1a1443) )
+
+ ROM_REGION( 156974, "svg", 0)
+ ROM_LOAD( "nupogodi.svg", 0, 156974, CRC(8d522ec6) SHA1(67afeca5eebd16449353ea43070a6b919f7ba408) )
+ROM_END
+
+ROM_START( exospace )
+ ROM_REGION( 0x1000, "maincpu", 0 )
+ ROM_LOAD( "exospace.bin", 0x0000, 0x0740, CRC(553e2b09) SHA1(2b74f8437b881fbb62b61f25435a5bfc66872a9a) )
+
+ ROM_REGION( 66790, "svg", 0)
+ ROM_LOAD( "exospace.svg", 0, 66790, BAD_DUMP CRC(df31043a) SHA1(2d8caf42894df699e469652e5f448beaebbcc1ae) )
+ROM_END
+
+
+
+
+
+/***************************************************************************
+
+ Nintendo Game & Watch: Fire (model FR-27)
+ * PCB label FR-27
+ * Sharp SM5A label FR-27 523B (no decap)
+ * lcd screen with custom segments, 1-bit sound
+
+ This is the wide screen version, there's also a silver version.
+ Also copied by Elektronika as "Space Bridge", with different LCD.
+
+***************************************************************************/
+
+class gnw_fire_state : public hh_sm510_state
+{
+public:
+ gnw_fire_state(const machine_config &mconfig, device_type type, const char *tag) :
+ hh_sm510_state(mconfig, type, tag)
+ { }
+
+ void gnw_fire(machine_config &config);
+};
+
+// config
+
+static INPUT_PORTS_START( gnw_fire )
+ PORT_START("IN.0") // R2
+ PORT_CONFNAME( 0x01, 0x00, "Infinite Lives (Cheat)")
+ PORT_CONFSETTING( 0x00, DEF_STR( Off ) )
+ PORT_CONFSETTING( 0x01, DEF_STR( On ) )
+ PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNUSED ) // same as 0x01?
+ PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) // reset?
+ PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) // alarm test?
+
+ PORT_START("IN.1") // R3
+ PORT_BIT( 0x0f, IP_ACTIVE_HIGH, IPT_UNUSED ) // lcd test?
+
+ PORT_START("IN.2") // R4
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_sm510_state, input_changed, nullptr) PORT_NAME("Time")
+ PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START2 ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_sm510_state, input_changed, nullptr) PORT_NAME("Game B")
+ PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_START1 ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_sm510_state, input_changed, nullptr) PORT_NAME("Game A")
+ PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_SERVICE2 ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_sm510_state, input_changed, nullptr) PORT_NAME("Alarm")
+
+ PORT_START("BA")
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_sm510_state, input_changed, nullptr) PORT_16WAY
+
+ PORT_START("B")
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_sm510_state, input_changed, nullptr) PORT_16WAY
+
+ PORT_START("ACL")
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_sm510_state, acl_button, nullptr) PORT_NAME("ACL")
+INPUT_PORTS_END
+
+void gnw_fire_state::gnw_fire(machine_config &config)
+{
+ /* basic machine hardware */
+ SM5A(config, m_maincpu);
+ m_maincpu->set_r_mask_option(sm510_base_device::RMASK_DIRECT); // confirmed
+ m_maincpu->write_segs().set(FUNC(hh_sm510_state::sm500_lcd_segment_w));
+ m_maincpu->read_k().set(FUNC(hh_sm510_state::input_r));
+ m_maincpu->write_r().set(FUNC(hh_sm510_state::piezo_input_w));
+ m_maincpu->read_ba().set_ioport("BA");
+ m_maincpu->read_b().set_ioport("B");
+
+ /* video hardware */
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_SVG));
+ screen.set_svg_region("svg");
+ screen.set_refresh_hz(50);
+ screen.set_size(1624, 1080);
+ screen.set_visarea_full();
+
+ TIMER(config, "display_decay").configure_periodic(FUNC(hh_sm510_state::display_decay_tick), attotime::from_msec(1));
+
+ /* sound hardware */
+ SPEAKER(config, "mono").front_center();
+ SPEAKER_SOUND(config, m_speaker);
+ m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25);
+}
+
+// roms
+
+ROM_START( gnw_fire )
+ ROM_REGION( 0x1000, "maincpu", 0 )
+ ROM_LOAD( "fr-27", 0x0000, 0x0740, CRC(f4c53ef0) SHA1(6b57120a0f9d2fd4dcd65ad57a5f32def71d905f) )
+
+ ROM_REGION( 163753, "svg", 0)
+ ROM_LOAD( "gnw_fire.svg", 0, 163753, CRC(d546fa42) SHA1(492c785aa0ed33ff1ac8c84066e5b6d7cb7d1566) )
+ROM_END
+
+
+
+
+
+/***************************************************************************
+
+ Nintendo Game & Watch: Turtle Bridge (model TL-28)
+ * PCB label TL-28
+ * Sharp SM510 label TL-28 523C (no decap)
+ * lcd screen with custom segments, 1-bit sound
+
+***************************************************************************/
+
+class gnw_tbridge_state : public hh_sm510_state
+{
+public:
+ gnw_tbridge_state(const machine_config &mconfig, device_type type, const char *tag) :
+ hh_sm510_state(mconfig, type, tag)
+ { }
+
+ void gnw_tbridge(machine_config &config);
+};
+
+// config
+
+static INPUT_PORTS_START( gnw_tbridge )
+ PORT_START("IN.0") // S1
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_sm510_state, input_changed, nullptr) PORT_16WAY
+ PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNUSED )
+ PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED )
+ PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_sm510_state, input_changed, nullptr) PORT_16WAY
+
+ PORT_START("IN.1") // S2
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_sm510_state, input_changed, nullptr) PORT_NAME("Time")
+ PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START2 ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_sm510_state, input_changed, nullptr) PORT_NAME("Game B")
+ PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_START1 ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_sm510_state, input_changed, nullptr) PORT_NAME("Game A")
+ PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_SERVICE2 ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_sm510_state, input_changed, nullptr) PORT_NAME("Alarm")
+
+ PORT_START("ACL")
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_sm510_state, acl_button, nullptr) PORT_NAME("ACL")
+
+ PORT_START("BA") // MCU BA(alpha) pin pulled to GND
+ PORT_CONFNAME( 0x01, 0x01, "Increase Score (Cheat)")
+ PORT_CONFSETTING( 0x01, DEF_STR( Off ) )
+ PORT_CONFSETTING( 0x00, DEF_STR( On ) )
+
+ PORT_START("B") // MCU B(beta) pin pulled to GND
+ PORT_CONFNAME( 0x01, 0x01, "Infinite Lives (Cheat)")
+ PORT_CONFSETTING( 0x01, DEF_STR( Off ) )
+ PORT_CONFSETTING( 0x00, DEF_STR( On ) )
+INPUT_PORTS_END
+
+void gnw_tbridge_state::gnw_tbridge(machine_config &config)
+{
+ /* basic machine hardware */
+ SM510(config, m_maincpu);
+ m_maincpu->set_r_mask_option(2); // confirmed
+ m_maincpu->write_segs().set(FUNC(hh_sm510_state::sm510_lcd_segment_w));
+ m_maincpu->read_k().set(FUNC(hh_sm510_state::input_r));
+ m_maincpu->write_s().set(FUNC(hh_sm510_state::input_w));
+ m_maincpu->write_r().set(FUNC(hh_sm510_state::piezo_r1_w));
+ m_maincpu->read_ba().set_ioport("BA");
+ m_maincpu->read_b().set_ioport("B");
+
+ /* video hardware */
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_SVG));
+ screen.set_svg_region("svg");
+ screen.set_refresh_hz(50);
+ screen.set_size(1587, 1080);
+ screen.set_visarea_full();
+
+ TIMER(config, "display_decay").configure_periodic(FUNC(hh_sm510_state::display_decay_tick), attotime::from_msec(1));
+
+ /* sound hardware */
+ SPEAKER(config, "mono").front_center();
+ SPEAKER_SOUND(config, m_speaker);
+ m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25);
+}
+
+// roms
+
+ROM_START( gnw_tbridge )
+ ROM_REGION( 0x1000, "maincpu", 0 )
+ ROM_LOAD( "tl-28", 0x0000, 0x1000, CRC(284e7224) SHA1(b50d7f3a527ffe50771ef55fdf8214929bfa2253) )
+
+ ROM_REGION( 242781, "svg", 0)
+ ROM_LOAD( "gnw_tbridge.svg", 0, 242781, CRC(c0473e53) SHA1(bb43f12f517a3b657b5b35b50baf176e01ce041d) )
+ROM_END
+
+
+
+
+
+/***************************************************************************
+
+ Nintendo Game & Watch: Fire Attack (model ID-29)
+ * PCB label ID-29
+ * Sharp SM510 label ID-29 524B (no decap)
+ * lcd screen with custom segments, 1-bit sound
+
+***************************************************************************/
+
+class gnw_fireatk_state : public hh_sm510_state
+{
+public:
+ gnw_fireatk_state(const machine_config &mconfig, device_type type, const char *tag) :
+ hh_sm510_state(mconfig, type, tag)
+ { }
+
+ void gnw_fireatk(machine_config &config);
+};
+
+// config
+
+static INPUT_PORTS_START( gnw_fireatk )
+ PORT_START("IN.0") // S1
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICKRIGHT_DOWN ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_sm510_state, input_changed, nullptr) PORT_16WAY
+ PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICKRIGHT_UP ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_sm510_state, input_changed, nullptr) PORT_16WAY
+ PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICKLEFT_UP ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_sm510_state, input_changed, nullptr) PORT_16WAY
+ PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICKLEFT_DOWN ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_sm510_state, input_changed, nullptr) PORT_16WAY
+
+ PORT_START("IN.1") // S2
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_sm510_state, input_changed, nullptr) PORT_NAME("Time")
+ PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START2 ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_sm510_state, input_changed, nullptr) PORT_NAME("Game B")
+ PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_START1 ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_sm510_state, input_changed, nullptr) PORT_NAME("Game A")
+ PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_SERVICE2 ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_sm510_state, input_changed, nullptr) PORT_NAME("Alarm")
+
+ PORT_START("ACL")
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_sm510_state, acl_button, nullptr) PORT_NAME("ACL")
+
+ PORT_START("BA") // MCU BA(alpha) pin pulled to GND
+ PORT_CONFNAME( 0x01, 0x01, "Increase Score (Cheat)")
+ PORT_CONFSETTING( 0x01, DEF_STR( Off ) )
+ PORT_CONFSETTING( 0x00, DEF_STR( On ) )
+
+ PORT_START("B") // MCU B(beta) pin pulled to GND
+ PORT_CONFNAME( 0x01, 0x01, "Infinite Lives (Cheat)")
+ PORT_CONFSETTING( 0x01, DEF_STR( Off ) )
+ PORT_CONFSETTING( 0x00, DEF_STR( On ) )
+INPUT_PORTS_END
+
+void gnw_fireatk_state::gnw_fireatk(machine_config &config)
+{
+ /* basic machine hardware */
+ SM510(config, m_maincpu);
+ m_maincpu->set_r_mask_option(2); // confirmed
+ m_maincpu->write_segs().set(FUNC(hh_sm510_state::sm510_lcd_segment_w));
+ m_maincpu->read_k().set(FUNC(hh_sm510_state::input_r));
+ m_maincpu->write_s().set(FUNC(hh_sm510_state::input_w));
+ m_maincpu->write_r().set(FUNC(hh_sm510_state::piezo_r1_w));
+ m_maincpu->read_ba().set_ioport("BA");
+ m_maincpu->read_b().set_ioport("B");
+
+ /* video hardware */
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_SVG));
+ screen.set_svg_region("svg");
+ screen.set_refresh_hz(50);
+ screen.set_size(1655, 1080);
+ screen.set_visarea_full();
+
+ TIMER(config, "display_decay").configure_periodic(FUNC(hh_sm510_state::display_decay_tick), attotime::from_msec(1));
+
+ /* sound hardware */
+ SPEAKER(config, "mono").front_center();
+ SPEAKER_SOUND(config, m_speaker);
+ m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25);
+}
+
+// roms
+
+ROM_START( gnw_fireatk )
+ ROM_REGION( 0x1000, "maincpu", 0 )
+ ROM_LOAD( "id-29", 0x0000, 0x1000, CRC(5f6e8042) SHA1(63afc3acd8a2a996095fa8ba2dfccd48e5214478) )
+
+ ROM_REGION( 267755, "svg", 0)
+ ROM_LOAD( "gnw_fireatk.svg", 0, 267755, CRC(b13ee452) SHA1(4d1e7e10fd2352bdd805c25de8c0e16bcd8b2220) )
+ROM_END
+
+
+
+
+
+/***************************************************************************
+
+ Nintendo Game & Watch: Snoopy Tennis (model SP-30)
+ * PCB label SP-30
+ * Sharp SM510 label SP-30 525B (no decap)
+ * lcd screen with custom segments, 1-bit sound
+
+***************************************************************************/
+
+class gnw_stennis_state : public hh_sm510_state
+{
+public:
+ gnw_stennis_state(const machine_config &mconfig, device_type type, const char *tag) :
+ hh_sm510_state(mconfig, type, tag)
+ { }
+
+ void gnw_stennis(machine_config &config);
+};
+
+// config
+
+static INPUT_PORTS_START( gnw_stennis )
+ PORT_START("IN.0") // S1
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_sm510_state, input_changed, nullptr) PORT_16WAY
+ PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_sm510_state, input_changed, nullptr) PORT_16WAY
+ PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED )
+ PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_sm510_state, input_changed, nullptr) // Hit
+
+ PORT_START("IN.1") // S2
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_sm510_state, input_changed, nullptr) PORT_NAME("Time")
+ PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START2 ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_sm510_state, input_changed, nullptr) PORT_NAME("Game B")
+ PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_START1 ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_sm510_state, input_changed, nullptr) PORT_NAME("Game A")
+ PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_SERVICE2 ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_sm510_state, input_changed, nullptr) PORT_NAME("Alarm")
+
+ PORT_START("ACL")
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_sm510_state, acl_button, nullptr) PORT_NAME("ACL")
+
+ PORT_START("BA") // MCU BA(alpha) pin pulled to GND
+ PORT_CONFNAME( 0x01, 0x01, "Increase Score (Cheat)")
+ PORT_CONFSETTING( 0x01, DEF_STR( Off ) )
+ PORT_CONFSETTING( 0x00, DEF_STR( On ) )
+
+ PORT_START("B") // MCU B(beta) pin pulled to GND
+ PORT_CONFNAME( 0x01, 0x01, "Infinite Lives (Cheat)")
+ PORT_CONFSETTING( 0x01, DEF_STR( Off ) )
+ PORT_CONFSETTING( 0x00, DEF_STR( On ) )
+INPUT_PORTS_END
+
+void gnw_stennis_state::gnw_stennis(machine_config &config)
+{
+ /* basic machine hardware */
+ SM510(config, m_maincpu);
+ m_maincpu->set_r_mask_option(2); // confirmed
+ m_maincpu->write_segs().set(FUNC(hh_sm510_state::sm510_lcd_segment_w));
+ m_maincpu->read_k().set(FUNC(hh_sm510_state::input_r));
+ m_maincpu->write_s().set(FUNC(hh_sm510_state::input_w));
+ m_maincpu->write_r().set(FUNC(hh_sm510_state::piezo_r1_w));
+ m_maincpu->read_ba().set_ioport("BA");
+ m_maincpu->read_b().set_ioport("B");
+
+ /* video hardware */
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_SVG));
+ screen.set_svg_region("svg");
+ screen.set_refresh_hz(50);
+ screen.set_size(1581, 1080);
+ screen.set_visarea_full();
+
+ TIMER(config, "display_decay").configure_periodic(FUNC(hh_sm510_state::display_decay_tick), attotime::from_msec(1));
+
+ /* sound hardware */
+ SPEAKER(config, "mono").front_center();
+ SPEAKER_SOUND(config, m_speaker);
+ m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25);
}
+// roms
+
+ROM_START( gnw_stennis )
+ ROM_REGION( 0x1000, "maincpu", 0 )
+ ROM_LOAD( "sp-30", 0x0000, 0x1000, CRC(ba1d9504) SHA1(ff601765d88564b1570a59f5b1a4005c7b0fd66c) )
+
+ ROM_REGION( 227964, "svg", 0)
+ ROM_LOAD( "gnw_stennis.svg", 0, 227964, CRC(1bb5f99a) SHA1(2e999c75598448e3502e7bab16e987d80d6a301f) )
+ROM_END
+
@@ -1159,11 +1944,9 @@ void gnw_mmouse_state::exospace(machine_config &config)
class gnw_opanic_state : public hh_sm510_state
{
public:
- gnw_opanic_state(const machine_config &mconfig, device_type type, const char *tag)
- : hh_sm510_state(mconfig, type, tag)
- {
- m_inp_lines = 2;
- }
+ gnw_opanic_state(const machine_config &mconfig, device_type type, const char *tag) :
+ hh_sm510_state(mconfig, type, tag)
+ { }
void gnw_opanic(machine_config &config);
};
@@ -1214,13 +1997,13 @@ void gnw_opanic_state::gnw_opanic(machine_config &config)
screen_top.set_svg_region("svg_top");
screen_top.set_refresh_hz(50);
screen_top.set_size(1920/2, 1292/2);
- screen_top.set_visarea(0, 1920/2-1, 0, 1292/2-1);
+ screen_top.set_visarea_full();
screen_device &screen_bottom(SCREEN(config, "screen_bottom", SCREEN_TYPE_SVG));
screen_bottom.set_svg_region("svg_bottom");
screen_bottom.set_refresh_hz(50);
screen_bottom.set_size(1920/2, 1230/2);
- screen_bottom.set_visarea(0, 1920/2-1, 0, 1230/2-1);
+ screen_bottom.set_visarea_full();
TIMER(config, "display_decay").configure_periodic(FUNC(hh_sm510_state::display_decay_tick), attotime::from_msec(1));
config.set_default_layout(layout_gnw_dualv);
@@ -1231,6 +2014,19 @@ void gnw_opanic_state::gnw_opanic(machine_config &config)
m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25);
}
+// roms
+
+ROM_START( gnw_opanic )
+ ROM_REGION( 0x1000, "maincpu", 0 )
+ ROM_LOAD( "op-51", 0x0000, 0x1000, CRC(31c288c9) SHA1(4bfd0fba94a9927cefc925db8196b063c5dd9b19) )
+
+ ROM_REGION( 79616, "svg_top", 0)
+ ROM_LOAD( "gnw_opanic_top.svg", 0, 79616, CRC(208dccc5) SHA1(b3cd3dcc8a00ba3b1b8d93d902f756fe579e4dfc) )
+
+ ROM_REGION( 112809, "svg_bottom", 0)
+ ROM_LOAD( "gnw_opanic_bottom.svg", 0, 112809, CRC(919b9649) SHA1(f3d3c8ca3fed81782a1fcb5a7aff07faea86db07) )
+ROM_END
+
@@ -1247,11 +2043,9 @@ void gnw_opanic_state::gnw_opanic(machine_config &config)
class gnw_dkong_state : public hh_sm510_state
{
public:
- gnw_dkong_state(const machine_config &mconfig, device_type type, const char *tag)
- : hh_sm510_state(mconfig, type, tag)
- {
- m_inp_lines = 3;
- }
+ gnw_dkong_state(const machine_config &mconfig, device_type type, const char *tag) :
+ hh_sm510_state(mconfig, type, tag)
+ { }
void gnw_dkong(machine_config &config);
};
@@ -1300,13 +2094,13 @@ void gnw_dkong_state::gnw_dkong(machine_config &config)
screen_top.set_svg_region("svg_top");
screen_top.set_refresh_hz(50);
screen_top.set_size(1920/2, 1266/2);
- screen_top.set_visarea(0, 1920/2-1, 0, 1266/2-1);
+ screen_top.set_visarea_full();
screen_device &screen_bottom(SCREEN(config, "screen_bottom", SCREEN_TYPE_SVG));
screen_bottom.set_svg_region("svg_bottom");
screen_bottom.set_refresh_hz(50);
screen_bottom.set_size(1920/2, 1266/2);
- screen_bottom.set_visarea(0, 1920/2-1, 0, 1266/2-1);
+ screen_bottom.set_visarea_full();
TIMER(config, "display_decay").configure_periodic(FUNC(hh_sm510_state::display_decay_tick), attotime::from_msec(1));
config.set_default_layout(layout_gnw_dualv);
@@ -1317,6 +2111,19 @@ void gnw_dkong_state::gnw_dkong(machine_config &config)
m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25);
}
+// roms
+
+ROM_START( gnw_dkong )
+ ROM_REGION( 0x1000, "maincpu", 0 )
+ ROM_LOAD( "dk-52", 0x0000, 0x1000, CRC(5180cbf8) SHA1(5174570a8d6a601226f51e972bac6735535fe11d) )
+
+ ROM_REGION( 176706, "svg_top", 0)
+ ROM_LOAD( "gnw_dkong_top.svg", 0, 176706, CRC(db041556) SHA1(fb0f979dea3ecd25288d341fa80e35b5fd0a8349) )
+
+ ROM_REGION( 145397, "svg_bottom", 0)
+ ROM_LOAD( "gnw_dkong_bottom.svg", 0, 145397, CRC(2c8c9d08) SHA1(658fd0bbccaabb0645b02e5cb81709c4b2a4250e) )
+ROM_END
+
@@ -1333,11 +2140,9 @@ void gnw_dkong_state::gnw_dkong(machine_config &config)
class gnw_mickdon_state : public hh_sm510_state
{
public:
- gnw_mickdon_state(const machine_config &mconfig, device_type type, const char *tag)
- : hh_sm510_state(mconfig, type, tag)
- {
- m_inp_lines = 2;
- }
+ gnw_mickdon_state(const machine_config &mconfig, device_type type, const char *tag) :
+ hh_sm510_state(mconfig, type, tag)
+ { }
void gnw_mickdon(machine_config &config);
};
@@ -1382,13 +2187,13 @@ void gnw_mickdon_state::gnw_mickdon(machine_config &config)
screen_top.set_svg_region("svg_top");
screen_top.set_refresh_hz(50);
screen_top.set_size(1920/2, 1281/2);
- screen_top.set_visarea(0, 1920/2-1, 0, 1281/2-1);
+ screen_top.set_visarea_full();
screen_device &screen_bottom(SCREEN(config, "screen_bottom", SCREEN_TYPE_SVG));
screen_bottom.set_svg_region("svg_bottom");
screen_bottom.set_refresh_hz(50);
screen_bottom.set_size(1920/2, 1236/2);
- screen_bottom.set_visarea(0, 1920/2-1, 0, 1236/2-1);
+ screen_bottom.set_visarea_full();
TIMER(config, "display_decay").configure_periodic(FUNC(hh_sm510_state::display_decay_tick), attotime::from_msec(1));
config.set_default_layout(layout_gnw_dualv);
@@ -1399,6 +2204,19 @@ void gnw_mickdon_state::gnw_mickdon(machine_config &config)
m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25);
}
+// roms
+
+ROM_START( gnw_mickdon )
+ ROM_REGION( 0x1000, "maincpu", 0 )
+ ROM_LOAD( "dm-53_565", 0x0000, 0x1000, CRC(e21fc0f5) SHA1(3b65ccf9f98813319410414e11a3231b787cdee6) )
+
+ ROM_REGION( 126434, "svg_top", 0)
+ ROM_LOAD( "gnw_mickdon_top.svg", 0, 126434, CRC(ff05f489) SHA1(2a533c7b5d7249d79f8d7795a0d57fd3e32d3d32) )
+
+ ROM_REGION( 122870, "svg_bottom", 0)
+ ROM_LOAD( "gnw_mickdon_bottom.svg", 0, 122870, CRC(8f06ddf1) SHA1(69d4b785781600abcdfc01b3902df1d0ae3608cf) )
+ROM_END
+
@@ -1415,11 +2233,9 @@ void gnw_mickdon_state::gnw_mickdon(machine_config &config)
class gnw_ghouse_state : public hh_sm510_state
{
public:
- gnw_ghouse_state(const machine_config &mconfig, device_type type, const char *tag)
- : hh_sm510_state(mconfig, type, tag)
- {
- m_inp_lines = 3;
- }
+ gnw_ghouse_state(const machine_config &mconfig, device_type type, const char *tag) :
+ hh_sm510_state(mconfig, type, tag)
+ { }
void gnw_ghouse(machine_config &config);
};
@@ -1474,13 +2290,13 @@ void gnw_ghouse_state::gnw_ghouse(machine_config &config)
screen_top.set_svg_region("svg_top");
screen_top.set_refresh_hz(50);
screen_top.set_size(1920/2, 1303/2);
- screen_top.set_visarea(0, 1920/2-1, 0, 1303/2-1);
+ screen_top.set_visarea_full();
screen_device &screen_bottom(SCREEN(config, "screen_bottom", SCREEN_TYPE_SVG));
screen_bottom.set_svg_region("svg_bottom");
screen_bottom.set_refresh_hz(50);
screen_bottom.set_size(1920/2, 1274/2);
- screen_bottom.set_visarea(0, 1920/2-1, 0, 1274/2-1);
+ screen_bottom.set_visarea_full();
TIMER(config, "display_decay").configure_periodic(FUNC(hh_sm510_state::display_decay_tick), attotime::from_msec(1));
config.set_default_layout(layout_gnw_dualv);
@@ -1491,6 +2307,19 @@ void gnw_ghouse_state::gnw_ghouse(machine_config &config)
m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25);
}
+// roms
+
+ROM_START( gnw_ghouse )
+ ROM_REGION( 0x1000, "maincpu", 0 )
+ ROM_LOAD( "gh-54", 0x0000, 0x1000, CRC(4df12b4d) SHA1(708be5fef8dbd9337f5ab35baaca5bdf21e1f36c) )
+
+ ROM_REGION( 159098, "svg_top", 0)
+ ROM_LOAD( "gnw_ghouse_top.svg", 0, 159098, CRC(96bc58d9) SHA1(eda6a0abde739fb71af3e150751a519e59ef021d) )
+
+ ROM_REGION( 149757, "svg_bottom", 0)
+ ROM_LOAD( "gnw_ghouse_bottom.svg", 0, 149757, CRC(d66ee72c) SHA1(dcbe1c81ee0c7ddb9692858749ce6934f4dd7f30) )
+ROM_END
+
@@ -1507,11 +2336,9 @@ void gnw_ghouse_state::gnw_ghouse(machine_config &config)
class gnw_dkong2_state : public hh_sm510_state
{
public:
- gnw_dkong2_state(const machine_config &mconfig, device_type type, const char *tag)
- : hh_sm510_state(mconfig, type, tag)
- {
- m_inp_lines = 3;
- }
+ gnw_dkong2_state(const machine_config &mconfig, device_type type, const char *tag) :
+ hh_sm510_state(mconfig, type, tag)
+ { }
void gnw_dkong2(machine_config &config);
};
@@ -1560,13 +2387,13 @@ void gnw_dkong2_state::gnw_dkong2(machine_config &config)
screen_top.set_svg_region("svg_top");
screen_top.set_refresh_hz(50);
screen_top.set_size(1920/2, 1241/2);
- screen_top.set_visarea(0, 1920/2-1, 0, 1241/2-1);
+ screen_top.set_visarea_full();
screen_device &screen_bottom(SCREEN(config, "screen_bottom", SCREEN_TYPE_SVG));
- screen_bottom.set_svg_region("svg_top");
+ screen_bottom.set_svg_region("svg_bottom");
screen_bottom.set_refresh_hz(50);
screen_bottom.set_size(1920/2, 1237/2);
- screen_bottom.set_visarea(0, 1920/2-1, 0, 1237/2-1);
+ screen_bottom.set_visarea_full();
TIMER(config, "display_decay").configure_periodic(FUNC(hh_sm510_state::display_decay_tick), attotime::from_msec(1));
config.set_default_layout(layout_gnw_dualv);
@@ -1577,6 +2404,19 @@ void gnw_dkong2_state::gnw_dkong2(machine_config &config)
m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25);
}
+// roms
+
+ROM_START( gnw_dkong2 )
+ ROM_REGION( 0x1000, "maincpu", 0 )
+ ROM_LOAD( "jr-55_560", 0x0000, 0x1000, CRC(46aed0ae) SHA1(72f75ccbd84aea094148c872fc7cc1683619a18a) )
+
+ ROM_REGION( 267443, "svg_top", 0)
+ ROM_LOAD( "gnw_dkong2_top.svg", 0, 267443, CRC(33b26edb) SHA1(600afdf22ff4ac4a4af2de9159287cc6e53dfe3a) )
+
+ ROM_REGION( 390558, "svg_bottom", 0)
+ ROM_LOAD( "gnw_dkong2_bottom.svg", 0, 390558, CRC(92d68958) SHA1(aba829bf89b93bf3a4e425c9a8f6eec9e5869bc4) )
+ROM_END
+
@@ -1593,11 +2433,9 @@ void gnw_dkong2_state::gnw_dkong2(machine_config &config)
class gnw_mario_state : public hh_sm510_state
{
public:
- gnw_mario_state(const machine_config &mconfig, device_type type, const char *tag)
- : hh_sm510_state(mconfig, type, tag)
- {
- m_inp_lines = 2;
- }
+ gnw_mario_state(const machine_config &mconfig, device_type type, const char *tag) :
+ hh_sm510_state(mconfig, type, tag)
+ { }
void gnw_mario(machine_config &config);
};
@@ -1648,13 +2486,217 @@ void gnw_mario_state::gnw_mario(machine_config &config)
screen_left.set_svg_region("svg_left");
screen_left.set_refresh_hz(50);
screen_left.set_size(2258/2, 1440/2);
- screen_left.set_visarea(0, 2258/2-1, 0, 1440/2-1);
+ screen_left.set_visarea_full();
screen_device &screen_right(SCREEN(config, "screen_right", SCREEN_TYPE_SVG));
screen_right.set_svg_region("svg_right");
screen_right.set_refresh_hz(50);
screen_right.set_size(2261/2, 1440/2);
- screen_right.set_visarea(0, 2261/2-1, 0, 1440/2-1);
+ screen_right.set_visarea_full();
+
+ TIMER(config, "display_decay").configure_periodic(FUNC(hh_sm510_state::display_decay_tick), attotime::from_msec(1));
+ config.set_default_layout(layout_gnw_dualh);
+
+ /* sound hardware */
+ SPEAKER(config, "mono").front_center();
+ SPEAKER_SOUND(config, m_speaker);
+ m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25);
+}
+
+// roms
+
+ROM_START( gnw_mario )
+ ROM_REGION( 0x1000, "maincpu", 0 )
+ ROM_LOAD( "mw-56", 0x0000, 0x1000, CRC(385e59da) SHA1(2f79281bdf2f2afca2fb5bd7b9a3beeffc9c4eb7) )
+
+ ROM_REGION( 154874, "svg_left", 0)
+ ROM_LOAD( "gnw_mario_left.svg", 0, 154874, CRC(73ba4f4a) SHA1(d5df39808a1af8e8ad5e397b4a50313221ab6e3b) )
+
+ ROM_REGION( 202863, "svg_right", 0)
+ ROM_LOAD( "gnw_mario_right.svg", 0, 202863, CRC(dd2473c9) SHA1(51aca37abf8e4959b84c441aa2d114e16c7d6010) )
+ROM_END
+
+
+
+
+
+/***************************************************************************
+
+ Nintendo Game & Watch: Rain Shower (model LP-57)
+ * PCB labels: LP-57-M-I (left), LP-57-S (right)
+ * Sharp SM510 label LP-57 538A (no decap)
+ * horizontal dual lcd screens with custom segments, 1-bit sound
+
+***************************************************************************/
+
+class gnw_rshower_state : public hh_sm510_state
+{
+public:
+ gnw_rshower_state(const machine_config &mconfig, device_type type, const char *tag) :
+ hh_sm510_state(mconfig, type, tag)
+ { }
+
+ void gnw_rshower(machine_config &config);
+};
+
+// config
+
+static INPUT_PORTS_START( gnw_rshower )
+ PORT_START("IN.0") // S1
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED )
+ PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_sm510_state, input_changed, nullptr) PORT_NAME("Time")
+ PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_sm510_state, input_changed, nullptr) // L/R
+ PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED )
+
+ PORT_START("IN.1") // S2
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED )
+ PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START2 ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_sm510_state, input_changed, nullptr) PORT_NAME("Game B")
+ PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_START1 ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_sm510_state, input_changed, nullptr) PORT_NAME("Game A")
+ PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_SERVICE2 ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_sm510_state, input_changed, nullptr) PORT_NAME("Alarm")
+
+ PORT_START("IN.2") // S3
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_sm510_state, input_changed, nullptr)
+ PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_sm510_state, input_changed, nullptr)
+ PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_sm510_state, input_changed, nullptr)
+ PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_sm510_state, input_changed, nullptr)
+
+ PORT_START("ACL")
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_sm510_state, acl_button, nullptr) PORT_NAME("ACL")
+
+ PORT_START("BA") // MCU BA(alpha) pin pulled to GND
+ PORT_CONFNAME( 0x01, 0x01, "Increase Score (Cheat)")
+ PORT_CONFSETTING( 0x01, DEF_STR( Off ) )
+ PORT_CONFSETTING( 0x00, DEF_STR( On ) )
+
+ PORT_START("B") // MCU B(beta) pin pulled to GND
+ PORT_CONFNAME( 0x01, 0x01, "Infinite Lives (Cheat)")
+ PORT_CONFSETTING( 0x01, DEF_STR( Off ) )
+ PORT_CONFSETTING( 0x00, DEF_STR( On ) )
+INPUT_PORTS_END
+
+void gnw_rshower_state::gnw_rshower(machine_config &config)
+{
+ /* basic machine hardware */
+ SM510(config, m_maincpu);
+ m_maincpu->set_r_mask_option(2); // confirmed
+ m_maincpu->write_segs().set(FUNC(hh_sm510_state::sm510_lcd_segment_w));
+ m_maincpu->read_k().set(FUNC(hh_sm510_state::input_r));
+ m_maincpu->write_s().set(FUNC(hh_sm510_state::input_w));
+ m_maincpu->write_r().set(FUNC(hh_sm510_state::piezo_r1_w));
+ m_maincpu->read_ba().set_ioport("BA");
+ m_maincpu->read_b().set_ioport("B");
+
+ /* video hardware */
+ screen_device &screen_left(SCREEN(config, "screen_left", SCREEN_TYPE_SVG));
+ screen_left.set_svg_region("svg_left");
+ screen_left.set_refresh_hz(50);
+ screen_left.set_size(2126/2, 1440/2);
+ screen_left.set_visarea_full();
+
+ screen_device &screen_right(SCREEN(config, "screen_right", SCREEN_TYPE_SVG));
+ screen_right.set_svg_region("svg_right");
+ screen_right.set_refresh_hz(50);
+ screen_right.set_size(2146/2, 1440/2);
+ screen_right.set_visarea_full();
+
+ TIMER(config, "display_decay").configure_periodic(FUNC(hh_sm510_state::display_decay_tick), attotime::from_msec(1));
+ config.set_default_layout(layout_gnw_dualh);
+
+ /* sound hardware */
+ SPEAKER(config, "mono").front_center();
+ SPEAKER_SOUND(config, m_speaker);
+ m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25);
+}
+
+// roms
+
+ROM_START( gnw_rshower )
+ ROM_REGION( 0x1000, "maincpu", 0 )
+ ROM_LOAD( "lp-57", 0x0000, 0x1000, CRC(51a2c5c4) SHA1(d60542e6785ba7b6a44153a66c739787cf670816) )
+
+ ROM_REGION( 135698, "svg_left", 0)
+ ROM_LOAD( "gnw_rshower_left.svg", 0, 135698, CRC(f0b36d70) SHA1(252e5cc110112a874265477be11ab3adf8108726) )
+
+ ROM_REGION( 140280, "svg_right", 0)
+ ROM_LOAD( "gnw_rshower_right.svg", 0, 140280, CRC(0ce4d049) SHA1(7e1afa1fdbdf658a12a28192ba2d29e5fca807cb) )
+ROM_END
+
+
+
+
+
+/***************************************************************************
+
+ Nintendo Game & Watch: Lifeboat (model TC-58)
+ * PCB labels: TC-58-M (left), TC-58-S (right)
+ * Sharp SM510 label TC-58 281D (no decap)
+ * horizontal dual lcd screens with custom segments, 1-bit sound
+
+***************************************************************************/
+
+class gnw_lboat_state : public hh_sm510_state
+{
+public:
+ gnw_lboat_state(const machine_config &mconfig, device_type type, const char *tag) :
+ hh_sm510_state(mconfig, type, tag)
+ { }
+
+ void gnw_lboat(machine_config &config);
+};
+
+// config
+
+static INPUT_PORTS_START( gnw_lboat )
+ PORT_START("IN.0") // S1
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_sm510_state, input_changed, nullptr) PORT_16WAY
+ PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_sm510_state, input_changed, nullptr) PORT_16WAY
+ PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED )
+ PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED )
+
+ PORT_START("IN.1") // S2
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_sm510_state, input_changed, nullptr) PORT_NAME("Time")
+ PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START2 ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_sm510_state, input_changed, nullptr) PORT_NAME("Game B")
+ PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_START1 ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_sm510_state, input_changed, nullptr) PORT_NAME("Game A")
+ PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_SERVICE2 ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_sm510_state, input_changed, nullptr) PORT_NAME("Alarm")
+
+ PORT_START("ACL")
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_sm510_state, acl_button, nullptr) PORT_NAME("ACL")
+
+ PORT_START("BA") // MCU BA(alpha) pin pulled to GND
+ PORT_CONFNAME( 0x01, 0x01, "Increase Score (Cheat)")
+ PORT_CONFSETTING( 0x01, DEF_STR( Off ) )
+ PORT_CONFSETTING( 0x00, DEF_STR( On ) )
+
+ PORT_START("B") // MCU B(beta) pin pulled to GND
+ PORT_CONFNAME( 0x01, 0x01, "Invincibility (Cheat)")
+ PORT_CONFSETTING( 0x01, DEF_STR( Off ) )
+ PORT_CONFSETTING( 0x00, DEF_STR( On ) )
+INPUT_PORTS_END
+
+void gnw_lboat_state::gnw_lboat(machine_config &config)
+{
+ /* basic machine hardware */
+ SM510(config, m_maincpu);
+ m_maincpu->set_r_mask_option(2); // confirmed
+ m_maincpu->write_segs().set(FUNC(hh_sm510_state::sm510_lcd_segment_w));
+ m_maincpu->read_k().set(FUNC(hh_sm510_state::input_r));
+ m_maincpu->write_s().set(FUNC(hh_sm510_state::input_w));
+ m_maincpu->write_r().set(FUNC(hh_sm510_state::piezo_r1_w));
+ m_maincpu->read_ba().set_ioport("BA");
+ m_maincpu->read_b().set_ioport("B");
+
+ /* video hardware */
+ screen_device &screen_left(SCREEN(config, "screen_left", SCREEN_TYPE_SVG));
+ screen_left.set_svg_region("svg_left");
+ screen_left.set_refresh_hz(50);
+ screen_left.set_size(2116/2, 1440/2);
+ screen_left.set_visarea_full();
+
+ screen_device &screen_right(SCREEN(config, "screen_right", SCREEN_TYPE_SVG));
+ screen_right.set_svg_region("svg_right");
+ screen_right.set_refresh_hz(50);
+ screen_right.set_size(2057/2, 1440/2);
+ screen_right.set_visarea_full();
TIMER(config, "display_decay").configure_periodic(FUNC(hh_sm510_state::display_decay_tick), attotime::from_msec(1));
config.set_default_layout(layout_gnw_dualh);
@@ -1665,6 +2707,19 @@ void gnw_mario_state::gnw_mario(machine_config &config)
m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25);
}
+// roms
+
+ROM_START( gnw_lboat )
+ ROM_REGION( 0x1000, "maincpu", 0 )
+ ROM_LOAD( "tc-58", 0x0000, 0x1000, CRC(1f88f6a2) SHA1(22fd62127dda43a0ada2fe89b0518eec8cbe2a25) )
+
+ ROM_REGION( 156272, "svg_left", 0)
+ ROM_LOAD( "gnw_lboat_left.svg", 0, 156272, CRC(1f0c18bd) SHA1(ca11c83b4b4d6a91ecb0300cff392e010064ba25) )
+
+ ROM_REGION( 155093, "svg_right", 0)
+ ROM_LOAD( "gnw_lboat_right.svg", 0, 155093, CRC(6f68780a) SHA1(63488693fbb1a8ad4d59da9e4e003eef709926f9) )
+ROM_END
+
@@ -1681,11 +2736,9 @@ void gnw_mario_state::gnw_mario(machine_config &config)
class gnw_bjack_state : public hh_sm510_state
{
public:
- gnw_bjack_state(const machine_config &mconfig, device_type type, const char *tag)
- : hh_sm510_state(mconfig, type, tag)
- {
- m_inp_lines = 2;
- }
+ gnw_bjack_state(const machine_config &mconfig, device_type type, const char *tag) :
+ hh_sm510_state(mconfig, type, tag)
+ { }
void gnw_bjack(machine_config &config);
};
@@ -1723,13 +2776,13 @@ void gnw_bjack_state::gnw_bjack(machine_config &config)
screen_top.set_svg_region("svg_top");
screen_top.set_refresh_hz(50);
screen_top.set_size(1920/2, 1290/2);
- screen_top.set_visarea(0, 1920/2-1, 0, 1290/2-1);
+ screen_top.set_visarea_full();
screen_device &screen_bottom(SCREEN(config, "screen_bottom", SCREEN_TYPE_SVG));
screen_bottom.set_svg_region("svg_bottom");
screen_bottom.set_refresh_hz(50);
screen_bottom.set_size(1920/2, 1297/2);
- screen_bottom.set_visarea(0, 1920/2-1, 0, 1297/2-1);
+ screen_bottom.set_visarea_full();
TIMER(config, "display_decay").configure_periodic(FUNC(hh_sm510_state::display_decay_tick), attotime::from_msec(1));
config.set_default_layout(layout_gnw_dualv);
@@ -1740,6 +2793,22 @@ void gnw_bjack_state::gnw_bjack(machine_config &config)
m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25);
}
+// roms
+
+ROM_START( gnw_bjack )
+ ROM_REGION( 0x1000, "maincpu", 0 )
+ ROM_LOAD( "bj-60.program", 0x0000, 0x1000, CRC(8e74f633) SHA1(54b0f65ee716d2820a9ed9c743755d2a2d99ce4d) )
+
+ ROM_REGION( 0x100, "maincpu:melody", 0 )
+ ROM_LOAD( "bj-60.melody", 0x000, 0x100, BAD_DUMP CRC(2619224e) SHA1(b65dc590b6eb1de793e980af236ccf8360b3cfee) ) // decap needed for verification
+
+ ROM_REGION( 75217, "svg_top", 0)
+ ROM_LOAD( "gnw_bjack_top.svg", 0, 75205, CRC(5eb0956e) SHA1(f7acd148e5478d4c2ddf06cff23c5e40faee2c24) )
+
+ ROM_REGION( 112450, "svg_bottom", 0)
+ ROM_LOAD( "gnw_bjack_bottom.svg", 0, 112438, CRC(9d985b1d) SHA1(cf8af6ce18994f687a5e6fbdda62af4d07a07cf8) )
+ROM_END
+
@@ -1756,11 +2825,9 @@ void gnw_bjack_state::gnw_bjack(machine_config &config)
class gnw_squish_state : public hh_sm510_state
{
public:
- gnw_squish_state(const machine_config &mconfig, device_type type, const char *tag)
- : hh_sm510_state(mconfig, type, tag)
- {
- m_inp_lines = 2;
- }
+ gnw_squish_state(const machine_config &mconfig, device_type type, const char *tag) :
+ hh_sm510_state(mconfig, type, tag)
+ { }
void gnw_squish(machine_config &config);
};
@@ -1811,13 +2878,13 @@ void gnw_squish_state::gnw_squish(machine_config &config)
screen_top.set_svg_region("svg_top");
screen_top.set_refresh_hz(50);
screen_top.set_size(1920/2, 1285/2);
- screen_top.set_visarea(0, 1920/2-1, 0, 1285/2-1);
+ screen_top.set_visarea_full();
screen_device &screen_bottom(SCREEN(config, "screen_bottom", SCREEN_TYPE_SVG));
screen_bottom.set_svg_region("svg_bottom");
screen_bottom.set_refresh_hz(50);
screen_bottom.set_size(1920/2, 1287/2);
- screen_bottom.set_visarea(0, 1920/2-1, 0, 1287/2-1);
+ screen_bottom.set_visarea_full();
TIMER(config, "display_decay").configure_periodic(FUNC(hh_sm510_state::display_decay_tick), attotime::from_msec(1));
config.set_default_layout(layout_gnw_dualv);
@@ -1828,6 +2895,19 @@ void gnw_squish_state::gnw_squish(machine_config &config)
m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25);
}
+// roms
+
+ROM_START( gnw_squish )
+ ROM_REGION( 0x1000, "maincpu", 0 )
+ ROM_LOAD( "mg-61", 0x0000, 0x1000, CRC(79cd509c) SHA1(969e5425984ba9e5183c68b38b3588f53d1e8e5d) )
+
+ ROM_REGION( 70300, "svg_top", 0)
+ ROM_LOAD( "gnw_squish_top.svg", 0, 70300, CRC(f1358ba9) SHA1(414d29db64b83a50b20f31b857e4c3a77d19d3c8) )
+
+ ROM_REGION( 279606, "svg_bottom", 0)
+ ROM_LOAD( "gnw_squish_bottom.svg", 0, 279606, CRC(1d4ac23f) SHA1(d6eb78bae5ca18cc5fe5d8a300902766dd9601aa) )
+ROM_END
+
@@ -1846,11 +2926,9 @@ void gnw_squish_state::gnw_squish(machine_config &config)
class gnw_dkjr_state : public hh_sm510_state
{
public:
- gnw_dkjr_state(const machine_config &mconfig, device_type type, const char *tag)
- : hh_sm510_state(mconfig, type, tag)
- {
- m_inp_lines = 3;
- }
+ gnw_dkjr_state(const machine_config &mconfig, device_type type, const char *tag) :
+ hh_sm510_state(mconfig, type, tag)
+ { }
void gnw_dkjr(machine_config &config);
};
@@ -1905,7 +2983,7 @@ void gnw_dkjr_state::gnw_dkjr(machine_config &config)
screen.set_svg_region("svg");
screen.set_refresh_hz(50);
screen.set_size(1647, 1080);
- screen.set_visarea(0, 1647-1, 0, 1080-1);
+ screen.set_visarea_full();
TIMER(config, "display_decay").configure_periodic(FUNC(hh_sm510_state::display_decay_tick), attotime::from_msec(1));
@@ -1915,6 +2993,16 @@ void gnw_dkjr_state::gnw_dkjr(machine_config &config)
m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25);
}
+// roms
+
+ROM_START( gnw_dkjr )
+ ROM_REGION( 0x1000, "maincpu", 0 )
+ ROM_LOAD( "dj-101", 0x0000, 0x1000, CRC(8dcfb5d1) SHA1(e0ef578e9362eb9a3cab631376df3cf55978f2de) )
+
+ ROM_REGION( 281161, "svg", 0)
+ ROM_LOAD( "gnw_dkjr.svg", 0, 281161, CRC(346b025c) SHA1(dad3f3f73d6c2ff4efb43ffd76e97ba0d5f0da73) )
+ROM_END
+
@@ -1932,11 +3020,9 @@ void gnw_dkjr_state::gnw_dkjr(machine_config &config)
class gnw_mariocm_state : public hh_sm510_state
{
public:
- gnw_mariocm_state(const machine_config &mconfig, device_type type, const char *tag)
- : hh_sm510_state(mconfig, type, tag)
- {
- m_inp_lines = 2;
- }
+ gnw_mariocm_state(const machine_config &mconfig, device_type type, const char *tag) :
+ hh_sm510_state(mconfig, type, tag)
+ { }
void gnw_mariocm(machine_config &config);
};
@@ -1987,7 +3073,7 @@ void gnw_mariocm_state::gnw_mariocm(machine_config &config)
screen.set_svg_region("svg");
screen.set_refresh_hz(50);
screen.set_size(1647, 1080);
- screen.set_visarea(0, 1647-1, 0, 1080-1);
+ screen.set_visarea_full();
TIMER(config, "display_decay").configure_periodic(FUNC(hh_sm510_state::display_decay_tick), attotime::from_msec(1));
@@ -1997,6 +3083,107 @@ void gnw_mariocm_state::gnw_mariocm(machine_config &config)
m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25);
}
+// roms
+
+ROM_START( gnw_mariocm )
+ ROM_REGION( 0x1000, "maincpu", 0 )
+ ROM_LOAD( "ml-102_577", 0x0000, 0x1000, CRC(c1128dea) SHA1(8647e36f43a0e37756a3c7b6a3f08d4c8243f1cc) )
+
+ ROM_REGION( 302931, "svg", 0)
+ ROM_LOAD( "gnw_mariocm.svg", 0, 302931, CRC(5517ae80) SHA1(1902e36d0470ee5548addeb087ea3e7d2c2520a2) )
+ROM_END
+
+
+
+
+
+/***************************************************************************
+
+ Nintendo Game & Watch: Manhole (model NH-103)
+ * PCB label NH-103
+ * Sharp SM510 label NH-103 538A (no decap)
+ * lcd screen with custom segments, 1-bit sound
+
+ This is the new wide screen version, there's also a Gold Series version (MH-06)
+
+***************************************************************************/
+
+class gnw_manhole_state : public hh_sm510_state
+{
+public:
+ gnw_manhole_state(const machine_config &mconfig, device_type type, const char *tag) :
+ hh_sm510_state(mconfig, type, tag)
+ { }
+
+ void gnw_manhole(machine_config &config);
+};
+
+// config
+
+static INPUT_PORTS_START( gnw_manhole )
+ PORT_START("IN.0") // S1
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICKRIGHT_DOWN ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_sm510_state, input_changed, nullptr) PORT_16WAY
+ PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICKRIGHT_UP ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_sm510_state, input_changed, nullptr) PORT_16WAY
+ PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICKLEFT_UP ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_sm510_state, input_changed, nullptr) PORT_16WAY
+ PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICKLEFT_DOWN ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_sm510_state, input_changed, nullptr) PORT_16WAY
+
+ PORT_START("IN.1") // S2
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_sm510_state, input_changed, nullptr) PORT_NAME("Time")
+ PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START2 ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_sm510_state, input_changed, nullptr) PORT_NAME("Game B")
+ PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_START1 ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_sm510_state, input_changed, nullptr) PORT_NAME("Game A")
+ PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_SERVICE2 ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_sm510_state, input_changed, nullptr) PORT_NAME("Alarm")
+
+ PORT_START("ACL")
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_sm510_state, acl_button, nullptr) PORT_NAME("ACL")
+
+ PORT_START("BA") // MCU BA(alpha) pin pulled to GND
+ PORT_CONFNAME( 0x01, 0x01, "Increase Score (Cheat)")
+ PORT_CONFSETTING( 0x01, DEF_STR( Off ) )
+ PORT_CONFSETTING( 0x00, DEF_STR( On ) )
+
+ PORT_START("B") // MCU B(beta) pin pulled to GND
+ PORT_CONFNAME( 0x01, 0x01, "Invincibility (Cheat)")
+ PORT_CONFSETTING( 0x01, DEF_STR( Off ) )
+ PORT_CONFSETTING( 0x00, DEF_STR( On ) )
+INPUT_PORTS_END
+
+void gnw_manhole_state::gnw_manhole(machine_config &config)
+{
+ /* basic machine hardware */
+ SM510(config, m_maincpu);
+ m_maincpu->set_r_mask_option(2); // confirmed
+ m_maincpu->write_segs().set(FUNC(hh_sm510_state::sm510_lcd_segment_w));
+ m_maincpu->read_k().set(FUNC(hh_sm510_state::input_r));
+ m_maincpu->write_s().set(FUNC(hh_sm510_state::input_w));
+ m_maincpu->write_r().set(FUNC(hh_sm510_state::piezo_r1_w));
+ m_maincpu->read_ba().set_ioport("BA");
+ m_maincpu->read_b().set_ioport("B");
+
+ /* video hardware */
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_SVG));
+ screen.set_svg_region("svg");
+ screen.set_refresh_hz(50);
+ screen.set_size(1560, 1080);
+ screen.set_visarea_full();
+
+ TIMER(config, "display_decay").configure_periodic(FUNC(hh_sm510_state::display_decay_tick), attotime::from_msec(1));
+
+ /* sound hardware */
+ SPEAKER(config, "mono").front_center();
+ SPEAKER_SOUND(config, m_speaker);
+ m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25);
+}
+
+// roms
+
+ROM_START( gnw_manhole )
+ ROM_REGION( 0x1000, "maincpu", 0 )
+ ROM_LOAD( "nh-103", 0x0000, 0x1000, CRC(ec03acf7) SHA1(b74ae672d8f8a155b2ea4ecee9afbaed95ec0ceb) )
+
+ ROM_REGION( 223244, "svg", 0)
+ ROM_LOAD( "gnw_manhole.svg", 0, 223244, CRC(41848e77) SHA1(d7238d1a3f95d8d274f5ff767ebf783bb50e64eb) )
+ROM_END
+
@@ -2013,11 +3200,9 @@ void gnw_mariocm_state::gnw_mariocm(machine_config &config)
class gnw_tfish_state : public hh_sm510_state
{
public:
- gnw_tfish_state(const machine_config &mconfig, device_type type, const char *tag)
- : hh_sm510_state(mconfig, type, tag)
- {
- m_inp_lines = 2;
- }
+ gnw_tfish_state(const machine_config &mconfig, device_type type, const char *tag) :
+ hh_sm510_state(mconfig, type, tag)
+ { }
void gnw_tfish(machine_config &config);
};
@@ -2062,7 +3247,7 @@ void gnw_tfish_state::gnw_tfish(machine_config &config)
screen.set_svg_region("svg");
screen.set_refresh_hz(50);
screen.set_size(1572, 1080);
- screen.set_visarea(0, 1572-1, 0, 1080-1);
+ screen.set_visarea_full();
TIMER(config, "display_decay").configure_periodic(FUNC(hh_sm510_state::display_decay_tick), attotime::from_msec(1));
@@ -2072,6 +3257,16 @@ void gnw_tfish_state::gnw_tfish(machine_config &config)
m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25);
}
+// roms
+
+ROM_START( gnw_tfish )
+ ROM_REGION( 0x1000, "maincpu", 0 )
+ ROM_LOAD( "tf-104", 0x0000, 0x1000, CRC(53cde918) SHA1(bc1e1b8f8b282bb886bb076c1c7ce35d00eca6fc) )
+
+ ROM_REGION( 257278, "svg", 0)
+ ROM_LOAD( "gnw_tfish.svg", 0, 257278, CRC(fc970f4a) SHA1(a73f5ee35b60842707f13edc5d58869fb2ec98cf) )
+ROM_END
+
@@ -2079,6 +3274,7 @@ void gnw_tfish_state::gnw_tfish(machine_config &config)
/***************************************************************************
Nintendo Game & Watch: Super Mario Bros. (model: see below)
+ * PCB label YM-105
* Sharp SM511 label YM-105 9024B (new wide screen version) (die label ?)
* lcd screen with custom segments, 1-bit sound
@@ -2093,11 +3289,9 @@ void gnw_tfish_state::gnw_tfish(machine_config &config)
class gnw_smb_state : public hh_sm510_state
{
public:
- gnw_smb_state(const machine_config &mconfig, device_type type, const char *tag)
- : hh_sm510_state(mconfig, type, tag)
- {
- m_inp_lines = 3;
- }
+ gnw_smb_state(const machine_config &mconfig, device_type type, const char *tag) :
+ hh_sm510_state(mconfig, type, tag)
+ { }
void gnw_smb(machine_config &config);
};
@@ -2145,7 +3339,7 @@ void gnw_smb_state::gnw_smb(machine_config &config)
screen.set_svg_region("svg");
screen.set_refresh_hz(50);
screen.set_size(1677, 1080);
- screen.set_visarea(0, 1677-1, 0, 1080-1);
+ screen.set_visarea_full();
TIMER(config, "display_decay").configure_periodic(FUNC(hh_sm510_state::display_decay_tick), attotime::from_msec(1));
@@ -2155,6 +3349,19 @@ void gnw_smb_state::gnw_smb(machine_config &config)
m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25);
}
+// roms
+
+ROM_START( gnw_smb )
+ ROM_REGION( 0x1000, "maincpu", 0 )
+ ROM_LOAD( "ym-105.program", 0x0000, 0x1000, CRC(0dff3b12) SHA1(3fa83f88e49ea9d7080fe935ec90ce69acbe8850) )
+
+ ROM_REGION( 0x100, "maincpu:melody", 0 )
+ ROM_LOAD( "ym-105.melody", 0x000, 0x100, CRC(b48c6d90) SHA1(a1ce1e52627767752974ab0d49bec48ead36663e) )
+
+ ROM_REGION( 648209, "svg", 0)
+ ROM_LOAD( "gnw_smb.svg", 0, 648209, CRC(4a6fdb28) SHA1(0a0bc48d82d5b8bf8ef96ef9ce2f87ba6ea850c1) )
+ROM_END
+
@@ -2162,6 +3369,7 @@ void gnw_smb_state::gnw_smb(machine_config &config)
/***************************************************************************
Nintendo Game & Watch: Climber (model: see below)
+ * PCB label DR-106
* Sharp SM511 label DR-106 9038B (new wide screen version) (no decap)
* lcd screen with custom segments, 1-bit sound
@@ -2175,11 +3383,9 @@ void gnw_smb_state::gnw_smb(machine_config &config)
class gnw_climber_state : public hh_sm510_state
{
public:
- gnw_climber_state(const machine_config &mconfig, device_type type, const char *tag)
- : hh_sm510_state(mconfig, type, tag)
- {
- m_inp_lines = 3;
- }
+ gnw_climber_state(const machine_config &mconfig, device_type type, const char *tag) :
+ hh_sm510_state(mconfig, type, tag)
+ { }
void gnw_climber(machine_config &config);
};
@@ -2227,7 +3433,7 @@ void gnw_climber_state::gnw_climber(machine_config &config)
screen.set_svg_region("svg");
screen.set_refresh_hz(50);
screen.set_size(1677, 1080);
- screen.set_visarea(0, 1677-1, 0, 1080-1);
+ screen.set_visarea_full();
TIMER(config, "display_decay").configure_periodic(FUNC(hh_sm510_state::display_decay_tick), attotime::from_msec(1));
@@ -2237,6 +3443,113 @@ void gnw_climber_state::gnw_climber(machine_config &config)
m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25);
}
+// roms
+
+ROM_START( gnw_climber )
+ ROM_REGION( 0x1000, "maincpu", 0 )
+ ROM_LOAD( "dr-106.program", 0x0000, 0x1000, CRC(2adcbd6d) SHA1(110dc08c65120ab2c76ee647e89aa2726e24ac1a) )
+
+ ROM_REGION( 0x100, "maincpu:melody", 0 )
+ ROM_LOAD( "dr-106.melody", 0x000, 0x100, BAD_DUMP CRC(c99d7998) SHA1(4f8cf35b13f8b7654e7186bfd67d197d9053e949) ) // decap needed for verification
+
+ ROM_REGION( 542332, "svg", 0)
+ ROM_LOAD( "gnw_climber.svg", 0, 542332, CRC(d7e84c21) SHA1(a5b5b68c8cdb3a09966bfb91b281791bef311248) )
+ROM_END
+
+
+
+
+
+/***************************************************************************
+
+ Nintendo Game & Watch: Balloon Fight (model: see below)
+ * PCB label DR-106 (same PCB as in Climber (new wide screen version))
+ * Sharp SM511 label BF-107 9031B (new wide screen version) (no decap)
+ * lcd screen with custom segments, 1-bit sound
+
+ First released in 1986 on Crystal Screen (model BF-803), rereleased on
+ New Wide Screen in 1988 (model BF-107). The graphic LCD elements look the same
+ in both versions but the graphical background is slightly different.
+ Until further proof, it's assumed that the ROM is the same for both models.
+
+***************************************************************************/
+
+class gnw_bfight_state : public hh_sm510_state
+{
+public:
+ gnw_bfight_state(const machine_config &mconfig, device_type type, const char *tag) :
+ hh_sm510_state(mconfig, type, tag)
+ { }
+
+ void gnw_bfight(machine_config &config);
+};
+
+// config
+
+static INPUT_PORTS_START( gnw_bfight )
+ PORT_START("IN.0") // S1
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_sm510_state, input_changed, nullptr) PORT_NAME("Time")
+ PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START1 ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_sm510_state, input_changed, nullptr) PORT_NAME("Game")
+ PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_SERVICE2 ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_sm510_state, input_changed, nullptr) PORT_NAME("Alarm")
+ PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED )
+
+ PORT_START("IN.1") // S2
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_sm510_state, input_changed, nullptr)
+ PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_sm510_state, input_changed, nullptr)
+ PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_sm510_state, input_changed, nullptr)
+ PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_sm510_state, input_changed, nullptr)
+
+ PORT_START("IN.2") // S3
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_sm510_state, input_changed, nullptr) // Eject
+ PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED )
+
+ PORT_START("ACL")
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_sm510_state, acl_button, nullptr) PORT_NAME("ACL")
+
+ PORT_START("B") // MCU B(beta) pin pulled to GND
+ PORT_CONFNAME( 0x01, 0x01, "Infinite Lives (Cheat)")
+ PORT_CONFSETTING( 0x01, DEF_STR( Off ) )
+ PORT_CONFSETTING( 0x00, DEF_STR( On ) )
+INPUT_PORTS_END
+
+void gnw_bfight_state::gnw_bfight(machine_config &config)
+{
+ /* basic machine hardware */
+ SM511(config, m_maincpu);
+ m_maincpu->write_segs().set(FUNC(hh_sm510_state::sm510_lcd_segment_w));
+ m_maincpu->read_k().set(FUNC(hh_sm510_state::input_r));
+ m_maincpu->write_s().set(FUNC(hh_sm510_state::input_w));
+ m_maincpu->write_r().set(FUNC(hh_sm510_state::piezo_r1_w));
+ m_maincpu->read_b().set_ioport("B");
+
+ /* video hardware */
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_SVG));
+ screen.set_svg_region("svg");
+ screen.set_refresh_hz(50);
+ screen.set_size(1549, 1080);
+ screen.set_visarea_full();
+
+ TIMER(config, "display_decay").configure_periodic(FUNC(hh_sm510_state::display_decay_tick), attotime::from_msec(1));
+
+ /* sound hardware */
+ SPEAKER(config, "mono").front_center();
+ SPEAKER_SOUND(config, m_speaker);
+ m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25);
+}
+
+// roms
+
+ROM_START( gnw_bfight )
+ ROM_REGION( 0x1000, "maincpu", 0 )
+ ROM_LOAD( "bf-107.program", 0x0000, 0x1000, CRC(4c8d07ed) SHA1(a8974dff85d5f3bacaadb71b86e9b30994b6d129) )
+
+ ROM_REGION( 0x100, "maincpu:melody", 0 )
+ ROM_LOAD( "bf-107.melody", 0x000, 0x100, BAD_DUMP CRC(aadc22a1) SHA1(f6e5572232eb9e83f6833073e1e1e99776245c50) ) // decap needed for verification
+
+ ROM_REGION( 558341, "svg", 0)
+ ROM_LOAD( "gnw_bfight.svg", 0, 558341, CRC(f0d61fe8) SHA1(b0b56224a967e4b26836c0f7e3015d13b42ae5cc) )
+ROM_END
+
@@ -2254,11 +3567,9 @@ void gnw_climber_state::gnw_climber(machine_config &config)
class gnw_boxing_state : public hh_sm510_state
{
public:
- gnw_boxing_state(const machine_config &mconfig, device_type type, const char *tag)
- : hh_sm510_state(mconfig, type, tag)
- {
- m_inp_lines = 7;
- }
+ gnw_boxing_state(const machine_config &mconfig, device_type type, const char *tag) :
+ hh_sm510_state(mconfig, type, tag)
+ { }
void gnw_boxing(machine_config &config);
};
@@ -2330,7 +3641,7 @@ void gnw_boxing_state::gnw_boxing(machine_config &config)
screen.set_svg_region("svg");
screen.set_refresh_hz(50);
screen.set_size(1920, 524);
- screen.set_visarea(0, 1920-1, 0, 524-1);
+ screen.set_visarea_full();
TIMER(config, "display_decay").configure_periodic(FUNC(hh_sm510_state::display_decay_tick), attotime::from_msec(1));
@@ -2340,6 +3651,19 @@ void gnw_boxing_state::gnw_boxing(machine_config &config)
m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25);
}
+// roms
+
+ROM_START( gnw_boxing )
+ ROM_REGION( 0x1000, "maincpu", 0 )
+ ROM_LOAD( "bx-301_744.program", 0x0000, 0x1000, CRC(0fdf0303) SHA1(0b791c9d4874e9534d0a9b7a8968ce02fe4bee96) )
+
+ ROM_REGION( 0x100, "maincpu:melody", 0 )
+ ROM_LOAD( "bx-301_744.melody", 0x000, 0x100, CRC(439d943d) SHA1(52880df15ec7513f96482f455ef3d9778aa24750) )
+
+ ROM_REGION( 265174, "svg", 0)
+ ROM_LOAD( "gnw_boxing.svg", 0, 265174, CRC(e8a3ab25) SHA1(53e32542b582dcdf4ddd051f182738eee6c732c9) )
+ROM_END
+
@@ -2362,11 +3686,10 @@ void gnw_boxing_state::gnw_boxing(machine_config &config)
class tgaunt_state : public hh_sm510_state
{
public:
- tgaunt_state(const machine_config &mconfig, device_type type, const char *tag)
- : hh_sm510_state(mconfig, type, tag)
+ tgaunt_state(const machine_config &mconfig, device_type type, const char *tag) :
+ hh_sm510_state(mconfig, type, tag)
{
- m_inp_lines = 6;
- m_inp_fixed = 6;
+ inp_fixed_last();
}
void trobhood(machine_config &config);
@@ -2441,7 +3764,7 @@ void tgaunt_state::tgaunt(machine_config &config)
screen.set_svg_region("svg");
screen.set_refresh_hz(50);
screen.set_size(1425, 1080);
- screen.set_visarea(0, 1425-1, 0, 1080-1);
+ screen.set_visarea_full();
TIMER(config, "display_decay").configure_periodic(FUNC(hh_sm510_state::display_decay_tick), attotime::from_msec(1));
@@ -2456,10 +3779,29 @@ void tgaunt_state::trobhood(machine_config &config)
tgaunt(config);
/* video hardware */
- subdevice<screen_device>("screen")->set_size(1468, 1080);
- subdevice<screen_device>("screen")->set_visarea(0, 1468-1, 0, 1080-1);
+ screen_device *screen = subdevice<screen_device>("screen");
+ screen->set_size(1468, 1080);
+ screen->set_visarea_full();
}
+// roms
+
+ROM_START( tgaunt )
+ ROM_REGION( 0x1000, "maincpu", 0 )
+ ROM_LOAD( "583", 0x0000, 0x1000, CRC(598d8156) SHA1(9f776e8b9b4321e8118481e6b1304f8a38f9932e) )
+
+ ROM_REGION( 713020, "svg", 0)
+ ROM_LOAD( "tgaunt.svg", 0, 713020, CRC(1f65ae21) SHA1(57ca33d073d1096a7fc17f2bdac940868d1ae651) )
+ROM_END
+
+ROM_START( trobhood )
+ ROM_REGION( 0x1000, "maincpu", 0 )
+ ROM_LOAD( "583", 0x0000, 0x1000, CRC(598d8156) SHA1(9f776e8b9b4321e8118481e6b1304f8a38f9932e) )
+
+ ROM_REGION( 704892, "svg", 0)
+ ROM_LOAD( "trobhood.svg", 0, 704892, CRC(291fd8db) SHA1(1de6bd0e203f16c44f7d661e44863a1a919f3da9) )
+ROM_END
+
@@ -2478,11 +3820,10 @@ void tgaunt_state::trobhood(machine_config &config)
class tddragon_state : public hh_sm510_state
{
public:
- tddragon_state(const machine_config &mconfig, device_type type, const char *tag)
- : hh_sm510_state(mconfig, type, tag)
+ tddragon_state(const machine_config &mconfig, device_type type, const char *tag) :
+ hh_sm510_state(mconfig, type, tag)
{
- m_inp_lines = 5;
- m_inp_fixed = 5;
+ inp_fixed_last();
}
void tddragon(machine_config &config);
@@ -2544,7 +3885,7 @@ void tddragon_state::tddragon(machine_config &config)
screen.set_svg_region("svg");
screen.set_refresh_hz(50);
screen.set_size(1467, 1080);
- screen.set_visarea(0, 1467-1, 0, 1080-1);
+ screen.set_visarea_full();
TIMER(config, "display_decay").configure_periodic(FUNC(hh_sm510_state::display_decay_tick), attotime::from_msec(1));
@@ -2554,6 +3895,16 @@ void tddragon_state::tddragon(machine_config &config)
m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25);
}
+// roms
+
+ROM_START( tddragon )
+ ROM_REGION( 0x1000, "maincpu", 0 )
+ ROM_LOAD( "593", 0x0000, 0x1000, CRC(2642f778) SHA1(fee77acf93e057a8b4627389dfd481c6d9cbd02b) )
+
+ ROM_REGION( 511434, "svg", 0)
+ ROM_LOAD( "tddragon.svg", 0, 511434, CRC(641e7ceb) SHA1(bbfc37cc085e00921422f65d9aac9949f871e7b7) )
+ROM_END
+
@@ -2569,11 +3920,10 @@ void tddragon_state::tddragon(machine_config &config)
class tkarnov_state : public hh_sm510_state
{
public:
- tkarnov_state(const machine_config &mconfig, device_type type, const char *tag)
- : hh_sm510_state(mconfig, type, tag)
+ tkarnov_state(const machine_config &mconfig, device_type type, const char *tag) :
+ hh_sm510_state(mconfig, type, tag)
{
- m_inp_lines = 6;
- m_inp_fixed = 6;
+ inp_fixed_last();
}
void tkarnov(machine_config &config);
@@ -2639,7 +3989,7 @@ void tkarnov_state::tkarnov(machine_config &config)
screen.set_svg_region("svg");
screen.set_refresh_hz(50);
screen.set_size(1477, 1080);
- screen.set_visarea(0, 1477-1, 0, 1080-1);
+ screen.set_visarea_full();
TIMER(config, "display_decay").configure_periodic(FUNC(hh_sm510_state::display_decay_tick), attotime::from_msec(1));
@@ -2649,6 +3999,16 @@ void tkarnov_state::tkarnov(machine_config &config)
m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25);
}
+// roms
+
+ROM_START( tkarnov )
+ ROM_REGION( 0x1000, "maincpu", 0 )
+ ROM_LOAD( "582", 0x0000, 0x1000, CRC(cee85bdd) SHA1(143e39524f1dea523e0575f327ed189343cc87f5) )
+
+ ROM_REGION( 527377, "svg", 0)
+ ROM_LOAD( "tkarnov.svg", 0, 527377, CRC(971840fc) SHA1(48db7139fa875e60b44340fb475b6d1081ef5c10) )
+ROM_END
+
@@ -2664,11 +4024,10 @@ void tkarnov_state::tkarnov(machine_config &config)
class tvindictr_state : public hh_sm510_state
{
public:
- tvindictr_state(const machine_config &mconfig, device_type type, const char *tag)
- : hh_sm510_state(mconfig, type, tag)
+ tvindictr_state(const machine_config &mconfig, device_type type, const char *tag) :
+ hh_sm510_state(mconfig, type, tag)
{
- m_inp_lines = 6;
- m_inp_fixed = 6;
+ inp_fixed_last();
}
void tvindictr(machine_config &config);
@@ -2733,7 +4092,7 @@ void tvindictr_state::tvindictr(machine_config &config)
screen.set_svg_region("svg");
screen.set_refresh_hz(50);
screen.set_size(1459, 1080);
- screen.set_visarea(0, 1459-1, 0, 1080-1);
+ screen.set_visarea_full();
TIMER(config, "display_decay").configure_periodic(FUNC(hh_sm510_state::display_decay_tick), attotime::from_msec(1));
@@ -2743,6 +4102,16 @@ void tvindictr_state::tvindictr(machine_config &config)
m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25);
}
+// roms
+
+ROM_START( tvindictr )
+ ROM_REGION( 0x1000, "maincpu", 0 )
+ ROM_LOAD( "595", 0x0000, 0x1000, CRC(b574d16f) SHA1(d2cb0f2e21ca2defe49a4b45f4c8e169ae9979ab) )
+
+ ROM_REGION( 314165, "svg", 0)
+ ROM_LOAD( "tvindictr.svg", 0, 314165, CRC(2241992c) SHA1(efd44879d1c0d5befd7ea07089418406fc101315) )
+ROM_END
+
@@ -2758,12 +4127,11 @@ void tvindictr_state::tvindictr(machine_config &config)
class tgaiden_state : public hh_sm510_state
{
public:
- tgaiden_state(const machine_config &mconfig, device_type type, const char *tag)
- : hh_sm510_state(mconfig, type, tag),
+ tgaiden_state(const machine_config &mconfig, device_type type, const char *tag) :
+ hh_sm510_state(mconfig, type, tag),
m_led_out(*this, "led")
{
- m_inp_lines = 5;
- m_inp_fixed = 5;
+ inp_fixed_last();
}
output_finder<> m_led_out;
@@ -2775,6 +4143,14 @@ protected:
virtual void machine_start() override;
};
+void tgaiden_state::machine_start()
+{
+ hh_sm510_state::machine_start();
+
+ // resolve handlers
+ m_led_out.resolve();
+}
+
// handlers
WRITE8_MEMBER(tgaiden_state::write_r)
@@ -2825,14 +4201,6 @@ static INPUT_PORTS_START( tgaiden )
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_sm510_state, acl_button, nullptr) PORT_NAME("ACL")
INPUT_PORTS_END
-void tgaiden_state::machine_start()
-{
- hh_sm510_state::machine_start();
-
- // resolve handlers
- m_led_out.resolve();
-}
-
void tgaiden_state::tgaiden(machine_config &config)
{
/* basic machine hardware */
@@ -2850,7 +4218,7 @@ void tgaiden_state::tgaiden(machine_config &config)
screen.set_svg_region("svg");
screen.set_refresh_hz(50);
screen.set_size(1920, 1080);
- screen.set_visarea(0, 1920-1, 0, 1080-1);
+ screen.set_visarea_full();
TIMER(config, "display_decay").configure_periodic(FUNC(hh_sm510_state::display_decay_tick), attotime::from_msec(1));
@@ -2860,6 +4228,16 @@ void tgaiden_state::tgaiden(machine_config &config)
m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25);
}
+// roms
+
+ROM_START( tgaiden )
+ ROM_REGION( 0x1000, "maincpu", 0 )
+ ROM_LOAD( "m82", 0x0000, 0x1000, CRC(278eafb0) SHA1(14396a0010bade0fde705969151200ed432321e7) )
+
+ ROM_REGION( 100000, "svg", 0)
+ ROM_LOAD( "tgaiden.svg", 0, 100000, NO_DUMP )
+ROM_END
+
@@ -2875,11 +4253,10 @@ void tgaiden_state::tgaiden(machine_config &config)
class tbatman_state : public hh_sm510_state
{
public:
- tbatman_state(const machine_config &mconfig, device_type type, const char *tag)
- : hh_sm510_state(mconfig, type, tag)
+ tbatman_state(const machine_config &mconfig, device_type type, const char *tag) :
+ hh_sm510_state(mconfig, type, tag)
{
- m_inp_lines = 5;
- m_inp_fixed = 5;
+ inp_fixed_last();
}
void tbatman(machine_config &config);
@@ -2940,7 +4317,7 @@ void tbatman_state::tbatman(machine_config &config)
screen.set_svg_region("svg");
screen.set_refresh_hz(50);
screen.set_size(1442, 1080);
- screen.set_visarea(0, 1442-1, 0, 1080-1);
+ screen.set_visarea_full();
TIMER(config, "display_decay").configure_periodic(FUNC(hh_sm510_state::display_decay_tick), attotime::from_msec(1));
@@ -2950,6 +4327,16 @@ void tbatman_state::tbatman(machine_config &config)
m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25);
}
+// roms
+
+ROM_START( tbatman )
+ ROM_REGION( 0x1000, "maincpu", 0 )
+ ROM_LOAD( "597", 0x0000, 0x1000, CRC(8b7acc97) SHA1(fe811675dc5c5ef9f6f969685c933926c8b9e868) )
+
+ ROM_REGION( 551890, "svg", 0)
+ ROM_LOAD( "tbatman.svg", 0, 551890, CRC(65809ee3) SHA1(5fc38bdb2108d45dc99bce3379253423ea88e0fc) )
+ROM_END
+
@@ -2969,11 +4356,10 @@ void tbatman_state::tbatman(machine_config &config)
class tsharr2_state : public hh_sm510_state
{
public:
- tsharr2_state(const machine_config &mconfig, device_type type, const char *tag)
- : hh_sm510_state(mconfig, type, tag)
+ tsharr2_state(const machine_config &mconfig, device_type type, const char *tag) :
+ hh_sm510_state(mconfig, type, tag)
{
- m_inp_lines = 5;
- m_inp_fixed = 5;
+ inp_fixed_last();
}
void tsharr2(machine_config &config);
@@ -3034,7 +4420,7 @@ void tsharr2_state::tsharr2(machine_config &config)
screen.set_svg_region("svg");
screen.set_refresh_hz(50);
screen.set_size(1493, 1080);
- screen.set_visarea(0, 1493-1, 0, 1080-1);
+ screen.set_visarea_full();
TIMER(config, "display_decay").configure_periodic(FUNC(hh_sm510_state::display_decay_tick), attotime::from_msec(1));
@@ -3044,6 +4430,16 @@ void tsharr2_state::tsharr2(machine_config &config)
m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25);
}
+// roms
+
+ROM_START( tsharr2 )
+ ROM_REGION( 0x1000, "maincpu", 0 )
+ ROM_LOAD( "m91", 0x0000, 0x1000, CRC(b207ac79) SHA1(9889dfec26089313ba2bdac845a75a26742d09e1) )
+
+ ROM_REGION( 555126, "svg", 0)
+ ROM_LOAD( "tsharr2.svg", 0, 555126, CRC(ff43e29b) SHA1(0af02e65a1dcf95958296a292343430670b67ae5) )
+ROM_END
+
@@ -3059,11 +4455,10 @@ void tsharr2_state::tsharr2(machine_config &config)
class tstrider_state : public hh_sm510_state
{
public:
- tstrider_state(const machine_config &mconfig, device_type type, const char *tag)
- : hh_sm510_state(mconfig, type, tag)
+ tstrider_state(const machine_config &mconfig, device_type type, const char *tag) :
+ hh_sm510_state(mconfig, type, tag)
{
- m_inp_lines = 5;
- m_inp_fixed = 5;
+ inp_fixed_last();
}
void tstrider(machine_config &config);
@@ -3125,7 +4520,7 @@ void tstrider_state::tstrider(machine_config &config)
screen.set_svg_region("svg");
screen.set_refresh_hz(50);
screen.set_size(1479, 1080);
- screen.set_visarea(0, 1479-1, 0, 1080-1);
+ screen.set_visarea_full();
TIMER(config, "display_decay").configure_periodic(FUNC(hh_sm510_state::display_decay_tick), attotime::from_msec(1));
@@ -3135,6 +4530,16 @@ void tstrider_state::tstrider(machine_config &config)
m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25);
}
+// roms
+
+ROM_START( tstrider )
+ ROM_REGION( 0x1000, "maincpu", 0 )
+ ROM_LOAD( "m92", 0x0000, 0x1000, CRC(4b488e8f) SHA1(b037c220c4a456f0dac67d759736f202a7609ee5) )
+
+ ROM_REGION( 554817, "svg", 0)
+ ROM_LOAD( "tstrider.svg", 0, 554817, CRC(be5de6bd) SHA1(cde0a3fe21af24d7d22d2ce0aec9c308f8696c7e) )
+ROM_END
+
@@ -3150,11 +4555,10 @@ void tstrider_state::tstrider(machine_config &config)
class tgoldnaxe_state : public hh_sm510_state
{
public:
- tgoldnaxe_state(const machine_config &mconfig, device_type type, const char *tag)
- : hh_sm510_state(mconfig, type, tag)
+ tgoldnaxe_state(const machine_config &mconfig, device_type type, const char *tag) :
+ hh_sm510_state(mconfig, type, tag)
{
- m_inp_lines = 6;
- m_inp_fixed = 6;
+ inp_fixed_last();
}
void tgoldnaxe(machine_config &config);
@@ -3220,7 +4624,7 @@ void tgoldnaxe_state::tgoldnaxe(machine_config &config)
screen.set_svg_region("svg");
screen.set_refresh_hz(50);
screen.set_size(1456, 1080);
- screen.set_visarea(0, 1456-1, 0, 1080-1);
+ screen.set_visarea_full();
TIMER(config, "display_decay").configure_periodic(FUNC(hh_sm510_state::display_decay_tick), attotime::from_msec(1));
@@ -3230,6 +4634,16 @@ void tgoldnaxe_state::tgoldnaxe(machine_config &config)
m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25);
}
+// roms
+
+ROM_START( tgoldnaxe )
+ ROM_REGION( 0x1000, "maincpu", 0 )
+ ROM_LOAD( "m94", 0x0000, 0x1000, CRC(af183fbf) SHA1(23716e2a7c4bb4842b2af1a43fe88db44e18dc17) )
+
+ ROM_REGION( 605483, "svg", 0)
+ ROM_LOAD( "tgoldnaxe.svg", 0, 605483, CRC(533bea14) SHA1(08d419bd7af5de7216654dc7f978beed95192c2d) )
+ROM_END
+
@@ -3247,11 +4661,10 @@ void tgoldnaxe_state::tgoldnaxe(machine_config &config)
class trobocop2_state : public hh_sm510_state
{
public:
- trobocop2_state(const machine_config &mconfig, device_type type, const char *tag)
- : hh_sm510_state(mconfig, type, tag)
+ trobocop2_state(const machine_config &mconfig, device_type type, const char *tag) :
+ hh_sm510_state(mconfig, type, tag)
{
- m_inp_lines = 6;
- m_inp_fixed = 6;
+ inp_fixed_last();
}
void trobocop2(machine_config &config);
@@ -3332,7 +4745,7 @@ void trobocop2_state::trobocop2(machine_config &config)
screen.set_svg_region("svg");
screen.set_refresh_hz(50);
screen.set_size(1487, 1080);
- screen.set_visarea(0, 1487-1, 0, 1080-1);
+ screen.set_visarea_full();
TIMER(config, "display_decay").configure_periodic(FUNC(hh_sm510_state::display_decay_tick), attotime::from_msec(1));
@@ -3347,10 +4760,29 @@ void trobocop2_state::trockteer(machine_config &config)
trobocop2(config);
/* video hardware */
- subdevice<screen_device>("screen")->set_size(1463, 1080);
- subdevice<screen_device>("screen")->set_visarea(0, 1463-1, 0, 1080-1);
+ screen_device *screen = subdevice<screen_device>("screen");
+ screen->set_size(1463, 1080);
+ screen->set_visarea_full();
}
+// roms
+
+ROM_START( trobocop2 )
+ ROM_REGION( 0x1000, "maincpu", 0 )
+ ROM_LOAD( "m96", 0x0000, 0x1000, CRC(3704b60c) SHA1(04275833e1a79fd33226faf060890b66ae54e1d3) )
+
+ ROM_REGION( 463532, "svg", 0)
+ ROM_LOAD( "trobocop2.svg", 0, 463532, CRC(c2b92868) SHA1(87912f02bea967c10ba1d8f7c810e3c44b0e3cff) )
+ROM_END
+
+ROM_START( trockteer )
+ ROM_REGION( 0x1000, "maincpu", 0 )
+ ROM_LOAD( "m96", 0x0000, 0x1000, CRC(3704b60c) SHA1(04275833e1a79fd33226faf060890b66ae54e1d3) )
+
+ ROM_REGION( 558086, "svg", 0)
+ ROM_LOAD( "trockteer.svg", 0, 558086, CRC(8afe0f88) SHA1(702127a4ff72be492f72b24bd8917ae0e15f247d) )
+ROM_END
+
@@ -3370,11 +4802,10 @@ void trobocop2_state::trockteer(machine_config &config)
class taltbeast_state : public hh_sm510_state
{
public:
- taltbeast_state(const machine_config &mconfig, device_type type, const char *tag)
- : hh_sm510_state(mconfig, type, tag)
+ taltbeast_state(const machine_config &mconfig, device_type type, const char *tag) :
+ hh_sm510_state(mconfig, type, tag)
{
- m_inp_lines = 6;
- m_inp_fixed = 6;
+ inp_fixed_last();
}
void taltbeast(machine_config &config);
@@ -3440,7 +4871,7 @@ void taltbeast_state::taltbeast(machine_config &config)
screen.set_svg_region("svg");
screen.set_refresh_hz(50);
screen.set_size(1455, 1080);
- screen.set_visarea(0, 1455-1, 0, 1080-1);
+ screen.set_visarea_full();
TIMER(config, "display_decay").configure_periodic(FUNC(hh_sm510_state::display_decay_tick), attotime::from_msec(1));
@@ -3450,6 +4881,16 @@ void taltbeast_state::taltbeast(machine_config &config)
m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25);
}
+// roms
+
+ROM_START( taltbeast )
+ ROM_REGION( 0x1000, "maincpu", 0 )
+ ROM_LOAD( "m88", 0x0000, 0x1000, CRC(1b3d15e7) SHA1(78371230dff872d6c07eefdbc4856c2a3336eb61) )
+
+ ROM_REGION( 667887, "svg", 0)
+ ROM_LOAD( "taltbeast.svg", 0, 667887, CRC(1ca9bbf1) SHA1(be844dddee4a95f70ea2adf875d3ee6cda2a6633) )
+ROM_END
+
@@ -3465,11 +4906,10 @@ void taltbeast_state::taltbeast(machine_config &config)
class tsf2010_state : public hh_sm510_state
{
public:
- tsf2010_state(const machine_config &mconfig, device_type type, const char *tag)
- : hh_sm510_state(mconfig, type, tag)
+ tsf2010_state(const machine_config &mconfig, device_type type, const char *tag) :
+ hh_sm510_state(mconfig, type, tag)
{
- m_inp_lines = 6;
- m_inp_fixed = 6;
+ inp_fixed_last();
}
void tsf2010(machine_config &config);
@@ -3535,7 +4975,7 @@ void tsf2010_state::tsf2010(machine_config &config)
screen.set_svg_region("svg");
screen.set_refresh_hz(50);
screen.set_size(1465, 1080);
- screen.set_visarea(0, 1465-1, 0, 1080-1);
+ screen.set_visarea_full();
TIMER(config, "display_decay").configure_periodic(FUNC(hh_sm510_state::display_decay_tick), attotime::from_msec(1));
@@ -3545,6 +4985,16 @@ void tsf2010_state::tsf2010(machine_config &config)
m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25);
}
+// roms
+
+ROM_START( tsf2010 )
+ ROM_REGION( 0x1000, "maincpu", 0 )
+ ROM_LOAD( "ma2", 0x0000, 0x1000, CRC(764b3757) SHA1(c5f90b860128658576bb837e9cabbb3045ad2756) )
+
+ ROM_REGION( 595149, "svg", 0)
+ ROM_LOAD( "tsf2010.svg", 0, 595149, CRC(b873856b) SHA1(1d070d4d9578bbc322d1edead208bbd44340b71a) )
+ROM_END
+
@@ -3560,11 +5010,10 @@ void tsf2010_state::tsf2010(machine_config &config)
class tswampt_state : public hh_sm510_state
{
public:
- tswampt_state(const machine_config &mconfig, device_type type, const char *tag)
- : hh_sm510_state(mconfig, type, tag)
+ tswampt_state(const machine_config &mconfig, device_type type, const char *tag) :
+ hh_sm510_state(mconfig, type, tag)
{
- m_inp_lines = 5;
- m_inp_fixed = 5;
+ inp_fixed_last();
}
void tswampt(machine_config &config);
@@ -3626,7 +5075,7 @@ void tswampt_state::tswampt(machine_config &config)
screen.set_svg_region("svg");
screen.set_refresh_hz(50);
screen.set_size(1450, 1080);
- screen.set_visarea(0, 1450-1, 0, 1080-1);
+ screen.set_visarea_full();
TIMER(config, "display_decay").configure_periodic(FUNC(hh_sm510_state::display_decay_tick), attotime::from_msec(1));
@@ -3636,6 +5085,16 @@ void tswampt_state::tswampt(machine_config &config)
m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25);
}
+// roms
+
+ROM_START( tswampt )
+ ROM_REGION( 0x1000, "maincpu", 0 )
+ ROM_LOAD( "mb0", 0x0000, 0x1000, CRC(8433530c) SHA1(60716d3bba92dc8ac3f1ee29c5734c9e894a1aff) )
+
+ ROM_REGION( 578505, "svg", 0)
+ ROM_LOAD( "tswampt.svg", 0, 578505, CRC(98ff2fbb) SHA1(a5a4e9934b86f69176549f99246b40f323441945) )
+ROM_END
+
@@ -3651,11 +5110,10 @@ void tswampt_state::tswampt(machine_config &config)
class tspidman_state : public hh_sm510_state
{
public:
- tspidman_state(const machine_config &mconfig, device_type type, const char *tag)
- : hh_sm510_state(mconfig, type, tag)
+ tspidman_state(const machine_config &mconfig, device_type type, const char *tag) :
+ hh_sm510_state(mconfig, type, tag)
{
- m_inp_lines = 6;
- m_inp_fixed = 6;
+ inp_fixed_last();
}
void tspidman(machine_config &config);
@@ -3721,7 +5179,7 @@ void tspidman_state::tspidman(machine_config &config)
screen.set_svg_region("svg");
screen.set_refresh_hz(50);
screen.set_size(1440, 1080);
- screen.set_visarea(0, 1440-1, 0, 1080-1);
+ screen.set_visarea_full();
TIMER(config, "display_decay").configure_periodic(FUNC(hh_sm510_state::display_decay_tick), attotime::from_msec(1));
@@ -3731,6 +5189,16 @@ void tspidman_state::tspidman(machine_config &config)
m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25);
}
+// roms
+
+ROM_START( tspidman )
+ ROM_REGION( 0x1000, "maincpu", 0 )
+ ROM_LOAD( "ma5", 0x0000, 0x1000, CRC(2624daed) SHA1(7c10434ae899637264de706045d48e3fce1d30a7) )
+
+ ROM_REGION( 605332, "svg", 0)
+ ROM_LOAD( "tspidman.svg", 0, 605332, CRC(6e687727) SHA1(c1a2ee450509e05d1db61e02f6a911207d2830c4) )
+ROM_END
+
@@ -3746,11 +5214,10 @@ void tspidman_state::tspidman(machine_config &config)
class txmen_state : public hh_sm510_state
{
public:
- txmen_state(const machine_config &mconfig, device_type type, const char *tag)
- : hh_sm510_state(mconfig, type, tag)
+ txmen_state(const machine_config &mconfig, device_type type, const char *tag) :
+ hh_sm510_state(mconfig, type, tag)
{
- m_inp_lines = 6;
- m_inp_fixed = 6;
+ inp_fixed_last();
}
void txmen(machine_config &config);
@@ -3816,7 +5283,7 @@ void txmen_state::txmen(machine_config &config)
screen.set_svg_region("svg");
screen.set_refresh_hz(50);
screen.set_size(1467, 1080);
- screen.set_visarea(0, 1467-1, 0, 1080-1);
+ screen.set_visarea_full();
TIMER(config, "display_decay").configure_periodic(FUNC(hh_sm510_state::display_decay_tick), attotime::from_msec(1));
@@ -3826,6 +5293,16 @@ void txmen_state::txmen(machine_config &config)
m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25);
}
+// roms
+
+ROM_START( txmen )
+ ROM_REGION( 0x1000, "maincpu", 0 )
+ ROM_LOAD( "ma7", 0x0000, 0x1000, CRC(6f3ff34f) SHA1(aa24fbc3a4117ea51ebf951ee343a36c77692b72) )
+
+ ROM_REGION( 543232, "svg", 0)
+ ROM_LOAD( "txmen.svg", 0, 543232, CRC(51daf7f9) SHA1(b59ecbd83e05478f4b2654a019291c7e06893112) )
+ROM_END
+
@@ -3841,11 +5318,10 @@ void txmen_state::txmen(machine_config &config)
class tddragon3_state : public hh_sm510_state
{
public:
- tddragon3_state(const machine_config &mconfig, device_type type, const char *tag)
- : hh_sm510_state(mconfig, type, tag)
+ tddragon3_state(const machine_config &mconfig, device_type type, const char *tag) :
+ hh_sm510_state(mconfig, type, tag)
{
- m_inp_lines = 6;
- m_inp_fixed = 6;
+ inp_fixed_last();
}
void tddragon3(machine_config &config);
@@ -3911,7 +5387,7 @@ void tddragon3_state::tddragon3(machine_config &config)
screen.set_svg_region("svg");
screen.set_refresh_hz(50);
screen.set_size(1514, 1080);
- screen.set_visarea(0, 1514-1, 0, 1080-1);
+ screen.set_visarea_full();
TIMER(config, "display_decay").configure_periodic(FUNC(hh_sm510_state::display_decay_tick), attotime::from_msec(1));
@@ -3921,6 +5397,16 @@ void tddragon3_state::tddragon3(machine_config &config)
m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25);
}
+// roms
+
+ROM_START( tddragon3 )
+ ROM_REGION( 0x1000, "maincpu", 0 )
+ ROM_LOAD( "ma6", 0x0000, 0x1000, CRC(8e2da0d9) SHA1(54dd05124b4c605975b0cb1eadd7456ff4a94d68) )
+
+ ROM_REGION( 615684, "svg", 0)
+ ROM_LOAD( "tddragon3.svg", 0, 615684, CRC(3f5df090) SHA1(c9248fbf3a4dec0ce3b32b10fb67f133595cc54d) )
+ROM_END
+
@@ -3936,11 +5422,10 @@ void tddragon3_state::tddragon3(machine_config &config)
class tflash_state : public hh_sm510_state
{
public:
- tflash_state(const machine_config &mconfig, device_type type, const char *tag)
- : hh_sm510_state(mconfig, type, tag)
+ tflash_state(const machine_config &mconfig, device_type type, const char *tag) :
+ hh_sm510_state(mconfig, type, tag)
{
- m_inp_lines = 7;
- m_inp_fixed = 7;
+ inp_fixed_last();
}
void tflash(machine_config &config);
@@ -4006,7 +5491,7 @@ void tflash_state::tflash(machine_config &config)
screen.set_svg_region("svg");
screen.set_refresh_hz(50);
screen.set_size(1444, 1080);
- screen.set_visarea(0, 1444-1, 0, 1080-1);
+ screen.set_visarea_full();
TIMER(config, "display_decay").configure_periodic(FUNC(hh_sm510_state::display_decay_tick), attotime::from_msec(1));
@@ -4016,6 +5501,16 @@ void tflash_state::tflash(machine_config &config)
m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25);
}
+// roms
+
+ROM_START( tflash )
+ ROM_REGION( 0x1000, "maincpu", 0 )
+ ROM_LOAD( "mb5", 0x0000, 0x1000, CRC(f7f1d082) SHA1(49a7a931450cf27fe69076c4e15ffb34814e25d4) )
+
+ ROM_REGION( 587820, "svg", 0)
+ ROM_LOAD( "tflash.svg", 0, 587820, CRC(aa1ad063) SHA1(aec6b15569d3d58ff9a4f7db779cda4a1c8efc35) )
+ROM_END
+
@@ -4031,11 +5526,10 @@ void tflash_state::tflash(machine_config &config)
class tmchammer_state : public hh_sm510_state
{
public:
- tmchammer_state(const machine_config &mconfig, device_type type, const char *tag)
- : hh_sm510_state(mconfig, type, tag)
+ tmchammer_state(const machine_config &mconfig, device_type type, const char *tag) :
+ hh_sm510_state(mconfig, type, tag)
{
- m_inp_lines = 6;
- m_inp_fixed = 6;
+ inp_fixed_last();
}
void tmchammer(machine_config &config);
@@ -4101,7 +5595,7 @@ void tmchammer_state::tmchammer(machine_config &config)
screen.set_svg_region("svg");
screen.set_refresh_hz(50);
screen.set_size(1471, 1080);
- screen.set_visarea(0, 1471-1, 0, 1080-1);
+ screen.set_visarea_full();
TIMER(config, "display_decay").configure_periodic(FUNC(hh_sm510_state::display_decay_tick), attotime::from_msec(1));
@@ -4111,6 +5605,19 @@ void tmchammer_state::tmchammer(machine_config &config)
m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25);
}
+// roms
+
+ROM_START( tmchammer )
+ ROM_REGION( 0x1000, "maincpu", 0 )
+ ROM_LOAD( "n63.program", 0x0000, 0x1000, CRC(303aa6f7) SHA1(296689be1ee05238e52e9882812868b2ea96202c) )
+
+ ROM_REGION( 0x100, "maincpu:melody", 0 )
+ ROM_LOAD( "n63.melody", 0x000, 0x100, CRC(77c1a5a3) SHA1(c00ae3b7c64dd9db96eab520fe674a40571fc15f) )
+
+ ROM_REGION( 456446, "svg", 0)
+ ROM_LOAD( "tmchammer.svg", 0, 456446, CRC(79d6d45d) SHA1(bf6b8c6fdccad657377ad9f721dd22408f6ae775) )
+ROM_END
+
@@ -4126,11 +5633,10 @@ void tmchammer_state::tmchammer(machine_config &config)
class tbtoads_state : public hh_sm510_state
{
public:
- tbtoads_state(const machine_config &mconfig, device_type type, const char *tag)
- : hh_sm510_state(mconfig, type, tag)
+ tbtoads_state(const machine_config &mconfig, device_type type, const char *tag) :
+ hh_sm510_state(mconfig, type, tag)
{
- m_inp_lines = 6;
- m_inp_fixed = 6;
+ inp_fixed_last();
}
void tbtoads(machine_config &config);
@@ -4196,7 +5702,7 @@ void tbtoads_state::tbtoads(machine_config &config)
screen.set_svg_region("svg");
screen.set_refresh_hz(50);
screen.set_size(1454, 1080);
- screen.set_visarea(0, 1454-1, 0, 1080-1);
+ screen.set_visarea_full();
TIMER(config, "display_decay").configure_periodic(FUNC(hh_sm510_state::display_decay_tick), attotime::from_msec(1));
@@ -4206,6 +5712,16 @@ void tbtoads_state::tbtoads(machine_config &config)
m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25);
}
+// roms
+
+ROM_START( tbtoads )
+ ROM_REGION( 0x1000, "maincpu", 0 )
+ ROM_LOAD( "mb3", 0x0000, 0x1000, CRC(8fa4c55a) SHA1(2be97e63dfed51313e180d7388dd431058db5a51) )
+
+ ROM_REGION( 694365, "svg", 0)
+ ROM_LOAD( "tbtoads.svg", 0, 694365, CRC(3af488e9) SHA1(d0e9ec61fac23bb22e508da4fa8bf2a7b8f186cf) )
+ROM_END
+
@@ -4221,11 +5737,10 @@ void tbtoads_state::tbtoads(machine_config &config)
class thook_state : public hh_sm510_state
{
public:
- thook_state(const machine_config &mconfig, device_type type, const char *tag)
- : hh_sm510_state(mconfig, type, tag)
+ thook_state(const machine_config &mconfig, device_type type, const char *tag) :
+ hh_sm510_state(mconfig, type, tag)
{
- m_inp_lines = 6;
- m_inp_fixed = 6;
+ inp_fixed_last();
}
void thook(machine_config &config);
@@ -4291,7 +5806,7 @@ void thook_state::thook(machine_config &config)
screen.set_svg_region("svg");
screen.set_refresh_hz(50);
screen.set_size(1489, 1080);
- screen.set_visarea(0, 1489-1, 0, 1080-1);
+ screen.set_visarea_full();
TIMER(config, "display_decay").configure_periodic(FUNC(hh_sm510_state::display_decay_tick), attotime::from_msec(1));
@@ -4301,6 +5816,16 @@ void thook_state::thook(machine_config &config)
m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25);
}
+// roms
+
+ROM_START( thook )
+ ROM_REGION( 0x1000, "maincpu", 0 )
+ ROM_LOAD( "mb7", 0x0000, 0x1000, CRC(7eb1a6e2) SHA1(f4a09ab95c968b0ddbe56cd7bb2667881c145731) )
+
+ ROM_REGION( 680503, "svg", 0)
+ ROM_LOAD( "thook.svg", 0, 680503, CRC(28bd6da2) SHA1(e97b1dda219a766ffcca15d1b3279f5cee5e2fed) )
+ROM_END
+
@@ -4319,11 +5844,10 @@ void thook_state::thook(machine_config &config)
class tbttf_state : public hh_sm510_state
{
public:
- tbttf_state(const machine_config &mconfig, device_type type, const char *tag)
- : hh_sm510_state(mconfig, type, tag)
+ tbttf_state(const machine_config &mconfig, device_type type, const char *tag) :
+ hh_sm510_state(mconfig, type, tag)
{
- m_inp_lines = 5;
- m_inp_fixed = 5;
+ inp_fixed_last();
}
void tbttf(machine_config &config);
@@ -4385,7 +5909,7 @@ void tbttf_state::tbttf(machine_config &config)
screen.set_svg_region("svg");
screen.set_refresh_hz(50);
screen.set_size(1466, 1080);
- screen.set_visarea(0, 1466-1, 0, 1080-1);
+ screen.set_visarea_full();
TIMER(config, "display_decay").configure_periodic(FUNC(hh_sm510_state::display_decay_tick), attotime::from_msec(1));
@@ -4395,6 +5919,16 @@ void tbttf_state::tbttf(machine_config &config)
m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25);
}
+// roms
+
+ROM_START( tbttf )
+ ROM_REGION( 0x1000, "maincpu", 0 )
+ ROM_LOAD( "mc3", 0x0000, 0x1000, CRC(9c37a23c) SHA1(c09fa5caac8b574f8460265b98c0bea1d5e78c6a) )
+
+ ROM_REGION( 667700, "svg", 0)
+ ROM_LOAD( "tbttf.svg", 0, 667700, CRC(d1d19ec5) SHA1(7361943ccf1f4072bba6fd4e6acae3e2f3d7a0ea) )
+ROM_END
+
@@ -4412,11 +5946,10 @@ void tbttf_state::tbttf(machine_config &config)
class taddams_state : public hh_sm510_state
{
public:
- taddams_state(const machine_config &mconfig, device_type type, const char *tag)
- : hh_sm510_state(mconfig, type, tag)
+ taddams_state(const machine_config &mconfig, device_type type, const char *tag) :
+ hh_sm510_state(mconfig, type, tag)
{
- m_inp_lines = 6;
- m_inp_fixed = 6;
+ inp_fixed_last();
}
void taddams(machine_config &config);
@@ -4482,7 +6015,7 @@ void taddams_state::taddams(machine_config &config)
screen.set_svg_region("svg");
screen.set_refresh_hz(50);
screen.set_size(1464, 1080);
- screen.set_visarea(0, 1464-1, 0, 1080-1);
+ screen.set_visarea_full();
TIMER(config, "display_decay").configure_periodic(FUNC(hh_sm510_state::display_decay_tick), attotime::from_msec(1));
@@ -4492,6 +6025,16 @@ void taddams_state::taddams(machine_config &config)
m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25);
}
+// roms
+
+ROM_START( taddams )
+ ROM_REGION( 0x1000, "maincpu", 0 )
+ ROM_LOAD( "mc2", 0x0000, 0x1000, CRC(af33d432) SHA1(676ada238c389d1dd02dcb29731d69624f60b342) )
+
+ ROM_REGION( 554649, "svg", 0)
+ ROM_LOAD( "taddams.svg", 0, 554649, CRC(0b916c6d) SHA1(5a2456b4a0f31db94a78373baab46f3ff9732b92) )
+ROM_END
+
@@ -4507,11 +6050,10 @@ void taddams_state::taddams(machine_config &config)
class thalone_state : public hh_sm510_state
{
public:
- thalone_state(const machine_config &mconfig, device_type type, const char *tag)
- : hh_sm510_state(mconfig, type, tag)
+ thalone_state(const machine_config &mconfig, device_type type, const char *tag) :
+ hh_sm510_state(mconfig, type, tag)
{
- m_inp_lines = 6;
- m_inp_fixed = 6;
+ inp_fixed_last();
}
void thalone(machine_config &config);
@@ -4577,7 +6119,7 @@ void thalone_state::thalone(machine_config &config)
screen.set_svg_region("svg");
screen.set_refresh_hz(50);
screen.set_size(1448, 1080);
- screen.set_visarea(0, 1448-1, 0, 1080-1);
+ screen.set_visarea_full();
TIMER(config, "display_decay").configure_periodic(FUNC(hh_sm510_state::display_decay_tick), attotime::from_msec(1));
@@ -4587,6 +6129,16 @@ void thalone_state::thalone(machine_config &config)
m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25);
}
+// roms
+
+ROM_START( thalone )
+ ROM_REGION( 0x1000, "maincpu", 0 )
+ ROM_LOAD( "mc7", 0x0000, 0x1000, CRC(eceda335) SHA1(20c9ffcf914db61aba03716fe146bac42873ac82) )
+
+ ROM_REGION( 494235, "svg", 0)
+ ROM_LOAD( "thalone.svg", 0, 494235, CRC(0e32df1d) SHA1(1fff1d37a5fe66d4f59d12af3ce67665c0049800) )
+ROM_END
+
@@ -4602,11 +6154,10 @@ void thalone_state::thalone(machine_config &config)
class txmenpx_state : public hh_sm510_state
{
public:
- txmenpx_state(const machine_config &mconfig, device_type type, const char *tag)
- : hh_sm510_state(mconfig, type, tag)
+ txmenpx_state(const machine_config &mconfig, device_type type, const char *tag) :
+ hh_sm510_state(mconfig, type, tag)
{
- m_inp_lines = 5;
- m_inp_fixed = 5;
+ inp_fixed_last();
}
void txmenpx(machine_config &config);
@@ -4668,7 +6219,7 @@ void txmenpx_state::txmenpx(machine_config &config)
screen.set_svg_region("svg");
screen.set_refresh_hz(50);
screen.set_size(1464, 1080);
- screen.set_visarea(0, 1464-1, 0, 1080-1);
+ screen.set_visarea_full();
TIMER(config, "display_decay").configure_periodic(FUNC(hh_sm510_state::display_decay_tick), attotime::from_msec(1));
@@ -4678,6 +6229,16 @@ void txmenpx_state::txmenpx(machine_config &config)
m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25);
}
+// roms
+
+ROM_START( txmenpx )
+ ROM_REGION( 0x1000, "maincpu", 0 )
+ ROM_LOAD( "md3", 0x0000, 0x1000, CRC(11c2b09a) SHA1(f94b1e3e60f002398b39c98946469dd1a6aa8e77) )
+
+ ROM_REGION( 572538, "svg", 0)
+ ROM_LOAD( "txmenpx.svg", 0, 572538, CRC(9a89c753) SHA1(e3828a8c10c77ee5634128d0e9239e8cda19f988) )
+ROM_END
+
@@ -4693,11 +6254,10 @@ void txmenpx_state::txmenpx(machine_config &config)
class thalone2_state : public hh_sm510_state
{
public:
- thalone2_state(const machine_config &mconfig, device_type type, const char *tag)
- : hh_sm510_state(mconfig, type, tag)
+ thalone2_state(const machine_config &mconfig, device_type type, const char *tag) :
+ hh_sm510_state(mconfig, type, tag)
{
- m_inp_lines = 6;
- m_inp_fixed = 6;
+ inp_fixed_last();
}
void thalone2(machine_config &config);
@@ -4763,7 +6323,7 @@ void thalone2_state::thalone2(machine_config &config)
screen.set_svg_region("svg");
screen.set_refresh_hz(50);
screen.set_size(1454, 1080);
- screen.set_visarea(0, 1454-1, 0, 1080-1);
+ screen.set_visarea_full();
TIMER(config, "display_decay").configure_periodic(FUNC(hh_sm510_state::display_decay_tick), attotime::from_msec(1));
@@ -4773,6 +6333,16 @@ void thalone2_state::thalone2(machine_config &config)
m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25);
}
+// roms
+
+ROM_START( thalone2 )
+ ROM_REGION( 0x1000, "maincpu", 0 )
+ ROM_LOAD( "md7", 0x0000, 0x1000, CRC(ac8a21e9) SHA1(9024f74e34056f90b7dbf439300797183f74eb00) )
+
+ ROM_REGION( 748886, "svg", 0)
+ ROM_LOAD( "thalone2.svg", 0, 748886, CRC(a5d8898e) SHA1(de8fae0169a3797a46b5c81d9b556df636a5674e) )
+ROM_END
+
@@ -4788,11 +6358,10 @@ void thalone2_state::thalone2(machine_config &config)
class tsonic_state : public hh_sm510_state
{
public:
- tsonic_state(const machine_config &mconfig, device_type type, const char *tag)
- : hh_sm510_state(mconfig, type, tag)
+ tsonic_state(const machine_config &mconfig, device_type type, const char *tag) :
+ hh_sm510_state(mconfig, type, tag)
{
- m_inp_lines = 5;
- m_inp_fixed = 5;
+ inp_fixed_last();
}
void tsonic(machine_config &config);
@@ -4852,7 +6421,8 @@ void tsonic_state::tsonic(machine_config &config)
screen.set_svg_region("svg");
screen.set_refresh_hz(50);
screen.set_size(1517, 1080);
- screen.set_visarea(0, 1517-1, 0, 1080-1);
+ screen.set_visarea_full();
+
TIMER(config, "display_decay").configure_periodic(FUNC(hh_sm510_state::display_decay_tick), attotime::from_msec(1));
/* sound hardware */
@@ -4862,6 +6432,19 @@ void tsonic_state::tsonic(machine_config &config)
m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25);
}
+// roms
+
+ROM_START( tsonic )
+ ROM_REGION( 0x1000, "maincpu", 0 )
+ ROM_LOAD( "n71.program", 0x0000, 0x1000, CRC(44cafd68) SHA1(bf8d0ab88d153fabc688ffec19959209ca79c3db) )
+
+ ROM_REGION( 0x100, "maincpu:melody", 0 )
+ ROM_LOAD( "n71.melody", 0x000, 0x100, CRC(bae258c8) SHA1(81cb75d73fab4479cd92fcb13d9cb03cec2afdd5) )
+
+ ROM_REGION( 541450, "svg", 0)
+ ROM_LOAD( "tsonic.svg", 0, 541450, CRC(f01835e3) SHA1(25f924af55ffadd2aebf50a89f75571d788d5ac1) )
+ROM_END
+
@@ -4877,11 +6460,10 @@ void tsonic_state::tsonic(machine_config &config)
class trobocop3_state : public hh_sm510_state
{
public:
- trobocop3_state(const machine_config &mconfig, device_type type, const char *tag)
- : hh_sm510_state(mconfig, type, tag)
+ trobocop3_state(const machine_config &mconfig, device_type type, const char *tag) :
+ hh_sm510_state(mconfig, type, tag)
{
- m_inp_lines = 6;
- m_inp_fixed = 6;
+ inp_fixed_last();
}
void trobocop3(machine_config &config);
@@ -4947,7 +6529,7 @@ void trobocop3_state::trobocop3(machine_config &config)
screen.set_svg_region("svg");
screen.set_refresh_hz(50);
screen.set_size(1464, 1080);
- screen.set_visarea(0, 1464-1, 0, 1080-1);
+ screen.set_visarea_full();
TIMER(config, "display_decay").configure_periodic(FUNC(hh_sm510_state::display_decay_tick), attotime::from_msec(1));
@@ -4957,6 +6539,16 @@ void trobocop3_state::trobocop3(machine_config &config)
m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25);
}
+// roms
+
+ROM_START( trobocop3 )
+ ROM_REGION( 0x1000, "maincpu", 0 )
+ ROM_LOAD( "mc6", 0x0000, 0x1000, CRC(07b44e4c) SHA1(3165c85e16c062d2d9d0c0f1b1f6bd6079b4de15) )
+
+ ROM_REGION( 612103, "svg", 0)
+ ROM_LOAD( "trobocop3.svg", 0, 612103, CRC(9a162642) SHA1(b775f64e4616c4fc8d2c139938f148c9666e646a) )
+ROM_END
+
@@ -4972,11 +6564,10 @@ void trobocop3_state::trobocop3(machine_config &config)
class tdummies_state : public hh_sm510_state
{
public:
- tdummies_state(const machine_config &mconfig, device_type type, const char *tag)
- : hh_sm510_state(mconfig, type, tag)
+ tdummies_state(const machine_config &mconfig, device_type type, const char *tag) :
+ hh_sm510_state(mconfig, type, tag)
{
- m_inp_lines = 5;
- m_inp_fixed = 5;
+ inp_fixed_last();
}
void tdummies(machine_config &config);
@@ -5038,7 +6629,7 @@ void tdummies_state::tdummies(machine_config &config)
screen.set_svg_region("svg");
screen.set_refresh_hz(50);
screen.set_size(1441, 1080);
- screen.set_visarea(0, 1441-1, 0, 1080-1);
+ screen.set_visarea_full();
TIMER(config, "display_decay").configure_periodic(FUNC(hh_sm510_state::display_decay_tick), attotime::from_msec(1));
@@ -5048,6 +6639,16 @@ void tdummies_state::tdummies(machine_config &config)
m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25);
}
+// roms
+
+ROM_START( tdummies )
+ ROM_REGION( 0x1000, "maincpu", 0 )
+ ROM_LOAD( "me0", 0x0000, 0x1000, CRC(29efae4a) SHA1(0b26913a3fd2fde2b39549f0f7cbc3daaa41eb50) )
+
+ ROM_REGION( 525493, "svg", 0)
+ ROM_LOAD( "tdummies.svg", 0, 525493, CRC(a18a5216) SHA1(1238e8c489445e715d4fc53e597820845b386233) )
+ROM_END
+
@@ -5063,11 +6664,10 @@ void tdummies_state::tdummies(machine_config &config)
class tsfight2_state : public hh_sm510_state
{
public:
- tsfight2_state(const machine_config &mconfig, device_type type, const char *tag)
- : hh_sm510_state(mconfig, type, tag)
+ tsfight2_state(const machine_config &mconfig, device_type type, const char *tag) :
+ hh_sm510_state(mconfig, type, tag)
{
- m_inp_lines = 6;
- m_inp_fixed = 6;
+ inp_fixed_last();
}
void tsfight2(machine_config &config);
@@ -5133,7 +6733,7 @@ void tsfight2_state::tsfight2(machine_config &config)
screen.set_svg_region("svg");
screen.set_refresh_hz(50);
screen.set_size(1444, 1080);
- screen.set_visarea(0, 1444-1, 0, 1080-1);
+ screen.set_visarea_full();
TIMER(config, "display_decay").configure_periodic(FUNC(hh_sm510_state::display_decay_tick), attotime::from_msec(1));
@@ -5143,6 +6743,16 @@ void tsfight2_state::tsfight2(machine_config &config)
m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25);
}
+// roms
+
+ROM_START( tsfight2 )
+ ROM_REGION( 0x1000, "maincpu", 0 )
+ ROM_LOAD( "me1", 0x0000, 0x1000, CRC(73384e94) SHA1(350417d101ce034b3974b4a1d2e04bcb3bf70605) )
+
+ ROM_REGION( 630403, "svg", 0)
+ ROM_LOAD( "tsfight2.svg", 0, 630403, CRC(eadc2c81) SHA1(20b2a797f6b9a008c1994eaee7b87e3fe828e837) )
+ROM_END
+
@@ -5158,11 +6768,10 @@ void tsfight2_state::tsfight2(machine_config &config)
class twworld_state : public hh_sm510_state
{
public:
- twworld_state(const machine_config &mconfig, device_type type, const char *tag)
- : hh_sm510_state(mconfig, type, tag)
+ twworld_state(const machine_config &mconfig, device_type type, const char *tag) :
+ hh_sm510_state(mconfig, type, tag)
{
- m_inp_lines = 6;
- m_inp_fixed = 6;
+ inp_fixed_last();
}
void twworld(machine_config &config);
@@ -5228,7 +6837,7 @@ void twworld_state::twworld(machine_config &config)
screen.set_svg_region("svg");
screen.set_refresh_hz(50);
screen.set_size(1429, 1080);
- screen.set_visarea(0, 1429-1, 0, 1080-1);
+ screen.set_visarea_full();
TIMER(config, "display_decay").configure_periodic(FUNC(hh_sm510_state::display_decay_tick), attotime::from_msec(1));
@@ -5238,6 +6847,16 @@ void twworld_state::twworld(machine_config &config)
m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25);
}
+// roms
+
+ROM_START( twworld )
+ ROM_REGION( 0x1000, "maincpu", 0 )
+ ROM_LOAD( "me7", 0x0000, 0x1000, CRC(dcb16d98) SHA1(539989e12bbc4a719818546c5edcfda02b98210e) )
+
+ ROM_REGION( 527859, "svg", 0)
+ ROM_LOAD( "twworld.svg", 0, 527859, CRC(0a2cffce) SHA1(d8c3f2fef60357e47ce0b44d588d0bb39112c8b9) )
+ROM_END
+
@@ -5253,11 +6872,10 @@ void twworld_state::twworld(machine_config &config)
class tjpark_state : public hh_sm510_state
{
public:
- tjpark_state(const machine_config &mconfig, device_type type, const char *tag)
- : hh_sm510_state(mconfig, type, tag)
+ tjpark_state(const machine_config &mconfig, device_type type, const char *tag) :
+ hh_sm510_state(mconfig, type, tag)
{
- m_inp_lines = 5;
- m_inp_fixed = 5;
+ inp_fixed_last();
}
void tjpark(machine_config &config);
@@ -5319,7 +6937,7 @@ void tjpark_state::tjpark(machine_config &config)
screen.set_svg_region("svg");
screen.set_refresh_hz(50);
screen.set_size(1454, 1080);
- screen.set_visarea(0, 1454-1, 0, 1080-1);
+ screen.set_visarea_full();
TIMER(config, "display_decay").configure_periodic(FUNC(hh_sm510_state::display_decay_tick), attotime::from_msec(1));
@@ -5329,6 +6947,16 @@ void tjpark_state::tjpark(machine_config &config)
m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25);
}
+// roms
+
+ROM_START( tjpark )
+ ROM_REGION( 0x1000, "maincpu", 0 )
+ ROM_LOAD( "mf4", 0x0000, 0x1000, CRC(f66faf73) SHA1(4cfa743dcd6e44a3c1f56206d5824fddba16df01) )
+
+ ROM_REGION( 812575, "svg", 0)
+ ROM_LOAD( "tjpark.svg", 0, 812575, CRC(539c9b9c) SHA1(bf9a95586438df677d753deb17abc97f8837cbe3) )
+ROM_END
+
@@ -5344,11 +6972,10 @@ void tjpark_state::tjpark(machine_config &config)
class tsonic2_state : public hh_sm510_state
{
public:
- tsonic2_state(const machine_config &mconfig, device_type type, const char *tag)
- : hh_sm510_state(mconfig, type, tag)
+ tsonic2_state(const machine_config &mconfig, device_type type, const char *tag) :
+ hh_sm510_state(mconfig, type, tag)
{
- m_inp_lines = 5;
- m_inp_fixed = 5;
+ inp_fixed_last();
}
void tsonic2(machine_config &config);
@@ -5408,7 +7035,8 @@ void tsonic2_state::tsonic2(machine_config &config)
screen.set_svg_region("svg");
screen.set_refresh_hz(50);
screen.set_size(1475, 1080);
- screen.set_visarea(0, 1475-1, 0, 1080-1);
+ screen.set_visarea_full();
+
TIMER(config, "display_decay").configure_periodic(FUNC(hh_sm510_state::display_decay_tick), attotime::from_msec(1));
/* sound hardware */
@@ -5418,6 +7046,19 @@ void tsonic2_state::tsonic2(machine_config &config)
m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25);
}
+// roms
+
+ROM_START( tsonic2 )
+ ROM_REGION( 0x1000, "maincpu", 0 )
+ ROM_LOAD( "n86.program", 0x0000, 0x1000, CRC(782874c5) SHA1(b7eb1f56cbc781ba0b90f6b4b5b51944120733cc) )
+
+ ROM_REGION( 0x100, "maincpu:melody", 0 )
+ ROM_LOAD( "n86.melody", 0x000, 0x100, CRC(c16fa2b2) SHA1(222772d311fd3b3b05d80cfd539c2c862bed0be5) )
+
+ ROM_REGION( 667887, "svg", 0)
+ ROM_LOAD( "tsonic2.svg", 0, 667887, CRC(ef82d40e) SHA1(f22efba565adb32634d8b46c31459ec833b13d98) )
+ROM_END
+
@@ -5437,11 +7078,10 @@ void tsonic2_state::tsonic2(machine_config &config)
class tsddragon_state : public hh_sm510_state
{
public:
- tsddragon_state(const machine_config &mconfig, device_type type, const char *tag)
- : hh_sm510_state(mconfig, type, tag)
+ tsddragon_state(const machine_config &mconfig, device_type type, const char *tag) :
+ hh_sm510_state(mconfig, type, tag)
{
- m_inp_lines = 6;
- m_inp_fixed = 6;
+ inp_fixed_last();
}
void tsddragon(machine_config &config);
@@ -5508,7 +7148,7 @@ void tsddragon_state::tsddragon(machine_config &config)
screen.set_svg_region("svg");
screen.set_refresh_hz(50);
screen.set_size(1503, 1080);
- screen.set_visarea(0, 1503-1, 0, 1080-1);
+ screen.set_visarea_full();
TIMER(config, "display_decay").configure_periodic(FUNC(hh_sm510_state::display_decay_tick), attotime::from_msec(1));
@@ -5518,6 +7158,16 @@ void tsddragon_state::tsddragon(machine_config &config)
m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25);
}
+// roms
+
+ROM_START( tsddragon )
+ ROM_REGION( 0x1000, "maincpu", 0 )
+ ROM_LOAD( "mf5", 0x0000, 0x1000, CRC(264c8e82) SHA1(470eb2f09a58ef05eb0b7c8e11380ad1d8ce4e1a) )
+
+ ROM_REGION( 753533, "svg", 0)
+ ROM_LOAD( "tsddragon.svg", 0, 753533, CRC(fb526049) SHA1(552fe005a6e23e083867b7d1c10d20daa8913a14) )
+ROM_END
+
@@ -5533,11 +7183,10 @@ void tsddragon_state::tsddragon(machine_config &config)
class tdennis_state : public hh_sm510_state
{
public:
- tdennis_state(const machine_config &mconfig, device_type type, const char *tag)
- : hh_sm510_state(mconfig, type, tag)
+ tdennis_state(const machine_config &mconfig, device_type type, const char *tag) :
+ hh_sm510_state(mconfig, type, tag)
{
- m_inp_lines = 6;
- m_inp_fixed = 6;
+ inp_fixed_last();
}
void tdennis(machine_config &config);
@@ -5604,7 +7253,7 @@ void tdennis_state::tdennis(machine_config &config)
screen.set_svg_region("svg");
screen.set_refresh_hz(50);
screen.set_size(1467, 1080);
- screen.set_visarea(0, 1467-1, 0, 1080-1);
+ screen.set_visarea_full();
TIMER(config, "display_decay").configure_periodic(FUNC(hh_sm510_state::display_decay_tick), attotime::from_msec(1));
@@ -5614,6 +7263,16 @@ void tdennis_state::tdennis(machine_config &config)
m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25);
}
+// roms
+
+ROM_START( tdennis )
+ ROM_REGION( 0x1000, "maincpu", 0 )
+ ROM_LOAD( "mf9", 0x0000, 0x1000, CRC(d95f54d5) SHA1(1b3a170f32deec98e54ad09c04b404f5ae03dcea) )
+
+ ROM_REGION( 754842, "svg", 0)
+ ROM_LOAD( "tdennis.svg", 0, 754842, CRC(3b1ed476) SHA1(adc94919daa9a6c42f1acd8ef5113b61859338b7) )
+ROM_END
+
@@ -5629,11 +7288,10 @@ void tdennis_state::tdennis(machine_config &config)
class tnmarebc_state : public hh_sm510_state
{
public:
- tnmarebc_state(const machine_config &mconfig, device_type type, const char *tag)
- : hh_sm510_state(mconfig, type, tag)
+ tnmarebc_state(const machine_config &mconfig, device_type type, const char *tag) :
+ hh_sm510_state(mconfig, type, tag)
{
- m_inp_lines = 5;
- m_inp_fixed = 5;
+ inp_fixed_last();
}
virtual DECLARE_WRITE8_MEMBER(input_w) override;
@@ -5703,7 +7361,7 @@ void tnmarebc_state::tnmarebc(machine_config &config)
screen.set_svg_region("svg");
screen.set_refresh_hz(50);
screen.set_size(1456, 1080);
- screen.set_visarea(0, 1456-1, 0, 1080-1);
+ screen.set_visarea_full();
TIMER(config, "display_decay").configure_periodic(FUNC(hh_sm510_state::display_decay_tick), attotime::from_msec(1));
@@ -5713,6 +7371,16 @@ void tnmarebc_state::tnmarebc(machine_config &config)
m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25);
}
+// roms
+
+ROM_START( tnmarebc )
+ ROM_REGION( 0x1000, "maincpu", 0 )
+ ROM_LOAD( "mg0", 0x0000, 0x1000, CRC(5ef21421) SHA1(8fd458575111b89d7c33c969e76703bde5ad2c36) )
+
+ ROM_REGION( 631310, "svg", 0)
+ ROM_LOAD( "tnmarebc.svg", 0, 631310, CRC(f9c96205) SHA1(1947d358efd94ae3257ed959172a819798d2c9a1) )
+ROM_END
+
@@ -5728,11 +7396,10 @@ void tnmarebc_state::tnmarebc(machine_config &config)
class ttransf2_state : public hh_sm510_state
{
public:
- ttransf2_state(const machine_config &mconfig, device_type type, const char *tag)
- : hh_sm510_state(mconfig, type, tag)
+ ttransf2_state(const machine_config &mconfig, device_type type, const char *tag) :
+ hh_sm510_state(mconfig, type, tag)
{
- m_inp_lines = 6;
- m_inp_fixed = 6;
+ inp_fixed_last();
}
void ttransf2(machine_config &config);
@@ -5798,7 +7465,7 @@ void ttransf2_state::ttransf2(machine_config &config)
screen.set_svg_region("svg");
screen.set_refresh_hz(50);
screen.set_size(1476, 1080);
- screen.set_visarea(0, 1476-1, 0, 1080-1);
+ screen.set_visarea_full();
TIMER(config, "display_decay").configure_periodic(FUNC(hh_sm510_state::display_decay_tick), attotime::from_msec(1));
@@ -5808,6 +7475,16 @@ void ttransf2_state::ttransf2(machine_config &config)
m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25);
}
+// roms
+
+ROM_START( ttransf2 )
+ ROM_REGION( 0x1000, "maincpu", 0 )
+ ROM_LOAD( "mg2", 0x0000, 0x1000, CRC(65c0f456) SHA1(b1bc3887c5088b3fe359585658e5c5236c09af9e) )
+
+ ROM_REGION( 727662, "svg", 0)
+ ROM_LOAD( "ttransf2.svg", 0, 727662, CRC(52fd5ea1) SHA1(35ae9fe2cea14ee4c591df0458fed478c9feb044) )
+ROM_END
+
@@ -5823,11 +7500,10 @@ void ttransf2_state::ttransf2(machine_config &config)
class topaliens_state : public hh_sm510_state
{
public:
- topaliens_state(const machine_config &mconfig, device_type type, const char *tag)
- : hh_sm510_state(mconfig, type, tag)
+ topaliens_state(const machine_config &mconfig, device_type type, const char *tag) :
+ hh_sm510_state(mconfig, type, tag)
{
- m_inp_lines = 5;
- m_inp_fixed = 5;
+ inp_fixed_last();
}
void topaliens(machine_config &config);
@@ -5889,7 +7565,7 @@ void topaliens_state::topaliens(machine_config &config)
screen.set_svg_region("svg");
screen.set_refresh_hz(50);
screen.set_size(1450, 1080);
- screen.set_visarea(0, 1450-1, 0, 1080-1);
+ screen.set_visarea_full();
TIMER(config, "display_decay").configure_periodic(FUNC(hh_sm510_state::display_decay_tick), attotime::from_msec(1));
@@ -5899,6 +7575,16 @@ void topaliens_state::topaliens(machine_config &config)
m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25);
}
+// roms
+
+ROM_START( topaliens )
+ ROM_REGION( 0x1000, "maincpu", 0 )
+ ROM_LOAD( "mj1", 0x0000, 0x1000, CRC(ccc196cf) SHA1(f18f7cf842cddecf90d05ab0f90257bb76514f54) )
+
+ ROM_REGION( 1214876, "svg", 0)
+ ROM_LOAD( "topaliens.svg", 0, 1214876, CRC(683c70aa) SHA1(0fac5ba8ab5f9b73a3cbbff046be60550fa5f98a) )
+ROM_END
+
@@ -5914,11 +7600,10 @@ void topaliens_state::topaliens(machine_config &config)
class tmkombat_state : public hh_sm510_state
{
public:
- tmkombat_state(const machine_config &mconfig, device_type type, const char *tag)
- : hh_sm510_state(mconfig, type, tag)
+ tmkombat_state(const machine_config &mconfig, device_type type, const char *tag) :
+ hh_sm510_state(mconfig, type, tag)
{
- m_inp_lines = 6;
- m_inp_fixed = 6;
+ inp_fixed_last();
}
void tmkombat(machine_config &config);
@@ -5985,7 +7670,7 @@ void tmkombat_state::tmkombat(machine_config &config)
screen.set_svg_region("svg");
screen.set_refresh_hz(50);
screen.set_size(1468, 1080);
- screen.set_visarea(0, 1468-1, 0, 1080-1);
+ screen.set_visarea_full();
TIMER(config, "display_decay").configure_periodic(FUNC(hh_sm510_state::display_decay_tick), attotime::from_msec(1));
@@ -5995,6 +7680,16 @@ void tmkombat_state::tmkombat(machine_config &config)
m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25);
}
+// roms
+
+ROM_START( tmkombat )
+ ROM_REGION( 0x1000, "maincpu", 0 )
+ ROM_LOAD( "mg6", 0x0000, 0x1000, CRC(f6375dc7) SHA1(a711199c2623979f19c11067ebfff9355256c2c3) )
+
+ ROM_REGION( 841829, "svg", 0)
+ ROM_LOAD( "tmkombat.svg", 0, 841829, CRC(9dc4f58c) SHA1(9c9b080d7f3b777407445c22195990c55c6352ca) )
+ROM_END
+
@@ -6010,11 +7705,10 @@ void tmkombat_state::tmkombat(machine_config &config)
class tshadow_state : public hh_sm510_state
{
public:
- tshadow_state(const machine_config &mconfig, device_type type, const char *tag)
- : hh_sm510_state(mconfig, type, tag)
+ tshadow_state(const machine_config &mconfig, device_type type, const char *tag) :
+ hh_sm510_state(mconfig, type, tag)
{
- m_inp_lines = 6;
- m_inp_fixed = 6;
+ inp_fixed_last();
}
void tshadow(machine_config &config);
@@ -6080,7 +7774,7 @@ void tshadow_state::tshadow(machine_config &config)
screen.set_svg_region("svg");
screen.set_refresh_hz(50);
screen.set_size(1484, 1080);
- screen.set_visarea(0, 1484-1, 0, 1080-1);
+ screen.set_visarea_full();
TIMER(config, "display_decay").configure_periodic(FUNC(hh_sm510_state::display_decay_tick), attotime::from_msec(1));
@@ -6090,6 +7784,16 @@ void tshadow_state::tshadow(machine_config &config)
m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25);
}
+// roms
+
+ROM_START( tshadow )
+ ROM_REGION( 0x1000, "maincpu", 0 )
+ ROM_LOAD( "mj5", 0x0000, 0x1000, CRC(09822d73) SHA1(30cae8b783a4f388193aee248fa18c6c1042e0ec) )
+
+ ROM_REGION( 946450, "svg", 0)
+ ROM_LOAD( "tshadow.svg", 0, 946450, CRC(5cab680a) SHA1(8f8f660c08fc56287362b11c183655047fbd91ca) )
+ROM_END
+
@@ -6105,11 +7809,10 @@ void tshadow_state::tshadow(machine_config &config)
class tskelwarr_state : public hh_sm510_state
{
public:
- tskelwarr_state(const machine_config &mconfig, device_type type, const char *tag)
- : hh_sm510_state(mconfig, type, tag)
+ tskelwarr_state(const machine_config &mconfig, device_type type, const char *tag) :
+ hh_sm510_state(mconfig, type, tag)
{
- m_inp_lines = 6;
- m_inp_fixed = 6;
+ inp_fixed_last();
}
void tskelwarr(machine_config &);
@@ -6175,7 +7878,7 @@ void tskelwarr_state::tskelwarr(machine_config &config)
screen.set_svg_region("svg");
screen.set_refresh_hz(50);
screen.set_size(1444, 1080);
- screen.set_visarea(0, 1444-1, 0, 1080-1);
+ screen.set_visarea_full();
TIMER(config, "display_decay").configure_periodic(FUNC(hh_sm510_state::display_decay_tick), attotime::from_msec(1));
@@ -6185,6 +7888,16 @@ void tskelwarr_state::tskelwarr(machine_config &config)
m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25);
}
+// roms
+
+ROM_START( tskelwarr )
+ ROM_REGION( 0x1000, "maincpu", 0 )
+ ROM_LOAD( "mk0", 0x0000, 0x1000, CRC(dc7827a1) SHA1(74ff143605684df0c70db604a5f22dbf512044d7) )
+
+ ROM_REGION( 1125002, "svg", 0)
+ ROM_LOAD( "tskelwarr.svg", 0, 1125002, CRC(49c6ca24) SHA1(71f4ed98ab558deeb86820b7fbf7534a7b7d6b01) )
+ROM_END
+
@@ -6200,11 +7913,10 @@ void tskelwarr_state::tskelwarr(machine_config &config)
class tbatfor_state : public hh_sm510_state
{
public:
- tbatfor_state(const machine_config &mconfig, device_type type, const char *tag)
- : hh_sm510_state(mconfig, type, tag)
+ tbatfor_state(const machine_config &mconfig, device_type type, const char *tag) :
+ hh_sm510_state(mconfig, type, tag)
{
- m_inp_lines = 6;
- m_inp_fixed = 6;
+ inp_fixed_last();
}
void tbatfor(machine_config &config);
@@ -6271,7 +7983,7 @@ void tbatfor_state::tbatfor(machine_config &config)
screen.set_svg_region("svg");
screen.set_refresh_hz(50);
screen.set_size(1493, 1080);
- screen.set_visarea(0, 1493-1, 0, 1080-1);
+ screen.set_visarea_full();
TIMER(config, "display_decay").configure_periodic(FUNC(hh_sm510_state::display_decay_tick), attotime::from_msec(1));
@@ -6281,6 +7993,16 @@ void tbatfor_state::tbatfor(machine_config &config)
m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25);
}
+// roms
+
+ROM_START( tbatfor )
+ ROM_REGION( 0x1000, "maincpu", 0 )
+ ROM_LOAD( "mk3", 0x0000, 0x1000, CRC(9993c382) SHA1(0c89e21024315ce7c086af5390c60f5766028c4f) )
+
+ ROM_REGION( 902364, "svg", 0)
+ ROM_LOAD( "tbatfor.svg", 0, 902364, CRC(56889c05) SHA1(dda393ca99196de38ad2e989ec6c292adc36ec5e) )
+ROM_END
+
@@ -6296,11 +8018,10 @@ void tbatfor_state::tbatfor(machine_config &config)
class tjdredd_state : public hh_sm510_state
{
public:
- tjdredd_state(const machine_config &mconfig, device_type type, const char *tag)
- : hh_sm510_state(mconfig, type, tag)
+ tjdredd_state(const machine_config &mconfig, device_type type, const char *tag) :
+ hh_sm510_state(mconfig, type, tag)
{
- m_inp_lines = 6;
- m_inp_fixed = 6;
+ inp_fixed_last();
}
void tjdredd(machine_config &config);
@@ -6367,7 +8088,7 @@ void tjdredd_state::tjdredd(machine_config &config)
screen.set_svg_region("svg");
screen.set_refresh_hz(50);
screen.set_size(1444, 1080);
- screen.set_visarea(0, 1444-1, 0, 1080-1);
+ screen.set_visarea_full();
TIMER(config, "display_decay").configure_periodic(FUNC(hh_sm510_state::display_decay_tick), attotime::from_msec(1));
@@ -6377,6 +8098,16 @@ void tjdredd_state::tjdredd(machine_config &config)
m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25);
}
+// roms
+
+ROM_START( tjdredd )
+ ROM_REGION( 0x1000, "maincpu", 0 )
+ ROM_LOAD( "mk5", 0x0000, 0x1000, CRC(7beee5a7) SHA1(9a190197c5751b43a9ab2dc8c536934dc5fc5e83) )
+
+ ROM_REGION( 1051586, "svg", 0)
+ ROM_LOAD( "tjdredd.svg", 0, 1051586, CRC(4fcdca0a) SHA1(d4b019fec94890ba6600baf2b2096dbcf3295180) )
+ROM_END
+
@@ -6392,11 +8123,10 @@ void tjdredd_state::tjdredd(machine_config &config)
class tapollo13_state : public hh_sm510_state
{
public:
- tapollo13_state(const machine_config &mconfig, device_type type, const char *tag)
- : hh_sm510_state(mconfig, type, tag)
+ tapollo13_state(const machine_config &mconfig, device_type type, const char *tag) :
+ hh_sm510_state(mconfig, type, tag)
{
- m_inp_lines = 6;
- m_inp_fixed = 6;
+ inp_fixed_last();
}
void tapollo13(machine_config &config);
@@ -6463,7 +8193,7 @@ void tapollo13_state::tapollo13(machine_config &config)
screen.set_svg_region("svg");
screen.set_refresh_hz(50);
screen.set_size(1467, 1080);
- screen.set_visarea(0, 1467-1, 0, 1080-1);
+ screen.set_visarea_full();
TIMER(config, "display_decay").configure_periodic(FUNC(hh_sm510_state::display_decay_tick), attotime::from_msec(1));
@@ -6473,6 +8203,16 @@ void tapollo13_state::tapollo13(machine_config &config)
m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25);
}
+// roms
+
+ROM_START( tapollo13 )
+ ROM_REGION( 0x1000, "maincpu", 0 )
+ ROM_LOAD( "10_07", 0x0000, 0x1000, CRC(63d0deaa) SHA1(d5de99d5e0ee08ec2ebeef7189ebac1c008d2e7d) )
+
+ ROM_REGION( 643176, "svg", 0)
+ ROM_LOAD( "tapollo13.svg", 0, 643176, CRC(e2dac162) SHA1(4089fa485579d2b87ac49b1cf33d6c2c085ea4c5) )
+ROM_END
+
@@ -6488,11 +8228,10 @@ void tapollo13_state::tapollo13(machine_config &config)
class tgoldeye_state : public hh_sm510_state
{
public:
- tgoldeye_state(const machine_config &mconfig, device_type type, const char *tag)
- : hh_sm510_state(mconfig, type, tag)
+ tgoldeye_state(const machine_config &mconfig, device_type type, const char *tag) :
+ hh_sm510_state(mconfig, type, tag)
{
- m_inp_lines = 6;
- m_inp_fixed = 6;
+ inp_fixed_last();
}
void tgoldeye(machine_config &config);
@@ -6559,7 +8298,7 @@ void tgoldeye_state::tgoldeye(machine_config &config)
screen.set_svg_region("svg");
screen.set_refresh_hz(50);
screen.set_size(1461, 1080);
- screen.set_visarea(0, 1461-1, 0, 1080-1);
+ screen.set_visarea_full();
TIMER(config, "display_decay").configure_periodic(FUNC(hh_sm510_state::display_decay_tick), attotime::from_msec(1));
@@ -6569,38 +8308,46 @@ void tgoldeye_state::tgoldeye(machine_config &config)
m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25);
}
+// roms
+
+ROM_START( tgoldeye )
+ ROM_REGION( 0x1000, "maincpu", 0 )
+ ROM_LOAD( "10_06", 0x0000, 0x1000, CRC(fe053efb) SHA1(3c90c0fa43e6e5e1f76b306e402f902d19175c96) )
+
+ ROM_REGION( 938916, "svg", 0)
+ ROM_LOAD( "tgoldeye.svg", 0, 938916, CRC(6dddf962) SHA1(1ced43b4225b86eca415f9af7db5fb5e80040186) )
+ROM_END
+
/***************************************************************************
- Tiger Independence Day (model 78-???)
- * Sharp SM510 under epoxy (die label 10 16)
+ Tiger Space Jam (model 78-621)
+ * Sharp SM510 under epoxy (die label KMS10, 23)
* lcd screen with custom segments, 1-bit sound
***************************************************************************/
-class tinday_state : public hh_sm510_state
+class tsjam_state : public hh_sm510_state
{
public:
- tinday_state(const machine_config &mconfig, device_type type, const char *tag)
- : hh_sm510_state(mconfig, type, tag)
+ tsjam_state(const machine_config &mconfig, device_type type, const char *tag) :
+ hh_sm510_state(mconfig, type, tag)
{
- m_inp_lines = 5;
- m_inp_fixed = 5;
+ inp_fixed_last();
}
- void tinday(machine_config &config);
+ void tsjam(machine_config &config);
};
// config
-static INPUT_PORTS_START( tinday )
+static INPUT_PORTS_START( tsjam )
PORT_START("IN.0") // S1
- PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_sm510_state, input_changed, nullptr) PORT_NAME("Shield")
- PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_sm510_state, input_changed, nullptr) PORT_NAME("Fire")
- PORT_BIT( 0x0a, IP_ACTIVE_HIGH, IPT_UNUSED )
+ PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_sm510_state, input_changed, nullptr)
+ PORT_BIT( 0x0b, IP_ACTIVE_HIGH, IPT_UNUSED )
PORT_START("IN.1") // S2
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_sm510_state, input_changed, nullptr)
@@ -6608,12 +8355,13 @@ static INPUT_PORTS_START( tinday )
PORT_BIT( 0x09, IP_ACTIVE_HIGH, IPT_UNUSED )
PORT_START("IN.2") // S3
- PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_sm510_state, input_changed, nullptr) PORT_NAME("Alert")
+ PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_sm510_state, input_changed, nullptr)
PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED )
PORT_START("IN.3") // S4
- PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_sm510_state, input_changed, nullptr) PORT_NAME("Velocity")
- PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED )
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_sm510_state, input_changed, nullptr) PORT_NAME("Shoot/Block")
+ PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_sm510_state, input_changed, nullptr) PORT_NAME("Tune/Steal")
+ PORT_BIT( 0x0c, IP_ACTIVE_HIGH, IPT_UNUSED )
PORT_START("IN.4") // S5
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_sm510_state, input_changed, nullptr) PORT_NAME("Pause")
@@ -6633,10 +8381,10 @@ static INPUT_PORTS_START( tinday )
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_sm510_state, acl_button, nullptr) PORT_NAME("ACL")
INPUT_PORTS_END
-void tinday_state::tinday(machine_config &config)
+void tsjam_state::tsjam(machine_config &config)
{
/* basic machine hardware */
- SM510(config, m_maincpu);
+ SM510(config, m_maincpu); // no external XTAL
m_maincpu->set_r_mask_option(sm510_base_device::RMASK_DIRECT);
m_maincpu->write_segs().set(FUNC(hh_sm510_state::sm510_lcd_segment_w));
m_maincpu->read_k().set(FUNC(hh_sm510_state::input_r));
@@ -6649,8 +8397,8 @@ void tinday_state::tinday(machine_config &config)
screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_SVG));
screen.set_svg_region("svg");
screen.set_refresh_hz(50);
- screen.set_size(1463, 1080);
- screen.set_visarea(0, 1463-1, 0, 1080-1);
+ screen.set_size(1421, 1080);
+ screen.set_visarea_full();
TIMER(config, "display_decay").configure_periodic(FUNC(hh_sm510_state::display_decay_tick), attotime::from_msec(1));
@@ -6660,37 +8408,47 @@ void tinday_state::tinday(machine_config &config)
m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25);
}
+// roms
+
+ROM_START( tsjam )
+ ROM_REGION( 0x1000, "maincpu", 0 )
+ ROM_LOAD( "10_23", 0x0000, 0x1000, CRC(6eaabfbd) SHA1(f0ecbd6f65fe72ce2d8a452685be2e77a63fc9f0) )
+
+ ROM_REGION( 1046147, "svg", 0)
+ ROM_LOAD( "tsjam.svg", 0, 1046147, CRC(6d24e1c9) SHA1(ddbfbd85f70ec964c68f982a8ee8070e3786a85e) )
+ROM_END
+
/***************************************************************************
- Tiger Space Jam (model 78-621)
- * Sharp SM510 under epoxy (die label KMS10, 23)
+ Tiger Independence Day (model 78-624)
+ * Sharp SM510 under epoxy (die label 10 16)
* lcd screen with custom segments, 1-bit sound
***************************************************************************/
-class tsjam_state : public hh_sm510_state
+class tinday_state : public hh_sm510_state
{
public:
- tsjam_state(const machine_config &mconfig, device_type type, const char *tag)
- : hh_sm510_state(mconfig, type, tag)
+ tinday_state(const machine_config &mconfig, device_type type, const char *tag) :
+ hh_sm510_state(mconfig, type, tag)
{
- m_inp_lines = 5;
- m_inp_fixed = 5;
+ inp_fixed_last();
}
- void tsjam(machine_config &config);
+ void tinday(machine_config &config);
};
// config
-static INPUT_PORTS_START( tsjam )
+static INPUT_PORTS_START( tinday )
PORT_START("IN.0") // S1
- PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_sm510_state, input_changed, nullptr)
- PORT_BIT( 0x0b, IP_ACTIVE_HIGH, IPT_UNUSED )
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_sm510_state, input_changed, nullptr) PORT_NAME("Shield")
+ PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_sm510_state, input_changed, nullptr) PORT_NAME("Fire")
+ PORT_BIT( 0x0a, IP_ACTIVE_HIGH, IPT_UNUSED )
PORT_START("IN.1") // S2
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_sm510_state, input_changed, nullptr)
@@ -6698,13 +8456,12 @@ static INPUT_PORTS_START( tsjam )
PORT_BIT( 0x09, IP_ACTIVE_HIGH, IPT_UNUSED )
PORT_START("IN.2") // S3
- PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_sm510_state, input_changed, nullptr)
+ PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_sm510_state, input_changed, nullptr) PORT_NAME("Alert")
PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED )
PORT_START("IN.3") // S4
- PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_sm510_state, input_changed, nullptr) PORT_NAME("Shoot/Block")
- PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_sm510_state, input_changed, nullptr) PORT_NAME("Tune/Steal")
- PORT_BIT( 0x0c, IP_ACTIVE_HIGH, IPT_UNUSED )
+ PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_sm510_state, input_changed, nullptr) PORT_NAME("Velocity")
+ PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED )
PORT_START("IN.4") // S5
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_sm510_state, input_changed, nullptr) PORT_NAME("Pause")
@@ -6724,10 +8481,10 @@ static INPUT_PORTS_START( tsjam )
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_sm510_state, acl_button, nullptr) PORT_NAME("ACL")
INPUT_PORTS_END
-void tsjam_state::tsjam(machine_config &config)
+void tinday_state::tinday(machine_config &config)
{
/* basic machine hardware */
- SM510(config, m_maincpu); // no external XTAL
+ SM510(config, m_maincpu);
m_maincpu->set_r_mask_option(sm510_base_device::RMASK_DIRECT);
m_maincpu->write_segs().set(FUNC(hh_sm510_state::sm510_lcd_segment_w));
m_maincpu->read_k().set(FUNC(hh_sm510_state::input_r));
@@ -6740,8 +8497,8 @@ void tsjam_state::tsjam(machine_config &config)
screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_SVG));
screen.set_svg_region("svg");
screen.set_refresh_hz(50);
- screen.set_size(1421, 1080);
- screen.set_visarea(0, 1421-1, 0, 1080-1);
+ screen.set_size(1463, 1080);
+ screen.set_visarea_full();
TIMER(config, "display_decay").configure_periodic(FUNC(hh_sm510_state::display_decay_tick), attotime::from_msec(1));
@@ -6751,6 +8508,16 @@ void tsjam_state::tsjam(machine_config &config)
m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25);
}
+// roms
+
+ROM_START( tinday )
+ ROM_REGION( 0x1000, "maincpu", 0 )
+ ROM_LOAD( "10_16", 0x0000, 0x1000, CRC(77c2c2f7) SHA1(06326b26d0f6757180724ba0bdeb4110cc7e29d6) )
+
+ ROM_REGION( 1162672, "svg", 0)
+ ROM_LOAD( "tinday.svg", 0, 1162672, CRC(9b9a8047) SHA1(2aeaa71a54cf897d2a5d91133c733613ca229aae) )
+ROM_END
+
@@ -6766,11 +8533,10 @@ void tsjam_state::tsjam(machine_config &config)
class tbatmana_state : public hh_sm510_state
{
public:
- tbatmana_state(const machine_config &mconfig, device_type type, const char *tag)
- : hh_sm510_state(mconfig, type, tag)
+ tbatmana_state(const machine_config &mconfig, device_type type, const char *tag) :
+ hh_sm510_state(mconfig, type, tag)
{
- m_inp_lines = 6;
- m_inp_fixed = 6;
+ inp_fixed_last();
}
void tbatmana(machine_config &config);
@@ -6831,7 +8597,8 @@ void tbatmana_state::tbatmana(machine_config &config)
screen.set_svg_region("svg");
screen.set_refresh_hz(50);
screen.set_size(1478, 1080);
- screen.set_visarea(0, 1478-1, 0, 1080-1);
+ screen.set_visarea_full();
+
TIMER(config, "display_decay").configure_periodic(FUNC(hh_sm510_state::display_decay_tick), attotime::from_msec(1));
/* sound hardware */
@@ -6841,6 +8608,19 @@ void tbatmana_state::tbatmana(machine_config &config)
m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25);
}
+// roms
+
+ROM_START( tbatmana )
+ ROM_REGION( 0x1000, "maincpu", 0 )
+ ROM_LOAD( "n81.program", 0x0000, 0x1000, CRC(efb3f122) SHA1(d55c2fb92fb9bd41d6001f42143691b84f3f389a) )
+
+ ROM_REGION( 0x100, "maincpu:melody", 0 )
+ ROM_LOAD( "n81.melody", 0x000, 0x100, CRC(56ba8fe5) SHA1(5c286ae1bfc943bbe8c8f4cdc9c8b73d9b3c186e) )
+
+ ROM_REGION( 618831, "svg", 0)
+ ROM_LOAD( "tbatmana.svg", 0, 618831, CRC(fc38cb9d) SHA1(1b6c10dcd33bfcfef43d61f97fa8e530011c1e61) )
+ROM_END
+
@@ -6856,11 +8636,9 @@ void tbatmana_state::tbatmana(machine_config &config)
class tigarden_state : public hh_sm510_state
{
public:
- tigarden_state(const machine_config &mconfig, device_type type, const char *tag)
- : hh_sm510_state(mconfig, type, tag)
- {
- m_inp_lines = 8;
- }
+ tigarden_state(const machine_config &mconfig, device_type type, const char *tag) :
+ hh_sm510_state(mconfig, type, tag)
+ { }
void tigarden(machine_config &config);
};
@@ -6934,7 +8712,7 @@ void tigarden_state::tigarden(machine_config &config)
screen.set_svg_region("svg");
screen.set_refresh_hz(50);
screen.set_size(1515, 1080);
- screen.set_visarea(0, 1515-1, 0, 1080-1);
+ screen.set_visarea_full();
TIMER(config, "display_decay").configure_periodic(FUNC(hh_sm510_state::display_decay_tick), attotime::from_msec(1));
@@ -6944,6 +8722,16 @@ void tigarden_state::tigarden(machine_config &config)
m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25);
}
+// roms
+
+ROM_START( tigarden )
+ ROM_REGION( 0x1000, "maincpu", 0 )
+ ROM_LOAD( "0019_238e", 0x0000, 0x1000, CRC(8bd0eadd) SHA1(7bb5eb30d569901dce52d777bc01c0979e4afa06) )
+
+ ROM_REGION( 409084, "svg", 0)
+ ROM_LOAD( "tigarden.svg", 0, 409084, CRC(cfda5138) SHA1(1bc4ed65ae0cdca3e1e9458d68ca4d6e0fc0e901) )
+ROM_END
+
@@ -6959,11 +8747,9 @@ void tigarden_state::tigarden(machine_config &config)
class nummunch_state : public hh_sm510_state
{
public:
- nummunch_state(const machine_config &mconfig, device_type type, const char *tag)
- : hh_sm510_state(mconfig, type, tag)
- {
- m_inp_lines = 8;
- }
+ nummunch_state(const machine_config &mconfig, device_type type, const char *tag) :
+ hh_sm510_state(mconfig, type, tag)
+ { }
void nummunch(machine_config &config);
};
@@ -7034,7 +8820,7 @@ void nummunch_state::nummunch(machine_config &config)
screen.set_svg_region("svg");
screen.set_refresh_hz(50);
screen.set_size(1920, 875);
- screen.set_visarea(0, 1920-1, 0, 875-1);
+ screen.set_visarea_full();
TIMER(config, "display_decay").configure_periodic(FUNC(hh_sm510_state::display_decay_tick), attotime::from_msec(1));
@@ -7044,791 +8830,7 @@ void nummunch_state::nummunch(machine_config &config)
m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25);
}
-
-
-
-
-/***************************************************************************
-
- Game driver(s)
-
-***************************************************************************/
-
-ROM_START( kdribble )
- ROM_REGION( 0x1000, "maincpu", 0 )
- ROM_LOAD( "584", 0x0000, 0x1000, CRC(1d9022c8) SHA1(64567f9f161e830a0634d5c89917ab866c26c0f8) )
-
- ROM_REGION( 450339, "svg", 0)
- ROM_LOAD( "kdribble.svg", 0, 450339, CRC(86c3ecc4) SHA1(8dfaeb0f3b35d4b680daaa9f478a6f3decf6ea0a) )
-ROM_END
-
-
-ROM_START( ktopgun ) // except for filler/unused bytes, ROM listing in patent US5137277 "BH003 Top Gun" is same
- ROM_REGION( 0x1000, "maincpu", 0 )
- ROM_LOAD( "598", 0x0000, 0x1000, CRC(50870b35) SHA1(cda1260c2e1c180995eced04b7d7ff51616dcef5) )
-
- ROM_REGION( 425832, "svg", 0)
- ROM_LOAD( "ktopgun.svg", 0, 425832, CRC(dc488ac0) SHA1(5a47e5639cb1e61dad3f2169efb99efe3d75896f) )
-ROM_END
-
-
-ROM_START( kcontra ) // except for filler/unused bytes, ROM listing in patent US5120057 "BH002 C (Contra)" program/melody is same
- ROM_REGION( 0x1000, "maincpu", 0 )
- ROM_LOAD( "773.program", 0x0000, 0x1000, CRC(bf834877) SHA1(055dd56ec16d63afba61ab866481fd9c029fb54d) )
-
- ROM_REGION( 0x100, "maincpu:melody", 0 )
- ROM_LOAD( "773.melody", 0x000, 0x100, CRC(23d02b99) SHA1(703938e496db0eeacd14fe7605d4b5c39e0a5bc8) )
-
- ROM_REGION( 721005, "svg", 0)
- ROM_LOAD( "kcontra.svg", 0, 721005, CRC(b5370d0f) SHA1(2f401222d24fa32a4659ef2b64ddac8ac3973c69) )
-ROM_END
-
-
-ROM_START( ktmnt ) // except for filler/unused bytes, ROM listing in patent US5150899 "BH005 TMNT" program/melody is same
- ROM_REGION( 0x1000, "maincpu", 0 )
- ROM_LOAD( "774.program", 0x0000, 0x1000, CRC(a1064f87) SHA1(92156c35fbbb414007ee6804fe635128a741d5f1) )
-
- ROM_REGION( 0x100, "maincpu:melody", 0 )
- ROM_LOAD( "774.melody", 0x000, 0x100, CRC(8270d626) SHA1(bd91ca1d5cd7e2a62eef05c0033b19dcdbe441ca) )
-
- ROM_REGION( 610270, "svg", 0)
- ROM_LOAD( "ktmnt.svg", 0, 610270, CRC(ad9412ed) SHA1(154ee44efcd340dafa1cb84c37a9c3cd42cb42ab) )
-ROM_END
-
-
-ROM_START( kgradius )
- ROM_REGION( 0x1000, "maincpu", 0 )
- ROM_LOAD( "771.program", 0x0000, 0x1000, CRC(830c2afc) SHA1(bb9ebd4e52831cc02cd92dd4b37675f34cf37b8c) )
-
- ROM_REGION( 0x100, "maincpu:melody", 0 )
- ROM_LOAD( "771.melody", 0x000, 0x100, CRC(4c586b73) SHA1(14c5ab2898013a577f678970a648c374749cc66d) )
-
- ROM_REGION( 638097, "svg", 0)
- ROM_LOAD( "kgradius.svg", 0, 638097, CRC(3adbc0f1) SHA1(fe426bf2335ce30395ea14ecab6399a93c67816a) )
-ROM_END
-
-
-ROM_START( kloneran )
- ROM_REGION( 0x1000, "maincpu", 0 )
- ROM_LOAD( "781.program", 0x0000, 0x1000, CRC(52b9735f) SHA1(06c5ef6e7e781b1176d4c1f2445f765ccf18b3f7) )
-
- ROM_REGION( 0x100, "maincpu:melody", 0 )
- ROM_LOAD( "781.melody", 0x000, 0x100, CRC(a393de36) SHA1(55089f04833ccb318524ab2b584c4817505f4019) )
-
- ROM_REGION( 633120, "svg", 0)
- ROM_LOAD( "kloneran.svg", 0, 633120, CRC(f55e5292) SHA1(d0a91b5cd8a1894e7abc9c505fff4a8e1d3bec7a) )
-ROM_END
-
-
-ROM_START( kblades )
- ROM_REGION( 0x1000, "maincpu", 0 )
- ROM_LOAD( "782.program", 0x0000, 0x1000, CRC(3351a35d) SHA1(84c64b65d3cabfa20c18f4649c9ede2578b82523) )
-
- ROM_REGION( 0x100, "maincpu:melody", 0 )
- ROM_LOAD( "782.melody", 0x000, 0x100, CRC(e8bf48ba) SHA1(3852c014dc9136566322b4f9e2aab0e3ec3a7387) )
-
- ROM_REGION( 455113, "svg", 0)
- ROM_LOAD( "kblades.svg", 0, 455113, CRC(e22f44c8) SHA1(ac95a837e20f87f3afc6c234f7407cbfcc438011) )
-ROM_END
-
-
-ROM_START( knfl )
- ROM_REGION( 0x1000, "maincpu", 0 )
- ROM_LOAD( "786.program", 0x0000, 0x1000, CRC(0535c565) SHA1(44cdcd284713ff0b194b24beff9f1b94c8bc63b2) )
-
- ROM_REGION( 0x100, "maincpu:melody", 0 )
- ROM_LOAD( "786.melody", 0x000, 0x100, CRC(6c80263b) SHA1(d3c21e2f8491fef101907b8e0871b1e1c1ed58f5) )
-
- ROM_REGION( 571134, "svg", 0)
- ROM_LOAD( "knfl.svg", 0, 571134, CRC(f2c63235) SHA1(70b9232700f5498d3c63c63dd5904c0e19482cc2) )
-ROM_END
-
-
-ROM_START( kbilly )
- ROM_REGION( 0x1000, "maincpu", 0 )
- ROM_LOAD( "788.program", 0x0000, 0x1000, CRC(b8b1f734) SHA1(619dd527187b43276d081cdb1b13e0a9a81f2c6a) )
-
- ROM_REGION( 0x100, "maincpu:melody", 0 )
- ROM_LOAD( "788.melody", 0x000, 0x100, CRC(cd488bea) SHA1(8fc60081f46e392978d6950c74711fb7ebd154de) )
-
- ROM_REGION( 598276, "svg", 0)
- ROM_LOAD( "kbilly.svg", 0, 598276, CRC(2969319e) SHA1(5cd1b0a6eee3168142c1d24f167b9ef38ad88402) )
-ROM_END
-
-
-ROM_START( kbucky )
- ROM_REGION( 0x1000, "maincpu", 0 )
- ROM_LOAD( "n58.program", 0x0000, 0x1000, CRC(7c36a0c4) SHA1(1b55ac64a71af746fd0a0f44266fcc92cca77482) )
-
- ROM_REGION( 0x100, "maincpu:melody", 0 )
- ROM_LOAD( "n58.melody", 0x000, 0x100, CRC(7e99e469) SHA1(3e9a3843c6ab392f5989f3366df87a2d26cb8620) )
-
- ROM_REGION( 727841, "svg", 0)
- ROM_LOAD( "kbucky.svg", 0, 727841, CRC(c1d78488) SHA1(9ba4fdbce977455b8f1ad4bd2b01faa44bd05bc7) )
-ROM_END
-
-
-ROM_START( kgarfld )
- ROM_REGION( 0x1000, "maincpu", 0 )
- ROM_LOAD( "n62.program", 0x0000, 0x1000, CRC(5a762049) SHA1(26d4d891160d254dfd752734e1047126243f88dd) )
-
- ROM_REGION( 0x100, "maincpu:melody", 0 )
- ROM_LOAD( "n62.melody", 0x000, 0x100, CRC(232b7d55) SHA1(76f6a19e8182ee3f00c9f4ef007b5dde75a9c00d) )
-
- ROM_REGION( 581107, "svg", 0)
- ROM_LOAD( "kgarfld.svg", 0, 581107, CRC(bf09a170) SHA1(075cb95535873018409eb15675183490c61b29b9) )
-ROM_END
-
-
-ROM_START( gnw_mmouse )
- ROM_REGION( 0x1000, "maincpu", 0 )
- ROM_LOAD( "mc-25", 0x0000, 0x0740, BAD_DUMP CRC(cb820c32) SHA1(7e94fc255f32db725d5aa9e196088e490c1a1443) ) // dumped from Soviet clone
-
- ROM_REGION( 102453, "svg", 0)
- ROM_LOAD( "gnw_mmouse.svg", 0, 102453, BAD_DUMP CRC(88cc7c49) SHA1(c000d51d1b99750116b97f9bafc0314ea506366d) )
-ROM_END
-
-ROM_START( gnw_egg )
- ROM_REGION( 0x1000, "maincpu", 0 )
- ROM_LOAD( "eg-26", 0x0000, 0x0740, BAD_DUMP CRC(cb820c32) SHA1(7e94fc255f32db725d5aa9e196088e490c1a1443) ) // dumped from Soviet clone
-
- ROM_REGION( 102848, "svg", 0)
- ROM_LOAD( "gnw_egg.svg", 0, 102848, BAD_DUMP CRC(742c2605) SHA1(984d430ad2ff47ad7a3f9b25b7d3f3d51b10cca5) )
-ROM_END
-
-ROM_START( nupogodi )
- ROM_REGION( 0x1000, "maincpu", 0 )
- ROM_LOAD( "nupogodi.bin", 0x0000, 0x0740, CRC(cb820c32) SHA1(7e94fc255f32db725d5aa9e196088e490c1a1443) )
-
- ROM_REGION( 156974, "svg", 0)
- ROM_LOAD( "nupogodi.svg", 0, 156974, CRC(8d522ec6) SHA1(67afeca5eebd16449353ea43070a6b919f7ba408) )
-ROM_END
-
-ROM_START( exospace )
- ROM_REGION( 0x1000, "maincpu", 0 )
- ROM_LOAD( "exospace.bin", 0x0000, 0x0740, CRC(553e2b09) SHA1(2b74f8437b881fbb62b61f25435a5bfc66872a9a) )
-
- ROM_REGION( 66790, "svg", 0)
- ROM_LOAD( "exospace.svg", 0, 66790, BAD_DUMP CRC(df31043a) SHA1(2d8caf42894df699e469652e5f448beaebbcc1ae) )
-ROM_END
-
-ROM_START( gnw_opanic )
- ROM_REGION( 0x1000, "maincpu", 0 )
- ROM_LOAD( "op-51", 0x0000, 0x1000, CRC(31c288c9) SHA1(4bfd0fba94a9927cefc925db8196b063c5dd9b19) )
-
- ROM_REGION( 79616, "svg_top", 0)
- ROM_LOAD( "gnw_opanic_top.svg", 0, 79616, CRC(208dccc5) SHA1(b3cd3dcc8a00ba3b1b8d93d902f756fe579e4dfc) )
-
- ROM_REGION( 112809, "svg_bottom", 0)
- ROM_LOAD( "gnw_opanic_bottom.svg", 0, 112809, CRC(919b9649) SHA1(f3d3c8ca3fed81782a1fcb5a7aff07faea86db07) )
-ROM_END
-
-ROM_START( gnw_dkong )
- ROM_REGION( 0x1000, "maincpu", 0 )
- ROM_LOAD( "dk-52", 0x0000, 0x1000, CRC(5180cbf8) SHA1(5174570a8d6a601226f51e972bac6735535fe11d) )
-
- ROM_REGION( 176706, "svg_top", 0)
- ROM_LOAD( "gnw_dkong_top.svg", 0, 176706, CRC(db041556) SHA1(fb0f979dea3ecd25288d341fa80e35b5fd0a8349) )
-
- ROM_REGION( 145397, "svg_bottom", 0)
- ROM_LOAD( "gnw_dkong_bottom.svg", 0, 145397, CRC(2c8c9d08) SHA1(658fd0bbccaabb0645b02e5cb81709c4b2a4250e) )
-ROM_END
-
-ROM_START( gnw_mickdon )
- ROM_REGION( 0x1000, "maincpu", 0 )
- ROM_LOAD( "dm-53_565", 0x0000, 0x1000, CRC(e21fc0f5) SHA1(3b65ccf9f98813319410414e11a3231b787cdee6) )
-
- ROM_REGION( 126434, "svg_top", 0)
- ROM_LOAD( "gnw_mickdon_top.svg", 0, 126434, CRC(ff05f489) SHA1(2a533c7b5d7249d79f8d7795a0d57fd3e32d3d32) )
-
- ROM_REGION( 122870, "svg_bottom", 0)
- ROM_LOAD( "gnw_mickdon_bottom.svg", 0, 122870, CRC(8f06ddf1) SHA1(69d4b785781600abcdfc01b3902df1d0ae3608cf) )
-ROM_END
-
-ROM_START( gnw_ghouse )
- ROM_REGION( 0x1000, "maincpu", 0 )
- ROM_LOAD( "gh-54", 0x0000, 0x1000, CRC(4df12b4d) SHA1(708be5fef8dbd9337f5ab35baaca5bdf21e1f36c) )
-
- ROM_REGION( 159098, "svg_top", 0)
- ROM_LOAD( "gnw_ghouse_top.svg", 0, 159098, CRC(96bc58d9) SHA1(eda6a0abde739fb71af3e150751a519e59ef021d) )
-
- ROM_REGION( 149757, "svg_bottom", 0)
- ROM_LOAD( "gnw_ghouse_bottom.svg", 0, 149757, CRC(d66ee72c) SHA1(dcbe1c81ee0c7ddb9692858749ce6934f4dd7f30) )
-ROM_END
-
-ROM_START( gnw_dkong2 )
- ROM_REGION( 0x1000, "maincpu", 0 )
- ROM_LOAD( "jr-55_560", 0x0000, 0x1000, CRC(46aed0ae) SHA1(72f75ccbd84aea094148c872fc7cc1683619a18a) )
-
- ROM_REGION( 267443, "svg_top", 0)
- ROM_LOAD( "gnw_dkong2_top.svg", 0, 267443, CRC(33b26edb) SHA1(600afdf22ff4ac4a4af2de9159287cc6e53dfe3a) )
-
- ROM_REGION( 390558, "svg_bottom", 0)
- ROM_LOAD( "gnw_dkong2_bottom.svg", 0, 390558, CRC(92d68958) SHA1(aba829bf89b93bf3a4e425c9a8f6eec9e5869bc4) )
-ROM_END
-
-
-ROM_START( gnw_mario )
- ROM_REGION( 0x1000, "maincpu", 0 )
- ROM_LOAD( "mw-56", 0x0000, 0x1000, CRC(385e59da) SHA1(2f79281bdf2f2afca2fb5bd7b9a3beeffc9c4eb7) )
-
- ROM_REGION( 154874, "svg_left", 0)
- ROM_LOAD( "gnw_mario_left.svg", 0, 154874, CRC(73ba4f4a) SHA1(d5df39808a1af8e8ad5e397b4a50313221ab6e3b) )
-
- ROM_REGION( 202863, "svg_right", 0)
- ROM_LOAD( "gnw_mario_right.svg", 0, 202863, CRC(dd2473c9) SHA1(51aca37abf8e4959b84c441aa2d114e16c7d6010) )
-ROM_END
-
-
-ROM_START( gnw_bjack )
- ROM_REGION( 0x1000, "maincpu", 0 )
- ROM_LOAD( "bj-60.program", 0x0000, 0x1000, CRC(8e74f633) SHA1(54b0f65ee716d2820a9ed9c743755d2a2d99ce4d) )
-
- ROM_REGION( 0x100, "maincpu:melody", 0 )
- ROM_LOAD( "bj-60.melody", 0x000, 0x100, BAD_DUMP CRC(2619224e) SHA1(b65dc590b6eb1de793e980af236ccf8360b3cfee) ) // dumped electronically, decap needed to verify accuracy
-
- ROM_REGION( 75217, "svg_top", 0)
- ROM_LOAD( "gnw_bjack_top.svg", 0, 75205, CRC(5eb0956e) SHA1(f7acd148e5478d4c2ddf06cff23c5e40faee2c24) )
-
- ROM_REGION( 112450, "svg_bottom", 0)
- ROM_LOAD( "gnw_bjack_bottom.svg", 0, 112438, CRC(9d985b1d) SHA1(cf8af6ce18994f687a5e6fbdda62af4d07a07cf8) )
-ROM_END
-
-
-ROM_START( gnw_squish )
- ROM_REGION( 0x1000, "maincpu", 0 )
- ROM_LOAD( "mg-61", 0x0000, 0x1000, CRC(79cd509c) SHA1(969e5425984ba9e5183c68b38b3588f53d1e8e5d) )
-
- ROM_REGION( 70300, "svg_top", 0)
- ROM_LOAD( "gnw_squish_top.svg", 0, 70300, CRC(f1358ba9) SHA1(414d29db64b83a50b20f31b857e4c3a77d19d3c8) )
-
- ROM_REGION( 279606, "svg_bottom", 0)
- ROM_LOAD( "gnw_squish_bottom.svg", 0, 279606, CRC(1d4ac23f) SHA1(d6eb78bae5ca18cc5fe5d8a300902766dd9601aa) )
-ROM_END
-
-
-ROM_START( gnw_dkjr )
- ROM_REGION( 0x1000, "maincpu", 0 )
- ROM_LOAD( "dj-101", 0x0000, 0x1000, CRC(8dcfb5d1) SHA1(e0ef578e9362eb9a3cab631376df3cf55978f2de) )
-
- ROM_REGION( 281161, "svg", 0)
- ROM_LOAD( "gnw_dkjr.svg", 0, 281161, CRC(346b025c) SHA1(dad3f3f73d6c2ff4efb43ffd76e97ba0d5f0da73) )
-ROM_END
-
-
-ROM_START( gnw_mariocm )
- ROM_REGION( 0x1000, "maincpu", 0 )
- ROM_LOAD( "ml-102_577", 0x0000, 0x1000, CRC(c1128dea) SHA1(8647e36f43a0e37756a3c7b6a3f08d4c8243f1cc) )
-
- ROM_REGION( 302931, "svg", 0)
- ROM_LOAD( "gnw_mariocm.svg", 0, 302931, CRC(5517ae80) SHA1(1902e36d0470ee5548addeb087ea3e7d2c2520a2) )
-ROM_END
-
-
-ROM_START( gnw_tfish )
- ROM_REGION( 0x1000, "maincpu", 0 )
- ROM_LOAD( "tf-104", 0x0000, 0x1000, CRC(53cde918) SHA1(bc1e1b8f8b282bb886bb076c1c7ce35d00eca6fc) )
-
- ROM_REGION( 257278, "svg", 0)
- ROM_LOAD( "gnw_tfish.svg", 0, 257278, CRC(fc970f4a) SHA1(a73f5ee35b60842707f13edc5d58869fb2ec98cf) )
-ROM_END
-
-
-ROM_START( gnw_smb )
- ROM_REGION( 0x1000, "maincpu", 0 )
- ROM_LOAD( "ym-105.program", 0x0000, 0x1000, CRC(0dff3b12) SHA1(3fa83f88e49ea9d7080fe935ec90ce69acbe8850) )
-
- ROM_REGION( 0x100, "maincpu:melody", 0 )
- ROM_LOAD( "ym-105.melody", 0x000, 0x100, CRC(b48c6d90) SHA1(a1ce1e52627767752974ab0d49bec48ead36663e) )
-
- ROM_REGION( 648209, "svg", 0)
- ROM_LOAD( "gnw_smb.svg", 0, 648209, CRC(4a6fdb28) SHA1(0a0bc48d82d5b8bf8ef96ef9ce2f87ba6ea850c1) )
-ROM_END
-
-
-ROM_START( gnw_climber )
- ROM_REGION( 0x1000, "maincpu", 0 )
- ROM_LOAD( "dr-106.program", 0x0000, 0x1000, CRC(2adcbd6d) SHA1(110dc08c65120ab2c76ee647e89aa2726e24ac1a) )
-
- ROM_REGION( 0x100, "maincpu:melody", 0 )
- ROM_LOAD( "dr-106.melody", 0x000, 0x100, BAD_DUMP CRC(c99d7998) SHA1(4f8cf35b13f8b7654e7186bfd67d197d9053e949) ) // dumped electronically, decap needed to verify accuracy
-
- ROM_REGION( 542332, "svg", 0)
- ROM_LOAD( "gnw_climber.svg", 0, 542332, CRC(d7e84c21) SHA1(a5b5b68c8cdb3a09966bfb91b281791bef311248) )
-ROM_END
-
-
-ROM_START( gnw_boxing )
- ROM_REGION( 0x1000, "maincpu", 0 )
- ROM_LOAD( "bx-301_744.program", 0x0000, 0x1000, CRC(0fdf0303) SHA1(0b791c9d4874e9534d0a9b7a8968ce02fe4bee96) )
-
- ROM_REGION( 0x100, "maincpu:melody", 0 )
- ROM_LOAD( "bx-301_744.melody", 0x000, 0x100, CRC(439d943d) SHA1(52880df15ec7513f96482f455ef3d9778aa24750) )
-
- ROM_REGION( 265174, "svg", 0)
- ROM_LOAD( "gnw_boxing.svg", 0, 265174, CRC(e8a3ab25) SHA1(53e32542b582dcdf4ddd051f182738eee6c732c9) )
-ROM_END
-
-
-ROM_START( tgaunt )
- ROM_REGION( 0x1000, "maincpu", 0 )
- ROM_LOAD( "583", 0x0000, 0x1000, CRC(598d8156) SHA1(9f776e8b9b4321e8118481e6b1304f8a38f9932e) )
-
- ROM_REGION( 713020, "svg", 0)
- ROM_LOAD( "tgaunt.svg", 0, 713020, CRC(1f65ae21) SHA1(57ca33d073d1096a7fc17f2bdac940868d1ae651) )
-ROM_END
-
-ROM_START( trobhood )
- ROM_REGION( 0x1000, "maincpu", 0 )
- ROM_LOAD( "583", 0x0000, 0x1000, CRC(598d8156) SHA1(9f776e8b9b4321e8118481e6b1304f8a38f9932e) )
-
- ROM_REGION( 704892, "svg", 0)
- ROM_LOAD( "trobhood.svg", 0, 704892, CRC(291fd8db) SHA1(1de6bd0e203f16c44f7d661e44863a1a919f3da9) )
-ROM_END
-
-
-ROM_START( tddragon )
- ROM_REGION( 0x1000, "maincpu", 0 )
- ROM_LOAD( "593", 0x0000, 0x1000, CRC(2642f778) SHA1(fee77acf93e057a8b4627389dfd481c6d9cbd02b) )
-
- ROM_REGION( 511434, "svg", 0)
- ROM_LOAD( "tddragon.svg", 0, 511434, CRC(641e7ceb) SHA1(bbfc37cc085e00921422f65d9aac9949f871e7b7) )
-ROM_END
-
-
-ROM_START( tkarnov )
- ROM_REGION( 0x1000, "maincpu", 0 )
- ROM_LOAD( "582", 0x0000, 0x1000, CRC(cee85bdd) SHA1(143e39524f1dea523e0575f327ed189343cc87f5) )
-
- ROM_REGION( 527377, "svg", 0)
- ROM_LOAD( "tkarnov.svg", 0, 527377, CRC(971840fc) SHA1(48db7139fa875e60b44340fb475b6d1081ef5c10) )
-ROM_END
-
-
-ROM_START( tvindictr )
- ROM_REGION( 0x1000, "maincpu", 0 )
- ROM_LOAD( "595", 0x0000, 0x1000, CRC(b574d16f) SHA1(d2cb0f2e21ca2defe49a4b45f4c8e169ae9979ab) )
-
- ROM_REGION( 314165, "svg", 0)
- ROM_LOAD( "tvindictr.svg", 0, 314165, CRC(2241992c) SHA1(efd44879d1c0d5befd7ea07089418406fc101315) )
-ROM_END
-
-
-ROM_START( tgaiden )
- ROM_REGION( 0x1000, "maincpu", 0 )
- ROM_LOAD( "m82", 0x0000, 0x1000, CRC(278eafb0) SHA1(14396a0010bade0fde705969151200ed432321e7) )
-
- ROM_REGION( 100000, "svg", 0)
- ROM_LOAD( "tgaiden.svg", 0, 100000, NO_DUMP )
-ROM_END
-
-
-ROM_START( tbatman )
- ROM_REGION( 0x1000, "maincpu", 0 )
- ROM_LOAD( "597", 0x0000, 0x1000, CRC(8b7acc97) SHA1(fe811675dc5c5ef9f6f969685c933926c8b9e868) )
-
- ROM_REGION( 551890, "svg", 0)
- ROM_LOAD( "tbatman.svg", 0, 551890, CRC(65809ee3) SHA1(5fc38bdb2108d45dc99bce3379253423ea88e0fc) )
-ROM_END
-
-
-ROM_START( tsharr2 )
- ROM_REGION( 0x1000, "maincpu", 0 )
- ROM_LOAD( "m91", 0x0000, 0x1000, CRC(b207ac79) SHA1(9889dfec26089313ba2bdac845a75a26742d09e1) )
-
- ROM_REGION( 555126, "svg", 0)
- ROM_LOAD( "tsharr2.svg", 0, 555126, CRC(ff43e29b) SHA1(0af02e65a1dcf95958296a292343430670b67ae5) )
-ROM_END
-
-
-ROM_START( tstrider )
- ROM_REGION( 0x1000, "maincpu", 0 )
- ROM_LOAD( "m92", 0x0000, 0x1000, CRC(4b488e8f) SHA1(b037c220c4a456f0dac67d759736f202a7609ee5) )
-
- ROM_REGION( 554817, "svg", 0)
- ROM_LOAD( "tstrider.svg", 0, 554817, CRC(be5de6bd) SHA1(cde0a3fe21af24d7d22d2ce0aec9c308f8696c7e) )
-ROM_END
-
-
-ROM_START( tgoldnaxe )
- ROM_REGION( 0x1000, "maincpu", 0 )
- ROM_LOAD( "m94", 0x0000, 0x1000, CRC(af183fbf) SHA1(23716e2a7c4bb4842b2af1a43fe88db44e18dc17) )
-
- ROM_REGION( 605483, "svg", 0)
- ROM_LOAD( "tgoldnaxe.svg", 0, 605483, CRC(533bea14) SHA1(08d419bd7af5de7216654dc7f978beed95192c2d) )
-ROM_END
-
-
-ROM_START( trobocop2 )
- ROM_REGION( 0x1000, "maincpu", 0 )
- ROM_LOAD( "m96", 0x0000, 0x1000, CRC(3704b60c) SHA1(04275833e1a79fd33226faf060890b66ae54e1d3) )
-
- ROM_REGION( 463532, "svg", 0)
- ROM_LOAD( "trobocop2.svg", 0, 463532, CRC(c2b92868) SHA1(87912f02bea967c10ba1d8f7c810e3c44b0e3cff) )
-ROM_END
-
-ROM_START( trockteer )
- ROM_REGION( 0x1000, "maincpu", 0 )
- ROM_LOAD( "m96", 0x0000, 0x1000, CRC(3704b60c) SHA1(04275833e1a79fd33226faf060890b66ae54e1d3) )
-
- ROM_REGION( 558086, "svg", 0)
- ROM_LOAD( "trockteer.svg", 0, 558086, CRC(8afe0f88) SHA1(702127a4ff72be492f72b24bd8917ae0e15f247d) )
-ROM_END
-
-
-ROM_START( taltbeast )
- ROM_REGION( 0x1000, "maincpu", 0 )
- ROM_LOAD( "m88", 0x0000, 0x1000, CRC(1b3d15e7) SHA1(78371230dff872d6c07eefdbc4856c2a3336eb61) )
-
- ROM_REGION( 667887, "svg", 0)
- ROM_LOAD( "taltbeast.svg", 0, 667887, CRC(1ca9bbf1) SHA1(be844dddee4a95f70ea2adf875d3ee6cda2a6633) )
-ROM_END
-
-
-ROM_START( tsf2010 )
- ROM_REGION( 0x1000, "maincpu", 0 )
- ROM_LOAD( "ma2", 0x0000, 0x1000, CRC(764b3757) SHA1(c5f90b860128658576bb837e9cabbb3045ad2756) )
-
- ROM_REGION( 595149, "svg", 0)
- ROM_LOAD( "tsf2010.svg", 0, 595149, CRC(b873856b) SHA1(1d070d4d9578bbc322d1edead208bbd44340b71a) )
-ROM_END
-
-
-ROM_START( tswampt )
- ROM_REGION( 0x1000, "maincpu", 0 )
- ROM_LOAD( "mb0", 0x0000, 0x1000, CRC(8433530c) SHA1(60716d3bba92dc8ac3f1ee29c5734c9e894a1aff) )
-
- ROM_REGION( 578505, "svg", 0)
- ROM_LOAD( "tswampt.svg", 0, 578505, CRC(98ff2fbb) SHA1(a5a4e9934b86f69176549f99246b40f323441945) )
-ROM_END
-
-
-ROM_START( tspidman )
- ROM_REGION( 0x1000, "maincpu", 0 )
- ROM_LOAD( "ma5", 0x0000, 0x1000, CRC(2624daed) SHA1(7c10434ae899637264de706045d48e3fce1d30a7) )
-
- ROM_REGION( 605332, "svg", 0)
- ROM_LOAD( "tspidman.svg", 0, 605332, CRC(6e687727) SHA1(c1a2ee450509e05d1db61e02f6a911207d2830c4) )
-ROM_END
-
-
-ROM_START( txmen )
- ROM_REGION( 0x1000, "maincpu", 0 )
- ROM_LOAD( "ma7", 0x0000, 0x1000, CRC(6f3ff34f) SHA1(aa24fbc3a4117ea51ebf951ee343a36c77692b72) )
-
- ROM_REGION( 543232, "svg", 0)
- ROM_LOAD( "txmen.svg", 0, 543232, CRC(51daf7f9) SHA1(b59ecbd83e05478f4b2654a019291c7e06893112) )
-ROM_END
-
-
-ROM_START( tddragon3 )
- ROM_REGION( 0x1000, "maincpu", 0 )
- ROM_LOAD( "ma6", 0x0000, 0x1000, CRC(8e2da0d9) SHA1(54dd05124b4c605975b0cb1eadd7456ff4a94d68) )
-
- ROM_REGION( 615684, "svg", 0)
- ROM_LOAD( "tddragon3.svg", 0, 615684, CRC(3f5df090) SHA1(c9248fbf3a4dec0ce3b32b10fb67f133595cc54d) )
-ROM_END
-
-
-ROM_START( tflash )
- ROM_REGION( 0x1000, "maincpu", 0 )
- ROM_LOAD( "mb5", 0x0000, 0x1000, CRC(f7f1d082) SHA1(49a7a931450cf27fe69076c4e15ffb34814e25d4) )
-
- ROM_REGION( 587820, "svg", 0)
- ROM_LOAD( "tflash.svg", 0, 587820, CRC(aa1ad063) SHA1(aec6b15569d3d58ff9a4f7db779cda4a1c8efc35) )
-ROM_END
-
-
-ROM_START( tmchammer )
- ROM_REGION( 0x1000, "maincpu", 0 )
- ROM_LOAD( "n63.program", 0x0000, 0x1000, CRC(303aa6f7) SHA1(296689be1ee05238e52e9882812868b2ea96202c) )
-
- ROM_REGION( 0x100, "maincpu:melody", 0 )
- ROM_LOAD( "n63.melody", 0x000, 0x100, CRC(77c1a5a3) SHA1(c00ae3b7c64dd9db96eab520fe674a40571fc15f) )
-
- ROM_REGION( 456446, "svg", 0)
- ROM_LOAD( "tmchammer.svg", 0, 456446, CRC(79d6d45d) SHA1(bf6b8c6fdccad657377ad9f721dd22408f6ae775) )
-ROM_END
-
-
-ROM_START( tbtoads )
- ROM_REGION( 0x1000, "maincpu", 0 )
- ROM_LOAD( "mb3", 0x0000, 0x1000, CRC(8fa4c55a) SHA1(2be97e63dfed51313e180d7388dd431058db5a51) )
-
- ROM_REGION( 694365, "svg", 0)
- ROM_LOAD( "tbtoads.svg", 0, 694365, CRC(3af488e9) SHA1(d0e9ec61fac23bb22e508da4fa8bf2a7b8f186cf) )
-ROM_END
-
-
-ROM_START( thook )
- ROM_REGION( 0x1000, "maincpu", 0 )
- ROM_LOAD( "mb7", 0x0000, 0x1000, CRC(7eb1a6e2) SHA1(f4a09ab95c968b0ddbe56cd7bb2667881c145731) )
-
- ROM_REGION( 680503, "svg", 0)
- ROM_LOAD( "thook.svg", 0, 680503, CRC(28bd6da2) SHA1(e97b1dda219a766ffcca15d1b3279f5cee5e2fed) )
-ROM_END
-
-
-ROM_START( tbttf )
- ROM_REGION( 0x1000, "maincpu", 0 )
- ROM_LOAD( "mc3", 0x0000, 0x1000, CRC(9c37a23c) SHA1(c09fa5caac8b574f8460265b98c0bea1d5e78c6a) )
-
- ROM_REGION( 667700, "svg", 0)
- ROM_LOAD( "tbttf.svg", 0, 667700, CRC(d1d19ec5) SHA1(7361943ccf1f4072bba6fd4e6acae3e2f3d7a0ea) )
-ROM_END
-
-
-ROM_START( taddams )
- ROM_REGION( 0x1000, "maincpu", 0 )
- ROM_LOAD( "mc2", 0x0000, 0x1000, CRC(af33d432) SHA1(676ada238c389d1dd02dcb29731d69624f60b342) )
-
- ROM_REGION( 554649, "svg", 0)
- ROM_LOAD( "taddams.svg", 0, 554649, CRC(0b916c6d) SHA1(5a2456b4a0f31db94a78373baab46f3ff9732b92) )
-ROM_END
-
-
-ROM_START( thalone )
- ROM_REGION( 0x1000, "maincpu", 0 )
- ROM_LOAD( "mc7", 0x0000, 0x1000, CRC(eceda335) SHA1(20c9ffcf914db61aba03716fe146bac42873ac82) )
-
- ROM_REGION( 494235, "svg", 0)
- ROM_LOAD( "thalone.svg", 0, 494235, CRC(0e32df1d) SHA1(1fff1d37a5fe66d4f59d12af3ce67665c0049800) )
-ROM_END
-
-
-ROM_START( txmenpx )
- ROM_REGION( 0x1000, "maincpu", 0 )
- ROM_LOAD( "md3", 0x0000, 0x1000, CRC(11c2b09a) SHA1(f94b1e3e60f002398b39c98946469dd1a6aa8e77) )
-
- ROM_REGION( 572538, "svg", 0)
- ROM_LOAD( "txmenpx.svg", 0, 572538, CRC(9a89c753) SHA1(e3828a8c10c77ee5634128d0e9239e8cda19f988) )
-ROM_END
-
-
-ROM_START( thalone2 )
- ROM_REGION( 0x1000, "maincpu", 0 )
- ROM_LOAD( "md7", 0x0000, 0x1000, CRC(ac8a21e9) SHA1(9024f74e34056f90b7dbf439300797183f74eb00) )
-
- ROM_REGION( 748886, "svg", 0)
- ROM_LOAD( "thalone2.svg", 0, 748886, CRC(a5d8898e) SHA1(de8fae0169a3797a46b5c81d9b556df636a5674e) )
-ROM_END
-
-
-ROM_START( tsonic )
- ROM_REGION( 0x1000, "maincpu", 0 )
- ROM_LOAD( "n71.program", 0x0000, 0x1000, CRC(44cafd68) SHA1(bf8d0ab88d153fabc688ffec19959209ca79c3db) )
-
- ROM_REGION( 0x100, "maincpu:melody", 0 )
- ROM_LOAD( "n71.melody", 0x000, 0x100, CRC(bae258c8) SHA1(81cb75d73fab4479cd92fcb13d9cb03cec2afdd5) )
-
- ROM_REGION( 541450, "svg", 0)
- ROM_LOAD( "tsonic.svg", 0, 541450, CRC(f01835e3) SHA1(25f924af55ffadd2aebf50a89f75571d788d5ac1) )
-ROM_END
-
-
-ROM_START( trobocop3 )
- ROM_REGION( 0x1000, "maincpu", 0 )
- ROM_LOAD( "mc6", 0x0000, 0x1000, CRC(07b44e4c) SHA1(3165c85e16c062d2d9d0c0f1b1f6bd6079b4de15) )
-
- ROM_REGION( 612103, "svg", 0)
- ROM_LOAD( "trobocop3.svg", 0, 612103, CRC(9a162642) SHA1(b775f64e4616c4fc8d2c139938f148c9666e646a) )
-ROM_END
-
-
-ROM_START( tdummies )
- ROM_REGION( 0x1000, "maincpu", 0 )
- ROM_LOAD( "me0", 0x0000, 0x1000, CRC(29efae4a) SHA1(0b26913a3fd2fde2b39549f0f7cbc3daaa41eb50) )
-
- ROM_REGION( 525493, "svg", 0)
- ROM_LOAD( "tdummies.svg", 0, 525493, CRC(a18a5216) SHA1(1238e8c489445e715d4fc53e597820845b386233) )
-ROM_END
-
-
-ROM_START( tsfight2 )
- ROM_REGION( 0x1000, "maincpu", 0 )
- ROM_LOAD( "me1", 0x0000, 0x1000, CRC(73384e94) SHA1(350417d101ce034b3974b4a1d2e04bcb3bf70605) )
-
- ROM_REGION( 630403, "svg", 0)
- ROM_LOAD( "tsfight2.svg", 0, 630403, CRC(eadc2c81) SHA1(20b2a797f6b9a008c1994eaee7b87e3fe828e837) )
-ROM_END
-
-
-ROM_START( twworld )
- ROM_REGION( 0x1000, "maincpu", 0 )
- ROM_LOAD( "me7", 0x0000, 0x1000, CRC(dcb16d98) SHA1(539989e12bbc4a719818546c5edcfda02b98210e) )
-
- ROM_REGION( 527859, "svg", 0)
- ROM_LOAD( "twworld.svg", 0, 527859, CRC(0a2cffce) SHA1(d8c3f2fef60357e47ce0b44d588d0bb39112c8b9) )
-ROM_END
-
-
-ROM_START( tjpark )
- ROM_REGION( 0x1000, "maincpu", 0 )
- ROM_LOAD( "mf4", 0x0000, 0x1000, CRC(f66faf73) SHA1(4cfa743dcd6e44a3c1f56206d5824fddba16df01) )
-
- ROM_REGION( 812575, "svg", 0)
- ROM_LOAD( "tjpark.svg", 0, 812575, CRC(539c9b9c) SHA1(bf9a95586438df677d753deb17abc97f8837cbe3) )
-ROM_END
-
-
-ROM_START( tsonic2 )
- ROM_REGION( 0x1000, "maincpu", 0 )
- ROM_LOAD( "n86.program", 0x0000, 0x1000, CRC(782874c5) SHA1(b7eb1f56cbc781ba0b90f6b4b5b51944120733cc) )
-
- ROM_REGION( 0x100, "maincpu:melody", 0 )
- ROM_LOAD( "n86.melody", 0x000, 0x100, CRC(c16fa2b2) SHA1(222772d311fd3b3b05d80cfd539c2c862bed0be5) )
-
- ROM_REGION( 667887, "svg", 0)
- ROM_LOAD( "tsonic2.svg", 0, 667887, CRC(ef82d40e) SHA1(f22efba565adb32634d8b46c31459ec833b13d98) )
-ROM_END
-
-
-ROM_START( tdennis )
- ROM_REGION( 0x1000, "maincpu", 0 )
- ROM_LOAD( "mf9", 0x0000, 0x1000, CRC(d95f54d5) SHA1(1b3a170f32deec98e54ad09c04b404f5ae03dcea) )
-
- ROM_REGION( 754842, "svg", 0)
- ROM_LOAD( "tdennis.svg", 0, 754842, CRC(3b1ed476) SHA1(adc94919daa9a6c42f1acd8ef5113b61859338b7) )
-ROM_END
-
-
-ROM_START( tsddragon )
- ROM_REGION( 0x1000, "maincpu", 0 )
- ROM_LOAD( "mf5", 0x0000, 0x1000, CRC(264c8e82) SHA1(470eb2f09a58ef05eb0b7c8e11380ad1d8ce4e1a) )
-
- ROM_REGION( 753533, "svg", 0)
- ROM_LOAD( "tsddragon.svg", 0, 753533, CRC(fb526049) SHA1(552fe005a6e23e083867b7d1c10d20daa8913a14) )
-ROM_END
-
-
-ROM_START( tnmarebc )
- ROM_REGION( 0x1000, "maincpu", 0 )
- ROM_LOAD( "mg0", 0x0000, 0x1000, CRC(5ef21421) SHA1(8fd458575111b89d7c33c969e76703bde5ad2c36) )
-
- ROM_REGION( 631310, "svg", 0)
- ROM_LOAD( "tnmarebc.svg", 0, 631310, CRC(f9c96205) SHA1(1947d358efd94ae3257ed959172a819798d2c9a1) )
-ROM_END
-
-
-ROM_START( ttransf2 )
- ROM_REGION( 0x1000, "maincpu", 0 )
- ROM_LOAD( "mg2", 0x0000, 0x1000, CRC(65c0f456) SHA1(b1bc3887c5088b3fe359585658e5c5236c09af9e) )
-
- ROM_REGION( 727662, "svg", 0)
- ROM_LOAD( "ttransf2.svg", 0, 727662, CRC(52fd5ea1) SHA1(35ae9fe2cea14ee4c591df0458fed478c9feb044) )
-ROM_END
-
-
-ROM_START( topaliens )
- ROM_REGION( 0x1000, "maincpu", 0 )
- ROM_LOAD( "mj1", 0x0000, 0x1000, CRC(ccc196cf) SHA1(f18f7cf842cddecf90d05ab0f90257bb76514f54) )
-
- ROM_REGION( 1214876, "svg", 0)
- ROM_LOAD( "topaliens.svg", 0, 1214876, CRC(683c70aa) SHA1(0fac5ba8ab5f9b73a3cbbff046be60550fa5f98a) )
-ROM_END
-
-
-ROM_START( tmkombat )
- ROM_REGION( 0x1000, "maincpu", 0 )
- ROM_LOAD( "mg6", 0x0000, 0x1000, CRC(f6375dc7) SHA1(a711199c2623979f19c11067ebfff9355256c2c3) )
-
- ROM_REGION( 841829, "svg", 0)
- ROM_LOAD( "tmkombat.svg", 0, 841829, CRC(9dc4f58c) SHA1(9c9b080d7f3b777407445c22195990c55c6352ca) )
-ROM_END
-
-
-ROM_START( tshadow )
- ROM_REGION( 0x1000, "maincpu", 0 )
- ROM_LOAD( "mj5", 0x0000, 0x1000, CRC(09822d73) SHA1(30cae8b783a4f388193aee248fa18c6c1042e0ec) )
-
- ROM_REGION( 946450, "svg", 0)
- ROM_LOAD( "tshadow.svg", 0, 946450, CRC(5cab680a) SHA1(8f8f660c08fc56287362b11c183655047fbd91ca) )
-ROM_END
-
-
-ROM_START( tskelwarr )
- ROM_REGION( 0x1000, "maincpu", 0 )
- ROM_LOAD( "mk0", 0x0000, 0x1000, CRC(dc7827a1) SHA1(74ff143605684df0c70db604a5f22dbf512044d7) )
-
- ROM_REGION( 1125002, "svg", 0)
- ROM_LOAD( "tskelwarr.svg", 0, 1125002, CRC(49c6ca24) SHA1(71f4ed98ab558deeb86820b7fbf7534a7b7d6b01) )
-ROM_END
-
-
-ROM_START( tbatfor )
- ROM_REGION( 0x1000, "maincpu", 0 )
- ROM_LOAD( "mk3", 0x0000, 0x1000, CRC(9993c382) SHA1(0c89e21024315ce7c086af5390c60f5766028c4f) )
-
- ROM_REGION( 902364, "svg", 0)
- ROM_LOAD( "tbatfor.svg", 0, 902364, CRC(56889c05) SHA1(dda393ca99196de38ad2e989ec6c292adc36ec5e) )
-ROM_END
-
-
-ROM_START( tjdredd )
- ROM_REGION( 0x1000, "maincpu", 0 )
- ROM_LOAD( "mk5", 0x0000, 0x1000, CRC(7beee5a7) SHA1(9a190197c5751b43a9ab2dc8c536934dc5fc5e83) )
-
- ROM_REGION( 1051586, "svg", 0)
- ROM_LOAD( "tjdredd.svg", 0, 1051586, CRC(4fcdca0a) SHA1(d4b019fec94890ba6600baf2b2096dbcf3295180) )
-ROM_END
-
-
-ROM_START( tapollo13 )
- ROM_REGION( 0x1000, "maincpu", 0 )
- ROM_LOAD( "10_07", 0x0000, 0x1000, CRC(63d0deaa) SHA1(d5de99d5e0ee08ec2ebeef7189ebac1c008d2e7d) )
-
- ROM_REGION( 643176, "svg", 0)
- ROM_LOAD( "tapollo13.svg", 0, 643176, CRC(e2dac162) SHA1(4089fa485579d2b87ac49b1cf33d6c2c085ea4c5) )
-ROM_END
-
-
-ROM_START( tgoldeye )
- ROM_REGION( 0x1000, "maincpu", 0 )
- ROM_LOAD( "10_06", 0x0000, 0x1000, CRC(fe053efb) SHA1(3c90c0fa43e6e5e1f76b306e402f902d19175c96) )
-
- ROM_REGION( 938916, "svg", 0)
- ROM_LOAD( "tgoldeye.svg", 0, 938916, CRC(6dddf962) SHA1(1ced43b4225b86eca415f9af7db5fb5e80040186) )
-ROM_END
-
-
-ROM_START( tinday )
- ROM_REGION( 0x1000, "maincpu", 0 )
- ROM_LOAD( "10_16", 0x0000, 0x1000, CRC(77c2c2f7) SHA1(06326b26d0f6757180724ba0bdeb4110cc7e29d6) )
-
- ROM_REGION( 1162672, "svg", 0)
- ROM_LOAD( "tinday.svg", 0, 1162672, CRC(9b9a8047) SHA1(2aeaa71a54cf897d2a5d91133c733613ca229aae) )
-ROM_END
-
-
-ROM_START( tsjam )
- ROM_REGION( 0x1000, "maincpu", 0 )
- ROM_LOAD( "10_23", 0x0000, 0x1000, CRC(6eaabfbd) SHA1(f0ecbd6f65fe72ce2d8a452685be2e77a63fc9f0) )
-
- ROM_REGION( 1046147, "svg", 0)
- ROM_LOAD( "tsjam.svg", 0, 1046147, CRC(6d24e1c9) SHA1(ddbfbd85f70ec964c68f982a8ee8070e3786a85e) )
-ROM_END
-
-
-ROM_START( tbatmana )
- ROM_REGION( 0x1000, "maincpu", 0 )
- ROM_LOAD( "n81.program", 0x0000, 0x1000, CRC(efb3f122) SHA1(d55c2fb92fb9bd41d6001f42143691b84f3f389a) )
-
- ROM_REGION( 0x100, "maincpu:melody", 0 )
- ROM_LOAD( "n81.melody", 0x000, 0x100, CRC(56ba8fe5) SHA1(5c286ae1bfc943bbe8c8f4cdc9c8b73d9b3c186e) )
-
- ROM_REGION( 618831, "svg", 0)
- ROM_LOAD( "tbatmana.svg", 0, 618831, CRC(fc38cb9d) SHA1(1b6c10dcd33bfcfef43d61f97fa8e530011c1e61) )
-ROM_END
-
-
-ROM_START( tigarden )
- ROM_REGION( 0x1000, "maincpu", 0 )
- ROM_LOAD( "0019_238e", 0x0000, 0x1000, CRC(8bd0eadd) SHA1(7bb5eb30d569901dce52d777bc01c0979e4afa06) )
-
- ROM_REGION( 409084, "svg", 0)
- ROM_LOAD( "tigarden.svg", 0, 409084, CRC(cfda5138) SHA1(1bc4ed65ae0cdca3e1e9458d68ca4d6e0fc0e901) )
-ROM_END
-
+// roms
ROM_START( nummunch )
ROM_REGION( 0x1000, "maincpu", 0 )
@@ -7843,6 +8845,14 @@ ROM_END
+} // anonymous namespace
+
+/***************************************************************************
+
+ Game driver(s)
+
+***************************************************************************/
+
// YEAR NAME PARENT COMP MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS
// Konami
CONS( 1989, kdribble, 0, 0, kdribble, kdribble, kdribble_state, empty_init, "Konami", "Double Dribble (handheld)", MACHINE_SUPPORTS_SAVE )
@@ -7858,10 +8868,16 @@ CONS( 1991, kbucky, 0, 0, kbucky, kbucky, kbucky_state,
CONS( 1991, kgarfld, 0, 0, kgarfld, kgarfld, kgarfld_state, empty_init, "Konami", "Garfield (handheld)", MACHINE_SUPPORTS_SAVE )
// Nintendo G&W: wide screen
+CONS( 1981, gnw_pchute, 0, 0, gnw_pchute, gnw_pchute, gnw_pchute_state, empty_init, "Nintendo", "Game & Watch: Parachute", MACHINE_SUPPORTS_SAVE )
+CONS( 1981, gnw_octopus, 0, 0, gnw_octopus, gnw_octopus, gnw_octopus_state, empty_init, "Nintendo", "Game & Watch: Octopus", MACHINE_SUPPORTS_SAVE )
CONS( 1981, gnw_mmouse, 0, 0, gnw_mmouse, gnw_mmouse, gnw_mmouse_state, empty_init, "Nintendo", "Game & Watch: Mickey Mouse", MACHINE_SUPPORTS_SAVE )
CONS( 1981, gnw_egg, gnw_mmouse, 0, gnw_egg, gnw_mmouse, gnw_mmouse_state, empty_init, "Nintendo", "Game & Watch: Egg", MACHINE_SUPPORTS_SAVE )
CONS( 1984, nupogodi, gnw_mmouse, 0, nupogodi, gnw_mmouse, gnw_mmouse_state, empty_init, "Elektronika", "Nu, pogodi!", MACHINE_SUPPORTS_SAVE )
CONS( 1989, exospace, gnw_mmouse, 0, exospace, exospace, gnw_mmouse_state, empty_init, "Elektronika", "Explorers of Space", MACHINE_SUPPORTS_SAVE )
+CONS( 1981, gnw_fire, 0, 0, gnw_fire, gnw_fire, gnw_fire_state, empty_init, "Nintendo", "Game & Watch: Fire (wide screen)", MACHINE_SUPPORTS_SAVE )
+CONS( 1982, gnw_tbridge, 0, 0, gnw_tbridge, gnw_tbridge, gnw_tbridge_state, empty_init, "Nintendo", "Game & Watch: Turtle Bridge", MACHINE_SUPPORTS_SAVE )
+CONS( 1982, gnw_fireatk, 0, 0, gnw_fireatk, gnw_fireatk, gnw_fireatk_state, empty_init, "Nintendo", "Game & Watch: Fire Attack", MACHINE_SUPPORTS_SAVE )
+CONS( 1982, gnw_stennis, 0, 0, gnw_stennis, gnw_stennis, gnw_stennis_state, empty_init, "Nintendo", "Game & Watch: Snoopy Tennis", MACHINE_SUPPORTS_SAVE )
// Nintendo G&W: multi screen
CONS( 1982, gnw_opanic, 0, 0, gnw_opanic, gnw_opanic, gnw_opanic_state, empty_init, "Nintendo", "Game & Watch: Oil Panic", MACHINE_SUPPORTS_SAVE)
@@ -7870,15 +8886,19 @@ CONS( 1982, gnw_mickdon, 0, 0, gnw_mickdon, gnw_mickdon, gnw_mickdon_st
CONS( 1982, gnw_ghouse, 0, 0, gnw_ghouse, gnw_ghouse, gnw_ghouse_state, empty_init, "Nintendo", "Game & Watch: Green House", MACHINE_SUPPORTS_SAVE )
CONS( 1983, gnw_dkong2, 0, 0, gnw_dkong2, gnw_dkong2, gnw_dkong2_state, empty_init, "Nintendo", "Game & Watch: Donkey Kong II", MACHINE_SUPPORTS_SAVE )
CONS( 1983, gnw_mario, 0, 0, gnw_mario, gnw_mario, gnw_mario_state, empty_init, "Nintendo", "Game & Watch: Mario Bros.", MACHINE_SUPPORTS_SAVE )
+CONS( 1983, gnw_rshower, 0, 0, gnw_rshower, gnw_rshower, gnw_rshower_state, empty_init, "Nintendo", "Game & Watch: Rain Shower", MACHINE_SUPPORTS_SAVE)
+CONS( 1983, gnw_lboat, 0, 0, gnw_lboat, gnw_lboat, gnw_lboat_state, empty_init, "Nintendo", "Game & Watch: Lifeboat", MACHINE_SUPPORTS_SAVE)
CONS( 1985, gnw_bjack, 0, 0, gnw_bjack, gnw_bjack, gnw_bjack_state, empty_init, "Nintendo", "Game & Watch: Black Jack", MACHINE_SUPPORTS_SAVE)
CONS( 1986, gnw_squish, 0, 0, gnw_squish, gnw_squish, gnw_squish_state, empty_init, "Nintendo", "Game & Watch: Squish", MACHINE_SUPPORTS_SAVE )
// Nintendo G&W: new wide screen
CONS( 1982, gnw_dkjr, 0, 0, gnw_dkjr, gnw_dkjr, gnw_dkjr_state, empty_init, "Nintendo", "Game & Watch: Donkey Kong Jr. (new wide screen)", MACHINE_SUPPORTS_SAVE )
CONS( 1983, gnw_mariocm, 0, 0, gnw_mariocm, gnw_mariocm, gnw_mariocm_state, empty_init, "Nintendo", "Game & Watch: Mario's Cement Factory (new wide screen)", MACHINE_SUPPORTS_SAVE )
+CONS( 1983, gnw_manhole, 0, 0, gnw_manhole, gnw_manhole, gnw_manhole_state, empty_init, "Nintendo", "Game & Watch: Manhole (new wide screen)", MACHINE_SUPPORTS_SAVE )
CONS( 1985, gnw_tfish, 0, 0, gnw_tfish, gnw_tfish, gnw_tfish_state, empty_init, "Nintendo", "Game & Watch: Tropical Fish", MACHINE_SUPPORTS_SAVE )
CONS( 1988, gnw_smb, 0, 0, gnw_smb, gnw_smb, gnw_smb_state, empty_init, "Nintendo", "Game & Watch: Super Mario Bros. (new wide screen)", MACHINE_SUPPORTS_SAVE )
CONS( 1988, gnw_climber, 0, 0, gnw_climber, gnw_climber, gnw_climber_state, empty_init, "Nintendo", "Game & Watch: Climber (new wide screen)", MACHINE_SUPPORTS_SAVE )
+CONS( 1988, gnw_bfight, 0, 0, gnw_bfight, gnw_bfight, gnw_bfight_state, empty_init, "Nintendo", "Game & Watch: Balloon Fight (new wide screen)", MACHINE_SUPPORTS_SAVE )
// Nintendo G&W: micro vs. system (actually, no official Game & Watch logo anywhere)
CONS( 1984, gnw_boxing, 0, 0, gnw_boxing, gnw_boxing, gnw_boxing_state, empty_init, "Nintendo", "Micro Vs. System: Boxing", MACHINE_SUPPORTS_SAVE )
@@ -7930,8 +8950,8 @@ CONS( 1995, tbatfor, 0, 0, tbatfor, tbatfor, tbatfor_state,
CONS( 1995, tjdredd, 0, 0, tjdredd, tjdredd, tjdredd_state, empty_init, "Tiger Electronics", "Judge Dredd (handheld)", MACHINE_SUPPORTS_SAVE )
CONS( 1995, tapollo13, 0, 0, tapollo13, tapollo13, tapollo13_state, empty_init, "Tiger Electronics", "Apollo 13 (handheld)", MACHINE_SUPPORTS_SAVE )
CONS( 1995, tgoldeye, 0, 0, tgoldeye, tgoldeye, tgoldeye_state, empty_init, "Tiger Electronics", "007: GoldenEye (handheld)", MACHINE_SUPPORTS_SAVE )
-CONS( 1996, tinday, 0, 0, tinday, tinday, tinday_state, empty_init, "Tiger Electronics", "Independence Day (handheld)", MACHINE_SUPPORTS_SAVE )
CONS( 1996, tsjam, 0, 0, tsjam, tsjam, tsjam_state, empty_init, "Tiger Electronics", "Space Jam (handheld)", MACHINE_SUPPORTS_SAVE )
+CONS( 1996, tinday, 0, 0, tinday, tinday, tinday_state, empty_init, "Tiger Electronics", "Independence Day (handheld)", MACHINE_SUPPORTS_SAVE )
// Tiger 72-xxx models
CONS( 1992, tbatmana, 0, 0, tbatmana, tbatmana, tbatmana_state, empty_init, "Tiger Electronics", "Batman: The Animated Series (handheld)", MACHINE_SUPPORTS_SAVE )
diff --git a/src/mame/drivers/hh_tms1k.cpp b/src/mame/drivers/hh_tms1k.cpp
index 710ae7de841..3a650e9cd06 100644
--- a/src/mame/drivers/hh_tms1k.cpp
+++ b/src/mame/drivers/hh_tms1k.cpp
@@ -69,7 +69,7 @@
*MP3232 TMS1000 1979, Fonas 2-Player Baseball (no "MP" on chip label)
@MP3300 TMS1000 1979, Milton Bradley Simon (Rev F)
@MP3301A TMS1000 1979, Milton Bradley Big Trak
- *MP3320A TMS1000 1979, Coleco Head to Head: Electronic Basketball
+ @MP3320A TMS1000 1979, Coleco Head to Head: Electronic Basketball
@MP3321A TMS1000 1979, Coleco Head to Head: Electronic Hockey
*MP3352 TMS1200 1979, Tiger Sub Wars (model 7-490)
@M32001 TMS1000 1981, Coleco Quiz Wiz Challenger (note: MP3398, MP3399, M3200x?)
@@ -143,7 +143,6 @@
- finish bshipb SN76477 sound
- improve elecbowl driver
- is alphie(patent) the same as the final version?
- - h2hhockey R9 timing is wrong: passing seems too slow, and in-game clock too fast
***************************************************************************/
@@ -199,6 +198,7 @@
#include "gjackpot.lh"
#include "gpoker.lh"
#include "h2hbaseb.lh"
+#include "h2hbaskb.lh"
#include "h2hboxing.lh"
#include "h2hfootb.lh"
#include "h2hhockey.lh"
@@ -211,6 +211,7 @@
#include "merlin.lh" // clickable
#include "mmerlin.lh" // clickable
#include "monkeysee.lh"
+#include "phpball.lh"
#include "quizwizc.lh"
#include "raisedvl.lh"
#include "simon.lh" // clickable
@@ -227,9 +228,9 @@
#include "tcfballa.lh"
#include "timaze.lh"
#include "xl25.lh" // clickable
-#include "zodiac.lh"
+#include "zodiac.lh" // clickable
-#include "hh_tms1k_test.lh" // common test-layout - use external artwork
+//#include "hh_tms1k_test.lh" // common test-layout - use external artwork
// machine_start/reset
@@ -393,6 +394,23 @@ u8 hh_tms1k_state::read_rotated_inputs(int columns, u8 rowmask)
return ret;
}
+void hh_tms1k_state::switch_change(int sel, u32 mask, bool next)
+{
+ // config switches (for direct control)
+ ioport_field *inp = m_inp_matrix[sel]->field(mask);
+
+ if (next && inp->has_next_setting())
+ inp->select_next_setting();
+ else if (!next && inp->has_previous_setting())
+ inp->select_previous_setting();
+}
+
+INPUT_CHANGED_MEMBER(hh_tms1k_state::reset_button)
+{
+ // when an input is directly wired to MCU INIT pin
+ m_maincpu->set_input_line(INPUT_LINE_RESET, newval ? ASSERT_LINE : CLEAR_LINE);
+}
+
INPUT_CHANGED_MEMBER(hh_tms1k_state::power_button)
{
m_power_on = (bool)(uintptr_t)param;
@@ -416,10 +434,12 @@ void hh_tms1k_state::power_off()
/***************************************************************************
- Minidrivers (subclass, I/O, Inputs, Machine Config)
+ Minidrivers (subclass, I/O, Inputs, Machine Config, ROM Defs)
***************************************************************************/
+namespace {
+
/***************************************************************************
A-One LSI Match Number
@@ -440,8 +460,8 @@ void hh_tms1k_state::power_off()
class matchnum_state : public hh_tms1k_state
{
public:
- matchnum_state(const machine_config &mconfig, device_type type, const char *tag)
- : hh_tms1k_state(mconfig, type, tag)
+ matchnum_state(const machine_config &mconfig, device_type type, const char *tag) :
+ hh_tms1k_state(mconfig, type, tag)
{ }
void prepare_display();
@@ -547,6 +567,18 @@ void matchnum_state::matchnum(machine_config &config)
m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25);
}
+// roms
+
+ROM_START( matchnum )
+ ROM_REGION( 0x0400, "maincpu", 0 )
+ ROM_LOAD( "mp0163", 0x0000, 0x0400, CRC(37507600) SHA1(b1d4d8ea563e97ef378b42c44cb3ea4eb6abe0d2) )
+
+ ROM_REGION( 867, "maincpu:mpla", 0 )
+ ROM_LOAD( "tms1000_common2_micro.pla", 0, 867, CRC(d33da3cf) SHA1(13c4ebbca227818db75e6db0d45b66ba5e207776) )
+ ROM_REGION( 365, "maincpu:opla", 0 )
+ ROM_LOAD( "tms1000_matchnum_output.pla", 0, 365, CRC(da29670c) SHA1(bcec28bf25dc8c81d08851ad8a3f4e89f413017a) )
+ROM_END
+
@@ -569,8 +601,8 @@ void matchnum_state::matchnum(machine_config &config)
class arrball_state : public hh_tms1k_state
{
public:
- arrball_state(const machine_config &mconfig, device_type type, const char *tag)
- : hh_tms1k_state(mconfig, type, tag)
+ arrball_state(const machine_config &mconfig, device_type type, const char *tag) :
+ hh_tms1k_state(mconfig, type, tag)
{ }
void prepare_display();
@@ -647,6 +679,18 @@ void arrball_state::arrball(machine_config &config)
m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25);
}
+// roms
+
+ROM_START( arrball )
+ ROM_REGION( 0x0400, "maincpu", 0 )
+ ROM_LOAD( "mp0166", 0x0000, 0x0400, CRC(a78694db) SHA1(362aa6e356288e8df7da610246bd01fe72985d57) )
+
+ ROM_REGION( 867, "maincpu:mpla", 0 )
+ ROM_LOAD( "tms1000_common2_micro.pla", 0, 867, CRC(d33da3cf) SHA1(13c4ebbca227818db75e6db0d45b66ba5e207776) )
+ ROM_REGION( 365, "maincpu:opla", 0 )
+ ROM_LOAD( "tms1000_arrball_output.pla", 0, 365, CRC(ffc206fb) SHA1(339be3f066fb2f075211c554e81260b49cd83d15) )
+ROM_END
+
@@ -677,8 +721,8 @@ void arrball_state::arrball(machine_config &config)
class mathmagi_state : public hh_tms1k_state
{
public:
- mathmagi_state(const machine_config &mconfig, device_type type, const char *tag)
- : hh_tms1k_state(mconfig, type, tag)
+ mathmagi_state(const machine_config &mconfig, device_type type, const char *tag) :
+ hh_tms1k_state(mconfig, type, tag)
{ }
void prepare_display();
@@ -772,41 +816,13 @@ static INPUT_PORTS_START( mathmagi )
PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED )
INPUT_PORTS_END
-// output PLA is not decapped
+// output PLA is not decapped, this was made by hand
static const u16 mathmagi_output_pla[0x20] =
{
- lA+lB+lC+lD+lE+lF, // 0
- lB+lC, // 1
- lA+lB+lG+lE+lD, // 2
- lA+lB+lG+lC+lD, // 3
- lF+lB+lG+lC, // 4
- lA+lF+lG+lC+lD, // 5
- lA+lF+lG+lC+lD+lE, // 6
- lA+lB+lC, // 7
- lA+lB+lC+lD+lE+lF+lG, // 8
- lA+lB+lG+lF+lC+lD, // 9
- lA+lB+lG+lE, // question mark
- lE+lG, // r
- lD, // underscore?
- lA+lF+lG+lE+lD, // E
- lG, // -
- 0, // empty
- 0, // empty
- lG, // lamp 4 or MATH -
- lD, // lamp 3
- lF+lE+lD+lC+lG, // b
- lB, // lamp 2
- lB+lG, // MATH +
- lB+lC, // MATH mul
- lF+lG+lB+lC+lD, // y
- lA, // lamp 1
- lA+lG, // MATH div
- lA+lD, // EQUALS
- 0, // ?
- 0, // ?
- lE+lD+lC+lG, // o
- 0, // ?
- lA+lF+lE+lD+lC // G
+ 0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, // 0, 1, 2, 3, 4, 5, 6, 7
+ 0x7f, 0x6f, 0x53, 0x50, 0x08, 0x79, 0x40, 0x00, // 8, 9, questionmark, r, underscore?, E, -(negative), empty
+ 0x00, 0x40, 0x08, 0x7c, 0x02, 0x42, 0x06, 0x6e, // empty, led4/-, led3, b, led2, +, ×, y
+ 0x01, 0x41, 0x09, 0, 0, 0x5c, 0, 0x3d // led1, ÷, =, ?, ?, o, ?, G
};
void mathmagi_state::mathmagi(machine_config &config)
@@ -824,6 +840,18 @@ void mathmagi_state::mathmagi(machine_config &config)
/* no sound! */
}
+// roms
+
+ROM_START( mathmagi )
+ ROM_REGION( 0x0800, "maincpu", 0 )
+ ROM_LOAD( "mp1030", 0x0000, 0x0800, CRC(a81d7ccb) SHA1(4756ce42f1ea28ce5fe6498312f8306f10370969) )
+
+ ROM_REGION( 867, "maincpu:mpla", 0 )
+ ROM_LOAD( "tms1100_common2_micro.pla", 0, 867, BAD_DUMP CRC(7cc90264) SHA1(c6e1cf1ffb178061da9e31858514f7cd94e86990) ) // not verified
+ ROM_REGION( 365, "maincpu:opla", 0 )
+ ROM_LOAD( "tms1100_mathmagi_output.pla", 0, 365, NO_DUMP )
+ROM_END
+
@@ -849,8 +877,8 @@ void mathmagi_state::mathmagi(machine_config &config)
class bcheetah_state : public hh_tms1k_state
{
public:
- bcheetah_state(const machine_config &mconfig, device_type type, const char *tag)
- : hh_tms1k_state(mconfig, type, tag)
+ bcheetah_state(const machine_config &mconfig, device_type type, const char *tag) :
+ hh_tms1k_state(mconfig, type, tag)
{ }
DECLARE_WRITE16_MEMBER(write_r);
@@ -928,6 +956,18 @@ void bcheetah_state::bcheetah(machine_config &config)
/* no sound! */
}
+// roms
+
+ROM_START( bcheetah )
+ ROM_REGION( 0x0400, "maincpu", 0 )
+ ROM_LOAD( "mp0915", 0x0000, 0x0400, CRC(2968c81e) SHA1(d1e6691952600e88ccf626cb3d683419a1e8468c) )
+
+ ROM_REGION( 867, "maincpu:mpla", 0 )
+ ROM_LOAD( "tms1000_common2_micro.pla", 0, 867, CRC(d33da3cf) SHA1(13c4ebbca227818db75e6db0d45b66ba5e207776) )
+ ROM_REGION( 365, "maincpu:opla", 0 )
+ ROM_LOAD( "tms1000_bcheetah_output.pla", 0, 365, CRC(cc6d1ecd) SHA1(b0635a841d8850c36c1f414abe0571b81884b972) )
+ROM_END
+
@@ -947,8 +987,8 @@ void bcheetah_state::bcheetah(machine_config &config)
class amaztron_state : public hh_tms1k_state
{
public:
- amaztron_state(const machine_config &mconfig, device_type type, const char *tag)
- : hh_tms1k_state(mconfig, type, tag)
+ amaztron_state(const machine_config &mconfig, device_type type, const char *tag) :
+ hh_tms1k_state(mconfig, type, tag)
{ }
void prepare_display();
@@ -1059,6 +1099,18 @@ void amaztron_state::amaztron(machine_config &config)
m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25);
}
+// roms
+
+ROM_START( amaztron )
+ ROM_REGION( 0x0800, "maincpu", 0 )
+ ROM_LOAD( "mp3405", 0x0000, 0x0800, CRC(9cbc0009) SHA1(17772681271b59280687492f37fa0859998f041d) )
+
+ ROM_REGION( 867, "maincpu:mpla", 0 )
+ ROM_LOAD( "tms1100_common3_micro.pla", 0, 867, CRC(03574895) SHA1(04407cabfb3adee2ee5e4218612cb06c12c540f4) )
+ ROM_REGION( 365, "maincpu:opla", 0 )
+ ROM_LOAD( "tms1100_amaztron_output.pla", 0, 365, CRC(f3875384) SHA1(3c256a3db4f0aa9d93cf78124db39f4cbdc57e4a) )
+ROM_END
+
@@ -1077,8 +1129,8 @@ void amaztron_state::amaztron(machine_config &config)
class zodiac_state : public hh_tms1k_state
{
public:
- zodiac_state(const machine_config &mconfig, device_type type, const char *tag)
- : hh_tms1k_state(mconfig, type, tag)
+ zodiac_state(const machine_config &mconfig, device_type type, const char *tag) :
+ hh_tms1k_state(mconfig, type, tag)
{ }
void prepare_display();
@@ -1113,7 +1165,7 @@ WRITE16_MEMBER(zodiac_state::write_r)
WRITE16_MEMBER(zodiac_state::write_o)
{
// O0-O7: digit segment/led data
- m_o = data;
+ m_o = bitswap<8>(data,0,7,6,5,4,3,2,1);
prepare_display();
}
@@ -1172,7 +1224,7 @@ static INPUT_PORTS_START( zodiac )
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("Enter") PORT_CHAR(13)
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNUSED )
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED )
- PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_BACKSPACE) PORT_CODE(KEYCODE_DEL_PAD) PORT_NAME("Clear") PORT_CHAR(8)
+ PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_BACKSPACE) PORT_CODE(KEYCODE_DEL) PORT_CODE(KEYCODE_DEL_PAD) PORT_NAME("Clear") PORT_CHAR(8)
PORT_START("IN.5") // R8
PORT_CONFNAME( 0x03, 0x01, "Mode")
@@ -1182,41 +1234,11 @@ static INPUT_PORTS_START( zodiac )
PORT_BIT( 0x0c, IP_ACTIVE_HIGH, IPT_UNUSED )
INPUT_PORTS_END
-// output PLA is not decapped
+// output PLA is not decapped, dumped electronically
static const u16 zodiac_output_pla[0x20] =
{
- 0x80, // empty/led 1/7
- lC, // i/led 2/8
- lE+lG, // r/led 3/9
- lC+lE+lG, // n
- lF, // seg F/led 4/10
- 0, // ?
- 0, // ?
- lC+lE+lF+lG, // h
- lB, // seg B/led 5/11
- lD, // seg D/led 6/12
- 0, // ?
- 0, // ?
- 0, // ?
- 0, // ?
- lA+lB+lE+lF+lG, // P
- 0, // ?
- lA+lB+lC+lD+lE+lF, // 0
- lB+lC, // 1
- lA+lB+lD+lE+lG, // 2
- lA+lB+lC+lD+lG, // 3
- lB+lC+lF+lG, // 4
- lA+lC+lD+lF+lG, // 5
- lA+lC+lD+lE+lF+lG, // 6
- lA+lB+lC, // 7
- lA+lB+lC+lD+lE+lF+lG, // 8
- lA+lB+lC+lD+lF+lG, // 9
- lA+lB+lC+lE+lF+lG, // A
- lB+lC+lD+lE+lG, // d
- lA+lD+lE+lF+lG, // E
- lB+lC+lD+lE, // J
- lD+lE+lF, // L
- lB+lC+lD+lE+lF // U
+ 0x01, 0x08, 0xa0, 0xa8, 0x40, 0x48, 0xe0, 0xe8, 0x06, 0x10, 0xa6, 0xb0, 0x46, 0x50, 0xe6, 0xf0,
+ 0x7e, 0x0c, 0xb6, 0x9e, 0xcc, 0xda, 0xfa, 0x0e, 0xfe, 0xce, 0xee, 0xbc, 0xf2, 0x3c, 0x70, 0x7c
};
void zodiac_state::zodiac(machine_config &config)
@@ -1237,6 +1259,18 @@ void zodiac_state::zodiac(machine_config &config)
m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25);
}
+// roms
+
+ROM_START( zodiac )
+ ROM_REGION( 0x0800, "maincpu", 0 )
+ ROM_LOAD( "mp3435", 0x0000, 0x0800, CRC(ecdc3160) SHA1(a7e82d66314a039fcffeddf99919d9f9ad42d61d) )
+
+ ROM_REGION( 867, "maincpu:mpla", 0 )
+ ROM_LOAD( "tms1100_common3_micro.pla", 0, 867, BAD_DUMP CRC(03574895) SHA1(04407cabfb3adee2ee5e4218612cb06c12c540f4) ) // not verified
+ ROM_REGION( 365, "maincpu:opla", 0 )
+ ROM_LOAD( "tms1100_zodiac_output.pla", 0, 365, NO_DUMP )
+ROM_END
+
@@ -1256,8 +1290,8 @@ void zodiac_state::zodiac(machine_config &config)
class cqback_state : public hh_tms1k_state
{
public:
- cqback_state(const machine_config &mconfig, device_type type, const char *tag)
- : hh_tms1k_state(mconfig, type, tag)
+ cqback_state(const machine_config &mconfig, device_type type, const char *tag) :
+ hh_tms1k_state(mconfig, type, tag)
{ }
void prepare_display();
@@ -1352,6 +1386,18 @@ void cqback_state::cqback(machine_config &config)
m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25);
}
+// roms
+
+ROM_START( cqback )
+ ROM_REGION( 0x0800, "maincpu", 0 )
+ ROM_LOAD( "mp3415.u4", 0x0000, 0x0800, CRC(65ebdabf) SHA1(9b5cf5adaf9132ced87f611ae8c3148b9b62ba89) )
+
+ ROM_REGION( 867, "maincpu:mpla", 0 )
+ ROM_LOAD( "tms1100_common3_micro.pla", 0, 867, CRC(03574895) SHA1(04407cabfb3adee2ee5e4218612cb06c12c540f4) )
+ ROM_REGION( 365, "maincpu:opla", 0 )
+ ROM_LOAD( "tms1100_cqback_output.pla", 0, 365, CRC(c6dcbfd0) SHA1(593b6b7de981a28d1b4a33336b39df92d02ed4f4) )
+ROM_END
+
@@ -1374,8 +1420,8 @@ void cqback_state::cqback(machine_config &config)
class h2hfootb_state : public hh_tms1k_state
{
public:
- h2hfootb_state(const machine_config &mconfig, device_type type, const char *tag)
- : hh_tms1k_state(mconfig, type, tag)
+ h2hfootb_state(const machine_config &mconfig, device_type type, const char *tag) :
+ hh_tms1k_state(mconfig, type, tag)
{ }
void prepare_display();
@@ -1470,51 +1516,81 @@ void h2hfootb_state::h2hfootb(machine_config &config)
m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25);
}
+// roms
+
+ROM_START( h2hfootb )
+ ROM_REGION( 0x0800, "maincpu", 0 )
+ ROM_LOAD( "mp3460.u3", 0x0000, 0x0800, CRC(3a4e53a8) SHA1(5052e706f992c6c4bada1fa7769589eec3df6471) )
+
+ ROM_REGION( 867, "maincpu:mpla", 0 )
+ ROM_LOAD( "tms1100_common1_micro.pla", 0, 867, CRC(62445fc9) SHA1(d6297f2a4bc7a870b76cc498d19dbb0ce7d69fec) )
+ ROM_REGION( 365, "maincpu:opla", 0 )
+ ROM_LOAD( "tms1100_h2hfootb_output.pla", 0, 365, CRC(c8d85873) SHA1(16bd6fc8e3cd16d5f8fd32d0c74e67de77f5487e) )
+ROM_END
+
/***************************************************************************
+ Coleco Head to Head: Electronic Basketball (model 2150)
+ * TMS1000NLL MP3320A (die label 1000E MP3320A)
+ * 2-digit 7seg LED display, LED grid display, 1-bit sound
+
Coleco Head to Head: Electronic Hockey (model 2160)
* TMS1000NLL E MP3321A (die label 1000E MP3321A)
- * 2-digit 7seg LED display, LED grid display, 1-bit sound
+ * same PCB/hardware as above
Unlike the COP420 version(see hh_cop400.cpp driver), each game has its own MCU.
***************************************************************************/
-class h2hhockey_state : public hh_tms1k_state
+class h2hbaskb_state : public hh_tms1k_state
{
public:
- h2hhockey_state(const machine_config &mconfig, device_type type, const char *tag)
- : hh_tms1k_state(mconfig, type, tag),
+ h2hbaskb_state(const machine_config &mconfig, device_type type, const char *tag) :
+ hh_tms1k_state(mconfig, type, tag),
m_cap_empty_timer(*this, "cap_empty")
{ }
required_device<timer_device> m_cap_empty_timer;
TIMER_DEVICE_CALLBACK_MEMBER(cap_empty_callback);
- bool m_cap;
+ bool m_cap_state;
+ attotime m_cap_charge;
void prepare_display();
DECLARE_WRITE16_MEMBER(write_r);
DECLARE_WRITE16_MEMBER(write_o);
DECLARE_READ8_MEMBER(read_k);
+ void h2hbaskb(machine_config &config);
void h2hhockey(machine_config &config);
protected:
virtual void machine_start() override;
};
+void h2hbaskb_state::machine_start()
+{
+ hh_tms1k_state::machine_start();
+
+ // zerofill/register for savestates
+ m_cap_state = false;
+ m_cap_charge = attotime::zero;
+
+ save_item(NAME(m_cap_state));
+ save_item(NAME(m_cap_charge));
+}
+
// handlers
-TIMER_DEVICE_CALLBACK_MEMBER(h2hhockey_state::cap_empty_callback)
+TIMER_DEVICE_CALLBACK_MEMBER(h2hbaskb_state::cap_empty_callback)
{
if (~m_r & 0x200)
- m_cap = false;
+ m_cap_state = false;
}
-void h2hhockey_state::prepare_display()
+void h2hbaskb_state::prepare_display()
{
// R6,R7 are commons for R0-R5
u16 sel = 0;
@@ -1525,7 +1601,7 @@ void h2hhockey_state::prepare_display()
display_matrix(7, 6+6, m_o, sel);
}
-WRITE16_MEMBER(h2hhockey_state::write_r)
+WRITE16_MEMBER(h2hbaskb_state::write_r)
{
// R0-R3: input mux
m_inp_mux = (data & 0xf);
@@ -1534,32 +1610,46 @@ WRITE16_MEMBER(h2hhockey_state::write_r)
m_speaker->level_w(data >> 8 & 1);
// R9: K8 and 15uF cap to V- (used as timer)
- if (data & 0x200)
- m_cap = true;
- else if (m_r & 0x200) // falling edge
- m_cap_empty_timer->adjust(attotime::from_msec(28)); // not accurate
+ // rising edge, remember the time
+ if (data & ~m_r & 0x200)
+ {
+ m_cap_state = true;
+ m_cap_charge = machine().time();
+ }
+ // falling edge, determine how long K8 should stay up
+ if (~data & m_r & 0x200)
+ {
+ const attotime full = attotime::from_usec(1300); // approx. charge time
+ const int factor = 27; // approx. factor for charge/discharge to logic 0
+
+ attotime charge = machine().time() - m_cap_charge;
+ if (charge > full)
+ charge = full;
+
+ m_cap_empty_timer->adjust(charge * factor);
+ }
// R0-R7: led select
m_r = data;
prepare_display();
}
-WRITE16_MEMBER(h2hhockey_state::write_o)
+WRITE16_MEMBER(h2hbaskb_state::write_o)
{
// O1-O7: led data
m_o = data >> 1 & 0x7f;
prepare_display();
}
-READ8_MEMBER(h2hhockey_state::read_k)
+READ8_MEMBER(h2hbaskb_state::read_k)
{
// K1-K4: multiplexed inputs, K8: R9 and capacitor
- return (read_inputs(4) & 7) | (m_cap ? 8 : 0);
+ return (read_inputs(4) & 7) | (m_cap_state ? 8 : 0);
}
// config
-static INPUT_PORTS_START( h2hhockey )
+static INPUT_PORTS_START( h2hbaskb )
PORT_START("IN.0") // R0
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_16WAY PORT_NAME("P1 Pass CW") // clockwise
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_16WAY PORT_NAME("P1 Pass CCW") // counter-clockwise
@@ -1580,32 +1670,31 @@ static INPUT_PORTS_START( h2hhockey )
PORT_CONFSETTING( 0x04, "2" )
PORT_START("IN.3") // R3
- PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_COCKTAIL PORT_NAME("P2 Goalie Right")
- PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_COCKTAIL PORT_NAME("P2 Goalie Left")
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED )
+ PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNUSED )
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED )
INPUT_PORTS_END
-void h2hhockey_state::machine_start()
-{
- hh_tms1k_state::machine_start();
+static INPUT_PORTS_START( h2hhockey )
+ PORT_INCLUDE( h2hbaskb )
- // zerofill/register for savestates
- m_cap = false;
- save_item(NAME(m_cap));
-}
+ PORT_MODIFY("IN.3") // R3
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_COCKTAIL PORT_NAME("P2 Goalie Right")
+ PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_COCKTAIL PORT_NAME("P2 Goalie Left")
+INPUT_PORTS_END
-void h2hhockey_state::h2hhockey(machine_config &config)
+void h2hbaskb_state::h2hbaskb(machine_config &config)
{
/* basic machine hardware */
TMS1000(config, m_maincpu, 375000); // approximation - RC osc. R=43K, C=100pF
- m_maincpu->k().set(FUNC(h2hhockey_state::read_k));
- m_maincpu->r().set(FUNC(h2hhockey_state::write_r));
- m_maincpu->o().set(FUNC(h2hhockey_state::write_o));
+ m_maincpu->k().set(FUNC(h2hbaskb_state::read_k));
+ m_maincpu->r().set(FUNC(h2hbaskb_state::write_r));
+ m_maincpu->o().set(FUNC(h2hbaskb_state::write_o));
- TIMER(config, "cap_empty").configure_generic(FUNC(h2hhockey_state::cap_empty_callback));
+ TIMER(config, "cap_empty").configure_generic(FUNC(h2hbaskb_state::cap_empty_callback));
TIMER(config, "display_decay").configure_periodic(FUNC(hh_tms1k_state::display_decay_tick), attotime::from_msec(1));
- config.set_default_layout(layout_h2hhockey);
+ config.set_default_layout(layout_h2hbaskb);
/* sound hardware */
SPEAKER(config, "mono").front_center();
@@ -1613,6 +1702,34 @@ void h2hhockey_state::h2hhockey(machine_config &config)
m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25);
}
+void h2hbaskb_state::h2hhockey(machine_config &config)
+{
+ h2hbaskb(config);
+ config.set_default_layout(layout_h2hhockey);
+}
+
+// roms
+
+ROM_START( h2hbaskb )
+ ROM_REGION( 0x0400, "maincpu", 0 )
+ ROM_LOAD( "mp3320a", 0x0000, 0x0400, CRC(39a63f43) SHA1(14a765e42a39f8d3a465c990e09dd651e595a1c5) )
+
+ ROM_REGION( 867, "maincpu:mpla", 0 )
+ ROM_LOAD( "tms1000_common1_micro.pla", 0, 867, CRC(4becec19) SHA1(3c8a9be0f00c88c81f378b76886c39b10304f330) )
+ ROM_REGION( 365, "maincpu:opla", 0 )
+ ROM_LOAD( "tms1000_h2hbaskb_output.pla", 0, 365, CRC(9d1a91e1) SHA1(96303eb22375129b0dfbfcd823c8ca5b919511bc) )
+ROM_END
+
+ROM_START( h2hhockey )
+ ROM_REGION( 0x0400, "maincpu", 0 )
+ ROM_LOAD( "mp3321a", 0x0000, 0x0400, CRC(e974e604) SHA1(ed740c98ce96ad70ee5237eccae1f54a75ad8100) )
+
+ ROM_REGION( 867, "maincpu:mpla", 0 )
+ ROM_LOAD( "tms1000_common1_micro.pla", 0, 867, CRC(4becec19) SHA1(3c8a9be0f00c88c81f378b76886c39b10304f330) )
+ ROM_REGION( 365, "maincpu:opla", 0 )
+ ROM_LOAD( "tms1000_h2hhockey_output.pla", 0, 365, CRC(9d1a91e1) SHA1(96303eb22375129b0dfbfcd823c8ca5b919511bc) )
+ROM_END
+
@@ -1633,8 +1750,8 @@ void h2hhockey_state::h2hhockey(machine_config &config)
class h2hbaseb_state : public hh_tms1k_state
{
public:
- h2hbaseb_state(const machine_config &mconfig, device_type type, const char *tag)
- : hh_tms1k_state(mconfig, type, tag)
+ h2hbaseb_state(const machine_config &mconfig, device_type type, const char *tag) :
+ hh_tms1k_state(mconfig, type, tag)
{ }
void prepare_display();
@@ -1643,15 +1760,28 @@ public:
DECLARE_READ8_MEMBER(read_k);
void set_clock();
- DECLARE_INPUT_CHANGED_MEMBER(skill_switch);
+ DECLARE_INPUT_CHANGED_MEMBER(skill_switch) { set_clock(); }
void h2hbaseb(machine_config &config);
protected:
virtual void machine_reset() override;
};
+void h2hbaseb_state::machine_reset()
+{
+ hh_tms1k_state::machine_reset();
+ set_clock();
+}
+
// handlers
+void h2hbaseb_state::set_clock()
+{
+ // MCU clock is from an RC circuit with C=47pF, and R value is depending on
+ // skill switch: R=51K(1) or 43K(2)
+ m_maincpu->set_unscaled_clock((m_inp_matrix[5]->read() & 1) ? 400000 : 350000);
+}
+
void h2hbaseb_state::prepare_display()
{
set_display_segmask(0x1ff, 0x7f);
@@ -1717,24 +1847,6 @@ static INPUT_PORTS_START( h2hbaseb )
PORT_CONFSETTING( 0x01, "2" )
INPUT_PORTS_END
-INPUT_CHANGED_MEMBER(h2hbaseb_state::skill_switch)
-{
- set_clock();
-}
-
-void h2hbaseb_state::set_clock()
-{
- // MCU clock is from an RC circuit with C=47pF, and R value is depending on
- // skill switch: R=51K(1) or 43K(2)
- m_maincpu->set_unscaled_clock((m_inp_matrix[5]->read() & 1) ? 400000 : 350000);
-}
-
-void h2hbaseb_state::machine_reset()
-{
- hh_tms1k_state::machine_reset();
- set_clock();
-}
-
void h2hbaseb_state::h2hbaseb(machine_config &config)
{
/* basic machine hardware */
@@ -1752,6 +1864,18 @@ void h2hbaseb_state::h2hbaseb(machine_config &config)
m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25);
}
+// roms
+
+ROM_START( h2hbaseb )
+ ROM_REGION( 0x0800, "maincpu", 0 )
+ ROM_LOAD( "mp1525", 0x0000, 0x0800, CRC(b5d6bf9b) SHA1(2cc9f35f077c1209c46d16ec853af87e4725c2fd) )
+
+ ROM_REGION( 867, "maincpu:mpla", 0 )
+ ROM_LOAD( "tms1100_common1_micro.pla", 0, 867, CRC(62445fc9) SHA1(d6297f2a4bc7a870b76cc498d19dbb0ce7d69fec) )
+ ROM_REGION( 365, "maincpu:opla", 0 )
+ ROM_LOAD( "tms1100_h2hbaseb_output.pla", 0, 365, CRC(cb3d7e38) SHA1(6ab4a7c52e6010b7c7158463cb499973e52ff556) )
+ROM_END
+
@@ -1769,8 +1893,8 @@ void h2hbaseb_state::h2hbaseb(machine_config &config)
class h2hboxing_state : public hh_tms1k_state
{
public:
- h2hboxing_state(const machine_config &mconfig, device_type type, const char *tag)
- : hh_tms1k_state(mconfig, type, tag)
+ h2hboxing_state(const machine_config &mconfig, device_type type, const char *tag) :
+ hh_tms1k_state(mconfig, type, tag)
{ }
void prepare_display();
@@ -1864,6 +1988,18 @@ void h2hboxing_state::h2hboxing(machine_config &config)
m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25);
}
+// roms
+
+ROM_START( h2hboxing )
+ ROM_REGION( 0x0800, "maincpu", 0 )
+ ROM_LOAD( "m34018", 0x0000, 0x0800, CRC(e26a11a3) SHA1(aa2735088d709fa8d9188c4fb7982a53e3a8c1bc) )
+
+ ROM_REGION( 867, "maincpu:mpla", 0 )
+ ROM_LOAD( "tms1100_common1_micro.pla", 0, 867, CRC(62445fc9) SHA1(d6297f2a4bc7a870b76cc498d19dbb0ce7d69fec) )
+ ROM_REGION( 365, "maincpu:opla", 0 )
+ ROM_LOAD( "tms1100_h2hboxing_output.pla", 0, 365, CRC(ffb0e63d) SHA1(31ee3f779270a23f05f9ad508283d2569ef069f1) )
+ROM_END
+
@@ -1896,8 +2032,8 @@ void h2hboxing_state::h2hboxing(machine_config &config)
class quizwizc_state : public hh_tms1k_state
{
public:
- quizwizc_state(const machine_config &mconfig, device_type type, const char *tag)
- : hh_tms1k_state(mconfig, type, tag),
+ quizwizc_state(const machine_config &mconfig, device_type type, const char *tag) :
+ hh_tms1k_state(mconfig, type, tag),
m_pinout(0)
{ }
@@ -1914,6 +2050,14 @@ protected:
virtual void machine_start() override;
};
+void quizwizc_state::machine_start()
+{
+ hh_tms1k_state::machine_start();
+
+ // register for savestates
+ save_item(NAME(m_pinout));
+}
+
// handlers
DEVICE_IMAGE_LOAD_MEMBER(quizwizc_state, cartridge)
@@ -2010,14 +2154,6 @@ static INPUT_PORTS_START( quizwizc )
PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED )
INPUT_PORTS_END
-void quizwizc_state::machine_start()
-{
- hh_tms1k_state::machine_start();
-
- // register for savestates
- save_item(NAME(m_pinout));
-}
-
void quizwizc_state::quizwizc(machine_config &config)
{
/* basic machine hardware */
@@ -2041,6 +2177,18 @@ void quizwizc_state::quizwizc(machine_config &config)
SOFTWARE_LIST(config, "cart_list").set_original("quizwiz");
}
+// roms
+
+ROM_START( quizwizc )
+ ROM_REGION( 0x0400, "maincpu", 0 )
+ ROM_LOAD( "m32001", 0x0000, 0x0400, CRC(053657eb) SHA1(38c84f7416f79aa679f434a3d35df54cd9aa528a) )
+
+ ROM_REGION( 867, "maincpu:mpla", 0 )
+ ROM_LOAD( "tms1000_common3_micro.pla", 0, 867, CRC(80912d0a) SHA1(7ae5293ed4d93f5b7a64d43fe30c3639f39fbe5a) )
+ ROM_REGION( 365, "maincpu:opla", 0 )
+ ROM_LOAD( "tms1000_quizwizc_output.pla", 0, 365, CRC(475b7053) SHA1(8f61bf736eb41d7029a6b165cc0a184ba0a70a2a) )
+ROM_END
+
@@ -2073,8 +2221,8 @@ void quizwizc_state::quizwizc(machine_config &config)
class tc4_state : public hh_tms1k_state
{
public:
- tc4_state(const machine_config &mconfig, device_type type, const char *tag)
- : hh_tms1k_state(mconfig, type, tag),
+ tc4_state(const machine_config &mconfig, device_type type, const char *tag) :
+ hh_tms1k_state(mconfig, type, tag),
m_pinout(0)
{ }
@@ -2091,6 +2239,14 @@ protected:
virtual void machine_start() override;
};
+void tc4_state::machine_start()
+{
+ hh_tms1k_state::machine_start();
+
+ // register for savestates
+ save_item(NAME(m_pinout));
+}
+
// handlers
DEVICE_IMAGE_LOAD_MEMBER(tc4_state, cartridge)
@@ -2186,14 +2342,6 @@ static INPUT_PORTS_START( tc4 )
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_PLAYER(2) PORT_NAME("P2 D/K Button")
INPUT_PORTS_END
-void tc4_state::machine_start()
-{
- hh_tms1k_state::machine_start();
-
- // register for savestates
- save_item(NAME(m_pinout));
-}
-
void tc4_state::tc4(machine_config &config)
{
/* basic machine hardware */
@@ -2218,6 +2366,18 @@ void tc4_state::tc4(machine_config &config)
SOFTWARE_LIST(config, "cart_list").set_original("tc4");
}
+// roms
+
+ROM_START( tc4 )
+ ROM_REGION( 0x1000, "maincpu", 0 )
+ ROM_LOAD( "mp7334", 0x0000, 0x1000, CRC(923f3821) SHA1(a9ae342d7ff8dae1dedcd1e4984bcfae68586581) )
+
+ ROM_REGION( 867, "maincpu:mpla", 0 )
+ ROM_LOAD( "tms1100_common1_micro.pla", 0, 867, CRC(62445fc9) SHA1(d6297f2a4bc7a870b76cc498d19dbb0ce7d69fec) )
+ ROM_REGION( 557, "maincpu:opla", 0 )
+ ROM_LOAD( "tms1400_tc4_output.pla", 0, 557, CRC(3b908725) SHA1(f83bf5faa5b3cb51f87adc1639b00d6f9a71ad19) )
+ROM_END
+
@@ -2241,8 +2401,8 @@ void tc4_state::tc4(machine_config &config)
class cnbaskb_state : public hh_tms1k_state
{
public:
- cnbaskb_state(const machine_config &mconfig, device_type type, const char *tag)
- : hh_tms1k_state(mconfig, type, tag)
+ cnbaskb_state(const machine_config &mconfig, device_type type, const char *tag) :
+ hh_tms1k_state(mconfig, type, tag)
{ }
void prepare_display();
@@ -2327,6 +2487,18 @@ void cnbaskb_state::cnbaskb(machine_config &config)
m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25);
}
+// roms
+
+ROM_START( cnbaskb )
+ ROM_REGION( 0x0400, "maincpu", 0 )
+ ROM_LOAD( "mp0907", 0x0000, 0x0400, CRC(35f84f0f) SHA1(744ca60bb853a2785184042e747530a9e02488f8) )
+
+ ROM_REGION( 867, "maincpu:mpla", 0 )
+ ROM_LOAD( "tms1000_common2_micro.pla", 0, 867, CRC(d33da3cf) SHA1(13c4ebbca227818db75e6db0d45b66ba5e207776) )
+ ROM_REGION( 365, "maincpu:opla", 0 )
+ ROM_LOAD( "tms1000_cnbaskb_output.pla", 0, 365, CRC(b4e28956) SHA1(8356112da71b351420a88d7e394e7d03e429368c) )
+ROM_END
+
@@ -2352,8 +2524,8 @@ void cnbaskb_state::cnbaskb(machine_config &config)
class cmsport_state : public hh_tms1k_state
{
public:
- cmsport_state(const machine_config &mconfig, device_type type, const char *tag)
- : hh_tms1k_state(mconfig, type, tag)
+ cmsport_state(const machine_config &mconfig, device_type type, const char *tag) :
+ hh_tms1k_state(mconfig, type, tag)
{ }
void prepare_display();
@@ -2440,6 +2612,18 @@ void cmsport_state::cmsport(machine_config &config)
m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25);
}
+// roms
+
+ROM_START( cmsport )
+ ROM_REGION( 0x0400, "maincpu", 0 )
+ ROM_LOAD( "mp0168.u1", 0x0000, 0x0400, CRC(0712a268) SHA1(bd4e23e5c17b28c52e7e769e44773cc9c8839bed) )
+
+ ROM_REGION( 867, "maincpu:mpla", 0 )
+ ROM_LOAD( "tms1000_common2_micro.pla", 0, 867, CRC(d33da3cf) SHA1(13c4ebbca227818db75e6db0d45b66ba5e207776) )
+ ROM_REGION( 365, "maincpu:opla", 0 )
+ ROM_LOAD( "tms1000_cmsport_output.pla", 0, 365, CRC(7defa140) SHA1(477e3cb55e79938d6acaa911e410f6dcb974c218) )
+ROM_END
+
@@ -2467,8 +2651,8 @@ void cmsport_state::cmsport(machine_config &config)
class cnfball_state : public hh_tms1k_state
{
public:
- cnfball_state(const machine_config &mconfig, device_type type, const char *tag)
- : hh_tms1k_state(mconfig, type, tag)
+ cnfball_state(const machine_config &mconfig, device_type type, const char *tag) :
+ hh_tms1k_state(mconfig, type, tag)
{ }
void prepare_display();
@@ -2567,6 +2751,18 @@ void cnfball_state::cnfball(machine_config &config)
m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25);
}
+// roms
+
+ROM_START( cnfball )
+ ROM_REGION( 0x0400, "maincpu", 0 )
+ ROM_LOAD( "mp0170", 0x0000, 0x0400, CRC(50e8a44f) SHA1(fea6ae03c4ef329d825f8688e6854df15023d47e) )
+
+ ROM_REGION( 867, "maincpu:mpla", 0 )
+ ROM_LOAD( "tms1000_common2_micro.pla", 0, 867, CRC(d33da3cf) SHA1(13c4ebbca227818db75e6db0d45b66ba5e207776) )
+ ROM_REGION( 365, "maincpu:opla", 0 )
+ ROM_LOAD( "tms1000_cnfball_output.pla", 0, 365, CRC(0af52f64) SHA1(b4cf450e4d895eddb67448aa69e4f18a5a84e033) )
+ROM_END
+
@@ -2588,8 +2784,8 @@ void cnfball_state::cnfball(machine_config &config)
class cnfball2_state : public hh_tms1k_state
{
public:
- cnfball2_state(const machine_config &mconfig, device_type type, const char *tag)
- : hh_tms1k_state(mconfig, type, tag)
+ cnfball2_state(const machine_config &mconfig, device_type type, const char *tag) :
+ hh_tms1k_state(mconfig, type, tag)
{ }
void prepare_display();
@@ -2670,7 +2866,7 @@ static const u16 cnfball2_output_pla[0x20] =
// first half was dumped electronically
0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f, 0x40, 0x01, 0x08, 0x02, 0x04, 0x00,
- // rest is unknown
+ // rest is unused, game only outputs with status bit clear
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0
};
@@ -2693,6 +2889,18 @@ void cnfball2_state::cnfball2(machine_config &config)
m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25);
}
+// roms
+
+ROM_START( cnfball2 )
+ ROM_REGION( 0x0800, "maincpu", 0 )
+ ROM_LOAD( "mp1181", 0x0000, 0x0800, CRC(4553a840) SHA1(2e1132c9bc51641f77ba7f2430b5a3b2766b3a3d) )
+
+ ROM_REGION( 867, "maincpu:mpla", 0 )
+ ROM_LOAD( "tms1100_common2_micro.pla", 0, 867, BAD_DUMP CRC(7cc90264) SHA1(c6e1cf1ffb178061da9e31858514f7cd94e86990) ) // not verified
+ ROM_REGION( 365, "maincpu:opla", 0 )
+ ROM_LOAD( "tms1100_cnfball2_output.pla", 0, 365, NO_DUMP )
+ROM_END
+
@@ -2716,16 +2924,14 @@ void cnfball2_state::cnfball2(machine_config &config)
class eleciq_state : public hh_tms1k_state
{
public:
- eleciq_state(const machine_config &mconfig, device_type type, const char *tag)
- : hh_tms1k_state(mconfig, type, tag)
+ eleciq_state(const machine_config &mconfig, device_type type, const char *tag) :
+ hh_tms1k_state(mconfig, type, tag)
{ }
void prepare_display();
DECLARE_WRITE16_MEMBER(write_r);
DECLARE_WRITE16_MEMBER(write_o);
DECLARE_READ8_MEMBER(read_k);
-
- DECLARE_INPUT_CHANGED_MEMBER(reset_button);
void eleciq(machine_config &config);
};
@@ -2808,15 +3014,9 @@ static INPUT_PORTS_START( eleciq )
PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED )
PORT_START("RESET")
- PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_R) PORT_NAME("Reset") PORT_CHANGED_MEMBER(DEVICE_SELF, eleciq_state, reset_button, nullptr)
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_R) PORT_NAME("Reset") PORT_CHANGED_MEMBER(DEVICE_SELF, hh_tms1k_state, reset_button, nullptr)
INPUT_PORTS_END
-INPUT_CHANGED_MEMBER(eleciq_state::reset_button)
-{
- // reset button is directly wired to TMS1000 INIT pin
- m_maincpu->set_input_line(INPUT_LINE_RESET, newval ? ASSERT_LINE : CLEAR_LINE);
-}
-
void eleciq_state::eleciq(machine_config &config)
{
/* basic machine hardware */
@@ -2834,6 +3034,18 @@ void eleciq_state::eleciq(machine_config &config)
m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25);
}
+// roms
+
+ROM_START( eleciq )
+ ROM_REGION( 0x0400, "maincpu", 0 )
+ ROM_LOAD( "mp0908", 0x0000, 0x0400, CRC(db59b82c) SHA1(c9a6bcba208969560495ad9f8775f53de16a69c3) )
+
+ ROM_REGION( 867, "maincpu:mpla", 0 )
+ ROM_LOAD( "tms1000_common2_micro.pla", 0, 867, CRC(d33da3cf) SHA1(13c4ebbca227818db75e6db0d45b66ba5e207776) )
+ ROM_REGION( 365, "maincpu:opla", 0 )
+ ROM_LOAD( "tms1000_eleciq_output.pla", 0, 365, CRC(b8e04232) SHA1(22eed6d9b1fb1e5c9974ea3df16cda71a39aad57) )
+ROM_END
+
@@ -2853,8 +3065,8 @@ void eleciq_state::eleciq(machine_config &config)
class esoccer_state : public hh_tms1k_state
{
public:
- esoccer_state(const machine_config &mconfig, device_type type, const char *tag)
- : hh_tms1k_state(mconfig, type, tag)
+ esoccer_state(const machine_config &mconfig, device_type type, const char *tag) :
+ hh_tms1k_state(mconfig, type, tag)
{ }
void prepare_display();
@@ -2939,6 +3151,18 @@ void esoccer_state::esoccer(machine_config &config)
m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25);
}
+// roms
+
+ROM_START( esoccer )
+ ROM_REGION( 0x0400, "maincpu", 0 )
+ ROM_LOAD( "mp0158.ic1", 0x0000, 0x0400, CRC(ae4581ea) SHA1(5f6881f8247094abf8cffb17f6e6586e94cff38c) )
+
+ ROM_REGION( 867, "maincpu:mpla", 0 )
+ ROM_LOAD( "tms1000_common2_micro.pla", 0, 867, CRC(d33da3cf) SHA1(13c4ebbca227818db75e6db0d45b66ba5e207776) )
+ ROM_REGION( 365, "maincpu:opla", 0 )
+ ROM_LOAD( "tms1000_esoccer_output.pla", 0, 365, CRC(c6eeabbd) SHA1(99d07902126b5a1c1abf43340f30d3390da5fa92) )
+ROM_END
+
@@ -2977,8 +3201,8 @@ void esoccer_state::esoccer(machine_config &config)
class ebball_state : public hh_tms1k_state
{
public:
- ebball_state(const machine_config &mconfig, device_type type, const char *tag)
- : hh_tms1k_state(mconfig, type, tag)
+ ebball_state(const machine_config &mconfig, device_type type, const char *tag) :
+ hh_tms1k_state(mconfig, type, tag)
{ }
void prepare_display();
@@ -3073,6 +3297,18 @@ void ebball_state::ebball(machine_config &config)
m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25);
}
+// roms
+
+ROM_START( ebball )
+ ROM_REGION( 0x0400, "maincpu", 0 )
+ ROM_LOAD( "mp0914", 0x0000, 0x0400, CRC(3c6fb05b) SHA1(b2fe4b3ca72d6b4c9bfa84d67f64afdc215e7178) )
+
+ ROM_REGION( 867, "maincpu:mpla", 0 )
+ ROM_LOAD( "tms1000_common2_micro.pla", 0, 867, CRC(d33da3cf) SHA1(13c4ebbca227818db75e6db0d45b66ba5e207776) )
+ ROM_REGION( 365, "maincpu:opla", 0 )
+ ROM_LOAD( "tms1000_ebball_output.pla", 0, 365, CRC(062bf5bb) SHA1(8d73ee35444299595961225528b153e3a5fe66bf) )
+ROM_END
+
@@ -3107,8 +3343,8 @@ void ebball_state::ebball(machine_config &config)
class ebball2_state : public hh_tms1k_state
{
public:
- ebball2_state(const machine_config &mconfig, device_type type, const char *tag)
- : hh_tms1k_state(mconfig, type, tag)
+ ebball2_state(const machine_config &mconfig, device_type type, const char *tag) :
+ hh_tms1k_state(mconfig, type, tag)
{ }
void prepare_display();
@@ -3196,6 +3432,18 @@ void ebball2_state::ebball2(machine_config &config)
m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25);
}
+// roms
+
+ROM_START( ebball2 )
+ ROM_REGION( 0x0400, "maincpu", 0 )
+ ROM_LOAD( "mp0923", 0x0000, 0x0400, CRC(077acfe2) SHA1(a294ce7614b2cdb01c754a7a50d60d807e3f0939) )
+
+ ROM_REGION( 867, "maincpu:mpla", 0 )
+ ROM_LOAD( "tms1000_common2_micro.pla", 0, 867, CRC(d33da3cf) SHA1(13c4ebbca227818db75e6db0d45b66ba5e207776) )
+ ROM_REGION( 365, "maincpu:opla", 0 )
+ ROM_LOAD( "tms1000_ebball2_output.pla", 0, 365, CRC(adcd73d1) SHA1(d69e590d288ef99293d86716498f3971528e30de) )
+ROM_END
+
@@ -3235,8 +3483,8 @@ void ebball2_state::ebball2(machine_config &config)
class ebball3_state : public hh_tms1k_state
{
public:
- ebball3_state(const machine_config &mconfig, device_type type, const char *tag)
- : hh_tms1k_state(mconfig, type, tag)
+ ebball3_state(const machine_config &mconfig, device_type type, const char *tag) :
+ hh_tms1k_state(mconfig, type, tag)
{ }
void prepare_display();
@@ -3245,15 +3493,29 @@ public:
DECLARE_READ8_MEMBER(read_k);
void set_clock();
- DECLARE_INPUT_CHANGED_MEMBER(skill_switch);
+ DECLARE_INPUT_CHANGED_MEMBER(skill_switch) { set_clock(); }
void ebball3(machine_config &config);
protected:
virtual void machine_reset() override;
};
+void ebball3_state::machine_reset()
+{
+ hh_tms1k_state::machine_reset();
+ set_clock();
+}
+
// handlers
+void ebball3_state::set_clock()
+{
+ // MCU clock is from an RC circuit(R=47K, C=33pF) oscillating by default at ~340kHz,
+ // but on PRO, the difficulty switch adds an extra 150K resistor to Vdd to speed
+ // it up to around ~440kHz.
+ m_maincpu->set_unscaled_clock((m_inp_matrix[3]->read() & 1) ? 440000 : 340000);
+}
+
void ebball3_state::prepare_display()
{
// update current state
@@ -3340,25 +3602,6 @@ static INPUT_PORTS_START( ebball3 )
PORT_CONFSETTING( 0x01, "Professional" )
INPUT_PORTS_END
-INPUT_CHANGED_MEMBER(ebball3_state::skill_switch)
-{
- set_clock();
-}
-
-void ebball3_state::set_clock()
-{
- // MCU clock is from an RC circuit(R=47K, C=33pF) oscillating by default at ~340kHz,
- // but on PRO, the difficulty switch adds an extra 150K resistor to Vdd to speed
- // it up to around ~440kHz.
- m_maincpu->set_unscaled_clock((m_inp_matrix[3]->read() & 1) ? 440000 : 340000);
-}
-
-void ebball3_state::machine_reset()
-{
- hh_tms1k_state::machine_reset();
- set_clock();
-}
-
void ebball3_state::ebball3(machine_config &config)
{
/* basic machine hardware */
@@ -3376,6 +3619,18 @@ void ebball3_state::ebball3(machine_config &config)
m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25);
}
+// roms
+
+ROM_START( ebball3 )
+ ROM_REGION( 0x0800, "maincpu", 0 )
+ ROM_LOAD( "6007_mp1204", 0x0000, 0x0800, CRC(987a29ba) SHA1(9481ae244152187d85349d1a08e439e798182938) )
+
+ ROM_REGION( 867, "maincpu:mpla", 0 )
+ ROM_LOAD( "tms1100_common2_micro.pla", 0, 867, CRC(7cc90264) SHA1(c6e1cf1ffb178061da9e31858514f7cd94e86990) )
+ ROM_REGION( 365, "maincpu:opla", 0 )
+ ROM_LOAD( "tms1100_ebball3_output.pla", 0, 365, CRC(00db663b) SHA1(6eae12503364cfb1f863df0e57970d3e766ec165) )
+ROM_END
+
@@ -3406,8 +3661,8 @@ void ebball3_state::ebball3(machine_config &config)
class esbattle_state : public hh_tms1k_state
{
public:
- esbattle_state(const machine_config &mconfig, device_type type, const char *tag)
- : hh_tms1k_state(mconfig, type, tag)
+ esbattle_state(const machine_config &mconfig, device_type type, const char *tag) :
+ hh_tms1k_state(mconfig, type, tag)
{ }
void prepare_display();
@@ -3487,6 +3742,18 @@ void esbattle_state::esbattle(machine_config &config)
m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25);
}
+// roms
+
+ROM_START( esbattle )
+ ROM_REGION( 0x0400, "maincpu", 0 )
+ ROM_LOAD( "en-6004_mp0920", 0x0000, 0x0400, CRC(7460c179) SHA1(be855054b4a98b05b34fd931d5c247c5c0f9b036) )
+
+ ROM_REGION( 867, "maincpu:mpla", 0 )
+ ROM_LOAD( "tms1000_common2_micro.pla", 0, 867, CRC(d33da3cf) SHA1(13c4ebbca227818db75e6db0d45b66ba5e207776) )
+ ROM_REGION( 365, "maincpu:opla", 0 )
+ ROM_LOAD( "tms1000_esbattle_output.pla", 0, 365, CRC(861b45a2) SHA1(a5a9dc9bef8adb761845ad548058b55e970517d3) )
+ROM_END
+
@@ -3506,8 +3773,8 @@ void esbattle_state::esbattle(machine_config &config)
class einvader_state : public hh_tms1k_state
{
public:
- einvader_state(const machine_config &mconfig, device_type type, const char *tag)
- : hh_tms1k_state(mconfig, type, tag)
+ einvader_state(const machine_config &mconfig, device_type type, const char *tag) :
+ hh_tms1k_state(mconfig, type, tag)
{ }
void prepare_display();
@@ -3515,15 +3782,29 @@ public:
DECLARE_WRITE16_MEMBER(write_o);
void set_clock();
- DECLARE_INPUT_CHANGED_MEMBER(skill_switch);
+ DECLARE_INPUT_CHANGED_MEMBER(skill_switch) { set_clock(); }
void einvader(machine_config &config);
protected:
virtual void machine_reset() override;
};
+void einvader_state::machine_reset()
+{
+ hh_tms1k_state::machine_reset();
+ set_clock();
+}
+
// handlers
+void einvader_state::set_clock()
+{
+ // MCU clock is from an RC circuit(R=47K, C=56pF) oscillating by default at ~320kHz,
+ // but on PRO, the difficulty switch adds an extra 180K resistor to Vdd to speed
+ // it up to around ~400kHz.
+ m_maincpu->set_unscaled_clock((m_inp_matrix[0]->read() & 8) ? 400000 : 320000);
+}
+
void einvader_state::prepare_display()
{
// R7-R9 are 7segs
@@ -3560,25 +3841,6 @@ static INPUT_PORTS_START( einvader )
PORT_CONFSETTING( 0x08, "Professional" )
INPUT_PORTS_END
-INPUT_CHANGED_MEMBER(einvader_state::skill_switch)
-{
- set_clock();
-}
-
-void einvader_state::set_clock()
-{
- // MCU clock is from an RC circuit(R=47K, C=56pF) oscillating by default at ~320kHz,
- // but on PRO, the difficulty switch adds an extra 180K resistor to Vdd to speed
- // it up to around ~400kHz.
- m_maincpu->set_unscaled_clock((m_inp_matrix[0]->read() & 8) ? 400000 : 320000);
-}
-
-void einvader_state::machine_reset()
-{
- hh_tms1k_state::machine_reset();
- set_clock();
-}
-
void einvader_state::einvader(machine_config &config)
{
/* basic machine hardware */
@@ -3592,7 +3854,8 @@ void einvader_state::einvader(machine_config &config)
screen.set_svg_region("svg");
screen.set_refresh_hz(50);
screen.set_size(939, 1080);
- screen.set_visarea(0, 939-1, 0, 1080-1);
+ screen.set_visarea_full();
+
TIMER(config, "display_decay").configure_periodic(FUNC(hh_tms1k_state::display_decay_tick), attotime::from_msec(1));
config.set_default_layout(layout_einvader);
@@ -3602,6 +3865,21 @@ void einvader_state::einvader(machine_config &config)
m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25);
}
+// roms
+
+ROM_START( einvader )
+ ROM_REGION( 0x0800, "maincpu", 0 )
+ ROM_LOAD( "mp1211", 0x0000, 0x0800, CRC(b6efbe8e) SHA1(d7d54921dab22bb0c2956c896a5d5b56b6f64969) )
+
+ ROM_REGION( 867, "maincpu:mpla", 0 )
+ ROM_LOAD( "tms1100_common2_micro.pla", 0, 867, CRC(7cc90264) SHA1(c6e1cf1ffb178061da9e31858514f7cd94e86990) )
+ ROM_REGION( 365, "maincpu:opla", 0 )
+ ROM_LOAD( "tms1100_einvader_output.pla", 0, 365, CRC(490158e1) SHA1(61cace1eb09244663de98d8fb04d9459b19668fd) )
+
+ ROM_REGION( 44398, "svg", 0)
+ ROM_LOAD( "einvader.svg", 0, 44398, CRC(48de88fd) SHA1(56a2b9c997a447277b45902ab542eda54e7d5a2f) )
+ROM_END
+
@@ -3617,8 +3895,8 @@ void einvader_state::einvader(machine_config &config)
class efootb4_state : public hh_tms1k_state
{
public:
- efootb4_state(const machine_config &mconfig, device_type type, const char *tag)
- : hh_tms1k_state(mconfig, type, tag)
+ efootb4_state(const machine_config &mconfig, device_type type, const char *tag) :
+ hh_tms1k_state(mconfig, type, tag)
{ }
void prepare_display();
@@ -3717,6 +3995,18 @@ void efootb4_state::efootb4(machine_config &config)
m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25);
}
+// roms
+
+ROM_START( efootb4 )
+ ROM_REGION( 0x1000, "maincpu", 0 )
+ ROM_LOAD( "6009_mp7551", 0x0000, 0x1000, CRC(54fa7244) SHA1(4d16bd825c4a2db76ca8a263c373ade15c20e270) )
+
+ ROM_REGION( 867, "maincpu:mpla", 0 )
+ ROM_LOAD( "tms1100_common2_micro.pla", 0, 867, CRC(7cc90264) SHA1(c6e1cf1ffb178061da9e31858514f7cd94e86990) )
+ ROM_REGION( 557, "maincpu:opla", 0 )
+ ROM_LOAD( "tms1400_efootb4_output.pla", 0, 557, CRC(5c87c753) SHA1(bde9d4aa1e57a718affd969475c0a1edcf60f444) )
+ROM_END
+
@@ -3744,8 +4034,8 @@ void efootb4_state::efootb4(machine_config &config)
class ebaskb2_state : public hh_tms1k_state
{
public:
- ebaskb2_state(const machine_config &mconfig, device_type type, const char *tag)
- : hh_tms1k_state(mconfig, type, tag)
+ ebaskb2_state(const machine_config &mconfig, device_type type, const char *tag) :
+ hh_tms1k_state(mconfig, type, tag)
{ }
void prepare_display();
@@ -3838,6 +4128,18 @@ void ebaskb2_state::ebaskb2(machine_config &config)
m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25);
}
+// roms
+
+ROM_START( ebaskb2 )
+ ROM_REGION( 0x0800, "maincpu", 0 )
+ ROM_LOAD( "6010_mp1218", 0x0000, 0x0800, CRC(0089ede8) SHA1(c8a79d5aca7e37b637a4d152150acba9f41aad96) )
+
+ ROM_REGION( 867, "maincpu:mpla", 0 )
+ ROM_LOAD( "tms1100_common2_micro.pla", 0, 867, CRC(7cc90264) SHA1(c6e1cf1ffb178061da9e31858514f7cd94e86990) )
+ ROM_REGION( 365, "maincpu:opla", 0 )
+ ROM_LOAD( "tms1100_ebaskb2_output.pla", 0, 365, CRC(c18103ae) SHA1(5a9bb8e1d95a9f6919b05ff9471fa0a8014b8b81) )
+ROM_END
+
@@ -3868,8 +4170,8 @@ void ebaskb2_state::ebaskb2(machine_config &config)
class raisedvl_state : public hh_tms1k_state
{
public:
- raisedvl_state(const machine_config &mconfig, device_type type, const char *tag)
- : hh_tms1k_state(mconfig, type, tag)
+ raisedvl_state(const machine_config &mconfig, device_type type, const char *tag) :
+ hh_tms1k_state(mconfig, type, tag)
{ }
void prepare_display();
@@ -3878,15 +4180,32 @@ public:
DECLARE_READ8_MEMBER(read_k);
void set_clock();
- DECLARE_INPUT_CHANGED_MEMBER(skill_switch);
+ DECLARE_INPUT_CHANGED_MEMBER(skill_switch) { set_clock(); }
void raisedvl(machine_config &config);
protected:
virtual void machine_reset() override;
};
+void raisedvl_state::machine_reset()
+{
+ hh_tms1k_state::machine_reset();
+ set_clock();
+}
+
// handlers
+void raisedvl_state::set_clock()
+{
+ // MCU clock is from an RC circuit with C=47pF, R=47K by default. Skills
+ // 2 and 3 add a 150K resistor in parallel, and skill 4 adds a 100K one.
+ // 0: R=47K -> ~350kHz
+ // 2,3: R=35K8 -> ~425kHz (combined)
+ // 4: R=32K -> ~465kHz (combined)
+ u8 inp = m_inp_matrix[1]->read();
+ m_maincpu->set_unscaled_clock((inp & 0x20) ? 465000 : ((inp & 0x10) ? 425000 : 350000));
+}
+
void raisedvl_state::prepare_display()
{
// R0-R2 are 7segs
@@ -3938,28 +4257,6 @@ static INPUT_PORTS_START( raisedvl )
PORT_CONFSETTING( 0x21, "4" )
INPUT_PORTS_END
-INPUT_CHANGED_MEMBER(raisedvl_state::skill_switch)
-{
- set_clock();
-}
-
-void raisedvl_state::set_clock()
-{
- // MCU clock is from an RC circuit with C=47pF, R=47K by default. Skills
- // 2 and 3 add a 150K resistor in parallel, and skill 4 adds a 100K one.
- // 0: R=47K -> ~350kHz
- // 2,3: R=35K8 -> ~425kHz (combined)
- // 4: R=32K -> ~465kHz (combined)
- u8 inp = m_inp_matrix[1]->read();
- m_maincpu->set_unscaled_clock((inp & 0x20) ? 465000 : ((inp & 0x10) ? 425000 : 350000));
-}
-
-void raisedvl_state::machine_reset()
-{
- hh_tms1k_state::machine_reset();
- set_clock();
-}
-
void raisedvl_state::raisedvl(machine_config &config)
{
/* basic machine hardware */
@@ -3977,6 +4274,18 @@ void raisedvl_state::raisedvl(machine_config &config)
m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25);
}
+// roms
+
+ROM_START( raisedvl )
+ ROM_REGION( 0x0800, "maincpu", 0 )
+ ROM_LOAD( "mp1221", 0x0000, 0x0800, CRC(782791cc) SHA1(214249406fcaf44efc6350022bd534e59ec69c88) )
+
+ ROM_REGION( 867, "maincpu:mpla", 0 )
+ ROM_LOAD( "tms1100_common2_micro.pla", 0, 867, CRC(7cc90264) SHA1(c6e1cf1ffb178061da9e31858514f7cd94e86990) )
+ ROM_REGION( 365, "maincpu:opla", 0 )
+ ROM_LOAD( "tms1100_raisedvl_output.pla", 0, 365, CRC(00db663b) SHA1(6eae12503364cfb1f863df0e57970d3e766ec165) )
+ROM_END
+
@@ -4010,16 +4319,14 @@ void raisedvl_state::raisedvl(machine_config &config)
class f2pbball_state : public hh_tms1k_state
{
public:
- f2pbball_state(const machine_config &mconfig, device_type type, const char *tag)
- : hh_tms1k_state(mconfig, type, tag)
+ f2pbball_state(const machine_config &mconfig, device_type type, const char *tag) :
+ hh_tms1k_state(mconfig, type, tag)
{ }
void prepare_display();
DECLARE_WRITE16_MEMBER(write_r);
DECLARE_WRITE16_MEMBER(write_o);
DECLARE_READ8_MEMBER(read_k);
-
- DECLARE_INPUT_CHANGED_MEMBER(reset_button);
void f2pbball(machine_config &config);
};
@@ -4082,15 +4389,9 @@ static INPUT_PORTS_START( f2pbball )
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_COCKTAIL PORT_NAME("P2 Fast")
PORT_START("RESET")
- PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON5 ) PORT_NAME("P1 Reset") PORT_CHANGED_MEMBER(DEVICE_SELF, f2pbball_state, reset_button, nullptr)
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON5 ) PORT_NAME("P1 Reset") PORT_CHANGED_MEMBER(DEVICE_SELF, hh_tms1k_state, reset_button, nullptr)
INPUT_PORTS_END
-INPUT_CHANGED_MEMBER(f2pbball_state::reset_button)
-{
- // reset button is directly wired to TMS1000 INIT pin
- m_maincpu->set_input_line(INPUT_LINE_RESET, newval ? ASSERT_LINE : CLEAR_LINE);
-}
-
void f2pbball_state::f2pbball(machine_config &config)
{
/* basic machine hardware */
@@ -4108,6 +4409,18 @@ void f2pbball_state::f2pbball(machine_config &config)
m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25);
}
+// roms
+
+ROM_START( f2pbball )
+ ROM_REGION( 0x0400, "maincpu", 0 )
+ ROM_LOAD( "mp0154", 0x0000, 0x0400, CRC(c5b45ace) SHA1(b2de32e83ab447b22d6828f0081843f364040b01) )
+
+ ROM_REGION( 867, "maincpu:mpla", 0 )
+ ROM_LOAD( "tms1000_common2_micro.pla", 0, 867, CRC(d33da3cf) SHA1(13c4ebbca227818db75e6db0d45b66ba5e207776) )
+ ROM_REGION( 365, "maincpu:opla", 0 )
+ ROM_LOAD( "tms1000_f2pbball_output.pla", 0, 365, CRC(30c2f28f) SHA1(db969b22475f37f083c3594f5e4f5759048377b8) )
+ROM_END
+
@@ -4127,8 +4440,8 @@ void f2pbball_state::f2pbball(machine_config &config)
class f3in1_state : public hh_tms1k_state
{
public:
- f3in1_state(const machine_config &mconfig, device_type type, const char *tag)
- : hh_tms1k_state(mconfig, type, tag)
+ f3in1_state(const machine_config &mconfig, device_type type, const char *tag) :
+ hh_tms1k_state(mconfig, type, tag)
{ }
void prepare_display();
@@ -4137,15 +4450,27 @@ public:
DECLARE_READ8_MEMBER(read_k);
void set_clock();
- DECLARE_INPUT_CHANGED_MEMBER(skill_switch);
+ DECLARE_INPUT_CHANGED_MEMBER(skill_switch) { set_clock(); }
void f3in1(machine_config &config);
protected:
virtual void machine_reset() override;
};
+void f3in1_state::machine_reset()
+{
+ hh_tms1k_state::machine_reset();
+ set_clock();
+}
+
// handlers
+void f3in1_state::set_clock()
+{
+ // MCU clock is from an RC circuit where C=47pF, R=39K(PROF) or 56K(REG)
+ m_maincpu->set_unscaled_clock((m_inp_matrix[4]->read() & 1) ? 400000 : 300000);
+}
+
void f3in1_state::prepare_display()
{
// R6-R9 are 7segs
@@ -4211,23 +4536,6 @@ static INPUT_PORTS_START( f3in1 )
PORT_CONFSETTING( 0x01, "Professional" ) // PROF
INPUT_PORTS_END
-INPUT_CHANGED_MEMBER(f3in1_state::skill_switch)
-{
- set_clock();
-}
-
-void f3in1_state::set_clock()
-{
- // MCU clock is from an RC circuit where C=47pF, R=39K(PROF) or 56K(REG)
- m_maincpu->set_unscaled_clock((m_inp_matrix[4]->read() & 1) ? 400000 : 300000);
-}
-
-void f3in1_state::machine_reset()
-{
- hh_tms1k_state::machine_reset();
- set_clock();
-}
-
void f3in1_state::f3in1(machine_config &config)
{
/* basic machine hardware */
@@ -4245,6 +4553,18 @@ void f3in1_state::f3in1(machine_config &config)
m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25);
}
+// roms
+
+ROM_START( f3in1 )
+ ROM_REGION( 0x0800, "maincpu", 0 )
+ ROM_LOAD( "mp1185", 0x0000, 0x0800, CRC(53f7b28d) SHA1(2249890e3a259095193b4331ca88c29ccd81eefe) )
+
+ ROM_REGION( 867, "maincpu:mpla", 0 )
+ ROM_LOAD( "tms1100_common2_micro.pla", 0, 867, CRC(7cc90264) SHA1(c6e1cf1ffb178061da9e31858514f7cd94e86990) )
+ ROM_REGION( 365, "maincpu:opla", 0 )
+ ROM_LOAD( "tms1100_f3in1_output.pla", 0, 365, CRC(51d947bc) SHA1(f766397d84f038be96e83d40989195c98ddcb1d9) )
+ROM_END
+
@@ -4265,8 +4585,8 @@ void f3in1_state::f3in1(machine_config &config)
class gpoker_state : public hh_tms1k_state
{
public:
- gpoker_state(const machine_config &mconfig, device_type type, const char *tag)
- : hh_tms1k_state(mconfig, type, tag),
+ gpoker_state(const machine_config &mconfig, device_type type, const char *tag) :
+ hh_tms1k_state(mconfig, type, tag),
m_beeper(*this, "beeper")
{ }
@@ -4282,6 +4602,12 @@ protected:
virtual void machine_reset() override;
};
+void gpoker_state::machine_reset()
+{
+ hh_tms1k_state::machine_reset();
+ m_beeper->set_state(0);
+}
+
// handlers
void gpoker_state::prepare_display()
@@ -4347,7 +4673,7 @@ static INPUT_PORTS_START( gpoker )
PORT_START("IN.3") // R3
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("3")
- PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) PORT_CODE(KEYCODE_D) PORT_NAME("9/Deal") // DL, shares pad with 9
+ PORT_BIT( 0x02, 0x02, IPT_CUSTOM ) PORT_CONDITION("FAKE", 0x03, NOTEQUALS, 0x00) // 9/DL
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED )
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_BACKSPACE) PORT_NAME("Clear Entry") // CE
@@ -4365,13 +4691,11 @@ static INPUT_PORTS_START( gpoker )
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_T) PORT_NAME("Total") // T
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED )
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_B) PORT_NAME("Bet") // BT
-INPUT_PORTS_END
-void gpoker_state::machine_reset()
-{
- hh_tms1k_state::machine_reset();
- m_beeper->set_state(0);
-}
+ PORT_START("FAKE") // 9/DL are electronically the same button
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) PORT_NAME("9")
+ PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_D) PORT_NAME("Deal") // DL
+INPUT_PORTS_END
void gpoker_state::gpoker(machine_config &config)
{
@@ -4390,6 +4714,18 @@ void gpoker_state::gpoker(machine_config &config)
m_beeper->add_route(ALL_OUTPUTS, "mono", 0.25);
}
+// roms
+
+ROM_START( gpoker )
+ ROM_REGION( 0x0800, "maincpu", 0 )
+ ROM_LOAD( "mp2105", 0x0000, 0x0800, CRC(95a8f5b4) SHA1(d14f00ba9f57e437264d972baa14a14a28ff8719) )
+
+ ROM_REGION( 867, "maincpu:mpla", 0 )
+ ROM_LOAD( "tms1100_common2_micro.pla", 0, 867, CRC(7cc90264) SHA1(c6e1cf1ffb178061da9e31858514f7cd94e86990) )
+ ROM_REGION( 365, "maincpu:opla", 0 )
+ ROM_LOAD( "tms1100_gpoker_output.pla", 0, 365, CRC(f7e2d812) SHA1(cc3abd89afb1d2145dc47636553ccd0ba7de70d9) )
+ROM_END
+
@@ -4410,8 +4746,8 @@ void gpoker_state::gpoker(machine_config &config)
class gjackpot_state : public gpoker_state
{
public:
- gjackpot_state(const machine_config &mconfig, device_type type, const char *tag)
- : gpoker_state(mconfig, type, tag)
+ gjackpot_state(const machine_config &mconfig, device_type type, const char *tag) :
+ gpoker_state(mconfig, type, tag)
{ }
virtual DECLARE_WRITE16_MEMBER(write_r) override;
@@ -4440,7 +4776,7 @@ WRITE16_MEMBER(gjackpot_state::write_r)
DB] SP]
[1] [2] [3] [DS] [DR]
BT] HT]
- [10/1] [T] [MD [CH [AC]
+ [10/0] [T] [MD [CH [AC]
GO] ST]
*/
@@ -4503,6 +4839,18 @@ void gjackpot_state::gjackpot(machine_config &config)
m_beeper->add_route(ALL_OUTPUTS, "mono", 0.25);
}
+// roms
+
+ROM_START( gjackpot )
+ ROM_REGION( 0x1000, "maincpu", 0 )
+ ROM_LOAD( "mpf553", 0x0000, 0x1000, CRC(f45fd008) SHA1(8d5d6407a8a031a833ceedfb931f5c9d2725ecd0) )
+
+ ROM_REGION( 867, "maincpu:mpla", 0 )
+ ROM_LOAD( "tms1100_common2_micro.pla", 0, 867, CRC(7cc90264) SHA1(c6e1cf1ffb178061da9e31858514f7cd94e86990) )
+ ROM_REGION( 557, "maincpu:opla", 0 )
+ ROM_LOAD( "tms1400_gjackpot_output.pla", 0, 557, CRC(50e471a7) SHA1(9d862cb9f51a563882b62662c5bfe61b52e3df00) )
+ROM_END
+
@@ -4524,8 +4872,8 @@ void gjackpot_state::gjackpot(machine_config &config)
class ginv1000_state : public hh_tms1k_state
{
public:
- ginv1000_state(const machine_config &mconfig, device_type type, const char *tag)
- : hh_tms1k_state(mconfig, type, tag)
+ ginv1000_state(const machine_config &mconfig, device_type type, const char *tag) :
+ hh_tms1k_state(mconfig, type, tag)
{ }
void prepare_display();
@@ -4604,7 +4952,8 @@ void ginv1000_state::ginv1000(machine_config &config)
screen.set_svg_region("svg");
screen.set_refresh_hz(50);
screen.set_size(226, 1080);
- screen.set_visarea(0, 226-1, 0, 1080-1);
+ screen.set_visarea_full();
+
TIMER(config, "display_decay").configure_periodic(FUNC(hh_tms1k_state::display_decay_tick), attotime::from_msec(1));
/* sound hardware */
@@ -4613,6 +4962,21 @@ void ginv1000_state::ginv1000(machine_config &config)
m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25);
}
+// roms
+
+ROM_START( ginv1000 )
+ ROM_REGION( 0x0800, "maincpu", 0 )
+ ROM_LOAD( "mp2139", 0x0000, 0x0800, CRC(036eab37) SHA1(0795878ad89296f7a6a0314c6e4db23c1cc3673e) )
+
+ ROM_REGION( 867, "maincpu:mpla", 0 )
+ ROM_LOAD( "tms1100_common2_micro.pla", 0, 867, CRC(7cc90264) SHA1(c6e1cf1ffb178061da9e31858514f7cd94e86990) )
+ ROM_REGION( 365, "maincpu:opla", 0 )
+ ROM_LOAD( "tms1100_ginv1000_output.pla", 0, 365, CRC(b0a5dc41) SHA1(d94746ec48661998173e7f60ccc7c96e56b3484e) )
+
+ ROM_REGION( 226185, "svg", 0)
+ ROM_LOAD( "ginv1000.svg", 0, 226185, CRC(1e1bafd1) SHA1(15868ef0c9dadbf537fed0e2d846451ba99fab7b) )
+ROM_END
+
@@ -4634,8 +4998,8 @@ void ginv1000_state::ginv1000(machine_config &config)
class ginv2000_state : public hh_tms1k_state
{
public:
- ginv2000_state(const machine_config &mconfig, device_type type, const char *tag)
- : hh_tms1k_state(mconfig, type, tag),
+ ginv2000_state(const machine_config &mconfig, device_type type, const char *tag) :
+ hh_tms1k_state(mconfig, type, tag),
m_expander(*this, "expander")
{ }
@@ -4652,6 +5016,12 @@ protected:
virtual void machine_reset() override;
};
+void ginv2000_state::machine_reset()
+{
+ hh_tms1k_state::machine_reset();
+ m_expander->write_ms(1); // Vss
+}
+
// handlers
void ginv2000_state::prepare_display()
@@ -4715,12 +5085,6 @@ static INPUT_PORTS_START( ginv2000 )
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON1 )
INPUT_PORTS_END
-void ginv2000_state::machine_reset()
-{
- hh_tms1k_state::machine_reset();
- m_expander->write_ms(1); // Vss
-}
-
void ginv2000_state::ginv2000(machine_config &config)
{
/* basic machine hardware */
@@ -4740,7 +5104,8 @@ void ginv2000_state::ginv2000(machine_config &config)
screen.set_svg_region("svg");
screen.set_refresh_hz(50);
screen.set_size(364, 1080);
- screen.set_visarea(0, 364-1, 0, 1080-1);
+ screen.set_visarea_full();
+
TIMER(config, "display_decay").configure_periodic(FUNC(hh_tms1k_state::display_decay_tick), attotime::from_msec(1));
/* sound hardware */
@@ -4749,6 +5114,21 @@ void ginv2000_state::ginv2000(machine_config &config)
m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25);
}
+// roms
+
+ROM_START( ginv2000 )
+ ROM_REGION( 0x0800, "maincpu", 0 )
+ ROM_LOAD( "mp1604", 0x0000, 0x0800, CRC(f1646d0b) SHA1(65601931d81e3eef7bf22a08de5a146910ce8137) )
+
+ ROM_REGION( 867, "maincpu:mpla", 0 )
+ ROM_LOAD( "tms1100_common2_micro.pla", 0, 867, CRC(7cc90264) SHA1(c6e1cf1ffb178061da9e31858514f7cd94e86990) )
+ ROM_REGION( 365, "maincpu:opla", 0 )
+ ROM_LOAD( "tms1100_ginv2000_output.pla", 0, 365, CRC(520bb003) SHA1(1640ae54f8dcc257e0ad0cbe0281b38fcbd8da35) )
+
+ ROM_REGION( 374443, "svg", 0)
+ ROM_LOAD( "ginv2000.svg", 0, 374443, CRC(a4ce1e6d) SHA1(57d9ff05d634a8d495b9d544a2a959790cd10b6b) )
+ROM_END
+
@@ -4774,8 +5154,8 @@ void ginv2000_state::ginv2000(machine_config &config)
class fxmcr165_state : public hh_tms1k_state
{
public:
- fxmcr165_state(const machine_config &mconfig, device_type type, const char *tag)
- : hh_tms1k_state(mconfig, type, tag)
+ fxmcr165_state(const machine_config &mconfig, device_type type, const char *tag) :
+ hh_tms1k_state(mconfig, type, tag)
{ }
void prepare_display();
@@ -4887,6 +5267,18 @@ void fxmcr165_state::fxmcr165(machine_config &config)
m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25);
}
+// roms
+
+ROM_START( fxmcr165 )
+ ROM_REGION( 0x0800, "maincpu", 0 )
+ ROM_LOAD( "mp1312", 0x0000, 0x0800, CRC(6efc8bcc) SHA1(ced8a02b472a3178073691d3dccc0f19f57428fd) )
+
+ ROM_REGION( 867, "maincpu:mpla", 0 )
+ ROM_LOAD( "tms1100_common1_micro.pla", 0, 867, CRC(62445fc9) SHA1(d6297f2a4bc7a870b76cc498d19dbb0ce7d69fec) )
+ ROM_REGION( 365, "maincpu:opla", 0 )
+ ROM_LOAD( "tms1100_fxmcr165_output.pla", 0, 365, CRC(ce656866) SHA1(40e1614f5afcc7572fda596e1be453d54e95af0c) )
+ROM_END
+
@@ -4909,8 +5301,8 @@ void fxmcr165_state::fxmcr165(machine_config &config)
class elecdet_state : public hh_tms1k_state
{
public:
- elecdet_state(const machine_config &mconfig, device_type type, const char *tag)
- : hh_tms1k_state(mconfig, type, tag)
+ elecdet_state(const machine_config &mconfig, device_type type, const char *tag) :
+ hh_tms1k_state(mconfig, type, tag)
{ }
DECLARE_WRITE16_MEMBER(write_r);
@@ -4989,11 +5381,11 @@ static INPUT_PORTS_START( elecdet )
// note: even though power buttons are on the matrix, they are not CPU-controlled
PORT_START("IN.4") // Vss!
- PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_POWER_ON ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_tms1k_state, power_button, (void *)true)
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_POWER_ON ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_tms1k_state, power_button, true)
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNUSED )
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED )
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_E) PORT_NAME("End Turn")
- PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_POWER_OFF ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_tms1k_state, power_button, (void *)false)
+ PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_POWER_OFF ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_tms1k_state, power_button, false)
INPUT_PORTS_END
static const s16 elecdet_speaker_levels[4] = { 0, 0x3fff, 0x3fff, 0x7fff };
@@ -5017,6 +5409,22 @@ void elecdet_state::elecdet(machine_config &config)
m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25);
}
+// roms
+
+ROM_START( elecdet )
+ ROM_REGION( 0x1000, "maincpu", 0 )
+ ROM_LOAD( "mp6100a", 0x0000, 0x1000, CRC(9522fb2d) SHA1(240bdb44b7d67d3b13ebf75851635ac4b4ca2bfd) )
+
+ ROM_REGION( 1246, "maincpu:ipla", 0 )
+ ROM_LOAD( "tms0980_common1_instr.pla", 0, 1246, CRC(42db9a38) SHA1(2d127d98028ec8ec6ea10c179c25e447b14ba4d0) )
+ ROM_REGION( 1982, "maincpu:mpla", 0 )
+ ROM_LOAD( "tms0980_common1_micro.pla", 0, 1982, CRC(3709014f) SHA1(d28ee59ded7f3b9dc3f0594a32a98391b6e9c961) )
+ ROM_REGION( 352, "maincpu:opla", 0 )
+ ROM_LOAD( "tms0980_elecdet_output.pla", 0, 352, CRC(5d12c24a) SHA1(e486802151a704c6273d4a8682c9c374d27d1e6d) )
+ ROM_REGION( 157, "maincpu:spla", 0 )
+ ROM_LOAD( "tms0980_common1_segment.pla", 0, 157, CRC(399aa481) SHA1(72c56c58fde3fbb657d69647a9543b5f8fc74279) )
+ROM_END
+
@@ -5036,8 +5444,8 @@ void elecdet_state::elecdet(machine_config &config)
class starwbc_state : public hh_tms1k_state
{
public:
- starwbc_state(const machine_config &mconfig, device_type type, const char *tag)
- : hh_tms1k_state(mconfig, type, tag)
+ starwbc_state(const machine_config &mconfig, device_type type, const char *tag) :
+ hh_tms1k_state(mconfig, type, tag)
{ }
void prepare_display();
@@ -5143,6 +5551,28 @@ void starwbc_state::starwbc(machine_config &config)
m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25);
}
+// roms
+
+ROM_START( starwbc )
+ ROM_REGION( 0x0800, "maincpu", 0 )
+ ROM_LOAD( "mp3438a", 0x0000, 0x0800, CRC(c12b7069) SHA1(d1f39c69a543c128023ba11cc6228bacdfab04de) )
+
+ ROM_REGION( 867, "maincpu:mpla", 0 )
+ ROM_LOAD( "tms1100_common3_micro.pla", 0, 867, CRC(03574895) SHA1(04407cabfb3adee2ee5e4218612cb06c12c540f4) )
+ ROM_REGION( 365, "maincpu:opla", 0 )
+ ROM_LOAD( "tms1100_starwbc_output.pla", 0, 365, CRC(d358a76d) SHA1(06b60b207540e9b726439141acadea9aba718013) )
+ROM_END
+
+ROM_START( starwbcp )
+ ROM_REGION( 0x0800, "maincpu", 0 )
+ ROM_LOAD( "us4270755", 0x0000, 0x0800, BAD_DUMP CRC(fb3332f2) SHA1(a79ac81e239983cd699b7cfcc55f89b203b2c9ec) ) // from patent US4270755, may have errors
+
+ ROM_REGION( 867, "maincpu:mpla", 0 )
+ ROM_LOAD( "tms1100_common3_micro.pla", 0, 867, CRC(03574895) SHA1(04407cabfb3adee2ee5e4218612cb06c12c540f4) )
+ ROM_REGION( 365, "maincpu:opla", 0 )
+ ROM_LOAD( "tms1100_starwbc_output.pla", 0, 365, CRC(d358a76d) SHA1(06b60b207540e9b726439141acadea9aba718013) )
+ROM_END
+
@@ -5161,8 +5591,8 @@ void starwbc_state::starwbc(machine_config &config)
class astro_state : public hh_tms1k_state
{
public:
- astro_state(const machine_config &mconfig, device_type type, const char *tag)
- : hh_tms1k_state(mconfig, type, tag)
+ astro_state(const machine_config &mconfig, device_type type, const char *tag) :
+ hh_tms1k_state(mconfig, type, tag)
{ }
void prepare_display();
@@ -5267,6 +5697,18 @@ void astro_state::astro(machine_config &config)
/* no sound! */
}
+// roms
+
+ROM_START( astro )
+ ROM_REGION( 0x1000, "maincpu", 0 )
+ ROM_LOAD( "mp1133", 0x0000, 0x1000, CRC(bc21109c) SHA1(05a433cce587d5c0c2d28b5fda5f0853ea6726bf) )
+
+ ROM_REGION( 867, "maincpu:mpla", 0 )
+ ROM_LOAD( "tms1100_common2_micro.pla", 0, 867, CRC(7cc90264) SHA1(c6e1cf1ffb178061da9e31858514f7cd94e86990) )
+ ROM_REGION( 557, "maincpu:opla", 0 )
+ ROM_LOAD( "tms1400_astro_output.pla", 0, 557, CRC(eb08957e) SHA1(62ae0d13a1eaafb34f1b27d7df51441b400ccd56) )
+ROM_END
+
@@ -5300,8 +5742,8 @@ void astro_state::astro(machine_config &config)
class elecbowl_state : public hh_tms1k_state
{
public:
- elecbowl_state(const machine_config &mconfig, device_type type, const char *tag)
- : hh_tms1k_state(mconfig, type, tag)
+ elecbowl_state(const machine_config &mconfig, device_type type, const char *tag) :
+ hh_tms1k_state(mconfig, type, tag)
{ }
void prepare_display();
@@ -5399,23 +5841,13 @@ static INPUT_PORTS_START( elecbowl )
PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_V) // 2 players sw?
INPUT_PORTS_END
-// output PLA is not decapped
+// output PLA is not decapped, this was made by hand
static const u16 elecbowl_output_pla[0x20] =
{
- lA+lB+lC+lD+lE+lF, // 0
- lB+lC, // 1
- lA+lB+lG+lE+lD, // 2
- lA+lB+lG+lC+lD, // 3
- lF+lB+lG+lC, // 4
- lA+lF+lG+lC+lD, // 5
- lA+lF+lG+lC+lD+lE, // 6
- lA+lB+lC, // 7
- lA+lB+lC+lD+lE+lF+lG, // 8
- lA+lB+lG+lF+lC+lD, // 9
-
- 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f,
- 0,1,2,3,4,5,6,7, // lamp muxes select
- 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f
+ 0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f, // 0-9
+ 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f, // ?
+ 0, 1, 2, 3, 4, 5, 6, 7, // lamp muxes select
+ 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f // ?
};
void elecbowl_state::elecbowl(machine_config &config)
@@ -5436,6 +5868,18 @@ void elecbowl_state::elecbowl(machine_config &config)
m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25);
}
+// roms
+
+ROM_START( elecbowl )
+ ROM_REGION( 0x0800, "maincpu", 0 )
+ ROM_LOAD( "mp3403.u9", 0x0000, 0x0800, CRC(9eabaa7d) SHA1(b1f54587ed7f2bbf3a5d49075c807296384c2b06) )
+
+ ROM_REGION( 867, "maincpu:mpla", 0 )
+ ROM_LOAD( "tms1100_common3_micro.pla", 0, 867, BAD_DUMP CRC(03574895) SHA1(04407cabfb3adee2ee5e4218612cb06c12c540f4) ) // not verified
+ ROM_REGION( 365, "maincpu:opla", 0 )
+ ROM_LOAD( "tms1100_elecbowl_output.pla", 0, 365, NO_DUMP )
+ROM_END
+
@@ -5460,8 +5904,8 @@ void elecbowl_state::elecbowl(machine_config &config)
class horseran_state : public hh_tms1k_state
{
public:
- horseran_state(const machine_config &mconfig, device_type type, const char *tag)
- : hh_tms1k_state(mconfig, type, tag),
+ horseran_state(const machine_config &mconfig, device_type type, const char *tag) :
+ hh_tms1k_state(mconfig, type, tag),
m_lcd(*this, "lcd")
{ }
@@ -5498,9 +5942,9 @@ WRITE16_MEMBER(horseran_state::write_r)
// R0: HLCD0569 clock
// R1: HLCD0569 data in
// R2: HLCD0569 _CS
- m_lcd->write_cs(data >> 2 & 1);
- m_lcd->write_data(data >> 1 & 1);
- m_lcd->write_clock(data & 1);
+ m_lcd->cs_w(data >> 2 & 1);
+ m_lcd->data_w(data >> 1 & 1);
+ m_lcd->clock_w(data & 1);
// R3-R10: input mux
m_inp_mux = data >> 3 & 0xff;
@@ -5591,6 +6035,18 @@ void horseran_state::horseran(machine_config &config)
/* no sound! */
}
+// roms
+
+ROM_START( horseran )
+ ROM_REGION( 0x0800, "maincpu", 0 )
+ ROM_LOAD( "mp3491", 0x0000, 0x0800, CRC(a0081671) SHA1(a5a07b502c69d429e5bcd1d313e86b6ee057cda6) )
+
+ ROM_REGION( 867, "maincpu:mpla", 0 )
+ ROM_LOAD( "tms1100_common1_micro.pla", 0, 867, CRC(62445fc9) SHA1(d6297f2a4bc7a870b76cc498d19dbb0ce7d69fec) )
+ ROM_REGION( 365, "maincpu:opla", 0 ) // unused
+ ROM_LOAD( "tms1100_horseran_output.pla", 0, 365, CRC(0fea09b0) SHA1(27a56fcf2b490e9a7dbbc6ad48cc8aaca4cada94) )
+ROM_END
+
@@ -5609,8 +6065,8 @@ void horseran_state::horseran(machine_config &config)
class mdndclab_state : public hh_tms1k_state
{
public:
- mdndclab_state(const machine_config &mconfig, device_type type, const char *tag)
- : hh_tms1k_state(mconfig, type, tag)
+ mdndclab_state(const machine_config &mconfig, device_type type, const char *tag) :
+ hh_tms1k_state(mconfig, type, tag)
{ }
DECLARE_WRITE16_MEMBER(write_r);
@@ -5771,6 +6227,18 @@ void mdndclab_state::mdndclab(machine_config &config)
m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25);
}
+// roms
+
+ROM_START( mdndclab )
+ ROM_REGION( 0x0800, "maincpu", 0 )
+ ROM_LOAD( "m34012", 0x0000, 0x0800, CRC(e851fccd) SHA1(158362c2821678a51554e02dbb2f9ef5aaf5f59f) )
+
+ ROM_REGION( 867, "maincpu:mpla", 0 )
+ ROM_LOAD( "tms1100_common1_micro.pla", 0, 867, CRC(62445fc9) SHA1(d6297f2a4bc7a870b76cc498d19dbb0ce7d69fec) )
+ ROM_REGION( 365, "maincpu:opla", 0 )
+ ROM_LOAD( "tms1100_mdndclab_output.pla", 0, 365, CRC(592b40ba) SHA1(63a2531278a665ace54c541101e052eb84413511) )
+ROM_END
+
@@ -5796,8 +6264,8 @@ void mdndclab_state::mdndclab(machine_config &config)
class comp4_state : public hh_tms1k_state
{
public:
- comp4_state(const machine_config &mconfig, device_type type, const char *tag)
- : hh_tms1k_state(mconfig, type, tag)
+ comp4_state(const machine_config &mconfig, device_type type, const char *tag) :
+ hh_tms1k_state(mconfig, type, tag)
{ }
DECLARE_WRITE16_MEMBER(write_r);
@@ -5872,6 +6340,22 @@ void comp4_state::comp4(machine_config &config)
/* no sound! */
}
+// roms
+
+ROM_START( comp4 )
+ ROM_REGION( 0x0400, "maincpu", 0 )
+ ROM_LOAD( "tmc0904nl_cp0904a", 0x0000, 0x0400, CRC(6233ee1b) SHA1(738e109b38c97804b4ec52bed80b00a8634ad453) )
+
+ ROM_REGION( 782, "maincpu:ipla", 0 )
+ ROM_LOAD( "tms0970_common2_instr.pla", 0, 782, CRC(e038fc44) SHA1(dfc280f6d0a5828d1bb14fcd59ac29caf2c2d981) )
+ ROM_REGION( 860, "maincpu:mpla", 0 )
+ ROM_LOAD( "tms0970_comp4_micro.pla", 0, 860, CRC(ee9d7d9e) SHA1(25484e18f6a07f7cdb21a07220e2f2a82fadfe7b) )
+ ROM_REGION( 352, "maincpu:opla", 0 )
+ ROM_LOAD( "tms0980_comp4_output.pla", 0, 352, CRC(144ce2d5) SHA1(459b92ad62421932df61b7e3965f1821f9636a2c) )
+ ROM_REGION( 157, "maincpu:spla", 0 )
+ ROM_LOAD( "tms0980_comp4_segment.pla", 0, 157, CRC(73426b07) SHA1(311be3f95a97936b6d1a4dcfa7746da26318ce54) )
+ROM_END
+
@@ -5900,8 +6384,8 @@ void comp4_state::comp4(machine_config &config)
class bship_state : public hh_tms1k_state
{
public:
- bship_state(const machine_config &mconfig, device_type type, const char *tag)
- : hh_tms1k_state(mconfig, type, tag)
+ bship_state(const machine_config &mconfig, device_type type, const char *tag) :
+ hh_tms1k_state(mconfig, type, tag)
{ }
DECLARE_WRITE16_MEMBER(write_r);
@@ -6023,6 +6507,18 @@ void bship_state::bship(machine_config &config)
// TODO
}
+// roms
+
+ROM_START( bship )
+ ROM_REGION( 0x0400, "maincpu", 0 )
+ ROM_LOAD( "mp3201", 0x0000, 0x0400, CRC(bf6104a6) SHA1(8d28b43a2aa39dcbbe71f669cdafc518715812c9) )
+
+ ROM_REGION( 867, "maincpu:mpla", 0 )
+ ROM_LOAD( "tms1000_common1_micro.pla", 0, 867, CRC(4becec19) SHA1(3c8a9be0f00c88c81f378b76886c39b10304f330) )
+ ROM_REGION( 365, "maincpu:opla", 0 )
+ ROM_LOAD( "tms1000_bship_output.pla", 0, 365, CRC(ea0570b0) SHA1(6eb803b40717486d7b24939985f245327ac8a7e9) )
+ROM_END
+
@@ -6042,8 +6538,8 @@ void bship_state::bship(machine_config &config)
class bshipb_state : public hh_tms1k_state
{
public:
- bshipb_state(const machine_config &mconfig, device_type type, const char *tag)
- : hh_tms1k_state(mconfig, type, tag),
+ bshipb_state(const machine_config &mconfig, device_type type, const char *tag) :
+ hh_tms1k_state(mconfig, type, tag),
m_sn(*this, "sn76477")
{ }
@@ -6141,6 +6637,18 @@ void bshipb_state::bshipb(machine_config &config)
m_sn->add_route(ALL_OUTPUTS, "mono", 0.35);
}
+// roms
+
+ROM_START( bshipb )
+ ROM_REGION( 0x0400, "maincpu", 0 )
+ ROM_LOAD( "mp3208", 0x0000, 0x0400, CRC(982fa720) SHA1(1c6dbbe7b9e55d62a510225a88cd2de55fe9b181) )
+
+ ROM_REGION( 867, "maincpu:mpla", 0 )
+ ROM_LOAD( "tms1000_common1_micro.pla", 0, 867, CRC(4becec19) SHA1(3c8a9be0f00c88c81f378b76886c39b10304f330) )
+ ROM_REGION( 365, "maincpu:opla", 0 )
+ ROM_LOAD( "tms1000_bshipb_output.pla", 0, 365, BAD_DUMP CRC(74a9a244) SHA1(479c1f1e37cf8f75352e10226b20322906bee813) ) // part of decap photo was obscured
+ROM_END
+
@@ -6164,8 +6672,8 @@ void bshipb_state::bshipb(machine_config &config)
class simon_state : public hh_tms1k_state
{
public:
- simon_state(const machine_config &mconfig, device_type type, const char *tag)
- : hh_tms1k_state(mconfig, type, tag)
+ simon_state(const machine_config &mconfig, device_type type, const char *tag) :
+ hh_tms1k_state(mconfig, type, tag)
{ }
DECLARE_WRITE16_MEMBER(write_r);
@@ -6227,6 +6735,12 @@ static INPUT_PORTS_START( simon )
PORT_CONFSETTING( 0x04, "2" )
PORT_CONFSETTING( 0x08, "3" )
PORT_CONFSETTING( 0x01, "4" )
+
+ PORT_START("SWITCH") // fake
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_tms1k_state, switch_prev<0>, 0x07)
+ PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_tms1k_state, switch_next<0>, 0x07)
+ PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_tms1k_state, switch_prev<3>, 0x0f)
+ PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_tms1k_state, switch_next<3>, 0x0f)
INPUT_PORTS_END
void simon_state::simon(machine_config &config)
@@ -6245,6 +6759,28 @@ void simon_state::simon(machine_config &config)
m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25);
}
+// roms
+
+ROM_START( simon )
+ ROM_REGION( 0x0400, "maincpu", 0 )
+ ROM_LOAD( "tms1000.u1", 0x0000, 0x0400, CRC(9961719d) SHA1(35dddb018a8a2b31f377ab49c1f0cb76951b81c0) )
+
+ ROM_REGION( 867, "maincpu:mpla", 0 )
+ ROM_LOAD( "tms1000_simon_micro.pla", 0, 867, CRC(52f7c1f1) SHA1(dbc2634dcb98eac173ad0209df487cad413d08a5) )
+ ROM_REGION( 365, "maincpu:opla", 0 ) // unused
+ ROM_LOAD( "tms1000_simon_output.pla", 0, 365, CRC(2943c71b) SHA1(bd5bb55c57e7ba27e49c645937ec1d4e67506601) )
+ROM_END
+
+ROM_START( simonf )
+ ROM_REGION( 0x0400, "maincpu", 0 )
+ ROM_LOAD( "mp3300", 0x0000, 0x0400, CRC(b9fcf93a) SHA1(45960e4242a08495f2a99fc5d44728eabd93cd9f) )
+
+ ROM_REGION( 867, "maincpu:mpla", 0 )
+ ROM_LOAD( "tms1000_simon_micro.pla", 0, 867, CRC(52f7c1f1) SHA1(dbc2634dcb98eac173ad0209df487cad413d08a5) )
+ ROM_REGION( 365, "maincpu:opla", 0 ) // unused
+ ROM_LOAD( "tms1000_simon_output.pla", 0, 365, CRC(2943c71b) SHA1(bd5bb55c57e7ba27e49c645937ec1d4e67506601) )
+ROM_END
+
@@ -6263,23 +6799,39 @@ void simon_state::simon(machine_config &config)
class ssimon_state : public hh_tms1k_state
{
public:
- ssimon_state(const machine_config &mconfig, device_type type, const char *tag)
- : hh_tms1k_state(mconfig, type, tag)
+ ssimon_state(const machine_config &mconfig, device_type type, const char *tag) :
+ hh_tms1k_state(mconfig, type, tag)
{ }
DECLARE_WRITE16_MEMBER(write_r);
DECLARE_READ8_MEMBER(read_k);
void set_clock();
- DECLARE_INPUT_CHANGED_MEMBER(speed_switch);
+ DECLARE_INPUT_CHANGED_MEMBER(speed_switch) { set_clock(); }
void ssimon(machine_config &config);
protected:
virtual void machine_reset() override;
};
+void ssimon_state::machine_reset()
+{
+ hh_tms1k_state::machine_reset();
+ set_clock();
+}
+
// handlers
+void ssimon_state::set_clock()
+{
+ // MCU clock is from an RC circuit with C=100pF, R=x depending on speed switch:
+ // 0 Simple: R=51K -> ~200kHz
+ // 1 Normal: R=37K -> ~275kHz
+ // 2 Super: R=22K -> ~400kHz
+ u8 inp = m_inp_matrix[6]->read();
+ m_maincpu->set_unscaled_clock((inp & 2) ? 400000 : ((inp & 1) ? 275000 : 200000));
+}
+
WRITE16_MEMBER(ssimon_state::write_r)
{
// R0-R3,R9,R10: input mux
@@ -6347,28 +6899,15 @@ static INPUT_PORTS_START( ssimon )
PORT_CONFSETTING( 0x00, "Simple" )
PORT_CONFSETTING( 0x01, "Normal" )
PORT_CONFSETTING( 0x02, "Super" )
-INPUT_PORTS_END
-INPUT_CHANGED_MEMBER(ssimon_state::speed_switch)
-{
- set_clock();
-}
-
-void ssimon_state::set_clock()
-{
- // MCU clock is from an RC circuit with C=100pF, R=x depending on speed switch:
- // 0 Simple: R=51K -> ~200kHz
- // 1 Normal: R=37K -> ~275kHz
- // 2 Super: R=22K -> ~400kHz
- u8 inp = m_inp_matrix[6]->read();
- m_maincpu->set_unscaled_clock((inp & 2) ? 400000 : ((inp & 1) ? 275000 : 200000));
-}
-
-void ssimon_state::machine_reset()
-{
- hh_tms1k_state::machine_reset();
- set_clock();
-}
+ PORT_START("SWITCH") // fake
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_tms1k_state, switch_prev<0>, 0x0f)
+ PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_tms1k_state, switch_next<0>, 0x0f)
+ PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_tms1k_state, switch_prev<4>, 0x0f)
+ PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_tms1k_state, switch_next<4>, 0x0f)
+ PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_tms1k_state, switch_prev<6>, 0x03)
+ PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_tms1k_state, switch_next<6>, 0x03)
+INPUT_PORTS_END
void ssimon_state::ssimon(machine_config &config)
{
@@ -6386,6 +6925,18 @@ void ssimon_state::ssimon(machine_config &config)
m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25);
}
+// roms
+
+ROM_START( ssimon )
+ ROM_REGION( 0x0800, "maincpu", 0 )
+ ROM_LOAD( "mp3476", 0x0000, 0x0800, CRC(98200571) SHA1(cbd0bcfc11a534aa0be5d011584cdcac58ff437a) )
+
+ ROM_REGION( 867, "maincpu:mpla", 0 )
+ ROM_LOAD( "tms1100_common1_micro.pla", 0, 867, CRC(62445fc9) SHA1(d6297f2a4bc7a870b76cc498d19dbb0ce7d69fec) )
+ ROM_REGION( 365, "maincpu:opla", 0 ) // unused
+ ROM_LOAD( "tms1100_ssimon_output.pla", 0, 365, CRC(0fea09b0) SHA1(27a56fcf2b490e9a7dbbc6ad48cc8aaca4cada94) )
+ROM_END
+
@@ -6410,8 +6961,8 @@ void ssimon_state::ssimon(machine_config &config)
class bigtrak_state : public hh_tms1k_state
{
public:
- bigtrak_state(const machine_config &mconfig, device_type type, const char *tag)
- : hh_tms1k_state(mconfig, type, tag)
+ bigtrak_state(const machine_config &mconfig, device_type type, const char *tag) :
+ hh_tms1k_state(mconfig, type, tag)
{ }
DECLARE_WRITE16_MEMBER(write_r);
@@ -6427,6 +6978,15 @@ protected:
virtual void machine_start() override;
};
+void bigtrak_state::machine_start()
+{
+ hh_tms1k_state::machine_start();
+
+ // zerofill/register for savestates
+ m_gearbox_pos = 0;
+ save_item(NAME(m_gearbox_pos));
+}
+
// handlers
TIMER_DEVICE_CALLBACK_MEMBER(bigtrak_state::gearbox_sim_tick)
@@ -6539,15 +7099,6 @@ static INPUT_PORTS_START( bigtrak )
PORT_BIT( 0x0b, IP_ACTIVE_HIGH, IPT_UNUSED )
INPUT_PORTS_END
-void bigtrak_state::machine_start()
-{
- hh_tms1k_state::machine_start();
-
- // zerofill/register for savestates
- m_gearbox_pos = 0;
- save_item(NAME(m_gearbox_pos));
-}
-
static const s16 bigtrak_speaker_levels[8] = { 0, 0x7fff/3, 0x7fff/3, 0x7fff/3*2, 0x7fff/3, 0x7fff/3*2, 0x7fff/3*2, 0x7fff };
void bigtrak_state::bigtrak(machine_config &config)
@@ -6569,6 +7120,18 @@ void bigtrak_state::bigtrak(machine_config &config)
m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25);
}
+// roms
+
+ROM_START( bigtrak )
+ ROM_REGION( 0x0400, "maincpu", 0 )
+ ROM_LOAD( "mp3301a", 0x0000, 0x0400, CRC(1351bcdd) SHA1(68865389c25b541c09a742be61f8fb6488134d4e) )
+
+ ROM_REGION( 867, "maincpu:mpla", 0 )
+ ROM_LOAD( "tms1000_common3_micro.pla", 0, 867, CRC(80912d0a) SHA1(7ae5293ed4d93f5b7a64d43fe30c3639f39fbe5a) )
+ ROM_REGION( 365, "maincpu:opla", 0 )
+ ROM_LOAD( "tms1000_bigtrak_output.pla", 0, 365, CRC(63be45f6) SHA1(918e38a223152db883c1a6f7acf56e87d7074734) )
+ROM_END
+
@@ -6595,8 +7158,8 @@ void bigtrak_state::bigtrak(machine_config &config)
class mbdtower_state : public hh_tms1k_state
{
public:
- mbdtower_state(const machine_config &mconfig, device_type type, const char *tag)
- : hh_tms1k_state(mconfig, type, tag)
+ mbdtower_state(const machine_config &mconfig, device_type type, const char *tag) :
+ hh_tms1k_state(mconfig, type, tag)
{ }
void prepare_display();
@@ -6619,6 +7182,25 @@ protected:
virtual void machine_start() override;
};
+void mbdtower_state::machine_start()
+{
+ hh_tms1k_state::machine_start();
+
+ // zerofill
+ m_motor_pos = 0;
+ m_motor_pos_prev = -1;
+ m_motor_decay = 0;
+ m_motor_on = false;
+ m_sensor_blind = false;
+
+ // register for savestates
+ save_item(NAME(m_motor_pos));
+ /* save_item(NAME(m_motor_pos_prev)); */ // don't save!
+ save_item(NAME(m_motor_decay));
+ save_item(NAME(m_motor_on));
+ save_item(NAME(m_sensor_blind));
+}
+
// handlers
TIMER_DEVICE_CALLBACK_MEMBER(mbdtower_state::motor_sim_tick)
@@ -6764,25 +7346,6 @@ static INPUT_PORTS_START( mbdtower )
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_A) PORT_NAME("Tomb/Ruin")
INPUT_PORTS_END
-void mbdtower_state::machine_start()
-{
- hh_tms1k_state::machine_start();
-
- // zerofill
- m_motor_pos = 0;
- m_motor_pos_prev = -1;
- m_motor_decay = 0;
- m_motor_on = false;
- m_sensor_blind = false;
-
- // register for savestates
- save_item(NAME(m_motor_pos));
- /* save_item(NAME(m_motor_pos_prev)); */ // don't save!
- save_item(NAME(m_motor_decay));
- save_item(NAME(m_motor_on));
- save_item(NAME(m_sensor_blind));
-}
-
void mbdtower_state::mbdtower(machine_config &config)
{
/* basic machine hardware */
@@ -6801,6 +7364,18 @@ void mbdtower_state::mbdtower(machine_config &config)
m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25);
}
+// roms
+
+ROM_START( mbdtower )
+ ROM_REGION( 0x1000, "maincpu", 0 )
+ ROM_LOAD( "mp7332", 0x0000, 0x1000, CRC(ebeab91a) SHA1(7edbff437da371390fa8f28b3d183f833eaa9be9) )
+
+ ROM_REGION( 867, "maincpu:mpla", 0 )
+ ROM_LOAD( "tms1100_common1_micro.pla", 0, 867, CRC(62445fc9) SHA1(d6297f2a4bc7a870b76cc498d19dbb0ce7d69fec) )
+ ROM_REGION( 557, "maincpu:opla", 0 )
+ ROM_LOAD( "tms1400_mbdtower_output.pla", 0, 557, CRC(64c84697) SHA1(72ce6d24cedf9c606f1742cd5620f75907246e87) )
+ROM_END
+
@@ -6819,8 +7394,8 @@ void mbdtower_state::mbdtower(machine_config &config)
class arcmania_state : public hh_tms1k_state
{
public:
- arcmania_state(const machine_config &mconfig, device_type type, const char *tag)
- : hh_tms1k_state(mconfig, type, tag)
+ arcmania_state(const machine_config &mconfig, device_type type, const char *tag) :
+ hh_tms1k_state(mconfig, type, tag)
{ }
DECLARE_WRITE16_MEMBER(write_r);
@@ -6886,9 +7461,9 @@ static INPUT_PORTS_START( arcmania )
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED )
PORT_START("IN.2") // O6 (also O5 to power)
- PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_1) PORT_NAME("Orange Button 1") PORT_CHANGED_MEMBER(DEVICE_SELF, hh_tms1k_state, power_button, (void *)true)
- PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_2) PORT_NAME("Orange Button 2") PORT_CHANGED_MEMBER(DEVICE_SELF, hh_tms1k_state, power_button, (void *)true)
- PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_3) PORT_NAME("Orange Button 3") PORT_CHANGED_MEMBER(DEVICE_SELF, hh_tms1k_state, power_button, (void *)true)
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_1) PORT_NAME("Orange Button 1") PORT_CHANGED_MEMBER(DEVICE_SELF, hh_tms1k_state, power_button, true)
+ PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_2) PORT_NAME("Orange Button 2") PORT_CHANGED_MEMBER(DEVICE_SELF, hh_tms1k_state, power_button, true)
+ PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_3) PORT_NAME("Orange Button 3") PORT_CHANGED_MEMBER(DEVICE_SELF, hh_tms1k_state, power_button, true)
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED )
INPUT_PORTS_END
@@ -6912,6 +7487,18 @@ void arcmania_state::arcmania(machine_config &config)
m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25);
}
+// roms
+
+ROM_START( arcmania )
+ ROM_REGION( 0x0800, "maincpu", 0 )
+ ROM_LOAD( "m34078a", 0x0000, 0x0800, CRC(90ea0087) SHA1(9780c9c1ba89300b1bbe72c47e5fec68d8bb6a77) )
+
+ ROM_REGION( 867, "maincpu:mpla", 0 )
+ ROM_LOAD( "tms1100_common1_micro.pla", 0, 867, CRC(62445fc9) SHA1(d6297f2a4bc7a870b76cc498d19dbb0ce7d69fec) )
+ ROM_REGION( 365, "maincpu:opla", 0 )
+ ROM_LOAD( "tms1100_arcmania_output.pla", 0, 365, CRC(a1517b15) SHA1(72eedd7fd41de9c9102219f325fe8668a7c02663) )
+ROM_END
+
@@ -6931,8 +7518,8 @@ void arcmania_state::arcmania(machine_config &config)
class cnsector_state : public hh_tms1k_state
{
public:
- cnsector_state(const machine_config &mconfig, device_type type, const char *tag)
- : hh_tms1k_state(mconfig, type, tag)
+ cnsector_state(const machine_config &mconfig, device_type type, const char *tag) :
+ hh_tms1k_state(mconfig, type, tag)
{ }
DECLARE_WRITE16_MEMBER(write_r);
@@ -7027,6 +7614,22 @@ void cnsector_state::cnsector(machine_config &config)
/* no sound! */
}
+// roms
+
+ROM_START( cnsector )
+ ROM_REGION( 0x0400, "maincpu", 0 )
+ ROM_LOAD( "mp0905bnl_za0379", 0x0000, 0x0400, CRC(201036e9) SHA1(b37fef86bb2bceaf0ac8bb3745b4702d17366914) )
+
+ ROM_REGION( 782, "maincpu:ipla", 0 )
+ ROM_LOAD( "tms0970_common2_instr.pla", 0, 782, CRC(e038fc44) SHA1(dfc280f6d0a5828d1bb14fcd59ac29caf2c2d981) )
+ ROM_REGION( 860, "maincpu:mpla", 0 )
+ ROM_LOAD( "tms0970_cnsector_micro.pla", 0, 860, CRC(059f5bb4) SHA1(2653766f9fd74d41d44013bb6f54c0973a6080c9) )
+ ROM_REGION( 352, "maincpu:opla", 0 )
+ ROM_LOAD( "tms0980_cnsector_output.pla", 0, 352, CRC(c8bfb9d2) SHA1(30c3c73cec194debdcb1dd01b4adfefaeddf9516) )
+ ROM_REGION( 157, "maincpu:spla", 0 )
+ ROM_LOAD( "tms0980_common2_segment.pla", 0, 157, CRC(c03cccd8) SHA1(08bc4b597686a7aa8b2c9f43b85b62747ffd455b) )
+ROM_END
+
@@ -7056,8 +7659,8 @@ void cnsector_state::cnsector(machine_config &config)
class merlin_state : public hh_tms1k_state
{
public:
- merlin_state(const machine_config &mconfig, device_type type, const char *tag)
- : hh_tms1k_state(mconfig, type, tag)
+ merlin_state(const machine_config &mconfig, device_type type, const char *tag) :
+ hh_tms1k_state(mconfig, type, tag)
{ }
virtual DECLARE_WRITE16_MEMBER(write_r);
@@ -7145,6 +7748,18 @@ void merlin_state::merlin(machine_config &config)
m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25);
}
+// roms
+
+ROM_START( merlin )
+ ROM_REGION( 0x0800, "maincpu", 0 )
+ ROM_LOAD( "mp3404", 0x0000, 0x0800, CRC(7515a75d) SHA1(76ca3605d3fde1df62f79b9bb1f534c2a2ae0229) )
+
+ ROM_REGION( 867, "maincpu:mpla", 0 )
+ ROM_LOAD( "tms1100_common3_micro.pla", 0, 867, CRC(03574895) SHA1(04407cabfb3adee2ee5e4218612cb06c12c540f4) )
+ ROM_REGION( 365, "maincpu:opla", 0 )
+ ROM_LOAD( "tms1100_merlin_output.pla", 0, 365, CRC(3921b074) SHA1(12bd58e4d6676eb8c7059ef53598279e4f1a32ea) )
+ROM_END
+
@@ -7174,8 +7789,8 @@ void merlin_state::merlin(machine_config &config)
class mmerlin_state : public merlin_state
{
public:
- mmerlin_state(const machine_config &mconfig, device_type type, const char *tag)
- : merlin_state(mconfig, type, tag)
+ mmerlin_state(const machine_config &mconfig, device_type type, const char *tag) :
+ merlin_state(mconfig, type, tag)
{ }
void mmerlin(machine_config &config);
@@ -7210,6 +7825,18 @@ void mmerlin_state::mmerlin(machine_config &config)
m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25);
}
+// roms
+
+ROM_START( mmerlin )
+ ROM_REGION( 0x1000, "maincpu", 0 )
+ ROM_LOAD( "mp7351", 0x0000, 0x1000, CRC(0f7a4c83) SHA1(242c1278ddfe92c28fd7cd87300e48e7a4827831) )
+
+ ROM_REGION( 867, "maincpu:mpla", 0 )
+ ROM_LOAD( "tms1100_common1_micro.pla", 0, 867, CRC(62445fc9) SHA1(d6297f2a4bc7a870b76cc498d19dbb0ce7d69fec) )
+ ROM_REGION( 557, "maincpu:opla", 0 )
+ ROM_LOAD( "tms1400_mmerlin_output.pla", 0, 557, CRC(fd3dcd93) SHA1(f2afc52df700daa0eb7356c7876af9b2966f971b) )
+ROM_END
+
@@ -7230,8 +7857,8 @@ void mmerlin_state::mmerlin(machine_config &config)
class stopthief_state : public hh_tms1k_state
{
public:
- stopthief_state(const machine_config &mconfig, device_type type, const char *tag)
- : hh_tms1k_state(mconfig, type, tag)
+ stopthief_state(const machine_config &mconfig, device_type type, const char *tag) :
+ hh_tms1k_state(mconfig, type, tag)
{ }
DECLARE_WRITE16_MEMBER(write_r);
@@ -7299,11 +7926,11 @@ static INPUT_PORTS_START( stopthief )
// note: even though power buttons are on the matrix, they are not CPU-controlled
PORT_START("IN.2") // Vss!
- PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_POWER_ON ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_tms1k_state, power_button, (void *)true)
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_POWER_ON ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_tms1k_state, power_button, true)
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_T) PORT_NAME("Tip")
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_A) PORT_NAME("Arrest")
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_C) PORT_NAME("Clue")
- PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_POWER_OFF ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_tms1k_state, power_button, (void *)false)
+ PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_POWER_OFF ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_tms1k_state, power_button, false)
INPUT_PORTS_END
static const s16 stopthief_speaker_levels[7] = { 0, 0x7fff/6, 0x7fff/5, 0x7fff/4, 0x7fff/3, 0x7fff/2, 0x7fff };
@@ -7327,6 +7954,36 @@ void stopthief_state::stopthief(machine_config &config)
m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25);
}
+// roms
+
+ROM_START( stopthief )
+ ROM_REGION( 0x1000, "maincpu", 0 )
+ ROM_LOAD( "mp6101b", 0x0000, 0x1000, CRC(b9c9d64a) SHA1(481f8653064c142fe5d9314b750bcd73797b92b2) )
+
+ ROM_REGION( 1246, "maincpu:ipla", 0 )
+ ROM_LOAD( "tms0980_common1_instr.pla", 0, 1246, CRC(42db9a38) SHA1(2d127d98028ec8ec6ea10c179c25e447b14ba4d0) )
+ ROM_REGION( 1982, "maincpu:mpla", 0 )
+ ROM_LOAD( "tms0980_common1_micro.pla", 0, 1982, CRC(3709014f) SHA1(d28ee59ded7f3b9dc3f0594a32a98391b6e9c961) )
+ ROM_REGION( 352, "maincpu:opla", 0 )
+ ROM_LOAD( "tms0980_stopthief_output.pla", 0, 352, CRC(680ca1c1) SHA1(dea6365f2e6b50a52f1a8f1d8417176b905d2bc9) )
+ ROM_REGION( 157, "maincpu:spla", 0 )
+ ROM_LOAD( "tms0980_common1_segment.pla", 0, 157, CRC(399aa481) SHA1(72c56c58fde3fbb657d69647a9543b5f8fc74279) )
+ROM_END
+
+ROM_START( stopthiefp )
+ ROM_REGION( 0x1000, "maincpu", 0 )
+ ROM_LOAD16_WORD( "us4341385", 0x0000, 0x1000, CRC(07aec38a) SHA1(0a3d0956495c0d6d9ea771feae6c14a473a800dc) ) // from patent US4341385, data should be correct (it included checksums)
+
+ ROM_REGION( 1246, "maincpu:ipla", 0 )
+ ROM_LOAD( "tms0980_common1_instr.pla", 0, 1246, CRC(42db9a38) SHA1(2d127d98028ec8ec6ea10c179c25e447b14ba4d0) )
+ ROM_REGION( 1982, "maincpu:mpla", 0 )
+ ROM_LOAD( "tms0980_common1_micro.pla", 0, 1982, CRC(3709014f) SHA1(d28ee59ded7f3b9dc3f0594a32a98391b6e9c961) )
+ ROM_REGION( 352, "maincpu:opla", 0 )
+ ROM_LOAD( "tms0980_stopthief_output.pla", 0, 352, CRC(680ca1c1) SHA1(dea6365f2e6b50a52f1a8f1d8417176b905d2bc9) )
+ ROM_REGION( 157, "maincpu:spla", 0 )
+ ROM_LOAD( "tms0980_common1_segment.pla", 0, 157, CRC(399aa481) SHA1(72c56c58fde3fbb657d69647a9543b5f8fc74279) )
+ROM_END
+
@@ -7350,8 +8007,8 @@ void stopthief_state::stopthief(machine_config &config)
class bankshot_state : public hh_tms1k_state
{
public:
- bankshot_state(const machine_config &mconfig, device_type type, const char *tag)
- : hh_tms1k_state(mconfig, type, tag)
+ bankshot_state(const machine_config &mconfig, device_type type, const char *tag) :
+ hh_tms1k_state(mconfig, type, tag)
{ }
void prepare_display();
@@ -7439,6 +8096,18 @@ void bankshot_state::bankshot(machine_config &config)
m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25);
}
+// roms
+
+ROM_START( bankshot )
+ ROM_REGION( 0x1000, "maincpu", 0 )
+ ROM_LOAD( "mp7313", 0x0000, 0x1000, CRC(7a5016a9) SHA1(a8730dc8a282ffaa3d89e675f371d43eb39f39b4) )
+
+ ROM_REGION( 867, "maincpu:mpla", 0 )
+ ROM_LOAD( "tms1100_common1_micro.pla", 0, 867, CRC(62445fc9) SHA1(d6297f2a4bc7a870b76cc498d19dbb0ce7d69fec) )
+ ROM_REGION( 557, "maincpu:opla", 0 )
+ ROM_LOAD( "tms1400_bankshot_output.pla", 0, 557, CRC(7539283b) SHA1(f791fa98259fc10c393ff1961d4c93040f1a2932) )
+ROM_END
+
@@ -7478,8 +8147,8 @@ void bankshot_state::bankshot(machine_config &config)
class splitsec_state : public hh_tms1k_state
{
public:
- splitsec_state(const machine_config &mconfig, device_type type, const char *tag)
- : hh_tms1k_state(mconfig, type, tag)
+ splitsec_state(const machine_config &mconfig, device_type type, const char *tag) :
+ hh_tms1k_state(mconfig, type, tag)
{ }
void prepare_display();
@@ -7556,6 +8225,18 @@ void splitsec_state::splitsec(machine_config &config)
m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25);
}
+// roms
+
+ROM_START( splitsec )
+ ROM_REGION( 0x1000, "maincpu", 0 )
+ ROM_LOAD( "mp7314", 0x0000, 0x1000, CRC(e94b2098) SHA1(f0fc1f56a829252185592a2508740354c50bedf8) )
+
+ ROM_REGION( 867, "maincpu:mpla", 0 )
+ ROM_LOAD( "tms1100_common1_micro.pla", 0, 867, CRC(62445fc9) SHA1(d6297f2a4bc7a870b76cc498d19dbb0ce7d69fec) )
+ ROM_REGION( 557, "maincpu:opla", 0 )
+ ROM_LOAD( "tms1400_splitsec_output.pla", 0, 557, CRC(7539283b) SHA1(f791fa98259fc10c393ff1961d4c93040f1a2932) )
+ROM_END
+
@@ -7574,8 +8255,8 @@ void splitsec_state::splitsec(machine_config &config)
class lostreas_state : public hh_tms1k_state
{
public:
- lostreas_state(const machine_config &mconfig, device_type type, const char *tag)
- : hh_tms1k_state(mconfig, type, tag)
+ lostreas_state(const machine_config &mconfig, device_type type, const char *tag) :
+ hh_tms1k_state(mconfig, type, tag)
{ }
DECLARE_WRITE16_MEMBER(write_r);
@@ -7675,6 +8356,18 @@ void lostreas_state::lostreas(machine_config &config)
m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25);
}
+// roms
+
+ROM_START( lostreas )
+ ROM_REGION( 0x0800, "maincpu", 0 )
+ ROM_LOAD( "m34038", 0x0000, 0x0800, CRC(4c996f63) SHA1(ebbaa8b2f909f4300887aa2dbdb7185eedc75d3f) )
+
+ ROM_REGION( 867, "maincpu:mpla", 0 )
+ ROM_LOAD( "tms1100_common1_micro.pla", 0, 867, CRC(62445fc9) SHA1(d6297f2a4bc7a870b76cc498d19dbb0ce7d69fec) )
+ ROM_REGION( 365, "maincpu:opla", 0 )
+ ROM_LOAD( "tms1100_lostreas_output.pla", 0, 365, CRC(c62d850f) SHA1(d25974e6901eb10c52cdda12e6d4a13e26745e6f) )
+ROM_END
+
@@ -7701,12 +8394,10 @@ void lostreas_state::lostreas(machine_config &config)
class alphie_state : public hh_tms1k_state
{
public:
- alphie_state(const machine_config &mconfig, device_type type, const char *tag)
- : hh_tms1k_state(mconfig, type, tag)
+ alphie_state(const machine_config &mconfig, device_type type, const char *tag) :
+ hh_tms1k_state(mconfig, type, tag)
{ }
- TIMER_DEVICE_CALLBACK_MEMBER(show_arm_position);
-
DECLARE_WRITE16_MEMBER(write_r);
DECLARE_WRITE16_MEMBER(write_o);
DECLARE_READ8_MEMBER(read_k);
@@ -7715,13 +8406,6 @@ public:
// handlers
-TIMER_DEVICE_CALLBACK_MEMBER(alphie_state::show_arm_position)
-{
- // arm position 1(up) to 5(down)
- output().set_value("q_pos", 32 - count_leading_zeros(m_inp_matrix[1]->read()));
- output().set_value("a_pos", 32 - count_leading_zeros(m_inp_matrix[2]->read()));
-}
-
WRITE16_MEMBER(alphie_state::write_r)
{
// R1-R5, input mux (using d5 for Vss)
@@ -7751,17 +8435,25 @@ READ8_MEMBER(alphie_state::read_k)
// config
-static const ioport_value alphie_armpos_table[5] = { 0x01, 0x02, 0x04, 0x08, 0x10 };
-
static INPUT_PORTS_START( alphie )
PORT_START("IN.0") // K1
- PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_tms1k_state, power_button, (void *)true)
+ PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_tms1k_state, power_button, true)
PORT_START("IN.1") // K2
- PORT_BIT( 0x1f, 0x00, IPT_POSITIONAL_V ) PORT_PLAYER(2) PORT_POSITIONS(5) PORT_REMAP_TABLE(alphie_armpos_table) PORT_SENSITIVITY(10) PORT_KEYDELTA(1) PORT_CENTERDELTA(0) PORT_NAME("Question Arm")
+ PORT_CONFNAME( 0x1f, 0x01, "Question" )
+ PORT_CONFSETTING( 0x01, "1" )
+ PORT_CONFSETTING( 0x02, "2" )
+ PORT_CONFSETTING( 0x04, "3" )
+ PORT_CONFSETTING( 0x08, "4" )
+ PORT_CONFSETTING( 0x10, "5" )
PORT_START("IN.2") // K4
- PORT_BIT( 0x1f, 0x00, IPT_POSITIONAL_V ) PORT_POSITIONS(5) PORT_REMAP_TABLE(alphie_armpos_table) PORT_SENSITIVITY(10) PORT_KEYDELTA(1) PORT_CENTERDELTA(0) PORT_NAME("Answer Arm")
+ PORT_CONFNAME( 0x1f, 0x01, "Answer" )
+ PORT_CONFSETTING( 0x01, "1" )
+ PORT_CONFSETTING( 0x02, "2" )
+ PORT_CONFSETTING( 0x04, "3" )
+ PORT_CONFSETTING( 0x08, "4" )
+ PORT_CONFSETTING( 0x10, "5" )
PORT_START("IN.3") // K8
PORT_CONFNAME( 0x0f, 0x01, "Activity" )
@@ -7769,6 +8461,14 @@ static INPUT_PORTS_START( alphie )
PORT_CONFSETTING( 0x02, "Lunar Landing" )
PORT_CONFSETTING( 0x04, "Robot Land" )
PORT_CONFSETTING( 0x08, "Tunes" )
+
+ PORT_START("SWITCH") // fake
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICKLEFT_UP ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_tms1k_state, switch_prev<1>, 0x1f) PORT_NAME("Question Arm Up")
+ PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICKLEFT_DOWN ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_tms1k_state, switch_next<1>, 0x1f) PORT_NAME("Question Arm Down")
+ PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICKRIGHT_UP ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_tms1k_state, switch_prev<2>, 0x1f) PORT_NAME("Answer Arm Up")
+ PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICKRIGHT_DOWN ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_tms1k_state, switch_next<2>, 0x1f) PORT_NAME("Answer Arm Down")
+ PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_tms1k_state, switch_prev<3>, 0x0f) PORT_NAME("Activity Selector Left")
+ PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_tms1k_state, switch_next<3>, 0x0f) PORT_NAME("Activity Selector Right")
INPUT_PORTS_END
// output PLA is guessed
@@ -7787,7 +8487,6 @@ void alphie_state::alphie(machine_config &config)
m_maincpu->r().set(FUNC(alphie_state::write_r));
m_maincpu->o().set(FUNC(alphie_state::write_o));
- TIMER(config, "arm_position").configure_periodic(FUNC(alphie_state::show_arm_position), attotime::from_msec(50));
TIMER(config, "display_decay").configure_periodic(FUNC(hh_tms1k_state::display_decay_tick), attotime::from_msec(1));
config.set_default_layout(layout_alphie);
@@ -7797,6 +8496,18 @@ void alphie_state::alphie(machine_config &config)
m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25);
}
+// roms
+
+ROM_START( alphie )
+ ROM_REGION( 0x0400, "maincpu", 0 )
+ ROM_LOAD( "us4280809", 0x0000, 0x0400, CRC(f8f14013) SHA1(bf31b929fcbcb189bbe4623104e1da0a639b5954) ) // from patent US4280809, should be good
+
+ ROM_REGION( 867, "maincpu:mpla", 0 )
+ ROM_LOAD( "tms1000_common2_micro.pla", 0, 867, BAD_DUMP CRC(d33da3cf) SHA1(13c4ebbca227818db75e6db0d45b66ba5e207776) ) // not in patent description
+ ROM_REGION( 365, "maincpu:opla", 0 )
+ ROM_LOAD( "tms1000_alphie_output.pla", 0, 365, NO_DUMP ) // "
+ROM_END
+
@@ -7816,8 +8527,8 @@ void alphie_state::alphie(machine_config &config)
class tcfball_state : public hh_tms1k_state
{
public:
- tcfball_state(const machine_config &mconfig, device_type type, const char *tag)
- : hh_tms1k_state(mconfig, type, tag)
+ tcfball_state(const machine_config &mconfig, device_type type, const char *tag) :
+ hh_tms1k_state(mconfig, type, tag)
{ }
void prepare_display();
@@ -7906,6 +8617,18 @@ void tcfball_state::tcfball(machine_config &config)
m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25);
}
+// roms
+
+ROM_START( tcfball )
+ ROM_REGION( 0x0800, "maincpu", 0 )
+ ROM_LOAD( "mp1193", 0x0000, 0x0800, CRC(7d9f446f) SHA1(bb6af47b42d989494f21475a73f072cddf58c99f) )
+
+ ROM_REGION( 867, "maincpu:mpla", 0 )
+ ROM_LOAD( "tms1100_common2_micro.pla", 0, 867, CRC(7cc90264) SHA1(c6e1cf1ffb178061da9e31858514f7cd94e86990) )
+ ROM_REGION( 365, "maincpu:opla", 0 )
+ ROM_LOAD( "tms1100_tcfball_output.pla", 0, 365, CRC(26b2996e) SHA1(df0e706c552bf74123aa65e71b0c9b4d33cddb2b) )
+ROM_END
+
@@ -7928,8 +8651,8 @@ void tcfball_state::tcfball(machine_config &config)
class tcfballa_state : public tcfball_state
{
public:
- tcfballa_state(const machine_config &mconfig, device_type type, const char *tag)
- : tcfball_state(mconfig, type, tag)
+ tcfballa_state(const machine_config &mconfig, device_type type, const char *tag) :
+ tcfball_state(mconfig, type, tag)
{ }
void tcfballa(machine_config &config);
@@ -7972,6 +8695,18 @@ void tcfballa_state::tcfballa(machine_config &config)
m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25);
}
+// roms
+
+ROM_START( tcfballa )
+ ROM_REGION( 0x0800, "maincpu", 0 )
+ ROM_LOAD( "mp1183", 0x0000, 0x0800, CRC(2a4db1d5) SHA1(5df15d1115bb425578ad522d607a582dd478f35c) )
+
+ ROM_REGION( 867, "maincpu:mpla", 0 )
+ ROM_LOAD( "tms1100_common2_micro.pla", 0, 867, BAD_DUMP CRC(7cc90264) SHA1(c6e1cf1ffb178061da9e31858514f7cd94e86990) ) // not verified
+ ROM_REGION( 365, "maincpu:opla", 0 )
+ ROM_LOAD( "tms1100_tcfballa_output.pla", 0, 365, NO_DUMP )
+ROM_END
+
@@ -8006,8 +8741,8 @@ void tcfballa_state::tcfballa(machine_config &config)
class tandy12_state : public hh_tms1k_state
{
public:
- tandy12_state(const machine_config &mconfig, device_type type, const char *tag)
- : hh_tms1k_state(mconfig, type, tag)
+ tandy12_state(const machine_config &mconfig, device_type type, const char *tag) :
+ hh_tms1k_state(mconfig, type, tag)
{ }
void prepare_display();
@@ -8105,7 +8840,7 @@ static INPUT_PORTS_START( tandy12 )
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("Button 5")
INPUT_PORTS_END
-// output PLA is not decapped
+// output PLA is not decapped, this was made by hand
static const u16 tandy12_output_pla[0x20] =
{
// these are certain
@@ -8136,6 +8871,18 @@ void tandy12_state::tandy12(machine_config &config)
m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25);
}
+// roms
+
+ROM_START( tandy12 )
+ ROM_REGION( 0x0800, "maincpu", 0 )
+ ROM_LOAD( "cd7282sl", 0x0000, 0x0800, CRC(a10013dd) SHA1(42ebd3de3449f371b99937f9df39c240d15ac686) )
+
+ ROM_REGION( 867, "maincpu:mpla", 0 )
+ ROM_LOAD( "tms1100_common1_micro.pla", 0, 867, BAD_DUMP CRC(62445fc9) SHA1(d6297f2a4bc7a870b76cc498d19dbb0ce7d69fec) ) // not verified
+ ROM_REGION( 365, "maincpu:opla", 0 )
+ ROM_LOAD( "tms1100_tandy12_output.pla", 0, 365, NO_DUMP )
+ROM_END
+
@@ -8159,8 +8906,8 @@ void tandy12_state::tandy12(machine_config &config)
class monkeysee_state : public hh_tms1k_state
{
public:
- monkeysee_state(const machine_config &mconfig, device_type type, const char *tag)
- : hh_tms1k_state(mconfig, type, tag)
+ monkeysee_state(const machine_config &mconfig, device_type type, const char *tag) :
+ hh_tms1k_state(mconfig, type, tag)
{ }
DECLARE_WRITE16_MEMBER(write_r);
@@ -8244,6 +8991,18 @@ void monkeysee_state::monkeysee(machine_config &config)
m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25);
}
+// roms
+
+ROM_START( monkeysee )
+ ROM_REGION( 0x0400, "maincpu", 0 )
+ ROM_LOAD( "mp0271", 0x0000, 0x0400, CRC(acab0f05) SHA1(226f7688caf4a94a88241d3b61ddc4254e4a918c) )
+
+ ROM_REGION( 867, "maincpu:mpla", 0 )
+ ROM_LOAD( "tms1000_monkeysee_micro.pla", 0, 867, CRC(368d878f) SHA1(956e700a04f453c1610cfdb974fce898ba4cf01f) )
+ ROM_REGION( 365, "maincpu:opla", 0 )
+ ROM_LOAD( "tms1000_monkeysee_output.pla", 0, 365, CRC(8a010e89) SHA1(3ffbabc5d6c9b34cc06d290817d15b2be42d8b17) )
+ROM_END
+
@@ -8264,8 +9023,8 @@ void monkeysee_state::monkeysee(machine_config &config)
class speechp_state : public hh_tms1k_state
{
public:
- speechp_state(const machine_config &mconfig, device_type type, const char *tag)
- : hh_tms1k_state(mconfig, type, tag),
+ speechp_state(const machine_config &mconfig, device_type type, const char *tag) :
+ hh_tms1k_state(mconfig, type, tag),
m_speech(*this, "speech")
{ }
@@ -8393,6 +9152,21 @@ void speechp_state::speechp(machine_config &config)
m_speech->add_route(ALL_OUTPUTS, "mono", 0.75);
}
+// roms
+
+ROM_START( speechp )
+ ROM_REGION( 0x0400, "maincpu", 0 )
+ ROM_LOAD( "tms1007nl", 0x0000, 0x0400, CRC(c2669d5c) SHA1(7943d6f39508a9a82bc21e4fe34a5b9f86e3add2) )
+
+ ROM_REGION( 867, "maincpu:mpla", 0 )
+ ROM_LOAD( "tms1000_common1_micro.pla", 0, 867, CRC(4becec19) SHA1(3c8a9be0f00c88c81f378b76886c39b10304f330) )
+ ROM_REGION( 365, "maincpu:opla", 0 )
+ ROM_LOAD( "tms1000_speechp_output.pla", 0, 365, CRC(e1b4197f) SHA1(258f4276a9f15c9bfbfa58df2f7202aed1542fdc) )
+
+ ROM_REGION( 0x0800, "speech", 0 )
+ ROM_LOAD("s14007-a", 0x0000, 0x0800, CRC(543b46d4) SHA1(99daf7fe3354c378b4bd883840c9bbd22b22ebe7) )
+ROM_END
+
@@ -8417,8 +9191,8 @@ void speechp_state::speechp(machine_config &config)
class timaze_state : public hh_tms1k_state
{
public:
- timaze_state(const machine_config &mconfig, device_type type, const char *tag)
- : hh_tms1k_state(mconfig, type, tag)
+ timaze_state(const machine_config &mconfig, device_type type, const char *tag) :
+ hh_tms1k_state(mconfig, type, tag)
{ }
DECLARE_WRITE16_MEMBER(write_r);
@@ -8472,6 +9246,18 @@ void timaze_state::timaze(machine_config &config)
/* no sound! */
}
+// roms
+
+ROM_START( timaze )
+ ROM_REGION( 0x0400, "maincpu", 0 )
+ ROM_LOAD( "gb2040172a", 0x0000, 0x0400, CRC(0bab4dc6) SHA1(c9d40649fbb27a8b7cf7460d66c7e217b63376f0) ) // from patent GB2040172A, verified with source code
+
+ ROM_REGION( 867, "maincpu:mpla", 0 )
+ ROM_LOAD( "tms1000_common2_micro.pla", 0, 867, BAD_DUMP CRC(d33da3cf) SHA1(13c4ebbca227818db75e6db0d45b66ba5e207776) ) // not in patent, use default one
+ ROM_REGION( 365, "maincpu:opla", 0 )
+ ROM_LOAD( "tms1000_timaze_output.pla", 0, 365, BAD_DUMP CRC(f0f36970) SHA1(a6ad1f5e804ac98e5e1a1d07466b3db3a8d6c256) ) // described in patent, but unsure about pin order
+ROM_END
+
@@ -8493,8 +9279,8 @@ void timaze_state::timaze(machine_config &config)
class copycat_state : public hh_tms1k_state
{
public:
- copycat_state(const machine_config &mconfig, device_type type, const char *tag)
- : hh_tms1k_state(mconfig, type, tag)
+ copycat_state(const machine_config &mconfig, device_type type, const char *tag) :
+ hh_tms1k_state(mconfig, type, tag)
{ }
DECLARE_WRITE16_MEMBER(write_r);
@@ -8578,6 +9364,18 @@ void copycat_state::copycat(machine_config &config)
m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25);
}
+// roms
+
+ROM_START( copycat )
+ ROM_REGION( 0x0400, "maincpu", 0 )
+ ROM_LOAD( "mp0919", 0x0000, 0x0400, CRC(92a21299) SHA1(16daadb8dbf53aaab8a71833017b4a578d035d6d) )
+
+ ROM_REGION( 867, "maincpu:mpla", 0 )
+ ROM_LOAD( "tms1000_common2_micro.pla", 0, 867, CRC(d33da3cf) SHA1(13c4ebbca227818db75e6db0d45b66ba5e207776) )
+ ROM_REGION( 365, "maincpu:opla", 0 )
+ ROM_LOAD( "tms1000_copycat_output.pla", 0, 365, CRC(b1d0c96d) SHA1(ac1a003eab3f69e09e9050cb24ea17211e0523fe) )
+ROM_END
+
@@ -8603,8 +9401,8 @@ void copycat_state::copycat(machine_config &config)
class copycatm2_state : public hh_tms1k_state
{
public:
- copycatm2_state(const machine_config &mconfig, device_type type, const char *tag)
- : hh_tms1k_state(mconfig, type, tag)
+ copycatm2_state(const machine_config &mconfig, device_type type, const char *tag) :
+ hh_tms1k_state(mconfig, type, tag)
{ }
DECLARE_WRITE16_MEMBER(write_r);
@@ -8654,6 +9452,18 @@ void copycatm2_state::copycatm2(machine_config &config)
m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25);
}
+// roms
+
+ROM_START( copycatm2 )
+ ROM_REGION( 0x0200, "maincpu", 0 )
+ ROM_LOAD( "mp3005n", 0x0000, 0x0200, CRC(a87649cb) SHA1(14ef7967a80578885f0b905772c3bb417b5b3255) )
+
+ ROM_REGION( 867, "maincpu:mpla", 0 )
+ ROM_LOAD( "tms1000_copycatm2_micro.pla", 0, 867, CRC(2710d8ef) SHA1(cb7a13bfabedad43790de753844707fe829baed0) )
+ ROM_REGION( 365, "maincpu:opla", 0 )
+ ROM_LOAD( "tms1000_copycatm2_output.pla", 0, 365, CRC(d1999aaf) SHA1(0c27789b349e491d5230f9c75c4741e621f5a14e) )
+ROM_END
+
@@ -8674,8 +9484,8 @@ void copycatm2_state::copycatm2(machine_config &config)
class ditto_state : public hh_tms1k_state
{
public:
- ditto_state(const machine_config &mconfig, device_type type, const char *tag)
- : hh_tms1k_state(mconfig, type, tag)
+ ditto_state(const machine_config &mconfig, device_type type, const char *tag) :
+ hh_tms1k_state(mconfig, type, tag)
{ }
DECLARE_WRITE16_MEMBER(write_r);
@@ -8725,6 +9535,18 @@ void ditto_state::ditto(machine_config &config)
m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25);
}
+// roms
+
+ROM_START( ditto )
+ ROM_REGION( 0x0200, "maincpu", 0 )
+ ROM_LOAD( "mp1801", 0x0000, 0x0200, CRC(cee6043b) SHA1(4ec334be6835688413637ff9d9d7a5f0d61eba27) )
+
+ ROM_REGION( 867, "maincpu:mpla", 0 )
+ ROM_LOAD( "tms1000_ditto_micro.pla", 0, 867, CRC(2710d8ef) SHA1(cb7a13bfabedad43790de753844707fe829baed0) )
+ ROM_REGION( 365, "maincpu:opla", 0 )
+ ROM_LOAD( "tms1000_ditto_output.pla", 0, 365, CRC(2b708a27) SHA1(e95415e51ffbe5da3bde1484fcd20467dde9f09a) )
+ROM_END
+
@@ -8748,8 +9570,8 @@ void ditto_state::ditto(machine_config &config)
class ss7in1_state : public hh_tms1k_state
{
public:
- ss7in1_state(const machine_config &mconfig, device_type type, const char *tag)
- : hh_tms1k_state(mconfig, type, tag)
+ ss7in1_state(const machine_config &mconfig, device_type type, const char *tag) :
+ hh_tms1k_state(mconfig, type, tag)
{ }
void prepare_display();
@@ -8840,6 +9662,18 @@ void ss7in1_state::ss7in1(machine_config &config)
m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25);
}
+// roms
+
+ROM_START( 7in1ss )
+ ROM_REGION( 0x1000, "maincpu", 0 )
+ ROM_LOAD( "mp7304", 0x0000, 0x1000, CRC(2a1c8390) SHA1(fa10e60686af6828a61f05046abc3854ab49af95) )
+
+ ROM_REGION( 867, "maincpu:mpla", 0 )
+ ROM_LOAD( "tms1100_common2_micro.pla", 0, 867, CRC(7cc90264) SHA1(c6e1cf1ffb178061da9e31858514f7cd94e86990) )
+ ROM_REGION( 557, "maincpu:opla", 0 )
+ ROM_LOAD( "tms1400_7in1ss_output.pla", 0, 557, CRC(6b7660f7) SHA1(bb7d58fa04e7606ccdf5b209e1b089948bdd1e7c) )
+ROM_END
+
@@ -8882,8 +9716,8 @@ void ss7in1_state::ss7in1(machine_config &config)
class tbreakup_state : public hh_tms1k_state
{
public:
- tbreakup_state(const machine_config &mconfig, device_type type, const char *tag)
- : hh_tms1k_state(mconfig, type, tag),
+ tbreakup_state(const machine_config &mconfig, device_type type, const char *tag) :
+ hh_tms1k_state(mconfig, type, tag),
m_expander(*this, "expander")
{ }
@@ -8897,7 +9731,7 @@ public:
DECLARE_READ8_MEMBER(read_k);
void set_clock();
- DECLARE_INPUT_CHANGED_MEMBER(skill_switch);
+ DECLARE_INPUT_CHANGED_MEMBER(skill_switch) { set_clock(); }
void tbreakup(machine_config &config);
protected:
@@ -8905,8 +9739,30 @@ protected:
virtual void machine_start() override;
};
+void tbreakup_state::machine_start()
+{
+ hh_tms1k_state::machine_start();
+
+ // zerofill/register for savestates
+ memset(m_exp_port, 0, sizeof(m_exp_port));
+ save_item(NAME(m_exp_port));
+}
+
+void tbreakup_state::machine_reset()
+{
+ hh_tms1k_state::machine_reset();
+ set_clock();
+ m_expander->write_ms(1); // Vss
+}
+
// handlers
+void tbreakup_state::set_clock()
+{
+ // MCU clock is from an analog circuit with resistor of 73K, PRO2 adds 100K
+ m_maincpu->set_unscaled_clock((m_inp_matrix[3]->read() & 1) ? 500000 : 325000);
+}
+
void tbreakup_state::prepare_display()
{
// 7seg leds from R0,R1 and O0-O6
@@ -8989,33 +9845,6 @@ static INPUT_PORTS_START( tbreakup )
PORT_CONFSETTING( 0x01, "Pro 2" )
INPUT_PORTS_END
-INPUT_CHANGED_MEMBER(tbreakup_state::skill_switch)
-{
- set_clock();
-}
-
-void tbreakup_state::set_clock()
-{
- // MCU clock is from an analog circuit with resistor of 73K, PRO2 adds 100K
- m_maincpu->set_unscaled_clock((m_inp_matrix[3]->read() & 1) ? 500000 : 325000);
-}
-
-void tbreakup_state::machine_reset()
-{
- hh_tms1k_state::machine_reset();
- set_clock();
- m_expander->write_ms(1); // Vss
-}
-
-void tbreakup_state::machine_start()
-{
- hh_tms1k_state::machine_start();
-
- // zerofill/register for savestates
- memset(m_exp_port, 0, sizeof(m_exp_port));
- save_item(NAME(m_exp_port));
-}
-
void tbreakup_state::tbreakup(machine_config &config)
{
/* basic machine hardware */
@@ -9042,6 +9871,18 @@ void tbreakup_state::tbreakup(machine_config &config)
m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25);
}
+// roms
+
+ROM_START( tbreakup )
+ ROM_REGION( 0x0400, "maincpu", 0 )
+ ROM_LOAD( "mp2726a", 0x0000, 0x0400, CRC(1f7c28e2) SHA1(164cda4eb3f0b1d20955212a197c9aadf8d18a06) )
+
+ ROM_REGION( 867, "maincpu:mpla", 0 )
+ ROM_LOAD( "tms1000_common2_micro.pla", 0, 867, CRC(d33da3cf) SHA1(13c4ebbca227818db75e6db0d45b66ba5e207776) )
+ ROM_REGION( 365, "maincpu:opla", 0 )
+ ROM_LOAD( "tms1000_tbreakup_output.pla", 0, 365, CRC(a1ea035e) SHA1(fcf0b57ed90b41441a8974223a697f530daac0ab) )
+ROM_END
+
@@ -9078,8 +9919,8 @@ void tbreakup_state::tbreakup(machine_config &config)
class phpball_state : public hh_tms1k_state
{
public:
- phpball_state(const machine_config &mconfig, device_type type, const char *tag)
- : hh_tms1k_state(mconfig, type, tag)
+ phpball_state(const machine_config &mconfig, device_type type, const char *tag) :
+ hh_tms1k_state(mconfig, type, tag)
{ }
void prepare_display();
@@ -9087,7 +9928,7 @@ public:
DECLARE_WRITE16_MEMBER(write_o);
DECLARE_READ8_MEMBER(read_k);
- DECLARE_INPUT_CHANGED_MEMBER(flipper_button);
+ DECLARE_INPUT_CHANGED_MEMBER(flipper_button) { prepare_display(); }
void phpball(machine_config &config);
};
@@ -9144,11 +9985,6 @@ static INPUT_PORTS_START( phpball )
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("Left Flipper") PORT_CHANGED_MEMBER(DEVICE_SELF, phpball_state, flipper_button, nullptr)
INPUT_PORTS_END
-INPUT_CHANGED_MEMBER(phpball_state::flipper_button)
-{
- prepare_display();
-}
-
void phpball_state::phpball(machine_config &config)
{
/* basic machine hardware */
@@ -9158,7 +9994,7 @@ void phpball_state::phpball(machine_config &config)
m_maincpu->o().set(FUNC(phpball_state::write_o));
TIMER(config, "display_decay").configure_periodic(FUNC(hh_tms1k_state::display_decay_tick), attotime::from_msec(1));
- config.set_default_layout(layout_hh_tms1k_test);
+ config.set_default_layout(layout_phpball);
/* sound hardware */
SPEAKER(config, "mono").front_center();
@@ -9166,6 +10002,18 @@ void phpball_state::phpball(machine_config &config)
m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25);
}
+// roms
+
+ROM_START( phpball )
+ ROM_REGION( 0x0800, "maincpu", 0 )
+ ROM_LOAD( "mp1180", 0x0000, 0x0800, CRC(2163b92d) SHA1(bc53d1911e88b4e89d951c6f769703105c13389c) )
+
+ ROM_REGION( 867, "maincpu:mpla", 0 )
+ ROM_LOAD( "tms1100_common2_micro.pla", 0, 867, CRC(7cc90264) SHA1(c6e1cf1ffb178061da9e31858514f7cd94e86990) )
+ ROM_REGION( 365, "maincpu:opla", 0 )
+ ROM_LOAD( "tms1100_phpball_output.pla", 0, 365, CRC(87e67aaf) SHA1(ebc7bae1352f39173f1bf0dc10cdc6f635dedab4) )
+ROM_END
+
@@ -9186,8 +10034,8 @@ void phpball_state::phpball(machine_config &config)
class ssports4_state : public hh_tms1k_state
{
public:
- ssports4_state(const machine_config &mconfig, device_type type, const char *tag)
- : hh_tms1k_state(mconfig, type, tag)
+ ssports4_state(const machine_config &mconfig, device_type type, const char *tag) :
+ hh_tms1k_state(mconfig, type, tag)
{ }
void prepare_display();
@@ -9302,6 +10150,18 @@ void ssports4_state::ssports4(machine_config &config)
m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25);
}
+// roms
+
+ROM_START( ssports4 )
+ ROM_REGION( 0x0800, "maincpu", 0 )
+ ROM_LOAD( "mp1219", 0x0000, 0x0800, CRC(865c06d6) SHA1(12a625a13bdb57b82b35c42b175d38756a1e2e04) )
+
+ ROM_REGION( 867, "maincpu:mpla", 0 )
+ ROM_LOAD( "tms1100_common2_micro.pla", 0, 867, BAD_DUMP CRC(7cc90264) SHA1(c6e1cf1ffb178061da9e31858514f7cd94e86990) ) // not verified
+ ROM_REGION( 365, "maincpu:opla", 0 )
+ ROM_LOAD( "tms1100_ssports4_output.pla", 0, 365, NO_DUMP )
+ROM_END
+
@@ -9320,12 +10180,12 @@ void ssports4_state::ssports4(machine_config &config)
class xl25_state : public hh_tms1k_state
{
public:
- xl25_state(const machine_config &mconfig, device_type type, const char *tag)
- : hh_tms1k_state(mconfig, type, tag)
+ xl25_state(const machine_config &mconfig, device_type type, const char *tag) :
+ hh_tms1k_state(mconfig, type, tag)
{ }
void update_halt();
- DECLARE_INPUT_CHANGED_MEMBER(k4_button);
+ DECLARE_INPUT_CHANGED_MEMBER(k4_button) { update_halt(); }
void prepare_display();
DECLARE_WRITE16_MEMBER(write_r);
@@ -9337,13 +10197,19 @@ protected:
virtual void machine_reset() override;
};
+void xl25_state::machine_reset()
+{
+ hh_tms1k_state::machine_reset();
+ update_halt();
+}
+
// handlers
void xl25_state::update_halt()
{
// O5+K4 go to HALT pin (used when pressing store/recall button)
bool halt = !((m_o & 0x20) || (read_k(machine().dummy_space(), 0) & 4));
- m_maincpu->set_input_line(TMS1XXX_INPUT_LINE_HALT, halt ? ASSERT_LINE : CLEAR_LINE);
+ m_maincpu->set_input_line(INPUT_LINE_HALT, halt ? ASSERT_LINE : CLEAR_LINE);
}
void xl25_state::prepare_display()
@@ -9443,17 +10309,6 @@ static INPUT_PORTS_START( xl25 )
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED )
INPUT_PORTS_END
-INPUT_CHANGED_MEMBER(xl25_state::k4_button)
-{
- update_halt();
-}
-
-void xl25_state::machine_reset()
-{
- hh_tms1k_state::machine_reset();
- update_halt();
-}
-
void xl25_state::xl25(machine_config &config)
{
/* basic machine hardware */
@@ -9471,833 +10326,7 @@ void xl25_state::xl25(machine_config &config)
m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25);
}
-
-
-
-
-/***************************************************************************
-
- Game driver(s)
-
-***************************************************************************/
-
-ROM_START( matchnum )
- ROM_REGION( 0x0400, "maincpu", 0 )
- ROM_LOAD( "mp0163", 0x0000, 0x0400, CRC(37507600) SHA1(b1d4d8ea563e97ef378b42c44cb3ea4eb6abe0d2) )
-
- ROM_REGION( 867, "maincpu:mpla", 0 )
- ROM_LOAD( "tms1000_common2_micro.pla", 0, 867, CRC(d33da3cf) SHA1(13c4ebbca227818db75e6db0d45b66ba5e207776) )
- ROM_REGION( 365, "maincpu:opla", 0 )
- ROM_LOAD( "tms1000_matchnum_output.pla", 0, 365, CRC(da29670c) SHA1(bcec28bf25dc8c81d08851ad8a3f4e89f413017a) )
-ROM_END
-
-
-ROM_START( arrball )
- ROM_REGION( 0x0400, "maincpu", 0 )
- ROM_LOAD( "mp0166", 0x0000, 0x0400, CRC(a78694db) SHA1(362aa6e356288e8df7da610246bd01fe72985d57) )
-
- ROM_REGION( 867, "maincpu:mpla", 0 )
- ROM_LOAD( "tms1000_common2_micro.pla", 0, 867, CRC(d33da3cf) SHA1(13c4ebbca227818db75e6db0d45b66ba5e207776) )
- ROM_REGION( 365, "maincpu:opla", 0 )
- ROM_LOAD( "tms1000_arrball_output.pla", 0, 365, CRC(ffc206fb) SHA1(339be3f066fb2f075211c554e81260b49cd83d15) )
-ROM_END
-
-
-ROM_START( mathmagi )
- ROM_REGION( 0x0800, "maincpu", 0 )
- ROM_LOAD( "mp1030", 0x0000, 0x0800, CRC(a81d7ccb) SHA1(4756ce42f1ea28ce5fe6498312f8306f10370969) )
-
- ROM_REGION( 867, "maincpu:mpla", 0 )
- ROM_LOAD( "tms1100_common2_micro.pla", 0, 867, BAD_DUMP CRC(7cc90264) SHA1(c6e1cf1ffb178061da9e31858514f7cd94e86990) ) // not verified
- ROM_REGION( 365, "maincpu:opla", 0 )
- ROM_LOAD( "tms1100_mathmagi_output.pla", 0, 365, NO_DUMP )
-ROM_END
-
-
-ROM_START( bcheetah )
- ROM_REGION( 0x0400, "maincpu", 0 )
- ROM_LOAD( "mp0915", 0x0000, 0x0400, CRC(2968c81e) SHA1(d1e6691952600e88ccf626cb3d683419a1e8468c) )
-
- ROM_REGION( 867, "maincpu:mpla", 0 )
- ROM_LOAD( "tms1000_common2_micro.pla", 0, 867, CRC(d33da3cf) SHA1(13c4ebbca227818db75e6db0d45b66ba5e207776) )
- ROM_REGION( 365, "maincpu:opla", 0 )
- ROM_LOAD( "tms1000_bcheetah_output.pla", 0, 365, CRC(cc6d1ecd) SHA1(b0635a841d8850c36c1f414abe0571b81884b972) )
-ROM_END
-
-
-ROM_START( amaztron )
- ROM_REGION( 0x0800, "maincpu", 0 )
- ROM_LOAD( "mp3405", 0x0000, 0x0800, CRC(9cbc0009) SHA1(17772681271b59280687492f37fa0859998f041d) )
-
- ROM_REGION( 867, "maincpu:mpla", 0 )
- ROM_LOAD( "tms1100_common3_micro.pla", 0, 867, CRC(03574895) SHA1(04407cabfb3adee2ee5e4218612cb06c12c540f4) )
- ROM_REGION( 365, "maincpu:opla", 0 )
- ROM_LOAD( "tms1100_amaztron_output.pla", 0, 365, CRC(f3875384) SHA1(3c256a3db4f0aa9d93cf78124db39f4cbdc57e4a) )
-ROM_END
-
-
-ROM_START( zodiac )
- ROM_REGION( 0x0800, "maincpu", 0 )
- ROM_LOAD( "mp3435", 0x0000, 0x0800, CRC(ecdc3160) SHA1(a7e82d66314a039fcffeddf99919d9f9ad42d61d) )
-
- ROM_REGION( 867, "maincpu:mpla", 0 )
- ROM_LOAD( "tms1100_common3_micro.pla", 0, 867, BAD_DUMP CRC(03574895) SHA1(04407cabfb3adee2ee5e4218612cb06c12c540f4) ) // not verified
- ROM_REGION( 365, "maincpu:opla", 0 )
- ROM_LOAD( "tms1100_zodiac_output.pla", 0, 365, NO_DUMP )
-ROM_END
-
-
-ROM_START( cqback )
- ROM_REGION( 0x0800, "maincpu", 0 )
- ROM_LOAD( "mp3415.u4", 0x0000, 0x0800, CRC(65ebdabf) SHA1(9b5cf5adaf9132ced87f611ae8c3148b9b62ba89) )
-
- ROM_REGION( 867, "maincpu:mpla", 0 )
- ROM_LOAD( "tms1100_common3_micro.pla", 0, 867, CRC(03574895) SHA1(04407cabfb3adee2ee5e4218612cb06c12c540f4) )
- ROM_REGION( 365, "maincpu:opla", 0 )
- ROM_LOAD( "tms1100_cqback_output.pla", 0, 365, CRC(c6dcbfd0) SHA1(593b6b7de981a28d1b4a33336b39df92d02ed4f4) )
-ROM_END
-
-
-ROM_START( h2hfootb )
- ROM_REGION( 0x0800, "maincpu", 0 )
- ROM_LOAD( "mp3460.u3", 0x0000, 0x0800, CRC(3a4e53a8) SHA1(5052e706f992c6c4bada1fa7769589eec3df6471) )
-
- ROM_REGION( 867, "maincpu:mpla", 0 )
- ROM_LOAD( "tms1100_common1_micro.pla", 0, 867, CRC(62445fc9) SHA1(d6297f2a4bc7a870b76cc498d19dbb0ce7d69fec) )
- ROM_REGION( 365, "maincpu:opla", 0 )
- ROM_LOAD( "tms1100_h2hfootb_output.pla", 0, 365, CRC(c8d85873) SHA1(16bd6fc8e3cd16d5f8fd32d0c74e67de77f5487e) )
-ROM_END
-
-
-ROM_START( h2hhockey )
- ROM_REGION( 0x0400, "maincpu", 0 )
- ROM_LOAD( "mp3321a", 0x0000, 0x0400, CRC(e974e604) SHA1(ed740c98ce96ad70ee5237eccae1f54a75ad8100) )
-
- ROM_REGION( 867, "maincpu:mpla", 0 )
- ROM_LOAD( "tms1000_common1_micro.pla", 0, 867, CRC(4becec19) SHA1(3c8a9be0f00c88c81f378b76886c39b10304f330) )
- ROM_REGION( 365, "maincpu:opla", 0 )
- ROM_LOAD( "tms1000_h2hhockey_output.pla", 0, 365, CRC(9d1a91e1) SHA1(96303eb22375129b0dfbfcd823c8ca5b919511bc) )
-ROM_END
-
-
-ROM_START( h2hbaseb )
- ROM_REGION( 0x0800, "maincpu", 0 )
- ROM_LOAD( "mp1525", 0x0000, 0x0800, CRC(b5d6bf9b) SHA1(2cc9f35f077c1209c46d16ec853af87e4725c2fd) )
-
- ROM_REGION( 867, "maincpu:mpla", 0 )
- ROM_LOAD( "tms1100_common1_micro.pla", 0, 867, CRC(62445fc9) SHA1(d6297f2a4bc7a870b76cc498d19dbb0ce7d69fec) )
- ROM_REGION( 365, "maincpu:opla", 0 )
- ROM_LOAD( "tms1100_h2hbaseb_output.pla", 0, 365, CRC(cb3d7e38) SHA1(6ab4a7c52e6010b7c7158463cb499973e52ff556) )
-ROM_END
-
-
-ROM_START( h2hboxing )
- ROM_REGION( 0x0800, "maincpu", 0 )
- ROM_LOAD( "m34018", 0x0000, 0x0800, CRC(e26a11a3) SHA1(aa2735088d709fa8d9188c4fb7982a53e3a8c1bc) )
-
- ROM_REGION( 867, "maincpu:mpla", 0 )
- ROM_LOAD( "tms1100_common1_micro.pla", 0, 867, CRC(62445fc9) SHA1(d6297f2a4bc7a870b76cc498d19dbb0ce7d69fec) )
- ROM_REGION( 365, "maincpu:opla", 0 )
- ROM_LOAD( "tms1100_h2hboxing_output.pla", 0, 365, CRC(ffb0e63d) SHA1(31ee3f779270a23f05f9ad508283d2569ef069f1) )
-ROM_END
-
-
-ROM_START( quizwizc )
- ROM_REGION( 0x0400, "maincpu", 0 )
- ROM_LOAD( "m32001", 0x0000, 0x0400, CRC(053657eb) SHA1(38c84f7416f79aa679f434a3d35df54cd9aa528a) )
-
- ROM_REGION( 867, "maincpu:mpla", 0 )
- ROM_LOAD( "tms1000_common3_micro.pla", 0, 867, CRC(80912d0a) SHA1(7ae5293ed4d93f5b7a64d43fe30c3639f39fbe5a) )
- ROM_REGION( 365, "maincpu:opla", 0 )
- ROM_LOAD( "tms1000_quizwizc_output.pla", 0, 365, CRC(475b7053) SHA1(8f61bf736eb41d7029a6b165cc0a184ba0a70a2a) )
-ROM_END
-
-
-ROM_START( tc4 )
- ROM_REGION( 0x1000, "maincpu", 0 )
- ROM_LOAD( "mp7334", 0x0000, 0x1000, CRC(923f3821) SHA1(a9ae342d7ff8dae1dedcd1e4984bcfae68586581) )
-
- ROM_REGION( 867, "maincpu:mpla", 0 )
- ROM_LOAD( "tms1100_common1_micro.pla", 0, 867, CRC(62445fc9) SHA1(d6297f2a4bc7a870b76cc498d19dbb0ce7d69fec) )
- ROM_REGION( 557, "maincpu:opla", 0 )
- ROM_LOAD( "tms1400_tc4_output.pla", 0, 557, CRC(3b908725) SHA1(f83bf5faa5b3cb51f87adc1639b00d6f9a71ad19) )
-ROM_END
-
-
-ROM_START( cnbaskb )
- ROM_REGION( 0x0400, "maincpu", 0 )
- ROM_LOAD( "mp0907", 0x0000, 0x0400, CRC(35f84f0f) SHA1(744ca60bb853a2785184042e747530a9e02488f8) )
-
- ROM_REGION( 867, "maincpu:mpla", 0 )
- ROM_LOAD( "tms1000_common2_micro.pla", 0, 867, CRC(d33da3cf) SHA1(13c4ebbca227818db75e6db0d45b66ba5e207776) )
- ROM_REGION( 365, "maincpu:opla", 0 )
- ROM_LOAD( "tms1000_cnbaskb_output.pla", 0, 365, CRC(b4e28956) SHA1(8356112da71b351420a88d7e394e7d03e429368c) )
-ROM_END
-
-
-ROM_START( cmsport )
- ROM_REGION( 0x0400, "maincpu", 0 )
- ROM_LOAD( "mp0168.u1", 0x0000, 0x0400, CRC(0712a268) SHA1(bd4e23e5c17b28c52e7e769e44773cc9c8839bed) )
-
- ROM_REGION( 867, "maincpu:mpla", 0 )
- ROM_LOAD( "tms1000_common2_micro.pla", 0, 867, CRC(d33da3cf) SHA1(13c4ebbca227818db75e6db0d45b66ba5e207776) )
- ROM_REGION( 365, "maincpu:opla", 0 )
- ROM_LOAD( "tms1000_cmsport_output.pla", 0, 365, CRC(7defa140) SHA1(477e3cb55e79938d6acaa911e410f6dcb974c218) )
-ROM_END
-
-
-ROM_START( cnfball )
- ROM_REGION( 0x0400, "maincpu", 0 )
- ROM_LOAD( "mp0170", 0x0000, 0x0400, CRC(50e8a44f) SHA1(fea6ae03c4ef329d825f8688e6854df15023d47e) )
-
- ROM_REGION( 867, "maincpu:mpla", 0 )
- ROM_LOAD( "tms1000_common2_micro.pla", 0, 867, CRC(d33da3cf) SHA1(13c4ebbca227818db75e6db0d45b66ba5e207776) )
- ROM_REGION( 365, "maincpu:opla", 0 )
- ROM_LOAD( "tms1000_cnfball_output.pla", 0, 365, CRC(0af52f64) SHA1(b4cf450e4d895eddb67448aa69e4f18a5a84e033) )
-ROM_END
-
-
-ROM_START( cnfball2 )
- ROM_REGION( 0x0800, "maincpu", 0 )
- ROM_LOAD( "mp1181", 0x0000, 0x0800, CRC(4553a840) SHA1(2e1132c9bc51641f77ba7f2430b5a3b2766b3a3d) )
-
- ROM_REGION( 867, "maincpu:mpla", 0 )
- ROM_LOAD( "tms1100_common2_micro.pla", 0, 867, BAD_DUMP CRC(7cc90264) SHA1(c6e1cf1ffb178061da9e31858514f7cd94e86990) ) // not verified
- ROM_REGION( 365, "maincpu:opla", 0 )
- ROM_LOAD( "tms1100_cnfball2_output.pla", 0, 365, NO_DUMP )
-ROM_END
-
-
-ROM_START( eleciq )
- ROM_REGION( 0x0400, "maincpu", 0 )
- ROM_LOAD( "mp0908", 0x0000, 0x0400, CRC(db59b82c) SHA1(c9a6bcba208969560495ad9f8775f53de16a69c3) )
-
- ROM_REGION( 867, "maincpu:mpla", 0 )
- ROM_LOAD( "tms1000_common2_micro.pla", 0, 867, CRC(d33da3cf) SHA1(13c4ebbca227818db75e6db0d45b66ba5e207776) )
- ROM_REGION( 365, "maincpu:opla", 0 )
- ROM_LOAD( "tms1000_eleciq_output.pla", 0, 365, CRC(b8e04232) SHA1(22eed6d9b1fb1e5c9974ea3df16cda71a39aad57) )
-ROM_END
-
-
-ROM_START( esoccer )
- ROM_REGION( 0x0400, "maincpu", 0 )
- ROM_LOAD( "mp0158.ic1", 0x0000, 0x0400, CRC(ae4581ea) SHA1(5f6881f8247094abf8cffb17f6e6586e94cff38c) )
-
- ROM_REGION( 867, "maincpu:mpla", 0 )
- ROM_LOAD( "tms1000_common2_micro.pla", 0, 867, CRC(d33da3cf) SHA1(13c4ebbca227818db75e6db0d45b66ba5e207776) )
- ROM_REGION( 365, "maincpu:opla", 0 )
- ROM_LOAD( "tms1000_esoccer_output.pla", 0, 365, CRC(c6eeabbd) SHA1(99d07902126b5a1c1abf43340f30d3390da5fa92) )
-ROM_END
-
-
-ROM_START( ebball )
- ROM_REGION( 0x0400, "maincpu", 0 )
- ROM_LOAD( "mp0914", 0x0000, 0x0400, CRC(3c6fb05b) SHA1(b2fe4b3ca72d6b4c9bfa84d67f64afdc215e7178) )
-
- ROM_REGION( 867, "maincpu:mpla", 0 )
- ROM_LOAD( "tms1000_common2_micro.pla", 0, 867, CRC(d33da3cf) SHA1(13c4ebbca227818db75e6db0d45b66ba5e207776) )
- ROM_REGION( 365, "maincpu:opla", 0 )
- ROM_LOAD( "tms1000_ebball_output.pla", 0, 365, CRC(062bf5bb) SHA1(8d73ee35444299595961225528b153e3a5fe66bf) )
-ROM_END
-
-
-ROM_START( ebball2 )
- ROM_REGION( 0x0400, "maincpu", 0 )
- ROM_LOAD( "mp0923", 0x0000, 0x0400, CRC(077acfe2) SHA1(a294ce7614b2cdb01c754a7a50d60d807e3f0939) )
-
- ROM_REGION( 867, "maincpu:mpla", 0 )
- ROM_LOAD( "tms1000_common2_micro.pla", 0, 867, CRC(d33da3cf) SHA1(13c4ebbca227818db75e6db0d45b66ba5e207776) )
- ROM_REGION( 365, "maincpu:opla", 0 )
- ROM_LOAD( "tms1000_ebball2_output.pla", 0, 365, CRC(adcd73d1) SHA1(d69e590d288ef99293d86716498f3971528e30de) )
-ROM_END
-
-
-ROM_START( ebball3 )
- ROM_REGION( 0x0800, "maincpu", 0 )
- ROM_LOAD( "6007_mp1204", 0x0000, 0x0800, CRC(987a29ba) SHA1(9481ae244152187d85349d1a08e439e798182938) )
-
- ROM_REGION( 867, "maincpu:mpla", 0 )
- ROM_LOAD( "tms1100_common2_micro.pla", 0, 867, CRC(7cc90264) SHA1(c6e1cf1ffb178061da9e31858514f7cd94e86990) )
- ROM_REGION( 365, "maincpu:opla", 0 )
- ROM_LOAD( "tms1100_ebball3_output.pla", 0, 365, CRC(00db663b) SHA1(6eae12503364cfb1f863df0e57970d3e766ec165) )
-ROM_END
-
-
-ROM_START( esbattle )
- ROM_REGION( 0x0400, "maincpu", 0 )
- ROM_LOAD( "en-6004_mp0920", 0x0000, 0x0400, CRC(7460c179) SHA1(be855054b4a98b05b34fd931d5c247c5c0f9b036) )
-
- ROM_REGION( 867, "maincpu:mpla", 0 )
- ROM_LOAD( "tms1000_common2_micro.pla", 0, 867, CRC(d33da3cf) SHA1(13c4ebbca227818db75e6db0d45b66ba5e207776) )
- ROM_REGION( 365, "maincpu:opla", 0 )
- ROM_LOAD( "tms1000_esbattle_output.pla", 0, 365, CRC(861b45a2) SHA1(a5a9dc9bef8adb761845ad548058b55e970517d3) )
-ROM_END
-
-
-ROM_START( einvader )
- ROM_REGION( 0x0800, "maincpu", 0 )
- ROM_LOAD( "mp1211", 0x0000, 0x0800, CRC(b6efbe8e) SHA1(d7d54921dab22bb0c2956c896a5d5b56b6f64969) )
-
- ROM_REGION( 867, "maincpu:mpla", 0 )
- ROM_LOAD( "tms1100_common2_micro.pla", 0, 867, CRC(7cc90264) SHA1(c6e1cf1ffb178061da9e31858514f7cd94e86990) )
- ROM_REGION( 365, "maincpu:opla", 0 )
- ROM_LOAD( "tms1100_einvader_output.pla", 0, 365, CRC(490158e1) SHA1(61cace1eb09244663de98d8fb04d9459b19668fd) )
-
- ROM_REGION( 44398, "svg", 0)
- ROM_LOAD( "einvader.svg", 0, 44398, CRC(48de88fd) SHA1(56a2b9c997a447277b45902ab542eda54e7d5a2f) )
-ROM_END
-
-
-ROM_START( efootb4 )
- ROM_REGION( 0x1000, "maincpu", 0 )
- ROM_LOAD( "6009_mp7551", 0x0000, 0x1000, CRC(54fa7244) SHA1(4d16bd825c4a2db76ca8a263c373ade15c20e270) )
-
- ROM_REGION( 867, "maincpu:mpla", 0 )
- ROM_LOAD( "tms1100_common2_micro.pla", 0, 867, CRC(7cc90264) SHA1(c6e1cf1ffb178061da9e31858514f7cd94e86990) )
- ROM_REGION( 557, "maincpu:opla", 0 )
- ROM_LOAD( "tms1400_efootb4_output.pla", 0, 557, CRC(5c87c753) SHA1(bde9d4aa1e57a718affd969475c0a1edcf60f444) )
-ROM_END
-
-
-ROM_START( ebaskb2 )
- ROM_REGION( 0x0800, "maincpu", 0 )
- ROM_LOAD( "6010_mp1218", 0x0000, 0x0800, CRC(0089ede8) SHA1(c8a79d5aca7e37b637a4d152150acba9f41aad96) )
-
- ROM_REGION( 867, "maincpu:mpla", 0 )
- ROM_LOAD( "tms1100_common2_micro.pla", 0, 867, CRC(7cc90264) SHA1(c6e1cf1ffb178061da9e31858514f7cd94e86990) )
- ROM_REGION( 365, "maincpu:opla", 0 )
- ROM_LOAD( "tms1100_ebaskb2_output.pla", 0, 365, CRC(c18103ae) SHA1(5a9bb8e1d95a9f6919b05ff9471fa0a8014b8b81) )
-ROM_END
-
-
-ROM_START( raisedvl )
- ROM_REGION( 0x0800, "maincpu", 0 )
- ROM_LOAD( "mp1221", 0x0000, 0x0800, CRC(782791cc) SHA1(214249406fcaf44efc6350022bd534e59ec69c88) )
-
- ROM_REGION( 867, "maincpu:mpla", 0 )
- ROM_LOAD( "tms1100_common2_micro.pla", 0, 867, CRC(7cc90264) SHA1(c6e1cf1ffb178061da9e31858514f7cd94e86990) )
- ROM_REGION( 365, "maincpu:opla", 0 )
- ROM_LOAD( "tms1100_raisedvl_output.pla", 0, 365, CRC(00db663b) SHA1(6eae12503364cfb1f863df0e57970d3e766ec165) )
-ROM_END
-
-
-ROM_START( f2pbball )
- ROM_REGION( 0x0400, "maincpu", 0 )
- ROM_LOAD( "mp0154", 0x0000, 0x0400, CRC(c5b45ace) SHA1(b2de32e83ab447b22d6828f0081843f364040b01) )
-
- ROM_REGION( 867, "maincpu:mpla", 0 )
- ROM_LOAD( "tms1000_common2_micro.pla", 0, 867, CRC(d33da3cf) SHA1(13c4ebbca227818db75e6db0d45b66ba5e207776) )
- ROM_REGION( 365, "maincpu:opla", 0 )
- ROM_LOAD( "tms1000_f2pbball_output.pla", 0, 365, CRC(30c2f28f) SHA1(db969b22475f37f083c3594f5e4f5759048377b8) )
-ROM_END
-
-
-ROM_START( f3in1 )
- ROM_REGION( 0x0800, "maincpu", 0 )
- ROM_LOAD( "mp1185", 0x0000, 0x0800, CRC(53f7b28d) SHA1(2249890e3a259095193b4331ca88c29ccd81eefe) )
-
- ROM_REGION( 867, "maincpu:mpla", 0 )
- ROM_LOAD( "tms1100_common2_micro.pla", 0, 867, CRC(7cc90264) SHA1(c6e1cf1ffb178061da9e31858514f7cd94e86990) )
- ROM_REGION( 365, "maincpu:opla", 0 )
- ROM_LOAD( "tms1100_f3in1_output.pla", 0, 365, CRC(51d947bc) SHA1(f766397d84f038be96e83d40989195c98ddcb1d9) )
-ROM_END
-
-
-ROM_START( gpoker )
- ROM_REGION( 0x0800, "maincpu", 0 )
- ROM_LOAD( "mp2105", 0x0000, 0x0800, CRC(95a8f5b4) SHA1(d14f00ba9f57e437264d972baa14a14a28ff8719) )
-
- ROM_REGION( 867, "maincpu:mpla", 0 )
- ROM_LOAD( "tms1100_common2_micro.pla", 0, 867, CRC(7cc90264) SHA1(c6e1cf1ffb178061da9e31858514f7cd94e86990) )
- ROM_REGION( 365, "maincpu:opla", 0 )
- ROM_LOAD( "tms1100_gpoker_output.pla", 0, 365, CRC(f7e2d812) SHA1(cc3abd89afb1d2145dc47636553ccd0ba7de70d9) )
-ROM_END
-
-
-ROM_START( gjackpot )
- ROM_REGION( 0x1000, "maincpu", 0 )
- ROM_LOAD( "mpf553", 0x0000, 0x1000, CRC(f45fd008) SHA1(8d5d6407a8a031a833ceedfb931f5c9d2725ecd0) )
-
- ROM_REGION( 867, "maincpu:mpla", 0 )
- ROM_LOAD( "tms1100_common2_micro.pla", 0, 867, CRC(7cc90264) SHA1(c6e1cf1ffb178061da9e31858514f7cd94e86990) )
- ROM_REGION( 557, "maincpu:opla", 0 )
- ROM_LOAD( "tms1400_gjackpot_output.pla", 0, 557, CRC(50e471a7) SHA1(9d862cb9f51a563882b62662c5bfe61b52e3df00) )
-ROM_END
-
-
-ROM_START( ginv1000 )
- ROM_REGION( 0x0800, "maincpu", 0 )
- ROM_LOAD( "mp2139", 0x0000, 0x0800, CRC(036eab37) SHA1(0795878ad89296f7a6a0314c6e4db23c1cc3673e) )
-
- ROM_REGION( 867, "maincpu:mpla", 0 )
- ROM_LOAD( "tms1100_common2_micro.pla", 0, 867, CRC(7cc90264) SHA1(c6e1cf1ffb178061da9e31858514f7cd94e86990) )
- ROM_REGION( 365, "maincpu:opla", 0 )
- ROM_LOAD( "tms1100_ginv1000_output.pla", 0, 365, CRC(b0a5dc41) SHA1(d94746ec48661998173e7f60ccc7c96e56b3484e) )
-
- ROM_REGION( 226185, "svg", 0)
- ROM_LOAD( "ginv1000.svg", 0, 226185, CRC(1e1bafd1) SHA1(15868ef0c9dadbf537fed0e2d846451ba99fab7b) )
-ROM_END
-
-
-ROM_START( ginv2000 )
- ROM_REGION( 0x0800, "maincpu", 0 )
- ROM_LOAD( "mp1604", 0x0000, 0x0800, CRC(f1646d0b) SHA1(65601931d81e3eef7bf22a08de5a146910ce8137) )
-
- ROM_REGION( 867, "maincpu:mpla", 0 )
- ROM_LOAD( "tms1100_common2_micro.pla", 0, 867, CRC(7cc90264) SHA1(c6e1cf1ffb178061da9e31858514f7cd94e86990) )
- ROM_REGION( 365, "maincpu:opla", 0 )
- ROM_LOAD( "tms1100_ginv2000_output.pla", 0, 365, CRC(520bb003) SHA1(1640ae54f8dcc257e0ad0cbe0281b38fcbd8da35) )
-
- ROM_REGION( 374443, "svg", 0)
- ROM_LOAD( "ginv2000.svg", 0, 374443, CRC(a4ce1e6d) SHA1(57d9ff05d634a8d495b9d544a2a959790cd10b6b) )
-ROM_END
-
-
-ROM_START( fxmcr165 )
- ROM_REGION( 0x0800, "maincpu", 0 )
- ROM_LOAD( "mp1312", 0x0000, 0x0800, CRC(6efc8bcc) SHA1(ced8a02b472a3178073691d3dccc0f19f57428fd) )
-
- ROM_REGION( 867, "maincpu:mpla", 0 )
- ROM_LOAD( "tms1100_common1_micro.pla", 0, 867, CRC(62445fc9) SHA1(d6297f2a4bc7a870b76cc498d19dbb0ce7d69fec) )
- ROM_REGION( 365, "maincpu:opla", 0 )
- ROM_LOAD( "tms1100_fxmcr165_output.pla", 0, 365, CRC(ce656866) SHA1(40e1614f5afcc7572fda596e1be453d54e95af0c) )
-ROM_END
-
-
-ROM_START( elecdet )
- ROM_REGION( 0x1000, "maincpu", 0 )
- ROM_LOAD( "mp6100a", 0x0000, 0x1000, CRC(9522fb2d) SHA1(240bdb44b7d67d3b13ebf75851635ac4b4ca2bfd) )
-
- ROM_REGION( 1246, "maincpu:ipla", 0 )
- ROM_LOAD( "tms0980_common1_instr.pla", 0, 1246, CRC(42db9a38) SHA1(2d127d98028ec8ec6ea10c179c25e447b14ba4d0) )
- ROM_REGION( 1982, "maincpu:mpla", 0 )
- ROM_LOAD( "tms0980_common1_micro.pla", 0, 1982, CRC(3709014f) SHA1(d28ee59ded7f3b9dc3f0594a32a98391b6e9c961) )
- ROM_REGION( 352, "maincpu:opla", 0 )
- ROM_LOAD( "tms0980_elecdet_output.pla", 0, 352, CRC(5d12c24a) SHA1(e486802151a704c6273d4a8682c9c374d27d1e6d) )
- ROM_REGION( 157, "maincpu:spla", 0 )
- ROM_LOAD( "tms0980_common1_segment.pla", 0, 157, CRC(399aa481) SHA1(72c56c58fde3fbb657d69647a9543b5f8fc74279) )
-ROM_END
-
-
-ROM_START( starwbc )
- ROM_REGION( 0x0800, "maincpu", 0 )
- ROM_LOAD( "mp3438a", 0x0000, 0x0800, CRC(c12b7069) SHA1(d1f39c69a543c128023ba11cc6228bacdfab04de) )
-
- ROM_REGION( 867, "maincpu:mpla", 0 )
- ROM_LOAD( "tms1100_common3_micro.pla", 0, 867, CRC(03574895) SHA1(04407cabfb3adee2ee5e4218612cb06c12c540f4) )
- ROM_REGION( 365, "maincpu:opla", 0 )
- ROM_LOAD( "tms1100_starwbc_output.pla", 0, 365, CRC(d358a76d) SHA1(06b60b207540e9b726439141acadea9aba718013) )
-ROM_END
-
-ROM_START( starwbcp )
- ROM_REGION( 0x0800, "maincpu", 0 )
- ROM_LOAD( "us4270755", 0x0000, 0x0800, BAD_DUMP CRC(fb3332f2) SHA1(a79ac81e239983cd699b7cfcc55f89b203b2c9ec) ) // from patent US4270755, may have errors
-
- ROM_REGION( 867, "maincpu:mpla", 0 )
- ROM_LOAD( "tms1100_common3_micro.pla", 0, 867, CRC(03574895) SHA1(04407cabfb3adee2ee5e4218612cb06c12c540f4) )
- ROM_REGION( 365, "maincpu:opla", 0 )
- ROM_LOAD( "tms1100_starwbc_output.pla", 0, 365, CRC(d358a76d) SHA1(06b60b207540e9b726439141acadea9aba718013) )
-ROM_END
-
-
-ROM_START( astro )
- ROM_REGION( 0x1000, "maincpu", 0 )
- ROM_LOAD( "mp1133", 0x0000, 0x1000, CRC(bc21109c) SHA1(05a433cce587d5c0c2d28b5fda5f0853ea6726bf) )
-
- ROM_REGION( 867, "maincpu:mpla", 0 )
- ROM_LOAD( "tms1100_common2_micro.pla", 0, 867, CRC(7cc90264) SHA1(c6e1cf1ffb178061da9e31858514f7cd94e86990) )
- ROM_REGION( 557, "maincpu:opla", 0 )
- ROM_LOAD( "tms1400_astro_output.pla", 0, 557, CRC(eb08957e) SHA1(62ae0d13a1eaafb34f1b27d7df51441b400ccd56) )
-ROM_END
-
-
-ROM_START( elecbowl )
- ROM_REGION( 0x0800, "maincpu", 0 )
- ROM_LOAD( "mp3403.u9", 0x0000, 0x0800, CRC(9eabaa7d) SHA1(b1f54587ed7f2bbf3a5d49075c807296384c2b06) )
-
- ROM_REGION( 867, "maincpu:mpla", 0 )
- ROM_LOAD( "tms1100_common3_micro.pla", 0, 867, BAD_DUMP CRC(03574895) SHA1(04407cabfb3adee2ee5e4218612cb06c12c540f4) ) // not verified
- ROM_REGION( 365, "maincpu:opla", 0 )
- ROM_LOAD( "tms1100_elecbowl_output.pla", 0, 365, NO_DUMP )
-ROM_END
-
-
-ROM_START( horseran )
- ROM_REGION( 0x0800, "maincpu", 0 )
- ROM_LOAD( "mp3491", 0x0000, 0x0800, CRC(a0081671) SHA1(a5a07b502c69d429e5bcd1d313e86b6ee057cda6) )
-
- ROM_REGION( 867, "maincpu:mpla", 0 )
- ROM_LOAD( "tms1100_common1_micro.pla", 0, 867, CRC(62445fc9) SHA1(d6297f2a4bc7a870b76cc498d19dbb0ce7d69fec) )
- ROM_REGION( 365, "maincpu:opla", 0 ) // unused
- ROM_LOAD( "tms1100_horseran_output.pla", 0, 365, CRC(0fea09b0) SHA1(27a56fcf2b490e9a7dbbc6ad48cc8aaca4cada94) )
-ROM_END
-
-
-ROM_START( mdndclab )
- ROM_REGION( 0x0800, "maincpu", 0 )
- ROM_LOAD( "m34012", 0x0000, 0x0800, CRC(e851fccd) SHA1(158362c2821678a51554e02dbb2f9ef5aaf5f59f) )
-
- ROM_REGION( 867, "maincpu:mpla", 0 )
- ROM_LOAD( "tms1100_common1_micro.pla", 0, 867, CRC(62445fc9) SHA1(d6297f2a4bc7a870b76cc498d19dbb0ce7d69fec) )
- ROM_REGION( 365, "maincpu:opla", 0 )
- ROM_LOAD( "tms1100_mdndclab_output.pla", 0, 365, CRC(592b40ba) SHA1(63a2531278a665ace54c541101e052eb84413511) )
-ROM_END
-
-
-ROM_START( comp4 )
- ROM_REGION( 0x0400, "maincpu", 0 )
- ROM_LOAD( "tmc0904nl_cp0904a", 0x0000, 0x0400, CRC(6233ee1b) SHA1(738e109b38c97804b4ec52bed80b00a8634ad453) )
-
- ROM_REGION( 782, "maincpu:ipla", 0 )
- ROM_LOAD( "tms0970_common2_instr.pla", 0, 782, CRC(e038fc44) SHA1(dfc280f6d0a5828d1bb14fcd59ac29caf2c2d981) )
- ROM_REGION( 860, "maincpu:mpla", 0 )
- ROM_LOAD( "tms0970_comp4_micro.pla", 0, 860, CRC(ee9d7d9e) SHA1(25484e18f6a07f7cdb21a07220e2f2a82fadfe7b) )
- ROM_REGION( 352, "maincpu:opla", 0 )
- ROM_LOAD( "tms0980_comp4_output.pla", 0, 352, CRC(144ce2d5) SHA1(459b92ad62421932df61b7e3965f1821f9636a2c) )
- ROM_REGION( 157, "maincpu:spla", 0 )
- ROM_LOAD( "tms0980_comp4_segment.pla", 0, 157, CRC(73426b07) SHA1(311be3f95a97936b6d1a4dcfa7746da26318ce54) )
-ROM_END
-
-
-ROM_START( bship )
- ROM_REGION( 0x0400, "maincpu", 0 )
- ROM_LOAD( "mp3201", 0x0000, 0x0400, CRC(bf6104a6) SHA1(8d28b43a2aa39dcbbe71f669cdafc518715812c9) )
-
- ROM_REGION( 867, "maincpu:mpla", 0 )
- ROM_LOAD( "tms1000_common1_micro.pla", 0, 867, CRC(4becec19) SHA1(3c8a9be0f00c88c81f378b76886c39b10304f330) )
- ROM_REGION( 365, "maincpu:opla", 0 )
- ROM_LOAD( "tms1000_bship_output.pla", 0, 365, CRC(ea0570b0) SHA1(6eb803b40717486d7b24939985f245327ac8a7e9) )
-ROM_END
-
-ROM_START( bshipb )
- ROM_REGION( 0x0400, "maincpu", 0 )
- ROM_LOAD( "mp3208", 0x0000, 0x0400, CRC(982fa720) SHA1(1c6dbbe7b9e55d62a510225a88cd2de55fe9b181) )
-
- ROM_REGION( 867, "maincpu:mpla", 0 )
- ROM_LOAD( "tms1000_common1_micro.pla", 0, 867, CRC(4becec19) SHA1(3c8a9be0f00c88c81f378b76886c39b10304f330) )
- ROM_REGION( 365, "maincpu:opla", 0 )
- ROM_LOAD( "tms1000_bshipb_output.pla", 0, 365, BAD_DUMP CRC(74a9a244) SHA1(479c1f1e37cf8f75352e10226b20322906bee813) ) // part of decap photo was obscured
-ROM_END
-
-
-ROM_START( simon )
- ROM_REGION( 0x0400, "maincpu", 0 )
- ROM_LOAD( "tms1000.u1", 0x0000, 0x0400, CRC(9961719d) SHA1(35dddb018a8a2b31f377ab49c1f0cb76951b81c0) )
-
- ROM_REGION( 867, "maincpu:mpla", 0 )
- ROM_LOAD( "tms1000_simon_micro.pla", 0, 867, CRC(52f7c1f1) SHA1(dbc2634dcb98eac173ad0209df487cad413d08a5) )
- ROM_REGION( 365, "maincpu:opla", 0 ) // unused
- ROM_LOAD( "tms1000_simon_output.pla", 0, 365, CRC(2943c71b) SHA1(bd5bb55c57e7ba27e49c645937ec1d4e67506601) )
-ROM_END
-
-ROM_START( simonf )
- ROM_REGION( 0x0400, "maincpu", 0 )
- ROM_LOAD( "mp3300", 0x0000, 0x0400, CRC(b9fcf93a) SHA1(45960e4242a08495f2a99fc5d44728eabd93cd9f) )
-
- ROM_REGION( 867, "maincpu:mpla", 0 )
- ROM_LOAD( "tms1000_simon_micro.pla", 0, 867, CRC(52f7c1f1) SHA1(dbc2634dcb98eac173ad0209df487cad413d08a5) )
- ROM_REGION( 365, "maincpu:opla", 0 ) // unused
- ROM_LOAD( "tms1000_simon_output.pla", 0, 365, CRC(2943c71b) SHA1(bd5bb55c57e7ba27e49c645937ec1d4e67506601) )
-ROM_END
-
-
-ROM_START( ssimon )
- ROM_REGION( 0x0800, "maincpu", 0 )
- ROM_LOAD( "mp3476", 0x0000, 0x0800, CRC(98200571) SHA1(cbd0bcfc11a534aa0be5d011584cdcac58ff437a) )
-
- ROM_REGION( 867, "maincpu:mpla", 0 )
- ROM_LOAD( "tms1100_common1_micro.pla", 0, 867, CRC(62445fc9) SHA1(d6297f2a4bc7a870b76cc498d19dbb0ce7d69fec) )
- ROM_REGION( 365, "maincpu:opla", 0 ) // unused
- ROM_LOAD( "tms1100_ssimon_output.pla", 0, 365, CRC(0fea09b0) SHA1(27a56fcf2b490e9a7dbbc6ad48cc8aaca4cada94) )
-ROM_END
-
-
-ROM_START( bigtrak )
- ROM_REGION( 0x0400, "maincpu", 0 )
- ROM_LOAD( "mp3301a", 0x0000, 0x0400, CRC(1351bcdd) SHA1(68865389c25b541c09a742be61f8fb6488134d4e) )
-
- ROM_REGION( 867, "maincpu:mpla", 0 )
- ROM_LOAD( "tms1000_common3_micro.pla", 0, 867, CRC(80912d0a) SHA1(7ae5293ed4d93f5b7a64d43fe30c3639f39fbe5a) )
- ROM_REGION( 365, "maincpu:opla", 0 )
- ROM_LOAD( "tms1000_bigtrak_output.pla", 0, 365, CRC(63be45f6) SHA1(918e38a223152db883c1a6f7acf56e87d7074734) )
-ROM_END
-
-
-ROM_START( mbdtower )
- ROM_REGION( 0x1000, "maincpu", 0 )
- ROM_LOAD( "mp7332", 0x0000, 0x1000, CRC(ebeab91a) SHA1(7edbff437da371390fa8f28b3d183f833eaa9be9) )
-
- ROM_REGION( 867, "maincpu:mpla", 0 )
- ROM_LOAD( "tms1100_common1_micro.pla", 0, 867, CRC(62445fc9) SHA1(d6297f2a4bc7a870b76cc498d19dbb0ce7d69fec) )
- ROM_REGION( 557, "maincpu:opla", 0 )
- ROM_LOAD( "tms1400_mbdtower_output.pla", 0, 557, CRC(64c84697) SHA1(72ce6d24cedf9c606f1742cd5620f75907246e87) )
-ROM_END
-
-
-ROM_START( arcmania )
- ROM_REGION( 0x0800, "maincpu", 0 )
- ROM_LOAD( "m34078a", 0x0000, 0x0800, CRC(90ea0087) SHA1(9780c9c1ba89300b1bbe72c47e5fec68d8bb6a77) )
-
- ROM_REGION( 867, "maincpu:mpla", 0 )
- ROM_LOAD( "tms1100_common1_micro.pla", 0, 867, CRC(62445fc9) SHA1(d6297f2a4bc7a870b76cc498d19dbb0ce7d69fec) )
- ROM_REGION( 365, "maincpu:opla", 0 )
- ROM_LOAD( "tms1100_arcmania_output.pla", 0, 365, CRC(a1517b15) SHA1(72eedd7fd41de9c9102219f325fe8668a7c02663) )
-ROM_END
-
-
-ROM_START( cnsector )
- ROM_REGION( 0x0400, "maincpu", 0 )
- ROM_LOAD( "mp0905bnl_za0379", 0x0000, 0x0400, CRC(201036e9) SHA1(b37fef86bb2bceaf0ac8bb3745b4702d17366914) )
-
- ROM_REGION( 782, "maincpu:ipla", 0 )
- ROM_LOAD( "tms0970_common2_instr.pla", 0, 782, CRC(e038fc44) SHA1(dfc280f6d0a5828d1bb14fcd59ac29caf2c2d981) )
- ROM_REGION( 860, "maincpu:mpla", 0 )
- ROM_LOAD( "tms0970_cnsector_micro.pla", 0, 860, CRC(059f5bb4) SHA1(2653766f9fd74d41d44013bb6f54c0973a6080c9) )
- ROM_REGION( 352, "maincpu:opla", 0 )
- ROM_LOAD( "tms0980_cnsector_output.pla", 0, 352, CRC(c8bfb9d2) SHA1(30c3c73cec194debdcb1dd01b4adfefaeddf9516) )
- ROM_REGION( 157, "maincpu:spla", 0 )
- ROM_LOAD( "tms0980_common2_segment.pla", 0, 157, CRC(c03cccd8) SHA1(08bc4b597686a7aa8b2c9f43b85b62747ffd455b) )
-ROM_END
-
-
-ROM_START( merlin )
- ROM_REGION( 0x0800, "maincpu", 0 )
- ROM_LOAD( "mp3404", 0x0000, 0x0800, CRC(7515a75d) SHA1(76ca3605d3fde1df62f79b9bb1f534c2a2ae0229) )
-
- ROM_REGION( 867, "maincpu:mpla", 0 )
- ROM_LOAD( "tms1100_common3_micro.pla", 0, 867, CRC(03574895) SHA1(04407cabfb3adee2ee5e4218612cb06c12c540f4) )
- ROM_REGION( 365, "maincpu:opla", 0 )
- ROM_LOAD( "tms1100_merlin_output.pla", 0, 365, CRC(3921b074) SHA1(12bd58e4d6676eb8c7059ef53598279e4f1a32ea) )
-ROM_END
-
-
-ROM_START( mmerlin )
- ROM_REGION( 0x1000, "maincpu", 0 )
- ROM_LOAD( "mp7351", 0x0000, 0x1000, CRC(0f7a4c83) SHA1(242c1278ddfe92c28fd7cd87300e48e7a4827831) )
-
- ROM_REGION( 867, "maincpu:mpla", 0 )
- ROM_LOAD( "tms1100_common1_micro.pla", 0, 867, CRC(62445fc9) SHA1(d6297f2a4bc7a870b76cc498d19dbb0ce7d69fec) )
- ROM_REGION( 557, "maincpu:opla", 0 )
- ROM_LOAD( "tms1400_mmerlin_output.pla", 0, 557, CRC(fd3dcd93) SHA1(f2afc52df700daa0eb7356c7876af9b2966f971b) )
-ROM_END
-
-
-ROM_START( stopthief )
- ROM_REGION( 0x1000, "maincpu", 0 )
- ROM_LOAD( "mp6101b", 0x0000, 0x1000, CRC(b9c9d64a) SHA1(481f8653064c142fe5d9314b750bcd73797b92b2) )
-
- ROM_REGION( 1246, "maincpu:ipla", 0 )
- ROM_LOAD( "tms0980_common1_instr.pla", 0, 1246, CRC(42db9a38) SHA1(2d127d98028ec8ec6ea10c179c25e447b14ba4d0) )
- ROM_REGION( 1982, "maincpu:mpla", 0 )
- ROM_LOAD( "tms0980_common1_micro.pla", 0, 1982, CRC(3709014f) SHA1(d28ee59ded7f3b9dc3f0594a32a98391b6e9c961) )
- ROM_REGION( 352, "maincpu:opla", 0 )
- ROM_LOAD( "tms0980_stopthief_output.pla", 0, 352, CRC(680ca1c1) SHA1(dea6365f2e6b50a52f1a8f1d8417176b905d2bc9) )
- ROM_REGION( 157, "maincpu:spla", 0 )
- ROM_LOAD( "tms0980_common1_segment.pla", 0, 157, CRC(399aa481) SHA1(72c56c58fde3fbb657d69647a9543b5f8fc74279) )
-ROM_END
-
-ROM_START( stopthiefp )
- ROM_REGION( 0x1000, "maincpu", 0 )
- ROM_LOAD16_WORD( "us4341385", 0x0000, 0x1000, CRC(07aec38a) SHA1(0a3d0956495c0d6d9ea771feae6c14a473a800dc) ) // from patent US4341385, data should be correct (it included checksums)
-
- ROM_REGION( 1246, "maincpu:ipla", 0 )
- ROM_LOAD( "tms0980_common1_instr.pla", 0, 1246, CRC(42db9a38) SHA1(2d127d98028ec8ec6ea10c179c25e447b14ba4d0) )
- ROM_REGION( 1982, "maincpu:mpla", 0 )
- ROM_LOAD( "tms0980_common1_micro.pla", 0, 1982, CRC(3709014f) SHA1(d28ee59ded7f3b9dc3f0594a32a98391b6e9c961) )
- ROM_REGION( 352, "maincpu:opla", 0 )
- ROM_LOAD( "tms0980_stopthief_output.pla", 0, 352, CRC(680ca1c1) SHA1(dea6365f2e6b50a52f1a8f1d8417176b905d2bc9) )
- ROM_REGION( 157, "maincpu:spla", 0 )
- ROM_LOAD( "tms0980_common1_segment.pla", 0, 157, CRC(399aa481) SHA1(72c56c58fde3fbb657d69647a9543b5f8fc74279) )
-ROM_END
-
-
-ROM_START( bankshot )
- ROM_REGION( 0x1000, "maincpu", 0 )
- ROM_LOAD( "mp7313", 0x0000, 0x1000, CRC(7a5016a9) SHA1(a8730dc8a282ffaa3d89e675f371d43eb39f39b4) )
-
- ROM_REGION( 867, "maincpu:mpla", 0 )
- ROM_LOAD( "tms1100_common1_micro.pla", 0, 867, CRC(62445fc9) SHA1(d6297f2a4bc7a870b76cc498d19dbb0ce7d69fec) )
- ROM_REGION( 557, "maincpu:opla", 0 )
- ROM_LOAD( "tms1400_bankshot_output.pla", 0, 557, CRC(7539283b) SHA1(f791fa98259fc10c393ff1961d4c93040f1a2932) )
-ROM_END
-
-
-ROM_START( splitsec )
- ROM_REGION( 0x1000, "maincpu", 0 )
- ROM_LOAD( "mp7314", 0x0000, 0x1000, CRC(e94b2098) SHA1(f0fc1f56a829252185592a2508740354c50bedf8) )
-
- ROM_REGION( 867, "maincpu:mpla", 0 )
- ROM_LOAD( "tms1100_common1_micro.pla", 0, 867, CRC(62445fc9) SHA1(d6297f2a4bc7a870b76cc498d19dbb0ce7d69fec) )
- ROM_REGION( 557, "maincpu:opla", 0 )
- ROM_LOAD( "tms1400_splitsec_output.pla", 0, 557, CRC(7539283b) SHA1(f791fa98259fc10c393ff1961d4c93040f1a2932) )
-ROM_END
-
-
-ROM_START( lostreas )
- ROM_REGION( 0x0800, "maincpu", 0 )
- ROM_LOAD( "m34038", 0x0000, 0x0800, CRC(4c996f63) SHA1(ebbaa8b2f909f4300887aa2dbdb7185eedc75d3f) )
-
- ROM_REGION( 867, "maincpu:mpla", 0 )
- ROM_LOAD( "tms1100_common1_micro.pla", 0, 867, CRC(62445fc9) SHA1(d6297f2a4bc7a870b76cc498d19dbb0ce7d69fec) )
- ROM_REGION( 365, "maincpu:opla", 0 )
- ROM_LOAD( "tms1100_lostreas_output.pla", 0, 365, CRC(c62d850f) SHA1(d25974e6901eb10c52cdda12e6d4a13e26745e6f) )
-ROM_END
-
-
-ROM_START( alphie )
- ROM_REGION( 0x0400, "maincpu", 0 )
- ROM_LOAD( "us4280809", 0x0000, 0x0400, CRC(f8f14013) SHA1(bf31b929fcbcb189bbe4623104e1da0a639b5954) ) // from patent US4280809, should be good
-
- ROM_REGION( 867, "maincpu:mpla", 0 )
- ROM_LOAD( "tms1000_common2_micro.pla", 0, 867, BAD_DUMP CRC(d33da3cf) SHA1(13c4ebbca227818db75e6db0d45b66ba5e207776) ) // not in patent description
- ROM_REGION( 365, "maincpu:opla", 0 )
- ROM_LOAD( "tms1000_alphie_output.pla", 0, 365, NO_DUMP ) // "
-ROM_END
-
-
-ROM_START( tcfball )
- ROM_REGION( 0x0800, "maincpu", 0 )
- ROM_LOAD( "mp1193", 0x0000, 0x0800, CRC(7d9f446f) SHA1(bb6af47b42d989494f21475a73f072cddf58c99f) )
-
- ROM_REGION( 867, "maincpu:mpla", 0 )
- ROM_LOAD( "tms1100_common2_micro.pla", 0, 867, CRC(7cc90264) SHA1(c6e1cf1ffb178061da9e31858514f7cd94e86990) )
- ROM_REGION( 365, "maincpu:opla", 0 )
- ROM_LOAD( "tms1100_tcfball_output.pla", 0, 365, CRC(26b2996e) SHA1(df0e706c552bf74123aa65e71b0c9b4d33cddb2b) )
-ROM_END
-
-ROM_START( tcfballa )
- ROM_REGION( 0x0800, "maincpu", 0 )
- ROM_LOAD( "mp1183", 0x0000, 0x0800, CRC(2a4db1d5) SHA1(5df15d1115bb425578ad522d607a582dd478f35c) )
-
- ROM_REGION( 867, "maincpu:mpla", 0 )
- ROM_LOAD( "tms1100_common2_micro.pla", 0, 867, BAD_DUMP CRC(7cc90264) SHA1(c6e1cf1ffb178061da9e31858514f7cd94e86990) ) // not verified
- ROM_REGION( 365, "maincpu:opla", 0 )
- ROM_LOAD( "tms1100_tcfballa_output.pla", 0, 365, NO_DUMP )
-ROM_END
-
-
-ROM_START( tandy12 )
- ROM_REGION( 0x0800, "maincpu", 0 )
- ROM_LOAD( "cd7282sl", 0x0000, 0x0800, CRC(a10013dd) SHA1(42ebd3de3449f371b99937f9df39c240d15ac686) )
-
- ROM_REGION( 867, "maincpu:mpla", 0 )
- ROM_LOAD( "tms1100_common1_micro.pla", 0, 867, BAD_DUMP CRC(62445fc9) SHA1(d6297f2a4bc7a870b76cc498d19dbb0ce7d69fec) ) // not verified
- ROM_REGION( 365, "maincpu:opla", 0 )
- ROM_LOAD( "tms1100_tandy12_output.pla", 0, 365, NO_DUMP )
-ROM_END
-
-
-ROM_START( monkeysee )
- ROM_REGION( 0x0400, "maincpu", 0 )
- ROM_LOAD( "mp0271", 0x0000, 0x0400, CRC(acab0f05) SHA1(226f7688caf4a94a88241d3b61ddc4254e4a918c) )
-
- ROM_REGION( 867, "maincpu:mpla", 0 )
- ROM_LOAD( "tms1000_monkeysee_micro.pla", 0, 867, CRC(368d878f) SHA1(956e700a04f453c1610cfdb974fce898ba4cf01f) )
- ROM_REGION( 365, "maincpu:opla", 0 )
- ROM_LOAD( "tms1000_monkeysee_output.pla", 0, 365, CRC(8a010e89) SHA1(3ffbabc5d6c9b34cc06d290817d15b2be42d8b17) )
-ROM_END
-
-
-ROM_START( speechp )
- ROM_REGION( 0x0400, "maincpu", 0 )
- ROM_LOAD( "tms1007nl", 0x0000, 0x0400, CRC(c2669d5c) SHA1(7943d6f39508a9a82bc21e4fe34a5b9f86e3add2) )
-
- ROM_REGION( 867, "maincpu:mpla", 0 )
- ROM_LOAD( "tms1000_common1_micro.pla", 0, 867, CRC(4becec19) SHA1(3c8a9be0f00c88c81f378b76886c39b10304f330) )
- ROM_REGION( 365, "maincpu:opla", 0 )
- ROM_LOAD( "tms1000_speechp_output.pla", 0, 365, CRC(e1b4197f) SHA1(258f4276a9f15c9bfbfa58df2f7202aed1542fdc) )
-
- ROM_REGION( 0x0800, "speech", 0 )
- ROM_LOAD("s14007-a", 0x0000, 0x0800, CRC(543b46d4) SHA1(99daf7fe3354c378b4bd883840c9bbd22b22ebe7) )
-ROM_END
-
-
-ROM_START( timaze )
- ROM_REGION( 0x0400, "maincpu", 0 )
- ROM_LOAD( "gb2040172a", 0x0000, 0x0400, CRC(0bab4dc6) SHA1(c9d40649fbb27a8b7cf7460d66c7e217b63376f0) ) // from patent GB2040172A, verified with source code
-
- ROM_REGION( 867, "maincpu:mpla", 0 )
- ROM_LOAD( "tms1000_common2_micro.pla", 0, 867, BAD_DUMP CRC(d33da3cf) SHA1(13c4ebbca227818db75e6db0d45b66ba5e207776) ) // not in patent, use default one
- ROM_REGION( 365, "maincpu:opla", 0 )
- ROM_LOAD( "tms1000_timaze_output.pla", 0, 365, BAD_DUMP CRC(f0f36970) SHA1(a6ad1f5e804ac98e5e1a1d07466b3db3a8d6c256) ) // described in patent, but unsure about pin order
-ROM_END
-
-
-ROM_START( copycat )
- ROM_REGION( 0x0400, "maincpu", 0 )
- ROM_LOAD( "mp0919", 0x0000, 0x0400, CRC(92a21299) SHA1(16daadb8dbf53aaab8a71833017b4a578d035d6d) )
-
- ROM_REGION( 867, "maincpu:mpla", 0 )
- ROM_LOAD( "tms1000_common2_micro.pla", 0, 867, CRC(d33da3cf) SHA1(13c4ebbca227818db75e6db0d45b66ba5e207776) )
- ROM_REGION( 365, "maincpu:opla", 0 )
- ROM_LOAD( "tms1000_copycat_output.pla", 0, 365, CRC(b1d0c96d) SHA1(ac1a003eab3f69e09e9050cb24ea17211e0523fe) )
-ROM_END
-
-ROM_START( copycatm2 )
- ROM_REGION( 0x0200, "maincpu", 0 )
- ROM_LOAD( "mp3005n", 0x0000, 0x0200, CRC(a87649cb) SHA1(14ef7967a80578885f0b905772c3bb417b5b3255) )
-
- ROM_REGION( 867, "maincpu:mpla", 0 )
- ROM_LOAD( "tms1000_copycatm2_micro.pla", 0, 867, CRC(2710d8ef) SHA1(cb7a13bfabedad43790de753844707fe829baed0) )
- ROM_REGION( 365, "maincpu:opla", 0 )
- ROM_LOAD( "tms1000_copycatm2_output.pla", 0, 365, CRC(d1999aaf) SHA1(0c27789b349e491d5230f9c75c4741e621f5a14e) )
-ROM_END
-
-
-ROM_START( ditto )
- ROM_REGION( 0x0200, "maincpu", 0 )
- ROM_LOAD( "mp1801", 0x0000, 0x0200, CRC(cee6043b) SHA1(4ec334be6835688413637ff9d9d7a5f0d61eba27) )
-
- ROM_REGION( 867, "maincpu:mpla", 0 )
- ROM_LOAD( "tms1000_ditto_micro.pla", 0, 867, CRC(2710d8ef) SHA1(cb7a13bfabedad43790de753844707fe829baed0) )
- ROM_REGION( 365, "maincpu:opla", 0 )
- ROM_LOAD( "tms1000_ditto_output.pla", 0, 365, CRC(2b708a27) SHA1(e95415e51ffbe5da3bde1484fcd20467dde9f09a) )
-ROM_END
-
-
-ROM_START( 7in1ss )
- ROM_REGION( 0x1000, "maincpu", 0 )
- ROM_LOAD( "mp7304", 0x0000, 0x1000, CRC(2a1c8390) SHA1(fa10e60686af6828a61f05046abc3854ab49af95) )
-
- ROM_REGION( 867, "maincpu:mpla", 0 )
- ROM_LOAD( "tms1100_common2_micro.pla", 0, 867, CRC(7cc90264) SHA1(c6e1cf1ffb178061da9e31858514f7cd94e86990) )
- ROM_REGION( 557, "maincpu:opla", 0 )
- ROM_LOAD( "tms1400_7in1ss_output.pla", 0, 557, CRC(6b7660f7) SHA1(bb7d58fa04e7606ccdf5b209e1b089948bdd1e7c) )
-ROM_END
-
-
-ROM_START( tbreakup )
- ROM_REGION( 0x0400, "maincpu", 0 )
- ROM_LOAD( "mp2726a", 0x0000, 0x0400, CRC(1f7c28e2) SHA1(164cda4eb3f0b1d20955212a197c9aadf8d18a06) )
-
- ROM_REGION( 867, "maincpu:mpla", 0 )
- ROM_LOAD( "tms1000_common2_micro.pla", 0, 867, CRC(d33da3cf) SHA1(13c4ebbca227818db75e6db0d45b66ba5e207776) )
- ROM_REGION( 365, "maincpu:opla", 0 )
- ROM_LOAD( "tms1000_tbreakup_output.pla", 0, 365, CRC(a1ea035e) SHA1(fcf0b57ed90b41441a8974223a697f530daac0ab) )
-ROM_END
-
-
-ROM_START( phpball )
- ROM_REGION( 0x0800, "maincpu", 0 )
- ROM_LOAD( "mp1180", 0x0000, 0x0800, CRC(2163b92d) SHA1(bc53d1911e88b4e89d951c6f769703105c13389c) )
-
- ROM_REGION( 867, "maincpu:mpla", 0 )
- ROM_LOAD( "tms1100_common2_micro.pla", 0, 867, CRC(7cc90264) SHA1(c6e1cf1ffb178061da9e31858514f7cd94e86990) )
- ROM_REGION( 365, "maincpu:opla", 0 )
- ROM_LOAD( "tms1100_phpball_output.pla", 0, 365, CRC(87e67aaf) SHA1(ebc7bae1352f39173f1bf0dc10cdc6f635dedab4) )
-ROM_END
-
-
-ROM_START( ssports4 )
- ROM_REGION( 0x0800, "maincpu", 0 )
- ROM_LOAD( "mp1219", 0x0000, 0x0800, CRC(865c06d6) SHA1(12a625a13bdb57b82b35c42b175d38756a1e2e04) )
-
- ROM_REGION( 867, "maincpu:mpla", 0 )
- ROM_LOAD( "tms1100_common2_micro.pla", 0, 867, BAD_DUMP CRC(7cc90264) SHA1(c6e1cf1ffb178061da9e31858514f7cd94e86990) ) // not verified
- ROM_REGION( 365, "maincpu:opla", 0 )
- ROM_LOAD( "tms1100_ssports4_output.pla", 0, 365, NO_DUMP )
-ROM_END
-
+// roms
ROM_START( xl25 )
ROM_REGION( 0x0400, "maincpu", 0 )
@@ -10311,6 +10340,14 @@ ROM_END
+} // anonymous namespace
+
+/***************************************************************************
+
+ Game driver(s)
+
+***************************************************************************/
+
// YEAR NAME PARENT CMP MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS
CONS( 1979, matchnum, 0, 0, matchnum, matchnum, matchnum_state, empty_init, "A-One LSI", "Match Number", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK )
CONS( 1980, arrball, 0, 0, arrball, arrball, arrball_state, empty_init, "A-One LSI", "Arrange Ball", MACHINE_SUPPORTS_SAVE )
@@ -10320,10 +10357,11 @@ COMP( 1980, mathmagi, 0, 0, mathmagi, mathmagi, mathmagi_state, emp
CONS( 1979, bcheetah, 0, 0, bcheetah, bcheetah, bcheetah_state, empty_init, "Bandai", "System Control Car: Cheetah", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW | MACHINE_MECHANICAL ) // ***
CONS( 1978, amaztron, 0, 0, amaztron, amaztron, amaztron_state, empty_init, "Coleco", "Amaze-A-Tron", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS ) // ***
-COMP( 1979, zodiac, 0, 0, zodiac, zodiac, zodiac_state, empty_init, "Coleco", "Zodiac - The Astrology Computer", MACHINE_SUPPORTS_SAVE )
+COMP( 1979, zodiac, 0, 0, zodiac, zodiac, zodiac_state, empty_init, "Coleco", "Zodiac - The Astrology Computer", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK )
CONS( 1978, cqback, 0, 0, cqback, cqback, cqback_state, empty_init, "Coleco", "Electronic Quarterback", MACHINE_SUPPORTS_SAVE )
CONS( 1979, h2hfootb, 0, 0, h2hfootb, h2hfootb, h2hfootb_state, empty_init, "Coleco", "Head to Head: Electronic Football", MACHINE_SUPPORTS_SAVE )
-CONS( 1979, h2hhockey, 0, 0, h2hhockey, h2hhockey, h2hhockey_state, empty_init, "Coleco", "Head to Head: Electronic Hockey (TMS1000 version)", MACHINE_SUPPORTS_SAVE )
+CONS( 1979, h2hbaskb, 0, 0, h2hbaskb, h2hbaskb, h2hbaskb_state, empty_init, "Coleco", "Head to Head: Electronic Basketball (TMS1000 version)", MACHINE_SUPPORTS_SAVE )
+CONS( 1979, h2hhockey, 0, 0, h2hhockey, h2hhockey, h2hbaskb_state, empty_init, "Coleco", "Head to Head: Electronic Hockey (TMS1000 version)", MACHINE_SUPPORTS_SAVE )
CONS( 1980, h2hbaseb, 0, 0, h2hbaseb, h2hbaseb, h2hbaseb_state, empty_init, "Coleco", "Head to Head: Electronic Baseball", MACHINE_SUPPORTS_SAVE )
CONS( 1981, h2hboxing, 0, 0, h2hboxing, h2hboxing, h2hboxing_state, empty_init, "Coleco", "Head to Head: Electronic Boxing", MACHINE_SUPPORTS_SAVE )
CONS( 1981, quizwizc, 0, 0, quizwizc, quizwizc, quizwizc_state, empty_init, "Coleco", "Quiz Wiz Challenger", MACHINE_SUPPORTS_SAVE ) // ***
diff --git a/src/mame/drivers/hh_ucom4.cpp b/src/mame/drivers/hh_ucom4.cpp
index cff4c17c542..448090a126c 100644
--- a/src/mame/drivers/hh_ucom4.cpp
+++ b/src/mame/drivers/hh_ucom4.cpp
@@ -35,17 +35,19 @@
@054 uPD552C 1980, Epoch Invader From Space
@031 uPD553C 1979, Bambino Superstar Football (ET-03)
- @049 uPD553C 1979, Mego Mini-Vid Break Free
+ @049 uPD553C 1979, Mego Mini-Vid: Break Free
@055 uPD553C 1980, Bambino Space Laser Fight (ET-12)
*073 uPD553C 1980, Sony ST-J75 FM Stereo Tuner
@080 uPD553C 1980, Epoch Electronic Football
*102 uPD553C 1981, Bandai Block Out
@153 uPD553C 1981, Epoch Galaxy II
@160 uPD553C 1982, Tomy Pac Man (TN-08)
+ *167 uPD553C 1982, Sony SL models (betamax) (have dump)
@170 uPD553C 1982, Bandai Crazy Climber
@192 uPD553C 1982, Tomy Scramble (TN-10)
@202 uPD553C 1982, Epoch Astro Command
@206 uPD553C 1982, Epoch Dracula
+ *207 uPD553C 1982, Sony SL-J30 (tape/cd deck)
@209 uPD553C 1982, Tomy Caveman (TN-12)
@258 uPD553C 1984, Tomy Alien Chase (TN-16)
*296 uPD553C 1984, Epoch Computer Beam Gun Professional
@@ -76,13 +78,16 @@ TODO:
#include "screen.h"
#include "speaker.h"
-// internal artwork
+// internal artwork (complete)
#include "efball.lh"
#include "grobot9.lh" // clickable
#include "mcompgin.lh"
#include "mvbfree.lh"
#include "tactix.lh" // clickable
+// internal artwork (bezel overlay)
+#include "tmtennis.lh"
+
//#include "hh_ucom4_test.lh" // common test-layout - no svg artwork(yet), use external artwork
@@ -241,10 +246,12 @@ INPUT_CHANGED_MEMBER(hh_ucom4_state::single_interrupt_line)
/***************************************************************************
- Minidrivers (subclass, I/O, Inputs, Machine Config)
+ Minidrivers (subclass, I/O, Inputs, Machine Config, ROM Defs)
***************************************************************************/
+namespace {
+
/***************************************************************************
Bambino UFO Master-Blaster Station (manufactured in Japan)
@@ -267,8 +274,8 @@ INPUT_CHANGED_MEMBER(hh_ucom4_state::single_interrupt_line)
class ufombs_state : public hh_ucom4_state
{
public:
- ufombs_state(const machine_config &mconfig, device_type type, const char *tag)
- : hh_ucom4_state(mconfig, type, tag)
+ ufombs_state(const machine_config &mconfig, device_type type, const char *tag) :
+ hh_ucom4_state(mconfig, type, tag)
{ }
void prepare_display();
@@ -347,7 +354,8 @@ void ufombs_state::ufombs(machine_config &config)
screen.set_svg_region("svg");
screen.set_refresh_hz(50);
screen.set_size(243, 1080);
- screen.set_visarea(0, 243-1, 0, 1080-1);
+ screen.set_visarea_full();
+
TIMER(config, "display_decay").configure_periodic(FUNC(hh_ucom4_state::display_decay_tick), attotime::from_msec(1));
/* sound hardware */
@@ -357,6 +365,16 @@ void ufombs_state::ufombs(machine_config &config)
m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25);
}
+// roms
+
+ROM_START( ufombs )
+ ROM_REGION( 0x0400, "maincpu", 0 )
+ ROM_LOAD( "d552c-017", 0x0000, 0x0400, CRC(0e208cb3) SHA1(57db6566916c94325e2b67ccb94b4ea3b233487d) )
+
+ ROM_REGION( 222395, "svg", 0)
+ ROM_LOAD( "ufombs.svg", 0, 222395, CRC(ae9fb93f) SHA1(165ea78eee93c503dbd277a56c41e3c63c534e38) )
+ROM_END
+
@@ -380,8 +398,8 @@ void ufombs_state::ufombs(machine_config &config)
class ssfball_state : public hh_ucom4_state
{
public:
- ssfball_state(const machine_config &mconfig, device_type type, const char *tag)
- : hh_ucom4_state(mconfig, type, tag)
+ ssfball_state(const machine_config &mconfig, device_type type, const char *tag) :
+ hh_ucom4_state(mconfig, type, tag)
{ }
void prepare_display();
@@ -494,7 +512,8 @@ void ssfball_state::ssfball(machine_config &config)
screen.set_svg_region("svg");
screen.set_refresh_hz(50);
screen.set_size(1920, 482);
- screen.set_visarea(0, 1920-1, 0, 482-1);
+ screen.set_visarea_full();
+
TIMER(config, "display_decay").configure_periodic(FUNC(hh_ucom4_state::display_decay_tick), attotime::from_msec(1));
/* sound hardware */
@@ -504,6 +523,24 @@ void ssfball_state::ssfball(machine_config &config)
m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25);
}
+// roms
+
+ROM_START( ssfball )
+ ROM_REGION( 0x0800, "maincpu", 0 )
+ ROM_LOAD( "d553c-031", 0x0000, 0x0800, CRC(ff5d91d0) SHA1(9b2c0ae45f1e3535108ee5fef8a9010e00c8d5c3) )
+
+ ROM_REGION( 331352, "svg", 0)
+ ROM_LOAD( "ssfball.svg", 0, 331352, CRC(10cffb85) SHA1(c875f73a323d976088ffa1bc19f7bc865d4aac62) )
+ROM_END
+
+ROM_START( bmcfball )
+ ROM_REGION( 0x0800, "maincpu", 0 )
+ ROM_LOAD( "d553c-031", 0x0000, 0x0800, CRC(ff5d91d0) SHA1(9b2c0ae45f1e3535108ee5fef8a9010e00c8d5c3) )
+
+ ROM_REGION( 331352, "svg", 0)
+ ROM_LOAD( "bmcfball.svg", 0, 331352, CRC(43fbed1e) SHA1(28160e14b0879cd4dd9dab770c52c98f316ab653) )
+ROM_END
+
@@ -524,8 +561,8 @@ void ssfball_state::ssfball(machine_config &config)
class bmsoccer_state : public hh_ucom4_state
{
public:
- bmsoccer_state(const machine_config &mconfig, device_type type, const char *tag)
- : hh_ucom4_state(mconfig, type, tag)
+ bmsoccer_state(const machine_config &mconfig, device_type type, const char *tag) :
+ hh_ucom4_state(mconfig, type, tag)
{ }
void prepare_display();
@@ -622,7 +659,8 @@ void bmsoccer_state::bmsoccer(machine_config &config)
screen.set_svg_region("svg");
screen.set_refresh_hz(50);
screen.set_size(271, 1080);
- screen.set_visarea(0, 271-1, 0, 1080-1);
+ screen.set_visarea_full();
+
TIMER(config, "display_decay").configure_periodic(FUNC(hh_ucom4_state::display_decay_tick), attotime::from_msec(1));
/* sound hardware */
@@ -631,6 +669,16 @@ void bmsoccer_state::bmsoccer(machine_config &config)
m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25);
}
+// roms
+
+ROM_START( bmsoccer )
+ ROM_REGION( 0x0400, "maincpu", 0 )
+ ROM_LOAD( "d552c-043", 0x0000, 0x0400, CRC(10c2a4ea) SHA1(6ebca7d406e22ff7a8cd529579b55a700da487b4) )
+
+ ROM_REGION( 273796, "svg", 0)
+ ROM_LOAD( "bmsoccer.svg", 0, 273796, CRC(4c88d9f8) SHA1(b4b82f26a09f54cd0b6a9d1c1a46796fbfcb578a) )
+ROM_END
+
@@ -647,8 +695,8 @@ void bmsoccer_state::bmsoccer(machine_config &config)
class bmsafari_state : public hh_ucom4_state
{
public:
- bmsafari_state(const machine_config &mconfig, device_type type, const char *tag)
- : hh_ucom4_state(mconfig, type, tag)
+ bmsafari_state(const machine_config &mconfig, device_type type, const char *tag) :
+ hh_ucom4_state(mconfig, type, tag)
{ }
void prepare_display();
@@ -729,7 +777,8 @@ void bmsafari_state::bmsafari(machine_config &config)
screen.set_svg_region("svg");
screen.set_refresh_hz(50);
screen.set_size(248, 1080);
- screen.set_visarea(0, 248-1, 0, 1080-1);
+ screen.set_visarea_full();
+
TIMER(config, "display_decay").configure_periodic(FUNC(hh_ucom4_state::display_decay_tick), attotime::from_msec(1));
/* sound hardware */
@@ -738,6 +787,16 @@ void bmsafari_state::bmsafari(machine_config &config)
m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25);
}
+// roms
+
+ROM_START( bmsafari )
+ ROM_REGION( 0x0400, "maincpu", 0 )
+ ROM_LOAD( "d552c-049", 0x0000, 0x0400, CRC(82fa3cbe) SHA1(019e7ec784e977eba09997fc46af253054fb222c) )
+
+ ROM_REGION( 275386, "svg", 0)
+ ROM_LOAD( "bmsafari.svg", 0, 275386, CRC(c24badbc) SHA1(b191f34155d6d4e834e7c6fe715d4bb76198ad72) )
+ROM_END
+
@@ -757,8 +816,8 @@ void bmsafari_state::bmsafari(machine_config &config)
class splasfgt_state : public hh_ucom4_state
{
public:
- splasfgt_state(const machine_config &mconfig, device_type type, const char *tag)
- : hh_ucom4_state(mconfig, type, tag)
+ splasfgt_state(const machine_config &mconfig, device_type type, const char *tag) :
+ hh_ucom4_state(mconfig, type, tag)
{ }
void prepare_display();
@@ -880,7 +939,8 @@ void splasfgt_state::splasfgt(machine_config &config)
screen.set_svg_region("svg");
screen.set_refresh_hz(50);
screen.set_size(1920, 476);
- screen.set_visarea(0, 1920-1, 0, 476-1);
+ screen.set_visarea_full();
+
TIMER(config, "display_decay").configure_periodic(FUNC(hh_ucom4_state::display_decay_tick), attotime::from_msec(1));
/* sound hardware */
@@ -890,6 +950,16 @@ void splasfgt_state::splasfgt(machine_config &config)
m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25);
}
+// roms
+
+ROM_START( splasfgt )
+ ROM_REGION( 0x0800, "maincpu", 0 )
+ ROM_LOAD( "d553c-055", 0x0000, 0x0800, CRC(eb471fbd) SHA1(f06cfe567bf6f9ed4dcdc88acdcfad50cd370a02) )
+
+ ROM_REGION( 246609, "svg", 0)
+ ROM_LOAD( "splasfgt.svg", 0, 246609, CRC(365fae43) SHA1(344c120c2efa92ada9171047affac801a06cf303) )
+ROM_END
+
@@ -910,8 +980,8 @@ void splasfgt_state::splasfgt(machine_config &config)
class bcclimbr_state : public hh_ucom4_state
{
public:
- bcclimbr_state(const machine_config &mconfig, device_type type, const char *tag)
- : hh_ucom4_state(mconfig, type, tag)
+ bcclimbr_state(const machine_config &mconfig, device_type type, const char *tag) :
+ hh_ucom4_state(mconfig, type, tag)
{ }
void prepare_display();
@@ -984,7 +1054,8 @@ void bcclimbr_state::bcclimbr(machine_config &config)
screen.set_svg_region("svg");
screen.set_refresh_hz(50);
screen.set_size(310, 1080);
- screen.set_visarea(0, 310-1, 0, 1080-1);
+ screen.set_visarea_full();
+
TIMER(config, "display_decay").configure_periodic(FUNC(hh_ucom4_state::display_decay_tick), attotime::from_msec(1));
/* sound hardware */
@@ -993,6 +1064,16 @@ void bcclimbr_state::bcclimbr(machine_config &config)
m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25);
}
+// roms
+
+ROM_START( bcclimbr )
+ ROM_REGION( 0x0800, "maincpu", 0 )
+ ROM_LOAD( "d553c-170", 0x0000, 0x0800, CRC(fc2eabdb) SHA1(0f5cc854be7fdf105d9bd2114659d40c65f9d782) )
+
+ ROM_REGION( 219971, "svg", 0)
+ ROM_LOAD( "bcclimbr.svg", 0, 219971, CRC(9c9102f4) SHA1(6a7e02fd1467a26c734b01724e23cef9e4917805) )
+ROM_END
+
@@ -1015,8 +1096,8 @@ void bcclimbr_state::bcclimbr(machine_config &config)
class tactix_state : public hh_ucom4_state
{
public:
- tactix_state(const machine_config &mconfig, device_type type, const char *tag)
- : hh_ucom4_state(mconfig, type, tag)
+ tactix_state(const machine_config &mconfig, device_type type, const char *tag) :
+ hh_ucom4_state(mconfig, type, tag)
{ }
DECLARE_WRITE8_MEMBER(leds_w);
@@ -1108,6 +1189,13 @@ void tactix_state::tactix(machine_config &config)
m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25);
}
+// roms
+
+ROM_START( tactix )
+ ROM_REGION( 0x0800, "maincpu", 0 )
+ ROM_LOAD( "d557lc-512", 0x0000, 0x0800, CRC(1df738cb) SHA1(15a5de28a3c03e6894d29c56b5b424983569ccf2) )
+ROM_END
+
@@ -1128,8 +1216,8 @@ void tactix_state::tactix(machine_config &config)
class invspace_state : public hh_ucom4_state
{
public:
- invspace_state(const machine_config &mconfig, device_type type, const char *tag)
- : hh_ucom4_state(mconfig, type, tag)
+ invspace_state(const machine_config &mconfig, device_type type, const char *tag) :
+ hh_ucom4_state(mconfig, type, tag)
{ }
void prepare_display();
@@ -1201,7 +1289,8 @@ void invspace_state::invspace(machine_config &config)
screen.set_svg_region("svg");
screen.set_refresh_hz(50);
screen.set_size(289, 1080);
- screen.set_visarea(0, 289-1, 0, 1080-1);
+ screen.set_visarea_full();
+
TIMER(config, "display_decay").configure_periodic(FUNC(hh_ucom4_state::display_decay_tick), attotime::from_msec(1));
/* sound hardware */
@@ -1210,6 +1299,16 @@ void invspace_state::invspace(machine_config &config)
m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25);
}
+// roms
+
+ROM_START( invspace )
+ ROM_REGION( 0x0400, "maincpu", 0 )
+ ROM_LOAD( "d552c-054", 0x0000, 0x0400, CRC(913d9c13) SHA1(f20edb5458e54d2f6d4e45e5d59efd87e05a6f3f) )
+
+ ROM_REGION( 110899, "svg", 0)
+ ROM_LOAD( "invspace.svg", 0, 110899, CRC(ae794333) SHA1(3552215389f02e4ef1d608f7dfc84f0499a78ee2) )
+ROM_END
+
@@ -1230,8 +1329,8 @@ void invspace_state::invspace(machine_config &config)
class efball_state : public hh_ucom4_state
{
public:
- efball_state(const machine_config &mconfig, device_type type, const char *tag)
- : hh_ucom4_state(mconfig, type, tag)
+ efball_state(const machine_config &mconfig, device_type type, const char *tag) :
+ hh_ucom4_state(mconfig, type, tag)
{ }
void prepare_display();
@@ -1321,6 +1420,13 @@ void efball_state::efball(machine_config &config)
m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25);
}
+// roms
+
+ROM_START( efball )
+ ROM_REGION( 0x0800, "maincpu", 0 )
+ ROM_LOAD( "d553c-080", 0x0000, 0x0800, CRC(54c1027f) SHA1(6cc98074dae9361fa8c0ed6501b6a57ad325ccbd) )
+ROM_END
+
@@ -1343,8 +1449,8 @@ void efball_state::efball(machine_config &config)
class galaxy2_state : public hh_ucom4_state
{
public:
- galaxy2_state(const machine_config &mconfig, device_type type, const char *tag)
- : hh_ucom4_state(mconfig, type, tag)
+ galaxy2_state(const machine_config &mconfig, device_type type, const char *tag) :
+ hh_ucom4_state(mconfig, type, tag)
{ }
void prepare_display();
@@ -1417,7 +1523,8 @@ void galaxy2_state::galaxy2(machine_config &config)
screen.set_svg_region("svg");
screen.set_refresh_hz(50);
screen.set_size(304, 1080);
- screen.set_visarea(0, 304-1, 0, 1080-1);
+ screen.set_visarea_full();
+
TIMER(config, "display_decay").configure_periodic(FUNC(hh_ucom4_state::display_decay_tick), attotime::from_msec(1));
/* sound hardware */
@@ -1431,10 +1538,29 @@ void galaxy2_state::galaxy2b(machine_config &config)
galaxy2(config);
/* video hardware */
- subdevice<screen_device>("screen")->set_size(306, 1080);
- subdevice<screen_device>("screen")->set_visarea(0, 306-1, 0, 1080-1);
+ screen_device *screen = subdevice<screen_device>("screen");
+ screen->set_size(306, 1080);
+ screen->set_visarea_full();
}
+// roms
+
+ROM_START( galaxy2 )
+ ROM_REGION( 0x0800, "maincpu", 0 )
+ ROM_LOAD( "d553c-153.s01", 0x0000, 0x0800, CRC(70d552b3) SHA1(72d50647701cb4bf85ea947a149a317aaec0f52c) )
+
+ ROM_REGION( 325057, "svg", 0)
+ ROM_LOAD( "galaxy2d.svg", 0, 325057, CRC(b2d27a0e) SHA1(502ec22c324903ffe8ff235b9a3b8898dce17a64) )
+ROM_END
+
+ROM_START( galaxy2b )
+ ROM_REGION( 0x0800, "maincpu", 0 )
+ ROM_LOAD( "d553c-153.s01", 0x0000, 0x0800, CRC(70d552b3) SHA1(72d50647701cb4bf85ea947a149a317aaec0f52c) )
+
+ ROM_REGION( 266377, "svg", 0)
+ ROM_LOAD( "galaxy2b.svg", 0, 266377, CRC(8633cebb) SHA1(6c41f5e918e1522eb55ef24270900a1b2477722b) )
+ROM_END
+
@@ -1456,8 +1582,8 @@ void galaxy2_state::galaxy2b(machine_config &config)
class astrocmd_state : public hh_ucom4_state
{
public:
- astrocmd_state(const machine_config &mconfig, device_type type, const char *tag)
- : hh_ucom4_state(mconfig, type, tag)
+ astrocmd_state(const machine_config &mconfig, device_type type, const char *tag) :
+ hh_ucom4_state(mconfig, type, tag)
{ }
void prepare_display();
@@ -1536,7 +1662,8 @@ void astrocmd_state::astrocmd(machine_config &config)
screen.set_svg_region("svg");
screen.set_refresh_hz(50);
screen.set_size(1920, 525);
- screen.set_visarea(0, 1920-1, 0, 525-1);
+ screen.set_visarea_full();
+
TIMER(config, "display_decay").configure_periodic(FUNC(hh_ucom4_state::display_decay_tick), attotime::from_msec(1));
/* sound hardware */
@@ -1545,6 +1672,16 @@ void astrocmd_state::astrocmd(machine_config &config)
m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25);
}
+// roms
+
+ROM_START( astrocmd )
+ ROM_REGION( 0x0800, "maincpu", 0 )
+ ROM_LOAD( "d553c-202.s01", 0x0000, 0x0800, CRC(b4b34883) SHA1(6246d561c2df1f2124575d2ca671ef85b1819edd) )
+
+ ROM_REGION( 335362, "svg", 0)
+ ROM_LOAD( "astrocmd.svg", 0, 335362, CRC(fe2cd30f) SHA1(898a3d9afc5dca6c63ae28aed2c8530716ad1c45) )
+ROM_END
+
@@ -1566,8 +1703,8 @@ void astrocmd_state::astrocmd(machine_config &config)
class edracula_state : public hh_ucom4_state
{
public:
- edracula_state(const machine_config &mconfig, device_type type, const char *tag)
- : hh_ucom4_state(mconfig, type, tag)
+ edracula_state(const machine_config &mconfig, device_type type, const char *tag) :
+ hh_ucom4_state(mconfig, type, tag)
{ }
DECLARE_WRITE8_MEMBER(grid_w);
@@ -1632,7 +1769,8 @@ void edracula_state::edracula(machine_config &config)
screen.set_svg_region("svg");
screen.set_refresh_hz(50);
screen.set_size(1920, 526);
- screen.set_visarea(0, 1920-1, 0, 526-1);
+ screen.set_visarea_full();
+
TIMER(config, "display_decay").configure_periodic(FUNC(hh_ucom4_state::display_decay_tick), attotime::from_msec(1));
/* sound hardware */
@@ -1641,6 +1779,16 @@ void edracula_state::edracula(machine_config &config)
m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25);
}
+// roms
+
+ROM_START( edracula )
+ ROM_REGION( 0x0800, "maincpu", 0 )
+ ROM_LOAD( "d553c-206.s01", 0x0000, 0x0800, CRC(b524857b) SHA1(c1c89ed5dd4bb1e6e98462dc8fa5af2aa48d8ede) )
+
+ ROM_REGION( 794532, "svg", 0)
+ ROM_LOAD( "edracula.svg", 0, 794532, CRC(d20e018c) SHA1(7f70f1d373c034ec8c93e27b7e3371578ddaf61b) )
+ROM_END
+
@@ -1656,8 +1804,8 @@ void edracula_state::edracula(machine_config &config)
class mcompgin_state : public hh_ucom4_state
{
public:
- mcompgin_state(const machine_config &mconfig, device_type type, const char *tag)
- : hh_ucom4_state(mconfig, type, tag),
+ mcompgin_state(const machine_config &mconfig, device_type type, const char *tag) :
+ hh_ucom4_state(mconfig, type, tag),
m_lcd(*this, "lcd")
{ }
@@ -1681,9 +1829,9 @@ WRITE8_MEMBER(mcompgin_state::lcd_w)
// E0: HLCD0530 _CS
// E1: HLCD0530 clock
// E2: HLCD0530 data in
- m_lcd->write_cs(data & 1);
- m_lcd->write_data(data >> 2 & 1);
- m_lcd->write_clock(data >> 1 & 1);
+ m_lcd->cs_w(data & 1);
+ m_lcd->data_w(data >> 2 & 1);
+ m_lcd->clock_w(data >> 1 & 1);
}
// config
@@ -1718,13 +1866,20 @@ void mcompgin_state::mcompgin(machine_config &config)
/* no sound! */
}
+// roms
+
+ROM_START( mcompgin )
+ ROM_REGION( 0x0800, "maincpu", 0 )
+ ROM_LOAD( "d650c-060", 0x0000, 0x0800, CRC(985e6da6) SHA1(ea4102a10a5741f06297c5426156e4b2f0d85a68) )
+ROM_END
+
/***************************************************************************
- Mego Mini-Vid Break Free (manufactured in Japan)
+ Mego Mini-Vid: Break Free (manufactured in Japan)
* PCB label Mego 79 rev F
* NEC uCOM-43 MCU, label D553C 049
* cyan VFD display Futaba DM-4.5 91
@@ -1734,8 +1889,8 @@ void mcompgin_state::mcompgin(machine_config &config)
class mvbfree_state : public hh_ucom4_state
{
public:
- mvbfree_state(const machine_config &mconfig, device_type type, const char *tag)
- : hh_ucom4_state(mconfig, type, tag)
+ mvbfree_state(const machine_config &mconfig, device_type type, const char *tag) :
+ hh_ucom4_state(mconfig, type, tag)
{ }
void prepare_display();
@@ -1821,6 +1976,13 @@ void mvbfree_state::mvbfree(machine_config &config)
m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25);
}
+// roms
+
+ROM_START( mvbfree )
+ ROM_REGION( 0x0800, "maincpu", 0 )
+ ROM_LOAD( "d553c-049", 0x0000, 0x0800, CRC(d64a8399) SHA1(97887e486fa29b1fc4a5a40cacf3c960f67aacbf) )
+ROM_END
+
@@ -1845,8 +2007,8 @@ void mvbfree_state::mvbfree(machine_config &config)
class grobot9_state : public hh_ucom4_state
{
public:
- grobot9_state(const machine_config &mconfig, device_type type, const char *tag)
- : hh_ucom4_state(mconfig, type, tag)
+ grobot9_state(const machine_config &mconfig, device_type type, const char *tag) :
+ hh_ucom4_state(mconfig, type, tag)
{ }
DECLARE_WRITE8_MEMBER(lamps_w);
@@ -1936,6 +2098,13 @@ void grobot9_state::grobot9(machine_config &config)
m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25);
}
+// roms
+
+ROM_START( grobot9 )
+ ROM_REGION( 0x0800, "maincpu", 0 )
+ ROM_LOAD( "ttgr-511", 0x0000, 0x0800, CRC(1f25b2bb) SHA1(55ae7e23f6dd46cc6e1a65839327726678410c3a) )
+ROM_END
+
@@ -1956,8 +2125,8 @@ void grobot9_state::grobot9(machine_config &config)
class tccombat_state : public hh_ucom4_state
{
public:
- tccombat_state(const machine_config &mconfig, device_type type, const char *tag)
- : hh_ucom4_state(mconfig, type, tag)
+ tccombat_state(const machine_config &mconfig, device_type type, const char *tag) :
+ hh_ucom4_state(mconfig, type, tag)
{ }
void prepare_display();
@@ -2025,7 +2194,8 @@ void tccombat_state::tccombat(machine_config &config)
screen.set_svg_region("svg");
screen.set_refresh_hz(50);
screen.set_size(300, 1080);
- screen.set_visarea(0, 300-1, 0, 1080-1);
+ screen.set_visarea_full();
+
TIMER(config, "display_decay").configure_periodic(FUNC(hh_ucom4_state::display_decay_tick), attotime::from_msec(1));
/* sound hardware */
@@ -2034,6 +2204,16 @@ void tccombat_state::tccombat(machine_config &config)
m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25);
}
+// roms
+
+ROM_START( tccombat )
+ ROM_REGION( 0x0400, "maincpu", 0 )
+ ROM_LOAD( "d552c-042", 0x0000, 0x0400, CRC(d7b5cfeb) SHA1(a267be8e43b7740758eb0881b655b1cc8aec43da) )
+
+ ROM_REGION( 210960, "svg", 0)
+ ROM_LOAD( "tccombat.svg", 0, 210960, CRC(03e9eba6) SHA1(d558d3063da42dc7cc02b769bca06a3732418837) )
+ROM_END
+
@@ -2056,8 +2236,8 @@ void tccombat_state::tccombat(machine_config &config)
class tmtennis_state : public hh_ucom4_state
{
public:
- tmtennis_state(const machine_config &mconfig, device_type type, const char *tag)
- : hh_ucom4_state(mconfig, type, tag)
+ tmtennis_state(const machine_config &mconfig, device_type type, const char *tag) :
+ hh_ucom4_state(mconfig, type, tag)
{ }
DECLARE_WRITE8_MEMBER(grid_w);
@@ -2066,15 +2246,29 @@ public:
DECLARE_READ8_MEMBER(input_r);
void set_clock();
- DECLARE_INPUT_CHANGED_MEMBER(difficulty_switch);
+ DECLARE_INPUT_CHANGED_MEMBER(difficulty_switch) { set_clock(); }
void tmtennis(machine_config &config);
protected:
virtual void machine_reset() override;
};
+void tmtennis_state::machine_reset()
+{
+ hh_ucom4_state::machine_reset();
+ set_clock();
+}
+
// handlers
+void tmtennis_state::set_clock()
+{
+ // MCU clock is from an LC circuit oscillating by default at ~360kHz,
+ // but on PRO1, the difficulty switch puts a capacitor across the LC circuit
+ // to slow it down to ~260kHz.
+ m_maincpu->set_unscaled_clock((m_inp_matrix[1]->read() & 0x100) ? 260000 : 360000);
+}
+
WRITE8_MEMBER(tmtennis_state::grid_w)
{
// G,H,I: vfd grid
@@ -2145,25 +2339,6 @@ static INPUT_PORTS_START( tmtennis )
PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_D) PORT_NAME("P2 Button 6")
INPUT_PORTS_END
-INPUT_CHANGED_MEMBER(tmtennis_state::difficulty_switch)
-{
- set_clock();
-}
-
-void tmtennis_state::set_clock()
-{
- // MCU clock is from an LC circuit oscillating by default at ~360kHz,
- // but on PRO1, the difficulty switch puts a capacitor across the LC circuit
- // to slow it down to ~260kHz.
- m_maincpu->set_unscaled_clock((m_inp_matrix[1]->read() & 0x100) ? 260000 : 360000);
-}
-
-void tmtennis_state::machine_reset()
-{
- hh_ucom4_state::machine_reset();
- set_clock();
-}
-
void tmtennis_state::tmtennis(machine_config &config)
{
/* basic machine hardware */
@@ -2183,8 +2358,10 @@ void tmtennis_state::tmtennis(machine_config &config)
screen.set_svg_region("svg");
screen.set_refresh_hz(50);
screen.set_size(1920, 417);
- screen.set_visarea(0, 1920-1, 0, 417-1);
+ screen.set_visarea_full();
+
TIMER(config, "display_decay").configure_periodic(FUNC(hh_ucom4_state::display_decay_tick), attotime::from_msec(1));
+ config.set_default_layout(layout_tmtennis);
/* sound hardware */
SPEAKER(config, "mono").front_center();
@@ -2192,6 +2369,16 @@ void tmtennis_state::tmtennis(machine_config &config)
m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25);
}
+// roms
+
+ROM_START( tmtennis )
+ ROM_REGION( 0x0400, "maincpu", 0 )
+ ROM_LOAD( "d552c-048", 0x0000, 0x0400, CRC(78702003) SHA1(4d427d4dbeed901770c682338867f58c7b54eee3) )
+
+ ROM_REGION( 204490, "svg", 0)
+ ROM_LOAD( "tmtennis.svg", 0, 204490, CRC(ed0086e9) SHA1(26a5b2f0a9cd70401187146e1495aee80020658b) )
+ROM_END
+
@@ -2218,8 +2405,8 @@ void tmtennis_state::tmtennis(machine_config &config)
class tmpacman_state : public hh_ucom4_state
{
public:
- tmpacman_state(const machine_config &mconfig, device_type type, const char *tag)
- : hh_ucom4_state(mconfig, type, tag)
+ tmpacman_state(const machine_config &mconfig, device_type type, const char *tag) :
+ hh_ucom4_state(mconfig, type, tag)
{ }
void prepare_display();
@@ -2292,7 +2479,8 @@ void tmpacman_state::tmpacman(machine_config &config)
screen.set_svg_region("svg");
screen.set_refresh_hz(50);
screen.set_size(1920, 508);
- screen.set_visarea(0, 1920-1, 0, 508-1);
+ screen.set_visarea_full();
+
TIMER(config, "display_decay").configure_periodic(FUNC(hh_ucom4_state::display_decay_tick), attotime::from_msec(1));
/* sound hardware */
@@ -2301,6 +2489,16 @@ void tmpacman_state::tmpacman(machine_config &config)
m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25);
}
+// roms
+
+ROM_START( tmpacman )
+ ROM_REGION( 0x0800, "maincpu", 0 )
+ ROM_LOAD( "d553c-160", 0x0000, 0x0800, CRC(b21a8af7) SHA1(e3122be1873ce76a4067386bf250802776f0c2f9) )
+
+ ROM_REGION( 230216, "svg", 0)
+ ROM_LOAD( "tmpacman.svg", 0, 230216, CRC(2ab5c0f1) SHA1(b2b6482b03c28515dc76fd3d6034c8b7e6bf6efc) )
+ROM_END
+
@@ -2323,8 +2521,8 @@ void tmpacman_state::tmpacman(machine_config &config)
class tmscramb_state : public hh_ucom4_state
{
public:
- tmscramb_state(const machine_config &mconfig, device_type type, const char *tag)
- : hh_ucom4_state(mconfig, type, tag)
+ tmscramb_state(const machine_config &mconfig, device_type type, const char *tag) :
+ hh_ucom4_state(mconfig, type, tag)
{ }
void prepare_display();
@@ -2395,7 +2593,8 @@ void tmscramb_state::tmscramb(machine_config &config)
screen.set_svg_region("svg");
screen.set_refresh_hz(50);
screen.set_size(1920, 556);
- screen.set_visarea(0, 1920-1, 0, 556-1);
+ screen.set_visarea_full();
+
TIMER(config, "display_decay").configure_periodic(FUNC(hh_ucom4_state::display_decay_tick), attotime::from_msec(1));
/* sound hardware */
@@ -2404,6 +2603,16 @@ void tmscramb_state::tmscramb(machine_config &config)
m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25);
}
+// roms
+
+ROM_START( tmscramb )
+ ROM_REGION( 0x0800, "maincpu", 0 )
+ ROM_LOAD( "d553c-192", 0x0000, 0x0800, CRC(00fcc501) SHA1(a7771e934bf8268c83f38c7ec0acc668836e0939) )
+
+ ROM_REGION( 235601, "svg", 0)
+ ROM_LOAD( "tmscramb.svg", 0, 235601, CRC(9e76219a) SHA1(275273b98d378c9313dd73a3b86cc661a824b7af) )
+ROM_END
+
@@ -2425,8 +2634,8 @@ void tmscramb_state::tmscramb(machine_config &config)
class tcaveman_state : public hh_ucom4_state
{
public:
- tcaveman_state(const machine_config &mconfig, device_type type, const char *tag)
- : hh_ucom4_state(mconfig, type, tag)
+ tcaveman_state(const machine_config &mconfig, device_type type, const char *tag) :
+ hh_ucom4_state(mconfig, type, tag)
{ }
void prepare_display();
@@ -2494,7 +2703,8 @@ void tcaveman_state::tcaveman(machine_config &config)
screen.set_svg_region("svg");
screen.set_refresh_hz(50);
screen.set_size(1920, 559);
- screen.set_visarea(0, 1920-1, 0, 559-1);
+ screen.set_visarea_full();
+
TIMER(config, "display_decay").configure_periodic(FUNC(hh_ucom4_state::display_decay_tick), attotime::from_msec(1));
/* sound hardware */
@@ -2503,6 +2713,16 @@ void tcaveman_state::tcaveman(machine_config &config)
m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25);
}
+// roms
+
+ROM_START( tcaveman )
+ ROM_REGION( 0x0800, "maincpu", 0 )
+ ROM_LOAD( "d553c-209", 0x0000, 0x0800, CRC(d230d4b7) SHA1(2fb12b60410f5567c5e3afab7b8f5aa855d283be) )
+
+ ROM_REGION( 306952, "svg", 0)
+ ROM_LOAD( "tcaveman.svg", 0, 306952, CRC(a0588b14) SHA1(f67edf579963fc19bc7f9d268329cbc0230712d8) )
+ROM_END
+
@@ -2525,8 +2745,8 @@ void tcaveman_state::tcaveman(machine_config &config)
class alnchase_state : public hh_ucom4_state
{
public:
- alnchase_state(const machine_config &mconfig, device_type type, const char *tag)
- : hh_ucom4_state(mconfig, type, tag)
+ alnchase_state(const machine_config &mconfig, device_type type, const char *tag) :
+ hh_ucom4_state(mconfig, type, tag)
{ }
DECLARE_WRITE8_MEMBER(output_w);
@@ -2627,7 +2847,8 @@ void alnchase_state::alnchase(machine_config &config)
screen.set_svg_region("svg");
screen.set_refresh_hz(50);
screen.set_size(365, 1080);
- screen.set_visarea(0, 365-1, 0, 1080-1);
+ screen.set_visarea_full();
+
TIMER(config, "display_decay").configure_periodic(FUNC(hh_ucom4_state::display_decay_tick), attotime::from_msec(1));
/* sound hardware */
@@ -2636,196 +2857,7 @@ void alnchase_state::alnchase(machine_config &config)
m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25);
}
-
-
-
-
-/***************************************************************************
-
- Game driver(s)
-
-***************************************************************************/
-
-ROM_START( ufombs )
- ROM_REGION( 0x0400, "maincpu", 0 )
- ROM_LOAD( "d552c-017", 0x0000, 0x0400, CRC(0e208cb3) SHA1(57db6566916c94325e2b67ccb94b4ea3b233487d) )
-
- ROM_REGION( 222395, "svg", 0)
- ROM_LOAD( "ufombs.svg", 0, 222395, CRC(ae9fb93f) SHA1(165ea78eee93c503dbd277a56c41e3c63c534e38) )
-ROM_END
-
-
-ROM_START( ssfball )
- ROM_REGION( 0x0800, "maincpu", 0 )
- ROM_LOAD( "d553c-031", 0x0000, 0x0800, CRC(ff5d91d0) SHA1(9b2c0ae45f1e3535108ee5fef8a9010e00c8d5c3) )
-
- ROM_REGION( 331352, "svg", 0)
- ROM_LOAD( "ssfball.svg", 0, 331352, CRC(10cffb85) SHA1(c875f73a323d976088ffa1bc19f7bc865d4aac62) )
-ROM_END
-
-ROM_START( bmcfball )
- ROM_REGION( 0x0800, "maincpu", 0 )
- ROM_LOAD( "d553c-031", 0x0000, 0x0800, CRC(ff5d91d0) SHA1(9b2c0ae45f1e3535108ee5fef8a9010e00c8d5c3) )
-
- ROM_REGION( 331352, "svg", 0)
- ROM_LOAD( "bmcfball.svg", 0, 331352, CRC(43fbed1e) SHA1(28160e14b0879cd4dd9dab770c52c98f316ab653) )
-ROM_END
-
-
-ROM_START( bmsoccer )
- ROM_REGION( 0x0400, "maincpu", 0 )
- ROM_LOAD( "d552c-043", 0x0000, 0x0400, CRC(10c2a4ea) SHA1(6ebca7d406e22ff7a8cd529579b55a700da487b4) )
-
- ROM_REGION( 273796, "svg", 0)
- ROM_LOAD( "bmsoccer.svg", 0, 273796, CRC(4c88d9f8) SHA1(b4b82f26a09f54cd0b6a9d1c1a46796fbfcb578a) )
-ROM_END
-
-
-ROM_START( bmsafari )
- ROM_REGION( 0x0400, "maincpu", 0 )
- ROM_LOAD( "d552c-049", 0x0000, 0x0400, CRC(82fa3cbe) SHA1(019e7ec784e977eba09997fc46af253054fb222c) )
-
- ROM_REGION( 275386, "svg", 0)
- ROM_LOAD( "bmsafari.svg", 0, 275386, CRC(c24badbc) SHA1(b191f34155d6d4e834e7c6fe715d4bb76198ad72) )
-ROM_END
-
-
-ROM_START( splasfgt )
- ROM_REGION( 0x0800, "maincpu", 0 )
- ROM_LOAD( "d553c-055", 0x0000, 0x0800, CRC(eb471fbd) SHA1(f06cfe567bf6f9ed4dcdc88acdcfad50cd370a02) )
-
- ROM_REGION( 246609, "svg", 0)
- ROM_LOAD( "splasfgt.svg", 0, 246609, CRC(365fae43) SHA1(344c120c2efa92ada9171047affac801a06cf303) )
-ROM_END
-
-
-ROM_START( bcclimbr )
- ROM_REGION( 0x0800, "maincpu", 0 )
- ROM_LOAD( "d553c-170", 0x0000, 0x0800, CRC(fc2eabdb) SHA1(0f5cc854be7fdf105d9bd2114659d40c65f9d782) )
-
- ROM_REGION( 219971, "svg", 0)
- ROM_LOAD( "bcclimbr.svg", 0, 219971, CRC(9c9102f4) SHA1(6a7e02fd1467a26c734b01724e23cef9e4917805) )
-ROM_END
-
-
-ROM_START( tactix )
- ROM_REGION( 0x0800, "maincpu", 0 )
- ROM_LOAD( "d557lc-512", 0x0000, 0x0800, CRC(1df738cb) SHA1(15a5de28a3c03e6894d29c56b5b424983569ccf2) )
-ROM_END
-
-
-ROM_START( invspace )
- ROM_REGION( 0x0400, "maincpu", 0 )
- ROM_LOAD( "d552c-054", 0x0000, 0x0400, CRC(913d9c13) SHA1(f20edb5458e54d2f6d4e45e5d59efd87e05a6f3f) )
-
- ROM_REGION( 110899, "svg", 0)
- ROM_LOAD( "invspace.svg", 0, 110899, CRC(ae794333) SHA1(3552215389f02e4ef1d608f7dfc84f0499a78ee2) )
-ROM_END
-
-
-ROM_START( efball )
- ROM_REGION( 0x0800, "maincpu", 0 )
- ROM_LOAD( "d553c-080", 0x0000, 0x0800, CRC(54c1027f) SHA1(6cc98074dae9361fa8c0ed6501b6a57ad325ccbd) )
-ROM_END
-
-
-ROM_START( galaxy2 )
- ROM_REGION( 0x0800, "maincpu", 0 )
- ROM_LOAD( "d553c-153.s01", 0x0000, 0x0800, CRC(70d552b3) SHA1(72d50647701cb4bf85ea947a149a317aaec0f52c) )
-
- ROM_REGION( 325057, "svg", 0)
- ROM_LOAD( "galaxy2d.svg", 0, 325057, CRC(b2d27a0e) SHA1(502ec22c324903ffe8ff235b9a3b8898dce17a64) )
-ROM_END
-
-ROM_START( galaxy2b )
- ROM_REGION( 0x0800, "maincpu", 0 )
- ROM_LOAD( "d553c-153.s01", 0x0000, 0x0800, CRC(70d552b3) SHA1(72d50647701cb4bf85ea947a149a317aaec0f52c) )
-
- ROM_REGION( 266377, "svg", 0)
- ROM_LOAD( "galaxy2b.svg", 0, 266377, CRC(8633cebb) SHA1(6c41f5e918e1522eb55ef24270900a1b2477722b) )
-ROM_END
-
-
-ROM_START( astrocmd )
- ROM_REGION( 0x0800, "maincpu", 0 )
- ROM_LOAD( "d553c-202.s01", 0x0000, 0x0800, CRC(b4b34883) SHA1(6246d561c2df1f2124575d2ca671ef85b1819edd) )
-
- ROM_REGION( 335362, "svg", 0)
- ROM_LOAD( "astrocmd.svg", 0, 335362, CRC(fe2cd30f) SHA1(898a3d9afc5dca6c63ae28aed2c8530716ad1c45) )
-ROM_END
-
-
-ROM_START( edracula )
- ROM_REGION( 0x0800, "maincpu", 0 )
- ROM_LOAD( "d553c-206.s01", 0x0000, 0x0800, CRC(b524857b) SHA1(c1c89ed5dd4bb1e6e98462dc8fa5af2aa48d8ede) )
-
- ROM_REGION( 794532, "svg", 0)
- ROM_LOAD( "edracula.svg", 0, 794532, CRC(d20e018c) SHA1(7f70f1d373c034ec8c93e27b7e3371578ddaf61b) )
-ROM_END
-
-
-ROM_START( mcompgin )
- ROM_REGION( 0x0800, "maincpu", 0 )
- ROM_LOAD( "d650c-060", 0x0000, 0x0800, CRC(985e6da6) SHA1(ea4102a10a5741f06297c5426156e4b2f0d85a68) )
-ROM_END
-
-
-ROM_START( mvbfree )
- ROM_REGION( 0x0800, "maincpu", 0 )
- ROM_LOAD( "d553c-049", 0x0000, 0x0800, CRC(d64a8399) SHA1(97887e486fa29b1fc4a5a40cacf3c960f67aacbf) )
-ROM_END
-
-
-ROM_START( grobot9 )
- ROM_REGION( 0x0800, "maincpu", 0 )
- ROM_LOAD( "ttgr-511", 0x0000, 0x0800, CRC(1f25b2bb) SHA1(55ae7e23f6dd46cc6e1a65839327726678410c3a) )
-ROM_END
-
-
-ROM_START( tccombat )
- ROM_REGION( 0x0400, "maincpu", 0 )
- ROM_LOAD( "d552c-042", 0x0000, 0x0400, CRC(d7b5cfeb) SHA1(a267be8e43b7740758eb0881b655b1cc8aec43da) )
-
- ROM_REGION( 210960, "svg", 0)
- ROM_LOAD( "tccombat.svg", 0, 210960, CRC(03e9eba6) SHA1(d558d3063da42dc7cc02b769bca06a3732418837) )
-ROM_END
-
-
-ROM_START( tmtennis )
- ROM_REGION( 0x0400, "maincpu", 0 )
- ROM_LOAD( "d552c-048", 0x0000, 0x0400, CRC(78702003) SHA1(4d427d4dbeed901770c682338867f58c7b54eee3) )
-
- ROM_REGION( 204490, "svg", 0)
- ROM_LOAD( "tmtennis.svg", 0, 204490, CRC(ed0086e9) SHA1(26a5b2f0a9cd70401187146e1495aee80020658b) )
-ROM_END
-
-
-ROM_START( tmpacman )
- ROM_REGION( 0x0800, "maincpu", 0 )
- ROM_LOAD( "d553c-160", 0x0000, 0x0800, CRC(b21a8af7) SHA1(e3122be1873ce76a4067386bf250802776f0c2f9) )
-
- ROM_REGION( 230216, "svg", 0)
- ROM_LOAD( "tmpacman.svg", 0, 230216, CRC(2ab5c0f1) SHA1(b2b6482b03c28515dc76fd3d6034c8b7e6bf6efc) )
-ROM_END
-
-
-ROM_START( tmscramb )
- ROM_REGION( 0x0800, "maincpu", 0 )
- ROM_LOAD( "d553c-192", 0x0000, 0x0800, CRC(00fcc501) SHA1(a7771e934bf8268c83f38c7ec0acc668836e0939) )
-
- ROM_REGION( 235601, "svg", 0)
- ROM_LOAD( "tmscramb.svg", 0, 235601, CRC(9e76219a) SHA1(275273b98d378c9313dd73a3b86cc661a824b7af) )
-ROM_END
-
-
-ROM_START( tcaveman )
- ROM_REGION( 0x0800, "maincpu", 0 )
- ROM_LOAD( "d553c-209", 0x0000, 0x0800, CRC(d230d4b7) SHA1(2fb12b60410f5567c5e3afab7b8f5aa855d283be) )
-
- ROM_REGION( 306952, "svg", 0)
- ROM_LOAD( "tcaveman.svg", 0, 306952, CRC(a0588b14) SHA1(f67edf579963fc19bc7f9d268329cbc0230712d8) )
-ROM_END
-
+// roms
ROM_START( alnchase )
ROM_REGION( 0x0800, "maincpu", 0 )
@@ -2837,37 +2869,45 @@ ROM_END
-// YEAR NAME PARENT CMP MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS
-CONS( 1979, ufombs, 0, 0, ufombs, ufombs, ufombs_state, empty_init, "Bambino", "UFO Master-Blaster Station", MACHINE_SUPPORTS_SAVE )
-CONS( 1979, ssfball, 0, 0, ssfball, ssfball, ssfball_state, empty_init, "Bambino", "Superstar Football (Bambino)", MACHINE_SUPPORTS_SAVE )
-CONS( 1982, bmcfball, ssfball, 0, ssfball, ssfball, ssfball_state, empty_init, "Bambino", "Classic Football (Bambino)", MACHINE_SUPPORTS_SAVE )
-CONS( 1979, bmsoccer, 0, 0, bmsoccer, bmsoccer, bmsoccer_state, empty_init, "Bambino", "Kick The Goal Soccer", MACHINE_SUPPORTS_SAVE )
-CONS( 1981, bmsafari, 0, 0, bmsafari, bmsafari, bmsafari_state, empty_init, "Bambino", "Safari (Bambino)", MACHINE_SUPPORTS_SAVE )
-CONS( 1980, splasfgt, 0, 0, splasfgt, splasfgt, splasfgt_state, empty_init, "Bambino", "Space Laser Fight", MACHINE_SUPPORTS_SAVE )
+} // anonymous namespace
+
+/***************************************************************************
+
+ Game driver(s)
+
+***************************************************************************/
+
+// YEAR NAME PARENT CMP MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS
+CONS( 1979, ufombs, 0, 0, ufombs, ufombs, ufombs_state, empty_init, "Bambino", "UFO Master-Blaster Station", MACHINE_SUPPORTS_SAVE )
+CONS( 1979, ssfball, 0, 0, ssfball, ssfball, ssfball_state, empty_init, "Bambino", "Superstar Football (Bambino)", MACHINE_SUPPORTS_SAVE )
+CONS( 1982, bmcfball, ssfball, 0, ssfball, ssfball, ssfball_state, empty_init, "Bambino", "Classic Football (Bambino)", MACHINE_SUPPORTS_SAVE )
+CONS( 1979, bmsoccer, 0, 0, bmsoccer, bmsoccer, bmsoccer_state, empty_init, "Bambino", "Kick The Goal Soccer", MACHINE_SUPPORTS_SAVE )
+CONS( 1981, bmsafari, 0, 0, bmsafari, bmsafari, bmsafari_state, empty_init, "Bambino", "Safari (Bambino)", MACHINE_SUPPORTS_SAVE )
+CONS( 1980, splasfgt, 0, 0, splasfgt, splasfgt, splasfgt_state, empty_init, "Bambino", "Space Laser Fight", MACHINE_SUPPORTS_SAVE )
-CONS( 1982, bcclimbr, 0, 0, bcclimbr, bcclimbr, bcclimbr_state, empty_init, "Bandai", "Crazy Climber (Bandai)", MACHINE_SUPPORTS_SAVE )
+CONS( 1982, bcclimbr, 0, 0, bcclimbr, bcclimbr, bcclimbr_state, empty_init, "Bandai", "Crazy Climber (Bandai)", MACHINE_SUPPORTS_SAVE )
CONS( 1980, tactix, 0, 0, tactix, tactix, tactix_state, empty_init, "Castle Toy", "Tactix (Castle Toy)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK )
-CONS( 1980, invspace, 0, 0, invspace, invspace, invspace_state, empty_init, "Epoch", "Invader From Space", MACHINE_SUPPORTS_SAVE )
-CONS( 1980, efball, 0, 0, efball, efball, efball_state, empty_init, "Epoch", "Electronic Football (Epoch)", MACHINE_SUPPORTS_SAVE )
-CONS( 1981, galaxy2, 0, 0, galaxy2, galaxy2, galaxy2_state, empty_init, "Epoch", "Galaxy II (VFD Rev. D)", MACHINE_SUPPORTS_SAVE )
-CONS( 1981, galaxy2b, galaxy2, 0, galaxy2b, galaxy2, galaxy2_state, empty_init, "Epoch", "Galaxy II (VFD Rev. B)", MACHINE_SUPPORTS_SAVE )
-CONS( 1982, astrocmd, 0, 0, astrocmd, astrocmd, astrocmd_state, empty_init, "Epoch", "Astro Command", MACHINE_SUPPORTS_SAVE )
-CONS( 1982, edracula, 0, 0, edracula, edracula, edracula_state, empty_init, "Epoch", "Dracula (Epoch)", MACHINE_SUPPORTS_SAVE )
+CONS( 1980, invspace, 0, 0, invspace, invspace, invspace_state, empty_init, "Epoch", "Invader From Space", MACHINE_SUPPORTS_SAVE )
+CONS( 1980, efball, 0, 0, efball, efball, efball_state, empty_init, "Epoch", "Electronic Football (Epoch)", MACHINE_SUPPORTS_SAVE )
+CONS( 1981, galaxy2, 0, 0, galaxy2, galaxy2, galaxy2_state, empty_init, "Epoch", "Galaxy II (VFD Rev. D)", MACHINE_SUPPORTS_SAVE )
+CONS( 1981, galaxy2b, galaxy2, 0, galaxy2b, galaxy2, galaxy2_state, empty_init, "Epoch", "Galaxy II (VFD Rev. B)", MACHINE_SUPPORTS_SAVE )
+CONS( 1982, astrocmd, 0, 0, astrocmd, astrocmd, astrocmd_state, empty_init, "Epoch", "Astro Command", MACHINE_SUPPORTS_SAVE )
+CONS( 1982, edracula, 0, 0, edracula, edracula, edracula_state, empty_init, "Epoch", "Dracula (Epoch)", MACHINE_SUPPORTS_SAVE )
-CONS( 1979, mcompgin, 0, 0, mcompgin, mcompgin, mcompgin_state, empty_init, "Mattel", "Computer Gin", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW )
+CONS( 1979, mcompgin, 0, 0, mcompgin, mcompgin, mcompgin_state, empty_init, "Mattel", "Computer Gin", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW )
-CONS( 1979, mvbfree, 0, 0, mvbfree, mvbfree, mvbfree_state, empty_init, "Mego", "Mini-Vid Break Free", MACHINE_SUPPORTS_SAVE )
+CONS( 1979, mvbfree, 0, 0, mvbfree, mvbfree, mvbfree_state, empty_init, "Mego", "Mini-Vid: Break Free", MACHINE_SUPPORTS_SAVE )
CONS( 1980, grobot9, 0, 0, grobot9, grobot9, grobot9_state, empty_init, "Takatoku Toys", "Game Robot 9", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) // some of the minigames: ***
-CONS( 1980, tccombat, 0, 0, tccombat, tccombat, tccombat_state, empty_init, "Tomy", "Cosmic Combat", MACHINE_SUPPORTS_SAVE )
-CONS( 1980, tmtennis, 0, 0, tmtennis, tmtennis, tmtennis_state, empty_init, "Tomy", "Tennis (Tomy)", MACHINE_SUPPORTS_SAVE )
-CONS( 1982, tmpacman, 0, 0, tmpacman, tmpacman, tmpacman_state, empty_init, "Tomy", "Pac Man (Tomy)", MACHINE_SUPPORTS_SAVE )
-CONS( 1982, tmscramb, 0, 0, tmscramb, tmscramb, tmscramb_state, empty_init, "Tomy", "Scramble (Tomy)", MACHINE_SUPPORTS_SAVE )
-CONS( 1982, tcaveman, 0, 0, tcaveman, tcaveman, tcaveman_state, empty_init, "Tomy", "Caveman (Tomy)", MACHINE_SUPPORTS_SAVE )
-CONS( 1984, alnchase, 0, 0, alnchase, alnchase, alnchase_state, empty_init, "Tomy", "Alien Chase", MACHINE_SUPPORTS_SAVE )
+CONS( 1980, tccombat, 0, 0, tccombat, tccombat, tccombat_state, empty_init, "Tomy", "Cosmic Combat", MACHINE_SUPPORTS_SAVE )
+CONS( 1980, tmtennis, 0, 0, tmtennis, tmtennis, tmtennis_state, empty_init, "Tomy", "Tennis (Tomy)", MACHINE_SUPPORTS_SAVE )
+CONS( 1982, tmpacman, 0, 0, tmpacman, tmpacman, tmpacman_state, empty_init, "Tomy", "Pac Man (Tomy)", MACHINE_SUPPORTS_SAVE )
+CONS( 1982, tmscramb, 0, 0, tmscramb, tmscramb, tmscramb_state, empty_init, "Tomy", "Scramble (Tomy)", MACHINE_SUPPORTS_SAVE )
+CONS( 1982, tcaveman, 0, 0, tcaveman, tcaveman, tcaveman_state, empty_init, "Tomy", "Caveman (Tomy)", MACHINE_SUPPORTS_SAVE )
+CONS( 1984, alnchase, 0, 0, alnchase, alnchase, alnchase_state, empty_init, "Tomy", "Alien Chase", MACHINE_SUPPORTS_SAVE )
// ***: As far as MAME is concerned, the game is emulated fine. But for it to be playable, it requires interaction
// with other, unemulatable, things eg. game board/pieces, playing cards, pen & paper, etc.
diff --git a/src/mame/drivers/hideseek.cpp b/src/mame/drivers/hideseek.cpp
index 0f5280a1e14..8703174c3c3 100644
--- a/src/mame/drivers/hideseek.cpp
+++ b/src/mame/drivers/hideseek.cpp
@@ -2,7 +2,7 @@
// copyright-holders:Guru
/* Hide & Seek
-the AG-2 AX51201 should be the follow-up to the AG-1 AX51101 in gunpey.c
+the AG-2 AX51201 should be the follow-up to the AG-1 AX51101 in gunpey.cpp
AS:
Current ROM code barely contains some valid SH-2 opcodes but not enough for a HD64F7045F28. i.e. It doesn't contain VBR set-up, valid irq routines,
@@ -103,21 +103,21 @@ void hideseek_state::hideseek_palette(palette_device &palette) const
-MACHINE_CONFIG_START(hideseek_state::hideseek)
-
+void hideseek_state::hideseek(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", SH2, 7372800 * 4 )
- MCFG_DEVICE_PROGRAM_MAP(mem_map)
-// MCFG_TIMER_DRIVER_ADD_SCANLINE("scantimer", hideseek_state, hideseek_scanline, "screen", 0, 1)
+ SH2(config, m_maincpu, 7372800 * 4);
+ m_maincpu->set_addrmap(AS_PROGRAM, &hideseek_state::mem_map);
+// TIMER(config, "scantimer").configure_scanline(FUNC(hideseek_state::hideseek_scanline), "screen", 0, 1);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(64*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 64*8-1, 0*8, 32*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(hideseek_state, screen_update_hideseek)
- MCFG_SCREEN_PALETTE("palette")
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(64*8, 32*8);
+ screen.set_visarea(0*8, 64*8-1, 0*8, 32*8-1);
+ screen.set_screen_update(FUNC(hideseek_state::screen_update_hideseek));
+ screen.set_palette("palette");
PALETTE(config, "palette", FUNC(hideseek_state::hideseek_palette), 0x10000);
GFXDECODE(config, "gfxdecode", "palette", gfx_hideseek);
@@ -126,7 +126,7 @@ MACHINE_CONFIG_START(hideseek_state::hideseek)
SPEAKER(config, "rspeaker").front_right();
/* sound : M9810 */
-MACHINE_CONFIG_END
+}
ROM_START( hideseek )
diff --git a/src/mame/drivers/higemaru.cpp b/src/mame/drivers/higemaru.cpp
index 22d52ab9337..75c6cc4f052 100644
--- a/src/mame/drivers/higemaru.cpp
+++ b/src/mame/drivers/higemaru.cpp
@@ -163,23 +163,23 @@ static GFXDECODE_START( gfx_higemaru )
GFXDECODE_END
-MACHINE_CONFIG_START(higemaru_state::higemaru)
-
+void higemaru_state::higemaru(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, XTAL(12'000'000)/4) /* 3 MHz Sharp LH0080A Z80A-CPU-D */
- MCFG_DEVICE_PROGRAM_MAP(higemaru_map)
- MCFG_TIMER_DRIVER_ADD_SCANLINE("scantimer", higemaru_state, higemaru_scanline, "screen", 0, 1)
+ Z80(config, m_maincpu, XTAL(12'000'000)/4); /* 3 MHz Sharp LH0080A Z80A-CPU-D */
+ m_maincpu->set_addrmap(AS_PROGRAM, &higemaru_state::higemaru_map);
+ TIMER(config, "scantimer").configure_scanline(FUNC(higemaru_state::higemaru_scanline), "screen", 0, 1);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(32*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(higemaru_state, screen_update_higemaru)
- MCFG_SCREEN_PALETTE(m_palette)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(32*8, 32*8);
+ screen.set_visarea(0*8, 32*8-1, 2*8, 30*8-1);
+ screen.set_screen_update(FUNC(higemaru_state::screen_update_higemaru));
+ screen.set_palette(m_palette);
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, m_palette, gfx_higemaru)
+ GFXDECODE(config, m_gfxdecode, m_palette, gfx_higemaru);
PALETTE(config, m_palette, FUNC(higemaru_state::higemaru_palette), 32*4+16*16, 32);
@@ -189,7 +189,7 @@ MACHINE_CONFIG_START(higemaru_state::higemaru)
AY8910(config, "ay1", XTAL(12'000'000)/8).add_route(ALL_OUTPUTS, "mono", 0.25);
AY8910(config, "ay2", XTAL(12'000'000)/8).add_route(ALL_OUTPUTS, "mono", 0.25);
-MACHINE_CONFIG_END
+}
/***************************************************************************
diff --git a/src/mame/drivers/highvdeo.cpp b/src/mame/drivers/highvdeo.cpp
index 45dc366f227..ccce0c6d0c9 100644
--- a/src/mame/drivers/highvdeo.cpp
+++ b/src/mame/drivers/highvdeo.cpp
@@ -170,7 +170,6 @@ private:
DECLARE_WRITE16_MEMBER(fashion_output_w);
DECLARE_WRITE16_MEMBER(tv_oki6376_w);
DECLARE_READ8_MEMBER(tv_oki6376_r);
- DECLARE_WRITE16_MEMBER(tv_ncf_oki6376_w);
DECLARE_WRITE16_MEMBER(tv_ncf_oki6376_st_w);
DECLARE_READ8_MEMBER(nmi_clear_r);
DECLARE_WRITE8_MEMBER(nmi_clear_w);
@@ -299,7 +298,7 @@ WRITE16_MEMBER(highvdeo_state::tv_oki6376_w)
if (ACCESSING_BITS_0_7 && okidata != data)
{
okidata = data;
- m_okim6376->write(space, 0, data & ~0x80);
+ m_okim6376->write(data & ~0x80);
m_okim6376->st_w(data & 0x80);
}
}
@@ -380,15 +379,6 @@ READ16_MEMBER(highvdeo_state::tv_ncf_read1_r)
return (m_inputs[1]->read() & 0xbf) | resetpulse;
}
-WRITE16_MEMBER(highvdeo_state::tv_ncf_oki6376_w)
-{
- static int okidata;
- if (ACCESSING_BITS_0_7 && okidata != data) {
- okidata = data;
- m_okim6376->write( space, 0, data );
- }
-}
-
WRITE16_MEMBER(highvdeo_state::tv_ncf_oki6376_st_w)
{
if (ACCESSING_BITS_0_7)
@@ -408,7 +398,7 @@ void highvdeo_state::tv_ncf_map(address_map &map)
void highvdeo_state::tv_ncf_io(address_map &map)
{
map(0x0000, 0x0001).w(FUNC(highvdeo_state::write1_w)); // lamps
- map(0x0008, 0x0009).w(FUNC(highvdeo_state::tv_ncf_oki6376_w));
+ map(0x0008, 0x0008).w(m_okim6376, FUNC(okim6376_device::write));
map(0x000a, 0x000b).w(FUNC(highvdeo_state::tv_ncf_oki6376_st_w));
map(0x000c, 0x000d).r(FUNC(highvdeo_state::read0_r));
map(0x0010, 0x0011).r(FUNC(highvdeo_state::tv_ncf_read1_r));
@@ -434,7 +424,7 @@ void highvdeo_state::nyjoker_io(address_map &map)
map(0x0002, 0x0003).nopw(); // alternate coin counter (bits 0 and 2)
map(0x0004, 0x0005).w(FUNC(highvdeo_state::nyj_write2_w)); // coin and note counter
// AM_RANGE(0x0006, 0x0007) AM_WRITENOP
- map(0x0008, 0x0009).w(FUNC(highvdeo_state::tv_ncf_oki6376_w));
+ map(0x0008, 0x0008).w(m_okim6376, FUNC(okim6376_device::write));
map(0x000a, 0x000b).w(FUNC(highvdeo_state::tv_ncf_oki6376_st_w));
map(0x000c, 0x000d).portr("IN0");
map(0x000e, 0x000f).portr("DSW");
@@ -1229,20 +1219,21 @@ void highvdeo_state::ramdac_map(address_map &map)
}
-MACHINE_CONFIG_START(highvdeo_state::tv_vcf)
- MCFG_DEVICE_ADD("maincpu", V30, XTAL(12'000'000)/2 ) // ?
- MCFG_DEVICE_PROGRAM_MAP(tv_vcf_map)
- MCFG_DEVICE_IO_MAP(tv_vcf_io)
+void highvdeo_state::tv_vcf(machine_config &config)
+{
+ V30(config, m_maincpu, XTAL(12'000'000)/2); // ?
+ m_maincpu->set_addrmap(AS_PROGRAM, &highvdeo_state::tv_vcf_map);
+ m_maincpu->set_addrmap(AS_IO, &highvdeo_state::tv_vcf_io);
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(400, 300)
- MCFG_SCREEN_VISIBLE_AREA(0, 320-1, 0, 200-1)
- MCFG_SCREEN_UPDATE_DRIVER(highvdeo_state, screen_update_tourvisn)
- MCFG_SCREEN_VBLANK_CALLBACK(ASSERTLINE("maincpu", INPUT_LINE_NMI))
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(400, 300);
+ screen.set_visarea(0, 320-1, 0, 200-1);
+ screen.set_screen_update(FUNC(highvdeo_state::screen_update_tourvisn));
+ screen.screen_vblank().set_inputline(m_maincpu, INPUT_LINE_NMI, ASSERT_LINE);
PALETTE(config, m_palette).set_entries(0x100);
ramdac_device &ramdac(RAMDAC(config, "ramdac", 0, m_palette));
@@ -1252,144 +1243,141 @@ MACHINE_CONFIG_START(highvdeo_state::tv_vcf)
SPEAKER(config, "mono").front_center();
//OkiM6376
- MCFG_DEVICE_ADD("oki", OKIM6376, XTAL(12'000'000)/2/2/20)//Guess, gives approx. same sample rate as previous emulation
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
-MACHINE_CONFIG_END
+ OKIM6376(config, m_okim6376, XTAL(12'000'000)/2/2/20).add_route(ALL_OUTPUTS, "mono", 1.0); //Guess, gives approx. same sample rate as previous emulation
+}
-MACHINE_CONFIG_START(highvdeo_state::tv_ncf)
+void highvdeo_state::tv_ncf(machine_config &config)
+{
tv_vcf(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(tv_ncf_map)
- MCFG_DEVICE_IO_MAP(tv_ncf_io)
-MACHINE_CONFIG_END
+ m_maincpu->set_addrmap(AS_PROGRAM, &highvdeo_state::tv_ncf_map);
+ m_maincpu->set_addrmap(AS_IO, &highvdeo_state::tv_ncf_io);
+}
-MACHINE_CONFIG_START(highvdeo_state::nyjoker)
+void highvdeo_state::nyjoker(machine_config &config)
+{
tv_vcf(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(nyjoker_map)
- MCFG_DEVICE_IO_MAP(nyjoker_io)
-MACHINE_CONFIG_END
+ m_maincpu->set_addrmap(AS_PROGRAM, &highvdeo_state::nyjoker_map);
+ m_maincpu->set_addrmap(AS_IO, &highvdeo_state::nyjoker_io);
+}
-MACHINE_CONFIG_START(highvdeo_state::tv_tcf)
+void highvdeo_state::tv_tcf(machine_config &config)
+{
tv_vcf(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(tv_tcf_map)
- MCFG_DEVICE_IO_MAP(tv_tcf_io)
+ m_maincpu->set_addrmap(AS_PROGRAM, &highvdeo_state::tv_tcf_map);
+ m_maincpu->set_addrmap(AS_IO, &highvdeo_state::tv_tcf_io);
- MCFG_SCREEN_MODIFY("screen")
- MCFG_SCREEN_VISIBLE_AREA(0, 400-1, 0, 300-1)
+ subdevice<screen_device>("screen")->set_visarea(0, 400-1, 0, 300-1);
m_palette->set_format(palette_device::RGB_565, 0x100);
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(highvdeo_state::newmcard)
+void highvdeo_state::newmcard(machine_config &config)
+{
tv_tcf(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(newmcard_map)
- MCFG_DEVICE_IO_MAP(newmcard_io)
+ m_maincpu->set_addrmap(AS_PROGRAM, &highvdeo_state::newmcard_map);
+ m_maincpu->set_addrmap(AS_IO, &highvdeo_state::newmcard_io);
- MCFG_SCREEN_MODIFY("screen")
- MCFG_SCREEN_VISIBLE_AREA(0, 320-1, 0, 200-1)
-MACHINE_CONFIG_END
+ subdevice<screen_device>("screen")->set_visarea(0, 320-1, 0, 200-1);
+}
-MACHINE_CONFIG_START(highvdeo_state::record)
+void highvdeo_state::record(machine_config &config)
+{
newmcard(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_IO_MAP(record_io)
-MACHINE_CONFIG_END
+ m_maincpu->set_addrmap(AS_IO, &highvdeo_state::record_io);
+}
-MACHINE_CONFIG_START(highvdeo_state::ciclone)
+void highvdeo_state::ciclone(machine_config &config)
+{
tv_tcf(config);
- MCFG_DEVICE_REMOVE("maincpu")
-
- MCFG_DEVICE_ADD("maincpu", I80186, 20000000 ) // ?
- MCFG_DEVICE_PROGRAM_MAP(tv_tcf_map)
- MCFG_DEVICE_IO_MAP(ciclone_io)
-MACHINE_CONFIG_END
+ I80186(config.replace(), m_maincpu, 20000000); // ?
+ m_maincpu->set_addrmap(AS_PROGRAM, &highvdeo_state::tv_tcf_map);
+ m_maincpu->set_addrmap(AS_IO, &highvdeo_state::ciclone_io);
+}
-MACHINE_CONFIG_START(highvdeo_state::brasil)
- MCFG_DEVICE_ADD("maincpu", I80186, 20000000 ) // fashion doesn't like 20/2 Mhz
- MCFG_DEVICE_PROGRAM_MAP(brasil_map)
- MCFG_DEVICE_IO_MAP(brasil_io)
+void highvdeo_state::brasil(machine_config &config)
+{
+ I80186(config, m_maincpu, 20000000); // fashion doesn't like 20/2 Mhz
+ m_maincpu->set_addrmap(AS_PROGRAM, &highvdeo_state::brasil_map);
+ m_maincpu->set_addrmap(AS_IO, &highvdeo_state::brasil_io);
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(400, 300)
- MCFG_SCREEN_VISIBLE_AREA(0, 400-1, 0, 300-1)
- MCFG_SCREEN_UPDATE_DRIVER(highvdeo_state, screen_update_brasil)
- MCFG_SCREEN_VBLANK_CALLBACK(ASSERTLINE("maincpu", INPUT_LINE_NMI))
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(400, 300);
+ screen.set_visarea(0, 400-1, 0, 300-1);
+ screen.set_screen_update(FUNC(highvdeo_state::screen_update_brasil));
+ screen.screen_vblank().set_inputline(m_maincpu, INPUT_LINE_NMI, ASSERT_LINE);
PALETTE(config, m_palette, palette_device::RGB_565);
/* sound hardware */
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("oki", OKIM6376, XTAL(12'000'000)/2/2/20)//Guess, gives same sample rate as previous emulation
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
-MACHINE_CONFIG_END
+ OKIM6376(config, m_okim6376, XTAL(12'000'000)/2/2/20).add_route(ALL_OUTPUTS, "mono", 1.0); //Guess, gives same sample rate as previous emulation
+}
-MACHINE_CONFIG_START(highvdeo_state::fashion)
+void highvdeo_state::fashion(machine_config &config)
+{
brasil(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_IO_MAP(fashion_io)
-MACHINE_CONFIG_END
-MACHINE_CONFIG_START(highvdeo_state::grancapi)
- MCFG_DEVICE_ADD("maincpu", I80186, 20000000 )
- MCFG_DEVICE_PROGRAM_MAP(brasil_map)
- MCFG_DEVICE_IO_MAP(grancapi_io)
+ m_maincpu->set_addrmap(AS_IO, &highvdeo_state::fashion_io);
+}
+
+void highvdeo_state::grancapi(machine_config &config)
+{
+ I80186(config, m_maincpu, 20000000);
+ m_maincpu->set_addrmap(AS_PROGRAM, &highvdeo_state::brasil_map);
+ m_maincpu->set_addrmap(AS_IO, &highvdeo_state::grancapi_io);
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(400, 300)
- MCFG_SCREEN_VISIBLE_AREA(0, 400-1, 0, 300-1)
- MCFG_SCREEN_UPDATE_DRIVER(highvdeo_state, screen_update_brasil)
- MCFG_SCREEN_VBLANK_CALLBACK(ASSERTLINE("maincpu", INPUT_LINE_NMI))
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(400, 300);
+ screen.set_visarea(0, 400-1, 0, 300-1);
+ screen.set_screen_update(FUNC(highvdeo_state::screen_update_brasil));
+ screen.screen_vblank().set_inputline(m_maincpu, INPUT_LINE_NMI, ASSERT_LINE);
PALETTE(config, m_palette, palette_device::RGB_565);
/* sound hardware */
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("oki", OKIM6376, XTAL(12'000'000)/2/2/20)//Guess, gives same sample rate as previous emulation
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
-MACHINE_CONFIG_END
+ OKIM6376(config, m_okim6376, XTAL(12'000'000)/2/2/20).add_route(ALL_OUTPUTS, "mono", 1.0); //Guess, gives same sample rate as previous emulation
+}
-MACHINE_CONFIG_START(highvdeo_state::magicbom)
- MCFG_DEVICE_ADD("maincpu", I80186, 20000000 )
- MCFG_DEVICE_PROGRAM_MAP(brasil_map)
- MCFG_DEVICE_IO_MAP(magicbom_io)
+void highvdeo_state::magicbom(machine_config &config)
+{
+ I80186(config, m_maincpu, 20000000);
+ m_maincpu->set_addrmap(AS_PROGRAM, &highvdeo_state::brasil_map);
+ m_maincpu->set_addrmap(AS_IO, &highvdeo_state::magicbom_io);
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(400, 300)
- MCFG_SCREEN_VISIBLE_AREA(0, 400-1, 0, 300-1)
- MCFG_SCREEN_UPDATE_DRIVER(highvdeo_state, screen_update_brasil)
- MCFG_SCREEN_VBLANK_CALLBACK(ASSERTLINE("maincpu", INPUT_LINE_NMI))
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(400, 300);
+ screen.set_visarea(0, 400-1, 0, 300-1);
+ screen.set_screen_update(FUNC(highvdeo_state::screen_update_brasil));
+ screen.screen_vblank().set_inputline(m_maincpu, INPUT_LINE_NMI, ASSERT_LINE);
PALETTE(config, m_palette, palette_device::RGB_565);
/* sound hardware */
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("oki", OKIM6376, XTAL(12'000'000)/2/2/20)//Guess, gives same sample rate as previous emulation
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
-MACHINE_CONFIG_END
+ OKIM6376(config, m_okim6376, XTAL(12'000'000)/2/2/20).add_route(ALL_OUTPUTS, "mono", 1.0); //Guess, gives same sample rate as previous emulation
+}
ROM_START( tour4000 )
diff --git a/src/mame/drivers/hitme.cpp b/src/mame/drivers/hitme.cpp
index e80ee193270..85f00383a99 100644
--- a/src/mame/drivers/hitme.cpp
+++ b/src/mame/drivers/hitme.cpp
@@ -314,31 +314,30 @@ void hitme_state::machine_reset()
m_timeout_time = attotime::zero;
}
-MACHINE_CONFIG_START(hitme_state::hitme)
-
+void hitme_state::hitme(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", I8080, MASTER_CLOCK/16)
- MCFG_DEVICE_PROGRAM_MAP(hitme_map)
- MCFG_DEVICE_IO_MAP(hitme_portmap)
+ I8080(config, m_maincpu, MASTER_CLOCK/16);
+ m_maincpu->set_addrmap(AS_PROGRAM, &hitme_state::hitme_map);
+ m_maincpu->set_addrmap(AS_IO, &hitme_state::hitme_portmap);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(40*8, 19*10)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 40*8-1, 0*8, 19*10-1)
- MCFG_SCREEN_UPDATE_DRIVER(hitme_state, screen_update_hitme)
- MCFG_SCREEN_PALETTE("palette")
-
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_hitme)
-
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_refresh_hz(60);
+ m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ m_screen->set_size(40*8, 19*10);
+ m_screen->set_visarea(0*8, 40*8-1, 0*8, 19*10-1);
+ m_screen->set_screen_update(FUNC(hitme_state::screen_update_hitme));
+ m_screen->set_palette("palette");
+
+ GFXDECODE(config, m_gfxdecode, "palette", gfx_hitme);
PALETTE(config, "palette", palette_device::MONOCHROME);
/* sound hardware */
SPEAKER(config, "mono").front_center();
DISCRETE(config, m_discrete, hitme_discrete).add_route(ALL_OUTPUTS, "mono", 1.0);
-MACHINE_CONFIG_END
+}
@@ -349,19 +348,19 @@ MACHINE_CONFIG_END
Barricade or is the resolution set by a dip switch?
*/
-MACHINE_CONFIG_START(hitme_state::barricad)
+void hitme_state::barricad(machine_config &config)
+{
hitme(config);
/* video hardware */
- MCFG_SCREEN_MODIFY("screen")
- MCFG_SCREEN_SIZE(32*8, 24*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 0*8, 24*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(hitme_state, screen_update_barricad)
+ m_screen->set_size(32*8, 24*8);
+ m_screen->set_visarea(0*8, 32*8-1, 0*8, 24*8-1);
+ m_screen->set_screen_update(FUNC(hitme_state::screen_update_barricad));
- MCFG_GFXDECODE_MODIFY("gfxdecode", gfx_barricad)
+ m_gfxdecode->set_info(gfx_barricad);
MCFG_VIDEO_START_OVERRIDE(hitme_state,barricad)
-MACHINE_CONFIG_END
+}
diff --git a/src/mame/drivers/hitpoker.cpp b/src/mame/drivers/hitpoker.cpp
index cdba067704c..cafebdb5861 100644
--- a/src/mame/drivers/hitpoker.cpp
+++ b/src/mame/drivers/hitpoker.cpp
@@ -462,7 +462,8 @@ static GFXDECODE_START( gfx_hitpoker )
GFXDECODE_ENTRY( "gfx1", 0, hitpoker_layout_8bpp, 0, 8 )
GFXDECODE_END
-MACHINE_CONFIG_START(hitpoker_state::hitpoker)
+void hitpoker_state::hitpoker(machine_config &config)
+{
MC68HC11(config, m_maincpu, 1000000);
m_maincpu->set_addrmap(AS_PROGRAM, &hitpoker_state::hitpoker_map);
m_maincpu->set_addrmap(AS_IO, &hitpoker_state::hitpoker_io);
diff --git a/src/mame/drivers/hk68v10.cpp b/src/mame/drivers/hk68v10.cpp
index 935d25039c6..2f5598f22ae 100644
--- a/src/mame/drivers/hk68v10.cpp
+++ b/src/mame/drivers/hk68v10.cpp
@@ -337,10 +337,11 @@ static void hk68_vme_cards(device_slot_interface &device)
/*
* Machine configuration
*/
-MACHINE_CONFIG_START(hk68v10_state::hk68v10)
+void hk68v10_state::hk68v10(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M68010, 10_MHz_XTAL)
- MCFG_DEVICE_PROGRAM_MAP (hk68v10_mem)
+ M68010(config, m_maincpu, 10_MHz_XTAL);
+ m_maincpu->set_addrmap(AS_PROGRAM, &hk68v10_state::hk68v10_mem);
Z8536(config, "cio", SCC_CLOCK);
@@ -354,9 +355,9 @@ MACHINE_CONFIG_START(hk68v10_state::hk68v10)
rs232trm.rxd_handler().set(m_sccterm, FUNC(scc8530_device::rxa_w));
rs232trm.cts_handler().set(m_sccterm, FUNC(scc8530_device::ctsa_w));
- MCFG_VME_DEVICE_ADD("vme")
- MCFG_VME_SLOT_ADD("vme", 1, hk68_vme_cards, nullptr)
-MACHINE_CONFIG_END
+ VME(config, "vme", 0);
+ VME_SLOT(config, "slot1", hk68_vme_cards, nullptr, 1, "vme");
+}
/* ROM definitions */
ROM_START (hk68v10)
diff --git a/src/mame/drivers/hnayayoi.cpp b/src/mame/drivers/hnayayoi.cpp
index e00cde62f19..6941b922ac0 100644
--- a/src/mame/drivers/hnayayoi.cpp
+++ b/src/mame/drivers/hnayayoi.cpp
@@ -542,15 +542,14 @@ void hnayayoi_state::machine_reset()
}
-MACHINE_CONFIG_START(hnayayoi_state::hnayayoi)
-
+void hnayayoi_state::hnayayoi(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, 20000000/4 ) /* 5 MHz ???? */
- MCFG_DEVICE_PROGRAM_MAP(hnayayoi_map)
- MCFG_DEVICE_IO_MAP(hnayayoi_io_map)
+ Z80(config, m_maincpu, 20000000/4); /* 5 MHz ???? */
+ m_maincpu->set_addrmap(AS_PROGRAM, &hnayayoi_state::hnayayoi_map);
+ m_maincpu->set_addrmap(AS_IO, &hnayayoi_state::hnayayoi_io_map);
- MCFG_DEVICE_ADD("nmiclock", CLOCK, 8000)
- MCFG_CLOCK_SIGNAL_HANDLER(WRITELINE(*this, hnayayoi_state, nmi_clock_w))
+ CLOCK(config, "nmiclock", 8000).signal_handler().set(FUNC(hnayayoi_state::nmi_clock_w));
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
@@ -561,9 +560,9 @@ MACHINE_CONFIG_START(hnayayoi_state::hnayayoi)
m_mainlatch->q_out_cb<4>().set(FUNC(hnayayoi_state::nmi_enable_w)).invert();
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_RAW_PARAMS(20_MHz_XTAL / 2, 632, 0, 512, 263, 0, 243)
- MCFG_SCREEN_UPDATE_DEVICE("crtc", hd6845_device, screen_update)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_raw(20_MHz_XTAL / 2, 632, 0, 512, 263, 0, 243);
+ screen.set_screen_update("crtc", FUNC(hd6845_device::screen_update));
PALETTE(config, m_palette, palette_device::RGB_444_PROMS, "proms", 256);
@@ -586,26 +585,26 @@ MACHINE_CONFIG_START(hnayayoi_state::hnayayoi)
ymsnd.add_route(2, "mono", 0.25);
ymsnd.add_route(3, "mono", 0.80);
- MCFG_DEVICE_ADD("msm", MSM5205, 384000)
- MCFG_MSM5205_PRESCALER_SELECTOR(SEX_4B)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
-MACHINE_CONFIG_END
+ MSM5205(config, m_msm, 384000);
+ m_msm->set_prescaler_selector(msm5205_device::SEX_4B);
+ m_msm->add_route(ALL_OUTPUTS, "mono", 1.0);
+}
-MACHINE_CONFIG_START(hnayayoi_state::hnfubuki)
+void hnayayoi_state::hnfubuki(machine_config &config)
+{
hnayayoi(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(hnfubuki_map)
- MCFG_DEVICE_REMOVE_ADDRESS_MAP(AS_IO)
+ m_maincpu->set_addrmap(AS_PROGRAM, &hnayayoi_state::hnfubuki_map);
+ m_maincpu->set_addrmap(AS_IO, address_map_constructor());
// D5
m_mainlatch->q_out_cb<4>().set(FUNC(hnayayoi_state::nmi_enable_w));
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(hnayayoi_state::untoucha)
+void hnayayoi_state::untoucha(machine_config &config)
+{
hnayayoi(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(untoucha_map)
- MCFG_DEVICE_IO_MAP(untoucha_io_map)
+ m_maincpu->set_addrmap(AS_PROGRAM, &hnayayoi_state::untoucha_map);
+ m_maincpu->set_addrmap(AS_IO, &hnayayoi_state::untoucha_io_map);
m_mainlatch->q_out_cb<1>().set(m_msm, FUNC(msm5205_device::vclk_w));
m_mainlatch->q_out_cb<2>().set(FUNC(hnayayoi_state::nmi_enable_w));
@@ -615,7 +614,7 @@ MACHINE_CONFIG_START(hnayayoi_state::untoucha)
subdevice<hd6845_device>("crtc")->set_update_row_callback(FUNC(hnayayoi_state::untoucha_update_row), this);
MCFG_VIDEO_START_OVERRIDE(hnayayoi_state,untoucha)
-MACHINE_CONFIG_END
+}
/***************************************************************************
diff --git a/src/mame/drivers/hng64.cpp b/src/mame/drivers/hng64.cpp
index 89688fe9561..359eeaf44e4 100644
--- a/src/mame/drivers/hng64.cpp
+++ b/src/mame/drivers/hng64.cpp
@@ -699,7 +699,7 @@ READ8_MEMBER(hng64_state::hng64_dualport_r)
}
}
- return m_dt71321_dpram->right_r(space, offset);
+ return m_dt71321_dpram->right_r(offset);
}
/*
@@ -731,7 +731,7 @@ Beast Busters 2 outputs (all at offset == 0x1c):
WRITE8_MEMBER(hng64_state::hng64_dualport_w)
{
- m_dt71321_dpram->right_w(space,offset, data);
+ m_dt71321_dpram->right_w(offset, data);
LOG("%s: dualport WRITE %04x %02x\n", machine().describe_context(), offset, data);
}
@@ -2016,7 +2016,7 @@ WRITE8_MEMBER(hng64_state::ioport7_w)
READ8_MEMBER(hng64_state::ioport0_r)
{
uint16_t addr = (m_ex_ramaddr | (m_ex_ramaddr_upper<<9)) & 0x7ff;
- uint8_t ret = m_dt71321_dpram->left_r(space, addr);
+ uint8_t ret = m_dt71321_dpram->left_r(addr);
LOG("%s: ioport0_r %02x (from address %04x)\n", machine().describe_context(), ret, addr);
return ret;
@@ -2025,7 +2025,7 @@ READ8_MEMBER(hng64_state::ioport0_r)
WRITE8_MEMBER(hng64_state::ioport0_w)
{
uint16_t addr = (m_ex_ramaddr | (m_ex_ramaddr_upper<<9)) & 0x7ff;
- m_dt71321_dpram->left_w(space, addr, data);
+ m_dt71321_dpram->left_w(addr, data);
LOG("%s: ioport0_w %02x (to address %04x)\n", machine().describe_context(), data, addr);
}
@@ -2106,7 +2106,8 @@ void hng64_state::init_io()
m_ex_ramaddr_upper = 0;
}
-MACHINE_CONFIG_START(hng64_state::hng64)
+void hng64_state::hng64(machine_config &config)
+{
/* basic machine hardware */
VR4300BE(config, m_maincpu, HNG64_MASTER_CLOCK); // actually R4300
m_maincpu->set_icache_size(16384);
diff --git a/src/mame/drivers/holeland.cpp b/src/mame/drivers/holeland.cpp
index 36a44ff3566..1be272f5e98 100644
--- a/src/mame/drivers/holeland.cpp
+++ b/src/mame/drivers/holeland.cpp
@@ -274,13 +274,13 @@ static GFXDECODE_START( gfx_crzrally )
GFXDECODE_END
-MACHINE_CONFIG_START(holeland_state::holeland)
-
+void holeland_state::holeland(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, 3355700) /* measured 298ns on PCB */
- MCFG_DEVICE_PROGRAM_MAP(holeland_map)
- MCFG_DEVICE_IO_MAP(io_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", holeland_state, irq0_line_hold)
+ Z80(config, m_maincpu, 3355700); /* measured 298ns on PCB */
+ m_maincpu->set_addrmap(AS_PROGRAM, &holeland_state::holeland_map);
+ m_maincpu->set_addrmap(AS_IO, &holeland_state::io_map);
+ m_maincpu->set_vblank_int("screen", FUNC(holeland_state::irq0_line_hold));
LS259(config, m_latch); // 3J
m_latch->parallel_out_cb().set(FUNC(holeland_state::pal_offs_w)).mask(0x03);
@@ -291,15 +291,15 @@ MACHINE_CONFIG_START(holeland_state::holeland)
WATCHDOG_TIMER(config, "watchdog");
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(32*16, 32*16)
- MCFG_SCREEN_VISIBLE_AREA(0*16, 32*16-1, 2*16, 30*16-1)
- MCFG_SCREEN_UPDATE_DRIVER(holeland_state, screen_update_holeland)
- MCFG_SCREEN_PALETTE(m_palette)
-
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_holeland)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(32*16, 32*16);
+ screen.set_visarea(0*16, 32*16-1, 2*16, 30*16-1);
+ screen.set_screen_update(FUNC(holeland_state::screen_update_holeland));
+ screen.set_palette(m_palette);
+
+ GFXDECODE(config, m_gfxdecode, m_palette, gfx_holeland);
PALETTE(config, m_palette, palette_device::RGB_444_PROMS, "proms", 256);
MCFG_VIDEO_START_OVERRIDE(holeland_state,holeland)
@@ -319,7 +319,7 @@ MACHINE_CONFIG_START(holeland_state::holeland)
sp0256_device &speech(SP0256(config, "speech", 3355700)); /* measured 298ns on PCB */
speech.data_request_callback().set_inputline("maincpu", INPUT_LINE_NMI);
speech.add_route(ALL_OUTPUTS, "mono", 1.0);
-MACHINE_CONFIG_END
+}
/*
@@ -355,13 +355,13 @@ Notes:
*/
-MACHINE_CONFIG_START(holeland_state::crzrally)
-
+void holeland_state::crzrally(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, 20000000/4) /* 5 MHz */
- MCFG_DEVICE_PROGRAM_MAP(crzrally_map)
- MCFG_DEVICE_IO_MAP(io_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", holeland_state, irq0_line_hold)
+ Z80(config, m_maincpu, 20000000/4); /* 5 MHz */
+ m_maincpu->set_addrmap(AS_PROGRAM, &holeland_state::crzrally_map);
+ m_maincpu->set_addrmap(AS_IO, &holeland_state::io_map);
+ m_maincpu->set_vblank_int("screen", FUNC(holeland_state::irq0_line_hold));
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_1);
@@ -372,15 +372,15 @@ MACHINE_CONFIG_START(holeland_state::crzrally)
WATCHDOG_TIMER(config, "watchdog");
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(59)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(32*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(holeland_state, screen_update_crzrally)
- MCFG_SCREEN_PALETTE(m_palette)
-
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_crzrally)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(59);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(32*8, 32*8);
+ screen.set_visarea(0*8, 32*8-1, 2*8, 30*8-1);
+ screen.set_screen_update(FUNC(holeland_state::screen_update_crzrally));
+ screen.set_palette(m_palette);
+
+ GFXDECODE(config, m_gfxdecode, m_palette, gfx_crzrally);
PALETTE(config, m_palette, palette_device::RGB_444_PROMS, "proms", 256);
MCFG_VIDEO_START_OVERRIDE(holeland_state,crzrally)
@@ -396,7 +396,7 @@ MACHINE_CONFIG_START(holeland_state::crzrally)
ay2.port_a_read_callback().set_ioport("DSW1");
ay2.port_b_read_callback().set_ioport("DSW2");
ay2.add_route(ALL_OUTPUTS, "mono", 0.25);
-MACHINE_CONFIG_END
+}
/***************************************************************************
diff --git a/src/mame/drivers/homedata.cpp b/src/mame/drivers/homedata.cpp
index de844e42ee8..b43a51f46fa 100644
--- a/src/mame/drivers/homedata.cpp
+++ b/src/mame/drivers/homedata.cpp
@@ -301,20 +301,12 @@ WRITE8_MEMBER(homedata_state::mrokumei_keyboard_select_w)
}
-READ8_MEMBER(homedata_state::mrokumei_sound_io_r)
-{
- if (m_sndbank & 4)
- return(m_soundlatch->read(space, 0));
- else
- return memregion("audiocpu")->base()[0x10000 + offset + (m_sndbank & 1) * 0x10000];
-}
-
WRITE8_MEMBER(homedata_state::mrokumei_sound_bank_w)
{
/* bit 0 = ROM bank
bit 2 = ROM or soundlatch
*/
- m_sndbank = data;
+ m_mrokumei_soundbank->set_bank(data & 7);
}
WRITE8_MEMBER(homedata_state::mrokumei_sound_cmd_w)
@@ -356,15 +348,15 @@ WRITE8_MEMBER(homedata_state::reikaids_upd7807_portc_w)
*/
// logerror("%s: port C wr %02x (STATUS %d DATA %d)\n", machine().describe_context(), data, BIT(data, 2), BIT(data, 6));
- membank("bank2")->set_entry(data & 0x03);
+ m_audiobank->set_entry(data & 0x03);
machine().bookkeeping().coin_counter_w(0, ~data & 0x80);
if (BIT(m_upd7807_portc, 5) && !BIT(data, 5)) /* write clock 1->0 */
- m_ymsnd->write(space, BIT(data, 3), m_upd7807_porta);
+ m_ymsnd->write(BIT(data, 3), m_upd7807_porta);
if (BIT(m_upd7807_portc, 4) && !BIT(data, 4)) /* read clock 1->0 */
- m_upd7807_porta = m_ymsnd->read(space, BIT(data, 3));
+ m_upd7807_porta = m_ymsnd->read(BIT(data, 3));
m_upd7807_portc = data;
}
@@ -386,18 +378,6 @@ READ8_MEMBER(homedata_state::reikaids_io_r)
return res;
}
-READ8_MEMBER(homedata_state::reikaids_snd_command_r)
-{
- //logerror("%s: sndmcd_r (%02x)\n", machine().describe_context(), m_snd_command);
- return m_snd_command;
-}
-
-WRITE8_MEMBER(homedata_state::reikaids_snd_command_w)
-{
- m_snd_command = data;
- //logerror("%s: coprocessor_command_w %02x\n", machine().describe_context(), data);
-}
-
/********************************************************************************
@@ -407,18 +387,6 @@ WRITE8_MEMBER(homedata_state::reikaids_snd_command_w)
********************************************************************************/
-WRITE8_MEMBER(homedata_state::pteacher_snd_command_w)
-{
- //logerror("%s: snd_command_w %02x\n", machine().describe_context(), data);
- m_from_cpu = data;
-}
-
-READ8_MEMBER(homedata_state::pteacher_snd_r)
-{
- //logerror("%s: pteacher_snd_r %02x\n",machine().describe_context(),to_cpu);
- return m_to_cpu;
-}
-
READ8_MEMBER(homedata_state::pteacher_io_r)
{
/* bit 6: !vblank
@@ -462,19 +430,13 @@ READ8_MEMBER(homedata_state::pteacher_keyboard_r)
READ8_MEMBER(homedata_state::pteacher_upd7807_porta_r)
{
if (!BIT(m_upd7807_portc, 6))
- m_upd7807_porta = m_from_cpu;
+ m_upd7807_porta = m_soundlatch->read(space, 0);
else
logerror("%s: read PA with PC *not* clear\n", machine().describe_context());
return m_upd7807_porta;
}
-WRITE8_MEMBER(homedata_state::pteacher_snd_answer_w)
-{
- m_to_cpu = data;
- //logerror("%s: to_cpu = %02x\n", machine().describe_context(), m_to_cpu);
-}
-
WRITE8_MEMBER(homedata_state::pteacher_upd7807_porta_w)
{
m_upd7807_porta = data;
@@ -495,7 +457,7 @@ WRITE8_MEMBER(homedata_state::pteacher_upd7807_portc_w)
// logerror("%s: port C wr %02x\n", machine().describe_context(), data);
- membank("bank2")->set_entry((data & 0x0c) >> 2);
+ m_audiobank->set_entry((data & 0x0c) >> 2);
machine().bookkeeping().coin_counter_w(0, ~data & 0x80);
@@ -514,9 +476,9 @@ WRITE8_MEMBER(homedata_state::bankswitch_w)
/* last bank is fixed and is #0 for us, other banks start from #1 (hence data+1 below)*/
if (data < last_bank)
- membank("bank1")->set_entry(data + 1);
+ m_mainbank->set_entry(data + 1);
else
- membank("bank1")->set_entry(0);
+ m_mainbank->set_entry(0);
}
@@ -539,7 +501,7 @@ void homedata_state::mrokumei_map(address_map &map)
map(0x8000, 0x8000).w(FUNC(homedata_state::mrokumei_blitter_start_w)); // in some games also ROM bank switch to access service ROM
map(0x8001, 0x8001).w(FUNC(homedata_state::mrokumei_keyboard_select_w));
map(0x8002, 0x8002).w(FUNC(homedata_state::mrokumei_sound_cmd_w));
- map(0x8003, 0x8003).w(m_sn, FUNC(sn76489a_device::command_w));
+ map(0x8003, 0x8003).w(m_sn, FUNC(sn76489a_device::write));
map(0x8006, 0x8006).w(FUNC(homedata_state::homedata_blitter_param_w));
map(0x8007, 0x8007).w(FUNC(homedata_state::mrokumei_blitter_bank_w));
map(0x8000, 0xffff).rom();
@@ -556,12 +518,18 @@ void homedata_state::mrokumei_sound_map(address_map &map)
void homedata_state::mrokumei_sound_io_map(address_map &map)
{
- map(0x0000, 0xffff).r(FUNC(homedata_state::mrokumei_sound_io_r)); /* read address is 16-bit */
+ map(0x0000, 0xffff).r(m_mrokumei_soundbank, FUNC(address_map_bank_device::read8)); /* read address is 16-bit */
map(0x0040, 0x0040).mirror(0xff00).w("dac", FUNC(dac_byte_interface::data_w)); /* write address is only 8-bit */
// hourouki mirror...
map(0x007f, 0x007f).mirror(0xff00).w("dac", FUNC(dac_byte_interface::data_w)); /* write address is only 8-bit */
}
+void homedata_state::mrokumei_sound_banked_map(address_map &map)
+{
+ map(0x00000, 0x1ffff).mirror(0x20000).rom().region("audiocpu", 0);
+ map(0x40000, 0x40000).mirror(0x3ffff).r(m_soundlatch, FUNC(generic_latch_8_device::read));
+}
+
/********************************************************************************/
void homedata_state::reikaids_map(address_map &map)
@@ -577,22 +545,22 @@ void homedata_state::reikaids_map(address_map &map)
map(0x7ffe, 0x7ffe).w(FUNC(homedata_state::reikaids_blitter_bank_w));
map(0x7fff, 0x7fff).w(FUNC(homedata_state::reikaids_blitter_start_w));
map(0x8000, 0x8000).w(FUNC(homedata_state::bankswitch_w));
- map(0x8002, 0x8002).w(FUNC(homedata_state::reikaids_snd_command_w));
+ map(0x8002, 0x8002).w(m_soundlatch, FUNC(generic_latch_8_device::write));
map(0x8005, 0x8005).w(FUNC(homedata_state::reikaids_gfx_bank_w));
map(0x8006, 0x8006).w(FUNC(homedata_state::homedata_blitter_param_w));
- map(0x8000, 0xbfff).bankr("bank1");
+ map(0x8000, 0xbfff).bankr("mainbank");
map(0xc000, 0xffff).rom();
}
void homedata_state::reikaids_upd7807_map(address_map &map)
{
- map(0x0000, 0xfeff).bankr("bank2"); /* External ROM (Banked) */
+ map(0x0000, 0xfeff).bankr("audiobank"); /* External ROM (Banked) */
}
/**************************************************************************/
-void homedata_state::pteacher_map(address_map &map)
+void homedata_state::pteacher_base_map(address_map &map)
{
map(0x0000, 0x3fff).ram().w(FUNC(homedata_state::mrokumei_videoram_w)).share("videoram");
map(0x4000, 0x5eff).ram();
@@ -600,22 +568,55 @@ void homedata_state::pteacher_map(address_map &map)
map(0x6000, 0x6fff).ram(); /* work ram */
map(0x7800, 0x7800).ram(); /* behaves as normal RAM */
map(0x7801, 0x7801).r(FUNC(homedata_state::pteacher_io_r)); // vblank, visible page
- map(0x7ff2, 0x7ff2).r(FUNC(homedata_state::pteacher_snd_r));
map(0x7ff0, 0x7ffd).writeonly().share("vreg");
map(0x7fff, 0x7fff).w(FUNC(homedata_state::pteacher_blitter_start_w));
map(0x8000, 0x8000).w(FUNC(homedata_state::bankswitch_w));
- map(0x8002, 0x8002).w(FUNC(homedata_state::pteacher_snd_command_w));
+ map(0x8002, 0x8002).w(m_soundlatch, FUNC(generic_latch_8_device::write));
map(0x8005, 0x8005).w(FUNC(homedata_state::pteacher_blitter_bank_w));
map(0x8006, 0x8006).w(FUNC(homedata_state::homedata_blitter_param_w));
map(0x8007, 0x8007).w(FUNC(homedata_state::pteacher_gfx_bank_w));
- map(0x8000, 0xbfff).bankr("bank1");
+ map(0x8000, 0xbfff).bankr("mainbank");
map(0xc000, 0xffff).rom();
}
+void homedata_state::pteacher_map(address_map &map)
+{
+ pteacher_base_map(map);
+ map(0x7ff2, 0x7ff2).r(m_mainlatch, FUNC(generic_latch_8_device::read));
+}
+
void homedata_state::pteacher_upd7807_map(address_map &map)
{
- map(0x0000, 0x0000).w(FUNC(homedata_state::pteacher_snd_answer_w));
- map(0x0000, 0xfeff).bankr("bank2"); /* External ROM (Banked) */
+ map(0x0000, 0x0000).w(m_mainlatch, FUNC(generic_latch_8_device::write));
+ map(0x0000, 0xfeff).bankr("audiobank"); /* External ROM (Banked) */
+}
+
+/**************************************************************************/
+
+
+ /* it seems that Mahjong Jogakuen runs on the same board as the others,
+ but with just these two addresses swapped. Instead of creating a new
+ MachineDriver, I just fix them here. */
+void homedata_state::jogakuen_map(address_map &map)
+{
+ pteacher_map(map);
+ map(0x8005, 0x8005).w(FUNC(homedata_state::pteacher_gfx_bank_w));
+ map(0x8007, 0x8007).w(FUNC(homedata_state::pteacher_blitter_bank_w));
+}
+
+/**************************************************************************/
+
+
+void homedata_state::mjikaga_map(address_map &map)
+{
+ pteacher_base_map(map);
+ map(0x7802, 0x7802).r(m_mainlatch, FUNC(generic_latch_8_device::read));
+}
+
+void homedata_state::mjikaga_upd7807_map(address_map &map)
+{
+ map(0x0123, 0x0123).w(m_mainlatch, FUNC(generic_latch_8_device::write));
+ map(0x0000, 0xfeff).bankr("audiobank"); /* External ROM (Banked) */
}
/**************************************************************************/
@@ -1128,17 +1129,15 @@ MACHINE_START_MEMBER(homedata_state,homedata)
save_item(NAME(m_blitter_param_count));
save_item(NAME(m_blitter_param));
save_item(NAME(m_vblank));
- save_item(NAME(m_sndbank));
save_item(NAME(m_keyb));
- save_item(NAME(m_snd_command));
}
MACHINE_START_MEMBER(homedata_state,reikaids)
{
uint8_t *ROM = memregion("maincpu")->base();
- membank("bank1")->configure_entries(0, 8, &ROM[0xc000], 0x4000);
- membank("bank2")->configure_entries(0, 4, memregion("audiocpu")->base(), 0x10000);
+ m_mainbank->configure_entries(0, 8, &ROM[0xc000], 0x4000);
+ m_audiobank->configure_entries(0, 4, memregion("audiocpu")->base(), 0x10000);
MACHINE_START_CALL_MEMBER(homedata);
@@ -1153,8 +1152,8 @@ MACHINE_START_MEMBER(homedata_state,pteacher)
{
uint8_t *ROM = memregion("maincpu")->base();
- membank("bank1")->configure_entries(0, 4, &ROM[0xc000], 0x4000);
- membank("bank2")->configure_entries(0, 4, memregion("audiocpu")->base(), 0x10000);
+ m_mainbank->configure_entries(0, 4, &ROM[0xc000], 0x4000);
+ m_audiobank->configure_entries(0, 4, memregion("audiocpu")->base(), 0x10000);
MACHINE_START_CALL_MEMBER(homedata);
@@ -1162,8 +1161,6 @@ MACHINE_START_MEMBER(homedata_state,pteacher)
save_item(NAME(m_upd7807_portc));
save_item(NAME(m_gfx_bank));
- save_item(NAME(m_to_cpu));
- save_item(NAME(m_from_cpu));
}
MACHINE_RESET_MEMBER(homedata_state,homedata)
@@ -1177,9 +1174,13 @@ MACHINE_RESET_MEMBER(homedata_state,homedata)
m_blitter_param[2] = 0;
m_blitter_param[3] = 0;
m_vblank = 0;
- m_sndbank = 0;
m_keyb = 0;
- m_snd_command = 0;
+}
+
+MACHINE_RESET_MEMBER(homedata_state,mrokumei)
+{
+ MACHINE_RESET_CALL_MEMBER(homedata);
+ m_mrokumei_soundbank->set_bank(0);
}
MACHINE_RESET_MEMBER(homedata_state,pteacher)
@@ -1194,8 +1195,6 @@ MACHINE_RESET_MEMBER(homedata_state,pteacher)
m_upd7807_porta = 0;
m_gfx_bank[0] = 0;
m_gfx_bank[1] = 0;
- m_to_cpu = 0;
- m_from_cpu = 0;
}
MACHINE_RESET_MEMBER(homedata_state,reikaids)
@@ -1213,30 +1212,32 @@ MACHINE_RESET_MEMBER(homedata_state,reikaids)
m_gfx_bank[1] = 0; // this is not used by reikaids
}
-MACHINE_CONFIG_START(homedata_state::mrokumei)
-
+void homedata_state::mrokumei(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", MC6809E, 16000000/4) /* 4MHz ? */
- MCFG_DEVICE_PROGRAM_MAP(mrokumei_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", homedata_state, homedata_irq) /* also triggered by the blitter */
+ MC6809E(config, m_maincpu, 16000000/4); /* 4MHz ? */
+ m_maincpu->set_addrmap(AS_PROGRAM, &homedata_state::mrokumei_map);
+ m_maincpu->set_vblank_int("screen", FUNC(homedata_state::homedata_irq)); /* also triggered by the blitter */
+
+ Z80(config, m_audiocpu, 16000000/4); /* 4MHz ? */
+ m_audiocpu->set_addrmap(AS_PROGRAM, &homedata_state::mrokumei_sound_map);
+ m_audiocpu->set_addrmap(AS_IO, &homedata_state::mrokumei_sound_io_map);
- MCFG_DEVICE_ADD("audiocpu", Z80, 16000000/4) /* 4MHz ? */
- MCFG_DEVICE_PROGRAM_MAP(mrokumei_sound_map)
- MCFG_DEVICE_IO_MAP(mrokumei_sound_io_map)
+ ADDRESS_MAP_BANK(config, m_mrokumei_soundbank).set_map(&homedata_state::mrokumei_sound_banked_map).set_options(ENDIANNESS_LITTLE, 8, 19, 0x10000);
MCFG_MACHINE_START_OVERRIDE(homedata_state,homedata)
- MCFG_MACHINE_RESET_OVERRIDE(homedata_state,homedata)
+ MCFG_MACHINE_RESET_OVERRIDE(homedata_state,mrokumei)
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(59)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(64*8, 32*8)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(59);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(64*8, 32*8);
// visible area can be changed at runtime
- MCFG_SCREEN_VISIBLE_AREA(0*8, 54*8-1, 2*8, 30*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(homedata_state, screen_update_mrokumei)
- MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE(*this, homedata_state, screen_vblank_homedata))
- MCFG_SCREEN_PALETTE(m_palette)
+ screen.set_visarea(0*8, 54*8-1, 2*8, 30*8-1);
+ screen.set_screen_update(FUNC(homedata_state::screen_update_mrokumei));
+ screen.screen_vblank().set(FUNC(homedata_state::screen_vblank));
+ screen.set_palette(m_palette);
GFXDECODE(config, m_gfxdecode, m_palette, gfx_mrokumei);
PALETTE(config, m_palette, FUNC(homedata_state::mrokumei_palette), 0x8000);
@@ -1248,33 +1249,34 @@ MACHINE_CONFIG_START(homedata_state::mrokumei)
GENERIC_LATCH_8(config, m_soundlatch);
- MCFG_DEVICE_ADD("snsnd", SN76489A, 16000000/4) // SN76489AN actually
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 0.5)
+ SN76489A(config, m_sn, 16000000/4); // SN76489AN actually
+ m_sn->add_route(ALL_OUTPUTS, "speaker", 0.5);
- MCFG_DEVICE_ADD("dac", DAC_8BIT_R2R, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 1.0) // unknown DAC
- MCFG_DEVICE_ADD("vref", VOLTAGE_REGULATOR, 0) MCFG_VOLTAGE_REGULATOR_OUTPUT(5.0)
- MCFG_SOUND_ROUTE(0, "dac", 1.0, DAC_VREF_POS_INPUT) MCFG_SOUND_ROUTE(0, "dac", -1.0, DAC_VREF_NEG_INPUT)
-MACHINE_CONFIG_END
+ DAC_8BIT_R2R(config, "dac", 0).add_route(ALL_OUTPUTS, "speaker", 1.0); // unknown DAC
+ voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref", 0));
+ vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT);
+ vref.add_route(0, "dac", -1.0, DAC_VREF_NEG_INPUT);
+}
/**************************************************************************/
-MACHINE_CONFIG_START(homedata_state::reikaids)
-
+void homedata_state::reikaids(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", MC6809E, 16000000/4) /* 4MHz ? */
- MCFG_DEVICE_PROGRAM_MAP(reikaids_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", homedata_state, homedata_irq) /* also triggered by the blitter */
+ MC6809E(config, m_maincpu, 16000000/4); /* 4MHz ? */
+ m_maincpu->set_addrmap(AS_PROGRAM, &homedata_state::reikaids_map);
+ m_maincpu->set_vblank_int("screen", FUNC(homedata_state::homedata_irq)); /* also triggered by the blitter */
- upd7807_device &audiocpu(UPD7807(config, m_audiocpu, 8000000)); /* ??? MHz (max speed for the 7807 is 12MHz) */
+ upd7807_device &audiocpu(UPD7807(config, m_audiocpu, 9000000)); /* 9MHz ? */
audiocpu.set_addrmap(AS_PROGRAM, &homedata_state::reikaids_upd7807_map);
audiocpu.pa_in_cb().set(FUNC(homedata_state::reikaids_upd7807_porta_r));
audiocpu.pa_out_cb().set(FUNC(homedata_state::reikaids_upd7807_porta_w));
audiocpu.pb_out_cb().set("dac", FUNC(dac_byte_interface::data_w));
audiocpu.pc_out_cb().set(FUNC(homedata_state::reikaids_upd7807_portc_w));
- audiocpu.pt_in_cb().set(FUNC(homedata_state::reikaids_snd_command_r));
+ audiocpu.pt_in_cb().set(m_soundlatch, FUNC(generic_latch_8_device::read));
- MCFG_QUANTUM_TIME(attotime::from_hz(30000)) // very high interleave required to sync for startup tests
+ config.m_minimum_quantum = attotime::from_hz(30000); // very high interleave required to sync for startup tests
MCFG_MACHINE_START_OVERRIDE(homedata_state,reikaids)
MCFG_MACHINE_RESET_OVERRIDE(homedata_state,reikaids)
@@ -1286,7 +1288,7 @@ MACHINE_CONFIG_START(homedata_state::reikaids)
screen.set_size(256, 256);
screen.set_visarea(0, 255, 16, 256-1-16);
screen.set_screen_update(FUNC(homedata_state::screen_update_reikaids));
- screen.screen_vblank().set(FUNC(homedata_state::screen_vblank_homedata));
+ screen.screen_vblank().set(FUNC(homedata_state::screen_vblank));
screen.screen_vblank().append([this] (int state) { if (state) m_audiocpu->pulse_input_line(UPD7810_INTF1, m_audiocpu->minimum_quantum_time()); });
screen.set_palette(m_palette);
@@ -1298,7 +1300,9 @@ MACHINE_CONFIG_START(homedata_state::reikaids)
/* sound hardware */
SPEAKER(config, "speaker").front_center();
- YM2203(config, m_ymsnd, 3000000);
+ GENERIC_LATCH_8(config, m_soundlatch);
+
+ YM2203(config, m_ymsnd, 16000000/4); /* 4 MHz */
m_ymsnd->port_a_read_callback().set_ioport("DSW1");
m_ymsnd->port_b_read_callback().set_ioport("DSW2");
m_ymsnd->add_route(0, "speaker", 0.25);
@@ -1306,20 +1310,21 @@ MACHINE_CONFIG_START(homedata_state::reikaids)
m_ymsnd->add_route(2, "speaker", 0.25);
m_ymsnd->add_route(3, "speaker", 1.0);
- MCFG_DEVICE_ADD("dac", DAC_8BIT_R2R, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 0.4) // unknown DAC
- MCFG_DEVICE_ADD("vref", VOLTAGE_REGULATOR, 0) MCFG_VOLTAGE_REGULATOR_OUTPUT(5.0)
- MCFG_SOUND_ROUTE(0, "dac", 1.0, DAC_VREF_POS_INPUT) MCFG_SOUND_ROUTE(0, "dac", -1.0, DAC_VREF_NEG_INPUT)
-MACHINE_CONFIG_END
+ DAC_8BIT_R2R(config, "dac", 0).add_route(ALL_OUTPUTS, "speaker", 0.4); // unknown DAC
+ voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref", 0));
+ vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT);
+ vref.add_route(0, "dac", -1.0, DAC_VREF_NEG_INPUT);
+}
/**************************************************************************/
-MACHINE_CONFIG_START(homedata_state::pteacher)
-
+void homedata_state::pteacher(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", MC6809E, 16000000/4) /* 4MHz ? */
- MCFG_DEVICE_PROGRAM_MAP(pteacher_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", homedata_state, homedata_irq) /* also triggered by the blitter */
+ MC6809E(config, m_maincpu, 16000000/4); /* 4MHz ? */
+ m_maincpu->set_addrmap(AS_PROGRAM, &homedata_state::pteacher_map);
+ m_maincpu->set_vblank_int("screen", FUNC(homedata_state::homedata_irq)); /* also triggered by the blitter */
upd7807_device &audiocpu(UPD7807(config, m_audiocpu, 9000000)); /* 9MHz ? */
audiocpu.set_addrmap(AS_PROGRAM, &homedata_state::pteacher_upd7807_map);
@@ -1330,7 +1335,7 @@ MACHINE_CONFIG_START(homedata_state::pteacher)
audiocpu.pc_out_cb().set(FUNC(homedata_state::pteacher_upd7807_portc_w));
audiocpu.pt_in_cb().set(FUNC(homedata_state::pteacher_keyboard_r));
- MCFG_QUANTUM_TIME(attotime::from_hz(6000)) // should be enough
+ config.m_minimum_quantum = attotime::from_hz(6000); // should be enough
MCFG_MACHINE_START_OVERRIDE(homedata_state,pteacher)
MCFG_MACHINE_RESET_OVERRIDE(homedata_state,pteacher)
@@ -1343,7 +1348,7 @@ MACHINE_CONFIG_START(homedata_state::pteacher)
// visible area can be changed at runtime
screen.set_visarea(0*8, 54*8-1, 2*8, 30*8-1);
screen.set_screen_update(FUNC(homedata_state::screen_update_pteacher));
- screen.screen_vblank().set(FUNC(homedata_state::screen_vblank_homedata));
+ screen.screen_vblank().set(FUNC(homedata_state::screen_vblank));
screen.screen_vblank().append([this] (int state) { if (state) m_audiocpu->pulse_input_line(UPD7810_INTF1, m_audiocpu->minimum_quantum_time()); });
screen.set_palette(m_palette);
@@ -1355,29 +1360,50 @@ MACHINE_CONFIG_START(homedata_state::pteacher)
/* sound hardware */
SPEAKER(config, "speaker").front_center();
- MCFG_DEVICE_ADD("snsnd", SN76489A, 16000000/4) // SN76489AN actually
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 0.5)
+ GENERIC_LATCH_8(config, m_soundlatch);
+ GENERIC_LATCH_8(config, m_mainlatch);
+
+ SN76489A(config, m_sn, 16000000/4); // SN76489AN actually
+ m_sn->add_route(ALL_OUTPUTS, "speaker", 0.5);
- MCFG_DEVICE_ADD("dac", DAC_8BIT_R2R, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 1.0) // unknown DAC
- MCFG_DEVICE_ADD("vref", VOLTAGE_REGULATOR, 0) MCFG_VOLTAGE_REGULATOR_OUTPUT(5.0)
- MCFG_SOUND_ROUTE(0, "dac", 1.0, DAC_VREF_POS_INPUT) MCFG_SOUND_ROUTE(0, "dac", -1.0, DAC_VREF_NEG_INPUT)
-MACHINE_CONFIG_END
+ DAC_8BIT_R2R(config, "dac", 0).add_route(ALL_OUTPUTS, "speaker", 1.0); // unknown DAC
+ voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref", 0));
+ vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT);
+ vref.add_route(0, "dac", -1.0, DAC_VREF_NEG_INPUT);
+}
-MACHINE_CONFIG_START(homedata_state::mjkinjas)
+void homedata_state::jogakuen(machine_config &config)
+{
pteacher(config);
- MCFG_DEVICE_MODIFY("audiocpu")
- MCFG_DEVICE_CLOCK(11000000) /* 11MHz ? */
-MACHINE_CONFIG_END
+ m_maincpu->set_addrmap(AS_PROGRAM, &homedata_state::jogakuen_map);
+}
-MACHINE_CONFIG_START(homedata_state::lemnangl)
+void homedata_state::mjkinjas(machine_config &config)
+{
+ pteacher(config);
+
+ m_audiocpu->set_clock(11000000); /* 11MHz ? */
+}
+
+void homedata_state::lemnangl(machine_config &config)
+{
pteacher(config);
/* video hardware */
- MCFG_GFXDECODE_MODIFY("gfxdecode", gfx_lemnangl)
+ m_gfxdecode->set_info(gfx_lemnangl);
MCFG_VIDEO_START_OVERRIDE(homedata_state,lemnangl)
-MACHINE_CONFIG_END
+}
+
+void homedata_state::mjikaga(machine_config &config)
+{
+ lemnangl(config);
+
+ /* Mahjong Ikagadesuka is different as well. */
+ m_maincpu->set_addrmap(AS_PROGRAM, &homedata_state::mjikaga_map);
+ m_audiocpu->set_addrmap(AS_PROGRAM, &homedata_state::mjikaga_upd7807_map);
+}
static INPUT_PORTS_START( mirderby )
INPUT_PORTS_END
@@ -1445,11 +1471,11 @@ GFXDECODE_END
/* Miracle Derby - Ascot
- - has the same GX61A01 custom (blitter?) as homedata.c and a 'similar' CPU setup (this has more CPUs)
+ - has the same GX61A01 custom (blitter?) as homedata.cpp and a 'similar' CPU setup (this has more CPUs)
and similar board / rom numbering (X**-)
The drivers can probably be merged later, although the current per-game handling of the blitter in
- homedata.c should be looked at.
+ homedata.cpp should be looked at.
@@ -1487,33 +1513,31 @@ GFXDECODE_END
/* clocks are 16mhz and 9mhz */
-MACHINE_CONFIG_START(homedata_state::mirderby)
-
- MCFG_DEVICE_ADD("maincpu", MC6809E, 16000000/8) /* 2 Mhz */
- MCFG_DEVICE_PROGRAM_MAP(cpu2_map)
-
-
+void homedata_state::mirderby(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("cpu0", Z80, 16000000/4) /* 4 Mhz */
- MCFG_DEVICE_DISABLE()
- MCFG_DEVICE_PROGRAM_MAP(cpu0_map)
+ MC6809E(config, m_maincpu, 16000000/8); /* 2 Mhz */
+ m_maincpu->set_addrmap(AS_PROGRAM, &homedata_state::cpu2_map);
- MCFG_DEVICE_ADD("cpu1", MC6809E, 16000000/8) /* 2 Mhz */
- MCFG_DEVICE_PROGRAM_MAP(cpu1_map)
- MCFG_DEVICE_DISABLE()
- //MCFG_CPU_VBLANK_INT("screen", mirderby_irq)
+ z80_device &cpu0(Z80(config, "cpu0", 16000000/4)); /* 4 Mhz */
+ cpu0.set_disable();
+ cpu0.set_addrmap(AS_PROGRAM, &homedata_state::cpu0_map);
+ mc6809e_device &cpu1(MC6809E(config, "cpu1", 16000000/8)); /* 2 Mhz */
+ cpu1.set_addrmap(AS_PROGRAM, &homedata_state::cpu1_map);
+ cpu1.set_disable();
+ //cpu1.set_vblank_int("screen", FUNC(homedata_state::mirderby_irq));
- MCFG_QUANTUM_TIME(attotime::from_hz(6000))
+ config.m_minimum_quantum = attotime::from_hz(6000);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(59)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(64*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 54*8-1, 2*8, 30*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(homedata_state, screen_update_mirderby)
- MCFG_SCREEN_PALETTE(m_palette)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(59);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(64*8, 32*8);
+ screen.set_visarea(0*8, 54*8-1, 2*8, 30*8-1);
+ screen.set_screen_update(FUNC(homedata_state::screen_update_mirderby));
+ screen.set_palette(m_palette);
GFXDECODE(config, m_gfxdecode, m_palette, gfx_mirderby);
PALETTE(config, m_palette, FUNC(homedata_state::mirderby_palette), 0x8000);
@@ -1528,7 +1552,7 @@ MACHINE_CONFIG_START(homedata_state::mirderby)
m_ymsnd->add_route(1, "speaker", 0.25);
m_ymsnd->add_route(2, "speaker", 0.25);
m_ymsnd->add_route(3, "speaker", 1.0);
-MACHINE_CONFIG_END
+}
/**************************************************************************/
@@ -1537,9 +1561,8 @@ ROM_START( hourouki )
ROM_REGION( 0x010000, "maincpu", 0 ) /* 6809 Code */
ROM_LOAD( "x77f01.bin", 0x08000, 0x8000, CRC(cd3197b8) SHA1(7dad9ce57a83d675a8a9a4e06df360c22100fe4b) )
- ROM_REGION( 0x30000, "audiocpu", 0 ) /* Z80 code */
+ ROM_REGION( 0x20000, "audiocpu", 0 ) /* Z80 code */
ROM_LOAD( "x77a10.bin", 0x00000, 0x20000, CRC(dc1d616b) SHA1(93b8dfe1566556e9621c0d5f3998b31874f74a28) )
- ROM_RELOAD( 0x10000, 0x20000 )
ROM_REGION( 0x20000, "gfx1", 0 )
ROM_LOAD( "x77a03.bin", 0, 0x20000, CRC(5960cde8) SHA1(857b56b304423102a5f1fc88ba4a2386d012bf4d) )
@@ -1552,7 +1575,7 @@ ROM_START( hourouki )
ROM_LOAD16_BYTE( "x77e06.bin", 0x00000, 0x8000, CRC(63607fe5) SHA1(50c756d741117bd0ea8a877bcb1f025e02cc6d29) )
ROM_LOAD16_BYTE( "x77e07.bin", 0x00001, 0x8000, CRC(79fcfc57) SHA1(4311a6bd8aa2dcad2b4fa5a9091c27dd74df62eb) )
- ROM_REGION( 0x20000, "user1", 0 ) /* blitter data */
+ ROM_REGION( 0x20000, "blit_rom", 0 ) /* blitter data */
ROM_LOAD( "x77a08.bin", 0x0000, 0x20000, CRC(22bde229) SHA1(8b44fa895f77b5c95d798172225a030fa0c04126) )
ROM_END
@@ -1560,9 +1583,8 @@ ROM_START( mhgaiden )
ROM_REGION( 0x010000, "maincpu", 0 ) /* 6809 Code */
ROM_LOAD( "x72e01.bin", 0x08000, 0x8000, CRC(98cfa53e) SHA1(dd08f5f9ff9d4a9e01e531247fcb17a8407ca8b6) )
- ROM_REGION( 0x30000, "audiocpu", 0 ) /* Z80 code */
+ ROM_REGION( 0x20000, "audiocpu", 0 ) /* Z80 code */
ROM_LOAD( "x72b10.bin", 0x00000, 0x20000, CRC(00ebbc45) SHA1(9e7ade202bf37a86153a38d705ae26a72732d2bb) )
- ROM_RELOAD( 0x10000, 0x20000 )
ROM_REGION( 0x20000, "gfx1", 0 )
ROM_LOAD( "x72b03.bin", 0, 0x20000, CRC(9019936f) SHA1(5b98ad1b4c0b141bc84fc17bea49784883c5775a) )
@@ -1575,7 +1597,7 @@ ROM_START( mhgaiden )
ROM_LOAD16_BYTE( "x72c06.bin", 0x00000, 0x8000, CRC(b57fb589) SHA1(21b2fc33b9045a4ffa9e4b0bd598fd3416c0adbf) )
ROM_LOAD16_BYTE( "x72c07.bin", 0x00001, 0x8000, CRC(2aadb285) SHA1(90af8541092fbb116b6d6eaf1511b49a2f9bceaf) )
- ROM_REGION( 0x20000, "user1", 0 ) /* blitter data */
+ ROM_REGION( 0x20000, "blit_rom", 0 ) /* blitter data */
ROM_LOAD( "x72b08.bin", 0x0000, 0x20000, CRC(be312d23) SHA1(f2c18d6372c2f819248976c67abe0ddcd5cc1de1) )
ROM_END
@@ -1583,9 +1605,8 @@ ROM_START( mjhokite )
ROM_REGION( 0x010000, "maincpu", 0 ) /* 6809 Code */
ROM_LOAD( "a74_g01.6g", 0x08000, 0x8000, CRC(409cc501) SHA1(6e9ab81198a5a54489cca8b6dcafb67995351207) )
- ROM_REGION( 0x30000, "audiocpu", 0 ) /* Z80 code */
+ ROM_REGION( 0x20000, "audiocpu", 0 ) /* Z80 code */
ROM_LOAD( "a74_a10.11k", 0x00000, 0x20000, CRC(2252f3ec) SHA1(018aaad087354b05b120aa42db572ed13f690f88) )
- ROM_RELOAD( 0x10000, 0x20000 )
ROM_REGION( 0x20000, "gfx1", 0 )
ROM_LOAD( "a74_a03.1g", 0, 0x20000, CRC(bf801b74) SHA1(fd9b7a4590fdeba90423a7ceccd8dfbb8826460b) )
@@ -1600,7 +1621,7 @@ ROM_START( mjhokite )
ROM_LOAD16_BYTE( "a74_a06.1l", 0x00000, 0x8000, CRC(df057dd3) SHA1(0afae441b43a87e04511b8e652d2b03f48d8f705) )
ROM_LOAD16_BYTE( "a74_a07.1m", 0x00001, 0x8000, CRC(3c230167) SHA1(5d57f614bf07baa8b5c96f1d14241ff7c66806c1) )
- ROM_REGION( 0x20000, "user1", 0 ) /* blitter data */
+ ROM_REGION( 0x20000, "blit_rom", 0 ) /* blitter data */
ROM_LOAD( "a74_a08.13a", 0x0000, 0x20000, CRC(dffdd855) SHA1(91469a997a6a9f74f1b84c127f30f5b0e2f974ac) )
ROM_END
@@ -1608,9 +1629,8 @@ ROM_START( mjclinic )
ROM_REGION( 0x010000, "maincpu", 0 ) /* 6809 Code */
ROM_LOAD( "x80_g01.6g", 0x08000, 0x8000, CRC(787b4fb5) SHA1(d1708979d209113b604f6d0973fe14a0c4348351) )
- ROM_REGION( 0x30000, "audiocpu", 0 ) /* Z80 code */
+ ROM_REGION( 0x20000, "audiocpu", 0 ) /* Z80 code */
ROM_LOAD( "x80_a10.11k", 0x00000, 0x20000, CRC(afedbadf) SHA1(e2f101b59c0d23f9dc9b057c41d496fc3223cbb8) )
- ROM_RELOAD( 0x10000, 0x20000 )
ROM_REGION( 0x20000, "gfx1", 0 )
ROM_LOAD( "x80_a03.1g", 0, 0x20000, CRC(34b63c89) SHA1(98383ce8e464ecc53677c060338cc03aa6238a0e) )
@@ -1625,7 +1645,7 @@ ROM_START( mjclinic )
ROM_LOAD16_BYTE( "x80_a06.1l", 0x00000, 0x8000, CRC(c1f9b2fb) SHA1(abe17e2b3b880f91564e32c246116c33e2884889) )
ROM_LOAD16_BYTE( "x80_a07.1m", 0x00001, 0x8000, CRC(e3120152) SHA1(b4a778a9b91e204e2c068dff9a40bd29eccf04a5) )
- ROM_REGION( 0x20000, "user1", 0 ) /* blitter data */
+ ROM_REGION( 0x20000, "blit_rom", 0 ) /* blitter data */
ROM_LOAD( "x80_a08.13a", 0x0000, 0x20000, CRC(174e8ec0) SHA1(a5075fe4bba9403ef9e0636d5f3f66aad8b2bc54) )
ROM_END
@@ -1633,9 +1653,8 @@ ROM_START( mjclinica )
ROM_REGION( 0x010000, "maincpu", 0 ) /* 6809 Code */
ROM_LOAD( "x80_f01.6g", 0x08000, 0x8000, CRC(cd814ec0) SHA1(55b2c9519fc98f71a2731c3851ce56ee8e57bd66) ) // labeled f01 instead of g01. Earlier version?
- ROM_REGION( 0x30000, "audiocpu", 0 ) /* Z80 code */
+ ROM_REGION( 0x20000, "audiocpu", 0 ) /* Z80 code */
ROM_LOAD( "x80_a10.11k", 0x00000, 0x20000, CRC(afedbadf) SHA1(e2f101b59c0d23f9dc9b057c41d496fc3223cbb8) )
- ROM_RELOAD( 0x10000, 0x20000 )
ROM_REGION( 0x20000, "gfx1", 0 )
ROM_LOAD( "x80_a03.1g", 0, 0x20000, CRC(34b63c89) SHA1(98383ce8e464ecc53677c060338cc03aa6238a0e) )
@@ -1650,7 +1669,7 @@ ROM_START( mjclinica )
ROM_LOAD16_BYTE( "x80_a06.1l", 0x00000, 0x8000, CRC(c1f9b2fb) SHA1(abe17e2b3b880f91564e32c246116c33e2884889) )
ROM_LOAD16_BYTE( "x80_a07.1m", 0x00001, 0x8000, CRC(e3120152) SHA1(b4a778a9b91e204e2c068dff9a40bd29eccf04a5) )
- ROM_REGION( 0x20000, "user1", 0 ) /* blitter data */
+ ROM_REGION( 0x20000, "blit_rom", 0 ) /* blitter data */
ROM_LOAD( "x80_a08.13a", 0x0000, 0x20000, CRC(174e8ec0) SHA1(a5075fe4bba9403ef9e0636d5f3f66aad8b2bc54) )
ROM_END
@@ -1658,9 +1677,8 @@ ROM_START( mrokumei )
ROM_REGION( 0x010000, "maincpu", 0 ) /* 6809 Code */
ROM_LOAD( "m81d01.bin", 0x08000, 0x8000, CRC(6f81a78a) SHA1(5e16327b04b065ed4e39a147b18711902dba6384) )
- ROM_REGION( 0x30000, "audiocpu", 0 ) /* Z80 code */
+ ROM_REGION( 0x20000, "audiocpu", 0 ) /* Z80 code */
ROM_LOAD( "m81a10.bin", 0x00000, 0x20000, CRC(0866b2d3) SHA1(37a726830476e372db906382e1d0601c461c7c10) )
- ROM_RELOAD( 0x10000, 0x20000 )
ROM_REGION( 0x20000, "gfx1", 0 )
ROM_LOAD( "m81a03.bin", 0, 0x20000, CRC(4f96e6d2) SHA1(9e6375ee543215691b28c914a8374c1d75c6681f) )
@@ -1675,44 +1693,44 @@ ROM_START( mrokumei )
ROM_LOAD16_BYTE( "m81b06.bin", 0x00000, 0x8000, CRC(96665d39) SHA1(9173791831555e69b8938d85340a08dd73012f8d) )
ROM_LOAD16_BYTE( "m81b07.bin", 0x00001, 0x8000, CRC(14f39690) SHA1(821f9de1b28b9d7844fc1b002c7ee3bbdda7f905) )
- ROM_REGION( 0x20000, "user1", 0 ) /* blitter data */
+ ROM_REGION( 0x20000, "blit_rom", 0 ) /* blitter data */
ROM_LOAD( "m81a08.bin", 0x0000, 0x20000, CRC(dba706b9) SHA1(467c8c3e12cd64002d2516dd117bc87d03448f49) )
ROM_END
ROM_START( reikaids )
ROM_REGION( 0x02c000, "maincpu", 0 ) /* 6809 Code */
- ROM_LOAD( "j82c01.bin", 0x010000, 0x01c000, CRC(50fcc451) SHA1(ad717b8300f0903ef136569cf933b8af0e67eb6b) )
- ROM_CONTINUE( 0x00c000, 0x004000 )
+ ROM_LOAD( "j82c01.j14", 0x010000, 0x01c000, CRC(50fcc451) SHA1(ad717b8300f0903ef136569cf933b8af0e67eb6b) )
+ ROM_CONTINUE( 0x00c000, 0x004000)
ROM_REGION( 0x40000, "audiocpu", 0) /* uPD7807 code */
- ROM_LOAD( "x82a04.bin", 0x000000, 0x040000, CRC(52c9028a) SHA1(9d5e37b2f741d5c0e64ba3d674a72330058b96f2) )
+ ROM_LOAD( "x82a04.e20", 0x000000, 0x040000, CRC(52c9028a) SHA1(9d5e37b2f741d5c0e64ba3d674a72330058b96f2) )
ROM_REGION( 0x200000, "gfx1", 0 )
- ROM_LOAD( "x82a13.bin", 0x000000, 0x80000, CRC(954c8844) SHA1(94e09009d0ad40a62f2a92cd5bd500ffe2c4650a) )
- ROM_LOAD( "x82a14.bin", 0x080000, 0x80000, CRC(a748305e) SHA1(ee01025820a0915621d2c056d65e67a84a5f724c) )
- ROM_LOAD( "x82a15.bin", 0x100000, 0x80000, CRC(c50f7047) SHA1(13fcd1abaf88c759e747cf5f2c94a522276945c9) )
- ROM_LOAD( "x82a16.bin", 0x180000, 0x80000, CRC(b270094a) SHA1(edd4f7e3fd082c12758d82ea6eba2a060398b9ef) )
+ ROM_LOAD( "x82a13.d2", 0x000000, 0x80000, CRC(954c8844) SHA1(94e09009d0ad40a62f2a92cd5bd500ffe2c4650a) )
+ ROM_LOAD( "x82a14.d1", 0x080000, 0x80000, CRC(a748305e) SHA1(ee01025820a0915621d2c056d65e67a84a5f724c) )
+ ROM_LOAD( "x82a15.f2", 0x100000, 0x80000, CRC(c50f7047) SHA1(13fcd1abaf88c759e747cf5f2c94a522276945c9) )
+ ROM_LOAD( "x82a16.f1", 0x180000, 0x80000, CRC(b270094a) SHA1(edd4f7e3fd082c12758d82ea6eba2a060398b9ef) )
ROM_REGION( 0x100000, "gfx2", 0 )
- ROM_LOAD( "x82a09.bin", 0x000000, 0x80000, CRC(c496b187) SHA1(8ec4e09469c9f425681671f5ddb2d2d8768af42b) )
- ROM_LOAD( "x82a10.bin", 0x080000, 0x80000, CRC(4243fe28) SHA1(01260543a6f61f46ba56840c1b96ecedf637451c) )
+ ROM_LOAD( "x82a09.d5", 0x000000, 0x80000, CRC(c496b187) SHA1(8ec4e09469c9f425681671f5ddb2d2d8768af42b) )
+ ROM_LOAD( "x82a10.d4", 0x080000, 0x80000, CRC(4243fe28) SHA1(01260543a6f61f46ba56840c1b96ecedf637451c) )
ROM_REGION( 0x080000, "gfx3", 0 )
- ROM_LOAD( "x82a08.bin", 0x000000, 0x80000, CRC(51cfd790) SHA1(208f00b1ccf420fe891dd30684481bf871c1aa63) )
+ ROM_LOAD( "x82a08.d6", 0x000000, 0x80000, CRC(51cfd790) SHA1(208f00b1ccf420fe891dd30684481bf871c1aa63) )
ROM_REGION( 0x080000, "gfx4", 0 )
- ROM_LOAD( "x82a05.bin", 0x000000, 0x80000, CRC(fb65e0e0) SHA1(d560091cfad17af6539913db1279c62a680de4fc) )
+ ROM_LOAD( "x82a05.d8", 0x000000, 0x80000, CRC(fb65e0e0) SHA1(d560091cfad17af6539913db1279c62a680de4fc) )
ROM_REGION( 0x010000, "proms", 0 ) /* static palette */
- ROM_LOAD16_BYTE( "e82a18.bin", 0x00000, 0x8000, CRC(1f52a7aa) SHA1(55bbba5bfad1eee4872939d23ac643aa3074b3cf) )
- ROM_LOAD16_BYTE( "e82a17.bin", 0x00001, 0x8000, CRC(f91d77a1) SHA1(a650a68e7e75719819fd04dda86d7fc8849dfe7d) )
+ ROM_LOAD16_BYTE( "e82a18.e12", 0x00000, 0x8000, CRC(1f52a7aa) SHA1(55bbba5bfad1eee4872939d23ac643aa3074b3cf) )
+ ROM_LOAD16_BYTE( "e82a17.e9", 0x00001, 0x8000, CRC(f91d77a1) SHA1(a650a68e7e75719819fd04dda86d7fc8849dfe7d) )
- ROM_REGION( 0x40000, "user1", 0 ) /* blitter data */
- ROM_LOAD( "x82a02.bin", 0x00000, 0x040000, CRC(90fe700f) SHA1(bf7f9955a2cb1af43a272bf3366ff8c09ff6f7e6) )
+ ROM_REGION( 0x40000, "blit_rom", 0 ) /* blitter data */
+ ROM_LOAD( "x82a02.e19", 0x00000, 0x040000, CRC(90fe700f) SHA1(bf7f9955a2cb1af43a272bf3366ff8c09ff6f7e6) )
ROM_REGION( 0x0100, "user2", 0 )
- ROM_LOAD( "x82a19.bin", 0x0000, 0x0100, CRC(7ed947b4) SHA1(40c74a17976fab5d7f9da367083764934bb87281) ) // priority (not used)
+ ROM_LOAD( "x82a19.l4", 0x0000, 0x0100, CRC(7ed947b4) SHA1(40c74a17976fab5d7f9da367083764934bb87281) ) // N82S129AN - priority (not used)
ROM_END
@@ -1744,7 +1762,7 @@ ROM_START( battlcry )
ROM_LOAD16_BYTE( "s88b18.f10", 0x00000, 0x8000, CRC(fa432edc) SHA1(55c01b6a1175539facdfdd0c3c49d878a59156a4) )
ROM_LOAD16_BYTE( "s88b17.f9", 0x00001, 0x8000, CRC(7c55568e) SHA1(1e599cd00abe7b67bcb0c8d3f0c467a99ef79658) )
- ROM_REGION( 0x40000, "user1", 0 ) /* blitter data */
+ ROM_REGION( 0x40000, "blit_rom", 0 ) /* blitter data */
ROM_LOAD( "s88b02.f19", 0x00000, 0x040000, CRC(7044a542) SHA1(8efaa512f62fe9a37d2474c435c549118c019d67) )
ROM_REGION( 0x0100, "user2", 0 )
@@ -1780,7 +1798,7 @@ ROM_START( battlcryc )
ROM_LOAD16_BYTE( "s88b18.f10", 0x00000, 0x8000, CRC(fa432edc) SHA1(55c01b6a1175539facdfdd0c3c49d878a59156a4) )
ROM_LOAD16_BYTE( "s88b17.f9", 0x00001, 0x8000, CRC(7c55568e) SHA1(1e599cd00abe7b67bcb0c8d3f0c467a99ef79658) )
- ROM_REGION( 0x40000, "user1", 0 ) /* blitter data */
+ ROM_REGION( 0x40000, "blit_rom", 0 ) /* blitter data */
ROM_LOAD( "s88b02.f19", 0x00000, 0x040000, CRC(7044a542) SHA1(8efaa512f62fe9a37d2474c435c549118c019d67) )
ROM_REGION( 0x0100, "user2", 0 )
@@ -1841,7 +1859,7 @@ ROM_START( battlcryp ) // prototype presented at AOU 1989
ROM_LOAD16_BYTE( "s88_b18", 0x00000, 0x8000, CRC(fa432edc) SHA1(55c01b6a1175539facdfdd0c3c49d878a59156a4) ) // 27c256
ROM_LOAD16_BYTE( "s88_b17", 0x00001, 0x8000, CRC(7c55568e) SHA1(1e599cd00abe7b67bcb0c8d3f0c467a99ef79658) ) // 27c256
- ROM_REGION( 0x40000, "user1", 0 ) /* blitter data, identical to the released game but split in 27C1000 ROMs */
+ ROM_REGION( 0x40000, "blit_rom", 0 ) /* blitter data, identical to the released game but split in 27C1000 ROMs */
ROM_LOAD( "s88_b02_1.ic28", 0x00000, 0x020000, CRC(93d8c8ec) SHA1(bb1fcf4d32db6885d0c78416211c20decc48d266) )
ROM_LOAD( "s88_b02_2.ic27", 0x20000, 0x020000, CRC(8918327b) SHA1(445c0252ec8e71423e77c75190f9524a90f918a9) )
@@ -1874,7 +1892,7 @@ ROM_START( mjkojink )
ROM_LOAD16_BYTE( "x83a19.4k", 0x00000, 0x8000, CRC(d29c9ef0) SHA1(c4e2c0c3c9c7abee1a965d6842956cdf98a76ad4) )
ROM_LOAD16_BYTE( "x83a18.3k", 0x00001, 0x8000, CRC(c3351952) SHA1(036be91ca428c5df016dd777bd658cb00f44ee3c) )
- ROM_REGION( 0x40000, "user1", 0 ) /* blitter data */
+ ROM_REGION( 0x40000, "blit_rom", 0 ) /* blitter data */
ROM_LOAD( "x83b03.12e", 0x0000, 0x40000, CRC(4ba8b5ec) SHA1(cee77583f2f7b7fdba7e0f17e4d1244891488d36) )
ROM_END
@@ -1906,7 +1924,7 @@ ROM_START( mjjoship )
ROM_LOAD16_BYTE( "x73_c19.4k", 0x00000, 0x8000, CRC(f4bdce8a) SHA1(e3168d6aa6f8cd24b497706a117c77353d1c6ef3) )
ROM_LOAD16_BYTE( "x73_c18.3k", 0x00001, 0x8000, CRC(1ab265cc) SHA1(24dced438a28ea9eb2f06c8859c5c07f4d975bfd) )
- ROM_REGION( 0x20000, "user1", 0 ) /* blitter data */
+ ROM_REGION( 0x20000, "blit_rom", 0 ) /* blitter data */
ROM_LOAD( "x73a03.12e", 0x0000, 0x20000, CRC(fd32eb8c) SHA1(584afb1ed2da776a4ff9c0b9eb2906c914b28928) )
ROM_END
@@ -1935,7 +1953,7 @@ ROM_START( vitaminc )
ROM_LOAD16_BYTE( "x90b19.bin", 0x00000, 0x8000, CRC(d0022cfb) SHA1(f384964a09fe6c1f8a993f5da67d81a23df22879) )
ROM_LOAD16_BYTE( "x90b18.bin", 0x00001, 0x8000, CRC(fe1de95d) SHA1(e94282065b3c69de7c9ea214c752745c18c38cb7) )
- ROM_REGION( 0x40000, "user1", 0 ) /* blitter data */
+ ROM_REGION( 0x40000, "blit_rom", 0 ) /* blitter data */
ROM_LOAD( "x90a03.bin", 0x0000, 0x40000, CRC(35d5b4e6) SHA1(1ea4d03946aad33d33a817f83d20e7ad8faace6d) )
ROM_END
@@ -1963,7 +1981,7 @@ ROM_START( mjyougo )
ROM_LOAD16_BYTE( "x91a19.bin", 0x00000, 0x8000, CRC(f63493df) SHA1(0e436bffb03fa6218363ee205c4fe5f4e16a24cc) )
ROM_LOAD16_BYTE( "x91a18.bin", 0x00001, 0x8000, CRC(b3541265) SHA1(d8e79c2856bb81e9ad9b79c012d64663a8997bbd) )
- ROM_REGION( 0x40000, "user1", 0 ) /* blitter data */
+ ROM_REGION( 0x40000, "blit_rom", 0 ) /* blitter data */
ROM_LOAD( "x91a03.bin", 0x0000, 0x40000, CRC(4863caa2) SHA1(6ef511cb4d184d4705eb0fd3eb3d82daad49564a) )
ROM_END
@@ -1991,7 +2009,7 @@ ROM_START( mjkinjas )
ROM_LOAD16_BYTE( "x07a19.bin", 0x00000, 0x8000, CRC(7acabdf8) SHA1(90e39c1dd3e32c057ab8bfcd82d022231a06847c) )
ROM_LOAD16_BYTE( "x07a18.bin", 0x00001, 0x8000, CRC(d247bd5a) SHA1(298d62395ea7c687ed509863aaf3d8b758743cd8) )
- ROM_REGION( 0x80000, "user1", 0 ) /* blitter data */
+ ROM_REGION( 0x80000, "blit_rom", 0 ) /* blitter data */
ROM_LOAD( "x07a03.bin", 0x0000, 0x80000, CRC(f5ff3e72) SHA1(e3489a3b8988677866aadd41cb99f146217022ce) )
ROM_END
@@ -2019,7 +2037,7 @@ ROM_START( jogakuen )
ROM_LOAD16_BYTE( "a19.bin", 0x00000, 0x8000, CRC(9a3d9d5e) SHA1(1ab20fc5b7ab1c2508c76b0051923446c409e074) )
ROM_LOAD16_BYTE( "a18.bin", 0x00001, 0x8000, CRC(3289edd4) SHA1(7db4fbda8a22c64dc29ce6b4b63204cebd641351) )
- ROM_REGION( 0x40000, "user1", 0 ) /* blitter data */
+ ROM_REGION( 0x40000, "blit_rom", 0 ) /* blitter data */
ROM_LOAD( "a03.bin", 0x0000, 0x40000, CRC(bb1507ab) SHA1(465f45c9cae2d4e064b784cc5ba25b60839e4b5f) )
ROM_END
@@ -2048,7 +2066,7 @@ ROM_START( lemnangl )
ROM_LOAD16_BYTE( "x02_b19.5k", 0x00000, 0x8000, CRC(f75959bc) SHA1(59a1debc28263a7f5f9b775817232fffc6e63ac4) )
ROM_LOAD16_BYTE( "x02_b18.3k", 0x00001, 0x8000, CRC(3f1510b1) SHA1(a9892beb3d911ee91d7dd276d9c84d14ba3253d8) )
- ROM_REGION( 0x40000, "user1", 0 ) /* blitter data */
+ ROM_REGION( 0x40000, "blit_rom", 0 ) /* blitter data */
ROM_LOAD( "x02a03.12e", 0x0000, 0x40000, CRC(02ef0378) SHA1(6223a019fc7794872dd49151952c56892295a779) )
ROM_END
@@ -2076,7 +2094,7 @@ ROM_START( mjikaga )
ROM_LOAD16_BYTE( "m15a19.bin", 0x00000, 0x8000, CRC(2f247acf) SHA1(468fee5a16c98751524e21ad0f608fc85c95ab86) )
ROM_LOAD16_BYTE( "m15a18.bin", 0x00001, 0x8000, CRC(2648ca07) SHA1(e4f5ed62b014a6e397ce611c2c592f795d112219) )
- ROM_REGION( 0x40000, "user1", 0 ) /* blitter data */
+ ROM_REGION( 0x40000, "blit_rom", 0 ) /* blitter data */
ROM_LOAD( "m15a03.bin", 0x0000, 0x40000, CRC(07e2e8f8) SHA1(61eed47c4136733059c1d96e98cadb8ac9078f95) )
ROM_END
@@ -2104,7 +2122,7 @@ ROM_START( mjprivat )
ROM_LOAD16_BYTE( "311a19.4k", 0x00000, 0x8000, CRC(dbb5569a) SHA1(e23a32667adc8eade7555adbac18dac268f08d3e) )
ROM_LOAD16_BYTE( "311a18.3k", 0x00001, 0x8000, CRC(a5ca7723) SHA1(d074c5c09a50abdb2b0ffdeacfc077a91b9204bf) )
- ROM_REGION( 0x40000, "user1", 0 ) /* blitter data */
+ ROM_REGION( 0x40000, "blit_rom", 0 ) /* blitter data */
ROM_LOAD( "311b03.12e", 0x0000, 0x40000, CRC(5722c341) SHA1(694e63261d91da48c0ed14a44fbc6c9c74b055d9) )
ROM_END
@@ -2133,22 +2151,6 @@ ROM_END
-void homedata_state::init_jogakuen()
-{
- /* it seems that Mahjong Jogakuen runs on the same board as the others,
- but with just these two addresses swapped. Instead of creating a new
- MachineDriver, I just fix them here. */
- m_maincpu->space(AS_PROGRAM).install_write_handler(0x8007, 0x8007, write8_delegate(FUNC(homedata_state::pteacher_blitter_bank_w),this));
- m_maincpu->space(AS_PROGRAM).install_write_handler(0x8005, 0x8005, write8_delegate(FUNC(homedata_state::pteacher_gfx_bank_w),this));
-}
-
-void homedata_state::init_mjikaga()
-{
- /* Mahjong Ikagadesuka is different as well. */
- m_maincpu->space(AS_PROGRAM).install_read_handler(0x7802, 0x7802, read8_delegate(FUNC(homedata_state::pteacher_snd_r),this));
- m_audiocpu->space(AS_PROGRAM).install_write_handler(0x0123, 0x0123, write8_delegate(FUNC(homedata_state::pteacher_snd_answer_w),this));
-}
-
void homedata_state::init_reikaids()
{
m_priority = 0;
@@ -2180,11 +2182,11 @@ GAME( 1988, mjjoship, 0, pteacher, mjjoship, homedata_state, empty_init,
GAME( 1989, vitaminc, 0, pteacher, pteacher, homedata_state, empty_init, ROT0, "Home Data", "Mahjong Vitamin C (Japan)", MACHINE_SUPPORTS_SAVE )
GAME( 1989, mjyougo, 0, pteacher, pteacher, homedata_state, empty_init, ROT0, "Home Data", "Mahjong-yougo no Kisotairyoku (Japan)", MACHINE_SUPPORTS_SAVE )
GAME( 1991, mjkinjas, 0, mjkinjas, pteacher, homedata_state, empty_init, ROT0, "Home Data", "Mahjong Kinjirareta Asobi (Japan)", MACHINE_SUPPORTS_SAVE )
-GAME( 1992?,jogakuen, 0, pteacher, jogakuen, homedata_state, init_jogakuen, ROT0, "Windom", "Mahjong Jogakuen (Japan)", MACHINE_SUPPORTS_SAVE )
+GAME( 1992?,jogakuen, 0, jogakuen, jogakuen, homedata_state, empty_init, ROT0, "Windom", "Mahjong Jogakuen (Japan)", MACHINE_SUPPORTS_SAVE )
GAME( 1990, lemnangl, 0, lemnangl, pteacher, homedata_state, empty_init, ROT0, "Home Data", "Mahjong Lemon Angel (Japan)", MACHINE_SUPPORTS_SAVE )
GAME( 1991, mjprivat, 0, lemnangl, pteacher, homedata_state, empty_init, ROT0, "Matoba", "Mahjong Private (Japan)", MACHINE_SUPPORTS_SAVE )
-GAME( 1991?,mjikaga, 0, lemnangl, mjikaga, homedata_state, init_mjikaga, ROT0, "Mitchell", "Mahjong Ikaga Desu ka (Japan)", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE )
+GAME( 1991?,mjikaga, 0, mjikaga, mjikaga, homedata_state, empty_init, ROT0, "Mitchell", "Mahjong Ikaga Desu ka (Japan)", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE )
GAME( 1988, mirderby, 0, mirderby, mirderby, homedata_state, init_mirderby, ROT0, "Home Data?", "Miracle Derby - Ascot", MACHINE_NO_SOUND | MACHINE_NOT_WORKING )
diff --git a/src/mame/drivers/homelab.cpp b/src/mame/drivers/homelab.cpp
index 04ff0e7ac75..9e2165554f0 100644
--- a/src/mame/drivers/homelab.cpp
+++ b/src/mame/drivers/homelab.cpp
@@ -752,100 +752,102 @@ QUICKLOAD_LOAD_MEMBER( homelab_state,homelab)
/* Machine driver */
MACHINE_CONFIG_START(homelab_state::homelab)
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, XTAL(8'000'000) / 2)
- MCFG_DEVICE_PROGRAM_MAP(homelab2_mem)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", homelab_state, homelab_frame)
+ Z80(config, m_maincpu, XTAL(8'000'000) / 2);
+ m_maincpu->set_addrmap(AS_PROGRAM, &homelab_state::homelab2_mem);
+ m_maincpu->set_vblank_int("screen", FUNC(homelab_state::homelab_frame));
/* video hardware */
- MCFG_SCREEN_ADD_MONOCHROME("screen", RASTER, rgb_t::green())
- MCFG_SCREEN_REFRESH_RATE(50)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500))
- MCFG_SCREEN_SIZE(40*8, 25*8)
- MCFG_SCREEN_VISIBLE_AREA(0, 40*8-1, 0, 25*8-1)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER, rgb_t::green()));
+ screen.set_refresh_hz(50);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500));
+ screen.set_size(40*8, 25*8);
+ screen.set_visarea(0, 40*8-1, 0, 25*8-1);
+ screen.set_screen_update(FUNC(homelab_state::screen_update_homelab2));
+ screen.set_palette("palette");
+
MCFG_VIDEO_START_OVERRIDE(homelab_state,homelab2)
- MCFG_SCREEN_UPDATE_DRIVER(homelab_state, screen_update_homelab2)
- MCFG_SCREEN_PALETTE("palette")
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_homelab)
+ GFXDECODE(config, "gfxdecode", "palette", gfx_homelab);
PALETTE(config, "palette", palette_device::MONOCHROME);
/* sound hardware */
SPEAKER(config, "speaker").front_center();
- MCFG_DEVICE_ADD("dac", DAC_1BIT, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 0.5)
- MCFG_DEVICE_ADD("vref", VOLTAGE_REGULATOR, 0) MCFG_VOLTAGE_REGULATOR_OUTPUT(5.0)
- MCFG_SOUND_ROUTE(0, "dac", 1.0, DAC_VREF_POS_INPUT)
+ DAC_1BIT(config, m_dac, 0).add_route(ALL_OUTPUTS, "speaker", 0.5);
+ voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref", 0));
+ vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT);
- WAVE(config, "wave", "cassette").add_route(ALL_OUTPUTS, "speaker", 0.25);
+ WAVE(config, "wave", m_cass).add_route(ALL_OUTPUTS, "speaker", 0.25);
- MCFG_CASSETTE_ADD( "cassette" )
- MCFG_QUICKLOAD_ADD("quickload", homelab_state, homelab, "htp", 2)
+ CASSETTE(config, m_cass);
+ MCFG_QUICKLOAD_ADD("quickload", homelab_state, homelab, "htp", attotime::from_seconds(2))
MACHINE_CONFIG_END
MACHINE_CONFIG_START(homelab_state::homelab3)
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, XTAL(12'000'000) / 4)
- MCFG_DEVICE_PROGRAM_MAP(homelab3_mem)
- MCFG_DEVICE_IO_MAP(homelab3_io)
+ Z80(config, m_maincpu, XTAL(12'000'000) / 4);
+ m_maincpu->set_addrmap(AS_PROGRAM, &homelab_state::homelab3_mem);
+ m_maincpu->set_addrmap(AS_IO, &homelab_state::homelab3_io);
MCFG_MACHINE_RESET_OVERRIDE(homelab_state,homelab3)
/* video hardware */
- MCFG_SCREEN_ADD_MONOCHROME("screen", RASTER, rgb_t::green())
- MCFG_SCREEN_REFRESH_RATE(50)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500))
- MCFG_SCREEN_SIZE(64*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0, 64*8-1, 0, 32*8-1)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER, rgb_t::green()));
+ screen.set_refresh_hz(50);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500));
+ screen.set_size(64*8, 32*8);
+ screen.set_visarea(0, 64*8-1, 0, 32*8-1);
+ screen.set_screen_update(FUNC(homelab_state::screen_update_homelab3));
+ screen.set_palette("palette");
+
MCFG_VIDEO_START_OVERRIDE(homelab_state,homelab3)
- MCFG_SCREEN_UPDATE_DRIVER(homelab_state, screen_update_homelab3)
- MCFG_SCREEN_PALETTE("palette")
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_homelab)
+ GFXDECODE(config, "gfxdecode", "palette", gfx_homelab);
PALETTE(config, "palette", palette_device::MONOCHROME);
/* sound hardware */
SPEAKER(config, "speaker").front_center();
- MCFG_DEVICE_ADD("dac", DAC_1BIT, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 0.5)
- MCFG_DEVICE_ADD("vref", VOLTAGE_REGULATOR, 0) MCFG_VOLTAGE_REGULATOR_OUTPUT(5.0)
- MCFG_SOUND_ROUTE(0, "dac", 1.0, DAC_VREF_POS_INPUT)
+ DAC_1BIT(config, m_dac, 0).add_route(ALL_OUTPUTS, "speaker", 0.5);
+ voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref", 0));
+ vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT);
- WAVE(config, "wave", "cassette").add_route(ALL_OUTPUTS, "speaker", 0.25);
+ WAVE(config, "wave", m_cass).add_route(ALL_OUTPUTS, "speaker", 0.25);
- MCFG_CASSETTE_ADD( "cassette" )
- MCFG_QUICKLOAD_ADD("quickload", homelab_state, homelab, "htp", 2)
+ CASSETTE(config, m_cass);
+ MCFG_QUICKLOAD_ADD("quickload", homelab_state, homelab, "htp", attotime::from_seconds(2))
MACHINE_CONFIG_END
MACHINE_CONFIG_START(homelab_state::brailab4)
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, XTAL(12'000'000) / 4)
- MCFG_DEVICE_PROGRAM_MAP(brailab4_mem)
- MCFG_DEVICE_IO_MAP(brailab4_io)
+ Z80(config, m_maincpu, XTAL(12'000'000) / 4);
+ m_maincpu->set_addrmap(AS_PROGRAM, &homelab_state::brailab4_mem);
+ m_maincpu->set_addrmap(AS_IO, &homelab_state::brailab4_io);
MCFG_MACHINE_RESET_OVERRIDE(homelab_state,brailab4)
/* video hardware */
- MCFG_SCREEN_ADD_MONOCHROME("screen", RASTER, rgb_t::green())
- MCFG_SCREEN_REFRESH_RATE(50)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500))
- MCFG_SCREEN_SIZE(64*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0, 64*8-1, 0, 32*8-1)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER, rgb_t::green()));
+ screen.set_refresh_hz(50);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500));
+ screen.set_size(64*8, 32*8);
+ screen.set_visarea(0, 64*8-1, 0, 32*8-1);
+ screen.set_screen_update(FUNC(homelab_state::screen_update_homelab3));
+ screen.set_palette("palette");
+
MCFG_VIDEO_START_OVERRIDE(homelab_state,brailab4)
- MCFG_SCREEN_UPDATE_DRIVER(homelab_state, screen_update_homelab3)
- MCFG_SCREEN_PALETTE("palette")
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_homelab)
+ GFXDECODE(config, "gfxdecode", "palette", gfx_homelab);
PALETTE(config, "palette", palette_device::MONOCHROME);
/* sound hardware */
SPEAKER(config, "speaker").front_center();
- MCFG_DEVICE_ADD("dac", DAC_1BIT, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 0.5)
- MCFG_DEVICE_ADD("vref", VOLTAGE_REGULATOR, 0) MCFG_VOLTAGE_REGULATOR_OUTPUT(5.0)
- MCFG_SOUND_ROUTE(0, "dac", 1.0, DAC_VREF_POS_INPUT)
+ DAC_1BIT(config, m_dac, 0).add_route(ALL_OUTPUTS, "speaker", 0.5);
+ voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref", 0));
+ vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT);
- WAVE(config, "wave", "cassette").add_route(ALL_OUTPUTS, "speaker", 0.25);
+ WAVE(config, "wave", m_cass).add_route(ALL_OUTPUTS, "speaker", 0.25);
- MCFG_DEVICE_ADD("mea8000", MEA8000, 3840000)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 1.0)
+ MEA8000(config, "mea8000", 3840000).add_route(ALL_OUTPUTS, "speaker", 1.0);
- MCFG_CASSETTE_ADD( "cassette" )
- MCFG_QUICKLOAD_ADD("quickload", homelab_state, homelab, "htp", 18)
+ CASSETTE(config, m_cass);
+ MCFG_QUICKLOAD_ADD("quickload", homelab_state, homelab, "htp", attotime::from_seconds(18))
MACHINE_CONFIG_END
void homelab_state::init_brailab4()
diff --git a/src/mame/drivers/homerun.cpp b/src/mame/drivers/homerun.cpp
index 83128368eaa..9ced0870472 100644
--- a/src/mame/drivers/homerun.cpp
+++ b/src/mame/drivers/homerun.cpp
@@ -66,7 +66,7 @@ Notes:
***************************************************************************/
-WRITE8_MEMBER(homerun_state::homerun_control_w)
+void homerun_state::control_w(u8 data)
{
// d0, d1: somehow related to port $40?
@@ -95,7 +95,7 @@ WRITE8_MEMBER(homerun_state::homerun_control_w)
m_control = data;
}
-WRITE8_MEMBER(homerun_state::homerun_d7756_sample_w)
+void homerun_state::d7756_sample_w(u8 data)
{
m_sample = data;
@@ -103,21 +103,21 @@ WRITE8_MEMBER(homerun_state::homerun_d7756_sample_w)
m_d7756->port_w(data);
}
-void homerun_state::homerun_memmap(address_map &map)
+void homerun_state::mem_map(address_map &map)
{
map(0x0000, 0x3fff).rom();
- map(0x4000, 0x7fff).bankr("bank1");
- map(0x8000, 0x9fff).ram().w(FUNC(homerun_state::homerun_videoram_w)).share("videoram");
+ map(0x4000, 0x7fff).bankr("mainbank");
+ map(0x8000, 0x9fff).ram().w(FUNC(homerun_state::videoram_w)).share("videoram");
map(0xa000, 0xa0ff).ram().share("spriteram");
- map(0xb000, 0xb03f).ram().w(FUNC(homerun_state::homerun_color_w)).share("colorram");
+ map(0xb000, 0xb03f).ram().w(m_palette, FUNC(palette_device::write8)).share("palette");
map(0xc000, 0xdfff).ram();
}
-void homerun_state::homerun_iomap(address_map &map)
+void homerun_state::io_map(address_map &map)
{
map.global_mask(0xff);
- map(0x10, 0x10).w(FUNC(homerun_state::homerun_d7756_sample_w));
- map(0x20, 0x20).w(FUNC(homerun_state::homerun_control_w));
+ map(0x10, 0x10).w(FUNC(homerun_state::d7756_sample_w));
+ map(0x20, 0x20).w(FUNC(homerun_state::control_w));
map(0x30, 0x33).rw("ppi8255", FUNC(i8255_device::read), FUNC(i8255_device::write));
map(0x40, 0x40).portr("IN0");
map(0x50, 0x50).portr("IN2");
@@ -152,7 +152,7 @@ CUSTOM_INPUT_MEMBER(homerun_state::ganjaja_hopper_status_r)
static INPUT_PORTS_START( homerun )
PORT_START("IN0")
PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_COIN1 )
- PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_CUSTOM_MEMBER(DEVICE_SELF, homerun_state, homerun_sprite0_r, nullptr)
+ PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_CUSTOM_MEMBER(DEVICE_SELF, homerun_state, sprite0_r, nullptr)
PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_CUSTOM_MEMBER(DEVICE_SELF, homerun_state, homerun_d7756_busy_r, nullptr)
PORT_BIT( 0x37, IP_ACTIVE_HIGH, IPT_UNKNOWN )
@@ -189,7 +189,7 @@ INPUT_PORTS_END
static INPUT_PORTS_START( dynashot )
PORT_START("IN0")
PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_COIN1 )
- PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_CUSTOM_MEMBER(DEVICE_SELF, homerun_state, homerun_sprite0_r, nullptr)
+ PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_CUSTOM_MEMBER(DEVICE_SELF, homerun_state, sprite0_r, nullptr)
PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_UNUSED ) // doesn't have d7756
PORT_BIT( 0x37, IP_ACTIVE_HIGH, IPT_UNKNOWN )
@@ -227,7 +227,7 @@ static INPUT_PORTS_START( ganjaja )
PORT_START("IN0")
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNKNOWN ) // ?
PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_COIN1 )
- PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_CUSTOM_MEMBER(DEVICE_SELF, homerun_state, homerun_sprite0_r, nullptr)
+ PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_CUSTOM_MEMBER(DEVICE_SELF, homerun_state, sprite0_r, nullptr)
PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_CUSTOM_MEMBER(DEVICE_SELF, homerun_state, ganjaja_d7756_busy_r, nullptr)
PORT_BIT( 0x36, IP_ACTIVE_HIGH, IPT_UNKNOWN )
@@ -301,8 +301,8 @@ static const gfx_layout gfxlayout =
RGN_FRAC(1,1),
2,
{ 8*8,0},
- { 0, 1, 2, 3, 4, 5, 6, 7},
- { 0*8, 1*8, 2*8, 3*8, 4*8, 5*8, 6*8, 7*8},
+ { STEP8(0,1) },
+ { STEP8(0,8) },
8*8*2
};
@@ -311,15 +311,15 @@ static const gfx_layout spritelayout =
16,16,
RGN_FRAC(1,1),
2,
- { 8*8,0},
- { 0, 1, 2, 3, 4, 5, 6, 7,0+8*8*2,1+8*8*2,2+8*8*2,3+8*8*2,4+8*8*2,5+8*8*2,6+8*8*2,7+8*8*2},
- { 0*8, 1*8, 2*8, 3*8, 4*8, 5*8, 6*8, 7*8, 0*8+2*8*8*2,1*8+2*8*8*2,2*8+2*8*8*2,3*8+2*8*8*2,4*8+2*8*8*2,5*8+2*8*8*2,6*8+2*8*8*2,7*8+2*8*8*2},
+ { 8*8,0 },
+ { STEP8(0,1), STEP8(8*8*2,1) },
+ { STEP8(0,8), STEP8(8*8*2*2,8) },
8*8*2*4
};
static GFXDECODE_START( gfx_homerun )
- GFXDECODE_ENTRY( "gfx1", 0, gfxlayout, 0, 16 )
- GFXDECODE_ENTRY( "gfx2", 0, spritelayout, 0, 16 )
+ GFXDECODE_ENTRY( "gfx1", 0, gfxlayout, 0, 16 )
+ GFXDECODE_ENTRY( "gfx2", 0, spritelayout, 0, 16 )
GFXDECODE_END
@@ -327,23 +327,19 @@ GFXDECODE_END
void homerun_state::machine_start()
{
- uint8_t *ROM = memregion("maincpu")->base();
+ u8 *ROM = memregion("maincpu")->base();
- membank("bank1")->configure_entry(0, &ROM[0x00000]);
- membank("bank1")->configure_entries(1, 7, &ROM[0x10000], 0x4000);
+ m_mainbank->configure_entries(0, 8, &ROM[0x00000], 0x4000);
save_item(NAME(m_control));
save_item(NAME(m_sample));
- save_item(NAME(m_gfx_ctrl));
- save_item(NAME(m_scrolly));
- save_item(NAME(m_scrollx));
}
void homerun_state::machine_reset()
{
- m_control = 0;
- m_sample = 0;
- m_gfx_ctrl = 0;
+ control_w(0);
+ d7756_sample_w(0);
+ banking_w(0);
m_scrolly = 0;
m_scrollx = 0;
}
@@ -354,30 +350,30 @@ void homerun_state::dynashot(machine_config &config)
{
/* basic machine hardware */
Z80(config, m_maincpu, XTAL(20'000'000)/4);
- m_maincpu->set_addrmap(AS_PROGRAM, &homerun_state::homerun_memmap);
- m_maincpu->set_addrmap(AS_IO, &homerun_state::homerun_iomap);
+ m_maincpu->set_addrmap(AS_PROGRAM, &homerun_state::mem_map);
+ m_maincpu->set_addrmap(AS_IO, &homerun_state::io_map);
m_maincpu->set_vblank_int("screen", FUNC(homerun_state::irq0_line_hold));
i8255_device &ppi(I8255A(config, "ppi8255"));
- ppi.out_pa_callback().set(FUNC(homerun_state::homerun_scrollhi_w));
- ppi.out_pb_callback().set(FUNC(homerun_state::homerun_scrolly_w));
- ppi.out_pc_callback().set(FUNC(homerun_state::homerun_scrollx_w));
+ ppi.out_pa_callback().set(FUNC(homerun_state::scrollhi_w));
+ ppi.out_pb_callback().set(FUNC(homerun_state::scrolly_w));
+ ppi.out_pc_callback().set(FUNC(homerun_state::scrollx_w));
/* video hardware */
SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
m_screen->set_raw(XTAL(20'000'000)/4,328,0,256,253,0,240);
- m_screen->set_screen_update(FUNC(homerun_state::screen_update_homerun));
+ m_screen->set_screen_update(FUNC(homerun_state::screen_update));
m_screen->set_palette(m_palette);
GFXDECODE(config, m_gfxdecode, m_palette, gfx_homerun);
- PALETTE(config, m_palette).set_entries(16*4);
+ PALETTE(config, m_palette).set_format(1, &homerun_state::homerun_RGB332, 16*4);
/* sound hardware */
SPEAKER(config, "mono").front_center();
ym2203_device &ymsnd(YM2203(config, "ymsnd", XTAL(20'000'000)/8));
ymsnd.port_a_read_callback().set_ioport("DSW");
- ymsnd.port_b_write_callback().set(FUNC(homerun_state::homerun_banking_w));
+ ymsnd.port_b_write_callback().set(FUNC(homerun_state::banking_w));
ymsnd.add_route(ALL_OUTPUTS, "mono", 0.50);
}
@@ -412,9 +408,8 @@ void homerun_state::ganjaja(machine_config &config)
/**************************************************************************/
ROM_START( homerun )
- ROM_REGION( 0x30000, "maincpu", 0 )
- ROM_LOAD( "homerun.ic43", 0x00000, 0x04000, CRC(e759e476) SHA1(ad4f356ff26209033320a3e6353e4d4d9beb59c1) )
- ROM_CONTINUE( 0x10000, 0x1c000)
+ ROM_REGION( 0x20000, "maincpu", 0 )
+ ROM_LOAD( "homerun.ic43", 0x00000, 0x20000, CRC(e759e476) SHA1(ad4f356ff26209033320a3e6353e4d4d9beb59c1) )
ROM_REGION( 0x10000, "gfx1", 0 )
ROM_LOAD( "homerun.ic60", 0x00000, 0x10000, CRC(69a720d1) SHA1(0f0a4877578f358e9e829ece8c31e23f01adcf83) )
@@ -427,9 +422,8 @@ ROM_START( homerun )
ROM_END
ROM_START( nhomerun )
- ROM_REGION( 0x30000, "maincpu", 0 )
- ROM_LOAD( "1.ic43", 0x00000, 0x04000, CRC(aed96d6d) SHA1(5cb3932f4cfa3f6c0134ac20a1747c562db31a65) )
- ROM_CONTINUE( 0x10000, 0x1c000)
+ ROM_REGION( 0x20000, "maincpu", 0 )
+ ROM_LOAD( "1.ic43", 0x00000, 0x20000, CRC(aed96d6d) SHA1(5cb3932f4cfa3f6c0134ac20a1747c562db31a65) )
ROM_REGION( 0x10000, "gfx1", 0 )
ROM_LOAD( "3.ic60", 0x00000, 0x10000, CRC(69a720d1) SHA1(0f0a4877578f358e9e829ece8c31e23f01adcf83) )
@@ -442,9 +436,8 @@ ROM_START( nhomerun )
ROM_END
ROM_START( dynashot )
- ROM_REGION( 0x30000, "maincpu", 0 )
- ROM_LOAD( "1.ic43", 0x00000, 0x04000, CRC(bf3c9586) SHA1(439effbda305f5fa265e5897c81dc1447e5d867d) )
- ROM_CONTINUE( 0x10000, 0x1c000)
+ ROM_REGION( 0x20000, "maincpu", 0 )
+ ROM_LOAD( "1.ic43", 0x00000, 0x20000, CRC(bf3c9586) SHA1(439effbda305f5fa265e5897c81dc1447e5d867d) )
ROM_REGION( 0x10000, "gfx1", 0 )
ROM_LOAD( "3.ic60", 0x00000, 0x10000, CRC(77d6a608) SHA1(a31ff343a5d4d6f20301c030ecc2e252149bcf9d) )
@@ -455,9 +448,8 @@ ROM_END
ROM_START( ganjaja )
- ROM_REGION( 0x30000, "maincpu", 0 )
- ROM_LOAD( "1.ic43", 0x00000, 0x04000, CRC(dad57543) SHA1(dbd8b5cee33756ee5e3c41bf84c0f7141d3466dc) )
- ROM_CONTINUE( 0x10000, 0x1c000)
+ ROM_REGION( 0x20000, "maincpu", 0 )
+ ROM_LOAD( "1.ic43", 0x00000, 0x20000, CRC(dad57543) SHA1(dbd8b5cee33756ee5e3c41bf84c0f7141d3466dc) )
ROM_REGION( 0x10000, "gfx1", 0 )
ROM_LOAD( "ic60", 0x00000, 0x10000, CRC(855f6b28) SHA1(386411e88cf9bed54fe2073f0828d579cb1d04ee) )
diff --git a/src/mame/drivers/homez80.cpp b/src/mame/drivers/homez80.cpp
index b5dfb30b1dd..afe9586e22d 100644
--- a/src/mame/drivers/homez80.cpp
+++ b/src/mame/drivers/homez80.cpp
@@ -287,25 +287,26 @@ INTERRUPT_GEN_MEMBER(homez80_state::homez80_interrupt)
m_irq ^= 1;
}
-MACHINE_CONFIG_START(homez80_state::homez80)
+void homez80_state::homez80(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu",Z80, XTAL(8'000'000) / 2)
- MCFG_DEVICE_PROGRAM_MAP(homez80_mem)
- MCFG_DEVICE_IO_MAP(homez80_io)
- MCFG_DEVICE_PERIODIC_INT_DRIVER(homez80_state, homez80_interrupt, 50)
+ Z80(config, m_maincpu, XTAL(8'000'000) / 2);
+ m_maincpu->set_addrmap(AS_PROGRAM, &homez80_state::homez80_mem);
+ m_maincpu->set_addrmap(AS_IO, &homez80_state::homez80_io);
+ m_maincpu->set_periodic_int(FUNC(homez80_state::homez80_interrupt), attotime::from_hz(50));
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(50)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */
- MCFG_SCREEN_UPDATE_DRIVER(homez80_state, screen_update)
- MCFG_SCREEN_SIZE(344, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0, 344-1, 0, 32*8-1)
- MCFG_SCREEN_PALETTE("palette")
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(50);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */
+ screen.set_screen_update(FUNC(homez80_state::screen_update));
+ screen.set_size(344, 32*8);
+ screen.set_visarea(0, 344-1, 0, 32*8-1);
+ screen.set_palette("palette");
PALETTE(config, "palette", palette_device::MONOCHROME);
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_homez80)
-MACHINE_CONFIG_END
+ GFXDECODE(config, "gfxdecode", "palette", gfx_homez80);
+}
/* ROM definition */
ROM_START( homez80 )
diff --git a/src/mame/drivers/horizon.cpp b/src/mame/drivers/horizon.cpp
index 80dd8fd3967..b34eabc09a6 100644
--- a/src/mame/drivers/horizon.cpp
+++ b/src/mame/drivers/horizon.cpp
@@ -48,6 +48,7 @@ involves replacing the XTAL and reconnecting one jumper.
#define I8251_R_TAG "4a"
#define RS232_A_TAG "rs232a"
#define RS232_B_TAG "rs232b"
+#define S100_TAG "s100"
class horizon_state : public driver_device
{
@@ -57,6 +58,7 @@ public:
, m_maincpu(*this, Z80_TAG)
, m_usart_l(*this, I8251_L_TAG)
, m_usart_r(*this, I8251_R_TAG)
+ , m_s100(*this, S100_TAG)
{ }
void horizon(machine_config &config);
@@ -72,6 +74,7 @@ private:
required_device<cpu_device> m_maincpu;
required_device<i8251_device> m_usart_l;
required_device<i8251_device> m_usart_r;
+ required_device<s100_bus_device> m_s100;
};
@@ -176,14 +179,15 @@ static void horizon_s100_cards(device_slot_interface &device)
//**************************************************************************
//-------------------------------------------------
-// MACHINE_CONFIG( horizon )
+// machine_config( horizon )
//-------------------------------------------------
-MACHINE_CONFIG_START(horizon_state::horizon)
+void horizon_state::horizon(machine_config &config)
+{
// basic machine hardware
- MCFG_DEVICE_ADD(Z80_TAG, Z80, XTAL(8'000'000) / 2)
- MCFG_DEVICE_PROGRAM_MAP(horizon_mem)
- MCFG_DEVICE_IO_MAP(horizon_io)
+ Z80(config, m_maincpu, XTAL(8'000'000) / 2);
+ m_maincpu->set_addrmap(AS_PROGRAM, &horizon_state::horizon_mem);
+ m_maincpu->set_addrmap(AS_IO, &horizon_state::horizon_io);
// devices
I8251(config, m_usart_l, 0);
@@ -206,33 +210,31 @@ MACHINE_CONFIG_START(horizon_state::horizon)
rs232b.dsr_handler().set(m_usart_r, FUNC(i8251_device::write_dsr));
// S-100
- MCFG_DEVICE_ADD("s100", S100_BUS, XTAL(8'000'000) / 4)
- MCFG_S100_RDY_CALLBACK(INPUTLINE(Z80_TAG, Z80_INPUT_LINE_BOGUSWAIT))
- //MCFG_S100_SLOT_ADD("s100:1", horizon_s100_cards, nullptr, nullptr) // CPU
- MCFG_S100_SLOT_ADD("s100:2", horizon_s100_cards, nullptr) // RAM
- MCFG_S100_SLOT_ADD("s100:3", horizon_s100_cards, "mdsad") // MDS
- MCFG_S100_SLOT_ADD("s100:4", horizon_s100_cards, nullptr) // FPB
- MCFG_S100_SLOT_ADD("s100:5", horizon_s100_cards, nullptr)
- MCFG_S100_SLOT_ADD("s100:6", horizon_s100_cards, nullptr)
- MCFG_S100_SLOT_ADD("s100:7", horizon_s100_cards, nullptr)
- MCFG_S100_SLOT_ADD("s100:8", horizon_s100_cards, nullptr)
- MCFG_S100_SLOT_ADD("s100:9", horizon_s100_cards, nullptr)
- MCFG_S100_SLOT_ADD("s100:10", horizon_s100_cards, nullptr)
- MCFG_S100_SLOT_ADD("s100:11", horizon_s100_cards, nullptr)
- MCFG_S100_SLOT_ADD("s100:12", horizon_s100_cards, nullptr)
+ S100_BUS(config, m_s100, XTAL(8'000'000) / 4);
+ m_s100->rdy().set_inputline(m_maincpu, Z80_INPUT_LINE_BOGUSWAIT);
+ //S100_SLOT(config, S100_TAG":1", horizon_s100_cards, nullptr, nullptr); // CPU
+ S100_SLOT(config, "s100:2", horizon_s100_cards, nullptr); // RAM
+ S100_SLOT(config, "s100:3", horizon_s100_cards, "mdsad"); // MDS
+ S100_SLOT(config, "s100:4", horizon_s100_cards, nullptr); // FPB
+ S100_SLOT(config, "s100:5", horizon_s100_cards, nullptr);
+ S100_SLOT(config, "s100:6", horizon_s100_cards, nullptr);
+ S100_SLOT(config, "s100:7", horizon_s100_cards, nullptr);
+ S100_SLOT(config, "s100:8", horizon_s100_cards, nullptr);
+ S100_SLOT(config, "s100:9", horizon_s100_cards, nullptr);
+ S100_SLOT(config, "s100:10", horizon_s100_cards, nullptr);
+ S100_SLOT(config, "s100:11", horizon_s100_cards, nullptr);
+ S100_SLOT(config, "s100:12", horizon_s100_cards, nullptr);
// software list
- MCFG_SOFTWARE_LIST_ADD("flop_list", "horizon")
-MACHINE_CONFIG_END
+ SOFTWARE_LIST(config, "flop_list").set_original("horizon");
+}
-MACHINE_CONFIG_START(horizon_state::horizon2mhz)
+void horizon_state::horizon2mhz(machine_config &config)
+{
horizon(config);
- MCFG_DEVICE_MODIFY("z80")
- MCFG_DEVICE_CLOCK(XTAL(4'000'000) / 2)
-
- MCFG_DEVICE_MODIFY("s100")
- MCFG_DEVICE_CLOCK(XTAL(4'000'000) / 2)
-MACHINE_CONFIG_END
+ m_maincpu->set_clock(XTAL(4'000'000) / 2);
+ m_s100->set_clock(XTAL(4'000'000) / 2);
+}
diff --git a/src/mame/drivers/hornet.cpp b/src/mame/drivers/hornet.cpp
index 115a1b4a689..9416abc126b 100644
--- a/src/mame/drivers/hornet.cpp
+++ b/src/mame/drivers/hornet.cpp
@@ -1064,8 +1064,8 @@ double hornet_state::adc12138_input_callback(uint8_t input)
return (double)(value) / 2047.0;
}
-MACHINE_CONFIG_START(hornet_state::hornet)
-
+void hornet_state::hornet(machine_config &config)
+{
/* basic machine hardware */
PPC403GA(config, m_maincpu, XTAL(64'000'000) / 2); /* PowerPC 403GA 32MHz */
m_maincpu->set_addrmap(AS_PROGRAM, &hornet_state::hornet_map);
@@ -1125,9 +1125,10 @@ MACHINE_CONFIG_START(hornet_state::hornet)
KONPPC(config, m_konppc, 0);
m_konppc->set_num_boards(1);
m_konppc->set_cbboard_type(konppc_device::CGBOARD_TYPE_HORNET);
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(hornet_state::hornet_2board)
+void hornet_state::hornet_2board(machine_config &config)
+{
hornet(config);
ADSP21062(config, m_dsp2, XTAL(36'000'000));
@@ -1170,16 +1171,18 @@ MACHINE_CONFIG_START(hornet_state::hornet_2board)
rscreen.set_screen_update(FUNC(hornet_state::screen_update_rscreen));
m_konppc->set_num_boards(2);
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(hornet_state::terabrst)
+void hornet_state::terabrst(machine_config &config)
+{
hornet(config);
M68000(config, m_gn680, XTAL(32'000'000) / 2); /* 16MHz */
m_gn680->set_addrmap(AS_PROGRAM, &hornet_state::gn680_memmap);
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(hornet_state::hornet_2board_v2)
+void hornet_state::hornet_2board_v2(machine_config &config)
+{
hornet_2board(config);
VOODOO_2(config.replace(), m_voodoo[0], STD_VOODOO_2_CLOCK);
@@ -1195,7 +1198,7 @@ MACHINE_CONFIG_START(hornet_state::hornet_2board_v2)
m_voodoo[1]->set_screen_tag("rscreen");
m_voodoo[1]->set_cpu_tag("dsp2"); // ??
m_voodoo[1]->vblank_callback().set(FUNC(hornet_state::voodoo_vblank_1));
-MACHINE_CONFIG_END
+}
void hornet_state::sscope2(machine_config &config)
{
diff --git a/src/mame/drivers/hotblock.cpp b/src/mame/drivers/hotblock.cpp
index 7c63d22dc6b..c053f266313 100644
--- a/src/mame/drivers/hotblock.cpp
+++ b/src/mame/drivers/hotblock.cpp
@@ -207,21 +207,21 @@ static INPUT_PORTS_START( hotblock )
INPUT_PORTS_END
-MACHINE_CONFIG_START(hotblock_state::hotblock)
-
+void hotblock_state::hotblock(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", I8088, 24_MHz_XTAL / 3) // Unknown clock
- MCFG_DEVICE_PROGRAM_MAP(hotblock_map)
- MCFG_DEVICE_IO_MAP(hotblock_io)
+ I8088(config, m_maincpu, 24_MHz_XTAL / 3); // Unknown clock
+ m_maincpu->set_addrmap(AS_PROGRAM, &hotblock_state::hotblock_map);
+ m_maincpu->set_addrmap(AS_IO, &hotblock_state::hotblock_io);
// I2CMEM(config, m_i2cmem, 0).set_page_size(16).set_data_size(0x200); // 24C04
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_RAW_PARAMS(24_MHz_XTAL / 3, 512, 0, 320, 312, 0, 200) // 15.625 kHz horizontal???
- MCFG_SCREEN_UPDATE_DRIVER(hotblock_state, screen_update)
- MCFG_SCREEN_PALETTE("palette")
- MCFG_SCREEN_VBLANK_CALLBACK(INPUTLINE("maincpu", INPUT_LINE_NMI)) // right?
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_raw(24_MHz_XTAL / 3, 512, 0, 320, 312, 0, 200); // 15.625 kHz horizontal???
+ screen.set_screen_update(FUNC(hotblock_state::screen_update));
+ screen.set_palette(m_palette);
+ screen.screen_vblank().set_inputline(m_maincpu, INPUT_LINE_NMI); // right?
PALETTE(config, m_palette).set_format(palette_device::xBGR_555, 0x200/2);
@@ -232,7 +232,7 @@ MACHINE_CONFIG_START(hotblock_state::hotblock)
aysnd.port_a_read_callback().set_ioport("P1");
aysnd.port_b_read_callback().set_ioport("P2");
aysnd.add_route(ALL_OUTPUTS, "mono", 0.50);
-MACHINE_CONFIG_END
+}
ROM_START( hotblock )
ROM_REGION( 0x100000, "maincpu", 0 )
diff --git a/src/mame/drivers/hotstuff.cpp b/src/mame/drivers/hotstuff.cpp
index 6bde0ec44ac..2bcec1734c5 100644
--- a/src/mame/drivers/hotstuff.cpp
+++ b/src/mame/drivers/hotstuff.cpp
@@ -88,11 +88,11 @@ void hotstuff_state::hotstuff_map(address_map &map)
map(0x600000, 0x600003).rw("scc1", FUNC(z80scc_device::ba_cd_inv_r), FUNC(z80scc_device::ba_cd_inv_w));
map(0x620000, 0x620003).rw("scc2", FUNC(z80scc_device::ba_cd_inv_r), FUNC(z80scc_device::ba_cd_inv_w));
map(0x680000, 0x680001).lrw8("rtc_rw",
- [this](address_space &space, offs_t offset, u8 mem_mask) {
- return m_rtc->read(space, offset^1, mem_mask);
+ [this](offs_t offset) {
+ return m_rtc->read(offset^1);
},
- [this](address_space &space, offs_t offset, u8 data, u8 mem_mask) {
- m_rtc->write(space, offset^1, data, mem_mask);
+ [this](offs_t offset, u8 data) {
+ m_rtc->write(offset^1, data);
});
map(0x980000, 0x9bffff).ram().share("bitmapram");
@@ -101,19 +101,19 @@ void hotstuff_state::hotstuff_map(address_map &map)
static INPUT_PORTS_START( hotstuff )
INPUT_PORTS_END
-MACHINE_CONFIG_START(hotstuff_state::hotstuff)
-
- MCFG_DEVICE_ADD("maincpu", M68000, 16000000)
- MCFG_DEVICE_PROGRAM_MAP(hotstuff_map)
+void hotstuff_state::hotstuff(machine_config &config)
+{
+ M68000(config, m_maincpu, 16000000);
+ m_maincpu->set_addrmap(AS_PROGRAM, &hotstuff_state::hotstuff_map);
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(128*8, 64*8)
- MCFG_SCREEN_VISIBLE_AREA((0x10*4)+8, 101*8-1, 0*8, 33*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(hotstuff_state, screen_update_hotstuff)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(128*8, 64*8);
+ screen.set_visarea((0x10*4)+8, 101*8-1, 0*8, 33*8-1);
+ screen.set_screen_update(FUNC(hotstuff_state::screen_update_hotstuff));
- MCFG_PALETTE_ADD("palette", 0x200)
+ PALETTE(config, "palette").set_entries(0x200);
scc8530_device& scc1(SCC8530N(config, "scc1", 4915200));
scc1.out_int_callback().set_inputline(m_maincpu, M68K_IRQ_4);
@@ -123,7 +123,7 @@ MACHINE_CONFIG_START(hotstuff_state::hotstuff)
MC146818(config, m_rtc, XTAL(32'768));
m_rtc->irq().set_inputline("maincpu", M68K_IRQ_1);
-MACHINE_CONFIG_END
+}
diff --git a/src/mame/drivers/hp16500.cpp b/src/mame/drivers/hp16500.cpp
index f3bc942d289..4ed4e5bd469 100644
--- a/src/mame/drivers/hp16500.cpp
+++ b/src/mame/drivers/hp16500.cpp
@@ -413,14 +413,15 @@ uint32_t hp16500_state::screen_update_hp16500(screen_device &screen, bitmap_rgb3
return 0;
}
-MACHINE_CONFIG_START(hp16500_state::hp1650)
+void hp16500_state::hp1650(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M68000, 10000000)
- MCFG_DEVICE_PROGRAM_MAP(hp1650_map)
+ M68000(config, m_maincpu, 10000000);
+ m_maincpu->set_addrmap(AS_PROGRAM, &hp16500_state::hp1650_map);
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_RAW_PARAMS(25000000, 0x330, 0, 0x250, 0x198, 0, 0x180 )
- MCFG_SCREEN_UPDATE_DEVICE( "crtc", mc6845_device, screen_update )
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_raw(25000000, 0x330, 0, 0x250, 0x198, 0, 0x180);
+ screen.set_screen_update("crtc", FUNC(mc6845_device::screen_update));
mc6845_device &crtc(MC6845(config, "crtc", 25000000/9));
crtc.set_screen("screen");
@@ -429,20 +430,21 @@ MACHINE_CONFIG_START(hp16500_state::hp1650)
crtc.set_update_row_callback(FUNC(hp16500_state::crtc_update_row_1650), this);
crtc.out_vsync_callback().set(FUNC(hp16500_state::vsync_changed));
- MCFG_DEVICE_ADD("epci", MC2661, 5000000)
+ MC2661(config, "epci", 5000000);
SPEAKER(config, "lspeaker").front_left();
SPEAKER(config, "rspeaker").front_right();
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(hp16500_state::hp1651)
+void hp16500_state::hp1651(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M68000, 10000000)
- MCFG_DEVICE_PROGRAM_MAP(hp1651_map)
+ M68000(config, m_maincpu, 10000000);
+ m_maincpu->set_addrmap(AS_PROGRAM, &hp16500_state::hp1651_map);
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_RAW_PARAMS(25000000, 0x330, 0, 0x250, 0x198, 0, 0x180 )
- MCFG_SCREEN_UPDATE_DEVICE( "crtc", mc6845_device, screen_update )
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_raw(25000000, 0x330, 0, 0x250, 0x198, 0, 0x180);
+ screen.set_screen_update("crtc", FUNC(mc6845_device::screen_update));
mc6845_device &crtc(MC6845(config, "crtc", 25000000/9));
crtc.set_screen("screen");
@@ -451,20 +453,21 @@ MACHINE_CONFIG_START(hp16500_state::hp1651)
crtc.set_update_row_callback(FUNC(hp16500_state::crtc_update_row_1650), this);
crtc.out_vsync_callback().set(FUNC(hp16500_state::vsync_changed));
- MCFG_DEVICE_ADD("epci", MC2661, 5000000)
+ MC2661(config, "epci", 5000000);
SPEAKER(config, "lspeaker").front_left();
SPEAKER(config, "rspeaker").front_right();
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(hp16500_state::hp16500a)
+void hp16500_state::hp16500a(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M68000, 10000000)
- MCFG_DEVICE_PROGRAM_MAP(hp16500a_map)
+ M68000(config, m_maincpu, 10000000);
+ m_maincpu->set_addrmap(AS_PROGRAM, &hp16500_state::hp16500a_map);
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_RAW_PARAMS(25000000, 0x320, 0, 0x240, 0x19c, 0, 0x170 )
- MCFG_SCREEN_UPDATE_DEVICE( "crtc", mc6845_device, screen_update )
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_raw(25000000, 0x320, 0, 0x240, 0x19c, 0, 0x170);
+ screen.set_screen_update("crtc", FUNC(mc6845_device::screen_update));
mc6845_device &crtc(MC6845(config, "crtc", 25000000/9));
crtc.set_screen("screen");
@@ -475,7 +478,7 @@ MACHINE_CONFIG_START(hp16500_state::hp16500a)
SPEAKER(config, "lspeaker").front_left();
SPEAKER(config, "rspeaker").front_right();
-MACHINE_CONFIG_END
+}
void hp16500_state::hp16500b(machine_config &config)
{
diff --git a/src/mame/drivers/hp2100.cpp b/src/mame/drivers/hp2100.cpp
index 4a4457f187e..2ea6920c822 100644
--- a/src/mame/drivers/hp2100.cpp
+++ b/src/mame/drivers/hp2100.cpp
@@ -249,8 +249,9 @@ private:
static INPUT_PORTS_START( hp2100 )
INPUT_PORTS_END
-MACHINE_CONFIG_START(hp2100_state::hp2100)
-MACHINE_CONFIG_END
+void hp2100_state::hp2100(machine_config &config)
+{
+}
ROM_START( hp2100 )
ROM_REGION( 0x0400, "maincpu", 0 )
diff --git a/src/mame/drivers/hp2640.cpp b/src/mame/drivers/hp2640.cpp
index adf45587cff..ef357b12e3e 100644
--- a/src/mame/drivers/hp2640.cpp
+++ b/src/mame/drivers/hp2640.cpp
@@ -62,6 +62,7 @@
#include "machine/timer.h"
#include "bus/rs232/rs232.h"
#include "machine/ay31015.h"
+#include "machine/clock.h"
#include "sound/beep.h"
#include "emupal.h"
#include "speaker.h"
@@ -170,6 +171,7 @@ private:
required_device<timer_device> m_timer_cursor_blink_inh;
required_device<rs232_port_device> m_rs232;
required_device<ay51013_device> m_uart;
+ required_device<clock_device> m_uart_clock;
required_device<beep_device> m_beep;
required_device<timer_device> m_timer_beep;
@@ -231,6 +233,7 @@ hp2645_state::hp2645_state(const machine_config &mconfig, device_type type, cons
m_timer_cursor_blink_inh(*this , "timer_cursor_blink_inh"),
m_rs232(*this , "rs232"),
m_uart(*this , "uart"),
+ m_uart_clock(*this , "uart_clock"),
m_beep(*this , "beep"),
m_timer_beep(*this , "timer_beep"),
m_chargen(*this , "chargen%u" , 0)
@@ -262,8 +265,7 @@ void hp2645_state::machine_reset()
m_uart->write_cs(1);
m_uart->write_nb2(1);
m_async_control = 0;
- m_uart->set_receiver_clock(0);
- m_uart->set_transmitter_clock(0);
+ m_uart_clock->set_unscaled_clock(0);
update_async_control(0x00);
m_rs232->write_dtr(0);
async_txd_w(0);
@@ -699,8 +701,7 @@ void hp2645_state::update_async_control(uint8_t new_control)
} else {
rxc_txc_freq = SYS_CLOCK.dvalue() / baud_rate_divisors[ new_rate_idx ];
}
- m_uart->set_receiver_clock(rxc_txc_freq);
- m_uart->set_transmitter_clock(rxc_txc_freq);
+ m_uart_clock->set_unscaled_clock(rxc_txc_freq);
m_uart->write_tsb(new_rate_idx == 1);
LOG("ASYNC freq=%f\n" , rxc_txc_freq);
}
@@ -965,24 +966,25 @@ void hp2645_state::cpu_io_map(address_map &map)
map(0x00, 0xff).w(FUNC(hp2645_state::mode_byte_w));
}
-MACHINE_CONFIG_START(hp2645_state::hp2645)
- MCFG_DEVICE_ADD("cpu" , I8080A , SYS_CLOCK / 2)
- MCFG_DEVICE_PROGRAM_MAP(cpu_mem_map)
- MCFG_DEVICE_IO_MAP(cpu_io_map)
- MCFG_DEVICE_IRQ_ACKNOWLEDGE_DRIVER(hp2645_state , irq_callback)
+void hp2645_state::hp2645(machine_config &config)
+{
+ I8080A(config, m_cpu, SYS_CLOCK / 2);
+ m_cpu->set_addrmap(AS_PROGRAM, &hp2645_state::cpu_mem_map);
+ m_cpu->set_addrmap(AS_IO, &hp2645_state::cpu_io_map);
+ m_cpu->set_irq_acknowledge_callback(FUNC(hp2645_state::irq_callback));
- MCFG_TIMER_DRIVER_ADD("timer_10ms" , hp2645_state , timer_10ms_exp)
- MCFG_TIMER_DRIVER_ADD("timer_cursor_blink_inh" , hp2645_state , timer_cursor_blink_inh)
+ TIMER(config, m_timer_10ms).configure_generic(FUNC(hp2645_state::timer_10ms_exp));
+ TIMER(config, m_timer_cursor_blink_inh).configure_generic(FUNC(hp2645_state::timer_cursor_blink_inh));
- MCFG_SCREEN_ADD_MONOCHROME("screen" , RASTER , rgb_t::white())
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER, rgb_t::white());
// Actual pixel clock is half this value: 21.06 MHz
// We use the doubled value to be able to emulate the half-pixel shifting of the real hw
// Each real-world half pixel is a whole MAME pixel
- MCFG_SCREEN_RAW_PARAMS(VIDEO_DOT_CLOCK * 2 ,
+ m_screen->set_raw(VIDEO_DOT_CLOCK * 2 ,
VIDEO_TOT_COLS * VIDEO_CHAR_WIDTH * 2 , 0 , VIDEO_VIS_COLS * VIDEO_CHAR_WIDTH * 2 ,
- VIDEO_TOT_ROWS * VIDEO_CHAR_HEIGHT , 0 , VIDEO_VIS_ROWS * VIDEO_CHAR_HEIGHT)
- MCFG_SCREEN_UPDATE_DRIVER(hp2645_state , screen_update)
- MCFG_TIMER_DRIVER_ADD_SCANLINE("scantimer", hp2645_state, scanline_timer, "screen", 0, 1)
+ VIDEO_TOT_ROWS * VIDEO_CHAR_HEIGHT , 0 , VIDEO_VIS_ROWS * VIDEO_CHAR_HEIGHT);
+ m_screen->set_screen_update(FUNC(hp2645_state::screen_update));
+ TIMER(config, "scantimer").configure_scanline(FUNC(hp2645_state::scanline_timer), "screen", 0, 1);
PALETTE(config, m_palette, palette_device::MONOCHROME_HIGHLIGHT);
config.set_default_layout(layout_hp2640);
@@ -996,12 +998,15 @@ MACHINE_CONFIG_START(hp2645_state::hp2645)
m_uart->write_dav_callback().set(FUNC(hp2645_state::async_dav_w));
m_uart->set_auto_rdav(true);
+ CLOCK(config, m_uart_clock, 19200 * 16);
+ m_uart_clock->signal_handler().set(m_uart, FUNC(ay51013_device::write_rcp));
+ m_uart_clock->signal_handler().append(m_uart, FUNC(ay51013_device::write_tcp));
+
// Beep
SPEAKER(config, "mono").front_center();
BEEP(config, m_beep, BEEP_FREQUENCY).add_route(ALL_OUTPUTS, "mono", 1.00);
- MCFG_TIMER_DRIVER_ADD("timer_beep" , hp2645_state , timer_beep_exp)
-
-MACHINE_CONFIG_END
+ TIMER(config, m_timer_beep).configure_generic(FUNC(hp2645_state::timer_beep_exp));
+}
ROM_START(hp2645)
ROM_REGION(0x5800 , "cpu" , 0)
diff --git a/src/mame/drivers/hp48.cpp b/src/mame/drivers/hp48.cpp
index 5288b93b638..da3f184b779 100644
--- a/src/mame/drivers/hp48.cpp
+++ b/src/mame/drivers/hp48.cpp
@@ -1171,7 +1171,6 @@ void hp48_state::hp48_common(machine_config &config)
SPEAKER(config, "speaker").front_center();
DAC_1BIT(config, m_dac, 0).add_route(ALL_OUTPUTS, "speaker", 0.5);
voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref", 0));
- vref.set_output(5.0);
vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT);
}
diff --git a/src/mame/drivers/hp49gp.cpp b/src/mame/drivers/hp49gp.cpp
index bd88261dcf0..934a7f2a724 100644
--- a/src/mame/drivers/hp49gp.cpp
+++ b/src/mame/drivers/hp49gp.cpp
@@ -283,18 +283,19 @@ void hp49gp_state::init_hp49gp()
lcd_spi_init();
}
-MACHINE_CONFIG_START(hp49gp_state::hp49gp)
- MCFG_DEVICE_ADD("maincpu", ARM9, 400000000)
- MCFG_DEVICE_PROGRAM_MAP(hp49gp_map)
+void hp49gp_state::hp49gp(machine_config &config)
+{
+ ARM9(config, m_maincpu, 400000000);
+ m_maincpu->set_addrmap(AS_PROGRAM, &hp49gp_state::hp49gp_map);
- MCFG_PALETTE_ADD("palette", 32768)
+ PALETTE(config, "palette").set_entries(32768);
- MCFG_SCREEN_ADD("screen", LCD)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */
- MCFG_SCREEN_SIZE(160, 85)
- MCFG_SCREEN_VISIBLE_AREA(0, 131 - 1, 0, 80 - 1)
- MCFG_SCREEN_UPDATE_DEVICE("s3c2410", s3c2410_device, screen_update)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_LCD));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */
+ screen.set_size(160, 85);
+ screen.set_visarea(0, 131 - 1, 0, 80 - 1);
+ screen.set_screen_update("s3c2410", FUNC(s3c2410_device::screen_update));
S3C2410(config, m_s3c2410, 12000000);
m_s3c2410->set_palette_tag("palette");
@@ -302,7 +303,7 @@ MACHINE_CONFIG_START(hp49gp_state::hp49gp)
m_s3c2410->gpio_port_r_callback().set(FUNC(hp49gp_state::s3c2410_gpio_port_r));
m_s3c2410->gpio_port_w_callback().set(FUNC(hp49gp_state::s3c2410_gpio_port_w));
m_s3c2410->set_lcd_flags(S3C24XX_INTERFACE_LCD_REVERSE);
-MACHINE_CONFIG_END
+}
static INPUT_PORTS_START( hp49gp )
PORT_START("ROW1")
diff --git a/src/mame/drivers/hp64k.cpp b/src/mame/drivers/hp64k.cpp
index f7ea1209530..7dd4ce3f03a 100644
--- a/src/mame/drivers/hp64k.cpp
+++ b/src/mame/drivers/hp64k.cpp
@@ -430,7 +430,7 @@ void hp64k_state::machine_reset()
m_floppy0_wpt = false;
m_floppy1_wpt = false;
m_beeper->set_state(0);
- m_baud_rate->write_str((m_s5_sw->read() >> 1) & 0xf);
+ m_baud_rate->str_w((m_s5_sw->read() >> 1) & 0xf);
m_16x_clk = (m_rs232_sw->read() & 0x02) != 0;
m_loopback = false;
m_txd_state = true;
@@ -1372,46 +1372,46 @@ INPUT_PORTS_END
static void hp64k_floppies(device_slot_interface &device)
{
- device.option_add("525dd" , FLOPPY_525_DD);
+ device.option_add("525dd", FLOPPY_525_DD);
}
-MACHINE_CONFIG_START(hp64k_state::hp64k)
- HP_5061_3011(config , m_cpu , 6250000);
+void hp64k_state::hp64k(machine_config &config)
+{
+ HP_5061_3011(config, m_cpu, 6250000);
m_cpu->set_rw_cycles(6 , 6);
m_cpu->set_relative_mode(true);
- m_cpu->set_addrmap(AS_PROGRAM , &hp64k_state::cpu_mem_map);
- m_cpu->set_addrmap(AS_IO , &hp64k_state::cpu_io_map);
+ m_cpu->set_addrmap(AS_PROGRAM, &hp64k_state::cpu_mem_map);
+ m_cpu->set_addrmap(AS_IO, &hp64k_state::cpu_io_map);
m_cpu->set_irq_acknowledge_callback(FUNC(hp64k_state::hp64k_irq_callback));
// Actual keyboard refresh rate should be between 1 and 2 kHz
- MCFG_TIMER_DRIVER_ADD_PERIODIC("kb_timer", hp64k_state, hp64k_kb_scan, attotime::from_hz(100))
+ TIMER(config, "kb_timer").configure_periodic(FUNC(hp64k_state::hp64k_kb_scan), attotime::from_hz(100));
// Line sync timer. A line frequency of 50 Hz is assumed.
- MCFG_TIMER_DRIVER_ADD_PERIODIC("linesync_timer", hp64k_state, hp64k_line_sync, attotime::from_hz(50))
+ TIMER(config, "linesync_timer").configure_periodic(FUNC(hp64k_state::hp64k_line_sync), attotime::from_hz(50));
// Clock = 25 MHz / 9 * (112/114)
- MCFG_DEVICE_ADD("crtc", I8275, 2729045)
- MCFG_VIDEO_SET_SCREEN("screen")
- MCFG_I8275_CHARACTER_WIDTH(9)
- MCFG_I8275_DRAW_CHARACTER_CALLBACK_OWNER(hp64k_state, crtc_display_pixels)
- MCFG_I8275_DRQ_CALLBACK(WRITELINE(*this, hp64k_state, hp64k_crtc_drq_w))
- MCFG_I8275_VRTC_CALLBACK(WRITELINE(*this, hp64k_state, hp64k_crtc_vrtc_w))
-
- MCFG_SCREEN_ADD_MONOCHROME("screen", RASTER, rgb_t::green())
- MCFG_SCREEN_UPDATE_DEVICE("crtc", i8275_device, screen_update)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_SIZE(720, 390)
- MCFG_SCREEN_VISIBLE_AREA(0, 720-1, 0, 390-1)
+ I8275(config, m_crtc, 2729045);
+ m_crtc->set_screen("screen");
+ m_crtc->set_character_width(9);
+ m_crtc->set_display_callback(FUNC(hp64k_state::crtc_display_pixels), this);
+ m_crtc->drq_wr_callback().set(FUNC(hp64k_state::hp64k_crtc_drq_w));
+ m_crtc->vrtc_wr_callback().set(FUNC(hp64k_state::hp64k_crtc_vrtc_w));
+
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_color(rgb_t::green());
+ screen.set_screen_update("crtc", FUNC(i8275_device::screen_update));
+ screen.set_refresh_hz(60);
+ screen.set_size(720, 390);
+ screen.set_visarea(0, 720-1, 0, 390-1);
PALETTE(config, m_palette, palette_device::MONOCHROME_HIGHLIGHT);
FD1791(config, m_fdc, 4_MHz_XTAL / 4);
m_fdc->set_force_ready(true); // should be able to get rid of this when fdc issue is fixed
m_fdc->intrq_wr_callback().set(FUNC(hp64k_state::hp64k_flp_intrq_w));
m_fdc->drq_wr_callback().set(FUNC(hp64k_state::hp64k_flp_drq_w));
- MCFG_FLOPPY_DRIVE_ADD("fdc:0", hp64k_floppies, "525dd", floppy_image_device::default_floppy_formats)
- MCFG_SLOT_FIXED(true)
- MCFG_FLOPPY_DRIVE_ADD("fdc:1", hp64k_floppies, "525dd", floppy_image_device::default_floppy_formats)
- MCFG_SLOT_FIXED(true)
+ FLOPPY_CONNECTOR(config, "fdc:0", hp64k_floppies, "525dd", floppy_image_device::default_floppy_formats, true);
+ FLOPPY_CONNECTOR(config, "fdc:1", hp64k_floppies, "525dd", floppy_image_device::default_floppy_formats, true);
TTL74123(config, m_ss0, 0);
m_ss0->set_connection_type(TTL74123_NOT_GROUNDED_NO_DIODE);
@@ -1433,7 +1433,7 @@ MACHINE_CONFIG_START(hp64k_state::hp64k)
SPEAKER(config, "mono").front_center();
BEEP(config, m_beeper, 2500).add_route(ALL_OUTPUTS, "mono", 1.00);
- MCFG_TIMER_DRIVER_ADD("beep_timer", hp64k_state, hp64k_beeper_off);
+ TIMER(config, m_beep_timer).configure_generic(FUNC(hp64k_state::hp64k_beeper_off));
COM8116(config, m_baud_rate, 5.0688_MHz_XTAL);
m_baud_rate->fr_handler().set(FUNC(hp64k_state::hp64k_baud_clk_w));
@@ -1465,21 +1465,21 @@ MACHINE_CONFIG_START(hp64k_state::hp64k)
m_phi->signal_write_cb<phi_device::PHI_488_ATN>().set(IEEE488_TAG, FUNC(ieee488_device::host_atn_w));
m_phi->signal_write_cb<phi_device::PHI_488_REN>().set(IEEE488_TAG, FUNC(ieee488_device::host_ren_w));
- MCFG_IEEE488_BUS_ADD()
- MCFG_IEEE488_EOI_CALLBACK(WRITELINE(m_phi, phi_device, eoi_w))
- MCFG_IEEE488_DAV_CALLBACK(WRITELINE(m_phi, phi_device, dav_w))
- MCFG_IEEE488_NRFD_CALLBACK(WRITELINE(m_phi, phi_device, nrfd_w))
- MCFG_IEEE488_NDAC_CALLBACK(WRITELINE(m_phi, phi_device, ndac_w))
- MCFG_IEEE488_IFC_CALLBACK(WRITELINE(m_phi, phi_device, ifc_w))
- MCFG_IEEE488_SRQ_CALLBACK(WRITELINE(m_phi, phi_device, srq_w))
- MCFG_IEEE488_ATN_CALLBACK(WRITELINE(m_phi, phi_device, atn_w))
- MCFG_IEEE488_REN_CALLBACK(WRITELINE(m_phi, phi_device, ren_w))
- MCFG_IEEE488_DIO_CALLBACK(WRITE8(m_phi, phi_device , bus_dio_w))
- MCFG_IEEE488_SLOT_ADD("ieee_rem" , 0 , remote488_devices , nullptr)
-MACHINE_CONFIG_END
+ ieee488_device &ieee(IEEE488(config, IEEE488_TAG));
+ ieee.eoi_callback().set(m_phi, FUNC(phi_device::eoi_w));
+ ieee.dav_callback().set(m_phi, FUNC(phi_device::dav_w));
+ ieee.nrfd_callback().set(m_phi, FUNC(phi_device::nrfd_w));
+ ieee.ndac_callback().set(m_phi, FUNC(phi_device::ndac_w));
+ ieee.ifc_callback().set(m_phi, FUNC(phi_device::ifc_w));
+ ieee.srq_callback().set(m_phi, FUNC(phi_device::srq_w));
+ ieee.atn_callback().set(m_phi, FUNC(phi_device::atn_w));
+ ieee.ren_callback().set(m_phi, FUNC(phi_device::ren_w));
+ ieee.dio_callback().set(m_phi, FUNC(phi_device::bus_dio_w));
+ IEEE488_SLOT(config, "ieee_rem", 0, remote488_devices, nullptr);
+}
ROM_START(hp64k)
- ROM_REGION(0x8000 , "cpu" , ROMREGION_16BIT | ROMREGION_BE | ROMREGION_INVERT)
+ ROM_REGION(0x8000, "cpu" , ROMREGION_16BIT | ROMREGION_BE | ROMREGION_INVERT)
ROM_LOAD16_BYTE("64100_80022.bin" , 0x0000 , 0x1000 , CRC(38b2aae5) SHA1(bfd0f126bfaf3724dc501979ad2d46afc41913aa))
ROM_LOAD16_BYTE("64100_80020.bin" , 0x0001 , 0x1000 , CRC(ac01b436) SHA1(be1e827ea1393a95abb02a52ab5cc35dc2cd96e4))
ROM_LOAD16_BYTE("64100_80023.bin" , 0x2000 , 0x1000 , CRC(6b4bc2ce) SHA1(00e6c58ccae9640dc81cb3e92db90a8c69b02a93))
diff --git a/src/mame/drivers/hp80.cpp b/src/mame/drivers/hp80.cpp
index 7f7dfb6ab54..af69dc4c11b 100644
--- a/src/mame/drivers/hp80.cpp
+++ b/src/mame/drivers/hp80.cpp
@@ -1331,75 +1331,67 @@ void hp85_state::rombank_mem_map(address_map &map)
map(0x0000, 0x1fff).rom();
}
-MACHINE_CONFIG_START(hp85_state::hp85)
- MCFG_DEVICE_ADD("cpu" , HP_CAPRICORN , MASTER_CLOCK / 16)
- MCFG_DEVICE_PROGRAM_MAP(cpu_mem_map)
- MCFG_DEVICE_IRQ_ACKNOWLEDGE_DRIVER(hp85_state , irq_callback)
+void hp85_state::hp85(machine_config &config)
+{
+ HP_CAPRICORN(config, m_cpu, MASTER_CLOCK / 16);
+ m_cpu->set_addrmap(AS_PROGRAM, &hp85_state::cpu_mem_map);
+ m_cpu->set_irq_acknowledge_callback(FUNC(hp85_state::irq_callback));
ADDRESS_MAP_BANK(config, "rombank").set_map(&hp85_state::rombank_mem_map).set_options(ENDIANNESS_LITTLE, 8, 21, HP80_OPTROM_SIZE);
- MCFG_SCREEN_ADD("screen" , RASTER)
- MCFG_SCREEN_RAW_PARAMS(MASTER_CLOCK / 2 , 312 , 0 , 256 , 256 , 0 , 192)
- MCFG_SCREEN_UPDATE_DRIVER(hp85_state , screen_update)
- MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE(*this, hp85_state, vblank_w))
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_raw(MASTER_CLOCK / 2 , 312 , 0 , 256 , 256 , 0 , 192);
+ m_screen->set_screen_update(FUNC(hp85_state::screen_update));
+ m_screen->screen_vblank().set(FUNC(hp85_state::vblank_w));
PALETTE(config, m_palette, palette_device::MONOCHROME);
- MCFG_TIMER_DRIVER_ADD("vm_timer", hp85_state, vm_timer)
+ TIMER(config, m_vm_timer).configure_generic(FUNC(hp85_state::vm_timer));
// No idea at all about the actual keyboard scan frequency
- MCFG_TIMER_DRIVER_ADD_PERIODIC("kb_timer" , hp85_state , kb_scan , attotime::from_hz(100))
+ TIMER(config, "kb_timer").configure_periodic(FUNC(hp85_state::kb_scan), attotime::from_hz(100));
// Hw timers are updated at 1 kHz rate
- MCFG_TIMER_DRIVER_ADD_PERIODIC("hw_timer" , hp85_state , timer_update , attotime::from_hz(1000))
- MCFG_TIMER_DRIVER_ADD("clk_busy_timer", hp85_state, clk_busy_timer)
- MCFG_TIMER_DRIVER_ADD("prt_busy_timer", hp85_state, prt_busy_timer)
+ TIMER(config, "hw_timer").configure_periodic(FUNC(hp85_state::timer_update), attotime::from_hz(1000));
+ TIMER(config, m_clk_busy_timer).configure_generic(FUNC(hp85_state::clk_busy_timer));
+ TIMER(config, m_prt_busy_timer).configure_generic(FUNC(hp85_state::prt_busy_timer));
// Beeper
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("dac" , DAC_1BIT , 0)
- MCFG_MIXER_ROUTE(ALL_OUTPUTS , "mono" , 0.5 , 0)
- MCFG_DEVICE_ADD("vref", VOLTAGE_REGULATOR, 0)
- MCFG_VOLTAGE_REGULATOR_OUTPUT(5.0)
- MCFG_SOUND_ROUTE(0, "dac", 1.0, DAC_VREF_POS_INPUT)
- MCFG_DEVICE_ADD("beeper" , BEEP , MASTER_CLOCK / 8192)
- MCFG_MIXER_ROUTE(ALL_OUTPUTS , "mono" , 0.5 , 0)
+ DAC_1BIT(config, m_dac , 0).add_route(ALL_OUTPUTS, "mono", 0.5, AUTO_ALLOC_INPUT, 0);
+ voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref"));
+ vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT);
+ BEEP(config, m_beep, MASTER_CLOCK / 8192).add_route(ALL_OUTPUTS, "mono", 0.5, AUTO_ALLOC_INPUT, 0);
// Tape drive
- MCFG_DEVICE_ADD("tape" , HP_1MA6 , 0)
+ HP_1MA6(config, "tape", 0);
// Optional ROMs
- MCFG_DEVICE_ADD("drawer1", HP80_OPTROM_SLOT, 0)
- MCFG_DEVICE_SLOT_INTERFACE(hp80_optrom_slot_devices, NULL, false)
- MCFG_DEVICE_ADD("drawer2", HP80_OPTROM_SLOT, 0)
- MCFG_DEVICE_SLOT_INTERFACE(hp80_optrom_slot_devices, NULL, false)
- MCFG_DEVICE_ADD("drawer3", HP80_OPTROM_SLOT, 0)
- MCFG_DEVICE_SLOT_INTERFACE(hp80_optrom_slot_devices, NULL, false)
- MCFG_DEVICE_ADD("drawer4", HP80_OPTROM_SLOT, 0)
- MCFG_DEVICE_SLOT_INTERFACE(hp80_optrom_slot_devices, NULL, false)
- MCFG_DEVICE_ADD("drawer5", HP80_OPTROM_SLOT, 0)
- MCFG_DEVICE_SLOT_INTERFACE(hp80_optrom_slot_devices, NULL, false)
- MCFG_DEVICE_ADD("drawer6", HP80_OPTROM_SLOT, 0)
- MCFG_DEVICE_SLOT_INTERFACE(hp80_optrom_slot_devices, NULL, false)
+ HP80_OPTROM_SLOT(config, m_rom_drawers[0]);
+ HP80_OPTROM_SLOT(config, m_rom_drawers[1]);
+ HP80_OPTROM_SLOT(config, m_rom_drawers[2]);
+ HP80_OPTROM_SLOT(config, m_rom_drawers[3]);
+ HP80_OPTROM_SLOT(config, m_rom_drawers[4]);
+ HP80_OPTROM_SLOT(config, m_rom_drawers[5]);
// I/O slots
- MCFG_HP80_IO_SLOT_ADD("slot1" , 0)
- MCFG_HP80_IO_IRL_CB(WRITE8(*this, hp85_state , irl_w))
- MCFG_HP80_IO_HALT_CB(WRITE8(*this, hp85_state , halt_w))
- MCFG_HP80_IO_SLOT_ADD("slot2" , 1)
- MCFG_HP80_IO_IRL_CB(WRITE8(*this, hp85_state , irl_w))
- MCFG_HP80_IO_HALT_CB(WRITE8(*this, hp85_state , halt_w))
- MCFG_HP80_IO_SLOT_ADD("slot3" , 2)
- MCFG_HP80_IO_IRL_CB(WRITE8(*this, hp85_state , irl_w))
- MCFG_HP80_IO_HALT_CB(WRITE8(*this, hp85_state , halt_w))
- MCFG_HP80_IO_SLOT_ADD("slot4" , 3)
- MCFG_HP80_IO_IRL_CB(WRITE8(*this, hp85_state , irl_w))
- MCFG_HP80_IO_HALT_CB(WRITE8(*this, hp85_state , halt_w))
+ HP80_IO_SLOT(config, m_io_slots[0]).set_slot_no(0);
+ m_io_slots[0]->irl_cb().set(FUNC(hp85_state::irl_w));
+ m_io_slots[0]->halt_cb().set(FUNC(hp85_state::halt_w));
+ HP80_IO_SLOT(config, m_io_slots[1]).set_slot_no(1);
+ m_io_slots[1]->irl_cb().set(FUNC(hp85_state::irl_w));
+ m_io_slots[1]->halt_cb().set(FUNC(hp85_state::halt_w));
+ HP80_IO_SLOT(config, m_io_slots[2]).set_slot_no(2);
+ m_io_slots[2]->irl_cb().set(FUNC(hp85_state::irl_w));
+ m_io_slots[2]->halt_cb().set(FUNC(hp85_state::halt_w));
+ HP80_IO_SLOT(config, m_io_slots[3]).set_slot_no(3);
+ m_io_slots[3]->irl_cb().set(FUNC(hp85_state::irl_w));
+ m_io_slots[3]->halt_cb().set(FUNC(hp85_state::halt_w));
// Printer output
- MCFG_DEVICE_ADD("prt_graphic", BITBANGER, 0)
- MCFG_DEVICE_ADD("prt_alpha", BITBANGER, 0)
+ BITBANGER(config, m_prt_graph_out, 0);
+ BITBANGER(config, m_prt_alpha_out, 0);
- MCFG_SOFTWARE_LIST_ADD("optrom_list" , "hp85_rom")
-MACHINE_CONFIG_END
+ SOFTWARE_LIST(config, "optrom_list").set_original("hp85_rom");
+}
ROM_START(hp85)
ROM_REGION(0x6000 , "cpu" , 0)
diff --git a/src/mame/drivers/hp95lx.cpp b/src/mame/drivers/hp95lx.cpp
index ce39999461c..701f8b9c63d 100644
--- a/src/mame/drivers/hp95lx.cpp
+++ b/src/mame/drivers/hp95lx.cpp
@@ -709,11 +709,12 @@ void hp95lx_state::hp95lx_io(address_map &map)
}
-MACHINE_CONFIG_START(hp95lx_state::hp95lx)
- MCFG_DEVICE_ADD("maincpu", V20, XTAL(5'370'000))
- MCFG_DEVICE_PROGRAM_MAP(hp95lx_map)
- MCFG_DEVICE_IO_MAP(hp95lx_io)
- MCFG_DEVICE_IRQ_ACKNOWLEDGE_DEVICE("pic8259", pic8259_device, inta_cb)
+void hp95lx_state::hp95lx(machine_config &config)
+{
+ V20(config, m_maincpu, XTAL(5'370'000));
+ m_maincpu->set_addrmap(AS_PROGRAM, &hp95lx_state::hp95lx_map);
+ m_maincpu->set_addrmap(AS_IO, &hp95lx_state::hp95lx_io);
+ m_maincpu->set_irq_acknowledge_callback("pic8259", FUNC(pic8259_device::inta_cb));
ADDRESS_MAP_BANK(config, "bankdev_c000").set_map(&hp95lx_state::hp95lx_romdos).set_options(ENDIANNESS_LITTLE, 8, 32, 0x10000);
ADDRESS_MAP_BANK(config, "bankdev_d000").set_map(&hp95lx_state::hp95lx_romdos).set_options(ENDIANNESS_LITTLE, 8, 32, 0x10000);
@@ -732,29 +733,30 @@ MACHINE_CONFIG_START(hp95lx_state::hp95lx)
m_pic8259->out_int_callback().set_inputline(m_maincpu, 0);
ISA8(config, m_isabus, 0);
- m_isabus->set_cputag("maincpu");
+ m_isabus->set_memspace("maincpu", AS_PROGRAM);
+ m_isabus->set_iospace("maincpu", AS_IO);
- MCFG_DEVICE_ADD("board0", ISA8_SLOT, 0, "isa", pc_isa8_cards, "com", true)
+ ISA8_SLOT(config, "board0", 0, "isa", pc_isa8_cards, "com", true);
- MCFG_DEVICE_ADD(KBDC_TAG, PC_KBDC, 0)
- MCFG_PC_KBDC_OUT_CLOCK_CB(WRITELINE(*this, hp95lx_state, keyboard_clock_w))
- MCFG_PC_KBDC_OUT_DATA_CB(WRITELINE(*this, hp95lx_state, keyboard_data_w))
- MCFG_PC_KBDC_SLOT_ADD(KBDC_TAG, "kbd", pc_xt_keyboards, STR_KBD_KEYTRONIC_PC3270)
+ pc_kbdc_device &pc_kbdc(PC_KBDC(config, KBDC_TAG, 0));
+ pc_kbdc.out_clock_cb().set(FUNC(hp95lx_state::keyboard_clock_w));
+ pc_kbdc.out_data_cb().set(FUNC(hp95lx_state::keyboard_data_w));
+ PC_KBDC_SLOT(config, "kbd", pc_xt_keyboards, STR_KBD_KEYTRONIC_PC3270).set_pc_kbdc_slot(&pc_kbdc);
NVRAM(config, "nvram2", nvram_device::DEFAULT_ALL_0); // RAM
NVRAM(config, "nvram3", nvram_device::DEFAULT_ALL_0); // card slot
// XXX When the AC adapter is plugged in, the LCD refresh rate is 73.14 Hz.
// XXX When the AC adapter is not plugged in (ie, running off of batteries) the refresh rate is 56.8 Hz.
- MCFG_SCREEN_ADD_MONOCHROME("screen", LCD, rgb_t::white())
- MCFG_SCREEN_UPDATE_DRIVER(hp95lx_state, screen_update)
- MCFG_SCREEN_RAW_PARAMS(XTAL(5'370'000) / 2, 300, 0, 240, 180, 0, 128)
- MCFG_SCREEN_PALETTE("palette")
+ SCREEN(config, m_screen, SCREEN_TYPE_LCD, rgb_t::white());
+ m_screen->set_screen_update(FUNC(hp95lx_state::screen_update));
+ m_screen->set_raw(XTAL(5'370'000) / 2, 300, 0, 240, 180, 0, 128);
+ m_screen->set_palette("palette");
PALETTE(config, "palette", FUNC(hp95lx_state::hp95lx_palette), 2);
RAM(config, RAM_TAG).set_default_size("512K");
-MACHINE_CONFIG_END
+}
ROM_START( hp95lx )
diff --git a/src/mame/drivers/hp9825.cpp b/src/mame/drivers/hp9825.cpp
index 063387c8426..39c92bbe7cc 100644
--- a/src/mame/drivers/hp9825.cpp
+++ b/src/mame/drivers/hp9825.cpp
@@ -8,8 +8,8 @@
// **** Temporary header, will hopefully evolve into proper doc ****
//
// What's in:
-// - Emulation of 9825B system
-// - 12 kw of RAMs
+// - Emulation of 9825B and 9825T systems
+// - 12 kw (9825B) or 31kw (9825T) of RAM
// - 12 kw of system ROM
// - Keyboard (SHIFT LOCK & RESET not implemented)
// - Display & run light
@@ -17,12 +17,23 @@
// - Printer
// - Beeper
// - Internal expansion ROMs
+// - I/O expansion slots: 98032, 98034 & 98035 modules can be connected
+// - For 9825T: the so-called SKOAL mechanism that transparently overlays RAM & ROM
+// in the same address space
// What's not yet in:
// - External expansion ROMs
// - Configurable RAM size
-// - I/O expansion slots: 98034 & 98035 modules from hp9845 emulation can be used here, too
//
-// 9825A & 9825T can also be emulated. At the moment I haven't all the necessary
+// Thanks to Dyke Shaffer for publishing (on https://groups.io/g/VintHPcom)
+// the source code of 98217 mass memory ROM. The 98217.bin image was reconstructed
+// by re-assembling the source code (this is the reason why it's marked as
+// a BAD_DUMP). And thanks to Ansgar Kueckes for adapting his assembler to
+// handle HP9825 source files.
+// For what regards the 9825T, I'd like to thank again Dyke Shaffer for
+// publishing a lot of internal HP docs about the SKOAL card. I recovered the
+// content of SKOAL ROM from its printed & scanned dump.
+//
+// 9825A can also be emulated. At the moment I haven't all the necessary
// ROM dumps, though.
#include "emu.h"
@@ -36,6 +47,10 @@
#include "sound/beep.h"
#include "hp9825.lh"
+// Debugging
+#define VERBOSE 0
+#include "logmacro.h"
+
// CPU clock (generated by a trimmered RC oscillator)
constexpr unsigned MAIN_CLOCK = 6000000;
@@ -75,6 +90,9 @@ namespace {
}
}
+// +--------------+
+// | hp9825_state |
+// +--------------+
class hp9825_state : public driver_device
{
public:
@@ -97,15 +115,16 @@ public:
{
}
- void hp9825b(machine_config &config);
+ void hp9825_base(machine_config &config);
protected:
virtual void machine_start() override;
virtual void device_reset() override;
virtual void machine_reset() override;
-private:
required_device<hp_09825_67907_cpu_device> m_cpu;
+
+private:
required_device<hp98x5_io_sys_device> m_io_sys;
required_device<timer_device> m_cursor_timer;
required_device<hp9825_tape_device> m_tape;
@@ -138,7 +157,6 @@ private:
int m_slot_sc[ 3 ];
void cpu_io_map(address_map &map);
- void cpu_mem_map(address_map &map);
DECLARE_READ16_MEMBER(kb_scancode_r);
DECLARE_WRITE16_MEMBER(disp_w);
@@ -222,15 +240,6 @@ void hp9825_state::cpu_io_map(address_map &map)
// TODO:
}
-void hp9825_state::cpu_mem_map(address_map &map)
-{
- map.unmap_value_low();
- map(0x0000 , 0x2fff).rom();
- map(0x3400 , 0x3bff).rom();
- map(0x4000 , 0x4fff).rom();
- map(0x5000 , 0x7fff).ram();
-}
-
READ16_MEMBER(hp9825_state::kb_scancode_r)
{
uint8_t res = m_scancode;
@@ -613,18 +622,18 @@ void hp9825_state::set_dmar_slot(unsigned slot , int state)
m_io_sys->set_dmar(uint8_t(sc) , state);
}
-MACHINE_CONFIG_START(hp9825_state::hp9825b)
+void hp9825_state::hp9825_base(machine_config &config)
+{
HP_09825_67907(config , m_cpu , MAIN_CLOCK);
// Just guessing... settings borrowed from hp9845
m_cpu->set_rw_cycles(6 , 6);
m_cpu->set_relative_mode(false);
- m_cpu->set_addrmap(AS_PROGRAM , &hp9825_state::cpu_mem_map);
m_cpu->set_addrmap(AS_IO , &hp9825_state::cpu_io_map);
m_cpu->set_irq_acknowledge_callback("io_sys" , FUNC(hp98x5_io_sys_device::irq_callback));
m_cpu->pa_changed_cb().set(m_io_sys , FUNC(hp98x5_io_sys_device::pa_w));
// Needed when 98035 RTC module is connected or time advances at about 1/4 the correct speed (NP misses a lot of 1kHz interrupts)
- MCFG_QUANTUM_TIME(attotime::from_hz(5000));
+ config.m_minimum_quantum = attotime::from_hz(5000);
HP98X5_IO_SYS(config , m_io_sys , 0);
m_io_sys->irl().set_inputline(m_cpu, HPHYBRID_IRL);
@@ -665,7 +674,7 @@ MACHINE_CONFIG_START(hp9825_state::hp9825b)
}
config.set_default_layout(layout_hp9825);
-MACHINE_CONFIG_END
+}
#define IOP_MASK(x) BIT_MASK<ioport_value>((x))
@@ -819,17 +828,283 @@ static INPUT_PORTS_START(hp9825)
PORT_BIT(IOP_MASK(0) , IP_ACTIVE_HIGH , IPT_KEYBOARD) PORT_CODE(KEYCODE_LSHIFT) PORT_CHAR(UCHAR_SHIFT_1) // Shift
INPUT_PORTS_END
+// +---------------+
+// | hp9825b_state |
+// +---------------+
+class hp9825b_state : public hp9825_state
+{
+public:
+ hp9825b_state(const machine_config &mconfig, device_type type, const char *tag)
+ : hp9825_state(mconfig , type , tag)
+ {
+ }
+
+ void hp9825b(machine_config &config);
+
+private:
+ void cpu_mem_map(address_map &map);
+};
+
+void hp9825b_state::hp9825b(machine_config &config)
+{
+ hp9825_base(config);
+ m_cpu->set_addrmap(AS_PROGRAM , &hp9825b_state::cpu_mem_map);
+}
+
+void hp9825b_state::cpu_mem_map(address_map &map)
+{
+ map.unmap_value_low();
+ map(0x0000 , 0x3bff).rom();
+ map(0x4000 , 0x4fff).rom();
+ map(0x5000 , 0x7fff).ram();
+}
+
+// +---------------+
+// | hp9825t_state |
+// +---------------+
+class hp9825t_state : public hp9825_state
+{
+public:
+ hp9825t_state(const machine_config &mconfig, device_type type, const char *tag)
+ : hp9825_state(mconfig , type , tag)
+ , m_rom_region(*this , "rom")
+ , m_skoalrom(*this , "skoalrom")
+ {
+ }
+
+ void hp9825t(machine_config &config);
+
+protected:
+ virtual void machine_start() override;
+ virtual void device_reset() override;
+
+private:
+ required_memory_region m_rom_region;
+ required_memory_region m_skoalrom;
+ std::unique_ptr<uint16_t[]> m_ram;
+
+ uint8_t m_cycle_type;
+
+ // SKOAL state
+ bool m_skoalbit; // U53
+ bool m_second_access; // U57-3
+ bool m_mref; // U57-4
+ bool m_ifetch_4400; // U57-5
+ uint8_t m_special_opt; // U42
+ uint16_t m_fetch_addr;
+
+ void cpu_mem_map(address_map &map);
+ DECLARE_READ16_MEMBER(cpu_mem_r);
+ DECLARE_WRITE16_MEMBER(cpu_mem_w);
+ void stm(uint8_t cycle_type);
+ void on_cycle_end();
+ void opcode_fetch(uint16_t opcode);
+ uint8_t get_skoalrom(uint16_t addr);
+ bool is_rom(uint16_t addr , uint8_t cycle_type) const;
+};
+
+void hp9825t_state::hp9825t(machine_config &config)
+{
+ hp9825_base(config);
+ m_cpu->set_addrmap(AS_PROGRAM , &hp9825t_state::cpu_mem_map);
+ m_cpu->stm_cb().set(FUNC(hp9825t_state::stm));
+ m_cpu->opcode_cb().set(FUNC(hp9825t_state::opcode_fetch));
+}
+
+void hp9825t_state::machine_start()
+{
+ hp9825_state::machine_start();
+
+ // 32kw of RAM (the 1st kw is not accessible in normal operation)
+ m_ram = std::make_unique<uint16_t[]>(32768);
+ save_pointer(NAME(m_ram) , 32768);
+}
+
+void hp9825t_state::device_reset()
+{
+ hp9825_state::device_reset();
+
+ // This has to be done before CPU reset or first instruction won't be fetched correctly
+ m_cycle_type = 0;
+ m_special_opt = 0xf;
+}
+
+void hp9825t_state::cpu_mem_map(address_map &map)
+{
+ map.unmap_value_low();
+ map(0x0000 , 0x7fff).rw(FUNC(hp9825t_state::cpu_mem_r) , FUNC(hp9825t_state::cpu_mem_w));
+}
+
+READ16_MEMBER(hp9825t_state::cpu_mem_r)
+{
+ bool from_rom;
+
+ if (m_cycle_type & hp_hybrid_cpu_device::CYCLE_RD_MASK) {
+ if (m_cycle_type & hp_hybrid_cpu_device::CYCLE_IFETCH_MASK) {
+ m_fetch_addr = offset;
+ }
+ from_rom = is_rom(offset , m_cycle_type);
+ LOG("rd @%04x CYC=%x %d%d%d%d ROM=%d\n" , offset , m_cycle_type , m_skoalbit , m_second_access , m_mref , m_ifetch_4400 , from_rom);
+ if (!(m_cycle_type & (hp_hybrid_cpu_device::CYCLE_IFETCH_MASK | hp_hybrid_cpu_device::CYCLE_DMA_MASK))) {
+ on_cycle_end();
+ }
+ m_cycle_type = 0;
+ // TODO: diagnostic read
+ } else {
+ // Read coming from debugger and not from CPU: fake an ifetch
+ from_rom = is_rom(offset , hp_hybrid_cpu_device::CYCLE_IFETCH_MASK);
+ }
+
+ return from_rom ? m_rom_region->as_u16(offset) : m_ram[ offset ];
+}
+
+WRITE16_MEMBER(hp9825t_state::cpu_mem_w)
+{
+ if (m_cycle_type & hp_hybrid_cpu_device::CYCLE_WR_MASK) {
+ if (!(m_cycle_type & hp_hybrid_cpu_device::CYCLE_DMA_MASK)) {
+ on_cycle_end();
+ }
+ m_cycle_type = 0;
+ }
+ // All write cycles go to RAM
+ m_ram[ offset ] = (m_ram[ offset ] & ~mem_mask) | (data & mem_mask);
+}
+
+void hp9825t_state::stm(uint8_t cycle_type)
+{
+ LOG("stm %x\n" , cycle_type);
+ m_cycle_type = cycle_type;
+ if (m_cycle_type & hp_hybrid_cpu_device::CYCLE_IFETCH_MASK) {
+ m_second_access = false;
+ m_mref = false;
+ m_ifetch_4400 = false;
+ // In case of ifetch from register area this is kept at 0 (because cpu_mem_r is not called)
+ // In case of ifetch from RAM/ROM this is set by cpu_mem_r to the fetch address
+ m_fetch_addr = 0;
+ } else if (m_cycle_type & hp_hybrid_cpu_device::CYCLE_RAL_MASK) {
+ if (!(m_cycle_type & hp_hybrid_cpu_device::CYCLE_DMA_MASK)) {
+ on_cycle_end();
+ }
+ m_cycle_type = 0;
+ }
+}
+
+void hp9825t_state::on_cycle_end()
+{
+ m_second_access = false;
+}
+
+void hp9825t_state::opcode_fetch(uint16_t opcode)
+{
+ LOG("oc %04x\n" , opcode);
+ m_cycle_type = 0;
+ // memory referencing instructions
+ m_mref = (opcode & 0x7000) != 0x7000;
+ m_second_access = true;
+ m_ifetch_4400 = (m_fetch_addr & 0x7f00) == 0x0900;
+ if (BIT(m_special_opt , 3) && BIT(m_special_opt , 2)) {
+ // Set SKOAL bit
+ if (m_fetch_addr < 0x20) {
+ // Fetch from registers -> SKOAL bit = 0
+ m_skoalbit = false;
+ } else if ((m_fetch_addr & 0x6000) == 0x6000) {
+ // Fetch in [6000..7fff] range -> SKOAL bit = 0
+ m_skoalbit = false;
+ } else {
+ uint8_t tmp = get_skoalrom(m_fetch_addr);
+ m_skoalbit = (tmp >> ((~m_fetch_addr >> 12) & 7)) & 1;
+ }
+ }
+ // Decode SKOAL instructions. They are ignored by the hybrid processor
+ // as they are not recognized.
+ if ((opcode & 0xffc0) == 0x7040) {
+ m_special_opt = opcode & 0xf;
+ if (!BIT(m_special_opt , 3)) {
+ // RAM/ == 0
+ m_skoalbit = false;
+ } else if (!BIT(m_special_opt , 2)) {
+ // ROM/ == 0
+ m_skoalbit = true;
+ }
+ }
+}
+
+uint8_t hp9825t_state::get_skoalrom(uint16_t addr)
+{
+ return m_skoalrom->as_u8(~addr & 0x0fff);
+}
+
+bool hp9825t_state::is_rom(uint16_t addr , uint8_t cycle_type) const
+{
+ if ((addr & 0x6000) == 0x6000) {
+ // [6000..7fff] -> always RAM
+ return false;
+ } else if ((cycle_type & hp_hybrid_cpu_device::CYCLE_DMA_MASK) != 0 ||
+ !BIT(m_special_opt , 1)) {
+ // DMA cycle or BIT/ == 0 -> RAM
+ return false;
+ } else if (addr >= 0x400 && !BIT(m_special_opt , 0)) {
+ // [0400..5fff] and BIN/ == 0 -> RAM
+ return false;
+ } else {
+ bool addr_0800_7fff = (addr & 0x7800) != 0;
+ bool addr_0400_07ff = !addr_0800_7fff && BIT(addr , 10);
+ bool addr_0000_03ff = !addr_0800_7fff && !BIT(addr , 10);
+
+ // U58-6
+ bool force_rom;
+
+ // ROM when one or more of these is true:
+ // - addr in [0000..03ff]
+ // - Ifetch cycle and addr in [0800..5fff]
+ // - 2nd access of a memory-referencing instruction not in [0400..07ff] range
+ // - skoalbit = 1 and instruction fetched in [0900..09ff] range
+ force_rom =
+ addr_0000_03ff ||
+ ((cycle_type & hp_hybrid_cpu_device::CYCLE_IFETCH_MASK) != 0 && addr_0800_7fff) ||
+ (m_second_access && m_mref && (!BIT(m_special_opt , 2) || !addr_0400_07ff)) ||
+ (m_skoalbit && m_ifetch_4400);
+
+ if (force_rom) {
+ return true;
+ } else if (addr_0400_07ff && BIT(m_special_opt , 2)) {
+ return false;
+ } else {
+ return m_skoalbit;
+ }
+ }
+}
+
ROM_START(hp9825b)
ROM_REGION(0xa000 , "cpu" , ROMREGION_16BIT | ROMREGION_BE)
ROM_LOAD("sysrom1.bin" , 0x0000 , 0x2000 , CRC(fe429268) SHA1(f2fe7c5abca92bd13f81b4385fc4fce0cafb0da0))
ROM_LOAD("sysrom2.bin" , 0x2000 , 0x2000 , CRC(96093b5d) SHA1(c6ec4cafd019887df0fa849b3c7070bb74faee54))
ROM_LOAD("sysrom3.bin" , 0x4000 , 0x2000 , CRC(f9470f67) SHA1(b80cb4a366d93bd7acc3508ce987bb11c5986b2a))
+ ROM_LOAD("98217.bin" , 0x6000 , 0x0800 , BAD_DUMP CRC(ea1fcf63) SHA1(e535c82897210a1c67c1ca16f44f936d4c470463))
+ ROM_LOAD("genio_t.bin" , 0x6800 , 0x0800 , CRC(ade1d1ed) SHA1(9af74a65b29ef1885f74164238ecf8d16ac995d6))
+ ROM_LOAD("plot72.bin" , 0x7000 , 0x0800 , CRC(0a9cb8db) SHA1(d0d126fca108f2715e1e408cb31b09ba69385ac4))
+ ROM_LOAD("advpgm_t.bin", 0x8000 , 0x0800 , CRC(965b5e5a) SHA1(ff44dd15f8fa4ca03dfd970ed8b200e8a071ec13))
+ ROM_LOAD("extio_t.bin" , 0x8800 , 0x1000 , CRC(a708b978) SHA1(baf53c8a2b24d059f95252baf1452188eaf6e4be))
+ ROM_LOAD("strings_t.bin",0x9800 , 0x0800 , CRC(b5ca5da5) SHA1(af13abb3c15836c566863c656e1659f7e6f96d04))
+ROM_END
+
+ROM_START(hp9825t)
+ ROM_REGION(0xc000 , "rom" , ROMREGION_16BIT | ROMREGION_BE | ROMREGION_ERASE | ROMREGION_ERASE00)
+ ROM_LOAD("sysrom1.bin" , 0x0000 , 0x2000 , CRC(fe429268) SHA1(f2fe7c5abca92bd13f81b4385fc4fce0cafb0da0))
+ ROM_LOAD("sysrom2.bin" , 0x2000 , 0x2000 , CRC(96093b5d) SHA1(c6ec4cafd019887df0fa849b3c7070bb74faee54))
+ ROM_LOAD("sysrom3.bin" , 0x4000 , 0x2000 , CRC(f9470f67) SHA1(b80cb4a366d93bd7acc3508ce987bb11c5986b2a))
+ ROM_LOAD("98217.bin" , 0x6000 , 0x0800 , BAD_DUMP CRC(ea1fcf63) SHA1(e535c82897210a1c67c1ca16f44f936d4c470463))
ROM_LOAD("genio_t.bin" , 0x6800 , 0x0800 , CRC(ade1d1ed) SHA1(9af74a65b29ef1885f74164238ecf8d16ac995d6))
ROM_LOAD("plot72.bin" , 0x7000 , 0x0800 , CRC(0a9cb8db) SHA1(d0d126fca108f2715e1e408cb31b09ba69385ac4))
ROM_LOAD("advpgm_t.bin", 0x8000 , 0x0800 , CRC(965b5e5a) SHA1(ff44dd15f8fa4ca03dfd970ed8b200e8a071ec13))
ROM_LOAD("extio_t.bin" , 0x8800 , 0x1000 , CRC(a708b978) SHA1(baf53c8a2b24d059f95252baf1452188eaf6e4be))
ROM_LOAD("strings_t.bin",0x9800 , 0x0800 , CRC(b5ca5da5) SHA1(af13abb3c15836c566863c656e1659f7e6f96d04))
+ ROM_LOAD("syspgm.bin" , 0xa000 , 0x0800 , CRC(8915588f) SHA1(037f497b5ecc3216fb6b8356767cc361fb0b2945))
+
+ ROM_REGION(0x1000 , "skoalrom" , 0)
+ ROM_LOAD("skoalrom.bin" , 0 , 0x1000 , CRC(5e8124d5) SHA1(dedf7f8a10c62b444f04213956083089e97bf219))
ROM_END
// YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS
-COMP(1980, hp9825b, 0, 0, hp9825b, hp9825, hp9825_state, empty_init, "Hewlett-Packard", "HP 9825B", 0)
+COMP(1980, hp9825b, 0, 0, hp9825b, hp9825, hp9825b_state,empty_init, "Hewlett-Packard", "HP 9825B", 0)
+COMP(1980, hp9825t, 0, 0, hp9825t, hp9825, hp9825t_state,empty_init, "Hewlett-Packard", "HP 9825T", 0)
diff --git a/src/mame/drivers/hp9845.cpp b/src/mame/drivers/hp9845.cpp
index 283ff3e6c90..d4f64f10393 100644
--- a/src/mame/drivers/hp9845.cpp
+++ b/src/mame/drivers/hp9845.cpp
@@ -3532,35 +3532,37 @@ const uint8_t hp9845t_state::m_back_arrow_shape[] = {
0xf8, 0xf0, 0xe0, 0xc0, 0x80, 0x00, 0x00
};
-MACHINE_CONFIG_START(hp9845_state::hp9845a)
- //MCFG_DEVICE_ADD("lpu", HP_5061_3010, XTAL(11'400'000))
- //MCFG_DEVICE_ADD("ppu", HP_5061_3011, XTAL(11'400'000))
+void hp9845_state::hp9845a(machine_config &config)
+{
+ //HP_5061_3010(config, m_lpu, XTAL(11'400'000));
+ //HP_5061_3011(config, m_ppu, XTAL(11'400'000));
// video hardware
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_UPDATE_DRIVER(hp9845_state, screen_update)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500))
- MCFG_SCREEN_SIZE(560, 455)
- MCFG_SCREEN_VISIBLE_AREA(0, 560-1, 0, 455-1)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_screen_update(FUNC(hp9845_state::screen_update));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500));
+ screen.set_size(560, 455);
+ screen.set_visarea(0, 560-1, 0, 455-1);
- MCFG_SOFTWARE_LIST_ADD("optrom_list", "hp9845a_rom")
-MACHINE_CONFIG_END
+ SOFTWARE_LIST(config, "optrom_list").set_original("hp9845a_rom");
+}
-MACHINE_CONFIG_START(hp9845_state::hp9835a)
- //MCFG_DEVICE_ADD("lpu", HP_5061_3001, XTAL(11'400'000))
- //MCFG_DEVICE_ADD("ppu", HP_5061_3001, XTAL(11'400'000))
+void hp9845_state::hp9835a(machine_config &config)
+{
+ //HP_5061_3001(config, m_lpu, XTAL(11'400'000));
+ //HP_5061_301(1config, m_ppu, XTAL(11'400'000));
// video hardware
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_UPDATE_DRIVER(hp9845_state, screen_update)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500))
- MCFG_SCREEN_SIZE(560, 455)
- MCFG_SCREEN_VISIBLE_AREA(0, 560-1, 0, 455-1)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_screen_update(FUNC(hp9845_state::screen_update));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500));
+ screen.set_size(560, 455);
+ screen.set_visarea(0, 560-1, 0, 455-1);
- MCFG_SOFTWARE_LIST_ADD("optrom_list", "hp9835a_rom")
-MACHINE_CONFIG_END
+ SOFTWARE_LIST(config, "optrom_list").set_original("hp9835a_rom");
+}
/*
Global memory map in blocks of 32 kwords / 64 kbytes each:
@@ -3623,7 +3625,8 @@ void hp9845_base_state::ppu_io_map(address_map &map)
map(HP_MAKE_IOADDR(T15_PA, 0), HP_MAKE_IOADDR(T15_PA, 3)).rw(m_t15, FUNC(hp_taco_device::reg_r), FUNC(hp_taco_device::reg_w));
}
-MACHINE_CONFIG_START(hp9845_base_state::hp9845_base)
+void hp9845_base_state::hp9845_base(machine_config &config)
+{
HP_5061_3001(config , m_lpu , 5700000);
m_lpu->set_addrmap(AS_PROGRAM , &hp9845_base_state::global_mem_map);
m_lpu->set_9845_boot_mode(true);
@@ -3646,19 +3649,18 @@ MACHINE_CONFIG_START(hp9845_base_state::hp9845_base)
m_io_sys->dmar().set(m_ppu , FUNC(hp_5061_3001_cpu_device::dmar_w));
// video hardware
- MCFG_SCREEN_ADD("screen", RASTER)
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
- MCFG_TIMER_DRIVER_ADD("gv_timer", hp9845_base_state, gv_timer)
+ TIMER(config, m_gv_timer).configure_generic(FUNC(hp9845_base_state::gv_timer));
// Actual keyboard refresh rate should be KEY_SCAN_OSCILLATOR / 128 (2560 Hz)
- MCFG_TIMER_DRIVER_ADD_PERIODIC("kb_timer" , hp9845_base_state , kb_scan , attotime::from_hz(100))
+ TIMER(config, "kb_timer").configure_periodic(FUNC(hp9845_base_state::kb_scan), attotime::from_hz(100));
// Beeper
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("beeper" , BEEP , KEY_SCAN_OSCILLATOR / 512)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS , "mono" , 0.50)
+ BEEP(config, m_beeper , KEY_SCAN_OSCILLATOR / 512).add_route(ALL_OUTPUTS , "mono" , 0.50);
- MCFG_TIMER_DRIVER_ADD("beep_timer" , hp9845_base_state , beeper_off);
+ TIMER(config, m_beep_timer).configure_generic(FUNC(hp9845_base_state::beeper_off));
// Tape drives
HP_TACO(config , m_t15 , 4000000);
@@ -3674,22 +3676,14 @@ MACHINE_CONFIG_START(hp9845_base_state::hp9845_base)
// right-hand side and left-hand side drawers, respectively.
// Here we do away with the distinction between LPU & PPU ROMs: in the end they
// are visible to both CPUs at the same addresses.
- MCFG_DEVICE_ADD("drawer1", HP_OPTROM_SLOT, 0)
- MCFG_DEVICE_SLOT_INTERFACE(hp_optrom_slot_devices, NULL, false)
- MCFG_DEVICE_ADD("drawer2", HP_OPTROM_SLOT, 0)
- MCFG_DEVICE_SLOT_INTERFACE(hp_optrom_slot_devices, NULL, false)
- MCFG_DEVICE_ADD("drawer3", HP_OPTROM_SLOT, 0)
- MCFG_DEVICE_SLOT_INTERFACE(hp_optrom_slot_devices, NULL, false)
- MCFG_DEVICE_ADD("drawer4", HP_OPTROM_SLOT, 0)
- MCFG_DEVICE_SLOT_INTERFACE(hp_optrom_slot_devices, NULL, false)
- MCFG_DEVICE_ADD("drawer5", HP_OPTROM_SLOT, 0)
- MCFG_DEVICE_SLOT_INTERFACE(hp_optrom_slot_devices, NULL, false)
- MCFG_DEVICE_ADD("drawer6", HP_OPTROM_SLOT, 0)
- MCFG_DEVICE_SLOT_INTERFACE(hp_optrom_slot_devices, NULL, false)
- MCFG_DEVICE_ADD("drawer7", HP_OPTROM_SLOT, 0)
- MCFG_DEVICE_SLOT_INTERFACE(hp_optrom_slot_devices, NULL, false)
- MCFG_DEVICE_ADD("drawer8", HP_OPTROM_SLOT, 0)
- MCFG_DEVICE_SLOT_INTERFACE(hp_optrom_slot_devices, NULL, false)
+ HP_OPTROM_SLOT(config, "drawer1", 0);
+ HP_OPTROM_SLOT(config, "drawer2", 0);
+ HP_OPTROM_SLOT(config, "drawer3", 0);
+ HP_OPTROM_SLOT(config, "drawer4", 0);
+ HP_OPTROM_SLOT(config, "drawer5", 0);
+ HP_OPTROM_SLOT(config, "drawer6", 0);
+ HP_OPTROM_SLOT(config, "drawer7", 0);
+ HP_OPTROM_SLOT(config, "drawer8", 0);
// I/O slots
for (unsigned slot = 0; slot < 4; slot++) {
@@ -3709,54 +3703,51 @@ MACHINE_CONFIG_START(hp9845_base_state::hp9845_base)
prt.irq().set(FUNC(hp9845_base_state::prt_irl_w));
prt.flg().set([this](int state) { m_io_sys->set_flg(PRINTER_PA , state); });
prt.sts().set([this](int state) { m_io_sys->set_sts(PRINTER_PA , state); });
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(hp9845b_state::hp9845b)
+void hp9845b_state::hp9845b(machine_config &config)
+{
hp9845_base(config);
// video hardware
- MCFG_SCREEN_MODIFY("screen")
- MCFG_SCREEN_UPDATE_DRIVER(hp9845b_state, screen_update)
- MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE(*this, hp9845b_state, vblank_w))
- MCFG_SCREEN_COLOR(rgb_t::green())
+ m_screen->set_screen_update(FUNC(hp9845b_state::screen_update));
+ m_screen->screen_vblank().set(FUNC(hp9845b_state::vblank_w));
+ m_screen->set_color(rgb_t::green());
// These parameters are for alpha video
- MCFG_SCREEN_RAW_PARAMS(VIDEO_PIXEL_CLOCK , VIDEO_HTOTAL , 0 , VIDEO_HBSTART , VIDEO_VTOTAL , 0 , VIDEO_ACTIVE_SCANLINES)
- MCFG_PALETTE_ADD("palette", 4)
- MCFG_TIMER_DRIVER_ADD_SCANLINE("scantimer", hp9845b_state, scanline_timer, "screen", 0, 1)
+ m_screen->set_raw(VIDEO_PIXEL_CLOCK , VIDEO_HTOTAL , 0 , VIDEO_HBSTART , VIDEO_VTOTAL , 0 , VIDEO_ACTIVE_SCANLINES);
+ PALETTE(config, m_palette).set_entries(4);
+ TIMER(config, "scantimer").configure_scanline(FUNC(hp9845b_state::scanline_timer), "screen", 0, 1);
config.set_default_layout(layout_hp9845b);
- MCFG_SOFTWARE_LIST_ADD("optrom_list", "hp9845b_rom")
-
-MACHINE_CONFIG_END
+ SOFTWARE_LIST(config, "optrom_list").set_original("hp9845b_rom");
+}
-MACHINE_CONFIG_START(hp9845c_state::hp9845c)
+void hp9845c_state::hp9845c(machine_config &config)
+{
hp9845_base(config);
// video hardware
- MCFG_SCREEN_MODIFY("screen")
- MCFG_SCREEN_UPDATE_DRIVER(hp9845c_state, screen_update)
- MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE(*this, hp9845c_state, vblank_w))
- MCFG_SCREEN_RAW_PARAMS(VIDEO_770_PIXEL_CLOCK , VIDEO_770_HTOTAL , VIDEO_770_HBEND , VIDEO_770_HBSTART , VIDEO_770_VTOTAL , VIDEO_770_VBEND , VIDEO_770_VBSTART)
- MCFG_PALETTE_ADD("palette", 24)
- MCFG_TIMER_DRIVER_ADD_SCANLINE("scantimer", hp9845c_state, scanline_timer, "screen", 0, 1)
+ m_screen->set_screen_update(FUNC(hp9845c_state::screen_update));
+ m_screen->screen_vblank().set(FUNC(hp9845c_state::vblank_w));
+ m_screen->set_raw(VIDEO_770_PIXEL_CLOCK , VIDEO_770_HTOTAL , VIDEO_770_HBEND , VIDEO_770_HBSTART , VIDEO_770_VTOTAL , VIDEO_770_VBEND , VIDEO_770_VBSTART);
+ PALETTE(config, m_palette).set_entries(24);
+ TIMER(config, "scantimer").configure_scanline(FUNC(hp9845c_state::scanline_timer), "screen", 0, 1);
- MCFG_SOFTWARE_LIST_ADD("optrom_list", "hp9845b_rom")
-
-MACHINE_CONFIG_END
+ SOFTWARE_LIST(config, "optrom_list").set_original("hp9845b_rom");
+}
-MACHINE_CONFIG_START(hp9845t_state::hp9845t)
+void hp9845t_state::hp9845t(machine_config &config)
+{
hp9845_base(config);
// video hardware
- MCFG_SCREEN_MODIFY("screen")
- MCFG_SCREEN_UPDATE_DRIVER(hp9845t_state, screen_update)
- MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE(*this, hp9845t_state, vblank_w))
- MCFG_SCREEN_COLOR(rgb_t::green())
- MCFG_SCREEN_RAW_PARAMS(VIDEO_780_PIXEL_CLOCK , VIDEO_780_HTOTAL , VIDEO_780_HBEND , VIDEO_780_HBSTART , VIDEO_780_VTOTAL , VIDEO_780_VBEND , VIDEO_780_VBSTART)
- MCFG_PALETTE_ADD("palette", 5)
- MCFG_TIMER_DRIVER_ADD_SCANLINE("scantimer", hp9845t_state, scanline_timer, "screen", 0, 1)
-
- MCFG_SOFTWARE_LIST_ADD("optrom_list", "hp9845b_rom")
+ m_screen->set_screen_update(FUNC(hp9845t_state::screen_update));
+ m_screen->screen_vblank().set(FUNC(hp9845t_state::vblank_w));
+ m_screen->set_color(rgb_t::green());
+ m_screen->set_raw(VIDEO_780_PIXEL_CLOCK , VIDEO_780_HTOTAL , VIDEO_780_HBEND , VIDEO_780_HBSTART , VIDEO_780_VTOTAL , VIDEO_780_VBEND , VIDEO_780_VBSTART);
+ PALETTE(config, m_palette).set_entries(5);
+ TIMER(config, "scantimer").configure_scanline(FUNC(hp9845t_state::scanline_timer), "screen", 0, 1);
-MACHINE_CONFIG_END
+ SOFTWARE_LIST(config, "optrom_list").set_original("hp9845b_rom");
+}
ROM_START( hp9845a )
ROM_REGION( 0200000, "lpu", ROMREGION_16BIT | ROMREGION_BE )
diff --git a/src/mame/drivers/hp9k.cpp b/src/mame/drivers/hp9k.cpp
index aaa24e2c14b..c10eed0913b 100644
--- a/src/mame/drivers/hp9k.cpp
+++ b/src/mame/drivers/hp9k.cpp
@@ -239,7 +239,7 @@ READ16_MEMBER( hp9k_state::hp9k_videoram_r )
if (offset==0x0001)
{
//printf("m6845 read at [%x] mem_mask [%x]\n",offset,mem_mask);
- return m_6845->register_r(space,0);
+ return m_6845->register_r();
}
else
{
@@ -262,13 +262,13 @@ WRITE16_MEMBER( hp9k_state::hp9k_videoram_w )
{
//printf("6845 address write [%x] at [%x] mask [%x]\n",data,offset,mem_mask);
data&=0x1f;
- m_6845->address_w( space, 0, data );
+ m_6845->address_w(data);
crtc_curreg=data;
}
else if (offset==0x0001)
{
//printf("6845 register write [%x] at [%x] mask [%x]\n",data,offset,mem_mask);
- m_6845->register_w( space, 0, data );
+ m_6845->register_w(data);
if (crtc_curreg==0x0c) crtc_addrStartHi=data;
if (crtc_curreg==0x0d) crtc_addrStartLow=data;
}
@@ -394,29 +394,30 @@ WRITE8_MEMBER( hp9k_state::kbd_put )
}
-MACHINE_CONFIG_START(hp9k_state::hp9k)
+void hp9k_state::hp9k(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu",M68000, XTAL(8'000'000))
- MCFG_DEVICE_PROGRAM_MAP(hp9k_mem)
+ M68000(config, m_maincpu, XTAL(8'000'000));
+ m_maincpu->set_addrmap(AS_PROGRAM, &hp9k_state::hp9k_mem);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(50)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(HP9816_ROWX*HP9816_CHDIMX, HP9816_ROWY*HP9816_CHDIMY)
- MCFG_SCREEN_VISIBLE_AREA(0, (HP9816_ROWX*HP9816_CHDIMX)-1, 0, (HP9816_ROWY*HP9816_CHDIMY)-1)
- MCFG_SCREEN_UPDATE_DRIVER(hp9k_state, screen_update)
- MCFG_SCREEN_PALETTE("palette")
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(50);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(HP9816_ROWX*HP9816_CHDIMX, HP9816_ROWY*HP9816_CHDIMY);
+ screen.set_visarea(0, (HP9816_ROWX*HP9816_CHDIMX)-1, 0, (HP9816_ROWY*HP9816_CHDIMY)-1);
+ screen.set_screen_update(FUNC(hp9k_state::screen_update));
+ screen.set_palette("palette");
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_hp9k)
+ GFXDECODE(config, m_gfxdecode, "palette", gfx_hp9k);
PALETTE(config, "palette", palette_device::MONOCHROME);
MC6845(config, m_6845, XTAL(16'000'000) / 16);
m_6845->set_screen("screen");
m_6845->set_show_border_area(false);
m_6845->set_char_width(8);
-MACHINE_CONFIG_END
+}
/* ROM definition */
ROM_START( hp9816 )
diff --git a/src/mame/drivers/hp9k_3xx.cpp b/src/mame/drivers/hp9k_3xx.cpp
index 056817f7e36..5a0d69e4311 100644
--- a/src/mame/drivers/hp9k_3xx.cpp
+++ b/src/mame/drivers/hp9k_3xx.cpp
@@ -258,7 +258,7 @@ WRITE16_MEMBER(hp9k3xx_state::led_w)
void hp9k3xx_state::add_dio16_bus(machine_config &config)
{
bus::hp_dio::dio16_device &dio16(DIO16(config, "diobus", 0));
- dio16.set_cputag(m_maincpu);
+ dio16.set_program_space(m_maincpu, AS_PROGRAM);
dio16.irq1_out_cb().set(FUNC(hp9k3xx_state::dio_irq1_w));
dio16.irq2_out_cb().set(FUNC(hp9k3xx_state::dio_irq2_w));
@@ -272,7 +272,7 @@ void hp9k3xx_state::add_dio16_bus(machine_config &config)
void hp9k3xx_state::add_dio32_bus(machine_config &config)
{
bus::hp_dio::dio32_device &dio32(DIO32(config, "diobus", 0));
- dio32.set_cputag(m_maincpu);
+ dio32.set_program_space(m_maincpu, AS_PROGRAM);
dio32.irq1_out_cb().set(FUNC(hp9k3xx_state::dio_irq1_w));
dio32.irq2_out_cb().set(FUNC(hp9k3xx_state::dio_irq2_w));
@@ -323,22 +323,23 @@ WRITE32_MEMBER(hp9k3xx_state::buserror_w)
set_bus_error(offset << 2, false, mem_mask);
}
-MACHINE_CONFIG_START(hp9k3xx_state::hp9k300)
+void hp9k3xx_state::hp9k300(machine_config &config)
+{
ptm6840_device &ptm(PTM6840(config, PTM6840_TAG, 250000)); // from oscillator module next to the 6840
ptm.set_external_clocks(250000.0f, 0.0f, 250000.0f);
ptm.o3_callback().set(PTM6840_TAG, FUNC(ptm6840_device::set_c2));
ptm.irq_callback().set_inputline("maincpu", M68K_IRQ_6);
- MCFG_SOFTWARE_LIST_ADD("flop_list", "hp9k3xx_flop")
+ SOFTWARE_LIST(config, "flop_list").set_original("hp9k3xx_flop");
config.set_default_layout(layout_hp9k_3xx);
-MACHINE_CONFIG_END
-
-MACHINE_CONFIG_START(hp9k3xx_state::hp9k310)
+}
+void hp9k3xx_state::hp9k310(machine_config &config)
+{
hp9k300(config);
- MCFG_DEVICE_ADD(m_maincpu, M68010, 10000000)
- MCFG_DEVICE_PROGRAM_MAP(hp9k310_map)
+ M68010(config, m_maincpu, 10000000);
+ m_maincpu->set_addrmap(AS_PROGRAM, &hp9k3xx_state::hp9k310_map);
add_dio16_bus(config);
@@ -348,12 +349,12 @@ MACHINE_CONFIG_START(hp9k3xx_state::hp9k310)
DIO32_SLOT(config, "sl3", 0, "diobus", dio32_cards, "98643", false);
DIO16_SLOT(config, "sl4", 0, "diobus", dio16_cards, "98644", false);
DIO16_SLOT(config, "sl5", 0, "diobus", dio16_cards, nullptr, false);
+}
-MACHINE_CONFIG_END
-
-MACHINE_CONFIG_START(hp9k3xx_state::hp9k320)
- MCFG_DEVICE_ADD(m_maincpu, M68020FPU, 16670000)
- MCFG_DEVICE_PROGRAM_MAP(hp9k320_map)
+void hp9k3xx_state::hp9k320(machine_config &config)
+{
+ M68020FPU(config, m_maincpu, 16670000);
+ m_maincpu->set_addrmap(AS_PROGRAM, &hp9k3xx_state::hp9k320_map);
hp9k300(config);
add_dio32_bus(config);
@@ -365,11 +366,12 @@ MACHINE_CONFIG_START(hp9k3xx_state::hp9k320)
DIO32_SLOT(config, "sl4", 0, "diobus", dio32_cards, "98620", false);
DIO32_SLOT(config, "sl5", 0, "diobus", dio32_cards, "98265a", false);
DIO32_SLOT(config, "sl7", 0, "diobus", dio32_cards, nullptr, false);
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(hp9k3xx_state::hp9k330)
- MCFG_DEVICE_ADD(m_maincpu, M68020PMMU, 16670000)
- MCFG_DEVICE_PROGRAM_MAP(hp9k330_map)
+void hp9k3xx_state::hp9k330(machine_config &config)
+{
+ M68020PMMU(config, m_maincpu, 16670000);
+ m_maincpu->set_addrmap(AS_PROGRAM, &hp9k3xx_state::hp9k330_map);
hp9k300(config);
add_dio32_bus(config);
@@ -379,11 +381,12 @@ MACHINE_CONFIG_START(hp9k3xx_state::hp9k330)
DIO32_SLOT(config, "sl2", 0, "diobus", dio16_cards, "98603b", false);
DIO32_SLOT(config, "sl3", 0, "diobus", dio16_cards, "98644", false);
DIO32_SLOT(config, "sl4", 0, "diobus", dio16_cards, nullptr, false);
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(hp9k3xx_state::hp9k332)
- MCFG_DEVICE_ADD(m_maincpu, M68020PMMU, 16670000)
- MCFG_DEVICE_PROGRAM_MAP(hp9k332_map)
+void hp9k3xx_state::hp9k332(machine_config &config)
+{
+ M68020PMMU(config, m_maincpu, 16670000);
+ m_maincpu->set_addrmap(AS_PROGRAM, &hp9k3xx_state::hp9k332_map);
hp9k300(config);
add_dio16_bus(config);
@@ -393,22 +396,22 @@ MACHINE_CONFIG_START(hp9k3xx_state::hp9k332)
DIO16_SLOT(config, "sl2", 0, "diobus", dio16_cards, "98644", false);
DIO16_SLOT(config, "sl3", 0, "diobus", dio16_cards, "98543", false);
DIO16_SLOT(config, "sl4", 0, "diobus", dio16_cards, nullptr, false);
+}
-MACHINE_CONFIG_END
-
-MACHINE_CONFIG_START(hp9k3xx_state::hp9k340)
+void hp9k3xx_state::hp9k340(machine_config &config)
+{
hp9k320(config);
- MCFG_DEVICE_REPLACE(m_maincpu, M68030, 16670000)
- MCFG_DEVICE_PROGRAM_MAP(hp9k330_map)
-MACHINE_CONFIG_END
-
-MACHINE_CONFIG_START(hp9k3xx_state::hp9k360)
+ M68030(config.replace(), m_maincpu, 16670000);
+ m_maincpu->set_addrmap(AS_PROGRAM, &hp9k3xx_state::hp9k330_map);
+}
+void hp9k3xx_state::hp9k360(machine_config &config)
+{
hp9k300(config);
- MCFG_DEVICE_ADD(m_maincpu, M68030, 25000000)
- MCFG_DEVICE_PROGRAM_MAP(hp9k360_map)
+ M68030(config, m_maincpu, 25000000);
+ m_maincpu->set_addrmap(AS_PROGRAM, &hp9k3xx_state::hp9k360_map);
add_dio32_bus(config);
@@ -418,30 +421,32 @@ MACHINE_CONFIG_START(hp9k3xx_state::hp9k360)
DIO32_SLOT(config, "sl3", 0, "diobus", dio32_cards, "98620", false);
DIO32_SLOT(config, "sl4", 0, "diobus", dio32_cards, "98265a", false);
DIO32_SLOT(config, "sl5", 0, "diobus", dio32_cards, nullptr, false);
-
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(hp9k3xx_state::hp9k370)
+void hp9k3xx_state::hp9k370(machine_config &config)
+{
hp9k360(config);
- MCFG_DEVICE_REPLACE(m_maincpu, M68030, 33000000)
- MCFG_DEVICE_PROGRAM_MAP(hp9k370_map)
-MACHINE_CONFIG_END
+ M68030(config.replace(), m_maincpu, 33000000);
+ m_maincpu->set_addrmap(AS_PROGRAM, &hp9k3xx_state::hp9k370_map);
+}
-MACHINE_CONFIG_START(hp9k3xx_state::hp9k380)
+void hp9k3xx_state::hp9k380(machine_config &config)
+{
hp9k360(config);
- MCFG_DEVICE_REPLACE(m_maincpu, M68040, 25000000)
- MCFG_DEVICE_PROGRAM_MAP(hp9k380_map)
-MACHINE_CONFIG_END
+ M68040(config.replace(), m_maincpu, 25000000);
+ m_maincpu->set_addrmap(AS_PROGRAM, &hp9k3xx_state::hp9k380_map);
+}
-MACHINE_CONFIG_START(hp9k3xx_state::hp9k382)
+void hp9k3xx_state::hp9k382(machine_config &config)
+{
hp9k360(config);
- MCFG_DEVICE_REPLACE(m_maincpu, M68040, 25000000)
- MCFG_DEVICE_PROGRAM_MAP(hp9k382_map)
-MACHINE_CONFIG_END
+ M68040(config.replace(), m_maincpu, 25000000);
+ m_maincpu->set_addrmap(AS_PROGRAM, &hp9k3xx_state::hp9k382_map);
+}
ROM_START( hp9k310 )
ROM_REGION( 0x20000, MAINCPU_TAG, 0 )
diff --git a/src/mame/drivers/hp_ipc.cpp b/src/mame/drivers/hp_ipc.cpp
index d040abb82ef..db082fe1357 100644
--- a/src/mame/drivers/hp_ipc.cpp
+++ b/src/mame/drivers/hp_ipc.cpp
@@ -400,17 +400,17 @@ private:
virtual void machine_start() override;
virtual void machine_reset() override;
- DECLARE_READ16_MEMBER(mem_r);
- DECLARE_WRITE16_MEMBER(mem_w);
- DECLARE_READ16_MEMBER(mmu_r);
- DECLARE_WRITE16_MEMBER(mmu_w);
- DECLARE_READ16_MEMBER(ram_r);
- DECLARE_WRITE16_MEMBER(ram_w);
- DECLARE_READ16_MEMBER(trap_r);
- DECLARE_WRITE16_MEMBER(trap_w);
-
- DECLARE_READ8_MEMBER(floppy_id_r);
- DECLARE_WRITE8_MEMBER(floppy_id_w);
+ uint16_t mem_r(offs_t offset, uint16_t mem_mask);
+ void mem_w(offs_t offset, uint16_t data, uint16_t mem_mask);
+ uint16_t mmu_r(offs_t offset);
+ void mmu_w(offs_t offset, uint16_t data);
+ uint16_t ram_r(offs_t offset, uint16_t mem_mask);
+ void ram_w(offs_t offset, uint16_t data, uint16_t mem_mask);
+ uint16_t trap_r(offs_t offset, uint16_t mem_mask);
+ void trap_w(offs_t offset, uint16_t data, uint16_t mem_mask);
+
+ uint8_t floppy_id_r();
+ void floppy_id_w(uint8_t data);
DECLARE_FLOPPY_FORMATS(floppy_formats);
DECLARE_WRITE_LINE_MEMBER(irq_1);
@@ -499,7 +499,7 @@ void hp_ipc_state::hp_ipc_mem_inner_base(address_map &map)
map(0x0610000, 0x0610007).rw(FUNC(hp_ipc_state::floppy_id_r), FUNC(hp_ipc_state::floppy_id_w)).umask16(0x00ff);
map(0x0610008, 0x061000F).rw(m_fdc, FUNC(wd2797_device::read), FUNC(wd2797_device::write)).umask16(0x00ff);
map(0x0620000, 0x0620007).rw(m_gpu, FUNC(hp1ll3_device::read), FUNC(hp1ll3_device::write)).umask16(0x00ff);
- map(0x0630000, 0x063FFFF).mask(0xf).rw("hpib" , FUNC(tms9914_device::reg8_r) , FUNC(tms9914_device::reg8_w)).umask16(0x00ff);
+ map(0x0630000, 0x063FFFF).mask(0xf).rw("hpib" , FUNC(tms9914_device::read) , FUNC(tms9914_device::write)).umask16(0x00ff);
map(0x0640000, 0x064002F).rw("rtc", FUNC(mm58167_device::read), FUNC(mm58167_device::write)).umask16(0x00ff);
map(0x0660000, 0x06600FF).rw("mlc", FUNC(hp_hil_mlc_device::read), FUNC(hp_hil_mlc_device::write)).umask16(0x00ff); // 'caravan', scrn/caravan.h
map(0x0670000, 0x067FFFF).noprw(); // Speaker (NatSemi COP 452)
@@ -523,19 +523,19 @@ static INPUT_PORTS_START(hp_ipc)
INPUT_PORTS_END
-READ16_MEMBER(hp_ipc_state::mmu_r)
+uint16_t hp_ipc_state::mmu_r(offs_t offset)
{
uint16_t data = (m_mmu[offset & 3] >> 10);
return data;
}
-WRITE16_MEMBER(hp_ipc_state::mmu_w)
+void hp_ipc_state::mmu_w(offs_t offset, uint16_t data)
{
m_mmu[offset & 3] = (data & 0xFFF) << 10;
}
-READ16_MEMBER(hp_ipc_state::mem_r)
+uint16_t hp_ipc_state::mem_r(offs_t offset, uint16_t mem_mask)
{
int fc = m_maincpu->get_fc() & 4;
@@ -545,10 +545,10 @@ READ16_MEMBER(hp_ipc_state::mem_r)
m_bankdev->set_bank(m_fc ? 0 : 1);
}
- return m_bankdev->read16(space, offset, mem_mask);
+ return m_bankdev->read16(offset, mem_mask);
}
-WRITE16_MEMBER(hp_ipc_state::mem_w)
+void hp_ipc_state::mem_w(offs_t offset, uint16_t data, uint16_t mem_mask)
{
int fc = m_maincpu->get_fc() & 4;
@@ -558,23 +558,23 @@ WRITE16_MEMBER(hp_ipc_state::mem_w)
m_bankdev->set_bank(m_fc ? 0 : 1);
}
- m_bankdev->write16(space, offset, data, mem_mask);
+ m_bankdev->write16(offset, data, mem_mask);
}
-READ16_MEMBER(hp_ipc_state::trap_r)
+uint16_t hp_ipc_state::trap_r(offs_t offset, uint16_t mem_mask)
{
if (!machine().side_effects_disabled()) set_bus_error((offset << 1) & 0xFFFFFF, true, mem_mask);
return 0xffff;
}
-WRITE16_MEMBER(hp_ipc_state::trap_w)
+void hp_ipc_state::trap_w(offs_t offset, uint16_t data, uint16_t mem_mask)
{
if (!machine().side_effects_disabled()) set_bus_error((offset << 1) & 0xFFFFFF, false, mem_mask);
}
-READ16_MEMBER(hp_ipc_state::ram_r)
+uint16_t hp_ipc_state::ram_r(offs_t offset, uint16_t mem_mask)
{
uint32_t ram_address = get_ram_address(offset);
uint16_t data = 0xffff;
@@ -592,7 +592,7 @@ READ16_MEMBER(hp_ipc_state::ram_r)
return data;
}
-WRITE16_MEMBER(hp_ipc_state::ram_w)
+void hp_ipc_state::ram_w(offs_t offset, uint16_t data, uint16_t mem_mask)
{
uint32_t ram_address = get_ram_address(offset);
@@ -613,7 +613,7 @@ WRITE16_MEMBER(hp_ipc_state::ram_w)
* bit 1 -- disk changed (from drive)
* bit 0 -- write protect (from drive)
*/
-READ8_MEMBER(hp_ipc_state::floppy_id_r)
+uint8_t hp_ipc_state::floppy_id_r()
{
uint8_t data = 0;
@@ -634,7 +634,7 @@ READ8_MEMBER(hp_ipc_state::floppy_id_r)
* bit 1 -- 1: drive select (via inverter to drive's /DRIVE SEL 1)
* bit 0 -- 1: reset disc_changed (via inverter to drive's /DSKRST)
*/
-WRITE8_MEMBER(hp_ipc_state::floppy_id_w)
+void hp_ipc_state::floppy_id_w(uint8_t data)
{
floppy_image_device *floppy0 = m_fdc->subdevice<floppy_connector>("0")->get_device();
@@ -737,9 +737,10 @@ static void hp_ipc_floppies(device_slot_interface &device)
* 2 HP-HIL devices (keyboard, mouse)
* 1 Real-time clock
*/
-MACHINE_CONFIG_START(hp_ipc_state::hp_ipc_base)
- MCFG_DEVICE_ADD("maincpu", M68000, 15.92_MHz_XTAL / 2)
- MCFG_DEVICE_PROGRAM_MAP(hp_ipc_mem_outer)
+void hp_ipc_state::hp_ipc_base(machine_config &config)
+{
+ M68000(config, m_maincpu, 15.92_MHz_XTAL / 2);
+ m_maincpu->set_addrmap(AS_PROGRAM, &hp_ipc_state::hp_ipc_mem_outer);
HP1LL3(config , m_gpu , 24_MHz_XTAL / 8).set_screen("screen");
@@ -747,13 +748,13 @@ MACHINE_CONFIG_START(hp_ipc_state::hp_ipc_base)
// XXX when floppy code correctly handles 600 rpm drives.
WD2797(config, m_fdc, 2_MHz_XTAL);
m_fdc->intrq_wr_callback().set(FUNC(hp_ipc_state::irq_5));
- MCFG_FLOPPY_DRIVE_ADD("fdc:0", hp_ipc_floppies, "35dd", hp_ipc_state::floppy_formats)
+ FLOPPY_CONNECTOR(config, "fdc:0", hp_ipc_floppies, "35dd", hp_ipc_state::floppy_formats);
- MCFG_SOFTWARE_LIST_ADD("flop_list","hp_ipc")
+ SOFTWARE_LIST(config, "flop_list").set_original("hp_ipc");
- MCFG_DEVICE_ADD("rtc", MM58167, 32.768_kHz_XTAL)
- MCFG_MM58167_IRQ_CALLBACK(WRITELINE(*this, hp_ipc_state, irq_1))
-// MCFG_MM58167_STANDBY_IRQ_CALLBACK(WRITELINE(*this, hp_ipc_state, irq_6))
+ mm58167_device &rtc(MM58167(config, "rtc", 32.768_kHz_XTAL));
+ rtc.irq().set(FUNC(hp_ipc_state::irq_1));
+// rtc.standby_irq().set(FUNC(hp_ipc_state::irq_6));
hp_hil_mlc_device &mlc(HP_HIL_MLC(config, "mlc", XTAL(15'920'000)/2));
mlc.int_callback().set(FUNC(hp_ipc_state::irq_2));
@@ -774,21 +775,23 @@ MACHINE_CONFIG_START(hp_ipc_state::hp_ipc_base)
hpib.srq_write_cb().set(IEEE488_TAG, FUNC(ieee488_device::host_srq_w));
hpib.atn_write_cb().set(IEEE488_TAG, FUNC(ieee488_device::host_atn_w));
hpib.ren_write_cb().set(IEEE488_TAG, FUNC(ieee488_device::host_ren_w));
- MCFG_IEEE488_BUS_ADD()
- MCFG_IEEE488_EOI_CALLBACK(WRITELINE("hpib" , tms9914_device , eoi_w))
- MCFG_IEEE488_DAV_CALLBACK(WRITELINE("hpib" , tms9914_device , dav_w))
- MCFG_IEEE488_NRFD_CALLBACK(WRITELINE("hpib" , tms9914_device , nrfd_w))
- MCFG_IEEE488_NDAC_CALLBACK(WRITELINE("hpib" , tms9914_device , ndac_w))
- MCFG_IEEE488_IFC_CALLBACK(WRITELINE("hpib" , tms9914_device , ifc_w))
- MCFG_IEEE488_SRQ_CALLBACK(WRITELINE("hpib" , tms9914_device , srq_w))
- MCFG_IEEE488_ATN_CALLBACK(WRITELINE("hpib" , tms9914_device , atn_w))
- MCFG_IEEE488_REN_CALLBACK(WRITELINE("hpib" , tms9914_device , ren_w))
- MCFG_IEEE488_SLOT_ADD("ieee_rem" , 0 , remote488_devices , nullptr)
+
+ ieee488_device &ieee(IEEE488(config, IEEE488_TAG));
+ ieee.eoi_callback().set("hpib" , FUNC(tms9914_device::eoi_w));
+ ieee.dav_callback().set("hpib" , FUNC(tms9914_device::dav_w));
+ ieee.nrfd_callback().set("hpib" , FUNC(tms9914_device::nrfd_w));
+ ieee.ndac_callback().set("hpib" , FUNC(tms9914_device::ndac_w));
+ ieee.ifc_callback().set("hpib" , FUNC(tms9914_device::ifc_w));
+ ieee.srq_callback().set("hpib" , FUNC(tms9914_device::srq_w));
+ ieee.atn_callback().set("hpib" , FUNC(tms9914_device::atn_w));
+ ieee.ren_callback().set("hpib" , FUNC(tms9914_device::ren_w));
+ IEEE488_SLOT(config , "ieee_rem" , 0 , remote488_devices , nullptr);
RAM(config, RAM_TAG).set_default_size("512K").set_extra_options("768K,1M,1576K,2M,3M,4M,5M,6M,7M,7680K");
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(hp_ipc_state::hp_ipc)
+void hp_ipc_state::hp_ipc(machine_config &config)
+{
hp_ipc_base(config);
ADDRESS_MAP_BANK(config, "bankdev").set_map(&hp_ipc_state::hp_ipc_mem_inner_9807a).set_options(ENDIANNESS_BIG, 16, 25, 0x1000000);
@@ -807,9 +810,10 @@ MACHINE_CONFIG_START(hp_ipc_state::hp_ipc)
m_screen->set_palette("palette");
PALETTE(config, "palette", palette_device::MONOCHROME);
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(hp_ipc_state::hp9808a)
+void hp_ipc_state::hp9808a(machine_config &config)
+{
hp_ipc_base(config);
ADDRESS_MAP_BANK(config, "bankdev").set_map(&hp_ipc_state::hp_ipc_mem_inner_9808a).set_options(ENDIANNESS_BIG, 16, 25, 0x1000000);
@@ -825,7 +829,7 @@ MACHINE_CONFIG_START(hp_ipc_state::hp9808a)
m_screen->set_palette("palette");
PALETTE(config, "palette", palette_device::MONOCHROME);
-MACHINE_CONFIG_END
+}
ROM_START(hp_ipc)
diff --git a/src/mame/drivers/hprot1.cpp b/src/mame/drivers/hprot1.cpp
index 1e3891954a6..2a30193de12 100644
--- a/src/mame/drivers/hprot1.cpp
+++ b/src/mame/drivers/hprot1.cpp
@@ -245,7 +245,8 @@ HD44780_PIXEL_UPDATE(hprot1_state::hprot1_pixel_update)
}
}
-MACHINE_CONFIG_START(hprot1_state::hprot1)
+void hprot1_state::hprot1(machine_config &config)
+{
/* basic machine hardware */
I80C31(config, m_maincpu, XTAL(10'000'000));
m_maincpu->set_addrmap(AS_PROGRAM, &hprot1_state::i80c31_prg);
@@ -255,58 +256,58 @@ MACHINE_CONFIG_START(hprot1_state::hprot1)
m_maincpu->port_out_cb<3>().set(FUNC(hprot1_state::henry_p3_w));
/* video hardware */
- MCFG_SCREEN_ADD("screen", LCD)
- MCFG_SCREEN_REFRESH_RATE(50)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */
- MCFG_SCREEN_UPDATE_DEVICE("hd44780", hd44780_device, screen_update)
- MCFG_SCREEN_SIZE(6*16, 9*2)
- MCFG_SCREEN_VISIBLE_AREA(0, 6*16-1, 0, 9*2-1)
- MCFG_SCREEN_PALETTE("palette")
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_LCD));
+ screen.set_refresh_hz(50);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */
+ screen.set_screen_update("hd44780", FUNC(hd44780_device::screen_update));
+ screen.set_size(6*16, 9*2);
+ screen.set_visarea(0, 6*16-1, 0, 9*2-1);
+ screen.set_palette("palette");
PALETTE(config, "palette", FUNC(hprot1_state::hprot1_palette), 2);
GFXDECODE(config, "gfxdecode", "palette", gfx_hprot1);
- MCFG_HD44780_ADD("hd44780")
- MCFG_HD44780_LCD_SIZE(2, 16)
- MCFG_HD44780_PIXEL_UPDATE_CB(hprot1_state,hprot1_pixel_update)
+ HD44780(config, m_lcdc, 0);
+ m_lcdc->set_lcd_size(2, 16);
+ m_lcdc->set_pixel_update_cb(FUNC(hprot1_state::hprot1_pixel_update), this);
/* TODO: figure out which RTC chip is in use. */
/* TODO: emulate the ADM695AN chip (watchdog/brownout reset)*/
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(hprot1_state::hprotr8a)
+void hprot1_state::hprotr8a(machine_config &config)
+{
hprot1(config);
- MCFG_DEVICE_REPLACE("maincpu", I80C31, 11059200) // value of X1 cristal on the PCB
- MCFG_DEVICE_PROGRAM_MAP(i80c31_prg)
- MCFG_DEVICE_IO_MAP(i80c31_io)
+ I80C31(config.replace(), m_maincpu, 11059200); // value of X1 crystal on the PCB
+ m_maincpu->set_addrmap(AS_PROGRAM, &hprot1_state::i80c31_prg);
+ m_maincpu->set_addrmap(AS_IO, &hprot1_state::i80c31_io);
/* sound hardware */
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("speaker", SPEAKER_SOUND)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.50)
+ SPEAKER_SOUND(config, "speaker").add_route(ALL_OUTPUTS, "mono", 0.50);
/* TODO: add an RS232 interface (emulate MAX232N chip)
(the board has GND/VCC/RX/TX pins available in a connector) */
/* TODO: add an I2C interface (the board has GND/VCC/SDA/SCL pins available in a connector) */
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(hprot1_state::hprot2r6)
+void hprot1_state::hprot2r6(machine_config &config)
+{
hprot1(config);
- MCFG_DEVICE_REPLACE("maincpu", I80C31, 11059200) // value of X1 cristal on the PCB
- MCFG_DEVICE_PROGRAM_MAP(i80c31_prg)
- MCFG_DEVICE_IO_MAP(i80c31_io)
+ I80C31(config.replace(), m_maincpu, 11059200); // value of X1 crystal on the PCB
+ m_maincpu->set_addrmap(AS_PROGRAM, &hprot1_state::i80c31_prg);
+ m_maincpu->set_addrmap(AS_IO, &hprot1_state::i80c31_io);
/* sound hardware */
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("speaker", SPEAKER_SOUND)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.50)
+ SPEAKER_SOUND(config, "speaker").add_route(ALL_OUTPUTS, "mono", 0.50);
/* TODO: add an RS232 interface (emulate MAX232N chip) */
-MACHINE_CONFIG_END
+}
ROM_START( hprot1 )
ROM_REGION( 0x10000, "maincpu", 0 )
diff --git a/src/mame/drivers/hpz80unk.cpp b/src/mame/drivers/hpz80unk.cpp
index 46e2f9eef9e..20993cd1c09 100644
--- a/src/mame/drivers/hpz80unk.cpp
+++ b/src/mame/drivers/hpz80unk.cpp
@@ -44,6 +44,7 @@ Z nothing
#include "emu.h"
#include "cpu/z80/z80.h"
#include "machine/ay31015.h"
+#include "machine/clock.h"
#include "bus/rs232/rs232.h"
@@ -169,30 +170,31 @@ void hpz80unk_state::hpz80unk(machine_config &config)
m_maincpu->set_addrmap(AS_PROGRAM, &hpz80unk_state::hpz80unk_mem);
m_maincpu->set_addrmap(AS_IO, &hpz80unk_state::hpz80unk_io);
- /* video hardware */
AY51013(config, m_uart[0]); // COM2502
- m_uart[0]->set_tx_clock(153600);
- m_uart[0]->set_rx_clock(153600);
m_uart[0]->read_si_callback().set("rs232a", FUNC(rs232_port_device::rxd_r));
m_uart[0]->write_so_callback().set("rs232a", FUNC(rs232_port_device::write_txd));
m_uart[0]->set_auto_rdav(true);
RS232_PORT(config, "rs232a", default_rs232_devices, "terminal");
AY51013(config, m_uart[1]); // COM2502
- m_uart[1]->set_tx_clock(153600);
- m_uart[1]->set_rx_clock(153600);
m_uart[1]->read_si_callback().set("rs232b", FUNC(rs232_port_device::rxd_r));
m_uart[1]->write_so_callback().set("rs232b", FUNC(rs232_port_device::write_txd));
m_uart[1]->set_auto_rdav(true);
RS232_PORT(config, "rs232b", default_rs232_devices, nullptr);
AY51013(config, m_uart[2]); // COM2502
- m_uart[2]->set_tx_clock(153600);
- m_uart[2]->set_rx_clock(153600);
m_uart[2]->read_si_callback().set("rs232c", FUNC(rs232_port_device::rxd_r));
m_uart[2]->write_so_callback().set("rs232c", FUNC(rs232_port_device::write_txd));
m_uart[2]->set_auto_rdav(true);
RS232_PORT(config, "rs232c", default_rs232_devices, nullptr);
+
+ clock_device &uart_clock(CLOCK(config, "uart_clock", 153600));
+ uart_clock.signal_handler().set(m_uart[0], FUNC(ay51013_device::write_tcp));
+ uart_clock.signal_handler().append(m_uart[0], FUNC(ay51013_device::write_rcp));
+ uart_clock.signal_handler().append(m_uart[1], FUNC(ay51013_device::write_tcp));
+ uart_clock.signal_handler().append(m_uart[1], FUNC(ay51013_device::write_rcp));
+ uart_clock.signal_handler().append(m_uart[2], FUNC(ay51013_device::write_tcp));
+ uart_clock.signal_handler().append(m_uart[2], FUNC(ay51013_device::write_rcp));
}
/* ROM definition */
diff --git a/src/mame/drivers/hshavoc.cpp b/src/mame/drivers/hshavoc.cpp
index 1a47aa2e568..ba31eb3e063 100644
--- a/src/mame/drivers/hshavoc.cpp
+++ b/src/mame/drivers/hshavoc.cpp
@@ -98,7 +98,7 @@ INPUT_PORTS_END
ROM_START( hshavoc )
- ROM_REGION( 0x100000, "maincpu", 0 )
+ ROM_REGION( 0x200000, "maincpu", 0 )
ROM_LOAD16_BYTE( "d-25.11a", 0x000000, 0x080000, CRC(6a155060) SHA1(ecb47bd428786e50e300a062b5038f943419a389) )
ROM_LOAD16_BYTE( "d-26.9a", 0x000001, 0x080000, CRC(1afa84fe) SHA1(041296e0360b7747aedc2d948c39e06ba03a7d08) )
diff --git a/src/mame/drivers/ht68k.cpp b/src/mame/drivers/ht68k.cpp
index 6f5a8f64a8b..05c91f9eace 100644
--- a/src/mame/drivers/ht68k.cpp
+++ b/src/mame/drivers/ht68k.cpp
@@ -130,31 +130,32 @@ static void ht68k_floppies(device_slot_interface &device)
}
-MACHINE_CONFIG_START(ht68k_state::ht68k)
+void ht68k_state::ht68k(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M68000, 8_MHz_XTAL)
- MCFG_DEVICE_PROGRAM_MAP(ht68k_mem)
+ M68000(config, m_maincpu, 8_MHz_XTAL);
+ m_maincpu->set_addrmap(AS_PROGRAM, &ht68k_state::ht68k_mem);
/* video hardware */
- MCFG_DEVICE_ADD("duart68681", MC68681, 8_MHz_XTAL / 2)
- MCFG_MC68681_SET_EXTERNAL_CLOCKS(500000, 500000, 1000000, 1000000)
- MCFG_MC68681_IRQ_CALLBACK(WRITELINE(*this, ht68k_state, duart_irq_handler))
- MCFG_MC68681_A_TX_CALLBACK(WRITELINE("rs232", rs232_port_device, write_txd))
- MCFG_MC68681_B_TX_CALLBACK(WRITELINE(*this, ht68k_state, duart_txb))
- MCFG_MC68681_OUTPORT_CALLBACK(WRITE8(*this, ht68k_state, duart_output))
+ MC68681(config, m_duart, 8_MHz_XTAL / 2);
+ m_duart->set_clocks(500000, 500000, 1000000, 1000000);
+ m_duart->irq_cb().set(FUNC(ht68k_state::duart_irq_handler));
+ m_duart->a_tx_cb().set("rs232", FUNC(rs232_port_device::write_txd));
+ m_duart->b_tx_cb().set(FUNC(ht68k_state::duart_txb));
+ m_duart->outport_cb().set(FUNC(ht68k_state::duart_output));
rs232_port_device &rs232(RS232_PORT(config, "rs232", default_rs232_devices, "terminal"));
rs232.rxd_handler().set(m_duart, FUNC(mc68681_device::rx_a_w));
WD1770(config, m_fdc, 8_MHz_XTAL);
- MCFG_FLOPPY_DRIVE_ADD("wd1770:0", ht68k_floppies, "525dd", floppy_image_device::default_floppy_formats)
- MCFG_FLOPPY_DRIVE_ADD("wd1770:1", ht68k_floppies, "525dd", floppy_image_device::default_floppy_formats)
- MCFG_FLOPPY_DRIVE_ADD("wd1770:2", ht68k_floppies, "525dd", floppy_image_device::default_floppy_formats)
- MCFG_FLOPPY_DRIVE_ADD("wd1770:3", ht68k_floppies, "525dd", floppy_image_device::default_floppy_formats)
+ FLOPPY_CONNECTOR(config, "wd1770:0", ht68k_floppies, "525dd", floppy_image_device::default_floppy_formats);
+ FLOPPY_CONNECTOR(config, "wd1770:1", ht68k_floppies, "525dd", floppy_image_device::default_floppy_formats);
+ FLOPPY_CONNECTOR(config, "wd1770:2", ht68k_floppies, "525dd", floppy_image_device::default_floppy_formats);
+ FLOPPY_CONNECTOR(config, "wd1770:3", ht68k_floppies, "525dd", floppy_image_device::default_floppy_formats);
- MCFG_SOFTWARE_LIST_ADD("flop525_list", "ht68k")
-MACHINE_CONFIG_END
+ SOFTWARE_LIST(config, "flop525_list").set_original("ht68k");
+}
/* ROM definition */
ROM_START( ht68k )
diff --git a/src/mame/drivers/huebler.cpp b/src/mame/drivers/huebler.cpp
index ff273669060..f8ce25a5d03 100644
--- a/src/mame/drivers/huebler.cpp
+++ b/src/mame/drivers/huebler.cpp
@@ -311,21 +311,22 @@ static GFXDECODE_START( gfx_amu880 )
GFXDECODE_END
-MACHINE_CONFIG_START(amu880_state::amu880)
+void amu880_state::amu880(machine_config &config)
+{
/* basic machine hardware */
Z80(config, m_maincpu, XTAL(10'000'000)/4); // U880D
m_maincpu->set_addrmap(AS_PROGRAM, &amu880_state::amu880_mem);
m_maincpu->set_addrmap(AS_IO, &amu880_state::amu880_io);
m_maincpu->set_daisy_config(amu880_daisy_chain);
- MCFG_TIMER_DRIVER_ADD_PERIODIC("keyboard", amu880_state, keyboard_tick, attotime::from_hz(1500))
+ TIMER(config, "keyboard").configure_periodic(FUNC(amu880_state::keyboard_tick), attotime::from_hz(1500));
/* video hardware */
- MCFG_SCREEN_ADD(SCREEN_TAG, RASTER)
- MCFG_SCREEN_UPDATE_DRIVER(amu880_state, screen_update)
- MCFG_SCREEN_RAW_PARAMS(9000000, 576, 0*6, 64*6, 320, 0*10, 24*10)
+ screen_device &screen(SCREEN(config, SCREEN_TAG, SCREEN_TYPE_RASTER));
+ screen.set_screen_update(FUNC(amu880_state::screen_update));
+ screen.set_raw(9000000, 576, 0*6, 64*6, 320, 0*10, 24*10);
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_amu880)
+ GFXDECODE(config, "gfxdecode", m_palette, gfx_amu880);
PALETTE(config, m_palette, palette_device::MONOCHROME);
/* devices */
@@ -345,14 +346,14 @@ MACHINE_CONFIG_START(amu880_state::amu880)
m_z80sio->out_txda_callback().set(FUNC(amu880_state::cassette_w));
m_z80sio->out_int_callback().set_inputline(m_maincpu, INPUT_LINE_IRQ0);
- MCFG_CASSETTE_ADD("cassette")
- MCFG_CASSETTE_DEFAULT_STATE(CASSETTE_STOPPED | CASSETTE_MOTOR_ENABLED | CASSETTE_SPEAKER_MUTED)
+ CASSETTE(config, m_cassette);
+ m_cassette->set_default_state(CASSETTE_STOPPED | CASSETTE_MOTOR_ENABLED | CASSETTE_SPEAKER_MUTED);
- MCFG_TIMER_DRIVER_ADD_PERIODIC("tape", amu880_state, tape_tick, attotime::from_hz(44100))
+ TIMER(config, "tape").configure_periodic(FUNC(amu880_state::tape_tick), attotime::from_hz(44100));
/* internal ram */
RAM(config, RAM_TAG).set_default_size("64K");
-MACHINE_CONFIG_END
+}
/* ROMs */
diff --git a/src/mame/drivers/hunter2.cpp b/src/mame/drivers/hunter2.cpp
index 713f03d4914..5271e19bd86 100644
--- a/src/mame/drivers/hunter2.cpp
+++ b/src/mame/drivers/hunter2.cpp
@@ -378,42 +378,42 @@ WRITE_LINE_MEMBER(hunter2_state::rxd_w)
m_maincpu->set_input_line(NSC800_RSTB, ASSERT_LINE);
}
-MACHINE_CONFIG_START(hunter2_state::hunter2)
+void hunter2_state::hunter2(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", NSC800, XTAL(4'000'000))
- MCFG_DEVICE_PROGRAM_MAP(hunter2_mem)
- MCFG_DEVICE_IO_MAP(hunter2_io)
+ NSC800(config, m_maincpu, XTAL(4'000'000));
+ m_maincpu->set_addrmap(AS_PROGRAM, &hunter2_state::hunter2_mem);
+ m_maincpu->set_addrmap(AS_IO, &hunter2_state::hunter2_io);
/* video hardware */
- MCFG_SCREEN_ADD("screen", LCD)
- MCFG_SCREEN_REFRESH_RATE(80)
- MCFG_SCREEN_UPDATE_DEVICE("lcdc", hd61830_device, screen_update)
- MCFG_SCREEN_SIZE(240, 128)
- MCFG_SCREEN_VISIBLE_AREA(0, 239, 0, 63)
- MCFG_SCREEN_PALETTE("palette")
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_LCD));
+ screen.set_refresh_hz(80);
+ screen.set_screen_update("lcdc", FUNC(hd61830_device::screen_update));
+ screen.set_size(240, 128);
+ screen.set_visarea(0, 239, 0, 63);
+ screen.set_palette("palette");
PALETTE(config, "palette", FUNC(hunter2_state::hunter2_palette), 2);
- MCFG_DEVICE_ADD("lcdc", HD61830, XTAL(4'915'200)/2/2) // unknown clock
- MCFG_VIDEO_SET_SCREEN("screen")
+ hd61830_device &hd61830(HD61830(config, "lcdc", XTAL(4'915'200)/2/2)); // unknown clock
+ hd61830.set_screen("screen");
/* sound hardware */
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("speaker", SPEAKER_SOUND)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.50)
+ SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.50);
/* Devices */
- MCFG_DEVICE_ADD("rtc", MM58274C, 0)
- // this is all a guess
- MCFG_MM58274C_MODE24(0) // 12 hour
- MCFG_MM58274C_DAY1(1) // monday
-
- MCFG_NSC810_ADD("iotimer",XTAL(4'000'000),XTAL(4'000'000))
- MCFG_NSC810_PORTA_READ(READ8(*this, hunter2_state,keyboard_r))
- MCFG_NSC810_PORTB_READ(READ8(*this, hunter2_state,serial_dsr_r))
- MCFG_NSC810_PORTB_WRITE(WRITE8(*this, hunter2_state,keyboard_w))
- MCFG_NSC810_PORTC_READ(READ8(*this, hunter2_state,serial_rx_r))
- MCFG_NSC810_TIMER0_OUT(WRITELINE(*this, hunter2_state,timer0_out))
- MCFG_NSC810_TIMER1_OUT(WRITELINE(*this, hunter2_state,timer1_out))
+ mm58274c_device &rtc(MM58274C(config, "rtc", 0));
+ // this is all guess
+ rtc.set_mode24(0); // 12 hour
+ rtc.set_day1(1); // monday
+
+ nsc810_device &iotimer(NSC810(config, "iotimer", 0, XTAL(4'000'000), XTAL(4'000'000)));
+ iotimer.portA_read_callback().set(FUNC(hunter2_state::keyboard_r));
+ iotimer.portB_read_callback().set(FUNC(hunter2_state::serial_dsr_r));
+ iotimer.portB_write_callback().set(FUNC(hunter2_state::keyboard_w));
+ iotimer.portC_read_callback().set(FUNC(hunter2_state::serial_rx_r));
+ iotimer.timer0_callback().set(FUNC(hunter2_state::timer0_out));
+ iotimer.timer1_callback().set(FUNC(hunter2_state::timer1_out));
RS232_PORT(config, m_rs232, default_rs232_devices, nullptr);
m_rs232->cts_handler().set(FUNC(hunter2_state::cts_w));
@@ -425,7 +425,7 @@ MACHINE_CONFIG_START(hunter2_state::hunter2)
ADDRESS_MAP_BANK(config, "bank2").set_map(&hunter2_state::hunter2_banked_mem).set_endianness(ENDIANNESS_LITTLE).set_data_width(8).set_stride(0x4000);
ADDRESS_MAP_BANK(config, "bank3").set_map(&hunter2_state::hunter2_banked_mem).set_endianness(ENDIANNESS_LITTLE).set_data_width(8).set_stride(0x4000);
ADDRESS_MAP_BANK(config, "bank4").set_map(&hunter2_state::hunter2_banked_mem).set_endianness(ENDIANNESS_LITTLE).set_data_width(8).set_stride(0x4000);
-MACHINE_CONFIG_END
+}
/* ROM definition */
ROM_START( hunter2 )
diff --git a/src/mame/drivers/hvyunit.cpp b/src/mame/drivers/hvyunit.cpp
index 1f4b11a2dc7..8290f0d6837 100644
--- a/src/mame/drivers/hvyunit.cpp
+++ b/src/mame/drivers/hvyunit.cpp
@@ -618,22 +618,22 @@ TIMER_DEVICE_CALLBACK_MEMBER(hvyunit_state::scanline)
*
*************************************/
-MACHINE_CONFIG_START(hvyunit_state::hvyunit)
-
- MCFG_DEVICE_ADD("master", Z80, XTAL(12'000'000)/2) /* 6MHz verified on PCB */
- MCFG_DEVICE_PROGRAM_MAP(master_memory)
- MCFG_DEVICE_IO_MAP(master_io)
- MCFG_TIMER_DRIVER_ADD_SCANLINE("scantimer", hvyunit_state, scanline, "screen", 0, 1)
+void hvyunit_state::hvyunit(machine_config &config)
+{
+ Z80(config, m_mastercpu, XTAL(12'000'000)/2); /* 6MHz verified on PCB */
+ m_mastercpu->set_addrmap(AS_PROGRAM, &hvyunit_state::master_memory);
+ m_mastercpu->set_addrmap(AS_IO, &hvyunit_state::master_io);
+ TIMER(config, "scantimer").configure_scanline(FUNC(hvyunit_state::scanline), "screen", 0, 1);
- MCFG_DEVICE_ADD("slave", Z80, XTAL(12'000'000)/2) /* 6MHz verified on PCB */
- MCFG_DEVICE_PROGRAM_MAP(slave_memory)
- MCFG_DEVICE_IO_MAP(slave_io)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", hvyunit_state, irq0_line_hold)
+ Z80(config, m_slavecpu, XTAL(12'000'000)/2); /* 6MHz verified on PCB */
+ m_slavecpu->set_addrmap(AS_PROGRAM, &hvyunit_state::slave_memory);
+ m_slavecpu->set_addrmap(AS_IO, &hvyunit_state::slave_io);
+ m_slavecpu->set_vblank_int("screen", FUNC(hvyunit_state::irq0_line_hold));
- MCFG_DEVICE_ADD("soundcpu", Z80, XTAL(12'000'000)/2) /* 6MHz verified on PCB */
- MCFG_DEVICE_PROGRAM_MAP(sound_memory)
- MCFG_DEVICE_IO_MAP(sound_io)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", hvyunit_state, irq0_line_hold)
+ Z80(config, m_soundcpu, XTAL(12'000'000)/2); /* 6MHz verified on PCB */
+ m_soundcpu->set_addrmap(AS_PROGRAM, &hvyunit_state::sound_memory);
+ m_soundcpu->set_addrmap(AS_IO, &hvyunit_state::sound_io);
+ m_soundcpu->set_vblank_int("screen", FUNC(hvyunit_state::irq0_line_hold));
I80C51(config, m_mermaid, XTAL(12'000'000)/2); /* 6MHz verified on PCB */
m_mermaid->port_in_cb<0>().set(FUNC(hvyunit_state::mermaid_p0_r));
@@ -650,16 +650,16 @@ MACHINE_CONFIG_START(hvyunit_state::hvyunit)
GENERIC_LATCH_8(config, m_slavelatch);
- MCFG_QUANTUM_TIME(attotime::from_hz(6000))
+ config.m_minimum_quantum = attotime::from_hz(6000);
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(58)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(256, 256)
- MCFG_SCREEN_VISIBLE_AREA(0, 256-1, 16, 240-1)
- MCFG_SCREEN_UPDATE_DRIVER(hvyunit_state, screen_update)
- MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE(*this, hvyunit_state, screen_vblank))
- MCFG_SCREEN_PALETTE(m_palette)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(58);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(256, 256);
+ screen.set_visarea(0, 256-1, 16, 240-1);
+ screen.set_screen_update(FUNC(hvyunit_state::screen_update));
+ screen.screen_vblank().set(FUNC(hvyunit_state::screen_vblank));
+ screen.set_palette(m_palette);
GFXDECODE(config, m_gfxdecode, m_palette, gfx_hvyunit);
PALETTE(config, m_palette).set_format(palette_device::xRGB_444, 0x800);
@@ -673,9 +673,8 @@ MACHINE_CONFIG_START(hvyunit_state::hvyunit)
GENERIC_LATCH_8(config, m_soundlatch);
m_soundlatch->data_pending_callback().set_inputline(m_soundcpu, INPUT_LINE_NMI);
- MCFG_DEVICE_ADD("ymsnd", YM2203, XTAL(12'000'000)/4) /* 3MHz verified on PCB */
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.80)
-MACHINE_CONFIG_END
+ YM2203(config, "ymsnd", XTAL(12'000'000)/4).add_route(ALL_OUTPUTS, "mono", 0.80); /* 3MHz verified on PCB */
+}
diff --git a/src/mame/drivers/hx20.cpp b/src/mame/drivers/hx20.cpp
index d54e917b70d..cd2dd29ff86 100644
--- a/src/mame/drivers/hx20.cpp
+++ b/src/mame/drivers/hx20.cpp
@@ -19,7 +19,7 @@
TODO:
- - m6800.c rewrite
+ - m6800.cpp rewrite
- keyboard interrupt
- LCD controller
- serial
@@ -801,7 +801,7 @@ DEVICE_IMAGE_LOAD_MEMBER(hx20_state, optrom_load)
READ8_MEMBER(hx20_state::optrom_r)
{
if (m_optrom->exists())
- return m_optrom->read_rom(space, offset);
+ return m_optrom->read_rom(offset);
else
return 0;
}
@@ -833,7 +833,7 @@ void hx20_state::machine_start()
//**************************************************************************
//-------------------------------------------------
-// MACHINE_CONFIG( hx20 )
+// machine_config( hx20 )
//-------------------------------------------------
MACHINE_CONFIG_START(hx20_state::hx20)
@@ -859,13 +859,13 @@ MACHINE_CONFIG_START(hx20_state::hx20)
m_subcpu->out_p4_cb().set(FUNC(hx20_state::slave_p4_w));
// video hardware
- MCFG_SCREEN_ADD(SCREEN_TAG, LCD)
- MCFG_SCREEN_REFRESH_RATE(50)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500))
- MCFG_SCREEN_SIZE(120, 32)
- MCFG_SCREEN_VISIBLE_AREA(0, 120-1, 0, 32-1)
- MCFG_SCREEN_UPDATE_DRIVER(hx20_state, screen_update)
- MCFG_SCREEN_PALETTE("palette")
+ screen_device &screen(SCREEN(config, SCREEN_TAG, SCREEN_TYPE_LCD));
+ screen.set_refresh_hz(50);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500));
+ screen.set_size(120, 32);
+ screen.set_visarea(0, 120-1, 0, 32-1);
+ screen.set_screen_update(FUNC(hx20_state::screen_update));
+ screen.set_palette("palette");
PALETTE(config, "palette", FUNC(hx20_state::hx20_palette), 2);
@@ -882,10 +882,11 @@ MACHINE_CONFIG_START(hx20_state::hx20)
m_rtc->irq().set(FUNC(hx20_state::rtc_irq_w));
RS232_PORT(config, RS232_TAG, default_rs232_devices, nullptr);
- MCFG_CASSETTE_ADD(CASSETTE_TAG)
- MCFG_EPSON_SIO_ADD("sio", "tf20")
- MCFG_EPSON_SIO_RX(WRITELINE(*this, hx20_state, sio_rx_w))
- MCFG_EPSON_SIO_PIN(WRITELINE(*this, hx20_state, sio_pin_w))
+ CASSETTE(config, m_cassette);
+
+ EPSON_SIO(config, m_sio, "tf20");
+ m_sio->rx_callback().set(FUNC(hx20_state::sio_rx_w));
+ m_sio->pin_callback().set(FUNC(hx20_state::sio_pin_w));
// internal ram
RAM(config, RAM_TAG).set_default_size("16K").set_extra_options("32K");
@@ -896,27 +897,28 @@ MACHINE_CONFIG_START(hx20_state::hx20)
MCFG_GENERIC_LOAD(hx20_state, optrom_load)
// software lists
- MCFG_SOFTWARE_LIST_ADD("hx20_opt_list", "hx20_rom")
- MCFG_SOFTWARE_LIST_ADD("epson_cpm_list", "epson_cpm")
+ SOFTWARE_LIST(config, "hx20_opt_list").set_original("hx20_rom");
+ SOFTWARE_LIST(config, "epson_cpm_list").set_original("epson_cpm");
MACHINE_CONFIG_END
//-------------------------------------------------
-// MACHINE_CONFIG( hx20 )
+// machine_config( hx20 )
//-------------------------------------------------
-MACHINE_CONFIG_START(hx20_state::cm6000)
+void hx20_state::cm6000(machine_config &config)
+{
hx20(config);
// basic machine hardware
m_maincpu->set_addrmap(AS_PROGRAM, &hx20_state::cm6000_mem);
// optional rom
- MCFG_DEVICE_REMOVE("optrom")
+ config.device_remove("optrom");
// software lists
- MCFG_SOFTWARE_LIST_REMOVE("epson_cpm_list")
- MCFG_SOFTWARE_LIST_REMOVE("hx20_opt_list")
-MACHINE_CONFIG_END
+ config.device_remove("epson_cpm_list");
+ config.device_remove("hx20_opt_list");
+}
//**************************************************************************
diff --git a/src/mame/drivers/hyhoo.cpp b/src/mame/drivers/hyhoo.cpp
index 7e207e19d47..c8a739f01f9 100644
--- a/src/mame/drivers/hyhoo.cpp
+++ b/src/mame/drivers/hyhoo.cpp
@@ -226,23 +226,23 @@ static INPUT_PORTS_START( hyhoo2 )
PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNUSED )
INPUT_PORTS_END
-MACHINE_CONFIG_START(hyhoo_state::hyhoo)
-
+void hyhoo_state::hyhoo(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, 5000000) /* 5.00 MHz ?? */
- MCFG_DEVICE_PROGRAM_MAP(hyhoo_map)
- MCFG_DEVICE_IO_MAP(hyhoo_io_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", hyhoo_state, irq0_line_hold)
+ Z80(config, m_maincpu, 5000000); /* 5.00 MHz ?? */
+ m_maincpu->set_addrmap(AS_PROGRAM, &hyhoo_state::hyhoo_map);
+ m_maincpu->set_addrmap(AS_IO, &hyhoo_state::hyhoo_io_map);
+ m_maincpu->set_vblank_int("screen", FUNC(hyhoo_state::irq0_line_hold));
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(512, 256)
- MCFG_SCREEN_VISIBLE_AREA(0, 512-1, 16, 240-1)
- MCFG_SCREEN_UPDATE_DRIVER(hyhoo_state, screen_update_hyhoo)
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_refresh_hz(60);
+ m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ m_screen->set_size(512, 256);
+ m_screen->set_visarea(0, 512-1, 16, 240-1);
+ m_screen->set_screen_update(FUNC(hyhoo_state::screen_update_hyhoo));
NB1413M3(config, m_nb1413m3, 0, NB1413M3_HYHOO);
@@ -254,10 +254,11 @@ MACHINE_CONFIG_START(hyhoo_state::hyhoo)
aysnd.port_b_read_callback().set_ioport("DSWB");
aysnd.add_route(ALL_OUTPUTS, "speaker", 0.35);
- MCFG_DEVICE_ADD("dac", DAC_8BIT_R2R, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 0.25) // unknown DAC
- MCFG_DEVICE_ADD("vref", VOLTAGE_REGULATOR, 0) MCFG_VOLTAGE_REGULATOR_OUTPUT(5.0)
- MCFG_SOUND_ROUTE(0, "dac", 1.0, DAC_VREF_POS_INPUT) MCFG_SOUND_ROUTE(0, "dac", -1.0, DAC_VREF_NEG_INPUT)
-MACHINE_CONFIG_END
+ DAC_8BIT_R2R(config, "dac", 0).add_route(ALL_OUTPUTS, "speaker", 0.25); // unknown DAC
+ voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref"));
+ vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT);
+ vref.add_route(0, "dac", -1.0, DAC_VREF_NEG_INPUT);
+}
void hyhoo_state::hyhoo2(machine_config &config)
diff --git a/src/mame/drivers/hyperscan.cpp b/src/mame/drivers/hyperscan.cpp
index 926c1d1ed55..99ff480f937 100644
--- a/src/mame/drivers/hyperscan.cpp
+++ b/src/mame/drivers/hyperscan.cpp
@@ -621,22 +621,23 @@ void hyperscan_state::machine_reset()
}
-MACHINE_CONFIG_START(hyperscan_state::hyperscan)
+void hyperscan_state::hyperscan(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", SCORE7, XTAL(27'000'000) * 4) // 108MHz S+core 7
- MCFG_DEVICE_PROGRAM_MAP(spg290_mem)
+ SCORE7(config, m_maincpu, XTAL(27'000'000) * 4); // 108MHz S+core 7
+ m_maincpu->set_addrmap(AS_PROGRAM, &hyperscan_state::spg290_mem);
- MCFG_SOFTWARE_LIST_ADD("cd_list","hyperscan")
+ SOFTWARE_LIST(config, "cd_list").set_original("hyperscan");
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(50)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */
- MCFG_SCREEN_UPDATE_DRIVER(hyperscan_state, spg290_screen_update)
- MCFG_SCREEN_SIZE(640, 480)
- MCFG_SCREEN_VISIBLE_AREA(0, 640-1, 0, 480-1)
- MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE(*this, hyperscan_state, spg290_vblank_irq))
-MACHINE_CONFIG_END
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(50);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */
+ screen.set_screen_update(FUNC(hyperscan_state::spg290_screen_update));
+ screen.set_size(640, 480);
+ screen.set_visarea(0, 640-1, 0, 480-1);
+ screen.screen_vblank().set(FUNC(hyperscan_state::spg290_vblank_irq));
+}
/* ROM definition */
diff --git a/src/mame/drivers/hyperspt.cpp b/src/mame/drivers/hyperspt.cpp
index 6fcec542d85..ee31d9e5393 100644
--- a/src/mame/drivers/hyperspt.cpp
+++ b/src/mame/drivers/hyperspt.cpp
@@ -292,14 +292,14 @@ WRITE_LINE_MEMBER(hyperspt_state::vblank_irq)
m_maincpu->set_input_line(0, ASSERT_LINE);
}
-MACHINE_CONFIG_START(hyperspt_state::hyperspt)
-
+void hyperspt_state::hyperspt(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD(m_maincpu, KONAMI1, XTAL(18'432'000)/12) /* verified on pcb */
- MCFG_DEVICE_PROGRAM_MAP(hyperspt_map)
+ KONAMI1(config, m_maincpu, XTAL(18'432'000)/12); /* verified on pcb */
+ m_maincpu->set_addrmap(AS_PROGRAM, &hyperspt_state::hyperspt_map);
- MCFG_DEVICE_ADD(m_audiocpu, Z80,XTAL(14'318'181)/4) /* verified on pcb */
- MCFG_DEVICE_PROGRAM_MAP(hyperspt_sound_map)
+ Z80(config, m_audiocpu, XTAL(14'318'181)/4); /* verified on pcb */
+ m_audiocpu->set_addrmap(AS_PROGRAM, &hyperspt_state::hyperspt_sound_map);
ls259_device &mainlatch(LS259(config, "mainlatch")); // F2
mainlatch.q_out_cb<0>().set(FUNC(hyperspt_state::flipscreen_w));
@@ -315,14 +315,14 @@ MACHINE_CONFIG_START(hyperspt_state::hyperspt)
WATCHDOG_TIMER(config, "watchdog");
/* video hardware */
- MCFG_SCREEN_ADD(m_screen, RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(32*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(hyperspt_state, screen_update)
- MCFG_SCREEN_PALETTE(m_palette)
- MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE(*this, hyperspt_state, vblank_irq))
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_refresh_hz(60);
+ m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ m_screen->set_size(32*8, 32*8);
+ m_screen->set_visarea(0*8, 32*8-1, 2*8, 30*8-1);
+ m_screen->set_screen_update(FUNC(hyperspt_state::screen_update));
+ m_screen->set_palette(m_palette);
+ m_screen->screen_vblank().set(FUNC(hyperspt_state::vblank_irq));
GFXDECODE(config, m_gfxdecode, m_palette, gfx_hyperspt);
PALETTE(config, m_palette, FUNC(hyperspt_state::hyperspt_palette), 16*16+16*16, 32);
@@ -332,18 +332,19 @@ MACHINE_CONFIG_START(hyperspt_state::hyperspt)
GENERIC_LATCH_8(config, "soundlatch");
- MCFG_DEVICE_ADD(m_soundbrd, TRACKFLD_AUDIO, 0, m_audiocpu, m_vlm)
+ TRACKFLD_AUDIO(config, m_soundbrd, 0, m_audiocpu, m_vlm);
- MCFG_DEVICE_ADD(m_dac, DAC_8BIT_R2R, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 0.4) // unknown DAC
- MCFG_DEVICE_ADD("vref", VOLTAGE_REGULATOR, 0) MCFG_VOLTAGE_REGULATOR_OUTPUT(5.0)
- MCFG_SOUND_ROUTE(0, "dac", 1.0, DAC_VREF_POS_INPUT) MCFG_SOUND_ROUTE(0, "dac", -1.0, DAC_VREF_NEG_INPUT)
+ DAC_8BIT_R2R(config, m_dac, 0).add_route(ALL_OUTPUTS, "speaker", 0.4); // unknown DAC
+ voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref", 0));
+ vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT);
+ vref.add_route(0, "dac", -1.0, DAC_VREF_NEG_INPUT);
- MCFG_DEVICE_ADD(m_sn, SN76496, XTAL(14'318'181)/8) /* verified on pcb */
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 1.0)
+ SN76496(config, m_sn, XTAL(14'318'181)/8); /* verified on pcb */
+ m_sn->add_route(ALL_OUTPUTS, "speaker", 1.0);
- MCFG_DEVICE_ADD(m_vlm, VLM5030, XTAL(3'579'545)) /* verified on pcb */
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 1.0)
-MACHINE_CONFIG_END
+ VLM5030(config, m_vlm, XTAL(3'579'545)); /* verified on pcb */
+ m_vlm->add_route(ALL_OUTPUTS, "speaker", 1.0);
+}
void hyperspt_state::hyprolyb_adpcm_map(address_map &map)
{
@@ -368,28 +369,28 @@ void hyperspt_state::hyprolyb_adpcm_map(address_map &map)
map(0x8000, 0xffff).rom();
}
-
-MACHINE_CONFIG_START(hyperspt_state::hypersptb)
+void hyperspt_state::hypersptb(machine_config &config)
+{
hyperspt(config);
- MCFG_DEVICE_REMOVE("vlm")
+ config.device_remove("vlm");
m_audiocpu->set_addrmap(AS_PROGRAM, address_map_constructor(&std::remove_pointer_t<decltype(this)>::soundb_map, tag(), this));
- MCFG_DEVICE_ADD("adpcm", M6802, XTAL(14'318'181)/8) /* unknown clock */
- MCFG_DEVICE_PROGRAM_MAP(hyprolyb_adpcm_map)
+ M6802(config, "adpcm", XTAL(14'318'181)/8) /* unknown clock */
+ .set_addrmap(AS_PROGRAM, &hyperspt_state::hyprolyb_adpcm_map);
GENERIC_LATCH_8(config, "soundlatch2");
- MCFG_DEVICE_ADD("hyprolyb_adpcm", HYPROLYB_ADPCM, 0)
-
- MCFG_DEVICE_ADD("msm", MSM5205, 384000)
- MCFG_MSM5205_VCLK_CB(WRITELINE("hyprolyb_adpcm", hyprolyb_adpcm_device, vck_callback)) /* VCK function */
- MCFG_MSM5205_PRESCALER_SELECTOR(S96_4B) /* 4 kHz */
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 0.5)
-MACHINE_CONFIG_END
+ HYPROLYB_ADPCM(config, "hyprolyb_adpcm", 0);
+ msm5205_device &msm(MSM5205(config, "msm", 384000));
+ msm.vck_legacy_callback().set("hyprolyb_adpcm", FUNC(hyprolyb_adpcm_device::vck_callback)); /* VCK function */
+ msm.set_prescaler_selector(msm5205_device::S96_4B); /* 4 kHz */
+ msm.add_route(ALL_OUTPUTS, "speaker", 0.5);
+}
-MACHINE_CONFIG_START(hyperspt_state::roadf)
+void hyperspt_state::roadf(machine_config &config)
+{
hyperspt(config);
m_maincpu->set_addrmap(AS_PROGRAM, address_map_constructor(&std::remove_pointer_t<decltype(this)>::roadf_map, tag(), this));
@@ -398,8 +399,8 @@ MACHINE_CONFIG_START(hyperspt_state::roadf)
MCFG_VIDEO_START_OVERRIDE(hyperspt_state,roadf)
- MCFG_DEVICE_REMOVE("vlm")
-MACHINE_CONFIG_END
+ config.device_remove("vlm");
+}
/***************************************************************************
diff --git a/src/mame/drivers/hyprduel.cpp b/src/mame/drivers/hyprduel.cpp
index c956983534a..0f31f12ce74 100644
--- a/src/mame/drivers/hyprduel.cpp
+++ b/src/mame/drivers/hyprduel.cpp
@@ -432,30 +432,32 @@ MACHINE_START_MEMBER(hyprduel_state,hyprduel)
m_vblank_end_timer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(hyprduel_state::vblank_end_callback), this));
}
-MACHINE_CONFIG_START(hyprduel_state::i4220_config)
+void hyprduel_state::i4220_config(machine_config &config)
+{
I4220(config, m_vdp, XTAL(26'666'000));
m_vdp->blit_irq_cb().set(FUNC(hyprduel_state::vdp_blit_end_w));
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_VIDEO_ATTRIBUTES(VIDEO_UPDATE_SCANLINE)
- MCFG_SCREEN_REFRESH_RATE(60) // Unknown/Unverified
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(320, 224)
- MCFG_SCREEN_VISIBLE_AREA(0, 320-1, FIRST_VISIBLE_LINE, LAST_VISIBLE_LINE)
- MCFG_SCREEN_UPDATE_DEVICE("vdp", imagetek_i4100_device, screen_update)
- MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE("vdp", imagetek_i4100_device, screen_eof))
- MCFG_SCREEN_PALETTE(":vdp:palette")
-MACHINE_CONFIG_END
-
-MACHINE_CONFIG_START(hyprduel_state::hyprduel)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_video_attributes(VIDEO_UPDATE_SCANLINE);
+ screen.set_refresh_hz(60); // Unknown/Unverified
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(320, 224);
+ screen.set_visarea(0, 320-1, FIRST_VISIBLE_LINE, LAST_VISIBLE_LINE);
+ screen.set_screen_update("vdp", FUNC(imagetek_i4100_device::screen_update));
+ screen.screen_vblank().set("vdp", FUNC(imagetek_i4100_device::screen_eof));
+ screen.set_palette(":vdp:palette");
+}
+void hyprduel_state::hyprduel(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M68000,20000000/2) /* 10MHz */
- MCFG_DEVICE_PROGRAM_MAP(hyprduel_map)
- MCFG_TIMER_DRIVER_ADD_SCANLINE("scantimer", hyprduel_state, interrupt, "screen", 0, 1)
+ M68000(config, m_maincpu, 20000000/2); /* 10MHz */
+ m_maincpu->set_addrmap(AS_PROGRAM, &hyprduel_state::hyprduel_map);
+
+ TIMER(config, "scantimer").configure_scanline(FUNC(hyprduel_state::interrupt), "screen", 0, 1);
- MCFG_DEVICE_ADD("sub", M68000,20000000/2) /* 10MHz */
- MCFG_DEVICE_PROGRAM_MAP(hyprduel_map2)
+ M68000(config, m_subcpu, 20000000/2); /* 10MHz */
+ m_subcpu->set_addrmap(AS_PROGRAM, &hyprduel_state::hyprduel_map2);
MCFG_MACHINE_START_OVERRIDE(hyprduel_state,hyprduel)
@@ -469,21 +471,21 @@ MACHINE_CONFIG_START(hyprduel_state::hyprduel)
ymsnd.irq_handler().set_inputline(m_subcpu, 1);
ymsnd.add_route(ALL_OUTPUTS, "mono", 0.80);
- MCFG_DEVICE_ADD("oki", OKIM6295, 4000000/16/16*132, okim6295_device::PIN7_HIGH) // clock frequency & pin 7 not verified
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.57)
-MACHINE_CONFIG_END
-
+ OKIM6295(config, "oki", 4000000/16/16*132, okim6295_device::PIN7_HIGH).add_route(ALL_OUTPUTS, "mono", 0.57); // clock frequency & pin 7 not verified
+}
-MACHINE_CONFIG_START(hyprduel_state::magerror)
+void hyprduel_state::magerror(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M68000,20000000/2) /* 10MHz */
- MCFG_DEVICE_PROGRAM_MAP(magerror_map)
- MCFG_TIMER_DRIVER_ADD_SCANLINE("scantimer", hyprduel_state, interrupt, "screen", 0, 1)
+ M68000(config, m_maincpu, 20000000/2); /* 10MHz */
+ m_maincpu->set_addrmap(AS_PROGRAM, &hyprduel_state::magerror_map);
- MCFG_DEVICE_ADD("sub", M68000,20000000/2) /* 10MHz */
- MCFG_DEVICE_PROGRAM_MAP(magerror_map2)
- MCFG_DEVICE_PERIODIC_INT_DRIVER(hyprduel_state, irq1_line_hold, 968) /* tempo? */
+ TIMER(config, "scantimer").configure_scanline(FUNC(hyprduel_state::interrupt), "screen", 0, 1);
+
+ M68000(config, m_subcpu, 20000000/2); /* 10MHz */
+ m_subcpu->set_addrmap(AS_PROGRAM, &hyprduel_state::magerror_map2);
+ m_subcpu->set_periodic_int(FUNC(hyprduel_state::irq1_line_hold), attotime::from_hz(968)); /* tempo? */
MCFG_MACHINE_START_OVERRIDE(hyprduel_state,hyprduel)
@@ -493,12 +495,10 @@ MACHINE_CONFIG_START(hyprduel_state::magerror)
/* sound hardware */
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("ymsnd", YM2413, 3579545)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.00)
+ YM2413(config, "ymsnd", 3579545).add_route(ALL_OUTPUTS, "mono", 1.00);
- MCFG_DEVICE_ADD("oki", OKIM6295, 4000000/16/16*132, okim6295_device::PIN7_HIGH) // clock frequency & pin 7 not verified
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.57)
-MACHINE_CONFIG_END
+ OKIM6295(config, "oki", 4000000/16/16*132, okim6295_device::PIN7_HIGH).add_route(ALL_OUTPUTS, "mono", 0.57); // clock frequency & pin 7 not verified
+}
/***************************************************************************
ROMs Loading
diff --git a/src/mame/drivers/i7000.cpp b/src/mame/drivers/i7000.cpp
index 916505868d4..e97a8d0e4e9 100644
--- a/src/mame/drivers/i7000.cpp
+++ b/src/mame/drivers/i7000.cpp
@@ -237,7 +237,7 @@ void i7000_state::machine_start()
if (m_card->exists())
{
// 0x4000 - 0xbfff 32KB ROM
- program.install_read_handler(0x4000, 0xbfff, read8_delegate(FUNC(generic_slot_device::read_rom),(generic_slot_device*)m_card));
+ program.install_read_handler(0x4000, 0xbfff, read8sm_delegate(FUNC(generic_slot_device::read_rom),(generic_slot_device*)m_card));
}
}
@@ -344,18 +344,17 @@ MC6845_ON_UPDATE_ADDR_CHANGED(i7000_state::crtc_addr)
MACHINE_CONFIG_START(i7000_state::i7000)
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", NSC800, XTAL(4'000'000))
- MCFG_DEVICE_PROGRAM_MAP(i7000_mem)
- MCFG_DEVICE_IO_MAP(i7000_io)
+ NSC800(config, m_maincpu, XTAL(4'000'000));
+ m_maincpu->set_addrmap(AS_PROGRAM, &i7000_state::i7000_mem);
+ m_maincpu->set_addrmap(AS_IO, &i7000_state::i7000_io);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_SIZE(320, 200) /* 40x25 8x8 chars */
- MCFG_SCREEN_VISIBLE_AREA(0, 320-1, 0, 200-1)
-
- MCFG_SCREEN_UPDATE_DRIVER(i7000_state, screen_update_i7000)
- MCFG_SCREEN_PALETTE("palette")
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_size(320, 200); /* 40x25 8x8 chars */
+ screen.set_visarea(0, 320-1, 0, 200-1);
+ screen.set_screen_update(FUNC(i7000_state::screen_update_i7000));
+ screen.set_palette("palette");
GFXDECODE(config, m_gfxdecode, "palette", gfx_i7000);
PALETTE(config, "palette", FUNC(i7000_state::i7000_palette), 2);
@@ -392,7 +391,7 @@ MACHINE_CONFIG_START(i7000_state::i7000)
MCFG_GENERIC_LOAD(i7000_state, i7000_card)
/* Software lists */
- MCFG_SOFTWARE_LIST_ADD("card_list", "i7000_card")
+ SOFTWARE_LIST(config, "card_list").set_original("i7000_card");
MACHINE_CONFIG_END
ROM_START( i7000 )
diff --git a/src/mame/drivers/ibm3153.cpp b/src/mame/drivers/ibm3153.cpp
index 5312285d329..fb0406395d3 100644
--- a/src/mame/drivers/ibm3153.cpp
+++ b/src/mame/drivers/ibm3153.cpp
@@ -103,23 +103,24 @@ void ibm3153_state::machine_reset()
{
}
-MACHINE_CONFIG_START(ibm3153_state::ibm3153)
+void ibm3153_state::ibm3153(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", I80C32, XTAL(16'000'000)) // no idea of clock
- MCFG_DEVICE_PROGRAM_MAP(mem_map)
- MCFG_DEVICE_IO_MAP(io_map)
+ I80C32(config, m_maincpu, XTAL(16'000'000)); // no idea of clock
+ m_maincpu->set_addrmap(AS_PROGRAM, &ibm3153_state::mem_map);
+ m_maincpu->set_addrmap(AS_IO, &ibm3153_state::io_map);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */
- MCFG_SCREEN_UPDATE_DRIVER(ibm3153_state, screen_update)
- MCFG_SCREEN_SIZE(640, 240)
- MCFG_SCREEN_VISIBLE_AREA(0, 639, 0, 239)
- MCFG_SCREEN_PALETTE("palette")
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */
+ screen.set_screen_update(FUNC(ibm3153_state::screen_update));
+ screen.set_size(640, 240);
+ screen.set_visarea(0, 639, 0, 239);
+ screen.set_palette("palette");
PALETTE(config, "palette", FUNC(ibm3153_state::ibm3153_palette), 3);
-MACHINE_CONFIG_END
+}
/* ROM definition */
ROM_START( ibm3153 )
diff --git a/src/mame/drivers/ibm6580.cpp b/src/mame/drivers/ibm6580.cpp
index f83be36c8d2..8f2639c47b9 100644
--- a/src/mame/drivers/ibm6580.cpp
+++ b/src/mame/drivers/ibm6580.cpp
@@ -109,20 +109,19 @@ Displaywriter System Manual S544-2023-0 (?) -- mentioned in US patents 4648071 a
#define UPD765_TAG "upd765"
-#define VERBOSE_DBG 2 /* general debug messages */
+//#define LOG_GENERAL (1U << 0) //defined in logmacro.h already
+#define LOG_KEYBOARD (1U << 1)
+#define LOG_DEBUG (1U << 2)
-#define DBG_LOG(N,M,A) \
- do { \
- if(VERBOSE_DBG>=N) \
- { \
- if( M ) \
- logerror("%11.6f at %s: %-10s",machine().time().as_double(),machine().describe_context(),(char*)M ); \
- logerror A; \
- } \
- } while (0)
+//#define VERBOSE (LOG_DEBUG)
+//#define LOG_OUTPUT_FUNC printf
+#include "logmacro.h"
+#define LOGKBD(...) LOGMASKED(LOG_KEYBOARD, __VA_ARGS__)
+#define LOGDBG(...) LOGMASKED(LOG_DEBUG, __VA_ARGS__)
-uint8_t gfx_expand[16] = {
+
+const uint8_t gfx_expand[16] = {
0x00, 0x03, 0x0c, 0x0f,
0x30, 0x33, 0x3c, 0x3f,
0xc0, 0xc3, 0xcc, 0xcf,
@@ -225,7 +224,7 @@ private:
WRITE8_MEMBER(ibm6580_state::p40_w)
{
- DBG_LOG(2,"___", ("%02x <- %02x\n", 0x40 + (offset << 1), data));
+ LOG("___ %02x <- %02x\n", 0x40 + (offset << 1), data);
switch (offset)
{
@@ -281,14 +280,14 @@ READ8_MEMBER(ibm6580_state::p40_r)
break;
}
- DBG_LOG(3,"___", ("%02x == %02x\n", 0x40 + (offset << 1), data));
+ LOGDBG("___ %02x == %02x\n", 0x40 + (offset << 1), data);
return data;
}
WRITE8_MEMBER(ibm6580_state::video_w)
{
- DBG_LOG(2,"Video", ("%02x <- %02x\n", 0xe000 + (offset << 1), data));
+ LOG("Video %02x <- %02x\n", 0xe000 + (offset << 1), data);
switch (offset)
{
@@ -320,7 +319,7 @@ READ8_MEMBER(ibm6580_state::video_r)
}
if (offset != 8)
- DBG_LOG(2,"Video", ("%02x == %02x\n", 0xe000 + (offset << 1), data));
+ LOG("Video %02x == %02x\n", 0xe000 + (offset << 1), data);
return data;
}
@@ -336,7 +335,7 @@ WRITE_LINE_MEMBER(ibm6580_state::vblank_w)
WRITE16_MEMBER(ibm6580_state::pic_latch_w)
{
- DBG_LOG(2,"PIC", ("latch <- %02x\n", data));
+ LOG("PIC latch <- %02x\n", data);
if (data)
m_p40 |= 8;
@@ -353,7 +352,7 @@ WRITE16_MEMBER(ibm6580_state::pic_latch_w)
WRITE16_MEMBER(ibm6580_state::unk_latch_w)
{
- DBG_LOG(2,"UNK", ("latch <- %02x\n", data));
+ LOG("UNK latch <- %02x\n", data);
m_p40 |= 0x10;
}
@@ -422,7 +421,7 @@ WRITE8_MEMBER(ibm6580_state::led_w)
WRITE8_MEMBER(ibm6580_state::ppi_c_w)
{
- DBG_LOG(2,"PPI", ("Port C <- %02x\n", data));
+ LOG("PPI Port C <- %02x\n", data);
// bit 5 -- acknowledge
// bit 6 -- reset
@@ -442,7 +441,7 @@ READ8_MEMBER(ibm6580_state::ppi_c_r)
data |= (m_kb_strobe << 3);
- DBG_LOG(3,"PPI", ("Port C == %02x\n", data));
+ LOGDBG("PPI Port C == %02x\n", data);
return data;
}
@@ -451,7 +450,7 @@ READ8_MEMBER(ibm6580_state::ppi_a_r)
{
uint8_t data = m_kb_fifo.dequeue();
- DBG_LOG(2,"PPI", ("Port A == %02x (fifo full: %d)\n", data, m_kb_fifo.full()));
+ LOG("PPI Port A == %02x (fifo full: %d)\n", data, m_kb_fifo.full());
return data;
}
@@ -472,7 +471,7 @@ WRITE_LINE_MEMBER(ibm6580_state::kb_strobe_w)
m_kb_strobe = !state;
if (!state && BIT(m_ppi_c, 0)) {
m_kb_fifo.enqueue(m_kb_data);
- DBG_LOG(1,"Kbd", ("enqueue %02x (fifo full: %d, m_ppi_c %02x)\n", m_kb_data, m_kb_fifo.full(), m_ppi_c));
+ LOGKBD("Kbd enqueue %02x (fifo full: %d, m_ppi_c %02x)\n", m_kb_data, m_kb_fifo.full(), m_ppi_c);
}
}
@@ -519,7 +518,7 @@ uint8_t ibm6580_state::floppy_mcu_command()
{
uint8_t data = 0, command = m_floppy_mcu_cr.dequeue(), i;
- DBG_LOG(2,"Floppy", ("mcu_command %02x\n", command));
+ LOG("Floppy mcu_command %02x\n", command);
m_floppy_mcu_sr.clear();
m_floppy_idle = true;
@@ -604,7 +603,7 @@ uint8_t ibm6580_state::floppy_mcu_command()
WRITE8_MEMBER(ibm6580_state::floppy_w)
{
- DBG_LOG(2,"Floppy", ("%02x <- %02x\n", 0x8150 + (offset << 1), data));
+ LOG("Floppy %02x <- %02x\n", 0x8150 + (offset << 1), data);
switch (offset)
{
@@ -618,7 +617,7 @@ WRITE8_MEMBER(ibm6580_state::floppy_w)
break;
case 5: // 815A
- m_fdc->fifo_w(space, offset, data);
+ m_fdc->fifo_w(data);
if (m_floppy_idle)
m_floppy_idle = false;
break;
@@ -647,11 +646,11 @@ READ8_MEMBER(ibm6580_state::floppy_r)
break;
case 4: // 8158
- data = m_fdc->msr_r(space, offset);
+ data = m_fdc->msr_r();
break;
case 5: // 815a
- data = m_fdc->fifo_r(space, offset);
+ data = m_fdc->fifo_r();
break;
case 6: // 815c
@@ -661,22 +660,20 @@ READ8_MEMBER(ibm6580_state::floppy_r)
}
if (offset)
- DBG_LOG(2,"Floppy", ("%02x == %02x\n", 0x8150 + (offset << 1), data));
+ LOG("Floppy %02x == %02x\n", 0x8150 + (offset << 1), data);
else {
floppy_image_device *f = m_flop0->get_device();
if (f)
- DBG_LOG(2,"Floppy", ("%02x == %02x (empty %d hdl %d + idle %d irq %d drq %d + dskchg %d idx %d cyl %d)\n",
- 0x8150 + (offset << 1), data,
- m_floppy_mcu_sr.empty(), m_floppy_hdl,
- m_floppy_idle, m_fdc->get_irq(), m_fdc->get_drq(),
- f->dskchg_r(), f->idx_r(), f->get_cyl()
- ));
+ LOG("Floppy %02x == %02x (empty %d hdl %d + idle %d irq %d drq %d + dskchg %d idx %d cyl %d)\n",
+ 0x8150 + (offset << 1), data,
+ m_floppy_mcu_sr.empty(), m_floppy_hdl,
+ m_floppy_idle, m_fdc->get_irq(), m_fdc->get_drq(),
+ f->dskchg_r(), f->idx_r(), f->get_cyl());
else
- DBG_LOG(2,"Floppy", ("%02x == %02x (idle %d irq %d drq %d)\n",
- 0x8150 + (offset << 1), data,
- m_floppy_idle, m_fdc->get_irq(), m_fdc->get_drq()
- ));
+ LOG("Floppy %02x == %02x (idle %d irq %d drq %d)\n",
+ 0x8150 + (offset << 1), data,
+ m_floppy_idle, m_fdc->get_irq(), m_fdc->get_drq());
}
return data;
@@ -881,19 +878,21 @@ static void dw_floppies(device_slot_interface &device)
device.option_add("8sssd", IBM_6360);
}
-MACHINE_CONFIG_START(ibm6580_state::ibm6580)
- MCFG_DEVICE_ADD("maincpu", I8086, 14.7456_MHz_XTAL / 3)
- MCFG_DEVICE_PROGRAM_MAP(ibm6580_mem)
- MCFG_DEVICE_IO_MAP(ibm6580_io)
- MCFG_DEVICE_IRQ_ACKNOWLEDGE_DEVICE("pic8259", pic8259_device, inta_cb)
+void ibm6580_state::ibm6580(machine_config &config)
+{
+ I8086(config, m_maincpu, 14.7456_MHz_XTAL / 3);
+ m_maincpu->set_addrmap(AS_PROGRAM, &ibm6580_state::ibm6580_mem);
+ m_maincpu->set_addrmap(AS_IO, &ibm6580_state::ibm6580_io);
+ m_maincpu->set_irq_acknowledge_callback("pic8259", FUNC(pic8259_device::inta_cb));
RAM(config, RAM_TAG).set_default_size("128K").set_extra_options("160K,192K,224K,256K,320K,384K");
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_RAW_PARAMS(25_MHz_XTAL / 2, 833, 0, 640, 428, 0, 400)
- MCFG_SCREEN_UPDATE_DRIVER(ibm6580_state, screen_update)
- MCFG_SCREEN_PALETTE("palette")
- MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE(*this, ibm6580_state, vblank_w))
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_raw(25_MHz_XTAL / 2, 833, 0, 640, 428, 0, 400);
+ m_screen->set_screen_update(FUNC(ibm6580_state::screen_update));
+ m_screen->set_palette("palette");
+ m_screen->screen_vblank().set(FUNC(ibm6580_state::vblank_w));
+
config.set_default_layout(layout_ibm6580);
PALETTE(config, "palette", FUNC(ibm6580_state::ibm6580_palette), 3);
@@ -907,7 +906,7 @@ MACHINE_CONFIG_START(ibm6580_state::ibm6580)
ppi.out_pc_callback().set(FUNC(ibm6580_state::ppi_c_w));
ppi.in_pc_callback().set(FUNC(ibm6580_state::ppi_c_r));
- MCFG_DEVICE_ADD("pit8253", PIT8253, 0)
+ PIT8253(config, m_pit8253, 0);
DW_KEYBOARD(config, m_kbd, 0);
m_kbd->out_data_handler().set(FUNC(ibm6580_state::kb_data_w));
@@ -920,15 +919,15 @@ MACHINE_CONFIG_START(ibm6580_state::ibm6580)
m_dma8257->out_tc_cb().set(m_fdc, FUNC(upd765a_device::tc_line_w));
m_dma8257->in_memr_cb().set(FUNC(ibm6580_state::memory_read_byte));
m_dma8257->out_memw_cb().set(FUNC(ibm6580_state::memory_write_byte));
- m_dma8257->in_ior_cb<0>().set(m_fdc, FUNC(upd765a_device::mdma_r));
- m_dma8257->out_iow_cb<0>().set(m_fdc, FUNC(upd765a_device::mdma_w));
+ m_dma8257->in_ior_cb<0>().set(m_fdc, FUNC(upd765a_device::dma_r));
+ m_dma8257->out_iow_cb<0>().set(m_fdc, FUNC(upd765a_device::dma_w));
UPD765A(config, m_fdc, 24_MHz_XTAL / 3, false, false);
m_fdc->intrq_wr_callback().set(FUNC(ibm6580_state::floppy_intrq));
// m_fdc->intrq_wr_callback().append(m_pic8259, FUNC(pic8259_device::ir4_w));
m_fdc->drq_wr_callback().set(m_dma8257, FUNC(i8257_device::dreq0_w));
- MCFG_FLOPPY_DRIVE_ADD(UPD765_TAG ":0", dw_floppies, "8sssd", floppy_image_device::default_floppy_formats)
- MCFG_FLOPPY_DRIVE_ADD(UPD765_TAG ":1", dw_floppies, "8sssd", floppy_image_device::default_floppy_formats)
+ FLOPPY_CONNECTOR(config, UPD765_TAG ":0", dw_floppies, "8sssd", floppy_image_device::default_floppy_formats);
+ FLOPPY_CONNECTOR(config, UPD765_TAG ":1", dw_floppies, "8sssd", floppy_image_device::default_floppy_formats);
i8251_device &upd8251a(I8251(config, "upd8251a", 0));
upd8251a.txd_handler().set("rs232a", FUNC(rs232_port_device::write_txd));
@@ -954,8 +953,8 @@ MACHINE_CONFIG_START(ibm6580_state::ibm6580)
rs232b.dsr_handler().set("upd8251b", FUNC(i8251_device::write_dsr));
rs232b.cts_handler().set("upd8251b", FUNC(i8251_device::write_cts));
- MCFG_SOFTWARE_LIST_ADD("flop_list", "ibm6580")
-MACHINE_CONFIG_END
+ SOFTWARE_LIST(config, "flop_list").set_original("ibm6580");
+}
/* ROM definition */
ROM_START( ibm6580 )
diff --git a/src/mame/drivers/ibmpc.cpp b/src/mame/drivers/ibmpc.cpp
index 17252e45276..e9e5e3c330c 100644
--- a/src/mame/drivers/ibmpc.cpp
+++ b/src/mame/drivers/ibmpc.cpp
@@ -295,70 +295,74 @@ static DEVICE_INPUT_DEFAULTS_START(cga)
DEVICE_INPUT_DEFAULTS("DSW0",0x30, 0x20)
DEVICE_INPUT_DEFAULTS_END
-MACHINE_CONFIG_START(ibmpc_state::ibm5150)
+void ibmpc_state::ibm5150(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", I8088, XTAL(14'318'181)/3)
- MCFG_DEVICE_PROGRAM_MAP(pc8_map)
- MCFG_DEVICE_IO_MAP(pc8_io)
- MCFG_DEVICE_IRQ_ACKNOWLEDGE_DEVICE("mb:pic8259", pic8259_device, inta_cb)
+ I8088(config, m_maincpu, XTAL(14'318'181)/3);
+ m_maincpu->set_addrmap(AS_PROGRAM, &ibmpc_state::pc8_map);
+ m_maincpu->set_addrmap(AS_IO, &ibmpc_state::pc8_io);
+ m_maincpu->set_irq_acknowledge_callback("mb:pic8259", FUNC(pic8259_device::inta_cb));
- MCFG_IBM5150_MOTHERBOARD_ADD("mb","maincpu")
- MCFG_DEVICE_INPUT_DEFAULTS(cga)
+ ibm5150_mb_device &mb(IBM5150_MOTHERBOARD(config, "mb", 0));
+ mb.set_cputag(m_maincpu);
+ mb.set_input_default(DEVICE_INPUT_DEFAULTS_NAME(cga));
- MCFG_DEVICE_ADD("isa1", ISA8_SLOT, 0, "mb:isa", pc_isa8_cards, "cga", false) // FIXME: determine ISA bus clock
- MCFG_DEVICE_ADD("isa2", ISA8_SLOT, 0, "mb:isa", pc_isa8_cards, "com", false)
- MCFG_DEVICE_ADD("isa3", ISA8_SLOT, 0, "mb:isa", pc_isa8_cards, "fdc_xt", false)
- MCFG_DEVICE_ADD("isa4", ISA8_SLOT, 0, "mb:isa", pc_isa8_cards, "hdc", false)
- MCFG_DEVICE_ADD("isa5", ISA8_SLOT, 0, "mb:isa", pc_isa8_cards, nullptr, false)
+ ISA8_SLOT(config, "isa1", 0, "mb:isa", pc_isa8_cards, "cga", false); // FIXME: determine ISA bus clock
+ ISA8_SLOT(config, "isa2", 0, "mb:isa", pc_isa8_cards, "com", false);
+ ISA8_SLOT(config, "isa3", 0, "mb:isa", pc_isa8_cards, "fdc_xt", false);
+ ISA8_SLOT(config, "isa4", 0, "mb:isa", pc_isa8_cards, "hdc", false);
+ ISA8_SLOT(config, "isa5", 0, "mb:isa", pc_isa8_cards, nullptr, false);
/* keyboard */
- MCFG_PC_KBDC_SLOT_ADD("mb:pc_kbdc", "kbd", pc_xt_keyboards, STR_KBD_KEYTRONIC_PC3270)
+ PC_KBDC_SLOT(config, "kbd", pc_xt_keyboards, STR_KBD_KEYTRONIC_PC3270).set_pc_kbdc_slot(subdevice("mb:pc_kbdc"));
/* internal ram */
RAM(config, RAM_TAG).set_default_size("640K").set_extra_options("64K, 128K, 256K, 512K");
/* software lists */
- MCFG_SOFTWARE_LIST_ADD("disk_list","ibm5150")
- MCFG_SOFTWARE_LIST_ADD("cass_list","ibm5150_cass")
-MACHINE_CONFIG_END
+ SOFTWARE_LIST(config, "disk_list").set_original("ibm5150");
+ SOFTWARE_LIST(config, "cass_list").set_original("ibm5150_cass");
+}
-MACHINE_CONFIG_START(ibmpc_state::ibm5140)
+void ibmpc_state::ibm5140(machine_config &config)
+{
ibm5150(config);
/* software lists */
- MCFG_DEVICE_REMOVE( "disk_list" )
- MCFG_SOFTWARE_LIST_ADD("disk_list","ibm5140")
-MACHINE_CONFIG_END
+ SOFTWARE_LIST(config.replace(), "disk_list").set_original("ibm5140");
+}
-MACHINE_CONFIG_START(ibmpc_state::ibm5160)
+void ibmpc_state::ibm5160(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", I8088, XTAL(14'318'181)/3)
- MCFG_DEVICE_PROGRAM_MAP(pc8_map)
- MCFG_DEVICE_IO_MAP(pc8_io)
- MCFG_DEVICE_IRQ_ACKNOWLEDGE_DEVICE("mb:pic8259", pic8259_device, inta_cb)
-
- MCFG_IBM5160_MOTHERBOARD_ADD("mb","maincpu")
- MCFG_DEVICE_INPUT_DEFAULTS(cga)
-
- MCFG_DEVICE_ADD("isa1", ISA8_SLOT, 0, "mb:isa", pc_isa8_cards, "cga", false) // FIXME: determine ISA bus clock
- MCFG_DEVICE_ADD("isa2", ISA8_SLOT, 0, "mb:isa", pc_isa8_cards, "com", false)
- MCFG_DEVICE_ADD("isa3", ISA8_SLOT, 0, "mb:isa", pc_isa8_cards, "fdc_xt", false)
- MCFG_DEVICE_ADD("isa4", ISA8_SLOT, 0, "mb:isa", pc_isa8_cards, "hdc", false)
- MCFG_DEVICE_ADD("isa5", ISA8_SLOT, 0, "mb:isa", pc_isa8_cards, nullptr, false)
- MCFG_DEVICE_ADD("isa6", ISA8_SLOT, 0, "mb:isa", pc_isa8_cards, nullptr, false)
- MCFG_DEVICE_ADD("isa7", ISA8_SLOT, 0, "mb:isa", pc_isa8_cards, nullptr, false)
- MCFG_DEVICE_ADD("isa8", ISA8_SLOT, 0, "mb:isa", pc_isa8_cards, nullptr, false)
+ I8088(config, m_maincpu, XTAL(14'318'181)/3);
+ m_maincpu->set_addrmap(AS_PROGRAM, &ibmpc_state::pc8_map);
+ m_maincpu->set_addrmap(AS_IO, &ibmpc_state::pc8_io);
+ m_maincpu->set_irq_acknowledge_callback("mb:pic8259", FUNC(pic8259_device::inta_cb));
+
+ ibm5160_mb_device &mb(IBM5160_MOTHERBOARD(config, "mb", 0));
+ mb.set_cputag(m_maincpu);
+ mb.set_input_default(DEVICE_INPUT_DEFAULTS_NAME(cga));
+
+ ISA8_SLOT(config, "isa1", 0, "mb:isa", pc_isa8_cards, "cga", false); // FIXME: determine ISA bus clock
+ ISA8_SLOT(config, "isa2", 0, "mb:isa", pc_isa8_cards, "com", false);
+ ISA8_SLOT(config, "isa3", 0, "mb:isa", pc_isa8_cards, "fdc_xt", false);
+ ISA8_SLOT(config, "isa4", 0, "mb:isa", pc_isa8_cards, "hdc", false);
+ ISA8_SLOT(config, "isa5", 0, "mb:isa", pc_isa8_cards, nullptr, false);
+ ISA8_SLOT(config, "isa6", 0, "mb:isa", pc_isa8_cards, nullptr, false);
+ ISA8_SLOT(config, "isa7", 0, "mb:isa", pc_isa8_cards, nullptr, false);
+ ISA8_SLOT(config, "isa8", 0, "mb:isa", pc_isa8_cards, nullptr, false);
/* keyboard */
- MCFG_PC_KBDC_SLOT_ADD("mb:pc_kbdc", "kbd", pc_xt_keyboards, STR_KBD_IBM_PC_XT_83)
+ PC_KBDC_SLOT(config, "kbd", pc_xt_keyboards, STR_KBD_IBM_PC_XT_83).set_pc_kbdc_slot(subdevice("mb:pc_kbdc"));
/* internal ram */
RAM(config, RAM_TAG).set_default_size("640K").set_extra_options("64K, 128K, 256K, 512K");
/* software lists */
- MCFG_SOFTWARE_LIST_ADD("pc_disk_list","ibm5150")
-MACHINE_CONFIG_END
+ SOFTWARE_LIST(config, "pc_disk_list").set_original("ibm5150");
+}
ROM_START( ibm5150 )
diff --git a/src/mame/drivers/ibmpcjr.cpp b/src/mame/drivers/ibmpcjr.cpp
index fbb9e3aa502..caeaea3ba4b 100644
--- a/src/mame/drivers/ibmpcjr.cpp
+++ b/src/mame/drivers/ibmpcjr.cpp
@@ -571,7 +571,7 @@ void pcjr_state::ibmpcjr_io(address_map &map)
map(0x0040, 0x0043).rw(m_pit8253, FUNC(pit8253_device::read), FUNC(pit8253_device::write));
map(0x0060, 0x0063).rw("ppi8255", FUNC(i8255_device::read), FUNC(i8255_device::write));
map(0x00a0, 0x00a0).rw(FUNC(pcjr_state::pcjr_nmi_enable_r), FUNC(pcjr_state::pc_nmi_enable_w));
- map(0x00c0, 0x00c0).w("sn76496", FUNC(sn76496_device::command_w));
+ map(0x00c0, 0x00c0).w("sn76496", FUNC(sn76496_device::write));
map(0x00f2, 0x00f2).w(FUNC(pcjr_state::pcjr_fdc_dor_w));
map(0x00f4, 0x00f5).m(m_fdc, FUNC(upd765a_device::map));
map(0x0200, 0x0207).rw("pc_joy", FUNC(pc_joy_device::joy_port_r), FUNC(pc_joy_device::joy_port_w));
@@ -638,17 +638,14 @@ MACHINE_CONFIG_START(pcjr_state::ibmpcjr)
serport.cts_handler().set("ins8250", FUNC(ins8250_uart_device::cts_w));
/* video hardware */
- MCFG_DEVICE_ADD("pcvideo_pcjr", PCVIDEO_PCJR, 0)
- MCFG_VIDEO_SET_SCREEN("pcvideo_pcjr:screen")
+ PCVIDEO_PCJR(config, "pcvideo_pcjr", 0).set_screen("pcvideo_pcjr:screen");
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "pcvideo_pcjr:palette", gfx_pcjr)
+ GFXDECODE(config, "gfxdecode", "pcvideo_pcjr:palette", gfx_pcjr);
/* sound hardware */
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("speaker", SPEAKER_SOUND)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.80)
- MCFG_DEVICE_ADD("sn76496", SN76496, XTAL(14'318'181)/4)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.80)
+ SPEAKER_SOUND(config, "speaker").add_route(ALL_OUTPUTS, "mono", 0.80);
+ SN76496(config, "sn76496", XTAL(14'318'181)/4).add_route(ALL_OUTPUTS, "mono", 0.80);
/* printer */
pc_lpt_device &lpt0(PC_LPT(config, "lpt_0"));
@@ -657,15 +654,15 @@ MACHINE_CONFIG_START(pcjr_state::ibmpcjr)
PC_JOY(config, "pc_joy");
/* cassette */
- MCFG_CASSETTE_ADD( "cassette")
- MCFG_CASSETTE_DEFAULT_STATE(CASSETTE_PLAY | CASSETTE_MOTOR_DISABLED | CASSETTE_SPEAKER_ENABLED)
+ CASSETTE(config, m_cassette);
+ m_cassette->set_default_state(CASSETTE_PLAY | CASSETTE_MOTOR_DISABLED | CASSETTE_SPEAKER_ENABLED);
UPD765A(config, m_fdc, 8'000'000, false, false);
- MCFG_FLOPPY_DRIVE_ADD("fdc:0", pcjr_floppies, "525dd", isa8_fdc_device::floppy_formats)
- MCFG_SLOT_FIXED(true)
+ FLOPPY_CONNECTOR(config, "fdc:0", pcjr_floppies, "525dd", isa8_fdc_device::floppy_formats, true);
- MCFG_PC_KEYB_ADD("pc_keyboard", WRITELINE(*this, pcjr_state, keyb_interrupt))
+ PC_KEYB(config, m_keyboard);
+ m_keyboard->keypress().set(FUNC(pcjr_state::keyb_interrupt));
/* cartridge */
MCFG_GENERIC_CARTSLOT_ADD("cartslot1", generic_plain_slot, "ibmpcjr_cart")
@@ -680,9 +677,9 @@ MACHINE_CONFIG_START(pcjr_state::ibmpcjr)
RAM(config, m_ram).set_default_size("640K").set_extra_options("128K, 256K, 512K");
/* Software lists */
- MCFG_SOFTWARE_LIST_ADD("cart_list","ibmpcjr_cart")
- MCFG_SOFTWARE_LIST_ADD("flop_list","ibmpcjr_flop")
- MCFG_SOFTWARE_LIST_COMPATIBLE_ADD("pc_list","ibm5150")
+ SOFTWARE_LIST(config, "cart_list").set_original("ibmpcjr_cart");
+ SOFTWARE_LIST(config, "flop_list").set_original("ibmpcjr_flop");
+ SOFTWARE_LIST(config, "pc_list").set_compatible("ibm5150");
MACHINE_CONFIG_END
static GFXDECODE_START( gfx_ibmpcjx )
@@ -690,22 +687,22 @@ static GFXDECODE_START( gfx_ibmpcjx )
GFXDECODE_ENTRY( "kanji", 0x0000, kanji_layout, 3, 1 )
GFXDECODE_END
-MACHINE_CONFIG_START(pcjr_state::ibmpcjx)
+void pcjr_state::ibmpcjx(machine_config &config)
+{
ibmpcjr(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(ibmpcjx_map)
- MCFG_DEVICE_IO_MAP(ibmpcjx_io)
- MCFG_DEVICE_REMOVE("fdc:0");
- MCFG_FLOPPY_DRIVE_ADD("fdc:0", pcjr_floppies, "35dd", isa8_fdc_device::floppy_formats)
- MCFG_SLOT_FIXED(true)
- MCFG_FLOPPY_DRIVE_ADD("fdc:1", pcjr_floppies, "35dd", isa8_fdc_device::floppy_formats)
- MCFG_SLOT_FIXED(true)
+ m_maincpu->set_addrmap(AS_PROGRAM, &pcjr_state::ibmpcjx_map);
+ m_maincpu->set_addrmap(AS_IO, &pcjr_state::ibmpcjx_io);
+
+ config.device_remove("fdc:0");
+ FLOPPY_CONNECTOR(config, "fdc:0", pcjr_floppies, "35dd", isa8_fdc_device::floppy_formats, true);
+ FLOPPY_CONNECTOR(config, "fdc:1", pcjr_floppies, "35dd", isa8_fdc_device::floppy_formats, true);
+
+ subdevice<gfxdecode_device>("gfxdecode")->set_info(gfx_ibmpcjx);
- MCFG_GFXDECODE_MODIFY("gfxdecode", gfx_ibmpcjx)
/* internal ram */
m_ram->set_default_size("512K").set_extra_options(""); // only boots with 512k currently
-MACHINE_CONFIG_END
+}
diff --git a/src/mame/drivers/icatel.cpp b/src/mame/drivers/icatel.cpp
index 2c46896b84d..52581ce4300 100644
--- a/src/mame/drivers/icatel.cpp
+++ b/src/mame/drivers/icatel.cpp
@@ -254,7 +254,8 @@ HD44780_PIXEL_UPDATE(icatel_state::icatel_pixel_update)
}
}
-MACHINE_CONFIG_START(icatel_state::icatel)
+void icatel_state::icatel(machine_config &config)
+{
/* basic machine hardware */
I80C31(config, m_maincpu, XTAL(2'097'152));
m_maincpu->set_addrmap(AS_PROGRAM, &icatel_state::i80c31_prg);
@@ -266,21 +267,21 @@ MACHINE_CONFIG_START(icatel_state::icatel)
m_maincpu->port_out_cb<3>().set(FUNC(icatel_state::i80c31_p3_w));
/* video hardware */
- MCFG_SCREEN_ADD("screen", LCD)
- MCFG_SCREEN_REFRESH_RATE(50)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */
- MCFG_SCREEN_UPDATE_DEVICE("hd44780", hd44780_device, screen_update)
- MCFG_SCREEN_SIZE(6*16, 9*2)
- MCFG_SCREEN_VISIBLE_AREA(0, 6*16-1, 0, 9*2-1)
- MCFG_SCREEN_PALETTE("palette")
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_LCD));
+ screen.set_refresh_hz(50);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */
+ screen.set_screen_update("hd44780", FUNC(hd44780_device::screen_update));
+ screen.set_size(6*16, 9*2);
+ screen.set_visarea(0, 6*16-1, 0, 9*2-1);
+ screen.set_palette("palette");
PALETTE(config, "palette", FUNC(icatel_state::icatel_palette), 2);
GFXDECODE(config, "gfxdecode", "palette", gfx_icatel);
- MCFG_HD44780_ADD("hd44780")
- MCFG_HD44780_LCD_SIZE(2, 16)
- MCFG_HD44780_PIXEL_UPDATE_CB(icatel_state, icatel_pixel_update)
-MACHINE_CONFIG_END
+ HD44780(config, m_lcdc, 0);
+ m_lcdc->set_lcd_size(2, 16);
+ m_lcdc->set_pixel_update_cb(FUNC(icatel_state::icatel_pixel_update), this);
+}
ROM_START( icatel )
ROM_REGION( 0x8000, "maincpu", 0 )
diff --git a/src/mame/drivers/ice_bozopail.cpp b/src/mame/drivers/ice_bozopail.cpp
index fded5792af3..94eba8818c4 100644
--- a/src/mame/drivers/ice_bozopail.cpp
+++ b/src/mame/drivers/ice_bozopail.cpp
@@ -58,15 +58,15 @@ void ice_bozopail_state::machine_reset()
}
-MACHINE_CONFIG_START(ice_bozopail_state::ice_bozo)
-
+void ice_bozopail_state::ice_bozo(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", MC68HC11, 8000000) // unknown clock
- MCFG_DEVICE_PROGRAM_MAP(ice_bozo_map)
+ MC68HC11(config, m_maincpu, 8000000); // unknown clock
+ m_maincpu->set_addrmap(AS_PROGRAM, &ice_bozopail_state::ice_bozo_map);
/* sound hardware */
SPEAKER(config, "mono").front_center();
-MACHINE_CONFIG_END
+}
diff --git a/src/mame/drivers/ice_tbd.cpp b/src/mame/drivers/ice_tbd.cpp
index 22955fde737..33922745ace 100644
--- a/src/mame/drivers/ice_tbd.cpp
+++ b/src/mame/drivers/ice_tbd.cpp
@@ -66,18 +66,18 @@ void ice_tbd_state::machine_reset()
{
}
-MACHINE_CONFIG_START(ice_tbd_state::ice_tbd)
-
+void ice_tbd_state::ice_tbd(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80,8000000) /* ? MHz */
- MCFG_DEVICE_PROGRAM_MAP(ice_tbd_map)
- MCFG_DEVICE_IO_MAP(ice_tbd_io_map)
+ Z80(config, m_maincpu, 8000000); /* ? MHz */
+ m_maincpu->set_addrmap(AS_PROGRAM, &ice_tbd_state::ice_tbd_map);
+ m_maincpu->set_addrmap(AS_IO, &ice_tbd_state::ice_tbd_io_map);
i8255_device &ppi(I8255(config, "ppi"));
ppi.out_pa_callback().set_nop(); // ?
ppi.out_pb_callback().set_nop(); // ?
ppi.in_pc_callback().set_constant(0); // ?
-MACHINE_CONFIG_END
+}
ROM_START( ice_tbd )
diff --git a/src/mame/drivers/icebox.cpp b/src/mame/drivers/icebox.cpp
index 6637f7233e8..9c2a70ee9ea 100644
--- a/src/mame/drivers/icebox.cpp
+++ b/src/mame/drivers/icebox.cpp
@@ -251,8 +251,8 @@ INPUT_PORTS_END
void icebox_state::machine_reset()
{
u8 data = ioport("BAUD")->read();
- m_brg->write_str(data & 15); // Terminal
- m_brg->write_stt((data >> 4) & 15); // Printer
+ m_brg->str_w(data & 15); // Terminal
+ m_brg->stt_w((data >> 4) & 15); // Printer
m_maincpu->set_pc(0xf000);
m_f1 = 0;
}
@@ -307,11 +307,12 @@ static DEVICE_INPUT_DEFAULTS_START( terminal ) // we need to remove bit 7 which
DEVICE_INPUT_DEFAULTS( "RS232_STOPBITS", 0xff, RS232_STOPBITS_2 )
DEVICE_INPUT_DEFAULTS_END
-MACHINE_CONFIG_START(icebox_state::icebox)
+void icebox_state::icebox(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu",Z80, 9'830'400 / 4) // unknown divisor
- MCFG_DEVICE_PROGRAM_MAP(mem_map)
- MCFG_DEVICE_IO_MAP(io_map)
+ Z80(config, m_maincpu, 9'830'400 / 4); // unknown divisor
+ m_maincpu->set_addrmap(AS_PROGRAM, &icebox_state::mem_map);
+ m_maincpu->set_addrmap(AS_IO, &icebox_state::io_map);
I8251(config, m_uart0, 0);
m_uart0->txd_handler().set("rs232a", FUNC(rs232_port_device::write_txd));
@@ -342,11 +343,9 @@ MACHINE_CONFIG_START(icebox_state::icebox)
FD1771(config, m_fdc, 4_MHz_XTAL / 2);
m_fdc->drq_wr_callback().set(FUNC(icebox_state::drq_w));
- MCFG_FLOPPY_DRIVE_ADD(m_floppy0, floppies, "flop", floppy_image_device::default_floppy_formats)
- MCFG_FLOPPY_DRIVE_SOUND(true)
- MCFG_FLOPPY_DRIVE_ADD(m_floppy1, floppies, "flop", floppy_image_device::default_floppy_formats)
- MCFG_FLOPPY_DRIVE_SOUND(true)
-MACHINE_CONFIG_END
+ FLOPPY_CONNECTOR(config, m_floppy0, floppies, "flop", floppy_image_device::default_floppy_formats).enable_sound(true);
+ FLOPPY_CONNECTOR(config, m_floppy1, floppies, "flop", floppy_image_device::default_floppy_formats).enable_sound(true);
+}
/* ROM definition */
ROM_START( icebox )
diff --git a/src/mame/drivers/icecold.cpp b/src/mame/drivers/icecold.cpp
index a273f44e262..055d81782eb 100644
--- a/src/mame/drivers/icecold.cpp
+++ b/src/mame/drivers/icecold.cpp
@@ -265,9 +265,9 @@ READ8_MEMBER( icecold_state::kbd_r )
WRITE8_MEMBER( icecold_state::snd_ctrl_w )
{
if (m_ay_ctrl & ~data & 0x04)
- m_ay8910[0]->data_address_w(space, m_ay_ctrl & 0x01, m_sound_latch);
+ m_ay8910[0]->data_address_w(m_ay_ctrl & 0x01, m_sound_latch);
if (m_ay_ctrl & ~data & 0x20)
- m_ay8910[1]->data_address_w(space, (m_ay_ctrl>>3) & 0x01, m_sound_latch);
+ m_ay8910[1]->data_address_w((m_ay_ctrl>>3) & 0x01, m_sound_latch);
m_ay_ctrl = data;
}
@@ -280,9 +280,9 @@ WRITE8_MEMBER( icecold_state::ay_w )
READ8_MEMBER( icecold_state::ay_r )
{
if (m_ay_ctrl & 0x02)
- return m_ay8910[0]->data_r(space, 0);
+ return m_ay8910[0]->data_r();
if (m_ay_ctrl & 0x10)
- return m_ay8910[1]->data_r(space, 0);
+ return m_ay8910[1]->data_r();
return 0;
}
diff --git a/src/mame/drivers/ichiban.cpp b/src/mame/drivers/ichiban.cpp
index 5b2229756a1..82e1d83219d 100644
--- a/src/mame/drivers/ichiban.cpp
+++ b/src/mame/drivers/ichiban.cpp
@@ -5,8 +5,6 @@
Ichi Ban Jyan
Excel, 199?
-TODO: code is encrypted (data, not opcodes)
-
PCB Layout
----------
@@ -38,6 +36,7 @@ HSync - 15.510kHz
#include "emu.h"
#include "cpu/z80/z80.h"
+#include "machine/nvram.h"
#include "sound/ay8910.h"
#include "sound/ym2413.h"
#include "emupal.h"
@@ -67,8 +66,9 @@ private:
virtual void video_start() override;
uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
- void ichibanjyan_io(address_map &map);
- void ichibanjyan_map(address_map &map);
+ void mem_map(address_map &map);
+ void io_map(address_map &map);
+ void opcodes_map(address_map &map);
};
void ichibanjyan_state::video_start()
@@ -81,14 +81,24 @@ uint32_t ichibanjyan_state::screen_update( screen_device &screen, bitmap_ind16 &
}
-void ichibanjyan_state::ichibanjyan_map(address_map &map)
+void ichibanjyan_state::mem_map(address_map &map)
{
- map(0x0000, 0x7fff).bankr("bank1");
+ map(0x0000, 0x6fff).rom().region("code", 0x10000);
+ map(0x7000, 0x7fff).ram().share("nvram");
+ map(0x8000, 0xffff).ram();
}
-void ichibanjyan_state::ichibanjyan_io(address_map &map)
+void ichibanjyan_state::io_map(address_map &map)
{
map.global_mask(0xff);
+ map(0x01, 0x01).r("aysnd", FUNC(ym2149_device::data_r));
+ map(0x02, 0x03).w("aysnd", FUNC(ym2149_device::data_address_w));
+ map(0x16, 0x17).w("ymsnd", FUNC(ym2413_device::write));
+}
+
+void ichibanjyan_state::opcodes_map(address_map &map)
+{
+ map(0x0000, 0x6fff).rom().region("code", 0);
}
static INPUT_PORTS_START( ichibanjyan )
@@ -113,9 +123,6 @@ GFXDECODE_END
void ichibanjyan_state::machine_start()
{
- uint8_t *ROM = memregion("code")->base();
-
- membank("bank1")->configure_entries(0, 4, ROM, 0x8000);
}
void ichibanjyan_state::machine_reset()
@@ -123,23 +130,23 @@ void ichibanjyan_state::machine_reset()
}
-MACHINE_CONFIG_START(ichibanjyan_state::ichibanjyan)
-
+void ichibanjyan_state::ichibanjyan(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu",Z80,MAIN_CLOCK/3)
- MCFG_DEVICE_PROGRAM_MAP(ichibanjyan_map)
- MCFG_DEVICE_IO_MAP(ichibanjyan_io)
+ Z80(config, m_maincpu, MAIN_CLOCK/3);
+ m_maincpu->set_addrmap(AS_PROGRAM, &ichibanjyan_state::mem_map);
+ m_maincpu->set_addrmap(AS_IO, &ichibanjyan_state::io_map);
+ m_maincpu->set_addrmap(AS_OPCODES, &ichibanjyan_state::opcodes_map);
+
+ NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_UPDATE_DRIVER(ichibanjyan_state, screen_update)
- MCFG_SCREEN_SIZE(32*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1)
- MCFG_SCREEN_PALETTE("palette")
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_raw(MAIN_CLOCK/3, 396, 0, 320, 256, 0, 224); // dimensions guessed
+ screen.set_screen_update(FUNC(ichibanjyan_state::screen_update));
+ screen.set_palette("palette");
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_ichibanjyan)
+ GFXDECODE(config, "gfxdecode", "palette", gfx_ichibanjyan);
PALETTE(config, "palette", palette_device::RGB_444_PROMS, "proms", 512);
@@ -147,9 +154,8 @@ MACHINE_CONFIG_START(ichibanjyan_state::ichibanjyan)
SPEAKER(config, "mono").front_center();
YM2149(config, "aysnd", MAIN_CLOCK/12).add_route(ALL_OUTPUTS, "mono", 0.30);
- MCFG_DEVICE_ADD("ymsnd", YM2413, MAIN_CLOCK/6)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.5)
-MACHINE_CONFIG_END
+ YM2413(config, "ymsnd", MAIN_CLOCK/6).add_route(ALL_OUTPUTS, "mono", 0.5);
+}
/***************************************************************************
@@ -159,7 +165,7 @@ MACHINE_CONFIG_END
***************************************************************************/
ROM_START( ichiban )
- ROM_REGION( 0x20000, "code", 0 )
+ ROM_REGION( 0x20000, "code", 0 ) // opcodes in first half are mixed with pseudo-random garbage
ROM_LOAD( "3.u15", 0, 0x20000, CRC(76240568) SHA1(cf055d1eaae25661a49ec4722a2c7caca862e66a) )
ROM_REGION( 0x20000, "gfx1", 0 )
diff --git a/src/mame/drivers/idsa.cpp b/src/mame/drivers/idsa.cpp
index dc570538a7b..6598c92e068 100644
--- a/src/mame/drivers/idsa.cpp
+++ b/src/mame/drivers/idsa.cpp
@@ -332,17 +332,18 @@ void idsa_state::machine_reset()
m_irqcnt = 0;
}
-MACHINE_CONFIG_START(idsa_state::idsa)
+void idsa_state::idsa(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, XTAL(8'000'000) / 2)
- MCFG_DEVICE_PROGRAM_MAP(maincpu_map)
- MCFG_DEVICE_IO_MAP(maincpu_io_map)
+ Z80(config, m_maincpu, XTAL(8'000'000) / 2);
+ m_maincpu->set_addrmap(AS_PROGRAM, &idsa_state::maincpu_map);
+ m_maincpu->set_addrmap(AS_IO, &idsa_state::maincpu_io_map);
- MCFG_DEVICE_ADD("irqclk", CLOCK, XTAL(8'000'000) / 4 )
- MCFG_CLOCK_SIGNAL_HANDLER(WRITELINE(*this, idsa_state, clock_w))
+ clock_device &irqclock(CLOCK(config, "irqclock", XTAL(8'000'000) / 4));
+ irqclock.signal_handler().set(FUNC(idsa_state::clock_w));
/* video hardware */
- //MCFG_DEFAULT_LAYOUT()
+ //config.set_default_layout()
/* sound hardware */
genpin_audio(config);
@@ -360,7 +361,7 @@ MACHINE_CONFIG_START(idsa_state::idsa)
aysnd2.port_a_write_callback().set(FUNC(idsa_state::ay2_a_w));
aysnd2.port_b_write_callback().set(FUNC(idsa_state::ay2_b_w));
aysnd2.add_route(ALL_OUTPUTS, "rspeaker", 0.75);
-MACHINE_CONFIG_END
+}
void idsa_state::bsktbllp(machine_config &config)
{
diff --git a/src/mame/drivers/ie15.cpp b/src/mame/drivers/ie15.cpp
index 1af652ce245..4a399674dcd 100644
--- a/src/mame/drivers/ie15.cpp
+++ b/src/mame/drivers/ie15.cpp
@@ -32,9 +32,10 @@ private:
};
-MACHINE_CONFIG_START(ie15_state::ie15)
- MCFG_DEVICE_ADD("ie15", IE15, 0)
-MACHINE_CONFIG_END
+void ie15_state::ie15(machine_config &config)
+{
+ IE15(config, m_ie15, 0);
+}
ROM_START(ie15)
diff --git a/src/mame/drivers/if800.cpp b/src/mame/drivers/if800.cpp
index fe36af9d1e7..48545ba6916 100644
--- a/src/mame/drivers/if800.cpp
+++ b/src/mame/drivers/if800.cpp
@@ -90,31 +90,31 @@ void if800_state::upd7220_map(address_map &map)
map(0x00000, 0x3ffff).ram().share("video_ram");
}
-MACHINE_CONFIG_START(if800_state::if800)
+void if800_state::if800(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", I8086, 8000000)
- MCFG_DEVICE_PROGRAM_MAP(if800_map)
- MCFG_DEVICE_IO_MAP(if800_io)
+ I8086(config, m_maincpu, 8000000);
+ m_maincpu->set_addrmap(AS_PROGRAM, &if800_state::if800_map);
+ m_maincpu->set_addrmap(AS_IO, &if800_state::if800_io);
// PIC8259(config, "pic8259", 0);
UPD7220(config, m_hgdc, 8000000/4);
m_hgdc->set_addrmap(0, &if800_state::upd7220_map);
- m_hgdc->set_display_pixels_callback(FUNC(if800_state::hgdc_display_pixels), this);
+ m_hgdc->set_display_pixels(FUNC(if800_state::hgdc_display_pixels));
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(50)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */
- MCFG_SCREEN_SIZE(640, 480)
- MCFG_SCREEN_VISIBLE_AREA(0, 640-1, 0, 480-1)
- MCFG_SCREEN_UPDATE_DEVICE("upd7220", upd7220_device, screen_update)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(50);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */
+ screen.set_size(640, 480);
+ screen.set_visarea(0, 640-1, 0, 480-1);
+ screen.set_screen_update("upd7220", FUNC(upd7220_device::screen_update));
- MCFG_PALETTE_ADD("palette", 8)
-// MCFG_PALETTE_INIT(black_and_white)
+ PALETTE(config, m_palette).set_entries(8);
// MCFG_VIDEO_START_OVERRIDE(if800_state,if800)
-MACHINE_CONFIG_END
+}
/* ROM definition */
ROM_START( if800 )
diff --git a/src/mame/drivers/igs009.cpp b/src/mame/drivers/igs009.cpp
index d2ab5786bb9..226392ab8cc 100644
--- a/src/mame/drivers/igs009.cpp
+++ b/src/mame/drivers/igs009.cpp
@@ -828,11 +828,12 @@ WRITE_LINE_MEMBER(igs009_state::vblank_irq)
m_maincpu->pulse_input_line(INPUT_LINE_NMI, attotime::zero);
}
-MACHINE_CONFIG_START(igs009_state::jingbell)
+void igs009_state::jingbell(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z180, XTAL(12'000'000) / 2) /* HD64180RP8, 8 MHz? */
- MCFG_DEVICE_PROGRAM_MAP(jingbell_map)
- MCFG_DEVICE_IO_MAP(jingbell_portmap)
+ Z180(config, m_maincpu, XTAL(12'000'000) / 2); /* HD64180RP8, 8 MHz? */
+ m_maincpu->set_addrmap(AS_PROGRAM, &igs009_state::jingbell_map);
+ m_maincpu->set_addrmap(AS_IO, &igs009_state::jingbell_portmap);
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
@@ -847,38 +848,36 @@ MACHINE_CONFIG_START(igs009_state::jingbell)
ppi1.out_pc_callback().set(FUNC(igs009_state::leds_w));
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(512, 256)
- MCFG_SCREEN_VISIBLE_AREA(0, 512-1, 0, 256-16-1)
- MCFG_SCREEN_UPDATE_DRIVER(igs009_state, screen_update)
- MCFG_SCREEN_PALETTE(m_palette)
- MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE(*this, igs009_state, vblank_irq))
-
- MCFG_DEVICE_ADD(m_gfxdecode, GFXDECODE, m_palette, gfx_jingbell)
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_refresh_hz(60);
+ m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ m_screen->set_size(512, 256);
+ m_screen->set_visarea(0, 512-1, 0, 256-16-1);
+ m_screen->set_screen_update(FUNC(igs009_state::screen_update));
+ m_screen->set_palette(m_palette);
+ m_screen->screen_vblank().set(FUNC(igs009_state::vblank_irq));
+
+ GFXDECODE(config, m_gfxdecode, m_palette, gfx_jingbell);
PALETTE(config, m_palette).set_format(palette_device::xBGR_555, 0x400);
/* sound hardware */
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("ymsnd", YM2413, XTAL(3'579'545))
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
+ YM2413(config, "ymsnd", XTAL(3'579'545)).add_route(ALL_OUTPUTS, "mono", 1.0);
- MCFG_DEVICE_ADD("oki", OKIM6295, XTAL(12'000'000) / 12, okim6295_device::PIN7_HIGH)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
-MACHINE_CONFIG_END
+ OKIM6295(config, "oki", XTAL(12'000'000) / 12, okim6295_device::PIN7_HIGH).add_route(ALL_OUTPUTS, "mono", 1.0);
+}
-MACHINE_CONFIG_START(igs009_state::gp98)
+void igs009_state::gp98(machine_config &config)
+{
jingbell(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_IO_MAP(gp98_portmap)
+ m_maincpu->set_addrmap(AS_IO, &igs009_state::gp98_portmap);
- MCFG_GFXDECODE_MODIFY("gfxdecode", gfx_gp98)
+ m_gfxdecode->set_info(gfx_gp98);
MCFG_VIDEO_START_OVERRIDE(igs009_state,gp98)
-MACHINE_CONFIG_END
+}
/***************************************************************************
diff --git a/src/mame/drivers/igs011.cpp b/src/mame/drivers/igs011.cpp
index b19a09763c8..432e8e12bcd 100644
--- a/src/mame/drivers/igs011.cpp
+++ b/src/mame/drivers/igs011.cpp
@@ -246,8 +246,6 @@ private:
DECLARE_WRITE16_MEMBER(vbowl_link_3_w);
uint16_t igs_dips_r(int NUM);
DECLARE_WRITE16_MEMBER(lhb_okibank_w);
- DECLARE_READ16_MEMBER(ics2115_word_r);
- DECLARE_WRITE16_MEMBER(ics2115_word_w);
DECLARE_WRITE_LINE_MEMBER(sound_irq);
TIMER_DEVICE_CALLBACK_MEMBER(lev5_timer_irq_cb);
TIMER_DEVICE_CALLBACK_MEMBER(lhb_timer_irq_cb);
@@ -2840,35 +2838,6 @@ void igs011_state::nkishusp_mem(address_map &map)
}
-
-/* trap15's note:
- * TODO: change this horrible device-> chain to be proper.
- */
-READ16_MEMBER(igs011_state::ics2115_word_r)
-{
- switch(offset)
- {
- case 0: return m_ics->read(space, (offs_t)0);
- case 1: return m_ics->read(space, (offs_t)1);
- case 2: return (m_ics->read(space, (offs_t)3) << 8) | m_ics->read(space, (offs_t)2);
- }
- return 0xff;
-}
-
-WRITE16_MEMBER(igs011_state::ics2115_word_w)
-{
- switch(offset)
- {
- case 1:
- if (ACCESSING_BITS_0_7) m_ics->write(space, 1,data);
- break;
- case 2:
- if (ACCESSING_BITS_0_7) m_ics->write(space, 2,data);
- if (ACCESSING_BITS_8_15) m_ics->write(space, 3,data>>8);
- break;
- }
-}
-
READ16_MEMBER(igs011_state::vbowl_unk_r)
{
return 0xffff;
@@ -2937,7 +2906,7 @@ void igs011_state::vbowl_mem(address_map &map)
map(0x400000, 0x400fff).rw(m_palette, FUNC(palette_device::read8), FUNC(palette_device::write8)).umask16(0x00ff).share("palette");
map(0x401000, 0x401fff).rw(m_palette, FUNC(palette_device::read8_ext), FUNC(palette_device::write8_ext)).umask16(0x00ff).share("palette_ext");
map(0x520000, 0x520001).portr("COIN");
- map(0x600000, 0x600007).rw(FUNC(igs011_state::ics2115_word_r), FUNC(igs011_state::ics2115_word_w));
+ map(0x600000, 0x600007).rw(m_ics, FUNC(ics2115_device::word_r), FUNC(ics2115_device::word_w));
map(0x700000, 0x700003).ram().share("vbowl_trackball");
map(0x700004, 0x700005).w(FUNC(igs011_state::vbowl_pen_hi_w));
map(0x800000, 0x800003).w(FUNC(igs011_state::vbowl_igs003_w));
@@ -4263,7 +4232,7 @@ void igs011_state::lhb2(machine_config &config)
m_maincpu->set_vblank_int("screen", FUNC(igs011_state::irq6_line_hold));
TIMER(config, "timer_irq").configure_periodic(FUNC(igs011_state::lev5_timer_irq_cb), attotime::from_hz(240)); // lev5 frequency drives the music tempo
-// MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, m_palette, gfx_igs011_hi)
+// GFXDECODE(config, "gfxdecode", m_palette, gfx_igs011_hi);
YM2413(config, "ymsnd", XTAL(3'579'545)).add_route(ALL_OUTPUTS, "mono", 2.0);
}
@@ -4278,7 +4247,7 @@ void igs011_state::nkishusp(machine_config &config)
// VSync 60.0052Hz, HSync 15.620kHz
-// MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, m_palette, gfx_igs011_hi)
+// GFXDECODE(config, "gfxdecode", m_palette, gfx_igs011_hi);
YM2413(config, "ymsnd", XTAL(3'579'545)).add_route(ALL_OUTPUTS, "mono", 2.0);
}
diff --git a/src/mame/drivers/igs017.cpp b/src/mame/drivers/igs017.cpp
index 94d3949100b..55f846f3e4b 100644
--- a/src/mame/drivers/igs017.cpp
+++ b/src/mame/drivers/igs017.cpp
@@ -596,12 +596,12 @@ private:
void decrypted_opcodes_map(address_map &map);
void iqblocka_io(address_map &map);
void iqblocka_map(address_map &map);
- void lhzb2(address_map &map);
- void lhzb2a(address_map &map);
- void mgcs(address_map &map);
+ void lhzb2_map(address_map &map);
+ void lhzb2a_map(address_map &map);
+ void mgcs_map(address_map &map);
void mgdha_map(address_map &map);
- void sdmg2(address_map &map);
- void slqz2(address_map &map);
+ void sdmg2_map(address_map &map);
+ void slqz2_map(address_map &map);
void spkrform_io(address_map &map);
void spkrform_map(address_map &map);
void tjsb_io(address_map &map);
@@ -1812,7 +1812,7 @@ READ8_MEMBER(igs017_state::mgcs_keys_r)
return 0xff;
}
-void igs017_state::mgcs(address_map &map)
+void igs017_state::mgcs_map(address_map &map)
{
map(0x000000, 0x07ffff).rom();
map(0x300000, 0x303fff).ram();
@@ -1895,7 +1895,7 @@ READ16_MEMBER(igs017_state::sdmg2_magic_r)
return 0xffff;
}
-void igs017_state::sdmg2(address_map &map)
+void igs017_state::sdmg2_map(address_map &map)
{
map(0x000000, 0x07ffff).rom();
map(0x1f0000, 0x1fffff).ram();
@@ -2202,7 +2202,7 @@ READ16_MEMBER(igs017_state::lhzb2_magic_r)
return 0xffff;
}
-void igs017_state::lhzb2(address_map &map)
+void igs017_state::lhzb2_map(address_map &map)
{
map(0x000000, 0x07ffff).rom();
map(0x500000, 0x503fff).ram();
@@ -2297,7 +2297,7 @@ WRITE16_MEMBER(igs017_state::lhzb2a_input_select_w)
}
}
-void igs017_state::lhzb2a(address_map &map)
+void igs017_state::lhzb2a_map(address_map &map)
{
map(0x000000, 0x07ffff).rom();
@@ -2368,7 +2368,7 @@ READ16_MEMBER(igs017_state::slqz2_magic_r)
return 0xffff;
}
-void igs017_state::slqz2(address_map &map)
+void igs017_state::slqz2_map(address_map &map)
{
map(0x000000, 0x07ffff).rom();
map(0x100000, 0x103fff).ram();
@@ -3516,11 +3516,12 @@ MACHINE_RESET_MEMBER(igs017_state,iqblocka)
m_input_select = 0;
}
-MACHINE_CONFIG_START(igs017_state::iqblocka)
- MCFG_DEVICE_ADD("maincpu", Z180, XTAL(16'000'000) / 2)
- MCFG_DEVICE_PROGRAM_MAP(iqblocka_map)
- MCFG_DEVICE_IO_MAP(iqblocka_io)
- MCFG_TIMER_DRIVER_ADD_SCANLINE("scantimer", igs017_state, iqblocka_interrupt, "screen", 0, 1)
+void igs017_state::iqblocka(machine_config &config)
+{
+ Z180(config, m_maincpu, XTAL(16'000'000) / 2);
+ m_maincpu->set_addrmap(AS_PROGRAM, &igs017_state::iqblocka_map);
+ m_maincpu->set_addrmap(AS_IO, &igs017_state::iqblocka_io);
+ TIMER(config, "scantimer").configure_scanline(FUNC(igs017_state::iqblocka_interrupt), "screen", 0, 1);
MCFG_MACHINE_RESET_OVERRIDE(igs017_state,iqblocka)
@@ -3546,13 +3547,13 @@ MACHINE_CONFIG_START(igs017_state::iqblocka)
IGS_INCDEC(config, m_igs_incdec, 0);
// video
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(512, 256)
- MCFG_SCREEN_VISIBLE_AREA(0, 512-1, 0, 240-1)
- MCFG_SCREEN_UPDATE_DRIVER(igs017_state, screen_update_igs017)
- MCFG_SCREEN_PALETTE(m_palette)
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_refresh_hz(60);
+ m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ m_screen->set_size(512, 256);
+ m_screen->set_visarea(0, 512-1, 0, 240-1);
+ m_screen->set_screen_update(FUNC(igs017_state::screen_update_igs017));
+ m_screen->set_palette(m_palette);
PALETTE(config, m_palette).set_format(palette_device::xRGB_555, 0x100*2);
@@ -3561,12 +3562,10 @@ MACHINE_CONFIG_START(igs017_state::iqblocka)
// sound
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("ymsnd", YM2413, XTAL(3'579'545))
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.5)
+ YM2413(config, "ymsnd", XTAL(3'579'545)).add_route(ALL_OUTPUTS, "mono", 0.5);
- MCFG_DEVICE_ADD("oki", OKIM6295, XTAL(16'000'000) / 16, okim6295_device::PIN7_HIGH)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.5)
-MACHINE_CONFIG_END
+ OKIM6295(config, m_oki, XTAL(16'000'000) / 16, okim6295_device::PIN7_HIGH).add_route(ALL_OUTPUTS, "mono", 0.5);
+}
void igs017_state::iqblockf(machine_config &config)
{
@@ -3587,11 +3586,11 @@ void igs017_state::genius6(machine_config &config)
m_igs_bitswap->set_m3_bits(3, 3, ~5, ~6, ~15);
}
-MACHINE_CONFIG_START(igs017_state::starzan)
+void igs017_state::starzan(machine_config &config)
+{
iqblocka(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_OPCODES_MAP(decrypted_opcodes_map)
-MACHINE_CONFIG_END
+ m_maincpu->set_addrmap(AS_OPCODES, &igs017_state::decrypted_opcodes_map);
+}
// mgcs
@@ -3615,10 +3614,11 @@ MACHINE_RESET_MEMBER(igs017_state,mgcs)
memset(m_igs_magic, 0, sizeof(m_igs_magic));
}
-MACHINE_CONFIG_START(igs017_state::mgcs)
- MCFG_DEVICE_ADD("maincpu", M68000, XTAL(22'000'000) / 2)
- MCFG_DEVICE_PROGRAM_MAP(mgcs)
- MCFG_TIMER_DRIVER_ADD_SCANLINE("scantimer", igs017_state, mgcs_interrupt, "screen", 0, 1)
+void igs017_state::mgcs(machine_config &config)
+{
+ M68000(config, m_maincpu, XTAL(22'000'000) / 2);
+ m_maincpu->set_addrmap(AS_PROGRAM, &igs017_state::mgcs_map);
+ TIMER(config, "scantimer").configure_scanline(FUNC(igs017_state::mgcs_interrupt), "screen", 0, 1);
MCFG_MACHINE_RESET_OVERRIDE(igs017_state,mgcs)
@@ -3627,16 +3627,16 @@ MACHINE_CONFIG_START(igs017_state::mgcs)
ppi.in_pa_callback().set_ioport("COINS");
ppi.in_pb_callback().set(FUNC(igs017_state::mgcs_keys_r));
- MCFG_TICKET_DISPENSER_ADD("hopper", attotime::from_msec(50), TICKET_MOTOR_ACTIVE_HIGH, TICKET_STATUS_ACTIVE_LOW )
+ TICKET_DISPENSER(config, m_hopperdev, attotime::from_msec(50), TICKET_MOTOR_ACTIVE_HIGH, TICKET_STATUS_ACTIVE_LOW );
// video
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(512, 256)
- MCFG_SCREEN_VISIBLE_AREA(0, 512-1, 0, 240-1)
- MCFG_SCREEN_UPDATE_DRIVER(igs017_state, screen_update_igs017)
- MCFG_SCREEN_PALETTE(m_palette)
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_refresh_hz(60);
+ m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ m_screen->set_size(512, 256);
+ m_screen->set_visarea(0, 512-1, 0, 240-1);
+ m_screen->set_screen_update(FUNC(igs017_state::screen_update_igs017));
+ m_screen->set_palette(m_palette);
PALETTE(config, m_palette).set_format(palette_device::xRGB_555, 0x100*2);
@@ -3646,17 +3646,17 @@ MACHINE_CONFIG_START(igs017_state::mgcs)
// sound
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("oki", OKIM6295, XTAL(8'000'000) / 8, okim6295_device::PIN7_HIGH)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.5)
-MACHINE_CONFIG_END
+ OKIM6295(config, m_oki, XTAL(8'000'000) / 8, okim6295_device::PIN7_HIGH).add_route(ALL_OUTPUTS, "mono", 0.5);
+}
// lhzb2
-MACHINE_CONFIG_START(igs017_state::lhzb2)
- MCFG_DEVICE_ADD("maincpu", M68000, XTAL(22'000'000) / 2)
- MCFG_DEVICE_PROGRAM_MAP(lhzb2)
- MCFG_TIMER_DRIVER_ADD_SCANLINE("scantimer", igs017_state, mgcs_interrupt, "screen", 0, 1)
+void igs017_state::lhzb2(machine_config &config)
+{
+ M68000(config, m_maincpu, XTAL(22'000'000) / 2);
+ m_maincpu->set_addrmap(AS_PROGRAM, &igs017_state::lhzb2_map);
+ TIMER(config, "scantimer").configure_scanline(FUNC(igs017_state::mgcs_interrupt), "screen", 0, 1);
MCFG_MACHINE_RESET_OVERRIDE(igs017_state,mgcs)
@@ -3673,13 +3673,13 @@ MACHINE_CONFIG_START(igs017_state::lhzb2)
IGS022(config, m_igs022, 0);
// video
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(512, 256)
- MCFG_SCREEN_VISIBLE_AREA(0, 512-1, 0, 240-1)
- MCFG_SCREEN_UPDATE_DRIVER(igs017_state, screen_update_igs017)
- MCFG_SCREEN_PALETTE(m_palette)
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_refresh_hz(60);
+ m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ m_screen->set_size(512, 256);
+ m_screen->set_visarea(0, 512-1, 0, 240-1);
+ m_screen->set_screen_update(FUNC(igs017_state::screen_update_igs017));
+ m_screen->set_palette(m_palette);
PALETTE(config, m_palette).set_format(palette_device::xRGB_555, 0x100*2);
@@ -3689,9 +3689,8 @@ MACHINE_CONFIG_START(igs017_state::lhzb2)
// sound
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("oki", OKIM6295, XTAL(8'000'000) / 8, okim6295_device::PIN7_HIGH)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.5)
-MACHINE_CONFIG_END
+ OKIM6295(config, m_oki, XTAL(8'000'000) / 8, okim6295_device::PIN7_HIGH).add_route(ALL_OUTPUTS, "mono", 0.5);
+}
// lhzb2a
@@ -3702,10 +3701,11 @@ MACHINE_RESET_MEMBER(igs017_state,lhzb2a)
lhzb2a_remap_addr_w(m_maincpu->space(AS_PROGRAM), 0, 0xf0);
}
-MACHINE_CONFIG_START(igs017_state::lhzb2a)
- MCFG_DEVICE_ADD("maincpu", M68000, XTAL(22'000'000)/2)
- MCFG_DEVICE_PROGRAM_MAP(lhzb2a)
- MCFG_TIMER_DRIVER_ADD_SCANLINE("scantimer", igs017_state, mgcs_interrupt, "screen", 0, 1)
+void igs017_state::lhzb2a(machine_config &config)
+{
+ M68000(config, m_maincpu, XTAL(22'000'000) / 2);
+ m_maincpu->set_addrmap(AS_PROGRAM, &igs017_state::lhzb2a_map);
+ TIMER(config, "scantimer").configure_scanline(FUNC(igs017_state::mgcs_interrupt), "screen", 0, 1);
MCFG_MACHINE_RESET_OVERRIDE(igs017_state,lhzb2a)
@@ -3724,13 +3724,13 @@ MACHINE_CONFIG_START(igs017_state::lhzb2a)
IGS_INCDEC(config, m_igs_incdec, 0);
// video
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60) // VSync 60Hz, HSync 15.3kHz
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(512, 256)
- MCFG_SCREEN_VISIBLE_AREA(0, 512-1, 0, 256-16-1)
- MCFG_SCREEN_UPDATE_DRIVER(igs017_state, screen_update_igs017)
- MCFG_SCREEN_PALETTE(m_palette)
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_refresh_hz(60); // VSync 60Hz, HSync 15.3kHz
+ m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ m_screen->set_size(512, 256);
+ m_screen->set_visarea(0, 512-1, 0, 256-16-1);
+ m_screen->set_screen_update(FUNC(igs017_state::screen_update_igs017));
+ m_screen->set_palette(m_palette);
PALETTE(config, m_palette).set_format(palette_device::xRGB_555, 0x100*2);
@@ -3740,17 +3740,17 @@ MACHINE_CONFIG_START(igs017_state::lhzb2a)
// sound
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("oki", OKIM6295, XTAL(22'000'000) / 22, okim6295_device::PIN7_HIGH)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.5)
-MACHINE_CONFIG_END
+ OKIM6295(config, m_oki, XTAL(22'000'000) / 22, okim6295_device::PIN7_HIGH).add_route(ALL_OUTPUTS, "mono", 0.5);
+}
// slqz2
-MACHINE_CONFIG_START(igs017_state::slqz2)
- MCFG_DEVICE_ADD("maincpu", M68000, XTAL(22'000'000) / 2)
- MCFG_DEVICE_PROGRAM_MAP(slqz2)
- MCFG_TIMER_DRIVER_ADD_SCANLINE("scantimer", igs017_state, mgcs_interrupt, "screen", 0, 1)
+void igs017_state::slqz2(machine_config &config)
+{
+ M68000(config, m_maincpu, XTAL(22'000'000) / 2);
+ m_maincpu->set_addrmap(AS_PROGRAM, &igs017_state::slqz2_map);
+ TIMER(config, "scantimer").configure_scanline(FUNC(igs017_state::mgcs_interrupt), "screen", 0, 1);
MCFG_MACHINE_RESET_OVERRIDE(igs017_state,mgcs)
@@ -3767,13 +3767,13 @@ MACHINE_CONFIG_START(igs017_state::slqz2)
IGS022(config, m_igs022, 0);
// video
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(512, 256)
- MCFG_SCREEN_VISIBLE_AREA(0, 512-1, 0, 240-1)
- MCFG_SCREEN_UPDATE_DRIVER(igs017_state, screen_update_igs017)
- MCFG_SCREEN_PALETTE(m_palette)
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_refresh_hz(60);
+ m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ m_screen->set_size(512, 256);
+ m_screen->set_visarea(0, 512-1, 0, 240-1);
+ m_screen->set_screen_update(FUNC(igs017_state::screen_update_igs017));
+ m_screen->set_palette(m_palette);
PALETTE(config, m_palette).set_format(palette_device::xRGB_555, 0x100*2);
@@ -3783,17 +3783,17 @@ MACHINE_CONFIG_START(igs017_state::slqz2)
// sound
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("oki", OKIM6295, XTAL(8'000'000) / 8, okim6295_device::PIN7_HIGH)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.5)
-MACHINE_CONFIG_END
+ OKIM6295(config, m_oki, XTAL(8'000'000) / 8, okim6295_device::PIN7_HIGH).add_route(ALL_OUTPUTS, "mono", 0.5);
+}
// sdmg2
-MACHINE_CONFIG_START(igs017_state::sdmg2)
- MCFG_DEVICE_ADD("maincpu", M68000, XTAL(22'000'000)/2)
- MCFG_DEVICE_PROGRAM_MAP(sdmg2)
- MCFG_TIMER_DRIVER_ADD_SCANLINE("scantimer", igs017_state, mgcs_interrupt, "screen", 0, 1)
+void igs017_state::sdmg2(machine_config &config)
+{
+ M68000(config, m_maincpu, XTAL(22'000'000) / 2);
+ m_maincpu->set_addrmap(AS_PROGRAM, &igs017_state::sdmg2_map);
+ TIMER(config, "scantimer").configure_scanline(FUNC(igs017_state::mgcs_interrupt), "screen", 0, 1);
MCFG_MACHINE_RESET_OVERRIDE(igs017_state,mgcs)
@@ -3803,13 +3803,13 @@ MACHINE_CONFIG_START(igs017_state::sdmg2)
ppi.in_pb_callback().set_ioport("DSW2");
// video
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60) // VSync 60Hz, HSync 15.3kHz
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(512, 256)
- MCFG_SCREEN_VISIBLE_AREA(0, 512-1, 0, 256-16-1)
- MCFG_SCREEN_UPDATE_DRIVER(igs017_state, screen_update_igs017)
- MCFG_SCREEN_PALETTE(m_palette)
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_refresh_hz(60); // VSync 60Hz, HSync 15.3kHz
+ m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ m_screen->set_size(512, 256);
+ m_screen->set_visarea(0, 512-1, 0, 256-16-1);
+ m_screen->set_screen_update(FUNC(igs017_state::screen_update_igs017));
+ m_screen->set_palette(m_palette);
PALETTE(config, m_palette).set_format(palette_device::xRGB_555, 0x100*2);
@@ -3818,9 +3818,8 @@ MACHINE_CONFIG_START(igs017_state::sdmg2)
// sound
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("oki", OKIM6295, XTAL(22'000'000) / 22, okim6295_device::PIN7_HIGH)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.5)
-MACHINE_CONFIG_END
+ OKIM6295(config, m_oki, XTAL(22'000'000) / 22, okim6295_device::PIN7_HIGH).add_route(ALL_OUTPUTS, "mono", 0.5);
+}
// mgdh
@@ -3836,10 +3835,11 @@ TIMER_DEVICE_CALLBACK_MEMBER(igs017_state::mgdh_interrupt)
m_maincpu->set_input_line(3, HOLD_LINE); // lev 3 instead of 2
}
-MACHINE_CONFIG_START(igs017_state::mgdha)
- MCFG_DEVICE_ADD("maincpu", M68000, XTAL(22'000'000) / 2)
- MCFG_DEVICE_PROGRAM_MAP(mgdha_map)
- MCFG_TIMER_DRIVER_ADD_SCANLINE("scantimer", igs017_state, mgdh_interrupt, "screen", 0, 1)
+void igs017_state::mgdha(machine_config &config)
+{
+ M68000(config, m_maincpu, XTAL(22'000'000) / 2);
+ m_maincpu->set_addrmap(AS_PROGRAM, &igs017_state::mgdha_map);
+ TIMER(config, "scantimer").configure_scanline(FUNC(igs017_state::mgdh_interrupt), "screen", 0, 1);
MCFG_MACHINE_RESET_OVERRIDE(igs017_state,mgcs)
@@ -3848,13 +3848,13 @@ MACHINE_CONFIG_START(igs017_state::mgdha)
ppi.in_pa_callback().set_ioport("DSW1");
// video
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(512, 256)
- MCFG_SCREEN_VISIBLE_AREA(0, 512-1, 0, 256-16-1)
- MCFG_SCREEN_UPDATE_DRIVER(igs017_state, screen_update_igs017)
- MCFG_SCREEN_PALETTE(m_palette)
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_refresh_hz(60);
+ m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ m_screen->set_size(512, 256);
+ m_screen->set_visarea(0, 512-1, 0, 256-16-1);
+ m_screen->set_screen_update(FUNC(igs017_state::screen_update_igs017));
+ m_screen->set_palette(m_palette);
PALETTE(config, m_palette).set_format(palette_device::xRGB_555, 0x100*2);
@@ -3863,18 +3863,18 @@ MACHINE_CONFIG_START(igs017_state::mgdha)
// sound
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("oki", OKIM6295, XTAL(22'000'000) / 22, okim6295_device::PIN7_HIGH)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.5)
-MACHINE_CONFIG_END
+ OKIM6295(config, m_oki, XTAL(22'000'000) / 22, okim6295_device::PIN7_HIGH).add_route(ALL_OUTPUTS, "mono", 0.5);
+}
// tjsb
-MACHINE_CONFIG_START(igs017_state::tjsb)
- MCFG_DEVICE_ADD("maincpu", Z180, XTAL(16'000'000) / 2)
- MCFG_DEVICE_PROGRAM_MAP(tjsb_map)
- MCFG_DEVICE_IO_MAP(tjsb_io)
- MCFG_TIMER_DRIVER_ADD_SCANLINE("scantimer", igs017_state, iqblocka_interrupt, "screen", 0, 1)
+void igs017_state::tjsb(machine_config &config)
+{
+ Z180(config, m_maincpu, XTAL(16'000'000) / 2);
+ m_maincpu->set_addrmap(AS_PROGRAM, &igs017_state::tjsb_map);
+ m_maincpu->set_addrmap(AS_IO, &igs017_state::tjsb_io);
+ TIMER(config, "scantimer").configure_scanline(FUNC(igs017_state::iqblocka_interrupt), "screen", 0, 1);
MCFG_MACHINE_RESET_OVERRIDE(igs017_state,iqblocka)
@@ -3885,13 +3885,13 @@ MACHINE_CONFIG_START(igs017_state::tjsb)
ppi.in_pc_callback().set_ioport("DSW3");
// video
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(512, 256)
- MCFG_SCREEN_VISIBLE_AREA(0, 512-1, 0, 240-1)
- MCFG_SCREEN_UPDATE_DRIVER(igs017_state, screen_update_igs017)
- MCFG_SCREEN_PALETTE(m_palette)
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_refresh_hz(60);
+ m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ m_screen->set_size(512, 256);
+ m_screen->set_visarea(0, 512-1, 0, 240-1);
+ m_screen->set_screen_update(FUNC(igs017_state::screen_update_igs017));
+ m_screen->set_palette(m_palette);
PALETTE(config, m_palette).set_format(palette_device::xRGB_555, 0x100*2);
@@ -3901,21 +3901,20 @@ MACHINE_CONFIG_START(igs017_state::tjsb)
// sound
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("ymsnd", YM2413, XTAL(3'579'545))
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.5)
+ YM2413(config, "ymsnd", XTAL(3'579'545)).add_route(ALL_OUTPUTS, "mono", 0.5);
- MCFG_DEVICE_ADD("oki", OKIM6295, XTAL(16'000'000) / 16, okim6295_device::PIN7_HIGH)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.5)
-MACHINE_CONFIG_END
+ OKIM6295(config, m_oki, XTAL(16'000'000) / 16, okim6295_device::PIN7_HIGH).add_route(ALL_OUTPUTS, "mono", 0.5);
+}
// spkrform
-MACHINE_CONFIG_START(igs017_state::spkrform)
- MCFG_DEVICE_ADD("maincpu", Z180, XTAL(16'000'000) / 2)
- MCFG_DEVICE_PROGRAM_MAP(spkrform_map)
- MCFG_DEVICE_IO_MAP(spkrform_io)
- MCFG_TIMER_DRIVER_ADD_SCANLINE("scantimer", igs017_state, iqblocka_interrupt, "screen", 0, 1)
+void igs017_state::spkrform(machine_config &config)
+{
+ Z180(config, m_maincpu, XTAL(16'000'000) / 2);
+ m_maincpu->set_addrmap(AS_PROGRAM, &igs017_state::spkrform_map);
+ m_maincpu->set_addrmap(AS_IO, &igs017_state::spkrform_io);
+ TIMER(config, "scantimer").configure_scanline(FUNC(igs017_state::iqblocka_interrupt), "screen", 0, 1);
MCFG_MACHINE_RESET_OVERRIDE(igs017_state,iqblocka)
@@ -3926,13 +3925,13 @@ MACHINE_CONFIG_START(igs017_state::spkrform)
ppi.in_pc_callback().set_ioport("DSW3");
// video
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(512, 256)
- MCFG_SCREEN_VISIBLE_AREA(0, 512-1, 0, 240-1)
- MCFG_SCREEN_UPDATE_DRIVER(igs017_state, screen_update_igs017)
- MCFG_SCREEN_PALETTE(m_palette)
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_refresh_hz(60);
+ m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ m_screen->set_size(512, 256);
+ m_screen->set_visarea(0, 512-1, 0, 240-1);
+ m_screen->set_screen_update(FUNC(igs017_state::screen_update_igs017));
+ m_screen->set_palette(m_palette);
PALETTE(config, m_palette).set_format(palette_device::xBGR_555, 0x100*2);
@@ -3941,12 +3940,10 @@ MACHINE_CONFIG_START(igs017_state::spkrform)
// sound
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("ymsnd", YM2413, XTAL(3'579'545))
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.5)
+ YM2413(config, "ymsnd", XTAL(3'579'545)).add_route(ALL_OUTPUTS, "mono", 0.5);
- MCFG_DEVICE_ADD("oki", OKIM6295, XTAL(16'000'000) / 16, okim6295_device::PIN7_HIGH)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.5)
-MACHINE_CONFIG_END
+ OKIM6295(config, m_oki, XTAL(16'000'000) / 16, okim6295_device::PIN7_HIGH).add_route(ALL_OUTPUTS, "mono", 0.5);
+}
/***************************************************************************
diff --git a/src/mame/drivers/igs_m027.cpp b/src/mame/drivers/igs_m027.cpp
index 7d27f2eceef..9c770446710 100644
--- a/src/mame/drivers/igs_m027.cpp
+++ b/src/mame/drivers/igs_m027.cpp
@@ -327,24 +327,25 @@ WRITE_LINE_MEMBER(igs_m027_state::vblank_irq)
}
-MACHINE_CONFIG_START(igs_m027_state::igs_majhong)
- MCFG_DEVICE_ADD("maincpu", ARM7, 20000000)
- MCFG_DEVICE_PROGRAM_MAP(igs_majhong_map)
+void igs_m027_state::igs_majhong(machine_config &config)
+{
+ ARM7(config, m_maincpu, 20000000);
+ m_maincpu->set_addrmap(AS_PROGRAM, &igs_m027_state::igs_majhong_map);
// NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(512, 256)
- MCFG_SCREEN_VISIBLE_AREA(0, 512-1, 0, 256-1)
- MCFG_SCREEN_UPDATE_DRIVER(igs_m027_state, screen_update_igs_majhong)
- MCFG_SCREEN_PALETTE("palette")
- MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE(*this, igs_m027_state, vblank_irq))
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(512, 256);
+ screen.set_visarea(0, 512-1, 0, 256-1);
+ screen.set_screen_update(FUNC(igs_m027_state::screen_update_igs_majhong));
+ screen.set_palette("palette");
+ screen.screen_vblank().set(FUNC(igs_m027_state::vblank_irq));
- MCFG_PALETTE_ADD("palette", 0x200)
-// MCFG_PALETTE_FORMAT(xGGGGGRRRRRBBBBB)
+ PALETTE(config, "palette").set_entries(0x200);
+// .set_format(palette_device::xGRB_555, 0x200);
IGS017_IGS031(config, m_igs017_igs031, 0);
m_igs017_igs031->set_text_reverse_bits();
@@ -354,31 +355,27 @@ MACHINE_CONFIG_START(igs_m027_state::igs_majhong)
/* sound hardware */
// OK6295
-MACHINE_CONFIG_END
-
-
-
+}
-MACHINE_CONFIG_START(igs_m027_state::amazonia)
- MCFG_DEVICE_ADD("maincpu", ARM7, 20000000)
- MCFG_DEVICE_PROGRAM_MAP(igs_majhong_map)
+void igs_m027_state::amazonia(machine_config &config)
+{
+ ARM7(config, m_maincpu, 20000000);
+ m_maincpu->set_addrmap(AS_PROGRAM, &igs_m027_state::igs_majhong_map);
// NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(512, 256);
+ screen.set_visarea(0, 512-1, 0, 256-1);
+ screen.set_screen_update(FUNC(igs_m027_state::screen_update_igs_majhong));
+ screen.set_palette("palette");
+ screen.screen_vblank().set(FUNC(igs_m027_state::vblank_irq));
-
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(512, 256)
- MCFG_SCREEN_VISIBLE_AREA(0, 512-1, 0, 256-1)
- MCFG_SCREEN_UPDATE_DRIVER(igs_m027_state, screen_update_igs_majhong)
- MCFG_SCREEN_PALETTE("palette")
- MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE(*this, igs_m027_state, vblank_irq))
-
- MCFG_PALETTE_ADD("palette", 0x200)
-// MCFG_PALETTE_FORMAT(xGGGGGRRRRRBBBBB)
+ PALETTE(config, "palette").set_entries(0x200);
+// .set_format(palette_device::xGRB_555, 0x200);
IGS017_IGS031(config, m_igs017_igs031, 0);
m_igs017_igs031->set_text_reverse_bits();
@@ -388,8 +385,7 @@ MACHINE_CONFIG_START(igs_m027_state::amazonia)
/* sound hardware */
// OK6295
-
-MACHINE_CONFIG_END
+}
/***************************************************************************
diff --git a/src/mame/drivers/igs_m036.cpp b/src/mame/drivers/igs_m036.cpp
index 256e2273cb7..2a625636433 100644
--- a/src/mame/drivers/igs_m036.cpp
+++ b/src/mame/drivers/igs_m036.cpp
@@ -252,42 +252,40 @@ void igs_m036_state::pgm_create_dummy_internal_arm_region(void)
#define IGS036_CPU ARM7
-MACHINE_CONFIG_START(igs_m036_state::igs_m036)
- MCFG_DEVICE_ADD("maincpu",IGS036_CPU, 20000000)
-
- MCFG_DEVICE_PROGRAM_MAP(igs_m036_map)
-
-
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(512, 256)
- MCFG_SCREEN_VISIBLE_AREA(0, 512-1, 0, 256-1)
- MCFG_SCREEN_UPDATE_DRIVER(igs_m036_state, screen_update_igs_m036)
- MCFG_SCREEN_PALETTE("palette")
-
- MCFG_PALETTE_ADD("palette", 0x200)
+void igs_m036_state::igs_m036(machine_config &config)
+{
+ IGS036_CPU(config, m_maincpu, 20000000);
+ m_maincpu->set_addrmap(AS_PROGRAM, &igs_m036_state::igs_m036_map);
+
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(512, 256);
+ screen.set_visarea(0, 512-1, 0, 256-1);
+ screen.set_screen_update(FUNC(igs_m036_state::screen_update_igs_m036));
+ screen.set_palette("palette");
+
+ PALETTE(config, "palette").set_entries(0x200);
/* sound hardware (OKI) */
-MACHINE_CONFIG_END
-
-
-MACHINE_CONFIG_START(igs_m036_state::igs_m036_tt)
- MCFG_DEVICE_ADD("maincpu",IGS036_CPU, 20000000)
-
- MCFG_DEVICE_PROGRAM_MAP(igs_m036_map)
-
+}
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(512, 256)
- MCFG_SCREEN_VISIBLE_AREA(0, 512-1, 0, 256-1)
- MCFG_SCREEN_UPDATE_DRIVER(igs_m036_state, screen_update_igs_m036)
- MCFG_SCREEN_PALETTE("palette")
- MCFG_PALETTE_ADD("palette", 0x200)
+void igs_m036_state::igs_m036_tt(machine_config &config)
+{
+ IGS036_CPU(config, m_maincpu, 20000000);
+ m_maincpu->set_addrmap(AS_PROGRAM, &igs_m036_state::igs_m036_map);
+
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(512, 256);
+ screen.set_visarea(0, 512-1, 0, 256-1);
+ screen.set_screen_update(FUNC(igs_m036_state::screen_update_igs_m036));
+ screen.set_palette("palette");
+
+ PALETTE(config, "palette").set_entries(0x200);
/* sound hardware (TT5665) */
-MACHINE_CONFIG_END
+}
diff --git a/src/mame/drivers/igspc.cpp b/src/mame/drivers/igspc.cpp
index 21aa054bafa..0384a918fa4 100644
--- a/src/mame/drivers/igspc.cpp
+++ b/src/mame/drivers/igspc.cpp
@@ -82,12 +82,13 @@ INPUT_PORTS_END
-MACHINE_CONFIG_START(speeddrv_state::speeddrv)
+void speeddrv_state::speeddrv(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", I486, 40000000 ) // ?? at least a pentium
- MCFG_DEVICE_PROGRAM_MAP(speeddrv_map)
- MCFG_DEVICE_IO_MAP(speeddrv_io)
-MACHINE_CONFIG_END
+ I486(config, m_maincpu, 40000000); // ?? at least a pentium
+ m_maincpu->set_addrmap(AS_PROGRAM, &speeddrv_state::speeddrv_map);
+ m_maincpu->set_addrmap(AS_IO, &speeddrv_state::speeddrv_io);
+}
ROM_START( speeddrv )
diff --git a/src/mame/drivers/igspoker.cpp b/src/mame/drivers/igspoker.cpp
index 2e8ff33ac9a..11c4a0cdf23 100644
--- a/src/mame/drivers/igspoker.cpp
+++ b/src/mame/drivers/igspoker.cpp
@@ -1921,13 +1921,13 @@ static GFXDECODE_START( gfx_cpokerpk )
GFXDECODE_ENTRY( "gfx2", 0x00000, charlayout2, 0, 1 )
GFXDECODE_END
-MACHINE_CONFIG_START(igspoker_state::igspoker)
-
+void igspoker_state::igspoker(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu",Z80, 3579545)
- MCFG_DEVICE_PROGRAM_MAP(igspoker_prg_map)
- MCFG_DEVICE_IO_MAP(igspoker_io_map)
- MCFG_TIMER_DRIVER_ADD_SCANLINE("scantimer", igspoker_state, igs_interrupt, "screen", 0, 1)
+ Z80(config, m_maincpu, 3579545);
+ m_maincpu->set_addrmap(AS_PROGRAM, &igspoker_state::igspoker_prg_map);
+ m_maincpu->set_addrmap(AS_IO, &igspoker_state::igspoker_io_map);
+ TIMER(config, "scantimer").configure_scanline(FUNC(igspoker_state::igs_interrupt), "screen", 0, 1);
i8255_device &ppi(I8255A(config, "ppi"));
ppi.out_pa_callback().set(FUNC(igspoker_state::igs_nmi_and_coins_w));
@@ -1935,66 +1935,65 @@ MACHINE_CONFIG_START(igspoker_state::igspoker)
ppi.in_pc_callback().set_ioport("COINS");
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(57)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(64*8, 32*8) // TODO: wrong screen size!
- MCFG_SCREEN_VISIBLE_AREA(0*8, 64*8-1, 0, 32*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(igspoker_state, screen_update_igs_video)
- MCFG_SCREEN_PALETTE(m_palette)
-
- MCFG_DEVICE_ADD(m_gfxdecode, GFXDECODE, m_palette, gfx_igspoker)
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_refresh_hz(57);
+ m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ m_screen->set_size(64*8, 32*8); // TODO: wrong screen size!
+ m_screen->set_visarea(0*8, 64*8-1, 0, 32*8-1);
+ m_screen->set_screen_update(FUNC(igspoker_state::screen_update_igs_video));
+ m_screen->set_palette(m_palette);
+
+ GFXDECODE(config, m_gfxdecode, m_palette, gfx_igspoker);
PALETTE(config, m_palette).set_format(palette_device::xBGR_555, 2048);
/* sound hardware */
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("ymsnd", YM2413, 3579545)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
-
-MACHINE_CONFIG_END
+ YM2413(config, "ymsnd", 3579545).add_route(ALL_OUTPUTS, "mono", 1.0);
+}
-MACHINE_CONFIG_START(igspoker_state::csk227it)
+void igspoker_state::csk227it(machine_config &config)
+{
igspoker(config);
+}
-MACHINE_CONFIG_END
-
-MACHINE_CONFIG_START(igspoker_state::csk234it)
+void igspoker_state::csk234it(machine_config &config)
+{
igspoker(config);
+}
-MACHINE_CONFIG_END
+void igspoker_state::igs_ncs(machine_config &config)
+{
+ igspoker(config);
+}
-MACHINE_CONFIG_START(igspoker_state::igs_ncs)
+void igspoker_state::number10(machine_config &config)
+{
igspoker(config);
-MACHINE_CONFIG_END
+ m_maincpu->set_addrmap(AS_IO, &igspoker_state::number10_io_map);
-MACHINE_CONFIG_START(igspoker_state::number10)
- igspoker(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_IO_MAP(number10_io_map)
+ config.device_remove("ppi");
- MCFG_DEVICE_REMOVE("ppi")
+ m_screen->set_screen_update(FUNC(igspoker_state::screen_update_cpokerpk));
- MCFG_SCREEN_MODIFY("screen")
- MCFG_SCREEN_UPDATE_DRIVER(igspoker_state, screen_update_cpokerpk)
MCFG_VIDEO_START_OVERRIDE(igspoker_state,cpokerpk)
- MCFG_DEVICE_ADD("oki", OKIM6295, XTAL(12'000'000) / 12, okim6295_device::PIN7_HIGH)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
-MACHINE_CONFIG_END
+ OKIM6295(config, "oki", XTAL(12'000'000) / 12, okim6295_device::PIN7_HIGH).add_route(ALL_OUTPUTS, "mono", 1.0);
+}
-MACHINE_CONFIG_START(igspoker_state::cpokerpk)
+void igspoker_state::cpokerpk(machine_config &config)
+{
number10(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_IO_MAP(cpokerpk_io_map)
- MCFG_GFXDECODE_MODIFY("gfxdecode", gfx_cpokerpk)
-MACHINE_CONFIG_END
+ m_maincpu->set_addrmap(AS_IO, &igspoker_state::cpokerpk_io_map);
+ m_gfxdecode->set_info(gfx_cpokerpk);
+}
-MACHINE_CONFIG_START(igspoker_state::pktetris)
- igspoker(config);
-MACHINE_CONFIG_END
+void igspoker_state::pktetris(machine_config &config)
+{
+ igspoker(config);
+}
diff --git a/src/mame/drivers/ikki.cpp b/src/mame/drivers/ikki.cpp
index 8e160984c03..7a1ecbec6c1 100644
--- a/src/mame/drivers/ikki.cpp
+++ b/src/mame/drivers/ikki.cpp
@@ -82,8 +82,8 @@ void ikki_state::ikki_cpu2(address_map &map)
map(0x0000, 0x1fff).rom();
map(0xc000, 0xc7ff).ram().share("spriteram");
map(0xc800, 0xcfff).ram().share("share1");
- map(0xd801, 0xd801).w("sn1", FUNC(sn76496_device::command_w));
- map(0xd802, 0xd802).w("sn2", FUNC(sn76496_device::command_w));
+ map(0xd801, 0xd801).w("sn1", FUNC(sn76496_device::write));
+ map(0xd802, 0xd802).w("sn2", FUNC(sn76496_device::write));
}
@@ -253,25 +253,25 @@ TIMER_DEVICE_CALLBACK_MEMBER(ikki_state::ikki_irq)
-MACHINE_CONFIG_START(ikki_state::ikki)
-
+void ikki_state::ikki(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80,CPU_CLOCK/2) /* 4.000MHz */
- MCFG_DEVICE_PROGRAM_MAP(ikki_cpu1)
- MCFG_TIMER_DRIVER_ADD_SCANLINE("scantimer", ikki_state, ikki_irq, "screen", 0, 1)
+ Z80(config, m_maincpu, CPU_CLOCK/2); /* 4.000MHz */
+ m_maincpu->set_addrmap(AS_PROGRAM, &ikki_state::ikki_cpu1);
+ TIMER(config, "scantimer").configure_scanline(FUNC(ikki_state::ikki_irq), "screen", 0, 1);
- MCFG_DEVICE_ADD("sub", Z80,CPU_CLOCK/2) /* 4.000MHz */
- MCFG_DEVICE_PROGRAM_MAP(ikki_cpu2)
- MCFG_DEVICE_PERIODIC_INT_DRIVER(ikki_state, irq0_line_hold, 2*(PIXEL_CLOCK/HTOTAL/VTOTAL))
+ Z80(config, m_subcpu, CPU_CLOCK/2); /* 4.000MHz */
+ m_subcpu->set_addrmap(AS_PROGRAM, &ikki_state::ikki_cpu2);
+ m_subcpu->set_periodic_int(FUNC(ikki_state::irq0_line_hold), attotime::from_hz(2*(PIXEL_CLOCK/HTOTAL/VTOTAL)));
- MCFG_QUANTUM_PERFECT_CPU("maincpu")
+ config.m_perfect_cpu_quantum = subtag("maincpu");
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_RAW_PARAMS(PIXEL_CLOCK, HTOTAL, HBEND, HBSTART, VTOTAL, VBEND, VBSTART)
- MCFG_SCREEN_UPDATE_DRIVER(ikki_state, screen_update_ikki)
- MCFG_SCREEN_PALETTE(m_palette)
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_raw(PIXEL_CLOCK, HTOTAL, HBEND, HBSTART, VTOTAL, VBEND, VBSTART);
+ m_screen->set_screen_update(FUNC(ikki_state::screen_update_ikki));
+ m_screen->set_palette(m_palette);
GFXDECODE(config, m_gfxdecode, m_palette, gfx_ikki);
PALETTE(config, m_palette, FUNC(ikki_state::ikki_palette), 1024, 256 + 1);
@@ -279,12 +279,10 @@ MACHINE_CONFIG_START(ikki_state::ikki)
/* sound hardware */
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("sn1", SN76496, CPU_CLOCK/4)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.75)
+ SN76496(config, "sn1", CPU_CLOCK/4).add_route(ALL_OUTPUTS, "mono", 0.75);
- MCFG_DEVICE_ADD("sn2", SN76496, CPU_CLOCK/2)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.75)
-MACHINE_CONFIG_END
+ SN76496(config, "sn2", CPU_CLOCK/2).add_route(ALL_OUTPUTS, "mono", 0.75);
+}
/*************************************
diff --git a/src/mame/drivers/imds2.cpp b/src/mame/drivers/imds2.cpp
index f4ca5570f46..e56387de96c 100644
--- a/src/mame/drivers/imds2.cpp
+++ b/src/mame/drivers/imds2.cpp
@@ -253,7 +253,7 @@ void imds2_state::imds2(machine_config &config)
m_ipccpu->set_addrmap(AS_PROGRAM, &imds2_state::ipc_mem_map);
m_ipccpu->set_addrmap(AS_IO, &imds2_state::ipc_io_map);
m_ipccpu->set_irq_acknowledge_callback("ipcsyspic", FUNC(pic8259_device::inta_cb));
- //MCFG_QUANTUM_TIME(attotime::from_hz(100))
+ //config.m_minimum_quantum = attotime::from_hz(100);
PIC8259(config, m_ipcsyspic, 0);
m_ipcsyspic->out_int_callback().set(FUNC(imds2_state::ipc_intr_w));
diff --git a/src/mame/drivers/imolagp.cpp b/src/mame/drivers/imolagp.cpp
index 082886e45a5..459d5e223c8 100644
--- a/src/mame/drivers/imolagp.cpp
+++ b/src/mame/drivers/imolagp.cpp
@@ -512,19 +512,19 @@ void imolagp_state::machine_reset()
}
-MACHINE_CONFIG_START(imolagp_state::imolagp)
-
+void imolagp_state::imolagp(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, 3000000) // ? (assume slower than slave)
- MCFG_DEVICE_PROGRAM_MAP(imolagp_master_map)
- MCFG_DEVICE_IO_MAP(imolagp_master_io)
- MCFG_TIMER_DRIVER_ADD("pot", imolagp_state, imolagp_pot_callback) // maincpu nmi
+ Z80(config, m_maincpu, 3000000); // ? (assume slower than slave)
+ m_maincpu->set_addrmap(AS_PROGRAM, &imolagp_state::imolagp_master_map);
+ m_maincpu->set_addrmap(AS_IO, &imolagp_state::imolagp_master_io);
+ TIMER(config, m_steer_pot_timer).configure_generic(FUNC(imolagp_state::imolagp_pot_callback)); // maincpu nmi
- MCFG_DEVICE_ADD("slave", Z80, 4000000) // ?
- MCFG_DEVICE_PROGRAM_MAP(imolagp_slave_map)
- MCFG_DEVICE_IO_MAP(imolagp_slave_io)
+ Z80(config, m_slavecpu, 4000000); // ?
+ m_slavecpu->set_addrmap(AS_PROGRAM, &imolagp_state::imolagp_slave_map);
+ m_slavecpu->set_addrmap(AS_IO, &imolagp_state::imolagp_slave_io);
- MCFG_QUANTUM_PERFECT_CPU("maincpu")
+ config.m_perfect_cpu_quantum = subtag("maincpu");
i8255_device &ppi(I8255A(config, "ppi8255", 0));
// mode $91 - ports A & C-lower as input, ports B & C-upper as output
@@ -534,22 +534,22 @@ MACHINE_CONFIG_START(imolagp_state::imolagp)
ppi.in_pc_callback().set_ioport("IN1");
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(256,256)
- MCFG_SCREEN_VISIBLE_AREA(0+48,255,0+16,255)
- MCFG_SCREEN_UPDATE_DRIVER(imolagp_state, screen_update_imolagp)
- MCFG_SCREEN_VIDEO_ATTRIBUTES(VIDEO_UPDATE_SCANLINE)
- MCFG_SCREEN_PALETTE("palette")
- MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE(*this, imolagp_state, vblank_irq))
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(256,256);
+ screen.set_visarea(0+48,255,0+16,255);
+ screen.set_screen_update(FUNC(imolagp_state::screen_update_imolagp));
+ screen.set_video_attributes(VIDEO_UPDATE_SCANLINE);
+ screen.set_palette("palette");
+ screen.screen_vblank().set(FUNC(imolagp_state::vblank_irq));
PALETTE(config, "palette", FUNC(imolagp_state::imolagp_palette), 0x20);
/* sound hardware */
SPEAKER(config, "mono").front_center();
AY8910(config, "aysnd", 2000000).add_route(ALL_OUTPUTS, "mono", 0.5); // ?
-MACHINE_CONFIG_END
+}
ROM_START( imolagp ) // same hardware, but larger video roms
diff --git a/src/mame/drivers/inder.cpp b/src/mame/drivers/inder.cpp
index 76811d220f9..9cfa448e438 100644
--- a/src/mame/drivers/inder.cpp
+++ b/src/mame/drivers/inder.cpp
@@ -1268,9 +1268,9 @@ WRITE8_MEMBER( inder_state::sndbank_w )
void inder_state::update_mus()
{
if ((m_sound_addr < 0x40000) && (m_sndbank != 0xff))
- m_13->write_ba(m_p_speech[m_sound_addr]);
+ m_13->ba_w(m_p_speech[m_sound_addr]);
else
- m_13->write_ba(0);
+ m_13->ba_w(0);
}
WRITE_LINE_MEMBER( inder_state::qc7a_w )
@@ -1357,11 +1357,12 @@ void inder_state::init_inder1()
m_game = 1;
}
-MACHINE_CONFIG_START(inder_state::brvteam)
+void inder_state::brvteam(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, XTAL(5'000'000) / 2)
- MCFG_DEVICE_PROGRAM_MAP(brvteam_map)
- MCFG_DEVICE_PERIODIC_INT_DRIVER(inder_state, irq0_line_hold, 250) // NE556
+ Z80(config, m_maincpu, XTAL(5'000'000) / 2);
+ m_maincpu->set_addrmap(AS_PROGRAM, &inder_state::brvteam_map);
+ m_maincpu->set_periodic_int(FUNC(inder_state::irq0_line_hold), attotime::from_hz(250)); // NE556
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_1);
@@ -1371,15 +1372,15 @@ MACHINE_CONFIG_START(inder_state::brvteam)
/* Sound */
genpin_audio(config);
SPEAKER(config, "snvol").front_center();
- MCFG_DEVICE_ADD("sn", SN76489, XTAL(8'000'000) / 2) // jumper choice of 2 or 4 MHz
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "snvol", 2.0)
-MACHINE_CONFIG_END
+ SN76489(config, m_sn, XTAL(8'000'000) / 2).add_route(ALL_OUTPUTS, "snvol", 2.0); // jumper choice of 2 or 4 MHz
+}
-MACHINE_CONFIG_START(inder_state::canasta)
+void inder_state::canasta(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, XTAL(5'000'000) / 2)
- MCFG_DEVICE_PROGRAM_MAP(canasta_map)
- MCFG_DEVICE_PERIODIC_INT_DRIVER(inder_state, irq0_line_hold, 250) // NE556
+ Z80(config, m_maincpu, XTAL(5'000'000) / 2);
+ m_maincpu->set_addrmap(AS_PROGRAM, &inder_state::canasta_map);
+ m_maincpu->set_periodic_int(FUNC(inder_state::irq0_line_hold), attotime::from_hz(250)); // NE556
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_1);
@@ -1390,16 +1391,18 @@ MACHINE_CONFIG_START(inder_state::canasta)
genpin_audio(config);
SPEAKER(config, "ayvol").front_center();
AY8910(config, "ay", XTAL(4'000'000) / 2).add_route(ALL_OUTPUTS, "ayvol", 1.0);
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(inder_state::lapbylap)
+void inder_state::lapbylap(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, XTAL(5'000'000) / 2)
- MCFG_DEVICE_PROGRAM_MAP(lapbylap_map)
- MCFG_DEVICE_PERIODIC_INT_DRIVER(inder_state, irq0_line_hold, 250) // NE556
- MCFG_DEVICE_ADD("audiocpu", Z80, XTAL(2'000'000))
- MCFG_DEVICE_PROGRAM_MAP(lapbylap_sub_map)
- MCFG_DEVICE_PERIODIC_INT_DRIVER(inder_state, irq0_line_hold, 250) // NE555
+ Z80(config, m_maincpu, XTAL(5'000'000) / 2);
+ m_maincpu->set_addrmap(AS_PROGRAM, &inder_state::lapbylap_map);
+ m_maincpu->set_periodic_int(FUNC(inder_state::irq0_line_hold), attotime::from_hz(250)); // NE556
+
+ Z80(config, m_audiocpu, XTAL(2'000'000));
+ m_audiocpu->set_addrmap(AS_PROGRAM, &inder_state::lapbylap_sub_map);
+ m_audiocpu->set_periodic_int(FUNC(inder_state::irq0_line_hold), attotime::from_hz(250)); // NE555
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_1);
@@ -1413,16 +1416,18 @@ MACHINE_CONFIG_START(inder_state::lapbylap)
ay8910_device &ay2(AY8910(config, "ay2", XTAL(2'000'000))); // same xtal that drives subcpu
ay2.port_a_read_callback().set(FUNC(inder_state::sndcmd_r));
ay2.add_route(ALL_OUTPUTS, "ayvol", 1.0);
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(inder_state::inder)
+void inder_state::inder(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, XTAL(5'000'000) / 2)
- MCFG_DEVICE_PROGRAM_MAP(inder_map)
- MCFG_DEVICE_PERIODIC_INT_DRIVER(inder_state, irq0_line_hold, 250) // NE556
- MCFG_DEVICE_ADD("audiocpu", Z80, XTAL(5'000'000) / 2)
- MCFG_DEVICE_PROGRAM_MAP(inder_sub_map)
- MCFG_DEVICE_PERIODIC_INT_DRIVER(inder_state, irq0_line_hold, 250) // NE555
+ Z80(config, m_maincpu, XTAL(5'000'000) / 2);
+ m_maincpu->set_addrmap(AS_PROGRAM, &inder_state::inder_map);
+ m_maincpu->set_periodic_int(FUNC(inder_state::irq0_line_hold), attotime::from_hz(250)); // NE556
+
+ Z80(config, m_audiocpu, XTAL(5'000'000) / 2);
+ m_audiocpu->set_addrmap(AS_PROGRAM, &inder_state::inder_sub_map);
+ m_audiocpu->set_periodic_int(FUNC(inder_state::irq0_line_hold), attotime::from_hz(250)); // NE555
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_1);
@@ -1468,7 +1473,7 @@ MACHINE_CONFIG_START(inder_state::inder)
HCT157(config, m_13, 0);
m_13->out_callback().set("msm", FUNC(msm5205_device::data_w));
-MACHINE_CONFIG_END
+}
/*-------------------------------------------------------------------
diff --git a/src/mame/drivers/inderp.cpp b/src/mame/drivers/inderp.cpp
index 89128a2074f..caa7b7b3f14 100644
--- a/src/mame/drivers/inderp.cpp
+++ b/src/mame/drivers/inderp.cpp
@@ -197,21 +197,22 @@ WRITE_LINE_MEMBER( inderp_state::clock_tick )
m_maincpu->set_input_line(M6504_IRQ_LINE, ASSERT_LINE);
}
-MACHINE_CONFIG_START(inderp_state::inderp)
+void inderp_state::inderp(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M6504, 434000) // possible calculation of frequency-derived time constant 100k res and 10pf cap
- MCFG_DEVICE_PROGRAM_MAP(maincpu_map)
+ M6504(config, m_maincpu, 434000); // possible calculation of frequency-derived time constant 100k res and 10pf cap
+ m_maincpu->set_addrmap(AS_PROGRAM, &inderp_state::maincpu_map);
- MCFG_DEVICE_ADD("cpoint_clock", CLOCK, 200) // crosspoint detector
- MCFG_CLOCK_SIGNAL_HANDLER(WRITELINE(*this, inderp_state, clock_tick))
+ clock_device &cpoint_clock(CLOCK(config, "cpoint_clock", 200)); // crosspoint detector
+ cpoint_clock.signal_handler().set(FUNC(inderp_state::clock_tick));
/* video hardware */
- //MCFG_DEFAULT_LAYOUT()
+ //config.set_default_layout()
/* sound hardware */
//discrete ?
genpin_audio(config);
-MACHINE_CONFIG_END
+}
ROM_START(centauri)
diff --git a/src/mame/drivers/indiana.cpp b/src/mame/drivers/indiana.cpp
index 0bf09bd4e4a..9e87da7198b 100644
--- a/src/mame/drivers/indiana.cpp
+++ b/src/mame/drivers/indiana.cpp
@@ -94,20 +94,20 @@ static DEVICE_INPUT_DEFAULTS_START( keyboard )
DEVICE_INPUT_DEFAULTS( "RS232_STOPBITS", 0xff, RS232_STOPBITS_1 )
DEVICE_INPUT_DEFAULTS_END
-MACHINE_CONFIG_START(indiana_state::indiana)
+void indiana_state::indiana(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD(M68K_TAG, M68030, XTAL(16'000'000))
- MCFG_DEVICE_PROGRAM_MAP(indiana_mem)
+ M68030(config, m_maincpu, XTAL(16'000'000));
+ m_maincpu->set_addrmap(AS_PROGRAM, &indiana_state::indiana_mem);
// FIXME: determine ISA bus clock
isa16_device &isa(ISA16(config, ISABUS_TAG, 0));
- isa.set_cputag(M68K_TAG);
isa.set_custom_spaces();
- MCFG_DEVICE_ADD("isa1", ISA16_SLOT, 0, ISABUS_TAG, indiana_isa_cards, "vga", false)
- MCFG_DEVICE_ADD("isa2", ISA16_SLOT, 0, ISABUS_TAG, indiana_isa_cards, "fdc_at", false)
- MCFG_DEVICE_ADD("isa3", ISA16_SLOT, 0, ISABUS_TAG, indiana_isa_cards, "comat", false)
- MCFG_DEVICE_ADD("isa4", ISA16_SLOT, 0, ISABUS_TAG, indiana_isa_cards, "ide", false)
+ ISA16_SLOT(config, "isa1", 0, ISABUS_TAG, indiana_isa_cards, "vga", false);
+ ISA16_SLOT(config, "isa2", 0, ISABUS_TAG, indiana_isa_cards, "fdc_at", false);
+ ISA16_SLOT(config, "isa3", 0, ISABUS_TAG, indiana_isa_cards, "comat", false);
+ ISA16_SLOT(config, "isa4", 0, ISABUS_TAG, indiana_isa_cards, "ide", false);
mc68901_device &mfp(MC68901(config, MFP_TAG, XTAL(16'000'000)/4));
mfp.set_timer_clock(XTAL(16'000'000)/4);
@@ -118,7 +118,7 @@ MACHINE_CONFIG_START(indiana_state::indiana)
rs232_port_device &keyboard(RS232_PORT(config, "keyboard", default_rs232_devices, "keyboard"));
keyboard.rxd_handler().set(MFP_TAG, FUNC(mc68901_device::write_rx));
keyboard.set_option_device_input_defaults("keyboard", DEVICE_INPUT_DEFAULTS_NAME(keyboard));
-MACHINE_CONFIG_END
+}
/* ROM definition */
ROM_START( indiana )
diff --git a/src/mame/drivers/indigo.cpp b/src/mame/drivers/indigo.cpp
index e58056fce37..f5ceae47718 100644
--- a/src/mame/drivers/indigo.cpp
+++ b/src/mame/drivers/indigo.cpp
@@ -22,17 +22,12 @@
#include "machine/eepromser.h"
#include "machine/hpc1.h"
#include "machine/sgi.h"
-#include "emupal.h"
-#include "screen.h"
-
-#define ENABLE_ENTRY_GFX (1)
+#include "video/light.h"
#define LOG_UNKNOWN (1 << 0)
#define LOG_INT (1 << 1)
#define LOG_DSP (1 << 2)
-#define LOG_GFX (1 << 3)
-#define LOG_GFX_CMD (1 << 4)
-#define LOG_ALL (LOG_UNKNOWN | LOG_INT | LOG_DSP | LOG_GFX | LOG_GFX_CMD)
+#define LOG_ALL (LOG_UNKNOWN | LOG_INT | LOG_DSP)
#define VERBOSE (LOG_UNKNOWN)
#include "logmacro.h"
@@ -44,7 +39,7 @@ public:
: driver_device(mconfig, type, tag)
, m_hpc(*this, "hpc")
, m_eeprom(*this, "eeprom")
- , m_palette(*this, "palette")
+ , m_light(*this, "lg1")
{
}
@@ -58,96 +53,14 @@ protected:
DECLARE_WRITE32_MEMBER(int_w);
DECLARE_READ32_MEMBER(dsp_ram_r);
DECLARE_WRITE32_MEMBER(dsp_ram_w);
- DECLARE_READ32_MEMBER(entry_r);
- DECLARE_WRITE32_MEMBER(entry_w);
-
- void do_rex_command();
void indigo_map(address_map &map);
- uint32_t screen_update(screen_device &device, bitmap_rgb32 &bitmap, const rectangle &cliprect);
-
- enum
- {
- REX15_PAGE0_SET = 0x00000000,
- REX15_PAGE0_GO = 0x00000800,
- REX15_PAGE1_SET = 0x00004790,
- REX15_PAGE1_GO = 0x00004f90,
-
- REX15_P0REG_COMMAND = 0x00000000,
- REX15_P0REG_XSTARTI = 0x0000000c,
- REX15_P0REG_YSTARTI = 0x0000001c,
- REX15_P0REG_XYMOVE = 0x00000034,
- REX15_P0REG_COLORREDI = 0x00000038,
- REX15_P0REG_COLORGREENI = 0x00000040,
- REX15_P0REG_COLORBLUEI = 0x00000048,
- REX15_P0REG_COLORBACK = 0x0000005c,
- REX15_P0REG_ZPATTERN = 0x00000060,
- REX15_P0REG_XENDI = 0x00000084,
- REX15_P0REG_YENDI = 0x00000088,
-
- REX15_P1REG_WCLOCKREV = 0x00000054,
- REX15_P1REG_CFGDATA = 0x00000058,
- REX15_P1REG_CFGSEL = 0x0000005c,
- REX15_P1REG_VC1_ADDRDATA = 0x00000060,
- REX15_P1REG_CFGMODE = 0x00000068,
- REX15_P1REG_XYOFFSET = 0x0000006c,
-
- REX15_OP_NOP = 0x00000000,
- REX15_OP_DRAW = 0x00000001,
-
- REX15_OP_FLAG_BLOCK = 0x00000008,
- REX15_OP_FLAG_LENGTH32 = 0x00000010,
- REX15_OP_FLAG_QUADMODE = 0x00000020,
- REX15_OP_FLAG_XYCONTINUE = 0x00000080,
- REX15_OP_FLAG_STOPONX = 0x00000100,
- REX15_OP_FLAG_STOPONY = 0x00000200,
- REX15_OP_FLAG_ENZPATTERN = 0x00000400,
- REX15_OP_FLAG_LOGICSRC = 0x00080000,
- REX15_OP_FLAG_ZOPAQUE = 0x00800000,
- REX15_OP_FLAG_ZCONTINUE = 0x01000000,
-
- REX15_WRITE_ADDR = 0x00,
- REX15_PALETTE_RAM = 0x01,
- REX15_PIXEL_READ_MASK = 0x02,
- REX15_CONTROL = 0x06
- };
-
- struct lg1_t
- {
- uint32_t m_config_sel;
- uint32_t m_write_addr;
- uint32_t m_control;
-
- uint32_t m_command;
- uint32_t m_x_start_i;
- uint32_t m_y_start_i;
- uint32_t m_xy_move;
- uint32_t m_color_red_i;
- uint32_t m_color_green_i;
- uint32_t m_color_blue_i;
- uint32_t m_color_back;
- uint32_t m_z_pattern;
- uint32_t m_x_end_i;
- uint32_t m_y_end_i;
- uint32_t m_x_curr_i;
- uint32_t m_y_curr_i;
-
- uint8_t m_palette_idx;
- uint8_t m_palette_channel;
- uint8_t m_palette_entry[3];
- uint8_t m_pix_read_mask[256];
- };
-
required_device<hpc1_device> m_hpc;
required_device<eeprom_serial_93cxx_device> m_eeprom;
- required_device<palette_device> m_palette;
std::unique_ptr<uint32_t[]> m_dsp_ram;
-
+ required_device<light_video_device> m_light;
address_space *m_space;
-
- lg1_t m_lg1;
- std::unique_ptr<uint8_t[]> m_framebuffer;
};
class indigo3k_state : public indigo_state
@@ -195,37 +108,11 @@ protected:
void indigo_state::machine_start()
{
m_dsp_ram = std::make_unique<uint32_t[]>(0x8000);
- m_framebuffer = std::make_unique<uint8_t[]>(1024*768);
-
- save_item(NAME(m_lg1.m_config_sel));
- save_item(NAME(m_lg1.m_write_addr));
- save_item(NAME(m_lg1.m_control));
- save_item(NAME(m_lg1.m_command));
- save_item(NAME(m_lg1.m_x_start_i));
- save_item(NAME(m_lg1.m_y_start_i));
- save_item(NAME(m_lg1.m_xy_move));
- save_item(NAME(m_lg1.m_color_red_i));
- save_item(NAME(m_lg1.m_color_green_i));
- save_item(NAME(m_lg1.m_color_blue_i));
- save_item(NAME(m_lg1.m_color_back));
- save_item(NAME(m_lg1.m_z_pattern));
- save_item(NAME(m_lg1.m_x_end_i));
- save_item(NAME(m_lg1.m_y_end_i));
- save_item(NAME(m_lg1.m_x_curr_i));
- save_item(NAME(m_lg1.m_y_curr_i));
- save_item(NAME(m_lg1.m_palette_idx));
- save_item(NAME(m_lg1.m_palette_channel));
- save_item(NAME(m_lg1.m_palette_entry));
- save_item(NAME(m_lg1.m_pix_read_mask));
-
save_pointer(NAME(&m_dsp_ram[0]), 0x8000);
- save_pointer(NAME(&m_framebuffer[0]), 1024*768);
}
void indigo_state::machine_reset()
{
- memset(&m_lg1, 0, sizeof(lg1_t));
- memset(&m_framebuffer[0], 0, 1024*768);
}
void indigo4k_state::machine_reset()
@@ -259,262 +146,10 @@ WRITE32_MEMBER(indigo_state::dsp_ram_w)
m_dsp_ram[offset] = data;
}
-READ32_MEMBER(indigo_state::entry_r)
-{
- uint32_t ret = 0;
- switch (offset)
- {
- case REX15_PAGE0_GO/4:
- LOGMASKED(LOG_GFX, "%s: LG1 Read: Status(?) (Go) %08x = %08x & %08x\n", machine().describe_context(), 0x1f3f0000 + offset*4, ret, mem_mask);
- do_rex_command();
- break;
- case 0x0014/4:
- ret = 0x033c0000;
- LOGMASKED(LOG_GFX, "%s: LG1 Read: Presence Detect(?) %08x = %08x & %08x\n", machine().describe_context(), 0x1f3f0000 + offset*4, ret, mem_mask);
- break;
- default:
- LOGMASKED(LOG_GFX, "%s: Unknown LG1 Read: %08x = %08x & %08x\n", machine().describe_context(), 0x1f3f0000 + offset*4, ret, mem_mask);
- break;
- }
- return ret;
-}
-
-void indigo_state::do_rex_command()
-{
- if (m_lg1.m_command == 0)
- {
- return;
- }
- if (m_lg1.m_command == 0x30080329)
- {
- bool xycontinue = (m_lg1.m_command & REX15_OP_FLAG_XYCONTINUE);
- bool copy = (m_lg1.m_command & REX15_OP_FLAG_LOGICSRC);
- const uint32_t start_x = xycontinue ? m_lg1.m_x_curr_i : m_lg1.m_x_start_i;
- const uint32_t start_y = xycontinue ? m_lg1.m_y_curr_i : m_lg1.m_y_start_i;
- const uint32_t end_x = m_lg1.m_x_end_i;
- const uint32_t end_y = m_lg1.m_y_end_i;
- const uint32_t src_start_x = start_x + (m_lg1.m_xy_move >> 16);
- const uint32_t src_start_y = start_y + (uint16_t)m_lg1.m_xy_move;;
-
- LOGMASKED(LOG_GFX, "LG1: Command %08x: Block copy from %d,%d-%d,%d inclusive.\n", m_lg1.m_command, start_x, start_y, end_x, end_y);
- if (copy)
- {
- for (uint32_t y = start_y, src_y = src_start_y; y <= end_y; y++, src_y++)
- for (uint32_t x = start_x, src_x = src_start_x; x <= end_x; x++, src_x++)
- m_framebuffer[y*1024 + x] = m_framebuffer[src_y*1024 + src_x];
- }
- else
- {
- for (uint32_t y = start_y; y <= end_y; y++)
- for (uint32_t x = start_x; x <= end_x; x++)
- m_framebuffer[y*1024 + x] = m_lg1.m_color_red_i;
- }
- }
- else if (m_lg1.m_command == 0x30000329)
- {
- bool xycontinue = (m_lg1.m_command & REX15_OP_FLAG_XYCONTINUE);
- uint32_t start_x = xycontinue ? m_lg1.m_x_curr_i : m_lg1.m_x_start_i;
- uint32_t start_y = xycontinue ? m_lg1.m_y_curr_i : m_lg1.m_y_start_i;
- uint32_t end_x = m_lg1.m_x_end_i;
- uint32_t end_y = m_lg1.m_y_end_i;
-
- LOGMASKED(LOG_GFX, "LG1: Command %08x: Block draw from %d,%d-%d,%d inclusive.\n", m_lg1.m_command, start_x, start_y, end_x, end_y);
- for (uint32_t y = start_y; y <= end_y; y++)
- {
- for (uint32_t x = start_x; x <= end_x; x++)
- {
- m_framebuffer[y*1024 + x] = m_lg1.m_color_red_i;
- }
- }
- }
- else if (m_lg1.m_command == 0x300005a1 ||
- m_lg1.m_command == 0x300005a9 ||
- m_lg1.m_command == 0x300005b9)
- {
- bool xycontinue = (m_lg1.m_command & REX15_OP_FLAG_XYCONTINUE);
- uint32_t start_x = xycontinue ? m_lg1.m_x_curr_i : m_lg1.m_x_start_i;
- uint32_t start_y = xycontinue ? m_lg1.m_y_curr_i : m_lg1.m_y_start_i;
- uint32_t end_x = m_lg1.m_x_end_i;
- LOGMASKED(LOG_GFX, "LG1: Command %08x: Pattern draw from %d-%d at %d\n", m_lg1.m_command, start_x, end_x, start_y);
- for (uint32_t x = start_x; x <= end_x && x < (start_x + 32); x++)
- {
- if (BIT(m_lg1.m_z_pattern, 31 - (x - start_x)))
- {
- m_framebuffer[start_y*1024 + x] = m_lg1.m_color_red_i;
- }
- m_lg1.m_x_curr_i++;
- }
-
- if (m_lg1.m_command & REX15_OP_FLAG_BLOCK)
- {
- if (m_lg1.m_x_curr_i > m_lg1.m_x_end_i)
- {
- m_lg1.m_y_curr_i--;
- m_lg1.m_x_curr_i = m_lg1.m_x_start_i;
- }
- }
- }
- else
- {
- LOGMASKED(LOG_GFX_CMD | LOG_UNKNOWN, "%s: Unknown LG1 command: %08x\n", machine().describe_context(), m_lg1.m_command);
- }
-}
-
-WRITE32_MEMBER(indigo_state::entry_w)
-{
- bool go = (offset >= REX15_PAGE1_GO/4) || (offset >= REX15_PAGE0_GO/4 && offset < REX15_PAGE1_SET/4);
-
- switch (offset)
- {
- case (REX15_PAGE0_SET+REX15_P0REG_COMMAND)/4:
- case (REX15_PAGE0_GO+REX15_P0REG_COMMAND)/4:
- m_lg1.m_command = data;
- LOGMASKED(LOG_GFX, "%s: LG1 REX1.5 Command Write (%s) = %08x\n", machine().describe_context(), (offset & 0x200) ? "Go" : "Set", data);
- if (go)
- do_rex_command();
- break;
- case (REX15_PAGE0_SET+REX15_P0REG_XSTARTI)/4:
- case (REX15_PAGE0_GO+REX15_P0REG_XSTARTI)/4:
- m_lg1.m_x_start_i = data;
- m_lg1.m_x_curr_i = m_lg1.m_x_start_i;
- LOGMASKED(LOG_GFX, "%s: LG1 REX1.5 XStartI Write (%s) = %08x\n", machine().describe_context(), (offset & 0x200) ? "Go" : "Set", data);
- break;
- case (REX15_PAGE0_SET+REX15_P0REG_YSTARTI)/4:
- case (REX15_PAGE0_GO+REX15_P0REG_YSTARTI)/4:
- m_lg1.m_y_start_i = data;
- m_lg1.m_y_curr_i = m_lg1.m_y_start_i;
- LOGMASKED(LOG_GFX, "%s: LG1 REX1.5 YStartI Write (%s) = %08x\n", machine().describe_context(), (offset & 0x200) ? "Go" : "Set", data);
- break;
- case (REX15_PAGE0_SET+REX15_P0REG_XYMOVE)/4:
- case (REX15_PAGE0_GO+REX15_P0REG_XYMOVE)/4:
- m_lg1.m_xy_move = data;
- LOGMASKED(LOG_GFX, "%s: LG1 REX1.5 XYMove Write (%s) = %08x\n", machine().describe_context(), (offset & 0x200) ? "Go" : "Set", data);
- if (go)
- do_rex_command();
- break;
- case (REX15_PAGE0_SET+REX15_P0REG_COLORREDI)/4:
- case (REX15_PAGE0_GO+REX15_P0REG_COLORREDI)/4:
- m_lg1.m_color_red_i = data;
- LOGMASKED(LOG_GFX, "%s: LG1 REX1.5 ColorRedI Write (%s) = %08x\n", machine().describe_context(), (offset & 0x200) ? "Go" : "Set", data);
- break;
- case (REX15_PAGE0_SET+REX15_P0REG_COLORGREENI)/4:
- case (REX15_PAGE0_GO+REX15_P0REG_COLORGREENI)/4:
- m_lg1.m_color_green_i = data;
- LOGMASKED(LOG_GFX, "%s: LG1 REX1.5 ColorGreenI Write (%s) = %08x\n", machine().describe_context(), (offset & 0x200) ? "Go" : "Set", data);
- break;
- case (REX15_PAGE0_SET+REX15_P0REG_COLORBLUEI)/4:
- case (REX15_PAGE0_GO+REX15_P0REG_COLORBLUEI)/4:
- m_lg1.m_color_blue_i = data;
- LOGMASKED(LOG_GFX, "%s: LG1 REX1.5 ColorBlueI Write (%s) = %08x\n", machine().describe_context(), (offset & 0x200) ? "Go" : "Set", data);
- break;
- case (REX15_PAGE0_SET+REX15_P0REG_COLORBACK)/4:
- case (REX15_PAGE0_GO+REX15_P0REG_COLORBACK)/4:
- m_lg1.m_color_back = data;
- LOGMASKED(LOG_GFX, "%s: LG1 REX1.5 ColorBlueI Write (%s) = %08x\n", machine().describe_context(), (offset & 0x200) ? "Go" : "Set", data);
- break;
- case (REX15_PAGE0_SET+REX15_P0REG_ZPATTERN)/4:
- case (REX15_PAGE0_GO+REX15_P0REG_ZPATTERN)/4:
- m_lg1.m_z_pattern = data;
- LOGMASKED(LOG_GFX, "%s: LG1 REX1.5 ZPattern Write (%s) = %08x\n", machine().describe_context(), (offset & 0x200) ? "Go" : "Set", data);
- if (go)
- do_rex_command();
- break;
- case (REX15_PAGE0_SET+REX15_P0REG_XENDI)/4:
- case (REX15_PAGE0_GO+REX15_P0REG_XENDI)/4:
- m_lg1.m_x_end_i = data;
- LOGMASKED(LOG_GFX, "%s: LG1 REX1.5 XEndI Write (%s) = %08x\n", machine().describe_context(), (offset & 0x200) ? "Go" : "Set", data);
- break;
- case (REX15_PAGE0_SET+REX15_P0REG_YENDI)/4:
- case (REX15_PAGE0_GO+REX15_P0REG_YENDI)/4:
- m_lg1.m_y_end_i = data;
- LOGMASKED(LOG_GFX, "%s: LG1 REX1.5 YEndI Write (%s) = %08x\n", machine().describe_context(), (offset & 0x200) ? "Go" : "Set", data);
- break;
-
- case (REX15_PAGE1_SET+REX15_P1REG_CFGSEL)/4:
- case (REX15_PAGE1_GO+REX15_P1REG_CFGSEL)/4:
- m_lg1.m_config_sel = data;
- switch (data)
- {
- case REX15_WRITE_ADDR:
- LOGMASKED(LOG_GFX, "%s: LG1 ConfigSel Write = %08x (Write Addr)\n", machine().describe_context(), data);
- break;
- case REX15_PALETTE_RAM:
- LOGMASKED(LOG_GFX, "%s: LG1 ConfigSel Write = %08x (Palette RAM)\n", machine().describe_context(), data);
- break;
- case REX15_CONTROL:
- LOGMASKED(LOG_GFX, "%s: LG1 ConfigSel Write = %08x (Control)\n", machine().describe_context(), data);
- break;
- case REX15_PIXEL_READ_MASK:
- LOGMASKED(LOG_GFX, "%s: LG1 ConfigSel Write = %08x (Pixel Read Mask)\n", machine().describe_context(), data);
- break;
- default:
- LOGMASKED(LOG_GFX, "%s: LG1 ConfigSel Write = %08x (Unknown)\n", machine().describe_context(), data);
- break;
- }
- break;
- case (REX15_PAGE1_SET+REX15_P1REG_CFGDATA)/4:
- case (REX15_PAGE1_GO+REX15_P1REG_CFGDATA)/4:
- if (go) // Ignore 'Go' writes for now, unsure what they do
- break;
- switch (m_lg1.m_config_sel)
- {
- case REX15_WRITE_ADDR:
- LOGMASKED(LOG_GFX, "%s: LG1 ConfigSel Write: Setting WriteAddr to %08x\n", machine().describe_context(), data);
- m_lg1.m_write_addr = data;
- if (m_lg1.m_control == 0xf)
- {
- LOGMASKED(LOG_GFX, "%s: LG1 about to set palette entry %02x\n", machine().describe_context(), (uint8_t)data);
- m_lg1.m_palette_idx = (uint8_t)data;
- m_lg1.m_palette_channel = 0;
- }
- break;
- case REX15_PALETTE_RAM:
- LOGMASKED(LOG_GFX, "%s: LG1 ConfigSel Write: Setting Palette RAM %02x entry %d to %02x\n", machine().describe_context(),
- m_lg1.m_palette_idx, m_lg1.m_palette_channel, (uint8_t)data);
- m_lg1.m_palette_entry[m_lg1.m_palette_channel++] = (uint8_t)data;
- if (m_lg1.m_palette_channel == 3)
- {
- m_palette->set_pen_color(m_lg1.m_palette_idx, m_lg1.m_palette_entry[0], m_lg1.m_palette_entry[1], m_lg1.m_palette_entry[2]);
- }
- break;
- case REX15_CONTROL:
- LOGMASKED(LOG_GFX, "%s: LG1 ConfigSel Write: Setting Control to %08x\n", machine().describe_context(), data);
- m_lg1.m_control = data;
- break;
- case REX15_PIXEL_READ_MASK:
- LOGMASKED(LOG_GFX, "%s: LG1 ConfigSel Write = %08x (Pixel Read Mask, entry %02x)\n", machine().describe_context(), data, m_lg1.m_palette_idx);
- m_lg1.m_pix_read_mask[m_lg1.m_palette_idx] = (uint8_t)data;
- break;
- default:
- LOGMASKED(LOG_GFX, "%s: LG1 Unknown ConfigData Write = %08x\n", machine().describe_context(), data);
- break;
- }
- break;
- default:
- LOGMASKED(LOG_GFX, "%s: Unknown LG1 Write: %08x = %08x & %08x\n", machine().describe_context(), 0x1f3f0000 + offset*4, data, mem_mask);
- break;
- }
-}
-
-uint32_t indigo_state::screen_update(screen_device &device, bitmap_rgb32 &bitmap, const rectangle &cliprect)
-{
- const rgb_t *pens = m_palette->palette()->entry_list_raw();
-
- for (int y = 0; y < 768; y++)
- {
- uint32_t *dst = &bitmap.pix32(y);
- uint8_t *src = &m_framebuffer[y*1024];
- for (int x = 0; x < 1024; x++)
- {
- *dst++ = pens[*src++];
- }
- }
- return 0;
-}
void indigo_state::indigo_map(address_map &map)
{
- map(0x1f3f0000, 0x1f3fffff).rw(FUNC(indigo_state::entry_r), FUNC(indigo_state::entry_w));
+ map(0x1f3f0000, 0x1f3fffff).rw(m_light, FUNC(light_video_device::entry_r), FUNC(light_video_device::entry_w));
map(0x1fb80000, 0x1fb8ffff).rw(m_hpc, FUNC(hpc1_device::read), FUNC(hpc1_device::write));
map(0x1fbd9000, 0x1fbd903f).rw(FUNC(indigo_state::int_r), FUNC(indigo_state::int_w));
map(0x1fbe0000, 0x1fbfffff).rw(FUNC(indigo_state::dsp_ram_r), FUNC(indigo_state::dsp_ram_w));
@@ -559,15 +194,7 @@ INPUT_PORTS_END
void indigo_state::indigo_base(machine_config &config)
{
- /* video hardware */
- screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
- screen.set_refresh_hz(60);
- screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */
- screen.set_size(1024, 768);
- screen.set_visarea(0, 1024-1, 0, 768-1);
- screen.set_screen_update(FUNC(indigo_state::screen_update));
-
- PALETTE(config, m_palette).set_entries(256);
+ LIGHT_VIDEO(config, m_light);
EEPROM_93C56_16BIT(config, m_eeprom);
}
diff --git a/src/mame/drivers/indy_indigo2.cpp b/src/mame/drivers/indy_indigo2.cpp
index 1c19fa6777e..5d2e88a4de5 100644
--- a/src/mame/drivers/indy_indigo2.cpp
+++ b/src/mame/drivers/indy_indigo2.cpp
@@ -7,14 +7,7 @@
* Known Issues:
* - The proper hookup for the MAC address is unknown, requiring
* a fake MAC to be set up before any IRIX installers will proceed.
-* - The IRIX 6.5.x installer kernel-panics on startup.
-* - The IRIX 5.3 installer hangs after loading.
* - The Gentoo Linux live CD hangs on starting the kernel.
-* - The disk formatting/partitioning utility for IRIX, fx, has
-* various issues, from the disk formatting too quickly to hanging
-* when exercising the disk.
-* - Disk accesses frequently result in a "SYNC negotiation error"
-* message.
*
* Memory map:
*
@@ -60,13 +53,13 @@
\*********************************************************************/
#include "emu.h"
-#include "bus/scsi/scsi.h"
-#include "bus/scsi/scsicd.h"
-#include "bus/scsi/scsihd.h"
-#include "cpu/mips/mips3.h"
+#include "cpu/mips/r4000.h"
#include "machine/hpc3.h"
+#include "machine/nscsi_bus.h"
+#include "machine/nscsi_cd.h"
+#include "machine/nscsi_hd.h"
#include "machine/sgi.h"
#include "sound/cdda.h"
@@ -84,7 +77,7 @@ public:
, m_maincpu(*this, "maincpu")
, m_mainram(*this, "mainram")
, m_mem_ctrl(*this, "memctrl")
- , m_scsi_ctrl(*this, "wd33c93")
+ , m_scsi_ctrl(*this, "scsibus:0:wd33c93")
, m_newport(*this, "newport")
, m_hpc3(*this, "hpc3")
{
@@ -103,12 +96,14 @@ protected:
void ip22_map(address_map &map);
- static void cdrom_config(device_t *device);
+ void wd33c93(device_t *device);
- required_device<mips3_device> m_maincpu;
+ static void scsi_devices(device_slot_interface &device);
+
+ required_device<cpu_device> m_maincpu;
required_shared_ptr<uint64_t> m_mainram;
required_device<sgi_mc_device> m_mem_ctrl;
- required_device<wd33c93_device> m_scsi_ctrl;
+ required_device<wd33c93b_device> m_scsi_ctrl;
required_device<newport_video_device> m_newport;
required_device<hpc3_device> m_hpc3;
};
@@ -118,14 +113,16 @@ class ip24_state : public ip22_state
public:
ip24_state(const machine_config &mconfig, device_type type, const char *tag)
: ip22_state(mconfig, type, tag)
- , m_scsi_ctrl2(*this, "wd33c93_2")
+ , m_scsi_ctrl2(*this, "scsibus2:0:wd33c93")
{
}
void ip244415(machine_config &config);
private:
- required_device<wd33c93_device> m_scsi_ctrl2;
+ void wd33c93_2(device_t *device);
+
+ required_device<wd33c93b_device> m_scsi_ctrl2;
};
READ32_MEMBER(ip22_state::eisa_io_r)
@@ -169,7 +166,7 @@ void ip22_state::machine_reset()
// set up low RAM mirror
membank("bank1")->set_base(m_mainram);
- m_maincpu->mips3drc_set_options(MIPS3DRC_COMPATIBLE_OPTIONS | MIPS3DRC_CHECK_OVERFLOWS);
+ //m_maincpu->mips3drc_set_options(MIPS3DRC_COMPATIBLE_OPTIONS | MIPS3DRC_CHECK_OVERFLOWS);
}
static INPUT_PORTS_START( ip225015 )
@@ -180,11 +177,25 @@ static INPUT_PORTS_START( ip225015 )
PORT_INCLUDE( at_keyboard ) /* IN4 - IN11 */
INPUT_PORTS_END
-void ip22_state::cdrom_config(device_t *device)
+//static void cdrom_config(device_t *device)
+//{
+// cdda_device *cdda = device->subdevice<cdda_device>("cdda");
+// cdda->add_route(0, ":hpc3:lspeaker", 1.0);
+// cdda->add_route(1, ":hpc3:rspeaker", 1.0);
+//}
+
+void ip22_state::wd33c93(device_t *device)
+{
+ device->set_clock(10000000);
+ downcast<wd33c93b_device *>(device)->irq_cb().set(m_hpc3, FUNC(hpc3_device::scsi0_irq));
+ downcast<wd33c93b_device *>(device)->drq_cb().set(m_hpc3, FUNC(hpc3_device::scsi0_drq));
+}
+
+void ip22_state::scsi_devices(device_slot_interface &device)
{
- cdda_device *cdda = device->subdevice<cdda_device>("cdda");
- cdda->add_route(0, ":hpc3:lspeaker", 1.0);
- cdda->add_route(1, ":hpc3:rspeaker", 1.0);
+ device.option_add("cdrom", NSCSI_CDROM_SGI);
+ device.option_add("harddisk", NSCSI_HARDDISK);
+ //device.set_option_machine_config("cdrom", cdrom_config);
}
void ip22_state::ip22_base(machine_config &config)
@@ -202,26 +213,27 @@ void ip22_state::ip22_base(machine_config &config)
NEWPORT_VIDEO(config, m_newport, m_maincpu, m_hpc3);
- SGI_MC(config, m_mem_ctrl, m_maincpu, ":hpc3:eeprom");
-
- scsi_port_device &scsi(SCSI_PORT(config, "scsi"));
- scsi.set_slot_device(1, "harddisk", SCSIHD, DEVICE_INPUT_DEFAULTS_NAME(SCSI_ID_1));
- scsi.set_slot_device(2, "cdrom", SCSICD, DEVICE_INPUT_DEFAULTS_NAME(SCSI_ID_4));
- scsi.slot(2).set_option_machine_config("cdrom", cdrom_config);
-
- WD33C93(config, m_scsi_ctrl);
- m_scsi_ctrl->set_scsi_port("scsi");
- m_scsi_ctrl->irq_cb().set(m_hpc3, FUNC(hpc3_device::scsi0_irq));
- //m_scsi_ctrl->drq_cb().set(m_hpc3, FUNC(hpc3_device::scsi0_drq));
+ SGI_MC(config, m_mem_ctrl, m_maincpu, ":hpc3:eeprom", m_hpc3);
+
+ NSCSI_BUS(config, "scsibus", 0);
+ NSCSI_CONNECTOR(config, "scsibus:0").option_set("wd33c93", WD33C93B)
+ .machine_config([this](device_t *device) { wd33c93(device); });
+ NSCSI_CONNECTOR(config, "scsibus:1", scsi_devices, "harddisk", false);
+ NSCSI_CONNECTOR(config, "scsibus:2", scsi_devices, nullptr, false);
+ NSCSI_CONNECTOR(config, "scsibus:3", scsi_devices, nullptr, false);
+ NSCSI_CONNECTOR(config, "scsibus:4", scsi_devices, nullptr, false);
+ NSCSI_CONNECTOR(config, "scsibus:5", scsi_devices, nullptr, false);
+ NSCSI_CONNECTOR(config, "scsibus:6", scsi_devices, "cdrom", false);
+ NSCSI_CONNECTOR(config, "scsibus:7", scsi_devices, nullptr, false);
}
void ip22_state::ip225015(machine_config &config)
{
ip22_base(config);
- R5000BE(config, m_maincpu, 50000000*3);
- m_maincpu->set_icache_size(32768);
- m_maincpu->set_dcache_size(32768);
+ R4000(config, m_maincpu, 50000000*3);
+ //m_maincpu->set_icache_size(32768);
+ //m_maincpu->set_dcache_size(32768);
m_maincpu->set_addrmap(AS_PROGRAM, &ip22_state::ip22_map);
SGI_HPC3(config, m_hpc3, m_maincpu, m_scsi_ctrl);
@@ -231,29 +243,40 @@ void ip22_state::ip224613(machine_config &config)
{
ip22_base(config);
- R4600BE(config, m_maincpu, 33333333*4);
- m_maincpu->set_icache_size(32768);
- m_maincpu->set_dcache_size(32768);
+ R4600(config, m_maincpu, 33333333*4);
+ //m_maincpu->set_icache_size(32768);
+ //m_maincpu->set_dcache_size(32768);
m_maincpu->set_addrmap(AS_PROGRAM, &ip22_state::ip22_map);
SGI_HPC3(config, m_hpc3, m_maincpu, m_scsi_ctrl);
}
+void ip24_state::wd33c93_2(device_t *device)
+{
+ device->set_clock(10000000);
+ downcast<wd33c93b_device *>(device)->irq_cb().set(m_hpc3, FUNC(hpc3_device::scsi1_irq));
+ downcast<wd33c93b_device *>(device)->drq_cb().set(m_hpc3, FUNC(hpc3_device::scsi1_drq));
+}
+
void ip24_state::ip244415(machine_config &config)
{
ip22_base(config);
- R4400BE(config, m_maincpu, 50000000*3);
- m_maincpu->set_icache_size(32768);
- m_maincpu->set_dcache_size(32768);
+ R4400(config, m_maincpu, 50000000*3);
+ //m_maincpu->set_icache_size(32768);
+ //m_maincpu->set_dcache_size(32768);
m_maincpu->set_addrmap(AS_PROGRAM, &ip24_state::ip22_map);
- SCSI_PORT(config, "scsi2");
-
- WD33C93(config, m_scsi_ctrl2);
- m_scsi_ctrl2->set_scsi_port("scsi2");
- m_scsi_ctrl->irq_cb().set(m_hpc3, FUNC(hpc3_device::scsi1_irq));
- //m_scsi_ctrl->drq_cb().set(m_hpc3, FUNC(hpc3_device::scsi1_drq));
+ NSCSI_BUS(config, "scsibus2", 0);
+ NSCSI_CONNECTOR(config, "scsibus2:0").option_set("wd33c93", WD33C93B)
+ .machine_config([this](device_t *device) { wd33c93_2(device); });
+ NSCSI_CONNECTOR(config, "scsibus2:1", scsi_devices, nullptr, false);
+ NSCSI_CONNECTOR(config, "scsibus2:2", scsi_devices, nullptr, false);
+ NSCSI_CONNECTOR(config, "scsibus2:3", scsi_devices, nullptr, false);
+ NSCSI_CONNECTOR(config, "scsibus2:4", scsi_devices, nullptr, false);
+ NSCSI_CONNECTOR(config, "scsibus2:5", scsi_devices, nullptr, false);
+ NSCSI_CONNECTOR(config, "scsibus2:6", scsi_devices, nullptr, false);
+ NSCSI_CONNECTOR(config, "scsibus2:7", scsi_devices, nullptr, false);
SGI_HPC3(config, m_hpc3, m_maincpu, m_scsi_ctrl, m_scsi_ctrl2);
}
diff --git a/src/mame/drivers/instantm.cpp b/src/mame/drivers/instantm.cpp
index 7f45523161f..c2ebed3ca81 100644
--- a/src/mame/drivers/instantm.cpp
+++ b/src/mame/drivers/instantm.cpp
@@ -126,24 +126,26 @@ void instantm_state::machine_reset()
// OSC1 = XTAL(3'579'545)
-MACHINE_CONFIG_START(instantm_state::instantm)
+void instantm_state::instantm(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, XTAL(3'579'545))
- MCFG_DEVICE_PROGRAM_MAP(main_map)
+ Z80(config, m_maincpu, XTAL(3'579'545));
+ m_maincpu->set_addrmap(AS_PROGRAM, &instantm_state::main_map);
- MCFG_DEVICE_ADD("subcpu", Z80, XTAL(3'579'545))
- MCFG_DEVICE_PROGRAM_MAP(sub_map)
- MCFG_DEVICE_IO_MAP(sub_io)
+ z80_device &subcpu(Z80(config, "subcpu", XTAL(3'579'545)));
+ subcpu.set_addrmap(AS_PROGRAM, &instantm_state::sub_map);
+ subcpu.set_addrmap(AS_IO, &instantm_state::sub_io);
// all guesswork
- MCFG_DEVICE_ADD("voice_clock", CLOCK, 24000)
- MCFG_CLOCK_SIGNAL_HANDLER(WRITELINE(*this, instantm_state, clock_w))
+ clock_device &voice_clock(CLOCK(config, "voice_clock", 24000));
+ voice_clock.signal_handler().set(FUNC(instantm_state::clock_w));
SPEAKER(config, "speaker").front_center();
- MCFG_DEVICE_ADD("dac", MC1408, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 0.5)
- MCFG_DEVICE_ADD("vref", VOLTAGE_REGULATOR, 0) MCFG_VOLTAGE_REGULATOR_OUTPUT(5.0)
- MCFG_SOUND_ROUTE(0, "dac", 1.0, DAC_VREF_POS_INPUT) MCFG_SOUND_ROUTE(0, "dac", -1.0, DAC_VREF_NEG_INPUT)
-MACHINE_CONFIG_END
+ MC1408(config, "dac", 0).add_route(ALL_OUTPUTS, "speaker", 0.5);
+ voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref"));
+ vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT);
+ vref.add_route(0, "dac", -1.0, DAC_VREF_NEG_INPUT);
+}
diff --git a/src/mame/drivers/instruct.cpp b/src/mame/drivers/instruct.cpp
index b6c9aff95d1..f283d632037 100644
--- a/src/mame/drivers/instruct.cpp
+++ b/src/mame/drivers/instruct.cpp
@@ -436,8 +436,8 @@ void instruct_state::instruct(machine_config &config)
config.set_default_layout(layout_instruct);
/* quickload */
- quickload_image_device &quickload(QUICKLOAD(config, "quickload", 0));
- quickload.set_handler(snapquick_load_delegate(&QUICKLOAD_LOAD_NAME(instruct_state, instruct), this), "pgm", 1);
+ quickload_image_device &quickload(QUICKLOAD(config, "quickload"));
+ quickload.set_handler(snapquick_load_delegate(&QUICKLOAD_LOAD_NAME(instruct_state, instruct), this), "pgm", attotime::from_seconds(1));
/* cassette */
CASSETTE(config, m_cass);
diff --git a/src/mame/drivers/inteladv.cpp b/src/mame/drivers/inteladv.cpp
index 57254101554..cd18f857685 100644
--- a/src/mame/drivers/inteladv.cpp
+++ b/src/mame/drivers/inteladv.cpp
@@ -81,26 +81,27 @@ void inteladv_state::machine_reset()
{
}
-MACHINE_CONFIG_START(inteladv_state::inteladv)
+void inteladv_state::inteladv(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", R65C02, XTAL(1'000'000) )
- MCFG_DEVICE_PROGRAM_MAP(inteladv_main)
+ R65C02(config, m_maincpu, XTAL(1'000'000));
+ m_maincpu->set_addrmap(AS_PROGRAM, &inteladv_state::inteladv_main);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(59.62) /* verified on pcb */
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(64*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(40, 400-1, 16, 240-1)
- MCFG_SCREEN_UPDATE_DRIVER(inteladv_state, screen_update_inteladv)
- MCFG_SCREEN_PALETTE("palette")
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(59.62); /* verified on pcb */
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(64*8, 32*8);
+ screen.set_visarea(40, 400-1, 16, 240-1);
+ screen.set_screen_update(FUNC(inteladv_state::screen_update_inteladv));
+ screen.set_palette("palette");
PALETTE(config, "palette").set_format(palette_device::xBGR_888, 256).enable_shadows();
/* sound hardware */
SPEAKER(config, "lspeaker").front_left();
SPEAKER(config, "rspeaker").front_right();
-MACHINE_CONFIG_END
+}
ROM_START( inteladv )
ROM_REGION( 0x800000, "maincpu", 0 ) /* main program */
diff --git a/src/mame/drivers/intellect02.cpp b/src/mame/drivers/intellect02.cpp
new file mode 100644
index 00000000000..98d43091362
--- /dev/null
+++ b/src/mame/drivers/intellect02.cpp
@@ -0,0 +1,321 @@
+// license:BSD-3-Clause
+// copyright-holders:hap
+/******************************************************************************
+
+Интеллект-02 (Intellect-02) driver
+
+This is a Soviet electronic board game console, a dozen or so cartridge games were
+made for it(can't say for certain how many released). PCB labels have prefix ДМП,
+it's assumed to have been designed by НИИ БРЭА (SRI BREA). First shown in 1983,
+produced during around 1985-1992.
+
+hardware notes:
+- КР580ВМ80А CPU (i8080A clone), speed unknown
+- КР580ИК55 (i8255 clone)
+- 1 KB RAM (8*КР565РУ2), cartridge port
+- 4-digit 7seg panel, 2 leds, 16 buttons, game board above it
+
+The chess/checkers board is detachable, with a board for Kalah underneath it.
+
+The hardware is very similar to Fidelity Chess Challenger 3. Actually, one of the
+first cartridges for this system, a Chess program, is a modified Chess Challenger 3 ROM.
+The chess engine was kept identical. (note: the "lose" LED is used for "check")
+
+Intellect-01 looks like it didn't get further than a prototype. It was a dedicated
+chess computer, probably a clone of CC3.
+
+keypad legend:
+
+СБ - сброс (reset)
+ВВ - ввод (input)
+ВИ - выбор игры (game select)
+СТ - стирание (erase)
+ПП - просмотр позиции (view position)
+УИ - уровень игры (game level)
+
+TODO:
+- identify ПП, УИ, 0, 9 buttons (only the chess program is dumped and it doesn't use them)
+- verify cpu speed
+
+******************************************************************************/
+
+#include "emu.h"
+
+#include "cpu/i8085/i8085.h"
+#include "machine/i8255.h"
+#include "machine/timer.h"
+#include "sound/dac.h"
+#include "sound/volt_reg.h"
+#include "speaker.h"
+#include "bus/generic/slot.h"
+#include "bus/generic/carts.h"
+#include "softlist.h"
+
+// internal artwork
+#include "intellect02.lh" // clickable
+
+
+namespace {
+
+class intel02_state : public driver_device
+{
+public:
+ intel02_state(const machine_config &mconfig, device_type type, const char *tag) :
+ driver_device(mconfig, type, tag),
+ m_maincpu(*this, "maincpu"),
+ m_ppi8255(*this, "ppi8255"),
+ m_delay_display(*this, "delay_display_%u", 0),
+ m_keypad(*this, "IN.%u", 0),
+ m_dac(*this, "dac"),
+ m_cart(*this, "cartslot"),
+ m_out_digit(*this, "digit%u", 0U),
+ m_out_led(*this, "led%u", 0U)
+ { }
+
+ // machine configs
+ void intel02(machine_config &config);
+
+ // assume that reset button is tied to RESET pin
+ DECLARE_INPUT_CHANGED_MEMBER(reset_button) { m_maincpu->set_input_line(INPUT_LINE_RESET, newval ? ASSERT_LINE : CLEAR_LINE); }
+
+protected:
+ virtual void machine_start() override;
+
+private:
+ // devices/pointers
+ required_device<cpu_device> m_maincpu;
+ required_device<i8255_device> m_ppi8255;
+ required_device_array<timer_device, 6> m_delay_display;
+ required_ioport_array<2> m_keypad;
+ required_device<dac_bit_interface> m_dac;
+ required_device<generic_slot_device> m_cart;
+ output_finder<4> m_out_digit;
+ output_finder<2> m_out_led;
+
+ DECLARE_DEVICE_IMAGE_LOAD_MEMBER(cartridge);
+
+ // display stuff
+ void update_display();
+ TIMER_DEVICE_CALLBACK_MEMBER(delay_display);
+
+ u8 m_digit_data;
+ u8 m_led_select;
+ u8 m_led_active;
+
+ // address maps
+ void main_map(address_map &map);
+ void main_io(address_map &map);
+
+ // I/O handlers
+ DECLARE_READ8_MEMBER(input_r);
+ DECLARE_WRITE8_MEMBER(digit_w);
+ DECLARE_WRITE8_MEMBER(control_w);
+};
+
+void intel02_state::machine_start()
+{
+ // resolve handlers
+ m_out_led.resolve();
+ m_out_digit.resolve();
+
+ // zerofill
+ m_digit_data = 0;
+ m_led_select = 0;
+ m_led_active = 0;
+
+ // register for savestates
+ save_item(NAME(m_digit_data));
+ save_item(NAME(m_led_select));
+ save_item(NAME(m_led_active));
+}
+
+
+
+/******************************************************************************
+ Devices, I/O
+******************************************************************************/
+
+// cartridge
+
+DEVICE_IMAGE_LOAD_MEMBER(intel02_state, cartridge)
+{
+ u32 size = m_cart->common_get_size("rom");
+ m_cart->rom_alloc(size, GENERIC_ROM8_WIDTH, ENDIANNESS_LITTLE);
+ m_cart->common_load_rom(m_cart->get_rom_base(), size, "rom");
+
+ return image_init_result::PASS;
+}
+
+
+// misc display handling
+
+void intel02_state::update_display()
+{
+ // latch digits (low 4 bits of led select)
+ for (int i = 0; i < 4; i++)
+ {
+ if (BIT(m_led_select, i))
+ m_out_digit[i] = m_digit_data;
+ else if (!BIT(m_led_active, i))
+ m_out_digit[i] = 0;
+ }
+
+ // led select d4: lose led, d5: win led
+ m_out_led[0] = BIT(m_led_active, 4);
+ m_out_led[1] = BIT(m_led_active, 5);
+}
+
+TIMER_DEVICE_CALLBACK_MEMBER(intel02_state::delay_display)
+{
+ u8 mask = 1 << param;
+ m_led_active = (m_led_active & ~mask) | (m_led_select & mask);
+ update_display();
+}
+
+
+// I8255 PPI
+
+READ8_MEMBER(intel02_state::input_r)
+{
+ // d0-d3: buttons through a priority encoder
+ // d4-d7: buttons (direct)
+ return (count_leading_zeros(m_keypad[0]->read()) - 17) | (~m_keypad[1]->read() << 4 & 0xf0);
+}
+
+WRITE8_MEMBER(intel02_state::digit_w)
+{
+ // d0-d7: digit segment data
+ m_digit_data = bitswap<8>(data,7,0,1,2,3,4,5,6);
+ update_display();
+}
+
+WRITE8_MEMBER(intel02_state::control_w)
+{
+ // d0-d5: select digit/leds
+ for (int i = 0; i < 6; i++)
+ {
+ if (BIT(data, i))
+ m_led_active |= 1 << i;
+
+ // they're strobed, so on falling edge, delay them going off to prevent flicker or stuck display
+ else if (BIT(m_led_select, i))
+ m_delay_display[i]->adjust(attotime::from_msec(10), i);
+ }
+
+ m_led_select = data;
+ update_display();
+
+ // d6: unused?
+ // it's a timer trigger on Chess Challenger 3
+
+ // d7: speaker out
+ m_dac->write(BIT(data, 7));
+}
+
+
+
+/******************************************************************************
+ Address Maps
+******************************************************************************/
+
+void intel02_state::main_map(address_map &map)
+{
+ map(0x0000, 0x1fff).r("cartslot", FUNC(generic_slot_device::read_rom));
+ map(0xf000, 0xf3ff).ram();
+}
+
+void intel02_state::main_io(address_map &map)
+{
+ map.global_mask(0xff);
+ map(0xf4, 0xf7).rw(m_ppi8255, FUNC(i8255_device::read), FUNC(i8255_device::write));
+}
+
+
+
+/******************************************************************************
+ Input Ports
+******************************************************************************/
+
+static INPUT_PORTS_START( intel02 )
+ PORT_START("IN.0")
+ PORT_BIT(0x003f, IP_ACTIVE_HIGH, IPT_UNKNOWN)
+ PORT_BIT(0x0040, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("H8") PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_CODE(KEYCODE_H)
+ PORT_BIT(0x0080, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("G7") PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_CODE(KEYCODE_G)
+ PORT_BIT(0x0100, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("F6") PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_CODE(KEYCODE_F)
+ PORT_BIT(0x0200, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("E5") PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_CODE(KEYCODE_E)
+ PORT_BIT(0x0400, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("D4") PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_CODE(KEYCODE_D)
+ PORT_BIT(0x0800, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("C3") PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_CODE(KEYCODE_C)
+ PORT_BIT(0x1000, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("B2") PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_CODE(KEYCODE_B)
+ PORT_BIT(0x2000, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("A1") PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_CODE(KEYCODE_A)
+ PORT_BIT(0x4000, IP_ACTIVE_HIGH, IPT_UNKNOWN)
+
+ PORT_START("IN.1")
+ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_UNKNOWN)
+ PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Input") PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD)
+ PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Game Select") PORT_CODE(KEYCODE_S)
+ PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Erase") PORT_CODE(KEYCODE_DEL) PORT_CODE(KEYCODE_BACKSPACE)
+
+ PORT_START("RESET")
+ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Reset") PORT_CODE(KEYCODE_R) PORT_CHANGED_MEMBER(DEVICE_SELF, intel02_state, reset_button, nullptr)
+INPUT_PORTS_END
+
+
+
+/******************************************************************************
+ Machine Configs
+******************************************************************************/
+
+void intel02_state::intel02(machine_config &config)
+{
+ /* basic machine hardware */
+ I8080A(config, m_maincpu, 2000000);
+ m_maincpu->set_addrmap(AS_PROGRAM, &intel02_state::main_map);
+ m_maincpu->set_addrmap(AS_IO, &intel02_state::main_io);
+
+ I8255(config, m_ppi8255);
+ m_ppi8255->in_pa_callback().set(FUNC(intel02_state::input_r));
+ m_ppi8255->tri_pa_callback().set_constant(0);
+ m_ppi8255->out_pb_callback().set(FUNC(intel02_state::digit_w));
+ m_ppi8255->tri_pb_callback().set_constant(0);
+ m_ppi8255->out_pc_callback().set(FUNC(intel02_state::control_w));
+
+ /* video hardware */
+ for (int i = 0; i < 6; i++)
+ TIMER(config, m_delay_display[i]).configure_generic(FUNC(intel02_state::delay_display));
+
+ config.set_default_layout(layout_intellect02);
+
+ /* sound hardware */
+ SPEAKER(config, "speaker").front_center();
+ DAC_1BIT(config, m_dac).add_route(ALL_OUTPUTS, "speaker", 0.25);
+ VOLTAGE_REGULATOR(config, "vref").add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT);
+
+ /* cartridge */
+ GENERIC_CARTSLOT(config, m_cart, generic_plain_slot, "intellect02", "bin");
+ m_cart->set_device_load(device_image_load_delegate(&intel02_state::device_image_load_cartridge, this));
+ m_cart->set_must_be_loaded(true);
+
+ SOFTWARE_LIST(config, "cart_list").set_original("intellect02");
+}
+
+
+
+/******************************************************************************
+ ROM Definitions
+******************************************************************************/
+
+ROM_START( intel02 )
+ ROM_REGION( 0x10000, "maincpu", ROMREGION_ERASE00 )
+ // nothing here, it's on a cartridge
+ROM_END
+
+} // anonymous namespace
+
+
+
+/******************************************************************************
+ Drivers
+******************************************************************************/
+
+// YEAR NAME PARENT CMP MACHINE INPUT STATE INIT COMPANY, FULLNAME, FLAGS
+CONS( 1985, intel02, 0, 0, intel02, intel02, intel02_state, empty_init, "BREA Research Institute", "Intellect-02", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK )
diff --git a/src/mame/drivers/interact.cpp b/src/mame/drivers/interact.cpp
index 9a199c37d5d..7733f480b04 100644
--- a/src/mame/drivers/interact.cpp
+++ b/src/mame/drivers/interact.cpp
@@ -127,77 +127,75 @@ uint32_t interact_state::screen_update_interact(screen_device &screen, bitmap_in
return 0;
}
-MACHINE_CONFIG_START(interact_state::interact)
-
+void interact_state::interact(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", I8080, XTAL(2'000'000))
- MCFG_DEVICE_PROGRAM_MAP(interact_mem)
- MCFG_DEVICE_PERIODIC_INT_DRIVER(interact_state, irq0_line_hold, 50) /* put on the I8080 irq in Hz*/
+ I8080(config, m_maincpu, XTAL(2'000'000));
+ m_maincpu->set_addrmap(AS_PROGRAM, &interact_state::interact_mem);
+ m_maincpu->set_periodic_int(FUNC(interact_state::irq0_line_hold), attotime::from_hz(50)); /* put on the I8080 irq in Hz*/
MCFG_MACHINE_RESET_OVERRIDE(interact_state,interact)
MCFG_MACHINE_START_OVERRIDE(interact_state,interact)
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */
- MCFG_SCREEN_SIZE(256, 79)
- MCFG_SCREEN_VISIBLE_AREA(0, 112, 0, 77)
- MCFG_SCREEN_UPDATE_DRIVER(interact_state, screen_update_interact)
- MCFG_SCREEN_PALETTE("palette")
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */
+ screen.set_size(256, 79);
+ screen.set_visarea(0, 112, 0, 77);
+ screen.set_screen_update(FUNC(interact_state::screen_update_interact));
+ screen.set_palette(m_palette);
- MCFG_PALETTE_ADD("palette", 16) /* 8 colours, but only 4 at a time*/
+ PALETTE(config, m_palette).set_entries(16); /* 8 colours, but only 4 at a time*/
MCFG_VIDEO_START_OVERRIDE(interact_state,hec2hrp)
hector_audio(config);
- MCFG_CASSETTE_ADD("cassette")
- MCFG_CASSETTE_FORMATS(hector_cassette_formats)
- MCFG_CASSETTE_DEFAULT_STATE(CASSETTE_STOPPED | CASSETTE_MASK_SPEAKER)
- MCFG_CASSETTE_INTERFACE("interact_cass")
+ CASSETTE(config, m_cassette);
+ m_cassette->set_formats(hector_cassette_formats);
+ m_cassette->set_default_state(CASSETTE_STOPPED | CASSETTE_MASK_SPEAKER);
+ m_cassette->set_interface("interact_cass");
- MCFG_SOFTWARE_LIST_ADD("cass_list","interact")
+ SOFTWARE_LIST(config, "cass_list").set_original("interact");
/* printer */
- MCFG_DEVICE_ADD("printer", PRINTER, 0)
-
-MACHINE_CONFIG_END
-
-MACHINE_CONFIG_START(interact_state::hector1)
+ PRINTER(config, m_printer, 0);
+}
+void interact_state::hector1(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, XTAL(1'750'000))
- MCFG_DEVICE_PROGRAM_MAP(interact_mem)
- MCFG_DEVICE_PERIODIC_INT_DRIVER(interact_state, irq0_line_hold, 50) /* put on the I8080 irq in Hz*/
+ Z80(config, m_maincpu, XTAL(1'750'000));
+ m_maincpu->set_addrmap(AS_PROGRAM, &interact_state::interact_mem);
+ m_maincpu->set_periodic_int(FUNC(interact_state::irq0_line_hold), attotime::from_hz(50)); /* put on the I8080 irq in Hz*/
MCFG_MACHINE_RESET_OVERRIDE(interact_state,interact)
MCFG_MACHINE_START_OVERRIDE(interact_state,interact)
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */
- MCFG_SCREEN_SIZE(256, 79)
- MCFG_SCREEN_VISIBLE_AREA(0, 112, 0, 77)
- MCFG_SCREEN_UPDATE_DRIVER(interact_state, screen_update_interact)
- MCFG_SCREEN_PALETTE("palette")
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */
+ screen.set_size(256, 79);
+ screen.set_visarea(0, 112, 0, 77);
+ screen.set_screen_update(FUNC(interact_state::screen_update_interact));
+ screen.set_palette(m_palette);
- MCFG_PALETTE_ADD("palette", 16) /* 8 colours, but only 4 at a time*/
+ PALETTE(config, m_palette).set_entries(16); /* 8 colours, but only 4 at a time*/
MCFG_VIDEO_START_OVERRIDE(interact_state,hec2hrp)
hector_audio(config);
- MCFG_CASSETTE_ADD("cassette")
- MCFG_CASSETTE_FORMATS(hector_cassette_formats)
- MCFG_CASSETTE_DEFAULT_STATE(CASSETTE_STOPPED | CASSETTE_MASK_SPEAKER)
- MCFG_CASSETTE_INTERFACE("interact_cass")
+ CASSETTE(config, m_cassette);
+ m_cassette->set_formats(hector_cassette_formats);
+ m_cassette->set_default_state(CASSETTE_STOPPED | CASSETTE_MASK_SPEAKER);
+ m_cassette->set_interface("interact_cass");
/* printer */
- MCFG_DEVICE_ADD("printer", PRINTER, 0)
-
-MACHINE_CONFIG_END
+ PRINTER(config, m_printer, 0);
+}
/* Input ports */
static INPUT_PORTS_START( interact )
diff --git a/src/mame/drivers/interpro.cpp b/src/mame/drivers/interpro.cpp
index 3f8dfe1d4a1..9fe4fba37bd 100644
--- a/src/mame/drivers/interpro.cpp
+++ b/src/mame/drivers/interpro.cpp
@@ -532,11 +532,11 @@ void interpro_state::interpro_common_map(address_map &map)
map(0x7f000400, 0x7f00040f).rw(m_scc1, FUNC(z80scc_device::ba_cd_inv_r), FUNC(z80scc_device::ba_cd_inv_w)).umask32(0x000000ff);
map(0x7f000410, 0x7f00041f).rw(m_scc2, FUNC(z80scc_device::ba_cd_inv_r), FUNC(z80scc_device::ba_cd_inv_w)).umask32(0x000000ff);
map(0x7f000500, 0x7f000503).lrw8("rtc_rw",
- [this](address_space &space, offs_t offset, u8 mem_mask) {
- return m_rtc->read(space, offset^1, mem_mask);
+ [this](offs_t offset) {
+ return m_rtc->read(offset^1);
},
- [this](address_space &space, offs_t offset, u8 data, u8 mem_mask) {
- m_rtc->write(space, offset^1, data, mem_mask);
+ [this](offs_t offset, u8 data) {
+ m_rtc->write(offset^1, data);
}).umask32(0x000000ff);
map(0x7f000600, 0x7f000600).w(m_rtc, FUNC(mc146818_device::write));
@@ -778,10 +778,10 @@ void interpro_state::ioga(machine_config &config)
// ioga dma and serial dma channels
//m_ioga->dma_r_callback<0>().set(unknown); // plotter
- m_ioga->dma_r_callback<1>().set(INTERPRO_SCSI_DEVICE_TAG, FUNC(ncr53c90a_device::mdma_r));
- m_ioga->dma_w_callback<1>().set(INTERPRO_SCSI_DEVICE_TAG, FUNC(ncr53c90a_device::mdma_w));
- m_ioga->dma_r_callback<2>().set(m_fdc, FUNC(upd765_family_device::mdma_r));
- m_ioga->dma_w_callback<2>().set(m_fdc, FUNC(upd765_family_device::mdma_w));
+ m_ioga->dma_r_callback<1>().set(INTERPRO_SCSI_DEVICE_TAG, FUNC(ncr53c90a_device::dma_r));
+ m_ioga->dma_w_callback<1>().set(INTERPRO_SCSI_DEVICE_TAG, FUNC(ncr53c90a_device::dma_w));
+ m_ioga->dma_r_callback<2>().set(m_fdc, FUNC(upd765_family_device::dma_r));
+ m_ioga->dma_w_callback<2>().set(m_fdc, FUNC(upd765_family_device::dma_w));
m_ioga->serial_dma_r_callback<0>().set(m_scc2, FUNC(z80scc_device::db_r));
m_ioga->serial_dma_w_callback<0>().set(m_scc2, FUNC(z80scc_device::db_w));
m_ioga->serial_dma_r_callback<1>().set(m_scc1, FUNC(z80scc_device::da_r));
@@ -900,7 +900,9 @@ void emerald_state::emerald(machine_config &config)
ioga(config);
// srx bus
- SRX_BUS(config, m_bus, 0, m_maincpu);
+ SRX_BUS(config, m_bus, 0);
+ m_bus->set_main_space(m_maincpu, 0);
+ m_bus->set_io_space(m_maincpu, 1);
m_bus->out_irq0_cb().set(m_ioga, FUNC(interpro_ioga_device::ir3_w));
m_bus->out_irq1_cb().set(m_ioga, FUNC(interpro_ioga_device::ir4_w));
@@ -972,7 +974,9 @@ void turquoise_state::turquoise(machine_config &config)
ioga(config);
// cbus bus
- CBUS_BUS(config, m_bus, 0, m_maincpu);
+ CBUS_BUS(config, m_bus, 0);
+ m_bus->set_main_space(m_maincpu, 0);
+ m_bus->set_io_space(m_maincpu, 1);
m_bus->out_irq0_cb().set(m_ioga, FUNC(interpro_ioga_device::ir3_w));
m_bus->out_irq1_cb().set(m_ioga, FUNC(interpro_ioga_device::ir4_w));
@@ -1064,7 +1068,9 @@ void cbus_sapphire_state::cbus_sapphire(machine_config &config)
m_mse_port->state_func().set(m_ioga, FUNC(interpro_ioga_device::mouse_status_w));
// cbus bus
- CBUS_BUS(config, m_bus, 0, m_maincpu);
+ CBUS_BUS(config, m_bus, 0);
+ m_bus->set_main_space(m_maincpu, 0);
+ m_bus->set_io_space(m_maincpu, 1);
m_bus->out_irq0_cb().set(m_ioga, FUNC(interpro_ioga_device::ir3_w));
m_bus->out_irq1_cb().set(m_ioga, FUNC(interpro_ioga_device::ir4_w));
@@ -1077,7 +1083,9 @@ void srx_sapphire_state::srx_sapphire(machine_config &config)
sapphire(config);
// srx bus
- SRX_BUS(config, m_bus, 0, m_maincpu);
+ SRX_BUS(config, m_bus, 0);
+ m_bus->set_main_space(m_maincpu, 0);
+ m_bus->set_io_space(m_maincpu, 1);
m_bus->out_irq0_cb().set(m_ioga, FUNC(interpro_ioga_device::ir3_w));
m_bus->out_irq1_cb().set(m_ioga, FUNC(interpro_ioga_device::ir4_w));
diff --git a/src/mame/drivers/intrscti.cpp b/src/mame/drivers/intrscti.cpp
index 3b6afd2a03c..d72516c95fb 100644
--- a/src/mame/drivers/intrscti.cpp
+++ b/src/mame/drivers/intrscti.cpp
@@ -189,30 +189,30 @@ static GFXDECODE_START( gfx_intrscti )
GFXDECODE_END
-MACHINE_CONFIG_START(intrscti_state::intrscti)
-
+void intrscti_state::intrscti(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, 4000000) /* ? MHz */
- MCFG_DEVICE_PROGRAM_MAP(intrscti_map)
- MCFG_DEVICE_IO_MAP(intrscti_io_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", intrscti_state, irq0_line_hold)
+ Z80(config, m_maincpu, 4000000); /* ? MHz */
+ m_maincpu->set_addrmap(AS_PROGRAM, &intrscti_state::intrscti_map);
+ m_maincpu->set_addrmap(AS_IO, &intrscti_state::intrscti_io_map);
+ m_maincpu->set_vblank_int("screen", FUNC(intrscti_state::irq0_line_hold));
- MCFG_DEVICE_ADD("subcpu", Z80, 4000000) /* ? MHz */
- MCFG_DEVICE_PROGRAM_MAP(intrscti_sub_map)
- MCFG_DEVICE_IO_MAP(intrscti_sub_io_map)
+ Z80(config, m_subcpu, 4000000); /* ? MHz */
+ m_subcpu->set_addrmap(AS_PROGRAM, &intrscti_state::intrscti_sub_map);
+ m_subcpu->set_addrmap(AS_IO, &intrscti_state::intrscti_sub_io_map);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(256, 256)
- MCFG_SCREEN_VISIBLE_AREA(0, 256-1, 0, 256-1)
- MCFG_SCREEN_UPDATE_DRIVER(intrscti_state, screen_update_intrscti)
- MCFG_SCREEN_PALETTE("palette")
-
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_intrscti)
- MCFG_PALETTE_ADD("palette", 0x100)
-MACHINE_CONFIG_END
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(256, 256);
+ screen.set_visarea(0, 256-1, 0, 256-1);
+ screen.set_screen_update(FUNC(intrscti_state::screen_update_intrscti));
+ screen.set_palette(m_palette);
+
+ GFXDECODE(config, m_gfxdecode, m_palette, gfx_intrscti);
+ PALETTE(config, m_palette).set_entries(0x100);
+}
ROM_START( intrscti )
diff --git a/src/mame/drivers/intv.cpp b/src/mame/drivers/intv.cpp
index c878215b485..34fdf36526d 100644
--- a/src/mame/drivers/intv.cpp
+++ b/src/mame/drivers/intv.cpp
@@ -457,29 +457,30 @@ INTERRUPT_GEN_MEMBER(intv_state::intv_interrupt2)
timer_set(m_keyboard->cycles_to_attotime(100), TIMER_INTV_INTERRUPT2_COMPLETE);
}
-MACHINE_CONFIG_START(intv_state::intv)
+void intv_state::intv(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", CP1610, XTAL(3'579'545)/4) /* Colorburst/4 */
- MCFG_DEVICE_PROGRAM_MAP(intv_mem)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", intv_state, intv_interrupt)
- MCFG_QUANTUM_TIME(attotime::from_hz(60))
+ CP1610(config, m_maincpu, XTAL(3'579'545)/4); /* Colorburst/4 */
+ m_maincpu->set_addrmap(AS_PROGRAM, &intv_state::intv_mem);
+ m_maincpu->set_vblank_int("screen", FUNC(intv_state::intv_interrupt));
+ config.m_minimum_quantum = attotime::from_hz(60);
/* video hardware */
- MCFG_DEVICE_ADD("stic", STIC, XTAL(3'579'545))
- MCFG_VIDEO_SET_SCREEN("screen")
+ STIC(config, m_stic, XTAL(3'579'545));
+ m_stic->set_screen("screen");
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(59.92)
- //MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2400)) /* not accurate */
- MCFG_SCREEN_UPDATE_DRIVER(intv_state, screen_update_intv)
- MCFG_SCREEN_SIZE(stic_device::SCREEN_WIDTH*INTV_X_SCALE, stic_device::SCREEN_HEIGHT*INTV_Y_SCALE)
- MCFG_SCREEN_VISIBLE_AREA(0, stic_device::SCREEN_WIDTH*INTV_X_SCALE-1, 0, stic_device::SCREEN_HEIGHT*INTV_Y_SCALE-1)
- MCFG_SCREEN_PALETTE(m_palette)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(59.92);
+ //screen.set_vblank_time(ATTOSECONDS_IN_USEC(2400)); /* not accurate */
+ screen.set_screen_update(FUNC(intv_state::screen_update_intv));
+ screen.set_size(stic_device::SCREEN_WIDTH*INTV_X_SCALE, stic_device::SCREEN_HEIGHT*INTV_Y_SCALE);
+ screen.set_visarea(0, stic_device::SCREEN_WIDTH*INTV_X_SCALE-1, 0, stic_device::SCREEN_HEIGHT*INTV_Y_SCALE-1);
+ screen.set_palette(m_palette);
PALETTE(config, m_palette, FUNC(intv_state::intv_palette), 0x400, 32);
- MCFG_INTV_CONTROL_PORT_ADD("iopt_right_ctrl", intv_control_port_devices, "handctrl")
- MCFG_INTV_CONTROL_PORT_ADD("iopt_left_ctrl", intv_control_port_devices, "handctrl")
+ INTV_CONTROL_PORT(config, "iopt_right_ctrl", intv_control_port_devices, "handctrl");
+ INTV_CONTROL_PORT(config, "iopt_left_ctrl", intv_control_port_devices, "handctrl");
/* sound hardware */
SPEAKER(config, "mono").front_center();
@@ -489,63 +490,62 @@ MACHINE_CONFIG_START(intv_state::intv)
m_sound->add_route(ALL_OUTPUTS, "mono", 0.33);
/* cartridge */
- MCFG_INTV_CARTRIDGE_ADD("cartslot", intv_cart, nullptr)
+ INTV_CART_SLOT(config, m_cart, intv_cart, nullptr);
/* software lists */
- MCFG_SOFTWARE_LIST_ADD("cart_list", "intv")
- MCFG_SOFTWARE_LIST_COMPATIBLE_ADD("ecs_list", "intvecs")
-MACHINE_CONFIG_END
+ SOFTWARE_LIST(config, "cart_list").set_original("intv");
+ SOFTWARE_LIST(config, "ecs_list").set_compatible("intvecs");
+}
-MACHINE_CONFIG_START(intv_state::intv2)
+void intv_state::intv2(machine_config &config)
+{
intv(config);
- MCFG_DEVICE_MODIFY( "maincpu" )
- MCFG_DEVICE_PROGRAM_MAP(intv2_mem)
-MACHINE_CONFIG_END
+ m_maincpu->set_addrmap(AS_PROGRAM, &intv_state::intv2_mem);
+}
-MACHINE_CONFIG_START(intv_state::intvoice)
+void intv_state::intvoice(machine_config &config)
+{
intv(config);
- MCFG_DEVICE_MODIFY( "maincpu" )
- MCFG_DEVICE_PROGRAM_MAP(intvoice_mem)
+ m_maincpu->set_addrmap(AS_PROGRAM, &intv_state::intvoice_mem);
- MCFG_DEVICE_REMOVE("cartslot")
- MCFG_DEVICE_ADD("voice", INTV_ROM_VOICE, 0)
-MACHINE_CONFIG_END
+ config.device_remove("cartslot");
+ INTV_ROM_VOICE(config, "voice", 0);
+}
-MACHINE_CONFIG_START(intv_state::intvecs)
+void intv_state::intvecs(machine_config &config)
+{
intv(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(intvecs_mem)
+ m_maincpu->set_addrmap(AS_PROGRAM, &intv_state::intvecs_mem);
- MCFG_DEVICE_REMOVE("cartslot")
- MCFG_DEVICE_ADD("ecs", INTV_ROM_ECS, 0)
+ config.device_remove("cartslot");
+ INTV_ROM_ECS(config, "ecs", 0);
sp0256_device &speech(SP0256(config, "speech", 3120000));
/* The Intellivoice uses a speaker with its own volume control so the relative volumes to use are subjective */
speech.add_route(ALL_OUTPUTS, "mono", 1.00);
/* cassette */
- //MCFG_CASSETTE_ADD( "cassette" )
+ //CASSETTE(config, "cassette");
/* software lists */
- MCFG_DEVICE_REMOVE("cart_list")
- MCFG_DEVICE_REMOVE("ecs_list")
- MCFG_SOFTWARE_LIST_ADD("cart_list", "intvecs")
- MCFG_SOFTWARE_LIST_COMPATIBLE_ADD("intv_list", "intv")
-MACHINE_CONFIG_END
+ config.device_remove("ecs_list");
+ SOFTWARE_LIST(config.replace(), "cart_list").set_original("intvecs");
+ SOFTWARE_LIST(config, "intv_list").set_compatible("intv");
+}
-MACHINE_CONFIG_START(intv_state::intvkbd)
+void intv_state::intvkbd(machine_config &config)
+{
intv(config);
- MCFG_DEVICE_MODIFY( "maincpu" )
- MCFG_DEVICE_PROGRAM_MAP(intvkbd_mem)
+ m_maincpu->set_addrmap(AS_PROGRAM, &intv_state::intvkbd_mem);
- MCFG_DEVICE_ADD("keyboard", M6502, XTAL(7'159'090)/8)
- MCFG_DEVICE_PROGRAM_MAP(intvkbd2_mem)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", intv_state, intv_interrupt2)
+ M6502(config, m_keyboard, XTAL(7'159'090)/8);
+ m_keyboard->set_addrmap(AS_PROGRAM, &intv_state::intvkbd2_mem);
+ m_keyboard->set_vblank_int("screen", FUNC(intv_state::intv_interrupt2));
- MCFG_QUANTUM_TIME(attotime::from_hz(6000))
+ config.m_minimum_quantum = attotime::from_hz(6000);
/* video hardware */
- MCFG_DEVICE_ADD(m_gfxdecode, GFXDECODE, m_palette, gfx_intvkbd)
+ GFXDECODE(config, m_gfxdecode, m_palette, gfx_intvkbd);
/* crt controller */
TMS9927(config, m_crtc, XTAL(7'159'090)/8);
@@ -556,13 +556,12 @@ MACHINE_CONFIG_START(intv_state::intvkbd)
stic_device::OVERSCAN_TOP_HEIGHT*stic_device::Y_SCALE*INTVKBD_Y_SCALE,
stic_device::OVERSCAN_BOTTOM_HEIGHT*stic_device::Y_SCALE*INTVKBD_Y_SCALE);
- MCFG_SCREEN_MODIFY("screen")
- MCFG_SCREEN_UPDATE_DRIVER(intv_state, screen_update_intvkbd)
+ subdevice<screen_device>("screen")->set_screen_update(FUNC(intv_state::screen_update_intvkbd));
/* I/O cartslots for BASIC */
- MCFG_GENERIC_CARTSLOT_ADD("ioslot1", generic_plain_slot, "intbasic_cart")
- MCFG_GENERIC_CARTSLOT_ADD("ioslot2", generic_plain_slot, "intbasic_cart")
-MACHINE_CONFIG_END
+ GENERIC_CARTSLOT(config, m_iocart1, generic_plain_slot, "intbasic_cart");
+ GENERIC_CARTSLOT(config, m_iocart2, generic_plain_slot, "intbasic_cart");
+}
ROM_START(intv) // the intv1 exec rom should be two roms: RO-3-9502-011.U5 and RO-3-9504-021.U6
ROM_REGION(0x10000<<1,"maincpu", ROMREGION_ERASEFF)
diff --git a/src/mame/drivers/invqix.cpp b/src/mame/drivers/invqix.cpp
index c3476c39b4f..536e7f6e8fc 100644
--- a/src/mame/drivers/invqix.cpp
+++ b/src/mame/drivers/invqix.cpp
@@ -334,31 +334,32 @@ static INPUT_PORTS_START( invqix )
PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNUSED )
INPUT_PORTS_END
-MACHINE_CONFIG_START(invqix_state::invqix)
- MCFG_DEVICE_ADD("maincpu", H8S2394, XTAL(20'000'000))
- MCFG_DEVICE_PROGRAM_MAP(invqix_prg_map)
- MCFG_DEVICE_IO_MAP(invqix_io_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", invqix_state, irq1_line_hold)
- MCFG_DEVICE_PERIODIC_INT_DRIVER(invqix_state, irq0_line_hold, 60)
+void invqix_state::invqix(machine_config &config)
+{
+ H8S2394(config, m_maincpu, XTAL(20'000'000));
+ m_maincpu->set_addrmap(AS_PROGRAM, &invqix_state::invqix_prg_map);
+ m_maincpu->set_addrmap(AS_IO, &invqix_state::invqix_io_map);
+ m_maincpu->set_vblank_int("screen", FUNC(invqix_state::irq1_line_hold));
+ m_maincpu->set_periodic_int(FUNC(invqix_state::irq0_line_hold), attotime::from_hz(60));
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_UPDATE_DRIVER(invqix_state, screen_update)
- MCFG_SCREEN_SIZE(640, 480)
- MCFG_SCREEN_VISIBLE_AREA(0, 256, 0, 240)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_screen_update(FUNC(invqix_state::screen_update));
+ screen.set_size(640, 480);
+ screen.set_visarea(0, 256, 0, 240);
- MCFG_PALETTE_ADD("palette", 65536)
+ PALETTE(config, "palette").set_entries(65536);
SPEAKER(config, "lspeaker").front_left();
SPEAKER(config, "rspeaker").front_right();
- MCFG_DEVICE_ADD("oki", OKIM9810, XTAL(4'096'000))
- MCFG_SOUND_ROUTE(0, "lspeaker", 0.80)
- MCFG_SOUND_ROUTE(1, "rspeaker", 0.80)
+ okim9810_device &oki(OKIM9810(config, "oki", XTAL(4'096'000)));
+ oki.add_route(0, "lspeaker", 0.80);
+ oki.add_route(1, "rspeaker", 0.80);
EEPROM_93C46_16BIT(config, "eeprom").default_value(0);
-MACHINE_CONFIG_END
+}
ROM_START( invqix )
ROM_REGION(0x200000, "program", 0)
diff --git a/src/mame/drivers/ipds.cpp b/src/mame/drivers/ipds.cpp
index 87c39b19d87..e6e9663d9f0 100644
--- a/src/mame/drivers/ipds.cpp
+++ b/src/mame/drivers/ipds.cpp
@@ -134,29 +134,30 @@ void ipds_state::kbd_put(u8 data)
m_term_data = data;
}
-MACHINE_CONFIG_START(ipds_state::ipds)
+void ipds_state::ipds(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu",I8085A, XTAL(19'660'800) / 4)
- MCFG_DEVICE_PROGRAM_MAP(ipds_mem)
- MCFG_DEVICE_IO_MAP(ipds_io)
+ I8085A(config, m_maincpu, XTAL(19'660'800) / 4);
+ m_maincpu->set_addrmap(AS_PROGRAM, &ipds_state::ipds_mem);
+ m_maincpu->set_addrmap(AS_IO, &ipds_state::ipds_io);
/* video hardware */
- MCFG_SCREEN_ADD_MONOCHROME("screen", RASTER, rgb_t::green())
- MCFG_SCREEN_UPDATE_DEVICE("i8275", i8275_device, screen_update)
- MCFG_SCREEN_REFRESH_RATE(50)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */
- MCFG_SCREEN_SIZE(640, 480)
- MCFG_SCREEN_VISIBLE_AREA(0, 640-1, 0, 480-1)
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_ipds)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER, rgb_t::green()));
+ screen.set_screen_update("i8275", FUNC(i8275_device::screen_update));
+ screen.set_refresh_hz(50);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */
+ screen.set_size(640, 480);
+ screen.set_visarea(0, 640-1, 0, 480-1);
+ GFXDECODE(config, "gfxdecode", m_palette, gfx_ipds);
PALETTE(config, m_palette, palette_device::MONOCHROME);
- MCFG_DEVICE_ADD("i8275", I8275, XTAL(19'660'800) / 4)
- MCFG_I8275_CHARACTER_WIDTH(6)
- MCFG_I8275_DRAW_CHARACTER_CALLBACK_OWNER(ipds_state, crtc_display_pixels)
+ I8275(config, m_crtc, XTAL(19'660'800) / 4);
+ m_crtc->set_character_width(6);
+ m_crtc->set_display_callback(FUNC(ipds_state::crtc_display_pixels), this);
generic_keyboard_device &keyboard(GENERIC_KEYBOARD(config, "keyboard", 0));
keyboard.set_keyboard_callback(FUNC(ipds_state::kbd_put));
-MACHINE_CONFIG_END
+}
/* ROM definition */
ROM_START( ipds )
diff --git a/src/mame/drivers/iphone2g.cpp b/src/mame/drivers/iphone2g.cpp
index 6b6cedf37df..868f520884f 100644
--- a/src/mame/drivers/iphone2g.cpp
+++ b/src/mame/drivers/iphone2g.cpp
@@ -77,16 +77,16 @@ void iphone2g_state::machine_reset()
{
}
-MACHINE_CONFIG_START(iphone2g_state::iphone2g)
-
+void iphone2g_state::iphone2g(machine_config &config)
+{
/* Basic machine hardware */
- MCFG_DEVICE_ADD(m_maincpu, ARM1176JZF_S, XTAL(12'000'000) * 103 / 3) //412 MHz, downclocked from 600 MHz
- MCFG_DEVICE_PROGRAM_MAP(mem_map)
+ ARM1176JZF_S(config, m_maincpu, XTAL(12'000'000) * 103 / 3); //412 MHz, downclocked from 600 MHz
+ m_maincpu->set_addrmap(AS_PROGRAM, &iphone2g_state::mem_map);
- MCFG_SCREEN_ADD(m_screen, RASTER)
- MCFG_SCREEN_RAW_PARAMS(XTAL(12'000'000), 320, 0, 320, 480, 0, 480) //Complete guess
- MCFG_SCREEN_UPDATE_DRIVER(iphone2g_state, screen_update)
-MACHINE_CONFIG_END
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_raw(XTAL(12'000'000), 320, 0, 320, 480, 0, 480); //Complete guess
+ m_screen->set_screen_update(FUNC(iphone2g_state::screen_update));
+}
ROM_START(iphone2g)
ROM_REGION32_LE(0x10000, "bios", 0)
diff --git a/src/mame/drivers/iq151.cpp b/src/mame/drivers/iq151.cpp
index 7574b6fb4ec..da8a6eca3a1 100644
--- a/src/mame/drivers/iq151.cpp
+++ b/src/mame/drivers/iq151.cpp
@@ -388,7 +388,8 @@ static void iq151_cart(device_slot_interface &device)
device.option_add("amos3", IQ151_AMOS3); // AMOS cart 3
}
-MACHINE_CONFIG_START(iq151_state::iq151)
+void iq151_state::iq151(machine_config &config)
+{
/* basic machine hardware */
I8080(config, m_maincpu, XTAL(2'000'000));
m_maincpu->set_addrmap(AS_PROGRAM, &iq151_state::iq151_mem);
@@ -397,20 +398,19 @@ MACHINE_CONFIG_START(iq151_state::iq151)
m_maincpu->set_irq_acknowledge_callback("pic8259", FUNC(pic8259_device::inta_cb));
/* video hardware */
- MCFG_SCREEN_ADD_MONOCHROME("screen", RASTER, rgb_t::green())
- MCFG_SCREEN_REFRESH_RATE(50)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */
- MCFG_SCREEN_UPDATE_DRIVER(iq151_state, screen_update)
- MCFG_SCREEN_SIZE(64*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0, 32*8-1, 0, 32*8-1)
- MCFG_SCREEN_PALETTE("palette")
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER, rgb_t::green()));
+ screen.set_refresh_hz(50);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */
+ screen.set_screen_update(FUNC(iq151_state::screen_update));
+ screen.set_size(64*8, 32*8);
+ screen.set_visarea(0, 32*8-1, 0, 32*8-1);
+ screen.set_palette("palette");
PALETTE(config, "palette", palette_device::MONOCHROME);
/* sound hardware */
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("speaker", SPEAKER_SOUND)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.50)
+ SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.50);
PIC8259(config, m_pic, 0);
m_pic->out_int_callback().set_inputline(m_maincpu, 0);
@@ -421,58 +421,53 @@ MACHINE_CONFIG_START(iq151_state::iq151)
ppi.in_pc_callback().set(FUNC(iq151_state::ppi_portc_r));
ppi.out_pc_callback().set(FUNC(iq151_state::ppi_portc_w));
- MCFG_CASSETTE_ADD( "cassette" )
- MCFG_CASSETTE_DEFAULT_STATE(CASSETTE_STOPPED)
- MCFG_CASSETTE_INTERFACE("iq151_cass")
+ CASSETTE(config, m_cassette);
+ m_cassette->set_default_state(CASSETTE_STOPPED);
+ m_cassette->set_interface("iq151_cass");
- MCFG_TIMER_DRIVER_ADD_PERIODIC("cassette_timer", iq151_state, cassette_timer, attotime::from_hz(2000))
+ TIMER(config, "cassette_timer").configure_periodic(FUNC(iq151_state::cassette_timer), attotime::from_hz(2000));
/* cartridge */
- MCFG_DEVICE_ADD("slot1", IQ151CART_SLOT, 0)
- MCFG_DEVICE_SLOT_INTERFACE(iq151_cart, nullptr, false)
- MCFG_IQ151CART_SLOT_SCREEN_TAG("screen")
- MCFG_IQ151CART_SLOT_OUT_IRQ0_CB(WRITELINE(m_pic, pic8259_device, ir0_w))
- MCFG_IQ151CART_SLOT_OUT_IRQ1_CB(WRITELINE(m_pic, pic8259_device, ir1_w))
- MCFG_IQ151CART_SLOT_OUT_IRQ2_CB(WRITELINE(m_pic, pic8259_device, ir2_w))
- MCFG_IQ151CART_SLOT_OUT_IRQ3_CB(WRITELINE(m_pic, pic8259_device, ir3_w))
- MCFG_IQ151CART_SLOT_OUT_IRQ4_CB(WRITELINE(m_pic, pic8259_device, ir4_w))
- MCFG_DEVICE_ADD("slot2", IQ151CART_SLOT, 0)
- MCFG_DEVICE_SLOT_INTERFACE(iq151_cart, nullptr, false)
- MCFG_IQ151CART_SLOT_SCREEN_TAG("screen")
- MCFG_IQ151CART_SLOT_OUT_IRQ0_CB(WRITELINE(m_pic, pic8259_device, ir0_w))
- MCFG_IQ151CART_SLOT_OUT_IRQ1_CB(WRITELINE(m_pic, pic8259_device, ir1_w))
- MCFG_IQ151CART_SLOT_OUT_IRQ2_CB(WRITELINE(m_pic, pic8259_device, ir2_w))
- MCFG_IQ151CART_SLOT_OUT_IRQ3_CB(WRITELINE(m_pic, pic8259_device, ir3_w))
- MCFG_IQ151CART_SLOT_OUT_IRQ4_CB(WRITELINE(m_pic, pic8259_device, ir4_w))
- MCFG_DEVICE_ADD("slot3", IQ151CART_SLOT, 0)
- MCFG_DEVICE_SLOT_INTERFACE(iq151_cart, nullptr, false)
- MCFG_IQ151CART_SLOT_SCREEN_TAG("screen")
- MCFG_IQ151CART_SLOT_OUT_IRQ0_CB(WRITELINE(m_pic, pic8259_device, ir0_w))
- MCFG_IQ151CART_SLOT_OUT_IRQ1_CB(WRITELINE(m_pic, pic8259_device, ir1_w))
- MCFG_IQ151CART_SLOT_OUT_IRQ2_CB(WRITELINE(m_pic, pic8259_device, ir2_w))
- MCFG_IQ151CART_SLOT_OUT_IRQ3_CB(WRITELINE(m_pic, pic8259_device, ir3_w))
- MCFG_IQ151CART_SLOT_OUT_IRQ4_CB(WRITELINE(m_pic, pic8259_device, ir4_w))
- MCFG_DEVICE_ADD("slot4", IQ151CART_SLOT, 0)
- MCFG_DEVICE_SLOT_INTERFACE(iq151_cart, nullptr, false)
- MCFG_IQ151CART_SLOT_SCREEN_TAG("screen")
- MCFG_IQ151CART_SLOT_OUT_IRQ0_CB(WRITELINE(m_pic, pic8259_device, ir0_w))
- MCFG_IQ151CART_SLOT_OUT_IRQ1_CB(WRITELINE(m_pic, pic8259_device, ir1_w))
- MCFG_IQ151CART_SLOT_OUT_IRQ2_CB(WRITELINE(m_pic, pic8259_device, ir2_w))
- MCFG_IQ151CART_SLOT_OUT_IRQ3_CB(WRITELINE(m_pic, pic8259_device, ir3_w))
- MCFG_IQ151CART_SLOT_OUT_IRQ4_CB(WRITELINE(m_pic, pic8259_device, ir4_w))
- MCFG_DEVICE_ADD("slot5", IQ151CART_SLOT, 0)
- MCFG_DEVICE_SLOT_INTERFACE(iq151_cart, "video32", false)
- MCFG_IQ151CART_SLOT_SCREEN_TAG("screen")
- MCFG_IQ151CART_SLOT_OUT_IRQ0_CB(WRITELINE(m_pic, pic8259_device, ir0_w))
- MCFG_IQ151CART_SLOT_OUT_IRQ1_CB(WRITELINE(m_pic, pic8259_device, ir1_w))
- MCFG_IQ151CART_SLOT_OUT_IRQ2_CB(WRITELINE(m_pic, pic8259_device, ir2_w))
- MCFG_IQ151CART_SLOT_OUT_IRQ3_CB(WRITELINE(m_pic, pic8259_device, ir3_w))
- MCFG_IQ151CART_SLOT_OUT_IRQ4_CB(WRITELINE(m_pic, pic8259_device, ir4_w))
+ IQ151CART_SLOT(config, m_carts[0], iq151_cart, nullptr);
+ m_carts[0]->set_screen_tag("screen");
+ m_carts[0]->out_irq0_callback().set(m_pic, FUNC(pic8259_device::ir0_w));
+ m_carts[0]->out_irq1_callback().set(m_pic, FUNC(pic8259_device::ir1_w));
+ m_carts[0]->out_irq2_callback().set(m_pic, FUNC(pic8259_device::ir2_w));
+ m_carts[0]->out_irq3_callback().set(m_pic, FUNC(pic8259_device::ir3_w));
+ m_carts[0]->out_irq4_callback().set(m_pic, FUNC(pic8259_device::ir4_w));
+ IQ151CART_SLOT(config, m_carts[1], iq151_cart, nullptr);
+ m_carts[1]->set_screen_tag("screen");
+ m_carts[1]->out_irq0_callback().set(m_pic, FUNC(pic8259_device::ir0_w));
+ m_carts[1]->out_irq1_callback().set(m_pic, FUNC(pic8259_device::ir1_w));
+ m_carts[1]->out_irq2_callback().set(m_pic, FUNC(pic8259_device::ir2_w));
+ m_carts[1]->out_irq3_callback().set(m_pic, FUNC(pic8259_device::ir3_w));
+ m_carts[1]->out_irq4_callback().set(m_pic, FUNC(pic8259_device::ir4_w));
+ IQ151CART_SLOT(config, m_carts[2], iq151_cart, nullptr);
+ m_carts[2]->set_screen_tag("screen");
+ m_carts[2]->out_irq0_callback().set(m_pic, FUNC(pic8259_device::ir0_w));
+ m_carts[2]->out_irq1_callback().set(m_pic, FUNC(pic8259_device::ir1_w));
+ m_carts[2]->out_irq2_callback().set(m_pic, FUNC(pic8259_device::ir2_w));
+ m_carts[2]->out_irq3_callback().set(m_pic, FUNC(pic8259_device::ir3_w));
+ m_carts[2]->out_irq4_callback().set(m_pic, FUNC(pic8259_device::ir4_w));
+ IQ151CART_SLOT(config, m_carts[3], iq151_cart, nullptr);
+ m_carts[3]->set_screen_tag("screen");
+ m_carts[3]->out_irq0_callback().set(m_pic, FUNC(pic8259_device::ir0_w));
+ m_carts[3]->out_irq1_callback().set(m_pic, FUNC(pic8259_device::ir1_w));
+ m_carts[3]->out_irq2_callback().set(m_pic, FUNC(pic8259_device::ir2_w));
+ m_carts[3]->out_irq3_callback().set(m_pic, FUNC(pic8259_device::ir3_w));
+ m_carts[3]->out_irq4_callback().set(m_pic, FUNC(pic8259_device::ir4_w));
+ IQ151CART_SLOT(config, m_carts[4], iq151_cart, "video32");
+ m_carts[4]->set_screen_tag("screen");
+ m_carts[4]->out_irq0_callback().set(m_pic, FUNC(pic8259_device::ir0_w));
+ m_carts[4]->out_irq1_callback().set(m_pic, FUNC(pic8259_device::ir1_w));
+ m_carts[4]->out_irq2_callback().set(m_pic, FUNC(pic8259_device::ir2_w));
+ m_carts[4]->out_irq3_callback().set(m_pic, FUNC(pic8259_device::ir3_w));
+ m_carts[4]->out_irq4_callback().set(m_pic, FUNC(pic8259_device::ir4_w));
/* Software lists */
- MCFG_SOFTWARE_LIST_ADD("cart_list", "iq151_cart")
- MCFG_SOFTWARE_LIST_ADD("flop_list", "iq151_flop")
-MACHINE_CONFIG_END
+ SOFTWARE_LIST(config, "cart_list").set_original("iq151_cart");
+ SOFTWARE_LIST(config, "flop_list").set_original("iq151_flop");
+}
/* ROM definition */
ROM_START( iq151 )
diff --git a/src/mame/drivers/iqblock.cpp b/src/mame/drivers/iqblock.cpp
index a8f5fa8192a..7224b670a60 100644
--- a/src/mame/drivers/iqblock.cpp
+++ b/src/mame/drivers/iqblock.cpp
@@ -340,13 +340,13 @@ GFXDECODE_END
-MACHINE_CONFIG_START(iqblock_state::iqblock)
-
+void iqblock_state::iqblock(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80,12000000/2) /* 6 MHz */
- MCFG_DEVICE_PROGRAM_MAP(main_map)
- MCFG_DEVICE_IO_MAP(main_portmap)
- MCFG_TIMER_DRIVER_ADD_SCANLINE("scantimer", iqblock_state, irq, "screen", 0, 1)
+ Z80(config, m_maincpu, 12000000/2); /* 6 MHz */
+ m_maincpu->set_addrmap(AS_PROGRAM, &iqblock_state::main_map);
+ m_maincpu->set_addrmap(AS_IO, &iqblock_state::main_portmap);
+ TIMER(config, "scantimer").configure_scanline(FUNC(iqblock_state::irq), "screen", 0, 1);
i8255_device &ppi(I8255A(config, "ppi8255"));
ppi.in_pa_callback().set_ioport("P1");
@@ -355,22 +355,22 @@ MACHINE_CONFIG_START(iqblock_state::iqblock)
ppi.out_pc_callback().set(FUNC(iqblock_state::port_C_w));
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(64*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 64*8-1, 0*8, 30*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(iqblock_state, screen_update)
- MCFG_SCREEN_PALETTE("palette")
-
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_iqblock)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(64*8, 32*8);
+ screen.set_visarea(0*8, 64*8-1, 0*8, 30*8-1);
+ screen.set_screen_update(FUNC(iqblock_state::screen_update));
+ screen.set_palette("palette");
+
+ GFXDECODE(config, m_gfxdecode, "palette", gfx_iqblock);
PALETTE(config, "palette").set_format(palette_device::xBGR_555, 1024);
/* sound hardware */
SPEAKER(config, "mono").front_center();
YM2413(config, "ymsnd", 3'579'545).add_route(ALL_OUTPUTS, "mono", 1.0);
-MACHINE_CONFIG_END
+}
diff --git a/src/mame/drivers/iqunlim.cpp b/src/mame/drivers/iqunlim.cpp
index 6d784233e91..25f76a2213a 100644
--- a/src/mame/drivers/iqunlim.cpp
+++ b/src/mame/drivers/iqunlim.cpp
@@ -87,19 +87,20 @@ void iqunlim_state::iqunlim_mem(address_map &map)
static INPUT_PORTS_START( iqunlim )
INPUT_PORTS_END
-MACHINE_CONFIG_START(iqunlim_state::iqunlim)
+void iqunlim_state::iqunlim(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M68000, XTAL(32'000'000)/2) // DragonBall EZ (MC68EZ328) (68k core) (is the xtal correct? this was from the other hardware)
- MCFG_DEVICE_PROGRAM_MAP(iqunlim_mem)
+ M68000(config, m_maincpu, XTAL(32'000'000)/2); // DragonBall EZ (MC68EZ328) (68k core) (is the xtal correct? this was from the other hardware)
+ m_maincpu->set_addrmap(AS_PROGRAM, &iqunlim_state::iqunlim_mem);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(50)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */
- MCFG_SCREEN_SIZE(512, 256)
- MCFG_SCREEN_VISIBLE_AREA(0, 512-1, 0, 256-1)
- MCFG_SCREEN_UPDATE_DRIVER( iqunlim_state, screen_update )
-MACHINE_CONFIG_END
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(50);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */
+ screen.set_size(512, 256);
+ screen.set_visarea(0, 512-1, 0, 256-1);
+ screen.set_screen_update(FUNC(iqunlim_state::screen_update));
+}
ROM_START( iqunlim )
ROM_REGION(0x200000, "maincpu", 0)
diff --git a/src/mame/drivers/iris3130.cpp b/src/mame/drivers/iris3130.cpp
index 32b1f0ab43a..f3ee4409123 100644
--- a/src/mame/drivers/iris3130.cpp
+++ b/src/mame/drivers/iris3130.cpp
@@ -186,7 +186,7 @@ READ16_MEMBER(sgi_ip2_state::sgi_ip2_swtch_r)
READ8_MEMBER(sgi_ip2_state::sgi_ip2_clock_ctl_r)
{
- uint8_t ret = m_rtc->read(space, 1);
+ uint8_t ret = m_rtc->read(1);
verboselog(1, "sgi_ip2_clock_ctl_r: %02x\n", ret);
return ret;
}
@@ -194,12 +194,12 @@ READ8_MEMBER(sgi_ip2_state::sgi_ip2_clock_ctl_r)
WRITE8_MEMBER(sgi_ip2_state::sgi_ip2_clock_ctl_w)
{
verboselog(1, "sgi_ip2_clock_ctl_w: %02x\n", data);
- m_rtc->write(space, 1, data);
+ m_rtc->write(1, data);
}
READ8_MEMBER(sgi_ip2_state::sgi_ip2_clock_data_r)
{
- uint8_t ret = m_rtc->read(space, 0);
+ uint8_t ret = m_rtc->read(0);
verboselog(1, "sgi_ip2_clock_data_r: %02x\n", ret);
return ret;
}
@@ -207,7 +207,7 @@ READ8_MEMBER(sgi_ip2_state::sgi_ip2_clock_data_r)
WRITE8_MEMBER(sgi_ip2_state::sgi_ip2_clock_data_w)
{
verboselog(1, "sgi_ip2_clock_data_w: %02x\n", data);
- m_rtc->write(space, 0, data);
+ m_rtc->write(0, data);
}
diff --git a/src/mame/drivers/irisha.cpp b/src/mame/drivers/irisha.cpp
index 44527d8f855..6fe59cd673c 100644
--- a/src/mame/drivers/irisha.cpp
+++ b/src/mame/drivers/irisha.cpp
@@ -364,28 +364,28 @@ void irisha_state::machine_reset()
}
/* Machine driver */
-MACHINE_CONFIG_START(irisha_state::irisha)
+void irisha_state::irisha(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", I8080, XTAL(16'000'000) / 9)
- MCFG_DEVICE_PROGRAM_MAP(irisha_mem)
- MCFG_DEVICE_IO_MAP(irisha_io)
+ I8080(config, m_maincpu, XTAL(16'000'000) / 9);
+ m_maincpu->set_addrmap(AS_PROGRAM, &irisha_state::irisha_mem);
+ m_maincpu->set_addrmap(AS_IO, &irisha_state::irisha_io);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(50)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */
- MCFG_SCREEN_SIZE(320, 200)
- MCFG_SCREEN_VISIBLE_AREA(0, 320-1, 0, 200-1)
- MCFG_SCREEN_UPDATE_DRIVER(irisha_state, screen_update_irisha)
- MCFG_SCREEN_PALETTE("palette")
-
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_irisha)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(50);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */
+ screen.set_size(320, 200);
+ screen.set_visarea(0, 320-1, 0, 200-1);
+ screen.set_screen_update(FUNC(irisha_state::screen_update_irisha));
+ screen.set_palette("palette");
+
+ GFXDECODE(config, "gfxdecode", "palette", gfx_irisha);
PALETTE(config, "palette", palette_device::MONOCHROME);
/* sound hardware */
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("speaker", SPEAKER_SOUND)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.50)
+ SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.50);
/* Devices */
I8251(config, "uart", 0);
@@ -408,7 +408,7 @@ MACHINE_CONFIG_START(irisha_state::irisha)
pic8259_device &pic8259(PIC8259(config, "pic8259", 0));
pic8259.out_int_callback().set_inputline(m_maincpu, 0);
-MACHINE_CONFIG_END
+}
/* ROM definition */
diff --git a/src/mame/drivers/irobot.cpp b/src/mame/drivers/irobot.cpp
index 99481b24fab..b52033b0518 100644
--- a/src/mame/drivers/irobot.cpp
+++ b/src/mame/drivers/irobot.cpp
@@ -113,7 +113,7 @@ READ8_MEMBER(irobot_state::quad_pokeyn_r)
int control = (offset & 0x20) >> 2;
int pokey_reg = (offset % 8) | control;
- return m_pokey[pokey_num]->read(space, pokey_reg);
+ return m_pokey[pokey_num]->read(pokey_reg);
}
WRITE8_MEMBER(irobot_state::quad_pokeyn_w)
@@ -122,7 +122,7 @@ WRITE8_MEMBER(irobot_state::quad_pokeyn_w)
int control = (offset & 0x20) >> 2;
int pokey_reg = (offset % 8) | control;
- m_pokey[pokey_num]->write(space, pokey_reg, data);
+ m_pokey[pokey_num]->write(pokey_reg, data);
}
diff --git a/src/mame/drivers/ironhors.cpp b/src/mame/drivers/ironhors.cpp
index 3ff1379258e..421898ca5f9 100644
--- a/src/mame/drivers/ironhors.cpp
+++ b/src/mame/drivers/ironhors.cpp
@@ -378,28 +378,27 @@ Hsync is 15,56khz
These clocks make the emulation run too fast.
*/
-MACHINE_CONFIG_START(ironhors_state::ironhors)
-
+void ironhors_state::ironhors(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", MC6809E, 18432000/6) /* 3.072 MHz??? mod by Shingo Suzuki 1999/10/15 */
- MCFG_DEVICE_PROGRAM_MAP(master_map)
- MCFG_TIMER_DRIVER_ADD_SCANLINE("scantimer", ironhors_state, ironhors_scanline_tick, "screen", 0, 1)
+ MC6809E(config, m_maincpu, 18432000/6); /* 3.072 MHz??? mod by Shingo Suzuki 1999/10/15 */
+ m_maincpu->set_addrmap(AS_PROGRAM, &ironhors_state::master_map);
+ TIMER(config, "scantimer").configure_scanline(FUNC(ironhors_state::ironhors_scanline_tick), "screen", 0, 1);
- MCFG_DEVICE_ADD("soundcpu", Z80, 18432000/6) /* 3.072 MHz */
- MCFG_DEVICE_PROGRAM_MAP(slave_map)
- MCFG_DEVICE_IO_MAP(slave_io_map)
+ Z80(config, m_soundcpu, 18432000/6); /* 3.072 MHz */
+ m_soundcpu->set_addrmap(AS_PROGRAM, &ironhors_state::slave_map);
+ m_soundcpu->set_addrmap(AS_IO, &ironhors_state::slave_io_map);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
-// MCFG_SCREEN_REFRESH_RATE(61)
-// MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
-// MCFG_SCREEN_SIZE(32*8, 32*8)
-// MCFG_SCREEN_VISIBLE_AREA(1*8, 31*8-1, 2*8, 30*8-1)
- MCFG_SCREEN_RAW_PARAMS(18432000/4,296,8,256-8,255,16,240) // pixel clock is a guesswork
-
- MCFG_SCREEN_UPDATE_DRIVER(ironhors_state, screen_update)
- MCFG_SCREEN_PALETTE(m_palette)
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+// m_screen->set_refresh_hz(61);
+// m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(0));
+// m_screen->set_size(32*8, 32*8);
+// m_screen->set_visarea(1*8, 31*8-1, 2*8, 30*8-1);
+ m_screen->set_raw(18432000/4,296,8,256-8,255,16,240); // pixel clock is a guesswork
+ m_screen->set_screen_update(FUNC(ironhors_state::screen_update));
+ m_screen->set_palette(m_palette);
GFXDECODE(config, m_gfxdecode, m_palette, gfx_ironhors);
PALETTE(config, m_palette, FUNC(ironhors_state::ironhors_palette), 16*8*16+16*8*16, 256);
@@ -416,10 +415,8 @@ MACHINE_CONFIG_START(ironhors_state::ironhors)
ym2203.add_route(2, "disc_ih", 1.0, 2);
ym2203.add_route(3, "disc_ih", 1.0, 3);
- MCFG_DEVICE_ADD("disc_ih", DISCRETE, ironhors_discrete)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
-
-MACHINE_CONFIG_END
+ DISCRETE(config, m_disc_ih, ironhors_discrete).add_route(ALL_OUTPUTS, "mono", 1.0);
+}
TIMER_DEVICE_CALLBACK_MEMBER(ironhors_state::farwest_scanline_tick)
{
@@ -442,25 +439,23 @@ READ8_MEMBER(ironhors_state::farwest_soundlatch_r)
return m_soundlatch->read(m_soundcpu->space(AS_PROGRAM), 0);
}
-MACHINE_CONFIG_START(ironhors_state::farwest)
+void ironhors_state::farwest(machine_config &config)
+{
ironhors(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(farwest_master_map)
- MCFG_DEVICE_MODIFY("scantimer")
- MCFG_TIMER_DRIVER_CALLBACK(ironhors_state, farwest_scanline_tick)
+ m_maincpu->set_addrmap(AS_PROGRAM, &ironhors_state::farwest_master_map);
+ subdevice<timer_device>("scantimer")->set_callback(FUNC(ironhors_state::farwest_scanline_tick));
- MCFG_DEVICE_MODIFY("soundcpu")
- MCFG_DEVICE_PROGRAM_MAP(farwest_slave_map)
- MCFG_DEVICE_REMOVE_ADDRESS_MAP(AS_IO)
+ Z80(config.replace(), m_soundcpu, 18432000/6); /* 3.072 MHz */
+ m_soundcpu->set_addrmap(AS_PROGRAM, &ironhors_state::farwest_slave_map);
- MCFG_GFXDECODE_MODIFY("gfxdecode", gfx_farwest)
+ m_gfxdecode->set_info(gfx_farwest);
MCFG_VIDEO_START_OVERRIDE(ironhors_state,farwest)
- MCFG_SCREEN_MODIFY("screen")
- MCFG_SCREEN_UPDATE_DRIVER(ironhors_state, screen_update_farwest)
+
+ m_screen->set_screen_update(FUNC(ironhors_state::screen_update_farwest));
subdevice<ym2203_device>("ym2203")->port_b_read_callback().set(FUNC(ironhors_state::farwest_soundlatch_r));
-MACHINE_CONFIG_END
+}
diff --git a/src/mame/drivers/isbc8010.cpp b/src/mame/drivers/isbc8010.cpp
index a6c4b4017fa..d13e49b7fa4 100644
--- a/src/mame/drivers/isbc8010.cpp
+++ b/src/mame/drivers/isbc8010.cpp
@@ -171,11 +171,12 @@ static DEVICE_INPUT_DEFAULTS_START( terminal ) // set up terminal to default to
DEVICE_INPUT_DEFAULTS( "RS232_STOPBITS", 0xff, RS232_STOPBITS_1 )
DEVICE_INPUT_DEFAULTS_END
-MACHINE_CONFIG_START(isbc8010_state::isbc8010)
+void isbc8010_state::isbc8010(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", I8080A, XTAL(18'432'000)/9)
- MCFG_DEVICE_PROGRAM_MAP(isbc8010_mem)
- MCFG_DEVICE_IO_MAP(isbc8010_io)
+ I8080A(config, m_maincpu, XTAL(18'432'000)/9);
+ m_maincpu->set_addrmap(AS_PROGRAM, &isbc8010_state::isbc8010_mem);
+ m_maincpu->set_addrmap(AS_IO, &isbc8010_state::isbc8010_io);
I8251(config, m_usart, 0);
m_usart->txd_handler().set(RS232_TAG, FUNC(rs232_port_device::write_txd));
@@ -191,37 +192,41 @@ MACHINE_CONFIG_START(isbc8010_state::isbc8010)
m_rs232->cts_handler().set(m_usart, FUNC(i8251_device::write_cts));
m_rs232->set_option_device_input_defaults("terminal", DEVICE_INPUT_DEFAULTS_NAME(terminal));
- MCFG_DEVICE_ADD("usart_clock", CLOCK, XTAL(18'432'000)/60)
- MCFG_CLOCK_SIGNAL_HANDLER(WRITELINE(*this, isbc8010_state, usart_clock_tick))
+ clock_device &usart_clock(CLOCK(config, "usart_clock", XTAL(18'432'000)/60));
+ usart_clock.signal_handler().set(FUNC(isbc8010_state::usart_clock_tick));
/* video hardware */
// 96364 crt controller
-// MCFG_SCREEN_ADD("screen", RASTER)
-// MCFG_SCREEN_REFRESH_RATE(60)
+// screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+// screen.set_refresh_hz(60);
/* Video is blanked for 70 out of 262 scanlines per refresh cycle.
Each scanline is composed of 65 character times, 40 of which
are visible, and each character time is 7 dot times; a dot time
is 2 cycles of the fundamental 14.31818 MHz oscillator. The
total blanking time is about 4450 microseconds. */
-// MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC((int) (70 * 65 * 7 * 2 / 14.31818)))
+// screen.set_vblank_time(ATTOSECONDS_IN_USEC((int) (70 * 65 * 7 * 2 / 14.31818)));
/* It would be nice if we could implement some sort of display
overscan here. */
-// MCFG_SCREEN_SIZE(40 * 7, 24 * 8)
-// MCFG_SCREEN_VISIBLE_AREA(0, 40 * 7 - 1, 0, 24 * 8 - 1)
-// MCFG_SCREEN_UPDATE_DRIVER(sdk80_state, screen_update)
-// MCFG_SCREEN_PALETTE("palette")
+// screen.set_size(40 * 7, 24 * 8);
+// screen.set_visarea(0, 40 * 7 - 1, 0, 24 * 8 - 1);
+// screen.set_screen_update(FUNC(sdk80_state::screen_update));
+// screen.set_palette("palette");
-// MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_sdk80)
+// GFXDECODE(config, "gfxdecode", "palette", gfx_sdk80);
-// MCFG_PALETTE_ADD_MONOCHROME("palette")
+// PALETTE(config, "palette", palette_device::MONOCHROME);
// Video board UART
-// MCFG_DEVICE_ADD( "hd6402", AY31015, 0 )
+// ay31015_device &hd6402(AY31015(config, "hd6402", 0));
// MCFG_AY31015_TX_CLOCK(( XTAL(16'000'000) / 16 ) / 256)
// MCFG_AY31015_RX_CLOCK(( XTAL(16'000'000) / 16 ) / 256)
-// MCFG_AY51013_READ_SI_CB(READ8(*this, sdk80_state, nascom1_hd6402_si))
-// MCFG_AY51013_WRITE_SO_CB(WRITE8(*this, sdk80_state, nascom1_hd6402_so))
+// hd6402.read_si_callback().set(FUNC(sdk80_state::nascom1_hd6402_si));
+// hd6402.write_so_callback().set(FUNC(sdk80_state::nascom1_hd6402_so));
+
+// clock_device &uart_clock(CLOCK(config, "uart_clock", (XTAL(16'000'000) / 16) / 256));
+// uart_clock.signal_handler().set("hd6402", FUNC(ay31015_device::write_tcp));
+// uart_clock.signal_handler().append("hd6402", FUNC(ay31015_device::write_rcp));
/* Devices */
// i8279_device &kbdc(I8279(config, "i8279", 3100000)); // based on divider
@@ -231,22 +236,21 @@ MACHINE_CONFIG_START(isbc8010_state::isbc8010)
// kbdc.in_rl_callback().set(FUNC(sdk80_state::kbd_r)); // kbd RL lines
// kbdc.in_shift_callback().set_constant(1); // Shift key
// kbdc.in_ctrl_callback().set_constant(1);
+}
-MACHINE_CONFIG_END
-
-MACHINE_CONFIG_START(isbc8010_state::isbc8010a)
+void isbc8010_state::isbc8010a(machine_config &config)
+{
isbc8010(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY( "maincpu" )
- MCFG_DEVICE_PROGRAM_MAP(isbc8010a_mem)
-MACHINE_CONFIG_END
+ m_maincpu->set_addrmap(AS_PROGRAM, &isbc8010_state::isbc8010a_mem);
+}
-MACHINE_CONFIG_START(isbc8010_state::isbc8010b)
+void isbc8010_state::isbc8010b(machine_config &config)
+{
isbc8010(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(isbc8010b_mem)
-MACHINE_CONFIG_END
+ m_maincpu->set_addrmap(AS_PROGRAM, &isbc8010_state::isbc8010b_mem);
+}
/* ROM definition */
ROM_START( isbc8010 )
diff --git a/src/mame/drivers/iskr103x.cpp b/src/mame/drivers/iskr103x.cpp
index 15e8c50f9ec..f40083d9ba7 100644
--- a/src/mame/drivers/iskr103x.cpp
+++ b/src/mame/drivers/iskr103x.cpp
@@ -25,7 +25,6 @@
#include "machine/ram.h"
#include "softlist.h"
-#define DBG_LOG(a,b,c)
class iskr103x_state : public driver_device
{
@@ -68,36 +67,37 @@ static DEVICE_INPUT_DEFAULTS_START(iskr1031)
DEVICE_INPUT_DEFAULTS_END
// XXX
-MACHINE_CONFIG_START(iskr103x_state::iskr1030m)
+void iskr103x_state::iskr1030m(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", I8086, 4772720)
- MCFG_DEVICE_PROGRAM_MAP(iskr1031_map)
- MCFG_DEVICE_IO_MAP(iskr1031_io)
- MCFG_DEVICE_IRQ_ACKNOWLEDGE_DEVICE("mb:pic8259", pic8259_device, inta_cb)
+ I8086(config, m_maincpu, 4772720);
+ m_maincpu->set_addrmap(AS_PROGRAM, &iskr103x_state::iskr1031_map);
+ m_maincpu->set_addrmap(AS_IO, &iskr103x_state::iskr1031_io);
+ m_maincpu->set_irq_acknowledge_callback("mb:pic8259", FUNC(pic8259_device::inta_cb));
- MCFG_IBM5160_MOTHERBOARD_ADD("mb","maincpu")
- MCFG_DEVICE_INPUT_DEFAULTS(iskr1030m)
+ ibm5160_mb_device &mb(IBM5160_MOTHERBOARD(config, "mb", 0));
+ mb.set_cputag(m_maincpu);
+ mb.set_input_default(DEVICE_INPUT_DEFAULTS_NAME(iskr1030m));
- MCFG_DEVICE_ADD("isa1", ISA8_SLOT, 0, "mb:isa", iskr103x_isa8_cards, "cga_iskr1030m", false) // FIXME: determine IS bus clock
- MCFG_DEVICE_ADD("isa2", ISA8_SLOT, 0, "mb:isa", iskr103x_isa8_cards, "fdc_xt", false)
- MCFG_DEVICE_ADD("isa3", ISA8_SLOT, 0, "mb:isa", iskr103x_isa8_cards, nullptr, false)
- MCFG_DEVICE_ADD("isa4", ISA8_SLOT, 0, "mb:isa", iskr103x_isa8_cards, nullptr, false)
- MCFG_DEVICE_ADD("isa5", ISA8_SLOT, 0, "mb:isa", iskr103x_isa8_cards, nullptr, false)
- MCFG_DEVICE_ADD("isa6", ISA8_SLOT, 0, "mb:isa", iskr103x_isa8_cards, nullptr, false)
+ ISA8_SLOT(config, "isa1", 0, "mb:isa", iskr103x_isa8_cards, "cga_iskr1030m", false); // FIXME: determine IS bus clock
+ ISA8_SLOT(config, "isa2", 0, "mb:isa", iskr103x_isa8_cards, "fdc_xt", false);
+ ISA8_SLOT(config, "isa3", 0, "mb:isa", iskr103x_isa8_cards, nullptr, false);
+ ISA8_SLOT(config, "isa4", 0, "mb:isa", iskr103x_isa8_cards, nullptr, false);
+ ISA8_SLOT(config, "isa5", 0, "mb:isa", iskr103x_isa8_cards, nullptr, false);
+ ISA8_SLOT(config, "isa6", 0, "mb:isa", iskr103x_isa8_cards, nullptr, false);
- MCFG_PC_KBDC_SLOT_ADD("mb:pc_kbdc", "kbd", pc_xt_keyboards, STR_KBD_EC_1841)
-// MCFG_PC_KBDC_SLOT_ADD("mb:pc_kbdc", "kbd", pc_xt_keyboards, STR_KBD_ISKR_1030)
+ PC_KBDC_SLOT(config, "kbd", pc_xt_keyboards, STR_KBD_EC_1841).set_pc_kbdc_slot(subdevice("mb:pc_kbdc"));
+// PC_KBDC_SLOT(config, "kbd", pc_xt_keyboards, STR_KBD_ISKR_1030).set_pc_kbdc_slot(subdevice("mb:pc_kbdc"));
RAM(config, RAM_TAG).set_default_size("640K").set_extra_options("64K, 128K, 256K, 512K");
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(iskr103x_state::iskr1031)
+void iskr103x_state::iskr1031(machine_config &config)
+{
iskr1030m(config);
- MCFG_DEVICE_MODIFY("mb")
- MCFG_DEVICE_INPUT_DEFAULTS(iskr1031)
- MCFG_DEVICE_MODIFY("isa1")
- MCFG_DEVICE_SLOT_INTERFACE(iskr103x_isa8_cards, "cga_iskr1031", false)
-MACHINE_CONFIG_END
+ subdevice<ibm5160_mb_device>("mb")->set_input_default(DEVICE_INPUT_DEFAULTS_NAME(iskr1031));
+ subdevice<isa8_slot_device>("isa1")->set_default_option("cga_iskr1031");
+}
ROM_START( iskr1030m )
ROM_REGION16_LE(0x10000,"bios", 0)
diff --git a/src/mame/drivers/istellar.cpp b/src/mame/drivers/istellar.cpp
index 9b64b5a6777..ec60d2368ae 100644
--- a/src/mame/drivers/istellar.cpp
+++ b/src/mame/drivers/istellar.cpp
@@ -275,19 +275,19 @@ WRITE_LINE_MEMBER(istellar_state::vblank_irq)
/* DRIVER */
MACHINE_CONFIG_START(istellar_state::istellar)
/* main cpu */
- MCFG_DEVICE_ADD("maincpu", Z80, GUESSED_CLOCK)
- MCFG_DEVICE_PROGRAM_MAP(z80_0_mem)
- MCFG_DEVICE_IO_MAP(z80_0_io)
+ Z80(config, m_maincpu, GUESSED_CLOCK);
+ m_maincpu->set_addrmap(AS_PROGRAM, &istellar_state::z80_0_mem);
+ m_maincpu->set_addrmap(AS_IO, &istellar_state::z80_0_io);
/* sound cpu */
- MCFG_DEVICE_ADD("audiocpu", Z80, GUESSED_CLOCK)
- MCFG_DEVICE_PROGRAM_MAP(z80_1_mem)
- MCFG_DEVICE_IO_MAP(z80_1_io)
+ z80_device &audiocpu(Z80(config, "audiocpu", GUESSED_CLOCK));
+ audiocpu.set_addrmap(AS_PROGRAM, &istellar_state::z80_1_mem);
+ audiocpu.set_addrmap(AS_IO, &istellar_state::z80_1_io);
/* ldp comm cpu */
- MCFG_DEVICE_ADD("sub", Z80, GUESSED_CLOCK)
- MCFG_DEVICE_PROGRAM_MAP(z80_2_mem)
- MCFG_DEVICE_IO_MAP(z80_2_io)
+ Z80(config, m_subcpu, GUESSED_CLOCK);
+ m_subcpu->set_addrmap(AS_PROGRAM, &istellar_state::z80_2_mem);
+ m_subcpu->set_addrmap(AS_IO, &istellar_state::z80_2_io);
GENERIC_LATCH_8(config, "latch1");
@@ -295,9 +295,11 @@ MACHINE_CONFIG_START(istellar_state::istellar)
latch2.data_pending_callback().set_inputline(m_subcpu, INPUT_LINE_NMI);
latch2.set_separate_acknowledge(true);
- MCFG_LASERDISC_LDV1000_ADD("laserdisc")
- MCFG_LASERDISC_OVERLAY_DRIVER(256, 256, istellar_state, screen_update_istellar)
- MCFG_LASERDISC_OVERLAY_PALETTE(m_palette)
+ PIONEER_LDV1000(config, m_laserdisc, 0);
+ m_laserdisc->set_overlay(256, 256, FUNC(istellar_state::screen_update_istellar));
+ m_laserdisc->set_overlay_palette(m_palette);
+ m_laserdisc->add_route(0, "lspeaker", 1.0);
+ m_laserdisc->add_route(1, "rspeaker", 1.0);
/* video hardware */
MCFG_LASERDISC_SCREEN_ADD_NTSC("screen", "laserdisc")
@@ -306,15 +308,11 @@ MACHINE_CONFIG_START(istellar_state::istellar)
// Daphne says "TODO: get the real interstellar resistor values"
PALETTE(config, m_palette, palette_device::RGB_444_PROMS, "proms", 256);
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_istellar)
+ GFXDECODE(config, m_gfxdecode, m_palette, gfx_istellar);
/* sound hardware */
SPEAKER(config, "lspeaker").front_left();
SPEAKER(config, "rspeaker").front_right();
-
- MCFG_DEVICE_MODIFY("laserdisc")
- MCFG_SOUND_ROUTE(0, "lspeaker", 1.0)
- MCFG_SOUND_ROUTE(1, "rspeaker", 1.0)
MACHINE_CONFIG_END
diff --git a/src/mame/drivers/istrebiteli.cpp b/src/mame/drivers/istrebiteli.cpp
index 2c047cdb21e..169711aab56 100644
--- a/src/mame/drivers/istrebiteli.cpp
+++ b/src/mame/drivers/istrebiteli.cpp
@@ -584,11 +584,12 @@ static GFXDECODE_START( gfx_motogonki )
GFXDECODE_ENTRY( "sprite", 0x0000, moto_sprite_layout, 2, 2 )
GFXDECODE_END
-MACHINE_CONFIG_START(istrebiteli_state::istreb)
+void istrebiteli_state::istreb(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD(m_maincpu, I8080, XTAL(8'000'000) / 4) // KR580VM80A
- MCFG_DEVICE_PROGRAM_MAP(mem_map)
- MCFG_DEVICE_IO_MAP(io_map)
+ I8080(config, m_maincpu, XTAL(8'000'000) / 4); // KR580VM80A
+ m_maincpu->set_addrmap(AS_PROGRAM, &istrebiteli_state::mem_map);
+ m_maincpu->set_addrmap(AS_IO, &istrebiteli_state::io_map);
i8255_device &ppi0(I8255A(config, "ppi0"));
ppi0.in_pa_callback().set_ioport("IN1");
@@ -601,10 +602,10 @@ MACHINE_CONFIG_START(istrebiteli_state::istreb)
ppi1.in_pc_callback().set_ioport("IN2");
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_RAW_PARAMS(XTAL(8'000'000) / 2, 256, 64, 256, 312, 0, 256)
- MCFG_SCREEN_UPDATE_DRIVER(istrebiteli_state, screen_update)
- MCFG_SCREEN_PALETTE("palette")
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_raw(XTAL(8'000'000) / 2, 256, 64, 256, 312, 0, 256);
+ screen.set_screen_update(FUNC(istrebiteli_state::screen_update));
+ screen.set_palette("palette");
GFXDECODE(config, m_gfxdecode, "palette", gfx_istrebiteli);
PALETTE(config, "palette", FUNC(istrebiteli_state::istrebiteli_palette), 4);
@@ -612,13 +613,14 @@ MACHINE_CONFIG_START(istrebiteli_state::istreb)
/* sound hardware */
SPEAKER(config, "mono").front_center();
ISTREBITELI_SOUND(config, m_sound_dev, XTAL(8'000'000) / 2 / 256).add_route(ALL_OUTPUTS, "mono", 1.00);
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(istrebiteli_state::motogonki)
+void istrebiteli_state::motogonki(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD(m_maincpu, I8080, XTAL(15'700'000) / 9) // KR580VM80A
- MCFG_DEVICE_PROGRAM_MAP(moto_mem_map)
- MCFG_DEVICE_IO_MAP(moto_io_map)
+ I8080(config, m_maincpu, XTAL(15'700'000) / 9); // KR580VM80A
+ m_maincpu->set_addrmap(AS_PROGRAM, &istrebiteli_state::moto_mem_map);
+ m_maincpu->set_addrmap(AS_IO, &istrebiteli_state::moto_io_map);
i8255_device &ppi0(I8255A(config, "ppi0"));
ppi0.out_pa_callback().set(FUNC(istrebiteli_state::spr0_ctrl_w));
@@ -630,10 +632,10 @@ MACHINE_CONFIG_START(istrebiteli_state::motogonki)
ppi1.in_pc_callback().set_ioport("IN1");
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_RAW_PARAMS(XTAL(8'000'000) / 2, 256, 64, 256, 312, 0, 256)
- MCFG_SCREEN_UPDATE_DRIVER(istrebiteli_state, moto_screen_update)
- MCFG_SCREEN_PALETTE("palette")
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_raw(XTAL(8'000'000) / 2, 256, 64, 256, 312, 0, 256);
+ screen.set_screen_update(FUNC(istrebiteli_state::moto_screen_update));
+ screen.set_palette("palette");
GFXDECODE(config, m_gfxdecode, "palette", gfx_motogonki);
PALETTE(config, "palette", FUNC(istrebiteli_state::motogonki_palette), 4);
@@ -642,7 +644,7 @@ MACHINE_CONFIG_START(istrebiteli_state::motogonki)
/* sound hardware */
SPEAKER(config, "mono").front_center();
ISTREBITELI_SOUND(config, m_sound_dev, XTAL(8'000'000) / 2 / 256).add_route(ALL_OUTPUTS, "mono", 1.00);
-MACHINE_CONFIG_END
+}
ROM_START( istreb )
ROM_REGION( 0x1000, I8080_TAG, ROMREGION_ERASEFF )
diff --git a/src/mame/drivers/iteagle.cpp b/src/mame/drivers/iteagle.cpp
index eef52e1f4ed..47d71274c40 100644
--- a/src/mame/drivers/iteagle.cpp
+++ b/src/mame/drivers/iteagle.cpp
@@ -165,7 +165,8 @@ void iteagle_state::machine_reset()
{
}
-MACHINE_CONFIG_START(iteagle_state::iteagle)
+void iteagle_state::iteagle(machine_config &config)
+{
/* basic machine hardware */
VR4310LE(config, m_maincpu, 166666666);
m_maincpu->set_icache_size(16384);
@@ -206,77 +207,89 @@ MACHINE_CONFIG_START(iteagle_state::iteagle)
screen.set_size(512, 384);
screen.set_visarea(0, 512 - 1, 0, 384 - 1);
screen.set_screen_update(PCI_ID_VIDEO, FUNC(voodoo_pci_device::screen_update));
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(iteagle_state::gtfore01)
+void iteagle_state::gtfore01(machine_config &config)
+{
iteagle(config);
m_fpga->set_init_info(0x01000401, 0x0b0b0b);
m_eeprom->set_info(0x0401, 0x7);
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(iteagle_state::gtfore02)
+void iteagle_state::gtfore02(machine_config &config)
+{
iteagle(config);
m_fpga->set_init_info(0x01000402, 0x020201);
m_eeprom->set_info(0x0402, 0x7);
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(iteagle_state::gtfore03)
+void iteagle_state::gtfore03(machine_config &config)
+{
iteagle(config);
m_fpga->set_init_info(0x01000403, 0x0a0b0a);
m_eeprom->set_info(0x0403, 0x7);
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(iteagle_state::gtfore04)
+void iteagle_state::gtfore04(machine_config &config)
+{
iteagle(config);
m_fpga->set_init_info(0x01000404, 0x0a020b);
m_eeprom->set_info(0x0404, 0x7);
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(iteagle_state::gtfore05)
+void iteagle_state::gtfore05(machine_config &config)
+{
iteagle(config);
m_fpga->set_init_info(0x01000405, 0x0b0a0c);
m_eeprom->set_info(0x0405, 0x7);
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(iteagle_state::gtfore06)
+void iteagle_state::gtfore06(machine_config &config)
+{
iteagle(config);
m_fpga->set_init_info(0x01000406, 0x0c0b0d);
m_eeprom->set_info(0x0406, 0x9);
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(iteagle_state::carnking)
+void iteagle_state::carnking(machine_config &config)
+{
iteagle(config);
m_fpga->set_init_info(0x01000a01, 0x0e0a0a);
m_eeprom->set_info(0x0a01, 0x9);
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(iteagle_state::bbh)
+void iteagle_state::bbh(machine_config &config)
+{
iteagle(config);
// 0xXX01XXXX = tournament board
m_fpga->set_init_info(0x02010600, 0x0b0a0a);
m_eeprom->set_info(0x0000, 0x7);
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(iteagle_state::bbhsc)
+void iteagle_state::bbhsc(machine_config &config)
+{
iteagle(config);
// 0xXX01XXXX = tournament board
m_fpga->set_init_info(0x02010600, 0x0c0a0a);
m_eeprom->set_info(0x0000, 0x7);
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(iteagle_state::bbh2sp)
+void iteagle_state::bbh2sp(machine_config &config)
+{
iteagle(config);
m_fpga->set_init_info(0x02010602, 0x0d0a0a);
m_eeprom->set_info(0x0000, 0x7);
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(iteagle_state::bbhcotw)
+void iteagle_state::bbhcotw(machine_config &config)
+{
iteagle(config);
m_fpga->set_init_info(0x02010603, 0x080704);
m_eeprom->set_info(0x0603, 0x9);
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(iteagle_state::virtpool)
+void iteagle_state::virtpool(machine_config &config)
+{
iteagle(config);
// Not sure what the actual value should be
// Setting a lower frequency helps delay the tutorial screen premature cut-out
@@ -289,7 +302,7 @@ MACHINE_CONFIG_START(iteagle_state::virtpool)
m_fpga->set_init_info(0x01000202, 0x080808);
m_eeprom->set_info(0x0202, 0x7);
-MACHINE_CONFIG_END
+}
/*************************************
diff --git a/src/mame/drivers/itech32.cpp b/src/mame/drivers/itech32.cpp
index c560827d403..6ae1439c9cc 100644
--- a/src/mame/drivers/itech32.cpp
+++ b/src/mame/drivers/itech32.cpp
@@ -15,7 +15,7 @@
* Pairs (4 sets)
* Pairs Redemption (Child's version of pairs)
* Driver's Edge (1 set)
- * World Class Bowling (13 sets)
+ * World Class Bowling (14 sets)
* Street Fighter: The Movie (5 sets)
* Shuffleshot (3 sets)
* Golden Tee 3D Golf (12 sets)
@@ -1668,7 +1668,7 @@ INPUT_PORTS_END
void itech32_state::base_devices(machine_config &config)
{
- MC6809(config, m_soundcpu, SOUND_CLOCK/2);
+ MC6809E(config, m_soundcpu, SOUND_CLOCK/8); // EF68B09EP
m_soundcpu->set_addrmap(AS_PROGRAM, &itech32_state::sound_map);
nvram_device &nvram(NVRAM(config, "nvram"));
@@ -2431,6 +2431,42 @@ ROM_START( wcbowl140 ) /* Version 1.40 Tournament (PCB P/N 1083 Rev 2) */
ROM_END
+ROM_START( wcbowl130 ) /* Version 1.30 Tournament (PCB P/N 1083 Rev 2) */
+ ROM_REGION32_BE( CODE_SIZE, "user1", 0 )
+ ROM_LOAD32_BYTE( "wcb_prom0_v1.30t.prom0", 0x00000, 0x20000, NO_DUMP ) /* found as 3 loose chips missing WCB PROM0 V1.30T ROM */
+ ROM_LOAD32_BYTE( "wcb_prom1_v1.30t.prom1", 0x00001, 0x20000, CRC(f4b8e7c3) SHA1(29471a464e783e820d7cde356b49d26b9394f513) )
+ ROM_LOAD32_BYTE( "wcb_prom2_v1.30t.prom2", 0x00002, 0x20000, CRC(f441afae) SHA1(31d619e63f951cfb08481474f08d278aeaa15c46) )
+ ROM_LOAD32_BYTE( "wcb_prom3_v1.30t.prom3", 0x00003, 0x20000, CRC(47e26d4b) SHA1(44459daef1ffe19640b26adcf122dfcd4a327a68) )
+
+ ROM_REGION( 0x28000, "soundcpu", 0 )
+ ROM_LOAD( "wcbsnd_u88_4.01.u88", 0x10000, 0x18000, CRC(e97a6d28) SHA1(96d7b7856918abcc460083f2a46582ba2a689288) ) /* actually labeled as "WCBSND(U88)4.01" but may be labeled v4.0 */
+ ROM_CONTINUE( 0x08000, 0x08000 )
+
+ ROM_REGION( 0x880000, "gfx1", 0 )
+ ROM_LOAD32_BYTE( "wcb_grom0_0_s.grm0_0", 0x000000, 0x080000, CRC(6fcb4246) SHA1(91fb5d18ea9494b08251d1e611c80414df3aad66) )
+ ROM_LOAD32_BYTE( "wcb_grom0_1_s.grm0_1", 0x000001, 0x080000, CRC(2ae31f45) SHA1(85218aa9a7ca7c6870427ffbd08b78255813ff90) )
+ ROM_LOAD32_BYTE( "wcb_grom0_2_s.grm0_2", 0x000002, 0x080000, CRC(bccc0f35) SHA1(2389662e881e86f8cdb36eb2a082923d976676c8) )
+ ROM_LOAD32_BYTE( "wcb_grom0_3_s.grm0_3", 0x000003, 0x080000, CRC(ab1da462) SHA1(3f3a4a083483d2d95d5ef540eea077cad799fcb7) )
+ ROM_LOAD32_BYTE( "wcb_grom1_0_s.grm1_0", 0x200000, 0x080000, CRC(bdfafd1f) SHA1(bc0e6fe83d3f8e88c2e55ba3a436875d5470de5b) )
+ ROM_LOAD32_BYTE( "wcb_grom1_1_s.grm1_1", 0x200001, 0x080000, CRC(7d6baa2e) SHA1(c47854b064aa96d2581c23afe13cd05a36f9dae3) )
+ ROM_LOAD32_BYTE( "wcb_grom1_2_s.grm1_2", 0x200002, 0x080000, CRC(7513d3de) SHA1(b17650ed5210860c3bde53647a30f8fce67aaa38) )
+ ROM_LOAD32_BYTE( "wcb_grom1_3_s.grm1_3", 0x200003, 0x080000, CRC(e46877e6) SHA1(f50c904ec5b2b8cbc92f2b28641433c91ee17af5) )
+ ROM_LOAD32_BYTE( "wcbf_grom2_0.grm2_0", 0x400000, 0x040000, CRC(3b4c5a5c) SHA1(152cbc5d1aa84012f49fa13d91fd89a10f874508) )
+ ROM_LOAD32_BYTE( "wcbf_grom2_1.grm2_1", 0x400001, 0x040000, CRC(ed0b9b26) SHA1(5173e3936cae419255b3034e2b8a69f6bd136b93) )
+ ROM_LOAD32_BYTE( "wcbf_grom2_2.grm2_2", 0x400002, 0x040000, CRC(4b9e345e) SHA1(6842a8a6690db8478bdbb8e8119d3eef5e77439b) )
+ ROM_LOAD32_BYTE( "wcbf_grom2_3.grm2_3", 0x400003, 0x040000, CRC(4e13ee7a) SHA1(245ce87cd6839119a9a976b9a90cd1028aa3e291) )
+ ROM_FILL( 0x500000, 0x380000, 0xff )
+
+ ROM_REGION16_BE( 0x400000, "ensoniq.0", ROMREGION_ERASE00 )
+ ROM_LOAD16_BYTE( "wcb_srom0_s.srom0", 0x000000, 0x080000, CRC(d42dd283) SHA1(8ef75c398d1c51d2d7d299ac309a2352179864d9) ) /* Newer sound sample ROMs */
+ ROM_LOAD16_BYTE( "wcb_srom1_s.srom1", 0x200000, 0x080000, CRC(7a69ab54) SHA1(d1f9194446e235af69c6ff28af0dccc44ab9b5d3) ) /* Newer sound sample ROMs */
+
+ ROM_REGION16_BE( 0x400000, "ensoniq.1", ROMREGION_ERASE00 )
+ ROM_LOAD16_BYTE( "wcb_srom2_s.srom2", 0x000000, 0x080000, CRC(346530a2) SHA1(9951971ad6d368fb718027e18331d12f0a72970c) ) /* Newer sound sample ROMs */
+ ROM_LOAD16_BYTE( "wcb_srom3_s.srom3", 0x200000, 0x040000, CRC(1dfe3a31) SHA1(94947f495692288fbf14fc7796a84c5548a2e8a8) ) /* Newer sound sample ROMs, ROM is a 27C020 in this set */
+ROM_END
+
+
ROM_START( wcbowl ) /* Version 1.66 (PCB P/N 1083 Rev 2) */
ROM_REGION32_BE( CODE_SIZE, "user1", 0 )
ROM_LOAD32_BYTE( "wcb_prom0_v1.66n.prom0", 0x00000, 0x20000, CRC(f6774112) SHA1(cb09bb3e40490b3cdc3a5f7d18168384b5b29d85) ) /* original labels also found without the "N" */
@@ -4523,7 +4559,7 @@ void itech32_state::init_wcbowln()
void itech32_state::install_timekeeper()
{
- m_maincpu->space(AS_PROGRAM).install_readwrite_handler(0x681000, 0x6817ff, read8_delegate(FUNC(timekeeper_device::read), &(*m_timekeeper)), write8_delegate(FUNC(timekeeper_device::write), &(*m_timekeeper)), 0xffffffff);
+ m_maincpu->space(AS_PROGRAM).install_readwrite_handler(0x681000, 0x6817ff, read8sm_delegate(FUNC(timekeeper_device::read), &(*m_timekeeper)), write8sm_delegate(FUNC(timekeeper_device::write), &(*m_timekeeper)), 0xffffffff);
}
void itech32_state::init_wcbowlt()
@@ -4697,6 +4733,7 @@ GAME( 1995, sftmj112, sftm, sftm, sftm, itech32_state, init_sft
GAME( 1997, shufshot, 0, sftm, shufshot, itech32_state, init_shufshot, ROT0, "Strata/Incredible Technologies", "Shuffleshot (v1.40)" , MACHINE_SUPPORTS_SAVE ) /* PIC 16C54 labeled as ITSHF-1 */
GAME( 1997, shufshot139, shufshot, sftm, shufshot, itech32_state, init_shufshot, ROT0, "Strata/Incredible Technologies", "Shuffleshot (v1.39)" , MACHINE_SUPPORTS_SAVE ) /* PIC 16C54 labeled as ITSHF-1 */
GAME( 1997, shufshot137, shufshot, sftm, shufshto, itech32_state, init_shufshot, ROT0, "Strata/Incredible Technologies", "Shuffleshot (v1.37)" , MACHINE_SUPPORTS_SAVE ) /* PIC 16C54 labeled as ITSHF-1 */
+GAME( 1997, wcbowl130, wcbowldx, tourny, wcbowldx, itech32_state, init_wcbowlt, ROT0, "Incredible Technologies", "World Class Bowling Tournament (v1.30)" , MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE ) /* PIC 16C54 labeled as ITBWL-3 *** missing program ROM PROM0 */
GAME( 1997, wcbowl140, wcbowldx, tourny, wcbowldx, itech32_state, init_wcbowlt, ROT0, "Incredible Technologies", "World Class Bowling Tournament (v1.40)" , MACHINE_SUPPORTS_SAVE ) /* PIC 16C54 labeled as ITBWL-3 */
GAME( 1999, wcbowldx, 0, sftm, wcbowldx, itech32_state, init_shufshot, ROT0, "Incredible Technologies", "World Class Bowling Deluxe (v2.00)" , MACHINE_SUPPORTS_SAVE ) /* PIC 16C54 labeled as ITBWL-4 */
diff --git a/src/mame/drivers/itech8.cpp b/src/mame/drivers/itech8.cpp
index 88d4fb7ba71..aa4b51c5d35 100644
--- a/src/mame/drivers/itech8.cpp
+++ b/src/mame/drivers/itech8.cpp
@@ -840,12 +840,12 @@ READ16_MEMBER(itech8_state::rom_constant_r)
READ8_MEMBER(itech8_state::ninclown_palette_r)
{
- return m_tlc34076->read(space, offset / 16);
+ return m_tlc34076->read(offset / 16);
}
WRITE8_MEMBER(itech8_state::ninclown_palette_w)
{
- m_tlc34076->write(space, offset / 16, data);
+ m_tlc34076->write(offset / 16, data);
}
diff --git a/src/mame/drivers/itgambl2.cpp b/src/mame/drivers/itgambl2.cpp
index 14d69f83254..79ccaabe13e 100644
--- a/src/mame/drivers/itgambl2.cpp
+++ b/src/mame/drivers/itgambl2.cpp
@@ -275,19 +275,19 @@ void itgambl2_state::itgambl2_palette(palette_device &palette) const
* Machine Drivers *
**************************/
-MACHINE_CONFIG_START(itgambl2_state::itgambl2)
-
+void itgambl2_state::itgambl2(machine_config &config)
+{
// basic machine hardware
- MCFG_DEVICE_ADD("maincpu", H83337, MAIN_CLOCK)
- MCFG_DEVICE_PROGRAM_MAP(itgambl2_map)
+ H83337(config, m_maincpu, MAIN_CLOCK);
+ m_maincpu->set_addrmap(AS_PROGRAM, &itgambl2_state::itgambl2_map);
// video hardware
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(512, 256)
- MCFG_SCREEN_VISIBLE_AREA(0, 512-1, 0, 256-1)
- MCFG_SCREEN_UPDATE_DRIVER(itgambl2_state, screen_update_itgambl2)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(512, 256);
+ screen.set_visarea(0, 512-1, 0, 256-1);
+ screen.set_screen_update(FUNC(itgambl2_state::screen_update_itgambl2));
GFXDECODE(config, "gfxdecode", m_palette, gfx_itgambl2);
PALETTE(config, m_palette, FUNC(itgambl2_state::itgambl2_palette), 0x200);
@@ -295,7 +295,7 @@ MACHINE_CONFIG_START(itgambl2_state::itgambl2)
// sound hardware
SPEAKER(config, "mono").front_center();
UPD7759(config, "upd").add_route(ALL_OUTPUTS, "mono", 0.50);
-MACHINE_CONFIG_END
+}
/*************************
diff --git a/src/mame/drivers/itgambl3.cpp b/src/mame/drivers/itgambl3.cpp
index 3f6f25b4cde..894145657f8 100644
--- a/src/mame/drivers/itgambl3.cpp
+++ b/src/mame/drivers/itgambl3.cpp
@@ -266,28 +266,27 @@ void itgambl3_state::itgambl3_palette(palette_device &palette) const
* Machine Drivers *
**************************/
-MACHINE_CONFIG_START(itgambl3_state::itgambl3)
-
+void itgambl3_state::itgambl3(machine_config &config)
+{
// basic machine hardware
- MCFG_DEVICE_ADD("maincpu", H83044, MAIN_CLOCK) // wrong CPU, but we have not a M16C core ATM
- MCFG_DEVICE_PROGRAM_MAP(itgambl3_map)
+ H83044(config, m_maincpu, MAIN_CLOCK); // wrong CPU, but we have not a M16C core ATM
+ m_maincpu->set_addrmap(AS_PROGRAM, &itgambl3_state::itgambl3_map);
// video hardware
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(512, 256)
- MCFG_SCREEN_VISIBLE_AREA(0, 512-1, 0, 256-1)
- MCFG_SCREEN_UPDATE_DRIVER(itgambl3_state, screen_update_itgambl3)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(512, 256);
+ screen.set_visarea(0, 512-1, 0, 256-1);
+ screen.set_screen_update(FUNC(itgambl3_state::screen_update_itgambl3));
GFXDECODE(config, "gfxdecode", m_palette, gfx_itgambl3);
PALETTE(config, m_palette, FUNC(itgambl3_state::itgambl3_palette), 0x200);
// sound hardware
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("oki", OKIM6295, MAIN_CLOCK/16, okim6295_device::PIN7_HIGH) // 1MHz
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
-MACHINE_CONFIG_END
+ OKIM6295(config, "oki", MAIN_CLOCK/16, okim6295_device::PIN7_HIGH).add_route(ALL_OUTPUTS, "mono", 1.0); // 1MHz
+}
/*************************
diff --git a/src/mame/drivers/itt3030.cpp b/src/mame/drivers/itt3030.cpp
index 39cb7bb5e89..82721cdf0f9 100644
--- a/src/mame/drivers/itt3030.cpp
+++ b/src/mame/drivers/itt3030.cpp
@@ -695,12 +695,12 @@ void itt3030_state::machine_reset()
m_curfloppy = nullptr;
}
-MACHINE_CONFIG_START(itt3030_state::itt3030)
-
+void itt3030_state::itt3030(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, 4_MHz_XTAL)
- MCFG_DEVICE_PROGRAM_MAP(itt3030_map)
- MCFG_DEVICE_IO_MAP(itt3030_io)
+ Z80(config, m_maincpu, 4_MHz_XTAL);
+ m_maincpu->set_addrmap(AS_PROGRAM, &itt3030_state::itt3030_map);
+ m_maincpu->set_addrmap(AS_IO, &itt3030_state::itt3030_io);
// Schematics + i8278 datasheet says:
// Port 1 goes to the keyboard matrix.
@@ -714,13 +714,13 @@ MACHINE_CONFIG_START(itt3030_state::itt3030)
m_kbdmcu->p2_out_cb().set(FUNC(itt3030_state::kbd_port2_w));
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(250))
- MCFG_SCREEN_UPDATE_DRIVER(itt3030_state, screen_update)
- MCFG_SCREEN_SIZE(80*8, 24*12)
- MCFG_SCREEN_VISIBLE_AREA(0, 80*8-1, 0, 24*12-1)
- MCFG_SCREEN_PALETTE(m_palette)
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_refresh_hz(60);
+ m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(250));
+ m_screen->set_screen_update(FUNC(itt3030_state::screen_update));
+ m_screen->set_size(80*8, 24*12);
+ m_screen->set_visarea(0, 80*8-1, 0, 24*12-1);
+ m_screen->set_palette(m_palette);
/* devices */
ADDRESS_MAP_BANK(config, "lowerbank").set_map(&itt3030_state::lower48_map).set_options(ENDIANNESS_LITTLE, 8, 20, 0xc000);
@@ -731,9 +731,9 @@ MACHINE_CONFIG_START(itt3030_state::itt3030)
m_fdc->intrq_wr_callback().set(FUNC(itt3030_state::fdcirq_w));
m_fdc->drq_wr_callback().set(FUNC(itt3030_state::fdcdrq_w));
m_fdc->hld_wr_callback().set(FUNC(itt3030_state::fdchld_w));
- MCFG_FLOPPY_DRIVE_ADD("fdc:0", itt3030_floppies, "525qd", itt3030_state::itt3030_floppy_formats)
- MCFG_FLOPPY_DRIVE_ADD("fdc:1", itt3030_floppies, "525qd", itt3030_state::itt3030_floppy_formats)
- MCFG_FLOPPY_DRIVE_ADD("fdc:2", itt3030_floppies, "525qd", itt3030_state::itt3030_floppy_formats)
+ FLOPPY_CONNECTOR(config, "fdc:0", itt3030_floppies, "525qd", itt3030_state::itt3030_floppy_formats);
+ FLOPPY_CONNECTOR(config, "fdc:1", itt3030_floppies, "525qd", itt3030_state::itt3030_floppy_formats);
+ FLOPPY_CONNECTOR(config, "fdc:2", itt3030_floppies, "525qd", itt3030_state::itt3030_floppy_formats);
GFXDECODE(config, m_gfxdecode, m_palette, gfx_itt3030);
@@ -745,7 +745,7 @@ MACHINE_CONFIG_START(itt3030_state::itt3030)
/* sound hardware */
SPEAKER(config, "mono").front_center();
BEEP(config, m_beep, 3250).add_route(ALL_OUTPUTS, "mono", 1.00);
-MACHINE_CONFIG_END
+}
//**************************************************************************
diff --git a/src/mame/drivers/jack.cpp b/src/mame/drivers/jack.cpp
index 5aaa0d113ad..8e88f0c8440 100644
--- a/src/mame/drivers/jack.cpp
+++ b/src/mame/drivers/jack.cpp
@@ -910,29 +910,28 @@ MACHINE_RESET_MEMBER(jack_state,joinem)
/***************************************************************/
-MACHINE_CONFIG_START(jack_state::jack)
-
+void jack_state::jack(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, XTAL(18'000'000)/6)
- MCFG_DEVICE_PROGRAM_MAP(jack_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", jack_state, irq0_line_hold)
+ Z80(config, m_maincpu, XTAL(18'000'000)/6);
+ m_maincpu->set_addrmap(AS_PROGRAM, &jack_state::jack_map);
+ m_maincpu->set_vblank_int("screen", FUNC(jack_state::irq0_line_hold));
- MCFG_DEVICE_ADD("audiocpu", Z80, XTAL(18'000'000)/6)
- MCFG_DEVICE_PROGRAM_MAP(sound_map)
- MCFG_DEVICE_IO_MAP(sound_io_map)
- MCFG_DEVICE_IRQ_ACKNOWLEDGE_DRIVER(jack_state, jack_sh_irq_ack)
+ Z80(config, m_audiocpu, XTAL(18'000'000)/6);
+ m_audiocpu->set_addrmap(AS_PROGRAM, &jack_state::sound_map);
+ m_audiocpu->set_addrmap(AS_IO, &jack_state::sound_io_map);
+ m_audiocpu->set_irq_acknowledge_callback(FUNC(jack_state::jack_sh_irq_ack));
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(32*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(jack_state, screen_update_jack)
- MCFG_SCREEN_PALETTE(m_palette)
-
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, m_palette, gfx_jack)
-
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(32*8, 32*8);
+ screen.set_visarea(0*8, 32*8-1, 2*8, 30*8-1);
+ screen.set_screen_update(FUNC(jack_state::screen_update_jack));
+ screen.set_palette(m_palette);
+
+ GFXDECODE(config, m_gfxdecode, m_palette, gfx_jack);
PALETTE(config, m_palette).set_format(palette_device::BGR_233_inverted, 32);
/* sound hardware */
@@ -945,29 +944,28 @@ MACHINE_CONFIG_START(jack_state::jack)
aysnd.port_a_read_callback().set(m_soundlatch, FUNC(generic_latch_8_device::read));
aysnd.port_b_read_callback().set(FUNC(jack_state::timer_r));
aysnd.add_route(ALL_OUTPUTS, "mono", 1.0);
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(jack_state::treahunt)
+void jack_state::treahunt(machine_config &config)
+{
jack(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_OPCODES_MAP(decrypted_opcodes_map)
-MACHINE_CONFIG_END
+ m_maincpu->set_addrmap(AS_OPCODES, &jack_state::decrypted_opcodes_map);
+}
-MACHINE_CONFIG_START(jack_state::striv)
+void jack_state::striv(machine_config &config)
+{
jack(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(striv_map)
+ m_maincpu->set_addrmap(AS_PROGRAM, &jack_state::striv_map);
MCFG_MACHINE_START_OVERRIDE(jack_state,striv)
MCFG_MACHINE_RESET_OVERRIDE(jack_state,striv)
/* video hardware */
- MCFG_SCREEN_MODIFY("screen")
- MCFG_SCREEN_UPDATE_DRIVER(jack_state, screen_update_striv)
-MACHINE_CONFIG_END
+ subdevice<screen_device>("screen")->set_screen_update(FUNC(jack_state::screen_update_striv));
+}
/***************************************************************/
@@ -978,43 +976,41 @@ INTERRUPT_GEN_MEMBER(jack_state::joinem_vblank_irq)
device.execute().pulse_input_line(INPUT_LINE_NMI, attotime::zero);
}
-MACHINE_CONFIG_START(jack_state::joinem)
+void jack_state::joinem(machine_config &config)
+{
jack(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(joinem_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", jack_state, joinem_vblank_irq)
- MCFG_DEVICE_PERIODIC_INT_DRIVER(jack_state, irq0_line_hold, 250) // ??? controls game speed
+ m_maincpu->set_addrmap(AS_PROGRAM, &jack_state::joinem_map);
+ m_maincpu->set_vblank_int("screen", FUNC(jack_state::joinem_vblank_irq));
+ m_maincpu->set_periodic_int(FUNC(jack_state::irq0_line_hold), attotime::from_hz(250)); // ??? controls game speed
MCFG_MACHINE_START_OVERRIDE(jack_state,joinem)
MCFG_MACHINE_RESET_OVERRIDE(jack_state,joinem)
/* video hardware */
- MCFG_SCREEN_MODIFY("screen")
- MCFG_SCREEN_UPDATE_DRIVER(jack_state, screen_update_joinem)
+ subdevice<screen_device>("screen")->set_screen_update(FUNC(jack_state::screen_update_joinem));
- MCFG_GFXDECODE_MODIFY("gfxdecode", gfx_joinem)
+ m_gfxdecode->set_info(gfx_joinem);
PALETTE(config.replace(), m_palette, FUNC(jack_state::joinem_palette), 64);
MCFG_VIDEO_START_OVERRIDE(jack_state,joinem)
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(jack_state::unclepoo)
+void jack_state::unclepoo(machine_config &config)
+{
joinem(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(unclepoo_map)
+ m_maincpu->set_addrmap(AS_PROGRAM, &jack_state::unclepoo_map);
/* video hardware */
- MCFG_SCREEN_MODIFY("screen")
- MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 1*8, 31*8-1)
+ subdevice<screen_device>("screen")->set_visarea(0*8, 32*8-1, 1*8, 31*8-1);
m_palette->set_entries(256);
-MACHINE_CONFIG_END
+}
diff --git a/src/mame/drivers/jackal.cpp b/src/mame/drivers/jackal.cpp
index 0e8b8480cbc..7b1cbfb2ce1 100644
--- a/src/mame/drivers/jackal.cpp
+++ b/src/mame/drivers/jackal.cpp
@@ -357,28 +357,28 @@ void jackal_state::machine_reset()
m_irq_enable = 0;
}
-MACHINE_CONFIG_START(jackal_state::jackal)
-
+void jackal_state::jackal(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("master", MC6809E, MASTER_CLOCK/12) // verified on pcb
- MCFG_DEVICE_PROGRAM_MAP(master_map)
+ MC6809E(config, m_mastercpu, MASTER_CLOCK/12); // verified on pcb
+ m_mastercpu->set_addrmap(AS_PROGRAM, &jackal_state::master_map);
- MCFG_DEVICE_ADD("slave", MC6809E, MASTER_CLOCK/12) // verified on pcb
- MCFG_DEVICE_PROGRAM_MAP(slave_map)
+ MC6809E(config, m_slavecpu, MASTER_CLOCK/12); // verified on pcb
+ m_slavecpu->set_addrmap(AS_PROGRAM, &jackal_state::slave_map);
- MCFG_QUANTUM_TIME(attotime::from_hz(6000))
+ config.m_minimum_quantum = attotime::from_hz(6000);
WATCHDOG_TIMER(config, "watchdog");
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(32*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(1*8, 31*8-1, 2*8, 30*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(jackal_state, screen_update_jackal)
- MCFG_SCREEN_PALETTE("palette")
- MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE(*this, jackal_state, vblank_irq))
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(32*8, 32*8);
+ screen.set_visarea(1*8, 31*8-1, 2*8, 30*8-1);
+ screen.set_screen_update(FUNC(jackal_state::screen_update_jackal));
+ screen.set_palette(m_palette);
+ screen.screen_vblank().set(FUNC(jackal_state::vblank_irq));
GFXDECODE(config, m_gfxdecode, m_palette, gfx_jackal);
PALETTE(config, m_palette, FUNC(jackal_state::jackal_palette));
@@ -390,7 +390,7 @@ MACHINE_CONFIG_START(jackal_state::jackal)
SPEAKER(config, "rspeaker").front_right();
YM2151(config, "ymsnd", SOUND_CLOCK).add_route(0, "lspeaker", 0.50).add_route(1, "rspeaker", 0.50); // verified on pcb
-MACHINE_CONFIG_END
+}
/*************************************
*
diff --git a/src/mame/drivers/jackpool.cpp b/src/mame/drivers/jackpool.cpp
index 4b8800b9a16..2946a84c8ab 100644
--- a/src/mame/drivers/jackpool.cpp
+++ b/src/mame/drivers/jackpool.cpp
@@ -233,20 +233,21 @@ INTERRUPT_GEN_MEMBER(jackpool_state::jackpool_interrupt)
}
-MACHINE_CONFIG_START(jackpool_state::jackpool)
- MCFG_DEVICE_ADD("maincpu", M68000, 12000000) // ?
- MCFG_DEVICE_PROGRAM_MAP(jackpool_mem)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", jackpool_state, jackpool_interrupt) // ?
+void jackpool_state::jackpool(machine_config &config)
+{
+ M68000(config, m_maincpu, 12000000); // ?
+ m_maincpu->set_addrmap(AS_PROGRAM, &jackpool_state::jackpool_mem);
+ m_maincpu->set_vblank_int("screen", FUNC(jackpool_state::jackpool_interrupt)); // ?
GFXDECODE(config, m_gfxdecode, m_palette, gfx_jackpool);
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500))
- MCFG_SCREEN_SIZE(64*8, 64*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 64*8-1, 0*8, 32*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(jackpool_state, screen_update_jackpool)
- MCFG_SCREEN_PALETTE("palette")
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500));
+ screen.set_size(64*8, 64*8);
+ screen.set_visarea(0*8, 64*8-1, 0*8, 32*8-1);
+ screen.set_screen_update(FUNC(jackpool_state::screen_update_jackpool));
+ screen.set_palette(m_palette);
ls259_device &latch1(LS259(config, "latch1"));
latch1.q_out_cb<0>().set_nop(); // HOLD3 lamp
@@ -277,9 +278,8 @@ MACHINE_CONFIG_START(jackpool_state::jackpool)
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("oki", OKIM6295, 1056000, okim6295_device::PIN7_HIGH) // clock frequency & pin 7 not verified
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
-MACHINE_CONFIG_END
+ OKIM6295(config, "oki", 1056000, okim6295_device::PIN7_HIGH).add_route(ALL_OUTPUTS, "mono", 1.0); // clock frequency & pin 7 not verified
+}
ROM_START( jackpool )
diff --git a/src/mame/drivers/jaguar.cpp b/src/mame/drivers/jaguar.cpp
index 802d1684d57..b7d7a0473f5 100644
--- a/src/mame/drivers/jaguar.cpp
+++ b/src/mame/drivers/jaguar.cpp
@@ -1855,7 +1855,6 @@ void jaguar_state::cojagr3k(machine_config &config)
DAC_16BIT_R2R_TWOS_COMPLEMENT(config, m_ldac, 0).add_route(ALL_OUTPUTS, "lspeaker", 1.0); // unknown DAC
DAC_16BIT_R2R_TWOS_COMPLEMENT(config, m_rdac, 0).add_route(ALL_OUTPUTS, "rspeaker", 1.0); // unknown DAC
voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref", 0));
- vref.set_output(5.0);
vref.add_route(0, "ldac", 1.0, DAC_VREF_POS_INPUT);
vref.add_route(0, "ldac", -1.0, DAC_VREF_NEG_INPUT);
vref.add_route(0, "rdac", 1.0, DAC_VREF_POS_INPUT);
@@ -1911,15 +1910,14 @@ void jaguar_state::jaguar(machine_config &config)
DAC_16BIT_R2R_TWOS_COMPLEMENT(config, m_ldac, 0).add_route(ALL_OUTPUTS, "lspeaker", 1.0); // unknown DAC
DAC_16BIT_R2R_TWOS_COMPLEMENT(config, m_rdac, 0).add_route(ALL_OUTPUTS, "rspeaker", 1.0); // unknown DAC
voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref", 0));
- vref.set_output(5.0);
vref.add_route(0, "ldac", 1.0, DAC_VREF_POS_INPUT);
vref.add_route(0, "ldac", -1.0, DAC_VREF_NEG_INPUT);
vref.add_route(0, "rdac", 1.0, DAC_VREF_POS_INPUT);
vref.add_route(0, "rdac", -1.0, DAC_VREF_NEG_INPUT);
/* quickload */
- quickload_image_device &quickload(QUICKLOAD(config, "quickload", 0));
- quickload.set_handler(snapquick_load_delegate(&QUICKLOAD_LOAD_NAME(jaguar_state, jaguar), this), "abs,bin,cof,jag,prg", 0);
+ quickload_image_device &quickload(QUICKLOAD(config, "quickload"));
+ quickload.set_handler(snapquick_load_delegate(&QUICKLOAD_LOAD_NAME(jaguar_state, jaguar), this), "abs,bin,cof,jag,prg");
/* cartridge */
generic_cartslot_device &cartslot(GENERIC_CARTSLOT(config, "cartslot", generic_plain_slot, "jaguar_cart", "j64,rom,bin"));
diff --git a/src/mame/drivers/jailbrek.cpp b/src/mame/drivers/jailbrek.cpp
index d4529239329..9f99ca04ff3 100644
--- a/src/mame/drivers/jailbrek.cpp
+++ b/src/mame/drivers/jailbrek.cpp
@@ -150,7 +150,7 @@ void jailbrek_state::jailbrek_map(address_map &map)
map(0x2043, 0x2043).nopw(); /* ??? */
map(0x2044, 0x2044).w(FUNC(jailbrek_state::ctrl_w)); /* irq, nmi enable, screen flip */
map(0x3000, 0x3000).w(FUNC(jailbrek_state::coin_w));
- map(0x3100, 0x3100).portr("DSW2").w("snsnd", FUNC(sn76489a_device::command_w));
+ map(0x3100, 0x3100).portr("DSW2").w("snsnd", FUNC(sn76489a_device::write));
map(0x3200, 0x3200).portr("DSW3").nopw(); /* mirror of the previous? */
map(0x3300, 0x3300).portr("SYSTEM").w("watchdog", FUNC(watchdog_timer_device::reset_w));
map(0x3301, 0x3301).portr("P1");
@@ -261,12 +261,12 @@ void jailbrek_state::machine_reset()
m_nmi_enable = 0;
}
-MACHINE_CONFIG_START(jailbrek_state::jailbrek)
-
+void jailbrek_state::jailbrek(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", KONAMI1, MASTER_CLOCK/12)
- MCFG_DEVICE_PROGRAM_MAP(jailbrek_map)
- MCFG_DEVICE_PERIODIC_INT_DRIVER(jailbrek_state, interrupt_nmi, 500) /* ? */
+ KONAMI1(config, m_maincpu, MASTER_CLOCK/12);
+ m_maincpu->set_addrmap(AS_PROGRAM, &jailbrek_state::jailbrek_map);
+ m_maincpu->set_periodic_int(FUNC(jailbrek_state::interrupt_nmi), attotime::from_hz(500)); /* ? */
WATCHDOG_TIMER(config, "watchdog");
@@ -274,22 +274,21 @@ MACHINE_CONFIG_START(jailbrek_state::jailbrek)
GFXDECODE(config, m_gfxdecode, m_palette, gfx_jailbrek);
PALETTE(config, m_palette, FUNC(jailbrek_state::jailbrek_palette), 512, 32);
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_RAW_PARAMS(MASTER_CLOCK/3, 396, 8, 248, 256, 16, 240)
- MCFG_SCREEN_UPDATE_DRIVER(jailbrek_state, screen_update)
- MCFG_SCREEN_PALETTE(m_palette)
- MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE(*this, jailbrek_state, vblank_irq))
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_raw(MASTER_CLOCK/3, 396, 8, 248, 256, 16, 240);
+ screen.set_screen_update(FUNC(jailbrek_state::screen_update));
+ screen.set_palette(m_palette);
+ screen.screen_vblank().set(FUNC(jailbrek_state::vblank_irq));
/* sound hardware */
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("snsnd", SN76489A, MASTER_CLOCK/12)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
+ SN76489A(config, "snsnd", MASTER_CLOCK/12).add_route(ALL_OUTPUTS, "mono", 1.0);
- MCFG_DEVICE_ADD("vlm", VLM5030, VOICE_CLOCK)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
- MCFG_DEVICE_ADDRESS_MAP(0, vlm_map)
-MACHINE_CONFIG_END
+ VLM5030(config, m_vlm, VOICE_CLOCK);
+ m_vlm->add_route(ALL_OUTPUTS, "mono", 1.0);
+ m_vlm->set_addrmap(0, &jailbrek_state::vlm_map);
+}
/***************************************************************************
diff --git a/src/mame/drivers/jalmah.cpp b/src/mame/drivers/jalmah.cpp
index 64d63283345..02bad953018 100644
--- a/src/mame/drivers/jalmah.cpp
+++ b/src/mame/drivers/jalmah.cpp
@@ -123,10 +123,10 @@ class jalmah_state : public driver_device
public:
jalmah_state(const machine_config &mconfig, device_type type, const char *tag) :
driver_device(mconfig, type, tag),
+ m_maincpu(*this, "maincpu"),
m_palette(*this, "palette"),
m_tmap(*this, "scroll%u", 0),
m_sharedram(*this, "sharedram"),
- m_maincpu(*this, "maincpu"),
m_prirom(*this, "prirom"),
m_p1_key_io(*this, "P1_KEY%u", 0U),
m_p2_key_io(*this, "P2_KEY%u", 0U),
@@ -170,6 +170,7 @@ protected:
virtual void machine_reset() override;
virtual void video_start() override;
+ required_device<cpu_device> m_maincpu;
required_device<palette_device> m_palette;
optional_device_array<megasys1_tilemap_device, 4> m_tmap;
@@ -179,7 +180,6 @@ protected:
private:
required_shared_ptr<uint16_t> m_sharedram;
- required_device<cpu_device> m_maincpu;
optional_region_ptr<uint8_t> m_prirom;
required_ioport_array<3> m_p1_key_io;
optional_ioport_array<3> m_p2_key_io;
@@ -1086,10 +1086,11 @@ void urashima_state::machine_reset()
mcu_check_test_mode();
}
-MACHINE_CONFIG_START(jalmah_state::jalmah)
- MCFG_DEVICE_ADD("maincpu" , M68000, 12000000/2) // assume same as Mega System 1
- MCFG_DEVICE_PROGRAM_MAP(jalmah_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", jalmah_state, irq2_line_hold)
+void jalmah_state::jalmah(machine_config &config)
+{
+ M68000(config, m_maincpu, 12000000/2); // assume same as Mega System 1
+ m_maincpu->set_addrmap(AS_PROGRAM, &jalmah_state::jalmah_map);
+ m_maincpu->set_vblank_int("screen", FUNC(jalmah_state::irq2_line_hold));
//M50747 MCU
@@ -1098,20 +1099,20 @@ MACHINE_CONFIG_START(jalmah_state::jalmah)
MEGASYS1_TILEMAP(config, m_tmap[2], m_palette, 0x0200);
MEGASYS1_TILEMAP(config, m_tmap[3], m_palette, 0x0300);
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_RAW_PARAMS(12000000/2,406,0,256,263,16,240) // assume same as nmk16 & mega system 1
- MCFG_SCREEN_UPDATE_DRIVER(jalmah_state, screen_update_jalmah)
- MCFG_SCREEN_PALETTE(m_palette)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_raw(12000000/2,406,0,256,263,16,240); // assume same as nmk16 & mega system 1
+ screen.set_screen_update(FUNC(jalmah_state::screen_update_jalmah));
+ screen.set_palette(m_palette);
PALETTE(config, m_palette).set_format(palette_device::RRRRGGGGBBBBRGBx, 0x400);
- MCFG_TIMER_DRIVER_ADD_PERIODIC("mcusim", jalmah_state, mcu_sim, attotime::from_hz(10000))
+ TIMER(config, "mcusim").configure_periodic(FUNC(jalmah_state::mcu_sim), attotime::from_hz(10000));
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("oki", OKIM6295, 4000000, okim6295_device::PIN7_LOW)
- MCFG_DEVICE_ADDRESS_MAP(0, oki_map)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.5)
-MACHINE_CONFIG_END
+ okim6295_device &oki(OKIM6295(config, "oki", 4000000, okim6295_device::PIN7_LOW));
+ oki.set_addrmap(0, &jalmah_state::oki_map);
+ oki.add_route(ALL_OUTPUTS, "mono", 0.5);
+}
static const gfx_layout charlayout =
{
@@ -1144,18 +1145,18 @@ static GFXDECODE_START( gfx_urashima )
GFXDECODE_ENTRY( "scroll3", 0, charlayout, 0x000, 16 )
GFXDECODE_END
-MACHINE_CONFIG_START(jalmah_state::jalmahv1)
+void jalmah_state::jalmahv1(machine_config &config)
+{
jalmah(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(jalmahv1_map)
-MACHINE_CONFIG_END
+ m_maincpu->set_addrmap(AS_PROGRAM, &jalmah_state::jalmahv1_map);
+}
-MACHINE_CONFIG_START(urashima_state::urashima)
+void urashima_state::urashima(machine_config &config)
+{
jalmah(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(urashima_map)
+ m_maincpu->set_addrmap(AS_PROGRAM, &urashima_state::urashima_map);
// Urashima seems to use an earlier version of the Jaleco tilemaps (without range etc.)
// and with per-scanline video registers
@@ -1164,11 +1165,10 @@ MACHINE_CONFIG_START(urashima_state::urashima)
config.device_remove("scroll2");
config.device_remove("scroll3");
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_urashima)
+ GFXDECODE(config, "gfxdecode", m_palette, gfx_urashima);
- MCFG_SCREEN_MODIFY("screen")
- MCFG_SCREEN_UPDATE_DRIVER(urashima_state, screen_update_urashima)
-MACHINE_CONFIG_END
+ subdevice<screen_device>("screen")->set_screen_update(FUNC(urashima_state::screen_update_urashima));
+}
// fake ROM containing 68k snippets
// the original MCU actually uploads these into shared work ram area
diff --git a/src/mame/drivers/jangou.cpp b/src/mame/drivers/jangou.cpp
index 1bc6fb59389..f35b4a257f1 100644
--- a/src/mame/drivers/jangou.cpp
+++ b/src/mame/drivers/jangou.cpp
@@ -164,18 +164,18 @@ void jangou_state::jangou_palette(palette_device &palette) const
bit0 = BIT(color_prom[i], 0);
bit1 = BIT(color_prom[i], 1);
bit2 = BIT(color_prom[i], 2);
- int const r = combine_3_weights(weights_rg, bit0, bit1, bit2);
+ int const r = combine_weights(weights_rg, bit0, bit1, bit2);
// green component
bit0 = BIT(color_prom[i], 3);
bit1 = BIT(color_prom[i], 4);
bit2 = BIT(color_prom[i], 5);
- int const g = combine_3_weights(weights_rg, bit0, bit1, bit2);
+ int const g = combine_weights(weights_rg, bit0, bit1, bit2);
// blue component
bit0 = BIT(color_prom[i], 6);
bit1 = BIT(color_prom[i], 7);
- int const b = combine_2_weights(weights_b, bit0, bit1);
+ int const b = combine_weights(weights_b, bit0, bit1);
palette.set_pen_color(i, rgb_t(r, g, b));
}
@@ -870,25 +870,25 @@ MACHINE_RESET_MEMBER(jangou_state,jngolady)
}
/* Note: All frequencies and dividers are unverified */
-MACHINE_CONFIG_START(jangou_state::jangou)
-
+void jangou_state::jangou(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("cpu0", Z80, MASTER_CLOCK / 8)
- MCFG_DEVICE_PROGRAM_MAP(cpu0_map)
- MCFG_DEVICE_IO_MAP(cpu0_io)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", jangou_state, irq0_line_hold)
+ Z80(config, m_cpu_0, MASTER_CLOCK / 8);
+ m_cpu_0->set_addrmap(AS_PROGRAM, &jangou_state::cpu0_map);
+ m_cpu_0->set_addrmap(AS_IO, &jangou_state::cpu0_io);
+ m_cpu_0->set_vblank_int("screen", FUNC(jangou_state::irq0_line_hold));
- MCFG_DEVICE_ADD("cpu1", Z80, MASTER_CLOCK / 8)
- MCFG_DEVICE_PROGRAM_MAP(cpu1_map)
- MCFG_DEVICE_IO_MAP(cpu1_io)
+ Z80(config, m_cpu_1, MASTER_CLOCK / 8);
+ m_cpu_1->set_addrmap(AS_PROGRAM, &jangou_state::cpu1_map);
+ m_cpu_1->set_addrmap(AS_IO, &jangou_state::cpu1_io);
- MCFG_JANGOU_BLITTER_ADD("blitter", MASTER_CLOCK/4)
+ JANGOU_BLITTER(config, "blitter", MASTER_CLOCK/4);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_RAW_PARAMS(MASTER_CLOCK/4,320,0,256,264,16,240) // assume same as nightgal.cpp
- MCFG_SCREEN_UPDATE_DRIVER(jangou_state, screen_update_jangou)
- MCFG_SCREEN_PALETTE(m_palette)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_raw(MASTER_CLOCK/4,320,0,256,264,16,240); // assume same as nightgal.cpp
+ screen.set_screen_update(FUNC(jangou_state::screen_update_jangou));
+ screen.set_palette(m_palette);
PALETTE(config, m_palette, FUNC(jangou_state::jangou_palette), 32);
@@ -902,66 +902,62 @@ MACHINE_CONFIG_START(jangou_state::jangou)
aysnd.port_b_read_callback().set(FUNC(jangou_state::input_system_r));
aysnd.add_route(ALL_OUTPUTS, "mono", 0.40);
- MCFG_DEVICE_ADD("cvsd", HC55516, MASTER_CLOCK / 1024)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.60)
-MACHINE_CONFIG_END
+ HC55516(config, m_cvsd, MASTER_CLOCK / 1024);
+ m_cvsd->add_route(ALL_OUTPUTS, "mono", 0.60);
+}
-MACHINE_CONFIG_START(jangou_state::jngolady)
+void jangou_state::jngolady(machine_config &config)
+{
jangou(config);
/* basic machine hardware */
+ m_cpu_0->set_addrmap(AS_PROGRAM, &jangou_state::jngolady_cpu0_map);
- MCFG_DEVICE_MODIFY("cpu0")
- MCFG_DEVICE_PROGRAM_MAP(jngolady_cpu0_map)
-
- MCFG_DEVICE_MODIFY("cpu1")
- MCFG_DEVICE_PROGRAM_MAP(jngolady_cpu1_map)
- MCFG_DEVICE_IO_MAP(jngolady_cpu1_io)
+ m_cpu_1->set_addrmap(AS_PROGRAM, &jangou_state::jngolady_cpu1_map);
+ m_cpu_1->set_addrmap(AS_IO, &jangou_state::jngolady_cpu1_io);
- MCFG_DEVICE_ADD("nsc", NSC8105, MASTER_CLOCK / 8)
- MCFG_DEVICE_PROGRAM_MAP(nsc_map)
+ NSC8105(config, m_nsc, MASTER_CLOCK / 8);
+ m_nsc->set_addrmap(AS_PROGRAM, &jangou_state::nsc_map);
MCFG_MACHINE_START_OVERRIDE(jangou_state,jngolady)
MCFG_MACHINE_RESET_OVERRIDE(jangou_state,jngolady)
/* sound hardware */
- MCFG_DEVICE_REMOVE("cvsd")
+ config.device_remove("cvsd");
- MCFG_DEVICE_ADD("msm", MSM5205, XTAL(400'000))
- MCFG_MSM5205_VCLK_CB(WRITELINE(*this, jangou_state, jngolady_vclk_cb))
- MCFG_MSM5205_PRESCALER_SELECTOR(S96_4B)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.80)
-MACHINE_CONFIG_END
+ MSM5205(config, m_msm, XTAL(400'000));
+ m_msm->vck_legacy_callback().set(FUNC(jangou_state::jngolady_vclk_cb));
+ m_msm->set_prescaler_selector(msm5205_device::S96_4B);
+ m_msm->add_route(ALL_OUTPUTS, "mono", 0.80);
+}
-MACHINE_CONFIG_START(jangou_state::cntrygrl)
+void jangou_state::cntrygrl(machine_config &config)
+{
jangou(config);
/* basic machine hardware */
+ m_cpu_0->set_addrmap(AS_PROGRAM, &jangou_state::cntrygrl_cpu0_map);
+ m_cpu_0->set_addrmap(AS_IO, &jangou_state::cntrygrl_cpu0_io);
- MCFG_DEVICE_MODIFY("cpu0")
- MCFG_DEVICE_PROGRAM_MAP(cntrygrl_cpu0_map )
- MCFG_DEVICE_IO_MAP(cntrygrl_cpu0_io )
-
- MCFG_DEVICE_REMOVE("cpu1")
+ config.device_remove("cpu1");
MCFG_MACHINE_START_OVERRIDE(jangou_state,common)
MCFG_MACHINE_RESET_OVERRIDE(jangou_state,common)
/* sound hardware */
- MCFG_DEVICE_REMOVE("cvsd")
- MCFG_DEVICE_REMOVE("soundlatch")
-MACHINE_CONFIG_END
+ config.device_remove("cvsd");
+ config.device_remove("soundlatch");
+}
-MACHINE_CONFIG_START(jangou_state::roylcrdn)
+void jangou_state::roylcrdn(machine_config &config)
+{
jangou(config);
/* basic machine hardware */
+ m_cpu_0->set_addrmap(AS_PROGRAM, &jangou_state::roylcrdn_cpu0_map);
+ m_cpu_0->set_addrmap(AS_IO, &jangou_state::roylcrdn_cpu0_io);
- MCFG_DEVICE_MODIFY("cpu0")
- MCFG_DEVICE_PROGRAM_MAP(roylcrdn_cpu0_map )
- MCFG_DEVICE_IO_MAP(roylcrdn_cpu0_io )
-
- MCFG_DEVICE_REMOVE("cpu1")
+ config.device_remove("cpu1");
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
@@ -969,9 +965,9 @@ MACHINE_CONFIG_START(jangou_state::roylcrdn)
MCFG_MACHINE_RESET_OVERRIDE(jangou_state,common)
/* sound hardware */
- MCFG_DEVICE_REMOVE("cvsd")
- MCFG_DEVICE_REMOVE("soundlatch")
-MACHINE_CONFIG_END
+ config.device_remove("cvsd");
+ config.device_remove("soundlatch");
+}
/*************************************
diff --git a/src/mame/drivers/jankenmn.cpp b/src/mame/drivers/jankenmn.cpp
index 9f836a121d0..4f722610c3e 100644
--- a/src/mame/drivers/jankenmn.cpp
+++ b/src/mame/drivers/jankenmn.cpp
@@ -383,7 +383,8 @@ static const z80_daisy_config daisy_chain[] =
* Machine Config *
*********************************************/
-MACHINE_CONFIG_START(jankenmn_state::jankenmn)
+void jankenmn_state::jankenmn(machine_config &config)
+{
/* basic machine hardware */
Z80(config, m_maincpu, MASTER_CLOCK); /* 2.5 MHz */
m_maincpu->set_daisy_config(daisy_chain);
@@ -410,10 +411,11 @@ MACHINE_CONFIG_START(jankenmn_state::jankenmn)
/* sound hardware */
SPEAKER(config, "speaker").front_center();
- MCFG_DEVICE_ADD("dac", AD7523, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 0.5)
- MCFG_DEVICE_ADD("vref", VOLTAGE_REGULATOR, 0) MCFG_VOLTAGE_REGULATOR_OUTPUT(5.0)
- MCFG_SOUND_ROUTE(0, "dac", 1.0, DAC_VREF_POS_INPUT) MCFG_SOUND_ROUTE(0, "dac", -1.0, DAC_VREF_NEG_INPUT)
-MACHINE_CONFIG_END
+ AD7523(config, "dac", 0).add_route(ALL_OUTPUTS, "speaker", 0.5);
+ voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref"));
+ vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT);
+ vref.add_route(0, "dac", -1.0, DAC_VREF_NEG_INPUT);
+}
/*********************************************
diff --git a/src/mame/drivers/jantotsu.cpp b/src/mame/drivers/jantotsu.cpp
index 95ab9ddb4f9..92bf725bbad 100644
--- a/src/mame/drivers/jantotsu.cpp
+++ b/src/mame/drivers/jantotsu.cpp
@@ -348,8 +348,8 @@ void jantotsu_state::jantotsu_map(address_map &map)
void jantotsu_state::jantotsu_io(address_map &map)
{
map.global_mask(0xff);
- map(0x00, 0x00).portr("DSW1").w("sn1", FUNC(sn76489a_device::command_w));
- map(0x01, 0x01).r(FUNC(jantotsu_state::jantotsu_dsw2_r)).w("sn2", FUNC(sn76489a_device::command_w));
+ map(0x00, 0x00).portr("DSW1").w("sn1", FUNC(sn76489a_device::write));
+ map(0x01, 0x01).r(FUNC(jantotsu_state::jantotsu_dsw2_r)).w("sn2", FUNC(sn76489a_device::write));
map(0x02, 0x03).w(FUNC(jantotsu_state::jan_adpcm_w));
map(0x04, 0x04).rw(FUNC(jantotsu_state::jantotsu_mux_r), FUNC(jantotsu_state::jantotsu_mux_w));
map(0x07, 0x07).w(FUNC(jantotsu_state::bankaddr_w));
@@ -503,38 +503,35 @@ void jantotsu_state::machine_reset()
m_adpcm_trigger = 0;
}
-MACHINE_CONFIG_START(jantotsu_state::jantotsu)
-
+void jantotsu_state::jantotsu(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80,MAIN_CLOCK/4)
- MCFG_DEVICE_PROGRAM_MAP(jantotsu_map)
- MCFG_DEVICE_IO_MAP(jantotsu_io)
+ Z80(config, m_maincpu, MAIN_CLOCK/4);
+ m_maincpu->set_addrmap(AS_PROGRAM, &jantotsu_state::jantotsu_map);
+ m_maincpu->set_addrmap(AS_IO, &jantotsu_state::jantotsu_io);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) //not accurate
- MCFG_SCREEN_SIZE(256, 256)
- MCFG_SCREEN_VISIBLE_AREA(0, 256-1, 16, 240-1)
- MCFG_SCREEN_UPDATE_DRIVER(jantotsu_state, screen_update_jantotsu)
- MCFG_SCREEN_VBLANK_CALLBACK(INPUTLINE("maincpu", INPUT_LINE_NMI))
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500)); //not accurate
+ screen.set_size(256, 256);
+ screen.set_visarea(0, 256-1, 16, 240-1);
+ screen.set_screen_update(FUNC(jantotsu_state::screen_update_jantotsu));
+ screen.screen_vblank().set_inputline(m_maincpu, INPUT_LINE_NMI);
PALETTE(config, m_palette, FUNC(jantotsu_state::jantotsu_palette), 0x20);
/* sound hardware */
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("sn1", SN76489A, MAIN_CLOCK/4)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.50)
+ SN76489A(config, "sn1", MAIN_CLOCK/4).add_route(ALL_OUTPUTS, "mono", 0.50);
+ SN76489A(config, "sn2", MAIN_CLOCK/4).add_route(ALL_OUTPUTS, "mono", 0.50);
- MCFG_DEVICE_ADD("sn2", SN76489A, MAIN_CLOCK/4)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.50)
-
- MCFG_DEVICE_ADD("adpcm", MSM5205, XTAL(384'000))
- MCFG_MSM5205_VCLK_CB(WRITELINE(*this, jantotsu_state, jan_adpcm_int)) /* interrupt function */
- MCFG_MSM5205_PRESCALER_SELECTOR(S64_4B) /* 6 KHz */
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.00)
-MACHINE_CONFIG_END
+ MSM5205(config, m_adpcm, XTAL(384'000));
+ m_adpcm->vck_legacy_callback().set(FUNC(jantotsu_state::jan_adpcm_int)); /* interrupt function */
+ m_adpcm->set_prescaler_selector(msm5205_device::S64_4B); /* 6 KHz */
+ m_adpcm->add_route(ALL_OUTPUTS, "mono", 1.00);
+}
/*************************************
diff --git a/src/mame/drivers/jazz.cpp b/src/mame/drivers/jazz.cpp
index fbf1669a576..2aa45bb5ad9 100644
--- a/src/mame/drivers/jazz.cpp
+++ b/src/mame/drivers/jazz.cpp
@@ -13,7 +13,10 @@
* http://www.sensi.org/~alec/mips/mips-history.html
*
* TODO
- * - everything (skeleton only)
+ * - make it boot Windows NT
+ * - big-endian support for RISC/os
+ * - EISA bus and slots
+ * - slotify and improve graphics board
*
* Unconfirmed parts lists from ARCSystem reference design (which appears to
* be very similar or identical to the Jazz system) taken from:
@@ -69,35 +72,110 @@ void jazz_state::machine_reset()
void jazz_state::init_common()
{
- // map the configured ram
- m_maincpu->space(AS_PROGRAM).install_ram(0, m_ram->mask(), m_ram->pointer());
+ // map the configured ram and vram
+ m_cpu->space(0).install_ram(0x00000000, 0x00000000 | m_ram->mask(), m_ram->pointer());
+ m_cpu->space(0).install_ram(0x40000000, 0x40000000 | m_vram->mask(), m_vram->pointer());
}
void jazz_state::jazz_common_map(address_map &map)
{
map(0x1fc00000, 0x1fc3ffff).r(m_flash, FUNC(amd_28f020_device::read));
- // FIXME: lots of guesswork and assumptions here for now
+ map(0x40000000, 0x407fffff).ram().share("vram"); // local video memory
+ map(0x60000000, 0x6000013f).lr8("video_rom",
+ [](offs_t offset)
+ {
+ /*
+ * Board_Identifier, PROM_Stride, PROM_Width, PROM_Size
+ * 0=JazzVideoG300, 1=JazzVideoG364, 2=JazzVideoVxl, 0x10=MipsVideoG364, 0x11=MaximumJazzVideo (jazzvideog364 osc period == 123077, MipsVideoG364 = 200000)
+ * Test_Byte_0 - Test_Byte_3
+ * VideoMemorySize, VideoControlSize
+ * CodeOffset, CodeSize
+ * ID string
+ */
+ /*
+ static u8 const jazz_g364[] =
+ {
+ 0x01, 0x08, 0x01, 0x20, 'J', 'a', 'z', 'z',
+ 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x20, 0x00,
+ 0x00, 0x02, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00,
+ 'J', 'a', 'z', 'z', ' ', 'G', '3', '6',
+ '4', 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ };
+
+ static u8 const mips_g364[] =
+ {
+ 0x10, 0x08, 0x01, 0x20, 'J', 'a', 'z', 'z',
+ 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x20, 0x00,
+ 0x00, 0x02, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00,
+ 'M', 'i', 'p', 's', ' ', 'G', '3', '6',
+ '4', 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ };
+ */
+
+ static u8 const bogus_g364[] =
+ {
+ 0x10, 0x00, 0x00, 0x00, 'J', 'a', 'z', 'z',
+ 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x20, 0x00,
+ 0x00, 0x02, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00,
+ 'M', 'i', 'p', 's', ' ', 'G', '3', '6',
+ '4', 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ };
+
+ return bogus_g364[offset];
+ }).umask64(0xff);
+
+ map(0x60080000, 0x60081fff).m(m_ramdac, FUNC(g364_device::map)); // local video control
+ map(0x60180000, 0x60180007).lw32("g364_reset", [this](u32 data) { m_ramdac->reset(); });
+
map(0x80000000, 0x80000fff).m(m_mct_adr, FUNC(jazz_mct_adr_device::map));
- map(0x80001000, 0x80001fff).m(m_network, FUNC(dp83932c_device::map));
- //map(0x80002000, 0x80002fff).m(m_scsi, FUNC(ncr5390_device::map)).umask32(0x000000ff);
- map(0x80003000, 0x80003fff).m(m_fdc, FUNC(n82077aa_device::map));
- //map(0x80004000, 0x80004fff).rw(m_rtc, FUNC(mc146818_device::read), FUNC(mc146818_device::write));
- //map(0x80005000, 0x80005fff).m() // keyboard/mouse
- //map(0x80006000, 0x80006fff).m() // serial1
- //map(0x80007000, 0x80007fff).m() // serial2
- //map(0x80008000, 0x80008fff).m() // parallel
- map(0x80009000, 0x80009fff).ram().share("nvram"); // unprotected?
- map(0x8000a000, 0x8000afff).ram().share("nvram"); // protected?
- map(0x8000b000, 0x8000bfff).ram().share("nvram"); // read-only? also sonic IO access?
+
+ map(0x80001000, 0x800010ff).m(m_network, FUNC(dp83932c_device::map)).umask32(0x0000ffff);
+ map(0x80002000, 0x8000200f).m(m_scsi, FUNC(ncr53c94_device::map));
+ map(0x80003000, 0x8000300f).m(m_fdc, FUNC(n82077aa_device::map));
+ map(0x80004000, 0x80004007).lrw8("rtc",
+ [this](offs_t offset) { return m_rtc->read(1); },
+ [this](offs_t offset, u8 data) { m_rtc->write(1, data); }).umask64(0xff);
+ map(0x80005000, 0x80005007).rw(m_kbdc, FUNC(at_keyboard_controller_device::data_r), FUNC(at_keyboard_controller_device::data_w)).umask64(0x00ff);
+ map(0x80005000, 0x80005007).rw(m_kbdc, FUNC(at_keyboard_controller_device::status_r), FUNC(at_keyboard_controller_device::command_w)).umask64(0xff00);
+ map(0x80006000, 0x80006007).rw(m_ace[0], FUNC(ns16550_device::ins8250_r), FUNC(ns16550_device::ins8250_w));
+ map(0x80007000, 0x80007007).rw(m_ace[1], FUNC(ns16550_device::ins8250_r), FUNC(ns16550_device::ins8250_w));
+ map(0x80008000, 0x80008007).rw(m_lpt, FUNC(pc_lpt_device::read), FUNC(pc_lpt_device::write)).umask64(0xffffffff);
+ map(0x80009000, 0x8000afff).ram().share("nvram"); // 9000-9fff unprotected/a000-afff protected?
+ map(0x8000b000, 0x8000b007).lr8("mac", [](offs_t offset)
+ {
+ // mac address and checksum
+ static u8 const mac[] = { 0x00, 0x00, 0x6b, 0x12, 0x34, 0x56, 0x00, 0xf7 };
+
+ return mac[offset];
+ });
+ // 3 4k pages of nvram: read/write, protected, read-only
+ // last page holds ethernet mac and checksum in bytes 0-7
+
//map(0x8000c000, 0x8000cfff) // sound
- map(0x8000d000, 0x8000dfff).noprw(); // dummy dma device?
+ //map(0x8000d000, 0x8000dfff).noprw(); // dummy dma device?
+ map(0x8000d600, 0x8000d607).nopw();
+
+ map(0x8000f000, 0x8000f007).lrw8(
+ "led",
+ [this]() { return m_led; },
+ [this](u8 data)
+ {
+ logerror("led 0x%02x (%s)\n", data, machine().describe_context());
+ m_led = data;
+ }).umask64(0xff);
- map(0x8000f000, 0x8000f001).rw(FUNC(jazz_state::led_r), FUNC(jazz_state::led_w));
+ // lots of byte data written to 800
+ //map(0x800e0000, 0x800fffff).m() // dram config
- //map(0x800e0000, 0x800e0000).rw(FUNC(jazz_state::dram_config_r), FUNC(jazz_state::dram_config_w));
+ map(0x90000000, 0x90ffffff).m(m_isp, FUNC(i82357_device::map));
- map(0xe0800000, 0xe0bfffff).ram().share("vram"); // framebuffer?
+ //map(0x91000000, 0x91ffffff).m();
+ //map(0x92000000, 0x92ffffff).m(); // EISA I/O ports?
+ //map(0x93000000, 0x93ffffff).m(); // EISA memory
+
+ map(0xf0000000, 0xf0000007).r(m_mct_adr, FUNC(jazz_mct_adr_device::isr_r)).umask64(0xffff);
+ map(0xf0000000, 0xf0000007).rw(m_mct_adr, FUNC(jazz_mct_adr_device::imr_r), FUNC(jazz_mct_adr_device::imr_w)).umask64(0xffff0000);
map(0xfff00000, 0xfff3ffff).r(m_flash, FUNC(amd_28f020_device::read)); // mirror?
}
@@ -108,42 +186,62 @@ static void jazz_scsi_devices(device_slot_interface &device)
device.option_add("cdrom", NSCSI_CDROM);
}
+FLOPPY_FORMATS_MEMBER(jazz_state::floppy_formats)
+ FLOPPY_PC_FORMAT
+FLOPPY_FORMATS_END
+
void jazz_state::jazz(machine_config &config)
{
- m_maincpu->set_addrmap(AS_PROGRAM, &jazz_state::jazz_common_map);
+ R4000(config, m_cpu, 50_MHz_XTAL);
+ m_cpu->set_addrmap(0, &jazz_state::jazz_common_map);
- RAM(config, m_ram, 0);
- m_ram->set_default_size("8M");
- m_ram->set_extra_options("16M,32M,64M,128M,256M");
+ RAM(config, m_ram);
+ m_ram->set_default_size("16M");
+ m_ram->set_extra_options("32M,64M,128M,256M");
m_ram->set_default_value(0);
- // FIXME: may require big and little endian variants
+ RAM(config, m_vram);
+ m_vram->set_default_size("2M");
+ m_vram->set_default_value(0);
+
+ // local bus dma, timer and interrupt controller
JAZZ_MCT_ADR(config, m_mct_adr, 0);
+ m_mct_adr->set_bus(m_cpu, 0);
+ m_mct_adr->out_int_dma_cb().set_inputline(m_cpu, INPUT_LINE_IRQ0);
+ m_mct_adr->out_int_device_cb().set_inputline(m_cpu, INPUT_LINE_IRQ1);
+ m_mct_adr->out_int_timer_cb().set_inputline(m_cpu, INPUT_LINE_IRQ4);
+ m_mct_adr->eisa_iack_cb().set(m_isp, FUNC(i82357_device::eisa_irq_ack));
// scsi bus and devices
- NSCSI_BUS(config, m_scsibus, 0);
+ NSCSI_BUS(config, m_scsibus);
+ NSCSI_CONNECTOR(config, "scsi:0", jazz_scsi_devices, "harddisk");
+ NSCSI_CONNECTOR(config, "scsi:1", jazz_scsi_devices, nullptr);
+ NSCSI_CONNECTOR(config, "scsi:2", jazz_scsi_devices, nullptr);
+ NSCSI_CONNECTOR(config, "scsi:3", jazz_scsi_devices, nullptr);
+ NSCSI_CONNECTOR(config, "scsi:4", jazz_scsi_devices, nullptr);
+ NSCSI_CONNECTOR(config, "scsi:5", jazz_scsi_devices, nullptr);
+ NSCSI_CONNECTOR(config, "scsi:6", jazz_scsi_devices, "cdrom");
- nscsi_connector &harddisk(NSCSI_CONNECTOR(config, "scsi:0", 0));
- jazz_scsi_devices(harddisk);
- harddisk.set_default_option("harddisk");
-
- nscsi_connector &cdrom(NSCSI_CONNECTOR(config, "scsi:6", 0));
- jazz_scsi_devices(cdrom);
- cdrom.set_default_option("cdrom");
+ // scsi host adapter
+ NSCSI_CONNECTOR(config, "scsi:7").option_set("ncr53c94", NCR53C94).clock(24_MHz_XTAL).machine_config(
+ [this](device_t *device)
+ {
+ ncr53c94_device &adapter = downcast<ncr53c94_device &>(*device);
- jazz_scsi_devices(NSCSI_CONNECTOR(config, "scsi:1", 0));
- jazz_scsi_devices(NSCSI_CONNECTOR(config, "scsi:2", 0));
- jazz_scsi_devices(NSCSI_CONNECTOR(config, "scsi:3", 0));
- jazz_scsi_devices(NSCSI_CONNECTOR(config, "scsi:4", 0));
- jazz_scsi_devices(NSCSI_CONNECTOR(config, "scsi:5", 0));
+ adapter.irq_handler_cb().set(m_mct_adr, FUNC(jazz_mct_adr_device::irq<5>));;
+ adapter.drq_handler_cb().set(m_mct_adr, FUNC(jazz_mct_adr_device::drq<0>));
- // scsi host adapter
- nscsi_connector &adapter(NSCSI_CONNECTOR(config, "scsi:7", 0));
- adapter.option_add_internal("host", NCR53C90A);
- adapter.set_default_option("host");
- adapter.set_fixed(true);
+ subdevice<jazz_mct_adr_device>(":mct_adr")->dma_r_cb<0>().set(adapter, FUNC(ncr53c94_device::dma_r));
+ subdevice<jazz_mct_adr_device>(":mct_adr")->dma_w_cb<0>().set(adapter, FUNC(ncr53c94_device::dma_w));
+ });
+ // floppy controller and drive
N82077AA(config, m_fdc, 24_MHz_XTAL);
+ m_fdc->intrq_wr_callback().set(m_mct_adr, FUNC(jazz_mct_adr_device::irq<1>));
+ m_fdc->drq_wr_callback().set(m_mct_adr, FUNC(jazz_mct_adr_device::drq<1>));
+ FLOPPY_CONNECTOR(config, "fdc:0", "35hd", FLOPPY_35_HD, true, jazz_state::floppy_formats).enable_sound(false);
+ m_mct_adr->dma_r_cb<1>().set(m_fdc, FUNC(n82077aa_device::dma_r));
+ m_mct_adr->dma_w_cb<1>().set(m_fdc, FUNC(n82077aa_device::dma_w));
MC146818(config, m_rtc, 32.768_kHz_XTAL);
@@ -151,52 +249,112 @@ void jazz_state::jazz(machine_config &config)
AMD_28F020(config, m_flash);
- // pc keyboard controller?
+ // pc keyboard connector
pc_kbdc_device &kbdc(PC_KBDC(config, "pc_kbdc", 0));
- kbdc.out_clock_cb().set(m_kbdc, FUNC(at_keyboard_controller_device::kbd_clk_w));
- kbdc.out_data_cb().set(m_kbdc, FUNC(at_keyboard_controller_device::kbd_data_w));
+ kbdc.out_clock_cb().set(m_kbdc, FUNC(ps2_keyboard_controller_device::kbd_clk_w));
+ kbdc.out_data_cb().set(m_kbdc, FUNC(ps2_keyboard_controller_device::kbd_data_w));
// keyboard port
pc_kbdc_slot_device &kbd(PC_KBDC_SLOT(config, "kbd", 0));
pc_at_keyboards(kbd);
- kbd.set_default_option(STR_KBD_IBM_PC_AT_84);
+ kbd.set_default_option(STR_KBD_MICROSOFT_NATURAL);
kbd.set_pc_kbdc_slot(&kbdc);
- // at keyboard controller
- AT_KEYBOARD_CONTROLLER(config, m_kbdc, 12_MHz_XTAL);
- m_kbdc->hot_res().set_inputline(m_maincpu, INPUT_LINE_RESET);
+ // keyboard controller
+ PS2_KEYBOARD_CONTROLLER(config, m_kbdc, 12_MHz_XTAL);
+ //m_kbdc->hot_res().set_inputline(m_cpu, INPUT_LINE_RESET);
+ m_kbdc->hot_res().set([this](int state) { if (!state) m_cpu->reset(); });
m_kbdc->kbd_clk().set(kbdc, FUNC(pc_kbdc_device::clock_write_from_mb));
m_kbdc->kbd_data().set(kbdc, FUNC(pc_kbdc_device::data_write_from_mb));
-
- G364(config, m_ramdac, 0);
+ m_kbdc->kbd_irq().set(m_mct_adr, FUNC(jazz_mct_adr_device::irq<6>));;
+
+ //m_kbdc->mouse_clk().set();
+ //m_kbdc->mouse_data().set();
+ m_kbdc->mouse_irq().set(m_mct_adr, FUNC(jazz_mct_adr_device::irq<7>));
+
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_raw(78643200, 1280, 0, 1280, 1024, 0, 1024);
+ m_screen->set_screen_update("g364", FUNC(g364_device::screen_update));
+ m_screen->screen_vblank().set(m_mct_adr, FUNC(jazz_mct_adr_device::irq<3>)); // maybe?
+
+ G364(config, m_ramdac, 5_MHz_XTAL); // FIXME: guessed clock
+ m_ramdac->set_screen(m_screen);
+ m_ramdac->set_vram(m_vram);
+
+ // WD16C552 (two 16550 + pc_lpt)
+ NS16550(config, m_ace[0], 4233600);
+ rs232_port_device &serial0(RS232_PORT(config, "serial0", default_rs232_devices, nullptr));
+
+ m_ace[0]->out_dtr_callback().set(serial0, FUNC(rs232_port_device::write_dtr));
+ m_ace[0]->out_rts_callback().set(serial0, FUNC(rs232_port_device::write_rts));
+ m_ace[0]->out_tx_callback().set(serial0, FUNC(rs232_port_device::write_txd));
+ m_ace[0]->out_int_callback().set(m_mct_adr, FUNC(jazz_mct_adr_device::irq<8>));
+
+ serial0.cts_handler().set(m_ace[0], FUNC(ns16550_device::cts_w));
+ serial0.dcd_handler().set(m_ace[0], FUNC(ns16550_device::dcd_w));
+ serial0.dsr_handler().set(m_ace[0], FUNC(ns16550_device::dsr_w));
+ serial0.ri_handler().set(m_ace[0], FUNC(ns16550_device::ri_w));
+ serial0.rxd_handler().set(m_ace[0], FUNC(ns16550_device::rx_w));
+
+ NS16550(config, m_ace[1], 8_MHz_XTAL);
+ rs232_port_device &serial1(RS232_PORT(config, "serial1", default_rs232_devices, nullptr));
+
+ m_ace[1]->out_dtr_callback().set(serial1, FUNC(rs232_port_device::write_dtr));
+ m_ace[1]->out_rts_callback().set(serial1, FUNC(rs232_port_device::write_rts));
+ m_ace[1]->out_tx_callback().set(serial1, FUNC(rs232_port_device::write_txd));
+ m_ace[1]->out_int_callback().set(m_mct_adr, FUNC(jazz_mct_adr_device::irq<9>));
+
+ serial1.cts_handler().set(m_ace[1], FUNC(ns16550_device::cts_w));
+ serial1.dcd_handler().set(m_ace[1], FUNC(ns16550_device::dcd_w));
+ serial1.dsr_handler().set(m_ace[1], FUNC(ns16550_device::dsr_w));
+ serial1.ri_handler().set(m_ace[1], FUNC(ns16550_device::ri_w));
+ serial1.rxd_handler().set(m_ace[1], FUNC(ns16550_device::rx_w));
+
+ PC_LPT(config, m_lpt, 0);
+ m_lpt->irq_handler().set(m_mct_adr, FUNC(jazz_mct_adr_device::irq<0>));
+
+ // TODO: sound, interrupt 2, drq 2(l) & 3(r)
+
+ // buzzer
+ SPEAKER(config, "mono").front_center();
+ SPEAKER_SOUND(config, m_buzzer);
+ m_buzzer->add_route(ALL_OUTPUTS, "mono", 0.50);
+
+ DP83932C(config, m_network, 20_MHz_XTAL);
+ m_network->out_int_cb().set(m_mct_adr, FUNC(jazz_mct_adr_device::irq<4>));
+ m_network->set_ram(RAM_TAG);
+
+ I82357(config, m_isp, 14.318181_MHz_XTAL);
+ m_isp->out_rtc_cb().set(m_rtc, FUNC(mc146818_device::write));
+ m_isp->out_int_cb().set_inputline(m_cpu, INPUT_LINE_IRQ2);
+ m_isp->out_nmi_cb().set_inputline(m_cpu, INPUT_LINE_IRQ3);
+ m_isp->out_spkr_cb().set(m_buzzer, FUNC(speaker_sound_device::level_w));
+
+ // TODO: 4 EISA slots
}
void jazz_state::mmr4000be(machine_config &config)
{
- R4000BE(config, m_maincpu, 50_MHz_XTAL);
-
jazz(config);
- DP83932C_BE(config, m_network, 20_MHz_XTAL);
+ m_cpu->set_config(r4000_device::CONFIG_BE, r4000_device::CONFIG_BE);
}
void jazz_state::mmr4000le(machine_config &config)
{
- R4000LE(config, m_maincpu, 50_MHz_XTAL);
-
jazz(config);
- DP83932C_LE(config, m_network, 20_MHz_XTAL);
+ m_cpu->set_config(0, r4000_device::CONFIG_BE);
}
ROM_START(mmr4000be)
- ROM_REGION32_BE(0x40000, "flash", 0)
+ ROM_REGION64_BE(0x40000, "flash", 0)
ROM_SYSTEM_BIOS(0, "riscos", "R4000 RISC/os PROM")
ROMX_LOAD("riscos.bin", 0x00000, 0x40000, CRC(cea6bc8f) SHA1(3e47b4ad5d1a0c7aac649e6aef3df1bf86fc938b), ROM_BIOS(0))
ROM_END
ROM_START(mmr4000le)
- ROM_REGION32_LE(0x40000, "flash", 0)
+ ROM_REGION64_LE(0x40000, "flash", 0)
ROM_SYSTEM_BIOS(0, "ntprom", "R4000 Windows NT PROM")
ROMX_LOAD("ntprom.bin", 0x00000, 0x40000, CRC(d91018d7) SHA1(316de17820192c89b8ee6d9936ab8364a739ca53), ROM_BIOS(0))
ROM_END
diff --git a/src/mame/drivers/jchan.cpp b/src/mame/drivers/jchan.cpp
index 25d45bfa545..5d860983d60 100644
--- a/src/mame/drivers/jchan.cpp
+++ b/src/mame/drivers/jchan.cpp
@@ -603,26 +603,26 @@ INPUT_PORTS_END
/* machine driver */
-MACHINE_CONFIG_START(jchan_state::jchan)
-
- MCFG_DEVICE_ADD("maincpu", M68000, 16000000)
- MCFG_DEVICE_PROGRAM_MAP(jchan_main)
- MCFG_TIMER_DRIVER_ADD_SCANLINE("scantimer", jchan_state, vblank, "screen", 0, 1)
+void jchan_state::jchan(machine_config &config)
+{
+ M68000(config, m_maincpu, 16000000);
+ m_maincpu->set_addrmap(AS_PROGRAM, &jchan_state::jchan_main);
+ TIMER(config, "scantimer").configure_scanline(FUNC(jchan_state::vblank), "screen", 0, 1);
- MCFG_DEVICE_ADD("sub", M68000, 16000000)
- MCFG_DEVICE_PROGRAM_MAP(jchan_sub)
+ M68000(config, m_subcpu, 16000000);
+ m_subcpu->set_addrmap(AS_PROGRAM, &jchan_state::jchan_sub);
WATCHDOG_TIMER(config, "watchdog");
GFXDECODE(config, "gfxdecode", m_palette, gfx_jchan);
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(64*8, 64*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 40*8-1, 0*8, 30*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(jchan_state, screen_update)
- MCFG_SCREEN_PALETTE(m_palette)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(64*8, 64*8);
+ screen.set_visarea(0*8, 40*8-1, 0*8, 30*8-1);
+ screen.set_screen_update(FUNC(jchan_state::screen_update));
+ screen.set_palette(m_palette);
PALETTE(config, m_palette).set_format(palette_device::xGRB_555, 0x10000);
@@ -634,7 +634,7 @@ MACHINE_CONFIG_START(jchan_state::jchan)
for (auto &spritegen : m_spritegen)
SKNS_SPRITE(config, spritegen, 0);
- MCFG_DEVICE_ADD("toybox", KANEKO_TOYBOX, "eeprom", "DSW1", "mcuram", "mcudata")
+ KANEKO_TOYBOX(config, "toybox", "eeprom", "DSW1", "mcuram", "mcudata");
EEPROM_93C46_16BIT(config, "eeprom");
@@ -642,10 +642,10 @@ MACHINE_CONFIG_START(jchan_state::jchan)
SPEAKER(config, "lspeaker").front_left();
SPEAKER(config, "rspeaker").front_right();
- MCFG_DEVICE_ADD("ymz", YMZ280B, 16000000)
- MCFG_SOUND_ROUTE(0, "lspeaker", 1.0)
- MCFG_SOUND_ROUTE(1, "rspeaker", 1.0)
-MACHINE_CONFIG_END
+ ymz280b_device &ymz(YMZ280B(config, "ymz", 16000000));
+ ymz.add_route(0, "lspeaker", 1.0);
+ ymz.add_route(1, "rspeaker", 1.0);
+}
/* ROM loading */
diff --git a/src/mame/drivers/jclub2.cpp b/src/mame/drivers/jclub2.cpp
index 57dc4d26b5d..b5720c16a48 100644
--- a/src/mame/drivers/jclub2.cpp
+++ b/src/mame/drivers/jclub2.cpp
@@ -1131,31 +1131,32 @@ TIMER_DEVICE_CALLBACK_MEMBER(common_state::scanline_irq)
}
// Older hardware (ST-0020 + ST-0016)
-MACHINE_CONFIG_START(jclub2o_state::jclub2o)
- MCFG_DEVICE_ADD("maincpu", M68EC020, 12000000)
- MCFG_DEVICE_PROGRAM_MAP(jclub2o_map)
- MCFG_TIMER_DRIVER_ADD_SCANLINE("scantimer", common_state, scanline_irq, "screen", 0, 1)
+void jclub2o_state::jclub2o(machine_config &config)
+{
+ M68EC020(config, m_maincpu, 12000000);
+ m_maincpu->set_addrmap(AS_PROGRAM, &jclub2o_state::jclub2o_map);
+ TIMER(config, "scantimer").configure_scanline(FUNC(common_state::scanline_irq), "screen", 0, 1);
- MCFG_DEVICE_ADD("soundcpu",ST0016_CPU, 8000000)
- MCFG_DEVICE_PROGRAM_MAP(st0016_mem)
- MCFG_DEVICE_IO_MAP(st0016_io)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", jclub2o_state, irq0_line_hold)
+ ST0016_CPU(config, m_soundcpu, 8000000);
+ m_soundcpu->set_addrmap(AS_PROGRAM, &jclub2o_state::st0016_mem);
+ m_soundcpu->set_addrmap(AS_IO, &jclub2o_state::st0016_io);
+ m_soundcpu->set_vblank_int("screen", FUNC(jclub2o_state::irq0_line_hold));
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
EEPROM_S29290_16BIT(config, "eeprom");
WATCHDOG_TIMER(config, "watchdog");
- MCFG_TICKET_DISPENSER_ADD("hopper1", attotime::from_msec(200), TICKET_MOTOR_ACTIVE_HIGH, TICKET_STATUS_ACTIVE_HIGH)
- MCFG_TICKET_DISPENSER_ADD("hopper2", attotime::from_msec(200), TICKET_MOTOR_ACTIVE_HIGH, TICKET_STATUS_ACTIVE_HIGH)
+ TICKET_DISPENSER(config, m_hopper1, attotime::from_msec(200), TICKET_MOTOR_ACTIVE_HIGH, TICKET_STATUS_ACTIVE_HIGH);
+ TICKET_DISPENSER(config, m_hopper2, attotime::from_msec(200), TICKET_MOTOR_ACTIVE_HIGH, TICKET_STATUS_ACTIVE_HIGH);
// video hardware
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(0x190, 0x100+16)
- MCFG_SCREEN_VISIBLE_AREA(0, 0x190-1, 0x10, 0x100-1)
- MCFG_SCREEN_UPDATE_DRIVER(jclub2_state, screen_update)
- MCFG_SCREEN_PALETTE(m_palette)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(0x190, 0x100+16);
+ screen.set_visarea(0, 0x190-1, 0x10, 0x100-1);
+ screen.set_screen_update(FUNC(jclub2_state::screen_update));
+ screen.set_palette(m_palette);
PALETTE(config, m_palette).set_format(palette_device::xBGR_555, 0x10000);
@@ -1165,30 +1166,31 @@ MACHINE_CONFIG_START(jclub2o_state::jclub2o)
// layout
config.set_default_layout(layout_jclub2o);
-MACHINE_CONFIG_END
+}
// Newer hardware (ST-0032)
-MACHINE_CONFIG_START(jclub2_state::jclub2)
- MCFG_DEVICE_ADD("maincpu", M68EC020, 12000000)
- MCFG_DEVICE_PROGRAM_MAP(jclub2_map)
- MCFG_TIMER_DRIVER_ADD_SCANLINE("scantimer", common_state, scanline_irq, "screen", 0, 1)
+void jclub2_state::jclub2(machine_config &config)
+{
+ M68EC020(config, m_maincpu, 12000000);
+ m_maincpu->set_addrmap(AS_PROGRAM, &jclub2_state::jclub2_map);
+ TIMER(config, "scantimer").configure_scanline(FUNC(common_state::scanline_irq), "screen", 0, 1);
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
EEPROM_93C46_8BIT(config, "eeprom");
WATCHDOG_TIMER(config, "watchdog");
- MCFG_TICKET_DISPENSER_ADD("hopper1", attotime::from_msec(200), TICKET_MOTOR_ACTIVE_HIGH, TICKET_STATUS_ACTIVE_HIGH)
- MCFG_TICKET_DISPENSER_ADD("hopper2", attotime::from_msec(200), TICKET_MOTOR_ACTIVE_HIGH, TICKET_STATUS_ACTIVE_HIGH)
+ TICKET_DISPENSER(config, m_hopper1, attotime::from_msec(200), TICKET_MOTOR_ACTIVE_HIGH, TICKET_STATUS_ACTIVE_HIGH);
+ TICKET_DISPENSER(config, m_hopper2, attotime::from_msec(200), TICKET_MOTOR_ACTIVE_HIGH, TICKET_STATUS_ACTIVE_HIGH);
// video hardware
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(0x190, 0x100+16)
- MCFG_SCREEN_VISIBLE_AREA(0, 0x190-1, 8, 0x100-8-1)
- MCFG_SCREEN_UPDATE_DRIVER(jclub2_state, screen_update)
- MCFG_SCREEN_PALETTE(m_palette)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(0x190, 0x100+16);
+ screen.set_visarea(0, 0x190-1, 8, 0x100-8-1);
+ screen.set_screen_update(FUNC(jclub2_state::screen_update));
+ screen.set_palette(m_palette);
PALETTE(config, m_palette).set_format(palette_device::xBGR_555, 0x10000);
@@ -1200,29 +1202,30 @@ MACHINE_CONFIG_START(jclub2_state::jclub2)
// layout
config.set_default_layout(layout_jclub2o);
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(darkhors_state::darkhors)
- MCFG_DEVICE_ADD("maincpu", M68EC020, 12000000) // 36MHz/3 ??
- MCFG_DEVICE_PROGRAM_MAP(darkhors_map)
- MCFG_TIMER_DRIVER_ADD_SCANLINE("scantimer", common_state, scanline_irq, "screen", 0, 1)
+void darkhors_state::darkhors(machine_config &config)
+{
+ M68EC020(config, m_maincpu, 12000000); // 36MHz/3 ??
+ m_maincpu->set_addrmap(AS_PROGRAM, &darkhors_state::darkhors_map);
+ TIMER(config, "scantimer").configure_scanline(FUNC(common_state::scanline_irq), "screen", 0, 1);
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
EEPROM_93C46_8BIT(config, "eeprom");
WATCHDOG_TIMER(config, "watchdog");
- MCFG_TICKET_DISPENSER_ADD("hopper1", attotime::from_msec(200), TICKET_MOTOR_ACTIVE_HIGH, TICKET_STATUS_ACTIVE_HIGH)
- MCFG_TICKET_DISPENSER_ADD("hopper2", attotime::from_msec(200), TICKET_MOTOR_ACTIVE_HIGH, TICKET_STATUS_ACTIVE_HIGH)
+ TICKET_DISPENSER(config, m_hopper1, attotime::from_msec(200), TICKET_MOTOR_ACTIVE_HIGH, TICKET_STATUS_ACTIVE_HIGH);
+ TICKET_DISPENSER(config, m_hopper2, attotime::from_msec(200), TICKET_MOTOR_ACTIVE_HIGH, TICKET_STATUS_ACTIVE_HIGH);
// video hardware
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(0x190, 0x100+16)
- MCFG_SCREEN_VISIBLE_AREA(0, 0x190-1, 8, 0x100-8-1)
- MCFG_SCREEN_UPDATE_DRIVER(darkhors_state, screen_update)
- MCFG_SCREEN_PALETTE(m_palette)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(0x190, 0x100+16);
+ screen.set_visarea(0, 0x190-1, 8, 0x100-8-1);
+ screen.set_screen_update(FUNC(darkhors_state::screen_update));
+ screen.set_palette(m_palette);
PALETTE(config, m_palette).set_format(palette_device::xBGR_555, 0x10000);
@@ -1235,9 +1238,8 @@ MACHINE_CONFIG_START(darkhors_state::darkhors)
// sound hardware
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("oki", OKIM6295, 528000, okim6295_device::PIN7_HIGH) // clock frequency & pin 7 not verified
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
-MACHINE_CONFIG_END
+ OKIM6295(config, "oki", 528000, okim6295_device::PIN7_HIGH).add_route(ALL_OUTPUTS, "mono", 1.0); // clock frequency & pin 7 not verified
+}
/***************************************************************************
diff --git a/src/mame/drivers/jedi.cpp b/src/mame/drivers/jedi.cpp
index 1d3d4875afe..ab52077903d 100644
--- a/src/mame/drivers/jedi.cpp
+++ b/src/mame/drivers/jedi.cpp
@@ -328,13 +328,13 @@ INPUT_PORTS_END
*
*************************************/
-MACHINE_CONFIG_START(jedi_state::jedi)
-
+void jedi_state::jedi(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M6502, JEDI_MAIN_CPU_CLOCK)
- MCFG_DEVICE_PROGRAM_MAP(main_map)
+ M6502(config, m_maincpu, JEDI_MAIN_CPU_CLOCK);
+ m_maincpu->set_addrmap(AS_PROGRAM, &jedi_state::main_map);
- MCFG_QUANTUM_TIME(attotime::from_hz(240))
+ config.m_minimum_quantum = attotime::from_hz(240);
X2212(config, "novram12b");
X2212(config, "novram12c");
@@ -361,7 +361,7 @@ MACHINE_CONFIG_START(jedi_state::jedi)
/* audio hardware */
jedi_audio(config);
-MACHINE_CONFIG_END
+}
diff --git a/src/mame/drivers/jensen.cpp b/src/mame/drivers/jensen.cpp
new file mode 100644
index 00000000000..542c41c2d49
--- /dev/null
+++ b/src/mame/drivers/jensen.cpp
@@ -0,0 +1,246 @@
+// license:BSD-3-Clause
+// copyright-holders:Patrick Mackinlay
+
+/*
+ * An emulation of the DECpc AXP/150 (code named Jensen), nearly identical
+ * DEC 2000 Model 300 AXP, and DEC 2000 Model 500 AXP (code named Culzean).
+ *
+ * References:
+ *
+ * ftp://ftp.netbsd.org/pub/NetBSD/misc/dec-docs/ek-a0638-td.pdf.gz
+ * http://www.decuslib.com/decus/vlt97a/everhart/jensen.info
+ *
+ * TODO
+ * - everything (skeleton only)
+ *
+ */
+/*
+ * WIP notes
+ *
+ * flash contains two compressed (deflate) blocks:
+ *
+ * block 0 offset 0x71c00 compressed 0x031737 decompressed 0x72800
+ * block 1 offset 0xd2008 compressed 0x01c31b decompressed 0x47a00
+ */
+#include "emu.h"
+
+#include "includes/jensen.h"
+#include "cpu/alpha/alphad.h"
+
+#include "debugger.h"
+
+#define VERBOSE 0
+#include "logmacro.h"
+
+void jensen_state::machine_start()
+{
+}
+
+void jensen_state::machine_reset()
+{
+}
+
+void jensen_state::init_common()
+{
+ // map the configured ram
+ m_cpu->space(0).install_ram(0x00000000, 0x00000000 | m_ram->mask(), m_ram->pointer());
+}
+
+void jensen_state::local_memory(address_map &map)
+{
+ //map(0x00000000, 0x07ffffff); // valid range
+}
+
+void jensen_state::local_io(address_map &map)
+{
+ map(0x00000000, 0x0000001f); // EISA INTA cycle
+ map(0x80000000, 0x9fffffff).lr8("feprom0", [this](offs_t offset) { return m_feprom[0]->read(offset >> 9); });
+ map(0xa0000000, 0xbfffffff).lr8("feprom1", [this](offs_t offset) { return m_feprom[1]->read(offset >> 9); });
+
+ //map(0xc0000000, 0xc1ffffff); // vl82c106 bits 24:9 -> vlsi 15:0 i.e. >> 9
+
+ map(0xd0000000, 0xd0000000).lrw8("hae", [this]() { return m_hae; }, [this](u8 data) { m_hae = data & 0x7f; });
+ map(0xe0000000, 0xe0000000).lrw8("sysctl", [this]() { return m_sysctl; }, [this](u8 data) { m_sysctl = data; logerror("led %x\n", data & 0xf); });
+ map(0xf0000000, 0xf0000000).lrw8("spare", [this]() { return m_spare; }, [this](u8 data) { m_spare = data; });
+}
+
+void jensen_state::eisa_memory(address_map &map)
+{
+ map(0x00000000, 0xffffffff).lrw8("eisa_memory",
+ [this](offs_t offset)
+ {
+ LOG("eisa_memory_r 0x%08x\n", (u32(m_hae) << 25) | (offset >> 7));
+
+ return 0;
+ },
+ [this](offs_t offset, u8 data)
+ {
+ LOG("eisa_memory_w 0x%08x data 0x%02x\n", (u32(m_hae) << 25) | (offset >> 7), data);
+ });
+}
+
+void jensen_state::eisa_io(address_map &map)
+{
+ map(0x00000000, 0xffffffff).lrw8("eisa_io",
+ [this](offs_t offset)
+ {
+ LOG("eisa_io_r offset 0x%08x address 0x%08x count %d (%s)\n", offset,
+ (u32(m_hae) << 25) | (offset >> 7), (offset >> 5) & 3, machine().describe_context());
+
+ return 0;
+ },
+ [this](offs_t offset, u8 data)
+ {
+ LOG("eisa_io_w offset 0x%08x address 0x%08x count %d data 0x%02x (%s)\n",
+ offset, (u32(m_hae) << 25) | (offset >> 7), (offset >> 5) & 3, data, machine().describe_context());
+ });
+}
+
+void jensen_state::jensen(machine_config &config)
+{
+ DEC_21064(config, m_cpu, 300'000'000).set_clock_scale(0.5);
+ m_cpu->set_dasm_type(alpha_disassembler::dasm_type::TYPE_NT);
+ m_cpu->set_addrmap(0, &jensen_state::local_memory);
+ m_cpu->set_addrmap(2, &jensen_state::local_io);
+ m_cpu->set_addrmap(4, &jensen_state::eisa_memory);
+ m_cpu->set_addrmap(6, &jensen_state::eisa_io);
+ m_cpu->srom_oe_w().set(m_srom, FUNC(xc1765e_device::reset_w));
+ m_cpu->srom_data_r().set(m_srom, FUNC(xc1765e_device::data_r));
+
+ RAM(config, m_ram);
+ m_ram->set_default_size("16M");
+ m_ram->set_extra_options("32M,64M,80M,128M");
+ m_ram->set_default_value(0);
+
+ XC1765E(config, m_srom);
+
+ // TODO: 1x1M + 1x256K flash?
+ INTEL_E28F008SA(config, m_feprom[0]);
+ INTEL_E28F008SA(config, m_feprom[1]);
+
+ // pc keyboard connector
+ pc_kbdc_device &kbdc(PC_KBDC(config, "pc_kbdc", 0));
+ //kbdc.out_clock_cb().set(m_kbdc, FUNC(ps2_keyboard_controller_device::kbd_clk_w));
+ //kbdc.out_data_cb().set(m_kbdc, FUNC(ps2_keyboard_controller_device::kbd_data_w));
+
+ // keyboard port
+ pc_kbdc_slot_device &kbd(PC_KBDC_SLOT(config, "kbd", 0));
+ pc_at_keyboards(kbd);
+ kbd.set_default_option(STR_KBD_MICROSOFT_NATURAL);
+ kbd.set_pc_kbdc_slot(&kbdc);
+
+ // TODO: VL82C106 (rtc, 2xserial, parallel, 2xps/2)
+ // TODO: 18.432 MHz crystal
+#if 0
+ rs232_port_device &com1(RS232_PORT(config, "com1", default_rs232_devices, nullptr));
+ m_ace[0]->out_dtr_callback().set(serial0, FUNC(rs232_port_device::write_dtr));
+ m_ace[0]->out_rts_callback().set(serial0, FUNC(rs232_port_device::write_rts));
+ m_ace[0]->out_tx_callback().set(serial0, FUNC(rs232_port_device::write_txd));
+ m_ace[0]->out_int_callback().set(m_mct_adr, FUNC(jazz_mct_adr_device::irq<8>));
+
+ serial0.cts_handler().set(m_ace[0], FUNC(ns16550_device::cts_w));
+ serial0.dcd_handler().set(m_ace[0], FUNC(ns16550_device::dcd_w));
+ serial0.dsr_handler().set(m_ace[0], FUNC(ns16550_device::dsr_w));
+ serial0.ri_handler().set(m_ace[0], FUNC(ns16550_device::ri_w));
+ serial0.rxd_handler().set(m_ace[0], FUNC(ns16550_device::rx_w));
+
+ rs232_port_device &com2(RS232_PORT(config, "com2", default_rs232_devices, nullptr));
+ m_ace[1]->out_dtr_callback().set(serial1, FUNC(rs232_port_device::write_dtr));
+ m_ace[1]->out_rts_callback().set(serial1, FUNC(rs232_port_device::write_rts));
+ m_ace[1]->out_tx_callback().set(serial1, FUNC(rs232_port_device::write_txd));
+ m_ace[1]->out_int_callback().set(m_mct_adr, FUNC(jazz_mct_adr_device::irq<9>));
+
+ serial1.cts_handler().set(m_ace[1], FUNC(ns16550_device::cts_w));
+ serial1.dcd_handler().set(m_ace[1], FUNC(ns16550_device::dcd_w));
+ serial1.dsr_handler().set(m_ace[1], FUNC(ns16550_device::dsr_w));
+ serial1.ri_handler().set(m_ace[1], FUNC(ns16550_device::ri_w));
+ serial1.rxd_handler().set(m_ace[1], FUNC(ns16550_device::rx_w));
+
+ PC_LPT(config, m_lpt, 0);
+ m_lpt->irq_handler().set(m_mct_adr, FUNC(jazz_mct_adr_device::irq<0>));
+#endif
+
+ I82357(config, m_isp, 14.318181_MHz_XTAL);
+ m_isp->out_int_cb().set_inputline(m_cpu, INPUT_LINE_IRQ2);
+ m_isp->out_nmi_cb().set_inputline(m_cpu, INPUT_LINE_IRQ3);
+
+ // TODO: six EISA slots
+
+ // DECpc AXP 150 usually fitted with:
+ // 30-40383-01 Adaptec AHA-1742A (SCSI + floppy)
+ // 30-40385-01 Compaq QVision 1024/E (1MB VGA)
+
+ // Optional
+ // DE422-SA Digital EISA Ethernet Controller (10 Mbps TP and BNC connectors)
+}
+
+void jensen_state::d2k300axp(machine_config &config)
+{
+ jensen(config);
+}
+
+void jensen_state::d2k500axp(machine_config &config)
+{
+ jensen(config);
+}
+
+void jensen_state::dpcaxp150(machine_config &config)
+{
+ jensen(config);
+}
+
+ROM_START(d2k300axp)
+ ROM_REGION32_LE(0x2000, "srom", 0)
+ ROM_LOAD("srom.bin", 0x00000, 0x2000, NO_DUMP)
+
+ ROM_REGION32_LE(0x100000, "feprom1", 0)
+ ROM_SYSTEM_BIOS(0, "feprom", "")
+ ROMX_LOAD("feprom1.bin", 0x00000, 0x100000, NO_DUMP, ROM_BIOS(0))
+ROM_END
+
+ROM_START(d2k500axp)
+ ROM_REGION32_LE(0x2000, "srom", 0)
+ ROM_LOAD("srom.bin", 0x00000, 0x2000, NO_DUMP)
+
+ ROM_REGION32_LE(0x100000, "feprom1", 0)
+ ROM_SYSTEM_BIOS(0, "feprom", "")
+ ROMX_LOAD("feprom1.bin", 0x00000, 0x100000, NO_DUMP, ROM_BIOS(0))
+ROM_END
+
+ROM_START(dpcaxp150)
+ /*
+ * This region corresponds to the 8KiB Xilinx XC1765 serial prom which is
+ * loaded into the Alpha primary instruction cache at reset. This dump is
+ * stored least-significant bit first (which suits the way it's loaded by
+ * the Alpha, and was the default treatment by the dumping device).
+ */
+ ROM_REGION32_LE(0x2000, "srom", 0)
+ ROM_LOAD("005v2__ax06.bin", 0x00000, 0x2000, CRC(d017ea39) SHA1(4d2d11ac94adebe797e749f6ef1e1e523bd1e9f3))
+
+ /*
+ * This region corresponds to FEPROM1, the 1MiB Intel E28F008SA flash
+ * memory. Documentation indicates FEPROM0 may be either 256KiB or 1MiB,
+ * and may map to the unpopulated nearby PLCC socket. Some revisions of the
+ * main board and the documentation indicate a SIMM of some kind rather
+ * than directly mounted memory devices, but presumably have equivalent
+ * sizes and content.
+ */
+ ROM_REGION32_LE(0x100000, "feprom1", 0)
+
+ // source: dumped from physical board
+ ROM_SYSTEM_BIOS(0, "v19", "Version 1.9, 22-JUN-1995")
+ ROMX_LOAD("001z5__bl07.v19", 0x00000, 0x100000, CRC(26da3478) SHA1(baa7c92b01244aad84420268a06d04c6e2a30754), ROM_BIOS(0))
+
+ // source: extracted from ftp://ftp.hp.com/pub/alphaserver/firmware/retired_platforms/alphapc/dec2000_axp150/
+ ROM_SYSTEM_BIOS(1, "v22", "Version 2.2, 12-FEB-1996")
+ ROMX_LOAD("001z5__bl07.v22", 0x00000, 0x100000, CRC(1edb9c98) SHA1(a45f0dde236e189a57afc1ed354201180ab2f234), ROM_BIOS(1))
+
+ // source: extracted from https://archive.org/details/decpcaxp
+ ROM_SYSTEM_BIOS(2, "v13", "Version 1.3, 10-JUN-1994")
+ ROMX_LOAD("001z5__bl07.v13", 0x00000, 0x100000, CRC(8035f370) SHA1(2ebd75267ab7373d344efe44e700645ed31b44cd), ROM_BIOS(2))
+ROM_END
+
+/* YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS */
+COMP( 1993, d2k300axp, 0, 0, d2k300axp, 0, jensen_state, init_common, "DEC", "DEC 2000 Model 300 AXP", MACHINE_IS_SKELETON)
+COMP( 1993, d2k500axp, 0, 0, d2k500axp, 0, jensen_state, init_common, "DEC", "DEC 2000 Model 500 AXP", MACHINE_IS_SKELETON)
+COMP( 1993, dpcaxp150, 0, 0, dpcaxp150, 0, jensen_state, init_common, "DEC", "DECpc AXP 150", MACHINE_IS_SKELETON)
diff --git a/src/mame/drivers/jeutel.cpp b/src/mame/drivers/jeutel.cpp
index 175737bc586..37877d8feb3 100644
--- a/src/mame/drivers/jeutel.cpp
+++ b/src/mame/drivers/jeutel.cpp
@@ -198,15 +198,18 @@ void jeutel_state::init_jeutel()
{
}
-MACHINE_CONFIG_START(jeutel_state::jeutel)
+void jeutel_state::jeutel(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, 3300000)
- MCFG_DEVICE_PROGRAM_MAP(jeutel_map)
- MCFG_DEVICE_ADD("cpu2", Z80, 3300000)
- MCFG_DEVICE_PROGRAM_MAP(jeutel_cpu2)
- MCFG_DEVICE_ADD("cpu3", Z80, 3300000)
- MCFG_DEVICE_PROGRAM_MAP(jeutel_cpu3)
- MCFG_DEVICE_IO_MAP(jeutel_cpu3_io)
+ Z80(config, m_maincpu, 3300000);
+ m_maincpu->set_addrmap(AS_PROGRAM, &jeutel_state::jeutel_map);
+
+ Z80(config, m_cpu2, 3300000);
+ m_cpu2->set_addrmap(AS_PROGRAM, &jeutel_state::jeutel_cpu2);
+
+ z80_device &cpu3(Z80(config, "cpu3", 3300000));
+ cpu3.set_addrmap(AS_PROGRAM, &jeutel_state::jeutel_cpu3);
+ cpu3.set_addrmap(AS_IO, &jeutel_state::jeutel_cpu3_io);
/* Video */
config.set_default_layout(layout_jeutel);
@@ -222,10 +225,10 @@ MACHINE_CONFIG_START(jeutel_state::jeutel)
aysnd.port_b_read_callback().set(FUNC(jeutel_state::portb_r));
aysnd.add_route(ALL_OUTPUTS, "mono", 0.40);
- MCFG_DEVICE_ADD("tms", TMS5110A, 640000)
- //MCFG_TMS5110_M0_CB(WRITELINE("tmsprom", tmsprom_device, m0_w))
- //MCFG_TMS5110_DATA_CB(READLINE("tmsprom", tmsprom_device, data_r))
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
+ TMS5110A(config, m_tms, 640000);
+ //m_tms->m0().set("tmsprom", FUNC(tmsprom_device::m0_w));
+ //m_tms->data().set("tmsprom", FUNC(tmsprom_device::data_r));
+ m_tms->add_route(ALL_OUTPUTS, "mono", 1.0);
/* Devices */
i8255_device &ppi0(I8255A(config, "ppi8255_0"));
@@ -252,8 +255,8 @@ MACHINE_CONFIG_START(jeutel_state::jeutel)
//ppi2.in_pc_callback().set_ioport("EXTRA");
//ppi2.out_pc_callback().set(FUNC(jeutel_state::ppi2c_w));
- MCFG_TIMER_DRIVER_ADD_PERIODIC("timer_a", jeutel_state, timer_a, attotime::from_hz(120))
-MACHINE_CONFIG_END
+ TIMER(config, "timer_a").configure_periodic(FUNC(jeutel_state::timer_a), attotime::from_hz(120));
+}
/*--------------------------------
/ Le King
diff --git a/src/mame/drivers/joctronic.cpp b/src/mame/drivers/joctronic.cpp
index 5e681b158bd..efe5ad48b18 100644
--- a/src/mame/drivers/joctronic.cpp
+++ b/src/mame/drivers/joctronic.cpp
@@ -335,16 +335,17 @@ void joctronic_state::machine_reset()
static INPUT_PORTS_START( joctronic )
INPUT_PORTS_END
-MACHINE_CONFIG_START(joctronic_state::joctronic)
+void joctronic_state::joctronic(machine_config &config)
+{
/* basic machine hardware */
Z80(config, m_maincpu, XTAL(12'000'000)/4); // 3 MHz - uses WAIT
m_maincpu->set_addrmap(AS_PROGRAM, &joctronic_state::maincpu_map); // 139
m_maincpu->set_addrmap(AS_IO, &joctronic_state::maincpu_io_map);
m_maincpu->set_daisy_config(daisy_chain);
- MCFG_DEVICE_ADD("soundcpu", Z80, XTAL(12'000'000)/2) // 6 MHz - uses WAIT
- MCFG_DEVICE_PROGRAM_MAP(joctronic_sound_map)
- MCFG_DEVICE_IO_MAP(joctronic_sound_io_map)
+ Z80(config, m_soundcpu, XTAL(12'000'000)/2); // 6 MHz - uses WAIT
+ m_soundcpu->set_addrmap(AS_PROGRAM, &joctronic_state::joctronic_sound_map);
+ m_soundcpu->set_addrmap(AS_IO, &joctronic_state::joctronic_sound_io_map);
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0); // 5516
@@ -357,10 +358,10 @@ MACHINE_CONFIG_START(joctronic_state::joctronic)
ctc.intr_callback().set_inputline(m_maincpu, INPUT_LINE_IRQ0);
ctc.zc_callback<0>().set_inputline(m_soundcpu, INPUT_LINE_IRQ0); //SINT
- MCFG_DEVICE_ADD("drivers1", LS259, 0) // IC4
- MCFG_DEVICE_ADD("drivers2", LS259, 0) // IC3
- MCFG_DEVICE_ADD("drivers3", LS259, 0) // IC2
- MCFG_DEVICE_ADD("drivers4", LS259, 0) // IC1
+ LS259(config, "drivers1", 0); // IC4
+ LS259(config, "drivers2", 0); // IC3
+ LS259(config, "drivers3", 0); // IC2
+ LS259(config, "drivers4", 0); // IC1
/* sound hardware */
SPEAKER(config, "mono").front_center();
@@ -373,23 +374,21 @@ MACHINE_CONFIG_START(joctronic_state::joctronic)
AY8910(config, "aysnd2", XTAL(12'000'000)/8).add_route(ALL_OUTPUTS, "mono", 0.40); // 1.5 MHz
- MCFG_DEVICE_ADD("r2r1", DAC_8BIT_R2R, 0)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.30)
-
- MCFG_DEVICE_ADD("r2r2", DAC_8BIT_R2R, 0)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.30)
-MACHINE_CONFIG_END
+ DAC_8BIT_R2R(config, "r2r1", 0).add_route(ALL_OUTPUTS, "mono", 0.30);
+ DAC_8BIT_R2R(config, "r2r2", 0).add_route(ALL_OUTPUTS, "mono", 0.30);
+}
-MACHINE_CONFIG_START(joctronic_state::slalom03)
+void joctronic_state::slalom03(machine_config &config)
+{
/* basic machine hardware */
Z80(config, m_maincpu, XTAL(12'000'000)/2); // 6 MHz - uses WAIT
m_maincpu->set_addrmap(AS_PROGRAM, &joctronic_state::slalom03_maincpu_map); // 138, 368, 32
m_maincpu->set_addrmap(AS_IO, &joctronic_state::maincpu_io_map);
m_maincpu->set_daisy_config(daisy_chain);
- MCFG_DEVICE_ADD("soundcpu", Z80, XTAL(12'000'000)/2) // 6 MHz - uses WAIT
- MCFG_DEVICE_PROGRAM_MAP(slalom03_sound_map)
- MCFG_DEVICE_IO_MAP(slalom03_sound_io_map)
+ Z80(config, m_soundcpu, XTAL(12'000'000)/2); // 6 MHz - uses WAIT
+ m_soundcpu->set_addrmap(AS_PROGRAM, &joctronic_state::slalom03_sound_map);
+ m_soundcpu->set_addrmap(AS_IO, &joctronic_state::slalom03_sound_io_map);
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0); // 5516
@@ -402,12 +401,12 @@ MACHINE_CONFIG_START(joctronic_state::slalom03)
ctc.intr_callback().set_inputline(m_maincpu, INPUT_LINE_IRQ0);
//ctc.zc_callback<0>().set_inputline(m_soundcpu, INPUT_LINE_IRQ0); //SINT
- MCFG_DEVICE_ADD("drivers1", HC259, 0) // IC1
- MCFG_DEVICE_ADD("drivers2", HC259, 0) // IC2
- MCFG_DEVICE_ADD("drivers3", HC259, 0) // IC3
- MCFG_DEVICE_ADD("drivers4", HC259, 0) // IC4
- MCFG_DEVICE_ADD("drivers5", HC259, 0) // IC5
- MCFG_DEVICE_ADD("drivers6", HC259, 0) // IC6
+ HC259(config, "drivers1", 0); // IC1
+ HC259(config, "drivers2", 0); // IC2
+ HC259(config, "drivers3", 0); // IC3
+ HC259(config, "drivers4", 0); // IC4
+ HC259(config, "drivers5", 0); // IC5
+ HC259(config, "drivers6", 0); // IC6
/* sound hardware */
SPEAKER(config, "mono").front_center();
@@ -421,17 +420,16 @@ MACHINE_CONFIG_START(joctronic_state::slalom03)
aysnd2.port_a_write_callback().set("r2r", FUNC(dac_8bit_r2r_device::data_w));
aysnd2.add_route(ALL_OUTPUTS, "mono", 0.40);
- MCFG_DEVICE_ADD("r2r", DAC_8BIT_R2R, 0)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.30)
+ DAC_8BIT_R2R(config, "r2r", 0).add_route(ALL_OUTPUTS, "mono", 0.30);
LS157(config, m_adpcm_select, 0);
m_adpcm_select->out_callback().set("oki", FUNC(msm5205_device::data_w));
- MCFG_DEVICE_ADD("oki", MSM5205, XTAL(12'000'000)/2/16) // 375 kHz
- MCFG_MSM5205_PRESCALER_SELECTOR(S96_4B) // frequency modifiable during operation
- MCFG_MSM5205_VCK_CALLBACK(WRITELINE(*this, joctronic_state, vck_w))
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.30)
-MACHINE_CONFIG_END
+ MSM5205(config, m_oki, XTAL(12'000'000)/2/16); // 375 kHz
+ m_oki->vck_callback().set(FUNC(joctronic_state::vck_w));
+ m_oki->set_prescaler_selector(msm5205_device::S96_4B); // frequency modifiable during operation
+ m_oki->add_route(ALL_OUTPUTS, "mono", 0.30);
+}
void joctronic_state::bldyrolr(machine_config & config)
{
diff --git a/src/mame/drivers/jokrwild.cpp b/src/mame/drivers/jokrwild.cpp
index 38c53c9fbe6..8e22e948f24 100644
--- a/src/mame/drivers/jokrwild.cpp
+++ b/src/mame/drivers/jokrwild.cpp
@@ -413,11 +413,11 @@ WRITE8_MEMBER(jokrwild_state::testb_w)
* Machine Drivers *
*************************/
-MACHINE_CONFIG_START(jokrwild_state::jokrwild)
-
+void jokrwild_state::jokrwild(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M6809, MASTER_CLOCK/2) /* guess */
- MCFG_DEVICE_PROGRAM_MAP(jokrwild_map)
+ M6809(config, m_maincpu, MASTER_CLOCK/2); /* guess */
+ m_maincpu->set_addrmap(AS_PROGRAM, &jokrwild_state::jokrwild_map);
// NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
@@ -432,13 +432,13 @@ MACHINE_CONFIG_START(jokrwild_state::jokrwild)
pia1.readpb_handler().set_ioport("IN3");
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE((32+1)*8, (32+1)*8) // From MC6845, registers 00 & 04. (value-1)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 24*8-1, 0*8, 26*8-1) // From MC6845, registers 01 & 06.
- MCFG_SCREEN_UPDATE_DRIVER(jokrwild_state, screen_update_jokrwild)
- MCFG_SCREEN_PALETTE("palette")
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size((32+1)*8, (32+1)*8); // From MC6845, registers 00 & 04. (value-1)
+ screen.set_visarea(0*8, 24*8-1, 0*8, 26*8-1); // From MC6845, registers 01 & 06.
+ screen.set_screen_update(FUNC(jokrwild_state::screen_update_jokrwild));
+ screen.set_palette("palette");
GFXDECODE(config, m_gfxdecode, "palette", gfx_jokrwild);
PALETTE(config, "palette", FUNC(jokrwild_state::jokrwild_palette), 512);
@@ -448,8 +448,7 @@ MACHINE_CONFIG_START(jokrwild_state::jokrwild)
crtc.set_show_border_area(false);
crtc.set_char_width(8);
crtc.out_vsync_callback().set_inputline(m_maincpu, INPUT_LINE_NMI);
-
-MACHINE_CONFIG_END
+}
/*************************
diff --git a/src/mame/drivers/jollyjgr.cpp b/src/mame/drivers/jollyjgr.cpp
index 7fddc2e98e5..f745cad2888 100644
--- a/src/mame/drivers/jollyjgr.cpp
+++ b/src/mame/drivers/jollyjgr.cpp
@@ -676,19 +676,20 @@ void jollyjgr_state::machine_reset()
m_tilemap_bank = 0;
}
-MACHINE_CONFIG_START(jollyjgr_state::jollyjgr)
+void jollyjgr_state::jollyjgr(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, XTAL(18'000'000)/6) /* 3MHz verified */
- MCFG_DEVICE_PROGRAM_MAP(jollyjgr_map)
+ Z80(config, m_maincpu, XTAL(18'000'000)/6); /* 3MHz verified */
+ m_maincpu->set_addrmap(AS_PROGRAM, &jollyjgr_state::jollyjgr_map);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(59.18) /* 59.1864Hz measured */
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(256, 256)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(jollyjgr_state, screen_update_jollyjgr)
- MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE(*this, jollyjgr_state, vblank_irq))
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(59.18); /* 59.1864Hz measured */
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(256, 256);
+ screen.set_visarea(0*8, 32*8-1, 2*8, 30*8-1);
+ screen.set_screen_update(FUNC(jollyjgr_state::screen_update_jollyjgr));
+ screen.screen_vblank().set(FUNC(jollyjgr_state::vblank_irq));
GFXDECODE(config, m_gfxdecode, m_palette, gfx_jollyjgr);
PALETTE(config, m_palette, FUNC(jollyjgr_state::jollyjgr_palette), 32); // tilemap and sprites
@@ -698,16 +699,15 @@ MACHINE_CONFIG_START(jollyjgr_state::jollyjgr)
SPEAKER(config, "mono").front_center();
AY8910(config, "aysnd", XTAL(3'579'545)/2).add_route(ALL_OUTPUTS, "mono", 0.45); /* 1.7897725MHz verified */
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(jollyjgr_state::fspider)
+void jollyjgr_state::fspider(machine_config &config)
+{
jollyjgr(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(fspider_map)
+ m_maincpu->set_addrmap(AS_PROGRAM, &jollyjgr_state::fspider_map);
- MCFG_SCREEN_MODIFY("screen")
- MCFG_SCREEN_UPDATE_DRIVER(jollyjgr_state, screen_update_fspider)
-MACHINE_CONFIG_END
+ subdevice<screen_device>("screen")->set_screen_update(FUNC(jollyjgr_state::screen_update_fspider));
+}
/*************************************
*
diff --git a/src/mame/drivers/jongkyo.cpp b/src/mame/drivers/jongkyo.cpp
index e8286ef38c3..402fa56e677 100644
--- a/src/mame/drivers/jongkyo.cpp
+++ b/src/mame/drivers/jongkyo.cpp
@@ -508,8 +508,8 @@ void jongkyo_state::machine_reset()
}
-MACHINE_CONFIG_START(jongkyo_state::jongkyo)
-
+void jongkyo_state::jongkyo(machine_config &config)
+{
/* basic machine hardware */
sega_315_5084_device &maincpu(SEGA_315_5084(config, m_maincpu, JONGKYO_CLOCK/4));
maincpu.set_addrmap(AS_PROGRAM, &jongkyo_state::jongkyo_memmap);
@@ -522,13 +522,13 @@ MACHINE_CONFIG_START(jongkyo_state::jongkyo)
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(256, 256)
- MCFG_SCREEN_VISIBLE_AREA(0, 256-1, 8, 256-8-1)
- MCFG_SCREEN_UPDATE_DRIVER(jongkyo_state, screen_update_jongkyo)
- MCFG_SCREEN_PALETTE("palette")
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(256, 256);
+ screen.set_visarea(0, 256-1, 8, 256-8-1);
+ screen.set_screen_update(FUNC(jongkyo_state::screen_update_jongkyo));
+ screen.set_palette("palette");
PALETTE(config, "palette", FUNC(jongkyo_state::jongkyo_palette), 0x100);
@@ -537,7 +537,7 @@ MACHINE_CONFIG_START(jongkyo_state::jongkyo)
aysnd.port_a_read_callback().set(FUNC(jongkyo_state::input_1p_r));
aysnd.port_b_read_callback().set(FUNC(jongkyo_state::input_2p_r));
aysnd.add_route(ALL_OUTPUTS, "mono", 0.33);
-MACHINE_CONFIG_END
+}
diff --git a/src/mame/drivers/jonos.cpp b/src/mame/drivers/jonos.cpp
index f48a6981af2..92a767ec09d 100644
--- a/src/mame/drivers/jonos.cpp
+++ b/src/mame/drivers/jonos.cpp
@@ -175,26 +175,27 @@ static GFXDECODE_START( gfx_jonos )
GFXDECODE_END
-MACHINE_CONFIG_START(jonos_state::jonos)
+void jonos_state::jonos(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", I8085A, XTAL(16'000'000) / 4)
- MCFG_DEVICE_PROGRAM_MAP(jonos_mem)
+ I8085A(config, m_maincpu, XTAL(16'000'000) / 4);
+ m_maincpu->set_addrmap(AS_PROGRAM, &jonos_state::jonos_mem);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */
- MCFG_SCREEN_UPDATE_DRIVER(jonos_state, screen_update)
- MCFG_SCREEN_SIZE(640, 288)
- MCFG_SCREEN_VISIBLE_AREA(0, 639, 0, 287)
- MCFG_SCREEN_PALETTE("palette")
-
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_jonos)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */
+ screen.set_screen_update(FUNC(jonos_state::screen_update));
+ screen.set_size(640, 288);
+ screen.set_visarea(0, 639, 0, 287);
+ screen.set_palette("palette");
+
+ GFXDECODE(config, "gfxdecode", "palette", gfx_jonos);
PALETTE(config, "palette", palette_device::MONOCHROME);
generic_keyboard_device &keyboard(GENERIC_KEYBOARD(config, "keyboard", 0));
keyboard.set_keyboard_callback(FUNC(jonos_state::kbd_put));
-MACHINE_CONFIG_END
+}
/* ROM definition */
diff --git a/src/mame/drivers/joystand.cpp b/src/mame/drivers/joystand.cpp
index 900f3ccb810..2d6544d7069 100644
--- a/src/mame/drivers/joystand.cpp
+++ b/src/mame/drivers/joystand.cpp
@@ -106,7 +106,6 @@ public:
joystand_state(const machine_config &mconfig, device_type type, const char *tag) :
driver_device(mconfig, type, tag),
m_maincpu(*this, "maincpu"),
- m_tmp68301(*this, "tmp68301"),
m_palette(*this, "palette"),
m_bg15_palette(*this, "bg15_palette"),
m_gfxdecode(*this, "gfxdecode"),
@@ -142,8 +141,7 @@ protected:
private:
// devices
- required_device<cpu_device> m_maincpu;
- required_device<tmp68301_device> m_tmp68301;
+ required_device<tmp68301_device> m_maincpu;
required_device<palette_device> m_palette;
required_device<palette_device> m_bg15_palette;
required_device<gfxdecode_device> m_gfxdecode;
@@ -434,7 +432,7 @@ READ16_MEMBER(joystand_state::cart_r)
{
int which = offset / 0x80000;
int addr = offset & 0x7ffff;
- return (m_cart_flash[which * 2 + 0]->read(space, addr) << 8) | m_cart_flash[which * 2 + 1]->read(space, addr);
+ return (m_cart_flash[which * 2 + 0]->read(addr) << 8) | m_cart_flash[which * 2 + 1]->read(addr);
}
WRITE16_MEMBER(joystand_state::cart_w)
@@ -443,9 +441,9 @@ WRITE16_MEMBER(joystand_state::cart_w)
int addr = offset & 0x7ffff;
if (ACCESSING_BITS_0_7)
- m_cart_flash[which * 2 + 1]->write(space, addr, data & 0xff);
+ m_cart_flash[which * 2 + 1]->write(addr, data & 0xff);
if (ACCESSING_BITS_8_15)
- m_cart_flash[which * 2 + 0]->write(space, addr, data >> 8);
+ m_cart_flash[which * 2 + 0]->write(addr, data >> 8);
bg15_tiles_dirty = true;
}
@@ -479,8 +477,6 @@ void joystand_state::joystand_map(address_map &map)
map(0xe00020, 0xe00021).r(FUNC(joystand_state::e00020_r)); // master slot
map(0xe80040, 0xe8005f).rw("rtc", FUNC(msm6242_device::read), FUNC(msm6242_device::write)).umask16(0x00ff);
-
- map(0xfffc00, 0xffffff).rw(m_tmp68301, FUNC(tmp68301_device::regs_r), FUNC(tmp68301_device::regs_w)); // TMP68301 Registers
}
@@ -584,28 +580,24 @@ void joystand_state::machine_reset()
INTERRUPT_GEN_MEMBER(joystand_state::joystand_interrupt)
{
// VBlank is connected to INT1 (external interrupts pin 1)
- m_tmp68301->external_interrupt_1();
+ m_maincpu->external_interrupt_1();
}
-MACHINE_CONFIG_START(joystand_state::joystand)
-
+void joystand_state::joystand(machine_config &config)
+{
// basic machine hardware
- MCFG_DEVICE_ADD(m_maincpu, M68000, XTAL(16'000'000)) // !! TMP68301 !!
- MCFG_DEVICE_PROGRAM_MAP(joystand_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", joystand_state, joystand_interrupt)
- MCFG_DEVICE_IRQ_ACKNOWLEDGE_DEVICE("tmp68301",tmp68301_device,irq_callback)
-
- TMP68301(config, m_tmp68301, 0);
- m_tmp68301->set_cputag(m_maincpu);
- m_tmp68301->in_parallel_callback().set(FUNC(joystand_state::eeprom_r));
- m_tmp68301->out_parallel_callback().set(FUNC(joystand_state::eeprom_w));
+ TMP68301(config, m_maincpu, XTAL(16'000'000));
+ m_maincpu->set_addrmap(AS_PROGRAM, &joystand_state::joystand_map);
+ m_maincpu->set_vblank_int("screen", FUNC(joystand_state::joystand_interrupt));
+ m_maincpu->in_parallel_callback().set(FUNC(joystand_state::eeprom_r));
+ m_maincpu->out_parallel_callback().set(FUNC(joystand_state::eeprom_w));
// video hardware
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_UPDATE_DRIVER(joystand_state, screen_update)
- MCFG_SCREEN_SIZE(0x200, 0x100)
- MCFG_SCREEN_VISIBLE_AREA(0x40, 0x40+0x178-1, 0x10, 0x100-1)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_screen_update(FUNC(joystand_state::screen_update));
+ screen.set_size(0x200, 0x100);
+ screen.set_visarea(0x40, 0x40+0x178-1, 0x10, 0x100-1);
PALETTE(config, m_palette).set_format(palette_device::xRGB_555, 0x1000);
GFXDECODE(config, m_gfxdecode, m_palette, gfx_joystand);
@@ -615,11 +607,9 @@ MACHINE_CONFIG_START(joystand_state::joystand)
// sound hardware
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("ym2413", YM2413, XTAL(3'579'545))
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.80)
+ YM2413(config, "ym2413", XTAL(3'579'545)).add_route(ALL_OUTPUTS, "mono", 0.80);
- MCFG_DEVICE_ADD("oki", OKIM6295, XTAL(16'000'000) / 16, okim6295_device::PIN7_HIGH) // pin 7 not verified
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.50)
+ OKIM6295(config, m_oki, XTAL(16'000'000) / 16, okim6295_device::PIN7_HIGH).add_route(ALL_OUTPUTS, "mono", 0.50); // pin 7 not verified
// cart
TMS_29F040(config, "cart.u1");
@@ -637,8 +627,8 @@ MACHINE_CONFIG_START(joystand_state::joystand)
// devices
EEPROM_93C46_16BIT(config, "eeprom");
- MCFG_DEVICE_ADD("rtc", MSM6242, XTAL(32'768))
-MACHINE_CONFIG_END
+ MSM6242(config, "rtc", XTAL(32'768));
+}
/***************************************************************************
diff --git a/src/mame/drivers/jp.cpp b/src/mame/drivers/jp.cpp
index 249c23bc588..9a2b4d8ce82 100644
--- a/src/mame/drivers/jp.cpp
+++ b/src/mame/drivers/jp.cpp
@@ -332,11 +332,13 @@ void jp_state::machine_reset()
m_digits[99] = 0x3f;
}
-MACHINE_CONFIG_START(jp_state::jp)
+void jp_state::jp(machine_config &config)
+
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, 8_MHz_XTAL / 2)
- MCFG_DEVICE_PROGRAM_MAP(jp_map)
- MCFG_DEVICE_PERIODIC_INT_DRIVER(jp_state, irq0_line_hold, 8_MHz_XTAL / 8192) // 4020 divider
+ Z80(config, m_maincpu, 8_MHz_XTAL / 2);
+ m_maincpu->set_addrmap(AS_PROGRAM, &jp_state::jp_map);
+ m_maincpu->set_periodic_int(FUNC(jp_state::irq0_line_hold), attotime::from_hz(8_MHz_XTAL / 8192)); // 4020 divider
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
@@ -378,7 +380,7 @@ MACHINE_CONFIG_START(jp_state::jp)
ay.port_a_read_callback().set(FUNC(jp_state::porta_r));
ay.port_b_read_callback().set(FUNC(jp_state::portb_r));
ay.add_route(ALL_OUTPUTS, "ayvol", 0.9);
-MACHINE_CONFIG_END
+}
WRITE8_MEMBER(jp_state::sample_bank_w)
{
@@ -407,23 +409,24 @@ IRQ_CALLBACK_MEMBER(jp_state::sound_int_cb)
return 0xff;
}
-MACHINE_CONFIG_START(jp_state::jps)
+void jp_state::jps(machine_config &config)
+{
jp(config);
- MCFG_DEVICE_ADD("soundcpu", Z80, 8_MHz_XTAL / 2)
- MCFG_DEVICE_PROGRAM_MAP(jp_sound_map)
- MCFG_DEVICE_IRQ_ACKNOWLEDGE_DRIVER(jp_state, sound_int_cb)
+ Z80(config, m_soundcpu, 8_MHz_XTAL / 2);
+ m_soundcpu->set_addrmap(AS_PROGRAM, &jp_state::jp_sound_map);
+ m_soundcpu->set_irq_acknowledge_callback(FUNC(jp_state::sound_int_cb));
LS157(config, m_adpcm_select, 0); // not labeled in manual; might even be a CD4019
m_adpcm_select->out_callback().set("msm", FUNC(msm5205_device::data_w));
SPEAKER(config, "msmvol").front_center();
- MCFG_DEVICE_ADD("msm", MSM5205, 384'000) // not labeled in manual; clock unknown
- MCFG_MSM5205_VCK_CALLBACK(WRITELINE(*this, jp_state, vck_w))
- MCFG_MSM5205_PRESCALER_SELECTOR(S48_4B) // unknown
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "msmvol", 1.0)
+ MSM5205(config, m_msm, 384'000); // not labeled in manual; clock unknown
+ m_msm->vck_callback().set(FUNC(jp_state::vck_w));
+ m_msm->set_prescaler_selector(msm5205_device::S48_4B); // unknown
+ m_msm->add_route(ALL_OUTPUTS, "msmvol", 1.0);
m_latch[9]->q_out_cb<5>().set_inputline("soundcpu", INPUT_LINE_NMI); // only external input for sound board
-MACHINE_CONFIG_END
+}
/*-------------------------------------------------------------------
/ America 1492 #1107
diff --git a/src/mame/drivers/jpmimpct.cpp b/src/mame/drivers/jpmimpct.cpp
index aa374ed298c..6db9c4aa5f5 100644
--- a/src/mame/drivers/jpmimpct.cpp
+++ b/src/mame/drivers/jpmimpct.cpp
@@ -662,7 +662,6 @@ void jpmimpct_state::tms_program_map(address_map &map)
// AM_RANGE(0x01000000, 0x0100003f) AM_MIRROR(0xf87fffc0) AM_READWRITE(jpmimpct_bt477_r, jpmimpct_bt477_w)
map(0x01000000, 0x017fffff).mirror(0xf8000000).mask(0x1f).rw(FUNC(jpmimpct_state::jpmimpct_bt477_r), FUNC(jpmimpct_state::jpmimpct_bt477_w));
map(0x07800000, 0x07bfffff).mirror(0xf8400000).ram();
- map(0xc0000000, 0xc00001ff).rw(m_dsp, FUNC(tms34010_device::io_register_r), FUNC(tms34010_device::io_register_w));
}
@@ -839,9 +838,10 @@ WRITE_LINE_MEMBER(jpmimpct_state::tms_irq)
*
*************************************/
-MACHINE_CONFIG_START(jpmimpct_state::jpmimpct)
- MCFG_DEVICE_ADD("maincpu", M68000, 8000000)
- MCFG_DEVICE_PROGRAM_MAP(m68k_program_map)
+void jpmimpct_state::jpmimpct(machine_config &config)
+{
+ M68000(config, m_maincpu, 8000000);
+ m_maincpu->set_addrmap(AS_PROGRAM, &jpmimpct_state::m68k_program_map);
TMS34010(config, m_dsp, 40000000);
m_dsp->set_addrmap(AS_PROGRAM, &jpmimpct_state::tms_program_map);
@@ -853,27 +853,25 @@ MACHINE_CONFIG_START(jpmimpct_state::jpmimpct)
m_dsp->set_shiftreg_in_callback(FUNC(jpmimpct_state::to_shiftreg));
m_dsp->set_shiftreg_out_callback(FUNC(jpmimpct_state::from_shiftreg));
- MCFG_QUANTUM_TIME(attotime::from_hz(30000))
+ config.m_minimum_quantum = attotime::from_hz(30000);
MCFG_MACHINE_START_OVERRIDE(jpmimpct_state,jpmimpct)
MCFG_MACHINE_RESET_OVERRIDE(jpmimpct_state,jpmimpct)
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
- MCFG_TIMER_DRIVER_ADD("duart_1_timer", jpmimpct_state, duart_1_timer_event)
+ TIMER(config, m_duart_1_timer).configure_generic(FUNC(jpmimpct_state::duart_1_timer_event));
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_RAW_PARAMS(40000000/4, 156*4, 0, 100*4, 328, 0, 300)
- MCFG_SCREEN_UPDATE_DEVICE("dsp", tms34010_device, tms340x0_rgb32)
- MCFG_PALETTE_ADD("palette", 256)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_raw(40000000/4, 156*4, 0, 100*4, 328, 0, 300);
+ screen.set_screen_update("dsp", FUNC(tms34010_device::tms340x0_rgb32));
+ PALETTE(config, m_palette).set_entries(256);
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("upd", UPD7759)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.50)
+ UPD7759(config, m_upd7759).add_route(ALL_OUTPUTS, "mono", 0.50);
MCFG_VIDEO_START_OVERRIDE(jpmimpct_state,jpmimpct)
- MCFG_DEVICE_ADD("meters", METERS, 0)
- MCFG_METERS_NUMBER(5)
-MACHINE_CONFIG_END
+ METERS(config, m_meters, 0).set_number(5);
+}
@@ -1311,11 +1309,12 @@ INPUT_PORTS_END
*
*************************************/
-MACHINE_CONFIG_START(jpmimpct_state::impctawp)
- MCFG_DEVICE_ADD("maincpu",M68000, 8000000)
- MCFG_DEVICE_PROGRAM_MAP(awp68k_program_map)
+void jpmimpct_state::impctawp(machine_config &config)
+{
+ M68000(config, m_maincpu, 8000000);
+ m_maincpu->set_addrmap(AS_PROGRAM, &jpmimpct_state::awp68k_program_map);
- MCFG_QUANTUM_TIME(attotime::from_hz(30000))
+ config.m_minimum_quantum = attotime::from_hz(30000);
S16LF01(config, m_vfd);
MCFG_MACHINE_START_OVERRIDE(jpmimpct_state,impctawp)
@@ -1328,11 +1327,11 @@ MACHINE_CONFIG_START(jpmimpct_state::impctawp)
ppi.in_pc_callback().set(FUNC(jpmimpct_state::hopper_c_r));
ppi.out_pc_callback().set(FUNC(jpmimpct_state::display_c_w));
- MCFG_TIMER_DRIVER_ADD("duart_1_timer", jpmimpct_state, duart_1_timer_event)
+ TIMER(config, m_duart_1_timer).configure_generic(FUNC(jpmimpct_state::duart_1_timer_event));
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("upd",UPD7759)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.50)
+ UPD7759(config, m_upd7759).add_route(ALL_OUTPUTS, "mono", 0.50);
+
config.set_default_layout(layout_jpmimpct);
REEL(config, m_reel[0], STARPOINT_48STEP_REEL, 1, 3, 0x09, 4);
@@ -1348,11 +1347,8 @@ MACHINE_CONFIG_START(jpmimpct_state::impctawp)
REEL(config, m_reel[5], STARPOINT_48STEP_REEL, 1, 3, 0x09, 4);
m_reel[5]->optic_handler().set(FUNC(jpmimpct_state::reel_optic_cb<5>));
- MCFG_DEVICE_ADD("meters", METERS, 0)
- MCFG_METERS_NUMBER(5)
-
-MACHINE_CONFIG_END
-
+ METERS(config, m_meters, 0).set_number(5);
+}
/*************************************
diff --git a/src/mame/drivers/jpmmps.cpp b/src/mame/drivers/jpmmps.cpp
index 80ec4239389..c2f759d8a91 100644
--- a/src/mame/drivers/jpmmps.cpp
+++ b/src/mame/drivers/jpmmps.cpp
@@ -184,19 +184,19 @@ void jpmmps_state::jpmmps_map(address_map &map)
void jpmmps_state::jpmmps_io_map(address_map &map)
{
- map.global_mask(0xff);
- map(0x0000, 0x001f).rw(UART_IC5, FUNC(tms9902_device::cruread), FUNC(tms9902_device::cruwrite));
+ map.global_mask(0x1ff);
+ map(0x0000, 0x003f).rw(UART_IC5, FUNC(tms9902_device::cruread), FUNC(tms9902_device::cruwrite));
-// AM_RANGE(0x0020, 0x0020) // power fail
-// AM_RANGE(0x0021, 0x0021) // wd timeout
-// AM_RANGE(0x0022, 0x0022) // invalid access
-// AM_RANGE(0x0023, 0x0023) // clear down
+// AM_RANGE(0x0040, 0x0041) // power fail
+// AM_RANGE(0x0042, 0x0043) // wd timeout
+// AM_RANGE(0x0044, 0x0045) // invalid access
+// AM_RANGE(0x0046, 0x0047) // clear down
-// AM_RANGE(0x0026, 0x0026) // uart4 int
-// AM_RANGE(0x0027, 0x0027) // uart2 int
+// AM_RANGE(0x004c, 0x004d) // uart4 int
+// AM_RANGE(0x004e, 0x004f) // uart2 int
- map(0x0040, 0x005f).rw(UART_IC10, FUNC(tms9902_device::cruread), FUNC(tms9902_device::cruwrite));
- map(0x0060, 0x0067).w("mainlatch", FUNC(ls259_device::write_d0));
+ map(0x0080, 0x00bf).rw(UART_IC10, FUNC(tms9902_device::cruread), FUNC(tms9902_device::cruwrite));
+ map(0x00c0, 0x00cf).w("mainlatch", FUNC(ls259_device::write_d0));
}
@@ -248,8 +248,8 @@ void jpmmps_state::machine_reset()
m_maincpu->reset_line(ASSERT_LINE);
}
-MACHINE_CONFIG_START(jpmmps_state::jpmmps)
-
+void jpmmps_state::jpmmps(machine_config &config)
+{
// CPU TMS9995, standard variant; no line connections
TMS9995(config, m_maincpu, MAIN_CLOCK);
m_maincpu->set_addrmap(AS_PROGRAM, &jpmmps_state::jpmmps_map);
@@ -284,14 +284,13 @@ MACHINE_CONFIG_START(jpmmps_state::jpmmps)
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("sn", SN76489, SOUND_CLOCK)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.00)
+ SN76489(config, m_psg, SOUND_CLOCK);
+ m_psg->add_route(ALL_OUTPUTS, "mono", 1.00);
- MCFG_DEVICE_ADD("meters", METERS, 0)
- MCFG_METERS_NUMBER(9) // TODO: meters.cpp sets a max of 8
+ METERS(config, m_meters, 0).set_number(9); // TODO: meters.cpp sets a max of 8
config.set_default_layout(layout_jpmmps);
-MACHINE_CONFIG_END
+}
diff --git a/src/mame/drivers/jpms80.cpp b/src/mame/drivers/jpms80.cpp
index 718f91c464e..79092705dd5 100644
--- a/src/mame/drivers/jpms80.cpp
+++ b/src/mame/drivers/jpms80.cpp
@@ -101,21 +101,21 @@ void jpms80_state::jpms80_map(address_map &map)
void jpms80_state::jpms80_io_map(address_map &map)
{
- map.global_mask(0x1ff);
+ map.global_mask(0x3ff);
// AM_RANGE(0x0000, 0x001f) // I/O & Optic (in)
- map(0x0000, 0x0007).w("outlatch0", FUNC(ls259_device::write_d0));
- map(0x0008, 0x000f).w("outlatch1", FUNC(ls259_device::write_d0));
- map(0x0010, 0x0017).w("outlatch2", FUNC(ls259_device::write_d0));
- map(0x0018, 0x001f).w("outlatch3", FUNC(ls259_device::write_d0));
- map(0x0020, 0x0027).w("outlatch4", FUNC(ls259_device::write_d0));
- map(0x0028, 0x002f).w("outlatch5", FUNC(ls259_device::write_d0));
- map(0x0030, 0x0037).w("outlatch6", FUNC(ls259_device::write_d0));
- map(0x0038, 0x003f).w("outlatch7", FUNC(ls259_device::write_d0));
- map(0x0040, 0x0047).w("outlatch8", FUNC(ls259_device::write_d0));
- map(0x0048, 0x004f).w("outlatch9", FUNC(ls259_device::write_d0));
- map(0x0050, 0x0057).w("outlatch10", FUNC(ls259_device::write_d0));
-// AM_RANGE(0x0140, 0x015f) // AY
- map(0x01e0, 0x01ff).rw(m_acc, FUNC(tms9902_device::cruread), FUNC(tms9902_device::cruwrite));
+ map(0x0000, 0x000f).w("outlatch0", FUNC(ls259_device::write_d0));
+ map(0x0010, 0x001f).w("outlatch1", FUNC(ls259_device::write_d0));
+ map(0x0020, 0x002f).w("outlatch2", FUNC(ls259_device::write_d0));
+ map(0x0030, 0x003f).w("outlatch3", FUNC(ls259_device::write_d0));
+ map(0x0040, 0x004f).w("outlatch4", FUNC(ls259_device::write_d0));
+ map(0x0050, 0x005f).w("outlatch5", FUNC(ls259_device::write_d0));
+ map(0x0060, 0x006f).w("outlatch6", FUNC(ls259_device::write_d0));
+ map(0x0070, 0x007f).w("outlatch7", FUNC(ls259_device::write_d0));
+ map(0x0080, 0x008f).w("outlatch8", FUNC(ls259_device::write_d0));
+ map(0x0090, 0x009f).w("outlatch9", FUNC(ls259_device::write_d0));
+ map(0x00a0, 0x00af).w("outlatch10", FUNC(ls259_device::write_d0));
+// AM_RANGE(0x0380, 0x03bf) // AY
+ map(0x03c0, 0x03ff).rw(m_acc, FUNC(tms9902_device::cruread), FUNC(tms9902_device::cruwrite));
// Lamps, Meters etc. can move around
}
diff --git a/src/mame/drivers/jpmsru.cpp b/src/mame/drivers/jpmsru.cpp
index 6bff4e4c61f..ca601ce3439 100644
--- a/src/mame/drivers/jpmsru.cpp
+++ b/src/mame/drivers/jpmsru.cpp
@@ -73,17 +73,19 @@ void jpmsru_state::jpmsru_io(address_map &map)
static INPUT_PORTS_START( jpmsru )
INPUT_PORTS_END
-MACHINE_CONFIG_START(jpmsru_state::jpmsru)
+void jpmsru_state::jpmsru(machine_config &config)
+{
TMS9980A(config, m_maincpu, MAIN_CLOCK);
m_maincpu->set_addrmap(AS_PROGRAM, &jpmsru_state::jpmsru_map);
m_maincpu->set_addrmap(AS_IO, &jpmsru_state::jpmsru_io);
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(jpmsru_state::jpmsru_4)
+void jpmsru_state::jpmsru_4(machine_config &config)
+{
TMS9980A(config, m_maincpu, MAIN_CLOCK);
m_maincpu->set_addrmap(AS_PROGRAM, &jpmsru_state::jpmsru_4_map);
m_maincpu->set_addrmap(AS_IO, &jpmsru_state::jpmsru_io);
-MACHINE_CONFIG_END
+}
void jpmsru_state::init_jpmsru()
{
diff --git a/src/mame/drivers/jpmsys5.cpp b/src/mame/drivers/jpmsys5.cpp
index ffc85d91c77..0909664ab42 100644
--- a/src/mame/drivers/jpmsys5.cpp
+++ b/src/mame/drivers/jpmsys5.cpp
@@ -91,10 +91,10 @@ WRITE16_MEMBER(jpmsys5v_state::sys5_tms34061_w)
}
if (ACCESSING_BITS_8_15)
- m_tms34061->write(space, col, row, func, data >> 8);
+ m_tms34061->write(col, row, func, data >> 8);
if (ACCESSING_BITS_0_7)
- m_tms34061->write(space, col | 1, row, func, data & 0xff);
+ m_tms34061->write(col | 1, row, func, data & 0xff);
}
READ16_MEMBER(jpmsys5v_state::sys5_tms34061_r)
@@ -115,10 +115,10 @@ READ16_MEMBER(jpmsys5v_state::sys5_tms34061_r)
}
if (ACCESSING_BITS_8_15)
- data |= m_tms34061->read(space, col, row, func) << 8;
+ data |= m_tms34061->read(col, row, func) << 8;
if (ACCESSING_BITS_0_7)
- data |= m_tms34061->read(space, col | 1, row, func);
+ data |= m_tms34061->read(col | 1, row, func);
return data;
}
@@ -583,7 +583,8 @@ void jpmsys5v_state::machine_reset()
*
*************************************/
-MACHINE_CONFIG_START(jpmsys5v_state::jpmsys5v)
+void jpmsys5v_state::jpmsys5v(machine_config &config)
+{
M68000(config, m_maincpu, 8_MHz_XTAL);
m_maincpu->set_addrmap(AS_PROGRAM, &jpmsys5v_state::m68000_map);
@@ -613,25 +614,23 @@ MACHINE_CONFIG_START(jpmsys5v_state::jpmsys5v)
S16LF01(config, m_vfd); //for debug ports
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_RAW_PARAMS(XTAL(40'000'000) / 4, 676, 20*4, 147*4, 256, 0, 254)
- MCFG_SCREEN_UPDATE_DRIVER(jpmsys5v_state, screen_update_jpmsys5v)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_raw(XTAL(40'000'000) / 4, 676, 20*4, 147*4, 256, 0, 254);
+ screen.set_screen_update(FUNC(jpmsys5v_state::screen_update_jpmsys5v));
- MCFG_DEVICE_ADD("tms34061", TMS34061, 0)
- MCFG_TMS34061_ROWSHIFT(8) /* VRAM address is (row << rowshift) | col */
- MCFG_TMS34061_VRAM_SIZE(0x40000) /* size of video RAM */
- MCFG_TMS34061_INTERRUPT_CB(WRITELINE(*this, jpmsys5v_state, generate_tms34061_interrupt)) /* interrupt gen callback */
+ TMS34061(config, m_tms34061, 0);
+ m_tms34061->set_rowshift(8); /* VRAM address is (row << rowshift) | col */
+ m_tms34061->set_vram_size(0x40000);
+ m_tms34061->int_callback().set(FUNC(jpmsys5v_state::generate_tms34061_interrupt));
- MCFG_PALETTE_ADD("palette", 16)
+ PALETTE(config, "palette").set_entries(16);
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("upd7759", UPD7759)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.30)
+ UPD7759(config, m_upd7759).add_route(ALL_OUTPUTS, "mono", 0.30);
/* Earlier revisions use an SAA1099, but no video card games seem to (?) */
- MCFG_DEVICE_ADD("ym2413", YM2413, 4000000 ) /* Unconfirmed */
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.00)
+ YM2413(config, "ym2413", 4000000).add_route(ALL_OUTPUTS, "mono", 1.00); /* Unconfirmed */
pia6821_device &pia(PIA6821(config, "6821pia", 0));
pia.readpa_handler().set(FUNC(jpmsys5v_state::u29_porta_r));
@@ -646,7 +645,7 @@ MACHINE_CONFIG_START(jpmsys5v_state::jpmsys5v)
ptm.set_external_clocks(0, 0, 0);
ptm.o1_callback().set(FUNC(jpmsys5v_state::u26_o1_callback));
ptm.irq_callback().set(FUNC(jpmsys5v_state::ptm_irq));
-MACHINE_CONFIG_END
+}
READ16_MEMBER(jpmsys5_state::mux_awp_r)
{
@@ -858,7 +857,7 @@ void jpmsys5_state::jpmsys5_ym(machine_config &config)
ptm.irq_callback().set(FUNC(jpmsys5_state::ptm_irq));
config.set_default_layout(layout_jpmsys5);
- METERS(config, m_meters, 0).set_number_meters(8);
+ METERS(config, m_meters, 0).set_number(8);
}
// the first rev PCB used an SAA1099
@@ -914,7 +913,7 @@ void jpmsys5_state::jpmsys5(machine_config &config)
ptm.irq_callback().set(FUNC(jpmsys5_state::ptm_irq));
config.set_default_layout(layout_jpmsys5);
- METERS(config, m_meters, 0).set_number_meters(8);
+ METERS(config, m_meters, 0).set_number(8);
}
/*************************************
diff --git a/src/mame/drivers/jpmsys7.cpp b/src/mame/drivers/jpmsys7.cpp
index 3e522cc34c1..2702f1fc070 100644
--- a/src/mame/drivers/jpmsys7.cpp
+++ b/src/mame/drivers/jpmsys7.cpp
@@ -56,15 +56,16 @@ void jpmsys7_state::jpmsys7_map(address_map &map)
static INPUT_PORTS_START( jpmsys7 )
INPUT_PORTS_END
-MACHINE_CONFIG_START(jpmsys7_state::jpmsys7)
- MCFG_DEVICE_ADD("maincpu", MCF5206E, 40000000) // seems to be a Coldfire of some kind
- MCFG_DEVICE_PROGRAM_MAP(jpmsys7_map)
- MCFG_MCF5206E_PERIPHERAL_ADD("maincpu_onboard")
+void jpmsys7_state::jpmsys7(machine_config &config)
+{
+ MCF5206E(config, m_maincpu, 40000000); // seems to be a Coldfire of some kind
+ m_maincpu->set_addrmap(AS_PROGRAM, &jpmsys7_state::jpmsys7_map);
+ MCF5206E_PERIPHERAL(config, "maincpu_onboard", 0);
SPEAKER(config, "lspeaker").front_left();
SPEAKER(config, "rspeaker").front_right();
/* unknown sound (probably DMA driven DAC) */
-MACHINE_CONFIG_END
+}
diff --git a/src/mame/drivers/jr100.cpp b/src/mame/drivers/jr100.cpp
index 3235e60ceb6..17c691f24ba 100644
--- a/src/mame/drivers/jr100.cpp
+++ b/src/mame/drivers/jr100.cpp
@@ -409,8 +409,8 @@ void jr100_state::jr100(machine_config &config)
m_cassette->set_default_state((cassette_state)(CASSETTE_STOPPED | CASSETTE_SPEAKER_ENABLED | CASSETTE_MOTOR_ENABLED));
/* quickload */
- quickload_image_device &quickload(QUICKLOAD(config, "quickload", 0));
- quickload.set_handler(snapquick_load_delegate(&QUICKLOAD_LOAD_NAME(jr100_state, jr100), this), "prg", 2);
+ quickload_image_device &quickload(QUICKLOAD(config, "quickload"));
+ quickload.set_handler(snapquick_load_delegate(&QUICKLOAD_LOAD_NAME(jr100_state, jr100), this), "prg", attotime::from_seconds(2));
}
diff --git a/src/mame/drivers/jr200.cpp b/src/mame/drivers/jr200.cpp
index 364b76c4111..4228a4fdd41 100644
--- a/src/mame/drivers/jr200.cpp
+++ b/src/mame/drivers/jr200.cpp
@@ -539,32 +539,32 @@ void jr200_state::machine_reset()
}
-MACHINE_CONFIG_START(jr200_state::jr200)
+void jr200_state::jr200(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M6802, XTAL(14'318'181) / 4) /* MN1800A, ? Mhz assumption that it is same as JR-100*/
- MCFG_DEVICE_PROGRAM_MAP(jr200_mem)
+ M6802(config, m_maincpu, XTAL(14'318'181) / 4); /* MN1800A, ? MHz assumption that it is same as JR-100*/
+ m_maincpu->set_addrmap(AS_PROGRAM, &jr200_state::jr200_mem);
-// MCFG_DEVICE_ADD("mn1544", MN1544, ?)
+// MN1544(config, "mn1544", ?);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */
- MCFG_SCREEN_SIZE(16 + 256 + 16, 16 + 192 + 16) /* border size not accurate */
- MCFG_SCREEN_VISIBLE_AREA(0, 16 + 256 + 16 - 1, 0, 16 + 192 + 16 - 1)
- MCFG_SCREEN_UPDATE_DRIVER(jr200_state, screen_update_jr200)
- MCFG_SCREEN_PALETTE(m_palette)
-
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_jr200)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */
+ screen.set_size(16 + 256 + 16, 16 + 192 + 16); /* border size not accurate */
+ screen.set_visarea(0, 16 + 256 + 16 - 1, 0, 16 + 192 + 16 - 1);
+ screen.set_screen_update(FUNC(jr200_state::screen_update_jr200));
+ screen.set_palette(m_palette);
+
+ GFXDECODE(config, m_gfxdecode, m_palette, gfx_jr200);
PALETTE(config, m_palette, palette_device::BRG_3BIT);
SPEAKER(config, "mono").front_center();
// AY-8910 ?
- MCFG_DEVICE_ADD("beeper", BEEP, 0)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS,"mono",0.50)
-MACHINE_CONFIG_END
+ BEEP(config, m_beeper, 0).add_route(ALL_OUTPUTS,"mono",0.50);
+}
diff --git a/src/mame/drivers/jtc.cpp b/src/mame/drivers/jtc.cpp
index 588a49ca077..5e9c9bcdb39 100644
--- a/src/mame/drivers/jtc.cpp
+++ b/src/mame/drivers/jtc.cpp
@@ -818,8 +818,8 @@ MACHINE_CONFIG_START(jtc_state::basic)
m_maincpu->p3_out_cb().set(FUNC(jtc_state::p3_w));
/* cassette */
- MCFG_CASSETTE_ADD( "cassette" )
- MCFG_CASSETTE_DEFAULT_STATE(CASSETTE_STOPPED | CASSETTE_MOTOR_ENABLED | CASSETTE_SPEAKER_ENABLED)
+ CASSETTE(config, m_cassette);
+ m_cassette->set_default_state(CASSETTE_STOPPED | CASSETTE_MOTOR_ENABLED | CASSETTE_SPEAKER_ENABLED);
/* sound hardware */
SPEAKER(config, "mono").front_center();
@@ -827,78 +827,82 @@ MACHINE_CONFIG_START(jtc_state::basic)
WAVE(config, "wave", "cassette").add_route(ALL_OUTPUTS, "mono", 0.05);
/* printer */
- MCFG_DEVICE_ADD(m_centronics, CENTRONICS, centronics_devices, "printer")
- MCFG_CENTRONICS_BUSY_HANDLER(WRITELINE(*this, jtc_state, write_centronics_busy))
+ CENTRONICS(config, m_centronics, centronics_devices, "printer");
+ m_centronics->busy_handler().set(FUNC(jtc_state::write_centronics_busy));
/* quickload */
- MCFG_QUICKLOAD_ADD("quickload", jtc_state, jtc, "jtc,bin", 2)
+ MCFG_QUICKLOAD_ADD("quickload", jtc_state, jtc, "jtc,bin", attotime::from_seconds(2))
MACHINE_CONFIG_END
-MACHINE_CONFIG_START(jtc_state::jtc)
+void jtc_state::jtc(machine_config &config)
+{
basic(config);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(50)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */
- MCFG_SCREEN_UPDATE_DRIVER(jtc_state, screen_update)
- MCFG_SCREEN_SIZE(64, 64)
- MCFG_SCREEN_VISIBLE_AREA(0, 64-1, 0, 64-1)
- MCFG_SCREEN_PALETTE("palette")
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(50);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */
+ screen.set_screen_update(FUNC(jtc_state::screen_update));
+ screen.set_size(64, 64);
+ screen.set_visarea(0, 64-1, 0, 64-1);
+ screen.set_palette("palette");
PALETTE(config, "palette", palette_device::MONOCHROME);
/* internal ram */
RAM(config, m_ram).set_default_size("2K");
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(jtces88_state::jtces88)
+void jtces88_state::jtces88(machine_config &config)
+{
jtc(config);
/* internal ram */
m_ram->set_default_size("4K");
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(jtces23_state::jtces23)
+void jtces23_state::jtces23(machine_config &config)
+{
basic(config);
/* basic machine hardware */
m_maincpu->set_addrmap(AS_PROGRAM, &jtces23_state::jtc_es23_mem);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(50)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */
- MCFG_SCREEN_UPDATE_DRIVER(jtces23_state, screen_update)
- MCFG_SCREEN_SIZE(128, 128)
- MCFG_SCREEN_VISIBLE_AREA(0, 128-1, 0, 128-1)
- MCFG_SCREEN_PALETTE("palette")
-
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_jtces23)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(50);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */
+ screen.set_screen_update(FUNC(jtces23_state::screen_update));
+ screen.set_size(128, 128);
+ screen.set_visarea(0, 128-1, 0, 128-1);
+ screen.set_palette("palette");
+
+ GFXDECODE(config, "gfxdecode", "palette", gfx_jtces23);
PALETTE(config, "palette", palette_device::MONOCHROME);
/* internal ram */
RAM(config, RAM_TAG).set_default_size("4K");
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(jtces40_state::jtces40)
+void jtces40_state::jtces40(machine_config &config)
+{
basic(config);
/* basic machine hardware */
m_maincpu->set_addrmap(AS_PROGRAM, &jtces40_state::jtc_es40_mem);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(50)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */
- MCFG_SCREEN_UPDATE_DRIVER(jtces40_state, screen_update)
- MCFG_SCREEN_SIZE(320, 192)
- MCFG_SCREEN_VISIBLE_AREA(0, 320-1, 0, 192-1)
- MCFG_SCREEN_PALETTE("palette")
-
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_jtces40)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(50);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */
+ screen.set_screen_update(FUNC(jtces40_state::screen_update));
+ screen.set_size(320, 192);
+ screen.set_visarea(0, 320-1, 0, 192-1);
+ screen.set_palette("palette");
+
+ GFXDECODE(config, "gfxdecode", "palette", gfx_jtces40);
PALETTE(config, "palette", FUNC(jtc_state::es40_palette), 16);
/* internal ram */
RAM(config, RAM_TAG).set_default_size("8K").set_extra_options("16K,32K");
-MACHINE_CONFIG_END
+}
/* ROMs */
diff --git a/src/mame/drivers/jubilee.cpp b/src/mame/drivers/jubilee.cpp
index e15c173f5ea..1fd5617df9f 100644
--- a/src/mame/drivers/jubilee.cpp
+++ b/src/mame/drivers/jubilee.cpp
@@ -569,19 +569,19 @@ READ8_MEMBER(jubilee_state::mux_port_r)
{
switch( mux_sel )
{
- case 0x01: return ioport("IN0")->read();
- case 0x02: return ioport("IN1")->read(); /* muxed credits input is here! */
- case 0x03: return ioport("IN2")->read();
+ case 0x01: return BIT(ioport("IN0")->read(), offset);
+ case 0x02: return BIT(ioport("IN1")->read(), offset); /* muxed credits input is here! */
+ case 0x03: return BIT(ioport("IN2")->read(), offset);
}
- return 0xff;
+ return 1;
}
void jubilee_state::jubileep_cru_map(address_map &map)
{
- map(0x00c8, 0x00c8).r(FUNC(jubilee_state::mux_port_r)); /* multiplexed input port */
- map(0x0000, 0x07ff).w(FUNC(jubilee_state::unk_w));
+ map(0x0c80, 0x0c8f).r(FUNC(jubilee_state::mux_port_r)); /* multiplexed input port */
+ map(0x0000, 0x0fff).w(FUNC(jubilee_state::unk_w));
}
/* I/O byte R/W
@@ -670,8 +670,8 @@ GFXDECODE_END
* Machine Drivers *
*************************/
-MACHINE_CONFIG_START(jubilee_state::jubileep)
-
+void jubilee_state::jubileep(machine_config &config)
+{
// Main CPU TMS9980A, no line connections.
TMS9980A(config, m_maincpu, CPU_CLOCK);
m_maincpu->set_addrmap(AS_PROGRAM, &jubilee_state::jubileep_map);
@@ -681,22 +681,22 @@ MACHINE_CONFIG_START(jubilee_state::jubileep)
NVRAM(config, "videoworkram", nvram_device::DEFAULT_ALL_0);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(32*8, 32*8) /* (47+1*8, 38+1*8) from CRTC settings */
- MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 0*8, 32*8-1) /* (32*8, 32*8) from CRTC settings */
- MCFG_SCREEN_UPDATE_DRIVER(jubilee_state, screen_update_jubileep)
- MCFG_SCREEN_PALETTE("palette")
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(32*8, 32*8); /* (47+1*8, 38+1*8) from CRTC settings */
+ screen.set_visarea(0*8, 32*8-1, 0*8, 32*8-1); /* (32*8, 32*8) from CRTC settings */
+ screen.set_screen_update(FUNC(jubilee_state::screen_update_jubileep));
+ screen.set_palette("palette");
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_jubileep)
- MCFG_PALETTE_ADD("palette",8)
+ GFXDECODE(config, m_gfxdecode, "palette", gfx_jubileep);
+ PALETTE(config, "palette").set_entries(8);
mc6845_device &crtc(MC6845(config, "crtc", CRTC_CLOCK));
crtc.set_screen("screen");
crtc.set_show_border_area(false);
crtc.set_char_width(8);
-MACHINE_CONFIG_END
+}
/*************************
diff --git a/src/mame/drivers/juicebox.cpp b/src/mame/drivers/juicebox.cpp
index ce141025821..2e01708869a 100644
--- a/src/mame/drivers/juicebox.cpp
+++ b/src/mame/drivers/juicebox.cpp
@@ -308,24 +308,25 @@ void juicebox_state::init_juicebox()
// do nothing
}
-MACHINE_CONFIG_START(juicebox_state::juicebox)
- MCFG_DEVICE_ADD("maincpu", ARM7, 66000000)
- MCFG_DEVICE_PROGRAM_MAP(juicebox_map)
-
- MCFG_PALETTE_ADD("palette", 32768)
+void juicebox_state::juicebox(machine_config &config)
+{
+ ARM7(config, m_maincpu, 66000000);
+ m_maincpu->set_addrmap(AS_PROGRAM, &juicebox_state::juicebox_map);
- MCFG_SCREEN_ADD("screen", LCD)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */
- MCFG_SCREEN_SIZE(240, 160)
- MCFG_SCREEN_VISIBLE_AREA(0, 240 - 1, 0, 160 - 1)
+ PALETTE(config, "palette").set_entries(32768);
- MCFG_SCREEN_UPDATE_DEVICE("s3c44b0", s3c44b0_device, video_update)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_LCD));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */
+ screen.set_size(240, 160);
+ screen.set_visarea(0, 240 - 1, 0, 160 - 1);
+ screen.set_screen_update("s3c44b0", FUNC(s3c44b0_device::video_update));
SPEAKER(config, "speaker").front_center();
- MCFG_DEVICE_ADD("dac", DAC_16BIT_R2R_TWOS_COMPLEMENT, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 1.0) // unknown DAC
- MCFG_DEVICE_ADD("vref", VOLTAGE_REGULATOR, 0) MCFG_VOLTAGE_REGULATOR_OUTPUT(5.0)
- MCFG_SOUND_ROUTE(0, "dac", 1.0, DAC_VREF_POS_INPUT) MCFG_SOUND_ROUTE(0, "dac", -1.0, DAC_VREF_NEG_INPUT)
+ DAC_16BIT_R2R_TWOS_COMPLEMENT(config, "dac", 0).add_route(ALL_OUTPUTS, "speaker", 1.0); // unknown DAC
+ voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref"));
+ vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT);
+ vref.add_route(0, "dac", -1.0, DAC_VREF_NEG_INPUT);
S3C44B0(config, m_s3c44b0, 10000000);
m_s3c44b0->set_cpu("maincpu");
@@ -336,8 +337,8 @@ MACHINE_CONFIG_START(juicebox_state::juicebox)
SMARTMEDIA(config, m_smartmedia, 0);
/* software lists */
- MCFG_SOFTWARE_LIST_ADD("cart_list","juicebox")
-MACHINE_CONFIG_END
+ SOFTWARE_LIST(config, "cart_list").set_original("juicebox");
+}
static INPUT_PORTS_START( juicebox )
PORT_START( "PORTG" )
diff --git a/src/mame/drivers/jungleyo.cpp b/src/mame/drivers/jungleyo.cpp
index b42416e14b7..dc8967d320a 100644
--- a/src/mame/drivers/jungleyo.cpp
+++ b/src/mame/drivers/jungleyo.cpp
@@ -120,31 +120,31 @@ static GFXDECODE_START( gfx_jungleyo )
GFXDECODE_END
-MACHINE_CONFIG_START(jungleyo_state::jungleyo)
-
- MCFG_DEVICE_ADD("maincpu", M68000, 24_MHz_XTAL / 2)
- MCFG_DEVICE_PROGRAM_MAP(jungleyo_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", jungleyo_state, irq1_line_hold)
+void jungleyo_state::jungleyo(machine_config &config)
+{
+ M68000(config, m_maincpu, 24_MHz_XTAL / 2);
+ m_maincpu->set_addrmap(AS_PROGRAM, &jungleyo_state::jungleyo_map);
+ m_maincpu->set_vblank_int("screen", FUNC(jungleyo_state::irq1_line_hold));
GFXDECODE(config, m_gfxdecode, "palette", gfx_jungleyo);
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(64*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 64*8-1, 0*8, 32*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(jungleyo_state, screen_update_jungleyo)
- MCFG_SCREEN_PALETTE("palette")
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(64*8, 32*8);
+ screen.set_visarea(0*8, 64*8-1, 0*8, 32*8-1);
+ screen.set_screen_update(FUNC(jungleyo_state::screen_update_jungleyo));
+ screen.set_palette("palette");
PALETTE(config, "palette").set_format(palette_device::xRGB_555, 0x200);
SPEAKER(config, "lspeaker").front_left();
SPEAKER(config, "rspeaker").front_right();
- MCFG_DEVICE_ADD("oki", OKIM6295, 24_MHz_XTAL / 20, okim6295_device::PIN7_HIGH) // clock frequency & pin 7 not verified
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 0.47)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 0.47)
-MACHINE_CONFIG_END
+ okim6295_device &oki(OKIM6295(config, "oki", 24_MHz_XTAL / 20, okim6295_device::PIN7_HIGH)); // clock frequency & pin 7 not verified
+ oki.add_route(ALL_OUTPUTS, "lspeaker", 0.47);
+ oki.add_route(ALL_OUTPUTS, "rspeaker", 0.47);
+}
ROM_START( jungleyo )
diff --git a/src/mame/drivers/junior.cpp b/src/mame/drivers/junior.cpp
index 44ba5f62e8f..d571bb4a543 100644
--- a/src/mame/drivers/junior.cpp
+++ b/src/mame/drivers/junior.cpp
@@ -225,25 +225,26 @@ void junior_state::machine_reset()
}
-MACHINE_CONFIG_START(junior_state::junior)
+void junior_state::junior(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu",M6502, 1_MHz_XTAL)
- MCFG_DEVICE_PROGRAM_MAP(junior_mem)
- MCFG_QUANTUM_TIME(attotime::from_hz(50))
+ M6502(config, m_maincpu, 1_MHz_XTAL);
+ m_maincpu->set_addrmap(AS_PROGRAM, &junior_state::junior_mem);
+ config.m_minimum_quantum = attotime::from_hz(50);
/* video hardware */
config.set_default_layout(layout_junior);
/* Devices */
- MCFG_DEVICE_ADD("riot", MOS6532_NEW, 1_MHz_XTAL)
- MCFG_MOS6530n_IN_PA_CB(READ8(*this, junior_state, junior_riot_a_r))
- MCFG_MOS6530n_OUT_PA_CB(WRITE8(*this, junior_state, junior_riot_a_w))
- MCFG_MOS6530n_IN_PB_CB(READ8(*this, junior_state, junior_riot_b_r))
- MCFG_MOS6530n_OUT_PB_CB(WRITE8(*this, junior_state, junior_riot_b_w))
- MCFG_MOS6530n_IRQ_CB(INPUTLINE("maincpu", M6502_IRQ_LINE))
-
- MCFG_TIMER_DRIVER_ADD_PERIODIC("led_timer", junior_state, junior_update_leds, attotime::from_hz(50))
-MACHINE_CONFIG_END
+ MOS6532_NEW(config, m_riot, 1_MHz_XTAL);
+ m_riot->pa_rd_callback().set(FUNC(junior_state::junior_riot_a_r));
+ m_riot->pa_wr_callback().set(FUNC(junior_state::junior_riot_a_w));
+ m_riot->pb_rd_callback().set(FUNC(junior_state::junior_riot_b_r));
+ m_riot->pb_wr_callback().set(FUNC(junior_state::junior_riot_b_w));
+ m_riot->irq_wr_callback().set_inputline(m_maincpu, M6502_IRQ_LINE);
+
+ TIMER(config, "led_timer").configure_periodic(FUNC(junior_state::junior_update_leds), attotime::from_hz(50));
+}
/* ROM definition */
diff --git a/src/mame/drivers/junofrst.cpp b/src/mame/drivers/junofrst.cpp
index a86811791c8..5944603fb10 100644
--- a/src/mame/drivers/junofrst.cpp
+++ b/src/mame/drivers/junofrst.cpp
@@ -403,8 +403,8 @@ WRITE_LINE_MEMBER(junofrst_state::_30hz_irq)
}
}
-MACHINE_CONFIG_START(junofrst_state::junofrst)
-
+void junofrst_state::junofrst(machine_config &config)
+{
/* basic machine hardware */
KONAMI1(config, m_maincpu, 1500000); /* 1.5 MHz ??? */
m_maincpu->set_addrmap(AS_PROGRAM, &junofrst_state::main_map);
@@ -452,17 +452,15 @@ MACHINE_CONFIG_START(junofrst_state::junofrst)
aysnd.add_route(1, "filter.0.1", 0.30);
aysnd.add_route(2, "filter.0.2", 0.30);
- MCFG_DEVICE_ADD("dac", DAC_8BIT_R2R, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 0.25) // 100K (R56-63)/200K (R64-71) ladder network
- MCFG_DEVICE_ADD("vref", VOLTAGE_REGULATOR, 0) MCFG_VOLTAGE_REGULATOR_OUTPUT(5.0)
- MCFG_SOUND_ROUTE(0, "dac", 1.0, DAC_VREF_POS_INPUT) MCFG_SOUND_ROUTE(0, "dac", -1.0, DAC_VREF_NEG_INPUT)
-
- MCFG_DEVICE_ADD("filter.0.0", FILTER_RC)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 1.0)
- MCFG_DEVICE_ADD("filter.0.1", FILTER_RC)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 1.0)
- MCFG_DEVICE_ADD("filter.0.2", FILTER_RC)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 1.0)
-MACHINE_CONFIG_END
+ DAC_8BIT_R2R(config, "dac", 0).add_route(ALL_OUTPUTS, "speaker", 0.25); // 100K (R56-63)/200K (R64-71) ladder network
+ voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref"));
+ vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT);
+ vref.add_route(0, "dac", -1.0, DAC_VREF_NEG_INPUT);
+
+ FILTER_RC(config, m_filter_0_0).add_route(ALL_OUTPUTS, "speaker", 1.0);
+ FILTER_RC(config, m_filter_0_1).add_route(ALL_OUTPUTS, "speaker", 1.0);
+ FILTER_RC(config, m_filter_0_2).add_route(ALL_OUTPUTS, "speaker", 1.0);
+}
ROM_START( junofrst )
diff --git a/src/mame/drivers/jupace.cpp b/src/mame/drivers/jupace.cpp
index 8b551db5d1f..453a6828dc0 100644
--- a/src/mame/drivers/jupace.cpp
+++ b/src/mame/drivers/jupace.cpp
@@ -751,32 +751,32 @@ void ace_state::machine_start()
//**************************************************************************
//-------------------------------------------------
-// MACHINE_CONFIG( ace )
+// machine_config( ace )
//-------------------------------------------------
MACHINE_CONFIG_START(ace_state::ace)
// basic machine hardware
- MCFG_DEVICE_ADD(Z80_TAG, Z80, XTAL(6'500'000)/2)
- MCFG_DEVICE_PROGRAM_MAP(ace_mem)
- MCFG_DEVICE_IO_MAP(ace_io)
- MCFG_QUANTUM_TIME(attotime::from_hz(60))
+ Z80(config, m_maincpu, XTAL(6'500'000)/2);
+ m_maincpu->set_addrmap(AS_PROGRAM, &ace_state::ace_mem);
+ m_maincpu->set_addrmap(AS_IO, &ace_state::ace_io);
+ config.m_minimum_quantum = attotime::from_hz(60);
// video hardware
- MCFG_SCREEN_ADD(SCREEN_TAG, RASTER)
- MCFG_SCREEN_UPDATE_DRIVER(ace_state, screen_update)
- MCFG_SCREEN_RAW_PARAMS(XTAL(6'500'000), 416, 0, 336, 312, 0, 304)
- MCFG_SCREEN_PALETTE("palette")
+ screen_device &screen(SCREEN(config, SCREEN_TAG, SCREEN_TYPE_RASTER));
+ screen.set_screen_update(FUNC(ace_state::screen_update));
+ screen.set_raw(XTAL(6'500'000), 416, 0, 336, 312, 0, 304);
+ screen.set_palette("palette");
- MCFG_TIMER_DRIVER_ADD_SCANLINE("set_irq", ace_state, set_irq, SCREEN_TAG, 31*8, 264)
- MCFG_TIMER_DRIVER_ADD_SCANLINE("clear_irq", ace_state, clear_irq, SCREEN_TAG, 32*8, 264)
+ TIMER(config, "set_irq").configure_scanline(FUNC(ace_state::set_irq), SCREEN_TAG, 31*8, 264);
+ TIMER(config, "clear_irq").configure_scanline(FUNC(ace_state::clear_irq), SCREEN_TAG, 32*8, 264);
PALETTE(config, "palette", palette_device::MONOCHROME);
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_ace)
+ GFXDECODE(config, "gfxdecode", "palette", gfx_ace);
// sound hardware
SPEAKER(config, "mono").front_center();
- WAVE(config, "wave", "cassette").add_route(ALL_OUTPUTS, "mono", 0.25);
+ WAVE(config, "wave", m_cassette).add_route(ALL_OUTPUTS, "mono", 0.25);
SPEAKER_SOUND(config, "speaker").add_route(ALL_OUTPUTS, "mono", 1.00);
AY8910(config, AY8910_TAG, XTAL(6'500'000) / 2).add_route(ALL_OUTPUTS, "mono", 0.25);
@@ -785,12 +785,12 @@ MACHINE_CONFIG_START(ace_state::ace)
m_sp0256->add_route(ALL_OUTPUTS, "mono", 0.25);
// devices
- MCFG_CASSETTE_ADD("cassette")
- MCFG_CASSETTE_FORMATS(ace_cassette_formats)
- MCFG_CASSETTE_DEFAULT_STATE(CASSETTE_STOPPED)
- MCFG_CASSETTE_INTERFACE("jupace_cass")
+ CASSETTE(config, m_cassette);
+ m_cassette->set_formats(ace_cassette_formats);
+ m_cassette->set_default_state(CASSETTE_STOPPED);
+ m_cassette->set_interface("jupace_cass");
- MCFG_SNAPSHOT_ADD("snapshot", ace_state, ace, "ace", 1)
+ MCFG_SNAPSHOT_ADD("snapshot", ace_state, ace, "ace", attotime::from_seconds(1))
I8255A(config, m_ppi);
m_ppi->in_pb_callback().set(FUNC(ace_state::sby_r));
@@ -802,13 +802,15 @@ MACHINE_CONFIG_START(ace_state::ace)
m_z80pio->out_pa_callback().set(FUNC(ace_state::pio_pa_w));
m_z80pio->out_pb_callback().set("cent_data_out", FUNC(output_latch_device::bus_w));
- MCFG_DEVICE_ADD(m_centronics, CENTRONICS, centronics_devices, "printer")
- MCFG_CENTRONICS_OUTPUT_LATCH_ADD("cent_data_out", CENTRONICS_TAG)
+ CENTRONICS(config, m_centronics, centronics_devices, "printer");
+
+ output_latch_device &cent_data_out(OUTPUT_LATCH(config, "cent_data_out"));
+ m_centronics->set_output_latch(cent_data_out);
// internal ram
RAM(config, RAM_TAG).set_default_size("1K").set_extra_options("16K,32K,48K");
- MCFG_SOFTWARE_LIST_ADD("cass_list", "jupace_cass")
+ SOFTWARE_LIST(config, "cass_list").set_original("jupace_cass");
MACHINE_CONFIG_END
diff --git a/src/mame/drivers/jupiter.cpp b/src/mame/drivers/jupiter.cpp
index 5366da61ac8..06726da0312 100644
--- a/src/mame/drivers/jupiter.cpp
+++ b/src/mame/drivers/jupiter.cpp
@@ -280,7 +280,7 @@ void jupiter3_state::machine_reset()
//**************************************************************************
//-------------------------------------------------
-// MACHINE_CONFIG( jupiter )
+// machine_config( jupiter )
//-------------------------------------------------
void jupiter2_state::jupiter2(machine_config &config)
@@ -316,37 +316,38 @@ void jupiter2_state::jupiter2(machine_config &config)
//-------------------------------------------------
-// MACHINE_CONFIG( jupiter3 )
+// machine_config( jupiter3 )
//-------------------------------------------------
-MACHINE_CONFIG_START(jupiter3_state::jupiter3)
+void jupiter3_state::jupiter3(machine_config &config)
+{
// basic machine hardware
- MCFG_DEVICE_ADD(Z80_TAG, Z80, 4000000)
- MCFG_DEVICE_PROGRAM_MAP(jupiter3_mem)
- MCFG_DEVICE_IO_MAP(jupiter3_io)
+ Z80(config, m_maincpu, 4000000);
+ m_maincpu->set_addrmap(AS_PROGRAM, &jupiter3_state::jupiter3_mem);
+ m_maincpu->set_addrmap(AS_IO, &jupiter3_state::jupiter3_io);
// video hardware
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */
- MCFG_SCREEN_UPDATE_DRIVER(jupiter3_state, screen_update)
- MCFG_SCREEN_SIZE(512, 320)
- MCFG_SCREEN_VISIBLE_AREA(0, 512-1, 0, 320-1)
- MCFG_SCREEN_PALETTE("palette")
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */
+ screen.set_screen_update(FUNC(jupiter3_state::screen_update));
+ screen.set_size(512, 320);
+ screen.set_visarea(0, 512-1, 0, 320-1);
+ screen.set_palette("palette");
PALETTE(config, "palette", palette_device::MONOCHROME);
// devices
FD1771(config, INS1771N1_TAG, 1000000);
- MCFG_FLOPPY_DRIVE_ADD(INS1771N1_TAG":0", jupiter_floppies, "525ssdd", floppy_image_device::default_floppy_formats)
- MCFG_FLOPPY_DRIVE_ADD(INS1771N1_TAG":1", jupiter_floppies, nullptr, floppy_image_device::default_floppy_formats)
+ FLOPPY_CONNECTOR(config, INS1771N1_TAG":0", jupiter_floppies, "525ssdd", floppy_image_device::default_floppy_formats);
+ FLOPPY_CONNECTOR(config, INS1771N1_TAG":1", jupiter_floppies, nullptr, floppy_image_device::default_floppy_formats);
generic_keyboard_device &keyboard(GENERIC_KEYBOARD(config, "keyboard", 0));
keyboard.set_keyboard_callback(FUNC(jupiter3_state::kbd_put));
// internal ram
RAM(config, RAM_TAG).set_default_size("64K");
-MACHINE_CONFIG_END
+}
diff --git a/src/mame/drivers/jvh.cpp b/src/mame/drivers/jvh.cpp
index 0a2c546f366..d0acac1d6d9 100644
--- a/src/mame/drivers/jvh.cpp
+++ b/src/mame/drivers/jvh.cpp
@@ -49,28 +49,28 @@ void jvh_state::jvh_map(address_map &map)
void jvh_state::escape_io(address_map &map)
{
- //AM_RANGE(0x01, 0x02) AM_READ(sw1_r)
- //AM_RANGE(0x03, 0x05) AM_READ(dip_r)
- //AM_RANGE(0x06, 0x07) AM_READ(sw6_r)
- //AM_RANGE(0x10, 0x15) AM_WRITE(snd_w)
- //AM_RANGE(0x16, 0x16) AM_WRITE(latch_w)
- //AM_RANGE(0x17, 0x19) AM_WRITE(out1a_w)
- //AM_RANGE(0x1a, 0x1a) AM_WRITE(enable_w)
- //AM_RANGE(0x1b, 0x1f) AM_WRITE(out1b_w)
- //AM_RANGE(0x20, 0x27) AM_WRITE(out2a_w)
- //AM_RANGE(0x28, 0x2f) AM_WRITE(out2b_w)
- //AM_RANGE(0x30, 0x37) AM_WRITE(out3a_w)
- //AM_RANGE(0x3e, 0x3e) AM_WRITE(irq_enable)
- //AM_RANGE(0x3f, 0x3f) AM_WRITE(zc_enable)
- //AM_RANGE(0x40, 0x47) AM_WRITE(digit_w)
- //AM_RANGE(0x48, 0x4b) AM_WRITE(bcd_w)
- //AM_RANGE(0x4c, 0x50) AM_WRITE(panel_w)
- //AM_RANGE(0x51, 0x55) AM_WRITE(col_w)
- //AM_RANGE(0x58, 0x5f) AM_WRITE(out5b_w)
- //AM_RANGE(0x60, 0x67) AM_WRITE(out6a_w)
- //AM_RANGE(0x68, 0x6f) AM_WRITE(out6b_w)
- //AM_RANGE(0x70, 0x74) AM_WRITE(out7a_w)
- //AM_RANGE(0x75, 0x7f) AM_WRITE(sol_w)
+ //map(0x0010, 0x002f).r(FUNC(jvh_state::sw1_r));
+ //map(0x0030, 0x005f).r(FUNC(jvh_state::dip_r));
+ //map(0x0060, 0x007f).r(FUNC(jvh_state::sw6_r));
+ //map(0x0020, 0x002b).w(FUNC(jvh_state::snd_w));
+ //map(0x002c, 0x002d).w(FUNC(jvh_state::latch_w));
+ //map(0x002e, 0x0033).w(FUNC(jvh_state::out1a_w));
+ //map(0x0034, 0x0035).w(FUNC(jvh_state::enable_w));
+ //map(0x0036, 0x003f).w(FUNC(jvh_state::out1b_w));
+ //map(0x0040, 0x004f).w(FUNC(jvh_state::out2a_w));
+ //map(0x0050, 0x005f).w(FUNC(jvh_state::out2b_w));
+ //map(0x0060, 0x006f).w(FUNC(jvh_state::out3a_w));
+ //map(0x007c, 0x007d).w(FUNC(jvh_state::irq_enable));
+ //map(0x007e, 0x007f).w(FUNC(jvh_state::zc_enable));
+ //map(0x0080, 0x008f).w(FUNC(jvh_state::digit_w));
+ //map(0x0090, 0x0097).w(FUNC(jvh_state::bcd_w));
+ //map(0x0098, 0x00a1).w(FUNC(jvh_state::panel_w));
+ //map(0x00a2, 0x00ab).w(FUNC(jvh_state::col_w));
+ //map(0x00b0, 0x00bf).w(FUNC(jvh_state::out5b_w));
+ //map(0x00c0, 0x00cf).w(FUNC(jvh_state::out6a_w));
+ //map(0x00d0, 0x00df).w(FUNC(jvh_state::out6b_w));
+ //map(0x00e0, 0x00e9).w(FUNC(jvh_state::out7a_w));
+ //map(0x00ea, 0x00ff).w(FUNC(jvh_state::sol_w));
}
void jvh_state::movmastr_io(address_map &map)
diff --git a/src/mame/drivers/k1003.cpp b/src/mame/drivers/k1003.cpp
index 95a11014fa5..50c42a3ca57 100644
--- a/src/mame/drivers/k1003.cpp
+++ b/src/mame/drivers/k1003.cpp
@@ -147,15 +147,16 @@ void k1003_state::machine_reset()
{
}
-MACHINE_CONFIG_START(k1003_state::k1003)
+void k1003_state::k1003(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu",I8008, 800000)
- MCFG_DEVICE_PROGRAM_MAP(k1003_mem)
- MCFG_DEVICE_IO_MAP(k1003_io)
+ I8008(config, m_maincpu, 800000);
+ m_maincpu->set_addrmap(AS_PROGRAM, &k1003_state::k1003_mem);
+ m_maincpu->set_addrmap(AS_IO, &k1003_state::k1003_io);
/* video hardware */
config.set_default_layout(layout_k1003);
-MACHINE_CONFIG_END
+}
/* ROM definition */
diff --git a/src/mame/drivers/k28.cpp b/src/mame/drivers/k28.cpp
index 4f55bb65983..aa93287e6e1 100644
--- a/src/mame/drivers/k28.cpp
+++ b/src/mame/drivers/k28.cpp
@@ -1,104 +1,87 @@
// license:BSD-3-Clause
// copyright-holders:hap, Kevin Horton
-/***************************************************************************
+/******************************************************************************
- Tiger Electronics K28: Talking Learning Computer (model 7-230/7-231)
- * PCB marked PB-123 WIZARD, TIGER
- * Intel P8021 MCU with 1KB internal ROM
- * MM5445N VFD driver, 9-digit alphanumeric display same as snmath
- * 2*TMS6100 (32KB VSM)
- * SC-01-A speech chip
+Tiger Electronics K28: Talking Learning Computer (model 7-230/7-231)
+* PCB marked PB-123 WIZARD, TIGER
+* Intel P8021 MCU with 1KB internal ROM
+* MM5445N VFD driver, 9-digit alphanumeric display same as snmath
+* 2*TMS6100 (32KB VSM)
+* SC-01-A speech chip
- 3 models exist:
- - 7-230: darkblue case, toy-ish looks
- - 7-231: gray case, hardware is the same
- - 7-232: this one is completely different hw --> driver tispeak.cpp
+3 models exist:
+- 7-230: darkblue case, toy-ish looks
+- 7-231: gray case, hardware is the same
+- 7-232: this one is completely different hw --> driver tispeak.cpp
- TODO:
- - external module support (no dumps yet)
- - make MM5445N a device
+TODO:
+- external module support (no dumps yet)
-***************************************************************************/
+******************************************************************************/
#include "emu.h"
#include "cpu/mcs48/mcs48.h"
#include "machine/timer.h"
#include "machine/tms6100.h"
#include "sound/votrax.h"
+#include "video/mm5445.h"
#include "speaker.h"
#include "k28.lh"
+namespace {
class k28_state : public driver_device
{
public:
- k28_state(const machine_config &mconfig, device_type type, const char *tag)
- : driver_device(mconfig, type, tag),
+ k28_state(const machine_config &mconfig, device_type type, const char *tag) :
+ driver_device(mconfig, type, tag),
m_maincpu(*this, "maincpu"),
m_tms6100(*this, "tms6100"),
m_speech(*this, "speech"),
+ m_vfd(*this, "vfd"),
+ m_vfd_delay(*this, "led_delay_%u", 0),
m_onbutton_timer(*this, "on_button"),
m_inp_matrix(*this, "IN.%u", 0),
m_out_x(*this, "%u.%u", 0U, 0U),
- m_out_a(*this, "%u.a", 0U),
- m_out_digit(*this, "digit%u", 0U),
- m_display_wait(33),
- m_display_maxy(1),
- m_display_maxx(0)
+ m_out_digit(*this, "digit%u", 0U)
{ }
void k28(machine_config &config);
DECLARE_INPUT_CHANGED_MEMBER(power_on);
+protected:
+ virtual void machine_start() override;
+ virtual void machine_reset() override;
+
private:
- // devices
+ // devices/pointers
required_device<i8021_device> m_maincpu;
required_device<tms6100_device> m_tms6100;
required_device<votrax_sc01_device> m_speech;
+ required_device<mm5445_device> m_vfd;
+ required_device_array<timer_device, 9> m_vfd_delay;
required_device<timer_device> m_onbutton_timer;
required_ioport_array<7> m_inp_matrix;
- output_finder<0x20, 0x20> m_out_x;
- output_finder<0x20> m_out_a;
- output_finder<0x20> m_out_digit;
-
- // display common
- int m_display_wait; // led/lamp off-delay in milliseconds (default 33ms)
- int m_display_maxy; // display matrix number of rows
- int m_display_maxx; // display matrix number of columns (max 31 for now)
+ output_finder<9, 16> m_out_x;
+ output_finder<9> m_out_digit;
- u32 m_display_state[0x20]; // display matrix rows data (last bit is used for always-on)
- u16 m_display_segmask[0x20]; // if not 0, display matrix row is a digit, mask indicates connected segments
- u8 m_display_decay[0x20][0x20]; // (internal use)
-
- TIMER_DEVICE_CALLBACK_MEMBER(display_decay_tick);
- void display_update();
- void set_display_size(int maxx, int maxy);
- void set_display_segmask(u32 digits, u32 mask);
- void display_matrix(int maxx, int maxy, u32 setx, u32 sety, bool update = true);
+ TIMER_DEVICE_CALLBACK_MEMBER(vfd_delay_off);
bool m_power_on;
u8 m_inp_mux;
u8 m_phoneme;
int m_speech_strobe;
- int m_vfd_data_enable;
- int m_vfd_data_in;
- int m_vfd_clock;
- u64 m_vfd_shiftreg;
- u64 m_vfd_shiftreg_out;
- int m_vfd_shiftcount;
+ u64 m_vfd_data;
+ DECLARE_WRITE64_MEMBER(vfd_output_w);
DECLARE_WRITE8_MEMBER(mcu_p0_w);
DECLARE_READ8_MEMBER(mcu_p1_r);
DECLARE_READ8_MEMBER(mcu_p2_r);
DECLARE_WRITE8_MEMBER(mcu_p2_w);
- DECLARE_WRITE_LINE_MEMBER(mcu_prog_w);
void power_off();
-
- virtual void machine_start() override;
- virtual void machine_reset() override;
};
@@ -108,44 +91,21 @@ void k28_state::machine_start()
{
// resolve handlers
m_out_x.resolve();
- m_out_a.resolve();
m_out_digit.resolve();
// zerofill
- memset(m_display_state, 0, sizeof(m_display_state));
- memset(m_display_decay, 0, sizeof(m_display_decay));
- memset(m_display_segmask, 0, sizeof(m_display_segmask));
-
m_power_on = false;
m_inp_mux = 0;
m_phoneme = 0x3f;
m_speech_strobe = 0;
- m_vfd_data_enable = 0;
- m_vfd_data_in = 0;
- m_vfd_clock = 0;
- m_vfd_shiftreg = 0;
- m_vfd_shiftreg_out = 0;
- m_vfd_shiftcount = 0;
+ m_vfd_data = 0;
// register for savestates
- save_item(NAME(m_display_maxy));
- save_item(NAME(m_display_maxx));
- save_item(NAME(m_display_wait));
-
- save_item(NAME(m_display_state));
- save_item(NAME(m_display_decay));
- save_item(NAME(m_display_segmask));
-
save_item(NAME(m_power_on));
save_item(NAME(m_inp_mux));
save_item(NAME(m_phoneme));
save_item(NAME(m_speech_strobe));
- save_item(NAME(m_vfd_data_enable));
- save_item(NAME(m_vfd_data_in));
- save_item(NAME(m_vfd_clock));
- save_item(NAME(m_vfd_shiftreg));
- save_item(NAME(m_vfd_shiftreg_out));
- save_item(NAME(m_vfd_shiftcount));
+ save_item(NAME(m_vfd_data));
}
void k28_state::machine_reset()
@@ -170,91 +130,55 @@ void k28_state::power_off()
}
-/***************************************************************************
- Helper Functions
+/******************************************************************************
+ Devices, I/O
+******************************************************************************/
-***************************************************************************/
+// VFD handling
-// The device may strobe the outputs very fast, it is unnoticeable to the user.
-// To prevent flickering here, we need to simulate a decay.
-
-void k28_state::display_update()
+TIMER_DEVICE_CALLBACK_MEMBER(k28_state::vfd_delay_off)
{
- for (int y = 0; y < m_display_maxy; y++)
+ // clear VFD outputs
+ if (!BIT(m_vfd_data, param+16))
{
- u32 active_state = 0;
+ m_out_digit[param] = 0;
- for (int x = 0; x <= m_display_maxx; x++)
- {
- // turn on powered segments
- if (m_power_on && m_display_state[y] >> x & 1)
- m_display_decay[y][x] = m_display_wait;
-
- // determine active state
- u32 ds = (m_display_decay[y][x] != 0) ? 1 : 0;
- active_state |= (ds << x);
-
- // output to y.x, or y.a when always-on
- if (x != m_display_maxx)
- m_out_x[y][x] = ds;
- else
- m_out_a[y] = ds;
- }
-
- // output to digity
- if (m_display_segmask[y] != 0)
- m_out_digit[y] = active_state & m_display_segmask[y];
+ for (int i = 0; i < 16; i++)
+ m_out_x[param][i] = 0;
}
}
-TIMER_DEVICE_CALLBACK_MEMBER(k28_state::display_decay_tick)
+WRITE64_MEMBER(k28_state::vfd_output_w)
{
- // slowly turn off unpowered segments
- for (int y = 0; y < m_display_maxy; y++)
- for (int x = 0; x <= m_display_maxx; x++)
- if (m_display_decay[y][x] != 0)
- m_display_decay[y][x]--;
-
- display_update();
-}
+ // O1-O16: digit segment data
+ u16 seg_data = bitswap<16>(data,15,14,2,6,5,3,1,7,12,11,10,13,0,4,9,8);
-void k28_state::set_display_size(int maxx, int maxy)
-{
- m_display_maxx = maxx;
- m_display_maxy = maxy;
-}
-
-void k28_state::set_display_segmask(u32 digits, u32 mask)
-{
- // set a segment mask per selected digit, but leave unselected ones alone
- for (int i = 0; i < 0x20; i++)
+ // O17-O25: digit select
+ for (int i = 0; i < 9; i++)
{
- if (digits & 1)
- m_display_segmask[i] = mask;
- digits >>= 1;
- }
-}
+ if (BIT(data, i+16))
+ {
+ m_out_digit[i] = seg_data & 0x3fff;
-void k28_state::display_matrix(int maxx, int maxy, u32 setx, u32 sety, bool update)
-{
- set_display_size(maxx, maxy);
+ // output individual segments (2 of them are not in MAME's 16seg)
+ for (int j = 0; j < 16; j++)
+ m_out_x[i][j] = seg_data >> j & 1;
+ }
- // update current state
- u32 mask = (1 << maxx) - 1;
- for (int y = 0; y < maxy; y++)
- m_display_state[y] = (sety >> y & 1) ? ((setx & mask) | (1 << maxx)) : 0;
+ // they're strobed, so on falling edge, delay them going off to prevent flicker
+ else if (BIT(m_vfd_data, i+16))
+ m_vfd_delay[i]->adjust(attotime::from_msec(50), i);
+ }
- display_update();
+ // O26: power-off request on falling edge
+ if (~data & m_vfd_data & 0x2000000)
+ power_off();
+ m_vfd_data = data;
}
-
-/***************************************************************************
-
- I/O, Address Map(s)
-
-***************************************************************************/
+// I8021 ports
WRITE8_MEMBER(k28_state::mcu_p0_w)
{
@@ -266,13 +190,11 @@ WRITE8_MEMBER(k28_state::mcu_p0_w)
// d3: SC-01 strobe, latch phoneme on rising edge
int strobe = data >> 3 & 1;
if (strobe && !m_speech_strobe)
- m_speech->write(space, 0, m_phoneme);
+ m_speech->write(m_phoneme);
m_speech_strobe = strobe;
// d5: VFD driver data enable
- m_vfd_data_enable = ~data >> 5 & 1;
- if (m_vfd_data_enable)
- m_vfd_shiftreg = (m_vfd_shiftreg & ~u64(1)) | m_vfd_data_in;
+ m_vfd->enable_w(data >> 5 & 1);
// d4: VSM chip enable
// d6: VSM M0
@@ -311,9 +233,7 @@ READ8_MEMBER(k28_state::mcu_p2_r)
WRITE8_MEMBER(k28_state::mcu_p2_w)
{
// d0: VFD driver serial data
- m_vfd_data_in = data & 1;
- if (m_vfd_data_enable)
- m_vfd_shiftreg = (m_vfd_shiftreg & ~u64(1)) | m_vfd_data_in;
+ m_vfd->data_w(data & 1);
// d0-d3: VSM data, input mux and SC-01 phoneme lower nibble
m_tms6100->add_w(space, 0, data);
@@ -321,53 +241,11 @@ WRITE8_MEMBER(k28_state::mcu_p2_w)
m_phoneme = (m_phoneme & ~0xf) | (data & 0xf);
}
-WRITE_LINE_MEMBER(k28_state::mcu_prog_w)
-{
- // 8021 PROG: clock VFD driver
- bool rise = state == 1 && !m_vfd_clock;
- m_vfd_clock = state;
-
- // on rising edge
- if (rise)
- {
- // leading 1 triggers shift start
- if (m_vfd_shiftcount == 0 && ~m_vfd_shiftreg & 1)
- return;
-
- // output shiftreg on 35th clock
- if (m_vfd_shiftcount == 35)
- {
- m_vfd_shiftcount = 0;
-
- // output 0-15: digit segment data
- u16 seg_data = (u16)(m_vfd_shiftreg >> 19);
- seg_data = bitswap<16>(seg_data,0,1,13,9,10,12,14,8,3,4,5,2,15,11,6,7);
- // output 16-24: digit select
- u16 digit_sel = (u16)(m_vfd_shiftreg >> 10) & 0x1ff;
- set_display_segmask(0x1ff, 0x3fff);
- display_matrix(16, 9, seg_data, digit_sel);
- // output 25: power-off request on falling edge
- if (~m_vfd_shiftreg & m_vfd_shiftreg_out & 0x200)
- power_off();
- m_vfd_shiftreg_out = m_vfd_shiftreg;
- }
- else
- {
- m_vfd_shiftreg <<= 1;
- m_vfd_shiftcount++;
- }
- }
-}
-
-
-
-/***************************************************************************
-
- Inputs
-
-***************************************************************************/
+/******************************************************************************
+ Input Ports
+******************************************************************************/
static INPUT_PORTS_START( k28 )
PORT_START("IN.0")
@@ -443,11 +321,9 @@ INPUT_PORTS_END
-/***************************************************************************
-
- Machine Config
-
-***************************************************************************/
+/******************************************************************************
+ Machine Configs
+******************************************************************************/
void k28_state::k28(machine_config &config)
{
@@ -457,15 +333,20 @@ void k28_state::k28(machine_config &config)
m_maincpu->p1_in_cb().set(FUNC(k28_state::mcu_p1_r));
m_maincpu->p2_in_cb().set(FUNC(k28_state::mcu_p2_r));
m_maincpu->p2_out_cb().set(FUNC(k28_state::mcu_p2_w));
- m_maincpu->prog_out_cb().set(FUNC(k28_state::mcu_prog_w));
- m_maincpu->t1_in_cb().set("speech", FUNC(votrax_sc01_device::request)); // SC-01 A/R pin
+ m_maincpu->prog_out_cb().set("vfd", FUNC(mm5445_device::clock_w));
+ m_maincpu->t1_in_cb().set("speech", FUNC(votrax_sc01_device::request));
- TMS6100(config, m_tms6100, 3.579545_MHz_XTAL); // CLK tied to 8021 ALE pin
+ TMS6100(config, m_tms6100, 3.579545_MHz_XTAL / 15); // CLK tied to 8021 ALE pin
TIMER(config, "on_button").configure_generic(timer_device::expired_delegate());
- TIMER(config, "display_decay").configure_periodic(FUNC(k28_state::display_decay_tick), attotime::from_msec(1));
+
+ /* video hardware */
+ MM5445(config, m_vfd).output_cb().set(FUNC(k28_state::vfd_output_w));
config.set_default_layout(layout_k28);
+ for (int i = 0; i < 9; i++)
+ TIMER(config, m_vfd_delay[i]).configure_generic(FUNC(k28_state::vfd_delay_off));
+
/* sound hardware */
SPEAKER(config, "mono").front_center();
VOTRAX_SC01(config, "speech", 760000).add_route(ALL_OUTPUTS, "mono", 0.5); // measured 760kHz on its RC pin
@@ -473,11 +354,9 @@ void k28_state::k28(machine_config &config)
-/***************************************************************************
-
- ROM Defs, Game driver(s)
-
-***************************************************************************/
+/******************************************************************************
+ ROM Definitions
+******************************************************************************/
ROM_START( k28 )
ROM_REGION( 0x1000, "maincpu", 0 )
@@ -488,7 +367,13 @@ ROM_START( k28 )
ROM_LOAD( "cm62051.vsm", 0x4000, 0x4000, CRC(0fa61baa) SHA1(831be669423ba60c7f85a896b4b09a1295478bd9) )
ROM_END
+} // anonymous namespace
+
+
+/******************************************************************************
+ Drivers
+******************************************************************************/
// YEAR NAME PARENT CMP MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS
COMP( 1981, k28, 0, 0, k28, k28, k28_state, empty_init, "Tiger Electronics", "K28: Talking Learning Computer (model 7-230)", MACHINE_SUPPORTS_SAVE )
diff --git a/src/mame/drivers/k8915.cpp b/src/mame/drivers/k8915.cpp
index e316bd9ccc9..2c2609ee46b 100644
--- a/src/mame/drivers/k8915.cpp
+++ b/src/mame/drivers/k8915.cpp
@@ -134,20 +134,21 @@ uint32_t k8915_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap,
}
-MACHINE_CONFIG_START(k8915_state::k8915)
+void k8915_state::k8915(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, XTAL(4'915'200) / 2)
- MCFG_DEVICE_PROGRAM_MAP(mem_map)
- MCFG_DEVICE_IO_MAP(io_map)
+ Z80(config, m_maincpu, XTAL(4'915'200) / 2);
+ m_maincpu->set_addrmap(AS_PROGRAM, &k8915_state::mem_map);
+ m_maincpu->set_addrmap(AS_IO, &k8915_state::io_map);
/* video hardware */
- MCFG_SCREEN_ADD_MONOCHROME("screen", RASTER, rgb_t::green())
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */
- MCFG_SCREEN_UPDATE_DRIVER(k8915_state, screen_update)
- MCFG_SCREEN_SIZE(640, 250)
- MCFG_SCREEN_VISIBLE_AREA(0, 639, 0, 249)
- MCFG_SCREEN_PALETTE("palette")
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER, rgb_t::green()));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */
+ screen.set_screen_update(FUNC(k8915_state::screen_update));
+ screen.set_size(640, 250);
+ screen.set_visarea(0, 639, 0, 249);
+ screen.set_palette("palette");
PALETTE(config, "palette", palette_device::MONOCHROME);
@@ -164,7 +165,7 @@ MACHINE_CONFIG_START(k8915_state::k8915)
rs232.rxd_handler().set("sio", FUNC(z80sio_device::rxb_w));
rs232.dcd_handler().set("sio", FUNC(z80sio_device::dcdb_w));
rs232.cts_handler().set("sio", FUNC(z80sio_device::ctsb_w));
-MACHINE_CONFIG_END
+}
/* ROM definition */
diff --git a/src/mame/drivers/kaneko16.cpp b/src/mame/drivers/kaneko16.cpp
index 9e166ea1560..3070854ecf8 100644
--- a/src/mame/drivers/kaneko16.cpp
+++ b/src/mame/drivers/kaneko16.cpp
@@ -159,8 +159,8 @@ template<int Chip>
READ16_MEMBER(kaneko16_state::kaneko16_ay_YM2149_r)
{
/* Each 2149 register is mapped to a different address */
- m_ym2149[Chip]->address_w(space,0,offset);
- return m_ym2149[Chip]->data_r(space,0);
+ m_ym2149[Chip]->address_w(offset);
+ return m_ym2149[Chip]->data_r();
}
@@ -168,10 +168,10 @@ template<int Chip>
WRITE16_MEMBER(kaneko16_state::kaneko16_ay_YM2149_w)
{
/* Each 2149 register is mapped to a different address */
- m_ym2149[Chip]->address_w(space,0,offset);
+ m_ym2149[Chip]->address_w(offset);
/* The registers are mapped to odd addresses, except one! */
- if (ACCESSING_BITS_0_7) m_ym2149[Chip]->data_w(space,0, data & 0xff);
- else m_ym2149[Chip]->data_w(space,0,(data >> 8) & 0xff);
+ if (ACCESSING_BITS_0_7) m_ym2149[Chip]->data_w( data & 0xff);
+ else m_ym2149[Chip]->data_w((data >> 8) & 0xff);
}
template<int Mask>
@@ -243,7 +243,7 @@ READ16_MEMBER(kaneko16_berlwall_state::berlwall_oki_r)
mem_mask >>= 8;
}
- ret = m_oki[0]->read(space, offset, mem_mask);
+ ret = m_oki[0]->read();
ret = ret | ret << 8;
return ret;
@@ -257,7 +257,7 @@ WRITE16_MEMBER(kaneko16_berlwall_state::berlwall_oki_w)
mem_mask >>= 8;
}
- m_oki[0]->write(space, offset, data, mem_mask);
+ m_oki[0]->write(data);
}
READ16_MEMBER(kaneko16_berlwall_state::berlwall_spriteram_r)
@@ -1768,23 +1768,23 @@ TIMER_DEVICE_CALLBACK_MEMBER(kaneko16_state::kaneko16_interrupt)
6-7] rte
*/
-MACHINE_CONFIG_START(kaneko16_berlwall_state::berlwall)
-
+void kaneko16_berlwall_state::berlwall(machine_config &config)
+{
/* basic machine hardware */
M68000(config, m_maincpu, 12000000); /* MC68000P12 */
m_maincpu->set_addrmap(AS_PROGRAM, &kaneko16_berlwall_state::berlwall_map);
- MCFG_TIMER_DRIVER_ADD_SCANLINE("scantimer", kaneko16_state, kaneko16_interrupt, "screen", 0, 1)
+ TIMER(config, "scantimer").configure_scanline(FUNC(kaneko16_state::kaneko16_interrupt), "screen", 0, 1);
WATCHDOG_TIMER(config, m_watchdog);
/* video hardware */
- MCFG_SCREEN_ADD(m_screen, RASTER)
-// MCFG_SCREEN_VIDEO_ATTRIBUTES(VIDEO_UPDATE_AFTER_VBLANK) // mangled sprites otherwise
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */)
- MCFG_SCREEN_SIZE(256, 256)
- MCFG_SCREEN_VISIBLE_AREA(0, 256-1, 16, 240-1)
- MCFG_SCREEN_UPDATE_DRIVER(kaneko16_berlwall_state, screen_update_berlwall)
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+// m_screen->set_video_attributes(VIDEO_UPDATE_AFTER_VBLANK); // mangled sprites otherwise
+ m_screen->set_refresh_hz(60);
+ m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(2500) /* not accurate */);
+ m_screen->set_size(256, 256);
+ m_screen->set_visarea(0, 256-1, 16, 240-1);
+ m_screen->set_screen_update(FUNC(kaneko16_berlwall_state::screen_update_berlwall));
GFXDECODE(config, m_gfxdecode, m_palette, gfx_1x4bit_1x4bit);
PALETTE(config, m_palette).set_format(palette_device::xGRB_555, 2048);
@@ -1817,7 +1817,7 @@ MACHINE_CONFIG_START(kaneko16_berlwall_state::berlwall)
OKIM6295(config, m_oki[0], 12000000/6, okim6295_device::PIN7_LOW);
m_oki[0]->add_route(ALL_OUTPUTS, "lspeaker", 1.0);
m_oki[0]->add_route(ALL_OUTPUTS, "rspeaker", 1.0);
-MACHINE_CONFIG_END
+}
/***************************************************************************
@@ -1830,12 +1830,12 @@ void kaneko16_state::bakubrkr_oki1_map(address_map &map)
map(0x20000, 0x3ffff).bankr("okibank1");
}
-MACHINE_CONFIG_START(kaneko16_state::bakubrkr)
-
+void kaneko16_state::bakubrkr(machine_config &config)
+{
/* basic machine hardware */
M68000(config, m_maincpu, XTAL(12'000'000)); /* verified on pcb */
m_maincpu->set_addrmap(AS_PROGRAM, &kaneko16_state::bakubrkr_map);
- MCFG_TIMER_DRIVER_ADD_SCANLINE("scantimer", kaneko16_state, kaneko16_interrupt, "screen", 0, 1)
+ TIMER(config, "scantimer").configure_scanline(FUNC(kaneko16_state::kaneko16_interrupt), "screen", 0, 1);
MCFG_MACHINE_RESET_OVERRIDE(kaneko16_state,gtmr)
EEPROM_93C46_16BIT(config, m_eeprom);
@@ -1843,14 +1843,14 @@ MACHINE_CONFIG_START(kaneko16_state::bakubrkr)
WATCHDOG_TIMER(config, m_watchdog);
/* video hardware */
- MCFG_SCREEN_ADD(m_screen, RASTER)
- MCFG_SCREEN_VIDEO_ATTRIBUTES(VIDEO_UPDATE_AFTER_VBLANK) // mangled sprites otherwise
- MCFG_SCREEN_REFRESH_RATE(59)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */)
- MCFG_SCREEN_SIZE(256, 256)
- MCFG_SCREEN_VISIBLE_AREA(0, 256-1, 16, 240-1)
- MCFG_SCREEN_UPDATE_DRIVER(kaneko16_state, screen_update_kaneko16)
- MCFG_SCREEN_PALETTE(m_palette)
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_video_attributes(VIDEO_UPDATE_AFTER_VBLANK); // mangled sprites otherwise
+ m_screen->set_refresh_hz(59);
+ m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(2500) /* not accurate */);
+ m_screen->set_size(256, 256);
+ m_screen->set_visarea(0, 256-1, 16, 240-1);
+ m_screen->set_screen_update(FUNC(kaneko16_state::screen_update_kaneko16));
+ m_screen->set_palette(m_palette);
GFXDECODE(config, m_gfxdecode, m_palette, gfx_1x4bit_2x4bit);
PALETTE(config, m_palette).set_format(palette_device::xGRB_555, 2048);
@@ -1885,7 +1885,7 @@ MACHINE_CONFIG_START(kaneko16_state::bakubrkr)
OKIM6295(config, m_oki[0], XTAL(12'000'000)/6, okim6295_device::PIN7_HIGH); /* verified on pcb */
m_oki[0]->set_addrmap(0, &kaneko16_state::bakubrkr_oki1_map);
m_oki[0]->add_route(ALL_OUTPUTS, "mono", 1.0);
-MACHINE_CONFIG_END
+}
/***************************************************************************
@@ -1902,26 +1902,26 @@ MACHINE_CONFIG_END
6-7] busy loop
*/
-MACHINE_CONFIG_START(kaneko16_state::blazeon)
-
+void kaneko16_state::blazeon(machine_config &config)
+{
/* basic machine hardware */
M68000(config, m_maincpu, 12000000); /* TMP68HC000-12 */
m_maincpu->set_addrmap(AS_PROGRAM, &kaneko16_state::blazeon_map);
- MCFG_TIMER_DRIVER_ADD_SCANLINE("scantimer", kaneko16_state, kaneko16_interrupt, "screen", 0, 1)
+ TIMER(config, "scantimer").configure_scanline(FUNC(kaneko16_state::kaneko16_interrupt), "screen", 0, 1);
Z80(config, m_audiocpu, 4000000); /* D780C-2 (6 MHz) */
m_audiocpu->set_addrmap(AS_PROGRAM, &kaneko16_state::blazeon_soundmem);
m_audiocpu->set_addrmap(AS_IO, &kaneko16_state::blazeon_soundport);
/* video hardware */
- MCFG_SCREEN_ADD(m_screen, RASTER)
- MCFG_SCREEN_VIDEO_ATTRIBUTES(VIDEO_UPDATE_AFTER_VBLANK)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */)
- MCFG_SCREEN_SIZE(320, 240)
- MCFG_SCREEN_VISIBLE_AREA(0, 320-1, 0, 240-1 -8)
- MCFG_SCREEN_UPDATE_DRIVER(kaneko16_state, screen_update_kaneko16)
- MCFG_SCREEN_PALETTE(m_palette)
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_video_attributes(VIDEO_UPDATE_AFTER_VBLANK);
+ m_screen->set_refresh_hz(60);
+ m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(2500) /* not accurate */);
+ m_screen->set_size(320, 240);
+ m_screen->set_visarea(0, 320-1, 0, 240-1 -8);
+ m_screen->set_screen_update(FUNC(kaneko16_state::screen_update_kaneko16));
+ m_screen->set_palette(m_palette);
GFXDECODE(config, m_gfxdecode, m_palette, gfx_1x4bit_1x4bit);
PALETTE(config, m_palette).set_format(palette_device::xGRB_555, 2048);
@@ -1950,33 +1950,33 @@ MACHINE_CONFIG_START(kaneko16_state::blazeon)
YM2151(config, m_ymsnd, 4000000);
m_ymsnd->add_route(0, "lspeaker", 1.0);
m_ymsnd->add_route(1, "rspeaker", 1.0);
-MACHINE_CONFIG_END
+}
/***************************************************************************
Wing Force
***************************************************************************/
-MACHINE_CONFIG_START(kaneko16_state::wingforc)
-
+void kaneko16_state::wingforc(machine_config &config)
+{
/* basic machine hardware */
M68000(config, m_maincpu, XTAL(16'000'000)); /* TMP68HC000N-16 */
m_maincpu->set_addrmap(AS_PROGRAM, &kaneko16_state::blazeon_map);
- MCFG_TIMER_DRIVER_ADD_SCANLINE("scantimer", kaneko16_state, kaneko16_interrupt, "screen", 0, 1)
+ TIMER(config, "scantimer").configure_scanline(FUNC(kaneko16_state::kaneko16_interrupt), "screen", 0, 1);
Z80(config, m_audiocpu, XTAL(16'000'000)/4); /* D780C-2 (6 MHz) */
m_audiocpu->set_addrmap(AS_PROGRAM, &kaneko16_state::blazeon_soundmem);
m_audiocpu->set_addrmap(AS_IO, &kaneko16_state::wingforc_soundport);
/* video hardware */
- MCFG_SCREEN_ADD(m_screen, RASTER)
- MCFG_SCREEN_VIDEO_ATTRIBUTES(VIDEO_UPDATE_AFTER_VBLANK)
- MCFG_SCREEN_REFRESH_RATE(59.1854)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */)
- MCFG_SCREEN_SIZE(320, 240)
- MCFG_SCREEN_VISIBLE_AREA(0, 320-1, 0, 240-1 -16)
- MCFG_SCREEN_UPDATE_DRIVER(kaneko16_state, screen_update_kaneko16)
- MCFG_SCREEN_PALETTE(m_palette)
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_video_attributes(VIDEO_UPDATE_AFTER_VBLANK);
+ m_screen->set_refresh_hz(59.1854);
+ m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(2500) /* not accurate */);
+ m_screen->set_size(320, 240);
+ m_screen->set_visarea(0, 320-1, 0, 240-1 -16);
+ m_screen->set_screen_update(FUNC(kaneko16_state::screen_update_kaneko16));
+ m_screen->set_palette(m_palette);
GFXDECODE(config, m_gfxdecode, m_palette, gfx_1x4bit_1x4bit);
PALETTE(config, m_palette).set_format(palette_device::xGRB_555, 2048);
@@ -2007,7 +2007,7 @@ MACHINE_CONFIG_START(kaneko16_state::wingforc)
OKIM6295(config, m_oki[0], XTAL(16'000'000)/16, okim6295_device::PIN7_HIGH);
m_oki[0]->add_route(ALL_OUTPUTS, "mono", 1.0);
m_oki[0]->set_addrmap(0, &kaneko16_state::bakubrkr_oki1_map);
-MACHINE_CONFIG_END
+}
/***************************************************************************
@@ -2035,12 +2035,12 @@ void kaneko16_state::gtmr_oki2_map(address_map &map)
map(0x00000, 0x3ffff).bankr("okibank2");
}
-MACHINE_CONFIG_START(kaneko16_gtmr_state::gtmr)
-
+void kaneko16_gtmr_state::gtmr(machine_config &config)
+{
/* basic machine hardware */
M68000(config, m_maincpu, XTAL(16'000'000)); /* verified on pcb */
m_maincpu->set_addrmap(AS_PROGRAM, &kaneko16_gtmr_state::gtmr_map);
- MCFG_TIMER_DRIVER_ADD_SCANLINE("scantimer", kaneko16_state, kaneko16_interrupt, "screen", 0, 1)
+ TIMER(config, "scantimer").configure_scanline(FUNC(kaneko16_state::kaneko16_interrupt), "screen", 0, 1);
MCFG_MACHINE_RESET_OVERRIDE(kaneko16_gtmr_state,gtmr)
@@ -2049,14 +2049,14 @@ MACHINE_CONFIG_START(kaneko16_gtmr_state::gtmr)
WATCHDOG_TIMER(config, m_watchdog);
/* video hardware */
- MCFG_SCREEN_ADD(m_screen, RASTER)
- MCFG_SCREEN_VIDEO_ATTRIBUTES(VIDEO_UPDATE_AFTER_VBLANK)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */)
- MCFG_SCREEN_SIZE(320, 240)
- MCFG_SCREEN_VISIBLE_AREA(0, 320-1, 0, 240-1)
- MCFG_SCREEN_UPDATE_DRIVER(kaneko16_state, screen_update_kaneko16)
- MCFG_SCREEN_PALETTE(m_palette)
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_video_attributes(VIDEO_UPDATE_AFTER_VBLANK);
+ m_screen->set_refresh_hz(60);
+ m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(2500) /* not accurate */);
+ m_screen->set_size(320, 240);
+ m_screen->set_visarea(0, 320-1, 0, 240-1);
+ m_screen->set_screen_update(FUNC(kaneko16_state::screen_update_kaneko16));
+ m_screen->set_palette(m_palette);
GFXDECODE(config, m_gfxdecode, m_palette, gfx_1x8bit_2x4bit);
PALETTE(config, m_palette).set_format(palette_device::xGRB_555, 32768);
@@ -2091,27 +2091,30 @@ MACHINE_CONFIG_START(kaneko16_gtmr_state::gtmr)
OKIM6295(config, m_oki[1], XTAL(16'000'000)/8, okim6295_device::PIN7_LOW); /* verified on pcb */
m_oki[1]->add_route(ALL_OUTPUTS, "mono", 0.5);
m_oki[1]->set_addrmap(0, &kaneko16_gtmr_state::gtmr_oki2_map);
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(kaneko16_gtmr_state::gtmre)
+void kaneko16_gtmr_state::gtmre(machine_config &config)
+{
gtmr(config);
m_toybox->set_table(kaneko_toybox_device::TABLE_ALT);
-MACHINE_CONFIG_END
+}
/***************************************************************************
Great 1000 Miles Rally 2
***************************************************************************/
-MACHINE_CONFIG_START(kaneko16_gtmr_state::gtmr2)
+void kaneko16_gtmr_state::gtmr2(machine_config &config)
+{
gtmre(config);
m_maincpu->set_addrmap(AS_PROGRAM, &kaneko16_gtmr_state::gtmr2_map);
-MACHINE_CONFIG_END
+}
/***************************************************************************
Blood Warrior
***************************************************************************/
-MACHINE_CONFIG_START(kaneko16_gtmr_state::bloodwar)
+void kaneko16_gtmr_state::bloodwar(machine_config &config)
+{
gtmr(config);
/* basic machine hardware */
@@ -2119,7 +2122,7 @@ MACHINE_CONFIG_START(kaneko16_gtmr_state::bloodwar)
MCFG_MACHINE_RESET_OVERRIDE(kaneko16_gtmr_state, gtmr)
m_kaneko_spr->set_priorities(2 /* never used? */ ,3 /* character selection / vs. portraits */ ,5 /* winning portrait*/ ,7 /* ? */);
-MACHINE_CONFIG_END
+}
@@ -2127,7 +2130,8 @@ MACHINE_CONFIG_END
Bonk's Adventure
***************************************************************************/
-MACHINE_CONFIG_START(kaneko16_gtmr_state::bonkadv)
+void kaneko16_gtmr_state::bonkadv(machine_config &config)
+{
gtmr(config);
/* basic machine hardware */
@@ -2138,17 +2142,18 @@ MACHINE_CONFIG_START(kaneko16_gtmr_state::bonkadv)
m_toybox->set_game_type(kaneko_toybox_device::GAME_BONK);
m_kaneko_hit->set_type(0);
-MACHINE_CONFIG_END
+}
/***************************************************************************
Magical Crystal
***************************************************************************/
-MACHINE_CONFIG_START(kaneko16_state::mgcrystl)
+void kaneko16_state::mgcrystl(machine_config &config)
+{
/* basic machine hardware */
M68000(config, m_maincpu, XTAL(12'000'000)); /* verified on pcb, TMP68HC000N-12 @U31 and X2 is 12MHz */
m_maincpu->set_addrmap(AS_PROGRAM, &kaneko16_state::mgcrystl_map);
- MCFG_TIMER_DRIVER_ADD_SCANLINE("scantimer", kaneko16_state, kaneko16_interrupt, "screen", 0, 1)
+ TIMER(config, "scantimer").configure_scanline(FUNC(kaneko16_state::kaneko16_interrupt), "screen", 0, 1);
MCFG_MACHINE_RESET_OVERRIDE(kaneko16_state,mgcrystl)
@@ -2157,14 +2162,14 @@ MACHINE_CONFIG_START(kaneko16_state::mgcrystl)
WATCHDOG_TIMER(config, m_watchdog);
/* video hardware */
- MCFG_SCREEN_ADD(m_screen, RASTER)
- MCFG_SCREEN_VIDEO_ATTRIBUTES(VIDEO_UPDATE_AFTER_VBLANK)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */)
- MCFG_SCREEN_SIZE(256, 256)
- MCFG_SCREEN_VISIBLE_AREA(0, 256-1, 0+16, 256-16-1)
- MCFG_SCREEN_UPDATE_DRIVER(kaneko16_state, screen_update_kaneko16)
- MCFG_SCREEN_PALETTE(m_palette)
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_video_attributes(VIDEO_UPDATE_AFTER_VBLANK);
+ m_screen->set_refresh_hz(60);
+ m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(2500) /* not accurate */);
+ m_screen->set_size(256, 256);
+ m_screen->set_visarea(0, 256-1, 0+16, 256-16-1);
+ m_screen->set_screen_update(FUNC(kaneko16_state::screen_update_kaneko16));
+ m_screen->set_palette(m_palette);
GFXDECODE(config, m_gfxdecode, m_palette, gfx_1x4bit_2x4bit);
PALETTE(config, m_palette).set_format(palette_device::xGRB_555, 2048);
@@ -2198,7 +2203,7 @@ MACHINE_CONFIG_START(kaneko16_state::mgcrystl)
OKIM6295(config, m_oki[0], XTAL(12'000'000)/6, okim6295_device::PIN7_HIGH); /* verified on pcb */
m_oki[0]->add_route(ALL_OUTPUTS, "mono", 1.0);
-MACHINE_CONFIG_END
+}
@@ -2261,12 +2266,12 @@ static const uint16_t shogwarr_default_eeprom[64] = {
0x0000, 0x0000, 0x0000, 0x0000, 0x0010, 0x0000, 0x0000, 0xFFFF
};
-MACHINE_CONFIG_START(kaneko16_shogwarr_state::shogwarr)
-
+void kaneko16_shogwarr_state::shogwarr(machine_config &config)
+{
/* basic machine hardware */
M68000(config, m_maincpu, XTAL(12'000'000));
m_maincpu->set_addrmap(AS_PROGRAM, &kaneko16_shogwarr_state::shogwarr_map);
- MCFG_TIMER_DRIVER_ADD_SCANLINE("scantimer", kaneko16_shogwarr_state, shogwarr_interrupt, "screen", 0, 1)
+ TIMER(config, "scantimer").configure_scanline(FUNC(kaneko16_shogwarr_state::shogwarr_interrupt), "screen", 0, 1);
MCFG_MACHINE_RESET_OVERRIDE(kaneko16_shogwarr_state,mgcrystl)
@@ -2275,14 +2280,14 @@ MACHINE_CONFIG_START(kaneko16_shogwarr_state::shogwarr)
WATCHDOG_TIMER(config, m_watchdog);
/* video hardware */
- MCFG_SCREEN_ADD(m_screen, RASTER)
- MCFG_SCREEN_REFRESH_RATE(59.1854)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(320, 240)
- MCFG_SCREEN_VISIBLE_AREA(40, 296-1, 16, 240-1)
- MCFG_SCREEN_UPDATE_DRIVER(kaneko16_state, screen_update_kaneko16)
- MCFG_SCREEN_PALETTE(m_palette)
- MCFG_SCREEN_VIDEO_ATTRIBUTES(VIDEO_UPDATE_AFTER_VBLANK)
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_refresh_hz(59.1854);
+ m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ m_screen->set_size(320, 240);
+ m_screen->set_visarea(40, 296-1, 16, 240-1);
+ m_screen->set_screen_update(FUNC(kaneko16_state::screen_update_kaneko16));
+ m_screen->set_palette(m_palette);
+ m_screen->set_video_attributes(VIDEO_UPDATE_AFTER_VBLANK);
GFXDECODE(config, m_gfxdecode, m_palette, gfx_1x4bit_1x4bit);
PALETTE(config, m_palette).set_format(palette_device::xGRB_555, 2048);
@@ -2315,7 +2320,7 @@ MACHINE_CONFIG_START(kaneko16_shogwarr_state::shogwarr)
OKIM6295(config, m_oki[1], XTAL(16'000'000)/8, okim6295_device::PIN7_LOW);
m_oki[1]->set_addrmap(0, &kaneko16_shogwarr_state::gtmr_oki2_map);
m_oki[1]->add_route(ALL_OUTPUTS, "mono", 1.0);
-MACHINE_CONFIG_END
+}
static const uint16_t brapboys_default_eeprom[64] = {
diff --git a/src/mame/drivers/kangaroo.cpp b/src/mame/drivers/kangaroo.cpp
index 62fff7f69c5..c0d8de228bf 100644
--- a/src/mame/drivers/kangaroo.cpp
+++ b/src/mame/drivers/kangaroo.cpp
@@ -418,24 +418,24 @@ INPUT_PORTS_END
*
*************************************/
-MACHINE_CONFIG_START(kangaroo_state::nomcu)
-
+void kangaroo_state::nomcu(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, MASTER_CLOCK/4)
- MCFG_DEVICE_PROGRAM_MAP(main_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", kangaroo_state, irq0_line_hold)
+ Z80(config, m_maincpu, MASTER_CLOCK/4);
+ m_maincpu->set_addrmap(AS_PROGRAM, &kangaroo_state::main_map);
+ m_maincpu->set_vblank_int("screen", FUNC(kangaroo_state::irq0_line_hold));
- MCFG_DEVICE_ADD("audiocpu", Z80, MASTER_CLOCK/8)
- MCFG_DEVICE_PROGRAM_MAP(sound_map)
- MCFG_DEVICE_IO_MAP(sound_map) // yes, this is identical
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", kangaroo_state, irq0_line_hold)
+ z80_device &audiocpu(Z80(config, "audiocpu", MASTER_CLOCK/8));
+ audiocpu.set_addrmap(AS_PROGRAM, &kangaroo_state::sound_map);
+ audiocpu.set_addrmap(AS_IO, &kangaroo_state::sound_map); // yes, this is identical
+ audiocpu.set_vblank_int("screen", FUNC(kangaroo_state::irq0_line_hold));
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_VIDEO_ATTRIBUTES(VIDEO_UPDATE_SCANLINE)
- MCFG_SCREEN_RAW_PARAMS(MASTER_CLOCK, 320*2, 0*2, 256*2, 260, 8, 248)
- MCFG_SCREEN_UPDATE_DRIVER(kangaroo_state, screen_update_kangaroo)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_video_attributes(VIDEO_UPDATE_SCANLINE);
+ screen.set_raw(MASTER_CLOCK, 320*2, 0*2, 256*2, 260, 8, 248);
+ screen.set_screen_update(FUNC(kangaroo_state::screen_update_kangaroo));
PALETTE(config, m_palette, palette_device::BGR_3BIT);
@@ -445,17 +445,17 @@ MACHINE_CONFIG_START(kangaroo_state::nomcu)
GENERIC_LATCH_8(config, "soundlatch");
AY8910(config, "aysnd", MASTER_CLOCK/8).add_route(ALL_OUTPUTS, "mono", 0.50);
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(kangaroo_state::mcu)
+void kangaroo_state::mcu(machine_config &config)
+{
nomcu(config);
MCFG_MACHINE_START_OVERRIDE(kangaroo_state,kangaroo_mcu)
- MCFG_DEVICE_ADD("mcu", MB8841, MASTER_CLOCK/4/2)
- MCFG_DEVICE_DISABLE()
-MACHINE_CONFIG_END
+ MB8841(config, "mcu", MASTER_CLOCK/4/2).set_disable();
+}
diff --git a/src/mame/drivers/karnov.cpp b/src/mame/drivers/karnov.cpp
index 0836e82942a..cb058bed589 100644
--- a/src/mame/drivers/karnov.cpp
+++ b/src/mame/drivers/karnov.cpp
@@ -769,10 +769,10 @@ void karnov_state::machine_reset()
void karnov_state::karnov(machine_config &config)
{
/* basic machine hardware */
- M68000(config, m_maincpu, 10000000); /* 10 MHz */
+ M68000(config, m_maincpu, 10000000); /* 10 MHz */
m_maincpu->set_addrmap(AS_PROGRAM, &karnov_state::karnov_map);
- M6502(config, m_audiocpu, 1500000); /* Accurate */
+ M6502(config, m_audiocpu, 1500000); /* Accurate */
m_audiocpu->set_addrmap(AS_PROGRAM, &karnov_state::karnov_sound_map);
/* video hardware */
diff --git a/src/mame/drivers/kas89.cpp b/src/mame/drivers/kas89.cpp
index fffa09cd05e..5de1f4a17af 100644
--- a/src/mame/drivers/kas89.cpp
+++ b/src/mame/drivers/kas89.cpp
@@ -767,18 +767,18 @@ INPUT_PORTS_END
* Machine Driver *
**************************************/
-MACHINE_CONFIG_START(kas89_state::kas89)
-
+void kas89_state::kas89(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, MASTER_CLOCK/6) /* Confirmed */
- MCFG_DEVICE_PROGRAM_MAP(kas89_map)
- MCFG_DEVICE_IO_MAP(kas89_io)
- MCFG_TIMER_DRIVER_ADD_PERIODIC("kas89_nmi", kas89_state, kas89_nmi_cb, attotime::from_hz(138))
+ Z80(config, m_maincpu, MASTER_CLOCK/6); /* Confirmed */
+ m_maincpu->set_addrmap(AS_PROGRAM, &kas89_state::kas89_map);
+ m_maincpu->set_addrmap(AS_IO, &kas89_state::kas89_io);
+ TIMER(config, "kas89_nmi").configure_periodic(FUNC(kas89_state::kas89_nmi_cb), attotime::from_hz(138));
- MCFG_DEVICE_ADD("audiocpu", Z80, MASTER_CLOCK/6) /* Confirmed */
- MCFG_DEVICE_PROGRAM_MAP(audio_map)
- MCFG_DEVICE_IO_MAP(audio_io)
- MCFG_TIMER_DRIVER_ADD_PERIODIC("kas89_snmi", kas89_state, kas89_sound_nmi_cb, attotime::from_hz(138))
+ Z80(config, m_audiocpu, MASTER_CLOCK/6); /* Confirmed */
+ m_audiocpu->set_addrmap(AS_PROGRAM, &kas89_state::audio_map);
+ m_audiocpu->set_addrmap(AS_IO, &kas89_state::audio_io);
+ TIMER(config, "kas89_snmi").configure_periodic(FUNC(kas89_state::kas89_sound_nmi_cb), attotime::from_hz(138));
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
@@ -795,7 +795,7 @@ MACHINE_CONFIG_START(kas89_state::kas89)
GENERIC_LATCH_8(config, m_soundlatch);
AY8910(config, "aysnd", MASTER_CLOCK/12).add_route(ALL_OUTPUTS, "mono", 1.0); /* Confirmed */
-MACHINE_CONFIG_END
+}
/**************************************
diff --git a/src/mame/drivers/kaypro.cpp b/src/mame/drivers/kaypro.cpp
index 407c985cfa4..76fad038721 100644
--- a/src/mame/drivers/kaypro.cpp
+++ b/src/mame/drivers/kaypro.cpp
@@ -206,34 +206,35 @@ MACHINE_CONFIG_START(kaypro_state::kayproii)
MCFG_MACHINE_RESET_OVERRIDE(kaypro_state, kaypro )
/* video hardware */
- MCFG_SCREEN_ADD_MONOCHROME("screen", RASTER, rgb_t::green())
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(80*7, 24*10)
- MCFG_SCREEN_VISIBLE_AREA(0,80*7-1,0,24*10-1)
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER, rgb_t::green());
+ m_screen->set_refresh_hz(60);
+ m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ m_screen->set_size(80*7, 24*10);
+ m_screen->set_visarea(0, 80*7-1, 0, 24*10-1);
+ m_screen->set_screen_update(FUNC(kaypro_state::screen_update_kayproii));
+ m_screen->set_palette(m_palette);
+
MCFG_VIDEO_START_OVERRIDE(kaypro_state, kaypro )
- MCFG_SCREEN_UPDATE_DRIVER(kaypro_state, screen_update_kayproii)
- MCFG_SCREEN_PALETTE(m_palette)
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_kayproii)
+ GFXDECODE(config, "gfxdecode", m_palette, gfx_kayproii);
PALETTE(config, m_palette, palette_device::MONOCHROME);
/* sound hardware */
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("beeper", BEEP, 950) /* piezo-device needs to be measured */
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.00)
+ BEEP(config, m_beep, 950).add_route(ALL_OUTPUTS, "mono", 1.00); /* piezo-device needs to be measured */
/* devices */
- MCFG_QUICKLOAD_ADD("quickload", kaypro_state, kaypro, "com,cpm", 3)
+ MCFG_QUICKLOAD_ADD("quickload", kaypro_state, kaypro, "com,cpm", attotime::from_seconds(3))
kaypro_10_keyboard_device &kbd(KAYPRO_10_KEYBOARD(config, "kbd"));
kbd.rxd_cb().set("sio", FUNC(z80sio_device::rxb_w));
kbd.rxd_cb().append("sio", FUNC(z80sio_device::syncb_w));
- MCFG_DEVICE_ADD(m_centronics, CENTRONICS, centronics_devices, "printer")
- MCFG_CENTRONICS_BUSY_HANDLER(WRITELINE(*this, kaypro_state, write_centronics_busy))
+ CENTRONICS(config, m_centronics, centronics_devices, "printer");
+ m_centronics->busy_handler().set(FUNC(kaypro_state::write_centronics_busy));
- MCFG_CENTRONICS_OUTPUT_LATCH_ADD("cent_data_out", "centronics")
+ output_latch_device &latch(OUTPUT_LATCH(config, "cent_data_out"));
+ m_centronics->set_output_latch(latch);
rs232_port_device &serial(RS232_PORT(config, "serial", default_rs232_devices, nullptr));
serial.rxd_handler().set("sio", FUNC(z80sio_device::rxa_w));
@@ -266,23 +267,21 @@ MACHINE_CONFIG_START(kaypro_state::kayproii)
m_fdc->intrq_wr_callback().set(FUNC(kaypro_state::fdc_intrq_w));
m_fdc->drq_wr_callback().set(FUNC(kaypro_state::fdc_drq_w));
m_fdc->set_force_ready(true);
- MCFG_FLOPPY_DRIVE_ADD("fdc:0", kaypro_floppies, "525ssdd", floppy_image_device::default_floppy_formats)
- MCFG_FLOPPY_DRIVE_SOUND(true)
- MCFG_FLOPPY_DRIVE_ADD("fdc:1", kaypro_floppies, "525ssdd", floppy_image_device::default_floppy_formats)
- MCFG_FLOPPY_DRIVE_SOUND(true)
- MCFG_SOFTWARE_LIST_ADD("flop_list","kayproii")
+ FLOPPY_CONNECTOR(config, "fdc:0", kaypro_floppies, "525ssdd", floppy_image_device::default_floppy_formats).enable_sound(true);
+ FLOPPY_CONNECTOR(config, "fdc:1", kaypro_floppies, "525ssdd", floppy_image_device::default_floppy_formats).enable_sound(true);
+ SOFTWARE_LIST(config, "flop_list").set_original("kayproii");
MACHINE_CONFIG_END
-MACHINE_CONFIG_START(kaypro_state::kayproiv)
+void kaypro_state::kayproiv(machine_config &config)
+{
kayproii(config);
m_pio_s->set_clock(2500000);
m_pio_s->out_pa_callback().set(FUNC(kaypro_state::kayproiv_pio_system_w));
- MCFG_DEVICE_REMOVE("fdc:0")
- MCFG_DEVICE_REMOVE("fdc:1")
- MCFG_FLOPPY_DRIVE_ADD("fdc:0", kaypro_floppies, "525dd", floppy_image_device::default_floppy_formats)
- MCFG_FLOPPY_DRIVE_SOUND(true)
- MCFG_FLOPPY_DRIVE_ADD("fdc:1", kaypro_floppies, "525dd", floppy_image_device::default_floppy_formats)
-MACHINE_CONFIG_END
+ config.device_remove("fdc:0");
+ config.device_remove("fdc:1");
+ FLOPPY_CONNECTOR(config, "fdc:0", kaypro_floppies, "525dd", floppy_image_device::default_floppy_formats).enable_sound(true);
+ FLOPPY_CONNECTOR(config, "fdc:1", kaypro_floppies, "525dd", floppy_image_device::default_floppy_formats);
+}
MACHINE_CONFIG_START(kaypro_state::kaypro484)
/* basic machine hardware */
@@ -294,13 +293,14 @@ MACHINE_CONFIG_START(kaypro_state::kaypro484)
MCFG_MACHINE_RESET_OVERRIDE(kaypro_state, kaypro )
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(80*8, 25*16)
- MCFG_SCREEN_VISIBLE_AREA(0,80*8-1,0,25*16-1)
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_refresh_hz(60);
+ m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ m_screen->set_size(80*8, 25*16);
+ m_screen->set_visarea(0,80*8-1,0,25*16-1);
+ m_screen->set_screen_update(FUNC(kaypro_state::screen_update_kaypro484));
+
MCFG_VIDEO_START_OVERRIDE(kaypro_state, kaypro )
- MCFG_SCREEN_UPDATE_DRIVER(kaypro_state, screen_update_kaypro484)
GFXDECODE(config, "gfxdecode", m_palette, gfx_kaypro484);
PALETTE(config, m_palette, FUNC(kaypro_state::kaypro_palette), 3);
@@ -316,7 +316,7 @@ MACHINE_CONFIG_START(kaypro_state::kaypro484)
m_crtc->set_char_width(7);
m_crtc->set_update_row_callback(FUNC(kaypro_state::kaypro484_update_row), this);
- MCFG_QUICKLOAD_ADD("quickload", kaypro_state, kaypro, "com,cpm", 3)
+ MCFG_QUICKLOAD_ADD("quickload", kaypro_state, kaypro, "com,cpm", attotime::from_seconds(3))
kaypro_10_keyboard_device &kbd(KAYPRO_10_KEYBOARD(config, "kbd"));
kbd.rxd_cb().set("sio_1", FUNC(z80sio_device::rxb_w));
@@ -324,10 +324,11 @@ MACHINE_CONFIG_START(kaypro_state::kaypro484)
CLOCK(config, "kbdtxrxc", 4800).signal_handler().set("sio_1", FUNC(z80sio_device::rxtxcb_w));
- MCFG_DEVICE_ADD(m_centronics, CENTRONICS, centronics_devices, "printer")
- MCFG_CENTRONICS_BUSY_HANDLER(WRITELINE(*this, kaypro_state, write_centronics_busy))
+ CENTRONICS(config, m_centronics, centronics_devices, "printer");
+ m_centronics->busy_handler().set(FUNC(kaypro_state::write_centronics_busy));
- MCFG_CENTRONICS_OUTPUT_LATCH_ADD("cent_data_out", "centronics")
+ output_latch_device &latch(OUTPUT_LATCH(config, "cent_data_out"));
+ m_centronics->set_output_latch(latch);
rs232_port_device &modem(RS232_PORT(config, "modem", default_rs232_devices, nullptr));
modem.rxd_handler().set("sio_1", FUNC(z80sio_device::rxa_w));
@@ -361,38 +362,37 @@ MACHINE_CONFIG_START(kaypro_state::kaypro484)
m_fdc->intrq_wr_callback().set(FUNC(kaypro_state::fdc_intrq_w));
m_fdc->drq_wr_callback().set(FUNC(kaypro_state::fdc_drq_w));
m_fdc->set_force_ready(true);
- MCFG_FLOPPY_DRIVE_ADD("fdc:0", kaypro_floppies, "525dd", floppy_image_device::default_floppy_formats)
- MCFG_FLOPPY_DRIVE_SOUND(true)
- MCFG_FLOPPY_DRIVE_ADD("fdc:1", kaypro_floppies, "525dd", floppy_image_device::default_floppy_formats)
- MCFG_FLOPPY_DRIVE_SOUND(true)
+ FLOPPY_CONNECTOR(config, "fdc:0", kaypro_floppies, "525dd", floppy_image_device::default_floppy_formats).enable_sound(true);
+ FLOPPY_CONNECTOR(config, "fdc:1", kaypro_floppies, "525dd", floppy_image_device::default_floppy_formats).enable_sound(true);
MACHINE_CONFIG_END
-MACHINE_CONFIG_START(kaypro_state::kaypro10)
+void kaypro_state::kaypro10(machine_config &config)
+{
kaypro484(config);
- MCFG_DEVICE_REMOVE("fdc:1") // only has 1 floppy drive
+ config.device_remove("fdc:1"); // only has 1 floppy drive
// need to add hard drive & controller
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(kaypro_state::kaypronew2)
+void kaypro_state::kaypronew2(machine_config &config)
+{
kaypro484(config);
- MCFG_DEVICE_REMOVE("fdc:1") // only has 1 floppy drive
-MACHINE_CONFIG_END
+ config.device_remove("fdc:1"); // only has 1 floppy drive
+}
-MACHINE_CONFIG_START(kaypro_state::kaypro284)
+void kaypro_state::kaypro284(machine_config &config)
+{
kaypro484(config);
- MCFG_DEVICE_REMOVE("fdc:0")
- MCFG_DEVICE_REMOVE("fdc:1")
- MCFG_FLOPPY_DRIVE_ADD("fdc:0", kaypro_floppies, "525ssdd", floppy_image_device::default_floppy_formats)
- MCFG_FLOPPY_DRIVE_SOUND(true)
- MCFG_FLOPPY_DRIVE_ADD("fdc:1", kaypro_floppies, "525ssdd", floppy_image_device::default_floppy_formats)
- MCFG_FLOPPY_DRIVE_SOUND(true)
-MACHINE_CONFIG_END
+ config.device_remove("fdc:0");
+ config.device_remove("fdc:1");
+ FLOPPY_CONNECTOR(config, "fdc:0", kaypro_floppies, "525ssdd", floppy_image_device::default_floppy_formats).enable_sound(true);
+ FLOPPY_CONNECTOR(config, "fdc:1", kaypro_floppies, "525ssdd", floppy_image_device::default_floppy_formats).enable_sound(true);
+}
-MACHINE_CONFIG_START(kaypro_state::omni2)
+void kaypro_state::omni2(machine_config &config)
+{
kayproiv(config);
- MCFG_SCREEN_MODIFY("screen")
- MCFG_SCREEN_UPDATE_DRIVER(kaypro_state, screen_update_omni2)
-MACHINE_CONFIG_END
+ m_screen->set_screen_update(FUNC(kaypro_state::screen_update_omni2));
+}
void kaypro_state::init_kaypro()
{
diff --git a/src/mame/drivers/kc.cpp b/src/mame/drivers/kc.cpp
index 7fbf8fed1ec..38bebdf1a0a 100644
--- a/src/mame/drivers/kc.cpp
+++ b/src/mame/drivers/kc.cpp
@@ -96,14 +96,15 @@ void kc85_exp(device_slot_interface &device)
}
-MACHINE_CONFIG_START(kc_state::kc85_3)
+void kc_state::kc85_3(machine_config &config)
+{
/* basic machine hardware */
Z80(config, m_maincpu, KC85_3_CLOCK);
m_maincpu->set_addrmap(AS_PROGRAM, &kc_state::kc85_3_mem);
m_maincpu->set_addrmap(AS_IO, &kc_state::kc85_3_io);
m_maincpu->set_daisy_config(kc85_daisy_chain);
- MCFG_QUANTUM_TIME(attotime::from_hz(60))
+ config.m_minimum_quantum = attotime::from_hz(60);
Z80PIO(config, m_z80pio, KC85_3_CLOCK);
m_z80pio->out_int_callback().set_inputline(m_maincpu, 0);
@@ -121,11 +122,11 @@ MACHINE_CONFIG_START(kc_state::kc85_3)
m_z80ctc->zc_callback<2>().set(FUNC(kc_state::video_toggle_blink_state));
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_RAW_PARAMS(XTAL(28'375'160)/2, 908, 0, 320, 312, 0, 256)
- MCFG_SCREEN_UPDATE_DRIVER(kc_state, screen_update)
- MCFG_SCREEN_PALETTE("palette")
- MCFG_TIMER_DRIVER_ADD_SCANLINE("scantimer", kc_state, kc_scanline, "screen", 0, 1)
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_raw(XTAL(28'375'160)/2, 908, 0, 320, 312, 0, 256);
+ m_screen->set_screen_update(FUNC(kc_state::screen_update));
+ m_screen->set_palette("palette");
+ TIMER(config, "scantimer").configure_scanline(FUNC(kc_state::kc_scanline), "screen", 0, 1);
PALETTE(config, "palette", FUNC(kc_state::kc85_palette), KC85_PALETTE_SIZE);
@@ -134,56 +135,55 @@ MACHINE_CONFIG_START(kc_state::kc85_3)
/* sound hardware */
SPEAKER(config, "mono").front_center();
- WAVE(config, "wave", "cassette").add_route(ALL_OUTPUTS, "mono", 0.25);
+ WAVE(config, "wave", m_cassette).add_route(ALL_OUTPUTS, "mono", 0.25);
SPEAKER_SOUND(config, "speaker").add_route(ALL_OUTPUTS, "mono", 0.50);
/* devices */
- MCFG_QUICKLOAD_ADD("quickload", kc_state, kc, "kcc", 2)
+ quickload_image_device &quickload(QUICKLOAD(config, "quickload", 0));
+ quickload.set_handler(snapquick_load_delegate(&QUICKLOAD_LOAD_NAME(kc_state, kc), this), "kcc", attotime::from_seconds(2));
- MCFG_CASSETTE_ADD( "cassette" )
- MCFG_CASSETTE_FORMATS(kc_cassette_formats)
- MCFG_CASSETTE_DEFAULT_STATE(CASSETTE_PLAY)
- MCFG_CASSETTE_INTERFACE("kc_cass")
+ CASSETTE(config, m_cassette);
+ m_cassette->set_formats(kc_cassette_formats);
+ m_cassette->set_default_state(CASSETTE_PLAY);
+ m_cassette->set_interface("kc_cass");
/* cartridge slot */
- MCFG_DEVICE_ADD("m8", KCCART_SLOT, 0)
- MCFG_DEVICE_SLOT_INTERFACE(kc85_cart, "m011", false)
- MCFG_KCCART_SLOT_NEXT_SLOT("mc")
- MCFG_KCCART_SLOT_OUT_IRQ_CB(INPUTLINE("maincpu", 0))
- MCFG_KCCART_SLOT_OUT_NMI_CB(INPUTLINE("maincpu", INPUT_LINE_NMI))
- MCFG_KCCART_SLOT_OUT_HALT_CB(INPUTLINE("maincpu", INPUT_LINE_HALT))
- MCFG_DEVICE_ADD("mc", KCCART_SLOT, 0)
- MCFG_DEVICE_SLOT_INTERFACE(kc85_cart, nullptr, false)
- MCFG_KCCART_SLOT_NEXT_SLOT("exp")
- MCFG_KCCART_SLOT_OUT_IRQ_CB(INPUTLINE("maincpu", 0))
- MCFG_KCCART_SLOT_OUT_NMI_CB(INPUTLINE("maincpu", INPUT_LINE_NMI))
- MCFG_KCCART_SLOT_OUT_HALT_CB(INPUTLINE("maincpu", INPUT_LINE_HALT))
+ KCCART_SLOT(config, m_expansions[0], kc85_cart, "m011");
+ m_expansions[0]->set_next_slot("mc");
+ m_expansions[0]->irq().set_inputline(m_maincpu, 0);
+ m_expansions[0]->nmi().set_inputline(m_maincpu, INPUT_LINE_NMI);
+ m_expansions[0]->halt().set_inputline(m_maincpu, INPUT_LINE_HALT);
+
+ KCCART_SLOT(config, m_expansions[1], kc85_cart, nullptr);
+ m_expansions[1]->set_next_slot("exp");
+ m_expansions[1]->irq().set_inputline(m_maincpu, 0);
+ m_expansions[1]->nmi().set_inputline(m_maincpu, INPUT_LINE_NMI);
+ m_expansions[1]->halt().set_inputline(m_maincpu, INPUT_LINE_HALT);
/* expansion interface */
- MCFG_DEVICE_ADD("exp", KCEXP_SLOT, 0)
- MCFG_DEVICE_SLOT_INTERFACE(kc85_exp, nullptr, false)
- MCFG_KCEXP_SLOT_NEXT_SLOT(nullptr)
- MCFG_KCEXP_SLOT_OUT_IRQ_CB(INPUTLINE("maincpu", 0))
- MCFG_KCEXP_SLOT_OUT_NMI_CB(INPUTLINE("maincpu", INPUT_LINE_NMI))
- MCFG_KCEXP_SLOT_OUT_HALT_CB(INPUTLINE("maincpu", INPUT_LINE_HALT))
+ KCEXP_SLOT(config, m_expansions[2], kc85_exp, nullptr);
+ m_expansions[2]->set_next_slot(nullptr);
+ m_expansions[2]->irq().set_inputline(m_maincpu, 0);
+ m_expansions[2]->nmi().set_inputline(m_maincpu, INPUT_LINE_NMI);
+ m_expansions[2]->halt().set_inputline(m_maincpu, INPUT_LINE_HALT);
/* Software lists */
- MCFG_SOFTWARE_LIST_ADD("cart_list", "kc_cart")
- MCFG_SOFTWARE_LIST_ADD("flop_list", "kc_flop")
- MCFG_SOFTWARE_LIST_ADD("cass_list", "kc_cass")
+ SOFTWARE_LIST(config, "cart_list").set_original("kc_cart");
+ SOFTWARE_LIST(config, "flop_list").set_original("kc_flop");
+ SOFTWARE_LIST(config, "cass_list").set_original("kc_cass");
/* internal ram */
RAM(config, m_ram).set_default_size("16K");
-MACHINE_CONFIG_END
-
+}
-MACHINE_CONFIG_START(kc85_4_state::kc85_4)
+void kc85_4_state::kc85_4(machine_config &config)
+{
/* basic machine hardware */
Z80(config, m_maincpu, KC85_4_CLOCK);
m_maincpu->set_addrmap(AS_PROGRAM, &kc85_4_state::kc85_4_mem);
m_maincpu->set_addrmap(AS_IO, &kc85_4_state::kc85_4_io);
m_maincpu->set_daisy_config(kc85_daisy_chain);
- MCFG_QUANTUM_TIME(attotime::from_hz(60))
+ config.m_minimum_quantum = attotime::from_hz(60);
Z80PIO(config, m_z80pio, KC85_4_CLOCK);
m_z80pio->out_int_callback().set_inputline(m_maincpu, 0);
@@ -201,11 +201,11 @@ MACHINE_CONFIG_START(kc85_4_state::kc85_4)
m_z80ctc->zc_callback<2>().set(FUNC(kc_state::video_toggle_blink_state));
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_RAW_PARAMS(XTAL(28'375'160)/2, 908, 0, 320, 312, 0, 256)
- MCFG_SCREEN_UPDATE_DRIVER(kc85_4_state, screen_update)
- MCFG_SCREEN_PALETTE("palette")
- MCFG_TIMER_DRIVER_ADD_SCANLINE("scantimer", kc85_4_state, kc_scanline, "screen", 0, 1)
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_raw(XTAL(28'375'160)/2, 908, 0, 320, 312, 0, 256);
+ m_screen->set_screen_update(FUNC(kc85_4_state::screen_update));
+ m_screen->set_palette("palette");
+ TIMER(config, "scantimer").configure_scanline(FUNC(kc85_4_state::kc_scanline), "screen", 0, 1);
PALETTE(config, "palette", FUNC(kc85_4_state::kc85_palette), KC85_PALETTE_SIZE);
@@ -214,47 +214,46 @@ MACHINE_CONFIG_START(kc85_4_state::kc85_4)
/* sound hardware */
SPEAKER(config, "mono").front_center();
- WAVE(config, "wave", "cassette").add_route(ALL_OUTPUTS, "mono", 0.25);
+ WAVE(config, "wave", m_cassette).add_route(ALL_OUTPUTS, "mono", 0.25);
SPEAKER_SOUND(config, "speaker").add_route(ALL_OUTPUTS, "mono", 0.50);
/* devices */
- MCFG_QUICKLOAD_ADD("quickload", kc_state, kc, "kcc", 2)
+ quickload_image_device &quickload(QUICKLOAD(config, "quickload"));
+ quickload.set_handler(snapquick_load_delegate(&QUICKLOAD_LOAD_NAME(kc_state, kc), this), "kcc", attotime::from_seconds(2));
- MCFG_CASSETTE_ADD( "cassette" )
- MCFG_CASSETTE_FORMATS(kc_cassette_formats)
- MCFG_CASSETTE_DEFAULT_STATE(CASSETTE_PLAY)
- MCFG_CASSETTE_INTERFACE("kc_cass")
+ CASSETTE(config, m_cassette);
+ m_cassette->set_formats(kc_cassette_formats);
+ m_cassette->set_default_state(CASSETTE_PLAY);
+ m_cassette->set_interface("kc_cass");
/* cartridge slot */
- MCFG_DEVICE_ADD("m8", KCCART_SLOT, 0)
- MCFG_DEVICE_SLOT_INTERFACE(kc85_cart, "m011", false)
- MCFG_KCCART_SLOT_NEXT_SLOT("mc")
- MCFG_KCCART_SLOT_OUT_IRQ_CB(INPUTLINE("maincpu", 0))
- MCFG_KCCART_SLOT_OUT_NMI_CB(INPUTLINE("maincpu", INPUT_LINE_NMI))
- MCFG_KCCART_SLOT_OUT_HALT_CB(INPUTLINE("maincpu", INPUT_LINE_HALT))
- MCFG_DEVICE_ADD("mc", KCCART_SLOT, 0)
- MCFG_DEVICE_SLOT_INTERFACE(kc85_cart, nullptr, false)
- MCFG_KCCART_SLOT_NEXT_SLOT("exp")
- MCFG_KCCART_SLOT_OUT_IRQ_CB(INPUTLINE("maincpu", 0))
- MCFG_KCCART_SLOT_OUT_NMI_CB(INPUTLINE("maincpu", INPUT_LINE_NMI))
- MCFG_KCCART_SLOT_OUT_HALT_CB(INPUTLINE("maincpu", INPUT_LINE_HALT))
+ KCCART_SLOT(config, m_expansions[0], kc85_cart, "m011");
+ m_expansions[0]->set_next_slot("mc");
+ m_expansions[0]->irq().set_inputline(m_maincpu, 0);
+ m_expansions[0]->nmi().set_inputline(m_maincpu, INPUT_LINE_NMI);
+ m_expansions[0]->halt().set_inputline(m_maincpu, INPUT_LINE_HALT);
+
+ KCCART_SLOT(config, m_expansions[1], kc85_cart, nullptr);
+ m_expansions[1]->set_next_slot("exp");
+ m_expansions[1]->irq().set_inputline(m_maincpu, 0);
+ m_expansions[1]->nmi().set_inputline(m_maincpu, INPUT_LINE_NMI);
+ m_expansions[1]->halt().set_inputline(m_maincpu, INPUT_LINE_HALT);
/* expansion interface */
- MCFG_DEVICE_ADD("exp", KCEXP_SLOT, 0)
- MCFG_DEVICE_SLOT_INTERFACE(kc85_exp, nullptr, false)
- MCFG_KCEXP_SLOT_NEXT_SLOT(nullptr)
- MCFG_KCEXP_SLOT_OUT_IRQ_CB(INPUTLINE("maincpu", 0))
- MCFG_KCEXP_SLOT_OUT_NMI_CB(INPUTLINE("maincpu", INPUT_LINE_NMI))
- MCFG_KCEXP_SLOT_OUT_HALT_CB(INPUTLINE("maincpu", INPUT_LINE_HALT))
+ KCEXP_SLOT(config, m_expansions[2], kc85_exp, nullptr);
+ m_expansions[2]->set_next_slot(nullptr);
+ m_expansions[2]->irq().set_inputline(m_maincpu, 0);
+ m_expansions[2]->nmi().set_inputline(m_maincpu, INPUT_LINE_NMI);
+ m_expansions[2]->halt().set_inputline(m_maincpu, INPUT_LINE_HALT);
/* Software lists */
- MCFG_SOFTWARE_LIST_ADD("cart_list", "kc_cart")
- MCFG_SOFTWARE_LIST_ADD("flop_list", "kc_flop")
- MCFG_SOFTWARE_LIST_ADD("cass_list", "kc_cass")
+ SOFTWARE_LIST(config, "cart_list").set_original("kc_cart");
+ SOFTWARE_LIST(config, "flop_list").set_original("kc_flop");
+ SOFTWARE_LIST(config, "cass_list").set_original("kc_cass");
/* internal ram */
RAM(config, m_ram).set_default_size("64K");
-MACHINE_CONFIG_END
+}
void kc85_4_state::kc85_5(machine_config &config)
{
diff --git a/src/mame/drivers/kchamp.cpp b/src/mame/drivers/kchamp.cpp
index b60421bca77..8c4a19ef8b3 100644
--- a/src/mame/drivers/kchamp.cpp
+++ b/src/mame/drivers/kchamp.cpp
@@ -92,11 +92,11 @@ WRITE_LINE_MEMBER(kchamp_state::sound_reset_w)
{
m_ay[0]->reset();
m_ay[1]->reset();
- sound_control_w(machine().dummy_space(), 0, 0);
+ sound_control_w(0);
}
}
-WRITE8_MEMBER(kchamp_state::sound_control_w)
+void kchamp_state::sound_control_w(u8 data)
{
m_msm->reset_w(!(data & 1));
m_sound_nmi_enable = ((data >> 1) & 1);
@@ -404,18 +404,19 @@ void kchamp_state::machine_reset()
m_sound_nmi_enable = 0;
}
-MACHINE_CONFIG_START(kchamp_state::kchampvs)
-
+void kchamp_state::kchampvs(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, XTAL(12'000'000)/4) /* verified on pcb */
- MCFG_DEVICE_PROGRAM_MAP(kchampvs_map)
- MCFG_DEVICE_IO_MAP(kchampvs_io_map)
- MCFG_DEVICE_OPCODES_MAP(decrypted_opcodes_map)
+ Z80(config, m_maincpu, XTAL(12'000'000)/4); /* verified on pcb */
+ m_maincpu->set_addrmap(AS_PROGRAM, &kchamp_state::kchampvs_map);
+ m_maincpu->set_addrmap(AS_IO, &kchamp_state::kchampvs_io_map);
+ m_maincpu->set_addrmap(AS_OPCODES, &kchamp_state::decrypted_opcodes_map);
- MCFG_DEVICE_ADD("audiocpu", Z80, XTAL(12'000'000)/4) /* verified on pcb */
- MCFG_DEVICE_PROGRAM_MAP(kchampvs_sound_map)
- MCFG_DEVICE_IO_MAP(kchampvs_sound_io_map) /* irq's triggered from main cpu */
- /* nmi's from msm5205 */
+ Z80(config, m_audiocpu, XTAL(12'000'000)/4); /* verified on pcb */
+ m_audiocpu->set_addrmap(AS_PROGRAM, &kchamp_state::kchampvs_sound_map);
+ m_audiocpu->set_addrmap(AS_IO, &kchamp_state::kchampvs_sound_io_map);
+ /* IRQs triggered from main CPU */
+ /* NMIs from MSM5205 */
ls259_device &mainlatch(LS259(config, "mainlatch")); // 8C
mainlatch.q_out_cb<0>().set(FUNC(kchamp_state::flipscreen_w));
@@ -425,16 +426,16 @@ MACHINE_CONFIG_START(kchamp_state::kchampvs)
MCFG_MACHINE_START_OVERRIDE(kchamp_state,kchampvs)
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(59.10) /* verified on pcb */
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(32*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0, 32*8-1, 2*8, 30*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(kchamp_state, screen_update_kchampvs)
- MCFG_SCREEN_PALETTE(m_palette)
- MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE(*this, kchamp_state, vblank_irq))
-
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, m_palette, gfx_kchamp)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(59.10); /* verified on pcb */
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(32*8, 32*8);
+ screen.set_visarea(0, 32*8-1, 2*8, 30*8-1);
+ screen.set_screen_update(FUNC(kchamp_state::screen_update_kchampvs));
+ screen.set_palette(m_palette);
+ screen.screen_vblank().set(FUNC(kchamp_state::vblank_irq));
+
+ GFXDECODE(config, m_gfxdecode, m_palette, gfx_kchamp);
PALETTE(config, m_palette, FUNC(kchamp_state::kchamp_palette), 256);
/* sound hardware */
@@ -444,35 +445,34 @@ MACHINE_CONFIG_START(kchamp_state::kchampvs)
m_soundlatch->data_pending_callback().set_inputline(m_audiocpu, 0);
AY8910(config, m_ay[0], XTAL(12'000'000)/8).add_route(ALL_OUTPUTS, "speaker", 0.3); /* verified on pcb */
-
AY8910(config, m_ay[1], XTAL(12'000'000)/8).add_route(ALL_OUTPUTS, "speaker", 0.3); /* verified on pcb */
LS157(config, m_adpcm_select, 0); // at 4C
m_adpcm_select->out_callback().set("msm", FUNC(msm5205_device::data_w));
- MCFG_DEVICE_ADD("msm", MSM5205, 375000) /* verified on pcb, discrete circuit clock */
- MCFG_MSM5205_VCK_CALLBACK(WRITELINE(*this, kchamp_state, msmint)) /* interrupt function */
- MCFG_MSM5205_PRESCALER_SELECTOR(S96_4B) /* 1 / 96 = 3906.25Hz playback */
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 1.0)
-MACHINE_CONFIG_END
+ MSM5205(config, m_msm, 375000); /* verified on pcb, discrete circuit clock */
+ m_msm->vck_callback().set(FUNC(kchamp_state::msmint)); /* interrupt function */
+ m_msm->set_prescaler_selector(msm5205_device::S96_4B); /* 1 / 96 = 3906.25Hz playback */
+ m_msm->add_route(ALL_OUTPUTS, "speaker", 1.0);
+}
/********************
* 1 Player Version *
********************/
-MACHINE_CONFIG_START(kchamp_state::kchamp)
-
+void kchamp_state::kchamp(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, XTAL(12'000'000)/4) /* 12MHz / 4 = 3.0 MHz */
- MCFG_DEVICE_PROGRAM_MAP(kchamp_map)
- MCFG_DEVICE_IO_MAP(kchamp_io_map)
+ Z80(config, m_maincpu, XTAL(12'000'000)/4); /* 12MHz / 4 = 3.0 MHz */
+ m_maincpu->set_addrmap(AS_PROGRAM, &kchamp_state::kchamp_map);
+ m_maincpu->set_addrmap(AS_IO, &kchamp_state::kchamp_io_map);
- MCFG_DEVICE_ADD("audiocpu", Z80, XTAL(12'000'000)/4) /* 12MHz / 4 = 3.0 MHz */
- MCFG_DEVICE_PROGRAM_MAP(kchamp_sound_map)
- MCFG_DEVICE_IO_MAP(kchamp_sound_io_map)
- MCFG_DEVICE_PERIODIC_INT_DRIVER(kchamp_state, sound_int, 125) /* Hz */
- /* irq's triggered from main cpu */
- /* nmi's from 125 Hz clock */
+ Z80(config, m_audiocpu, XTAL(12'000'000)/4); /* 12MHz / 4 = 3.0 MHz */
+ m_audiocpu->set_addrmap(AS_PROGRAM, &kchamp_state::kchamp_sound_map);
+ m_audiocpu->set_addrmap(AS_IO, &kchamp_state::kchamp_sound_io_map);
+ m_audiocpu->set_periodic_int(FUNC(kchamp_state::sound_int), attotime::from_hz(125)); /* Hz */
+ /* IRQs triggered from main CPU */
+ /* NMIs from 125Hz clock */
ls259_device &mainlatch(LS259(config, "mainlatch")); // IC71
mainlatch.q_out_cb<0>().set(FUNC(kchamp_state::flipscreen_w));
@@ -481,16 +481,16 @@ MACHINE_CONFIG_START(kchamp_state::kchamp)
MCFG_MACHINE_START_OVERRIDE(kchamp_state,kchamp)
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(32*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0, 32*8-1, 2*8, 30*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(kchamp_state, screen_update_kchamp)
- MCFG_SCREEN_PALETTE(m_palette)
- MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE(*this, kchamp_state, vblank_irq))
-
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, m_palette, gfx_kchamp)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(32*8, 32*8);
+ screen.set_visarea(0, 32*8-1, 2*8, 30*8-1);
+ screen.set_screen_update(FUNC(kchamp_state::screen_update_kchamp));
+ screen.set_palette(m_palette);
+ screen.screen_vblank().set(FUNC(kchamp_state::vblank_irq));
+
+ GFXDECODE(config, m_gfxdecode, m_palette, gfx_kchamp);
PALETTE(config, m_palette, FUNC(kchamp_state::kchamp_palette), 256);
/* sound hardware */
@@ -500,13 +500,13 @@ MACHINE_CONFIG_START(kchamp_state::kchamp)
m_soundlatch->data_pending_callback().set_inputline(m_audiocpu, 0);
AY8910(config, m_ay[0], XTAL(12'000'000)/12).add_route(ALL_OUTPUTS, "speaker", 0.3); /* Guess based on actual pcb recordings of karatedo */
-
AY8910(config, m_ay[1], XTAL(12'000'000)/12).add_route(ALL_OUTPUTS, "speaker", 0.3); /* Guess based on actual pcb recordings of karatedo */
- MCFG_DEVICE_ADD("dac", DAC08, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 0.3) // IC11
- MCFG_DEVICE_ADD("vref", VOLTAGE_REGULATOR, 0) MCFG_VOLTAGE_REGULATOR_OUTPUT(5.0)
- MCFG_SOUND_ROUTE(0, "dac", 1.0, DAC_VREF_POS_INPUT) MCFG_SOUND_ROUTE(0, "dac", -1.0, DAC_VREF_NEG_INPUT)
-MACHINE_CONFIG_END
+ DAC08(config, m_dac, 0).add_route(ALL_OUTPUTS, "speaker", 0.3); // IC11
+ voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref", 0));
+ vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT);
+ vref.add_route(0, "dac", -1.0, DAC_VREF_NEG_INPUT);
+}
/***************************************************************************
@@ -681,6 +681,92 @@ ROM_START( kchampvs2 )
ROM_LOAD( "lt.k8", 0x0200, 0x0100, CRC(ba4a5651) SHA1(77e81bd64ab59a7466d20eabdff4be241e963c52) ) /* blue */
ROM_END
+// This version has a mix of the "Karate Champ (US VS version, set 1)" ROMs and a few ROMs unique to "Taisen Karate Dou (Japan VS version)" along with 1 completely unique program ROM.
+// The only difference is instead of "My hero" as found in the later US sets it says "My hero deserves the fair".
+ROM_START( kchampvs3 )
+ ROM_REGION( 0x10000, "maincpu", 0 )
+ ROM_LOAD( "bs24.d13", 0x00000, 0x02000, CRC(829da69b) SHA1(3266e7686e537f34ee5ce4cccc349eb12fc65038) )
+ ROM_LOAD( "bs23.d11", 0x02000, 0x02000, CRC(091f810e) SHA1(283edb08ce106835185a1c2d6b88f7544d75f3b4) )
+ ROM_LOAD( "bs22.d10", 0x04000, 0x02000, CRC(d4df2a52) SHA1(60d6cb1cb51c6f80a0f88913d4152ab8bda752d6) )
+ ROM_LOAD( "bs21.d8", 0x06000, 0x02000, CRC(80839912) SHA1(4a3c6ad8eba756ae8e89faf42b72b41f85731e67) ) // only unique ROM
+ ROM_LOAD( "bs20.d7", 0x08000, 0x02000, CRC(623a467b) SHA1(5f150c67632f8e32769b75aa0615d0eb018afdc4) )
+ ROM_LOAD( "bs19.d6", 0x0a000, 0x02000, CRC(43e196c4) SHA1(8029798ea0a560603c3dcde56db5a1ccde58c514) )
+ ROM_CONTINUE( 0x0e000, 0x02000 )
+
+ ROM_REGION( 0x10000, "audiocpu", 0 ) /* Sound CPU */
+ ROM_LOAD( "bs18.d4", 0x00000, 0x02000, CRC(eaa646eb) SHA1(cbd48f4d5d225b71c2dd0b14f420838561e3f83e) )
+ ROM_LOAD( "bs17.d2", 0x02000, 0x02000, CRC(d71031ad) SHA1(b168f4ef4feb4195305404df699acecb731eab02) )
+ ROM_LOAD( "bs16.d1", 0x04000, 0x02000, CRC(6f811c43) SHA1(1d33ac8129562ab709bd7396b4c2457b6db99277) )
+
+ ROM_REGION( 0x08000, "gfx1", 0 )
+ ROM_LOAD( "bs12.k1", 0x00000, 0x02000, CRC(4c574ecd) SHA1(86914eef33da73463ba6261eecae75209d24fac1) )
+ ROM_LOAD( "bs13.k3", 0x02000, 0x02000, CRC(750b66af) SHA1(c7824994b977d4e846f3ecadfcfc51331f52b6f4) )
+ ROM_LOAD( "bs14.k5", 0x04000, 0x02000, CRC(9ad6227c) SHA1(708af5e70927040cf7f2ae6f792344c19099530c) )
+ ROM_LOAD( "bs15.k6", 0x06000, 0x02000, CRC(3b6d5de5) SHA1(288fffcbc9369db5c75e7e0d6181612de6f12da3) )
+
+ ROM_REGION( 0x18000, "gfx2", 0 ) // 00, 06, 03 and 09 match the karatevs set
+ ROM_LOAD( "bs00.a1", 0x00000, 0x02000, CRC(c46a8b88) SHA1(a47e56a6dc7f36b896b8156e77a1da7e8be2332e) )
+ ROM_LOAD( "bs06.c1", 0x02000, 0x02000, CRC(cf8982ff) SHA1(aafb249503ad51f64b1f31ea2d869dfc0e065d19) )
+ ROM_LOAD( "bs01.a3", 0x04000, 0x02000, CRC(b4842ea9) SHA1(471475f65edbd292b9162ad50e5cb0c7144845b0) )
+ ROM_LOAD( "bs07.c3", 0x06000, 0x02000, CRC(8cd166a5) SHA1(4b623c4c0025d75b3ed9746f8b6730bf3e65d85a) )
+ ROM_LOAD( "bs02.a5", 0x08000, 0x02000, CRC(4cbd3aa3) SHA1(a9a683dcc4f52b18450659a20434a4d2a7b411d9) )
+ ROM_LOAD( "bs08.c5", 0x0a000, 0x02000, CRC(6be342a6) SHA1(0b8ac7ef7c6a6464fbc027a9fd17fa7ce1ffd962) )
+ ROM_LOAD( "bs03.a6", 0x0c000, 0x02000, CRC(bde8a52b) SHA1(1a0800472caf8c79a15cc977dad1a7bc97c74b2b) )
+ ROM_LOAD( "bs09.c6", 0x0e000, 0x02000, CRC(e9a5f945) SHA1(e6b21912bee97de06819c8ac85a45bbc70030f88) )
+ ROM_LOAD( "bs04.a8", 0x10000, 0x02000, CRC(7346db8a) SHA1(d2b2c1700ae0ff9c614a9981a3da3d69879e9f25) )
+ ROM_LOAD( "bs10.c8", 0x12000, 0x02000, CRC(b78714fc) SHA1(4df7f15c37d56a9d66d0049aad65b32063e5c29a) )
+ ROM_LOAD( "bs05.a10", 0x14000, 0x02000, CRC(b2557102) SHA1(ec4285029fc3ee1ad0adb05f363b234c67f8903d) )
+ ROM_LOAD( "bs11.c10", 0x16000, 0x02000, CRC(c85aba0e) SHA1(4be21b38623c2a8ae7f1e7397fb002e4cb9e4614) )
+
+ ROM_REGION( 0x0300, "proms", 0 )
+ ROM_LOAD( "br27.k10", 0x0000, 0x0100, CRC(f683c54a) SHA1(92893990456b92f04a2be98b8e9626e97b7a2562) ) /* red */
+ ROM_LOAD( "br26.k9", 0x0100, 0x0100, CRC(3ddbb6c4) SHA1(0eca5594d6812bc79f8b78f83fe003877d20c973) ) /* green */
+ ROM_LOAD( "br25.k8", 0x0200, 0x0100, CRC(ba4a5651) SHA1(77e81bd64ab59a7466d20eabdff4be241e963c52) ) /* blue */
+ROM_END
+
+// This version has a mix of the "Karate Champ (US VS version, set 1)" ROMs and a few ROMs unique to "Taisen Karate Dou (Japan VS version)".
+// It displays the dialog balloon in red with a boat below it.
+ROM_START( kchampvs4 )
+ ROM_REGION( 0x10000, "maincpu", 0 )
+ ROM_LOAD( "bs24.d13", 0x00000, 0x02000, CRC(829da69b) SHA1(3266e7686e537f34ee5ce4cccc349eb12fc65038) )
+ ROM_LOAD( "bs23.d11", 0x02000, 0x02000, CRC(091f810e) SHA1(283edb08ce106835185a1c2d6b88f7544d75f3b4) )
+ ROM_LOAD( "bs22.d10", 0x04000, 0x02000, CRC(d4df2a52) SHA1(60d6cb1cb51c6f80a0f88913d4152ab8bda752d6) )
+ ROM_LOAD( "bs21.d8", 0x06000, 0x02000, CRC(3d4ef0da) SHA1(228c8e47bb7123b69746506402edb875a43d7af5) )
+ ROM_LOAD( "bs20.d7", 0x08000, 0x02000, CRC(623a467b) SHA1(5f150c67632f8e32769b75aa0615d0eb018afdc4) )
+ ROM_LOAD( "bs19.d6", 0x0a000, 0x02000, CRC(43e196c4) SHA1(8029798ea0a560603c3dcde56db5a1ccde58c514) )
+ ROM_CONTINUE( 0x0e000, 0x02000 )
+
+ ROM_REGION( 0x10000, "audiocpu", 0 ) /* Sound CPU */
+ ROM_LOAD( "bs18.d4", 0x00000, 0x02000, CRC(eaa646eb) SHA1(cbd48f4d5d225b71c2dd0b14f420838561e3f83e) )
+ ROM_LOAD( "bs17.d2", 0x02000, 0x02000, CRC(d71031ad) SHA1(b168f4ef4feb4195305404df699acecb731eab02) )
+ ROM_LOAD( "bs16.d1", 0x04000, 0x02000, CRC(6f811c43) SHA1(1d33ac8129562ab709bd7396b4c2457b6db99277) )
+
+ ROM_REGION( 0x08000, "gfx1", 0 )
+ ROM_LOAD( "bs12.k1", 0x00000, 0x02000, CRC(4c574ecd) SHA1(86914eef33da73463ba6261eecae75209d24fac1) )
+ ROM_LOAD( "bs13.k3", 0x02000, 0x02000, CRC(750b66af) SHA1(c7824994b977d4e846f3ecadfcfc51331f52b6f4) )
+ ROM_LOAD( "bs14.k5", 0x04000, 0x02000, CRC(9ad6227c) SHA1(708af5e70927040cf7f2ae6f792344c19099530c) )
+ ROM_LOAD( "bs15.k6", 0x06000, 0x02000, CRC(3b6d5de5) SHA1(288fffcbc9369db5c75e7e0d6181612de6f12da3) )
+
+ ROM_REGION( 0x18000, "gfx2", 0 ) // 00, 06, 03 and 09 match the karatevs set
+ ROM_LOAD( "bs00.a1", 0x00000, 0x02000, CRC(c46a8b88) SHA1(a47e56a6dc7f36b896b8156e77a1da7e8be2332e) )
+ ROM_LOAD( "bs06.c1", 0x02000, 0x02000, CRC(cf8982ff) SHA1(aafb249503ad51f64b1f31ea2d869dfc0e065d19) )
+ ROM_LOAD( "bs01.a3", 0x04000, 0x02000, CRC(b4842ea9) SHA1(471475f65edbd292b9162ad50e5cb0c7144845b0) )
+ ROM_LOAD( "bs07.c3", 0x06000, 0x02000, CRC(8cd166a5) SHA1(4b623c4c0025d75b3ed9746f8b6730bf3e65d85a) )
+ ROM_LOAD( "bs02.a5", 0x08000, 0x02000, CRC(4cbd3aa3) SHA1(a9a683dcc4f52b18450659a20434a4d2a7b411d9) )
+ ROM_LOAD( "bs08.c5", 0x0a000, 0x02000, CRC(6be342a6) SHA1(0b8ac7ef7c6a6464fbc027a9fd17fa7ce1ffd962) )
+ ROM_LOAD( "bs03.a6", 0x0c000, 0x02000, CRC(bde8a52b) SHA1(1a0800472caf8c79a15cc977dad1a7bc97c74b2b) )
+ ROM_LOAD( "bs09.c6", 0x0e000, 0x02000, CRC(e9a5f945) SHA1(e6b21912bee97de06819c8ac85a45bbc70030f88) )
+ ROM_LOAD( "bs04.a8", 0x10000, 0x02000, CRC(7346db8a) SHA1(d2b2c1700ae0ff9c614a9981a3da3d69879e9f25) )
+ ROM_LOAD( "bs10.c8", 0x12000, 0x02000, CRC(b78714fc) SHA1(4df7f15c37d56a9d66d0049aad65b32063e5c29a) )
+ ROM_LOAD( "bs05.a10", 0x14000, 0x02000, CRC(b2557102) SHA1(ec4285029fc3ee1ad0adb05f363b234c67f8903d) )
+ ROM_LOAD( "bs11.c10", 0x16000, 0x02000, CRC(c85aba0e) SHA1(4be21b38623c2a8ae7f1e7397fb002e4cb9e4614) )
+
+ ROM_REGION( 0x0300, "proms", 0 )
+ ROM_LOAD( "br27.k10", 0x0000, 0x0100, CRC(f683c54a) SHA1(92893990456b92f04a2be98b8e9626e97b7a2562) ) /* red */
+ ROM_LOAD( "br26.k9", 0x0100, 0x0100, CRC(3ddbb6c4) SHA1(0eca5594d6812bc79f8b78f83fe003877d20c973) ) /* green */
+ ROM_LOAD( "br25.k8", 0x0200, 0x0100, CRC(ba4a5651) SHA1(77e81bd64ab59a7466d20eabdff4be241e963c52) ) /* blue */
+ROM_END
+
ROM_START( karatevs )
ROM_REGION( 0x10000, "maincpu", 0 )
ROM_LOAD( "br24.d13", 0x00000, 0x02000, CRC(ea9cda49) SHA1(7d753a8d391418d0fe5231eb88b3627f7d3fd99e) )
@@ -772,4 +858,6 @@ GAME( 1984, kchamp, 0, kchamp, kchamp, kchamp_state, empty_init,
GAME( 1984, karatedo, kchamp, kchamp, kchamp, kchamp_state, empty_init, ROT90, "Data East Corporation", "Karate Dou (Japan)", MACHINE_SUPPORTS_SAVE )
GAME( 1984, kchampvs, kchamp, kchampvs, kchampvs, kchamp_state, init_kchampvs, ROT90, "Data East USA", "Karate Champ (US VS version, set 1)", MACHINE_SUPPORTS_SAVE )
GAME( 1984, kchampvs2, kchamp, kchampvs, kchampvs, kchamp_state, init_kchampvs2, ROT90, "Data East USA", "Karate Champ (US VS version, set 2)", MACHINE_SUPPORTS_SAVE )
+GAME( 1984, kchampvs3, kchamp, kchampvs, kchampvs, kchamp_state, init_kchampvs, ROT90, "Data East USA", "Karate Champ (US VS version, set 3)", MACHINE_SUPPORTS_SAVE )
+GAME( 1984, kchampvs4, kchamp, kchampvs, kchampvs, kchamp_state, init_kchampvs, ROT90, "Data East USA", "Karate Champ (US VS version, set 4)", MACHINE_SUPPORTS_SAVE )
GAME( 1984, karatevs, kchamp, kchampvs, kchampvs, kchamp_state, init_kchampvs, ROT90, "Data East Corporation", "Taisen Karate Dou (Japan VS version)", MACHINE_SUPPORTS_SAVE )
diff --git a/src/mame/drivers/kdt6.cpp b/src/mame/drivers/kdt6.cpp
index 9ca94a8bb09..fbdaeeaf03f 100644
--- a/src/mame/drivers/kdt6.cpp
+++ b/src/mame/drivers/kdt6.cpp
@@ -187,7 +187,7 @@ void kdt6_state::psi98_io(address_map &map)
map(0x19, 0x19).rw(m_crtc, FUNC(mc6845_device::register_r), FUNC(mc6845_device::register_w));
map(0x1c, 0x1c).w(FUNC(kdt6_state::status0_w));
map(0x1d, 0x1d).r(m_keyboard, FUNC(psi_keyboard_bus_device::key_data_r));
- map(0x1e, 0x1e).rw(m_fdc, FUNC(upd765a_device::mdma_r), FUNC(upd765a_device::mdma_w));
+ map(0x1e, 0x1e).rw(m_fdc, FUNC(upd765a_device::dma_r), FUNC(upd765a_device::dma_w));
map(0x1f, 0x1f).w(FUNC(kdt6_state::fdc_tc_w));
map(0x20, 0x2f).rw(FUNC(kdt6_state::mapper_r), FUNC(kdt6_state::mapper_w));
map(0x30, 0x30).rw(FUNC(kdt6_state::video_data_r), FUNC(kdt6_state::video_data_w));
@@ -617,16 +617,18 @@ static const z80_daisy_config daisy_chain_intf[] =
{ nullptr }
};
-MACHINE_CONFIG_START(kdt6_state::psi98)
+void kdt6_state::psi98(machine_config &config)
+{
Z80(config, m_cpu, XTAL(16'000'000) / 4);
m_cpu->set_addrmap(AS_PROGRAM, &kdt6_state::psi98_mem);
m_cpu->set_addrmap(AS_IO, &kdt6_state::psi98_io);
m_cpu->set_daisy_config(daisy_chain_intf);
// video hardware
- MCFG_SCREEN_ADD_MONOCHROME("screen", RASTER, rgb_t::green())
- MCFG_SCREEN_RAW_PARAMS(XTAL(13'516'800), 824, 48, 688, 274, 0, 250)
- MCFG_SCREEN_UPDATE_DRIVER(kdt6_state, screen_update)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_color(rgb_t::green());
+ screen.set_raw(XTAL(13'516'800), 824, 48, 688, 274, 0, 250);
+ screen.set_screen_update(FUNC(kdt6_state::screen_update));
PALETTE(config, m_palette, palette_device::MONOCHROME);
config.set_default_layout(layout_kdt6);
@@ -644,7 +646,7 @@ MACHINE_CONFIG_START(kdt6_state::psi98)
m_beeper->add_route(ALL_OUTPUTS, "mono", 0.50);
SPEAKER_SOUND(config, "speaker").add_route(ALL_OUTPUTS, "mono", 0.50);
- MCFG_TIMER_DRIVER_ADD("beep_timer", kdt6_state, beeper_off)
+ TIMER(config, m_beep_timer).configure_generic(FUNC(kdt6_state::beeper_off));
Z80DMA(config, m_dma, 16_MHz_XTAL / 4);
m_dma->out_busreq_callback().set(FUNC(kdt6_state::busreq_w));
@@ -705,24 +707,25 @@ MACHINE_CONFIG_START(kdt6_state::psi98)
m_centronics->select_handler().set("pio", FUNC(z80pio_device::pa5_w));
INPUT_BUFFER(config, "cent_data_in");
- MCFG_CENTRONICS_OUTPUT_LATCH_ADD("cent_data_out", "centronics")
+ output_latch_device &latch(OUTPUT_LATCH(config, "cent_data_out"));
+ m_centronics->set_output_latch(latch);
UPD1990A(config, m_rtc);
UPD765A(config, m_fdc, 8'000'000, true, true);
m_fdc->intrq_wr_callback().set("ctc1", FUNC(z80ctc_device::trg0));
m_fdc->drq_wr_callback().set(FUNC(kdt6_state::fdc_drq_w));
- MCFG_FLOPPY_DRIVE_ADD("fdc:0", kdt6_floppies, "fd55f", floppy_image_device::default_floppy_formats)
- MCFG_FLOPPY_DRIVE_ADD("fdc:1", kdt6_floppies, "fd55f", floppy_image_device::default_floppy_formats)
+ FLOPPY_CONNECTOR(config, "fdc:0", kdt6_floppies, "fd55f", floppy_image_device::default_floppy_formats);
+ FLOPPY_CONNECTOR(config, "fdc:1", kdt6_floppies, "fd55f", floppy_image_device::default_floppy_formats);
- MCFG_SOFTWARE_LIST_ADD("floppy_list", "psi98")
+ SOFTWARE_LIST(config, "floppy_list").set_original("psi98");
- MCFG_PSI_KEYBOARD_INTERFACE_ADD("kbd", "hle")
- MCFG_PSI_KEYBOARD_RX_HANDLER(WRITELINE(*this, kdt6_state, keyboard_rx_w))
- MCFG_PSI_KEYBOARD_KEY_STROBE_HANDLER(WRITELINE("ctc2", z80ctc_device, trg1))
+ PSI_KEYBOARD_INTERFACE(config, m_keyboard, "hle");
+ m_keyboard->rx().set(FUNC(kdt6_state::keyboard_rx_w));
+ m_keyboard->key_strobe().set("ctc2", FUNC(z80ctc_device::trg1));
// 6 ECB slots
-MACHINE_CONFIG_END
+}
//**************************************************************************
diff --git a/src/mame/drivers/kickgoal.cpp b/src/mame/drivers/kickgoal.cpp
index 7628eb9026b..4520698d0c7 100644
--- a/src/mame/drivers/kickgoal.cpp
+++ b/src/mame/drivers/kickgoal.cpp
@@ -66,7 +66,7 @@ WRITE16_MEMBER(kickgoal_state::actionhw_snd_w)
case 0xfe: m_okibank->set_entry(1); break;
case 0xff: m_okibank->set_entry(3); break;
case 0x78:
- m_oki->write_command(data);
+ m_oki->write(data);
m_snd_sam[0] = 00; m_snd_sam[1]= 00; m_snd_sam[2] = 00; m_snd_sam[3] = 00;
break;
default:
@@ -75,44 +75,44 @@ WRITE16_MEMBER(kickgoal_state::actionhw_snd_w)
if ((data & 0x80) && (m_snd_sam[3] != m_snd_new))
{
logerror("About to play sample %02x at vol %02x\n", m_snd_new, data);
- if ((m_oki->read_status() & 0x08) != 0x08)
+ if ((m_oki->read() & 0x08) != 0x08)
{
logerror("Playing sample %02x at vol %02x\n", m_snd_new, data);
- m_oki->write_command(m_snd_new);
- m_oki->write_command(data);
+ m_oki->write(m_snd_new);
+ m_oki->write(data);
}
m_snd_new = 00;
}
if ((data & 0x40) && (m_snd_sam[2] != m_snd_new))
{
logerror("About to play sample %02x at vol %02x\n", m_snd_new, data);
- if ((m_oki->read_status() & 0x04) != 0x04)
+ if ((m_oki->read() & 0x04) != 0x04)
{
logerror("Playing sample %02x at vol %02x\n", m_snd_new, data);
- m_oki->write_command(m_snd_new);
- m_oki->write_command(data);
+ m_oki->write(m_snd_new);
+ m_oki->write(data);
}
m_snd_new = 00;
}
if ((data & 0x20) && (m_snd_sam[1] != m_snd_new))
{
logerror("About to play sample %02x at vol %02x\n", m_snd_new, data);
- if ((m_oki->read_status() & 0x02) != 0x02)
+ if ((m_oki->read() & 0x02) != 0x02)
{
logerror("Playing sample %02x at vol %02x\n", m_snd_new, data);
- m_oki->write_command(m_snd_new);
- m_oki->write_command(data);
+ m_oki->write(m_snd_new);
+ m_oki->write(data);
}
m_snd_new = 00;
}
if ((data & 0x10) && (m_snd_sam[0] != m_snd_new))
{
logerror("About to play sample %02x at vol %02x\n", m_snd_new, data);
- if ((m_oki->read_status() & 0x01) != 0x01)
+ if ((m_oki->read() & 0x01) != 0x01)
{
logerror("Playing sample %02x at vol %02x\n", m_snd_new, data);
- m_oki->write_command(m_snd_new);
- m_oki->write_command(data);
+ m_oki->write(m_snd_new);
+ m_oki->write(data);
}
m_snd_new = 00;
}
@@ -127,7 +127,7 @@ WRITE16_MEMBER(kickgoal_state::actionhw_snd_w)
else /* Turn a channel off */
{
logerror("Turning channel %02x off\n", data);
- m_oki->write_command(data);
+ m_oki->write(data);
if (data & 0x40) m_snd_sam[3] = 00;
if (data & 0x20) m_snd_sam[2] = 00;
if (data & 0x10) m_snd_sam[1] = 00;
@@ -394,7 +394,7 @@ WRITE8_MEMBER(kickgoal_state::soundio_port_c_w)
{
if (!(data & 0x01))
{
- m_pic_portb = m_oki->read_status();
+ m_pic_portb = m_oki->read();
}
}
@@ -402,7 +402,7 @@ WRITE8_MEMBER(kickgoal_state::soundio_port_c_w)
{
if (!(data & 0x02))
{
- m_oki->write_command(m_pic_portb);
+ m_oki->write(m_pic_portb);
}
}
@@ -418,12 +418,12 @@ WRITE16_MEMBER(kickgoal_state::to_pic_w)
-MACHINE_CONFIG_START(kickgoal_state::kickgoal)
-
+void kickgoal_state::kickgoal(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M68000, XTAL(12'000'000)) /* 12 MHz */
- MCFG_DEVICE_PROGRAM_MAP(kickgoal_program_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", kickgoal_state, irq6_line_hold)
+ M68000(config, m_maincpu, XTAL(12'000'000)); /* 12 MHz */
+ m_maincpu->set_addrmap(AS_PROGRAM, &kickgoal_state::kickgoal_program_map);
+ m_maincpu->set_vblank_int("screen", FUNC(kickgoal_state::irq6_line_hold));
PIC16C57(config, m_audiocpu, XTAL(12'000'000)/3); /* 4MHz ? */
m_audiocpu->write_a().set(FUNC(kickgoal_state::soundio_port_a_w));
@@ -437,13 +437,13 @@ MACHINE_CONFIG_START(kickgoal_state::kickgoal)
EEPROM_93C46_16BIT(config, "eeprom").default_data(kickgoal_default_eeprom_type1, 128);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(64*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(9*8, 55*8-1, 2*8, 30*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(kickgoal_state, screen_update_kickgoal)
- MCFG_SCREEN_PALETTE(m_palette)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(64*8, 32*8);
+ screen.set_visarea(9*8, 55*8-1, 2*8, 30*8-1);
+ screen.set_screen_update(FUNC(kickgoal_state::screen_update_kickgoal));
+ screen.set_palette(m_palette);
GFXDECODE(config, m_gfxdecode, m_palette, gfx_kickgoal);
PALETTE(config, m_palette).set_format(palette_device::xBGR_444, 1024);
@@ -455,32 +455,32 @@ MACHINE_CONFIG_START(kickgoal_state::kickgoal)
GENERIC_LATCH_8(config, "soundlatch");
- MCFG_DEVICE_ADD("oki", OKIM6295, XTAL(12'000'000)/12, okim6295_device::PIN7_LOW)
- MCFG_DEVICE_ADDRESS_MAP(0, oki_map)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.80)
-MACHINE_CONFIG_END
-
-MACHINE_CONFIG_START(kickgoal_state::actionhw)
+ OKIM6295(config, m_oki, XTAL(12'000'000)/12, okim6295_device::PIN7_LOW);
+ m_oki->set_addrmap(0, &kickgoal_state::oki_map);
+ m_oki->add_route(ALL_OUTPUTS, "mono", 0.80);
+}
+void kickgoal_state::actionhw(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M68000, XTAL(12'000'000)) /* verified on pcb */
- MCFG_DEVICE_PROGRAM_MAP(kickgoal_program_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", kickgoal_state, irq6_line_hold)
+ M68000(config, m_maincpu, XTAL(12'000'000)); /* verified on pcb */
+ m_maincpu->set_addrmap(AS_PROGRAM, &kickgoal_state::kickgoal_program_map);
+ m_maincpu->set_vblank_int("screen", FUNC(kickgoal_state::irq6_line_hold));
- MCFG_DEVICE_ADD("audiocpu", PIC16C57, XTAL(12'000'000)/3) /* verified on pcb */
- MCFG_DEVICE_DISABLE() /* Disabled since the internal rom isn't dumped */
+ PIC16C57(config, m_audiocpu, XTAL(12'000'000)/3); /* verified on pcb */
+ m_audiocpu->set_disable(); /* Disabled since the internal rom isn't dumped */
/* Program and Data Maps are internal to the MCU */
EEPROM_93C46_16BIT(config, "eeprom").default_data(kickgoal_default_eeprom_type1, 128);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(64*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(10*8+2, 54*8-1+2, 0*8, 30*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(kickgoal_state, screen_update_kickgoal)
- MCFG_SCREEN_PALETTE(m_palette)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(64*8, 32*8);
+ screen.set_visarea(10*8+2, 54*8-1+2, 0*8, 30*8-1);
+ screen.set_screen_update(FUNC(kickgoal_state::screen_update_kickgoal));
+ screen.set_palette(m_palette);
GFXDECODE(config, m_gfxdecode, m_palette, gfx_actionhw);
PALETTE(config, m_palette).set_format(palette_device::xBGR_444, 1024);
@@ -492,10 +492,10 @@ MACHINE_CONFIG_START(kickgoal_state::actionhw)
GENERIC_LATCH_8(config, "soundlatch");
- MCFG_DEVICE_ADD("oki", OKIM6295, XTAL(12'000'000)/12, okim6295_device::PIN7_HIGH) /* verified on pcb */
- MCFG_DEVICE_ADDRESS_MAP(0, oki_map)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.80)
-MACHINE_CONFIG_END
+ OKIM6295(config, m_oki, XTAL(12'000'000)/12, okim6295_device::PIN7_HIGH); /* verified on pcb */
+ m_oki->set_addrmap(0, &kickgoal_state::oki_map);
+ m_oki->add_route(ALL_OUTPUTS, "mono", 0.80);
+}
diff --git a/src/mame/drivers/kim1.cpp b/src/mame/drivers/kim1.cpp
index 178e5bfce3c..2fc01cbef0c 100644
--- a/src/mame/drivers/kim1.cpp
+++ b/src/mame/drivers/kim1.cpp
@@ -240,36 +240,36 @@ void kim1_state::machine_reset()
// MACHINE DRIVERS
//**************************************************************************
-MACHINE_CONFIG_START(kim1_state::kim1)
+void kim1_state::kim1(machine_config &config)
+{
// basic machine hardware
- MCFG_DEVICE_ADD("maincpu", M6502, 1000000) /* 1 MHz */
- MCFG_DEVICE_PROGRAM_MAP(kim1_map)
- MCFG_QUANTUM_TIME(attotime::from_hz(60))
+ M6502(config, m_maincpu, 1000000); /* 1 MHz */
+ m_maincpu->set_addrmap(AS_PROGRAM, &kim1_state::kim1_map);
+ config.m_minimum_quantum = attotime::from_hz(60);
// video hardware
config.set_default_layout(layout_kim1);
// devices
- MCFG_DEVICE_ADD("miot_u2", MOS6530, 1000000)
- MCFG_MOS6530_IN_PA_CB(READ8(*this, kim1_state, kim1_u2_read_a))
- MCFG_MOS6530_OUT_PA_CB(WRITE8(*this, kim1_state, kim1_u2_write_a))
- MCFG_MOS6530_IN_PB_CB(READ8(*this, kim1_state, kim1_u2_read_b))
- MCFG_MOS6530_OUT_PB_CB(WRITE8(*this, kim1_state, kim1_u2_write_b))
+ MOS6530(config, m_riot2, 1000000);
+ m_riot2->in_pa_callback().set(FUNC(kim1_state::kim1_u2_read_a));
+ m_riot2->out_pa_callback().set(FUNC(kim1_state::kim1_u2_write_a));
+ m_riot2->in_pb_callback().set(FUNC(kim1_state::kim1_u2_read_b));
+ m_riot2->out_pb_callback().set(FUNC(kim1_state::kim1_u2_write_b));
- MCFG_DEVICE_ADD("miot_u3", MOS6530, 1000000)
+ MOS6530(config, "miot_u3", 1000000);
- MCFG_CASSETTE_ADD( "cassette" )
- MCFG_CASSETTE_FORMATS(kim1_cassette_formats)
- MCFG_CASSETTE_DEFAULT_STATE(CASSETTE_STOPPED)
- MCFG_CASSETTE_INTERFACE ("kim1_cass")
+ CASSETTE(config, m_cass);
+ m_cass->set_formats(kim1_cassette_formats);
+ m_cass->set_default_state(CASSETTE_STOPPED);
+ m_cass->set_interface ("kim1_cass");
- MCFG_TIMER_DRIVER_ADD_PERIODIC("led_timer", kim1_state, kim1_update_leds, attotime::from_hz(60))
- MCFG_TIMER_DRIVER_ADD_PERIODIC("cassette_timer", kim1_state, kim1_cassette_input, attotime::from_hz(44100))
+ TIMER(config, "led_timer").configure_periodic(FUNC(kim1_state::kim1_update_leds), attotime::from_hz(60));
+ TIMER(config, "cassette_timer").configure_periodic(FUNC(kim1_state::kim1_cassette_input), attotime::from_hz(44100));
// software list
- MCFG_SOFTWARE_LIST_ADD ("cass_list", "kim1_cass")
-
-MACHINE_CONFIG_END
+ SOFTWARE_LIST(config, "cass_list").set_original("kim1_cass");
+}
//**************************************************************************
// ROM DEFINITIONS
diff --git a/src/mame/drivers/kingdrby.cpp b/src/mame/drivers/kingdrby.cpp
index b710cc0cb2b..7a83fb6ab7c 100644
--- a/src/mame/drivers/kingdrby.cpp
+++ b/src/mame/drivers/kingdrby.cpp
@@ -964,23 +964,24 @@ void kingdrby_state::kingdrbb_palette(palette_device &palette) const
}
}
-MACHINE_CONFIG_START(kingdrby_state::kingdrby)
- MCFG_DEVICE_ADD("master", Z80, CLK_2)
- MCFG_DEVICE_PROGRAM_MAP(master_map)
- MCFG_DEVICE_IO_MAP(master_io_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", kingdrby_state, irq0_line_hold)
+void kingdrby_state::kingdrby(machine_config &config)
+{
+ z80_device &master(Z80(config, "master", CLK_2));
+ master.set_addrmap(AS_PROGRAM, &kingdrby_state::master_map);
+ master.set_addrmap(AS_IO, &kingdrby_state::master_io_map);
+ master.set_vblank_int("screen", FUNC(kingdrby_state::irq0_line_hold));
- MCFG_DEVICE_ADD("slave", Z80, CLK_2)
- MCFG_DEVICE_PROGRAM_MAP(slave_map)
- MCFG_DEVICE_IO_MAP(slave_io_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", kingdrby_state, irq0_line_hold)
+ z80_device &slave(Z80(config, "slave", CLK_2));
+ slave.set_addrmap(AS_PROGRAM, &kingdrby_state::slave_map);
+ slave.set_addrmap(AS_IO, &kingdrby_state::slave_io_map);
+ slave.set_vblank_int("screen", FUNC(kingdrby_state::irq0_line_hold));
- MCFG_DEVICE_ADD("soundcpu", Z80, CLK_2)
- MCFG_DEVICE_PROGRAM_MAP(sound_map)
- MCFG_DEVICE_IO_MAP(sound_io_map)
- MCFG_DEVICE_PERIODIC_INT_DRIVER(kingdrby_state, irq0_line_hold, 1000) /* guess, controls ay8910 tempo.*/
+ Z80(config, m_soundcpu, CLK_2);
+ m_soundcpu->set_addrmap(AS_PROGRAM, &kingdrby_state::sound_map);
+ m_soundcpu->set_addrmap(AS_IO, &kingdrby_state::sound_io_map);
+ m_soundcpu->set_periodic_int(FUNC(kingdrby_state::irq0_line_hold), attotime::from_hz(1000)); /* guess, controls ay8910 tempo.*/
- MCFG_QUANTUM_PERFECT_CPU("master")
+ config.m_perfect_cpu_quantum = subtag("master");
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
@@ -1000,13 +1001,13 @@ MACHINE_CONFIG_START(kingdrby_state::kingdrby)
GFXDECODE(config, m_gfxdecode, m_palette, gfx_kingdrby);
PALETTE(config, m_palette, FUNC(kingdrby_state::kingdrby_palette), 0x200);
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */
- MCFG_SCREEN_SIZE(256, 256)
- MCFG_SCREEN_VISIBLE_AREA(0, 256-1, 0, 224-1) /* controlled by CRTC */
- MCFG_SCREEN_UPDATE_DRIVER(kingdrby_state, screen_update_kingdrby)
- MCFG_SCREEN_PALETTE(m_palette)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */
+ screen.set_size(256, 256);
+ screen.set_visarea(0, 256-1, 0, 224-1); /* controlled by CRTC */
+ screen.set_screen_update(FUNC(kingdrby_state::screen_update_kingdrby));
+ screen.set_palette(m_palette);
mc6845_device &crtc(MC6845(config, "crtc", CLK_1/32)); /* 53.333 Hz. guess */
crtc.set_screen("screen");
@@ -1018,13 +1019,13 @@ MACHINE_CONFIG_START(kingdrby_state::kingdrby)
ay8910_device &aysnd(AY8910(config, "aysnd", CLK_1/8)); /* guess */
aysnd.port_a_read_callback().set(FUNC(kingdrby_state::sound_cmd_r));
aysnd.add_route(ALL_OUTPUTS, "mono", 0.25);
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(kingdrby_state::kingdrbb)
+void kingdrby_state::kingdrbb(machine_config &config)
+{
kingdrby(config);
- MCFG_DEVICE_MODIFY("slave")
- MCFG_DEVICE_PROGRAM_MAP(slave_1986_map)
+ subdevice<z80_device>("slave")->set_addrmap(AS_PROGRAM, &kingdrby_state::slave_1986_map);
m_palette->set_init(FUNC(kingdrby_state::kingdrbb_palette));
@@ -1044,26 +1045,26 @@ MACHINE_CONFIG_START(kingdrby_state::kingdrbb)
m_ppi[1]->out_pa_callback().set_nop();
m_ppi[1]->out_pb_callback().set_nop();
m_ppi[1]->out_pc_callback().set_nop();
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(kingdrby_state::cowrace)
+void kingdrby_state::cowrace(machine_config &config)
+{
kingdrbb(config);
- MCFG_DEVICE_MODIFY("soundcpu")
- MCFG_DEVICE_PROGRAM_MAP(cowrace_sound_map)
- MCFG_DEVICE_IO_MAP(cowrace_sound_io)
+ m_soundcpu->set_addrmap(AS_PROGRAM, &kingdrby_state::cowrace_sound_map);
+ m_soundcpu->set_addrmap(AS_IO, &kingdrby_state::cowrace_sound_io);
- MCFG_GFXDECODE_MODIFY("gfxdecode", gfx_cowrace)
+ m_gfxdecode->set_info(gfx_cowrace);
m_palette->set_init(FUNC(kingdrby_state::kingdrby_palette));
- MCFG_DEVICE_ADD("oki", OKIM6295, 1056000, okim6295_device::PIN7_HIGH) // clock frequency & pin 7 not verified
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.80)
+
+ OKIM6295(config, "oki", 1056000, okim6295_device::PIN7_HIGH).add_route(ALL_OUTPUTS, "mono", 0.80); // clock frequency & pin 7 not verified
ym2203_device &aysnd(YM2203(config.replace(), "aysnd", 3000000));
aysnd.port_a_read_callback().set(FUNC(kingdrby_state::sound_cmd_r));
aysnd.port_b_read_callback().set("oki", FUNC(okim6295_device::read));
aysnd.port_b_write_callback().set("oki", FUNC(okim6295_device::write));
aysnd.add_route(ALL_OUTPUTS, "mono", 0.80);
-MACHINE_CONFIG_END
+}
ROM_START( kingdrby )
ROM_REGION( 0x3000, "master", 0 )
diff --git a/src/mame/drivers/kingobox.cpp b/src/mame/drivers/kingobox.cpp
index cb3f3d8d78a..575bd849403 100644
--- a/src/mame/drivers/kingobox.cpp
+++ b/src/mame/drivers/kingobox.cpp
@@ -29,25 +29,25 @@ Main CPU:
#include "speaker.h"
-WRITE8_MEMBER(kingofb_state::video_interrupt_w)
+void kingofb_state::video_interrupt_w(uint8_t data)
{
m_video_cpu->set_input_line_and_vector(0, HOLD_LINE, 0xff);
}
-WRITE8_MEMBER(kingofb_state::sprite_interrupt_w)
+void kingofb_state::sprite_interrupt_w(uint8_t data)
{
m_sprite_cpu->set_input_line_and_vector(0, HOLD_LINE, 0xff);
}
-WRITE8_MEMBER(kingofb_state::scroll_interrupt_w)
+void kingofb_state::scroll_interrupt_w(uint8_t data)
{
- sprite_interrupt_w(space, offset, data);
+ sprite_interrupt_w(data);
*m_scroll_y = data;
}
-WRITE8_MEMBER(kingofb_state::sound_command_w)
+void kingofb_state::sound_command_w(uint8_t data)
{
- m_soundlatch->write(space, 0, data);
+ m_soundlatch->write(machine().dummy_space(), 0, data);
m_audiocpu->set_input_line_and_vector(0, HOLD_LINE, 0xff);
}
@@ -459,11 +459,11 @@ void kingofb_state::machine_start()
void kingofb_state::machine_reset()
{
- kingofb_f800_w(machine().dummy_space(), 0, 0); // LS174 reset
+ kingofb_f800_w(0); // LS174 reset
}
-MACHINE_CONFIG_START(kingofb_state::kingofb)
-
+void kingofb_state::kingofb(machine_config &config)
+{
/* basic machine hardware */
Z80(config, m_maincpu, 4000000); // 4.0 MHz
m_maincpu->set_addrmap(AS_PROGRAM, &kingofb_state::kingobox_map);
@@ -485,20 +485,20 @@ MACHINE_CONFIG_START(kingofb_state::kingofb)
CLOCK(config, "soundnmi", 6000).signal_handler().set_inputline(m_audiocpu, INPUT_LINE_NMI);
- MCFG_QUANTUM_TIME(attotime::from_hz(6000)) // We really need heavy synching among the processors
+ config.m_minimum_quantum = attotime::from_hz(6000); // We really need heavy synching among the processors
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */)
- MCFG_SCREEN_SIZE(32*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(kingofb_state, screen_update_kingofb)
- MCFG_SCREEN_PALETTE(m_palette)
- MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE("nmigate", input_merger_device, in_w<0>))
-
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, m_palette, gfx_kingobox)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500) /* not accurate */);
+ screen.set_size(32*8, 32*8);
+ screen.set_visarea(0*8, 32*8-1, 2*8, 30*8-1);
+ screen.set_screen_update(FUNC(kingofb_state::screen_update_kingofb));
+ screen.set_palette(m_palette);
+ screen.screen_vblank().set(m_nmigate, FUNC(input_merger_device::in_w<0>));
+
+ GFXDECODE(config, m_gfxdecode, m_palette, gfx_kingobox);
PALETTE(config, m_palette, FUNC(kingofb_state::kingofb_palette), 256+8*2, 256+8);
MCFG_VIDEO_START_OVERRIDE(kingofb_state,kingofb)
@@ -511,15 +511,16 @@ MACHINE_CONFIG_START(kingofb_state::kingofb)
aysnd.port_a_read_callback().set(m_soundlatch, FUNC(generic_latch_8_device::read));
aysnd.add_route(ALL_OUTPUTS, "speaker", 0.25);
- MCFG_DEVICE_ADD("dac", DAC_8BIT_R2R, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 0.125) // 100K (R30-44 even)/200K (R31-45 odd) ladder network
- MCFG_DEVICE_ADD("vref", VOLTAGE_REGULATOR, 0) MCFG_VOLTAGE_REGULATOR_OUTPUT(5.0)
- MCFG_SOUND_ROUTE(0, "dac", 1.0, DAC_VREF_POS_INPUT) MCFG_SOUND_ROUTE(0, "dac", -1.0, DAC_VREF_NEG_INPUT)
-MACHINE_CONFIG_END
+ DAC_8BIT_R2R(config, "dac", 0).add_route(ALL_OUTPUTS, "speaker", 0.125); // 100K (R30-44 even)/200K (R31-45 odd) ladder network
+ voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref"));
+ vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT);
+ vref.add_route(0, "dac", -1.0, DAC_VREF_NEG_INPUT);
+}
/* Ring King */
-MACHINE_CONFIG_START(kingofb_state::ringking)
-
+void kingofb_state::ringking(machine_config &config)
+{
/* basic machine hardware */
Z80(config, m_maincpu, 4000000); // 4.0 MHz
m_maincpu->set_addrmap(AS_PROGRAM, &kingofb_state::ringking_map);
@@ -541,20 +542,20 @@ MACHINE_CONFIG_START(kingofb_state::ringking)
CLOCK(config, "soundnmi", 6000).signal_handler().set_inputline(m_audiocpu, INPUT_LINE_NMI);
- MCFG_QUANTUM_TIME(attotime::from_hz(6000)) // We really need heavy synching among the processors
+ config.m_minimum_quantum = attotime::from_hz(6000); // We really need heavy synching among the processors
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */)
- MCFG_SCREEN_SIZE(32*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(kingofb_state, screen_update_ringking)
- MCFG_SCREEN_PALETTE(m_palette)
- MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE("nmigate", input_merger_device, in_w<0>))
-
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, m_palette, gfx_rk)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500) /* not accurate */);
+ screen.set_size(32*8, 32*8);
+ screen.set_visarea(0*8, 32*8-1, 2*8, 30*8-1);
+ screen.set_screen_update(FUNC(kingofb_state::screen_update_ringking));
+ screen.set_palette(m_palette);
+ screen.screen_vblank().set(m_nmigate, FUNC(input_merger_device::in_w<0>));
+
+ GFXDECODE(config, m_gfxdecode, m_palette, gfx_rk);
PALETTE(config, m_palette, FUNC(kingofb_state::ringking_palette), 256+8*2, 256+8);
MCFG_VIDEO_START_OVERRIDE(kingofb_state,ringking)
@@ -567,10 +568,11 @@ MACHINE_CONFIG_START(kingofb_state::ringking)
aysnd.port_a_read_callback().set(m_soundlatch, FUNC(generic_latch_8_device::read));
aysnd.add_route(ALL_OUTPUTS, "speaker", 0.25);
- MCFG_DEVICE_ADD("dac", DAC_8BIT_R2R, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 0.125) // unknown DAC
- MCFG_DEVICE_ADD("vref", VOLTAGE_REGULATOR, 0) MCFG_VOLTAGE_REGULATOR_OUTPUT(5.0)
- MCFG_SOUND_ROUTE(0, "dac", 1.0, DAC_VREF_POS_INPUT) MCFG_SOUND_ROUTE(0, "dac", -1.0, DAC_VREF_NEG_INPUT)
-MACHINE_CONFIG_END
+ DAC_8BIT_R2R(config, "dac", 0).add_route(ALL_OUTPUTS, "speaker", 0.125); // unknown DAC
+ voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref"));
+ vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT);
+ vref.add_route(0, "dac", -1.0, DAC_VREF_NEG_INPUT);
+}
/***************************************************************************
diff --git a/src/mame/drivers/kingpin.cpp b/src/mame/drivers/kingpin.cpp
index 172396a74fa..0273e41542a 100644
--- a/src/mame/drivers/kingpin.cpp
+++ b/src/mame/drivers/kingpin.cpp
@@ -91,8 +91,7 @@ void kingpin_state::kingpin_io_map(address_map &map)
map.global_mask(0xff);
map(0x00, 0x03).rw("ppi8255_0", FUNC(i8255_device::read), FUNC(i8255_device::write));
map(0x10, 0x13).rw("ppi8255_1", FUNC(i8255_device::read), FUNC(i8255_device::write));
- map(0x20, 0x20).rw("tms9928a", FUNC(tms9928a_device::vram_r), FUNC(tms9928a_device::vram_w));
- map(0x21, 0x21).rw("tms9928a", FUNC(tms9928a_device::register_r), FUNC(tms9928a_device::register_w));
+ map(0x20, 0x21).rw("tms9928a", FUNC(tms9928a_device::read), FUNC(tms9928a_device::write));
map(0x60, 0x60).w(FUNC(kingpin_state::sound_nmi_w));
//AM_RANGE(0x30, 0x30) AM_WRITENOP // lamps?
//AM_RANGE(0x40, 0x40) AM_WRITENOP // lamps?
diff --git a/src/mame/drivers/klax.cpp b/src/mame/drivers/klax.cpp
index fe67297a324..bec9aec2143 100644
--- a/src/mame/drivers/klax.cpp
+++ b/src/mame/drivers/klax.cpp
@@ -194,67 +194,66 @@ GFXDECODE_END
*
*************************************/
-MACHINE_CONFIG_START(klax_state::klax)
-
+void klax_state::klax(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M68000, ATARI_CLOCK_14MHz/2)
- MCFG_DEVICE_PROGRAM_MAP(klax_map)
+ M68000(config, m_maincpu, ATARI_CLOCK_14MHz/2);
+ m_maincpu->set_addrmap(AS_PROGRAM, &klax_state::klax_map);
EEPROM_2816(config, "eeprom").lock_after_write(true);
WATCHDOG_TIMER(config, "watchdog");
/* video hardware */
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_klax)
+ GFXDECODE(config, m_gfxdecode, "palette", gfx_klax);
PALETTE(config, "palette").set_format(palette_device::IRGB_1555, 512).set_membits(8);
- MCFG_TILEMAP_ADD_STANDARD("playfield", "gfxdecode", 2, klax_state, get_playfield_tile_info, 8,8, SCAN_COLS, 64,32)
+ TILEMAP(config, m_playfield_tilemap, m_gfxdecode, 2, 8, 8, TILEMAP_SCAN_COLS, 64, 32);
+ m_playfield_tilemap->set_info_callback(FUNC(klax_state::get_playfield_tile_info));
ATARI_MOTION_OBJECTS(config, m_mob, 0, m_screen, klax_state::s_mob_config);
m_mob->set_gfxdecode(m_gfxdecode);
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_VIDEO_ATTRIBUTES(VIDEO_UPDATE_BEFORE_VBLANK)
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_video_attributes(VIDEO_UPDATE_BEFORE_VBLANK);
/* note: these parameters are from published specs, not derived */
/* the board uses an SOS-2 chip to generate video signals */
- MCFG_SCREEN_RAW_PARAMS(ATARI_CLOCK_14MHz/2, 456, 0, 336, 262, 0, 240)
- MCFG_SCREEN_UPDATE_DRIVER(klax_state, screen_update_klax)
- MCFG_SCREEN_PALETTE("palette")
- MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE(*this, klax_state, video_int_write_line))
+ m_screen->set_raw(ATARI_CLOCK_14MHz/2, 456, 0, 336, 262, 0, 240);
+ m_screen->set_screen_update(FUNC(klax_state::screen_update_klax));
+ m_screen->set_palette("palette");
+ m_screen->screen_vblank().set(FUNC(klax_state::video_int_write_line));
/* sound hardware */
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("oki", OKIM6295, ATARI_CLOCK_14MHz/4/4, okim6295_device::PIN7_HIGH)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
-MACHINE_CONFIG_END
+ OKIM6295(config, "oki", ATARI_CLOCK_14MHz/4/4, okim6295_device::PIN7_HIGH).add_route(ALL_OUTPUTS, "mono", 1.0);
+}
void klax_state::bootleg_sound_map(address_map &map)
{
map(0x0000, 0x7fff).rom();
}
-MACHINE_CONFIG_START(klax_state::klax2bl)
+void klax_state::klax2bl(machine_config &config)
+{
klax(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(klax2bl_map)
+ m_maincpu->set_addrmap(AS_PROGRAM, &klax_state::klax2bl_map);
- MCFG_DEVICE_REMOVE("oki") // no 6295 here
+ config.device_remove("oki"); // no 6295 here
- MCFG_DEVICE_ADD("audiocpu", Z80, 6000000) /* ? */
- MCFG_DEVICE_PROGRAM_MAP(bootleg_sound_map)
+ z80_device &audiocpu(Z80(config, "audiocpu", 6000000)); /* ? */
+ audiocpu.set_addrmap(AS_PROGRAM, &klax_state::bootleg_sound_map);
- MCFG_GFXDECODE_MODIFY("gfxdecode", gfx_klax2bl)
+ m_gfxdecode->set_info(gfx_klax2bl);
// guess, probably something like this
// 2 x msm at least on bootleg set 2 (ic18 and ic19)
- MCFG_DEVICE_ADD("msm", MSM5205, 375000) /* ? */
-// MCFG_MSM5205_VCLK_CB(WRITELINE(*this, klax_state, m5205_int1)) /* interrupt function */
-// MCFG_MSM5205_PRESCALER_SELECTOR(MSM5205_S96_4B) /* 4KHz 4-bit */
-// MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25)
-
-MACHINE_CONFIG_END
+ MSM5205(config, "msm", 375000); /* ? */
+// msm.vck_legacy_callback().set(FUNC(klax_state::m5205_int1)); /* interrupt function */
+// msm.set_prescaler_selector(msm5205_device::MSM5205_S96_4B); /* 4KHz 4-bit */
+// msm.add_route(ALL_OUTPUTS, "mono", 0.25);
+}
/*************************************
*
diff --git a/src/mame/drivers/kncljoe.cpp b/src/mame/drivers/kncljoe.cpp
index cdd8d80de2c..74d90fec1c6 100644
--- a/src/mame/drivers/kncljoe.cpp
+++ b/src/mame/drivers/kncljoe.cpp
@@ -57,8 +57,8 @@ void kncljoe_state::main_map(address_map &map)
map(0xd804, 0xd804).portr("DSWB");
map(0xd800, 0xd800).w(FUNC(kncljoe_state::sound_cmd_w));
map(0xd801, 0xd801).w(FUNC(kncljoe_state::kncljoe_control_w));
- map(0xd802, 0xd802).w("sn1", FUNC(sn76489_device::command_w));
- map(0xd803, 0xd803).w("sn2", FUNC(sn76489_device::command_w));
+ map(0xd802, 0xd802).w("sn1", FUNC(sn76489_device::write));
+ map(0xd803, 0xd803).w("sn2", FUNC(sn76489_device::write));
map(0xd807, 0xd807).nopr(); /* unknown read */
map(0xd817, 0xd817).nopr(); /* unknown read */
map(0xe800, 0xefff).ram().share("spriteram");
@@ -77,7 +77,7 @@ WRITE8_MEMBER(kncljoe_state::m6803_port2_w)
{
/* control or data port? */
if (m_port2 & 0x08)
- m_ay8910->data_address_w(space, m_port2 >> 2, m_port1);
+ m_ay8910->data_address_w(m_port2 >> 2, m_port1);
}
m_port2 = data;
}
@@ -85,7 +85,7 @@ WRITE8_MEMBER(kncljoe_state::m6803_port2_w)
READ8_MEMBER(kncljoe_state::m6803_port1_r)
{
if (m_port2 & 0x08)
- return m_ay8910->data_r(space, 0);
+ return m_ay8910->data_r();
return 0xff;
}
@@ -249,12 +249,12 @@ void kncljoe_state::machine_reset()
m_flipscreen = 0;
}
-MACHINE_CONFIG_START(kncljoe_state::kncljoe)
-
+void kncljoe_state::kncljoe(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, XTAL(6'000'000)) /* verified on pcb */
- MCFG_DEVICE_PROGRAM_MAP(main_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", kncljoe_state, irq0_line_hold)
+ Z80(config, m_maincpu, XTAL(6'000'000)); /* verified on pcb */
+ m_maincpu->set_addrmap(AS_PROGRAM, &kncljoe_state::main_map);
+ m_maincpu->set_vblank_int("screen", FUNC(kncljoe_state::irq0_line_hold));
m6803_cpu_device &soundcpu(M6803(config, "soundcpu", XTAL(3'579'545))); /* verified on pcb */
soundcpu.set_addrmap(AS_PROGRAM, &kncljoe_state::sound_map);
@@ -265,14 +265,14 @@ MACHINE_CONFIG_START(kncljoe_state::kncljoe)
soundcpu.set_periodic_int(FUNC(kncljoe_state::sound_nmi), attotime::from_hz((double)3970)); //measured 3.970 kHz
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_VIDEO_ATTRIBUTES(VIDEO_UPDATE_AFTER_VBLANK)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(1500))
- MCFG_SCREEN_SIZE(32*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(1*8, 31*8-1, 0*8, 32*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(kncljoe_state, screen_update_kncljoe)
- MCFG_SCREEN_PALETTE(m_palette)
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_video_attributes(VIDEO_UPDATE_AFTER_VBLANK);
+ m_screen->set_refresh_hz(60);
+ m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(1500));
+ m_screen->set_size(32*8, 32*8);
+ m_screen->set_visarea(1*8, 31*8-1, 0*8, 32*8-1);
+ m_screen->set_screen_update(FUNC(kncljoe_state::screen_update_kncljoe));
+ m_screen->set_palette(m_palette);
GFXDECODE(config, m_gfxdecode, m_palette, gfx_kncljoe);
PALETTE(config, m_palette, FUNC(kncljoe_state::kncljoe_palette), 16*8+16*8, 128+16);
@@ -287,12 +287,10 @@ MACHINE_CONFIG_START(kncljoe_state::kncljoe)
m_ay8910->port_b_write_callback().set(FUNC(kncljoe_state::unused_w));
m_ay8910->add_route(ALL_OUTPUTS, "mono", 0.30);
- MCFG_DEVICE_ADD("sn1", SN76489, XTAL(3'579'545)) /* verified on pcb */
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.30)
+ SN76489(config, "sn1", XTAL(3'579'545)).add_route(ALL_OUTPUTS, "mono", 0.30); /* verified on pcb */
- MCFG_DEVICE_ADD("sn2", SN76489, XTAL(3'579'545)) /* verified on pcb */
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.30)
-MACHINE_CONFIG_END
+ SN76489(config, "sn2", XTAL(3'579'545)).add_route(ALL_OUTPUTS, "mono", 0.30); /* verified on pcb */
+}
diff --git a/src/mame/drivers/koftball.cpp b/src/mame/drivers/koftball.cpp
index 05b82ee4fa7..2b1c1658888 100644
--- a/src/mame/drivers/koftball.cpp
+++ b/src/mame/drivers/koftball.cpp
@@ -238,36 +238,37 @@ static GFXDECODE_START( gfx_koftball )
GFXDECODE_END
-MACHINE_CONFIG_START(koftball_state::koftball)
- MCFG_DEVICE_ADD("maincpu", M68000, XTAL(21'477'272) / 2)
- MCFG_DEVICE_PROGRAM_MAP(koftball_mem)
- MCFG_TIMER_DRIVER_ADD_SCANLINE("scantimer", koftball_state, bmc_interrupt, "screen", 0, 1)
-
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */)
- MCFG_SCREEN_UPDATE_DRIVER(koftball_state, screen_update_koftball)
- MCFG_SCREEN_SIZE(64*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 64*8-1, 0*8, 30*8-1)
- MCFG_SCREEN_PALETTE("palette")
-
- MCFG_PALETTE_ADD("palette", 256)
+void koftball_state::koftball(machine_config &config)
+{
+ M68000(config, m_maincpu, XTAL(21'477'272) / 2);
+ m_maincpu->set_addrmap(AS_PROGRAM, &koftball_state::koftball_mem);
+ TIMER(config, "scantimer").configure_scanline(FUNC(koftball_state::bmc_interrupt), "screen", 0, 1);
+
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500) /* not accurate */);
+ screen.set_screen_update(FUNC(koftball_state::screen_update_koftball));
+ screen.set_size(64*8, 32*8);
+ screen.set_visarea(0*8, 64*8-1, 0*8, 30*8-1);
+ screen.set_palette(m_palette);
+
+ PALETTE(config, m_palette).set_entries(256);
ramdac_device &ramdac(RAMDAC(config, "ramdac", 0, m_palette));
ramdac.set_addrmap(0, &koftball_state::ramdac_map);
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_koftball)
+ GFXDECODE(config, m_gfxdecode, m_palette, gfx_koftball);
SPEAKER(config, "lspeaker").front_left();
SPEAKER(config, "rspeaker").front_right();
- MCFG_DEVICE_ADD("ymsnd", YM2413, XTAL(3'579'545)) // guessed chip type, clock not verified
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 0.50)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 0.50)
+ ym2413_device &ymsnd(YM2413(config, "ymsnd", XTAL(3'579'545))); // guessed chip type, clock not verified
+ ymsnd.add_route(ALL_OUTPUTS, "lspeaker", 0.50);
+ ymsnd.add_route(ALL_OUTPUTS, "rspeaker", 0.50);
- MCFG_DEVICE_ADD("oki", OKIM6295, 1122000, okim6295_device::PIN7_LOW) /* clock frequency & pin 7 not verified */
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 0.50)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 0.50)
-MACHINE_CONFIG_END
+ okim6295_device &oki(OKIM6295(config, "oki", 1122000, okim6295_device::PIN7_LOW)); /* clock frequency & pin 7 not verified */
+ oki.add_route(ALL_OUTPUTS, "lspeaker", 0.50);
+ oki.add_route(ALL_OUTPUTS, "rspeaker", 0.50);
+}
ROM_START( koftball )
ROM_REGION( 0x200000, "maincpu", 0 ) /* 68000 Code */
diff --git a/src/mame/drivers/koikoi.cpp b/src/mame/drivers/koikoi.cpp
index 51eb86d950f..e2ee71ee3a5 100644
--- a/src/mame/drivers/koikoi.cpp
+++ b/src/mame/drivers/koikoi.cpp
@@ -354,23 +354,23 @@ void koikoi_state::machine_reset()
m_ioram[i] = 0;
}
-MACHINE_CONFIG_START(koikoi_state::koikoi)
-
+void koikoi_state::koikoi(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80,KOIKOI_CRYSTAL/4) /* ?? */
- MCFG_DEVICE_PROGRAM_MAP(koikoi_map)
- MCFG_DEVICE_IO_MAP(koikoi_io_map)
+ Z80(config, m_maincpu, KOIKOI_CRYSTAL/4); /* ?? */
+ m_maincpu->set_addrmap(AS_PROGRAM, &koikoi_state::koikoi_map);
+ m_maincpu->set_addrmap(AS_IO, &koikoi_state::koikoi_io_map);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(32*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 0*8, 32*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(koikoi_state, screen_update_koikoi)
- MCFG_SCREEN_PALETTE("palette")
- MCFG_SCREEN_VBLANK_CALLBACK(INPUTLINE("maincpu", INPUT_LINE_NMI))
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(32*8, 32*8);
+ screen.set_visarea(0*8, 32*8-1, 0*8, 32*8-1);
+ screen.set_screen_update(FUNC(koikoi_state::screen_update_koikoi));
+ screen.set_palette("palette");
+ screen.screen_vblank().set_inputline(m_maincpu, INPUT_LINE_NMI);
GFXDECODE(config, m_gfxdecode, "palette", gfx_koikoi);
PALETTE(config, "palette", FUNC(koikoi_state::koikoi_palette), 8 * 32, 16);
@@ -382,7 +382,7 @@ MACHINE_CONFIG_START(koikoi_state::koikoi)
aysnd.port_b_read_callback().set(FUNC(koikoi_state::input_r));
aysnd.port_a_write_callback().set(FUNC(koikoi_state::unknown_w));
aysnd.add_route(ALL_OUTPUTS, "mono", 0.10);
-MACHINE_CONFIG_END
+}
/*************************************
diff --git a/src/mame/drivers/konamigv.cpp b/src/mame/drivers/konamigv.cpp
index 36330f5205b..664108f51cc 100644
--- a/src/mame/drivers/konamigv.cpp
+++ b/src/mame/drivers/konamigv.cpp
@@ -466,8 +466,8 @@ READ16_MEMBER(simpbowl_state::flash_r)
{
int chip = (m_flash_address >= 0x200000) ? 2 : 0;
- int ret = ( m_flash8[chip]->read(space, m_flash_address & 0x1fffff) & 0xff ) |
- ( m_flash8[chip+1]->read(space, m_flash_address & 0x1fffff) << 8 );
+ int ret = ( m_flash8[chip]->read(m_flash_address & 0x1fffff) & 0xff ) |
+ ( m_flash8[chip+1]->read(m_flash_address & 0x1fffff) << 8 );
m_flash_address++;
@@ -485,8 +485,8 @@ WRITE16_MEMBER(simpbowl_state::flash_w)
{
case 0:
chip = (m_flash_address >= 0x200000) ? 2 : 0;
- m_flash8[chip]->write(space, m_flash_address & 0x1fffff, data&0xff);
- m_flash8[chip+1]->write(space, m_flash_address & 0x1fffff, (data>>8)&0xff);
+ m_flash8[chip]->write(m_flash_address & 0x1fffff, data&0xff);
+ m_flash8[chip+1]->write(m_flash_address & 0x1fffff, (data>>8)&0xff);
break;
case 1:
@@ -506,10 +506,10 @@ WRITE16_MEMBER(simpbowl_state::flash_w)
}
}
-MACHINE_CONFIG_START(simpbowl_state::simpbowl)
+void simpbowl_state::simpbowl(machine_config &config)
+{
konamigv(config);
- MCFG_DEVICE_MODIFY( "maincpu" )
- MCFG_DEVICE_PROGRAM_MAP( simpbowl_map )
+ m_maincpu->set_addrmap(AS_PROGRAM, &simpbowl_state::simpbowl_map);
FUJITSU_29F016A(config, "flash0");
FUJITSU_29F016A(config, "flash1");
@@ -519,7 +519,7 @@ MACHINE_CONFIG_START(simpbowl_state::simpbowl)
upd4701_device &upd(UPD4701A(config, "upd"));
upd.set_portx_tag("TRACK0_X");
upd.set_porty_tag("TRACK0_Y");
-MACHINE_CONFIG_END
+}
static INPUT_PORTS_START( simpbowl )
PORT_INCLUDE( konamigv )
@@ -546,10 +546,10 @@ WRITE16_MEMBER(konamigv_state::btc_trackball_w)
}
}
-MACHINE_CONFIG_START(konamigv_state::btchamp)
+void konamigv_state::btchamp(machine_config &config)
+{
konamigv(config);
- MCFG_DEVICE_MODIFY( "maincpu" )
- MCFG_DEVICE_PROGRAM_MAP( btchamp_map )
+ m_maincpu->set_addrmap(AS_PROGRAM, &konamigv_state::btchamp_map);
SHARP_LH28F400(config, "flash");
@@ -560,7 +560,7 @@ MACHINE_CONFIG_START(konamigv_state::btchamp)
UPD4701A(config, m_btc_trackball[1]);
m_btc_trackball[1]->set_portx_tag("TRACK1_X");
m_btc_trackball[1]->set_porty_tag("TRACK1_Y");
-MACHINE_CONFIG_END
+}
static INPUT_PORTS_START( btchamp )
PORT_INCLUDE( konamigv )
@@ -604,11 +604,11 @@ WRITE16_MEMBER(konamigv_state::tokimeki_serial_w)
}
-MACHINE_CONFIG_START(konamigv_state::tmosh)
+void konamigv_state::tmosh(machine_config &config)
+{
konamigv(config);
- MCFG_DEVICE_MODIFY( "maincpu" )
- MCFG_DEVICE_PROGRAM_MAP( tmosh_map )
-MACHINE_CONFIG_END
+ m_maincpu->set_addrmap(AS_PROGRAM, &konamigv_state::tmosh_map);
+}
/*
Dead Eye
@@ -620,13 +620,13 @@ CD:
A01
*/
-MACHINE_CONFIG_START(konamigv_state::kdeadeye)
+void konamigv_state::kdeadeye(machine_config &config)
+{
konamigv(config);
- MCFG_DEVICE_MODIFY( "maincpu" )
- MCFG_DEVICE_PROGRAM_MAP( kdeadeye_map )
+ m_maincpu->set_addrmap(AS_PROGRAM, &konamigv_state::kdeadeye_map);
SHARP_LH28F400(config, "flash");
-MACHINE_CONFIG_END
+}
static INPUT_PORTS_START( kdeadeye )
PORT_INCLUDE( konamigv )
diff --git a/src/mame/drivers/konamigx.cpp b/src/mame/drivers/konamigx.cpp
index 50e33254c5c..565a2837f3d 100644
--- a/src/mame/drivers/konamigx.cpp
+++ b/src/mame/drivers/konamigx.cpp
@@ -1645,7 +1645,7 @@ void konamigx_state::konamigx(machine_config &config)
/* These parameters are actual value written to the CCU.
tbyahhoo attract mode desync is caused by another matter. */
- //MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(600))
+ //MCFG_SCREEN_vblank_time(ATTOSECONDS_IN_USEC(600))
// TODO: WTF, without these most games crashes? Some legacy call in video code???
m_screen->set_size(1024, 1024);
m_screen->set_visarea(24, 24+288-1, 16, 16+224-1);
diff --git a/src/mame/drivers/konamim2.cpp b/src/mame/drivers/konamim2.cpp
index fee5bee182f..a8228df1359 100644
--- a/src/mame/drivers/konamim2.cpp
+++ b/src/mame/drivers/konamim2.cpp
@@ -1165,7 +1165,6 @@ void konamim2_state::konamim2(machine_config &config)
DAC_16BIT_R2R_TWOS_COMPLEMENT(config, m_rdac, 0).add_route(ALL_OUTPUTS, "rspeaker", 1.0);
voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref", 0));
- vref.set_output(5.0);
vref.add_route(0, "ldac", 1.0, DAC_VREF_POS_INPUT);
vref.add_route(0, "ldac", -1.0, DAC_VREF_NEG_INPUT);
vref.add_route(0, "rdac", 1.0, DAC_VREF_POS_INPUT);
@@ -1203,7 +1202,7 @@ void konamim2_state::set_arcres(machine_config &config)
void konamim2_state::add_ymz280b(machine_config &config)
{
- // TODO: The YMZ280B outputs are actually routed to a speaker in each gun
+ // TODO: The YMZ280B outputs are actually routed to a speaker in each gun
YMZ280B(config, m_ymz280b, XTAL(16'934'400));
m_ymz280b->add_route(0, "lspeaker", 0.5);
m_ymz280b->add_route(1, "rspeaker", 0.5);
@@ -1454,8 +1453,8 @@ ROM_END
void konamim2_state::install_m48t58()
{
- read8_delegate read_delegate(FUNC(m48t58_device::read), &(*m_m48t58));
- write8_delegate write_delegate(FUNC(m48t58_device::write), &(*m_m48t58));
+ read8sm_delegate read_delegate(FUNC(m48t58_device::read), &(*m_m48t58));
+ write8sm_delegate write_delegate(FUNC(m48t58_device::write), &(*m_m48t58));
m_ppc1->space(AS_PROGRAM).install_readwrite_handler(0x36c00000, 0x36c03fff, read_delegate, write_delegate, 0xff00ff00ff00ff00ULL);
m_ppc2->space(AS_PROGRAM).install_readwrite_handler(0x36c00000, 0x36c03fff, read_delegate, write_delegate, 0xff00ff00ff00ff00ULL);
@@ -1463,8 +1462,8 @@ void konamim2_state::install_m48t58()
void konamim2_state::install_ymz280b()
{
- read8_delegate read_delegate(FUNC(ymz280b_device::read), &(*m_ymz280b));
- write8_delegate write_delegate(FUNC(ymz280b_device::write), &(*m_ymz280b));
+ read8sm_delegate read_delegate(FUNC(ymz280b_device::read), &(*m_ymz280b));
+ write8sm_delegate write_delegate(FUNC(ymz280b_device::write), &(*m_ymz280b));
m_ppc1->space(AS_PROGRAM).install_readwrite_handler(0x3e800000, 0x3e80000f, read_delegate, write_delegate, 0xff00ff0000000000ULL);
m_ppc2->space(AS_PROGRAM).install_readwrite_handler(0x3e800000, 0x3e80000f, read_delegate, write_delegate, 0xff00ff0000000000ULL);
diff --git a/src/mame/drivers/konblands.cpp b/src/mame/drivers/konblands.cpp
index a50f23ca37e..4edf9ddf888 100644
--- a/src/mame/drivers/konblands.cpp
+++ b/src/mame/drivers/konblands.cpp
@@ -160,7 +160,7 @@ void konblands_state::konblands_map(address_map &map)
map(0x1005, 0x1005).nopw(); // enable audio
map(0x1006, 0x1006).w(FUNC(konblands_state::irq_enable_w));
map(0x1007, 0x1007).w(FUNC(konblands_state::firq_enable_w));
- map(0x1800, 0x1800).portr("INPUTS").w("sn", FUNC(sn76496_device::command_w));
+ map(0x1800, 0x1800).portr("INPUTS").w("sn", FUNC(sn76496_device::write));
map(0x4000, 0x47ff).ram().share("vram");
map(0x4800, 0x4bff).ram();
map(0x5800, 0x5800).nopw(); // watchdog
@@ -178,7 +178,7 @@ void konblands_state::konblandsh_map(address_map &map)
map(0x0807, 0x0807).nopr().w(FUNC(konblands_state::firq_enable_w));
map(0x0c00, 0x0c00).portr("INPUTS");
map(0x1000, 0x1000).portr("DSW1");
- map(0x1400, 0x1400).w("sn", FUNC(sn76496_device::command_w));
+ map(0x1400, 0x1400).w("sn", FUNC(sn76496_device::write));
map(0x1800, 0x1800).nopw(); // sn latch
map(0x2000, 0x27ff).ram().share("vram");
map(0x2800, 0x2fff).ram();
@@ -279,17 +279,17 @@ WRITE_LINE_MEMBER(konblands_state::ld_command_strobe_cb)
MACHINE_CONFIG_START(konblands_state::konblands)
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu",MC6809E,MASTER_CLOCK/12)
- MCFG_DEVICE_PROGRAM_MAP(konblands_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", konblands_state, vblank_irq)
- MCFG_DEVICE_PERIODIC_INT_DRIVER(konblands_state, timer_irq, 8) // 8 times per frame
+ MC6809E(config, m_maincpu, MASTER_CLOCK/12);
+ m_maincpu->set_addrmap(AS_PROGRAM, &konblands_state::konblands_map);
+ m_maincpu->set_vblank_int("screen", FUNC(konblands_state::vblank_irq));
+ m_maincpu->set_periodic_int(FUNC(konblands_state::timer_irq), attotime::from_hz(8)); // 8 times per frame
/* video hardware */
- MCFG_LASERDISC_LDV1000_ADD("laserdisc")
- MCFG_LASERDISC_LDV1000_COMMAND_STROBE_CB(WRITELINE(*this, konblands_state, ld_command_strobe_cb))
+ PIONEER_LDV1000(config, m_laserdisc, 0);
+ m_laserdisc->command_strobe_callback().set(FUNC(konblands_state::ld_command_strobe_cb));
// TODO: might be different
- MCFG_LASERDISC_OVERLAY_DRIVER(512, 256, konblands_state, screen_update)
- MCFG_LASERDISC_OVERLAY_PALETTE("palette")
+ m_laserdisc->set_overlay(512, 256, FUNC(konblands_state::screen_update));
+ m_laserdisc->set_overlay_palette("palette");
/* video hardware */
MCFG_LASERDISC_SCREEN_ADD_NTSC("screen", "laserdisc")
@@ -300,15 +300,14 @@ MACHINE_CONFIG_START(konblands_state::konblands)
/* sound hardware */
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("sn", SN76496, MASTER_CLOCK/12)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.50)
-MACHINE_CONFIG_END
+ SN76496(config, "sn", MASTER_CLOCK/12).add_route(ALL_OUTPUTS, "mono", 0.50);
+}
-MACHINE_CONFIG_START(konblands_state::konblandsh)
+void konblands_state::konblandsh(machine_config &config)
+{
konblands(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(konblandsh_map)
-MACHINE_CONFIG_END
+ m_maincpu->set_addrmap(AS_PROGRAM, &konblands_state::konblandsh_map);
+}
/***************************************************************************
diff --git a/src/mame/drivers/konendev.cpp b/src/mame/drivers/konendev.cpp
index 2708b198fe7..d61bef2d23a 100644
--- a/src/mame/drivers/konendev.cpp
+++ b/src/mame/drivers/konendev.cpp
@@ -304,22 +304,23 @@ INTERRUPT_GEN_MEMBER(konendev_state::vbl_interrupt)
device.execute().set_input_line(INPUT_LINE_IRQ3, ASSERT_LINE);
}
-MACHINE_CONFIG_START(konendev_state::konendev)
+void konendev_state::konendev(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", PPC403GCX, 32000000) // Clock unknown
- MCFG_DEVICE_PROGRAM_MAP(konendev_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", konendev_state, vbl_interrupt)
+ PPC403GCX(config, m_maincpu, 32000000); // Clock unknown
+ m_maincpu->set_addrmap(AS_PROGRAM, &konendev_state::konendev_map);
+ m_maincpu->set_vblank_int("screen", FUNC(konendev_state::vbl_interrupt));
/* video hardware */
PALETTE(config, "palette", palette_device::RGB_555);
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) // Not accurate
- MCFG_SCREEN_SIZE(640, 480)
- MCFG_SCREEN_VISIBLE_AREA(0, 639, 0, 479)
- MCFG_SCREEN_UPDATE_DRIVER(konendev_state, screen_update)
- MCFG_SCREEN_PALETTE("palette")
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500)); // Not accurate
+ screen.set_size(640, 480);
+ screen.set_visarea(0, 639, 0, 479);
+ screen.set_screen_update(FUNC(konendev_state::screen_update));
+ screen.set_palette("palette");
K057714(config, m_gcu, 0);
m_gcu->irq_callback().set(FUNC(konendev_state::gcu_interrupt));
@@ -333,10 +334,10 @@ MACHINE_CONFIG_START(konendev_state::konendev)
SPEAKER(config, "lspeaker").front_left();
SPEAKER(config, "rspeaker").front_right();
- MCFG_DEVICE_ADD("ymz", YMZ280B, 16934400) // Clock unknown
- MCFG_SOUND_ROUTE(0, "lspeaker", 1.0)
- MCFG_SOUND_ROUTE(1, "rspeaker", 1.0)
-MACHINE_CONFIG_END
+ ymz280b_device &ymz(YMZ280B(config, "ymz", 16934400)); // Clock unknown
+ ymz.add_route(0, "lspeaker", 1.0);
+ ymz.add_route(1, "rspeaker", 1.0);
+}
/* Interesting sets */
diff --git a/src/mame/drivers/konmedal68k.cpp b/src/mame/drivers/konmedal68k.cpp
index 4bc346fc4c2..7b562fa8655 100644
--- a/src/mame/drivers/konmedal68k.cpp
+++ b/src/mame/drivers/konmedal68k.cpp
@@ -294,20 +294,21 @@ void konmedal68k_state::machine_reset()
m_control = m_control2 = 0;
}
-MACHINE_CONFIG_START(konmedal68k_state::kzaurus)
+void konmedal68k_state::kzaurus(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M68000, XTAL(33'868'800)/4 ) // 33.8688 MHz crystal verified on PCB
- MCFG_DEVICE_PROGRAM_MAP(kzaurus_main)
- MCFG_TIMER_DRIVER_ADD_SCANLINE("scantimer", konmedal68k_state, scanline, "screen", 0, 1)
+ M68000(config, m_maincpu, XTAL(33'868'800)/4); // 33.8688 MHz crystal verified on PCB
+ m_maincpu->set_addrmap(AS_PROGRAM, &konmedal68k_state::kzaurus_main);
+ TIMER(config, "scantimer").configure_scanline(FUNC(konmedal68k_state::scanline), "screen", 0, 1);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(59.62) /* verified on pcb */
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(64*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(40, 400-1, 16, 240-1)
- MCFG_SCREEN_UPDATE_DRIVER(konmedal68k_state, screen_update_konmedal68k)
- MCFG_SCREEN_PALETTE("palette")
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(59.62); /* verified on pcb */
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(64*8, 32*8);
+ screen.set_visarea(40, 400-1, 16, 240-1);
+ screen.set_screen_update(FUNC(konmedal68k_state::screen_update_konmedal68k));
+ screen.set_palette("palette");
PALETTE(config, "palette").set_format(palette_device::xBGR_888, 8192).enable_shadows();
@@ -322,10 +323,10 @@ MACHINE_CONFIG_START(konmedal68k_state::kzaurus)
SPEAKER(config, "lspeaker").front_left();
SPEAKER(config, "rspeaker").front_right();
- MCFG_DEVICE_ADD("ymz", YMZ280B, XTAL(33'868'800)/2) // 33.8688 MHz xtal verified on PCB
- MCFG_SOUND_ROUTE(0, "lspeaker", 1.0)
- MCFG_SOUND_ROUTE(1, "rspeaker", 1.0)
-MACHINE_CONFIG_END
+ YMZ280B(config, m_ymz, XTAL(33'868'800)/2); // 33.8688 MHz xtal verified on PCB
+ m_ymz->add_route(0, "lspeaker", 1.0);
+ m_ymz->add_route(1, "rspeaker", 1.0);
+}
ROM_START( kzaurus )
ROM_REGION( 0x80000, "maincpu", 0 ) /* main program */
diff --git a/src/mame/drivers/kontest.cpp b/src/mame/drivers/kontest.cpp
index bc01ab4fe74..2bf98250613 100644
--- a/src/mame/drivers/kontest.cpp
+++ b/src/mame/drivers/kontest.cpp
@@ -179,8 +179,8 @@ void kontest_state::kontest_map(address_map &map)
void kontest_state::kontest_io(address_map &map)
{
map.global_mask(0xff);
- map(0x00, 0x00).w("sn1", FUNC(sn76489a_device::command_w));
- map(0x04, 0x04).w("sn2", FUNC(sn76489a_device::command_w));
+ map(0x00, 0x00).w("sn1", FUNC(sn76489a_device::write));
+ map(0x04, 0x04).w("sn2", FUNC(sn76489a_device::write));
map(0x08, 0x08).w(FUNC(kontest_state::control_w));
map(0x0c, 0x0c).portr("IN0");
map(0x0d, 0x0d).portr("IN1");
@@ -254,21 +254,21 @@ void kontest_state::machine_reset()
m_control = 0;
}
-MACHINE_CONFIG_START(kontest_state::kontest)
-
+void kontest_state::kontest(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80,MAIN_CLOCK/8)
- MCFG_DEVICE_PROGRAM_MAP(kontest_map)
- MCFG_DEVICE_IO_MAP(kontest_io)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", kontest_state, kontest_interrupt)
+ Z80(config, m_maincpu, MAIN_CLOCK/8);
+ m_maincpu->set_addrmap(AS_PROGRAM, &kontest_state::kontest_map);
+ m_maincpu->set_addrmap(AS_IO, &kontest_state::kontest_io);
+ m_maincpu->set_vblank_int("screen", FUNC(kontest_state::kontest_interrupt));
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_UPDATE_DRIVER(kontest_state, screen_update)
- MCFG_SCREEN_SIZE(32*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_screen_update(FUNC(kontest_state::screen_update));
+ screen.set_size(32*8, 32*8);
+ screen.set_visarea(0*8, 32*8-1, 2*8, 30*8-1);
PALETTE(config, m_palette, FUNC(kontest_state::kontest_palette), 32);
@@ -276,12 +276,10 @@ MACHINE_CONFIG_START(kontest_state::kontest)
SPEAKER(config, "lspeaker").front_left();
SPEAKER(config, "rspeaker").front_right();
- MCFG_DEVICE_ADD("sn1", SN76489A, MAIN_CLOCK/16)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 0.50)
+ SN76489A(config, "sn1", MAIN_CLOCK/16).add_route(ALL_OUTPUTS, "rspeaker", 0.50);
- MCFG_DEVICE_ADD("sn2", SN76489A, MAIN_CLOCK/16)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 0.50)
-MACHINE_CONFIG_END
+ SN76489A(config, "sn2", MAIN_CLOCK/16).add_route(ALL_OUTPUTS, "lspeaker", 0.50);
+}
/***************************************************************************
diff --git a/src/mame/drivers/kopunch.cpp b/src/mame/drivers/kopunch.cpp
index 7de29871fa1..f846590101a 100644
--- a/src/mame/drivers/kopunch.cpp
+++ b/src/mame/drivers/kopunch.cpp
@@ -233,13 +233,13 @@ void kopunch_state::machine_start()
save_item(NAME(m_scrollx));
}
-MACHINE_CONFIG_START(kopunch_state::kopunch)
-
+void kopunch_state::kopunch(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", I8085A, 4000000) // 4 MHz?
- MCFG_DEVICE_PROGRAM_MAP(kopunch_map)
- MCFG_DEVICE_IO_MAP(kopunch_io_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", kopunch_state, vblank_interrupt)
+ I8085A(config, m_maincpu, 4000000); // 4 MHz?
+ m_maincpu->set_addrmap(AS_PROGRAM, &kopunch_state::kopunch_map);
+ m_maincpu->set_addrmap(AS_IO, &kopunch_state::kopunch_io_map);
+ m_maincpu->set_vblank_int("screen", FUNC(kopunch_state::vblank_interrupt));
i8255_device &ppi0(I8255A(config, "ppi8255_0"));
// $30 - always $9b (PPI mode 0, ports A & B & C as input)
@@ -267,20 +267,20 @@ MACHINE_CONFIG_START(kopunch_state::kopunch)
ppi3.out_pc_callback().set(FUNC(kopunch_state::gfxbank_w));
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(32*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 28*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(kopunch_state, screen_update_kopunch)
- MCFG_SCREEN_PALETTE("palette")
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(32*8, 32*8);
+ screen.set_visarea(0*8, 32*8-1, 2*8, 28*8-1);
+ screen.set_screen_update(FUNC(kopunch_state::screen_update_kopunch));
+ screen.set_palette("palette");
GFXDECODE(config, m_gfxdecode, "palette", gfx_kopunch);
PALETTE(config, "palette", FUNC(kopunch_state::kopunch_palette), 8);
/* sound hardware */
// ...
-MACHINE_CONFIG_END
+}
diff --git a/src/mame/drivers/kramermc.cpp b/src/mame/drivers/kramermc.cpp
index 5924c4a9ba5..b2229f86a83 100644
--- a/src/mame/drivers/kramermc.cpp
+++ b/src/mame/drivers/kramermc.cpp
@@ -111,11 +111,12 @@ static INPUT_PORTS_START( kramermc )
INPUT_PORTS_END
/* Machine driver */
-MACHINE_CONFIG_START(kramermc_state::kramermc)
+void kramermc_state::kramermc(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, 1500000)
- MCFG_DEVICE_PROGRAM_MAP(kramermc_mem)
- MCFG_DEVICE_IO_MAP(kramermc_io)
+ Z80(config, m_maincpu, 1500000);
+ m_maincpu->set_addrmap(AS_PROGRAM, &kramermc_state::kramermc_mem);
+ m_maincpu->set_addrmap(AS_IO, &kramermc_state::kramermc_io);
z80pio_device& pio(Z80PIO(config, "z80pio", 1500000));
pio.in_pa_callback().set(FUNC(kramermc_state::kramermc_port_a_r));
@@ -123,19 +124,18 @@ MACHINE_CONFIG_START(kramermc_state::kramermc)
pio.in_pb_callback().set(FUNC(kramermc_state::kramermc_port_b_r));
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(50)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */
- MCFG_SCREEN_SIZE(64*8, 16*8)
- MCFG_SCREEN_VISIBLE_AREA(0, 64*8-1, 0, 16*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(kramermc_state, screen_update_kramermc)
- MCFG_SCREEN_PALETTE(m_palette)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(50);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */
+ screen.set_size(64*8, 16*8);
+ screen.set_visarea(0, 64*8-1, 0, 16*8-1);
+ screen.set_screen_update(FUNC(kramermc_state::screen_update_kramermc));
+ screen.set_palette(m_palette);
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_kramermc)
+ GFXDECODE(config, m_gfxdecode, m_palette, gfx_kramermc);
PALETTE(config, m_palette, palette_device::MONOCHROME);
-
-MACHINE_CONFIG_END
+}
/* ROM definition */
ROM_START( kramermc )
diff --git a/src/mame/drivers/kron.cpp b/src/mame/drivers/kron.cpp
index 7fa942dfdec..85de8f4dc61 100644
--- a/src/mame/drivers/kron.cpp
+++ b/src/mame/drivers/kron.cpp
@@ -300,26 +300,27 @@ WRITE_LINE_MEMBER(kron180_state::keyb_interrupt)
/*
* Machine configuration
*/
-MACHINE_CONFIG_START(kron180_state::kron180)
+void kron180_state::kron180(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD ("maincpu", Z180, XTAL(12'288'000))
- MCFG_DEVICE_PROGRAM_MAP (kron180_mem)
- MCFG_DEVICE_IO_MAP(kron180_iomap)
+ Z180(config, m_maincpu, XTAL(12'288'000));
+ m_maincpu->set_addrmap(AS_PROGRAM, &kron180_state::kron180_mem);
+ m_maincpu->set_addrmap(AS_IO, &kron180_state::kron180_iomap);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_COLOR(rgb_t::green())
- MCFG_SCREEN_REFRESH_RATE(50)
- MCFG_SCREEN_UPDATE_DRIVER(kron180_state, screen_update)
- MCFG_SCREEN_SIZE(80 * 10, 24 * 10)
- MCFG_SCREEN_VISIBLE_AREA(0, 639, 0, 199) // TODO: This need to be fixed once the real char table is used...
- MCFG_SCREEN_PALETTE("palette")
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER, rgb_t::green()));
+ screen.set_refresh_hz(50);
+ screen.set_screen_update(FUNC(kron180_state::screen_update));
+ screen.set_size(80 * 10, 24 * 10);
+ screen.set_visarea(0, 639, 0, 199); // TODO: This need to be fixed once the real char table is used...
+ screen.set_palette("palette");
PALETTE(config, "palette", palette_device::MONOCHROME);
/* keyboard TODO: fix it, doesn't work yet */
- MCFG_PC_KEYB_ADD("pc_keyboard", WRITELINE(*this, kron180_state, keyb_interrupt))
-MACHINE_CONFIG_END
+ PC_KEYB(config, m_keyboard);
+ m_keyboard->keypress().set(FUNC(kron180_state::keyb_interrupt));
+}
/* ROM definitions */
ROM_START (kron180)
diff --git a/src/mame/drivers/krz2000.cpp b/src/mame/drivers/krz2000.cpp
index fe2b785a0be..71e62fb3c10 100644
--- a/src/mame/drivers/krz2000.cpp
+++ b/src/mame/drivers/krz2000.cpp
@@ -65,17 +65,12 @@ void k2000_state::k2000_map(address_map &map)
map(0x000000, 0x0fffff).rom().region("maincpu", 0);
map(0x100000, 0x11ffff).ram(); // is this area banked between RAM (write of 0x20 to 7e0001) vs setup/SU ROM (write of 0x30 to 7e0001) ?
// byte writes to 7e0000-7e0001 - unknown, possibly banking or status?
- map(0xfffc00, 0xffffff).rw("tmp68301", FUNC(tmp68301_device::regs_r), FUNC(tmp68301_device::regs_w)); // TMP68301 Registers
}
void k2000_state::k2000(machine_config &config)
{
- M68301(config, m_maincpu, XTAL(12'000'000));
+ TMP68301(config, m_maincpu, XTAL(12'000'000));
m_maincpu->set_addrmap(AS_PROGRAM, &k2000_state::k2000_map);
- m_maincpu->set_irq_acknowledge_callback("tmp68301", FUNC(tmp68301_device::irq_callback));
-
- tmp68301_device &tmp68301(TMP68301(config, "tmp68301", 0));
- tmp68301.set_cputag(m_maincpu);
SPEAKER(config, "lspeaker").front_left();
SPEAKER(config, "rspeaker").front_right();
diff --git a/src/mame/drivers/ksayakyu.cpp b/src/mame/drivers/ksayakyu.cpp
index c4c1ced6ec8..f0ca353b282 100644
--- a/src/mame/drivers/ksayakyu.cpp
+++ b/src/mame/drivers/ksayakyu.cpp
@@ -258,28 +258,28 @@ void ksayakyu_state::machine_reset()
m_flipscreen = 0;
}
-MACHINE_CONFIG_START(ksayakyu_state::ksayakyu)
-
+void ksayakyu_state::ksayakyu(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80,MAIN_CLOCK/8) //divider is guessed
- MCFG_DEVICE_PROGRAM_MAP(maincpu_map)
+ Z80(config, m_maincpu, MAIN_CLOCK/8); //divider is guessed
+ m_maincpu->set_addrmap(AS_PROGRAM, &ksayakyu_state::maincpu_map);
- MCFG_DEVICE_ADD("audiocpu", Z80, MAIN_CLOCK/8) //divider is guessed, controls DAC tempo
- MCFG_DEVICE_PROGRAM_MAP(soundcpu_map)
- MCFG_DEVICE_PERIODIC_INT_DRIVER(ksayakyu_state, irq0_line_hold, 60) //guess, controls music tempo
+ z80_device &audiocpu(Z80(config, "audiocpu", MAIN_CLOCK/8)); //divider is guessed, controls DAC tempo
+ audiocpu.set_addrmap(AS_PROGRAM, &ksayakyu_state::soundcpu_map);
+ audiocpu.set_periodic_int(FUNC(ksayakyu_state::irq0_line_hold), attotime::from_hz(60)); //guess, controls music tempo
- MCFG_QUANTUM_TIME(attotime::from_hz(60000))
+ config.m_minimum_quantum = attotime::from_hz(60000);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(256, 256)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(ksayakyu_state, screen_update_ksayakyu)
- MCFG_SCREEN_PALETTE(m_palette)
- MCFG_SCREEN_VBLANK_CALLBACK(ASSERTLINE("maincpu", 0))
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(256, 256);
+ screen.set_visarea(0*8, 32*8-1, 2*8, 30*8-1);
+ screen.set_screen_update(FUNC(ksayakyu_state::screen_update_ksayakyu));
+ screen.set_palette(m_palette);
+ screen.screen_vblank().set_inputline(m_maincpu, 0, ASSERT_LINE);
GFXDECODE(config, m_gfxdecode, m_palette, gfx_ksayakyu);
PALETTE(config, m_palette, FUNC(ksayakyu_state::ksayakyu_palette), 256);
@@ -299,10 +299,11 @@ MACHINE_CONFIG_START(ksayakyu_state::ksayakyu)
ay2.port_b_write_callback().set(FUNC(ksayakyu_state::dummy3_w));
ay2.add_route(ALL_OUTPUTS, "speaker", 0.25);
- MCFG_DEVICE_ADD("dac", DAC_6BIT_R2R, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 0.25) // unknown DAC
- MCFG_DEVICE_ADD("vref", VOLTAGE_REGULATOR, 0) MCFG_VOLTAGE_REGULATOR_OUTPUT(5.0)
- MCFG_SOUND_ROUTE(0, "dac", 1.0, DAC_VREF_POS_INPUT) MCFG_SOUND_ROUTE(0, "dac", -1.0, DAC_VREF_NEG_INPUT)
-MACHINE_CONFIG_END
+ DAC_6BIT_R2R(config, "dac", 0).add_route(ALL_OUTPUTS, "speaker", 0.25); // unknown DAC
+ voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref"));
+ vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT);
+ vref.add_route(0, "dac", -1.0, DAC_VREF_NEG_INPUT);
+}
ROM_START( ksayakyu )
ROM_REGION( 0x20000, "maincpu", 0 )
diff --git a/src/mame/drivers/kungfur.cpp b/src/mame/drivers/kungfur.cpp
index e7cd67bbb86..66ab23b5ca4 100644
--- a/src/mame/drivers/kungfur.cpp
+++ b/src/mame/drivers/kungfur.cpp
@@ -296,12 +296,12 @@ void kungfur_state::machine_reset()
m_control = 0;
}
-MACHINE_CONFIG_START(kungfur_state::kungfur)
-
+void kungfur_state::kungfur(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M6809, 8000000/2) // 4MHz?
- MCFG_DEVICE_PROGRAM_MAP(kungfur_map)
- MCFG_DEVICE_PERIODIC_INT_DRIVER(kungfur_state, kungfur_irq, 975) // close approximation
+ M6809(config, m_maincpu, 8000000/2); // 4MHz?
+ m_maincpu->set_addrmap(AS_PROGRAM, &kungfur_state::kungfur_map);
+ m_maincpu->set_periodic_int(FUNC(kungfur_state::kungfur_irq), attotime::from_hz(975)); // close approximation
i8255_device &ppi0(I8255A(config, "ppi8255_0"));
// $4008 - always $83 (PPI mode 0, ports B & lower C as input)
@@ -321,16 +321,16 @@ MACHINE_CONFIG_START(kungfur_state::kungfur)
/* sound hardware */
SPEAKER(config, "lspeaker").front_left();
SPEAKER(config, "rspeaker").front_right();
- MCFG_DEVICE_ADD("adpcm1", MSM5205, XTAL(384'000)) // clock verified with recording
- MCFG_MSM5205_VCLK_CB(WRITELINE(*this, kungfur_state, kfr_adpcm1_int))
- MCFG_MSM5205_PRESCALER_SELECTOR(S48_4B)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 1.0)
-
- MCFG_DEVICE_ADD("adpcm2", MSM5205, XTAL(384'000)) // "
- MCFG_MSM5205_VCLK_CB(WRITELINE(*this, kungfur_state, kfr_adpcm2_int))
- MCFG_MSM5205_PRESCALER_SELECTOR(S48_4B)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 1.0)
-MACHINE_CONFIG_END
+ MSM5205(config, m_adpcm1, XTAL(384'000)); // clock verified with recording
+ m_adpcm1->vck_legacy_callback().set(FUNC(kungfur_state::kfr_adpcm1_int));
+ m_adpcm1->set_prescaler_selector(msm5205_device::S48_4B);
+ m_adpcm1->add_route(ALL_OUTPUTS, "lspeaker", 1.0);
+
+ MSM5205(config, m_adpcm2, XTAL(384'000)); // clock verified with recording
+ m_adpcm2->vck_legacy_callback().set(FUNC(kungfur_state::kfr_adpcm2_int));
+ m_adpcm2->set_prescaler_selector(msm5205_device::S48_4B);
+ m_adpcm2->add_route(ALL_OUTPUTS, "rspeaker", 1.0);
+}
/***************************************************************************
diff --git a/src/mame/drivers/kurukuru.cpp b/src/mame/drivers/kurukuru.cpp
index 47157c2ff0b..64435e50fe0 100644
--- a/src/mame/drivers/kurukuru.cpp
+++ b/src/mame/drivers/kurukuru.cpp
@@ -840,17 +840,17 @@ void kurukuru_state::machine_reset()
* Machine Driver *
*************************************************/
-MACHINE_CONFIG_START(kurukuru_state::kurukuru)
-
+void kurukuru_state::kurukuru(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu",Z80, CPU_CLOCK)
- MCFG_DEVICE_PROGRAM_MAP(kurukuru_map)
- MCFG_DEVICE_IO_MAP(kurukuru_io)
+ Z80(config, m_maincpu, CPU_CLOCK);
+ m_maincpu->set_addrmap(AS_PROGRAM, &kurukuru_state::kurukuru_map);
+ m_maincpu->set_addrmap(AS_IO, &kurukuru_state::kurukuru_io);
- MCFG_DEVICE_ADD("audiocpu", Z80, CPU_CLOCK)
- MCFG_DEVICE_PROGRAM_MAP(kurukuru_audio_map)
- MCFG_DEVICE_IO_MAP(kurukuru_audio_io)
- MCFG_DEVICE_IRQ_ACKNOWLEDGE_DEVICE("soundirq", rst_neg_buffer_device, inta_cb)
+ Z80(config, m_audiocpu, CPU_CLOCK);
+ m_audiocpu->set_addrmap(AS_PROGRAM, &kurukuru_state::kurukuru_audio_map);
+ m_audiocpu->set_addrmap(AS_IO, &kurukuru_state::kurukuru_audio_io);
+ m_audiocpu->set_irq_acknowledge_callback("soundirq", FUNC(rst_neg_buffer_device::inta_cb));
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
@@ -861,7 +861,7 @@ MACHINE_CONFIG_START(kurukuru_state::kurukuru)
v9938.int_cb().set_inputline("maincpu", 0);
SCREEN(config, "screen", SCREEN_TYPE_RASTER);
- MCFG_TICKET_DISPENSER_ADD("hopper", attotime::from_msec(HOPPER_PULSE), TICKET_MOTOR_ACTIVE_HIGH, TICKET_STATUS_ACTIVE_HIGH )
+ TICKET_DISPENSER(config, "hopper", attotime::from_msec(HOPPER_PULSE), TICKET_MOTOR_ACTIVE_HIGH, TICKET_STATUS_ACTIVE_HIGH);
/* sound hardware */
SPEAKER(config, "mono").front_center();
@@ -879,25 +879,23 @@ MACHINE_CONFIG_START(kurukuru_state::kurukuru)
ym2149.port_b_write_callback().set(FUNC(kurukuru_state::ym2149_bout_w));
ym2149.add_route(ALL_OUTPUTS, "mono", 0.80);
- MCFG_DEVICE_ADD("adpcm", MSM5205, M5205_CLOCK)
- MCFG_MSM5205_VCLK_CB(WRITELINE(*this, kurukuru_state, kurukuru_msm5205_vck))
- MCFG_MSM5205_PRESCALER_SELECTOR(S48_4B) /* changed on the fly */
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.80)
-MACHINE_CONFIG_END
-
+ MSM5205(config, m_adpcm, M5205_CLOCK);
+ m_adpcm->vck_legacy_callback().set(FUNC(kurukuru_state::kurukuru_msm5205_vck));
+ m_adpcm->set_prescaler_selector(msm5205_device::S48_4B); /* changed on the fly */
+ m_adpcm->add_route(ALL_OUTPUTS, "mono", 0.80);
+}
-MACHINE_CONFIG_START(kurukuru_state::ppj)
+void kurukuru_state::ppj(machine_config &config)
+{
kurukuru(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(ppj_map)
- MCFG_DEVICE_IO_MAP(ppj_io)
-
- MCFG_DEVICE_MODIFY("audiocpu")
- MCFG_DEVICE_PROGRAM_MAP(ppj_audio_map)
- MCFG_DEVICE_IO_MAP(ppj_audio_io)
-MACHINE_CONFIG_END
+ m_maincpu->set_addrmap(AS_PROGRAM, &kurukuru_state::ppj_map);
+ m_maincpu->set_addrmap(AS_IO, &kurukuru_state::ppj_io);
+
+ m_audiocpu->set_addrmap(AS_PROGRAM, &kurukuru_state::ppj_audio_map);
+ m_audiocpu->set_addrmap(AS_IO, &kurukuru_state::ppj_audio_io);
+}
/*************************************************
diff --git a/src/mame/drivers/kyocera.cpp b/src/mame/drivers/kyocera.cpp
index 701fffaa459..cf0ee589e99 100644
--- a/src/mame/drivers/kyocera.cpp
+++ b/src/mame/drivers/kyocera.cpp
@@ -383,7 +383,7 @@ READ8_MEMBER( pc8201_state::romrd_r )
uint8_t data = 0xff;
if (m_rom_sel)
- data = m_cas_cart->read_rom(space, m_rom_addr & 0x1ffff);
+ data = m_cas_cart->read_rom(m_rom_addr & 0x1ffff);
return data;
}
@@ -533,32 +533,16 @@ READ8_MEMBER( kc85_state::lcd_r )
{
uint8_t data = 0;
- data |= m_lcdc0->read(space, offset);
- data |= m_lcdc1->read(space, offset);
- data |= m_lcdc2->read(space, offset);
- data |= m_lcdc3->read(space, offset);
- data |= m_lcdc4->read(space, offset);
- data |= m_lcdc5->read(space, offset);
- data |= m_lcdc6->read(space, offset);
- data |= m_lcdc7->read(space, offset);
- data |= m_lcdc8->read(space, offset);
- data |= m_lcdc9->read(space, offset);
+ for (uint8_t i = 0; i < 10; i++)
+ data |= m_lcdc[i]->read(space, offset);
return data;
}
WRITE8_MEMBER( kc85_state::lcd_w )
{
- m_lcdc0->write(space, offset, data);
- m_lcdc1->write(space, offset, data);
- m_lcdc2->write(space, offset, data);
- m_lcdc3->write(space, offset, data);
- m_lcdc4->write(space, offset, data);
- m_lcdc5->write(space, offset, data);
- m_lcdc6->write(space, offset, data);
- m_lcdc7->write(space, offset, data);
- m_lcdc8->write(space, offset, data);
- m_lcdc9->write(space, offset, data);
+ for (uint8_t i = 0; i < 10; i++)
+ m_lcdc[i]->write(space, offset, data);
}
/* Memory Maps */
@@ -963,14 +947,8 @@ WRITE8_MEMBER( kc85_state::i8155_pa_w )
m_keylatch = (m_keylatch & 0x100) | data;
/* LCD */
- m_lcdc0->cs2_w(BIT(data, 0));
- m_lcdc1->cs2_w(BIT(data, 1));
- m_lcdc2->cs2_w(BIT(data, 2));
- m_lcdc3->cs2_w(BIT(data, 3));
- m_lcdc4->cs2_w(BIT(data, 4));
- m_lcdc5->cs2_w(BIT(data, 5));
- m_lcdc6->cs2_w(BIT(data, 6));
- m_lcdc7->cs2_w(BIT(data, 7));
+ for (uint8_t i = 0; i < 8; i++)
+ m_lcdc[i]->cs2_w(BIT(data, i));
/* RTC */
m_rtc->c0_w(BIT(data, 0));
@@ -1001,8 +979,8 @@ WRITE8_MEMBER( kc85_state::i8155_pb_w )
m_keylatch = (BIT(data, 0) << 8) | (m_keylatch & 0xff);
/* LCD */
- m_lcdc8->cs2_w(BIT(data, 0));
- m_lcdc9->cs2_w(BIT(data, 1));
+ m_lcdc[8]->cs2_w(BIT(data, 0));
+ m_lcdc[9]->cs2_w(BIT(data, 1));
/* beeper */
m_buzzer = BIT(data, 2);
diff --git a/src/mame/drivers/kyugo.cpp b/src/mame/drivers/kyugo.cpp
index f7f0de665d5..d0c96f25d20 100644
--- a/src/mame/drivers/kyugo.cpp
+++ b/src/mame/drivers/kyugo.cpp
@@ -519,20 +519,20 @@ INTERRUPT_GEN_MEMBER(kyugo_state::vblank_irq)
}
-MACHINE_CONFIG_START(kyugo_state::kyugo_base)
-
+void kyugo_state::kyugo_base(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, XTAL(18'432'000)/6) /* verified on pcb */
- MCFG_DEVICE_PROGRAM_MAP(kyugo_main_map)
- MCFG_DEVICE_IO_MAP(kyugo_main_portmap)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", kyugo_state, vblank_irq)
+ Z80(config, m_maincpu, XTAL(18'432'000)/6); /* verified on pcb */
+ m_maincpu->set_addrmap(AS_PROGRAM, &kyugo_state::kyugo_main_map);
+ m_maincpu->set_addrmap(AS_IO, &kyugo_state::kyugo_main_portmap);
+ m_maincpu->set_vblank_int("screen", FUNC(kyugo_state::vblank_irq));
- MCFG_DEVICE_ADD("sub", Z80, XTAL(18'432'000)/6) /* verified on pcb */
- MCFG_DEVICE_PROGRAM_MAP(gyrodine_sub_map)
- MCFG_DEVICE_IO_MAP(gyrodine_sub_portmap)
- MCFG_DEVICE_PERIODIC_INT_DRIVER(kyugo_state, irq0_line_hold, 4*60)
+ Z80(config, m_subcpu, XTAL(18'432'000)/6); /* verified on pcb */
+ m_subcpu->set_addrmap(AS_PROGRAM, &kyugo_state::gyrodine_sub_map);
+ m_subcpu->set_addrmap(AS_IO, &kyugo_state::gyrodine_sub_portmap);
+ m_subcpu->set_periodic_int(FUNC(kyugo_state::irq0_line_hold), attotime::from_hz(4*60));
- MCFG_QUANTUM_TIME(attotime::from_hz(6000))
+ config.m_minimum_quantum = attotime::from_hz(6000);
ls259_device &mainlatch(LS259(config, "mainlatch"));
mainlatch.q_out_cb<0>().set(FUNC(kyugo_state::nmi_mask_w));
@@ -540,15 +540,15 @@ MACHINE_CONFIG_START(kyugo_state::kyugo_base)
mainlatch.q_out_cb<2>().set_inputline(m_subcpu, INPUT_LINE_RESET).invert();
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */)
- MCFG_SCREEN_SIZE(64*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 36*8-1, 2*8, 30*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(kyugo_state, screen_update)
- MCFG_SCREEN_PALETTE(m_palette)
-
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_kyugo)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500) /* not accurate */);
+ screen.set_size(64*8, 32*8);
+ screen.set_visarea(0*8, 36*8-1, 2*8, 30*8-1);
+ screen.set_screen_update(FUNC(kyugo_state::screen_update));
+ screen.set_palette(m_palette);
+
+ GFXDECODE(config, m_gfxdecode, m_palette, gfx_kyugo);
PALETTE(config, m_palette, palette_device::RGB_444_PROMS, "proms", 256);
/* sound hardware */
@@ -560,51 +560,51 @@ MACHINE_CONFIG_START(kyugo_state::kyugo_base)
ay1.add_route(ALL_OUTPUTS, "mono", 0.30);
AY8910(config, "ay2", XTAL(18'432'000)/12).add_route(ALL_OUTPUTS, "mono", 0.30); /* verified on pcb */
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(kyugo_state::gyrodine)
+void kyugo_state::gyrodine(machine_config &config)
+{
kyugo_base(config);
/* add watchdog */
WATCHDOG_TIMER(config, "watchdog");
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(gyrodine_main_map)
-MACHINE_CONFIG_END
+ m_maincpu->set_addrmap(AS_PROGRAM, &kyugo_state::gyrodine_main_map);
+}
-MACHINE_CONFIG_START(kyugo_state::repulse)
+void kyugo_state::repulse(machine_config &config)
+{
kyugo_base(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("sub")
- MCFG_DEVICE_PROGRAM_MAP(repulse_sub_map)
- MCFG_DEVICE_IO_MAP(repulse_sub_portmap)
-MACHINE_CONFIG_END
+ m_subcpu->set_addrmap(AS_PROGRAM, &kyugo_state::repulse_sub_map);
+ m_subcpu->set_addrmap(AS_IO, &kyugo_state::repulse_sub_portmap);
+}
-MACHINE_CONFIG_START(kyugo_state::srdmissn)
+void kyugo_state::srdmissn(machine_config &config)
+{
kyugo_base(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("sub")
- MCFG_DEVICE_PROGRAM_MAP(srdmissn_sub_map)
- MCFG_DEVICE_IO_MAP(srdmissn_sub_portmap)
-MACHINE_CONFIG_END
+ m_subcpu->set_addrmap(AS_PROGRAM, &kyugo_state::srdmissn_sub_map);
+ m_subcpu->set_addrmap(AS_IO, &kyugo_state::srdmissn_sub_portmap);
+}
-MACHINE_CONFIG_START(kyugo_state::flashgala)
+void kyugo_state::flashgala(machine_config &config)
+{
kyugo_base(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("sub")
- MCFG_DEVICE_PROGRAM_MAP(flashgala_sub_map)
- MCFG_DEVICE_IO_MAP(flashgala_sub_portmap)
-MACHINE_CONFIG_END
+ m_subcpu->set_addrmap(AS_PROGRAM, &kyugo_state::flashgala_sub_map);
+ m_subcpu->set_addrmap(AS_IO, &kyugo_state::flashgala_sub_portmap);
+}
-MACHINE_CONFIG_START(kyugo_state::legend)
+void kyugo_state::legend(machine_config &config)
+{
kyugo_base(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("sub")
- MCFG_DEVICE_PROGRAM_MAP(legend_sub_map)
- MCFG_DEVICE_IO_MAP(srdmissn_sub_portmap)
-MACHINE_CONFIG_END
+ m_subcpu->set_addrmap(AS_PROGRAM, &kyugo_state::legend_sub_map);
+ m_subcpu->set_addrmap(AS_IO, &kyugo_state::srdmissn_sub_portmap);
+}
/*************************************
diff --git a/src/mame/drivers/labyrunr.cpp b/src/mame/drivers/labyrunr.cpp
index 41101cb84ec..5309b55a80f 100644
--- a/src/mame/drivers/labyrunr.cpp
+++ b/src/mame/drivers/labyrunr.cpp
@@ -164,24 +164,24 @@ void labyrunr_state::machine_start()
membank("bank1")->configure_entries(0, 6, &ROM[0x10000], 0x4000);
}
-MACHINE_CONFIG_START(labyrunr_state::labyrunr)
-
+void labyrunr_state::labyrunr(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", HD6309, 3000000*4) /* 24MHz/8? */
- MCFG_DEVICE_PROGRAM_MAP(labyrunr_map)
- MCFG_DEVICE_PERIODIC_INT_DRIVER(labyrunr_state, labyrunr_timer_interrupt, 4*60)
+ HD6309(config, m_maincpu, 3000000*4); /* 24MHz/8? */
+ m_maincpu->set_addrmap(AS_PROGRAM, &labyrunr_state::labyrunr_map);
+ m_maincpu->set_periodic_int(FUNC(labyrunr_state::labyrunr_timer_interrupt), attotime::from_hz(4*60));
WATCHDOG_TIMER(config, "watchdog");
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(37*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 35*8-1, 2*8, 30*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(labyrunr_state, screen_update_labyrunr)
- MCFG_SCREEN_PALETTE("palette")
- MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE(*this, labyrunr_state, vblank_irq))
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(37*8, 32*8);
+ screen.set_visarea(0*8, 35*8-1, 2*8, 30*8-1);
+ screen.set_screen_update(FUNC(labyrunr_state::screen_update_labyrunr));
+ screen.set_palette(m_palette);
+ screen.screen_vblank().set(FUNC(labyrunr_state::vblank_irq));
GFXDECODE(config, m_gfxdecode, m_palette, gfx_labyrunr);
PALETTE(config, m_palette, FUNC(labyrunr_state::labyrunr_palette));
@@ -209,7 +209,7 @@ MACHINE_CONFIG_START(labyrunr_state::labyrunr)
ym2.add_route(1, "mono", 0.40);
ym2.add_route(2, "mono", 0.40);
ym2.add_route(3, "mono", 0.80);
-MACHINE_CONFIG_END
+}
/***************************************************************************
diff --git a/src/mame/drivers/ladybug.cpp b/src/mame/drivers/ladybug.cpp
index f97996b3580..14ee602e55d 100644
--- a/src/mame/drivers/ladybug.cpp
+++ b/src/mame/drivers/ladybug.cpp
@@ -122,8 +122,8 @@ void ladybug_state::ladybug_map(address_map &map)
map(0x9002, 0x9002).portr("DSW0");
map(0x9003, 0x9003).portr("DSW1");
map(0xa000, 0xa007).w("videolatch", FUNC(ls259_device::write_d0));
- map(0xb000, 0xbfff).w("sn1", FUNC(sn76489_device::command_w));
- map(0xc000, 0xcfff).w("sn2", FUNC(sn76489_device::command_w));
+ map(0xb000, 0xbfff).w("sn1", FUNC(sn76489_device::write));
+ map(0xc000, 0xcfff).w("sn2", FUNC(sn76489_device::write));
map(0xd000, 0xd7ff).rw(m_video, FUNC(ladybug_video_device::bg_r), FUNC(ladybug_video_device::bg_w));
map(0xe000, 0xe000).portr("IN2");
}
@@ -165,11 +165,11 @@ void sraider_state::sraider_cpu2_map(address_map &map)
void sraider_state::sraider_cpu2_io_map(address_map &map)
{
map.global_mask(0xff);
- map(0x00, 0x00).w("sn1", FUNC(sn76489_device::command_w));
- map(0x08, 0x08).w("sn2", FUNC(sn76489_device::command_w));
- map(0x10, 0x10).w("sn3", FUNC(sn76489_device::command_w));
- map(0x18, 0x18).w("sn4", FUNC(sn76489_device::command_w));
- map(0x20, 0x20).w("sn5", FUNC(sn76489_device::command_w));
+ map(0x00, 0x00).w("sn1", FUNC(sn76489_device::write));
+ map(0x08, 0x08).w("sn2", FUNC(sn76489_device::write));
+ map(0x10, 0x10).w("sn3", FUNC(sn76489_device::write));
+ map(0x18, 0x18).w("sn4", FUNC(sn76489_device::write));
+ map(0x20, 0x20).w("sn5", FUNC(sn76489_device::write));
map(0x28, 0x3f).w(FUNC(sraider_state::sraider_misc_w)); // lots unknown
}
@@ -721,20 +721,20 @@ void sraider_state::machine_reset()
}
-MACHINE_CONFIG_START(ladybug_state::ladybug)
-
+void ladybug_state::ladybug(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, 4000000) /* 4 MHz */
- MCFG_DEVICE_PROGRAM_MAP(ladybug_map)
+ Z80(config, m_maincpu, 4000000); /* 4 MHz */
+ m_maincpu->set_addrmap(AS_PROGRAM, &ladybug_state::ladybug_map);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */)
- MCFG_SCREEN_SIZE(32*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(1*8, 31*8-1, 4*8, 28*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(ladybug_state, screen_update_ladybug)
- MCFG_SCREEN_PALETTE("palette")
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500) /* not accurate */);
+ screen.set_size(32*8, 32*8);
+ screen.set_visarea(1*8, 31*8-1, 4*8, 28*8-1);
+ screen.set_screen_update(FUNC(ladybug_state::screen_update_ladybug));
+ screen.set_palette("palette");
GFXDECODE(config, "gfxdecode", "palette", gfx_ladybug);
PALETTE(config, "palette", FUNC(ladybug_state::ladybug_palette), 4*8 + 4*16, 32);
@@ -749,36 +749,36 @@ MACHINE_CONFIG_START(ladybug_state::ladybug)
SN76489(config, "sn1", 4000000).add_route(ALL_OUTPUTS, "mono", 1.0);
SN76489(config, "sn2", 4000000).add_route(ALL_OUTPUTS, "mono", 1.0);
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(dorodon_state::dorodon)
+void dorodon_state::dorodon(machine_config &config)
+{
ladybug(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_OPCODES_MAP(decrypted_opcodes_map)
-MACHINE_CONFIG_END
-
-MACHINE_CONFIG_START(sraider_state::sraider)
+ m_maincpu->set_addrmap(AS_OPCODES, &dorodon_state::decrypted_opcodes_map);
+}
+void sraider_state::sraider(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, 4000000) /* 4 MHz */
- MCFG_DEVICE_PROGRAM_MAP(sraider_cpu1_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", sraider_state, irq0_line_hold)
+ z80_device &maincpu(Z80(config, "maincpu", 4000000)); /* 4 MHz */
+ maincpu.set_addrmap(AS_PROGRAM, &sraider_state::sraider_cpu1_map);
+ maincpu.set_vblank_int("screen", FUNC(sraider_state::irq0_line_hold));
- MCFG_DEVICE_ADD("sub", Z80, 4000000) /* 4 MHz */
- MCFG_DEVICE_PROGRAM_MAP(sraider_cpu2_map)
- MCFG_DEVICE_IO_MAP(sraider_cpu2_io_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", sraider_state, irq0_line_hold)
+ z80_device &sub(Z80(config, "sub", 4000000)); /* 4 MHz */
+ sub.set_addrmap(AS_PROGRAM, &sraider_state::sraider_cpu2_map);
+ sub.set_addrmap(AS_IO, &sraider_state::sraider_cpu2_io_map);
+ sub.set_vblank_int("screen", FUNC(sraider_state::irq0_line_hold));
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */)
- MCFG_SCREEN_SIZE(32*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(1*8, 31*8-1, 4*8, 28*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(sraider_state, screen_update_sraider)
- MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE(*this, sraider_state, screen_vblank_sraider))
- MCFG_SCREEN_PALETTE(m_palette)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500) /* not accurate */);
+ screen.set_size(32*8, 32*8);
+ screen.set_visarea(1*8, 31*8-1, 4*8, 28*8-1);
+ screen.set_screen_update(FUNC(sraider_state::screen_update_sraider));
+ screen.screen_vblank().set(FUNC(sraider_state::screen_vblank_sraider));
+ screen.set_palette(m_palette);
GFXDECODE(config, m_gfxdecode, m_palette, gfx_sraider);
PALETTE(config, m_palette, FUNC(sraider_state::sraider_palette), 4*8 + 4*16 + 32 + 2, 32 + 32 + 1);
@@ -794,7 +794,7 @@ MACHINE_CONFIG_START(sraider_state::sraider)
SN76489(config, "sn3", 4000000).add_route(ALL_OUTPUTS, "mono", 1.0);
SN76489(config, "sn4", 4000000).add_route(ALL_OUTPUTS, "mono", 1.0);
SN76489(config, "sn5", 4000000).add_route(ALL_OUTPUTS, "mono", 1.0);
-MACHINE_CONFIG_END
+}
/***************************************************************************
diff --git a/src/mame/drivers/ladyfrog.cpp b/src/mame/drivers/ladyfrog.cpp
index be3263d3bf5..718eabb91b7 100644
--- a/src/mame/drivers/ladyfrog.cpp
+++ b/src/mame/drivers/ladyfrog.cpp
@@ -340,7 +340,6 @@ void ladyfrog_state::ladyfrog(machine_config &config)
DAC_8BIT_R2R(config, "dac", 0).add_route(ALL_OUTPUTS, "mono", 0.25); // unknown DAC
voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref", 0));
- vref.set_output(5.0);
vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT);
vref.add_route(0, "dac", -1.0, DAC_VREF_NEG_INPUT);
}
diff --git a/src/mame/drivers/laser3k.cpp b/src/mame/drivers/laser3k.cpp
index e2d3d28bd7c..df772f96d27 100644
--- a/src/mame/drivers/laser3k.cpp
+++ b/src/mame/drivers/laser3k.cpp
@@ -972,18 +972,19 @@ void laser3k_state::laser3k_palette(palette_device &palette) const
palette.set_pen_colors(0, laser3k_pens);
}
-MACHINE_CONFIG_START(laser3k_state::laser3k)
+void laser3k_state::laser3k(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M6502, 1021800)
- MCFG_DEVICE_PROGRAM_MAP(laser3k_map)
+ M6502(config, m_maincpu, 1021800);
+ m_maincpu->set_addrmap(AS_PROGRAM, &laser3k_state::laser3k_map);
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(50)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */
- MCFG_SCREEN_SIZE(300*2, 192)
- MCFG_SCREEN_VISIBLE_AREA(0, (280*2)-1,0,192-1)
- MCFG_SCREEN_UPDATE_DRIVER(laser3k_state, screen_update)
- MCFG_SCREEN_PALETTE("palette")
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_refresh_hz(50);
+ m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */
+ m_screen->set_size(300*2, 192);
+ m_screen->set_visarea(0, (280*2)-1,0,192-1);
+ m_screen->set_screen_update(FUNC(laser3k_state::screen_update));
+ m_screen->set_palette("palette");
PALETTE(config, "palette", FUNC(laser3k_state::laser3k_palette), ARRAY_LENGTH(laser3k_pens));
@@ -1012,11 +1013,9 @@ MACHINE_CONFIG_START(laser3k_state::laser3k)
/* sound hardware */
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("speaker", SPEAKER_SOUND)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.00)
- MCFG_DEVICE_ADD("sn76489", SN76489, 1020484)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.50)
-MACHINE_CONFIG_END
+ SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 1.00);
+ SN76489(config, m_sn, 1020484).add_route(ALL_OUTPUTS, "mono", 0.50);
+}
ROM_START(las3000)
ROM_REGION(0x0800,"gfx1",0)
diff --git a/src/mame/drivers/laserbas.cpp b/src/mame/drivers/laserbas.cpp
index 0df02156860..0d9dae8a029 100644
--- a/src/mame/drivers/laserbas.cpp
+++ b/src/mame/drivers/laserbas.cpp
@@ -368,12 +368,12 @@ INPUT_PORTS_END
#define CLOCK 16680000
#define PIT_CLOCK (CLOCK/16) // 12 divider ?
-MACHINE_CONFIG_START(laserbas_state::laserbas)
-
- MCFG_DEVICE_ADD("maincpu", Z80, CLOCK / 4)
- MCFG_DEVICE_PROGRAM_MAP(laserbas_memory)
- MCFG_DEVICE_IO_MAP(laserbas_io)
- MCFG_TIMER_DRIVER_ADD_SCANLINE("scantimer", laserbas_state, laserbas_scanline, "screen", 0, 1)
+void laserbas_state::laserbas(machine_config &config)
+{
+ Z80(config, m_maincpu, CLOCK / 4);
+ m_maincpu->set_addrmap(AS_PROGRAM, &laserbas_state::laserbas_memory);
+ m_maincpu->set_addrmap(AS_IO, &laserbas_state::laserbas_io);
+ TIMER(config, "scantimer").configure_scanline(FUNC(laserbas_state::laserbas_scanline), "screen", 0, 1);
/* TODO: clocks aren't known */
pit8253_device &pit0(PIT8253(config, "pit0", 0));
@@ -392,9 +392,9 @@ MACHINE_CONFIG_START(laserbas_state::laserbas)
pit1.out_handler<1>().set(FUNC(laserbas_state::pit_out_w<4>));
pit1.out_handler<2>().set(FUNC(laserbas_state::pit_out_w<5>));
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_RAW_PARAMS(4000000, 256, 0, 256, 256, 0, 256) /* temporary, CRTC will configure screen */
- MCFG_SCREEN_UPDATE_DEVICE("crtc", mc6845_device, screen_update)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_raw(4000000, 256, 0, 256, 256, 0, 256); /* temporary, CRTC will configure screen */
+ screen.set_screen_update("crtc", FUNC(mc6845_device::screen_update));
h46505_device &crtc(H46505(config, "crtc", 3000000/4)); /* unknown clock, hand tuned to get ~60 fps */
crtc.set_screen("screen");
@@ -406,21 +406,20 @@ MACHINE_CONFIG_START(laserbas_state::laserbas)
/* sound hardware */
SPEAKER(config, "speaker").front_center();
- MCFG_DEVICE_ADD(m_dac[0], DAC_4BIT_R2R, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 0.16)
- MCFG_DEVICE_ADD(m_dac[1], DAC_4BIT_R2R, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 0.16)
- MCFG_DEVICE_ADD(m_dac[2], DAC_4BIT_R2R, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 0.16)
- MCFG_DEVICE_ADD(m_dac[3], DAC_4BIT_R2R, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 0.16)
- MCFG_DEVICE_ADD(m_dac[4], DAC_4BIT_R2R, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 0.16)
- MCFG_DEVICE_ADD(m_dac[5], DAC_4BIT_R2R, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 0.16)
- MCFG_DEVICE_ADD("vref", VOLTAGE_REGULATOR, 0) MCFG_VOLTAGE_REGULATOR_OUTPUT(5.0)
- MCFG_SOUND_ROUTE(0, "dac1", 1.0, DAC_VREF_POS_INPUT) MCFG_SOUND_ROUTE(0, "dac1", -1.0, DAC_VREF_NEG_INPUT)
- MCFG_SOUND_ROUTE(0, "dac2", 1.0, DAC_VREF_POS_INPUT) MCFG_SOUND_ROUTE(0, "dac2", -1.0, DAC_VREF_NEG_INPUT)
- MCFG_SOUND_ROUTE(0, "dac3", 1.0, DAC_VREF_POS_INPUT) MCFG_SOUND_ROUTE(0, "dac3", -1.0, DAC_VREF_NEG_INPUT)
- MCFG_SOUND_ROUTE(0, "dac4", 1.0, DAC_VREF_POS_INPUT) MCFG_SOUND_ROUTE(0, "dac4", -1.0, DAC_VREF_NEG_INPUT)
- MCFG_SOUND_ROUTE(0, "dac5", 1.0, DAC_VREF_POS_INPUT) MCFG_SOUND_ROUTE(0, "dac5", -1.0, DAC_VREF_NEG_INPUT)
- MCFG_SOUND_ROUTE(0, "dac6", 1.0, DAC_VREF_POS_INPUT) MCFG_SOUND_ROUTE(0, "dac6", -1.0, DAC_VREF_NEG_INPUT)
-
-MACHINE_CONFIG_END
+ DAC_4BIT_R2R(config, m_dac[0], 0).add_route(ALL_OUTPUTS, "speaker", 0.16);
+ DAC_4BIT_R2R(config, m_dac[1], 0).add_route(ALL_OUTPUTS, "speaker", 0.16);
+ DAC_4BIT_R2R(config, m_dac[2], 0).add_route(ALL_OUTPUTS, "speaker", 0.16);
+ DAC_4BIT_R2R(config, m_dac[3], 0).add_route(ALL_OUTPUTS, "speaker", 0.16);
+ DAC_4BIT_R2R(config, m_dac[4], 0).add_route(ALL_OUTPUTS, "speaker", 0.16);
+ DAC_4BIT_R2R(config, m_dac[5], 0).add_route(ALL_OUTPUTS, "speaker", 0.16);
+ voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref", 0));
+ vref.add_route(0, "dac1", 1.0, DAC_VREF_POS_INPUT); vref.add_route(0, "dac1", -1.0, DAC_VREF_NEG_INPUT);
+ vref.add_route(0, "dac2", 1.0, DAC_VREF_POS_INPUT); vref.add_route(0, "dac2", -1.0, DAC_VREF_NEG_INPUT);
+ vref.add_route(0, "dac3", 1.0, DAC_VREF_POS_INPUT); vref.add_route(0, "dac3", -1.0, DAC_VREF_NEG_INPUT);
+ vref.add_route(0, "dac4", 1.0, DAC_VREF_POS_INPUT); vref.add_route(0, "dac4", -1.0, DAC_VREF_NEG_INPUT);
+ vref.add_route(0, "dac5", 1.0, DAC_VREF_POS_INPUT); vref.add_route(0, "dac5", -1.0, DAC_VREF_NEG_INPUT);
+ vref.add_route(0, "dac6", 1.0, DAC_VREF_POS_INPUT); vref.add_route(0, "dac6", -1.0, DAC_VREF_NEG_INPUT);
+}
/*
Amstar LaserBase 1981 (Hoei)
diff --git a/src/mame/drivers/lasso.cpp b/src/mame/drivers/lasso.cpp
index cf307aab66f..f5ecc749f62 100644
--- a/src/mame/drivers/lasso.cpp
+++ b/src/mame/drivers/lasso.cpp
@@ -491,26 +491,26 @@ MACHINE_RESET_MEMBER(lasso_state,wwjgtin)
m_track_enable = 0;
}
-MACHINE_CONFIG_START(lasso_state::base)
-
+void lasso_state::base(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M6502, 11289000/16) /* guess */
- MCFG_DEVICE_PROGRAM_MAP(lasso_main_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", lasso_state, irq0_line_hold)
+ M6502(config, m_maincpu, 11289000/16); /* guess */
+ m_maincpu->set_addrmap(AS_PROGRAM, &lasso_state::lasso_main_map);
+ m_maincpu->set_vblank_int("screen", FUNC(lasso_state::irq0_line_hold));
- MCFG_DEVICE_ADD("audiocpu", M6502, 600000)
- MCFG_DEVICE_PROGRAM_MAP(lasso_audio_map)
+ M6502(config, m_audiocpu, 600000);
+ m_audiocpu->set_addrmap(AS_PROGRAM, &lasso_state::lasso_audio_map);
- MCFG_QUANTUM_TIME(attotime::from_hz(6000))
+ config.m_minimum_quantum = attotime::from_hz(6000);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(57) /* guess, but avoids glitching of Chameleon's high score table */
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */)
- MCFG_SCREEN_SIZE(32*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0, 32*8-1, 2*8, 30*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(lasso_state, screen_update_lasso)
- MCFG_SCREEN_PALETTE(m_palette)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(57); /* guess, but avoids glitching of Chameleon's high score table */
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500) /* not accurate */);
+ screen.set_size(32*8, 32*8);
+ screen.set_visarea(0, 32*8-1, 2*8, 30*8-1);
+ screen.set_screen_update(FUNC(lasso_state::screen_update_lasso));
+ screen.set_palette(m_palette);
GFXDECODE(config, m_gfxdecode, m_palette, gfx_lasso);
@@ -521,90 +521,88 @@ MACHINE_CONFIG_START(lasso_state::base)
SN76489(config, m_sn_1, 2000000).add_route(ALL_OUTPUTS, "speaker", 1.0);
SN76489(config, m_sn_2, 2000000).add_route(ALL_OUTPUTS, "speaker", 1.0);
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(lasso_state::lasso)
+void lasso_state::lasso(machine_config &config)
+{
base(config);
/* basic machine hardware */
- MCFG_DEVICE_ADD("blitter", M6502, 11289000/16) /* guess */
- MCFG_DEVICE_PROGRAM_MAP(lasso_coprocessor_map)
+ m6502_device & blitter(M6502(config, "blitter", 11289000/16)); /* guess */
+ blitter.set_addrmap(AS_PROGRAM, &lasso_state::lasso_coprocessor_map);
PALETTE(config, m_palette, FUNC(lasso_state::lasso_palette), 0x40);
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(lasso_state::chameleo)
+void lasso_state::chameleo(machine_config &config)
+{
base(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(chameleo_main_map)
+ m_maincpu->set_addrmap(AS_PROGRAM, &lasso_state::chameleo_main_map);
- MCFG_DEVICE_MODIFY("audiocpu")
- MCFG_DEVICE_PROGRAM_MAP(chameleo_audio_map)
+ m_audiocpu->set_addrmap(AS_PROGRAM, &lasso_state::chameleo_audio_map);
/* video hardware */
PALETTE(config, m_palette, FUNC(lasso_state::lasso_palette), 0x40);
- MCFG_SCREEN_MODIFY("screen")
- MCFG_SCREEN_UPDATE_DRIVER(lasso_state, screen_update_chameleo)
-MACHINE_CONFIG_END
+ subdevice<screen_device>("screen")->set_screen_update(FUNC(lasso_state::screen_update_chameleo));
+}
-MACHINE_CONFIG_START(lasso_state::wwjgtin)
+void lasso_state::wwjgtin(machine_config &config)
+{
base(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(wwjgtin_main_map)
+ m_maincpu->set_addrmap(AS_PROGRAM, &lasso_state::wwjgtin_main_map);
- MCFG_DEVICE_MODIFY("audiocpu")
- MCFG_DEVICE_PROGRAM_MAP(wwjgtin_audio_map)
+ m_audiocpu->set_addrmap(AS_PROGRAM, &lasso_state::wwjgtin_audio_map);
MCFG_MACHINE_START_OVERRIDE(lasso_state,wwjgtin)
MCFG_MACHINE_RESET_OVERRIDE(lasso_state,wwjgtin)
/* video hardware */
- MCFG_SCREEN_MODIFY("screen")
- MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(lasso_state, screen_update_wwjgtin)
- MCFG_GFXDECODE_MODIFY("gfxdecode", gfx_wwjgtin) // Has 1 additional layer
+ subdevice<screen_device>("screen")->set_visarea(0*8, 32*8-1, 2*8, 30*8-1);
+ subdevice<screen_device>("screen")->set_screen_update(FUNC(lasso_state::screen_update_wwjgtin));
+ m_gfxdecode->set_info(gfx_wwjgtin); // Has 1 additional layer
PALETTE(config, m_palette, FUNC(lasso_state::wwjgtin_palette), 0x40 + 16*16, 64);
MCFG_VIDEO_START_OVERRIDE(lasso_state,wwjgtin)
/* sound hardware */
- MCFG_DEVICE_ADD("dac", DAC_8BIT_R2R, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 0.5) // unknown DAC
- MCFG_DEVICE_ADD("vref", VOLTAGE_REGULATOR, 0) MCFG_VOLTAGE_REGULATOR_OUTPUT(5.0)
- MCFG_SOUND_ROUTE(0, "dac", 1.0, DAC_VREF_POS_INPUT) MCFG_SOUND_ROUTE(0, "dac", -1.0, DAC_VREF_NEG_INPUT)
-MACHINE_CONFIG_END
+ DAC_8BIT_R2R(config, "dac", 0).add_route(ALL_OUTPUTS, "speaker", 0.5); // unknown DAC
+ voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref"));
+ vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT);
+ vref.add_route(0, "dac", -1.0, DAC_VREF_NEG_INPUT);
+}
-MACHINE_CONFIG_START(lasso_state::pinbo)
+void lasso_state::pinbo(machine_config &config)
+{
base(config);
/* basic machine hardware */
- MCFG_DEVICE_REPLACE("maincpu", M6502, XTAL(18'000'000)/24)
- MCFG_DEVICE_PROGRAM_MAP(pinbo_main_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", lasso_state, irq0_line_hold)
+ M6502(config.replace(), m_maincpu, XTAL(18'000'000)/24);
+ m_maincpu->set_addrmap(AS_PROGRAM, &lasso_state::pinbo_main_map);
+ m_maincpu->set_vblank_int("screen", FUNC(lasso_state::irq0_line_hold));
- MCFG_DEVICE_REPLACE("audiocpu", Z80, XTAL(18'000'000)/6)
- MCFG_DEVICE_PROGRAM_MAP(pinbo_audio_map)
- MCFG_DEVICE_IO_MAP(pinbo_audio_io_map)
+ Z80(config.replace(), m_audiocpu, XTAL(18'000'000)/6);
+ m_audiocpu->set_addrmap(AS_PROGRAM, &lasso_state::pinbo_audio_map);
+ m_audiocpu->set_addrmap(AS_IO, &lasso_state::pinbo_audio_io_map);
/* video hardware */
- MCFG_GFXDECODE_MODIFY("gfxdecode", gfx_pinbo)
+ m_gfxdecode->set_info(gfx_pinbo);
PALETTE(config, m_palette, palette_device::RGB_444_PROMS, "proms", 256);
MCFG_VIDEO_START_OVERRIDE(lasso_state,pinbo)
- MCFG_SCREEN_MODIFY("screen")
- MCFG_SCREEN_UPDATE_DRIVER(lasso_state, screen_update_chameleo)
+ subdevice<screen_device>("screen")->set_screen_update(FUNC(lasso_state::screen_update_chameleo));
/* sound hardware */
- MCFG_DEVICE_REMOVE("sn76489.1")
- MCFG_DEVICE_REMOVE("sn76489.2")
+ config.device_remove("sn76489.1");
+ config.device_remove("sn76489.2");
AY8910(config, "ay1", XTAL(18'000'000)/12).add_route(ALL_OUTPUTS, "speaker", 0.55);
AY8910(config, "ay2", XTAL(18'000'000)/12).add_route(ALL_OUTPUTS, "speaker", 0.55);
-MACHINE_CONFIG_END
+}
ROM_START( lasso )
diff --git a/src/mame/drivers/lastbank.cpp b/src/mame/drivers/lastbank.cpp
index 1942d977b20..c76837381d7 100644
--- a/src/mame/drivers/lastbank.cpp
+++ b/src/mame/drivers/lastbank.cpp
@@ -512,37 +512,37 @@ TIMER_DEVICE_CALLBACK_MEMBER(lastbank_state::irq_scanline)
}
}
-MACHINE_CONFIG_START(lastbank_state::lastbank)
-
+void lastbank_state::lastbank(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu",Z80,MASTER_CLOCK/4) //!!! TC0091LVC !!!
- MCFG_DEVICE_PROGRAM_MAP(lastbank_map)
- MCFG_TIMER_DRIVER_ADD_SCANLINE("scantimer", lastbank_state, irq_scanline, "screen", 0, 1)
+ Z80(config, m_maincpu, MASTER_CLOCK/4); //!!! TC0091LVC !!!
+ m_maincpu->set_addrmap(AS_PROGRAM, &lastbank_state::lastbank_map);
+ TIMER(config, "scantimer").configure_scanline(FUNC(lastbank_state::irq_scanline), "screen", 0, 1);
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
- MCFG_DEVICE_ADD("audiocpu",Z80,MASTER_CLOCK/4)
- MCFG_DEVICE_PROGRAM_MAP(lastbank_audio_map)
- MCFG_DEVICE_IO_MAP(lastbank_audio_io)
+ z80_device &audiocpu(Z80(config, "audiocpu", MASTER_CLOCK/4));
+ audiocpu.set_addrmap(AS_PROGRAM, &lastbank_state::lastbank_audio_map);
+ audiocpu.set_addrmap(AS_IO, &lastbank_state::lastbank_audio_io);
// yes, we have no interrupts
- MCFG_QUANTUM_PERFECT_CPU("maincpu")
+ config.m_perfect_cpu_quantum = subtag("maincpu");
//MCFG_MACHINE_START_OVERRIDE(lastbank_state,lastbank)
//MCFG_MACHINE_RESET_OVERRIDE(lastbank_state,lastbank)
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500))
- MCFG_SCREEN_SIZE(64*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 40*8-1, 2*8, 30*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(lastbank_state, screen_update)
- MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE(*this, lastbank_state, screen_vblank))
- MCFG_SCREEN_PALETTE("palette")
-
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_lastbank )
- MCFG_PALETTE_ADD("palette", 0x100)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500));
+ screen.set_size(64*8, 32*8);
+ screen.set_visarea(0*8, 40*8-1, 2*8, 30*8-1);
+ screen.set_screen_update(FUNC(lastbank_state::screen_update));
+ screen.screen_vblank().set(FUNC(lastbank_state::screen_vblank));
+ screen.set_palette("palette");
+
+ GFXDECODE(config, "gfxdecode", "palette", gfx_lastbank );
+ PALETTE(config, "palette").set_entries(0x100);
TC0091LVC(config, m_vdp, 0);
m_vdp->set_gfxdecode_tag("gfxdecode");
@@ -555,8 +555,7 @@ MACHINE_CONFIG_START(lastbank_state::lastbank)
GENERIC_LATCH_8(config, "soundlatch1");
GENERIC_LATCH_8(config, "soundlatch2");
- MCFG_DEVICE_ADD("oki", OKIM6295, 1000000, okim6295_device::PIN7_HIGH)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.75)
+ OKIM6295(config, m_oki, 1000000, okim6295_device::PIN7_HIGH).add_route(ALL_OUTPUTS, "mono", 0.75);
ES8712(config, m_essnd, 0);
m_essnd->msm_write_handler().set("msm", FUNC(msm6585_device::data_w));
@@ -570,7 +569,7 @@ MACHINE_CONFIG_START(lastbank_state::lastbank)
// A RTC-62421 is present on the Last Bank PCB. However, the code
// that tries to read from it is broken and nonfunctional. The RTC
// is also absent from some other games on the same hardware.
-MACHINE_CONFIG_END
+}
/***************************************************************************
diff --git a/src/mame/drivers/lastfght.cpp b/src/mame/drivers/lastfght.cpp
index ba14903c9ee..36b169f41f4 100644
--- a/src/mame/drivers/lastfght.cpp
+++ b/src/mame/drivers/lastfght.cpp
@@ -553,28 +553,28 @@ void lastfght_state::machine_reset()
m_c00006 = 0;
}
-MACHINE_CONFIG_START(lastfght_state::lastfght)
-
+void lastfght_state::lastfght(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", H83044, 32000000/2)
- MCFG_DEVICE_PROGRAM_MAP( lastfght_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", lastfght_state, irq0_line_hold)
+ H83044(config, m_maincpu, 32000000/2);
+ m_maincpu->set_addrmap(AS_PROGRAM, &lastfght_state::lastfght_map);
+ m_maincpu->set_vblank_int("screen", FUNC(lastfght_state::irq0_line_hold));
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
/* video hardware */
- MCFG_PALETTE_ADD( "palette", 256 )
+ PALETTE(config, m_palette).set_entries(256);
ramdac_device &ramdac(RAMDAC(config, "ramdac", 0, m_palette)); // HMC HM86171 VGA 256 colour RAMDAC
ramdac.set_addrmap(0, &lastfght_state::ramdac_map);
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_SIZE( 512, 256 )
- MCFG_SCREEN_VISIBLE_AREA( 0, 512-1, 0, 256-16-1 )
- MCFG_SCREEN_REFRESH_RATE( 60 )
- MCFG_SCREEN_UPDATE_DRIVER(lastfght_state, screen_update)
- MCFG_SCREEN_PALETTE("palette")
-MACHINE_CONFIG_END
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_size(512, 256);
+ m_screen->set_visarea(0, 512-1, 0, 256-16-1);
+ m_screen->set_refresh_hz(60);
+ m_screen->set_screen_update(FUNC(lastfght_state::screen_update));
+ m_screen->set_palette(m_palette);
+}
/***************************************************************************
diff --git a/src/mame/drivers/laz_aftrshok.cpp b/src/mame/drivers/laz_aftrshok.cpp
index ac70499d7ac..954f203c6de 100644
--- a/src/mame/drivers/laz_aftrshok.cpp
+++ b/src/mame/drivers/laz_aftrshok.cpp
@@ -30,6 +30,7 @@ https://www.youtube.com/watch?v=9DIhuOEVwf4
*/
#include "emu.h"
+#include "cpu/mcs51/mcs51.h"
#include "sound/okim6295.h"
#include "speaker.h"
@@ -39,46 +40,139 @@ class aftrshok_state : public driver_device
public:
aftrshok_state(const machine_config &mconfig, device_type type, const char *tag)
: driver_device(mconfig, type, tag)
- // ,m_maincpu(*this, "maincpu")
+ , m_maincpu(*this, "maincpu")
+ , m_oki(*this, "oki")
{ }
void aftrshok(machine_config &config);
private:
+ void sound_data_w(u8 data);
+ void mcu_p3_w(u8 data);
+
+ void prog_map(address_map &map);
+ void ext_map(address_map &map);
+
virtual void machine_start() override;
virtual void machine_reset() override;
-// required_device<mcs51_cpu_device> m_maincpu;
+ required_device<mcs51_cpu_device> m_maincpu;
+ required_device<okim6295_device> m_oki;
+
+ u8 m_sound_data;
};
static INPUT_PORTS_START( aftrshok )
+ PORT_START("IN0")
+ PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_UNKNOWN)
+ PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_UNKNOWN)
+ PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_UNKNOWN)
+ PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_UNKNOWN)
+ PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_UNKNOWN)
+ PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_UNKNOWN)
+ PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_UNKNOWN)
+ PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_UNKNOWN)
+
+ PORT_START("IN1")
+ PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_UNKNOWN)
+ PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_UNKNOWN)
+ PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_UNKNOWN)
+ PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_UNKNOWN)
+ PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_UNKNOWN)
+ PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_UNKNOWN)
+ PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_UNKNOWN)
+ PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_UNKNOWN)
+
+ PORT_START("IN2")
+ PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_UNKNOWN)
+ PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_UNKNOWN)
+ PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_UNKNOWN)
+ PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_UNKNOWN)
+ PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_UNKNOWN)
+ PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_UNKNOWN)
+ PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_UNKNOWN)
+ PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_UNKNOWN)
+
+ PORT_START("IN3")
+ PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_UNKNOWN)
+ PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_UNKNOWN)
+ PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_UNKNOWN)
+ PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_UNKNOWN)
+ PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_UNKNOWN)
+ PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_UNKNOWN)
+ PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_UNKNOWN)
+ PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_UNKNOWN)
+
+ PORT_START("IN4")
+ PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_UNKNOWN)
+ PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_UNKNOWN)
+ PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_UNKNOWN)
+ PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_UNKNOWN)
+ PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_UNKNOWN)
+ PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_UNKNOWN)
+ PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_UNKNOWN)
+ PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_UNKNOWN)
INPUT_PORTS_END
void aftrshok_state::machine_start()
{
+ save_item(NAME(m_sound_data));
}
void aftrshok_state::machine_reset()
{
+ m_sound_data = 0;
+}
+
+void aftrshok_state::sound_data_w(u8 data)
+{
+ m_sound_data = data;
+}
+
+void aftrshok_state::mcu_p3_w(u8 data)
+{
+ if (!BIT(data, 1) && !BIT(data, 2))
+ m_oki->write(m_sound_data);
+}
+
+void aftrshok_state::prog_map(address_map &map)
+{
+ map(0x0000, 0xffff).rom().region("maincpu", 0);
}
+void aftrshok_state::ext_map(address_map &map)
+{
+ map(0x0700, 0x0700).nopw();
+ map(0x0800, 0x0800).nopw();
+ map(0x1000, 0x1000).w(FUNC(aftrshok_state::sound_data_w));
+ map(0x1800, 0x1800).nopw();
+ map(0x2000, 0x2000).nopw();
+ map(0x2800, 0x2800).nopw();
+ map(0x4000, 0x4000).portr("IN0");
+ map(0x4800, 0x4800).portr("IN1");
+ map(0x5000, 0x5000).portr("IN2");
+ map(0x5800, 0x5800).portr("IN3");
+ map(0x6000, 0x6000).portr("IN4");
+ map(0x8000, 0x9fff).ram();
+}
-MACHINE_CONFIG_START(aftrshok_state::aftrshok)
+void aftrshok_state::aftrshok(machine_config &config)
+{
/* basic machine hardware */
-// MCFG_DEVICE_ADD("maincpu", ??, 8000000) // unknown
-// MCFG_DEVICE_PROGRAM_MAP(aftrshok_map)
-// MCFG_DEVICE_IO_MAP(aftrshok_io)
-// MCFG_DEVICE_VBLANK_INT_DRIVER("screen", aftrshok_state, irq0_line_hold)
+ I8031(config, m_maincpu, 12_MHz_XTAL);
+ m_maincpu->set_addrmap(AS_PROGRAM, &aftrshok_state::prog_map);
+ m_maincpu->set_addrmap(AS_IO, &aftrshok_state::ext_map);
+ m_maincpu->port_out_cb<3>().set(FUNC(aftrshok_state::mcu_p3_w));
/* sound hardware */
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("oki", OKIM6295, 1000000, okim6295_device::PIN7_HIGH) // maybe
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
-MACHINE_CONFIG_END
+ OKIM6295(config, m_oki, 2.097152_MHz_XTAL, okim6295_device::PIN7_HIGH);
+ m_oki->add_route(ALL_OUTPUTS, "mono", 1.0);
+}
@@ -103,5 +197,5 @@ ROM_START( aftrshoka )
ROM_END
-GAME( 19??, aftrshok, 0, aftrshok, aftrshok, aftrshok_state, empty_init, ROT0, "Lazer-tron", "After Shock (Lazer-tron, set 1)", MACHINE_IS_SKELETON_MECHANICAL )
-GAME( 19??, aftrshoka, aftrshok, aftrshok, aftrshok, aftrshok_state, empty_init, ROT0, "Lazer-tron", "After Shock (Lazer-tron, set 2)", MACHINE_IS_SKELETON_MECHANICAL )
+GAME( 19??, aftrshok, 0, aftrshok, aftrshok, aftrshok_state, empty_init, ROT0, "Lazer-tron", "After Shock (Lazer-tron, set 1)", MACHINE_NOT_WORKING | MACHINE_MECHANICAL )
+GAME( 19??, aftrshoka, aftrshok, aftrshok, aftrshok, aftrshok_state, empty_init, ROT0, "Lazer-tron", "After Shock (Lazer-tron, set 2)", MACHINE_NOT_WORKING | MACHINE_MECHANICAL )
diff --git a/src/mame/drivers/laz_awetoss.cpp b/src/mame/drivers/laz_awetoss.cpp
index 6de09c4ecbf..8f88516353f 100644
--- a/src/mame/drivers/laz_awetoss.cpp
+++ b/src/mame/drivers/laz_awetoss.cpp
@@ -45,20 +45,19 @@ void awetoss_state::machine_reset()
}
-MACHINE_CONFIG_START(awetoss_state::awetoss)
-
+void awetoss_state::awetoss(machine_config &config)
+{
/* basic machine hardware */
-// MCFG_DEVICE_ADD("maincpu", ??, 8000000) // unknown
-// MCFG_DEVICE_PROGRAM_MAP(awetoss_map)
-// MCFG_DEVICE_IO_MAP(awetoss_io)
-// MCFG_DEVICE_VBLANK_INT_DRIVER("screen", awetoss_state, irq0_line_hold)
+// ??_device &maincpu(??(config, "maincpu", 8000000)); // unknown
+// maincpu.set_addrmap(AS_PROGRAM, &awetoss_state::awetoss_map);
+// maincpu.set_addrmap(AS_IO, &awetoss_state::awetoss_io);
+// maincpu.set_vblank_int("screen", FUNC(awetoss_state::irq0_line_hold));
/* sound hardware */
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("oki", OKIM6295, 1000000, okim6295_device::PIN7_HIGH) // maybe
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
-MACHINE_CONFIG_END
+ OKIM6295(config, "oki", 1000000, okim6295_device::PIN7_HIGH).add_route(ALL_OUTPUTS, "mono", 1.0); // maybe
+}
diff --git a/src/mame/drivers/laz_ribrac.cpp b/src/mame/drivers/laz_ribrac.cpp
index 2003a22860a..7ef91dff45f 100644
--- a/src/mame/drivers/laz_ribrac.cpp
+++ b/src/mame/drivers/laz_ribrac.cpp
@@ -49,19 +49,18 @@ void laz_ribrac_state::machine_reset()
}
-MACHINE_CONFIG_START(laz_ribrac_state::laz_ribrac)
-
+void laz_ribrac_state::laz_ribrac(machine_config &config)
+{
/* basic machine hardware */
-// MCFG_DEVICE_ADD("maincpu", ??, 8000000) // unknown
-// MCFG_DEVICE_PROGRAM_MAP(laz_ribrac_map)
-// MCFG_DEVICE_IO_MAP(laz_ribrac_io)
+// ??_device &maincpu(??(config, "maincpu", 8000000)); // unknown
+// maincpu.set_addrmap(AS_PROGRAM, &laz_ribrac_state::laz_ribrac_map);
+// maincpu.set_addrmap(AS_IO, &laz_ribrac_state::laz_ribrac_io);
/* sound hardware */
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("oki", OKIM6295, 1000000, okim6295_device::PIN7_HIGH) // maybe
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
-MACHINE_CONFIG_END
+ OKIM6295(config, "oki", 1000000, okim6295_device::PIN7_HIGH).add_route(ALL_OUTPUTS, "mono", 1.0); // maybe
+}
diff --git a/src/mame/drivers/lazercmd.cpp b/src/mame/drivers/lazercmd.cpp
index 376cc587bd0..f5282ebecee 100644
--- a/src/mame/drivers/lazercmd.cpp
+++ b/src/mame/drivers/lazercmd.cpp
@@ -626,110 +626,110 @@ void lazercmd_state::machine_reset()
}
-MACHINE_CONFIG_START(lazercmd_state::lazercmd)
-
+void lazercmd_state::lazercmd(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", S2650, MASTER_CLOCK/12) /* 666 kHz? */
+ S2650(config, m_maincpu, MASTER_CLOCK/12); /* 666 kHz? */
/* Main Clock is 8MHz divided by 12
but memory and IO access is only possible
within the line and frame blanking period
thus requiring an extra loading of approx 3-5 */
- MCFG_DEVICE_PROGRAM_MAP(lazercmd_map)
- MCFG_DEVICE_DATA_MAP(lazercmd_portmap)
- MCFG_TIMER_DRIVER_ADD_SCANLINE("scantimer", lazercmd_state, lazercmd_timer, "screen", 0, 1)
+ m_maincpu->set_addrmap(AS_PROGRAM, &lazercmd_state::lazercmd_map);
+ m_maincpu->set_addrmap(AS_DATA, &lazercmd_state::lazercmd_portmap);
+ TIMER(config, "scantimer").configure_scanline(FUNC(lazercmd_state::lazercmd_timer), "screen", 0, 1);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */)
- MCFG_SCREEN_SIZE(HORZ_RES * HORZ_CHR, VERT_RES * VERT_CHR + 16)
- MCFG_SCREEN_VISIBLE_AREA(0 * HORZ_CHR, HORZ_RES * HORZ_CHR - 1, 0 * VERT_CHR, (VERT_RES - 1) * VERT_CHR - 1)
- MCFG_SCREEN_UPDATE_DRIVER(lazercmd_state, screen_update_lazercmd)
- MCFG_SCREEN_PALETTE(m_palette)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500) /* not accurate */);
+ screen.set_size(HORZ_RES * HORZ_CHR, VERT_RES * VERT_CHR + 16);
+ screen.set_visarea(0 * HORZ_CHR, HORZ_RES * HORZ_CHR - 1, 0 * VERT_CHR, (VERT_RES - 1) * VERT_CHR - 1);
+ screen.set_screen_update(FUNC(lazercmd_state::screen_update_lazercmd));
+ screen.set_palette(m_palette);
GFXDECODE(config, m_gfxdecode, m_palette, gfx_lazercmd);
PALETTE(config, m_palette, FUNC(lazercmd_state::lazercmd_palette), 5);
/* sound hardware */
SPEAKER(config, "speaker").front_center();
- MCFG_DEVICE_ADD("dac0", DAC_1BIT, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 0.99)
- MCFG_DEVICE_ADD("dac1", DAC_1BIT, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 0.99)
- MCFG_DEVICE_ADD("dac2", DAC_1BIT, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 0.99)
- MCFG_DEVICE_ADD("dac3", DAC_1BIT, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 0.99)
- MCFG_DEVICE_ADD("vref", VOLTAGE_REGULATOR, 0) MCFG_VOLTAGE_REGULATOR_OUTPUT(5.0)
- MCFG_SOUND_ROUTE(0, "dac0", 1.0, DAC_VREF_POS_INPUT)
- MCFG_SOUND_ROUTE(0, "dac1", 1.0, DAC_VREF_POS_INPUT)
- MCFG_SOUND_ROUTE(0, "dac2", 1.0, DAC_VREF_POS_INPUT)
- MCFG_SOUND_ROUTE(0, "dac3", 1.0, DAC_VREF_POS_INPUT)
-MACHINE_CONFIG_END
-
+ DAC_1BIT(config, m_dac0, 0).add_route(ALL_OUTPUTS, "speaker", 0.99);
+ DAC_1BIT(config, m_dac1, 0).add_route(ALL_OUTPUTS, "speaker", 0.99);
+ DAC_1BIT(config, m_dac2, 0).add_route(ALL_OUTPUTS, "speaker", 0.99);
+ DAC_1BIT(config, m_dac3, 0).add_route(ALL_OUTPUTS, "speaker", 0.99);
+ voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref"));
+ vref.add_route(0, "dac0", 1.0, DAC_VREF_POS_INPUT);
+ vref.add_route(0, "dac1", 1.0, DAC_VREF_POS_INPUT);
+ vref.add_route(0, "dac2", 1.0, DAC_VREF_POS_INPUT);
+ vref.add_route(0, "dac3", 1.0, DAC_VREF_POS_INPUT);
+}
-MACHINE_CONFIG_START(lazercmd_state::medlanes)
+void lazercmd_state::medlanes(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", S2650, MASTER_CLOCK/12) /* 666 kHz */
+ S2650(config, m_maincpu, MASTER_CLOCK/12); /* 666 kHz */
/* Main Clock is 8MHz divided by 12
but memory and IO access is only possible
within the line and frame blanking period
thus requiring an extra loading of approx 3-5 */
- MCFG_DEVICE_PROGRAM_MAP(medlanes_map)
- MCFG_DEVICE_DATA_MAP(lazercmd_portmap)
- MCFG_TIMER_DRIVER_ADD_SCANLINE("scantimer", lazercmd_state, lazercmd_timer, "screen", 0, 1)
+ m_maincpu->set_addrmap(AS_PROGRAM, &lazercmd_state::medlanes_map);
+ m_maincpu->set_addrmap(AS_DATA, &lazercmd_state::lazercmd_portmap);
+ TIMER(config, "scantimer").configure_scanline(FUNC(lazercmd_state::lazercmd_timer), "screen", 0, 1);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */)
- MCFG_SCREEN_SIZE(HORZ_RES * HORZ_CHR, VERT_RES * VERT_CHR)
- MCFG_SCREEN_VISIBLE_AREA(0 * HORZ_CHR, HORZ_RES * HORZ_CHR - 1, 0 * VERT_CHR, VERT_RES * VERT_CHR - 1)
- MCFG_SCREEN_UPDATE_DRIVER(lazercmd_state, screen_update_lazercmd)
- MCFG_SCREEN_PALETTE("palette")
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500) /* not accurate */);
+ screen.set_size(HORZ_RES * HORZ_CHR, VERT_RES * VERT_CHR);
+ screen.set_visarea(0 * HORZ_CHR, HORZ_RES * HORZ_CHR - 1, 0 * VERT_CHR, VERT_RES * VERT_CHR - 1);
+ screen.set_screen_update(FUNC(lazercmd_state::screen_update_lazercmd));
+ screen.set_palette(m_palette);
GFXDECODE(config, m_gfxdecode, m_palette, gfx_lazercmd);
PALETTE(config, m_palette, FUNC(lazercmd_state::lazercmd_palette), 5);
/* sound hardware */
SPEAKER(config, "speaker").front_center();
- MCFG_DEVICE_ADD("dac2", DAC_1BIT, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 0.99)
- MCFG_DEVICE_ADD("dac3", DAC_1BIT, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 0.99)
- MCFG_DEVICE_ADD("vref", VOLTAGE_REGULATOR, 0) MCFG_VOLTAGE_REGULATOR_OUTPUT(5.0)
- MCFG_SOUND_ROUTE(0, "dac2", 1.0, DAC_VREF_POS_INPUT)
- MCFG_SOUND_ROUTE(0, "dac3", 1.0, DAC_VREF_POS_INPUT)
-MACHINE_CONFIG_END
-
+ DAC_1BIT(config, m_dac2, 0).add_route(ALL_OUTPUTS, "speaker", 0.99);
+ DAC_1BIT(config, m_dac3, 0).add_route(ALL_OUTPUTS, "speaker", 0.99);
+ voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref"));
+ vref.add_route(0, "dac2", 1.0, DAC_VREF_POS_INPUT);
+ vref.add_route(0, "dac3", 1.0, DAC_VREF_POS_INPUT);
+}
-MACHINE_CONFIG_START(lazercmd_state::bbonk)
+void lazercmd_state::bbonk(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", S2650, MASTER_CLOCK/12) /* 666 kHz */
+ S2650(config, m_maincpu, MASTER_CLOCK/12); /* 666 kHz */
/* Main Clock is 8MHz divided by 12
but memory and IO access is only possible
within the line and frame blanking period
thus requiring an extra loading of approx 3-5 */
- MCFG_DEVICE_PROGRAM_MAP(bbonk_map)
- MCFG_DEVICE_DATA_MAP(lazercmd_portmap)
- MCFG_TIMER_DRIVER_ADD_SCANLINE("scantimer", lazercmd_state, bbonk_timer, "screen", 0, 1)
+ m_maincpu->set_addrmap(AS_PROGRAM, &lazercmd_state::bbonk_map);
+ m_maincpu->set_addrmap(AS_DATA, &lazercmd_state::lazercmd_portmap);
+ TIMER(config, "scantimer").configure_scanline(FUNC(lazercmd_state::bbonk_timer), "screen", 0, 1);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */)
- MCFG_SCREEN_SIZE(HORZ_RES * HORZ_CHR, VERT_RES * VERT_CHR)
- MCFG_SCREEN_VISIBLE_AREA(0 * HORZ_CHR, HORZ_RES * HORZ_CHR - 1, 0 * VERT_CHR, (VERT_RES - 1) * VERT_CHR - 1)
- MCFG_SCREEN_UPDATE_DRIVER(lazercmd_state, screen_update_lazercmd)
- MCFG_SCREEN_PALETTE("palette")
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500) /* not accurate */);
+ screen.set_size(HORZ_RES * HORZ_CHR, VERT_RES * VERT_CHR);
+ screen.set_visarea(0 * HORZ_CHR, HORZ_RES * HORZ_CHR - 1, 0 * VERT_CHR, (VERT_RES - 1) * VERT_CHR - 1);
+ screen.set_screen_update(FUNC(lazercmd_state::screen_update_lazercmd));
+ screen.set_palette(m_palette);
GFXDECODE(config, m_gfxdecode, m_palette, gfx_lazercmd);
PALETTE(config, m_palette, FUNC(lazercmd_state::lazercmd_palette), 5);
/* sound hardware */
SPEAKER(config, "speaker").front_center();
- MCFG_DEVICE_ADD("dac2", DAC_1BIT, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 0.99)
- MCFG_DEVICE_ADD("dac3", DAC_1BIT, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 0.99)
- MCFG_DEVICE_ADD("vref", VOLTAGE_REGULATOR, 0) MCFG_VOLTAGE_REGULATOR_OUTPUT(5.0)
- MCFG_SOUND_ROUTE(0, "dac2", 1.0, DAC_VREF_POS_INPUT)
- MCFG_SOUND_ROUTE(0, "dac3", 1.0, DAC_VREF_POS_INPUT)
-MACHINE_CONFIG_END
+ DAC_1BIT(config, m_dac2, 0).add_route(ALL_OUTPUTS, "speaker", 0.99);
+ DAC_1BIT(config, m_dac3, 0).add_route(ALL_OUTPUTS, "speaker", 0.99);
+ voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref"));
+ vref.add_route(0, "dac2", 1.0, DAC_VREF_POS_INPUT);
+ vref.add_route(0, "dac3", 1.0, DAC_VREF_POS_INPUT);
+}
/***************************************************************************
diff --git a/src/mame/drivers/lb186.cpp b/src/mame/drivers/lb186.cpp
index fa6ed3e6c9b..b66fb20d84c 100644
--- a/src/mame/drivers/lb186.cpp
+++ b/src/mame/drivers/lb186.cpp
@@ -116,9 +116,9 @@ void lb186_state::ncr5380(device_t *device)
{
devcb_base *devcb;
(void)devcb;
- MCFG_DEVICE_CLOCK(10000000)
- MCFG_NCR5380N_IRQ_HANDLER(WRITELINE(":maincpu", i80186_cpu_device, int1_w))
- MCFG_NCR5380N_DRQ_HANDLER(WRITELINE(":maincpu", i80186_cpu_device, drq0_w))
+ downcast<ncr5380n_device &>(*device).set_clock(10000000);
+ downcast<ncr5380n_device &>(*device).irq_handler().set(":maincpu", FUNC(i80186_cpu_device::int1_w));
+ downcast<ncr5380n_device &>(*device).drq_handler().set(":maincpu", FUNC(i80186_cpu_device::drq0_w));
}
static void scsi_devices(device_slot_interface &device)
@@ -132,16 +132,17 @@ FLOPPY_FORMATS_MEMBER( lb186_state::floppy_formats )
FLOPPY_NASLITE_FORMAT
FLOPPY_FORMATS_END
-MACHINE_CONFIG_START(lb186_state::lb186)
- MCFG_DEVICE_ADD("maincpu", I80186, 16_MHz_XTAL / 2)
- MCFG_DEVICE_PROGRAM_MAP(lb186_map)
- MCFG_DEVICE_IO_MAP(lb186_io)
+void lb186_state::lb186(machine_config &config)
+{
+ I80186(config, m_maincpu, 16_MHz_XTAL / 2);
+ m_maincpu->set_addrmap(AS_PROGRAM, &lb186_state::lb186_map);
+ m_maincpu->set_addrmap(AS_IO, &lb186_state::lb186_io);
- MCFG_DEVICE_ADD("duart", SCN2681, 3.6864_MHz_XTAL)
- MCFG_MC68681_IRQ_CALLBACK(WRITELINE("maincpu", i80186_cpu_device, int0_w))
- MCFG_MC68681_A_TX_CALLBACK(WRITELINE("rs232_1", rs232_port_device, write_txd))
- MCFG_MC68681_B_TX_CALLBACK(WRITELINE("rs232_2", rs232_port_device, write_txd))
- MCFG_MC68681_OUTPORT_CALLBACK(WRITE8(*this, lb186_state, sio_out_w))
+ scn2681_device &duart(SCN2681(config, "duart", 3.6864_MHz_XTAL));
+ duart.irq_cb().set(m_maincpu, FUNC(i80186_cpu_device::int0_w));
+ duart.a_tx_cb().set("rs232_1", FUNC(rs232_port_device::write_txd));
+ duart.b_tx_cb().set("rs232_2", FUNC(rs232_port_device::write_txd));
+ duart.outport_cb().set(FUNC(lb186_state::sio_out_w));
rs232_port_device &rs232_1(RS232_PORT(config, "rs232_1", default_rs232_devices, "terminal"));
rs232_1.rxd_handler().set("duart", FUNC(scn2681_device::rx_a_w));
@@ -151,22 +152,21 @@ MACHINE_CONFIG_START(lb186_state::lb186)
WD1772(config, m_fdc, 16_MHz_XTAL / 2);
m_fdc->intrq_wr_callback().set(m_maincpu, FUNC(i80186_cpu_device::int2_w));
m_fdc->drq_wr_callback().set(m_maincpu, FUNC(i80186_cpu_device::drq0_w));
- MCFG_FLOPPY_DRIVE_ADD("fdc:0", lb186_floppies, "525dd", lb186_state::floppy_formats)
- MCFG_FLOPPY_DRIVE_ADD("fdc:1", lb186_floppies, nullptr, lb186_state::floppy_formats)
- MCFG_FLOPPY_DRIVE_ADD("fdc:2", lb186_floppies, nullptr, lb186_state::floppy_formats)
- MCFG_FLOPPY_DRIVE_ADD("fdc:3", lb186_floppies, nullptr, lb186_state::floppy_formats)
-
- MCFG_NSCSI_BUS_ADD("scsibus")
- MCFG_NSCSI_ADD("scsibus:0", scsi_devices, "harddisk", false)
- MCFG_NSCSI_ADD("scsibus:1", scsi_devices, nullptr, false)
- MCFG_NSCSI_ADD("scsibus:2", scsi_devices, nullptr, false)
- MCFG_NSCSI_ADD("scsibus:3", scsi_devices, nullptr, false)
- MCFG_NSCSI_ADD("scsibus:4", scsi_devices, nullptr, false)
- MCFG_NSCSI_ADD("scsibus:5", scsi_devices, nullptr, false)
- MCFG_NSCSI_ADD("scsibus:6", scsi_devices, nullptr, false)
- MCFG_NSCSI_ADD("scsibus:7", scsi_devices, "ncr5380", true)
- MCFG_SLOT_OPTION_MACHINE_CONFIG("ncr5380", lb186_state::ncr5380)
-MACHINE_CONFIG_END
+ FLOPPY_CONNECTOR(config, "fdc:0", lb186_floppies, "525dd", lb186_state::floppy_formats);
+ FLOPPY_CONNECTOR(config, "fdc:1", lb186_floppies, nullptr, lb186_state::floppy_formats);
+ FLOPPY_CONNECTOR(config, "fdc:2", lb186_floppies, nullptr, lb186_state::floppy_formats);
+ FLOPPY_CONNECTOR(config, "fdc:3", lb186_floppies, nullptr, lb186_state::floppy_formats);
+
+ NSCSI_BUS(config, "scsibus");
+ NSCSI_CONNECTOR(config, "scsibus:0", scsi_devices, "harddisk");
+ NSCSI_CONNECTOR(config, "scsibus:1", scsi_devices, nullptr);
+ NSCSI_CONNECTOR(config, "scsibus:2", scsi_devices, nullptr);
+ NSCSI_CONNECTOR(config, "scsibus:3", scsi_devices, nullptr);
+ NSCSI_CONNECTOR(config, "scsibus:4", scsi_devices, nullptr);
+ NSCSI_CONNECTOR(config, "scsibus:5", scsi_devices, nullptr);
+ NSCSI_CONNECTOR(config, "scsibus:6", scsi_devices, nullptr);
+ NSCSI_CONNECTOR(config, "scsibus:7", scsi_devices, "ncr5380", true).set_option_machine_config("ncr5380", lb186_state::ncr5380);
+}
ROM_START( lb186 )
ROM_REGION(0x4000, "bios", 0)
diff --git a/src/mame/drivers/lbeach.cpp b/src/mame/drivers/lbeach.cpp
index 726d7ede5d7..d0f15f067c9 100644
--- a/src/mame/drivers/lbeach.cpp
+++ b/src/mame/drivers/lbeach.cpp
@@ -333,29 +333,29 @@ void lbeach_state::machine_reset()
{
}
-MACHINE_CONFIG_START(lbeach_state::lbeach)
-
+void lbeach_state::lbeach(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M6800, XTAL(16'000'000) / 32) // Motorola MC6800P, 500kHz
- MCFG_DEVICE_PROGRAM_MAP(lbeach_map)
+ M6800(config, m_maincpu, XTAL(16'000'000) / 32); // Motorola MC6800P, 500kHz
+ m_maincpu->set_addrmap(AS_PROGRAM, &lbeach_state::lbeach_map);
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60) // ~60Hz
- MCFG_SCREEN_SIZE(512, 256)
- MCFG_SCREEN_VISIBLE_AREA(0, 511-32, 0, 255-24)
- MCFG_SCREEN_UPDATE_DRIVER(lbeach_state, screen_update_lbeach)
- MCFG_SCREEN_VIDEO_ATTRIBUTES(VIDEO_ALWAYS_UPDATE) // needed for collision detection
- MCFG_SCREEN_PALETTE(m_palette)
- MCFG_SCREEN_VBLANK_CALLBACK(INPUTLINE("maincpu", INPUT_LINE_NMI))
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_refresh_hz(60); // ~60Hz
+ m_screen->set_size(512, 256);
+ m_screen->set_visarea(0, 511-32, 0, 255-24);
+ m_screen->set_screen_update(FUNC(lbeach_state::screen_update_lbeach));
+ m_screen->set_video_attributes(VIDEO_ALWAYS_UPDATE); // needed for collision detection
+ m_screen->set_palette(m_palette);
+ m_screen->screen_vblank().set_inputline(m_maincpu, INPUT_LINE_NMI);
GFXDECODE(config, m_gfxdecode, m_palette, gfx_lbeach);
PALETTE(config, m_palette, FUNC(lbeach_state::lbeach_palette), 2 + 8 + 2);
/* sound hardware */
// ...
-MACHINE_CONFIG_END
+}
diff --git a/src/mame/drivers/lc80.cpp b/src/mame/drivers/lc80.cpp
index be5c78464ca..a785258401f 100644
--- a/src/mame/drivers/lc80.cpp
+++ b/src/mame/drivers/lc80.cpp
@@ -330,19 +330,19 @@ void lc80_state::machine_start()
/* Machine Driver */
-MACHINE_CONFIG_START(lc80_state::lc80)
+void lc80_state::lc80(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD(Z80_TAG, Z80, 900000) /* UD880D */
- MCFG_DEVICE_PROGRAM_MAP(lc80_mem)
- MCFG_DEVICE_IO_MAP(lc80_io)
+ Z80(config, m_maincpu, 900000); /* UD880D */
+ m_maincpu->set_addrmap(AS_PROGRAM, &lc80_state::lc80_mem);
+ m_maincpu->set_addrmap(AS_IO, &lc80_state::lc80_io);
/* video hardware */
config.set_default_layout(layout_lc80);
/* sound hardware */
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("speaker", SPEAKER_SOUND)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25)
+ SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25);
/* devices */
z80ctc_device& ctc(Z80CTC(config, Z80CTC_TAG, 900000));
@@ -361,25 +361,25 @@ MACHINE_CONFIG_START(lc80_state::lc80)
m_pio2->out_int_callback().set_inputline(m_maincpu, INPUT_LINE_IRQ0);
m_pio2->in_pb_callback().set(FUNC(lc80_state::pio2_pb_r));
- MCFG_CASSETTE_ADD("cassette")
- MCFG_CASSETTE_DEFAULT_STATE(CASSETTE_STOPPED | CASSETTE_MOTOR_ENABLED | CASSETTE_SPEAKER_MUTED)
+ CASSETTE(config, m_cassette);
+ m_cassette->set_default_state(CASSETTE_STOPPED | CASSETTE_MOTOR_ENABLED | CASSETTE_SPEAKER_MUTED);
RAM(config, RAM_TAG).set_default_size("1K").set_extra_options("2K,3K,4K");
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(lc80_state::lc80_2)
+void lc80_state::lc80_2(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD(Z80_TAG, Z80, 1800000) /* UD880D */
- MCFG_DEVICE_PROGRAM_MAP(lc80_mem)
- MCFG_DEVICE_IO_MAP(lc80_io)
+ Z80(config, m_maincpu, 1800000); /* UD880D */
+ m_maincpu->set_addrmap(AS_PROGRAM, &lc80_state::lc80_mem);
+ m_maincpu->set_addrmap(AS_IO, &lc80_state::lc80_io);
/* video hardware */
config.set_default_layout(layout_lc80);
/* sound hardware */
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("speaker", SPEAKER_SOUND)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25)
+ SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25);
/* devices */
z80ctc_device& ctc(Z80CTC(config, Z80CTC_TAG, 900000));
@@ -398,21 +398,21 @@ MACHINE_CONFIG_START(lc80_state::lc80_2)
m_pio2->out_int_callback().set_inputline(m_maincpu, INPUT_LINE_IRQ0);
m_pio2->in_pb_callback().set(FUNC(lc80_state::pio2_pb_r));
- MCFG_CASSETTE_ADD("cassette")
- MCFG_CASSETTE_DEFAULT_STATE(CASSETTE_STOPPED | CASSETTE_MOTOR_ENABLED | CASSETTE_SPEAKER_MUTED)
+ CASSETTE(config, m_cassette);
+ m_cassette->set_default_state(CASSETTE_STOPPED | CASSETTE_MOTOR_ENABLED | CASSETTE_SPEAKER_MUTED);
/* internal ram */
RAM(config, RAM_TAG).set_default_size("4K");
-MACHINE_CONFIG_END
+}
#if 0
-static MACHINE_CONFIG_START( sc80 )
+void lc80_state::sc80(machine_config &config)
+{
lc80_2(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY(Z80_TAG)
- MCFG_DEVICE_PROGRAM_MAP(sc80_mem)
-MACHINE_CONFIG_END
+ m_maincpu->set_addrmap(AS_PROGRAM, &lc80_state::sc80_mem);
+}
#endif
/* ROMs */
diff --git a/src/mame/drivers/lckydraw.cpp b/src/mame/drivers/lckydraw.cpp
index 0f23ddbd892..e97ac6f8b75 100644
--- a/src/mame/drivers/lckydraw.cpp
+++ b/src/mame/drivers/lckydraw.cpp
@@ -35,17 +35,18 @@ void lckydraw_state::maincpu_map(address_map &map)
static INPUT_PORTS_START( lckydraw )
INPUT_PORTS_END
-MACHINE_CONFIG_START(lckydraw_state::lckydraw)
+void lckydraw_state::lckydraw(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", I8035, 6000000)
- MCFG_DEVICE_PROGRAM_MAP(maincpu_map)
+ I8035(config, m_maincpu, 6000000);
+ m_maincpu->set_addrmap(AS_PROGRAM, &lckydraw_state::maincpu_map);
/* video hardware */
- //MCFG_DEFAULT_LAYOUT()
+ //config.set_default_layout();
/* sound hardware */
genpin_audio(config);
-MACHINE_CONFIG_END
+}
ROM_START(lckydraw)
diff --git a/src/mame/drivers/lcmate2.cpp b/src/mame/drivers/lcmate2.cpp
index f390aefa0d2..a03cf631c46 100644
--- a/src/mame/drivers/lcmate2.cpp
+++ b/src/mame/drivers/lcmate2.cpp
@@ -229,26 +229,27 @@ static GFXDECODE_START( gfx_lcmate2 )
GFXDECODE_END
-MACHINE_CONFIG_START(lcmate2_state::lcmate2)
+void lcmate2_state::lcmate2(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, XTAL(3'579'545)) // confirmed
- MCFG_DEVICE_PROGRAM_MAP(lcmate2_mem)
- MCFG_DEVICE_IO_MAP(lcmate2_io)
+ Z80(config, m_maincpu, XTAL(3'579'545)); // confirmed
+ m_maincpu->set_addrmap(AS_PROGRAM, &lcmate2_state::lcmate2_mem);
+ m_maincpu->set_addrmap(AS_IO, &lcmate2_state::lcmate2_io);
/* video hardware */
- MCFG_SCREEN_ADD("screen", LCD)
- MCFG_SCREEN_REFRESH_RATE(50)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */
- MCFG_SCREEN_UPDATE_DEVICE("hd44780", hd44780_device, screen_update)
- MCFG_SCREEN_SIZE(120, 18)
- MCFG_SCREEN_VISIBLE_AREA(0, 120-1, 0, 18-1)
- MCFG_SCREEN_PALETTE("palette")
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_LCD));
+ screen.set_refresh_hz(50);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */
+ screen.set_screen_update("hd44780", FUNC(hd44780_device::screen_update));
+ screen.set_size(120, 18);
+ screen.set_visarea(0, 120-1, 0, 18-1);
+ screen.set_palette("palette");
PALETTE(config, "palette", FUNC(lcmate2_state::lcmate2_palette), 2);
GFXDECODE(config, "gfxdecode", "palette", gfx_lcmate2);
- MCFG_HD44780_ADD("hd44780")
- MCFG_HD44780_LCD_SIZE(2, 20)
+ HD44780(config, m_lcdc, 0);
+ m_lcdc->set_lcd_size(2, 20);
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
@@ -258,7 +259,7 @@ MACHINE_CONFIG_START(lcmate2_state::lcmate2)
/* Devices */
RP5C15(config, m_rtc, XTAL(32'768));
-MACHINE_CONFIG_END
+}
/* ROM definition */
ROM_START( lcmate2 )
diff --git a/src/mame/drivers/ldplayer.cpp b/src/mame/drivers/ldplayer.cpp
index 7b3aef786df..c621648f3c1 100644
--- a/src/mame/drivers/ldplayer.cpp
+++ b/src/mame/drivers/ldplayer.cpp
@@ -627,8 +627,9 @@ INPUT_PORTS_END
*
*************************************/
-MACHINE_CONFIG_START(ldplayer_state::ldplayer_ntsc)
-MACHINE_CONFIG_END
+void ldplayer_state::ldplayer_ntsc(machine_config &config)
+{
+}
MACHINE_CONFIG_START(ldv1000_state::ldv1000)
diff --git a/src/mame/drivers/leapfrog_leappad.cpp b/src/mame/drivers/leapfrog_leappad.cpp
new file mode 100644
index 00000000000..3eca2599d12
--- /dev/null
+++ b/src/mame/drivers/leapfrog_leappad.cpp
@@ -0,0 +1,145 @@
+// license:BSD-3-Clause
+// copyright-holders:David Haywood
+/******************************************************************************
+
+ LEAPPAD:
+ Example-Video: https://www.youtube.com/watch?v=LtUhENu5TKc
+ The LEAPPAD is basically compareable to the SEGA PICO, but without
+ Screen-Output! Each "Game" consists of two parts (Book + Cartridge).
+ Insert the cartridge into the system and add the Book on the Top of the
+ "console" and you can click on each pages and hear sounds or
+ learning-stuff on each page...
+
+ MY FIRST LEAPPAD:
+ Basically the same as the LEAPPAD, but for even younger kids! (Cartridge
+ internal PCB's are identical to LEAPPAD).
+ Example Video: https://www.youtube.com/watch?v=gsf8XYV1Tpg
+
+ LITTLE TOUCH LEAPPAD:
+ Same as the other LEAPPAD models, but aimed at babies.
+
+ Don't get confused by the name "LEAPPAD", as it looks like Leapfrog
+ also released some kind of Tablet with this name, and they even released
+ a new "LEAPPAD" in around 2016:
+ https://www.youtube.com/watch?v=MXFSgj6xLTU , which nearly looks like the
+ same, but is most likely techically completely different..
+
+*******************************************************************************/
+
+#include "emu.h"
+
+#include "bus/generic/slot.h"
+#include "bus/generic/carts.h"
+
+#include "screen.h"
+#include "softlist.h"
+#include "speaker.h"
+
+class leapfrog_leappad_state : public driver_device
+{
+public:
+ leapfrog_leappad_state(const machine_config &mconfig, device_type type, const char *tag)
+ : driver_device(mconfig, type, tag)
+ , m_cart(*this, "cartslot")
+ , m_cart_region(nullptr)
+ { }
+
+ void leapfrog_leappad(machine_config &config);
+ void leapfrog_mfleappad(machine_config &config);
+
+private:
+ virtual void machine_start() override;
+ virtual void machine_reset() override;
+
+ DECLARE_DEVICE_IMAGE_LOAD_MEMBER(cart);
+
+ required_device<generic_slot_device> m_cart;
+ memory_region *m_cart_region;
+};
+
+
+
+void leapfrog_leappad_state::machine_start()
+{
+ // if there's a cart, override the standard mapping
+ if (m_cart && m_cart->exists())
+ {
+ std::string region_tag;
+ m_cart_region = memregion(region_tag.assign(m_cart->tag()).append(GENERIC_ROM_REGION_TAG).c_str());
+ }
+}
+
+void leapfrog_leappad_state::machine_reset()
+{
+}
+
+DEVICE_IMAGE_LOAD_MEMBER(leapfrog_leappad_state, cart)
+{
+ uint32_t size = m_cart->common_get_size("rom");
+
+ m_cart->rom_alloc(size, GENERIC_ROM16_WIDTH, ENDIANNESS_LITTLE);
+ m_cart->common_load_rom(m_cart->get_rom_base(), size, "rom");
+
+ return image_init_result::PASS;
+}
+
+static INPUT_PORTS_START( leapfrog_leappad )
+INPUT_PORTS_END
+
+
+
+void leapfrog_leappad_state::leapfrog_leappad(machine_config &config)
+{
+ //ARCA5(config, m_maincpu, 96000000/10); // LeapPad Leapfrog 05-9-01 FS80A363 (doesn't appear to be Arcompact, what is it?)
+ //m_maincpu->set_addrmap(AS_PROGRAM, &leapfrog_leappad_state::map);
+
+ // screenless
+
+ GENERIC_CARTSLOT(config, m_cart, generic_plain_slot, "leapfrog_leappad_cart");
+ m_cart->set_width(GENERIC_ROM16_WIDTH);
+ m_cart->set_device_load(device_image_load_delegate(&leapfrog_leappad_state::device_image_load_cart, this));
+
+ SOFTWARE_LIST(config, "cart_list").set_original("leapfrog_leappad_cart");
+}
+
+void leapfrog_leappad_state::leapfrog_mfleappad(machine_config &config)
+{
+ //ARCA5(config, m_maincpu, 96000000/10); // LeapPad Leapfrog 05-9-01 FS80A363 (doesn't appear to be Arcompact, what is it?)
+ //m_maincpu->set_addrmap(AS_PROGRAM, &leapfrog_leappad_state::map);
+
+ // screenless
+
+ GENERIC_CARTSLOT(config, m_cart, generic_plain_slot, "leapfrog_mfleappad_cart");
+ m_cart->set_width(GENERIC_ROM16_WIDTH);
+ m_cart->set_device_load(device_image_load_delegate(&leapfrog_leappad_state::device_image_load_cart, this));
+
+ SOFTWARE_LIST(config, "cart_list").set_original("leapfrog_mfleappad_cart");
+}
+
+// All of these contain the string "Have you copied our ROM?" near the date codes
+
+ROM_START( leappad )
+ ROM_REGION( 0x100000, "maincpu", ROMREGION_ERASEFF )
+ ROM_LOAD( "leappadbios.bin", 0x000000, 0x100000, CRC(c886cddc) SHA1(f8a83b156feb28315d2321758678e141600a0d4e) ) // contains "Aug 06 2001.16:33:16.155-00450.LeapPad ILA2 Universal Base ROM" and "Copyright (c) 1998-2001 Knowledge Kids Enterprises, Inc."
+ROM_END
+
+ROM_START( leappadca )
+ ROM_REGION( 0x200000, "maincpu", ROMREGION_ERASEFF )
+ ROM_LOAD( "leappadbioscanada.bin", 0x000000, 0x200000, CRC(cc12e3db) SHA1(adf52232adcfd4de5d8e31c0e0c09be61718a9d4) ) // contains "Jan 23 2004 11:28:40 152-10620 2MB Canada Full Base ROM" and "Copyright (c) 2000-2004 LeapFrog Enterprises, Inc."
+ROM_END
+
+ROM_START( mfleappad )
+ ROM_REGION( 0x100000, "maincpu", ROMREGION_ERASEFF )
+ ROM_LOAD( "myfirstleappadinternational.bin", 0x000000, 0x100000, CRC(4dc0c4d5) SHA1(573ecf2efaccf70e619cf54d63be9169e469ee6f) ) // contains "May 07 2002 10:53:14 152-00932 MFLP International base ROM V1.3" and "Copyright (c) 2002 LeapFrog Enterprises, Inc."
+ROM_END
+
+ROM_START( mfleappadus )
+ ROM_REGION( 0x400000, "maincpu", ROMREGION_ERASEFF )
+ ROM_LOAD( "myfirstleappadbios.bin", 0x000000, 0x400000, CRC(19174c16) SHA1(e0ba644fdf38fd5f91ab8c4b673c4a658cc3e612) ) // contains "Feb 13 2004.10:58:53.152-10573.MFLP US Base ROM - 2004" and "Copyright (c) 2004 LeapFrog Enterprises, Inc."
+ROM_END
+
+// year, name, parent, compat, machine, input, class, init, company, fullname, flags
+CONS( 2001, leappad, 0, 0, leapfrog_leappad, leapfrog_leappad, leapfrog_leappad_state, empty_init, "LeapFrog", "LeapPad (World)", MACHINE_IS_SKELETON )
+CONS( 2004, leappadca, leappad, 0, leapfrog_leappad, leapfrog_leappad, leapfrog_leappad_state, empty_init, "LeapFrog", "LeapPad (Canada)", MACHINE_IS_SKELETON )
+CONS( 2002, mfleappad, 0, 0, leapfrog_mfleappad, leapfrog_leappad, leapfrog_leappad_state, empty_init, "LeapFrog", "My First LeapPad (World, V1.3)", MACHINE_IS_SKELETON )
+CONS( 2004, mfleappadus, mfleappad, 0, leapfrog_mfleappad, leapfrog_leappad, leapfrog_leappad_state, empty_init, "LeapFrog", "My First LeapPad (US)", MACHINE_IS_SKELETON )
diff --git a/src/mame/drivers/leapster.cpp b/src/mame/drivers/leapster.cpp
index 4da6dee7175..993aa687149 100644
--- a/src/mame/drivers/leapster.cpp
+++ b/src/mame/drivers/leapster.cpp
@@ -311,16 +311,16 @@ void leapster_state::leapster_aux(address_map &map)
MACHINE_CONFIG_START(leapster_state::leapster)
/* basic machine hardware */
// CPU is ArcTangent-A5 '5.1' (ARCompact core)
- MCFG_DEVICE_ADD("maincpu", ARCA5, 96000000/10)
- MCFG_DEVICE_PROGRAM_MAP(leapster_map)
- MCFG_DEVICE_IO_MAP(leapster_aux)
+ ARCA5(config, m_maincpu, 96000000/10);
+ m_maincpu->set_addrmap(AS_PROGRAM, &leapster_state::leapster_map);
+ m_maincpu->set_addrmap(AS_IO, &leapster_state::leapster_aux);
/* video hardware */
- MCFG_SCREEN_ADD("screen", LCD)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_SIZE(160, 160)
- MCFG_SCREEN_VISIBLE_AREA(0, 160-1, 0, 160-1)
- MCFG_SCREEN_UPDATE_DRIVER(leapster_state, screen_update_leapster)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_LCD));
+ screen.set_refresh_hz(60);
+ screen.set_size(160, 160);
+ screen.set_visarea(0, 160-1, 0, 160-1);
+ screen.set_screen_update(FUNC(leapster_state::screen_update_leapster));
/* cartridge */
MCFG_GENERIC_CARTSLOT_ADD("cartslot", generic_plain_slot, "leapster_cart")
@@ -328,7 +328,7 @@ MACHINE_CONFIG_START(leapster_state::leapster)
MCFG_GENERIC_LOAD(leapster_state, leapster_cart)
/* Software lists */
- MCFG_SOFTWARE_LIST_ADD("cart_list", "leapster")
+ SOFTWARE_LIST(config, "cart_list").set_original("leapster");
MACHINE_CONFIG_END
#define ROM_LOAD_BIOS(bios,name,offset,length,hash) \
@@ -342,12 +342,14 @@ MACHINE_CONFIG_END
ROM_START(leapster)
ROM_REGION(0x800000, "maincpu", ROMREGION_ERASE00)
- ROM_SYSTEM_BIOS( 0, "uni15", "Universal 1.5" ) /* 152-10346 Leapster BaseROM Universal v1.5 - Sep 04 2003 10:46:47 */
+ ROM_SYSTEM_BIOS( 0, "uni15", "Universal 1.5" ) // 152-10346 Leapster BaseROM Universal v1.5 - Sep 04 2003 10:46:47
ROM_LOAD_BIOS( 0, "155-10072-a.bin" , 0x00000, 0x200000, CRC(af05e5a0) SHA1(d4468d060543ba7e44785041093bc98bcd9afa07) )
- ROM_SYSTEM_BIOS( 1, "uk21", "UK 2.1" ) /* 152-11452 Leapster BaseROM UK v2.1 - Aug 30 2005 16:01:46 */
+ ROM_SYSTEM_BIOS( 1, "uk21", "UK 2.1" ) // 152-11452 Leapster BaseROM UK v2.1 - Aug 30 2005 16:01:46
ROM_LOAD_BIOS( 1, "leapster2_1004.bin", 0x00000, 0x800000, CRC(b466e14d) SHA1(910c234f03e76b7de55b8aa0a0c62fd1daae4910) )
- ROM_SYSTEM_BIOS( 2, "ger21", "German 2.1" ) /* 152-11435 Leapster BaseROM German v2.1 - Oct 21 2005 18:53:59 */
+ ROM_SYSTEM_BIOS( 2, "ger21", "German 2.1" ) // 152-11435 Leapster BaseROM German v2.1 - Oct 21 2005 18:53:59
ROM_LOAD_BIOS( 2, "leapster2_1006.bin", 0x00000, 0x800000, CRC(a69ed8ca) SHA1(e6aacba0c39b1465f344c2b07ff1cbd8a395adac) )
+ ROM_SYSTEM_BIOS( 3, "sp10", "Spanish 1.0" ) // 152-11546 Leapster Baserom SP v1.0 - Apr 03 2006 06:26:00
+ ROM_LOAD_BIOS( 3, "leapster2_1008.bin", 0x00000, 0x800000, CRC(b43345e7) SHA1(31c27e79568115bf36e5ef668f528e3005054152) )
ROM_END
ROM_START(leapstertv)
diff --git a/src/mame/drivers/learnwin.cpp b/src/mame/drivers/learnwin.cpp
index 9c84fa6dc3b..0eca6b1414f 100644
--- a/src/mame/drivers/learnwin.cpp
+++ b/src/mame/drivers/learnwin.cpp
@@ -140,17 +140,17 @@ void learnwin_state::machine_reset()
}
-MACHINE_CONFIG_START(learnwin_state::learnwin)
-
+void learnwin_state::learnwin(machine_config &config)
+{
/* video hardware */
-// MCFG_SCREEN_ADD("screen", LCD)
-// MCFG_SCREEN_REFRESH_RATE(60)
-// MCFG_SCREEN_SIZE(48, 32)
-// MCFG_SCREEN_VISIBLE_AREA(0,47,0,31)
+// screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_LCD));
+// screen.set_refresh_hz(60);
+// screen.set_size(48, 32);
+// screen.set_visarea(0, 47, 0, 31);
/* sound hardware */
SPEAKER(config, "mono").front_center();
-MACHINE_CONFIG_END
+}
/***************************************************************************
diff --git a/src/mame/drivers/legionna.cpp b/src/mame/drivers/legionna.cpp
index 08406bb472d..e1359deac03 100644
--- a/src/mame/drivers/legionna.cpp
+++ b/src/mame/drivers/legionna.cpp
@@ -1200,7 +1200,7 @@ GFXDECODE_END
void legionna_state::legionna(machine_config &config)
{
/* basic machine hardware */
- M68000(config, m_maincpu, 20000000/2); /* ??? */
+ M68000(config, m_maincpu, 20_MHz_XTAL / 2); /* ??? */
m_maincpu->set_addrmap(AS_PROGRAM, &legionna_state::legionna_map);
m_maincpu->set_vblank_int("screen", FUNC(legionna_state::irq4_line_hold)); /* VBL */
@@ -1239,7 +1239,7 @@ void legionna_state::legionna(machine_config &config)
ymsnd.irq_handler().set("seibu_sound", FUNC(seibu_sound_device::fm_irqhandler));
ymsnd.add_route(ALL_OUTPUTS, "mono", 1.0);
- OKIM6295(config, m_oki, 1320000, okim6295_device::PIN7_LOW);
+ OKIM6295(config, m_oki, 20_MHz_XTAL / 20, okim6295_device::PIN7_HIGH);
m_oki->add_route(ALL_OUTPUTS, "mono", 0.40);
SEIBU_SOUND(config, m_seibu_sound, 0);
@@ -1253,7 +1253,7 @@ void legionna_state::legionna(machine_config &config)
void legionna_state::heatbrl(machine_config &config)
{
/* basic machine hardware */
- M68000(config, m_maincpu, 20000000/2); /* ??? */
+ M68000(config, m_maincpu, 20_MHz_XTAL / 2); /* ??? */
m_maincpu->set_addrmap(AS_PROGRAM, &legionna_state::heatbrl_map);
m_maincpu->set_vblank_int("screen", FUNC(legionna_state::irq4_line_hold)); /* VBL */
@@ -1292,7 +1292,7 @@ void legionna_state::heatbrl(machine_config &config)
ymsnd.irq_handler().set("seibu_sound", FUNC(seibu_sound_device::fm_irqhandler));
ymsnd.add_route(ALL_OUTPUTS, "mono", 1.0);
- OKIM6295(config, m_oki, 1320000, okim6295_device::PIN7_LOW);
+ OKIM6295(config, m_oki, 20_MHz_XTAL / 20, okim6295_device::PIN7_HIGH);
m_oki->add_route(ALL_OUTPUTS, "mono", 0.40);
SEIBU_SOUND(config, m_seibu_sound, 0);
@@ -1306,7 +1306,7 @@ void legionna_state::heatbrl(machine_config &config)
void legionna_state::godzilla(machine_config &config)
{
/* basic machine hardware */
- M68000(config, m_maincpu, 20000000/2);
+ M68000(config, m_maincpu, 20_MHz_XTAL / 2);
m_maincpu->set_addrmap(AS_PROGRAM, &legionna_state::godzilla_map);
m_maincpu->set_vblank_int("screen", FUNC(legionna_state::irq4_line_hold));
@@ -1349,7 +1349,7 @@ void legionna_state::godzilla(machine_config &config)
ymsnd.add_route(0, "mono", 0.50);
ymsnd.add_route(1, "mono", 0.50);
- OKIM6295(config, m_oki, 1320000, okim6295_device::PIN7_LOW);
+ OKIM6295(config, m_oki, 20_MHz_XTAL / 20, okim6295_device::PIN7_HIGH);
m_oki->add_route(ALL_OUTPUTS, "mono", 0.40);
SEIBU_SOUND(config, m_seibu_sound, 0);
@@ -1363,7 +1363,7 @@ void legionna_state::godzilla(machine_config &config)
void legionna_state::denjinmk(machine_config &config)
{
/* basic machine hardware */
- M68000(config, m_maincpu, 20000000/2);
+ M68000(config, m_maincpu, 20_MHz_XTAL / 2);
m_maincpu->set_addrmap(AS_PROGRAM, &legionna_state::denjinmk_map);
m_maincpu->set_vblank_int("screen", FUNC(legionna_state::irq4_line_hold));
@@ -1379,7 +1379,7 @@ void legionna_state::denjinmk(machine_config &config)
/* video hardware */
screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
screen.set_size(42*8, 36*8);
- screen.set_refresh_hz(61);
+ screen.set_refresh_hz(56); // <= 56 FPS, Value from doc
screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500));
screen.set_visarea(0*8, 40*8-1, 0*8, 32*8-1);
screen.set_screen_update(FUNC(legionna_state::screen_update_godzilla));
@@ -1403,7 +1403,7 @@ void legionna_state::denjinmk(machine_config &config)
ymsnd.add_route(0, "mono", 0.50);
ymsnd.add_route(1, "mono", 0.50);
- OKIM6295(config, m_oki, 1320000, okim6295_device::PIN7_LOW);
+ OKIM6295(config, m_oki, 20_MHz_XTAL / 20, okim6295_device::PIN7_HIGH);
m_oki->add_route(ALL_OUTPUTS, "mono", 0.40);
SEIBU_SOUND(config, m_seibu_sound, 0);
@@ -1417,7 +1417,7 @@ void legionna_state::denjinmk(machine_config &config)
void legionna_state::grainbow(machine_config &config)
{
/* basic machine hardware */
- M68000(config, m_maincpu, 20000000/2);
+ M68000(config, m_maincpu, 20_MHz_XTAL / 2);
m_maincpu->set_addrmap(AS_PROGRAM, &legionna_state::grainbow_map);
m_maincpu->set_vblank_int("screen", FUNC(legionna_state::irq4_line_hold));
@@ -1457,7 +1457,7 @@ void legionna_state::grainbow(machine_config &config)
ymsnd.add_route(0, "mono", 0.50);
ymsnd.add_route(1, "mono", 0.50);
- OKIM6295(config, m_oki, 1320000, okim6295_device::PIN7_LOW);
+ OKIM6295(config, m_oki, 20_MHz_XTAL / 20, okim6295_device::PIN7_HIGH);
m_oki->add_route(ALL_OUTPUTS, "mono", 0.40);
SEIBU_SOUND(config, m_seibu_sound, 0);
@@ -1471,7 +1471,7 @@ void legionna_state::grainbow(machine_config &config)
void legionna_state::cupsoc(machine_config &config)
{
/* basic machine hardware */
- M68000(config, m_maincpu, 20000000/2);
+ M68000(config, m_maincpu, 20_MHz_XTAL / 2);
m_maincpu->set_addrmap(AS_PROGRAM, &legionna_state::cupsoc_map);
m_maincpu->set_vblank_int("screen", FUNC(legionna_state::irq4_line_hold)); /* VBL */
@@ -1510,7 +1510,7 @@ void legionna_state::cupsoc(machine_config &config)
ymsnd.irq_handler().set("seibu_sound", FUNC(seibu_sound_device::fm_irqhandler));
ymsnd.add_route(ALL_OUTPUTS, "mono", 1.0);
- OKIM6295(config, m_oki, 1320000, okim6295_device::PIN7_LOW);
+ OKIM6295(config, m_oki, 20_MHz_XTAL / 20, okim6295_device::PIN7_HIGH);
m_oki->add_route(ALL_OUTPUTS, "mono", 0.40);
SEIBU_SOUND(config, m_seibu_sound, 0);
diff --git a/src/mame/drivers/leland.cpp b/src/mame/drivers/leland.cpp
index 7f2a80da015..2a287d86571 100644
--- a/src/mame/drivers/leland.cpp
+++ b/src/mame/drivers/leland.cpp
@@ -978,17 +978,17 @@ INPUT_PORTS_END
*
*************************************/
-MACHINE_CONFIG_START(leland_state::leland)
-
+void leland_state::leland(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD(m_master, Z80, MASTER_CLOCK/2)
- MCFG_DEVICE_PROGRAM_MAP(master_map_program)
- MCFG_DEVICE_IO_MAP(master_map_io)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", leland_state, leland_master_interrupt)
+ Z80(config, m_master, MASTER_CLOCK/2);
+ m_master->set_addrmap(AS_PROGRAM, &leland_state::master_map_program);
+ m_master->set_addrmap(AS_IO, &leland_state::master_map_io);
+ m_master->set_vblank_int("screen", FUNC(leland_state::leland_master_interrupt));
- MCFG_DEVICE_ADD(m_slave, Z80, MASTER_CLOCK/2)
- MCFG_DEVICE_PROGRAM_MAP(slave_small_map_program)
- MCFG_DEVICE_IO_MAP(slave_map_io)
+ Z80(config, m_slave, MASTER_CLOCK/2);
+ m_slave->set_addrmap(AS_PROGRAM, &leland_state::slave_small_map_program);
+ m_slave->set_addrmap(AS_IO, &leland_state::slave_map_io);
EEPROM_93C46_16BIT(config, m_eeprom);
NVRAM(config, "battery", nvram_device::DEFAULT_ALL_0);
@@ -1013,53 +1013,54 @@ MACHINE_CONFIG_START(leland_state::leland)
// m_ay8912->port_a_write_callback().set(FUNC(leland_state::leland_sound_port_w));
// m_ay8912->add_route(ALL_OUTPUTS, "speaker", 0.25);
- MCFG_DEVICE_ADD(m_dac[0], DAC_8BIT_BINARY_WEIGHTED, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 0.0625) // ls374.u79 + r17-r23 (24k,12k,6.2k,3k,1.5k,750,390,180)
- MCFG_DEVICE_ADD(m_dac[1], DAC_8BIT_BINARY_WEIGHTED, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 0.0625) // ls374.u88 + r27-r34 (24k,12k,6.2k,3k,1.5k,750,390,180)
- MCFG_DEVICE_ADD("vref", VOLTAGE_REGULATOR, 0) MCFG_VOLTAGE_REGULATOR_OUTPUT(5.0)
- MCFG_SOUND_ROUTE(0, "dac0", 1.0, DAC_VREF_POS_INPUT) MCFG_SOUND_ROUTE(0, "dac0", -1.0, DAC_VREF_NEG_INPUT)
- MCFG_SOUND_ROUTE(0, "dac1", 1.0, DAC_VREF_POS_INPUT) MCFG_SOUND_ROUTE(0, "dac1", -1.0, DAC_VREF_NEG_INPUT)
-MACHINE_CONFIG_END
+ DAC_8BIT_BINARY_WEIGHTED(config, m_dac[0], 0).add_route(ALL_OUTPUTS, "speaker", 0.0625); // ls374.u79 + r17-r23 (24k,12k,6.2k,3k,1.5k,750,390,180)
+ DAC_8BIT_BINARY_WEIGHTED(config, m_dac[1], 0).add_route(ALL_OUTPUTS, "speaker", 0.0625); // ls374.u88 + r27-r34 (24k,12k,6.2k,3k,1.5k,750,390,180)
+ voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref"));
+ vref.add_route(0, "dac0", 1.0, DAC_VREF_POS_INPUT); vref.add_route(0, "dac0", -1.0, DAC_VREF_NEG_INPUT);
+ vref.add_route(0, "dac1", 1.0, DAC_VREF_POS_INPUT); vref.add_route(0, "dac1", -1.0, DAC_VREF_NEG_INPUT);
+}
-MACHINE_CONFIG_START(redline_state::redline)
+void redline_state::redline(machine_config &config)
+{
leland(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("master")
- MCFG_DEVICE_IO_MAP(master_redline_map_io)
+ m_master->set_addrmap(AS_IO, &redline_state::master_redline_map_io);
/* sound hardware */
- MCFG_DEVICE_ADD(m_sound, REDLINE_80186, 0)
-MACHINE_CONFIG_END
+ REDLINE_80186(config, m_sound, 0);
+}
-MACHINE_CONFIG_START(redline_state::quarterb)
+void redline_state::quarterb(machine_config &config)
+{
redline(config);
/* sound hardware */
- MCFG_DEVICE_REPLACE(m_sound, LELAND_80186, 0)
-MACHINE_CONFIG_END
+ LELAND_80186(config.replace(), m_sound, 0);
+}
-MACHINE_CONFIG_START(redline_state::lelandi)
+void redline_state::lelandi(machine_config &config)
+{
quarterb(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("slave")
- MCFG_DEVICE_PROGRAM_MAP(slave_large_map_program)
-MACHINE_CONFIG_END
-
+ m_slave->set_addrmap(AS_PROGRAM, &redline_state::slave_large_map_program);
+}
-MACHINE_CONFIG_START(ataxx_state::ataxx)
+void ataxx_state::ataxx(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD(m_master, Z80, 6000000)
- MCFG_DEVICE_PROGRAM_MAP(master_map_program_2)
- MCFG_DEVICE_IO_MAP(master_map_io_2)
+ Z80(config, m_master, 6000000);
+ m_master->set_addrmap(AS_PROGRAM, &ataxx_state::master_map_program_2);
+ m_master->set_addrmap(AS_IO, &ataxx_state::master_map_io_2);
- MCFG_DEVICE_ADD(m_slave, Z80, 6000000)
- MCFG_DEVICE_PROGRAM_MAP(slave_map_program)
- MCFG_DEVICE_IO_MAP(slave_map_io_2)
+ Z80(config, m_slave, 6000000);
+ m_slave->set_addrmap(AS_PROGRAM, &ataxx_state::slave_map_program);
+ m_slave->set_addrmap(AS_IO, &ataxx_state::slave_map_io_2);
EEPROM_93C56_16BIT(config, m_eeprom, eeprom_serial_streaming::ENABLE);
@@ -1069,15 +1070,16 @@ MACHINE_CONFIG_START(ataxx_state::ataxx)
ataxx_video(config);
/* sound hardware */
- MCFG_DEVICE_ADD(m_sound, ATAXX_80186, 0)
-MACHINE_CONFIG_END
+ ATAXX_80186(config, m_sound, 0);
+}
-MACHINE_CONFIG_START(ataxx_state::wsf)
+void ataxx_state::wsf(machine_config &config)
+{
ataxx(config);
- MCFG_DEVICE_REPLACE(m_sound, WSF_80186, 0)
-MACHINE_CONFIG_END
+ WSF_80186(config.replace(), m_sound, 0);
+}
diff --git a/src/mame/drivers/lemmings.cpp b/src/mame/drivers/lemmings.cpp
index b7d1dac1c17..1d845cab76d 100644
--- a/src/mame/drivers/lemmings.cpp
+++ b/src/mame/drivers/lemmings.cpp
@@ -213,29 +213,29 @@ void lemmings_state::machine_start()
{
}
-MACHINE_CONFIG_START(lemmings_state::lemmings)
-
+void lemmings_state::lemmings(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M68000, 14000000)
- MCFG_DEVICE_PROGRAM_MAP(lemmings_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", lemmings_state, irq6_line_hold)
+ M68000(config, m_maincpu, 14000000);
+ m_maincpu->set_addrmap(AS_PROGRAM, &lemmings_state::lemmings_map);
+ m_maincpu->set_vblank_int("screen", FUNC(lemmings_state::irq6_line_hold));
- MCFG_DEVICE_ADD("audiocpu", M6809,32220000/8)
- MCFG_DEVICE_PROGRAM_MAP(sound_map)
+ M6809(config, m_audiocpu, 32220000/8);
+ m_audiocpu->set_addrmap(AS_PROGRAM, &lemmings_state::sound_map);
/* video hardware */
- MCFG_DEVICE_ADD("spriteram1", BUFFERED_SPRITERAM16)
- MCFG_DEVICE_ADD("spriteram2", BUFFERED_SPRITERAM16)
-
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(529))
- MCFG_SCREEN_SIZE(40*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 40*8-1, 2*8, 30*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(lemmings_state, screen_update_lemmings)
- MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE(*this, lemmings_state, screen_vblank_lemmings))
-
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_lemmings)
+ BUFFERED_SPRITERAM16(config, m_spriteram[0]);
+ BUFFERED_SPRITERAM16(config, m_spriteram[1]);
+
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(529));
+ screen.set_size(40*8, 32*8);
+ screen.set_visarea(0*8, 40*8-1, 2*8, 30*8-1);
+ screen.set_screen_update(FUNC(lemmings_state::screen_update_lemmings));
+ screen.screen_vblank().set(FUNC(lemmings_state::screen_vblank_lemmings));
+
+ GFXDECODE(config, m_gfxdecode, m_palette, gfx_lemmings);
PALETTE(config, m_palette).set_format(palette_device::xBGR_888, 1024);
DECO_SPRITE(config, m_sprgen[0], 0);
@@ -264,10 +264,10 @@ MACHINE_CONFIG_START(lemmings_state::lemmings)
ymsnd.add_route(0, "lspeaker", 0.45);
ymsnd.add_route(1, "rspeaker", 0.45);
- MCFG_DEVICE_ADD("oki", OKIM6295, 1023924, okim6295_device::PIN7_HIGH) // clock frequency & pin 7 not verified
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 0.50)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 0.50)
-MACHINE_CONFIG_END
+ okim6295_device &oki(OKIM6295(config, "oki", 1023924, okim6295_device::PIN7_HIGH)); // clock frequency & pin 7 not verified
+ oki.add_route(ALL_OUTPUTS, "lspeaker", 0.50);
+ oki.add_route(ALL_OUTPUTS, "rspeaker", 0.50);
+}
/******************************************************************************/
diff --git a/src/mame/drivers/lethal.cpp b/src/mame/drivers/lethal.cpp
index 1d6ae81ea8c..b4d39607c8e 100644
--- a/src/mame/drivers/lethal.cpp
+++ b/src/mame/drivers/lethal.cpp
@@ -674,6 +674,31 @@ ROM_START( lethaleneab ) // Euro ver. EAB
ROM_LOAD( "lethaleneab.nv", 0x0000, 0x0080, CRC(4e9bb34d) SHA1(9502583bc9f5f6fc5bba333869398b24bf154b73) )
ROM_END
+ROM_START( lethalenead ) // Euro ver. EAD
+ ROM_REGION( 0x40000, "maincpu", 0 ) /* main program */
+ ROM_LOAD( "191ead01.u4", 0x00000, 0x40000, CRC(ce2e13ce) SHA1(52df8fbcca0de02bdb83fc804ee27a90135993e7) )
+
+ ROM_REGION( 0x10000, "soundcpu", 0 ) /* Z80 sound program */
+ ROM_LOAD( "191a02.f4", 0x00000, 0x10000, CRC(72b843cc) SHA1(b44b2f039358c26fa792d740639b66a5c8bf78e7) )
+
+ ROM_REGION( 0x400000, "gfx1", 0 ) /* tilemaps */
+ ROM_LOAD32_WORD( "191a08", 0x000002, 0x100000, CRC(555bd4db) SHA1(d2e55796b4ab2306ae549fa9e7288e41eaa8f3de) )
+ ROM_LOAD32_WORD( "191a10", 0x000000, 0x100000, CRC(2fa9bf51) SHA1(1e4ec56b41dfd8744347a7b5799e3ebce0939adc) )
+ ROM_LOAD32_WORD( "191a07", 0x200002, 0x100000, CRC(1dad184c) SHA1(b2c4a8e48084005056aef2c8eaccb3d2eca71b73) )
+ ROM_LOAD32_WORD( "191a09", 0x200000, 0x100000, CRC(e2028531) SHA1(63ccce7855d829763e9e248a6c3eb6ea89ab17ee) )
+
+ ROM_REGION( 0x400000, "k053244", ROMREGION_ERASE00 ) /* sprites */
+ ROM_LOAD32_WORD( "191a05", 0x000000, 0x100000, CRC(f2e3b58b) SHA1(0bbc2fe87a4fd00b5073a884bcfebcf9c2c402ad) )
+ ROM_LOAD32_WORD( "191a04", 0x000002, 0x100000, CRC(5c3eeb2b) SHA1(33ea8b3968b78806334b5a0aab3a2c24e45c604e) )
+ ROM_LOAD32_WORD( "191a06", 0x200000, 0x100000, CRC(ee11fc08) SHA1(ec6dd684e8261b181d65b8bf1b9e97da5c4468f7) )
+
+ ROM_REGION( 0x200000, "k054539", 0 ) /* K054539 samples */
+ ROM_LOAD( "191a03", 0x000000, 0x200000, CRC(9b13fbe8) SHA1(19b02dbd9d6da54045b0ba4dfe7b282c72745c9c))
+
+ ROM_REGION( 0x80, "eeprom", 0 )
+ ROM_LOAD( "lethalenead.nv", 0x0000, 0x0080, CRC(e1dc2bc0) SHA1(adfb8dfaec0b0faf6784eab97a5b31c0c7813756) )
+ROM_END
+
ROM_START( lethaleneae ) // Euro ver. EAE
ROM_REGION( 0x40000, "maincpu", 0 ) /* main program */
ROM_LOAD( "191eae01.u4", 0x00000, 0x40000, CRC(c6a3c6ac) SHA1(96a209a3a5b4af40af36bd7090c59a74f8c8df59) )
@@ -757,6 +782,7 @@ GAME( 1992, lethalenua, lethalen, lethalen, lethalen, lethal_state, empty_init,
GAME( 1992, lethalenux, lethalen, lethalen, lethalen, lethal_state, empty_init, ORIENTATION_FLIP_Y, "Konami", "Lethal Enforcers (ver unknown, US, 08/06/92 15:11, hacked/proto?)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE ) // writes UA to eeprom but earlier than suspected UAA set, might be a proto, might be hacked, fails rom test, definitely a good dump, another identical set was found in Italy
GAME( 1992, lethaleneae,lethalen, lethalen, lethalene, lethal_state, empty_init, ORIENTATION_FLIP_Y, "Konami", "Lethal Enforcers (ver EAE, 11/19/92 16:24)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE ) // writes EE to eeprom
+GAME( 1992, lethalenead,lethalen, lethalen, lethalene, lethal_state, empty_init, ORIENTATION_FLIP_Y, "Konami", "Lethal Enforcers (ver EAD, 11/11/92 10:52)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE ) // writes ED to eeprom
GAME( 1992, lethaleneab,lethalen, lethalen, lethalene, lethal_state, empty_init, ORIENTATION_FLIP_Y, "Konami", "Lethal Enforcers (ver EAB, 10/14/92 19:53)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE ) // writes EC to eeprom, so might actually be EC
GAME( 1992, lethaleneaa,lethalen, lethalen, lethalene, lethal_state, empty_init, ORIENTATION_FLIP_Y, "Konami", "Lethal Enforcers (ver EAA, 09/09/92 09:44)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE ) // writes EA to eeprom
diff --git a/src/mame/drivers/lethalj.cpp b/src/mame/drivers/lethalj.cpp
index d21465b8ddc..01875d251d5 100644
--- a/src/mame/drivers/lethalj.cpp
+++ b/src/mame/drivers/lethalj.cpp
@@ -223,7 +223,6 @@ void lethalj_state::lethalj_map(address_map &map)
map(0x04500010, 0x0450001f).portr("IN0");
map(0x04600000, 0x0460000f).portr("IN1");
map(0x04700000, 0x0470007f).w(FUNC(lethalj_state::blitter_w));
- map(0xc0000000, 0xc00001ff).rw(m_maincpu, FUNC(tms34010_device::io_register_r), FUNC(tms34010_device::io_register_w));
map(0xc0000240, 0xc000025f).nopw(); /* seems to be a bug in their code, one of many. */
map(0xff800000, 0xffffffff).rom().region("maincpu", 0);
}
@@ -368,7 +367,7 @@ static INPUT_PORTS_START( eggvntdx )
PORT_INCLUDE(eggventr)
PORT_MODIFY("IN0")
- PORT_DIPUNUSED_DIPLOC( 0x1000, IP_ACTIVE_LOW, "SW3:4" ) // Was "Slot Machine" - The slot machince is present in the code as a 'bonus stage'
+ PORT_DIPUNUSED_DIPLOC( 0x1000, IP_ACTIVE_LOW, "SW3:4" ) // Was "Slot Machine" - The slot machine is present in the code as a 'bonus stage'
// (when the egg reaches Vegas?), but not actually called (EC).
INPUT_PORTS_END
@@ -631,8 +630,8 @@ INPUT_PORTS_END
*
*************************************/
-MACHINE_CONFIG_START(lethalj_state::gameroom)
-
+void lethalj_state::gameroom(machine_config &config)
+{
/* basic machine hardware */
TMS34010(config, m_maincpu, MASTER_CLOCK);
m_maincpu->set_addrmap(AS_PROGRAM, &lethalj_state::lethalj_map);
@@ -641,38 +640,35 @@ MACHINE_CONFIG_START(lethalj_state::gameroom)
m_maincpu->set_pixels_per_clock(1);
m_maincpu->set_scanline_ind16_callback(FUNC(lethalj_state::scanline_update));
- MCFG_TICKET_DISPENSER_ADD("ticket", attotime::from_msec(200), TICKET_MOTOR_ACTIVE_HIGH, TICKET_STATUS_ACTIVE_HIGH)
+ TICKET_DISPENSER(config, m_ticket, attotime::from_msec(200), TICKET_MOTOR_ACTIVE_HIGH, TICKET_STATUS_ACTIVE_HIGH);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_RAW_PARAMS(VIDEO_CLOCK, 701, 0, 512, 263, 0, 236)
- MCFG_SCREEN_UPDATE_DEVICE("maincpu", tms34010_device, tms340x0_ind16)
- MCFG_SCREEN_PALETTE("palette")
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_raw(VIDEO_CLOCK, 701, 0, 512, 263, 0, 236);
+ m_screen->set_screen_update("maincpu", FUNC(tms34010_device::tms340x0_ind16));
+ m_screen->set_palette("palette");
PALETTE(config, "palette", palette_device::RGB_555);
/* sound hardware */
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("oki1", OKIM6295, SOUND_CLOCK, okim6295_device::PIN7_HIGH)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.8)
+ OKIM6295(config, "oki1", SOUND_CLOCK, okim6295_device::PIN7_HIGH).add_route(ALL_OUTPUTS, "mono", 0.8);
- MCFG_DEVICE_ADD("oki2", OKIM6295, SOUND_CLOCK, okim6295_device::PIN7_HIGH)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.8)
+ OKIM6295(config, "oki2", SOUND_CLOCK, okim6295_device::PIN7_HIGH).add_route(ALL_OUTPUTS, "mono", 0.8);
- MCFG_DEVICE_ADD("oki3", OKIM6295, SOUND_CLOCK, okim6295_device::PIN7_HIGH)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.8)
-MACHINE_CONFIG_END
+ OKIM6295(config, "oki3", SOUND_CLOCK, okim6295_device::PIN7_HIGH).add_route(ALL_OUTPUTS, "mono", 0.8);
+}
-MACHINE_CONFIG_START(lethalj_state::lethalj)
+void lethalj_state::lethalj(machine_config &config)
+{
gameroom(config);
m_maincpu->set_pixel_clock(VIDEO_CLOCK_LETHALJ);
- MCFG_SCREEN_MODIFY("screen")
- MCFG_SCREEN_RAW_PARAMS(VIDEO_CLOCK_LETHALJ, 689, 0, 512, 259, 0, 236)
-MACHINE_CONFIG_END
+ m_screen->set_raw(VIDEO_CLOCK_LETHALJ, 689, 0, 512, 259, 0, 236);
+}
diff --git a/src/mame/drivers/lg-dvd.cpp b/src/mame/drivers/lg-dvd.cpp
index 73f29b2c73c..cc685f02016 100644
--- a/src/mame/drivers/lg-dvd.cpp
+++ b/src/mame/drivers/lg-dvd.cpp
@@ -33,10 +33,11 @@ void lg_dvd_state::lg_dvd_map(address_map &map)
map(0x0000, 0x7fff).rom().region("maincpu", 0);
}
-MACHINE_CONFIG_START(lg_dvd_state::lg)
- MCFG_DEVICE_ADD( "maincpu", I80C52, XTAL(16'000'000) )
- MCFG_DEVICE_PROGRAM_MAP( lg_dvd_map )
-MACHINE_CONFIG_END
+void lg_dvd_state::lg(machine_config &config)
+{
+ I80C52(config, m_maincpu, XTAL(16'000'000));
+ m_maincpu->set_addrmap(AS_PROGRAM, &lg_dvd_state::lg_dvd_map);
+}
ROM_START( lggp40 )
ROM_REGION( 0x100000, "maincpu", 0 )
diff --git a/src/mame/drivers/lgp.cpp b/src/mame/drivers/lgp.cpp
index 2598595ba1d..2158a992817 100644
--- a/src/mame/drivers/lgp.cpp
+++ b/src/mame/drivers/lgp.cpp
@@ -412,21 +412,22 @@ void lgp_state::lgp_palette(palette_device &palette) const
/* DRIVER */
MACHINE_CONFIG_START(lgp_state::lgp)
/* main cpu */
- MCFG_DEVICE_ADD("maincpu", Z80, CPU_PCB_CLOCK)
- MCFG_DEVICE_PROGRAM_MAP(main_program_map)
- MCFG_DEVICE_IO_MAP(main_io_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", lgp_state, vblank_callback_lgp)
+ Z80(config, m_maincpu, CPU_PCB_CLOCK);
+ m_maincpu->set_addrmap(AS_PROGRAM, &lgp_state::main_program_map);
+ m_maincpu->set_addrmap(AS_IO, &lgp_state::main_io_map);
+ m_maincpu->set_vblank_int("screen", FUNC(lgp_state::vblank_callback_lgp));
/* sound cpu */
- MCFG_DEVICE_ADD("audiocpu", Z80, SOUND_PCB_CLOCK)
- MCFG_DEVICE_PROGRAM_MAP(sound_program_map)
- MCFG_DEVICE_IO_MAP(sound_io_map)
+ z80_device &audiocpu(Z80(config, "audiocpu", SOUND_PCB_CLOCK));
+ audiocpu.set_addrmap(AS_PROGRAM, &lgp_state::sound_program_map);
+ audiocpu.set_addrmap(AS_IO, &lgp_state::sound_io_map);
-
- MCFG_LASERDISC_LDV1000_ADD("laserdisc")
- MCFG_LASERDISC_LDV1000_COMMAND_STROBE_CB(WRITELINE(*this, lgp_state, ld_command_strobe_cb))
- MCFG_LASERDISC_OVERLAY_DRIVER(256, 256, lgp_state, screen_update_lgp)
- MCFG_LASERDISC_OVERLAY_PALETTE("palette")
+ PIONEER_LDV1000(config, m_laserdisc, 0);
+ m_laserdisc->command_strobe_callback().set(FUNC(lgp_state::ld_command_strobe_cb));
+ m_laserdisc->set_overlay(256, 256, FUNC(lgp_state::screen_update_lgp));
+ m_laserdisc->set_overlay_palette(m_palette);
+ m_laserdisc->add_route(0, "lspeaker", 1.0);
+ m_laserdisc->add_route(1, "rspeaker", 1.0);
/* video hardware */
MCFG_LASERDISC_SCREEN_ADD_NTSC("screen", "laserdisc")
@@ -438,10 +439,6 @@ MACHINE_CONFIG_START(lgp_state::lgp)
/* sound hardware */
SPEAKER(config, "lspeaker").front_left();
SPEAKER(config, "rspeaker").front_right();
-
- MCFG_DEVICE_MODIFY("laserdisc")
- MCFG_SOUND_ROUTE(0, "lspeaker", 1.0)
- MCFG_SOUND_ROUTE(1, "rspeaker", 1.0)
MACHINE_CONFIG_END
diff --git a/src/mame/drivers/liberate.cpp b/src/mame/drivers/liberate.cpp
index e2c31f14e29..245f906e692 100644
--- a/src/mame/drivers/liberate.cpp
+++ b/src/mame/drivers/liberate.cpp
@@ -741,33 +741,33 @@ MACHINE_RESET_MEMBER(liberate_state,liberate)
m_bank = 0;
}
-MACHINE_CONFIG_START(liberate_state::liberate_base)
-
+void liberate_state::liberate_base(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu",DECO16, 2000000)
- MCFG_DEVICE_PROGRAM_MAP(liberate_map)
- MCFG_DEVICE_IO_MAP(deco16_io_map)
+ DECO16(config, m_maincpu, 2000000);
+ m_maincpu->set_addrmap(AS_PROGRAM, &liberate_state::liberate_map);
+ m_maincpu->set_addrmap(AS_IO, &liberate_state::deco16_io_map);
- MCFG_DEVICE_ADD("audiocpu",DECO_222, 1500000) /* is it a real 222 (M6502 with bitswapped opcodes), or the same thing in external logic? */
- MCFG_DEVICE_PROGRAM_MAP(liberate_sound_map)
- MCFG_DEVICE_PERIODIC_INT_DRIVER(liberate_state, nmi_line_pulse, 16*60) /* ??? */
+ DECO_222(config, m_audiocpu, 1500000); /* is it a real 222 (M6502 with bitswapped opcodes), or the same thing in external logic? */
+ m_audiocpu->set_addrmap(AS_PROGRAM, &liberate_state::liberate_sound_map);
+ m_audiocpu->set_periodic_int(FUNC(liberate_state::nmi_line_pulse), attotime::from_hz(16*60)); /* ??? */
- MCFG_QUANTUM_TIME(attotime::from_hz(12000))
+ config.m_minimum_quantum = attotime::from_hz(12000);
MCFG_MACHINE_START_OVERRIDE(liberate_state,liberate)
MCFG_MACHINE_RESET_OVERRIDE(liberate_state,liberate)
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(529) /* 529ms Vblank duration?? */)
- MCFG_SCREEN_SIZE(32*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 1*8, 31*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(liberate_state, screen_update_liberate)
- MCFG_SCREEN_PALETTE(m_palette)
- MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE(*this, liberate_state, deco16_interrupt))
-
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, m_palette, gfx_liberate)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(529) /* 529ms Vblank duration?? */);
+ screen.set_size(32*8, 32*8);
+ screen.set_visarea(0*8, 32*8-1, 1*8, 31*8-1);
+ screen.set_screen_update(FUNC(liberate_state::screen_update_liberate));
+ screen.set_palette(m_palette);
+ screen.screen_vblank().set(FUNC(liberate_state::deco16_interrupt));
+
+ GFXDECODE(config, m_gfxdecode, m_palette, gfx_liberate);
PALETTE(config, m_palette, FUNC(liberate_state::liberate_palette), 33);
MCFG_VIDEO_START_OVERRIDE(liberate_state,liberate)
@@ -780,81 +780,80 @@ MACHINE_CONFIG_START(liberate_state::liberate_base)
AY8912(config, "ay1", 1500000).add_route(ALL_OUTPUTS, "mono", 0.30);
AY8912(config, "ay2", 1500000).add_route(ALL_OUTPUTS, "mono", 0.50);
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(liberate_state::liberate)
+void liberate_state::liberate(machine_config &config)
+{
liberate_base(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_OPCODES_MAP(decrypted_opcodes_map)
-MACHINE_CONFIG_END
+ m_maincpu->set_addrmap(AS_OPCODES, &liberate_state::decrypted_opcodes_map);
+}
-MACHINE_CONFIG_START(liberate_state::liberatb)
+void liberate_state::liberatb(machine_config &config)
+{
liberate_base(config);
/* basic machine hardware */
- MCFG_DEVICE_REPLACE("maincpu", M6502, 2000000)
- MCFG_DEVICE_PROGRAM_MAP(liberatb_map)
-MACHINE_CONFIG_END
+ M6502(config.replace(), m_maincpu, 2000000);
+ m_maincpu->set_addrmap(AS_PROGRAM, &liberate_state::liberatb_map);
+}
-MACHINE_CONFIG_START(liberate_state::boomrang)
+void liberate_state::boomrang(machine_config &config)
+{
liberate_base(config);
MCFG_VIDEO_START_OVERRIDE(liberate_state,boomrang)
- MCFG_SCREEN_MODIFY("screen")
- MCFG_SCREEN_UPDATE_DRIVER(liberate_state, screen_update_boomrang)
-MACHINE_CONFIG_END
+ subdevice<screen_device>("screen")->set_screen_update(FUNC(liberate_state::screen_update_boomrang));
+}
-MACHINE_CONFIG_START(liberate_state::prosoccr)
+void liberate_state::prosoccr(machine_config &config)
+{
liberate_base(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_CLOCK(10000000/8) //xtal is unknown?
- MCFG_DEVICE_PROGRAM_MAP(prosoccr_map)
- MCFG_DEVICE_IO_MAP(prosoccr_io_map)
+ m_maincpu->set_clock(10000000/8); //xtal is unknown?
+ m_maincpu->set_addrmap(AS_PROGRAM, &liberate_state::prosoccr_map);
+ m_maincpu->set_addrmap(AS_IO, &liberate_state::prosoccr_io_map);
- MCFG_DEVICE_MODIFY("audiocpu")
- MCFG_DEVICE_CLOCK(10000000/8) //xtal is 12 Mhz, divider is unknown
- MCFG_DEVICE_PROGRAM_MAP(prosoccr_sound_map)
+ m_audiocpu->set_clock(10000000/8); //xtal is 12 Mhz, divider is unknown
+ m_audiocpu->set_addrmap(AS_PROGRAM, &liberate_state::prosoccr_sound_map);
- MCFG_QUANTUM_TIME(attotime::from_hz(12000))
+ config.m_minimum_quantum = attotime::from_hz(12000);
- MCFG_SCREEN_MODIFY("screen")
- MCFG_SCREEN_VISIBLE_AREA(1*8, 31*8-1, 0*8, 32*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(liberate_state, screen_update_prosoccr)
+ subdevice<screen_device>("screen")->set_visarea(1*8, 31*8-1, 0*8, 32*8-1);
+ subdevice<screen_device>("screen")->set_screen_update(FUNC(liberate_state::screen_update_prosoccr));
- MCFG_GFXDECODE_MODIFY("gfxdecode", gfx_prosoccr)
+ m_gfxdecode->set_info(gfx_prosoccr);
MCFG_VIDEO_START_OVERRIDE(liberate_state,prosoccr)
-MACHINE_CONFIG_END
-
-MACHINE_CONFIG_START(liberate_state::prosport)
+}
+void liberate_state::prosport(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", DECO16, 2000000)
- MCFG_DEVICE_PROGRAM_MAP(prosport_map)
- MCFG_DEVICE_IO_MAP(deco16_io_map)
+ DECO16(config, m_maincpu, 2000000);
+ m_maincpu->set_addrmap(AS_PROGRAM, &liberate_state::prosport_map);
+ m_maincpu->set_addrmap(AS_IO, &liberate_state::deco16_io_map);
- MCFG_DEVICE_ADD("audiocpu", DECO_222, 1500000/2) /* is it a real 222 (M6502 with bitswapped opcodes), or the same thing in external logic? */
- MCFG_DEVICE_PROGRAM_MAP(liberate_sound_map)
- MCFG_DEVICE_PERIODIC_INT_DRIVER(liberate_state, nmi_line_pulse, 16*60) /* ??? */
+ DECO_222(config, m_audiocpu, 1500000/2); /* is it a real 222 (M6502 with bitswapped opcodes), or the same thing in external logic? */
+ m_audiocpu->set_addrmap(AS_PROGRAM, &liberate_state::liberate_sound_map);
+ m_audiocpu->set_periodic_int(FUNC(liberate_state::nmi_line_pulse), attotime::from_hz(16*60)); /* ??? */
-// MCFG_QUANTUM_TIME(attotime::from_hz(12000))
+// config.m_minimum_quantum = attotime::from_hz(12000);
MCFG_MACHINE_START_OVERRIDE(liberate_state,liberate)
MCFG_MACHINE_RESET_OVERRIDE(liberate_state,liberate)
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(1529) /* 529ms Vblank duration?? */)
- MCFG_SCREEN_SIZE(32*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 1*8, 31*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(liberate_state, screen_update_prosport)
- MCFG_SCREEN_PALETTE(m_palette)
- MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE(*this, liberate_state, deco16_interrupt))
-
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_prosport)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(1529) /* 529ms Vblank duration?? */);
+ screen.set_size(32*8, 32*8);
+ screen.set_visarea(0*8, 32*8-1, 1*8, 31*8-1);
+ screen.set_screen_update(FUNC(liberate_state::screen_update_prosport));
+ screen.set_palette(m_palette);
+ screen.screen_vblank().set(FUNC(liberate_state::deco16_interrupt));
+
+ GFXDECODE(config, m_gfxdecode, m_palette, gfx_prosport);
PALETTE(config, m_palette).set_format(palette_device::BGR_233_inverted, 256);
MCFG_VIDEO_START_OVERRIDE(liberate_state,prosport)
@@ -867,7 +866,7 @@ MACHINE_CONFIG_START(liberate_state::prosport)
AY8912(config, "ay1", 1500000).add_route(ALL_OUTPUTS, "mono", 0.30);
AY8912(config, "ay2", 1500000).add_route(ALL_OUTPUTS, "mono", 0.50);
-MACHINE_CONFIG_END
+}
/*************************************
diff --git a/src/mame/drivers/lilith.cpp b/src/mame/drivers/lilith.cpp
index d909b4b5264..9d9056f7d1f 100644
--- a/src/mame/drivers/lilith.cpp
+++ b/src/mame/drivers/lilith.cpp
@@ -26,8 +26,9 @@ private:
static INPUT_PORTS_START( lilith )
INPUT_PORTS_END
-MACHINE_CONFIG_START(lilith_state::lilith)
-MACHINE_CONFIG_END
+void lilith_state::lilith(machine_config &config)
+{
+}
ROM_START( lilith )
ROM_REGION( 0x10000, "maincpu", 0 )
diff --git a/src/mame/drivers/limenko.cpp b/src/mame/drivers/limenko.cpp
index 05f0496496b..bb0fe8a026e 100644
--- a/src/mame/drivers/limenko.cpp
+++ b/src/mame/drivers/limenko.cpp
@@ -41,6 +41,7 @@ public:
limenko_state(const machine_config &mconfig, device_type type, const char *tag)
: driver_device(mconfig, type, tag)
, m_maincpu(*this, "maincpu")
+ , m_qs1000(*this, "qs1000")
, m_oki(*this, "oki")
, m_gfxdecode(*this, "gfxdecode")
, m_palette(*this, "palette")
@@ -71,6 +72,7 @@ protected:
private:
required_device<cpu_device> m_maincpu;
+ optional_device<qs1000_device> m_qs1000;
optional_device<okim6295_device> m_oki;
required_device<gfxdecode_device> m_gfxdecode;
required_device<palette_device> m_palette;
@@ -273,7 +275,7 @@ READ8_MEMBER(limenko_state::spotty_sound_r)
if(m_spotty_sound_cmd == 0xf7)
return m_soundlatch->read(space,0);
else
- return m_oki->read(space,0);
+ return m_oki->read();
}
/*****************************************************************************************************
@@ -732,17 +734,17 @@ void limenko_state::limenko(machine_config &config)
SPEAKER(config, "rspeaker").front_right();
GENERIC_LATCH_8(config, m_soundlatch);
- m_soundlatch->data_pending_callback().set("qs1000", FUNC(qs1000_device::set_irq));
+ m_soundlatch->data_pending_callback().set(m_qs1000, FUNC(qs1000_device::set_irq));
m_soundlatch->set_separate_acknowledge(true);
- qs1000_device &qs1000(QS1000(config, "qs1000", XTAL(24'000'000)));
- qs1000.set_external_rom(true);
- qs1000.p1_in().set("soundlatch", FUNC(generic_latch_8_device::read));
- qs1000.p1_out().set(FUNC(limenko_state::qs1000_p1_w));
- qs1000.p2_out().set(FUNC(limenko_state::qs1000_p2_w));
- qs1000.p3_out().set(FUNC(limenko_state::qs1000_p3_w));
- qs1000.add_route(0, "lspeaker", 1.0);
- qs1000.add_route(1, "rspeaker", 1.0);
+ QS1000(config, m_qs1000, XTAL(24'000'000));
+ m_qs1000->set_external_rom(true);
+ m_qs1000->p1_in().set("soundlatch", FUNC(generic_latch_8_device::read));
+ m_qs1000->p1_out().set(FUNC(limenko_state::qs1000_p1_w));
+ m_qs1000->p2_out().set(FUNC(limenko_state::qs1000_p2_w));
+ m_qs1000->p3_out().set(FUNC(limenko_state::qs1000_p3_w));
+ m_qs1000->add_route(0, "lspeaker", 1.0);
+ m_qs1000->add_route(1, "rspeaker", 1.0);
}
void limenko_state::spotty(machine_config &config)
@@ -1092,7 +1094,7 @@ READ32_MEMBER(limenko_state::spotty_speedup_r)
void limenko_state::init_common()
{
// Set up the QS1000 program ROM banking, taking care not to overlap the internal RAM
- machine().device("qs1000:cpu")->memory().space(AS_IO).install_read_bank(0x0100, 0xffff, "bank");
+ m_qs1000->cpu().space(AS_IO).install_read_bank(0x0100, 0xffff, "bank");
membank("qs1000:bank")->configure_entries(0, 8, memregion("qs1000:cpu")->base()+0x100, 0x10000);
m_spriteram_bit = 1;
diff --git a/src/mame/drivers/lindbergh.cpp b/src/mame/drivers/lindbergh.cpp
index 2c3c2172dab..8953bddb2e2 100644
--- a/src/mame/drivers/lindbergh.cpp
+++ b/src/mame/drivers/lindbergh.cpp
@@ -392,8 +392,9 @@ void lindbergh_state::machine_reset()
{
}
-MACHINE_CONFIG_START(lindbergh_state::lindbergh)
- MCFG_DEVICE_ADD("maincpu", PENTIUM4, 28000000U*5) /* Actually Celeron D at 2,8 GHz */
+void lindbergh_state::lindbergh(machine_config &config)
+{
+ PENTIUM4(config, "maincpu", 28000000U*5); /* Actually Celeron D at 2,8 GHz */
PCI_ROOT (config, ":pci", 0);
I82875P_HOST (config, ":pci:00.0", 0, 0x103382c0, "maincpu", 512*1024*1024);
@@ -417,7 +418,7 @@ MACHINE_CONFIG_START(lindbergh_state::lindbergh)
SATA (config, ":pci:1f.2", 0, 0x808625a3, 0x02, 0x103382c0);
SMBUS (config, ":pci:1f.3", 0, 0x808625a4, 0x02, 0x103382c0);
AC97 (config, ":pci:1f.5", 0, 0x808625a6, 0x02, 0x103382c0);
-MACHINE_CONFIG_END
+}
#define LINDBERGH_BIOS \
ROM_REGION32_LE(0x100000, ":pci:1f.0", 0) /* PC bios, location 3j7 */ \
diff --git a/src/mame/drivers/lisa.cpp b/src/mame/drivers/lisa.cpp
index c09aebd3eab..13f5228c6a6 100644
--- a/src/mame/drivers/lisa.cpp
+++ b/src/mame/drivers/lisa.cpp
@@ -100,23 +100,26 @@ static const floppy_interface lisa_floppy_interface =
void lisa_state::lisa(machine_config &config)
{
/* basic machine hardware */
- M68000(config, m_maincpu, 5093760); /* 20.37504 MHz / 4 */
+ M68000(config, m_maincpu, 20.37504_MHz_XTAL / 4); // CPUCK is nominally 5 MHz
m_maincpu->set_addrmap(AS_PROGRAM, &lisa_state::lisa_map);
- m_maincpu->set_vblank_int(SCREEN_TAG, FUNC(lisa_state::lisa_interrupt));
+ m_maincpu->set_vblank_int("screen", FUNC(lisa_state::lisa_interrupt));
- cop421_cpu_device &cop(COP421(config, COP421_TAG, 3900000));
- cop.set_config(COP400_CKI_DIVISOR_16, COP400_CKO_OSCILLATOR_OUTPUT, true);
+ cop421_cpu_device &iocop(COP421(config, "iocop", 3.93216_MHz_XTAL)); // U9F (I/O board)
+ iocop.set_config(COP400_CKI_DIVISOR_16, COP400_CKO_OSCILLATOR_OUTPUT, true);
+ iocop.read_si().set_constant(1); // FIXME: actually tied to VIA CA2 but both pulled up to +5
+ iocop.read_g().set_constant(15);
- cop421_cpu_device &kbcop(COP421(config, KB_COP421_TAG, 3900000)); // ?
+ cop421_cpu_device &kbcop(COP421(config, "kbcop", 3932160)); // same clock as other COP?
kbcop.set_config(COP400_CKI_DIVISOR_16, COP400_CKO_OSCILLATOR_OUTPUT, true);
+ kbcop.read_si().set_constant(0);
+ kbcop.read_g().set_constant(15);
M6504(config, m_fdc_cpu, 2000000); /* 16.000 MHz / 8 in when DIS asserted, 16.000 MHz / 9 otherwise (?) */
m_fdc_cpu->set_addrmap(AS_PROGRAM, &lisa_state::lisa_fdc_map);
config.m_minimum_quantum = attotime::from_hz(60);
- LS259(config, m_latch, 0); // U4E
-
+ LS259(config, m_latch); // U4E (CPU board)
m_latch->q_out_cb<0>().set(FUNC(lisa_state::diag1_w));
m_latch->q_out_cb<1>().set(FUNC(lisa_state::diag2_w));
m_latch->q_out_cb<2>().set(FUNC(lisa_state::seg1_w));
@@ -127,11 +130,8 @@ void lisa_state::lisa(machine_config &config)
m_latch->q_out_cb<7>().set(FUNC(lisa_state::hdmsk_w));
SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
- m_screen->set_video_attributes(VIDEO_UPDATE_BEFORE_VBLANK);
- m_screen->set_refresh_hz(60);
- m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */
- m_screen->set_size(880, 380);
- m_screen->set_visarea(0, 720-1, 0, 364-1);
+ m_screen->set_raw(20.37504_MHz_XTAL, 896, 0, 720, 379, 0, 364);
+ //m_screen->set_raw(20_MHz_XTAL, 896, 0, 720, 374, 0, 360); // according to Lisa Hardware Reference Manual
m_screen->set_screen_update(FUNC(lisa_state::screen_update_lisa));
m_screen->set_palette("palette");
@@ -154,14 +154,14 @@ void lisa_state::lisa(machine_config &config)
SOFTWARE_LIST(config, "disk_list").set_type("lisa", SOFTWARE_LIST_ORIGINAL_SYSTEM);
/* via */
- VIA6522(config, m_via0, 500000);
+ VIA6522(config, m_via0, 20.37504_MHz_XTAL / 40); // CPU E clock (nominally 500 kHz)
m_via0->writepa_handler().set(FUNC(lisa_state::COPS_via_out_a));
m_via0->writepb_handler().set(FUNC(lisa_state::COPS_via_out_b));
m_via0->ca2_handler().set(FUNC(lisa_state::COPS_via_out_ca2));
m_via0->cb2_handler().set(FUNC(lisa_state::COPS_via_out_cb2));
m_via0->irq_handler().set(FUNC(lisa_state::COPS_via_irq_func));
- VIA6522(config, m_via1, 500000);
+ VIA6522(config, m_via1, 20.37504_MHz_XTAL / 40); // CPU E clock (nominally 500 kHz)
SCC8530(config, m_scc, 7833600);
}
@@ -363,10 +363,10 @@ ROM_START( lisa ) /* with twiggy drives, io40 i/o rom; technically any of the bo
ROMX_LOAD("341-0175-a", 0x000000, 0x2000, NO_DUMP, ROM_SKIP(1) | ROM_BIOS(7)) // 341-0175-A LISA Bootrom Rev A (10/12/82?) (High)
ROMX_LOAD("341-0176-a", 0x000001, 0x2000, NO_DUMP, ROM_SKIP(1) | ROM_BIOS(7)) // 341-0176-A LISA Bootrom Rev A (10/12/82?) (Low)
- ROM_REGION( 0x400, COP421_TAG, 0 )
+ ROM_REGION( 0x400, "iocop", 0 )
ROM_LOAD("341-0064a.u9f", 0x000, 0x400, CRC(e6849910) SHA1(d46e67df75c9e3e773d20542fb9d5b1d2ac0fb9b))
- ROM_REGION( 0x400, KB_COP421_TAG, 0 )
+ ROM_REGION( 0x400, "kbcop", 0 )
ROM_LOAD("341-0064a.u9f", 0x000, 0x400, CRC(e6849910) SHA1(d46e67df75c9e3e773d20542fb9d5b1d2ac0fb9b))
ROM_REGION(0x2000,"fdccpu",0) // 6504 RAM and ROM
@@ -406,10 +406,10 @@ ROM_START( lisa2 ) /* internal apple codename was 'pepsi'; has one SSDD 400K dri
ROMX_LOAD("341-0175-3b", 0x000000, 0x2000, NO_DUMP, ROM_SKIP(1) | ROM_BIOS(4)) // ?label? 341-0175-3b LISA Bootrom Rev 3B (9/8/83) (High)
ROMX_LOAD("341-0176-3b", 0x000001, 0x2000, NO_DUMP, ROM_SKIP(1) | ROM_BIOS(4)) // ?label? 341-0176-3b LISA Bootrom Rev 3B (9/8/83) (Low)
- ROM_REGION( 0x400, COP421_TAG, 0 )
+ ROM_REGION( 0x400, "iocop", 0 )
ROM_LOAD("341-0064a.u9f", 0x000, 0x400, CRC(e6849910) SHA1(d46e67df75c9e3e773d20542fb9d5b1d2ac0fb9b))
- ROM_REGION( 0x400, KB_COP421_TAG, 0 )
+ ROM_REGION( 0x400, "kbcop", 0 )
ROM_LOAD("341-0064a.u9f", 0x000, 0x400, CRC(e6849910) SHA1(d46e67df75c9e3e773d20542fb9d5b1d2ac0fb9b))
ROM_REGION(0x2000,"fdccpu",0) // 6504 RAM and ROM
@@ -439,10 +439,10 @@ ROM_START( lisa210 ) /* newer motherboard and i/o board; has io88 i/o rom, built
ROMX_LOAD("341-0175-f", 0x000000, 0x2000, CRC(701b9dab) SHA1(b116e5fada7b9a51f1b6e25757b2814d1b2737a5), ROM_SKIP(1) | ROM_BIOS(2)) // 341-0175-F LISA Bootrom Rev F (12/21/83) (High)
ROMX_LOAD("341-0176-f", 0x000001, 0x2000, CRC(036010b6) SHA1(ac93e6dbe4ce59396d7d191ee3e3e79a504e518f), ROM_SKIP(1) | ROM_BIOS(2)) // 341-0176-F LISA Bootrom Rev F (12/21/83) (Low)
- ROM_REGION( 0x400, COP421_TAG, 0 )
+ ROM_REGION( 0x400, "iocop", 0 )
ROM_LOAD("341-0064a.u9f", 0x000, 0x400, CRC(e6849910) SHA1(d46e67df75c9e3e773d20542fb9d5b1d2ac0fb9b))
- ROM_REGION( 0x400, KB_COP421_TAG, 0 )
+ ROM_REGION( 0x400, "kbcop", 0 )
ROM_LOAD("341-0064a.u9f", 0x000, 0x400, CRC(e6849910) SHA1(d46e67df75c9e3e773d20542fb9d5b1d2ac0fb9b))
#if 1
@@ -467,10 +467,10 @@ ROM_START( macxl )
ROM_LOAD16_BYTE("341-0347-a", 0x000000, 0x2000, CRC(80add605) SHA1(82215688b778d8c712a8186235f7981e3dc4dd7f)) // 341-0347-A Mac XL '3A' Bootrom Hi (boot3a.hi)
ROM_LOAD16_BYTE("341-0346-a", 0x000001, 0x2000, CRC(edf5222f) SHA1(b0388ee8dbbc51a2d628473dc29b65ce913fcd76)) // 341-0346-A Mac XL '3A' Bootrom Lo (boot3a.lo)
- ROM_REGION( 0x400, COP421_TAG, 0 )
+ ROM_REGION( 0x400, "iocop", 0 )
ROM_LOAD("341-0064a.u9f", 0x000, 0x400, CRC(e6849910) SHA1(d46e67df75c9e3e773d20542fb9d5b1d2ac0fb9b))
- ROM_REGION( 0x400, KB_COP421_TAG, 0 )
+ ROM_REGION( 0x400, "kbcop", 0 )
ROM_LOAD("341-0064a.u9f", 0x000, 0x400, CRC(e6849910) SHA1(d46e67df75c9e3e773d20542fb9d5b1d2ac0fb9b))
#if 1
diff --git a/src/mame/drivers/littlerb.cpp b/src/mame/drivers/littlerb.cpp
index 4573075593e..5c5c206ca69 100644
--- a/src/mame/drivers/littlerb.cpp
+++ b/src/mame/drivers/littlerb.cpp
@@ -287,25 +287,26 @@ TIMER_DEVICE_CALLBACK_MEMBER(littlerb_state::littlerb_sound_step_cb)
m_soundframe++;
}
-MACHINE_CONFIG_START(littlerb_state::littlerb)
- MCFG_DEVICE_ADD("maincpu", M68000, XTAL(16'000'000)/2) // 10MHz rated part, near 16Mhz XTAL
- MCFG_DEVICE_PROGRAM_MAP(littlerb_main)
+void littlerb_state::littlerb(machine_config &config)
+{
+ M68000(config, m_maincpu, XTAL(16'000'000)/2); // 10MHz rated part, near 16Mhz XTAL
+ m_maincpu->set_addrmap(AS_PROGRAM, &littlerb_state::littlerb_main);
INDER_VIDEO(config, m_indervid, 0); // XTAL(40'000'000)
// TODO: not accurate - driven by XTAL(6'000'000)?
- MCFG_TIMER_DRIVER_ADD_PERIODIC("step_timer", littlerb_state, littlerb_sound_step_cb, attotime::from_hz(7500/150))
- MCFG_TIMER_DRIVER_ADD_PERIODIC("sound_timer", littlerb_state, littlerb_sound_cb, attotime::from_hz(7500))
+ TIMER(config, "step_timer").configure_periodic(FUNC(littlerb_state::littlerb_sound_step_cb), attotime::from_hz(7500/150));
+ TIMER(config, "sound_timer").configure_periodic(FUNC(littlerb_state::littlerb_sound_cb), attotime::from_hz(7500));
SPEAKER(config, "lspeaker").front_left();
SPEAKER(config, "rspeaker").front_right();
- MCFG_DEVICE_ADD("ldac", DAC_8BIT_R2R, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 0.5) // unknown DAC
- MCFG_DEVICE_ADD("rdac", DAC_8BIT_R2R, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 0.5) // unknown DAC
- MCFG_DEVICE_ADD("vref", VOLTAGE_REGULATOR, 0) MCFG_VOLTAGE_REGULATOR_OUTPUT(5.0)
- MCFG_SOUND_ROUTE(0, "ldac", 1.0, DAC_VREF_POS_INPUT) MCFG_SOUND_ROUTE(0, "ldac", -1.0, DAC_VREF_NEG_INPUT)
- MCFG_SOUND_ROUTE(0, "rdac", 1.0, DAC_VREF_POS_INPUT) MCFG_SOUND_ROUTE(0, "rdac", -1.0, DAC_VREF_NEG_INPUT)
-MACHINE_CONFIG_END
+ DAC_8BIT_R2R(config, m_ldac, 0).add_route(ALL_OUTPUTS, "lspeaker", 0.5); // unknown DAC
+ DAC_8BIT_R2R(config, m_rdac, 0).add_route(ALL_OUTPUTS, "rspeaker", 0.5); // unknown DAC
+ voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref"));
+ vref.add_route(0, "ldac", 1.0, DAC_VREF_POS_INPUT); vref.add_route(0, "ldac", -1.0, DAC_VREF_NEG_INPUT);
+ vref.add_route(0, "rdac", 1.0, DAC_VREF_POS_INPUT); vref.add_route(0, "rdac", -1.0, DAC_VREF_NEG_INPUT);
+}
ROM_START( littlerb )
ROM_REGION( 0x100000, "maincpu", 0 ) /* 68000 Code */
diff --git a/src/mame/drivers/lkage.cpp b/src/mame/drivers/lkage.cpp
index 9c98ce24ecc..923e61eb107 100644
--- a/src/mame/drivers/lkage.cpp
+++ b/src/mame/drivers/lkage.cpp
@@ -497,7 +497,7 @@ void lkage_state::lkage(machine_config &config)
m_maincpu->set_vblank_int("screen", FUNC(lkage_state::irq0_line_hold));
Z80(config, m_audiocpu, SOUND_CPU_CLOCK);
- m_audiocpu->set_addrmap(AS_PROGRAM, &lkage_state::lkage_sound_map); /* IRQs are triggered by the YM2203 */
+ m_audiocpu->set_addrmap(AS_PROGRAM, &lkage_state::lkage_sound_map); /* IRQs are triggered by the YM2203 */
TAITO68705_MCU(config, m_bmcu, MCU_CLOCK);
diff --git a/src/mame/drivers/llc.cpp b/src/mame/drivers/llc.cpp
index 44f7e645886..5c3568309d1 100644
--- a/src/mame/drivers/llc.cpp
+++ b/src/mame/drivers/llc.cpp
@@ -200,7 +200,8 @@ static GFXDECODE_START( gfx_llc2 )
GFXDECODE_END
/* Machine driver */
-MACHINE_CONFIG_START(llc_state::llc1)
+void llc_state::llc1(machine_config &config)
+{
/* basic machine hardware */
Z80(config, m_maincpu, XTAL(3'000'000));
m_maincpu->set_daisy_config(llc1_daisy_chain);
@@ -211,15 +212,15 @@ MACHINE_CONFIG_START(llc_state::llc1)
MCFG_MACHINE_RESET_OVERRIDE(llc_state, llc1 )
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(50)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */
- MCFG_SCREEN_SIZE(64*8, 16*8)
- MCFG_SCREEN_VISIBLE_AREA(0, 64*8-1, 0, 16*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(llc_state, screen_update_llc1)
- MCFG_SCREEN_PALETTE("palette")
-
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_llc1)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(50);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */
+ screen.set_size(64*8, 16*8);
+ screen.set_visarea(0, 64*8-1, 0, 16*8-1);
+ screen.set_screen_update(FUNC(llc_state::screen_update_llc1));
+ screen.set_palette("palette");
+
+ GFXDECODE(config, "gfxdecode", "palette", gfx_llc1);
PALETTE(config, "palette", palette_device::MONOCHROME);
config.set_default_layout(layout_llc1);
@@ -242,9 +243,10 @@ MACHINE_CONFIG_START(llc_state::llc1)
generic_keyboard_device &keyboard(GENERIC_KEYBOARD(config, "keyboard", 0));
keyboard.set_keyboard_callback(FUNC(llc_state::kbd_put));
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(llc_state::llc2)
+void llc_state::llc2(machine_config &config)
+{
/* basic machine hardware */
Z80(config, m_maincpu, XTAL(3'000'000));
m_maincpu->set_daisy_config(llc2_daisy_chain);
@@ -254,21 +256,20 @@ MACHINE_CONFIG_START(llc_state::llc2)
MCFG_MACHINE_RESET_OVERRIDE(llc_state, llc2 )
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(50)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */
- MCFG_SCREEN_SIZE(64*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0, 64*8-1, 0, 32*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(llc_state, screen_update_llc2)
- MCFG_SCREEN_PALETTE("palette")
-
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_llc2)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(50);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */
+ screen.set_size(64*8, 32*8);
+ screen.set_visarea(0, 64*8-1, 0, 32*8-1);
+ screen.set_screen_update(FUNC(llc_state::screen_update_llc2));
+ screen.set_palette("palette");
+
+ GFXDECODE(config, "gfxdecode", "palette", gfx_llc2);
PALETTE(config, "palette", palette_device::MONOCHROME);
/* sound hardware */
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("speaker", SPEAKER_SOUND)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.15)
+ SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.15);
z80pio_device& pio1(Z80PIO(config, "z80pio1", XTAL(3'000'000)));
pio1.in_pa_callback().set(K7659_KEYBOARD_TAG, FUNC(k7659_keyboard_device::read));
@@ -278,13 +279,13 @@ MACHINE_CONFIG_START(llc_state::llc2)
z80pio_device& pio2(Z80PIO(config, "z80pio2", XTAL(3'000'000)));
pio2.in_pa_callback().set(FUNC(llc_state::llc2_port2_a_r));
- MCFG_DEVICE_ADD("z80ctc", Z80CTC, XTAL(3'000'000))
+ Z80CTC(config, "z80ctc", XTAL(3'000'000));
K7659_KEYBOARD(config, K7659_KEYBOARD_TAG, 0);
/* internal ram */
RAM(config, RAM_TAG).set_default_size("64K");
-MACHINE_CONFIG_END
+}
/* ROM definition */
ROM_START( llc1 )
diff --git a/src/mame/drivers/lockon.cpp b/src/mame/drivers/lockon.cpp
index 9648e829649..d9474d316a1 100644
--- a/src/mame/drivers/lockon.cpp
+++ b/src/mame/drivers/lockon.cpp
@@ -470,23 +470,23 @@ void lockon_state::machine_reset()
m_main_inten = 0;
}
-MACHINE_CONFIG_START(lockon_state::lockon)
-
- MCFG_DEVICE_ADD("maincpu", V30, 16_MHz_XTAL / 2)
- MCFG_DEVICE_PROGRAM_MAP(main_v30)
+void lockon_state::lockon(machine_config &config)
+{
+ V30(config, m_maincpu, 16_MHz_XTAL / 2);
+ m_maincpu->set_addrmap(AS_PROGRAM, &lockon_state::main_v30);
- MCFG_DEVICE_ADD("ground", V30, 16_MHz_XTAL / 2)
- MCFG_DEVICE_PROGRAM_MAP(ground_v30)
+ V30(config, m_ground, 16_MHz_XTAL / 2);
+ m_ground->set_addrmap(AS_PROGRAM, &lockon_state::ground_v30);
- MCFG_DEVICE_ADD("object", V30, 16_MHz_XTAL / 2)
- MCFG_DEVICE_PROGRAM_MAP(object_v30)
+ V30(config, m_object, 16_MHz_XTAL / 2);
+ m_object->set_addrmap(AS_PROGRAM, &lockon_state::object_v30);
- MCFG_DEVICE_ADD("audiocpu", Z80, 16_MHz_XTAL / 4)
- MCFG_DEVICE_PROGRAM_MAP(sound_prg)
- MCFG_DEVICE_IO_MAP(sound_io)
+ Z80(config, m_audiocpu, 16_MHz_XTAL / 4);
+ m_audiocpu->set_addrmap(AS_PROGRAM, &lockon_state::sound_prg);
+ m_audiocpu->set_addrmap(AS_IO, &lockon_state::sound_io);
WATCHDOG_TIMER(config, m_watchdog).set_time(PERIOD_OF_555_ASTABLE(10000, 4700, 10000e-12) * 4096);
- MCFG_QUANTUM_TIME(attotime::from_hz(600))
+ config.m_minimum_quantum = attotime::from_hz(600);
m58990_device &adc(M58990(config, "adc", 16_MHz_XTAL / 16));
adc.in_callback<0>().set_ioport("ADC_BANK");
@@ -494,12 +494,12 @@ MACHINE_CONFIG_START(lockon_state::lockon)
adc.in_callback<2>().set_ioport("ADC_MISSILE");
adc.in_callback<3>().set_ioport("ADC_HOVER");
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_VIDEO_ATTRIBUTES(VIDEO_UPDATE_AFTER_VBLANK)
- MCFG_SCREEN_RAW_PARAMS(PIXEL_CLOCK, HTOTAL, HBEND, HBSTART, VTOTAL, VBEND, VBSTART)
- MCFG_SCREEN_UPDATE_DRIVER(lockon_state, screen_update_lockon)
- MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE(*this, lockon_state, screen_vblank_lockon))
- MCFG_SCREEN_PALETTE(m_palette)
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_video_attributes(VIDEO_UPDATE_AFTER_VBLANK);
+ m_screen->set_raw(PIXEL_CLOCK, HTOTAL, HBEND, HBSTART, VTOTAL, VBEND, VBSTART);
+ m_screen->set_screen_update(FUNC(lockon_state::screen_update_lockon));
+ m_screen->screen_vblank().set(FUNC(lockon_state::screen_vblank_lockon));
+ m_screen->set_palette(m_palette);
GFXDECODE(config, m_gfxdecode, m_palette, gfx_lockon);
PALETTE(config, m_palette, FUNC(lockon_state::lockon_palette), 1024 + 2048);
@@ -526,7 +526,7 @@ MACHINE_CONFIG_START(lockon_state::lockon)
FILTER_VOLUME(config, "f2203.2r").add_route(ALL_OUTPUTS, "rspeaker", 1.0);
FILTER_VOLUME(config, "f2203.3l").add_route(ALL_OUTPUTS, "lspeaker", 1.0);
FILTER_VOLUME(config, "f2203.3r").add_route(ALL_OUTPUTS, "rspeaker", 1.0);
-MACHINE_CONFIG_END
+}
/*************************************
diff --git a/src/mame/drivers/looping.cpp b/src/mame/drivers/looping.cpp
index ff23f1f710b..04202e11ff0 100644
--- a/src/mame/drivers/looping.cpp
+++ b/src/mame/drivers/looping.cpp
@@ -216,18 +216,18 @@ void looping_state::looping_palette(palette_device &palette) const
bit0 = BIT(color_prom[i], 0);
bit1 = BIT(color_prom[i], 1);
bit2 = BIT(color_prom[i], 2);
- int const r = combine_3_weights(rweights, bit0, bit1, bit2);
+ int const r = combine_weights(rweights, bit0, bit1, bit2);
// green component
bit0 = BIT(color_prom[i], 3);
bit1 = BIT(color_prom[i], 4);
bit2 = BIT(color_prom[i], 5);
- int const g = combine_3_weights(gweights, bit0, bit1, bit2);
+ int const g = combine_weights(gweights, bit0, bit1, bit2);
// blue component
bit0 = BIT(color_prom[i], 6);
bit1 = BIT(color_prom[i], 7);
- int const b = combine_2_weights(bweights, bit0, bit1);
+ int const b = combine_weights(bweights, bit0, bit1);
palette.set_pen_color(i, rgb_t(r, g, b));
}
@@ -567,7 +567,7 @@ void looping_state::looping_map(address_map &map)
void looping_state::looping_io_map(address_map &map)
{
- map(0x400, 0x407).w("mainlatch", FUNC(ls259_device::write_d0));
+ map(0x0800, 0x080f).w("mainlatch", FUNC(ls259_device::write_d0));
}
@@ -587,8 +587,8 @@ void looping_state::looping_sound_map(address_map &map)
void looping_state::looping_sound_io_map(address_map &map)
{
- map(0x000, 0x007).w("sen0", FUNC(ls259_device::write_d0));
- map(0x008, 0x00f).w("sen1", FUNC(ls259_device::write_d0));
+ map(0x0000, 0x000f).w("sen0", FUNC(ls259_device::write_d0));
+ map(0x0010, 0x001f).w("sen1", FUNC(ls259_device::write_d0));
}
@@ -684,7 +684,6 @@ void looping_state::looping(machine_config &config)
DAC_2BIT_R2R(config, m_dac, 0).add_route(ALL_OUTPUTS, "speaker", 0.15); // unknown DAC
voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref", 0));
- vref.set_output(5.0);
vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT);
vref.add_route(0, "dac", -1.0, DAC_VREF_NEG_INPUT);
diff --git a/src/mame/drivers/lsasquad.cpp b/src/mame/drivers/lsasquad.cpp
index b75ad9fb27e..08436c78a2d 100644
--- a/src/mame/drivers/lsasquad.cpp
+++ b/src/mame/drivers/lsasquad.cpp
@@ -555,20 +555,20 @@ MACHINE_RESET_MEMBER(lsasquad_state,lsasquad)
}
/* Note: lsasquad clock values are not verified */
-MACHINE_CONFIG_START(lsasquad_state::lsasquad)
-
+void lsasquad_state::lsasquad(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, MASTER_CLOCK / 4)
- MCFG_DEVICE_PROGRAM_MAP(lsasquad_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", lsasquad_state, irq0_line_hold)
+ Z80(config, m_maincpu, MASTER_CLOCK / 4);
+ m_maincpu->set_addrmap(AS_PROGRAM, &lsasquad_state::lsasquad_map);
+ m_maincpu->set_vblank_int("screen", FUNC(lsasquad_state::irq0_line_hold));
- MCFG_DEVICE_ADD("audiocpu", Z80, MASTER_CLOCK / 8)
- MCFG_DEVICE_PROGRAM_MAP(lsasquad_sound_map)
+ Z80(config, m_audiocpu, MASTER_CLOCK / 8);
+ m_audiocpu->set_addrmap(AS_PROGRAM, &lsasquad_state::lsasquad_sound_map);
/* IRQs are triggered by the YM2203 */
- MCFG_DEVICE_ADD("bmcu", TAITO68705_MCU, MASTER_CLOCK / 8)
+ TAITO68705_MCU(config, m_bmcu, MASTER_CLOCK / 8);
- MCFG_QUANTUM_TIME(attotime::from_hz(30000)) /* 500 CPU slices per frame - an high value to ensure proper */
+ config.m_minimum_quantum = attotime::from_hz(30000); /* 500 CPU slices per frame - a high value to ensure proper */
/* synchronization of the CPUs */
/* main<->sound synchronization depends on this */
@@ -578,21 +578,20 @@ MACHINE_CONFIG_START(lsasquad_state::lsasquad)
GENERIC_LATCH_8(config, m_soundlatch);
m_soundlatch->data_pending_callback().set("soundnmi", FUNC(input_merger_device::in_w<0>));
- MCFG_INPUT_MERGER_ALL_HIGH("soundnmi")
- MCFG_INPUT_MERGER_OUTPUT_HANDLER(INPUTLINE("audiocpu", INPUT_LINE_NMI))
+ INPUT_MERGER_ALL_HIGH(config, "soundnmi").output_handler().set_inputline(m_audiocpu, INPUT_LINE_NMI);
GENERIC_LATCH_8(config, m_soundlatch2);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(32*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0, 32*8-1, 2*8, 30*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(lsasquad_state, screen_update_lsasquad)
- MCFG_SCREEN_PALETTE(m_palette)
-
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_lsasquad)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(32*8, 32*8);
+ screen.set_visarea(0, 32*8-1, 2*8, 30*8-1);
+ screen.set_screen_update(FUNC(lsasquad_state::screen_update_lsasquad));
+ screen.set_palette(m_palette);
+
+ GFXDECODE(config, m_gfxdecode, m_palette, gfx_lsasquad);
PALETTE(config, m_palette, palette_device::RGB_444_PROMS, "proms", 512);
/* sound hardware */
@@ -608,33 +607,33 @@ MACHINE_CONFIG_START(lsasquad_state::lsasquad)
ymsnd.add_route(1, "mono", 0.12);
ymsnd.add_route(2, "mono", 0.12);
ymsnd.add_route(3, "mono", 0.63);
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(lsasquad_state::storming)
+void lsasquad_state::storming(machine_config &config)
+{
lsasquad(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(storming_map)
+ m_maincpu->set_addrmap(AS_PROGRAM, &lsasquad_state::storming_map);
- MCFG_DEVICE_REMOVE("bmcu")
+ config.device_remove("bmcu");
AY8910(config.replace(), "aysnd", MASTER_CLOCK / 8).add_route(ALL_OUTPUTS, "mono", 0.12); // AY-3-8910A
-MACHINE_CONFIG_END
-
-MACHINE_CONFIG_START(lsasquad_state::daikaiju)
+}
+void lsasquad_state::daikaiju(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, MASTER_CLOCK / 4)
- MCFG_DEVICE_PROGRAM_MAP(daikaiju_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", lsasquad_state, irq0_line_hold)
+ Z80(config, m_maincpu, MASTER_CLOCK / 4);
+ m_maincpu->set_addrmap(AS_PROGRAM, &lsasquad_state::daikaiju_map);
+ m_maincpu->set_vblank_int("screen", FUNC(lsasquad_state::irq0_line_hold));
- MCFG_DEVICE_ADD("audiocpu", Z80, MASTER_CLOCK / 8)
- MCFG_DEVICE_PROGRAM_MAP(daikaiju_sound_map)
+ Z80(config, m_audiocpu, MASTER_CLOCK / 8);
+ m_audiocpu->set_addrmap(AS_PROGRAM, &lsasquad_state::daikaiju_sound_map);
/* IRQs are triggered by the YM2203 */
- MCFG_DEVICE_ADD("bmcu", TAITO68705_MCU, MASTER_CLOCK / 8)
+ TAITO68705_MCU(config, m_bmcu, MASTER_CLOCK / 8);
- MCFG_QUANTUM_TIME(attotime::from_hz(30000)) /* 500 CPU slices per frame - an high value to ensure proper */
+ config.m_minimum_quantum = attotime::from_hz(30000); /* 500 CPU slices per frame - a high value to ensure proper */
/* synchronization of the CPUs */
/* main<->sound synchronization depends on this */
@@ -644,19 +643,18 @@ MACHINE_CONFIG_START(lsasquad_state::daikaiju)
GENERIC_LATCH_8(config, m_soundlatch);
m_soundlatch->data_pending_callback().set("soundnmi", FUNC(input_merger_device::in_w<0>));
- MCFG_INPUT_MERGER_ALL_HIGH("soundnmi")
- MCFG_INPUT_MERGER_OUTPUT_HANDLER(INPUTLINE("audiocpu", INPUT_LINE_NMI))
+ INPUT_MERGER_ALL_HIGH(config, "soundnmi").output_handler().set_inputline(m_audiocpu, INPUT_LINE_NMI);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(32*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0, 32*8-1, 2*8, 30*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(lsasquad_state, screen_update_daikaiju)
- MCFG_SCREEN_PALETTE(m_palette)
-
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_lsasquad)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(32*8, 32*8);
+ screen.set_visarea(0, 32*8-1, 2*8, 30*8-1);
+ screen.set_screen_update(FUNC(lsasquad_state::screen_update_daikaiju));
+ screen.set_palette(m_palette);
+
+ GFXDECODE(config, m_gfxdecode, m_palette, gfx_lsasquad);
PALETTE(config, m_palette, palette_device::RGB_444_PROMS, "proms", 512);
/* sound hardware */
@@ -672,7 +670,7 @@ MACHINE_CONFIG_START(lsasquad_state::daikaiju)
ymsnd.add_route(1, "mono", 0.12);
ymsnd.add_route(2, "mono", 0.12);
ymsnd.add_route(3, "mono", 0.63);
-MACHINE_CONFIG_END
+}
/***************************************************************************
diff --git a/src/mame/drivers/ltcasino.cpp b/src/mame/drivers/ltcasino.cpp
index cbad9040b9f..e6fb14e2898 100644
--- a/src/mame/drivers/ltcasino.cpp
+++ b/src/mame/drivers/ltcasino.cpp
@@ -742,20 +742,21 @@ static GFXDECODE_START( gfx_ltcasino )
GFXDECODE_END
-MACHINE_CONFIG_START(ltcasino_state::ltcasino)
+void ltcasino_state::ltcasino(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD(m_maincpu, M6502, XTAL(18'432'000)/9) /* 2.048MHz ?? (or 18.432MHz/8 = 2.304MHz) - not verified */
- MCFG_DEVICE_PROGRAM_MAP(main_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", ltcasino_state, irq0_line_hold)
+ M6502(config, m_maincpu, XTAL(18'432'000)/9); /* 2.048MHz ?? (or 18.432MHz/8 = 2.304MHz) - not verified */
+ m_maincpu->set_addrmap(AS_PROGRAM, &ltcasino_state::main_map);
+ m_maincpu->set_vblank_int("screen", FUNC(ltcasino_state::irq0_line_hold));
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(64*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(6*8, 58*8-1, 0, 32*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(ltcasino_state, screen_update)
- MCFG_SCREEN_PALETTE("palette")
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(64*8, 32*8);
+ screen.set_visarea(6*8, 58*8-1, 0, 32*8-1);
+ screen.set_screen_update(FUNC(ltcasino_state::screen_update));
+ screen.set_palette("palette");
GFXDECODE(config, m_gfxdecode, "palette", gfx_ltcasino);
PALETTE(config, "palette", FUNC(ltcasino_state::ltcasino_palette), 2*64);
@@ -768,7 +769,7 @@ MACHINE_CONFIG_START(ltcasino_state::ltcasino)
aysnd.port_b_read_callback().set_ioport("IN6");
//ltcasino -> pc: F3F3 (A in service) and F3FD (B in service)
aysnd.add_route(ALL_OUTPUTS, "mono", 0.4);
-MACHINE_CONFIG_END
+}
ROM_START( ltcasino )
diff --git a/src/mame/drivers/ltd.cpp b/src/mame/drivers/ltd.cpp
index 7e7ef9404e9..27f3e4e9500 100644
--- a/src/mame/drivers/ltd.cpp
+++ b/src/mame/drivers/ltd.cpp
@@ -523,10 +523,11 @@ TIMER_DEVICE_CALLBACK_MEMBER( ltd_state::timer_r )
}
}
-MACHINE_CONFIG_START(ltd_state::ltd3)
+void ltd_state::ltd3(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M6802, XTAL(3'579'545))
- MCFG_DEVICE_PROGRAM_MAP(ltd3_map)
+ M6802(config, m_maincpu, XTAL(3'579'545));
+ m_maincpu->set_addrmap(AS_PROGRAM, &ltd_state::ltd3_map);
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
@@ -536,10 +537,11 @@ MACHINE_CONFIG_START(ltd_state::ltd3)
/* Sound */
genpin_audio(config);
- MCFG_TIMER_DRIVER_ADD_PERIODIC("timer_r", ltd_state, timer_r, attotime::from_hz(500))
-MACHINE_CONFIG_END
+ TIMER(config, "timer_r").configure_periodic(FUNC(ltd_state::timer_r), attotime::from_hz(500));
+}
-MACHINE_CONFIG_START(ltd_state::ltd4)
+void ltd_state::ltd4(machine_config &config)
+{
/* basic machine hardware */
m6803_cpu_device &maincpu(M6803(config, "maincpu", XTAL(3'579'545))); // guess, no details available
maincpu.set_addrmap(AS_PROGRAM, &ltd_state::ltd4_map);
@@ -559,7 +561,7 @@ MACHINE_CONFIG_START(ltd_state::ltd4)
SPEAKER(config, "mono").front_center();
AY8910(config, "aysnd_0", XTAL(3'579'545)/2).add_route(ALL_OUTPUTS, "mono", 0.3); /* guess */
AY8910(config, "aysnd_1", XTAL(3'579'545)/2).add_route(ALL_OUTPUTS, "mono", 0.3); /* guess */
-MACHINE_CONFIG_END
+}
/*-------------------------------------------------------------------
/ Arizona
diff --git a/src/mame/drivers/luckgrln.cpp b/src/mame/drivers/luckgrln.cpp
index 63507f60509..a15a16257f7 100644
--- a/src/mame/drivers/luckgrln.cpp
+++ b/src/mame/drivers/luckgrln.cpp
@@ -861,42 +861,42 @@ INTERRUPT_GEN_MEMBER(luckgrln_state::irq)
m_maincpu->pulse_input_line(INPUT_LINE_NMI, attotime::zero);
}
-MACHINE_CONFIG_START(luckgrln_state::luckgrln)
- MCFG_DEVICE_ADD(m_maincpu, Z180,8000000)
- MCFG_DEVICE_PROGRAM_MAP(mainmap)
- MCFG_DEVICE_IO_MAP(luckgrln_io)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", luckgrln_state, irq)
+void luckgrln_state::luckgrln(machine_config &config)
+{
+ Z180(config, m_maincpu, 8000000);
+ m_maincpu->set_addrmap(AS_PROGRAM, &luckgrln_state::mainmap);
+ m_maincpu->set_addrmap(AS_IO, &luckgrln_state::luckgrln_io);
+ m_maincpu->set_vblank_int("screen", FUNC(luckgrln_state::irq));
h46505_device &crtc(H46505(config, "crtc", 6000000/4)); /* unknown clock, hand tuned to get ~60 fps */
crtc.set_screen("screen");
crtc.set_show_border_area(false);
crtc.set_char_width(8);
- MCFG_DEVICE_ADD("rtc", MSM6242, 0)
+ MSM6242(config, "rtc", 0);
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(512, 256)
- MCFG_SCREEN_VISIBLE_AREA(0, 512-1, 0, 256-1)
- MCFG_SCREEN_UPDATE_DRIVER(luckgrln_state, screen_update)
- MCFG_SCREEN_PALETTE("palette")
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(512, 256);
+ screen.set_visarea(0, 512-1, 0, 256-1);
+ screen.set_screen_update(FUNC(luckgrln_state::screen_update));
+ screen.set_palette(m_palette);
- MCFG_DEVICE_ADD(m_gfxdecode, GFXDECODE, "palette", gfx_luckgrln)
- MCFG_PALETTE_ADD("palette", 0x8000)
+ GFXDECODE(config, m_gfxdecode, m_palette, gfx_luckgrln);
+ PALETTE(config, m_palette).set_entries(0x8000);
SPEAKER(config, "mono").front_center();
+}
-MACHINE_CONFIG_END
-
-MACHINE_CONFIG_START(luckgrln_state::_7smash)
+void luckgrln_state::_7smash(machine_config &config)
+{
luckgrln(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(_7smash_map)
- MCFG_DEVICE_IO_MAP(_7smash_io)
+ m_maincpu->set_addrmap(AS_PROGRAM, &luckgrln_state::_7smash_map);
+ m_maincpu->set_addrmap(AS_IO, &luckgrln_state::_7smash_io);
- MCFG_DEVICE_REMOVE("rtc")
-MACHINE_CONFIG_END
+ config.device_remove("rtc");
+}
void luckgrln_state::init_luckgrln()
{
diff --git a/src/mame/drivers/lucky74.cpp b/src/mame/drivers/lucky74.cpp
index cc000621cf2..eef05d50adb 100644
--- a/src/mame/drivers/lucky74.cpp
+++ b/src/mame/drivers/lucky74.cpp
@@ -937,11 +937,11 @@ void lucky74_state::lucky74_map(address_map &map)
map(0xf000, 0xf003).rw("ppi8255_0", FUNC(i8255_device::read), FUNC(i8255_device::write)); // Input Ports 0 & 1
map(0xf080, 0xf083).rw("ppi8255_2", FUNC(i8255_device::read), FUNC(i8255_device::write)); // DSW 1, 2 & 3
map(0xf0c0, 0xf0c3).rw("ppi8255_3", FUNC(i8255_device::read), FUNC(i8255_device::write)); // DSW 4
- map(0xf100, 0xf100).w("sn1", FUNC(sn76489_device::command_w)); // SN76489 #1
+ map(0xf100, 0xf100).w("sn1", FUNC(sn76489_device::write)); // SN76489 #1
map(0xf200, 0xf203).rw("ppi8255_1", FUNC(i8255_device::read), FUNC(i8255_device::write)); // Input Ports 2 & 4
- map(0xf300, 0xf300).w("sn2", FUNC(sn76489_device::command_w)); // SN76489 #2
+ map(0xf300, 0xf300).w("sn2", FUNC(sn76489_device::write)); // SN76489 #2
map(0xf400, 0xf400).w("aysnd", FUNC(ay8910_device::address_w)); // YM2149 control
- map(0xf500, 0xf500).w("sn3", FUNC(sn76489_device::command_w)); // SN76489 #3
+ map(0xf500, 0xf500).w("sn3", FUNC(sn76489_device::write)); // SN76489 #3
map(0xf600, 0xf600).rw("aysnd", FUNC(ay8910_device::data_r), FUNC(ay8910_device::data_w)); // YM2149 (Input Port 1)
map(0xf700, 0xf701).rw(FUNC(lucky74_state::usart_8251_r), FUNC(lucky74_state::usart_8251_w)); // USART 8251 port
map(0xf800, 0xf803).rw(FUNC(lucky74_state::copro_sm7831_r), FUNC(lucky74_state::copro_sm7831_w)); // SM7831 Co-Processor
@@ -1463,13 +1463,13 @@ WRITE_LINE_MEMBER(lucky74_state::lucky74_adpcm_int)
* Machine Drivers *
*************************/
-MACHINE_CONFIG_START(lucky74_state::lucky74)
-
+void lucky74_state::lucky74(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, C_06B49P_CLKOUT_03) /* 3 MHz. */
- MCFG_DEVICE_PROGRAM_MAP(lucky74_map)
- MCFG_DEVICE_IO_MAP(lucky74_portmap)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", lucky74_state, nmi_interrupt) /* 60 Hz. measured */
+ Z80(config, m_maincpu, C_06B49P_CLKOUT_03); /* 3 MHz. */
+ m_maincpu->set_addrmap(AS_PROGRAM, &lucky74_state::lucky74_map);
+ m_maincpu->set_addrmap(AS_IO, &lucky74_state::lucky74_portmap);
+ m_maincpu->set_vblank_int("screen", FUNC(lucky74_state::nmi_interrupt)); /* 60 Hz. measured */
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
@@ -1495,13 +1495,13 @@ MACHINE_CONFIG_START(lucky74_state::lucky74)
ppi3.out_pc_callback().set(FUNC(lucky74_state::lamps_b_w));
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(64*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 64*8-1, 1*8, 30*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(lucky74_state, screen_update_lucky74)
- MCFG_SCREEN_PALETTE("palette")
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(64*8, 32*8);
+ screen.set_visarea(0*8, 64*8-1, 1*8, 30*8-1);
+ screen.set_screen_update(FUNC(lucky74_state::screen_update_lucky74));
+ screen.set_palette("palette");
GFXDECODE(config, m_gfxdecode, "palette", gfx_lucky74);
PALETTE(config, "palette", FUNC(lucky74_state::lucky74_palette), 512);
@@ -1509,14 +1509,9 @@ MACHINE_CONFIG_START(lucky74_state::lucky74)
/* sound hardware */
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("sn1", SN76489, C_06B49P_CLKOUT_03) /* 3 MHz. */
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.80)
-
- MCFG_DEVICE_ADD("sn2", SN76489, C_06B49P_CLKOUT_03) /* 3 MHz. */
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.80)
-
- MCFG_DEVICE_ADD("sn3", SN76489, C_06B49P_CLKOUT_03) /* 3 MHz. */
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.80)
+ SN76489(config, "sn1", C_06B49P_CLKOUT_03).add_route(ALL_OUTPUTS, "mono", 0.80); /* 3 MHz. */
+ SN76489(config, "sn2", C_06B49P_CLKOUT_03).add_route(ALL_OUTPUTS, "mono", 0.80); /* 3 MHz. */
+ SN76489(config, "sn3", C_06B49P_CLKOUT_03).add_route(ALL_OUTPUTS, "mono", 0.80); /* 3 MHz. */
ay8910_device &aysnd(AY8910(config, "aysnd", C_06B49P_CLKOUT_04)); /* 1.5 MHz. */
aysnd.port_a_read_callback().set_ioport("IN3");
@@ -1524,12 +1519,11 @@ MACHINE_CONFIG_START(lucky74_state::lucky74)
aysnd.port_b_write_callback().set(FUNC(lucky74_state::ym2149_portb_w));
aysnd.add_route(ALL_OUTPUTS, "mono", 0.00); /* not routed to audio hardware */
- MCFG_DEVICE_ADD("msm", MSM5205, C_06B49P_CLKOUT_06) /* 375 kHz. */
- MCFG_MSM5205_VCLK_CB(WRITELINE(*this, lucky74_state, lucky74_adpcm_int)) /* interrupt function */
- MCFG_MSM5205_PRESCALER_SELECTOR(S48_4B) /* 8KHz */
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.70)
-
-MACHINE_CONFIG_END
+ MSM5205(config, m_msm, C_06B49P_CLKOUT_06); /* 375 kHz. */
+ m_msm->vck_legacy_callback().set(FUNC(lucky74_state::lucky74_adpcm_int)); /* interrupt function */
+ m_msm->set_prescaler_selector(msm5205_device::S48_4B); /* 8KHz */
+ m_msm->add_route(ALL_OUTPUTS, "mono", 0.70);
+}
/*************************
diff --git a/src/mame/drivers/luckybal.cpp b/src/mame/drivers/luckybal.cpp
index 2f198250492..d4a0e10cd1d 100644
--- a/src/mame/drivers/luckybal.cpp
+++ b/src/mame/drivers/luckybal.cpp
@@ -565,12 +565,12 @@ INPUT_PORTS_END
* Machine Driver *
**************************************/
-MACHINE_CONFIG_START(luckybal_state::luckybal)
-
+void luckybal_state::luckybal(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z180, CPU_CLOCK / 2)
- MCFG_DEVICE_PROGRAM_MAP(main_map)
- MCFG_DEVICE_IO_MAP(main_io)
+ Z180(config, m_maincpu, CPU_CLOCK / 2);
+ m_maincpu->set_addrmap(AS_PROGRAM, &luckybal_state::main_map);
+ m_maincpu->set_addrmap(AS_IO, &luckybal_state::main_io);
I8255A(config, m_ppi);
m_ppi->out_pa_callback().set(FUNC(luckybal_state::output_port_a_w));
@@ -578,11 +578,11 @@ MACHINE_CONFIG_START(luckybal_state::luckybal)
m_ppi->in_pc_callback().set(FUNC(luckybal_state::input_port_c_r));
m_ppi->out_pc_callback().set(FUNC(luckybal_state::output_port_c_w));
- MCFG_DEVICE_ADD("latch1", CD4099, 0)
+ CD4099(config, "latch1", 0);
- MCFG_DEVICE_ADD("latch2", CD4099, 0)
+ CD4099(config, "latch2", 0);
- MCFG_DEVICE_ADD("latch3", CD4099, 0)
+ CD4099(config, "latch3", 0);
/* nvram */
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
@@ -596,11 +596,11 @@ MACHINE_CONFIG_START(luckybal_state::luckybal)
/* sound hardware */
SPEAKER(config, "speaker").front_center();
- MCFG_DEVICE_ADD("dac", DAC08, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 0.5)
- MCFG_DEVICE_ADD("vref", VOLTAGE_REGULATOR, 0) MCFG_VOLTAGE_REGULATOR_OUTPUT(5.0)
- MCFG_SOUND_ROUTE(0, "dac", 1.0, DAC_VREF_POS_INPUT) MCFG_SOUND_ROUTE(0, "dac", -1.0, DAC_VREF_NEG_INPUT)
-
-MACHINE_CONFIG_END
+ DAC08(config, "dac", 0).add_route(ALL_OUTPUTS, "speaker", 0.5);
+ voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref"));
+ vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT);
+ vref.add_route(0, "dac", -1.0, DAC_VREF_NEG_INPUT);
+}
/**************************************
diff --git a/src/mame/drivers/lvcards.cpp b/src/mame/drivers/lvcards.cpp
index cbc54fd9b48..ba00c75d0f3 100644
--- a/src/mame/drivers/lvcards.cpp
+++ b/src/mame/drivers/lvcards.cpp
@@ -459,21 +459,22 @@ GFXDECODE_END
/* Sound Interfaces */
-MACHINE_CONFIG_START(lvcards_state::lvcards)
+void lvcards_state::lvcards(machine_config &config)
+{
// basic machine hardware
- MCFG_DEVICE_ADD("maincpu",Z80, 18432000/4) // unknown frequency, assume same as tehkanwc.cpp
- MCFG_DEVICE_PROGRAM_MAP(lvcards_map)
- MCFG_DEVICE_IO_MAP(lvcards_io_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", lvcards_state, irq0_line_hold)
+ Z80(config, m_maincpu, 18432000/4); // unknown frequency, assume same as tehkanwc.cpp
+ m_maincpu->set_addrmap(AS_PROGRAM, &lvcards_state::lvcards_map);
+ m_maincpu->set_addrmap(AS_IO, &lvcards_state::lvcards_io_map);
+ m_maincpu->set_vblank_int("screen", FUNC(lvcards_state::irq0_line_hold));
// video hardware
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */)
- MCFG_SCREEN_SIZE(32*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(8*0, 32*8-1, 2*8, 30*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(lvcards_state, screen_update_lvcards)
- MCFG_SCREEN_PALETTE("palette")
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500) /* not accurate */);
+ screen.set_size(32*8, 32*8);
+ screen.set_visarea(8*0, 32*8-1, 2*8, 30*8-1);
+ screen.set_screen_update(FUNC(lvcards_state::screen_update_lvcards));
+ screen.set_palette("palette");
GFXDECODE(config, m_gfxdecode, "palette", gfx_lvcards);
PALETTE(config, "palette", FUNC(lvcards_state::lvcards_palette), 256);
@@ -485,28 +486,28 @@ MACHINE_CONFIG_START(lvcards_state::lvcards)
aysnd.port_a_read_callback().set_ioport("DSW0");
aysnd.port_b_read_callback().set_ioport("DSW1");
aysnd.add_route(ALL_OUTPUTS, "mono", 0.25);
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(lvpoker_state::lvpoker)
+void lvpoker_state::lvpoker(machine_config &config)
+{
lvcards(config);
// basic machine hardware
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_1);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(lvpoker_map)
-MACHINE_CONFIG_END
+ m_maincpu->set_addrmap(AS_PROGRAM, &lvpoker_state::lvpoker_map);
+}
-MACHINE_CONFIG_START(lvpoker_state::ponttehk)
+void lvpoker_state::ponttehk(machine_config &config)
+{
lvcards(config);
// basic machine hardware
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_1);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(ponttehk_map)
+ m_maincpu->set_addrmap(AS_PROGRAM, &lvpoker_state::ponttehk_map);
// video hardware
PALETTE(config.replace(), "palette", palette_device::RGB_444_PROMS, "proms", 256);
-MACHINE_CONFIG_END
+}
ROM_START( lvpoker )
ROM_REGION( 0x10000, "maincpu", 0 )
diff --git a/src/mame/drivers/lviv.cpp b/src/mame/drivers/lviv.cpp
index 3af2fe67ae6..251f3e03dda 100644
--- a/src/mame/drivers/lviv.cpp
+++ b/src/mame/drivers/lviv.cpp
@@ -10,13 +10,13 @@ Dr. Volodimir Mosorov for two Lviv machines.
What's new:
-----------
-28.02.2003 Snapshot veryfing function added.
+28.02.2003 Snapshot verifying function added.
07.01.2003 Support for .SAV snapshots. Joystick support (there are strange
problems with "Doroga (1991)(-)(Ru).lvt".
21.12.2002 Cassette support rewritten, WAVs saving and loading are working now.
08.12.2002 Comments on emulation status updated. Changed 'lvive' to 'lvivp'.
ADC r instruction in I8080 core fixed (Arkanoid works now).
- Orginal keyboard layout added.
+ Original keyboard layout added.
20.07.2002 "Reset" key fixed. I8080 core fixed (all BASIC commands works).
now). Unsupported .lvt files versions aren't now loaded.
xx.07.2002 Improved port and memory mapping (Raphael Nabet).
@@ -34,7 +34,7 @@ Notes on emulation status and to do list:
-----------------------------------------
1. LIMITATION: Printer is not emulated.
2. LIMITATION: Timings are not implemented, due to it emulated machine runs
- twice fast as orginal.
+ twice fast as original.
3. LIMITATION: .RSS files are not supported.
4. LIMITATION: Some usage notes and trivia are needed in sysinfo.dat.
@@ -96,11 +96,11 @@ Ports:
D0-D3 8255 PPI
Port A:
- keyboard scaning
+ keyboard scanning
Port B:
keyboard reading
Port C:
- keyboard scaning/reading
+ keyboard scanning/reading
Keyboard:
---------
@@ -161,7 +161,7 @@ Keyboard:
Video:
-----
Screen resolution is 256x256 pixels. 4 colors at once are possible,
- but there is a posiibility of palette change. Bits 0..6 of port 0xc1
+ but there is a possibility of palette change. Bits 0..6 of port 0xc1
are used for palette setting.
One byte of video-RAM sets 4 pixels. Colors of pixels are corrected
@@ -423,10 +423,10 @@ INPUT_PORTS_END
/* machine definition */
MACHINE_CONFIG_START(lviv_state::lviv)
/* basic machine hardware */
- MCFG_DEVICE_ADD(m_maincpu, I8080, 2500000)
- MCFG_DEVICE_PROGRAM_MAP(mem_map)
- MCFG_DEVICE_IO_MAP(io_map)
- MCFG_QUANTUM_TIME(attotime::from_hz(60))
+ I8080(config, m_maincpu, 2500000);
+ m_maincpu->set_addrmap(AS_PROGRAM, &lviv_state::mem_map);
+ m_maincpu->set_addrmap(AS_IO, &lviv_state::io_map);
+ config.m_minimum_quantum = attotime::from_hz(60);
I8255(config, m_ppi[0]);
m_ppi[0]->in_pa_callback().set(FUNC(lviv_state::ppi_0_porta_r));
@@ -444,32 +444,31 @@ MACHINE_CONFIG_START(lviv_state::lviv)
m_ppi[1]->in_pc_callback().set(FUNC(lviv_state::ppi_1_portc_r));
m_ppi[1]->out_pc_callback().set(FUNC(lviv_state::ppi_1_portc_w));
- MCFG_SCREEN_ADD(m_screen, RASTER)
- MCFG_SCREEN_REFRESH_RATE(50)
- MCFG_SCREEN_VBLANK_TIME(0)
-
/* video hardware */
- MCFG_SCREEN_SIZE(256, 256)
- MCFG_SCREEN_VISIBLE_AREA(0, 256-1, 0, 256-1)
- MCFG_SCREEN_UPDATE_DRIVER(lviv_state, screen_update)
- MCFG_SCREEN_PALETTE(m_palette)
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_refresh_hz(50);
+ m_screen->set_vblank_time(0);
+ m_screen->set_size(256, 256);
+ m_screen->set_visarea(0, 256-1, 0, 256-1);
+ m_screen->set_screen_update(FUNC(lviv_state::screen_update));
+ m_screen->set_palette(m_palette);
PALETTE(config, m_palette, FUNC(lviv_state::lviv_palette), ARRAY_LENGTH(s_palette));
/* sound hardware */
SPEAKER(config, "mono").front_center();
- WAVE(config, "wave", "cassette").add_route(ALL_OUTPUTS, "mono", 0.25);
+ WAVE(config, "wave", m_cassette).add_route(ALL_OUTPUTS, "mono", 0.25);
SPEAKER_SOUND(config, "speaker").add_route(ALL_OUTPUTS, "mono", 0.50);
/* snapshot */
- MCFG_SNAPSHOT_ADD("snapshot", lviv_state, lviv, "sav", 0)
+ MCFG_SNAPSHOT_ADD("snapshot", lviv_state, lviv, "sav")
- MCFG_CASSETTE_ADD( "cassette" )
- MCFG_CASSETTE_FORMATS(lviv_lvt_format)
- MCFG_CASSETTE_DEFAULT_STATE(CASSETTE_STOPPED | CASSETTE_SPEAKER_ENABLED)
- MCFG_CASSETTE_INTERFACE("lviv_cass")
+ CASSETTE(config, m_cassette);
+ m_cassette->set_formats(lviv_lvt_format);
+ m_cassette->set_default_state(CASSETTE_STOPPED | CASSETTE_SPEAKER_ENABLED);
+ m_cassette->set_interface("lviv_cass");
- MCFG_SOFTWARE_LIST_ADD("cass_list","lviv")
+ SOFTWARE_LIST(config, "cass_list").set_original("lviv");
/* internal ram */
RAM(config, RAM_TAG).set_default_size("64K");
diff --git a/src/mame/drivers/lwings.cpp b/src/mame/drivers/lwings.cpp
index 251394647bb..f96736b6c7e 100644
--- a/src/mame/drivers/lwings.cpp
+++ b/src/mame/drivers/lwings.cpp
@@ -931,33 +931,33 @@ void lwings_state::machine_reset()
m_adpcm = 0;
}
-MACHINE_CONFIG_START(lwings_state::lwings)
-
+void lwings_state::lwings(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, XTAL(12'000'000)/2) /* verified on PCB */
- MCFG_DEVICE_PROGRAM_MAP(lwings_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", lwings_state, lwings_interrupt)
+ Z80(config, m_maincpu, XTAL(12'000'000)/2); /* verified on PCB */
+ m_maincpu->set_addrmap(AS_PROGRAM, &lwings_state::lwings_map);
+ m_maincpu->set_vblank_int("screen", FUNC(lwings_state::lwings_interrupt));
- MCFG_DEVICE_ADD("soundcpu", Z80, XTAL(12'000'000)/4) /* verified on PCB */
- MCFG_DEVICE_PROGRAM_MAP(lwings_sound_map)
- MCFG_DEVICE_PERIODIC_INT_DRIVER(lwings_state, irq0_line_hold, 222) // approximation from pcb music recording - where is the frequency actually derived from??
+ Z80(config, m_soundcpu, XTAL(12'000'000)/4); /* verified on PCB */
+ m_soundcpu->set_addrmap(AS_PROGRAM, &lwings_state::lwings_sound_map);
+ m_soundcpu->set_periodic_int(FUNC(lwings_state::irq0_line_hold), attotime::from_hz(222));
+ // above frequency is an approximation from PCB music recording - where is the frequency actually derived from?
WATCHDOG_TIMER(config, "watchdog");
/* video hardware */
- MCFG_DEVICE_ADD("spriteram", BUFFERED_SPRITERAM8)
-
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(32*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 1*8, 31*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(lwings_state, screen_update_lwings)
- MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE("spriteram", buffered_spriteram8_device, vblank_copy_rising))
- MCFG_SCREEN_PALETTE(m_palette)
-
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_lwings)
-
+ BUFFERED_SPRITERAM8(config, m_spriteram);
+
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(32*8, 32*8);
+ screen.set_visarea(0*8, 32*8-1, 1*8, 31*8-1);
+ screen.set_screen_update(FUNC(lwings_state::screen_update_lwings));
+ screen.screen_vblank().set(m_spriteram, FUNC(buffered_spriteram8_device::vblank_copy_rising));
+ screen.set_palette(m_palette);
+
+ GFXDECODE(config, m_gfxdecode, m_palette, gfx_lwings);
PALETTE(config, m_palette).set_format(palette_device::RGBx_444, 1024);
/* sound hardware */
@@ -965,48 +965,45 @@ MACHINE_CONFIG_START(lwings_state::lwings)
GENERIC_LATCH_8(config, m_soundlatch);
- MCFG_DEVICE_ADD("2203a", YM2203, XTAL(12'000'000)/8) /* verified on PCB */
- MCFG_SOUND_ROUTE(0, "mono", 0.20)
- MCFG_SOUND_ROUTE(1, "mono", 0.20)
- MCFG_SOUND_ROUTE(2, "mono", 0.20)
- MCFG_SOUND_ROUTE(3, "mono", 0.10)
-
- MCFG_DEVICE_ADD("2203b", YM2203, XTAL(12'000'000)/8) /* verified on PCB */
- MCFG_SOUND_ROUTE(0, "mono", 0.20)
- MCFG_SOUND_ROUTE(1, "mono", 0.20)
- MCFG_SOUND_ROUTE(2, "mono", 0.20)
- MCFG_SOUND_ROUTE(3, "mono", 0.10)
-MACHINE_CONFIG_END
-
-
-
-MACHINE_CONFIG_START(lwings_state::fball)
+ ym2203_device &ym2203a(YM2203(config, "2203a", XTAL(12'000'000)/8)); /* verified on PCB */
+ ym2203a.add_route(0, "mono", 0.20);
+ ym2203a.add_route(1, "mono", 0.20);
+ ym2203a.add_route(2, "mono", 0.20);
+ ym2203a.add_route(3, "mono", 0.10);
+
+ ym2203_device &ym2203b(YM2203(config, "2203b", XTAL(12'000'000)/8)); /* verified on PCB */
+ ym2203b.add_route(0, "mono", 0.20);
+ ym2203b.add_route(1, "mono", 0.20);
+ ym2203b.add_route(2, "mono", 0.20);
+ ym2203b.add_route(3, "mono", 0.10);
+}
+void lwings_state::fball(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, XTAL(12'000'000)/2)
- MCFG_DEVICE_PROGRAM_MAP(fball_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", lwings_state, avengers_interrupt)
+ Z80(config, m_maincpu, XTAL(12'000'000)/2);
+ m_maincpu->set_addrmap(AS_PROGRAM, &lwings_state::fball_map);
+ m_maincpu->set_vblank_int("screen", FUNC(lwings_state::avengers_interrupt));
- MCFG_DEVICE_ADD("soundcpu", Z80, XTAL(12'000'000)/4) // ?
- MCFG_DEVICE_PROGRAM_MAP(fball_sound_map)
-// MCFG_DEVICE_PERIODIC_INT_DRIVER(lwings_state, irq0_line_hold, 222)
+ Z80(config, m_soundcpu, XTAL(12'000'000)/4); // ?
+ m_soundcpu->set_addrmap(AS_PROGRAM, &lwings_state::fball_sound_map);
+// m_soundcpu->set_periodic_int(FUNC(lwings_state::irq0_line_hold), attotime::from_hz(222));
WATCHDOG_TIMER(config, "watchdog");
/* video hardware */
- MCFG_DEVICE_ADD("spriteram", BUFFERED_SPRITERAM8)
-
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(32*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 1*8, 31*8-1) // the 16-pixel black border on left edge is correct, test mode actually uses that area
- MCFG_SCREEN_UPDATE_DRIVER(lwings_state, screen_update_lwings)
- MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE("spriteram", buffered_spriteram8_device, vblank_copy_rising))
- MCFG_SCREEN_PALETTE(m_palette)
-
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_lwings)
-
+ BUFFERED_SPRITERAM8(config, m_spriteram);
+
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(32*8, 32*8);
+ screen.set_visarea(0*8, 32*8-1, 1*8, 31*8-1); // the 16-pixel black border on left edge is correct, test mode actually uses that area
+ screen.set_screen_update(FUNC(lwings_state::screen_update_lwings));
+ screen.screen_vblank().set(m_spriteram, FUNC(buffered_spriteram8_device::vblank_copy_rising));
+ screen.set_palette(m_palette);
+
+ GFXDECODE(config, m_gfxdecode, m_palette, gfx_lwings);
PALETTE(config, m_palette).set_format(palette_device::RGBx_444, 1024);
/* sound hardware */
@@ -1014,65 +1011,60 @@ MACHINE_CONFIG_START(lwings_state::fball)
GENERIC_LATCH_8(config, m_soundlatch);
- MCFG_DEVICE_ADD("oki", OKIM6295, XTAL(12'000'000)/12, okim6295_device::PIN7_HIGH) // clock frequency & pin 7 not verified
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
- MCFG_DEVICE_ADDRESS_MAP(0, fball_oki_map)
-
-MACHINE_CONFIG_END
-
+ okim6295_device &oki(OKIM6295(config, "oki", XTAL(12'000'000)/12, okim6295_device::PIN7_HIGH)); // clock frequency & pin 7 not verified
+ oki.add_route(ALL_OUTPUTS, "mono", 1.0);
+ oki.set_addrmap(0, &lwings_state::fball_oki_map);
+}
-MACHINE_CONFIG_START(lwings_state::trojan)
+void lwings_state::trojan(machine_config &config)
+{
lwings(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_CLOCK(XTAL(12'000'000)/4) /* verified on PCB */
- MCFG_DEVICE_PROGRAM_MAP(trojan_map)
+ m_maincpu->set_clock(XTAL(12'000'000)/4); /* verified on PCB */
+ m_maincpu->set_addrmap(AS_PROGRAM, &lwings_state::trojan_map);
- MCFG_DEVICE_MODIFY("soundcpu")
- MCFG_DEVICE_CLOCK(XTAL(12'000'000)/4) /* verified on PCB */
+ m_soundcpu->set_clock(XTAL(12'000'000)/4); /* verified on PCB */
- MCFG_DEVICE_ADD("adpcm", Z80, XTAL(12'000'000)/4) /* verified on PCB */
- MCFG_DEVICE_PROGRAM_MAP(trojan_adpcm_map)
- MCFG_DEVICE_IO_MAP(trojan_adpcm_io_map)
- MCFG_DEVICE_PERIODIC_INT_DRIVER(lwings_state, irq0_line_hold, 4000)
+ z80_device &adpcm(Z80(config, "adpcm", XTAL(12'000'000)/4)); /* verified on PCB */
+ adpcm.set_addrmap(AS_PROGRAM, &lwings_state::trojan_adpcm_map);
+ adpcm.set_addrmap(AS_IO, &lwings_state::trojan_adpcm_io_map);
+ adpcm.set_periodic_int(FUNC(lwings_state::irq0_line_hold), attotime::from_hz(4000));
/* video hardware */
- MCFG_GFXDECODE_MODIFY("gfxdecode", gfx_trojan)
+ m_gfxdecode->set_info(gfx_trojan);
MCFG_VIDEO_START_OVERRIDE(lwings_state,trojan)
- MCFG_SCREEN_MODIFY("screen")
- MCFG_SCREEN_UPDATE_DRIVER(lwings_state, screen_update_trojan)
+ subdevice<screen_device>("screen")->set_screen_update(FUNC(lwings_state::screen_update_trojan));
/* sound hardware */
-
GENERIC_LATCH_8(config, "soundlatch2");
- MCFG_DEVICE_ADD("5205", MSM5205, XTAL(384'000)) /* verified on PCB */
- MCFG_MSM5205_PRESCALER_SELECTOR(SEX_4B) /* slave mode */
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.50)
-MACHINE_CONFIG_END
+ MSM5205(config, m_msm, XTAL(384'000)); /* verified on PCB */
+ m_msm->set_prescaler_selector(msm5205_device::SEX_4B); /* slave mode */
+ m_msm->add_route(ALL_OUTPUTS, "mono", 0.50);
+}
-MACHINE_CONFIG_START(lwings_state::avengers)
+void lwings_state::avengers(machine_config &config)
+{
trojan(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(avengers_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", lwings_state, avengers_interrupt) // RST 38h triggered by software
+ m_maincpu->set_addrmap(AS_PROGRAM, &lwings_state::avengers_map);
+ m_maincpu->set_vblank_int("screen", FUNC(lwings_state::avengers_interrupt)); // RST 38h triggered by software
- MCFG_DEVICE_MODIFY("adpcm")
- MCFG_DEVICE_IO_MAP(avengers_adpcm_io_map)
+ subdevice<cpu_device>("adpcm")->set_addrmap(AS_IO, &lwings_state::avengers_adpcm_io_map);
/* video hardware */
MCFG_VIDEO_START_OVERRIDE(lwings_state,avengers)
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(lwings_state::avengersb)
+void lwings_state::avengersb(machine_config &config)
+{
avengers(config);
/* video hardware */
MCFG_VIDEO_START_OVERRIDE(lwings_state,avengersb)
-MACHINE_CONFIG_END
+}
/*************************************
diff --git a/src/mame/drivers/lynx.cpp b/src/mame/drivers/lynx.cpp
index 0bce8a5dd10..89c207682bf 100644
--- a/src/mame/drivers/lynx.cpp
+++ b/src/mame/drivers/lynx.cpp
@@ -76,23 +76,23 @@ void lynx_state::sound_cb()
MACHINE_CONFIG_START(lynx_state::lynx)
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M65SC02, 4000000) /* vti core, integrated in vlsi, stz, but not bbr bbs */
- MCFG_DEVICE_PROGRAM_MAP(lynx_mem)
- MCFG_QUANTUM_TIME(attotime::from_hz(60))
+ M65SC02(config, m_maincpu, 4000000); /* vti core, integrated in vlsi, stz, but not bbr bbs */
+ m_maincpu->set_addrmap(AS_PROGRAM, &lynx_state::lynx_mem);
+ config.m_minimum_quantum = attotime::from_hz(60);
ADDRESS_MAP_BANK(config, "bank_fc00").set_map(&lynx_state::lynx_fc00_mem).set_options(ENDIANNESS_LITTLE, 8, 9, 0x100);
ADDRESS_MAP_BANK(config, "bank_fd00").set_map(&lynx_state::lynx_fd00_mem).set_options(ENDIANNESS_LITTLE, 8, 9, 0x100);
/* video hardware */
- MCFG_SCREEN_ADD("screen", LCD)
- MCFG_SCREEN_REFRESH_RATE(30)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */
- MCFG_SCREEN_UPDATE_DRIVER(lynx_state, screen_update)
- MCFG_SCREEN_SIZE(160, 102)
- MCFG_SCREEN_VISIBLE_AREA(0, 160-1, 0, 102-1)
+ SCREEN(config, m_screen, SCREEN_TYPE_LCD);
+ m_screen->set_refresh_hz(30);
+ m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */
+ m_screen->set_screen_update(FUNC(lynx_state::screen_update));
+ m_screen->set_size(160, 102);
+ m_screen->set_visarea(0, 160-1, 0, 102-1);
config.set_default_layout(layout_lynx);
- MCFG_PALETTE_ADD("palette", 0x10)
+ PALETTE(config, m_palette).set_entries(0x10);
/* sound hardware */
SPEAKER(config, "mono").front_center();
@@ -101,7 +101,7 @@ MACHINE_CONFIG_START(lynx_state::lynx)
m_sound->add_route(ALL_OUTPUTS, "mono", 0.50);
/* devices */
- MCFG_QUICKLOAD_ADD("quickload", lynx_state, lynx, "o", 0)
+ MCFG_QUICKLOAD_ADD("quickload", lynx_state, lynx, "o");
MCFG_GENERIC_CARTSLOT_ADD("cartslot", generic_plain_slot, "lynx_cart")
MCFG_GENERIC_EXTENSIONS("lnx,lyx")
@@ -109,7 +109,7 @@ MACHINE_CONFIG_START(lynx_state::lynx)
MCFG_GENERIC_LOAD(lynx_state, lynx_cart)
/* Software lists */
- MCFG_SOFTWARE_LIST_ADD("cart_list","lynx")
+ SOFTWARE_LIST(config, "cart_list").set_original("lynx");
MACHINE_CONFIG_END
#if 0
diff --git a/src/mame/drivers/m20.cpp b/src/mame/drivers/m20.cpp
index a1d07ace980..28d5b810d6f 100644
--- a/src/mame/drivers/m20.cpp
+++ b/src/mame/drivers/m20.cpp
@@ -790,30 +790,31 @@ static void keyboard(device_slot_interface &device)
device.option_add("m20", M20_KEYBOARD);
}
-MACHINE_CONFIG_START(m20_state::m20)
+void m20_state::m20(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z8001, MAIN_CLOCK)
- MCFG_DEVICE_PROGRAM_MAP(m20_program_mem)
- MCFG_DEVICE_DATA_MAP(m20_data_mem)
- MCFG_DEVICE_IO_MAP(m20_io)
- MCFG_DEVICE_IRQ_ACKNOWLEDGE_DRIVER(m20_state,m20_irq_callback)
+ Z8001(config, m_maincpu, MAIN_CLOCK);
+ m_maincpu->set_addrmap(AS_PROGRAM, &m20_state::m20_program_mem);
+ m_maincpu->set_addrmap(AS_DATA, &m20_state::m20_data_mem);
+ m_maincpu->set_addrmap(AS_IO, &m20_state::m20_io);
+ m_maincpu->set_irq_acknowledge_callback(FUNC(m20_state::m20_irq_callback));
RAM(config, RAM_TAG).set_default_size("160K").set_default_value(0).set_extra_options("128K,192K,224K,256K,384K,512K");
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */
- MCFG_SCREEN_SIZE(512, 256)
- MCFG_SCREEN_VISIBLE_AREA(0, 512-1, 0, 256-1)
- MCFG_SCREEN_UPDATE_DEVICE("crtc", mc6845_device, screen_update)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */
+ screen.set_size(512, 256);
+ screen.set_visarea(0, 512-1, 0, 256-1);
+ screen.set_screen_update("crtc", FUNC(mc6845_device::screen_update));
PALETTE(config, m_palette, palette_device::MONOCHROME);
/* Devices */
FD1797(config, m_fd1797, 1000000);
m_fd1797->intrq_wr_callback().set(m_i8259, FUNC(pic8259_device::ir0_w));
- MCFG_FLOPPY_DRIVE_ADD("fd1797:0", m20_floppies, "5dd", m20_state::floppy_formats)
- MCFG_FLOPPY_DRIVE_ADD("fd1797:1", m20_floppies, "5dd", m20_state::floppy_formats)
+ FLOPPY_CONNECTOR(config, "fd1797:0", m20_floppies, "5dd", m20_state::floppy_formats);
+ FLOPPY_CONNECTOR(config, "fd1797:1", m20_floppies, "5dd", m20_state::floppy_formats);
mc6845_device &crtc(MC6845(config, "crtc", PIXEL_CLOCK/8)); /* hand tuned to get ~50 fps */
crtc.set_screen("screen");
@@ -849,10 +850,10 @@ MACHINE_CONFIG_START(m20_state::m20)
rs232_port_device &rs232(RS232_PORT(config, "rs232", default_rs232_devices, nullptr));
rs232.rxd_handler().set(m_ttyi8251, FUNC(i8251_device::write_rxd));
- MCFG_DEVICE_ADD("apb", M20_8086, "maincpu", m_i8259, RAM_TAG)
+ M20_8086(config, m_apb, m_maincpu, m_i8259, RAM_TAG);
- MCFG_SOFTWARE_LIST_ADD("flop_list","m20")
-MACHINE_CONFIG_END
+ SOFTWARE_LIST(config, "flop_list").set_original("m20");
+}
ROM_START(m20)
ROM_REGION(0x2000,"maincpu", 0)
diff --git a/src/mame/drivers/m24.cpp b/src/mame/drivers/m24.cpp
index a52b11959e0..d03e3dadd31 100644
--- a/src/mame/drivers/m24.cpp
+++ b/src/mame/drivers/m24.cpp
@@ -15,13 +15,21 @@
#include "emu.h"
+#include "bus/isa/isa.h"
+#include "bus/isa/isa_cards.h"
#include "cpu/i86/i86.h"
#include "cpu/tms7000/tms7000.h"
#include "imagedev/floppy.h"
+#include "machine/am9517a.h"
+#include "machine/i8087.h"
#include "machine/m24_kbd.h"
#include "machine/m24_z8000.h"
#include "machine/mm58274c.h"
-#include "machine/genpc.h"
+#include "machine/pit8253.h"
+#include "machine/pic8259.h"
+#include "machine/ram.h"
+#include "sound/spkrdev.h"
+#include "speaker.h"
#include "formats/pc_dsk.h"
#include "formats/naslite_dsk.h"
@@ -35,35 +43,83 @@ public:
m24_state(const machine_config &mconfig, device_type type, const char *tag) :
driver_device(mconfig, type, tag),
m_maincpu(*this, "maincpu"),
- m_mb(*this, "mb"),
+ m_ram(*this, RAM_TAG),
+ m_isabus(*this, "isabus"),
+ m_dmac(*this, "dmac"),
+ m_pic(*this, "pic"),
+ m_pit(*this, "pit"),
+ m_speaker(*this, "speaker"),
m_kbc(*this, "kbc"),
m_keyboard(*this, "keyboard"),
- m_z8000_apb(*this, "z8000_apb")
+ m_z8000_apb(*this, "z8000_apb"),
+ m_dsw0(*this, "DSW0")
{ }
void olivetti(machine_config &config);
protected:
- void machine_reset() override;
+ virtual void machine_start() override;
+ virtual void machine_reset() override;
private:
- required_device<cpu_device> m_maincpu;
- required_device<pc_noppi_mb_device> m_mb;
+ void dma_segment_w(offs_t offset, u8 data);
+ DECLARE_WRITE_LINE_MEMBER(dma_hrq_w);
+ u8 dma_memory_read(offs_t offset);
+ void dma_memory_write(offs_t offset, u8 data);
+ template <int Channel> u8 dma_io_read(offs_t offset);
+ template <int Channel> void dma_io_write(offs_t offset, u8 data);
+ template <int Channel> DECLARE_WRITE_LINE_MEMBER(dma_dack_w);
+ DECLARE_WRITE_LINE_MEMBER(dma_tc_w);
+ DECLARE_WRITE_LINE_MEMBER(dreq0_ck_w);
+ DECLARE_WRITE_LINE_MEMBER(speaker_ck_w);
+ void update_speaker();
+
+ u8 keyboard_data_r();
+ u8 keyboard_status_r();
+ void keyboard_data_w(u8 data);
+
+ void ctrlport_a_w(u8 data);
+ u8 ctrlport_a_r();
+ u8 ctrlport_b_r();
+
+ void alt_w(u8 data);
+ DECLARE_WRITE_LINE_MEMBER(chck_w);
+ DECLARE_WRITE_LINE_MEMBER(int87_w);
+ void nmi_enable_w(u8 data);
+ void update_nmi();
+
+ required_device<i8086_cpu_device> m_maincpu;
+ required_device<ram_device> m_ram;
+ required_device<isa8_device> m_isabus;
+ required_device<am9517a_device> m_dmac;
+ required_device<pic8259_device> m_pic;
+ required_device<pit8253_device> m_pit;
+ required_device<speaker_sound_device> m_speaker;
required_device<tms7000_device> m_kbc;
required_device<m24_keyboard_device> m_keyboard;
optional_device<m24_z8000_device> m_z8000_apb;
+ required_ioport m_dsw0;
+
+ u8 m_dma_segment[4];
+ u8 m_dma_active;
+ bool m_tc;
+ bool m_dreq0_ck;
+
+ u8 m_ctrlport_a;
+ u8 m_ctrlport_b;
+
+ bool m_87int;
+ bool m_chck_active;
+ bool m_nmi_enable;
- uint8_t m_sysctl, m_pa, m_kbcin, m_kbcout;
+ u8 m_pa, m_kbcin, m_kbcout;
bool m_kbcibf, m_kbdata, m_i86_halt, m_i86_halt_perm;
- DECLARE_READ8_MEMBER(keyboard_r);
- DECLARE_WRITE8_MEMBER(keyboard_w);
DECLARE_READ8_MEMBER(pa_r);
DECLARE_WRITE8_MEMBER(pb_w);
DECLARE_READ8_MEMBER(kbcdata_r);
DECLARE_WRITE8_MEMBER(kbcdata_w);
DECLARE_WRITE_LINE_MEMBER(kbcin_w);
- DECLARE_WRITE_LINE_MEMBER(dma_hrq_w);
DECLARE_WRITE_LINE_MEMBER(int_w);
DECLARE_WRITE_LINE_MEMBER(halt_i86_w);
DECLARE_FLOPPY_FORMATS( floppy_formats );
@@ -74,9 +130,44 @@ private:
void m24_map(address_map &map);
};
+void m24_state::machine_start()
+{
+ m_maincpu->space(AS_PROGRAM).install_ram(0, m_ram->size() - 1, m_ram->pointer());
+
+ std::fill_n(&m_dma_segment[0], 4, 0);
+ m_dma_active = 0;
+ m_tc = false;
+ m_dreq0_ck = true;
+
+ m_ctrlport_a = 0;
+ m_ctrlport_b = 0;
+
+ m_87int = false;
+ m_chck_active = false;
+ m_nmi_enable = false;
+
+ save_item(NAME(m_dma_segment));
+ save_item(NAME(m_dma_active));
+ save_item(NAME(m_tc));
+ save_item(NAME(m_dreq0_ck));
+ save_item(NAME(m_ctrlport_a));
+ save_item(NAME(m_ctrlport_b));
+ save_item(NAME(m_87int));
+ save_item(NAME(m_chck_active));
+ save_item(NAME(m_nmi_enable));
+ save_item(NAME(m_pa));
+ save_item(NAME(m_kbcin));
+ save_item(NAME(m_kbcout));
+ save_item(NAME(m_kbcibf));
+ save_item(NAME(m_kbdata));
+ save_item(NAME(m_i86_halt));
+ save_item(NAME(m_i86_halt_perm));
+}
+
void m24_state::machine_reset()
{
- m_sysctl = 0;
+ ctrlport_a_w(0);
+ nmi_enable_w(0);
m_pa = 0x40;
m_kbcibf = false;
m_kbdata = true;
@@ -86,49 +177,218 @@ void m24_state::machine_reset()
m_z8000_apb->halt_w(ASSERT_LINE);
}
-READ8_MEMBER(m24_state::keyboard_r)
+void m24_state::dma_segment_w(offs_t offset, u8 data)
+{
+ m_dma_segment[offset] = data & 0x0f;
+}
+
+WRITE_LINE_MEMBER(m24_state::dma_hrq_w)
+{
+ if(!m_i86_halt)
+ m_maincpu->set_input_line(INPUT_LINE_HALT, state ? ASSERT_LINE : CLEAR_LINE);
+ if(m_z8000_apb && !m_z8000_apb->halted())
+ m_z8000_apb->halt_w(state ? ASSERT_LINE : CLEAR_LINE);
+
+ /* Assert HLDA */
+ m_dmac->hack_w(state);
+}
+
+u8 m24_state::dma_memory_read(offs_t offset)
{
- switch(offset)
+ const int seg = (BIT(m_dma_active, 2) ? 0 : 2) | (BIT(m_dma_active, 3) ? 0 : 1);
+ return m_maincpu->space(AS_PROGRAM).read_byte(offset | u32(m_dma_segment[seg]) << 16);
+}
+
+void m24_state::dma_memory_write(offs_t offset, u8 data)
+{
+ const int seg = (BIT(m_dma_active, 2) ? 0 : 2) | (BIT(m_dma_active, 3) ? 0 : 1);
+ m_maincpu->space(AS_PROGRAM).write_byte(offset | u32(m_dma_segment[seg]) << 16, data);
+}
+
+template <int Channel>
+u8 m24_state::dma_io_read(offs_t offset)
+{
+ return m_isabus->dack_r(Channel);
+}
+
+template <int Channel>
+void m24_state::dma_io_write(offs_t offset, u8 data)
+{
+ m_isabus->dack_w(Channel, data);
+}
+
+template <int Channel>
+WRITE_LINE_MEMBER(m24_state::dma_dack_w)
+{
+ m_isabus->dack_line_w(Channel, state);
+
+ if (!state)
+ {
+ m_dma_active |= 1 << Channel;
+ if (Channel == 0)
+ m_dmac->dreq0_w(0);
+ if (m_tc)
+ m_isabus->eop_w(Channel, ASSERT_LINE);
+ }
+ else
{
- case 0:
- m_pa |= 0x40;
- m_mb->m_pic8259->ir1_w(0);
- return m_kbcout;
- case 1:
- return m_sysctl;
- case 2:
- return 0;
- case 4:
- return (m_kbcibf ? 2 : 0) | ((m_pa & 0x40) ? 0 : 1);
+ m_dma_active &= ~(1 << Channel);
+ if (m_tc)
+ m_isabus->eop_w(Channel, CLEAR_LINE);
}
- return 0xff;
}
-WRITE8_MEMBER(m24_state::keyboard_w)
+WRITE_LINE_MEMBER(m24_state::dma_tc_w)
+{
+ m_tc = (state == ASSERT_LINE);
+ for (int channel = 0; channel < 4; channel++)
+ if (BIT(m_dma_active, channel))
+ m_isabus->eop_w(channel, state);
+}
+
+WRITE_LINE_MEMBER(m24_state::dreq0_ck_w)
{
- switch(offset)
+ if (state && !m_dreq0_ck && !BIT(m_dma_active, 0))
+ m_dmac->dreq0_w(1);
+
+ m_dreq0_ck = state;
+}
+
+WRITE_LINE_MEMBER(m24_state::speaker_ck_w)
+{
+ if (state)
+ m_ctrlport_b |= 0x20;
+ else
+ m_ctrlport_b &= 0xdf;
+
+ update_speaker();
+}
+
+void m24_state::update_speaker()
+{
+ if (BIT(m_ctrlport_a, 1) && BIT(m_ctrlport_b, 5))
+ {
+ m_speaker->level_w(1);
+ m_ctrlport_b &= 0xef;
+ }
+ else
{
- case 0:
- m_kbc->set_input_line(TMS7000_INT1_LINE, ASSERT_LINE);
- m_kbcibf = true;
- m_kbcin = data;
- break;
- case 1:
- m_sysctl = data;
- m_mb->m_pit8253->write_gate2(BIT(data, 0));
- m_mb->pc_speaker_set_spkrdata(BIT(data, 1));
- if(BIT(data, 6))
- m_pa |= 4;
- else
- m_pa &= ~4;
- break;
- case 5:
- m_maincpu->set_input_line(INPUT_LINE_HALT, (data & 0x40) ? ASSERT_LINE : CLEAR_LINE);
- m_i86_halt = true;
- m_i86_halt_perm = true;
+ m_speaker->level_w(0);
+ m_ctrlport_b |= 0x10;
}
}
+u8 m24_state::keyboard_data_r()
+{
+ if (!machine().side_effects_disabled())
+ {
+ m_pa |= 0x40;
+ m_pic->ir1_w(0);
+ }
+ return m_kbcout;
+}
+
+u8 m24_state::keyboard_status_r()
+{
+ return (m_kbcibf ? 2 : 0) | ((m_pa & 0x40) ? 0 : 1);
+}
+
+void m24_state::keyboard_data_w(u8 data)
+{
+ m_kbc->set_input_line(TMS7000_INT1_LINE, ASSERT_LINE);
+ m_kbcibf = true;
+ m_kbcin = data;
+}
+
+void m24_state::ctrlport_a_w(u8 data)
+{
+ const bool spkrdata_en_dis = BIT(data ^ m_ctrlport_a, 1);
+ const bool iochk_en_dis = BIT(data ^ m_ctrlport_a, 4);
+
+ m_pit->write_gate2(BIT(data, 0));
+
+ if (BIT(m_ctrlport_a, 4) && !m_chck_active)
+ m_ctrlport_b &= 0xbf;
+
+ if (BIT(data, 6))
+ m_pa |= 4;
+ else
+ m_pa &= ~4;
+
+ m_ctrlport_a = data;
+
+ if (spkrdata_en_dis)
+ update_speaker();
+ if (iochk_en_dis)
+ update_nmi();
+}
+
+u8 m24_state::ctrlport_a_r()
+{
+ return m_ctrlport_a;
+}
+
+u8 m24_state::ctrlport_b_r()
+{
+ // Bit 0 = NC
+ // Bit 1 = SW4 (8087 present)
+ // Bit 2 = ~RI1
+ // Bit 3 = ~DSR1
+ // Bit 4 = OUT2 (8253)
+ // Bit 5 = SPKR
+ // Bit 6 = IOCHK
+ // Bit 7 = MBMERR (MRD parity check)
+
+ if (BIT(m_dsw0->read(), 4))
+ m_ctrlport_b |= 0x02;
+ else
+ m_ctrlport_b &= 0xfd;
+
+ return m_ctrlport_b;
+}
+
+void m24_state::alt_w(u8 data)
+{
+ m_maincpu->set_input_line(INPUT_LINE_HALT, (data & 0x40) ? ASSERT_LINE : CLEAR_LINE);
+ m_i86_halt = true;
+ m_i86_halt_perm = true;
+}
+
+WRITE_LINE_MEMBER(m24_state::chck_w)
+{
+ m_chck_active = (state == 0);
+ if (m_chck_active)
+ {
+ if (!BIT(m_ctrlport_b, 6))
+ {
+ m_ctrlport_b |= 0x40;
+ update_nmi();
+ }
+ }
+ else if (BIT(m_ctrlport_a, 4))
+ m_ctrlport_b &= 0xbf;
+}
+
+WRITE_LINE_MEMBER(m24_state::int87_w)
+{
+ m_87int = state;
+ update_nmi();
+}
+
+void m24_state::nmi_enable_w(u8 data)
+{
+ m_nmi_enable = BIT(data, 7);
+ update_nmi();
+}
+
+void m24_state::update_nmi()
+{
+ if (m_nmi_enable && ((m_87int && BIT(m_dsw0->read(), 4)) || (BIT(m_ctrlport_b, 6) && !BIT(m_ctrlport_a, 4))))
+ m_maincpu->set_input_line(INPUT_LINE_NMI, ASSERT_LINE);
+ else
+ m_maincpu->set_input_line(INPUT_LINE_NMI, CLEAR_LINE);
+}
+
READ8_MEMBER(m24_state::pa_r)
{
return m_pa & (m_kbdata ? 0xff : 0xfd);
@@ -151,7 +411,7 @@ READ8_MEMBER(m24_state::kbcdata_r)
WRITE8_MEMBER(m24_state::kbcdata_w)
{
m_pa &= ~0x40;
- m_mb->m_pic8259->ir1_w(1);
+ m_pic->ir1_w(1);
m_kbcout = data;
}
@@ -160,17 +420,6 @@ WRITE_LINE_MEMBER(m24_state::kbcin_w)
m_kbdata = state;
}
-WRITE_LINE_MEMBER(m24_state::dma_hrq_w)
-{
- if(!m_i86_halt)
- m_maincpu->set_input_line(INPUT_LINE_HALT, state ? ASSERT_LINE : CLEAR_LINE);
- if(m_z8000_apb && !m_z8000_apb->halted())
- m_z8000_apb->halt_w(state ? ASSERT_LINE : CLEAR_LINE);
-
- /* Assert HLDA */
- m_mb->m_dma8237->hack_w(state);
-}
-
WRITE_LINE_MEMBER(m24_state::int_w)
{
if(!m_i86_halt)
@@ -196,10 +445,18 @@ void m24_state::m24_map(address_map &map)
void m24_state::m24_io(address_map &map)
{
map.unmap_value_high();
- map(0x0000, 0x00ff).m(m_mb, FUNC(pc_noppi_mb_device::map));
- map(0x0060, 0x0065).rw(FUNC(m24_state::keyboard_r), FUNC(m24_state::keyboard_w));
+ map(0x0000, 0x000f).rw(m_dmac, FUNC(am9517a_device::read), FUNC(am9517a_device::write));
+ map(0x0020, 0x0021).mirror(0xe).rw(m_pic, FUNC(pic8259_device::read), FUNC(pic8259_device::write));
+ map(0x0040, 0x0043).mirror(0xc).rw(m_pit, FUNC(pit8253_device::read), FUNC(pit8253_device::write));
+ map(0x0060, 0x0060).rw(FUNC(m24_state::keyboard_data_r), FUNC(m24_state::keyboard_data_w));
+ map(0x0061, 0x0061).rw(FUNC(m24_state::ctrlport_a_r), FUNC(m24_state::ctrlport_a_w));
+ map(0x0062, 0x0062).r(FUNC(m24_state::ctrlport_b_r));
+ map(0x0064, 0x0064).r(FUNC(m24_state::keyboard_status_r));
+ map(0x0065, 0x0065).w(FUNC(m24_state::alt_w));
map(0x0066, 0x0067).portr("DSW0");
map(0x0070, 0x007f).rw("mm58174an", FUNC(mm58274c_device::read), FUNC(mm58274c_device::write));
+ map(0x0080, 0x0083).mirror(0xc).w(FUNC(m24_state::dma_segment_w));
+ map(0x00a0, 0x00a1).mirror(0xe).w(FUNC(m24_state::nmi_enable_w));
map(0x80c1, 0x80c1).rw(m_z8000_apb, FUNC(m24_z8000_device::handshake_r), FUNC(m24_z8000_device::handshake_w));
}
@@ -264,30 +521,79 @@ void m24_state::cfg_m20_format(device_t *device)
device->subdevice<floppy_connector>("fdc:1")->set_formats(m24_state::floppy_formats);
}
-MACHINE_CONFIG_START(m24_state::olivetti)
+void m24_state::olivetti(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", I8086, XTAL(8'000'000))
- MCFG_DEVICE_PROGRAM_MAP(m24_map)
- MCFG_DEVICE_IO_MAP(m24_io)
- MCFG_DEVICE_IRQ_ACKNOWLEDGE_DEVICE("mb:pic8259", pic8259_device, inta_cb)
-
- MCFG_PCNOPPI_MOTHERBOARD_ADD("mb", "maincpu")
-
- // FIXME: determine ISA bus clock
- MCFG_DEVICE_ADD("mb1", ISA8_SLOT, 0, "mb:isa", pc_isa8_cards, "cga_m24", true)
- MCFG_DEVICE_ADD("mb2", ISA8_SLOT, 0, "mb:isa", pc_isa8_cards, "fdc_xt", true)
- MCFG_SLOT_OPTION_MACHINE_CONFIG("fdc_xt", cfg_m20_format)
- MCFG_DEVICE_ADD("mb3", ISA8_SLOT, 0, "mb:isa", pc_isa8_cards, "lpt", true)
- MCFG_DEVICE_ADD("mb4", ISA8_SLOT, 0, "mb:isa", pc_isa8_cards, "com", true)
-
- MCFG_DEVICE_ADD("isa1", ISA8_SLOT, 0, "mb:isa", pc_isa8_cards, nullptr, false)
- MCFG_DEVICE_ADD("isa2", ISA8_SLOT, 0, "mb:isa", pc_isa8_cards, nullptr, false)
- MCFG_DEVICE_ADD("isa3", ISA8_SLOT, 0, "mb:isa", pc_isa8_cards, nullptr, false)
-
- /* internal ram */
- RAM(config, RAM_TAG).set_default_size("640K").set_extra_options("64K, 128K, 256K, 512K");
-
- TMS7000(config, m_kbc, XTAL(4'000'000));
+ I8086(config, m_maincpu, 24_MHz_XTAL / 3);
+ m_maincpu->set_addrmap(AS_PROGRAM, &m24_state::m24_map);
+ m_maincpu->set_addrmap(AS_IO, &m24_state::m24_io);
+ m_maincpu->set_irq_acknowledge_callback("pic", FUNC(pic8259_device::inta_cb));
+ m_maincpu->esc_opcode_handler().set("ndp", FUNC(i8087_device::insn_w));
+ m_maincpu->esc_data_handler().set("ndp", FUNC(i8087_device::addr_w));
+
+ i8087_device &i8087(I8087(config, "ndp", 24_MHz_XTAL / 3));
+ i8087.set_space_86(m_maincpu, AS_PROGRAM);
+ i8087.irq().set(FUNC(m24_state::int87_w));
+ i8087.busy().set_inputline(m_maincpu, INPUT_LINE_TEST);
+
+ AM9517A(config, m_dmac, 24_MHz_XTAL / 6); // 8237A-4
+ m_dmac->out_hreq_callback().set(FUNC(m24_state::dma_hrq_w));
+ m_dmac->in_memr_callback().set(FUNC(m24_state::dma_memory_read));
+ m_dmac->out_memw_callback().set(FUNC(m24_state::dma_memory_write));
+ m_dmac->in_ior_callback<1>().set(FUNC(m24_state::dma_io_read<1>));
+ m_dmac->in_ior_callback<2>().set(FUNC(m24_state::dma_io_read<2>));
+ m_dmac->in_ior_callback<3>().set(FUNC(m24_state::dma_io_read<3>));
+ m_dmac->out_iow_callback<1>().set(FUNC(m24_state::dma_io_write<1>));
+ m_dmac->out_iow_callback<2>().set(FUNC(m24_state::dma_io_write<2>));
+ m_dmac->out_iow_callback<3>().set(FUNC(m24_state::dma_io_write<3>));
+ m_dmac->out_dack_callback<0>().set(FUNC(m24_state::dma_dack_w<0>));
+ m_dmac->out_dack_callback<1>().set(FUNC(m24_state::dma_dack_w<1>));
+ m_dmac->out_dack_callback<2>().set(FUNC(m24_state::dma_dack_w<2>));
+ m_dmac->out_dack_callback<3>().set(FUNC(m24_state::dma_dack_w<3>));
+ m_dmac->out_eop_callback().set(FUNC(m24_state::dma_tc_w));
+
+ PIC8259(config, m_pic);
+ m_pic->in_sp_callback().set_constant(1);
+ m_pic->out_int_callback().set(FUNC(m24_state::int_w));
+
+ PIT8253(config, m_pit); // 8253-5
+ m_pit->set_clk<0>(3.6864_MHz_XTAL / 3); // divided by LS175 at 8T
+ m_pit->set_clk<1>(3.6864_MHz_XTAL / 3);
+ m_pit->set_clk<2>(3.6864_MHz_XTAL / 3);
+ m_pit->out_handler<0>().set(m_pic, FUNC(pic8259_device::ir0_w));
+ m_pit->out_handler<1>().set(FUNC(m24_state::dreq0_ck_w));
+ m_pit->out_handler<2>().set(FUNC(m24_state::speaker_ck_w));
+
+ SPEAKER(config, "mono").front_center();
+ SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 1.00);
+
+ ISA8(config, m_isabus, 24_MHz_XTAL / 6);
+ m_isabus->set_memspace(m_maincpu, AS_PROGRAM);
+ m_isabus->set_iospace(m_maincpu, AS_IO);
+ m_isabus->irq2_callback().set(m_pic, FUNC(pic8259_device::ir2_w));
+ m_isabus->irq3_callback().set(m_pic, FUNC(pic8259_device::ir3_w));
+ m_isabus->irq4_callback().set(m_pic, FUNC(pic8259_device::ir4_w));
+ m_isabus->irq5_callback().set(m_pic, FUNC(pic8259_device::ir5_w));
+ m_isabus->irq6_callback().set(m_pic, FUNC(pic8259_device::ir6_w));
+ m_isabus->irq7_callback().set(m_pic, FUNC(pic8259_device::ir7_w));
+ m_isabus->drq1_callback().set(m_dmac, FUNC(am9517a_device::dreq1_w));
+ m_isabus->drq2_callback().set(m_dmac, FUNC(am9517a_device::dreq2_w));
+ m_isabus->drq3_callback().set(m_dmac, FUNC(am9517a_device::dreq3_w));
+ m_isabus->iochck_callback().set(FUNC(m24_state::chck_w));
+
+ ISA8_SLOT(config, "mb1", 0, m_isabus, pc_isa8_cards, "cga_m24", true);
+ ISA8_SLOT(config, "mb2", 0, m_isabus, pc_isa8_cards, "fdc_xt", true).set_option_machine_config("fdc_xt", cfg_m20_format);
+ ISA8_SLOT(config, "mb3", 0, m_isabus, pc_isa8_cards, "lpt", true);
+ ISA8_SLOT(config, "mb4", 0, m_isabus, pc_isa8_cards, "com", true);
+
+ ISA8_SLOT(config, "isa1", 0, m_isabus, pc_isa8_cards, nullptr, false);
+ ISA8_SLOT(config, "isa2", 0, m_isabus, pc_isa8_cards, nullptr, false);
+ ISA8_SLOT(config, "isa3", 0, m_isabus, pc_isa8_cards, nullptr, false);
+
+ // 2 banks of 16 64Kx1 or 256Kx1 DRAMs on motherboard
+ RAM(config, m_ram).set_default_size("640K").set_extra_options("128K, 256K, 512K");
+
+ TMS7000(config, m_kbc, 24_MHz_XTAL / 6);
m_kbc->set_addrmap(AS_PROGRAM, &m24_state::kbc_map);
m_kbc->in_porta().set(FUNC(m24_state::pa_r));
m_kbc->out_portb().set(FUNC(m24_state::pb_w));
@@ -295,19 +601,17 @@ MACHINE_CONFIG_START(m24_state::olivetti)
M24_KEYBOARD(config, m_keyboard, 0);
m_keyboard->out_data_handler().set(FUNC(m24_state::kbcin_w));
- MCFG_DEVICE_ADD("mm58174an", MM58274C, 0)
- MCFG_MM58274C_MODE24(1) // ?
- MCFG_MM58274C_DAY1(1) // ?
+ mm58274c_device &mm58174an(MM58274C(config, "mm58174an", 32.768_kHz_XTAL));
+ // this is all guess
+ mm58174an.set_mode24(1); // ?
+ mm58174an.set_day1(1); // ?
- M24_Z8000(config, m_z8000_apb, 0);
+ M24_Z8000(config, m_z8000_apb, 0); // TODO: make this a slot device (uses custom bus connector)
m_z8000_apb->halt_callback().set(FUNC(m24_state::halt_i86_w));
- subdevice<am9517a_device>("mb:dma8237")->out_hreq_callback().set(FUNC(m24_state::dma_hrq_w));
- subdevice<pic8259_device>("mb:pic8259")->out_int_callback().set(FUNC(m24_state::int_w));
-
/* software lists */
- MCFG_SOFTWARE_LIST_ADD("disk_list","ibm5150")
-MACHINE_CONFIG_END
+ SOFTWARE_LIST(config, "disk_list").set_original("ibm5150");
+}
ROM_START( m24 )
ROM_REGION16_LE(0x8000,"bios", 0)
diff --git a/src/mame/drivers/m3.cpp b/src/mame/drivers/m3.cpp
index 265b6c67f07..f875c49b9c2 100644
--- a/src/mame/drivers/m3.cpp
+++ b/src/mame/drivers/m3.cpp
@@ -115,19 +115,20 @@ void m3_state::machine_reset()
m_maincpu->set_pc(0xf000);
}
-MACHINE_CONFIG_START(m3_state::m3)
- MCFG_DEVICE_ADD("maincpu", Z80, 2'000'000) // no idea of clock.
- MCFG_DEVICE_PROGRAM_MAP(mem_map)
- MCFG_DEVICE_IO_MAP(io_map)
+void m3_state::m3(machine_config &config)
+{
+ Z80(config, m_maincpu, 2'000'000); // no idea of clock.
+ m_maincpu->set_addrmap(AS_PROGRAM, &m3_state::mem_map);
+ m_maincpu->set_addrmap(AS_IO, &m3_state::io_map);
/* video hardware */
- MCFG_SCREEN_ADD_MONOCHROME("screen", RASTER, rgb_t::green())
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) // not correct
- MCFG_SCREEN_UPDATE_DEVICE("crtc", mc6845_device, screen_update)
- MCFG_SCREEN_SIZE(640, 480)
- MCFG_SCREEN_VISIBLE_AREA(0, 639, 0, 479)
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_f4disp)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER, rgb_t::green()));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500)); // not correct
+ screen.set_screen_update("crtc", FUNC(mc6845_device::screen_update));
+ screen.set_size(640, 480);
+ screen.set_visarea(0, 639, 0, 479);
+ GFXDECODE(config, "gfxdecode", m_palette, gfx_f4disp);
PALETTE(config, m_palette, palette_device::MONOCHROME);
/* Devices */
@@ -136,7 +137,7 @@ MACHINE_CONFIG_START(m3_state::m3)
crtc.set_show_border_area(false);
crtc.set_char_width(7);
crtc.set_update_row_callback(FUNC(m3_state::crtc_update_row), this);
-MACHINE_CONFIG_END
+}
ROM_START( m3 )
ROM_REGION( 0x3000, "roms", 0 )
diff --git a/src/mame/drivers/m5.cpp b/src/mame/drivers/m5.cpp
index ecef78735a7..74ec56eb5ac 100644
--- a/src/mame/drivers/m5.cpp
+++ b/src/mame/drivers/m5.cpp
@@ -718,9 +718,8 @@ void m5_state::m5_io(address_map &map)
map.unmap_value_high();
map.global_mask(0xff);
map(0x00, 0x03).mirror(0x0c).rw(m_ctc, FUNC(z80ctc_device::read), FUNC(z80ctc_device::write));
- map(0x10, 0x10).mirror(0x0e).rw("tms9928a", FUNC(tms9928a_device::vram_r), FUNC(tms9928a_device::vram_w));
- map(0x11, 0x11).mirror(0x0e).rw("tms9928a", FUNC(tms9928a_device::register_r), FUNC(tms9928a_device::register_w));
- map(0x20, 0x20).mirror(0x0f).w(SN76489AN_TAG, FUNC(sn76489a_device::command_w));
+ map(0x10, 0x11).mirror(0x0e).rw("tms9928a", FUNC(tms9928a_device::read), FUNC(tms9928a_device::write));
+ map(0x20, 0x20).mirror(0x0f).w(SN76489AN_TAG, FUNC(sn76489a_device::write));
map(0x30, 0x30).mirror(0x08).portr("Y0").w(FUNC(m5_state::mem64KBF_w)); // 64KBF paging
map(0x31, 0x31).mirror(0x08).portr("Y1");
map(0x32, 0x32).mirror(0x08).portr("Y2");
@@ -1040,9 +1039,8 @@ void brno_state::brno_io(address_map &map)
map.unmap_value_high();
map.global_mask(0xff);
map(0x00, 0x03).mirror(0x0c).rw(m_ctc, FUNC(z80ctc_device::read), FUNC(z80ctc_device::write));
- map(0x10, 0x10).mirror(0x0e).rw("tms9928a", FUNC(tms9928a_device::vram_r), FUNC(tms9928a_device::vram_w));
- map(0x11, 0x11).mirror(0x0e).rw("tms9928a", FUNC(tms9928a_device::register_r), FUNC(tms9928a_device::register_w));
- map(0x20, 0x20).mirror(0x0f).w(SN76489AN_TAG, FUNC(sn76489a_device::command_w));
+ map(0x10, 0x11).mirror(0x0e).rw("tms9928a", FUNC(tms9928a_device::read), FUNC(tms9928a_device::write));
+ map(0x20, 0x20).mirror(0x0f).w(SN76489AN_TAG, FUNC(sn76489a_device::write));
map(0x30, 0x30).portr("Y0");
map(0x31, 0x31).portr("Y1");
map(0x32, 0x32).portr("Y2");
@@ -1401,24 +1399,24 @@ void brno_state::machine_reset()
//**************************************************************************
//-------------------------------------------------
-// MACHINE_CONFIG( m5 )
+// machine_config( m5 )
//-------------------------------------------------
-MACHINE_CONFIG_START(m5_state::m5)
+void m5_state::m5(machine_config &config)
+{
// basic machine hardware
Z80(config, m_maincpu, 14.318181_MHz_XTAL / 4);
m_maincpu->set_addrmap(AS_PROGRAM, &m5_state::m5_mem);
m_maincpu->set_addrmap(AS_IO, &m5_state::m5_io);
m_maincpu->set_daisy_config(m5_daisy_chain);
- MCFG_DEVICE_ADD(m_fd5cpu, Z80, 14.318181_MHz_XTAL / 4)
- MCFG_DEVICE_PROGRAM_MAP(fd5_mem)
- MCFG_DEVICE_IO_MAP(fd5_io)
+ Z80(config, m_fd5cpu, 14.318181_MHz_XTAL / 4);
+ m_fd5cpu->set_addrmap(AS_PROGRAM, &m5_state::fd5_mem);
+ m_fd5cpu->set_addrmap(AS_IO, &m5_state::fd5_io);
// sound hardware
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD(SN76489AN_TAG, SN76489A, 14.318181_MHz_XTAL / 4)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.00)
+ SN76489A(config, SN76489AN_TAG, 14.318181_MHz_XTAL / 4).add_route(ALL_OUTPUTS, "mono", 1.00);
// devices
Z80CTC(config, m_ctc, 14.318181_MHz_XTAL / 4);
@@ -1426,15 +1424,16 @@ MACHINE_CONFIG_START(m5_state::m5)
// CK0 = EXINT, CK1 = GND, CK2 = TCK, CK3 = VDP INT
// ZC2 = EXCLK
- MCFG_DEVICE_ADD(m_centronics, CENTRONICS, centronics_devices, "printer")
- MCFG_CENTRONICS_BUSY_HANDLER(WRITELINE(*this, m5_state, write_centronics_busy))
+ CENTRONICS(config, m_centronics, centronics_devices, "printer");
+ m_centronics->busy_handler().set(FUNC(m5_state::write_centronics_busy));
- MCFG_CENTRONICS_OUTPUT_LATCH_ADD("cent_data_out", CENTRONICS_TAG)
+ output_latch_device &cent_data_out(OUTPUT_LATCH(config, "cent_data_out"));
+ m_centronics->set_output_latch(cent_data_out);
- MCFG_CASSETTE_ADD("cassette")
- MCFG_CASSETTE_FORMATS(sordm5_cassette_formats)
- MCFG_CASSETTE_DEFAULT_STATE(CASSETTE_PLAY)
- MCFG_CASSETTE_INTERFACE("m5_cass")
+ CASSETTE(config, m_cassette);
+ m_cassette->set_formats(sordm5_cassette_formats);
+ m_cassette->set_default_state(CASSETTE_PLAY);
+ m_cassette->set_interface("m5_cass");
I8255(config, m_ppi);
m_ppi->in_pa_callback().set(FUNC(m5_state::ppi_pa_r));
@@ -1445,25 +1444,25 @@ MACHINE_CONFIG_START(m5_state::m5)
UPD765A(config, m_fdc, 8'000'000, true, true);
m_fdc->intrq_wr_callback().set_inputline(m_fd5cpu, INPUT_LINE_IRQ0);
- MCFG_FLOPPY_DRIVE_ADD(UPD765_TAG ":0", m5_floppies, "525dd", m5_state::floppy_formats)
+ FLOPPY_CONNECTOR(config, UPD765_TAG ":0", m5_floppies, "525dd", m5_state::floppy_formats);
// cartridge
- MCFG_M5_CARTRIDGE_ADD("cartslot1", m5_cart, nullptr)
- MCFG_M5_CARTRIDGE_ADD("cartslot2", m5_cart, nullptr)
+ M5_CART_SLOT(config, m_cart1, m5_cart, nullptr);
+ M5_CART_SLOT(config, m_cart2, m5_cart, nullptr);
// software lists
- MCFG_SOFTWARE_LIST_ADD("cart_list", "m5_cart")
- MCFG_SOFTWARE_LIST_ADD("cass_list", "m5_cass")
- //MCFG_SOFTWARE_LIST_ADD("flop_list", "m5_flop")
+ SOFTWARE_LIST(config, "cart_list").set_original("m5_cart");
+ SOFTWARE_LIST(config, "cass_list").set_original("m5_cass");
+ //SOFTWARE_LIST(config, "flop_list").set_original("m5_flop");
// internal ram
//68K is not possible, 'cos internal ram always overlays any expansion memory in that area
RAM(config, RAM_TAG).set_default_size("4K").set_extra_options("36K,64K");
-MACHINE_CONFIG_END
+}
//-------------------------------------------------
-// MACHINE_CONFIG_START( ntsc )
+// machine_config( ntsc )
//-------------------------------------------------
void m5_state::ntsc(machine_config &config)
@@ -1479,7 +1478,7 @@ void m5_state::ntsc(machine_config &config)
//-------------------------------------------------
-// MACHINE_CONFIG_START( pal )
+// machine_config( pal )
//-------------------------------------------------
void m5_state::pal(machine_config &config)
@@ -1494,11 +1493,12 @@ void m5_state::pal(machine_config &config)
}
//-------------------------------------------------
-// MACHINE_CONFIG( m5p_brno )
+// machine_config( m5p_brno )
//-------------------------------------------------
-MACHINE_CONFIG_START(brno_state::brno)
+void brno_state::brno(machine_config &config)
+{
m5(config);
// basic machine hardware
@@ -1520,19 +1520,16 @@ MACHINE_CONFIG_START(brno_state::brno)
// floppy
WD2797(config, m_fdc, 1_MHz_XTAL);
- MCFG_FLOPPY_DRIVE_ADD(WD2797_TAG":0", brno_floppies, "35hd", brno_state::floppy_formats)
- MCFG_FLOPPY_DRIVE_SOUND(true)
- MCFG_FLOPPY_DRIVE_ADD(WD2797_TAG":1", brno_floppies, "35hd", brno_state::floppy_formats)
- MCFG_FLOPPY_DRIVE_SOUND(true)
+ FLOPPY_CONNECTOR(config, WD2797_TAG":0", brno_floppies, "35hd", brno_state::floppy_formats).enable_sound(true);
+ FLOPPY_CONNECTOR(config, WD2797_TAG":1", brno_floppies, "35hd", brno_state::floppy_formats).enable_sound(true);
// only one floppy drive
- //MCFG_DEVICE_REMOVE(WD2797_TAG":1")
+ //config.device_remove(WD2797_TAG":1");
//MCFG_SNAPSHOT_ADD("snapshot", brno_state, brno, "rmd", 0)
// software list
- MCFG_SOFTWARE_LIST_ADD("flop_list","m5_flop")
-
-MACHINE_CONFIG_END
+ SOFTWARE_LIST(config, "flop_list").set_original("m5_flop");
+}
//**************************************************************************
diff --git a/src/mame/drivers/m52.cpp b/src/mame/drivers/m52.cpp
index 999b58f8210..a441b45c69a 100644
--- a/src/mame/drivers/m52.cpp
+++ b/src/mame/drivers/m52.cpp
@@ -398,13 +398,13 @@ void m52_state::machine_reset()
m_bgcontrol = 0;
}
-MACHINE_CONFIG_START(m52_state::m52)
-
+void m52_state::m52(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, MASTER_CLOCK / 6)
- MCFG_DEVICE_PROGRAM_MAP(main_map)
- MCFG_DEVICE_IO_MAP(main_portmap)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", m52_state, irq0_line_hold)
+ Z80(config, m_maincpu, MASTER_CLOCK / 6);
+ m_maincpu->set_addrmap(AS_PROGRAM, &m52_state::main_map);
+ m_maincpu->set_addrmap(AS_IO, &m52_state::main_portmap);
+ m_maincpu->set_vblank_int("screen", FUNC(m52_state::irq0_line_hold));
/* video hardware */
PALETTE(config, m_sp_palette).set_entries(256, 32);
@@ -416,27 +416,24 @@ MACHINE_CONFIG_START(m52_state::m52)
PALETTE(config, m_bg_palette).set_entries(3 * 4, 32);
GFXDECODE(config, m_bg_gfxdecode, m_bg_palette, gfx_m52_bg);
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_RAW_PARAMS(MASTER_CLOCK / 3, 384, 136, 376, 282, 22, 274)
- MCFG_SCREEN_UPDATE_DRIVER(m52_state, screen_update_m52)
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_raw(MASTER_CLOCK / 3, 384, 136, 376, 282, 22, 274);
+ m_screen->set_screen_update(FUNC(m52_state::screen_update_m52));
/* sound hardware */
//m52_sound_c_audio(config);
- MCFG_DEVICE_ADD("irem_audio", IREM_M52_SOUNDC_AUDIO, 0)
-
-MACHINE_CONFIG_END
+ IREM_M52_SOUNDC_AUDIO(config, "irem_audio", 0);
+}
-MACHINE_CONFIG_START(m52_alpha1v_state::alpha1v)
+void m52_alpha1v_state::alpha1v(machine_config &config)
+{
m52(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(alpha1v_map)
- MCFG_SCREEN_MODIFY("screen")
- MCFG_SCREEN_RAW_PARAMS(MASTER_CLOCK / 3, 384, 136, 376, 282, 16, 272)
-
-MACHINE_CONFIG_END
+ m_maincpu->set_addrmap(AS_PROGRAM, &m52_alpha1v_state::alpha1v_map);
+ m_screen->set_raw(MASTER_CLOCK / 3, 384, 136, 376, 282, 16, 272);
+}
diff --git a/src/mame/drivers/m57.cpp b/src/mame/drivers/m57.cpp
index d35f8a8eb30..7377b320cef 100644
--- a/src/mame/drivers/m57.cpp
+++ b/src/mame/drivers/m57.cpp
@@ -229,32 +229,31 @@ GFXDECODE_END
*
*************************************/
-MACHINE_CONFIG_START(m57_state::m57)
-
+void m57_state::m57(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, XTAL(18'432'000)/6) /* verified on pcb */
- MCFG_DEVICE_PROGRAM_MAP(main_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", m57_state, irq0_line_hold)
+ Z80(config, m_maincpu, XTAL(18'432'000)/6); /* verified on pcb */
+ m_maincpu->set_addrmap(AS_PROGRAM, &m57_state::main_map);
+ m_maincpu->set_vblank_int("screen", FUNC(m57_state::irq0_line_hold));
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(57)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(1790) /* accurate frequency, measured on a Moon Patrol board, is 56.75Hz. */)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(57);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(1790) /* accurate frequency, measured on a Moon Patrol board, is 56.75Hz. */);
/* the Lode Runner manual (similar but different hardware) */
/* talks about 55Hz and 1790ms vblank duration. */
- MCFG_SCREEN_SIZE(32*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(1*8, 31*8-1, 1*8, 31*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(m57_state, screen_update_m57)
- MCFG_SCREEN_PALETTE(m_palette)
+ screen.set_size(32*8, 32*8);
+ screen.set_visarea(1*8, 31*8-1, 1*8, 31*8-1);
+ screen.set_screen_update(FUNC(m57_state::screen_update_m57));
+ screen.set_palette(m_palette);
- MCFG_DEVICE_ADD(m_gfxdecode, GFXDECODE, m_palette, gfx_m57)
+ GFXDECODE(config, m_gfxdecode, m_palette, gfx_m57);
PALETTE(config, m_palette, FUNC(m57_state::m57_palette), 32*8+32*8, 256+16);
/* sound hardware */
//m52_sound_c_audio(config);
- MCFG_DEVICE_ADD("irem_audio", IREM_M52_SOUNDC_AUDIO, 0)
-
-MACHINE_CONFIG_END
+ IREM_M52_SOUNDC_AUDIO(config, "irem_audio", 0);
+}
diff --git a/src/mame/drivers/m58.cpp b/src/mame/drivers/m58.cpp
index 991ecff9372..fd0507bc4f9 100644
--- a/src/mame/drivers/m58.cpp
+++ b/src/mame/drivers/m58.cpp
@@ -192,25 +192,25 @@ GFXDECODE_END
*
*************************************/
-MACHINE_CONFIG_START(m58_state::yard)
-
+void m58_state::yard(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, MASTER_CLOCK/3/2)
- MCFG_DEVICE_PROGRAM_MAP(yard_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", m58_state, irq0_line_hold)
+ Z80(config, m_maincpu, MASTER_CLOCK/3/2);
+ m_maincpu->set_addrmap(AS_PROGRAM, &m58_state::yard_map);
+ m_maincpu->set_vblank_int("screen", FUNC(m58_state::irq0_line_hold));
/* video hardware */
- MCFG_DEVICE_ADD(m_gfxdecode, GFXDECODE, m_palette, gfx_yard)
+ GFXDECODE(config, m_gfxdecode, m_palette, gfx_yard);
PALETTE(config, m_palette, FUNC(m58_state::m58_palette), 256+256+256, 256+256+16);
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_RAW_PARAMS(MASTER_CLOCK/3, 384, 0, 256, 282, 42, 266)
- MCFG_SCREEN_UPDATE_DRIVER(m58_state, screen_update)
- MCFG_SCREEN_PALETTE(m_palette)
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_raw(MASTER_CLOCK/3, 384, 0, 256, 282, 42, 266);
+ m_screen->set_screen_update(FUNC(m58_state::screen_update));
+ m_screen->set_palette(m_palette);
/* sound hardware */
- MCFG_DEVICE_ADD("irem_audio", IREM_M52_LARGE_AUDIO, 0)
-MACHINE_CONFIG_END
+ IREM_M52_LARGE_AUDIO(config, "irem_audio", 0);
+}
diff --git a/src/mame/drivers/m62.cpp b/src/mame/drivers/m62.cpp
index 9c12b6e6ae1..1b491be7ab0 100644
--- a/src/mame/drivers/m62.cpp
+++ b/src/mame/drivers/m62.cpp
@@ -965,231 +965,220 @@ void m62_state::machine_reset()
m_bankcontrol[1] = 0;
}
-MACHINE_CONFIG_START(m62_state::ldrun)
+void m62_state::ldrun(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, 24000000/6)
- MCFG_DEVICE_PROGRAM_MAP(ldrun_map)
- MCFG_DEVICE_IO_MAP(kungfum_io_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", m62_state, irq0_line_hold)
+ Z80(config, m_maincpu, 24000000/6);
+ m_maincpu->set_addrmap(AS_PROGRAM, &m62_state::ldrun_map);
+ m_maincpu->set_addrmap(AS_IO, &m62_state::kungfum_io_map);
+ m_maincpu->set_vblank_int("screen", FUNC(m62_state::irq0_line_hold));
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(55)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(1790) /* frames per second and vblank duration from the Lode Runner manual */)
- MCFG_SCREEN_SIZE(64*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA((64*8-384)/2, 64*8-(64*8-384)/2-1, 0*8, 32*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(m62_state, screen_update_ldrun)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(55);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(1790) /* frames per second and vblank duration from the Lode Runner manual */);
+ screen.set_size(64*8, 32*8);
+ screen.set_visarea((64*8-384)/2, 64*8-(64*8-384)/2-1, 0*8, 32*8-1);
+ screen.set_screen_update(FUNC(m62_state::screen_update_ldrun));
- MCFG_DEVICE_ADD(m_spr_decode, GFXDECODE, m_spr_palette, gfx_m62_sprites)
- MCFG_DEVICE_ADD(m_chr_decode, GFXDECODE, m_chr_palette, gfx_m62_tiles)
+ GFXDECODE(config, m_spr_decode, m_spr_palette, gfx_m62_sprites);
+ GFXDECODE(config, m_chr_decode, m_chr_palette, gfx_m62_tiles);
PALETTE(config, m_chr_palette, FUNC(m62_state::m62_chr), 256);
PALETTE(config, m_spr_palette, FUNC(m62_state::m62_spr), 256);
/* sound hardware */
//m62_audio(config);
- MCFG_DEVICE_ADD("irem_audio", IREM_M62_AUDIO, 0)
+ IREM_M62_AUDIO(config, m_audio, 0);
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(m62_state::kungfum)
+void m62_state::kungfum(machine_config &config)
+{
ldrun(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_CLOCK(18432000/6)
- MCFG_DEVICE_PROGRAM_MAP(kungfum_map)
- MCFG_DEVICE_IO_MAP(kungfum_io_map)
+ m_maincpu->set_clock(18432000/6);
+ m_maincpu->set_addrmap(AS_PROGRAM, &m62_state::kungfum_map);
+ m_maincpu->set_addrmap(AS_IO, &m62_state::kungfum_io_map);
/* video hardware */
- MCFG_SCREEN_MODIFY("screen")
- MCFG_SCREEN_VISIBLE_AREA((64*8-256)/2, 64*8-(64*8-256)/2-1, 0*8, 32*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(m62_state, screen_update_kungfum)
+ subdevice<screen_device>("screen")->set_visarea((64*8-256)/2, 64*8-(64*8-256)/2-1, 0*8, 32*8-1);
+ subdevice<screen_device>("screen")->set_screen_update(FUNC(m62_state::screen_update_kungfum));
MCFG_VIDEO_START_OVERRIDE(m62_state,kungfum)
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(m62_state::battroad)
+void m62_state::battroad(machine_config &config)
+{
ldrun(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_CLOCK(18432000/6)
- MCFG_DEVICE_PROGRAM_MAP(battroad_map)
- MCFG_DEVICE_IO_MAP(battroad_io_map)
+ m_maincpu->set_clock(18432000/6);
+ m_maincpu->set_addrmap(AS_PROGRAM, &m62_state::battroad_map);
+ m_maincpu->set_addrmap(AS_IO, &m62_state::battroad_io_map);
MCFG_MACHINE_START_OVERRIDE(m62_state,battroad)
/* video hardware */
- MCFG_SCREEN_MODIFY("screen")
- MCFG_SCREEN_VISIBLE_AREA((64*8-256)/2, 64*8-(64*8-256)/2-1, 0*8, 32*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(m62_state, screen_update_battroad)
+ subdevice<screen_device>("screen")->set_visarea((64*8-256)/2, 64*8-(64*8-256)/2-1, 0*8, 32*8-1);
+ subdevice<screen_device>("screen")->set_screen_update(FUNC(m62_state::screen_update_battroad));
- MCFG_DEVICE_ADD(m_fg_decode, GFXDECODE, m_fg_palette, gfx_m62_fg_battroad)
+ GFXDECODE(config, m_fg_decode, m_fg_palette, gfx_m62_fg_battroad);
PALETTE(config, m_fg_palette, FUNC(m62_state::m62_battroad_fg), 32);
MCFG_VIDEO_START_OVERRIDE(m62_state,battroad)
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(m62_state::ldrun2)
+void m62_state::ldrun2(machine_config &config)
+{
ldrun(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(ldrun2_map)
- MCFG_DEVICE_IO_MAP(ldrun2_io_map)
+ m_maincpu->set_addrmap(AS_PROGRAM, &m62_state::ldrun2_map);
+ m_maincpu->set_addrmap(AS_IO, &m62_state::ldrun2_io_map);
MCFG_VIDEO_START_OVERRIDE(m62_state,ldrun2)
- MCFG_SCREEN_MODIFY("screen")
- MCFG_SCREEN_UPDATE_DRIVER(m62_state, screen_update_ldrun)
-MACHINE_CONFIG_END
+ subdevice<screen_device>("screen")->set_screen_update(FUNC(m62_state::screen_update_ldrun));
+}
-MACHINE_CONFIG_START(m62_state::ldrun3)
+void m62_state::ldrun3(machine_config &config)
+{
ldrun(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(ldrun3_map)
- MCFG_DEVICE_IO_MAP(ldrun3_io_map)
+ m_maincpu->set_addrmap(AS_PROGRAM, &m62_state::ldrun3_map);
+ m_maincpu->set_addrmap(AS_IO, &m62_state::ldrun3_io_map);
/* video hardware */
MCFG_VIDEO_START_OVERRIDE(m62_state,ldrun2)
- MCFG_SCREEN_MODIFY("screen")
- MCFG_SCREEN_UPDATE_DRIVER(m62_state, screen_update_ldrun3)
-MACHINE_CONFIG_END
+ subdevice<screen_device>("screen")->set_screen_update(FUNC(m62_state::screen_update_ldrun3));
+}
-MACHINE_CONFIG_START(m62_state::ldrun4)
+void m62_state::ldrun4(machine_config &config)
+{
ldrun(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(ldrun4_map)
- MCFG_DEVICE_IO_MAP(ldrun4_io_map)
+ m_maincpu->set_addrmap(AS_PROGRAM, &m62_state::ldrun4_map);
+ m_maincpu->set_addrmap(AS_IO, &m62_state::ldrun4_io_map);
/* video hardware */
MCFG_VIDEO_START_OVERRIDE(m62_state,ldrun4)
- MCFG_SCREEN_MODIFY("screen")
- MCFG_SCREEN_UPDATE_DRIVER(m62_state, screen_update_ldrun4)
-MACHINE_CONFIG_END
+ subdevice<screen_device>("screen")->set_screen_update(FUNC(m62_state::screen_update_ldrun4));
+}
-MACHINE_CONFIG_START(m62_state::lotlot)
+void m62_state::lotlot(machine_config &config)
+{
ldrun(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(lotlot_map)
+ m_maincpu->set_addrmap(AS_PROGRAM, &m62_state::lotlot_map);
/* video hardware */
-
- MCFG_DEVICE_ADD(m_fg_decode, GFXDECODE, m_fg_palette, gfx_m62_fg_lotlot)
- MCFG_GFXDECODE_MODIFY("chr_decode", gfx_m62_tiles_lotlot)
+ GFXDECODE(config, m_fg_decode, m_fg_palette, gfx_m62_fg_lotlot);
+ m_chr_decode->set_info(gfx_m62_tiles_lotlot);
PALETTE(config, m_fg_palette, FUNC(m62_state::m62_lotlot_fg), 256);
MCFG_VIDEO_START_OVERRIDE(m62_state,lotlot)
- MCFG_SCREEN_MODIFY("screen")
- MCFG_SCREEN_UPDATE_DRIVER(m62_state, screen_update_lotlot)
-MACHINE_CONFIG_END
+ subdevice<screen_device>("screen")->set_screen_update(FUNC(m62_state::screen_update_lotlot));
+}
-MACHINE_CONFIG_START(m62_state::kidniki)
+void m62_state::kidniki(machine_config &config)
+{
ldrun(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(kidniki_map)
- MCFG_DEVICE_IO_MAP(kidniki_io_map)
+ m_maincpu->set_addrmap(AS_PROGRAM, &m62_state::kidniki_map);
+ m_maincpu->set_addrmap(AS_IO, &m62_state::kidniki_io_map);
/* video hardware */
- MCFG_DEVICE_ADD("fg_decode", GFXDECODE, "chr_palette", gfx_m62_fg_kidniki)
+ GFXDECODE(config, m_fg_decode, m_chr_palette, gfx_m62_fg_kidniki);
MCFG_VIDEO_START_OVERRIDE(m62_state,kidniki)
- MCFG_SCREEN_MODIFY("screen")
- MCFG_SCREEN_UPDATE_DRIVER(m62_state, screen_update_kidniki)
-MACHINE_CONFIG_END
+ subdevice<screen_device>("screen")->set_screen_update(FUNC(m62_state::screen_update_kidniki));
+}
-MACHINE_CONFIG_START(m62_state::spelunkr)
+void m62_state::spelunkr(machine_config &config)
+{
ldrun(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(spelunkr_map)
+ m_maincpu->set_addrmap(AS_PROGRAM, &m62_state::spelunkr_map);
/* video hardware */
- MCFG_DEVICE_ADD("fg_decode", GFXDECODE, "chr_palette", gfx_m62_fg_spelunkr)
+ GFXDECODE(config, m_fg_decode, m_chr_palette, gfx_m62_fg_spelunkr);
MCFG_VIDEO_START_OVERRIDE(m62_state,spelunkr)
- MCFG_SCREEN_MODIFY("screen")
- MCFG_SCREEN_UPDATE_DRIVER(m62_state, screen_update_spelunkr)
-MACHINE_CONFIG_END
+ subdevice<screen_device>("screen")->set_screen_update(FUNC(m62_state::screen_update_spelunkr));
+}
-MACHINE_CONFIG_START(m62_state::spelunk2)
+void m62_state::spelunk2(machine_config &config)
+{
ldrun(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(spelunk2_map)
+ m_maincpu->set_addrmap(AS_PROGRAM, &m62_state::spelunk2_map);
/* video hardware */
- MCFG_GFXDECODE_MODIFY("chr_decode", gfx_m62_tiles_spelunk2)
- MCFG_DEVICE_ADD(m_fg_decode, GFXDECODE, m_chr_palette, gfx_m62_fg_spelunk2)
+ m_chr_decode->set_info(gfx_m62_tiles_spelunk2);
+ GFXDECODE(config, m_fg_decode, m_chr_palette, gfx_m62_fg_spelunk2);
m_chr_palette->set_entries(512);
m_chr_palette->set_init(FUNC(m62_state::spelunk2_palette));
MCFG_VIDEO_START_OVERRIDE(m62_state,spelunk2)
- MCFG_SCREEN_MODIFY("screen")
- MCFG_SCREEN_UPDATE_DRIVER(m62_state, screen_update_spelunk2)
-MACHINE_CONFIG_END
+ subdevice<screen_device>("screen")->set_screen_update(FUNC(m62_state::screen_update_spelunk2));
+}
-MACHINE_CONFIG_START(m62_state::youjyudn)
+void m62_state::youjyudn(machine_config &config)
+{
ldrun(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_CLOCK(18432000/6)
- MCFG_DEVICE_PROGRAM_MAP(youjyudn_map)
- MCFG_DEVICE_IO_MAP(youjyudn_io_map)
+ m_maincpu->set_clock(18432000/6);
+ m_maincpu->set_addrmap(AS_PROGRAM, &m62_state::youjyudn_map);
+ m_maincpu->set_addrmap(AS_IO, &m62_state::youjyudn_io_map);
/* video hardware */
- MCFG_SCREEN_MODIFY("screen")
- MCFG_SCREEN_VISIBLE_AREA((64*8-256)/2, 64*8-(64*8-256)/2-1, 0*8, 32*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(m62_state, screen_update_youjyudn)
+ subdevice<screen_device>("screen")->set_visarea((64*8-256)/2, 64*8-(64*8-256)/2-1, 0*8, 32*8-1);
+ subdevice<screen_device>("screen")->set_screen_update(FUNC(m62_state::screen_update_youjyudn));
- MCFG_GFXDECODE_MODIFY("chr_decode", gfx_m62_tiles_youjyudn)
- MCFG_DEVICE_ADD("fg_decode", GFXDECODE, "chr_palette", gfx_m62_fg_youjyudn)
+ m_chr_decode->set_info(gfx_m62_tiles_youjyudn);
+ GFXDECODE(config, m_fg_decode, m_chr_palette, gfx_m62_fg_youjyudn);
MCFG_VIDEO_START_OVERRIDE(m62_state,youjyudn)
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(m62_state::horizon)
+void m62_state::horizon(machine_config &config)
+{
ldrun(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(horizon_map)
+ m_maincpu->set_addrmap(AS_PROGRAM, &m62_state::horizon_map);
/* video hardware */
- MCFG_SCREEN_MODIFY("screen")
- MCFG_SCREEN_VISIBLE_AREA((64*8-256)/2, 64*8-(64*8-256)/2-1, 0*8, 32*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(m62_state, screen_update_horizon)
+ subdevice<screen_device>("screen")->set_visarea((64*8-256)/2, 64*8-(64*8-256)/2-1, 0*8, 32*8-1);
+ subdevice<screen_device>("screen")->set_screen_update(FUNC(m62_state::screen_update_horizon));
MCFG_VIDEO_START_OVERRIDE(m62_state,horizon)
-MACHINE_CONFIG_END
+}
/***************************************************************************
diff --git a/src/mame/drivers/m63.cpp b/src/mame/drivers/m63.cpp
index 6c2016619e8..cebcc902653 100644
--- a/src/mame/drivers/m63.cpp
+++ b/src/mame/drivers/m63.cpp
@@ -413,13 +413,13 @@ WRITE8_MEMBER(m63_state::snd_irq_w)
WRITE8_MEMBER(m63_state::snddata_w)
{
if ((m_p2 & 0xf0) == 0xe0)
- m_ay1->address_w(space, 0, offset);
+ m_ay1->address_w(offset);
else if ((m_p2 & 0xf0) == 0xa0)
- m_ay1->data_w(space, 0, offset);
+ m_ay1->data_w(offset);
else if (m_ay2 != nullptr && (m_p1 & 0xe0) == 0x60)
- m_ay2->address_w(space, 0, offset);
+ m_ay2->address_w(offset);
else if (m_ay2 != nullptr && (m_p1 & 0xe0) == 0x40)
- m_ay2->data_w(space, 0, offset);
+ m_ay2->data_w(offset);
else if ((m_p2 & 0xf0) == 0x70 )
m_sound_status = offset;
}
@@ -755,8 +755,8 @@ INTERRUPT_GEN_MEMBER(m63_state::vblank_irq)
device.execute().pulse_input_line(INPUT_LINE_NMI, attotime::zero);
}
-MACHINE_CONFIG_START(m63_state::m63)
-
+void m63_state::m63(machine_config &config)
+{
/* basic machine hardware */
Z80(config, m_maincpu, XTAL(12'000'000)/4); /* 3 MHz */
m_maincpu->set_addrmap(AS_PROGRAM, &m63_state::m63_map);
diff --git a/src/mame/drivers/m6805evs.cpp b/src/mame/drivers/m6805evs.cpp
index a7789452380..0212023cd9a 100644
--- a/src/mame/drivers/m6805evs.cpp
+++ b/src/mame/drivers/m6805evs.cpp
@@ -102,13 +102,14 @@ void m6805evs_state::machine_reset()
{
}
-MACHINE_CONFIG_START(m6805evs_state::m6805evs)
+void m6805evs_state::m6805evs(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M6805, XTAL(4'000'000))
+ M6805(config, m_maincpu, XTAL(4'000'000));
// Needs a 13-bits address bus wide version of the cpu
-// MCFG_DEVICE_PROGRAM_MAP(mem_map)
-MACHINE_CONFIG_END
+// m_maincpu->set_addrmap(AS_PROGRAM, &m6805evs_state::mem_map);
+}
ROM_START(m6805evs)
ROM_REGION(0x2000, "eprom", 0)
diff --git a/src/mame/drivers/m72.cpp b/src/mame/drivers/m72.cpp
index 0ce6cad4fc5..87a4d16f218 100644
--- a/src/mame/drivers/m72.cpp
+++ b/src/mame/drivers/m72.cpp
@@ -310,7 +310,7 @@ TIMER_CALLBACK_MEMBER(m72_state::delayed_ram16_w)
uint16_t mem_mask = (BIT(param, 28) ? 0xff00 : 0x0000) | (BIT(param, 27) ? 0x00ff : 0x0000);
logerror("MB8421/MB8431 left_w(0x%03x, 0x%04x, 0x%04x)\n", offset, val, mem_mask);
- m_dpram->left_w(machine().dummy_space(), offset, val, mem_mask);
+ m_dpram->left_w(offset, val, mem_mask);
}
TIMER_CALLBACK_MEMBER(m72_state::delayed_ram8_w)
@@ -319,9 +319,9 @@ TIMER_CALLBACK_MEMBER(m72_state::delayed_ram8_w)
uint16_t offset = (param >> 9) & 0x07ff;
if (BIT(param, 8))
- m_dpram->right_w(machine().dummy_space(), offset, val << 8, 0xff00);
+ m_dpram->right_w(offset, val << 8, 0xff00);
else
- m_dpram->right_w(machine().dummy_space(), offset, val, 0x00ff);
+ m_dpram->right_w(offset, val, 0x00ff);
}
@@ -337,7 +337,7 @@ WRITE8_MEMBER(m72_state::mcu_data_w)
READ8_MEMBER(m72_state::mcu_data_r)
{
- return (m_dpram->right_r(space, offset >> 1) >> (BIT(offset, 0) ? 8 : 0)) & 0xff;
+ return (m_dpram->right_r(offset >> 1) >> (BIT(offset, 0) ? 8 : 0)) & 0xff;
}
READ8_MEMBER(m72_state::mcu_sample_r)
@@ -1822,13 +1822,12 @@ void m72_state::m72_audio_chips(machine_config &config)
DAC_8BIT_R2R(config, "dac", 0).add_route(ALL_OUTPUTS, "speaker", 0.2); // unknown DAC
voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref", 0));
- vref.set_output(5.0);
vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT);
vref.add_route(0, "dac", -1.0, DAC_VREF_NEG_INPUT);
}
-MACHINE_CONFIG_START(m72_state::m72_base)
-
+void m72_state::m72_base(machine_config &config)
+{
/* basic machine hardware */
V30(config, m_maincpu, MASTER_CLOCK/2/2); /* 16 MHz external freq (8MHz internal) */
m_maincpu->set_addrmap(AS_PROGRAM, &m72_state::m72_map);
@@ -1918,96 +1917,94 @@ void m72_state::m72_dbreed(machine_config &config)
/****************************************** M81 ***********************************************/
// M81 is closest to M72
-MACHINE_CONFIG_START(m72_state::m81_hharry)
+void m72_state::m81_hharry(machine_config &config)
+{
m72_base(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(hharry_map)
- MCFG_DEVICE_IO_MAP(m81_portmap)
+ m_maincpu->set_addrmap(AS_PROGRAM, &m72_state::hharry_map);
+ m_maincpu->set_addrmap(AS_IO, &m72_state::m81_portmap);
- MCFG_DEVICE_MODIFY("soundcpu")
- MCFG_DEVICE_PROGRAM_MAP(sound_rom_map)
- MCFG_DEVICE_IO_MAP(rtype2_sound_portmap)
- MCFG_DEVICE_PERIODIC_INT_DRIVER(m72_state, nmi_line_pulse, 128*55)
+ m_soundcpu->set_addrmap(AS_PROGRAM, &m72_state::sound_rom_map);
+ m_soundcpu->set_addrmap(AS_IO, &m72_state::rtype2_sound_portmap);
+ m_soundcpu->set_periodic_int(FUNC(m72_state::nmi_line_pulse), attotime::from_hz(128*55));
MCFG_VIDEO_START_OVERRIDE(m72_state,hharry)
- MCFG_SCREEN_MODIFY("screen")
- MCFG_SCREEN_UPDATE_DRIVER(m72_state, screen_update_m81)
-MACHINE_CONFIG_END
+ m_screen->set_screen_update(FUNC(m72_state::screen_update_m81));
+}
-MACHINE_CONFIG_START(m72_state::m81_xmultipl)
+void m72_state::m81_xmultipl(machine_config &config)
+{
m81_hharry(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(xmultipl_map)
+ m_maincpu->set_addrmap(AS_PROGRAM, &m72_state::xmultipl_map);
MCFG_VIDEO_START_OVERRIDE(m72_state,xmultipl) // different offsets
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(m72_state::m81_dbreed)
+void m72_state::m81_dbreed(machine_config &config)
+{
m81_xmultipl(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(dbreed_map)
-MACHINE_CONFIG_END
+ m_maincpu->set_addrmap(AS_PROGRAM, &m72_state::dbreed_map);
+}
/****************************************** M84 ***********************************************/
// M84
-MACHINE_CONFIG_START(m72_state::rtype2)
-
+void m72_state::rtype2(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", V30,MASTER_CLOCK/2/2) /* 16 MHz external freq (8MHz internal) */
- MCFG_DEVICE_PROGRAM_MAP(rtype2_map)
- MCFG_DEVICE_IO_MAP(m84_portmap)
- MCFG_DEVICE_IRQ_ACKNOWLEDGE_DEVICE("upd71059c", pic8259_device, inta_cb)
-
- MCFG_DEVICE_ADD(m_soundcpu, Z80, SOUND_CLOCK)
- MCFG_DEVICE_PROGRAM_MAP(sound_rom_map)
- MCFG_DEVICE_IO_MAP(rtype2_sound_portmap)
- MCFG_DEVICE_PERIODIC_INT_DRIVER(m72_state, nmi_line_pulse, 128*55) /* clocked by V1? (Vigilante) */
+ V30(config, m_maincpu, MASTER_CLOCK/2/2); /* 16 MHz external freq (8MHz internal) */
+ m_maincpu->set_addrmap(AS_PROGRAM, &m72_state::rtype2_map);
+ m_maincpu->set_addrmap(AS_IO, &m72_state::m84_portmap);
+ m_maincpu->set_irq_acknowledge_callback("upd71059c", FUNC(pic8259_device::inta_cb));
+
+ Z80(config, m_soundcpu, SOUND_CLOCK);
+ m_soundcpu->set_addrmap(AS_PROGRAM, &m72_state::sound_rom_map);
+ m_soundcpu->set_addrmap(AS_IO, &m72_state::rtype2_sound_portmap);
+ m_soundcpu->set_periodic_int(FUNC(m72_state::nmi_line_pulse), attotime::from_hz(128*55)); /* clocked by V1? (Vigilante) */
/* IRQs are generated by main Z80 and YM2151 */
PIC8259(config, m_upd71059c, 0);
m_upd71059c->out_int_callback().set_inputline(m_maincpu, 0);
/* video hardware */
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_rtype2)
- MCFG_PALETTE_ADD("palette", 512)
+ GFXDECODE(config, m_gfxdecode, m_palette, gfx_rtype2);
+ PALETTE(config, m_palette).set_entries(512);
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_RAW_PARAMS(MASTER_CLOCK/4, 512, 64, 448, 284, 0, 256)
- MCFG_SCREEN_UPDATE_DRIVER(m72_state, screen_update)
- MCFG_SCREEN_PALETTE("palette")
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_raw(MASTER_CLOCK/4, 512, 64, 448, 284, 0, 256);
+ m_screen->set_screen_update(FUNC(m72_state::screen_update));
+ m_screen->set_palette(m_palette);
MCFG_VIDEO_START_OVERRIDE(m72_state,rtype2)
m72_audio_chips(config);
-MACHINE_CONFIG_END
+}
// not m72, different video system (less tiles regions?) (M84? M82?)
-MACHINE_CONFIG_START(m72_state::hharryu)
+void m72_state::hharryu(machine_config &config)
+{
rtype2(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(hharryu_map)
+ m_maincpu->set_addrmap(AS_PROGRAM, &m72_state::hharryu_map);
MCFG_VIDEO_START_OVERRIDE(m72_state,hharryu)
-MACHINE_CONFIG_END
+}
// M84
-MACHINE_CONFIG_START(m72_state::cosmccop)
-
+void m72_state::cosmccop(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", V35,MASTER_CLOCK/2)
- MCFG_DEVICE_PROGRAM_MAP(kengo_map)
- MCFG_DEVICE_IO_MAP(m84_v33_portmap)
-
- MCFG_DEVICE_ADD(m_soundcpu, Z80, SOUND_CLOCK)
- MCFG_DEVICE_PROGRAM_MAP(sound_rom_map)
- MCFG_DEVICE_IO_MAP(rtype2_sound_portmap)
- MCFG_DEVICE_PERIODIC_INT_DRIVER(m72_state, nmi_line_pulse, 128*55) /* clocked by V1? (Vigilante) */
+ V35(config, m_maincpu, MASTER_CLOCK/2);
+ m_maincpu->set_addrmap(AS_PROGRAM, &m72_state::kengo_map);
+ m_maincpu->set_addrmap(AS_IO, &m72_state::m84_v33_portmap);
+
+ Z80(config, m_soundcpu, SOUND_CLOCK);
+ m_soundcpu->set_addrmap(AS_PROGRAM, &m72_state::sound_rom_map);
+ m_soundcpu->set_addrmap(AS_IO, &m72_state::rtype2_sound_portmap);
+ m_soundcpu->set_periodic_int(FUNC(m72_state::nmi_line_pulse), attotime::from_hz(128*55)); /* clocked by V1? (Vigilante) */
/* IRQs are generated by main Z80 and YM2151 */
MCFG_MACHINE_START_OVERRIDE(m72_state,kengo)
@@ -2016,18 +2013,18 @@ MACHINE_CONFIG_START(m72_state::cosmccop)
// upd71059c isn't needed because the V35 has its own IRQ controller
/* video hardware */
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_rtype2)
- MCFG_PALETTE_ADD("palette", 512)
+ GFXDECODE(config, m_gfxdecode, m_palette, gfx_rtype2);
+ PALETTE(config, m_palette).set_entries(512);
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_RAW_PARAMS(MASTER_CLOCK/4, 512, 64, 448, 284, 0, 256)
- MCFG_SCREEN_UPDATE_DRIVER(m72_state, screen_update)
- MCFG_SCREEN_PALETTE("palette")
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_raw(MASTER_CLOCK/4, 512, 64, 448, 284, 0, 256);
+ m_screen->set_screen_update(FUNC(m72_state::screen_update));
+ m_screen->set_palette(m_palette);
MCFG_VIDEO_START_OVERRIDE(m72_state,hharryu)
m72_audio_chips(config);
-MACHINE_CONFIG_END
+}
void m72_state::kengo(machine_config &config)
{
@@ -2044,52 +2041,53 @@ M82-A-A as the top board
M82-B-A and as the bottom board
*/
-MACHINE_CONFIG_START(m72_state::m82)
-
+void m72_state::m82(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", V30,MASTER_CLOCK/2/2) /* 16 MHz external freq (8MHz internal) */
- MCFG_DEVICE_PROGRAM_MAP(m82_map)
- MCFG_DEVICE_IO_MAP(m82_portmap)
- MCFG_DEVICE_IRQ_ACKNOWLEDGE_DEVICE("upd71059c", pic8259_device, inta_cb)
- MCFG_DEVICE_ADD(m_soundcpu, Z80, SOUND_CLOCK)
- MCFG_DEVICE_PROGRAM_MAP(sound_rom_map)
- MCFG_DEVICE_IO_MAP(rtype2_sound_portmap)
- MCFG_DEVICE_PERIODIC_INT_DRIVER(m72_state, nmi_line_pulse, 128*55) /* clocked by V1? (Vigilante) */
+ V30(config, m_maincpu, MASTER_CLOCK/2/2); /* 16 MHz external freq (8MHz internal) */
+ m_maincpu->set_addrmap(AS_PROGRAM, &m72_state::m82_map);
+ m_maincpu->set_addrmap(AS_IO, &m72_state::m82_portmap);
+ m_maincpu->set_irq_acknowledge_callback("upd71059c", FUNC(pic8259_device::inta_cb));
+ Z80(config, m_soundcpu, SOUND_CLOCK);
+ m_soundcpu->set_addrmap(AS_PROGRAM, &m72_state::sound_rom_map);
+ m_soundcpu->set_addrmap(AS_IO, &m72_state::rtype2_sound_portmap);
+ m_soundcpu->set_periodic_int(FUNC(m72_state::nmi_line_pulse), attotime::from_hz(128*55)); /* clocked by V1? (Vigilante) */
/* IRQs are generated by main Z80 and YM2151 */
PIC8259(config, m_upd71059c, 0);
m_upd71059c->out_int_callback().set_inputline(m_maincpu, 0);
/* video hardware */
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_majtitle)
- MCFG_PALETTE_ADD("palette", 512)
+ GFXDECODE(config, m_gfxdecode, m_palette, gfx_majtitle);
+ PALETTE(config, m_palette).set_entries(512);
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_RAW_PARAMS(MASTER_CLOCK/4, 512, 64, 448, 284, 0, 256)
- MCFG_SCREEN_UPDATE_DRIVER(m72_state, screen_update_m82)
- MCFG_SCREEN_PALETTE("palette")
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_raw(MASTER_CLOCK/4, 512, 64, 448, 284, 0, 256);
+ m_screen->set_screen_update(FUNC(m72_state::screen_update_m82));
+ m_screen->set_palette(m_palette);
MCFG_VIDEO_START_OVERRIDE(m72_state,m82)
m72_audio_chips(config);
-MACHINE_CONFIG_END
+}
/* Pound for Pound uses
M85-A-B / M85-B
*/
-MACHINE_CONFIG_START(m72_state::poundfor)
-
+void m72_state::poundfor(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", V30,MASTER_CLOCK/2/2) /* 16 MHz external freq (8MHz internal) */
- MCFG_DEVICE_PROGRAM_MAP(rtype2_map)
- MCFG_DEVICE_IO_MAP(poundfor_portmap)
- MCFG_DEVICE_IRQ_ACKNOWLEDGE_DEVICE("upd71059c", pic8259_device, inta_cb)
- MCFG_DEVICE_ADD(m_soundcpu, Z80, SOUND_CLOCK)
- MCFG_DEVICE_PROGRAM_MAP(sound_rom_map)
- MCFG_DEVICE_IO_MAP(poundfor_sound_portmap)
- MCFG_DEVICE_PERIODIC_INT_DRIVER(m72_state, fake_nmi, 128*55) /* clocked by V1? (Vigilante) */
+ V30(config, m_maincpu, MASTER_CLOCK/2/2); /* 16 MHz external freq (8MHz internal) */
+ m_maincpu->set_addrmap(AS_PROGRAM, &m72_state::rtype2_map);
+ m_maincpu->set_addrmap(AS_IO, &m72_state::poundfor_portmap);
+ m_maincpu->set_irq_acknowledge_callback("upd71059c", FUNC(pic8259_device::inta_cb));
+
+ Z80(config, m_soundcpu, SOUND_CLOCK);
+ m_soundcpu->set_addrmap(AS_PROGRAM, &m72_state::sound_rom_map);
+ m_soundcpu->set_addrmap(AS_IO, &m72_state::poundfor_sound_portmap);
+ m_soundcpu->set_periodic_int(FUNC(m72_state::fake_nmi), attotime::from_hz(128*55)); /* clocked by V1? (Vigilante) */
/* IRQs are generated by main Z80 and YM2151 */
PIC8259(config, m_upd71059c, 0);
@@ -2104,18 +2102,18 @@ MACHINE_CONFIG_START(m72_state::poundfor)
m_upd4701[1]->set_porty_tag("TRACK1_Y");
/* video hardware */
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_rtype2)
- MCFG_PALETTE_ADD("palette", 512)
+ GFXDECODE(config, m_gfxdecode, m_palette, gfx_rtype2);
+ PALETTE(config, m_palette).set_entries(512);
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_RAW_PARAMS(MASTER_CLOCK/4, 512, 64, 448, 284, 0, 256)
- MCFG_SCREEN_UPDATE_DRIVER(m72_state, screen_update)
- MCFG_SCREEN_PALETTE("palette")
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_raw(MASTER_CLOCK/4, 512, 64, 448, 284, 0, 256);
+ m_screen->set_screen_update(FUNC(m72_state::screen_update));
+ m_screen->set_palette(m_palette);
MCFG_VIDEO_START_OVERRIDE(m72_state,poundfor)
m72_audio_chips(config);
-MACHINE_CONFIG_END
+}
/***************************************************************************
@@ -2674,6 +2672,49 @@ ROM_START( imgfightj )
ROM_LOAD( "if-c-v1.bin", 0x10000, 0x10000, CRC(45b68bf5) SHA1(2fb28793019ca85b3b6d7c4c31eedff1d71f2d83) )
ROM_END
+ROM_START( imgfightb ) // mostly identical to imgfightj
+ ROM_REGION( 0x100000, "maincpu", 0 ) // identical, but ic111.9e
+ ROM_LOAD16_BYTE( "ic108.9b", 0x00001, 0x10000, CRC(592d2d80) SHA1(d54916a9bfe4b65a972b62202af706135e73518d) )
+ ROM_LOAD16_BYTE( "ic89.7b", 0x00000, 0x10000, CRC(61f89056) SHA1(3e0724dbc2b00a30193ea6cfac8b4331055d4fd4) )
+ ROM_LOAD16_BYTE( "ic111.9e", 0x40001, 0x10000, CRC(da50622e) SHA1(32c75b6270d401a6825632c66f3026cae7b5b81f) ) // slight difference: 99.998474%: 0x1116 from 0x09 to 0x0d
+ ROM_RELOAD( 0xc0001, 0x10000 )
+ ROM_LOAD16_BYTE( "ic110.9d", 0x60001, 0x10000, CRC(0e0aefcd) SHA1(f5056a2d0612d912aff1e0eccb1182de7ae16990) )
+ ROM_RELOAD( 0xe0001, 0x10000 )
+ ROM_LOAD16_BYTE( "ic92.7e", 0x40000, 0x10000, CRC(38fce272) SHA1(4fe4d0838d21f3022b440a32ec69b25e936e62dd) )
+ ROM_RELOAD( 0xc0000, 0x10000 )
+ ROM_LOAD16_BYTE( "ic91.7d", 0x60000, 0x10000, CRC(d69c0722) SHA1(ef18e7b7057f19caaa61d0b8c07d2d0c6e0a555e) )
+ ROM_RELOAD( 0xe0000, 0x10000 )
+
+ ROM_REGION( 0x10000, "mcu", 0 )
+ ROM_LOAD( "25.ic27.2l", 0x00000, 0x2000, CRC(3e66c629) SHA1(e1da7a85dd0a20c8692ceca188883c2abb5b816d) ) // i80c31 instead of i8751, FIXED BITS (xxxxxxxxxxxxxxx0)
+
+ ROM_REGION( 0x080000, "sprites", 0 ) // half size ROMs, but identical content
+ ROM_LOAD( "ic96.7k", 0x00000, 0x10000, CRC(d4febb03) SHA1(6fe53b198bdcef1708ff134c64af9c064e274e1b) ) /* sprites */
+ ROM_LOAD( "ic97.7l", 0x10000, 0x10000, CRC(973d7bbc) SHA1(409242ddc7eb90564a15b222641e53d11ab1e04a) )
+ ROM_LOAD( "ic115.9k", 0x20000, 0x10000, CRC(2328880b) SHA1(a35c77a7d04614dbfbca4c79bb3e729115129ee4) )
+ ROM_LOAD( "ic116.9l", 0x30000, 0x10000, CRC(6da001ea) SHA1(473ed89b77809b3b76bfa9f5ca4008c9534cdbb4) )
+ ROM_LOAD( "ic94.7h", 0x40000, 0x10000, CRC(92bc7fda) SHA1(521d4a29e06eb8790fdeeba968f99a389f50a24e) )
+ ROM_LOAD( "ic95.7j", 0x50000, 0x10000, CRC(e63a5918) SHA1(fd3374866f922cef72c0678aa751ad1e6f95a12a) )
+ ROM_LOAD( "ic113.9h", 0x60000, 0x10000, CRC(27caec8e) SHA1(cc1943ba9548715425e799f418750cd70c3f88da) )
+ ROM_LOAD( "ic114.9j", 0x70000, 0x10000, CRC(1933eb65) SHA1(4c24cfd059c11875f53b57cc020fbdbac903bd4a) )
+
+ ROM_REGION( 0x040000, "gfx2", 0 ) // identical
+ ROM_LOAD( "ic30.3d", 0x00000, 0x10000, CRC(34ee2d77) SHA1(38826e0318aa8da893fa4c93f217288c015df606) ) /* tiles #1 */
+ ROM_LOAD( "ic31.3e", 0x10000, 0x10000, CRC(6bd2845b) SHA1(149cf14f919590da88b9a8e254690da010709862) )
+ ROM_LOAD( "ic29.3c", 0x20000, 0x10000, CRC(090d50e5) SHA1(4f2a7c76320b3f8dafae90a246187e034fe7562b) )
+ ROM_LOAD( "ic32.3f", 0x30000, 0x10000, CRC(3a8e3083) SHA1(8a75d556790b6bea41ead1a5f95589dd293bdf4e) )
+
+ ROM_REGION( 0x040000, "gfx3", 0 ) // identical
+ ROM_LOAD( "ic35.3k", 0x00000, 0x10000, CRC(b425c829) SHA1(0ccd487dba00bb7cb0ff5d1c67f8fee3e68df5d8) ) /* tiles #2 */
+ ROM_LOAD( "ic36.3l", 0x10000, 0x10000, CRC(e9bfe23e) SHA1(f97a68dbdce7e06d07faab19acf7625cdc8eeaa8) )
+ ROM_LOAD( "ic34.3j", 0x20000, 0x10000, CRC(256e50f2) SHA1(9e9fda4f1f1449548942c0da4478f61fe0d263d1) )
+ ROM_LOAD( "ic33.3h", 0x30000, 0x10000, CRC(4c682785) SHA1(f61f1227e0ad629fdfca106306b17a9f6a9959e3) )
+
+ ROM_REGION( 0x20000, "samples", 0 ) /* samples, identical */
+ ROM_LOAD( "ic28.lower.2n.bin", 0x00000, 0x10000, CRC(cb64a194) SHA1(940fad6b9147bccc8290e112f5973f8ea062b52f) )
+ ROM_LOAD( "ic28.lower.2n.bin", 0x10000, 0x10000, CRC(45b68bf5) SHA1(2fb28793019ca85b3b6d7c4c31eedff1d71f2d83) )
+ROM_END
+
ROM_START( loht )
ROM_REGION( 0x100000, "maincpu", 0 )
ROM_LOAD16_BYTE( "tom_c-h0.rom", 0x00001, 0x20000, CRC(a63204b6) SHA1(d217bc70650a1a1bbe0cf536ec3bb678f670718d) )
@@ -2908,7 +2949,7 @@ ROM_START( lohtb3 ) // extremely similar to the original. Copyright changed to 1
ROM_RELOAD( 0xe0000, 0x10000 )
ROM_REGION( 0x10000, "mcu", 0 )
- ROM_LOAD( "loht-a26.bin", 0x00000, 0x02000, BAD_DUMP CRC(ac901e17) SHA1(70a73288d594c78ad2aca78ce55a699cb040bede) ) // undumped, using the dump from lohtb2 for now
+ ROM_LOAD( "c8751h.bin", 0x00000, 0x01000, CRC(9c9545f1) SHA1(ca800ce7467efb877d0fff4c47d72478a991e2a9) )
ROM_REGION( 0x080000, "sprites", 0 )
ROM_LOAD( "i-8.8", 0x00000, 0x10000, CRC(df5ac5ee) SHA1(5b45417ada402047d97dfb6cee6545686ad26e37) )
@@ -3832,11 +3873,12 @@ GAME( 1988, nspiritj, nspirit, m72_8751, nspirit, m72_state, init_m
GAME( 1988, imgfight, 0, m72, imgfight, m72_state, init_imgfight, ROT270, "Irem", "Image Fight (World, revision A)", MACHINE_SUPPORTS_SAVE ) // doesn't wait / check for japan warning string.. fails rom check if used with japanese mcu rom (World version?)
GAME( 1988, imgfightj, imgfight, m72_8751, imgfight, m72_state, init_m72_8751, ROT270, "Irem", "Image Fight (Japan)", MACHINE_SUPPORTS_SAVE ) // waits for japan warning screen, works with our mcu dump, can't actually see warning screen due to priority / mixing errors, check tilemap viewer (Japan Version)
+GAME( 1988, imgfightb, imgfight, m72, imgfight, m72_state, init_imgfight, ROT270, "Irem", "Image Fight (Japan, bootleg)", MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE ) // uses an 80c31 MCU, which isn't hooked up yet
GAME( 1989, loht, 0, m72, loht, m72_state, init_loht, ROT0, "Irem", "Legend of Hero Tonma", MACHINE_NO_COCKTAIL | MACHINE_SUPPORTS_SAVE ) // fails rom check if used with Japan MCU rom (World version?)
GAME( 1989, lohtj, loht, m72_8751, loht, m72_state, init_m72_8751, ROT0, "Irem", "Legend of Hero Tonma (Japan)", MACHINE_NO_COCKTAIL | MACHINE_SUPPORTS_SAVE ) // waits for japan warning screen, works with our mcu dump (Japan Version)
GAME( 1989, lohtb2, loht, m72_8751, loht, m72_state, init_m72_8751, ROT0, "bootleg", "Legend of Hero Tonma (Japan, bootleg with i8751)", MACHINE_NO_COCKTAIL | MACHINE_SUPPORTS_SAVE ) // works like above, mcu code is the same as the real code, probably just an alt revision on a bootleg board
-GAME( 1997, lohtb3, loht, m72_8751, loht, m72_state, init_m72_8751, ROT0, "bootleg", "Legend of Hero Tonma (World, bootleg with i8751)", MACHINE_NO_COCKTAIL | MACHINE_SUPPORTS_SAVE ) // works like above, mcu code is the same as the real code, probably just an alt revision on a bootleg board
+GAME( 1997, lohtb3, loht, m72_8751, loht, m72_state, init_m72_8751, ROT0, "bootleg", "Legend of Hero Tonma (World, bootleg with i8751)", MACHINE_NO_COCKTAIL | MACHINE_SUPPORTS_SAVE )
GAME( 1989, xmultiplm72, xmultipl, m72_xmultipl, xmultipl, m72_state, init_m72_8751, ROT0, "Irem", "X Multiply (Japan, M72)", MACHINE_NO_COCKTAIL | MACHINE_SUPPORTS_SAVE )
diff --git a/src/mame/drivers/m79152pc.cpp b/src/mame/drivers/m79152pc.cpp
index bc0317a1896..a84453b6bec 100644
--- a/src/mame/drivers/m79152pc.cpp
+++ b/src/mame/drivers/m79152pc.cpp
@@ -264,7 +264,8 @@ static const z80_daisy_config daisy_chain[] =
{ nullptr }
};
-MACHINE_CONFIG_START(m79152pc_state::m79152pc)
+void m79152pc_state::m79152pc(machine_config &config)
+{
/* basic machine hardware */
Z80(config, m_maincpu, 4'000'000); // UA880D
m_maincpu->set_addrmap(AS_PROGRAM, &m79152pc_state::mem_map);
@@ -287,7 +288,7 @@ MACHINE_CONFIG_START(m79152pc_state::m79152pc)
m_screen->set_screen_update(FUNC(m79152pc_state::screen_update));
m_screen->set_palette("palette");
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_m79152pc)
+ GFXDECODE(config, "gfxdecode", "palette", gfx_m79152pc);
PALETTE(config, "palette", palette_device::MONOCHROME);
pit8253_device &pit(PIT8253(config, "pit", 0)); // КР580ВИ53
@@ -342,7 +343,7 @@ MACHINE_CONFIG_START(m79152pc_state::m79152pc)
SPEAKER(config, "mono").front_center();
BEEP(config, m_beep, 1000);
m_beep->add_route(ALL_OUTPUTS, "mono", 0.50);
-MACHINE_CONFIG_END
+}
/* ROM definition */
ROM_START( m79152pc )
diff --git a/src/mame/drivers/m79amb.cpp b/src/mame/drivers/m79amb.cpp
index f06097e01ab..4dc3beb74cc 100644
--- a/src/mame/drivers/m79amb.cpp
+++ b/src/mame/drivers/m79amb.cpp
@@ -194,27 +194,26 @@ INTERRUPT_GEN_MEMBER(m79amb_state::m79amb_interrupt)
device.execute().set_input_line_and_vector(0, HOLD_LINE, 0xcf); /* RST 08h */
}
-MACHINE_CONFIG_START(m79amb_state::m79amb)
-
+void m79amb_state::m79amb(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", I8080, XTAL(19'660'800) / 10)
- MCFG_DEVICE_PROGRAM_MAP(main_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", m79amb_state, m79amb_interrupt)
+ I8080(config, m_maincpu, XTAL(19'660'800) / 10);
+ m_maincpu->set_addrmap(AS_PROGRAM, &m79amb_state::main_map);
+ m_maincpu->set_vblank_int("screen", FUNC(m79amb_state::m79amb_interrupt));
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */)
- MCFG_SCREEN_SIZE(32*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 4*8, 32*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(m79amb_state, screen_update_ramtek)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500) /* not accurate */);
+ screen.set_size(32*8, 32*8);
+ screen.set_visarea(0*8, 32*8-1, 4*8, 32*8-1);
+ screen.set_screen_update(FUNC(m79amb_state::screen_update_ramtek));
/* sound hardware */
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("discrete", DISCRETE, m79amb_discrete)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
-MACHINE_CONFIG_END
+ DISCRETE(config, m_discrete, m79amb_discrete).add_route(ALL_OUTPUTS, "mono", 1.0);
+}
diff --git a/src/mame/drivers/m90.cpp b/src/mame/drivers/m90.cpp
index ceff4b12215..b51f058c2a5 100644
--- a/src/mame/drivers/m90.cpp
+++ b/src/mame/drivers/m90.cpp
@@ -774,7 +774,6 @@ void m90_state::m90(machine_config &config)
DAC_8BIT_R2R(config, "dac", 0).add_route(ALL_OUTPUTS, "speaker", 0.1); // unknown DAC
voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref", 0));
- vref.set_output(5.0);
vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT);
vref.add_route(0, "dac", -1.0, DAC_VREF_NEG_INPUT);
}
@@ -1139,23 +1138,32 @@ ROM_START( newapunk )
ROM_LOAD( "bbm2-v0.30", 0x0000, 0x20000, CRC(4ad889ed) SHA1(b685892a2348f17f89c6d6ce91216f6cf1e33751) )
ROM_END
+//PCB is marked: "BOMBER LORD 030" and "lc" on component side ("LC" is the Italian for "Lato Componenti" which translates to "Components Side")
+//PCB is marked: "BOMBER LORD 030" and "ls" on solder side ("LS" is the Italian for "Lato Saldature" which translates to "Solders Side")
ROM_START( bomblord )
ROM_REGION( CODE_SIZE, "maincpu", 0 )
- ROM_LOAD16_BYTE( "bomblord.3", 0x00001, 0x40000, CRC(65d5c54a) SHA1(f794a193d5927b5fb838ab2351c176d8cbd37236) )
- ROM_LOAD16_BYTE( "bomblord.4", 0x00000, 0x40000, CRC(cfe65f81) SHA1(8dae94abc67bc53f1c8dbe13243dc08a62fd5d22) )
+ ROM_LOAD16_BYTE( "27c020_3.u6", 0x00001, 0x40000, CRC(65d5c54a) SHA1(f794a193d5927b5fb838ab2351c176d8cbd37236) )
+ ROM_LOAD16_BYTE( "27c020_4.u5", 0x00000, 0x40000, CRC(cfe65f81) SHA1(8dae94abc67bc53f1c8dbe13243dc08a62fd5d22) )
ROM_COPY( "maincpu", 0x7fff0, 0xffff0, 0x10 ) /* start vector */
ROM_REGION( 0x10000, "soundcpu", 0 )
- ROM_LOAD( "bbm2-sp.33", 0x0000, 0x10000, CRC(6bc1689e) SHA1(099c275632965e19eb6131863f69d2afa9916e90) ) // bomblord.1
+ ROM_LOAD( "27c512_1.u100", 0x0000, 0x10000, CRC(6bc1689e) SHA1(099c275632965e19eb6131863f69d2afa9916e90) )
ROM_REGION( 0x200000, "gfx1", 0 )
- ROM_LOAD( "bomblord.5", 0x000000, 0x40000, CRC(3ded3278) SHA1(2fec2f10d875e44d966b6f652e3b09308db9b343) )
- ROM_LOAD( "bomblord.6", 0x080000, 0x40000, CRC(1c489632) SHA1(f4412b138e4933c8d152ec51d05baa02abc7fc00) )
- ROM_LOAD( "bomblord.7", 0x100000, 0x40000, CRC(68935e94) SHA1(6725c7ad49bd0ee6ed1db22193852a11cdf95aaa) )
- ROM_LOAD( "bomblord.8", 0x180000, 0x40000, CRC(6a423b24) SHA1(d30dac90a7dc2a616714eae7450ae0edef566c31) )
+ ROM_LOAD( "27c020_5.u69", 0x000000, 0x40000, CRC(3ded3278) SHA1(2fec2f10d875e44d966b6f652e3b09308db9b343) )
+ ROM_LOAD( "27c020_6.u70", 0x080000, 0x40000, CRC(1c489632) SHA1(f4412b138e4933c8d152ec51d05baa02abc7fc00) )
+ ROM_LOAD( "27c020_7.u71", 0x100000, 0x40000, CRC(cc2b6237) SHA1(8450edac25817afdc393e2e6960fec4da382d2c9) )
+ // previous 7.u71 dump had a single different byte at 0x86eb: 0x6f instead of 0x2f. Hashes left as a remainder:
+ // ROM_LOAD( "bomblord.7", 0x100000, 0x40000, CRC(68935e94) SHA1(6725c7ad49bd0ee6ed1db22193852a11cdf95aaa) )
+ ROM_LOAD( "27c020_8.u72", 0x180000, 0x40000, CRC(6a423b24) SHA1(d30dac90a7dc2a616714eae7450ae0edef566c31) )
ROM_REGION( 0x20000, "samples", 0 )
- ROM_LOAD( "bomblord.2", 0x0000, 0x20000, CRC(37d356bd) SHA1(15f187954f94e2b1a4757e4a27ab7be9598972ff) )
+ ROM_LOAD( "27c010_2.u104", 0x0000, 0x20000, CRC(37d356bd) SHA1(15f187954f94e2b1a4757e4a27ab7be9598972ff) )
+
+ ROM_REGION( 0x700, "plds", ROMREGION_ERASE00 ) // all read protected
+ ROM_LOAD( "palce16v8h.u45", 0x000, 0x117, NO_DUMP )
+ ROM_LOAD( "palce16v8h.u119", 0x200, 0x117, NO_DUMP )
+ ROM_LOAD( "palce22v10h.u105", 0x400, 0x2dd, NO_DUMP )
ROM_END
ROM_START( quizf1 )
@@ -1183,8 +1191,8 @@ ROM_END
ROM_START( riskchal )
ROM_REGION( CODE_SIZE, "maincpu", 0 )
- ROM_LOAD16_BYTE( "rc_h0.ic77", 0x00001, 0x40000, CRC(4c9b5344) SHA1(61e26950a672c6404e2386acdd098536b61b9933) ) /* Need to verify rom label. Likely L4-A-H0-B */
- ROM_LOAD16_BYTE( "rc_l0.ic79", 0x00000, 0x40000, CRC(0455895a) SHA1(1072b8d280f7ccc48cd8fbd81323e1f8c8d0db95) ) /* Need to verify rom label. Likely L4-A-L0-B */
+ ROM_LOAD16_BYTE( "l4-a-h0-b.ic77", 0x00001, 0x40000, CRC(4c9b5344) SHA1(61e26950a672c6404e2386acdd098536b61b9933) )
+ ROM_LOAD16_BYTE( "l4-a-l0-b.ic79", 0x00000, 0x40000, CRC(0455895a) SHA1(1072b8d280f7ccc48cd8fbd81323e1f8c8d0db95) )
ROM_COPY( "maincpu", 0x7fff0, 0xffff0, 0x10 ) /* start vector */
ROM_REGION( 0x10000, "soundcpu", 0 )
diff --git a/src/mame/drivers/mac.cpp b/src/mame/drivers/mac.cpp
index e998b013cfb..7c086b41a79 100644
--- a/src/mame/drivers/mac.cpp
+++ b/src/mame/drivers/mac.cpp
@@ -546,11 +546,11 @@ READ8_MEMBER(mac_state::mac_5396_r)
{
if (offset < 0x100)
{
- return m_539x_1->read(space, offset>>4);
+ return m_539x_1->read(offset>>4);
}
else // pseudo-DMA: read from the FIFO
{
- return m_539x_1->read(space, 2);
+ return m_539x_1->read(2);
}
// never executed
@@ -561,11 +561,11 @@ WRITE8_MEMBER(mac_state::mac_5396_w)
{
if (offset < 0x100)
{
- m_539x_1->write(space, offset>>4, data);
+ m_539x_1->write(offset>>4, data);
}
else // pseudo-DMA: write to the FIFO
{
- m_539x_1->write(space, 2, data);
+ m_539x_1->write(2, data);
}
}
@@ -1055,7 +1055,6 @@ void mac_state::mac512ke_base(machine_config &config)
DAC_8BIT_PWM(config, m_dac, 0);
m_dac->add_route(ALL_OUTPUTS, "speaker", 0.25); // 2 x ls161
voltage_regulator_device &vreg(VOLTAGE_REGULATOR(config, "vref", 0));
- vreg.set_output(5.0);
vreg.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT);
vreg.add_route(0, "dac", -1.0, DAC_VREF_NEG_INPUT);
@@ -1096,7 +1095,7 @@ void mac_state::add_macplus_additions(machine_config &config)
void mac_state::add_nubus(machine_config &config, bool bank1, bool bank2)
{
nubus_device &nubus(NUBUS(config, "nubus", 0));
- nubus.set_cputag("maincpu");
+ nubus.set_space(m_maincpu, AS_PROGRAM);
nubus.out_irq9_callback().set(FUNC(mac_state::nubus_irq_9_w));
nubus.out_irqa_callback().set(FUNC(mac_state::nubus_irq_a_w));
nubus.out_irqb_callback().set(FUNC(mac_state::nubus_irq_b_w));
@@ -1120,7 +1119,7 @@ void mac_state::add_nubus(machine_config &config, bool bank1, bool bank2)
template <typename T> void mac_state::add_nubus_pds(machine_config &config, const char *slot_tag, T &&opts)
{
nubus_device &nubus(NUBUS(config, "pds", 0));
- nubus.set_cputag("maincpu");
+ nubus.set_space(m_maincpu, AS_PROGRAM);
nubus.out_irq9_callback().set(FUNC(mac_state::nubus_irq_9_w));
nubus.out_irqa_callback().set(FUNC(mac_state::nubus_irq_a_w));
nubus.out_irqb_callback().set(FUNC(mac_state::nubus_irq_b_w));
diff --git a/src/mame/drivers/mac128.cpp b/src/mame/drivers/mac128.cpp
index 43afa8e4e87..3364f1085f6 100644
--- a/src/mame/drivers/mac128.cpp
+++ b/src/mame/drivers/mac128.cpp
@@ -109,8 +109,8 @@ c0 8 data bits, Rx disabled
#define DAC_TAG "macdac"
#define SCC_TAG "scc"
-#define C7M (7833600)
-#define C3_7M (3916800)
+#define C7M (15.6672_MHz_XTAL / 2)
+#define C3_7M (15.6672_MHz_XTAL / 4).value()
// uncomment to run i8021 keyboard in original Mac/512(e)/Plus
//#define MAC_USE_EMULATED_KBD (1)
@@ -1350,7 +1350,7 @@ void mac128_state::mac512ke(machine_config &config)
/* video hardware */
SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
- m_screen->set_raw(C7M*2, MAC_H_TOTAL, 0, MAC_H_VIS, MAC_V_TOTAL, 0, MAC_V_VIS);
+ m_screen->set_raw(15.6672_MHz_XTAL, MAC_H_TOTAL, 0, MAC_H_VIS, MAC_V_TOTAL, 0, MAC_V_VIS);
m_screen->set_screen_update(FUNC(mac128_state::screen_update_mac));
m_screen->set_palette("palette");
@@ -1362,7 +1362,6 @@ void mac128_state::mac512ke(machine_config &config)
SPEAKER(config, "speaker").front_center();
DAC_8BIT_PWM(config, m_dac, 0).add_route(ALL_OUTPUTS, "speaker", 0.25); // 2 x ls161
voltage_regulator_device &vreg(VOLTAGE_REGULATOR(config, "vref"));
- vreg.set_output(5.0);
vreg.add_route(0, DAC_TAG, 1.0, DAC_VREF_POS_INPUT);
vreg.add_route(0, DAC_TAG, -1.0, DAC_VREF_NEG_INPUT);
diff --git a/src/mame/drivers/macp.cpp b/src/mame/drivers/macp.cpp
index 5de847d24c1..3ae5799d64a 100644
--- a/src/mame/drivers/macp.cpp
+++ b/src/mame/drivers/macp.cpp
@@ -53,32 +53,34 @@ INPUT_PORTS_END
static INPUT_PORTS_START( cicplay )
INPUT_PORTS_END
-MACHINE_CONFIG_START(macp_state::macp)
+void macp_state::macp(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, 2500000)
- MCFG_DEVICE_PROGRAM_MAP(macp_map)
- MCFG_DEVICE_IO_MAP(macp_io)
+ Z80(config, m_maincpu, 2500000);
+ m_maincpu->set_addrmap(AS_PROGRAM, &macp_state::macp_map);
+ m_maincpu->set_addrmap(AS_IO, &macp_state::macp_io);
/* video hardware */
- //MCFG_DEFAULT_LAYOUT()
+ //config.set_default_layout();
//I8279
/* sound hardware */
//2x AY8910
genpin_audio(config);
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(macp_state::macp0)
+void macp_state::macp0(machine_config &config)
+{
macp(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(macp0_map)
-MACHINE_CONFIG_END
+ m_maincpu->set_addrmap(AS_PROGRAM, &macp_state::macp0_map);
+}
-MACHINE_CONFIG_START(macp_state::macpmsm)
+void macp_state::macpmsm(machine_config &config)
+{
macp(config);
// MSM5205
-MACHINE_CONFIG_END
+}
ROM_START(macgalxy)
ROM_REGION(0x4000, "maincpu", 0)
diff --git a/src/mame/drivers/macs.cpp b/src/mame/drivers/macs.cpp
index 9674e1335a2..1d4e6d487a1 100644
--- a/src/mame/drivers/macs.cpp
+++ b/src/mame/drivers/macs.cpp
@@ -2,7 +2,7 @@
// copyright-holders:David Haywood
/*
-macs.c - Multi Amenity Cassette System
+macs.cpp - Multi Amenity Cassette System
processor seems to be ST0016 (z80 based) from SETA
@@ -501,6 +501,7 @@ uint8_t macs_state::dma_offset()
return m_cart_bank;
}
+
MACHINE_CONFIG_START(macs_state::macs)
/* basic machine hardware */
ST0016_CPU(config, m_maincpu, 8000000); // 8 MHz ?
diff --git a/src/mame/drivers/madalien.cpp b/src/mame/drivers/madalien.cpp
index a0d3f1863f7..fcd20dcfb1b 100644
--- a/src/mame/drivers/madalien.cpp
+++ b/src/mame/drivers/madalien.cpp
@@ -150,14 +150,14 @@ static INPUT_PORTS_START( madalien )
INPUT_PORTS_END
-MACHINE_CONFIG_START(madalien_state::madalien)
-
+void madalien_state::madalien(machine_config &config)
+{
/* main CPU */
- MCFG_DEVICE_ADD("maincpu", M6502, MADALIEN_MAIN_CLOCK / 8) /* 1324kHz */
- MCFG_DEVICE_PROGRAM_MAP(main_map)
+ M6502(config, m_maincpu, MADALIEN_MAIN_CLOCK / 8); /* 1324kHz */
+ m_maincpu->set_addrmap(AS_PROGRAM, &madalien_state::main_map);
- MCFG_DEVICE_ADD("audiocpu", M6502, SOUND_CLOCK / 8) /* 512kHz */
- MCFG_DEVICE_PROGRAM_MAP(audio_map)
+ M6502(config, m_audiocpu, SOUND_CLOCK / 8); /* 512kHz */
+ m_audiocpu->set_addrmap(AS_PROGRAM, &madalien_state::audio_map);
/* video hardware */
madalien_video(config);
@@ -177,9 +177,8 @@ MACHINE_CONFIG_START(madalien_state::madalien)
aysnd.add_route(1, "discrete", 1.0, 1);
aysnd.add_route(2, "discrete", 1.0, 2);
- MCFG_DEVICE_ADD("discrete", DISCRETE, madalien_discrete)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
-MACHINE_CONFIG_END
+ DISCRETE(config, m_discrete, madalien_discrete).add_route(ALL_OUTPUTS, "mono", 1.0);
+}
ROM_START( madalien )
diff --git a/src/mame/drivers/madmotor.cpp b/src/mame/drivers/madmotor.cpp
index c46dd579df0..2092c8c426b 100644
--- a/src/mame/drivers/madmotor.cpp
+++ b/src/mame/drivers/madmotor.cpp
@@ -258,28 +258,28 @@ uint32_t madmotor_state::screen_update(screen_device &screen, bitmap_ind16 &bitm
/******************************************************************************/
-MACHINE_CONFIG_START(madmotor_state::madmotor)
-
+void madmotor_state::madmotor(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M68000, 12000000) /* Custom chip 59, 24 MHz crystal */
- MCFG_DEVICE_PROGRAM_MAP(madmotor_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", madmotor_state, irq6_line_hold)/* VBL */
+ M68000(config, m_maincpu, 12000000); /* Custom chip 59, 24 MHz crystal */
+ m_maincpu->set_addrmap(AS_PROGRAM, &madmotor_state::madmotor_map);
+ m_maincpu->set_vblank_int("screen", FUNC(madmotor_state::irq6_line_hold)); /* VBL */
H6280(config, m_audiocpu, 8053000/2); /* Custom chip 45, Crystal near CPU is 8.053 MHz */
m_audiocpu->set_addrmap(AS_PROGRAM, &madmotor_state::sound_map);
m_audiocpu->add_route(ALL_OUTPUTS, "mono", 0); // internal sound unused
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_VIDEO_ATTRIBUTES(VIDEO_UPDATE_BEFORE_VBLANK)
- MCFG_SCREEN_REFRESH_RATE(58)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */ /* frames per second, vblank duration taken from Burger Time */)
- MCFG_SCREEN_SIZE(32*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 1*8, 31*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(madmotor_state, screen_update)
- MCFG_SCREEN_PALETTE("palette")
-
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_madmotor)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_video_attributes(VIDEO_UPDATE_BEFORE_VBLANK);
+ screen.set_refresh_hz(58);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500) /* not accurate */ /* frames per second, vblank duration taken from Burger Time */);
+ screen.set_size(32*8, 32*8);
+ screen.set_visarea(0*8, 32*8-1, 1*8, 31*8-1);
+ screen.set_screen_update(FUNC(madmotor_state::screen_update));
+ screen.set_palette("palette");
+
+ GFXDECODE(config, "gfxdecode", "palette", gfx_madmotor);
PALETTE(config, "palette").set_format(palette_device::xBGR_444, 1024);
DECO_BAC06(config, m_tilegen[0], 0);
@@ -303,20 +303,17 @@ MACHINE_CONFIG_START(madmotor_state::madmotor)
GENERIC_LATCH_8(config, "soundlatch").data_pending_callback().set_inputline(m_audiocpu, 0);
- MCFG_DEVICE_ADD("ym1", YM2203, 21470000/6)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.40)
+ YM2203(config, "ym1", 21470000/6).add_route(ALL_OUTPUTS, "mono", 0.40);
ym2151_device &ym2(YM2151(config, "ym2", 21470000/6));
ym2.irq_handler().set_inputline(m_audiocpu, 1); /* IRQ2 */
ym2.add_route(0, "mono", 0.45);
ym2.add_route(1, "mono", 0.45);
- MCFG_DEVICE_ADD("oki1", OKIM6295, 1023924, okim6295_device::PIN7_HIGH) // clock frequency & pin 7 not verified
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.50)
+ OKIM6295(config, "oki1", 1023924, okim6295_device::PIN7_HIGH).add_route(ALL_OUTPUTS, "mono", 0.50); // clock frequency & pin 7 not verified
- MCFG_DEVICE_ADD("oki2", OKIM6295, 2047848, okim6295_device::PIN7_HIGH) // clock frequency & pin 7 not verified
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25)
-MACHINE_CONFIG_END
+ OKIM6295(config, "oki2", 2047848, okim6295_device::PIN7_HIGH).add_route(ALL_OUTPUTS, "mono", 0.25); // clock frequency & pin 7 not verified
+}
/******************************************************************************/
diff --git a/src/mame/drivers/magic10.cpp b/src/mame/drivers/magic10.cpp
index 9195fff8044..c67df432427 100644
--- a/src/mame/drivers/magic10.cpp
+++ b/src/mame/drivers/magic10.cpp
@@ -736,22 +736,23 @@ GFXDECODE_END
* Machine Drivers *
****************************/
-MACHINE_CONFIG_START(magic10_state::magic10)
+void magic10_state::magic10(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M68000, CPU_CLOCK) // 10 MHz.
- MCFG_DEVICE_PROGRAM_MAP(magic10_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", magic10_state, irq1_line_hold)
+ M68000(config, m_maincpu, CPU_CLOCK); // 10 MHz.
+ m_maincpu->set_addrmap(AS_PROGRAM, &magic10_state::magic10_map);
+ m_maincpu->set_vblank_int("screen", FUNC(magic10_state::irq1_line_hold));
// 1FILL is required by vanilla magic10 at least (otherwise gameplay won't work properly)
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_1);
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(64*8, 64*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 44*8-1, 2*8, 32*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(magic10_state, screen_update_magic10)
- MCFG_SCREEN_PALETTE(m_palette)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(64*8, 64*8);
+ screen.set_visarea(0*8, 44*8-1, 2*8, 32*8-1);
+ screen.set_screen_update(FUNC(magic10_state::screen_update_magic10));
+ screen.set_palette(m_palette);
PALETTE(config, m_palette).set_format(palette_device::xBRG_444, 256);
@@ -759,55 +760,51 @@ MACHINE_CONFIG_START(magic10_state::magic10)
/* sound hardware */
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("oki", OKIM6295, 1056000, okim6295_device::PIN7_HIGH) /* clock frequency & pin 7 not verified */
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
-MACHINE_CONFIG_END
+ OKIM6295(config, "oki", 1056000, okim6295_device::PIN7_HIGH).add_route(ALL_OUTPUTS, "mono", 1.0); /* clock frequency & pin 7 not verified */
+}
-MACHINE_CONFIG_START(magic10_state::magic10a)
+void magic10_state::magic10a(machine_config &config)
+{
magic10(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(magic10a_map)
-MACHINE_CONFIG_END
+ m_maincpu->set_addrmap(AS_PROGRAM, &magic10_state::magic10a_map);
+}
-MACHINE_CONFIG_START(magic10_state::magic102)
+void magic10_state::magic102(machine_config &config)
+{
magic10(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(magic102_map)
+ m_maincpu->set_addrmap(AS_PROGRAM, &magic10_state::magic102_map);
- MCFG_SCREEN_MODIFY("screen")
- MCFG_SCREEN_VISIBLE_AREA(0*8, 48*8-1, 0*8, 30*8-1)
-MACHINE_CONFIG_END
+ subdevice<screen_device>("screen")->set_visarea(0*8, 48*8-1, 0*8, 30*8-1);
+}
-MACHINE_CONFIG_START(magic10_state::hotslot)
+void magic10_state::hotslot(machine_config &config)
+{
magic10(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(hotslot_map)
+ m_maincpu->set_addrmap(AS_PROGRAM, &magic10_state::hotslot_map);
- MCFG_SCREEN_MODIFY("screen")
- MCFG_SCREEN_VISIBLE_AREA(8*8, 56*8-1, 2*8, 32*8-1)
-MACHINE_CONFIG_END
+ subdevice<screen_device>("screen")->set_visarea(8*8, 56*8-1, 2*8, 32*8-1);
+}
-MACHINE_CONFIG_START(magic10_state::sgsafari)
+void magic10_state::sgsafari(machine_config &config)
+{
magic10(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(sgsafari_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", magic10_state, irq2_line_hold) /* L1 interrupts */
+ m_maincpu->set_addrmap(AS_PROGRAM, &magic10_state::sgsafari_map);
+ m_maincpu->set_vblank_int("screen", FUNC(magic10_state::irq2_line_hold)); /* L1 interrupts */
- MCFG_SCREEN_MODIFY("screen")
- MCFG_SCREEN_VISIBLE_AREA(0*8, 44*8-1, 0*8, 30*8-1)
-MACHINE_CONFIG_END
+ subdevice<screen_device>("screen")->set_visarea(0*8, 44*8-1, 0*8, 30*8-1);
+}
/****************************
diff --git a/src/mame/drivers/magicard.cpp b/src/mame/drivers/magicard.cpp
index 5c32e4dd1d4..43dff213718 100644
--- a/src/mame/drivers/magicard.cpp
+++ b/src/mame/drivers/magicard.cpp
@@ -997,35 +997,35 @@ void magicard_state::ramdac_map(address_map &map)
}
-MACHINE_CONFIG_START(magicard_state::magicard)
- MCFG_DEVICE_ADD("maincpu", SCC68070, CLOCK_A / 2) /* SCC-68070 CCA84 datasheet */
- MCFG_DEVICE_PROGRAM_MAP(magicard_mem)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", magicard_state, magicard_irq) /* no interrupts? (it erases the vectors..) */
-
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(50)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(400, 300)
- MCFG_SCREEN_VISIBLE_AREA(0, 320-1, 0, 256-1) //dynamic resolution,TODO
- MCFG_SCREEN_UPDATE_DRIVER(magicard_state, screen_update_magicard)
-
- MCFG_PALETTE_ADD("palette", 0x100)
+void magicard_state::magicard(machine_config &config)
+{
+ SCC68070(config, m_maincpu, CLOCK_A / 2); /* SCC-68070 CCA84 datasheet */
+ m_maincpu->set_addrmap(AS_PROGRAM, &magicard_state::magicard_mem);
+ m_maincpu->set_vblank_int("screen", FUNC(magicard_state::magicard_irq)); /* no interrupts? (it erases the vectors..) */
+
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_refresh_hz(50);
+ m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ m_screen->set_size(400, 300);
+ m_screen->set_visarea(0, 320-1, 0, 256-1); //dynamic resolution,TODO
+ m_screen->set_screen_update(FUNC(magicard_state::screen_update_magicard));
+
+ PALETTE(config, m_palette).set_entries(0x100);
ramdac_device &ramdac(RAMDAC(config, "ramdac", 0, m_palette));
ramdac.set_addrmap(0, &magicard_state::ramdac_map);
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("saa", SAA1099, CLOCK_B)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
-MACHINE_CONFIG_END
+ SAA1099(config, "saa", CLOCK_B).add_route(ALL_OUTPUTS, "mono", 1.0);
+}
-MACHINE_CONFIG_START(magicard_state::hotslots)
+void magicard_state::hotslots(machine_config &config)
+{
magicard(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(hotslots_mem)
+ m_maincpu->set_addrmap(AS_PROGRAM, &magicard_state::hotslots_mem);
- MCFG_DEVICE_REMOVE("saa")
+ config.device_remove("saa");
YMZ284(config, "ssg", 4000000).add_route(ALL_OUTPUTS, "mono", 1.0);
-MACHINE_CONFIG_END
+}
/*************************
* Rom Load *
diff --git a/src/mame/drivers/magicfly.cpp b/src/mame/drivers/magicfly.cpp
index b7f35b850c4..38d22cf4657 100644
--- a/src/mame/drivers/magicfly.cpp
+++ b/src/mame/drivers/magicfly.cpp
@@ -940,22 +940,22 @@ GFXDECODE_END
* Machine Drivers *
*********************************************/
-MACHINE_CONFIG_START(magicfly_state::magicfly)
-
+void magicfly_state::magicfly(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M6502, MASTER_CLOCK / 16) /* guess */
- MCFG_DEVICE_PROGRAM_MAP(magicfly_map)
+ M6502(config, m_maincpu, MASTER_CLOCK / 16); /* guess */
+ m_maincpu->set_addrmap(AS_PROGRAM, &magicfly_state::magicfly_map);
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE((39+1)*8, (31+1)*8) /* Taken from MC6845 init, registers 00 & 04. Normally programmed with (value-1). */
- MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 0*8, 29*8-1) /* Taken from MC6845 init, registers 01 & 06. */
- MCFG_SCREEN_UPDATE_DRIVER(magicfly_state, screen_update_magicfly)
- MCFG_SCREEN_PALETTE("palette")
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size((39+1)*8, (31+1)*8); /* Taken from MC6845 init, registers 00 & 04. Normally programmed with (value-1). */
+ screen.set_visarea(0*8, 32*8-1, 0*8, 29*8-1); /* Taken from MC6845 init, registers 01 & 06. */
+ screen.set_screen_update(FUNC(magicfly_state::screen_update_magicfly));
+ screen.set_palette("palette");
GFXDECODE(config, m_gfxdecode, "palette", gfx_magicfly);
PALETTE(config, "palette", FUNC(magicfly_state::magicfly_palette), 32);
@@ -968,19 +968,19 @@ MACHINE_CONFIG_START(magicfly_state::magicfly)
/* sound hardware */
SPEAKER(config, "speaker").front_center();
- MCFG_DEVICE_ADD("dac", DAC_1BIT, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 0.25)
- MCFG_DEVICE_ADD("vref", VOLTAGE_REGULATOR, 0) MCFG_VOLTAGE_REGULATOR_OUTPUT(5.0)
- MCFG_SOUND_ROUTE(0, "dac", 1.0, DAC_VREF_POS_INPUT)
-MACHINE_CONFIG_END
+ DAC_1BIT(config, m_dac, 0).add_route(ALL_OUTPUTS, "speaker", 0.25);
+ voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref", 0));
+ vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT);
+}
-MACHINE_CONFIG_START(magicfly_state::_7mezzo)
+void magicfly_state::_7mezzo(machine_config &config)
+{
magicfly(config);
/* video hardware */
MCFG_VIDEO_START_OVERRIDE(magicfly_state, 7mezzo)
-
-MACHINE_CONFIG_END
+}
void magicfly_state::bchance(machine_config &config)
diff --git a/src/mame/drivers/magictg.cpp b/src/mame/drivers/magictg.cpp
index 9a749b09e5b..a39a4dfb253 100644
--- a/src/mame/drivers/magictg.cpp
+++ b/src/mame/drivers/magictg.cpp
@@ -936,25 +936,24 @@ MACHINE_CONFIG_START(magictg_state::magictg)
#endif
MCFG_PCI_BUS_LEGACY_DEVICE(9, DEVICE_SELF, magictg_state, zr36120_pci_r, zr36120_pci_w) // TODO: ZR36120 device
- MCFG_DEVICE_ADD("voodoo_0", VOODOO_1, STD_VOODOO_1_CLOCK)
- MCFG_VOODOO_FBMEM(2)
- MCFG_VOODOO_TMUMEM(4,0)
- MCFG_VOODOO_SCREEN_TAG("screen")
- MCFG_VOODOO_CPU_TAG("mips")
-
- MCFG_DEVICE_ADD("voodoo_1", VOODOO_1, STD_VOODOO_1_CLOCK)
- MCFG_VOODOO_FBMEM(2)
- MCFG_VOODOO_TMUMEM(4,0)
- MCFG_VOODOO_SCREEN_TAG("screen")
- MCFG_VOODOO_CPU_TAG("mips")
-
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(1024, 1024)
- MCFG_SCREEN_VISIBLE_AREA(0, 511, 16, 447)
-
- MCFG_SCREEN_UPDATE_DRIVER(magictg_state, screen_update_magictg)
+ VOODOO_1(config, m_voodoo[0], STD_VOODOO_1_CLOCK);
+ m_voodoo[0]->set_fbmem(2);
+ m_voodoo[0]->set_tmumem(4,0);
+ m_voodoo[0]->set_screen_tag("screen");
+ m_voodoo[0]->set_cpu_tag(m_mips);
+
+ VOODOO_1(config, m_voodoo[1], STD_VOODOO_1_CLOCK);
+ m_voodoo[1]->set_fbmem(2);
+ m_voodoo[1]->set_tmumem(4,0);
+ m_voodoo[1]->set_screen_tag("screen");
+ m_voodoo[1]->set_cpu_tag(m_mips);
+
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(1024, 1024);
+ screen.set_visarea(0, 511, 16, 447);
+ screen.set_screen_update(FUNC(magictg_state::screen_update_magictg));
MACHINE_CONFIG_END
diff --git a/src/mame/drivers/magmax.cpp b/src/mame/drivers/magmax.cpp
index bce7832c872..647abfb29a6 100644
--- a/src/mame/drivers/magmax.cpp
+++ b/src/mame/drivers/magmax.cpp
@@ -325,27 +325,27 @@ static GFXDECODE_START( gfx_magmax )
GFXDECODE_END
-MACHINE_CONFIG_START(magmax_state::magmax)
-
+void magmax_state::magmax(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD(m_maincpu, M68000, XTAL(16'000'000)/2) /* verified on pcb */
- MCFG_DEVICE_PROGRAM_MAP(main_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", magmax_state, irq1_line_assert)
+ M68000(config, m_maincpu, XTAL(16'000'000)/2); /* verified on pcb */
+ m_maincpu->set_addrmap(AS_PROGRAM, &magmax_state::main_map);
+ m_maincpu->set_vblank_int("screen", FUNC(magmax_state::irq1_line_assert));
- MCFG_DEVICE_ADD(m_audiocpu, Z80,XTAL(20'000'000)/8) /* verified on pcb */
- MCFG_DEVICE_PROGRAM_MAP(sound_map)
- MCFG_DEVICE_IO_MAP(sound_io_map)
+ Z80(config, m_audiocpu, XTAL(20'000'000)/8); /* verified on pcb */
+ m_audiocpu->set_addrmap(AS_PROGRAM, &magmax_state::sound_map);
+ m_audiocpu->set_addrmap(AS_IO, &magmax_state::sound_io_map);
- MCFG_QUANTUM_TIME(attotime::from_hz(600))
+ config.m_minimum_quantum = attotime::from_hz(600);
/* video hardware */
- MCFG_SCREEN_ADD(m_screen, RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_SIZE(32*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(magmax_state, screen_update)
- MCFG_SCREEN_PALETTE(m_palette)
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_refresh_hz(60);
+ m_screen->set_size(32*8, 32*8);
+ m_screen->set_visarea(0*8, 32*8-1, 2*8, 30*8-1);
+ m_screen->set_screen_update(FUNC(magmax_state::screen_update));
+ m_screen->set_palette(m_palette);
GFXDECODE(config, m_gfxdecode, m_palette, gfx_magmax);
PALETTE(config, m_palette, FUNC(magmax_state::magmax_palette), 1*16 + 16*16 + 256, 256);
@@ -365,7 +365,7 @@ MACHINE_CONFIG_START(magmax_state::magmax)
GENERIC_LATCH_8(config, m_soundlatch);
m_soundlatch->data_pending_callback().set_inputline(m_audiocpu, 0);
m_soundlatch->set_separate_acknowledge(true);
-MACHINE_CONFIG_END
+}
ROM_START( magmax )
diff --git a/src/mame/drivers/magnum.cpp b/src/mame/drivers/magnum.cpp
index b1eb9b3c016..9ba4bb1439a 100644
--- a/src/mame/drivers/magnum.cpp
+++ b/src/mame/drivers/magnum.cpp
@@ -279,45 +279,45 @@ void magnum_state::magnum_lcdc(address_map &map)
map(0x0000, 0x027f).ram();
}
-MACHINE_CONFIG_START(magnum_state::magnum)
- MCFG_DEVICE_ADD("maincpu", I80186, XTAL(12'000'000) / 2)
- MCFG_DEVICE_PROGRAM_MAP(magnum_map)
- MCFG_DEVICE_IO_MAP(magnum_io)
+void magnum_state::magnum(machine_config &config)
+{
+ I80186(config, m_maincpu, XTAL(12'000'000) / 2);
+ m_maincpu->set_addrmap(AS_PROGRAM, &magnum_state::magnum_map);
+ m_maincpu->set_addrmap(AS_IO, &magnum_state::magnum_io);
CDP1879(config, "rtc", XTAL(32'768)).irq_callback().set(FUNC(magnum_state::rtcirq_w));
- MCFG_SCREEN_ADD("screen1", LCD)
- MCFG_SCREEN_REFRESH_RATE(50)
- MCFG_SCREEN_UPDATE_DEVICE("lcdc1", hd61830_device, screen_update)
- MCFG_SCREEN_SIZE(6*40, 9*16)
- MCFG_SCREEN_VISIBLE_AREA(0, 6*40-1, 0, 8*16-1)
- MCFG_SCREEN_PALETTE("palette")
+ screen_device &screen1(SCREEN(config, "screen1", SCREEN_TYPE_LCD));
+ screen1.set_refresh_hz(50);
+ screen1.set_screen_update("lcdc1", FUNC(hd61830_device::screen_update));
+ screen1.set_size(6*40, 9*16);
+ screen1.set_visarea(0, 6*40-1, 0, 8*16-1);
+ screen1.set_palette("palette");
- MCFG_SCREEN_ADD("screen2", LCD)
- MCFG_SCREEN_REFRESH_RATE(50)
- MCFG_SCREEN_UPDATE_DEVICE("lcdc2", hd61830_device, screen_update)
- MCFG_SCREEN_SIZE(6*40, 9*16)
- MCFG_SCREEN_VISIBLE_AREA(0, 6*40-1, 0, 8*16-1)
- MCFG_SCREEN_PALETTE("palette")
+ screen_device &screen2(SCREEN(config, "screen2", SCREEN_TYPE_LCD));
+ screen2.set_refresh_hz(50);
+ screen2.set_screen_update("lcdc2", FUNC(hd61830_device::screen_update));
+ screen2.set_size(6*40, 9*16);
+ screen2.set_visarea(0, 6*40-1, 0, 8*16-1);
+ screen2.set_palette("palette");
- MCFG_DEVICE_ADD("lcdc1", HD61830, 1000000) // unknown clock
- MCFG_DEVICE_ADDRESS_MAP(0, magnum_lcdc)
- MCFG_VIDEO_SET_SCREEN("screen1")
+ hd61830_device &lcdc1(HD61830(config, "lcdc1", 1000000)); // unknown clock
+ lcdc1.set_addrmap(0, &magnum_state::magnum_lcdc);
+ lcdc1.set_screen("screen1");
- MCFG_DEVICE_ADD("lcdc2", HD61830, 1000000) // unknown clock
- MCFG_DEVICE_ADDRESS_MAP(0, magnum_lcdc)
- MCFG_VIDEO_SET_SCREEN("screen2")
+ hd61830_device &lcdc2(HD61830(config, "lcdc2", 1000000)); // unknown clock
+ lcdc2.set_addrmap(0, &magnum_state::magnum_lcdc);
+ lcdc2.set_screen("screen2");
- //MCFG_DEVICE_ADD("crtc", I8275, 3000000) // unknown clock
+ //I8275(config, "crtc", 3000000); // unknown clock
//WD1793(config, "fdc", 1000000); // nothing known, type or if any disks even exist, port 0x44 is possibly motor control
PALETTE(config, "palette", palette_device::MONOCHROME_INVERTED);
SPEAKER(config, "speaker").front_center();
- MCFG_DEVICE_ADD("beep", BEEP, 500) /// frequency is guessed
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 0.50)
-MACHINE_CONFIG_END
+ BEEP(config, m_beep, 500).add_route(ALL_OUTPUTS, "speaker", 0.50); // frequency is guessed
+}
ROM_START( magnum )
ROM_REGION(0x20000, "bios", 0)
diff --git a/src/mame/drivers/magreel.cpp b/src/mame/drivers/magreel.cpp
index 3203c1be13e..70b56114e1a 100644
--- a/src/mame/drivers/magreel.cpp
+++ b/src/mame/drivers/magreel.cpp
@@ -118,30 +118,29 @@ void magreel_state::machine_reset()
}
-MACHINE_CONFIG_START(magreel_state::magreel)
-
+void magreel_state::magreel(machine_config &config)
+{
/* basic machine hardware - all information unknown */
-// MCFG_DEVICE_ADD("maincpu",m68000,MAIN_CLOCK/12)
-// MCFG_DEVICE_PROGRAM_MAP(magreel_map)
+// m68000_device &maincpu(M68000(config, "maincpu", MAIN_CLOCK/12));
+// maincpu.set_addrmap(AS_PROGRAM, &magreel_state::magreel_map);
/* video hardware */
-// MCFG_SCREEN_ADD("screen", RASTER)
-// MCFG_SCREEN_REFRESH_RATE(60)
-// MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500))
-// MCFG_SCREEN_UPDATE_DRIVER(magreel_state, screen_update)
-// MCFG_SCREEN_SIZE(32*8, 32*8)
-// MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 0*8, 32*8-1)
-// MCFG_SCREEN_RAW_PARAMS(MAIN_CLOCK/2, 442, 0, 320, 264, 0, 240) /* generic NTSC video timing at 320x240 */
-// MCFG_SCREEN_PALETTE("palette")
+// screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+// screen.set_refresh_hz(60);
+// screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500));
+// screen.set_screen_update(FUNC(magreel_state::screen_update));
+// screen.set_size(32*8, 32*8);
+// screen.set_visarea(0*8, 32*8-1, 0*8, 32*8-1);
+// screen.set_raw(MAIN_CLOCK/2, 442, 0, 320, 264, 0, 240); /* generic NTSC video timing at 320x240 */
+// screen.set_palette("palette");
-// MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_magreel)
+// GFXDECODE(config, "gfxdecode", "palette", gfx_magreel);
-// MCFG_PALETTE_ADD("palette", 8)
-// MCFG_PALETTE_INIT_OWNER(magreel_state, magreel)
+// PALETTE(config, "palette", FUNC(magreel_state::magreel), 8)
/* sound hardware */
SPEAKER(config, "mono").front_center();
-MACHINE_CONFIG_END
+}
/***************************************************************************
diff --git a/src/mame/drivers/magtouch.cpp b/src/mame/drivers/magtouch.cpp
index dd3748442ed..5be7b28db81 100644
--- a/src/mame/drivers/magtouch.cpp
+++ b/src/mame/drivers/magtouch.cpp
@@ -193,16 +193,17 @@ void magtouch_state::magtouch_sb_conf(device_t *device)
MCFG_DEVICE_SLOT_INTERFACE(pc_joysticks, nullptr, true) // remove joystick
}
-MACHINE_CONFIG_START(magtouch_state::magtouch)
+void magtouch_state::magtouch(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", I386, 14318180*2) /* I386 ?? Mhz */
- MCFG_DEVICE_PROGRAM_MAP(magtouch_map)
- MCFG_DEVICE_IO_MAP(magtouch_io)
- MCFG_DEVICE_IRQ_ACKNOWLEDGE_DEVICE("pic8259_1", pic8259_device, inta_cb)
+ I386(config, m_maincpu, 14318180*2); /* I386 ?? Mhz */
+ m_maincpu->set_addrmap(AS_PROGRAM, &magtouch_state::magtouch_map);
+ m_maincpu->set_addrmap(AS_IO, &magtouch_state::magtouch_io);
+ m_maincpu->set_irq_acknowledge_callback("pic8259_1", FUNC(pic8259_device::inta_cb));
/* video hardware */
pcvideo_trident_vga(config);
- MCFG_DEVICE_REPLACE("vga", TVGA9000_VGA, 0)
+ TVGA9000_VGA(config.replace(), "vga", 0);
pcat_common(config);
@@ -210,14 +211,15 @@ MACHINE_CONFIG_START(magtouch_state::magtouch)
uart.out_tx_callback().set("microtouch", FUNC(microtouch_device::rx));
uart.out_int_callback().set("pic8259_1", FUNC(pic8259_device::ir4_w));
- MCFG_MICROTOUCH_ADD( "microtouch", 9600, WRITELINE("ns16450_0", ins8250_uart_device, rx_w) )
+ MICROTOUCH(config, "microtouch", 9600).stx().set("ns16450_0", FUNC(ins8250_uart_device::rx_w));
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
m_dma8237_1->out_iow_callback<1>().set(FUNC(magtouch_state::dma8237_1_dack_w));
ISA8(config, m_isabus, 0);
- m_isabus->set_cputag("maincpu");
+ m_isabus->set_memspace("maincpu", AS_PROGRAM);
+ m_isabus->set_iospace("maincpu", AS_IO);
m_isabus->irq2_callback().set("pic8259_2", FUNC(pic8259_device::ir2_w));
m_isabus->irq3_callback().set("pic8259_1", FUNC(pic8259_device::ir3_w));
//m_isabus->irq4_callback().set("pic8259_1", FUNC(pic8259_device::ir4_w));
@@ -229,10 +231,10 @@ MACHINE_CONFIG_START(magtouch_state::magtouch)
m_isabus->drq3_callback().set("dma8237_1", FUNC(am9517a_device::dreq3_w));
// FIXME: determine ISA bus clock
- MCFG_DEVICE_ADD("isa1", ISA8_SLOT, 0, "isa", magtouch_isa8_cards, "sb15", true)
- MCFG_SLOT_OPTION_DEVICE_INPUT_DEFAULTS("sb15", magtouch_sb_def)
- MCFG_SLOT_OPTION_MACHINE_CONFIG("sb15", magtouch_sb_conf)
-MACHINE_CONFIG_END
+ isa8_slot_device &isa1(ISA8_SLOT(config, "isa1", 0, m_isabus, magtouch_isa8_cards, "sb15", true));
+ isa1.set_option_device_input_defaults("sb15", DEVICE_INPUT_DEFAULTS_NAME(magtouch_sb_def));
+ isa1.set_option_machine_config("sb15", magtouch_sb_conf);
+}
ROM_START(magtouch)
diff --git a/src/mame/drivers/mainsnk.cpp b/src/mame/drivers/mainsnk.cpp
index 408822e302a..6f869be918d 100644
--- a/src/mame/drivers/mainsnk.cpp
+++ b/src/mame/drivers/mainsnk.cpp
@@ -375,24 +375,24 @@ GFXDECODE_END
-MACHINE_CONFIG_START(mainsnk_state::mainsnk)
-
- MCFG_DEVICE_ADD("maincpu", Z80, 3360000)
- MCFG_DEVICE_PROGRAM_MAP(main_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", mainsnk_state, irq0_line_hold)
+void mainsnk_state::mainsnk(machine_config &config)
+{
+ Z80(config, m_maincpu, 3360000);
+ m_maincpu->set_addrmap(AS_PROGRAM, &mainsnk_state::main_map);
+ m_maincpu->set_vblank_int("screen", FUNC(mainsnk_state::irq0_line_hold));
- MCFG_DEVICE_ADD("audiocpu", Z80,4000000)
- MCFG_DEVICE_PROGRAM_MAP(sound_map)
- MCFG_DEVICE_IO_MAP(sound_portmap)
- MCFG_DEVICE_PERIODIC_INT_DRIVER(mainsnk_state, irq0_line_assert, 244)
+ Z80(config, m_audiocpu, 4000000);
+ m_audiocpu->set_addrmap(AS_PROGRAM, &mainsnk_state::sound_map);
+ m_audiocpu->set_addrmap(AS_IO, &mainsnk_state::sound_portmap);
+ m_audiocpu->set_periodic_int(FUNC(mainsnk_state::irq0_line_assert), attotime::from_hz(244));
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_SIZE(36*8, 28*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 36*8-1, 1*8, 28*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(mainsnk_state, screen_update)
- MCFG_SCREEN_PALETTE(m_palette)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_size(36*8, 28*8);
+ screen.set_visarea(0*8, 36*8-1, 1*8, 28*8-1);
+ screen.set_screen_update(FUNC(mainsnk_state::screen_update));
+ screen.set_palette(m_palette);
GFXDECODE(config, m_gfxdecode, m_palette, gfx_mainsnk);
PALETTE(config, m_palette, FUNC(mainsnk_state::mainsnk_palette), 0x400);
@@ -406,7 +406,7 @@ MACHINE_CONFIG_START(mainsnk_state::mainsnk)
AY8910(config, "ay1", 2000000).add_route(ALL_OUTPUTS, "mono", 0.35);
AY8910(config, "ay2", 2000000).add_route(ALL_OUTPUTS, "mono", 0.35);
-MACHINE_CONFIG_END
+}
ROM_START(mainsnk)
diff --git a/src/mame/drivers/majorpkr.cpp b/src/mame/drivers/majorpkr.cpp
index a632af8ca67..486413c360b 100644
--- a/src/mame/drivers/majorpkr.cpp
+++ b/src/mame/drivers/majorpkr.cpp
@@ -1004,12 +1004,13 @@ GFXDECODE_END
* Machine Drivers *
*************************/
-MACHINE_CONFIG_START(majorpkr_state::majorpkr)
+void majorpkr_state::majorpkr(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, CPU_CLOCK) // 6 MHz.
- MCFG_DEVICE_PROGRAM_MAP(map)
- MCFG_DEVICE_IO_MAP(portmap)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", majorpkr_state, irq0_line_hold)
+ z80_device &maincpu(Z80(config, "maincpu", CPU_CLOCK)); // 6 MHz.
+ maincpu.set_addrmap(AS_PROGRAM, &majorpkr_state::map);
+ maincpu.set_addrmap(AS_IO, &majorpkr_state::portmap);
+ maincpu.set_vblank_int("screen", FUNC(majorpkr_state::irq0_line_hold));
ADDRESS_MAP_BANK(config, "palette_bank").set_map(&majorpkr_state::palettebanks).set_options(ENDIANNESS_LITTLE, 8, 13, 0x800);
ADDRESS_MAP_BANK(config, "vram_bank").set_map(&majorpkr_state::vrambanks).set_options(ENDIANNESS_LITTLE, 8, 13, 0x800);
@@ -1017,10 +1018,10 @@ MACHINE_CONFIG_START(majorpkr_state::majorpkr)
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_RAW_PARAMS(CRTC_CLOCK*16, (47+1)*16, 0, (36*16)-16, (36+1)*8, 0, (28*8)) // from CRTC registers.
- MCFG_SCREEN_UPDATE_DRIVER(majorpkr_state, screen_update_majorpkr)
- MCFG_SCREEN_PALETTE("palette")
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_raw(CRTC_CLOCK*16, (47+1)*16, 0, (36*16)-16, (36+1)*8, 0, (28*8)); // from CRTC registers.
+ screen.set_screen_update(FUNC(majorpkr_state::screen_update_majorpkr));
+ screen.set_palette("palette");
GFXDECODE(config, m_gfxdecode, "palette", gfx_majorpkr);
@@ -1034,9 +1035,8 @@ MACHINE_CONFIG_START(majorpkr_state::majorpkr)
/* sound hardware */
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("oki", OKIM6295, OKI_CLOCK, okim6295_device::PIN7_HIGH) // clock frequency & pin 7 verified.
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
-MACHINE_CONFIG_END
+ OKIM6295(config, "oki", OKI_CLOCK, okim6295_device::PIN7_HIGH).add_route(ALL_OUTPUTS, "mono", 1.0); // clock frequency & pin 7 verified.
+}
/*************************
diff --git a/src/mame/drivers/manohman.cpp b/src/mame/drivers/manohman.cpp
index 11230025558..57c29b77ebe 100644
--- a/src/mame/drivers/manohman.cpp
+++ b/src/mame/drivers/manohman.cpp
@@ -8,7 +8,7 @@
Preliminary driver by Roberto Fresca.
- German board game similar to Ludo, derivated from the indian game Parchisi.
+ German board game similar to Ludo, derived from the Indian game Parchisi.
Coin-operated machine for 1-4 players. No screen, just artwork and lamps.
The machine was designed for pubs, etc...
@@ -242,25 +242,25 @@ INPUT_PORTS_END
* Machine Config *
*********************************************/
-MACHINE_CONFIG_START(manohman_state::manohman)
- MCFG_DEVICE_ADD("maincpu", M68000, XTAL(8'000'000)) // MC68000P8
- MCFG_DEVICE_PROGRAM_MAP(mem_map)
- MCFG_DEVICE_IRQ_ACKNOWLEDGE_DRIVER(manohman_state, iack_handler)
+void manohman_state::manohman(machine_config &config)
+{
+ M68000(config, m_maincpu, XTAL(8'000'000)); // MC68000P8
+ m_maincpu->set_addrmap(AS_PROGRAM, &manohman_state::mem_map);
+ m_maincpu->set_irq_acknowledge_callback(FUNC(manohman_state::iack_handler));
PIT68230(config, m_pit, XTAL(8'000'000)); // MC68230P8
m_pit->timer_irq_callback().set_inputline("maincpu", M68K_IRQ_2);
- MCFG_DEVICE_ADD("duart", MC68681, XTAL(3'686'400))
- MCFG_MC68681_IRQ_CALLBACK(INPUTLINE("maincpu", M68K_IRQ_4))
+ MC68681(config, m_duart, XTAL(3'686'400));
+ m_duart->irq_cb().set_inputline(m_maincpu, M68K_IRQ_4);
- MCFG_DEVICE_ADD("rtc", MSM6242, XTAL(32'768)) // M62X42B
+ MSM6242(config, "rtc", XTAL(32'768)); // M62X42B
NVRAM(config, "nvram", nvram_device::DEFAULT_NONE); // KM6264BL-10 x2 + MAX696CFL + battery
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("saa", SAA1099, XTAL(8'000'000) / 2) // clock not verified
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.10)
-MACHINE_CONFIG_END
+ SAA1099(config, "saa", XTAL(8'000'000) / 2).add_route(ALL_OUTPUTS, "mono", 0.10); // clock not verified
+}
/*********************************************
diff --git a/src/mame/drivers/mappy.cpp b/src/mame/drivers/mappy.cpp
index 38067a4ca1f..f41d55efb89 100644
--- a/src/mame/drivers/mappy.cpp
+++ b/src/mame/drivers/mappy.cpp
@@ -1334,7 +1334,7 @@ void mappy_state::superpac_common(machine_config &config)
WATCHDOG_TIMER(config, "watchdog").set_vblank_count("screen", 8);
- config.m_minimum_quantum = attotime::from_hz(6000); // 100 CPU slices per frame - an high value to ensure proper synchronization of the CPUs
+ config.m_minimum_quantum = attotime::from_hz(6000); // 100 CPU slices per frame - a high value to ensure proper synchronization of the CPUs
ls157_device &dipmux(LS157(config, "dipmux"));
dipmux.a_in_callback().set_ioport("DSW2");
@@ -1417,7 +1417,6 @@ void mappy_state::grobda(machine_config &config)
/* sound hardware */
DAC_4BIT_BINARY_WEIGHTED(config, "dac", 0).add_route(ALL_OUTPUTS, "speaker", 0.275); // alternate route to 15XX-related DAC?
voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref", 0));
- vref.set_output(5.0);
vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT);
vref.add_route(0, "dac", -1.0, DAC_VREF_NEG_INPUT);
}
@@ -1446,7 +1445,7 @@ void mappy_state::phozon(machine_config &config)
WATCHDOG_TIMER(config, "watchdog").set_vblank_count("screen", 8);
- config.m_minimum_quantum = attotime::from_hz(6000); // 100 CPU slices per frame - an high value to ensure proper synchronization of the CPUs
+ config.m_minimum_quantum = attotime::from_hz(6000); // 100 CPU slices per frame - a high value to ensure proper synchronization of the CPUs
NAMCO_58XX(config, m_namcoio[0], 0);
m_namcoio[0]->in_callback<0>().set_ioport("COINS");
@@ -1505,7 +1504,7 @@ void mappy_state::mappy_common(machine_config &config)
WATCHDOG_TIMER(config, "watchdog").set_vblank_count("screen", 8);
- config.m_minimum_quantum = attotime::from_hz(6000); // 100 CPU slices per frame - an high value to ensure proper synchronization of the CPUs
+ config.m_minimum_quantum = attotime::from_hz(6000); // 100 CPU slices per frame - a high value to ensure proper synchronization of the CPUs
ls157_device &dipmux(LS157(config, "dipmux"));
dipmux.a_in_callback().set_ioport("DSW2");
@@ -1513,7 +1512,7 @@ void mappy_state::mappy_common(machine_config &config)
/* video hardware */
GFXDECODE(config, m_gfxdecode, m_palette, gfx_mappy);
- PALETTE(config, m_palette, FUNC(mappy_state::mappy_palette), 64*4+16*4, 32);
+ PALETTE(config, m_palette, FUNC(mappy_state::mappy_palette), 64*4+16*16, 32);
SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
m_screen->set_raw(PIXEL_CLOCK, HTOTAL, HBEND, HBSTART, VTOTAL, VBEND, VBSTART);
diff --git a/src/mame/drivers/marineb.cpp b/src/mame/drivers/marineb.cpp
index b1ac1423195..61b07ee3c56 100644
--- a/src/mame/drivers/marineb.cpp
+++ b/src/mame/drivers/marineb.cpp
@@ -538,12 +538,12 @@ WRITE_LINE_MEMBER(marineb_state::wanted_vblank_irq)
}
-MACHINE_CONFIG_START(marineb_state::marineb)
-
+void marineb_state::marineb(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, CPU_CLOCK) /* 3 MHz? */
- MCFG_DEVICE_PROGRAM_MAP(marineb_map)
- MCFG_DEVICE_IO_MAP(marineb_io_map)
+ Z80(config, m_maincpu, CPU_CLOCK); /* 3 MHz? */
+ m_maincpu->set_addrmap(AS_PROGRAM, &marineb_state::marineb_map);
+ m_maincpu->set_addrmap(AS_IO, &marineb_state::marineb_io_map);
LS259(config, m_outlatch);
m_outlatch->q_out_cb<0>().set(FUNC(marineb_state::nmi_mask_w));
@@ -551,14 +551,14 @@ MACHINE_CONFIG_START(marineb_state::marineb)
m_outlatch->q_out_cb<2>().set(FUNC(marineb_state::flipscreen_x_w));
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(5000) /* frames per second, vblank duration */)
- MCFG_SCREEN_SIZE(32*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(marineb_state, screen_update_marineb)
- MCFG_SCREEN_PALETTE(m_palette)
- MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE(*this, marineb_state, marineb_vblank_irq))
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(5000) /* frames per second, vblank duration */);
+ screen.set_size(32*8, 32*8);
+ screen.set_visarea(0*8, 32*8-1, 2*8, 30*8-1);
+ screen.set_screen_update(FUNC(marineb_state::screen_update_marineb));
+ screen.set_palette(m_palette);
+ screen.screen_vblank().set(FUNC(marineb_state::marineb_vblank_irq));
GFXDECODE(config, m_gfxdecode, m_palette, gfx_marineb);
PALETTE(config, m_palette, FUNC(marineb_state::marineb_palette), 256);
@@ -566,19 +566,17 @@ MACHINE_CONFIG_START(marineb_state::marineb)
/* sound hardware */
SPEAKER(config, "mono").front_center();
AY8910(config, "ay1", SOUND_CLOCK).add_route(ALL_OUTPUTS, "mono", 0.50);
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(marineb_state::changes)
+void marineb_state::changes(machine_config &config)
+{
marineb(config);
- /* basic machine hardware */
-
/* video hardware */
- MCFG_GFXDECODE_MODIFY("gfxdecode", gfx_changes)
- MCFG_SCREEN_MODIFY("screen")
- MCFG_SCREEN_UPDATE_DRIVER(marineb_state, screen_update_changes)
-MACHINE_CONFIG_END
+ m_gfxdecode->set_info(gfx_changes);
+ subdevice<screen_device>("screen")->set_screen_update(FUNC(marineb_state::screen_update_changes));
+}
void marineb_state::springer(machine_config &config)
@@ -592,50 +590,45 @@ void marineb_state::springer(machine_config &config)
}
-MACHINE_CONFIG_START(marineb_state::hoccer)
+void marineb_state::hoccer(machine_config &config)
+{
marineb(config);
- /* basic machine hardware */
-
/* video hardware */
- MCFG_GFXDECODE_MODIFY("gfxdecode", gfx_hoccer)
- MCFG_SCREEN_MODIFY("screen")
- MCFG_SCREEN_UPDATE_DRIVER(marineb_state, screen_update_hoccer)
-MACHINE_CONFIG_END
+ m_gfxdecode->set_info(gfx_hoccer);
+ subdevice<screen_device>("screen")->set_screen_update(FUNC(marineb_state::screen_update_hoccer));
+}
-MACHINE_CONFIG_START(marineb_state::wanted)
+void marineb_state::wanted(machine_config &config)
+{
marineb(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_IO_MAP(wanted_io_map)
+ m_maincpu->set_addrmap(AS_IO, &marineb_state::wanted_io_map);
m_outlatch->q_out_cb<0>().set(FUNC(marineb_state::irq_mask_w));
/* video hardware */
- MCFG_GFXDECODE_MODIFY("gfxdecode", gfx_wanted)
- MCFG_SCREEN_MODIFY("screen")
- MCFG_SCREEN_UPDATE_DRIVER(marineb_state, screen_update_springer)
- MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE(*this, marineb_state, wanted_vblank_irq))
+ m_gfxdecode->set_info(gfx_wanted);
+ subdevice<screen_device>("screen")->set_screen_update(FUNC(marineb_state::screen_update_springer));
+ subdevice<screen_device>("screen")->screen_vblank().set(FUNC(marineb_state::wanted_vblank_irq));
// sound hardware (PSG type verified only for bcruzm12)
AY8912(config.replace(), "ay1", SOUND_CLOCK).add_route(ALL_OUTPUTS, "mono", 0.25);
AY8912(config, "ay2", SOUND_CLOCK).add_route(ALL_OUTPUTS, "mono", 0.25);
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(marineb_state::hopprobo)
+void marineb_state::hopprobo(machine_config &config)
+{
marineb(config);
- /* basic machine hardware */
-
/* video hardware */
- MCFG_GFXDECODE_MODIFY("gfxdecode", gfx_hopprobo)
- MCFG_SCREEN_MODIFY("screen")
- MCFG_SCREEN_UPDATE_DRIVER(marineb_state, screen_update_hopprobo)
-MACHINE_CONFIG_END
+ m_gfxdecode->set_info(gfx_hopprobo);
+ subdevice<screen_device>("screen")->set_screen_update(FUNC(marineb_state::screen_update_hopprobo));
+}
void marineb_state::bcruzm12(machine_config &config)
diff --git a/src/mame/drivers/marinedt.cpp b/src/mame/drivers/marinedt.cpp
index ff7d507c187..c018c2fdd30 100644
--- a/src/mame/drivers/marinedt.cpp
+++ b/src/mame/drivers/marinedt.cpp
@@ -626,19 +626,19 @@ void marinedt_state::marinedt_palette(palette_device &palette) const
}
}
-MACHINE_CONFIG_START(marinedt_state::marinedt)
-
+void marinedt_state::marinedt(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu",Z80,MAIN_CLOCK/4)
- MCFG_DEVICE_PROGRAM_MAP(marinedt_map)
- MCFG_DEVICE_IO_MAP(marinedt_io)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", marinedt_state, irq0_line_hold)
+ Z80(config, m_maincpu, MAIN_CLOCK/4);
+ m_maincpu->set_addrmap(AS_PROGRAM, &marinedt_state::marinedt_map);
+ m_maincpu->set_addrmap(AS_IO, &marinedt_state::marinedt_io);
+ m_maincpu->set_vblank_int("screen", FUNC(marinedt_state::irq0_line_hold));
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_UPDATE_DRIVER(marinedt_state, screen_update)
- MCFG_SCREEN_RAW_PARAMS(MAIN_CLOCK/2, 328, 0, 256, 263, 32, 256) // template to get ~60 fps
- MCFG_SCREEN_PALETTE("palette")
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_screen_update(FUNC(marinedt_state::screen_update));
+ m_screen->set_raw(MAIN_CLOCK/2, 328, 0, 256, 263, 32, 256); // template to get ~60 fps
+ m_screen->set_palette("palette");
GFXDECODE(config, m_gfxdecode, "palette", gfx_marinedt);
@@ -647,7 +647,7 @@ MACHINE_CONFIG_START(marinedt_state::marinedt)
/* sound hardware */
SPEAKER(config, "mono").front_center();
//AY8910(config, "aysnd", MAIN_CLOCK/4).add_route(ALL_OUTPUTS, "mono", 0.30);
-MACHINE_CONFIG_END
+}
/***************************************************************************
diff --git a/src/mame/drivers/mario.cpp b/src/mame/drivers/mario.cpp
index fa40440ebc3..c937aa5e377 100644
--- a/src/mame/drivers/mario.cpp
+++ b/src/mame/drivers/mario.cpp
@@ -335,12 +335,12 @@ WRITE_LINE_MEMBER(mario_state::vblank_irq)
m_maincpu->set_input_line(INPUT_LINE_NMI, ASSERT_LINE);
}
-MACHINE_CONFIG_START(mario_state::mario_base)
-
+void mario_state::mario_base(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, Z80_CLOCK) /* verified on pcb */
- MCFG_DEVICE_PROGRAM_MAP(mario_map)
- MCFG_DEVICE_IO_MAP(mario_io_map)
+ Z80(config, m_maincpu, Z80_CLOCK); /* verified on pcb */
+ m_maincpu->set_addrmap(AS_PROGRAM, &mario_state::mario_map);
+ m_maincpu->set_addrmap(AS_IO, &mario_state::mario_io_map);
/* devices */
Z80DMA(config, m_z80dma, Z80_CLOCK);
@@ -359,16 +359,15 @@ MACHINE_CONFIG_START(mario_state::mario_base)
mainlatch.q_out_cb<7>().set(FUNC(mario_state::coin_counter_2_w)); // COUNTER 1 (misnumbered on schematic)
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_RAW_PARAMS(PIXEL_CLOCK, HTOTAL, HBEND, HBSTART, VTOTAL, VBEND, VBSTART)
- MCFG_SCREEN_UPDATE_DRIVER(mario_state, screen_update)
- MCFG_SCREEN_PALETTE(m_palette)
- MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE(*this, mario_state, vblank_irq))
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_raw(PIXEL_CLOCK, HTOTAL, HBEND, HBSTART, VTOTAL, VBEND, VBSTART);
+ screen.set_screen_update(FUNC(mario_state::screen_update));
+ screen.set_palette(m_palette);
+ screen.screen_vblank().set(FUNC(mario_state::vblank_irq));
GFXDECODE(config, m_gfxdecode, m_palette, gfx_mario);
PALETTE(config, m_palette, FUNC(mario_state::mario_palette), 256);
-
-MACHINE_CONFIG_END
+}
void mario_state::mario(machine_config &config)
{
@@ -376,15 +375,15 @@ void mario_state::mario(machine_config &config)
mario_audio(config);
}
-MACHINE_CONFIG_START(mario_state::masao)
+void mario_state::masao(machine_config &config)
+{
mario_base(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_CLOCK(4000000) /* 4.000 MHz (?) */
- MCFG_DEVICE_PROGRAM_MAP(masao_map)
+ m_maincpu->set_clock(4000000); /* 4.000 MHz (?) */
+ m_maincpu->set_addrmap(AS_PROGRAM, &mario_state::masao_map);
/* sound hardware */
masao_audio(config);
-MACHINE_CONFIG_END
+}
/*************************************
diff --git a/src/mame/drivers/markham.cpp b/src/mame/drivers/markham.cpp
index 5d7039eceec..b0f4e3a6b63 100644
--- a/src/mame/drivers/markham.cpp
+++ b/src/mame/drivers/markham.cpp
@@ -242,8 +242,8 @@ void markham_state::markham_slave_map(address_map &map)
map(0x0000, 0x5fff).rom();
map(0x8000, 0x87ff).ram().share("share1");
- map(0xc000, 0xc000).w("sn1", FUNC(sn76496_device::command_w));
- map(0xc001, 0xc001).w("sn2", FUNC(sn76496_device::command_w));
+ map(0xc000, 0xc000).w("sn1", FUNC(sn76496_device::write));
+ map(0xc001, 0xc001).w("sn2", FUNC(sn76496_device::write));
map(0xc002, 0xc002).nopw(); /* unknown */
map(0xc003, 0xc003).nopw(); /* unknown */
@@ -255,8 +255,8 @@ void markham_state::strnskil_slave_map(address_map &map)
map(0xc000, 0xc7ff).ram().share("spriteram");
map(0xc800, 0xcfff).ram().share("share1");
- map(0xd801, 0xd801).w("sn1", FUNC(sn76496_device::command_w));
- map(0xd802, 0xd802).w("sn2", FUNC(sn76496_device::command_w));
+ map(0xd801, 0xd801).w("sn1", FUNC(sn76496_device::write));
+ map(0xd802, 0xd802).w("sn2", FUNC(sn76496_device::write));
}
/****************************************************************************/
@@ -543,24 +543,24 @@ static GFXDECODE_START( gfx_markham )
GFXDECODE_ENTRY( "gfx1", 0x0000, spritelayout, 0, 64 )
GFXDECODE_END
-MACHINE_CONFIG_START(markham_state::markham)
-
+void markham_state::markham(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, CPU_CLOCK/2) /* 4.000MHz */
- MCFG_DEVICE_PROGRAM_MAP(markham_master_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", markham_state, irq0_line_hold)
+ Z80(config, m_maincpu, CPU_CLOCK/2); /* 4.000MHz */
+ m_maincpu->set_addrmap(AS_PROGRAM, &markham_state::markham_master_map);
+ m_maincpu->set_vblank_int("screen", FUNC(markham_state::irq0_line_hold));
- MCFG_DEVICE_ADD("subcpu", Z80, CPU_CLOCK/2) /* 4.000MHz */
- MCFG_DEVICE_PROGRAM_MAP(markham_slave_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", markham_state, irq0_line_hold)
+ Z80(config, m_subcpu, CPU_CLOCK/2); /* 4.000MHz */
+ m_subcpu->set_addrmap(AS_PROGRAM, &markham_state::markham_slave_map);
+ m_subcpu->set_vblank_int("screen", FUNC(markham_state::irq0_line_hold));
- MCFG_QUANTUM_TIME(attotime::from_hz(6000))
+ config.m_minimum_quantum = attotime::from_hz(6000);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_RAW_PARAMS(PIXEL_CLOCK, HTOTAL, HBEND, HBSTART, VTOTAL, VBEND, VBSTART)
- MCFG_SCREEN_UPDATE_DRIVER(markham_state, screen_update_markham)
- MCFG_SCREEN_PALETTE(m_palette)
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_raw(PIXEL_CLOCK, HTOTAL, HBEND, HBSTART, VTOTAL, VBEND, VBSTART);
+ m_screen->set_screen_update(FUNC(markham_state::screen_update_markham));
+ m_screen->set_palette(m_palette);
GFXDECODE(config, m_gfxdecode, m_palette, gfx_markham);
PALETTE(config, m_palette, FUNC(markham_state::markham_palette), 1024, 256);
@@ -568,43 +568,36 @@ MACHINE_CONFIG_START(markham_state::markham)
/* sound hardware */
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("sn1", SN76496, CPU_CLOCK/2)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.75)
-
- MCFG_DEVICE_ADD("sn2", SN76496, CPU_CLOCK/2)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.75)
-MACHINE_CONFIG_END
+ SN76496(config, m_sn[0], CPU_CLOCK/2).add_route(ALL_OUTPUTS, "mono", 0.75);
-MACHINE_CONFIG_START(markham_state::strnskil)
+ SN76496(config, m_sn[1], CPU_CLOCK/2).add_route(ALL_OUTPUTS, "mono", 0.75);
+}
+void markham_state::strnskil(machine_config &config)
+{
markham(config);
/* basic machine hardware */
- MCFG_DEVICE_REMOVE("maincpu")
- MCFG_DEVICE_ADD("maincpu", Z80, CPU_CLOCK/2) /* 4.000MHz */
- MCFG_DEVICE_PROGRAM_MAP(strnskil_master_map)
- MCFG_TIMER_DRIVER_ADD_SCANLINE("scantimer", markham_state, strnskil_scanline, "screen", 0, 1)
+ Z80(config.replace(), m_maincpu, CPU_CLOCK/2); /* 4.000MHz */
+ m_maincpu->set_addrmap(AS_PROGRAM, &markham_state::strnskil_master_map);
+ TIMER(config, "scantimer").configure_scanline(FUNC(markham_state::strnskil_scanline), "screen", 0, 1);
- MCFG_DEVICE_REMOVE("subcpu")
- MCFG_DEVICE_ADD("subcpu", Z80, CPU_CLOCK/2) /* 4.000MHz */
- MCFG_DEVICE_PROGRAM_MAP(strnskil_slave_map)
- MCFG_DEVICE_PERIODIC_INT_DRIVER(markham_state, irq0_line_hold, 2*(PIXEL_CLOCK/HTOTAL/VTOTAL))
+ Z80(config.replace(), m_subcpu, CPU_CLOCK/2); /* 4.000MHz */
+ m_subcpu->set_addrmap(AS_PROGRAM, &markham_state::strnskil_slave_map);
+ m_subcpu->set_periodic_int(FUNC(markham_state::irq0_line_hold), attotime::from_hz(2*(PIXEL_CLOCK/HTOTAL/VTOTAL)));
/* video hardware */
- MCFG_SCREEN_MODIFY("screen")
- MCFG_SCREEN_UPDATE_DRIVER(markham_state, screen_update_strnskil)
+ m_screen->set_screen_update(FUNC(markham_state::screen_update_strnskil));
MCFG_VIDEO_START_OVERRIDE(markham_state, strnskil)
/* sound hardware */
- MCFG_DEVICE_MODIFY("sn1")
- MCFG_DEVICE_CLOCK(CPU_CLOCK/4)
-MACHINE_CONFIG_END
-
-MACHINE_CONFIG_START(markham_state::banbam)
+ m_sn[0]->set_clock(CPU_CLOCK/4);
+}
+void markham_state::banbam(machine_config &config)
+{
strnskil(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(banbam_master_map)
+ m_maincpu->set_addrmap(AS_PROGRAM, &markham_state::banbam_master_map);
MB8841(config, m_mcu, CPU_CLOCK/2); /* 4.000MHz */
// m_mcu->read_k().set(FUNC(markham_state::mcu_portk_r));
@@ -619,7 +612,7 @@ MACHINE_CONFIG_START(markham_state::banbam)
// m_mcu->read_r<3>().set(FUNC(markham_state::mcu_port_r3_r));
// m_mcu->write_r<3>().set(FUNC(markham_state::mcu_port_r3_w));
m_mcu->set_disable();
-MACHINE_CONFIG_END
+}
/****************************************************************************/
diff --git a/src/mame/drivers/marywu.cpp b/src/mame/drivers/marywu.cpp
index 0d99de7f3f2..79c03162f5b 100644
--- a/src/mame/drivers/marywu.cpp
+++ b/src/mame/drivers/marywu.cpp
@@ -186,11 +186,12 @@ void marywu_state::machine_start()
m_leds.resolve();
}
-MACHINE_CONFIG_START(marywu_state::marywu)
+void marywu_state::marywu(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", I80C31, XTAL(10'738'635)) //actual CPU is a Winbond w78c31b-24
- MCFG_DEVICE_PROGRAM_MAP(program_map)
- MCFG_DEVICE_IO_MAP(io_map)
+ i80c31_device &maincpu(I80C31(config, "maincpu", XTAL(10'738'635))); //actual CPU is a Winbond w78c31b-24
+ maincpu.set_addrmap(AS_PROGRAM, &marywu_state::program_map);
+ maincpu.set_addrmap(AS_IO, &marywu_state::io_map);
//TODO: figure out what each bit is mapped to in the 80c31 ports P1 and P3
/* Keyboard & display interface */
@@ -213,7 +214,7 @@ MACHINE_CONFIG_START(marywu_state::marywu)
ay2.add_route(ALL_OUTPUTS, "mono", 0.50);
ay2.port_a_write_callback().set(FUNC(marywu_state::ay2_port_a_w));
ay2.port_b_write_callback().set(FUNC(marywu_state::ay2_port_b_w));
-MACHINE_CONFIG_END
+}
ROM_START( marywu )
ROM_REGION( 0x8000, "maincpu", 0 )
diff --git a/src/mame/drivers/mastboyo.cpp b/src/mame/drivers/mastboyo.cpp
index fbb79301379..344f94cb2f8 100644
--- a/src/mame/drivers/mastboyo.cpp
+++ b/src/mame/drivers/mastboyo.cpp
@@ -196,26 +196,26 @@ void mastboyo_state::machine_start()
}
-MACHINE_CONFIG_START(mastboyo_state::mastboyo)
-
+void mastboyo_state::mastboyo(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, 20_MHz_XTAL / 6)
- MCFG_DEVICE_PROGRAM_MAP(mastboyo_map)
- MCFG_DEVICE_IO_MAP(mastboyo_portmap)
- MCFG_DEVICE_PERIODIC_INT_DRIVER(mastboyo_state, irq0_line_hold, 256.244f) // not sure, INT0 pin was measured at 256.244Hz
+ Z80(config, m_maincpu, 20_MHz_XTAL / 6);
+ m_maincpu->set_addrmap(AS_PROGRAM, &mastboyo_state::mastboyo_map);
+ m_maincpu->set_addrmap(AS_IO, &mastboyo_state::mastboyo_portmap);
+ m_maincpu->set_periodic_int(FUNC(mastboyo_state::irq0_line_hold), attotime::from_hz(256.244f)); // not sure, INT0 pin was measured at 256.244Hz
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(256, 256)
- MCFG_SCREEN_VISIBLE_AREA(0, 256-1, 2*8, 256-2*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(mastboyo_state, screen_update_mastboyo)
- MCFG_SCREEN_PALETTE("palette")
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(256, 256);
+ screen.set_visarea(0, 256-1, 2*8, 256-2*8-1);
+ screen.set_screen_update(FUNC(mastboyo_state::screen_update_mastboyo));
+ screen.set_palette("palette");
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_mastboyo)
+ GFXDECODE(config, m_gfxdecode, "palette", gfx_mastboyo);
PALETTE(config, "palette", FUNC(mastboyo_state::mastboyo_palette), 256);
@@ -226,8 +226,7 @@ MACHINE_CONFIG_START(mastboyo_state::mastboyo)
aysnd.port_a_read_callback().set_ioport("DSW"); // DSW
aysnd.port_b_read_callback().set_ioport("IN0"); // player inputs
aysnd.add_route(ALL_OUTPUTS, "mono", 0.50);
-
-MACHINE_CONFIG_END
+}
/*
diff --git a/src/mame/drivers/matmania.cpp b/src/mame/drivers/matmania.cpp
index 8a70b2e0560..003d1281534 100644
--- a/src/mame/drivers/matmania.cpp
+++ b/src/mame/drivers/matmania.cpp
@@ -302,11 +302,11 @@ GFXDECODE_END
void matmania_state::matmania(machine_config &config)
{
/* basic machine hardware */
- M6502(config, m_maincpu, 1500000); /* 1.5 MHz ???? */
+ M6502(config, m_maincpu, 1500000); /* 1.5 MHz ???? */
m_maincpu->set_addrmap(AS_PROGRAM, &matmania_state::matmania_map);
m_maincpu->set_vblank_int("screen", FUNC(matmania_state::irq0_line_hold));
- M6502(config, m_audiocpu, 1200000); /* 1.2 MHz ???? */
+ M6502(config, m_audiocpu, 1200000); /* 1.2 MHz ???? */
m_audiocpu->set_addrmap(AS_PROGRAM, &matmania_state::matmania_sound_map);
m_audiocpu->set_periodic_int(FUNC(matmania_state::nmi_line_pulse), attotime::from_hz(15*60)); /* ???? */
@@ -334,7 +334,6 @@ void matmania_state::matmania(machine_config &config)
DAC_8BIT_R2R(config, "dac", 0).add_route(ALL_OUTPUTS, "speaker", 0.4); // unknown DAC
voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref", 0));
- vref.set_output(5.0);
vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT);
vref.add_route(0, "dac", -1.0, DAC_VREF_NEG_INPUT);
}
@@ -376,7 +375,6 @@ void matmania_state::maniach(machine_config &config)
DAC_8BIT_R2R(config, "dac", 0).add_route(ALL_OUTPUTS, "speaker", 0.4); // unknown DAC
voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref", 0));
- vref.set_output(5.0);
vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT);
vref.add_route(0, "dac", -1.0, DAC_VREF_NEG_INPUT);
}
diff --git a/src/mame/drivers/maxaflex.cpp b/src/mame/drivers/maxaflex.cpp
index 87e3fcfd91a..1202d575b79 100644
--- a/src/mame/drivers/maxaflex.cpp
+++ b/src/mame/drivers/maxaflex.cpp
@@ -308,7 +308,7 @@ void maxaflex_state::machine_reset()
{
atari_common_state::machine_reset();
- m_pokey->write(machine().dummy_space(), 15, 0);
+ m_pokey->write(15, 0);
// Supervisor board reset
m_portb_out = 0xff;
diff --git a/src/mame/drivers/maygay1b.cpp b/src/mame/drivers/maygay1b.cpp
index cb203d2c0eb..6be81bbb2d6 100644
--- a/src/mame/drivers/maygay1b.cpp
+++ b/src/mame/drivers/maygay1b.cpp
@@ -439,7 +439,7 @@ WRITE_LINE_MEMBER(maygay1b_state::srsel_w)
WRITE8_MEMBER(maygay1b_state::latch_ch2_w)
{
- m_msm6376->write(space, 0, data&0x7f);
+ m_msm6376->write(data&0x7f);
m_msm6376->ch2_w(data&0x80);
}
@@ -762,10 +762,10 @@ READ8_MEMBER(maygay1b_state::mcu_port2_r)
// machine driver for maygay m1 board /////////////////////////////////
-MACHINE_CONFIG_START(maygay1b_state::maygay_m1)
-
- MCFG_DEVICE_ADD("maincpu", MC6809, M1_MASTER_CLOCK/2) // claimed to be 4 MHz
- MCFG_DEVICE_PROGRAM_MAP(m1_memmap)
+void maygay1b_state::maygay_m1(machine_config &config)
+{
+ MC6809(config, m_maincpu, M1_MASTER_CLOCK/2); // claimed to be 4 MHz
+ m_maincpu->set_addrmap(AS_PROGRAM, &maygay1b_state::m1_memmap);
I80C51(config, m_mcu, 2000000); // EP840034.A-P-80C51AVW
m_mcu->port_in_cb<0>().set(FUNC(maygay1b_state::mcu_port0_r));
@@ -775,9 +775,9 @@ MACHINE_CONFIG_START(maygay1b_state::maygay_m1)
m_mcu->port_out_cb<2>().set(FUNC(maygay1b_state::mcu_port2_w));
m_mcu->port_out_cb<3>().set(FUNC(maygay1b_state::mcu_port3_w));
- MCFG_DEVICE_ADD("duart68681", MC68681, M1_DUART_CLOCK)
- MCFG_MC68681_IRQ_CALLBACK(WRITELINE(*this, maygay1b_state, duart_irq_handler))
- MCFG_MC68681_INPORT_CALLBACK(READ8(*this, maygay1b_state, m1_duart_r))
+ MC68681(config, m_duart68681, M1_DUART_CLOCK);
+ m_duart68681->irq_cb().set(FUNC(maygay1b_state::duart_irq_handler));
+ m_duart68681->inport_cb().set(FUNC(maygay1b_state::m1_duart_r));;
pia6821_device &pia(PIA6821(config, "pia", 0));
pia.writepa_handler().set(FUNC(maygay1b_state::m1_pia_porta_w));
@@ -801,15 +801,15 @@ MACHINE_CONFIG_START(maygay1b_state::maygay_m1)
m_ay->add_route(ALL_OUTPUTS, "lspeaker", 1.0);
m_ay->add_route(ALL_OUTPUTS, "rspeaker", 1.0);
- MCFG_DEVICE_ADD("ymsnd", YM2413, M1_MASTER_CLOCK/4)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 1.0)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 1.0)
+ ym2413_device &ymsnd(YM2413(config, "ymsnd", M1_MASTER_CLOCK/4));
+ ymsnd.add_route(ALL_OUTPUTS, "lspeaker", 1.0);
+ ymsnd.add_route(ALL_OUTPUTS, "rspeaker", 1.0);
- MCFG_DEVICE_ADD("msm6376", OKIM6376, 102400) //? Seems to work well with samples, but unconfirmed
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 1.0)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 1.0)
+ OKIM6376(config, m_msm6376, 102400); //? Seems to work well with samples, but unconfirmed
+ m_msm6376->add_route(ALL_OUTPUTS, "lspeaker", 1.0);
+ m_msm6376->add_route(ALL_OUTPUTS, "rspeaker", 1.0);
- MCFG_TIMER_DRIVER_ADD_PERIODIC("nmitimer", maygay1b_state, maygay1b_nmitimer_callback, attotime::from_hz(75)) // freq?
+ TIMER(config, "nmitimer").configure_periodic(FUNC(maygay1b_state::maygay1b_nmitimer_callback), attotime::from_hz(75)); // freq?
i8279_device &kbdc(I8279(config, "i8279", M1_MASTER_CLOCK/4)); // unknown clock
kbdc.out_sl_callback().set(FUNC(maygay1b_state::scanlines_w)); // scan SL lines
@@ -836,30 +836,30 @@ MACHINE_CONFIG_START(maygay1b_state::maygay_m1)
REEL(config, m_reels[5], STARPOINT_48STEP_REEL, 1, 3, 0x09, 4);
m_reels[5]->optic_handler().set(FUNC(maygay1b_state::reel_optic_cb<5>));
- MCFG_DEVICE_ADD("meters", METERS, 0)
- MCFG_METERS_NUMBER(8)
+ METERS(config, m_meters, 0).set_number(8);
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
config.set_default_layout(layout_maygay1b);
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(maygay1b_state::maygay_m1_no_oki)
+void maygay1b_state::maygay_m1_no_oki(machine_config &config)
+{
maygay_m1(config);
- MCFG_DEVICE_REMOVE("msm6376")
-MACHINE_CONFIG_END
+ config.device_remove("msm6376");
+}
-MACHINE_CONFIG_START(maygay1b_state::maygay_m1_nec)
+void maygay1b_state::maygay_m1_nec(machine_config &config)
+{
maygay_m1(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(m1_nec_memmap)
+ m_maincpu->set_addrmap(AS_PROGRAM, &maygay1b_state::m1_nec_memmap);
- MCFG_DEVICE_REMOVE("msm6376")
+ config.device_remove("msm6376");
- MCFG_DEVICE_ADD("upd", UPD7759)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 1.0)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 1.0)
-MACHINE_CONFIG_END
+ UPD7759(config, m_upd7759);
+ m_upd7759->add_route(ALL_OUTPUTS, "lspeaker", 1.0);
+ m_upd7759->add_route(ALL_OUTPUTS, "rspeaker", 1.0);
+}
WRITE8_MEMBER(maygay1b_state::m1ab_no_oki_w)
{
diff --git a/src/mame/drivers/maygayep.cpp b/src/mame/drivers/maygayep.cpp
index 858796660b8..4d3399db597 100644
--- a/src/mame/drivers/maygayep.cpp
+++ b/src/mame/drivers/maygayep.cpp
@@ -105,15 +105,15 @@ void maygayep_state::init_maygayep()
}
-MACHINE_CONFIG_START(maygayep_state::maygayep)
- MCFG_DEVICE_ADD("maincpu", H83002, 16000000 )
- MCFG_DEVICE_PROGRAM_MAP( maygayep_map )
+void maygayep_state::maygayep(machine_config &config)
+{
+ H83002(config, m_maincpu, 16000000);
+ m_maincpu->set_addrmap(AS_PROGRAM, &maygayep_state::maygayep_map);
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("ymz", YMZ280B, 10000000 )
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
-MACHINE_CONFIG_END
+ YMZ280B(config, "ymz", 10000000).add_route(ALL_OUTPUTS, "mono", 1.0);
+}
#define MISSING_SOUND \
ROM_REGION( 0x100000, "ymz", ROMREGION_ERASE00 ) \
diff --git a/src/mame/drivers/maygaysw.cpp b/src/mame/drivers/maygaysw.cpp
index 137b5b72fbc..4fb1f75042d 100644
--- a/src/mame/drivers/maygaysw.cpp
+++ b/src/mame/drivers/maygaysw.cpp
@@ -131,12 +131,12 @@ static INPUT_PORTS_START( maygayew )
INPUT_PORTS_END
-MACHINE_CONFIG_START(maygayew_state::maygayew)
-
+void maygayew_state::maygayew(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M68000,8000000) // MC68306FC16 - standard 68000 core + peripherals
- MCFG_DEVICE_PROGRAM_MAP(maygayew_map)
-MACHINE_CONFIG_END
+ M68000(config, m_maincpu, 8000000); // MC68306FC16 - standard 68000 core + peripherals
+ m_maincpu->set_addrmap(AS_PROGRAM, &maygayew_state::maygayew_map);
+}
ROM_START( mg_gbr )
ROM_REGION( 0x040000, "mainrom", 0 )
diff --git a/src/mame/drivers/maygayv1.cpp b/src/mame/drivers/maygayv1.cpp
index f027400471f..5bc77116c26 100644
--- a/src/mame/drivers/maygayv1.cpp
+++ b/src/mame/drivers/maygayv1.cpp
@@ -878,9 +878,10 @@ void maygayv1_state::machine_reset()
}
-MACHINE_CONFIG_START(maygayv1_state::maygayv1)
- MCFG_DEVICE_ADD("maincpu", M68000, MASTER_CLOCK / 2)
- MCFG_DEVICE_PROGRAM_MAP(main_map)
+void maygayv1_state::maygayv1(machine_config &config)
+{
+ M68000(config, m_maincpu, MASTER_CLOCK / 2);
+ m_maincpu->set_addrmap(AS_PROGRAM, &maygayv1_state::main_map);
I8052(config, m_soundcpu, SOUND_CLOCK);
m_soundcpu->set_addrmap(AS_PROGRAM, &maygayv1_state::sound_prg);
@@ -899,20 +900,20 @@ MACHINE_CONFIG_START(maygayv1_state::maygayv1)
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
/* TODO: Use real video timings */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500))
- MCFG_SCREEN_SIZE(640, 300)
- MCFG_SCREEN_VISIBLE_AREA(0, 640 - 1, 0, 300 - 1)
- MCFG_SCREEN_UPDATE_DRIVER(maygayv1_state, screen_update_maygayv1)
- MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE(*this, maygayv1_state, screen_vblank_maygayv1))
- MCFG_SCREEN_PALETTE("palette")
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500));
+ screen.set_size(640, 300);
+ screen.set_visarea(0, 640 - 1, 0, 300 - 1);
+ screen.set_screen_update(FUNC(maygayv1_state::screen_update_maygayv1));
+ screen.screen_vblank().set(FUNC(maygayv1_state::screen_vblank_maygayv1));
+ screen.set_palette("palette");
- MCFG_PALETTE_ADD("palette", 16)
+ PALETTE(config, "palette").set_entries(16);
- MCFG_DEVICE_ADD("duart68681", MC68681, DUART_CLOCK)
- MCFG_MC68681_IRQ_CALLBACK(WRITELINE(*this, maygayv1_state, duart_irq_handler))
- MCFG_MC68681_A_TX_CALLBACK(WRITELINE(*this, maygayv1_state, duart_txa))
+ MC68681(config, m_duart68681, DUART_CLOCK);
+ m_duart68681->irq_cb().set(FUNC(maygayv1_state::duart_irq_handler));
+ m_duart68681->a_tx_cb().set(FUNC(maygayv1_state::duart_txa));;
i8279_device &kbdc(I8279(config, "i8279", MASTER_CLOCK/4)); // unknown clock
kbdc.out_sl_callback().set(FUNC(maygayv1_state::strobe_w)); // scan SL lines
@@ -921,12 +922,10 @@ MACHINE_CONFIG_START(maygayv1_state::maygayv1)
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("ymsnd",YM2413, MASTER_CLOCK / 4)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.8)
+ YM2413(config, "ymsnd", MASTER_CLOCK / 4).add_route(ALL_OUTPUTS, "mono", 0.8);
- MCFG_DEVICE_ADD("upd",UPD7759)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.50)
-MACHINE_CONFIG_END
+ UPD7759(config, m_upd7759).add_route(ALL_OUTPUTS, "mono", 0.50);
+}
/*************************************
diff --git a/src/mame/drivers/mazerbla.cpp b/src/mame/drivers/mazerbla.cpp
index 5ccac260c7e..c5cdaa330d3 100644
--- a/src/mame/drivers/mazerbla.cpp
+++ b/src/mame/drivers/mazerbla.cpp
@@ -973,85 +973,85 @@ void mazerbla_state::machine_reset()
}
}
-MACHINE_CONFIG_START(mazerbla_state::mazerbla)
-
+void mazerbla_state::mazerbla(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, MASTER_CLOCK) /* 4 MHz, no NMI, IM2 - vectors at 0xf8, 0xfa, 0xfc */
- MCFG_DEVICE_PROGRAM_MAP(mazerbla_map)
- MCFG_DEVICE_IO_MAP(mazerbla_io_map)
- MCFG_DEVICE_IRQ_ACKNOWLEDGE_DRIVER(mazerbla_state,irq_callback)
-
- MCFG_DEVICE_ADD("sub", Z80, MASTER_CLOCK) /* 4 MHz, NMI, IM1 INT */
- MCFG_DEVICE_PROGRAM_MAP(mazerbla_cpu2_map)
- MCFG_DEVICE_IO_MAP(mazerbla_cpu2_io_map)
- MCFG_DEVICE_PERIODIC_INT_DRIVER(mazerbla_state, irq0_line_hold, 400) /* frequency in Hz */
-
- MCFG_DEVICE_ADD("sub2", Z80, MASTER_CLOCK) /* 4 MHz, no NMI, IM1 INT */
- MCFG_DEVICE_PROGRAM_MAP(mazerbla_cpu3_map)
- MCFG_DEVICE_IO_MAP(mazerbla_cpu3_io_map)
+ Z80(config, m_maincpu, MASTER_CLOCK); /* 4 MHz, no NMI, IM2 - vectors at 0xf8, 0xfa, 0xfc */
+ m_maincpu->set_addrmap(AS_PROGRAM, &mazerbla_state::mazerbla_map);
+ m_maincpu->set_addrmap(AS_IO, &mazerbla_state::mazerbla_io_map);
+ m_maincpu->set_irq_acknowledge_callback(FUNC(mazerbla_state::irq_callback));
+
+ Z80(config, m_subcpu, MASTER_CLOCK); /* 4 MHz, NMI, IM1 INT */
+ m_subcpu->set_addrmap(AS_PROGRAM, &mazerbla_state::mazerbla_cpu2_map);
+ m_subcpu->set_addrmap(AS_IO, &mazerbla_state::mazerbla_cpu2_io_map);
+ m_subcpu->set_periodic_int(FUNC(mazerbla_state::irq0_line_hold), attotime::from_hz(400)); /* frequency in Hz */
+
+ z80_device &sub2(Z80(config, "sub2", MASTER_CLOCK)); /* 4 MHz, no NMI, IM1 INT */
+ sub2.set_addrmap(AS_PROGRAM, &mazerbla_state::mazerbla_cpu3_map);
+ sub2.set_addrmap(AS_IO, &mazerbla_state::mazerbla_cpu3_io_map);
/* (vblank related ??) int generated by a custom video processor
and cleared on ANY port access.
but handled differently for now
*/
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", mazerbla_state, irq0_line_hold)
+ sub2.set_vblank_int("screen", FUNC(mazerbla_state::irq0_line_hold));
/* synchronization forced on the fly */
- MCFG_DEVICE_ADD("vcu", MB_VCU, SOUND_CLOCK/4)
- MCFG_MB_VCU_CPU("sub2")
- MCFG_MB_VCU_PALETTE("palette")
+ MB_VCU(config, m_vcu, SOUND_CLOCK/4);
+ m_vcu->set_cpu_tag("sub2");
+ m_vcu->set_palette_tag("palette");
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */)
- MCFG_SCREEN_SIZE(40*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 0*8, 28*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(mazerbla_state, screen_update_mazerbla)
- MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE(*this, mazerbla_state, screen_vblank))
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_refresh_hz(60);
+ m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(2500) /* not accurate */);
+ m_screen->set_size(40*8, 32*8);
+ m_screen->set_visarea(0*8, 32*8-1, 0*8, 28*8-1);
+ m_screen->set_screen_update(FUNC(mazerbla_state::screen_update_mazerbla));
+ m_screen->screen_vblank().set(FUNC(mazerbla_state::screen_vblank));
PALETTE(config, "palette", FUNC(mazerbla_state::mazerbla_palette), 256+1);
/* sound hardware */
-MACHINE_CONFIG_END
-
+}
-MACHINE_CONFIG_START(mazerbla_state::greatgun)
+void mazerbla_state::greatgun(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, MASTER_CLOCK) /* 4 MHz, no NMI, IM2 - vectors at 0xf8, 0xfa, 0xfc */
- MCFG_DEVICE_PROGRAM_MAP(mazerbla_map)
- MCFG_DEVICE_IO_MAP(greatgun_io_map)
- MCFG_DEVICE_IRQ_ACKNOWLEDGE_DRIVER(mazerbla_state,irq_callback)
-
- MCFG_DEVICE_ADD("sub", Z80, SOUND_CLOCK / 4) /* 3.579500 MHz, NMI - caused by sound command write, periodic INT */
- MCFG_DEVICE_PROGRAM_MAP(greatgun_sound_map)
- MCFG_DEVICE_PERIODIC_INT_DRIVER(mazerbla_state, sound_interrupt, (double)14318180/16/16/16/16 )
-
- MCFG_DEVICE_ADD("sub2", Z80, MASTER_CLOCK) /* 4 MHz, no NMI, IM1 INT */
- MCFG_DEVICE_PROGRAM_MAP(mazerbla_cpu3_map)
- MCFG_DEVICE_IO_MAP(greatgun_cpu3_io_map)
+ Z80(config, m_maincpu, MASTER_CLOCK); /* 4 MHz, no NMI, IM2 - vectors at 0xf8, 0xfa, 0xfc */
+ m_maincpu->set_addrmap(AS_PROGRAM, &mazerbla_state::mazerbla_map);
+ m_maincpu->set_addrmap(AS_IO, &mazerbla_state::greatgun_io_map);
+ m_maincpu->set_irq_acknowledge_callback(FUNC(mazerbla_state::irq_callback));
+
+ Z80(config, m_subcpu, SOUND_CLOCK / 4); /* 3.579500 MHz, NMI - caused by sound command write, periodic INT */
+ m_subcpu->set_addrmap(AS_PROGRAM, &mazerbla_state::greatgun_sound_map);
+ m_subcpu->set_periodic_int(FUNC(mazerbla_state::sound_interrupt), attotime::from_hz((double)14318180/16/16/16/16 ));
+
+ z80_device &sub2(Z80(config, "sub2", MASTER_CLOCK)); /* 4 MHz, no NMI, IM1 INT */
+ sub2.set_addrmap(AS_PROGRAM, &mazerbla_state::mazerbla_cpu3_map);
+ sub2.set_addrmap(AS_IO, &mazerbla_state::greatgun_cpu3_io_map);
/* (vblank related ??) int generated by a custom video processor
and cleared on ANY port access.
but handled differently for now
*/
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", mazerbla_state, irq0_line_hold)
+ sub2.set_vblank_int("screen", FUNC(mazerbla_state::irq0_line_hold));
- MCFG_DEVICE_ADD("vcu", MB_VCU, SOUND_CLOCK/4)
- MCFG_MB_VCU_CPU("sub2")
- MCFG_MB_VCU_PALETTE("palette")
+ MB_VCU(config, m_vcu, SOUND_CLOCK/4);
+ m_vcu->set_cpu_tag("sub2");
+ m_vcu->set_palette_tag("palette");
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */)
- MCFG_SCREEN_SIZE(40*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 0*8, 28*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(mazerbla_state, screen_update_mazerbla)
- MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE(*this, mazerbla_state, screen_vblank))
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_refresh_hz(60);
+ m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(2500) /* not accurate */);
+ m_screen->set_size(40*8, 32*8);
+ m_screen->set_visarea(0*8, 32*8-1, 0*8, 28*8-1);
+ m_screen->set_screen_update(FUNC(mazerbla_state::screen_update_mazerbla));
+ m_screen->screen_vblank().set(FUNC(mazerbla_state::screen_vblank));
PALETTE(config, "palette", FUNC(mazerbla_state::mazerbla_palette), 246+1);
@@ -1069,7 +1069,7 @@ MACHINE_CONFIG_START(mazerbla_state::greatgun)
GENERIC_LATCH_8(config, m_soundlatch);
m_soundlatch->data_pending_callback().set_inputline(m_subcpu, INPUT_LINE_NMI);
m_soundlatch->set_separate_acknowledge(true);
-MACHINE_CONFIG_END
+}
/*************************************
*
diff --git a/src/mame/drivers/mbc200.cpp b/src/mame/drivers/mbc200.cpp
index 62cb696500f..abb4dd2f6c1 100644
--- a/src/mame/drivers/mbc200.cpp
+++ b/src/mame/drivers/mbc200.cpp
@@ -302,24 +302,25 @@ static GFXDECODE_START( gfx_mbc200 )
GFXDECODE_END
-MACHINE_CONFIG_START(mbc200_state::mbc200)
+void mbc200_state::mbc200(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, 8_MHz_XTAL / 2) // NEC D780C-1
- MCFG_DEVICE_PROGRAM_MAP(mbc200_mem)
- MCFG_DEVICE_IO_MAP(mbc200_io)
+ Z80(config, m_maincpu, 8_MHz_XTAL / 2); // NEC D780C-1
+ m_maincpu->set_addrmap(AS_PROGRAM, &mbc200_state::mbc200_mem);
+ m_maincpu->set_addrmap(AS_IO, &mbc200_state::mbc200_io);
- MCFG_DEVICE_ADD("subcpu", Z80, 8_MHz_XTAL / 2) // NEC D780C-1
- MCFG_DEVICE_PROGRAM_MAP(mbc200_sub_mem)
- MCFG_DEVICE_IO_MAP(mbc200_sub_io)
+ z80_device &subcpu(Z80(config, "subcpu", 8_MHz_XTAL / 2)); // NEC D780C-1
+ subcpu.set_addrmap(AS_PROGRAM, &mbc200_state::mbc200_sub_mem);
+ subcpu.set_addrmap(AS_IO, &mbc200_state::mbc200_sub_io);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(50)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */
- MCFG_SCREEN_SIZE(640, 400)
- MCFG_SCREEN_VISIBLE_AREA(0, 640-1, 0, 400-1)
- MCFG_SCREEN_UPDATE_DEVICE("crtc", h46505_device, screen_update)
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_mbc200)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(50);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */
+ screen.set_size(640, 400);
+ screen.set_visarea(0, 640-1, 0, 400-1);
+ screen.set_screen_update("crtc", FUNC(h46505_device::screen_update));
+ GFXDECODE(config, "gfxdecode", m_palette, gfx_mbc200);
PALETTE(config, m_palette, palette_device::MONOCHROME);
H46505(config, m_crtc, 8_MHz_XTAL / 4); // HD46505SP
@@ -330,10 +331,8 @@ MACHINE_CONFIG_START(mbc200_state::mbc200)
// sound
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("beeper", BEEP, 1000) // frequency unknown
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.50)
- MCFG_DEVICE_ADD("speaker", SPEAKER_SOUND)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.50)
+ BEEP(config, m_beep, 1000).add_route(ALL_OUTPUTS, "mono", 0.50); // frequency unknown
+ SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.50);
I8255(config, "ppi_1").out_pc_callback().set(FUNC(mbc200_state::p1_portc_w));
I8255(config, "ppi_2").in_pa_callback().set(FUNC(mbc200_state::p2_porta_r));
@@ -347,18 +346,16 @@ MACHINE_CONFIG_START(mbc200_state::mbc200)
I8251(config, "uart2", 0); // INS8251A
MB8876(config, m_fdc, 8_MHz_XTAL / 8); // guess
- MCFG_FLOPPY_DRIVE_ADD("fdc:0", mbc200_floppies, "qd", floppy_image_device::default_floppy_formats)
- MCFG_FLOPPY_DRIVE_SOUND(true)
- MCFG_FLOPPY_DRIVE_ADD("fdc:1", mbc200_floppies, "qd", floppy_image_device::default_floppy_formats)
- MCFG_FLOPPY_DRIVE_SOUND(true)
+ FLOPPY_CONNECTOR(config, "fdc:0", mbc200_floppies, "qd", floppy_image_device::default_floppy_formats).enable_sound(true);
+ FLOPPY_CONNECTOR(config, "fdc:1", mbc200_floppies, "qd", floppy_image_device::default_floppy_formats).enable_sound(true);
/* Keyboard */
generic_keyboard_device &keyboard(GENERIC_KEYBOARD(config, "keyboard", 0));
keyboard.set_keyboard_callback(FUNC(mbc200_state::kbd_put));
/* software lists */
- MCFG_SOFTWARE_LIST_ADD("flop_list", "mbc200")
-MACHINE_CONFIG_END
+ SOFTWARE_LIST(config, "flop_list").set_original("mbc200");
+}
/* ROM definition */
ROM_START( mbc200 )
diff --git a/src/mame/drivers/mbc55x.cpp b/src/mame/drivers/mbc55x.cpp
index aa8b1bb7041..73629a1945f 100644
--- a/src/mame/drivers/mbc55x.cpp
+++ b/src/mame/drivers/mbc55x.cpp
@@ -8,11 +8,6 @@
Phill Harvey-Smith
2011-01-29.
-
-ToDo:
-- Fix the sound
-- Add serial uart
-
*/
@@ -22,27 +17,14 @@ ToDo:
#include "bus/isa/isa_cards.h"
//#include "bus/pc_joy/pc_joy.h"
#include "bus/rs232/rs232.h"
-#include "cpu/mcs48/mcs48.h"
#include "machine/clock.h"
#include "machine/i8087.h"
#include "machine/input_merger.h"
+#include "machine/mbc55x_kbd.h"
#include "screen.h"
#include "softlist.h"
#include "speaker.h"
-static constexpr rgb_t mbc55x_pens[SCREEN_NO_COLOURS]
-{
- // normal brightness
- { 0x00, 0x00, 0x00 }, // black
- { 0x00, 0x00, 0x80 }, // blue
- { 0x00, 0x80, 0x00 }, // green
- { 0x00, 0x80, 0x80 }, // cyan
- { 0x80, 0x00, 0x00 }, // red
- { 0x80, 0x00, 0x80 }, // magenta
- { 0x80, 0x80, 0x00 }, // yellow
- { 0x80, 0x80, 0x80 } // light grey
-};
-
void mbc55x_state::mbc55x_mem(address_map &map)
{
@@ -82,155 +64,145 @@ void mbc55x_state::mbc55x_iodecode(address_map &map)
map(0x14, 0x15).mirror(0x02).rw("sio", FUNC(i8251_device::read), FUNC(i8251_device::write));
map(0x18, 0x18).mirror(0x02).rw(m_crtc, FUNC(mc6845_device::status_r), FUNC(mc6845_device::address_w));
map(0x19, 0x19).mirror(0x02).rw(m_crtc, FUNC(mc6845_device::register_r), FUNC(mc6845_device::register_w));
- map(0x1c, 0x1d).mirror(0x02).r(FUNC(mbc55x_state::mbc55x_kb_usart_r)).w(m_kb_uart, FUNC(i8251_device::write));
+ map(0x1c, 0x1d).mirror(0x02).rw(m_kb_uart, FUNC(i8251_device::read), FUNC(i8251_device::write));
}
-static INPUT_PORTS_START( mbc55x )
- PORT_START("KEY0") /* Key row 0 scancodes 00..07 */
- PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("1") PORT_CODE(KEYCODE_1) PORT_CHAR('1')
- PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("2") PORT_CODE(KEYCODE_2) PORT_CHAR('2')
- PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("3") PORT_CODE(KEYCODE_3) PORT_CHAR('3')
- PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("4") PORT_CODE(KEYCODE_4) PORT_CHAR('4')
- PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("5") PORT_CODE(KEYCODE_5) PORT_CHAR('5')
- PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("6") PORT_CODE(KEYCODE_6) PORT_CHAR('6')
- PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("7") PORT_CODE(KEYCODE_7) PORT_CHAR('7')
- PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("8") PORT_CODE(KEYCODE_8) PORT_CHAR('8')
-
- PORT_START("KEY1") /* Key row 1 scancodes 08..0F */
- PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("9") PORT_CODE(KEYCODE_9) PORT_CHAR('9')
- PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("0") PORT_CODE(KEYCODE_0) PORT_CHAR('0')
- PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("-") PORT_CODE(KEYCODE_MINUS) PORT_CHAR('-')
- PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("=") PORT_CODE(KEYCODE_EQUALS) PORT_CHAR('=')
- PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("BSLASH") PORT_CODE(KEYCODE_BACKSLASH) PORT_CHAR('\\')
- PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Q") PORT_CODE(KEYCODE_Q) PORT_CHAR('Q')
- PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("W") PORT_CODE(KEYCODE_W) PORT_CHAR('W')
- PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("E") PORT_CODE(KEYCODE_E) PORT_CHAR('E')
-
- PORT_START("KEY2") /* Key row 2 scancodes 10..17 */
- PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("R") PORT_CODE(KEYCODE_R) PORT_CHAR('R')
- PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("T") PORT_CODE(KEYCODE_T) PORT_CHAR('T')
- PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Y") PORT_CODE(KEYCODE_Y) PORT_CHAR('Y')
- PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("U") PORT_CODE(KEYCODE_U) PORT_CHAR('U')
- PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("I") PORT_CODE(KEYCODE_I) PORT_CHAR('I')
- PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("O") PORT_CODE(KEYCODE_O) PORT_CHAR('O')
- PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("P") PORT_CODE(KEYCODE_P) PORT_CHAR('P')
- PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("[") PORT_CODE(KEYCODE_OPENBRACE) PORT_CHAR('[')
-
-
- PORT_START("KEY3") /* Key row 3 scancodes 18..1F */
- PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("]") PORT_CODE(KEYCODE_CLOSEBRACE) PORT_CHAR(']')
- PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("A") PORT_CODE(KEYCODE_A) PORT_CHAR('A')
- PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("S") PORT_CODE(KEYCODE_S) PORT_CHAR('S')
- PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("D") PORT_CODE(KEYCODE_D) PORT_CHAR('D')
- PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("F") PORT_CODE(KEYCODE_F) PORT_CHAR('F')
- PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("G") PORT_CODE(KEYCODE_G) PORT_CHAR('G')
- PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("H") PORT_CODE(KEYCODE_H) PORT_CHAR('H')
- PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("J") PORT_CODE(KEYCODE_J) PORT_CHAR('J')
-
- PORT_START("KEY4") /* Key row 4 scancodes 20..27 */
- PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("K") PORT_CODE(KEYCODE_K) PORT_CHAR('K')
- PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("L") PORT_CODE(KEYCODE_L) PORT_CHAR('L')
- PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME(";") PORT_CODE(KEYCODE_COLON) PORT_CHAR(';')
- PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("TILDE") PORT_CODE(KEYCODE_TILDE) PORT_CHAR('`')
- PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("#") PORT_CODE(KEYCODE_QUOTE) PORT_CHAR('#')
- PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("ENTER") PORT_CODE(KEYCODE_ENTER) PORT_CHAR(0x0D)
- PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Z") PORT_CODE(KEYCODE_Z) PORT_CHAR('Z')
- PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("X") PORT_CODE(KEYCODE_X) PORT_CHAR('X')
-
-
- PORT_START("KEY5") /* Key row 5 scancodes 28..2F */
- PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("C") PORT_CODE(KEYCODE_C) PORT_CHAR('C')
- PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("V") PORT_CODE(KEYCODE_V) PORT_CHAR('V')
- PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("B") PORT_CODE(KEYCODE_B) PORT_CHAR('B')
- PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("N") PORT_CODE(KEYCODE_N) PORT_CHAR('N')
- PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("M") PORT_CODE(KEYCODE_M) PORT_CHAR('M')
- PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME(",") PORT_CODE(KEYCODE_COMMA) PORT_CHAR(',')
- PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME(".") PORT_CODE(KEYCODE_STOP) PORT_CHAR('.')
- PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("/") PORT_CODE(KEYCODE_SLASH) PORT_CHAR('/')
-
- PORT_START("KEY6") /* Key row 6 scancodes 30..37 */
- PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("SPACE") PORT_CODE(KEYCODE_SPACE) PORT_CHAR(' ')
- PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_BACKSPACE) PORT_CHAR(0x08)
- PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_UNUSED)
- PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_UNUSED)
- PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_UNUSED)
- PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_UNUSED)
- PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_UNUSED)
- PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_UNUSED)
-
-#if 0
- PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("BACKSLASH") PORT_CODE(KEYCODE_BACKSLASH) PORT_CHAR('\\')
- PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("LSHIFT") PORT_CODE(KEYCODE_LSHIFT) PORT_CHAR(UCHAR_SHIFT_1)
-
- PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("CTRL") PORT_CODE(KEYCODE_LCONTROL) PORT_CODE(KEYCODE_RCONTROL) // Ether control
-
- PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("RSHIFT") PORT_CODE(KEYCODE_RSHIFT) PORT_CHAR(UCHAR_SHIFT_2)
- PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("PRSCR") PORT_CODE(KEYCODE_ASTERISK) PORT_CHAR('*')
-
- PORT_START("KEY7") /* Key row 7 scancodes 38..3F */
- PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("ALT") PORT_CODE(KEYCODE_LALT) PORT_CODE(KEYCODE_RALT)
- PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("CAPS") PORT_CODE(KEYCODE_CAPSLOCK)
- PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("F1") PORT_CODE(KEYCODE_F1)
- PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("F2") PORT_CODE(KEYCODE_F2)
- PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("F3") PORT_CODE(KEYCODE_F3)
- PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("F4") PORT_CODE(KEYCODE_F4)
- PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("F5") PORT_CODE(KEYCODE_F5)
-
- PORT_START("KEY8") /* Key row 8 scancodes 40..47 */
- PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("F6") PORT_CODE(KEYCODE_F6)
- PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("F7") PORT_CODE(KEYCODE_F7)
- PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("F8") PORT_CODE(KEYCODE_F8)
- PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("F9") PORT_CODE(KEYCODE_F9)
- PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("F10") PORT_CODE(KEYCODE_F10)
- PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("NUMLK") PORT_CODE(KEYCODE_NUMLOCK)
- PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("SCRLK") PORT_CODE(KEYCODE_SCRLOCK)
- PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("KP7") PORT_CODE(KEYCODE_7_PAD) PORT_CHAR('7')
-
- PORT_START("KEY9") /* Key row 9 scancodes 48..4F */
- PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("KP8") PORT_CODE(KEYCODE_8_PAD) //PORT_CHAR('8')
- PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("KP9") PORT_CODE(KEYCODE_9_PAD) //PORT_CHAR('9')
- PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("KP-") PORT_CODE(KEYCODE_MINUS_PAD) //PORT_CHAR('-')
- PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("KP4") PORT_CODE(KEYCODE_4_PAD) //PORT_CHAR('4')
- PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("KP5") PORT_CODE(KEYCODE_5_PAD) //PORT_CHAR('5')
- PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("KP6") PORT_CODE(KEYCODE_6_PAD) //PORT_CHAR('6')
- PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("KP+") PORT_CODE(KEYCODE_PLUS_PAD) //PORT_CHAR('+')
- PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("KP1") PORT_CODE(KEYCODE_1_PAD) //PORT_CHAR('1')
-
- PORT_START("KEY10") /* Key row 10 scancodes 50..57 */
- PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("KP2") PORT_CODE(KEYCODE_2_PAD) //PORT_CHAR('2')
- PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("KP3") PORT_CODE(KEYCODE_3_PAD) //PORT_CHAR('3')
- PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("KP0") PORT_CODE(KEYCODE_0_PAD) //PORT_CHAR('0')
- PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("KP.") PORT_CODE(KEYCODE_DEL_PAD) //PORT_CHAR('.')
- PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_UNUSED)
- PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_UNUSED)
- PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_UNUSED)
- PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_UNUSED)
- //PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("KP5") PORT_CODE(KEYCODE_5_PAD) PORT_CHAR('5')
- //PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("KP6") PORT_CODE(KEYCODE_6_PAD) PORT_CHAR('6')
- //PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("KP+") PORT_CODE(KEYCODE_PLUS_PAD) PORT_CHAR('+')
- //PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("KP1") PORT_CODE(KEYCODE_1_PAD) PORT_CHAR('1')
-#endif
-
- PORT_START(KEY_SPECIAL_TAG)
- PORT_BIT(KEY_BIT_LSHIFT, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("LSHIFT") PORT_CODE(KEYCODE_LSHIFT) PORT_CHAR(UCHAR_SHIFT_1)
- PORT_BIT(KEY_BIT_RSHIFT, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("RSHIFT") PORT_CODE(KEYCODE_RSHIFT) PORT_CHAR(UCHAR_SHIFT_2)
- PORT_BIT(KEY_BIT_CTRL, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("CTRL") PORT_CODE(KEYCODE_LCONTROL) PORT_CODE(KEYCODE_RCONTROL) // Ether control
- PORT_BIT(KEY_BIT_GRAPH, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("GRAPH") PORT_CODE(KEYCODE_LALT) PORT_CODE(KEYCODE_RALT)
- PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_UNUSED)
- PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_UNUSED)
- PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_UNUSED)
- PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_UNUSED)
+uint8_t mbc55x_state::iodecode_r(offs_t offset)
+{
+ return m_iodecode->read8(offset >> 1);
+}
-INPUT_PORTS_END
+void mbc55x_state::iodecode_w(offs_t offset, uint8_t data)
+{
+ m_iodecode->write8(offset >> 1, data);
+}
+/* 8255 Configuration */
-void mbc55x_state::mbc55x_palette(palette_device &palette) const
+uint8_t mbc55x_state::game_io_r()
{
- logerror("initializing palette\n");
+ return 0xff;
+}
- palette.set_pen_colors(0, mbc55x_pens);
+void mbc55x_state::game_io_w(uint8_t data)
+{
}
+uint8_t mbc55x_state::printer_status_r()
+{
+ return m_printer_status;
+}
+
+void mbc55x_state::printer_data_w(uint8_t data)
+{
+ m_printer->write_data7(!BIT(data, 7));
+ m_printer->write_data6(!BIT(data, 6));
+ m_printer->write_data5(!BIT(data, 5));
+ m_printer->write_data4(!BIT(data, 4));
+ m_printer->write_data3(!BIT(data, 3));
+ m_printer->write_data2(!BIT(data, 2));
+ m_printer->write_data1(!BIT(data, 1));
+ m_printer->write_data0(!BIT(data, 0));
+}
+
+void mbc55x_state::disk_select_w(uint8_t data)
+{
+ floppy_image_device *floppy = nullptr;
+
+ switch (data & 0x03)
+ {
+ case 0: floppy = m_floppy[0]->get_device(); break;
+ case 1: floppy = m_floppy[1]->get_device(); break;
+ case 2: floppy = m_floppy[2]->get_device(); break;
+ case 3: floppy = m_floppy[3]->get_device(); break;
+ }
+
+ m_fdc->set_floppy(floppy);
+
+ if (floppy)
+ {
+ floppy->mon_w(0);
+ floppy->ss_w(BIT(data, 2));
+ }
+
+ m_printer->write_strobe(!BIT(data, 3));
+}
+
+WRITE_LINE_MEMBER(mbc55x_state::printer_busy_w)
+{
+ m_printer_status = (m_printer_status & 0xef) | (state ? 0x10 : 0x00);
+}
+
+WRITE_LINE_MEMBER(mbc55x_state::printer_paper_end_w)
+{
+ m_printer_status = (m_printer_status & 0xdf) | (state ? 0x20 : 0x00);
+}
+
+WRITE_LINE_MEMBER(mbc55x_state::printer_select_w)
+{
+ m_printer_status = (m_printer_status & 0xbf) | (state ? 0x40 : 0x00);
+}
+
+
+void mbc55x_state::set_ram_size()
+{
+ address_space &space = m_maincpu->space( AS_PROGRAM );
+ int ramsize = m_ram->size();
+ int nobanks = ramsize / RAM_BANK_SIZE;
+ char bank[10];
+ int bankno;
+ uint8_t *ram = &m_ram->pointer()[0];
+ uint8_t *map_base;
+ int bank_base;
+
+
+ logerror("Ramsize is %d bytes\n",ramsize);
+ logerror("RAM_BANK_SIZE=%d, nobanks=%d\n",RAM_BANK_SIZE,nobanks);
+
+ // Main memory mapping
+
+ for(bankno=0; bankno<RAM_BANK_COUNT; bankno++)
+ {
+ sprintf(bank,"bank%x",bankno);
+ bank_base=bankno*RAM_BANK_SIZE;
+ map_base=&ram[bank_base];
+
+ if(bankno<nobanks)
+ {
+ membank(bank)->set_base(map_base);
+ space.install_readwrite_bank(bank_base, bank_base+(RAM_BANK_SIZE-1), bank);
+ logerror("Mapping bank %d at %05X to RAM\n",bankno,bank_base);
+ }
+ else
+ {
+ space.nop_readwrite(bank_base, bank_base+(RAM_BANK_SIZE-1));
+ logerror("Mapping bank %d at %05X to NOP\n",bankno,bank_base);
+ }
+ }
+
+ // Graphics red and blue plane memory mapping, green is in main memory
+ membank(RED_PLANE_TAG)->set_base(&m_video_mem[RED_PLANE_OFFSET]);
+ space.install_readwrite_bank(RED_PLANE_MEMBASE, RED_PLANE_MEMBASE+(COLOUR_PLANE_SIZE-1), RED_PLANE_TAG);
+ membank(BLUE_PLANE_TAG)->set_base(&m_video_mem[BLUE_PLANE_OFFSET]);
+ space.install_readwrite_bank(BLUE_PLANE_MEMBASE, BLUE_PLANE_MEMBASE+(COLOUR_PLANE_SIZE-1), BLUE_PLANE_TAG);
+}
+
+void mbc55x_state::machine_reset()
+{
+ set_ram_size();
+}
+
+void mbc55x_state::machine_start()
+{
+ m_printer_status = 0xff;
+
+ m_kb_uart->write_cts(0);
+}
+
+
+static INPUT_PORTS_START( mbc55x )
+INPUT_PORTS_END
+
FLOPPY_FORMATS_MEMBER( mbc55x_state::floppy_formats )
FLOPPY_PC_FORMAT
@@ -250,7 +222,8 @@ static void mbc55x_floppies(device_slot_interface &device)
}
-MACHINE_CONFIG_START(mbc55x_state::mbc55x)
+void mbc55x_state::mbc55x(machine_config &config)
+{
/* basic machine hardware */
I8088(config, m_maincpu, 14.318181_MHz_XTAL / 4);
m_maincpu->set_addrmap(AS_PROGRAM, &mbc55x_state::mbc55x_mem);
@@ -260,8 +233,7 @@ MACHINE_CONFIG_START(mbc55x_state::mbc55x)
m_maincpu->esc_data_handler().set("coproc", FUNC(i8087_device::addr_w));
i8087_device &i8087(I8087(config, "coproc", 14.318181_MHz_XTAL / 4));
- i8087.set_addrmap(AS_PROGRAM, &mbc55x_state::mbc55x_mem);
- i8087.set_data_width(8);
+ i8087.set_space_88(m_maincpu, AS_PROGRAM);
i8087.irq().set(m_pic, FUNC(pic8259_device::ir6_w));
i8087.busy().set_inputline("maincpu", INPUT_LINE_TEST);
@@ -271,7 +243,8 @@ MACHINE_CONFIG_START(mbc55x_state::mbc55x)
m_iodecode->addr_width(5);
m_iodecode->set_addrmap(0, &mbc55x_state::mbc55x_iodecode);
- I8049(config, "kbdc", 6_MHz_XTAL).set_disable();
+ mbc55x_keyboard_device &keyboard(MBC55X_KEYBOARD(config, "keyboard"));
+ keyboard.txd_callback().set(m_kb_uart, FUNC(i8251_device::write_rxd));
/* video hardware */
screen_device &screen(SCREEN(config, SCREEN_TAG, SCREEN_TYPE_RASTER));
@@ -292,7 +265,7 @@ MACHINE_CONFIG_START(mbc55x_state::mbc55x)
m_kb_uart->rts_handler().set(m_printer, FUNC(centronics_device::write_init)).invert();
m_kb_uart->rxrdy_handler().set(m_pic, FUNC(pic8259_device::ir3_w));
- PIT8253(config, m_pit, 0);
+ PIT8253(config, m_pit);
m_pit->out_handler<0>().set(m_pic, FUNC(pic8259_device::ir0_w));
m_pit->out_handler<0>().append(m_pit, FUNC(pit8253_device::write_clk1));
m_pit->out_handler<1>().set(m_pic, FUNC(pic8259_device::ir1_w));
@@ -306,7 +279,7 @@ MACHINE_CONFIG_START(mbc55x_state::mbc55x)
clk_78_6khz.signal_handler().append(m_kb_uart, FUNC(i8251_device::write_txc));
clk_78_6khz.signal_handler().append(m_kb_uart, FUNC(i8251_device::write_rxc));
- PIC8259(config, m_pic, 0);
+ PIC8259(config, m_pic);
m_pic->out_int_callback().set_inputline(m_maincpu, INPUT_LINE_IRQ0);
I8255(config, m_ppi);
@@ -328,18 +301,19 @@ MACHINE_CONFIG_START(mbc55x_state::mbc55x)
FD1793(config, m_fdc, 14.318181_MHz_XTAL / 14); // M5W1793-02P (clock is nominally 1 MHz)
m_fdc->intrq_wr_callback().set(m_pic, FUNC(pic8259_device::ir5_w));
- MCFG_FLOPPY_DRIVE_ADD(m_floppy[0], mbc55x_floppies, "qd", mbc55x_state::floppy_formats)
- MCFG_FLOPPY_DRIVE_ADD(m_floppy[1], mbc55x_floppies, "qd", mbc55x_state::floppy_formats)
- MCFG_FLOPPY_DRIVE_ADD(m_floppy[2], mbc55x_floppies, "", mbc55x_state::floppy_formats)
- MCFG_FLOPPY_DRIVE_ADD(m_floppy[3], mbc55x_floppies, "", mbc55x_state::floppy_formats)
+ FLOPPY_CONNECTOR(config, m_floppy[0], mbc55x_floppies, "qd", mbc55x_state::floppy_formats);
+ FLOPPY_CONNECTOR(config, m_floppy[1], mbc55x_floppies, "qd", mbc55x_state::floppy_formats);
+ FLOPPY_CONNECTOR(config, m_floppy[2], mbc55x_floppies, "", mbc55x_state::floppy_formats);
+ FLOPPY_CONNECTOR(config, m_floppy[3], mbc55x_floppies, "", mbc55x_state::floppy_formats);
/* Software list */
- MCFG_SOFTWARE_LIST_ADD("disk_list","mbc55x")
+ SOFTWARE_LIST(config, "disk_list").set_original("mbc55x");
isa8_device &isa(ISA8(config, "isa", 14.318181_MHz_XTAL / 4));
- isa.set_cputag(m_maincpu);
+ isa.set_memspace(m_maincpu, AS_PROGRAM);
+ isa.set_iospace(m_maincpu, AS_IO);
isa.irq7_callback().set(m_pic, FUNC(pic8259_device::ir7_w)); // all other IRQ and DRQ lines are NC
- //isa.iochck_callback().set_inputline(m_maincpu, INPUT_LINE_NMI));
+ isa.iochck_callback().set_inputline(m_maincpu, INPUT_LINE_NMI).invert();
ISA8_SLOT(config, "external", 0, "isa", pc_isa8_cards, nullptr, false);
@@ -362,7 +336,7 @@ MACHINE_CONFIG_START(mbc55x_state::mbc55x)
m_printer->busy_handler().append(m_pic, FUNC(pic8259_device::ir4_w)).invert();
m_printer->perror_handler().set(FUNC(mbc55x_state::printer_paper_end_w));
m_printer->select_handler().set(FUNC(mbc55x_state::printer_select_w));
-MACHINE_CONFIG_END
+}
ROM_START( mbc55x )
@@ -370,11 +344,7 @@ ROM_START( mbc55x )
ROM_SYSTEM_BIOS(0, "v120", "mbc55x BIOS v1.20 (1983)")
ROMX_LOAD("mbc55x-v120.rom", 0x0000, 0x2000, CRC(b439b4b8) SHA1(6e8df0f3868e3fd0229a5c2720d6c01e46815cab), ROM_BIOS(0))
-
- ROM_REGION(0x0800, "kbdc", 0)
- ROM_LOAD("d8049hc.m1", 0x0000, 0x0800, NO_DUMP)
ROM_END
-
// YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS
COMP( 1983, mbc55x, 0, 0, mbc55x, mbc55x, mbc55x_state, empty_init, "Sanyo", "MBC-55x", 0 )
diff --git a/src/mame/drivers/mbee.cpp b/src/mame/drivers/mbee.cpp
index adc737303a1..0d7d36c9a6c 100644
--- a/src/mame/drivers/mbee.cpp
+++ b/src/mame/drivers/mbee.cpp
@@ -659,14 +659,14 @@ MACHINE_CONFIG_START(mbee_state::mbee)
m_pio->in_pb_callback().set(FUNC(mbee_state::pio_port_b_r));
m_pio->out_pb_callback().set(FUNC(mbee_state::pio_port_b_w));
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(50)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(250)) /* not accurate */
- MCFG_SCREEN_SIZE(64*8, 19*16) /* need at least 17 lines for NET */
- MCFG_SCREEN_VISIBLE_AREA(0*8, 64*8-1, 0, 19*16-1)
- MCFG_SCREEN_UPDATE_DRIVER(mbee_state, screen_update_mbee)
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_refresh_hz(50);
+ m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(250)); /* not accurate */
+ m_screen->set_size(64*8, 19*16); /* need at least 17 lines for NET */
+ m_screen->set_visarea(0*8, 64*8-1, 0, 19*16-1);
+ m_screen->set_screen_update(FUNC(mbee_state::screen_update_mbee));
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, m_palette, gfx_mono)
+ GFXDECODE(config, "gfxdecode", m_palette, gfx_mono);
PALETTE(config, m_palette, FUNC(mbee_state::standard_palette), 100);
@@ -686,17 +686,18 @@ MACHINE_CONFIG_START(mbee_state::mbee)
m_crtc->set_on_update_addr_change_callback(FUNC(mbee_state::crtc_update_addr), this);
m_crtc->out_vsync_callback().set(FUNC(mbee_state::crtc_vs));
- MCFG_QUICKLOAD_ADD("quickload", mbee_state, mbee, "mwb,com,bee", 3)
- MCFG_QUICKLOAD_ADD("quickload2", mbee_state, mbee_z80bin, "bin", 3)
+ MCFG_QUICKLOAD_ADD("quickload", mbee_state, mbee, "mwb,com,bee", attotime::from_seconds(3))
+ MCFG_QUICKLOAD_ADD("quickload2", mbee_state, mbee_z80bin, "bin", attotime::from_seconds(3))
- MCFG_DEVICE_ADD("centronics", CENTRONICS, centronics_devices, "printer")
- MCFG_CENTRONICS_ACK_HANDLER(WRITELINE("z80pio", z80pio_device, strobe_a))
+ CENTRONICS(config, m_centronics, centronics_devices, "printer");
+ m_centronics->ack_handler().set(m_pio, FUNC(z80pio_device::strobe_a));
- MCFG_CENTRONICS_OUTPUT_LATCH_ADD("cent_data_out", "centronics")
+ OUTPUT_LATCH(config, m_cent_data_out);
+ m_centronics->set_output_latch(*m_cent_data_out);
- MCFG_CASSETTE_ADD( "cassette" )
- MCFG_CASSETTE_FORMATS(mbee_cassette_formats)
- MCFG_CASSETTE_DEFAULT_STATE(CASSETTE_STOPPED | CASSETTE_MOTOR_ENABLED | CASSETTE_SPEAKER_ENABLED)
+ CASSETTE(config, m_cassette);
+ m_cassette->set_formats(mbee_cassette_formats);
+ m_cassette->set_default_state(CASSETTE_STOPPED | CASSETTE_MOTOR_ENABLED | CASSETTE_SPEAKER_ENABLED);
MACHINE_CONFIG_END
@@ -716,14 +717,14 @@ MACHINE_CONFIG_START(mbee_state::mbeeic)
m_pio->in_pb_callback().set(FUNC(mbee_state::pio_port_b_r));
m_pio->out_pb_callback().set(FUNC(mbee_state::pio_port_b_w));
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(50)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(250)) /* not accurate */
- MCFG_SCREEN_SIZE(80*8, 310)
- MCFG_SCREEN_VISIBLE_AREA(0, 80*8-1, 0, 19*16-1)
- MCFG_SCREEN_UPDATE_DRIVER(mbee_state, screen_update_mbee)
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_refresh_hz(50);
+ m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(250)); /* not accurate */
+ m_screen->set_size(80*8, 310);
+ m_screen->set_visarea(0, 80*8-1, 0, 19*16-1);
+ m_screen->set_screen_update(FUNC(mbee_state::screen_update_mbee));
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, m_palette, gfx_standard)
+ GFXDECODE(config, "gfxdecode", m_palette, gfx_standard);
PALETTE(config, m_palette, FUNC(mbee_state::standard_palette), 100);
@@ -743,109 +744,105 @@ MACHINE_CONFIG_START(mbee_state::mbeeic)
m_crtc->set_on_update_addr_change_callback(FUNC(mbee_state::crtc_update_addr), this);
m_crtc->out_vsync_callback().set(FUNC(mbee_state::crtc_vs));
- MCFG_QUICKLOAD_ADD("quickload", mbee_state, mbee, "mwb,com,bee", 2)
- MCFG_QUICKLOAD_ADD("quickload2", mbee_state, mbee_z80bin, "bin", 2)
+ MCFG_QUICKLOAD_ADD("quickload", mbee_state, mbee, "mwb,com,bee", attotime::from_seconds(2))
+ MCFG_QUICKLOAD_ADD("quickload2", mbee_state, mbee_z80bin, "bin", attotime::from_seconds(2))
- MCFG_DEVICE_ADD("centronics", CENTRONICS, centronics_devices, "printer")
- MCFG_CENTRONICS_ACK_HANDLER(WRITELINE(m_pio, z80pio_device, strobe_a))
+ CENTRONICS(config, m_centronics, centronics_devices, "printer");
+ m_centronics->ack_handler().set(m_pio, FUNC(z80pio_device::strobe_a));
- MCFG_CENTRONICS_OUTPUT_LATCH_ADD("cent_data_out", "centronics")
+ OUTPUT_LATCH(config, m_cent_data_out);
+ m_centronics->set_output_latch(*m_cent_data_out);
- MCFG_CASSETTE_ADD( "cassette" )
- MCFG_CASSETTE_FORMATS(mbee_cassette_formats)
- MCFG_CASSETTE_DEFAULT_STATE(CASSETTE_STOPPED | CASSETTE_MOTOR_ENABLED | CASSETTE_SPEAKER_ENABLED)
+ CASSETTE(config, m_cassette);
+ m_cassette->set_formats(mbee_cassette_formats);
+ m_cassette->set_default_state(CASSETTE_STOPPED | CASSETTE_MOTOR_ENABLED | CASSETTE_SPEAKER_ENABLED);
MACHINE_CONFIG_END
-MACHINE_CONFIG_START(mbee_state::mbeepc)
+void mbee_state::mbeepc(machine_config &config)
+{
mbeeic(config);
- MCFG_DEVICE_MODIFY( "maincpu" )
- MCFG_DEVICE_PROGRAM_MAP(mbeepc_mem)
- MCFG_DEVICE_IO_MAP(mbeepc_io)
-MACHINE_CONFIG_END
+ m_maincpu->set_addrmap(AS_PROGRAM, &mbee_state::mbeepc_mem);
+ m_maincpu->set_addrmap(AS_IO, &mbee_state::mbeepc_io);
+}
-MACHINE_CONFIG_START(mbee_state::mbeeppc)
+void mbee_state::mbeeppc(machine_config &config)
+{
mbeeic(config);
- MCFG_DEVICE_MODIFY( "maincpu" )
- MCFG_DEVICE_PROGRAM_MAP(mbeeppc_mem)
- MCFG_DEVICE_IO_MAP(mbeeppc_io)
+
+ m_maincpu->set_addrmap(AS_PROGRAM, &mbee_state::mbeeppc_mem);
+ m_maincpu->set_addrmap(AS_IO, &mbee_state::mbeeppc_io);
MCFG_VIDEO_START_OVERRIDE(mbee_state, premium)
- MCFG_GFXDECODE_MODIFY("gfxdecode", gfx_premium)
+ subdevice<gfxdecode_device>("gfxdecode")->set_info(gfx_premium);
m_palette->set_init(FUNC(mbee_state::premium_palette));
MC146818(config, m_rtc, 32.768_kHz_XTAL);
m_rtc->irq().set(FUNC(mbee_state::rtc_irq_w));
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(mbee_state::mbee56)
+void mbee_state::mbee56(machine_config &config)
+{
mbeeic(config);
- MCFG_DEVICE_MODIFY( "maincpu" )
- MCFG_DEVICE_PROGRAM_MAP(mbee56_mem)
- MCFG_DEVICE_IO_MAP(mbee56_io)
+ m_maincpu->set_addrmap(AS_PROGRAM, &mbee_state::mbee56_mem);
+ m_maincpu->set_addrmap(AS_IO, &mbee_state::mbee56_io);
MCFG_MACHINE_RESET_OVERRIDE(mbee_state, mbee56)
WD2793(config, m_fdc, 4_MHz_XTAL / 2);
m_fdc->intrq_wr_callback().set(FUNC(mbee_state::fdc_intrq_w));
m_fdc->drq_wr_callback().set(FUNC(mbee_state::fdc_drq_w));
m_fdc->enmf_rd_callback().set_constant(0);
- MCFG_FLOPPY_DRIVE_ADD(m_floppy0, mbee_floppies, "525qd", floppy_image_device::default_floppy_formats)
- MCFG_FLOPPY_DRIVE_SOUND(true)
- MCFG_FLOPPY_DRIVE_ADD(m_floppy1, mbee_floppies, "525qd", floppy_image_device::default_floppy_formats)
- MCFG_FLOPPY_DRIVE_SOUND(true)
-MACHINE_CONFIG_END
+ FLOPPY_CONNECTOR(config, m_floppy0, mbee_floppies, "525qd", floppy_image_device::default_floppy_formats).enable_sound(true);
+ FLOPPY_CONNECTOR(config, m_floppy1, mbee_floppies, "525qd", floppy_image_device::default_floppy_formats).enable_sound(true);
+}
-MACHINE_CONFIG_START(mbee_state::mbee128)
+void mbee_state::mbee128(machine_config &config)
+{
mbee56(config);
- MCFG_DEVICE_MODIFY( "maincpu" )
- MCFG_DEVICE_PROGRAM_MAP(mbee256_mem)
- MCFG_DEVICE_IO_MAP(mbee128_io)
+ m_maincpu->set_addrmap(AS_PROGRAM, &mbee_state::mbee256_mem);
+ m_maincpu->set_addrmap(AS_IO, &mbee_state::mbee128_io);
MCFG_MACHINE_RESET_OVERRIDE(mbee_state, mbee128)
MC146818(config, m_rtc, 32.768_kHz_XTAL);
m_rtc->irq().set(FUNC(mbee_state::rtc_irq_w));
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(mbee_state::mbee128p)
+void mbee_state::mbee128p(machine_config &config)
+{
mbeeppc(config);
- MCFG_DEVICE_MODIFY( "maincpu" )
- MCFG_DEVICE_PROGRAM_MAP(mbee256_mem)
- MCFG_DEVICE_IO_MAP(mbee128_io)
+ m_maincpu->set_addrmap(AS_PROGRAM, &mbee_state::mbee256_mem);
+ m_maincpu->set_addrmap(AS_IO, &mbee_state::mbee128_io);
MCFG_MACHINE_RESET_OVERRIDE(mbee_state, mbee128)
WD2793(config, m_fdc, 4_MHz_XTAL / 2);
m_fdc->intrq_wr_callback().set(FUNC(mbee_state::fdc_intrq_w));
m_fdc->drq_wr_callback().set(FUNC(mbee_state::fdc_drq_w));
m_fdc->enmf_rd_callback().set_constant(0);
- MCFG_FLOPPY_DRIVE_ADD(m_floppy0, mbee_floppies, "525qd", floppy_image_device::default_floppy_formats)
- MCFG_FLOPPY_DRIVE_SOUND(true)
- MCFG_FLOPPY_DRIVE_ADD(m_floppy1, mbee_floppies, "525qd", floppy_image_device::default_floppy_formats)
- MCFG_FLOPPY_DRIVE_SOUND(true)
-MACHINE_CONFIG_END
+ FLOPPY_CONNECTOR(config, m_floppy0, mbee_floppies, "525qd", floppy_image_device::default_floppy_formats).enable_sound(true);
+ FLOPPY_CONNECTOR(config, m_floppy1, mbee_floppies, "525qd", floppy_image_device::default_floppy_formats).enable_sound(true);
+}
-MACHINE_CONFIG_START(mbee_state::mbee256)
+void mbee_state::mbee256(machine_config &config)
+{
mbee128p(config);
- MCFG_DEVICE_MODIFY( "maincpu" )
- MCFG_DEVICE_PROGRAM_MAP(mbee256_mem)
- MCFG_DEVICE_IO_MAP(mbee256_io)
+ m_maincpu->set_addrmap(AS_PROGRAM, &mbee_state::mbee256_mem);
+ m_maincpu->set_addrmap(AS_IO, &mbee_state::mbee256_io);
MCFG_MACHINE_RESET_OVERRIDE(mbee_state, mbee256)
- MCFG_DEVICE_REMOVE("fdc:0")
- MCFG_DEVICE_REMOVE("fdc:1")
- MCFG_FLOPPY_DRIVE_ADD(m_floppy0, mbee_floppies, "35dd", floppy_image_device::default_floppy_formats)
- MCFG_FLOPPY_DRIVE_SOUND(true)
- MCFG_FLOPPY_DRIVE_ADD(m_floppy1, mbee_floppies, "35dd", floppy_image_device::default_floppy_formats)
- MCFG_FLOPPY_DRIVE_SOUND(true)
-MACHINE_CONFIG_END
+ config.device_remove("fdc:0");
+ config.device_remove("fdc:1");
+ FLOPPY_CONNECTOR(config, m_floppy0, mbee_floppies, "35dd", floppy_image_device::default_floppy_formats).enable_sound(true);
+ FLOPPY_CONNECTOR(config, m_floppy1, mbee_floppies, "35dd", floppy_image_device::default_floppy_formats).enable_sound(true);
+}
-MACHINE_CONFIG_START(mbee_state::mbeett)
+void mbee_state::mbeett(machine_config &config)
+{
mbeeppc(config);
- MCFG_DEVICE_MODIFY( "maincpu" )
- MCFG_DEVICE_PROGRAM_MAP(mbeett_mem)
- MCFG_DEVICE_IO_MAP(mbeett_io)
+ m_maincpu->set_addrmap(AS_PROGRAM, &mbee_state::mbeett_mem);
+ m_maincpu->set_addrmap(AS_IO, &mbee_state::mbeett_io);
MCFG_MACHINE_RESET_OVERRIDE(mbee_state, mbeett)
- MCFG_DEVICE_REMOVE("quickload")
- MCFG_DEVICE_REMOVE("quickload2")
+ config.device_remove("quickload");
+ config.device_remove("quickload2");
SCC8530(config, "scc", 4000000); // clock unknown
-MACHINE_CONFIG_END
+}
/* Unused roms:
ROM_LOAD_OPTIONAL("net.rom", 0xe000, 0x1000, CRC(e14aac4c) SHA1(330902cf47f53c22c85003a620f7d7d3261ebb67) )
diff --git a/src/mame/drivers/mc10.cpp b/src/mame/drivers/mc10.cpp
index 1982fa29054..0162ae4befc 100644
--- a/src/mame/drivers/mc10.cpp
+++ b/src/mame/drivers/mc10.cpp
@@ -502,8 +502,8 @@ INPUT_PORTS_END
MACHINE DRIVERS
***************************************************************************/
-MACHINE_CONFIG_START(mc10_state::mc10)
-
+void mc10_state::mc10(machine_config &config)
+{
/* basic machine hardware */
M6803(config, m_maincpu, XTAL(3'579'545)); /* 0,894886 MHz */
m_maincpu->set_addrmap(AS_PROGRAM, &mc10_state::mc10_mem);
@@ -513,34 +513,35 @@ MACHINE_CONFIG_START(mc10_state::mc10)
m_maincpu->out_p2_cb().set(FUNC(mc10_state::mc10_port2_w));
/* video hardware */
- MCFG_SCREEN_MC6847_NTSC_ADD("screen", "mc6847")
+ SCREEN(config, "screen", SCREEN_TYPE_RASTER);
- MCFG_DEVICE_ADD("mc6847", MC6847_NTSC, XTAL(3'579'545))
- MCFG_MC6847_INPUT_CALLBACK(READ8(*this, mc10_state, mc6847_videoram_r))
+ mc6847_ntsc_device &vdg(MC6847_NTSC(config, "mc6847", XTAL(3'579'545)));
+ vdg.set_screen("screen");
+ vdg.input_callback().set(FUNC(mc10_state::mc6847_videoram_r));
/* sound hardware */
SPEAKER(config, "speaker").front_center();
- MCFG_DEVICE_ADD("dac", DAC_1BIT, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 0.0625)
- MCFG_DEVICE_ADD("vref", VOLTAGE_REGULATOR, 0) MCFG_VOLTAGE_REGULATOR_OUTPUT(5.0)
- MCFG_SOUND_ROUTE(0, "dac", 1.0, DAC_VREF_POS_INPUT)
+ DAC_1BIT(config, m_dac, 0).add_route(ALL_OUTPUTS, "speaker", 0.0625);
+ voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref", 0));
+ vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT);
- MCFG_CASSETTE_ADD("cassette")
- MCFG_CASSETTE_FORMATS(coco_cassette_formats)
- MCFG_CASSETTE_DEFAULT_STATE(CASSETTE_STOPPED | CASSETTE_SPEAKER_ENABLED | CASSETTE_MOTOR_ENABLED)
- MCFG_CASSETTE_INTERFACE("mc10_cass")
+ CASSETTE(config, m_cassette);
+ m_cassette->set_formats(coco_cassette_formats);
+ m_cassette->set_default_state(CASSETTE_STOPPED | CASSETTE_SPEAKER_ENABLED | CASSETTE_MOTOR_ENABLED);
+ m_cassette->set_interface("mc10_cass");
/* printer */
- MCFG_DEVICE_ADD("printer", PRINTER, 0)
+ PRINTER(config, m_printer, 0);
/* internal ram */
RAM(config, m_ram).set_default_size("20K").set_extra_options("4K");
/* Software lists */
- MCFG_SOFTWARE_LIST_ADD("cass_list", "mc10")
-MACHINE_CONFIG_END
-
-MACHINE_CONFIG_START(mc10_state::alice32)
+ SOFTWARE_LIST(config, "cass_list").set_original("mc10");
+}
+void mc10_state::alice32(machine_config &config)
+{
M6803(config, m_maincpu, XTAL(3'579'545));
m_maincpu->set_addrmap(AS_PROGRAM, &mc10_state::alice32_mem);
m_maincpu->in_p1_cb().set(FUNC(mc10_state::mc10_port1_r));
@@ -549,50 +550,51 @@ MACHINE_CONFIG_START(mc10_state::alice32)
m_maincpu->out_p2_cb().set(FUNC(mc10_state::mc10_port2_w));
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_UPDATE_DEVICE("ef9345", ef9345_device, screen_update)
- MCFG_SCREEN_SIZE(336, 270)
- MCFG_SCREEN_VISIBLE_AREA(00, 336-1, 00, 270-1)
- MCFG_PALETTE_ADD("palette", 8)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_screen_update("ef9345", FUNC(ef9345_device::screen_update));
+ screen.set_size(336, 270);
+ screen.set_visarea(00, 336-1, 00, 270-1);
+ PALETTE(config, "palette").set_entries(8);
- MCFG_DEVICE_ADD("ef9345", EF9345, 0)
- MCFG_EF9345_PALETTE("palette")
- MCFG_TIMER_DRIVER_ADD_SCANLINE("alice32_sl", mc10_state, alice32_scanline, "screen", 0, 10)
+ EF9345(config, m_ef9345, 0);
+ m_ef9345->set_palette_tag("palette");
+ TIMER(config, "alice32_sl").configure_scanline(FUNC(mc10_state::alice32_scanline), "screen", 0, 10);
/* sound hardware */
SPEAKER(config, "speaker").front_center();
- MCFG_DEVICE_ADD("dac", DAC_1BIT, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 0.0625)
- MCFG_DEVICE_ADD("vref", VOLTAGE_REGULATOR, 0) MCFG_VOLTAGE_REGULATOR_OUTPUT(5.0)
- MCFG_SOUND_ROUTE(0, "dac", 1.0, DAC_VREF_POS_INPUT)
+ DAC_1BIT(config, m_dac, 0).add_route(ALL_OUTPUTS, "speaker", 0.0625);
+ voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref", 0));
+ vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT);
- MCFG_CASSETTE_ADD("cassette")
- MCFG_CASSETTE_FORMATS(alice32_cassette_formats)
- MCFG_CASSETTE_DEFAULT_STATE(CASSETTE_STOPPED | CASSETTE_SPEAKER_ENABLED | CASSETTE_MOTOR_ENABLED)
- MCFG_CASSETTE_INTERFACE("mc10_cass")
+ CASSETTE(config, m_cassette);
+ m_cassette->set_formats(alice32_cassette_formats);
+ m_cassette->set_default_state(CASSETTE_STOPPED | CASSETTE_SPEAKER_ENABLED | CASSETTE_MOTOR_ENABLED);
+ m_cassette->set_interface("mc10_cass");
/* printer */
- MCFG_DEVICE_ADD("printer", PRINTER, 0)
+ PRINTER(config, m_printer, 0);
/* internal ram */
RAM(config, m_ram).set_default_size("24K").set_extra_options("8K");
/* Software lists */
- MCFG_SOFTWARE_LIST_ADD("cass_list", "alice32")
- MCFG_SOFTWARE_LIST_COMPATIBLE_ADD("mc10_cass", "mc10")
-MACHINE_CONFIG_END
+ SOFTWARE_LIST(config, "cass_list").set_original("alice32");
+ SOFTWARE_LIST(config, "mc10_cass").set_compatible("mc10");
+}
-MACHINE_CONFIG_START(mc10_state::alice90)
+void mc10_state::alice90(machine_config &config)
+{
alice32(config);
m_maincpu->set_addrmap(AS_PROGRAM, &mc10_state::alice90_mem);
m_ram->set_default_size("32K");
/* Software lists */
- MCFG_SOFTWARE_LIST_MODIFY("cass_list", "alice90")
- MCFG_SOFTWARE_LIST_COMPATIBLE_ADD("alice32_cass", "alice32")
- MCFG_DEVICE_REMOVE("mc10_cass")
-MACHINE_CONFIG_END
+ subdevice<software_list_device>("cass_list")->set_original("alice90");
+ SOFTWARE_LIST(config, "alice32_cass").set_compatible("alice32");
+ config.device_remove("mc10_cass");
+}
}
diff --git a/src/mame/drivers/mc1000.cpp b/src/mame/drivers/mc1000.cpp
index 1c565efb043..0e97e92265d 100644
--- a/src/mame/drivers/mc1000.cpp
+++ b/src/mame/drivers/mc1000.cpp
@@ -541,29 +541,32 @@ TIMER_DEVICE_CALLBACK_MEMBER(mc1000_state::ne555_tick)
m_maincpu->set_input_line(INPUT_LINE_IRQ0, param);
}
-MACHINE_CONFIG_START(mc1000_state::mc1000)
-
+void mc1000_state::mc1000(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD(Z80_TAG, Z80, 3579545)
- MCFG_DEVICE_PROGRAM_MAP(mc1000_mem)
- MCFG_DEVICE_OPCODES_MAP(mc1000_banking_mem)
- MCFG_DEVICE_IO_MAP(mc1000_io)
+ Z80(config, m_maincpu, 3579545);
+ m_maincpu->set_addrmap(AS_PROGRAM, &mc1000_state::mc1000_mem);
+ m_maincpu->set_addrmap(AS_OPCODES, &mc1000_state::mc1000_banking_mem);
+ m_maincpu->set_addrmap(AS_IO, &mc1000_state::mc1000_io);
/* timers */
- MCFG_TIMER_DRIVER_ADD_PERIODIC("ne555clear", mc1000_state, ne555_tick, attotime::from_hz(MC1000_NE555_FREQ))
- MCFG_TIMER_PARAM(CLEAR_LINE)
+ timer_device &ne555clear(TIMER(config, "ne555clear"));
+ ne555clear.configure_periodic(FUNC(mc1000_state::ne555_tick), attotime::from_hz(MC1000_NE555_FREQ));
+ ne555clear.config_param(CLEAR_LINE);
- MCFG_TIMER_DRIVER_ADD_PERIODIC("ne555assert", mc1000_state, ne555_tick, attotime::from_hz(MC1000_NE555_FREQ))
- MCFG_TIMER_START_DELAY(attotime::from_hz(MC1000_NE555_FREQ * 100 / MC1000_NE555_DUTY_CYCLE))
- MCFG_TIMER_PARAM(ASSERT_LINE)
+ timer_device &ne555assert(TIMER(config, "ne555assert"));
+ ne555assert.configure_periodic(FUNC(mc1000_state::ne555_tick), attotime::from_hz(MC1000_NE555_FREQ));
+ ne555assert.set_start_delay(attotime::from_hz(MC1000_NE555_FREQ * 100 / MC1000_NE555_DUTY_CYCLE));
+ ne555assert.config_param(ASSERT_LINE);
/* video hardware */
- MCFG_SCREEN_MC6847_PAL_ADD(SCREEN_TAG, MC6847_TAG)
+ SCREEN(config, SCREEN_TAG, SCREEN_TYPE_RASTER);
- MCFG_DEVICE_ADD(MC6847_TAG, MC6847_NTSC, XTAL(3'579'545))
- MCFG_MC6847_HSYNC_CALLBACK(WRITELINE(*this, mc1000_state, hs_w))
- MCFG_MC6847_FSYNC_CALLBACK(WRITELINE(*this, mc1000_state, fs_w))
- MCFG_MC6847_INPUT_CALLBACK(READ8(*this, mc1000_state, videoram_r))
+ MC6847_NTSC(config, m_vdg, XTAL(3'579'545));
+ m_vdg->hsync_wr_callback().set(FUNC(mc1000_state::hs_w));
+ m_vdg->fsync_wr_callback().set(FUNC(mc1000_state::fs_w));
+ m_vdg->input_callback().set(FUNC(mc1000_state::videoram_r));
+ m_vdg->set_screen(SCREEN_TAG);
/* sound hardware */
SPEAKER(config, "mono").front_center();
@@ -575,20 +578,21 @@ MACHINE_CONFIG_START(mc1000_state::mc1000)
ay8910.add_route(ALL_OUTPUTS, "mono", 0.25);
/* devices */
- MCFG_CASSETTE_ADD("cassette")
- MCFG_CASSETTE_DEFAULT_STATE(CASSETTE_STOPPED | CASSETTE_MOTOR_ENABLED | CASSETTE_SPEAKER_ENABLED)
- MCFG_CASSETTE_INTERFACE("mc1000_cass")
+ CASSETTE(config, m_cassette);
+ m_cassette->set_default_state(CASSETTE_STOPPED | CASSETTE_MOTOR_ENABLED | CASSETTE_SPEAKER_ENABLED);
+ m_cassette->set_interface("mc1000_cass");
- MCFG_SOFTWARE_LIST_ADD("cass_list", "mc1000_cass")
+ SOFTWARE_LIST(config, "cass_list").set_original("mc1000_cass");
- MCFG_DEVICE_ADD(m_centronics, CENTRONICS, centronics_devices, "printer")
- MCFG_CENTRONICS_BUSY_HANDLER(WRITELINE(*this, mc1000_state, write_centronics_busy))
+ CENTRONICS(config, m_centronics, centronics_devices, "printer");
+ m_centronics->busy_handler().set(FUNC(mc1000_state::write_centronics_busy));
- MCFG_CENTRONICS_OUTPUT_LATCH_ADD("cent_data_out", CENTRONICS_TAG)
+ output_latch_device &latch(OUTPUT_LATCH(config, "cent_data_out"));
+ m_centronics->set_output_latch(latch);
/* internal ram */
RAM(config, RAM_TAG).set_default_size("16K").set_extra_options("48K");
-MACHINE_CONFIG_END
+}
/* ROMs */
diff --git a/src/mame/drivers/mc1502.cpp b/src/mame/drivers/mc1502.cpp
index 8d14a8620f3..21dc9813aeb 100644
--- a/src/mame/drivers/mc1502.cpp
+++ b/src/mame/drivers/mc1502.cpp
@@ -229,7 +229,8 @@ static INPUT_PORTS_START( mc1502 )
PORT_INCLUDE( mc7007_3_keyboard )
INPUT_PORTS_END
-MACHINE_CONFIG_START(mc1502_state::mc1502)
+void mc1502_state::mc1502(machine_config &config)
+{
I8088(config, m_maincpu, XTAL(16'000'000)/3);
m_maincpu->set_addrmap(AS_PROGRAM, &mc1502_state::mc1502_map);
m_maincpu->set_addrmap(AS_IO, &mc1502_state::mc1502_io);
@@ -238,7 +239,7 @@ MACHINE_CONFIG_START(mc1502_state::mc1502)
MCFG_MACHINE_START_OVERRIDE( mc1502_state, mc1502 )
MCFG_MACHINE_RESET_OVERRIDE( mc1502_state, mc1502 )
- PIT8253(config, m_pit8253, 0);
+ PIT8253(config, m_pit8253);
m_pit8253->set_clk<0>(XTAL(16'000'000)/12); /* heartbeat IRQ */
m_pit8253->out_handler<0>().set(m_pic8259, FUNC(pic8259_device::ir0_w));
m_pit8253->set_clk<1>(XTAL(16'000'000)/12); /* serial port */
@@ -246,7 +247,7 @@ MACHINE_CONFIG_START(mc1502_state::mc1502)
m_pit8253->set_clk<2>(XTAL(16'000'000)/12); /* pio port c pin 4, and speaker polling enough */
m_pit8253->out_handler<2>().set(FUNC(mc1502_state::mc1502_pit8253_out2_changed));
- PIC8259(config, m_pic8259, 0);
+ PIC8259(config, m_pic8259);
m_pic8259->out_int_callback().set_inputline(m_maincpu, 0);
I8255(config, m_ppi8255n1);
@@ -276,7 +277,8 @@ MACHINE_CONFIG_START(mc1502_state::mc1502)
rs232.cts_handler().set(m_upd8251, FUNC(i8251_device::write_cts));
isa8_device &isa(ISA8(config, "isa", 0));
- isa.set_cputag("maincpu");
+ isa.set_memspace("maincpu", AS_PROGRAM);
+ isa.set_iospace("maincpu", AS_IO);
isa.irq2_callback().set(m_pic8259, FUNC(pic8259_device::ir2_w));
isa.irq3_callback().set(m_pic8259, FUNC(pic8259_device::ir3_w));
isa.irq4_callback().set(m_pic8259, FUNC(pic8259_device::ir4_w));
@@ -284,32 +286,33 @@ MACHINE_CONFIG_START(mc1502_state::mc1502)
isa.irq6_callback().set(m_pic8259, FUNC(pic8259_device::ir6_w));
isa.irq7_callback().set(m_pic8259, FUNC(pic8259_device::ir7_w));
- MCFG_DEVICE_ADD("board0", ISA8_SLOT, 0, "isa", mc1502_isa8_cards, "cga_mc1502", true) // FIXME: determine ISA bus clock
- MCFG_DEVICE_ADD("isa1", ISA8_SLOT, 0, "isa", mc1502_isa8_cards, "fdc", false)
- MCFG_DEVICE_ADD("isa2", ISA8_SLOT, 0, "isa", mc1502_isa8_cards, "rom", false)
+ ISA8_SLOT(config, "board0", 0, "isa", mc1502_isa8_cards, "cga_mc1502", true); // FIXME: determine ISA bus clock
+ ISA8_SLOT(config, "isa1", 0, "isa", mc1502_isa8_cards, "fdc", false);
+ ISA8_SLOT(config, "isa2", 0, "isa", mc1502_isa8_cards, "rom", false);
SPEAKER(config, "mono").front_center();
- WAVE(config, "wave", "cassette"); // FIXME: really no output routes for the cassette sound?
+ WAVE(config, "wave", m_cassette); // FIXME: really no output routes for the cassette sound?
SPEAKER_SOUND(config, "speaker").add_route(ALL_OUTPUTS, "mono", 0.80);
- MCFG_DEVICE_ADD(m_centronics, CENTRONICS, centronics_devices, "printer")
- MCFG_CENTRONICS_ACK_HANDLER(WRITELINE("cent_status_in", input_buffer_device, write_bit6))
- MCFG_CENTRONICS_BUSY_HANDLER(WRITELINE("cent_status_in", input_buffer_device, write_bit7))
- MCFG_CENTRONICS_FAULT_HANDLER(WRITELINE("cent_status_in", input_buffer_device, write_bit4))
- MCFG_CENTRONICS_PERROR_HANDLER(WRITELINE("cent_status_in", input_buffer_device, write_bit5))
+ CENTRONICS(config, m_centronics, centronics_devices, "printer");
+ m_centronics->ack_handler().set("cent_status_in", FUNC(input_buffer_device::write_bit6));
+ m_centronics->busy_handler().set("cent_status_in", FUNC(input_buffer_device::write_bit7));
+ m_centronics->fault_handler().set("cent_status_in", FUNC(input_buffer_device::write_bit4));
+ m_centronics->perror_handler().set("cent_status_in", FUNC(input_buffer_device::write_bit5));
- MCFG_DEVICE_ADD("cent_status_in", INPUT_BUFFER, 0)
+ INPUT_BUFFER(config, "cent_status_in");
- MCFG_CENTRONICS_OUTPUT_LATCH_ADD("cent_data_out", "centronics")
+ output_latch_device &cent_data_out(OUTPUT_LATCH(config, "cent_data_out"));
+ m_centronics->set_output_latch(cent_data_out);
- MCFG_CASSETTE_ADD( "cassette" )
- MCFG_CASSETTE_DEFAULT_STATE(CASSETTE_STOPPED | CASSETTE_MOTOR_ENABLED | CASSETTE_SPEAKER_ENABLED)
+ CASSETTE(config, m_cassette);
+ m_cassette->set_default_state(CASSETTE_STOPPED | CASSETTE_MOTOR_ENABLED | CASSETTE_SPEAKER_ENABLED);
- MCFG_SOFTWARE_LIST_ADD("flop_list","mc1502_flop")
-// MCFG_SOFTWARE_LIST_ADD("cass_list","mc1502_cass")
+ SOFTWARE_LIST(config, "flop_list").set_original("mc1502_flop");
+// SOFTWARE_LIST(config, "cass_list").set_original("mc1502_cass");
RAM(config, RAM_TAG).set_default_size("608K").set_extra_options("96K"); /* 96 base + 512 on expansion card */
-MACHINE_CONFIG_END
+}
/*
diff --git a/src/mame/drivers/mc8020.cpp b/src/mame/drivers/mc8020.cpp
index 1a5d8dd041f..137fd859428 100644
--- a/src/mame/drivers/mc8020.cpp
+++ b/src/mame/drivers/mc8020.cpp
@@ -296,7 +296,8 @@ static const z80_daisy_config daisy_chain[] =
{ nullptr }
};
-MACHINE_CONFIG_START(mc8020_state::mc8020)
+void mc8020_state::mc8020(machine_config &config)
+{
/* basic machine hardware */
Z80(config, m_maincpu, XTAL(2'457'600));
m_maincpu->set_addrmap(AS_PROGRAM, &mc8020_state::mem_map);
@@ -304,13 +305,13 @@ MACHINE_CONFIG_START(mc8020_state::mc8020)
m_maincpu->set_daisy_config(daisy_chain);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(50)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */
- MCFG_SCREEN_SIZE(32*6, 16*8)
- MCFG_SCREEN_VISIBLE_AREA(0, 32*6-1, 0, 16*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(mc8020_state, screen_update_mc8020)
- MCFG_SCREEN_PALETTE("palette")
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(50);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */
+ screen.set_size(32*6, 16*8);
+ screen.set_visarea(0, 32*6-1, 0, 16*8-1);
+ screen.set_screen_update(FUNC(mc8020_state::screen_update_mc8020));
+ screen.set_palette("palette");
PALETTE(config, "palette", palette_device::MONOCHROME);
@@ -325,7 +326,7 @@ MACHINE_CONFIG_START(mc8020_state::mc8020)
ctc.set_clk<2>(XTAL(2'457'600) / 64); // guess
ctc.zc_callback<2>().set("ctc", FUNC(z80ctc_device::trg1));
ctc.zc_callback<2>().append("ctc", FUNC(z80ctc_device::trg0));
-MACHINE_CONFIG_END
+}
/* ROM definition */
diff --git a/src/mame/drivers/mc8030.cpp b/src/mame/drivers/mc8030.cpp
index cffbecdc3fb..29d4ad16c2e 100644
--- a/src/mame/drivers/mc8030.cpp
+++ b/src/mame/drivers/mc8030.cpp
@@ -184,7 +184,8 @@ static const z80_daisy_config daisy_chain[] =
};
-MACHINE_CONFIG_START(mc8030_state::mc8030)
+void mc8030_state::mc8030(machine_config &config)
+{
/* basic machine hardware */
Z80(config, m_maincpu, XTAL(2'457'600));
m_maincpu->set_addrmap(AS_PROGRAM, &mc8030_state::mem_map);
@@ -192,13 +193,13 @@ MACHINE_CONFIG_START(mc8030_state::mc8030)
m_maincpu->set_daisy_config(daisy_chain);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(50)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */
- MCFG_SCREEN_SIZE(512, 256)
- MCFG_SCREEN_VISIBLE_AREA(0, 512-1, 0, 256-1)
- MCFG_SCREEN_UPDATE_DRIVER(mc8030_state, screen_update_mc8030)
- MCFG_SCREEN_PALETTE("palette")
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(50);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */
+ screen.set_size(512, 256);
+ screen.set_visarea(0, 512-1, 0, 256-1);
+ screen.set_screen_update(FUNC(mc8030_state::screen_update_mc8030));
+ screen.set_palette("palette");
PALETTE(config, "palette", palette_device::MONOCHROME);
@@ -240,7 +241,7 @@ MACHINE_CONFIG_START(mc8030_state::mc8030)
rs232_port_device &rs232(RS232_PORT(config, "rs232", default_rs232_devices, "keyboard"));
rs232.rxd_handler().set("asp_sio", FUNC(z80sio_device::rxa_w));
rs232.cts_handler().set("asp_sio", FUNC(z80sio_device::ctsa_w));
-MACHINE_CONFIG_END
+}
/* ROM definition */
ROM_START( mc8030 )
diff --git a/src/mame/drivers/mcb216.cpp b/src/mame/drivers/mcb216.cpp
index a6ca9952aec..43e0e5022aa 100644
--- a/src/mame/drivers/mcb216.cpp
+++ b/src/mame/drivers/mcb216.cpp
@@ -119,39 +119,41 @@ MACHINE_RESET_MEMBER( mcb216_state, cb308 )
m_maincpu->set_state_int(Z80_PC, 0xe000);
}
-MACHINE_CONFIG_START(mcb216_state::mcb216)
+void mcb216_state::mcb216(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, 8_MHz_XTAL / 2)
- MCFG_DEVICE_PROGRAM_MAP(mcb216_mem)
- MCFG_DEVICE_IO_MAP(mcb216_io)
- MCFG_DEVICE_IRQ_ACKNOWLEDGE_DRIVER(mcb216_state, irq_callback)
+ Z80(config, m_maincpu, 8_MHz_XTAL / 2);
+ m_maincpu->set_addrmap(AS_PROGRAM, &mcb216_state::mcb216_mem);
+ m_maincpu->set_addrmap(AS_IO, &mcb216_state::mcb216_io);
+ m_maincpu->set_irq_acknowledge_callback(FUNC(mcb216_state::irq_callback));
MCFG_MACHINE_RESET_OVERRIDE(mcb216_state, mcb216)
TMS5501(config, m_tms5501, 8_MHz_XTAL / 4);
m_tms5501->xmt_callback().set("rs232", FUNC(rs232_port_device::write_txd));
- m_tms5501->int_callback().set_inputline("maincpu", 0);
+ m_tms5501->int_callback().set_inputline(m_maincpu, 0);
rs232_port_device &rs232(RS232_PORT(config, "rs232", default_rs232_devices, "terminal"));
rs232.rxd_handler().set(m_tms5501, FUNC(tms5501_device::rcv_w));
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(mcb216_state::cb308)
+void mcb216_state::cb308(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, 8_MHz_XTAL / 2)
- MCFG_DEVICE_PROGRAM_MAP(cb308_mem)
- MCFG_DEVICE_IO_MAP(mcb216_io)
- MCFG_DEVICE_IRQ_ACKNOWLEDGE_DRIVER(mcb216_state, irq_callback)
+ Z80(config, m_maincpu, 8_MHz_XTAL / 2);
+ m_maincpu->set_addrmap(AS_PROGRAM, &mcb216_state::cb308_mem);
+ m_maincpu->set_addrmap(AS_IO, &mcb216_state::mcb216_io);
+ m_maincpu->set_irq_acknowledge_callback(FUNC(mcb216_state::irq_callback));
MCFG_MACHINE_RESET_OVERRIDE(mcb216_state, cb308)
TMS5501(config, m_tms5501, 8_MHz_XTAL / 4);
m_tms5501->xmt_callback().set("rs232", FUNC(rs232_port_device::write_txd));
- m_tms5501->int_callback().set_inputline("maincpu", 0);
+ m_tms5501->int_callback().set_inputline(m_maincpu, 0);
rs232_port_device &rs232(RS232_PORT(config, "rs232", default_rs232_devices, "terminal"));
rs232.rxd_handler().set(m_tms5501, FUNC(tms5501_device::rcv_w));
-MACHINE_CONFIG_END
+}
/* ROM definition */
ROM_START( mcb216 )
diff --git a/src/mame/drivers/mcr3.cpp b/src/mame/drivers/mcr3.cpp
index 6e2d7191d51..193a58241fc 100644
--- a/src/mame/drivers/mcr3.cpp
+++ b/src/mame/drivers/mcr3.cpp
@@ -104,7 +104,6 @@
#include "emu.h"
-#include "includes/mcr.h"
#include "includes/mcr3.h"
#include "machine/nvram.h"
@@ -260,11 +259,11 @@ WRITE8_MEMBER(mcr3_state::maxrpm_op6_w)
/* when the read is toggled is when the ADC value is latched */
if (!(data & 0x80))
- m_latched_input = m_maxrpm_adc->read(space, 0);
+ m_latched_input = m_maxrpm_adc->read();
/* when both the write and the enable are low, it's a write to the ADC0844 */
if (!(data & 0x40) && !(data & 0x20))
- m_maxrpm_adc->write(space, 0, bitswap<4>(m_maxrpm_adc_control, 2, 3, 1, 0));
+ m_maxrpm_adc->write(bitswap<4>(m_maxrpm_adc_control, 2, 3, 1, 0));
/* low 5 bits control the turbo CS */
m_turbo_cheap_squeak->write(space, offset, data);
@@ -390,7 +389,7 @@ WRITE8_MEMBER(mcr3_state::stargrds_op6_w)
READ8_MEMBER(mcr3_state::spyhunt_ip1_r)
{
- return ioport("ssio:IP1")->read() | (m_cheap_squeak_deluxe->stat_r(space, 0) << 5);
+ return ioport("ssio:IP1")->read() | (m_cheap_squeak_deluxe->stat_r() << 5);
}
@@ -430,7 +429,7 @@ WRITE8_MEMBER(mcr3_state::spyhunt_op4_w)
m_last_op4 = data;
/* low 5 bits go to control the Cheap Squeak Deluxe */
- m_cheap_squeak_deluxe->sr_w(space, offset, data & 0x0f);
+ m_cheap_squeak_deluxe->sr_w(data & 0x0f);
m_cheap_squeak_deluxe->sirq_w(BIT(data, 4));
}
@@ -1078,15 +1077,15 @@ GFXDECODE_END
*************************************/
/* Core MCR monoboard system with no sound */
-MACHINE_CONFIG_START(mcr3_state::mcrmono)
-
+void mcr3_state::mcrmono(machine_config &config)
+{
/* basic machine hardware */
Z80(config, m_maincpu, MASTER_CLOCK/4);
m_maincpu->set_addrmap(AS_PROGRAM, &mcr3_state::mcrmono_map);
m_maincpu->set_addrmap(AS_IO, &mcr3_state::mcrmono_portmap);
m_maincpu->set_daisy_config(mcr_daisy_chain);
- MCFG_TIMER_DRIVER_ADD_SCANLINE("scantimer", mcr3_state, mcr_interrupt, "screen", 0, 1)
+ TIMER(config, "scantimer").configure_scanline(FUNC(mcr3_state::mcr_interrupt), "screen", 0, 1);
Z80CTC(config, m_ctc, MASTER_CLOCK/4 /* same as "maincpu" */);
m_ctc->intr_callback().set_inputline(m_maincpu, INPUT_LINE_IRQ0);
@@ -1101,32 +1100,33 @@ MACHINE_CONFIG_START(mcr3_state::mcrmono)
SPEAKER(config, "rspeaker").front_right();
/* video hardware */
- MCFG_SCREEN_ADD(m_screen, RASTER)
- MCFG_SCREEN_VIDEO_ATTRIBUTES(VIDEO_UPDATE_BEFORE_VBLANK)
- MCFG_SCREEN_REFRESH_RATE(30)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */)
- MCFG_SCREEN_SIZE(32*16, 30*16)
- MCFG_SCREEN_VISIBLE_AREA(0*16, 32*16-1, 0*16, 30*16-1)
- MCFG_SCREEN_UPDATE_DRIVER(mcr3_state, screen_update_mcr3)
- MCFG_SCREEN_PALETTE("palette")
-
- GFXDECODE(config, "gfxdecode", "palette", gfx_mcr3);
- PALETTE(config, "palette").set_entries(64);
-MACHINE_CONFIG_END
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_video_attributes(VIDEO_UPDATE_BEFORE_VBLANK);
+ m_screen->set_refresh_hz(30);
+ m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(2500) /* not accurate */);
+ m_screen->set_size(32*16, 30*16);
+ m_screen->set_visarea(0*16, 32*16-1, 0*16, 30*16-1);
+ m_screen->set_screen_update(FUNC(mcr3_state::screen_update_mcr3));
+ m_screen->set_palette(m_palette);
+
+ GFXDECODE(config, m_gfxdecode, m_palette, gfx_mcr3);
+ PALETTE(config, m_palette).set_entries(64);
+}
/*************************************/
/* Sarge/Demolition Derby Mono/Max RPM = MCR monoboard with Turbo Cheap Squeak */
-MACHINE_CONFIG_START(mcr3_state::mono_tcs)
+void mcr3_state::mono_tcs(machine_config &config)
+{
mcrmono(config);
/* basic machine hardware */
- MCFG_DEVICE_ADD("tcs", MIDWAY_TURBO_CHEAP_SQUEAK)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 1.0)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 1.0)
-MACHINE_CONFIG_END
+ MIDWAY_TURBO_CHEAP_SQUEAK(config, m_turbo_cheap_squeak);
+ m_turbo_cheap_squeak->add_route(ALL_OUTPUTS, "lspeaker", 1.0);
+ m_turbo_cheap_squeak->add_route(ALL_OUTPUTS, "rspeaker", 1.0);
+}
void mcr3_state::maxrpm(machine_config &config)
{
@@ -1141,51 +1141,53 @@ void mcr3_state::maxrpm(machine_config &config)
/* Rampage/Power Drive/Star Guards = MCR monoboard with Sounds Good */
-MACHINE_CONFIG_START(mcr3_state::mono_sg)
+void mcr3_state::mono_sg(machine_config &config)
+{
mcrmono(config);
/* basic machine hardware */
- MCFG_DEVICE_ADD("sg", MIDWAY_SOUNDS_GOOD)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 1.0)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 1.0)
-MACHINE_CONFIG_END
+ MIDWAY_SOUNDS_GOOD(config, m_sounds_good);
+ m_sounds_good->add_route(ALL_OUTPUTS, "lspeaker", 1.0);
+ m_sounds_good->add_route(ALL_OUTPUTS, "rspeaker", 1.0);
+}
/*************************************/
/* Core scrolling system with SSIO sound */
-MACHINE_CONFIG_START(mcr3_state::mcrscroll)
+void mcr3_state::mcrscroll(machine_config &config)
+{
mcrmono(config);
/* basic machine hardware */
- MCFG_DEVICE_ADD("ssio", MIDWAY_SSIO)
- MCFG_SOUND_ROUTE(0, "lspeaker", 1.0)
- MCFG_SOUND_ROUTE(1, "rspeaker", 1.0)
+ MIDWAY_SSIO(config, m_ssio);
+ m_ssio->add_route(0, "lspeaker", 1.0);
+ m_ssio->add_route(1, "rspeaker", 1.0);
m_maincpu->set_addrmap(AS_PROGRAM, &mcr3_state::spyhunt_map);
m_maincpu->set_addrmap(AS_IO, &mcr3_state::spyhunt_portmap);
/* video hardware */
- MCFG_SCREEN_MODIFY("screen")
- MCFG_SCREEN_SIZE(30*16, 30*16)
- MCFG_SCREEN_VISIBLE_AREA(0, 30*16-1, 0, 30*16-1)
- MCFG_SCREEN_UPDATE_DRIVER(mcr3_state, screen_update_spyhunt)
- MCFG_GFXDECODE_MODIFY("gfxdecode", gfx_spyhunt)
+ m_screen->set_size(30*16, 30*16);
+ m_screen->set_visarea(0, 30*16-1, 0, 30*16-1);
+ m_screen->set_screen_update(FUNC(mcr3_state::screen_update_spyhunt));
+ m_gfxdecode->set_info(gfx_spyhunt);
subdevice<palette_device>("palette")->set_entries(64 + 4).set_init(FUNC(mcr3_state::spyhunt_palette));
MCFG_VIDEO_START_OVERRIDE(mcr3_state,spyhunt)
-MACHINE_CONFIG_END
+}
/* Spy Hunter = scrolling system with an SSIO and a cheap squeak deluxe */
-MACHINE_CONFIG_START(mcr3_state::mcrsc_csd)
+void mcr3_state::mcrsc_csd(machine_config &config)
+{
mcrscroll(config);
/* basic machine hardware */
- MCFG_DEVICE_ADD("csd", MIDWAY_CHEAP_SQUEAK_DELUXE)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 1.0)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 1.0)
+ MIDWAY_CHEAP_SQUEAK_DELUXE(config, m_cheap_squeak_deluxe);
+ m_cheap_squeak_deluxe->add_route(ALL_OUTPUTS, "lspeaker", 1.0);
+ m_cheap_squeak_deluxe->add_route(ALL_OUTPUTS, "rspeaker", 1.0);
CD4099(config, m_lamplatch); // U1 on Lamp Driver Board
m_lamplatch->q_out_cb<0>().set_output("lamp0");
@@ -1196,12 +1198,7 @@ MACHINE_CONFIG_START(mcr3_state::mcrsc_csd)
m_lamplatch->q_out_cb<5>().set_output("lamp5");
m_lamplatch->q_out_cb<6>().set_output("lamp6");
m_lamplatch->q_out_cb<7>().set_output("lamp7");
-MACHINE_CONFIG_END
-
-
-
-
-
+}
/*************************************
diff --git a/src/mame/drivers/mcr68.cpp b/src/mame/drivers/mcr68.cpp
index 859c316cff7..e8367ad72bf 100644
--- a/src/mame/drivers/mcr68.cpp
+++ b/src/mame/drivers/mcr68.cpp
@@ -107,7 +107,7 @@ WRITE16_MEMBER(mcr68_state::blasted_control_w)
READ16_MEMBER(mcr68_state::spyhunt2_port_0_r)
{
int result = ioport("IN0")->read();
- int analog = m_adc->read(space, 0);
+ int analog = m_adc->read();
return result | ((m_sounds_good->read(space, 0) & 1) << 5) | (analog << 8);
}
@@ -130,7 +130,7 @@ WRITE16_MEMBER(mcr68_state::spyhunt2_control_w)
m_sounds_good->reset_write(~m_control_word & 0x2000);
m_sounds_good->write(space, offset, (m_control_word >> 8) & 0x001f);
- m_adc->write(space, 0, (m_control_word >> 3) & 0x0f);
+ m_adc->write((m_control_word >> 3) & 0x0f);
}
@@ -181,7 +181,7 @@ WRITE16_MEMBER(mcr68_state::archrivl_control_w)
{
COMBINE_DATA(&m_control_word);
m_cvsd_sound->reset_write(~m_control_word & 0x0400);
- m_cvsd_sound->write(space, 0, m_control_word & 0x3ff);
+ m_cvsd_sound->write(m_control_word & 0x3ff);
}
@@ -896,11 +896,11 @@ GFXDECODE_END
=================================================================*/
-MACHINE_CONFIG_START(mcr68_state::mcr68)
-
+void mcr68_state::mcr68(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M68000, 7723800)
- MCFG_DEVICE_PROGRAM_MAP(mcr68_map)
+ M68000(config, m_maincpu, 7723800);
+ m_maincpu->set_addrmap(AS_PROGRAM, &mcr68_state::mcr68_map);
WATCHDOG_TIMER(config, "watchdog").set_vblank_count("screen", 8);
MCFG_MACHINE_START_OVERRIDE(mcr68_state,mcr68)
@@ -910,15 +910,15 @@ MACHINE_CONFIG_START(mcr68_state::mcr68)
m_ptm->irq_callback().set_inputline("maincpu", 2);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(30)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */)
- MCFG_SCREEN_SIZE(32*16, 30*16)
- MCFG_SCREEN_VISIBLE_AREA(0, 32*16-1, 0, 30*16-1)
- MCFG_SCREEN_UPDATE_DRIVER(mcr68_state, screen_update_mcr68)
- MCFG_SCREEN_PALETTE("palette")
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_refresh_hz(30);
+ m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(2500) /* not accurate */);
+ m_screen->set_size(32*16, 30*16);
+ m_screen->set_visarea(0, 32*16-1, 0, 30*16-1);
+ m_screen->set_screen_update(FUNC(mcr68_state::screen_update_mcr68));
+ m_screen->set_palette("palette");
- MCFG_TIMER_DRIVER_ADD_SCANLINE("scantimer", mcr68_state, scanline_cb, "screen", 0, 1)
+ TIMER(config, "scantimer").configure_scanline(FUNC(mcr68_state::scanline_cb), "screen", 0, 1);
GFXDECODE(config, m_gfxdecode, "palette", gfx_mcr68);
PALETTE(config, "palette").set_format(palette_device::xRBG_333, 64);
@@ -927,7 +927,7 @@ MACHINE_CONFIG_START(mcr68_state::mcr68)
/* sound hardware -- determined by specific machine */
SPEAKER(config, "speaker").front_center();
-MACHINE_CONFIG_END
+}
void mcr68_state::xenophob(machine_config &config)
@@ -949,56 +949,53 @@ void mcr68_state::intlaser(machine_config &config)
}
-MACHINE_CONFIG_START(mcr68_state::spyhunt2)
+void mcr68_state::spyhunt2(machine_config &config)
+{
mcr68(config);
/* basic machine hardware */
- MCFG_DEVICE_ADD(m_sounds_good, MIDWAY_SOUNDS_GOOD)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 1.0)
- MCFG_DEVICE_ADD("tcs", MIDWAY_TURBO_CHEAP_SQUEAK)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 1.0)
+ MIDWAY_SOUNDS_GOOD(config, m_sounds_good).add_route(ALL_OUTPUTS, "speaker", 1.0);
+ MIDWAY_TURBO_CHEAP_SQUEAK(config, m_turbo_cheap_squeak).add_route(ALL_OUTPUTS, "speaker", 1.0);
ADC0844(config, m_adc);
m_adc->ch1_callback().set_ioport("AN1");
m_adc->ch2_callback().set_ioport("AN2");
m_adc->ch3_callback().set_ioport("AN3");
m_adc->ch4_callback().set_ioport("AN4");
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(mcr68_state::archrivl)
+void mcr68_state::archrivl(machine_config &config)
+{
mcr68(config);
/* basic machine hardware */
- MCFG_DEVICE_ADD("cvsd", WILLIAMS_CVSD_SOUND)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 1.0)
-MACHINE_CONFIG_END
+ WILLIAMS_CVSD_SOUND(config, m_cvsd_sound).add_route(ALL_OUTPUTS, "speaker", 1.0);
+}
-MACHINE_CONFIG_START(mcr68_state::pigskin)
+void mcr68_state::pigskin(machine_config &config)
+{
mcr68(config);
/* basic machine hardware */
- MCFG_DEVICE_ADD("cvsd", WILLIAMS_CVSD_SOUND)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 1.0)
+ WILLIAMS_CVSD_SOUND(config, m_cvsd_sound).add_route(ALL_OUTPUTS, "speaker", 1.0);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(pigskin_map)
-MACHINE_CONFIG_END
+ m_maincpu->set_addrmap(AS_PROGRAM, &mcr68_state::pigskin_map);
+}
-MACHINE_CONFIG_START(mcr68_state::trisport)
+void mcr68_state::trisport(machine_config &config)
+{
mcr68(config);
/* basic machine hardware */
- MCFG_DEVICE_ADD("cvsd", WILLIAMS_CVSD_SOUND)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 1.0)
+ WILLIAMS_CVSD_SOUND(config, m_cvsd_sound).add_route(ALL_OUTPUTS, "speaker", 1.0);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(trisport_map)
+ m_maincpu->set_addrmap(AS_PROGRAM, &mcr68_state::trisport_map);
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
-MACHINE_CONFIG_END
+}
diff --git a/src/mame/drivers/meadows.cpp b/src/mame/drivers/meadows.cpp
index 4e8392ef9b2..ee4c065045e 100644
--- a/src/mame/drivers/meadows.cpp
+++ b/src/mame/drivers/meadows.cpp
@@ -649,7 +649,6 @@ void meadows_state::meadows(machine_config &config)
SPEAKER(config, "speaker").front_center();
DAC_8BIT_R2R(config, m_dac, 0).add_route(ALL_OUTPUTS, "speaker", 0.5); // unknown DAC
voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref", 0));
- vref.set_output(5.0);
vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT);
vref.add_route(0, "dac", -1.0, DAC_VREF_NEG_INPUT);
@@ -710,7 +709,6 @@ void meadows_state::bowl3d(machine_config &config)
SPEAKER(config, "speaker").front_center();
DAC_8BIT_R2R(config, m_dac, 0).add_route(ALL_OUTPUTS, "speaker", 0.5); // unknown DAC
voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref", 0));
- vref.set_output(5.0);
vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT);
vref.add_route(0, "dac", -1.0, DAC_VREF_NEG_INPUT);
@@ -755,7 +753,7 @@ ROM_START( deadeye )
/* empty */
ROM_REGION( 0x08000, "audiocpu", 0 )
- ROM_LOAD( "de_snd", 0x0000, 0x0400, CRC(c10a1b1a) SHA1(779ea261d23360634081295a164cacbd819d8719) )
+ ROM_LOAD( "de_sound_099c_m2-a1.0.4a", 0x0000, 0x0400, CRC(c10a1b1a) SHA1(779ea261d23360634081295a164cacbd819d8719) )
ROM_END
diff --git a/src/mame/drivers/meadwttl.cpp b/src/mame/drivers/meadwttl.cpp
index f042a4b7f81..aa4cd9a537d 100644
--- a/src/mame/drivers/meadwttl.cpp
+++ b/src/mame/drivers/meadwttl.cpp
@@ -90,20 +90,21 @@ void meadwttl_state::video_start()
{
}
-MACHINE_CONFIG_START(meadwttl_state::meadows)
-
+void meadwttl_state::meadows(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", NETLIST_CPU, NETLIST_CLOCK)
- MCFG_NETLIST_SETUP(meadows)
+ NETLIST_CPU(config, m_maincpu, NETLIST_CLOCK);
+ m_maincpu->set_constructor(netlist_meadows);
/* video hardware */
- MCFG_FIXFREQ_ADD("fixfreq", "screen")
- MCFG_FIXFREQ_MONITOR_CLOCK(MASTER_CLOCK)
- MCFG_FIXFREQ_HORZ_PARAMS(H_TOTAL-67,H_TOTAL-40,H_TOTAL-8,H_TOTAL)
- MCFG_FIXFREQ_VERT_PARAMS(V_TOTAL-22,V_TOTAL-19,V_TOTAL-12,V_TOTAL)
- MCFG_FIXFREQ_FIELDCOUNT(1)
- MCFG_FIXFREQ_SYNC_THRESHOLD(0.30)
-MACHINE_CONFIG_END
+ SCREEN(config, "screen", SCREEN_TYPE_RASTER);
+ FIXFREQ(config, m_video).set_screen("screen");
+ m_video->set_monitor_clock(MASTER_CLOCK);
+ m_video->set_horz_params(H_TOTAL-67,H_TOTAL-40,H_TOTAL-8,H_TOTAL);
+ m_video->set_vert_params(V_TOTAL-22,V_TOTAL-19,V_TOTAL-12,V_TOTAL);
+ m_video->set_fieldcount(1);
+ m_video->set_threshold(0.30);
+}
/***************************************************************************
diff --git a/src/mame/drivers/mediagx.cpp b/src/mame/drivers/mediagx.cpp
index a6460ad57af..27831b89759 100644
--- a/src/mame/drivers/mediagx.cpp
+++ b/src/mame/drivers/mediagx.cpp
@@ -883,10 +883,10 @@ void mediagx_state::ramdac_map(address_map &map)
MACHINE_CONFIG_START(mediagx_state::mediagx)
/* basic machine hardware */
- MCFG_DEVICE_ADD(m_maincpu, MEDIAGX, 166000000)
- MCFG_DEVICE_PROGRAM_MAP(mediagx_map)
- MCFG_DEVICE_IO_MAP(mediagx_io)
- MCFG_DEVICE_IRQ_ACKNOWLEDGE_DEVICE("pic8259_1", pic8259_device, inta_cb)
+ MEDIAGX(config, m_maincpu, 166000000);
+ m_maincpu->set_addrmap(AS_PROGRAM, &mediagx_state::mediagx_map);
+ m_maincpu->set_addrmap(AS_IO, &mediagx_state::mediagx_io);
+ m_maincpu->set_irq_acknowledge_callback("pic8259_1", FUNC(pic8259_device::inta_cb));
pcat_common(config);
@@ -896,31 +896,29 @@ MACHINE_CONFIG_START(mediagx_state::mediagx)
ide_controller_32_device &ide(IDE_CONTROLLER_32(config, "ide").options(ata_devices, "hdd", nullptr, true));
ide.irq_handler().set(m_pic8259_2, FUNC(pic8259_device::ir6_w));
- MCFG_TIMER_DRIVER_ADD("sound_timer", mediagx_state, sound_timer_callback)
+ TIMER(config, "sound_timer").configure_generic(FUNC(mediagx_state::sound_timer_callback));
RAMDAC(config, m_ramdac, 0, m_palette);
m_ramdac->set_addrmap(0, &mediagx_state::ramdac_map);
/* video hardware */
- MCFG_SCREEN_ADD(m_screen, RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_SIZE(640, 480)
- MCFG_SCREEN_VISIBLE_AREA(0, 639, 0, 239)
- MCFG_SCREEN_UPDATE_DRIVER(mediagx_state, screen_update)
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_refresh_hz(60);
+ m_screen->set_size(640, 480);
+ m_screen->set_visarea(0, 639, 0, 239);
+ m_screen->set_screen_update(FUNC(mediagx_state::screen_update));
- MCFG_DEVICE_ADD(m_gfxdecode, GFXDECODE, m_palette, gfx_cga)
+ GFXDECODE(config, m_gfxdecode, m_palette, gfx_cga);
- MCFG_PALETTE_ADD(m_palette, 256)
+ PALETTE(config, m_palette).set_entries(256);
/* sound hardware */
SPEAKER(config, "lspeaker").front_left();
SPEAKER(config, "rspeaker").front_right();
- MCFG_DEVICE_ADD(m_dmadac[0], DMADAC)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 1.0)
+ DMADAC(config, m_dmadac[0]).add_route(ALL_OUTPUTS, "lspeaker", 1.0);
- MCFG_DEVICE_ADD(m_dmadac[1], DMADAC)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 1.0)
+ DMADAC(config, m_dmadac[1]).add_route(ALL_OUTPUTS, "rspeaker", 1.0);
MACHINE_CONFIG_END
diff --git a/src/mame/drivers/megadriv.cpp b/src/mame/drivers/megadriv.cpp
index d6a7c70cfda..6f8bd49912b 100644
--- a/src/mame/drivers/megadriv.cpp
+++ b/src/mame/drivers/megadriv.cpp
@@ -377,50 +377,51 @@ WRITE_LINE_MEMBER(md_cons_state::screen_vblank_console)
}
}
-MACHINE_CONFIG_START(md_cons_state::ms_megadriv)
+void md_cons_state::ms_megadriv(machine_config &config)
+{
md_ntsc(config);
MCFG_MACHINE_START_OVERRIDE(md_cons_state, ms_megadriv)
MCFG_MACHINE_RESET_OVERRIDE(md_cons_state, ms_megadriv)
- MCFG_SCREEN_MODIFY("megadriv")
- MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE(*this, md_cons_state, screen_vblank_console))
+ subdevice<screen_device>("megadriv")->screen_vblank().set(FUNC(md_cons_state::screen_vblank_console));
- MCFG_MD_CARTRIDGE_ADD("mdslot", md_cart, nullptr)
- MCFG_SOFTWARE_LIST_ADD("cart_list","megadriv")
-MACHINE_CONFIG_END
+ MD_CART_SLOT(config, m_cart, md_cart, nullptr);
+ SOFTWARE_LIST(config, "cart_list").set_original("megadriv");
+}
-MACHINE_CONFIG_START(md_cons_state::ms_megadpal)
+void md_cons_state::ms_megadpal(machine_config &config)
+{
md_pal(config);
MCFG_MACHINE_START_OVERRIDE(md_cons_state, ms_megadriv)
MCFG_MACHINE_RESET_OVERRIDE(md_cons_state, ms_megadriv)
- MCFG_SCREEN_MODIFY("megadriv")
- MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE(*this, md_cons_state, screen_vblank_console))
+ subdevice<screen_device>("megadriv")->screen_vblank().set(FUNC(md_cons_state::screen_vblank_console));
- MCFG_MD_CARTRIDGE_ADD("mdslot", md_cart, nullptr)
- MCFG_SOFTWARE_LIST_ADD("cart_list","megadriv")
-MACHINE_CONFIG_END
+ MD_CART_SLOT(config, m_cart, md_cart, nullptr);
+ SOFTWARE_LIST(config, "cart_list").set_original("megadriv");
+}
-MACHINE_CONFIG_START(md_cons_state::genesis_tmss)
+void md_cons_state::genesis_tmss(machine_config &config)
+{
ms_megadriv(config);
- MCFG_SOFTWARE_LIST_FILTER("cart_list","TMSS")
-MACHINE_CONFIG_END
+ subdevice<software_list_device>("cart_list")->set_filter("TMSS");
+}
-MACHINE_CONFIG_START(md_cons_state::dcat16_megadriv)
+void md_cons_state::dcat16_megadriv(machine_config &config)
+{
dcat16_megadriv_base(config);
MCFG_MACHINE_START_OVERRIDE(md_cons_state, md_common)
MCFG_MACHINE_RESET_OVERRIDE(md_cons_state, megadriv)
- MCFG_SCREEN_MODIFY("megadriv")
- MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE(*this, md_cons_state, screen_vblank_console))
+ subdevice<screen_device>("megadriv")->screen_vblank().set(FUNC(md_cons_state::screen_vblank_console));
// has SD card slot instead?
-// MCFG_MD_CARTRIDGE_ADD("mdslot", md_cart, nullptr)
-// MCFG_SOFTWARE_LIST_ADD("cart_list","megadriv")
-MACHINE_CONFIG_END
+// MD_CART_SLOT(config, m_cart, md_cart, nullptr);
+// SOFTWARE_LIST(config, "cart_list").set_original("megadriv");
+}
/*************************************
*
@@ -604,35 +605,32 @@ MACHINE_CONFIG_START(md_cons_state::genesis_32x)
MCFG_MACHINE_START_OVERRIDE(md_cons_state, md_common)
MCFG_MACHINE_RESET_OVERRIDE(md_cons_state, ms_megadriv)
- MCFG_DEVICE_MODIFY("gen_vdp")
- MCFG_SEGA315_5313_32X_SCANLINE_CB(md_cons_state, _32x_scanline_callback);
- MCFG_SEGA315_5313_32X_SCANLINE_HELPER_CB(md_cons_state, _32x_scanline_helper_callback);
- MCFG_SEGA315_5313_32X_INTERRUPT_CB(md_cons_state, _32x_interrupt_callback);
- MCFG_SOUND_ROUTES_RESET()
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", (0.25)/2)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", (0.25)/2)
+ m_vdp->set_md_32x_scanline(FUNC(md_cons_state::_32x_scanline_callback), this);
+ m_vdp->set_md_32x_scanline_helper(FUNC(md_cons_state::_32x_scanline_helper_callback), this);
+ m_vdp->set_md_32x_interrupt(FUNC(md_cons_state::_32x_interrupt_callback), this);
+ m_vdp->reset_routes();
+ m_vdp->add_route(ALL_OUTPUTS, "lspeaker", (0.25)/2);
+ m_vdp->add_route(ALL_OUTPUTS, "rspeaker", (0.25)/2);
SEGA_32X_NTSC(config, m_32x, (MASTER_CLOCK_NTSC * 3) / 7, m_maincpu, m_scan_timer);
m_32x->set_palette_tag("gen_vdp:palette");
- MCFG_SCREEN_MODIFY("megadriv")
- MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE(*this, md_cons_state, screen_vblank_console))
+ subdevice<screen_device>("megadriv")->screen_vblank().set(FUNC(md_cons_state::screen_vblank_console));
// we need to remove and re-add the YM because the balance is different
// due to MAME / MESS having severe issues if the dac output is > 0.40? (sound is corrupted even if DAC is silent?!)
- MCFG_DEVICE_REMOVE("ymsnd")
+ config.device_remove("ymsnd");
- MCFG_DEVICE_ADD("ymsnd", YM2612, MASTER_CLOCK_NTSC/7)
- MCFG_SOUND_ROUTE(0, "lspeaker", (0.50)/2)
- MCFG_SOUND_ROUTE(1, "rspeaker", (0.50)/2)
+ YM2612(config, m_ymsnd, MASTER_CLOCK_NTSC/7);
+ m_ymsnd->add_route(0, "lspeaker", (0.50)/2);
+ m_ymsnd->add_route(1, "rspeaker", (0.50)/2);
MCFG_GENERIC_CARTSLOT_ADD("cartslot", generic_plain_slot, "_32x_cart")
MCFG_GENERIC_EXTENSIONS("32x,bin")
MCFG_GENERIC_MANDATORY
MCFG_GENERIC_LOAD(md_cons_state, _32x_cart)
- MCFG_SOFTWARE_LIST_ADD("cart_list","32x")
- MCFG_SOFTWARE_LIST_FILTER("cart_list","NTSC-U")
+ SOFTWARE_LIST(config, "cart_list").set_original("32x").set_filter("NTSC-U");
MACHINE_CONFIG_END
@@ -642,35 +640,32 @@ MACHINE_CONFIG_START(md_cons_state::mdj_32x)
MCFG_MACHINE_START_OVERRIDE(md_cons_state, md_common)
MCFG_MACHINE_RESET_OVERRIDE(md_cons_state, ms_megadriv)
- MCFG_DEVICE_MODIFY("gen_vdp")
- MCFG_SEGA315_5313_32X_SCANLINE_CB(md_cons_state, _32x_scanline_callback);
- MCFG_SEGA315_5313_32X_SCANLINE_HELPER_CB(md_cons_state, _32x_scanline_helper_callback);
- MCFG_SEGA315_5313_32X_INTERRUPT_CB(md_cons_state, _32x_interrupt_callback);
- MCFG_SOUND_ROUTES_RESET()
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", (0.25)/2)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", (0.25)/2)
+ m_vdp->set_md_32x_scanline(FUNC(md_cons_state::_32x_scanline_callback), this);
+ m_vdp->set_md_32x_scanline_helper(FUNC(md_cons_state::_32x_scanline_helper_callback), this);
+ m_vdp->set_md_32x_interrupt(FUNC(md_cons_state::_32x_interrupt_callback), this);
+ m_vdp->reset_routes();
+ m_vdp->add_route(ALL_OUTPUTS, "lspeaker", (0.25)/2);
+ m_vdp->add_route(ALL_OUTPUTS, "rspeaker", (0.25)/2);
SEGA_32X_NTSC(config, m_32x, (MASTER_CLOCK_NTSC * 3) / 7, m_maincpu, m_scan_timer);
m_32x->set_palette_tag("gen_vdp:palette");
- MCFG_SCREEN_MODIFY("megadriv")
- MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE(*this, md_cons_state, screen_vblank_console))
+ subdevice<screen_device>("megadriv")->screen_vblank().set(FUNC(md_cons_state::screen_vblank_console));
// we need to remove and re-add the sound system because the balance is different
// due to MAME / MESS having severe issues if the dac output is > 0.40? (sound is corrupted even if DAC is silent?!)
- MCFG_DEVICE_REMOVE("ymsnd")
+ config.device_remove("ymsnd");
- MCFG_DEVICE_ADD("ymsnd", YM2612, MASTER_CLOCK_NTSC/7)
- MCFG_SOUND_ROUTE(0, "lspeaker", (0.50)/2)
- MCFG_SOUND_ROUTE(1, "rspeaker", (0.50)/2)
+ YM2612(config, m_ymsnd, MASTER_CLOCK_NTSC/7);
+ m_ymsnd->add_route(0, "lspeaker", (0.50)/2);
+ m_ymsnd->add_route(1, "rspeaker", (0.50)/2);
MCFG_GENERIC_CARTSLOT_ADD("cartslot", generic_plain_slot, "_32x_cart")
MCFG_GENERIC_EXTENSIONS("32x,bin")
MCFG_GENERIC_MANDATORY
MCFG_GENERIC_LOAD(md_cons_state, _32x_cart)
- MCFG_SOFTWARE_LIST_ADD("cart_list","32x")
- MCFG_SOFTWARE_LIST_FILTER("cart_list","NTSC-J")
+ SOFTWARE_LIST(config, "cart_list").set_original("32x").set_filter("NTSC-J");
MACHINE_CONFIG_END
@@ -680,35 +675,32 @@ MACHINE_CONFIG_START(md_cons_state::md_32x)
MCFG_MACHINE_START_OVERRIDE(md_cons_state, md_common)
MCFG_MACHINE_RESET_OVERRIDE(md_cons_state, ms_megadriv)
- MCFG_DEVICE_MODIFY("gen_vdp")
- MCFG_SEGA315_5313_32X_SCANLINE_CB(md_cons_state, _32x_scanline_callback);
- MCFG_SEGA315_5313_32X_SCANLINE_HELPER_CB(md_cons_state, _32x_scanline_helper_callback);
- MCFG_SEGA315_5313_32X_INTERRUPT_CB(md_cons_state, _32x_interrupt_callback);
- MCFG_SOUND_ROUTES_RESET()
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", (0.25)/2)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", (0.25)/2)
+ m_vdp->set_md_32x_scanline(FUNC(md_cons_state::_32x_scanline_callback), this);
+ m_vdp->set_md_32x_scanline_helper(FUNC(md_cons_state::_32x_scanline_helper_callback), this);
+ m_vdp->set_md_32x_interrupt(FUNC(md_cons_state::_32x_interrupt_callback), this);
+ m_vdp->reset_routes();
+ m_vdp->add_route(ALL_OUTPUTS, "lspeaker", (0.25)/2);
+ m_vdp->add_route(ALL_OUTPUTS, "rspeaker", (0.25)/2);
SEGA_32X_PAL(config, m_32x, (MASTER_CLOCK_PAL * 3) / 7, m_maincpu, m_scan_timer);
m_32x->set_palette_tag("gen_vdp:palette");
- MCFG_SCREEN_MODIFY("megadriv")
- MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE(*this, md_cons_state, screen_vblank_console))
+ subdevice<screen_device>("megadriv")->screen_vblank().set(FUNC(md_cons_state::screen_vblank_console));
// we need to remove and re-add the sound system because the balance is different
// due to MAME / MESS having severe issues if the dac output is > 0.40? (sound is corrupted even if DAC is silent?!)
- MCFG_DEVICE_REMOVE("ymsnd")
+ config.device_remove("ymsnd");
- MCFG_DEVICE_ADD("ymsnd", YM2612, MASTER_CLOCK_NTSC/7)
- MCFG_SOUND_ROUTE(0, "lspeaker", (0.50)/2)
- MCFG_SOUND_ROUTE(1, "rspeaker", (0.50)/2)
+ YM2612(config, m_ymsnd, MASTER_CLOCK_NTSC/7);
+ m_ymsnd->add_route(0, "lspeaker", (0.50)/2);
+ m_ymsnd->add_route(1, "rspeaker", (0.50)/2);
MCFG_GENERIC_CARTSLOT_ADD("cartslot", generic_plain_slot, "_32x_cart")
MCFG_GENERIC_EXTENSIONS("32x,bin")
MCFG_GENERIC_MANDATORY
MCFG_GENERIC_LOAD(md_cons_state, _32x_cart)
- MCFG_SOFTWARE_LIST_ADD("cart_list","32x")
- MCFG_SOFTWARE_LIST_FILTER("cart_list","PAL")
+ SOFTWARE_LIST(config, "cart_list").set_original("32x").set_filter("PAL");
MACHINE_CONFIG_END
@@ -744,120 +736,120 @@ ROM_END
/****************************************** SegaCD emulation ****************************************/
-MACHINE_CONFIG_START(md_cons_state::genesis_scd)
+void md_cons_state::genesis_scd(machine_config &config)
+{
md_ntsc(config);
MCFG_MACHINE_START_OVERRIDE(md_cons_state, ms_megacd)
MCFG_MACHINE_RESET_OVERRIDE(md_cons_state, ms_megadriv)
- MCFG_SCREEN_MODIFY("megadriv")
- MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE(*this, md_cons_state, screen_vblank_console))
+ subdevice<screen_device>("megadriv")->screen_vblank().set(FUNC(md_cons_state::screen_vblank_console));
- MCFG_DEVICE_ADD("segacd", SEGA_SEGACD_US, 0)
- MCFG_GFX_PALETTE("gen_vdp:palette")
+ SEGA_SEGACD_US(config, m_segacd, 0);
+ m_segacd->set_palette("gen_vdp:palette");
+ m_segacd->set_hostcpu(m_maincpu);
- MCFG_CDROM_ADD( "cdrom" )
- MCFG_CDROM_INTERFACE("scd_cdrom")
+ CDROM(config, "cdrom").set_interface("scd_cdrom");
- MCFG_SOFTWARE_LIST_ADD("cd_list","segacd")
-MACHINE_CONFIG_END
+ SOFTWARE_LIST(config, "cd_list").set_original("segacd");
+}
-MACHINE_CONFIG_START(md_cons_state::md_scd)
+void md_cons_state::md_scd(machine_config &config)
+{
md_pal(config);
MCFG_MACHINE_START_OVERRIDE(md_cons_state, ms_megacd)
MCFG_MACHINE_RESET_OVERRIDE(md_cons_state, ms_megadriv)
- MCFG_SCREEN_MODIFY("megadriv")
- MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE(*this, md_cons_state, screen_vblank_console))
+ subdevice<screen_device>("megadriv")->screen_vblank().set(FUNC(md_cons_state::screen_vblank_console));
- MCFG_DEVICE_ADD("segacd", SEGA_SEGACD_EUROPE, 0)
- MCFG_GFX_PALETTE("gen_vdp:palette")
+ SEGA_SEGACD_EUROPE(config, m_segacd, 0);
+ m_segacd->set_palette("gen_vdp:palette");
+ m_segacd->set_hostcpu(m_maincpu);
- MCFG_CDROM_ADD( "cdrom" )
- MCFG_CDROM_INTERFACE("scd_cdrom")
+ CDROM(config, "cdrom").set_interface("scd_cdrom");
- MCFG_SOFTWARE_LIST_ADD("cd_list","megacd")
-MACHINE_CONFIG_END
+ SOFTWARE_LIST(config, "cd_list").set_original("megacd");
+}
-MACHINE_CONFIG_START(md_cons_state::mdj_scd)
+void md_cons_state::mdj_scd(machine_config &config)
+{
md_ntsc(config);
MCFG_MACHINE_START_OVERRIDE(md_cons_state, ms_megacd)
MCFG_MACHINE_RESET_OVERRIDE(md_cons_state, ms_megadriv)
- MCFG_SCREEN_MODIFY("megadriv")
- MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE(*this, md_cons_state, screen_vblank_console))
+ subdevice<screen_device>("megadriv")->screen_vblank().set(FUNC(md_cons_state::screen_vblank_console));
- MCFG_DEVICE_ADD("segacd", SEGA_SEGACD_JAPAN, 0)
- MCFG_GFX_PALETTE("gen_vdp:palette")
+ SEGA_SEGACD_JAPAN(config, m_segacd, 0);
+ m_segacd->set_palette("gen_vdp:palette");
+ m_segacd->set_hostcpu(m_maincpu);
- MCFG_CDROM_ADD( "cdrom" )
- MCFG_CDROM_INTERFACE("scd_cdrom")
+ CDROM(config, "cdrom").set_interface("scd_cdrom");
- MCFG_SOFTWARE_LIST_ADD("cd_list","megacdj")
-MACHINE_CONFIG_END
+ SOFTWARE_LIST(config, "cd_list").set_original("megacdj");
+}
/******************SEGA CD + 32X****************************/
MACHINE_CONFIG_START(md_cons_state::genesis_32x_scd)
genesis_32x(config);
- MCFG_DEVICE_ADD("segacd", SEGA_SEGACD_US, 0)
- MCFG_GFX_PALETTE("gen_vdp:palette")
+ SEGA_SEGACD_US(config, m_segacd, 0);
+ m_segacd->set_palette("gen_vdp:palette");
+ m_segacd->set_hostcpu(m_maincpu);
- MCFG_CDROM_ADD( "cdrom" )
- MCFG_CDROM_INTERFACE("scd_cdrom")
+ CDROM(config, "cdrom").set_interface("scd_cdrom");
MCFG_MACHINE_START_OVERRIDE(md_cons_state, ms_megacd)
- MCFG_DEVICE_REMOVE("cartslot")
+ config.device_remove("cartslot");
MCFG_GENERIC_CARTSLOT_ADD("cartslot", generic_plain_slot, "_32x_cart")
MCFG_GENERIC_EXTENSIONS("32x,bin")
MCFG_GENERIC_LOAD(md_cons_state, _32x_cart)
- //MCFG_QUANTUM_PERFECT_CPU("32x_master_sh2")
- MCFG_SOFTWARE_LIST_ADD("cd_list", "segacd")
+ //config.m_perfect_cpu_quantum = subtag("32x_master_sh2");
+ SOFTWARE_LIST(config, "cd_list").set_original("segacd");
MACHINE_CONFIG_END
MACHINE_CONFIG_START(md_cons_state::md_32x_scd)
md_32x(config);
- MCFG_DEVICE_ADD("segacd", SEGA_SEGACD_EUROPE, 0)
- MCFG_GFX_PALETTE("gen_vdp:palette")
+ SEGA_SEGACD_EUROPE(config, m_segacd, 0);
+ m_segacd->set_palette("gen_vdp:palette");
+ m_segacd->set_hostcpu(m_maincpu);
- MCFG_CDROM_ADD( "cdrom" )
- MCFG_CDROM_INTERFACE("scd_cdrom")
+ CDROM(config, "cdrom").set_interface("scd_cdrom");
MCFG_MACHINE_START_OVERRIDE(md_cons_state, ms_megacd)
- MCFG_DEVICE_REMOVE("cartslot")
+ config.device_remove("cartslot");
MCFG_GENERIC_CARTSLOT_ADD("cartslot", generic_plain_slot, "_32x_cart")
MCFG_GENERIC_EXTENSIONS("32x,bin")
MCFG_GENERIC_LOAD(md_cons_state, _32x_cart)
- //MCFG_QUANTUM_PERFECT_CPU("32x_master_sh2")
- MCFG_SOFTWARE_LIST_ADD("cd_list", "megacd")
+ //config.m_perfect_cpu_quantum = subtag("32x_master_sh2");
+ SOFTWARE_LIST(config, "cd_list").set_original("megacd");
MACHINE_CONFIG_END
MACHINE_CONFIG_START(md_cons_state::mdj_32x_scd)
mdj_32x(config);
- MCFG_DEVICE_ADD("segacd", SEGA_SEGACD_JAPAN, 0)
- MCFG_GFX_PALETTE("gen_vdp:palette")
+ SEGA_SEGACD_JAPAN(config, m_segacd, 0);
+ m_segacd->set_palette("gen_vdp:palette");
+ m_segacd->set_hostcpu(m_maincpu);
- MCFG_CDROM_ADD( "cdrom" )
- MCFG_CDROM_INTERFACE("scd_cdrom")
+ CDROM(config, "cdrom").set_interface("scd_cdrom");
MCFG_MACHINE_START_OVERRIDE(md_cons_state, ms_megacd)
- MCFG_DEVICE_REMOVE("cartslot")
+ config.device_remove("cartslot");
MCFG_GENERIC_CARTSLOT_ADD("cartslot", generic_plain_slot, "_32x_cart")
MCFG_GENERIC_EXTENSIONS("32x,bin")
MCFG_GENERIC_LOAD(md_cons_state, _32x_cart)
- //MCFG_QUANTUM_PERFECT_CPU("32x_master_sh2")
- MCFG_SOFTWARE_LIST_ADD("cd_list", "megacdj")
+ //config.m_perfect_cpu_quantum = subtag("32x_master_sh2");
+ SOFTWARE_LIST(config, "cd_list").set_original("megacdj");
MACHINE_CONFIG_END
/* We need proper names for most of these BIOS ROMs! */
diff --git a/src/mame/drivers/megadriv_acbl.cpp b/src/mame/drivers/megadriv_acbl.cpp
index 5431775a539..cf6e5463d9d 100644
--- a/src/mame/drivers/megadriv_acbl.cpp
+++ b/src/mame/drivers/megadriv_acbl.cpp
@@ -6,10 +6,14 @@
Games supported:
* Aladdin
+ * Bare Knuckle III
+ * Jurassic Park
* Mortal Kombat 3
+ * Sonic The Hedgehog 2
* Super Street Fighter II - The New Challengers
* Sunset Riders
* Top Shooter
+ * Twinkle Tale
Aladdin PCB info
@@ -96,7 +100,7 @@ Stephh's notes (based on the game M68000 code and some tests) :
that's why I've "blanked" player 2 inputs which are never read.
- I've labelled the buttons the same way as in 'g_aladj' with default options.
-5) MegaDrive comparaison ('g_aladj' in HazeMD)
+5) MegaDrive comparison ('g_aladj' in HazeMD)
- There is no "OPTIONS" menu as the difficulty is handled via the MCU / Dip Switches.
Some code has been patched but most is still there (see the texts in the ROM ares);
@@ -191,7 +195,7 @@ connector, but of course, I can be wrong.
|_|_|_|_|_|_|_|_|_|_|_|_|_|_| |_|_|_|_|
- IC1 = Surface scracthed out, don't know what is it
+ IC1 = Surface scratched out, don't know what it is
U24 = Surface scratched out, seems like a PROM
DIPs = Fixed as: 00001000
ROMs = Toshiba TC574000AD
@@ -266,7 +270,7 @@ connector, but of course, I can be wrong.
// smaller ROM region because some bootlegs check for RAM there (used by topshoot and hshavoc)
void md_boot_state::md_bootleg_map(address_map &map)
{
- map(0x000000, 0x0fffff).rom(); /* Cartridge Program Rom */
+ map(0x000000, 0x1fffff).rom(); /* Cartridge Program Rom */
map(0x200000, 0x2023ff).ram(); // tested
map(0xa00000, 0xa01fff).rw(FUNC(md_boot_state::megadriv_68k_read_z80_ram), FUNC(md_boot_state::megadriv_68k_write_z80_ram));
@@ -284,12 +288,12 @@ void md_boot_state::md_bootleg_map(address_map &map)
map(0xe00000, 0xe0ffff).ram().mirror(0x1f0000).share("megadrive_ram");
}
-MACHINE_CONFIG_START(md_boot_state::md_bootleg)
+void md_boot_state::md_bootleg(machine_config &config)
+{
md_ntsc(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(md_bootleg_map)
-MACHINE_CONFIG_END
+ m_maincpu->set_addrmap(AS_PROGRAM, &md_boot_state::md_bootleg_map);
+}
/*************************************
*
@@ -325,6 +329,29 @@ READ16_MEMBER(md_boot_state::aladmdb_r )
if (m_maincpu->pc()==0x1b2d4e) return 0x0000;
logerror("aladbl_r : %06x\n",m_maincpu->pc());
+ return 0x0000;
+}
+
+READ16_MEMBER(md_boot_state::twinktmb_r )
+{
+ if (m_maincpu->pc()==0x02f81e)
+ return ioport("COIN")->read(); // TODO: coins don't respond well
+
+ if (m_maincpu->pc()==0x02f84e) return 0x0000; // what's this? dips?
+
+ //logerror("twinktmb_r : %06x\n",m_maincpu->pc());
+
+ return 0x0000;
+}
+
+READ16_MEMBER(md_boot_state::jparkmb_r )
+{
+ if (m_maincpu->pc()==0x1e327a)
+ return ioport("COIN")->read(); // TODO: coins don't respond well
+
+ if (m_maincpu->pc()==0x1e3254) return 0x0000; // what's this? dips?
+
+ //logerror("jparkmb_r : %06x\n",m_maincpu->pc());
return 0x0000;
}
@@ -605,6 +632,75 @@ INPUT_PORTS_START( aladmdb )
PORT_BIT( 0x0100, IP_ACTIVE_HIGH, IPT_COIN1 ) PORT_IMPULSE(1) /* needed to avoid credits getting mad */
INPUT_PORTS_END
+INPUT_PORTS_START( sonic2mb )
+ PORT_INCLUDE( md_common )
+
+ PORT_MODIFY("PAD1")
+ PORT_BIT( 0x0010, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(1)
+ PORT_BIT( 0x0020, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(1)
+ PORT_BIT( 0x0040, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_PLAYER(1)
+ PORT_BIT( 0x0080, IP_ACTIVE_LOW, IPT_START1 )
+
+ PORT_MODIFY("PAD2")
+ PORT_BIT( 0x00ff, IP_ACTIVE_LOW, IPT_UNUSED )
+
+ PORT_START("DSW")
+ PORT_BIT( 0x0001, IP_ACTIVE_LOW, IPT_COIN1 )
+ PORT_BIT( 0x0002, IP_ACTIVE_LOW, IPT_COIN2 )
+ PORT_BIT( 0x00fc, IP_ACTIVE_LOW, IPT_UNUSED )
+ PORT_DIPNAME( 0x0300, 0x0200, DEF_STR( Lives ) ) PORT_DIPLOCATION("SW1:1,2")
+ PORT_DIPSETTING( 0x0000, "1" )
+ PORT_DIPSETTING( 0x0100, "2" )
+ PORT_DIPSETTING( 0x0200, "3" )
+ PORT_DIPSETTING( 0x0300, "4" )
+ PORT_DIPNAME( 0x3c00, 0x2000, "Timer Speed" ) PORT_DIPLOCATION("SW1:3,4,5,6")
+ PORT_DIPSETTING( 0x3c00, "0 (Slowest)" )
+ PORT_DIPSETTING( 0x3800, "1" )
+ PORT_DIPSETTING( 0x3400, "2" )
+ PORT_DIPSETTING( 0x3000, "3" )
+ PORT_DIPSETTING( 0x2c00, "4" )
+ PORT_DIPSETTING( 0x2800, "5" )
+ PORT_DIPSETTING( 0x2400, "6" )
+ PORT_DIPSETTING( 0x2000, "7" )
+ PORT_DIPSETTING( 0x1c00, "8" )
+ PORT_DIPSETTING( 0x1800, "9" )
+ PORT_DIPSETTING( 0x1400, "10" )
+ PORT_DIPSETTING( 0x1000, "11" )
+ PORT_DIPSETTING( 0x0c00, "12" )
+ PORT_DIPSETTING( 0x0800, "13" )
+ PORT_DIPSETTING( 0x0400, "14" )
+ PORT_DIPSETTING( 0x0000, "15 (Fastest)" )
+ PORT_DIPUNKNOWN_DIPLOC(0x4000, 0x4000, "SW1:7")
+ PORT_DIPUNKNOWN_DIPLOC(0x8000, 0x8000, "SW1:8")
+INPUT_PORTS_END
+
+INPUT_PORTS_START( twinktmb )
+ PORT_INCLUDE( aladmdb )
+
+ /* As I don't know how it is on real hardware, this is more a guess than anything */
+
+ PORT_MODIFY("MCU")
+ PORT_DIPUNKNOWN_DIPLOC(0x01, 0x01, "SW1:1")
+ PORT_DIPUNKNOWN_DIPLOC(0x02, 0x02, "SW1:2")
+ PORT_DIPUNKNOWN_DIPLOC(0x04, 0x04, "SW1:3")
+ PORT_DIPUNKNOWN_DIPLOC(0x08, 0x08, "SW1:4")
+ PORT_DIPUNKNOWN_DIPLOC(0x10, 0x10, "SW1:5")
+ PORT_DIPUNKNOWN_DIPLOC(0x20, 0x20, "SW1:6")
+ PORT_DIPUNKNOWN_DIPLOC(0x40, 0x40, "SW1:7")
+ PORT_DIPUNKNOWN_DIPLOC(0x80, 0x80, "SW1:8")
+
+ PORT_START("COIN")
+ PORT_BIT( 0x0001, IP_ACTIVE_HIGH, IPT_UNUSED )
+ PORT_BIT( 0x0002, IP_ACTIVE_HIGH, IPT_UNUSED )
+ PORT_BIT( 0x0004, IP_ACTIVE_HIGH, IPT_UNUSED )
+ PORT_BIT( 0x0008, IP_ACTIVE_HIGH, IPT_COIN1 )
+ PORT_BIT( 0x0010, IP_ACTIVE_HIGH, IPT_UNUSED )
+ PORT_BIT( 0x0020, IP_ACTIVE_HIGH, IPT_UNUSED )
+ PORT_BIT( 0x0040, IP_ACTIVE_HIGH, IPT_UNUSED )
+ PORT_BIT( 0x0080, IP_ACTIVE_HIGH, IPT_COIN2 )
+ PORT_BIT( 0xff00, IP_ACTIVE_HIGH, IPT_UNUSED )
+INPUT_PORTS_END
+
/* verified from M68000 code */
INPUT_PORTS_START( srmdb )
PORT_INCLUDE( md_common )
@@ -709,10 +805,11 @@ INPUT_PORTS_END
*
*************************************/
-MACHINE_CONFIG_START(md_boot_state::megadrvb)
+void md_boot_state::megadrvb(machine_config &config)
+{
md_ntsc(config);
MCFG_MACHINE_START_OVERRIDE(md_boot_state, md_bootleg)
-MACHINE_CONFIG_END
+}
MACHINE_START_MEMBER(md_boot_state, md_6button)
{
@@ -728,10 +825,11 @@ MACHINE_START_MEMBER(md_boot_state, md_6button)
m_io_timeout[i] = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(md_base_state::io_timeout_timer_callback),this), (void*)(uintptr_t)i);
}
-MACHINE_CONFIG_START(md_boot_state::megadrvb_6b)
+void md_boot_state::megadrvb_6b(machine_config &config)
+{
md_ntsc(config);
MCFG_MACHINE_START_OVERRIDE(md_boot_state, md_6button)
-MACHINE_CONFIG_END
+}
/*************************************
@@ -746,6 +844,9 @@ ROM_START( aladmdb )
ROM_LOAD16_BYTE( "m2.bin", 0x000000, 0x080000, CRC(142a0366) SHA1(6c94aa9936cd11ccda503b52019a6721e64a32f0) )
ROM_LOAD16_BYTE( "m3.bin", 0x100001, 0x080000, CRC(0feeeb19) SHA1(bd567a33077ab9997871d21736066140d50e3d70) )
ROM_LOAD16_BYTE( "m4.bin", 0x100000, 0x080000, CRC(bc712661) SHA1(dfd554d000399e17b4ddc69761e572195ed4e1f0))
+
+ ROM_REGION( 0x2000, "pic", ROMREGION_ERASE00 )
+ ROM_LOAD( "pic16c57xtp", 0x0000, 0x2000, NO_DUMP )
ROM_END
ROM_START( mk3mdb ) // roms are scrambled, we take care of the address descramble in the ROM load, and the data descramble in the init
@@ -816,6 +917,25 @@ ROM_START( barek3mb )
ROM_LOAD16_BYTE( "2.u16", 0x200001, 0x080000, CRC(bba4a585) SHA1(32c59729943d7b4c1a39f2a2b0dae9ce16991e9c) )
ROM_END
+ROM_START( twinktmb ) // same PCB as sonic2mb, but in this one the PIC is populated
+ ROM_REGION( 0x400000, "maincpu", 0 ) /* 68000 Code */
+ ROM_LOAD16_BYTE( "m2.bin", 0x000000, 0x080000, CRC(44424f8f) SHA1(e16318bfdf869765c821c264cf9a7e6c728f7073) )
+ ROM_LOAD16_BYTE( "m1.bin", 0x000001, 0x080000, CRC(69aa916e) SHA1(7ea6b571fd0b6494051d5846ee9b4564b7692766) )
+
+ ROM_REGION( 0x2000, "pic", ROMREGION_ERASE00 )
+ ROM_LOAD( "pic16c57xtp", 0x0000, 0x2000, NO_DUMP )
+ROM_END
+
+ROM_START( jparkmb ) // same PCB as twinktmb, JPA-028 label
+ ROM_REGION( 0x400000, "maincpu", 0 ) /* 68000 Code */
+ ROM_LOAD16_BYTE( "f24.bin", 0x000000, 0x080000, CRC(bdd851d2) SHA1(1a75922e848fd5c7cd4ab102c99effcfcf382097) )
+ ROM_LOAD16_BYTE( "f23.bin", 0x000001, 0x080000, CRC(8dc66c71) SHA1(a2741ffa583a4b779b7be3e3ae628e97f792ee3d) )
+ ROM_LOAD16_BYTE( "f22.bin", 0x100000, 0x080000, CRC(36337d06) SHA1(d537cff2c8ed58da146faf390c09252be359ccd1) )
+ ROM_LOAD16_BYTE( "f21.bin", 0x100001, 0x080000, CRC(6ede6b6b) SHA1(cf29300d9278ea03f54cf54ea582bdd8b9bbdbbd) )
+
+ ROM_REGION( 0x2000, "pic", ROMREGION_ERASE00 )
+ ROM_LOAD( "pic16c57xtp", 0x0000, 0x2000, NO_DUMP )
+ROM_END
/*************************************
*
@@ -963,6 +1083,37 @@ void md_boot_state::init_barek3()
init_megadrij();
}
+void md_boot_state::init_sonic2mb()
+{
+ // 100000 = writes to unpopulated MCU?
+ m_maincpu->space(AS_PROGRAM).install_write_handler(0x100000, 0x100001, write16_delegate(FUNC(md_boot_state::aladmdb_w),this));
+ m_maincpu->space(AS_PROGRAM).install_read_port(0x300000, 0x300001, "DSW");
+
+ init_megadrij();
+}
+
+void md_boot_state::init_twinktmb()
+{
+ // boot vectors don't seem to be valid, so they are patched...
+ uint8_t* rom = memregion("maincpu")->base();
+ rom[0x01] = 0x00;
+
+ rom[0x04] = 0x00;
+ rom[0x07] = 0x46;
+ rom[0x06] = 0xcc;
+
+ init_megadrij();
+ m_maincpu->space(AS_PROGRAM).install_write_handler(0x100000, 0x100001, write16_delegate(FUNC(md_boot_state::aladmdb_w),this));
+ m_maincpu->space(AS_PROGRAM).install_read_handler(0x300000, 0x300001, read16_delegate(FUNC(md_boot_state::twinktmb_r),this));
+}
+
+void md_boot_state::init_jparkmb()
+{
+ init_megadrij();
+ m_maincpu->space(AS_PROGRAM).install_write_handler(0x100000, 0x100001, write16_delegate(FUNC(md_boot_state::aladmdb_w),this));
+ m_maincpu->space(AS_PROGRAM).install_read_handler(0x300000, 0x300001, read16_delegate(FUNC(md_boot_state::jparkmb_r),this));
+}
+
/*************************************
*
* Game driver(s)
@@ -974,5 +1125,7 @@ GAME( 1996, mk3mdb, 0, megadrvb_6b, mk3mdb, md_boot_state, init_mk3mdb, R
GAME( 1994, ssf2mdb, 0, megadrvb_6b, ssf2mdb, md_boot_state, init_ssf2mdb, ROT0, "bootleg / Capcom", "Super Street Fighter II - The New Challengers (bootleg of Japanese MegaDrive version)", 0)
GAME( 1993, srmdb, 0, megadrvb, srmdb, md_boot_state, init_srmdb, ROT0, "bootleg / Konami", "Sunset Riders (bootleg of Megadrive version)", 0)
GAME( 1995, topshoot, 0, md_bootleg, topshoot, md_boot_state, init_topshoot, ROT0, "Sun Mixing", "Top Shooter", 0)
-GAME( 1993, sonic2mb, 0, megadrvb, aladmdb, md_boot_state, init_aladmdb, ROT0, "bootleg / Sega", "Sonic The Hedgehog 2 (bootleg of Megadrive version)", MACHINE_NOT_WORKING )
+GAME( 1993, sonic2mb, 0, md_bootleg, sonic2mb, md_boot_state, init_sonic2mb, ROT0, "bootleg / Sega", "Sonic The Hedgehog 2 (bootleg of Megadrive version)", 0 ) // flying wires going through the empty PIC space aren't completely understood
GAME( 1994, barek3mb, 0, megadrvb, barek3, md_boot_state, init_barek3, ROT0, "bootleg / Sega", "Bare Knuckle III (bootleg of Megadrive version)", 0 )
+GAME( 1993, twinktmb, 0, md_bootleg, twinktmb, md_boot_state, init_twinktmb, ROT0, "bootleg / Sega", "Twinkle Tale (bootleg of Megadrive version)", MACHINE_UNEMULATED_PROTECTION | MACHINE_NOT_WORKING ) // needs PIC decap or simulation
+GAME( 1993, jparkmb, 0, md_bootleg, twinktmb, md_boot_state, init_jparkmb, ROT0, "bootleg / Sega", "Jurassic Park (bootleg of Megadrive version)", MACHINE_UNEMULATED_PROTECTION | MACHINE_NOT_WORKING ) // needs PIC decap or simulation
diff --git a/src/mame/drivers/megadriv_rad.cpp b/src/mame/drivers/megadriv_rad.cpp
index 60597e07a53..c41967b0923 100644
--- a/src/mame/drivers/megadriv_rad.cpp
+++ b/src/mame/drivers/megadriv_rad.cpp
@@ -133,29 +133,29 @@ MACHINE_RESET_MEMBER(megadriv_radica_state, megadriv_radica)
m_maincpu->reset();
}
-MACHINE_CONFIG_START(megadriv_radica_state::megadriv_radica_3button_ntsc)
+void megadriv_radica_state::megadriv_radica_3button_ntsc(machine_config &config)
+{
md_ntsc(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(megadriv_radica_map)
+ m_maincpu->set_addrmap(AS_PROGRAM, &megadriv_radica_state::megadriv_radica_map);
MCFG_MACHINE_START_OVERRIDE(megadriv_radica_state, megadriv_radica_3button)
MCFG_MACHINE_RESET_OVERRIDE(megadriv_radica_state, megadriv_radica)
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(megadriv_radica_state::megadriv_radica_3button_pal)
+void megadriv_radica_state::megadriv_radica_3button_pal(machine_config &config)
+{
md_pal(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(megadriv_radica_map)
+ m_maincpu->set_addrmap(AS_PROGRAM, &megadriv_radica_state::megadriv_radica_map);
MCFG_MACHINE_START_OVERRIDE(megadriv_radica_state, megadriv_radica_3button)
MCFG_MACHINE_RESET_OVERRIDE(megadriv_radica_state, megadriv_radica)
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(megadriv_radica_state::megadriv_radica_6button_pal)
+void megadriv_radica_state::megadriv_radica_6button_pal(machine_config &config)
+{
md_pal(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(megadriv_radica_map)
+ m_maincpu->set_addrmap(AS_PROGRAM, &megadriv_radica_state::megadriv_radica_map);
MCFG_MACHINE_START_OVERRIDE(megadriv_radica_state, megadriv_radica_6button)
MCFG_MACHINE_RESET_OVERRIDE(megadriv_radica_state, megadriv_radica)
-MACHINE_CONFIG_END
+}
diff --git a/src/mame/drivers/megaplay.cpp b/src/mame/drivers/megaplay.cpp
index 9822a1ec776..29e51560ca4 100644
--- a/src/mame/drivers/megaplay.cpp
+++ b/src/mame/drivers/megaplay.cpp
@@ -41,7 +41,6 @@ this reason.
#include "emu.h"
#include "cpu/z80/z80.h"
#include "machine/cxd1095.h"
-#include "sound/sn76496.h"
#include "includes/megadriv.h"
@@ -607,17 +606,16 @@ void mplay_state::megaplay_bios_map(address_map &map)
READ8_MEMBER(mplay_state::vdp1_count_r)
{
- address_space &prg = m_bioscpu->space(AS_PROGRAM);
if (offset & 0x01)
- return m_vdp1->hcount_read(prg, offset);
+ return m_vdp1->hcount_read();
else
- return m_vdp1->vcount_read(prg, offset);
+ return m_vdp1->vcount_read();
}
void mplay_state::megaplay_bios_io_map(address_map &map)
{
map.global_mask(0xff);
- map(0x7f, 0x7f).w("sn2", FUNC(sn76496_device::command_w));
+ map(0x7f, 0x7f).w(m_vdp1, FUNC(sega315_5124_device::psg_w));
map(0x40, 0x41).mirror(0x3e).r(FUNC(mplay_state::vdp1_count_r));
map(0x80, 0x80).mirror(0x3e).rw(m_vdp1, FUNC(sega315_5124_device::data_read), FUNC(sega315_5124_device::data_write));
@@ -664,17 +662,18 @@ MACHINE_RESET_MEMBER(mplay_state,megaplay)
MACHINE_RESET_CALL_MEMBER(megadriv);
}
-MACHINE_CONFIG_START(mplay_state::megaplay)
+void mplay_state::megaplay(machine_config &config)
+{
/* basic machine hardware */
md_ntsc(config);
/* The Megaplay has an extra BIOS cpu which drives an SMS VDP
which includes an SN76496 for sound */
- MCFG_DEVICE_ADD("mtbios", Z80, MASTER_CLOCK / 15) /* ?? */
- MCFG_DEVICE_PROGRAM_MAP(megaplay_bios_map)
- MCFG_DEVICE_IO_MAP(megaplay_bios_io_map)
+ Z80(config, m_bioscpu, MASTER_CLOCK / 15); /* ?? */
+ m_bioscpu->set_addrmap(AS_PROGRAM, &mplay_state::megaplay_bios_map);
+ m_bioscpu->set_addrmap(AS_IO, &mplay_state::megaplay_bios_io_map);
- MCFG_QUANTUM_TIME(attotime::from_hz(6000))
+ config.m_minimum_quantum = attotime::from_hz(6000);
cxd1095_device &io1(CXD1095(config, "io1", 0));
io1.in_porta_cb().set_ioport("DSW0");
@@ -692,23 +691,20 @@ MACHINE_CONFIG_START(mplay_state::megaplay)
io2.in_porte_cb().set(FUNC(mplay_state::bios_6404_r));
io2.out_porte_cb().set(FUNC(mplay_state::bios_6404_w));
- MCFG_DEVICE_ADD("sn2", SN76496, MASTER_CLOCK/15)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 0.25) /* 3.58 MHz */
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker",0.25) /* 3.58 MHz */
-
/* New update functions to handle the extra layer */
- MCFG_SCREEN_MODIFY("megadriv")
- MCFG_SCREEN_RAW_PARAMS(XTAL(10'738'635)/2, \
+ subdevice<screen_device>("megadriv")->set_raw(XTAL(10'738'635)/2, \
sega315_5124_device::WIDTH, sega315_5124_device::LBORDER_START + sega315_5124_device::LBORDER_WIDTH, sega315_5124_device::LBORDER_START + sega315_5124_device::LBORDER_WIDTH + 256, \
- sega315_5124_device::HEIGHT_NTSC, sega315_5124_device::TBORDER_START + sega315_5124_device::NTSC_224_TBORDER_HEIGHT, sega315_5124_device::TBORDER_START + sega315_5124_device::NTSC_224_TBORDER_HEIGHT + 224)
- MCFG_SCREEN_UPDATE_DRIVER(mplay_state, screen_update_megplay)
+ sega315_5124_device::HEIGHT_NTSC, sega315_5124_device::TBORDER_START + sega315_5124_device::NTSC_224_TBORDER_HEIGHT, sega315_5124_device::TBORDER_START + sega315_5124_device::NTSC_224_TBORDER_HEIGHT + 224);
+ subdevice<screen_device>("megadriv")->set_screen_update(FUNC(mplay_state::screen_update_megplay));
// Megaplay has an additional SMS VDP as an overlay
- MCFG_DEVICE_ADD("vdp1", SEGA315_5246, 0)
- MCFG_SEGA315_5246_SET_SCREEN("megadriv")
- MCFG_SEGA315_5246_IS_PAL(false)
- MCFG_SEGA315_5246_INT_CB(INPUTLINE("mtbios", 0))
-MACHINE_CONFIG_END
+ SEGA315_5246(config, m_vdp1, MASTER_CLOCK / 5); /* ?? */
+ m_vdp1->set_screen("megadriv");
+ m_vdp1->set_is_pal(false);
+ m_vdp1->irq().set_inputline(m_bioscpu, 0);
+ m_vdp1->add_route(ALL_OUTPUTS, "lspeaker", 0.25);
+ m_vdp1->add_route(ALL_OUTPUTS, "rspeaker", 0.25);
+}
/* MegaPlay Games - Modified Genesis games */
diff --git a/src/mame/drivers/megasys1.cpp b/src/mame/drivers/megasys1.cpp
index 00a17eb9fe9..34b19cf50a4 100644
--- a/src/mame/drivers/megasys1.cpp
+++ b/src/mame/drivers/megasys1.cpp
@@ -116,6 +116,10 @@ RAM RW 0f0000-0f3fff 0e0000-0effff? <
This game has no alternate levels mode either. Socketed encryption chip is
unusual.
+- Understand raster effect related register (ex : stdragon "push start" screen)
+
+- chimerab ranking screen effect is imperfect ( https://youtu.be/XhjCaFxhphA )
+
***************************************************************************/
#include "emu.h"
@@ -209,8 +213,8 @@ void megasys1_state::megasys1Z_map(address_map &map)
map(0x080002, 0x080003).portr("P1");
map(0x080004, 0x080005).portr("P2");
map(0x080006, 0x080007).portr("DSW");
- map(0x084200, 0x084205).w("scroll0", FUNC(megasys1_tilemap_device::scroll_w));
- map(0x084208, 0x08420d).w("scroll1", FUNC(megasys1_tilemap_device::scroll_w));
+ map(0x084200, 0x084205).rw("scroll0", FUNC(megasys1_tilemap_device::scroll_r), FUNC(megasys1_tilemap_device::scroll_w));
+ map(0x084208, 0x08420d).rw("scroll1", FUNC(megasys1_tilemap_device::scroll_r), FUNC(megasys1_tilemap_device::scroll_w));
map(0x084300, 0x084301).w(FUNC(megasys1_state::screen_flag_w));
map(0x084308, 0x084309).w(FUNC(megasys1_state::soundlatch_z_w));
map(0x088000, 0x0887ff).ram().w(m_palette, FUNC(palette_device::write16)).share("palette");
@@ -224,9 +228,9 @@ void megasys1_state::megasys1A_map(address_map &map)
{
map.global_mask(0xfffff);
megasys1Z_map(map);
- map(0x080008, 0x080009).r(m_soundlatch2, FUNC(generic_latch_16_device::read)); /* from sound cpu */
+ map(0x080008, 0x080009).r(m_soundlatch[1], FUNC(generic_latch_16_device::read)); /* from sound cpu */
map(0x084000, 0x084001).w(FUNC(megasys1_state::active_layers_w));
- map(0x084008, 0x08400d).w("scroll2", FUNC(megasys1_tilemap_device::scroll_w));
+ map(0x084008, 0x08400d).rw("scroll2", FUNC(megasys1_tilemap_device::scroll_r), FUNC(megasys1_tilemap_device::scroll_w));
map(0x084100, 0x084101).rw(FUNC(megasys1_state::sprite_flag_r), FUNC(megasys1_state::sprite_flag_w));
map(0x084308, 0x084309).w(FUNC(megasys1_state::soundlatch_w));
map(0x098000, 0x09bfff).ram().w("scroll2", FUNC(megasys1_tilemap_device::write)).share("scroll2");
@@ -306,10 +310,10 @@ void megasys1_state::megasys1B_map(address_map &map)
map.global_mask(0xfffff);
map(0x000000, 0x03ffff).rom();
map(0x044000, 0x044001).w(FUNC(megasys1_state::active_layers_w));
- map(0x044008, 0x04400d).w("scroll2", FUNC(megasys1_tilemap_device::scroll_w));
+ map(0x044008, 0x04400d).rw("scroll2", FUNC(megasys1_tilemap_device::scroll_r), FUNC(megasys1_tilemap_device::scroll_w));
map(0x044100, 0x044101).rw(FUNC(megasys1_state::sprite_flag_r), FUNC(megasys1_state::sprite_flag_w));
- map(0x044200, 0x044205).w("scroll0", FUNC(megasys1_tilemap_device::scroll_w));
- map(0x044208, 0x04420d).w("scroll1", FUNC(megasys1_tilemap_device::scroll_w));
+ map(0x044200, 0x044205).rw("scroll0", FUNC(megasys1_tilemap_device::scroll_r), FUNC(megasys1_tilemap_device::scroll_w));
+ map(0x044208, 0x04420d).rw("scroll1", FUNC(megasys1_tilemap_device::scroll_r), FUNC(megasys1_tilemap_device::scroll_w));
map(0x044300, 0x044301).w(FUNC(megasys1_state::screen_flag_w));
map(0x044308, 0x044309).w(FUNC(megasys1_state::soundlatch_w));
map(0x048000, 0x0487ff).ram().w(m_palette, FUNC(palette_device::write16)).share("palette");
@@ -358,10 +362,10 @@ void megasys1_state::megasys1B_monkelf_map(address_map &map)
#define INTERRUPT_NUM_C INTERRUPT_NUM_B
#define interrupt_C interrupt_B
-WRITE16_MEMBER(megasys1_state::ram_w )
+WRITE16_MEMBER(megasys1_state::ram_w)
{
// DON'T use COMBINE_DATA
- // byte writes end up mirroring in both bytes of the word like nmk16.c
+ // byte writes end up mirroring in both bytes of the word like nmk16.cpp
// 64th Street and Chimera Beast rely on this for attract inputs
m_ram[offset] = data;
@@ -373,14 +377,14 @@ void megasys1_state::megasys1C_map(address_map &map)
{
map.global_mask(0x1fffff);
map(0x000000, 0x07ffff).rom();
- map(0x0c2000, 0x0c2005).w("scroll0", FUNC(megasys1_tilemap_device::scroll_w));
- map(0x0c2008, 0x0c200d).w("scroll1", FUNC(megasys1_tilemap_device::scroll_w));
- map(0x0c2100, 0x0c2105).w("scroll2", FUNC(megasys1_tilemap_device::scroll_w));
+ map(0x0c2000, 0x0c2005).rw("scroll0", FUNC(megasys1_tilemap_device::scroll_r), FUNC(megasys1_tilemap_device::scroll_w));
+ map(0x0c2008, 0x0c200d).rw("scroll1", FUNC(megasys1_tilemap_device::scroll_r), FUNC(megasys1_tilemap_device::scroll_w));
+ map(0x0c2100, 0x0c2105).rw("scroll2", FUNC(megasys1_tilemap_device::scroll_r), FUNC(megasys1_tilemap_device::scroll_w));
map(0x0c2108, 0x0c2109).w(FUNC(megasys1_state::sprite_bank_w));
map(0x0c2200, 0x0c2201).rw(FUNC(megasys1_state::sprite_flag_r), FUNC(megasys1_state::sprite_flag_w));
map(0x0c2208, 0x0c2209).w(FUNC(megasys1_state::active_layers_w));
map(0x0c2308, 0x0c2309).w(FUNC(megasys1_state::screen_flag_w));
- map(0x0c8000, 0x0c8001).r(m_soundlatch2, FUNC(generic_latch_16_device::read)).w(FUNC(megasys1_state::soundlatch_c_w));
+ map(0x0c8000, 0x0c8001).r(m_soundlatch[1], FUNC(generic_latch_16_device::read)).w(FUNC(megasys1_state::soundlatch_c_w));
map(0x0d2000, 0x0d3fff).ram().share("objectram");
map(0x0d8000, 0x0d8001).rw(FUNC(megasys1_state::ip_select_r), FUNC(megasys1_state::ip_select_w));
// 64th Street actively uses 0xe4*** for breakable objects.
@@ -404,8 +408,8 @@ INTERRUPT_GEN_MEMBER(megasys1_state::megasys1D_irq)
void megasys1_state::megasys1D_map(address_map &map)
{
map(0x000000, 0x03ffff).rom();
- map(0x0c2000, 0x0c2005).w("scroll0", FUNC(megasys1_tilemap_device::scroll_w));
- map(0x0c2008, 0x0c200d).w("scroll1", FUNC(megasys1_tilemap_device::scroll_w));
+ map(0x0c2000, 0x0c2005).rw("scroll0", FUNC(megasys1_tilemap_device::scroll_r), FUNC(megasys1_tilemap_device::scroll_w));
+ map(0x0c2008, 0x0c200d).rw("scroll1", FUNC(megasys1_tilemap_device::scroll_r), FUNC(megasys1_tilemap_device::scroll_w));
map(0x0c2108, 0x0c2109).nopw(); //AM_WRITE(sprite_bank_w)
map(0x0c2200, 0x0c2201).rw(FUNC(megasys1_state::sprite_flag_r), FUNC(megasys1_state::sprite_flag_w));
map(0x0c2208, 0x0c2209).w(FUNC(megasys1_state::active_layers_w));
@@ -416,7 +420,7 @@ void megasys1_state::megasys1D_map(address_map &map)
map(0x0e0000, 0x0e0001).portr("DSW");
map(0x0e8000, 0x0ebfff).ram().w("scroll0", FUNC(megasys1_tilemap_device::write)).share("scroll0");
map(0x0f0000, 0x0f0001).portr("SYSTEM");
- map(0x0f8001, 0x0f8001).rw(m_oki1, FUNC(okim6295_device::read), FUNC(okim6295_device::write));
+ map(0x0f8001, 0x0f8001).rw(m_oki[0], FUNC(okim6295_device::read), FUNC(okim6295_device::write));
// map(0x100000, 0x100001); // protection
map(0x1f0000, 0x1fffff).ram() /*.w(FUNC(megasys1_state::ram_w))*/ .share("ram");
}
@@ -491,21 +495,15 @@ WRITE_LINE_MEMBER(megasys1_state::sound_irq)
m_audiocpu->set_input_line(4, HOLD_LINE);
}
-READ8_MEMBER(megasys1_state::oki_status_1_r)
+template<int Chip>
+READ8_MEMBER(megasys1_state::oki_status_r)
{
if (m_ignore_oki_status == 1)
return 0;
else
- return m_oki1->read_status();
+ return m_oki[Chip]->read();
}
-READ8_MEMBER(megasys1_state::oki_status_2_r)
-{
- if (m_ignore_oki_status == 1)
- return 0;
- else
- return m_oki2->read_status();
-}
/***************************************************************************
[ Sound CPU - System A ]
***************************************************************************/
@@ -514,24 +512,32 @@ READ8_MEMBER(megasys1_state::oki_status_2_r)
void megasys1_state::megasys1A_sound_map(address_map &map)
{
map(0x000000, 0x01ffff).rom();
- map(0x040000, 0x040001).r(m_soundlatch, FUNC(generic_latch_16_device::read));
- map(0x060000, 0x060001).w(m_soundlatch2, FUNC(generic_latch_16_device::write)); // to main cpu
+ map(0x040000, 0x040001).r(m_soundlatch[0], FUNC(generic_latch_16_device::read));
+ map(0x060000, 0x060001).w(m_soundlatch[1], FUNC(generic_latch_16_device::write)); // to main cpu
map(0x080000, 0x080003).rw("ymsnd", FUNC(ym2151_device::read), FUNC(ym2151_device::write)).umask16(0x00ff);
- map(0x0a0001, 0x0a0001).r(FUNC(megasys1_state::oki_status_1_r));
- map(0x0a0000, 0x0a0003).w(m_oki1, FUNC(okim6295_device::write)).umask16(0x00ff);
- map(0x0c0001, 0x0c0001).r(FUNC(megasys1_state::oki_status_2_r));
- map(0x0c0000, 0x0c0003).w(m_oki2, FUNC(okim6295_device::write)).umask16(0x00ff);
+ map(0x0a0001, 0x0a0001).r(FUNC(megasys1_state::oki_status_r<0>));
+ map(0x0a0000, 0x0a0003).w(m_oki[0], FUNC(okim6295_device::write)).umask16(0x00ff);
+ map(0x0c0001, 0x0c0001).r(FUNC(megasys1_state::oki_status_r<1>));
+ map(0x0c0000, 0x0c0003).w(m_oki[1], FUNC(okim6295_device::write)).umask16(0x00ff);
map(0x0e0000, 0x0fffff).ram();
}
+// jitsupro writes oki commands to both the lsb and msb; it works because of byte smearing
+void megasys1_state::megasys1A_jitsupro_sound_map(address_map &map)
+{
+ megasys1A_sound_map(map);
+ map(0x0a0000, 0x0a0003).w(m_oki[0], FUNC(okim6295_device::write)).umask16(0x00ff).cswidth(16);
+ map(0x0c0000, 0x0c0003).w(m_oki[1], FUNC(okim6295_device::write)).umask16(0x00ff).cswidth(16);
+}
+
void megasys1_state::kickoffb_sound_map(address_map &map)
{ // TODO: wrong, needs to be checked range for range
map(0x000000, 0x01ffff).rom();
- map(0x040000, 0x040001).r(m_soundlatch, FUNC(generic_latch_16_device::read));
- map(0x060000, 0x060001).w(m_soundlatch2, FUNC(generic_latch_16_device::write)); // to main cpu
+ map(0x040000, 0x040001).r(m_soundlatch[0], FUNC(generic_latch_16_device::read));
+ map(0x060000, 0x060001).w(m_soundlatch[1], FUNC(generic_latch_16_device::write)); // to main cpu
map(0x080000, 0x080003).rw("ymsnd", FUNC(ym2203_device::read), FUNC(ym2203_device::write)).umask16(0x00ff);
- map(0x0a0001, 0x0a0001).r(FUNC(megasys1_state::oki_status_1_r));
- map(0x0a0000, 0x0a0003).w(m_oki1, FUNC(okim6295_device::write)).umask16(0x00ff);
+ map(0x0a0001, 0x0a0001).r(FUNC(megasys1_state::oki_status_r<0>));
+ map(0x0a0000, 0x0a0003).w(m_oki[0], FUNC(okim6295_device::write)).umask16(0x00ff);
map(0x0e0000, 0x0fffff).ram();
}
@@ -544,13 +550,13 @@ void megasys1_state::kickoffb_sound_map(address_map &map)
void megasys1_state::megasys1B_sound_map(address_map &map)
{
map(0x000000, 0x01ffff).rom();
- map(0x040000, 0x040001).r(m_soundlatch, FUNC(generic_latch_16_device::read)).w(m_soundlatch2, FUNC(generic_latch_16_device::write)); /* from/to main cpu */
- map(0x060000, 0x060001).r(m_soundlatch, FUNC(generic_latch_16_device::read)).w(m_soundlatch2, FUNC(generic_latch_16_device::write)); /* from/to main cpu */
+ map(0x040000, 0x040001).r(m_soundlatch[0], FUNC(generic_latch_16_device::read)).w(m_soundlatch[1], FUNC(generic_latch_16_device::write)); /* from/to main cpu */
+ map(0x060000, 0x060001).r(m_soundlatch[0], FUNC(generic_latch_16_device::read)).w(m_soundlatch[1], FUNC(generic_latch_16_device::write)); /* from/to main cpu */
map(0x080000, 0x080003).rw("ymsnd", FUNC(ym2151_device::read), FUNC(ym2151_device::write)).umask16(0x00ff);
- map(0x0a0001, 0x0a0001).r(FUNC(megasys1_state::oki_status_1_r));
- map(0x0a0000, 0x0a0003).w(m_oki1, FUNC(okim6295_device::write)).umask16(0x00ff);
- map(0x0c0001, 0x0c0001).r(FUNC(megasys1_state::oki_status_2_r));
- map(0x0c0000, 0x0c0003).w(m_oki2, FUNC(okim6295_device::write)).umask16(0x00ff);
+ map(0x0a0001, 0x0a0001).r(FUNC(megasys1_state::oki_status_r<0>));
+ map(0x0a0000, 0x0a0003).w(m_oki[0], FUNC(okim6295_device::write)).umask16(0x00ff);
+ map(0x0c0001, 0x0c0001).r(FUNC(megasys1_state::oki_status_r<1>));
+ map(0x0c0000, 0x0c0003).w(m_oki[1], FUNC(okim6295_device::write)).umask16(0x00ff);
map(0x0e0000, 0x0effff).ram();
}
@@ -565,7 +571,7 @@ void megasys1_state::z80_sound_map(address_map &map)
{
map(0x0000, 0x3fff).rom();
map(0xc000, 0xc7ff).ram();
- map(0xe000, 0xe000).r(m_soundlatch_z, FUNC(generic_latch_8_device::read));
+ map(0xe000, 0xe000).lr8("soundlatch_r_z", [this](address_space &space, offs_t offset){ return m_soundlatch[0]->read(space, 0) & 0xff; });
map(0xf000, 0xf000).nopw(); /* ?? */
}
@@ -1617,7 +1623,7 @@ WRITE16_MEMBER(megasys1_state::protection_peekaboo_w)
COMBINE_DATA(&m_protection_val);
if ((m_protection_val & 0x90) == 0x90)
- membank("okibank")->set_entry(m_protection_val & 7);
+ m_okibank->set_entry(m_protection_val & 7);
m_maincpu->set_input_line(4, HOLD_LINE);
}
@@ -1705,7 +1711,7 @@ void megasys1_state::system_A(machine_config &config)
m_screen->set_video_attributes(VIDEO_ALWAYS_UPDATE);
GFXDECODE(config, m_gfxdecode, m_palette, gfx_abc);
- PALETTE(config, m_palette, FUNC(megasys1_state::megasys1_palette)).set_format(palette_device::RRRRGGGGBBBBRGBx, 1024);
+ PALETTE(config, m_palette, FUNC(megasys1_state::megasys1_palette)).set_format(palette_device::RRRRGGGGBBBBRGBx, 0x800/2);
MCFG_VIDEO_START_OVERRIDE(megasys1_state,megasys1)
MEGASYS1_TILEMAP(config, m_tmap[0], m_palette, 256*0);
@@ -1716,21 +1722,21 @@ void megasys1_state::system_A(machine_config &config)
SPEAKER(config, "lspeaker").front_left();
SPEAKER(config, "rspeaker").front_right();
- GENERIC_LATCH_16(config, m_soundlatch);
- GENERIC_LATCH_16(config, m_soundlatch2);
+ GENERIC_LATCH_16(config, m_soundlatch[0]);
+ GENERIC_LATCH_16(config, m_soundlatch[1]);
ym2151_device &ymsnd(YM2151(config, "ymsnd", SOUND_CPU_CLOCK/2)); /* 3.5MHz (7MHz / 2) verified */
ymsnd.irq_handler().set(FUNC(megasys1_state::sound_irq));
ymsnd.add_route(0, "lspeaker", 0.80);
ymsnd.add_route(1, "rspeaker", 0.80);
- OKIM6295(config, m_oki1, OKI4_SOUND_CLOCK, okim6295_device::PIN7_HIGH); /* 4MHz verified */
- m_oki1->add_route(ALL_OUTPUTS, "lspeaker", 0.30);
- m_oki1->add_route(ALL_OUTPUTS, "rspeaker", 0.30);
+ OKIM6295(config, m_oki[0], OKI4_SOUND_CLOCK, okim6295_device::PIN7_HIGH); /* 4MHz verified */
+ m_oki[0]->add_route(ALL_OUTPUTS, "lspeaker", 0.30);
+ m_oki[0]->add_route(ALL_OUTPUTS, "rspeaker", 0.30);
- OKIM6295(config, m_oki2, OKI4_SOUND_CLOCK, okim6295_device::PIN7_HIGH); /* 4MHz verified */
- m_oki2->add_route(ALL_OUTPUTS, "lspeaker", 0.30);
- m_oki2->add_route(ALL_OUTPUTS, "rspeaker", 0.30);
+ OKIM6295(config, m_oki[1], OKI4_SOUND_CLOCK, okim6295_device::PIN7_HIGH); /* 4MHz verified */
+ m_oki[1]->add_route(ALL_OUTPUTS, "lspeaker", 0.30);
+ m_oki[1]->add_route(ALL_OUTPUTS, "rspeaker", 0.30);
}
void megasys1_state::system_A_hachoo(machine_config &config)
@@ -1752,6 +1758,12 @@ void megasys1_state::system_A_soldam(machine_config &config)
m_tmap[1]->set_8x8_scroll_factor(4);
}
+void megasys1_state::system_A_jitsupro(machine_config &config)
+{
+ system_A(config);
+ m_audiocpu->set_addrmap(AS_PROGRAM, &megasys1_state::megasys1A_jitsupro_sound_map);
+}
+
void megasys1_state::kickoffb(machine_config &config)
{
system_A(config);
@@ -1806,7 +1818,7 @@ void megasys1_state::system_Bbl(machine_config &config)
m_screen->set_video_attributes(VIDEO_ALWAYS_UPDATE);
GFXDECODE(config, m_gfxdecode, m_palette, gfx_abc);
- PALETTE(config, m_palette, FUNC(megasys1_state::megasys1_palette)).set_format(palette_device::RRRRGGGGBBBBRGBx, 1024);
+ PALETTE(config, m_palette, FUNC(megasys1_state::megasys1_palette)).set_format(palette_device::RRRRGGGGBBBBRGBx, 0x800/2);
MCFG_VIDEO_START_OVERRIDE(megasys1_state,megasys1)
MEGASYS1_TILEMAP(config, m_tmap[0], m_palette, 256*0);
@@ -1818,9 +1830,9 @@ void megasys1_state::system_Bbl(machine_config &config)
SPEAKER(config, "rspeaker").front_right();
/* just the one OKI, used for sound and music */
- OKIM6295(config, m_oki1, OKI4_SOUND_CLOCK, okim6295_device::PIN7_HIGH);
- m_oki1->add_route(ALL_OUTPUTS, "lspeaker", 0.30);
- m_oki1->add_route(ALL_OUTPUTS, "rspeaker", 0.30);
+ OKIM6295(config, m_oki[0], OKI4_SOUND_CLOCK, okim6295_device::PIN7_HIGH);
+ m_oki[0]->add_route(ALL_OUTPUTS, "lspeaker", 0.30);
+ m_oki[0]->add_route(ALL_OUTPUTS, "rspeaker", 0.30);
}
void megasys1_state::system_B_hayaosi1(machine_config &config)
@@ -1829,13 +1841,13 @@ void megasys1_state::system_B_hayaosi1(machine_config &config)
/* basic machine hardware */
- OKIM6295(config.replace(), m_oki1, 2000000, okim6295_device::PIN7_HIGH); /* correct speed, but unknown OSC + divider combo */
- m_oki1->add_route(ALL_OUTPUTS, "lspeaker", 0.30);
- m_oki1->add_route(ALL_OUTPUTS, "rspeaker", 0.30);
+ OKIM6295(config.replace(), m_oki[0], 2000000, okim6295_device::PIN7_HIGH); /* correct speed, but unknown OSC + divider combo */
+ m_oki[0]->add_route(ALL_OUTPUTS, "lspeaker", 0.30);
+ m_oki[0]->add_route(ALL_OUTPUTS, "rspeaker", 0.30);
- OKIM6295(config.replace(), m_oki2, 2000000, okim6295_device::PIN7_HIGH); /* correct speed, but unknown OSC + divider combo */
- m_oki2->add_route(ALL_OUTPUTS, "lspeaker", 0.30);
- m_oki2->add_route(ALL_OUTPUTS, "rspeaker", 0.30);
+ OKIM6295(config.replace(), m_oki[1], 2000000, okim6295_device::PIN7_HIGH); /* correct speed, but unknown OSC + divider combo */
+ m_oki[1]->add_route(ALL_OUTPUTS, "lspeaker", 0.30);
+ m_oki[1]->add_route(ALL_OUTPUTS, "rspeaker", 0.30);
}
void megasys1_state::system_C(machine_config &config)
@@ -1882,7 +1894,7 @@ void megasys1_state::system_D(machine_config &config)
m_screen->set_palette(m_palette);
GFXDECODE(config, m_gfxdecode, m_palette, gfx_abc);
- PALETTE(config, m_palette, FUNC(megasys1_state::megasys1_palette)).set_format(palette_device::RGBx_555, 1024);
+ PALETTE(config, m_palette, FUNC(megasys1_state::megasys1_palette)).set_format(palette_device::RGBx_555, 0x800/2);
MCFG_VIDEO_START_OVERRIDE(megasys1_state,megasys1)
MEGASYS1_TILEMAP(config, m_tmap[0], m_palette, 256*0);
@@ -1891,9 +1903,9 @@ void megasys1_state::system_D(machine_config &config)
/* sound hardware */
SPEAKER(config, "mono").front_center();
- OKIM6295(config, m_oki1, SYS_D_CPU_CLOCK/4, okim6295_device::PIN7_HIGH); /* 2MHz (8MHz / 4) */
- m_oki1->set_addrmap(0, &megasys1_state::megasys1D_oki_map);
- m_oki1->add_route(ALL_OUTPUTS, "mono", 1.0);
+ OKIM6295(config, m_oki[0], SYS_D_CPU_CLOCK/4, okim6295_device::PIN7_HIGH); /* 2MHz (8MHz / 4) */
+ m_oki[0]->set_addrmap(0, &megasys1_state::megasys1D_oki_map);
+ m_oki[0]->add_route(ALL_OUTPUTS, "mono", 1.0);
}
@@ -1931,9 +1943,8 @@ void megasys1_state::system_Z(machine_config &config)
m_screen->set_palette(m_palette);
GFXDECODE(config, m_gfxdecode, m_palette, gfx_z);
- PALETTE(config, m_palette).set_format(palette_device::RRRRGGGGBBBBRGBx, 768);
-
- MCFG_VIDEO_START_OVERRIDE(megasys1_state,megasys1)
+ PALETTE(config, m_palette).set_format(palette_device::RRRRGGGGBBBBRGBx, 0x800/2);
+ MCFG_VIDEO_START_OVERRIDE(megasys1_state,megasys1_z)
MEGASYS1_TILEMAP(config, m_tmap[0], m_palette, 256*0);
MEGASYS1_TILEMAP(config, m_tmap[1], m_palette, 256*2);
@@ -1941,7 +1952,7 @@ void megasys1_state::system_Z(machine_config &config)
/* sound hardware */
SPEAKER(config, "mono").front_center();
- GENERIC_LATCH_8(config, m_soundlatch_z);
+ GENERIC_LATCH_16(config, m_soundlatch[0]);
ym2203_device &ymsnd(YM2203(config, "ymsnd", 1500000));
ymsnd.irq_handler().set_inputline(m_audiocpu, 0);
@@ -4366,8 +4377,8 @@ ROM_END
void megasys1_state::rodland_gfx_unmangle(const char *region)
{
- uint8_t *rom = memregion(region)->base();
- uint32_t size = memregion(region)->bytes();
+ u8 *rom = memregion(region)->base();
+ u32 size = memregion(region)->bytes();
int i;
/* data lines swap: 76543210 -> 64537210 */
@@ -4377,7 +4388,7 @@ void megasys1_state::rodland_gfx_unmangle(const char *region)
| ((rom[i] & 0x48) << 1)
| ((rom[i] & 0x10) << 2);
- std::vector<uint8_t> buffer(size);
+ std::vector<u8> buffer(size);
memcpy(&buffer[0],rom,size);
@@ -4395,15 +4406,15 @@ void megasys1_state::rodland_gfx_unmangle(const char *region)
void megasys1_state::jitsupro_gfx_unmangle(const char *region)
{
- uint8_t *rom = memregion(region)->base();
- uint32_t size = memregion(region)->bytes();
+ u8 *rom = memregion(region)->base();
+ u32 size = memregion(region)->bytes();
int i;
/* data lines swap: 76543210 -> 43576210 */
for (i = 0;i < size;i++)
rom[i] = bitswap<8>(rom[i],0x4,0x3,0x5,0x7,0x6,0x2,0x1,0x0);
- std::vector<uint8_t> buffer(size);
+ std::vector<u8> buffer(size);
memcpy(&buffer[0],rom,size);
@@ -4419,15 +4430,15 @@ void megasys1_state::jitsupro_gfx_unmangle(const char *region)
void megasys1_state::stdragona_gfx_unmangle(const char *region)
{
- uint8_t *rom = memregion(region)->base();
- uint32_t size = memregion(region)->bytes();
+ u8 *rom = memregion(region)->base();
+ u32 size = memregion(region)->bytes();
int i;
/* data lines swap: 76543210 -> 37564210 */
for (i = 0;i < size;i++)
rom[i] = bitswap<8>(rom[i],3,7,5,6,4,2,1,0);
- std::vector<uint8_t> buffer(size);
+ std::vector<u8> buffer(size);
memcpy(&buffer[0],rom,size);
@@ -4465,7 +4476,7 @@ void megasys1_state::stdragona_gfx_unmangle(const char *region)
void megasys1_state::init_64street()
{
-// uint16_t *ROM = (uint16_t *) memregion("maincpu")->base();
+// u16 *ROM = (u16 *) memregion("maincpu")->base();
// ROM[0x006b8/2] = 0x6004; // d8001 test
// ROM[0x10EDE/2] = 0x6012; // watchdog
@@ -4679,16 +4690,6 @@ void megasys1_state::init_iganinju()
save_item(NAME(m_mcu_hs_ram));
}
-// jitsupro writes oki commands to both the lsb and msb; it works because of byte smearing
-WRITE16_MEMBER(megasys1_state::okim6295_both_1_w)
-{
- m_oki1->write_command(data & 0xff);
-}
-WRITE16_MEMBER(megasys1_state::okim6295_both_2_w)
-{
- m_oki2->write_command(data & 0xff);
-}
-
void megasys1_state::init_jitsupro()
{
astyanax_rom_decode(machine(), "maincpu"); // Code
@@ -4698,9 +4699,6 @@ void megasys1_state::init_jitsupro()
m_maincpu->space(AS_PROGRAM).install_read_handler(0x00000, 0x3ffff, read16_delegate(FUNC(megasys1_state::megasys1A_mcu_hs_r),this));
m_maincpu->space(AS_PROGRAM).install_write_handler(0x20000, 0x20009, write16_delegate(FUNC(megasys1_state::megasys1A_mcu_hs_w),this));
- m_audiocpu->space(AS_PROGRAM).install_write_handler(0xa0000, 0xa0003, write16_delegate(FUNC(megasys1_state::okim6295_both_1_w),this));
- m_audiocpu->space(AS_PROGRAM).install_write_handler(0xc0000, 0xc0003, write16_delegate(FUNC(megasys1_state::okim6295_both_2_w),this));
-
m_mcu_hs = 0;
memset(m_mcu_hs_ram, 0, sizeof(m_mcu_hs_ram));
@@ -4710,11 +4708,10 @@ void megasys1_state::init_jitsupro()
void megasys1_state::init_peekaboo()
{
- uint8_t *ROM = memregion("oki1")->base();
- memory_bank *okibank = membank("okibank");
+ u8 *ROM = memregion("oki1")->base();
- okibank->configure_entry(7, &ROM[0x20000]);
- okibank->configure_entries(0, 7, &ROM[0x20000], 0x20000);
+ m_okibank->configure_entry(7, &ROM[0x20000]);
+ m_okibank->configure_entries(0, 7, &ROM[0x20000], 0x20000);
m_maincpu->space(AS_PROGRAM).install_readwrite_handler(0x100000, 0x100001, read16_delegate(FUNC(megasys1_state::protection_peekaboo_r),this), write16_delegate(FUNC(megasys1_state::protection_peekaboo_w),this));
@@ -4848,7 +4845,7 @@ void megasys1_state::init_monkelf()
m_rom_maincpu[0x00744/2] = 0x4e71; // weird check, 0xe000e R is a port-based trap?
// convert bootleg priority format to standard
- uint8_t *ROM = memregion("proms")->base();
+ u8 *ROM = memregion("proms")->base();
for (int i = 0x1fe; i >= 0; i -= 2)
{
ROM[i+0] = ROM[i+1] = (ROM[i/2] >> 4) & 0x0f;
@@ -4881,7 +4878,7 @@ GAME( 1988, iganinjub,kazan, system_A_iganinju, kazan, megasys1_state, emp
GAME( 1989, astyanax, 0, system_A, astyanax, megasys1_state, init_astyanax, ROT0, "Jaleco", "The Astyanax", MACHINE_SUPPORTS_SAVE )
GAME( 1989, lordofk, astyanax, system_A, astyanax, megasys1_state, init_astyanax, ROT0, "Jaleco", "The Lord of King (Japan)", MACHINE_SUPPORTS_SAVE )
GAME( 1989, hachoo, 0, system_A_hachoo, hachoo, megasys1_state, init_astyanax, ROT0, "Jaleco", "Hachoo!", MACHINE_SUPPORTS_SAVE )
-GAME( 1989, jitsupro, 0, system_A, jitsupro, megasys1_state, init_jitsupro, ROT0, "Jaleco", "Jitsuryoku!! Pro Yakyuu (Japan)", MACHINE_SUPPORTS_SAVE )
+GAME( 1989, jitsupro, 0, system_A_jitsupro, jitsupro, megasys1_state, init_jitsupro, ROT0, "Jaleco", "Jitsuryoku!! Pro Yakyuu (Japan)", MACHINE_SUPPORTS_SAVE )
GAME( 1989, plusalph, 0, system_A, plusalph, megasys1_state, init_astyanax, ROT270, "Jaleco", "Plus Alpha", MACHINE_SUPPORTS_SAVE )
GAME( 1989, stdragon, 0, system_A, stdragon, megasys1_state, init_stdragon, ROT0, "Jaleco", "Saint Dragon (set 1)", MACHINE_SUPPORTS_SAVE )
GAME( 1989, stdragona,stdragon, system_A, stdragon, megasys1_state, init_stdragona,ROT0, "Jaleco", "Saint Dragon (set 2)", MACHINE_SUPPORTS_SAVE )
diff --git a/src/mame/drivers/megatech.cpp b/src/mame/drivers/megatech.cpp
index fb671437177..11731195cb8 100644
--- a/src/mame/drivers/megatech.cpp
+++ b/src/mame/drivers/megatech.cpp
@@ -78,7 +78,6 @@ Sonic Hedgehog 2 171-6215A 837-6963-62 610-0239-62 MPR
#include "emu.h"
#include "cpu/z80/z80.h"
#include "machine/cxd1095.h"
-#include "sound/sn76496.h"
#include "rendlay.h"
#include "includes/megadriv.h"
@@ -134,8 +133,7 @@ private:
DECLARE_READ8_MEMBER(bios_joypad_r);
DECLARE_WRITE8_MEMBER(bios_port_7f_w);
DECLARE_READ8_MEMBER(vdp1_count_r);
- DECLARE_READ8_MEMBER(sms_count_r);
- DECLARE_WRITE8_MEMBER(sms_sn_w);
+ u8 sms_count_r(offs_t offset);
DECLARE_READ8_MEMBER(sms_ioport_dc_r);
DECLARE_READ8_MEMBER(sms_ioport_dd_r);
DECLARE_WRITE8_MEMBER(mt_sms_standard_rom_bank_w);
@@ -161,7 +159,7 @@ private:
uint8_t m_mt_cart_select_reg;
uint32_t m_bios_port_ctrl;
- int m_current_MACHINE_IS_sms; // is the current game SMS based (running on genesis z80, in VDP compatibility mode)
+ int m_current_machine_is_sms; // is the current game SMS based (running on genesis z80, in VDP compatibility mode)
uint32_t m_bios_ctrl_inputs;
uint8_t m_bios_ctrl[6];
int m_mt_bank_addr;
@@ -322,19 +320,12 @@ INPUT_PORTS_END
/* MEGATECH specific */
-READ8_MEMBER(mtech_state::sms_count_r)
+u8 mtech_state::sms_count_r(offs_t offset)
{
- address_space &prg = m_z80snd->space(AS_PROGRAM);
if (offset & 0x01)
- return m_vdp->hcount_read(prg, offset);
+ return m_vdp->hcount_read();
else
- return m_vdp->vcount_read(prg, offset);
-}
-
-WRITE8_MEMBER(mtech_state::sms_sn_w)
-{
- address_space &prg = m_z80snd->space(AS_PROGRAM);
- m_vdp->vdp_w(prg, 0x10 >> 1, data, 0x00ff);
+ return m_vdp->vcount_read();
}
READ8_MEMBER (mtech_state::sms_ioport_dc_r)
@@ -398,10 +389,10 @@ void mtech_state::set_genz80_as_sms()
prg.install_write_handler(0xfffc, 0xffff, write8_delegate(FUNC(mtech_state::mt_sms_standard_rom_bank_w),this));
// ports
- io.install_read_handler (0x40, 0x41, 0, 0x3e, 0, read8_delegate(FUNC(mtech_state::sms_count_r),this));
- io.install_write_handler (0x40, 0x41, 0, 0x3e, 0, write8_delegate(FUNC(mtech_state::sms_sn_w),this));
- io.install_readwrite_handler (0x80, 0x80, 0, 0x3e, 0, read8_delegate(FUNC(sega315_5124_device::data_read),(sega315_5124_device *)m_vdp), write8_delegate(FUNC(sega315_5124_device::data_write),(sega315_5124_device *)m_vdp));
- io.install_readwrite_handler (0x81, 0x81, 0, 0x3e, 0, read8_delegate(FUNC(sega315_5124_device::control_read),(sega315_5124_device *)m_vdp), write8_delegate(FUNC(sega315_5124_device::control_write),(sega315_5124_device *)m_vdp));
+ io.install_read_handler (0x40, 0x41, 0, 0x3e, 0, read8sm_delegate(FUNC(mtech_state::sms_count_r),this));
+ io.install_write_handler (0x40, 0x41, 0, 0x3e, 0, write8smo_delegate(FUNC(sega315_5124_device::psg_w),(sega315_5124_device *)m_vdp));
+ io.install_readwrite_handler (0x80, 0x80, 0, 0x3e, 0, read8smo_delegate(FUNC(sega315_5124_device::data_read),(sega315_5124_device *)m_vdp), write8smo_delegate(FUNC(sega315_5124_device::data_write),(sega315_5124_device *)m_vdp));
+ io.install_readwrite_handler (0x81, 0x81, 0, 0x3e, 0, read8smo_delegate(FUNC(sega315_5124_device::control_read),(sega315_5124_device *)m_vdp), write8smo_delegate(FUNC(sega315_5124_device::control_write),(sega315_5124_device *)m_vdp));
io.install_read_handler (0x10, 0x10, read8_delegate(FUNC(mtech_state::sms_ioport_dd_r),this)); // super tetris
@@ -422,7 +413,7 @@ void mtech_state::set_genz80_as_md()
prg.install_ram(0x0000, 0x1fff, m_genz80.z80_prgram.get());
- prg.install_readwrite_handler(0x4000, 0x4003, read8_delegate(FUNC(ym2612_device::read), (ym2612_device *)m_ymsnd), write8_delegate(FUNC(ym2612_device::write), (ym2612_device *)m_ymsnd));
+ prg.install_readwrite_handler(0x4000, 0x4003, read8sm_delegate(FUNC(ym2612_device::read), (ym2612_device *)m_ymsnd), write8sm_delegate(FUNC(ym2612_device::write), (ym2612_device *)m_ymsnd));
prg.install_write_handler (0x6000, 0x6000, write8_delegate(FUNC(mtech_state::megadriv_z80_z80_bank_w),this));
prg.install_write_handler (0x6001, 0x6001, write8_delegate(FUNC(mtech_state::megadriv_z80_z80_bank_w),this));
prg.install_read_handler (0x6100, 0x7eff, read8_delegate(FUNC(mtech_state::megadriv_z80_unmapped_read),this));
@@ -452,7 +443,7 @@ void mtech_state::switch_cart(int gameno)
if (!m_cart_is_genesis[gameno])
{
logerror("enabling SMS Z80\n");
- m_current_MACHINE_IS_sms = 1;
+ m_current_machine_is_sms = 1;
set_genz80_as_sms();
//m_z80snd->set_input_line(INPUT_LINE_HALT, CLEAR_LINE);
m_z80snd->set_input_line(INPUT_LINE_RESET, CLEAR_LINE);
@@ -460,7 +451,7 @@ void mtech_state::switch_cart(int gameno)
else
{
logerror("disabling SMS Z80\n");
- m_current_MACHINE_IS_sms = 0;
+ m_current_machine_is_sms = 0;
set_genz80_as_md();
m_maincpu->set_input_line(INPUT_LINE_RESET, CLEAR_LINE);
//m_maincpu->set_input_line(INPUT_LINE_HALT, CLEAR_LINE);
@@ -586,18 +577,17 @@ WRITE8_MEMBER(mtech_state::bios_port_7f_w)
READ8_MEMBER(mtech_state::vdp1_count_r)
{
- address_space &prg = m_bioscpu->space(AS_PROGRAM);
if (offset & 0x01)
- return m_vdp1->hcount_read(prg, offset);
+ return m_vdp1->hcount_read();
else
- return m_vdp1->vcount_read(prg, offset);
+ return m_vdp1->vcount_read();
}
void mtech_state::megatech_bios_portmap(address_map &map)
{
map.global_mask(0xff);
map(0x3f, 0x3f).w(FUNC(mtech_state::bios_port_ctrl_w));
- map(0x7f, 0x7f).w(FUNC(mtech_state::bios_port_7f_w));
+ map(0x7f, 0x7f).w(FUNC(mtech_state::bios_port_7f_w)); // PSG?
map(0x40, 0x41).mirror(0x3e).r(FUNC(mtech_state::vdp1_count_r));
map(0x80, 0x80).mirror(0x3e).rw(m_vdp1, FUNC(sega315_5124_device::data_read), FUNC(sega315_5124_device::data_write));
@@ -630,7 +620,7 @@ void mtech_state::init_mt_crt()
uint32_t mtech_state::screen_update_main(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect)
{
// if we're running an sms game then use the SMS update.. maybe this should be moved to the megadrive emulation core as compatibility mode is a feature of the chip
- if (!m_current_MACHINE_IS_sms)
+ if (!m_current_machine_is_sms)
screen_update_megadriv(screen, bitmap, cliprect);
else
{
@@ -652,7 +642,7 @@ uint32_t mtech_state::screen_update_main(screen_device &screen, bitmap_rgb32 &bi
WRITE_LINE_MEMBER(mtech_state::screen_vblank_main)
{
- if (!m_current_MACHINE_IS_sms)
+ if (!m_current_machine_is_sms)
screen_vblank_megadriv(state);
}
@@ -691,14 +681,15 @@ uint32_t mtech_state::screen_update_menu(screen_device &screen, bitmap_rgb32 &bi
}
-MACHINE_CONFIG_START(mtech_state::megatech)
+void mtech_state::megatech(machine_config &config)
+{
/* basic machine hardware */
md_ntsc(config);
/* Megatech has an extra SMS based bios *and* an additional screen */
- MCFG_DEVICE_ADD("mtbios", Z80, MASTER_CLOCK / 15) /* ?? */
- MCFG_DEVICE_PROGRAM_MAP(megatech_bios_map)
- MCFG_DEVICE_IO_MAP(megatech_bios_portmap)
+ Z80(config, m_bioscpu, MASTER_CLOCK / 15); /* ?? */
+ m_bioscpu->set_addrmap(AS_PROGRAM, &mtech_state::megatech_bios_map);
+ m_bioscpu->set_addrmap(AS_IO, &mtech_state::megatech_bios_portmap);
cxd1095_device &io1(CXD1095(config, "io1", 0));
io1.in_porta_cb().set_ioport("BIOS_DSW0");
@@ -717,33 +708,29 @@ MACHINE_CONFIG_START(mtech_state::megatech)
config.set_default_layout(layout_dualhovu);
- MCFG_SCREEN_MODIFY("megadriv")
- MCFG_SCREEN_RAW_PARAMS(XTAL(10'738'635)/2, \
+ screen_device &screen(*subdevice<screen_device>("megadriv"));
+ screen.set_raw(XTAL(10'738'635)/2, \
sega315_5124_device::WIDTH , sega315_5124_device::LBORDER_START + sega315_5124_device::LBORDER_WIDTH, sega315_5124_device::LBORDER_START + sega315_5124_device::LBORDER_WIDTH + 256, \
- sega315_5124_device::HEIGHT_NTSC, sega315_5124_device::TBORDER_START + sega315_5124_device::NTSC_224_TBORDER_HEIGHT, sega315_5124_device::TBORDER_START + sega315_5124_device::NTSC_224_TBORDER_HEIGHT + 224)
- MCFG_SCREEN_UPDATE_DRIVER(mtech_state, screen_update_main)
- MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE(*this, mtech_state, screen_vblank_main))
+ sega315_5124_device::HEIGHT_NTSC, sega315_5124_device::TBORDER_START + sega315_5124_device::NTSC_224_TBORDER_HEIGHT, sega315_5124_device::TBORDER_START + sega315_5124_device::NTSC_224_TBORDER_HEIGHT + 224);
+ screen.set_screen_update(FUNC(mtech_state::screen_update_main));
+ screen.screen_vblank().set(FUNC(mtech_state::screen_vblank_main));
- MCFG_DEVICE_MODIFY("gen_vdp")
- MCFG_SEGA315_5313_INT_CB(INPUTLINE("genesis_snd_z80", 0))
+ m_vdp->irq().set_inputline(m_z80snd, 0);
- MCFG_SCREEN_ADD("menu", RASTER)
+ screen_device &menu(SCREEN(config, "menu", SCREEN_TYPE_RASTER));
// check frq
- MCFG_SCREEN_RAW_PARAMS(XTAL(10'738'635)/2, \
+ menu.set_raw(XTAL(10'738'635)/2, \
sega315_5124_device::WIDTH , sega315_5124_device::LBORDER_START + sega315_5124_device::LBORDER_WIDTH, sega315_5124_device::LBORDER_START + sega315_5124_device::LBORDER_WIDTH + 256, \
- sega315_5124_device::HEIGHT_NTSC, sega315_5124_device::TBORDER_START + sega315_5124_device::NTSC_224_TBORDER_HEIGHT, sega315_5124_device::TBORDER_START + sega315_5124_device::NTSC_224_TBORDER_HEIGHT + 224)
- MCFG_SCREEN_UPDATE_DRIVER(mtech_state, screen_update_menu)
-
- MCFG_DEVICE_ADD("vdp1", SEGA315_5246, 0)
- MCFG_SEGA315_5246_SET_SCREEN("menu")
- MCFG_SEGA315_5246_IS_PAL(false)
- MCFG_SEGA315_5246_INT_CB(INPUTLINE("mtbios", 0))
-
- /* sound hardware */
- MCFG_DEVICE_ADD("sn2", SN76496, MASTER_CLOCK/15)
- MCFG_SOUND_ROUTE(0, "lspeaker", 0.50)
- MCFG_SOUND_ROUTE(1, "rspeaker", 0.50)
-MACHINE_CONFIG_END
+ sega315_5124_device::HEIGHT_NTSC, sega315_5124_device::TBORDER_START + sega315_5124_device::NTSC_224_TBORDER_HEIGHT, sega315_5124_device::TBORDER_START + sega315_5124_device::NTSC_224_TBORDER_HEIGHT + 224);
+ menu.set_screen_update(FUNC(mtech_state::screen_update_menu));
+
+ SEGA315_5246(config, m_vdp1, MASTER_CLOCK / 5); /* ?? */
+ m_vdp1->set_screen("menu");
+ m_vdp1->set_is_pal(false);
+ m_vdp1->irq().set_inputline(m_bioscpu, 0);
+ m_vdp1->add_route(ALL_OUTPUTS, "lspeaker", 0.25);
+ m_vdp1->add_route(ALL_OUTPUTS, "rspeaker", 0.25);
+}
image_init_result mtech_state::load_cart(device_image_interface &image, generic_slot_device *slot, int gameno)
@@ -797,7 +784,7 @@ MACHINE_CONFIG_START(mtech_state::megatech_multislot)
MCFG_MEGATECH_CARTSLOT_ADD("mt_slot7", mt_cart7)
MCFG_MEGATECH_CARTSLOT_ADD("mt_slot8", mt_cart8)
- MCFG_SOFTWARE_LIST_ADD("cart_list","megatech")
+ SOFTWARE_LIST(config, "cart_list").set_original("megatech");
MACHINE_CONFIG_END
diff --git a/src/mame/drivers/megazone.cpp b/src/mame/drivers/megazone.cpp
index 5c477f1cf9d..52548698b5e 100644
--- a/src/mame/drivers/megazone.cpp
+++ b/src/mame/drivers/megazone.cpp
@@ -293,15 +293,15 @@ WRITE_LINE_MEMBER(megazone_state::vblank_irq)
}
-MACHINE_CONFIG_START(megazone_state::megazone)
-
+void megazone_state::megazone(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", KONAMI1, XTAL(18'432'000)/9) /* 2.048 MHz */
- MCFG_DEVICE_PROGRAM_MAP(megazone_map)
+ KONAMI1(config, m_maincpu, XTAL(18'432'000)/9); /* 2.048 MHz */
+ m_maincpu->set_addrmap(AS_PROGRAM, &megazone_state::megazone_map);
- MCFG_DEVICE_ADD("audiocpu", Z80, XTAL(18'432'000)/6) /* Z80 Clock is derived from the H1 signal */
- MCFG_DEVICE_PROGRAM_MAP(megazone_sound_map)
- MCFG_DEVICE_IO_MAP(megazone_sound_io_map)
+ Z80(config, m_audiocpu, XTAL(18'432'000)/6); /* Z80 Clock is derived from the H1 signal */
+ m_audiocpu->set_addrmap(AS_PROGRAM, &megazone_state::megazone_sound_map);
+ m_audiocpu->set_addrmap(AS_IO, &megazone_state::megazone_sound_io_map);
I8039(config, m_daccpu, XTAL(14'318'181)/2); /* 7.15909MHz */
m_daccpu->set_addrmap(AS_PROGRAM, &megazone_state::megazone_i8039_map);
@@ -309,7 +309,7 @@ MACHINE_CONFIG_START(megazone_state::megazone)
m_daccpu->p1_out_cb().set("dac", FUNC(dac_byte_interface::data_w));
m_daccpu->p2_out_cb().set(FUNC(megazone_state::i8039_irqen_and_status_w));
- MCFG_QUANTUM_TIME(attotime::from_hz(900))
+ config.m_minimum_quantum = attotime::from_hz(900);
ls259_device &mainlatch(LS259(config, "mainlatch")); // 13A
mainlatch.q_out_cb<0>().set(FUNC(megazone_state::coin_counter_2_w));
@@ -320,14 +320,14 @@ MACHINE_CONFIG_START(megazone_state::megazone)
WATCHDOG_TIMER(config, "watchdog");
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(36*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 36*8-1, 2*8, 30*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(megazone_state, screen_update_megazone)
- MCFG_SCREEN_PALETTE(m_palette)
- MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE(*this, megazone_state, vblank_irq))
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(36*8, 32*8);
+ screen.set_visarea(0*8, 36*8-1, 2*8, 30*8-1);
+ screen.set_screen_update(FUNC(megazone_state::screen_update_megazone));
+ screen.set_palette(m_palette);
+ screen.screen_vblank().set(FUNC(megazone_state::vblank_irq));
GFXDECODE(config, m_gfxdecode, m_palette, gfx_megazone);
PALETTE(config, m_palette, FUNC(megazone_state::megazone_palette), 16*16+16*16, 32);
@@ -344,17 +344,15 @@ MACHINE_CONFIG_START(megazone_state::megazone)
aysnd.add_route(1, "filter.0.1", 0.30);
aysnd.add_route(2, "filter.0.2", 0.30);
- MCFG_DEVICE_ADD("dac", DAC_8BIT_R2R, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 0.25) // unknown DAC
- MCFG_DEVICE_ADD("vref", VOLTAGE_REGULATOR, 0) MCFG_VOLTAGE_REGULATOR_OUTPUT(5.0)
- MCFG_SOUND_ROUTE(0, "dac", 1.0, DAC_VREF_POS_INPUT) MCFG_SOUND_ROUTE(0, "dac", -1.0, DAC_VREF_NEG_INPUT)
-
- MCFG_DEVICE_ADD("filter.0.0", FILTER_RC)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 1.0)
- MCFG_DEVICE_ADD("filter.0.1", FILTER_RC)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 1.0)
- MCFG_DEVICE_ADD("filter.0.2", FILTER_RC)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 1.0)
-MACHINE_CONFIG_END
+ DAC_8BIT_R2R(config, "dac", 0).add_route(ALL_OUTPUTS, "speaker", 0.25); // unknown DAC
+ voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref"));
+ vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT);
+ vref.add_route(0, "dac", -1.0, DAC_VREF_NEG_INPUT);
+
+ FILTER_RC(config, m_filter[0]).add_route(ALL_OUTPUTS, "speaker", 1.0);
+ FILTER_RC(config, m_filter[1]).add_route(ALL_OUTPUTS, "speaker", 1.0);
+ FILTER_RC(config, m_filter[2]).add_route(ALL_OUTPUTS, "speaker", 1.0);
+}
diff --git a/src/mame/drivers/meijinsn.cpp b/src/mame/drivers/meijinsn.cpp
index 9cc06506945..044f9e47e00 100644
--- a/src/mame/drivers/meijinsn.cpp
+++ b/src/mame/drivers/meijinsn.cpp
@@ -288,18 +288,18 @@ void meijinsn_state::meijinsn_palette(palette_device &palette) const
bit0 = BIT(color_prom[i], 0);
bit1 = BIT(color_prom[i], 1);
bit2 = BIT(color_prom[i], 2);
- int const r = combine_3_weights(weights_r, bit0, bit1, bit2);
+ int const r = combine_weights(weights_r, bit0, bit1, bit2);
/* green component */
bit0 = BIT(color_prom[i], 3);
bit1 = BIT(color_prom[i], 4);
bit2 = BIT(color_prom[i], 5);
- int const g = combine_3_weights(weights_g, bit0, bit1, bit2);
+ int const g = combine_weights(weights_g, bit0, bit1, bit2);
/* blue component */
bit0 = BIT(color_prom[i], 6);
bit1 = BIT(color_prom[i], 7);
- int const b = combine_2_weights(weights_b, bit0, bit1);
+ int const b = combine_weights(weights_b, bit0, bit1);
palette.set_pen_color(i, rgb_t(r, g, b));
}
@@ -357,27 +357,27 @@ void meijinsn_state::machine_reset()
}
-MACHINE_CONFIG_START(meijinsn_state::meijinsn)
-
+void meijinsn_state::meijinsn(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M68000, 9000000 )
- MCFG_DEVICE_PROGRAM_MAP(meijinsn_map)
- MCFG_TIMER_DRIVER_ADD_SCANLINE("scantimer", meijinsn_state, meijinsn_interrupt, "screen", 0, 1)
+ M68000(config, m_maincpu, 9000000);
+ m_maincpu->set_addrmap(AS_PROGRAM, &meijinsn_state::meijinsn_map);
+ TIMER(config, "scantimer").configure_scanline(FUNC(meijinsn_state::meijinsn_interrupt), "screen", 0, 1);
- MCFG_DEVICE_ADD("audiocpu", Z80, 4000000)
- MCFG_DEVICE_PROGRAM_MAP(meijinsn_sound_map)
- MCFG_DEVICE_IO_MAP(meijinsn_sound_io_map)
- MCFG_DEVICE_PERIODIC_INT_DRIVER(meijinsn_state, irq0_line_hold, 160*60)
+ z80_device &audiocpu(Z80(config, "audiocpu", 4000000));
+ audiocpu.set_addrmap(AS_PROGRAM, &meijinsn_state::meijinsn_sound_map);
+ audiocpu.set_addrmap(AS_IO, &meijinsn_state::meijinsn_sound_io_map);
+ audiocpu.set_periodic_int(FUNC(meijinsn_state::irq0_line_hold), attotime::from_hz(160*60));
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(32*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(12, 243, 2*8, 30*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(meijinsn_state, screen_update_meijinsn)
- MCFG_SCREEN_PALETTE("palette")
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(32*8, 32*8);
+ screen.set_visarea(12, 243, 2*8, 30*8-1);
+ screen.set_screen_update(FUNC(meijinsn_state::screen_update_meijinsn));
+ screen.set_palette("palette");
PALETTE(config, "palette", FUNC(meijinsn_state::meijinsn_palette), 32);
@@ -389,7 +389,7 @@ MACHINE_CONFIG_START(meijinsn_state::meijinsn)
ay8910_device &aysnd(AY8910(config, "aysnd", 2000000));
aysnd.port_a_read_callback().set(m_soundlatch, FUNC(generic_latch_8_device::read));
aysnd.add_route(ALL_OUTPUTS, "mono", 0.75);
-MACHINE_CONFIG_END
+}
ROM_START( meijinsn )
diff --git a/src/mame/drivers/mekd2.cpp b/src/mame/drivers/mekd2.cpp
index e0bd9db2663..d77e9ff93fc 100644
--- a/src/mame/drivers/mekd2.cpp
+++ b/src/mame/drivers/mekd2.cpp
@@ -375,10 +375,11 @@ void mekd2_state::machine_start()
************************************************************/
-MACHINE_CONFIG_START(mekd2_state::mekd2)
+void mekd2_state::mekd2(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M6800, XTAL_MEKD2 / 2) /* 614.4 kHz */
- MCFG_DEVICE_PROGRAM_MAP(mekd2_mem)
+ M6800(config, m_maincpu, XTAL_MEKD2 / 2); /* 614.4 kHz */
+ m_maincpu->set_addrmap(AS_PROGRAM, &mekd2_state::mekd2_mem);
config.set_default_layout(layout_mekd2);
@@ -386,7 +387,7 @@ MACHINE_CONFIG_START(mekd2_state::mekd2)
SPEAKER(config, "mono").front_center();
WAVE(config, "wave", "cassette").add_route(ALL_OUTPUTS, "mono", 0.25);
- MCFG_CASSETTE_ADD("cassette")
+ CASSETTE(config, m_cass);
/* Devices */
PIA6821(config, m_pia_s, 0);
@@ -405,17 +406,17 @@ MACHINE_CONFIG_START(mekd2_state::mekd2)
ACIA6850(config, m_acia, 0);
m_acia->txd_handler().set(FUNC(mekd2_state::cass_w));
- MCFG_DEVICE_ADD("acia_tx_clock", CLOCK, XTAL_MEKD2 / 256) // 4800Hz
- MCFG_CLOCK_SIGNAL_HANDLER(WRITELINE("acia", acia6850_device, write_txc))
+ clock_device &acia_tx_clock(CLOCK(config, "acia_tx_clock", XTAL_MEKD2 / 256)); // 4800Hz
+ acia_tx_clock.signal_handler().set(m_acia, FUNC(acia6850_device::write_txc));
- MCFG_DEVICE_ADD("acia_rx_clock", CLOCK, 300) // toggled by cassette circuit
- MCFG_CLOCK_SIGNAL_HANDLER(WRITELINE("acia", acia6850_device, write_rxc))
+ clock_device &acia_rx_clock(CLOCK(config, "acia_rx_clock", 300)); // toggled by cassette circuit
+ acia_rx_clock.signal_handler().set(m_acia, FUNC(acia6850_device::write_rxc));
- MCFG_TIMER_DRIVER_ADD_PERIODIC("mekd2_c", mekd2_state, mekd2_c, attotime::from_hz(4800))
- MCFG_TIMER_DRIVER_ADD_PERIODIC("mekd2_p", mekd2_state, mekd2_p, attotime::from_hz(40000))
+ TIMER(config, "mekd2_c").configure_periodic(FUNC(mekd2_state::mekd2_c), attotime::from_hz(4800));
+ TIMER(config, "mekd2_p").configure_periodic(FUNC(mekd2_state::mekd2_p), attotime::from_hz(40000));
- MCFG_QUICKLOAD_ADD("quickload", mekd2_state, mekd2_quik, "d2", 1)
-MACHINE_CONFIG_END
+ QUICKLOAD(config, "quickload").set_handler(snapquick_load_delegate(&QUICKLOAD_LOAD_NAME(mekd2_state, mekd2_quik), this), "d2", attotime::from_seconds(1));
+}
/***********************************************************
diff --git a/src/mame/drivers/mephisto.cpp b/src/mame/drivers/mephisto.cpp
index 21191fce122..d1c142e3194 100644
--- a/src/mame/drivers/mephisto.cpp
+++ b/src/mame/drivers/mephisto.cpp
@@ -233,7 +233,6 @@ static INPUT_PORTS_START( mephisto )
PORT_BIT(0x080, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("C 3") PORT_CODE(KEYCODE_C) PORT_CODE(KEYCODE_3)
PORT_START("KEY2_7") //Port $2c0f
PORT_BIT(0x080, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("D 4") PORT_CODE(KEYCODE_D) PORT_CODE(KEYCODE_4)
-
INPUT_PORTS_END
@@ -244,20 +243,16 @@ TIMER_DEVICE_CALLBACK_MEMBER(mephisto_state::update_nmi)
m_allowNMI = 0;
m_maincpu->pulse_input_line(INPUT_LINE_NMI, attotime::zero);
}
- m_beep->set_state(m_outlatch->q6_r() ? 1 : 0);
}
TIMER_DEVICE_CALLBACK_MEMBER(mephisto_state::update_nmi_r5)
{
m_maincpu->pulse_input_line(INPUT_LINE_NMI, attotime::zero);
- m_beep->set_state(m_outlatch->q6_r() ? 1 : 0);
}
TIMER_DEVICE_CALLBACK_MEMBER(mephisto_state::update_irq)//only mm2
{
m_maincpu->set_input_line(M65C02_IRQ_LINE, HOLD_LINE);
-
- m_beep->set_state(m_outlatch->q6_r() ? 1 : 0);
}
void mephisto_state::machine_start()
@@ -299,11 +294,11 @@ void mephisto_state::machine_reset()
}
-MACHINE_CONFIG_START(mephisto_state::mephisto)
+void mephisto_state::mephisto(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu",M65C02,4915200) /* 65C02 */
- MCFG_DEVICE_PROGRAM_MAP(mephisto_mem)
- MCFG_QUANTUM_TIME(attotime::from_hz(60))
+ M65C02(config, m_maincpu, 4915200); /* 65C02 */
+ m_maincpu->set_addrmap(AS_PROGRAM, &mephisto_state::mephisto_mem);
HC259(config, m_outlatch);
m_outlatch->q_out_cb<0>().set_output("led100");
@@ -312,45 +307,50 @@ MACHINE_CONFIG_START(mephisto_state::mephisto)
m_outlatch->q_out_cb<3>().set_output("led103");
m_outlatch->q_out_cb<4>().set_output("led104");
m_outlatch->q_out_cb<5>().set_output("led105");
+ m_outlatch->q_out_cb<6>().set(m_beep, FUNC(beep_device::set_state));
m_outlatch->q_out_cb<7>().set(FUNC(mephisto_state::write_led7));
/* sound hardware */
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("beeper", BEEP, 3250)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
+ BEEP(config, m_beep, 3250).add_route(ALL_OUTPUTS, "mono", 1.0);
- MCFG_TIMER_DRIVER_ADD_PERIODIC("nmi_timer", mephisto_state, update_nmi, attotime::from_hz(600))
+ TIMER(config, "nmi_timer").configure_periodic(FUNC(mephisto_state::update_nmi), attotime::from_hz(600));
MEPHISTO_SENSORS_BOARD(config, "board", 0);
config.set_default_layout(layout_mephisto);
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(mephisto_state::rebel5)
+void mephisto_state::rebel5(machine_config &config)
+{
mephisto(config);
- /* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(rebel5_mem)
- MCFG_DEVICE_REMOVE("nmi_timer")
- MCFG_TIMER_DRIVER_ADD_PERIODIC("nmi_timer_r5", mephisto_state, update_nmi_r5, attotime::from_hz(600))
-MACHINE_CONFIG_END
+ m_maincpu->set_addrmap(AS_PROGRAM, &mephisto_state::rebel5_mem);
+
+ config.device_remove("nmi_timer");
+ TIMER(config, "nmi_timer_r5").configure_periodic(FUNC(mephisto_state::update_nmi_r5), attotime::from_hz(600));
+}
-MACHINE_CONFIG_START(mephisto_state::mm2)
+void mephisto_state::mm2(machine_config &config)
+{
mephisto(config);
- MCFG_DEVICE_REPLACE("maincpu", M65C02, 3700000)
- MCFG_DEVICE_PROGRAM_MAP(mm2_mem)
+
+ m_maincpu->set_clock(3700000);
+ m_maincpu->set_addrmap(AS_PROGRAM, &mephisto_state::mm2_mem);
MCFG_MACHINE_START_OVERRIDE(mephisto_state, mm2 )
- MCFG_DEVICE_REMOVE("nmi_timer")
- MCFG_TIMER_DRIVER_ADD_PERIODIC("irq_timer", mephisto_state, update_irq, attotime::from_hz(450))
-MACHINE_CONFIG_END
+ config.device_remove("nmi_timer");
+ TIMER(config, "irq_timer").configure_periodic(FUNC(mephisto_state::update_irq), attotime::from_hz(450));
+
+ m_outlatch->q_out_cb<7>().set(FUNC(mephisto_state::write_led7)).invert();
+}
-MACHINE_CONFIG_START(mephisto_state::mm4tk)
+void mephisto_state::mm4tk(machine_config &config)
+{
mephisto(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_REPLACE("maincpu", M65C02, 18000000)
- MCFG_DEVICE_PROGRAM_MAP(mephisto_mem)
-MACHINE_CONFIG_END
+
+ m_maincpu->set_clock(18000000);
+ m_maincpu->set_addrmap(AS_PROGRAM, &mephisto_state::mephisto_mem);
+}
ROM_START(rebel5)
ROM_REGION(0x10000,"maincpu",0)
@@ -415,11 +415,11 @@ void mephisto_state::init_mephisto()
***************************************************************************/
-/* YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS */
-CONS( 1984, mm2, mm4, 0, mm2, mephisto, mephisto_state, init_mephisto, "Hegener & Glaser", "Mephisto MM2 Schachcomputer", MACHINE_NOT_WORKING|MACHINE_REQUIRES_ARTWORK | MACHINE_CLICKABLE_ARTWORK )
-CONS( 1986, rebel5, mm4, 0, rebel5, mephisto, mephisto_state, init_mephisto, "Hegener & Glaser", "Mephisto Rebell 5,0 Schachcomputer", MACHINE_NOT_WORKING|MACHINE_REQUIRES_ARTWORK | MACHINE_CLICKABLE_ARTWORK )
-CONS( 1987, mm4, 0, 0, mephisto, mephisto, mephisto_state, init_mephisto, "Hegener & Glaser", "Mephisto 4 Schachcomputer", MACHINE_NOT_WORKING|MACHINE_REQUIRES_ARTWORK | MACHINE_CLICKABLE_ARTWORK )
-CONS( 1987, mm4tk, mm4, 0, mm4tk, mephisto, mephisto_state, init_mephisto, "Hegener & Glaser", "Mephisto 4 Schachcomputer Turbo Kit + HG440", MACHINE_NOT_WORKING|MACHINE_REQUIRES_ARTWORK | MACHINE_CLICKABLE_ARTWORK )
-CONS( 1990, mm5, mm4, 0, mephisto, mephisto, mephisto_state, init_mephisto, "Hegener & Glaser", "Mephisto 5.1 Schachcomputer", MACHINE_NOT_WORKING|MACHINE_REQUIRES_ARTWORK | MACHINE_CLICKABLE_ARTWORK )
-CONS( 1990, mm50, mm4, 0, mephisto, mephisto, mephisto_state, init_mephisto, "Hegener & Glaser", "Mephisto 5.0 Schachcomputer", MACHINE_NOT_WORKING|MACHINE_REQUIRES_ARTWORK | MACHINE_CLICKABLE_ARTWORK )
-CONS( 1990, mm5tk, mm4, 0, mm4tk, mephisto, mephisto_state, init_mephisto, "Hegener & Glaser", "Mephisto 5.1 Schachcomputer Turbo Kit + HG550", MACHINE_NOT_WORKING|MACHINE_REQUIRES_ARTWORK | MACHINE_CLICKABLE_ARTWORK )
+/* YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME, FLAGS */
+CONS( 1984, mm2, mm4, 0, mm2, mephisto, mephisto_state, init_mephisto, "Hegener & Glaser", "Mephisto MM II", MACHINE_NOT_WORKING|MACHINE_REQUIRES_ARTWORK | MACHINE_CLICKABLE_ARTWORK )
+CONS( 1986, rebel5, mm4, 0, rebel5, mephisto, mephisto_state, init_mephisto, "Hegener & Glaser", "Mephisto Rebell 5.0", MACHINE_NOT_WORKING|MACHINE_REQUIRES_ARTWORK | MACHINE_CLICKABLE_ARTWORK )
+CONS( 1987, mm4, 0, 0, mephisto, mephisto, mephisto_state, init_mephisto, "Hegener & Glaser", "Mephisto MM IV", MACHINE_NOT_WORKING|MACHINE_REQUIRES_ARTWORK | MACHINE_CLICKABLE_ARTWORK )
+CONS( 1987, mm4tk, mm4, 0, mm4tk, mephisto, mephisto_state, init_mephisto, "Hegener & Glaser", "Mephisto MM IV (TurboKit + HG440)", MACHINE_NOT_WORKING|MACHINE_REQUIRES_ARTWORK | MACHINE_CLICKABLE_ARTWORK )
+CONS( 1990, mm5, mm4, 0, mephisto, mephisto, mephisto_state, init_mephisto, "Hegener & Glaser", "Mephisto MM V (V5.1)", MACHINE_NOT_WORKING|MACHINE_REQUIRES_ARTWORK | MACHINE_CLICKABLE_ARTWORK )
+CONS( 1990, mm50, mm4, 0, mephisto, mephisto, mephisto_state, init_mephisto, "Hegener & Glaser", "Mephisto MM V (V5.0)", MACHINE_NOT_WORKING|MACHINE_REQUIRES_ARTWORK | MACHINE_CLICKABLE_ARTWORK )
+CONS( 1990, mm5tk, mm4, 0, mm4tk, mephisto, mephisto_state, init_mephisto, "Hegener & Glaser", "Mephisto MM V (V5.1) (TurboKit + HG550)", MACHINE_NOT_WORKING|MACHINE_REQUIRES_ARTWORK | MACHINE_CLICKABLE_ARTWORK )
diff --git a/src/mame/drivers/mephisto_montec.cpp b/src/mame/drivers/mephisto_montec.cpp
index 20829ed2950..eec48437d00 100644
--- a/src/mame/drivers/mephisto_montec.cpp
+++ b/src/mame/drivers/mephisto_montec.cpp
@@ -459,69 +459,69 @@ static INPUT_PORTS_START( smondial2 )
PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_NAME("Clear") PORT_CODE(KEYCODE_BACKSPACE)
INPUT_PORTS_END
-MACHINE_CONFIG_START(mephisto_montec_state::montec)
- MCFG_DEVICE_ADD("maincpu", M65C02, XTAL(4'000'000))
- MCFG_DEVICE_PROGRAM_MAP( montec_mem )
- MCFG_DEVICE_PERIODIC_INT_DRIVER(mephisto_montec_state, nmi_line_assert, XTAL(4'000'000) / (1 << 13))
+void mephisto_montec_state::montec(machine_config &config)
+{
+ M65C02(config, m_maincpu, XTAL(4'000'000));
+ m_maincpu->set_addrmap(AS_PROGRAM, &mephisto_montec_state::montec_mem);
+ m_maincpu->set_periodic_int(FUNC(mephisto_montec_state::nmi_line_assert), attotime::from_hz(XTAL(4'000'000) / (1 << 13)));
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("beeper", BEEP, 3250)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
+ BEEP(config, m_beeper, 3250).add_route(ALL_OUTPUTS, "mono", 1.0);
MEPHISTO_SENSORS_BOARD(config, m_board, 0);
config.set_default_layout(layout_mephisto_montec);
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(mephisto_montec_state::monteciv)
+void mephisto_montec_state::monteciv(machine_config &config)
+{
montec(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_CLOCK( XTAL(8'000'000) )
-MACHINE_CONFIG_END
+ m_maincpu->set_clock(XTAL(8'000'000));
+}
-MACHINE_CONFIG_START(mephisto_montec_state::megaiv)
+void mephisto_montec_state::megaiv(machine_config &config)
+{
montec(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_CLOCK( XTAL(4'915'200) )
- MCFG_DEVICE_PROGRAM_MAP(megaiv_mem)
- MCFG_DEVICE_PERIODIC_INT_DRIVER(mephisto_montec_state, nmi_line_pulse, XTAL(4'915'200) / (1 << 13))
+ m_maincpu->set_clock(XTAL(4'915'200));
+ m_maincpu->set_addrmap(AS_PROGRAM, &mephisto_montec_state::megaiv_mem);
+ m_maincpu->set_periodic_int(FUNC(mephisto_montec_state::nmi_line_pulse), attotime::from_hz(XTAL(4'915'200) / (1 << 13)));
MEPHISTO_BUTTONS_BOARD(config.replace(), m_board, 0);
m_board->set_disable_leds(true);
config.set_default_layout(layout_mephisto_megaiv);
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(mephisto_montec_state::mondial2)
+void mephisto_montec_state::mondial2(machine_config &config)
+{
megaiv(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_CLOCK( XTAL(2'000'000) )
- MCFG_DEVICE_PROGRAM_MAP(mondial2_mem)
- MCFG_DEVICE_PERIODIC_INT_DRIVER(mephisto_montec_state, nmi_line_pulse, XTAL(2'000'000) / (1 << 12))
+ m_maincpu->set_clock(XTAL(2'000'000));
+ m_maincpu->set_addrmap(AS_PROGRAM, &mephisto_montec_state::mondial2_mem);
+ m_maincpu->set_periodic_int(FUNC(mephisto_montec_state::nmi_line_pulse), attotime::from_hz(XTAL(2'000'000) / (1 << 12)));
- MCFG_TIMER_DRIVER_ADD_PERIODIC("refresh_leds", mephisto_montec_state, refresh_leds, attotime::from_hz(10))
+ TIMER(config, "refresh_leds").configure_periodic(FUNC(mephisto_montec_state::refresh_leds), attotime::from_hz(10));
config.set_default_layout(layout_mephisto_mondial2);
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(mephisto_montec_state::smondial)
+void mephisto_montec_state::smondial(machine_config &config)
+{
megaiv(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_CLOCK( XTAL(4'000'000) )
- MCFG_DEVICE_PROGRAM_MAP(smondial_mem)
- MCFG_DEVICE_PERIODIC_INT_DRIVER(mephisto_montec_state, nmi_line_pulse, XTAL(4'000'000) / (1 << 13))
-MACHINE_CONFIG_END
+ m_maincpu->set_clock(XTAL(4'000'000));
+ m_maincpu->set_addrmap(AS_PROGRAM, &mephisto_montec_state::smondial_mem);
+ m_maincpu->set_periodic_int(FUNC(mephisto_montec_state::nmi_line_pulse), attotime::from_hz(XTAL(4'000'000) / (1 << 13)));
+}
-MACHINE_CONFIG_START(mephisto_montec_state::smondial2)
+void mephisto_montec_state::smondial2(machine_config &config)
+{
smondial(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(smondial2_mem)
+ m_maincpu->set_addrmap(AS_PROGRAM, &mephisto_montec_state::smondial2_mem);
- MCFG_GENERIC_CARTSLOT_ADD("cartslot", generic_plain_slot, "smondial2_cart")
- MCFG_SOFTWARE_LIST_ADD("cart_list", "smondial2")
+ GENERIC_CARTSLOT(config, "cartslot", generic_plain_slot, "smondial2_cart");
+ SOFTWARE_LIST(config, "cart_list").set_original("smondial2");
config.set_default_layout(layout_mephisto_smondial2);
-MACHINE_CONFIG_END
+}
ROM_START(megaiv)
diff --git a/src/mame/drivers/mephistp.cpp b/src/mame/drivers/mephistp.cpp
index aedff4d87b3..25d927c0623 100644
--- a/src/mame/drivers/mephistp.cpp
+++ b/src/mame/drivers/mephistp.cpp
@@ -87,9 +87,9 @@ WRITE8_MEMBER(mephisto_pinball_state::t0_t1_w)
void mephisto_pinball_state::ay8910_update()
{
if (m_ay8910_bdir)
- m_aysnd->data_address_w(machine().dummy_space(), m_ay8910_bc1, m_ay8910_data);
+ m_aysnd->data_address_w(m_ay8910_bc1, m_ay8910_data);
else if (m_ay8910_bc1)
- m_ay8910_data = m_aysnd->data_r(machine().dummy_space(), 0);
+ m_ay8910_data = m_aysnd->data_r();
}
WRITE8_MEMBER(mephisto_pinball_state::ay8910_columns_w)
@@ -160,17 +160,18 @@ void mephisto_pinball_state::machine_reset()
{
}
-MACHINE_CONFIG_START(mephisto_pinball_state::mephisto)
+void mephisto_pinball_state::mephisto(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", I8088, XTAL(18'000'000)/3)
- MCFG_DEVICE_PROGRAM_MAP(mephisto_map)
- //MCFG_DEVICE_IRQ_ACKNOWLEDGE_DEVICE("muart", i8256_device, inta_cb)
+ I8088(config, m_maincpu, XTAL(18'000'000)/3);
+ m_maincpu->set_addrmap(AS_PROGRAM, &mephisto_pinball_state::mephisto_map);
+ //m_maincpu->set_irq_acknowledge_callback("muart", FUNC(i8256_device::inta_cb));
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
- //MCFG_DEVICE_ADD("muart", I8256, XTAL(18'000'000)/3)
- //MCFG_I8256_IRQ_HANDLER(INPUTLINE("maincpu", INPUT_LINE_IRQ0))
- //MCFG_I8256_TXD_HANDLER(INPUTLINE("audiocpu", MCS51_RX_LINE))
+ //i8256_device &muart(I8256(config, "muart", XTAL(18'000'000)/3));
+ //muart.irq_handler().set_inputline(m_maincpu, INPUT_LINE_IRQ0);
+ //muart.txd_handler().set_inputline("audiocpu", MCS51_RX_LINE);
I8155(config, "ic20", XTAL(18'000'000)/6);
//i8155_device &i8155_1(I8155(config, "ic20", XTAL(18'000'000)/6));
@@ -195,21 +196,20 @@ MACHINE_CONFIG_START(mephisto_pinball_state::mephisto)
m_aysnd->port_b_read_callback().set(FUNC(mephisto_pinball_state::ay8910_inputs_r));
m_aysnd->add_route(ALL_OUTPUTS, "mono", 0.5);
- MCFG_DEVICE_ADD("dac", DAC08, 0)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.5)
- MCFG_DEVICE_ADD("vref", VOLTAGE_REGULATOR, 0) MCFG_VOLTAGE_REGULATOR_OUTPUT(5.0)
- MCFG_SOUND_ROUTE(0, "dac", 1.0, DAC_VREF_POS_INPUT) MCFG_SOUND_ROUTE(0, "dac", -1.0, DAC_VREF_NEG_INPUT)
-MACHINE_CONFIG_END
+ DAC08(config, "dac", 0).add_route(ALL_OUTPUTS, "mono", 0.5);
+ voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref"));
+ vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT);
+ vref.add_route(0, "dac", -1.0, DAC_VREF_NEG_INPUT);
+}
-MACHINE_CONFIG_START(mephisto_pinball_state::sport2k)
+void mephisto_pinball_state::sport2k(machine_config &config)
+{
mephisto(config);
- MCFG_DEVICE_MODIFY("soundcpu")
- MCFG_DEVICE_IO_MAP(sport2k_8051_io)
+ subdevice<i8051_device>("soundcpu")->set_addrmap(AS_IO, &mephisto_pinball_state::sport2k_8051_io);
- MCFG_DEVICE_ADD("ymsnd", YM3812, XTAL(14'318'181)/4)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.5)
-MACHINE_CONFIG_END
+ YM3812(config, "ymsnd", XTAL(14'318'181)/4).add_route(ALL_OUTPUTS, "mono", 0.5);
+}
/*-------------------------------------------------------------------
/ Mephisto
diff --git a/src/mame/drivers/merit.cpp b/src/mame/drivers/merit.cpp
index 0cf37ab2960..8c932d55280 100644
--- a/src/mame/drivers/merit.cpp
+++ b/src/mame/drivers/merit.cpp
@@ -1409,10 +1409,11 @@ MACHINE_START_MEMBER(merit_state,casino5)
membank("bank2")->set_entry(0);
}
-MACHINE_CONFIG_START(merit_state::pitboss)
- MCFG_DEVICE_ADD("maincpu",Z80, CPU_CLOCK)
- MCFG_DEVICE_PROGRAM_MAP(pitboss_map)
- MCFG_DEVICE_IO_MAP(trvwhiz_io_map)
+void merit_state::pitboss(machine_config &config)
+{
+ Z80(config, m_maincpu, CPU_CLOCK);
+ m_maincpu->set_addrmap(AS_PROGRAM, &merit_state::pitboss_map);
+ m_maincpu->set_addrmap(AS_IO, &merit_state::trvwhiz_io_map);
I8255A(config, m_ppi[0]);
m_ppi[0]->in_pa_callback().set_ioport("IN0");
@@ -1425,9 +1426,9 @@ MACHINE_CONFIG_START(merit_state::pitboss)
m_ppi[1]->out_pc_callback().set(FUNC(merit_state::misc_w));
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_RAW_PARAMS(PIXEL_CLOCK, 512, 0, 512, 256, 0, 256) /* temporary, CRTC will configure screen */
- MCFG_SCREEN_UPDATE_DEVICE("crtc", mc6845_device, screen_update)
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_raw(PIXEL_CLOCK, 512, 0, 512, 256, 0, 256); /* temporary, CRTC will configure screen */
+ m_screen->set_screen_update("crtc", FUNC(mc6845_device::screen_update));
mc6845_device &crtc(MC6845(config, "crtc", CRTC_CLOCK));
crtc.set_screen(m_screen);
@@ -1444,97 +1445,97 @@ MACHINE_CONFIG_START(merit_state::pitboss)
ay8912_device &aysnd(AY8912(config, "aysnd", CRTC_CLOCK));
aysnd.port_a_write_callback().set(FUNC(merit_state::led2_w));
aysnd.add_route(ALL_OUTPUTS, "mono", 0.33);
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(merit_state::casino5)
+void merit_state::casino5(machine_config &config)
+{
pitboss(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(casino5_map)
+ m_maincpu->set_addrmap(AS_PROGRAM, &merit_state::casino5_map);
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
MCFG_MACHINE_START_OVERRIDE(merit_state,casino5)
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(merit_state::bigappg)
+void merit_state::bigappg(machine_config &config)
+{
pitboss(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(bigappg_map)
- MCFG_DEVICE_IO_MAP(tictac_io_map)
+ m_maincpu->set_addrmap(AS_PROGRAM, &merit_state::bigappg_map);
+ m_maincpu->set_addrmap(AS_IO, &merit_state::tictac_io_map);
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(merit_state::misdraw)
+void merit_state::misdraw(machine_config &config)
+{
bigappg(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(misdraw_map)
+ m_maincpu->set_addrmap(AS_PROGRAM, &merit_state::misdraw_map);
NVRAM(config, "cpunvram", nvram_device::DEFAULT_ALL_0);
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(merit_state::dodge)
+void merit_state::dodge(machine_config &config)
+{
pitboss(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(dodge_map)
- MCFG_DEVICE_IO_MAP(tictac_io_map)
+ m_maincpu->set_addrmap(AS_PROGRAM, &merit_state::dodge_map);
+ m_maincpu->set_addrmap(AS_IO, &merit_state::tictac_io_map);
NVRAM(config, "nvram").set_custom_handler(FUNC(merit_state::dodge_nvram_init));
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(merit_state::tictac)
+void merit_state::tictac(machine_config &config)
+{
pitboss(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(tictac_map)
- MCFG_DEVICE_IO_MAP(tictac_io_map)
-MACHINE_CONFIG_END
+ m_maincpu->set_addrmap(AS_PROGRAM, &merit_state::tictac_map);
+ m_maincpu->set_addrmap(AS_IO, &merit_state::tictac_io_map);
+}
-MACHINE_CONFIG_START(merit_state::trvwhiz)
+void merit_state::trvwhiz(machine_config &config)
+{
pitboss(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(trvwhiz_map)
- MCFG_DEVICE_IO_MAP(trvwhiz_io_map)
-MACHINE_CONFIG_END
+ m_maincpu->set_addrmap(AS_PROGRAM, &merit_state::trvwhiz_map);
+ m_maincpu->set_addrmap(AS_IO, &merit_state::trvwhiz_io_map);
+}
-MACHINE_CONFIG_START(merit_state::dtrvwz5)
+void merit_state::dtrvwz5(machine_config &config)
+{
pitboss(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(dtrvwz5_map)
- MCFG_DEVICE_IO_MAP(tictac_io_map)
-MACHINE_CONFIG_END
+ m_maincpu->set_addrmap(AS_PROGRAM, &merit_state::dtrvwz5_map);
+ m_maincpu->set_addrmap(AS_IO, &merit_state::tictac_io_map);
+}
-MACHINE_CONFIG_START(merit_state::phrcraze)
+void merit_state::phrcraze(machine_config &config)
+{
pitboss(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(phrcraze_map)
- MCFG_DEVICE_IO_MAP(phrcraze_io_map)
-MACHINE_CONFIG_END
+ m_maincpu->set_addrmap(AS_PROGRAM, &merit_state::phrcraze_map);
+ m_maincpu->set_addrmap(AS_IO, &merit_state::phrcraze_io_map);
+}
-MACHINE_CONFIG_START(merit_state::trvwhziv)
+void merit_state::trvwhziv(machine_config &config)
+{
pitboss(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(trvwhziv_map)
- MCFG_DEVICE_IO_MAP(tictac_io_map)
-MACHINE_CONFIG_END
+ m_maincpu->set_addrmap(AS_PROGRAM, &merit_state::trvwhziv_map);
+ m_maincpu->set_addrmap(AS_IO, &merit_state::tictac_io_map);
+}
-MACHINE_CONFIG_START(merit_state::couple)
+void merit_state::couple(machine_config &config)
+{
pitboss(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(couple_map)
- MCFG_DEVICE_IO_MAP(tictac_io_map)
+ m_maincpu->set_addrmap(AS_PROGRAM, &merit_state::couple_map);
+ m_maincpu->set_addrmap(AS_IO, &merit_state::tictac_io_map);
m_ppi[1]->out_pc_callback().set(FUNC(merit_state::misc_couple_w));
-MACHINE_CONFIG_END
+}
ROM_START( pitboss ) /* Program roms were all printed as 2214-05 with the "7" hand written over the 5, U5 also had an added hand written "A" */
diff --git a/src/mame/drivers/meritm.cpp b/src/mame/drivers/meritm.cpp
index e2c8a1ca2cc..34aae5bd85a 100644
--- a/src/mame/drivers/meritm.cpp
+++ b/src/mame/drivers/meritm.cpp
@@ -1154,15 +1154,17 @@ void meritm_state::crt250(machine_config &config)
aysnd.add_route(ALL_OUTPUTS, "mono", 1.0);
}
-MACHINE_CONFIG_START(meritm_state::crt250_questions)
+void meritm_state::crt250_questions(machine_config &config)
+{
crt250(config);
m_maincpu->set_addrmap(AS_PROGRAM, &meritm_state::crt250_questions_map);
MCFG_MACHINE_START_OVERRIDE(meritm_state, crt250_questions)
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(meritm_state::crt250_crt252_crt258)
+void meritm_state::crt250_crt252_crt258(machine_config &config)
+{
crt250_questions(config);
m_maincpu->set_addrmap(AS_IO, &meritm_state::crt250_crt258_io_map);
@@ -1172,11 +1174,12 @@ MACHINE_CONFIG_START(meritm_state::crt250_crt252_crt258)
NS16550(config, m_uart, UART_CLK);
m_uart->out_tx_callback().set(m_microtouch, FUNC(microtouch_device::rx));
- MCFG_MICROTOUCH_ADD(m_microtouch, 9600, WRITELINE(m_uart, ins8250_uart_device, rx_w))
- MCFG_MICROTOUCH_TOUCH_CB(meritm_state, touch_coord_transform)
-MACHINE_CONFIG_END
+ MICROTOUCH(config, m_microtouch, 9600).stx().set(m_uart, FUNC(ins8250_uart_device::rx_w));
+ m_microtouch->set_touch_callback(FUNC(meritm_state::touch_coord_transform), this);
+}
-MACHINE_CONFIG_START(meritm_state::crt260)
+void meritm_state::crt260(machine_config &config)
+{
crt250(config);
m_maincpu->set_addrmap(AS_PROGRAM, &meritm_state::map);
@@ -1190,9 +1193,9 @@ MACHINE_CONFIG_START(meritm_state::crt260)
NS16550(config, m_uart, UART_CLK);
m_uart->out_tx_callback().set(m_microtouch, FUNC(microtouch_device::rx));
- MCFG_MICROTOUCH_ADD(m_microtouch, 9600, WRITELINE(m_uart, ins8250_uart_device, rx_w))
- MCFG_MICROTOUCH_TOUCH_CB(meritm_state, touch_coord_transform)
-MACHINE_CONFIG_END
+ MICROTOUCH(config, m_microtouch, 9600).stx().set(m_uart, FUNC(ins8250_uart_device::rx_w));
+ m_microtouch->set_touch_callback(FUNC(meritm_state::touch_coord_transform), this);
+}
/*
diff --git a/src/mame/drivers/meritum.cpp b/src/mame/drivers/meritum.cpp
index 89507372c4e..7c15230f9e3 100644
--- a/src/mame/drivers/meritum.cpp
+++ b/src/mame/drivers/meritum.cpp
@@ -395,9 +395,9 @@ GFXDECODE_END
MACHINE_CONFIG_START(meritum_state::meritum)
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, 10_MHz_XTAL / 4) // U880D @ 2.5 MHz or 1.67 MHz by jumper selection
- MCFG_DEVICE_PROGRAM_MAP(mem_map)
- MCFG_DEVICE_IO_MAP(io_map)
+ Z80(config, m_maincpu, 10_MHz_XTAL / 4); // U880D @ 2.5 MHz or 1.67 MHz by jumper selection
+ m_maincpu->set_addrmap(AS_PROGRAM, &meritum_state::mem_map);
+ m_maincpu->set_addrmap(AS_IO, &meritum_state::io_map);
i8251_device &usart(I8251(config, "usart", 10_MHz_XTAL / 4)); // same as CPU clock
usart.txd_handler().set("rs232", FUNC(rs232_port_device::write_txd));
@@ -420,14 +420,14 @@ MACHINE_CONFIG_START(meritum_state::meritum)
i8255_device &mainppi(I8255(config, "mainppi")); // parallel interface
mainppi.out_pc_callback().set("nmigate", FUNC(input_merger_device::in_w<0>)).bit(7).invert();
- MCFG_DEVICE_ADD("flopppi", I8255, 0) // floppy disk interface
- MCFG_DEVICE_ADD("audiopit", PIT8253, 0) // optional audio interface
+ I8255(config, "flopppi", 0); // floppy disk interface
+ PIT8253(config, "audiopit", 0); // optional audio interface
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_RAW_PARAMS(10_MHz_XTAL, 107 * 6, 0, 64 * 6, 312, 0, 192)
- MCFG_SCREEN_UPDATE_DRIVER(meritum_state, screen_update_meritum)
- MCFG_SCREEN_PALETTE("palette")
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_raw(10_MHz_XTAL, 107 * 6, 0, 64 * 6, 312, 0, 192);
+ screen.set_screen_update(FUNC(meritum_state::screen_update_meritum));
+ screen.set_palette("palette");
GFXDECODE(config, "gfxdecode", "palette", gfx_meritum);
PALETTE(config, "palette", palette_device::MONOCHROME);
@@ -438,8 +438,8 @@ MACHINE_CONFIG_START(meritum_state::meritum)
WAVE(config, "wave", "cassette").add_route(ALL_OUTPUTS, "mono", 0.05);
/* devices */
- MCFG_CASSETTE_ADD("cassette")
- MCFG_QUICKLOAD_ADD("quickload", meritum_state, trs80_cmd, "cmd", 1.0)
+ CASSETTE(config, m_cassette);
+ MCFG_QUICKLOAD_ADD("quickload", meritum_state, trs80_cmd, "cmd", attotime::from_seconds(1))
MACHINE_CONFIG_END
/***************************************************************************
diff --git a/src/mame/drivers/mermaid.cpp b/src/mame/drivers/mermaid.cpp
index 3119a60617b..37fcb30a87c 100644
--- a/src/mame/drivers/mermaid.cpp
+++ b/src/mame/drivers/mermaid.cpp
@@ -128,14 +128,14 @@ Stephh's notes (based on the games Z80 code and some tests) :
WRITE8_MEMBER(mermaid_state::mermaid_ay8910_write_port_w)
{
- if (m_ay8910_enable[0]) m_ay8910[0]->data_w(space, offset, data);
- if (m_ay8910_enable[1]) m_ay8910[1]->data_w(space, offset, data);
+ if (m_ay8910_enable[0]) m_ay8910[0]->data_w(data);
+ if (m_ay8910_enable[1]) m_ay8910[1]->data_w(data);
}
WRITE8_MEMBER(mermaid_state::mermaid_ay8910_control_port_w)
{
- if (m_ay8910_enable[0]) m_ay8910[0]->address_w(space, offset, data);
- if (m_ay8910_enable[1]) m_ay8910[1]->address_w(space, offset, data);
+ if (m_ay8910_enable[0]) m_ay8910[0]->address_w(data);
+ if (m_ay8910_enable[1]) m_ay8910[1]->address_w(data);
}
@@ -419,11 +419,11 @@ WRITE_LINE_MEMBER(mermaid_state::rougien_adpcm_int)
}
}
-MACHINE_CONFIG_START(mermaid_state::mermaid)
-
+void mermaid_state::mermaid(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, 4000000) // ???
- MCFG_DEVICE_PROGRAM_MAP(mermaid_map)
+ Z80(config, m_maincpu, 4000000); // ???
+ m_maincpu->set_addrmap(AS_PROGRAM, &mermaid_state::mermaid_map);
LS259(config, m_latch[0]);
m_latch[0]->q_out_cb<0>().set(FUNC(mermaid_state::ay1_enable_w));
@@ -440,14 +440,14 @@ MACHINE_CONFIG_START(mermaid_state::mermaid)
m_latch[1]->q_out_cb<7>().set_nop(); // very frequent
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */)
- MCFG_SCREEN_SIZE(32*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(mermaid_state, screen_update_mermaid)
- MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE(*this, mermaid_state, screen_vblank_mermaid))
- MCFG_SCREEN_PALETTE(m_palette)
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_refresh_hz(60);
+ m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */
+ m_screen->set_size(32*8, 32*8);
+ m_screen->set_visarea(0*8, 32*8-1, 2*8, 30*8-1);
+ m_screen->set_screen_update(FUNC(mermaid_state::screen_update_mermaid));
+ m_screen->screen_vblank().set(FUNC(mermaid_state::screen_vblank_mermaid));
+ m_screen->set_palette(m_palette);
GFXDECODE(config, m_gfxdecode, m_palette, gfx_mermaid);
PALETTE(config, m_palette, FUNC(mermaid_state::mermaid_palette), 4*16+2*2, 64+1);
@@ -456,12 +456,11 @@ MACHINE_CONFIG_START(mermaid_state::mermaid)
SPEAKER(config, "mono").front_center();
AY8910(config, m_ay8910[0], 1500000).add_route(ALL_OUTPUTS, "mono", 0.25);
-
AY8910(config, m_ay8910[1], 1500000).add_route(ALL_OUTPUTS, "mono", 0.25);
+}
-MACHINE_CONFIG_END
-
-MACHINE_CONFIG_START(mermaid_state::rougien)
+void mermaid_state::rougien(machine_config &config)
+{
mermaid(config);
m_latch[0]->q_out_cb<2>().set(FUNC(mermaid_state::rougien_sample_playback_w));
@@ -471,16 +470,16 @@ MACHINE_CONFIG_START(mermaid_state::rougien)
m_palette->set_init(FUNC(mermaid_state::rougien_palette));
- MCFG_DEVICE_ADD("adpcm", MSM5205, 384000)
- MCFG_MSM5205_VCK_CALLBACK(WRITELINE(*this, mermaid_state, rougien_adpcm_int))
- MCFG_MSM5205_PRESCALER_SELECTOR(S96_4B)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.00)
+ MSM5205(config, m_adpcm, 384000);
+ m_adpcm->vck_callback().set(FUNC(mermaid_state::rougien_adpcm_int));
+ m_adpcm->set_prescaler_selector(msm5205_device::S96_4B);
+ m_adpcm->add_route(ALL_OUTPUTS, "mono", 1.00);
RIPPLE_COUNTER(config, m_adpcm_counter);
m_adpcm_counter->set_device_rom_tag("adpcm");
m_adpcm_counter->set_stages(12);
m_adpcm_counter->rom_out_cb().set(FUNC(mermaid_state::adpcm_data_w));
-MACHINE_CONFIG_END
+}
/* ROMs */
diff --git a/src/mame/drivers/mes.cpp b/src/mame/drivers/mes.cpp
index e8899cfc15e..7685d75f35b 100644
--- a/src/mame/drivers/mes.cpp
+++ b/src/mame/drivers/mes.cpp
@@ -131,20 +131,21 @@ void mes_state::kbd_put(u8 data)
m_term_data = data;
}
-MACHINE_CONFIG_START(mes_state::mes)
+void mes_state::mes(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, XTAL(16'000'000) / 4)
- MCFG_DEVICE_PROGRAM_MAP(mem_map)
- MCFG_DEVICE_IO_MAP(io_map)
+ Z80(config, m_maincpu, XTAL(16'000'000) / 4);
+ m_maincpu->set_addrmap(AS_PROGRAM, &mes_state::mem_map);
+ m_maincpu->set_addrmap(AS_IO, &mes_state::io_map);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */
- MCFG_SCREEN_UPDATE_DRIVER(mes_state, screen_update)
- MCFG_SCREEN_SIZE(640, 250)
- MCFG_SCREEN_VISIBLE_AREA(0, 639, 0, 249)
- MCFG_SCREEN_PALETTE("palette")
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */
+ screen.set_screen_update(FUNC(mes_state::screen_update));
+ screen.set_size(640, 250);
+ screen.set_visarea(0, 639, 0, 249);
+ screen.set_palette("palette");
PALETTE(config, "palette", palette_device::MONOCHROME);
@@ -154,7 +155,7 @@ MACHINE_CONFIG_START(mes_state::mes)
generic_keyboard_device &keybd(GENERIC_KEYBOARD(config, "keybd", 0));
keybd.set_keyboard_callback(FUNC(mes_state::kbd_put));
-MACHINE_CONFIG_END
+}
/* ROM definition */
diff --git a/src/mame/drivers/metalmx.cpp b/src/mame/drivers/metalmx.cpp
index 2270377cd69..a702481129f 100644
--- a/src/mame/drivers/metalmx.cpp
+++ b/src/mame/drivers/metalmx.cpp
@@ -527,7 +527,6 @@ void metalmx_state::gsp_map(address_map &map)
{
map(0x88800000, 0x8880000f).ram(); /* ? */
map(0x88c00000, 0x88c0000f).ram(); /* ? */
- map(0xc0000000, 0xc00003ff).rw(m_gsp, FUNC(tms34020_device::io_register_r), FUNC(tms34020_device::io_register_w));
map(0xff000000, 0xff7fffff).ram().share("gsp_dram");
map(0xff800000, 0xffffffff).ram().share("gsp_vram");
}
@@ -657,14 +656,14 @@ INPUT_PORTS_END
*
*************************************/
-MACHINE_CONFIG_START(metalmx_state::metalmx)
-
- MCFG_DEVICE_ADD("maincpu", M68EC020, XTAL(14'318'181))
- MCFG_DEVICE_PROGRAM_MAP(main_map)
+void metalmx_state::metalmx(machine_config &config)
+{
+ M68EC020(config, m_maincpu, XTAL(14'318'181));
+ m_maincpu->set_addrmap(AS_PROGRAM, &metalmx_state::main_map);
- MCFG_DEVICE_ADD("adsp", ADSP2105, XTAL(10'000'000))
- MCFG_DEVICE_PROGRAM_MAP(adsp_program_map)
- MCFG_DEVICE_DATA_MAP(adsp_data_map)
+ ADSP2105(config, m_adsp, XTAL(10'000'000));
+ m_adsp->set_addrmap(AS_PROGRAM, &metalmx_state::adsp_program_map);
+ m_adsp->set_addrmap(AS_DATA, &metalmx_state::adsp_data_map);
TMS34020(config, m_gsp, 40000000); /* Unverified */
m_gsp->set_addrmap(AS_PROGRAM, &metalmx_state::gsp_map);
@@ -673,26 +672,26 @@ MACHINE_CONFIG_START(metalmx_state::metalmx)
m_gsp->set_pixels_per_clock(2);
m_gsp->output_int().set_inputline("maincpu", 4);
- MCFG_DEVICE_ADD("dsp32c_1", DSP32C, 40000000) /* Unverified */
- MCFG_DEVICE_PROGRAM_MAP(dsp32c_1_map)
+ DSP32C(config, m_dsp32c[0], 40000000); /* Unverified */
+ m_dsp32c[0]->set_addrmap(AS_PROGRAM, &metalmx_state::dsp32c_1_map);
- MCFG_DEVICE_ADD("dsp32c_2", DSP32C, 40000000) /* Unverified */
- MCFG_DEVICE_PROGRAM_MAP(dsp32c_2_map)
+ DSP32C(config, m_dsp32c[1], 40000000); /* Unverified */
+ m_dsp32c[1]->set_addrmap(AS_PROGRAM, &metalmx_state::dsp32c_2_map);
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(512, 384)
- MCFG_SCREEN_VISIBLE_AREA(0, 511, 0, 383)
- MCFG_SCREEN_UPDATE_DRIVER(metalmx_state, screen_update_metalmx)
- MCFG_SCREEN_PALETTE("palette")
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(512, 384);
+ screen.set_visarea(0, 511, 0, 383);
+ screen.set_screen_update(FUNC(metalmx_state::screen_update_metalmx));
+ screen.set_palette("palette");
PALETTE(config, "palette", palette_device::RGB_565);
ATARI_CAGE(config, m_cage, 0);
m_cage->set_speedup(0); // TODO: speedup address
m_cage->irq_handler().set(FUNC(metalmx_state::cage_irq_callback));
-MACHINE_CONFIG_END
+}
void metalmx_state::init_metalmx()
diff --git a/src/mame/drivers/metlclsh.cpp b/src/mame/drivers/metlclsh.cpp
index 306b3dfbec7..562318e5257 100644
--- a/src/mame/drivers/metlclsh.cpp
+++ b/src/mame/drivers/metlclsh.cpp
@@ -278,11 +278,11 @@ void metlclsh_state::machine_reset()
void metlclsh_state::metlclsh(machine_config &config)
{
/* basic machine hardware */
- M6809(config, m_maincpu, 1500000); // ?
+ M6809(config, m_maincpu, 1500000); // ?
m_maincpu->set_addrmap(AS_PROGRAM, &metlclsh_state::metlclsh_master_map);
// IRQ by YM3526, NMI by CPU #2
- M6809(config, m_subcpu, 1500000); // ?
+ M6809(config, m_subcpu, 1500000); // ?
m_subcpu->set_addrmap(AS_PROGRAM, &metlclsh_state::metlclsh_slave_map);
// IRQ by CPU #1, NMI by coin insertion
diff --git a/src/mame/drivers/metlfrzr.cpp b/src/mame/drivers/metlfrzr.cpp
index 2cd3986f02f..2e5cdbdb68c 100644
--- a/src/mame/drivers/metlfrzr.cpp
+++ b/src/mame/drivers/metlfrzr.cpp
@@ -366,28 +366,28 @@ TIMER_DEVICE_CALLBACK_MEMBER(metlfrzr_state::scanline)
m_maincpu->set_input_line_and_vector(0, HOLD_LINE,0x08); /* RST 08h */
}
-MACHINE_CONFIG_START(metlfrzr_state::metlfrzr)
-
+void metlfrzr_state::metlfrzr(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, XTAL(12'000'000) / 2)
- MCFG_DEVICE_PROGRAM_MAP(metlfrzr_map)
- MCFG_DEVICE_OPCODES_MAP(decrypted_opcodes_map)
- MCFG_TIMER_DRIVER_ADD_SCANLINE("scantimer", metlfrzr_state, scanline, "screen", 0, 1)
+ Z80(config, m_maincpu, XTAL(12'000'000) / 2);
+ m_maincpu->set_addrmap(AS_PROGRAM, &metlfrzr_state::metlfrzr_map);
+ m_maincpu->set_addrmap(AS_OPCODES, &metlfrzr_state::decrypted_opcodes_map);
+ TIMER(config, "scantimer").configure_scanline(FUNC(metlfrzr_state::scanline), "screen", 0, 1);
- MCFG_DEVICE_ADD("t5182", T5182, 0)
+ T5182(config, "t5182", 0);
PALETTE(config, m_palette).set_format(palette_device::xBGR_444, 0x200).set_indirect_entries(256 * 2);
GFXDECODE(config, m_gfxdecode, m_palette, gfx_metlfrzr);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(256, 256)
- MCFG_SCREEN_VISIBLE_AREA(0, 256 - 1, 16, 256 - 16 - 1)
- MCFG_SCREEN_UPDATE_DRIVER(metlfrzr_state, screen_update_metlfrzr)
- MCFG_SCREEN_PALETTE(m_palette)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(256, 256);
+ screen.set_visarea(0, 256 - 1, 16, 256 - 16 - 1);
+ screen.set_screen_update(FUNC(metlfrzr_state::screen_update_metlfrzr));
+ screen.set_palette(m_palette);
/* sound hardware */
SPEAKER(config, "mono").front_center();
@@ -396,7 +396,7 @@ MACHINE_CONFIG_START(metlfrzr_state::metlfrzr)
ymsnd.irq_handler().set("t5182", FUNC(t5182_device::ym2151_irq_handler));
ymsnd.add_route(0, "mono", 1.0);
ymsnd.add_route(1, "mono", 1.0);
-MACHINE_CONFIG_END
+}
diff --git a/src/mame/drivers/metro.cpp b/src/mame/drivers/metro.cpp
index 7c772688dc2..f707ab3cb4d 100644
--- a/src/mame/drivers/metro.cpp
+++ b/src/mame/drivers/metro.cpp
@@ -367,7 +367,7 @@ WRITE8_MEMBER(metro_state::upd7810_portb_w)
{
if (!BIT(data, 2))
{
- downcast<ym2413_device *>(m_ymsnd.target())->write(space, BIT(data, 1), m_porta);
+ downcast<ym2413_device *>(m_ymsnd.target())->write(BIT(data, 1), m_porta);
}
m_portb = data;
return;
@@ -377,7 +377,7 @@ WRITE8_MEMBER(metro_state::upd7810_portb_w)
{
/* write */
if (!BIT(data, 4))
- m_oki->write(space, 0, m_porta);
+ m_oki->write(m_porta);
}
m_portb = data;
@@ -409,13 +409,13 @@ WRITE8_MEMBER(metro_state::daitorid_portb_w)
if (!BIT(data, 2))
{
/* write */
- downcast<ym2151_device *>(m_ymsnd.target())->write(space, BIT(data, 1), m_porta);
+ downcast<ym2151_device *>(m_ymsnd.target())->write(BIT(data, 1), m_porta);
}
if (!BIT(data, 3))
{
/* read */
- m_porta = downcast<ym2151_device *>(m_ymsnd.target())->read(space, BIT(data, 1));
+ m_porta = downcast<ym2151_device *>(m_ymsnd.target())->read(BIT(data, 1));
}
m_portb = data;
@@ -426,14 +426,14 @@ WRITE8_MEMBER(metro_state::daitorid_portb_w)
{
/* write */
if (!BIT(data, 4))
- m_oki->write(space, 0, m_porta);
+ m_oki->write(m_porta);
}
if (BIT(m_portb, 3) && !BIT(data, 3)) /* clock 1->0 */
{
/* read */
if (!BIT(data, 4))
- m_porta = m_oki->read(space, 0);
+ m_porta = m_oki->read();
}
m_portb = data;
@@ -4877,46 +4877,68 @@ Custom graphics chip - Imagetek I4100 052 9227KK701 (same as Karate Tournament)
ROM_START( pangpoms )
ROM_REGION( 0x040000, "maincpu", 0 ) /* 68000 Code */
- ROM_LOAD16_BYTE( "ppoms09.bin", 0x000000, 0x020000, CRC(0c292dbc) SHA1(8b09de2a560e804e0dea514c95b317c2e2b6501d) )
- ROM_LOAD16_BYTE( "ppoms10.bin", 0x000001, 0x020000, CRC(0bc18853) SHA1(68d50ad50caad34e72d32e7b9fea1d85af74b879) )
+ ROM_LOAD16_BYTE( "ppoms09.9.f7", 0x000000, 0x020000, CRC(0c292dbc) SHA1(8b09de2a560e804e0dea514c95b317c2e2b6501d) )
+ ROM_LOAD16_BYTE( "ppoms10.10.f8", 0x000001, 0x020000, CRC(0bc18853) SHA1(68d50ad50caad34e72d32e7b9fea1d85af74b879) )
ROM_REGION( 0x20000, "audiocpu", 0 ) /* NEC78C10 Code */
- ROM_LOAD( "ppoms12.bin", 0x000000, 0x020000, CRC(a749357b) SHA1(1555f565c301c5be7c49fc44a004b5c0cb3777c6) )
+ ROM_LOAD( "pj_a12.12.a7", 0x000000, 0x020000, CRC(a749357b) SHA1(1555f565c301c5be7c49fc44a004b5c0cb3777c6) )
ROM_REGION( 0x100000, "vdp", 0 ) /* Gfx + Data (Addressable by CPU & Blitter) */
- ROMX_LOAD( "ppoms02.bin", 0x000000, 0x020000, CRC(88f902f7) SHA1(12ea58d7c000b629ccdceec3dedc2747a63b84be) , ROM_SKIP(7))
+ ROMX_LOAD( "pj_e_02.i7", 0x000000, 0x020000, CRC(88f902f7) SHA1(12ea58d7c000b629ccdceec3dedc2747a63b84be) , ROM_SKIP(7))
ROMX_LOAD( "ppoms04.bin", 0x000001, 0x020000, CRC(9190c2a0) SHA1(a7399cc2dea5a963e7c930e426915e8eb3552213) , ROM_SKIP(7))
ROMX_LOAD( "ppoms06.bin", 0x000002, 0x020000, CRC(ed15c93d) SHA1(95072e7d1def0d8e97946a612b90ce078c64aed2) , ROM_SKIP(7))
- ROMX_LOAD( "ppoms08.bin", 0x000003, 0x020000, CRC(9a3408b9) SHA1(924b184d3a47bbe8aa5d41761ea5e94ba7e4f2e9) , ROM_SKIP(7))
- ROMX_LOAD( "ppoms01.bin", 0x000004, 0x020000, CRC(11ac3810) SHA1(6ada82a73d4383f99f5be67369b810a692d27ef9) , ROM_SKIP(7))
+ ROMX_LOAD( "pj_e_08.i16", 0x000003, 0x020000, CRC(9a3408b9) SHA1(924b184d3a47bbe8aa5d41761ea5e94ba7e4f2e9) , ROM_SKIP(7))
+ ROMX_LOAD( "pj_e_01.i6", 0x000004, 0x020000, CRC(11ac3810) SHA1(6ada82a73d4383f99f5be67369b810a692d27ef9) , ROM_SKIP(7))
ROMX_LOAD( "ppoms03.bin", 0x000005, 0x020000, CRC(e595529e) SHA1(91b4bd1f029ce09d7689815099b38916fe0d2686) , ROM_SKIP(7))
ROMX_LOAD( "ppoms05.bin", 0x000006, 0x020000, CRC(02226214) SHA1(82302e7f1e7269c45e11dfba45ec7bbf522b47f1) , ROM_SKIP(7))
- ROMX_LOAD( "ppoms07.bin", 0x000007, 0x020000, CRC(48471c87) SHA1(025fa79993788a0091c4edb83423725abd3a47a2) , ROM_SKIP(7))
+ ROMX_LOAD( "pj_e_07.i14", 0x000007, 0x020000, CRC(48471c87) SHA1(025fa79993788a0091c4edb83423725abd3a47a2) , ROM_SKIP(7))
ROM_REGION( 0x40000, "oki", 0 ) /* Samples */
- ROM_LOAD( "ppoms11.bin", 0x000000, 0x020000, CRC(e89bd565) SHA1(6c7c1ad67ba708dbbe9654c1d290af290207d2be) )
+ ROM_LOAD( "pj_a11.11.e1", 0x000000, 0x020000, CRC(e89bd565) SHA1(6c7c1ad67ba708dbbe9654c1d290af290207d2be) )
ROM_END
ROM_START( pangpomsm )
ROM_REGION( 0x040000, "maincpu", 0 ) /* 68000 Code */
- ROM_LOAD16_BYTE( "pa.c09", 0x000000, 0x020000, CRC(e01a7a08) SHA1(1890b290dfb1521ab73b2392409aaf44b99d63bb) )
- ROM_LOAD16_BYTE( "pa.c10", 0x000001, 0x020000, CRC(5e509cee) SHA1(821cfbf5f65cc3091eb8008310266f9f2c838072) )
+ ROM_LOAD16_BYTE( "pa_c_09.9.f7", 0x000000, 0x020000, CRC(e01a7a08) SHA1(1890b290dfb1521ab73b2392409aaf44b99d63bb) )
+ ROM_LOAD16_BYTE( "pa_c_10.10.f8", 0x000001, 0x020000, CRC(5e509cee) SHA1(821cfbf5f65cc3091eb8008310266f9f2c838072) )
ROM_REGION( 0x20000, "audiocpu", 0 ) /* NEC78C10 Code */
- ROM_LOAD( "ppoms12.bin", 0x000000, 0x020000, CRC(a749357b) SHA1(1555f565c301c5be7c49fc44a004b5c0cb3777c6) )
+ ROM_LOAD( "pj_a12.12.a7", 0x000000, 0x020000, CRC(a749357b) SHA1(1555f565c301c5be7c49fc44a004b5c0cb3777c6) )
ROM_REGION( 0x100000, "vdp", 0 ) /* Gfx + Data (Addressable by CPU & Blitter) */
- ROMX_LOAD( "ppoms02.bin", 0x000000, 0x020000, CRC(88f902f7) SHA1(12ea58d7c000b629ccdceec3dedc2747a63b84be) , ROM_SKIP(7))
- ROMX_LOAD( "pj.e04", 0x000001, 0x020000, CRC(54bf2f10) SHA1(2f0f18984e336f226457295d375a73bcf86cef31) , ROM_SKIP(7))
- ROMX_LOAD( "pj.e06", 0x000002, 0x020000, CRC(c8b6347d) SHA1(7090e44dc7032432795b6fb6bc166bf4de159685) , ROM_SKIP(7))
- ROMX_LOAD( "ppoms08.bin", 0x000003, 0x020000, CRC(9a3408b9) SHA1(924b184d3a47bbe8aa5d41761ea5e94ba7e4f2e9) , ROM_SKIP(7))
- ROMX_LOAD( "ppoms01.bin", 0x000004, 0x020000, CRC(11ac3810) SHA1(6ada82a73d4383f99f5be67369b810a692d27ef9) , ROM_SKIP(7))
- ROMX_LOAD( "pj.e03", 0x000005, 0x020000, CRC(d126e774) SHA1(f782d1e1277956f088dc91dec8f338f85b9af13a) , ROM_SKIP(7))
- ROMX_LOAD( "pj.e05", 0x000006, 0x020000, CRC(79c0ec1e) SHA1(b15582e89d859dda4f82908c62e9e07cb45229b9) , ROM_SKIP(7))
- ROMX_LOAD( "ppoms07.bin", 0x000007, 0x020000, CRC(48471c87) SHA1(025fa79993788a0091c4edb83423725abd3a47a2) , ROM_SKIP(7))
+ ROMX_LOAD( "pj_e_02.i7", 0x000000, 0x020000, CRC(88f902f7) SHA1(12ea58d7c000b629ccdceec3dedc2747a63b84be) , ROM_SKIP(7))
+ ROMX_LOAD( "pj_e_04.i10", 0x000001, 0x020000, CRC(54bf2f10) SHA1(2f0f18984e336f226457295d375a73bcf86cef31) , ROM_SKIP(7))
+ ROMX_LOAD( "pj_e_06.i13", 0x000002, 0x020000, CRC(c8b6347d) SHA1(7090e44dc7032432795b6fb6bc166bf4de159685) , ROM_SKIP(7))
+ ROMX_LOAD( "pj_e_08.i16", 0x000003, 0x020000, CRC(9a3408b9) SHA1(924b184d3a47bbe8aa5d41761ea5e94ba7e4f2e9) , ROM_SKIP(7))
+ ROMX_LOAD( "pj_e_01.i6", 0x000004, 0x020000, CRC(11ac3810) SHA1(6ada82a73d4383f99f5be67369b810a692d27ef9) , ROM_SKIP(7))
+ ROMX_LOAD( "pj_e_03.i9", 0x000005, 0x020000, CRC(d126e774) SHA1(f782d1e1277956f088dc91dec8f338f85b9af13a) , ROM_SKIP(7))
+ ROMX_LOAD( "pj_e_05.i12", 0x000006, 0x020000, CRC(79c0ec1e) SHA1(b15582e89d859dda4f82908c62e9e07cb45229b9) , ROM_SKIP(7))
+ ROMX_LOAD( "pj_e_07.i14", 0x000007, 0x020000, CRC(48471c87) SHA1(025fa79993788a0091c4edb83423725abd3a47a2) , ROM_SKIP(7))
ROM_REGION( 0x40000, "oki", 0 ) /* Samples */
- ROM_LOAD( "ppoms11.bin", 0x000000, 0x020000, CRC(e89bd565) SHA1(6c7c1ad67ba708dbbe9654c1d290af290207d2be) )
+ ROM_LOAD( "pj_a11.11.e1", 0x000000, 0x020000, CRC(e89bd565) SHA1(6c7c1ad67ba708dbbe9654c1d290af290207d2be) )
+ROM_END
+
+ROM_START( pangpomsn )
+ ROM_REGION( 0x040000, "maincpu", 0 ) /* 68000 Code */
+ ROM_LOAD16_BYTE( "pn_e_09.9.f7", 0x000000, 0x020000, CRC(2cc925aa) SHA1(27a09b4b990a867c624207474cb8c55f7d72ce88) )
+ ROM_LOAD16_BYTE( "pn_e_10.10.f8", 0x000001, 0x020000, CRC(6d7ad1d2) SHA1(4b6f83f90631fa3eac4d6a3d3ab44760be821f54) )
+
+ ROM_REGION( 0x20000, "audiocpu", 0 ) /* NEC78C10 Code */
+ ROM_LOAD( "pj_a12.12.a7", 0x000000, 0x020000, CRC(a749357b) SHA1(1555f565c301c5be7c49fc44a004b5c0cb3777c6) )
+
+ ROM_REGION( 0x100000, "vdp", 0 ) /* Gfx + Data (Addressable by CPU & Blitter) */
+ ROMX_LOAD( "pj_e_02.i7", 0x000000, 0x020000, CRC(88f902f7) SHA1(12ea58d7c000b629ccdceec3dedc2747a63b84be) , ROM_SKIP(7))
+ ROMX_LOAD( "pj_e_04.i10", 0x000001, 0x020000, CRC(54bf2f10) SHA1(2f0f18984e336f226457295d375a73bcf86cef31) , ROM_SKIP(7))
+ ROMX_LOAD( "pj_e_06.i13", 0x000002, 0x020000, CRC(c8b6347d) SHA1(7090e44dc7032432795b6fb6bc166bf4de159685) , ROM_SKIP(7))
+ ROMX_LOAD( "pj_e_08.i16", 0x000003, 0x020000, CRC(9a3408b9) SHA1(924b184d3a47bbe8aa5d41761ea5e94ba7e4f2e9) , ROM_SKIP(7))
+ ROMX_LOAD( "pj_e_01.i6", 0x000004, 0x020000, CRC(11ac3810) SHA1(6ada82a73d4383f99f5be67369b810a692d27ef9) , ROM_SKIP(7))
+ ROMX_LOAD( "pj_e_03.i9", 0x000005, 0x020000, CRC(d126e774) SHA1(f782d1e1277956f088dc91dec8f338f85b9af13a) , ROM_SKIP(7))
+ ROMX_LOAD( "pj_e_05.i12", 0x000006, 0x020000, CRC(79c0ec1e) SHA1(b15582e89d859dda4f82908c62e9e07cb45229b9) , ROM_SKIP(7))
+ ROMX_LOAD( "pj_e_07.i14", 0x000007, 0x020000, CRC(48471c87) SHA1(025fa79993788a0091c4edb83423725abd3a47a2) , ROM_SKIP(7))
+
+ ROM_REGION( 0x40000, "oki", 0 ) /* Samples */
+ ROM_LOAD( "pj_a11.11.e1", 0x000000, 0x020000, CRC(e89bd565) SHA1(6c7c1ad67ba708dbbe9654c1d290af290207d2be) )
ROM_END
@@ -5574,6 +5596,7 @@ GAME( 1992, karatour, 0, karatour, karatour, metro_state, init_karato
GAME( 1992, karatourj, karatour, karatour, karatour, metro_state, init_karatour, ROT0, "Mitchell", "Chatan Yarakuu Shanku - The Karate Tournament (Japan)", MACHINE_SUPPORTS_SAVE )
GAME( 1992, pangpoms, 0, pangpoms, pangpoms, metro_state, init_metro, ROT0, "Metro", "Pang Pom's", MACHINE_SUPPORTS_SAVE )
GAME( 1992, pangpomsm, pangpoms, pangpoms, pangpoms, metro_state, init_metro, ROT0, "Metro (Mitchell license)", "Pang Pom's (Mitchell)", MACHINE_SUPPORTS_SAVE )
+GAME( 1992, pangpomsn, pangpoms, pangpoms, pangpoms, metro_state, init_metro, ROT0, "Nova", "Pang Pom's (Nova)", MACHINE_SUPPORTS_SAVE )
GAME( 1992, skyalert, 0, skyalert, skyalert, metro_state, init_metro, ROT270, "Metro", "Sky Alert", MACHINE_SUPPORTS_SAVE )
GAME( 1993, ladykill, 0, karatour, ladykill, metro_state, init_karatour, ROT90, "Yanyaka (Mitchell license)", "Lady Killer", MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE )
GAME( 1993, moegonta, ladykill, karatour, moegonta, metro_state, init_karatour, ROT90, "Yanyaka", "Moeyo Gonta!! (Japan)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE )
diff --git a/src/mame/drivers/mexico86.cpp b/src/mame/drivers/mexico86.cpp
index 92497781e06..85e1b05bd55 100644
--- a/src/mame/drivers/mexico86.cpp
+++ b/src/mame/drivers/mexico86.cpp
@@ -65,7 +65,7 @@ PS4 J8635 PS4 J8541 PS4 J8648
READ8_MEMBER(mexico86_state::kiki_ym2203_r)
{
- u8 result = m_ymsnd->read(space, offset);
+ u8 result = m_ymsnd->read(offset);
if (offset == 0)
result &= 0x7f;
diff --git a/src/mame/drivers/meyc8080.cpp b/src/mame/drivers/meyc8080.cpp
index eef08d8ddbf..3283f59d41c 100644
--- a/src/mame/drivers/meyc8080.cpp
+++ b/src/mame/drivers/meyc8080.cpp
@@ -588,29 +588,29 @@ INPUT_PORTS_END
*
*************************************/
-MACHINE_CONFIG_START(meyc8080_state::meyc8080)
-
+void meyc8080_state::meyc8080(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", I8080A, XTAL(20'000'000) / 10) // divider guessed
- MCFG_DEVICE_PROGRAM_MAP(meyc8080_map)
+ I8080A(config, m_maincpu, XTAL(20'000'000) / 10); // divider guessed
+ m_maincpu->set_addrmap(AS_PROGRAM, &meyc8080_state::meyc8080_map);
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_SIZE(256, 256)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 4*8, 32*8-1)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */)
- MCFG_SCREEN_UPDATE_DRIVER(meyc8080_state, screen_update_meyc8080)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_size(256, 256);
+ screen.set_visarea(0*8, 32*8-1, 4*8, 32*8-1);
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500) /* not accurate */);
+ screen.set_screen_update(FUNC(meyc8080_state::screen_update_meyc8080));
/* audio hardware */
SPEAKER(config, "speaker").front_center();
- MCFG_DEVICE_ADD("dac", DAC_2BIT_R2R, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 0.66) // unknown DAC
- MCFG_DEVICE_ADD("vref", VOLTAGE_REGULATOR, 0) MCFG_VOLTAGE_REGULATOR_OUTPUT(5.0)
- MCFG_SOUND_ROUTE(0, "dac", 1.0, DAC_VREF_POS_INPUT) MCFG_SOUND_ROUTE(0, "dac", -1.0, DAC_VREF_NEG_INPUT)
-
-MACHINE_CONFIG_END
+ DAC_2BIT_R2R(config, m_dac, 0).add_route(ALL_OUTPUTS, "speaker", 0.66); // unknown DAC
+ voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref"));
+ vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT);
+ vref.add_route(0, "dac", -1.0, DAC_VREF_NEG_INPUT);
+}
diff --git a/src/mame/drivers/meyc8088.cpp b/src/mame/drivers/meyc8088.cpp
index 11fe7a0df0f..056227e3f3c 100644
--- a/src/mame/drivers/meyc8088.cpp
+++ b/src/mame/drivers/meyc8088.cpp
@@ -364,11 +364,11 @@ INPUT_PORTS_END
***************************************************************************/
-MACHINE_CONFIG_START(meyc8088_state::meyc8088)
-
+void meyc8088_state::meyc8088(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD(m_maincpu, I8088, (XTAL(15'000'000) / 3) * 0.95) // NOTE: underclocked to prevent errors on diagnostics, MAME i8088 cycle timing is probably inaccurate
- MCFG_DEVICE_PROGRAM_MAP(meyc8088_map)
+ I8088(config, m_maincpu, (XTAL(15'000'000) / 3) * 0.95); // NOTE: underclocked to prevent errors on diagnostics, MAME i8088 cycle timing is probably inaccurate
+ m_maincpu->set_addrmap(AS_PROGRAM, &meyc8088_state::meyc8088_map);
i8155_device &i8155_1(I8155(config, "i8155_1", XTAL(15'000'000) / (3*1)));
// all ports set to input
@@ -386,24 +386,24 @@ MACHINE_CONFIG_START(meyc8088_state::meyc8088)
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
- MCFG_TIMER_DRIVER_ADD("heartbeat", meyc8088_state, heartbeat_callback)
+ TIMER(config, m_heartbeat).configure_generic(FUNC(meyc8088_state::heartbeat_callback));
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_RAW_PARAMS(XTAL(15'000'000)/3, 320, 0, 256, 261, 0, 224)
- MCFG_SCREEN_UPDATE_DRIVER(meyc8088_state, screen_update)
- MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE(*this, meyc8088_state, screen_vblank))
- MCFG_SCREEN_PALETTE("palette")
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_raw(XTAL(15'000'000)/3, 320, 0, 256, 261, 0, 224);
+ screen.set_screen_update(FUNC(meyc8088_state::screen_update));
+ screen.screen_vblank().set(FUNC(meyc8088_state::screen_vblank));
+ screen.set_palette("palette");
PALETTE(config, "palette", FUNC(meyc8088_state::meyc8088_palette), 32);
/* sound hardware */
SPEAKER(config, "speaker").front_center();
- MCFG_DEVICE_ADD("dac", DAC_1BIT, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 0.25)
- MCFG_DEVICE_ADD("vref", VOLTAGE_REGULATOR, 0) MCFG_VOLTAGE_REGULATOR_OUTPUT(5.0)
- MCFG_SOUND_ROUTE(0, "dac", 1.0, DAC_VREF_POS_INPUT)
-MACHINE_CONFIG_END
+ DAC_1BIT(config, "dac", 0).add_route(ALL_OUTPUTS, "speaker", 0.25);
+ voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref", 0));
+ vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT);
+}
ROM_START( gldarrow )
diff --git a/src/mame/drivers/mgames.cpp b/src/mame/drivers/mgames.cpp
index f171c7ea4ce..82e504689fc 100644
--- a/src/mame/drivers/mgames.cpp
+++ b/src/mame/drivers/mgames.cpp
@@ -23,7 +23,7 @@
FOR AMUSEMENT ONLY.
The ingenious Match Games offers something for everyone. Four captivating themes
- with brillant graphics, challenging play action, an enticing bonus feature and a
+ with brilliant graphics, challenging play action, an enticing bonus feature and a
host of options to tailor the game to any location.
Match Games is today's perfect alternative in adult video skill games...
@@ -36,19 +36,19 @@
and number combinations. Play appeal stays high as new characters are introduced.
"Wild" characters liven the action even more and build special bonus points, co-
- llected on a 5-way number match. The appeal is irresistable... Players stay hoo-
+ llected on a 5-way number match. The appeal is irresistible... Players stay hoo-
ked in for lot more action (and more earnings) for you!.
GAME THEMES:
- Match Games aknowledges every scoring combination by displaying its own special
+ Match Games acknowledges every scoring combination by displaying its own special
name keyed to each game theme.
Every time 2 "Wild" characters pop up together, special bonus symbols appear,
increasing bonus by 5 points.
- * "THE WHITE KNIGHT" features knights in armor with colores plumes and wild
+ * "THE WHITE KNIGHT" features knights in armor with colored plumes and wild
'White Knights'.
* "THE FROG POND" stars colorful and humorous frogs perched on top of mushrooms.
@@ -238,6 +238,8 @@ public:
void mgames(machine_config &config);
private:
+ tilemap_t *m_tilemap;
+
DECLARE_READ8_MEMBER(mixport_r);
DECLARE_WRITE8_MEMBER(outport0_w);
DECLARE_WRITE8_MEMBER(outport1_w);
@@ -247,12 +249,14 @@ private:
DECLARE_WRITE8_MEMBER(outport5_w);
DECLARE_WRITE8_MEMBER(outport6_w);
DECLARE_WRITE8_MEMBER(outport7_w);
+
void mgames_palette(palette_device &palette) const;
uint32_t screen_update_mgames(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
+ TILE_GET_INFO_MEMBER(tile_info);
+
void main_map(address_map &map);
- virtual void machine_start() override { m_lamps.resolve(); }
- virtual void video_start() override;
+ virtual void machine_start() override;
uint8_t m_output[8];
required_shared_ptr<uint8_t> m_video;
@@ -263,41 +267,40 @@ private:
output_finder<9> m_lamps;
};
+TILE_GET_INFO_MEMBER( mgames_state::tile_info )
+{
+ uint8_t code = m_video[tile_index];
+ uint8_t color = m_video[tile_index + 0x400] & 0x3f;
-void mgames_state::video_start()
+ SET_TILE_INFO_MEMBER(0, code, color, 0);
+}
+
+void mgames_state::machine_start()
{
+ m_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(mgames_state::tile_info), this), TILEMAP_SCAN_ROWS, 16, 16, 32, 32);
+
+ m_lamps.resolve();
}
uint32_t mgames_state::screen_update_mgames(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{
- gfx_element *const gfx = m_gfxdecode->gfx(0);
+ m_tilemap->mark_all_dirty();
+ m_tilemap->draw(screen, bitmap, cliprect, 0, 0);
- int count = 0;
- for (int y = 0; y < 32; y++)
- {
- for (int x = 0; x < 32; x++)
- {
- uint16_t const dat = m_video[count];
- uint16_t const col = m_video[count + 0x400] & 0x7f;
- gfx->opaque(bitmap, cliprect, dat, col, 0, 0, x * 16, y * 16);
- count++;
- }
- }
return 0;
}
void mgames_state::mgames_palette(palette_device &palette) const
{
- for (int i = 0; i < 0x100; i++)
+ for (int i = 0; i < 64; i++)
{
- rgb_t color;
-
- if (i & 0x01)
- color = rgb_t(pal2bit((i & 0x6) >> 1), pal2bit((i & 0x18) >> 3), pal2bit((i & 0x60) >> 5));
- else
- color = rgb_t::black();
-
- palette.set_pen_color(i, color);
+ palette.set_indirect_color(i, rgb_t(
+ pal2bit((i >> 0) & 3),
+ pal2bit((i >> 2) & 3),
+ pal2bit((i >> 4) & 3)
+ ));
+ palette.set_pen_indirect(i * 2 + 0, 0); // all tiles black background
+ palette.set_pen_indirect(i * 2 + 1, i);
}
}
@@ -622,47 +625,46 @@ static INPUT_PORTS_START( mgames )
INPUT_PORTS_END
-static const gfx_layout tiles16x16_layout =
+static const gfx_layout gfx_16x16x1 =
{
16,16,
RGN_FRAC(1,1),
1,
{ 0 },
- { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 },
- { 0*16, 1*16, 2*16, 3*16, 4*16, 5*16, 6*16, 7*16,
- 8*16, 9*16, 10*16, 11*16, 12*16, 13*16, 14*16, 15*16},
+ { STEP16(0,1) },
+ { STEP16(0,16) },
16*16
};
static GFXDECODE_START( gfx_mgames )
- GFXDECODE_ENTRY( "gfx1", 0, tiles16x16_layout, 0, 0x100 )
+ GFXDECODE_ENTRY( "gfx1", 0, gfx_16x16x1, 0, 64 )
GFXDECODE_END
-MACHINE_CONFIG_START(mgames_state::mgames)
+void mgames_state::mgames(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80,MASTER_CLOCK/6) /* 3 MHz? */
- MCFG_DEVICE_PROGRAM_MAP(main_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", mgames_state, irq0_line_hold)
+ Z80(config, m_maincpu, MASTER_CLOCK/6); /* 3 MHz? */
+ m_maincpu->set_addrmap(AS_PROGRAM, &mgames_state::main_map);
+ m_maincpu->set_vblank_int("screen", FUNC(mgames_state::irq0_line_hold));
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(512, 256)
- MCFG_SCREEN_VISIBLE_AREA(0, 512-1, 0, 256-1)
- MCFG_SCREEN_UPDATE_DRIVER(mgames_state, screen_update_mgames)
- MCFG_SCREEN_PALETTE(m_palette)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(512, 256);
+ screen.set_visarea(0, 512-1, 0, 256-1);
+ screen.set_screen_update(FUNC(mgames_state::screen_update_mgames));
+ screen.set_palette(m_palette);
GFXDECODE(config, m_gfxdecode, m_palette, gfx_mgames);
- PALETTE(config, m_palette, FUNC(mgames_state::mgames_palette), 0x200);
+ PALETTE(config, m_palette, FUNC(mgames_state::mgames_palette), 128, 64);
/* sound hardware */
// to do...
-
-MACHINE_CONFIG_END
+}
ROM_START( mgames )
diff --git a/src/mame/drivers/mgavegas.cpp b/src/mame/drivers/mgavegas.cpp
index 2b0fe10a3b8..741f4ec8ce9 100644
--- a/src/mame/drivers/mgavegas.cpp
+++ b/src/mame/drivers/mgavegas.cpp
@@ -292,7 +292,7 @@ uint8_t ret=0;
switch (offset&0x03)
{
case 1: //bdir=0 BC1=1
- ret=m_ay->data_r(space,0);
+ ret=m_ay->data_r();
break;
default:
if (LOG_AY8910)
@@ -313,10 +313,10 @@ WRITE8_MEMBER(mgavegas_state::w_a0)
switch (offset&0x03)
{
case 0: //bdir=1 bc1=1
- m_ay->address_w(space,0,data );
+ m_ay->address_w(data);
break;
case 2: //bdir=1 bc1=0
- m_ay->data_w(space,0,data );
+ m_ay->data_w(data);
break;
/*
case 1: //bdir=0 bc1=1
@@ -584,41 +584,35 @@ void mgavegas_state::init_mgavegas133()
* Machine Drivers *
*************************/
-
-MACHINE_CONFIG_START(mgavegas_state::mgavegas)
+void mgavegas_state::mgavegas(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, CPU_CLK)
- MCFG_DEVICE_PROGRAM_MAP(mgavegas_map)
+ Z80(config, m_maincpu, CPU_CLK);
+ m_maincpu->set_addrmap(AS_PROGRAM, &mgavegas_state::mgavegas_map);
- MCFG_TIMER_DRIVER_ADD_PERIODIC("int_0", mgavegas_state, int_0, attotime::from_hz(6000)) //6KHz from MSM5205 /VCK
+ TIMER(config, "int_0").configure_periodic(FUNC(mgavegas_state::int_0), attotime::from_hz(6000)); //6KHz from MSM5205 /VCK
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_1);
- MCFG_TICKET_DISPENSER_ADD("hopper",attotime::from_msec(200),TICKET_MOTOR_ACTIVE_HIGH,TICKET_STATUS_ACTIVE_LOW);
+ TICKET_DISPENSER(config, "hopper", attotime::from_msec(200), TICKET_MOTOR_ACTIVE_HIGH, TICKET_STATUS_ACTIVE_LOW);
/* sound hardware */
-
SPEAKER(config, "mono").front_center();
AY8910(config, m_ay, AY_CLK);
m_ay->add_route(ALL_OUTPUTS, "mono", 0.3);
m_ay->port_a_read_callback().set(FUNC(mgavegas_state::ay8910_a_r));
m_ay->port_b_read_callback().set(FUNC(mgavegas_state::ay8910_b_r));
- MCFG_DEVICE_ADD("5205", MSM5205, MSM_CLK)
- MCFG_MSM5205_PRESCALER_SELECTOR(S64_4B)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "filter1", 2.0)
-
-
- MCFG_DEVICE_ADD("filter1", FILTER_RC)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "filter2",2.0)
- MCFG_DEVICE_ADD("filter2", FILTER_RC)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 2.0)
+ MSM5205(config, m_msm, MSM_CLK);
+ m_msm->set_prescaler_selector(msm5205_device::S64_4B);
+ m_msm->add_route(ALL_OUTPUTS, "filter1", 2.0);
+ FILTER_RC(config, "filter1").add_route(ALL_OUTPUTS, "filter2", 2.0);
+ FILTER_RC(config, "filter2").add_route(ALL_OUTPUTS, "mono", 2.0);
/* Video */
config.set_default_layout(layout_mgavegas);
-
-MACHINE_CONFIG_END
+}
/*************************
diff --git a/src/mame/drivers/mgolf.cpp b/src/mame/drivers/mgolf.cpp
index 3a496fb7fc6..cc47c4c2c9a 100644
--- a/src/mame/drivers/mgolf.cpp
+++ b/src/mame/drivers/mgolf.cpp
@@ -368,26 +368,26 @@ void mgolf_state::machine_reset()
}
-MACHINE_CONFIG_START(mgolf_state::mgolf)
-
+void mgolf_state::mgolf(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M6502, 12096000 / 16) /* ? */
- MCFG_DEVICE_PROGRAM_MAP(cpu_map)
+ M6502(config, m_maincpu, 12096000 / 16); /* ? */
+ m_maincpu->set_addrmap(AS_PROGRAM, &mgolf_state::cpu_map);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_SIZE(256, 262)
- MCFG_SCREEN_VISIBLE_AREA(0, 255, 0, 223)
- MCFG_SCREEN_UPDATE_DRIVER(mgolf_state, screen_update)
- MCFG_SCREEN_PALETTE(m_palette)
-
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, m_palette, gfx_mgolf)
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_refresh_hz(60);
+ m_screen->set_size(256, 262);
+ m_screen->set_visarea(0, 255, 0, 223);
+ m_screen->set_screen_update(FUNC(mgolf_state::screen_update));
+ m_screen->set_palette(m_palette);
+
+ GFXDECODE(config, m_gfxdecode, m_palette, gfx_mgolf);
PALETTE(config, m_palette, FUNC(mgolf_state::mgolf_palette), 4);
/* sound hardware */
-MACHINE_CONFIG_END
+}
ROM_START( mgolf )
diff --git a/src/mame/drivers/mhavoc.cpp b/src/mame/drivers/mhavoc.cpp
index 6cacca4895f..21b782f8d69 100644
--- a/src/mame/drivers/mhavoc.cpp
+++ b/src/mame/drivers/mhavoc.cpp
@@ -212,7 +212,7 @@ READ8_MEMBER(mhavoc_state::quad_pokeyn_r)
int control = (offset & 0x20) >> 2;
int pokey_reg = (offset & 0x7) | control;
- return m_pokey[pokey_num]->read(space, pokey_reg);
+ return m_pokey[pokey_num]->read(pokey_reg);
}
WRITE8_MEMBER(mhavoc_state::quad_pokeyn_w)
@@ -221,7 +221,7 @@ WRITE8_MEMBER(mhavoc_state::quad_pokeyn_w)
int control = (offset & 0x20) >> 2;
int pokey_reg = (offset & 0x7) | control;
- m_pokey[pokey_num]->write(space, pokey_reg, data);
+ m_pokey[pokey_num]->write(pokey_reg, data);
}
@@ -244,7 +244,7 @@ READ8_MEMBER(mhavoc_state::dual_pokey_r)
int control = (offset & 0x10) >> 1;
int pokey_reg = (offset & 0x7) | control;
- return m_pokey[pokey_num]->read(space, pokey_reg);
+ return m_pokey[pokey_num]->read(pokey_reg);
}
@@ -254,7 +254,7 @@ WRITE8_MEMBER(mhavoc_state::dual_pokey_w)
int control = (offset & 0x10) >> 1;
int pokey_reg = (offset & 0x7) | control;
- m_pokey[pokey_num]->write(space, pokey_reg, data);
+ m_pokey[pokey_num]->write(pokey_reg, data);
}
diff --git a/src/mame/drivers/micral.cpp b/src/mame/drivers/micral.cpp
index a7575b3d30f..6b1bab57c18 100644
--- a/src/mame/drivers/micral.cpp
+++ b/src/mame/drivers/micral.cpp
@@ -57,6 +57,7 @@ Other things...
#include "screen.h"
#include "speaker.h"
#include "machine/ay31015.h"
+#include "machine/clock.h"
#include "bus/rs232/rs232.h"
@@ -377,27 +378,28 @@ MACHINE_RESET_MEMBER( micral_state, micral )
m_uart->write_cs(0);
}
-MACHINE_CONFIG_START(micral_state::micral)
+void micral_state::micral(machine_config &config)
+{
// basic machine hardware
- MCFG_DEVICE_ADD( "maincpu", Z80, XTAL(4'000'000) )
- MCFG_DEVICE_PROGRAM_MAP(mem_map)
+ Z80(config, m_maincpu, XTAL(4'000'000));
+ m_maincpu->set_addrmap(AS_PROGRAM, &micral_state::mem_map);
// no i/o ports on main cpu
- MCFG_DEVICE_ADD( "keyboard", Z80, XTAL(1'000'000) ) // freq unknown
- MCFG_DEVICE_PROGRAM_MAP(mem_kbd)
- MCFG_DEVICE_IO_MAP(io_kbd)
+ z80_device &keyboard(Z80(config, "keyboard", XTAL(1'000'000))); // freq unknown
+ keyboard.set_addrmap(AS_PROGRAM, &micral_state::mem_kbd);
+ keyboard.set_addrmap(AS_IO, &micral_state::io_kbd);
MCFG_MACHINE_RESET_OVERRIDE(micral_state, micral)
// video hardware
- MCFG_SCREEN_ADD_MONOCHROME("screen", RASTER, rgb_t::green())
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(250))
- MCFG_SCREEN_UPDATE_DRIVER(micral_state, screen_update)
- MCFG_SCREEN_SIZE(640, 240)
- MCFG_SCREEN_VISIBLE_AREA(0, 639, 0, 239)
- MCFG_SCREEN_PALETTE("palette")
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER, rgb_t::green()));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(250));
+ screen.set_screen_update(FUNC(micral_state::screen_update));
+ screen.set_size(640, 240);
+ screen.set_visarea(0, 639, 0, 239);
+ screen.set_palette("palette");
PALETTE(config, "palette", palette_device::MONOCHROME);
- //MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_micral)
+ //GFXDECODE(config, "gfxdecode", "palette", gfx_micral);
CRT5037(config, m_crtc, 4000000 / 8); // xtal freq unknown
m_crtc->set_char_width(8); // unknown
@@ -405,17 +407,19 @@ MACHINE_CONFIG_START(micral_state::micral)
m_crtc->set_screen("screen");
/* sound hardware */
- //MCFG_SPEAKER_STANDARD_MONO("mono")
- //MCFG_DEVICE_ADD("beeper", BEEP, 2000)
- //MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.50)
+ //SPEAKER(config, "mono").front_center();
+ //BEEP(config, m_beep, 2000).add_route(ALL_OUTPUTS, "mono", 0.50);
AY31015(config, m_uart); // CDP6402
- m_uart->set_tx_clock(153600);
- m_uart->set_rx_clock(153600);
m_uart->read_si_callback().set("rs232", FUNC(rs232_port_device::rxd_r));
m_uart->write_so_callback().set("rs232", FUNC(rs232_port_device::write_txd));
+
+ clock_device &uart_clock(CLOCK(config, "uart_clock", 153600));
+ uart_clock.signal_handler().set(m_uart, FUNC(ay31015_device::write_tcp));
+ uart_clock.signal_handler().append(m_uart, FUNC(ay31015_device::write_rcp));
+
RS232_PORT(config, "rs232", default_rs232_devices, "keyboard");
-MACHINE_CONFIG_END
+}
ROM_START( micral )
ROM_REGION( 0x10000, "maincpu", 0 )
diff --git a/src/mame/drivers/micro20.cpp b/src/mame/drivers/micro20.cpp
index fc0667db97a..e08b9ec4ca3 100644
--- a/src/mame/drivers/micro20.cpp
+++ b/src/mame/drivers/micro20.cpp
@@ -165,19 +165,20 @@ static DEVICE_INPUT_DEFAULTS_START( terminal )
DEVICE_INPUT_DEFAULTS( "RS232_STOPBITS", 0xff, RS232_STOPBITS_1 )
DEVICE_INPUT_DEFAULTS_END
-MACHINE_CONFIG_START(micro20_state::micro20)
+void micro20_state::micro20(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD(MAINCPU_TAG, M68020, 16.67_MHz_XTAL)
- MCFG_DEVICE_PROGRAM_MAP(micro20_map)
+ M68020(config, m_maincpu, 16.67_MHz_XTAL);
+ m_maincpu->set_addrmap(AS_PROGRAM, &micro20_state::micro20_map);
- MCFG_DEVICE_ADD(DUART_A_TAG, MC68681, 3.6864_MHz_XTAL)
- MCFG_MC68681_A_TX_CALLBACK(WRITELINE("rs232", rs232_port_device, write_txd))
+ mc68681_device &duart_a(MC68681(config, DUART_A_TAG, 3.6864_MHz_XTAL));
+ duart_a.a_tx_cb().set("rs232", FUNC(rs232_port_device::write_txd));
rs232_port_device &rs232(RS232_PORT(config, "rs232", default_rs232_devices, "terminal"));
rs232.rxd_handler().set(DUART_A_TAG, FUNC(mc68681_device::rx_a_w));
rs232.set_option_device_input_defaults("terminal", DEVICE_INPUT_DEFAULTS_NAME(terminal));
- MCFG_DEVICE_ADD(DUART_B_TAG, MC68681, 3.6864_MHz_XTAL)
+ MC68681(config, DUART_B_TAG, 3.6864_MHz_XTAL);
WD1772(config, FDC_TAG, 16.67_MHz_XTAL / 2);
@@ -187,16 +188,16 @@ MACHINE_CONFIG_START(micro20_state::micro20)
m_pit->pb_out_callback().set(FUNC(micro20_state::portb_w));
m_pit->pc_out_callback().set(FUNC(micro20_state::portc_w));
- MCFG_DEVICE_ADD(RTC_TAG, MSM58321, 32.768_kHz_XTAL)
- MCFG_MSM58321_DEFAULT_24H(false)
- MCFG_MSM58321_D0_HANDLER(WRITELINE(PIT_TAG, pit68230_device, pb0_w))
- MCFG_MSM58321_D1_HANDLER(WRITELINE(PIT_TAG, pit68230_device, pb1_w))
- MCFG_MSM58321_D2_HANDLER(WRITELINE(PIT_TAG, pit68230_device, pb2_w))
- MCFG_MSM58321_D3_HANDLER(WRITELINE(PIT_TAG, pit68230_device, pb3_w))
- MCFG_MSM58321_BUSY_HANDLER(WRITELINE(PIT_TAG, pit68230_device, pb7_w))
+ MSM58321(config, m_rtc, 32768_Hz_XTAL);
+ m_rtc->set_default_24h(false);
+ m_rtc->d0_handler().set(m_pit, FUNC(pit68230_device::pb0_w));
+ m_rtc->d1_handler().set(m_pit, FUNC(pit68230_device::pb1_w));
+ m_rtc->d2_handler().set(m_pit, FUNC(pit68230_device::pb2_w));
+ m_rtc->d3_handler().set(m_pit, FUNC(pit68230_device::pb3_w));
+ m_rtc->busy_handler().set(m_pit, FUNC(pit68230_device::pb7_w));
- MCFG_TIMER_DRIVER_ADD_PERIODIC("timer", micro20_state, micro20_timer, attotime::from_hz(200))
-MACHINE_CONFIG_END
+ TIMER(config, "timer").configure_periodic(FUNC(micro20_state::micro20_timer), attotime::from_hz(200));
+}
static INPUT_PORTS_START( micro20 )
INPUT_PORTS_END
diff --git a/src/mame/drivers/micro3d.cpp b/src/mame/drivers/micro3d.cpp
index 6a322a88043..22e780fed92 100644
--- a/src/mame/drivers/micro3d.cpp
+++ b/src/mame/drivers/micro3d.cpp
@@ -240,7 +240,6 @@ void micro3d_state::vgbmem(address_map &map)
map(0x02e00000, 0x02e0003f).w(FUNC(micro3d_state::vgb_uart_w)).umask16(0x00ff);
map(0x03800000, 0x03dfffff).rom().region("tms_gfx", 0);
map(0x03e00000, 0x03ffffff).rom().region("tms34010", 0);
- map(0xc0000000, 0xc00001ff).rw(m_vgb, FUNC(tms34010_device::io_register_r), FUNC(tms34010_device::io_register_w));
map(0xffe00000, 0xffffffff).rom().region("tms34010", 0);
}
@@ -299,11 +298,11 @@ void micro3d_state::soundmem_io(address_map &map)
*
*************************************/
-MACHINE_CONFIG_START(micro3d_state::micro3d)
-
- MCFG_DEVICE_ADD("maincpu", M68000, 32_MHz_XTAL / 2)
- MCFG_DEVICE_PROGRAM_MAP(hostmem)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", micro3d_state, micro3d_vblank)
+void micro3d_state::micro3d(machine_config &config)
+{
+ M68000(config, m_maincpu, 32_MHz_XTAL / 2);
+ m_maincpu->set_addrmap(AS_PROGRAM, &micro3d_state::hostmem);
+ m_maincpu->set_vblank_int("screen", FUNC(micro3d_state::micro3d_vblank));
TMS34010(config, m_vgb, 40_MHz_XTAL);
m_vgb->set_addrmap(AS_PROGRAM, &micro3d_state::vgbmem);
@@ -314,9 +313,9 @@ MACHINE_CONFIG_START(micro3d_state::micro3d)
m_vgb->output_int().set(FUNC(micro3d_state::tms_interrupt));
m_vgb->set_screen("screen");
- MCFG_DEVICE_ADD("drmath", AM29000, 32_MHz_XTAL / 2)
- MCFG_DEVICE_PROGRAM_MAP(drmath_prg)
- MCFG_DEVICE_DATA_MAP(drmath_data)
+ AM29000(config, m_drmath, 32_MHz_XTAL / 2);
+ m_drmath->set_addrmap(AS_PROGRAM, &micro3d_state::drmath_prg);
+ m_drmath->set_addrmap(AS_DATA, &micro3d_state::drmath_data);
scc8530_device &scc(SCC8530N(config, "scc", 32_MHz_XTAL / 2 / 2));
scc.out_txdb_callback().set("monitor_drmath", FUNC(rs232_port_device::write_txd));
@@ -331,12 +330,12 @@ MACHINE_CONFIG_START(micro3d_state::micro3d)
m_audiocpu->serial_tx_cb().set(FUNC(micro3d_state::data_from_i8031));
m_audiocpu->serial_rx_cb().set(FUNC(micro3d_state::data_to_i8031));
- MCFG_DEVICE_ADD("duart", MC68681, 3.6864_MHz_XTAL)
- MCFG_MC68681_IRQ_CALLBACK(WRITELINE(*this, micro3d_state, duart_irq_handler))
- MCFG_MC68681_A_TX_CALLBACK(WRITELINE("monitor_host", rs232_port_device, write_txd))
- MCFG_MC68681_B_TX_CALLBACK(WRITELINE(*this, micro3d_state, duart_txb))
- MCFG_MC68681_INPORT_CALLBACK(READ8(*this, micro3d_state, duart_input_r))
- MCFG_MC68681_OUTPORT_CALLBACK(WRITE8(*this, micro3d_state, duart_output_w))
+ MC68681(config, m_duart, 3.6864_MHz_XTAL);
+ m_duart->irq_cb().set(FUNC(micro3d_state::duart_irq_handler));
+ m_duart->a_tx_cb().set("monitor_host", FUNC(rs232_port_device::write_txd));
+ m_duart->b_tx_cb().set(FUNC(micro3d_state::duart_txb));
+ m_duart->inport_cb().set(FUNC(micro3d_state::duart_input_r));
+ m_duart->outport_cb().set(FUNC(micro3d_state::duart_output_w));
mc68901_device &mfp(MC68901(config, "mfp", 4000000));
mfp.set_timer_clock(4000000);
@@ -348,14 +347,14 @@ MACHINE_CONFIG_START(micro3d_state::micro3d)
mfp.out_tco_cb().set("mfp", FUNC(mc68901_device::tbi_w));
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
- MCFG_QUANTUM_TIME(attotime::from_hz(3000))
+ config.m_minimum_quantum = attotime::from_hz(3000);
PALETTE(config, m_palette).set_format(palette_device::BRGx_555, 4096);
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_RAW_PARAMS(40_MHz_XTAL/8*4, 192*4, 0, 144*4, 434, 0, 400)
- MCFG_SCREEN_UPDATE_DEVICE("vgb", tms34010_device, tms340x0_ind16)
- MCFG_SCREEN_PALETTE(m_palette)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_raw(40_MHz_XTAL/8*4, 192*4, 0, 144*4, 434, 0, 400);
+ screen.set_screen_update("vgb", FUNC(tms34010_device::tms340x0_ind16));
+ screen.set_palette(m_palette);
MC2661(config, m_vgb_uart, 40_MHz_XTAL / 8); // actually SCN2651
m_vgb_uart->txd_handler().set("monitor_vgb", FUNC(rs232_port_device::write_txd));
@@ -394,7 +393,7 @@ MACHINE_CONFIG_START(micro3d_state::micro3d)
MICRO3D_SOUND(config, m_noise_2);
m_noise_2->add_route(0, "lspeaker", 1.0);
m_noise_2->add_route(1, "rspeaker", 1.0);
-MACHINE_CONFIG_END
+}
void micro3d_state::botss11(machine_config &config)
{
@@ -466,10 +465,10 @@ ROM_END
ROM_START( f15se21 )
/* Host PCB (MPG DW-00011C-0011-01) */
ROM_REGION( 0x180000, "maincpu", 0 )
- ROM_LOAD16_BYTE( "500.hst", 0x000001, 0x20000, CRC(6c26806d) SHA1(7cfd2b3b92b0fc6627c92a2013a317ca5abc66a0) )
- ROM_LOAD16_BYTE( "501.hst", 0x000000, 0x20000, CRC(81f02bf7) SHA1(09976746fe4d9c88bd8840f6e7addb09226aa54b) )
- ROM_LOAD16_BYTE( "502.hst", 0x040001, 0x20000, CRC(1eb945e5) SHA1(aba3ff038f2ca0f1200be5710073825ce80e3656) )
- ROM_LOAD16_BYTE( "503.hst", 0x040000, 0x20000, CRC(21fcb974) SHA1(56f78ce652e2bf432fbba8cda8c800f02dad84bb) )
+ ROM_LOAD16_BYTE( "110-00001-500.u67", 0x000001, 0x20000, CRC(6c26806d) SHA1(7cfd2b3b92b0fc6627c92a2013a317ca5abc66a0) )
+ ROM_LOAD16_BYTE( "110-00001-501.u91", 0x000000, 0x20000, CRC(81f02bf7) SHA1(09976746fe4d9c88bd8840f6e7addb09226aa54b) )
+ ROM_LOAD16_BYTE( "110-00001-502.u68", 0x040001, 0x20000, CRC(1eb945e5) SHA1(aba3ff038f2ca0f1200be5710073825ce80e3656) )
+ ROM_LOAD16_BYTE( "110-00001-503.u92", 0x040000, 0x20000, CRC(21fcb974) SHA1(56f78ce652e2bf432fbba8cda8c800f02dad84bb) )
ROM_LOAD16_BYTE( "004.hst", 0x080001, 0x20000, CRC(81671ce1) SHA1(51ff641ccbc9dea640a62944910abe73d796b062) )
ROM_LOAD16_BYTE( "005.hst", 0x080000, 0x20000, CRC(bdaa7db5) SHA1(52cd832cdd44e609e8cd269469b806e2cd27d63d) )
diff --git a/src/mame/drivers/microkit.cpp b/src/mame/drivers/microkit.cpp
index 5ae46c8736f..c57c2ceb475 100644
--- a/src/mame/drivers/microkit.cpp
+++ b/src/mame/drivers/microkit.cpp
@@ -101,7 +101,7 @@ WRITE8_MEMBER( microkit_state::ram_w )
{
m_ram_data = data;
if (data > 0 && data < 0x80)
- m_terminal->write(space, 0, data);
+ m_terminal->write(data);
}
void microkit_state::machine_reset()
diff --git a/src/mame/drivers/micromon.cpp b/src/mame/drivers/micromon.cpp
new file mode 100644
index 00000000000..6d38665db7b
--- /dev/null
+++ b/src/mame/drivers/micromon.cpp
@@ -0,0 +1,96 @@
+// license:BSD-3-Clause
+// copyright-holders:Robbbert
+/*
+
+Micromon 7141 ECG unit for hospitals.
+
+No manuals or schematic found.
+
+From the photos, we can see a CDP1802ACE CPU, 2.4576 crystal,
+a GM76C28A-10 2Kx8 static RAM (like 6116), 2 ROMS and a bunch of small chips.
+There's also 4 dipswitches in a single package. 1=on,2=off,3=off,4=on.
+The unit has an audible alarm, presumably a speaker, but it doesn't appear in any photo.
+
+The front panel has a CRT display (looks like cyan on black), some buttons with unknown
+symbols, a 5-position rotary switch, a plug for the ECG device, a socket called "Sync"
+and some LEDs.
+
+Date of manufacture unknown, however the chips have date codes of 1994 and 1995.
+
+*****************************************************************************************/
+
+#include "emu.h"
+#include "cpu/cosmac/cosmac.h"
+
+
+class micromon_state : public driver_device
+{
+public:
+ micromon_state(const machine_config &mconfig, device_type type, const char *tag)
+ : driver_device(mconfig, type, tag)
+ , m_maincpu(*this, "maincpu")
+ { }
+
+ void micromon(machine_config &config);
+
+private:
+ DECLARE_READ_LINE_MEMBER(clear_r);
+
+ void micromon_io(address_map &map);
+ void micromon_mem(address_map &map);
+
+ virtual void machine_reset() override;
+ uint8_t m_resetcnt;
+ required_device<cosmac_device> m_maincpu;
+};
+
+void micromon_state::micromon_mem(address_map &map)
+{
+ map(0x0000, 0x1fff).rom().region("maincpu", 0);
+ map(0x2000, 0x3fff).ram();
+}
+
+void micromon_state::micromon_io(address_map &map)
+{
+}
+
+static INPUT_PORTS_START( micromon )
+INPUT_PORTS_END
+
+READ_LINE_MEMBER( micromon_state::clear_r )
+{
+ if (m_resetcnt < 0x10)
+ m_maincpu->set_state_int(cosmac_device::COSMAC_R0, 0x0000);
+ if (m_resetcnt < 0x20)
+ m_resetcnt++;
+ // set reset pin to normal
+ return 1;
+}
+
+void micromon_state::machine_reset()
+{
+ m_resetcnt = 0;
+}
+
+
+void micromon_state::micromon(machine_config &config)
+{
+ // basic machine hardware
+ CDP1802(config, m_maincpu, 2457600);
+ m_maincpu->set_addrmap(AS_PROGRAM, &micromon_state::micromon_mem);
+ m_maincpu->set_addrmap(AS_IO, &micromon_state::micromon_io);
+ m_maincpu->wait_cb().set_constant(1);
+ m_maincpu->clear_cb().set(FUNC(micromon_state::clear_r));
+
+ // video hardware
+
+ // sound
+}
+
+ROM_START( micromon7141 )
+ ROM_REGION( 0x2000, "maincpu", 0 )
+ ROM_LOAD( "721421_rev4.0_25_7_95.ic2", 0x0000, 0x1000, CRC(b2a26439) SHA1(66a65d19b3cff185e82b10fc7ecb965c51751b7c) )
+ ROM_LOAD( "702423_rev4.0_25_7_95.ic41", 0x1000, 0x1000, CRC(5efe6b4b) SHA1(b3670c53e2527e824cc22e4a54db9abf5a07239f) )
+ROM_END
+
+SYST( 1995?, micromon7141, 0, 0, micromon, micromon, micromon_state, empty_init, "Kontron Instruments", "Micromon 7141 ECG unit", MACHINE_IS_SKELETON )
diff --git a/src/mame/drivers/micronic.cpp b/src/mame/drivers/micronic.cpp
index 0a89a68fb01..80789ee722a 100644
--- a/src/mame/drivers/micronic.cpp
+++ b/src/mame/drivers/micronic.cpp
@@ -200,17 +200,17 @@ WRITE8_MEMBER( micronic_state::port_2c_w )
WRITE8_MEMBER( micronic_state::rtc_address_w )
{
- m_rtc->write(space, 0, data);
+ m_rtc->write(0, data);
}
READ8_MEMBER( micronic_state::rtc_data_r )
{
- return m_rtc->read(space, 1);
+ return m_rtc->read(1);
}
WRITE8_MEMBER( micronic_state::rtc_data_w )
{
- m_rtc->write(space, 1, data);
+ m_rtc->write(1, data);
}
/***************************************************************************
@@ -349,23 +349,24 @@ WRITE_LINE_MEMBER( micronic_state::mc146818_irq )
}
-MACHINE_CONFIG_START(micronic_state::micronic)
+void micronic_state::micronic(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD(Z80_TAG, Z80, 3.579545_MHz_XTAL)
- MCFG_DEVICE_PROGRAM_MAP(micronic_mem)
- MCFG_DEVICE_IO_MAP(micronic_io)
+ Z80(config, m_maincpu, 3.579545_MHz_XTAL);
+ m_maincpu->set_addrmap(AS_PROGRAM, &micronic_state::micronic_mem);
+ m_maincpu->set_addrmap(AS_IO, &micronic_state::micronic_io);
/* video hardware */
- MCFG_SCREEN_ADD(SCREEN_TAG, LCD)
- MCFG_SCREEN_REFRESH_RATE(80)
- MCFG_SCREEN_UPDATE_DEVICE(HD61830_TAG, hd61830_device, screen_update)
- MCFG_SCREEN_SIZE(120, 64) //6x20, 8x8
- MCFG_SCREEN_VISIBLE_AREA(0, 120-1, 0, 64-1)
- MCFG_SCREEN_PALETTE("palette")
+ screen_device &screen(SCREEN(config, SCREEN_TAG, SCREEN_TYPE_LCD));
+ screen.set_refresh_hz(80);
+ screen.set_screen_update(HD61830_TAG, FUNC(hd61830_device::screen_update));
+ screen.set_size(120, 64); //6x20, 8x8
+ screen.set_visarea(0, 120-1, 0, 64-1);
+ screen.set_palette("palette");
PALETTE(config, "palette", FUNC(micronic_state::micronic_palette), 2);
- MCFG_DEVICE_ADD(HD61830_TAG, HD61830, 4.9152_MHz_XTAL / 2 / 2)
+ HD61830(config, m_lcdc, 4.9152_MHz_XTAL / 2 / 2);
/* sound hardware */
SPEAKER(config, "mono").front_center();
@@ -379,7 +380,7 @@ MACHINE_CONFIG_START(micronic_state::micronic)
MC146818(config, m_rtc, 32.768_kHz_XTAL);
m_rtc->irq().set(FUNC(micronic_state::mc146818_irq));
-MACHINE_CONFIG_END
+}
/* ROM definition */
ROM_START( micronic )
diff --git a/src/mame/drivers/micropin.cpp b/src/mame/drivers/micropin.cpp
index c0c01f897e5..19f3aff32c7 100644
--- a/src/mame/drivers/micropin.cpp
+++ b/src/mame/drivers/micropin.cpp
@@ -177,12 +177,12 @@ INPUT_PORTS_END
READ8_MEMBER( micropin_state::pia51_r )
{
- return m_pia51->read(space, offset) ^ 0xff;
+ return m_pia51->read(offset) ^ 0xff;
}
WRITE8_MEMBER( micropin_state::pia51_w )
{
- m_pia51->write(space, offset, data ^ 0xff);
+ m_pia51->write(offset, data ^ 0xff);
}
// lamps and disp strobes
@@ -298,11 +298,12 @@ void micropin_state::init_micropin()
{
}
-MACHINE_CONFIG_START(micropin_state::micropin)
+void micropin_state::micropin(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("v1cpu", M6800, XTAL(2'000'000) / 2)
- MCFG_DEVICE_PROGRAM_MAP(micropin_map)
- MCFG_DEVICE_PERIODIC_INT_DRIVER(micropin_state, irq0_line_hold, 500)
+ M6800(config, m_v1cpu, XTAL(2'000'000) / 2);
+ m_v1cpu->set_addrmap(AS_PROGRAM, &micropin_state::micropin_map);
+ m_v1cpu->set_periodic_int(FUNC(micropin_state::irq0_line_hold), attotime::from_hz(500));
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
@@ -312,8 +313,7 @@ MACHINE_CONFIG_START(micropin_state::micropin)
/* Sound */
genpin_audio(config);
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("beeper", BEEP, 387)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.50)
+ BEEP(config, m_beep, 387).add_route(ALL_OUTPUTS, "mono", 0.50);
/* Devices */
pia6821_device &pia50(PIA6821(config, "pia50", 0));
@@ -332,21 +332,22 @@ MACHINE_CONFIG_START(micropin_state::micropin)
//m_pia51->ca2_handler().set(FUNC(micropin_state::p51ca2_w));
//m_pia51->cb2_handler().set(FUNC(micropin_state::p51cb2_w));
- MCFG_TIMER_DRIVER_ADD_PERIODIC("timer_a", micropin_state, timer_a, attotime::from_hz(100))
-MACHINE_CONFIG_END
+ TIMER(config, "timer_a").configure_periodic(FUNC(micropin_state::timer_a), attotime::from_hz(100));
+}
-MACHINE_CONFIG_START(micropin_state::pentacup2)
+void micropin_state::pentacup2(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("v2cpu", I8085A, 2000000)
- MCFG_DEVICE_PROGRAM_MAP(pentacup2_map)
- MCFG_DEVICE_IO_MAP(pentacup2_io)
- //MCFG_DEVICE_PERIODIC_INT_DRIVER(micropin_state, irq2_line_hold, 50)
+ I8085A(config, m_v2cpu, 2000000);
+ m_v2cpu->set_addrmap(AS_PROGRAM, &micropin_state::pentacup2_map);
+ m_v2cpu->set_addrmap(AS_IO, &micropin_state::pentacup2_io);
+ //m_v2cpu->set_periodic_int(FUNC(micropin_state::irq2_line_hold), attotime::from_hz(50));
// NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
/* Sound */
genpin_audio(config);
-MACHINE_CONFIG_END
+}
/*-------------------------------------------------------------------
/ Pentacup
diff --git a/src/mame/drivers/microtan.cpp b/src/mame/drivers/microtan.cpp
index 16405bfab22..4366447ff27 100644
--- a/src/mame/drivers/microtan.cpp
+++ b/src/mame/drivers/microtan.cpp
@@ -209,23 +209,23 @@ GFXDECODE_END
MACHINE_CONFIG_START(microtan_state::microtan)
/* basic machine hardware */
- MCFG_DEVICE_ADD(m_maincpu, M6502, 6_MHz_XTAL / 8) // 750 kHz
- MCFG_DEVICE_PROGRAM_MAP(main_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", microtan_state, interrupt)
+ M6502(config, m_maincpu, 6_MHz_XTAL / 8); // 750 kHz
+ m_maincpu->set_addrmap(AS_PROGRAM, &microtan_state::main_map);
+ m_maincpu->set_vblank_int("screen", FUNC(microtan_state::interrupt));
// The 6502 IRQ line is active low and probably driven by open collector outputs (guess).
INPUT_MERGER_ANY_HIGH(config, m_irq_line).output_handler().set_inputline(m_maincpu, 0);
/* video hardware - include overscan */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */
- MCFG_SCREEN_SIZE(32*8, 16*16)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 0*16, 16*16-1)
- MCFG_SCREEN_UPDATE_DRIVER(microtan_state, screen_update)
- MCFG_SCREEN_PALETTE("palette")
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */
+ screen.set_size(32*8, 16*16);
+ screen.set_visarea(0*8, 32*8-1, 0*16, 16*16-1);
+ screen.set_screen_update(FUNC(microtan_state::screen_update));
+ screen.set_palette("palette");
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_microtan)
+ GFXDECODE(config, m_gfxdecode, "palette", gfx_microtan);
PALETTE(config, "palette", palette_device::MONOCHROME);
@@ -236,11 +236,11 @@ MACHINE_CONFIG_START(microtan_state::microtan)
AY8910(config, m_ay8910[1], 1000000).add_route(ALL_OUTPUTS, "speaker", 0.5);
/* snapshot/quickload */
- MCFG_SNAPSHOT_ADD("snapshot", microtan_state, microtan, "m65", 0.5)
- MCFG_QUICKLOAD_ADD("quickload", microtan_state, microtan, "hex", 0.5)
+ MCFG_SNAPSHOT_ADD("snapshot", microtan_state, microtan, "m65", attotime::from_msec(500))
+ MCFG_QUICKLOAD_ADD("quickload", microtan_state, microtan, "hex", attotime::from_msec(500))
/* cassette */
- MCFG_CASSETTE_ADD( m_cassette )
+ CASSETTE(config, m_cassette);
/* acia */
mos6551_device &acia(MOS6551(config, "acia", 0));
@@ -255,7 +255,7 @@ MACHINE_CONFIG_START(microtan_state::microtan)
m_via6522[0]->cb2_handler().set(FUNC(microtan_state::via_0_out_cb2));
m_via6522[0]->irq_handler().set(m_irq_line, FUNC(input_merger_device::in_w<IRQ_VIA_0>));
- MCFG_DEVICE_ADD(m_via6522[1], VIA6522, 6_MHz_XTAL / 8)
+ VIA6522(config, m_via6522[1], 6_MHz_XTAL / 8);
m_via6522[1]->writepa_handler().set(FUNC(microtan_state::via_1_out_a));
m_via6522[1]->writepb_handler().set(FUNC(microtan_state::via_1_out_b));
m_via6522[1]->ca2_handler().set(FUNC(microtan_state::via_1_out_ca2));
diff --git a/src/mame/drivers/microvsn.cpp b/src/mame/drivers/microvsn.cpp
index 5763dd39e11..859749f43bc 100644
--- a/src/mame/drivers/microvsn.cpp
+++ b/src/mame/drivers/microvsn.cpp
@@ -647,31 +647,32 @@ MACHINE_CONFIG_START(microvision_state::microvision)
m_tms1100->o().set(FUNC(microvision_state::tms1100_write_o));
m_tms1100->r().set(FUNC(microvision_state::tms1100_write_r));
- MCFG_SCREEN_ADD("screen", LCD)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(0)
- MCFG_QUANTUM_TIME(attotime::from_hz(60))
+ config.m_minimum_quantum = attotime::from_hz(60);
- MCFG_SCREEN_UPDATE_DRIVER(microvision_state, screen_update)
- MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE(*this, microvision_state, screen_vblank))
- MCFG_SCREEN_SIZE(16, 16)
- MCFG_SCREEN_VISIBLE_AREA(0, 15, 0, 15)
- MCFG_SCREEN_PALETTE("palette")
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_LCD));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(0);
+ screen.set_screen_update(FUNC(microvision_state::screen_update));
+ screen.screen_vblank().set(FUNC(microvision_state::screen_vblank));
+ screen.set_size(16, 16);
+ screen.set_visarea(0, 15, 0, 15);
+ screen.set_palette("palette");
PALETTE(config, "palette", FUNC(microvision_state::microvision_palette), 16);
/* sound hardware */
SPEAKER(config, "speaker").front_center();
- MCFG_DEVICE_ADD("dac", DAC_2BIT_BINARY_WEIGHTED_ONES_COMPLEMENT, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 0.25) // unknown DAC
- MCFG_DEVICE_ADD("vref", VOLTAGE_REGULATOR, 0) MCFG_VOLTAGE_REGULATOR_OUTPUT(5.0)
- MCFG_SOUND_ROUTE(0, "dac", 1.0, DAC_VREF_POS_INPUT) MCFG_SOUND_ROUTE(0, "dac", -1.0, DAC_VREF_NEG_INPUT)
+ DAC_2BIT_BINARY_WEIGHTED_ONES_COMPLEMENT(config, m_dac, 0).add_route(ALL_OUTPUTS, "speaker", 0.25); // unknown DAC
+ voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref"));
+ vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT);
+ vref.add_route(0, "dac", -1.0, DAC_VREF_NEG_INPUT);
MCFG_GENERIC_CARTSLOT_ADD("cartslot", generic_plain_slot, "microvision_cart")
MCFG_GENERIC_MANDATORY
MCFG_GENERIC_LOAD(microvision_state, microvsn_cart)
/* Software lists */
- MCFG_SOFTWARE_LIST_ADD("cart_list","microvision")
+ SOFTWARE_LIST(config, "cart_list").set_original("microvision");
MACHINE_CONFIG_END
diff --git a/src/mame/drivers/midas.cpp b/src/mame/drivers/midas.cpp
index 199a91a4c57..1120a125a73 100644
--- a/src/mame/drivers/midas.cpp
+++ b/src/mame/drivers/midas.cpp
@@ -55,6 +55,8 @@
#include "includes/neogeo.h"
#include "cpu/m68000/m68000.h"
+#include "cpu/mcs51/mcs51.h"
+#include "cpu/pic16c5x/pic16c5x.h"
#include "sound/ymz280b.h"
#include "machine/eepromser.h"
#include "machine/ticket.h"
@@ -75,7 +77,8 @@ public:
m_screen(*this, "screen"),
m_prize(*this, "prize%u", 1),
m_ticket(*this, "ticket"),
- m_zoomram(*this, "zoomtable")
+ m_zoomram(*this, "zoomtable"),
+ m_zoomtable(*this, "spritegen:zoomy")
{ }
void hammer(machine_config &config);
@@ -90,15 +93,15 @@ protected:
private:
DECLARE_READ16_MEMBER(ret_ffff);
- DECLARE_WRITE16_MEMBER(midas_gfxregs_w);
- DECLARE_WRITE16_MEMBER(livequiz_coin_w);
+ DECLARE_WRITE16_MEMBER(gfxregs_w);
+ DECLARE_WRITE8_MEMBER(livequiz_coin_w);
DECLARE_READ16_MEMBER(hammer_sensor_r);
- DECLARE_WRITE16_MEMBER(hammer_coin_w);
- DECLARE_WRITE16_MEMBER(hammer_motor_w);
- DECLARE_WRITE16_MEMBER(midas_eeprom_w);
- DECLARE_WRITE16_MEMBER(midas_zoomtable_w);
+ DECLARE_WRITE8_MEMBER(hammer_coin_w);
+ DECLARE_WRITE8_MEMBER(hammer_motor_w);
+ DECLARE_WRITE8_MEMBER(eeprom_w);
+ DECLARE_WRITE16_MEMBER(zoomtable_w);
- uint32_t screen_update_midas(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
+ uint32_t screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
required_device<cpu_device> m_maincpu;
required_device<eeprom_serial_93cxx_device> m_eeprom;
required_device<gfxdecode_device> m_gfxdecode;
@@ -108,8 +111,9 @@ private:
optional_device_array<ticket_dispenser_device, 2> m_prize;
optional_device<ticket_dispenser_device> m_ticket;
required_shared_ptr<uint16_t> m_zoomram;
+ required_region_ptr<uint8_t> m_zoomtable;
- DECLARE_WRITE_LINE_MEMBER(screen_vblank_midas);
+ DECLARE_WRITE_LINE_MEMBER(screen_vblank);
void hammer_map(address_map &map);
void livequiz_map(address_map &map);
@@ -122,7 +126,7 @@ void midas_state::video_start()
{
}
-uint32_t midas_state::screen_update_midas(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect)
+uint32_t midas_state::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect)
{
// fill with background color first
bitmap.fill(0x0, cliprect);
@@ -134,19 +138,16 @@ uint32_t midas_state::screen_update_midas(screen_device &screen, bitmap_rgb32 &b
return 0;
}
-WRITE16_MEMBER(midas_state::midas_eeprom_w)
+WRITE8_MEMBER(midas_state::eeprom_w)
{
- if (ACCESSING_BITS_0_7)
- {
- // latch the bit
- m_eeprom->di_write((data & 0x04) >> 2);
+ // latch the bit
+ m_eeprom->di_write((data & 0x04) >> 2);
- // reset line asserted: reset.
- m_eeprom->cs_write((data & 0x01) ? ASSERT_LINE : CLEAR_LINE );
+ // reset line asserted: reset.
+ m_eeprom->cs_write((data & 0x01) ? ASSERT_LINE : CLEAR_LINE );
- // clock line asserted: write latch or select next bit to read
- m_eeprom->clk_write((data & 0x02) ? ASSERT_LINE : CLEAR_LINE );
- }
+ // clock line asserted: write latch or select next bit to read
+ m_eeprom->clk_write((data & 0x02) ? ASSERT_LINE : CLEAR_LINE );
}
READ16_MEMBER(midas_state::ret_ffff)
@@ -154,7 +155,7 @@ READ16_MEMBER(midas_state::ret_ffff)
return 0xffff;
}
-WRITE16_MEMBER(midas_state::midas_gfxregs_w)
+WRITE16_MEMBER(midas_state::gfxregs_w)
{
/* accessing the LSB only is not mapped */
if (mem_mask != 0x00ff)
@@ -172,15 +173,14 @@ WRITE16_MEMBER(midas_state::midas_gfxregs_w)
}
}
-WRITE16_MEMBER(midas_state::midas_zoomtable_w)
+WRITE16_MEMBER(midas_state::zoomtable_w)
{
COMBINE_DATA(&m_zoomram[offset]);
- uint8_t *rgn = memregion("zoomy")->base();
if (ACCESSING_BITS_0_7)
{
- rgn[offset+0x00000] = data & 0xff;
- rgn[offset+0x10000] = data & 0xff;
+ m_zoomtable[offset+0x00000] = data & 0xff;
+ m_zoomtable[offset+0x10000] = data & 0xff;
}
}
@@ -188,12 +188,9 @@ WRITE16_MEMBER(midas_state::midas_zoomtable_w)
Live Quiz Show
***************************************************************************************/
-WRITE16_MEMBER(midas_state::livequiz_coin_w)
+WRITE8_MEMBER(midas_state::livequiz_coin_w)
{
- if (ACCESSING_BITS_0_7)
- {
- machine().bookkeeping().coin_counter_w(0, data & 0x0001);
- }
+ machine().bookkeeping().coin_counter_w(0, data & 0x0001);
#ifdef MAME_DEBUG
// popmessage("coin %04X", data);
#endif
@@ -208,11 +205,11 @@ void midas_state::livequiz_map(address_map &map)
map(0x940000, 0x940001).portr("PLAYER2");
map(0x980000, 0x980001).portr("START");
- map(0x980000, 0x980001).w(FUNC(midas_state::livequiz_coin_w));
+ map(0x980001, 0x980001).w(FUNC(midas_state::livequiz_coin_w));
- map(0x9a0000, 0x9a0001).w(FUNC(midas_state::midas_eeprom_w));
+ map(0x9a0001, 0x9a0001).w(FUNC(midas_state::eeprom_w));
- map(0x9c0000, 0x9c0005).w(FUNC(midas_state::midas_gfxregs_w));
+ map(0x9c0000, 0x9c0005).w(FUNC(midas_state::gfxregs_w));
map(0x9c000c, 0x9c000d).nopw(); // IRQ Ack, temporary
map(0xa00000, 0xa3ffff).ram().w(m_palette, FUNC(palette_device::write16)).share("palette");
@@ -228,7 +225,7 @@ void midas_state::livequiz_map(address_map &map)
map(0xba0000, 0xba0001).portr("START3");
map(0xbc0000, 0xbc0001).portr("PLAYER3");
- map(0xd00000, 0xd1ffff).ram().w(FUNC(midas_state::midas_zoomtable_w)).share("zoomtable"); // zoom table?
+ map(0xd00000, 0xd1ffff).ram().w(FUNC(midas_state::zoomtable_w)).share("zoomtable"); // zoom table?
map(0xe00000, 0xe3ffff).ram();
}
@@ -245,27 +242,21 @@ READ16_MEMBER(midas_state::hammer_sensor_r)
return (ioport("SENSORY")->read() << 8) | ioport("SENSORX")->read();
}
-WRITE16_MEMBER(midas_state::hammer_coin_w)
+WRITE8_MEMBER(midas_state::hammer_coin_w)
{
- if (ACCESSING_BITS_0_7)
- {
- machine().bookkeeping().coin_counter_w(0, BIT(data, 0));
- machine().bookkeeping().coin_counter_w(1, BIT(data, 1));
- }
+ machine().bookkeeping().coin_counter_w(0, BIT(data, 0));
+ machine().bookkeeping().coin_counter_w(1, BIT(data, 1));
#ifdef MAME_DEBUG
// popmessage("coin %04X", data);
#endif
}
-WRITE16_MEMBER(midas_state::hammer_motor_w)
+WRITE8_MEMBER(midas_state::hammer_motor_w)
{
- if (ACCESSING_BITS_0_7)
- {
- m_prize[0]->motor_w(BIT(data, 0));
- m_prize[1]->motor_w(BIT(data, 1));
- m_ticket->motor_w(BIT(data, 4));
- // data & 0x0080 ?
- }
+ m_prize[0]->motor_w(BIT(data, 0));
+ m_prize[1]->motor_w(BIT(data, 1));
+ m_ticket->motor_w(BIT(data, 4));
+ // data & 0x0080 ?
#ifdef MAME_DEBUG
// popmessage("motor %04X", data);
#endif
@@ -280,11 +271,11 @@ void midas_state::hammer_map(address_map &map)
map(0x940000, 0x940001).portr("IN0");
map(0x980000, 0x980001).portr("TILT");
- map(0x980000, 0x980001).w(FUNC(midas_state::hammer_coin_w));
+ map(0x980001, 0x980001).w(FUNC(midas_state::hammer_coin_w));
- map(0x9a0000, 0x9a0001).w(FUNC(midas_state::midas_eeprom_w));
+ map(0x9a0001, 0x9a0001).w(FUNC(midas_state::eeprom_w));
- map(0x9c0000, 0x9c0005).w(FUNC(midas_state::midas_gfxregs_w));
+ map(0x9c0000, 0x9c0005).w(FUNC(midas_state::gfxregs_w));
map(0x9c000c, 0x9c000d).nopw(); // IRQ Ack, temporary
map(0xa00000, 0xa3ffff).ram().w(m_palette, FUNC(palette_device::write16)).share("palette");
@@ -300,11 +291,11 @@ void midas_state::hammer_map(address_map &map)
map(0xba0000, 0xba0001).portr("IN1");
map(0xbc0000, 0xbc0001).portr("HAMMER");
- map(0xbc0002, 0xbc0003).w(FUNC(midas_state::hammer_motor_w));
+ map(0xbc0003, 0xbc0003).w(FUNC(midas_state::hammer_motor_w));
map(0xbc0004, 0xbc0005).r(FUNC(midas_state::hammer_sensor_r));
- map(0xd00000, 0xd1ffff).ram().w(FUNC(midas_state::midas_zoomtable_w)).share("zoomtable"); // zoom table?
+ map(0xd00000, 0xd1ffff).ram().w(FUNC(midas_state::zoomtable_w)).share("zoomtable"); // zoom table?
map(0xe00000, 0xe3ffff).ram();
}
@@ -614,7 +605,6 @@ INPUT_PORTS_END
void midas_state::machine_start()
{
m_sprgen->set_pens(m_palette->pens());
- m_sprgen->set_screen(m_screen);
m_sprgen->set_sprite_region(memregion("sprites")->base(), memregion("sprites")->bytes());
m_sprgen->set_fixed_regions(memregion("tiles")->base(), memregion("tiles")->bytes(), memregion("tiles"));
m_sprgen->neogeo_set_fixed_layer_source(0); // temporary: ensure banking is disabled
@@ -624,29 +614,35 @@ void midas_state::machine_reset()
{
}
-WRITE_LINE_MEMBER(midas_state::screen_vblank_midas)
+WRITE_LINE_MEMBER(midas_state::screen_vblank)
{
if (state) m_sprgen->buffer_vram();
}
-MACHINE_CONFIG_START(midas_state::livequiz)
-
+void midas_state::livequiz(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M68000, XTAL(24'000'000) / 2)
- MCFG_DEVICE_PROGRAM_MAP(livequiz_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", midas_state, irq1_line_hold)
+ M68000(config, m_maincpu, XTAL(24'000'000) / 2);
+ m_maincpu->set_addrmap(AS_PROGRAM, &midas_state::livequiz_map);
+ m_maincpu->set_vblank_int("screen", FUNC(midas_state::irq1_line_hold));
- EEPROM_93C46_16BIT(config, "eeprom");
+ pic16c56_device &pic1(PIC16C56(config, "pic1", XTAL(24'000'000) / 6)); // !! PIC12C508 !! unknown MHz
+ pic1.set_disable(); // Currently not hooked up
+
+ pic16c56_device &pic2(PIC16C56(config, "pic2", XTAL(24'000'000) / 6)); // !! PIC12C508 !! unknown MHz
+ pic2.set_disable(); // Currently not hooked up
+
+ EEPROM_93C46_16BIT(config, m_eeprom);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_RAW_PARAMS(NEOGEO_PIXEL_CLOCK, NEOGEO_HTOTAL, NEOGEO_HBEND, NEOGEO_HBSTART, NEOGEO_VTOTAL, NEOGEO_VBEND, NEOGEO_VBSTART)
- MCFG_SCREEN_UPDATE_DRIVER(midas_state, screen_update_midas)
- MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE(*this, midas_state, screen_vblank_midas))
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_raw(NEOGEO_PIXEL_CLOCK, NEOGEO_HTOTAL, NEOGEO_HBEND, NEOGEO_HBSTART, NEOGEO_VTOTAL, NEOGEO_VBEND, NEOGEO_VBSTART);
+ m_screen->set_screen_update(FUNC(midas_state::screen_update));
+ m_screen->screen_vblank().set(FUNC(midas_state::screen_vblank));
- MCFG_DEVICE_ADD("spritegen", NEOGEO_SPRITE_MIDAS, 0)
+ NEOGEO_SPRITE_MIDAS(config, m_sprgen, 0).set_screen(m_screen);
GFXDECODE(config, m_gfxdecode, m_palette, gfx_midas);
PALETTE(config, m_palette).set_format(palette_device::xRGB_888, 0x10000);
@@ -654,42 +650,53 @@ MACHINE_CONFIG_START(midas_state::livequiz)
/* sound hardware */
SPEAKER(config, "lspeaker").front_left();
SPEAKER(config, "rspeaker").front_right();
- MCFG_DEVICE_ADD("ymz", YMZ280B, XTAL(16'934'400))
- MCFG_SOUND_ROUTE(0, "lspeaker", 0.80)
- MCFG_SOUND_ROUTE(1, "rspeaker", 0.80)
-MACHINE_CONFIG_END
-MACHINE_CONFIG_START(midas_state::hammer)
+ ymz280b_device &ymz(YMZ280B(config, "ymz", XTAL(16'934'400)));
+ ymz.add_route(0, "lspeaker", 0.80);
+ ymz.add_route(1, "rspeaker", 0.80);
+}
+void midas_state::hammer(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M68000, XTAL(28'000'000) / 2)
- MCFG_DEVICE_PROGRAM_MAP(hammer_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", midas_state, irq1_line_hold)
+ M68000(config, m_maincpu, XTAL(28'000'000) / 2);
+ m_maincpu->set_addrmap(AS_PROGRAM, &midas_state::hammer_map);
+ m_maincpu->set_vblank_int("screen", FUNC(midas_state::irq1_line_hold));
+
+ at89c52_device &mcu(AT89C52(config, "mcu", XTAL(24'000'000) / 2)); // on top board, unknown MHz
+ mcu.set_disable(); // Currently not hooked up
+
+ EEPROM_93C46_16BIT(config, m_eeprom);
+
+ TICKET_DISPENSER(config, m_prize[0], 0);
+ m_prize[0]->set_period(attotime::from_msec(1000*5));
+ m_prize[0]->set_senses(TICKET_MOTOR_ACTIVE_HIGH, TICKET_STATUS_ACTIVE_LOW, false);
- EEPROM_93C46_16BIT(config, "eeprom");
+ TICKET_DISPENSER(config, m_prize[1], 0);
+ m_prize[1]->set_period(attotime::from_msec(1000*5));
+ m_prize[1]->set_senses(TICKET_MOTOR_ACTIVE_HIGH, TICKET_STATUS_ACTIVE_LOW, false);
- MCFG_TICKET_DISPENSER_ADD("prize1", attotime::from_msec(1000*5), TICKET_MOTOR_ACTIVE_HIGH, TICKET_STATUS_ACTIVE_LOW )
- MCFG_TICKET_DISPENSER_ADD("prize2", attotime::from_msec(1000*5), TICKET_MOTOR_ACTIVE_HIGH, TICKET_STATUS_ACTIVE_LOW )
- MCFG_TICKET_DISPENSER_ADD("ticket", attotime::from_msec(200), TICKET_MOTOR_ACTIVE_HIGH, TICKET_STATUS_ACTIVE_LOW )
+ TICKET_DISPENSER(config, m_ticket, 0);
+ m_ticket->set_period(attotime::from_msec(200));
+ m_ticket->set_senses(TICKET_MOTOR_ACTIVE_HIGH, TICKET_STATUS_ACTIVE_LOW, false);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_RAW_PARAMS(NEOGEO_PIXEL_CLOCK, NEOGEO_HTOTAL, NEOGEO_HBEND, NEOGEO_HBSTART, NEOGEO_VTOTAL, NEOGEO_VBEND, NEOGEO_VBSTART)
- MCFG_SCREEN_UPDATE_DRIVER(midas_state, screen_update_midas)
- MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE(*this, midas_state, screen_vblank_midas))
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_raw(NEOGEO_PIXEL_CLOCK, NEOGEO_HTOTAL, NEOGEO_HBEND, NEOGEO_HBSTART, NEOGEO_VTOTAL, NEOGEO_VBEND, NEOGEO_VBSTART);
+ m_screen->set_screen_update(FUNC(midas_state::screen_update));
+ m_screen->screen_vblank().set(FUNC(midas_state::screen_vblank));
- MCFG_DEVICE_ADD("spritegen", NEOGEO_SPRITE_MIDAS, 0)
+ NEOGEO_SPRITE_MIDAS(config, m_sprgen, 0).set_screen(m_screen);
GFXDECODE(config, m_gfxdecode, m_palette, gfx_midas);
PALETTE(config, m_palette).set_format(palette_device::xRGB_888, 0x10000);
/* sound hardware */
- SPEAKER(config, "lspeaker").front_left();
- SPEAKER(config, "rspeaker").front_right();
- MCFG_DEVICE_ADD("ymz", YMZ280B, XTAL(16'934'400))
- MCFG_SOUND_ROUTE(0, "lspeaker", 0.80)
- MCFG_SOUND_ROUTE(1, "rspeaker", 0.80)
-MACHINE_CONFIG_END
+ SPEAKER(config, "mono").front_center(); // stereo outputs aren't exists?
+
+ ymz280b_device &ymz(YMZ280B(config, "ymz", XTAL(16'934'400)));
+ ymz.add_route(ALL_OUTPUTS, "mono", 0.80);
+}
/***************************************************************************************
@@ -784,8 +791,10 @@ ROM_START( livequiz )
ROM_REGION( 0x200000, "maincpu", 0 )
ROM_LOAD16_WORD_SWAP( "flash.u1", 0x000000, 0x200000, CRC(8ec44493) SHA1(a987886cb87ac0a744f01f2e4a7cc6d12efeaa04) )
- ROM_REGION( 0x200000, "pic", 0 )
+ ROM_REGION( 0x000800, "pic1", 0 )
ROM_LOAD( "main_pic12c508a.u27", 0x000000, 0x000400, CRC(a84f0a7e) SHA1(fb27c05fb27b98ca603697e1be214dc6c8d5f884) )
+
+ ROM_REGION( 0x000800, "pic2", 0 )
ROM_LOAD( "sub_pic12c508a.u4", 0x000000, 0x000400, CRC(e52ebdc4) SHA1(0f3af66b5ea184e49188e74a873699324a3930f1) )
ROM_REGION( 0x800000, "sprites", 0 )
@@ -800,7 +809,7 @@ ROM_START( livequiz )
ROM_REGION( 0x200000, "ymz", 0 )
ROM_LOAD( "flash.u5", 0x000000, 0x200000, CRC(dc062792) SHA1(ec415c918c47ce9d181f014cde317af5717600e4) )
- ROM_REGION( 0x20000, "zoomy", ROMREGION_ERASE00 )
+ ROM_REGION( 0x20000, "spritegen:zoomy", ROMREGION_ERASE00 )
/* uploaded */
ROM_END
@@ -874,6 +883,9 @@ ROM_START( hammer )
ROM_REGION( 0x200000, "maincpu", 0 )
ROM_LOAD16_WORD_SWAP( "p.u22", 0x000000, 0x200000, CRC(687f1596) SHA1(3dc5fb0af1e8c4f3a42ce4aad39635b1111831d8) )
+ ROM_REGION( 0x002000, "mcu", 0 )
+ ROM_LOAD( "hammer_at89c52", 0x000000, 0x002000, NO_DUMP )
+
ROM_REGION( 0x1000000, "sprites", 0 )
ROM_LOAD64_WORD( "a0l.u44", 0x000000, 0x200000, CRC(b9cafd81) SHA1(24698970d1aea0907e2963c872ce61077f44c3af) )
ROM_LOAD64_WORD( "a0h.u46", 0x800000, 0x200000, CRC(f60f188b) SHA1(486f26c473b46efb402662b2f374e361cd7b4284) )
@@ -895,7 +907,7 @@ ROM_START( hammer )
ROM_LOAD( "s0.u25", 0x000000, 0x200000, CRC(c049a3e0) SHA1(0c7016c3128c170a84ad3f92fad1165775210e3d) )
ROM_LOAD( "s1.u26", 0x200000, 0x200000, CRC(9cc4b3ec) SHA1(b91a8747074a1032eb7f70a015d394fe8e896d7e) )
- ROM_REGION( 0x20000, "zoomy", ROMREGION_ERASE00 )
+ ROM_REGION( 0x20000, "spritegen:zoomy", ROMREGION_ERASE00 )
/* uploaded */
ROM_END
diff --git a/src/mame/drivers/midqslvr.cpp b/src/mame/drivers/midqslvr.cpp
index 20024e51f4c..af25727af8e 100644
--- a/src/mame/drivers/midqslvr.cpp
+++ b/src/mame/drivers/midqslvr.cpp
@@ -418,10 +418,10 @@ void midqslvr_state::machine_reset()
}
MACHINE_CONFIG_START(midqslvr_state::midqslvr)
- MCFG_DEVICE_ADD("maincpu", PENTIUM, 333000000) // actually Celeron 333
- MCFG_DEVICE_PROGRAM_MAP(midqslvr_map)
- MCFG_DEVICE_IO_MAP(midqslvr_io)
- MCFG_DEVICE_IRQ_ACKNOWLEDGE_DEVICE("pic8259_1", pic8259_device, inta_cb)
+ PENTIUM(config, m_maincpu, 333000000); // actually Celeron 333
+ m_maincpu->set_addrmap(AS_PROGRAM, &midqslvr_state::midqslvr_map);
+ m_maincpu->set_addrmap(AS_IO, &midqslvr_state::midqslvr_io);
+ m_maincpu->set_irq_acknowledge_callback("pic8259_1", FUNC(pic8259_device::inta_cb));
pcat_common(config);
diff --git a/src/mame/drivers/midtunit.cpp b/src/mame/drivers/midtunit.cpp
index 7bfafb19de8..4d37fffd7ec 100644
--- a/src/mame/drivers/midtunit.cpp
+++ b/src/mame/drivers/midtunit.cpp
@@ -65,7 +65,6 @@ void midtunit_state::main_map(address_map &map)
map(0x01f00000, 0x01f0001f).w(m_video, FUNC(midtunit_video_device::midtunit_control_w));
map(0x02000000, 0x07ffffff).r(m_video, FUNC(midtunit_video_device::midtunit_gfxrom_r)).share("gfxrom");
map(0x1f800000, 0x1fffffff).rom().region("maincpu", 0); /* mirror used by MK */
- map(0xc0000000, 0xc00001ff).rw("maincpu", FUNC(tms34010_device::io_register_r), FUNC(tms34010_device::io_register_w));
map(0xff800000, 0xffffffff).rom().region("maincpu", 0);
}
diff --git a/src/mame/drivers/midvunit.cpp b/src/mame/drivers/midvunit.cpp
index 43dc19af1cf..6bcbf5272f1 100644
--- a/src/mame/drivers/midvunit.cpp
+++ b/src/mame/drivers/midvunit.cpp
@@ -121,7 +121,7 @@ READ32_MEMBER(midvunit_state::port0_r)
READ32_MEMBER( midvunit_state::adc_r )
{
if (!(m_control_data & 0x40))
- return m_adc->read(space, 0) << m_adc_shift;
+ return m_adc->read() << m_adc_shift;
else
logerror("adc_r without enabling reads!\n");
@@ -131,7 +131,7 @@ READ32_MEMBER( midvunit_state::adc_r )
WRITE32_MEMBER( midvunit_state::adc_w )
{
if (!(m_control_data & 0x20))
- m_adc->write(space, 0, data >> m_adc_shift);
+ m_adc->write(data >> m_adc_shift);
else
logerror("adc_w without enabling writes!\n");
}
@@ -280,14 +280,14 @@ WRITE32_MEMBER(midvunit_state::tms32031_control_w)
READ32_MEMBER(midvunit_state::crusnwld_serial_status_r)
{
- uint16_t in1 = (m_in1->read() & 0x7fff) | (m_midway_serial_pic->status_r(space,0) << 15);
+ uint16_t in1 = (m_in1->read() & 0x7fff) | (m_midway_serial_pic->status_r() << 15);
return in1 | in1 << 16;
}
READ32_MEMBER(midvunit_state::crusnwld_serial_data_r)
{
- return m_midway_serial_pic->read(space,0) << 16;
+ return m_midway_serial_pic->read() << 16;
}
@@ -298,7 +298,7 @@ WRITE32_MEMBER(midvunit_state::crusnwld_serial_data_w)
m_midway_serial_pic->reset_w(1);
m_midway_serial_pic->reset_w(0);
}
- m_midway_serial_pic->write(space,0,data >> 16);
+ m_midway_serial_pic->write(data >> 16);
}
@@ -342,20 +342,20 @@ WRITE32_MEMBER(midvunit_state::bit_reset_w)
READ32_MEMBER(midvunit_state::offroadc_serial_status_r)
{
- uint16_t in1 = (m_in1->read() & 0x7fff) | (m_midway_serial_pic2->status_r(space,0) << 15);
+ uint16_t in1 = (m_in1->read() & 0x7fff) | (m_midway_serial_pic2->status_r() << 15);
return in1 | in1 << 16;
}
READ32_MEMBER(midvunit_state::offroadc_serial_data_r)
{
- return m_midway_serial_pic2->read(space, 0) << 16;
+ return m_midway_serial_pic2->read() << 16;
}
WRITE32_MEMBER(midvunit_state::offroadc_serial_data_w)
{
- m_midway_serial_pic2->write(space, 0, data >> 16);
+ m_midway_serial_pic2->write(data >> 16);
}
READ32_MEMBER(midvunit_state::midvunit_wheel_board_r)
@@ -1055,27 +1055,27 @@ INPUT_PORTS_END
*
*************************************/
-MACHINE_CONFIG_START(midvunit_state::midvcommon)
-
+void midvunit_state::midvcommon(machine_config &config)
+{
/* basic machine hardware */
TMS32031(config, m_maincpu, CPU_CLOCK);
m_maincpu->set_addrmap(AS_PROGRAM, &midvunit_state::midvunit_map);
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_1);
- MCFG_TIMER_ADD_NONE("timer0")
- MCFG_TIMER_ADD_NONE("timer1")
+ TIMER(config, "timer0").configure_generic(timer_device::expired_delegate());
+ TIMER(config, "timer1").configure_generic(timer_device::expired_delegate());
WATCHDOG_TIMER(config, m_watchdog);
/* video hardware */
- MCFG_PALETTE_ADD("palette", 32768)
+ PALETTE(config, m_palette).set_entries(32768);
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_RAW_PARAMS(MIDVUNIT_VIDEO_CLOCK/2, 666, 0, 512, 432, 0, 400)
- MCFG_SCREEN_UPDATE_DRIVER(midvunit_state, screen_update_midvunit)
- MCFG_SCREEN_PALETTE("palette")
-MACHINE_CONFIG_END
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_raw(MIDVUNIT_VIDEO_CLOCK/2, 666, 0, 512, 432, 0, 400);
+ m_screen->set_screen_update(FUNC(midvunit_state::screen_update_midvunit));
+ m_screen->set_palette(m_palette);
+}
void midvunit_state::midvunit(machine_config &config)
@@ -1110,7 +1110,8 @@ void midvunit_state::offroadc(machine_config &config)
m_midway_serial_pic2->set_yearoffs(94);
}
-MACHINE_CONFIG_START(midvunit_state::midvplus)
+void midvunit_state::midvplus(machine_config &config)
+{
midvcommon(config);
/* basic machine hardware */
@@ -1131,7 +1132,7 @@ MACHINE_CONFIG_START(midvunit_state::midvplus)
DCS2_AUDIO_2115(config, m_dcs, 0);
m_dcs->set_dram_in_mb(2);
m_dcs->set_polling_offset(0x3839);
-MACHINE_CONFIG_END
+}
diff --git a/src/mame/drivers/midwunit.cpp b/src/mame/drivers/midwunit.cpp
index 0925f6c168a..1f7cbed2a9b 100644
--- a/src/mame/drivers/midwunit.cpp
+++ b/src/mame/drivers/midwunit.cpp
@@ -126,7 +126,6 @@ void midwunit_state::main_map(address_map &map)
map(0x01a00000, 0x01a000ff).mirror(0x00080000).rw(m_video, FUNC(midwunit_video_device::midtunit_dma_r), FUNC(midwunit_video_device::midtunit_dma_w));
map(0x01b00000, 0x01b0001f).rw(m_video, FUNC(midwunit_video_device::midwunit_control_r), FUNC(midwunit_video_device::midwunit_control_w));
map(0x02000000, 0x06ffffff).r(m_video, FUNC(midwunit_video_device::midwunit_gfxrom_r));
- map(0xc0000000, 0xc00001ff).rw("maincpu", FUNC(tms34010_device::io_register_r), FUNC(tms34010_device::io_register_w));
map(0xff800000, 0xffffffff).rom().region("maincpu", 0);
}
diff --git a/src/mame/drivers/midxunit.cpp b/src/mame/drivers/midxunit.cpp
index 700457a87c7..34d4dc0f281 100644
--- a/src/mame/drivers/midxunit.cpp
+++ b/src/mame/drivers/midxunit.cpp
@@ -122,7 +122,6 @@ void midxunit_state::main_map(address_map &map)
map(0x80c00000, 0x80c000ff).rw(FUNC(midxunit_state::midxunit_uart_r), FUNC(midxunit_state::midxunit_uart_w));
map(0xa0440000, 0xa047ffff).rw(FUNC(midxunit_state::midxunit_cmos_r), FUNC(midxunit_state::midxunit_cmos_w)).share("nvram");
map(0xa0800000, 0xa08fffff).rw(m_video, FUNC(midxunit_video_device::midxunit_paletteram_r), FUNC(midxunit_video_device::midxunit_paletteram_w)).share("palette");
- map(0xc0000000, 0xc00003ff).rw("maincpu", FUNC(tms34020_device::io_register_r), FUNC(tms34020_device::io_register_w));
map(0xc0800000, 0xc08000ff).mirror(0x00400000).rw(m_video, FUNC(midxunit_video_device::midtunit_dma_r), FUNC(midxunit_video_device::midtunit_dma_w));
map(0xf8000000, 0xfeffffff).r(m_video, FUNC(midxunit_video_device::midwunit_gfxrom_r));
map(0xff000000, 0xffffffff).rom().region("maincpu", 0);
diff --git a/src/mame/drivers/midyunit.cpp b/src/mame/drivers/midyunit.cpp
index 8a63bfb2fd1..4d35c966546 100644
--- a/src/mame/drivers/midyunit.cpp
+++ b/src/mame/drivers/midyunit.cpp
@@ -155,13 +155,13 @@ WRITE8_MEMBER(midyunit_state::yawdim_oki_bank_w)
CUSTOM_INPUT_MEMBER(midyunit_state::narc_talkback_strobe_r)
{
- return (m_narc_sound->read(machine().dummy_space(), 0) >> 8) & 1;
+ return (m_narc_sound->read() >> 8) & 1;
}
CUSTOM_INPUT_MEMBER(midyunit_state::narc_talkback_data_r)
{
- return m_narc_sound->read(machine().dummy_space(), 0) & 0xff;
+ return m_narc_sound->read() & 0xff;
}
@@ -190,7 +190,6 @@ void midyunit_state::main_map(address_map &map)
map(0x01e00000, 0x01e0001f).w(FUNC(midyunit_state::midyunit_sound_w));
map(0x01f00000, 0x01f0001f).w(FUNC(midyunit_state::midyunit_control_w));
map(0x02000000, 0x05ffffff).r(FUNC(midyunit_state::midyunit_gfxrom_r)).share("gfx_rom");
- map(0xc0000000, 0xc00001ff).rw("maincpu", FUNC(tms34010_device::io_register_r), FUNC(tms34010_device::io_register_w));
map(0xff800000, 0xffffffff).rom().region("user1", 0);
}
@@ -1099,8 +1098,8 @@ INPUT_PORTS_END
*
*************************************/
-MACHINE_CONFIG_START(midyunit_state::zunit)
-
+void midyunit_state::zunit(machine_config &config)
+{
/* basic machine hardware */
TMS34010(config, m_maincpu, FAST_MASTER_CLOCK);
m_maincpu->set_addrmap(AS_PROGRAM, &midyunit_state::main_map);
@@ -1115,24 +1114,24 @@ MACHINE_CONFIG_START(midyunit_state::zunit)
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
/* video hardware */
- MCFG_PALETTE_ADD("palette", 8192)
+ PALETTE(config, m_palette).set_entries(8192);
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_VIDEO_ATTRIBUTES(VIDEO_ALWAYS_UPDATE)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_video_attributes(VIDEO_ALWAYS_UPDATE);
// from TMS340 registers
- MCFG_SCREEN_RAW_PARAMS(MEDRES_PIXEL_CLOCK*2, 674, 122, 634, 433, 27, 427)
- MCFG_SCREEN_UPDATE_DEVICE("maincpu", tms34010_device, tms340x0_ind16)
- MCFG_SCREEN_PALETTE("palette")
+ screen.set_raw(MEDRES_PIXEL_CLOCK*2, 674, 122, 634, 433, 27, 427);
+ screen.set_screen_update("maincpu", FUNC(tms34010_device::tms340x0_ind16));
+ screen.set_palette(m_palette);
MCFG_VIDEO_START_OVERRIDE(midyunit_state,midzunit)
/* sound hardware */
SPEAKER(config, "lspeaker").front_left();
SPEAKER(config, "rspeaker").front_right();
- MCFG_DEVICE_ADD("narcsnd", WILLIAMS_NARC_SOUND)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 1.0)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 1.0)
-MACHINE_CONFIG_END
+ WILLIAMS_NARC_SOUND(config, m_narc_sound);
+ m_narc_sound->add_route(ALL_OUTPUTS, "lspeaker", 1.0);
+ m_narc_sound->add_route(ALL_OUTPUTS, "rspeaker", 1.0);
+}
@@ -1142,8 +1141,8 @@ MACHINE_CONFIG_END
*
*************************************/
-MACHINE_CONFIG_START(midyunit_state::yunit_core)
-
+void midyunit_state::yunit_core(machine_config &config)
+{
/* basic machine hardware */
TMS34010(config, m_maincpu, SLOW_MASTER_CLOCK);
m_maincpu->set_addrmap(AS_PROGRAM, &midyunit_state::main_map);
@@ -1158,103 +1157,96 @@ MACHINE_CONFIG_START(midyunit_state::yunit_core)
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
/* video hardware */
- MCFG_PALETTE_ADD("palette", 256)
+ PALETTE(config, m_palette).set_entries(256);
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_VIDEO_ATTRIBUTES(VIDEO_ALWAYS_UPDATE)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_video_attributes(VIDEO_ALWAYS_UPDATE);
// from TMS340 registers - visible area varies slightly between games
// we use the largest visarea (smashtv's) here so that aviwrite will work nicely
- MCFG_SCREEN_RAW_PARAMS(STDRES_PIXEL_CLOCK*2, 506, 90, 500, 289, 20, 276)
- MCFG_SCREEN_UPDATE_DEVICE("maincpu", tms34010_device, tms340x0_ind16)
- MCFG_SCREEN_PALETTE("palette")
+ screen.set_raw(STDRES_PIXEL_CLOCK*2, 506, 90, 500, 289, 20, 276);
+ screen.set_screen_update("maincpu", FUNC(tms34010_device::tms340x0_ind16));
+ screen.set_palette(m_palette);
/* sound hardware */
SPEAKER(config, "speaker").front_center();
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(midyunit_state::yunit_cvsd_4bit_slow)
+void midyunit_state::yunit_cvsd_4bit_slow(machine_config &config)
+{
yunit_core(config);
/* basic machine hardware */
- MCFG_DEVICE_ADD("cvsd", WILLIAMS_CVSD_SOUND)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 1.0)
+ WILLIAMS_CVSD_SOUND(config, m_cvsd_sound).add_route(ALL_OUTPUTS, "speaker", 1.0);
/* video hardware */
- MCFG_DEVICE_MODIFY("palette")
- MCFG_PALETTE_ENTRIES(256)
+ m_palette->set_entries(256);
MCFG_VIDEO_START_OVERRIDE(midyunit_state,midyunit_4bit)
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(midyunit_state::yunit_cvsd_4bit_fast)
+void midyunit_state::yunit_cvsd_4bit_fast(machine_config &config)
+{
yunit_core(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_CLOCK(FAST_MASTER_CLOCK)
+ m_maincpu->set_clock(FAST_MASTER_CLOCK);
- MCFG_DEVICE_ADD("cvsd", WILLIAMS_CVSD_SOUND)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 1.0)
+ WILLIAMS_CVSD_SOUND(config, m_cvsd_sound).add_route(ALL_OUTPUTS, "speaker", 1.0);
/* video hardware */
- MCFG_DEVICE_MODIFY("palette")
- MCFG_PALETTE_ENTRIES(256)
+ m_palette->set_entries(256);
MCFG_VIDEO_START_OVERRIDE(midyunit_state,midyunit_4bit)
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(midyunit_state::yunit_cvsd_6bit_slow)
+void midyunit_state::yunit_cvsd_6bit_slow(machine_config &config)
+{
yunit_core(config);
/* basic machine hardware */
- MCFG_DEVICE_ADD("cvsd", WILLIAMS_CVSD_SOUND)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 1.0)
+ WILLIAMS_CVSD_SOUND(config, m_cvsd_sound).add_route(ALL_OUTPUTS, "speaker", 1.0);
/* video hardware */
- MCFG_DEVICE_MODIFY("palette")
- MCFG_PALETTE_ENTRIES(4096)
+ m_palette->set_entries(4096);
MCFG_VIDEO_START_OVERRIDE(midyunit_state,midyunit_6bit)
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(midyunit_state::yunit_adpcm_6bit_fast)
+void midyunit_state::yunit_adpcm_6bit_fast(machine_config &config)
+{
yunit_core(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_CLOCK(FAST_MASTER_CLOCK)
+ m_maincpu->set_clock(FAST_MASTER_CLOCK);
- MCFG_DEVICE_ADD("adpcm", WILLIAMS_ADPCM_SOUND)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 1.0)
+ WILLIAMS_ADPCM_SOUND(config, m_adpcm_sound).add_route(ALL_OUTPUTS, "speaker", 1.0);
/* video hardware */
- MCFG_DEVICE_MODIFY("palette")
- MCFG_PALETTE_ENTRIES(4096)
+ m_palette->set_entries(4096);
MCFG_VIDEO_START_OVERRIDE(midyunit_state,midyunit_6bit)
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(midyunit_state::yunit_adpcm_6bit_faster)
+void midyunit_state::yunit_adpcm_6bit_faster(machine_config &config)
+{
yunit_core(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_CLOCK(FASTER_MASTER_CLOCK)
+ m_maincpu->set_clock(FASTER_MASTER_CLOCK);
- MCFG_DEVICE_ADD("adpcm", WILLIAMS_ADPCM_SOUND)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 1.0)
+ WILLIAMS_ADPCM_SOUND(config, m_adpcm_sound).add_route(ALL_OUTPUTS, "speaker", 1.0);
/* video hardware */
- MCFG_DEVICE_MODIFY("palette")
- MCFG_PALETTE_ENTRIES(4096)
+ m_palette->set_entries(4096);
MCFG_VIDEO_START_OVERRIDE(midyunit_state,midyunit_6bit)
-MACHINE_CONFIG_END
+}
void midyunit_state::term2(machine_config &config)
{
yunit_adpcm_6bit_faster(config);
+
ADC0844(config, m_term2_adc); // U2 on Coil Lamp Driver Board (A-14915)
m_term2_adc->ch1_callback().set_ioport("STICK0_X");
m_term2_adc->ch2_callback().set_ioport("STICK0_Y");
@@ -1263,26 +1255,25 @@ void midyunit_state::term2(machine_config &config)
}
-MACHINE_CONFIG_START(midyunit_state::mkyawdim)
+void midyunit_state::mkyawdim(machine_config &config)
+{
yunit_core(config);
/* basic machine hardware */
- MCFG_DEVICE_ADD("audiocpu", Z80, XTAL(8'000'000) / 2)
- MCFG_DEVICE_PROGRAM_MAP(yawdim_sound_map)
+ Z80(config, m_audiocpu, XTAL(8'000'000) / 2);
+ m_audiocpu->set_addrmap(AS_PROGRAM, &midyunit_state::yawdim_sound_map);
/* video hardware */
- MCFG_DEVICE_MODIFY("palette")
- MCFG_PALETTE_ENTRIES(4096)
+ m_palette->set_entries(4096);
MCFG_VIDEO_START_OVERRIDE(midyunit_state,mkyawdim)
/* sound hardware */
GENERIC_LATCH_8(config, m_soundlatch);
- MCFG_DEVICE_ADD("oki", OKIM6295, XTAL(8'000'000) / 8, okim6295_device::PIN7_HIGH)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 1.0)
-MACHINE_CONFIG_END
+ OKIM6295(config, m_oki, XTAL(8'000'000) / 8, okim6295_device::PIN7_HIGH).add_route(ALL_OUTPUTS, "speaker", 1.0);
+}
diff --git a/src/mame/drivers/midzeus.cpp b/src/mame/drivers/midzeus.cpp
index 1beb25f7071..2f0fc5f84e7 100644
--- a/src/mame/drivers/midzeus.cpp
+++ b/src/mame/drivers/midzeus.cpp
@@ -187,13 +187,13 @@ WRITE32_MEMBER(midzeus_state::cmos_protect_w)
READ32_MEMBER(midzeus2_state::zeus2_timekeeper_r)
{
- return m_m48t35->read(space, offset, 0xff) | 0xffffff00;
+ return m_m48t35->read(offset) | 0xffffff00;
}
WRITE32_MEMBER(midzeus2_state::zeus2_timekeeper_w)
{
if (disk_asic_jr[2] && !cmos_protected)
- m_m48t35->write(space, offset, data, 0xff);
+ m_m48t35->write(offset, data);
else
logerror("%s:zeus2_timekeeper_w with disk_asic_jr[2] = %d, cmos_protected = %d\n", machine().describe_context(), disk_asic_jr[2], cmos_protected);
cmos_protected = true;
@@ -1255,8 +1255,8 @@ INPUT_PORTS_END
*
*************************************/
-MACHINE_CONFIG_START(midzeus_state::midzeus)
-
+void midzeus_state::midzeus(machine_config &config)
+{
/* basic machine hardware */
TMS32032(config, m_maincpu, CPU_CLOCK);
m_maincpu->set_addrmap(AS_PROGRAM, &midzeus_state::zeus_map);
@@ -1282,22 +1282,24 @@ MACHINE_CONFIG_START(midzeus_state::midzeus)
MIDWAY_IOASIC(config, m_ioasic, 0);
m_ioasic->set_shuffle(MIDWAY_IOASIC_STANDARD);
m_ioasic->set_yearoffs(94);
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(midzeus_state::mk4)
+void midzeus_state::mk4(machine_config &config)
+{
midzeus(config);
m_ioasic->set_upper(461/* or 474 */);
m_ioasic->set_shuffle_default(1);
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(midzeus_state::invasn)
+void midzeus_state::invasn(machine_config &config)
+{
midzeus(config);
PIC16C57(config, "pic", 8000000); /* ? */
m_ioasic->set_upper(468/* or 488 */);
-MACHINE_CONFIG_END
-
-MACHINE_CONFIG_START(midzeus2_state::midzeus2)
+}
+void midzeus2_state::midzeus2(machine_config &config)
+{
/* basic machine hardware */
TMS32032(config, m_maincpu, CPU_CLOCK);
m_maincpu->set_addrmap(AS_PROGRAM, &midzeus2_state::zeus2_map);
@@ -1323,17 +1325,19 @@ MACHINE_CONFIG_START(midzeus2_state::midzeus2)
m_ioasic->set_shuffle(MIDWAY_IOASIC_STANDARD);
m_ioasic->set_yearoffs(99);
m_ioasic->set_upper(474);
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(midzeus2_state::crusnexo)
+void midzeus2_state::crusnexo(machine_config &config)
+{
midzeus2(config);
m_ioasic->set_upper(472/* or 476,477,478,110 */);
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(midzeus2_state::thegrid)
+void midzeus2_state::thegrid(machine_config &config)
+{
midzeus2(config);
m_ioasic->set_upper(474/* or 491 */);
-MACHINE_CONFIG_END
+}
/*************************************
diff --git a/src/mame/drivers/mightyframe.cpp b/src/mame/drivers/mightyframe.cpp
index e873ec63a7d..99f774e34ed 100644
--- a/src/mame/drivers/mightyframe.cpp
+++ b/src/mame/drivers/mightyframe.cpp
@@ -38,10 +38,11 @@ void mightyframe_state::mem_map(address_map &map)
static INPUT_PORTS_START( mightyframe )
INPUT_PORTS_END
-MACHINE_CONFIG_START(mightyframe_state::mightyframe)
- MCFG_DEVICE_ADD("maincpu", M68000, XTAL(16'000'000)) // no idea of clock
- MCFG_DEVICE_PROGRAM_MAP(mem_map)
-MACHINE_CONFIG_END
+void mightyframe_state::mightyframe(machine_config &config)
+{
+ m68000_device &maincpu(M68000(config, "maincpu", XTAL(16'000'000))); // no idea of clock
+ maincpu.set_addrmap(AS_PROGRAM, &mightyframe_state::mem_map);
+}
ROM_START( mightyframe )
ROM_REGION( 0x8000, "maincpu", 0 )
diff --git a/src/mame/drivers/mikie.cpp b/src/mame/drivers/mikie.cpp
index 3b8c548fdba..a8b8cbd3842 100644
--- a/src/mame/drivers/mikie.cpp
+++ b/src/mame/drivers/mikie.cpp
@@ -132,9 +132,9 @@ void mikie_state::sound_map(address_map &map)
map(0x4000, 0x43ff).ram();
map(0x8000, 0x8000).nopw(); // sound command latch
map(0x8001, 0x8001).nopw(); // ???
- map(0x8002, 0x8002).w("sn1", FUNC(sn76489a_device::command_w)); // trigger read of latch
+ map(0x8002, 0x8002).w("sn1", FUNC(sn76489a_device::write)); // trigger read of latch
map(0x8003, 0x8003).r("soundlatch", FUNC(generic_latch_8_device::read));
- map(0x8004, 0x8004).w("sn2", FUNC(sn76489a_device::command_w)); // trigger read of latch
+ map(0x8004, 0x8004).w("sn2", FUNC(sn76489a_device::write)); // trigger read of latch
map(0x8005, 0x8005).r(FUNC(mikie_state::mikie_sh_timer_r));
map(0x8079, 0x8079).nopw(); // ???
map(0xa003, 0xa003).nopw(); // ???
@@ -258,14 +258,14 @@ WRITE_LINE_MEMBER(mikie_state::vblank_irq)
m_maincpu->set_input_line(M6809_IRQ_LINE, ASSERT_LINE);
}
-MACHINE_CONFIG_START(mikie_state::mikie)
-
+void mikie_state::mikie(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", MC6809E, OSC/12) // 9A (surface scratched)
- MCFG_DEVICE_PROGRAM_MAP(mikie_map)
+ MC6809E(config, m_maincpu, OSC/12); // 9A (surface scratched)
+ m_maincpu->set_addrmap(AS_PROGRAM, &mikie_state::mikie_map);
- MCFG_DEVICE_ADD("audiocpu", Z80, CLK) // 4E (surface scratched)
- MCFG_DEVICE_PROGRAM_MAP(sound_map)
+ Z80(config, m_audiocpu, CLK); // 4E (surface scratched)
+ m_audiocpu->set_addrmap(AS_PROGRAM, &mikie_state::sound_map);
ls259_device &mainlatch(LS259(config, "mainlatch")); // 6I
mainlatch.q_out_cb<0>().set(FUNC(mikie_state::coin_counter_1_w)); // COIN1
@@ -278,14 +278,14 @@ MACHINE_CONFIG_START(mikie_state::mikie)
WATCHDOG_TIMER(config, "watchdog");
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60.59)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(32*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(mikie_state, screen_update_mikie)
- MCFG_SCREEN_PALETTE(m_palette)
- MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE(*this, mikie_state, vblank_irq))
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60.59);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(32*8, 32*8);
+ screen.set_visarea(0*8, 32*8-1, 2*8, 30*8-1);
+ screen.set_screen_update(FUNC(mikie_state::screen_update_mikie));
+ screen.set_palette(m_palette);
+ screen.screen_vblank().set(FUNC(mikie_state::vblank_irq));
GFXDECODE(config, m_gfxdecode, m_palette, gfx_mikie);
PALETTE(config, m_palette, FUNC(mikie_state::mikie_palette), 16*8*16+16*8*16, 256);
@@ -295,12 +295,10 @@ MACHINE_CONFIG_START(mikie_state::mikie)
GENERIC_LATCH_8(config, "soundlatch");
- MCFG_DEVICE_ADD("sn1", SN76489A, XTAL/8)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.60)
+ SN76489A(config, "sn1", XTAL/8).add_route(ALL_OUTPUTS, "mono", 0.60);
- MCFG_DEVICE_ADD("sn2", SN76489A, CLK)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.60)
-MACHINE_CONFIG_END
+ SN76489A(config, "sn2", CLK).add_route(ALL_OUTPUTS, "mono", 0.60);
+}
/*************************************
*
diff --git a/src/mame/drivers/mikro80.cpp b/src/mame/drivers/mikro80.cpp
index 71169a78c75..206a603adf1 100644
--- a/src/mame/drivers/mikro80.cpp
+++ b/src/mame/drivers/mikro80.cpp
@@ -165,11 +165,12 @@ static GFXDECODE_START( gfx_mikro80 )
GFXDECODE_ENTRY( "gfx1", 0x0000, mikro80_charlayout, 0, 1 )
GFXDECODE_END
-MACHINE_CONFIG_START(mikro80_state::mikro80)
+void mikro80_state::mikro80(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu",I8080, 2000000)
- MCFG_DEVICE_PROGRAM_MAP(mikro80_mem)
- MCFG_DEVICE_IO_MAP(mikro80_io)
+ I8080(config, m_maincpu, 2000000);
+ m_maincpu->set_addrmap(AS_PROGRAM, &mikro80_state::mikro80_mem);
+ m_maincpu->set_addrmap(AS_IO, &mikro80_state::mikro80_io);
I8255(config, m_ppi8255);
m_ppi8255->out_pa_callback().set(FUNC(mikro80_state::mikro80_8255_porta_w));
@@ -177,45 +178,45 @@ MACHINE_CONFIG_START(mikro80_state::mikro80)
m_ppi8255->in_pc_callback().set(FUNC(mikro80_state::mikro80_8255_portc_r));
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(50)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */
- MCFG_SCREEN_SIZE(64*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0, 64*8-1, 0, 32*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(mikro80_state, screen_update_mikro80)
- MCFG_SCREEN_PALETTE("palette")
-
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_mikro80)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(50);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */
+ screen.set_size(64*8, 32*8);
+ screen.set_visarea(0, 64*8-1, 0, 32*8-1);
+ screen.set_screen_update(FUNC(mikro80_state::screen_update_mikro80));
+ screen.set_palette("palette");
+
+ GFXDECODE(config, "gfxdecode", "palette", gfx_mikro80);
PALETTE(config, "palette", palette_device::MONOCHROME);
SPEAKER(config, "speaker").front_center();
- WAVE(config, "wave", "cassette").add_route(ALL_OUTPUTS, "speaker", 0.25);
+ WAVE(config, "wave", m_cassette).add_route(ALL_OUTPUTS, "speaker", 0.25);
- MCFG_CASSETTE_ADD( "cassette" )
- MCFG_CASSETTE_FORMATS(rk8_cassette_formats)
- MCFG_CASSETTE_DEFAULT_STATE(CASSETTE_STOPPED | CASSETTE_SPEAKER_ENABLED | CASSETTE_MOTOR_ENABLED)
- MCFG_CASSETTE_INTERFACE("mikro80_cass")
+ CASSETTE(config, m_cassette);
+ m_cassette->set_formats(rk8_cassette_formats);
+ m_cassette->set_default_state(CASSETTE_STOPPED | CASSETTE_SPEAKER_ENABLED | CASSETTE_MOTOR_ENABLED);
+ m_cassette->set_interface("mikro80_cass");
- MCFG_SOFTWARE_LIST_ADD("cass_list", "mikro80")
-MACHINE_CONFIG_END
+ SOFTWARE_LIST(config, "cass_list").set_original("mikro80");
+}
-MACHINE_CONFIG_START(mikro80_state::radio99)
+void mikro80_state::radio99(machine_config &config)
+{
mikro80(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_IO_MAP(radio99_io)
+ m_maincpu->set_addrmap(AS_IO, &mikro80_state::radio99_io);
- MCFG_DEVICE_ADD("dac", DAC_1BIT, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 0.12)
- MCFG_DEVICE_ADD("vref", VOLTAGE_REGULATOR, 0) MCFG_VOLTAGE_REGULATOR_OUTPUT(5.0)
- MCFG_SOUND_ROUTE(0, "dac", 1.0, DAC_VREF_POS_INPUT)
-MACHINE_CONFIG_END
+ DAC_1BIT(config, m_dac, 0).add_route(ALL_OUTPUTS, "speaker", 0.12);
+ voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref", 0));
+ vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT);
+}
-MACHINE_CONFIG_START(mikro80_state::kristall)
+void mikro80_state::kristall(machine_config &config)
+{
mikro80(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_IO_MAP(kristall_io)
-MACHINE_CONFIG_END
+ m_maincpu->set_addrmap(AS_IO, &mikro80_state::kristall_io);
+}
/* ROM definition */
diff --git a/src/mame/drivers/mikromik.cpp b/src/mame/drivers/mikromik.cpp
index 5be831c4c2c..f122675dd3c 100644
--- a/src/mame/drivers/mikromik.cpp
+++ b/src/mame/drivers/mikromik.cpp
@@ -92,7 +92,7 @@ READ8_MEMBER( mm1_state::read )
switch ((offset >> 4) & 0x07)
{
case 0:
- data = m_dmac->read(space, offset & 0x0f);
+ data = m_dmac->read(offset & 0x0f);
break;
case 1:
@@ -114,16 +114,16 @@ READ8_MEMBER( mm1_state::read )
case 5:
if (BIT(offset, 0))
{
- data = m_fdc->fifo_r(space, 0, 0xff);
+ data = m_fdc->fifo_r();
}
else
{
- data = m_fdc->msr_r(space, 0, 0xff);
+ data = m_fdc->msr_r();
}
break;
case 7:
- data = m_hgdc->read(space, offset & 0x01);
+ data = m_hgdc->read(offset & 0x01);
break;
}
}
@@ -161,7 +161,7 @@ WRITE8_MEMBER( mm1_state::write )
switch ((offset >> 4) & 0x07)
{
case 0:
- m_dmac->write(space, offset & 0x0f, data);
+ m_dmac->write(offset & 0x0f, data);
break;
case 1:
@@ -183,7 +183,7 @@ WRITE8_MEMBER( mm1_state::write )
case 5:
if (BIT(offset, 0))
{
- m_fdc->fifo_w(space, 0, data, 0xff);
+ m_fdc->fifo_w(data);
}
break;
@@ -192,7 +192,7 @@ WRITE8_MEMBER( mm1_state::write )
break;
case 7:
- m_hgdc->write(space, offset & 0x01, data);
+ m_hgdc->write(offset & 0x01, data);
break;
}
}
@@ -456,7 +456,7 @@ void mm1_state::machine_reset()
//**************************************************************************
//-------------------------------------------------
-// MACHINE_CONFIG( mm1 )
+// machine_config( mm1 )
//-------------------------------------------------
void mm1_state::mm1(machine_config &config)
@@ -480,10 +480,10 @@ void mm1_state::mm1(machine_config &config)
m_dmac->in_memr_callback().set(FUNC(mm1_state::read));
m_dmac->out_memw_callback().set(FUNC(mm1_state::write));
m_dmac->in_ior_callback<2>().set(FUNC(mm1_state::mpsc_dack_r));
- m_dmac->in_ior_callback<3>().set(m_fdc, FUNC(upd765_family_device::mdma_r));
+ m_dmac->in_ior_callback<3>().set(m_fdc, FUNC(upd765_family_device::dma_r));
m_dmac->out_iow_callback<0>().set(m_crtc, FUNC(i8275_device::dack_w));
m_dmac->out_iow_callback<1>().set(FUNC(mm1_state::mpsc_dack_w));
- m_dmac->out_iow_callback<3>().set(m_fdc, FUNC(upd765_family_device::mdma_w));
+ m_dmac->out_iow_callback<3>().set(m_fdc, FUNC(upd765_family_device::dma_w));
m_dmac->out_dack_callback<3>().set(FUNC(mm1_state::dack3_w));
PIT8253(config, m_pit, 0);
@@ -525,7 +525,7 @@ void mm1_state::mm1(machine_config &config)
//-------------------------------------------------
-// MACHINE_CONFIG( mm1m6 )
+// machine_config( mm1m6 )
//-------------------------------------------------
void mm1_state::mm1m6(machine_config &config)
@@ -537,7 +537,7 @@ void mm1_state::mm1m6(machine_config &config)
//-------------------------------------------------
-// MACHINE_CONFIG( mm1m7 )
+// machine_config( mm1m7 )
//-------------------------------------------------
void mm1_state::mm1m7(machine_config &config)
diff --git a/src/mame/drivers/mikrosha.cpp b/src/mame/drivers/mikrosha.cpp
index 9e67a919dbf..414f0c7414c 100644
--- a/src/mame/drivers/mikrosha.cpp
+++ b/src/mame/drivers/mikrosha.cpp
@@ -45,7 +45,7 @@ private:
void mikrosha_state::machine_reset()
{
if (m_cart->exists())
- m_maincpu->space(AS_PROGRAM).install_read_handler(0x8000, 0x8000+m_cart->get_rom_size()-1, read8_delegate(FUNC(generic_slot_device::read_rom),(generic_slot_device*)m_cart));
+ m_maincpu->space(AS_PROGRAM).install_read_handler(0x8000, 0x8000+m_cart->get_rom_size()-1, read8sm_delegate(FUNC(generic_slot_device::read_rom),(generic_slot_device*)m_cart));
radio86_state::machine_reset();
}
@@ -203,11 +203,12 @@ static GFXDECODE_START( gfx_mikrosha )
GFXDECODE_ENTRY( "gfx1", 0x0000, mikrosha_charlayout, 0, 1 )
GFXDECODE_END
-MACHINE_CONFIG_START(mikrosha_state::mikrosha)
+void mikrosha_state::mikrosha(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", I8080, XTAL(16'000'000) / 9)
- MCFG_DEVICE_PROGRAM_MAP(mikrosha_mem)
- MCFG_DEVICE_IO_MAP(mikrosha_io)
+ I8080(config, m_maincpu, XTAL(16'000'000) / 9);
+ m_maincpu->set_addrmap(AS_PROGRAM, &mikrosha_state::mikrosha_mem);
+ m_maincpu->set_addrmap(AS_IO, &mikrosha_state::mikrosha_io);
I8255(config, m_ppi8255_1);
m_ppi8255_1->in_pa_callback().set(FUNC(radio86_state::radio86_8255_portb_r2));
@@ -218,10 +219,10 @@ MACHINE_CONFIG_START(mikrosha_state::mikrosha)
I8255(config, m_ppi8255_2);
m_ppi8255_2->out_pb_callback().set(FUNC(radio86_state::mikrosha_8255_font_page_w));
- MCFG_DEVICE_ADD("i8275", I8275, XTAL(16'000'000) / 12)
- MCFG_I8275_CHARACTER_WIDTH(6)
- MCFG_I8275_DRAW_CHARACTER_CALLBACK_OWNER(mikrosha_state, display_pixels)
- MCFG_I8275_DRQ_CALLBACK(WRITELINE(m_dma8257,i8257_device, dreq2_w))
+ i8275_device &i8275(I8275(config, "i8275", XTAL(16'000'000) / 12));
+ i8275.set_character_width(6);
+ i8275.set_display_callback(FUNC(mikrosha_state::display_pixels), this);
+ i8275.drq_wr_callback().set(m_dma8257, FUNC(i8257_device::dreq2_w));
pit8253_device &pit8253(PIT8253(config, "pit8253", 0));
pit8253.set_clk<0>(0);
@@ -230,11 +231,11 @@ MACHINE_CONFIG_START(mikrosha_state::mikrosha)
pit8253.out_handler<2>().set(FUNC(mikrosha_state::mikrosha_pit_out2));
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_UPDATE_DEVICE("i8275", i8275_device, screen_update)
- MCFG_SCREEN_REFRESH_RATE(50)
- MCFG_SCREEN_SIZE(78*6, 30*10)
- MCFG_SCREEN_VISIBLE_AREA(0, 78*6-1, 0, 30*10-1)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_screen_update("i8275", FUNC(i8275_device::screen_update));
+ screen.set_refresh_hz(50);
+ screen.set_size(78*6, 30*10);
+ screen.set_visarea(0, 78*6-1, 0, 30*10-1);
GFXDECODE(config, "gfxdecode", m_palette, gfx_mikrosha);
PALETTE(config, m_palette, FUNC(mikrosha_state::radio86_palette), 3);
@@ -249,17 +250,16 @@ MACHINE_CONFIG_START(mikrosha_state::mikrosha)
m_dma8257->out_iow_cb<2>().set("i8275", FUNC(i8275_device::dack_w));
m_dma8257->set_reverse_rw_mode(1);
- MCFG_CASSETTE_ADD( "cassette" )
- MCFG_CASSETTE_FORMATS(rkm_cassette_formats)
- MCFG_CASSETTE_DEFAULT_STATE(CASSETTE_STOPPED | CASSETTE_SPEAKER_ENABLED | CASSETTE_MOTOR_ENABLED)
- MCFG_CASSETTE_INTERFACE("mikrosha_cass")
+ CASSETTE(config, m_cassette);
+ m_cassette->set_formats(rkm_cassette_formats);
+ m_cassette->set_default_state(CASSETTE_STOPPED | CASSETTE_SPEAKER_ENABLED | CASSETTE_MOTOR_ENABLED);
+ m_cassette->set_interface("mikrosha_cass");
- MCFG_GENERIC_CARTSLOT_ADD("cartslot", generic_plain_slot, "mikrosha_cart")
- MCFG_GENERIC_EXTENSIONS("bin,rom")
+ GENERIC_CARTSLOT(config, m_cart, generic_plain_slot, "mikrosha_cart", "bin,rom");
- MCFG_SOFTWARE_LIST_ADD("cass_list", "mikrosha_cass")
- MCFG_SOFTWARE_LIST_ADD("cart_list", "mikrosha_cart")
-MACHINE_CONFIG_END
+ SOFTWARE_LIST(config, "cass_list").set_original("mikrosha_cass");
+ SOFTWARE_LIST(config, "cart_list").set_original("mikrosha_cart");
+}
/* ROM definition */
diff --git a/src/mame/drivers/mil4000.cpp b/src/mame/drivers/mil4000.cpp
index fe28b93c707..d4e37d14353 100644
--- a/src/mame/drivers/mil4000.cpp
+++ b/src/mame/drivers/mil4000.cpp
@@ -561,37 +561,37 @@ static GFXDECODE_START( gfx_mil4000 )
GFXDECODE_END
-MACHINE_CONFIG_START(mil4000_state::mil4000)
- MCFG_DEVICE_ADD("maincpu", M68000, CPU_CLOCK)
- MCFG_DEVICE_PROGRAM_MAP(mil4000_map)
+void mil4000_state::mil4000(machine_config &config)
+{
+ M68000(config, m_maincpu, CPU_CLOCK);
+ m_maincpu->set_addrmap(AS_PROGRAM, &mil4000_state::mil4000_map);
// irq 2/4/5 point to the same place, others invalid
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", mil4000_state, irq5_line_hold)
+ m_maincpu->set_vblank_int("screen", FUNC(mil4000_state::irq5_line_hold));
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(320, 240)
- MCFG_SCREEN_VISIBLE_AREA(0, 320-1, 0, 240-1)
- MCFG_SCREEN_UPDATE_DRIVER(mil4000_state, screen_update)
- MCFG_SCREEN_PALETTE("palette")
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(320, 240);
+ screen.set_visarea(0, 320-1, 0, 240-1);
+ screen.set_screen_update(FUNC(mil4000_state::screen_update));
+ screen.set_palette("palette");
PALETTE(config, "palette", palette_device::BLACK).set_format(palette_device::RGBx_555, 0x800);
GFXDECODE(config, m_gfxdecode, "palette", gfx_mil4000);
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("oki", OKIM6295, 1000000, okim6295_device::PIN7_HIGH) // frequency from 1000 kHz resonator. pin 7 high not verified.
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
-MACHINE_CONFIG_END
+ OKIM6295(config, "oki", 1000000, okim6295_device::PIN7_HIGH).add_route(ALL_OUTPUTS, "mono", 1.0); // frequency from 1000 kHz resonator. pin 7 high not verified.
+}
-MACHINE_CONFIG_START(mil4000_state::chewheel)
+void mil4000_state::chewheel(machine_config &config)
+{
mil4000(config);
- MCFG_DEVICE_REPLACE("maincpu", M68000, CPU_CLOCK) /* 2MHz */
- MCFG_DEVICE_PROGRAM_MAP(chewheel_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", mil4000_state, irq5_line_hold)
-MACHINE_CONFIG_END
+
+ m_maincpu->set_addrmap(AS_PROGRAM, &mil4000_state::chewheel_map); /* 2MHz */
+}
ROM_START( mil4000 )
diff --git a/src/mame/drivers/milton6805.cpp b/src/mame/drivers/milton6805.cpp
index 03789aff3c8..89f5de74f16 100644
--- a/src/mame/drivers/milton6805.cpp
+++ b/src/mame/drivers/milton6805.cpp
@@ -115,11 +115,11 @@ void milton_state::prg_map(address_map &map)
static INPUT_PORTS_START( milton )
INPUT_PORTS_END
-MACHINE_CONFIG_START(milton_state::milton)
-
+void milton_state::milton(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M6805, 3120000) // MC6805P2, needs a CPU core
- MCFG_DEVICE_PROGRAM_MAP(prg_map)
+ M6805(config, m_maincpu, 3120000); // MC6805P2, needs a CPU core
+ m_maincpu->set_addrmap(AS_PROGRAM, &milton_state::prg_map);
// GROMs. They still require a ready callback and external clock
// of 3120000/8 Hz, pulsing their glock_in line (see tmc0430.cpp and ti99_4x.cpp)
@@ -127,9 +127,8 @@ MACHINE_CONFIG_START(milton_state::milton)
TMC0430(config, "grom4", "groms", 0x2000, 1);
SPEAKER(config, "speaker").front_center();
- MCFG_DEVICE_ADD("sp0250", SP0250, 3120000)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 1.0)
-MACHINE_CONFIG_END
+ SP0250(config, "sp0250", 3120000).add_route(ALL_OUTPUTS, "speaker", 1.0);
+}
/***************************************************************************
diff --git a/src/mame/drivers/mini2440.cpp b/src/mame/drivers/mini2440.cpp
index ee445b41584..6ec4b19e85c 100644
--- a/src/mame/drivers/mini2440.cpp
+++ b/src/mame/drivers/mini2440.cpp
@@ -225,27 +225,27 @@ void mini2440_state::init_mini2440()
// do nothing
}
-MACHINE_CONFIG_START(mini2440_state::mini2440)
- MCFG_DEVICE_ADD("maincpu", ARM920T, 400000000)
- MCFG_DEVICE_PROGRAM_MAP(mini2440_map)
-
- MCFG_PALETTE_ADD("palette", 32768)
+void mini2440_state::mini2440(machine_config &config)
+{
+ ARM920T(config, m_maincpu, 400000000);
+ m_maincpu->set_addrmap(AS_PROGRAM, &mini2440_state::mini2440_map);
- MCFG_SCREEN_ADD("screen", LCD)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */
- MCFG_SCREEN_SIZE(1024, 768)
- MCFG_SCREEN_VISIBLE_AREA(0, 239, 0, 319)
+ PALETTE(config, "palette").set_entries(32768);
- MCFG_SCREEN_UPDATE_DEVICE("s3c2440", s3c2440_device, screen_update)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_LCD));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */
+ screen.set_size(1024, 768);
+ screen.set_visarea(0, 239, 0, 319);
+ screen.set_screen_update("s3c2440", FUNC(s3c2440_device::screen_update));
SPEAKER(config, "lspeaker").front_left();
SPEAKER(config, "rspeaker").front_right();
- MCFG_DEVICE_ADD("ldac", UDA1341TS, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 1.0) // uda1341ts.u12
- MCFG_DEVICE_ADD("rdac", UDA1341TS, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 1.0) // uda1341ts.u12
- MCFG_DEVICE_ADD("vref", VOLTAGE_REGULATOR, 0) MCFG_VOLTAGE_REGULATOR_OUTPUT(5.0)
- MCFG_SOUND_ROUTE(0, "ldac", 1.0, DAC_VREF_POS_INPUT) MCFG_SOUND_ROUTE(0, "ldac", -1.0, DAC_VREF_NEG_INPUT)
- MCFG_SOUND_ROUTE(0, "rdac", 1.0, DAC_VREF_POS_INPUT) MCFG_SOUND_ROUTE(0, "rdac", -1.0, DAC_VREF_NEG_INPUT)
+ UDA1341TS(config, m_ldac, 0).add_route(ALL_OUTPUTS, "lspeaker", 1.0); // uda1341ts.u12
+ UDA1341TS(config, m_rdac, 0).add_route(ALL_OUTPUTS, "rspeaker", 1.0); // uda1341ts.u12
+ voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref"));
+ vref.add_route(0, "ldac", 1.0, DAC_VREF_POS_INPUT); vref.add_route(0, "ldac", -1.0, DAC_VREF_NEG_INPUT);
+ vref.add_route(0, "rdac", 1.0, DAC_VREF_POS_INPUT); vref.add_route(0, "rdac", -1.0, DAC_VREF_NEG_INPUT);
S3C2440(config, m_s3c2440, 12000000);
m_s3c2440->set_palette_tag("palette");
@@ -263,7 +263,7 @@ MACHINE_CONFIG_START(mini2440_state::mini2440)
NAND(config, m_nand, 0);
m_nand->set_nand_type(nand_device::chip::K9F1G08U0B);
m_nand->rnb_wr_callback().set(m_s3c2440, FUNC(s3c2440_device::frnb_w));
-MACHINE_CONFIG_END
+}
static INPUT_PORTS_START( mini2440 )
PORT_START( "PENB" )
diff --git a/src/mame/drivers/miniboy7.cpp b/src/mame/drivers/miniboy7.cpp
index c72e1e188d5..55806601093 100644
--- a/src/mame/drivers/miniboy7.cpp
+++ b/src/mame/drivers/miniboy7.cpp
@@ -259,13 +259,13 @@ MC6845_UPDATE_ROW( miniboy7_state::crtc_update_row )
void miniboy7_state::miniboy7_palette(palette_device &palette) const
{
/*
- prom bits
- 7654 3210
- ---- ---x red component?.
- ---- --x- green component?.
- ---- -x-- blue component?.
- ---- x--- intensity?.
- xxxx ---- unused.
+ prom bits
+ 7654 3210
+ ---- ---x red component?.
+ ---- --x- green component?.
+ ---- -x-- blue component?.
+ ---- x--- intensity?.
+ xxxx ---- unused.
*/
/* 0000IBGR */
@@ -513,11 +513,11 @@ GFXDECODE_END
* Machine Drivers *
***********************************/
-MACHINE_CONFIG_START(miniboy7_state::miniboy7)
-
+void miniboy7_state::miniboy7(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M6502, MASTER_CLOCK / 16) /* guess */
- MCFG_DEVICE_PROGRAM_MAP(miniboy7_map)
+ M6502(config, m_maincpu, MASTER_CLOCK / 16); /* guess */
+ m_maincpu->set_addrmap(AS_PROGRAM, &miniboy7_state::miniboy7_map);
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
@@ -529,14 +529,14 @@ MACHINE_CONFIG_START(miniboy7_state::miniboy7)
pia.irqb_handler().set_inputline("maincpu", 0);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE((47+1)*8, (39+1)*8) /* Taken from MC6845, registers 00 & 04. Normally programmed with (value-1) */
- MCFG_SCREEN_VISIBLE_AREA(0*8, 37*8-1, 0*8, 37*8-1) /* Taken from MC6845, registers 01 & 06 */
- MCFG_SCREEN_UPDATE_DEVICE("crtc", mc6845_device, screen_update)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size((47+1)*8, (39+1)*8); /* Taken from MC6845, registers 00 & 04. Normally programmed with (value-1) */
+ screen.set_visarea(0*8, 37*8-1, 0*8, 37*8-1); /* Taken from MC6845, registers 01 & 06 */
+ screen.set_screen_update("crtc", FUNC(mc6845_device::screen_update));
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_miniboy7)
+ GFXDECODE(config, m_gfxdecode, m_palette, gfx_miniboy7);
PALETTE(config, m_palette, FUNC(miniboy7_state::miniboy7_palette), 256);
@@ -553,8 +553,7 @@ MACHINE_CONFIG_START(miniboy7_state::miniboy7)
ay8910.add_route(ALL_OUTPUTS, "mono", 0.75);
ay8910.port_a_write_callback().set(FUNC(miniboy7_state::ay_pa_w));
ay8910.port_b_write_callback().set(FUNC(miniboy7_state::ay_pb_w));
-
-MACHINE_CONFIG_END
+}
/***********************************
diff --git a/src/mame/drivers/miniforce.cpp b/src/mame/drivers/miniforce.cpp
index 2e9feea1184..ef55e15c2e7 100644
--- a/src/mame/drivers/miniforce.cpp
+++ b/src/mame/drivers/miniforce.cpp
@@ -182,19 +182,20 @@ static void miniforce_vme_cards(device_slot_interface &device)
/*
* Machine configuration
*/
-MACHINE_CONFIG_START(miniforce_state::miniforce)
-// MCFG_DEVICE_PROGRAM_MAP (miniforce_mem)
- MCFG_VME_DEVICE_ADD("vme")
- MCFG_VME_SLOT_ADD ("vme", 1, miniforce_vme_cards, "fccpu21")
- MCFG_VME_SLOT_ADD ("vme", 2, miniforce_vme_cards, nullptr)
- MCFG_VME_SLOT_ADD ("vme", 3, miniforce_vme_cards, nullptr)
- MCFG_VME_SLOT_ADD ("vme", 4, miniforce_vme_cards, nullptr)
- MCFG_VME_SLOT_ADD ("vme", 5, miniforce_vme_cards, nullptr)
- MCFG_VME_SLOT_ADD ("vme", 6, miniforce_vme_cards, nullptr)
- MCFG_VME_SLOT_ADD ("vme", 7, miniforce_vme_cards, nullptr)
- MCFG_VME_SLOT_ADD ("vme", 8, miniforce_vme_cards, nullptr)
- MCFG_VME_SLOT_ADD ("vme", 9, miniforce_vme_cards, nullptr)
-MACHINE_CONFIG_END
+void miniforce_state::miniforce(machine_config &config)
+{
+// ->set_addrmap(AS_PROGRAM, &miniforce_state::miniforce_mem);
+ VME(config, "vme", 0);
+ VME_SLOT(config, "slot1", miniforce_vme_cards, "fccpu21", 1, "vme");
+ VME_SLOT(config, "slot2", miniforce_vme_cards, nullptr, 2, "vme");
+ VME_SLOT(config, "slot3", miniforce_vme_cards, nullptr, 3, "vme");
+ VME_SLOT(config, "slot4", miniforce_vme_cards, nullptr, 4, "vme");
+ VME_SLOT(config, "slot5", miniforce_vme_cards, nullptr, 5, "vme");
+ VME_SLOT(config, "slot6", miniforce_vme_cards, nullptr, 6, "vme");
+ VME_SLOT(config, "slot7", miniforce_vme_cards, nullptr, 7, "vme");
+ VME_SLOT(config, "slot8", miniforce_vme_cards, nullptr, 8, "vme");
+ VME_SLOT(config, "slot9", miniforce_vme_cards, nullptr, 9, "vme");
+}
ROM_START(miniforce)
ROM_END
diff --git a/src/mame/drivers/minitel_2_rpic.cpp b/src/mame/drivers/minitel_2_rpic.cpp
index 29dfa0b53aa..098fda55139 100644
--- a/src/mame/drivers/minitel_2_rpic.cpp
+++ b/src/mame/drivers/minitel_2_rpic.cpp
@@ -266,14 +266,14 @@ READ8_MEMBER(minitel_state::dev_keyb_ser_r)
READ8_MEMBER ( minitel_state::ts9347_io_r )
{
- return m_ts9347->data_r(space, offset, 0xff);
+ return m_ts9347->data_r(offset);
}
WRITE8_MEMBER ( minitel_state::ts9347_io_w )
{
LOG("minitel_state::ts9347_io_w : %x %x\n",offset, data);
- m_ts9347->data_w(space, offset, data, 0xff);
+ m_ts9347->data_w(offset, data);
}
TIMER_DEVICE_CALLBACK_MEMBER(minitel_state::minitel_scanline)
diff --git a/src/mame/drivers/minivadr.cpp b/src/mame/drivers/minivadr.cpp
index 40b9b0c2865..0b0b1bd4c88 100644
--- a/src/mame/drivers/minivadr.cpp
+++ b/src/mame/drivers/minivadr.cpp
@@ -110,23 +110,23 @@ static INPUT_PORTS_START( minivadr )
INPUT_PORTS_END
-MACHINE_CONFIG_START(minivadr_state::minivadr)
-
+void minivadr_state::minivadr(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, XTAL(24'000'000) / 6)
- MCFG_DEVICE_PROGRAM_MAP(minivadr_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", minivadr_state, irq0_line_hold)
+ Z80(config, m_maincpu, XTAL(24'000'000) / 6);
+ m_maincpu->set_addrmap(AS_PROGRAM, &minivadr_state::minivadr_map);
+ m_maincpu->set_vblank_int("screen", FUNC(minivadr_state::irq0_line_hold));
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(256, 256)
- MCFG_SCREEN_VISIBLE_AREA(0, 256-1, 16, 240-1)
- MCFG_SCREEN_UPDATE_DRIVER(minivadr_state, screen_update_minivadr)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(256, 256);
+ screen.set_visarea(0, 256-1, 16, 240-1);
+ screen.set_screen_update(FUNC(minivadr_state::screen_update_minivadr));
/* the board has no sound hardware */
-MACHINE_CONFIG_END
+}
/***************************************************************************
diff --git a/src/mame/drivers/mips.cpp b/src/mame/drivers/mips.cpp
index f1b3f833181..eeb409abad7 100644
--- a/src/mame/drivers/mips.cpp
+++ b/src/mame/drivers/mips.cpp
@@ -43,13 +43,13 @@
* https://web.archive.org/web/20140518203135/http://no-l.org/pages/riscos.html
*
* TODO (rx2030)
- * - remaining iop interface
- * - figure out the brcond0 signal
* - keyboard controller and keyboard
* - buzzer
*
* TODO (rx3230)
* - verify/complete address maps
+ * - keyboard controller and interrupts
+ * - isa slot and colour graphics board
* - idprom
*
* Ref Part Function
@@ -133,7 +133,7 @@
/*
* Rx2030 WIP
*
- * status: loads RISC/os, but panics
+ * status: boots RISC/os, requires unimplemented MIPS keyboard
*
* V50 internal peripherals:
* base = 0xfe00
@@ -171,7 +171,7 @@
/*
* Rx3230 WIP
*
- * status: boots to monitor
+ * status: boots RISC/os from network, panics during installation
*
* R3000 interrupts
* 0 <- lance, scc, slot, keyboard
@@ -231,6 +231,28 @@ void rx2030_state::rx2030_init()
if (!m_vram)
m_iop_interface |= VID_ABSENT;
+
+ /*
+ * HACK: the prom bfs code broadcasts to the network address (i.e. the
+ * host portion is "all zeroes"), instead of to the standard "all ones".
+ * This makes it very difficult to receive the bfs request in a modern host
+ * OS; the patch changes the code to broadcast to the standard broadcast
+ * address instead.
+ *
+ * Technique is identical to that described for the rx3230 below.
+ */
+ switch (system_bios())
+ {
+ case 1:
+ m_rom[0x1ab68 >> 1] = 0x0624;
+ m_rom[0x1ab6a >> 1] = 0xffff;
+ break;
+
+ case 2:
+ m_rom[0x1a7f8 >> 1] = 0x0624;
+ m_rom[0x1a7fa >> 1] = 0xffff;
+ break;
+ }
}
u16 rx2030_state::mmu_r(offs_t offset, u16 mem_mask)
@@ -268,7 +290,7 @@ void rx2030_state::iop_program_map(address_map &map)
map(0x00000, 0x1ffff).ram();
map(0x20000, 0x3ffff).rw(FUNC(rx2030_state::mmu_r), FUNC(rx2030_state::mmu_w));
- map(0x80000, 0xbffff).rom().region("v50_ipl", 0).mirror(0x40000);
+ map(0x80000, 0xbffff).rom().region("rx2030", 0).mirror(0x40000);
}
void rx2030_state::iop_io_map(address_map &map)
@@ -311,10 +333,10 @@ void rx2030_state::iop_io_map(address_map &map)
map(0x0200, 0x0201).rw(m_fio, FUNC(z8038_device::fifo_r<1>), FUNC(z8038_device::fifo_w<1>)).umask16(0xff);
map(0x0202, 0x0203).rw(m_fio, FUNC(z8038_device::reg_r<1>), FUNC(z8038_device::reg_w<1>)).umask16(0xff);
- map(0x0240, 0x0241).lw8("rtc", [this](address_space &space, offs_t offset, u8 data) { m_rtc->write(space, 0, data); }).umask16(0xff00);
+ map(0x0240, 0x0241).lw8("rtc", [this](u8 data) { m_rtc->write(0, data); }).umask16(0xff00);
map(0x0280, 0x0281).lrw8("rtc",
- [this](address_space &space, offs_t offset) { return m_rtc->read(space, 1); },
- [this](address_space &space, offs_t offset, u8 data) { m_rtc->write(space, 1, data); }).umask16(0xff00);
+ [this]() { return m_rtc->read(1); },
+ [this](u8 data) { m_rtc->write(1, data); }).umask16(0xff00);
map(0x02c0, 0x2c1).lw8("cpu_interface", [this](u8 data)
{
@@ -334,7 +356,7 @@ void rx2030_state::iop_io_map(address_map &map)
else
m_iop->set_input_line(INPUT_LINE_IRQ2, CLEAR_LINE);
m_iop_interface |= IOP_IACK;
- m_iop_interface &= ~IOP_IRQ; // maybe?
+ m_iop_interface &= ~IOP_IRQ;
break;
default:
@@ -410,7 +432,7 @@ void rx2030_state::rx2030_map(address_map &map)
case 19: // keyboard
LOGMASKED(LOG_IOCB, "iocb %s command 0x%04x data 0x%02x (%s)\n",
iop_commands[iocb], iop_cmd,
- m_ram->read(0x1000 + iocb_cmdparam + 6),
+ m_ram->read(0x1000 + iocb_cmdparam + 7),
machine().describe_context());
break;
@@ -426,7 +448,7 @@ void rx2030_state::rx2030_map(address_map &map)
// interrupt the iop
m_iop_interface &= ~IOP_IACK;
- m_iop_interface |= IOP_IRQ; // maybe?
+ m_iop_interface |= IOP_IRQ;
m_iop->set_input_line(INPUT_LINE_IRQ2, ASSERT_LINE);
break;
@@ -477,12 +499,13 @@ static void mips_scsi_devices(device_slot_interface &device)
void rx2030_state::rx2030(machine_config &config)
{
R2000A(config, m_cpu, 33.333_MHz_XTAL / 2, 32768, 32768);
- m_cpu->set_fpurev(mips1_device_base::MIPS_R2010A);
+ m_cpu->set_fpu(mips1_device_base::MIPS_R2010A);
m_cpu->in_brcond<0>().set([]() { return 1; }); // writeback complete
V50(config, m_iop, 20_MHz_XTAL / 2);
m_iop->set_addrmap(AS_PROGRAM, &rx2030_state::iop_program_map);
m_iop->set_addrmap(AS_IO, &rx2030_state::iop_io_map);
+ m_iop->out_handler<2>().set(m_buzzer, FUNC(speaker_sound_device::level_w));
// general dma configuration
m_iop->out_hreq_cb().set(m_iop, FUNC(v50_device::hack_w));
@@ -519,6 +542,7 @@ void rx2030_state::rx2030(machine_config &config)
//m_kbdc->hot_res().set_inputline(m_maincpu, INPUT_LINE_RESET);
m_kbdc->kbd_clk().set(kbdc, FUNC(pc_kbdc_device::clock_write_from_mb));
m_kbdc->kbd_data().set(kbdc, FUNC(pc_kbdc_device::data_write_from_mb));
+ m_kbdc->set_default_bios_tag("award15");
SCC85C30(config, m_scc, 1.8432_MHz_XTAL);
m_scc->configure_channels(m_scc->clock(), m_scc->clock(), m_scc->clock(), m_scc->clock());
@@ -547,33 +571,24 @@ void rx2030_state::rx2030(machine_config &config)
FLOPPY_CONNECTOR(config, "fdc:0", "35hd", FLOPPY_35_HD, true, mips_floppy_formats).enable_sound(false);
// scsi bus and devices
- NSCSI_BUS(config, m_scsibus, 0);
-
- nscsi_connector &harddisk(NSCSI_CONNECTOR(config, "scsi:0", 0));
- mips_scsi_devices(harddisk);
- harddisk.set_default_option("harddisk");
-
- mips_scsi_devices(NSCSI_CONNECTOR(config, "scsi:1", 0));
- mips_scsi_devices(NSCSI_CONNECTOR(config, "scsi:2", 0));
- mips_scsi_devices(NSCSI_CONNECTOR(config, "scsi:3", 0));
- mips_scsi_devices(NSCSI_CONNECTOR(config, "scsi:4", 0));
- mips_scsi_devices(NSCSI_CONNECTOR(config, "scsi:5", 0));
- mips_scsi_devices(NSCSI_CONNECTOR(config, "scsi:6", 0));
-
- // scsi host adapter
- nscsi_connector &adapter(NSCSI_CONNECTOR(config, "scsi:7", 0));
- adapter.option_add_internal("aic6250", AIC6250);
- adapter.set_default_option("aic6250");
- adapter.set_fixed(true);
- adapter.set_option_machine_config("aic6250", [this](device_t *device)
- {
- aic6250_device &adapter = downcast<aic6250_device &>(*device);
-
- adapter.set_clock(10_MHz_XTAL); // clock assumed
+ NSCSI_BUS(config, m_scsibus);
+ NSCSI_CONNECTOR(config, "scsi:0", mips_scsi_devices, "harddisk");
+ NSCSI_CONNECTOR(config, "scsi:1", mips_scsi_devices, nullptr);
+ NSCSI_CONNECTOR(config, "scsi:2", mips_scsi_devices, nullptr);
+ NSCSI_CONNECTOR(config, "scsi:3", mips_scsi_devices, nullptr);
+ NSCSI_CONNECTOR(config, "scsi:4", mips_scsi_devices, nullptr);
+ NSCSI_CONNECTOR(config, "scsi:5", mips_scsi_devices, nullptr);
+ NSCSI_CONNECTOR(config, "scsi:6", mips_scsi_devices, nullptr);
+
+ // scsi host adapter (clock assumed)
+ NSCSI_CONNECTOR(config, "scsi:7").option_set("aic6250", AIC6250).clock(10_MHz_XTAL).machine_config(
+ [this](device_t *device)
+ {
+ aic6250_device &adapter = downcast<aic6250_device &>(*device);
- adapter.int_cb().set_inputline(m_iop, INPUT_LINE_IRQ7).invert();
- adapter.breq_cb().set(m_iop, FUNC(v50_device::dreq_w<1>));
- });
+ adapter.int_cb().set_inputline(m_iop, INPUT_LINE_IRQ7).invert();
+ adapter.breq_cb().set(m_iop, FUNC(v50_device::dreq_w<1>));
+ });
// ethernet
AM7990(config, m_net);
@@ -756,7 +771,7 @@ void rx3230_state::rx3230(machine_config &config)
{
R3000A(config, m_cpu, 50_MHz_XTAL / 2, 32768, 32768);
m_cpu->set_addrmap(AS_PROGRAM, &rx3230_state::rx3230_map);
- m_cpu->set_fpurev(mips1_device_base::MIPS_R3010A);
+ m_cpu->set_fpu(mips1_device_base::MIPS_R3010A);
m_cpu->in_brcond<0>().set([]() { return 1; }); // writeback complete
// 32 SIMM slots, 8-128MB memory, banks of 8 1MB or 4MB SIMMs
@@ -767,40 +782,33 @@ void rx3230_state::rx3230(machine_config &config)
MIPS_RAMBO(config, m_rambo, 25_MHz_XTAL / 4);
m_rambo->timer_out().set_inputline(m_cpu, INPUT_LINE_IRQ2);
+ m_rambo->irq_out().set_inputline(m_cpu, INPUT_LINE_IRQ1);
m_rambo->parity_out().set_inputline(m_cpu, INPUT_LINE_IRQ5);
//m_rambo->buzzer_out().set(m_buzzer, FUNC(speaker_sound_device::level_w));
m_rambo->set_ram(m_ram);
- m_rambo->dma_r<0>().set("scsi:7:ncr53c94", FUNC(ncr53c94_device::dma_r));
- m_rambo->dma_w<0>().set("scsi:7:ncr53c94", FUNC(ncr53c94_device::dma_w));
+ m_rambo->dma_r<0>().set("scsi:7:ncr53c94", FUNC(ncr53c94_device::dma16_r));
+ m_rambo->dma_w<0>().set("scsi:7:ncr53c94", FUNC(ncr53c94_device::dma16_w));
// scsi bus and devices
- NSCSI_BUS(config, m_scsibus, 0);
-
- nscsi_connector &harddisk(NSCSI_CONNECTOR(config, "scsi:0", 0));
- mips_scsi_devices(harddisk);
- harddisk.set_default_option("harddisk");
-
- mips_scsi_devices(NSCSI_CONNECTOR(config, "scsi:1", 0));
- mips_scsi_devices(NSCSI_CONNECTOR(config, "scsi:2", 0));
- mips_scsi_devices(NSCSI_CONNECTOR(config, "scsi:3", 0));
- mips_scsi_devices(NSCSI_CONNECTOR(config, "scsi:4", 0));
- mips_scsi_devices(NSCSI_CONNECTOR(config, "scsi:5", 0));
- mips_scsi_devices(NSCSI_CONNECTOR(config, "scsi:6", 0));
+ NSCSI_BUS(config, m_scsibus);
+ NSCSI_CONNECTOR(config, "scsi:0", mips_scsi_devices, "harddisk");
+ NSCSI_CONNECTOR(config, "scsi:1", mips_scsi_devices, nullptr);
+ NSCSI_CONNECTOR(config, "scsi:2", mips_scsi_devices, nullptr);
+ NSCSI_CONNECTOR(config, "scsi:3", mips_scsi_devices, nullptr);
+ NSCSI_CONNECTOR(config, "scsi:4", mips_scsi_devices, nullptr);
+ NSCSI_CONNECTOR(config, "scsi:5", mips_scsi_devices, nullptr);
+ NSCSI_CONNECTOR(config, "scsi:6", mips_scsi_devices, nullptr);
// scsi host adapter
- nscsi_connector &adapter(NSCSI_CONNECTOR(config, "scsi:7", 0));
- adapter.option_add_internal("ncr53c94", NCR53C94);
- adapter.set_default_option("ncr53c94");
- adapter.set_fixed(true);
- adapter.set_option_machine_config("ncr53c94", [this](device_t *device)
- {
- ncr53c94_device &adapter = downcast<ncr53c94_device &>(*device);
-
- adapter.set_clock(24_MHz_XTAL);
+ NSCSI_CONNECTOR(config, "scsi:7").option_set("ncr53c94", NCR53C94).clock(24_MHz_XTAL).machine_config(
+ [this](device_t *device)
+ {
+ ncr53c94_device &adapter = downcast<ncr53c94_device &>(*device);
- adapter.irq_handler_cb().set(*this, FUNC(rx3230_state::irq_w<INT_SCSI>)).invert();
- adapter.drq_handler_cb().set(m_rambo, FUNC(mips_rambo_device::drq_w<0>));
- });
+ adapter.set_busmd(ncr53c94_device::busmd_t::BUSMD_1);
+ adapter.irq_handler_cb().set(*this, FUNC(rx3230_state::irq_w<INT_SCSI>)).invert();
+ adapter.drq_handler_cb().set(m_rambo, FUNC(mips_rambo_device::drq_w<0>));
+ });
// ethernet
AM7990(config, m_net);
@@ -847,7 +855,7 @@ void rx3230_state::rx3230(machine_config &config)
AT_KEYBOARD_CONTROLLER(config, m_kbdc, 12_MHz_XTAL); // TODO: confirm
m_kbdc->kbd_clk().set(kbdc, FUNC(pc_kbdc_device::clock_write_from_mb));
m_kbdc->kbd_data().set(kbdc, FUNC(pc_kbdc_device::data_write_from_mb));
- m_kbdc->kbd_irq().set(FUNC(rx3230_state::irq_w<INT_KBD>));
+ //m_kbdc->kbd_irq().set(FUNC(rx3230_state::irq_w<INT_KBD>));
// buzzer
SPEAKER(config, "mono").front_center();
@@ -958,7 +966,7 @@ void rx3230_state::lance_w(offs_t offset, u16 data, u16 mem_mask)
}
ROM_START(rx2030)
- ROM_REGION16_LE(0x40000, "v50_ipl", 0)
+ ROM_REGION16_LE(0x40000, "rx2030", 0)
ROM_SYSTEM_BIOS(0, "v4.32", "Rx2030 v4.32, Jan 1991")
ROMX_LOAD("50-00121__005.u139", 0x00000, 0x10000, CRC(b2f42665) SHA1(81c83aa6b8865338fda5c03733ede91749997648), ROM_BIOS(0) | ROM_SKIP(1))
ROMX_LOAD("50-00120__005.u140", 0x00001, 0x10000, CRC(0ffa485e) SHA1(7cdfb81d1a547c5ccc88e1e0ef73d447cd03e9e2), ROM_BIOS(0) | ROM_SKIP(1))
@@ -971,9 +979,6 @@ ROM_START(rx2030)
ROMX_LOAD("50-00119__003.u141", 0x20001, 0x10000, CRC(c8469906) SHA1(69bbf4b5c415b2e2156a4467bf9cb30e79f586ef), ROM_BIOS(1) | ROM_SKIP(1))
ROMX_LOAD("50-00118__003.u142", 0x20000, 0x10000, CRC(18cc001a) SHA1(198023e92e1e3ba2fc8637f5dd6f370e7e023fdd), ROM_BIOS(1) | ROM_SKIP(1))
- ROM_REGION(0x800, "i8742_eprom", 0)
- ROM_LOAD("keyboard_1.5.bin", 0x000, 0x800, CRC(f86ba0f7) SHA1(1ad475451db35a76d929824c035d582279fbe3a3))
-
/*
* The following isn't a real dump, but a hand-made nvram image that allows
* entry to the boot monitor. Variables can be adjusted via the monitor,
diff --git a/src/mame/drivers/mirage.cpp b/src/mame/drivers/mirage.cpp
index 661b70d0ecb..49f970c0b9d 100644
--- a/src/mame/drivers/mirage.cpp
+++ b/src/mame/drivers/mirage.cpp
@@ -291,27 +291,27 @@ void miragemj_state::machine_reset()
m_mux_data = 0;
}
-MACHINE_CONFIG_START(miragemj_state::mirage)
-
+void miragemj_state::mirage(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M68000, 28000000/2)
- MCFG_DEVICE_PROGRAM_MAP(mirage_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", miragemj_state, irq6_line_hold)
+ M68000(config, m_maincpu, 28000000/2);
+ m_maincpu->set_addrmap(AS_PROGRAM, &miragemj_state::mirage_map);
+ m_maincpu->set_vblank_int("screen", FUNC(miragemj_state::irq6_line_hold));
EEPROM_93C46_16BIT(config, "eeprom"); // 93C45
/* video hardware */
- MCFG_DEVICE_ADD("spriteram", BUFFERED_SPRITERAM16)
+ BUFFERED_SPRITERAM16(config, m_spriteram);
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(58)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(529))
- MCFG_SCREEN_SIZE(40*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 40*8-1, 1*8, 31*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(miragemj_state, screen_update_mirage)
- MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE("spriteram", buffered_spriteram16_device, vblank_copy_rising))
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(58);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(529));
+ screen.set_size(40*8, 32*8);
+ screen.set_visarea(0*8, 40*8-1, 1*8, 31*8-1);
+ screen.set_screen_update(FUNC(miragemj_state::screen_update_mirage));
+ screen.screen_vblank().set(m_spriteram, FUNC(buffered_spriteram16_device::vblank_copy_rising));
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_mirage)
+ GFXDECODE(config, "gfxdecode", "palette", gfx_mirage);
PALETTE(config, "palette").set_format(palette_device::xBGR_555, 1024);
DECO16IC(config, m_deco_tilegen, 0);
@@ -337,12 +337,10 @@ MACHINE_CONFIG_START(miragemj_state::mirage)
/* sound hardware */
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("oki_bgm", OKIM6295, 2000000, okim6295_device::PIN7_HIGH) // clock frequency & pin 7 not verified
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.30)
+ OKIM6295(config, m_oki_bgm, 2000000, okim6295_device::PIN7_HIGH).add_route(ALL_OUTPUTS, "mono", 0.30); // clock frequency & pin 7 not verified
- MCFG_DEVICE_ADD("oki_sfx", OKIM6295, 1000000, okim6295_device::PIN7_HIGH) // clock frequency & pin 7 not verified
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.70)
-MACHINE_CONFIG_END
+ OKIM6295(config, m_oki_sfx, 1000000, okim6295_device::PIN7_HIGH).add_route(ALL_OUTPUTS, "mono", 0.70); // clock frequency & pin 7 not verified
+}
ROM_START( mirage )
diff --git a/src/mame/drivers/mirax.cpp b/src/mame/drivers/mirax.cpp
index 5a1f0233b93..41946d23965 100644
--- a/src/mame/drivers/mirax.cpp
+++ b/src/mame/drivers/mirax.cpp
@@ -277,14 +277,14 @@ WRITE8_MEMBER(mirax_state::audio_w)
WRITE8_MEMBER(mirax_state::ay1_sel)
{
- m_ay[0]->address_w(space,0,m_nAyCtrl);
- m_ay[0]->data_w(space,0,data);
+ m_ay[0]->address_w(m_nAyCtrl);
+ m_ay[0]->data_w(data);
}
WRITE8_MEMBER(mirax_state::ay2_sel)
{
- m_ay[1]->address_w(space,0,m_nAyCtrl);
- m_ay[1]->data_w(space,0,data);
+ m_ay[1]->address_w(m_nAyCtrl);
+ m_ay[1]->data_w(data);
}
WRITE_LINE_MEMBER(mirax_state::nmi_mask_w)
@@ -482,13 +482,14 @@ WRITE_LINE_MEMBER(mirax_state::vblank_irq)
m_maincpu->set_input_line(INPUT_LINE_NMI, ASSERT_LINE);
}
-MACHINE_CONFIG_START(mirax_state::mirax)
- MCFG_DEVICE_ADD("maincpu", Z80, 12000000/4) // ceramic potted module, encrypted z80
- MCFG_DEVICE_PROGRAM_MAP(mirax_main_map)
+void mirax_state::mirax(machine_config &config)
+{
+ Z80(config, m_maincpu, 12000000/4); // ceramic potted module, encrypted z80
+ m_maincpu->set_addrmap(AS_PROGRAM, &mirax_state::mirax_main_map);
- MCFG_DEVICE_ADD("audiocpu", Z80, 12000000/4)
- MCFG_DEVICE_PROGRAM_MAP(mirax_sound_map)
- MCFG_DEVICE_PERIODIC_INT_DRIVER(mirax_state, irq0_line_hold, 4*60)
+ Z80(config, m_audiocpu, 12000000/4);
+ m_audiocpu->set_addrmap(AS_PROGRAM, &mirax_state::mirax_sound_map);
+ m_audiocpu->set_periodic_int(FUNC(mirax_state::irq0_line_hold), attotime::from_hz(4*60));
ls259_device &mainlatch(LS259(config, "mainlatch")); // R10
mainlatch.q_out_cb<0>().set(FUNC(mirax_state::coin_counter0_w));
@@ -500,14 +501,14 @@ MACHINE_CONFIG_START(mirax_state::mirax)
mainlatch.q_out_cb<7>().set(FUNC(mirax_state::flip_screen_y_w));
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */)
- MCFG_SCREEN_SIZE(256, 256)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 1*8, 31*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(mirax_state, screen_update)
- MCFG_SCREEN_PALETTE(m_palette)
- MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE(*this, mirax_state, vblank_irq))
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500) /* not accurate */);
+ screen.set_size(256, 256);
+ screen.set_visarea(0*8, 32*8-1, 1*8, 31*8-1);
+ screen.set_screen_update(FUNC(mirax_state::screen_update));
+ screen.set_palette(m_palette);
+ screen.screen_vblank().set(FUNC(mirax_state::vblank_irq));
PALETTE(config, m_palette, FUNC(mirax_state::mirax_palette), 0x40);
GFXDECODE(config, m_gfxdecode, m_palette, gfx_mirax);
@@ -518,7 +519,7 @@ MACHINE_CONFIG_START(mirax_state::mirax)
AY8912(config, m_ay[0], 12000000/4).add_route(ALL_OUTPUTS, "mono", 0.80);
AY8912(config, m_ay[1], 12000000/4).add_route(ALL_OUTPUTS, "mono", 0.80);
-MACHINE_CONFIG_END
+}
ROM_START( mirax )
diff --git a/src/mame/drivers/missb2.cpp b/src/mame/drivers/missb2.cpp
index e6fd8d6e23d..99fe7e73234 100644
--- a/src/mame/drivers/missb2.cpp
+++ b/src/mame/drivers/missb2.cpp
@@ -175,12 +175,12 @@ WRITE8_MEMBER(missb2_state::missb2_bg_bank_w)
WRITE8_MEMBER(missb2_state::missb2_oki_w)
{
- m_oki->write_command(bitswap<8>(data, 7,5,6,4,3,1,2,0));
+ m_oki->write(bitswap<8>(data, 7,5,6,4,3,1,2,0));
}
READ8_MEMBER(missb2_state::missb2_oki_r)
{
- return bitswap<8>(m_oki->read_status(), 7,5,6,4,3,1,2,0);
+ return bitswap<8>(m_oki->read(), 7,5,6,4,3,1,2,0);
}
/* Memory Maps */
diff --git a/src/mame/drivers/missbamby.cpp b/src/mame/drivers/missbamby.cpp
new file mode 100644
index 00000000000..305d1955619
--- /dev/null
+++ b/src/mame/drivers/missbamby.cpp
@@ -0,0 +1,134 @@
+// license:BSD-3-Clause
+// copyright-holders:
+
+/*
+Miss Bamby - Automatics Pasqual (ClawGrip 2019-01-21)
+ _____________________________________________________________
+ | _______ |
+ | |__??__| ____________ |
+ | __________________ | EMPTY | |
+ | | M5L8085AP | |_SOCKET____| |
+ | |_________________| ____________ |
+ | ______________ | ROM1 | |
+ | XTAL |M5L8212P | |___________| |
+ | __ 6.144 |____________| ____________ |
+ | |R| | ROM0 | |
+ __| |___________| |
+|__| ________ ________ ___________________ ____________ |
+|__| |ULN2003A |ULN2003A | M5L8155P | |_D5101LC__| |
+|__| |__________________| ____________ |
+|__| ________ _________ |_D5101LC__| |
+|__| _______ |74LS393| |74LS74B1 |
+|__| |7407N | ________ |
+|__| ________ ________ |GD4001B| |
+|__| |74LS14_| |74LS153| _________ |
+|__| ____ | BATT | |
+|__| _______ ___________________ |D | | 3.6V | |
+|__| |LM380N| | AY-3-8910 | |I | |_________| |
+|__| |__________________| |P | ______ |
+|__| |S__| LM311N |
+ |____________________________________________________________|
+*/
+
+#include "emu.h"
+#include "emupal.h"
+#include "screen.h"
+#include "speaker.h"
+#include "cpu/i8085/i8085.h"
+#include "machine/i8155.h"
+//#include "machine/nvram.h"
+#include "machine/pit8253.h"
+#include "sound/ay8910.h"
+
+class missbamby_state : public driver_device
+{
+public:
+ missbamby_state(const machine_config &mconfig, device_type type, const char *tag)
+ : driver_device(mconfig, type, tag),
+ m_maincpu(*this, "maincpu")
+ {
+ }
+
+ void missbamby(machine_config &config);
+
+private:
+ required_device<cpu_device> m_maincpu;
+
+ uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
+
+ void io_map(address_map &map);
+ void prg_map(address_map &map);
+
+ virtual void machine_start() override;
+};
+
+uint32_t missbamby_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
+{
+ return 0;
+}
+
+void missbamby_state::prg_map(address_map &map) // preliminary, everything to be taken with a grain of salt
+{
+ map(0x0000, 0x3fff).rom();
+ map(0x5000, 0x50ff).ram();
+ //map(0x6000, 0x6000).r(); // only read once at start-up?
+ map(0x8000, 0x80ff).ram();
+ map(0x8800, 0x88ff).rw("i8155", FUNC(i8155_device::memory_r), FUNC(i8155_device::memory_w));
+ map(0x8900, 0x8907).rw("i8155", FUNC(i8155_device::io_r), FUNC(i8155_device::io_w));
+ map(0x9000, 0x9003).rw("pit", FUNC(pit8253_device::read), FUNC(pit8253_device::write));
+}
+
+void missbamby_state::io_map(address_map &map)
+{
+ map.global_mask(0xff);
+ map.unmap_value_high();
+}
+
+
+static INPUT_PORTS_START( missbamby )
+ PORT_START("IN0")
+ PORT_BIT( 0xff, IP_ACTIVE_LOW, IPT_UNKNOWN )
+
+ PORT_START("DSW1")
+ PORT_DIPUNKNOWN_DIPLOC(0x01, 0x01, "SW1:1")
+ PORT_DIPUNKNOWN_DIPLOC(0x02, 0x02, "SW1:2")
+ PORT_DIPUNKNOWN_DIPLOC(0x04, 0x04, "SW1:3")
+ PORT_DIPUNKNOWN_DIPLOC(0x08, 0x08, "SW1:4")
+ PORT_DIPUNKNOWN_DIPLOC(0x10, 0x10, "SW1:5")
+ PORT_DIPUNKNOWN_DIPLOC(0x20, 0x20, "SW1:6")
+ PORT_DIPUNKNOWN_DIPLOC(0x40, 0x40, "SW1:7")
+ PORT_DIPUNKNOWN_DIPLOC(0x80, 0x80, "SW1:8")
+INPUT_PORTS_END
+
+
+void missbamby_state::machine_start()
+{
+}
+
+
+
+void missbamby_state::missbamby(machine_config &config)
+{
+ /* basic machine hardware */
+ I8085A(config, m_maincpu, 6.144_MHz_XTAL); // M5L8085AP
+ m_maincpu->set_addrmap(AS_PROGRAM, &missbamby_state::prg_map);
+ m_maincpu->set_addrmap(AS_IO, &missbamby_state::io_map);
+
+ PIT8253(config, "pit", 6.144_MHz_XTAL/4); // guess: only ML82 readable, might be something else
+
+ I8155(config, "i8155", 6.144_MHz_XTAL/2); // M5L8155P, guessed divisor
+
+ /* sound hardware */
+ SPEAKER(config, "mono").front_center();
+ AY8910(config, "ay8910", 6.144_MHz_XTAL / 4).add_route(ALL_OUTPUTS, "mono", 1.0); // guess
+}
+
+
+ROM_START( msbamby )
+ ROM_REGION(0x4000, "maincpu", 0)
+ ROM_LOAD( "1.bin", 0x0000, 0x2000, CRC(7b5efbd9) SHA1(abb4b4432021945aee474c4bdd83979f6460c671) )
+ ROM_LOAD( "2.bin", 0x2000, 0x2000, CRC(6048d5cd) SHA1(a3bbf43b1474de75aef9957b967ead96b9a18fc5) )
+ROM_END
+
+
+GAME( 198?, msbamby, 0, missbamby, missbamby, missbamby_state, empty_init, ROT0, "Automatics Pasqual", "Miss Bamby", MACHINE_IS_SKELETON_MECHANICAL )
diff --git a/src/mame/drivers/missile.cpp b/src/mame/drivers/missile.cpp
index 87112ab0d88..2a62d81080f 100644
--- a/src/mame/drivers/missile.cpp
+++ b/src/mame/drivers/missile.cpp
@@ -742,7 +742,7 @@ WRITE8_MEMBER(missile_state::missile_w)
else if (offset < 0x4800)
{
if (m_pokey.found())
- m_pokey->write(space, offset, data, 0xff);
+ m_pokey->write(offset, data);
}
/* OUT0 */
@@ -804,7 +804,7 @@ READ8_MEMBER(missile_state::missile_r)
else if (offset < 0x4800)
{
if (m_pokey.found())
- result = m_pokey->read(space, offset & 0x0f, 0xff);
+ result = m_pokey->read(offset & 0x0f);
}
/* IN0 */
diff --git a/src/mame/drivers/mitchell.cpp b/src/mame/drivers/mitchell.cpp
index 044ebd58744..5bddb9f9bdb 100644
--- a/src/mame/drivers/mitchell.cpp
+++ b/src/mame/drivers/mitchell.cpp
@@ -1161,30 +1161,29 @@ TIMER_DEVICE_CALLBACK_MEMBER(mitchell_state::mitchell_irq)
}
}
-MACHINE_CONFIG_START(mitchell_state::mgakuen)
-
+void mitchell_state::mgakuen(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, XTAL(16'000'000)/2) /* probably same clock as the other mitchell hardware games */
- MCFG_DEVICE_PROGRAM_MAP(mgakuen_map)
- MCFG_DEVICE_IO_MAP(mitchell_io_map)
- MCFG_TIMER_DRIVER_ADD_SCANLINE("scantimer", mitchell_state, mitchell_irq, "screen", 0, 1)
+ Z80(config, m_maincpu, XTAL(16'000'000)/2); /* probably same clock as the other mitchell hardware games */
+ m_maincpu->set_addrmap(AS_PROGRAM, &mitchell_state::mgakuen_map);
+ m_maincpu->set_addrmap(AS_IO, &mitchell_state::mitchell_io_map);
+ TIMER(config, "scantimer").configure_scanline(FUNC(mitchell_state::mitchell_irq), "screen", 0, 1);
MCFG_MACHINE_START_OVERRIDE(mitchell_state,mitchell)
MCFG_MACHINE_RESET_OVERRIDE(mitchell_state,mitchell)
- EEPROM_93C46_16BIT(config, "eeprom");
+ EEPROM_93C46_16BIT(config, m_eeprom);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */)
- MCFG_SCREEN_SIZE(64*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(8*8, (64-8)*8-1, 1*8, 31*8-1 )
- MCFG_SCREEN_UPDATE_DRIVER(mitchell_state, screen_update_pang)
- MCFG_SCREEN_PALETTE(m_palette)
-
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_mgakuen)
-
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */
+ screen.set_size(64*8, 32*8);
+ screen.set_visarea(8*8, (64-8)*8-1, 1*8, 31*8-1);
+ screen.set_screen_update(FUNC(mitchell_state::screen_update_pang));
+ screen.set_palette(m_palette);
+
+ GFXDECODE(config, m_gfxdecode, m_palette, gfx_mgakuen);
PALETTE(config, m_palette).set_format(palette_device::xRGB_444, 1024); // less colors than the others
MCFG_VIDEO_START_OVERRIDE(mitchell_state,pang)
@@ -1192,39 +1191,37 @@ MACHINE_CONFIG_START(mitchell_state::mgakuen)
/* sound hardware */
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("oki", OKIM6295, XTAL(16'000'000)/16, okim6295_device::PIN7_HIGH) /* probably same clock as the other mitchell hardware games */
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.50)
+ OKIM6295(config, m_oki, XTAL(16'000'000)/16, okim6295_device::PIN7_HIGH); /* probably same clock as the other mitchell hardware games */
+ m_oki->add_route(ALL_OUTPUTS, "mono", 0.50);
- MCFG_DEVICE_ADD("ymsnd", YM2413, XTAL(16'000'000)/4) /* probably same clock as the other mitchell hardware games */
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
-MACHINE_CONFIG_END
-
-
-MACHINE_CONFIG_START(mitchell_state::pang)
+ ym2413_device &ymsnd(YM2413(config, "ymsnd", XTAL(16'000'000)/4)); /* probably same clock as the other mitchell hardware games */
+ ymsnd.add_route(ALL_OUTPUTS, "mono", 1.0);
+}
+void mitchell_state::pang(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu",Z80, XTAL(16'000'000)/2) /* verified on pcb */
- MCFG_DEVICE_PROGRAM_MAP(mitchell_map)
- MCFG_DEVICE_IO_MAP(mitchell_io_map)
- MCFG_DEVICE_OPCODES_MAP(decrypted_opcodes_map)
- MCFG_TIMER_DRIVER_ADD_SCANLINE("scantimer", mitchell_state, mitchell_irq, "screen", 0, 1)
+ Z80(config, m_maincpu, XTAL(16'000'000)/2); /* verified on pcb */
+ m_maincpu->set_addrmap(AS_PROGRAM, &mitchell_state::mitchell_map);
+ m_maincpu->set_addrmap(AS_IO, &mitchell_state::mitchell_io_map);
+ m_maincpu->set_addrmap(AS_OPCODES, &mitchell_state::decrypted_opcodes_map);
+ TIMER(config, "scantimer").configure_scanline(FUNC(mitchell_state::mitchell_irq), "screen", 0, 1);
MCFG_MACHINE_START_OVERRIDE(mitchell_state,mitchell)
MCFG_MACHINE_RESET_OVERRIDE(mitchell_state,mitchell)
- EEPROM_93C46_16BIT(config, "eeprom");
+ EEPROM_93C46_16BIT(config, m_eeprom);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(57.42) /* verified on pcb */
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */)
- MCFG_SCREEN_SIZE(64*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(8*8, (64-8)*8-1, 1*8, 31*8-1 )
- MCFG_SCREEN_UPDATE_DRIVER(mitchell_state, screen_update_pang)
- MCFG_SCREEN_PALETTE(m_palette)
-
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_mitchell)
-
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(57.42); /* verified on pcb */
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */
+ screen.set_size(64*8, 32*8);
+ screen.set_visarea(8*8, (64-8)*8-1, 1*8, 31*8-1);
+ screen.set_screen_update(FUNC(mitchell_state::screen_update_pang));
+ screen.set_palette(m_palette);
+
+ GFXDECODE(config, m_gfxdecode, m_palette, gfx_mitchell);
PALETTE(config, m_palette).set_format(palette_device::xRGB_444, 2048);
MCFG_VIDEO_START_OVERRIDE(mitchell_state,pang)
@@ -1232,12 +1229,12 @@ MACHINE_CONFIG_START(mitchell_state::pang)
/* sound hardware */
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("oki", OKIM6295, XTAL(16'000'000)/16, okim6295_device::PIN7_HIGH) /* verified on pcb */
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.30)
+ OKIM6295(config, m_oki, XTAL(16'000'000)/16, okim6295_device::PIN7_HIGH); /* verified on pcb */
+ m_oki->add_route(ALL_OUTPUTS, "mono", 0.30);
- MCFG_DEVICE_ADD("ymsnd",YM2413, XTAL(16'000'000)/4) /* verified on pcb */
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
-MACHINE_CONFIG_END
+ ym2413_device &ymsnd(YM2413(config, "ymsnd", XTAL(16'000'000)/4)); /* verified on pcb */
+ ymsnd.add_route(ALL_OUTPUTS, "mono", 1.0);
+}
void mitchell_state::pangnv(machine_config &config)
{
@@ -1275,74 +1272,71 @@ WRITE_LINE_MEMBER(mitchell_state::spangbl_adpcm_int)
m_audiocpu->set_input_line(INPUT_LINE_NMI, m_sample_select);
}
-
-MACHINE_CONFIG_START(mitchell_state::spangbl)
+void mitchell_state::spangbl(machine_config &config)
+{
pangnv(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(spangbl_map)
- MCFG_DEVICE_IO_MAP(spangbl_io_map)
- MCFG_DEVICE_OPCODES_MAP(decrypted_opcodes_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", mitchell_state, irq0_line_hold)
+ m_maincpu->set_addrmap(AS_PROGRAM, &mitchell_state::spangbl_map);
+ m_maincpu->set_addrmap(AS_IO, &mitchell_state::spangbl_io_map);
+ m_maincpu->set_addrmap(AS_OPCODES, &mitchell_state::decrypted_opcodes_map);
+ m_maincpu->set_vblank_int("screen", FUNC(mitchell_state::irq0_line_hold));
- MCFG_DEVICE_REMOVE("scantimer")
+ config.device_remove("scantimer");
- MCFG_DEVICE_ADD("audiocpu", Z80, 4000000) // Z80A CPU; clock unknown
- MCFG_DEVICE_PROGRAM_MAP(spangbl_sound_map)
+ Z80(config, m_audiocpu, 4000000); // Z80A CPU; clock unknown
+ m_audiocpu->set_addrmap(AS_PROGRAM, &mitchell_state::spangbl_sound_map);
- MCFG_GFXDECODE_MODIFY("gfxdecode", gfx_spangbl)
+ m_gfxdecode->set_info(gfx_spangbl);
GENERIC_LATCH_8(config, m_soundlatch);
m_soundlatch->data_pending_callback().set_inputline(m_audiocpu, 0);
- MCFG_DEVICE_REMOVE("oki")
- MCFG_DEVICE_ADD("msm", MSM5205, 400000) // clock and prescaler unknown
- MCFG_MSM5205_VCLK_CB(WRITELINE(*this, mitchell_state, spangbl_adpcm_int)) // controls music as well as ADCPM rate
- MCFG_MSM5205_PRESCALER_SELECTOR(S96_4B)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.50)
+ config.device_remove("oki");
+ MSM5205(config, m_msm, 400000); // clock and prescaler unknown
+ m_msm->vck_legacy_callback().set(FUNC(mitchell_state::spangbl_adpcm_int)); // controls music as well as ADCPM rate
+ m_msm->set_prescaler_selector(msm5205_device::S96_4B);
+ m_msm->add_route(ALL_OUTPUTS, "mono", 0.50);
LS157(config, m_adpcm_select, 0);
m_adpcm_select->out_callback().set("msm", FUNC(msm5205_device::data_w));
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(mitchell_state::pangba)
+void mitchell_state::pangba(machine_config &config)
+{
spangbl(config);
- MCFG_DEVICE_MODIFY("audiocpu")
- MCFG_DEVICE_PROGRAM_MAP(pangba_sound_map)
-
- MCFG_DEVICE_REPLACE("ymsnd", YM3812, 4000000)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
-MACHINE_CONFIG_END
+ m_audiocpu->set_addrmap(AS_PROGRAM, &mitchell_state::pangba_sound_map);
-MACHINE_CONFIG_START(mitchell_state::mstworld)
+ YM3812(config.replace(), "ymsnd", 4000000).add_route(ALL_OUTPUTS, "mono", 1.0);
+}
+void mitchell_state::mstworld(machine_config &config)
+{
/* basic machine hardware */
/* it doesn't glitch with the clock speed set to 4x normal, however this is incorrect..
the interrupt handling (and probably various irq flags / vbl flags handling etc.) is
more likely wrong.. the game appears to run too fast anyway .. */
- MCFG_DEVICE_ADD("maincpu", Z80, 6000000*4)
- MCFG_DEVICE_PROGRAM_MAP(mitchell_map)
- MCFG_DEVICE_IO_MAP(mstworld_io_map)
- MCFG_DEVICE_OPCODES_MAP(decrypted_opcodes_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", mitchell_state, irq0_line_hold)
+ Z80(config, m_maincpu, 6000000*4);
+ m_maincpu->set_addrmap(AS_PROGRAM, &mitchell_state::mitchell_map);
+ m_maincpu->set_addrmap(AS_IO, &mitchell_state::mstworld_io_map);
+ m_maincpu->set_addrmap(AS_OPCODES, &mitchell_state::decrypted_opcodes_map);
+ m_maincpu->set_vblank_int("screen", FUNC(mitchell_state::irq0_line_hold));
- MCFG_DEVICE_ADD("audiocpu", Z80,6000000) /* 6 MHz? */
- MCFG_DEVICE_PROGRAM_MAP(mstworld_sound_map)
+ Z80(config, m_audiocpu, 6000000); /* 6 MHz? */
+ m_audiocpu->set_addrmap(AS_PROGRAM, &mitchell_state::mstworld_sound_map);
MCFG_MACHINE_START_OVERRIDE(mitchell_state,mitchell)
MCFG_MACHINE_RESET_OVERRIDE(mitchell_state,mitchell)
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */)
- MCFG_SCREEN_SIZE(64*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(8*8, (64-8)*8-1, 1*8, 31*8-1 )
- MCFG_SCREEN_UPDATE_DRIVER(mitchell_state, screen_update_pang)
- MCFG_SCREEN_PALETTE(m_palette)
-
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_mstworld)
-
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */
+ screen.set_size(64*8, 32*8);
+ screen.set_visarea(8*8, (64-8)*8-1, 1*8, 31*8-1);
+ screen.set_screen_update(FUNC(mitchell_state::screen_update_pang));
+ screen.set_palette(m_palette);
+
+ GFXDECODE(config, m_gfxdecode, m_palette, gfx_mstworld);
PALETTE(config, m_palette).set_format(palette_device::xRGB_444, 2048);
MCFG_VIDEO_START_OVERRIDE(mitchell_state,pang)
@@ -1352,33 +1346,31 @@ MACHINE_CONFIG_START(mitchell_state::mstworld)
GENERIC_LATCH_8(config, m_soundlatch);
- MCFG_DEVICE_ADD("oki", OKIM6295, 990000, okim6295_device::PIN7_HIGH) // clock frequency & pin 7 not verified
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.50)
-MACHINE_CONFIG_END
-
-
-MACHINE_CONFIG_START(mitchell_state::marukin)
+ OKIM6295(config, m_oki, 990000, okim6295_device::PIN7_HIGH); // clock frequency & pin 7 not verified
+ m_oki->add_route(ALL_OUTPUTS, "mono", 0.50);
+}
+void mitchell_state::marukin(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, XTAL(16'000'000)/2) /* verified on pcb */
- MCFG_DEVICE_PROGRAM_MAP(mitchell_map)
- MCFG_DEVICE_IO_MAP(mitchell_io_map)
- MCFG_DEVICE_OPCODES_MAP(decrypted_opcodes_map)
- MCFG_TIMER_DRIVER_ADD_SCANLINE("scantimer", mitchell_state, mitchell_irq, "screen", 0, 1)
+ Z80(config, m_maincpu, XTAL(16'000'000)/2); /* verified on pcb */
+ m_maincpu->set_addrmap(AS_PROGRAM, &mitchell_state::mitchell_map);
+ m_maincpu->set_addrmap(AS_IO, &mitchell_state::mitchell_io_map);
+ m_maincpu->set_addrmap(AS_OPCODES, &mitchell_state::decrypted_opcodes_map);
+ TIMER(config, "scantimer").configure_scanline(FUNC(mitchell_state::mitchell_irq), "screen", 0, 1);
- EEPROM_93C46_16BIT(config, "eeprom");
+ EEPROM_93C46_16BIT(config, m_eeprom);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */)
- MCFG_SCREEN_SIZE(64*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(8*8, (64-8)*8-1, 1*8, 31*8-1 )
- MCFG_SCREEN_UPDATE_DRIVER(mitchell_state, screen_update_pang)
- MCFG_SCREEN_PALETTE(m_palette)
-
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_marukin)
-
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */
+ screen.set_size(64*8, 32*8);
+ screen.set_visarea(8*8, (64-8)*8-1, 1*8, 31*8-1);
+ screen.set_screen_update(FUNC(mitchell_state::screen_update_pang));
+ screen.set_palette(m_palette);
+
+ GFXDECODE(config, m_gfxdecode, m_palette, gfx_marukin);
PALETTE(config, m_palette).set_format(palette_device::xRGB_444, 2048);
MCFG_VIDEO_START_OVERRIDE(mitchell_state,pang)
@@ -1386,12 +1378,12 @@ MACHINE_CONFIG_START(mitchell_state::marukin)
/* sound hardware */
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("oki", OKIM6295, XTAL(16'000'000)/16, okim6295_device::PIN7_HIGH) /* verified on pcb */
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.30)
+ OKIM6295(config, m_oki, XTAL(16'000'000)/16, okim6295_device::PIN7_HIGH); /* verified on pcb */
+ m_oki->add_route(ALL_OUTPUTS, "mono", 0.30);
- MCFG_DEVICE_ADD("ymsnd", YM2413, XTAL(16'000'000)/4) /* verified on pcb */
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
-MACHINE_CONFIG_END
+ ym2413_device &ymsnd(YM2413(config, "ymsnd", XTAL(16'000'000)/4)); /* verified on pcb */
+ ymsnd.add_route(ALL_OUTPUTS, "mono", 1.0);
+}
/*
@@ -1411,28 +1403,27 @@ Vsync is 59.09hz
*/
-MACHINE_CONFIG_START(mitchell_state::pkladiesbl)
-
+void mitchell_state::pkladiesbl(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, XTAL(12'000'000)/2) /* verified on pcb */
- MCFG_DEVICE_PROGRAM_MAP(mitchell_map)
- MCFG_DEVICE_IO_MAP(mitchell_io_map)
- MCFG_DEVICE_OPCODES_MAP(decrypted_opcodes_map)
- MCFG_TIMER_DRIVER_ADD_SCANLINE("scantimer", mitchell_state, mitchell_irq, "screen", 0, 1)
+ Z80(config, m_maincpu, XTAL(12'000'000)/2); /* verified on pcb */
+ m_maincpu->set_addrmap(AS_PROGRAM, &mitchell_state::mitchell_map);
+ m_maincpu->set_addrmap(AS_IO, &mitchell_state::mitchell_io_map);
+ m_maincpu->set_addrmap(AS_OPCODES, &mitchell_state::decrypted_opcodes_map);
+ TIMER(config, "scantimer").configure_scanline(FUNC(mitchell_state::mitchell_irq), "screen", 0, 1);
- EEPROM_93C46_16BIT(config, "eeprom");
+ EEPROM_93C46_16BIT(config, m_eeprom);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(59.09) /* verified on pcb */
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */)
- MCFG_SCREEN_SIZE(64*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(8*8, (64-8)*8-1, 1*8, 31*8-1 )
- MCFG_SCREEN_UPDATE_DRIVER(mitchell_state, screen_update_pang)
- MCFG_SCREEN_PALETTE(m_palette)
-
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_pkladiesbl)
-
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(59.09); /* verified on pcb */
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */
+ screen.set_size(64*8, 32*8);
+ screen.set_visarea(8*8, (64-8)*8-1, 1*8, 31*8-1);
+ screen.set_screen_update(FUNC(mitchell_state::screen_update_pang));
+ screen.set_palette(m_palette);
+
+ GFXDECODE(config, m_gfxdecode, m_palette, gfx_pkladiesbl);
PALETTE(config, m_palette).set_format(palette_device::xRGB_444, 2048);
MCFG_VIDEO_START_OVERRIDE(mitchell_state,pang)
@@ -1440,12 +1431,12 @@ MACHINE_CONFIG_START(mitchell_state::pkladiesbl)
/* sound hardware */
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("oki", OKIM6295, XTAL(16'000'000)/16, okim6295_device::PIN7_HIGH) /* It should be a OKIM5205 with a 384khz resonator */
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.50)
+ OKIM6295(config, m_oki, XTAL(16'000'000)/16, okim6295_device::PIN7_HIGH); /* It should be a OKIM5205 with a 384khz resonator */
+ m_oki->add_route(ALL_OUTPUTS, "mono", 0.50);
- MCFG_DEVICE_ADD("ymsnd", YM2413, 3750000) /* verified on pcb, read the comments */
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
-MACHINE_CONFIG_END
+ ym2413_device &ymsnd(YM2413(config, "ymsnd", 3750000)); /* verified on pcb, read the comments */
+ ymsnd.add_route(ALL_OUTPUTS, "mono", 1.0);
+}
/*************************************
*
@@ -1808,7 +1799,7 @@ ROM_END
// Similar to "pangbold" but with data on a battery backed 256Kbit RAM (undumped), on a small sub-board with the Z84 and a PLD (also undumped, was protected).
ROM_START( pangbp )
ROM_REGION( 2*0x50000, "maincpu", 0 )
- ROM_LOAD( "pangbp_nvr.bin", 0x00000, 0x08000, NO_DUMP ) // Opcodes + data (?) on battery backed RAM (the battery was dead, so it's undumped)
+ ROM_LOAD( "pangbp_nvr.bin", 0x00000, 0x08000, NO_DUMP ) // Opcodes + data (?) on battery backed RAM (the battery was dead, so it's undumped)
ROM_LOAD( "pangbp_4.6l", 0x50000, 0x08000, CRC(01bc7ecf) SHA1(7f3e3cf5f5d03d1c2d1ad624627feb941aea7414) ) // Opcodes + data on ROM (almost the same as the first half of "4.6l" on "pangbold")
ROM_LOAD( "pangbp_2.3l", 0x60000, 0x20000, CRC(3f15bb61) SHA1(4f74ee25f32a201482840158b4d4c7aca1cda684) ) // Decrypted opcodes
ROM_LOAD( "pangbp_3.5l", 0x10000, 0x20000, CRC(ce6375e4) SHA1(fdd40d82553fcd4d2762ecfd898d0e3112dfde79) ) // Decrypted data
diff --git a/src/mame/drivers/mjkjidai.cpp b/src/mame/drivers/mjkjidai.cpp
index 8470d46d095..2aa94b2d72a 100644
--- a/src/mame/drivers/mjkjidai.cpp
+++ b/src/mame/drivers/mjkjidai.cpp
@@ -94,8 +94,8 @@ void mjkjidai_state::mjkjidai_io_map(address_map &map)
map.global_mask(0xff);
map(0x00, 0x03).rw("ppi1", FUNC(i8255_device::read), FUNC(i8255_device::write));
map(0x10, 0x13).rw("ppi2", FUNC(i8255_device::read), FUNC(i8255_device::write));
- map(0x20, 0x20).w("sn1", FUNC(sn76489_device::command_w));
- map(0x30, 0x30).w("sn2", FUNC(sn76489_device::command_w));
+ map(0x20, 0x20).w("sn1", FUNC(sn76489_device::write));
+ map(0x30, 0x30).w("sn2", FUNC(sn76489_device::write));
map(0x40, 0x40).w(FUNC(mjkjidai_state::adpcm_w));
}
@@ -296,14 +296,14 @@ void mjkjidai_state::machine_reset()
m_adpcm_pos = m_adpcm_end = 0;
}
-MACHINE_CONFIG_START(mjkjidai_state::mjkjidai)
-
+void mjkjidai_state::mjkjidai(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80,10000000/2) /* 5 MHz ??? */
- MCFG_DEVICE_PROGRAM_MAP(mjkjidai_map)
- MCFG_DEVICE_IO_MAP(mjkjidai_io_map)
+ Z80(config, m_maincpu, 10000000/2); /* 5 MHz ??? */
+ m_maincpu->set_addrmap(AS_PROGRAM, &mjkjidai_state::mjkjidai_map);
+ m_maincpu->set_addrmap(AS_IO, &mjkjidai_state::mjkjidai_io_map);
- NVRAM(config, "nvram", nvram_device::DEFAULT_NONE);
+ NVRAM(config, m_nvram, nvram_device::DEFAULT_NONE);
i8255_device &ppi1(I8255A(config, "ppi1"));
ppi1.in_pa_callback().set_ioport("KEYBOARD");
@@ -317,34 +317,29 @@ MACHINE_CONFIG_START(mjkjidai_state::mjkjidai)
ppi2.in_pc_callback().set_ioport("DSW2");
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(64*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(3*8, 61*8-1, 2*8, 30*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(mjkjidai_state, screen_update_mjkjidai)
- MCFG_SCREEN_PALETTE("palette")
- MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE(*this, mjkjidai_state, vblank_irq))
-
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_mjkjidai)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(64*8, 32*8);
+ screen.set_visarea(3*8, 61*8-1, 2*8, 30*8-1);
+ screen.set_screen_update(FUNC(mjkjidai_state::screen_update_mjkjidai));
+ screen.set_palette(m_palette);
+ screen.screen_vblank().set(FUNC(mjkjidai_state::vblank_irq));
+
+ GFXDECODE(config, m_gfxdecode, m_palette, gfx_mjkjidai);
PALETTE(config, m_palette, palette_device::RGB_444_PROMS, "proms", 0x100);
/* sound hardware */
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("sn1", SN76489, 10000000/4)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.50)
-
- MCFG_DEVICE_ADD("sn2", SN76489, 10000000/4)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.50)
-
- MCFG_DEVICE_ADD("msm", MSM5205, 384000)
- MCFG_MSM5205_VCLK_CB(WRITELINE(*this, mjkjidai_state, adpcm_int))
- MCFG_MSM5205_PRESCALER_SELECTOR(S64_4B) /* 6kHz */
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
-MACHINE_CONFIG_END
-
+ SN76489(config, "sn1", 10000000/4).add_route(ALL_OUTPUTS, "mono", 0.50);
+ SN76489(config, "sn2", 10000000/4).add_route(ALL_OUTPUTS, "mono", 0.50);
+ MSM5205(config, m_msm, 384000);
+ m_msm->vck_legacy_callback().set(FUNC(mjkjidai_state::adpcm_int));
+ m_msm->set_prescaler_selector(msm5205_device::S64_4B); /* 6kHz */
+ m_msm->add_route(ALL_OUTPUTS, "mono", 1.0);
+}
/***************************************************************************
diff --git a/src/mame/drivers/mjsenpu.cpp b/src/mame/drivers/mjsenpu.cpp
index b79a85f8765..c0780ae7eea 100644
--- a/src/mame/drivers/mjsenpu.cpp
+++ b/src/mame/drivers/mjsenpu.cpp
@@ -463,35 +463,34 @@ following clocks are on the PCB
*/
-MACHINE_CONFIG_START(mjsenpu_state::mjsenpu)
-
+void mjsenpu_state::mjsenpu(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", E132XT, 27000000*2) /* ?? Mhz */
- MCFG_DEVICE_PROGRAM_MAP(mjsenpu_32bit_map)
- MCFG_DEVICE_IO_MAP(mjsenpu_io)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", mjsenpu_state, irq0_line_hold)
+ E132XT(config, m_maincpu, 27000000*2); /* ?? Mhz */
+ m_maincpu->set_addrmap(AS_PROGRAM, &mjsenpu_state::mjsenpu_32bit_map);
+ m_maincpu->set_addrmap(AS_IO, &mjsenpu_state::mjsenpu_io);
+ m_maincpu->set_vblank_int("screen", FUNC(mjsenpu_state::irq0_line_hold));
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_1);
// more likely coins out?
- MCFG_TICKET_DISPENSER_ADD("hopper", attotime::from_msec(50), TICKET_MOTOR_ACTIVE_LOW, TICKET_STATUS_ACTIVE_HIGH)
+ TICKET_DISPENSER(config, m_hopper, attotime::from_msec(50), TICKET_MOTOR_ACTIVE_LOW, TICKET_STATUS_ACTIVE_HIGH);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(512, 256)
- MCFG_SCREEN_VISIBLE_AREA(0, 512-1, 0, 256-16-1)
- MCFG_SCREEN_UPDATE_DRIVER(mjsenpu_state, screen_update_mjsenpu)
- MCFG_SCREEN_PALETTE("palette")
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(512, 256);
+ screen.set_visarea(0, 512-1, 0, 256-16-1);
+ screen.set_screen_update(FUNC(mjsenpu_state::screen_update_mjsenpu));
+ screen.set_palette(m_palette);
- MCFG_PALETTE_ADD("palette", 0x100)
+ PALETTE(config, m_palette).set_entries(0x100);
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("oki", OKIM6295, 1000000, okim6295_device::PIN7_HIGH) /* 1 Mhz? */
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.00)
-MACHINE_CONFIG_END
+ OKIM6295(config, m_oki, 1000000, okim6295_device::PIN7_HIGH).add_route(ALL_OUTPUTS, "mono", 1.00); /* 1 Mhz? */
+}
ROM_START( mjsenpu )
diff --git a/src/mame/drivers/mjsister.cpp b/src/mame/drivers/mjsister.cpp
index c150358cc9a..37a2378a550 100644
--- a/src/mame/drivers/mjsister.cpp
+++ b/src/mame/drivers/mjsister.cpp
@@ -493,13 +493,13 @@ INTERRUPT_GEN_MEMBER(mjsister_state::interrupt)
m_maincpu->set_input_line(0, ASSERT_LINE);
}
-MACHINE_CONFIG_START(mjsister_state::mjsister)
-
+void mjsister_state::mjsister(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, MCLK/2) /* 6.000 MHz */
- MCFG_DEVICE_PROGRAM_MAP(mjsister_map)
- MCFG_DEVICE_IO_MAP(mjsister_io_map)
- MCFG_DEVICE_PERIODIC_INT_DRIVER(mjsister_state, interrupt, 2*60)
+ Z80(config, m_maincpu, MCLK/2); /* 6.000 MHz */
+ m_maincpu->set_addrmap(AS_PROGRAM, &mjsister_state::mjsister_map);
+ m_maincpu->set_addrmap(AS_IO, &mjsister_state::mjsister_io_map);
+ m_maincpu->set_periodic_int(FUNC(mjsister_state::interrupt), attotime::from_hz(2*60));
LS259(config, m_mainlatch[0]);
m_mainlatch[0]->q_out_cb<0>().set(FUNC(mjsister_state::rombank_w));
@@ -517,13 +517,13 @@ MACHINE_CONFIG_START(mjsister_state::mjsister)
m_mainlatch[1]->q_out_cb<6>().set(FUNC(mjsister_state::rombank_w));
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */)
- MCFG_SCREEN_SIZE(256+4, 256)
- MCFG_SCREEN_VISIBLE_AREA(0, 255+4, 8, 247)
- MCFG_SCREEN_UPDATE_DRIVER(mjsister_state, screen_update)
- MCFG_SCREEN_PALETTE(m_palette)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500) /* not accurate */);
+ screen.set_size(256+4, 256);
+ screen.set_visarea(0, 255+4, 8, 247);
+ screen.set_screen_update(FUNC(mjsister_state::screen_update));
+ screen.set_palette(m_palette);
PALETTE(config, m_palette, palette_device::RGB_444_PROMS, "proms", 256);
@@ -536,10 +536,11 @@ MACHINE_CONFIG_START(mjsister_state::mjsister)
aysnd.port_b_read_callback().set_ioport("DSW2");
aysnd.add_route(ALL_OUTPUTS, "speaker", 0.15);
- MCFG_DEVICE_ADD("dac", DAC_8BIT_R2R, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 0.5) // unknown DAC
- MCFG_DEVICE_ADD("vref", VOLTAGE_REGULATOR, 0) MCFG_VOLTAGE_REGULATOR_OUTPUT(5.0)
- MCFG_SOUND_ROUTE(0, "dac", 1.0, DAC_VREF_POS_INPUT) MCFG_SOUND_ROUTE(0, "dac", -1.0, DAC_VREF_NEG_INPUT)
-MACHINE_CONFIG_END
+ DAC_8BIT_R2R(config, "dac", 0).add_route(ALL_OUTPUTS, "speaker", 0.5); // unknown DAC
+ voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref"));
+ vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT);
+ vref.add_route(0, "dac", -1.0, DAC_VREF_NEG_INPUT);
+}
/*************************************
*
diff --git a/src/mame/drivers/mk1.cpp b/src/mame/drivers/mk1.cpp
index d9f6bee12d2..e24794400da 100644
--- a/src/mame/drivers/mk1.cpp
+++ b/src/mame/drivers/mk1.cpp
@@ -1,19 +1,26 @@
// license:GPL-2.0+
-// copyright-holders:Peter Trauner
+// copyright-holders:Peter Trauner, Wilbert Pol, hap
/******************************************************************************
- mk1.c
+Driver file to handle emulation of the Novag/Videomaster Chess Champion MK I
+Initial version by PeT mess@utanet.at 2000,2001.
-Driver file to handle emulation of the Novag/Videomaster Chess Champion MK 1
-by PeT mess@utanet.at 2000,2001.
+The MK I was a clone of Data Cash Systems's CompuChess (1977, one of the first
+chess computers). The ROM is identical. DCS sued Novag Industries for copyright
+infringement and somehow didn't manage to win the case.
-Minor updates by Wilbert Pol - 2007
+Unlike CompuChess, MK I was a large success, we can assume that it kickstarted
+Novag's chess computer generation. It was also distributed as "Computer Chess"
+by JS&A, in the same casing as MK I.
-Hardware descriptions:
-- An F8 3850 CPU accompanied by a 3853 memory interface
+To start playing, enter difficulty level (1-6), then when it says "bP", press A
+for new game, B for empty board, or C for continue.
+
+MK I hardware description:
+- An F8 3850 CPU accompanied by a 3853 memory interface, approx 2MHz
Variations seen:
- - MOSTEK MK 3853N 7915 Philippines ( static memory interface for f8)
- - MOSTEK MK 3850N-3 7917 Philipines (fairchild f8 cpu)
+ - MOSTEK MK 3853N 7915 Philippines (static memory interface for F8)
+ - MOSTEK MK 3850N-3 7917 Philipines (Fairchild F8 CPU)
- 3850PK F7901 SINGAPORE (Fairchild F8 CPU)
- 3853PK F7851 SINGAPORE (static memory interface for F8)
- 2KB 2316 compatible ROM
@@ -33,11 +40,8 @@ Hardware descriptions:
- The digit display is driven by two other components:
- SN75492N MALAYSIA 7840B
- ULN2033A 7847
-- Hardware addressing is controlled by a NBF4001AE.
-- Unknown if there is a speaker.
-
-TODO:
-- Figure out exact clock frequency
+- Hardware addressing is controlled by a HBF4001AE.
+- No speaker.
******************************************************************************/
@@ -45,175 +49,270 @@ TODO:
#include "cpu/f8/f8.h"
#include "machine/f3853.h"
#include "machine/timer.h"
-#include "mk1.lh"
+
+// internal artwork
+#include "cmpchess.lh" // clickable
+#include "mk1.lh" // clickable
+namespace {
+
class mk1_state : public driver_device
{
public:
- mk1_state(const machine_config &mconfig, device_type type, const char *tag)
- : driver_device(mconfig, type, tag)
- , m_maincpu(*this, "maincpu")
- , m_digits(*this, "digit%u", 0U)
- , m_leds(*this, "led%u", 0U)
+ mk1_state(const machine_config &mconfig, device_type type, const char *tag) :
+ driver_device(mconfig, type, tag),
+ m_maincpu(*this, "maincpu"),
+ m_keypad(*this, "LINE%u", 1U),
+ m_delay_display(*this, "delay_display_%u", 0),
+ m_out_digit(*this, "digit%u", 0U)
{ }
+ void cmpchess(machine_config &config);
void mk1(machine_config &config);
-private:
- DECLARE_READ8_MEMBER(mk1_f8_r);
- DECLARE_WRITE8_MEMBER(mk1_f8_w);
- TIMER_DEVICE_CALLBACK_MEMBER(mk1_update_leds);
- void mk1_io(address_map &map);
- void mk1_mem(address_map &map);
+ DECLARE_INPUT_CHANGED_MEMBER(reset_switch);
+protected:
virtual void machine_start() override;
- uint8_t m_f8[2];
- uint8_t m_led_data[4];
+private:
+ // devices/pointers
required_device<cpu_device> m_maincpu;
- output_finder<4> m_digits;
- output_finder<4> m_leds;
-};
+ required_ioport_array<4> m_keypad;
+ required_device_array<timer_device, 4> m_delay_display;
+ output_finder<4> m_out_digit;
+
+ void main_io(address_map &map);
+ void main_map(address_map &map);
+ TIMER_DEVICE_CALLBACK_MEMBER(blink) { m_blink = !m_blink; update_display(); }
+ TIMER_DEVICE_CALLBACK_MEMBER(delay_display);
+ void update_display();
-#define MAIN_CLOCK 1000000
+ DECLARE_READ8_MEMBER(input_r);
+ DECLARE_WRITE8_MEMBER(digit_select_w);
+ DECLARE_WRITE8_MEMBER(digit_data_w);
+
+ u8 m_digit_select;
+ u8 m_digit_data;
+ bool m_blink;
+};
+void mk1_state::machine_start()
+{
+ // resolve handlers
+ m_out_digit.resolve();
+
+ // zerofill
+ m_digit_select = 0;
+ m_digit_data = 0;
+ m_blink = false;
+
+ // register for savestates
+ save_item(NAME(m_digit_select));
+ save_item(NAME(m_digit_data));
+ save_item(NAME(m_blink));
+}
-READ8_MEMBER( mk1_state::mk1_f8_r )
+INPUT_CHANGED_MEMBER(mk1_state::reset_switch)
{
- uint8_t i, data = m_f8[offset];
+ // reset switch is tied to F3850 RESET pin
+ m_maincpu->set_input_line(INPUT_LINE_RESET, newval ? ASSERT_LINE : CLEAR_LINE);
- if ( offset == 0 )
+ // clear display
+ if (newval)
{
- if (BIT(data, 0)) data |= ioport("LINE1")->read();
- if (BIT(data, 1)) data |= ioport("LINE2")->read();
- if (BIT(data, 2)) data |= ioport("LINE3")->read();
- if (BIT(data, 3)) data |= ioport("LINE4")->read();
+ m_digit_select = 0xff;
+ for (int i = 0; i < 4; i++)
+ m_out_digit[i] = 0;
+ }
+}
+
+
+
+/******************************************************************************
+ Devices, I/O
+******************************************************************************/
- for (i = 4; i < 8; i++)
+// display handling
+
+TIMER_DEVICE_CALLBACK_MEMBER(mk1_state::delay_display)
+{
+ // clear digits if inactive
+ if (BIT(m_digit_select, param))
+ m_out_digit[param] = 0;
+}
+
+void mk1_state::update_display()
+{
+ // output digits if active
+ for (int i = 0; i < 4; i++)
+ {
+ if (!BIT(m_digit_select, i))
{
- if (BIT(data, i))
- {
- if (BIT(ioport("LINE1")->read(), i)) data |= 1;
- if (BIT(ioport("LINE2")->read(), i)) data |= 2;
- if (BIT(ioport("LINE3")->read(), i)) data |= 4;
- if (BIT(ioport("LINE4")->read(), i)) data |= 8;
- }
+ // display panel goes into automated blink mode if DP segment is held high
+ // and DP segment itself only appears to be active if no other segments are
+ u8 mask = (m_digit_data == 1) ? 0x80 : 0x7f;
+ mask = (m_blink && m_digit_data & 1) ? 0 : mask;
+ m_out_digit[i] = bitswap<8>(m_digit_data,0,2,1,3,4,5,6,7) & mask;
}
}
- return data;
}
-WRITE8_MEMBER( mk1_state::mk1_f8_w )
+
+// F3850 ports
+
+WRITE8_MEMBER(mk1_state::digit_data_w)
{
- /* 0 is high and allows also input */
- m_f8[offset] = data;
+ // digit segment data, and also input mux
+ m_digit_data = data;
+ update_display();
+}
+
+WRITE8_MEMBER(mk1_state::digit_select_w)
+{
+ // d0-d3: digit select (active low)
+ // they're strobed, so on rising edge, delay them going off to prevent flicker or stuck display
+ for (int i = 0; i < 4; i++)
+ if (BIT(~m_digit_select & data, i))
+ m_delay_display[i]->adjust(attotime::from_msec(20), i);
+
+ m_digit_select = data;
+ update_display();
+}
+
+READ8_MEMBER(mk1_state::input_r)
+{
+ u8 data = m_digit_data;
+
+ // d0-d3: multiplexed inputs from d4-d7
+ for (int i = 0; i < 4; i++)
+ if (m_digit_data & m_keypad[i]->read())
+ data |= 1 << i;
+
+ // d4-d7: multiplexed inputs from d0-d3
+ for (int i = 0; i < 4; i++)
+ if (BIT(m_digit_data, i))
+ data |= m_keypad[i]->read();
- if ( ! ( m_f8[1] & 1 ) ) m_led_data[0] = bitswap<8>( m_f8[0],2,1,3,4,5,6,7,0 );
- if ( ! ( m_f8[1] & 2 ) ) m_led_data[1] = bitswap<8>( m_f8[0],2,1,3,4,5,6,7,0 );
- if ( ! ( m_f8[1] & 4 ) ) m_led_data[2] = bitswap<8>( m_f8[0],2,1,3,4,5,6,7,0 );
- if ( ! ( m_f8[1] & 8 ) ) m_led_data[3] = bitswap<8>( m_f8[0],2,1,3,4,5,6,7,0 );
+ return data;
}
-void mk1_state::mk1_mem(address_map &map)
+
+
+/******************************************************************************
+ Address Maps
+******************************************************************************/
+
+void mk1_state::main_map(address_map &map)
{
map(0x0000, 0x07ff).rom();
map(0x1800, 0x18ff).ram();
}
-
-void mk1_state::mk1_io(address_map &map)
+void mk1_state::main_io(address_map &map)
{
- map(0x0, 0x1).rw(FUNC(mk1_state::mk1_f8_r), FUNC(mk1_state::mk1_f8_w));
- map(0xc, 0xf).rw("f3853", FUNC(f3853_device::read), FUNC(f3853_device::write));
+ map(0x00, 0x00).rw(FUNC(mk1_state::input_r), FUNC(mk1_state::digit_data_w));
+ map(0x01, 0x01).w(FUNC(mk1_state::digit_select_w));
+ map(0x0c, 0x0f).rw("smi", FUNC(f3853_device::read), FUNC(f3853_device::write));
}
-static INPUT_PORTS_START( mk1 )
- PORT_START("RESET") /* 0 */
- PORT_DIPNAME ( 0x01, 0x01, "Switch")
- PORT_DIPSETTING( 0, "L" )
- PORT_DIPSETTING( 1, "S" )
-
- PORT_START("LINE1") /* 1 */
- PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("White A King") PORT_CODE(KEYCODE_A)
- PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("White B Queen") PORT_CODE(KEYCODE_B)
- PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("White C Bishop") PORT_CODE(KEYCODE_C)
- PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("White D PLAY") PORT_CODE(KEYCODE_D)
- PORT_BIT(0x0f, IP_ACTIVE_HIGH, IPT_UNUSED )
-
- PORT_START("LINE2") /* 2 */
- PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("White E Knight") PORT_CODE(KEYCODE_E)
- PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("White F Castle") PORT_CODE(KEYCODE_F)
- PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("White G Pawn") PORT_CODE(KEYCODE_G)
- PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("White H md") PORT_CODE(KEYCODE_H)
- PORT_BIT(0x0f, IP_ACTIVE_HIGH, IPT_UNUSED )
-
- PORT_START("LINE3") /* 3 */
- PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Black 1 King") PORT_CODE(KEYCODE_1)
- PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Black 2 Queen") PORT_CODE(KEYCODE_2)
- PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Black 3 Bishop") PORT_CODE(KEYCODE_3)
- PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Black 4 fp") PORT_CODE(KEYCODE_4)
- PORT_BIT(0x0f, IP_ACTIVE_HIGH, IPT_UNUSED )
-
- PORT_START("LINE4") /* 4 */
- PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Black 5 Knight") PORT_CODE(KEYCODE_5)
- PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Black 6 Castle") PORT_CODE(KEYCODE_6)
- PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Black 7 Pawn") PORT_CODE(KEYCODE_7)
- PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Black 8 ep") PORT_CODE(KEYCODE_8)
- PORT_BIT(0x0f, IP_ACTIVE_HIGH, IPT_UNUSED )
+
+/******************************************************************************
+ Input Ports
+******************************************************************************/
+
+static INPUT_PORTS_START( cmpchess )
+ PORT_START("LINE1")
+ PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_A) PORT_NAME("A / White King")
+ PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_B) PORT_NAME("B / White Queen")
+ PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_C) PORT_NAME("C / White Bishop")
+ PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_D) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("D / Play")
+
+ PORT_START("LINE2")
+ PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_E) PORT_NAME("E / White Knight")
+ PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_F) PORT_NAME("F / White Rook")
+ PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_G) PORT_NAME("G / White Pawn")
+ PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_H) PORT_CODE(KEYCODE_M) PORT_NAME("H / md") // more data
+
+ PORT_START("LINE3")
+ PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("1 / Black King")
+ PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("2 / Black Queen")
+ PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("3 / Black Bishop")
+ PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("4 / fp") // find piece(position)
+
+ PORT_START("LINE4")
+ PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("5 / Black Knight")
+ PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("6 / Black Rook")
+ PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("7 / Black Pawn")
+ PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("8 / ep") // enter piece(position)
+
+ PORT_START("RESET")
+ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_OTHER) PORT_CODE(KEYCODE_R) PORT_TOGGLE PORT_CHANGED_MEMBER(DEVICE_SELF, mk1_state, reset_switch, nullptr) PORT_NAME("Reset Switch") // L.S. switch on the MK I
INPUT_PORTS_END
-TIMER_DEVICE_CALLBACK_MEMBER(mk1_state::mk1_update_leds)
-{
- for (int i = 0; i < 4; i++)
- {
- m_digits[i] = m_led_data[i] >> 1;
- m_leds[i] = m_led_data[i] & 0x01;
- m_led_data[i] = 0;
- }
-}
+/******************************************************************************
+ Machine Configs
+******************************************************************************/
-void mk1_state::machine_start()
+void mk1_state::cmpchess(machine_config &config)
{
- m_digits.resolve();
- m_leds.resolve();
+ /* basic machine hardware */
+ F8(config, m_maincpu, 3.579545_MHz_XTAL/2); // Fairchild 3850PK
+ m_maincpu->set_addrmap(AS_PROGRAM, &mk1_state::main_map);
+ m_maincpu->set_addrmap(AS_IO, &mk1_state::main_io);
+ m_maincpu->set_irq_acknowledge_callback("smi", FUNC(f3853_device::int_acknowledge));
+
+ f3853_device &smi(F3853(config, "smi", 3.579545_MHz_XTAL/2));
+ smi.int_req_callback().set_inputline("maincpu", F8_INPUT_LINE_INT_REQ);
+
+ /* video hardware */
+ for (int i = 0; i < 4; i++)
+ TIMER(config, m_delay_display[i]).configure_generic(FUNC(mk1_state::delay_display));
+
+ TIMER(config, "blink_display").configure_periodic(FUNC(mk1_state::blink), attotime::from_msec(250)); // approximation
+ config.set_default_layout(layout_cmpchess);
}
+void mk1_state::mk1(machine_config &config)
+{
+ cmpchess(config);
-MACHINE_CONFIG_START(mk1_state::mk1)
/* basic machine hardware */
- MCFG_DEVICE_ADD( "maincpu", F8, MAIN_CLOCK ) /* MK3850 */
- MCFG_DEVICE_PROGRAM_MAP(mk1_mem)
- MCFG_DEVICE_IO_MAP(mk1_io)
- MCFG_DEVICE_IRQ_ACKNOWLEDGE_DEVICE("f3853", f3853_device, int_acknowledge)
- MCFG_QUANTUM_TIME(attotime::from_hz(60))
-
- f3853_device &f3853(F3853(config, "f3853", MAIN_CLOCK));
- f3853.int_req_callback().set_inputline("maincpu", F8_INPUT_LINE_INT_REQ);
+ m_maincpu->set_clock(2000000); // it's a bit faster than cmpchess
+ subdevice<f3853_device>("smi")->set_clock(2000000);
- /* video hardware */
config.set_default_layout(layout_mk1);
+}
+
- MCFG_TIMER_DRIVER_ADD_PERIODIC("led_timer", mk1_state, mk1_update_leds, attotime::from_hz(30))
-MACHINE_CONFIG_END
+/******************************************************************************
+ ROM Definitions
+******************************************************************************/
+
+ROM_START( cmpchess )
+ ROM_REGION( 0x0800, "maincpu", 0 )
+ ROM_LOAD("32014-4950", 0x0000, 0x0800, CRC(278f7bf3) SHA1(b384c95ba691d52dfdddd35987a71e9746a46170) )
+ROM_END
ROM_START( ccmk1 )
- ROM_REGION(0x10000,"maincpu",0)
- ROM_LOAD("82c210-1", 0x0000, 0x800, CRC(278f7bf3) SHA1(b384c95ba691d52dfdddd35987a71e9746a46170))
+ ROM_REGION( 0x0800, "maincpu", 0 )
+ ROM_LOAD("82c210-1", 0x0000, 0x0800, CRC(278f7bf3) SHA1(b384c95ba691d52dfdddd35987a71e9746a46170) )
ROM_END
+} // anonymous namespace
-/***************************************************************************
- Game driver(s)
-***************************************************************************/
+/******************************************************************************
+ Drivers
+******************************************************************************/
-// seams to be developed by mostek (MK)
-// YEAR NAME PARENT COMPAT MACHINE INPUT STATE INIT COMPANY FULLNAME FLAGS
-CONS( 1979, ccmk1, 0, 0, mk1, mk1, mk1_state, empty_init, "Novag", "Chess Champion: MK I", MACHINE_NO_SOUND_HW )
+// YEAR NAME PARENT CMP MACHINE INPUT STATE INIT COMPANY, FULLNAME, FLAGS
+CONS( 1977, cmpchess, 0, 0, cmpchess, cmpchess, mk1_state, empty_init, "Data Cash Systems", "CompuChess", MACHINE_NO_SOUND_HW | MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK )
+CONS( 1978, ccmk1, cmpchess, 0, mk1, cmpchess, mk1_state, empty_init, "Novag", "Chess Champion: MK I", MACHINE_NO_SOUND_HW | MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK )
diff --git a/src/mame/drivers/mk14.cpp b/src/mame/drivers/mk14.cpp
index 39db2ca1e04..076e88fe577 100644
--- a/src/mame/drivers/mk14.cpp
+++ b/src/mame/drivers/mk14.cpp
@@ -117,8 +117,8 @@ void mk14_state::mem_map(address_map &map)
map.unmap_value_high();
map.global_mask(0x0fff);
map(0x000, 0x1ff).mirror(0x600).rom(); // ROM
- map(0x800, 0x87f).mirror(0x600).rw("ic8", FUNC(ins8154_device::ins8154_r), FUNC(ins8154_device::ins8154_w)); // I/O
- map(0x880, 0x8ff).mirror(0x600).ram(); // 128 I/O chip RAM
+ map(0x800, 0x87f).mirror(0x600).rw("ic8", FUNC(ins8154_device::read_io), FUNC(ins8154_device::write_io)); // I/O
+ map(0x880, 0x8ff).mirror(0x600).rw("ic8", FUNC(ins8154_device::read_ram), FUNC(ins8154_device::write_ram)); // 128 bytes I/O chip RAM
map(0x900, 0x9ff).mirror(0x400).rw(FUNC(mk14_state::keyboard_r), FUNC(mk14_state::display_w));
map(0xb00, 0xbff).ram(); // VDU RAM
map(0xf00, 0xfff).ram(); // Standard RAM
@@ -223,7 +223,6 @@ void mk14_state::mk14(machine_config &config)
DAC_1BIT(config, m_dac, 0).add_route(ALL_OUTPUTS, "speaker", 0.25);
ZN425E(config, "dac8", 0).add_route(ALL_OUTPUTS, "speaker", 0.5); // Ferranti ZN425E
voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref", 0));
- vref.set_output(5.0);
vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT);
vref.add_route(0, "dac8", 1.0, DAC_VREF_POS_INPUT);
vref.add_route(0, "dac8", -1.0, DAC_VREF_NEG_INPUT);
diff --git a/src/mame/drivers/mk2.cpp b/src/mame/drivers/mk2.cpp
index a126253a09b..7196be18f16 100644
--- a/src/mame/drivers/mk2.cpp
+++ b/src/mame/drivers/mk2.cpp
@@ -200,28 +200,28 @@ WRITE8_MEMBER( mk2_state::mk2_write_b )
}
-MACHINE_CONFIG_START(mk2_state::mk2)
+void mk2_state::mk2(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M6504, 1000000)
- MCFG_DEVICE_PROGRAM_MAP(mk2_mem)
- MCFG_QUANTUM_TIME(attotime::from_hz(60))
+ M6504(config, m_maincpu, 1000000);
+ m_maincpu->set_addrmap(AS_PROGRAM, &mk2_state::mk2_mem);
+ config.m_minimum_quantum = attotime::from_hz(60);
/* video hardware */
config.set_default_layout(layout_mk2);
- MCFG_DEVICE_ADD("miot", MOS6530, 1000000)
- MCFG_MOS6530_IN_PA_CB(READ8(*this, mk2_state, mk2_read_a))
- MCFG_MOS6530_OUT_PA_CB(WRITE8(*this, mk2_state, mk2_write_a))
- MCFG_MOS6530_IN_PB_CB(READ8(*this, mk2_state, mk2_read_b))
- MCFG_MOS6530_OUT_PB_CB(WRITE8(*this, mk2_state, mk2_write_b))
+ MOS6530(config, m_miot, 1000000);
+ m_miot->in_pa_callback().set(FUNC(mk2_state::mk2_read_a));
+ m_miot->out_pa_callback().set(FUNC(mk2_state::mk2_write_a));
+ m_miot->in_pb_callback().set(FUNC(mk2_state::mk2_read_b));
+ m_miot->out_pb_callback().set(FUNC(mk2_state::mk2_write_b));
/* sound hardware */
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("speaker", SPEAKER_SOUND)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.50)
+ SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.50);
- MCFG_TIMER_DRIVER_ADD_PERIODIC("led_timer", mk2_state, update_leds, attotime::from_hz(60))
-MACHINE_CONFIG_END
+ TIMER(config, "led_timer").configure_periodic(FUNC(mk2_state::update_leds), attotime::from_hz(60));
+}
ROM_START(ccmk2)
diff --git a/src/mame/drivers/mkit09.cpp b/src/mame/drivers/mkit09.cpp
index 679a947e82c..ab05909ab31 100644
--- a/src/mame/drivers/mkit09.cpp
+++ b/src/mame/drivers/mkit09.cpp
@@ -198,10 +198,11 @@ WRITE8_MEMBER( mkit09_state::pb_w )
}
-MACHINE_CONFIG_START(mkit09_state::mkit09)
+void mkit09_state::mkit09(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", MC6809, XTAL(4'000'000))
- MCFG_DEVICE_PROGRAM_MAP(mkit09_mem)
+ MC6809(config, m_maincpu, XTAL(4'000'000));
+ m_maincpu->set_addrmap(AS_PROGRAM, &mkit09_state::mkit09_mem);
/* video hardware */
config.set_default_layout(layout_mkit09);
@@ -219,13 +220,14 @@ MACHINE_CONFIG_START(mkit09_state::mkit09)
m_pia->irqa_handler().set_inputline("maincpu", M6809_IRQ_LINE);
m_pia->irqb_handler().set_inputline("maincpu", M6809_IRQ_LINE);
- MCFG_CASSETTE_ADD( "cassette" )
-MACHINE_CONFIG_END
+ CASSETTE(config, m_cass);
+}
-MACHINE_CONFIG_START(mkit09_state::mkit09a)
+void mkit09_state::mkit09a(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", MC6809, XTAL(4'000'000))
- MCFG_DEVICE_PROGRAM_MAP(mkit09a_mem)
+ MC6809(config, m_maincpu, XTAL(4'000'000));
+ m_maincpu->set_addrmap(AS_PROGRAM, &mkit09_state::mkit09a_mem);
/* video hardware */
config.set_default_layout(layout_mkit09);
@@ -243,8 +245,8 @@ MACHINE_CONFIG_START(mkit09_state::mkit09a)
m_pia->irqa_handler().set_inputline("maincpu", M6809_IRQ_LINE);
m_pia->irqb_handler().set_inputline("maincpu", M6809_IRQ_LINE);
- MCFG_CASSETTE_ADD( "cassette" )
-MACHINE_CONFIG_END
+ CASSETTE(config, m_cass);
+}
/* ROM definition */
ROM_START( mkit09 )
diff --git a/src/mame/drivers/mmodular.cpp b/src/mame/drivers/mmodular.cpp
index 554cb1af4fa..25a256d9d92 100644
--- a/src/mame/drivers/mmodular.cpp
+++ b/src/mame/drivers/mmodular.cpp
@@ -255,68 +255,72 @@ void mmodular_state::init_gen32()
rom[0x870] = 0x38;
}
-MACHINE_CONFIG_START(mmodular_state::alm16)
- MCFG_DEVICE_ADD("maincpu", M68000, XTAL(12'000'000))
- MCFG_DEVICE_PROGRAM_MAP(alm16_mem)
- MCFG_DEVICE_PERIODIC_INT_DRIVER(mmodular_state, irq2_line_hold, 600)
+void mmodular_state::alm16(machine_config &config)
+{
+ m68000_device &maincpu(M68000(config, "maincpu", XTAL(12'000'000)));
+ maincpu.set_addrmap(AS_PROGRAM, &mmodular_state::alm16_mem);
+ maincpu.set_periodic_int(FUNC(mmodular_state::irq2_line_hold), attotime::from_hz(600));
MEPHISTO_SENSORS_BOARD(config, "board", 0);
MEPHISTO_DISPLAY_MODUL(config, "display", 0);
config.set_default_layout(layout_mmodular);
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(mmodular_state::van16)
+void mmodular_state::van16(machine_config &config)
+{
alm16(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(van16_mem)
-MACHINE_CONFIG_END
+ subdevice<m68000_device>("maincpu")->set_addrmap(AS_PROGRAM, &mmodular_state::van16_mem);
+}
-MACHINE_CONFIG_START(mmodular_state::alm32)
- MCFG_DEVICE_ADD("maincpu", M68020, XTAL(12'000'000))
- MCFG_DEVICE_PROGRAM_MAP(alm32_mem)
- MCFG_DEVICE_PERIODIC_INT_DRIVER(mmodular_state, irq6_line_hold, 750)
+void mmodular_state::alm32(machine_config &config)
+{
+ m68020_device &maincpu(M68020(config, "maincpu", XTAL(12'000'000)));
+ maincpu.set_addrmap(AS_PROGRAM, &mmodular_state::alm32_mem);
+ maincpu.set_periodic_int(FUNC(mmodular_state::irq6_line_hold), attotime::from_hz(750));
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
MEPHISTO_SENSORS_BOARD(config, "board", 0);
MEPHISTO_DISPLAY_MODUL(config, "display", 0);
config.set_default_layout(layout_mmodular);
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(mmodular_state::van32)
+void mmodular_state::van32(machine_config &config)
+{
alm32(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(van32_mem)
-MACHINE_CONFIG_END
+ subdevice<m68020_device>("maincpu")->set_addrmap(AS_PROGRAM, &mmodular_state::van32_mem);
+}
-MACHINE_CONFIG_START(mmodular_state::gen32)
- MCFG_DEVICE_ADD("maincpu", M68030, XTAL(33'333'000))
- MCFG_DEVICE_PROGRAM_MAP(gen32_mem)
- MCFG_DEVICE_PERIODIC_INT_DRIVER(mmodular_state, irq2_line_hold, 375)
+void mmodular_state::gen32(machine_config &config)
+{
+ m68030_device &maincpu(M68030(config, "maincpu", XTAL(33'333'000)));
+ maincpu.set_addrmap(AS_PROGRAM, &mmodular_state::gen32_mem);
+ maincpu.set_periodic_int(FUNC(mmodular_state::irq2_line_hold), attotime::from_hz(375));
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
MEPHISTO_SENSORS_BOARD(config, "board", 0);
MEPHISTO_DISPLAY_MODUL(config, "display", 0);
config.set_default_layout(layout_mmodular);
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(berlinp_state::berlinp)
- MCFG_DEVICE_ADD("maincpu", M68020, XTAL(24'576'000))
- MCFG_DEVICE_PROGRAM_MAP(berlinp_mem)
- MCFG_DEVICE_PERIODIC_INT_DRIVER(berlinp_state, irq2_line_hold, 750)
+void berlinp_state::berlinp(machine_config &config)
+{
+ m68020_device &maincpu(M68020(config, "maincpu", XTAL(24'576'000)));
+ maincpu.set_addrmap(AS_PROGRAM, &berlinp_state::berlinp_mem);
+ maincpu.set_periodic_int(FUNC(berlinp_state::irq2_line_hold), attotime::from_hz(750));
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
- MEPHISTO_SENSORS_BOARD(config, m_board, 0);
+ MEPHISTO_BUTTONS_BOARD(config, m_board, 0);
MEPHISTO_DISPLAY_MODUL(config, "display", 0);
config.set_default_layout(layout_mmodular);
-MACHINE_CONFIG_END
+}
ROM_START( alm16 )
diff --git a/src/mame/drivers/mod8.cpp b/src/mame/drivers/mod8.cpp
index 5d4f7589d61..262ded69e62 100644
--- a/src/mame/drivers/mod8.cpp
+++ b/src/mame/drivers/mod8.cpp
@@ -94,7 +94,7 @@ WRITE8_MEMBER( mod8_state::out_w )
if (m_tty_cnt == 10)
{
- m_teleprinter->write(space, 0, (m_tty_data >> 7) & 0x7f);
+ m_teleprinter->write((m_tty_data >> 7) & 0x7f);
m_tty_cnt = 0;
}
}
@@ -146,17 +146,18 @@ void mod8_state::kbd_put(u8 data)
m_maincpu->set_input_line(0, HOLD_LINE);
}
-MACHINE_CONFIG_START(mod8_state::mod8)
+void mod8_state::mod8(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu",I8008, 800000)
- MCFG_DEVICE_PROGRAM_MAP(mod8_mem)
- MCFG_DEVICE_IO_MAP(mod8_io)
- MCFG_DEVICE_IRQ_ACKNOWLEDGE_DRIVER(mod8_state,mod8_irq_callback)
+ I8008(config, m_maincpu, 800000);
+ m_maincpu->set_addrmap(AS_PROGRAM, &mod8_state::mod8_mem);
+ m_maincpu->set_addrmap(AS_IO, &mod8_state::mod8_io);
+ m_maincpu->set_irq_acknowledge_callback(FUNC(mod8_state::mod8_irq_callback));
/* video hardware */
TELEPRINTER(config, m_teleprinter, 0);
m_teleprinter->set_keyboard_callback(FUNC(mod8_state::kbd_put));
-MACHINE_CONFIG_END
+}
/* ROM definition */
diff --git a/src/mame/drivers/model1.cpp b/src/mame/drivers/model1.cpp
index ce2ddeb1042..8c50750fe83 100644
--- a/src/mame/drivers/model1.cpp
+++ b/src/mame/drivers/model1.cpp
@@ -600,7 +600,7 @@ READ8_MEMBER( model1_state::dpram_r )
{
// insert waitstate
m_maincpu->adjust_icount(-1);
- return m_dpram->right_r(space, offset);
+ return m_dpram->right_r(offset);
}
WRITE8_MEMBER( model1_state::vf_outputs_w )
@@ -613,6 +613,8 @@ WRITE8_MEMBER( model1_state::vf_outputs_w )
machine().bookkeeping().coin_counter_w(1, BIT(data, 1));
machine().bookkeeping().coin_counter_w(0, BIT(data, 0));
+
+ m_digits[1] = data;
}
WRITE8_MEMBER( model1_state::vr_outputs_w )
@@ -645,6 +647,8 @@ WRITE8_MEMBER( model1_state::swa_outputs_w )
machine().bookkeeping().coin_counter_w(1, BIT(data, 1));
machine().bookkeeping().coin_counter_w(0, BIT(data, 0));
+
+ m_digits[1] = data;
}
WRITE8_MEMBER( model1_state::wingwar_outputs_w )
@@ -659,6 +663,8 @@ WRITE8_MEMBER( model1_state::wingwar_outputs_w )
// -------0 coin counter 1
machine().bookkeeping().coin_counter_w(0, BIT(data, 0));
+
+ m_digits[1] = data;
}
WRITE8_MEMBER( model1_state::wingwar360_outputs_w )
@@ -671,6 +677,8 @@ WRITE8_MEMBER( model1_state::wingwar360_outputs_w )
machine().bookkeeping().coin_counter_w(1, BIT(data, 1));
machine().bookkeeping().coin_counter_w(0, BIT(data, 0));
+
+ m_digits[1] = data;
}
WRITE8_MEMBER( model1_state::netmerc_outputs_w )
@@ -685,6 +693,11 @@ WRITE8_MEMBER( model1_state::netmerc_outputs_w )
machine().bookkeeping().coin_counter_w(0, BIT(data, 0));
}
+WRITE8_MEMBER( model1_state::drive_board_w )
+{
+ m_digits[0] = data;
+}
+
READ8_MEMBER( model1_state::r360_r )
{
return m_r360_state;
@@ -1674,23 +1687,24 @@ ROM_START( netmerc )
ROM_LOAD16_BYTE( "u2", 0x0001, 0x4000, CRC(c589f428) SHA1(98dc0114a5f89636b4e237ed954e19f1cfd186ab) )
ROM_END
-MACHINE_CONFIG_START(model1_state::model1)
- MCFG_DEVICE_ADD("maincpu", V60, 16000000)
- MCFG_DEVICE_PROGRAM_MAP(model1_mem)
- MCFG_DEVICE_IO_MAP(model1_io)
- MCFG_DEVICE_IRQ_ACKNOWLEDGE_DRIVER(model1_state,irq_callback)
+void model1_state::model1(machine_config &config)
+{
+ V60(config, m_maincpu, 16000000);
+ m_maincpu->set_addrmap(AS_PROGRAM, &model1_state::model1_mem);
+ m_maincpu->set_addrmap(AS_IO, &model1_state::model1_io);
+ m_maincpu->set_irq_acknowledge_callback(FUNC(model1_state::irq_callback));
- MCFG_DEVICE_ADD("copro_fifo_in", GENERIC_FIFO_U32, 0)
- MCFG_DEVICE_ADD("copro_fifo_out", GENERIC_FIFO_U32, 0)
+ GENERIC_FIFO_U32(config, "copro_fifo_in", 0);
+ GENERIC_FIFO_U32(config, "copro_fifo_out", 0);
- MCFG_TIMER_DRIVER_ADD_SCANLINE("scantimer", model1_state, model1_interrupt, "screen", 0, 1)
+ TIMER(config, "scantimer").configure_scanline(FUNC(model1_state::model1_interrupt), "screen", 0, 1);
#if 1
- MCFG_DEVICE_ADD("tgp_copro", MB86233, 16000000)
- MCFG_DEVICE_PROGRAM_MAP(copro_prog_map)
- MCFG_DEVICE_DATA_MAP(copro_data_map)
- MCFG_DEVICE_IO_MAP(copro_io_map)
- MCFG_DEVICE_ADDRESS_MAP(mb86233_device::AS_RF, copro_rf_map)
+ MB86233(config, m_tgp_copro, 16000000);
+ m_tgp_copro->set_addrmap(AS_PROGRAM, &model1_state::copro_prog_map);
+ m_tgp_copro->set_addrmap(AS_DATA, &model1_state::copro_data_map);
+ m_tgp_copro->set_addrmap(AS_IO, &model1_state::copro_io_map);
+ m_tgp_copro->set_addrmap(mb86233_device::AS_RF, &model1_state::copro_rf_map);
#endif
model1io_device &ioboard(SEGA_MODEL1IO(config, "ioboard", 0));
@@ -1703,11 +1717,11 @@ MACHINE_CONFIG_START(model1_state::model1)
S24TILE(config, m_tiles, 0, 0x3fff).set_palette(m_palette);
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_VIDEO_ATTRIBUTES(VIDEO_UPDATE_AFTER_VBLANK )
- MCFG_SCREEN_RAW_PARAMS(XTAL(16'000'000), 656, 0/*+69*/, 496/*+69*/, 424, 0/*+25*/, 384/*+25*/)
- MCFG_SCREEN_UPDATE_DRIVER(model1_state, screen_update_model1)
- MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE(*this, model1_state, screen_vblank_model1))
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_video_attributes(VIDEO_UPDATE_AFTER_VBLANK);
+ m_screen->set_raw(XTAL(16'000'000), 656, 0/*+69*/, 496/*+69*/, 424, 0/*+25*/, 384/*+25*/);
+ m_screen->set_screen_update(FUNC(model1_state::screen_update_model1));
+ m_screen->screen_vblank().set(FUNC(model1_state::screen_vblank_model1));
PALETTE(config, m_palette).set_format(palette_device::xBGR_555, 8192);
@@ -1720,13 +1734,14 @@ MACHINE_CONFIG_START(model1_state::model1)
clock_device &m1uart_clock(CLOCK(config, "m1uart_clock", 500000)); // 16 times 31.25MHz (standard Sega/MIDI sound data rate)
m1uart_clock.signal_handler().set(m_m1uart, FUNC(i8251_device::write_txc));
m1uart_clock.signal_handler().append(m_m1uart, FUNC(i8251_device::write_rxc));
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(model1_state::model1_hle)
+void model1_state::model1_hle(machine_config &config)
+{
model1(config);
- MCFG_DEVICE_REMOVE("tgp_copro")
-MACHINE_CONFIG_END
+ config.device_remove("tgp_copro");
+}
void model1_state::vf(machine_config &config)
{
@@ -1742,7 +1757,10 @@ void model1_state::vr(machine_config &config)
{
model1(config);
+ m_maincpu->set_addrmap(AS_PROGRAM, &model1_state::model1_comm_mem);
+
model1io_device &ioboard(*subdevice<model1io_device>("ioboard"));
+ ioboard.drive_write_callback().set(FUNC(model1_state::drive_board_w));
ioboard.an_callback<0>().set_ioport("WHEEL");
ioboard.an_callback<1>().set_ioport("ACCEL");
ioboard.an_callback<2>().set_ioport("BRAKE");
@@ -1755,7 +1773,10 @@ void model1_state::vformula(machine_config &config)
{
model1(config);
+ m_maincpu->set_addrmap(AS_PROGRAM, &model1_state::model1_comm_mem);
+
model1io_device &ioboard(*subdevice<model1io_device>("ioboard"));
+ ioboard.drive_write_callback().set(FUNC(model1_state::drive_board_w));
ioboard.an_callback<0>().set_ioport("WHEEL");
ioboard.an_callback<1>().set_ioport("ACCEL");
ioboard.an_callback<2>().set_ioport("BRAKE");
@@ -1787,11 +1808,11 @@ void model1_state::swa(machine_config &config)
m_m1audio->rxd_handler().append(m_dsbz80, FUNC(dsbz80_device::write_txd));
}
-MACHINE_CONFIG_START(model1_state::wingwar)
+void model1_state::wingwar(machine_config &config)
+{
model1_hle(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(model1_comm_mem)
+ m_maincpu->set_addrmap(AS_PROGRAM, &model1_state::model1_comm_mem);
model1io2_device &ioboard(SEGA_MODEL1IO2(config.replace(), "ioboard", 0));
ioboard.set_default_bios_tag("epr16891");
@@ -1807,7 +1828,7 @@ MACHINE_CONFIG_START(model1_state::wingwar)
config.set_default_layout(layout_model1io2);
M1COMM(config, "m1comm", 0).set_default_bios_tag("epr15112");
-MACHINE_CONFIG_END
+}
void model1_state::wingwar360(machine_config &config)
{
@@ -1820,7 +1841,7 @@ void model1_state::wingwar360(machine_config &config)
ioboard.output_callback().set(FUNC(model1_state::wingwar360_outputs_w));
config.set_default_layout(layout_model1io2);
-MACHINE_CONFIG_END
+}
void model1_state::polhemus_map(address_map &map)
{
@@ -1829,10 +1850,11 @@ void model1_state::polhemus_map(address_map &map)
map(0xf8000, 0xfffff).rom().region("polhemus", 0);
}
-MACHINE_CONFIG_START(model1_state::netmerc)
+void model1_state::netmerc(machine_config &config)
+{
model1_hle(config);
- MCFG_DEVICE_ADD("polhemus", I386SX, 16000000)
- MCFG_DEVICE_PROGRAM_MAP(polhemus_map)
+ i386sx_device &polhemus(I386SX(config, "polhemus", 16000000));
+ polhemus.set_addrmap(AS_PROGRAM, &model1_state::polhemus_map);
model1io2_device &ioboard(SEGA_MODEL1IO2(config.replace(), "ioboard", 0));
ioboard.set_default_bios_tag("epr18021");
@@ -1845,7 +1867,7 @@ MACHINE_CONFIG_START(model1_state::netmerc)
ioboard.output_callback().set(FUNC(model1_state::netmerc_outputs_w));
config.set_default_layout(layout_model1io2);
-MACHINE_CONFIG_END
+}
//**************************************************************************
diff --git a/src/mame/drivers/model2.cpp b/src/mame/drivers/model2.cpp
index 2ef11e43ab9..3224ee999ad 100644
--- a/src/mame/drivers/model2.cpp
+++ b/src/mame/drivers/model2.cpp
@@ -3493,6 +3493,52 @@ ROM_START( srallycb ) /* Sega Rally Championship Revision B, Model 2A, Sega game
MODEL2A_VID_BOARD
ROM_END
+ROM_START( srallycc ) /* Sega Rally Championship Revision A, Model 2A, Sega game ID# 833-11649 RALLY TWIN, Sega ROM board ID# 834-11618 RALLY TWIN */
+ ROM_REGION( 0x200000, "maincpu", 0 ) // i960 program
+ ROM_LOAD32_WORD( "epr-17888a.12", 0x000000, 0x080000, CRC(7f71fe46) SHA1(cca55b2ce837b1147a31666c1d4e2ecc793447c8) )
+ ROM_LOAD32_WORD( "epr-17889a.13", 0x000002, 0x080000, CRC(6d99b766) SHA1(720e1d8090746c9baa55682e33ba485cf64a1522) )
+
+ ROM_REGION32_LE( 0x2400000, "main_data", 0 ) // Data
+ ROM_LOAD32_WORD( "mpr-17746.10", 0x000000, 0x200000, CRC(8fe311f4) SHA1(f4ada8e5c906fc384bed1b96f09cdf313f89e825) )
+ ROM_LOAD32_WORD( "mpr-17747.11", 0x000002, 0x200000, CRC(543593fd) SHA1(5ba63a77e9fc70569af21d50b3171bc8ff4522b8) )
+ ROM_LOAD32_WORD( "mpr-17744.8", 0x400000, 0x200000, CRC(71fed098) SHA1(1d187cad375121a45348d640edd3cc7dce658d28) )
+ ROM_LOAD32_WORD( "mpr-17745.9", 0x400002, 0x200000, CRC(8ecca705) SHA1(ed2b3298aad6f4e52dc672a0168183e457564b43) )
+ ROM_LOAD32_WORD( "mpr-17884.6", 0x800000, 0x200000, CRC(4cfc95e1) SHA1(81d927b8c4f9d0c4c5e29d676b30f30f83751fdc) )
+ ROM_LOAD32_WORD( "mpr-17885.7", 0x800002, 0x200000, CRC(a08d2467) SHA1(9449ac8f8f9ce8d8e536b05a91e46841fed7f2d0) )
+
+ ROM_REGION( 0x800000, "copro_data", 0 ) // Copro extra data (collision/height map/etc) (COPRO socket)
+ ROM_LOAD32_WORD( "mpr-17754.28", 0x000000, 0x200000, CRC(81a84f67) SHA1(c0a9b690523a529e4015e9af10dc3fb2a1726f08) )
+ ROM_LOAD32_WORD( "mpr-17755.29", 0x000002, 0x200000, CRC(2a6e7da4) SHA1(e60803ae951489fe47d66731d15c32249ca547b4) )
+
+ ROM_REGION( 0x010000, "drivecpu", 0 ) // Drive I/O program
+ ROM_LOAD( "epr-17891.ic12", 0x000000, 0x010000, CRC(9a33b437) SHA1(3e8f210aa5159e78f640126cb5ce7f05f22560f2) )
+
+ ROM_REGION( 0x2000000, "polygons", 0 ) // Models
+ ROM_LOAD32_WORD( "mpr-17748.16", 0x000000, 0x200000, CRC(3148a2b2) SHA1(283cc49bfb6c6381a7ead9273fd097dca5b981b6) )
+ ROM_LOAD32_WORD( "mpr-17750.20", 0x000002, 0x200000, CRC(232aec29) SHA1(4d470e71df61298282c356814e2d151fda323fb6) )
+ ROM_LOAD32_WORD( "mpr-17749.17", 0x400000, 0x200000, CRC(0838d184) SHA1(704175c8b29e4c989afcb7be42e7e0e096740eaf) )
+ ROM_LOAD32_WORD( "mpr-17751.21", 0x400002, 0x200000, CRC(ed87ac62) SHA1(601542149d33ca52a47536b4b0af47bf1fd87eb2) )
+
+ ROM_REGION( 0x1000000, "textures", 0 ) // Textures
+ ROM_LOAD32_WORD( "mpr-17753.25", 0x000000, 0x200000, CRC(6db0eb36) SHA1(dd5fd3c9592360d3e95623ac2491e6faabe9dbcb) )
+ ROM_LOAD32_WORD( "mpr-17752.24", 0x000002, 0x200000, CRC(d6aa86ce) SHA1(1d342f87d1af1e5438d1ae818b1b14268e765897) )
+
+ ROM_REGION( 0x20000, "cpu4", 0) // Communication program
+ ROM_LOAD( "epr-16726.bin", 0x000000, 0x020000, CRC(c179b8c7) SHA1(86d3e65c77fb53b1d380b629348f4ab5b3d39228) )
+
+ ROM_REGION( 0x080000, "audiocpu", 0 ) // Sound program
+ ROM_LOAD16_WORD_SWAP( "epr-17890a.30", 0x000000, 0x040000, CRC(5bac3fa1) SHA1(3635333d36463b6fab25560ed918e05138f964dc) )
+
+ ROM_REGION16_BE( 0x800000, "samples", 0 ) // Samples
+ ROM_LOAD16_WORD_SWAP( "mpr-17756.31", 0x000000, 0x200000, CRC(7725f111) SHA1(1f1ee3f19a6bcf57bc5a1c7dd64ee83f8b81f084) )
+ ROM_LOAD16_WORD_SWAP( "mpr-17757.32", 0x200000, 0x200000, CRC(1616e649) SHA1(1d3a0e441d150ada0535a9d50e2f69dd4b99c584) )
+ ROM_LOAD16_WORD_SWAP( "mpr-17886.36", 0x400000, 0x200000, CRC(54a72923) SHA1(103c4838b27378c834c08d29d6fb6ba95e7f9d03) )
+ ROM_LOAD16_WORD_SWAP( "mpr-17887.37", 0x600000, 0x200000, CRC(38c31fdd) SHA1(a85f05160b060d9d4a431aaa73cfc03f24214fb9) )
+
+ MODEL2_CPU_BOARD
+ MODEL2A_VID_BOARD
+ROM_END
+
ROM_START( srallycdx ) /* Sega Rally Championship DX Revision A, Model 2A - Single player cabinet - NO LINK option!, Sega ROM board ID# 834-11254 RALLY 50 */
ROM_REGION( 0x200000, "maincpu", 0 ) // i960 program
ROM_LOAD32_WORD( "epr-17760a.12", 0x000000, 0x020000, CRC(2c1b996b) SHA1(28c1196aac1c242e61069ee809c9e8229c061950) ) /* AMD 27C1024 EPROM */
@@ -5289,7 +5335,23 @@ ROM_START( overrev ) /* Over Rev Revision A, Model 2C */
ROM_LOAD16_WORD_SWAP( "mpr-20004.34", 0x400000, 0x400000, CRC(0b9c5410) SHA1(e5bb30702fc853ccc03316be07a334269d3ebb4a) )
ROM_END
-ROM_START( overrevb ) /* Over Rev Revision B, Model 2B, Sega Game ID# 836-13274, ROM board ID# 836-13275 */
+/*
+
+Over Rev on MODEL2 B-CRX:
+
+The set below has been found labeled as:
+Main board ID# 837-10854-02-91
+ Sega Game ID# 836-12788
+ ROM board ID# 836-12789
+
+As well as:
+Main board ID# 837-10854-02-91
+ Sega Game ID# 836-13274 OVER REV
+ ROM board ID# 836-13275
+
+These ID numbers have been verified on multiple board sets for both revision A and revision B program ROMs
+*/
+ROM_START( overrevb ) /* Over Rev Revision B, Model 2B */
ROM_REGION( 0x200000, "maincpu", 0 ) // i960 program
ROM_LOAD32_WORD( "epr-19992b.15", 0x000000, 0x080000, CRC(6d3e78d5) SHA1(40d18ee284ea2e038f7e3d04db56e793ab3e3dd5) ) /* sum16 492A printed on label */
ROM_LOAD32_WORD( "epr-19993b.16", 0x000002, 0x080000, CRC(765dc9ce) SHA1(a718c32ca27ec1fb5ed2d7d3797ea7e906510a04) ) /* sum16 B955 printed on label */
@@ -5318,6 +5380,35 @@ ROM_START( overrevb ) /* Over Rev Revision B, Model 2B, Sega Game ID# 836-13274,
ROM_LOAD16_WORD_SWAP( "mpr-20004.34", 0x400000, 0x400000, CRC(0b9c5410) SHA1(e5bb30702fc853ccc03316be07a334269d3ebb4a) )
ROM_END
+ROM_START( overrevba ) /* Over Rev Revision A, Model 2B */
+ ROM_REGION( 0x200000, "maincpu", 0 ) // i960 program
+ ROM_LOAD32_WORD( "epr-19992a.15", 0x000000, 0x080000, CRC(68d3c8a8) SHA1(360d42c502d16ba056f4bfa8bb1667c8c58df8e2) )
+ ROM_LOAD32_WORD( "epr-19993a.16", 0x000002, 0x080000, CRC(9718eb58) SHA1(07e92d00843dd499e45654827e233723e18cc3e2) )
+
+ ROM_REGION32_LE( 0x2000000, "main_data", 0 ) // Data
+ ROM_LOAD32_WORD( "mpr-19996.11", 0x000000, 0x400000, CRC(21928a00) SHA1(6b439fd2b113b64df9378ef8180a17aa6fa975c5) )
+ ROM_LOAD32_WORD( "mpr-19997.12", 0x000002, 0x400000, CRC(2a169cab) SHA1(dbf9af938afd0599d345c42c1df242e575c14de9) )
+ ROM_LOAD32_WORD( "mpr-19994.9", 0x800000, 0x400000, CRC(e691fbd5) SHA1(b99c2f3f2a682966d792917dfcb8ed8e53bc0b7a) )
+ ROM_LOAD32_WORD( "mpr-19995.10", 0x800002, 0x400000, CRC(82a7828e) SHA1(4336a12a07a67f94091b4a9b491bab02c375dd15) )
+
+ ROM_REGION( 0x800000, "copro_data", ROMREGION_ERASE00 ) // Copro extra data (collision/height map/etc)
+
+ ROM_REGION( 0x800000, "polygons", 0 ) // Models
+ ROM_LOAD32_WORD( "mpr-19998.17", 0x000000, 0x200000, CRC(6a834574) SHA1(8be19bf42dbb157d6acde62a2018ef4c0d41aab4) )
+ ROM_LOAD32_WORD( "mpr-19999.21", 0x000002, 0x200000, CRC(ff590a2d) SHA1(ad29e4270b4a2f82189fbab83358eb1200f43777) )
+
+ ROM_REGION( 0x400000, "textures", 0 ) // Textures
+ ROM_LOAD32_WORD( "mpr-20001.27", 0x000000, 0x200000, CRC(6ca236aa) SHA1(b3cb89fadb42afed13be4f229d7158dee487978a) )
+ ROM_LOAD32_WORD( "mpr-20000.25", 0x000002, 0x200000, CRC(894d8ded) SHA1(9bf7c754a29eef47fa49b5567980601895127306) )
+
+ ROM_REGION( 0x080000, "audiocpu", 0 ) // Sound program
+ ROM_LOAD16_WORD_SWAP( "epr-20002.31", 0x000000, 0x080000, CRC(7efb069e) SHA1(30b1bbaf348d6a6b9ee2fdf82a0749baa025e0bf) )
+
+ ROM_REGION16_BE( 0x800000, "samples", 0 ) // Samples
+ ROM_LOAD16_WORD_SWAP( "mpr-20003.32", 0x000000, 0x400000, CRC(149ac22b) SHA1(c890bbaebbbb07b62bcb8a3a8edded9fa0ec9a1e) )
+ ROM_LOAD16_WORD_SWAP( "mpr-20004.34", 0x400000, 0x400000, CRC(0b9c5410) SHA1(e5bb30702fc853ccc03316be07a334269d3ebb4a) )
+ROM_END
+
ROM_START( rascot2 ) /* Royal Ascot 2, Model 2C, Rom Board : 837-12485 Com Board : 837-12532 SDC-2 */
ROM_REGION( 0x200000, "maincpu", 0 ) // i960 program
ROM_LOAD32_WORD("epr-20166.15", 0x000000, 0x020000, CRC(520479a4) SHA1(02e14a7be299c2af36373595cf6f154312372a60) )
@@ -6704,6 +6795,7 @@ GAME( 1995, manxtt, 0, manxttdx, manxtt, model2a_state, empty_in
GAME( 1995, manxttc, 0, manxtt, manxtt, model2a_state, empty_init, ROT0, "Sega", "Manx TT Superbike - Twin (Revision C)", MACHINE_NOT_WORKING|MACHINE_IMPERFECT_GRAPHICS )
GAME( 1995, srallyc, 0, srallyc, srallyc, model2a_state, empty_init, ROT0, "Sega", "Sega Rally Championship - Twin/DX (Revision C)", MACHINE_NOT_WORKING|MACHINE_IMPERFECT_GRAPHICS )
GAME( 1995, srallycb, srallyc, srallyc, srallyc, model2a_state, empty_init, ROT0, "Sega", "Sega Rally Championship - Twin/DX (Revision B)", MACHINE_NOT_WORKING|MACHINE_IMPERFECT_GRAPHICS )
+GAME( 1995, srallycc, srallyc, srallyc, srallyc, model2a_state, empty_init, ROT0, "Sega", "Sega Rally Championship - Twin/DX (Revision A)", MACHINE_NOT_WORKING|MACHINE_IMPERFECT_GRAPHICS )
GAME( 1995, srallycdx, srallyc, srallyc, srallyc, model2a_state, empty_init, ROT0, "Sega", "Sega Rally Championship - DX (Revision A)", MACHINE_NOT_WORKING|MACHINE_IMPERFECT_GRAPHICS )
GAME( 1995, srallycdxa,srallyc, srallyc, srallyc, model2a_state, empty_init, ROT0, "Sega", "Sega Rally Championship - DX", MACHINE_NOT_WORKING|MACHINE_IMPERFECT_GRAPHICS )
GAME( 1995, vcop2, 0, vcop2, vcop2, model2a_state, empty_init, ROT0, "Sega", "Virtua Cop 2", MACHINE_NOT_WORKING|MACHINE_IMPERFECT_GRAPHICS )
@@ -6739,6 +6831,7 @@ GAME( 1996, sgt24h, 0, indy500, sgt24h, model2b_state, init_sg
GAME( 1996, dynabb, 0, dynabb, dynabb, model2b_state, empty_init, ROT0, "Sega", "Dynamite Baseball", MACHINE_NOT_WORKING|MACHINE_IMPERFECT_GRAPHICS )
GAME( 1997, dynabb97, 0, dynabb, dynabb, model2b_state, empty_init, ROT0, "Sega", "Dynamite Baseball 97 (Revision A)", MACHINE_NOT_WORKING|MACHINE_IMPERFECT_GRAPHICS )
GAME( 1997, overrevb, overrev, indy500, overrev, model2b_state, empty_init, ROT0, "Jaleco", "Over Rev (Model 2B, Revision B)", MACHINE_NOT_WORKING|MACHINE_IMPERFECT_GRAPHICS )
+GAME( 1997, overrevba, overrev, indy500, overrev, model2b_state, empty_init, ROT0, "Jaleco", "Over Rev (Model 2B, Revision A)", MACHINE_NOT_WORKING|MACHINE_IMPERFECT_GRAPHICS )
GAME( 1997, zerogun, 0, zerogun, zerogun, model2b_state, init_zerogun, ROT0, "Psikyo", "Zero Gunner (Export, Model 2B)", MACHINE_NOT_WORKING|MACHINE_IMPERFECT_GRAPHICS )
GAME( 1997, zerogunj, zerogun, zerogun, zerogun, model2b_state, init_zerogun, ROT0, "Psikyo", "Zero Gunner (Japan, Model 2B)", MACHINE_NOT_WORKING|MACHINE_IMPERFECT_GRAPHICS )
GAME( 1998, dynamcopb, dynamcop, model2b_5881, dynamcop, model2b_state, empty_init, ROT0, "Sega", "Dynamite Cop (Export, Model 2B)", MACHINE_NOT_WORKING|MACHINE_IMPERFECT_GRAPHICS )
diff --git a/src/mame/drivers/model3.cpp b/src/mame/drivers/model3.cpp
index 6d91183246e..ac9637de63d 100644
--- a/src/mame/drivers/model3.cpp
+++ b/src/mame/drivers/model3.cpp
@@ -2274,7 +2274,7 @@ ROM_START( scud ) /* step 1.5, Sega game ID# is 833-13041, ROM board ID# 834-1
ROM_LOAD( "epr-19338a.bin", 0x000000, 0x010000, CRC(c9fac464) SHA1(47b9ab7921a685c01629afb592d597faa11d2bd6) )
ROM_END
-ROM_START( scudj ) /* step 1.5, Sega game ID# is 833-13041, ROM board ID# 12934 SPG DX */
+ROM_START( scudj ) /* step 1.5, Sega game ID# is 833-13041, ROM board ID# 12934 SPG DX, Digital Audio board ID# 837-12941 */
ROM_REGION64_BE( 0x8800000, "user1", 0 ) /* program + data ROMs */
// CROM
ROM_LOAD64_WORD_SWAP( "epr-19610a.17", 0x0600006, 0x80000, CRC(53f5cd94) SHA1(e27609165087ef7000b61ce628883561ffe64b22) )
@@ -3124,7 +3124,7 @@ ROM_START( lostwsga ) /* Step 1.5, PCB cage labeled 834-13172 THE LOST WORLD U
ROM_FILL( 0x000000, 0x800000, 0x0000 )
ROM_END
-ROM_START( lostwsgo ) /* Step 1.5, build 1997/06/24, possible original "no revision" release */
+ROM_START( lostwsgp ) /* Step 1.5, build 1997/06/24, location test or preview version, about half of game is available, Stage 3-2 ends with "Coming Soon?" */
ROM_REGION64_BE( 0x8800000, "user1", 0 ) /* program + data ROMs */
// CROM
ROM_LOAD64_WORD_SWAP( "ic17.17", 0x600006, 0x080000, CRC(9e94afdb) SHA1(c66ebc6f1ec34475f67cfc8dc66fa8634a59432b) )
@@ -4311,6 +4311,7 @@ ROM_START( swtrilgy ) /* Step 2.1, Sega game ID# is 833-13586, ROM board ID# 8
ROM_LOAD( "mpr-21378.24", 0xc00000, 0x400000, CRC(1fcf715e) SHA1(9706f36e7a61d885d34a6974311a2410fe3d6760) )
ROM_REGION( 0x10000, "ffcpu", 0 ) /* force feedback controller prg */
+ ROM_LOAD( "dvctbd.bin", 0x00000, 0x10000, CRC(f5208c59) SHA1(f8216b2dc0dac94dcbcf4f8f09dc606777251209) ) // ROM label unknown, not clear if older or newer than epr-21119
ROM_LOAD( "epr-21119.ic8", 0x00000, 0x10000, CRC(65082b14) SHA1(6c3c192dd6ef3780c6202dd63fc6086328928818) )
// ???? 317-0241-COM Model 3
@@ -5025,7 +5026,7 @@ ROM_START( srally2pa ) // prototype 1997/12/08
ROM_LOAD( "epr-20512.bin", 0x000000, 0x010000, CRC(cf64350d) SHA1(f30c8c7b65fb38f7dd63845f12b81388ff3b946d) )
ROM_END
-ROM_START( srally2x ) /* Step 2.0 */
+ROM_START( srally2x ) /* Step 2.0, Sega game ID# is 833-13371, ROM board ID# 834-13372 SRT DX */
ROM_REGION64_BE( 0x8800000, "user1", 0 ) /* program + data ROMs */
// CROM
ROM_LOAD64_WORD_SWAP( "epr-20502.17", 0x000006, 0x200000, CRC(af16846d) SHA1(a0babc4dc3809ca1e71eaad4dc2f8c1597575e8b) )
@@ -5212,7 +5213,7 @@ ROM_START( harleya ) /* Step 2.0, Sega game ID# is 833-13325, ROM board ID# 8
ROM_FILL( 0x000000, 0x1000000, 0x0000 )
ROM_END
-ROM_START( fvipers2 ) /* Step 2.0 */
+ROM_START( fvipers2 ) /* Step 2.0, Sega game ID# is 833-13407 FIGHTING VIPERS2, ROM board ID# 834-13408 FIGHTING VIPERS2, Security board ID# 837-13423-COM */
ROM_REGION64_BE( 0x8800000, "user1", 0 ) /* program + data ROMs */
// CROM
ROM_LOAD64_WORD_SWAP( "epr-20596a.17", 0x000006, 0x200000, CRC(969ab801) SHA1(a7a2aa71204d1c38a6a8c0605331fd859cb224f1) )
@@ -6545,7 +6546,7 @@ GAME( 1996, scuda, scud, scud, scud, model3_state, init_scud,
GAME( 1997, scudplus, scud, scud, scud, model3_state, init_scudplus, ROT0, "Sega", "Scud Race Plus (Revision A)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND )
GAME( 1997, scudplusa, scud, scud, scud, model3_state,init_scudplusa, ROT0, "Sega", "Scud Race Plus", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND )
GAME( 1997, lostwsga, 0, model3_15, lostwsga, model3_state, init_lostwsga, ROT0, "Sega", "The Lost World (Revision A)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND )
-GAME( 1997, lostwsgo,lostwsga, model3_15, lostwsga, model3_state, init_lostwsga, ROT0, "Sega", "The Lost World (older)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND )
+GAME( 1997, lostwsgp,lostwsga, model3_15, lostwsga, model3_state, init_lostwsga, ROT0, "Sega", "The Lost World (location test)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND )
GAME( 1997, vs215, vs2, model3_15, model3, model3_state, init_vs215, ROT0, "Sega", "Virtua Striker 2 (Step 1.5, Export, USA)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND )
GAME( 1997, vs215o, vs2, model3_15, model3, model3_state, init_vs215, ROT0, "Sega", "Virtua Striker 2 (Step 1.5, Japan)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND )
GAME( 1997, lemans24, 0, model3_15, scud, model3_state, init_lemans24, ROT0, "Sega", "Le Mans 24 (Revision B)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND )
diff --git a/src/mame/drivers/modellot.cpp b/src/mame/drivers/modellot.cpp
index c87ed0f9719..2521ae49cdb 100644
--- a/src/mame/drivers/modellot.cpp
+++ b/src/mame/drivers/modellot.cpp
@@ -178,28 +178,29 @@ uint32_t modellot_state::screen_update_modellot(screen_device &screen, bitmap_in
return 0;
}
-MACHINE_CONFIG_START(modellot_state::modellot)
+void modellot_state::modellot(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu",Z80, XTAL(4'000'000))
- MCFG_DEVICE_PROGRAM_MAP(mem_map)
- MCFG_DEVICE_IO_MAP(io_map)
+ Z80(config, m_maincpu, XTAL(4'000'000));
+ m_maincpu->set_addrmap(AS_PROGRAM, &modellot_state::mem_map);
+ m_maincpu->set_addrmap(AS_IO, &modellot_state::io_map);
/* video hardware */
- MCFG_SCREEN_ADD_MONOCHROME("screen", RASTER, rgb_t::green())
- MCFG_SCREEN_REFRESH_RATE(50)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */
- MCFG_SCREEN_SIZE(64*8, 16*16)
- MCFG_SCREEN_VISIBLE_AREA(0, 64*8-1, 0, 16*16-1)
- MCFG_SCREEN_UPDATE_DRIVER(modellot_state, screen_update_modellot)
- MCFG_SCREEN_PALETTE("palette")
-
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_modellot)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER, rgb_t::green()));
+ screen.set_refresh_hz(50);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */
+ screen.set_size(64*8, 16*16);
+ screen.set_visarea(0, 64*8-1, 0, 16*16-1);
+ screen.set_screen_update(FUNC(modellot_state::screen_update_modellot));
+ screen.set_palette("palette");
+
+ GFXDECODE(config, "gfxdecode", "palette", gfx_modellot);
PALETTE(config, "palette", palette_device::MONOCHROME);
/* Devices */
generic_keyboard_device &keyboard(GENERIC_KEYBOARD(config, "keyboard", 0));
keyboard.set_keyboard_callback(FUNC(modellot_state::kbd_put));
-MACHINE_CONFIG_END
+}
/* ROM definition */
ROM_START( modellot )
diff --git a/src/mame/drivers/modena.cpp b/src/mame/drivers/modena.cpp
index fb72cbee78d..43fce448759 100644
--- a/src/mame/drivers/modena.cpp
+++ b/src/mame/drivers/modena.cpp
@@ -138,12 +138,14 @@ void mephisto_modena_state::machine_reset()
}
-MACHINE_CONFIG_START(mephisto_modena_state::modena)
- MCFG_DEVICE_ADD("maincpu", M65C02, XTAL(4'194'304)) // W65C02SP
- MCFG_DEVICE_PROGRAM_MAP(modena_mem)
- MCFG_TIMER_DRIVER_ADD_PERIODIC("nmi_on", mephisto_modena_state, nmi_on, attotime::from_hz(XTAL(4'194'304) / (1 << 13)))
- MCFG_TIMER_START_DELAY(attotime::from_hz(XTAL(4'194'304) / (1 << 13)) - attotime::from_usec(975)) // active for 975us
- MCFG_TIMER_DRIVER_ADD_PERIODIC("nmi_off", mephisto_modena_state, nmi_off, attotime::from_hz(XTAL(4'194'304) / (1 << 13)))
+void mephisto_modena_state::modena(machine_config &config)
+{
+ M65C02(config, m_maincpu, XTAL(4'194'304)); // W65C02SP
+ m_maincpu->set_addrmap(AS_PROGRAM, &mephisto_modena_state::modena_mem);
+ timer_device &nmi_on(TIMER(config, "nmi_on"));
+ nmi_on.configure_periodic(FUNC(mephisto_modena_state::nmi_on), attotime::from_hz(XTAL(4'194'304) / (1 << 13)));
+ nmi_on.set_start_delay(attotime::from_hz(XTAL(4'194'304) / (1 << 13)) - attotime::from_usec(975)); // active for 975us
+ TIMER(config, "nmi_off").configure_periodic(FUNC(mephisto_modena_state::nmi_off), attotime::from_hz(XTAL(4'194'304) / (1 << 13)));
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
@@ -153,9 +155,8 @@ MACHINE_CONFIG_START(mephisto_modena_state::modena)
/* sound hardware */
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("beeper", BEEP, 3250)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
-MACHINE_CONFIG_END
+ BEEP(config, m_beeper, 3250).add_route(ALL_OUTPUTS, "mono", 1.0);
+}
ROM_START(modena)
diff --git a/src/mame/drivers/mogura.cpp b/src/mame/drivers/mogura.cpp
index d2e4acbc668..71965ec7e99 100644
--- a/src/mame/drivers/mogura.cpp
+++ b/src/mame/drivers/mogura.cpp
@@ -208,22 +208,22 @@ void mogura_state::machine_start()
{
}
-MACHINE_CONFIG_START(mogura_state::mogura)
-
+void mogura_state::mogura(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80,3000000) /* 3 MHz */
- MCFG_DEVICE_PROGRAM_MAP(mogura_map)
- MCFG_DEVICE_IO_MAP(mogura_io_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", mogura_state, irq0_line_hold)
+ Z80(config, m_maincpu, 3000000); /* 3 MHz */
+ m_maincpu->set_addrmap(AS_PROGRAM, &mogura_state::mogura_map);
+ m_maincpu->set_addrmap(AS_IO, &mogura_state::mogura_io_map);
+ m_maincpu->set_vblank_int("screen", FUNC(mogura_state::irq0_line_hold));
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60) // ?
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(512, 512)
- MCFG_SCREEN_VISIBLE_AREA(0, 320-1, 0, 256-1)
- MCFG_SCREEN_UPDATE_DRIVER(mogura_state, screen_update_mogura)
- MCFG_SCREEN_PALETTE("palette")
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60); // ?
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(512, 512);
+ screen.set_visarea(0, 320-1, 0, 256-1);
+ screen.set_screen_update(FUNC(mogura_state::screen_update_mogura));
+ screen.set_palette("palette");
GFXDECODE(config, m_gfxdecode, "palette", gfx_mogura);
PALETTE(config, "palette", FUNC(mogura_state::mogura_palette), 32);
@@ -231,12 +231,12 @@ MACHINE_CONFIG_START(mogura_state::mogura)
/* sound hardware */
SPEAKER(config, "lspeaker").front_left();
SPEAKER(config, "rspeaker").front_right();
- MCFG_DEVICE_ADD("ldac", DAC_4BIT_R2R, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 0.25) // unknown DAC
- MCFG_DEVICE_ADD("rdac", DAC_4BIT_R2R, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 0.25) // unknown DAC
- MCFG_DEVICE_ADD("vref", VOLTAGE_REGULATOR, 0) MCFG_VOLTAGE_REGULATOR_OUTPUT(5.0)
- MCFG_SOUND_ROUTE(0, "ldac", 1.0, DAC_VREF_POS_INPUT) MCFG_SOUND_ROUTE(0, "ldac", -1.0, DAC_VREF_NEG_INPUT)
- MCFG_SOUND_ROUTE(0, "rdac", 1.0, DAC_VREF_POS_INPUT) MCFG_SOUND_ROUTE(0, "rdac", -1.0, DAC_VREF_NEG_INPUT)
- MACHINE_CONFIG_END
+ DAC_4BIT_R2R(config, m_ldac, 0).add_route(ALL_OUTPUTS, "lspeaker", 0.25); // unknown DAC
+ DAC_4BIT_R2R(config, m_rdac, 0).add_route(ALL_OUTPUTS, "rspeaker", 0.25); // unknown DAC
+ voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref"));
+ vref.add_route(0, "ldac", 1.0, DAC_VREF_POS_INPUT); vref.add_route(0, "ldac", -1.0, DAC_VREF_NEG_INPUT);
+ vref.add_route(0, "rdac", 1.0, DAC_VREF_POS_INPUT); vref.add_route(0, "rdac", -1.0, DAC_VREF_NEG_INPUT);
+}
ROM_START( mogura )
diff --git a/src/mame/drivers/mole.cpp b/src/mame/drivers/mole.cpp
index bf8ddf93453..83702b50d6b 100644
--- a/src/mame/drivers/mole.cpp
+++ b/src/mame/drivers/mole.cpp
@@ -323,30 +323,30 @@ void mole_state::machine_reset()
m_tile_bank = 0;
}
-MACHINE_CONFIG_START(mole_state::mole)
-
+void mole_state::mole(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M6502, 4000000) // ???
- MCFG_DEVICE_PROGRAM_MAP(mole_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", mole_state, irq0_line_assert)
+ M6502(config, m_maincpu, 4000000); // ???
+ m_maincpu->set_addrmap(AS_PROGRAM, &mole_state::mole_map);
+ m_maincpu->set_vblank_int("screen", FUNC(mole_state::irq0_line_assert));
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500))
- MCFG_SCREEN_SIZE(40*8, 25*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 40*8-1, 0*8, 25*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(mole_state, screen_update_mole)
- MCFG_SCREEN_PALETTE("palette")
-
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_mole)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500));
+ screen.set_size(40*8, 25*8);
+ screen.set_visarea(0*8, 40*8-1, 0*8, 25*8-1);
+ screen.set_screen_update(FUNC(mole_state::screen_update_mole));
+ screen.set_palette("palette");
+
+ GFXDECODE(config, m_gfxdecode, "palette", gfx_mole);
PALETTE(config, "palette", palette_device::RBG_3BIT);
/* sound hardware */
SPEAKER(config, "mono").front_center();
AY8910(config, "aysnd", 2000000).add_route(ALL_OUTPUTS, "mono", 1.0);
-MACHINE_CONFIG_END
+}
/*************************************
diff --git a/src/mame/drivers/molecular.cpp b/src/mame/drivers/molecular.cpp
index fafed97a8b9..90ad41e69e8 100644
--- a/src/mame/drivers/molecular.cpp
+++ b/src/mame/drivers/molecular.cpp
@@ -297,40 +297,40 @@ void molecula_state::molecula_palette(palette_device &palette) const
{
}
-MACHINE_CONFIG_START(molecula_state::molecula)
-
+void molecula_state::molecula(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("filecpu",Z80,Z80_CLOCK/2)
- MCFG_DEVICE_PROGRAM_MAP(molecula_file_map)
- MCFG_DEVICE_IO_MAP(molecula_file_io)
- MCFG_DEVICE_DISABLE()
+ Z80(config, m_filecpu, Z80_CLOCK/2);
+ m_filecpu->set_addrmap(AS_PROGRAM, &molecula_state::molecula_file_map);
+ m_filecpu->set_addrmap(AS_IO, &molecula_state::molecula_file_io);
+ m_filecpu->set_disable();
- MCFG_DEVICE_ADD("appcpu",Z80,Z80_CLOCK/2)
- MCFG_DEVICE_PROGRAM_MAP(molecula_app_map)
- MCFG_DEVICE_IO_MAP(molecula_app_io)
+ z80_device &appcpu(Z80(config, "appcpu", Z80_CLOCK/2));
+ appcpu.set_addrmap(AS_PROGRAM, &molecula_state::molecula_app_map);
+ appcpu.set_addrmap(AS_IO, &molecula_state::molecula_app_io);
-// MCFG_DEVICE_ADD("sub",I8086,I86_CLOCK/2)
-// MCFG_DEVICE_PROGRAM_MAP(molecula_map)
-// MCFG_DEVICE_IO_MAP(molecula_io)
-// MCFG_DEVICE_DISABLE()
+// i8086_device &sub(I8086(config, "sub", I86_CLOCK/2));
+// sub.set_addrmap(AS_PROGRAM, &molecula_state::molecula_map);
+// sub.set_addrmap(AS_IO, &molecula_state::molecula_io);
+// sub.set_disable();
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500))
- MCFG_SCREEN_UPDATE_DRIVER(molecula_state, screen_update)
- MCFG_SCREEN_SIZE(32*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 0*8, 32*8-1)
- MCFG_SCREEN_PALETTE("palette")
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500));
+ screen.set_screen_update(FUNC(molecula_state::screen_update));
+ screen.set_size(32*8, 32*8);
+ screen.set_visarea(0*8, 32*8-1, 0*8, 32*8-1);
+ screen.set_palette("palette");
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_molecula)
+ GFXDECODE(config, "gfxdecode", "palette", gfx_molecula);
PALETTE(config, "palette", FUNC(molecula_state::molecula_palette), 8);
/* sound hardware */
SPEAKER(config, "mono").front_center();
// AY8910(config, "aysnd", MAIN_CLOCK/4).add_route(ALL_OUTPUTS, "mono", 0.30);
-MACHINE_CONFIG_END
+}
/***************************************************************************
diff --git a/src/mame/drivers/momoko.cpp b/src/mame/drivers/momoko.cpp
index c3aea29e4e9..ec0d9096651 100644
--- a/src/mame/drivers/momoko.cpp
+++ b/src/mame/drivers/momoko.cpp
@@ -255,26 +255,26 @@ void momoko_state::machine_reset()
m_flipscreen = 0;
}
-MACHINE_CONFIG_START(momoko_state::momoko)
-
+void momoko_state::momoko(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, XTAL(10'000'000)/2) /* 5.0MHz */
- MCFG_DEVICE_PROGRAM_MAP(momoko_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", momoko_state, irq0_line_hold)
+ Z80(config, m_maincpu, XTAL(10'000'000)/2); /* 5.0MHz */
+ m_maincpu->set_addrmap(AS_PROGRAM, &momoko_state::momoko_map);
+ m_maincpu->set_vblank_int("screen", FUNC(momoko_state::irq0_line_hold));
- MCFG_DEVICE_ADD("audiocpu", Z80, XTAL(10'000'000)/4) /* 2.5MHz */
- MCFG_DEVICE_PROGRAM_MAP(momoko_sound_map)
+ z80_device &audiocpu(Z80(config, "audiocpu", XTAL(10'000'000)/4)); /* 2.5MHz */
+ audiocpu.set_addrmap(AS_PROGRAM, &momoko_state::momoko_sound_map);
WATCHDOG_TIMER(config, "watchdog");
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */)
- MCFG_SCREEN_SIZE(32*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(1*8, 31*8-1, 2*8, 29*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(momoko_state, screen_update_momoko)
- MCFG_SCREEN_PALETTE(m_palette)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500) /* not accurate */);
+ screen.set_size(32*8, 32*8);
+ screen.set_visarea(1*8, 31*8-1, 2*8, 29*8-1);
+ screen.set_screen_update(FUNC(momoko_state::screen_update_momoko));
+ screen.set_palette(m_palette);
GFXDECODE(config, m_gfxdecode, m_palette, gfx_momoko);
PALETTE(config, m_palette).set_format(palette_device::xRGB_444, 512);
@@ -297,7 +297,7 @@ MACHINE_CONFIG_START(momoko_state::momoko)
ym2.add_route(1, "mono", 0.15);
ym2.add_route(2, "mono", 0.15);
ym2.add_route(3, "mono", 0.40);
-MACHINE_CONFIG_END
+}
/****************************************************************************/
diff --git a/src/mame/drivers/monacogp.cpp b/src/mame/drivers/monacogp.cpp
index 2580c0d2e61..dcac825ec5f 100644
--- a/src/mame/drivers/monacogp.cpp
+++ b/src/mame/drivers/monacogp.cpp
@@ -183,20 +183,21 @@ void monacogp_state::video_start()
{
}
-MACHINE_CONFIG_START(monacogp_state::monacogp)
-
+void monacogp_state::monacogp(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", NETLIST_CPU, NETLIST_CLOCK)
- MCFG_NETLIST_SETUP(monacogp)
+ NETLIST_CPU(config, m_maincpu, NETLIST_CLOCK);
+ m_maincpu->set_constructor(netlist_monacogp);
/* video hardware */
- MCFG_FIXFREQ_ADD("fixfreq", "screen")
- MCFG_FIXFREQ_MONITOR_CLOCK(MASTER_CLOCK)
- MCFG_FIXFREQ_HORZ_PARAMS(H_TOTAL-67,H_TOTAL-40,H_TOTAL-8,H_TOTAL)
- MCFG_FIXFREQ_VERT_PARAMS(V_TOTAL-22,V_TOTAL-19,V_TOTAL-12,V_TOTAL)
- MCFG_FIXFREQ_FIELDCOUNT(1)
- MCFG_FIXFREQ_SYNC_THRESHOLD(0.30)
-MACHINE_CONFIG_END
+ SCREEN(config, "screen", SCREEN_TYPE_RASTER);
+ FIXFREQ(config, m_video).set_screen("screen");
+ m_video->set_monitor_clock(MASTER_CLOCK);
+ m_video->set_horz_params(H_TOTAL-67,H_TOTAL-40,H_TOTAL-8,H_TOTAL);
+ m_video->set_vert_params(V_TOTAL-22,V_TOTAL-19,V_TOTAL-12,V_TOTAL);
+ m_video->set_fieldcount(1);
+ m_video->set_threshold(0.30);
+}
/***************************************************************************
diff --git a/src/mame/drivers/monon_color.cpp b/src/mame/drivers/monon_color.cpp
index f805d31d302..bc7cac52cea 100644
--- a/src/mame/drivers/monon_color.cpp
+++ b/src/mame/drivers/monon_color.cpp
@@ -117,21 +117,20 @@ void monon_color_state::monon_color_map(address_map &map)
}
MACHINE_CONFIG_START(monon_color_state::monon_color)
-
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", AX208, 96000000) // (8051 / MCS51 derived) incomplete core!
- MCFG_DEVICE_PROGRAM_MAP(monon_color_map)
+ AX208(config, m_maincpu, 96000000); // (8051 / MCS51 derived) incomplete core!
+ m_maincpu->set_addrmap(AS_PROGRAM, &monon_color_state::monon_color_map);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500))
- MCFG_SCREEN_UPDATE_DRIVER(monon_color_state, screen_update)
- MCFG_SCREEN_SIZE(32*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1)
- MCFG_SCREEN_PALETTE("palette")
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_refresh_hz(60);
+ m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(2500));
+ m_screen->set_screen_update(FUNC(monon_color_state::screen_update));
+ m_screen->set_size(32*8, 32*8);
+ m_screen->set_visarea(0*8, 32*8-1, 2*8, 30*8-1);
+ m_screen->set_palette(m_palette);
- MCFG_PALETTE_ADD("palette", 256)
+ PALETTE(config, m_palette).set_entries(256);
/* sound hardware */
SPEAKER(config, "mono").front_center();
@@ -143,7 +142,7 @@ MACHINE_CONFIG_START(monon_color_state::monon_color)
MCFG_GENERIC_MANDATORY
/* software lists */
- MCFG_SOFTWARE_LIST_ADD("cart_list","monon_color")
+ SOFTWARE_LIST(config, "cart_list").set_original("monon_color");
MACHINE_CONFIG_END
DEVICE_IMAGE_LOAD_MEMBER( monon_color_state, monon_color_cart )
diff --git a/src/mame/drivers/monzagp.cpp b/src/mame/drivers/monzagp.cpp
index 43c4d2dfea0..074edd9f8a5 100644
--- a/src/mame/drivers/monzagp.cpp
+++ b/src/mame/drivers/monzagp.cpp
@@ -140,15 +140,15 @@ void monzagp_state::monzagp_palette(palette_device &palette) const
// red component
bit0 = BIT(d, 2);
- int const r = combine_3_weights(rweights, bit0, bit1, bit2);
+ int const r = combine_weights(rweights, bit0, bit1, bit2);
// green component
bit0 = BIT(d, 1);
- int const g = combine_3_weights(gweights, bit0, bit1, bit2);
+ int const g = combine_weights(gweights, bit0, bit1, bit2);
// blue component
bit0 = BIT(d, 0);
- int const b = combine_3_weights(bweights, bit0, bit1, bit2);
+ int const b = combine_weights(bweights, bit0, bit1, bit2);
palette.set_pen_color(i, rgb_t(r, g, b));
}
@@ -504,7 +504,8 @@ static GFXDECODE_START( gfx_monzagp )
GFXDECODE_ENTRY( "gfx3", 0x0000, tile_layout, 0, 8 )
GFXDECODE_END
-MACHINE_CONFIG_START(monzagp_state::monzagp)
+void monzagp_state::monzagp(machine_config &config)
+{
I8035(config, m_maincpu, 12000000/4); /* 400KHz ??? - Main board Crystal is 12MHz */
m_maincpu->set_addrmap(AS_PROGRAM, &monzagp_state::monzagp_map);
m_maincpu->set_addrmap(AS_IO, &monzagp_state::monzagp_io);
@@ -526,10 +527,10 @@ MACHINE_CONFIG_START(monzagp_state::monzagp)
PALETTE(config, m_palette, FUNC(monzagp_state::monzagp_palette), 0x200);
GFXDECODE(config, m_gfxdecode, m_palette, gfx_monzagp);
- MCFG_TIMER_DRIVER_ADD_PERIODIC("time_tick_timer", monzagp_state, time_tick_timer, attotime::from_hz(4))
+ TIMER(config, "time_tick_timer").configure_periodic(FUNC(monzagp_state::time_tick_timer), attotime::from_hz(4));
NVRAM(config, "nvram", nvram_device::DEFAULT_NONE);
-MACHINE_CONFIG_END
+}
ROM_START( monzagp )
ROM_REGION( 0x1000, "maincpu", 0 )
diff --git a/src/mame/drivers/moo.cpp b/src/mame/drivers/moo.cpp
index f2ea25096f8..e01c2c4d483 100644
--- a/src/mame/drivers/moo.cpp
+++ b/src/mame/drivers/moo.cpp
@@ -494,15 +494,15 @@ MACHINE_RESET_MEMBER(moo_state,moo)
m_sprite_colorbase = 0;
}
-MACHINE_CONFIG_START(moo_state::moo)
-
+void moo_state::moo(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M68000, XTAL(32'000'000)/2) // 16MHz verified
- MCFG_DEVICE_PROGRAM_MAP(moo_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", moo_state, moo_interrupt)
+ M68000(config, m_maincpu, XTAL(32'000'000)/2); // 16MHz verified
+ m_maincpu->set_addrmap(AS_PROGRAM, &moo_state::moo_map);
+ m_maincpu->set_vblank_int("screen", FUNC(moo_state::moo_interrupt));
- MCFG_DEVICE_ADD("soundcpu", Z80, XTAL(32'000'000)/4) // 8MHz verified
- MCFG_DEVICE_PROGRAM_MAP(sound_map)
+ Z80(config, m_soundcpu, XTAL(32'000'000)/4); // 8MHz verified
+ m_soundcpu->set_addrmap(AS_PROGRAM, &moo_state::sound_map);
MCFG_MACHINE_START_OVERRIDE(moo_state,moo)
MCFG_MACHINE_RESET_OVERRIDE(moo_state,moo)
@@ -513,13 +513,13 @@ MACHINE_CONFIG_START(moo_state::moo)
m_k053252->set_offsets(40, 16);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_VIDEO_ATTRIBUTES(VIDEO_UPDATE_AFTER_VBLANK)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(1200)) // should give IRQ4 sufficient time to update scroll registers
- MCFG_SCREEN_SIZE(64*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(40, 40+384-1, 16, 16+224-1)
- MCFG_SCREEN_UPDATE_DRIVER(moo_state, screen_update_moo)
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_video_attributes(VIDEO_UPDATE_AFTER_VBLANK);
+ m_screen->set_refresh_hz(60);
+ m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(1200)); // should give IRQ4 sufficient time to update scroll registers
+ m_screen->set_size(64*8, 32*8);
+ m_screen->set_visarea(40, 40+384-1, 16, 16+224-1);
+ m_screen->set_screen_update(FUNC(moo_state::screen_update_moo));
PALETTE(config, m_palette).set_format(palette_device::xRGB_888, 2048);
m_palette->enable_shadows();
@@ -549,17 +549,17 @@ MACHINE_CONFIG_START(moo_state::moo)
YM2151(config, "ymsnd", XTAL(32'000'000)/8).add_route(0, "lspeaker", 0.50).add_route(1, "rspeaker", 0.50); // 4MHz verified
- MCFG_DEVICE_ADD("k054539", K054539, XTAL(18'432'000))
- MCFG_SOUND_ROUTE(0, "rspeaker", 0.75)
- MCFG_SOUND_ROUTE(1, "lspeaker", 0.75)
-MACHINE_CONFIG_END
-
-MACHINE_CONFIG_START(moo_state::moobl)
+ K054539(config, m_k054539, XTAL(18'432'000));
+ m_k054539->add_route(0, "rspeaker", 0.75);
+ m_k054539->add_route(1, "lspeaker", 0.75);
+}
+void moo_state::moobl(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M68000, 16100000)
- MCFG_DEVICE_PROGRAM_MAP(moobl_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", moo_state, moobl_interrupt)
+ M68000(config, m_maincpu, 16100000);
+ m_maincpu->set_addrmap(AS_PROGRAM, &moo_state::moobl_map);
+ m_maincpu->set_vblank_int("screen", FUNC(moo_state::moobl_interrupt));
MCFG_MACHINE_START_OVERRIDE(moo_state,moo)
MCFG_MACHINE_RESET_OVERRIDE(moo_state,moo)
@@ -567,13 +567,13 @@ MACHINE_CONFIG_START(moo_state::moobl)
EEPROM_ER5911_8BIT(config, "eeprom");
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_VIDEO_ATTRIBUTES(VIDEO_UPDATE_AFTER_VBLANK)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(1200)) // should give IRQ4 sufficient time to update scroll registers
- MCFG_SCREEN_SIZE(64*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(40, 40+384-1, 16, 16+224-1)
- MCFG_SCREEN_UPDATE_DRIVER(moo_state, screen_update_moo)
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_video_attributes(VIDEO_UPDATE_AFTER_VBLANK);
+ m_screen->set_refresh_hz(60);
+ m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(1200)); // should give IRQ4 sufficient time to update scroll registers
+ m_screen->set_size(64*8, 32*8);
+ m_screen->set_visarea(40, 40+384-1, 16, 16+224-1);
+ m_screen->set_screen_update(FUNC(moo_state::screen_update_moo));
PALETTE(config, m_palette).set_format(palette_device::xRGB_888, 2048);
m_palette->enable_shadows();
@@ -599,16 +599,16 @@ MACHINE_CONFIG_START(moo_state::moobl)
SPEAKER(config, "lspeaker").front_left();
SPEAKER(config, "rspeaker").front_right();
- MCFG_DEVICE_ADD("oki", OKIM6295, 1056000, okim6295_device::PIN7_HIGH) // clock frequency & pin 7 not verified
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 1.0)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 1.0)
-MACHINE_CONFIG_END
+ OKIM6295(config, m_oki, 1056000, okim6295_device::PIN7_HIGH); // clock frequency & pin 7 not verified
+ m_oki->add_route(ALL_OUTPUTS, "lspeaker", 1.0);
+ m_oki->add_route(ALL_OUTPUTS, "rspeaker", 1.0);
+}
-MACHINE_CONFIG_START(moo_state::bucky)
+void moo_state::bucky(machine_config &config)
+{
moo(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(bucky_map)
+ m_maincpu->set_addrmap(AS_PROGRAM, &moo_state::bucky_map);
K054000(config, "k054000", 0);
@@ -618,7 +618,7 @@ MACHINE_CONFIG_START(moo_state::bucky)
m_palette->set_format(palette_device::xRGB_888, 4096);
MCFG_VIDEO_START_OVERRIDE(moo_state,bucky)
-MACHINE_CONFIG_END
+}
ROM_START( moomesa ) /* Version EA */
diff --git a/src/mame/drivers/mosaic.cpp b/src/mame/drivers/mosaic.cpp
index 37cabb24b2d..fddb52cf413 100644
--- a/src/mame/drivers/mosaic.cpp
+++ b/src/mame/drivers/mosaic.cpp
@@ -31,6 +31,10 @@ Sound: YM2203C
MCM2018ANS45 (x2)
HY6264P-15
+Actual Measured Clocks Derived
+ Z180 - 6.14522MHz (12.288000MHz/2)
+ YM2203C - 3.57543MHz (14.318181MHz/4)
+
Unknown 28 pin protection chip (possibly a PIC) at 5A (UC02 as silkscreened on PCB)
***************************************************************************/
@@ -277,23 +281,23 @@ void mosaic_state::machine_reset()
m_prot_val = 0;
}
-MACHINE_CONFIG_START(mosaic_state::mosaic)
-
+void mosaic_state::mosaic(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z180, XTAL(12'288'000)/2) /* 6.144MHz */
- MCFG_DEVICE_PROGRAM_MAP(mosaic_map)
- MCFG_DEVICE_IO_MAP(mosaic_io_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", mosaic_state, irq0_line_hold)
+ Z180(config, m_maincpu, XTAL(12'288'000)/2); /* 6.144MHz - Verified */
+ m_maincpu->set_addrmap(AS_PROGRAM, &mosaic_state::mosaic_map);
+ m_maincpu->set_addrmap(AS_IO, &mosaic_state::mosaic_io_map);
+ m_maincpu->set_vblank_int("screen", FUNC(mosaic_state::irq0_line_hold));
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(64*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(8*8, 48*8-1, 2*8, 30*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(mosaic_state, screen_update)
- MCFG_SCREEN_PALETTE("palette")
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(64*8, 32*8);
+ screen.set_visarea(8*8, 48*8-1, 2*8, 30*8-1);
+ screen.set_screen_update(FUNC(mosaic_state::screen_update));
+ screen.set_palette("palette");
GFXDECODE(config, m_gfxdecode, "palette", gfx_mosaic);
PALETTE(config, "palette").set_format(palette_device::xRGB_555, 256);
@@ -302,18 +306,18 @@ MACHINE_CONFIG_START(mosaic_state::mosaic)
/* sound hardware */
SPEAKER(config, "mono").front_center();
- ym2203_device &ymsnd(YM2203(config, "ymsnd", XTAL(12'288'000)/4)); /* 3.072MHz or 3.579545MHz (14.31818MHz/4)? */
+ ym2203_device &ymsnd(YM2203(config, "ymsnd", XTAL(14'318'181)/4)); /* 3.579545MHz - Verified */
ymsnd.port_a_read_callback().set_ioport("DSW");
ymsnd.add_route(ALL_OUTPUTS, "mono", 0.50);
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(mosaic_state::gfire2)
+void mosaic_state::gfire2(machine_config &config)
+{
mosaic(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(gfire2_map)
- MCFG_DEVICE_IO_MAP(gfire2_io_map)
-MACHINE_CONFIG_END
+ m_maincpu->set_addrmap(AS_PROGRAM, &mosaic_state::gfire2_map);
+ m_maincpu->set_addrmap(AS_IO, &mosaic_state::gfire2_io_map);
+}
diff --git a/src/mame/drivers/mouser.cpp b/src/mame/drivers/mouser.cpp
index 4dd9341441c..cde0dabd118 100644
--- a/src/mame/drivers/mouser.cpp
+++ b/src/mame/drivers/mouser.cpp
@@ -190,17 +190,17 @@ void mouser_state::machine_reset()
{
}
-MACHINE_CONFIG_START(mouser_state::mouser)
-
+void mouser_state::mouser(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, 4000000) /* 4 MHz ? */
- MCFG_DEVICE_PROGRAM_MAP(mouser_map)
- MCFG_DEVICE_OPCODES_MAP(decrypted_opcodes_map)
+ Z80(config, m_maincpu, 4000000); /* 4 MHz ? */
+ m_maincpu->set_addrmap(AS_PROGRAM, &mouser_state::mouser_map);
+ m_maincpu->set_addrmap(AS_OPCODES, &mouser_state::decrypted_opcodes_map);
- MCFG_DEVICE_ADD("audiocpu", Z80, 4000000) /* ??? */
- MCFG_DEVICE_PROGRAM_MAP(mouser_sound_map)
- MCFG_DEVICE_IO_MAP(mouser_sound_io_map)
- MCFG_DEVICE_PERIODIC_INT_DRIVER(mouser_state, mouser_sound_nmi_assert, 4*60) /* ??? This controls the sound tempo */
+ Z80(config, m_audiocpu, 4000000); /* ??? */
+ m_audiocpu->set_addrmap(AS_PROGRAM, &mouser_state::mouser_sound_map);
+ m_audiocpu->set_addrmap(AS_IO, &mouser_state::mouser_sound_io_map);
+ m_audiocpu->set_periodic_int(FUNC(mouser_state::mouser_sound_nmi_assert), attotime::from_hz(4*60)); /* ??? This controls the sound tempo */
ls259_device &mainlatch(LS259(config, "mainlatch")); // type unconfirmed
mainlatch.q_out_cb<0>().set(FUNC(mouser_state::nmi_enable_w));
@@ -210,14 +210,14 @@ MACHINE_CONFIG_START(mouser_state::mouser)
GENERIC_LATCH_8(config, "soundlatch").data_pending_callback().set_inputline(m_audiocpu, 0);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */)
- MCFG_SCREEN_SIZE(32*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(mouser_state, screen_update_mouser)
- MCFG_SCREEN_PALETTE(m_palette)
- MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE(*this, mouser_state, mouser_nmi_interrupt))
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500) /* not accurate */);
+ screen.set_size(32*8, 32*8);
+ screen.set_visarea(0*8, 32*8-1, 2*8, 30*8-1);
+ screen.set_screen_update(FUNC(mouser_state::screen_update_mouser));
+ screen.set_palette(m_palette);
+ screen.screen_vblank().set(FUNC(mouser_state::mouser_nmi_interrupt));
GFXDECODE(config, m_gfxdecode, m_palette, gfx_mouser);
PALETTE(config, m_palette, FUNC(mouser_state::mouser_palette), 64);
@@ -227,7 +227,7 @@ MACHINE_CONFIG_START(mouser_state::mouser)
AY8910(config, "ay1", 4000000/2).add_route(ALL_OUTPUTS, "mono", 0.50);
AY8910(config, "ay2", 4000000/2).add_route(ALL_OUTPUTS, "mono", 0.50);
-MACHINE_CONFIG_END
+}
ROM_START( mouser )
diff --git a/src/mame/drivers/mpc3000.cpp b/src/mame/drivers/mpc3000.cpp
index 799ee2b5c94..3110cd1f0cb 100644
--- a/src/mame/drivers/mpc3000.cpp
+++ b/src/mame/drivers/mpc3000.cpp
@@ -205,13 +205,12 @@ void mpc3000_state::mpc3000(machine_config &config)
hiledlatch.q_out_cb<6>().set_output("led14").invert(); // 16 Levels
hiledlatch.q_out_cb<7>().set_output("led15").invert(); // After
- device_t *device = nullptr;
- MCFG_SCREEN_ADD("screen", LCD)
- MCFG_SCREEN_REFRESH_RATE(80)
- MCFG_SCREEN_UPDATE_DEVICE("lcdc", hd61830_device, screen_update)
- MCFG_SCREEN_SIZE(240, 64) //6x20, 8x8
- MCFG_SCREEN_VISIBLE_AREA(0, 240-1, 0, 64-1)
- MCFG_SCREEN_PALETTE("palette")
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_LCD));
+ screen.set_refresh_hz(80);
+ screen.set_screen_update("lcdc", FUNC(hd61830_device::screen_update));
+ screen.set_size(240, 64); //6x20, 8x8
+ screen.set_visarea(0, 240-1, 0, 64-1);
+ screen.set_palette("palette");
PALETTE(config, "palette", FUNC(mpc3000_state::mpc3000_palette), 2);
diff --git a/src/mame/drivers/mpf1.cpp b/src/mame/drivers/mpf1.cpp
index 6eb4640def3..eec49abcc2e 100644
--- a/src/mame/drivers/mpf1.cpp
+++ b/src/mame/drivers/mpf1.cpp
@@ -355,8 +355,8 @@ void mpf1_state::machine_reset()
/* Machine Drivers */
-MACHINE_CONFIG_START(mpf1_state::mpf1)
-
+void mpf1_state::mpf1(machine_config &config)
+{
/* basic machine hardware */
Z80(config, m_maincpu, XTAL(3'579'545)/2);
m_maincpu->set_addrmap(AS_PROGRAM, &mpf1_state::mpf1_map);
@@ -376,21 +376,21 @@ MACHINE_CONFIG_START(mpf1_state::mpf1)
ppi.out_pb_callback().set(FUNC(mpf1_state::ppi_pb_w));
ppi.out_pc_callback().set(FUNC(mpf1_state::ppi_pc_w));
- MCFG_CASSETTE_ADD("cassette")
- MCFG_CASSETTE_DEFAULT_STATE(CASSETTE_STOPPED | CASSETTE_SPEAKER_ENABLED | CASSETTE_MOTOR_ENABLED)
+ CASSETTE(config, m_cassette);
+ m_cassette->set_default_state(CASSETTE_STOPPED | CASSETTE_SPEAKER_ENABLED | CASSETTE_MOTOR_ENABLED);
/* video hardware */
config.set_default_layout(layout_mpf1);
/* sound hardware */
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("speaker", SPEAKER_SOUND)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25)
+ SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25);
- MCFG_TIMER_DRIVER_ADD_PERIODIC("halt_timer", mpf1_state, check_halt_callback, attotime::from_hz(1))
-MACHINE_CONFIG_END
+ TIMER(config, "halt_timer").configure_periodic(FUNC(mpf1_state::check_halt_callback), attotime::from_hz(1));
+}
-MACHINE_CONFIG_START(mpf1_state::mpf1b)
+void mpf1_state::mpf1b(machine_config &config)
+{
/* basic machine hardware */
Z80(config, m_maincpu, XTAL(3'579'545)/2);
m_maincpu->set_addrmap(AS_PROGRAM, &mpf1_state::mpf1b_map);
@@ -410,24 +410,23 @@ MACHINE_CONFIG_START(mpf1_state::mpf1b)
ppi.out_pb_callback().set(FUNC(mpf1_state::ppi_pb_w));
ppi.out_pc_callback().set(FUNC(mpf1_state::ppi_pc_w));
- MCFG_CASSETTE_ADD("cassette")
- MCFG_CASSETTE_DEFAULT_STATE(CASSETTE_STOPPED | CASSETTE_SPEAKER_ENABLED | CASSETTE_MOTOR_ENABLED)
+ CASSETTE(config, m_cassette);
+ m_cassette->set_default_state(CASSETTE_STOPPED | CASSETTE_SPEAKER_ENABLED | CASSETTE_MOTOR_ENABLED);
/* video hardware */
config.set_default_layout(layout_mpf1b);
/* sound hardware */
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("speaker", SPEAKER_SOUND)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25)
+ SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25);
- MCFG_DEVICE_ADD(TMS5220_TAG, TMS5220, 680000L)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.50)
+ TMS5220(config, TMS5220_TAG, 680000L).add_route(ALL_OUTPUTS, "mono", 0.50);
- MCFG_TIMER_DRIVER_ADD_PERIODIC("halt_timer", mpf1_state, check_halt_callback, attotime::from_hz(1))
-MACHINE_CONFIG_END
+ TIMER(config, "halt_timer").configure_periodic(FUNC(mpf1_state::check_halt_callback), attotime::from_hz(1));
+}
-MACHINE_CONFIG_START(mpf1_state::mpf1p)
+void mpf1_state::mpf1p(machine_config &config)
+{
/* basic machine hardware */
Z80(config, m_maincpu, 2500000);
m_maincpu->set_addrmap(AS_PROGRAM, &mpf1_state::mpf1p_map);
@@ -450,16 +449,15 @@ MACHINE_CONFIG_START(mpf1_state::mpf1p)
ppi.out_pb_callback().set(FUNC(mpf1_state::ppi_pb_w));
ppi.out_pc_callback().set(FUNC(mpf1_state::ppi_pc_w));
- MCFG_CASSETTE_ADD("cassette")
- MCFG_CASSETTE_DEFAULT_STATE(CASSETTE_STOPPED | CASSETTE_SPEAKER_ENABLED | CASSETTE_MOTOR_ENABLED)
+ CASSETTE(config, m_cassette);
+ m_cassette->set_default_state(CASSETTE_STOPPED | CASSETTE_SPEAKER_ENABLED | CASSETTE_MOTOR_ENABLED);
/* sound hardware */
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("speaker", SPEAKER_SOUND)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25)
+ SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25);
- MCFG_TIMER_DRIVER_ADD_PERIODIC("halt_timer", mpf1_state, check_halt_callback, attotime::from_hz(1))
-MACHINE_CONFIG_END
+ TIMER(config, "halt_timer").configure_periodic(FUNC(mpf1_state::check_halt_callback), attotime::from_hz(1));
+}
/* ROMs */
diff --git a/src/mame/drivers/mps1230.cpp b/src/mame/drivers/mps1230.cpp
index 3646d540904..71f8f4d9d39 100644
--- a/src/mame/drivers/mps1230.cpp
+++ b/src/mame/drivers/mps1230.cpp
@@ -138,15 +138,17 @@ void mps1230_state::mps1230_map(address_map &map)
static INPUT_PORTS_START( mps1230 )
INPUT_PORTS_END
-MACHINE_CONFIG_START(mps1230_state::mps1230)
- MCFG_DEVICE_ADD(CPU_TAG, UPD7810, 11060000)
- MCFG_DEVICE_PROGRAM_MAP(mps1230_map)
-MACHINE_CONFIG_END
-
-MACHINE_CONFIG_START(mps1230_state::mps1000)
- MCFG_DEVICE_ADD(CPU_TAG, Z80, 4000000)
- MCFG_DEVICE_PROGRAM_MAP(mps1230_map)
-MACHINE_CONFIG_END
+void mps1230_state::mps1230(machine_config &config)
+{
+ UPD7810(config, m_maincpu, 11060000);
+ m_maincpu->set_addrmap(AS_PROGRAM, &mps1230_state::mps1230_map);
+}
+
+void mps1230_state::mps1000(machine_config &config)
+{
+ Z80(config, m_maincpu, 4000000);
+ m_maincpu->set_addrmap(AS_PROGRAM, &mps1230_state::mps1230_map);
+}
/***************************************************************************
diff --git a/src/mame/drivers/mpu12wbk.cpp b/src/mame/drivers/mpu12wbk.cpp
index f1e22b2bf43..807716f04e8 100644
--- a/src/mame/drivers/mpu12wbk.cpp
+++ b/src/mame/drivers/mpu12wbk.cpp
@@ -494,22 +494,22 @@ GFXDECODE_END
* Machine Drivers *
*************************/
-MACHINE_CONFIG_START(mpu12wbk_state::mpu12wbk)
-
+void mpu12wbk_state::mpu12wbk(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", MC6809, MASTER_CLOCK)
- MCFG_DEVICE_PROGRAM_MAP(mpu12wbk_map)
+ MC6809(config, m_maincpu, MASTER_CLOCK);
+ m_maincpu->set_addrmap(AS_PROGRAM, &mpu12wbk_state::mpu12wbk_map);
// NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE((32+1)*8, (32+1)*8) /* From MC6845, registers 00 & 04. (value-1) */
- MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 0*8, 32*8-1) /* Driven by MC6845, registers 01 & 06 */
- MCFG_SCREEN_UPDATE_DRIVER(mpu12wbk_state, screen_update_mpu12wbk)
- MCFG_SCREEN_PALETTE("palette")
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size((32+1)*8, (32+1)*8); /* From MC6845, registers 00 & 04. (value-1) */
+ screen.set_visarea(0*8, 32*8-1, 0*8, 32*8-1); /* Driven by MC6845, registers 01 & 06 */
+ screen.set_screen_update(FUNC(mpu12wbk_state::screen_update_mpu12wbk));
+ screen.set_palette("palette");
GFXDECODE(config, m_gfxdecode, "palette", gfx_mpu12wbk);
PALETTE(config, "palette", FUNC(mpu12wbk_state::mpu12wbk_palette), 512);
@@ -524,8 +524,7 @@ MACHINE_CONFIG_START(mpu12wbk_state::mpu12wbk)
SPEAKER(config, "mono").front_center();
AY8910(config, "ay8910", MASTER_CLOCK/8).add_route(ALL_OUTPUTS, "mono", 1.00); /* clock guessed */
-
-MACHINE_CONFIG_END
+}
/*************************
diff --git a/src/mame/drivers/mpu2.cpp b/src/mame/drivers/mpu2.cpp
index 566df8efea1..914dd61b447 100644
--- a/src/mame/drivers/mpu2.cpp
+++ b/src/mame/drivers/mpu2.cpp
@@ -74,10 +74,11 @@ INPUT_PORTS_END
-MACHINE_CONFIG_START(mpu2_state::mpu2)
- MCFG_DEVICE_ADD("maincpu", M6800, 2000000) // ?
- MCFG_DEVICE_PROGRAM_MAP(mpu2_basemap)
-MACHINE_CONFIG_END
+void mpu2_state::mpu2(machine_config &config)
+{
+ M6800(config, m_maincpu, 2000000); // ?
+ m_maincpu->set_addrmap(AS_PROGRAM, &mpu2_state::mpu2_basemap);
+}
// technically not a 'bios' because they're all on the same board.
#define MPU2_MASKROM \
diff --git a/src/mame/drivers/mpu3.cpp b/src/mame/drivers/mpu3.cpp
index fa4d828b5d7..6e1c005ff64 100644
--- a/src/mame/drivers/mpu3.cpp
+++ b/src/mame/drivers/mpu3.cpp
@@ -803,12 +803,12 @@ TIMER_DEVICE_CALLBACK_MEMBER(mpu3_state::ic10_callback)
}
WRITE8_MEMBER(mpu3_state::mpu3ptm_w)
{
- m_ptm2->write(space, offset >>2,data);//((offset & 0x1f) >>2),data);
+ m_ptm2->write(offset >>2,data);//((offset & 0x1f) >>2),data);
}
READ8_MEMBER(mpu3_state::mpu3ptm_r)
{
- return m_ptm2->read(space, offset >>2);
+ return m_ptm2->read(offset >>2);
}
void mpu3_state::mpu3_basemap(address_map &map)
@@ -822,17 +822,18 @@ void mpu3_state::mpu3_basemap(address_map &map)
map(0xa800, 0xa803).rw(m_pia6, FUNC(pia6821_device::read), FUNC(pia6821_device::write)); /* PIA6821 IC6 */
}
-MACHINE_CONFIG_START(mpu3_state::mpu3base)
- MCFG_DEVICE_ADD("maincpu", M6808, 4_MHz_XTAL)
- MCFG_DEVICE_PROGRAM_MAP(mpu3_basemap)
+void mpu3_state::mpu3base(machine_config &config)
+{
+ M6808(config, m_maincpu, 4_MHz_XTAL);
+ m_maincpu->set_addrmap(AS_PROGRAM, &mpu3_state::mpu3_basemap);
input_merger_device &mainirq(INPUT_MERGER_ANY_HIGH(config, "mainirq")); // open collector
mainirq.output_handler().set_inputline("maincpu", M6808_IRQ_LINE);
MSC1937(config, m_vfd);
- MCFG_TIMER_DRIVER_ADD_PERIODIC("50hz", mpu3_state, gen_50hz, attotime::from_hz(100))
- MCFG_TIMER_DRIVER_ADD_PERIODIC("555_ic10", mpu3_state, ic10_callback, PERIOD_OF_555_ASTABLE(10000,1000,0.0000001))
+ TIMER(config, "50hz").configure_periodic(FUNC(mpu3_state::gen_50hz), attotime::from_hz(100));
+ TIMER(config, "555_ic10").configure_periodic(FUNC(mpu3_state::ic10_callback), PERIOD_OF_555_ASTABLE(10000,1000,0.0000001));
/* 6840 PTM */
PTM6840(config, m_ptm2, 4_MHz_XTAL / 4);
@@ -880,13 +881,12 @@ MACHINE_CONFIG_START(mpu3_state::mpu3base)
REEL(config, m_reels[3], MPU3_48STEP_REEL, 1, 3, 0x00, 2);
m_reels[3]->optic_handler().set(FUNC(mpu3_state::reel_optic_cb<3>));
- MCFG_DEVICE_ADD("meters", METERS, 0)
- MCFG_METERS_NUMBER(8)
+ METERS(config, m_meters, 0).set_number(8);
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0); // 2x HM4334 or HMI6514 or MB8414 + 2.4V battery
config.set_default_layout(layout_mpu3);
-MACHINE_CONFIG_END
+}
static const mpu3_chr_table hprvpr_data[64] = {
diff --git a/src/mame/drivers/mpu4dealem.cpp b/src/mame/drivers/mpu4dealem.cpp
index 0b599667a2e..73db940923c 100644
--- a/src/mame/drivers/mpu4dealem.cpp
+++ b/src/mame/drivers/mpu4dealem.cpp
@@ -107,16 +107,16 @@ void mpu4dealem_state::dealem_palette(palette_device &palette) const
bit0 = BIT(*color_prom, 0);
bit1 = BIT(*color_prom, 1);
bit2 = BIT(*color_prom, 2);
- int const r = combine_3_weights(weights_r, bit0, bit1, bit2);
+ int const r = combine_weights(weights_r, bit0, bit1, bit2);
/* green component */
bit0 = BIT(*color_prom, 3);
bit1 = BIT(*color_prom, 4);
bit2 = BIT(*color_prom, 5);
- int const g = combine_3_weights(weights_g, bit0, bit1, bit2);
+ int const g = combine_weights(weights_g, bit0, bit1, bit2);
/* blue component */
bit0 = BIT(*color_prom, 6);
bit1 = BIT(*color_prom, 7);
- int const b = combine_2_weights(weights_b, bit0, bit1);
+ int const b = combine_weights(weights_b, bit0, bit1);
palette.set_pen_color(i, rgb_t(r, g, b));
color_prom++;
@@ -196,12 +196,13 @@ MACHINE_RESET_MEMBER(mpu4dealem_state,dealem_vid)
/* machine driver for Zenitone Deal 'Em board */
-MACHINE_CONFIG_START(mpu4dealem_state::dealem)
+void mpu4dealem_state::dealem(machine_config &config)
+{
MCFG_MACHINE_START_OVERRIDE(mpu4dealem_state,mod2) /* main mpu4 board initialisation */
MCFG_MACHINE_RESET_OVERRIDE(mpu4dealem_state,dealem_vid)
- MCFG_DEVICE_ADD("maincpu", M6809, MPU4_MASTER_CLOCK/4)
- MCFG_DEVICE_PROGRAM_MAP(dealem_memmap)
+ M6809(config, m_maincpu, MPU4_MASTER_CLOCK/4);
+ m_maincpu->set_addrmap(AS_PROGRAM, &mpu4dealem_state::dealem_memmap);
mpu4_common(config);
@@ -214,23 +215,23 @@ MACHINE_CONFIG_START(mpu4dealem_state::dealem)
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_SIZE((54+1)*8, (32+1)*8) /* Taken from 6845 init, registers 00 & 04. Normally programmed with (value-1) */
- MCFG_SCREEN_VISIBLE_AREA(0*8, 40*8-1, 0*8, 31*8-1) /* Taken from 6845 init, registers 01 & 06 */
- MCFG_SCREEN_REFRESH_RATE(56) /* Measured accurately from the flip-flop, but 6845 handles this */
- MCFG_SCREEN_UPDATE_DRIVER(mpu4dealem_state, screen_update_dealem)
- MCFG_SCREEN_PALETTE("palette")
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_size((54+1)*8, (32+1)*8); /* Taken from 6845 init, registers 00 & 04. Normally programmed with (value-1) */
+ screen.set_visarea(0*8, 40*8-1, 0*8, 31*8-1); /* Taken from 6845 init, registers 01 & 06 */
+ screen.set_refresh_hz(56); /* Measured accurately from the flip-flop, but 6845 handles this */
+ screen.set_screen_update(FUNC(mpu4dealem_state::screen_update_dealem));
+ screen.set_palette(m_palette);
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_dealem)
+ GFXDECODE(config, m_gfxdecode, m_palette, gfx_dealem);
- PALETTE(config, "palette", FUNC(mpu4dealem_state::dealem_palette), 32);
+ PALETTE(config, m_palette, FUNC(mpu4dealem_state::dealem_palette), 32);
hd6845_device &crtc(HD6845(config, "crtc", MPU4_MASTER_CLOCK / 4 / 8)); /* HD68B45 */
crtc.set_screen("screen");
crtc.set_show_border_area(false);
crtc.set_char_width(8);
crtc.out_vsync_callback().set(FUNC(mpu4dealem_state::dealem_vsync_changed));
-MACHINE_CONFIG_END
+}
diff --git a/src/mame/drivers/mpu4plasma.cpp b/src/mame/drivers/mpu4plasma.cpp
index f1f6930af61..9784f72a740 100644
--- a/src/mame/drivers/mpu4plasma.cpp
+++ b/src/mame/drivers/mpu4plasma.cpp
@@ -88,22 +88,23 @@ uint32_t mpu4plasma_state::screen_update_mpu4plasma(screen_device &screen, bitma
}
-MACHINE_CONFIG_START(mpu4plasma_state::mpu4plasma)
+void mpu4plasma_state::mpu4plasma(machine_config &config)
+{
mod2(config);
- MCFG_DEVICE_ADD("plasmacpu", M68000, 10000000)
- MCFG_DEVICE_PROGRAM_MAP(mpu4plasma_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", mpu4plasma_state, irq4_line_hold)
-
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(64*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0, 128-1, 0*8, 40-1)
- MCFG_SCREEN_UPDATE_DRIVER(mpu4plasma_state, screen_update_mpu4plasma)
- MCFG_SCREEN_PALETTE("palette")
-
- MCFG_PALETTE_ADD("palette", 0x200)
-MACHINE_CONFIG_END
+ m68000_device &plasmacpu(M68000(config, "plasmacpu", 10000000));
+ plasmacpu.set_addrmap(AS_PROGRAM, &mpu4plasma_state::mpu4plasma_map);
+ plasmacpu.set_vblank_int("screen", FUNC(mpu4plasma_state::irq4_line_hold));
+
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(64*8, 32*8);
+ screen.set_visarea(0, 128-1, 0*8, 40-1);
+ screen.set_screen_update(FUNC(mpu4plasma_state::screen_update_mpu4plasma));
+ screen.set_palette(m_palette);
+
+ PALETTE(config, m_palette).set_entries(0x200);
+}
// plasma v0.1
#define M4BIGCHF_PLASMA \
diff --git a/src/mame/drivers/mpu4sw.cpp b/src/mame/drivers/mpu4sw.cpp
index 6922676d799..332d9327d4e 100644
--- a/src/mame/drivers/mpu4sw.cpp
+++ b/src/mame/drivers/mpu4sw.cpp
@@ -4626,24 +4626,24 @@ GAME_CUSTOM( 199?, m4ttdia__m, m4ttdia, "tda04y.p1", 0x0000, 0x020000, CR
GAME(year, setname, parent, mod4oki, mpu4, mpu4_state, init_m4_showstring, ROT0, company, title, GAME_FLAGS )
// "(C)1993 BARCREST" and "PES 0.4"
-GAME_CUSTOM( 199?, m4przve, 0, "pess.p1", 0x0000, 0x010000, CRC(d8e79833) SHA1(f68fd1bd057a353832c7de3e2818906ab2b844b7), "Barcrest","Prize Viva Esapana (Barcrest) (MPU4) (PES 0.4)" )
-GAME_CUSTOM( 199?, m4przve__l, m4przve, "pesb.p1", 0x0000, 0x010000, CRC(bf0ffed9) SHA1(ab8cd98ae7dfb3582aad7ae8c669a6d97f144f88), "Barcrest","Prize Viva Esapana (Barcrest) (MPU4) (PES 0.4 B)" )
-GAME_CUSTOM( 199?, m4przve__m, m4przve, "pesd.p1", 0x0000, 0x010000, CRC(6f7b1e16) SHA1(412a22ebb61b77541da067ba74621c8e54364471), "Barcrest","Prize Viva Esapana (Barcrest) (MPU4) (PES 0.4 D)" )
-GAME_CUSTOM( 199?, m4przve__n, m4przve, "pesdy.p1", 0x0000, 0x010000, CRC(94db27b4) SHA1(fe745a991a5e78fc9054480d3ce5bf6b7f5f9fe4), "Barcrest","Prize Viva Esapana (Barcrest) (MPU4) (PES 0.4 YD)" )
-GAME_CUSTOM( 199?, m4przve__o, m4przve, "pesk.p1", 0x0000, 0x010000, CRC(9e7b9f58) SHA1(86c2a83964f925448dda189546d9909b10e52673), "Barcrest","Prize Viva Esapana (Barcrest) (MPU4) (PES 0.4 K)" )
-GAME_CUSTOM( 199?, m4przve__p, m4przve, "pesy.p1", 0x0000, 0x010000, CRC(fbfc1563) SHA1(870239cab39eff33303fe06dfd1dd3db708f0f2d), "Barcrest","Prize Viva Esapana (Barcrest) (MPU4) (PES 0.4 Y)" )
+GAME_CUSTOM( 199?, m4przve, 0, "pess.p1", 0x0000, 0x010000, CRC(d8e79833) SHA1(f68fd1bd057a353832c7de3e2818906ab2b844b7), "Barcrest","Prize Viva Espana (Barcrest) (MPU4) (PES 0.4)" )
+GAME_CUSTOM( 199?, m4przve__l, m4przve, "pesb.p1", 0x0000, 0x010000, CRC(bf0ffed9) SHA1(ab8cd98ae7dfb3582aad7ae8c669a6d97f144f88), "Barcrest","Prize Viva Espana (Barcrest) (MPU4) (PES 0.4 B)" )
+GAME_CUSTOM( 199?, m4przve__m, m4przve, "pesd.p1", 0x0000, 0x010000, CRC(6f7b1e16) SHA1(412a22ebb61b77541da067ba74621c8e54364471), "Barcrest","Prize Viva Espana (Barcrest) (MPU4) (PES 0.4 D)" )
+GAME_CUSTOM( 199?, m4przve__n, m4przve, "pesdy.p1", 0x0000, 0x010000, CRC(94db27b4) SHA1(fe745a991a5e78fc9054480d3ce5bf6b7f5f9fe4), "Barcrest","Prize Viva Espana (Barcrest) (MPU4) (PES 0.4 YD)" )
+GAME_CUSTOM( 199?, m4przve__o, m4przve, "pesk.p1", 0x0000, 0x010000, CRC(9e7b9f58) SHA1(86c2a83964f925448dda189546d9909b10e52673), "Barcrest","Prize Viva Espana (Barcrest) (MPU4) (PES 0.4 K)" )
+GAME_CUSTOM( 199?, m4przve__p, m4przve, "pesy.p1", 0x0000, 0x010000, CRC(fbfc1563) SHA1(870239cab39eff33303fe06dfd1dd3db708f0f2d), "Barcrest","Prize Viva Espana (Barcrest) (MPU4) (PES 0.4 Y)" )
// "(C)1993 BARCREST" and "PE8 0.1"
-GAME_CUSTOM( 199?, m4przve__j, m4przve, "pe8s.p1", 0x0000, 0x010000, CRC(e8463e69) SHA1(923d6c79470a65cf66b089ef09898acea928aa9b), "Barcrest","Prize Viva Esapana (Barcrest) (MPU4) (PE8 0.1)" )
-GAME_CUSTOM( 199?, m4przve__a, m4przve, "pe8ad.p1", 0x0000, 0x010000, CRC(3a81422e) SHA1(bb77365ed7bc7c2cd9e1cfe6e266c6edfd3562a3), "Barcrest","Prize Viva Esapana (Barcrest) (MPU4) (PE8 0.1 AD)" )
-GAME_CUSTOM( 199?, m4przve__b, m4przve, "pe8b.p1", 0x0000, 0x010000, CRC(9f36b112) SHA1(265451557afcfdc1aa8e77616f4b871698b20c5f), "Barcrest","Prize Viva Esapana (Barcrest) (MPU4) (PE8 0.1 B)" )
-GAME_CUSTOM( 199?, m4przve__c, m4przve, "pe8bd.p1", 0x0000, 0x010000, CRC(af0689b5) SHA1(0e3cf464c855b0dcfeac403bda80818287707abe), "Barcrest","Prize Viva Esapana (Barcrest) (MPU4) (PE8 0.1 BD)" )
-GAME_CUSTOM( 199?, m4przve__d, m4przve, "pe8d.p1", 0x0000, 0x010000, CRC(d21ee810) SHA1(bb95e217a383332a6617644bf17239c1ebd7c7e7), "Barcrest","Prize Viva Esapana (Barcrest) (MPU4) (PE8 0.1 D)" )
-GAME_CUSTOM( 199?, m4przve__e, m4przve, "pe8dj.p1", 0x0000, 0x010000, CRC(2bdf3b80) SHA1(2d27373e01c4308c9b0818c8193b459b1b335634), "Barcrest","Prize Viva Esapana (Barcrest) (MPU4) (PE8 0.1 DJ)" )
-GAME_CUSTOM( 199?, m4przve__f, m4przve, "pe8dk.p1", 0x0000, 0x010000, CRC(fcece282) SHA1(95e5bfeef8618f422501bcb9b703887587b3067a), "Barcrest","Prize Viva Esapana (Barcrest) (MPU4) (PE8 0.1 KD)" )
-GAME_CUSTOM( 199?, m4przve__g, m4przve, "pe8dy.p1", 0x0000, 0x010000, CRC(6abc5682) SHA1(ae8754f0e214738adae4bc856cd72b0920aaa67a), "Barcrest","Prize Viva Esapana (Barcrest) (MPU4) (PE8 0.1 YD)" )
-GAME_CUSTOM( 199?, m4przve__h, m4przve, "pe8j.p1", 0x0000, 0x010000, CRC(d3bf07f1) SHA1(3e539f24ef25c8d6fbfbdcd469fa8a2908dd2ec2), "Barcrest","Prize Viva Esapana (Barcrest) (MPU4) (PE8 0.1 J)" )
-GAME_CUSTOM( 199?, m4przve__i, m4przve, "pe8k.p1", 0x0000, 0x010000, CRC(efba0d3f) SHA1(2205b94f5a6ed23e834cfeb0d3ebe5ed66d942a1), "Barcrest","Prize Viva Esapana (Barcrest) (MPU4) (PE8 0.1 K)" )
-GAME_CUSTOM( 199?, m4przve__k, m4przve, "pe8y.p1", 0x0000, 0x010000, CRC(c324b75f) SHA1(bf3409a193539e1e032c856a5316bec674043d57), "Barcrest","Prize Viva Esapana (Barcrest) (MPU4) (PE8 0.1 Y)" )
+GAME_CUSTOM( 199?, m4przve__j, m4przve, "pe8s.p1", 0x0000, 0x010000, CRC(e8463e69) SHA1(923d6c79470a65cf66b089ef09898acea928aa9b), "Barcrest","Prize Viva Espana (Barcrest) (MPU4) (PE8 0.1)" )
+GAME_CUSTOM( 199?, m4przve__a, m4przve, "pe8ad.p1", 0x0000, 0x010000, CRC(3a81422e) SHA1(bb77365ed7bc7c2cd9e1cfe6e266c6edfd3562a3), "Barcrest","Prize Viva Espana (Barcrest) (MPU4) (PE8 0.1 AD)" )
+GAME_CUSTOM( 199?, m4przve__b, m4przve, "pe8b.p1", 0x0000, 0x010000, CRC(9f36b112) SHA1(265451557afcfdc1aa8e77616f4b871698b20c5f), "Barcrest","Prize Viva Espana (Barcrest) (MPU4) (PE8 0.1 B)" )
+GAME_CUSTOM( 199?, m4przve__c, m4przve, "pe8bd.p1", 0x0000, 0x010000, CRC(af0689b5) SHA1(0e3cf464c855b0dcfeac403bda80818287707abe), "Barcrest","Prize Viva Espana (Barcrest) (MPU4) (PE8 0.1 BD)" )
+GAME_CUSTOM( 199?, m4przve__d, m4przve, "pe8d.p1", 0x0000, 0x010000, CRC(d21ee810) SHA1(bb95e217a383332a6617644bf17239c1ebd7c7e7), "Barcrest","Prize Viva Espana (Barcrest) (MPU4) (PE8 0.1 D)" )
+GAME_CUSTOM( 199?, m4przve__e, m4przve, "pe8dj.p1", 0x0000, 0x010000, CRC(2bdf3b80) SHA1(2d27373e01c4308c9b0818c8193b459b1b335634), "Barcrest","Prize Viva Espana (Barcrest) (MPU4) (PE8 0.1 DJ)" )
+GAME_CUSTOM( 199?, m4przve__f, m4przve, "pe8dk.p1", 0x0000, 0x010000, CRC(fcece282) SHA1(95e5bfeef8618f422501bcb9b703887587b3067a), "Barcrest","Prize Viva Espana (Barcrest) (MPU4) (PE8 0.1 KD)" )
+GAME_CUSTOM( 199?, m4przve__g, m4przve, "pe8dy.p1", 0x0000, 0x010000, CRC(6abc5682) SHA1(ae8754f0e214738adae4bc856cd72b0920aaa67a), "Barcrest","Prize Viva Espana (Barcrest) (MPU4) (PE8 0.1 YD)" )
+GAME_CUSTOM( 199?, m4przve__h, m4przve, "pe8j.p1", 0x0000, 0x010000, CRC(d3bf07f1) SHA1(3e539f24ef25c8d6fbfbdcd469fa8a2908dd2ec2), "Barcrest","Prize Viva Espana (Barcrest) (MPU4) (PE8 0.1 J)" )
+GAME_CUSTOM( 199?, m4przve__i, m4przve, "pe8k.p1", 0x0000, 0x010000, CRC(efba0d3f) SHA1(2205b94f5a6ed23e834cfeb0d3ebe5ed66d942a1), "Barcrest","Prize Viva Espana (Barcrest) (MPU4) (PE8 0.1 K)" )
+GAME_CUSTOM( 199?, m4przve__k, m4przve, "pe8y.p1", 0x0000, 0x010000, CRC(c324b75f) SHA1(bf3409a193539e1e032c856a5316bec674043d57), "Barcrest","Prize Viva Espana (Barcrest) (MPU4) (PE8 0.1 Y)" )
#define M4SHOCM_EXTRA_ROMS \
diff --git a/src/mame/drivers/mpz80.cpp b/src/mame/drivers/mpz80.cpp
index 02a247b1ea4..344a1f14e7f 100644
--- a/src/mame/drivers/mpz80.cpp
+++ b/src/mame/drivers/mpz80.cpp
@@ -219,7 +219,7 @@ READ8_MEMBER( mpz80_state::mmu_r )
}
else
{
- data = m_s100->smemr_r(space, m_addr);
+ data = m_s100->smemr_r(m_addr);
}
return data;
@@ -267,7 +267,7 @@ WRITE8_MEMBER( mpz80_state::mmu_w )
}
else
{
- m_s100->mwrt_w(space, m_addr, data);
+ m_s100->mwrt_w(m_addr, data);
}
}
@@ -294,7 +294,7 @@ inline offs_t mpz80_state::get_io_address(offs_t offset)
READ8_MEMBER( mpz80_state::mmu_io_r )
{
- return m_s100->sinp_r(space, get_io_address(offset));
+ return m_s100->sinp_r(get_io_address(offset));
}
@@ -304,7 +304,7 @@ READ8_MEMBER( mpz80_state::mmu_io_r )
WRITE8_MEMBER( mpz80_state::mmu_io_w )
{
- m_s100->sout_w(space, get_io_address(offset), data);
+ m_s100->sout_w(get_io_address(offset), data);
}
@@ -709,41 +709,42 @@ void mpz80_state::machine_reset()
//**************************************************************************
//-------------------------------------------------
-// MACHINE_CONFIG( mpz80 )
+// machine_config( mpz80 )
//-------------------------------------------------
-MACHINE_CONFIG_START(mpz80_state::mpz80)
+void mpz80_state::mpz80(machine_config &config)
+{
// basic machine hardware
- MCFG_DEVICE_ADD(Z80_TAG, Z80, XTAL(4'000'000))
- MCFG_DEVICE_PROGRAM_MAP(mpz80_mem)
- MCFG_DEVICE_IO_MAP(mpz80_io)
+ Z80(config, m_maincpu, XTAL(4'000'000));
+ m_maincpu->set_addrmap(AS_PROGRAM, &mpz80_state::mpz80_mem);
+ m_maincpu->set_addrmap(AS_IO, &mpz80_state::mpz80_io);
// S-100
- MCFG_DEVICE_ADD(S100_TAG, S100_BUS, XTAL(4'000'000) / 2)
- MCFG_S100_IRQ_CALLBACK(WRITELINE(*this, mpz80_state, s100_pint_w))
- MCFG_S100_NMI_CALLBACK(WRITELINE(*this, mpz80_state, s100_nmi_w))
- MCFG_S100_RDY_CALLBACK(INPUTLINE(Z80_TAG, Z80_INPUT_LINE_BOGUSWAIT))
- MCFG_S100_SLOT_ADD(S100_TAG ":1", mpz80_s100_cards, "mm65k16s")
- MCFG_S100_SLOT_ADD(S100_TAG ":2", mpz80_s100_cards, "wunderbus")
- MCFG_S100_SLOT_ADD(S100_TAG ":3", mpz80_s100_cards, "dj2db")
- MCFG_S100_SLOT_ADD(S100_TAG ":4", mpz80_s100_cards, nullptr)//"hdcdma")
- MCFG_S100_SLOT_ADD(S100_TAG ":5", mpz80_s100_cards, nullptr)
- MCFG_S100_SLOT_ADD(S100_TAG ":6", mpz80_s100_cards, nullptr)
- MCFG_S100_SLOT_ADD(S100_TAG ":7", mpz80_s100_cards, nullptr)
- MCFG_S100_SLOT_ADD(S100_TAG ":8", mpz80_s100_cards, nullptr)
- MCFG_S100_SLOT_ADD(S100_TAG ":9", mpz80_s100_cards, nullptr)
- MCFG_S100_SLOT_ADD(S100_TAG ":10", mpz80_s100_cards, nullptr)
- MCFG_S100_SLOT_ADD(S100_TAG ":11", mpz80_s100_cards, nullptr)
- MCFG_S100_SLOT_ADD(S100_TAG ":12", mpz80_s100_cards, nullptr)
- MCFG_S100_SLOT_ADD(S100_TAG ":13", mpz80_s100_cards, nullptr)
- MCFG_S100_SLOT_ADD(S100_TAG ":14", mpz80_s100_cards, nullptr)
+ S100_BUS(config, m_s100, XTAL(4'000'000) / 2);
+ m_s100->irq().set(FUNC(mpz80_state::s100_pint_w));
+ m_s100->nmi().set(FUNC(mpz80_state::s100_nmi_w));
+ m_s100->rdy().set_inputline(m_maincpu, Z80_INPUT_LINE_BOGUSWAIT);
+ S100_SLOT(config, S100_TAG ":1", mpz80_s100_cards, "mm65k16s");
+ S100_SLOT(config, S100_TAG ":2", mpz80_s100_cards, "wunderbus");
+ S100_SLOT(config, S100_TAG ":3", mpz80_s100_cards, "dj2db");
+ S100_SLOT(config, S100_TAG ":4", mpz80_s100_cards, nullptr);//"hdcdma")
+ S100_SLOT(config, S100_TAG ":5", mpz80_s100_cards, nullptr);
+ S100_SLOT(config, S100_TAG ":6", mpz80_s100_cards, nullptr);
+ S100_SLOT(config, S100_TAG ":7", mpz80_s100_cards, nullptr);
+ S100_SLOT(config, S100_TAG ":8", mpz80_s100_cards, nullptr);
+ S100_SLOT(config, S100_TAG ":9", mpz80_s100_cards, nullptr);
+ S100_SLOT(config, S100_TAG ":10", mpz80_s100_cards, nullptr);
+ S100_SLOT(config, S100_TAG ":11", mpz80_s100_cards, nullptr);
+ S100_SLOT(config, S100_TAG ":12", mpz80_s100_cards, nullptr);
+ S100_SLOT(config, S100_TAG ":13", mpz80_s100_cards, nullptr);
+ S100_SLOT(config, S100_TAG ":14", mpz80_s100_cards, nullptr);
// internal ram
RAM(config, RAM_TAG).set_default_size("65K"); // 65K???
// software list
- MCFG_SOFTWARE_LIST_ADD("flop_list", "mpz80")
-MACHINE_CONFIG_END
+ SOFTWARE_LIST(config, "flop_list").set_original("mpz80");
+}
diff --git a/src/mame/drivers/mrdo.cpp b/src/mame/drivers/mrdo.cpp
index 7a26840f18c..c157b6f9b05 100644
--- a/src/mame/drivers/mrdo.cpp
+++ b/src/mame/drivers/mrdo.cpp
@@ -57,8 +57,8 @@ void mrdo_state::main_map(address_map &map)
map(0x8800, 0x8fff).ram().w(FUNC(mrdo_state::mrdo_fgvideoram_w)).share("fgvideoram");
map(0x9000, 0x90ff).writeonly().share("spriteram");
map(0x9800, 0x9800).w(FUNC(mrdo_state::mrdo_flipscreen_w)); /* screen flip + playfield priority */
- map(0x9801, 0x9801).w("u8106_1", FUNC(u8106_device::command_w));
- map(0x9802, 0x9802).w("u8106_2", FUNC(u8106_device::command_w));
+ map(0x9801, 0x9801).w("u8106_1", FUNC(u8106_device::write));
+ map(0x9802, 0x9802).w("u8106_2", FUNC(u8106_device::write));
map(0x9803, 0x9803).r(FUNC(mrdo_state::mrdo_SECRE_r));
map(0xa000, 0xa000).portr("P1");
map(0xa001, 0xa001).portr("P2");
@@ -175,18 +175,18 @@ static GFXDECODE_START( gfx_mrdo )
GFXDECODE_END
-MACHINE_CONFIG_START(mrdo_state::mrdo)
-
+void mrdo_state::mrdo(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, MAIN_CLOCK/2) /* Verified */
- MCFG_DEVICE_PROGRAM_MAP(main_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", mrdo_state, irq0_line_hold)
+ Z80(config, m_maincpu, MAIN_CLOCK/2); /* Verified */
+ m_maincpu->set_addrmap(AS_PROGRAM, &mrdo_state::main_map);
+ m_maincpu->set_vblank_int("screen", FUNC(mrdo_state::irq0_line_hold));
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_RAW_PARAMS(VIDEO_CLOCK/4, 312, 8, 248, 262, 32, 224)
- MCFG_SCREEN_UPDATE_DRIVER(mrdo_state, screen_update_mrdo)
- MCFG_SCREEN_PALETTE(m_palette)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_raw(VIDEO_CLOCK/4, 312, 8, 248, 262, 32, 224);
+ screen.set_screen_update(FUNC(mrdo_state::screen_update_mrdo));
+ screen.set_palette(m_palette);
GFXDECODE(config, m_gfxdecode, m_palette, gfx_mrdo);
PALETTE(config, m_palette, FUNC(mrdo_state::mrdo_palette), 64*4 + 16*4, 256);
@@ -194,17 +194,16 @@ MACHINE_CONFIG_START(mrdo_state::mrdo)
/* sound hardware */
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("u8106_1", U8106, MAIN_CLOCK/2) /* sn76489-equivalent?, Verified */
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.50)
+ U8106(config, "u8106_1", MAIN_CLOCK/2).add_route(ALL_OUTPUTS, "mono", 0.50); /* sn76489-equivalent?, Verified */
- MCFG_DEVICE_ADD("u8106_2", U8106, MAIN_CLOCK/2) /* sn76489-equivalent?, Verified */
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.50)
-MACHINE_CONFIG_END
+ U8106(config, "u8106_2", MAIN_CLOCK/2).add_route(ALL_OUTPUTS, "mono", 0.50); /* sn76489-equivalent?, Verified */
+}
-MACHINE_CONFIG_START(mrdo_state::mrlo)
+void mrdo_state::mrlo(machine_config &config)
+{
mrdo(config);
- //MCFG_DEVICE_REMOVE("pal16r6")
-MACHINE_CONFIG_END
+ //config.device_remove("pal16r6");
+}
diff --git a/src/mame/drivers/mrflea.cpp b/src/mame/drivers/mrflea.cpp
index b7f5f795d2d..c9020ed39ec 100644
--- a/src/mame/drivers/mrflea.cpp
+++ b/src/mame/drivers/mrflea.cpp
@@ -255,20 +255,20 @@ void mrflea_state::machine_reset()
m_gfx_bank = 0;
}
-MACHINE_CONFIG_START(mrflea_state::mrflea)
-
+void mrflea_state::mrflea(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, 4000000) /* 4 MHz? */
- MCFG_DEVICE_PROGRAM_MAP(mrflea_master_map)
- MCFG_DEVICE_IO_MAP(mrflea_master_io_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", mrflea_state, irq0_line_hold) /* NMI resets the game */
+ Z80(config, m_maincpu, 4000000); /* 4 MHz? */
+ m_maincpu->set_addrmap(AS_PROGRAM, &mrflea_state::mrflea_master_map);
+ m_maincpu->set_addrmap(AS_IO, &mrflea_state::mrflea_master_io_map);
+ m_maincpu->set_vblank_int("screen", FUNC(mrflea_state::irq0_line_hold)); /* NMI resets the game */
- MCFG_DEVICE_ADD("subcpu", Z80, 6000000) // runs in IM 1, so doesn't use 8259 INTA
- MCFG_DEVICE_PROGRAM_MAP(mrflea_slave_map)
- MCFG_DEVICE_IO_MAP(mrflea_slave_io_map)
- MCFG_TIMER_DRIVER_ADD_SCANLINE("scantimer", mrflea_state, mrflea_slave_interrupt, "screen", 0, 1)
+ Z80(config, m_subcpu, 6000000); // runs in IM 1, so doesn't use 8259 INTA
+ m_subcpu->set_addrmap(AS_PROGRAM, &mrflea_state::mrflea_slave_map);
+ m_subcpu->set_addrmap(AS_IO, &mrflea_state::mrflea_slave_io_map);
+ TIMER(config, "scantimer").configure_scanline(FUNC(mrflea_state::mrflea_slave_interrupt), "screen", 0, 1);
- MCFG_QUANTUM_TIME(attotime::from_hz(6000))
+ config.m_minimum_quantum = attotime::from_hz(6000);
i8255_device &mainppi(I8255(config, "mainppi", 0));
mainppi.in_pb_callback().set("subppi", FUNC(i8255_device::pb_r));
@@ -285,13 +285,13 @@ MACHINE_CONFIG_START(mrflea_state::mrflea)
m_pic->out_int_callback().set_inputline(m_subcpu, 0);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(32*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 0*8, 31*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(mrflea_state, screen_update_mrflea)
- MCFG_SCREEN_PALETTE("palette")
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_refresh_hz(60);
+ m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ m_screen->set_size(32*8, 32*8);
+ m_screen->set_visarea(0*8, 32*8-1, 0*8, 31*8-1);
+ m_screen->set_screen_update(FUNC(mrflea_state::screen_update_mrflea));
+ m_screen->set_palette(m_palette);
GFXDECODE(config, m_gfxdecode, m_palette, gfx_mrflea);
PALETTE(config, m_palette).set_format(palette_device::xRGB_444, 32);
@@ -315,7 +315,7 @@ MACHINE_CONFIG_START(mrflea_state::mrflea)
ay4.port_a_read_callback().set_ioport("UNKNOWN");
ay4.port_b_write_callback().set(FUNC(mrflea_state::mrflea_data1_w));
ay4.add_route(ALL_OUTPUTS, "mono", 0.25);
-MACHINE_CONFIG_END
+}
/*************************************
*
diff --git a/src/mame/drivers/mrgame.cpp b/src/mame/drivers/mrgame.cpp
index e966ad5c383..094b3a46334 100644
--- a/src/mame/drivers/mrgame.cpp
+++ b/src/mame/drivers/mrgame.cpp
@@ -468,18 +468,18 @@ void mrgame_state::mrgame_palette(palette_device &palette) const
bit0 = BIT(color_prom[i], 0);
bit1 = BIT(color_prom[i], 1);
bit2 = BIT(color_prom[i], 2);
- uint8_t const r = combine_3_weights(rweights, bit0, bit1, bit2);
+ uint8_t const r = combine_weights(rweights, bit0, bit1, bit2);
// green component
bit0 = BIT(color_prom[i], 3);
bit1 = BIT(color_prom[i], 4);
bit2 = BIT(color_prom[i], 5);
- uint8_t const g = combine_3_weights(gweights, bit0, bit1, bit2);
+ uint8_t const g = combine_weights(gweights, bit0, bit1, bit2);
// blue component
bit0 = BIT(color_prom[i], 6);
bit1 = BIT(color_prom[i], 7);
- uint8_t const b = combine_2_weights(bweights, bit0, bit1);
+ uint8_t const b = combine_weights(bweights, bit0, bit1);
palette.set_pen_color(i, rgb_t(r, g, b));
palette.set_pen_color(i + 32, rgb_t(r, g, b));
@@ -591,7 +591,6 @@ void mrgame_state::mrgame(machine_config &config)
dacvol.add_route(0, "rdac", -1.0, DAC_VREF_NEG_INPUT);
voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref", 0));
- vref.set_output(5.0);
vref.add_route(0, "dacvol", 1.0, DAC_VREF_POS_INPUT);
vref.add_route(0, "dacvol", -1.0, DAC_VREF_NEG_INPUT);
diff --git a/src/mame/drivers/mrjong.cpp b/src/mame/drivers/mrjong.cpp
index f0cafad98c4..f2de01ab5a6 100644
--- a/src/mame/drivers/mrjong.cpp
+++ b/src/mame/drivers/mrjong.cpp
@@ -85,8 +85,8 @@ void mrjong_state::mrjong_io_map(address_map &map)
{
map.global_mask(0xff);
map(0x00, 0x00).portr("P2").w(FUNC(mrjong_state::mrjong_flipscreen_w));
- map(0x01, 0x01).portr("P1").w("sn1", FUNC(sn76489_device::command_w));
- map(0x02, 0x02).portr("DSW").w("sn2", FUNC(sn76489_device::command_w));
+ map(0x01, 0x01).portr("P1").w("sn1", FUNC(sn76489_device::write));
+ map(0x02, 0x02).portr("DSW").w("sn2", FUNC(sn76489_device::write));
map(0x03, 0x03).r(FUNC(mrjong_state::io_0x03_r)); // Unknown
}
@@ -185,22 +185,22 @@ GFXDECODE_END
*
*************************************/
-MACHINE_CONFIG_START(mrjong_state::mrjong)
-
+void mrjong_state::mrjong(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80,15468000/6) /* 2.578 MHz?? */
- MCFG_DEVICE_PROGRAM_MAP(mrjong_map)
- MCFG_DEVICE_IO_MAP(mrjong_io_map)
+ Z80(config, m_maincpu,15468000/6); /* 2.578 MHz?? */
+ m_maincpu->set_addrmap(AS_PROGRAM, &mrjong_state::mrjong_map);
+ m_maincpu->set_addrmap(AS_IO, &mrjong_state::mrjong_io_map);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(32*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 30*8-1, 2*8, 30*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(mrjong_state, screen_update_mrjong)
- MCFG_SCREEN_PALETTE(m_palette)
- MCFG_SCREEN_VBLANK_CALLBACK(INPUTLINE("maincpu", INPUT_LINE_NMI))
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(32*8, 32*8);
+ screen.set_visarea(0*8, 30*8-1, 2*8, 30*8-1);
+ screen.set_screen_update(FUNC(mrjong_state::screen_update_mrjong));
+ screen.set_palette(m_palette);
+ screen.screen_vblank().set_inputline(m_maincpu, INPUT_LINE_NMI);
GFXDECODE(config, m_gfxdecode, m_palette, gfx_mrjong);
PALETTE(config, m_palette, FUNC(mrjong_state::mrjong_palette), 4 * 32, 16);
@@ -209,7 +209,7 @@ MACHINE_CONFIG_START(mrjong_state::mrjong)
SPEAKER(config, "mono").front_center();
SN76489(config, "sn1", 15468000 / 6).add_route(ALL_OUTPUTS, "mono", 1.0);
SN76489(config, "sn2", 15468000 / 6).add_route(ALL_OUTPUTS, "mono", 1.0);
-MACHINE_CONFIG_END
+}
/*************************************
diff --git a/src/mame/drivers/ms0515.cpp b/src/mame/drivers/ms0515.cpp
index 3d2de87af00..c0f1aa54baa 100644
--- a/src/mame/drivers/ms0515.cpp
+++ b/src/mame/drivers/ms0515.cpp
@@ -523,27 +523,26 @@ WRITE_LINE_MEMBER(ms0515_state::irq11_w)
irq_encoder(11, state);
}
-MACHINE_CONFIG_START(ms0515_state::ms0515)
+void ms0515_state::ms0515(machine_config &config)
+{
/* basic machine hardware */
T11(config, m_maincpu, XTAL(15'000'000) / 2); // actual CPU is T11 clone, KR1807VM1
m_maincpu->set_initial_mode(0xf2ff);
m_maincpu->set_addrmap(AS_PROGRAM, &ms0515_state::ms0515_mem);
/* video hardware -- 50 Hz refresh rate */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_RAW_PARAMS( XTAL(15'000'000), 958,0,640, 313,0,200 )
- MCFG_SCREEN_UPDATE_DRIVER(ms0515_state, screen_update_ms0515)
- MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE(*this, ms0515_state, screen_vblank))
- MCFG_SCREEN_PALETTE("palette")
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_raw( XTAL(15'000'000), 958,0,640, 313,0,200 );
+ screen.set_screen_update(FUNC(ms0515_state::screen_update_ms0515));
+ screen.screen_vblank().set(FUNC(ms0515_state::screen_vblank));
+ screen.set_palette("palette");
config.set_default_layout(layout_ms0515);
PALETTE(config, "palette", FUNC(ms0515_state::ms0515_palette), 16);
KR1818VG93(config, m_fdc, 1000000);
- MCFG_FLOPPY_DRIVE_ADD("vg93:0", ms0515_floppies, "525qd", ms0515_state::floppy_formats)
- MCFG_FLOPPY_DRIVE_SOUND(true)
- MCFG_FLOPPY_DRIVE_ADD("vg93:1", ms0515_floppies, "525qd", ms0515_state::floppy_formats)
- MCFG_FLOPPY_DRIVE_SOUND(true)
+ FLOPPY_CONNECTOR(config, "vg93:0", ms0515_floppies, "525qd", ms0515_state::floppy_formats).enable_sound(true);
+ FLOPPY_CONNECTOR(config, "vg93:1", ms0515_floppies, "525qd", ms0515_state::floppy_formats).enable_sound(true);
i8255_device &ppi(I8255(config, "ppi8255_1"));
ppi.out_pa_callback().set(FUNC(ms0515_state::ms0515_porta_w));
@@ -561,8 +560,8 @@ MACHINE_CONFIG_START(ms0515_state::ms0515)
m_rs232->cts_handler().set(m_i8251line, FUNC(i8251_device::write_cts));
m_rs232->dsr_handler().set(m_i8251line, FUNC(i8251_device::write_dsr));
-// MCFG_DEVICE_ADD("line_clock", CLOCK, 4800*16) // 8251 is set to /16 on the clock input
-// MCFG_CLOCK_SIGNAL_HANDLER(WRITELINE(*this, ms0515_state, write_line_clock))
+// clock_device &line_clock(CLOCK(config, "line_clock", 4800*16)); // 8251 is set to /16 on the clock input
+// line_clock.signal_handler().set(FUNC(ms0515_state::write_line_clock));
// serial connection to MS7004 keyboard
I8251(config, m_i8251kbd, 0);
@@ -574,8 +573,8 @@ MACHINE_CONFIG_START(ms0515_state::ms0515)
m_ms7004->rts_handler().set(m_i8251kbd, FUNC(i8251_device::write_cts));
// baud rate is supposed to be 4800 but keyboard is slightly faster
- MCFG_DEVICE_ADD("keyboard_clock", CLOCK, 4960*16)
- MCFG_CLOCK_SIGNAL_HANDLER(WRITELINE(*this, ms0515_state, write_keyboard_clock))
+ clock_device &keyboard_clock(CLOCK(config, "keyboard_clock", 4960*16));
+ keyboard_clock.signal_handler().set(FUNC(ms0515_state::write_keyboard_clock));
PIT8253(config, m_pit8253, 0);
m_pit8253->set_clk<0>(XTAL(2'000'000));
@@ -590,7 +589,7 @@ MACHINE_CONFIG_START(ms0515_state::ms0515)
/* internal ram */
RAM(config, RAM_TAG).set_default_size("128K");
-MACHINE_CONFIG_END
+}
/* ROM definition */
ROM_START( ms0515 )
diff --git a/src/mame/drivers/ms32.cpp b/src/mame/drivers/ms32.cpp
index 582a0457c85..431ee15cae4 100644
--- a/src/mame/drivers/ms32.cpp
+++ b/src/mame/drivers/ms32.cpp
@@ -1700,31 +1700,31 @@ void ms32_state::machine_reset()
/********** MACHINE DRIVER **********/
-MACHINE_CONFIG_START(ms32_state::ms32)
-
+void ms32_state::ms32(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", V70, 20000000) // D70632GD-20 20MHz
- MCFG_DEVICE_PROGRAM_MAP(ms32_map)
- MCFG_DEVICE_IRQ_ACKNOWLEDGE_DRIVER(ms32_state,irq_callback)
+ V70(config, m_maincpu, 20000000); // D70632GD-20 20MHz
+ m_maincpu->set_addrmap(AS_PROGRAM, &ms32_state::ms32_map);
+ m_maincpu->set_irq_acknowledge_callback(FUNC(ms32_state::irq_callback));
- MCFG_TIMER_DRIVER_ADD_SCANLINE("scantimer", ms32_state, ms32_interrupt, "screen", 0, 1)
+ TIMER(config, "scantimer").configure_scanline(FUNC(ms32_state::ms32_interrupt), "screen", 0, 1);
- MCFG_DEVICE_ADD("audiocpu", Z80, 8000000) // Z0840008PSC, Clock from notes
- MCFG_DEVICE_PROGRAM_MAP(ms32_sound_map)
+ Z80(config, m_audiocpu, 8000000); // Z0840008PSC, Clock from notes
+ m_audiocpu->set_addrmap(AS_PROGRAM, &ms32_state::ms32_sound_map);
- MCFG_QUANTUM_TIME(attotime::from_hz(60000))
+ config.m_minimum_quantum = attotime::from_hz(60000);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(40*8, 28*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 40*8-1, 0*8, 28*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(ms32_state, screen_update_ms32)
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_refresh_hz(60);
+ m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ m_screen->set_size(40*8, 28*8);
+ m_screen->set_visarea(0*8, 40*8-1, 0*8, 28*8-1);
+ m_screen->set_screen_update(FUNC(ms32_state::screen_update_ms32));
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_ms32)
- MCFG_PALETTE_ADD("palette", 0x10000)
+ GFXDECODE(config, m_gfxdecode, m_palette, gfx_ms32);
+ PALETTE(config, m_palette).set_entries(0x10000);
/* sound hardware */
@@ -1734,24 +1734,23 @@ MACHINE_CONFIG_START(ms32_state::ms32)
GENERIC_LATCH_8(config, m_soundlatch);
m_soundlatch->data_pending_callback().set_inputline(m_audiocpu, INPUT_LINE_NMI);
- MCFG_DEVICE_ADD("ymf", YMF271, 16934400)
- MCFG_SOUND_ROUTE(0, "lspeaker", 1.0)
- MCFG_SOUND_ROUTE(1, "rspeaker", 1.0)
-// MCFG_SOUND_ROUTE(2, "lspeaker", 1.0) Output 2/3 not used?
-// MCFG_SOUND_ROUTE(3, "rspeaker", 1.0)
-
-MACHINE_CONFIG_END
+ ymf271_device &ymf(YMF271(config, "ymf", 16934400));
+ ymf.add_route(0, "lspeaker", 1.0);
+ ymf.add_route(1, "rspeaker", 1.0);
+// ymf.add_route(2, "lspeaker", 1.0); Output 2/3 not used?
+// ymf.add_route(3, "rspeaker", 1.0);
+}
-MACHINE_CONFIG_START(ms32_state::f1superb)
+void ms32_state::f1superb(machine_config &config)
+{
ms32(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(f1superb_map)
+ m_maincpu->set_addrmap(AS_PROGRAM, &ms32_state::f1superb_map);
- MCFG_GFXDECODE_MODIFY("gfxdecode", gfx_f1superb)
+ m_gfxdecode->set_info(gfx_f1superb);
MCFG_VIDEO_START_OVERRIDE(ms32_state,f1superb)
-MACHINE_CONFIG_END
+}
diff --git a/src/mame/drivers/msbc1.cpp b/src/mame/drivers/msbc1.cpp
index f11756b0bd9..5ceecb1e4c2 100644
--- a/src/mame/drivers/msbc1.cpp
+++ b/src/mame/drivers/msbc1.cpp
@@ -94,11 +94,12 @@ void msbc1_state::machine_reset()
m_maincpu->reset();
}
-MACHINE_CONFIG_START(msbc1_state::msbc1)
+void msbc1_state::msbc1(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD(MC68000R12_TAG, M68000, XTAL(12'500'000))
- MCFG_DEVICE_PROGRAM_MAP(msbc1_mem)
-MACHINE_CONFIG_END
+ M68000(config, m_maincpu, XTAL(12'500'000));
+ m_maincpu->set_addrmap(AS_PROGRAM, &msbc1_state::msbc1_mem);
+}
/* ROM definition */
ROM_START( msbc1 )
diff --git a/src/mame/drivers/mstation.cpp b/src/mame/drivers/mstation.cpp
index 767fcbcc163..4dce16f278e 100644
--- a/src/mame/drivers/mstation.cpp
+++ b/src/mame/drivers/mstation.cpp
@@ -446,20 +446,21 @@ void mstation_state::mstation_palette(palette_device &palette) const
}
-MACHINE_CONFIG_START(mstation_state::mstation)
+void mstation_state::mstation(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu",Z80, XTAL(4'000'000)) //unknown clock
- MCFG_DEVICE_PROGRAM_MAP(mstation_mem)
- MCFG_DEVICE_IO_MAP(mstation_io)
+ Z80(config, m_maincpu, XTAL(4'000'000)); //unknown clock
+ m_maincpu->set_addrmap(AS_PROGRAM, &mstation_state::mstation_mem);
+ m_maincpu->set_addrmap(AS_IO, &mstation_state::mstation_io);
/* video hardware */
- MCFG_SCREEN_ADD("screen", LCD)
- MCFG_SCREEN_REFRESH_RATE(50)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */
- MCFG_SCREEN_UPDATE_DRIVER(mstation_state, screen_update)
- MCFG_SCREEN_SIZE(320, 128)
- MCFG_SCREEN_VISIBLE_AREA(0, 320-1, 0, 128-1)
- MCFG_SCREEN_PALETTE("palette")
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_LCD));
+ screen.set_refresh_hz(50);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */
+ screen.set_screen_update(FUNC(mstation_state::screen_update));
+ screen.set_size(320, 128);
+ screen.set_visarea(0, 320-1, 0, 128-1);
+ screen.set_palette("palette");
PALETTE(config, "palette", FUNC(mstation_state::mstation_palette), 2);
@@ -467,10 +468,10 @@ MACHINE_CONFIG_START(mstation_state::mstation)
SST_28SF040(config, "flash1");
// IRQ 4 is generated every second, used for auto power off
- MCFG_TIMER_DRIVER_ADD_PERIODIC("1hz_timer", mstation_state, mstation_1hz_timer, attotime::from_hz(1))
+ TIMER(config, "1hz_timer").configure_periodic(FUNC(mstation_state::mstation_1hz_timer), attotime::from_hz(1));
// IRQ 1 is used for scan the kb and for cursor blinking
- MCFG_TIMER_DRIVER_ADD_PERIODIC("kb_timer", mstation_state, mstation_kb_timer, attotime::from_hz(50))
+ TIMER(config, "kb_timer").configure_periodic(FUNC(mstation_state::mstation_kb_timer), attotime::from_hz(50));
rp5c01_device &rtc(RP5C01(config, "rtc", XTAL(32'768)));
rtc.out_alarm_callback().set(FUNC(mstation_state::rtc_irq));
@@ -480,7 +481,7 @@ MACHINE_CONFIG_START(mstation_state::mstation)
/* internal ram */
RAM(config, RAM_TAG).set_default_size("128K");
-MACHINE_CONFIG_END
+}
/* ROM definition */
ROM_START( mstation )
diff --git a/src/mame/drivers/msx.cpp b/src/mame/drivers/msx.cpp
index 16e3b689a7d..bdb05dc6efc 100644
--- a/src/mame/drivers/msx.cpp
+++ b/src/mame/drivers/msx.cpp
@@ -530,7 +530,6 @@ PCB Layouts missing
#include "includes/msx.h"
#include "formats/dsk_dsk.h"
#include "formats/dmk_dsk.h"
-#include "machine/input_merger.h"
#include "machine/msx_matsushita.h"
#include "machine/msx_s1985.h"
#include "machine/msx_systemflags.h"
@@ -557,8 +556,7 @@ void msx_state::msx_io_map(address_map &map)
map(0x91, 0x91).w("cent_data_out", FUNC(output_latch_device::bus_w));
map(0xa0, 0xa7).rw(m_ay8910, FUNC(ay8910_device::data_r), FUNC(ay8910_device::address_data_w));
map(0xa8, 0xab).rw("ppi8255", FUNC(i8255_device::read), FUNC(i8255_device::write));
- map(0x98, 0x98).rw("tms9928a", FUNC(tms9928a_device::vram_r), FUNC(tms9928a_device::vram_w));
- map(0x99, 0x99).rw("tms9928a", FUNC(tms9928a_device::register_r), FUNC(tms9928a_device::register_w));
+ map(0x98, 0x99).rw("tms9928a", FUNC(tms9928a_device::read), FUNC(tms9928a_device::write));
map(0xd8, 0xd9).rw(FUNC(msx_state::msx_kanji_r), FUNC(msx_state::msx_kanji_w));
// 0xfc - 0xff : Memory mapper I/O ports. I/O handlers will be installed if a memory mapper is present in a system
}
@@ -1238,36 +1236,42 @@ WRITE_LINE_MEMBER(msx2_state::turbo_w)
#define MSX_VISIBLE_YBORDER_PIXELS 24
-MACHINE_CONFIG_START(msx_state::msx1_cartlist)
- MCFG_SOFTWARE_LIST_ADD("cart_list", "msx1_cart")
-MACHINE_CONFIG_END
+void msx_state::msx1_cartlist(machine_config &config)
+{
+ SOFTWARE_LIST(config, "cart_list").set_original("msx1_cart");
+}
-MACHINE_CONFIG_START(msx_state::msx1_floplist)
- MCFG_SOFTWARE_LIST_ADD("flop_list", "msx1_flop")
-MACHINE_CONFIG_END
+void msx_state::msx1_floplist(machine_config &config)
+{
+ SOFTWARE_LIST(config, "flop_list").set_original("msx1_flop");
+}
-MACHINE_CONFIG_START(msx2_state::msx2_cartlist)
- MCFG_SOFTWARE_LIST_ADD("cart_list", "msx2_cart")
- MCFG_SOFTWARE_LIST_COMPATIBLE_ADD("msx1_crt_l", "msx1_cart")
-MACHINE_CONFIG_END
+void msx2_state::msx2_cartlist(machine_config &config)
+{
+ SOFTWARE_LIST(config, "cart_list").set_original("msx2_cart");
+ SOFTWARE_LIST(config, "msx1_crt_l").set_compatible("msx1_cart");
+}
-MACHINE_CONFIG_START(msx2_state::msx2_floplist)
- MCFG_SOFTWARE_LIST_ADD("flop_list", "msx2_flop")
- MCFG_SOFTWARE_LIST_COMPATIBLE_ADD("msx1_flp_l", "msx1_flop")
-MACHINE_CONFIG_END
+void msx2_state::msx2_floplist(machine_config &config)
+{
+ SOFTWARE_LIST(config, "flop_list").set_original("msx2_flop");
+ SOFTWARE_LIST(config, "msx1_flp_l").set_compatible("msx1_flop");
+}
-MACHINE_CONFIG_START(msx2_state::msx2p_floplist)
- MCFG_SOFTWARE_LIST_ADD("flop_list", "msx2p_flop")
- MCFG_SOFTWARE_LIST_COMPATIBLE_ADD("msx2_flp_l", "msx2_flop")
- MCFG_SOFTWARE_LIST_COMPATIBLE_ADD("msx1_flp_l", "msx1_flop") // maybe not?
-MACHINE_CONFIG_END
+void msx2_state::msx2p_floplist(machine_config &config)
+{
+ SOFTWARE_LIST(config, "flop_list").set_original("msx2p_flop");
+ SOFTWARE_LIST(config, "msx2_flp_l").set_compatible("msx2_flop");
+ SOFTWARE_LIST(config, "msx1_flp_l").set_compatible("msx1_flop"); // maybe not?
+}
-MACHINE_CONFIG_START(msx2_state::msxr_floplist)
- MCFG_SOFTWARE_LIST_ADD("flop_list", "msxr_flop")
- MCFG_SOFTWARE_LIST_COMPATIBLE_ADD("msx2p_flp_l", "msx2p_flop")
- MCFG_SOFTWARE_LIST_COMPATIBLE_ADD("msx2_flp_l", "msx2_flop") // maybe not?
- MCFG_SOFTWARE_LIST_COMPATIBLE_ADD("msx1_flp_l", "msx1_flop") // maybe not?
-MACHINE_CONFIG_END
+void msx2_state::msxr_floplist(machine_config &config)
+{
+ SOFTWARE_LIST(config, "flop_list").set_original("msxr_flop");
+ SOFTWARE_LIST(config, "msx2p_flp_l").set_compatible("msx2p_flop");
+ SOFTWARE_LIST(config, "msx2_flp_l").set_compatible("msx2_flop"); // maybe not?
+ SOFTWARE_LIST(config, "msx1_flp_l").set_compatible("msx1_flop"); // maybe not?
+}
FLOPPY_FORMATS_MEMBER( msx_state::floppy_formats )
FLOPPY_MSX_FORMAT,
@@ -1320,36 +1324,40 @@ void msx_state::msx_microsol(machine_config &config)
fdc.set_force_ready(true);
}
-MACHINE_CONFIG_START(msx_state::msx_1_35_ssdd_drive)
- MCFG_FLOPPY_DRIVE_ADD("fdc:0", msx_floppies, "35ssdd", msx_state::floppy_formats)
-MACHINE_CONFIG_END
+void msx_state::msx_1_35_ssdd_drive(machine_config &config)
+{
+ FLOPPY_CONNECTOR(config, "fdc:0", msx_floppies, "35ssdd", msx_state::floppy_formats);
+}
-MACHINE_CONFIG_START(msx_state::msx_1_35_dd_drive)
- MCFG_FLOPPY_DRIVE_ADD("fdc:0", msx_floppies, "35dd", msx_state::floppy_formats)
-MACHINE_CONFIG_END
+void msx_state::msx_1_35_dd_drive(machine_config &config)
+{
+ FLOPPY_CONNECTOR(config, "fdc:0", msx_floppies, "35dd", msx_state::floppy_formats);
+}
-MACHINE_CONFIG_START(msx_state::msx_2_35_dd_drive)
- MCFG_FLOPPY_DRIVE_ADD("fdc:0", msx_floppies, "35dd", msx_state::floppy_formats)
- MCFG_FLOPPY_DRIVE_ADD("fdc:1", msx_floppies, "35dd", msx_state::floppy_formats)
-MACHINE_CONFIG_END
+void msx_state::msx_2_35_dd_drive(machine_config &config)
+{
+ FLOPPY_CONNECTOR(config, "fdc:0", msx_floppies, "35dd", msx_state::floppy_formats);
+ FLOPPY_CONNECTOR(config, "fdc:1", msx_floppies, "35dd", msx_state::floppy_formats);
+}
-MACHINE_CONFIG_START(msx2_state::msx_ym2413)
- MCFG_DEVICE_ADD("ym2413", YM2413, 21.477272_MHz_XTAL / 6)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 0.4)
-MACHINE_CONFIG_END
+void msx2_state::msx_ym2413(machine_config &config)
+{
+ YM2413(config, "ym2413", 21.477272_MHz_XTAL / 6).add_route(ALL_OUTPUTS, "speaker", 0.4);
+}
-MACHINE_CONFIG_START(msx2_state::msx2_64kb_vram)
- MCFG_DEVICE_MODIFY("v9938")
- downcast<v99x8_device &>(*device).set_vram_size(0x10000);
-MACHINE_CONFIG_END
+void msx2_state::msx2_64kb_vram(machine_config &config)
+{
+ m_v9938->set_vram_size(0x10000);
+}
-MACHINE_CONFIG_START(msx_state::msx)
+void msx_state::msx(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, 10.738635_MHz_XTAL / 3) /* 3.579545 MHz */
- MCFG_DEVICE_PROGRAM_MAP(msx_memory_map)
- MCFG_DEVICE_IO_MAP(msx_io_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", msx_state, msx_interrupt) /* Needed for mouse updates */
- MCFG_QUANTUM_TIME(attotime::from_hz(60))
+ Z80(config, m_maincpu, 10.738635_MHz_XTAL / 3); /* 3.579545 MHz */
+ m_maincpu->set_addrmap(AS_PROGRAM, &msx_state::msx_memory_map);
+ m_maincpu->set_addrmap(AS_IO, &msx_state::msx_io_map);
+ m_maincpu->set_vblank_int("screen", FUNC(msx_state::msx_interrupt)); /* Needed for mouse updates */
+ config.m_minimum_quantum = attotime::from_hz(60);
INPUT_MERGER_ANY_HIGH(config, "mainirq").output_handler().set_inputline("maincpu", INPUT_LINE_IRQ0);
@@ -1360,11 +1368,11 @@ MACHINE_CONFIG_START(msx_state::msx)
/* sound hardware */
SPEAKER(config, "speaker").front_center();
- MCFG_DEVICE_ADD("dac", DAC_1BIT, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 0.1)
- MCFG_DEVICE_ADD("vref", VOLTAGE_REGULATOR, 0) MCFG_VOLTAGE_REGULATOR_OUTPUT(5.0)
- MCFG_SOUND_ROUTE(0, "dac", 1.0, DAC_VREF_POS_INPUT)
+ DAC_1BIT(config, m_dac, 0).add_route(ALL_OUTPUTS, "speaker", 0.1);
+ voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref", 0));
+ vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT);
- WAVE(config, "wave", "cassette").add_route(ALL_OUTPUTS, "speaker", 0.25);
+ WAVE(config, "wave", m_cassette).add_route(ALL_OUTPUTS, "speaker", 0.25);
AY8910(config, m_ay8910, 10.738635_MHz_XTAL / 3 / 2);
m_ay8910->set_flags(AY8910_SINGLE_OUTPUT);
m_ay8910->port_a_read_callback().set(FUNC(msx_state::msx_psg_port_a_r));
@@ -1374,24 +1382,25 @@ MACHINE_CONFIG_START(msx_state::msx)
m_ay8910->add_route(ALL_OUTPUTS, "speaker", 0.3);
/* printer */
- MCFG_DEVICE_ADD("centronics", CENTRONICS, centronics_devices, "printer")
- MCFG_CENTRONICS_BUSY_HANDLER(WRITELINE("cent_status_in", input_buffer_device, write_bit1))
+ centronics_device &centronics(CENTRONICS(config, "centronics", centronics_devices, "printer"));
+ centronics.busy_handler().set("cent_status_in", FUNC(input_buffer_device::write_bit1));
- MCFG_CENTRONICS_OUTPUT_LATCH_ADD("cent_data_out", "centronics")
- MCFG_DEVICE_ADD("cent_status_in", INPUT_BUFFER, 0)
+ output_latch_device &cent_data_out(OUTPUT_LATCH(config, "cent_data_out"));
+ centronics.set_output_latch(cent_data_out);
+ INPUT_BUFFER(config, "cent_status_in");
- MCFG_DEVICE_ADD("cent_ctrl_out", OUTPUT_LATCH, 0)
- MCFG_OUTPUT_LATCH_BIT1_HANDLER(WRITELINE("centronics", centronics_device, write_strobe))
+ output_latch_device &cent_ctrl_out(OUTPUT_LATCH(config, "cent_ctrl_out"));
+ cent_ctrl_out.bit_handler<1>().set(centronics, FUNC(centronics_device::write_strobe));
/* cassette */
- MCFG_CASSETTE_ADD( "cassette" )
- MCFG_CASSETTE_FORMATS(fmsx_cassette_formats)
- MCFG_CASSETTE_DEFAULT_STATE(CASSETTE_PLAY)
- MCFG_CASSETTE_INTERFACE("msx_cass")
+ CASSETTE(config, m_cassette);
+ m_cassette->set_formats(fmsx_cassette_formats);
+ m_cassette->set_default_state(CASSETTE_PLAY);
+ m_cassette->set_interface("msx_cass");
/* Software lists */
- MCFG_SOFTWARE_LIST_ADD("cass_list","msx1_cass")
-MACHINE_CONFIG_END
+ SOFTWARE_LIST(config, "cass_list").set_original("msx1_cass");
+}
template<typename VDPType>
@@ -1407,12 +1416,13 @@ void msx_state::msx1(VDPType &vdp_type, machine_config &config)
}
-MACHINE_CONFIG_START(msx2_state::msx2)
+void msx2_state::msx2(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, 21.477272_MHz_XTAL / 6) /* 3.579545 MHz */
- MCFG_DEVICE_PROGRAM_MAP(msx_memory_map)
- MCFG_DEVICE_IO_MAP(msx2_io_map)
- MCFG_QUANTUM_TIME(attotime::from_hz(60))
+ Z80(config, m_maincpu, 21.477272_MHz_XTAL / 6); /* 3.579545 MHz */
+ m_maincpu->set_addrmap(AS_PROGRAM, &msx2_state::msx_memory_map);
+ m_maincpu->set_addrmap(AS_IO, &msx2_state::msx2_io_map);
+ config.m_minimum_quantum = attotime::from_hz(60);
INPUT_MERGER_ANY_HIGH(config, "mainirq").output_handler().set_inputline("maincpu", INPUT_LINE_IRQ0);
@@ -1430,11 +1440,11 @@ MACHINE_CONFIG_START(msx2_state::msx2)
/* sound hardware */
SPEAKER(config, "speaker").front_center();
- MCFG_DEVICE_ADD("dac", DAC_1BIT, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 0.1)
- MCFG_DEVICE_ADD("vref", VOLTAGE_REGULATOR, 0) MCFG_VOLTAGE_REGULATOR_OUTPUT(5.0)
- MCFG_SOUND_ROUTE(0, "dac", 1.0, DAC_VREF_POS_INPUT)
+ DAC_1BIT(config, m_dac, 0).add_route(ALL_OUTPUTS, "speaker", 0.1);
+ voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref", 0));
+ vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT);
- WAVE(config, "wave", "cassette").add_route(ALL_OUTPUTS, "speaker", 0.25);
+ WAVE(config, "wave", m_cassette).add_route(ALL_OUTPUTS, "speaker", 0.25);
AY8910(config, m_ay8910, 21.477272_MHz_XTAL / 6 / 2);
m_ay8910->set_flags(AY8910_SINGLE_OUTPUT);
m_ay8910->port_a_read_callback().set(FUNC(msx2_state::msx_psg_port_a_r));
@@ -1444,36 +1454,38 @@ MACHINE_CONFIG_START(msx2_state::msx2)
m_ay8910->add_route(ALL_OUTPUTS, "speaker", 0.3);
/* printer */
- MCFG_DEVICE_ADD("centronics", CENTRONICS, centronics_devices, "printer")
- MCFG_CENTRONICS_BUSY_HANDLER(WRITELINE("cent_status_in", input_buffer_device, write_bit1))
+ centronics_device &centronics(CENTRONICS(config, "centronics", centronics_devices, "printer"));
+ centronics.busy_handler().set("cent_status_in", FUNC(input_buffer_device::write_bit1));
- MCFG_CENTRONICS_OUTPUT_LATCH_ADD("cent_data_out", "centronics")
- MCFG_DEVICE_ADD("cent_status_in", INPUT_BUFFER, 0)
+ output_latch_device &cent_data_out(OUTPUT_LATCH(config, "cent_data_out"));
+ centronics.set_output_latch(cent_data_out);
+ INPUT_BUFFER(config, "cent_status_in");
- MCFG_DEVICE_ADD("cent_ctrl_out", OUTPUT_LATCH, 0)
- MCFG_OUTPUT_LATCH_BIT1_HANDLER(WRITELINE("centronics", centronics_device, write_strobe))
+ output_latch_device &cent_ctrl_out(OUTPUT_LATCH(config, "cent_ctrl_out"));
+ cent_ctrl_out.bit_handler<1>().set(centronics, FUNC(centronics_device::write_strobe));
/* cassette */
- MCFG_CASSETTE_ADD( "cassette" )
- MCFG_CASSETTE_FORMATS(fmsx_cassette_formats)
- MCFG_CASSETTE_DEFAULT_STATE(CASSETTE_PLAY)
- MCFG_CASSETTE_INTERFACE("msx_cass")
+ CASSETTE(config, m_cassette);
+ m_cassette->set_formats(fmsx_cassette_formats);
+ m_cassette->set_default_state(CASSETTE_PLAY);
+ m_cassette->set_interface("msx_cass");
/* real time clock */
RP5C01(config, m_rtc, 32.768_kHz_XTAL);
/* Software lists */
- MCFG_SOFTWARE_LIST_ADD("cass_list", "msx2_cass")
- MCFG_SOFTWARE_LIST_COMPATIBLE_ADD("msx1_cas_l", "msx1_cass")
-MACHINE_CONFIG_END
+ SOFTWARE_LIST(config, "cass_list").set_original("msx2_cass");
+ SOFTWARE_LIST(config, "msx1_cas_l").set_compatible("msx1_cass");
+}
-MACHINE_CONFIG_START(msx2_state::msx2p)
+void msx2_state::msx2p(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, 21.477272_MHz_XTAL / 6) /* 3.579545 MHz */
- MCFG_DEVICE_PROGRAM_MAP(msx_memory_map)
- MCFG_DEVICE_IO_MAP(msx2p_io_map)
- MCFG_QUANTUM_TIME(attotime::from_hz(60))
+ Z80(config, m_maincpu, 21.477272_MHz_XTAL / 6); /* 3.579545 MHz */
+ m_maincpu->set_addrmap(AS_PROGRAM, &msx2_state::msx_memory_map);
+ m_maincpu->set_addrmap(AS_IO, &msx2_state::msx2p_io_map);
+ config.m_minimum_quantum = attotime::from_hz(60);
INPUT_MERGER_ANY_HIGH(config, "mainirq").output_handler().set_inputline("maincpu", INPUT_LINE_IRQ0);
@@ -1491,11 +1503,11 @@ MACHINE_CONFIG_START(msx2_state::msx2p)
/* sound hardware */
SPEAKER(config, "speaker").front_center();
- MCFG_DEVICE_ADD("dac", DAC_1BIT, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 0.1)
- MCFG_DEVICE_ADD("vref", VOLTAGE_REGULATOR, 0) MCFG_VOLTAGE_REGULATOR_OUTPUT(5.0)
- MCFG_SOUND_ROUTE(0, "dac", 1.0, DAC_VREF_POS_INPUT)
+ DAC_1BIT(config, m_dac, 0).add_route(ALL_OUTPUTS, "speaker", 0.1);
+ voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref", 0));
+ vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT);
- WAVE(config, "wave", "cassette").add_route(ALL_OUTPUTS, "speaker", 0.25);
+ WAVE(config, "wave", m_cassette).add_route(ALL_OUTPUTS, "speaker", 0.25);
AY8910(config, m_ay8910, 21.477272_MHz_XTAL / 6 / 2);
m_ay8910->set_flags(AY8910_SINGLE_OUTPUT);
m_ay8910->port_a_read_callback().set(FUNC(msx2_state::msx_psg_port_a_r));
@@ -1505,28 +1517,29 @@ MACHINE_CONFIG_START(msx2_state::msx2p)
m_ay8910->add_route(ALL_OUTPUTS, "speaker", 0.3);
/* printer */
- MCFG_DEVICE_ADD("centronics", CENTRONICS, centronics_devices, "printer")
- MCFG_CENTRONICS_BUSY_HANDLER(WRITELINE("cent_status_in", input_buffer_device, write_bit1))
+ centronics_device &centronics(CENTRONICS(config, "centronics", centronics_devices, "printer"));
+ centronics.busy_handler().set("cent_status_in", FUNC(input_buffer_device::write_bit1));
- MCFG_CENTRONICS_OUTPUT_LATCH_ADD("cent_data_out", "centronics")
- MCFG_DEVICE_ADD("cent_status_in", INPUT_BUFFER, 0)
+ output_latch_device &cent_data_out(OUTPUT_LATCH(config, "cent_data_out"));
+ centronics.set_output_latch(cent_data_out);
+ INPUT_BUFFER(config, "cent_status_in");
- MCFG_DEVICE_ADD("cent_ctrl_out", OUTPUT_LATCH, 0)
- MCFG_OUTPUT_LATCH_BIT1_HANDLER(WRITELINE("centronics", centronics_device, write_strobe))
+ output_latch_device &cent_ctrl_out(OUTPUT_LATCH(config, "cent_ctrl_out"));
+ cent_ctrl_out.bit_handler<1>().set(centronics, FUNC(centronics_device::write_strobe));
/* cassette */
- MCFG_CASSETTE_ADD( "cassette" )
- MCFG_CASSETTE_FORMATS(fmsx_cassette_formats)
- MCFG_CASSETTE_DEFAULT_STATE(CASSETTE_PLAY)
- MCFG_CASSETTE_INTERFACE("msx_cass")
+ CASSETTE(config, m_cassette);
+ m_cassette->set_formats(fmsx_cassette_formats);
+ m_cassette->set_default_state(CASSETTE_PLAY);
+ m_cassette->set_interface("msx_cass");
/* real time clock */
RP5C01(config, m_rtc, 32.768_kHz_XTAL);
/* Software lists */
- MCFG_SOFTWARE_LIST_ADD("cass_list", "msx2_cass")
- MCFG_SOFTWARE_LIST_COMPATIBLE_ADD("msx1_cas_l", "msx1_cass")
-MACHINE_CONFIG_END
+ SOFTWARE_LIST(config, "cass_list").set_original("msx2_cass");
+ SOFTWARE_LIST(config, "msx1_cas_l").set_compatible("msx1_cass");
+ }
void msx2_state::msx2_pal(machine_config &config)
@@ -1552,20 +1565,21 @@ ROM_START(ax150)
ROM_LOAD ("ax150arab.rom", 0x8000, 0x8000, CRC(339cd1aa) SHA1(0287b2ec897b9196788cd9f10c99e1487d7adbbb))
ROM_END
-MACHINE_CONFIG_START(msx_state::ax150)
+void msx_state::ax150(machine_config &config)
+{
msx1(TMS9929A, config);
// AY8910/YM2149?
// FDC: None, 0 drives
// 2 Cartridge slots
- MCFG_MSX_LAYOUT_ROM("bios", 0, 0, 0, 2, "maincpu", 0x0000)
- MCFG_MSX_LAYOUT_ROM("arab", 1, 0, 1, 2, "maincpu", 0x8000)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot1", 2, 0)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot2", 3, 0)
- MCFG_MSX_LAYOUT_RAM("ram", 3, 2, 2, 2) /* 32KB RAM */
+ add_internal_slot(config, MSX_SLOT_ROM, "bios", 0, 0, 0, 2, "maincpu", 0x0000);
+ add_internal_slot(config, MSX_SLOT_ROM, "arab", 1, 0, 1, 2, "maincpu", 0x8000);
+ add_cartridge_slot<1>(config, MSX_SLOT_CARTRIDGE, "cartslot1", 2, 0, msx_cart, nullptr);
+ add_cartridge_slot<2>(config, MSX_SLOT_CARTRIDGE, "cartslot2", 3, 0, msx_cart, nullptr);
+ add_internal_slot(config, MSX_SLOT_RAM, "ram", 3, 2, 2, 2); /* 32KB RAM */
msx1_cartlist(config);
-MACHINE_CONFIG_END
+}
/* MSX - Al Alamiah AX-170 */
@@ -1576,21 +1590,22 @@ ROM_START (ax170)
ROM_END
-MACHINE_CONFIG_START(msx_state::ax170)
+void msx_state::ax170(machine_config &config)
+{
msx1(TMS9929A, config);
// AY8910/YM2149?
// FDC: None, 0 drives
// 2 Cartridge slots
// T7937 (in ax170mk2)
- MCFG_MSX_LAYOUT_ROM("bios", 0, 0, 0, 2, "maincpu", 0x0000)
- MCFG_MSX_LAYOUT_ROM("arab", 1, 0, 1, 2, "maincpu", 0x8000)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot1", 2, 0)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot2", 3, 0)
- MCFG_MSX_LAYOUT_RAM("ram", 3, 2, 0, 4) /* 64KB RAM */
+ add_internal_slot(config, MSX_SLOT_ROM, "bios", 0, 0, 0, 2, "maincpu", 0x0000);
+ add_internal_slot(config, MSX_SLOT_ROM, "arab", 1, 0, 1, 2, "maincpu", 0x8000);
+ add_cartridge_slot<1>(config, MSX_SLOT_CARTRIDGE, "cartslot1", 2, 0, msx_cart, nullptr);
+ add_cartridge_slot<2>(config, MSX_SLOT_CARTRIDGE, "cartslot2", 3, 0, msx_cart, nullptr);
+ add_internal_slot(config, MSX_SLOT_RAM, "ram", 3, 2, 0, 4); /* 64KB RAM */
msx1_cartlist(config);
-MACHINE_CONFIG_END
+}
/* MSX - Canon V-8 */
@@ -1599,20 +1614,20 @@ ROM_START (canonv8)
ROM_LOAD ("v8bios.rom", 0x0000, 0x8000, CRC(ee229390) SHA1(302afb5d8be26c758309ca3df611ae69cced2821))
ROM_END
-MACHINE_CONFIG_START(msx_state::canonv8)
+void msx_state::canonv8(machine_config &config)
+{
msx1(TMS9928A, config);
// AY8910/YM2149??
// FDC: None, 0 drives
// 2 Cartridge slots
- MCFG_MSX_LAYOUT_ROM("bios", 0, 0, 0, 2, "maincpu", 0x0000)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot1", 1, 0)
- MCFG_MSX_LAYOUT_RAM("ram", 2, 0, 3, 1) /* 8KB RAM */
- MCFG_MSX_SLOT_RAM_8KB
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot2", 3, 0)
+ add_internal_slot(config, MSX_SLOT_ROM, "bios", 0, 0, 0, 2, "maincpu", 0x0000);
+ add_cartridge_slot<1>(config, MSX_SLOT_CARTRIDGE, "cartslot1", 1, 0, msx_cart, nullptr);
+ add_internal_slot(config, MSX_SLOT_RAM, "ram", 2, 0, 3, 1).force_start_address(0xe000); /* 8KB RAM */
+ add_cartridge_slot<2>(config, MSX_SLOT_CARTRIDGE, "cartslot2", 3, 0, msx_cart, nullptr);
msx1_cartlist(config);
-MACHINE_CONFIG_END
+}
/* MSX - Canon V-10 */
@@ -1621,19 +1636,20 @@ ROM_START (canonv10)
ROM_LOAD ("v10bios.rom", 0x0000, 0x8000, CRC(e9ccd789) SHA1(8963fc041975f31dc2ab1019cfdd4967999de53e))
ROM_END
-MACHINE_CONFIG_START(msx_state::canonv10)
+void msx_state::canonv10(machine_config &config)
+{
msx1(TMS9929A, config);
// AY8910/YM2149?
// FDC: None, 0 drives
// 2 Cartridge slots
- MCFG_MSX_LAYOUT_ROM("bios", 0, 0, 0, 2, "maincpu", 0x0000)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot1", 1, 0)
- MCFG_MSX_LAYOUT_RAM("ram", 2, 0, 3, 1) /* 16KB RAM */
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot2", 3, 0)
+ add_internal_slot(config, MSX_SLOT_ROM, "bios", 0, 0, 0, 2, "maincpu", 0x0000);
+ add_cartridge_slot<1>(config, MSX_SLOT_CARTRIDGE, "cartslot1", 1, 0, msx_cart, nullptr);
+ add_internal_slot(config, MSX_SLOT_RAM, "ram", 2, 0, 3, 1); /* 16KB RAM */
+ add_cartridge_slot<2>(config, MSX_SLOT_CARTRIDGE, "cartslot2", 3, 0, msx_cart, nullptr);
msx1_cartlist(config);
-MACHINE_CONFIG_END
+}
/* MSX - Canon V-20 */
@@ -1642,19 +1658,20 @@ ROM_START (canonv20)
ROM_LOAD ("v20bios.rom", 0x0000, 0x8000, CRC(e9ccd789) SHA1(8963fc041975f31dc2ab1019cfdd4967999de53e))
ROM_END
-MACHINE_CONFIG_START(msx_state::canonv20)
+void msx_state::canonv20(machine_config &config)
+{
msx1(TMS9929A, config);
// YM2149
// FDC: None, 0 drives
// 2 Cartridge slots
- MCFG_MSX_LAYOUT_ROM("bios", 0, 0, 0, 2, "maincpu", 0x0000)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot1", 1, 0)
- MCFG_MSX_LAYOUT_RAM("ram", 2, 0, 0, 4) /* 64KB RAM */
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot2", 3, 0)
+ add_internal_slot(config, MSX_SLOT_ROM, "bios", 0, 0, 0, 2, "maincpu", 0x0000);
+ add_cartridge_slot<1>(config, MSX_SLOT_CARTRIDGE, "cartslot1", 1, 0, msx_cart, nullptr);
+ add_internal_slot(config, MSX_SLOT_RAM, "ram", 2, 0, 0, 4); /* 64KB RAM */
+ add_cartridge_slot<2>(config, MSX_SLOT_CARTRIDGE, "cartslot2", 3, 0, msx_cart, nullptr);
msx1_cartlist(config);
-MACHINE_CONFIG_END
+}
/* MSX - Canon V-20E */
@@ -1691,19 +1708,20 @@ ROM_START (mx10)
ROM_LOAD( "mx10bios.rom", 0x0000, 0x8000, CRC(ee229390) SHA1(302afb5d8be26c758309ca3df611ae69cced2821))
ROM_END
-MACHINE_CONFIG_START(msx_state::mx10)
+void msx_state::mx10(machine_config &config)
+{
msx1(TMS9918, config);
// FDC: None, 0 drives
// 2? Cartridge slots
// Z80: uPD780C-1
- MCFG_MSX_LAYOUT_ROM("bios", 0, 0, 0, 2, "maincpu", 0x0000)
- MCFG_MSX_LAYOUT_RAM("ram", 0, 0, 3, 1) // 16KB RAM
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot1", 1, 0)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot2", 2, 0)
+ add_internal_slot(config, MSX_SLOT_ROM, "bios", 0, 0, 0, 2, "maincpu", 0x0000);
+ add_internal_slot(config, MSX_SLOT_RAM, "ram", 0, 0, 3, 1); // 16KB RAM
+ add_cartridge_slot<1>(config, MSX_SLOT_CARTRIDGE, "cartslot1", 1, 0, msx_cart, nullptr);
+ add_cartridge_slot<2>(config, MSX_SLOT_CARTRIDGE, "cartslot2", 2, 0, msx_cart, nullptr);
msx1_cartlist(config);
-MACHINE_CONFIG_END
+}
/* MSX - Casio MX-15 */
@@ -1712,20 +1730,21 @@ ROM_START (mx15)
ROM_LOAD( "mx15bios.rom", 0x0000, 0x8000, CRC(ee229390) SHA1(302afb5d8be26c758309ca3df611ae69cced2821))
ROM_END
-MACHINE_CONFIG_START(msx_state::mx15)
+void msx_state::mx15(machine_config &config)
+{
msx1(TMS9928A, config);
// FDC: None, 0 drives
// 3 Cartridge slots
// T6950
- MCFG_MSX_LAYOUT_ROM("bios", 0, 0, 0, 2, "maincpu", 0x0000)
- MCFG_MSX_LAYOUT_RAM("ram", 0, 0, 3, 1) // 16KB RAM
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot1", 1, 0)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot2", 2, 0)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot3", 3, 0)
+ add_internal_slot(config, MSX_SLOT_ROM, "bios", 0, 0, 0, 2, "maincpu", 0x0000);
+ add_internal_slot(config, MSX_SLOT_RAM, "ram", 0, 0, 3, 1); // 16KB RAM
+ add_cartridge_slot<1>(config, MSX_SLOT_CARTRIDGE, "cartslot1", 1, 0, msx_cart, nullptr);
+ add_cartridge_slot<2>(config, MSX_SLOT_CARTRIDGE, "cartslot2", 2, 0, msx_cart, nullptr);
+ add_cartridge_slot<3>(config, MSX_SLOT_CARTRIDGE, "cartslot3", 3, 0, msx_cart, nullptr);
msx1_cartlist(config);
-MACHINE_CONFIG_END
+}
/* MSX - Casio MX-101 */
@@ -1734,18 +1753,19 @@ ROM_START (mx101)
ROM_LOAD( "mx101bios.rom", 0x0000, 0x8000, CRC(ee229390) SHA1(302afb5d8be26c758309ca3df611ae69cced2821))
ROM_END
-MACHINE_CONFIG_START(msx_state::mx101)
+void msx_state::mx101(machine_config &config)
+{
msx1(TMS9928A, config);
// FDC: None, 0 drives
// 2? Cartridge slots
- MCFG_MSX_LAYOUT_ROM("bios", 0, 0, 0, 2, "maincpu", 0x0000)
- MCFG_MSX_LAYOUT_RAM("ram", 0, 0, 3, 1) // 16KB RAM
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot1", 1, 0)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot2", 2, 0)
+ add_internal_slot(config, MSX_SLOT_ROM, "bios", 0, 0, 0, 2, "maincpu", 0x0000);
+ add_internal_slot(config, MSX_SLOT_RAM, "ram", 0, 0, 3, 1); // 16KB RAM
+ add_cartridge_slot<1>(config, MSX_SLOT_CARTRIDGE, "cartslot1", 1, 0, msx_cart, nullptr);
+ add_cartridge_slot<2>(config, MSX_SLOT_CARTRIDGE, "cartslot2", 2, 0, msx_cart, nullptr);
msx1_cartlist(config);
-MACHINE_CONFIG_END
+}
/* MSX - Casio PV-7 */
@@ -1754,7 +1774,8 @@ ROM_START (pv7)
ROM_LOAD("pv7bios.rom", 0x0000, 0x8000, CRC(ee229390) SHA1(302afb5d8be26c758309ca3df611ae69cced2821))
ROM_END
-MACHINE_CONFIG_START(msx_state::pv7)
+void msx_state::pv7(machine_config &config)
+{
msx1(TMS9918, config);
// AY8910?
// FDC: None, 0 drives
@@ -1764,14 +1785,13 @@ MACHINE_CONFIG_START(msx_state::pv7)
// No printer port
// Z80: uPD780C-1
- MCFG_MSX_LAYOUT_ROM("bios", 0, 0, 0, 2, "maincpu", 0x0000)
- MCFG_MSX_LAYOUT_RAM("ram", 0, 0, 3, 1) /* 8KB RAM */
- MCFG_MSX_SLOT_RAM_8KB
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot1", 1, 0)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot2", 2, 0)
+ add_internal_slot(config, MSX_SLOT_ROM, "bios", 0, 0, 0, 2, "maincpu", 0x0000);
+ add_internal_slot(config, MSX_SLOT_RAM, "ram", 0, 0, 3, 1).force_start_address(0xe000); /* 8KB RAM */
+ add_cartridge_slot<1>(config, MSX_SLOT_CARTRIDGE, "cartslot1", 1, 0, msx_cart, nullptr);
+ add_cartridge_slot<2>(config, MSX_SLOT_CARTRIDGE, "cartslot2", 2, 0, msx_cart, nullptr);
msx1_cartlist(config);
-MACHINE_CONFIG_END
+}
/* MSX - Casio PV-16 */
@@ -1780,19 +1800,20 @@ ROM_START (pv16)
ROM_LOAD("pv16.rom", 0x0000, 0x8000, CRC(ee229390) SHA1(302afb5d8be26c758309ca3df611ae69cced2821))
ROM_END
-MACHINE_CONFIG_START(msx_state::pv16)
+void msx_state::pv16(machine_config &config)
+{
msx1(TMS9918, config);
// AY8910
// FDC: None, 0 drives
// 1 Cartridge slot
// No printer port
- MCFG_MSX_LAYOUT_ROM("bios", 0, 0, 0, 2, "maincpu", 0x0000)
- MCFG_MSX_LAYOUT_RAM("ram", 0, 0, 3, 1) /* 16KB RAM */
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot1", 1, 0)
+ add_internal_slot(config, MSX_SLOT_ROM, "bios", 0, 0, 0, 2, "maincpu", 0x0000);
+ add_internal_slot(config, MSX_SLOT_RAM, "ram", 0, 0, 3, 1); /* 16KB RAM */
+ add_cartridge_slot<1>(config, MSX_SLOT_CARTRIDGE, "cartslot1", 1, 0, msx_cart, nullptr);
msx1_cartlist(config);
-MACHINE_CONFIG_END
+}
/* MSX - Daewoo CPC-88 */
@@ -1803,20 +1824,21 @@ ROM_START (cpc88)
ROM_RELOAD (0xa000, 0x2000)
ROM_END
-MACHINE_CONFIG_START(msx_state::cpc88)
+void msx_state::cpc88(machine_config &config)
+{
msx1(TMS9928A, config);
// AY8910/YM2149?
// FDC: None, 0 drives
// 2? Cartridge slots
- MCFG_MSX_LAYOUT_ROM("bios", 0, 0, 0, 2, "maincpu", 0x0000)
- MCFG_MSX_LAYOUT_ROM("han", 0, 0, 2, 1, "maincpu", 0x8000)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot1", 1, 0)
- MCFG_MSX_LAYOUT_RAM("ram", 2, 0, 0, 4) /* 64KB RAM */
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot2", 3, 0)
+ add_internal_slot(config, MSX_SLOT_ROM, "bios", 0, 0, 0, 2, "maincpu", 0x0000);
+ add_internal_slot(config, MSX_SLOT_ROM, "han", 0, 0, 2, 1, "maincpu", 0x8000);
+ add_cartridge_slot<1>(config, MSX_SLOT_CARTRIDGE, "cartslot1", 1, 0, msx_cart, nullptr);
+ add_internal_slot(config, MSX_SLOT_RAM, "ram", 2, 0, 0, 4); /* 64KB RAM */
+ add_cartridge_slot<2>(config, MSX_SLOT_CARTRIDGE, "cartslot2", 3, 0, msx_cart, nullptr);
msx1_cartlist(config);
-MACHINE_CONFIG_END
+}
/* MSX - Daewoo DPC-100 */
@@ -1826,20 +1848,21 @@ ROM_START (dpc100)
ROM_LOAD ("100han.rom", 0x8000, 0x4000, CRC(97478efb) SHA1(4421fa2504cbce18f7c84b5ea97f04e017007f07))
ROM_END
-MACHINE_CONFIG_START(msx_state::dpc100)
+void msx_state::dpc100(machine_config &config)
+{
msx1(TMS9928A, config);
// AY8910/YM2149?
// FDC: None, 0 drives
// 2 Cartridge slots
- MCFG_MSX_LAYOUT_ROM("bios", 0, 0, 0, 2, "maincpu", 0x0000)
- MCFG_MSX_LAYOUT_ROM("han", 0, 0, 2, 1, "maincpu", 0x8000)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot1", 1, 0)
- MCFG_MSX_LAYOUT_RAM("ram", 2, 0, 3, 1) /* 16KB RAM */
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot2", 3, 0)
+ add_internal_slot(config, MSX_SLOT_ROM, "bios", 0, 0, 0, 2, "maincpu", 0x0000);
+ add_internal_slot(config, MSX_SLOT_ROM, "han", 0, 0, 2, 1, "maincpu", 0x8000);
+ add_cartridge_slot<1>(config, MSX_SLOT_CARTRIDGE, "cartslot1", 1, 0, msx_cart, nullptr);
+ add_internal_slot(config, MSX_SLOT_RAM, "ram", 2, 0, 3, 1); /* 16KB RAM */
+ add_cartridge_slot<2>(config, MSX_SLOT_CARTRIDGE, "cartslot2", 3, 0, msx_cart, nullptr);
msx1_cartlist(config);
-MACHINE_CONFIG_END
+}
/* MSX - Daewoo DPC-180 */
@@ -1849,20 +1872,21 @@ ROM_START (dpc180)
ROM_LOAD ("180han.rom", 0x8000, 0x4000, CRC(97478efb) SHA1(4421fa2504cbce18f7c84b5ea97f04e017007f07))
ROM_END
-MACHINE_CONFIG_START(msx_state::dpc180)
+void msx_state::dpc180(machine_config &config)
+{
msx1(TMS9928A, config);
// AY8910/YM2149?
// FDC: None, 0 drives
// 2 Cartridge slots
- MCFG_MSX_LAYOUT_ROM("bios", 0, 0, 0, 2, "maincpu", 0x0000)
- MCFG_MSX_LAYOUT_ROM("han", 0, 0, 2, 1, "maincpu", 0x8000)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot1", 1, 0)
- MCFG_MSX_LAYOUT_RAM("ram", 2, 0, 2, 2) /* 32KB RAM */
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot2", 3, 0)
+ add_internal_slot(config, MSX_SLOT_ROM, "bios", 0, 0, 0, 2, "maincpu", 0x0000);
+ add_internal_slot(config, MSX_SLOT_ROM, "han", 0, 0, 2, 1, "maincpu", 0x8000);
+ add_cartridge_slot<1>(config, MSX_SLOT_CARTRIDGE, "cartslot1", 1, 0, msx_cart, nullptr);
+ add_internal_slot(config, MSX_SLOT_RAM, "ram", 2, 0, 2, 2); /* 32KB RAM */
+ add_cartridge_slot<2>(config, MSX_SLOT_CARTRIDGE, "cartslot2", 3, 0, msx_cart, nullptr);
msx1_cartlist(config);
-MACHINE_CONFIG_END
+}
/* MSX - Daewoo DPC-200 */
@@ -1872,20 +1896,21 @@ ROM_START (dpc200)
ROM_LOAD ("200han.rom", 0x8000, 0x4000, CRC(97478efb) SHA1(4421fa2504cbce18f7c84b5ea97f04e017007f07))
ROM_END
-MACHINE_CONFIG_START(msx_state::dpc200)
+void msx_state::dpc200(machine_config &config)
+{
msx1(TMS9928A, config);
// AY8910/YM2149?
// FDC: None, 0 drives
// 2 Cartridge slots
- MCFG_MSX_LAYOUT_ROM("bios", 0, 0, 0, 2, "maincpu", 0x0000)
- MCFG_MSX_LAYOUT_ROM("han", 0, 0, 2, 1, "maincpu", 0x8000)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot1", 1, 0)
- MCFG_MSX_LAYOUT_RAM("ram", 2, 0, 0, 4) /* 64KB RAM */
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot2", 3, 0)
+ add_internal_slot(config, MSX_SLOT_ROM, "bios", 0, 0, 0, 2, "maincpu", 0x0000);
+ add_internal_slot(config, MSX_SLOT_ROM, "han", 0, 0, 2, 1, "maincpu", 0x8000);
+ add_cartridge_slot<1>(config, MSX_SLOT_CARTRIDGE, "cartslot1", 1, 0, msx_cart, nullptr);
+ add_internal_slot(config, MSX_SLOT_RAM, "ram", 2, 0, 0, 4); /* 64KB RAM */
+ add_cartridge_slot<2>(config, MSX_SLOT_CARTRIDGE, "cartslot2", 3, 0, msx_cart, nullptr);
msx1_cartlist(config);
-MACHINE_CONFIG_END
+}
/* MSX - Daewoo DPC-200E */
@@ -1894,19 +1919,20 @@ ROM_START (dpc200e)
ROM_LOAD ("dpc200ebios.rom", 0x0000, 0x8000, CRC(8205795e) SHA1(829c00c3114f25b3dae5157c0a238b52a3ac37db))
ROM_END
-MACHINE_CONFIG_START(msx_state::dpc200e)
+void msx_state::dpc200e(machine_config &config)
+{
msx1(TMS9929A, config);
// AY8910
// FDC: None, 0 drives
// 2 Cartridge slots
- MCFG_MSX_LAYOUT_ROM("bios", 0, 0, 0, 2, "maincpu", 0x0000)
- MCFG_MSX_LAYOUT_RAM("ram", 1, 0, 0, 4) /* 64KB RAM */
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot1", 2, 0)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot2", 3, 0)
+ add_internal_slot(config, MSX_SLOT_ROM, "bios", 0, 0, 0, 2, "maincpu", 0x0000);
+ add_internal_slot(config, MSX_SLOT_RAM, "ram", 1, 0, 0, 4); /* 64KB RAM */
+ add_cartridge_slot<1>(config, MSX_SLOT_CARTRIDGE, "cartslot1", 2, 0, msx_cart, nullptr);
+ add_cartridge_slot<2>(config, MSX_SLOT_CARTRIDGE, "cartslot2", 3, 0, msx_cart, nullptr);
msx1_cartlist(config);
-MACHINE_CONFIG_END
+}
/* MSX - Daewoo Zemmix CPC-50A */
@@ -1915,7 +1941,8 @@ ROM_START (cpc50a)
ROM_LOAD ("50abios.rom", 0x0000, 0x8000, CRC(c3a868ef) SHA1(a08a940aa87313509e00bc5ac7494d53d8e03492))
ROM_END
-MACHINE_CONFIG_START(msx_state::cpc50a)
+void msx_state::cpc50a(machine_config &config)
+{
msx1(TMS9918, config);
// AY8910/YM2149?
// FDC: None, 0 drives
@@ -1924,13 +1951,12 @@ MACHINE_CONFIG_START(msx_state::cpc50a)
// No cassette port?
// No printer port?
- MCFG_MSX_LAYOUT_ROM("bios", 0, 0, 0, 2, "maincpu", 0x0000)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot1", 1, 0)
- MCFG_MSX_LAYOUT_RAM("ram", 2, 0, 3, 1) /* 8KB RAM */
- MCFG_MSX_SLOT_RAM_8KB
+ add_internal_slot(config, MSX_SLOT_ROM, "bios", 0, 0, 0, 2, "maincpu", 0x0000);
+ add_cartridge_slot<1>(config, MSX_SLOT_CARTRIDGE, "cartslot1", 1, 0, msx_cart, nullptr);
+ add_internal_slot(config, MSX_SLOT_RAM, "ram", 2, 0, 3, 1).force_start_address(0xe000); /* 8KB RAM */
msx1_cartlist(config);
-MACHINE_CONFIG_END
+}
/* MSX - Daewoo Zemmix CPC-50B */
@@ -1939,7 +1965,8 @@ ROM_START (cpc50b)
ROM_LOAD ("50bbios.rom", 0x0000, 0x8000, CRC(c3a868ef) SHA1(a08a940aa87313509e00bc5ac7494d53d8e03492))
ROM_END
-MACHINE_CONFIG_START(msx_state::cpc50b)
+void msx_state::cpc50b(machine_config &config)
+{
msx1(TMS9918, config);
// AY8910/YM2149?
// FDC: None, 0 drives
@@ -1948,12 +1975,12 @@ MACHINE_CONFIG_START(msx_state::cpc50b)
// No cassette port?
// No printer port?
- MCFG_MSX_LAYOUT_ROM("bios", 0, 0, 0, 2, "maincpu", 0x0000)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot1", 1, 0)
- MCFG_MSX_LAYOUT_RAM("ram", 2, 0, 3, 1) /* 16KB RAM */
+ add_internal_slot(config, MSX_SLOT_ROM, "bios", 0, 0, 0, 2, "maincpu", 0x0000);
+ add_cartridge_slot<1>(config, MSX_SLOT_CARTRIDGE, "cartslot1", 1, 0, msx_cart, nullptr);
+ add_internal_slot(config, MSX_SLOT_RAM, "ram", 2, 0, 3, 1); /* 16KB RAM */
msx1_cartlist(config);
-MACHINE_CONFIG_END
+}
/* MSX - Daewoo Zemmix CPC-51 */
@@ -1962,7 +1989,8 @@ ROM_START (cpc51)
ROM_LOAD ("51bios.rom", 0x0000, 0x8000, CRC(c3a868ef) SHA1(a08a940aa87313509e00bc5ac7494d53d8e03492))
ROM_END
-MACHINE_CONFIG_START(msx_state::cpc51)
+void msx_state::cpc51(machine_config &config)
+{
msx1(TMS9918, config);
// AY8910/YM2149?
// FDC: None, 0 drives
@@ -1971,12 +1999,12 @@ MACHINE_CONFIG_START(msx_state::cpc51)
// No cassette port
// No printer port
- MCFG_MSX_LAYOUT_ROM("bios", 0, 0, 0, 2, "maincpu", 0x0000)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot1", 1, 0)
- MCFG_MSX_LAYOUT_RAM("ram", 2, 0, 0, 4) /* 64KB RAM */
+ add_internal_slot(config, MSX_SLOT_ROM, "bios", 0, 0, 0, 2, "maincpu", 0x0000);
+ add_cartridge_slot<1>(config, MSX_SLOT_CARTRIDGE, "cartslot1", 1, 0, msx_cart, nullptr);
+ add_internal_slot(config, MSX_SLOT_RAM, "ram", 2, 0, 0, 4); /* 64KB RAM */
msx1_cartlist(config);
-MACHINE_CONFIG_END
+}
/* MSX - Dragon MSX-64 */
@@ -1986,19 +2014,20 @@ ROM_START(dgnmsx)
ROM_LOAD("uk2msx058.ic6", 0x4000, 0x4000, CRC(e516e7e5) SHA1(05fedd4b9bfcf4949020c79d32c4c3f03a54fb62))
ROM_END
-MACHINE_CONFIG_START(msx_state::dgnmsx)
+void msx_state::dgnmsx(machine_config &config)
+{
msx1(TMS9929A, config);
// AY8910
// FDC: None, 0 drives
// 2 Cartridge slots
- MCFG_MSX_LAYOUT_ROM("bios", 0, 0, 0, 2, "maincpu", 0x0000)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot1", 1, 0)
- MCFG_MSX_LAYOUT_RAM("ram", 2, 0, 0, 4) /* 64KB RAM */
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot2", 3, 0)
+ add_internal_slot(config, MSX_SLOT_ROM, "bios", 0, 0, 0, 2, "maincpu", 0x0000);
+ add_cartridge_slot<1>(config, MSX_SLOT_CARTRIDGE, "cartslot1", 1, 0, msx_cart, nullptr);
+ add_internal_slot(config, MSX_SLOT_RAM, "ram", 2, 0, 0, 4); /* 64KB RAM */
+ add_cartridge_slot<2>(config, MSX_SLOT_CARTRIDGE, "cartslot2", 3, 0, msx_cart, nullptr);
msx1_cartlist(config);
-MACHINE_CONFIG_END
+}
/* MSX - Fenner DPC-200 */
@@ -2007,19 +2036,20 @@ ROM_START (fdpc200)
ROM_LOAD ("dpc200bios.rom", 0x0000, 0x8000, CRC(8205795e) SHA1(829c00c3114f25b3dae5157c0a238b52a3ac37db))
ROM_END
-MACHINE_CONFIG_START(msx_state::fdpc200)
+void msx_state::fdpc200(machine_config &config)
+{
msx1(TMS9929A, config);
// AY8910
// FDC: None, 0 drives
// 2 Cartridge slots
- MCFG_MSX_LAYOUT_ROM("bios", 0, 0, 0, 2, "maincpu", 0x0000)
- MCFG_MSX_LAYOUT_RAM("ram", 1, 0, 0, 4) /* 64KB RAM */
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot1", 2, 0)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot2", 3, 0)
+ add_internal_slot(config, MSX_SLOT_ROM, "bios", 0, 0, 0, 2, "maincpu", 0x0000);
+ add_internal_slot(config, MSX_SLOT_RAM, "ram", 1, 0, 0, 4); /* 64KB RAM */
+ add_cartridge_slot<1>(config, MSX_SLOT_CARTRIDGE, "cartslot1", 2, 0, msx_cart, nullptr);
+ add_cartridge_slot<2>(config, MSX_SLOT_CARTRIDGE, "cartslot2", 3, 0, msx_cart, nullptr);
msx1_cartlist(config);
-MACHINE_CONFIG_END
+}
/* MSX - Fenner FPC-500 */
@@ -2028,19 +2058,20 @@ ROM_START (fpc500)
ROM_LOAD ("fpc500bios.rom", 0x0000, 0x8000, CRC(8205795e) SHA1(829c00c3114f25b3dae5157c0a238b52a3ac37db))
ROM_END
-MACHINE_CONFIG_START(msx_state::fpc500)
+void msx_state::fpc500(machine_config &config)
+{
msx1(TMS9929A, config);
// AY8910?
// FDC: None, 0 drives
// 2 Cartridge slots
- MCFG_MSX_LAYOUT_ROM("bios", 0, 0, 0, 2, "maincpu", 0x0000)
- MCFG_MSX_LAYOUT_RAM("ram", 1, 0, 0, 4) /* 64KB RAM */
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot1", 2, 0)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot2", 3, 0)
+ add_internal_slot(config, MSX_SLOT_ROM, "bios", 0, 0, 0, 2, "maincpu", 0x0000);
+ add_internal_slot(config, MSX_SLOT_RAM, "ram", 1, 0, 0, 4); /* 64KB RAM */
+ add_cartridge_slot<1>(config, MSX_SLOT_CARTRIDGE, "cartslot1", 2, 0, msx_cart, nullptr);
+ add_cartridge_slot<2>(config, MSX_SLOT_CARTRIDGE, "cartslot2", 3, 0, msx_cart, nullptr);
msx1_cartlist(config);
-MACHINE_CONFIG_END
+}
/* MSX - Fenner SPC-800 */
@@ -2049,20 +2080,21 @@ ROM_START (fspc800)
ROM_LOAD ("spc800bios.rom", 0x0000, 0x8000, CRC(8205795e) SHA1(829c00c3114f25b3dae5157c0a238b52a3ac37db))
ROM_END
-MACHINE_CONFIG_START(msx_state::fspc800)
+void msx_state::fspc800(machine_config &config)
+{
msx1(TMS9929A, config);
// AY8910?
// FDC: None, 0 drives
// 2 Cartridge slots
// Z80: GSS Z8400APS
- MCFG_MSX_LAYOUT_ROM("bios", 0, 0, 0, 2, "maincpu", 0x0000)
- MCFG_MSX_LAYOUT_RAM("ram", 1, 0, 0, 4) /* 64KB RAM */
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot1", 2, 0)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot2", 3, 0)
+ add_internal_slot(config, MSX_SLOT_ROM, "bios", 0, 0, 0, 2, "maincpu", 0x0000);
+ add_internal_slot(config, MSX_SLOT_RAM, "ram", 1, 0, 0, 4); /* 64KB RAM */
+ add_cartridge_slot<1>(config, MSX_SLOT_CARTRIDGE, "cartslot1", 2, 0, msx_cart, nullptr);
+ add_cartridge_slot<2>(config, MSX_SLOT_CARTRIDGE, "cartslot2", 3, 0, msx_cart, nullptr);
msx1_cartlist(config);
-MACHINE_CONFIG_END
+}
/* MSX - Frael Bruc 100-1 */
@@ -2071,19 +2103,20 @@ ROM_START (bruc100)
ROM_LOAD("bruc100-1bios.rom", 0x0000, 0x8000, CRC(c7bc4298) SHA1(3abca440cba16ac5e162b602557d30169f77adab))
ROM_END
-MACHINE_CONFIG_START(msx_state::bruc100)
+void msx_state::bruc100(machine_config &config)
+{
msx1(TMS9929A, config);
// AY8910/YM2149?
// FDC: None, 0 drives
// 2 Cartridge slots?
- MCFG_MSX_LAYOUT_ROM("bios", 0, 0, 0, 2, "maincpu", 0x0000)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot1", 1, 0)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot2", 2, 0)
- MCFG_MSX_LAYOUT_RAM_MM("ram_mm", 3, 0, 0x10000) /* 64KB RAM */
+ add_internal_slot(config, MSX_SLOT_ROM, "bios", 0, 0, 0, 2, "maincpu", 0x0000);
+ add_cartridge_slot<1>(config, MSX_SLOT_CARTRIDGE, "cartslot1", 1, 0, msx_cart, nullptr);
+ add_cartridge_slot<2>(config, MSX_SLOT_CARTRIDGE, "cartslot2", 2, 0, msx_cart, nullptr);
+ add_internal_slot(config, MSX_SLOT_RAM_MM, "ram_mm", 3, 0, 0, 4).set_total_size(0x10000); /* 64KB RAM */
msx1_cartlist(config);
-MACHINE_CONFIG_END
+}
/* MSX - Fujitsu FM-X */
@@ -2092,20 +2125,21 @@ ROM_START (fmx)
ROM_LOAD ("fmxbios.rom", 0x0000, 0x8000, CRC(ee229390) SHA1(302afb5d8be26c758309ca3df611ae69cced2821))
ROM_END
-MACHINE_CONFIG_START(msx_state::fmx)
+void msx_state::fmx(machine_config &config)
+{
msx1(TMS9928A, config);
// AY8910/YM2149?
// FDC: None, 0 drives
// 1 Cartridge slot, 2 "Fujistu expansion slots
- MCFG_MSX_LAYOUT_ROM("bios", 0, 0, 0, 2, "maincpu", 0x0000)
- MCFG_MSX_LAYOUT_RAM("ram", 0, 0, 3, 1) // 16KB RAM
+ add_internal_slot(config, MSX_SLOT_ROM, "bios", 0, 0, 0, 2, "maincpu", 0x0000);
+ add_internal_slot(config, MSX_SLOT_RAM, "ram", 0, 0, 3, 1); // 16KB RAM
// Fujitsu expansion slot #1 in slot 1
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot2", 2, 0)
+ add_cartridge_slot<2>(config, MSX_SLOT_CARTRIDGE, "cartslot2", 2, 0, msx_cart, nullptr);
// Fijutsu expansion slot #2 in slot 3
msx1_cartlist(config);
-MACHINE_CONFIG_END
+}
/* MSX - Goldstar FC-80U */
@@ -2116,20 +2150,21 @@ ROM_START (gsfc80u)
ROM_RELOAD (0xa000, 0x2000)
ROM_END
-MACHINE_CONFIG_START(msx_state::gsfc80u)
+void msx_state::gsfc80u(machine_config &config)
+{
msx1(TMS9928A, config);
// AY8910/YM2149?
// FDC: None, 0 drives
// 2 Cartridge slots
- MCFG_MSX_LAYOUT_ROM("bios", 0, 0, 0, 2, "maincpu", 0x0000)
- MCFG_MSX_LAYOUT_ROM("han", 0, 0, 2, 1, "maincpu", 0x8000)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot1", 1, 0)
- MCFG_MSX_LAYOUT_RAM("ram", 2, 0, 0, 4) /* 64KB RAM */
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot2", 3, 0)
+ add_internal_slot(config, MSX_SLOT_ROM, "bios", 0, 0, 0, 2, "maincpu", 0x0000);
+ add_internal_slot(config, MSX_SLOT_ROM, "han", 0, 0, 2, 1, "maincpu", 0x8000);
+ add_cartridge_slot<1>(config, MSX_SLOT_CARTRIDGE, "cartslot1", 1, 0, msx_cart, nullptr);
+ add_internal_slot(config, MSX_SLOT_RAM, "ram", 2, 0, 0, 4); /* 64KB RAM */
+ add_cartridge_slot<2>(config, MSX_SLOT_CARTRIDGE, "cartslot2", 3, 0, msx_cart, nullptr);
msx1_cartlist(config);
-MACHINE_CONFIG_END
+}
/* MSX - Goldstar FC-200 */
@@ -2139,19 +2174,20 @@ ROM_START (gsfc200)
ROM_LOAD ("fc200bios.rom.u5b", 0x4000, 0x4000, CRC(1a99b1a1) SHA1(e18f72271b64693a2a2bc226e1b9ebd0448e07c0))
ROM_END
-MACHINE_CONFIG_START(msx_state::gsfc200)
+void msx_state::gsfc200(machine_config &config)
+{
msx1(TMS9129, config);
// AY8910/YM2149?
// FDC: None, 0 drives
// 2 Cartridge slots
- MCFG_MSX_LAYOUT_ROM("rom", 0, 0, 0, 2, "maincpu", 0x0000)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot1", 1, 0)
- MCFG_MSX_LAYOUT_RAM("ram", 2, 0, 0, 4) /* 64KB RAM */
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot2", 3, 0)
+ add_internal_slot(config, MSX_SLOT_ROM, "rom", 0, 0, 0, 2, "maincpu", 0x0000);
+ add_cartridge_slot<1>(config, MSX_SLOT_CARTRIDGE, "cartslot1", 1, 0, msx_cart, nullptr);
+ add_internal_slot(config, MSX_SLOT_RAM, "ram", 2, 0, 0, 4); /* 64KB RAM */
+ add_cartridge_slot<2>(config, MSX_SLOT_CARTRIDGE, "cartslot2", 3, 0, msx_cart, nullptr);
msx1_cartlist(config);
-MACHINE_CONFIG_END
+}
/* MSX - Goldstar GFC-1080 */
@@ -2162,19 +2198,20 @@ ROM_START (gfc1080)
ROM_LOAD ("gfc1080pasocalc.rom", 0xC000, 0x4000, CRC(4014f7ea) SHA1(a5581fa3ce10f90f15ba3dc53d57b02d6e4af172))
ROM_END
-MACHINE_CONFIG_START(msx_state::gfc1080)
+void msx_state::gfc1080(machine_config &config)
+{
msx1(TMS9928A, config);
// AY8910/YM2149?
// FDC: None, 0 drives
// 2 Cartridge slots?
- MCFG_MSX_LAYOUT_ROM("rom", 0, 0, 0, 4, "maincpu", 0x0000)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot1", 1, 0)
- MCFG_MSX_LAYOUT_RAM("ram", 2, 0, 0, 4) // 64KB RAM
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot2", 3, 0)
+ add_internal_slot(config, MSX_SLOT_ROM, "rom", 0, 0, 0, 4, "maincpu", 0x0000);
+ add_cartridge_slot<1>(config, MSX_SLOT_CARTRIDGE, "cartslot1", 1, 0, msx_cart, nullptr);
+ add_internal_slot(config, MSX_SLOT_RAM, "ram", 2, 0, 0, 4); // 64KB RAM
+ add_cartridge_slot<2>(config, MSX_SLOT_CARTRIDGE, "cartslot2", 3, 0, msx_cart, nullptr);
msx1_cartlist(config);
-MACHINE_CONFIG_END
+}
/* MSX - Goldstar GFC-1080A */
@@ -2185,19 +2222,20 @@ ROM_START (gfc1080a)
ROM_RELOAD (0xa000, 0x2000)
ROM_END
-MACHINE_CONFIG_START(msx_state::gfc1080a)
+void msx_state::gfc1080a(machine_config &config)
+{
msx1(TMS9928A, config);
// AY8910/YM2149?
// FDC: None, 0 drives
// 2 Cartridge slots?
- MCFG_MSX_LAYOUT_ROM("rom", 0, 0, 0, 3, "maincpu", 0x0000)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot1", 1, 0)
- MCFG_MSX_LAYOUT_RAM("ram", 2, 0, 0, 4) // 64KB RAM
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot2", 3, 0)
+ add_internal_slot(config, MSX_SLOT_ROM, "rom", 0, 0, 0, 3, "maincpu", 0x0000);
+ add_cartridge_slot<1>(config, MSX_SLOT_CARTRIDGE, "cartslot1", 1, 0, msx_cart, nullptr);
+ add_internal_slot(config, MSX_SLOT_RAM, "ram", 2, 0, 0, 4); // 64KB RAM
+ add_cartridge_slot<2>(config, MSX_SLOT_CARTRIDGE, "cartslot2", 3, 0, msx_cart, nullptr);
msx1_cartlist(config);
-MACHINE_CONFIG_END
+}
/* MSX - Gradiente Expert 1.0 */
@@ -2206,19 +2244,20 @@ ROM_START (expert10)
ROM_LOAD ("expbios.rom", 0x0000, 0x8000, CRC(07610d77) SHA1(ef3e010eb57e4476700a3bbff9d2119ab3acdf62))
ROM_END
-MACHINE_CONFIG_START(msx_state::expert10)
+void msx_state::expert10(machine_config &config)
+{
msx1(TMS9128, config);
// AY8910/YM2149?
// FDC: None, 0 drives
// 2 Cartridge slots
- MCFG_MSX_LAYOUT_ROM("bios", 0, 0, 0, 2, "maincpu", 0x0000)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot1", 1, 0)
- MCFG_MSX_LAYOUT_RAM("ram", 2, 0, 0, 4) /* 64KB RAM */
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot2", 3, 0)
+ add_internal_slot(config, MSX_SLOT_ROM, "bios", 0, 0, 0, 2, "maincpu", 0x0000);
+ add_cartridge_slot<1>(config, MSX_SLOT_CARTRIDGE, "cartslot1", 1, 0, msx_cart, nullptr);
+ add_internal_slot(config, MSX_SLOT_RAM, "ram", 2, 0, 0, 4); /* 64KB RAM */
+ add_cartridge_slot<2>(config, MSX_SLOT_CARTRIDGE, "cartslot2", 3, 0, msx_cart, nullptr);
msx1_cartlist(config);
-MACHINE_CONFIG_END
+}
/* MSX - Gradiente Expert 1.1 */
ROM_START (expert11)
@@ -2226,19 +2265,20 @@ ROM_START (expert11)
ROM_LOAD ("expbios11.rom", 0x0000, 0x8000, CRC(efb4b972) SHA1(d6720845928ee848cfa88a86accb067397685f02))
ROM_END
-MACHINE_CONFIG_START(msx_state::expert11)
+void msx_state::expert11(machine_config &config)
+{
msx1(TMS9128, config);
// AY8910/YM2149?
// FDC: None, 0 drives
// 2 Cartridge slots
- MCFG_MSX_LAYOUT_ROM("bios", 0, 0, 0, 2, "maincpu", 0x0000)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot1", 1, 0)
- MCFG_MSX_LAYOUT_RAM("ram", 2, 0, 0, 4) /* 64KB RAM */
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot2", 3, 0)
+ add_internal_slot(config, MSX_SLOT_ROM, "bios", 0, 0, 0, 2, "maincpu", 0x0000);
+ add_cartridge_slot<1>(config, MSX_SLOT_CARTRIDGE, "cartslot1", 1, 0, msx_cart, nullptr);
+ add_internal_slot(config, MSX_SLOT_RAM, "ram", 2, 0, 0, 4); /* 64KB RAM */
+ add_cartridge_slot<2>(config, MSX_SLOT_CARTRIDGE, "cartslot2", 3, 0, msx_cart, nullptr);
msx1_cartlist(config);
-MACHINE_CONFIG_END
+}
/* MSX - Gradiente Expert 1.3 */
ROM_START (expert13)
@@ -2246,19 +2286,20 @@ ROM_START (expert13)
ROM_LOAD ("expbios13.rom", 0x0000, 0x8000, CRC(5638bc38) SHA1(605f5af3f358c6811f54e0173bad908614a198c0))
ROM_END
-MACHINE_CONFIG_START(msx_state::expert13)
+void msx_state::expert13(machine_config &config)
+{
msx1(TMS9928A, config);
// AY8910/YM2149?
// FDC: None, 0 drives
// 2 Cartridge slots?
- MCFG_MSX_LAYOUT_ROM("bios", 0, 0, 0, 2, "maincpu", 0x0000)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot1", 1, 0)
- MCFG_MSX_LAYOUT_RAM_MM("ram_mm", 2, 0, 0x10000) /* 64KB Mapper RAM */
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot2", 3, 0)
+ add_internal_slot(config, MSX_SLOT_ROM, "bios", 0, 0, 0, 2, "maincpu", 0x0000);
+ add_cartridge_slot<1>(config, MSX_SLOT_CARTRIDGE, "cartslot1", 1, 0, msx_cart, nullptr);
+ add_internal_slot(config, MSX_SLOT_RAM_MM, "ram_mm", 2, 0, 0, 4).set_total_size(0x10000); /* 64KB Mapper RAM */
+ add_cartridge_slot<2>(config, MSX_SLOT_CARTRIDGE, "cartslot2", 3, 0, msx_cart, nullptr);
msx1_cartlist(config);
-MACHINE_CONFIG_END
+}
/* MSX - Gradiente Expert DDPlus */
ROM_START (expertdp)
@@ -2267,25 +2308,26 @@ ROM_START (expertdp)
ROM_LOAD ("eddpdisk.rom", 0x8000, 0x4000, CRC(549f1d90) SHA1(f1525de4e0b60a6687156c2a96f8a8b2044b6c56))
ROM_END
-MACHINE_CONFIG_START(msx_state::expertdp)
+void msx_state::expertdp(machine_config &config)
+{
msx1(TMS9928A, config);
// AY8910/YM2149?
// FDC: mb8877a, 1 3.5" DSDD drive
// 2 Cartridge slots
// MSX Engine T7937A (also VDP)
- MCFG_MSX_LAYOUT_ROM("bios", 0, 0, 0, 2, "maincpu", 0x0000)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot1", 1, 0)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot2", 2, 0)
- MCFG_MSX_LAYOUT_RAM("ram", 3, 0, 0, 4) /* 64KB RAM */
- MCFG_MSX_LAYOUT_DISK2("disk", 3, 3, 1, 1, "maincpu", 0x8000)
+ add_internal_slot(config, MSX_SLOT_ROM, "bios", 0, 0, 0, 2, "maincpu", 0x0000);
+ add_cartridge_slot<1>(config, MSX_SLOT_CARTRIDGE, "cartslot1", 1, 0, msx_cart, nullptr);
+ add_cartridge_slot<2>(config, MSX_SLOT_CARTRIDGE, "cartslot2", 2, 0, msx_cart, nullptr);
+ add_internal_slot(config, MSX_SLOT_RAM, "ram", 3, 0, 0, 4); /* 64KB RAM */
+ add_internal_slot_mirrored(config, MSX_SLOT_DISK2, "disk", 3, 3, 1, 2, "maincpu", 0x8000).set_tags("fdc", "fdc:0", "fdc:1");
msx_mb8877a(config);
msx_1_35_dd_drive(config);
msx1_floplist(config);
msx1_cartlist(config);
-MACHINE_CONFIG_END
+}
/* MSX - Gradiente Expert Plus */
@@ -2295,21 +2337,22 @@ ROM_START (expertpl)
ROM_LOAD ("exppdemo.rom", 0x8000, 0x4000, CRC(a9bbef64) SHA1(d4cea8c815f3eeabe0c6a1c845f902ec4318bf6b))
ROM_END
-MACHINE_CONFIG_START(msx_state::expertpl)
+void msx_state::expertpl(machine_config &config)
+{
msx1(TMS9928A, config);
// AY8910/YM2149?
// FDC: None, 0 drives
// 2 Cartridge slots
// MSX Engine T7937A
- MCFG_MSX_LAYOUT_ROM("bios", 0, 0, 0, 2, "maincpu", 0x0000)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot1", 1, 0)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot2", 2, 0)
- MCFG_MSX_LAYOUT_RAM("ram", 3, 0, 0, 4) /* 64KB RAM */
- MCFG_MSX_LAYOUT_ROM("demo", 3, 3, 2, 1, "maincpu", 0x8000)
+ add_internal_slot(config, MSX_SLOT_ROM, "bios", 0, 0, 0, 2, "maincpu", 0x0000);
+ add_cartridge_slot<1>(config, MSX_SLOT_CARTRIDGE, "cartslot1", 1, 0, msx_cart, nullptr);
+ add_cartridge_slot<2>(config, MSX_SLOT_CARTRIDGE, "cartslot2", 2, 0, msx_cart, nullptr);
+ add_internal_slot(config, MSX_SLOT_RAM, "ram", 3, 0, 0, 4); /* 64KB RAM */
+ add_internal_slot(config, MSX_SLOT_ROM, "demo", 3, 3, 2, 1, "maincpu", 0x8000);
msx1_cartlist(config);
-MACHINE_CONFIG_END
+}
/* MSX - Hitachi MB-H2 */
@@ -2319,7 +2362,8 @@ ROM_START (mbh2)
ROM_LOAD ("mbh2firm.rom", 0x8000, 0x4000, CRC(4f03c947) SHA1(e2140fa2e8e59090ecccf55b62323ea9dcc66d0b))
ROM_END
-MACHINE_CONFIG_START(msx_state::mbh2)
+void msx_state::mbh2(machine_config &config)
+{
msx1(TMS9928A, config);
// AY8910/YM2149?
// FDC: None, 0 drives
@@ -2327,13 +2371,13 @@ MACHINE_CONFIG_START(msx_state::mbh2)
// Builtin cassette player
// Speed controller (normal, slow 1, slow 2)
- MCFG_MSX_LAYOUT_ROM("rom", 0, 0, 0, 3, "maincpu", 0x0000)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot1", 1, 0)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot2", 2, 0)
- MCFG_MSX_LAYOUT_RAM("ram", 3, 0, 0, 4) // 64KB RAM
+ add_internal_slot(config, MSX_SLOT_ROM, "rom", 0, 0, 0, 3, "maincpu", 0x0000);
+ add_cartridge_slot<1>(config, MSX_SLOT_CARTRIDGE, "cartslot1", 1, 0, msx_cart, nullptr);
+ add_cartridge_slot<2>(config, MSX_SLOT_CARTRIDGE, "cartslot2", 2, 0, msx_cart, nullptr);
+ add_internal_slot(config, MSX_SLOT_RAM, "ram", 3, 0, 0, 4); // 64KB RAM
msx1_cartlist(config);
-MACHINE_CONFIG_END
+}
/* MSX - Hitachi MB-H25 */
@@ -2342,19 +2386,20 @@ ROM_START (mbh25)
ROM_LOAD ("mbh25bios.rom", 0x0000, 0x8000, CRC(ee229390) SHA1(302afb5d8be26c758309ca3df611ae69cced2821))
ROM_END
-MACHINE_CONFIG_START(msx_state::mbh25)
+void msx_state::mbh25(machine_config &config)
+{
msx1(TMS9928A, config);
// AY8910/YM2149?
// FDC: None, 0 drives
// 2 Cartridge slots
- MCFG_MSX_LAYOUT_ROM("rom", 0, 0, 0, 2, "maincpu", 0x0000)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot1", 1, 0)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot2", 2, 0)
- MCFG_MSX_LAYOUT_RAM("ram", 3, 0, 2, 2) // 32KB RAM
+ add_internal_slot(config, MSX_SLOT_ROM, "rom", 0, 0, 0, 2, "maincpu", 0x0000);
+ add_cartridge_slot<1>(config, MSX_SLOT_CARTRIDGE, "cartslot1", 1, 0, msx_cart, nullptr);
+ add_cartridge_slot<2>(config, MSX_SLOT_CARTRIDGE, "cartslot2", 2, 0, msx_cart, nullptr);
+ add_internal_slot(config, MSX_SLOT_RAM, "ram", 3, 0, 2, 2); // 32KB RAM
msx1_cartlist(config);
-MACHINE_CONFIG_END
+}
/* MSX - Hitachi MB-H50 */
@@ -2363,20 +2408,21 @@ ROM_START (mbh50)
ROM_LOAD ("mbh50bios.rom", 0x0000, 0x8000, CRC(ee229390) SHA1(302afb5d8be26c758309ca3df611ae69cced2821))
ROM_END
-MACHINE_CONFIG_START(msx_state::mbh50)
+void msx_state::mbh50(machine_config &config)
+{
msx1(TMS9928A, config);
// AY8910/YM2149?
// FDC: None, 0 drives
// 2 Cartridge slots
// T6950
- MCFG_MSX_LAYOUT_ROM("rom", 0, 0, 0, 2, "maincpu", 0x0000)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot1", 1, 0)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot2", 2, 0)
- MCFG_MSX_LAYOUT_RAM("ram", 3, 0, 0, 4) // 64KB RAM
+ add_internal_slot(config, MSX_SLOT_ROM, "rom", 0, 0, 0, 2, "maincpu", 0x0000);
+ add_cartridge_slot<1>(config, MSX_SLOT_CARTRIDGE, "cartslot1", 1, 0, msx_cart, nullptr);
+ add_cartridge_slot<2>(config, MSX_SLOT_CARTRIDGE, "cartslot2", 2, 0, msx_cart, nullptr);
+ add_internal_slot(config, MSX_SLOT_RAM, "ram", 3, 0, 0, 4); // 64KB RAM
msx1_cartlist(config);
-MACHINE_CONFIG_END
+}
/* MSX - JVC HC-7GB */
@@ -2385,19 +2431,20 @@ ROM_START (jvchc7gb)
ROM_LOAD ("hc7gbbios.rom", 0x0000, 0x8000, CRC(e9ccd789) SHA1(8963fc041975f31dc2ab1019cfdd4967999de53e))
ROM_END
-MACHINE_CONFIG_START(msx_state::jvchc7gb)
+void msx_state::jvchc7gb(machine_config &config)
+{
msx1(TMS9929A, config);
// AY8910/YM2149?
// FDC: None, 0 drives
// 2 Cartridge slots
- MCFG_MSX_LAYOUT_ROM("rom", 0, 0, 0, 2, "maincpu", 0x0000)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot1", 1, 0)
- MCFG_MSX_LAYOUT_RAM("ram", 2, 0, 0, 4) /* 64KB RAM */
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot2", 3, 0)
+ add_internal_slot(config, MSX_SLOT_ROM, "rom", 0, 0, 0, 2, "maincpu", 0x0000);
+ add_cartridge_slot<1>(config, MSX_SLOT_CARTRIDGE, "cartslot1", 1, 0, msx_cart, nullptr);
+ add_internal_slot(config, MSX_SLOT_RAM, "ram", 2, 0, 0, 4); /* 64KB RAM */
+ add_cartridge_slot<2>(config, MSX_SLOT_CARTRIDGE, "cartslot2", 3, 0, msx_cart, nullptr);
msx1_cartlist(config);
-MACHINE_CONFIG_END
+}
/* MSX - Mitsubishi ML-F48 */
@@ -2406,19 +2453,20 @@ ROM_START (mlf48)
ROM_LOAD ("mlf48bios.rom", 0x0000, 0x8000, CRC(e9ccd789) SHA1(8963fc041975f31dc2ab1019cfdd4967999de53e))
ROM_END
-MACHINE_CONFIG_START(msx_state::mlf48)
+void msx_state::mlf48(machine_config &config)
+{
msx1(TMS9929A, config);
// AY8910/YM2149?
// FDC: None, 0 drives
// 2 Cartridge slots
- MCFG_MSX_LAYOUT_ROM("bios", 0, 0, 0, 2, "maincpu", 0x0000)
- MCFG_MSX_LAYOUT_RAM("ram", 1, 0, 2, 2) // 32KB RAM
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot1", 2, 0)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot2", 3, 0)
+ add_internal_slot(config, MSX_SLOT_ROM, "bios", 0, 0, 0, 2, "maincpu", 0x0000);
+ add_internal_slot(config, MSX_SLOT_RAM, "ram", 1, 0, 2, 2); // 32KB RAM
+ add_cartridge_slot<1>(config, MSX_SLOT_CARTRIDGE, "cartslot1", 2, 0, msx_cart, nullptr);
+ add_cartridge_slot<2>(config, MSX_SLOT_CARTRIDGE, "cartslot2", 3, 0, msx_cart, nullptr);
msx1_cartlist(config);
-MACHINE_CONFIG_END
+}
/* MSX - Mitsubishi ML-F80 */
@@ -2427,19 +2475,20 @@ ROM_START (mlf80)
ROM_LOAD ("mlf80bios.rom", 0x0000, 0x8000, CRC(e9ccd789) SHA1(8963fc041975f31dc2ab1019cfdd4967999de53e))
ROM_END
-MACHINE_CONFIG_START(msx_state::mlf80)
+void msx_state::mlf80(machine_config &config)
+{
msx1(TMS9929A, config);
// AY8910/YM2149?
// FDC: None, 0 drives
// 2 Cartridge slots
- MCFG_MSX_LAYOUT_ROM("bios", 0, 0, 0, 2, "maincpu", 0x0000)
- MCFG_MSX_LAYOUT_RAM("ram", 1, 0, 0, 4) /* 64KB RAM */
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot1", 2, 0)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot2", 3, 0)
+ add_internal_slot(config, MSX_SLOT_ROM, "bios", 0, 0, 0, 2, "maincpu", 0x0000);
+ add_internal_slot(config, MSX_SLOT_RAM, "ram", 1, 0, 0, 4); /* 64KB RAM */
+ add_cartridge_slot<1>(config, MSX_SLOT_CARTRIDGE, "cartslot1", 2, 0, msx_cart, nullptr);
+ add_cartridge_slot<2>(config, MSX_SLOT_CARTRIDGE, "cartslot2", 3, 0, msx_cart, nullptr);
msx1_cartlist(config);
-MACHINE_CONFIG_END
+}
/* MSX - Mitsubishi ML-F110 */
@@ -2448,19 +2497,20 @@ ROM_START (mlf110)
ROM_LOAD ("mlf110bios.rom", 0x0000, 0x8000, CRC(ee229390) SHA1(302afb5d8be26c758309ca3df611ae69cced2821))
ROM_END
-MACHINE_CONFIG_START(msx_state::mlf110)
+void msx_state::mlf110(machine_config &config)
+{
msx1(TMS9928A, config);
// AY8910/YM2149?
// FDC: None, 0 drives
// 2 Cartridge slots
- MCFG_MSX_LAYOUT_ROM("bios", 0, 0, 0, 2, "maincpu", 0x0000)
- MCFG_MSX_LAYOUT_RAM("ram", 1, 0, 3, 1) // 16KB RAM
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot1", 2, 0)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot2", 3, 0)
+ add_internal_slot(config, MSX_SLOT_ROM, "bios", 0, 0, 0, 2, "maincpu", 0x0000);
+ add_internal_slot(config, MSX_SLOT_RAM, "ram", 1, 0, 3, 1); // 16KB RAM
+ add_cartridge_slot<1>(config, MSX_SLOT_CARTRIDGE, "cartslot1", 2, 0, msx_cart, nullptr);
+ add_cartridge_slot<2>(config, MSX_SLOT_CARTRIDGE, "cartslot2", 3, 0, msx_cart, nullptr);
msx1_cartlist(config);
-MACHINE_CONFIG_END
+}
/* MSX - Mitsubishi ML-F120 */
@@ -2470,20 +2520,21 @@ ROM_START (mlf120)
ROM_LOAD ("mlf120firm.rom", 0x8000, 0x4000, CRC(4b5f3173) SHA1(21a9f60cb6370d0617ce54c42bb7d8e40a4ab560))
ROM_END
-MACHINE_CONFIG_START(msx_state::mlf120)
+void msx_state::mlf120(machine_config &config)
+{
msx1(TMS9928A, config);
// AY8910/YM2149?
// FDC: None, 0 drives
// 2? Cartridge slots
- MCFG_MSX_LAYOUT_ROM("bios", 0, 0, 0, 2, "maincpu", 0x0000)
- MCFG_MSX_LAYOUT_ROM("firm", 1, 0, 1, 1, "maincpu", 0x8000)
- MCFG_MSX_LAYOUT_RAM("ram", 1, 0, 2, 2) // 32KB RAM
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot1", 2, 0)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot2", 3, 0)
+ add_internal_slot(config, MSX_SLOT_ROM, "bios", 0, 0, 0, 2, "maincpu", 0x0000);
+ add_internal_slot(config, MSX_SLOT_ROM, "firm", 1, 0, 1, 1, "maincpu", 0x8000);
+ add_internal_slot(config, MSX_SLOT_RAM, "ram", 1, 0, 2, 2); // 32KB RAM
+ add_cartridge_slot<1>(config, MSX_SLOT_CARTRIDGE, "cartslot1", 2, 0, msx_cart, nullptr);
+ add_cartridge_slot<2>(config, MSX_SLOT_CARTRIDGE, "cartslot2", 3, 0, msx_cart, nullptr);
msx1_cartlist(config);
-MACHINE_CONFIG_END
+}
/* MSX - Mitsubishi ML-FX1 */
@@ -2492,19 +2543,20 @@ ROM_START (mlfx1)
ROM_LOAD ("mlfx1bios.rom", 0x0000, 0x8000, CRC(62867dce) SHA1(0cbe0df4af45e8f531e9c761403ac9e71808f20c))
ROM_END
-MACHINE_CONFIG_START(msx_state::mlfx1)
+void msx_state::mlfx1(machine_config &config)
+{
msx1(TMS9929A, config);
// AY8910/YM2149?
// FDC: None, 0 drives
// 2 Cartridge slots
- MCFG_MSX_LAYOUT_ROM("bios", 0, 0, 0, 2, "maincpu", 0x0000)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot1", 1, 0)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot2", 2, 0)
- MCFG_MSX_LAYOUT_RAM("ram", 3, 2, 0, 4) /* 64KB RAM */
+ add_internal_slot(config, MSX_SLOT_ROM, "bios", 0, 0, 0, 2, "maincpu", 0x0000);
+ add_cartridge_slot<1>(config, MSX_SLOT_CARTRIDGE, "cartslot1", 1, 0, msx_cart, nullptr);
+ add_cartridge_slot<2>(config, MSX_SLOT_CARTRIDGE, "cartslot2", 2, 0, msx_cart, nullptr);
+ add_internal_slot(config, MSX_SLOT_RAM, "ram", 3, 2, 0, 4); /* 64KB RAM */
msx1_cartlist(config);
-MACHINE_CONFIG_END
+}
/* MSX - National CF-1200 */
@@ -2513,19 +2565,20 @@ ROM_START (cf1200)
ROM_LOAD ("1200bios.rom", 0x0000, 0x8000, CRC(5ad03407) SHA1(c7a2c5baee6a9f0e1c6ee7d76944c0ab1886796c))
ROM_END
-MACHINE_CONFIG_START(msx_state::cf1200)
+void msx_state::cf1200(machine_config &config)
+{
msx1(TMS9918A, config);
// AY8910
// FDC: None, 0 drives
// 2 Cartridge slots
- MCFG_MSX_LAYOUT_ROM("bios", 0, 0, 0, 2, "maincpu", 0x0000)
- MCFG_MSX_LAYOUT_RAM("ram", 0, 0, 3, 1) /* 16KB RAM */
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot1", 1, 0)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot2", 2, 0)
+ add_internal_slot(config, MSX_SLOT_ROM, "bios", 0, 0, 0, 2, "maincpu", 0x0000);
+ add_internal_slot(config, MSX_SLOT_RAM, "ram", 0, 0, 3, 1); /* 16KB RAM */
+ add_cartridge_slot<1>(config, MSX_SLOT_CARTRIDGE, "cartslot1", 1, 0, msx_cart, nullptr);
+ add_cartridge_slot<2>(config, MSX_SLOT_CARTRIDGE, "cartslot2", 2, 0, msx_cart, nullptr);
msx1_cartlist(config);
-MACHINE_CONFIG_END
+}
/* MSX - National CF-2000 */
@@ -2534,19 +2587,20 @@ ROM_START (cf2000)
ROM_LOAD ("2000bios.rom", 0x0000, 0x8000, CRC(ee229390) SHA1(302afb5d8be26c758309ca3df611ae69cced2821))
ROM_END
-MACHINE_CONFIG_START(msx_state::cf2000)
+void msx_state::cf2000(machine_config &config)
+{
msx1(TMS9928A, config);
// AY8910/YM2149?
// FDC: None, 0 drives
// 2 Cartridge slots
- MCFG_MSX_LAYOUT_ROM("bios", 0, 0, 0, 2, "maincpu", 0x0000)
- MCFG_MSX_LAYOUT_RAM("ram", 0, 0, 3, 1) /* 16KB RAM */
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot1", 1, 0)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot2", 2, 0)
+ add_internal_slot(config, MSX_SLOT_ROM, "bios", 0, 0, 0, 2, "maincpu", 0x0000);
+ add_internal_slot(config, MSX_SLOT_RAM, "ram", 0, 0, 3, 1); /* 16KB RAM */
+ add_cartridge_slot<1>(config, MSX_SLOT_CARTRIDGE, "cartslot1", 1, 0, msx_cart, nullptr);
+ add_cartridge_slot<2>(config, MSX_SLOT_CARTRIDGE, "cartslot2", 2, 0, msx_cart, nullptr);
msx1_cartlist(config);
-MACHINE_CONFIG_END
+}
/* MSX - National CF-2700 */
ROM_START (cf2700)
@@ -2554,19 +2608,20 @@ ROM_START (cf2700)
ROM_LOAD ("2700bios.rom.ic32", 0x0000, 0x8000, CRC(5ad03407) SHA1(c7a2c5baee6a9f0e1c6ee7d76944c0ab1886796c))
ROM_END
-MACHINE_CONFIG_START(msx_state::cf2700)
+void msx_state::cf2700(machine_config &config)
+{
msx1(TMS9928A, config);
// AY8910/YM2149?
// FDC: None, 0 drives
// 2 Cartridge slots
- MCFG_MSX_LAYOUT_ROM("bios", 0, 0, 0, 2, "maincpu", 0x0000)
- MCFG_MSX_LAYOUT_RAM("ram", 0, 0, 2, 2) /* 32KB RAM */
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot1", 1, 0)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot2", 2, 0)
+ add_internal_slot(config, MSX_SLOT_ROM, "bios", 0, 0, 0, 2, "maincpu", 0x0000);
+ add_internal_slot(config, MSX_SLOT_RAM, "ram", 0, 0, 2, 2); /* 32KB RAM */
+ add_cartridge_slot<1>(config, MSX_SLOT_CARTRIDGE, "cartslot1", 1, 0, msx_cart, nullptr);
+ add_cartridge_slot<2>(config, MSX_SLOT_CARTRIDGE, "cartslot2", 2, 0, msx_cart, nullptr);
msx1_cartlist(config);
-MACHINE_CONFIG_END
+}
/* MSX - National CF-3000 */
@@ -2575,19 +2630,20 @@ ROM_START (cf3000)
ROM_LOAD ("3000bios.rom", 0x0000, 0x8000, CRC(5ad03407) SHA1(c7a2c5baee6a9f0e1c6ee7d76944c0ab1886796c))
ROM_END
-MACHINE_CONFIG_START(msx_state::cf3000)
+void msx_state::cf3000(machine_config &config)
+{
msx1(TMS9928A, config);
// AY8910/YM2149?
// FDC: None, 0 drives
// 2 Cartridge slots
- MCFG_MSX_LAYOUT_ROM("bios", 0, 0, 0, 2, "maincpu", 0x0000)
- MCFG_MSX_LAYOUT_RAM("ram", 1, 0, 0, 4) /* 64KB RAM */
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot1", 2, 0)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot2", 3, 0)
+ add_internal_slot(config, MSX_SLOT_ROM, "bios", 0, 0, 0, 2, "maincpu", 0x0000);
+ add_internal_slot(config, MSX_SLOT_RAM, "ram", 1, 0, 0, 4); /* 64KB RAM */
+ add_cartridge_slot<1>(config, MSX_SLOT_CARTRIDGE, "cartslot1", 2, 0, msx_cart, nullptr);
+ add_cartridge_slot<2>(config, MSX_SLOT_CARTRIDGE, "cartslot2", 3, 0, msx_cart, nullptr);
msx1_cartlist(config);
-MACHINE_CONFIG_END
+}
/* MSX - National CF-3300 */
ROM_START (cf3300)
@@ -2596,24 +2652,25 @@ ROM_START (cf3300)
ROM_LOAD ("3300disk.rom", 0x8000, 0x4000, CRC(549f1d90) SHA1(f1525de4e0b60a6687156c2a96f8a8b2044b6c56))
ROM_END
-MACHINE_CONFIG_START(msx_state::cf3300)
+void msx_state::cf3300(machine_config &config)
+{
msx1(TMS9928A, config);
// AY8910/YM2149?
// FDC: mb8877a, 1 3.5" SSDD drive
// 2 Cartridge slots
- MCFG_MSX_LAYOUT_ROM("bios", 0, 0, 0, 2, "maincpu", 0x0000)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot1", 1, 0)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot2", 2, 0)
- MCFG_MSX_LAYOUT_RAM("ram", 3, 0, 0, 4) /* 64KB RAM */
- MCFG_MSX_LAYOUT_DISK2("disk", 3, 1, 1, 1, "maincpu", 0x8000)
+ add_internal_slot(config, MSX_SLOT_ROM, "bios", 0, 0, 0, 2, "maincpu", 0x0000);
+ add_cartridge_slot<1>(config, MSX_SLOT_CARTRIDGE, "cartslot1", 1, 0, msx_cart, nullptr);
+ add_cartridge_slot<2>(config, MSX_SLOT_CARTRIDGE, "cartslot2", 2, 0, msx_cart, nullptr);
+ add_internal_slot(config, MSX_SLOT_RAM, "ram", 3, 0, 0, 4); /* 64KB RAM */
+ add_internal_slot_mirrored(config, MSX_SLOT_DISK2, "disk", 3, 1, 1, 2, "maincpu", 0x8000).set_tags("fdc", "fdc:0", "fdc:1");
msx_mb8877a(config);
msx_1_35_ssdd_drive(config);
msx1_floplist(config);
msx1_cartlist(config);
-MACHINE_CONFIG_END
+}
/* MSX - National FS-1300 */
@@ -2622,19 +2679,20 @@ ROM_START (fs1300)
ROM_LOAD ("1300bios.rom", 0x0000, 0x8000, CRC(5ad03407) SHA1(c7a2c5baee6a9f0e1c6ee7d76944c0ab1886796c))
ROM_END
-MACHINE_CONFIG_START(msx_state::fs1300)
+void msx_state::fs1300(machine_config &config)
+{
msx1(TMS9928A, config);
// AY8910/YM2149?
// FDC: None, 0 drives
// 2 Cartridge slots
- MCFG_MSX_LAYOUT_ROM("bios", 0, 0, 0, 2, "maincpu", 0x0000)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot1", 1, 0)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot2", 2, 0)
- MCFG_MSX_LAYOUT_RAM("ram", 3, 0, 0, 4) /* 64KB RAM */
+ add_internal_slot(config, MSX_SLOT_ROM, "bios", 0, 0, 0, 2, "maincpu", 0x0000);
+ add_cartridge_slot<1>(config, MSX_SLOT_CARTRIDGE, "cartslot1", 1, 0, msx_cart, nullptr);
+ add_cartridge_slot<2>(config, MSX_SLOT_CARTRIDGE, "cartslot2", 2, 0, msx_cart, nullptr);
+ add_internal_slot(config, MSX_SLOT_RAM, "ram", 3, 0, 0, 4); /* 64KB RAM */
msx1_cartlist(config);
-MACHINE_CONFIG_END
+}
/* MSX - National FS-4000 */
@@ -2648,21 +2706,22 @@ ROM_START (fs4000)
ROM_LOAD ("4000kfn.rom", 0, 0x20000, CRC(956dc96d) SHA1(9ed3ab6d893632b9246e91b412cd5db519e7586b))
ROM_END
-MACHINE_CONFIG_START(msx_state::fs4000)
+void msx_state::fs4000(machine_config &config)
+{
msx1(TMS9128, config);
// AY8910/YM2149?
// FDC: None, 0 drives
// 2 Cartridge slots
- MCFG_MSX_LAYOUT_ROM("bios", 0, 0, 0, 2, "maincpu", 0x0000)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot1", 1, 0)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot2", 2, 0)
- MCFG_MSX_LAYOUT_ROM("word", 3, 0, 0, 2, "maincpu", 0x8000)
- MCFG_MSX_LAYOUT_ROM("kdr", 3, 1, 1, 2, "maincpu", 0x10000)
- MCFG_MSX_LAYOUT_RAM("ram", 3, 2, 0, 4) /* 64KB RAM */
+ add_internal_slot(config, MSX_SLOT_ROM, "bios", 0, 0, 0, 2, "maincpu", 0x0000);
+ add_cartridge_slot<1>(config, MSX_SLOT_CARTRIDGE, "cartslot1", 1, 0, msx_cart, nullptr);
+ add_cartridge_slot<2>(config, MSX_SLOT_CARTRIDGE, "cartslot2", 2, 0, msx_cart, nullptr);
+ add_internal_slot(config, MSX_SLOT_ROM, "word", 3, 0, 0, 2, "maincpu", 0x8000);
+ add_internal_slot(config, MSX_SLOT_ROM, "kdr", 3, 1, 1, 2, "maincpu", 0x10000);
+ add_internal_slot(config, MSX_SLOT_RAM, "ram", 3, 2, 0, 4); /* 64KB RAM */
msx1_cartlist(config);
-MACHINE_CONFIG_END
+}
/* MSX - National FS-4000 (Alt) */
@@ -2676,21 +2735,22 @@ ROM_START (fs4000a)
ROM_LOAD ("4000kfn.rom", 0, 0x20000, CRC(956dc96d) SHA1(9ed3ab6d893632b9246e91b412cd5db519e7586b))
ROM_END
-MACHINE_CONFIG_START(msx_state::fs4000a)
+void msx_state::fs4000a(machine_config &config)
+{
msx1(TMS9128, config);
// AY8910/YM2149?
// FDC: None, 0 drives
// 2 Cartridge slots
- MCFG_MSX_LAYOUT_ROM("bios", 0, 0, 0, 2, "maincpu", 0x0000)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot1", 1, 0)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot2", 2, 0)
- MCFG_MSX_LAYOUT_ROM("word", 3, 0, 0, 2, "maincpu", 0x8000)
- MCFG_MSX_LAYOUT_ROM("kdr", 3, 1, 1, 2, "maincpu", 0x10000)
- MCFG_MSX_LAYOUT_RAM("ram", 3, 2, 0, 4) /* 64KB RAM */
+ add_internal_slot(config, MSX_SLOT_ROM, "bios", 0, 0, 0, 2, "maincpu", 0x0000);
+ add_cartridge_slot<1>(config, MSX_SLOT_CARTRIDGE, "cartslot1", 1, 0, msx_cart, nullptr);
+ add_cartridge_slot<2>(config, MSX_SLOT_CARTRIDGE, "cartslot2", 2, 0, msx_cart, nullptr);
+ add_internal_slot(config, MSX_SLOT_ROM, "word", 3, 0, 0, 2, "maincpu", 0x8000);
+ add_internal_slot(config, MSX_SLOT_ROM, "kdr", 3, 1, 1, 2, "maincpu", 0x10000);
+ add_internal_slot(config, MSX_SLOT_RAM, "ram", 3, 2, 0, 4); /* 64KB RAM */
msx1_cartlist(config);
-MACHINE_CONFIG_END
+}
/*MSX - Olympia PHC-2*/
@@ -2699,19 +2759,20 @@ ROM_START (phc2)
ROM_LOAD ("phc2bios.rom", 0x0000, 0x8000, CRC(4f7bb04b) SHA1(ab0177624d46dd77ab4f50ffcb983c3ba88223f4))
ROM_END
-MACHINE_CONFIG_START(msx_state::phc2)
+void msx_state::phc2(machine_config &config)
+{
msx1(TMS9929A, config);
// AY8910/YM2149?
// FDC: None, 0 drives
// 2 Cartridge slots?
- MCFG_MSX_LAYOUT_ROM("bios", 0, 0, 0, 2, "maincpu", 0x0000)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot1", 1, 0)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot2", 2, 0)
- MCFG_MSX_LAYOUT_RAM("ram", 3, 0, 0, 4) /* 64KB RAM */
+ add_internal_slot(config, MSX_SLOT_ROM, "bios", 0, 0, 0, 2, "maincpu", 0x0000);
+ add_cartridge_slot<1>(config, MSX_SLOT_CARTRIDGE, "cartslot1", 1, 0, msx_cart, nullptr);
+ add_cartridge_slot<2>(config, MSX_SLOT_CARTRIDGE, "cartslot2", 2, 0, msx_cart, nullptr);
+ add_internal_slot(config, MSX_SLOT_RAM, "ram", 3, 0, 0, 4); /* 64KB RAM */
msx1_cartlist(config);
-MACHINE_CONFIG_END
+}
/* MSX - Olympia PHC-28 */
@@ -2720,19 +2781,20 @@ ROM_START (phc28)
ROM_LOAD ("phc28bios.rom", 0x0000, 0x8000, CRC(eceb2802) SHA1(195950173701abeb460a1a070d83466f3f53b337))
ROM_END
-MACHINE_CONFIG_START(msx_state::phc28)
+void msx_state::phc28(machine_config &config)
+{
msx1(TMS9929A, config);
// AY8910/YM2149?
// FDC: None, 0 drives
// 2 Cartridge slots?
- MCFG_MSX_LAYOUT_ROM("bios", 0, 0, 0, 2, "maincpu", 0x0000)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot1", 1, 0)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot2", 2, 0)
- MCFG_MSX_LAYOUT_RAM("ram", 3, 0, 2, 2) /* 32KB RAM */
+ add_internal_slot(config, MSX_SLOT_ROM, "bios", 0, 0, 0, 2, "maincpu", 0x0000);
+ add_cartridge_slot<1>(config, MSX_SLOT_CARTRIDGE, "cartslot1", 1, 0, msx_cart, nullptr);
+ add_cartridge_slot<2>(config, MSX_SLOT_CARTRIDGE, "cartslot2", 2, 0, msx_cart, nullptr);
+ add_internal_slot(config, MSX_SLOT_RAM, "ram", 3, 0, 2, 2); /* 32KB RAM */
msx1_cartlist(config);
-MACHINE_CONFIG_END
+}
/* MSX - Panasonic CF-2700G */
@@ -2741,19 +2803,20 @@ ROM_START (cf2700g)
ROM_LOAD ("cf2700g.rom", 0x0000, 0x8000, CRC(4aa194f4) SHA1(69bf27b610e11437dad1f7a1c37a63179a293d12))
ROM_END
-MACHINE_CONFIG_START(msx_state::cf2700g)
+void msx_state::cf2700g(machine_config &config)
+{
msx1(TMS9929A, config);
// AY8910
// FDC: None, 0 drives
// 2 Cartridge slots
- MCFG_MSX_LAYOUT_ROM("bios", 0, 0, 0, 2, "maincpu", 0x0000)
- MCFG_MSX_LAYOUT_RAM("ram", 1, 0, 0, 4) /* 64KB?? RAM */
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot1", 2, 0)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot2", 3, 0)
+ add_internal_slot(config, MSX_SLOT_ROM, "bios", 0, 0, 0, 2, "maincpu", 0x0000);
+ add_internal_slot(config, MSX_SLOT_RAM, "ram", 1, 0, 0, 4); /* 64KB?? RAM */
+ add_cartridge_slot<1>(config, MSX_SLOT_CARTRIDGE, "cartslot1", 2, 0, msx_cart, nullptr);
+ add_cartridge_slot<2>(config, MSX_SLOT_CARTRIDGE, "cartslot2", 3, 0, msx_cart, nullptr);
msx1_cartlist(config);
-MACHINE_CONFIG_END
+}
/* MSX - Perfect Perfect1 */
@@ -2764,19 +2827,20 @@ ROM_START (perfect1)
ROM_RELOAD (0x10000, 0x8000)
ROM_END
-MACHINE_CONFIG_START(msx_state::perfect1)
+void msx_state::perfect1(machine_config &config)
+{
msx1(TMS9929A, config);
// AY8910/YM2149?
// FDC: None, 0 dribes
// 1 Cartridge slot
- MCFG_MSX_LAYOUT_ROM("bios", 0, 0, 0, 2, "maincpu", 0x0000)
- MCFG_MSX_LAYOUT_ROM("arab", 0, 1, 0, 4, "maincpu", 0x8000)
- MCFG_MSX_LAYOUT_RAM("ram", 0, 2, 0, 4) // 64KB RAM
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot1", 1, 0)
+ add_internal_slot(config, MSX_SLOT_ROM, "bios", 0, 0, 0, 2, "maincpu", 0x0000);
+ add_internal_slot(config, MSX_SLOT_ROM, "arab", 0, 1, 0, 4, "maincpu", 0x8000);
+ add_internal_slot(config, MSX_SLOT_RAM, "ram", 0, 2, 0, 4); // 64KB RAM
+ add_cartridge_slot<1>(config, MSX_SLOT_CARTRIDGE, "cartslot1", 1, 0, msx_cart, nullptr);
msx1_cartlist(config);
-MACHINE_CONFIG_END
+}
/* MSX - Philips NMS-801 */
@@ -2785,16 +2849,17 @@ ROM_START (nms801)
ROM_LOAD ("801bios.rom", 0x0000, 0x8000, CRC(fa089461) SHA1(21329398c0f350e330b353f45f21aa7ba338fc8d))
ROM_END
-MACHINE_CONFIG_START(msx_state::nms801)
+void msx_state::nms801(machine_config &config)
+{
msx1(TMS9929A, config);
// AY8910
// FDC: None, 0 drives
// 0 Cartridge slots
// No printer port
- MCFG_MSX_LAYOUT_ROM("bios", 0, 0, 0, 2, "maincpu", 0x0000)
- MCFG_MSX_LAYOUT_RAM("ram", 3, 0, 0, 4) /* 64KB RAM */
-MACHINE_CONFIG_END
+ add_internal_slot(config, MSX_SLOT_ROM, "bios", 0, 0, 0, 2, "maincpu", 0x0000);
+ add_internal_slot(config, MSX_SLOT_RAM, "ram", 3, 0, 0, 4); /* 64KB RAM */
+}
/* MSX - Philips VG-8000 */
@@ -2803,20 +2868,21 @@ ROM_START (vg8000)
ROM_LOAD ("8000bios.rom", 0x0000, 0x8000, CRC(efd970b0) SHA1(42252cf87deeb58181a7bfec7c874190a1351779))
ROM_END
-MACHINE_CONFIG_START(msx_state::vg8000)
+void msx_state::vg8000(machine_config &config)
+{
msx1(TMS9129, config);
// AY8910
// FDC: None, 0 drives
// 2 Cartridge slots
// No printer port
- MCFG_MSX_LAYOUT_ROM("bios", 0, 0, 0, 2, "maincpu", 0x0000)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot1", 1, 0)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot2", 2, 0)
- MCFG_MSX_LAYOUT_RAM("ram", 3, 0, 3, 1) /* 16KB RAM */
+ add_internal_slot(config, MSX_SLOT_ROM, "bios", 0, 0, 0, 2, "maincpu", 0x0000);
+ add_cartridge_slot<1>(config, MSX_SLOT_CARTRIDGE, "cartslot1", 1, 0, msx_cart, nullptr);
+ add_cartridge_slot<2>(config, MSX_SLOT_CARTRIDGE, "cartslot2", 2, 0, msx_cart, nullptr);
+ add_internal_slot(config, MSX_SLOT_RAM, "ram", 3, 0, 3, 1); /* 16KB RAM */
msx1_cartlist(config);
-MACHINE_CONFIG_END
+}
/* MSX - Philips VG-8010 */
@@ -2825,20 +2891,21 @@ ROM_START (vg8010)
ROM_LOAD ("8010bios.rom", 0x0000, 0x8000, CRC(efd970b0) SHA1(42252cf87deeb58181a7bfec7c874190a1351779))
ROM_END
-MACHINE_CONFIG_START(msx_state::vg8010)
+void msx_state::vg8010(machine_config &config)
+{
msx1(TMS9129, config);
// AY8910
// FDC: None, 0 drives
// 2 Cartridge slots
// No printer port
- MCFG_MSX_LAYOUT_ROM("bios", 0, 0, 0, 2, "maincpu", 0x0000)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot1", 1, 0)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot2", 2, 0)
- MCFG_MSX_LAYOUT_RAM("ram", 3, 0, 2, 2) /* 32KB RAM */
+ add_internal_slot(config, MSX_SLOT_ROM, "bios", 0, 0, 0, 2, "maincpu", 0x0000);
+ add_cartridge_slot<1>(config, MSX_SLOT_CARTRIDGE, "cartslot1", 1, 0, msx_cart, nullptr);
+ add_cartridge_slot<2>(config, MSX_SLOT_CARTRIDGE, "cartslot2", 2, 0, msx_cart, nullptr);
+ add_internal_slot(config, MSX_SLOT_RAM, "ram", 3, 0, 2, 2); /* 32KB RAM */
msx1_cartlist(config);
-MACHINE_CONFIG_END
+}
/* MSX - Philips VG-8010F */
@@ -2847,20 +2914,21 @@ ROM_START (vg8010f)
ROM_LOAD ("8010fbios.rom", 0x0000, 0x8000, CRC(df57c9ca) SHA1(898630ad1497dc9a329580c682ee55c4bcb9c30c))
ROM_END
-MACHINE_CONFIG_START(msx_state::vg8010f)
+void msx_state::vg8010f(machine_config &config)
+{
msx1(TMS9129, config);
// AY8910/YM2149?
// FDC: None, 0 drives
// 2 Cartridge slots
// No printer port
- MCFG_MSX_LAYOUT_ROM("bios", 0, 0, 0, 2, "maincpu", 0x0000)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot1", 1, 0)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot2", 2, 0)
- MCFG_MSX_LAYOUT_RAM("ram", 3, 0, 2, 2) /* 32KB RAM */
+ add_internal_slot(config, MSX_SLOT_ROM, "bios", 0, 0, 0, 2, "maincpu", 0x0000);
+ add_cartridge_slot<1>(config, MSX_SLOT_CARTRIDGE, "cartslot1", 1, 0, msx_cart, nullptr);
+ add_cartridge_slot<2>(config, MSX_SLOT_CARTRIDGE, "cartslot2", 2, 0, msx_cart, nullptr);
+ add_internal_slot(config, MSX_SLOT_RAM, "ram", 3, 0, 2, 2); /* 32KB RAM */
msx1_cartlist(config);
-MACHINE_CONFIG_END
+}
/* MSX - Philips VG-8020-00 */
@@ -2869,19 +2937,20 @@ ROM_START (vg802000)
ROM_LOAD ("8020-00bios.rom", 0x0000, 0x8000, CRC(8205795e) SHA1(829c00c3114f25b3dae5157c0a238b52a3ac37db))
ROM_END
-MACHINE_CONFIG_START(msx_state::vg802000)
+void msx_state::vg802000(machine_config &config)
+{
msx1(TMS9929A, config);
// YM2149
// FDC: None, 0 drives
// 2 Cartridge slots
- MCFG_MSX_LAYOUT_ROM("bios", 0, 0, 0, 2, "maincpu", 0x0000)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot1", 1, 0)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot2", 2, 0)
- MCFG_MSX_LAYOUT_RAM("ram", 3, 0, 0, 4) /* 64KB RAM */
+ add_internal_slot(config, MSX_SLOT_ROM, "bios", 0, 0, 0, 2, "maincpu", 0x0000);
+ add_cartridge_slot<1>(config, MSX_SLOT_CARTRIDGE, "cartslot1", 1, 0, msx_cart, nullptr);
+ add_cartridge_slot<2>(config, MSX_SLOT_CARTRIDGE, "cartslot2", 2, 0, msx_cart, nullptr);
+ add_internal_slot(config, MSX_SLOT_RAM, "ram", 3, 0, 0, 4); /* 64KB RAM */
msx1_cartlist(config);
-MACHINE_CONFIG_END
+}
/* MSX - Philips VG-8020-20 */
@@ -2890,20 +2959,21 @@ ROM_START (vg802020)
ROM_LOAD ("8020-20bios.rom", 0x0000, 0x8000, CRC(a317e6b4) SHA1(e998f0c441f4f1800ef44e42cd1659150206cf79))
ROM_END
-MACHINE_CONFIG_START(msx_state::vg802020)
+void msx_state::vg802020(machine_config &config)
+{
msx1(TMS9129, config);
// YM2149 (in S-3527 MSX Engine)
// FDC: None, 0 drives
// 2 Cartridge slots
// S-3527 MSX Engine
- MCFG_MSX_LAYOUT_ROM("bios", 0, 0, 0, 2, "maincpu", 0x0000)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot1", 1, 0)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot2", 2, 0)
- MCFG_MSX_LAYOUT_RAM_MM("ram_mm", 3, 2, 0x10000) /* 64KB Mapper RAM */
+ add_internal_slot(config, MSX_SLOT_ROM, "bios", 0, 0, 0, 2, "maincpu", 0x0000);
+ add_cartridge_slot<1>(config, MSX_SLOT_CARTRIDGE, "cartslot1", 1, 0, msx_cart, nullptr);
+ add_cartridge_slot<2>(config, MSX_SLOT_CARTRIDGE, "cartslot2", 2, 0, msx_cart, nullptr);
+ add_internal_slot(config, MSX_SLOT_RAM_MM, "ram_mm", 3, 2, 0, 4).set_total_size(0x10000); /* 64KB Mapper RAM */
msx1_cartlist(config);
-MACHINE_CONFIG_END
+}
/* MSX - Philips VG-8020F */
@@ -2912,20 +2982,21 @@ ROM_START (vg8020f)
ROM_LOAD ("vg8020f.rom", 0x0000, 0x8000, CRC(6e692fa1) SHA1(9eaad185efc8e224368d1db4949eb9659c26fb2c))
ROM_END
-MACHINE_CONFIG_START(msx_state::vg8020f)
+void msx_state::vg8020f(machine_config &config)
+{
msx1(TMS9929A, config);
// YM2149 (in S-3527 MSX Engine)
// FDC: None, 0 drives
// 2 Cartridge slots
// S-3527 MSX Engine
- MCFG_MSX_LAYOUT_ROM("bios", 0, 0, 0, 2, "maincpu", 0x0000)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot1", 1, 0)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot2", 2, 0)
- MCFG_MSX_LAYOUT_RAM("ram", 3, 2, 0, 4) /* 64KB?? RAM */
+ add_internal_slot(config, MSX_SLOT_ROM, "bios", 0, 0, 0, 2, "maincpu", 0x0000);
+ add_cartridge_slot<1>(config, MSX_SLOT_CARTRIDGE, "cartslot1", 1, 0, msx_cart, nullptr);
+ add_cartridge_slot<2>(config, MSX_SLOT_CARTRIDGE, "cartslot2", 2, 0, msx_cart, nullptr);
+ add_internal_slot(config, MSX_SLOT_RAM, "ram", 3, 2, 0, 4); /* 64KB?? RAM */
msx1_cartlist(config);
-MACHINE_CONFIG_END
+}
/* MSX - Pioneer PX-7 */
@@ -2936,7 +3007,8 @@ ROM_START (piopx7)
ROM_FILL( 0xa000, 0x2000, 0x6E )
ROM_END
-MACHINE_CONFIG_START(msx_state::piopx7)
+void msx_state::piopx7(machine_config &config)
+{
msx1(TMS9929A, config);
// TMS9129NL VDP with sync/overlay interface
// AY-3-8910 PSG
@@ -2962,14 +3034,14 @@ MACHINE_CONFIG_START(msx_state::piopx7)
// Bit 0 R = INTEXV (interrupt available when external video signal OFF, reset on read)
// Bit 0 W = /OVERLAY (0 = superimpose, 1 = non-superimpose)
- MCFG_MSX_LAYOUT_ROM("bios", 0, 0, 0, 2, "maincpu", 0x0000)
- MCFG_MSX_LAYOUT_RAM("ram", 0, 0, 2, 2) /* 32KB RAM */
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot1", 1, 0)
- MCFG_MSX_LAYOUT_ROM("rom2", 2, 0, 1, 1, "maincpu", 0x8000)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot2", 3, 0)
+ add_internal_slot(config, MSX_SLOT_ROM, "bios", 0, 0, 0, 2, "maincpu", 0x0000);
+ add_internal_slot(config, MSX_SLOT_RAM, "ram", 0, 0, 2, 2); /* 32KB RAM */
+ add_cartridge_slot<1>(config, MSX_SLOT_CARTRIDGE, "cartslot1", 1, 0, msx_cart, nullptr);
+ add_internal_slot(config, MSX_SLOT_ROM, "rom2", 2, 0, 1, 1, "maincpu", 0x8000);
+ add_cartridge_slot<2>(config, MSX_SLOT_CARTRIDGE, "cartslot2", 3, 0, msx_cart, nullptr);
msx1_cartlist(config);
-MACHINE_CONFIG_END
+}
/* MSX - Pioneer PX-7UK */
@@ -2981,20 +3053,21 @@ ROM_START (piopx7uk)
ROM_LOAD ("videoart.rom", 0xc000, 0x8000, CRC(0ba148dc) SHA1(b7b4e4cd40a856bb071976e6cf0f5e546fc86a78))
ROM_END
-MACHINE_CONFIG_START(msx_state::piopx7uk)
+void msx_state::piopx7uk(machine_config &config)
+{
msx1(TMS9129, config);
// AY8910/YM2149?
// FDC: None, 0 drives
// 2 Cartridge slots
- MCFG_MSX_LAYOUT_ROM("bios", 0, 0, 0, 2, "maincpu", 0x0000)
- MCFG_MSX_LAYOUT_RAM("ram", 0, 0, 2, 2) /* 32KB RAM */
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot1", 1, 0)
- MCFG_MSX_LAYOUT_ROM("rom2", 2, 0, 1, 1, "maincpu", 0x8000)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot2", 3, 0)
+ add_internal_slot(config, MSX_SLOT_ROM, "bios", 0, 0, 0, 2, "maincpu", 0x0000);
+ add_internal_slot(config, MSX_SLOT_RAM, "ram", 0, 0, 2, 2); /* 32KB RAM */
+ add_cartridge_slot<1>(config, MSX_SLOT_CARTRIDGE, "cartslot1", 1, 0, msx_cart, nullptr);
+ add_internal_slot(config, MSX_SLOT_ROM, "rom2", 2, 0, 1, 1, "maincpu", 0x8000);
+ add_cartridge_slot<2>(config, MSX_SLOT_CARTRIDGE, "cartslot2", 3, 0, msx_cart, nullptr);
msx1_cartlist(config);
-MACHINE_CONFIG_END
+}
/* MSX - Pioneer PX-V60 */
@@ -3005,20 +3078,21 @@ ROM_START (piopxv60)
ROM_FILL( 0xa000, 0x2000, 0x6E )
ROM_END
-MACHINE_CONFIG_START(msx_state::piopxv60)
+void msx_state::piopxv60(machine_config &config)
+{
msx1(TMS9128, config);
// AY8910/YM2149?
// FDC: None, 0 drives
// 2 Cartridge slots
- MCFG_MSX_LAYOUT_ROM("bios", 0, 0, 0, 2, "maincpu", 0x0000)
- MCFG_MSX_LAYOUT_RAM("ram", 0, 0, 2, 2) /* 32KB RAM */
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot1", 1, 0)
- MCFG_MSX_LAYOUT_ROM("rom2", 2, 0, 1, 1, "maincpu", 0x8000)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot2", 3, 0)
+ add_internal_slot(config, MSX_SLOT_ROM, "bios", 0, 0, 0, 2, "maincpu", 0x0000);
+ add_internal_slot(config, MSX_SLOT_RAM, "ram", 0, 0, 2, 2); /* 32KB RAM */
+ add_cartridge_slot<1>(config, MSX_SLOT_CARTRIDGE, "cartslot1", 1, 0, msx_cart, nullptr);
+ add_internal_slot(config, MSX_SLOT_ROM, "rom2", 2, 0, 1, 1, "maincpu", 0x8000);
+ add_cartridge_slot<2>(config, MSX_SLOT_CARTRIDGE, "cartslot2", 3, 0, msx_cart, nullptr);
msx1_cartlist(config);
-MACHINE_CONFIG_END
+}
/* MSX - Samsung SPC-800 */
@@ -3028,20 +3102,21 @@ ROM_START (spc800)
ROM_LOAD ("spc800han.rom", 0x8000, 0x4000, CRC(5ae2b013) SHA1(1e7616261a203580c1044205ad8766d104f1d874))
ROM_END
-MACHINE_CONFIG_START(msx_state::spc800)
+void msx_state::spc800(machine_config &config)
+{
msx1(TMS9928A, config);
// AY8910/YM2149?
// FDC: None, 0 drives
// 2 Cartridge slots?
- MCFG_MSX_LAYOUT_ROM("bios", 0, 0, 0, 2, "maincpu", 0x0000)
- MCFG_MSX_LAYOUT_ROM("han", 0, 0, 4, 1, "maincpu", 0x8000)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot1", 1, 0)
- MCFG_MSX_LAYOUT_RAM("ram", 2, 0, 0, 4) /* 64KB?? RAM */
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot2", 3, 0)
+ add_internal_slot(config, MSX_SLOT_ROM, "bios", 0, 0, 0, 2, "maincpu", 0x0000);
+ add_internal_slot(config, MSX_SLOT_ROM, "han", 0, 0, 4, 1, "maincpu", 0x8000);
+ add_cartridge_slot<1>(config, MSX_SLOT_CARTRIDGE, "cartslot1", 1, 0, msx_cart, nullptr);
+ add_internal_slot(config, MSX_SLOT_RAM, "ram", 2, 0, 0, 4); /* 64KB?? RAM */
+ add_cartridge_slot<2>(config, MSX_SLOT_CARTRIDGE, "cartslot2", 3, 0, msx_cart, nullptr);
msx1_cartlist(config);
-MACHINE_CONFIG_END
+}
/* MSX - Sanyo MPC-64 */
@@ -3050,19 +3125,20 @@ ROM_START (mpc64)
ROM_LOAD ("mpc64bios.rom", 0x0000, 0x8000, CRC(d6e704ad) SHA1(d67be6d7d56d7229418f4e122f2ec27990db7d19))
ROM_END
-MACHINE_CONFIG_START(msx_state::mpc64)
+void msx_state::mpc64(machine_config &config)
+{
msx1(TMS9928A, config);
// AY8910/YM2149?
// FDC: None, 0 drives
// 2 Cartridge slots?
- MCFG_MSX_LAYOUT_ROM("bios", 0, 0, 0, 2, "maincpu", 0x0000)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot1", 1, 0)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot2", 2, 0)
- MCFG_MSX_LAYOUT_RAM("ram", 3, 0, 0, 4) /* 64KB RAM */
+ add_internal_slot(config, MSX_SLOT_ROM, "bios", 0, 0, 0, 2, "maincpu", 0x0000);
+ add_cartridge_slot<1>(config, MSX_SLOT_CARTRIDGE, "cartslot1", 1, 0, msx_cart, nullptr);
+ add_cartridge_slot<2>(config, MSX_SLOT_CARTRIDGE, "cartslot2", 2, 0, msx_cart, nullptr);
+ add_internal_slot(config, MSX_SLOT_RAM, "ram", 3, 0, 0, 4); /* 64KB RAM */
msx1_cartlist(config);
-MACHINE_CONFIG_END
+}
/* MSX - Sanyo MPC-100 */
@@ -3071,19 +3147,20 @@ ROM_START (mpc100)
ROM_LOAD ("mpc100bios.rom", 0x0000, 0x8000, CRC(e9ccd789) SHA1(8963fc041975f31dc2ab1019cfdd4967999de53e))
ROM_END
-MACHINE_CONFIG_START(msx_state::mpc100)
+void msx_state::mpc100(machine_config &config)
+{
msx1(TMS9929A, config);
// AY8910/YM2149?
// FDC: None, 0 drives
// 2 Cartridge slots
- MCFG_MSX_LAYOUT_ROM("bios", 0, 0, 0, 2, "maincpu", 0x0000)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot1", 1, 0)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot2", 2, 0)
- MCFG_MSX_LAYOUT_RAM("ram", 3, 0, 0, 4) /* 64KB RAM */
+ add_internal_slot(config, MSX_SLOT_ROM, "bios", 0, 0, 0, 2, "maincpu", 0x0000);
+ add_cartridge_slot<1>(config, MSX_SLOT_CARTRIDGE, "cartslot1", 1, 0, msx_cart, nullptr);
+ add_cartridge_slot<2>(config, MSX_SLOT_CARTRIDGE, "cartslot2", 2, 0, msx_cart, nullptr);
+ add_internal_slot(config, MSX_SLOT_RAM, "ram", 3, 0, 0, 4); /* 64KB RAM */
msx1_cartlist(config);
-MACHINE_CONFIG_END
+}
/* MSX - Sanyo MPC-200 */
@@ -3092,7 +3169,8 @@ ROM_START (mpc200)
ROM_LOAD ("mpc200bios.rom", 0x0000, 0x8000, CRC(e9ccd789) SHA1(8963fc041975f31dc2ab1019cfdd4967999de53e))
ROM_END
-MACHINE_CONFIG_START(msx_state::mpc200)
+void msx_state::mpc200(machine_config &config)
+{
msx1(TMS9929A, config);
// AY8910/YM2149?
// FDC: None, 0 drives
@@ -3100,13 +3178,13 @@ MACHINE_CONFIG_START(msx_state::mpc200)
// T6950
// T7775 MSX Engine
- MCFG_MSX_LAYOUT_ROM("bios", 0, 0, 0, 2, "maincpu", 0x0000)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot1", 1, 0)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot2", 2, 0)
- MCFG_MSX_LAYOUT_RAM("ram", 3, 0, 0, 4) // 64KB RAM
+ add_internal_slot(config, MSX_SLOT_ROM, "bios", 0, 0, 0, 2, "maincpu", 0x0000);
+ add_cartridge_slot<1>(config, MSX_SLOT_CARTRIDGE, "cartslot1", 1, 0, msx_cart, nullptr);
+ add_cartridge_slot<2>(config, MSX_SLOT_CARTRIDGE, "cartslot2", 2, 0, msx_cart, nullptr);
+ add_internal_slot(config, MSX_SLOT_RAM, "ram", 3, 0, 0, 4); // 64KB RAM
msx1_cartlist(config);
-MACHINE_CONFIG_END
+}
/* MSX - Sanyo MPC-200SP */
@@ -3115,19 +3193,20 @@ ROM_START (mpc200sp)
ROM_LOAD ("mpcsp200bios.rom", 0x0000, 0x8000, CRC(bcd79900) SHA1(fc8c2b69351e60dc902add232032c2d69f00e41e))
ROM_END
-MACHINE_CONFIG_START(msx_state::mpc200sp)
+void msx_state::mpc200sp(machine_config &config)
+{
msx1(TMS9929A, config);
// AY8910/YM2149?
// FDC: None, 0 drives
// 2? Cartridge slots
- MCFG_MSX_LAYOUT_ROM("bios", 0, 0, 0, 2, "maincpu", 0x0000)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot1", 1, 0)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot2", 2, 0)
- MCFG_MSX_LAYOUT_RAM("ram", 3, 0, 0, 4) // 64KB RAM
+ add_internal_slot(config, MSX_SLOT_ROM, "bios", 0, 0, 0, 2, "maincpu", 0x0000);
+ add_cartridge_slot<1>(config, MSX_SLOT_CARTRIDGE, "cartslot1", 1, 0, msx_cart, nullptr);
+ add_cartridge_slot<2>(config, MSX_SLOT_CARTRIDGE, "cartslot2", 2, 0, msx_cart, nullptr);
+ add_internal_slot(config, MSX_SLOT_RAM, "ram", 3, 0, 0, 4); // 64KB RAM
msx1_cartlist(config);
-MACHINE_CONFIG_END
+}
/* MSX - Sanyo PHC-28L */
@@ -3136,19 +3215,20 @@ ROM_START (phc28l)
ROM_LOAD ("28lbios.rom", 0x0000, 0x8000, CRC(d2110d66) SHA1(d3af963e2529662eae63f04a2530454685a1989f))
ROM_END
-MACHINE_CONFIG_START(msx_state::phc28l)
+void msx_state::phc28l(machine_config &config)
+{
msx1(TMS9929A, config);
// YM2149
// FDC: None, 0 drives
// 2 Cartridge slots
- MCFG_MSX_LAYOUT_ROM("bios", 0, 0, 0, 2, "maincpu", 0x0000)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot1", 1, 0)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot2", 2, 0)
- MCFG_MSX_LAYOUT_RAM("ram", 3, 0, 0, 4) /* 64KB RAM */
+ add_internal_slot(config, MSX_SLOT_ROM, "bios", 0, 0, 0, 2, "maincpu", 0x0000);
+ add_cartridge_slot<1>(config, MSX_SLOT_CARTRIDGE, "cartslot1", 1, 0, msx_cart, nullptr);
+ add_cartridge_slot<2>(config, MSX_SLOT_CARTRIDGE, "cartslot2", 2, 0, msx_cart, nullptr);
+ add_internal_slot(config, MSX_SLOT_RAM, "ram", 3, 0, 0, 4); /* 64KB RAM */
msx1_cartlist(config);
-MACHINE_CONFIG_END
+}
/* MSX - Sanyo PHC-28S */
@@ -3157,19 +3237,20 @@ ROM_START (phc28s)
ROM_LOAD ("28sbios.rom", 0x0000, 0x8000, CRC(e5cf6b3c) SHA1(b1cce60ef61c058f5e42ef7ac635018d1a431168))
ROM_END
-MACHINE_CONFIG_START(msx_state::phc28s)
+void msx_state::phc28s(machine_config &config)
+{
msx1(TMS9929A, config);
// AY8910/YM2149?
// FDC: None, 0 drives
// 2 Cartridge slots?
- MCFG_MSX_LAYOUT_ROM("bios", 0, 0, 0, 2, "maincpu", 0x0000)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot1", 1, 0)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot2", 2, 0)
- MCFG_MSX_LAYOUT_RAM("ram", 3, 0, 2, 2) /* 32KB RAM */
+ add_internal_slot(config, MSX_SLOT_ROM, "bios", 0, 0, 0, 2, "maincpu", 0x0000);
+ add_cartridge_slot<1>(config, MSX_SLOT_CARTRIDGE, "cartslot1", 1, 0, msx_cart, nullptr);
+ add_cartridge_slot<2>(config, MSX_SLOT_CARTRIDGE, "cartslot2", 2, 0, msx_cart, nullptr);
+ add_internal_slot(config, MSX_SLOT_RAM, "ram", 3, 0, 2, 2); /* 32KB RAM */
msx1_cartlist(config);
-MACHINE_CONFIG_END
+}
/* MSX - Sanyo Wavy MPC-10 */
@@ -3178,19 +3259,20 @@ ROM_START (mpc10)
ROM_LOAD ("mpc10.rom", 0x0000, 0x8000, CRC(e9ccd789) SHA1(8963fc041975f31dc2ab1019cfdd4967999de53e))
ROM_END
-MACHINE_CONFIG_START(msx_state::mpc10)
+void msx_state::mpc10(machine_config &config)
+{
msx1(TMS9929A, config);
// AY8910/YM2149?
// FDC: None, 0 drives
// 2 Cartridge slots?
- MCFG_MSX_LAYOUT_ROM("bios", 0, 0, 0, 2, "maincpu", 0x0000)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot1", 1, 0)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot2", 2, 0)
- MCFG_MSX_LAYOUT_RAM("ram", 3, 0, 2, 2) /* 32KB RAM */
+ add_internal_slot(config, MSX_SLOT_ROM, "bios", 0, 0, 0, 2, "maincpu", 0x0000);
+ add_cartridge_slot<1>(config, MSX_SLOT_CARTRIDGE, "cartslot1", 1, 0, msx_cart, nullptr);
+ add_cartridge_slot<2>(config, MSX_SLOT_CARTRIDGE, "cartslot2", 2, 0, msx_cart, nullptr);
+ add_internal_slot(config, MSX_SLOT_RAM, "ram", 3, 0, 2, 2); /* 32KB RAM */
msx1_cartlist(config);
-MACHINE_CONFIG_END
+}
/* MSX - Sharp Epcom HotBit 1.1 */
@@ -3199,19 +3281,20 @@ ROM_START (hotbit11)
ROM_LOAD ("hotbit11.rom", 0x0000, 0x8000, CRC(b6942694) SHA1(663f8c512d04d213fa616b0db5eefe3774012a4b))
ROM_END
-MACHINE_CONFIG_START(msx_state::hotbit11)
+void msx_state::hotbit11(machine_config &config)
+{
msx1(TMS9128, config);
// AY8910/YM2149?
// FDC: None, 0 drives
// 2 Cartridge slots
- MCFG_MSX_LAYOUT_ROM("bios", 0, 0, 0, 2, "maincpu", 0x0000)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot1", 1, 0)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot2", 2, 0)
- MCFG_MSX_LAYOUT_RAM("ram", 3, 0, 0, 4) /* 64KB RAM */
+ add_internal_slot(config, MSX_SLOT_ROM, "bios", 0, 0, 0, 2, "maincpu", 0x0000);
+ add_cartridge_slot<1>(config, MSX_SLOT_CARTRIDGE, "cartslot1", 1, 0, msx_cart, nullptr);
+ add_cartridge_slot<2>(config, MSX_SLOT_CARTRIDGE, "cartslot2", 2, 0, msx_cart, nullptr);
+ add_internal_slot(config, MSX_SLOT_RAM, "ram", 3, 0, 0, 4); /* 64KB RAM */
msx1_cartlist(config);
-MACHINE_CONFIG_END
+}
/* MSX - Sharp Epcom HotBit 1.2 */
@@ -3220,19 +3303,20 @@ ROM_START (hotbit12)
ROM_LOAD ("hotbit12.rom", 0x0000, 0x8000, CRC(f59a4a0c) SHA1(9425815446d468058705bae545ffa13646744a87))
ROM_END
-MACHINE_CONFIG_START(msx_state::hotbit12)
+void msx_state::hotbit12(machine_config &config)
+{
msx1(TMS9128, config);
// AY8910/YM2149?
// FDC: None, 0 drives
// 2 Cartridge slots
- MCFG_MSX_LAYOUT_ROM("bios", 0, 0, 0, 2, "maincpu", 0x0000)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot1", 1, 0)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot2", 2, 0)
- MCFG_MSX_LAYOUT_RAM("ram", 3, 0, 0, 4) /* 64KB RAM */
+ add_internal_slot(config, MSX_SLOT_ROM, "bios", 0, 0, 0, 2, "maincpu", 0x0000);
+ add_cartridge_slot<1>(config, MSX_SLOT_CARTRIDGE, "cartslot1", 1, 0, msx_cart, nullptr);
+ add_cartridge_slot<2>(config, MSX_SLOT_CARTRIDGE, "cartslot2", 2, 0, msx_cart, nullptr);
+ add_internal_slot(config, MSX_SLOT_RAM, "ram", 3, 0, 0, 4); /* 64KB RAM */
msx1_cartlist(config);
-MACHINE_CONFIG_END
+}
/* MSX - Sharp Epcom HotBit 1.3b */
@@ -3241,19 +3325,20 @@ ROM_START (hotbi13b)
ROM_LOAD ("hotbit13b.rom", 0x0000, 0x8000, CRC(7a19820e) SHA1(e0c2bfb078562d15acabc5831020a2370ea87052))
ROM_END
-MACHINE_CONFIG_START(msx_state::hotbi13b)
+void msx_state::hotbi13b(machine_config &config)
+{
msx1(TMS9928A, config);
// AY8910/YM2149?
// FDC: None, 0 drives
// 2 Cartridge slots?
- MCFG_MSX_LAYOUT_ROM("bios", 0, 0, 0, 2, "maincpu", 0x0000)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot1", 1, 0)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot2", 2, 0)
- MCFG_MSX_LAYOUT_RAM_MM("ram_mm", 3, 0, 0x10000) /* 64KB Mapper RAM */
+ add_internal_slot(config, MSX_SLOT_ROM, "bios", 0, 0, 0, 2, "maincpu", 0x0000);
+ add_cartridge_slot<1>(config, MSX_SLOT_CARTRIDGE, "cartslot1", 1, 0, msx_cart, nullptr);
+ add_cartridge_slot<2>(config, MSX_SLOT_CARTRIDGE, "cartslot2", 2, 0, msx_cart, nullptr);
+ add_internal_slot(config, MSX_SLOT_RAM_MM, "ram_mm", 3, 0, 0, 4).set_total_size(0x10000); /* 64KB Mapper RAM */
msx1_cartlist(config);
-MACHINE_CONFIG_END
+}
/* MSX - Sharp Epcom HotBit 1.3p */
@@ -3262,19 +3347,20 @@ ROM_START (hotbi13p)
ROM_LOAD ("hotbit13p.rom", 0x0000, 0x8000, CRC(150e239c) SHA1(942f9507d206cd8156f15601fe8032fcf0e3875b))
ROM_END
-MACHINE_CONFIG_START(msx_state::hotbi13p)
+void msx_state::hotbi13p(machine_config &config)
+{
msx1(TMS9928A, config);
// AY8910/YM2149?
// FDC: None, 0 drives
// 2 Cartridge slots?
- MCFG_MSX_LAYOUT_ROM("bios", 0, 0, 0, 2, "maincpu", 0x0000)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot1", 1, 0)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot2", 2, 0)
- MCFG_MSX_LAYOUT_RAM_MM("ram_mm", 3, 0, 0x10000) /* 64KB Mapper RAM */
+ add_internal_slot(config, MSX_SLOT_ROM, "bios", 0, 0, 0, 2, "maincpu", 0x0000);
+ add_cartridge_slot<1>(config, MSX_SLOT_CARTRIDGE, "cartslot1", 1, 0, msx_cart, nullptr);
+ add_cartridge_slot<2>(config, MSX_SLOT_CARTRIDGE, "cartslot2", 2, 0, msx_cart, nullptr);
+ add_internal_slot(config, MSX_SLOT_RAM_MM, "ram_mm", 3, 0, 0, 4).set_total_size(0x10000); /* 64KB Mapper RAM */
msx1_cartlist(config);
-MACHINE_CONFIG_END
+}
/* MSX - Sony HB-10 */
@@ -3283,22 +3369,23 @@ ROM_START (hb10)
ROM_LOAD ("hb10bios.rom", 0x0000, 0x8000, CRC(ee229390) SHA1(302afb5d8be26c758309ca3df611ae69cced2821))
ROM_END
-MACHINE_CONFIG_START(msx_state::hb10)
+void msx_state::hb10(machine_config &config)
+{
msx1(TMS9928A, config);
// YM2149 (in S-1985 MSX-Engine)
// FDC: None, 0 drives
// 2 Cartridge slots
// S-1985 MSX-Engine
- MCFG_MSX_LAYOUT_ROM("bios", 0, 0, 0, 2, "maincpu", 0x0000)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot1", 1, 0)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot2", 2, 0)
- MCFG_MSX_LAYOUT_RAM("ram", 3, 0, 3, 1) /* 16KB? RAM */
+ add_internal_slot(config, MSX_SLOT_ROM, "bios", 0, 0, 0, 2, "maincpu", 0x0000);
+ add_cartridge_slot<1>(config, MSX_SLOT_CARTRIDGE, "cartslot1", 1, 0, msx_cart, nullptr);
+ add_cartridge_slot<2>(config, MSX_SLOT_CARTRIDGE, "cartslot2", 2, 0, msx_cart, nullptr);
+ add_internal_slot(config, MSX_SLOT_RAM, "ram", 3, 0, 3, 1); /* 16KB? RAM */
MSX_S1985(config, "s1985", 0);
msx1_cartlist(config);
-MACHINE_CONFIG_END
+}
/* MSX - Sony HB-10P */
@@ -3307,20 +3394,21 @@ ROM_START (hb10p)
ROM_LOAD ("10pbios.rom", 0x0000, 0x8000, CRC(0f488dd8) SHA1(5e7c8eab238712d1e18b0219c0f4d4dae180420d))
ROM_END
-MACHINE_CONFIG_START(msx_state::hb10p)
+void msx_state::hb10p(machine_config &config)
+{
msx1(TMS9929A, config);
// AY8910/YM2149?
// FDC: None, 0 drives
// 2 Cartridge slots
// T6950
- MCFG_MSX_LAYOUT_ROM("bios", 0, 0, 0, 2, "maincpu", 0x0000)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot1", 1, 0)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot2", 2, 0)
- MCFG_MSX_LAYOUT_RAM("ram", 3, 0, 0, 4) /* 64KB RAM */
+ add_internal_slot(config, MSX_SLOT_ROM, "bios", 0, 0, 0, 2, "maincpu", 0x0000);
+ add_cartridge_slot<1>(config, MSX_SLOT_CARTRIDGE, "cartslot1", 1, 0, msx_cart, nullptr);
+ add_cartridge_slot<2>(config, MSX_SLOT_CARTRIDGE, "cartslot2", 2, 0, msx_cart, nullptr);
+ add_internal_slot(config, MSX_SLOT_RAM, "ram", 3, 0, 0, 4); /* 64KB RAM */
msx1_cartlist(config);
-MACHINE_CONFIG_END
+}
/* MSX - Sony HB-20P */
@@ -3329,20 +3417,21 @@ ROM_START (hb20p)
ROM_LOAD ("20pbios.rom", 0x0000, 0x8000, CRC(21af423f) SHA1(365c93d7652c9f727221689bcc348652832a7b7a))
ROM_END
-MACHINE_CONFIG_START(msx_state::hb20p)
+void msx_state::hb20p(machine_config &config)
+{
msx1(TMS9929A, config);
// AY8910/YM2149?
// FDC: None, 0 drives
// 2 Cartridge slots
// T6950
- MCFG_MSX_LAYOUT_ROM("bios", 0, 0, 0, 2, "maincpu", 0x0000)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot1", 1, 0)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot2", 2, 0)
- MCFG_MSX_LAYOUT_RAM("ram", 3, 0, 0, 4) /* 64KB RAM */
+ add_internal_slot(config, MSX_SLOT_ROM, "bios", 0, 0, 0, 2, "maincpu", 0x0000);
+ add_cartridge_slot<1>(config, MSX_SLOT_CARTRIDGE, "cartslot1", 1, 0, msx_cart, nullptr);
+ add_cartridge_slot<2>(config, MSX_SLOT_CARTRIDGE, "cartslot2", 2, 0, msx_cart, nullptr);
+ add_internal_slot(config, MSX_SLOT_RAM, "ram", 3, 0, 0, 4); /* 64KB RAM */
msx1_cartlist(config);
-MACHINE_CONFIG_END
+}
/* MSX - Sony HB-201 */
@@ -3353,20 +3442,21 @@ ROM_START (hb201)
ROM_FILL( 0xc000, 0x4000, 0xff )
ROM_END
-MACHINE_CONFIG_START(msx_state::hb201)
+void msx_state::hb201(machine_config &config)
+{
msx1(TMS9928A, config);
// AY8910/YM2149?
// FDC: None, 0 drives
// 2 Cartridge slots?
- MCFG_MSX_LAYOUT_ROM("bios", 0, 0, 0, 2, "maincpu", 0x0000)
- MCFG_MSX_LAYOUT_ROM("note", 0, 0, 2, 2, "maincpu", 0x8000)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot1", 1, 0)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot2", 2, 0)
- MCFG_MSX_LAYOUT_RAM("ram", 3, 0, 0, 4) /* 64KB RAM */
+ add_internal_slot(config, MSX_SLOT_ROM, "bios", 0, 0, 0, 2, "maincpu", 0x0000);
+ add_internal_slot(config, MSX_SLOT_ROM, "note", 0, 0, 2, 2, "maincpu", 0x8000);
+ add_cartridge_slot<1>(config, MSX_SLOT_CARTRIDGE, "cartslot1", 1, 0, msx_cart, nullptr);
+ add_cartridge_slot<2>(config, MSX_SLOT_CARTRIDGE, "cartslot2", 2, 0, msx_cart, nullptr);
+ add_internal_slot(config, MSX_SLOT_RAM, "ram", 3, 0, 0, 4); /* 64KB RAM */
msx1_cartlist(config);
-MACHINE_CONFIG_END
+}
/* MSX - Sony HB-201P */
@@ -3376,20 +3466,21 @@ ROM_START (hb201p)
ROM_LOAD ("201pnote.rom.ic8", 0x8000, 0x4000, CRC(1ff9b6ec) SHA1(e84d3ec7a595ee36b50e979683c84105c1871857))
ROM_END
-MACHINE_CONFIG_START(msx_state::hb201p)
+void msx_state::hb201p(machine_config &config)
+{
msx1(TMS9929A, config);
// YM2149
// FDC: None, 0 drives
// 2 Cartridge slots
- MCFG_MSX_LAYOUT_ROM("bios", 0, 0, 0, 2, "maincpu", 0x0000)
- MCFG_MSX_LAYOUT_ROM("note", 0, 0, 2, 1, "maincpu", 0x8000)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot1", 1, 0)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot2", 2, 0)
- MCFG_MSX_LAYOUT_RAM("ram", 3, 0, 0, 4) /* 64KB RAM */
+ add_internal_slot(config, MSX_SLOT_ROM, "bios", 0, 0, 0, 2, "maincpu", 0x0000);
+ add_internal_slot(config, MSX_SLOT_ROM, "note", 0, 0, 2, 1, "maincpu", 0x8000);
+ add_cartridge_slot<1>(config, MSX_SLOT_CARTRIDGE, "cartslot1", 1, 0, msx_cart, nullptr);
+ add_cartridge_slot<2>(config, MSX_SLOT_CARTRIDGE, "cartslot2", 2, 0, msx_cart, nullptr);
+ add_internal_slot(config, MSX_SLOT_RAM, "ram", 3, 0, 0, 4); /* 64KB RAM */
msx1_cartlist(config);
-MACHINE_CONFIG_END
+}
/* MSX - Sony HB-501P */
@@ -3398,19 +3489,20 @@ ROM_START (hb501p)
ROM_LOAD ("501pbios.rom", 0x0000, 0x8000, CRC(0f488dd8) SHA1(5e7c8eab238712d1e18b0219c0f4d4dae180420d))
ROM_END
-MACHINE_CONFIG_START(msx_state::hb501p)
+void msx_state::hb501p(machine_config &config)
+{
msx1(TMS9929A, config);
// AY8910/YM2149?
// FDC: None, 0 drives
// 2 Cartridge slots
- MCFG_MSX_LAYOUT_ROM("bios", 0, 0, 0, 2, "maincpu", 0x0000)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot1", 1, 0)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot2", 2, 0)
- MCFG_MSX_LAYOUT_RAM("ram", 3, 0, 0, 4) /* 64KB RAM */
+ add_internal_slot(config, MSX_SLOT_ROM, "bios", 0, 0, 0, 2, "maincpu", 0x0000);
+ add_cartridge_slot<1>(config, MSX_SLOT_CARTRIDGE, "cartslot1", 1, 0, msx_cart, nullptr);
+ add_cartridge_slot<2>(config, MSX_SLOT_CARTRIDGE, "cartslot2", 2, 0, msx_cart, nullptr);
+ add_internal_slot(config, MSX_SLOT_RAM, "ram", 3, 0, 0, 4); /* 64KB RAM */
msx1_cartlist(config);
-MACHINE_CONFIG_END
+}
/* MSX - Sony HB-55 (Version 1) */
@@ -3420,20 +3512,21 @@ ROM_START (hb55)
ROM_LOAD ("hb55note.rom", 0x8000, 0x2000, CRC(5743ab55) SHA1(b9179db93608c4da649532e704f072e0a3ea1b22))
ROM_END
-MACHINE_CONFIG_START(msx_state::hb55)
+void msx_state::hb55(machine_config &config)
+{
msx1(TMS9928A, config);
// AY8910/YM2149?
// FDC: None, 0 drives
// 2 Cartridge slots?
- MCFG_MSX_LAYOUT_ROM("bios", 0, 0, 0, 2, "maincpu", 0x0000)
- MCFG_MSX_LAYOUT_ROM("note", 0, 0, 2, 1, "maincpu", 0x8000)
- MCFG_MSX_LAYOUT_RAM("ram", 0, 0, 3, 1) /* 16KB RAM */
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot1", 1, 0)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot2", 3, 0)
+ add_internal_slot(config, MSX_SLOT_ROM, "bios", 0, 0, 0, 2, "maincpu", 0x0000);
+ add_internal_slot(config, MSX_SLOT_ROM, "note", 0, 0, 2, 1, "maincpu", 0x8000);
+ add_internal_slot(config, MSX_SLOT_RAM, "ram", 0, 0, 3, 1); /* 16KB RAM */
+ add_cartridge_slot<1>(config, MSX_SLOT_CARTRIDGE, "cartslot1", 1, 0, msx_cart, nullptr);
+ add_cartridge_slot<2>(config, MSX_SLOT_CARTRIDGE, "cartslot2", 3, 0, msx_cart, nullptr);
msx1_cartlist(config);
-MACHINE_CONFIG_END
+}
/* MSX - Sony HB-55D */
@@ -3443,20 +3536,21 @@ ROM_START (hb55d)
ROM_LOAD ("55dnote.rom", 0x8000, 0x4000, CRC(8aae0494) SHA1(97ce59892573cac3c440efff6d74c8a1c29a5ad3))
ROM_END
-MACHINE_CONFIG_START(msx_state::hb55d)
+void msx_state::hb55d(machine_config &config)
+{
msx1(TMS9929A, config);
// AY8910/YM2149?
// FDC: None, 0 drives
// 2 Cartridge slots?
- MCFG_MSX_LAYOUT_ROM("bios", 0, 0, 0, 2, "maincpu", 0x0000)
- MCFG_MSX_LAYOUT_ROM("note", 0, 0, 2, 1, "maincpu", 0x8000)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot1", 1, 0)
- MCFG_MSX_LAYOUT_RAM("ram", 2, 0, 3, 1) /* 16KB RAM */
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot2", 3, 0)
+ add_internal_slot(config, MSX_SLOT_ROM, "bios", 0, 0, 0, 2, "maincpu", 0x0000);
+ add_internal_slot(config, MSX_SLOT_ROM, "note", 0, 0, 2, 1, "maincpu", 0x8000);
+ add_cartridge_slot<1>(config, MSX_SLOT_CARTRIDGE, "cartslot1", 1, 0, msx_cart, nullptr);
+ add_internal_slot(config, MSX_SLOT_RAM, "ram", 2, 0, 3, 1); /* 16KB RAM */
+ add_cartridge_slot<2>(config, MSX_SLOT_CARTRIDGE, "cartslot2", 3, 0, msx_cart, nullptr);
msx1_cartlist(config);
-MACHINE_CONFIG_END
+}
/* MSX - Sony HB-55P */
@@ -3467,20 +3561,21 @@ ROM_START (hb55p)
ROM_LOAD ("55pnote.ic44", 0x8000, 0x4000, CRC(492b12f8) SHA1(b262aedc71b445303f84efe5e865cbb71fd7d952))
ROM_END
-MACHINE_CONFIG_START(msx_state::hb55p)
+void msx_state::hb55p(machine_config &config)
+{
msx1(TMS9929A, config);
// AY8910
// FDC: None, 0 drives
// 2 Cartridge slots
- MCFG_MSX_LAYOUT_ROM("bios", 0, 0, 0, 2, "maincpu", 0x0000)
- MCFG_MSX_LAYOUT_ROM("note", 0, 0, 2, 1, "maincpu", 0x8000)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot1", 1, 0)
- MCFG_MSX_LAYOUT_RAM("ram", 2, 0, 3, 1) /* 16KB RAM */
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot2", 3, 0)
+ add_internal_slot(config, MSX_SLOT_ROM, "bios", 0, 0, 0, 2, "maincpu", 0x0000);
+ add_internal_slot(config, MSX_SLOT_ROM, "note", 0, 0, 2, 1, "maincpu", 0x8000);
+ add_cartridge_slot<1>(config, MSX_SLOT_CARTRIDGE, "cartslot1", 1, 0, msx_cart, nullptr);
+ add_internal_slot(config, MSX_SLOT_RAM, "ram", 2, 0, 3, 1); /* 16KB RAM */
+ add_cartridge_slot<2>(config, MSX_SLOT_CARTRIDGE, "cartslot2", 3, 0, msx_cart, nullptr);
msx1_cartlist(config);
-MACHINE_CONFIG_END
+}
/* MSX - Sony HB-75D */
@@ -3490,20 +3585,21 @@ ROM_START (hb75d)
ROM_LOAD ("75dnote.rom", 0x8000, 0x4000, CRC(8aae0494) SHA1(97ce59892573cac3c440efff6d74c8a1c29a5ad3))
ROM_END
-MACHINE_CONFIG_START(msx_state::hb75d)
+void msx_state::hb75d(machine_config &config)
+{
msx1(TMS9929A, config);
// AY8910/YM2149?
// FDC: None, 0 drives
// 2 Cartridge slots?
- MCFG_MSX_LAYOUT_ROM("bios", 0, 0, 0, 2, "maincpu", 0x0000)
- MCFG_MSX_LAYOUT_ROM("note", 0, 0, 2, 1, "maincpu", 0x8000)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot1", 1, 0)
- MCFG_MSX_LAYOUT_RAM("ram", 2, 0, 0, 4) /* 64KB RAM */
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot2", 3, 0)
+ add_internal_slot(config, MSX_SLOT_ROM, "bios", 0, 0, 0, 2, "maincpu", 0x0000);
+ add_internal_slot(config, MSX_SLOT_ROM, "note", 0, 0, 2, 1, "maincpu", 0x8000);
+ add_cartridge_slot<1>(config, MSX_SLOT_CARTRIDGE, "cartslot1", 1, 0, msx_cart, nullptr);
+ add_internal_slot(config, MSX_SLOT_RAM, "ram", 2, 0, 0, 4); /* 64KB RAM */
+ add_cartridge_slot<2>(config, MSX_SLOT_CARTRIDGE, "cartslot2", 3, 0, msx_cart, nullptr);
msx1_cartlist(config);
-MACHINE_CONFIG_END
+}
/* MSX - Sony HB-75P */
@@ -3514,20 +3610,21 @@ ROM_START (hb75p)
ROM_LOAD ("75pnote.ic44", 0x8000, 0x4000, CRC(492b12f8) SHA1(b262aedc71b445303f84efe5e865cbb71fd7d952))
ROM_END
-MACHINE_CONFIG_START(msx_state::hb75p)
+void msx_state::hb75p(machine_config &config)
+{
msx1(TMS9929A, config);
// AY8910
// FDC: None, 0 drives
// 2 Cartridge slots?
- MCFG_MSX_LAYOUT_ROM("bios", 0, 0, 0, 2, "maincpu", 0x0000)
- MCFG_MSX_LAYOUT_ROM("note", 0, 0, 2, 1, "maincpu", 0x8000)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot1", 1, 0)
- MCFG_MSX_LAYOUT_RAM("ram", 2, 0, 0, 4) /* 64KB RAM */
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot2", 3, 0)
+ add_internal_slot(config, MSX_SLOT_ROM, "bios", 0, 0, 0, 2, "maincpu", 0x0000);
+ add_internal_slot(config, MSX_SLOT_ROM, "note", 0, 0, 2, 1, "maincpu", 0x8000);
+ add_cartridge_slot<1>(config, MSX_SLOT_CARTRIDGE, "cartslot1", 1, 0, msx_cart, nullptr);
+ add_internal_slot(config, MSX_SLOT_RAM, "ram", 2, 0, 0, 4); /* 64KB RAM */
+ add_cartridge_slot<2>(config, MSX_SLOT_CARTRIDGE, "cartslot2", 3, 0, msx_cart, nullptr);
msx1_cartlist(config);
-MACHINE_CONFIG_END
+}
/* MSX - Sony HB-101P */
@@ -3537,20 +3634,21 @@ ROM_START (hb101p)
ROM_LOAD ("101pnote.rom", 0x8000, 0x4000, CRC(525017c2) SHA1(8ffc24677fd9d2606a79718764261cdf02434f0a))
ROM_END
-MACHINE_CONFIG_START(msx_state::hb101p)
+void msx_state::hb101p(machine_config &config)
+{
msx1(TMS9929A, config);
// AY8910/YM2149?
// FDC: None, 0 drives
// 2 Cartridge slots
- MCFG_MSX_LAYOUT_ROM("bios", 0, 0, 0, 2, "maincpu", 0x0000)
- MCFG_MSX_LAYOUT_RAM("ram", 0, 0, 2, 2) /* 32KB RAM */
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot1", 1, 0)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot2", 2, 0)
- MCFG_MSX_LAYOUT_ROM("note", 3, 0, 1, 1, "maincpu", 0x8000)
+ add_internal_slot(config, MSX_SLOT_ROM, "bios", 0, 0, 0, 2, "maincpu", 0x0000);
+ add_internal_slot(config, MSX_SLOT_RAM, "ram", 0, 0, 2, 2); /* 32KB RAM */
+ add_cartridge_slot<1>(config, MSX_SLOT_CARTRIDGE, "cartslot1", 1, 0, msx_cart, nullptr);
+ add_cartridge_slot<2>(config, MSX_SLOT_CARTRIDGE, "cartslot2", 2, 0, msx_cart, nullptr);
+ add_internal_slot(config, MSX_SLOT_ROM, "note", 3, 0, 1, 1, "maincpu", 0x8000);
msx1_cartlist(config);
-MACHINE_CONFIG_END
+}
/* MSX - Sony HB-701FD */
@@ -3560,25 +3658,26 @@ ROM_START (hb701fd)
ROM_LOAD ("hb701fddisk.rom", 0x8000, 0x4000, CRC(71961d9d) SHA1(2144036d6573d666143e890e5413956bfe8f66c5))
ROM_END
-MACHINE_CONFIG_START(msx_state::hb701fd)
+void msx_state::hb701fd(machine_config &config)
+{
msx1(TMS9928A, config);
// YM2149 (in S-1985)
// FDC: WD2793?, 1 3.5" SSDD drive
// 2 Cartridge slots
// S-1985 MSX Engine
- MCFG_MSX_LAYOUT_ROM("bios", 0, 0, 0, 2, "maincpu", 0x0000)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot1", 1, 0)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot2", 2, 0)
- MCFG_MSX_LAYOUT_RAM("ram", 3, 0, 0, 4) /* 64KB RAM */
- MCFG_MSX_LAYOUT_DISK1("disk", 3, 1, 1, 1, "maincpu", 0x8000) // Is this correct??
+ add_internal_slot(config, MSX_SLOT_ROM, "bios", 0, 0, 0, 2, "maincpu", 0x0000);
+ add_cartridge_slot<1>(config, MSX_SLOT_CARTRIDGE, "cartslot1", 1, 0, msx_cart, nullptr);
+ add_cartridge_slot<2>(config, MSX_SLOT_CARTRIDGE, "cartslot2", 2, 0, msx_cart, nullptr);
+ add_internal_slot(config, MSX_SLOT_RAM, "ram", 3, 0, 0, 4); /* 64KB RAM */
+ add_internal_slot_mirrored(config, MSX_SLOT_DISK1, "disk", 3, 1, 1, 2, "maincpu", 0x8000).set_tags("fdc", "fdc:0", "fdc:1"); // Is this correct??
msx_wd2793_force_ready(config);
msx_1_35_ssdd_drive(config);
msx1_floplist(config);
msx1_cartlist(config);
-MACHINE_CONFIG_END
+}
/* MSX - Spectravideo SVI-728 */
@@ -3588,20 +3687,21 @@ ROM_START (svi728)
// ROM_LOAD ("707disk.rom", 0x8000, 0x4000, CRC(f9978853) SHA1(6aa856cc56eb98863c9da7a566571605682b5c6b))
ROM_END
-MACHINE_CONFIG_START(msx_state::svi728)
+void msx_state::svi728(machine_config &config)
+{
msx1(TMS9129, config);
// AY8910
// FDC: None, 0 drives
// 1 Cartridge slots, 1 Expansion slot (eg for SVI-707)
- MCFG_MSX_LAYOUT_ROM("bios", 0, 0, 0, 2, "maincpu", 0x0000)
- MCFG_MSX_LAYOUT_RAM("ram", 1, 0, 0, 4) /* 64KB RAM */
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot", 2, 0)
+ add_internal_slot(config, MSX_SLOT_ROM, "bios", 0, 0, 0, 2, "maincpu", 0x0000);
+ add_internal_slot(config, MSX_SLOT_RAM, "ram", 1, 0, 0, 4); /* 64KB RAM */
+ add_cartridge_slot<1>(config, MSX_SLOT_CARTRIDGE, "cartslot", 2, 0, msx_cart, nullptr);
// MSX_LAYOUT_SLOT (3, 0, 1, 1, DISK_ROM2, 0x4000, 0x8000)
// MSX_LAYOUT_SLOT (3, 1, 0, 4, CARTRIDGE2, 0x0000, 0x0000)
msx1_cartlist(config);
-MACHINE_CONFIG_END
+}
/* MSX - Spectravideo SVI-738 */
@@ -3613,7 +3713,8 @@ ROM_START (svi738)
ROM_FILL (0xe000, 0x2000, 0xff)
ROM_END
-MACHINE_CONFIG_START(msx_state::svi738)
+void msx_state::svi738(machine_config &config)
+{
msx1(TMS9929A, config);
// AY8910
// FDC: wd1793, 1 3.5" SSDD drive
@@ -3621,19 +3722,19 @@ MACHINE_CONFIG_START(msx_state::svi738)
// builtin 80 columns card (V9938)
// RS-232C interface
- MCFG_MSX_LAYOUT_ROM("bios", 0, 0, 0, 2, "maincpu", 0x0000)
- MCFG_MSX_LAYOUT_RAM("ram", 1, 0, 0, 4) /* 64KB RAM */
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot1", 2, 0)
- MCFG_MSX_LAYOUT_ROM("rs232", 3, 0, 1, 1, "maincpu", 0xc000)
- MCFG_MSX_LAYOUT_DISK2("disk", 3, 1, 1, 1, "maincpu", 0x8000)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot2", 3, 2)
+ add_internal_slot(config, MSX_SLOT_ROM, "bios", 0, 0, 0, 2, "maincpu", 0x0000);
+ add_internal_slot(config, MSX_SLOT_RAM, "ram", 1, 0, 0, 4); /* 64KB RAM */
+ add_cartridge_slot<1>(config, MSX_SLOT_CARTRIDGE, "cartslot1", 2, 0, msx_cart, nullptr);
+ add_internal_slot(config, MSX_SLOT_ROM, "rs232", 3, 0, 1, 1, "maincpu", 0xc000);
+ add_internal_slot_mirrored(config, MSX_SLOT_DISK2, "disk", 3, 1, 1, 2, "maincpu", 0x8000).set_tags("fdc", "fdc:0", "fdc:1");
+ add_cartridge_slot<2>(config, MSX_SLOT_CARTRIDGE, "cartslot2", 3, 2, msx_cart, nullptr);
msx_fd1793(config);
msx_1_35_ssdd_drive(config);
msx1_floplist(config);
msx1_cartlist(config);
-MACHINE_CONFIG_END
+}
/* MSX - Spectravideo SVI-738 Arabic */
@@ -3646,7 +3747,8 @@ ROM_START (svi738ar)
ROM_LOAD ("738arab.rom", 0x10000, 0x8000, CRC(339cd1aa) SHA1(0287b2ec897b9196788cd9f10c99e1487d7adbbb))
ROM_END
-MACHINE_CONFIG_START(msx_state::svi738ar)
+void msx_state::svi738ar(machine_config &config)
+{
msx1(TMS9929A, config);
// AY8910
// FDC: wd2793, 1 3.5" SSDD drive
@@ -3654,20 +3756,20 @@ MACHINE_CONFIG_START(msx_state::svi738ar)
// builtin 80 columns card (V9938)
// RS-232C interface
- MCFG_MSX_LAYOUT_ROM("bios", 0, 0, 0, 2, "maincpu", 0x0000)
- MCFG_MSX_LAYOUT_RAM("ram", 1, 0, 0, 4) /* 64KB RAM */
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot1", 2, 0)
- MCFG_MSX_LAYOUT_ROM("rs232", 3, 0, 1, 1, "maincpu", 0xc000)
- MCFG_MSX_LAYOUT_DISK2("disk", 3, 1, 1, 1, "maincpu", 0x8000)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot2", 3, 2)
- MCFG_MSX_LAYOUT_ROM("arab", 3, 3, 1, 2, "maincpu", 0x10000)
+ add_internal_slot(config, MSX_SLOT_ROM, "bios", 0, 0, 0, 2, "maincpu", 0x0000);
+ add_internal_slot(config, MSX_SLOT_RAM, "ram", 1, 0, 0, 4); /* 64KB RAM */
+ add_cartridge_slot<1>(config, MSX_SLOT_CARTRIDGE, "cartslot1", 2, 0, msx_cart, nullptr);
+ add_internal_slot(config, MSX_SLOT_ROM, "rs232", 3, 0, 1, 1, "maincpu", 0xc000);
+ add_internal_slot_mirrored(config, MSX_SLOT_DISK2, "disk", 3, 1, 1, 2, "maincpu", 0x8000).set_tags("fdc", "fdc:0", "fdc:1");
+ add_cartridge_slot<2>(config, MSX_SLOT_CARTRIDGE, "cartslot2", 3, 2, msx_cart, nullptr);
+ add_internal_slot(config, MSX_SLOT_ROM, "arab", 3, 3, 1, 2, "maincpu", 0x10000);
msx_wd2793_force_ready(config);
msx_1_35_ssdd_drive(config);
msx1_floplist(config);
msx1_cartlist(config);
-MACHINE_CONFIG_END
+}
/* MSX - Spectravideo SVI-738 Danish */
@@ -3679,7 +3781,8 @@ ROM_START (svi738dk)
ROM_FILL (0xe000, 0x2000, 0xff)
ROM_END
-MACHINE_CONFIG_START(msx_state::svi738dk)
+void msx_state::svi738dk(machine_config &config)
+{
msx1(TMS9929A, config);
// AY8910
// FDC: wd2793, 1 3.5" SSDD drive
@@ -3687,19 +3790,19 @@ MACHINE_CONFIG_START(msx_state::svi738dk)
// builtin 80 columns card (V9938)
// RS-232C interface
- MCFG_MSX_LAYOUT_ROM("bios", 0, 0, 0, 2, "maincpu", 0x0000)
- MCFG_MSX_LAYOUT_RAM("ram", 1, 0, 0, 4) /* 64KB RAM */
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot1", 2, 0)
- MCFG_MSX_LAYOUT_ROM("rs232", 3, 0, 1, 1, "maincpu", 0xc000)
- MCFG_MSX_LAYOUT_DISK2("disk", 3, 1, 1, 1, "maincpu", 0x8000)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot2", 3, 2)
+ add_internal_slot(config, MSX_SLOT_ROM, "bios", 0, 0, 0, 2, "maincpu", 0x0000);
+ add_internal_slot(config, MSX_SLOT_RAM, "ram", 1, 0, 0, 4); /* 64KB RAM */
+ add_cartridge_slot<1>(config, MSX_SLOT_CARTRIDGE, "cartslot1", 2, 0, msx_cart, nullptr);
+ add_internal_slot(config, MSX_SLOT_ROM, "rs232", 3, 0, 1, 1, "maincpu", 0xc000);
+ add_internal_slot_mirrored(config, MSX_SLOT_DISK2, "disk", 3, 1, 1, 2, "maincpu", 0x8000).set_tags("fdc", "fdc:0", "fdc:1");
+ add_cartridge_slot<2>(config, MSX_SLOT_CARTRIDGE, "cartslot2", 3, 2, msx_cart, nullptr);
msx_wd2793_force_ready(config);
msx_1_35_ssdd_drive(config);
msx1_floplist(config);
msx1_cartlist(config);
-MACHINE_CONFIG_END
+}
/* MSX - Spectravideo SVI-738 Spanish */
@@ -3711,7 +3814,8 @@ ROM_START (svi738sp)
ROM_FILL (0xe000, 0x2000, 0xff)
ROM_END
-MACHINE_CONFIG_START(msx_state::svi738sp)
+void msx_state::svi738sp(machine_config &config)
+{
msx1(TMS9929A, config);
// AY8910
// FDC: wd2793, 1 3.5" SSDD drive
@@ -3719,19 +3823,19 @@ MACHINE_CONFIG_START(msx_state::svi738sp)
// builtin 80 columns card (V9938)
// RS-232C interface
- MCFG_MSX_LAYOUT_ROM("bios", 0, 0, 0, 2, "maincpu", 0x0000)
- MCFG_MSX_LAYOUT_RAM("ram", 1, 0, 0, 4) /* 64KB RAM */
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot1", 2, 0)
- MCFG_MSX_LAYOUT_ROM("rs232", 3, 0, 1, 1, "maincpu", 0xc000)
- MCFG_MSX_LAYOUT_DISK2("disk", 3, 1, 1, 1, "maincpu", 0x8000)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot2", 3, 2)
+ add_internal_slot(config, MSX_SLOT_ROM, "bios", 0, 0, 0, 2, "maincpu", 0x0000);
+ add_internal_slot(config, MSX_SLOT_RAM, "ram", 1, 0, 0, 4); /* 64KB RAM */
+ add_cartridge_slot<1>(config, MSX_SLOT_CARTRIDGE, "cartslot1", 2, 0, msx_cart, nullptr);
+ add_internal_slot(config, MSX_SLOT_ROM, "rs232", 3, 0, 1, 1, "maincpu", 0xc000);
+ add_internal_slot_mirrored(config, MSX_SLOT_DISK2, "disk", 3, 1, 1, 2, "maincpu", 0x8000).set_tags("fdc", "fdc:0", "fdc:1");
+ add_cartridge_slot<2>(config, MSX_SLOT_CARTRIDGE, "cartslot2", 3, 2, msx_cart, nullptr);
msx_wd2793_force_ready(config);
msx_1_35_ssdd_drive(config);
msx1_floplist(config);
msx1_cartlist(config);
-MACHINE_CONFIG_END
+}
/* MSX - Spectravideo SVI-738 Swedish */
@@ -3743,7 +3847,8 @@ ROM_START (svi738sw)
ROM_FILL (0xe000, 0x2000, 0xff)
ROM_END
-MACHINE_CONFIG_START(msx_state::svi738sw)
+void msx_state::svi738sw(machine_config &config)
+{
msx1(TMS9929A, config);
// AY8910
// FDC: wd2793, 1 3.5" SSDD drive
@@ -3751,19 +3856,19 @@ MACHINE_CONFIG_START(msx_state::svi738sw)
// builtin 80 columns card (V9938)
// RS-232C interface
- MCFG_MSX_LAYOUT_ROM("bios", 0, 0, 0, 2, "maincpu", 0x0000)
- MCFG_MSX_LAYOUT_RAM("ram", 1, 0, 0, 4) /* 64KB RAM */
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot1", 2, 0)
- MCFG_MSX_LAYOUT_ROM("rs232", 3, 0, 1, 1, "maincpu", 0xc000)
- MCFG_MSX_LAYOUT_DISK2("disk", 3, 1, 1, 1, "maincpu", 0x8000)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot2", 3, 2)
+ add_internal_slot(config, MSX_SLOT_ROM, "bios", 0, 0, 0, 2, "maincpu", 0x0000);
+ add_internal_slot(config, MSX_SLOT_RAM, "ram", 1, 0, 0, 4); /* 64KB RAM */
+ add_cartridge_slot<1>(config, MSX_SLOT_CARTRIDGE, "cartslot1", 2, 0, msx_cart, nullptr);
+ add_internal_slot(config, MSX_SLOT_ROM, "rs232", 3, 0, 1, 1, "maincpu", 0xc000);
+ add_internal_slot_mirrored(config, MSX_SLOT_DISK2, "disk", 3, 1, 1, 2, "maincpu", 0x8000).set_tags("fdc", "fdc:0", "fdc:1");
+ add_cartridge_slot<2>(config, MSX_SLOT_CARTRIDGE, "cartslot2", 3, 2, msx_cart, nullptr);
msx_wd2793_force_ready(config);
msx_1_35_ssdd_drive(config);
msx1_floplist(config);
msx1_cartlist(config);
-MACHINE_CONFIG_END
+}
/* MSX - Spectravideo SVI-738 Poland*/
@@ -3775,7 +3880,8 @@ ROM_START (svi738pl)
ROM_FILL (0xe000, 0x2000, 0xff)
ROM_END
-MACHINE_CONFIG_START(msx_state::svi738pl)
+void msx_state::svi738pl(machine_config &config)
+{
msx1(TMS9929A, config);
// AY8910
// FDC: wd2793, 1 3.5" SSDD drive
@@ -3783,19 +3889,19 @@ MACHINE_CONFIG_START(msx_state::svi738pl)
// builtin 80 columns card (V9938)
// RS-232C interface
- MCFG_MSX_LAYOUT_ROM("bios", 0, 0, 0, 2, "maincpu", 0x0000)
- MCFG_MSX_LAYOUT_RAM("ram", 1, 0, 0, 4) /* 64KB RAM */
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot1", 2, 0)
- MCFG_MSX_LAYOUT_ROM("rs232", 3, 0, 1, 1, "maincpu", 0xc000)
- MCFG_MSX_LAYOUT_DISK2("disk", 3, 1, 1, 1, "maincpu", 0x8000)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot2", 3, 2)
+ add_internal_slot(config, MSX_SLOT_ROM, "bios", 0, 0, 0, 2, "maincpu", 0x0000);
+ add_internal_slot(config, MSX_SLOT_RAM, "ram", 1, 0, 0, 4); /* 64KB RAM */
+ add_cartridge_slot<1>(config, MSX_SLOT_CARTRIDGE, "cartslot1", 2, 0, msx_cart, nullptr);
+ add_internal_slot(config, MSX_SLOT_ROM, "rs232", 3, 0, 1, 1, "maincpu", 0xc000);
+ add_internal_slot_mirrored(config, MSX_SLOT_DISK2, "disk", 3, 1, 1, 2, "maincpu", 0x8000).set_tags("fdc", "fdc:0", "fdc:1");
+ add_cartridge_slot<2>(config, MSX_SLOT_CARTRIDGE, "cartslot2", 3, 2, msx_cart, nullptr);
msx_wd2793_force_ready(config);
msx_1_35_ssdd_drive(config);
msx1_floplist(config);
msx1_cartlist(config);
-MACHINE_CONFIG_END
+}
/* MSX - Talent DPC-200 */
@@ -3804,19 +3910,20 @@ ROM_START (tadpc200)
ROM_LOAD ("dpc200bios.rom", 0x0000, 0x8000, CRC(8205795e) SHA1(829c00c3114f25b3dae5157c0a238b52a3ac37db))
ROM_END
-MACHINE_CONFIG_START(msx_state::tadpc200)
+void msx_state::tadpc200(machine_config &config)
+{
msx1(TMS9129, config);
// AY8910
// FDC: None, 0 drives
// 2 Cartridge slots
- MCFG_MSX_LAYOUT_ROM("bios", 0, 0, 0, 2, "maincpu", 0x0000)
- MCFG_MSX_LAYOUT_RAM("ram", 1, 0, 0, 4) /* 64KB RAM */
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot1", 2, 0)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot2", 3, 0)
+ add_internal_slot(config, MSX_SLOT_ROM, "bios", 0, 0, 0, 2, "maincpu", 0x0000);
+ add_internal_slot(config, MSX_SLOT_RAM, "ram", 1, 0, 0, 4); /* 64KB RAM */
+ add_cartridge_slot<1>(config, MSX_SLOT_CARTRIDGE, "cartslot1", 2, 0, msx_cart, nullptr);
+ add_cartridge_slot<2>(config, MSX_SLOT_CARTRIDGE, "cartslot2", 3, 0, msx_cart, nullptr);
msx1_cartlist(config);
-MACHINE_CONFIG_END
+}
/* MSX - Talent DPC-200A */
@@ -3825,19 +3932,20 @@ ROM_START (tadpc20a)
ROM_LOAD ("dpc200abios.rom", 0x0000, 0x8000, CRC(8205795e) SHA1(829c00c3114f25b3dae5157c0a238b52a3ac37db))
ROM_END
-MACHINE_CONFIG_START(msx_state::tadpc20a)
+void msx_state::tadpc20a(machine_config &config)
+{
msx1(TMS9929A, config);
// AY8910/YM2149?
// FDC: None, 0 drives
// 2 Cartridge slots?
- MCFG_MSX_LAYOUT_ROM("bios", 0, 0, 0, 2, "maincpu", 0x0000)
- MCFG_MSX_LAYOUT_RAM("ram", 1, 0, 0, 4) /* 64KB RAM */
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot1", 2, 0)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot2", 3, 0)
+ add_internal_slot(config, MSX_SLOT_ROM, "bios", 0, 0, 0, 2, "maincpu", 0x0000);
+ add_internal_slot(config, MSX_SLOT_RAM, "ram", 1, 0, 0, 4); /* 64KB RAM */
+ add_cartridge_slot<1>(config, MSX_SLOT_CARTRIDGE, "cartslot1", 2, 0, msx_cart, nullptr);
+ add_cartridge_slot<2>(config, MSX_SLOT_CARTRIDGE, "cartslot2", 3, 0, msx_cart, nullptr);
msx1_cartlist(config);
-MACHINE_CONFIG_END
+}
/* MSX - Toshiba HX-10 */
/* The BIOS on the Toshiba HX-10 is inside a big 64pin Toshiba chip label TCX-1007 */
@@ -3847,19 +3955,20 @@ ROM_START (hx10)
ROM_LOAD ("tcx-1007.ic15", 0x0000, 0x8000, CRC(5486b711) SHA1(4dad9de7c28b452351cc12910849b51bd9a37ab3))
ROM_END
-MACHINE_CONFIG_START(msx_state::hx10)
+void msx_state::hx10(machine_config &config)
+{
msx1(TMS9929A, config);
// AY8910
// FDC: None, 0 drives
// 1 Cartridge slot, 1 Toshiba Expension slot
- MCFG_MSX_LAYOUT_ROM("bios", 0, 0, 0, 2, "maincpu", 0x0000)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot", 1, 0)
- MCFG_MSX_LAYOUT_RAM("ram", 2, 0, 0, 4) /* 64KB RAM */
+ add_internal_slot(config, MSX_SLOT_ROM, "bios", 0, 0, 0, 2, "maincpu", 0x0000);
+ add_cartridge_slot<1>(config, MSX_SLOT_CARTRIDGE, "cartslot", 1, 0, msx_cart, nullptr);
+ add_internal_slot(config, MSX_SLOT_RAM, "ram", 2, 0, 0, 4); /* 64KB RAM */
//MSX_LAYOUT_SLOT (3, 0, 0, 4, CARTRIDGE2, 0x0000, 0x0000) // Expansion slot
msx1_cartlist(config);
-MACHINE_CONFIG_END
+}
/* MSX - Toshiba HX-10D */
@@ -3868,19 +3977,20 @@ ROM_START (hx10d)
ROM_LOAD ("hx10dbios.rom", 0x0000, 0x8000, CRC(ee229390) SHA1(302afb5d8be26c758309ca3df611ae69cced2821))
ROM_END
-MACHINE_CONFIG_START(msx_state::hx10d)
+void msx_state::hx10d(machine_config &config)
+{
msx1(TMS9928A, config);
// AY8910/YM2149?
// FDC: None, 0 drives
// 2 Cartridge slots?
- MCFG_MSX_LAYOUT_ROM("bios", 0, 0, 0, 2, "maincpu", 0x0000)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot1", 1, 0)
- MCFG_MSX_LAYOUT_RAM("ram", 2, 0, 0, 4) /* 64KB RAM */
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot2", 3, 0)
+ add_internal_slot(config, MSX_SLOT_ROM, "bios", 0, 0, 0, 2, "maincpu", 0x0000);
+ add_cartridge_slot<1>(config, MSX_SLOT_CARTRIDGE, "cartslot1", 1, 0, msx_cart, nullptr);
+ add_internal_slot(config, MSX_SLOT_RAM, "ram", 2, 0, 0, 4); /* 64KB RAM */
+ add_cartridge_slot<2>(config, MSX_SLOT_CARTRIDGE, "cartslot2", 3, 0, msx_cart, nullptr);
msx1_cartlist(config);
-MACHINE_CONFIG_END
+}
/* MSX - Toshiba HX-10DP */
@@ -3889,19 +3999,20 @@ ROM_START (hx10dp)
ROM_LOAD ("hx10dpbios.rom", 0x0000, 0x8000, CRC(ee229390) SHA1(302afb5d8be26c758309ca3df611ae69cced2821))
ROM_END
-MACHINE_CONFIG_START(msx_state::hx10dp)
+void msx_state::hx10dp(machine_config &config)
+{
msx1(TMS9928A, config);
// AY8910/YM2149?
// FDC: None, 0 drives
// 2 Cartridge slots?
- MCFG_MSX_LAYOUT_ROM("bios", 0, 0, 0, 2, "maincpu", 0x0000)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot1", 1, 0)
- MCFG_MSX_LAYOUT_RAM("ram", 2, 0, 0, 4) /* 64KB RAM */
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot2", 3, 0)
+ add_internal_slot(config, MSX_SLOT_ROM, "bios", 0, 0, 0, 2, "maincpu", 0x0000);
+ add_cartridge_slot<1>(config, MSX_SLOT_CARTRIDGE, "cartslot1", 1, 0, msx_cart, nullptr);
+ add_internal_slot(config, MSX_SLOT_RAM, "ram", 2, 0, 0, 4); /* 64KB RAM */
+ add_cartridge_slot<2>(config, MSX_SLOT_CARTRIDGE, "cartslot2", 3, 0, msx_cart, nullptr);
msx1_cartlist(config);
-MACHINE_CONFIG_END
+}
/* MSX - Toshiba HX-10E */
@@ -3910,19 +4021,20 @@ ROM_START (hx10e)
ROM_LOAD ("hx10ebios.rom", 0x0000, 0x8000, CRC(5486b711) SHA1(4dad9de7c28b452351cc12910849b51bd9a37ab3))
ROM_END
-MACHINE_CONFIG_START(msx_state::hx10e)
+void msx_state::hx10e(machine_config &config)
+{
msx1(TMS9929A, config);
// AY8910/YM2149?
// FDC: None, 0 drives
// 2 Cartridge slots?
- MCFG_MSX_LAYOUT_ROM("bios", 0, 0, 0, 2, "maincpu", 0x0000)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot1", 1, 0)
- MCFG_MSX_LAYOUT_RAM("ram", 2, 0, 0, 4) /* 64KB RAM */
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot2", 3, 0)
+ add_internal_slot(config, MSX_SLOT_ROM, "bios", 0, 0, 0, 2, "maincpu", 0x0000);
+ add_cartridge_slot<1>(config, MSX_SLOT_CARTRIDGE, "cartslot1", 1, 0, msx_cart, nullptr);
+ add_internal_slot(config, MSX_SLOT_RAM, "ram", 2, 0, 0, 4); /* 64KB RAM */
+ add_cartridge_slot<2>(config, MSX_SLOT_CARTRIDGE, "cartslot2", 3, 0, msx_cart, nullptr);
msx1_cartlist(config);
-MACHINE_CONFIG_END
+}
/* MSX - Toshiba HX-10F */
@@ -3931,19 +4043,20 @@ ROM_START (hx10f)
ROM_LOAD ("hx10fbios.rom", 0x0000, 0x8000, CRC(e0e894b7) SHA1(d99eebded5db5fce1e072d08e642c0909bc7efdd))
ROM_END
-MACHINE_CONFIG_START(msx_state::hx10f)
+void msx_state::hx10f(machine_config &config)
+{
msx1(TMS9929A, config);
// AY8910/YM2149?
// FDC: None, 0 drives
// 2 Cartridge slots?
- MCFG_MSX_LAYOUT_ROM("bios", 0, 0, 0, 2, "maincpu", 0x0000)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot1", 1, 0)
- MCFG_MSX_LAYOUT_RAM("ram", 2, 0, 0, 4) /* 64KB RAM */
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot2", 3, 0)
+ add_internal_slot(config, MSX_SLOT_ROM, "bios", 0, 0, 0, 2, "maincpu", 0x0000);
+ add_cartridge_slot<1>(config, MSX_SLOT_CARTRIDGE, "cartslot1", 1, 0, msx_cart, nullptr);
+ add_internal_slot(config, MSX_SLOT_RAM, "ram", 2, 0, 0, 4); /* 64KB RAM */
+ add_cartridge_slot<2>(config, MSX_SLOT_CARTRIDGE, "cartslot2", 3, 0, msx_cart, nullptr);
msx1_cartlist(config);
-MACHINE_CONFIG_END
+}
/* MSX - Toshiba HX-10S */
@@ -3952,19 +4065,20 @@ ROM_START (hx10s)
ROM_LOAD ("hx10sbios.rom", 0x0000, 0x8000, CRC(5486b711) SHA1(4dad9de7c28b452351cc12910849b51bd9a37ab3))
ROM_END
-MACHINE_CONFIG_START(msx_state::hx10s)
+void msx_state::hx10s(machine_config &config)
+{
msx1(TMS9929A, config);
// AY8910/YM2149?
// FDC: None, 0 drives
// 2 Cartridge slots?
- MCFG_MSX_LAYOUT_ROM("bios", 0, 0, 0, 2, "maincpu", 0x0000)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot1", 1, 0)
- MCFG_MSX_LAYOUT_RAM("ram", 2, 0, 3, 1) /* 16KB RAM */
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot2", 3, 0)
+ add_internal_slot(config, MSX_SLOT_ROM, "bios", 0, 0, 0, 2, "maincpu", 0x0000);
+ add_cartridge_slot<1>(config, MSX_SLOT_CARTRIDGE, "cartslot1", 1, 0, msx_cart, nullptr);
+ add_internal_slot(config, MSX_SLOT_RAM, "ram", 2, 0, 3, 1); /* 16KB RAM */
+ add_cartridge_slot<2>(config, MSX_SLOT_CARTRIDGE, "cartslot2", 3, 0, msx_cart, nullptr);
msx1_cartlist(config);
-MACHINE_CONFIG_END
+}
/* MSX - Toshiba HX-10SA */
@@ -3973,19 +4087,20 @@ ROM_START (hx10sa)
ROM_LOAD ("hx10sabios.rom", 0x0000, 0x8000, CRC(ee229390) SHA1(302afb5d8be26c758309ca3df611ae69cced2821))
ROM_END
-MACHINE_CONFIG_START(msx_state::hx10sa)
+void msx_state::hx10sa(machine_config &config)
+{
msx1(TMS9928A, config);
// AY8910/YM2149?
// FDC: None, 0 drives
// 2 Cartridge slots?
- MCFG_MSX_LAYOUT_ROM("bios", 0, 0, 0, 2, "maincpu", 0x0000)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot1", 1, 0)
- MCFG_MSX_LAYOUT_RAM("ram", 2, 0, 0, 4) /* 64KB RAM */
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot2", 3, 0)
+ add_internal_slot(config, MSX_SLOT_ROM, "bios", 0, 0, 0, 2, "maincpu", 0x0000);
+ add_cartridge_slot<1>(config, MSX_SLOT_CARTRIDGE, "cartslot1", 1, 0, msx_cart, nullptr);
+ add_internal_slot(config, MSX_SLOT_RAM, "ram", 2, 0, 0, 4); /* 64KB RAM */
+ add_cartridge_slot<2>(config, MSX_SLOT_CARTRIDGE, "cartslot2", 3, 0, msx_cart, nullptr);
msx1_cartlist(config);
-MACHINE_CONFIG_END
+}
/* MSX - Toshiba HX-20 */
@@ -3995,22 +4110,23 @@ ROM_START (hx20)
ROM_LOAD ("hx20word.rom", 0x8000, 0x8000, CRC(39b3e1c0) SHA1(9f7cfa932bd7dfd0d9ecaadc51655fb557c2e125))
ROM_END
-MACHINE_CONFIG_START(msx_state::hx20)
+void msx_state::hx20(machine_config &config)
+{
msx1(TMS9129, config);
// AY8910/YM2149?
// FDC: None, 0 drives
// 2 Cartridge slots
// T6950
- MCFG_MSX_LAYOUT_ROM("bios", 0, 0, 0, 2, "maincpu", 0x0000)
- MCFG_MSX_LAYOUT_RAM("ram1", 0, 0, 2, 2) /* 32KB RAM */
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot1", 1, 0)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot2", 2, 0)
- MCFG_MSX_LAYOUT_RAM("ram2", 3, 0, 2, 2) /* 32KB RAM */
- MCFG_MSX_LAYOUT_ROM("word", 3, 3, 1, 2, "maincpu", 0x8000)
+ add_internal_slot(config, MSX_SLOT_ROM, "bios", 0, 0, 0, 2, "maincpu", 0x0000);
+ add_internal_slot(config, MSX_SLOT_RAM, "ram1", 0, 0, 2, 2); /* 32KB RAM */
+ add_cartridge_slot<1>(config, MSX_SLOT_CARTRIDGE, "cartslot1", 1, 0, msx_cart, nullptr);
+ add_cartridge_slot<2>(config, MSX_SLOT_CARTRIDGE, "cartslot2", 2, 0, msx_cart, nullptr);
+ add_internal_slot(config, MSX_SLOT_RAM, "ram2", 3, 0, 2, 2); /* 32KB RAM */
+ add_internal_slot(config, MSX_SLOT_ROM, "word", 3, 3, 1, 2, "maincpu", 0x8000);
msx1_cartlist(config);
-MACHINE_CONFIG_END
+}
/* MSX - Toshiba HX-20I */
@@ -4020,22 +4136,23 @@ ROM_START (hx20i)
ROM_LOAD ("hx20iword.rom", 0x8000, 0x8000, CRC(39b3e1c0) SHA1(9f7cfa932bd7dfd0d9ecaadc51655fb557c2e125))
ROM_END
-MACHINE_CONFIG_START(msx_state::hx20i)
+void msx_state::hx20i(machine_config &config)
+{
msx1(TMS9129, config);
// AY8910/YM2149?
// FDC: None, 0 drives
// 2 Cartridge slots
// T6950 VDP instead of TMS9928A
- MCFG_MSX_LAYOUT_ROM("bios", 0, 0, 0, 2, "maincpu", 0x0000)
- MCFG_MSX_LAYOUT_RAM("ram1", 0, 0, 2, 2) /* 32KB RAM */
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot1", 1, 0)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot2", 2, 0)
- MCFG_MSX_LAYOUT_RAM("ram2", 3, 0, 2, 2) /* 32KB RAM */
- MCFG_MSX_LAYOUT_ROM("word", 3, 3, 1, 2, "maincpu", 0x8000)
+ add_internal_slot(config, MSX_SLOT_ROM, "bios", 0, 0, 0, 2, "maincpu", 0x0000);
+ add_internal_slot(config, MSX_SLOT_RAM, "ram1", 0, 0, 2, 2); /* 32KB RAM */
+ add_cartridge_slot<1>(config, MSX_SLOT_CARTRIDGE, "cartslot1", 1, 0, msx_cart, nullptr);
+ add_cartridge_slot<2>(config, MSX_SLOT_CARTRIDGE, "cartslot2", 2, 0, msx_cart, nullptr);
+ add_internal_slot(config, MSX_SLOT_RAM, "ram2", 3, 0, 2, 2); /* 32KB RAM */
+ add_internal_slot(config, MSX_SLOT_ROM, "word", 3, 3, 1, 2, "maincpu", 0x8000);
msx1_cartlist(config);
-MACHINE_CONFIG_END
+}
/* MSX - Toshiba HX-21 */
@@ -4048,20 +4165,21 @@ ROM_START (hx21)
ROM_LOAD ("hx21kfn.rom", 0x0000, 0x20000, CRC(d23d4d2d) SHA1(db03211b7db46899df41db2b1dfbec972109a967))
ROM_END
-MACHINE_CONFIG_START(msx_state::hx21)
+void msx_state::hx21(machine_config &config)
+{
msx1(TMS9928A, config);
// AY8910/YM2149?
// FDC: None, 0 drives
// 2 Cartridge slots
- MCFG_MSX_LAYOUT_ROM("bios", 0, 0, 0, 2, "maincpu", 0x0000)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot1", 1, 0)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot2", 2, 0)
- MCFG_MSX_LAYOUT_RAM("ram2", 3, 0, 0, 4) /* 64KB RAM */
- MCFG_MSX_LAYOUT_ROM("word", 3, 3, 1, 2, "maincpu", 0x8000)
+ add_internal_slot(config, MSX_SLOT_ROM, "bios", 0, 0, 0, 2, "maincpu", 0x0000);
+ add_cartridge_slot<1>(config, MSX_SLOT_CARTRIDGE, "cartslot1", 1, 0, msx_cart, nullptr);
+ add_cartridge_slot<2>(config, MSX_SLOT_CARTRIDGE, "cartslot2", 2, 0, msx_cart, nullptr);
+ add_internal_slot(config, MSX_SLOT_RAM, "ram2", 3, 0, 0, 4); /* 64KB RAM */
+ add_internal_slot(config, MSX_SLOT_ROM, "word", 3, 3, 1, 2, "maincpu", 0x8000);
msx1_cartlist(config);
-MACHINE_CONFIG_END
+}
/* MSX - Toshiba HX-21I */
@@ -4071,21 +4189,22 @@ ROM_START (hx21i)
ROM_LOAD ("hx21iword.rom", 0x8000, 0x8000, CRC(f9e29c66) SHA1(3289336b2c12161fd926a7e5ce865770ae7038af))
ROM_END
-MACHINE_CONFIG_START(msx_state::hx21i)
+void msx_state::hx21i(machine_config &config)
+{
msx1(TMS9929A, config);
// AY8910/YM2149?
// FDC: None, 0 drives
// 2 Cartridge slots
- MCFG_MSX_LAYOUT_ROM("bios", 0, 0, 0, 2, "maincpu", 0x0000)
- MCFG_MSX_LAYOUT_RAM("ram1", 0, 0, 2, 2) /* 32KB RAM */
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot1", 1, 0)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot2", 2, 0)
- MCFG_MSX_LAYOUT_RAM("ram2", 3, 0, 2, 2) /* 32KB RAM */
- MCFG_MSX_LAYOUT_ROM("word", 3, 3, 1, 2, "maincpu", 0x8000)
+ add_internal_slot(config, MSX_SLOT_ROM, "bios", 0, 0, 0, 2, "maincpu", 0x0000);
+ add_internal_slot(config, MSX_SLOT_RAM, "ram1", 0, 0, 2, 2); /* 32KB RAM */
+ add_cartridge_slot<1>(config, MSX_SLOT_CARTRIDGE, "cartslot1", 1, 0, msx_cart, nullptr);
+ add_cartridge_slot<2>(config, MSX_SLOT_CARTRIDGE, "cartslot2", 2, 0, msx_cart, nullptr);
+ add_internal_slot(config, MSX_SLOT_RAM, "ram2", 3, 0, 2, 2); /* 32KB RAM */
+ add_internal_slot(config, MSX_SLOT_ROM, "word", 3, 3, 1, 2, "maincpu", 0x8000);
msx1_cartlist(config);
-MACHINE_CONFIG_END
+}
/* MSX - Toshiba HX-22 */
@@ -4098,21 +4217,22 @@ ROM_START (hx22)
ROM_LOAD ("hx22kfn.rom", 0x0000, 0x20000, CRC(d23d4d2d) SHA1(db03211b7db46899df41db2b1dfbec972109a967))
ROM_END
-MACHINE_CONFIG_START(msx_state::hx22)
+void msx_state::hx22(machine_config &config)
+{
msx1(TMS9928A, config);
// AY8910/YM2149?
// FDC: None, 0 drives
// 2 Cartridge slots
// RS232C builtin?
- MCFG_MSX_LAYOUT_ROM("bios", 0, 0, 0, 2, "maincpu", 0x0000)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot1", 1, 0)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot2", 2, 0)
- MCFG_MSX_LAYOUT_RAM("ram2", 3, 0, 0, 4) /* 64KB RAM */
- MCFG_MSX_LAYOUT_ROM("word", 3, 3, 1, 2, "maincpu", 0x8000)
+ add_internal_slot(config, MSX_SLOT_ROM, "bios", 0, 0, 0, 2, "maincpu", 0x0000);
+ add_cartridge_slot<1>(config, MSX_SLOT_CARTRIDGE, "cartslot1", 1, 0, msx_cart, nullptr);
+ add_cartridge_slot<2>(config, MSX_SLOT_CARTRIDGE, "cartslot2", 2, 0, msx_cart, nullptr);
+ add_internal_slot(config, MSX_SLOT_RAM, "ram2", 3, 0, 0, 4); /* 64KB RAM */
+ add_internal_slot(config, MSX_SLOT_ROM, "word", 3, 3, 1, 2, "maincpu", 0x8000);
msx1_cartlist(config);
-MACHINE_CONFIG_END
+}
/* MSX - Toshiba HX-22I */
@@ -4122,7 +4242,8 @@ ROM_START (hx22i)
ROM_LOAD ("hx22iword.rom", 0x8000, 0x8000, CRC(f9e29c66) SHA1(3289336b2c12161fd926a7e5ce865770ae7038af))
ROM_END
-MACHINE_CONFIG_START(msx_state::hx22i)
+void msx_state::hx22i(machine_config &config)
+{
msx1(TMS9929A, config);
// AY8910/YM2149?
// FDC: None, 0 drives
@@ -4130,15 +4251,15 @@ MACHINE_CONFIG_START(msx_state::hx22i)
// RS232C builtin?
// Z80: LH0080A
- MCFG_MSX_LAYOUT_ROM("bios", 0, 0, 0, 2, "maincpu", 0x0000)
- MCFG_MSX_LAYOUT_RAM("ram1", 0, 0, 2, 2) /* 32KB RAM */
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot1", 1, 0)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot2", 2, 0)
- MCFG_MSX_LAYOUT_RAM("ram2", 3, 0, 2, 2) /* 32KB RAM */
- MCFG_MSX_LAYOUT_ROM("word", 3, 3, 1, 2, "maincpu", 0x8000)
+ add_internal_slot(config, MSX_SLOT_ROM, "bios", 0, 0, 0, 2, "maincpu", 0x0000);
+ add_internal_slot(config, MSX_SLOT_RAM, "ram1", 0, 0, 2, 2); /* 32KB RAM */
+ add_cartridge_slot<1>(config, MSX_SLOT_CARTRIDGE, "cartslot1", 1, 0, msx_cart, nullptr);
+ add_cartridge_slot<2>(config, MSX_SLOT_CARTRIDGE, "cartslot2", 2, 0, msx_cart, nullptr);
+ add_internal_slot(config, MSX_SLOT_RAM, "ram2", 3, 0, 2, 2); /* 32KB RAM */
+ add_internal_slot(config, MSX_SLOT_ROM, "word", 3, 3, 1, 2, "maincpu", 0x8000);
msx1_cartlist(config);
-MACHINE_CONFIG_END
+}
/* MSX - Victor HC-5 */
@@ -4147,19 +4268,20 @@ ROM_START (hc5)
ROM_LOAD ("hc5bios.rom", 0x0000, 0x8000, CRC(ee229390) SHA1(302afb5d8be26c758309ca3df611ae69cced2821))
ROM_END
-MACHINE_CONFIG_START(msx_state::hc5)
+void msx_state::hc5(machine_config &config)
+{
msx1(TMS9928A, config);
// AY8910/YM2149?
// FDC: None, 0 drives,
// 2 Cartridge slots?
- MCFG_MSX_LAYOUT_ROM("bios", 0, 0, 0, 2, "maincpu", 0x0000)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot1", 1, 0)
- MCFG_MSX_LAYOUT_RAM("ram", 2, 0, 3, 1) // 16KB or 32KB RAM ?
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot2", 3, 0)
+ add_internal_slot(config, MSX_SLOT_ROM, "bios", 0, 0, 0, 2, "maincpu", 0x0000);
+ add_cartridge_slot<1>(config, MSX_SLOT_CARTRIDGE, "cartslot1", 1, 0, msx_cart, nullptr);
+ add_internal_slot(config, MSX_SLOT_RAM, "ram", 2, 0, 3, 1); // 16KB or 32KB RAM ?
+ add_cartridge_slot<2>(config, MSX_SLOT_CARTRIDGE, "cartslot2", 3, 0, msx_cart, nullptr);
msx1_cartlist(config);
-MACHINE_CONFIG_END
+}
/* MSX - Victor HC-6 */
@@ -4168,19 +4290,20 @@ ROM_START (hc6)
ROM_LOAD ("hc6bios.rom", 0x0000, 0x8000, CRC(ee229390) SHA1(302afb5d8be26c758309ca3df611ae69cced2821))
ROM_END
-MACHINE_CONFIG_START(msx_state::hc6)
+void msx_state::hc6(machine_config &config)
+{
msx1(TMS9928A, config);
// AY8910/YM2149?
// FDC: None, 0 drives,
// 2 Cartridge slots?
- MCFG_MSX_LAYOUT_ROM("bios", 0, 0, 0, 2, "maincpu", 0x0000)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot1", 1, 0)
- MCFG_MSX_LAYOUT_RAM("ram", 2, 0, 2, 2) // 32KB RAM
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot2", 3, 0)
+ add_internal_slot(config, MSX_SLOT_ROM, "bios", 0, 0, 0, 2, "maincpu", 0x0000);
+ add_cartridge_slot<1>(config, MSX_SLOT_CARTRIDGE, "cartslot1", 1, 0, msx_cart, nullptr);
+ add_internal_slot(config, MSX_SLOT_RAM, "ram", 2, 0, 2, 2); // 32KB RAM
+ add_cartridge_slot<2>(config, MSX_SLOT_CARTRIDGE, "cartslot2", 3, 0, msx_cart, nullptr);
msx1_cartlist(config);
-MACHINE_CONFIG_END
+}
/* MSX - Victor HC-7 */
@@ -4189,19 +4312,20 @@ ROM_START (hc7)
ROM_LOAD ("hc7bios.rom", 0x0000, 0x8000, CRC(ee229390) SHA1(302afb5d8be26c758309ca3df611ae69cced2821))
ROM_END
-MACHINE_CONFIG_START(msx_state::hc7)
+void msx_state::hc7(machine_config &config)
+{
msx1(TMS9928A, config);
// AY8910/YM2149?
// FDC: None, 0 drives,
// 2 Cartridge slots?
- MCFG_MSX_LAYOUT_ROM("bios", 0, 0, 0, 2, "maincpu", 0x0000)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot1", 1, 0)
- MCFG_MSX_LAYOUT_RAM("ram", 2, 0, 0, 4) // 64KB RAM
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot2", 3, 0)
+ add_internal_slot(config, MSX_SLOT_ROM, "bios", 0, 0, 0, 2, "maincpu", 0x0000);
+ add_cartridge_slot<1>(config, MSX_SLOT_CARTRIDGE, "cartslot1", 1, 0, msx_cart, nullptr);
+ add_internal_slot(config, MSX_SLOT_RAM, "ram", 2, 0, 0, 4); // 64KB RAM
+ add_cartridge_slot<2>(config, MSX_SLOT_CARTRIDGE, "cartslot2", 3, 0, msx_cart, nullptr);
msx1_cartlist(config);
-MACHINE_CONFIG_END
+}
/* MSX - Yamaha CX5F (with SFG01) */
@@ -4210,7 +4334,8 @@ ROM_START (cx5f1)
ROM_LOAD ("cx5fbios.rom", 0x0000, 0x8000, CRC(dc662057) SHA1(36d77d357a5fd15af2ab266ee66e5091ba4770a3))
ROM_END
-MACHINE_CONFIG_START(msx_state::cx5f1)
+void msx_state::cx5f1(machine_config &config)
+{
msx1(TMS9928A, config);
// AY8910/YM2149?
// FDC: None, 0 drives
@@ -4218,13 +4343,13 @@ MACHINE_CONFIG_START(msx_state::cx5f1)
// 1 Yamaha expansion slot?
// S-5327 MSX Engine
- MCFG_MSX_LAYOUT_ROM("bios", 0, 0, 0, 2, "maincpu", 0x0000)
- MCFG_MSX_LAYOUT_RAM("ram", 0, 0, 2, 2) // 32KB RAM
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot", 1, 0)
- MCFG_MSX_LAYOUT_YAMAHA_EXPANSION("expansion", 2, 0, "sfg01")
+ add_internal_slot(config, MSX_SLOT_ROM, "bios", 0, 0, 0, 2, "maincpu", 0x0000);
+ add_internal_slot(config, MSX_SLOT_RAM, "ram", 0, 0, 2, 2); // 32KB RAM
+ add_cartridge_slot<1>(config, MSX_SLOT_CARTRIDGE, "cartslot", 1, 0, msx_cart, nullptr);
+ add_cartridge_slot<2>(config, MSX_SLOT_YAMAHA_EXPANSION, "expansion", 2, 0, msx_yamaha_60pin, "sfg01");
msx1_cartlist(config);
-MACHINE_CONFIG_END
+}
/* MSX - Yamaha CX5F (with SFG05) */
@@ -4233,7 +4358,8 @@ ROM_START (cx5f)
ROM_LOAD ("cx5fbios.rom", 0x0000, 0x8000, CRC(dc662057) SHA1(36d77d357a5fd15af2ab266ee66e5091ba4770a3))
ROM_END
-MACHINE_CONFIG_START(msx_state::cx5f)
+void msx_state::cx5f(machine_config &config)
+{
msx1(TMS9928A, config);
// AY8910/YM2149?
// FDC: None, 0 drives
@@ -4241,13 +4367,13 @@ MACHINE_CONFIG_START(msx_state::cx5f)
// 1 Yamaha expansion slot?
// S-5327 MSX Engine
- MCFG_MSX_LAYOUT_ROM("bios", 0, 0, 0, 2, "maincpu", 0x0000)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot1", 1, 0)
- MCFG_MSX_LAYOUT_YAMAHA_EXPANSION("expansion", 3, 0, "sfg05")
- MCFG_MSX_LAYOUT_RAM("ram", 3, 0, 2, 2) // 32KB RAM
+ add_internal_slot(config, MSX_SLOT_ROM, "bios", 0, 0, 0, 2, "maincpu", 0x0000);
+ add_cartridge_slot<1>(config, MSX_SLOT_CARTRIDGE, "cartslot1", 1, 0, msx_cart, nullptr);
+ add_cartridge_slot<2>(config, MSX_SLOT_YAMAHA_EXPANSION, "expansion", 3, 0, msx_yamaha_60pin, "sfg05");
+ add_internal_slot(config, MSX_SLOT_RAM, "ram", 3, 0, 2, 2); // 32KB RAM
msx1_cartlist(config);
-MACHINE_CONFIG_END
+}
/* MSX - Yamaha CX5M / Yamaha CX5M-2 */
@@ -4256,21 +4382,22 @@ ROM_START (cx5m)
ROM_LOAD ("cx5mbios.rom", 0x0000, 0x8000, CRC(e2242b53) SHA1(706dd67036baeec7127e4ccd8c8db8f6ce7d0e4c))
ROM_END
-MACHINE_CONFIG_START(msx_state::cx5m)
+void msx_state::cx5m(machine_config &config)
+{
msx1(TMS9929A, config);
// YM2149
// FDC: None, 0 drives
// 2 Cartridge slots
// 1 Expansion slot (60 pins interface instead of regular 50 pin cartridge interface)
- MCFG_MSX_LAYOUT_ROM("bios", 0, 0, 0, 2, "maincpu", 0x0000)
- MCFG_MSX_LAYOUT_RAM("ram", 0, 0, 2, 2) /* 32KB RAM */
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot1", 1, 0)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot2", 2, 0)
- MCFG_MSX_LAYOUT_YAMAHA_EXPANSION("expansion", 3, 0, "sfg01")
+ add_internal_slot(config, MSX_SLOT_ROM, "bios", 0, 0, 0, 2, "maincpu", 0x0000);
+ add_internal_slot(config, MSX_SLOT_RAM, "ram", 0, 0, 2, 2); /* 32KB RAM */
+ add_cartridge_slot<1>(config, MSX_SLOT_CARTRIDGE, "cartslot1", 1, 0, msx_cart, nullptr);
+ add_cartridge_slot<2>(config, MSX_SLOT_CARTRIDGE, "cartslot2", 2, 0, msx_cart, nullptr);
+ add_cartridge_slot<3>(config, MSX_SLOT_YAMAHA_EXPANSION, "expansion", 3, 0, msx_yamaha_60pin, "sfg01");
msx1_cartlist(config);
-MACHINE_CONFIG_END
+}
/* MSX - Yamaha CX5M-128 */
@@ -4281,22 +4408,23 @@ ROM_START (cx5m128)
ROM_LOAD ("yrm502.rom", 0x14000, 0x4000, CRC(5330fe21) SHA1(7b1798561ee1844a7d6432924fbee9b4fc591c19))
ROM_END
-MACHINE_CONFIG_START(msx_state::cx5m128)
+void msx_state::cx5m128(machine_config &config)
+{
msx1(TMS9929A, config);
// AY8910/YM2149?
// FDC: None, 0 drives
// 2 Cartridge slots?
- MCFG_MSX_LAYOUT_ROM("bios", 0, 0, 0, 2, "maincpu", 0x0000)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot1", 1, 0)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot2", 2, 0)
- MCFG_MSX_LAYOUT_ROM("ext", 3, 0, 1, 1, "maincpu", 0x8000)
- MCFG_MSX_LAYOUT_ROM("yrm", 3, 1, 1, 1, "maincpu", 0x14000) /* YRM-502 */
- MCFG_MSX_LAYOUT_RAM_MM("ram_mm", 3, 2, 0x20000) /* 128KB Mapper RAM */
- MCFG_MSX_LAYOUT_YAMAHA_EXPANSION("expansion", 3, 3, "sfg05")
+ add_internal_slot(config, MSX_SLOT_ROM, "bios", 0, 0, 0, 2, "maincpu", 0x0000);
+ add_cartridge_slot<1>(config, MSX_SLOT_CARTRIDGE, "cartslot1", 1, 0, msx_cart, nullptr);
+ add_cartridge_slot<2>(config, MSX_SLOT_CARTRIDGE, "cartslot2", 2, 0, msx_cart, nullptr);
+ add_internal_slot(config, MSX_SLOT_ROM, "ext", 3, 0, 1, 1, "maincpu", 0x8000);
+ add_internal_slot(config, MSX_SLOT_ROM, "yrm", 3, 1, 1, 1, "maincpu", 0x14000); /* YRM-502 */
+ add_internal_slot(config, MSX_SLOT_RAM_MM, "ram_mm", 3, 2, 0, 4).set_total_size(0x20000); /* 128KB Mapper RAM */
+ add_cartridge_slot<3>(config, MSX_SLOT_YAMAHA_EXPANSION, "expansion", 3, 3, msx_yamaha_60pin, "sfg05");
msx1_cartlist(config);
-MACHINE_CONFIG_END
+}
/* MSX - Yamaha CX5MII */
@@ -4306,21 +4434,22 @@ ROM_START (cx5m2)
ROM_LOAD ("cx5m2ext.rom", 0x8000, 0x4000, CRC(feada82e) SHA1(48b0c2ff1f1e407cc44394219f7b3878efaa919f))
ROM_END
-MACHINE_CONFIG_START(msx_state::cx5m2)
+void msx_state::cx5m2(machine_config &config)
+{
msx1(TMS9929A, config);
// AY8910/YM2149?
// FDC: None, 0 drives
// 2 Cartridge slots?
- MCFG_MSX_LAYOUT_ROM("bios", 0, 0, 0, 2, "maincpu", 0x0000)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot1", 1, 0)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot2", 2, 0)
- MCFG_MSX_LAYOUT_ROM("ext", 3, 0, 1, 1, "maincpu", 0x8000)
- MCFG_MSX_LAYOUT_RAM_MM("ram_mm", 3, 2, 0x10000) /* 64KB Mapper RAM */
- MCFG_MSX_LAYOUT_YAMAHA_EXPANSION("expansion", 3, 3, "sfg05")
+ add_internal_slot(config, MSX_SLOT_ROM, "bios", 0, 0, 0, 2, "maincpu", 0x0000);
+ add_cartridge_slot<1>(config, MSX_SLOT_CARTRIDGE, "cartslot1", 1, 0, msx_cart, nullptr);
+ add_cartridge_slot<2>(config, MSX_SLOT_CARTRIDGE, "cartslot2", 2, 0, msx_cart, nullptr);
+ add_internal_slot(config, MSX_SLOT_ROM, "ext", 3, 0, 1, 1, "maincpu", 0x8000);
+ add_internal_slot(config, MSX_SLOT_RAM_MM, "ram_mm", 3, 2, 0, 4).set_total_size(0x10000); /* 64KB Mapper RAM */
+ add_cartridge_slot<3>(config, MSX_SLOT_YAMAHA_EXPANSION, "expansion", 3, 3, msx_yamaha_60pin, "sfg05");
msx1_cartlist(config);
-MACHINE_CONFIG_END
+}
/* MSX - Yamaha YIS303 */
@@ -4330,20 +4459,21 @@ ROM_START (yis303)
ROM_FILL( 0x8000, 0xc000, 0xff )
ROM_END
-MACHINE_CONFIG_START(msx_state::yis303)
+void msx_state::yis303(machine_config &config)
+{
msx1(TMS9929A, config);
// AY8910/YM2149?
// FDC: None, 0 drives
// 2 Cartridge slots?
- MCFG_MSX_LAYOUT_ROM("bios", 0, 0, 0, 2, "maincpu", 0x0000)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot1", 1, 0)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot2", 2, 0)
- MCFG_MSX_LAYOUT_ROM("fillff", 3, 0, 0, 3, "maincpu", 0x0000) /* Fill FF */
- MCFG_MSX_LAYOUT_RAM("ram", 3, 0, 3, 1) /* 16KB RAM */
+ add_internal_slot(config, MSX_SLOT_ROM, "bios", 0, 0, 0, 2, "maincpu", 0x0000);
+ add_cartridge_slot<1>(config, MSX_SLOT_CARTRIDGE, "cartslot1", 1, 0, msx_cart, nullptr);
+ add_cartridge_slot<2>(config, MSX_SLOT_CARTRIDGE, "cartslot2", 2, 0, msx_cart, nullptr);
+ add_internal_slot(config, MSX_SLOT_ROM, "fillff", 3, 0, 0, 3, "maincpu", 0x0000); /* Fill FF */
+ add_internal_slot(config, MSX_SLOT_RAM, "ram", 3, 0, 3, 1); /* 16KB RAM */
msx1_cartlist(config);
-MACHINE_CONFIG_END
+}
/* MSX - Yamaha YIS503 */
@@ -4353,20 +4483,21 @@ ROM_START (yis503)
ROM_FILL( 0x8000, 0xc000, 0xff )
ROM_END
-MACHINE_CONFIG_START(msx_state::yis503)
+void msx_state::yis503(machine_config &config)
+{
msx1(TMS9929A, config);
// AY8910/YM2149?
// FDC: None, 0 drives
// 2 Cartridge slots?
- MCFG_MSX_LAYOUT_ROM("bios", 0, 0, 0, 2, "maincpu", 0x0000)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot1", 1, 0)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot2", 2, 0)
- MCFG_MSX_LAYOUT_ROM("fillff", 3, 0, 0, 3, "maincpu", 0x0000) /* Fill FF */
- MCFG_MSX_LAYOUT_RAM("ram", 3, 0, 2, 2) /* 32KB RAM */
+ add_internal_slot(config, MSX_SLOT_ROM, "bios", 0, 0, 0, 2, "maincpu", 0x0000);
+ add_cartridge_slot<1>(config, MSX_SLOT_CARTRIDGE, "cartslot1", 1, 0, msx_cart, nullptr);
+ add_cartridge_slot<2>(config, MSX_SLOT_CARTRIDGE, "cartslot2", 2, 0, msx_cart, nullptr);
+ add_internal_slot(config, MSX_SLOT_ROM, "fillff", 3, 0, 0, 3, "maincpu", 0x0000); /* Fill FF */
+ add_internal_slot(config, MSX_SLOT_RAM, "ram", 3, 0, 2, 2); /* 32KB RAM */
msx1_cartlist(config);
-MACHINE_CONFIG_END
+}
/* MSX - Yamaha YIS503F */
@@ -4375,19 +4506,20 @@ ROM_START (yis503f)
ROM_LOAD ("yis503f.rom", 0x0000, 0x8000, CRC(e9ccd789) SHA1(8963fc041975f31dc2ab1019cfdd4967999de53e))
ROM_END
-MACHINE_CONFIG_START(msx_state::yis503f)
+void msx_state::yis503f(machine_config &config)
+{
msx1(TMS9929A, config);
// YM2149
// FDC: None, 0 drives
// 2 Cartridge slots
- MCFG_MSX_LAYOUT_ROM("bios", 0, 0, 0, 2, "maincpu", 0x0000)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot1", 1, 0)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot2", 2, 0)
- MCFG_MSX_LAYOUT_RAM("ram", 3, 0, 0, 4) /* 64KB?? RAM */
+ add_internal_slot(config, MSX_SLOT_ROM, "bios", 0, 0, 0, 2, "maincpu", 0x0000);
+ add_cartridge_slot<1>(config, MSX_SLOT_CARTRIDGE, "cartslot1", 1, 0, msx_cart, nullptr);
+ add_cartridge_slot<2>(config, MSX_SLOT_CARTRIDGE, "cartslot2", 2, 0, msx_cart, nullptr);
+ add_internal_slot(config, MSX_SLOT_RAM, "ram", 3, 0, 0, 4); /* 64KB?? RAM */
msx1_cartlist(config);
-MACHINE_CONFIG_END
+}
/* MSX - Yamaha YIS503II */
@@ -4396,19 +4528,20 @@ ROM_START (yis503ii)
ROM_LOAD ("yis503iibios.rom", 0x0000, 0x8000, CRC(e2242b53) SHA1(706dd67036baeec7127e4ccd8c8db8f6ce7d0e4c))
ROM_END
-MACHINE_CONFIG_START(msx_state::yis503ii)
+void msx_state::yis503ii(machine_config &config)
+{
msx1(TMS9929A, config);
// AY8910/YM2149?
// FDC: None, 0 drives
// 2 Cartridge slots?
- MCFG_MSX_LAYOUT_ROM("bios", 0, 0, 0, 2, "maincpu", 0x0000)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot1", 1, 0)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot2", 2, 0)
- MCFG_MSX_LAYOUT_RAM("ram", 3, 0, 0, 4) /* 64KB RAM */
+ add_internal_slot(config, MSX_SLOT_ROM, "bios", 0, 0, 0, 2, "maincpu", 0x0000);
+ add_cartridge_slot<1>(config, MSX_SLOT_CARTRIDGE, "cartslot1", 1, 0, msx_cart, nullptr);
+ add_cartridge_slot<2>(config, MSX_SLOT_CARTRIDGE, "cartslot2", 2, 0, msx_cart, nullptr);
+ add_internal_slot(config, MSX_SLOT_RAM, "ram", 3, 0, 0, 4); /* 64KB RAM */
msx1_cartlist(config);
-MACHINE_CONFIG_END
+}
/* MSX - Yamaha YIS503IIR Russian */
@@ -4419,7 +4552,8 @@ ROM_START (y503iir)
ROM_LOAD ("yis503iirnet.rom", 0xc000, 0x2000, CRC(0731db3f) SHA1(264fbb2de69fdb03f87dc5413428f6aa19511a7f))
ROM_END
-MACHINE_CONFIG_START(msx_state::y503iir)
+void msx_state::y503iir(machine_config &config)
+{
msx1(TMS9929A, config);
// YM2149 (in S-3527 MSX Engine)
// FDC: wd2793/mb8877?, 1 3.5" DSDD drive
@@ -4428,19 +4562,19 @@ MACHINE_CONFIG_START(msx_state::y503iir)
// RTC
// V9938 VDP
- MCFG_MSX_LAYOUT_ROM("bios", 0, 0, 0, 2, "maincpu", 0x0000)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot1", 1, 0)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot2", 2, 0)
- MCFG_MSX_LAYOUT_DISK2("disk", 3, 1, 1, 1, "maincpu", 0x8000) /* National disk */
- MCFG_MSX_LAYOUT_RAM("ram", 3, 2, 0, 4) /* 64KB RAM */
- MCFG_MSX_LAYOUT_ROM("net", 3, 3, 1, 1, "maincpu", 0xc000) /* Net */
+ add_internal_slot(config, MSX_SLOT_ROM, "bios", 0, 0, 0, 2, "maincpu", 0x0000);
+ add_cartridge_slot<1>(config, MSX_SLOT_CARTRIDGE, "cartslot1", 1, 0, msx_cart, nullptr);
+ add_cartridge_slot<2>(config, MSX_SLOT_CARTRIDGE, "cartslot2", 2, 0, msx_cart, nullptr);
+ add_internal_slot_mirrored(config, MSX_SLOT_DISK2, "disk", 3, 1, 1, 2, "maincpu", 0x8000).set_tags("fdc", "fdc:0", "fdc:1"); /* National disk */
+ add_internal_slot(config, MSX_SLOT_RAM, "ram", 3, 2, 0, 4); /* 64KB RAM */
+ add_internal_slot(config, MSX_SLOT_ROM, "net", 3, 3, 1, 1, "maincpu", 0xc000); /* Net */
msx_wd2793_force_ready(config);
msx_1_35_dd_drive(config);
msx1_floplist(config);
msx1_cartlist(config);
-MACHINE_CONFIG_END
+}
/* MSX - Yamaha YIS503IIR Estonian */
@@ -4451,25 +4585,26 @@ ROM_START (y503iir2)
ROM_LOAD ("yis503iirnet.rom", 0xc000, 0x2000, CRC(0731db3f) SHA1(264fbb2de69fdb03f87dc5413428f6aa19511a7f))
ROM_END
-MACHINE_CONFIG_START(msx_state::y503iir2)
+void msx_state::y503iir2(machine_config &config)
+{
msx1(TMS9929A, config);
// AY8910/YM2149?
// FDC: wd2793/mb8877?, 1 3.5" DSDD drive?
// 2 Cartridge slots?
- MCFG_MSX_LAYOUT_ROM("bios", 0, 0, 0, 2, "maincpu", 0x0000)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot1", 1, 0)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot2", 2, 0)
- MCFG_MSX_LAYOUT_DISK2("disk", 3, 1, 1, 1, "maincpu", 0x8000) /* National disk */
- MCFG_MSX_LAYOUT_RAM("ram", 3, 2, 0, 4) /* 64KB RAM */
- MCFG_MSX_LAYOUT_ROM("net", 3, 3, 1, 1, "maincpu", 0xc000) /* Net */
+ add_internal_slot(config, MSX_SLOT_ROM, "bios", 0, 0, 0, 2, "maincpu", 0x0000);
+ add_cartridge_slot<1>(config, MSX_SLOT_CARTRIDGE, "cartslot1", 1, 0, msx_cart, nullptr);
+ add_cartridge_slot<2>(config, MSX_SLOT_CARTRIDGE, "cartslot2", 2, 0, msx_cart, nullptr);
+ add_internal_slot_mirrored(config, MSX_SLOT_DISK2, "disk", 3, 1, 1, 2, "maincpu", 0x8000).set_tags("fdc", "fdc:0", "fdc:1"); /* National disk */
+ add_internal_slot(config, MSX_SLOT_RAM, "ram", 3, 2, 0, 4); /* 64KB RAM */
+ add_internal_slot(config, MSX_SLOT_ROM, "net", 3, 3, 1, 1, "maincpu", 0xc000); /* Net */
msx_wd2793_force_ready(config);
msx_1_35_dd_drive(config);
msx1_floplist(config);
msx1_cartlist(config);
-MACHINE_CONFIG_END
+}
/* MSX - Yamaha YIS503M */
@@ -4478,20 +4613,21 @@ ROM_START (yis503m)
ROM_LOAD ("yis503mbios.rom", 0x0000, 0x8000, CRC(e2242b53) SHA1(706dd67036baeec7127e4ccd8c8db8f6ce7d0e4c))
ROM_END
-MACHINE_CONFIG_START(msx_state::yis503m)
+void msx_state::yis503m(machine_config &config)
+{
msx1(TMS9929A, config);
// AY8910/YM2149?
// FDC: None, 0 drives
// 2 Cartridge slots?
- MCFG_MSX_LAYOUT_ROM("bios", 0, 0, 0, 2, "maincpu", 0x0000)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot1", 1, 0)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot2", 2, 0)
- MCFG_MSX_LAYOUT_YAMAHA_EXPANSION("expansion", 3, 0, "sfg05")
- MCFG_MSX_LAYOUT_RAM("ram", 3, 0, 2, 2) /* 32KB RAM */
+ add_internal_slot(config, MSX_SLOT_ROM, "bios", 0, 0, 0, 2, "maincpu", 0x0000);
+ add_cartridge_slot<1>(config, MSX_SLOT_CARTRIDGE, "cartslot1", 1, 0, msx_cart, nullptr);
+ add_cartridge_slot<2>(config, MSX_SLOT_CARTRIDGE, "cartslot2", 2, 0, msx_cart, nullptr);
+ add_cartridge_slot<3>(config, MSX_SLOT_YAMAHA_EXPANSION, "expansion", 3, 0, msx_yamaha_60pin, "sfg05");
+ add_internal_slot(config, MSX_SLOT_RAM, "ram", 3, 0, 2, 2); /* 32KB RAM */
msx1_cartlist(config);
-MACHINE_CONFIG_END
+}
/* MSX - Yashica YC-64 */
@@ -4500,18 +4636,19 @@ ROM_START (yc64)
ROM_LOAD ("yc64bios.rom", 0x0000, 0x8000, CRC(e9ccd789) SHA1(8963fc041975f31dc2ab1019cfdd4967999de53e))
ROM_END
-MACHINE_CONFIG_START(msx_state::yc64)
+void msx_state::yc64(machine_config &config)
+{
msx1(TMS9929A, config);
// YM2149
// FDC: None, 0 drives
// 1 Cartridge slot (slot 1)
- MCFG_MSX_LAYOUT_ROM("bios", 0, 0, 0, 2, "maincpu", 0x0000)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot", 1, 0)
- MCFG_MSX_LAYOUT_RAM("ram", 3, 0, 0, 4) /* 64KB RAM */
+ add_internal_slot(config, MSX_SLOT_ROM, "bios", 0, 0, 0, 2, "maincpu", 0x0000);
+ add_cartridge_slot<1>(config, MSX_SLOT_CARTRIDGE, "cartslot", 1, 0, msx_cart, nullptr);
+ add_internal_slot(config, MSX_SLOT_RAM, "ram", 3, 0, 0, 4); /* 64KB RAM */
msx1_cartlist(config);
-MACHINE_CONFIG_END
+}
/* MSX - Yeno MX64 */
@@ -4520,19 +4657,20 @@ ROM_START (mx64)
ROM_LOAD ("mx64bios.rom", 0x0000, 0x8000, CRC(e0e894b7) SHA1(d99eebded5db5fce1e072d08e642c0909bc7efdd))
ROM_END
-MACHINE_CONFIG_START(msx_state::mx64)
+void msx_state::mx64(machine_config &config)
+{
msx1(TMS9928A, config);
// AY8910/YM2149?
// FDC: None, 0 drives
// 2 Cartridge slots?
- MCFG_MSX_LAYOUT_ROM("bios", 0, 0, 0, 2, "maincpu", 0x0000)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot1", 1, 0)
- MCFG_MSX_LAYOUT_RAM("ram", 2, 0, 0, 4) /* 64KB RAM */
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot2", 3, 0)
+ add_internal_slot(config, MSX_SLOT_ROM, "bios", 0, 0, 0, 2, "maincpu", 0x0000);
+ add_cartridge_slot<1>(config, MSX_SLOT_CARTRIDGE, "cartslot1", 1, 0, msx_cart, nullptr);
+ add_internal_slot(config, MSX_SLOT_RAM, "ram", 2, 0, 0, 4); /* 64KB RAM */
+ add_cartridge_slot<2>(config, MSX_SLOT_CARTRIDGE, "cartslot2", 3, 0, msx_cart, nullptr);
msx1_cartlist(config);
-MACHINE_CONFIG_END
+}
/******************************** MSX 2 **********************************/
@@ -4549,29 +4687,29 @@ ROM_START (ax350)
ROM_LOAD ("ax350disk.rom", 0x2c000, 0x4000, CRC(1e7d6512) SHA1(78cd7f847e77fd8cd51a647efb2725ba93f4c471))
ROM_END
-MACHINE_CONFIG_START(msx2_state::ax350)
+void msx2_state::ax350(machine_config &config)
+{
msx2_pal(config);
// AY8910/YM2149?
// FDC: wd2793/tc8566af?, 1 3.5" DSDD drive
// 2 Cartridge slots?
- MCFG_MSX_LAYOUT_ROM("bios", 0, 0, 0, 2, "maincpu", 0x0000) /* Bios */
- MCFG_MSX_LAYOUT_ROM("ext", 0, 1, 0, 1, "maincpu", 0x8000) /* Ext */
- MCFG_MSX_LAYOUT_ROM("arab", 0, 1, 1, 2, "maincpu", 0xc000) /* Arab */
- MCFG_MSX_LAYOUT_ROM("swp", 0, 2, 1, 2, "maincpu", 0x14000) /* SWP */
- MCFG_MSX_LAYOUT_ROM("paint", 0, 3, 0, 4, "maincpu", 0x1c000) /* Paint */
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot1", 1, 0)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot2", 2, 0)
- MCFG_MSX_LAYOUT_DISK2("disk", 3, 1, 1, 1, "maincpu", 0x2c000) /* Disk */
- MCFG_MSX_LAYOUT_RAM_MM("ram_mm", 3, 2, 0x20000) /* 128KB Mapper RAM */
- MCFG_MSX_RAMIO_SET_BITS(0xf8)
+ add_internal_slot(config, MSX_SLOT_ROM, "bios", 0, 0, 0, 2, "maincpu", 0x0000); /* Bios */
+ add_internal_slot(config, MSX_SLOT_ROM, "ext", 0, 1, 0, 1, "maincpu", 0x8000); /* Ext */
+ add_internal_slot(config, MSX_SLOT_ROM, "arab", 0, 1, 1, 2, "maincpu", 0xc000); /* Arab */
+ add_internal_slot(config, MSX_SLOT_ROM, "swp", 0, 2, 1, 2, "maincpu", 0x14000); /* SWP */
+ add_internal_slot(config, MSX_SLOT_ROM, "paint", 0, 3, 0, 4, "maincpu", 0x1c000); /* Paint */
+ add_cartridge_slot<1>(config, MSX_SLOT_CARTRIDGE, "cartslot1", 1, 0, msx_cart, nullptr);
+ add_cartridge_slot<2>(config, MSX_SLOT_CARTRIDGE, "cartslot2", 2, 0, msx_cart, nullptr);
+ add_internal_slot_mirrored(config, MSX_SLOT_DISK2, "disk", 3, 1, 1, 2, "maincpu", 0x2c000).set_tags("fdc", "fdc:0", "fdc:1"); /* Disk */
+ add_internal_slot(config, MSX_SLOT_RAM_MM, "ram_mm", 3, 2, 0, 4).set_total_size(0x20000).set_ramio_bits(0xf8); /* 128KB Mapper RAM */
msx_wd2793_force_ready(config);
msx_1_35_dd_drive(config);
msx2_floplist(config);
msx2_cartlist(config);
-MACHINE_CONFIG_END
+}
/* MSX2 - Al Alamiah AX-370 */
@@ -4585,29 +4723,29 @@ ROM_START (ax370)
ROM_LOAD ("ax370disk.rom", 0x2c000, 0x4000, CRC(60f8baba) SHA1(95de8809d2758fc0a743390ea5085b602e59e101))
ROM_END
-MACHINE_CONFIG_START(msx2_state::ax370)
+void msx2_state::ax370(machine_config &config)
+{
msx2_pal(config);
// AY8910/YM2149?
// FDC: tc8566af, 1 3.5" DSDD drive
// 2 Cartridge slots?
- MCFG_MSX_LAYOUT_ROM("bios", 0, 0, 0, 2, "maincpu", 0x0000) /* Bios */
- MCFG_MSX_LAYOUT_ROM("swp", 0, 2, 1, 2, "maincpu", 0x14000) /* SWP */
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot1", 1, 0)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot2", 2, 0)
- MCFG_MSX_LAYOUT_RAM_MM("ram_mm", 3, 0, 0x20000) /* 128KB Mapper RAM */
- MCFG_MSX_RAMIO_SET_BITS(0xf8)
- MCFG_MSX_LAYOUT_ROM("ext", 3, 1, 0, 1, "maincpu", 0x8000) /* Ext */
- MCFG_MSX_LAYOUT_ROM("arab", 3, 1, 1, 2, "maincpu", 0xc000) /* Arab */
- MCFG_MSX_LAYOUT_DISK3("disk", 3, 2, 1, 1, "maincpu", 0x2c000)
- MCFG_MSX_LAYOUT_ROM("paint", 3, 3, 0, 4, "maincpu", 0x1c000) /* Paint */
+ add_internal_slot(config, MSX_SLOT_ROM, "bios", 0, 0, 0, 2, "maincpu", 0x0000); /* Bios */
+ add_internal_slot(config, MSX_SLOT_ROM, "swp", 0, 2, 1, 2, "maincpu", 0x14000); /* SWP */
+ add_cartridge_slot<1>(config, MSX_SLOT_CARTRIDGE, "cartslot1", 1, 0, msx_cart, nullptr);
+ add_cartridge_slot<2>(config, MSX_SLOT_CARTRIDGE, "cartslot2", 2, 0, msx_cart, nullptr);
+ add_internal_slot(config, MSX_SLOT_RAM_MM, "ram_mm", 3, 0, 0, 4).set_total_size(0x20000).set_ramio_bits(0xf8); /* 128KB Mapper RAM */
+ add_internal_slot(config, MSX_SLOT_ROM, "ext", 3, 1, 0, 1, "maincpu", 0x8000); /* Ext */
+ add_internal_slot(config, MSX_SLOT_ROM, "arab", 3, 1, 1, 2, "maincpu", 0xc000); /* Arab */
+ add_internal_slot(config, MSX_SLOT_DISK3, "disk", 3, 2, 1, 1, "maincpu", 0x2c000).set_tags("fdc", "fdc:0", "fdc:1");
+ add_internal_slot(config, MSX_SLOT_ROM, "paint", 3, 3, 0, 4, "maincpu", 0x1c000); /* Paint */
msx_tc8566af(config);
msx_1_35_dd_drive(config);
msx2_floplist(config);
msx2_cartlist(config);
-MACHINE_CONFIG_END
+}
/* MSX2 - Canon V-25 */
@@ -4617,7 +4755,8 @@ ROM_START (canonv25)
ROM_LOAD ("v25ext.rom", 0x8000, 0x4000, CRC(4a48779c) SHA1(b8e30d604d319d511cbfbc61e5d8c38fbb9c5a33))
ROM_END
-MACHINE_CONFIG_START(msx2_state::canonv25)
+void msx2_state::canonv25(machine_config &config)
+{
msx2(config);
// YM2149 (in S-1985 MSX Engine)
// FDC: None, 0 drives
@@ -4625,18 +4764,18 @@ MACHINE_CONFIG_START(msx2_state::canonv25)
// S-1985 MSX Engine
// 64KB VRAM
- MCFG_MSX_LAYOUT_ROM("bios", 0, 0, 0, 2, "maincpu", 0x0000) // BIOS
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot1", 1, 0)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot2", 2, 0)
- MCFG_MSX_LAYOUT_ROM("ext", 3, 0, 0, 1, "maincpu", 0x8000) // EXT
- MCFG_MSX_LAYOUT_RAM_MM("ram_mm", 3, 2, 0x10000) // 64KB Mapper RAM
+ add_internal_slot(config, MSX_SLOT_ROM, "bios", 0, 0, 0, 2, "maincpu", 0x0000); // BIOS
+ add_cartridge_slot<1>(config, MSX_SLOT_CARTRIDGE, "cartslot1", 1, 0, msx_cart, nullptr);
+ add_cartridge_slot<2>(config, MSX_SLOT_CARTRIDGE, "cartslot2", 2, 0, msx_cart, nullptr);
+ add_internal_slot(config, MSX_SLOT_ROM, "ext", 3, 0, 0, 1, "maincpu", 0x8000); // EXT
+ add_internal_slot(config, MSX_SLOT_RAM_MM, "ram_mm", 3, 2, 0, 4).set_total_size(0x10000); // 64KB Mapper RAM
MSX_S1985(config, "s1985", 0);
msx2_64kb_vram(config);
msx2_cartlist(config);
-MACHINE_CONFIG_END
+}
/* MSX2 - Canon V-30 */
@@ -4647,19 +4786,20 @@ ROM_START (canonv30)
ROM_LOAD ("v30disk.rom", 0xc000, 0x4000, CRC(54c73ad6) SHA1(12f2cc79b3d09723840bae774be48c0d721ec1c6))
ROM_END
-MACHINE_CONFIG_START(msx2_state::canonv30)
+void msx2_state::canonv30(machine_config &config)
+{
msx2(config);
// YM2149 (in S-1985 MSX Engine)
// FDC: ??, 2 3.5" DSDD drive
// 2 Cartridge slots
// S-1985 MSX Engine
- MCFG_MSX_LAYOUT_ROM("bios", 0, 0, 0, 2, "maincpu", 0x0000) // BIOS
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot1", 1, 0)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot2", 2, 0)
- MCFG_MSX_LAYOUT_ROM("ext", 3, 0, 0, 1, "maincpu", 0x8000) // EXT
- MCFG_MSX_LAYOUT_DISK1("disk", 3, 1, 1, 1, "maincpu", 0xc000) // DISK
- MCFG_MSX_LAYOUT_RAM_MM("ram_mm", 3, 2, 0x10000) // 64KB?? Mapper RAM
+ add_internal_slot(config, MSX_SLOT_ROM, "bios", 0, 0, 0, 2, "maincpu", 0x0000); // BIOS
+ add_cartridge_slot<1>(config, MSX_SLOT_CARTRIDGE, "cartslot1", 1, 0, msx_cart, nullptr);
+ add_cartridge_slot<2>(config, MSX_SLOT_CARTRIDGE, "cartslot2", 2, 0, msx_cart, nullptr);
+ add_internal_slot(config, MSX_SLOT_ROM, "ext", 3, 0, 0, 1, "maincpu", 0x8000); // EXT
+ add_internal_slot_mirrored(config, MSX_SLOT_DISK1, "disk", 3, 1, 1, 2, "maincpu", 0xc000).set_tags("fdc", "fdc:0", "fdc:1"); // DISK
+ add_internal_slot(config, MSX_SLOT_RAM_MM, "ram_mm", 3, 2, 0, 4).set_total_size(0x10000); // 64KB?? Mapper RAM
MSX_S1985(config, "s1985", 0);
@@ -4668,7 +4808,7 @@ MACHINE_CONFIG_START(msx2_state::canonv30)
msx2_floplist(config);
msx2_cartlist(config);
-MACHINE_CONFIG_END
+}
/* MSX2 - Canon V-30F */
@@ -4679,19 +4819,20 @@ ROM_START (canonv30f)
ROM_LOAD ("v30fdisk.rom", 0xc000, 0x4000, CRC(54c73ad6) SHA1(12f2cc79b3d09723840bae774be48c0d721ec1c6))
ROM_END
-MACHINE_CONFIG_START(msx2_state::canonv30f)
+void msx2_state::canonv30f(machine_config &config)
+{
msx2(config);
// YM2149 (in S-1985 MSX Engine)
// FDC: ??, 2 3.5" DSDD drive
// 2 Cartridge slots
// S-1985 MSX Engine
- MCFG_MSX_LAYOUT_ROM("bios", 0, 0, 0, 2, "maincpu", 0x0000) // BIOS
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot1", 1, 0)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot2", 2, 0)
- MCFG_MSX_LAYOUT_ROM("ext", 3, 0, 0, 1, "maincpu", 0x8000) // EXT
- MCFG_MSX_LAYOUT_DISK1("disk", 3, 1, 1, 1, "maincpu", 0xc000) // DISK
- MCFG_MSX_LAYOUT_RAM_MM("ram_mm", 3, 2, 0x20000) // 128KB Mapper RAM
+ add_internal_slot(config, MSX_SLOT_ROM, "bios", 0, 0, 0, 2, "maincpu", 0x0000); // BIOS
+ add_cartridge_slot<1>(config, MSX_SLOT_CARTRIDGE, "cartslot1", 1, 0, msx_cart, nullptr);
+ add_cartridge_slot<2>(config, MSX_SLOT_CARTRIDGE, "cartslot2", 2, 0, msx_cart, nullptr);
+ add_internal_slot(config, MSX_SLOT_ROM, "ext", 3, 0, 0, 1, "maincpu", 0x8000); // EXT
+ add_internal_slot_mirrored(config, MSX_SLOT_DISK1, "disk", 3, 1, 1, 2, "maincpu", 0xc000).set_tags("fdc", "fdc:0", "fdc:1"); // DISK
+ add_internal_slot(config, MSX_SLOT_RAM_MM, "ram_mm", 3, 2, 0, 4).set_total_size(0x20000); // 128KB Mapper RAM
MSX_S1985(config, "s1985", 0);
@@ -4700,7 +4841,7 @@ MACHINE_CONFIG_START(msx2_state::canonv30f)
msx2_floplist(config);
msx2_cartlist(config);
-MACHINE_CONFIG_END
+}
/* MSX2 - Daewoo CPC-300 */
@@ -4711,25 +4852,25 @@ ROM_START (cpc300)
ROM_LOAD ("300han.rom", 0x10000, 0x8000, CRC(e78cd87f) SHA1(47a9d9a24e4fc6f9467c6e7d61a02d45f5a753ef))
ROM_END
-MACHINE_CONFIG_START(msx2_state::cpc300)
+void msx2_state::cpc300(machine_config &config)
+{
msx2(config);
// YM2149 (in S-1985 MSX Engine)
// FDC: None, 0 drives
// 2 Cartridge slots
// S-1985 MSX Engine
- MCFG_MSX_LAYOUT_ROM("bios", 0, 0, 0, 2, "maincpu", 0x0000)
- MCFG_MSX_LAYOUT_ROM("han", 0, 1, 1, 2, "maincpu", 0x10000)
- MCFG_MSX_LAYOUT_RAM_MM("ram_mm", 0, 2, 0x20000) /* 128KB Mapper RAM */
- MCFG_MSX_RAMIO_SET_BITS(0x80)
- MCFG_MSX_LAYOUT_ROM("ext", 0, 3, 0, 2, "maincpu", 0x8000)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot1", 1, 0)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot2", 3, 0)
+ add_internal_slot(config, MSX_SLOT_ROM, "bios", 0, 0, 0, 2, "maincpu", 0x0000);
+ add_internal_slot(config, MSX_SLOT_ROM, "han", 0, 1, 1, 2, "maincpu", 0x10000);
+ add_internal_slot(config, MSX_SLOT_RAM_MM, "ram_mm", 0, 2, 0, 4).set_total_size(0x20000).set_ramio_bits(0x80); /* 128KB Mapper RAM */
+ add_internal_slot(config, MSX_SLOT_ROM, "ext", 0, 3, 0, 2, "maincpu", 0x8000);
+ add_cartridge_slot<1>(config, MSX_SLOT_CARTRIDGE, "cartslot1", 1, 0, msx_cart, nullptr);
+ add_cartridge_slot<2>(config, MSX_SLOT_CARTRIDGE, "cartslot2", 3, 0, msx_cart, nullptr);
MSX_S1985(config, "s1985", 0);
msx2_cartlist(config);
-MACHINE_CONFIG_END
+}
/* MSX2 - Daewoo CPC-300E */
@@ -4741,7 +4882,8 @@ ROM_START (cpc300e)
ROM_LOAD ("300ehan.rom", 0x10000, 0x4000, BAD_DUMP CRC(5afea78d) SHA1(f08c91f8c78d681e1f02eaaaaafb87ad81112b60))
ROM_END
-MACHINE_CONFIG_START(msx2_state::cpc300e)
+void msx2_state::cpc300e(machine_config &config)
+{
msx2(config);
// AY8910/YM2149?
// FDC: None, 0 drives
@@ -4749,16 +4891,15 @@ MACHINE_CONFIG_START(msx2_state::cpc300e)
// No clockchip
// No joystick port??
- MCFG_MSX_LAYOUT_ROM("bios", 0, 0, 0, 2, "maincpu", 0x0000)
- MCFG_MSX_LAYOUT_ROM("han", 0, 1, 1, 1, "maincpu", 0x10000)
- MCFG_MSX_LAYOUT_RAM_MM("ram_mm", 0, 2, 0x20000) /* 128KB Mapper RAM */
- MCFG_MSX_RAMIO_SET_BITS(0x80)
- MCFG_MSX_LAYOUT_ROM("ext", 0, 3, 0, 2, "maincpu", 0x8000)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot1", 1, 0)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot2", 3, 0)
+ add_internal_slot(config, MSX_SLOT_ROM, "bios", 0, 0, 0, 2, "maincpu", 0x0000);
+ add_internal_slot(config, MSX_SLOT_ROM, "han", 0, 1, 1, 1, "maincpu", 0x10000);
+ add_internal_slot(config, MSX_SLOT_RAM_MM, "ram_mm", 0, 2, 0, 4).set_total_size(0x20000).set_ramio_bits(0x80); /* 128KB Mapper RAM */
+ add_internal_slot(config, MSX_SLOT_ROM, "ext", 0, 3, 0, 2, "maincpu", 0x8000);
+ add_cartridge_slot<1>(config, MSX_SLOT_CARTRIDGE, "cartslot1", 1, 0, msx_cart, nullptr);
+ add_cartridge_slot<2>(config, MSX_SLOT_CARTRIDGE, "cartslot2", 3, 0, msx_cart, nullptr);
msx2_cartlist(config);
-MACHINE_CONFIG_END
+}
/* MSX2 - Daewoo CPC-330K */
@@ -4769,7 +4910,8 @@ ROM_START (cpc330k)
ROM_LOAD ("330khan.rom", 0x10000, 0x4000, CRC(3d6dd335) SHA1(d2b058989a700ca772b9591f42c01ed0f45f74d6))
ROM_END
-MACHINE_CONFIG_START(msx2_state::cpc330k)
+void msx2_state::cpc330k(machine_config &config)
+{
msx2(config);
// YM2149 (in S-1985 MSX Engine)
// FDC: None, 0 drives
@@ -4778,17 +4920,17 @@ MACHINE_CONFIG_START(msx2_state::cpc330k)
// Ergonomic keyboard, 2 builtin game controllers
// builtin FM?? builtin SCC??
- MCFG_MSX_LAYOUT_ROM("bios", 0, 0, 0, 2, "maincpu", 0x0000)
- MCFG_MSX_LAYOUT_ROM("han", 0, 1, 1, 1, "maincpu", 0x10000)
- MCFG_MSX_LAYOUT_RAM_MM("ram_mm", 0, 2, 0x20000) /* 128KB Mapper RAM */
- MCFG_MSX_LAYOUT_ROM("ext", 0, 3, 0, 2, "maincpu", 0x8000)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot1", 1, 0)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot2", 3, 0)
+ add_internal_slot(config, MSX_SLOT_ROM, "bios", 0, 0, 0, 2, "maincpu", 0x0000);
+ add_internal_slot(config, MSX_SLOT_ROM, "han", 0, 1, 1, 1, "maincpu", 0x10000);
+ add_internal_slot(config, MSX_SLOT_RAM_MM, "ram_mm", 0, 2, 0, 4).set_total_size(0x20000); /* 128KB Mapper RAM */
+ add_internal_slot(config, MSX_SLOT_ROM, "ext", 0, 3, 0, 2, "maincpu", 0x8000);
+ add_cartridge_slot<1>(config, MSX_SLOT_CARTRIDGE, "cartslot1", 1, 0, msx_cart, nullptr);
+ add_cartridge_slot<2>(config, MSX_SLOT_CARTRIDGE, "cartslot2", 3, 0, msx_cart, nullptr);
MSX_S1985(config, "s1985", 0);
msx2_cartlist(config);
-MACHINE_CONFIG_END
+}
/* MSX2 - Daewoo CPC-400 */
@@ -4803,27 +4945,27 @@ ROM_START (cpc400)
ROM_LOAD ("400kfn.rom", 0, 0x20000, CRC(b663c605) SHA1(965f4982790f1817bcbabbb38c8777183b231a55))
ROM_END
-MACHINE_CONFIG_START(msx2_state::cpc400)
+void msx2_state::cpc400(machine_config &config)
+{
msx2(config);
// AY8910/YM2149?
// FDC: mb8877a, 1 3.5" DS?DD drive
// 2 Cartridge slots?
- MCFG_MSX_LAYOUT_ROM("bios", 0, 0, 0, 2, "maincpu", 0x0000)
- MCFG_MSX_LAYOUT_ROM("han", 0, 1, 1, 2, "maincpu", 0x14000)
- MCFG_MSX_LAYOUT_RAM_MM("ram_mm", 0, 2, 0x20000) /* 128KB Mapper RAM */
- MCFG_MSX_RAMIO_SET_BITS(0x80)
- MCFG_MSX_LAYOUT_ROM("ext", 0, 3, 0, 2, "maincpu", 0xc000)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot1", 1, 0)
- MCFG_MSX_LAYOUT_DISK2("disk", 2, 0, 1, 1, "maincpu", 0x8000)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot2", 3, 0)
+ add_internal_slot(config, MSX_SLOT_ROM, "bios", 0, 0, 0, 2, "maincpu", 0x0000);
+ add_internal_slot(config, MSX_SLOT_ROM, "han", 0, 1, 1, 2, "maincpu", 0x14000);
+ add_internal_slot(config, MSX_SLOT_RAM_MM, "ram_mm", 0, 2, 0, 4).set_total_size(0x20000).set_ramio_bits(0x80); /* 128KB Mapper RAM */
+ add_internal_slot(config, MSX_SLOT_ROM, "ext", 0, 3, 0, 2, "maincpu", 0xc000);
+ add_cartridge_slot<1>(config, MSX_SLOT_CARTRIDGE, "cartslot1", 1, 0, msx_cart, nullptr);
+ add_internal_slot_mirrored(config, MSX_SLOT_DISK2, "disk", 2, 0, 1, 2, "maincpu", 0x8000).set_tags("fdc", "fdc:0", "fdc:1");
+ add_cartridge_slot<2>(config, MSX_SLOT_CARTRIDGE, "cartslot2", 3, 0, msx_cart, nullptr);
msx_mb8877a(config);
msx_1_35_dd_drive(config);
msx2_floplist(config);
msx2_cartlist(config);
-MACHINE_CONFIG_END
+}
/* MSX2 - Daewoo CPC-400S */
@@ -4838,21 +4980,21 @@ ROM_START (cpc400s)
ROM_LOAD ("400skfn.rom", 0, 0x20000, CRC(fa85368c) SHA1(30fff22e3e3d464993707488442721a5e56a9707))
ROM_END
-MACHINE_CONFIG_START(msx2_state::cpc400s)
+void msx2_state::cpc400s(machine_config &config)
+{
msx2(config);
// YM2149 (in S-1985 MSX Engine)
// FDC: mb8877a, 1 3.5" DS?DD drive
// 2 Cartridge slots
// S-1985 MSX Engine
- MCFG_MSX_LAYOUT_ROM("bios", 0, 0, 0, 2, "maincpu", 0x0000)
- MCFG_MSX_LAYOUT_ROM("han", 0, 1, 1, 2, "maincpu", 0x14000)
- MCFG_MSX_LAYOUT_RAM_MM("ram_mm", 0, 2, 0x20000) /* 128KB Mapper RAM */
- MCFG_MSX_RAMIO_SET_BITS(0x80)
- MCFG_MSX_LAYOUT_ROM("ext", 0, 3, 0, 2, "maincpu", 0xc000)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot1", 1, 0)
- MCFG_MSX_LAYOUT_DISK2("disk", 2, 0, 1, 1, "maincpu", 0x8000)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot2", 3, 0)
+ add_internal_slot(config, MSX_SLOT_ROM, "bios", 0, 0, 0, 2, "maincpu", 0x0000);
+ add_internal_slot(config, MSX_SLOT_ROM, "han", 0, 1, 1, 2, "maincpu", 0x14000);
+ add_internal_slot(config, MSX_SLOT_RAM_MM, "ram_mm", 0, 2, 0, 4).set_total_size(0x20000).set_ramio_bits(0x80); /* 128KB Mapper RAM */
+ add_internal_slot(config, MSX_SLOT_ROM, "ext", 0, 3, 0, 2, "maincpu", 0xc000);
+ add_cartridge_slot<1>(config, MSX_SLOT_CARTRIDGE, "cartslot1", 1, 0, msx_cart, nullptr);
+ add_internal_slot_mirrored(config, MSX_SLOT_DISK2, "disk", 2, 0, 1, 2, "maincpu", 0x8000).set_tags("fdc", "fdc:0", "fdc:1");
+ add_cartridge_slot<2>(config, MSX_SLOT_CARTRIDGE, "cartslot2", 3, 0, msx_cart, nullptr);
MSX_S1985(config, "s1985", 0);
@@ -4861,7 +5003,7 @@ MACHINE_CONFIG_START(msx2_state::cpc400s)
msx2_floplist(config);
msx2_cartlist(config);
-MACHINE_CONFIG_END
+}
/* MSX2 - Daewoo Zemmix CPC-61 */
@@ -4874,7 +5016,8 @@ ROM_START (cpc61)
ROM_LOAD ("61kfn.rom", 0x00000, 0x40000, CRC(9a3cf67c) SHA1(22d5f4e522250dc5eb17e15b68f4a51bb752cba1))
ROM_END
-MACHINE_CONFIG_START(msx2_state::cpc61)
+void msx2_state::cpc61(machine_config &config)
+{
msx2(config);
// YM2149 (in S-1985 MSX Engine)
// FDC: None, 0 drives
@@ -4885,15 +5028,15 @@ MACHINE_CONFIG_START(msx2_state::cpc61)
// No printer port
// No cassette port?
- MCFG_MSX_LAYOUT_ROM("bios", 0, 0, 0, 2, "maincpu", 0x0000)
- MCFG_MSX_LAYOUT_RAM_MM("ram_mm", 0, 2, 0x10000) // 64KB Mapper RAM?
- MCFG_MSX_LAYOUT_ROM("ext", 0, 3, 0, 2, "maincpu", 0x8000)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot1", 1, 0)
+ add_internal_slot(config, MSX_SLOT_ROM, "bios", 0, 0, 0, 2, "maincpu", 0x0000);
+ add_internal_slot(config, MSX_SLOT_RAM_MM, "ram_mm", 0, 2, 0, 4).set_total_size(0x10000); // 64KB Mapper RAM?
+ add_internal_slot(config, MSX_SLOT_ROM, "ext", 0, 3, 0, 2, "maincpu", 0x8000);
+ add_cartridge_slot<1>(config, MSX_SLOT_CARTRIDGE, "cartslot1", 1, 0, msx_cart, nullptr);
MSX_S1985(config, "s1985", 0);
msx2_cartlist(config);
-MACHINE_CONFIG_END
+}
/* MSX2 - Daewoo Zemmix CPG-120 Normal */
@@ -4907,7 +5050,8 @@ ROM_START (cpg120)
ROM_LOAD ("cpg120kfn.rom", 0x0000, 0x40000, CRC(9a3cf67c) SHA1(22d5f4e522250dc5eb17e15b68f4a51bb752cba1))
ROM_END
-MACHINE_CONFIG_START(msx2_state::cpg120)
+void msx2_state::cpg120(machine_config &config)
+{
msx2(config);
// YM2149 (in S1985)
// FDC: None, 0 drives
@@ -4919,19 +5063,19 @@ MACHINE_CONFIG_START(msx2_state::cpg120)
// No clock chip
// No printer port
- MCFG_MSX_LAYOUT_ROM("bios", 0, 0, 0, 2, "maincpu", 0x0000)
- MCFG_MSX_LAYOUT_RAM_MM("ram_mm", 0, 2, 0x20000) // 128KB Mapper RAM
- MCFG_MSX_LAYOUT_ROM("ext", 0, 3, 0, 2, "maincpu", 0x8000)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot1", 1, 0)
- MCFG_MSX_LAYOUT_MUSIC("mus", 2, 0, 1, 1, "maincpu", 0x10000)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot2", 3, 0)
+ add_internal_slot(config, MSX_SLOT_ROM, "bios", 0, 0, 0, 2, "maincpu", 0x0000);
+ add_internal_slot(config, MSX_SLOT_RAM_MM, "ram_mm", 0, 2, 0, 4).set_total_size(0x20000); // 128KB Mapper RAM
+ add_internal_slot(config, MSX_SLOT_ROM, "ext", 0, 3, 0, 2, "maincpu", 0x8000);
+ add_cartridge_slot<1>(config, MSX_SLOT_CARTRIDGE, "cartslot1", 1, 0, msx_cart, nullptr);
+ add_internal_slot(config, MSX_SLOT_MUSIC, "mus", 2, 0, 1, 1, "maincpu", 0x10000).set_ym2413_tag("ym2413");
+ add_cartridge_slot<2>(config, MSX_SLOT_CARTRIDGE, "cartslot2", 3, 0, msx_cart, nullptr);
MSX_S1985(config, "s1985", 0);
msx_ym2413(config);
msx2_cartlist(config);
-MACHINE_CONFIG_END
+}
/* MSX2 - Daewoo Zemmic CPG-120 Turbo */
/* Same as normal CPG-120 but with CPU running at 5.369317 MHz */
@@ -4945,7 +5089,8 @@ ROM_START (fpc900)
ROM_LOAD ("fpc900disk.rom", 0xc000, 0x4000, CRC(ca3307d3) SHA1(c3efedda7ab947a06d9345f7b8261076fa7ceeef))
ROM_END
-MACHINE_CONFIG_START(msx2_state::fpc900)
+void msx2_state::fpc900(machine_config &config)
+{
msx2_pal(config);
// YM2149 (in S-3527 MSX Engine)
// FDC: WD2793?, 1 3.5" DSDD drive
@@ -4953,19 +5098,19 @@ MACHINE_CONFIG_START(msx2_state::fpc900)
// S-3527 MSX Engine
// 256KB?? VRAM
- MCFG_MSX_LAYOUT_ROM("bios", 0, 0, 0, 2, "maincpu", 0x0000)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot1", 1, 0)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot2", 2, 0)
- MCFG_MSX_LAYOUT_ROM("ext", 3, 0, 0, 1, "maincpu", 0x8000)
- MCFG_MSX_LAYOUT_RAM_MM("ram_mm", 3, 2, 0x40000) // 256KB? Mapper RAM
- MCFG_MSX_LAYOUT_DISK1("disk", 3, 3, 1, 1, "maincpu", 0xc000)
+ add_internal_slot(config, MSX_SLOT_ROM, "bios", 0, 0, 0, 2, "maincpu", 0x0000);
+ add_cartridge_slot<1>(config, MSX_SLOT_CARTRIDGE, "cartslot1", 1, 0, msx_cart, nullptr);
+ add_cartridge_slot<2>(config, MSX_SLOT_CARTRIDGE, "cartslot2", 2, 0, msx_cart, nullptr);
+ add_internal_slot(config, MSX_SLOT_ROM, "ext", 3, 0, 0, 1, "maincpu", 0x8000);
+ add_internal_slot(config, MSX_SLOT_RAM_MM, "ram_mm", 3, 2, 0, 4).set_total_size(0x40000); // 256KB? Mapper RAM
+ add_internal_slot_mirrored(config, MSX_SLOT_DISK1, "disk", 3, 3, 1, 2, "maincpu", 0xc000).set_tags("fdc", "fdc:0", "fdc:1");
msx_wd2793_force_ready(config);
msx_1_35_dd_drive(config);
msx2_floplist(config);
msx2_cartlist(config);
-MACHINE_CONFIG_END
+}
/* MSX2 - Gradiente Expert 2.0 */
@@ -4977,27 +5122,27 @@ ROM_START (expert20)
ROM_LOAD ("microsoldisk.rom", 0x10000, 0x4000, CRC(6704ef81) SHA1(a3028515ed829e900cc8deb403e17b09a38bf9b0))
ROM_END
-MACHINE_CONFIG_START(msx2_state::expert20)
+void msx2_state::expert20(machine_config &config)
+{
msx2_pal(config);
// AY8910/YM2149?
// FDC: microsol, 1? 3.5"? DS?DD drive
// 2 Cartridge slots?
- MCFG_MSX_LAYOUT_ROM("bios", 0, 0, 0, 2, "maincpu", 0x0000)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot1", 1, 0)
- MCFG_MSX_LAYOUT_ROM("ext", 1, 1, 0, 1, "maincpu", 0x8000) /* EXT */
- MCFG_MSX_LAYOUT_ROM("xbasic", 1, 1, 1, 1, "maincpu", 0xc000) /* XBASIC */
- MCFG_MSX_LAYOUT_DISK5("disk", 1, 3, 1, 1, "maincpu", 0x10000) /* Microsol controller */
- MCFG_MSX_LAYOUT_RAM_MM("ram_mm", 2, 0, 0x20000) /* 128KB Mapper RAM */
- MCFG_MSX_RAMIO_SET_BITS(0x80)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot2", 3, 0)
+ add_internal_slot(config, MSX_SLOT_ROM, "bios", 0, 0, 0, 2, "maincpu", 0x0000);
+ add_cartridge_slot<1>(config, MSX_SLOT_CARTRIDGE, "cartslot1", 1, 0, msx_cart, nullptr);
+ add_internal_slot(config, MSX_SLOT_ROM, "ext", 1, 1, 0, 1, "maincpu", 0x8000); /* EXT */
+ add_internal_slot(config, MSX_SLOT_ROM, "xbasic", 1, 1, 1, 1, "maincpu", 0xc000); /* XBASIC */
+ add_internal_slot(config, MSX_SLOT_DISK5, "disk", 1, 3, 1, 1, "maincpu", 0x10000).set_tags("fdc", "fdc:0", "fdc:1", "fdc:2", "fdc:3"); /* Microsol controller */
+ add_internal_slot(config, MSX_SLOT_RAM_MM, "ram_mm", 2, 0, 0, 4).set_total_size(0x20000).set_ramio_bits(0x80); /* 128KB Mapper RAM */
+ add_cartridge_slot<2>(config, MSX_SLOT_CARTRIDGE, "cartslot2", 3, 0, msx_cart, nullptr);
msx_microsol(config);
msx_1_35_dd_drive(config);
msx2_floplist(config);
msx2_cartlist(config);
-MACHINE_CONFIG_END
+}
/* MSX2 - Hitachi MB-H70 */
@@ -5012,20 +5157,21 @@ ROM_START (mbh70)
ROM_LOAD ("mbh70kfn.rom", 0x0000, 0x20000, CRC(d23d4d2d) SHA1(db03211b7db46899df41db2b1dfbec972109a967))
ROM_END
-MACHINE_CONFIG_START(msx2_state::mbh70)
+void msx2_state::mbh70(machine_config &config)
+{
msx2(config);
// YM2149 (in S-1985)
// FDC: WD2793?, 1? 3.5" DSDD drive
// S-1985 MSX Engine
// 2? Cartridge slots
- MCFG_MSX_LAYOUT_ROM("bios", 0, 0, 0, 2, "maincpu", 0x0000)
- MCFG_MSX_LAYOUT_SONY08("firm", 0, 3, 0, 4, "maincpu", 0x10000)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot1", 1, 0)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot2", 2, 0)
- MCFG_MSX_LAYOUT_ROM("ext", 3, 0, 0, 1, "maincpu", 0x8000)
- MCFG_MSX_LAYOUT_DISK1("disk", 3, 0, 1, 1, "maincpu", 0xc000)
- MCFG_MSX_LAYOUT_RAM_MM("ram_mm", 3, 2, 0x20000) // 128KB Mapper RAM
+ add_internal_slot(config, MSX_SLOT_ROM, "bios", 0, 0, 0, 2, "maincpu", 0x0000);
+ add_internal_slot(config, MSX_SLOT_SONY08, "firm", 0, 3, 0, 4, "maincpu", 0x10000);
+ add_cartridge_slot<1>(config, MSX_SLOT_CARTRIDGE, "cartslot1", 1, 0, msx_cart, nullptr);
+ add_cartridge_slot<2>(config, MSX_SLOT_CARTRIDGE, "cartslot2", 2, 0, msx_cart, nullptr);
+ add_internal_slot(config, MSX_SLOT_ROM, "ext", 3, 0, 0, 1, "maincpu", 0x8000);
+ add_internal_slot_mirrored(config, MSX_SLOT_DISK1, "disk", 3, 0, 1, 2, "maincpu", 0xc000).set_tags("fdc", "fdc:0", "fdc:1");
+ add_internal_slot(config, MSX_SLOT_RAM_MM, "ram_mm", 3, 2, 0, 4).set_total_size(0x20000); // 128KB Mapper RAM
MSX_S1985(config, "s1985", 0);
@@ -5034,7 +5180,7 @@ MACHINE_CONFIG_START(msx2_state::mbh70)
msx2_floplist(config);
msx2_cartlist(config);
-MACHINE_CONFIG_END
+}
/* MSX2 - Kawai KMC-5000 */
@@ -5049,20 +5195,21 @@ ROM_START (kmc5000)
ROM_LOAD ("kmc5000kfn.rom", 0, 0x20000, CRC(c61ddc5d) SHA1(5e872d5853698731a0ed22fb72dbcdfd59cd19c3))
ROM_END
-MACHINE_CONFIG_START(msx2_state::kmc5000)
+void msx2_state::kmc5000(machine_config &config)
+{
msx2(config);
// YM2149 (in S-1985)
// FDC: TC8566AF?, 1? 3.5" DSDD drive
// S-1985 MSX Engine
// 2? Cartridge slots
- MCFG_MSX_LAYOUT_ROM("bios", 0, 0, 0, 2, "maincpu", 0x0000)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot1", 1, 0)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot2", 2, 0)
- MCFG_MSX_LAYOUT_RAM_MM("ram_mm", 3, 0, 0x10000)
- MCFG_MSX_LAYOUT_ROM("ext", 3, 1, 0, 1, "maincpu", 0x8000)
- MCFG_MSX_LAYOUT_ROM("kdr", 3, 1, 1, 2, "maincpu", 0x10000)
- MCFG_MSX_LAYOUT_DISK3("disk", 3, 2, 1, 1, "maincpu", 0xc000)
+ add_internal_slot(config, MSX_SLOT_ROM, "bios", 0, 0, 0, 2, "maincpu", 0x0000);
+ add_cartridge_slot<1>(config, MSX_SLOT_CARTRIDGE, "cartslot1", 1, 0, msx_cart, nullptr);
+ add_cartridge_slot<2>(config, MSX_SLOT_CARTRIDGE, "cartslot2", 2, 0, msx_cart, nullptr);
+ add_internal_slot(config, MSX_SLOT_RAM_MM, "ram_mm", 3, 0, 0, 4).set_total_size(0x10000);
+ add_internal_slot(config, MSX_SLOT_ROM, "ext", 3, 1, 0, 1, "maincpu", 0x8000);
+ add_internal_slot(config, MSX_SLOT_ROM, "kdr", 3, 1, 1, 2, "maincpu", 0x10000);
+ add_internal_slot(config, MSX_SLOT_DISK3, "disk", 3, 2, 1, 1, "maincpu", 0xc000).set_tags("fdc", "fdc:0", "fdc:1");
MSX_S1985(config, "s1985", 0);
@@ -5071,7 +5218,7 @@ MACHINE_CONFIG_START(msx2_state::kmc5000)
msx2_floplist(config);
msx2_cartlist(config);
-MACHINE_CONFIG_END
+}
/* MSX2 - Mitsubishi ML-G1 */
@@ -5082,24 +5229,25 @@ ROM_START (mlg1)
ROM_LOAD ("mlg1paint.rom", 0xc000, 0x8000, CRC(64df1750) SHA1(5cf0abca6dbcf940bc33c433ecb4e4ada02fbfe6))
ROM_END
-MACHINE_CONFIG_START(msx2_state::mlg1)
+void msx2_state::mlg1(machine_config &config)
+{
msx2_pal(config);
// YM2149 (in S-1985)
// FDC: None, 0 drives
// S-1985 MSX Engine
// 2 Cartridge slots
- MCFG_MSX_LAYOUT_ROM("bios", 0, 0, 0, 2, "maincpu", 0x0000)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot1", 1, 0)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot2", 2, 0)
- MCFG_MSX_LAYOUT_ROM("ext", 3, 0, 0, 1, "maincpu", 0x8000)
- MCFG_MSX_LAYOUT_RAM_MM("ram_mm", 3, 2, 0x20000) // 64KB or 128KB Mapper RAM ?
- MCFG_MSX_LAYOUT_ROM("paint", 3, 3, 0, 2, "maincpu", 0xc000)
+ add_internal_slot(config, MSX_SLOT_ROM, "bios", 0, 0, 0, 2, "maincpu", 0x0000);
+ add_cartridge_slot<1>(config, MSX_SLOT_CARTRIDGE, "cartslot1", 1, 0, msx_cart, nullptr);
+ add_cartridge_slot<2>(config, MSX_SLOT_CARTRIDGE, "cartslot2", 2, 0, msx_cart, nullptr);
+ add_internal_slot(config, MSX_SLOT_ROM, "ext", 3, 0, 0, 1, "maincpu", 0x8000);
+ add_internal_slot(config, MSX_SLOT_RAM_MM, "ram_mm", 3, 2, 0, 4).set_total_size(0x20000); // 64KB or 128KB Mapper RAM ?
+ add_internal_slot(config, MSX_SLOT_ROM, "paint", 3, 3, 0, 2, "maincpu", 0xc000);
MSX_S1985(config, "s1985", 0);
msx2_cartlist(config);
-MACHINE_CONFIG_END
+}
/* MSX2 - Mitsubishi ML-G3 */
@@ -5111,20 +5259,21 @@ ROM_START (mlg3)
ROM_LOAD ("mlg3rs232c.rom", 0x10000, 0x4000, CRC(90b8a114) SHA1(dc50f2c9db233e505b0981c244ff3de553ac9d68))
ROM_END
-MACHINE_CONFIG_START(msx2_state::mlg3)
+void msx2_state::mlg3(machine_config &config)
+{
msx2_pal(config);
// YM2149 (in S-1985)
// FDC: wd2793?, 1 3.5" DSDD drive
// S-1985 MSX Engine
// 2 Cartridge slots
- MCFG_MSX_LAYOUT_ROM("bios", 0, 0, 0, 2, "maincpu", 0x0000)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot1", 1, 0)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot2", 2, 0)
- MCFG_MSX_LAYOUT_ROM("ext", 3, 0, 0, 1, "maincpu", 0x8000)
- MCFG_MSX_LAYOUT_DISK1("disk", 3, 0, 1, 1, "maincpu", 0xc000)
- MCFG_MSX_LAYOUT_RAM_MM("ram_mm", 3, 2, 0x20000) // 64KB or 128KB Mapper RAM?
- //MCFG_MSX_LAYOUT_ROM("rs232c", 3, 3, 1, 1, "maincpu", 0x10000)
+ add_internal_slot(config, MSX_SLOT_ROM, "bios", 0, 0, 0, 2, "maincpu", 0x0000);
+ add_cartridge_slot<1>(config, MSX_SLOT_CARTRIDGE, "cartslot1", 1, 0, msx_cart, nullptr);
+ add_cartridge_slot<2>(config, MSX_SLOT_CARTRIDGE, "cartslot2", 2, 0, msx_cart, nullptr);
+ add_internal_slot(config, MSX_SLOT_ROM, "ext", 3, 0, 0, 1, "maincpu", 0x8000);
+ add_internal_slot_mirrored(config, MSX_SLOT_DISK1, "disk", 3, 0, 1, 2, "maincpu", 0xc000).set_tags("fdc", "fdc:0", "fdc:1");
+ add_internal_slot(config, MSX_SLOT_RAM_MM, "ram_mm", 3, 2, 0, 4).set_total_size(0x20000); // 64KB or 128KB Mapper RAM?
+ //add_internal_slot(config, MSX_SLOT_ROM, "rs232c", 3, 3, 1, 1, "maincpu", 0x10000);
MSX_S1985(config, "s1985", 0);
@@ -5133,7 +5282,7 @@ MACHINE_CONFIG_START(msx2_state::mlg3)
msx2_floplist(config);
msx2_cartlist(config);
-MACHINE_CONFIG_END
+}
/* MSX2 - Mitsubishi ML-G10 */
@@ -5146,23 +5295,24 @@ ROM_START (mlg10)
ROM_LOAD ("mlg10kfn.rom", 0, 0x20000, CRC(d23d4d2d) SHA1(db03211b7db46899df41db2b1dfbec972109a967))
ROM_END
-MACHINE_CONFIG_START(msx2_state::mlg10)
+void msx2_state::mlg10(machine_config &config)
+{
msx2(config);
// YM2149 (in S-1985)
// FDC: None, 0 drives
// S-1985 MSX Engine
// 2 Cartridge slots
- MCFG_MSX_LAYOUT_ROM("bios", 0, 0, 0, 2, "maincpu", 0x0000)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot1", 1, 0)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot2", 2, 0)
- MCFG_MSX_LAYOUT_ROM("ext", 3, 0, 0, 1, "maincpu", 0x8000)
- MCFG_MSX_LAYOUT_RAM_MM("ram_mm", 3, 2, 0x20000) // 64KB or 128KB Mapper RAM?
+ add_internal_slot(config, MSX_SLOT_ROM, "bios", 0, 0, 0, 2, "maincpu", 0x0000);
+ add_cartridge_slot<1>(config, MSX_SLOT_CARTRIDGE, "cartslot1", 1, 0, msx_cart, nullptr);
+ add_cartridge_slot<2>(config, MSX_SLOT_CARTRIDGE, "cartslot2", 2, 0, msx_cart, nullptr);
+ add_internal_slot(config, MSX_SLOT_ROM, "ext", 3, 0, 0, 1, "maincpu", 0x8000);
+ add_internal_slot(config, MSX_SLOT_RAM_MM, "ram_mm", 3, 2, 0, 4).set_total_size(0x20000); // 64KB or 128KB Mapper RAM?
MSX_S1985(config, "s1985", 0);
msx2_cartlist(config);
-MACHINE_CONFIG_END
+}
/* MSX2 - Mitsubishi ML-G30 Model 1/Model 2 */
@@ -5176,25 +5326,26 @@ ROM_START (mlg30)
ROM_LOAD ("g30kfn.rom", 0x0000, 0x20000, CRC(d23d4d2d) SHA1(db03211b7db46899df41db2b1dfbec972109a967))
ROM_END
-MACHINE_CONFIG_START(msx2_state::mlg30)
+void msx2_state::mlg30(machine_config &config)
+{
msx2(config);
// AY8910/YM2149?
// FDC: wd2793/tc8566af?, 1 or 2? 3.5" DSDD drives
// 2 Cartridge slots?
- MCFG_MSX_LAYOUT_ROM("bios", 0, 0, 0, 2, "maincpu", 0x0000)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot1", 1, 0)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot2", 2, 0) /* Slot 2 subslot 0 */
- MCFG_MSX_LAYOUT_ROM("ext", 3, 0, 0, 1, "maincpu", 0x8000)
- MCFG_MSX_LAYOUT_DISK1("disk", 3, 0, 1, 1, "maincpu", 0xc000)
- MCFG_MSX_LAYOUT_RAM_MM("ram_mm", 3, 2, 0x10000) /* 64KB Mapper RAM */
+ add_internal_slot(config, MSX_SLOT_ROM, "bios", 0, 0, 0, 2, "maincpu", 0x0000);
+ add_cartridge_slot<1>(config, MSX_SLOT_CARTRIDGE, "cartslot1", 1, 0, msx_cart, nullptr);
+ add_cartridge_slot<2>(config, MSX_SLOT_CARTRIDGE, "cartslot2", 2, 0, msx_cart, nullptr); /* Slot 2 subslot 0 */
+ add_internal_slot(config, MSX_SLOT_ROM, "ext", 3, 0, 0, 1, "maincpu", 0x8000);
+ add_internal_slot_mirrored(config, MSX_SLOT_DISK1, "disk", 3, 0, 1, 2, "maincpu", 0xc000).set_tags("fdc", "fdc:0", "fdc:1");
+ add_internal_slot(config, MSX_SLOT_RAM_MM, "ram_mm", 3, 2, 0, 4).set_total_size(0x10000); /* 64KB Mapper RAM */
msx_wd2793_force_ready(config);
msx_1_35_dd_drive(config);
msx2_floplist(config);
msx2_cartlist(config);
-MACHINE_CONFIG_END
+}
/* MSX2 - National FS-4500 */
@@ -5218,7 +5369,8 @@ ROM_START (fs4500)
ROM_LOAD ("4500budi.rom", 0, 0x20000, CRC(f94590f8) SHA1(1ebb06062428fcdc66808a03761818db2bba3c73))
ROM_END
-MACHINE_CONFIG_START(msx2_state::fs4500)
+void msx2_state::fs4500(machine_config &config)
+{
msx2(config);
// YM2149 (in S-1985 MSX Engine)
// FDC: None, 0 drives
@@ -5226,25 +5378,25 @@ MACHINE_CONFIG_START(msx2_state::fs4500)
// S-1985 MSX Engine
// Matsushita switched device
- MCFG_MSX_LAYOUT_ROM("bios", 0, 0, 0, 2, "maincpu", 0x0000)
- MCFG_MSX_LAYOUT_ROM("ext", 0, 1, 0, 1, "maincpu", 0x8000)
- MCFG_MSX_LAYOUT_ROM("font", 0, 2, 0, 1, "maincpu", 0xc000)
- MCFG_MSX_LAYOUT_BUNSETSU("buns", 0, 2, 1, 2, "maincpu", 0x10000, "bunsetsu")
- MCFG_MSX_LAYOUT_ROM("jush", 0, 3, 1, 2, "maincpu", 0x18000)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot1", 1, 0)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot2", 2, 0)
- MCFG_MSX_LAYOUT_ROM("wor1", 3, 0, 0, 3, "maincpu", 0x20000)
- MCFG_MSX_LAYOUT_ROM("kdr1", 3, 0, 3, 1, "maincpu", 0x38000)
- MCFG_MSX_LAYOUT_ROM("wor2", 3, 1, 0, 3, "maincpu", 0x2c000)
- MCFG_MSX_LAYOUT_ROM("kdr2", 3, 1, 3, 1, "maincpu", 0x3c000)
- MCFG_MSX_LAYOUT_RAM("ram", 3, 2, 0, 4) /* 64KB RAM */
+ add_internal_slot(config, MSX_SLOT_ROM, "bios", 0, 0, 0, 2, "maincpu", 0x0000);
+ add_internal_slot(config, MSX_SLOT_ROM, "ext", 0, 1, 0, 1, "maincpu", 0x8000);
+ add_internal_slot(config, MSX_SLOT_ROM, "font", 0, 2, 0, 1, "maincpu", 0xc000);
+ add_internal_slot(config, MSX_SLOT_BUNSETSU, "buns", 0, 2, 1, 2, "maincpu", 0x10000).set_bunsetsu_region_tag("bunsetsu");
+ add_internal_slot(config, MSX_SLOT_ROM, "jush", 0, 3, 1, 2, "maincpu", 0x18000);
+ add_cartridge_slot<1>(config, MSX_SLOT_CARTRIDGE, "cartslot1", 1, 0, msx_cart, nullptr);
+ add_cartridge_slot<2>(config, MSX_SLOT_CARTRIDGE, "cartslot2", 2, 0, msx_cart, nullptr);
+ add_internal_slot(config, MSX_SLOT_ROM, "wor1", 3, 0, 0, 3, "maincpu", 0x20000);
+ add_internal_slot(config, MSX_SLOT_ROM, "kdr1", 3, 0, 3, 1, "maincpu", 0x38000);
+ add_internal_slot(config, MSX_SLOT_ROM, "wor2", 3, 1, 0, 3, "maincpu", 0x2c000);
+ add_internal_slot(config, MSX_SLOT_ROM, "kdr2", 3, 1, 3, 1, "maincpu", 0x3c000);
+ add_internal_slot(config, MSX_SLOT_RAM, "ram", 3, 2, 0, 4); /* 64KB RAM */
MSX_S1985(config, "s1985", 0);
MSX_MATSUSHITA(config, "matsushita", 0);
msx2_cartlist(config);
-MACHINE_CONFIG_END
+}
/* MSX2 - National FS-4600 */
@@ -5266,24 +5418,24 @@ ROM_START (fs4600)
ROM_LOAD ("4600kf12.rom", 0, 0x20000, CRC(340d1ef7) SHA1(a7a23dc01314e88381eee88b4878b39931ab4818))
ROM_END
-MACHINE_CONFIG_START(msx2_state::fs4600)
+void msx2_state::fs4600(machine_config &config)
+{
msx2(config);
// YM2149 (in S-1985 MSX Engine)
// FDC: mb8877a, 1 3.5" DSDD drive
// 2 Cartridge slots
// S-1985 MSX Engine
- MCFG_MSX_LAYOUT_ROM("bios", 0, 0, 0, 2, "maincpu", 0x0000)
- MCFG_MSX_LAYOUT_ROM("ext", 0, 1, 0, 1, "maincpu", 0x8000)
- MCFG_MSX_LAYOUT_ROM("fon1", 0, 2, 0, 1, "maincpu", 0x10000)
- MCFG_MSX_LAYOUT_ROM("kdr", 0, 2, 1, 2, "maincpu", 0x18000)
- MCFG_MSX_LAYOUT_ROM("fon2", 0, 3, 0, 1, "maincpu", 0x14000)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot1", 1, 0)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot2", 2, 0)
- MCFG_MSX_LAYOUT_FS4600("firm", 3, 1, 0, 4, "maincpu", 0x20000)
- MCFG_MSX_LAYOUT_RAM_MM("ram_mm", 3, 2, 0x20000) /* 128KB Mapper RAM */
- MCFG_MSX_RAMIO_SET_BITS(0x80)
- MCFG_MSX_LAYOUT_DISK2("disk", 3, 3, 1, 1, "maincpu", 0xc000)
+ add_internal_slot(config, MSX_SLOT_ROM, "bios", 0, 0, 0, 2, "maincpu", 0x0000);
+ add_internal_slot(config, MSX_SLOT_ROM, "ext", 0, 1, 0, 1, "maincpu", 0x8000);
+ add_internal_slot(config, MSX_SLOT_ROM, "fon1", 0, 2, 0, 1, "maincpu", 0x10000);
+ add_internal_slot(config, MSX_SLOT_ROM, "kdr", 0, 2, 1, 2, "maincpu", 0x18000);
+ add_internal_slot(config, MSX_SLOT_ROM, "fon2", 0, 3, 0, 1, "maincpu", 0x14000);
+ add_cartridge_slot<1>(config, MSX_SLOT_CARTRIDGE, "cartslot1", 1, 0, msx_cart, nullptr);
+ add_cartridge_slot<2>(config, MSX_SLOT_CARTRIDGE, "cartslot2", 2, 0, msx_cart, nullptr);
+ add_internal_slot(config, MSX_SLOT_FS4600, "firm", 3, 1, 0, 4, "maincpu", 0x20000);
+ add_internal_slot(config, MSX_SLOT_RAM_MM, "ram_mm", 3, 2, 0, 4).set_total_size(0x20000).set_ramio_bits(0x80); /* 128KB Mapper RAM */
+ add_internal_slot_mirrored(config, MSX_SLOT_DISK2, "disk", 3, 3, 1, 2, "maincpu", 0xc000).set_tags("fdc", "fdc:0", "fdc:1");
MSX_S1985(config, "s1985", 0);
@@ -5292,7 +5444,7 @@ MACHINE_CONFIG_START(msx2_state::fs4600)
msx2_floplist(config);
msx2_cartlist(config);
-MACHINE_CONFIG_END
+}
/* MSX2 - National FS-4700 */
@@ -5317,7 +5469,8 @@ ROM_START (fs4700)
ROM_LOAD ("4700budi.rom", 0, 0x20000, CRC(f94590f8) SHA1(1ebb06062428fcdc66808a03761818db2bba3c73))
ROM_END
-MACHINE_CONFIG_START(msx2_state::fs4700)
+void msx2_state::fs4700(machine_config &config)
+{
msx2(config);
// YM2149 (in S-1985 MSX Engine)
// FDC: mb8877a, 1 3.5" DSDD drive
@@ -5325,19 +5478,19 @@ MACHINE_CONFIG_START(msx2_state::fs4700)
// S-1985 MSX Engine
// Matsushita switched device
- MCFG_MSX_LAYOUT_ROM("bios", 0, 0, 0, 2, "maincpu", 0x0000)
- MCFG_MSX_LAYOUT_ROM("ext", 0, 1, 0, 1, "maincpu", 0x8000)
- MCFG_MSX_LAYOUT_ROM("font", 0, 2, 0, 1, "maincpu", 0x10000)
- MCFG_MSX_LAYOUT_BUNSETSU("buns", 0, 2, 1, 2, "maincpu", 0x14000, "bunsetsu")
- MCFG_MSX_LAYOUT_ROM("jush", 0, 3, 1, 2, "maincpu", 0x1c000)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot1", 1, 0)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot2", 2, 0)
- MCFG_MSX_LAYOUT_ROM("wor1", 3, 0, 0, 3, "maincpu", 0x24000)
- MCFG_MSX_LAYOUT_ROM("kdr1", 3, 0, 3, 1, "maincpu", 0x3c000)
- MCFG_MSX_LAYOUT_ROM("wor2", 3, 1, 0, 3, "maincpu", 0x30000)
- MCFG_MSX_LAYOUT_ROM("kdr2", 3, 1, 3, 1, "maincpu", 0x40000)
- MCFG_MSX_LAYOUT_RAM("ram", 3, 2, 0, 4) /* 64KB RAM */
- MCFG_MSX_LAYOUT_DISK2("disk", 3, 3, 1, 1, "maincpu", 0xc000)
+ add_internal_slot(config, MSX_SLOT_ROM, "bios", 0, 0, 0, 2, "maincpu", 0x0000);
+ add_internal_slot(config, MSX_SLOT_ROM, "ext", 0, 1, 0, 1, "maincpu", 0x8000);
+ add_internal_slot(config, MSX_SLOT_ROM, "font", 0, 2, 0, 1, "maincpu", 0x10000);
+ add_internal_slot(config, MSX_SLOT_BUNSETSU, "buns", 0, 2, 1, 2, "maincpu", 0x14000).set_bunsetsu_region_tag("bunsetsu");
+ add_internal_slot(config, MSX_SLOT_ROM, "jush", 0, 3, 1, 2, "maincpu", 0x1c000);
+ add_cartridge_slot<1>(config, MSX_SLOT_CARTRIDGE, "cartslot1", 1, 0, msx_cart, nullptr);
+ add_cartridge_slot<2>(config, MSX_SLOT_CARTRIDGE, "cartslot2", 2, 0, msx_cart, nullptr);
+ add_internal_slot(config, MSX_SLOT_ROM, "wor1", 3, 0, 0, 3, "maincpu", 0x24000);
+ add_internal_slot(config, MSX_SLOT_ROM, "kdr1", 3, 0, 3, 1, "maincpu", 0x3c000);
+ add_internal_slot(config, MSX_SLOT_ROM, "wor2", 3, 1, 0, 3, "maincpu", 0x30000);
+ add_internal_slot(config, MSX_SLOT_ROM, "kdr2", 3, 1, 3, 1, "maincpu", 0x40000);
+ add_internal_slot(config, MSX_SLOT_RAM, "ram", 3, 2, 0, 4); /* 64KB RAM */
+ add_internal_slot_mirrored(config, MSX_SLOT_DISK2, "disk", 3, 3, 1, 2, "maincpu", 0xc000).set_tags("fdc", "fdc:0", "fdc:1");
MSX_S1985(config, "s1985", 0);
@@ -5348,7 +5501,7 @@ MACHINE_CONFIG_START(msx2_state::fs4700)
msx2_floplist(config);
msx2_cartlist(config);
-MACHINE_CONFIG_END
+}
/* MSX2 - National FS-5000 */
@@ -5365,25 +5518,25 @@ ROM_START (fs5000)
ROM_LOAD ("5000kfn.rom", 0, 0x20000, CRC(c61ddc5d) SHA1(5e872d5853698731a0ed22fb72dbcdfd59cd19c3))
ROM_END
-MACHINE_CONFIG_START(msx2_state::fs5000)
+void msx2_state::fs5000(machine_config &config)
+{
msx2(config);
// YM2149 (in S-1985 MSX Engine)
// FDC: wd2793, 2 3.5" DSDD drives
// 2 Cartridge slots
// S-1985 MSX Engine
- MCFG_MSX_LAYOUT_ROM("bios", 0, 0, 0, 2, "maincpu", 0x0000)
- MCFG_MSX_LAYOUT_ROM("empty1", 0, 1, 0, 4, "maincpu", 0x20000)
- MCFG_MSX_LAYOUT_ROM("empty2", 0, 2, 0, 4, "maincpu", 0x20000)
- MCFG_MSX_LAYOUT_ROM("empty3", 0, 3, 0, 4, "maincpu", 0x20000)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot1", 1, 0)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot2", 2, 0)
- MCFG_MSX_LAYOUT_ROM("ext", 3, 0, 0, 1, "maincpu", 0x8000)
- MCFG_MSX_LAYOUT_ROM("kdr", 3, 0, 1, 2, "maincpu", 0x18000)
- MCFG_MSX_LAYOUT_ROM("rtcrom", 3, 1, 1, 2, "maincpu", 0x10000)
- MCFG_MSX_LAYOUT_RAM_MM("ram_mm", 3, 2, 0x20000) /* 128KB Mapper RAM */
- MCFG_MSX_RAMIO_SET_BITS(0x80)
- MCFG_MSX_LAYOUT_DISK2("disk", 3, 3, 1, 1, "maincpu", 0xc000)
+ add_internal_slot(config, MSX_SLOT_ROM, "bios", 0, 0, 0, 2, "maincpu", 0x0000);
+ add_internal_slot(config, MSX_SLOT_ROM, "empty1", 0, 1, 0, 4, "maincpu", 0x20000);
+ add_internal_slot(config, MSX_SLOT_ROM, "empty2", 0, 2, 0, 4, "maincpu", 0x20000);
+ add_internal_slot(config, MSX_SLOT_ROM, "empty3", 0, 3, 0, 4, "maincpu", 0x20000);
+ add_cartridge_slot<1>(config, MSX_SLOT_CARTRIDGE, "cartslot1", 1, 0, msx_cart, nullptr);
+ add_cartridge_slot<2>(config, MSX_SLOT_CARTRIDGE, "cartslot2", 2, 0, msx_cart, nullptr);
+ add_internal_slot(config, MSX_SLOT_ROM, "ext", 3, 0, 0, 1, "maincpu", 0x8000);
+ add_internal_slot(config, MSX_SLOT_ROM, "kdr", 3, 0, 1, 2, "maincpu", 0x18000);
+ add_internal_slot(config, MSX_SLOT_ROM, "rtcrom", 3, 1, 1, 2, "maincpu", 0x10000);
+ add_internal_slot(config, MSX_SLOT_RAM_MM, "ram_mm", 3, 2, 0, 4).set_total_size(0x20000).set_ramio_bits(0x80); /* 128KB Mapper RAM */
+ add_internal_slot_mirrored(config, MSX_SLOT_DISK2, "disk", 3, 3, 1, 2, "maincpu", 0xc000).set_tags("fdc", "fdc:0", "fdc:1");
MSX_S1985(config, "s1985", 0);
@@ -5392,7 +5545,7 @@ MACHINE_CONFIG_START(msx2_state::fs5000)
msx2_floplist(config);
msx2_cartlist(config);
-MACHINE_CONFIG_END
+}
/* MSX2 - National FS-5500F2*/
/* The National FS-5500 had two versions: */
@@ -5412,7 +5565,8 @@ ROM_START (fs5500f1)
ROM_LOAD ("5500kfn.rom", 0, 0x20000, CRC(956dc96d) SHA1(9ed3ab6d893632b9246e91b412cd5db519e7586b))
ROM_END
-MACHINE_CONFIG_START(msx2_state::fs5500f1)
+void msx2_state::fs5500f1(machine_config &config)
+{
msx2(config);
// YM2149 in (S-1985 MSX Engine)
// FDC: mb8877a, 1 3.5" DSDD drive
@@ -5420,17 +5574,17 @@ MACHINE_CONFIG_START(msx2_state::fs5500f1)
// S-1985 MSX Engine
// Matsushita switched device
- MCFG_MSX_LAYOUT_ROM("bios", 0, 0, 0, 2, "maincpu", 0x0000)
- MCFG_MSX_LAYOUT_ROM("empty1", 0, 1, 0, 4, "maincpu", 0x20000)
- MCFG_MSX_LAYOUT_ROM("empty2", 0, 2, 0, 4, "maincpu", 0x20000)
- MCFG_MSX_LAYOUT_ROM("empty3", 0, 3, 0, 4, "maincpu", 0x20000)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot1", 1, 0)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot2", 2, 0)
- MCFG_MSX_LAYOUT_ROM("ext", 3, 0, 0, 1, "maincpu", 0x8000)
- MCFG_MSX_LAYOUT_ROM("kdr", 3, 0, 1, 2, "maincpu", 0x18000)
- MCFG_MSX_LAYOUT_ROM("imp", 3, 1, 1, 2, "maincpu", 0x10000)
- MCFG_MSX_LAYOUT_RAM("ram", 3, 2, 0, 4) /* 64KB RAM */
- MCFG_MSX_LAYOUT_DISK2("disk", 3, 3, 1, 1, "maincpu", 0xc000)
+ add_internal_slot(config, MSX_SLOT_ROM, "bios", 0, 0, 0, 2, "maincpu", 0x0000);
+ add_internal_slot(config, MSX_SLOT_ROM, "empty1", 0, 1, 0, 4, "maincpu", 0x20000);
+ add_internal_slot(config, MSX_SLOT_ROM, "empty2", 0, 2, 0, 4, "maincpu", 0x20000);
+ add_internal_slot(config, MSX_SLOT_ROM, "empty3", 0, 3, 0, 4, "maincpu", 0x20000);
+ add_cartridge_slot<1>(config, MSX_SLOT_CARTRIDGE, "cartslot1", 1, 0, msx_cart, nullptr);
+ add_cartridge_slot<2>(config, MSX_SLOT_CARTRIDGE, "cartslot2", 2, 0, msx_cart, nullptr);
+ add_internal_slot(config, MSX_SLOT_ROM, "ext", 3, 0, 0, 1, "maincpu", 0x8000);
+ add_internal_slot(config, MSX_SLOT_ROM, "kdr", 3, 0, 1, 2, "maincpu", 0x18000);
+ add_internal_slot(config, MSX_SLOT_ROM, "imp", 3, 1, 1, 2, "maincpu", 0x10000);
+ add_internal_slot(config, MSX_SLOT_RAM, "ram", 3, 2, 0, 4); /* 64KB RAM */
+ add_internal_slot_mirrored(config, MSX_SLOT_DISK2, "disk", 3, 3, 1, 2, "maincpu", 0xc000).set_tags("fdc", "fdc:0", "fdc:1");
MSX_S1985(config, "s1985", 0);
@@ -5441,7 +5595,7 @@ MACHINE_CONFIG_START(msx2_state::fs5500f1)
msx2_floplist(config);
msx2_cartlist(config);
-MACHINE_CONFIG_END
+}
/* MSX2 - National FS-5500F2*/
/* The National FS-5500 had two versions: */
@@ -5461,7 +5615,8 @@ ROM_START (fs5500f2)
ROM_LOAD ("5500kfn.rom", 0, 0x20000, CRC(956dc96d) SHA1(9ed3ab6d893632b9246e91b412cd5db519e7586b))
ROM_END
-MACHINE_CONFIG_START(msx2_state::fs5500f2)
+void msx2_state::fs5500f2(machine_config &config)
+{
msx2(config);
// YM2149 in (S-1985 MSX Engine)
// FDC: mb8877a, 2 3.5" DSDD drive
@@ -5469,17 +5624,17 @@ MACHINE_CONFIG_START(msx2_state::fs5500f2)
// S-1985 MSX Engine
// Matsushita switched device
- MCFG_MSX_LAYOUT_ROM("bios", 0, 0, 0, 2, "maincpu", 0x0000)
- MCFG_MSX_LAYOUT_ROM("empty1", 0, 1, 0, 4, "maincpu", 0x20000)
- MCFG_MSX_LAYOUT_ROM("empty2", 0, 2, 0, 4, "maincpu", 0x20000)
- MCFG_MSX_LAYOUT_ROM("empty3", 0, 3, 0, 4, "maincpu", 0x20000)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot1", 1, 0)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot2", 2, 0)
- MCFG_MSX_LAYOUT_ROM("ext", 3, 0, 0, 1, "maincpu", 0x8000)
- MCFG_MSX_LAYOUT_ROM("kdr", 3, 0, 1, 2, "maincpu", 0x18000)
- MCFG_MSX_LAYOUT_ROM("imp", 3, 1, 1, 2, "maincpu", 0x10000)
- MCFG_MSX_LAYOUT_RAM("ram", 3, 2, 0, 4) /* 64KB RAM */
- MCFG_MSX_LAYOUT_DISK2("disk", 3, 3, 1, 1, "maincpu", 0xc000)
+ add_internal_slot(config, MSX_SLOT_ROM, "bios", 0, 0, 0, 2, "maincpu", 0x0000);
+ add_internal_slot(config, MSX_SLOT_ROM, "empty1", 0, 1, 0, 4, "maincpu", 0x20000);
+ add_internal_slot(config, MSX_SLOT_ROM, "empty2", 0, 2, 0, 4, "maincpu", 0x20000);
+ add_internal_slot(config, MSX_SLOT_ROM, "empty3", 0, 3, 0, 4, "maincpu", 0x20000);
+ add_cartridge_slot<1>(config, MSX_SLOT_CARTRIDGE, "cartslot1", 1, 0, msx_cart, nullptr);
+ add_cartridge_slot<2>(config, MSX_SLOT_CARTRIDGE, "cartslot2", 2, 0, msx_cart, nullptr);
+ add_internal_slot(config, MSX_SLOT_ROM, "ext", 3, 0, 0, 1, "maincpu", 0x8000);
+ add_internal_slot(config, MSX_SLOT_ROM, "kdr", 3, 0, 1, 2, "maincpu", 0x18000);
+ add_internal_slot(config, MSX_SLOT_ROM, "imp", 3, 1, 1, 2, "maincpu", 0x10000);
+ add_internal_slot(config, MSX_SLOT_RAM, "ram", 3, 2, 0, 4); /* 64KB RAM */
+ add_internal_slot_mirrored(config, MSX_SLOT_DISK2, "disk", 3, 3, 1, 2, "maincpu", 0xc000).set_tags("fdc", "fdc:0", "fdc:1");
MSX_S1985(config, "s1985", 0);
@@ -5490,7 +5645,7 @@ MACHINE_CONFIG_START(msx2_state::fs5500f2)
msx2_floplist(config);
msx2_cartlist(config);
-MACHINE_CONFIG_END
+}
/* MSX2 - Panasonic FS-A1 */
@@ -5502,22 +5657,23 @@ ROM_START (fsa1)
ROM_LOAD ("a1desk2.rom", 0x18000, 0x8000, CRC(7f6f4aa1) SHA1(7f5b76605e3d898cc4b5aacf1d7682b82fe84353))
ROM_END
-MACHINE_CONFIG_START(msx2_state::fsa1)
+void msx2_state::fsa1(machine_config &config)
+{
msx2(config);
// AY8910/YM2149?
// FDC: None, 0 drives
// 2 Cartridge slots
- MCFG_MSX_LAYOUT_ROM("bios", 0, 0, 0, 2, "maincpu", 0x0000)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot1", 1, 0)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot2", 2, 0)
- MCFG_MSX_LAYOUT_RAM("ram", 3, 0, 0, 4) /* 64 KB RAM */
- MCFG_MSX_LAYOUT_ROM("ext", 3, 1, 0, 1, "maincpu", 0x8000)
- MCFG_MSX_LAYOUT_ROM("desk1", 3, 2, 1, 2, "maincpu", 0x10000)
- MCFG_MSX_LAYOUT_ROM("desk2", 3, 3, 1, 2, "maincpu", 0x18000)
+ add_internal_slot(config, MSX_SLOT_ROM, "bios", 0, 0, 0, 2, "maincpu", 0x0000);
+ add_cartridge_slot<1>(config, MSX_SLOT_CARTRIDGE, "cartslot1", 1, 0, msx_cart, nullptr);
+ add_cartridge_slot<2>(config, MSX_SLOT_CARTRIDGE, "cartslot2", 2, 0, msx_cart, nullptr);
+ add_internal_slot(config, MSX_SLOT_RAM, "ram", 3, 0, 0, 4); /* 64 KB RAM */
+ add_internal_slot(config, MSX_SLOT_ROM, "ext", 3, 1, 0, 1, "maincpu", 0x8000);
+ add_internal_slot(config, MSX_SLOT_ROM, "desk1", 3, 2, 1, 2, "maincpu", 0x10000);
+ add_internal_slot(config, MSX_SLOT_ROM, "desk2", 3, 3, 1, 2, "maincpu", 0x18000);
msx2_cartlist(config);
-MACHINE_CONFIG_END
+}
/* MSX2 - Panasonic FS-A1 (a) */
@@ -5529,22 +5685,23 @@ ROM_START (fsa1a)
ROM_LOAD ("a1desk2.rom", 0x14000, 0x8000, CRC(7f6f4aa1) SHA1(7f5b76605e3d898cc4b5aacf1d7682b82fe84353))
ROM_END
-MACHINE_CONFIG_START(msx2_state::fsa1a)
+void msx2_state::fsa1a(machine_config &config)
+{
msx2(config);
// AY8910/YM2149?
// FDC: None, 0 drives
// 2 Cartridge slots
- MCFG_MSX_LAYOUT_ROM("bios", 0, 0, 0, 2, "maincpu", 0x0000)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot1", 1, 0)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot2", 2, 0)
- MCFG_MSX_LAYOUT_RAM("ram", 3, 0, 0, 4) /* 64KB RAM */
- MCFG_MSX_LAYOUT_ROM("ext", 3, 1, 0, 1, "maincpu", 0x8000)
- MCFG_MSX_LAYOUT_ROM("desk1", 3, 2, 1, 2, "maincpu", 0xc000)
- MCFG_MSX_LAYOUT_ROM("desk2", 3, 3, 1, 2, "maincpu", 0x14000)
+ add_internal_slot(config, MSX_SLOT_ROM, "bios", 0, 0, 0, 2, "maincpu", 0x0000);
+ add_cartridge_slot<1>(config, MSX_SLOT_CARTRIDGE, "cartslot1", 1, 0, msx_cart, nullptr);
+ add_cartridge_slot<2>(config, MSX_SLOT_CARTRIDGE, "cartslot2", 2, 0, msx_cart, nullptr);
+ add_internal_slot(config, MSX_SLOT_RAM, "ram", 3, 0, 0, 4); /* 64KB RAM */
+ add_internal_slot(config, MSX_SLOT_ROM, "ext", 3, 1, 0, 1, "maincpu", 0x8000);
+ add_internal_slot(config, MSX_SLOT_ROM, "desk1", 3, 2, 1, 2, "maincpu", 0xc000);
+ add_internal_slot(config, MSX_SLOT_ROM, "desk2", 3, 3, 1, 2, "maincpu", 0x14000);
msx2_cartlist(config);
-MACHINE_CONFIG_END
+}
/* MSX2 - Panasonic FS-A1F */
@@ -5560,28 +5717,28 @@ ROM_START (fsa1f)
ROM_LOAD ("a1fkfn.rom", 0, 0x20000, CRC(c61ddc5d) SHA1(5e872d5853698731a0ed22fb72dbcdfd59cd19c3))
ROM_END
-MACHINE_CONFIG_START(msx2_state::fsa1f)
+void msx2_state::fsa1f(machine_config &config)
+{
msx2(config);
// AY8910/YM2149?
// FDC: tc8566af, 1 3.5" DSDD drive
// 2 Cartridge slots
- MCFG_MSX_LAYOUT_ROM("bios", 0, 0, 0, 2, "maincpu", 0x0000)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot1", 1, 0)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot2", 2, 0)
- MCFG_MSX_LAYOUT_RAM_MM("ram_mm", 3, 0, 0x10000) /* 64KB Mapper RAM */
- MCFG_MSX_RAMIO_SET_BITS(0x80)
- MCFG_MSX_LAYOUT_ROM("ext", 3, 1, 0, 1, "maincpu", 0x8000)
- MCFG_MSX_LAYOUT_ROM("fkdr", 3, 1, 1, 2, "maincpu", 0x10000)
- MCFG_MSX_LAYOUT_DISK3("disk", 3, 2, 1, 1, "maincpu", 0xc000)
- MCFG_MSX_LAYOUT_ROM("fcock", 3, 3, 1, 2, "maincpu", 0x18000)
+ add_internal_slot(config, MSX_SLOT_ROM, "bios", 0, 0, 0, 2, "maincpu", 0x0000);
+ add_cartridge_slot<1>(config, MSX_SLOT_CARTRIDGE, "cartslot1", 1, 0, msx_cart, nullptr);
+ add_cartridge_slot<2>(config, MSX_SLOT_CARTRIDGE, "cartslot2", 2, 0, msx_cart, nullptr);
+ add_internal_slot(config, MSX_SLOT_RAM_MM, "ram_mm", 3, 0, 0, 4).set_total_size(0x10000).set_ramio_bits(0x80); /* 64KB Mapper RAM */
+ add_internal_slot(config, MSX_SLOT_ROM, "ext", 3, 1, 0, 1, "maincpu", 0x8000);
+ add_internal_slot(config, MSX_SLOT_ROM, "fkdr", 3, 1, 1, 2, "maincpu", 0x10000);
+ add_internal_slot(config, MSX_SLOT_DISK3, "disk", 3, 2, 1, 1, "maincpu", 0xc000).set_tags("fdc", "fdc:0", "fdc:1");
+ add_internal_slot(config, MSX_SLOT_ROM, "fcock", 3, 3, 1, 2, "maincpu", 0x18000);
msx_tc8566af(config);
msx_1_35_dd_drive(config);
msx2_floplist(config);
msx2_cartlist(config);
-MACHINE_CONFIG_END
+}
/* MSX2 - Panasonic FS-A1FM */
@@ -5600,21 +5757,21 @@ ROM_START (fsa1fm)
ROM_LOAD ("a1fmkf12.rom", 0, 0x20000, CRC(340d1ef7) SHA1(a7a23dc01314e88381eee88b4878b39931ab4818))
ROM_END
-MACHINE_CONFIG_START(msx2_state::fsa1fm)
+void msx2_state::fsa1fm(machine_config &config)
+{
msx2(config);
// AY8910/YM2149?
// FDC: tc8566af, 1 3.5" DSDD drive
// 2 Cartridge slots
// Integrated 1200baud modem
- MCFG_MSX_LAYOUT_ROM("bios", 0, 0, 0, 2, "maincpu", 0x0000)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot1", 1, 0)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot2", 2, 0)
- MCFG_MSX_LAYOUT_RAM_MM("ram_mm", 3, 0, 0x10000) /* 64KB Mapper RAM */
- MCFG_MSX_RAMIO_SET_BITS(0x80)
- MCFG_MSX_LAYOUT_ROM("ext", 3, 1, 0, 1, "maincpu", 0x8000)
+ add_internal_slot(config, MSX_SLOT_ROM, "bios", 0, 0, 0, 2, "maincpu", 0x0000);
+ add_cartridge_slot<1>(config, MSX_SLOT_CARTRIDGE, "cartslot1", 1, 0, msx_cart, nullptr);
+ add_cartridge_slot<2>(config, MSX_SLOT_CARTRIDGE, "cartslot2", 2, 0, msx_cart, nullptr);
+ add_internal_slot(config, MSX_SLOT_RAM_MM, "ram_mm", 3, 0, 0, 4).set_total_size(0x10000).set_ramio_bits(0x80); /* 64KB Mapper RAM */
+ add_internal_slot(config, MSX_SLOT_ROM, "ext", 3, 1, 0, 1, "maincpu", 0x8000);
/* MSX_LAYOUT_SLOT (3, 1, 1, 4, MODEM_ROM, 0x20000, 0x10000) */ /* Modem Mapper of FS-CM1/A1FM must be emulated */
- MCFG_MSX_LAYOUT_DISK3("disk", 3, 2, 1, 1, "maincpu", 0xc000)
+ add_internal_slot(config, MSX_SLOT_DISK3, "disk", 3, 2, 1, 1, "maincpu", 0xc000).set_tags("fdc", "fdc:0", "fdc:1");
/* MSX_LAYOUT_SLOT (3, 3, 0, 4, FSA1FM_ROM, 0x100000, 0x10000) */ /* Panasonic FS-A1FM Mapper must be emulated */
msx_tc8566af(config);
@@ -5622,7 +5779,7 @@ MACHINE_CONFIG_START(msx2_state::fsa1fm)
msx2_floplist(config);
msx2_cartlist(config);
-MACHINE_CONFIG_END
+}
/* MSX2 - Panasonic FS-A1MK2 */
@@ -5635,24 +5792,24 @@ ROM_START (fsa1mk2)
ROM_LOAD ("a1mkcoc3.rom", 0x18000, 0x8000, CRC(c1945676) SHA1(a3f4e2e4934074925d775afe30ac72f150ede543))
ROM_END
-MACHINE_CONFIG_START(msx2_state::fsa1mk2)
+void msx2_state::fsa1mk2(machine_config &config)
+{
msx2(config);
// AY8910/YM2149?
// FDC: None, 0 drives
// 2 Cartridge slots
- MCFG_MSX_LAYOUT_ROM("bios", 0, 0, 0, 2, "maincpu", 0x0000)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot1", 1, 0)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot2", 2, 0)
- MCFG_MSX_LAYOUT_RAM_MM("ram_mm", 3, 0, 0x10000) /* 64 KB Mapper RAM */
- MCFG_MSX_RAMIO_SET_BITS(0x80)
- MCFG_MSX_LAYOUT_ROM("ext", 3, 1, 0, 1, "maincpu", 0x8000)
- MCFG_MSX_LAYOUT_ROM("coc1", 3, 1, 1, 2, "maincpu", 0xc000)
- MCFG_MSX_LAYOUT_ROM("coc2", 3, 2, 1, 1, "maincpu", 0x14000)
- MCFG_MSX_LAYOUT_ROM("coc3", 3, 3, 1, 2, "maincpu", 0x18000)
+ add_internal_slot(config, MSX_SLOT_ROM, "bios", 0, 0, 0, 2, "maincpu", 0x0000);
+ add_cartridge_slot<1>(config, MSX_SLOT_CARTRIDGE, "cartslot1", 1, 0, msx_cart, nullptr);
+ add_cartridge_slot<2>(config, MSX_SLOT_CARTRIDGE, "cartslot2", 2, 0, msx_cart, nullptr);
+ add_internal_slot(config, MSX_SLOT_RAM_MM, "ram_mm", 3, 0, 0, 4).set_total_size(0x10000).set_ramio_bits(0x80); /* 64 KB Mapper RAM */
+ add_internal_slot(config, MSX_SLOT_ROM, "ext", 3, 1, 0, 1, "maincpu", 0x8000);
+ add_internal_slot(config, MSX_SLOT_ROM, "coc1", 3, 1, 1, 2, "maincpu", 0xc000);
+ add_internal_slot(config, MSX_SLOT_ROM, "coc2", 3, 2, 1, 1, "maincpu", 0x14000);
+ add_internal_slot(config, MSX_SLOT_ROM, "coc3", 3, 3, 1, 2, "maincpu", 0x18000);
msx2_cartlist(config);
-MACHINE_CONFIG_END
+}
/* MSX2 - Philips NMS-8220 - 2 possible sets (/00 /16) */
@@ -5663,23 +5820,23 @@ ROM_START (nms8220)
ROM_LOAD ("8220pen.rom.u13", 0xc000, 0x4000, CRC(3d38c53e) SHA1(cb754aed85b3e97a7d3c5894310df7ca18f89f41))
ROM_END
-MACHINE_CONFIG_START(msx2_state::nms8220)
+void msx2_state::nms8220(machine_config &config)
+{
msx2_pal(config);
// YM2149 (in S-3527 MSX Engine)
// FDC: None, 0 drives
// 2 Cartridge slots
// S-3527 MSX Engine
- MCFG_MSX_LAYOUT_ROM("bios", 0, 0, 0, 2, "maincpu", 0x0000)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot1", 1, 0)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot2", 2, 0)
- MCFG_MSX_LAYOUT_ROM("ext", 3, 0, 0, 1, "maincpu", 0x8000)
- MCFG_MSX_LAYOUT_RAM_MM("ram_mm", 3, 2, 0x10000) /* 64KB Mapper RAM */
- MCFG_MSX_RAMIO_SET_BITS(0xf8)
- MCFG_MSX_LAYOUT_ROM("pen", 3, 3, 1, 1, "maincpu", 0xc000)
+ add_internal_slot(config, MSX_SLOT_ROM, "bios", 0, 0, 0, 2, "maincpu", 0x0000);
+ add_cartridge_slot<1>(config, MSX_SLOT_CARTRIDGE, "cartslot1", 1, 0, msx_cart, nullptr);
+ add_cartridge_slot<2>(config, MSX_SLOT_CARTRIDGE, "cartslot2", 2, 0, msx_cart, nullptr);
+ add_internal_slot(config, MSX_SLOT_ROM, "ext", 3, 0, 0, 1, "maincpu", 0x8000);
+ add_internal_slot(config, MSX_SLOT_RAM_MM, "ram_mm", 3, 2, 0, 4).set_total_size(0x10000).set_ramio_bits(0xf8); /* 64KB Mapper RAM */
+ add_internal_slot(config, MSX_SLOT_ROM, "pen", 3, 3, 1, 1, "maincpu", 0xc000);
msx2_cartlist(config);
-MACHINE_CONFIG_END
+}
/* MSX2 - Philips NMS-8220 (a) */
@@ -5690,23 +5847,23 @@ ROM_START (nms8220a)
ROM_LOAD ("8220pena.rom.u13", 0xc000, 0x4000, CRC(17817b5a) SHA1(5df95d033ae70b107697b69470126ce1b7ae9eb5))
ROM_END
-MACHINE_CONFIG_START(msx2_state::nms8220a)
+void msx2_state::nms8220a(machine_config &config)
+{
msx2_pal(config);
// YM2149 (in S-3527 MSX Engine)
// FDC: None, 0 drives
// 2 Cartridge slots
// S-3527 MSX Engine
- MCFG_MSX_LAYOUT_ROM("bios", 0, 0, 0, 2, "maincpu", 0x0000)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot1", 1, 0)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot2", 2, 0)
- MCFG_MSX_LAYOUT_ROM("ext", 3, 0, 0, 1, "maincpu", 0x8000)
- MCFG_MSX_LAYOUT_RAM_MM("ram_mm", 3, 2, 0x10000) /* 64KB Mapper RAM */
- MCFG_MSX_RAMIO_SET_BITS(0xf8)
- MCFG_MSX_LAYOUT_ROM("pen", 3, 3, 1, 1, "maincpu", 0xc000)
+ add_internal_slot(config, MSX_SLOT_ROM, "bios", 0, 0, 0, 2, "maincpu", 0x0000);
+ add_cartridge_slot<1>(config, MSX_SLOT_CARTRIDGE, "cartslot1", 1, 0, msx_cart, nullptr);
+ add_cartridge_slot<2>(config, MSX_SLOT_CARTRIDGE, "cartslot2", 2, 0, msx_cart, nullptr);
+ add_internal_slot(config, MSX_SLOT_ROM, "ext", 3, 0, 0, 1, "maincpu", 0x8000);
+ add_internal_slot(config, MSX_SLOT_RAM_MM, "ram_mm", 3, 2, 0, 4).set_total_size(0x10000).set_ramio_bits(0xf8); /* 64KB Mapper RAM */
+ add_internal_slot(config, MSX_SLOT_ROM, "pen", 3, 3, 1, 1, "maincpu", 0xc000);
msx2_cartlist(config);
-MACHINE_CONFIG_END
+}
/* MSX2 - Philips NMS-8245 - 2 possible sets (/00 /16) */
/* /00 - A16 = 0 */
@@ -5718,27 +5875,27 @@ ROM_START (nms8245)
ROM_LOAD ("nms8245.u7", 0x0000, 0x20000, BAD_DUMP CRC(0c827d5f) SHA1(064e706cb1f12b99b329944ceeedc0efc3b2d9be))
ROM_END
-MACHINE_CONFIG_START(msx2_state::nms8245)
+void msx2_state::nms8245(machine_config &config)
+{
msx2_pal(config);
// YM2149 (in S-3527 MSX Engine)
// FDC: wd2793, 1 3.5" DSDD drive
// 2 Cartridge slots
// S-3527 MSX Engine
- MCFG_MSX_LAYOUT_ROM("bios", 0, 0, 0, 2, "maincpu", 0x0000)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot1", 1, 0)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot2", 2, 0)
- MCFG_MSX_LAYOUT_ROM("ext",3, 0, 0, 1, "maincpu", 0x8000)
- MCFG_MSX_LAYOUT_RAM_MM("ram_mm", 3, 2, 0x20000) /* 128KB Mapper RAM */
- MCFG_MSX_RAMIO_SET_BITS(0xf8)
- MCFG_MSX_LAYOUT_DISK1("disk", 3, 3, 1, 1, "maincpu", 0xc000)
+ add_internal_slot(config, MSX_SLOT_ROM, "bios", 0, 0, 0, 2, "maincpu", 0x0000);
+ add_cartridge_slot<1>(config, MSX_SLOT_CARTRIDGE, "cartslot1", 1, 0, msx_cart, nullptr);
+ add_cartridge_slot<2>(config, MSX_SLOT_CARTRIDGE, "cartslot2", 2, 0, msx_cart, nullptr);
+ add_internal_slot(config, MSX_SLOT_ROM, "ext", 3, 0, 0, 1, "maincpu", 0x8000);
+ add_internal_slot(config, MSX_SLOT_RAM_MM, "ram_mm", 3, 2, 0, 4).set_total_size(0x20000).set_ramio_bits(0xf8); /* 128KB Mapper RAM */
+ add_internal_slot_mirrored(config, MSX_SLOT_DISK1, "disk", 3, 3, 1, 2, "maincpu", 0xc000).set_tags("fdc", "fdc:0", "fdc:1");
msx_wd2793_force_ready(config);
msx_1_35_dd_drive(config);
msx2_floplist(config);
msx2_cartlist(config);
-MACHINE_CONFIG_END
+}
/* MSX2 - Philips NMS-8245F */
/* NMS-8245/19? */
@@ -5748,27 +5905,27 @@ ROM_START (nms8245f)
ROM_LOAD ("nms8245.u7", 0x0000, 0x20000, BAD_DUMP CRC(0c827d5f) SHA1(064e706cb1f12b99b329944ceeedc0efc3b2d9be))
ROM_END
-MACHINE_CONFIG_START(msx2_state::nms8245f)
+void msx2_state::nms8245f(machine_config &config)
+{
msx2_pal(config);
// YM2149 (in S-3527 MSX Engine)
// FDC: wd2793, 1 3.5" DSDD drive
// 2 Cartridge slots
// S-3527 MSX Engine
- MCFG_MSX_LAYOUT_ROM("bios", 0, 0, 0, 2, "maincpu", 0x10000)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot1", 1, 0)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot2", 2, 0)
- MCFG_MSX_LAYOUT_ROM("ext", 3, 0, 0, 1, "maincpu", 0x18000)
- MCFG_MSX_LAYOUT_RAM_MM("ram_mm", 3, 2, 0x20000) /* 128KB Mapper RAM */
- MCFG_MSX_RAMIO_SET_BITS(0xf8)
- MCFG_MSX_LAYOUT_DISK1("disk", 3, 3, 1, 1, "maincpu", 0x1c000)
+ add_internal_slot(config, MSX_SLOT_ROM, "bios", 0, 0, 0, 2, "maincpu", 0x10000);
+ add_cartridge_slot<1>(config, MSX_SLOT_CARTRIDGE, "cartslot1", 1, 0, msx_cart, nullptr);
+ add_cartridge_slot<2>(config, MSX_SLOT_CARTRIDGE, "cartslot2", 2, 0, msx_cart, nullptr);
+ add_internal_slot(config, MSX_SLOT_ROM, "ext", 3, 0, 0, 1, "maincpu", 0x18000);
+ add_internal_slot(config, MSX_SLOT_RAM_MM, "ram_mm", 3, 2, 0, 4).set_total_size(0x20000).set_ramio_bits(0xf8); /* 128KB Mapper RAM */
+ add_internal_slot_mirrored(config, MSX_SLOT_DISK1, "disk", 3, 3, 1, 2, "maincpu", 0x1c000).set_tags("fdc", "fdc:0", "fdc:1");
msx_wd2793_force_ready(config);
msx_1_35_dd_drive(config);
msx2_floplist(config);
msx2_cartlist(config);
-MACHINE_CONFIG_END
+}
/* MSX2 - Philips NMS-8250 */
/* Labels taken from an NMS-8250/00 */
@@ -5780,27 +5937,27 @@ ROM_START (nms8250)
ROM_LOAD ("jq00014.ic117", 0xc000, 0x4000, CRC(ca3307d3) SHA1(c3efedda7ab947a06d9345f7b8261076fa7ceeef))
ROM_END
-MACHINE_CONFIG_START(msx2_state::nms8250)
+void msx2_state::nms8250(machine_config &config)
+{
msx2_pal(config);
// YM2149 (in S-3527 MSX Engine)
// FDC: wd2793, 1 3.5" DSDD drive
// 2 Cartridge slots
// S-3527 MSX Engine
- MCFG_MSX_LAYOUT_ROM("bios", 0, 0, 0, 2, "maincpu", 0x0000)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot1", 1, 0)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot2", 2, 0)
- MCFG_MSX_LAYOUT_ROM("ext", 3, 0, 0, 1, "maincpu", 0x8000)
- MCFG_MSX_LAYOUT_RAM_MM("ram_mm", 3, 2, 0x20000) /* 128KB Mapper RAM */
- MCFG_MSX_RAMIO_SET_BITS(0xf8)
- MCFG_MSX_LAYOUT_DISK1("disk", 3, 3, 1, 1, "maincpu", 0xc000)
+ add_internal_slot(config, MSX_SLOT_ROM, "bios", 0, 0, 0, 2, "maincpu", 0x0000);
+ add_cartridge_slot<1>(config, MSX_SLOT_CARTRIDGE, "cartslot1", 1, 0, msx_cart, nullptr);
+ add_cartridge_slot<2>(config, MSX_SLOT_CARTRIDGE, "cartslot2", 2, 0, msx_cart, nullptr);
+ add_internal_slot(config, MSX_SLOT_ROM, "ext", 3, 0, 0, 1, "maincpu", 0x8000);
+ add_internal_slot(config, MSX_SLOT_RAM_MM, "ram_mm", 3, 2, 0, 4).set_total_size(0x20000).set_ramio_bits(0xf8); /* 128KB Mapper RAM */
+ add_internal_slot_mirrored(config, MSX_SLOT_DISK1, "disk", 3, 3, 1, 2, "maincpu", 0xc000).set_tags("fdc", "fdc:0", "fdc:1");
msx_wd2793_force_ready(config);
msx_1_35_dd_drive(config);
msx2_floplist(config);
msx2_cartlist(config);
-MACHINE_CONFIG_END
+}
/* MSX2 - Philips NMS-8250F */
@@ -5811,27 +5968,27 @@ ROM_START (nms8250f)
ROM_LOAD ("nms8250fdisk.rom", 0xc000, 0x4000, CRC(13b60725) SHA1(58ba1887e8fd21c912b6859cae6514bd874ffcca))
ROM_END
-MACHINE_CONFIG_START(msx2_state::nms8250f)
+void msx2_state::nms8250f(machine_config &config)
+{
msx2_pal(config);
// YM2149 (in S-3527 MSX Engine)
// FDC: wd2793, 1 3.5" DSDD drive
// 2 Cartridge slots
// S-3527 MSX Engine
- MCFG_MSX_LAYOUT_ROM("bios", 0, 0, 0, 2, "maincpu", 0x0000)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot1", 1, 0)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot2", 2, 0)
- MCFG_MSX_LAYOUT_ROM("ext", 3, 0, 0, 1, "maincpu", 0x8000)
- MCFG_MSX_LAYOUT_RAM_MM("ram_mm", 3, 2, 0x20000) /* 128KB Mapper RAM */
- MCFG_MSX_RAMIO_SET_BITS(0xf8)
- MCFG_MSX_LAYOUT_DISK1("disk", 3, 3, 1, 1, "maincpu", 0xc000)
+ add_internal_slot(config, MSX_SLOT_ROM, "bios", 0, 0, 0, 2, "maincpu", 0x0000);
+ add_cartridge_slot<1>(config, MSX_SLOT_CARTRIDGE, "cartslot1", 1, 0, msx_cart, nullptr);
+ add_cartridge_slot<2>(config, MSX_SLOT_CARTRIDGE, "cartslot2", 2, 0, msx_cart, nullptr);
+ add_internal_slot(config, MSX_SLOT_ROM, "ext", 3, 0, 0, 1, "maincpu", 0x8000);
+ add_internal_slot(config, MSX_SLOT_RAM_MM, "ram_mm", 3, 2, 0, 4).set_total_size(0x20000).set_ramio_bits(0xf8); /* 128KB Mapper RAM */
+ add_internal_slot_mirrored(config, MSX_SLOT_DISK1, "disk", 3, 3, 1, 2, "maincpu", 0xc000).set_tags("fdc", "fdc:0", "fdc:1");
msx_wd2793_force_ready(config);
msx_1_35_dd_drive(config);
msx2_floplist(config);
msx2_cartlist(config);
-MACHINE_CONFIG_END
+}
/* MSX2 - Philips NMS-8250J */
@@ -5845,25 +6002,26 @@ ROM_START (nms8250j)
ROM_LOAD ("8250jkfn.rom", 0x00000, 0x20000, CRC(5a59926e) SHA1(6acaf2eeb57f65f7408235d5e07b7563229de799))
ROM_END
-MACHINE_CONFIG_START(msx2_state::nms8250j)
+void msx2_state::nms8250j(machine_config &config)
+{
msx2(config);
// AY8910/YM2149?
// FDC: wd2793?, 1 3.5" DSDD drive
// 2 Cartridge slots?
- MCFG_MSX_LAYOUT_ROM("bios", 0, 0, 0, 2, "maincpu", 0x0000)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot1", 1, 0)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot2", 2, 0)
- MCFG_MSX_LAYOUT_ROM("ext", 3, 0, 0, 1, "maincpu", 0x8000)
- MCFG_MSX_LAYOUT_RAM_MM("ram_mm", 3, 2, 0x20000) /* 128KB Mapper RAM */
- MCFG_MSX_LAYOUT_DISK1("disk", 3, 3, 1, 1, "maincpu", 0xc000)
+ add_internal_slot(config, MSX_SLOT_ROM, "bios", 0, 0, 0, 2, "maincpu", 0x0000);
+ add_cartridge_slot<1>(config, MSX_SLOT_CARTRIDGE, "cartslot1", 1, 0, msx_cart, nullptr);
+ add_cartridge_slot<2>(config, MSX_SLOT_CARTRIDGE, "cartslot2", 2, 0, msx_cart, nullptr);
+ add_internal_slot(config, MSX_SLOT_ROM, "ext", 3, 0, 0, 1, "maincpu", 0x8000);
+ add_internal_slot(config, MSX_SLOT_RAM_MM, "ram_mm", 3, 2, 0, 4).set_total_size(0x20000); /* 128KB Mapper RAM */
+ add_internal_slot_mirrored(config, MSX_SLOT_DISK1, "disk", 3, 3, 1, 2, "maincpu", 0xc000).set_tags("fdc", "fdc:0", "fdc:1");
msx_wd2793_force_ready(config);
msx_1_35_dd_drive(config);
msx2_floplist(config);
msx2_cartlist(config);
-MACHINE_CONFIG_END
+}
/* MSX2 - Philips NMS-8255 */
@@ -5874,27 +6032,27 @@ ROM_START (nms8255)
ROM_LOAD ("8255disk.rom.ic117", 0xc000, 0x4000, CRC(ca3307d3) SHA1(c3efedda7ab947a06d9345f7b8261076fa7ceeef))
ROM_END
-MACHINE_CONFIG_START(msx2_state::nms8255)
+void msx2_state::nms8255(machine_config &config)
+{
msx2_pal(config);
// YM2149 (in S-3527 MSX Engine)
// FDC: wd2793, 2 3.5" DSDD drives
// 2 Cartridge slots
// S-3527 MSX Engine
- MCFG_MSX_LAYOUT_ROM("bios", 0, 0, 0, 2, "maincpu", 0x0000)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot1", 1, 0)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot2", 2, 0)
- MCFG_MSX_LAYOUT_ROM("ext", 3, 0, 0, 1, "maincpu", 0x8000)
- MCFG_MSX_LAYOUT_RAM_MM("ram_mm", 3, 2, 0x20000) /* 128KB Mapper RAM */
- MCFG_MSX_RAMIO_SET_BITS(0xf8)
- MCFG_MSX_LAYOUT_DISK1("disk", 3, 3, 1, 1, "maincpu", 0xc000)
+ add_internal_slot(config, MSX_SLOT_ROM, "bios", 0, 0, 0, 2, "maincpu", 0x0000);
+ add_cartridge_slot<1>(config, MSX_SLOT_CARTRIDGE, "cartslot1", 1, 0, msx_cart, nullptr);
+ add_cartridge_slot<2>(config, MSX_SLOT_CARTRIDGE, "cartslot2", 2, 0, msx_cart, nullptr);
+ add_internal_slot(config, MSX_SLOT_ROM, "ext", 3, 0, 0, 1, "maincpu", 0x8000);
+ add_internal_slot(config, MSX_SLOT_RAM_MM, "ram_mm", 3, 2, 0, 4).set_total_size(0x20000).set_ramio_bits(0xf8); /* 128KB Mapper RAM */
+ add_internal_slot_mirrored(config, MSX_SLOT_DISK1, "disk", 3, 3, 1, 2, "maincpu", 0xc000).set_tags("fdc", "fdc:0", "fdc:1");
msx_wd2793_force_ready(config);
msx_2_35_dd_drive(config);
msx2_floplist(config);
msx2_cartlist(config);
-MACHINE_CONFIG_END
+}
/* MSX2 - Philips NMS-8255F */
@@ -5905,27 +6063,27 @@ ROM_START (nms8255f)
ROM_LOAD ("nms8255fdisk.rom", 0xc000, 0x4000, CRC(13b60725) SHA1(58ba1887e8fd21c912b6859cae6514bd874ffcca))
ROM_END
-MACHINE_CONFIG_START(msx2_state::nms8255f)
+void msx2_state::nms8255f(machine_config &config)
+{
msx2_pal(config);
// YM2149 (in S-3527 MSX Engine)
// FDC: wd2793, 2 3.5" DSDD drives
// 2 Cartridge slots
// S-3527 MSX Engine
- MCFG_MSX_LAYOUT_ROM("bios", 0, 0, 0, 2, "maincpu", 0x0000)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot1", 1, 0)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot2", 2, 0)
- MCFG_MSX_LAYOUT_ROM("ext", 3, 0, 0, 1, "maincpu", 0x8000)
- MCFG_MSX_LAYOUT_RAM_MM("ram_mm", 3, 2, 0x20000) /* 128KB Mapper RAM */
- MCFG_MSX_RAMIO_SET_BITS(0xf8)
- MCFG_MSX_LAYOUT_DISK1("disk", 3, 3, 1, 1, "maincpu", 0xc000)
+ add_internal_slot(config, MSX_SLOT_ROM, "bios", 0, 0, 0, 2, "maincpu", 0x0000);
+ add_cartridge_slot<1>(config, MSX_SLOT_CARTRIDGE, "cartslot1", 1, 0, msx_cart, nullptr);
+ add_cartridge_slot<2>(config, MSX_SLOT_CARTRIDGE, "cartslot2", 2, 0, msx_cart, nullptr);
+ add_internal_slot(config, MSX_SLOT_ROM, "ext", 3, 0, 0, 1, "maincpu", 0x8000);
+ add_internal_slot(config, MSX_SLOT_RAM_MM, "ram_mm", 3, 2, 0, 4).set_total_size(0x20000).set_ramio_bits(0xf8); /* 128KB Mapper RAM */
+ add_internal_slot_mirrored(config, MSX_SLOT_DISK1, "disk", 3, 3, 1, 2, "maincpu", 0xc000).set_tags("fdc", "fdc:0", "fdc:1");
msx_wd2793_force_ready(config);
msx_2_35_dd_drive(config);
msx2_floplist(config);
msx2_cartlist(config);
-MACHINE_CONFIG_END
+}
/* MSX2 - Philips NMS-8260 */
/* Prototype created by JVC for Philips. Based on an NMS-8250 with the floppy drive removed and replaced with a 20MB JVC harddisk */
@@ -5938,20 +6096,20 @@ ROM_START (nms8260)
ROM_LOAD ("nms8260hdd.rom", 0x10000, 0x4000, CRC(0051afc3) SHA1(77f9fe964f6d8cb8c4af3b5fe63ce6591d5288e6))
ROM_END
-MACHINE_CONFIG_START(msx2_state::nms8260)
+void msx2_state::nms8260(machine_config &config)
+{
msx2_pal(config);
// YM2149 (in S-3527 MSX Engine)
// FDC: wd2793, 1 3.5" DSDD drives
// 2 Cartridge slots
// S-3527 MSX Engine
- MCFG_MSX_LAYOUT_ROM("bios", 0, 0, 0, 2, "maincpu", 0x0000)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot1", 1, 0)
- MCFG_MSX_LAYOUT_ROM("hdd", 2, 0, 1, 1, "maincpu", 0x10000)
- MCFG_MSX_LAYOUT_ROM("ext", 3, 0, 0, 1, "maincpu", 0x8000)
- MCFG_MSX_LAYOUT_RAM_MM("ram_mm", 3, 2, 0x20000) /* 128KB Mapper RAM */
- MCFG_MSX_RAMIO_SET_BITS(0xf8)
- MCFG_MSX_LAYOUT_DISK1("disk", 3, 3, 1, 1, "maincpu", 0xc000)
+ add_internal_slot(config, MSX_SLOT_ROM, "bios", 0, 0, 0, 2, "maincpu", 0x0000);
+ add_cartridge_slot<1>(config, MSX_SLOT_CARTRIDGE, "cartslot1", 1, 0, msx_cart, nullptr);
+ add_internal_slot(config, MSX_SLOT_ROM, "hdd", 2, 0, 1, 1, "maincpu", 0x10000);
+ add_internal_slot(config, MSX_SLOT_ROM, "ext", 3, 0, 0, 1, "maincpu", 0x8000);
+ add_internal_slot(config, MSX_SLOT_RAM_MM, "ram_mm", 3, 2, 0, 4).set_total_size(0x20000).set_ramio_bits(0xf8); /* 128KB Mapper RAM */
+ add_internal_slot_mirrored(config, MSX_SLOT_DISK1, "disk", 3, 3, 1, 2, "maincpu", 0xc000).set_tags("fdc", "fdc:0", "fdc:1");
// There is actually only an FDC inside the real thing. With a floppy controller to attach an external floppy drive
msx_wd2793_force_ready(config);
@@ -5959,7 +6117,7 @@ MACHINE_CONFIG_START(msx2_state::nms8260)
msx2_floplist(config);
msx2_cartlist(config);
-MACHINE_CONFIG_END
+}
/* MSX2 - Philips NMS-8270 - Not confirmed to exist yet */
@@ -5972,26 +6130,26 @@ ROM_START (nms8280)
ROM_LOAD ("8280disk.rom.ic117", 0xc000, 0x4000, CRC(ca3307d3) SHA1(c3efedda7ab947a06d9345f7b8261076fa7ceeef))
ROM_END
-MACHINE_CONFIG_START(msx2_state::nms8280)
+void msx2_state::nms8280(machine_config &config)
+{
msx2_pal(config);
// AY8910/YM2149?
// FDC: wd2793, 2 3.5" DSDD drives
// 2 Cartridge slots
- MCFG_MSX_LAYOUT_ROM("bios", 0, 0, 0, 2, "maincpu", 0x0000)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot1", 1, 0)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot2", 2, 0)
- MCFG_MSX_LAYOUT_ROM("ext", 3, 0, 0, 1, "maincpu", 0x8000)
- MCFG_MSX_LAYOUT_RAM_MM("ram_mm", 3, 2, 0x20000) /* 128KB Mapper RAM */
- MCFG_MSX_RAMIO_SET_BITS(0xf8)
- MCFG_MSX_LAYOUT_DISK1("disk", 3, 3, 1, 1, "maincpu", 0xc000)
+ add_internal_slot(config, MSX_SLOT_ROM, "bios", 0, 0, 0, 2, "maincpu", 0x0000);
+ add_cartridge_slot<1>(config, MSX_SLOT_CARTRIDGE, "cartslot1", 1, 0, msx_cart, nullptr);
+ add_cartridge_slot<2>(config, MSX_SLOT_CARTRIDGE, "cartslot2", 2, 0, msx_cart, nullptr);
+ add_internal_slot(config, MSX_SLOT_ROM, "ext", 3, 0, 0, 1, "maincpu", 0x8000);
+ add_internal_slot(config, MSX_SLOT_RAM_MM, "ram_mm", 3, 2, 0, 4).set_total_size(0x20000).set_ramio_bits(0xf8); /* 128KB Mapper RAM */
+ add_internal_slot_mirrored(config, MSX_SLOT_DISK1, "disk", 3, 3, 1, 2, "maincpu", 0xc000).set_tags("fdc", "fdc:0", "fdc:1");
msx_wd2793_force_ready(config);
msx_2_35_dd_drive(config);
msx2_floplist(config);
msx2_cartlist(config);
-MACHINE_CONFIG_END
+}
/* MSX2 - Philips NMS-8280F */
@@ -6002,26 +6160,26 @@ ROM_START (nms8280f)
ROM_LOAD ("8280fdisk.rom", 0xc000, 0x4000, CRC(13b60725) SHA1(58ba1887e8fd21c912b6859cae6514bd874ffcca))
ROM_END
-MACHINE_CONFIG_START(msx2_state::nms8280f)
+void msx2_state::nms8280f(machine_config &config)
+{
msx2_pal(config);
// AY8910/YM2149?
// FDC: wd2793, 2 3.5" DSDD drives
// 2 Cartridge slots
- MCFG_MSX_LAYOUT_ROM("bios", 0, 0, 0, 2, "maincpu", 0x0000)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot1", 1, 0)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot2", 2, 0)
- MCFG_MSX_LAYOUT_ROM("ext", 3, 0, 0, 1, "maincpu", 0x8000)
- MCFG_MSX_LAYOUT_RAM_MM("ram_mm", 3, 2, 0x20000) /* 128KB Mapper RAM */
- MCFG_MSX_RAMIO_SET_BITS(0xf8)
- MCFG_MSX_LAYOUT_DISK1("disk", 3, 3, 1, 1, "maincpu", 0xc000)
+ add_internal_slot(config, MSX_SLOT_ROM, "bios", 0, 0, 0, 2, "maincpu", 0x0000);
+ add_cartridge_slot<1>(config, MSX_SLOT_CARTRIDGE, "cartslot1", 1, 0, msx_cart, nullptr);
+ add_cartridge_slot<2>(config, MSX_SLOT_CARTRIDGE, "cartslot2", 2, 0, msx_cart, nullptr);
+ add_internal_slot(config, MSX_SLOT_ROM, "ext", 3, 0, 0, 1, "maincpu", 0x8000);
+ add_internal_slot(config, MSX_SLOT_RAM_MM, "ram_mm", 3, 2, 0, 4).set_total_size(0x20000).set_ramio_bits(0xf8); /* 128KB Mapper RAM */
+ add_internal_slot_mirrored(config, MSX_SLOT_DISK1, "disk", 3, 3, 1, 2, "maincpu", 0xc000).set_tags("fdc", "fdc:0", "fdc:1");
msx_wd2793_force_ready(config);
msx_2_35_dd_drive(config);
msx2_floplist(config);
msx2_cartlist(config);
-MACHINE_CONFIG_END
+}
/* MSX2 - Philips NMS-8280G */
@@ -6032,26 +6190,26 @@ ROM_START (nms8280g)
ROM_LOAD ("8280gdisk.rom.ic117", 0xc000, 0x4000, CRC(d0beebb8) SHA1(d1001f93c87ff7fb389e418e33bf7bc81bdbb65f))
ROM_END
-MACHINE_CONFIG_START(msx2_state::nms8280g)
+void msx2_state::nms8280g(machine_config &config)
+{
msx2_pal(config);
// AY8910/YM2149?
// FDC: wd2793, 2 3.5" DSDD drives
// 2 Cartridge slots
- MCFG_MSX_LAYOUT_ROM("bios", 0, 0, 0, 2, "maincpu", 0x0000)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot1", 1, 0)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot2", 2, 0)
- MCFG_MSX_LAYOUT_ROM("ext", 3, 0, 0, 1, "maincpu", 0x8000)
- MCFG_MSX_LAYOUT_RAM_MM("ram_mm", 3, 2, 0x20000) /* 128KB Mapper RAM */
- MCFG_MSX_RAMIO_SET_BITS(0xf8)
- MCFG_MSX_LAYOUT_DISK1("disk", 3, 3, 1, 1, "maincpu", 0xc000)
+ add_internal_slot(config, MSX_SLOT_ROM, "bios", 0, 0, 0, 2, "maincpu", 0x0000);
+ add_cartridge_slot<1>(config, MSX_SLOT_CARTRIDGE, "cartslot1", 1, 0, msx_cart, nullptr);
+ add_cartridge_slot<2>(config, MSX_SLOT_CARTRIDGE, "cartslot2", 2, 0, msx_cart, nullptr);
+ add_internal_slot(config, MSX_SLOT_ROM, "ext", 3, 0, 0, 1, "maincpu", 0x8000);
+ add_internal_slot(config, MSX_SLOT_RAM_MM, "ram_mm", 3, 2, 0, 4).set_total_size(0x20000).set_ramio_bits(0xf8); /* 128KB Mapper RAM */
+ add_internal_slot_mirrored(config, MSX_SLOT_DISK1, "disk", 3, 3, 1, 2, "maincpu", 0xc000).set_tags("fdc", "fdc:0", "fdc:1");
msx_wd2793_force_ready(config);
msx_2_35_dd_drive(config);
msx2_floplist(config);
msx2_cartlist(config);
-MACHINE_CONFIG_END
+}
/* MSX2 - Philips VG-8230 (u11 - exp, u12 - basic, u13 - disk */
@@ -6062,27 +6220,27 @@ ROM_START (vg8230)
ROM_LOAD ("8230disk.rom.u13", 0xc000, 0x4000, CRC(77c4e5bc) SHA1(849f93867ff7846b27f84d0be418569faf058ac2))
ROM_END
-MACHINE_CONFIG_START(msx2_state::vg8230)
+void msx2_state::vg8230(machine_config &config)
+{
msx2_pal(config);
// YM2149 (in S-3527 MSX Engine)
// FDC: wd2793, 1 3.5" SSDD drive
// 2 Cartridge slots
// S-3527 MSX Engine
- MCFG_MSX_LAYOUT_ROM("bios", 0, 0, 0, 2, "maincpu", 0x0000)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot1", 1, 0)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot2", 2, 0)
- MCFG_MSX_LAYOUT_ROM("ext", 3, 0, 0, 1, "maincpu", 0x8000)
- MCFG_MSX_LAYOUT_RAM_MM("ram_mm", 3, 2, 0x10000) /* 64KB Mapper RAM */
- MCFG_MSX_RAMIO_SET_BITS(0xf8)
- MCFG_MSX_LAYOUT_DISK1("disk", 3, 3, 1, 1, "maincpu", 0xc000)
+ add_internal_slot(config, MSX_SLOT_ROM, "bios", 0, 0, 0, 2, "maincpu", 0x0000);
+ add_cartridge_slot<1>(config, MSX_SLOT_CARTRIDGE, "cartslot1", 1, 0, msx_cart, nullptr);
+ add_cartridge_slot<2>(config, MSX_SLOT_CARTRIDGE, "cartslot2", 2, 0, msx_cart, nullptr);
+ add_internal_slot(config, MSX_SLOT_ROM, "ext", 3, 0, 0, 1, "maincpu", 0x8000);
+ add_internal_slot(config, MSX_SLOT_RAM_MM, "ram_mm", 3, 2, 0, 4).set_total_size(0x10000).set_ramio_bits(0xf8); /* 64KB Mapper RAM */
+ add_internal_slot_mirrored(config, MSX_SLOT_DISK1, "disk", 3, 3, 1, 2, "maincpu", 0xc000).set_tags("fdc", "fdc:0", "fdc:1");
msx_wd2793_force_ready(config);
msx_1_35_ssdd_drive(config);
msx2_floplist(config);
msx2_cartlist(config);
-MACHINE_CONFIG_END
+}
/* MSX2 - Philips VG-8230J */
@@ -6096,25 +6254,26 @@ ROM_START (vg8230j)
ROM_LOAD ("8230jkfn.rom", 0x00000, 0x20000, CRC(5a59926e) SHA1(6acaf2eeb57f65f7408235d5e07b7563229de799))
ROM_END
-MACHINE_CONFIG_START(msx2_state::vg8230j)
+void msx2_state::vg8230j(machine_config &config)
+{
msx2(config);
// AY8910/YM2149?
// FDC: wd2793?, 1 3.5" SSDD drive?
// 2 Cartridge slots?
- MCFG_MSX_LAYOUT_ROM("bios", 0, 0, 0, 2, "maincpu", 0x0000)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot1", 1, 0)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot2", 2, 0)
- MCFG_MSX_LAYOUT_ROM("ext", 3, 0, 0, 1, "maincpu", 0x8000)
- MCFG_MSX_LAYOUT_RAM_MM("ram_mm", 3, 2, 0x20000) /* 128KB Mapper RAM */
- MCFG_MSX_LAYOUT_DISK1("disk", 3, 3, 1, 1, "maincpu", 0xc000)
+ add_internal_slot(config, MSX_SLOT_ROM, "bios", 0, 0, 0, 2, "maincpu", 0x0000);
+ add_cartridge_slot<1>(config, MSX_SLOT_CARTRIDGE, "cartslot1", 1, 0, msx_cart, nullptr);
+ add_cartridge_slot<2>(config, MSX_SLOT_CARTRIDGE, "cartslot2", 2, 0, msx_cart, nullptr);
+ add_internal_slot(config, MSX_SLOT_ROM, "ext", 3, 0, 0, 1, "maincpu", 0x8000);
+ add_internal_slot(config, MSX_SLOT_RAM_MM, "ram_mm", 3, 2, 0, 4).set_total_size(0x20000); /* 128KB Mapper RAM */
+ add_internal_slot_mirrored(config, MSX_SLOT_DISK1, "disk", 3, 3, 1, 2, "maincpu", 0xc000).set_tags("fdc", "fdc:0", "fdc:1");
msx_wd2793_force_ready(config);
msx_1_35_ssdd_drive(config);
msx2_floplist(config);
msx2_cartlist(config);
-MACHINE_CONFIG_END
+}
/* MSX2 - Philips VG-8235 3 psosible basic and ext roms (/00 /02 /19) */
@@ -6125,27 +6284,27 @@ ROM_START (vg8235)
ROM_LOAD ("8235disk.rom.u50", 0xc000, 0x4000, CRC(51daeb25) SHA1(8954e59aa79310c7b719ecf0cde1e82fb731dcd1))
ROM_END
-MACHINE_CONFIG_START(msx2_state::vg8235)
+void msx2_state::vg8235(machine_config &config)
+{
msx2_pal(config);
// YM2149 (in S-3527 MSX Engine)
// FDC: wd2793, 1 3.5" SSDD drive
// 2 Cartridge slots
// S-3527 MSX Engine
- MCFG_MSX_LAYOUT_ROM("bios", 0, 0, 0, 2, "maincpu", 0x0000)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot1", 1, 0)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot2", 2, 0)
- MCFG_MSX_LAYOUT_ROM("ext", 3, 0, 0, 1, "maincpu", 0x8000)
- MCFG_MSX_LAYOUT_RAM_MM("ram_mm", 3, 2, 0x20000) /* 128KB Mapper RAM */
- MCFG_MSX_RAMIO_SET_BITS(0xf8)
- MCFG_MSX_LAYOUT_DISK1("disk", 3, 3, 1, 1, "maincpu", 0xc000)
+ add_internal_slot(config, MSX_SLOT_ROM, "bios", 0, 0, 0, 2, "maincpu", 0x0000);
+ add_cartridge_slot<1>(config, MSX_SLOT_CARTRIDGE, "cartslot1", 1, 0, msx_cart, nullptr);
+ add_cartridge_slot<2>(config, MSX_SLOT_CARTRIDGE, "cartslot2", 2, 0, msx_cart, nullptr);
+ add_internal_slot(config, MSX_SLOT_ROM, "ext", 3, 0, 0, 1, "maincpu", 0x8000);
+ add_internal_slot(config, MSX_SLOT_RAM_MM, "ram_mm", 3, 2, 0, 4).set_total_size(0x20000).set_ramio_bits(0xf8); /* 128KB Mapper RAM */
+ add_internal_slot_mirrored(config, MSX_SLOT_DISK1, "disk", 3, 3, 1, 2, "maincpu", 0xc000).set_tags("fdc", "fdc:0", "fdc:1");
msx_wd2793_force_ready(config);
msx_1_35_ssdd_drive(config);
msx2_floplist(config);
msx2_cartlist(config);
-MACHINE_CONFIG_END
+}
/* MSX2 - Philips VG-8235F */
@@ -6156,27 +6315,27 @@ ROM_START (vg8235f)
ROM_LOAD ("8235fdisk.rom.u50", 0xc000, 0x4000, CRC(77c4e5bc) SHA1(849f93867ff7846b27f84d0be418569faf058ac2))
ROM_END
-MACHINE_CONFIG_START(msx2_state::vg8235f)
+void msx2_state::vg8235f(machine_config &config)
+{
msx2_pal(config);
// YM2149 (in S-3527 MSX Engine)
// FDC: wd2793, 1 3.5" SSDD drive
// 2 Cartridge slots
// S-3527 MSX Engine
- MCFG_MSX_LAYOUT_ROM("bios", 0, 0, 0, 2, "maincpu", 0x0000)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot1", 1, 0)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot2", 2, 0)
- MCFG_MSX_LAYOUT_ROM("ext", 3, 0, 0, 1, "maincpu", 0x8000)
- MCFG_MSX_LAYOUT_RAM_MM("ram_mm", 3, 2, 0x20000) /* 128KB Mapper RAM */
- MCFG_MSX_RAMIO_SET_BITS(0xf8)
- MCFG_MSX_LAYOUT_DISK1("disk", 3, 3, 1, 1, "maincpu", 0xc000)
+ add_internal_slot(config, MSX_SLOT_ROM, "bios", 0, 0, 0, 2, "maincpu", 0x0000);
+ add_cartridge_slot<1>(config, MSX_SLOT_CARTRIDGE, "cartslot1", 1, 0, msx_cart, nullptr);
+ add_cartridge_slot<2>(config, MSX_SLOT_CARTRIDGE, "cartslot2", 2, 0, msx_cart, nullptr);
+ add_internal_slot(config, MSX_SLOT_ROM, "ext", 3, 0, 0, 1, "maincpu", 0x8000);
+ add_internal_slot(config, MSX_SLOT_RAM_MM, "ram_mm", 3, 2, 0, 4).set_total_size(0x20000).set_ramio_bits(0xf8); /* 128KB Mapper RAM */
+ add_internal_slot_mirrored(config, MSX_SLOT_DISK1, "disk", 3, 3, 1, 2, "maincpu", 0xc000).set_tags("fdc", "fdc:0", "fdc:1");
msx_wd2793_force_ready(config);
msx_1_35_ssdd_drive(config);
msx2_floplist(config);
msx2_cartlist(config);
-MACHINE_CONFIG_END
+}
/* MSX2 - Philips VG-8240 */
@@ -6187,26 +6346,26 @@ ROM_START (vg8240)
ROM_LOAD ("8240disk.rom", 0xc000, 0x4000, CRC(ca3307d3) SHA1(c3efedda7ab947a06d9345f7b8261076fa7ceeef))
ROM_END
-MACHINE_CONFIG_START(msx2_state::vg8240)
+void msx2_state::vg8240(machine_config &config)
+{
msx2_pal(config);
// AY8910/YM2149?
// FDC: wd2793, 1 3.5" DSDD drive
// 2 Cartridge slots?
- MCFG_MSX_LAYOUT_ROM("bios", 0, 0, 0, 2, "maincpu", 0x0000)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot1", 1, 0)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot2", 2, 0)
- MCFG_MSX_LAYOUT_ROM("ext", 3, 0, 0, 1, "maincpu", 0x8000)
- MCFG_MSX_LAYOUT_RAM_MM("ram_mm", 3, 2, 0x10000) /* 64KB Mapper RAM */
- MCFG_MSX_RAMIO_SET_BITS(0xf8)
- MCFG_MSX_LAYOUT_DISK1("disk", 3, 3, 1, 1, "maincpu", 0xc000)
+ add_internal_slot(config, MSX_SLOT_ROM, "bios", 0, 0, 0, 2, "maincpu", 0x0000);
+ add_cartridge_slot<1>(config, MSX_SLOT_CARTRIDGE, "cartslot1", 1, 0, msx_cart, nullptr);
+ add_cartridge_slot<2>(config, MSX_SLOT_CARTRIDGE, "cartslot2", 2, 0, msx_cart, nullptr);
+ add_internal_slot(config, MSX_SLOT_ROM, "ext", 3, 0, 0, 1, "maincpu", 0x8000);
+ add_internal_slot(config, MSX_SLOT_RAM_MM, "ram_mm", 3, 2, 0, 4).set_total_size(0x10000).set_ramio_bits(0xf8); /* 64KB Mapper RAM */
+ add_internal_slot_mirrored(config, MSX_SLOT_DISK1, "disk", 3, 3, 1, 2, "maincpu", 0xc000).set_tags("fdc", "fdc:0", "fdc:1");
msx_wd2793_force_ready(config);
msx_1_35_dd_drive(config);
msx2_floplist(config);
msx2_cartlist(config);
-MACHINE_CONFIG_END
+}
/* MSX2 - Sanyo MPC-2300 */
@@ -6216,20 +6375,21 @@ ROM_START (mpc2300)
ROM_LOAD ("2300ext.rom", 0x8000, 0x4000, CRC(3d7dc718) SHA1(e1f834b28c3ee7c9f79fe6fbf2b23c8a0617892b))
ROM_END
-MACHINE_CONFIG_START(msx2_state::mpc2300)
+void msx2_state::mpc2300(machine_config &config)
+{
msx2(config);
// AY8910/YM2149?
// FDC: None, 0 drives
// 2 Cartridge slots?
- MCFG_MSX_LAYOUT_ROM("bios", 0, 0, 0, 2, "maincpu", 0x0000)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot1", 1, 0)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot2", 2, 0)
- MCFG_MSX_LAYOUT_RAM_MM("ram_mm", 3, 0, 0x20000) /* 128KB?? Mapper RAM */
- MCFG_MSX_LAYOUT_ROM("ext", 3, 1, 0, 1, "maincpu", 0x8000)
+ add_internal_slot(config, MSX_SLOT_ROM, "bios", 0, 0, 0, 2, "maincpu", 0x0000);
+ add_cartridge_slot<1>(config, MSX_SLOT_CARTRIDGE, "cartslot1", 1, 0, msx_cart, nullptr);
+ add_cartridge_slot<2>(config, MSX_SLOT_CARTRIDGE, "cartslot2", 2, 0, msx_cart, nullptr);
+ add_internal_slot(config, MSX_SLOT_RAM_MM, "ram_mm", 3, 0, 0, 4).set_total_size(0x20000); /* 128KB?? Mapper RAM */
+ add_internal_slot(config, MSX_SLOT_ROM, "ext", 3, 1, 0, 1, "maincpu", 0x8000);
msx2_cartlist(config);
-MACHINE_CONFIG_END
+}
/* MSX2 - Sanyo MPC-2500FD */
@@ -6240,26 +6400,27 @@ ROM_START (mpc2500f)
ROM_LOAD ("mpc2500fddisk.rom", 0xc000, 0x4000, CRC(38454059) SHA1(58ac78bba29a06645ca8d6a94ef2ac68b743ad32))
ROM_END
-MACHINE_CONFIG_START(msx2_state::mpc2500f)
+void msx2_state::mpc2500f(machine_config &config)
+{
msx2(config);
// YM2149
// FDC: wd2793?, 1? 3.5" DSDD drive?
// 2 Cartridge slots?
// S-3527 MSX Eninge
- MCFG_MSX_LAYOUT_ROM("bios", 0, 0, 0, 2, "maincpu", 0x0000)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot1", 1, 0)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot2", 2, 0)
- MCFG_MSX_LAYOUT_ROM("ext", 2, 3, 0, 1, "maincpu", 0x8000)
- MCFG_MSX_LAYOUT_DISK1("disk", 3, 1, 1, 1, "maincpu", 0xC000)
- MCFG_MSX_LAYOUT_RAM_MM("ram_mm", 3, 2, 0x10000) /* 64KB?? Mapper RAM */
+ add_internal_slot(config, MSX_SLOT_ROM, "bios", 0, 0, 0, 2, "maincpu", 0x0000);
+ add_cartridge_slot<1>(config, MSX_SLOT_CARTRIDGE, "cartslot1", 1, 0, msx_cart, nullptr);
+ add_cartridge_slot<2>(config, MSX_SLOT_CARTRIDGE, "cartslot2", 2, 0, msx_cart, nullptr);
+ add_internal_slot(config, MSX_SLOT_ROM, "ext", 2, 3, 0, 1, "maincpu", 0x8000);
+ add_internal_slot_mirrored(config, MSX_SLOT_DISK1, "disk", 3, 1, 1, 2, "maincpu", 0xC000).set_tags("fdc", "fdc:0", "fdc:1");
+ add_internal_slot(config, MSX_SLOT_RAM_MM, "ram_mm", 3, 2, 0, 4).set_total_size(0x10000); /* 64KB?? Mapper RAM */
msx_wd2793_force_ready(config);
msx_1_35_dd_drive(config);
msx2_floplist(config);
msx2_cartlist(config);
-MACHINE_CONFIG_END
+}
/* MSX2 - Sanyo Wavy MPC-25FD */
@@ -6270,25 +6431,26 @@ ROM_START (mpc25fd)
ROM_LOAD ("25fddisk.rom", 0xc000, 0x4000, CRC(38454059) SHA1(58ac78bba29a06645ca8d6a94ef2ac68b743ad32))
ROM_END
-MACHINE_CONFIG_START(msx2_state::mpc25fd)
+void msx2_state::mpc25fd(machine_config &config)
+{
msx2(config);
// YM2149 (in S-3527 MSX Engine)
// FDC: wd2793, 1 drive
// 1 Cartridge slot (slot 1)
// S-3527 MSX Engine
- MCFG_MSX_LAYOUT_ROM("bios", 0, 0, 0, 2, "maincpu", 0x0000)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot", 1, 0)
- MCFG_MSX_LAYOUT_ROM("ext", 2, 3, 0, 1, "maincpu", 0x8000)
- MCFG_MSX_LAYOUT_DISK1("disk", 3, 1, 1, 1, "maincpu", 0xc000)
- MCFG_MSX_LAYOUT_RAM_MM("ram_mm", 3, 2, 0x20000) /* 128KB?? RAM */
+ add_internal_slot(config, MSX_SLOT_ROM, "bios", 0, 0, 0, 2, "maincpu", 0x0000);
+ add_cartridge_slot<1>(config, MSX_SLOT_CARTRIDGE, "cartslot", 1, 0, msx_cart, nullptr);
+ add_internal_slot(config, MSX_SLOT_ROM, "ext", 2, 3, 0, 1, "maincpu", 0x8000);
+ add_internal_slot_mirrored(config, MSX_SLOT_DISK1, "disk", 3, 1, 1, 2, "maincpu", 0xc000).set_tags("fdc", "fdc:0", "fdc:1");
+ add_internal_slot(config, MSX_SLOT_RAM_MM, "ram_mm", 3, 2, 0, 4).set_total_size(0x20000); /* 128KB?? RAM */
msx_wd2793_force_ready(config);
msx_1_35_dd_drive(config);
msx2_floplist(config);
msx2_cartlist(config);
-MACHINE_CONFIG_END
+}
/* MSX2 - Sanyo Wavy MPC-27 */
@@ -6301,27 +6463,28 @@ ROM_START (mpc27)
ROM_RELOAD (0x12000, 0x2000)
ROM_END
-MACHINE_CONFIG_START(msx2_state::mpc27)
+void msx2_state::mpc27(machine_config &config)
+{
msx2(config);
// YM2149 (in S-3527 MSX Engine)
// FDC: wd2793?, 1 drive
// 2 Cartridge slots?
// S-3527 MSX Engine
- MCFG_MSX_LAYOUT_ROM("bios", 0, 0, 0, 2, "maincpu", 0x0000)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot1", 1, 0)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot2", 2, 0)
- MCFG_MSX_LAYOUT_RAM_MM("ram_mm", 3, 0, 0x20000) /* 128KB?? RAM */
- MCFG_MSX_LAYOUT_ROM("ext", 3, 1, 0, 1, "maincpu", 0x8000)
- MCFG_MSX_LAYOUT_DISK1("disk", 3, 2, 1, 1, "maincpu", 0xc000)
- MCFG_MSX_LAYOUT_ROM("lpen", 3, 3, 1, 1, "maincpu", 0x10000)
+ add_internal_slot(config, MSX_SLOT_ROM, "bios", 0, 0, 0, 2, "maincpu", 0x0000);
+ add_cartridge_slot<1>(config, MSX_SLOT_CARTRIDGE, "cartslot1", 1, 0, msx_cart, nullptr);
+ add_cartridge_slot<2>(config, MSX_SLOT_CARTRIDGE, "cartslot2", 2, 0, msx_cart, nullptr);
+ add_internal_slot(config, MSX_SLOT_RAM_MM, "ram_mm", 3, 0, 0, 4).set_total_size(0x20000); /* 128KB?? RAM */
+ add_internal_slot(config, MSX_SLOT_ROM, "ext", 3, 1, 0, 1, "maincpu", 0x8000);
+ add_internal_slot_mirrored(config, MSX_SLOT_DISK1, "disk", 3, 2, 1, 2, "maincpu", 0xc000).set_tags("fdc", "fdc:0", "fdc:1");
+ add_internal_slot(config, MSX_SLOT_ROM, "lpen", 3, 3, 1, 1, "maincpu", 0x10000);
msx_wd2793_force_ready(config);
msx_1_35_dd_drive(config);
msx2_floplist(config);
msx2_cartlist(config);
-MACHINE_CONFIG_END
+}
/* MSX2 - Sanyo Wavy PHC-23 = PHC-23J(B)*/
@@ -6331,23 +6494,24 @@ ROM_START (phc23)
ROM_LOAD ("23ext.rom", 0x8000, 0x4000, CRC(90ca25b5) SHA1(fd9fa78bac25aa3c0792425b21d14e364cf7eea4))
ROM_END
-MACHINE_CONFIG_START(msx2_state::phc23)
+void msx2_state::phc23(machine_config &config)
+{
msx2(config);
// YM2149 (in S-1985 MSX Engine)
// FDC: None, 0 drives
// 2 Cartridge slots
// S-1985 MSX Engine
- MCFG_MSX_LAYOUT_ROM("bios", 0, 0, 0, 2, "maincpu", 0x0000)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot1", 1, 0)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot2", 2, 0)
- MCFG_MSX_LAYOUT_ROM("ext", 3, 0, 0, 1, "maincpu", 0x8000)
- MCFG_MSX_LAYOUT_RAM("ram", 3, 2, 0, 4) /* 64KB RAM */
+ add_internal_slot(config, MSX_SLOT_ROM, "bios", 0, 0, 0, 2, "maincpu", 0x0000);
+ add_cartridge_slot<1>(config, MSX_SLOT_CARTRIDGE, "cartslot1", 1, 0, msx_cart, nullptr);
+ add_cartridge_slot<2>(config, MSX_SLOT_CARTRIDGE, "cartslot2", 2, 0, msx_cart, nullptr);
+ add_internal_slot(config, MSX_SLOT_ROM, "ext", 3, 0, 0, 1, "maincpu", 0x8000);
+ add_internal_slot(config, MSX_SLOT_RAM, "ram", 3, 2, 0, 4); /* 64KB RAM */
MSX_S1985(config, "s1985", 0);
msx2_cartlist(config);
-MACHINE_CONFIG_END
+}
/* MSX2 - Sanyo Wavy PHC-55FD2 */
@@ -6358,19 +6522,20 @@ ROM_START (phc55fd2)
ROM_LOAD ("phc55fd2disk.rom", 0xc000, 0x4000, CRC(38454059) SHA1(58ac78bba29a06645ca8d6a94ef2ac68b743ad32))
ROM_END
-MACHINE_CONFIG_START(msx2_state::phc55fd2)
+void msx2_state::phc55fd2(machine_config &config)
+{
msx2(config);
// YM2149 (in S-1985 MSX Engine)
// FDC: wd2793?, 2 3.5" DSDD drives
// 2 Cartridge slots
// S-1985 MSX Engine
- MCFG_MSX_LAYOUT_ROM("bios", 0, 0, 0, 2, "maincpu", 0x0000)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot1", 1, 0)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot2", 2, 0)
- MCFG_MSX_LAYOUT_RAM_MM("ram_mm", 3, 0, 0x20000) /* 128KB RAM */
- MCFG_MSX_LAYOUT_ROM("ext", 3, 1, 0, 1, "maincpu", 0x8000)
- MCFG_MSX_LAYOUT_DISK1("disk", 3, 2, 1, 1, "maincpu", 0xc000)
+ add_internal_slot(config, MSX_SLOT_ROM, "bios", 0, 0, 0, 2, "maincpu", 0x0000);
+ add_cartridge_slot<1>(config, MSX_SLOT_CARTRIDGE, "cartslot1", 1, 0, msx_cart, nullptr);
+ add_cartridge_slot<2>(config, MSX_SLOT_CARTRIDGE, "cartslot2", 2, 0, msx_cart, nullptr);
+ add_internal_slot(config, MSX_SLOT_RAM_MM, "ram_mm", 3, 0, 0, 4).set_total_size(0x20000); /* 128KB RAM */
+ add_internal_slot(config, MSX_SLOT_ROM, "ext", 3, 1, 0, 1, "maincpu", 0x8000);
+ add_internal_slot_mirrored(config, MSX_SLOT_DISK1, "disk", 3, 2, 1, 2, "maincpu", 0xc000).set_tags("fdc", "fdc:0", "fdc:1");
MSX_S1985(config, "s1985", 0);
@@ -6379,7 +6544,7 @@ MACHINE_CONFIG_START(msx2_state::phc55fd2)
msx2_floplist(config);
msx2_cartlist(config);
-MACHINE_CONFIG_END
+}
/* MSX2 - Sanyo Wavy PHC-77 */
@@ -6394,7 +6559,8 @@ ROM_START (phc77)
ROM_LOAD ("phc77kfn.rom", 0x0000, 0x20000, CRC(3b8fdf44) SHA1(fc71561a64f73da0e0043d256f67fd18d7fc3a7f))
ROM_END
-MACHINE_CONFIG_START(msx2_state::phc77)
+void msx2_state::phc77(machine_config &config)
+{
msx2(config);
// YM2149 (in S-1985 MSX Engine)
// FDC: wd2793?, 1 drive
@@ -6402,13 +6568,13 @@ MACHINE_CONFIG_START(msx2_state::phc77)
// S-1985 MSX Engine
// Builtin printer
- MCFG_MSX_LAYOUT_ROM("bios", 0, 0, 0, 2, "maincpu", 0x0000)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot1", 1, 0)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot2", 2, 0)
- MCFG_MSX_LAYOUT_RAM_MM("ram_mm", 3, 0, 0x10000) /* 64KB RAM */
- MCFG_MSX_LAYOUT_ROM("ext", 3, 1, 0, 1, "maincpu", 0x8000)
- MCFG_MSX_LAYOUT_DISK1("disk", 3, 2, 1, 1, "maincpu", 0xc000)
- MCFG_MSX_LAYOUT_ROM("write", 3, 3, 1, 2, "maincpu", 0x10000)
+ add_internal_slot(config, MSX_SLOT_ROM, "bios", 0, 0, 0, 2, "maincpu", 0x0000);
+ add_cartridge_slot<1>(config, MSX_SLOT_CARTRIDGE, "cartslot1", 1, 0, msx_cart, nullptr);
+ add_cartridge_slot<2>(config, MSX_SLOT_CARTRIDGE, "cartslot2", 2, 0, msx_cart, nullptr);
+ add_internal_slot(config, MSX_SLOT_RAM_MM, "ram_mm", 3, 0, 0, 4).set_total_size(0x10000); /* 64KB RAM */
+ add_internal_slot(config, MSX_SLOT_ROM, "ext", 3, 1, 0, 1, "maincpu", 0x8000);
+ add_internal_slot_mirrored(config, MSX_SLOT_DISK1, "disk", 3, 2, 1, 2, "maincpu", 0xc000).set_tags("fdc", "fdc:0", "fdc:1");
+ add_internal_slot(config, MSX_SLOT_ROM, "write", 3, 3, 1, 2, "maincpu", 0x10000);
MSX_S1985(config, "s1985", 0);
@@ -6417,7 +6583,7 @@ MACHINE_CONFIG_START(msx2_state::phc77)
msx2_floplist(config);
msx2_cartlist(config);
-MACHINE_CONFIG_END
+}
/* MSX2 - Sharp Epcom HotBit 2.0 */
@@ -6429,27 +6595,27 @@ ROM_START (hotbit20)
ROM_LOAD ("microsoldisk.rom", 0x10000, 0x4000, CRC(6704ef81) SHA1(a3028515ed829e900cc8deb403e17b09a38bf9b0))
ROM_END
-MACHINE_CONFIG_START(msx2_state::hotbit20)
+void msx2_state::hotbit20(machine_config &config)
+{
msx2_pal(config);
// AY8910/YM2149?
// FDC: microsol, 1 or 2 drives?
// 2 Cartridge slots?
- MCFG_MSX_LAYOUT_ROM("bios", 0, 0, 0, 2, "maincpu", 0x0000)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot1", 1, 0)
- MCFG_MSX_LAYOUT_ROM("ext", 1, 1, 0, 1, "maincpu", 0x8000) /* EXT */
- MCFG_MSX_LAYOUT_ROM("xbasic", 1, 1, 1, 1, "maincpu", 0xc000) /* XBASIC */
- MCFG_MSX_LAYOUT_DISK5("disk", 1, 3, 1, 1, "maincpu", 0x10000) /* Microsol controller */
- MCFG_MSX_LAYOUT_RAM_MM("ram_mm", 2, 0, 0x20000) /* 128KB Mapper RAM */
- MCFG_MSX_RAMIO_SET_BITS(0x80)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot2", 3, 0)
+ add_internal_slot(config, MSX_SLOT_ROM, "bios", 0, 0, 0, 2, "maincpu", 0x0000);
+ add_cartridge_slot<1>(config, MSX_SLOT_CARTRIDGE, "cartslot1", 1, 0, msx_cart, nullptr);
+ add_internal_slot(config, MSX_SLOT_ROM, "ext", 1, 1, 0, 1, "maincpu", 0x8000); /* EXT */
+ add_internal_slot(config, MSX_SLOT_ROM, "xbasic", 1, 1, 1, 1, "maincpu", 0xc000); /* XBASIC */
+ add_internal_slot(config, MSX_SLOT_DISK5, "disk", 1, 3, 1, 1, "maincpu", 0x10000).set_tags("fdc", "fdc:0", "fdc:1", "fdc:2", "fdc:3"); /* Microsol controller */
+ add_internal_slot(config, MSX_SLOT_RAM_MM, "ram_mm", 2, 0, 0, 4).set_total_size(0x20000).set_ramio_bits(0x80); /* 128KB Mapper RAM */
+ add_cartridge_slot<2>(config, MSX_SLOT_CARTRIDGE, "cartslot2", 3, 0, msx_cart, nullptr);
msx_microsol(config);
msx_1_35_dd_drive(config);
msx2_floplist(config);
msx2_cartlist(config);
-MACHINE_CONFIG_END
+}
/* MSX2 - Sony HB-F1 */
@@ -6462,23 +6628,24 @@ ROM_START (hbf1)
ROM_LOAD ("f1note3.rom", 0x18000, 0x8000, CRC(73eb9329) SHA1(58accf41a90693874b86ce98d8d43c27beb8b6dc))
ROM_END
-MACHINE_CONFIG_START(msx2_state::hbf1)
+void msx2_state::hbf1(machine_config &config)
+{
msx2(config);
// AY8910/YM2149?
// FDC: None, 0 drives
// 2 Cartridge slots
- MCFG_MSX_LAYOUT_ROM("bios", 0, 0, 0, 2, "maincpu", 0x0000)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot1", 1, 0)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot2", 2, 0)
- MCFG_MSX_LAYOUT_ROM("ext", 3, 0, 0, 1, "maincpu", 0x8000)
- MCFG_MSX_LAYOUT_ROM("note1", 3, 0, 1, 1, "maincpu", 0xc000)
- MCFG_MSX_LAYOUT_ROM("note2", 3, 1, 1, 2, "maincpu", 0x10000)
- MCFG_MSX_LAYOUT_ROM("note3", 3, 2, 1, 2, "maincpu", 0x18000)
- MCFG_MSX_LAYOUT_RAM("ram", 3, 3, 0, 4) /* 64KB RAM */
+ add_internal_slot(config, MSX_SLOT_ROM, "bios", 0, 0, 0, 2, "maincpu", 0x0000);
+ add_cartridge_slot<1>(config, MSX_SLOT_CARTRIDGE, "cartslot1", 1, 0, msx_cart, nullptr);
+ add_cartridge_slot<2>(config, MSX_SLOT_CARTRIDGE, "cartslot2", 2, 0, msx_cart, nullptr);
+ add_internal_slot(config, MSX_SLOT_ROM, "ext", 3, 0, 0, 1, "maincpu", 0x8000);
+ add_internal_slot(config, MSX_SLOT_ROM, "note1", 3, 0, 1, 1, "maincpu", 0xc000);
+ add_internal_slot(config, MSX_SLOT_ROM, "note2", 3, 1, 1, 2, "maincpu", 0x10000);
+ add_internal_slot(config, MSX_SLOT_ROM, "note3", 3, 2, 1, 2, "maincpu", 0x18000);
+ add_internal_slot(config, MSX_SLOT_RAM, "ram", 3, 3, 0, 4); /* 64KB RAM */
msx2_cartlist(config);
-MACHINE_CONFIG_END
+}
/* MSX2 - Sony HB-F1II */
@@ -6491,24 +6658,24 @@ ROM_START (hbf12)
ROM_LOAD ("f12note3.rom", 0x18000, 0x8000, CRC(44a10e6a) SHA1(917d1c079e03c4a44de864f123d03c4e32c8daae))
ROM_END
-MACHINE_CONFIG_START(msx2_state::hbf12)
+void msx2_state::hbf12(machine_config &config)
+{
msx2(config);
// AY8910/YM2149?
// FDC: None, 0 drives
// 2 Cartridge slots
- MCFG_MSX_LAYOUT_ROM("bios", 0, 0, 0, 2, "maincpu", 0x0000)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot1", 1, 0)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot2", 2, 0)
- MCFG_MSX_LAYOUT_ROM("ext", 3, 0, 0, 1, "maincpu", 0x8000)
- MCFG_MSX_LAYOUT_ROM("note1", 3, 0, 1, 1, "maincpu", 0xc000)
- MCFG_MSX_LAYOUT_ROM("note2", 3, 1, 1, 2, "maincpu", 0x10000)
- MCFG_MSX_LAYOUT_ROM("note3", 3, 2, 1, 2, "maincpu", 0x18000)
- MCFG_MSX_LAYOUT_RAM_MM("ram_mm", 3, 3, 0x10000) /* 64KB Mapper RAM */
- MCFG_MSX_RAMIO_SET_BITS(0x80)
+ add_internal_slot(config, MSX_SLOT_ROM, "bios", 0, 0, 0, 2, "maincpu", 0x0000);
+ add_cartridge_slot<1>(config, MSX_SLOT_CARTRIDGE, "cartslot1", 1, 0, msx_cart, nullptr);
+ add_cartridge_slot<2>(config, MSX_SLOT_CARTRIDGE, "cartslot2", 2, 0, msx_cart, nullptr);
+ add_internal_slot(config, MSX_SLOT_ROM, "ext", 3, 0, 0, 1, "maincpu", 0x8000);
+ add_internal_slot(config, MSX_SLOT_ROM, "note1", 3, 0, 1, 1, "maincpu", 0xc000);
+ add_internal_slot(config, MSX_SLOT_ROM, "note2", 3, 1, 1, 2, "maincpu", 0x10000);
+ add_internal_slot(config, MSX_SLOT_ROM, "note3", 3, 2, 1, 2, "maincpu", 0x18000);
+ add_internal_slot(config, MSX_SLOT_RAM_MM, "ram_mm", 3, 3, 0, 4).set_total_size(0x10000).set_ramio_bits(0x80); /* 64KB Mapper RAM */
msx2_cartlist(config);
-MACHINE_CONFIG_END
+}
/* MSX2 - Sony HB-F1XD */
@@ -6519,20 +6686,20 @@ ROM_START (hbf1xd)
ROM_LOAD ("f1xddisk.rom.ic27", 0xc000, 0x4000, BAD_DUMP CRC(54c73ad6) SHA1(12f2cc79b3d09723840bae774be48c0d721ec1c6))
ROM_END
-MACHINE_CONFIG_START(msx2_state::hbf1xd)
+void msx2_state::hbf1xd(machine_config &config)
+{
msx2(config);
// YM2149 (in S-1895 MSX Engine)
// FDC: wd2793, 1 3.5" DSDD drive
// 2 Cartridge slots
// S-1985 MSX Engine
- MCFG_MSX_LAYOUT_ROM("bios", 0, 0, 0, 2, "maincpu", 0x0000)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot1", 1, 0)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot2", 2, 0)
- MCFG_MSX_LAYOUT_ROM("ext", 3, 0, 0, 1, "maincpu", 0x8000)
- MCFG_MSX_LAYOUT_DISK1("disk", 3, 0, 1, 1, "maincpu", 0xc000)
- MCFG_MSX_LAYOUT_RAM_MM("ram_mm", 3, 3, 0x10000) /* 64KB Mapper RAM */
- MCFG_MSX_RAMIO_SET_BITS(0x80)
+ add_internal_slot(config, MSX_SLOT_ROM, "bios", 0, 0, 0, 2, "maincpu", 0x0000);
+ add_cartridge_slot<1>(config, MSX_SLOT_CARTRIDGE, "cartslot1", 1, 0, msx_cart, nullptr);
+ add_cartridge_slot<2>(config, MSX_SLOT_CARTRIDGE, "cartslot2", 2, 0, msx_cart, nullptr);
+ add_internal_slot(config, MSX_SLOT_ROM, "ext", 3, 0, 0, 1, "maincpu", 0x8000);
+ add_internal_slot_mirrored(config, MSX_SLOT_DISK1, "disk", 3, 0, 1, 2, "maincpu", 0xc000).set_tags("fdc", "fdc:0", "fdc:1");
+ add_internal_slot(config, MSX_SLOT_RAM_MM, "ram_mm", 3, 3, 0, 4).set_total_size(0x10000).set_ramio_bits(0x80); /* 64KB Mapper RAM */
MSX_S1985(config, "s1985", 0);
@@ -6541,7 +6708,7 @@ MACHINE_CONFIG_START(msx2_state::hbf1xd)
msx2_floplist(config);
msx2_cartlist(config);
-MACHINE_CONFIG_END
+}
/* MSX2 - Sony HB-F1XDMK2 */
@@ -6552,26 +6719,26 @@ ROM_START (hbf1xdm2)
ROM_LOAD ("f1m2disk.rom.ic27", 0xc000, 0x4000, BAD_DUMP CRC(54c73ad6) SHA1(12f2cc79b3d09723840bae774be48c0d721ec1c6))
ROM_END
-MACHINE_CONFIG_START(msx2_state::hbf1xdm2)
+void msx2_state::hbf1xdm2(machine_config &config)
+{
msx2(config);
// AY8910/YM2149?
// FDC: wd2793, 1 3.5" DSDD drive
// 2 Cartridge slots?
- MCFG_MSX_LAYOUT_ROM("bios", 0, 0, 0, 2, "maincpu", 0x0000)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot1", 1, 0)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot2", 2, 0)
- MCFG_MSX_LAYOUT_ROM("ext", 3, 0, 0, 1, "maincpu", 0x8000)
- MCFG_MSX_LAYOUT_DISK1("disk", 3, 0, 1, 1, "maincpu", 0xc000)
- MCFG_MSX_LAYOUT_RAM_MM("ram_mm", 3, 3, 0x10000) /* 64KB Mapper RAM */
- MCFG_MSX_RAMIO_SET_BITS(0x80)
+ add_internal_slot(config, MSX_SLOT_ROM, "bios", 0, 0, 0, 2, "maincpu", 0x0000);
+ add_cartridge_slot<1>(config, MSX_SLOT_CARTRIDGE, "cartslot1", 1, 0, msx_cart, nullptr);
+ add_cartridge_slot<2>(config, MSX_SLOT_CARTRIDGE, "cartslot2", 2, 0, msx_cart, nullptr);
+ add_internal_slot(config, MSX_SLOT_ROM, "ext", 3, 0, 0, 1, "maincpu", 0x8000);
+ add_internal_slot_mirrored(config, MSX_SLOT_DISK1, "disk", 3, 0, 1, 2, "maincpu", 0xc000).set_tags("fdc", "fdc:0", "fdc:1");
+ add_internal_slot(config, MSX_SLOT_RAM_MM, "ram_mm", 3, 3, 0, 4).set_total_size(0x10000).set_ramio_bits(0x80); /* 64KB Mapper RAM */
msx_wd2793(config);
msx_1_35_dd_drive(config);
msx2_floplist(config);
msx2_cartlist(config);
-MACHINE_CONFIG_END
+}
/* MSX2 - Sony HB-F5 */
@@ -6582,21 +6749,22 @@ ROM_START (hbf5)
ROM_LOAD ("hbf5note.rom", 0xc000, 0x4000, CRC(0cdc0777) SHA1(06ba91d6732ee8a2ecd5dcc38b0ce42403d86708))
ROM_END
-MACHINE_CONFIG_START(msx2_state::hbf5)
+void msx2_state::hbf5(machine_config &config)
+{
msx2_pal(config);
// YM2149
// FDC: None, 0 drives
// 2 Cartridge slots
- MCFG_MSX_LAYOUT_ROM("bios", 0, 0, 0, 2, "maincpu", 0x0000)
- MCFG_MSX_LAYOUT_ROM("ext", 0, 1, 0, 1, "maincpu", 0x8000)
- MCFG_MSX_LAYOUT_ROM("note", 0, 1, 1, 1, "maincpu", 0xc000)
- MCFG_MSX_LAYOUT_RAM_MM("ram_mm", 0, 2, 0x10000) /* 64KB?? Mapper RAM */
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot1", 1, 0)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot2", 2, 0)
+ add_internal_slot(config, MSX_SLOT_ROM, "bios", 0, 0, 0, 2, "maincpu", 0x0000);
+ add_internal_slot(config, MSX_SLOT_ROM, "ext", 0, 1, 0, 1, "maincpu", 0x8000);
+ add_internal_slot(config, MSX_SLOT_ROM, "note", 0, 1, 1, 1, "maincpu", 0xc000);
+ add_internal_slot(config, MSX_SLOT_RAM_MM, "ram_mm", 0, 2, 0, 4).set_total_size(0x10000); /* 64KB?? Mapper RAM */
+ add_cartridge_slot<1>(config, MSX_SLOT_CARTRIDGE, "cartslot1", 1, 0, msx_cart, nullptr);
+ add_cartridge_slot<2>(config, MSX_SLOT_CARTRIDGE, "cartslot2", 2, 0, msx_cart, nullptr);
msx2_cartlist(config);
-MACHINE_CONFIG_END
+}
/* MSX2 - Sony HB-F500 */
@@ -6610,26 +6778,27 @@ ROM_START (hbf500)
ROM_LOAD ("f500kfn.rom", 0, 0x20000, CRC(5a59926e) SHA1(6acaf2eeb57f65f7408235d5e07b7563229de799))
ROM_END
-MACHINE_CONFIG_START(msx2_state::hbf500)
+void msx2_state::hbf500(machine_config &config)
+{
msx2(config);
// AY8910/YM2149?
// FDC: wd2793, 1 3.5" DSDD drive
// 2 Cartridge slots?
- MCFG_MSX_LAYOUT_ROM("bios", 0, 0, 0, 2, "maincpu", 0x0000)
- MCFG_MSX_LAYOUT_RAM("ram1", 0, 0, 2, 2) /* 32KB RAM */
- MCFG_MSX_LAYOUT_ROM("ext", 0, 1, 0, 1, "maincpu", 0x8000)
- MCFG_MSX_LAYOUT_DISK1("disk", 0, 1, 1, 1, "maincpu", 0xc000)
- MCFG_MSX_LAYOUT_RAM("ram2", 0, 2, 0, 2) /* 32KB RAM */
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot1", 1, 0)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot2", 2, 0)
+ add_internal_slot(config, MSX_SLOT_ROM, "bios", 0, 0, 0, 2, "maincpu", 0x0000);
+ add_internal_slot(config, MSX_SLOT_RAM, "ram1", 0, 0, 2, 2); /* 32KB RAM */
+ add_internal_slot(config, MSX_SLOT_ROM, "ext", 0, 1, 0, 1, "maincpu", 0x8000);
+ add_internal_slot_mirrored(config, MSX_SLOT_DISK1, "disk", 0, 1, 1, 2, "maincpu", 0xc000).set_tags("fdc", "fdc:0", "fdc:1");
+ add_internal_slot(config, MSX_SLOT_RAM, "ram2", 0, 2, 0, 2); /* 32KB RAM */
+ add_cartridge_slot<1>(config, MSX_SLOT_CARTRIDGE, "cartslot1", 1, 0, msx_cart, nullptr);
+ add_cartridge_slot<2>(config, MSX_SLOT_CARTRIDGE, "cartslot2", 2, 0, msx_cart, nullptr);
msx_wd2793_force_ready(config);
msx_1_35_dd_drive(config);
msx2_floplist(config);
msx2_cartlist(config);
-MACHINE_CONFIG_END
+}
/* MSX2 - Sony HB-F500F */
@@ -6640,7 +6809,8 @@ ROM_START (hbf500f)
ROM_LOAD ("hbf500fdisk.rom", 0xc000, 0x4000, CRC(6e718f5c) SHA1(0e081572f84555dc13bdb0c7044a19d6c164d985))
ROM_END
-MACHINE_CONFIG_START(msx2_state::hbf500f)
+void msx2_state::hbf500f(machine_config &config)
+{
msx2_pal(config);
// AY8910/YM2149?
// FDC: wd2793, 1 3.5" DSDD drive
@@ -6650,16 +6820,16 @@ MACHINE_CONFIG_START(msx2_state::hbf500f)
msx_1_35_dd_drive(config);
msx2_floplist(config);
- MCFG_MSX_LAYOUT_ROM("bios", 0, 0, 0, 2, "maincpu", 0x0000)
- MCFG_MSX_LAYOUT_RAM("ram1", 0, 0, 2, 2) /* 32KB RAM */
- MCFG_MSX_LAYOUT_ROM("ext", 0, 1, 0, 1, "maincpu", 0x8000)
- MCFG_MSX_LAYOUT_DISK1("disk", 0, 1, 1, 1, "maincpu", 0xc000)
- MCFG_MSX_LAYOUT_RAM("ram2", 0, 2, 0, 2) /* 32KB RAM */
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot1", 1, 0)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot2", 2, 0)
+ add_internal_slot(config, MSX_SLOT_ROM, "bios", 0, 0, 0, 2, "maincpu", 0x0000);
+ add_internal_slot(config, MSX_SLOT_RAM, "ram1", 0, 0, 2, 2); /* 32KB RAM */
+ add_internal_slot(config, MSX_SLOT_ROM, "ext", 0, 1, 0, 1, "maincpu", 0x8000);
+ add_internal_slot_mirrored(config, MSX_SLOT_DISK1, "disk", 0, 1, 1, 2, "maincpu", 0xc000).set_tags("fdc", "fdc:0", "fdc:1");
+ add_internal_slot(config, MSX_SLOT_RAM, "ram2", 0, 2, 0, 2); /* 32KB RAM */
+ add_cartridge_slot<1>(config, MSX_SLOT_CARTRIDGE, "cartslot1", 1, 0, msx_cart, nullptr);
+ add_cartridge_slot<2>(config, MSX_SLOT_CARTRIDGE, "cartslot2", 2, 0, msx_cart, nullptr);
msx2_cartlist(config);
-MACHINE_CONFIG_END
+}
/* MSX2 - Sony HB-F500P */
@@ -6670,7 +6840,8 @@ ROM_START (hbf500p)
ROM_FILL (0x10000, 0xc000, 0xFF)
ROM_END
-MACHINE_CONFIG_START(msx2_state::hbf500p)
+void msx2_state::hbf500p(machine_config &config)
+{
msx2_pal(config);
// AY8910/YM2149?
// FDC: wd2793, 1 3.5" DSDD drive
@@ -6680,17 +6851,17 @@ MACHINE_CONFIG_START(msx2_state::hbf500p)
msx_1_35_dd_drive(config);
msx2_floplist(config);
- MCFG_MSX_LAYOUT_ROM("bios", 0, 0, 0, 2, "maincpu", 0x0000)
- MCFG_MSX_LAYOUT_RAM("ram1", 0, 0, 2, 2) /* 32KB RAM */
- MCFG_MSX_LAYOUT_ROM("ext", 0, 1, 0, 1, "maincpu", 0x8000)
- MCFG_MSX_LAYOUT_DISK1("disk", 0, 1, 1, 1, "maincpu", 0xc000)
- MCFG_MSX_LAYOUT_RAM("ram2", 0, 2, 0, 2) /* 32KB RAM */
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot1", 1, 0)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot2", 2, 0)
- MCFG_MSX_LAYOUT_ROM("empty", 3, 0, 0, 4, "maincpu", 0xc000) // Empty? or is this the 3rd cartridge/expansion slot ?
+ add_internal_slot(config, MSX_SLOT_ROM, "bios", 0, 0, 0, 2, "maincpu", 0x0000);
+ add_internal_slot(config, MSX_SLOT_RAM, "ram1", 0, 0, 2, 2); /* 32KB RAM */
+ add_internal_slot(config, MSX_SLOT_ROM, "ext", 0, 1, 0, 1, "maincpu", 0x8000);
+ add_internal_slot_mirrored(config, MSX_SLOT_DISK1, "disk", 0, 1, 1, 2, "maincpu", 0xc000).set_tags("fdc", "fdc:0", "fdc:1");
+ add_internal_slot(config, MSX_SLOT_RAM, "ram2", 0, 2, 0, 2); /* 32KB RAM */
+ add_cartridge_slot<1>(config, MSX_SLOT_CARTRIDGE, "cartslot1", 1, 0, msx_cart, nullptr);
+ add_cartridge_slot<2>(config, MSX_SLOT_CARTRIDGE, "cartslot2", 2, 0, msx_cart, nullptr);
+ add_internal_slot(config, MSX_SLOT_ROM, "empty", 3, 0, 0, 4, "maincpu", 0xc000); // Empty? or is this the 3rd cartridge/expansion slot ?
msx2_cartlist(config);
-MACHINE_CONFIG_END
+}
/* MSX2 - Sony HB-F700D */
@@ -6700,20 +6871,20 @@ ROM_START (hbf700d)
ROM_LOAD ("700dext.ic6", 0x8000, 0x8000, CRC(100cf756) SHA1(317722fa36c2ed31c07c5218b43490fd5badf1f8))
ROM_END
-MACHINE_CONFIG_START(msx2_state::hbf700d)
+void msx2_state::hbf700d(machine_config &config)
+{
msx2_pal(config);
// YM2149 (in S-1985 MSX Engine)
// FDC: wd2793, 1 3.5" DSDD drive
// 2 Cartridge slots
// S-1985 MSX Engine
- MCFG_MSX_LAYOUT_ROM("bios", 0, 0, 0, 2, "maincpu", 0x0000)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot1", 1, 0)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot2", 2, 0)
- MCFG_MSX_LAYOUT_ROM("ext", 3, 0, 0, 1, "maincpu", 0x8000)
- MCFG_MSX_LAYOUT_DISK1("disk", 3, 0, 1, 1, "maincpu", 0xc000)
- MCFG_MSX_LAYOUT_RAM_MM("ram_mm", 3, 3, 0x40000) /* 256KB Mapper RAM */
- MCFG_MSX_RAMIO_SET_BITS(0x80)
+ add_internal_slot(config, MSX_SLOT_ROM, "bios", 0, 0, 0, 2, "maincpu", 0x0000);
+ add_cartridge_slot<1>(config, MSX_SLOT_CARTRIDGE, "cartslot1", 1, 0, msx_cart, nullptr);
+ add_cartridge_slot<2>(config, MSX_SLOT_CARTRIDGE, "cartslot2", 2, 0, msx_cart, nullptr);
+ add_internal_slot(config, MSX_SLOT_ROM, "ext", 3, 0, 0, 1, "maincpu", 0x8000);
+ add_internal_slot_mirrored(config, MSX_SLOT_DISK1, "disk", 3, 0, 1, 2, "maincpu", 0xc000).set_tags("fdc", "fdc:0", "fdc:1");
+ add_internal_slot(config, MSX_SLOT_RAM_MM, "ram_mm", 3, 3, 0, 4).set_total_size(0x40000).set_ramio_bits(0x80); /* 256KB Mapper RAM */
MSX_S1985(config, "s1985", 0);
@@ -6722,7 +6893,7 @@ MACHINE_CONFIG_START(msx2_state::hbf700d)
msx2_floplist(config);
msx2_cartlist(config);
-MACHINE_CONFIG_END
+}
/* MSX2 - Sony HB-F700F */
@@ -6732,26 +6903,26 @@ ROM_START (hbf700f)
ROM_LOAD ("700fext.ic6", 0x8000, 0x8000, CRC(7c8b07b1) SHA1(ecacb20ba0a9bbd25e8c0f128d64dd66f8cd8bee))
ROM_END
-MACHINE_CONFIG_START(msx2_state::hbf700f)
+void msx2_state::hbf700f(machine_config &config)
+{
msx2_pal(config);
// AY8910/YM2149?
// FDC: wd2793, 1 3.5" DSDD drive
// 2 Cartridge slots
- MCFG_MSX_LAYOUT_ROM("bios", 0, 0, 0, 2, "maincpu", 0x0000)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot1", 1, 0)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot2", 2, 0)
- MCFG_MSX_LAYOUT_ROM("ext", 3, 0, 0, 1, "maincpu", 0x8000)
- MCFG_MSX_LAYOUT_DISK1("disk", 3, 0, 1, 1, "maincpu", 0xc000)
- MCFG_MSX_LAYOUT_RAM_MM("ram_mm", 3, 3, 0x40000) /* 256KB Mapper RAM */
- MCFG_MSX_RAMIO_SET_BITS(0x80)
+ add_internal_slot(config, MSX_SLOT_ROM, "bios", 0, 0, 0, 2, "maincpu", 0x0000);
+ add_cartridge_slot<1>(config, MSX_SLOT_CARTRIDGE, "cartslot1", 1, 0, msx_cart, nullptr);
+ add_cartridge_slot<2>(config, MSX_SLOT_CARTRIDGE, "cartslot2", 2, 0, msx_cart, nullptr);
+ add_internal_slot(config, MSX_SLOT_ROM, "ext", 3, 0, 0, 1, "maincpu", 0x8000);
+ add_internal_slot_mirrored(config, MSX_SLOT_DISK1, "disk", 3, 0, 1, 2, "maincpu", 0xc000).set_tags("fdc", "fdc:0", "fdc:1");
+ add_internal_slot(config, MSX_SLOT_RAM_MM, "ram_mm", 3, 3, 0, 4).set_total_size(0x40000).set_ramio_bits(0x80); /* 256KB Mapper RAM */
msx_wd2793(config);
msx_1_35_dd_drive(config);
msx2_floplist(config);
msx2_cartlist(config);
-MACHINE_CONFIG_END
+}
/* MSX2 - Sony HB-F700P */
@@ -6761,20 +6932,20 @@ ROM_START (hbf700p)
ROM_LOAD ("700pext.ic6", 0x8000, 0x8000, CRC(63e1bffc) SHA1(496698a60432490dc1306c8cc1d4a6ded275261a))
ROM_END
-MACHINE_CONFIG_START(msx2_state::hbf700p)
+void msx2_state::hbf700p(machine_config &config)
+{
msx2_pal(config);
// YM2149 (in S-1985 MSX Engine)
// FDC: wd2793, 1 3.5" DSDD drive
// 2 Cartridge slots
// S-1985 MSX Engine
- MCFG_MSX_LAYOUT_ROM("bios", 0, 0, 0, 2, "maincpu", 0x0000)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot1", 1, 0)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot2", 2, 0)
- MCFG_MSX_LAYOUT_ROM("ext", 3, 0, 0, 1, "maincpu", 0x8000)
- MCFG_MSX_LAYOUT_DISK1("disk", 3, 0, 1, 1, "maincpu", 0xc000)
- MCFG_MSX_LAYOUT_RAM_MM("ram_mm", 3, 3, 0x40000) /* 256KB Mapper RAM */
- MCFG_MSX_RAMIO_SET_BITS(0x80)
+ add_internal_slot(config, MSX_SLOT_ROM, "bios", 0, 0, 0, 2, "maincpu", 0x0000);
+ add_cartridge_slot<1>(config, MSX_SLOT_CARTRIDGE, "cartslot1", 1, 0, msx_cart, nullptr);
+ add_cartridge_slot<2>(config, MSX_SLOT_CARTRIDGE, "cartslot2", 2, 0, msx_cart, nullptr);
+ add_internal_slot(config, MSX_SLOT_ROM, "ext", 3, 0, 0, 1, "maincpu", 0x8000);
+ add_internal_slot_mirrored(config, MSX_SLOT_DISK1, "disk", 3, 0, 1, 2, "maincpu", 0xc000).set_tags("fdc", "fdc:0", "fdc:1");
+ add_internal_slot(config, MSX_SLOT_RAM_MM, "ram_mm", 3, 3, 0, 4).set_total_size(0x40000).set_ramio_bits(0x80); /* 256KB Mapper RAM */
MSX_S1985(config, "s1985", 0);
@@ -6783,7 +6954,7 @@ MACHINE_CONFIG_START(msx2_state::hbf700p)
msx2_floplist(config);
msx2_cartlist(config);
-MACHINE_CONFIG_END
+}
/* MSX2 - Sony HB-F700S */
@@ -6793,26 +6964,26 @@ ROM_START (hbf700s)
ROM_LOAD ("700sext.ic6", 0x8000, 0x8000, CRC(28d1badf) SHA1(ae3ed88a2d7034178e08f7bdf5409f462bf67fc9))
ROM_END
-MACHINE_CONFIG_START(msx2_state::hbf700s)
+void msx2_state::hbf700s(machine_config &config)
+{
msx2_pal(config);
// AY8910/YM2149?
// FDC: wd2793, 1 3.5" DSDD drive
// 2 Cartridge slots
- MCFG_MSX_LAYOUT_ROM("bios", 0, 0, 0, 2, "maincpu", 0x0000)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot1", 1, 0)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot2", 2, 0)
- MCFG_MSX_LAYOUT_ROM("ext", 3, 0, 0, 1, "maincpu", 0x8000)
- MCFG_MSX_LAYOUT_DISK1("disk", 3, 0, 1, 1, "maincpu", 0xc000)
- MCFG_MSX_LAYOUT_RAM_MM("ram_mm", 3, 3, 0x40000) /* 256KB Mapper RAM */
- MCFG_MSX_RAMIO_SET_BITS(0x80)
+ add_internal_slot(config, MSX_SLOT_ROM, "bios", 0, 0, 0, 2, "maincpu", 0x0000);
+ add_cartridge_slot<1>(config, MSX_SLOT_CARTRIDGE, "cartslot1", 1, 0, msx_cart, nullptr);
+ add_cartridge_slot<2>(config, MSX_SLOT_CARTRIDGE, "cartslot2", 2, 0, msx_cart, nullptr);
+ add_internal_slot(config, MSX_SLOT_ROM, "ext", 3, 0, 0, 1, "maincpu", 0x8000);
+ add_internal_slot_mirrored(config, MSX_SLOT_DISK1, "disk", 3, 0, 1, 2, "maincpu", 0xc000).set_tags("fdc", "fdc:0", "fdc:1");
+ add_internal_slot(config, MSX_SLOT_RAM_MM, "ram_mm", 3, 3, 0, 4).set_total_size(0x40000).set_ramio_bits(0x80); /* 256KB Mapper RAM */
msx_wd2793_force_ready(config);
msx_1_35_dd_drive(config);
msx2_floplist(config);
msx2_cartlist(config);
-MACHINE_CONFIG_END
+}
/* MSX2 - Sony HB-F900 */
ROM_START (hbf900)
@@ -6827,27 +6998,27 @@ ROM_START (hbf900)
ROM_LOAD ("f900kfn.rom", 0, 0x20000, CRC(5a59926e) SHA1(6acaf2eeb57f65f7408235d5e07b7563229de799))
ROM_END
-MACHINE_CONFIG_START(msx2_state::hbf900)
+void msx2_state::hbf900(machine_config &config)
+{
msx2(config);
// AY8910/YM2149?
// FDC: wd2793, 2 3.5" DSDD drives
// 2 Cartridge slots
- MCFG_MSX_LAYOUT_ROM("bios", 0, 0, 0, 2, "maincpu", 0x0000)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot1", 1, 0)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot2", 2, 0)
- MCFG_MSX_LAYOUT_ROM("ext", 3, 0, 0, 1, "maincpu", 0x8000)
- MCFG_MSX_LAYOUT_DISK1("disk", 3, 0, 1, 1, "maincpu", 0xc000)
- MCFG_MSX_LAYOUT_RAM_MM("ram_mm", 3, 1, 0x40000) /* 256KB Mapper RAM */
- MCFG_MSX_RAMIO_SET_BITS(0x80)
- MCFG_MSX_LAYOUT_ROM("empty", 3, 3, 1, 1, "maincpu", 0x14000) // Empty/unknown, optional fmpac rom used to be loaded here, or should the util rom be loaded?
+ add_internal_slot(config, MSX_SLOT_ROM, "bios", 0, 0, 0, 2, "maincpu", 0x0000);
+ add_cartridge_slot<1>(config, MSX_SLOT_CARTRIDGE, "cartslot1", 1, 0, msx_cart, nullptr);
+ add_cartridge_slot<2>(config, MSX_SLOT_CARTRIDGE, "cartslot2", 2, 0, msx_cart, nullptr);
+ add_internal_slot(config, MSX_SLOT_ROM, "ext", 3, 0, 0, 1, "maincpu", 0x8000);
+ add_internal_slot_mirrored(config, MSX_SLOT_DISK1, "disk", 3, 0, 1, 2, "maincpu", 0xc000).set_tags("fdc", "fdc:0", "fdc:1");
+ add_internal_slot(config, MSX_SLOT_RAM_MM, "ram_mm", 3, 1, 0, 4).set_total_size(0x40000).set_ramio_bits(0x80); /* 256KB Mapper RAM */
+ add_internal_slot(config, MSX_SLOT_ROM, "empty", 3, 3, 1, 1, "maincpu", 0x14000); // Empty/unknown, optional fmpac rom used to be loaded here, or should the util rom be loaded?
msx_wd2793_force_ready(config);
msx_2_35_dd_drive(config);
msx2_floplist(config);
msx2_cartlist(config);
-MACHINE_CONFIG_END
+}
/* MSX2 - Sony HB-F900 (a) */
ROM_START (hbf900a)
@@ -6862,27 +7033,27 @@ ROM_START (hbf900a)
ROM_LOAD ("f900kfn.rom", 0, 0x20000, CRC(5a59926e) SHA1(6acaf2eeb57f65f7408235d5e07b7563229de799))
ROM_END
-MACHINE_CONFIG_START(msx2_state::hbf900a)
+void msx2_state::hbf900a(machine_config &config)
+{
msx2(config);
// AY8910/YM2149?
// FDC: wd2793, 2 3.5" DSDD drives
// 2 Cartridge slots
- MCFG_MSX_LAYOUT_ROM("bios", 0, 0, 0, 2, "maincpu", 0x0000)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot1", 1, 0)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot2", 2, 0)
- MCFG_MSX_LAYOUT_ROM("ext", 3, 0, 0, 1, "maincpu", 0x8000)
- MCFG_MSX_LAYOUT_DISK1("disk", 3, 0, 1, 1, "maincpu", 0xc000)
- MCFG_MSX_LAYOUT_RAM_MM("ram_mm", 3, 1, 0x40000) /* 256KB Mapper RAM */
- MCFG_MSX_RAMIO_SET_BITS(0x80)
- MCFG_MSX_LAYOUT_ROM("empty", 3, 3, 1, 1, "maincpu", 0x14000) // Empty/unknown, optional fmpac rom used to be loaded here, or should the util rom be loaded?
+ add_internal_slot(config, MSX_SLOT_ROM, "bios", 0, 0, 0, 2, "maincpu", 0x0000);
+ add_cartridge_slot<1>(config, MSX_SLOT_CARTRIDGE, "cartslot1", 1, 0, msx_cart, nullptr);
+ add_cartridge_slot<2>(config, MSX_SLOT_CARTRIDGE, "cartslot2", 2, 0, msx_cart, nullptr);
+ add_internal_slot(config, MSX_SLOT_ROM, "ext", 3, 0, 0, 1, "maincpu", 0x8000);
+ add_internal_slot_mirrored(config, MSX_SLOT_DISK1, "disk", 3, 0, 1, 2, "maincpu", 0xc000).set_tags("fdc", "fdc:0", "fdc:1");
+ add_internal_slot(config, MSX_SLOT_RAM_MM, "ram_mm", 3, 1, 0, 4).set_total_size(0x40000).set_ramio_bits(0x80); /* 256KB Mapper RAM */
+ add_internal_slot(config, MSX_SLOT_ROM, "empty", 3, 3, 1, 1, "maincpu", 0x14000); // Empty/unknown, optional fmpac rom used to be loaded here, or should the util rom be loaded?
msx_wd2793(config);
msx_2_35_dd_drive(config);
msx2_floplist(config);
msx2_cartlist(config);
-MACHINE_CONFIG_END
+}
/* MSX2 - Sony HB-F9P */
@@ -6893,25 +7064,25 @@ ROM_START (hbf9p)
ROM_LOAD ("f9pfirm2.rom.ic13", 0x10000, 0x8000, CRC(ea97069f) SHA1(2d1880d1f5a6944fcb1b198b997a3d90ecd1903d))
ROM_END
-MACHINE_CONFIG_START(msx2_state::hbf9p)
+void msx2_state::hbf9p(machine_config &config)
+{
msx2_pal(config);
// YM2149 (in S-1985 MSX Engine)
// FDC: None, 0 drives
// 2 Cartridge slots
// S-1985 MSX Engine
- MCFG_MSX_LAYOUT_ROM("bios", 0, 0, 0, 2, "maincpu", 0x0000)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot1", 1, 0)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot2", 2, 0)
- MCFG_MSX_LAYOUT_ROM("firm1", 3, 0, 0, 2, "maincpu", 0x8000)
- MCFG_MSX_LAYOUT_ROM("firm2", 3, 1, 1, 2, "maincpu", 0x10000)
- MCFG_MSX_LAYOUT_RAM_MM("ram_mm", 3, 2, 0x20000) /* 128KB Mapper RAM */
- MCFG_MSX_RAMIO_SET_BITS(0x80)
+ add_internal_slot(config, MSX_SLOT_ROM, "bios", 0, 0, 0, 2, "maincpu", 0x0000);
+ add_cartridge_slot<1>(config, MSX_SLOT_CARTRIDGE, "cartslot1", 1, 0, msx_cart, nullptr);
+ add_cartridge_slot<2>(config, MSX_SLOT_CARTRIDGE, "cartslot2", 2, 0, msx_cart, nullptr);
+ add_internal_slot(config, MSX_SLOT_ROM, "firm1", 3, 0, 0, 2, "maincpu", 0x8000);
+ add_internal_slot(config, MSX_SLOT_ROM, "firm2", 3, 1, 1, 2, "maincpu", 0x10000);
+ add_internal_slot(config, MSX_SLOT_RAM_MM, "ram_mm", 3, 2, 0, 4).set_total_size(0x20000).set_ramio_bits(0x80); /* 128KB Mapper RAM */
MSX_S1985(config, "s1985", 0);
msx2_cartlist(config);
-MACHINE_CONFIG_END
+}
/* MSX2 - Sony HB-F9P Russian */
@@ -6921,23 +7092,24 @@ ROM_START (hbf9pr)
ROM_LOAD ("f9prext.rom", 0x8000, 0x4000, CRC(8b966f50) SHA1(65253cb38ab11084f355a2d4ad78fa6c64cbe660))
ROM_END
-MACHINE_CONFIG_START(msx2_state::hbf9pr)
+void msx2_state::hbf9pr(machine_config &config)
+{
msx2_pal(config);
// YM2149 (in S-1985 MSX Engine)
// FDC: None, 0 drives
// 2 Cartridge slots
// S-1985 MSX Engine
- MCFG_MSX_LAYOUT_ROM("bios", 0, 0, 0, 2, "maincpu", 0x0000)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot1", 1, 0)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot2", 2, 0)
- MCFG_MSX_LAYOUT_ROM("ext", 3, 0, 0, 1, "maincpu", 0x8000)
- MCFG_MSX_LAYOUT_RAM_MM("ram_mm", 3, 2, 0x20000) /* 128KB Mapper RAM */
+ add_internal_slot(config, MSX_SLOT_ROM, "bios", 0, 0, 0, 2, "maincpu", 0x0000);
+ add_cartridge_slot<1>(config, MSX_SLOT_CARTRIDGE, "cartslot1", 1, 0, msx_cart, nullptr);
+ add_cartridge_slot<2>(config, MSX_SLOT_CARTRIDGE, "cartslot2", 2, 0, msx_cart, nullptr);
+ add_internal_slot(config, MSX_SLOT_ROM, "ext", 3, 0, 0, 1, "maincpu", 0x8000);
+ add_internal_slot(config, MSX_SLOT_RAM_MM, "ram_mm", 3, 2, 0, 4).set_total_size(0x20000); /* 128KB Mapper RAM */
MSX_S1985(config, "s1985", 0);
msx2_cartlist(config);
-MACHINE_CONFIG_END
+}
/* MSX2 - Sony HB-F9S */
@@ -6948,25 +7120,25 @@ ROM_START (hbf9s)
ROM_LOAD ("f9sfirm2.ic13", 0x10000, 0x8000, CRC(ea97069f) SHA1(2d1880d1f5a6944fcb1b198b997a3d90ecd1903d))
ROM_END
-MACHINE_CONFIG_START(msx2_state::hbf9s)
+void msx2_state::hbf9s(machine_config &config)
+{
msx2_pal(config);
// YM2149 (in S-1985 MSX Engine)
// FDC: None, 0 drives
// 2 Cartridge slots
// S-1985 MSX Engine
- MCFG_MSX_LAYOUT_ROM("bios", 0, 0, 0, 2, "maincpu", 0x0000)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot1", 1, 0)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot2", 2, 0)
- MCFG_MSX_LAYOUT_ROM("firm1", 3, 0, 0, 2, "maincpu", 0x8000)
- MCFG_MSX_LAYOUT_ROM("firm2", 3, 1, 1, 2, "maincpu", 0x10000)
- MCFG_MSX_LAYOUT_RAM_MM("ram_mm", 3, 2, 0x20000) /* 128KB Mapper RAM */
- MCFG_MSX_RAMIO_SET_BITS(0x80)
+ add_internal_slot(config, MSX_SLOT_ROM, "bios", 0, 0, 0, 2, "maincpu", 0x0000);
+ add_cartridge_slot<1>(config, MSX_SLOT_CARTRIDGE, "cartslot1", 1, 0, msx_cart, nullptr);
+ add_cartridge_slot<2>(config, MSX_SLOT_CARTRIDGE, "cartslot2", 2, 0, msx_cart, nullptr);
+ add_internal_slot(config, MSX_SLOT_ROM, "firm1", 3, 0, 0, 2, "maincpu", 0x8000);
+ add_internal_slot(config, MSX_SLOT_ROM, "firm2", 3, 1, 1, 2, "maincpu", 0x10000);
+ add_internal_slot(config, MSX_SLOT_RAM_MM, "ram_mm", 3, 2, 0, 4).set_total_size(0x20000).set_ramio_bits(0x80); /* 128KB Mapper RAM */
MSX_S1985(config, "s1985", 0);
msx2_cartlist(config);
-MACHINE_CONFIG_END
+}
/* MSX2 - Sony HB-G900AP */
@@ -6985,28 +7157,28 @@ ROM_START (hbg900ap)
ROM_LOAD ("g900util.rom", 0x14000, 0x4000, CRC(d0417c20) SHA1(8779b004e7605a3c419825f0373a5d8fa84e1d5b))
ROM_END
-MACHINE_CONFIG_START(msx2_state::hbg900ap)
+void msx2_state::hbg900ap(machine_config &config)
+{
msx2_pal(config);
// AY8910/YM2149?
// FDC: wd2793, 1 3.5" DSDD drive
// 2 Cartridge slots?
- MCFG_MSX_LAYOUT_ROM("bios", 0, 0, 0, 2, "maincpu", 0x0000)
- MCFG_MSX_LAYOUT_ROM("ext", 0, 1, 0, 1, "maincpu", 0x8000)
- MCFG_MSX_LAYOUT_DISK1("disk", 0, 1, 1, 1, "maincpu", 0xc000)
+ add_internal_slot(config, MSX_SLOT_ROM, "bios", 0, 0, 0, 2, "maincpu", 0x0000);
+ add_internal_slot(config, MSX_SLOT_ROM, "ext", 0, 1, 0, 1, "maincpu", 0x8000);
+ add_internal_slot_mirrored(config, MSX_SLOT_DISK1, "disk", 0, 1, 1, 2, "maincpu", 0xc000).set_tags("fdc", "fdc:0", "fdc:1");
/* MSX_LAYOUT_SLOT ("rs232c", 0, 2, 1, 1, "maincpu", 0x10000) */ /* RS232C must be emulated */
- MCFG_MSX_LAYOUT_ROM("util", 0, 3, 1, 1, "maincpu", 0x14000)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot1", 1, 0)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot2", 2, 0)
- MCFG_MSX_LAYOUT_RAM_MM("ram_mm", 3, 0, 0x80000) /* 512KB Mapper RAM */
- MCFG_MSX_RAMIO_SET_BITS(0x80)
+ add_internal_slot(config, MSX_SLOT_ROM, "util", 0, 3, 1, 1, "maincpu", 0x14000);
+ add_cartridge_slot<1>(config, MSX_SLOT_CARTRIDGE, "cartslot1", 1, 0, msx_cart, nullptr);
+ add_cartridge_slot<2>(config, MSX_SLOT_CARTRIDGE, "cartslot2", 2, 0, msx_cart, nullptr);
+ add_internal_slot(config, MSX_SLOT_RAM_MM, "ram_mm", 3, 0, 0, 4).set_total_size(0x80000).set_ramio_bits(0x80); /* 512KB Mapper RAM */
msx_wd2793(config);
msx_1_35_dd_drive(config);
msx2_floplist(config);
msx2_cartlist(config);
-MACHINE_CONFIG_END
+}
/* MSX2 - Sony HB-G900P - 3x 32KB ROMs */
@@ -7019,28 +7191,28 @@ ROM_START (hbg900p)
ROM_LOAD ("g900util.rom", 0x14000, 0x4000, CRC(d0417c20) SHA1(8779b004e7605a3c419825f0373a5d8fa84e1d5b))
ROM_END
-MACHINE_CONFIG_START(msx2_state::hbg900p)
+void msx2_state::hbg900p(machine_config &config)
+{
msx2_pal(config);
// AY8910/YM2149?
// FDC: wd2793, 1 3.5" DSDD drive
// 2 Cartridge slots?
- MCFG_MSX_LAYOUT_ROM("bios", 0, 0, 0, 2, "maincpu", 0x0000)
- MCFG_MSX_LAYOUT_ROM("ext", 0, 1, 0, 1, "maincpu", 0x8000)
- MCFG_MSX_LAYOUT_DISK1("disk", 0, 1, 1, 1, "maincpu", 0xc000)
+ add_internal_slot(config, MSX_SLOT_ROM, "bios", 0, 0, 0, 2, "maincpu", 0x0000);
+ add_internal_slot(config, MSX_SLOT_ROM, "ext", 0, 1, 0, 1, "maincpu", 0x8000);
+ add_internal_slot_mirrored(config, MSX_SLOT_DISK1, "disk", 0, 1, 1, 2, "maincpu", 0xc000).set_tags("fdc", "fdc:0", "fdc:1");
/* MSX_LAYOUT_SLOT ("rs232c", 0, 2, 1, 1, "maincpu", 0x10000) */ /* RS232C must be emulated */
- MCFG_MSX_LAYOUT_ROM("util", 0, 3, 1, 1, "maincpu", 0x14000)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot1", 1, 0)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot2", 2, 0)
- MCFG_MSX_LAYOUT_RAM_MM("ram_mm", 3, 0, 0x10000) /* 64KB Mapper RAM */
- MCFG_MSX_RAMIO_SET_BITS(0x80)
+ add_internal_slot(config, MSX_SLOT_ROM, "util", 0, 3, 1, 1, "maincpu", 0x14000);
+ add_cartridge_slot<1>(config, MSX_SLOT_CARTRIDGE, "cartslot1", 1, 0, msx_cart, nullptr);
+ add_cartridge_slot<2>(config, MSX_SLOT_CARTRIDGE, "cartslot2", 2, 0, msx_cart, nullptr);
+ add_internal_slot(config, MSX_SLOT_RAM_MM, "ram_mm", 3, 0, 0, 4).set_total_size(0x10000).set_ramio_bits(0x80); /* 64KB Mapper RAM */
msx_wd2793(config);
msx_1_35_dd_drive(config);
msx2_floplist(config);
msx2_cartlist(config);
-MACHINE_CONFIG_END
+}
/* MSX2 - Talent TPC-310 */
ROM_START (tpc310)
@@ -7052,21 +7224,21 @@ ROM_START (tpc310)
ROM_LOAD ("tpc310acc.rom", 0x14000, 0x8000, CRC(4fb8fab3) SHA1(cdeb0ed8adecaaadb78d5a5364fd603238591685))
ROM_END
-MACHINE_CONFIG_START(msx2_state::tpc310)
+void msx2_state::tpc310(machine_config &config)
+{
msx2_pal(config);
// YM2149 (in S-1985 MSX Engine)
// FDC: mb8877a?, 1 3.5" DSDD drive
// 1 Cartridge slot (slot 2)
// S-1985 MSX Engine
- MCFG_MSX_LAYOUT_ROM("bios", 0, 0, 0, 2, "maincpu", 0x0000)
- MCFG_MSX_LAYOUT_RAM_MM("ram_mm", 1, 0, 0x20000) /* 128KB Mapper RAM */
- MCFG_MSX_RAMIO_SET_BITS(0x80)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot", 2, 0)
- MCFG_MSX_LAYOUT_ROM("ext", 3, 0, 0, 1, "maincpu", 0x8000)
- MCFG_MSX_LAYOUT_ROM("turbo", 3, 0, 1, 1, "maincpu", 0x10000)
- MCFG_MSX_LAYOUT_ROM("acc", 3, 1, 1, 2, "maincpu", 0x14000)
- MCFG_MSX_LAYOUT_DISK2("disk", 3, 2, 1, 1, "maincpu", 0xc000)
+ add_internal_slot(config, MSX_SLOT_ROM, "bios", 0, 0, 0, 2, "maincpu", 0x0000);
+ add_internal_slot(config, MSX_SLOT_RAM_MM, "ram_mm", 1, 0, 0, 4).set_total_size(0x20000).set_ramio_bits(0x80); /* 128KB Mapper RAM */
+ add_cartridge_slot<1>(config, MSX_SLOT_CARTRIDGE, "cartslot", 2, 0, msx_cart, nullptr);
+ add_internal_slot(config, MSX_SLOT_ROM, "ext", 3, 0, 0, 1, "maincpu", 0x8000);
+ add_internal_slot(config, MSX_SLOT_ROM, "turbo", 3, 0, 1, 1, "maincpu", 0x10000);
+ add_internal_slot(config, MSX_SLOT_ROM, "acc", 3, 1, 1, 2, "maincpu", 0x14000);
+ add_internal_slot_mirrored(config, MSX_SLOT_DISK2, "disk", 3, 2, 1, 2, "maincpu", 0xc000).set_tags("fdc", "fdc:0", "fdc:1");
MSX_S1985(config, "s1985", 0);
@@ -7075,7 +7247,7 @@ MACHINE_CONFIG_START(msx2_state::tpc310)
msx2_floplist(config);
msx2_cartlist(config);
-MACHINE_CONFIG_END
+}
/* MSX2 - Talent TPP-311 */
@@ -7086,20 +7258,21 @@ ROM_START (tpp311)
ROM_LOAD ("311logo.rom", 0xc000, 0x8000, CRC(0e6ecb9f) SHA1(e45ddc5bf1a1e63756d11fb43fc50276ca35cab0))
ROM_END
-MACHINE_CONFIG_START(msx2_state::tpp311)
+void msx2_state::tpp311(machine_config &config)
+{
msx2_pal(config);
// AY8910/YM2149?
// FDC: None, 0 drives
// 0 Cartridge slots?
// 64KB VRAM
- MCFG_MSX_LAYOUT_ROM("bios", 0, 0, 0, 2, "maincpu", 0x0000)
- MCFG_MSX_LAYOUT_RAM_MM("ram_mm", 1, 0, 0x10000) /* 64KB?? Mapper RAM */
- MCFG_MSX_LAYOUT_ROM("logo", 2, 0, 1, 2, "maincpu", 0xc000)
- MCFG_MSX_LAYOUT_ROM("ext", 3, 0, 0, 1, "maincpu", 0x8000)
+ add_internal_slot(config, MSX_SLOT_ROM, "bios", 0, 0, 0, 2, "maincpu", 0x0000);
+ add_internal_slot(config, MSX_SLOT_RAM_MM, "ram_mm", 1, 0, 0, 4).set_total_size(0x10000); /* 64KB?? Mapper RAM */
+ add_internal_slot(config, MSX_SLOT_ROM, "logo", 2, 0, 1, 2, "maincpu", 0xc000);
+ add_internal_slot(config, MSX_SLOT_ROM, "ext", 3, 0, 0, 1, "maincpu", 0x8000);
msx2_64kb_vram(config);
-MACHINE_CONFIG_END
+}
/* MSX2 - Talent TPS-312 */
@@ -7111,26 +7284,27 @@ ROM_START (tps312)
ROM_LOAD ("312write.rom", 0x14000, 0x4000, CRC(63c6992f) SHA1(93682f5baba7697c40088e26f99ee065c78e83b8))
ROM_END
-MACHINE_CONFIG_START(msx2_state::tps312)
+void msx2_state::tps312(machine_config &config)
+{
msx2_pal(config);
// AY8910/YM2149?
// FDC: None, 0 drives
// 2 Cartridge slots?
// 64KB VRAM
- MCFG_MSX_LAYOUT_ROM("bios", 0, 0, 0, 2, "maincpu", 0x0000)
- MCFG_MSX_LAYOUT_RAM_MM("ram_mm", 1, 0, 0x20000) /* 128KB?? Mapper RAM */
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot1", 2, 0)
- MCFG_MSX_LAYOUT_ROM("ext", 3, 0, 0, 1, "maincpu", 0x8000)
- MCFG_MSX_LAYOUT_ROM("write", 3, 1, 1, 1, "maincpu", 0x14000)
- MCFG_MSX_LAYOUT_ROM("plan", 3, 2, 1, 1, "maincpu", 0xc000)
- MCFG_MSX_LAYOUT_ROM("planlow", 3, 2, 0, 1, "maincpu", 0x10000)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot2", 3, 3)
+ add_internal_slot(config, MSX_SLOT_ROM, "bios", 0, 0, 0, 2, "maincpu", 0x0000);
+ add_internal_slot(config, MSX_SLOT_RAM_MM, "ram_mm", 1, 0, 0, 4).set_total_size(0x20000); /* 128KB?? Mapper RAM */
+ add_cartridge_slot<1>(config, MSX_SLOT_CARTRIDGE, "cartslot1", 2, 0, msx_cart, nullptr);
+ add_internal_slot(config, MSX_SLOT_ROM, "ext", 3, 0, 0, 1, "maincpu", 0x8000);
+ add_internal_slot(config, MSX_SLOT_ROM, "write", 3, 1, 1, 1, "maincpu", 0x14000);
+ add_internal_slot(config, MSX_SLOT_ROM, "plan", 3, 2, 1, 1, "maincpu", 0xc000);
+ add_internal_slot(config, MSX_SLOT_ROM, "planlow", 3, 2, 0, 1, "maincpu", 0x10000);
+ add_cartridge_slot<2>(config, MSX_SLOT_CARTRIDGE, "cartslot2", 3, 3, msx_cart, nullptr);
msx2_cartlist(config);
msx2_64kb_vram(config);
-MACHINE_CONFIG_END
+}
/* MSX2 - Toshiba HX-23 */
@@ -7141,25 +7315,26 @@ ROM_START (hx23)
ROM_LOAD ("hx23word.rom", 0xc000, 0x8000, CRC(39b3e1c0) SHA1(9f7cfa932bd7dfd0d9ecaadc51655fb557c2e125))
ROM_END
-MACHINE_CONFIG_START(msx2_state::hx23)
+void msx2_state::hx23(machine_config &config)
+{
msx2_pal(config);
// AY8910/YM2149?
// FDC: None, 0 drives
// 2 Cartridge slots?
// 64KB VRAM
- MCFG_MSX_LAYOUT_ROM("bios", 0, 0, 0, 2, "maincpu", 0x0000)
- MCFG_MSX_LAYOUT_RAM("ram1", 0, 0, 2, 2) /* 32KB RAM */
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot1", 1, 0)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot2", 2, 0)
- MCFG_MSX_LAYOUT_RAM("ram2", 3, 0, 0, 2) /* 32KB RAM */
- MCFG_MSX_LAYOUT_ROM("ext", 3, 1, 0, 1, "maincpu", 0x8000)
- MCFG_MSX_LAYOUT_ROM("word", 3, 3, 1, 2, "maincpu", 0xc000)
+ add_internal_slot(config, MSX_SLOT_ROM, "bios", 0, 0, 0, 2, "maincpu", 0x0000);
+ add_internal_slot(config, MSX_SLOT_RAM, "ram1", 0, 0, 2, 2); /* 32KB RAM */
+ add_cartridge_slot<1>(config, MSX_SLOT_CARTRIDGE, "cartslot1", 1, 0, msx_cart, nullptr);
+ add_cartridge_slot<2>(config, MSX_SLOT_CARTRIDGE, "cartslot2", 2, 0, msx_cart, nullptr);
+ add_internal_slot(config, MSX_SLOT_RAM, "ram2", 3, 0, 0, 2); /* 32KB RAM */
+ add_internal_slot(config, MSX_SLOT_ROM, "ext", 3, 1, 0, 1, "maincpu", 0x8000);
+ add_internal_slot(config, MSX_SLOT_ROM, "word", 3, 3, 1, 2, "maincpu", 0xc000);
msx2_cartlist(config);
msx2_64kb_vram(config);
-MACHINE_CONFIG_END
+}
/* MSX2 - Toshiba HX-23F */
@@ -7170,22 +7345,22 @@ ROM_START (hx23f)
ROM_LOAD ("hx23fword.rom", 0xc000, 0x8000, CRC(39b3e1c0) SHA1(9f7cfa932bd7dfd0d9ecaadc51655fb557c2e125))
ROM_END
-MACHINE_CONFIG_START(msx2_state::hx23f)
+void msx2_state::hx23f(machine_config &config)
+{
msx2_pal(config);
// AY8910/YM2149?
// FDC: None, 0 drives
// 2 Cartridge slots?
- MCFG_MSX_LAYOUT_ROM("bios", 0, 0, 0, 2, "maincpu", 0x0000)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot1", 1, 0)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot2", 2, 0)
- MCFG_MSX_LAYOUT_RAM_MM("ram_mm", 3, 0, 0x20000) /* 128KB Mapper RAM */
- MCFG_MSX_RAMIO_SET_BITS(0x80)
- MCFG_MSX_LAYOUT_ROM("ext", 3, 1, 0, 1, "maincpu", 0x8000)
- MCFG_MSX_LAYOUT_ROM("word", 3, 3, 1, 2, "maincpu", 0xc000)
+ add_internal_slot(config, MSX_SLOT_ROM, "bios", 0, 0, 0, 2, "maincpu", 0x0000);
+ add_cartridge_slot<1>(config, MSX_SLOT_CARTRIDGE, "cartslot1", 1, 0, msx_cart, nullptr);
+ add_cartridge_slot<2>(config, MSX_SLOT_CARTRIDGE, "cartslot2", 2, 0, msx_cart, nullptr);
+ add_internal_slot(config, MSX_SLOT_RAM_MM, "ram_mm", 3, 0, 0, 4).set_total_size(0x20000).set_ramio_bits(0x80); /* 128KB Mapper RAM */
+ add_internal_slot(config, MSX_SLOT_ROM, "ext", 3, 1, 0, 1, "maincpu", 0x8000);
+ add_internal_slot(config, MSX_SLOT_ROM, "word", 3, 3, 1, 2, "maincpu", 0xc000);
msx2_cartlist(config);
-MACHINE_CONFIG_END
+}
/* MSX2 - Toshiba HX-23I */
@@ -7196,24 +7371,25 @@ ROM_START (hx23i)
ROM_LOAD ("hx23iword.rom", 0xc000, 0x8000, CRC(d50db5b4) SHA1(64cf27a6be1393b1da9f8d5d43df617c9f22fbd2))
ROM_END
-MACHINE_CONFIG_START(msx2_state::hx23i)
+void msx2_state::hx23i(machine_config &config)
+{
msx2_pal(config);
// YM2149 (in S-1985)
// FDC: None, 0 drives
// 2 Cartridge slots?
// S-1985 MSX Engine
- MCFG_MSX_LAYOUT_ROM("bios", 0, 0, 0, 2, "maincpu", 0x0000)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot1", 1, 0)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot2", 2, 0)
- MCFG_MSX_LAYOUT_RAM_MM("ram_mm", 3, 0, 0x20000) /* 128KB Mapper RAM */
- MCFG_MSX_LAYOUT_ROM("ext", 3, 1, 0, 1, "maincpu", 0x8000)
- MCFG_MSX_LAYOUT_ROM("word", 3, 3, 1, 2, "maincpu", 0xc000)
+ add_internal_slot(config, MSX_SLOT_ROM, "bios", 0, 0, 0, 2, "maincpu", 0x0000);
+ add_cartridge_slot<1>(config, MSX_SLOT_CARTRIDGE, "cartslot1", 1, 0, msx_cart, nullptr);
+ add_cartridge_slot<2>(config, MSX_SLOT_CARTRIDGE, "cartslot2", 2, 0, msx_cart, nullptr);
+ add_internal_slot(config, MSX_SLOT_RAM_MM, "ram_mm", 3, 0, 0, 4).set_total_size(0x20000); /* 128KB Mapper RAM */
+ add_internal_slot(config, MSX_SLOT_ROM, "ext", 3, 1, 0, 1, "maincpu", 0x8000);
+ add_internal_slot(config, MSX_SLOT_ROM, "word", 3, 3, 1, 2, "maincpu", 0xc000);
MSX_S1985(config, "s1985", 0);
msx2_cartlist(config);
-MACHINE_CONFIG_END
+}
/* MSX@ - Toshiba HX-33 */
@@ -7227,7 +7403,8 @@ ROM_START (hx33)
ROM_LOAD ("hx33kfn.rom", 0x0000, 0x20000, CRC(d23d4d2d) SHA1(db03211b7db46899df41db2b1dfbec972109a967))
ROM_END
-MACHINE_CONFIG_START(msx2_state::hx33)
+void msx2_state::hx33(machine_config &config)
+{
msx2(config);
// YM2149 (in S-1985)
// FDC: None, 0, drives
@@ -7235,19 +7412,19 @@ MACHINE_CONFIG_START(msx2_state::hx33)
// RS232C builtin?
// S-1985 MSX Engine
- MCFG_MSX_LAYOUT_ROM("bios", 0, 0, 0, 2, "maincpu", 0x0000)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot1", 1, 0)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot2", 2, 0)
- MCFG_MSX_LAYOUT_RAM_MM("ram_mm", 3, 0, 0x10000) // 64KB Mapper RAM
- MCFG_MSX_LAYOUT_ROM("ext", 3, 1, 0, 1, "maincpu", 0x8000)
- MCFG_MSX_LAYOUT_ROM("firm", 3, 2, 1, 2, "maincpu", 0xc000)
+ add_internal_slot(config, MSX_SLOT_ROM, "bios", 0, 0, 0, 2, "maincpu", 0x0000);
+ add_cartridge_slot<1>(config, MSX_SLOT_CARTRIDGE, "cartslot1", 1, 0, msx_cart, nullptr);
+ add_cartridge_slot<2>(config, MSX_SLOT_CARTRIDGE, "cartslot2", 2, 0, msx_cart, nullptr);
+ add_internal_slot(config, MSX_SLOT_RAM_MM, "ram_mm", 3, 0, 0, 4).set_total_size(0x10000); // 64KB Mapper RAM
+ add_internal_slot(config, MSX_SLOT_ROM, "ext", 3, 1, 0, 1, "maincpu", 0x8000);
+ add_internal_slot(config, MSX_SLOT_ROM, "firm", 3, 2, 1, 2, "maincpu", 0xc000);
MSX_S1985(config, "s1985", 0);
msx2_64kb_vram(config);
msx2_cartlist(config);
-MACHINE_CONFIG_END
+}
/* MSX@ - Toshiba HX-34 */
@@ -7263,7 +7440,8 @@ ROM_REGION (0x18000, "maincpu", 0)
ROM_LOAD ("hx34kfn.rom", 0x0000, 0x20000, CRC(d23d4d2d) SHA1(db03211b7db46899df41db2b1dfbec972109a967))
ROM_END
-MACHINE_CONFIG_START(msx2_state::hx34)
+void msx2_state::hx34(machine_config &config)
+{
msx2(config);
// YM2149 (in S-1985)
// FDC: wd2793??, 1 3.5" DSDD drive
@@ -7271,13 +7449,13 @@ MACHINE_CONFIG_START(msx2_state::hx34)
// RS232C builtin?
// S-1985 MSX Engine
- MCFG_MSX_LAYOUT_ROM("bios", 0, 0, 0, 2, "maincpu", 0x0000)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot1", 1, 0)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot2", 2, 0)
- MCFG_MSX_LAYOUT_RAM_MM("ram_mm", 3, 0, 0x10000) // 64KB Mapper RAM
- MCFG_MSX_LAYOUT_ROM("ext", 3, 1, 0, 1, "maincpu", 0x8000)
- MCFG_MSX_LAYOUT_DISK6("disk", 3, 2, 1, 1, "maincpu", 0xc000)
- MCFG_MSX_LAYOUT_ROM("firm", 3, 3, 1, 2, "maincpu", 0x10000)
+ add_internal_slot(config, MSX_SLOT_ROM, "bios", 0, 0, 0, 2, "maincpu", 0x0000);
+ add_cartridge_slot<1>(config, MSX_SLOT_CARTRIDGE, "cartslot1", 1, 0, msx_cart, nullptr);
+ add_cartridge_slot<2>(config, MSX_SLOT_CARTRIDGE, "cartslot2", 2, 0, msx_cart, nullptr);
+ add_internal_slot(config, MSX_SLOT_RAM_MM, "ram_mm", 3, 0, 0, 4).set_total_size(0x10000); // 64KB Mapper RAM
+ add_internal_slot(config, MSX_SLOT_ROM, "ext", 3, 1, 0, 1, "maincpu", 0x8000);
+ add_internal_slot(config, MSX_SLOT_DISK6, "disk", 3, 2, 1, 1, "maincpu", 0xc000).set_tags("fdc", "fdc:0", "fdc:1");
+ add_internal_slot(config, MSX_SLOT_ROM, "firm", 3, 3, 1, 2, "maincpu", 0x10000);
MSX_S1985(config, "s1985", 0);
@@ -7286,7 +7464,7 @@ MACHINE_CONFIG_START(msx2_state::hx34)
msx2_floplist(config);
msx2_cartlist(config);
-MACHINE_CONFIG_END
+}
/* MSX@ - Toshiba HX-34I */
@@ -7299,7 +7477,8 @@ ROM_START (hx34i)
ROM_LOAD ("hx34ifirm.rom", 0x10000, 0x8000, CRC(f9e29c66) SHA1(3289336b2c12161fd926a7e5ce865770ae7038af))
ROM_END
-MACHINE_CONFIG_START(msx2_state::hx34i)
+void msx2_state::hx34i(machine_config &config)
+{
msx2_pal(config);
// YM2149 (in S-1985)
// FDC: wd2793??, 1 3.5" DSDD drive
@@ -7307,13 +7486,13 @@ MACHINE_CONFIG_START(msx2_state::hx34i)
// RS232C builtin?
// S-1985 MSX Engine
- MCFG_MSX_LAYOUT_ROM("bios", 0, 0, 0, 2, "maincpu", 0x0000)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot1", 1, 0)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot2", 2, 0)
- MCFG_MSX_LAYOUT_RAM_MM("ram_mm", 3, 0, 0x10000) // 64KB Mapper RAM
- MCFG_MSX_LAYOUT_ROM("ext", 3, 1, 0, 1, "maincpu", 0x8000)
- MCFG_MSX_LAYOUT_DISK6("disk", 3, 2, 1, 1, "maincpu", 0xc000)
- MCFG_MSX_LAYOUT_ROM("firm", 3, 3, 1, 2, "maincpu", 0x10000)
+ add_internal_slot(config, MSX_SLOT_ROM, "bios", 0, 0, 0, 2, "maincpu", 0x0000);
+ add_cartridge_slot<1>(config, MSX_SLOT_CARTRIDGE, "cartslot1", 1, 0, msx_cart, nullptr);
+ add_cartridge_slot<2>(config, MSX_SLOT_CARTRIDGE, "cartslot2", 2, 0, msx_cart, nullptr);
+ add_internal_slot(config, MSX_SLOT_RAM_MM, "ram_mm", 3, 0, 0, 4).set_total_size(0x10000); // 64KB Mapper RAM
+ add_internal_slot(config, MSX_SLOT_ROM, "ext", 3, 1, 0, 1, "maincpu", 0x8000);
+ add_internal_slot(config, MSX_SLOT_DISK6, "disk", 3, 2, 1, 1, "maincpu", 0xc000).set_tags("fdc", "fdc:0", "fdc:1");
+ add_internal_slot(config, MSX_SLOT_ROM, "firm", 3, 3, 1, 2, "maincpu", 0x10000);
MSX_S1985(config, "s1985", 0);
@@ -7322,7 +7501,7 @@ MACHINE_CONFIG_START(msx2_state::hx34i)
msx2_floplist(config);
msx2_cartlist(config);
-MACHINE_CONFIG_END
+}
/* MSX2 - Toshiba FS-TM1 */
@@ -7334,25 +7513,26 @@ ROM_START (fstm1)
ROM_LOAD ("fstm1desk2.rom", 0x14000, 0x8000, CRC(304820ea) SHA1(ff6e07d3976b0874164fae680ae028d598752049))
ROM_END
-MACHINE_CONFIG_START(msx2_state::fstm1)
+void msx2_state::fstm1(machine_config &config)
+{
msx2_pal(config);
// YM2149 (in S-1985)
// FDC: None, 0 drives
// 2 Cartridge slots
// S-1985 MSX Engine
- MCFG_MSX_LAYOUT_ROM("bios", 0, 0, 0, 2, "maincpu", 0x0000)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot1", 1, 0)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot2", 2, 0)
- MCFG_MSX_LAYOUT_RAM_MM("ram_mm", 3, 0, 0x10000) // 64KB Mapper RAM
- MCFG_MSX_LAYOUT_ROM("ext", 3, 1, 0, 1, "maincpu", 0x8000)
- MCFG_MSX_LAYOUT_ROM("desk1", 3, 2, 1, 2, "maincpu", 0xc000)
- MCFG_MSX_LAYOUT_ROM("desk2", 3, 3, 1, 2, "maincpu", 0x14000)
+ add_internal_slot(config, MSX_SLOT_ROM, "bios", 0, 0, 0, 2, "maincpu", 0x0000);
+ add_cartridge_slot<1>(config, MSX_SLOT_CARTRIDGE, "cartslot1", 1, 0, msx_cart, nullptr);
+ add_cartridge_slot<2>(config, MSX_SLOT_CARTRIDGE, "cartslot2", 2, 0, msx_cart, nullptr);
+ add_internal_slot(config, MSX_SLOT_RAM_MM, "ram_mm", 3, 0, 0, 4).set_total_size(0x10000); // 64KB Mapper RAM
+ add_internal_slot(config, MSX_SLOT_ROM, "ext", 3, 1, 0, 1, "maincpu", 0x8000);
+ add_internal_slot(config, MSX_SLOT_ROM, "desk1", 3, 2, 1, 2, "maincpu", 0xc000);
+ add_internal_slot(config, MSX_SLOT_ROM, "desk2", 3, 3, 1, 2, "maincpu", 0x14000);
MSX_S1985(config, "s1985", 0);
msx2_cartlist(config);
-MACHINE_CONFIG_END
+}
/* MSX2 - Victor HC-90 */
@@ -7367,7 +7547,8 @@ ROM_START (victhc90)
ROM_LOAD ("hc90kfn.rom", 0x0000, 0x20000, CRC(d23d4d2d) SHA1(db03211b7db46899df41db2b1dfbec972109a967))
ROM_END
-MACHINE_CONFIG_START(msx2_state::victhc90)
+void msx2_state::victhc90(machine_config &config)
+{
msx2(config);
// YM2149 (in S-1985)
// FDC: wd2793?, 1 3.5" DSDD drive
@@ -7376,12 +7557,12 @@ MACHINE_CONFIG_START(msx2_state::victhc90)
// 1 Cartridge slot (slot 1 or 2?)
// S-1985 MSX Engine
- MCFG_MSX_LAYOUT_ROM("bios", 0, 0, 0, 2, "maincpu", 0x0000)
- MCFG_MSX_LAYOUT_ROM("ext", 0, 1, 0, 1, "maincpu", 0x8000)
- MCFG_MSX_LAYOUT_ROM("firm", 0, 1, 1, 1, "maincpu", 0x10000)
- MCFG_MSX_LAYOUT_RAM_MM("ram_mm", 0, 2, 0x10000) // 64KB Mapper RAM
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot", 1, 0)
- MCFG_MSX_LAYOUT_DISK1("disk", 3, 0, 1, 1, "maincpu", 0xc000)
+ add_internal_slot(config, MSX_SLOT_ROM, "bios", 0, 0, 0, 2, "maincpu", 0x0000);
+ add_internal_slot(config, MSX_SLOT_ROM, "ext", 0, 1, 0, 1, "maincpu", 0x8000);
+ add_internal_slot(config, MSX_SLOT_ROM, "firm", 0, 1, 1, 1, "maincpu", 0x10000);
+ add_internal_slot(config, MSX_SLOT_RAM_MM, "ram_mm", 0, 2, 0, 4).set_total_size(0x10000); // 64KB Mapper RAM
+ add_cartridge_slot<1>(config, MSX_SLOT_CARTRIDGE, "cartslot", 1, 0, msx_cart, nullptr);
+ add_internal_slot_mirrored(config, MSX_SLOT_DISK1, "disk", 3, 0, 1, 2, "maincpu", 0xc000).set_tags("fdc", "fdc:0", "fdc:1");
MSX_S1985(config, "s1985", 0);
@@ -7390,7 +7571,7 @@ MACHINE_CONFIG_START(msx2_state::victhc90)
msx2_floplist(config);
msx2_cartlist(config);
-MACHINE_CONFIG_END
+}
/* MSX2 - Victor HC-95 */
@@ -7405,7 +7586,8 @@ ROM_START (victhc95)
ROM_LOAD ("hc95kfn.rom", 0x0000, 0x20000, CRC(d23d4d2d) SHA1(db03211b7db46899df41db2b1dfbec972109a967))
ROM_END
-MACHINE_CONFIG_START(msx2_state::victhc95)
+void msx2_state::victhc95(machine_config &config)
+{
msx2(config);
// YM2149 (in S-1985)
// FDC: wd2793?, 2 3.5" DSDD drive
@@ -7414,12 +7596,12 @@ MACHINE_CONFIG_START(msx2_state::victhc95)
// 1 Cartridge slot (slot 1 or 2?)
// S-1985 MSX Engine
- MCFG_MSX_LAYOUT_ROM("bios", 0, 0, 0, 2, "maincpu", 0x0000)
- MCFG_MSX_LAYOUT_ROM("ext", 0, 1, 0, 1, "maincpu", 0x8000)
- MCFG_MSX_LAYOUT_ROM("firm", 0, 1, 1, 1, "maincpu", 0x10000)
- MCFG_MSX_LAYOUT_RAM_MM("ram_mm", 0, 2, 0x10000) // 64KB Mapper RAM
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot", 1, 0)
- MCFG_MSX_LAYOUT_DISK1("disk", 3, 0, 1, 1, "maincpu", 0xc000)
+ add_internal_slot(config, MSX_SLOT_ROM, "bios", 0, 0, 0, 2, "maincpu", 0x0000);
+ add_internal_slot(config, MSX_SLOT_ROM, "ext", 0, 1, 0, 1, "maincpu", 0x8000);
+ add_internal_slot(config, MSX_SLOT_ROM, "firm", 0, 1, 1, 1, "maincpu", 0x10000);
+ add_internal_slot(config, MSX_SLOT_RAM_MM, "ram_mm", 0, 2, 0, 4).set_total_size(0x10000); // 64KB Mapper RAM
+ add_cartridge_slot<1>(config, MSX_SLOT_CARTRIDGE, "cartslot", 1, 0, msx_cart, nullptr);
+ add_internal_slot_mirrored(config, MSX_SLOT_DISK1, "disk", 3, 0, 1, 2, "maincpu", 0xc000).set_tags("fdc", "fdc:0", "fdc:1");
MSX_S1985(config, "s1985", 0);
@@ -7428,7 +7610,7 @@ MACHINE_CONFIG_START(msx2_state::victhc95)
msx2_floplist(config);
msx2_cartlist(config);
-MACHINE_CONFIG_END
+}
/* MSX2 - Victor HC-95A */
@@ -7443,7 +7625,8 @@ ROM_START (victhc95a)
ROM_LOAD ("hc95akfn.rom", 0x0000, 0x20000, CRC(d23d4d2d) SHA1(db03211b7db46899df41db2b1dfbec972109a967))
ROM_END
-MACHINE_CONFIG_START(msx2_state::victhc95a)
+void msx2_state::victhc95a(machine_config &config)
+{
msx2(config);
// YM2149 (in S-1985)
// FDC: wd2793?, 2 3.5" DSDD drive
@@ -7453,12 +7636,12 @@ MACHINE_CONFIG_START(msx2_state::victhc95a)
// S-1985 MSX Engine
// V9958 VDP
- MCFG_MSX_LAYOUT_ROM("bios", 0, 0, 0, 2, "maincpu", 0x0000)
- MCFG_MSX_LAYOUT_ROM("ext", 0, 1, 0, 1, "maincpu", 0x8000)
- MCFG_MSX_LAYOUT_ROM("firm", 0, 1, 1, 1, "maincpu", 0x10000)
- MCFG_MSX_LAYOUT_RAM_MM("ram_mm", 0, 2, 0x40000) // 256KB Mapper RAM
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot", 1, 0)
- MCFG_MSX_LAYOUT_DISK1("disk", 3, 0, 1, 1, "maincpu", 0xc000)
+ add_internal_slot(config, MSX_SLOT_ROM, "bios", 0, 0, 0, 2, "maincpu", 0x0000);
+ add_internal_slot(config, MSX_SLOT_ROM, "ext", 0, 1, 0, 1, "maincpu", 0x8000);
+ add_internal_slot(config, MSX_SLOT_ROM, "firm", 0, 1, 1, 1, "maincpu", 0x10000);
+ add_internal_slot(config, MSX_SLOT_RAM_MM, "ram_mm", 0, 2, 0, 4).set_total_size(0x40000); // 256KB Mapper RAM
+ add_cartridge_slot<1>(config, MSX_SLOT_CARTRIDGE, "cartslot", 1, 0, msx_cart, nullptr);
+ add_internal_slot_mirrored(config, MSX_SLOT_DISK1, "disk", 3, 0, 1, 2, "maincpu", 0xc000).set_tags("fdc", "fdc:0", "fdc:1");
MSX_S1985(config, "s1985", 0);
@@ -7467,7 +7650,7 @@ MACHINE_CONFIG_START(msx2_state::victhc95a)
msx2_floplist(config);
msx2_cartlist(config);
-MACHINE_CONFIG_END
+}
/* MSX2 - Yamaha CX7M */
@@ -7477,22 +7660,22 @@ ROM_START (cx7m)
ROM_LOAD ("cx7mext.rom", 0x8000, 0x4000, CRC(66237ecf) SHA1(5c1f9c7fb655e43d38e5dd1fcc6b942b2ff68b02))
ROM_END
-MACHINE_CONFIG_START(msx2_state::cx7m)
+void msx2_state::cx7m(machine_config &config)
+{
msx2_pal(config);
// AY8910/YM2149?
// FDC: None, 0 drives
// 2 Cartridge slots?
- MCFG_MSX_LAYOUT_ROM("bios", 0, 0, 0, 2, "maincpu", 0x0000)
- MCFG_MSX_LAYOUT_ROM("ext", 0, 1, 0, 1, "maincpu", 0x8000)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot1", 1, 0)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot2", 2, 0)
- MCFG_MSX_LAYOUT_RAM_MM("ram_mm", 3, 2, 0x10000) /* 64KB Mapper RAM */
- MCFG_MSX_RAMIO_SET_BITS(0x80)
- MCFG_MSX_LAYOUT_YAMAHA_EXPANSION("expansion", 3, 3, "sfg05")
+ add_internal_slot(config, MSX_SLOT_ROM, "bios", 0, 0, 0, 2, "maincpu", 0x0000);
+ add_internal_slot(config, MSX_SLOT_ROM, "ext", 0, 1, 0, 1, "maincpu", 0x8000);
+ add_cartridge_slot<1>(config, MSX_SLOT_CARTRIDGE, "cartslot1", 1, 0, msx_cart, nullptr);
+ add_cartridge_slot<2>(config, MSX_SLOT_CARTRIDGE, "cartslot2", 2, 0, msx_cart, nullptr);
+ add_internal_slot(config, MSX_SLOT_RAM_MM, "ram_mm", 3, 2, 0, 4).set_total_size(0x10000).set_ramio_bits(0x80); /* 64KB Mapper RAM */
+ add_cartridge_slot<3>(config, MSX_SLOT_YAMAHA_EXPANSION, "expansion", 3, 3, msx_yamaha_60pin, "sfg05");
msx2_cartlist(config);
-MACHINE_CONFIG_END
+}
/* MSX2 - Yamaha CX7M/128 */
@@ -7503,23 +7686,23 @@ ROM_START (cx7m128)
ROM_LOAD ("yrm502.rom", 0xc000, 0x4000, CRC(51f7ddd1) SHA1(2a4b4a4657e3077df8a88f98210b76883d3702b1))
ROM_END
-MACHINE_CONFIG_START(msx2_state::cx7m128)
+void msx2_state::cx7m128(machine_config &config)
+{
msx2_pal(config);
// AY8910/YM2149?
// FDC: None, 0 drives
// 2 Cartridge slots?
- MCFG_MSX_LAYOUT_ROM("bios", 0, 0, 0, 2, "maincpu", 0x0000)
- MCFG_MSX_LAYOUT_ROM("ext", 0, 1, 0, 1, "maincpu", 0x8000)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot1", 1, 0)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot2", 2, 0)
- MCFG_MSX_LAYOUT_ROM("yrm502", 3, 1, 1, 1, "maincpu", 0xc000)
- MCFG_MSX_LAYOUT_RAM_MM("ram_mm", 3, 2, 0x20000) /* 128KB Mapper RAM */
- MCFG_MSX_RAMIO_SET_BITS(0x80)
- MCFG_MSX_LAYOUT_YAMAHA_EXPANSION("expansion", 3, 3, "sfg05")
+ add_internal_slot(config, MSX_SLOT_ROM, "bios", 0, 0, 0, 2, "maincpu", 0x0000);
+ add_internal_slot(config, MSX_SLOT_ROM, "ext", 0, 1, 0, 1, "maincpu", 0x8000);
+ add_cartridge_slot<1>(config, MSX_SLOT_CARTRIDGE, "cartslot1", 1, 0, msx_cart, nullptr);
+ add_cartridge_slot<2>(config, MSX_SLOT_CARTRIDGE, "cartslot2", 2, 0, msx_cart, nullptr);
+ add_internal_slot(config, MSX_SLOT_ROM, "yrm502", 3, 1, 1, 1, "maincpu", 0xc000);
+ add_internal_slot(config, MSX_SLOT_RAM_MM, "ram_mm", 3, 2, 0, 4).set_total_size(0x20000).set_ramio_bits(0x80); /* 128KB Mapper RAM */
+ add_cartridge_slot<3>(config, MSX_SLOT_YAMAHA_EXPANSION, "expansion", 3, 3, msx_yamaha_60pin, "sfg05");
msx2_cartlist(config);
-MACHINE_CONFIG_END
+}
/* MSX2 - Yamaha YIS-503 III R */
@@ -7531,7 +7714,8 @@ ROM_START (y503iiir)
ROM_LOAD ("yis503iiirnet.rom", 0x10000, 33121, CRC(b10fb61c) SHA1(af2b7004a8888d7a72eee937783fccaca0f38621)) // Very odd size for a rom...
ROM_END
-MACHINE_CONFIG_START(msx2_state::y503iiir)
+void msx2_state::y503iiir(machine_config &config)
+{
msx2_pal(config);
// YM2149 (in S-3527)
// FDC: wd2793?, 1 3.5" DSDD drive
@@ -7539,20 +7723,20 @@ MACHINE_CONFIG_START(msx2_state::y503iiir)
// Networking builtin
// S-3527 MSX Engine
- MCFG_MSX_LAYOUT_ROM("bios", 0, 0, 0, 2, "maincpu", 0x0000)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot1", 1, 0)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot2", 2, 0)
- MCFG_MSX_LAYOUT_ROM("ext", 3, 0, 0, 1, "maincpu", 0x8000)
- MCFG_MSX_LAYOUT_DISK1("cpm", 3, 0, 1, 1, "maincpu", 0xc000)
- MCFG_MSX_LAYOUT_RAM_MM("ram_mm", 3, 2, 0x20000) // 128KB Mapper RAM
- MCFG_MSX_LAYOUT_ROM("net", 3, 3, 0, 3, "maincpu", 0x10000)
+ add_internal_slot(config, MSX_SLOT_ROM, "bios", 0, 0, 0, 2, "maincpu", 0x0000);
+ add_cartridge_slot<1>(config, MSX_SLOT_CARTRIDGE, "cartslot1", 1, 0, msx_cart, nullptr);
+ add_cartridge_slot<2>(config, MSX_SLOT_CARTRIDGE, "cartslot2", 2, 0, msx_cart, nullptr);
+ add_internal_slot(config, MSX_SLOT_ROM, "ext", 3, 0, 0, 1, "maincpu", 0x8000);
+ add_internal_slot_mirrored(config, MSX_SLOT_DISK1, "cpm", 3, 0, 1, 2, "maincpu", 0xc000).set_tags("fdc", "fdc:0", "fdc:1");
+ add_internal_slot(config, MSX_SLOT_RAM_MM, "ram_mm", 3, 2, 0, 4).set_total_size(0x20000); // 128KB Mapper RAM
+ add_internal_slot(config, MSX_SLOT_ROM, "net", 3, 3, 0, 3, "maincpu", 0x10000);
msx_wd2793_force_ready(config);
msx_1_35_dd_drive(config);
msx2_floplist(config);
msx2_cartlist(config);
-MACHINE_CONFIG_END
+}
/* MSX2 - Yamaha YIS-503 III R Estonian */
@@ -7564,7 +7748,8 @@ ROM_START (y503iiire)
ROM_LOAD ("yis503iiirenet.rom", 0x10000, 33121, CRC(b10fb61c) SHA1(af2b7004a8888d7a72eee937783fccaca0f38621)) // Very odd size for a rom...
ROM_END
-MACHINE_CONFIG_START(msx2_state::y503iiire)
+void msx2_state::y503iiire(machine_config &config)
+{
msx2_pal(config);
// YM2149 (in S-3527)
// FDC: wd2793?, 1 3.5" DSDD drive
@@ -7572,20 +7757,20 @@ MACHINE_CONFIG_START(msx2_state::y503iiire)
// Networking builtin
// S-3527 MSX Engine
- MCFG_MSX_LAYOUT_ROM("bios", 0, 0, 0, 2, "maincpu", 0x0000)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot1", 1, 0)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot2", 2, 0)
- MCFG_MSX_LAYOUT_ROM("ext", 3, 0, 0, 1, "maincpu", 0x8000)
- MCFG_MSX_LAYOUT_DISK1("cpm", 3, 0, 1, 1, "maincpu", 0xc000)
- MCFG_MSX_LAYOUT_RAM_MM("ram_mm", 3, 2, 0x20000) // 128KB Mapper RAM
- MCFG_MSX_LAYOUT_ROM("net", 3, 3, 0, 3, "maincpu", 0x10000)
+ add_internal_slot(config, MSX_SLOT_ROM, "bios", 0, 0, 0, 2, "maincpu", 0x0000);
+ add_cartridge_slot<1>(config, MSX_SLOT_CARTRIDGE, "cartslot1", 1, 0, msx_cart, nullptr);
+ add_cartridge_slot<2>(config, MSX_SLOT_CARTRIDGE, "cartslot2", 2, 0, msx_cart, nullptr);
+ add_internal_slot(config, MSX_SLOT_ROM, "ext", 3, 0, 0, 1, "maincpu", 0x8000);
+ add_internal_slot_mirrored(config, MSX_SLOT_DISK1, "cpm", 3, 0, 1, 2, "maincpu", 0xc000).set_tags("fdc", "fdc:0", "fdc:1");
+ add_internal_slot(config, MSX_SLOT_RAM_MM, "ram_mm", 3, 2, 0, 4).set_total_size(0x20000); // 128KB Mapper RAM
+ add_internal_slot(config, MSX_SLOT_ROM, "net", 3, 3, 0, 3, "maincpu", 0x10000);
msx_wd2793_force_ready(config);
msx_1_35_dd_drive(config);
msx2_floplist(config);
msx2_cartlist(config);
-MACHINE_CONFIG_END
+}
/* MSX2 - Yamaha YIS604 */
@@ -7598,22 +7783,23 @@ ROM_START (yis60464)
ROM_LOAD ("yis604kfn.rom", 0x0000, 0x20000, CRC(5a59926e) SHA1(6acaf2eeb57f65f7408235d5e07b7563229de799))
ROM_END
-MACHINE_CONFIG_START(msx2_state::yis60464)
+void msx2_state::yis60464(machine_config &config)
+{
msx2(config);
// YM2149 (in S-3527)
// FDC: None, 0 drives
// 2 Cartridge slots
// S-3527 MSX Engine
- MCFG_MSX_LAYOUT_ROM("bios", 0, 0, 0, 2, "maincpu", 0x0000)
- MCFG_MSX_LAYOUT_ROM("ext", 0, 1, 0, 1, "maincpu", 0x8000)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot1", 1, 0)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot2", 2, 0)
- MCFG_MSX_LAYOUT_RAM_MM("ram_mm", 3, 2, 0x10000) // 64KB Mapper RAM
- MCFG_MSX_LAYOUT_YAMAHA_EXPANSION("expansion", 3, 3, "sfg05")
+ add_internal_slot(config, MSX_SLOT_ROM, "bios", 0, 0, 0, 2, "maincpu", 0x0000);
+ add_internal_slot(config, MSX_SLOT_ROM, "ext", 0, 1, 0, 1, "maincpu", 0x8000);
+ add_cartridge_slot<1>(config, MSX_SLOT_CARTRIDGE, "cartslot1", 1, 0, msx_cart, nullptr);
+ add_cartridge_slot<2>(config, MSX_SLOT_CARTRIDGE, "cartslot2", 2, 0, msx_cart, nullptr);
+ add_internal_slot(config, MSX_SLOT_RAM_MM, "ram_mm", 3, 2, 0, 4).set_total_size(0x10000); // 64KB Mapper RAM
+ add_cartridge_slot<3>(config, MSX_SLOT_YAMAHA_EXPANSION, "expansion", 3, 3, msx_yamaha_60pin, "sfg05");
msx2_cartlist(config);
-MACHINE_CONFIG_END
+}
/* MSX2 - Yamaha YIS604/128 */
@@ -7627,23 +7813,24 @@ ROM_START (yis604)
ROM_LOAD ("yis604kfn.rom", 0x0000, 0x20000, CRC(5a59926e) SHA1(6acaf2eeb57f65f7408235d5e07b7563229de799))
ROM_END
-MACHINE_CONFIG_START(msx2_state::yis604)
+void msx2_state::yis604(machine_config &config)
+{
msx2(config);
// YM2149 (in S-3527)
// FDC: None, 0 drives
// 2 Cartridge slots
// S-3527 MSX Engine
- MCFG_MSX_LAYOUT_ROM("bios", 0, 0, 0, 2, "maincpu", 0x0000)
- MCFG_MSX_LAYOUT_ROM("ext", 0, 1, 0, 1, "maincpu", 0x8000)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot1", 1, 0)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot2", 2, 0)
- MCFG_MSX_LAYOUT_ROM("yrm502", 3, 1, 1, 1, "maincpu", 0xc000)
- MCFG_MSX_LAYOUT_RAM_MM("ram_mm", 3, 2, 0x10000) // 64KB Mapper RAM
- MCFG_MSX_LAYOUT_YAMAHA_EXPANSION("expansion", 3, 3, "sfg05")
+ add_internal_slot(config, MSX_SLOT_ROM, "bios", 0, 0, 0, 2, "maincpu", 0x0000);
+ add_internal_slot(config, MSX_SLOT_ROM, "ext", 0, 1, 0, 1, "maincpu", 0x8000);
+ add_cartridge_slot<1>(config, MSX_SLOT_CARTRIDGE, "cartslot1", 1, 0, msx_cart, nullptr);
+ add_cartridge_slot<2>(config, MSX_SLOT_CARTRIDGE, "cartslot2", 2, 0, msx_cart, nullptr);
+ add_internal_slot(config, MSX_SLOT_ROM, "yrm502", 3, 1, 1, 1, "maincpu", 0xc000);
+ add_internal_slot(config, MSX_SLOT_RAM_MM, "ram_mm", 3, 2, 0, 4).set_total_size(0x10000); // 64KB Mapper RAM
+ add_cartridge_slot<3>(config, MSX_SLOT_YAMAHA_EXPANSION, "expansion", 3, 3, msx_yamaha_60pin, "sfg05");
msx2_cartlist(config);
-MACHINE_CONFIG_END
+}
/* MSX2 - Yamaha YIS-805/128 */
@@ -7658,28 +7845,29 @@ ROM_START (y805128)
ROM_LOAD ("yis805128kfn.rom", 0x0000, 0x20000, CRC(5a59926e) SHA1(6acaf2eeb57f65f7408235d5e07b7563229de799))
ROM_END
-MACHINE_CONFIG_START(msx2_state::y805128)
+void msx2_state::y805128(machine_config &config)
+{
msx2(config);
// YM2149 (in S-3527)
// FDC: wd2793?, 1 3.5" DSDD drive
// 2 Cartridge slots
// S-3527 MSX Engine
- MCFG_MSX_LAYOUT_ROM("bios", 0, 0, 0, 2, "maincpu", 0x0000)
- MCFG_MSX_LAYOUT_ROM("ext", 0, 1, 0, 1, "maincpu", 0x8000)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot1", 1, 0)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot2", 2, 0)
- MCFG_MSX_LAYOUT_DISK1("disk", 3, 0, 1, 1, "maincpu", 0xc000)
- MCFG_MSX_LAYOUT_ROM("yrm502", 3, 1, 1, 1, "maincpu", 0x10000)
- MCFG_MSX_LAYOUT_RAM_MM("ram_mm", 3, 2, 0x20000) // 128KB Mapper RAM
- MCFG_MSX_LAYOUT_YAMAHA_EXPANSION("expansion", 3, 3, "sfg05")
+ add_internal_slot(config, MSX_SLOT_ROM, "bios", 0, 0, 0, 2, "maincpu", 0x0000);
+ add_internal_slot(config, MSX_SLOT_ROM, "ext", 0, 1, 0, 1, "maincpu", 0x8000);
+ add_cartridge_slot<1>(config, MSX_SLOT_CARTRIDGE, "cartslot1", 1, 0, msx_cart, nullptr);
+ add_cartridge_slot<2>(config, MSX_SLOT_CARTRIDGE, "cartslot2", 2, 0, msx_cart, nullptr);
+ add_internal_slot_mirrored(config, MSX_SLOT_DISK1, "disk", 3, 0, 1, 2, "maincpu", 0xc000).set_tags("fdc", "fdc:0", "fdc:1");
+ add_internal_slot(config, MSX_SLOT_ROM, "yrm502", 3, 1, 1, 1, "maincpu", 0x10000);
+ add_internal_slot(config, MSX_SLOT_RAM_MM, "ram_mm", 3, 2, 0, 4).set_total_size(0x20000); // 128KB Mapper RAM
+ add_cartridge_slot<3>(config, MSX_SLOT_YAMAHA_EXPANSION, "expansion", 3, 3, msx_yamaha_60pin, "sfg05");
msx_wd2793_force_ready(config);
msx_1_35_dd_drive(config);
msx2_floplist(config);
msx2_cartlist(config);
-MACHINE_CONFIG_END
+}
/* MSX2 - Yamaha YIS-805R2/128 */
@@ -7692,7 +7880,8 @@ ROM_START (y805128r2)
ROM_LOAD ("yis805128r2paint.rom", 0x18000, 0x10000, CRC(1bda68a3) SHA1(7fd2a28c4fdaeb140f3c8c8fb90271b1472c97b9))
ROM_END
-MACHINE_CONFIG_START(msx2_state::y805128r2)
+void msx2_state::y805128r2(machine_config &config)
+{
msx2_pal(config);
// YM2149 (in S-3527)
// FDC: wd2793?, 1 3.5" DSDD drive
@@ -7700,21 +7889,21 @@ MACHINE_CONFIG_START(msx2_state::y805128r2)
// S-3527 MSX Engine
// Networking built in
- MCFG_MSX_LAYOUT_ROM("bios", 0, 0, 0, 2, "maincpu", 0x0000)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot1", 1, 0)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot2", 2, 0)
- MCFG_MSX_LAYOUT_ROM("paint", 3, 0, 0, 4, "maincpu", 0x18000)
- MCFG_MSX_LAYOUT_ROM("ext", 3, 1, 0, 1, "maincpu", 0x8000)
- MCFG_MSX_LAYOUT_DISK1("disk", 3, 1, 1, 1, "maincpu", 0xc000)
- MCFG_MSX_LAYOUT_RAM_MM("ram_mm", 3, 2, 0x20000) // 128KB Mapper RAM
- MCFG_MSX_LAYOUT_ROM("net", 3, 3, 0, 2, "maincpu", 0x10000)
+ add_internal_slot(config, MSX_SLOT_ROM, "bios", 0, 0, 0, 2, "maincpu", 0x0000);
+ add_cartridge_slot<1>(config, MSX_SLOT_CARTRIDGE, "cartslot1", 1, 0, msx_cart, nullptr);
+ add_cartridge_slot<2>(config, MSX_SLOT_CARTRIDGE, "cartslot2", 2, 0, msx_cart, nullptr);
+ add_internal_slot(config, MSX_SLOT_ROM, "paint", 3, 0, 0, 4, "maincpu", 0x18000);
+ add_internal_slot(config, MSX_SLOT_ROM, "ext", 3, 1, 0, 1, "maincpu", 0x8000);
+ add_internal_slot_mirrored(config, MSX_SLOT_DISK1, "disk", 3, 1, 1, 2, "maincpu", 0xc000).set_tags("fdc", "fdc:0", "fdc:1");
+ add_internal_slot(config, MSX_SLOT_RAM_MM, "ram_mm", 3, 2, 0, 4).set_total_size(0x20000); // 128KB Mapper RAM
+ add_internal_slot(config, MSX_SLOT_ROM, "net", 3, 3, 0, 2, "maincpu", 0x10000);
msx_wd2793_force_ready(config);
msx_1_35_dd_drive(config);
msx2_floplist(config);
msx2_cartlist(config);
-MACHINE_CONFIG_END
+}
/* MSX2 - Yamaha YIS-805R2/128 Estonian */
@@ -7727,7 +7916,8 @@ ROM_START (y805128r2e)
ROM_LOAD ("yis805128r2epaint.rom", 0x18000, 0x10000, CRC(1bda68a3) SHA1(7fd2a28c4fdaeb140f3c8c8fb90271b1472c97b9))
ROM_END
-MACHINE_CONFIG_START(msx2_state::y805128r2e)
+void msx2_state::y805128r2e(machine_config &config)
+{
msx2_pal(config);
// YM2149 (in S-3527)
// FDC: wd2793?, 1 3.5" DSDD drive
@@ -7735,21 +7925,21 @@ MACHINE_CONFIG_START(msx2_state::y805128r2e)
// S-3527 MSX Engine
// Networking built in
- MCFG_MSX_LAYOUT_ROM("bios", 0, 0, 0, 2, "maincpu", 0x0000)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot1", 1, 0)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot2", 2, 0)
- MCFG_MSX_LAYOUT_ROM("paint", 3, 0, 0, 4, "maincpu", 0x18000)
- MCFG_MSX_LAYOUT_ROM("ext", 3, 1, 0, 1, "maincpu", 0x8000)
- MCFG_MSX_LAYOUT_DISK1("disk", 3, 1, 1, 1, "maincpu", 0xc000)
- MCFG_MSX_LAYOUT_RAM_MM("ram_mm", 3, 2, 0x20000) // 128KB Mapper RAM
- MCFG_MSX_LAYOUT_ROM("net", 3, 3, 0, 2, "maincpu", 0x10000)
+ add_internal_slot(config, MSX_SLOT_ROM, "bios", 0, 0, 0, 2, "maincpu", 0x0000);
+ add_cartridge_slot<1>(config, MSX_SLOT_CARTRIDGE, "cartslot1", 1, 0, msx_cart, nullptr);
+ add_cartridge_slot<2>(config, MSX_SLOT_CARTRIDGE, "cartslot2", 2, 0, msx_cart, nullptr);
+ add_internal_slot(config, MSX_SLOT_ROM, "paint", 3, 0, 0, 4, "maincpu", 0x18000);
+ add_internal_slot(config, MSX_SLOT_ROM, "ext", 3, 1, 0, 1, "maincpu", 0x8000);
+ add_internal_slot_mirrored(config, MSX_SLOT_DISK1, "disk", 3, 1, 1, 2, "maincpu", 0xc000).set_tags("fdc", "fdc:0", "fdc:1");
+ add_internal_slot(config, MSX_SLOT_RAM_MM, "ram_mm", 3, 2, 0, 4).set_total_size(0x20000); // 128KB Mapper RAM
+ add_internal_slot(config, MSX_SLOT_ROM, "net", 3, 3, 0, 2, "maincpu", 0x10000);
msx_wd2793_force_ready(config);
msx_1_35_dd_drive(config);
msx2_floplist(config);
msx2_cartlist(config);
-MACHINE_CONFIG_END
+}
/* MSX2 - Yamaha YIS-805/256 */
@@ -7764,28 +7954,29 @@ ROM_START (y805256)
ROM_LOAD ("yis805256kfn.rom", 0x0000, 0x20000, CRC(5a59926e) SHA1(6acaf2eeb57f65f7408235d5e07b7563229de799))
ROM_END
-MACHINE_CONFIG_START(msx2_state::y805256)
+void msx2_state::y805256(machine_config &config)
+{
msx2(config);
// YM2149 (in S-3527)
// FDC: wd2793?, 1 3.5" DSDD drive
// 2 Cartridge slots
// S-3527 MSX Engine
- MCFG_MSX_LAYOUT_ROM("bios", 0, 0, 0, 2, "maincpu", 0x0000)
- MCFG_MSX_LAYOUT_ROM("ext", 0, 1, 0, 1, "maincpu", 0x8000)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot1", 1, 0)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot2", 2, 0)
- MCFG_MSX_LAYOUT_DISK1("disk", 3, 0, 1, 1, "maincpu", 0xc000)
- MCFG_MSX_LAYOUT_ROM("yrm502", 3, 1, 1, 1, "maincpu", 0x10000)
- MCFG_MSX_LAYOUT_RAM_MM("ram_mm", 3, 2, 0x40000) // 256KB Mapper RAM
- MCFG_MSX_LAYOUT_YAMAHA_EXPANSION("expansion", 3, 3, "sfg05")
+ add_internal_slot(config, MSX_SLOT_ROM, "bios", 0, 0, 0, 2, "maincpu", 0x0000);
+ add_internal_slot(config, MSX_SLOT_ROM, "ext", 0, 1, 0, 1, "maincpu", 0x8000);
+ add_cartridge_slot<1>(config, MSX_SLOT_CARTRIDGE, "cartslot1", 1, 0, msx_cart, nullptr);
+ add_cartridge_slot<2>(config, MSX_SLOT_CARTRIDGE, "cartslot2", 2, 0, msx_cart, nullptr);
+ add_internal_slot_mirrored(config, MSX_SLOT_DISK1, "disk", 3, 0, 1, 2, "maincpu", 0xc000).set_tags("fdc", "fdc:0", "fdc:1");
+ add_internal_slot(config, MSX_SLOT_ROM, "yrm502", 3, 1, 1, 1, "maincpu", 0x10000);
+ add_internal_slot(config, MSX_SLOT_RAM_MM, "ram_mm", 3, 2, 0, 4).set_total_size(0x40000); // 256KB Mapper RAM
+ add_cartridge_slot<3>(config, MSX_SLOT_YAMAHA_EXPANSION, "expansion", 3, 3, msx_yamaha_60pin, "sfg05");
msx_wd2793_force_ready(config);
msx_1_35_dd_drive(config);
msx2_floplist(config);
msx2_cartlist(config);
-MACHINE_CONFIG_END
+}
/******************************** MSX 2+ **********************************/
@@ -7800,20 +7991,21 @@ ROM_START (expert3i )
ROM_LOAD ("ide240a.rom", 0x14000, 0x10000, CRC(7adf857f) SHA1(8a919dbeed92db8c06a611279efaed8552810239))
ROM_END
-MACHINE_CONFIG_START(msx2_state::expert3i)
+void msx2_state::expert3i(machine_config &config)
+{
msx2p(config);
// AY8910/YM2149?
// FDC: wd2793, 1 or 2? drives
// 2 Cartridge slots?
- MCFG_MSX_LAYOUT_ROM("bios", 0, 0, 0, 2, "maincpu", 0x0000)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot1", 1, 0)
- MCFG_MSX_LAYOUT_ROM("ext", 1, 1, 0, 1, "maincpu", 0x8000)
- MCFG_MSX_LAYOUT_MUSIC("mus", 1, 1, 1, 1, "maincpu", 0x10000)
- MCFG_MSX_LAYOUT_DISK1("disk", 1, 2, 1, 1, "maincpu", 0xc000)
- MCFG_MSX_LAYOUT_ROM("ide", 1, 3, 0, 4, "maincpu", 0x14000) /* IDE hardware needs to be emulated */
- MCFG_MSX_LAYOUT_RAM_MM("ram_mm", 2, 0, 0x40000) /* 256KB?? Mapper RAM */
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot2", 3, 0)
+ add_internal_slot(config, MSX_SLOT_ROM, "bios", 0, 0, 0, 2, "maincpu", 0x0000);
+ add_cartridge_slot<1>(config, MSX_SLOT_CARTRIDGE, "cartslot1", 1, 0, msx_cart, nullptr);
+ add_internal_slot(config, MSX_SLOT_ROM, "ext", 1, 1, 0, 1, "maincpu", 0x8000);
+ add_internal_slot(config, MSX_SLOT_MUSIC, "mus", 1, 1, 1, 1, "maincpu", 0x10000).set_ym2413_tag("ym2413");
+ add_internal_slot_mirrored(config, MSX_SLOT_DISK1, "disk", 1, 2, 1, 2, "maincpu", 0xc000).set_tags("fdc", "fdc:0", "fdc:1");
+ add_internal_slot(config, MSX_SLOT_ROM, "ide", 1, 3, 0, 4, "maincpu", 0x14000); /* IDE hardware needs to be emulated */
+ add_internal_slot(config, MSX_SLOT_RAM_MM, "ram_mm", 2, 0, 0, 4).set_total_size(0x40000); /* 256KB?? Mapper RAM */
+ add_cartridge_slot<2>(config, MSX_SLOT_CARTRIDGE, "cartslot2", 3, 0, msx_cart, nullptr);
msx_ym2413(config);
@@ -7822,7 +8014,7 @@ MACHINE_CONFIG_START(msx2_state::expert3i)
msx2p_floplist(config);
msx2_cartlist(config);
-MACHINE_CONFIG_END
+}
/* MSX2+ - Ciel Expert 3 Turbo */
@@ -7836,21 +8028,22 @@ ROM_START (expert3t )
ROM_LOAD ("turbo.rom", 0x14000, 0x4000, CRC(ab528416) SHA1(d468604269ae7664ac739ea9f922a05e14ffa3d1))
ROM_END
-MACHINE_CONFIG_START(msx2_state::expert3t)
+void msx2_state::expert3t(machine_config &config)
+{
msx2p(config);
// AY8910
// FDC: wd2793?, 1 or 2? drives
// 4 Cartridge/Expansion slots?
// FM/YM2413 built-in
- MCFG_MSX_LAYOUT_ROM("bios", 0, 0, 0, 2, "maincpu", 0x0000)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot1", 1, 0)
- MCFG_MSX_LAYOUT_ROM("ext", 1, 1, 0, 1, "maincpu", 0x8000)
- MCFG_MSX_LAYOUT_MUSIC("mus", 1, 1, 1, 1, "maincpu", 0x10000)
- MCFG_MSX_LAYOUT_ROM("turbo", 1, 2, 1, 1, "maincpu", 0x14000) /* Turbo hardware needs to be emulated */
- MCFG_MSX_LAYOUT_DISK1("disk", 1, 3, 1, 1, "maincpu", 0xc000)
- MCFG_MSX_LAYOUT_RAM_MM("ram_mm", 2, 0, 0x40000) /* 256KB Mapper RAM */
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot2", 3, 0)
+ add_internal_slot(config, MSX_SLOT_ROM, "bios", 0, 0, 0, 2, "maincpu", 0x0000);
+ add_cartridge_slot<1>(config, MSX_SLOT_CARTRIDGE, "cartslot1", 1, 0, msx_cart, nullptr);
+ add_internal_slot(config, MSX_SLOT_ROM, "ext", 1, 1, 0, 1, "maincpu", 0x8000);
+ add_internal_slot(config, MSX_SLOT_MUSIC, "mus", 1, 1, 1, 1, "maincpu", 0x10000).set_ym2413_tag("ym2413");
+ add_internal_slot(config, MSX_SLOT_ROM, "turbo", 1, 2, 1, 1, "maincpu", 0x14000); /* Turbo hardware needs to be emulated */
+ add_internal_slot_mirrored(config, MSX_SLOT_DISK1, "disk", 1, 3, 1, 2, "maincpu", 0xc000).set_tags("fdc", "fdc:0", "fdc:1");
+ add_internal_slot(config, MSX_SLOT_RAM_MM, "ram_mm", 2, 0, 0, 4).set_total_size(0x40000); /* 256KB Mapper RAM */
+ add_cartridge_slot<2>(config, MSX_SLOT_CARTRIDGE, "cartslot2", 3, 0, msx_cart, nullptr);
msx_ym2413(config);
@@ -7859,7 +8052,7 @@ MACHINE_CONFIG_START(msx2_state::expert3t)
msx2p_floplist(config);
msx2_cartlist(config);
-MACHINE_CONFIG_END
+}
/* MSX2+ - Gradiente Expert AC88+ */
@@ -7872,27 +8065,28 @@ ROM_START (expertac)
ROM_LOAD ("xbasic2.rom", 0x14000, 0x4000, CRC(2825b1a0) SHA1(47370bec7ca1f0615a54eda548b07fbc0c7ef398))
ROM_END
-MACHINE_CONFIG_START(msx2_state::expertac)
+void msx2_state::expertac(machine_config &config)
+{
msx2p(config);
// AY8910/YM2149?
// FDC: wd2793?, 1 or 2? drives
// 2 Cartridge slots?
- MCFG_MSX_LAYOUT_ROM("bios", 0, 0, 0, 2, "maincpu", 0x0000)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot1", 1, 0)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot2", 2, 0)
- MCFG_MSX_LAYOUT_RAM_MM("ram_mm", 3, 0, 0x10000) /* 64KB Mapper RAM?? */
- MCFG_MSX_LAYOUT_ROM("ext", 3, 1, 0, 1, "maincpu", 0x8000)
- MCFG_MSX_LAYOUT_ROM("asm", 3, 1, 1, 1, "maincpu", 0x10000)
- MCFG_MSX_LAYOUT_DISK1("disk", 3, 2, 1, 1, "maincpu", 0xc000)
- MCFG_MSX_LAYOUT_ROM("xbasic", 3, 3, 1, 1, "maincpu", 0x14000)
+ add_internal_slot(config, MSX_SLOT_ROM, "bios", 0, 0, 0, 2, "maincpu", 0x0000);
+ add_cartridge_slot<1>(config, MSX_SLOT_CARTRIDGE, "cartslot1", 1, 0, msx_cart, nullptr);
+ add_cartridge_slot<2>(config, MSX_SLOT_CARTRIDGE, "cartslot2", 2, 0, msx_cart, nullptr);
+ add_internal_slot(config, MSX_SLOT_RAM_MM, "ram_mm", 3, 0, 0, 4).set_total_size(0x10000); /* 64KB Mapper RAM?? */
+ add_internal_slot(config, MSX_SLOT_ROM, "ext", 3, 1, 0, 1, "maincpu", 0x8000);
+ add_internal_slot(config, MSX_SLOT_ROM, "asm", 3, 1, 1, 1, "maincpu", 0x10000);
+ add_internal_slot_mirrored(config, MSX_SLOT_DISK1, "disk", 3, 2, 1, 2, "maincpu", 0xc000).set_tags("fdc", "fdc:0", "fdc:1");
+ add_internal_slot(config, MSX_SLOT_ROM, "xbasic", 3, 3, 1, 1, "maincpu", 0x14000);
msx_wd2793_force_ready(config);
msx_1_35_dd_drive(config);
msx2p_floplist(config);
msx2_cartlist(config);
-MACHINE_CONFIG_END
+}
/* MSX2+ - Gradiente Expert DDX+ */
@@ -7905,19 +8099,20 @@ ROM_START (expertdx)
ROM_LOAD ("kanji.rom", 0x14000, 0x8000, CRC(b4fc574d) SHA1(dcc3a67732aa01c4f2ee8d1ad886444a4dbafe06))
ROM_END
-MACHINE_CONFIG_START(msx2_state::expertdx)
+void msx2_state::expertdx(machine_config &config)
+{
msx2p(config);
// AY8910/YM2149?
// FDC: tc8566af, 1 3.5" DSDD drive?
// 2 Cartridge slots?
- MCFG_MSX_LAYOUT_ROM("bios", 0, 0, 0, 2, "maincpu", 0x0000)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot1", 1, 0)
- MCFG_MSX_LAYOUT_ROM("ext", 1, 1, 0, 1, "maincpu", 0x8000)
- MCFG_MSX_LAYOUT_ROM("xbasic", 1, 2, 1, 1, "maincpu", 0x10000)
- MCFG_MSX_LAYOUT_DISK3("disk", 1, 3, 1, 1, "maincpu", 0xc000)
- MCFG_MSX_LAYOUT_RAM_MM("ram_mm", 2, 0, 0x10000) /* 64KB Mapper RAM?? */
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot2", 3, 0)
+ add_internal_slot(config, MSX_SLOT_ROM, "bios", 0, 0, 0, 2, "maincpu", 0x0000);
+ add_cartridge_slot<1>(config, MSX_SLOT_CARTRIDGE, "cartslot1", 1, 0, msx_cart, nullptr);
+ add_internal_slot(config, MSX_SLOT_ROM, "ext", 1, 1, 0, 1, "maincpu", 0x8000);
+ add_internal_slot(config, MSX_SLOT_ROM, "xbasic", 1, 2, 1, 1, "maincpu", 0x10000);
+ add_internal_slot(config, MSX_SLOT_DISK3, "disk", 1, 3, 1, 1, "maincpu", 0xc000).set_tags("fdc", "fdc:0", "fdc:1");
+ add_internal_slot(config, MSX_SLOT_RAM_MM, "ram_mm", 2, 0, 0, 4).set_total_size(0x10000); /* 64KB Mapper RAM?? */
+ add_cartridge_slot<2>(config, MSX_SLOT_CARTRIDGE, "cartslot2", 3, 0, msx_cart, nullptr);
/* Kanji? */
msx_tc8566af(config);
@@ -7925,7 +8120,7 @@ MACHINE_CONFIG_START(msx2_state::expertdx)
msx2p_floplist(config);
msx2_cartlist(config);
-MACHINE_CONFIG_END
+}
/* MSX2+ - Panasonic FS-A1FX */
@@ -7941,21 +8136,21 @@ ROM_START (fsa1fx)
ROM_LOAD ("a1fxkfn.rom", 0, 0x20000, CRC(b244f6cf) SHA1(e0e99cd91e88ce2676445663f832c835d74d6fd4))
ROM_END
-MACHINE_CONFIG_START(msx2_state::fsa1fx)
+void msx2_state::fsa1fx(machine_config &config)
+{
msx2p(config);
// AY8910/YM2149?
// FDC: tc8566af, 1 3.5" DSDD drive
// 2 Cartridge slots?
- MCFG_MSX_LAYOUT_ROM("bios", 0, 0, 0, 2, "maincpu", 0x0000)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot1", 1, 0)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot2", 2, 0)
- MCFG_MSX_LAYOUT_RAM_MM("ram_mm", 3, 0, 0x10000) /* 64KB Mapper RAM */
- MCFG_MSX_RAMIO_SET_BITS(0x80)
- MCFG_MSX_LAYOUT_ROM("ext", 3, 1, 0, 1, "maincpu", 0x8000)
- MCFG_MSX_LAYOUT_ROM("kdr", 3, 1, 1, 2, "maincpu", 0x10000)
- MCFG_MSX_LAYOUT_DISK3("disk", 3, 2, 1, 1, "maincpu", 0xc000)
- MCFG_MSX_LAYOUT_ROM("cock", 3, 3, 1, 2, "maincpu", 0x18000)
+ add_internal_slot(config, MSX_SLOT_ROM, "bios", 0, 0, 0, 2, "maincpu", 0x0000);
+ add_cartridge_slot<1>(config, MSX_SLOT_CARTRIDGE, "cartslot1", 1, 0, msx_cart, nullptr);
+ add_cartridge_slot<2>(config, MSX_SLOT_CARTRIDGE, "cartslot2", 2, 0, msx_cart, nullptr);
+ add_internal_slot(config, MSX_SLOT_RAM_MM, "ram_mm", 3, 0, 0, 4).set_total_size(0x10000).set_ramio_bits(0x80); /* 64KB Mapper RAM */
+ add_internal_slot(config, MSX_SLOT_ROM, "ext", 3, 1, 0, 1, "maincpu", 0x8000);
+ add_internal_slot(config, MSX_SLOT_ROM, "kdr", 3, 1, 1, 2, "maincpu", 0x10000);
+ add_internal_slot(config, MSX_SLOT_DISK3, "disk", 3, 2, 1, 1, "maincpu", 0xc000).set_tags("fdc", "fdc:0", "fdc:1");
+ add_internal_slot(config, MSX_SLOT_ROM, "cock", 3, 3, 1, 2, "maincpu", 0x18000);
msx_matsushita_device &matsushita(MSX_MATSUSHITA(config, "matsushita", 0));
matsushita.turbo_callback().set(FUNC(msx2_state::turbo_w));
@@ -7967,7 +8162,7 @@ MACHINE_CONFIG_START(msx2_state::fsa1fx)
msx2p_floplist(config);
msx2_cartlist(config);
-MACHINE_CONFIG_END
+}
/* MSX2+ - Panasonic FS-A1WSX */
@@ -7984,7 +8179,8 @@ ROM_START (fsa1wsx)
ROM_LOAD ("a1wskfn.rom", 0, 0x40000, CRC(1f6406fb) SHA1(5aff2d9b6efc723bc395b0f96f0adfa83cc54a49))
ROM_END
-MACHINE_CONFIG_START(msx2_state::fsa1wsx)
+void msx2_state::fsa1wsx(machine_config &config)
+{
msx2p(config);
// AY8910/YM2149?
// FDC: tc8566af, 1 3.5" DSDD drive
@@ -7992,16 +8188,15 @@ MACHINE_CONFIG_START(msx2_state::fsa1wsx)
// FM built-in
// No cassette port
- MCFG_MSX_LAYOUT_ROM("bios", 0, 0, 0, 2, "maincpu", 0x0000)
- MCFG_MSX_LAYOUT_MUSIC("mus", 0, 2, 1, 1, "maincpu", 0x18000)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot1", 1, 0)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot2", 2, 0)
- MCFG_MSX_LAYOUT_RAM_MM("ram_mm", 3, 0, 0x10000) /* 64KB Mapper RAM */
- MCFG_MSX_RAMIO_SET_BITS(0x80)
- MCFG_MSX_LAYOUT_ROM("ext", 3, 1, 0, 1, "maincpu", 0x8000)
- MCFG_MSX_LAYOUT_ROM("kdr", 3, 1, 1, 2, "maincpu", 0x10000)
- MCFG_MSX_LAYOUT_DISK3("disk", 3, 2, 1, 1, "maincpu", 0xc000)
- MCFG_MSX_LAYOUT_PANASONIC08("firm", 3, 3, 0, 4, "maincpu", 0x1c000)
+ add_internal_slot(config, MSX_SLOT_ROM, "bios", 0, 0, 0, 2, "maincpu", 0x0000);
+ add_internal_slot(config, MSX_SLOT_MUSIC, "mus", 0, 2, 1, 1, "maincpu", 0x18000).set_ym2413_tag("ym2413");
+ add_cartridge_slot<1>(config, MSX_SLOT_CARTRIDGE, "cartslot1", 1, 0, msx_cart, nullptr);
+ add_cartridge_slot<2>(config, MSX_SLOT_CARTRIDGE, "cartslot2", 2, 0, msx_cart, nullptr);
+ add_internal_slot(config, MSX_SLOT_RAM_MM, "ram_mm", 3, 0, 0, 4).set_total_size(0x10000).set_ramio_bits(0x80); /* 64KB Mapper RAM */
+ add_internal_slot(config, MSX_SLOT_ROM, "ext", 3, 1, 0, 1, "maincpu", 0x8000);
+ add_internal_slot(config, MSX_SLOT_ROM, "kdr", 3, 1, 1, 2, "maincpu", 0x10000);
+ add_internal_slot(config, MSX_SLOT_DISK3, "disk", 3, 2, 1, 1, "maincpu", 0xc000).set_tags("fdc", "fdc:0", "fdc:1");
+ add_internal_slot(config, MSX_SLOT_PANASONIC08, "firm", 3, 3, 0, 4, "maincpu", 0x1c000);
msx_matsushita_device &matsushita(MSX_MATSUSHITA(config, "matsushita", 0));
matsushita.turbo_callback().set(FUNC(msx2_state::turbo_w));
@@ -8015,7 +8210,7 @@ MACHINE_CONFIG_START(msx2_state::fsa1wsx)
msx2p_floplist(config);
msx2_cartlist(config);
-MACHINE_CONFIG_END
+}
/* MSX2+ - Panasonic FS-A1WX */
@@ -8032,7 +8227,8 @@ ROM_START (fsa1wx)
ROM_LOAD ("a1wxkfn.rom", 0, 0x40000, CRC(1f6406fb) SHA1(5aff2d9b6efc723bc395b0f96f0adfa83cc54a49))
ROM_END
-MACHINE_CONFIG_START(msx2_state::fsa1wx)
+void msx2_state::fsa1wx(machine_config &config)
+{
msx2p(config);
// AY8910/YM2149?
// FDC: tc8566af, 1 3.5" DSDD drive
@@ -8040,16 +8236,15 @@ MACHINE_CONFIG_START(msx2_state::fsa1wx)
// FM built-in
// MSX Engine T9769A
- MCFG_MSX_LAYOUT_ROM("bios", 0, 0, 0, 2, "maincpu", 0x0000)
- MCFG_MSX_LAYOUT_MUSIC("mus", 0, 2, 1, 1, "maincpu", 0x18000)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot1", 1, 0)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot2", 2, 0)
- MCFG_MSX_LAYOUT_RAM_MM("ram_mm", 3, 0, 0x10000) /* 64KB Mapper RAM */
- MCFG_MSX_RAMIO_SET_BITS(0x80)
- MCFG_MSX_LAYOUT_ROM("ext", 3, 1, 0, 1, "maincpu", 0x8000)
- MCFG_MSX_LAYOUT_ROM("kdr", 3, 1, 1, 2, "maincpu", 0x10000)
- MCFG_MSX_LAYOUT_DISK3("disk", 3, 2, 1, 1, "maincpu", 0xc000)
- MCFG_MSX_LAYOUT_PANASONIC08("firm", 3, 3, 0, 4, "maincpu", 0x1c000)
+ add_internal_slot(config, MSX_SLOT_ROM, "bios", 0, 0, 0, 2, "maincpu", 0x0000);
+ add_internal_slot(config, MSX_SLOT_MUSIC, "mus", 0, 2, 1, 1, "maincpu", 0x18000).set_ym2413_tag("ym2413");
+ add_cartridge_slot<1>(config, MSX_SLOT_CARTRIDGE, "cartslot1", 1, 0, msx_cart, nullptr);
+ add_cartridge_slot<2>(config, MSX_SLOT_CARTRIDGE, "cartslot2", 2, 0, msx_cart, nullptr);
+ add_internal_slot(config, MSX_SLOT_RAM_MM, "ram_mm", 3, 0, 0, 4).set_total_size(0x10000).set_ramio_bits(0x80); /* 64KB Mapper RAM */
+ add_internal_slot(config, MSX_SLOT_ROM, "ext", 3, 1, 0, 1, "maincpu", 0x8000);
+ add_internal_slot(config, MSX_SLOT_ROM, "kdr", 3, 1, 1, 2, "maincpu", 0x10000);
+ add_internal_slot(config, MSX_SLOT_DISK3, "disk", 3, 2, 1, 1, "maincpu", 0xc000).set_tags("fdc", "fdc:0", "fdc:1");
+ add_internal_slot(config, MSX_SLOT_PANASONIC08, "firm", 3, 3, 0, 4, "maincpu", 0x1c000);
msx_matsushita_device &matsushita(MSX_MATSUSHITA(config, "matsushita", 0));
matsushita.turbo_callback().set(FUNC(msx2_state::turbo_w));
@@ -8063,7 +8258,7 @@ MACHINE_CONFIG_START(msx2_state::fsa1wx)
msx2p_floplist(config);
msx2_cartlist(config);
-MACHINE_CONFIG_END
+}
/* MSX2+ - Panasonic FS-A1WX (a) */
ROM_START (fsa1wxa)
@@ -8079,23 +8274,23 @@ ROM_START (fsa1wxa)
ROM_LOAD ("a1wxkfn.rom", 0, 0x40000, CRC(1f6406fb) SHA1(5aff2d9b6efc723bc395b0f96f0adfa83cc54a49))
ROM_END
-MACHINE_CONFIG_START(msx2_state::fsa1wxa)
+void msx2_state::fsa1wxa(machine_config &config)
+{
msx2p(config);
// AY8910/YM2149?
// FDC: tc8566af, 1 3.5" DSDD drive
// 2 Cartridge slots?
// FM built-in
- MCFG_MSX_LAYOUT_ROM("bios", 0, 0, 0, 2, "maincpu", 0x0000)
- MCFG_MSX_LAYOUT_MUSIC("mus", 0, 2, 1, 1, "maincpu", 0x18000)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot1", 1, 0)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot2", 2, 0)
- MCFG_MSX_LAYOUT_RAM_MM("ram_mm", 3, 0, 0x10000) /* 64KB Mapper RAM */
- MCFG_MSX_RAMIO_SET_BITS(0x80)
- MCFG_MSX_LAYOUT_ROM("ext", 3, 1, 0, 1, "maincpu", 0x8000)
- MCFG_MSX_LAYOUT_ROM("kdr", 3, 1, 1, 2, "maincpu", 0x10000)
- MCFG_MSX_LAYOUT_DISK3("disk", 3, 2, 1, 1, "maincpu", 0xc000)
- MCFG_MSX_LAYOUT_PANASONIC08("firm", 3, 3, 0, 4, "maincpu", 0x1c000)
+ add_internal_slot(config, MSX_SLOT_ROM, "bios", 0, 0, 0, 2, "maincpu", 0x0000);
+ add_internal_slot(config, MSX_SLOT_MUSIC, "mus", 0, 2, 1, 1, "maincpu", 0x18000).set_ym2413_tag("ym2413");
+ add_cartridge_slot<1>(config, MSX_SLOT_CARTRIDGE, "cartslot1", 1, 0, msx_cart, nullptr);
+ add_cartridge_slot<2>(config, MSX_SLOT_CARTRIDGE, "cartslot2", 2, 0, msx_cart, nullptr);
+ add_internal_slot(config, MSX_SLOT_RAM_MM, "ram_mm", 3, 0, 0, 4).set_total_size(0x10000).set_ramio_bits(0x80); /* 64KB Mapper RAM */
+ add_internal_slot(config, MSX_SLOT_ROM, "ext", 3, 1, 0, 1, "maincpu", 0x8000);
+ add_internal_slot(config, MSX_SLOT_ROM, "kdr", 3, 1, 1, 2, "maincpu", 0x10000);
+ add_internal_slot(config, MSX_SLOT_DISK3, "disk", 3, 2, 1, 1, "maincpu", 0xc000).set_tags("fdc", "fdc:0", "fdc:1");
+ add_internal_slot(config, MSX_SLOT_PANASONIC08, "firm", 3, 3, 0, 4, "maincpu", 0x1c000);
msx_matsushita_device &matsushita(MSX_MATSUSHITA(config, "matsushita", 0));
matsushita.turbo_callback().set(FUNC(msx2_state::turbo_w));
@@ -8109,7 +8304,7 @@ MACHINE_CONFIG_START(msx2_state::fsa1wxa)
msx2p_floplist(config);
msx2_cartlist(config);
-MACHINE_CONFIG_END
+}
/* MSX2+ - Sanyo Wavy PHC-35J */
@@ -8123,24 +8318,24 @@ ROM_START (phc35j)
ROM_LOAD ("35jkfn.rom", 0, 0x20000, CRC(c9651b32) SHA1(84a645becec0a25d3ab7a909cde1b242699a8662))
ROM_END
-MACHINE_CONFIG_START(msx2_state::phc35j)
+void msx2_state::phc35j(machine_config &config)
+{
msx2p(config);
// AY8910/YM2149?
// FDC: None, 0 drives
// 2 Cartridge slots
- MCFG_MSX_LAYOUT_ROM("bios", 0, 0, 0, 2, "maincpu", 0x0000)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot1", 1, 0)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot2", 2, 0)
- MCFG_MSX_LAYOUT_RAM_MM("ram_mm", 3, 0, 0x10000) /* 64KB Mapper RAM */
- MCFG_MSX_RAMIO_SET_BITS(0x80)
- MCFG_MSX_LAYOUT_ROM("ext", 3, 1, 0, 1, "maincpu", 0x8000)
- MCFG_MSX_LAYOUT_ROM("kdr", 3, 1, 1, 2, "maincpu", 0xc000)
+ add_internal_slot(config, MSX_SLOT_ROM, "bios", 0, 0, 0, 2, "maincpu", 0x0000);
+ add_cartridge_slot<1>(config, MSX_SLOT_CARTRIDGE, "cartslot1", 1, 0, msx_cart, nullptr);
+ add_cartridge_slot<2>(config, MSX_SLOT_CARTRIDGE, "cartslot2", 2, 0, msx_cart, nullptr);
+ add_internal_slot(config, MSX_SLOT_RAM_MM, "ram_mm", 3, 0, 0, 4).set_total_size(0x10000).set_ramio_bits(0x80); /* 64KB Mapper RAM */
+ add_internal_slot(config, MSX_SLOT_ROM, "ext", 3, 1, 0, 1, "maincpu", 0x8000);
+ add_internal_slot(config, MSX_SLOT_ROM, "kdr", 3, 1, 1, 2, "maincpu", 0xc000);
MSX_SYSTEMFLAGS(config, "sysflags", m_maincpu, 0xff);
msx2_cartlist(config);
-MACHINE_CONFIG_END
+}
/* MSX2+ - Sanyo Wavy PHC-70FD1 */
@@ -8157,23 +8352,23 @@ ROM_START (phc70fd)
ROM_LOAD ("70fdkfn.rom", 0, 0x20000, CRC(c9651b32) SHA1(84a645becec0a25d3ab7a909cde1b242699a8662))
ROM_END
-MACHINE_CONFIG_START(msx2_state::phc70fd)
+void msx2_state::phc70fd(machine_config &config)
+{
msx2p(config);
// AY8910/YM2149?
// FDC: tc8566af, 1 3.5" DSDD drive
// 2 Cartridge slots
// FM built-in
- MCFG_MSX_LAYOUT_ROM("bios", 0, 0, 0, 2, "maincpu", 0x0000)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot1", 1, 0)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot2", 2, 0)
- MCFG_MSX_LAYOUT_RAM_MM("ram_mm", 3, 0, 0x10000) /* 64KB Mapper RAM */
- MCFG_MSX_RAMIO_SET_BITS(0x80)
- MCFG_MSX_LAYOUT_ROM("ext", 3, 1, 0, 1, "maincpu", 0x8000)
- MCFG_MSX_LAYOUT_ROM("kdr", 3, 1, 1, 2, "maincpu", 0x10000)
- MCFG_MSX_LAYOUT_DISK3("disk", 3, 2, 1, 1, "maincpu", 0xc000)
- MCFG_MSX_LAYOUT_MUSIC("mus", 3, 3, 1, 1, "maincpu", 0x18000)
- MCFG_MSX_LAYOUT_ROM("bas", 3, 3, 2, 1, "maincpu", 0x1c000)
+ add_internal_slot(config, MSX_SLOT_ROM, "bios", 0, 0, 0, 2, "maincpu", 0x0000);
+ add_cartridge_slot<1>(config, MSX_SLOT_CARTRIDGE, "cartslot1", 1, 0, msx_cart, nullptr);
+ add_cartridge_slot<2>(config, MSX_SLOT_CARTRIDGE, "cartslot2", 2, 0, msx_cart, nullptr);
+ add_internal_slot(config, MSX_SLOT_RAM_MM, "ram_mm", 3, 0, 0, 4).set_total_size(0x10000).set_ramio_bits(0x80); /* 64KB Mapper RAM */
+ add_internal_slot(config, MSX_SLOT_ROM, "ext", 3, 1, 0, 1, "maincpu", 0x8000);
+ add_internal_slot(config, MSX_SLOT_ROM, "kdr", 3, 1, 1, 2, "maincpu", 0x10000);
+ add_internal_slot(config, MSX_SLOT_DISK3, "disk", 3, 2, 1, 1, "maincpu", 0xc000).set_tags("fdc", "fdc:0", "fdc:1");
+ add_internal_slot(config, MSX_SLOT_MUSIC, "mus", 3, 3, 1, 1, "maincpu", 0x18000).set_ym2413_tag("ym2413");
+ add_internal_slot(config, MSX_SLOT_ROM, "bas", 3, 3, 2, 1, "maincpu", 0x1c000);
MSX_SYSTEMFLAGS(config, "sysflags", m_maincpu, 0xff);
@@ -8184,7 +8379,7 @@ MACHINE_CONFIG_START(msx2_state::phc70fd)
msx2p_floplist(config);
msx2_cartlist(config);
-MACHINE_CONFIG_END
+}
/* MSX2+ - Sanyo Wavy PHC-70FD2 */
ROM_START (phc70fd2)
@@ -8200,23 +8395,23 @@ ROM_START (phc70fd2)
ROM_LOAD ("70f2kfn.rom", 0, 0x40000, CRC(9a850db9) SHA1(bcdb4dae303dfe5234f372d70a5e0271d3202c36))
ROM_END
-MACHINE_CONFIG_START(msx2_state::phc70fd2)
+void msx2_state::phc70fd2(machine_config &config)
+{
msx2p(config);
// AY8910/YM2149?
// FDC: tc8566af, 2 3.5" DSDD drives
// 2 Cartridge slots
// FM built-in
- MCFG_MSX_LAYOUT_ROM("bios", 0, 0, 0, 2, "maincpu", 0x0000)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot1", 1, 0)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot2", 2, 0)
- MCFG_MSX_LAYOUT_RAM_MM("ram_mm", 3, 0, 0x10000) /* 64KB Mapper RAM */
- MCFG_MSX_RAMIO_SET_BITS(0x80)
- MCFG_MSX_LAYOUT_ROM("ext", 3, 1, 0, 1, "maincpu", 0x8000)
- MCFG_MSX_LAYOUT_ROM("kdr", 3, 1, 1, 2, "maincpu", 0x10000)
- MCFG_MSX_LAYOUT_DISK3("disk", 3, 2, 1, 1, "maincpu", 0xc000)
- MCFG_MSX_LAYOUT_MUSIC("mus", 3, 3, 1, 1, "maincpu", 0x18000)
- MCFG_MSX_LAYOUT_ROM("bas", 3, 3, 2, 1, "maincpu", 0x1c000)
+ add_internal_slot(config, MSX_SLOT_ROM, "bios", 0, 0, 0, 2, "maincpu", 0x0000);
+ add_cartridge_slot<1>(config, MSX_SLOT_CARTRIDGE, "cartslot1", 1, 0, msx_cart, nullptr);
+ add_cartridge_slot<2>(config, MSX_SLOT_CARTRIDGE, "cartslot2", 2, 0, msx_cart, nullptr);
+ add_internal_slot(config, MSX_SLOT_RAM_MM, "ram_mm", 3, 0, 0, 4).set_total_size(0x10000).set_ramio_bits(0x80); /* 64KB Mapper RAM */
+ add_internal_slot(config, MSX_SLOT_ROM, "ext", 3, 1, 0, 1, "maincpu", 0x8000);
+ add_internal_slot(config, MSX_SLOT_ROM, "kdr", 3, 1, 1, 2, "maincpu", 0x10000);
+ add_internal_slot(config, MSX_SLOT_DISK3, "disk", 3, 2, 1, 1, "maincpu", 0xc000).set_tags("fdc", "fdc:0", "fdc:1");
+ add_internal_slot(config, MSX_SLOT_MUSIC, "mus", 3, 3, 1, 1, "maincpu", 0x18000).set_ym2413_tag("ym2413");
+ add_internal_slot(config, MSX_SLOT_ROM, "bas", 3, 3, 2, 1, "maincpu", 0x1c000);
MSX_SYSTEMFLAGS(config, "sysflags", m_maincpu, 0xff);
@@ -8227,7 +8422,7 @@ MACHINE_CONFIG_START(msx2_state::phc70fd2)
msx2p_floplist(config);
msx2_cartlist(config);
-MACHINE_CONFIG_END
+}
/* MSX2+ - Sony HB-F1XDJ */
@@ -8244,7 +8439,8 @@ ROM_START (hbf1xdj)
ROM_LOAD ("f1xjkfn.rom", 0, 0x40000, CRC(7016dfd0) SHA1(218d91eb6df2823c924d3774a9f455492a10aecb))
ROM_END
-MACHINE_CONFIG_START(msx2_state::hbf1xdj)
+void msx2_state::hbf1xdj(machine_config &config)
+{
msx2p(config);
// YM2149 (in S-1985 MSX Engine)
// FDC: wd2793, 1 3.5" DSDD drive
@@ -8252,16 +8448,15 @@ MACHINE_CONFIG_START(msx2_state::hbf1xdj)
// FM built-in
// S-1985 MSX Engine
- MCFG_MSX_LAYOUT_ROM("bios", 0, 0, 0, 2, "maincpu", 0x0000)
- MCFG_MSX_LAYOUT_SONY08("firm", 0, 3, 0, 4, "maincpu", 0x1c000)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot1", 1, 0)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot2", 2, 0)
- MCFG_MSX_LAYOUT_RAM_MM("ram_mm", 3, 0, 0x10000) /* 64KB Mapper RAM */
- MCFG_MSX_RAMIO_SET_BITS(0x80)
- MCFG_MSX_LAYOUT_ROM("ext", 3, 1, 0, 1, "maincpu", 0x8000)
- MCFG_MSX_LAYOUT_ROM("kdr", 3, 1, 1, 2, "maincpu", 0x10000)
- MCFG_MSX_LAYOUT_DISK1("disk", 3, 2, 1, 1, "maincpu", 0xc000)
- MCFG_MSX_LAYOUT_MUSIC("mus", 3, 3, 1, 1, "maincpu", 0x18000)
+ add_internal_slot(config, MSX_SLOT_ROM, "bios", 0, 0, 0, 2, "maincpu", 0x0000);
+ add_internal_slot(config, MSX_SLOT_SONY08, "firm", 0, 3, 0, 4, "maincpu", 0x1c000);
+ add_cartridge_slot<1>(config, MSX_SLOT_CARTRIDGE, "cartslot1", 1, 0, msx_cart, nullptr);
+ add_cartridge_slot<2>(config, MSX_SLOT_CARTRIDGE, "cartslot2", 2, 0, msx_cart, nullptr);
+ add_internal_slot(config, MSX_SLOT_RAM_MM, "ram_mm", 3, 0, 0, 4).set_total_size(0x10000).set_ramio_bits(0x80); /* 64KB Mapper RAM */
+ add_internal_slot(config, MSX_SLOT_ROM, "ext", 3, 1, 0, 1, "maincpu", 0x8000);
+ add_internal_slot(config, MSX_SLOT_ROM, "kdr", 3, 1, 1, 2, "maincpu", 0x10000);
+ add_internal_slot_mirrored(config, MSX_SLOT_DISK1, "disk", 3, 2, 1, 2, "maincpu", 0xc000).set_tags("fdc", "fdc:0", "fdc:1");
+ add_internal_slot(config, MSX_SLOT_MUSIC, "mus", 3, 3, 1, 1, "maincpu", 0x18000).set_ym2413_tag("ym2413");
MSX_SYSTEMFLAGS(config, "sysflags", m_maincpu, 0x00);
@@ -8274,7 +8469,7 @@ MACHINE_CONFIG_START(msx2_state::hbf1xdj)
msx2p_floplist(config);
msx2_cartlist(config);
-MACHINE_CONFIG_END
+}
/* MSX2+ - Sony HB-F1XV */
@@ -8291,7 +8486,8 @@ ROM_START (hbf1xv)
ROM_LOAD ("f1xvkfn.rom", 0, 0x40000, CRC(7016dfd0) SHA1(218d91eb6df2823c924d3774a9f455492a10aecb))
ROM_END
-MACHINE_CONFIG_START(msx2_state::hbf1xv)
+void msx2_state::hbf1xv(machine_config &config)
+{
msx2p(config);
// YM2149 (in S-1985 MSX Engine)
// FDC: wd2793, 1 3.5" DSDD drives
@@ -8299,16 +8495,15 @@ MACHINE_CONFIG_START(msx2_state::hbf1xv)
// FM built-in
// S-1985 MSX Engine
- MCFG_MSX_LAYOUT_ROM("bios", 0, 0, 0, 2, "maincpu", 0x0000)
- MCFG_MSX_LAYOUT_SONY08("firm", 0, 3, 0, 4, "maincpu", 0x1c000)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot1", 1, 0)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot2", 2, 0)
- MCFG_MSX_LAYOUT_RAM_MM("ram_mm", 3, 0, 0x10000) /* 64KB Mapper RAM */
- MCFG_MSX_RAMIO_SET_BITS(0x80)
- MCFG_MSX_LAYOUT_ROM("ext", 3, 1, 0, 1, "maincpu", 0x8000)
- MCFG_MSX_LAYOUT_ROM("kdr", 3, 1, 1, 2, "maincpu", 0x10000)
- MCFG_MSX_LAYOUT_DISK1("disk", 3, 2, 1, 1, "maincpu", 0xc000)
- MCFG_MSX_LAYOUT_MUSIC("mus", 3, 3, 1, 1, "maincpu", 0x18000)
+ add_internal_slot(config, MSX_SLOT_ROM, "bios", 0, 0, 0, 2, "maincpu", 0x0000);
+ add_internal_slot(config, MSX_SLOT_SONY08, "firm", 0, 3, 0, 4, "maincpu", 0x1c000);
+ add_cartridge_slot<1>(config, MSX_SLOT_CARTRIDGE, "cartslot1", 1, 0, msx_cart, nullptr);
+ add_cartridge_slot<2>(config, MSX_SLOT_CARTRIDGE, "cartslot2", 2, 0, msx_cart, nullptr);
+ add_internal_slot(config, MSX_SLOT_RAM_MM, "ram_mm", 3, 0, 0, 4).set_total_size(0x10000).set_ramio_bits(0x80); /* 64KB Mapper RAM */
+ add_internal_slot(config, MSX_SLOT_ROM, "ext", 3, 1, 0, 1, "maincpu", 0x8000);
+ add_internal_slot(config, MSX_SLOT_ROM, "kdr", 3, 1, 1, 2, "maincpu", 0x10000);
+ add_internal_slot_mirrored(config, MSX_SLOT_DISK1, "disk", 3, 2, 1, 2, "maincpu", 0xc000).set_tags("fdc", "fdc:0", "fdc:1");
+ add_internal_slot(config, MSX_SLOT_MUSIC, "mus", 3, 3, 1, 1, "maincpu", 0x18000).set_ym2413_tag("ym2413");
MSX_SYSTEMFLAGS(config, "sysflags", m_maincpu, 0x00);
@@ -8321,7 +8516,7 @@ MACHINE_CONFIG_START(msx2_state::hbf1xv)
msx2p_floplist(config);
msx2_cartlist(config);
-MACHINE_CONFIG_END
+}
/* MSX2+ - Sony HB-F9S+ */
@@ -8333,24 +8528,25 @@ ROM_START (hbf9sp)
ROM_LOAD ("f9spfrm2.rom", 0x10000, 0x8000, CRC(ea97069f) SHA1(2d1880d1f5a6944fcb1b198b997a3d90ecd1903d))
ROM_END
-MACHINE_CONFIG_START(msx2_state::hbf9sp)
+void msx2_state::hbf9sp(machine_config &config)
+{
msx2p(config);
// AY8910/YM2149?
// FDC: None, 0 drives
// 2 Cartridge slots?
- MCFG_MSX_LAYOUT_ROM("bios", 0, 0, 0, 2, "maincpu", 0x0000)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot1", 1, 0)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot2", 2, 0)
- MCFG_MSX_LAYOUT_ROM("ext", 3, 0, 0, 1, "maincpu", 0x8000)
- MCFG_MSX_LAYOUT_ROM("firm1", 3, 0, 1, 1, "maincpu", 0xc000)
- MCFG_MSX_LAYOUT_ROM("firm2", 3, 1, 1, 2, "maincpu", 0x10000)
- MCFG_MSX_LAYOUT_RAM_MM("ram_mm", 3, 2, 0x10000) /* 64KB?? Mapper RAM */
+ add_internal_slot(config, MSX_SLOT_ROM, "bios", 0, 0, 0, 2, "maincpu", 0x0000);
+ add_cartridge_slot<1>(config, MSX_SLOT_CARTRIDGE, "cartslot1", 1, 0, msx_cart, nullptr);
+ add_cartridge_slot<2>(config, MSX_SLOT_CARTRIDGE, "cartslot2", 2, 0, msx_cart, nullptr);
+ add_internal_slot(config, MSX_SLOT_ROM, "ext", 3, 0, 0, 1, "maincpu", 0x8000);
+ add_internal_slot(config, MSX_SLOT_ROM, "firm1", 3, 0, 1, 1, "maincpu", 0xc000);
+ add_internal_slot(config, MSX_SLOT_ROM, "firm2", 3, 1, 1, 2, "maincpu", 0x10000);
+ add_internal_slot(config, MSX_SLOT_RAM_MM, "ram_mm", 3, 2, 0, 4).set_total_size(0x10000); /* 64KB?? Mapper RAM */
MSX_SYSTEMFLAGS(config, "sysflags", m_maincpu, 0x00);
msx2_cartlist(config);
-MACHINE_CONFIG_END
+}
/* MSX Turbo-R - Panasonic FS-A1GT */
@@ -8366,7 +8562,8 @@ ROM_START (fsa1gt)
ROM_LOAD ("a1gtfirm.rom", 0x6c000, 0x400000, CRC(feefeadc) SHA1(e779c338eb91a7dea3ff75f3fde76b8af22c4a3a))
ROM_END
-MACHINE_CONFIG_START(msx2_state::fsa1gt)
+void msx2_state::fsa1gt(machine_config &config)
+{
msx2(config);
// AY8910/YM2149?
// FDC: tc8566af, 1 3.5" DSDD drive
@@ -8374,16 +8571,16 @@ MACHINE_CONFIG_START(msx2_state::fsa1gt)
// FM built-in
// MIDI
- MCFG_MSX_LAYOUT_ROM("bios", 0, 0, 0, 2, "maincpu", 0x0000)
- MCFG_MSX_LAYOUT_MUSIC("mus", 0, 2, 1, 1, "maincpu", 0x24000)
- MCFG_MSX_LAYOUT_ROM("opt", 0, 3, 1, 1, "maincpu", 0x28000)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot1", 1, 0)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot2", 2, 0)
- MCFG_MSX_LAYOUT_RAM_MM("ram_mm", 3, 0, 0x20000) /* 128KB?? Mapper RAM */
- MCFG_MSX_LAYOUT_ROM("ext", 3, 1, 0, 1, "maincpu", 0x8000)
- MCFG_MSX_LAYOUT_ROM("kdr", 3, 1, 1, 2, "maincpu", 0x1c000)
- MCFG_MSX_LAYOUT_DISK4("dos", 3, 2, 1, 3, "maincpu", 0xc000)
- MCFG_MSX_LAYOUT_ROM("firm", 3, 3, 0, 4, "maincpu", 0x6c000)
+ add_internal_slot(config, MSX_SLOT_ROM, "bios", 0, 0, 0, 2, "maincpu", 0x0000);
+ add_internal_slot(config, MSX_SLOT_MUSIC, "mus", 0, 2, 1, 1, "maincpu", 0x24000).set_ym2413_tag("ym2413");
+ add_internal_slot(config, MSX_SLOT_ROM, "opt", 0, 3, 1, 1, "maincpu", 0x28000);
+ add_cartridge_slot<1>(config, MSX_SLOT_CARTRIDGE, "cartslot1", 1, 0, msx_cart, nullptr);
+ add_cartridge_slot<2>(config, MSX_SLOT_CARTRIDGE, "cartslot2", 2, 0, msx_cart, nullptr);
+ add_internal_slot(config, MSX_SLOT_RAM_MM, "ram_mm", 3, 0, 0, 4).set_total_size(0x20000); /* 128KB?? Mapper RAM */
+ add_internal_slot(config, MSX_SLOT_ROM, "ext", 3, 1, 0, 1, "maincpu", 0x8000);
+ add_internal_slot(config, MSX_SLOT_ROM, "kdr", 3, 1, 1, 2, "maincpu", 0x1c000);
+ add_internal_slot(config, MSX_SLOT_DISK4, "dos", 3, 2, 1, 3, "maincpu", 0xc000).set_tags("fdc", "fdc:0", "fdc:1");
+ add_internal_slot(config, MSX_SLOT_ROM, "firm", 3, 3, 0, 4, "maincpu", 0x6c000);
MSX_SYSTEMFLAGS(config, "sysflags", m_maincpu, 0x00);
@@ -8394,7 +8591,7 @@ MACHINE_CONFIG_START(msx2_state::fsa1gt)
msxr_floplist(config);
msx2_cartlist(config);
-MACHINE_CONFIG_END
+}
/* MSX Turbo-R - Panasonic FS-A1ST */
@@ -8410,23 +8607,24 @@ ROM_START (fsa1st)
ROM_LOAD ("a1stfirm.rom", 0x6c000, 0x400000, CRC(139ac99c) SHA1(c212b11fda13f83dafed688c54d098e7e47ab225))
ROM_END
-MACHINE_CONFIG_START(msx2_state::fsa1st)
+void msx2_state::fsa1st(machine_config &config)
+{
msx2(config);
// AY8910/YM2149?
// FDC: tc8566af, 1 3.5" DSDD drive
// 2 Cartridge slots
// FM built-in
- MCFG_MSX_LAYOUT_ROM("bios", 0, 0, 0, 2, "maincpu", 0x0000)
- MCFG_MSX_LAYOUT_MUSIC("mus", 0, 2, 1, 1, "maincpu", 0x24000)
- MCFG_MSX_LAYOUT_ROM("opt", 0, 3, 1, 1, "maincpu", 0x28000)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot1", 1, 0)
- MCFG_MSX_LAYOUT_CARTRIDGE("cartslot2", 2, 0)
- MCFG_MSX_LAYOUT_RAM_MM("ram_mm", 3, 0, 0x20000) /* 128KB?? Mapper RAM */
- MCFG_MSX_LAYOUT_ROM("ext", 3, 1, 0, 1, "maincpu", 0x8000)
- MCFG_MSX_LAYOUT_ROM("kdr", 3, 1, 1, 2, "maincpu", 0x1c000)
- MCFG_MSX_LAYOUT_DISK4("dos", 3, 2, 1, 3, "maincpu", 0xc000)
- MCFG_MSX_LAYOUT_ROM("firm", 3, 3, 0, 4, "maincpu", 0x6c000)
+ add_internal_slot(config, MSX_SLOT_ROM, "bios", 0, 0, 0, 2, "maincpu", 0x0000);
+ add_internal_slot(config, MSX_SLOT_MUSIC, "mus", 0, 2, 1, 1, "maincpu", 0x24000).set_ym2413_tag("ym2413");
+ add_internal_slot(config, MSX_SLOT_ROM, "opt", 0, 3, 1, 1, "maincpu", 0x28000);
+ add_cartridge_slot<1>(config, MSX_SLOT_CARTRIDGE, "cartslot1", 1, 0, msx_cart, nullptr);
+ add_cartridge_slot<2>(config, MSX_SLOT_CARTRIDGE, "cartslot2", 1, 0, msx_cart, nullptr);
+ add_internal_slot(config, MSX_SLOT_RAM_MM, "ram_mm", 3, 0, 0, 4).set_total_size(0x20000); /* 128KB?? Mapper RAM */
+ add_internal_slot(config, MSX_SLOT_ROM, "ext", 3, 1, 0, 1, "maincpu", 0x8000);
+ add_internal_slot(config, MSX_SLOT_ROM, "kdr", 3, 1, 1, 2, "maincpu", 0x1c000);
+ add_internal_slot(config, MSX_SLOT_DISK4, "dos", 3, 2, 1, 3, "maincpu", 0xc000).set_tags("fdc", "fdc:0", "fdc:1");
+ add_internal_slot(config, MSX_SLOT_ROM, "firm", 3, 3, 0, 4, "maincpu", 0x6c000);
MSX_SYSTEMFLAGS(config, "sysflags", m_maincpu, 0x00);
@@ -8437,7 +8635,7 @@ MACHINE_CONFIG_START(msx2_state::fsa1st)
msxr_floplist(config);
msx2_cartlist(config);
-MACHINE_CONFIG_END
+}
/* YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME */
diff --git a/src/mame/drivers/mt735.cpp b/src/mame/drivers/mt735.cpp
index a8dad4eaca1..c9a2550a648 100644
--- a/src/mame/drivers/mt735.cpp
+++ b/src/mame/drivers/mt735.cpp
@@ -64,10 +64,11 @@ void mt735_state::mt735_map(address_map &map)
static INPUT_PORTS_START( mt735 )
INPUT_PORTS_END
-MACHINE_CONFIG_START(mt735_state::mt735)
- MCFG_DEVICE_ADD("maincpu", M68000, XTAL(48'000'000)/6)
- MCFG_DEVICE_PROGRAM_MAP(mt735_map)
-MACHINE_CONFIG_END
+void mt735_state::mt735(machine_config &config)
+{
+ M68000(config, m_cpu, XTAL(48'000'000)/6);
+ m_cpu->set_addrmap(AS_PROGRAM, &mt735_state::mt735_map);
+}
ROM_START( mt735 )
ROM_REGION( 0x40000, "maincpu", 0 )
diff --git a/src/mame/drivers/mtx.cpp b/src/mame/drivers/mtx.cpp
index 72b4d4f84b9..e322d4ab9c2 100644
--- a/src/mame/drivers/mtx.cpp
+++ b/src/mame/drivers/mtx.cpp
@@ -11,8 +11,7 @@
TODO:
- cassette
- - cartridges
- - SDX/FDX floppy
+ - FDX floppy
- HDX hard disk
- HRX high resolution graphics
- "Silicon" disks
@@ -24,14 +23,8 @@
#include "includes/mtx.h"
#include "bus/centronics/ctronics.h"
-#include "cpu/z80/z80.h"
-#include "machine/z80daisy.h"
#include "imagedev/cassette.h"
#include "imagedev/snapquik.h"
-#include "machine/ram.h"
-#include "machine/z80ctc.h"
-#include "machine/z80dart.h"
-#include "sound/sn76496.h"
#include "video/tms9928a.h"
#include "softlist.h"
@@ -58,13 +51,13 @@ void mtx_state::mtx_io(address_map &map)
{
map.global_mask(0xff);
map(0x00, 0x00).rw(FUNC(mtx_state::mtx_strobe_r), FUNC(mtx_state::mtx_bankswitch_w));
- map(0x01, 0x01).rw("tms9929a", FUNC(tms9929a_device::vram_r), FUNC(tms9929a_device::vram_w));
- map(0x02, 0x02).rw("tms9929a", FUNC(tms9929a_device::register_r), FUNC(tms9929a_device::register_w));
+ map(0x01, 0x01).rw("tms9929a", FUNC(tms9929a_device::vram_read), FUNC(tms9929a_device::vram_write));
+ map(0x02, 0x02).rw("tms9929a", FUNC(tms9929a_device::register_read), FUNC(tms9929a_device::register_write));
map(0x03, 0x03).rw(FUNC(mtx_state::mtx_sound_strobe_r), FUNC(mtx_state::mtx_cst_w));
map(0x04, 0x04).r(FUNC(mtx_state::mtx_prt_r)).w("cent_data_out", FUNC(output_latch_device::bus_w));
map(0x05, 0x05).rw(FUNC(mtx_state::mtx_key_lo_r), FUNC(mtx_state::mtx_sense_w));
map(0x06, 0x06).rw(FUNC(mtx_state::mtx_key_hi_r), FUNC(mtx_state::mtx_sound_latch_w));
-// map(0x07, 0x07) PIO
+ // map(0x07, 0x07) PIO
map(0x08, 0x0b).rw(m_z80ctc, FUNC(z80ctc_device::read), FUNC(z80ctc_device::write));
map(0x1f, 0x1f).w(FUNC(mtx_state::mtx_cst_motor_w));
map(0x30, 0x31).w(FUNC(mtx_state::hrx_address_w));
@@ -202,6 +195,12 @@ static INPUT_PORTS_START( mtx512 )
PORT_DIPSETTING(0x08, DEF_STR(Off) )
PORT_DIPSETTING(0x00, DEF_STR(On) )
PORT_BIT( 0xf3, IP_ACTIVE_LOW, IPT_UNUSED)
+
+ PORT_START("keyboard_rom")
+ PORT_CONFNAME(0x03, 0x00, "Keyboard ROM")
+ PORT_CONFSETTING(0x00, "None")
+ PORT_CONFSETTING(0x01, "Denmark")
+ PORT_CONFSETTING(0x02, "Finland")
INPUT_PORTS_END
/***************************************************************************
@@ -243,7 +242,7 @@ WRITE_LINE_MEMBER(mtx_state::ctc_trg2_w)
static const z80_daisy_config mtx_daisy_chain[] =
{
- { Z80CTC_TAG },
+ { "z80ctc" },
{ nullptr }
};
@@ -253,8 +252,8 @@ static const z80_daisy_config mtx_daisy_chain[] =
static const z80_daisy_config rs128_daisy_chain[] =
{
- { Z80CTC_TAG },
- { Z80DART_TAG },
+ { "z80ctc" },
+ { "z80dart" },
{ nullptr }
};
@@ -280,22 +279,19 @@ WRITE_LINE_MEMBER(mtx_state::mtx_tms9929a_interrupt)
***************************************************************************/
/*-------------------------------------------------
- MACHINE_CONFIG_START( mtx512 )
+ machine_config( mtx512 )
-------------------------------------------------*/
-MACHINE_CONFIG_START(mtx_state::mtx512)
-
+void mtx_state::mtx512(machine_config &config)
+{
/* basic machine hardware */
- Z80(config, m_maincpu, XTAL(4'000'000));
+ Z80(config, m_maincpu, 4_MHz_XTAL);
m_maincpu->set_addrmap(AS_PROGRAM, &mtx_state::mtx_mem);
m_maincpu->set_addrmap(AS_IO, &mtx_state::mtx_io);
m_maincpu->set_daisy_config(mtx_daisy_chain);
- MCFG_MACHINE_START_OVERRIDE(mtx_state,mtx512)
- MCFG_MACHINE_RESET_OVERRIDE(mtx_state,mtx512)
-
/* video hardware */
- tms9929a_device &vdp(TMS9929A(config, "tms9929a", XTAL(10'738'635)));
+ tms9929a_device &vdp(TMS9929A(config, "tms9929a", 10.6875_MHz_XTAL));
vdp.set_screen("screen");
vdp.set_vram_size(0x4000);
vdp.int_callback().set(FUNC(mtx_state::mtx_tms9929a_interrupt));
@@ -303,50 +299,61 @@ MACHINE_CONFIG_START(mtx_state::mtx512)
/* sound hardware */
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD(SN76489A_TAG, SN76489A, XTAL(4'000'000))
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.00)
+ SN76489A(config, m_sn, 4_MHz_XTAL).add_route(ALL_OUTPUTS, "mono", 1.00);
/* devices */
- Z80CTC(config, m_z80ctc, XTAL(4'000'000));
+ Z80CTC(config, m_z80ctc, 4_MHz_XTAL);
m_z80ctc->intr_callback().set_inputline(m_maincpu, INPUT_LINE_IRQ0);
m_z80ctc->zc_callback<1>().set(FUNC(mtx_state::ctc_trg1_w));
m_z80ctc->zc_callback<2>().set(FUNC(mtx_state::ctc_trg2_w));
- MCFG_TIMER_DRIVER_ADD_PERIODIC("z80ctc_timer", mtx_state, ctc_tick, attotime::from_hz(XTAL(4'000'000)/13))
+ TIMER(config, "z80ctc_timer").configure_periodic(FUNC(mtx_state::ctc_tick), attotime::from_hz(4_MHz_XTAL/13));
+
+ CENTRONICS(config, m_centronics, centronics_devices, "printer");
+ m_centronics->busy_handler().set(FUNC(mtx_state::write_centronics_busy));
+ m_centronics->fault_handler().set(FUNC(mtx_state::write_centronics_fault));
+ m_centronics->perror_handler().set(FUNC(mtx_state::write_centronics_perror));
+ m_centronics->select_handler().set(FUNC(mtx_state::write_centronics_select));
- MCFG_DEVICE_ADD(m_centronics, CENTRONICS, centronics_devices, "printer")
- MCFG_CENTRONICS_BUSY_HANDLER(WRITELINE(*this, mtx_state, write_centronics_busy))
- MCFG_CENTRONICS_FAULT_HANDLER(WRITELINE(*this, mtx_state, write_centronics_fault))
- MCFG_CENTRONICS_PERROR_HANDLER(WRITELINE(*this, mtx_state, write_centronics_perror))
- MCFG_CENTRONICS_SELECT_HANDLER(WRITELINE(*this, mtx_state, write_centronics_select))
+ output_latch_device &cent_data_out(OUTPUT_LATCH(config, "cent_data_out"));
+ m_centronics->set_output_latch(cent_data_out);
- MCFG_CENTRONICS_OUTPUT_LATCH_ADD("cent_data_out", "centronics")
+ snapshot_image_device &snapshot(SNAPSHOT(config, "snapshot"));
+ snapshot.set_handler(snapquick_load_delegate(&SNAPSHOT_LOAD_NAME(mtx_state, mtx), this), "mtx", attotime::from_seconds(1));
+ quickload_image_device &quickload(QUICKLOAD(config, "quickload"));
+ quickload.set_handler(snapquick_load_delegate(&QUICKLOAD_LOAD_NAME(mtx_state, mtx), this), "run", attotime::from_seconds(1));
- MCFG_SNAPSHOT_ADD("snapshot", mtx_state, mtx, "mtx", 1)
- MCFG_CASSETTE_ADD("cassette")
- MCFG_CASSETTE_DEFAULT_STATE(CASSETTE_PLAY | CASSETTE_MOTOR_DISABLED | CASSETTE_SPEAKER_MUTED)
- MCFG_CASSETTE_INTERFACE("mtx_cass")
+ CASSETTE(config, m_cassette);
+ m_cassette->set_default_state(CASSETTE_PLAY | CASSETTE_MOTOR_DISABLED | CASSETTE_SPEAKER_MUTED);
+ m_cassette->set_interface("mtx_cass");
- MCFG_TIMER_DRIVER_ADD_PERIODIC("cassette_timer", mtx_state, cassette_tick, attotime::from_hz(44100))
+ TIMER(config, "cassette_timer").configure_periodic(FUNC(mtx_state::cassette_tick), attotime::from_hz(44100));
/* internal ram */
RAM(config, m_ram).set_default_size("64K").set_extra_options("96K,128K,192K,320K,448K,512K");
/* rom extension board */
- MCFG_GENERIC_SOCKET_ADD("extrom", generic_plain_slot, "mtx_rom")
- MCFG_GENERIC_EXTENSIONS("bin,rom")
- MCFG_GENERIC_LOAD(mtx_state, extrom_load)
+ GENERIC_SOCKET(config, m_extrom, generic_plain_slot, "mtx_rom", "bin,rom");
+ m_extrom->set_device_load(device_image_load_delegate(&mtx_state::device_image_load_extrom_load, this));
+
+ /* rs232 board with disk drive bus */
+ MTX_EXP_SLOT(config, m_exp, mtx_expansion_devices, nullptr);
+ m_exp->set_program_space(m_maincpu, AS_PROGRAM);
+ m_exp->set_io_space(m_maincpu, AS_IO);
+ m_exp->int_handler().set_inputline(m_maincpu, INPUT_LINE_IRQ0);
+ m_exp->nmi_handler().set_inputline(m_maincpu, INPUT_LINE_NMI);
+ m_exp->busreq_handler().set_inputline(m_maincpu, Z80_INPUT_LINE_BUSRQ);
/* cartridge slot */
- MCFG_GENERIC_SOCKET_ADD("rompak", generic_plain_slot, "mtx_cart")
- MCFG_GENERIC_EXTENSIONS("bin,rom")
- MCFG_GENERIC_LOAD(mtx_state, rompak_load)
+ GENERIC_CARTSLOT(config, m_rompak, generic_plain_slot, "mtx_cart", "bin,rom");
+ m_rompak->set_device_load(device_image_load_delegate(&mtx_state::device_image_load_rompak_load, this));
/* software lists */
- MCFG_SOFTWARE_LIST_ADD("cass_list", "mtx_cass")
- MCFG_SOFTWARE_LIST_ADD("cart_list", "mtx_cart")
- MCFG_SOFTWARE_LIST_ADD("rom_list", "mtx_rom")
-MACHINE_CONFIG_END
+ SOFTWARE_LIST(config, "cass_list").set_original("mtx_cass");
+ SOFTWARE_LIST(config, "flop_list").set_original("mtx_flop");
+ SOFTWARE_LIST(config, "cart_list").set_original("mtx_cart");
+ SOFTWARE_LIST(config, "rom_list").set_original("mtx_rom");
+}
void mtx_state::mtx500(machine_config &config)
{
@@ -357,7 +364,7 @@ void mtx_state::mtx500(machine_config &config)
}
/*-------------------------------------------------
- MACHINE_CONFIG_START( rs128 )
+ machine_config( rs128 )
-------------------------------------------------*/
void mtx_state::rs128(machine_config &config)
@@ -369,7 +376,7 @@ void mtx_state::rs128(machine_config &config)
m_maincpu->set_daisy_config(rs128_daisy_chain);
/* devices */
- Z80DART(config, m_z80dart, XTAL(4'000'000));
+ Z80DART(config, m_z80dart, 4_MHz_XTAL);
m_z80dart->out_int_callback().set_inputline(m_maincpu, INPUT_LINE_IRQ0);
/* internal ram */
@@ -382,30 +389,23 @@ void mtx_state::rs128(machine_config &config)
ROM_START( mtx512 )
ROM_REGION( 0x02000, "user1", 0 )
- ROM_LOAD( "osrom", 0x0000, 0x2000, CRC(9ca858cc) SHA1(3804503a58f0bcdea96bb6488833782ebd03976d) )
+ ROM_SYSTEM_BIOS( 0, "uk", "UK" )
+ ROMX_LOAD( "mtx1a.9h", 0x0000, 0x2000, CRC(9ca858cc) SHA1(3804503a58f0bcdea96bb6488833782ebd03976d), ROM_BIOS(0) ) /* OS */
+ ROM_SYSTEM_BIOS( 1, "de", "German" )
+ ROMX_LOAD( "mtx2a.9h", 0x0000, 0x2000, CRC(1c7bbe98) SHA1(8c950051b830e5e0c41072d6bd893151acd3839d), ROM_BIOS(1) ) /* OS */
ROM_REGION( 0x10000, "user2", ROMREGION_ERASEFF )
- ROM_LOAD( "basicrom", 0x0000, 0x2000, CRC(87b4e59c) SHA1(c49782a82a7f068c1195cd967882ba9edd546eaf) )
- ROM_LOAD( "assemrom", 0x2000, 0x2000, CRC(9d7538c3) SHA1(d1882c4ea61a68b1715bd634ded5603e18a99c5f) )
+ ROMX_LOAD( "mtx1b.8h", 0x0000, 0x2000, CRC(87b4e59c) SHA1(c49782a82a7f068c1195cd967882ba9edd546eaf), ROM_BIOS(0) ) /* BASIC */
+ ROMX_LOAD( "mtx1c.10h", 0x2000, 0x2000, CRC(9d7538c3) SHA1(d1882c4ea61a68b1715bd634ded5603e18a99c5f), ROM_BIOS(0) ) /* ASSEM */
+ ROMX_LOAD( "mtx2b.8h", 0x0000, 0x2000, CRC(599d5b6b) SHA1(3ec1f7f476a21ca3206012ded22198c020b47f7d), ROM_BIOS(1) ) /* BASIC */
+ ROMX_LOAD( "mtx1c.10h", 0x2000, 0x2000, CRC(9d7538c3) SHA1(d1882c4ea61a68b1715bd634ded5603e18a99c5f), ROM_BIOS(1) ) /* ASSEM */
- /* Keyboard ROMs are piggy-backed on top of the OS ROM, wired to be selected as ROM 7 */
+ /* Keyboard PROMs (N82S181N) are piggy-backed on top of the OS ROM, wired to be selected as ROM 7 */
/* Country character sets documented in the Operators Manual are:
U.S.A, France, Germany, England, Denmark, Sweden, Italy, Spain */
- ROM_DEFAULT_BIOS("us")
- ROM_SYSTEM_BIOS( 0, "us", "U.S.A." )
- ROM_SYSTEM_BIOS( 1, "dk", "Denmark" )
- ROMX_LOAD( "danish.rom", 0xe000, 0x2000, CRC(9c1b3fae) SHA1(82bc021660d88eebcf0c4d3856558ee9acc1c348), ROM_BIOS(1) )
- ROM_SYSTEM_BIOS( 2, "fi", "Finland" )
- ROMX_LOAD( "finnish.rom", 0xe000, 0x2000, CRC(9b96cf72) SHA1(b46d1a733e0e635ccdaf4752cc370d793c3b5c55), ROM_BIOS(2) )
-
- ROM_REGION( 0x2000, "sdx", 0 )
- ROM_LOAD( "sdx", 0x0000, 0x2000, NO_DUMP )
-
- ROM_REGION( 0x2000, "mtx", 0 )
- ROM_LOAD( "sm2 fdcx1 v03", 0x0000, 0x2000, NO_DUMP )
-
- ROM_REGION( 0x1000, MC6845_TAG, 0 )
- ROM_LOAD( "80z.bin", 0x0000, 0x1000, CRC(ea6fe865) SHA1(f84883f79bed34501e5828336894fad929bddbb5) )
+ ROM_REGION( 0x4000, "keyboard_rom", 0 )
+ ROM_LOAD( "danish.rom", 0x0000, 0x2000, CRC(9c1b3fae) SHA1(82bc021660d88eebcf0c4d3856558ee9acc1c348) )
+ ROM_LOAD( "finnish.rom", 0x2000, 0x2000, CRC(9b96cf72) SHA1(b46d1a733e0e635ccdaf4752cc370d793c3b5c55) )
/* Device GAL16V8 converted from PAL14L4 JEDEC map */
ROM_REGION( 0x117, "plds", 0 )
diff --git a/src/mame/drivers/mugsmash.cpp b/src/mame/drivers/mugsmash.cpp
index dd6c2626a8c..55d8c7d9358 100644
--- a/src/mame/drivers/mugsmash.cpp
+++ b/src/mame/drivers/mugsmash.cpp
@@ -398,25 +398,25 @@ void mugsmash_state::machine_start()
{
}
-MACHINE_CONFIG_START(mugsmash_state::mugsmash)
-
- MCFG_DEVICE_ADD("maincpu", M68000, 12000000)
- MCFG_DEVICE_PROGRAM_MAP(mugsmash_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", mugsmash_state, irq6_line_hold)
+void mugsmash_state::mugsmash(machine_config &config)
+{
+ M68000(config, m_maincpu, 12000000);
+ m_maincpu->set_addrmap(AS_PROGRAM, &mugsmash_state::mugsmash_map);
+ m_maincpu->set_vblank_int("screen", FUNC(mugsmash_state::irq6_line_hold));
- MCFG_DEVICE_ADD("audiocpu", Z80, 4000000) /* Guess */
- MCFG_DEVICE_PROGRAM_MAP(mugsmash_sound_map)
+ Z80(config, m_audiocpu, 4000000); /* Guess */
+ m_audiocpu->set_addrmap(AS_PROGRAM, &mugsmash_state::mugsmash_sound_map);
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(40*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 40*8-1, 1*8, 31*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(mugsmash_state, screen_update_mugsmash)
- MCFG_SCREEN_PALETTE(m_palette)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(40*8, 32*8);
+ screen.set_visarea(0*8, 40*8-1, 1*8, 31*8-1);
+ screen.set_screen_update(FUNC(mugsmash_state::screen_update_mugsmash));
+ screen.set_palette(m_palette);
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_mugsmash)
+ GFXDECODE(config, m_gfxdecode, m_palette, gfx_mugsmash);
PALETTE(config, m_palette).set_format(palette_device::xRGB_555, 0x300);
@@ -431,10 +431,10 @@ MACHINE_CONFIG_START(mugsmash_state::mugsmash)
ymsnd.add_route(0, "lspeaker", 1.00); /* music */
ymsnd.add_route(1, "rspeaker", 1.00);
- MCFG_DEVICE_ADD("oki", OKIM6295, 1122000, okim6295_device::PIN7_HIGH) // clock frequency & pin 7 not verified
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 0.50) /* sound fx */
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 0.50)
-MACHINE_CONFIG_END
+ okim6295_device &oki(OKIM6295(config, "oki", 1122000, okim6295_device::PIN7_HIGH)); // clock frequency & pin 7 not verified
+ oki.add_route(ALL_OUTPUTS, "lspeaker", 0.50); /* sound fx */
+ oki.add_route(ALL_OUTPUTS, "rspeaker", 0.50);
+}
ROM_START( mugsmash )
ROM_REGION( 0x80000, "maincpu", 0 ) /* 68000 Code */
diff --git a/src/mame/drivers/multfish.cpp b/src/mame/drivers/multfish.cpp
index b3365965d1e..a0e1d5bc07b 100644
--- a/src/mame/drivers/multfish.cpp
+++ b/src/mame/drivers/multfish.cpp
@@ -309,19 +309,19 @@ WRITE8_MEMBER(igrosoft_gamble_state::igrosoft_gamble_bank_w)
READ8_MEMBER(igrosoft_gamble_state::igrosoft_gamble_timekeeper_r)
{
- return m_m48t35->read(space, offset + 0x6000, 0xff);
+ return m_m48t35->read(offset + 0x6000);
}
WRITE8_MEMBER(igrosoft_gamble_state::igrosoft_gamble_timekeeper_w)
{
- m_m48t35->write(space, offset + 0x6000, data, 0xff);
+ m_m48t35->write(offset + 0x6000, data);
}
READ8_MEMBER(igrosoft_gamble_state::bankedram_r)
{
if ((m_rambk & 0x80) == 0x00)
{
- return m_m48t35->read(space, offset + 0x2000*(m_rambk & 0x03), 0xff);
+ return m_m48t35->read(offset + 0x2000*(m_rambk & 0x03));
}
else
{
@@ -334,7 +334,7 @@ WRITE8_MEMBER(igrosoft_gamble_state::bankedram_w)
{
if ((m_rambk & 0x80) == 0x00)
{
- m_m48t35->write(space, offset + 0x2000*(m_rambk & 0x03), data, 0xff);
+ m_m48t35->write(offset + 0x2000*(m_rambk & 0x03), data);
}
else
{
@@ -657,6 +657,31 @@ void igrosoft_gamble_state::init_fcockt2ent()
m_xor_paltype = 2;
ent_decode(machine(), 0x33, 0xcc, 0xaa, 0x88, 0x14140);
}
+void igrosoft_gamble_state::init_sweetlent()
+{
+ m_xor_palette = 0xeadb;
+ m_xor_paltype = 2;
+ ent_decode(machine(), 0x44, 0xdd, 0xdd, 0x22, 0x6c6c0);
+}
+void igrosoft_gamble_state::init_islandent()
+{
+ m_xor_palette = 0xdadb;
+ m_xor_paltype = 2;
+ ent_decode(machine(), 0x66, 0x22, 0x33, 0xcc, 0x64e40);
+}
+void igrosoft_gamble_state::init_pirateent()
+{
+ m_xor_palette = 0xbcdb;
+ m_xor_paltype = 2;
+ ent_decode(machine(), 0x99, 0x22, 0xee, 0x66, 0x54d40);
+}
+
+void igrosoft_gamble_state::init_rollfruit()
+{
+ // m_xor_palette = 0xbff7;
+ // needs gfx and palette descrambles
+ // encryption looks similar to Crazy Monkey 2
+}
void igrosoft_gamble_state::init_crzmon2()
{
@@ -952,8 +977,11 @@ void igrosoft_gamble_state::igrosoft_gamble_portmap(address_map &map)
map(0xb5, 0xb5).w(FUNC(igrosoft_gamble_state::igrosoft_gamble_bank_w)); // Garage Ent banking
map(0xb6, 0xb6).w(FUNC(igrosoft_gamble_state::igrosoft_gamble_bank_w)); // Resident Ent banking
map(0xb7, 0xb7).w(FUNC(igrosoft_gamble_state::igrosoft_gamble_bank_w)); // Rock Climber Ent banking
+ map(0xb8, 0xb8).w(FUNC(igrosoft_gamble_state::igrosoft_gamble_bank_w)); // Sweet Life Ent banking
map(0xb9, 0xb9).w(FUNC(igrosoft_gamble_state::igrosoft_gamble_bank_w)); // Sweet Life 2 Ent banking
+ map(0xba, 0xba).w(FUNC(igrosoft_gamble_state::igrosoft_gamble_bank_w)); // Island Ent banking
map(0xbb, 0xbb).w(FUNC(igrosoft_gamble_state::igrosoft_gamble_bank_w)); // Island 2 Ent banking
+ map(0xbc, 0xbc).w(FUNC(igrosoft_gamble_state::igrosoft_gamble_bank_w)); // Pirate Ent banking
map(0xbd, 0xbd).w(FUNC(igrosoft_gamble_state::igrosoft_gamble_bank_w)); // Pirate 2 Ent banking
map(0xbe, 0xbe).w(FUNC(igrosoft_gamble_state::igrosoft_gamble_bank_w)); // Keks Ent banking
map(0xbf, 0xbf).w(FUNC(igrosoft_gamble_state::igrosoft_gamble_bank_w)); // Gnome Ent banking
@@ -963,7 +991,7 @@ void igrosoft_gamble_state::igrosoft_gamble_portmap(address_map &map)
map(0xcc, 0xcc).w(FUNC(igrosoft_gamble_state::igrosoft_gamble_bank_w)); // Sweet Life 2 lottery banking
map(0xcd, 0xcd).w(FUNC(igrosoft_gamble_state::igrosoft_gamble_bank_w)); // Island 2 lottery banking
map(0xce, 0xce).w(FUNC(igrosoft_gamble_state::igrosoft_gamble_bank_w)); // Pirate 2 lottery banking
- map(0xd0, 0xd0).w(FUNC(igrosoft_gamble_state::igrosoft_gamble_bank_w)); // rollfr_4 banking
+ map(0xd0, 0xd0).w(FUNC(igrosoft_gamble_state::igrosoft_gamble_bank_w)); // rollfr_4 rollfr_5 banking
map(0xe1, 0xe1).w(FUNC(igrosoft_gamble_state::igrosoft_gamble_bank_w)); // Island 2 banking
map(0xe5, 0xe5).w(FUNC(igrosoft_gamble_state::igrosoft_gamble_bank_w)); // Gnome banking
map(0xe8, 0xe8).w(FUNC(igrosoft_gamble_state::igrosoft_gamble_bank_w)); // Sweet Life 2 banking
@@ -1025,40 +1053,41 @@ void igrosoft_gamble_state::machine_reset()
m_rambk = 0;
}
-MACHINE_CONFIG_START(igrosoft_gamble_state::igrosoft_gamble)
+void igrosoft_gamble_state::igrosoft_gamble(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, XTAL(24'000'000)/4)
- MCFG_DEVICE_PROGRAM_MAP(igrosoft_gamble_map)
- MCFG_DEVICE_IO_MAP(igrosoft_gamble_portmap)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", igrosoft_gamble_state, irq0_line_hold)
+ Z80(config, m_maincpu, XTAL(24'000'000)/4);
+ m_maincpu->set_addrmap(AS_PROGRAM, &igrosoft_gamble_state::igrosoft_gamble_map);
+ m_maincpu->set_addrmap(AS_IO, &igrosoft_gamble_state::igrosoft_gamble_portmap);
+ m_maincpu->set_vblank_int("screen", FUNC(igrosoft_gamble_state::irq0_line_hold));
WATCHDOG_TIMER(config, "watchdog");
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(64*16, 32*16)
- MCFG_SCREEN_VISIBLE_AREA(17*16, 1024-16*7-1, 1*16, 32*16-1*16-1)
- MCFG_SCREEN_UPDATE_DRIVER(igrosoft_gamble_state, screen_update_igrosoft_gamble)
- MCFG_SCREEN_PALETTE("palette")
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_refresh_hz(60);
+ m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ m_screen->set_size(64*16, 32*16);
+ m_screen->set_visarea(17*16, 1024-16*7-1, 1*16, 32*16-1*16-1);
+ m_screen->set_screen_update(FUNC(igrosoft_gamble_state::screen_update_igrosoft_gamble));
+ m_screen->set_palette(m_palette);
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_igrosoft_gamble)
- MCFG_PALETTE_ADD("palette", 0x1000)
+ GFXDECODE(config, m_gfxdecode, m_palette, gfx_igrosoft_gamble);
+ PALETTE(config, m_palette).set_entries(0x1000);
SPEAKER(config, "mono").front_center();
AY8910(config, "aysnd", 6000000/4).add_route(ALL_OUTPUTS, "mono", 0.30);
- MCFG_DEVICE_ADD("m48t35", M48T35, 0)
- MCFG_HOPPER_ADD("hopper", attotime::from_msec(100), TICKET_MOTOR_ACTIVE_HIGH, TICKET_STATUS_ACTIVE_HIGH)
-MACHINE_CONFIG_END
+ M48T35(config, m_m48t35, 0);
+ HOPPER(config, m_hopper, attotime::from_msec(100), TICKET_MOTOR_ACTIVE_HIGH, TICKET_STATUS_ACTIVE_HIGH);
+}
-MACHINE_CONFIG_START(igrosoft_gamble_state::rollfr)
+void igrosoft_gamble_state::rollfr(machine_config &config)
+{
igrosoft_gamble(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_IO_MAP(rollfr_portmap)
-MACHINE_CONFIG_END
+ m_maincpu->set_addrmap(AS_IO, &igrosoft_gamble_state::rollfr_portmap);
+}
@@ -1962,6 +1991,24 @@ ROM_START( sweetl_2 ) // 070412
ROM_LOAD( "m48t35", 0x0000, 0x8000, CRC(b5deda35) SHA1(adc4dbbd73f9c4305abc594617218c32c31e0b8c) )
ROM_END
+ROM_START( sweetl_3 ) // 090720 entertainment
+ ROM_REGION( 0x40000, "maincpu", 0 ) // z80 code, banked
+ ROM_LOAD( "sl_e_090720.rom", 0x00000, 0x40000, CRC(97b2f1dd) SHA1(1c14dbeb35fe58f65c2a438e7443d3c37a00d48f) )
+
+ ROM_REGION( 0x400000, "gfx", 0 )
+ ROM_LOAD( "sweetlife_ent.001", 0x000000, 0x80000, CRC(954cec46) SHA1(1068cfe2d68f68db7523c4cd9aad67f9eba5f370) )
+ ROM_LOAD( "sweetlife_ent.002", 0x100000, 0x80000, CRC(39a4dfef) SHA1(2344aa37b4943777fa8276fe7c9829e4e6f5fe21) )
+ ROM_LOAD( "sweetlife_ent.003", 0x200000, 0x80000, CRC(5448a09a) SHA1(6c72e42094eeb9cbbc9e67d029376a31c01762dd) )
+ ROM_LOAD( "sweetlife_ent.004", 0x300000, 0x80000, CRC(b7a5f2cb) SHA1(75f9c9f031fc5c2f249020bafbed23caa233efcc) )
+ ROM_LOAD( "sweetlife_ent.005", 0x080000, 0x80000, CRC(b2b45395) SHA1(65b4516da1698ac6e02accd7b07b4e3ad55bcd17) )
+ ROM_LOAD( "sweetlife_ent.006", 0x180000, 0x80000, CRC(b9b5a8fe) SHA1(a985c59813cfba99abd5817c3bd9d3fe2c0ae38e) )
+ ROM_LOAD( "sweetlife_ent.007", 0x280000, 0x80000, CRC(28b33238) SHA1(3668fb0eed46c9cccc155246e4832fc902be597d) )
+ ROM_LOAD( "sweetlife_ent.008", 0x380000, 0x80000, CRC(7aa675a7) SHA1(9027b889d5370d9daf1f880d43b1252a381aade8) )
+
+ ROM_REGION( 0x8000, "m48t35", 0 ) // factory initialized defaults
+ ROM_LOAD( "m48t35", 0x0000, 0x8000, CRC(fd66d54b) SHA1(769cc41e1f3c25518aaf4c4d9ab3fe0a3e525bd7) )
+ROM_END
+
/*********************************************************
Sweet Life 2
@@ -2222,6 +2269,23 @@ ROM_START( rollfr_4 ) // 080331, bank D0
ROM_LOAD( "m48t35", 0x0000, 0x8000, CRC(8d69b6ab) SHA1(e4080e181acf1e84115efbd1de641256faf71c4d) )
ROM_END
+ROM_START( rollfr_5 ) // 100924, bank D0
+ ROM_REGION( 0x40000, "maincpu", 0 ) // z80 code, banked
+ ROM_LOAD( "rf1-100924.rom", 0x00000, 0x40000, CRC(27b68b41) SHA1(a98ddd9da2ec1d3dd235e8a14efa96fda3d13c05) )
+
+ ROM_REGION( 0x400000, "gfx", 0 )
+ ROM_LOAD( "rollfruit1.001", 0x000000, 0x80000, CRC(1e4e6cc7) SHA1(3c301094a0879c42dc93678a5504d6a1a3ca6f37) )
+ ROM_LOAD( "rollfruit1.002", 0x100000, 0x80000, CRC(5b744953) SHA1(2d140e3f4022c635c2ca3926b203e66ea618229e) )
+ ROM_LOAD( "rollfruit1.003", 0x200000, 0x80000, CRC(f169bbd2) SHA1(35115ae187206d81d121e8fa57ec3edc8581ec2b) )
+ ROM_LOAD( "rollfruit1.004", 0x300000, 0x80000, CRC(d877bd31) SHA1(254e6360ec56a99b103289850e585bd5f21621be) )
+ ROM_LOAD( "rollfruit1.005", 0x080000, 0x80000, CRC(a9c750ca) SHA1(630db2a329a520eb66e29f4520f6af7e3ac4ae53) )
+ ROM_LOAD( "rollfruit1.006", 0x180000, 0x80000, CRC(adfffc87) SHA1(5dc23e8af750639c1615d766dcc7d0133d683118) )
+ ROM_LOAD( "rollfruit1.007", 0x280000, 0x80000, CRC(04489de4) SHA1(b73e83475b10651db294788cac8cd5ff636c27f3) )
+ ROM_LOAD( "rollfruit1.008", 0x380000, 0x80000, CRC(8462b4ae) SHA1(6abac36f9466ecdf6761600b46bee33ea6e36270) )
+
+ ROM_REGION( 0x8000, "m48t35", 0 ) // factory initialized defaults
+ ROM_LOAD( "m48t35", 0x0000, 0x8000, CRC(8d69b6ab) SHA1(e4080e181acf1e84115efbd1de641256faf71c4d) )
+ROM_END
/*********************************************************
@@ -2264,6 +2328,24 @@ ROM_START( island_2 ) // 070409
ROM_LOAD( "m48t35", 0x0000, 0x8000, CRC(e606d0df) SHA1(25a31534a660abfc344b824a7c45595f4f9cf430) )
ROM_END
+ROM_START( island_3 ) // 090806 entertainment
+ ROM_REGION( 0x40000, "maincpu", 0 ) // z80 code, banked
+ ROM_LOAD( "is_e_090806.rom", 0x00000, 0x40000, CRC(144565f9) SHA1(8f5d335516a7ec8b7b3f64610258d589e7006d0a) )
+
+ ROM_REGION( 0x400000, "gfx", 0 )
+ ROM_LOAD( "island_ent.001", 0x000000, 0x80000, CRC(a5ba250e) SHA1(a7f61f770a1edd8802b1eaa1659a3dd857335c63) )
+ ROM_LOAD( "island_ent.002", 0x100000, 0x80000, CRC(453e9414) SHA1(fcdaf3895b5482445e9c73f2f27042276cd402ca) )
+ ROM_LOAD( "island_ent.003", 0x200000, 0x80000, CRC(29466f14) SHA1(a52d1189ec893bac81824af8e08050ef43a8e8e6) )
+ ROM_LOAD( "island_ent.004", 0x300000, 0x80000, CRC(a483d9b0) SHA1(6e1420ceca4975db3609ae8c3947a10a9869364b) )
+ ROM_LOAD( "island_ent.005", 0x080000, 0x80000, CRC(3f7ce2c0) SHA1(fc65c5d5f1f765684b118523c0b935b69e63c344) )
+ ROM_LOAD( "island_ent.006", 0x180000, 0x80000, CRC(17517ff8) SHA1(0b4945fb4c3c6e168d130629509eb26077a900d0) )
+ ROM_LOAD( "island_ent.007", 0x280000, 0x80000, CRC(99d3baac) SHA1(d45c54fa2ef54e0d472b16850fda012a0cdaf586) )
+ ROM_LOAD( "island_ent.008", 0x380000, 0x80000, CRC(ceecd2ef) SHA1(a2d810f690258519497303ac9bd37291661706a9) )
+
+ ROM_REGION( 0x8000, "m48t35", 0 ) // factory initialized defaults
+ ROM_LOAD( "m48t35", 0x0000, 0x8000, CRC(1be1d844) SHA1(7d02dd6414f08595178941440150c0d2b6ab45ad) )
+ROM_END
+
/*********************************************************
Island 2
@@ -2420,6 +2502,24 @@ ROM_START( pirate_4 ) // 070412
ROM_LOAD( "m48t35", 0x0000, 0x8000, CRC(85054f45) SHA1(4d9e86a23a5a521083b6faa3b1b3fd8e7b8c85b0) )
ROM_END
+ROM_START( pirate_5 ) // 090803 entertainment
+ ROM_REGION( 0x40000, "maincpu", 0 ) // z80 code, banked
+ ROM_LOAD( "pr_e_090803.rom", 0x00000, 0x40000, CRC(72a1260a) SHA1(84678a9a90ca795e4938d82945ce3c4d15c49ed1) )
+
+ ROM_REGION( 0x400000, "gfx", 0 )
+ ROM_LOAD( "pirate_ent.001", 0x000000, 0x80000, CRC(9b93cd27) SHA1(81cce41463322aa90866f5ac56b82fb73e191319) )
+ ROM_LOAD( "pirate_ent.002", 0x100000, 0x80000, CRC(5776a0dc) SHA1(2d81b7333ee418329ec0f0bb96b30dfaaf32cbf9) )
+ ROM_LOAD( "pirate_ent.003", 0x200000, 0x80000, CRC(bf91b15f) SHA1(933cde175e343c6e5511b023096aec43d49b8963) )
+ ROM_LOAD( "pirate_ent.004", 0x300000, 0x80000, CRC(5ad7299d) SHA1(d1246cd2b87a0b0b9e81083f1724d17fb69f64e5) )
+ ROM_LOAD( "pirate_ent.005", 0x080000, 0x80000, CRC(7af72c13) SHA1(c264c8a6eb8e4a6b22e9be7bc8bde05901d91c56) )
+ ROM_LOAD( "pirate_ent.006", 0x180000, 0x80000, CRC(9ea25f75) SHA1(0c8715b3f3fc5b875f3fbd80c79ae55ca9a32cb1) )
+ ROM_LOAD( "pirate_ent.007", 0x280000, 0x80000, CRC(dffa307e) SHA1(da231a501fe2cc2149fff9cc3370aa1766292091) )
+ ROM_LOAD( "pirate_ent.008", 0x380000, 0x80000, CRC(c9504ac4) SHA1(c8dc072b75348da02f5d811a580ba103728c2dd4) )
+
+ ROM_REGION( 0x8000, "m48t35", 0 ) // factory initialized defaults
+ ROM_LOAD( "m48t35", 0x0000, 0x8000, CRC(348f7ba9) SHA1(0f48481bf1c790760c7ee27f0caed45a833d3365) )
+ROM_END
+
/*********************************************************
Pirate 2
@@ -2597,6 +2697,42 @@ ROM_START( keks_5 ) // 090727 entertainment
ROM_LOAD( "m48t35", 0x0000, 0x8000, CRC(480de536) SHA1(bddc8269222ff3837c2924caf8ffac803e4aed18) )
ROM_END
+ROM_START( keks_6 ) // 110816
+ ROM_REGION( 0x40000, "maincpu", 0 ) // z80 code, banked
+ ROM_LOAD( "ks_m_110816.rom", 0x00000, 0x40000, CRC(9e244f5d) SHA1(49f8a2cdbef309b26bcc95bfc78e5b4a83c30583) )
+
+ ROM_REGION( 0x400000, "gfx", 0 )
+ ROM_LOAD( "keks_m.001", 0x000000, 0x80000, CRC(f4c20f66) SHA1(bed42ef01dfaa9d5d6ebb703e44ce7c11b8a373c) )
+ ROM_LOAD( "keks_m.002", 0x100000, 0x80000, CRC(b7ec3fac) SHA1(c3c62690487a6056415c46888bde8254efca836f) )
+ ROM_LOAD( "keks_m.003", 0x200000, 0x80000, CRC(5b6e8568) SHA1(003297e9cd080d91fe6751286eabd3a2f37ceb76) )
+ ROM_LOAD( "keks_m.004", 0x300000, 0x80000, CRC(9dc32736) SHA1(7b2091ae802431d1c959b859a58e0076d32abef0) )
+ ROM_LOAD( "keks_m.005", 0x080000, 0x80000, CRC(c5b09267) SHA1(7fd0988e63752fdbb31fde60b4726cfd63149622) )
+ ROM_LOAD( "keks_m.006", 0x180000, 0x80000, CRC(583da5fd) SHA1(645228db20cdaacb53bfc68731fd1a66a6a8cf56) )
+ ROM_LOAD( "keks_m.007", 0x280000, 0x80000, CRC(311c166a) SHA1(5f0ad8d755a6141964d818b98b3f156cbda8fb0d) )
+ ROM_LOAD( "keks_m.008", 0x380000, 0x80000, CRC(f69b0831) SHA1(75392349ef02a39cf883206938e2c615445065fc) )
+
+ ROM_REGION( 0x8000, "m48t35", 0 ) // factory initialized defaults
+ ROM_LOAD( "m48t35", 0x0000, 0x8000, CRC(99307739) SHA1(cfcf9cd9426a1a977c29f8825288064a561df28d) )
+ROM_END
+
+ROM_START( keks_7 ) // 110816
+ ROM_REGION( 0x40000, "maincpu", 0 ) // z80 code, banked
+ ROM_LOAD( "ks_110816.rom", 0x00000, 0x40000, CRC(be6b2642) SHA1(47ea80529da40d3260a84fa322dbaf5fb581dfbe) )
+
+ ROM_REGION( 0x400000, "gfx", 0 )
+ ROM_LOAD( "keks.001", 0x000000, 0x80000, CRC(fc399595) SHA1(037afd4a613cd58d4a28627b9e395d48c3fa866a) )
+ ROM_LOAD( "keks.002", 0x100000, 0x80000, CRC(474b36e7) SHA1(e1e62acd4a706b2654fc1249850806b612fc1419) )
+ ROM_LOAD( "keks.003", 0x200000, 0x80000, CRC(7f885e3d) SHA1(09bb4690e86ed4a29eef75ee4e5753ce40a164dd) )
+ ROM_LOAD( "keks.004", 0x300000, 0x80000, CRC(a0fc654b) SHA1(3354bdb7aa372816a766b0d36408543de7d3482f) )
+ ROM_LOAD( "keks_m.005", 0x080000, 0x80000, CRC(c5b09267) SHA1(7fd0988e63752fdbb31fde60b4726cfd63149622) )
+ ROM_LOAD( "keks_m.006", 0x180000, 0x80000, CRC(583da5fd) SHA1(645228db20cdaacb53bfc68731fd1a66a6a8cf56) )
+ ROM_LOAD( "keks_m.007", 0x280000, 0x80000, CRC(311c166a) SHA1(5f0ad8d755a6141964d818b98b3f156cbda8fb0d) )
+ ROM_LOAD( "keks_m.008", 0x380000, 0x80000, CRC(f69b0831) SHA1(75392349ef02a39cf883206938e2c615445065fc) )
+
+ ROM_REGION( 0x8000, "m48t35", 0 ) // factory initialized defaults
+ ROM_LOAD( "m48t35", 0x0000, 0x8000, CRC(1464bf6c) SHA1(5c1a984825dbd129e8295c3c6de6f82bfe5dc99e) )
+ROM_END
+
/*********************************************************
Gnome
@@ -2912,7 +3048,7 @@ ROM_END
ROM_START( crzmon2 ) // 100310
ROM_REGION( 0x40000, "maincpu", 0 ) // z80 code, banked
- ROM_LOAD( "cm2_100310.rom", 0x00000, 0x40000, CRC(c7fa01c8) SHA1(180b5ce0e456abe9178255b8ea09afb953986310) )
+ ROM_LOAD( "cm2_m_100310.rom", 0x00000, 0x40000, CRC(c7fa01c8) SHA1(180b5ce0e456abe9178255b8ea09afb953986310) )
ROM_REGION( 0x400000, "gfx", 0 )
ROM_LOAD( "crazymonkey2.001", 0x000000, 0x80000, CRC(8c8edfa7) SHA1(a68d4ebc370a09d588b906e5c254bccac4f53001) )
@@ -2964,6 +3100,24 @@ ROM_START( crzmon2_3 ) // 100315 entertainment
ROM_LOAD( "m48t35", 0x0000, 0x8000, CRC(84b6f391) SHA1(8ffc43ed73f614268c3d089b6f304e095ac21fe9) )
ROM_END
+ROM_START( crzmon2_4 ) // 100618
+ ROM_REGION( 0x40000, "maincpu", 0 ) // z80 code, banked
+ ROM_LOAD( "cm2_100618.rom", 0x00000, 0x40000, CRC(3519e933) SHA1(1dad2fa2084e4c25f5d75cba3b631c7f3a1bdce6) )
+
+ ROM_REGION( 0x400000, "gfx", 0 )
+ ROM_LOAD( "crazymonkey2.001", 0x000000, 0x80000, CRC(8c8edfa7) SHA1(a68d4ebc370a09d588b906e5c254bccac4f53001) )
+ ROM_LOAD( "crazymonkey2.002", 0x100000, 0x80000, CRC(6379769f) SHA1(3b3ffc3ce4436168db41f7e643b58dca94f250da) )
+ ROM_LOAD( "crazymonkey2.003", 0x200000, 0x80000, CRC(b12f8080) SHA1(218fd38c3c2b2886084a1c694ce181f497c54085) )
+ ROM_LOAD( "crazymonkey2.004", 0x300000, 0x80000, CRC(1da8ed1a) SHA1(9681e631eaeb26d242daba4d1c362302de6ca1bd) )
+ ROM_LOAD( "crazymonkey2.005", 0x080000, 0x80000, CRC(82bfb2d3) SHA1(ca4c4a8b105fbcb3e120fc2d89866f3e66624e96) )
+ ROM_LOAD( "crazymonkey2.006", 0x180000, 0x80000, CRC(e3dfdf6a) SHA1(67608c09d8c92f3278ddc11c27ddba8f3146c2c6) )
+ ROM_LOAD( "crazymonkey2.007", 0x280000, 0x80000, CRC(329f4c3d) SHA1(27e1ed25b7e11c604abcf435f87b165201918def) )
+ ROM_LOAD( "crazymonkey2.008", 0x380000, 0x80000, CRC(f7c8e613) SHA1(6dec3f6f27773cd0af83ca914d8481c8f17f1d3f) )
+
+ ROM_REGION( 0x8000, "m48t35", 0 ) // factory initialized defaults
+ ROM_LOAD( "m48t35", 0x0000, 0x8000, CRC(9849f5ec) SHA1(9d9bd0a85fe0214e254cb2f5817696b39cffe4a4) )
+ROM_END
+
/*
@@ -3024,6 +3178,7 @@ GAME( 2003, lhaunt_11, lhaunt_6, igrosoft_gamble, igrosoft_gamble, igrosoft_ga
GAME( 2003, rollfr_2, rollfr_4, rollfr, rollfr, igrosoft_gamble_state, empty_init, ROT0, "Igrosoft", "Roll Fruit (040318)", MACHINE_SUPPORTS_SAVE ) /* World */
GAME( 2003, rollfr_3, rollfr_4, rollfr, rollfr, igrosoft_gamble_state, empty_init, ROT0, "Igrosoft", "Roll Fruit (080327)", MACHINE_SUPPORTS_SAVE ) /* World */
GAME( 2003, rollfr_4, 0, rollfr, rollfr, igrosoft_gamble_state, empty_init, ROT0, "Igrosoft", "Roll Fruit (080331)", MACHINE_SUPPORTS_SAVE ) /* World */
+GAME( 2003, rollfr_5, rollfr_4, rollfr, rollfr, igrosoft_gamble_state, init_rollfruit, ROT0, "Igrosoft", "Roll Fruit (100924)", MACHINE_NOT_WORKING|MACHINE_SUPPORTS_SAVE ) /* World */
GAME( 2004, garage_4, garage_5, igrosoft_gamble, igrosoft_gamble, igrosoft_gamble_state, empty_init, ROT0, "Igrosoft", "Garage (040219 World)", MACHINE_SUPPORTS_SAVE ) /* World */
GAME( 2004, garage_5, 0, igrosoft_gamble, igrosoft_gamble, igrosoft_gamble_state, empty_init, ROT0, "Igrosoft", "Garage (050311 World)", MACHINE_SUPPORTS_SAVE ) /* World */
@@ -3037,8 +3192,9 @@ GAME( 2004, rclimb_4, rclimb_3, igrosoft_gamble, igrosoft_gamble, igrosoft_ga
GAME( 2004, rclimb_5, rclimb_3, igrosoft_gamble, igrosoft_gamble, igrosoft_gamble_state, empty_init, ROT0, "Igrosoft", "Rock Climber (070621 Russia)", MACHINE_SUPPORTS_SAVE ) /* Russia */
GAME( 2004, rclimb_7, rclimb_3, igrosoft_gamble, igrosoft_gamble, igrosoft_gamble_state, init_rclimbent, ROT0, "Igrosoft", "Rock Climber (090716 Entertainment)", MACHINE_SUPPORTS_SAVE ) /* Entertainment */
-GAME( 2004, sweetl, 0, igrosoft_gamble, igrosoft_gamble, igrosoft_gamble_state, empty_init, ROT0, "Igrosoft", "Sweet Life (041220 World)", MACHINE_SUPPORTS_SAVE ) /* World */
-GAME( 2004, sweetl_2, sweetl, igrosoft_gamble, igrosoft_gamble, igrosoft_gamble_state, empty_init, ROT0, "Igrosoft", "Sweet Life (070412 Russia)", MACHINE_SUPPORTS_SAVE ) /* Russia */
+GAME( 2004, sweetl, 0, igrosoft_gamble, igrosoft_gamble, igrosoft_gamble_state, empty_init, ROT0, "Igrosoft", "Sweet Life (041220 World)", MACHINE_SUPPORTS_SAVE ) /* World */
+GAME( 2004, sweetl_2, sweetl, igrosoft_gamble, igrosoft_gamble, igrosoft_gamble_state, empty_init, ROT0, "Igrosoft", "Sweet Life (070412 Russia)", MACHINE_SUPPORTS_SAVE ) /* Russia */
+GAME( 2004, sweetl_3, sweetl, igrosoft_gamble, igrosoft_gamble, igrosoft_gamble_state, init_sweetlent, ROT0, "Igrosoft", "Sweet Life (090720 Entertainment)", MACHINE_SUPPORTS_SAVE ) /* Entertainment */
GAME( 2004, resdnt, resdnt_6, igrosoft_gamble, igrosoft_gamble, igrosoft_gamble_state, empty_init, ROT0, "Igrosoft", "Resident (040415 World)", MACHINE_SUPPORTS_SAVE ) /* World */
GAME( 2004, resdnt_2, resdnt_6, igrosoft_gamble, igrosoft_gamble, igrosoft_gamble_state, empty_init, ROT0, "Igrosoft", "Resident (040513 World)", MACHINE_SUPPORTS_SAVE ) /* World */
@@ -3047,12 +3203,14 @@ GAME( 2004, resdnt_6, 0, igrosoft_gamble, igrosoft_gamble, igrosoft_ga
GAME( 2004, resdnt_8, resdnt_6, igrosoft_gamble, igrosoft_gamble, igrosoft_gamble_state, init_resdntent, ROT0, "Igrosoft", "Resident (100311 Entertainment)", MACHINE_SUPPORTS_SAVE ) /* Entertainment */
GAME( 2004, resdnt_9, resdnt_6, igrosoft_gamble, igrosoft_gamble, igrosoft_gamble_state, empty_init, ROT0, "Igrosoft", "Resident (100316 Russia)", MACHINE_SUPPORTS_SAVE ) /* Russia */
-GAME( 2005, island, 0, igrosoft_gamble, igrosoft_gamble, igrosoft_gamble_state, empty_init, ROT0, "Igrosoft", "Island (050713 World)", MACHINE_SUPPORTS_SAVE ) /* World */
-GAME( 2005, island_2, island, igrosoft_gamble, igrosoft_gamble, igrosoft_gamble_state, empty_init, ROT0, "Igrosoft", "Island (070409 Russia)", MACHINE_SUPPORTS_SAVE ) /* Russia */
+GAME( 2005, island, 0, igrosoft_gamble, igrosoft_gamble, igrosoft_gamble_state, empty_init, ROT0, "Igrosoft", "Island (050713 World)", MACHINE_SUPPORTS_SAVE ) /* World */
+GAME( 2005, island_2, island, igrosoft_gamble, igrosoft_gamble, igrosoft_gamble_state, empty_init, ROT0, "Igrosoft", "Island (070409 Russia)", MACHINE_SUPPORTS_SAVE ) /* Russia */
+GAME( 2005, island_3, island, igrosoft_gamble, igrosoft_gamble, igrosoft_gamble_state, init_islandent, ROT0, "Igrosoft", "Island (090806 Entertainment)", MACHINE_SUPPORTS_SAVE ) /* Entertainment */
-GAME( 2005, pirate_2, pirate_3, igrosoft_gamble, igrosoft_gamble, igrosoft_gamble_state, empty_init, ROT0, "Igrosoft", "Pirate (060210 World)", MACHINE_SUPPORTS_SAVE ) /* World */
-GAME( 2005, pirate_3, 0, igrosoft_gamble, igrosoft_gamble, igrosoft_gamble_state, empty_init, ROT0, "Igrosoft", "Pirate (060803 World)", MACHINE_SUPPORTS_SAVE ) /* World */
-GAME( 2005, pirate_4, pirate_3, igrosoft_gamble, igrosoft_gamble, igrosoft_gamble_state, empty_init, ROT0, "Igrosoft", "Pirate (070412 Russia)", MACHINE_SUPPORTS_SAVE ) /* Russia */
+GAME( 2005, pirate_2, pirate_3, igrosoft_gamble, igrosoft_gamble, igrosoft_gamble_state, empty_init, ROT0, "Igrosoft", "Pirate (060210 World)", MACHINE_SUPPORTS_SAVE ) /* World */
+GAME( 2005, pirate_3, 0, igrosoft_gamble, igrosoft_gamble, igrosoft_gamble_state, empty_init, ROT0, "Igrosoft", "Pirate (060803 World)", MACHINE_SUPPORTS_SAVE ) /* World */
+GAME( 2005, pirate_4, pirate_3, igrosoft_gamble, igrosoft_gamble, igrosoft_gamble_state, empty_init, ROT0, "Igrosoft", "Pirate (070412 Russia)", MACHINE_SUPPORTS_SAVE ) /* Russia */
+GAME( 2005, pirate_5, pirate_3, igrosoft_gamble, igrosoft_gamble, igrosoft_gamble_state, init_pirateent, ROT0, "Igrosoft", "Pirate (090803 Entertainment)", MACHINE_SUPPORTS_SAVE ) /* Entertainment */
GAME( 2006, island2, 0, igrosoft_gamble, igrosoft_gamble, igrosoft_gamble_state, empty_init, ROT0, "Igrosoft", "Island 2 (060529 World)", MACHINE_SUPPORTS_SAVE ) /* World */
GAME( 2006, island2_3, island2, igrosoft_gamble, igrosoft_gamble, igrosoft_gamble_state, empty_init, ROT0, "Igrosoft", "Island 2 (061218 World)", MACHINE_SUPPORTS_SAVE ) /* World */
@@ -3065,11 +3223,13 @@ GAME( 2006, pirate2_2, pirate2, igrosoft_gamble, igrosoft_gamble, igrosoft_ga
GAME( 2006, pirate2_3, pirate2, igrosoft_gamble, igrosoft_gamble, igrosoft_gamble_state, init_pirate2l, ROT0, "Igrosoft", "Pirate 2 (090528 Lottery)", MACHINE_SUPPORTS_SAVE ) /* Lottery */
GAME( 2006, pirate2_4, pirate2, igrosoft_gamble, igrosoft_gamble, igrosoft_gamble_state, init_pirate2ent, ROT0, "Igrosoft", "Pirate 2 (090730 Entertainment)", MACHINE_SUPPORTS_SAVE ) /* Entertainment */
-GAME( 2006, keks, keks_2, igrosoft_gamble, igrosoft_gamble, igrosoft_gamble_state, empty_init, ROT0, "Igrosoft", "Keks (060328 World)", MACHINE_SUPPORTS_SAVE ) /* World */
-GAME( 2006, keks_2, 0, igrosoft_gamble, igrosoft_gamble, igrosoft_gamble_state, empty_init, ROT0, "Igrosoft", "Keks (060403 World)", MACHINE_SUPPORTS_SAVE ) /* World */
-GAME( 2006, keks_3, keks_2, igrosoft_gamble, igrosoft_gamble, igrosoft_gamble_state, empty_init, ROT0, "Igrosoft", "Keks (070119 Russia)", MACHINE_SUPPORTS_SAVE ) /* Russia */
-GAME( 2006, keks_4, keks_2, igrosoft_gamble, igrosoft_gamble, igrosoft_gamble_state, init_keksl, ROT0, "Igrosoft", "Keks (090604 Lottery)", MACHINE_SUPPORTS_SAVE ) /* Lottery */
-GAME( 2006, keks_5, keks_2, igrosoft_gamble, igrosoft_gamble, igrosoft_gamble_state, init_keksent, ROT0, "Igrosoft", "Keks (090727 Entertainment)", MACHINE_SUPPORTS_SAVE ) /* Entertainment */
+GAME( 2006, keks, keks_6, igrosoft_gamble, igrosoft_gamble, igrosoft_gamble_state, empty_init, ROT0, "Igrosoft", "Keks (060328 World)", MACHINE_SUPPORTS_SAVE ) /* World */
+GAME( 2006, keks_2, keks_6, igrosoft_gamble, igrosoft_gamble, igrosoft_gamble_state, empty_init, ROT0, "Igrosoft", "Keks (060403 World)", MACHINE_SUPPORTS_SAVE ) /* World */
+GAME( 2006, keks_3, keks_6, igrosoft_gamble, igrosoft_gamble, igrosoft_gamble_state, empty_init, ROT0, "Igrosoft", "Keks (070119 Russia)", MACHINE_SUPPORTS_SAVE ) /* Russia */
+GAME( 2006, keks_4, keks_6, igrosoft_gamble, igrosoft_gamble, igrosoft_gamble_state, init_keksl, ROT0, "Igrosoft", "Keks (090604 Lottery)", MACHINE_SUPPORTS_SAVE ) /* Lottery */
+GAME( 2006, keks_5, keks_6, igrosoft_gamble, igrosoft_gamble, igrosoft_gamble_state, init_keksent, ROT0, "Igrosoft", "Keks (090727 Entertainment)", MACHINE_SUPPORTS_SAVE ) /* Entertainment */
+GAME( 2006, keks_6, 0, igrosoft_gamble, igrosoft_gamble, igrosoft_gamble_state, empty_init, ROT0, "Igrosoft", "Keks (110816 World)", MACHINE_SUPPORTS_SAVE ) /* World */
+GAME( 2006, keks_7, keks_6, igrosoft_gamble, igrosoft_gamble, igrosoft_gamble_state, empty_init, ROT0, "Igrosoft", "Keks (110816 Russia)", MACHINE_SUPPORTS_SAVE ) /* Russia */
GAME( 2007, gnome, gnome_9, igrosoft_gamble, igrosoft_gamble, igrosoft_gamble_state, empty_init, ROT0, "Igrosoft", "Gnome (070906 Russia)", MACHINE_SUPPORTS_SAVE ) /* Russia */
GAME( 2007, gnome_2, gnome_9, igrosoft_gamble, igrosoft_gamble, igrosoft_gamble_state, empty_init, ROT0, "Igrosoft", "Gnome (071115 Russia)", MACHINE_SUPPORTS_SAVE ) /* Russia */
@@ -3094,6 +3254,7 @@ GAME( 2008, fcockt2_5, fcockt2, igrosoft_gamble, igrosoft_gamble, igrosoft_ga
GAME( 2008, fcockt2_6, fcockt2, igrosoft_gamble, igrosoft_gamble, igrosoft_gamble_state, init_fcockt2l, ROT0, "Igrosoft", "Fruit Cocktail 2 (090528 Lottery)", MACHINE_SUPPORTS_SAVE ) /* Lottery */
GAME( 2008, fcockt2_7, fcockt2, igrosoft_gamble, igrosoft_gamble, igrosoft_gamble_state, init_fcockt2ent, ROT0, "Igrosoft", "Fruit Cocktail 2 (090813 Entertainment)", MACHINE_SUPPORTS_SAVE ) /* Entertainment */
-GAME( 2010, crzmon2, 0, igrosoft_gamble, igrosoft_gamble, igrosoft_gamble_state, init_crzmon2, ROT0, "Igrosoft", "Crazy Monkey 2 (100310)", MACHINE_NOT_WORKING|MACHINE_SUPPORTS_SAVE ) /* World */ // xored and bitswapped palette and gfx roms
+GAME( 2010, crzmon2, 0, igrosoft_gamble, igrosoft_gamble, igrosoft_gamble_state, init_crzmon2, ROT0, "Igrosoft", "Crazy Monkey 2 (100310 World)", MACHINE_NOT_WORKING|MACHINE_SUPPORTS_SAVE ) /* World */ // xored and bitswapped palette and gfx roms
GAME( 2010, crzmon2_2, crzmon2, igrosoft_gamble, igrosoft_gamble, igrosoft_gamble_state, init_crzmon2lot, ROT0, "Igrosoft", "Crazy Monkey 2 (100311 Lottery)", MACHINE_NOT_WORKING|MACHINE_SUPPORTS_SAVE ) /* Lottery */
GAME( 2010, crzmon2_3, crzmon2, igrosoft_gamble, igrosoft_gamble, igrosoft_gamble_state, init_crzmon2ent, ROT0, "Igrosoft", "Crazy Monkey 2 (100315 Entertainment)", MACHINE_NOT_WORKING|MACHINE_SUPPORTS_SAVE ) /* Entertainment */
+GAME( 2010, crzmon2_4, crzmon2, igrosoft_gamble, igrosoft_gamble, igrosoft_gamble_state, init_crzmon2, ROT0, "Igrosoft", "Crazy Monkey 2 (100618 Russia)", MACHINE_NOT_WORKING|MACHINE_SUPPORTS_SAVE ) /* Russia */
diff --git a/src/mame/drivers/multfish_boot.cpp b/src/mame/drivers/multfish_boot.cpp
index 7ee95650bd3..28eaa3b1373 100644
--- a/src/mame/drivers/multfish_boot.cpp
+++ b/src/mame/drivers/multfish_boot.cpp
@@ -2117,18 +2117,18 @@ GAME( 2006, pirate2g, pirate2, igrosoft_gamble, igrosoft_gamble, igrosoft_ga
GAME( 2006, pirate2h, pirate2, igrosoft_gamble, igrosoft_gamble, igrosoft_gamble_state, init_customl, ROT0, "bootleg", "Pirate 2 (bootleg, 061005, LOTOS PR01)", MACHINE_SUPPORTS_SAVE ) // custom alteras, modified graphics, many texts changed, changed version text to "LOTOS PR01"
GAME( 2006, pirate2_2a, pirate2, igrosoft_gamble, igrosoft_gamble, igrosoft_gamble_state, empty_init, ROT0, "bootleg", "Pirate 2 (bootleg, 070126, banking address hack)", MACHINE_SUPPORTS_SAVE ) // bank F9
-GAME( 2006, keksa, keks_2, igrosoft_gamble, igrosoft_gamble, igrosoft_gamble_state, empty_init, ROT0, "bootleg", "Keks (bootleg, 060328, banking address hack)", MACHINE_SUPPORTS_SAVE ) // bank F9
-GAME( 2006, keksb, keks_2, igrosoft_gamble, igrosoft_gamble, igrosoft_gamble_state, empty_init, ROT0, "bootleg", "Keks (bootleg, 060328, backdoor)", MACHINE_SUPPORTS_SAVE ) // backdoor 1,1 1,3 1,5 1,7 3,3 3,4
-GAME( 2006, keksc, keks_2, igrosoft_gamble, igrosoft_gamble, igrosoft_gamble_state, empty_init, ROT0, "bootleg", "Keks (bootleg, 060328, banking address hack, changed version text)", MACHINE_SUPPORTS_SAVE ) // bank F9, changed version text to 070119
-GAME( 2006, keks_2a, keks_2, igrosoft_gamble, igrosoft_gamble, igrosoft_gamble_state, empty_init, ROT0, "bootleg", "Keks (bootleg, 060403, banking address hack)", MACHINE_SUPPORTS_SAVE ) // bank F9
-GAME( 2006, keks_2b, keks_2, igrosoft_gamble, igrosoft_gamble, igrosoft_gamble_state, empty_init, ROT0, "bootleg", "Keks (bootleg, 060403, banking address hack, changed version text)", MACHINE_SUPPORTS_SAVE ) // bank F9, changed version text to 070119
-GAME( 2006, keks_2c, keks_2, igrosoft_gamble, igrosoft_gamble, igrosoft_gamble_state, init_customl, ROT0, "bootleg", "Keks (bootleg, 060403, VIDEO GAME-1 KS01 set 1)", MACHINE_SUPPORTS_SAVE ) // custom alteras, modified graphics, bank F9, changed version text to "VIDEO GAME-1 KS01"
-GAME( 2006, keks_2d, keks_2, igrosoft_gamble, igrosoft_gamble, igrosoft_gamble_state, empty_init, ROT0, "bootleg", "Keks (bootleg, 060403, VIDEO GAME-1 KS01 set 2)", MACHINE_SUPPORTS_SAVE ) // modified graphics, bank F9, changed version text to "VIDEO GAME-1 KS01" (keks_2c, decoded gfx)
-GAME( 2006, keks_2e, keks_2, igrosoft_gamble, igrosoft_gamble, igrosoft_gamble_state, empty_init, ROT0, "bootleg", "Keks (bootleg, 060403, banking address hack, payout percentage 60)", MACHINE_SUPPORTS_SAVE ) // bank F9, payout percentage 60%
-GAME( 2006, keks_2f, keks_2, igrosoft_gamble, igrosoft_gamble, igrosoft_gamble_state, empty_init, ROT0, "bootleg", "Keks (bootleg, 060403, LOTTOGAME (I))", MACHINE_SUPPORTS_SAVE ) // bank F9, modified graphics, changed version text to "MDS_is_the_best_ LOTTOGAME (I)"
-GAME( 2006, keks_2g, keks_2, igrosoft_gamble, igrosoft_gamble, igrosoft_gamble_state, init_customl, ROT0, "bootleg", "Keks (bootleg, 060403, LOTOS KS01)", MACHINE_SUPPORTS_SAVE ) // custom alteras, modified graphics, bank F9, many texts changed, changed version text to "LOTOS KS01"
-GAME( 2006, keks_3a, keks_2, igrosoft_gamble, igrosoft_gamble, igrosoft_gamble_state, empty_init, ROT0, "bootleg", "Keks (bootleg, 070119, banking address hack set 1)", MACHINE_SUPPORTS_SAVE ) // bank F9
-GAME( 2006, keks_3b, keks_2, igrosoft_gamble, igrosoft_gamble, igrosoft_gamble_state, empty_init, ROT0, "bootleg", "Keks (bootleg, 070119, banking address hack set 2)", MACHINE_SUPPORTS_SAVE ) // bank F9
+GAME( 2006, keksa, keks_6, igrosoft_gamble, igrosoft_gamble, igrosoft_gamble_state, empty_init, ROT0, "bootleg", "Keks (bootleg, 060328, banking address hack)", MACHINE_SUPPORTS_SAVE ) // bank F9
+GAME( 2006, keksb, keks_6, igrosoft_gamble, igrosoft_gamble, igrosoft_gamble_state, empty_init, ROT0, "bootleg", "Keks (bootleg, 060328, backdoor)", MACHINE_SUPPORTS_SAVE ) // backdoor 1,1 1,3 1,5 1,7 3,3 3,4
+GAME( 2006, keksc, keks_6, igrosoft_gamble, igrosoft_gamble, igrosoft_gamble_state, empty_init, ROT0, "bootleg", "Keks (bootleg, 060328, banking address hack, changed version text)", MACHINE_SUPPORTS_SAVE ) // bank F9, changed version text to 070119
+GAME( 2006, keks_2a, keks_6, igrosoft_gamble, igrosoft_gamble, igrosoft_gamble_state, empty_init, ROT0, "bootleg", "Keks (bootleg, 060403, banking address hack)", MACHINE_SUPPORTS_SAVE ) // bank F9
+GAME( 2006, keks_2b, keks_6, igrosoft_gamble, igrosoft_gamble, igrosoft_gamble_state, empty_init, ROT0, "bootleg", "Keks (bootleg, 060403, banking address hack, changed version text)", MACHINE_SUPPORTS_SAVE ) // bank F9, changed version text to 070119
+GAME( 2006, keks_2c, keks_6, igrosoft_gamble, igrosoft_gamble, igrosoft_gamble_state, init_customl, ROT0, "bootleg", "Keks (bootleg, 060403, VIDEO GAME-1 KS01 set 1)", MACHINE_SUPPORTS_SAVE ) // custom alteras, modified graphics, bank F9, changed version text to "VIDEO GAME-1 KS01"
+GAME( 2006, keks_2d, keks_6, igrosoft_gamble, igrosoft_gamble, igrosoft_gamble_state, empty_init, ROT0, "bootleg", "Keks (bootleg, 060403, VIDEO GAME-1 KS01 set 2)", MACHINE_SUPPORTS_SAVE ) // modified graphics, bank F9, changed version text to "VIDEO GAME-1 KS01" (keks_2c, decoded gfx)
+GAME( 2006, keks_2e, keks_6, igrosoft_gamble, igrosoft_gamble, igrosoft_gamble_state, empty_init, ROT0, "bootleg", "Keks (bootleg, 060403, banking address hack, payout percentage 60)", MACHINE_SUPPORTS_SAVE ) // bank F9, payout percentage 60%
+GAME( 2006, keks_2f, keks_6, igrosoft_gamble, igrosoft_gamble, igrosoft_gamble_state, empty_init, ROT0, "bootleg", "Keks (bootleg, 060403, LOTTOGAME (I))", MACHINE_SUPPORTS_SAVE ) // bank F9, modified graphics, changed version text to "MDS_is_the_best_ LOTTOGAME (I)"
+GAME( 2006, keks_2g, keks_6, igrosoft_gamble, igrosoft_gamble, igrosoft_gamble_state, init_customl, ROT0, "bootleg", "Keks (bootleg, 060403, LOTOS KS01)", MACHINE_SUPPORTS_SAVE ) // custom alteras, modified graphics, bank F9, many texts changed, changed version text to "LOTOS KS01"
+GAME( 2006, keks_3a, keks_6, igrosoft_gamble, igrosoft_gamble, igrosoft_gamble_state, empty_init, ROT0, "bootleg", "Keks (bootleg, 070119, banking address hack set 1)", MACHINE_SUPPORTS_SAVE ) // bank F9
+GAME( 2006, keks_3b, keks_6, igrosoft_gamble, igrosoft_gamble, igrosoft_gamble_state, empty_init, ROT0, "bootleg", "Keks (bootleg, 070119, banking address hack set 2)", MACHINE_SUPPORTS_SAVE ) // bank F9
GAME( 2007, gnomea, gnome_9, igrosoft_gamble, igrosoft_gamble, igrosoft_gamble_state, empty_init, ROT0, "bootleg", "Gnome (bootleg, 070906, banking address hack set 1)", MACHINE_SUPPORTS_SAVE ) // bank F9
GAME( 2007, gnomeb, gnome_9, igrosoft_gamble, igrosoft_gamble, igrosoft_gamble_state, empty_init, ROT0, "bootleg", "Gnome (bootleg, 070906, banking address hack set 2)", MACHINE_SUPPORTS_SAVE ) // bank F9
diff --git a/src/mame/drivers/multi16.cpp b/src/mame/drivers/multi16.cpp
index f272920cd10..816aad95581 100644
--- a/src/mame/drivers/multi16.cpp
+++ b/src/mame/drivers/multi16.cpp
@@ -107,13 +107,13 @@ void multi16_state::multi16_map(address_map &map)
WRITE8_MEMBER( multi16_state::multi16_6845_address_w )
{
m_crtc_index = data;
- m_crtc->address_w(space, offset, data);
+ m_crtc->address_w(data);
}
WRITE8_MEMBER( multi16_state::multi16_6845_data_w )
{
m_crtc_vreg[m_crtc_index] = data;
- m_crtc->register_w(space, offset, data);
+ m_crtc->register_w(data);
}
void multi16_state::multi16_io(address_map &map)
@@ -138,7 +138,8 @@ void multi16_state::machine_reset()
}
-MACHINE_CONFIG_START(multi16_state::multi16)
+void multi16_state::multi16(machine_config &config)
+{
/* basic machine hardware */
I8086(config, m_maincpu, 8000000);
m_maincpu->set_addrmap(AS_PROGRAM, &multi16_state::multi16_map);
@@ -146,15 +147,15 @@ MACHINE_CONFIG_START(multi16_state::multi16)
m_maincpu->set_irq_acknowledge_callback("pic8259", FUNC(pic8259_device::inta_cb));
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */
- MCFG_SCREEN_SIZE(640, 200)
- MCFG_SCREEN_VISIBLE_AREA(0, 640-1, 0, 200-1)
- MCFG_SCREEN_UPDATE_DRIVER(multi16_state, screen_update_multi16)
- MCFG_SCREEN_PALETTE("palette")
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */
+ screen.set_size(640, 200);
+ screen.set_visarea(0, 640-1, 0, 200-1);
+ screen.set_screen_update(FUNC(multi16_state::screen_update_multi16));
+ screen.set_palette(m_palette);
- MCFG_PALETTE_ADD("palette", 8)
+ PALETTE(config, m_palette).set_entries(8);
/* devices */
H46505(config, m_crtc, 16000000/5); /* unknown clock, hand tuned to get ~60 fps */
@@ -164,7 +165,7 @@ MACHINE_CONFIG_START(multi16_state::multi16)
PIC8259(config, m_pic, 0);
m_pic->out_int_callback().set_inputline(m_maincpu, 0);
-MACHINE_CONFIG_END
+}
/* ROM definition */
ROM_START( multi16 )
diff --git a/src/mame/drivers/multi8.cpp b/src/mame/drivers/multi8.cpp
index e205ed3e2ad..119bc61d3b6 100644
--- a/src/mame/drivers/multi8.cpp
+++ b/src/mame/drivers/multi8.cpp
@@ -278,8 +278,8 @@ WRITE8_MEMBER( multi8_state::pal_w )
}
}
-READ8_MEMBER(multi8_state::ay8912_0_r){ return m_aysnd->data_r(space, 0); }
-READ8_MEMBER(multi8_state::ay8912_1_r){ return m_aysnd->data_r(space, 1); }
+READ8_MEMBER(multi8_state::ay8912_0_r){ return m_aysnd->data_r(); }
+READ8_MEMBER(multi8_state::ay8912_1_r){ return m_aysnd->data_r(); }
READ8_MEMBER( multi8_state::kanji_r )
{
@@ -566,33 +566,33 @@ void multi8_state::machine_reset()
m_mcu_init = 0;
}
-MACHINE_CONFIG_START(multi8_state::multi8)
+void multi8_state::multi8(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, XTAL(4'000'000))
- MCFG_DEVICE_PROGRAM_MAP(multi8_mem)
- MCFG_DEVICE_IO_MAP(multi8_io)
+ Z80(config, m_maincpu, XTAL(4'000'000));
+ m_maincpu->set_addrmap(AS_PROGRAM, &multi8_state::multi8_mem);
+ m_maincpu->set_addrmap(AS_IO, &multi8_state::multi8_io);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */
- MCFG_SCREEN_SIZE(640, 200)
- MCFG_SCREEN_VISIBLE_AREA(0, 320-1, 0, 200-1)
- MCFG_SCREEN_UPDATE_DEVICE("crtc", mc6845_device, screen_update)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */
+ screen.set_size(640, 200);
+ screen.set_visarea(0, 320-1, 0, 200-1);
+ screen.set_screen_update("crtc", FUNC(mc6845_device::screen_update));
PALETTE(config, m_palette, palette_device::BRG_3BIT);
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_multi8)
+ GFXDECODE(config, "gfxdecode", m_palette, gfx_multi8);
/* Audio */
SPEAKER(config, "mono").front_center();
AY8912(config, m_aysnd, 1500000); //unknown clock / divider
m_aysnd->port_a_write_callback().set(FUNC(multi8_state::ym2203_porta_w));
m_aysnd->add_route(ALL_OUTPUTS, "mono", 0.50);
- MCFG_DEVICE_ADD("beeper", BEEP, 1200) // guesswork
- MCFG_SOUND_ROUTE(ALL_OUTPUTS,"mono",0.50)
+ BEEP(config, m_beeper, 1200).add_route(ALL_OUTPUTS,"mono",0.50); // guesswork
/* devices */
- MCFG_TIMER_DRIVER_ADD_PERIODIC("keyboard_timer", multi8_state, keyboard_callback, attotime::from_hz(240/32))
+ TIMER(config, "keyboard_timer").configure_periodic(FUNC(multi8_state::keyboard_callback), attotime::from_hz(240/32));
H46505(config, m_crtc, XTAL(3'579'545)/2); /* unknown clock, hand tuned to get ~60 fps */
m_crtc->set_screen("screen");
@@ -614,8 +614,8 @@ MACHINE_CONFIG_START(multi8_state::multi8)
PIC8259(config, "pic", 0);
//UPD765A(config, "fdc", false, true);
- //MCFG_FLOPPY_DRIVE_ADD("fdc:0", multi8_floppies, "525hd", floppy_image_device::default_floppy_formats)
-MACHINE_CONFIG_END
+ //FLOPPY_CONNECTOR(config, "fdc:0", multi8_floppies, "525hd", floppy_image_device::default_floppy_formats);
+}
/* ROM definition */
ROM_START( multi8 )
diff --git a/src/mame/drivers/munchmo.cpp b/src/mame/drivers/munchmo.cpp
index a39e3b96a85..084666ffd02 100644
--- a/src/mame/drivers/munchmo.cpp
+++ b/src/mame/drivers/munchmo.cpp
@@ -75,13 +75,13 @@ WRITE8_MEMBER(munchmo_state::sound_nmi_ack_w)
READ8_MEMBER(munchmo_state::ay1reset_r)
{
- m_ay8910[0]->reset_w(space, 0, 0);
+ m_ay8910[0]->reset_w();
return 0;
}
READ8_MEMBER(munchmo_state::ay2reset_r)
{
- m_ay8910[1]->reset_w(space, 0, 0);
+ m_ay8910[1]->reset_w();
return 0;
}
@@ -315,16 +315,16 @@ void munchmo_state::machine_start()
save_item(NAME(m_nmi_enable));
}
-MACHINE_CONFIG_START(munchmo_state::mnchmobl)
-
+void munchmo_state::mnchmobl(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD(m_maincpu, Z80, XTAL(15'000'000)/4) // from pin 13 of XTAL-driven 163
- MCFG_DEVICE_PROGRAM_MAP(mnchmobl_map)
- MCFG_DEVICE_IRQ_ACKNOWLEDGE_DRIVER(munchmo_state, generic_irq_ack) // IORQ clears flip-flop at 1-2C
+ Z80(config, m_maincpu, XTAL(15'000'000)/4); // from pin 13 of XTAL-driven 163
+ m_maincpu->set_addrmap(AS_PROGRAM, &munchmo_state::mnchmobl_map);
+ m_maincpu->set_irq_acknowledge_callback(FUNC(munchmo_state::generic_irq_ack)); // IORQ clears flip-flop at 1-2C
- MCFG_DEVICE_ADD(m_audiocpu, Z80, XTAL(15'000'000)/8) // from pin 12 of XTAL-driven 163
- MCFG_DEVICE_PROGRAM_MAP(sound_map)
- MCFG_DEVICE_IRQ_ACKNOWLEDGE_DRIVER(munchmo_state, generic_irq_ack) // IORQ clears flip-flop at 1-7H
+ Z80(config, m_audiocpu, XTAL(15'000'000)/8); // from pin 12 of XTAL-driven 163
+ m_audiocpu->set_addrmap(AS_PROGRAM, &munchmo_state::sound_map);
+ m_audiocpu->set_irq_acknowledge_callback(FUNC(munchmo_state::generic_irq_ack)); // IORQ clears flip-flop at 1-7H
LS259(config, m_mainlatch, 0); // 12E
m_mainlatch->q_out_cb<0>().set(FUNC(munchmo_state::palette_bank_0_w)); // BCL0 2-11E
@@ -336,14 +336,14 @@ MACHINE_CONFIG_START(munchmo_state::mnchmobl)
m_mainlatch->q_out_cb<6>().set(FUNC(munchmo_state::nmi_enable_w)); // ENI 1-10C
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(57)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */)
- MCFG_SCREEN_SIZE(256+32+32, 256)
- MCFG_SCREEN_VISIBLE_AREA(0, 255+32+32,0, 255-16)
- MCFG_SCREEN_UPDATE_DRIVER(munchmo_state, screen_update)
- MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE(*this, munchmo_state, vblank_irq))
- MCFG_SCREEN_PALETTE(m_palette)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(57);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500) /* not accurate */);
+ screen.set_size(256+32+32, 256);
+ screen.set_visarea(0, 255+32+32,0, 255-16);
+ screen.set_screen_update(FUNC(munchmo_state::screen_update));
+ screen.screen_vblank().set(FUNC(munchmo_state::vblank_irq));
+ screen.set_palette(m_palette);
GFXDECODE(config, m_gfxdecode, m_palette, gfx_mnchmobl);
PALETTE(config, m_palette, FUNC(munchmo_state::munchmo_palette), 256);
@@ -361,7 +361,7 @@ MACHINE_CONFIG_START(munchmo_state::mnchmobl)
AY8910(config, m_ay8910[1], XTAL(15'000'000)/8);
//m_ay8910[1]->set_flags(AY8910_SINGLE_OUTPUT);
m_ay8910[1]->add_route(ALL_OUTPUTS, "mono", 0.50);
-MACHINE_CONFIG_END
+}
/*************************************
diff --git a/src/mame/drivers/murogem.cpp b/src/mame/drivers/murogem.cpp
index af2d453ca44..440c2183cea 100644
--- a/src/mame/drivers/murogem.cpp
+++ b/src/mame/drivers/murogem.cpp
@@ -249,20 +249,21 @@ uint32_t murogem_state::screen_update(screen_device &screen, bitmap_ind16 &bitma
}
-MACHINE_CONFIG_START(murogem_state::murogem)
+void murogem_state::murogem(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M6802, 8000000) /* ? MHz */
- MCFG_DEVICE_PROGRAM_MAP(murogem_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", murogem_state, irq0_line_hold)
+ M6802(config, m_maincpu, 8000000); /* ? MHz */
+ m_maincpu->set_addrmap(AS_PROGRAM, &murogem_state::murogem_map);
+ m_maincpu->set_vblank_int("screen", FUNC(murogem_state::irq0_line_hold));
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE((39+1)*8, (38+1)*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 0*8, 32*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(murogem_state, screen_update)
- MCFG_SCREEN_PALETTE(m_palette)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size((39+1)*8, (38+1)*8);
+ screen.set_visarea(0*8, 32*8-1, 0*8, 32*8-1);
+ screen.set_screen_update(FUNC(murogem_state::screen_update));
+ screen.set_palette(m_palette);
GFXDECODE(config, m_gfxdecode, m_palette, gfx_murogem);
PALETTE(config, m_palette, FUNC(murogem_state::murogem_palette), 0x100);
@@ -274,10 +275,10 @@ MACHINE_CONFIG_START(murogem_state::murogem)
/* sound hardware */
SPEAKER(config, "speaker").front_center();
- MCFG_DEVICE_ADD("dac", DAC_1BIT, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 0.375)
- MCFG_DEVICE_ADD("vref", VOLTAGE_REGULATOR, 0) MCFG_VOLTAGE_REGULATOR_OUTPUT(5.0)
- MCFG_SOUND_ROUTE(0, "dac", 1.0, DAC_VREF_POS_INPUT)
-MACHINE_CONFIG_END
+ DAC_1BIT(config, "dac", 0).add_route(ALL_OUTPUTS, "speaker", 0.375);
+ voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref", 0));
+ vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT);
+}
ROM_START( murogem )
diff --git a/src/mame/drivers/murogmbl.cpp b/src/mame/drivers/murogmbl.cpp
index 18d51977af9..327cbc5da46 100644
--- a/src/mame/drivers/murogmbl.cpp
+++ b/src/mame/drivers/murogmbl.cpp
@@ -348,53 +348,57 @@ static GFXDECODE_START( gfx_slotunbl )
GFXDECODE_ENTRY( "gfx1", 0, layout8x8x2, 0x0, 1 )
GFXDECODE_END
-MACHINE_CONFIG_START(murogmbl_state::murogmbl)
+void murogmbl_state::murogmbl(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, 1000000) /* Z80? */
- MCFG_DEVICE_PROGRAM_MAP(murogmbl_map)
+ Z80(config, m_maincpu, 1000000); /* Z80? */
+ m_maincpu->set_addrmap(AS_PROGRAM, &murogmbl_state::murogmbl_map);
GFXDECODE(config, m_gfxdecode, m_palette, gfx_murogmbl);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(64*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 0*8, 32*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(murogmbl_state, screen_update)
- MCFG_SCREEN_PALETTE(m_palette)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(64*8, 32*8);
+ screen.set_visarea(0*8, 32*8-1, 0*8, 32*8-1);
+ screen.set_screen_update(FUNC(murogmbl_state::screen_update));
+ screen.set_palette(m_palette);
PALETTE(config, m_palette, FUNC(murogmbl_state::murogmbl_palette), 0x100);
SPEAKER(config, "speaker").front_center();
- MCFG_DEVICE_ADD("dac", DAC_8BIT_R2R, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 0.5) // unknown DAC
- MCFG_DEVICE_ADD("vref", VOLTAGE_REGULATOR, 0) MCFG_VOLTAGE_REGULATOR_OUTPUT(5.0)
- MCFG_SOUND_ROUTE(0, "dac", 1.0, DAC_VREF_POS_INPUT) MCFG_SOUND_ROUTE(0, "dac", -1.0, DAC_VREF_NEG_INPUT)
-MACHINE_CONFIG_END
+ DAC_8BIT_R2R(config, "dac", 0).add_route(ALL_OUTPUTS, "speaker", 0.5); // unknown DAC
+ voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref"));
+ vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT);
+ vref.add_route(0, "dac", -1.0, DAC_VREF_NEG_INPUT);
+}
-MACHINE_CONFIG_START(slotunbl_state::slotunbl)
+void slotunbl_state::slotunbl(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, 1000000) /* Z80? */
- MCFG_DEVICE_PROGRAM_MAP(slotunbl_map)
+ Z80(config, m_maincpu, 1000000); /* Z80? */
+ m_maincpu->set_addrmap(AS_PROGRAM, &slotunbl_state::slotunbl_map);
GFXDECODE(config, m_gfxdecode, m_palette, gfx_slotunbl);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(64*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 0*8, 32*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(slotunbl_state, screen_update)
- MCFG_SCREEN_PALETTE(m_palette)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(64*8, 32*8);
+ screen.set_visarea(0*8, 32*8-1, 0*8, 32*8-1);
+ screen.set_screen_update(FUNC(slotunbl_state::screen_update));
+ screen.set_palette(m_palette);
PALETTE(config, m_palette, FUNC(slotunbl_state::slotunbl_palette), 0x100);
SPEAKER(config, "speaker").front_center();
- MCFG_DEVICE_ADD("dac", DAC_8BIT_R2R, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 0.5) // unknown DAC
- MCFG_DEVICE_ADD("vref", VOLTAGE_REGULATOR, 0) MCFG_VOLTAGE_REGULATOR_OUTPUT(5.0)
- MCFG_SOUND_ROUTE(0, "dac", 1.0, DAC_VREF_POS_INPUT) MCFG_SOUND_ROUTE(0, "dac", -1.0, DAC_VREF_NEG_INPUT)
-MACHINE_CONFIG_END
+ DAC_8BIT_R2R(config, "dac", 0).add_route(ALL_OUTPUTS, "speaker", 0.5); // unknown DAC
+ voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref"));
+ vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT);
+ vref.add_route(0, "dac", -1.0, DAC_VREF_NEG_INPUT);
+}
ROM_START(murogmbl)
ROM_REGION( 0x10000, "maincpu", 0 )
diff --git a/src/mame/drivers/mustache.cpp b/src/mame/drivers/mustache.cpp
index eae1abaf643..9462c33bf02 100644
--- a/src/mame/drivers/mustache.cpp
+++ b/src/mame/drivers/mustache.cpp
@@ -179,28 +179,28 @@ TIMER_DEVICE_CALLBACK_MEMBER(mustache_state::scanline)
-MACHINE_CONFIG_START(mustache_state::mustache)
-
+void mustache_state::mustache(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, CPU_CLOCK)
- MCFG_DEVICE_PROGRAM_MAP(memmap)
- MCFG_DEVICE_OPCODES_MAP(decrypted_opcodes_map)
- MCFG_TIMER_DRIVER_ADD_SCANLINE("scantimer", mustache_state, scanline, "screen", 0, 1)
+ Z80(config, m_maincpu, CPU_CLOCK);
+ m_maincpu->set_addrmap(AS_PROGRAM, &mustache_state::memmap);
+ m_maincpu->set_addrmap(AS_OPCODES, &mustache_state::decrypted_opcodes_map);
+ TIMER(config, "scantimer").configure_scanline(FUNC(mustache_state::scanline), "screen", 0, 1);
SEI80BU(config, "sei80bu", 0).set_device_rom_tag("maincpu");
- MCFG_DEVICE_ADD("t5182", T5182, 0)
+ T5182(config, "t5182", 0);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(56.747)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(32*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(1*8, 31*8-1, 0, 31*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(mustache_state, screen_update)
- MCFG_SCREEN_PALETTE(m_palette)
-
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_mustache)
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_refresh_hz(56.747);
+ m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ m_screen->set_size(32*8, 32*8);
+ m_screen->set_visarea(1*8, 31*8-1, 0, 31*8-1);
+ m_screen->set_screen_update(FUNC(mustache_state::screen_update));
+ m_screen->set_palette(m_palette);
+
+ GFXDECODE(config, m_gfxdecode, m_palette, gfx_mustache);
PALETTE(config, m_palette, palette_device::RGB_444_PROMS, "proms", 256);
/* sound hardware */
@@ -210,7 +210,7 @@ MACHINE_CONFIG_START(mustache_state::mustache)
ymsnd.irq_handler().set("t5182", FUNC(t5182_device::ym2151_irq_handler));
ymsnd.add_route(0, "mono", 1.0);
ymsnd.add_route(1, "mono", 1.0);
-MACHINE_CONFIG_END
+}
ROM_START( mustache )
ROM_REGION( 0x20000, "maincpu", 0 )
diff --git a/src/mame/drivers/mvme147.cpp b/src/mame/drivers/mvme147.cpp
index 4ba6ed13afe..6d3f012d7de 100644
--- a/src/mame/drivers/mvme147.cpp
+++ b/src/mame/drivers/mvme147.cpp
@@ -648,12 +648,14 @@ static void mvme147_vme_cards(device_slot_interface &device)
/*
* Machine configuration
*/
-MACHINE_CONFIG_START(mvme147_state::mvme147)
+void mvme147_state::mvme147(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M68030, 16_MHz_XTAL)
- MCFG_DEVICE_PROGRAM_MAP(mvme147_mem)
- MCFG_VME_DEVICE_ADD("vme")
- MCFG_VME_SLOT_ADD("vme", 1, mvme147_vme_cards, nullptr)
+ M68030(config, m_maincpu, 16_MHz_XTAL);
+ m_maincpu->set_addrmap(AS_PROGRAM, &mvme147_state::mvme147_mem);
+
+ VME(config, "vme", 0);
+ VME_SLOT(config, "slot1", mvme147_vme_cards, nullptr, 1, "vme");
M48T02(config, "m48t18", 0); /* t08 differs only in accepted voltage levels compared to t18 */
@@ -668,7 +670,7 @@ MACHINE_CONFIG_START(mvme147_state::mvme147)
rs232trm.cts_handler().set(m_sccterm, FUNC(scc85c30_device::ctsa_w));
SCC85C30(config, m_sccterm2, SCC_CLOCK);
-MACHINE_CONFIG_END
+}
/* ROM definitions */
ROM_START (mvme147)
diff --git a/src/mame/drivers/mw18w.cpp b/src/mame/drivers/mw18w.cpp
index b502c17ef1d..f3a2e8263e4 100644
--- a/src/mame/drivers/mw18w.cpp
+++ b/src/mame/drivers/mw18w.cpp
@@ -279,13 +279,13 @@ INPUT_PORTS_END
***************************************************************************/
-MACHINE_CONFIG_START(mw18w_state::mw18w)
-
+void mw18w_state::mw18w(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, XTAL(19'968'000)/8)
- MCFG_DEVICE_PERIODIC_INT_DRIVER(mw18w_state, irq0_line_assert, 960.516) // 555 IC
- MCFG_DEVICE_PROGRAM_MAP(mw18w_map)
- MCFG_DEVICE_IO_MAP(mw18w_portmap)
+ Z80(config, m_maincpu, XTAL(19'968'000)/8);
+ m_maincpu->set_periodic_int(FUNC(mw18w_state::irq0_line_assert), attotime::from_hz(960.516)); // 555 IC
+ m_maincpu->set_addrmap(AS_PROGRAM, &mw18w_state::mw18w_map);
+ m_maincpu->set_addrmap(AS_IO, &mw18w_state::mw18w_portmap);
WATCHDOG_TIMER(config, "watchdog");
@@ -293,7 +293,7 @@ MACHINE_CONFIG_START(mw18w_state::mw18w)
/* sound hardware */
//...
-MACHINE_CONFIG_END
+}
diff --git a/src/mame/drivers/mw8080bw.cpp b/src/mame/drivers/mw8080bw.cpp
index 86827f050ab..0cea39f2e87 100644
--- a/src/mame/drivers/mw8080bw.cpp
+++ b/src/mame/drivers/mw8080bw.cpp
@@ -235,6 +235,7 @@ void mw8080bw_state::mw8080bw_root(machine_config &config)
/* basic machine hardware */
I8080(config, m_maincpu, MW8080BW_CPU_CLOCK);
m_maincpu->set_addrmap(AS_PROGRAM, &mw8080bw_state::main_map);
+ m_maincpu->set_irq_acknowledge_callback(FUNC(mw8080bw_state::interrupt_vector));
MCFG_MACHINE_START_OVERRIDE(mw8080bw_state,mw8080bw)
MCFG_MACHINE_RESET_OVERRIDE(mw8080bw_state,mw8080bw)
diff --git a/src/mame/drivers/mwarr.cpp b/src/mame/drivers/mwarr.cpp
index c52875f14e0..420e7ae14cf 100644
--- a/src/mame/drivers/mwarr.cpp
+++ b/src/mame/drivers/mwarr.cpp
@@ -306,22 +306,23 @@ void mwarr_state::machine_reset()
{
}
-MACHINE_CONFIG_START(mwarr_state::mwarr)
+void mwarr_state::mwarr(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M68000, MASTER_CLOCK)
- MCFG_DEVICE_PROGRAM_MAP(mwarr_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", mwarr_state, irq4_line_hold)
+ M68000(config, m_maincpu, MASTER_CLOCK);
+ m_maincpu->set_addrmap(AS_PROGRAM, &mwarr_state::mwarr_map);
+ m_maincpu->set_vblank_int("screen", FUNC(mwarr_state::irq4_line_hold));
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(54)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */)
- MCFG_SCREEN_SIZE(64*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(8+1, 48*8-1-8-1, 0, 30*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(mwarr_state, screen_update_mwarr)
- MCFG_SCREEN_PALETTE(m_palette)
-
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_mwarr)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(54);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500) /* not accurate */);
+ screen.set_size(64*8, 32*8);
+ screen.set_visarea(8+1, 48*8-1-8-1, 0, 30*8-1);
+ screen.set_screen_update(FUNC(mwarr_state::screen_update_mwarr));
+ screen.set_palette(m_palette);
+
+ GFXDECODE(config, m_gfxdecode, m_palette, gfx_mwarr);
PALETTE(config, m_palette).set_format(palette_device::xBGR_555, 0x800);
EDEVICES_VID(config, m_video, 0);
@@ -340,13 +341,12 @@ MACHINE_CONFIG_START(mwarr_state::mwarr)
/* sound hardware */
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("oki1", OKIM6295, SOUND_CLOCK/48 , okim6295_device::PIN7_HIGH)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
+ OKIM6295(config, "oki1", SOUND_CLOCK/48 , okim6295_device::PIN7_HIGH).add_route(ALL_OUTPUTS, "mono", 1.0);
- MCFG_DEVICE_ADD("oki2", OKIM6295, SOUND_CLOCK/48 , okim6295_device::PIN7_HIGH)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
- MCFG_DEVICE_ADDRESS_MAP(0, oki2_map)
-MACHINE_CONFIG_END
+ okim6295_device &oki2(OKIM6295(config, "oki2", SOUND_CLOCK/48 , okim6295_device::PIN7_HIGH));
+ oki2.add_route(ALL_OUTPUTS, "mono", 1.0);
+ oki2.set_addrmap(0, &mwarr_state::oki2_map);
+}
/*************************************
diff --git a/src/mame/drivers/mwsub.cpp b/src/mame/drivers/mwsub.cpp
index 9e204f5c64d..9330a077a97 100644
--- a/src/mame/drivers/mwsub.cpp
+++ b/src/mame/drivers/mwsub.cpp
@@ -222,13 +222,13 @@ INPUT_PORTS_END
***************************************************************************/
-MACHINE_CONFIG_START(submar_state::submar)
-
+void submar_state::submar(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, XTAL(19'968'000)/8)
- MCFG_DEVICE_PERIODIC_INT_DRIVER(submar_state, irq0_line_assert, 124.675) // 555 IC
- MCFG_DEVICE_PROGRAM_MAP(submar_map)
- MCFG_DEVICE_IO_MAP(submar_portmap)
+ Z80(config, m_maincpu, XTAL(19'968'000)/8);
+ m_maincpu->set_periodic_int(FUNC(submar_state::irq0_line_assert), attotime::from_hz(124.675)); // 555 IC
+ m_maincpu->set_addrmap(AS_PROGRAM, &submar_state::submar_map);
+ m_maincpu->set_addrmap(AS_IO, &submar_state::submar_portmap);
WATCHDOG_TIMER(config, "watchdog");
@@ -236,7 +236,7 @@ MACHINE_CONFIG_START(submar_state::submar)
/* sound hardware */
//...
-MACHINE_CONFIG_END
+}
diff --git a/src/mame/drivers/mx2178.cpp b/src/mame/drivers/mx2178.cpp
index e81d39dc860..18b06fb7f92 100644
--- a/src/mame/drivers/mx2178.cpp
+++ b/src/mame/drivers/mx2178.cpp
@@ -131,20 +131,21 @@ void mx2178_state::machine_reset()
{
}
-MACHINE_CONFIG_START(mx2178_state::mx2178)
+void mx2178_state::mx2178(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD(m_maincpu, Z80, XTAL(18'869'600) / 5) // guess
- MCFG_DEVICE_PROGRAM_MAP(mx2178_mem)
- MCFG_DEVICE_IO_MAP(mx2178_io)
+ Z80(config, m_maincpu, XTAL(18'869'600) / 5); // guess
+ m_maincpu->set_addrmap(AS_PROGRAM, &mx2178_state::mx2178_mem);
+ m_maincpu->set_addrmap(AS_IO, &mx2178_state::mx2178_io);
/* video hardware */
- MCFG_SCREEN_ADD_MONOCHROME("screen", RASTER, rgb_t::green())
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) // not correct
- MCFG_SCREEN_UPDATE_DEVICE("crtc", mc6845_device, screen_update)
- MCFG_SCREEN_SIZE(32*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1)
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_mx2178)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER, rgb_t::green()));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500)); // not correct
+ screen.set_screen_update("crtc", FUNC(mc6845_device::screen_update));
+ screen.set_size(32*8, 32*8);
+ screen.set_visarea(0*8, 32*8-1, 2*8, 30*8-1);
+ GFXDECODE(config, "gfxdecode", m_palette, gfx_mx2178);
PALETTE(config, m_palette, palette_device::MONOCHROME);
/* Devices */
@@ -178,7 +179,7 @@ MACHINE_CONFIG_START(mx2178_state::mx2178)
rs232_port_device &rs232b(RS232_PORT(config, "rs232b", default_rs232_devices, "keyboard"));
rs232b.rxd_handler().set("acia2", FUNC(acia6850_device::write_rxd));
rs232b.cts_handler().set("acia2", FUNC(acia6850_device::write_cts));
-MACHINE_CONFIG_END
+}
/* ROM definition */
ROM_START( mx2178 )
diff --git a/src/mame/drivers/myb3k.cpp b/src/mame/drivers/myb3k.cpp
index 8581c56f6d5..b3639487930 100644
--- a/src/mame/drivers/myb3k.cpp
+++ b/src/mame/drivers/myb3k.cpp
@@ -930,7 +930,8 @@ static void stepone_isa_cards(device_slot_interface &device)
device.option_add("myb3k_fdc4711", ISA8_MYB3K_FDC4711);
}
-MACHINE_CONFIG_START(myb3k_state::myb3k)
+void myb3k_state::myb3k(machine_config &config)
+{
/* basic machine hardware */
I8088(config, m_maincpu, XTAL(14'318'181) / 3); /* 14.3182 main crystal divided by three through a 8284A */
m_maincpu->set_addrmap(AS_PROGRAM, &myb3k_state::myb3k_map);
@@ -941,7 +942,7 @@ MACHINE_CONFIG_START(myb3k_state::myb3k)
RAM(config, RAM_TAG).set_default_size("256K").set_extra_options("128K, 256K");
/* Interrupt controller */
- PIC8259(config, m_pic8259, 0);
+ PIC8259(config, m_pic8259);
m_pic8259->out_int_callback().set(FUNC(myb3k_state::pic_int_w));
/* Parallel port */
@@ -970,7 +971,7 @@ MACHINE_CONFIG_START(myb3k_state::myb3k)
m_dma8257->out_dack_cb<3>().set(FUNC(myb3k_state::dack3_w));
/* Timer */
- PIT8253(config, m_pit8253, 0);
+ PIT8253(config, m_pit8253);
m_pit8253->set_clk<0>(XTAL(14'318'181) / 12.0); /* TIMINT straight into IRQ0 */
m_pit8253->out_handler<0>().set(m_pic8259, FUNC(pic8259_device::ir0_w));
m_pit8253->set_clk<1>(XTAL(14'318'181) / 12.0); /* speaker if port c bit 5 is low */
@@ -987,7 +988,8 @@ MACHINE_CONFIG_START(myb3k_state::myb3k)
/* ISA8+ Expansion bus */
ISA8(config, m_isabus, 0);
- m_isabus->set_cputag("maincpu");
+ m_isabus->set_memspace("maincpu", AS_PROGRAM);
+ m_isabus->set_iospace("maincpu", AS_IO);
m_isabus->irq2_callback().set(m_pic8259, FUNC(pic8259_device::ir2_w));
m_isabus->irq3_callback().set(m_pic8259, FUNC(pic8259_device::ir3_w));
m_isabus->irq4_callback().set(m_pic8259, FUNC(pic8259_device::ir4_w));
@@ -999,50 +1001,53 @@ MACHINE_CONFIG_START(myb3k_state::myb3k)
m_isabus->drq2_callback().set("dma", FUNC(i8257_device::dreq2_w));
m_isabus->drq3_callback().set("dma", FUNC(i8257_device::dreq3_w));
- MCFG_DEVICE_ADD("isa1", ISA8_SLOT, 0, "isa", stepone_isa_cards, "myb3k_fdc4711", false) // FIXME: determine ISA bus clock
- MCFG_DEVICE_ADD("isa2", ISA8_SLOT, 0, "isa", stepone_isa_cards, "myb3k_com", false)
- MCFG_DEVICE_ADD("isa3", ISA8_SLOT, 0, "isa", stepone_isa_cards, nullptr, false)
+ ISA8_SLOT(config, "isa1", 0, m_isabus, stepone_isa_cards, "myb3k_fdc4711", false); // FIXME: determine ISA bus clock
+ ISA8_SLOT(config, "isa2", 0, m_isabus, stepone_isa_cards, "myb3k_com", false);
+ ISA8_SLOT(config, "isa3", 0, m_isabus, stepone_isa_cards, nullptr, false);
/* Centronics */
- MCFG_DEVICE_ADD (m_centronics, CENTRONICS, centronics_devices, "printer")
- MCFG_CENTRONICS_ACK_HANDLER (WRITELINE (*this, myb3k_state, centronics_ack_w))
- MCFG_CENTRONICS_BUSY_HANDLER (WRITELINE (*this, myb3k_state, centronics_busy_w))
- MCFG_CENTRONICS_PERROR_HANDLER (WRITELINE (*this, myb3k_state, centronics_perror_w))
- MCFG_CENTRONICS_SELECT_HANDLER (WRITELINE (*this, myb3k_state, centronics_select_w))
- MCFG_CENTRONICS_OUTPUT_LATCH_ADD ("cent_data_out", "centronics")
+
+ CENTRONICS(config, m_centronics, centronics_devices, "printer");
+ m_centronics->ack_handler().set(FUNC(myb3k_state::centronics_ack_w));
+ m_centronics->busy_handler().set(FUNC(myb3k_state::centronics_busy_w));
+ m_centronics->perror_handler().set(FUNC(myb3k_state::centronics_perror_w));
+ m_centronics->select_handler().set(FUNC(myb3k_state::centronics_select_w));
+
+ output_latch_device &cent_data_out(OUTPUT_LATCH(config, "cent_data_out"));
+ m_centronics->set_output_latch(cent_data_out);
/* Sound */
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("speaker", SPEAKER_SOUND)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.00)
+ SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 1.00);
/* Keyboard */
- MCFG_DEVICE_ADD("myb3k_keyboard", MYB3K_KEYBOARD, 0)
- MCFG_MYB3K_KEYBOARD_CB(PUT(myb3k_state, kbd_set_data_and_interrupt))
+ MYB3K_KEYBOARD(config, m_kb, 0);
+ m_kb->set_keyboard_callback(FUNC(myb3k_state::kbd_set_data_and_interrupt));
/* Monitor */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_RAW_PARAMS(XTAL(14'318'181) / 3, 600, 0, 600, 400, 0, 400)
- MCFG_SCREEN_UPDATE_DEVICE("crtc", h46505_device, screen_update)
-MACHINE_CONFIG_END
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_raw(XTAL(14'318'181) / 3, 600, 0, 600, 400, 0, 400);
+ m_screen->set_screen_update("crtc", FUNC(h46505_device::screen_update));
+}
-MACHINE_CONFIG_START(myb3k_state::jb3000)
+void myb3k_state::jb3000(machine_config &config)
+{
myb3k(config);
/* Keyboard */
- MCFG_DEVICE_REPLACE("myb3k_keyboard", JB3000_KEYBOARD, 0)
- MCFG_MYB3K_KEYBOARD_CB(PUT(myb3k_state, kbd_set_data_and_interrupt))
-
-MACHINE_CONFIG_END
+ JB3000_KEYBOARD(config.replace(), m_kb, 0);
+ m_kb->set_keyboard_callback(FUNC(myb3k_state::kbd_set_data_and_interrupt));
+}
-MACHINE_CONFIG_START(myb3k_state::stepone)
+void myb3k_state::stepone(machine_config &config)
+{
myb3k(config);
/* Keyboard */
- MCFG_DEVICE_REPLACE("myb3k_keyboard", STEPONE_KEYBOARD, 0)
- MCFG_MYB3K_KEYBOARD_CB(PUT(myb3k_state, kbd_set_data_and_interrupt))
+ STEPONE_KEYBOARD(config.replace(), m_kb, 0);
+ m_kb->set_keyboard_callback(FUNC(myb3k_state::kbd_set_data_and_interrupt));
/* software lists */
- MCFG_SOFTWARE_LIST_ADD("stepone_flop_list", "stepone_flop")
-MACHINE_CONFIG_END
+ SOFTWARE_LIST(config, "stepone_flop_list").set_original("stepone_flop");
+}
/* ROM definitions, ROM area is 8 x 8Kb and can be populated with 2732 mask ROMs or 2764s */
ROM_START( myb3k )
diff --git a/src/mame/drivers/mycom.cpp b/src/mame/drivers/mycom.cpp
index e4a7e440c27..609dc44fe5a 100644
--- a/src/mame/drivers/mycom.cpp
+++ b/src/mame/drivers/mycom.cpp
@@ -508,11 +508,12 @@ void mycom_state::init_mycom()
membank("boot")->configure_entries(0, 2, &RAM[0x0000], 0x10000);
}
-MACHINE_CONFIG_START(mycom_state::mycom)
+void mycom_state::mycom(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu",Z80, 10_MHz_XTAL / 4)
- MCFG_DEVICE_PROGRAM_MAP(mycom_map)
- MCFG_DEVICE_IO_MAP(mycom_io)
+ Z80(config, m_maincpu, 10_MHz_XTAL / 4);
+ m_maincpu->set_addrmap(AS_PROGRAM, &mycom_state::mycom_map);
+ m_maincpu->set_addrmap(AS_IO, &mycom_state::mycom_io);
I8255(config, m_ppi0);
m_ppi0->out_pa_callback().set(FUNC(mycom_state::mycom_04_w));
@@ -525,19 +526,19 @@ MACHINE_CONFIG_START(mycom_state::mycom)
m_ppi1->out_pc_callback().set(FUNC(mycom_state::mycom_0a_w));
I8255(config, m_ppi2);
- m_ppi2->in_pb_callback().set("rtc", FUNC(msm5832_device::data_r));
- m_ppi2->out_pb_callback().set("rtc", FUNC(msm5832_device::data_w));
+ m_ppi2->in_pb_callback().set(m_rtc, FUNC(msm5832_device::data_r));
+ m_ppi2->out_pb_callback().set(m_rtc, FUNC(msm5832_device::data_w));
m_ppi2->out_pc_callback().set(FUNC(mycom_state::mycom_rtc_w));
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */
- MCFG_SCREEN_UPDATE_DEVICE("crtc", mc6845_device, screen_update)
- MCFG_SCREEN_SIZE(640, 480)
- MCFG_SCREEN_VISIBLE_AREA(0, 320-1, 0, 192-1)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */
+ screen.set_screen_update("crtc", FUNC(mc6845_device::screen_update));
+ screen.set_size(640, 480);
+ screen.set_visarea(0, 320-1, 0, 192-1);
PALETTE(config, m_palette, palette_device::MONOCHROME);
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_mycom)
+ GFXDECODE(config, "gfxdecode", m_palette, gfx_mycom);
/* Manual states clock is 1.008mhz for 40 cols, and 2.016 mhz for 80 cols.
The CRTC is a HD46505S - same as a 6845. The start registers need to be readable. */
@@ -551,22 +552,19 @@ MACHINE_CONFIG_START(mycom_state::mycom)
WAVE(config, "wave", "cassette").add_route(ALL_OUTPUTS, "mono", 0.05);
- MCFG_DEVICE_ADD("sn1", SN76489, 10_MHz_XTAL / 4)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.50)
+ SN76489(config, m_audio, 10_MHz_XTAL / 4).add_route(ALL_OUTPUTS, "mono", 1.50);
/* Devices */
- MCFG_DEVICE_ADD("rtc", MSM5832, 32.768_kHz_XTAL)
+ MSM5832(config, m_rtc, 32.768_kHz_XTAL);
- MCFG_CASSETTE_ADD("cassette")
+ CASSETTE(config, m_cass);
FD1771(config, m_fdc, 16_MHz_XTAL / 16);
- MCFG_FLOPPY_DRIVE_ADD("fdc:0", mycom_floppies, "525sd", floppy_image_device::default_floppy_formats)
- MCFG_FLOPPY_DRIVE_SOUND(true)
- MCFG_FLOPPY_DRIVE_ADD("fdc:1", mycom_floppies, "525sd", floppy_image_device::default_floppy_formats)
- MCFG_FLOPPY_DRIVE_SOUND(true)
+ FLOPPY_CONNECTOR(config, "fdc:0", mycom_floppies, "525sd", floppy_image_device::default_floppy_formats).enable_sound(true);
+ FLOPPY_CONNECTOR(config, "fdc:1", mycom_floppies, "525sd", floppy_image_device::default_floppy_formats).enable_sound(true);
- MCFG_TIMER_DRIVER_ADD_PERIODIC("keyboard_timer", mycom_state, mycom_kbd, attotime::from_hz(20))
-MACHINE_CONFIG_END
+ TIMER(config, "keyboard_timer").configure_periodic(FUNC(mycom_state::mycom_kbd), attotime::from_hz(20));
+}
/* ROM definition */
ROM_START( mycom )
diff --git a/src/mame/drivers/mystston.cpp b/src/mame/drivers/mystston.cpp
index 9c8ececd21d..691132bd391 100644
--- a/src/mame/drivers/mystston.cpp
+++ b/src/mame/drivers/mystston.cpp
@@ -79,14 +79,14 @@ WRITE8_MEMBER(mystston_state::mystston_ay8910_select_w)
if (((*m_ay8910_select & 0x20) == 0x20) && ((data & 0x20) == 0x00))
{
/* bit 4 goes to the 8910 #0 BC1 pin */
- m_ay8910[0]->data_address_w(space, *m_ay8910_select >> 4, *m_ay8910_data);
+ m_ay8910[0]->data_address_w(*m_ay8910_select >> 4, *m_ay8910_data);
}
/* bit 7 goes to 8910 #1 BDIR pin */
if (((*m_ay8910_select & 0x80) == 0x80) && ((data & 0x80) == 0x00))
{
/* bit 6 goes to the 8910 #1 BC1 pin */
- m_ay8910[1]->data_address_w(space, *m_ay8910_select >> 6, *m_ay8910_data);
+ m_ay8910[1]->data_address_w(*m_ay8910_select >> 6, *m_ay8910_data);
}
*m_ay8910_select = data;
@@ -191,11 +191,11 @@ INPUT_PORTS_END
*
*************************************/
-MACHINE_CONFIG_START(mystston_state::mystston)
-
+void mystston_state::mystston(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M6502, CPU_CLOCK)
- MCFG_DEVICE_PROGRAM_MAP(main_map)
+ M6502(config, m_maincpu, CPU_CLOCK);
+ m_maincpu->set_addrmap(AS_PROGRAM, &mystston_state::main_map);
/* video hardware */
mystston_video(config);
@@ -206,7 +206,7 @@ MACHINE_CONFIG_START(mystston_state::mystston)
AY8910(config, m_ay8910[0], AY8910_CLOCK).add_route(ALL_OUTPUTS, "mono", 0.30);
AY8910(config, m_ay8910[1], AY8910_CLOCK).add_route(ALL_OUTPUTS, "mono", 0.30);
-MACHINE_CONFIG_END
+}
diff --git a/src/mame/drivers/mystwarr.cpp b/src/mame/drivers/mystwarr.cpp
index ccf8a2721c7..a9229f5adbf 100644
--- a/src/mame/drivers/mystwarr.cpp
+++ b/src/mame/drivers/mystwarr.cpp
@@ -566,29 +566,13 @@ WRITE8_MEMBER(mystwarr_state::sound_ctrl_w)
quite similar to xexex/gijoe/asterix's sound.
*/
-void mystwarr_state::mystwarr_sound_map(address_map &map)
-{
- map(0x0000, 0x7fff).rom();
- map(0x8000, 0xbfff).bankr("z80bank");
- map(0x0000, 0xbfff).nopw();
- map(0xc000, 0xdfff).ram();
- map(0xe000, 0xe22f).rw(m_k054539_1, FUNC(k054539_device::read), FUNC(k054539_device::write));
- map(0xe230, 0xe3ff).ram();
- map(0xe400, 0xe62f).rw(m_k054539_2, FUNC(k054539_device::read), FUNC(k054539_device::write));
- map(0xe630, 0xe7ff).ram();
- map(0xf000, 0xf003).m(m_k054321, FUNC(k054321_device::sound_map));
- map(0xf800, 0xf800).w(FUNC(mystwarr_state::sound_ctrl_w));
- map(0xfff0, 0xfff3).nopw(); // unknown write
-}
-
-
void mystwarr_state::martchmp_sound_map(address_map &map)
{
map(0x0000, 0x7fff).rom();
map(0x8000, 0xbfff).bankr("z80bank");
map(0x0000, 0xbfff).nopw();
map(0xc000, 0xdfff).ram();
- map(0xe000, 0xe22f).rw("k054539", FUNC(k054539_device::read), FUNC(k054539_device::write));
+ map(0xe000, 0xe22f).rw(m_k054539_1, FUNC(k054539_device::read), FUNC(k054539_device::write));
map(0xe230, 0xe3ff).ram();
map(0xe400, 0xe62f).noprw();
map(0xe630, 0xe7ff).ram();
@@ -598,9 +582,10 @@ void mystwarr_state::martchmp_sound_map(address_map &map)
}
-void mystwarr_state::mystwarr_k054539_map(address_map &map)
+void mystwarr_state::mystwarr_sound_map(address_map &map)
{
- map(0x000000, 0x3fffff).rom().region("k054539", 0);
+ martchmp_sound_map(map);
+ map(0xe400, 0xe62f).rw(m_k054539_2, FUNC(k054539_device::read), FUNC(k054539_device::write));
}
@@ -923,10 +908,9 @@ MACHINE_RESET_MEMBER(mystwarr_state,metamrph)
MACHINE_RESET_MEMBER(mystwarr_state,martchmp)
{
int i;
- k054539_device *k054539 = subdevice<k054539_device>("k054539");
// boost voice(chip 0 channel 4-7)
- for (i=4; i<=7; i++) k054539->set_gain(i, 1.4);
+ for (i=4; i<=7; i++) m_k054539_1->set_gain(i, 1.4);
}
MACHINE_RESET_MEMBER(mystwarr_state,gaiapols)
@@ -996,13 +980,13 @@ void mystwarr_state::mystwarr(machine_config &config)
K054321(config, m_k054321, "lspeaker", "rspeaker");
K054539(config, m_k054539_1, XTAL(18'432'000));
- m_k054539_1->set_addrmap(0, &mystwarr_state::mystwarr_k054539_map);
+ m_k054539_1->set_device_rom_tag("k054539");
m_k054539_1->timer_handler().set(FUNC(mystwarr_state::k054539_nmi_gen));
m_k054539_1->add_route(0, "rspeaker", 1.0); /* stereo channels are inverted */
m_k054539_1->add_route(1, "lspeaker", 1.0);
K054539(config, m_k054539_2, XTAL(18'432'000));
- m_k054539_2->set_addrmap(0, &mystwarr_state::mystwarr_k054539_map);
+ m_k054539_2->set_device_rom_tag("k054539");
m_k054539_2->add_route(0, "rspeaker", 1.0); /* stereo channels are inverted */
m_k054539_2->add_route(1, "lspeaker", 1.0);
}
@@ -1150,13 +1134,7 @@ void mystwarr_state::martchmp(machine_config &config)
m_k055673->set_sprite_callback(FUNC(mystwarr_state::martchmp_sprite_callback), this);
m_k055673->set_config("gfx2", K055673_LAYOUT_GX, -58, -23);
- config.device_remove("k054539_1");
config.device_remove("k054539_2");
-
- k054539_device &k054539(K054539(config, "k054539", XTAL(18'432'000)));
- k054539.timer_handler().set(FUNC(mystwarr_state::k054539_nmi_gen));
- k054539.add_route(0, "rspeaker", 1.0); /* stereo channels are inverted */
- k054539.add_route(1, "lspeaker", 1.0);
}
/**********************************************************************************/
diff --git a/src/mame/drivers/myvision.cpp b/src/mame/drivers/myvision.cpp
index 66d6788c6d4..e4277bec8cd 100644
--- a/src/mame/drivers/myvision.cpp
+++ b/src/mame/drivers/myvision.cpp
@@ -78,8 +78,8 @@ void myvision_state::myvision_mem(address_map &map)
map.unmap_value_high();
//AM_RANGE(0x0000, 0x5fff) // mapped by the cartslot
map(0xa000, 0xa7ff).ram();
- map(0xe000, 0xe000).rw("tms9918", FUNC(tms9918a_device::vram_r), FUNC(tms9918a_device::vram_w));
- map(0xe002, 0xe002).rw("tms9918", FUNC(tms9918a_device::register_r), FUNC(tms9918a_device::register_w));
+ map(0xe000, 0xe000).rw("tms9918", FUNC(tms9918a_device::vram_read), FUNC(tms9918a_device::vram_write));
+ map(0xe002, 0xe002).rw("tms9918", FUNC(tms9918a_device::register_read), FUNC(tms9918a_device::register_write));
}
@@ -140,7 +140,7 @@ INPUT_PORTS_END
void myvision_state::machine_start()
{
if (m_cart->exists())
- m_maincpu->space(AS_PROGRAM).install_read_handler(0x0000, 0x5fff, read8_delegate(FUNC(generic_slot_device::read_rom),(generic_slot_device*)m_cart));
+ m_maincpu->space(AS_PROGRAM).install_read_handler(0x0000, 0x5fff, read8sm_delegate(FUNC(generic_slot_device::read_rom),(generic_slot_device*)m_cart));
save_item(NAME(m_column));
}
@@ -216,9 +216,9 @@ WRITE8_MEMBER( myvision_state::ay_port_b_w )
MACHINE_CONFIG_START(myvision_state::myvision)
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu",Z80, XTAL(10'738'635)/3) /* Not verified */
- MCFG_DEVICE_PROGRAM_MAP(myvision_mem)
- MCFG_DEVICE_IO_MAP(myvision_io)
+ Z80(config, m_maincpu, XTAL(10'738'635)/3); /* Not verified */
+ m_maincpu->set_addrmap(AS_PROGRAM, &myvision_state::myvision_mem);
+ m_maincpu->set_addrmap(AS_IO, &myvision_state::myvision_io);
/* video hardware */
tms9918a_device &vdp(TMS9918A(config, "tms9918", XTAL(10'738'635))); /* Exact model not verified */
@@ -242,7 +242,7 @@ MACHINE_CONFIG_START(myvision_state::myvision)
//MCFG_GENERIC_MANDATORY
/* software lists */
- MCFG_SOFTWARE_LIST_ADD("cart_list","myvision")
+ SOFTWARE_LIST(config, "cart_list").set_original("myvision");
MACHINE_CONFIG_END
/* ROM definition */
diff --git a/src/mame/drivers/mz2000.cpp b/src/mame/drivers/mz2000.cpp
index 05a52679b10..683678c6f63 100644
--- a/src/mame/drivers/mz2000.cpp
+++ b/src/mame/drivers/mz2000.cpp
@@ -876,11 +876,12 @@ static void mz2000_floppies(device_slot_interface &device)
}
-MACHINE_CONFIG_START(mz2000_state::mz2000)
+void mz2000_state::mz2000(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu",Z80, MASTER_CLOCK)
- MCFG_DEVICE_PROGRAM_MAP(mz2000_map)
- MCFG_DEVICE_IO_MAP(mz2000_io)
+ Z80(config, m_maincpu, MASTER_CLOCK);
+ m_maincpu->set_addrmap(AS_PROGRAM, &mz2000_state::mz2000_map);
+ m_maincpu->set_addrmap(AS_IO, &mz2000_state::mz2000_io);
i8255_device &ppi(I8255(config, "i8255_0"));
ppi.in_pa_callback().set(FUNC(mz2000_state::mz2000_porta_r));
@@ -903,44 +904,44 @@ MACHINE_CONFIG_START(mz2000_state::mz2000)
MB8877(config, m_mb8877a, 1_MHz_XTAL);
- MCFG_FLOPPY_DRIVE_ADD("mb8877a:0", mz2000_floppies, "dd", mz2000_state::floppy_formats)
- MCFG_FLOPPY_DRIVE_ADD("mb8877a:1", mz2000_floppies, "dd", mz2000_state::floppy_formats)
- MCFG_FLOPPY_DRIVE_ADD("mb8877a:2", mz2000_floppies, "dd", mz2000_state::floppy_formats)
- MCFG_FLOPPY_DRIVE_ADD("mb8877a:3", mz2000_floppies, "dd", mz2000_state::floppy_formats)
+ FLOPPY_CONNECTOR(config, "mb8877a:0", mz2000_floppies, "dd", mz2000_state::floppy_formats);
+ FLOPPY_CONNECTOR(config, "mb8877a:1", mz2000_floppies, "dd", mz2000_state::floppy_formats);
+ FLOPPY_CONNECTOR(config, "mb8877a:2", mz2000_floppies, "dd", mz2000_state::floppy_formats);
+ FLOPPY_CONNECTOR(config, "mb8877a:3", mz2000_floppies, "dd", mz2000_state::floppy_formats);
- MCFG_SOFTWARE_LIST_ADD("flop_list", "mz2000_flop")
+ SOFTWARE_LIST(config, "flop_list").set_original("mz2000_flop");
- MCFG_CASSETTE_ADD( "cassette" )
- MCFG_CASSETTE_FORMATS(mz700_cassette_formats)
- MCFG_CASSETTE_DEFAULT_STATE(CASSETTE_STOPPED | CASSETTE_MOTOR_ENABLED | CASSETTE_SPEAKER_ENABLED)
- MCFG_CASSETTE_INTERFACE("mz_cass")
+ CASSETTE(config, m_cass);
+ m_cass->set_formats(mz700_cassette_formats);
+ m_cass->set_default_state(CASSETTE_STOPPED | CASSETTE_MOTOR_ENABLED | CASSETTE_SPEAKER_ENABLED);
+ m_cass->set_interface("mz_cass");
- MCFG_SOFTWARE_LIST_ADD("cass_list","mz2000_cass")
+ SOFTWARE_LIST(config, "cass_list").set_original("mz2000_cass");
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */
- MCFG_SCREEN_SIZE(640, 480)
- MCFG_SCREEN_VISIBLE_AREA(0, 640-1, 0, 400-1)
- MCFG_SCREEN_UPDATE_DRIVER(mz2000_state, screen_update_mz2000)
- MCFG_SCREEN_PALETTE(m_palette)
-
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_mz2000)
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_refresh_hz(60);
+ m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */
+ m_screen->set_size(640, 480);
+ m_screen->set_visarea(0, 640-1, 0, 400-1);
+ m_screen->set_screen_update(FUNC(mz2000_state::screen_update_mz2000));
+ m_screen->set_palette(m_palette);
+
+ GFXDECODE(config, "gfxdecode", m_palette, gfx_mz2000);
PALETTE(config, m_palette, palette_device::BRG_3BIT);
SPEAKER(config, "mono").front_center();
- WAVE(config, "wave", "cassette").add_route(ALL_OUTPUTS, "mono", 0.25);
+ WAVE(config, "wave", m_cass).add_route(ALL_OUTPUTS, "mono", 0.25);
BEEP(config, "beeper", 4096).add_route(ALL_OUTPUTS,"mono",0.15);
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(mz2000_state::mz80b)
+void mz2000_state::mz80b(machine_config &config)
+{
mz2000(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_IO_MAP(mz80b_io)
-MACHINE_CONFIG_END
+ m_maincpu->set_addrmap(AS_IO, &mz2000_state::mz80b_io);
+}
diff --git a/src/mame/drivers/mz2500.cpp b/src/mame/drivers/mz2500.cpp
index 73bbf18b4d4..514481eb977 100644
--- a/src/mame/drivers/mz2500.cpp
+++ b/src/mame/drivers/mz2500.cpp
@@ -1787,13 +1787,14 @@ static void mz2500_floppies(device_slot_interface &device)
device.option_add("dd", FLOPPY_35_DD);
}
-MACHINE_CONFIG_START(mz2500_state::mz2500)
+void mz2500_state::mz2500(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, 6000000)
- MCFG_DEVICE_PROGRAM_MAP(mz2500_map)
- MCFG_DEVICE_IO_MAP(mz2500_io)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", mz2500_state, mz2500_vbl)
- MCFG_DEVICE_IRQ_ACKNOWLEDGE_DRIVER(mz2500_state,mz2500_irq_ack)
+ Z80(config, m_maincpu, 6000000);
+ m_maincpu->set_addrmap(AS_PROGRAM, &mz2500_state::mz2500_map);
+ m_maincpu->set_addrmap(AS_IO, &mz2500_state::mz2500_io);
+ m_maincpu->set_vblank_int("screen", FUNC(mz2500_state::mz2500_vbl));
+ m_maincpu->set_irq_acknowledge_callback(FUNC(mz2500_state::mz2500_irq_ack));
for (int bank = 0; bank < 8; bank++)
{
@@ -1828,18 +1829,18 @@ MACHINE_CONFIG_START(mz2500_state::mz2500)
MB8877(config, m_fdc, 1_MHz_XTAL);
- MCFG_FLOPPY_DRIVE_ADD("mb8877a:0", mz2500_floppies, "dd", floppy_image_device::default_floppy_formats)
- MCFG_FLOPPY_DRIVE_ADD("mb8877a:1", mz2500_floppies, "dd", floppy_image_device::default_floppy_formats)
- MCFG_FLOPPY_DRIVE_ADD("mb8877a:2", mz2500_floppies, "dd", floppy_image_device::default_floppy_formats)
- MCFG_FLOPPY_DRIVE_ADD("mb8877a:3", mz2500_floppies, "dd", floppy_image_device::default_floppy_formats)
+ FLOPPY_CONNECTOR(config, "mb8877a:0", mz2500_floppies, "dd", floppy_image_device::default_floppy_formats);
+ FLOPPY_CONNECTOR(config, "mb8877a:1", mz2500_floppies, "dd", floppy_image_device::default_floppy_formats);
+ FLOPPY_CONNECTOR(config, "mb8877a:2", mz2500_floppies, "dd", floppy_image_device::default_floppy_formats);
+ FLOPPY_CONNECTOR(config, "mb8877a:3", mz2500_floppies, "dd", floppy_image_device::default_floppy_formats);
- MCFG_SOFTWARE_LIST_ADD("flop_list", "mz2500")
+ SOFTWARE_LIST(config, "flop_list").set_original("mz2500");
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_RAW_PARAMS(21'477'272, 640+108, 0, 640, 480, 0, 200) //unknown clock / divider
- MCFG_SCREEN_UPDATE_DRIVER(mz2500_state, screen_update_mz2500)
- MCFG_SCREEN_PALETTE(m_palette)
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_raw(21'477'272, 640+108, 0, 640, 480, 0, 200); //unknown clock / divider
+ m_screen->set_screen_update(FUNC(mz2500_state::screen_update_mz2500));
+ m_screen->set_palette(m_palette);
PALETTE(config, m_palette, FUNC(mz2500_state::mz2500_palette), 0x200);
@@ -1857,9 +1858,8 @@ MACHINE_CONFIG_START(mz2500_state::mz2500)
ym.add_route(2, "mono", 0.50);
ym.add_route(3, "mono", 0.50);
- MCFG_DEVICE_ADD("beeper", BEEP, 4096)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS,"mono",0.50)
-MACHINE_CONFIG_END
+ BEEP(config, m_beeper, 4096).add_route(ALL_OUTPUTS,"mono",0.50);
+}
diff --git a/src/mame/drivers/mz3500.cpp b/src/mame/drivers/mz3500.cpp
index 42040e8d6f8..6c965638dcc 100644
--- a/src/mame/drivers/mz3500.cpp
+++ b/src/mame/drivers/mz3500.cpp
@@ -809,18 +809,18 @@ static void mz3500_floppies(device_slot_interface &device)
}
/* TODO: clocks */
-MACHINE_CONFIG_START(mz3500_state::mz3500)
-
+void mz3500_state::mz3500(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("master",Z80,MAIN_CLOCK/2)
- MCFG_DEVICE_PROGRAM_MAP(mz3500_master_map)
- MCFG_DEVICE_IO_MAP(mz3500_master_io)
+ Z80(config, m_master, MAIN_CLOCK/2);
+ m_master->set_addrmap(AS_PROGRAM, &mz3500_state::mz3500_master_map);
+ m_master->set_addrmap(AS_IO, &mz3500_state::mz3500_master_io);
- MCFG_DEVICE_ADD("slave",Z80,MAIN_CLOCK/2)
- MCFG_DEVICE_PROGRAM_MAP(mz3500_slave_map)
- MCFG_DEVICE_IO_MAP(mz3500_slave_io)
+ Z80(config, m_slave, MAIN_CLOCK/2);
+ m_slave->set_addrmap(AS_PROGRAM, &mz3500_state::mz3500_slave_map);
+ m_slave->set_addrmap(AS_IO, &mz3500_state::mz3500_slave_io);
- MCFG_QUANTUM_PERFECT_CPU("master")
+ config.m_perfect_cpu_quantum = subtag("master");
i8255_device &ppi(I8255A(config, "i8255"));
ppi.out_pa_callback().set(FUNC(mz3500_state::mz3500_pa_w));
@@ -829,29 +829,29 @@ MACHINE_CONFIG_START(mz3500_state::mz3500)
UPD765A(config, m_fdc, 8'000'000, true, true);
m_fdc->intrq_wr_callback().set_inputline(m_master, INPUT_LINE_IRQ0);
- MCFG_FLOPPY_DRIVE_ADD("upd765a:0", mz3500_floppies, "525ssdd", floppy_image_device::default_floppy_formats)
- MCFG_FLOPPY_DRIVE_ADD("upd765a:1", mz3500_floppies, "525ssdd", floppy_image_device::default_floppy_formats)
- MCFG_FLOPPY_DRIVE_ADD("upd765a:2", mz3500_floppies, "525ssdd", floppy_image_device::default_floppy_formats)
- MCFG_FLOPPY_DRIVE_ADD("upd765a:3", mz3500_floppies, "525ssdd", floppy_image_device::default_floppy_formats)
+ FLOPPY_CONNECTOR(config, "upd765a:0", mz3500_floppies, "525ssdd", floppy_image_device::default_floppy_formats);
+ FLOPPY_CONNECTOR(config, "upd765a:1", mz3500_floppies, "525ssdd", floppy_image_device::default_floppy_formats);
+ FLOPPY_CONNECTOR(config, "upd765a:2", mz3500_floppies, "525ssdd", floppy_image_device::default_floppy_formats);
+ FLOPPY_CONNECTOR(config, "upd765a:3", mz3500_floppies, "525ssdd", floppy_image_device::default_floppy_formats);
UPD7220(config, m_hgdc1, MAIN_CLOCK/5);
m_hgdc1->set_addrmap(0, &mz3500_state::upd7220_1_map);
- m_hgdc1->set_draw_text_callback(FUNC(mz3500_state::hgdc_draw_text), this);
+ m_hgdc1->set_draw_text(FUNC(mz3500_state::hgdc_draw_text));
m_hgdc1->vsync_wr_callback().set(m_hgdc2, FUNC(upd7220_device::ext_sync_w));
UPD7220(config, m_hgdc2, MAIN_CLOCK/5);
m_hgdc2->set_addrmap(0, &mz3500_state::upd7220_2_map);
- m_hgdc2->set_display_pixels_callback(FUNC(mz3500_state::hgdc_display_pixels), this);
+ m_hgdc2->set_display_pixels(FUNC(mz3500_state::hgdc_display_pixels));
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500))
- MCFG_SCREEN_UPDATE_DRIVER(mz3500_state, screen_update)
- MCFG_SCREEN_SIZE(32*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 0*8, 32*8-1)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500));
+ screen.set_screen_update(FUNC(mz3500_state::screen_update));
+ screen.set_size(32*8, 32*8);
+ screen.set_visarea(0*8, 32*8-1, 0*8, 32*8-1);
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_mz3500)
+ GFXDECODE(config, "gfxdecode", m_palette, gfx_mz3500);
PALETTE(config, m_palette, palette_device::BRG_3BIT);
@@ -859,7 +859,7 @@ MACHINE_CONFIG_START(mz3500_state::mz3500)
SPEAKER(config, "mono").front_center();
BEEP(config, m_beeper, 2400).add_route(ALL_OUTPUTS, "mono", 0.15);
-MACHINE_CONFIG_END
+}
/***************************************************************************
diff --git a/src/mame/drivers/mz6500.cpp b/src/mame/drivers/mz6500.cpp
index c0db3e4506a..b26540cd920 100644
--- a/src/mame/drivers/mz6500.cpp
+++ b/src/mame/drivers/mz6500.cpp
@@ -149,31 +149,32 @@ void mz6500_state::upd7220_map(address_map &map)
}
-MACHINE_CONFIG_START(mz6500_state::mz6500)
+void mz6500_state::mz6500(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", I8086, 8000000) //unk clock
- MCFG_DEVICE_PROGRAM_MAP(mz6500_map)
- MCFG_DEVICE_IO_MAP(mz6500_io)
+ I8086(config, m_maincpu, 8000000); //unk clock
+ m_maincpu->set_addrmap(AS_PROGRAM, &mz6500_state::mz6500_map);
+ m_maincpu->set_addrmap(AS_IO, &mz6500_state::mz6500_io);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(50)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */
- MCFG_SCREEN_UPDATE_DEVICE("upd7220", upd7220_device, screen_update)
- MCFG_SCREEN_SIZE(640, 480)
- MCFG_SCREEN_VISIBLE_AREA(0, 640-1, 0, 480-1)
- MCFG_PALETTE_ADD("palette", 8)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(50);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */
+ screen.set_screen_update("upd7220", FUNC(upd7220_device::screen_update));
+ screen.set_size(640, 480);
+ screen.set_visarea(0, 640-1, 0, 480-1);
+ PALETTE(config, "palette").set_entries(8);
/* Devices */
UPD7220(config, m_hgdc, 8000000/6); // unk clock
m_hgdc->set_addrmap(0, &mz6500_state::upd7220_map);
- m_hgdc->set_display_pixels_callback(FUNC(mz6500_state::hgdc_display_pixels), this);
+ m_hgdc->set_display_pixels(FUNC(mz6500_state::hgdc_display_pixels));
UPD765A(config, m_fdc, 8000000, true, true);
- MCFG_FLOPPY_DRIVE_ADD("upd765:0", mz6500_floppies, "525hd", floppy_image_device::default_floppy_formats)
- MCFG_FLOPPY_DRIVE_ADD("upd765:1", mz6500_floppies, "525hd", floppy_image_device::default_floppy_formats)
-MACHINE_CONFIG_END
+ FLOPPY_CONNECTOR(config, "upd765:0", mz6500_floppies, "525hd", floppy_image_device::default_floppy_formats);
+ FLOPPY_CONNECTOR(config, "upd765:1", mz6500_floppies, "525hd", floppy_image_device::default_floppy_formats);
+}
/* ROM definition */
ROM_START( mz6500 )
diff --git a/src/mame/drivers/mz700.cpp b/src/mame/drivers/mz700.cpp
index 4affb3ddcee..09b1625cd39 100644
--- a/src/mame/drivers/mz700.cpp
+++ b/src/mame/drivers/mz700.cpp
@@ -189,7 +189,7 @@ void mz_state::mz800_io(address_map &map)
map(0xeb, 0xeb).w(FUNC(mz_state::mz800_ramaddr_w));
map(0xf0, 0xf0).portr("atari_joy1").w(FUNC(mz_state::mz800_palette_w));
map(0xf1, 0xf1).portr("atari_joy2");
- map(0xf2, 0xf2).w("sn76489n", FUNC(sn76489_device::command_w));
+ map(0xf2, 0xf2).w("sn76489n", FUNC(sn76489_device::write));
map(0xfc, 0xff).rw("z80pio", FUNC(z80pio_device::read), FUNC(z80pio_device::write));
}
@@ -372,24 +372,25 @@ GFXDECODE_END
MACHINE DRIVERS
***************************************************************************/
-MACHINE_CONFIG_START(mz_state::mz700)
+void mz_state::mz700(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, XTAL(17'734'470)/5)
- MCFG_DEVICE_PROGRAM_MAP(mz700_mem)
- MCFG_DEVICE_IO_MAP(mz700_io)
+ Z80(config, m_maincpu, XTAL(17'734'470)/5);
+ m_maincpu->set_addrmap(AS_PROGRAM, &mz_state::mz700_mem);
+ m_maincpu->set_addrmap(AS_IO, &mz_state::mz700_io);
ADDRESS_MAP_BANK(config, "banke").set_map(&mz_state::mz700_banke).set_options(ENDIANNESS_LITTLE, 8, 16, 0x2000);
MCFG_MACHINE_RESET_OVERRIDE(mz_state, mz700)
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_RAW_PARAMS(XTAL(17'734'470)/2, 568, 0, 40*8, 312, 0, 25*8)
- MCFG_SCREEN_UPDATE_DRIVER(mz_state, screen_update_mz700)
- MCFG_SCREEN_PALETTE(m_palette)
- PALETTE(config, m_palette, palette_device::RGB_3BIT);
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_raw(XTAL(17'734'470)/2, 568, 0, 40*8, 312, 0, 25*8);
+ m_screen->set_screen_update(FUNC(mz_state::screen_update_mz700));
+ m_screen->set_palette(m_palette);
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_mz700)
+ PALETTE(config, m_palette, palette_device::RGB_3BIT);
+ GFXDECODE(config, "gfxdecode", m_palette, gfx_mz700);
/* sound hardware */
SPEAKER(config, "mono").front_center();
@@ -397,8 +398,8 @@ MACHINE_CONFIG_START(mz_state::mz700)
SPEAKER_SOUND(config, "speaker").add_route(ALL_OUTPUTS, "mono", 0.50);
/* ne556 timers */
- MCFG_TIMER_DRIVER_ADD_PERIODIC("cursor", mz_state, ne556_cursor_callback, attotime::from_hz(1.5))
- MCFG_TIMER_DRIVER_ADD_PERIODIC("other", mz_state, ne556_other_callback, attotime::from_hz(34.5))
+ TIMER(config, "cursor").configure_periodic(FUNC(mz_state::ne556_cursor_callback), attotime::from_hz(1.5));
+ TIMER(config, "other").configure_periodic(FUNC(mz_state::ne556_other_callback), attotime::from_hz(34.5));
/* devices */
PIT8253(config, m_pit, 0);
@@ -417,40 +418,38 @@ MACHINE_CONFIG_START(mz_state::mz700)
TTL74145(config, m_ls145);
- MCFG_CASSETTE_ADD( "cassette" )
- MCFG_CASSETTE_FORMATS(mz700_cassette_formats)
- MCFG_CASSETTE_DEFAULT_STATE(CASSETTE_STOPPED | CASSETTE_MOTOR_ENABLED | CASSETTE_SPEAKER_ENABLED)
- MCFG_CASSETTE_INTERFACE("mz_cass")
+ CASSETTE(config, m_cassette);
+ m_cassette->set_formats(mz700_cassette_formats);
+ m_cassette->set_default_state(CASSETTE_STOPPED | CASSETTE_MOTOR_ENABLED | CASSETTE_SPEAKER_ENABLED);
+ m_cassette->set_interface("mz_cass");
- MCFG_SOFTWARE_LIST_ADD("cass_list","mz700_cass")
+ SOFTWARE_LIST(config, "cass_list").set_original("mz700_cass");
/* internal ram */
RAM(config, RAM_TAG).set_default_size("64K");
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(mz_state::mz800)
+void mz_state::mz800(machine_config &config)
+{
mz700(config);
- MCFG_DEVICE_REMOVE("banke")
+ config.device_remove("banke");
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(mz800_mem)
- MCFG_DEVICE_IO_MAP(mz800_io)
+ m_maincpu->set_addrmap(AS_PROGRAM, &mz_state::mz800_mem);
+ m_maincpu->set_addrmap(AS_IO, &mz_state::mz800_io);
ADDRESS_MAP_BANK(config, "bankf").set_map(&mz_state::mz800_bankf).set_options(ENDIANNESS_LITTLE, 8, 16, 0x2000);
MCFG_MACHINE_RESET_OVERRIDE(mz_state, mz800)
- MCFG_GFXDECODE_MODIFY("gfxdecode", gfx_mz800)
+ subdevice<gfxdecode_device>("gfxdecode")->set_info(gfx_mz800);
- MCFG_SCREEN_MODIFY("screen")
- MCFG_SCREEN_UPDATE_DRIVER(mz_state, screen_update_mz800)
+ m_screen->set_screen_update(FUNC(mz_state::screen_update_mz800));
- MCFG_DEVICE_ADD("sn76489n", SN76489, XTAL(17'734'470)/5)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
+ SN76489(config, "sn76489n", XTAL(17'734'470)/5).add_route(ALL_OUTPUTS, "mono", 1.0);
- MCFG_DEVICE_REMOVE("cass_list")
- MCFG_SOFTWARE_LIST_ADD("cass_list","mz800_cass")
+ config.device_remove("cass_list");
+ SOFTWARE_LIST(config, "cass_list").set_original("mz800_cass");
/* devices */
m_pit->set_clk<0>(XTAL(17'734'470)/16);
@@ -461,10 +460,11 @@ MACHINE_CONFIG_START(mz_state::mz800)
pio.out_pa_callback().set(FUNC(mz_state::mz800_z80pio_port_a_w));
pio.out_pb_callback().set("cent_data_out", FUNC(output_latch_device::bus_w));
- MCFG_DEVICE_ADD(m_centronics, CENTRONICS, centronics_devices, "printer")
+ CENTRONICS(config, m_centronics, centronics_devices, "printer");
- MCFG_CENTRONICS_OUTPUT_LATCH_ADD("cent_data_out", "centronics")
-MACHINE_CONFIG_END
+ output_latch_device &cent_data_out(OUTPUT_LATCH(config, "cent_data_out"));
+ m_centronics->set_output_latch(cent_data_out);
+}
/***************************************************************************
diff --git a/src/mame/drivers/mz80.cpp b/src/mame/drivers/mz80.cpp
index 78a4aaeaba7..e54591a6114 100644
--- a/src/mame/drivers/mz80.cpp
+++ b/src/mame/drivers/mz80.cpp
@@ -277,24 +277,25 @@ TIMER_DEVICE_CALLBACK_MEMBER(mz80_state::ne555_tempo_callback)
m_mz80k_tempo_strobe ^= 1;
}
-MACHINE_CONFIG_START(mz80_state::mz80k)
+void mz80_state::mz80k(machine_config &config)
+{
/* basic machine hardware */
/* main CPU */
- MCFG_DEVICE_ADD("maincpu", Z80, XTAL(8'000'000) / 4) /* 2 MHz */
- MCFG_DEVICE_PROGRAM_MAP(mz80k_mem)
- MCFG_DEVICE_IO_MAP(mz80k_io)
+ Z80(config, m_maincpu, XTAL(8'000'000) / 4); /* 2 MHz */
+ m_maincpu->set_addrmap(AS_PROGRAM, &mz80_state::mz80k_mem);
+ m_maincpu->set_addrmap(AS_IO, &mz80_state::mz80k_io);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_SIZE(320, 200)
- MCFG_SCREEN_VISIBLE_AREA(0, 319, 0, 199)
- MCFG_SCREEN_UPDATE_DRIVER(mz80_state, screen_update_mz80k)
- MCFG_SCREEN_PALETTE("palette")
-
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_mz80k)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_size(320, 200);
+ screen.set_visarea(0, 319, 0, 199);
+ screen.set_screen_update(FUNC(mz80_state::screen_update_mz80k));
+ screen.set_palette("palette");
+
+ GFXDECODE(config, "gfxdecode", "palette", gfx_mz80k);
PALETTE(config, "palette", palette_device::MONOCHROME);
/* Audio */
@@ -317,24 +318,26 @@ MACHINE_CONFIG_START(mz80_state::mz80k)
m_pit->set_clk<2>(0);
m_pit->out_handler<2>().set(FUNC(mz80_state::pit_out2_changed));
- MCFG_TIMER_DRIVER_ADD_PERIODIC("tempo", mz80_state, ne555_tempo_callback, attotime::from_hz(34))
- MCFG_CASSETTE_ADD( "cassette" )
- MCFG_CASSETTE_FORMATS(mz700_cassette_formats)
- MCFG_CASSETTE_DEFAULT_STATE(CASSETTE_STOPPED | CASSETTE_MOTOR_ENABLED | CASSETTE_SPEAKER_ENABLED)
-MACHINE_CONFIG_END
+ TIMER(config, "tempo").configure_periodic(FUNC(mz80_state::ne555_tempo_callback), attotime::from_hz(34));
+ CASSETTE(config, m_cassette);
+ m_cassette->set_formats(mz700_cassette_formats);
+ m_cassette->set_default_state(CASSETTE_STOPPED | CASSETTE_MOTOR_ENABLED | CASSETTE_SPEAKER_ENABLED);
+}
-MACHINE_CONFIG_START(mz80_state::mz80kj)
+void mz80_state::mz80kj(machine_config &config)
+{
mz80k(config);
- MCFG_SCREEN_MODIFY("screen")
- MCFG_SCREEN_UPDATE_DRIVER(mz80_state, screen_update_mz80kj)
- MCFG_GFXDECODE_MODIFY("gfxdecode", gfx_mz80kj)
-MACHINE_CONFIG_END
-MACHINE_CONFIG_START(mz80_state::mz80a)
+ subdevice<screen_device>("screen")->set_screen_update(FUNC(mz80_state::screen_update_mz80kj));
+ subdevice<gfxdecode_device>("gfxdecode")->set_info(gfx_mz80kj);
+}
+
+void mz80_state::mz80a(machine_config &config)
+{
mz80k(config);
- MCFG_SCREEN_MODIFY("screen")
- MCFG_SCREEN_UPDATE_DRIVER(mz80_state, screen_update_mz80a)
-MACHINE_CONFIG_END
+
+ subdevice<screen_device>("screen")->set_screen_update(FUNC(mz80_state::screen_update_mz80a));
+}
ROM_START( mz80k )
diff --git a/src/mame/drivers/mzr8105.cpp b/src/mame/drivers/mzr8105.cpp
index a029c2a45c4..76d5fb7af3f 100644
--- a/src/mame/drivers/mzr8105.cpp
+++ b/src/mame/drivers/mzr8105.cpp
@@ -208,13 +208,13 @@ static void mzr8105_vme_cards(device_slot_interface &device)
/*
* Machine configuration
*/
-MACHINE_CONFIG_START(mzr8105_state::mzr8105)
- MCFG_DEVICE_ADD ("maincpu", M68000, XTAL(10'000'000))
- MCFG_DEVICE_PROGRAM_MAP (mzr8105_mem)
- MCFG_VME_DEVICE_ADD("vme")
- MCFG_VME_BUS_OWNER_SPACES()
- MCFG_VME_SLOT_ADD ("vme", 1, mzr8105_vme_cards, "mzr8300")
-MACHINE_CONFIG_END
+void mzr8105_state::mzr8105(machine_config &config)
+{
+ M68000(config, m_maincpu, XTAL(10'000'000));
+ m_maincpu->set_addrmap(AS_PROGRAM, &mzr8105_state::mzr8105_mem);
+ VME(config, "vme", 0).use_owner_spaces();
+ VME_SLOT(config, "slot1", mzr8105_vme_cards, "mzr8300", 1, "vme");
+}
/* ROM definitions */
/* mzr8300 UPD7201 init sequence
diff --git a/src/mame/drivers/nakajies.cpp b/src/mame/drivers/nakajies.cpp
index e6b91e59e4c..f95f0244270 100644
--- a/src/mame/drivers/nakajies.cpp
+++ b/src/mame/drivers/nakajies.cpp
@@ -750,17 +750,18 @@ static GFXDECODE_START( gfx_drwrt400 )
GFXDECODE_ENTRY( "bios", 0x580b6, nakajies_charlayout, 0, 1 )
GFXDECODE_END
-MACHINE_CONFIG_START(nakajies_state::nakajies210)
- MCFG_DEVICE_ADD( "v20hl", V20, X301 / 2 )
- MCFG_DEVICE_PROGRAM_MAP( nakajies_map)
- MCFG_DEVICE_IO_MAP( nakajies_io_map)
-
- MCFG_SCREEN_ADD( "screen", LCD )
- MCFG_SCREEN_REFRESH_RATE( 50 ) /* Wild guess */
- MCFG_SCREEN_UPDATE_DRIVER( nakajies_state, screen_update )
- MCFG_SCREEN_SIZE( 80 * 6, 8 * 8 )
- MCFG_SCREEN_VISIBLE_AREA( 0, 6 * 80 - 1, 0, 8 * 8 - 1 )
- MCFG_SCREEN_PALETTE("palette")
+void nakajies_state::nakajies210(machine_config &config)
+{
+ V20(config, m_maincpu, X301 / 2);
+ m_maincpu->set_addrmap(AS_PROGRAM, &nakajies_state::nakajies_map);
+ m_maincpu->set_addrmap(AS_IO, &nakajies_state::nakajies_io_map);
+
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_LCD));
+ screen.set_refresh_hz(50); /* Wild guess */
+ screen.set_screen_update(FUNC(nakajies_state::screen_update));
+ screen.set_size(80 * 6, 8 * 8);
+ screen.set_visarea(0, 6 * 80 - 1, 0, 8 * 8 - 1);
+ screen.set_palette("palette");
GFXDECODE(config, "gfxdecode", "palette", gfx_wales210);
PALETTE(config, "palette", FUNC(nakajies_state::nakajies_palette), 2);
@@ -772,26 +773,28 @@ MACHINE_CONFIG_START(nakajies_state::nakajies210)
/* rtc */
RP5C01(config, "rtc", XTAL(32'768));
- MCFG_TIMER_DRIVER_ADD_PERIODIC("kb_timer", nakajies_state, kb_timer, attotime::from_hz(250))
-MACHINE_CONFIG_END
+ TIMER(config, "kb_timer").configure_periodic(FUNC(nakajies_state::kb_timer), attotime::from_hz(250));
+}
-MACHINE_CONFIG_START(nakajies_state::dator3k)
+void nakajies_state::dator3k(machine_config &config)
+{
nakajies210(config);
- MCFG_GFXDECODE_MODIFY("gfxdecode", gfx_dator3k)
-MACHINE_CONFIG_END
+ subdevice<gfxdecode_device>("gfxdecode")->set_info(gfx_dator3k);
+}
-MACHINE_CONFIG_START(nakajies_state::nakajies220)
+void nakajies_state::nakajies220(machine_config &config)
+{
nakajies210(config);
- MCFG_GFXDECODE_MODIFY("gfxdecode", gfx_drwrt400)
-MACHINE_CONFIG_END
+ subdevice<gfxdecode_device>("gfxdecode")->set_info(gfx_drwrt400);
+}
-MACHINE_CONFIG_START(nakajies_state::nakajies250)
+void nakajies_state::nakajies250(machine_config &config)
+{
nakajies210(config);
- MCFG_SCREEN_MODIFY( "screen" )
- MCFG_SCREEN_SIZE( 80 * 6, 16 * 8 )
- MCFG_SCREEN_VISIBLE_AREA( 0, 6 * 80 - 1, 0, 16 * 8 - 1 )
- MCFG_GFXDECODE_MODIFY("gfxdecode", gfx_drwrt200)
-MACHINE_CONFIG_END
+ subdevice<screen_device>("screen")->set_size(80 * 6, 16 * 8);
+ subdevice<screen_device>("screen")->set_visarea(0, 6 * 80 - 1, 0, 16 * 8 - 1);
+ subdevice<gfxdecode_device>("gfxdecode")->set_info(gfx_drwrt200);
+}
ROM_START(wales210)
diff --git a/src/mame/drivers/namcofl.cpp b/src/mame/drivers/namcofl.cpp
index 62e2f0b45fb..f5ff7c0df01 100644
--- a/src/mame/drivers/namcofl.cpp
+++ b/src/mame/drivers/namcofl.cpp
@@ -553,30 +553,31 @@ MACHINE_RESET_MEMBER(namcofl_state,namcofl)
}
-MACHINE_CONFIG_START(namcofl_state::namcofl)
- MCFG_DEVICE_ADD("maincpu", I960, 80_MHz_XTAL/4) // i80960KA-20 == 20 MHz part
- MCFG_DEVICE_PROGRAM_MAP(namcofl_mem)
+void namcofl_state::namcofl(machine_config &config)
+{
+ I960(config, m_maincpu, 80_MHz_XTAL/4); // i80960KA-20 == 20 MHz part
+ m_maincpu->set_addrmap(AS_PROGRAM, &namcofl_state::namcofl_mem);
- MCFG_DEVICE_ADD("mcu", NAMCO_C75, 48.384_MHz_XTAL/3)
- MCFG_DEVICE_PROGRAM_MAP(namcoc75_am)
- MCFG_DEVICE_IO_MAP(namcoc75_io)
+ NAMCO_C75(config, m_mcu, 48.384_MHz_XTAL/3);
+ m_mcu->set_addrmap(AS_PROGRAM, &namcofl_state::namcoc75_am);
+ m_mcu->set_addrmap(AS_IO, &namcofl_state::namcoc75_io);
/* TODO: irq generation for these */
- MCFG_TIMER_DRIVER_ADD_PERIODIC("mcu_irq0", namcofl_state, mcu_irq0_cb, attotime::from_hz(60))
- MCFG_TIMER_DRIVER_ADD_PERIODIC("mcu_irq2", namcofl_state, mcu_irq2_cb, attotime::from_hz(60))
- MCFG_TIMER_DRIVER_ADD_PERIODIC("mcu_adc", namcofl_state, mcu_adc_cb, attotime::from_hz(60))
+ TIMER(config, "mcu_irq0").configure_periodic(FUNC(namcofl_state::mcu_irq0_cb), attotime::from_hz(60));
+ TIMER(config, "mcu_irq2").configure_periodic(FUNC(namcofl_state::mcu_irq2_cb), attotime::from_hz(60));
+ TIMER(config, "mcu_adc").configure_periodic(FUNC(namcofl_state::mcu_adc_cb), attotime::from_hz(60));
MCFG_MACHINE_START_OVERRIDE(namcofl_state,namcofl)
MCFG_MACHINE_RESET_OVERRIDE(namcofl_state,namcofl)
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_1);
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_SIZE(NAMCOFL_HTOTAL, NAMCOFL_VTOTAL)
- MCFG_SCREEN_VISIBLE_AREA(0, NAMCOFL_HBSTART-1, 0, NAMCOFL_VBSTART-1)
- MCFG_SCREEN_UPDATE_DRIVER(namcofl_state, screen_update_namcofl)
- MCFG_SCREEN_PALETTE(m_c116)
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_refresh_hz(60);
+ m_screen->set_size(NAMCOFL_HTOTAL, NAMCOFL_VTOTAL);
+ m_screen->set_visarea(0, NAMCOFL_HBSTART-1, 0, NAMCOFL_VBSTART-1);
+ m_screen->set_screen_update(FUNC(namcofl_state::screen_update_namcofl));
+ m_screen->set_palette(m_c116);
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, m_c116, gfx_namcofl)
+ GFXDECODE(config, "gfxdecode", m_c116, gfx_namcofl);
NAMCO_C169ROZ(config, m_c169roz, 0);
m_c169roz->set_palette(m_c116);
@@ -605,12 +606,12 @@ MACHINE_CONFIG_START(namcofl_state::namcofl)
SPEAKER(config, "lspeaker").front_left();
SPEAKER(config, "rspeaker").front_right();
- MCFG_DEVICE_ADD("c352", C352, 48.384_MHz_XTAL/2, 288)
- MCFG_SOUND_ROUTE(0, "lspeaker", 1.00)
- MCFG_SOUND_ROUTE(1, "rspeaker", 1.00)
- //MCFG_SOUND_ROUTE(2, "lspeaker", 1.00) // Second DAC not present.
- //MCFG_SOUND_ROUTE(3, "rspeaker", 1.00)
-MACHINE_CONFIG_END
+ c352_device &c352(C352(config, "c352", 48.384_MHz_XTAL/2, 288));
+ c352.add_route(0, "lspeaker", 1.00);
+ c352.add_route(1, "rspeaker", 1.00);
+ //c352.add_route(2, "lspeaker", 1.00); // Second DAC not present.
+ //c352.add_route(3, "rspeaker", 1.00);
+}
ROM_START( speedrcr )
ROM_REGION( 0x200000, "maincpu", 0 ) // i960 program
diff --git a/src/mame/drivers/namcona1.cpp b/src/mame/drivers/namcona1.cpp
index f8553076ba8..32086e989ee 100644
--- a/src/mame/drivers/namcona1.cpp
+++ b/src/mame/drivers/namcona1.cpp
@@ -622,30 +622,12 @@ WRITE16_MEMBER(namcona1_state::na1mcu_shared_w)
COMBINE_DATA(&m_workram[offset]);
}
-READ16_MEMBER(namcona1_state::snd_r)
-{
- /* can't use DEVREADWRITE8 for this because it is opposite endianness to the CPU for some reason */
- return m_c140->c140_r(space,offset*2+1) | m_c140->c140_r(space,offset*2)<<8;
-}
-
-WRITE16_MEMBER(namcona1_state::snd_w)
-{
- /* can't use DEVREADWRITE8 for this because it is opposite endianness to the CPU for some reason */
- if (ACCESSING_BITS_0_7)
- {
- m_c140->c140_w(space,(offset*2)+1, data);
- }
-
- if (ACCESSING_BITS_8_15)
- {
- m_c140->c140_w(space,(offset*2), data>>8);
- }
-}
-
void namcona1_state::namcona1_mcu_map(address_map &map)
{
map(0x000800, 0x000fff).rw(FUNC(namcona1_state::mcu_mailbox_r), FUNC(namcona1_state::mcu_mailbox_w_mcu)); // "Mailslot" communications ports
- map(0x001000, 0x001fff).rw(FUNC(namcona1_state::snd_r), FUNC(namcona1_state::snd_w)); // C140-alike sound chip
+ map(0x001000, 0x001fff).lrw8("c219_rw",
+ [this](offs_t offset) { return m_c140->c140_r(offset ^ 1)/* need ^ 1 because endian issue */; },
+ [this](offs_t offset, u8 data) { m_c140->c140_w(offset ^ 1, data); }); // C140-alike sound chip
map(0x002000, 0x002fff).rw(FUNC(namcona1_state::na1mcu_shared_r), FUNC(namcona1_state::na1mcu_shared_w)); // mirror of first page of shared work RAM
map(0x003000, 0x00afff).ram(); // there is a 32k RAM chip according to CGFM
map(0x200000, 0x27ffff).rw(FUNC(namcona1_state::na1mcu_shared_r), FUNC(namcona1_state::na1mcu_shared_w)); // shared work RAM
@@ -1043,7 +1025,7 @@ void xday2_namcona2_state::xday2(machine_config &config)
EEPROM_2864(config, "eeprom");
// TODO: unknown sub type
- MSM6242(config,"rtc", XTAL(32'768));
+ MSM6242(config, "rtc", XTAL(32'768));
}
/* NA-1 Hardware */
diff --git a/src/mame/drivers/namconb1.cpp b/src/mame/drivers/namconb1.cpp
index eacff54e35a..b41b05c7eba 100644
--- a/src/mame/drivers/namconb1.cpp
+++ b/src/mame/drivers/namconb1.cpp
@@ -1036,22 +1036,23 @@ void namconb1_state::machine_reset()
/***************************************************************/
-MACHINE_CONFIG_START(namconb1_state::namconb1)
- MCFG_DEVICE_ADD("maincpu", M68EC020, MASTER_CLOCK/2)
- MCFG_DEVICE_PROGRAM_MAP(namconb1_am)
+void namconb1_state::namconb1(machine_config &config)
+{
+ M68EC020(config, m_maincpu, MASTER_CLOCK/2);
+ m_maincpu->set_addrmap(AS_PROGRAM, &namconb1_state::namconb1_am);
- MCFG_DEVICE_ADD("mcu", NAMCO_C75, MASTER_CLOCK/3)
- MCFG_DEVICE_PROGRAM_MAP(namcoc75_am)
- MCFG_DEVICE_IO_MAP(namcoc75_io)
+ NAMCO_C75(config, m_mcu, MASTER_CLOCK/3);
+ m_mcu->set_addrmap(AS_PROGRAM, &namconb1_state::namcoc75_am);
+ m_mcu->set_addrmap(AS_IO, &namconb1_state::namcoc75_io);
EEPROM_2816(config, "eeprom");
- MCFG_TIMER_DRIVER_ADD_SCANLINE("scantimer", namconb1_state, scantimer, "screen", 0, 1)
+ TIMER(config, "scantimer").configure_scanline(FUNC(namconb1_state::scantimer), "screen", 0, 1);
// has to be 60 hz or music will go crazy in nebulray, vshoot, gslugrs*
- MCFG_TIMER_DRIVER_ADD_PERIODIC("mcu_irq0", namconb1_state, mcu_irq0_cb, attotime::from_hz(60))
- MCFG_TIMER_DRIVER_ADD_PERIODIC("mcu_irq2", namconb1_state, mcu_irq2_cb, attotime::from_hz(60))
- MCFG_TIMER_DRIVER_ADD_PERIODIC("mcu_adc", namconb1_state, mcu_adc_cb, attotime::from_hz(60))
+ TIMER(config, "mcu_irq0").configure_periodic(FUNC(namconb1_state::mcu_irq0_cb), attotime::from_hz(60));
+ TIMER(config, "mcu_irq2").configure_periodic(FUNC(namconb1_state::mcu_irq2_cb), attotime::from_hz(60));
+ TIMER(config, "mcu_adc").configure_periodic(FUNC(namconb1_state::mcu_adc_cb), attotime::from_hz(60));
SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
m_screen->set_raw(MASTER_CLOCK/8, 384, 0, 288, 264, 0, 224);
@@ -1082,18 +1083,19 @@ MACHINE_CONFIG_START(namconb1_state::namconb1)
SPEAKER(config, "lspeaker").front_left();
SPEAKER(config, "rspeaker").front_right();
- MCFG_DEVICE_ADD("c352", C352, MASTER_CLOCK/2, 288)
- MCFG_SOUND_ROUTE(0, "lspeaker", 1.00)
- MCFG_SOUND_ROUTE(1, "rspeaker", 1.00)
- //MCFG_SOUND_ROUTE(2, "lspeaker", 1.00) // Second DAC not present.
- //MCFG_SOUND_ROUTE(3, "rspeaker", 1.00)
-MACHINE_CONFIG_END
-
-MACHINE_CONFIG_START(namconb1_state::namconb2)
+
+ c352_device &c352(C352(config, "c352", MASTER_CLOCK/2, 288));
+ c352.add_route(0, "lspeaker", 1.00);
+ c352.add_route(1, "rspeaker", 1.00);
+ //c352.add_route(2, "lspeaker", 1.00); // Second DAC not present.
+ //c352.add_route(3, "rspeaker", 1.00);
+}
+
+void namconb1_state::namconb2(machine_config &config)
+{
namconb1(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(namconb2_am)
+ m_maincpu->set_addrmap(AS_PROGRAM, &namconb1_state::namconb2_am);
m_screen->set_screen_update(FUNC(namconb1_state::screen_update_namconb2));
@@ -1102,9 +1104,10 @@ MACHINE_CONFIG_START(namconb1_state::namconb2)
m_c169roz->set_is_namcofl(false);
m_c169roz->set_ram_words(0x20000/2);
m_c169roz->set_color_base(0x1800);
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(namconb1_state::machbrkr)
+void namconb1_state::machbrkr(machine_config &config)
+{
namconb2(config);
m_c123tmap->set_tile_callback(namco_c123tmap_device::c123_tilemap_delegate(&namconb1_state::NB2TilemapCB_machbrkr, this));
@@ -1114,9 +1117,10 @@ MACHINE_CONFIG_START(namconb1_state::machbrkr)
m_c355spr->set_tile_callback(namco_c355spr_device::c355_obj_code2tile_delegate(&namconb1_state::NB2objcode2tile_machbrkr, this));
MCFG_VIDEO_START_OVERRIDE(namconb1_state,machbrkr)
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(namconb1_state::outfxies)
+void namconb1_state::outfxies(machine_config &config)
+{
namconb2(config);
m_c123tmap->set_tile_callback(namco_c123tmap_device::c123_tilemap_delegate(&namconb1_state::NB2TilemapCB_outfxies, this));
@@ -1126,7 +1130,7 @@ MACHINE_CONFIG_START(namconb1_state::outfxies)
m_c355spr->set_tile_callback(namco_c355spr_device::c355_obj_code2tile_delegate(&namconb1_state::NB2objcode2tile_outfxies, this));
MCFG_VIDEO_START_OVERRIDE(namconb1_state,outfxies)
-MACHINE_CONFIG_END
+}
/***************************************************************/
diff --git a/src/mame/drivers/namcond1.cpp b/src/mame/drivers/namcond1.cpp
index 1c5a8027c14..df2642001aa 100644
--- a/src/mame/drivers/namcond1.cpp
+++ b/src/mame/drivers/namcond1.cpp
@@ -10,13 +10,14 @@
Walter Fath
abcheck TODOs:
- - GFX rom banking is a mystery (bad ROMs? Encryption?)
+ - Ending has a rowscroll GFX bug;
- Where is the extra data ROM mapped?
gynotai TODOs:
- - printer (disable it in service mode);
+ - printer (disable it in service mode to suppress POST error);
- ball sensors aren't understood;
- - Seems to dislike our YGV608 row/colscroll handling;
+ - Seems to dislike our YGV608 row/colscroll handling
+ (for example vertical bounding box is halved offset & size wise for Pac-Man goal stage);
To make abcheck run when the EEPROM is clear:
- F2 to enter service mode
@@ -367,19 +368,19 @@ WRITE_LINE_MEMBER( namcond1_state::raster_irq_w )
m_maincpu->set_input_line(2, state ? ASSERT_LINE : CLEAR_LINE);
}
-MACHINE_CONFIG_START(namcond1_state::namcond1)
-
+void namcond1_state::namcond1(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M68000, XTAL(49'152'000)/4)
- MCFG_DEVICE_PROGRAM_MAP(namcond1_map)
-// MCFG_DEVICE_VBLANK_INT_DRIVER("screen", namcond1_state, irq1_line_hold)
+ M68000(config, m_maincpu, XTAL(49'152'000)/4);
+ m_maincpu->set_addrmap(AS_PROGRAM, &namcond1_state::namcond1_map);
+// m_maincpu->set_vblank_int("screen", FUNC(namcond1_state::irq1_line_hold));
- MCFG_DEVICE_ADD("mcu", H83002, XTAL(49'152'000)/3 )
- MCFG_DEVICE_PROGRAM_MAP( nd1h8rwmap)
- MCFG_DEVICE_IO_MAP( nd1h8iomap)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", namcond1_state, mcu_interrupt)
+ H83002(config, m_mcu, XTAL(49'152'000)/3 );
+ m_mcu->set_addrmap(AS_PROGRAM, &namcond1_state::nd1h8rwmap);
+ m_mcu->set_addrmap(AS_IO, &namcond1_state::nd1h8iomap);
+ m_mcu->set_vblank_int("screen", FUNC(namcond1_state::mcu_interrupt));
- MCFG_QUANTUM_TIME(attotime::from_hz(6000))
+ config.m_minimum_quantum = attotime::from_hz(6000);
YGV608(config, m_ygv608, 0);
m_ygv608->set_palette("palette");
@@ -388,39 +389,39 @@ MACHINE_CONFIG_START(namcond1_state::namcond1)
m_ygv608->set_screen("screen");
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
/*
H 804 108 576 48 32
V 261 26 224 3 0
*/
- MCFG_SCREEN_RAW_PARAMS( XTAL(49'152'000)/8, 804/2, 108/2, (108+576)/2, 261, 26, 26+224)
- MCFG_SCREEN_UPDATE_DEVICE("ygv608", ygv608_device, update_screen)
- MCFG_SCREEN_PALETTE("palette")
+ screen.set_raw( XTAL(49'152'000)/8, 804/2, 108/2, (108+576)/2, 261, 26, 26+224);
+ screen.set_screen_update("ygv608", FUNC(ygv608_device::update_screen));
+ screen.set_palette("palette");
- MCFG_PALETTE_ADD("palette", 256)
+ PALETTE(config, "palette").set_entries(256);
/* sound hardware */
SPEAKER(config, "lspeaker").front_left();
SPEAKER(config, "rspeaker").front_right();
- MCFG_DEVICE_ADD("c352", C352, XTAL(49'152'000)/2, 288)
- MCFG_SOUND_ROUTE(0, "lspeaker", 1.00)
- MCFG_SOUND_ROUTE(1, "rspeaker", 1.00)
- //MCFG_SOUND_ROUTE(2, "lspeaker", 1.00) // Second DAC not present.
- //MCFG_SOUND_ROUTE(3, "rspeaker", 1.00)
+ c352_device &c352(C352(config, "c352", XTAL(49'152'000)/2, 288));
+ c352.add_route(0, "lspeaker", 1.00);
+ c352.add_route(1, "rspeaker", 1.00);
+ //c352.add_route(2, "lspeaker", 1.00); // Second DAC not present.
+ //c352.add_route(3, "rspeaker", 1.00);
- MCFG_DEVICE_ADD("at28c16", AT28C16, 0)
-MACHINE_CONFIG_END
+ AT28C16(config, "at28c16", 0);
+}
-MACHINE_CONFIG_START(namcond1_state::abcheck)
+void namcond1_state::abcheck(machine_config &config)
+{
namcond1(config);
- MCFG_DEVICE_REPLACE("maincpu", M68000, XTAL(49'152'000)/4)
- MCFG_DEVICE_PROGRAM_MAP(abcheck_map)
-// MCFG_DEVICE_VBLANK_INT_DRIVER("screen", namcond1_state, irq1_line_hold)
+ m_maincpu->set_addrmap(AS_PROGRAM, &namcond1_state::abcheck_map);
+// m_maincpu->set_vblank_int("screen", FUNC(namcond1_state::irq1_line_hold));
NVRAM(config, "zpr1", nvram_device::DEFAULT_ALL_0);
NVRAM(config, "zpr2", nvram_device::DEFAULT_ALL_0);
-MACHINE_CONFIG_END
+}
ROM_START( ncv1 )
ROM_REGION( 0x100000, "maincpu", 0 ) /* 16MB for Main CPU */
diff --git a/src/mame/drivers/namcos1.cpp b/src/mame/drivers/namcos1.cpp
index eee1d1b93d4..458bedf556e 100644
--- a/src/mame/drivers/namcos1.cpp
+++ b/src/mame/drivers/namcos1.cpp
@@ -347,12 +347,12 @@ C - uses sub board with support for player 3 and 4 controls
/**********************************************************************/
-WRITE8_MEMBER(namcos1_state::audiocpu_irq_ack_w)
+void namcos1_state::audiocpu_irq_ack_w(u8 data)
{
m_audiocpu->set_input_line(M6809_IRQ_LINE, CLEAR_LINE);
}
-WRITE8_MEMBER(namcos1_state::mcu_irq_ack_w)
+void namcos1_state::mcu_irq_ack_w(u8 data)
{
m_mcu->set_input_line(HD6301_IRQ_LINE, CLEAR_LINE);
}
@@ -366,20 +366,20 @@ READ8_MEMBER(namcos1_state::dsw_r)
// ------1- ls257 dsw selector 3y
// -------0 ls257 dsw selector 4y
- m_dsw_sel->write_ba(m_io_dipsw->read());
+ m_dsw_sel->ba_w(m_io_dipsw->read());
m_dsw_sel->select_w(BIT(offset, 1));
- return 0xf0 | bitswap<4>(m_dsw_sel->output_r(space, 0), 0, 1, 2, 3);
+ return 0xf0 | bitswap<4>(m_dsw_sel->output_r(), 0, 1, 2, 3);
}
-WRITE8_MEMBER(namcos1_state::coin_w)
+void namcos1_state::coin_w(u8 data)
{
machine().bookkeeping().coin_lockout_global_w(BIT(~data, 0));
machine().bookkeeping().coin_counter_w(0, BIT(data, 1));
machine().bookkeeping().coin_counter_w(1, BIT(data, 2));
}
-WRITE8_MEMBER(namcos1_state::dac_gain_w)
+void namcos1_state::dac_gain_w(u8 data)
{
/* DAC0 (GAIN0 = bit0, GAIN1 = bit2) */
int dac0_gain = (BIT(data, 2) << 1) | BIT(data, 0);
@@ -1076,7 +1076,6 @@ void namcos1_state::ns1(machine_config &config)
m_dac[1]->add_route(ALL_OUTPUTS, "rspeaker", 0.5);
voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref", 0));
- vref.set_output(5.0);
vref.add_route(0, "dac0", 1.0, DAC_VREF_POS_INPUT);
vref.add_route(0, "dac0", -1.0, DAC_VREF_NEG_INPUT);
vref.add_route(0, "dac1", 1.0, DAC_VREF_POS_INPUT);
diff --git a/src/mame/drivers/namcos2.cpp b/src/mame/drivers/namcos2.cpp
index 80279914f30..0b03529e90e 100644
--- a/src/mame/drivers/namcos2.cpp
+++ b/src/mame/drivers/namcos2.cpp
@@ -1777,30 +1777,31 @@ void namcos2_state::configure_c123tmap_standard(machine_config &config)
m_c123tmap->set_color_base(16*256);
}
-MACHINE_CONFIG_START(namcos2_state::base_noio)
- MCFG_DEVICE_ADD("maincpu", M68000, M68K_CPU_CLOCK) /* 12.288MHz (49.152MHz OSC/4) */
- MCFG_DEVICE_PROGRAM_MAP(master_default_am)
- MCFG_TIMER_DRIVER_ADD_SCANLINE("scantimer", namcos2_state, screen_scanline, "screen", 0, 1)
+void namcos2_state::base_noio(machine_config &config)
+{
+ M68000(config, m_maincpu, M68K_CPU_CLOCK); /* 12.288MHz (49.152MHz OSC/4) */
+ m_maincpu->set_addrmap(AS_PROGRAM, &namcos2_state::master_default_am);
+ TIMER(config, "scantimer").configure_scanline(FUNC(namcos2_state::screen_scanline), "screen", 0, 1);
- MCFG_DEVICE_ADD("slave", M68000, M68K_CPU_CLOCK) /* 12.288MHz (49.152MHz OSC/4) */
- MCFG_DEVICE_PROGRAM_MAP(slave_default_am)
+ M68000(config, m_slave, M68K_CPU_CLOCK); /* 12.288MHz (49.152MHz OSC/4) */
+ m_slave->set_addrmap(AS_PROGRAM, &namcos2_state::slave_default_am);
- MCFG_DEVICE_ADD("audiocpu", MC6809E, M68B09_CPU_CLOCK) /* 2.048MHz (49.152MHz OSC/24) - Sound handling */
- MCFG_DEVICE_PROGRAM_MAP(sound_default_am)
- MCFG_DEVICE_PERIODIC_INT_DRIVER(namcos2_state, irq0_line_hold, 2*60)
- MCFG_DEVICE_PERIODIC_INT_DRIVER(namcos2_state, irq1_line_hold, 120)
+ MC6809E(config, m_audiocpu, M68B09_CPU_CLOCK); /* 2.048MHz (49.152MHz OSC/24) - Sound handling */
+ m_audiocpu->set_addrmap(AS_PROGRAM, &namcos2_state::sound_default_am);
+ m_audiocpu->set_periodic_int(FUNC(namcos2_state::irq0_line_hold), attotime::from_hz(2*60));
+ m_audiocpu->set_periodic_int(FUNC(namcos2_state::irq1_line_hold), attotime::from_hz(120));
- MCFG_QUANTUM_TIME(attotime::from_hz(12000)) /* CPU slices per frame */
+ config.m_minimum_quantum = attotime::from_hz(12000); /* CPU slices per frame */
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_1);
configure_c148_standard(config);
NAMCO_C139(config, m_sci, 0);
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_RAW_PARAMS(MAIN_OSC_CLOCK/8, 384, 0*8, 36*8, 264, 0*8, 28*8)
- MCFG_SCREEN_UPDATE_DRIVER(namcos2_state, screen_update)
- MCFG_SCREEN_PALETTE(m_c116)
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_raw(MAIN_OSC_CLOCK/8, 384, 0*8, 36*8, 264, 0*8, 28*8);
+ m_screen->set_screen_update(FUNC(namcos2_state::screen_update));
+ m_screen->set_palette(m_c116);
configure_c123tmap_standard(config);
@@ -1815,7 +1816,7 @@ MACHINE_CONFIG_START(namcos2_state::base_noio)
configure_c116_standard(config);
- MCFG_DEVICE_ADD(m_gfxdecode, GFXDECODE, m_c116, gfx_namcos2)
+ GFXDECODE(config, m_gfxdecode, m_c116, gfx_namcos2);
SPEAKER(config, "lspeaker").front_left();
SPEAKER(config, "rspeaker").front_right();
@@ -1826,34 +1827,36 @@ MACHINE_CONFIG_START(namcos2_state::base_noio)
m_c140->add_route(1, "rspeaker", 0.75);
YM2151(config, "ymsnd", YM2151_SOUND_CLOCK).add_route(0, "lspeaker", 0.80).add_route(1, "rspeaker", 0.80); /* 3.579545MHz */
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(namcos2_state::base)
+void namcos2_state::base(machine_config &config)
+{
base_noio(config);
configure_c65_standard(config);
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(namcos2_state::base_c68)
+void namcos2_state::base_c68(machine_config &config)
+{
base_noio(config);
configure_c68_standard(config);
-MACHINE_CONFIG_END
+}
-/* adjusted machine driver start */
-MACHINE_CONFIG_START(namcos2_state::base2)
+void namcos2_state::base2(machine_config &config)
+{
base(config);
m_c140->reset_routes();
m_c140->add_route(0, "lspeaker", 1.0);
m_c140->add_route(1, "rspeaker", 1.0);
-MACHINE_CONFIG_END
-/* end */
+}
-MACHINE_CONFIG_START(namcos2_state::assaultp)
+void namcos2_state::assaultp(machine_config &config)
+{
base2(config);
- MCFG_QUANTUM_TIME(attotime::from_hz(12000*8)) /* CPU slices per frame - boosted (along with MCU speed) so that the Mode Select works */
-MACHINE_CONFIG_END
+ config.m_minimum_quantum = attotime::from_hz(12000*8); /* CPU slices per frame - boosted (along with MCU speed) so that the Mode Select works */
+}
void namcos2_state::base3(machine_config &config)
{
@@ -1866,34 +1869,35 @@ void namcos2_state::base3(machine_config &config)
YM2151(config.replace(), "ymsnd", YM2151_SOUND_CLOCK).add_route(0, "lspeaker", 1.0).add_route(1, "rspeaker", 1.0); /* 3.579545MHz */
}
-MACHINE_CONFIG_START(namcos2_state::gollygho)
- MCFG_DEVICE_ADD("maincpu", M68000, M68K_CPU_CLOCK) /* 12.288MHz (49.152MHz OSC/4) */
- MCFG_DEVICE_PROGRAM_MAP(master_default_am)
- MCFG_TIMER_DRIVER_ADD_SCANLINE("scantimer", namcos2_state, screen_scanline, "screen", 0, 1)
+void namcos2_state::gollygho(machine_config &config)
+{
+ M68000(config, m_maincpu, M68K_CPU_CLOCK); /* 12.288MHz (49.152MHz OSC/4) */
+ m_maincpu->set_addrmap(AS_PROGRAM, &namcos2_state::master_default_am);
+ TIMER(config, "scantimer").configure_scanline(FUNC(namcos2_state::screen_scanline), "screen", 0, 1);
- MCFG_DEVICE_ADD("slave", M68000, M68K_CPU_CLOCK) /* 12.288MHz (49.152MHz OSC/4) */
- MCFG_DEVICE_PROGRAM_MAP(slave_default_am)
+ M68000(config, m_slave, M68K_CPU_CLOCK); /* 12.288MHz (49.152MHz OSC/4) */
+ m_slave->set_addrmap(AS_PROGRAM, &namcos2_state::slave_default_am);
- MCFG_DEVICE_ADD("audiocpu", MC6809E, M68B09_CPU_CLOCK) /* 2.048MHz (49.152MHz OSC/24) - Sound handling */
- MCFG_DEVICE_PROGRAM_MAP(sound_default_am)
- MCFG_DEVICE_PERIODIC_INT_DRIVER(namcos2_state, irq0_line_hold, 2*60)
- MCFG_DEVICE_PERIODIC_INT_DRIVER(namcos2_state, irq1_line_hold, 120)
+ MC6809E(config, m_audiocpu, M68B09_CPU_CLOCK); /* 2.048MHz (49.152MHz OSC/24) - Sound handling */
+ m_audiocpu->set_addrmap(AS_PROGRAM, &namcos2_state::sound_default_am);
+ m_audiocpu->set_periodic_int(FUNC(namcos2_state::irq0_line_hold), attotime::from_hz(2*60));
+ m_audiocpu->set_periodic_int(FUNC(namcos2_state::irq1_line_hold), attotime::from_hz(120));
configure_c65_standard(config);
- MCFG_QUANTUM_TIME(attotime::from_hz(6000)) /* CPU slices per frame */
+ config.m_minimum_quantum = attotime::from_hz(6000); /* CPU slices per frame */
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_1);
configure_c148_standard(config);
NAMCO_C139(config, m_sci, 0);
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_RAW_PARAMS(MAIN_OSC_CLOCK/8, 384, 0*8, 36*8, 264, 0*8, 28*8)
- MCFG_SCREEN_UPDATE_DRIVER(namcos2_state, screen_update)
- MCFG_SCREEN_PALETTE(m_c116)
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_raw(MAIN_OSC_CLOCK/8, 384, 0*8, 36*8, 264, 0*8, 28*8);
+ m_screen->set_screen_update(FUNC(namcos2_state::screen_update));
+ m_screen->set_palette(m_c116);
- MCFG_DEVICE_ADD(m_gfxdecode, GFXDECODE, m_c116, gfx_namcos2)
+ GFXDECODE(config, m_gfxdecode, m_c116, gfx_namcos2);
configure_c123tmap_standard(config);
@@ -1917,35 +1921,36 @@ MACHINE_CONFIG_START(namcos2_state::gollygho)
m_c140->add_route(1, "rspeaker", 0.75);
YM2151(config, "ymsnd", YM2151_SOUND_CLOCK).add_route(0, "lspeaker", 0.80).add_route(1, "rspeaker", 0.80); /* 3.579545MHz */
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(namcos2_state::finallap_noio)
- MCFG_DEVICE_ADD("maincpu", M68000, M68K_CPU_CLOCK) /* 12.288MHz (49.152MHz OSC/4) */
- MCFG_DEVICE_PROGRAM_MAP(master_finallap_am)
- MCFG_TIMER_DRIVER_ADD_SCANLINE("scantimer", namcos2_state, screen_scanline, "screen", 0, 1)
+void namcos2_state::finallap_noio(machine_config &config)
+{
+ M68000(config, m_maincpu, M68K_CPU_CLOCK); /* 12.288MHz (49.152MHz OSC/4) */
+ m_maincpu->set_addrmap(AS_PROGRAM, &namcos2_state::master_finallap_am);
+ TIMER(config, "scantimer").configure_scanline(FUNC(namcos2_state::screen_scanline), "screen", 0, 1);
- MCFG_DEVICE_ADD("slave", M68000, M68K_CPU_CLOCK) /* 12.288MHz (49.152MHz OSC/4) */
- MCFG_DEVICE_PROGRAM_MAP(slave_finallap_am)
+ M68000(config, m_slave, M68K_CPU_CLOCK); /* 12.288MHz (49.152MHz OSC/4) */
+ m_slave->set_addrmap(AS_PROGRAM, &namcos2_state::slave_finallap_am);
- MCFG_DEVICE_ADD("audiocpu", MC6809E, M68B09_CPU_CLOCK) /* 2.048MHz (49.152MHz OSC/24) - Sound handling */
- MCFG_DEVICE_PROGRAM_MAP(sound_default_am)
- MCFG_DEVICE_PERIODIC_INT_DRIVER(namcos2_state, irq0_line_hold, 2*60)
- MCFG_DEVICE_PERIODIC_INT_DRIVER(namcos2_state, irq1_line_hold, 120)
+ MC6809E(config, m_audiocpu, M68B09_CPU_CLOCK); /* 2.048MHz (49.152MHz OSC/24) - Sound handling */
+ m_audiocpu->set_addrmap(AS_PROGRAM, &namcos2_state::sound_default_am);
+ m_audiocpu->set_periodic_int(FUNC(namcos2_state::irq0_line_hold), attotime::from_hz(2*60));
+ m_audiocpu->set_periodic_int(FUNC(namcos2_state::irq1_line_hold), attotime::from_hz(120));
- MCFG_QUANTUM_TIME(attotime::from_hz(6000)) /* CPU slices per frame */
+ config.m_minimum_quantum = attotime::from_hz(6000); /* CPU slices per frame */
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_1);
configure_c148_standard(config);
NAMCO_C139(config, m_sci, 0);
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_RAW_PARAMS(MAIN_OSC_CLOCK/8, 384, 0*8, 36*8, 264, 0*8, 28*8)
- MCFG_SCREEN_UPDATE_DRIVER(namcos2_state, screen_update_finallap)
- MCFG_SCREEN_PALETTE(m_c116)
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_raw(MAIN_OSC_CLOCK/8, 384, 0*8, 36*8, 264, 0*8, 28*8);
+ m_screen->set_screen_update(FUNC(namcos2_state::screen_update_finallap));
+ m_screen->set_palette(m_c116);
- MCFG_DEVICE_ADD(m_gfxdecode, GFXDECODE, m_c116, gfx_namcos2)
+ GFXDECODE(config, m_gfxdecode, m_c116, gfx_namcos2);
configure_c123tmap_standard(config);
@@ -1967,61 +1972,66 @@ MACHINE_CONFIG_START(namcos2_state::finallap_noio)
m_c140->add_route(1, "rspeaker", 0.75);
YM2151(config, "ymsnd", YM2151_SOUND_CLOCK).add_route(0, "lspeaker", 0.80).add_route(1, "rspeaker", 0.80); /* 3.579545MHz */
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(namcos2_state::finallap)
+void namcos2_state::finallap(machine_config &config)
+{
finallap_noio(config);
configure_c65_standard(config);
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(namcos2_state::finallap_c68)
+void namcos2_state::finallap_c68(machine_config &config)
+{
finallap_noio(config);
configure_c68_standard(config);
-MACHINE_CONFIG_END
+}
// finalap2 has different mangle
-MACHINE_CONFIG_START(namcos2_state::finalap2)
+void namcos2_state::finalap2(machine_config &config)
+{
finallap(config);
m_c123tmap->set_tile_callback(namco_c123tmap_device::c123_tilemap_delegate(&namcos2_state::TilemapCB_finalap2, this));
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(namcos2_state::finalap3)
+void namcos2_state::finalap3(machine_config &config)
+{
finallap_c68(config);
m_c123tmap->set_tile_callback(namco_c123tmap_device::c123_tilemap_delegate(&namcos2_state::TilemapCB_finalap2, this));
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(namcos2_state::sgunner)
- MCFG_DEVICE_ADD("maincpu", M68000, M68K_CPU_CLOCK) /* 12.288MHz (49.152MHz OSC/4) */
- MCFG_DEVICE_PROGRAM_MAP(master_sgunner_am)
- MCFG_TIMER_DRIVER_ADD_SCANLINE("scantimer", namcos2_state, screen_scanline, "screen", 0, 1)
+void namcos2_state::sgunner(machine_config &config)
+{
+ M68000(config, m_maincpu, M68K_CPU_CLOCK); /* 12.288MHz (49.152MHz OSC/4) */
+ m_maincpu->set_addrmap(AS_PROGRAM, &namcos2_state::master_sgunner_am);
+ TIMER(config, "scantimer").configure_scanline(FUNC(namcos2_state::screen_scanline), "screen", 0, 1);
- MCFG_DEVICE_ADD("slave", M68000, M68K_CPU_CLOCK) /* 12.288MHz (49.152MHz OSC/4) */
- MCFG_DEVICE_PROGRAM_MAP(slave_sgunner_am)
+ M68000(config, m_slave, M68K_CPU_CLOCK); /* 12.288MHz (49.152MHz OSC/4) */
+ m_slave->set_addrmap(AS_PROGRAM, &namcos2_state::slave_sgunner_am);
- MCFG_DEVICE_ADD("audiocpu", MC6809E, M68B09_CPU_CLOCK) /* 2.048MHz (49.152MHz OSC/24) - Sound handling */
- MCFG_DEVICE_PROGRAM_MAP(sound_default_am)
- MCFG_DEVICE_PERIODIC_INT_DRIVER(namcos2_state, irq0_line_hold, 2*60)
- MCFG_DEVICE_PERIODIC_INT_DRIVER(namcos2_state, irq1_line_hold, 120)
+ MC6809E(config, m_audiocpu, M68B09_CPU_CLOCK); /* 2.048MHz (49.152MHz OSC/24) - Sound handling */
+ m_audiocpu->set_addrmap(AS_PROGRAM, &namcos2_state::sound_default_am);
+ m_audiocpu->set_periodic_int(FUNC(namcos2_state::irq0_line_hold), attotime::from_hz(2*60));
+ m_audiocpu->set_periodic_int(FUNC(namcos2_state::irq1_line_hold), attotime::from_hz(120));
configure_c65_standard(config);
- MCFG_QUANTUM_TIME(attotime::from_hz(6000)) /* CPU slices per frame */
+ config.m_minimum_quantum = attotime::from_hz(6000); /* CPU slices per frame */
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_1);
configure_c148_standard(config);
NAMCO_C139(config, m_sci, 0);
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_RAW_PARAMS(MAIN_OSC_CLOCK/8, 384, 0*8, 36*8, 264, 0*8, 28*8)
- MCFG_SCREEN_UPDATE_DRIVER(namcos2_state, screen_update_sgunner)
- MCFG_SCREEN_PALETTE(m_c116)
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_raw(MAIN_OSC_CLOCK/8, 384, 0*8, 36*8, 264, 0*8, 28*8);
+ m_screen->set_screen_update(FUNC(namcos2_state::screen_update_sgunner));
+ m_screen->set_palette(m_c116);
- MCFG_DEVICE_ADD(m_gfxdecode, GFXDECODE, m_c116, gfx_c355)
+ GFXDECODE(config, m_gfxdecode, m_c116, gfx_c355);
NAMCO_C355SPR(config, m_c355spr, 0);
m_c355spr->set_screen(m_screen);
@@ -2046,36 +2056,37 @@ MACHINE_CONFIG_START(namcos2_state::sgunner)
m_c140->add_route(1, "rspeaker", 0.75);
YM2151(config, "ymsnd", YM2151_SOUND_CLOCK).add_route(0, "lspeaker", 0.80).add_route(1, "rspeaker", 0.80); /* 3.579545MHz */
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(namcos2_state::sgunner2)
- MCFG_DEVICE_ADD("maincpu", M68000, M68K_CPU_CLOCK) /* 12.288MHz (49.152MHz OSC/4) */
- MCFG_DEVICE_PROGRAM_MAP(master_sgunner_am)
- MCFG_TIMER_DRIVER_ADD_SCANLINE("scantimer", namcos2_state, screen_scanline, "screen", 0, 1)
+void namcos2_state::sgunner2(machine_config &config)
+{
+ M68000(config, m_maincpu, M68K_CPU_CLOCK); /* 12.288MHz (49.152MHz OSC/4) */
+ m_maincpu->set_addrmap(AS_PROGRAM, &namcos2_state::master_sgunner_am);
+ TIMER(config, "scantimer").configure_scanline(FUNC(namcos2_state::screen_scanline), "screen", 0, 1);
- MCFG_DEVICE_ADD("slave", M68000, M68K_CPU_CLOCK) /* 12.288MHz (49.152MHz OSC/4) */
- MCFG_DEVICE_PROGRAM_MAP(slave_sgunner_am)
+ M68000(config, m_slave, M68K_CPU_CLOCK); /* 12.288MHz (49.152MHz OSC/4) */
+ m_slave->set_addrmap(AS_PROGRAM, &namcos2_state::slave_sgunner_am);
- MCFG_DEVICE_ADD("audiocpu", MC6809E, M68B09_CPU_CLOCK) /* 2.048MHz (49.152MHz OSC/24) - Sound handling */
- MCFG_DEVICE_PROGRAM_MAP(sound_default_am)
- MCFG_DEVICE_PERIODIC_INT_DRIVER(namcos2_state, irq0_line_hold, 2*60)
- MCFG_DEVICE_PERIODIC_INT_DRIVER(namcos2_state, irq1_line_hold, 120)
+ MC6809E(config, m_audiocpu, M68B09_CPU_CLOCK); /* 2.048MHz (49.152MHz OSC/24) - Sound handling */
+ m_audiocpu->set_addrmap(AS_PROGRAM, &namcos2_state::sound_default_am);
+ m_audiocpu->set_periodic_int(FUNC(namcos2_state::irq0_line_hold), attotime::from_hz(2*60));
+ m_audiocpu->set_periodic_int(FUNC(namcos2_state::irq1_line_hold), attotime::from_hz(120));
configure_c68_standard(config);
- MCFG_QUANTUM_TIME(attotime::from_hz(6000)) /* CPU slices per frame */
+ config.m_minimum_quantum = attotime::from_hz(6000); /* CPU slices per frame */
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_1);
configure_c148_standard(config);
NAMCO_C139(config, m_sci, 0);
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_RAW_PARAMS(MAIN_OSC_CLOCK/8, 384, 0*8, 36*8, 264, 0*8, 28*8)
- MCFG_SCREEN_UPDATE_DRIVER(namcos2_state, screen_update_sgunner)
- MCFG_SCREEN_PALETTE(m_c116)
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_raw(MAIN_OSC_CLOCK/8, 384, 0*8, 36*8, 264, 0*8, 28*8);
+ m_screen->set_screen_update(FUNC(namcos2_state::screen_update_sgunner));
+ m_screen->set_palette(m_c116);
- MCFG_DEVICE_ADD(m_gfxdecode, GFXDECODE, m_c116, gfx_c355)
+ GFXDECODE(config, m_gfxdecode, m_c116, gfx_c355);
NAMCO_C355SPR(config, m_c355spr, 0);
m_c355spr->set_screen(m_screen);
@@ -2100,36 +2111,37 @@ MACHINE_CONFIG_START(namcos2_state::sgunner2)
m_c140->add_route(1, "rspeaker", 0.75);
YM2151(config, "ymsnd", YM2151_SOUND_CLOCK).add_route(0, "lspeaker", 0.80).add_route(1, "rspeaker", 0.80); /* 3.579545MHz */
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(namcos2_state::suzuka8h)
- MCFG_DEVICE_ADD("maincpu", M68000, M68K_CPU_CLOCK) /* 12.288MHz (49.152MHz OSC/4) */
- MCFG_DEVICE_PROGRAM_MAP(master_suzuka8h_am)
- MCFG_TIMER_DRIVER_ADD_SCANLINE("scantimer", namcos2_state, screen_scanline, "screen", 0, 1)
+void namcos2_state::suzuka8h(machine_config &config)
+{
+ M68000(config, m_maincpu, M68K_CPU_CLOCK); /* 12.288MHz (49.152MHz OSC/4) */
+ m_maincpu->set_addrmap(AS_PROGRAM, &namcos2_state::master_suzuka8h_am);
+ TIMER(config, "scantimer").configure_scanline(FUNC(namcos2_state::screen_scanline), "screen", 0, 1);
- MCFG_DEVICE_ADD("slave", M68000, M68K_CPU_CLOCK) /* 12.288MHz (49.152MHz OSC/4) */
- MCFG_DEVICE_PROGRAM_MAP(slave_suzuka8h_am)
+ M68000(config, m_slave, M68K_CPU_CLOCK); /* 12.288MHz (49.152MHz OSC/4) */
+ m_slave->set_addrmap(AS_PROGRAM, &namcos2_state::slave_suzuka8h_am);
- MCFG_DEVICE_ADD("audiocpu", MC6809E, M68B09_CPU_CLOCK) /* 2.048MHz (49.152MHz OSC/24) - Sound handling */
- MCFG_DEVICE_PROGRAM_MAP(sound_default_am)
- MCFG_DEVICE_PERIODIC_INT_DRIVER(namcos2_state, irq0_line_hold, 2*60)
- MCFG_DEVICE_PERIODIC_INT_DRIVER(namcos2_state, irq1_line_hold, 120)
+ MC6809E(config, m_audiocpu, M68B09_CPU_CLOCK); /* 2.048MHz (49.152MHz OSC/24) - Sound handling */
+ m_audiocpu->set_addrmap(AS_PROGRAM, &namcos2_state::sound_default_am);
+ m_audiocpu->set_periodic_int(FUNC(namcos2_state::irq0_line_hold), attotime::from_hz(2*60));
+ m_audiocpu->set_periodic_int(FUNC(namcos2_state::irq1_line_hold), attotime::from_hz(120));
configure_c68_standard(config);
- MCFG_QUANTUM_TIME(attotime::from_hz(6000)) /* CPU slices per frame */
+ config.m_minimum_quantum = attotime::from_hz(6000); /* CPU slices per frame */
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_1);
configure_c148_standard(config);
NAMCO_C139(config, m_sci, 0);
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_RAW_PARAMS(MAIN_OSC_CLOCK/8, 384, 0*8, 36*8, 264, 0*8, 28*8)
- MCFG_SCREEN_UPDATE_DRIVER(namcos2_state, screen_update_luckywld)
- MCFG_SCREEN_PALETTE(m_c116)
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_raw(MAIN_OSC_CLOCK/8, 384, 0*8, 36*8, 264, 0*8, 28*8);
+ m_screen->set_screen_update(FUNC(namcos2_state::screen_update_luckywld));
+ m_screen->set_palette(m_c116);
- MCFG_DEVICE_ADD(m_gfxdecode, GFXDECODE, m_c116, gfx_c355)
+ GFXDECODE(config, m_gfxdecode, m_c116, gfx_c355);
NAMCO_C355SPR(config, m_c355spr, 0);
m_c355spr->set_screen(m_screen);
@@ -2157,16 +2169,15 @@ MACHINE_CONFIG_START(namcos2_state::suzuka8h)
m_c140->add_route(1, "rspeaker", 0.75);
YM2151(config, "ymsnd", YM2151_SOUND_CLOCK).add_route(0, "lspeaker", 0.80).add_route(1, "rspeaker", 0.80); /* 3.579545MHz */
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(namcos2_state::luckywld)
+void namcos2_state::luckywld(machine_config &config)
+{
suzuka8h(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(master_luckywld_am)
+ m_maincpu->set_addrmap(AS_PROGRAM, &namcos2_state::master_luckywld_am);
- MCFG_DEVICE_MODIFY("slave")
- MCFG_DEVICE_PROGRAM_MAP(slave_luckywld_am)
+ m_slave->set_addrmap(AS_PROGRAM, &namcos2_state::slave_luckywld_am);
NAMCO_C169ROZ(config, m_c169roz, 0);
m_c169roz->set_palette(m_c116);
@@ -2174,37 +2185,37 @@ MACHINE_CONFIG_START(namcos2_state::luckywld)
m_c169roz->set_ram_words(0x10000/2);
m_c169roz->set_tile_callback(namco_c169roz_device::c169_tilemap_delegate(&namcos2_state::RozCB_luckywld, this));
m_c169roz->set_color_base(0*256);
+}
-MACHINE_CONFIG_END
-
-MACHINE_CONFIG_START(namcos2_state::metlhawk)
- MCFG_DEVICE_ADD("maincpu", M68000, M68K_CPU_CLOCK) /* 12.288MHz (49.152MHz OSC/4) */
- MCFG_DEVICE_PROGRAM_MAP(master_metlhawk_am)
- MCFG_TIMER_DRIVER_ADD_SCANLINE("scantimer", namcos2_state, screen_scanline, "screen", 0, 1)
+void namcos2_state::metlhawk(machine_config &config)
+{
+ M68000(config, m_maincpu, M68K_CPU_CLOCK); /* 12.288MHz (49.152MHz OSC/4) */
+ m_maincpu->set_addrmap(AS_PROGRAM, &namcos2_state::master_metlhawk_am);
+ TIMER(config, "scantimer").configure_scanline(FUNC(namcos2_state::screen_scanline), "screen", 0, 1);
- MCFG_DEVICE_ADD("slave", M68000, M68K_CPU_CLOCK) /* 12.288MHz (49.152MHz OSC/4) */
- MCFG_DEVICE_PROGRAM_MAP(slave_metlhawk_am)
+ M68000(config, m_slave, M68K_CPU_CLOCK); /* 12.288MHz (49.152MHz OSC/4) */
+ m_slave->set_addrmap(AS_PROGRAM, &namcos2_state::slave_metlhawk_am);
- MCFG_DEVICE_ADD("audiocpu", MC6809E, M68B09_CPU_CLOCK) /* 2.048MHz (49.152MHz OSC/24) - Sound handling */
- MCFG_DEVICE_PROGRAM_MAP(sound_default_am)
- MCFG_DEVICE_PERIODIC_INT_DRIVER(namcos2_state, irq0_line_hold, 2*60)
- MCFG_DEVICE_PERIODIC_INT_DRIVER(namcos2_state, irq1_line_hold, 120)
+ MC6809E(config, m_audiocpu, M68B09_CPU_CLOCK); /* 2.048MHz (49.152MHz OSC/24) - Sound handling */
+ m_audiocpu->set_addrmap(AS_PROGRAM, &namcos2_state::sound_default_am);
+ m_audiocpu->set_periodic_int(FUNC(namcos2_state::irq0_line_hold), attotime::from_hz(2*60));
+ m_audiocpu->set_periodic_int(FUNC(namcos2_state::irq1_line_hold), attotime::from_hz(120));
configure_c65_standard(config);
- MCFG_QUANTUM_TIME(attotime::from_hz(6000)) /* CPU slices per frame */
+ config.m_minimum_quantum = attotime::from_hz(6000); /* CPU slices per frame */
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_1);
configure_c148_standard(config);
NAMCO_C139(config, m_sci, 0);
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_RAW_PARAMS(MAIN_OSC_CLOCK/8, 384, 0*8, 36*8, 264, 0*8, 28*8)
- MCFG_SCREEN_UPDATE_DRIVER(namcos2_state, screen_update_metlhawk)
- MCFG_SCREEN_PALETTE(m_c116)
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_raw(MAIN_OSC_CLOCK/8, 384, 0*8, 36*8, 264, 0*8, 28*8);
+ m_screen->set_screen_update(FUNC(namcos2_state::screen_update_metlhawk));
+ m_screen->set_palette(m_c116);
- MCFG_DEVICE_ADD(m_gfxdecode, GFXDECODE, m_c116, gfx_metlhawk)
+ GFXDECODE(config, m_gfxdecode, m_c116, gfx_metlhawk);
NAMCO_C169ROZ(config, m_c169roz, 0);
m_c169roz->set_palette(m_c116);
@@ -2233,7 +2244,7 @@ MACHINE_CONFIG_START(namcos2_state::metlhawk)
YM2151(config, "ymsnd", YM2151_SOUND_CLOCK).add_route(0, "lspeaker", 0.80).add_route(1, "rspeaker", 0.80); /* 3.579545MHz */
// ymsnd.irq_handler().set_inputline("audiocpu", 1);
-MACHINE_CONFIG_END
+}
/*************************************************************/
@@ -2321,8 +2332,8 @@ ROM_START( assault )
NAMCOS2_GFXROM_LOAD_128K( "atshape.bin", 0x000000, CRC(dfcad82b) SHA1(9c3826b8dc36fa0d71c0de7f8be3479d9a025803) )
ROM_REGION16_BE( 0x200000, "data_rom", 0 ) /* Shared data ROMs */
- NAMCOS2_DATA_LOAD_E_128K( "at1dat0.bin", 0x000000, CRC(844890f4) SHA1(1be30760acd81fae836301d81d6adbb3e5941373) )
- NAMCOS2_DATA_LOAD_O_128K( "at1dat1.bin", 0x000000, CRC(21715313) SHA1(97c6edae6a5f1df434f1dcf7be307b5e006e72a6) )
+ NAMCOS2_DATA_LOAD_E_128K( "at1dat0.13s", 0x000000, CRC(844890f4) SHA1(1be30760acd81fae836301d81d6adbb3e5941373) )
+ NAMCOS2_DATA_LOAD_O_128K( "at1dat1.13p", 0x000000, CRC(21715313) SHA1(97c6edae6a5f1df434f1dcf7be307b5e006e72a6) )
ROM_REGION( 0x100000, "c140", 0 ) /* Sound voices */
ROM_LOAD( "atvoi1.bin", 0x000000, 0x080000, CRC(d36a649e) SHA1(30173f32c6ec9dda6b8946baa14266e828b0324e) )
@@ -2372,8 +2383,8 @@ ROM_START( assaultj )
NAMCOS2_GFXROM_LOAD_128K( "atshape.bin", 0x000000, CRC(dfcad82b) SHA1(9c3826b8dc36fa0d71c0de7f8be3479d9a025803) )
ROM_REGION16_BE( 0x200000, "data_rom", 0 ) /* Shared data ROMs */
- NAMCOS2_DATA_LOAD_E_128K( "at1dat0.bin", 0x000000, CRC(844890f4) SHA1(1be30760acd81fae836301d81d6adbb3e5941373) )
- NAMCOS2_DATA_LOAD_O_128K( "at1dat1.bin", 0x000000, CRC(21715313) SHA1(97c6edae6a5f1df434f1dcf7be307b5e006e72a6) )
+ NAMCOS2_DATA_LOAD_E_128K( "at1dat0.13s", 0x000000, CRC(844890f4) SHA1(1be30760acd81fae836301d81d6adbb3e5941373) )
+ NAMCOS2_DATA_LOAD_O_128K( "at1dat1.13p", 0x000000, CRC(21715313) SHA1(97c6edae6a5f1df434f1dcf7be307b5e006e72a6) )
ROM_REGION( 0x100000, "c140", 0 ) /* Sound voices */
ROM_LOAD( "atvoi1.bin", 0x000000, 0x080000, CRC(d36a649e) SHA1(30173f32c6ec9dda6b8946baa14266e828b0324e) )
@@ -2423,8 +2434,8 @@ ROM_START( assaultp )
NAMCOS2_GFXROM_LOAD_128K( "atshape.bin", 0x000000, CRC(dfcad82b) SHA1(9c3826b8dc36fa0d71c0de7f8be3479d9a025803) )
ROM_REGION16_BE( 0x200000, "data_rom", 0 ) /* Shared data ROMs */
- NAMCOS2_DATA_LOAD_E_128K( "at1dat0.bin", 0x000000, CRC(844890f4) SHA1(1be30760acd81fae836301d81d6adbb3e5941373) )
- NAMCOS2_DATA_LOAD_O_128K( "at1dat1.bin", 0x000000, CRC(21715313) SHA1(97c6edae6a5f1df434f1dcf7be307b5e006e72a6) )
+ NAMCOS2_DATA_LOAD_E_128K( "at1dat0.13s", 0x000000, CRC(844890f4) SHA1(1be30760acd81fae836301d81d6adbb3e5941373) )
+ NAMCOS2_DATA_LOAD_O_128K( "at1dat1.13p", 0x000000, CRC(21715313) SHA1(97c6edae6a5f1df434f1dcf7be307b5e006e72a6) )
ROM_REGION( 0x100000, "c140", 0 ) /* Sound voices */
ROM_LOAD( "atvoi1.bin", 0x000000, 0x080000, CRC(d36a649e) SHA1(30173f32c6ec9dda6b8946baa14266e828b0324e) )
@@ -2473,8 +2484,8 @@ ROM_START( burnforc )
NAMCOS2_GFXROM_LOAD_128K( "bu_shape.bin", 0x000000,CRC(80a6b722) SHA1(2c24327a890310c5e8086dc6821627108a88c62e) )
ROM_REGION16_BE( 0x200000, "data_rom", 0 ) /* Shared data ROMs */
- NAMCOS2_DATA_LOAD_E_128K( "bu1_dat0.bin", 0x000000, CRC(e0a9d92f) SHA1(15042e6d7b31bec08ccdf36e89fdb4b6fb62fa4b) )
- NAMCOS2_DATA_LOAD_O_128K( "bu1_dat1.bin", 0x000000, CRC(5fe54b73) SHA1(a5d4895f0a4523be20de40ccaa74f8fad0d5df7d) )
+ NAMCOS2_DATA_LOAD_E_128K( "bu1_dat0.13s", 0x000000, CRC(e0a9d92f) SHA1(15042e6d7b31bec08ccdf36e89fdb4b6fb62fa4b) )
+ NAMCOS2_DATA_LOAD_O_128K( "bu1_dat1.13p", 0x000000, CRC(5fe54b73) SHA1(a5d4895f0a4523be20de40ccaa74f8fad0d5df7d) )
ROM_REGION( 0x100000, "c140", 0 ) /* Sound voices */
ROM_LOAD( "bu_voi-1.bin", 0x000000, 0x080000, CRC(99d8a239) SHA1(1ebc586048e757ac0ac68dc9cc171f4849e67cef) )
@@ -2522,8 +2533,8 @@ ROM_START( burnforco )
NAMCOS2_GFXROM_LOAD_128K( "bu_shape.bin", 0x000000,CRC(80a6b722) SHA1(2c24327a890310c5e8086dc6821627108a88c62e) )
ROM_REGION16_BE( 0x200000, "data_rom", 0 ) /* Shared data ROMs */
- NAMCOS2_DATA_LOAD_E_128K( "bu1_dat0.bin", 0x000000, CRC(e0a9d92f) SHA1(15042e6d7b31bec08ccdf36e89fdb4b6fb62fa4b) )
- NAMCOS2_DATA_LOAD_O_128K( "bu1_dat1.bin", 0x000000, CRC(5fe54b73) SHA1(a5d4895f0a4523be20de40ccaa74f8fad0d5df7d) )
+ NAMCOS2_DATA_LOAD_E_128K( "bu1_dat0.13s", 0x000000, CRC(e0a9d92f) SHA1(15042e6d7b31bec08ccdf36e89fdb4b6fb62fa4b) )
+ NAMCOS2_DATA_LOAD_O_128K( "bu1_dat1.13p", 0x000000, CRC(5fe54b73) SHA1(a5d4895f0a4523be20de40ccaa74f8fad0d5df7d) )
ROM_REGION( 0x100000, "c140", 0 ) /* Sound voices */
ROM_LOAD( "bu_voi-1.bin", 0x000000, 0x080000, CRC(99d8a239) SHA1(1ebc586048e757ac0ac68dc9cc171f4849e67cef) )
@@ -2564,8 +2575,8 @@ ROM_START( cosmogng )
ROM_LOAD( "co1sha0.bin", 0x000000, 0x80000, CRC(063a70cc) SHA1(c3179d55d57c47d3fef49d45e45b88c4d8250548) )
ROM_REGION16_BE( 0x200000, "data_rom", 0 ) /* Shared data ROMs */
- NAMCOS2_DATA_LOAD_E_128K( "co1dat0.bin", 0x000000, CRC(b53da2ae) SHA1(a7fe63668d50928d5d2e2249a5f377c7e8dfc6a5) )
- NAMCOS2_DATA_LOAD_O_128K( "co1dat1.bin", 0x000000, CRC(d21ad10b) SHA1(dcf2d4cc048ea57507952a9a35390af7de5cfe34) )
+ NAMCOS2_DATA_LOAD_E_128K( "co1dat0.13s", 0x000000, CRC(b53da2ae) SHA1(a7fe63668d50928d5d2e2249a5f377c7e8dfc6a5) )
+ NAMCOS2_DATA_LOAD_O_128K( "co1dat1.13p", 0x000000, CRC(d21ad10b) SHA1(dcf2d4cc048ea57507952a9a35390af7de5cfe34) )
ROM_REGION( 0x100000, "c140", 0 ) /* Sound voices */
ROM_LOAD( "co2voi1.bin", 0x000000, 0x080000, CRC(5a301349) SHA1(e333ea5955a66ac8d7c94cd50047efaf6fa95b15) )
@@ -2607,8 +2618,8 @@ ROM_START( cosmogngj )
ROM_LOAD( "co1sha0.bin", 0x000000, 0x80000, CRC(063a70cc) SHA1(c3179d55d57c47d3fef49d45e45b88c4d8250548) )
ROM_REGION16_BE( 0x200000, "data_rom", 0 ) /* Shared data ROMs */
- NAMCOS2_DATA_LOAD_E_128K( "co1dat0.bin", 0x000000, CRC(b53da2ae) SHA1(a7fe63668d50928d5d2e2249a5f377c7e8dfc6a5) )
- NAMCOS2_DATA_LOAD_O_128K( "co1dat1.bin", 0x000000, CRC(d21ad10b) SHA1(dcf2d4cc048ea57507952a9a35390af7de5cfe34) )
+ NAMCOS2_DATA_LOAD_E_128K( "co1dat0.13s", 0x000000, CRC(b53da2ae) SHA1(a7fe63668d50928d5d2e2249a5f377c7e8dfc6a5) )
+ NAMCOS2_DATA_LOAD_O_128K( "co1dat1.13p", 0x000000, CRC(d21ad10b) SHA1(dcf2d4cc048ea57507952a9a35390af7de5cfe34) )
ROM_REGION( 0x100000, "c140", 0 ) /* Sound voices */
ROM_LOAD( "co1voi1.bin", 0x000000, 0x080000, CRC(b5ba8f15) SHA1(9e54b9ba1cd44353782adf337376dff9eec4e937) )
@@ -2657,8 +2668,8 @@ ROM_START( dirtfoxj )
NAMCOS2_GFXROM_LOAD_128K( "df1_sha.bin", 0x000000, CRC(9a7c9a9b) SHA1(06221ae8d3f6bebbb5a7ab2eaaf35b9922389115) )
ROM_REGION16_BE( 0x200000, "data_rom", 0 ) /* Shared data ROMs */
- NAMCOS2_DATA_LOAD_E_256K( "df1_dat0.bin", 0x000000, CRC(f5851c85) SHA1(e99c05891622cdaab394630b7b2678968e6761d7) )
- NAMCOS2_DATA_LOAD_O_256K( "df1_dat1.bin", 0x000000, CRC(1a31e46b) SHA1(4be7115893b27d6a3dc38c97dcb41eafebb423cd) )
+ NAMCOS2_DATA_LOAD_E_256K( "df1_dat0.13s", 0x000000, CRC(f5851c85) SHA1(e99c05891622cdaab394630b7b2678968e6761d7) )
+ NAMCOS2_DATA_LOAD_O_256K( "df1_dat1.13p", 0x000000, CRC(1a31e46b) SHA1(4be7115893b27d6a3dc38c97dcb41eafebb423cd) )
ROM_REGION( 0x100000, "c140", 0 ) /* Sound voices */
ROM_LOAD( "df1_voi1.bin", 0x000000, 0x080000, CRC(15053904) SHA1(b8ca7e5e53249dbee8284ce1e5c0e6438e64b2cf) )
@@ -2701,8 +2712,8 @@ ROM_START( dsaber )
ROM_LOAD( "shape.bin", 0x000000, 0x80000, CRC(698e7a3e) SHA1(4d41bf0242626ca1448d1f650c84b5987a7f6597) )
ROM_REGION16_BE( 0x200000, "data_rom", 0 ) /* Shared data ROMs */
- NAMCOS2_DATA_LOAD_E_128K( "do1 dat0.data0", 0x000000, CRC(3e53331f) SHA1(3dd4c133f587361f30ab1b890f5b05749d5838e3) )
- NAMCOS2_DATA_LOAD_O_128K( "do1 dat1.data1", 0x000000, CRC(d5427f11) SHA1(af8d8153dc60044616a6b0571831c53c09fefda1) )
+ NAMCOS2_DATA_LOAD_E_128K( "do1 dat0.13s", 0x000000, CRC(3e53331f) SHA1(3dd4c133f587361f30ab1b890f5b05749d5838e3) )
+ NAMCOS2_DATA_LOAD_O_128K( "do1 dat1.13p", 0x000000, CRC(d5427f11) SHA1(af8d8153dc60044616a6b0571831c53c09fefda1) )
ROM_REGION( 0x100000, "c140", 0 ) /* Sound voices */
ROM_LOAD( "do voi-1a.voice1", 0x000000, 0x080000, CRC(dadf6a57) SHA1(caba21fc6b62d140f6d8231411ce82ae0ad2837a) )
@@ -2749,8 +2760,8 @@ ROM_START( dsabera )
ROM_LOAD( "shape.bin", 0x000000, 0x80000, CRC(698e7a3e) SHA1(4d41bf0242626ca1448d1f650c84b5987a7f6597) )
ROM_REGION16_BE( 0x200000, "data_rom", 0 ) /* Shared data ROMs */
- NAMCOS2_DATA_LOAD_E_128K( "do1 dat0.data0", 0x000000, CRC(3e53331f) SHA1(3dd4c133f587361f30ab1b890f5b05749d5838e3) )
- NAMCOS2_DATA_LOAD_O_128K( "do1 dat1.data1", 0x000000, CRC(d5427f11) SHA1(af8d8153dc60044616a6b0571831c53c09fefda1) )
+ NAMCOS2_DATA_LOAD_E_128K( "do1 dat0.13s", 0x000000, CRC(3e53331f) SHA1(3dd4c133f587361f30ab1b890f5b05749d5838e3) )
+ NAMCOS2_DATA_LOAD_O_128K( "do1 dat1.13p", 0x000000, CRC(d5427f11) SHA1(af8d8153dc60044616a6b0571831c53c09fefda1) )
ROM_REGION( 0x100000, "c140", 0 ) /* Sound voices */
ROM_LOAD( "do voi-1a.voice1", 0x000000, 0x080000, CRC(dadf6a57) SHA1(caba21fc6b62d140f6d8231411ce82ae0ad2837a) )
@@ -2796,8 +2807,8 @@ ROM_START( dsaberj )
ROM_LOAD( "shape.bin", 0x000000, 0x80000, CRC(698e7a3e) SHA1(4d41bf0242626ca1448d1f650c84b5987a7f6597) )
ROM_REGION16_BE( 0x200000, "data_rom", 0 ) /* Shared data ROMs */
- NAMCOS2_DATA_LOAD_E_128K( "do1 dat0.data0", 0x000000, CRC(3e53331f) SHA1(3dd4c133f587361f30ab1b890f5b05749d5838e3) )
- NAMCOS2_DATA_LOAD_O_128K( "do1 dat1.data1", 0x000000, CRC(d5427f11) SHA1(af8d8153dc60044616a6b0571831c53c09fefda1) )
+ NAMCOS2_DATA_LOAD_E_128K( "do1 dat0.13s", 0x000000, CRC(3e53331f) SHA1(3dd4c133f587361f30ab1b890f5b05749d5838e3) )
+ NAMCOS2_DATA_LOAD_O_128K( "do1 dat1.13p", 0x000000, CRC(d5427f11) SHA1(af8d8153dc60044616a6b0571831c53c09fefda1) )
ROM_REGION( 0x100000, "c140", 0 ) /* Sound voices */
ROM_LOAD( "do voi-1a.voice1", 0x000000, 0x080000, CRC(dadf6a57) SHA1(caba21fc6b62d140f6d8231411ce82ae0ad2837a) )
@@ -3108,8 +3119,8 @@ ROM_START( finalap2 )
NAMCOS2_GFXROM_LOAD_256K( "fls2sha", 0x000000, CRC(f7b40a85) SHA1(a458a1cc0dae757fe8a15cb5f5ae46d3c033df00) )
ROM_REGION16_BE( 0x200000, "data_rom", 0 ) /* Shared data ROMs */
- NAMCOS2_DATA_LOAD_E_256K( "fls2dat0", 0x000000, CRC(f1af432c) SHA1(c514261a49ceb5c3ba0246519ba5d02e9a20d950) )
- NAMCOS2_DATA_LOAD_O_256K( "fls2dat1", 0x000000, CRC(8719533e) SHA1(98d2767da6f7f67da7af15e8cfed95adb04b7427) )
+ NAMCOS2_DATA_LOAD_E_256K( "fls2dat0.13s", 0x000000, CRC(f1af432c) SHA1(c514261a49ceb5c3ba0246519ba5d02e9a20d950) )
+ NAMCOS2_DATA_LOAD_O_256K( "fls2dat1.13p", 0x000000, CRC(8719533e) SHA1(98d2767da6f7f67da7af15e8cfed95adb04b7427) )
ROM_REGION( 0x100, "c45_road:clut", 0 ) /* PROM for road colors */
ROM_LOAD( "fl1-3.5b", 0, 0x100, CRC(d179d99a) SHA1(4e64f284c74d2b77f893bd28aaa6489084056aa2) )
@@ -3163,8 +3174,8 @@ ROM_START( finalap2j )
NAMCOS2_GFXROM_LOAD_256K( "fls2sha", 0x000000, BAD_DUMP CRC(f7b40a85) SHA1(a458a1cc0dae757fe8a15cb5f5ae46d3c033df00) )
ROM_REGION16_BE( 0x200000, "data_rom", 0 ) /* Shared data ROMs */
- NAMCOS2_DATA_LOAD_E_256K( "fls2dat0", 0x000000, CRC(f1af432c) SHA1(c514261a49ceb5c3ba0246519ba5d02e9a20d950) )
- NAMCOS2_DATA_LOAD_O_256K( "fls2dat1", 0x000000, CRC(8719533e) SHA1(98d2767da6f7f67da7af15e8cfed95adb04b7427) )
+ NAMCOS2_DATA_LOAD_E_256K( "fls2dat0.13s", 0x000000, CRC(f1af432c) SHA1(c514261a49ceb5c3ba0246519ba5d02e9a20d950) )
+ NAMCOS2_DATA_LOAD_O_256K( "fls2dat1.13p", 0x000000, CRC(8719533e) SHA1(98d2767da6f7f67da7af15e8cfed95adb04b7427) )
ROM_REGION( 0x100, "c45_road:clut", 0 ) /* PROM for road colors */
ROM_LOAD( "fl1-3.5b", 0, 0x100, CRC(d179d99a) SHA1(4e64f284c74d2b77f893bd28aaa6489084056aa2) )
@@ -3449,8 +3460,8 @@ ROM_START( finalap3bl ) // bootleg set
NAMCOS2_GFXROM_LOAD_256K( "flt2_sha.bin", 0x000000, CRC(6986565b) SHA1(df95f2ad5d1e938551d33153f2dcc4711ffd0eba) )
ROM_REGION16_BE( 0x200000, "data_rom", 0 ) /* Shared data roms */
- NAMCOS2_DATA_LOAD_E_128K( "flt1d0", 0x000000, CRC(80004966) SHA1(112b2a9b0ea792d5dbff1b9cf904da788aeede29) )
- NAMCOS2_DATA_LOAD_O_128K( "flt1d1", 0x000000, CRC(a2e93e8c) SHA1(9c8a5431a79153a70eb6939d16e0a5a6be235e75) )
+ NAMCOS2_DATA_LOAD_E_128K( "flt1d0.13s", 0x000000, CRC(80004966) SHA1(112b2a9b0ea792d5dbff1b9cf904da788aeede29) )
+ NAMCOS2_DATA_LOAD_O_128K( "flt1d1.13p", 0x000000, CRC(a2e93e8c) SHA1(9c8a5431a79153a70eb6939d16e0a5a6be235e75) )
ROM_REGION( 0x100, "c45_road:clut", 0 ) /* prom for road colors */
ROM_LOAD( "fl1-3.5b", 0, 0x100, CRC(d179d99a) SHA1(4e64f284c74d2b77f893bd28aaa6489084056aa2) )
@@ -3508,10 +3519,10 @@ ROM_START( finehour )
NAMCOS2_GFXROM_LOAD_256K( "fh1_sha.bin", 0x000000, CRC(15875eb0) SHA1(9225df6b01897938488461ebf0717e6d7b81d562) )
ROM_REGION16_BE( 0x200000, "data_rom", 0 ) /* Shared data roms */
- NAMCOS2_DATA_LOAD_E_128K( "fh1_dt0.bin", 0x000000, CRC(2441c26f) SHA1(429c8f12f7bef3e62153ac8b9e00ea870db36a7b) )
- NAMCOS2_DATA_LOAD_O_128K( "fh1_dt1.bin", 0x000000, CRC(48154deb) SHA1(d6fde316f90bc847f60fa8d997504da34337ffa4) )
- NAMCOS2_DATA_LOAD_E_128K( "fh1_dt2.bin", 0x100000, CRC(12453ba4) SHA1(26ad0da6e56ece6f1ba0b0cf23d2fdae2ce24100) )
- NAMCOS2_DATA_LOAD_O_128K( "fh1_dt3.bin", 0x100000, CRC(50bab9da) SHA1(9c18e5fb810123f9d17042212e0878172e220d2a) )
+ NAMCOS2_DATA_LOAD_E_128K( "fh1_dt0.13s", 0x000000, CRC(2441c26f) SHA1(429c8f12f7bef3e62153ac8b9e00ea870db36a7b) )
+ NAMCOS2_DATA_LOAD_O_128K( "fh1_dt1.13p", 0x000000, CRC(48154deb) SHA1(d6fde316f90bc847f60fa8d997504da34337ffa4) )
+ NAMCOS2_DATA_LOAD_E_128K( "fh1_dt2.13r", 0x100000, CRC(12453ba4) SHA1(26ad0da6e56ece6f1ba0b0cf23d2fdae2ce24100) )
+ NAMCOS2_DATA_LOAD_O_128K( "fh1_dt3.13n", 0x100000, CRC(50bab9da) SHA1(9c18e5fb810123f9d17042212e0878172e220d2a) )
ROM_REGION( 0x100000, "c140", 0 ) /* Sound voices */
ROM_LOAD( "fh1_vo1.bin", 0x000000, 0x080000, CRC(07560fc7) SHA1(76f3855f5a4567dc65d513e37072072c2a011e7e) )
@@ -3726,8 +3737,8 @@ ROM_START( fourtrax )
ROM_REGION16_BE( 0x200000, "data_rom", 0 ) /* Shared data roms */
NAMCOS2_DATA_LOAD_E_256K( "fx_dat0.13s", 0x000000, CRC(63abf69b) SHA1(6776991eeff434bf9720f49ad6e62c37fc7ddf40) )
- NAMCOS2_DATA_LOAD_O_256K( "fx_dat1.13r", 0x000000, CRC(725bed14) SHA1(bbf886ac7f8c2c7857bc0b5d7f8fc7e63e8e9559) )
- NAMCOS2_DATA_LOAD_E_256K( "fx_dat2.13p", 0x100000, CRC(71e4a5a0) SHA1(a0188c920a43c5e69e25464627094b6b6ed26a59) )
+ NAMCOS2_DATA_LOAD_O_256K( "fx_dat1.13p", 0x000000, CRC(725bed14) SHA1(bbf886ac7f8c2c7857bc0b5d7f8fc7e63e8e9559) )
+ NAMCOS2_DATA_LOAD_E_256K( "fx_dat2.13r", 0x100000, CRC(71e4a5a0) SHA1(a0188c920a43c5e69e25464627094b6b6ed26a59) )
NAMCOS2_DATA_LOAD_O_256K( "fx_dat3.13n", 0x100000, CRC(605725f7) SHA1(b94ce0ec37f879a5e46a097058cb2dd57e2281f1) )
ROM_REGION( 0x100, "c45_road:clut", 0 ) /* prom for road colors */
@@ -3785,8 +3796,8 @@ ROM_START( fourtraxj )
ROM_REGION16_BE( 0x200000, "data_rom", 0 ) /* Shared data roms */
NAMCOS2_DATA_LOAD_E_256K( "fx_dat0.13s", 0x000000, CRC(63abf69b) SHA1(6776991eeff434bf9720f49ad6e62c37fc7ddf40) )
- NAMCOS2_DATA_LOAD_O_256K( "fx_dat1.13r", 0x000000, CRC(725bed14) SHA1(bbf886ac7f8c2c7857bc0b5d7f8fc7e63e8e9559) )
- NAMCOS2_DATA_LOAD_E_256K( "fx_dat2.13p", 0x100000, CRC(71e4a5a0) SHA1(a0188c920a43c5e69e25464627094b6b6ed26a59) )
+ NAMCOS2_DATA_LOAD_O_256K( "fx_dat1.13p", 0x000000, CRC(725bed14) SHA1(bbf886ac7f8c2c7857bc0b5d7f8fc7e63e8e9559) )
+ NAMCOS2_DATA_LOAD_E_256K( "fx_dat2.13r", 0x100000, CRC(71e4a5a0) SHA1(a0188c920a43c5e69e25464627094b6b6ed26a59) )
NAMCOS2_DATA_LOAD_O_256K( "fx_dat3.13n", 0x100000, CRC(605725f7) SHA1(b94ce0ec37f879a5e46a097058cb2dd57e2281f1) )
ROM_REGION( 0x100, "c45_road:clut", 0 ) /* prom for road colors */
@@ -3855,8 +3866,8 @@ ROM_START( fourtraxa )
ROM_REGION16_BE( 0x200000, "data_rom", 0 ) /* Shared data roms */
NAMCOS2_DATA_LOAD_E_256K( "fx_dat0.13s", 0x000000, CRC(63abf69b) SHA1(6776991eeff434bf9720f49ad6e62c37fc7ddf40) )
- NAMCOS2_DATA_LOAD_O_256K( "fx_dat1.13r", 0x000000, CRC(725bed14) SHA1(bbf886ac7f8c2c7857bc0b5d7f8fc7e63e8e9559) )
- NAMCOS2_DATA_LOAD_E_256K( "fx_dat2.13p", 0x100000, CRC(71e4a5a0) SHA1(a0188c920a43c5e69e25464627094b6b6ed26a59) )
+ NAMCOS2_DATA_LOAD_O_256K( "fx_dat1.13p", 0x000000, CRC(725bed14) SHA1(bbf886ac7f8c2c7857bc0b5d7f8fc7e63e8e9559) )
+ NAMCOS2_DATA_LOAD_E_256K( "fx_dat2.13r", 0x100000, CRC(71e4a5a0) SHA1(a0188c920a43c5e69e25464627094b6b6ed26a59) )
NAMCOS2_DATA_LOAD_O_256K( "fx_dat3.13n", 0x100000, CRC(605725f7) SHA1(b94ce0ec37f879a5e46a097058cb2dd57e2281f1) )
ROM_REGION( 0x100, "c45_road:clut", 0 ) /* prom for road colors */
@@ -3906,10 +3917,10 @@ ROM_START( marvland )
NAMCOS2_GFXROM_LOAD_256K( "mv1-sha.bin", 0x000000, CRC(a47db5d3) SHA1(110e26412aa84f229773049112709be457b7a6ff) )
ROM_REGION16_BE( 0x200000, "data_rom", 0 ) /* Shared data roms */
- NAMCOS2_DATA_LOAD_E_128K( "mv2_dat0", 0x000000, CRC(62e6318b) SHA1(5c26bc054298f2a0980f7e82ba1844bc9f5eff98) )
- NAMCOS2_DATA_LOAD_O_128K( "mv2_dat1", 0x000000, CRC(8a6902ca) SHA1(272e8699b872b3a50d72090b43c57493e6642bfe) )
- NAMCOS2_DATA_LOAD_E_128K( "mv2_dat2", 0x100000, CRC(f5c6408c) SHA1(568fb08d0763dc91674d708fa2d15ca952956145) )
- NAMCOS2_DATA_LOAD_O_128K( "mv2_dat3", 0x100000, CRC(6df76955) SHA1(fcfb520399acdd3776f66944121d6980552d3100) )
+ NAMCOS2_DATA_LOAD_E_128K( "mv2_dat0.13s", 0x000000, CRC(62e6318b) SHA1(5c26bc054298f2a0980f7e82ba1844bc9f5eff98) )
+ NAMCOS2_DATA_LOAD_O_128K( "mv2_dat1.13p", 0x000000, CRC(8a6902ca) SHA1(272e8699b872b3a50d72090b43c57493e6642bfe) )
+ NAMCOS2_DATA_LOAD_E_128K( "mv2_dat2.13r", 0x100000, CRC(f5c6408c) SHA1(568fb08d0763dc91674d708fa2d15ca952956145) )
+ NAMCOS2_DATA_LOAD_O_128K( "mv2_dat3.13n", 0x100000, CRC(6df76955) SHA1(fcfb520399acdd3776f66944121d6980552d3100) )
ROM_REGION( 0x100000, "c140", 0 ) /* Sound voices */
ROM_LOAD( "mv1-voi1.bin", 0x000000, 0x080000, CRC(de5cac09) SHA1(2d73e54c4f159e52db2c403a59d6c137cce6f53e) )
@@ -3954,8 +3965,8 @@ ROM_START( marvlandj )
NAMCOS2_GFXROM_LOAD_256K( "mv1-sha.bin", 0x000000, CRC(a47db5d3) SHA1(110e26412aa84f229773049112709be457b7a6ff) )
ROM_REGION16_BE( 0x200000, "data_rom", 0 ) /* Shared data roms */
- NAMCOS2_DATA_LOAD_E_128K( "mv1-dat0.bin", 0x000000, CRC(e15f412e) SHA1(d3ff006d4577540a690c912e94897a1b638ac265) )
- NAMCOS2_DATA_LOAD_O_128K( "mv1-dat1.bin", 0x000000, CRC(73e1545a) SHA1(a04034e56fef69fb2a2eb88f2f392c376e52d00d) )
+ NAMCOS2_DATA_LOAD_E_128K( "mv1-dat0.13s", 0x000000, CRC(e15f412e) SHA1(d3ff006d4577540a690c912e94897a1b638ac265) )
+ NAMCOS2_DATA_LOAD_O_128K( "mv1-dat1.13p", 0x000000, CRC(73e1545a) SHA1(a04034e56fef69fb2a2eb88f2f392c376e52d00d) )
ROM_REGION( 0x100000, "c140", 0 ) /* Sound voices */
ROM_LOAD( "mv1-voi1.bin", 0x000000, 0x080000, CRC(de5cac09) SHA1(2d73e54c4f159e52db2c403a59d6c137cce6f53e) )
@@ -4141,8 +4152,8 @@ ROM_START( mirninja )
NAMCOS2_GFXROM_LOAD_128K( "mn_sha.bin", 0x000000, CRC(c28af90f) SHA1(8b7f95375eb32c3e30c2a55b7f543235f56d3a13) )
ROM_REGION16_BE( 0x200000, "data_rom", 0 ) /* Shared data roms */
- NAMCOS2_DATA_LOAD_E_128K( "mn1_dat0.bin", 0x000000, CRC(104bcca8) SHA1(e8368d0dc51bf0653143bf2261d7ed5b54d92941) )
- NAMCOS2_DATA_LOAD_O_128K( "mn1_dat1.bin", 0x000000, CRC(d2a918fb) SHA1(032b7a7bcc60c41325e7b35df9a932e68cdd0788) )
+ NAMCOS2_DATA_LOAD_E_128K( "mn1_dat0.13s", 0x000000, CRC(104bcca8) SHA1(e8368d0dc51bf0653143bf2261d7ed5b54d92941) )
+ NAMCOS2_DATA_LOAD_O_128K( "mn1_dat1.13p", 0x000000, CRC(d2a918fb) SHA1(032b7a7bcc60c41325e7b35df9a932e68cdd0788) )
ROM_REGION( 0x100000, "c140", 0 ) /* Sound voices */
ROM_LOAD( "mn_voi1.bin", 0x000000, 0x080000, CRC(2ca3573c) SHA1(b2af101730de4ccc68acc1ed143c21a8c81f64db) )
@@ -4194,8 +4205,8 @@ ROM_START( ordyne )
NAMCOS2_GFXROM_LOAD_128K( "or_shape.shape", 0x000000, CRC(7aec9dee) SHA1(2e774e4cff69173b4524d6b25a6a449ba5498a6a) )
ROM_REGION16_BE( 0x200000, "data_rom", 0 ) /* Shared data roms */
- NAMCOS2_DATA_LOAD_E_128K( "or1_d0.data0", 0x000000, CRC(de214f7a) SHA1(59883c7886b403306c30e51d7f49225483792650) )
- NAMCOS2_DATA_LOAD_O_128K( "or1_d1.data1", 0x000000, CRC(25e3e6c8) SHA1(ad093f15edaea71f6c7226c6e4f3c2130d418013) )
+ NAMCOS2_DATA_LOAD_E_128K( "or1_d0.13s", 0x000000, CRC(de214f7a) SHA1(59883c7886b403306c30e51d7f49225483792650) )
+ NAMCOS2_DATA_LOAD_O_128K( "or1_d1.13p", 0x000000, CRC(25e3e6c8) SHA1(ad093f15edaea71f6c7226c6e4f3c2130d418013) )
ROM_REGION( 0x100000, "c140", 0 ) /* Sound voices */
ROM_LOAD( "or_voi1.voice1", 0x000000, 0x080000, CRC(369e0bca) SHA1(2a921bb373dd043bd7b2a30e5e46ec3b8b3b5c8d) )
@@ -4250,8 +4261,8 @@ ROM_START( ordyneje )
NAMCOS2_GFXROM_LOAD_128K( "or_shape.shape", 0x000000, CRC(7aec9dee) SHA1(2e774e4cff69173b4524d6b25a6a449ba5498a6a) )
ROM_REGION16_BE( 0x200000, "data_rom", 0 ) /* Shared data roms */
- NAMCOS2_DATA_LOAD_E_128K( "or1_d0.data0", 0x000000, CRC(de214f7a) SHA1(59883c7886b403306c30e51d7f49225483792650) )
- NAMCOS2_DATA_LOAD_O_128K( "or1_d1.data1", 0x000000, CRC(25e3e6c8) SHA1(ad093f15edaea71f6c7226c6e4f3c2130d418013) )
+ NAMCOS2_DATA_LOAD_E_128K( "or1_d0.13s", 0x000000, CRC(de214f7a) SHA1(59883c7886b403306c30e51d7f49225483792650) )
+ NAMCOS2_DATA_LOAD_O_128K( "or1_d1.13p", 0x000000, CRC(25e3e6c8) SHA1(ad093f15edaea71f6c7226c6e4f3c2130d418013) )
ROM_REGION( 0x100000, "c140", 0 ) /* Sound voices */
ROM_LOAD( "or_voi1.voice1", 0x000000, 0x080000, CRC(369e0bca) SHA1(2a921bb373dd043bd7b2a30e5e46ec3b8b3b5c8d) )
@@ -4306,8 +4317,8 @@ ROM_START( ordynej )
NAMCOS2_GFXROM_LOAD_128K( "or_shape.shape", 0x000000, CRC(7aec9dee) SHA1(2e774e4cff69173b4524d6b25a6a449ba5498a6a) )
ROM_REGION16_BE( 0x200000, "data_rom", 0 ) /* Shared data roms */
- NAMCOS2_DATA_LOAD_E_128K( "or1_d0.data0", 0x000000, CRC(de214f7a) SHA1(59883c7886b403306c30e51d7f49225483792650) )
- NAMCOS2_DATA_LOAD_O_128K( "or1_d1.data1", 0x000000, CRC(25e3e6c8) SHA1(ad093f15edaea71f6c7226c6e4f3c2130d418013) )
+ NAMCOS2_DATA_LOAD_E_128K( "or1_d0.13s", 0x000000, CRC(de214f7a) SHA1(59883c7886b403306c30e51d7f49225483792650) )
+ NAMCOS2_DATA_LOAD_O_128K( "or1_d1.13p", 0x000000, CRC(25e3e6c8) SHA1(ad093f15edaea71f6c7226c6e4f3c2130d418013) )
ROM_REGION( 0x100000, "c140", 0 ) /* Sound voices */
ROM_LOAD( "or_voi1.voice1", 0x000000, 0x080000, CRC(369e0bca) SHA1(2a921bb373dd043bd7b2a30e5e46ec3b8b3b5c8d) )
@@ -4365,8 +4376,8 @@ ROM_START( phelios )
NAMCOS2_GFXROM_LOAD_128K( "ps_shape.shape", 0x000000, CRC(58e26fcf) SHA1(9edc3b54964f923ed07ee878520ccf3f188f04ad) )
ROM_REGION16_BE( 0x200000, "data_rom", 0 ) /* Shared data roms */
- NAMCOS2_DATA_LOAD_E_128K( "ps2_dat0.data0", 0x000000, CRC(ee4194b0) SHA1(a0c2a807db70164ed761e5ad04301e5ae1173e7a) )
- NAMCOS2_DATA_LOAD_O_128K( "ps2_dat1.data1", 0x000000, CRC(5b22d714) SHA1(f6cb1fe661f7691269840245f06875845fd6eb33) )
+ NAMCOS2_DATA_LOAD_E_128K( "ps2_dat0.13s", 0x000000, CRC(ee4194b0) SHA1(a0c2a807db70164ed761e5ad04301e5ae1173e7a) )
+ NAMCOS2_DATA_LOAD_O_128K( "ps2_dat1.13p", 0x000000, CRC(5b22d714) SHA1(f6cb1fe661f7691269840245f06875845fd6eb33) )
ROM_REGION( 0x100000, "c140", 0 ) /* Sound voices */
ROM_LOAD( "ps_voi-1.voice1", 0x000000, 0x080000, CRC(f67376ed) SHA1(b54257aad34c6ad03d5b040e6a5dda94a48b6780) )
@@ -4420,8 +4431,8 @@ ROM_START( pheliosj )
NAMCOS2_GFXROM_LOAD_128K( "ps_shape.shape", 0x000000, CRC(58e26fcf) SHA1(9edc3b54964f923ed07ee878520ccf3f188f04ad) )
ROM_REGION16_BE( 0x200000, "data_rom", 0 ) /* Shared data roms */
- NAMCOS2_DATA_LOAD_E_128K( "ps1_dat0.data0", 0x000000, CRC(ee4194b0) SHA1(a0c2a807db70164ed761e5ad04301e5ae1173e7a) ) /* Same DATA as World set, but labeled PS1 */
- NAMCOS2_DATA_LOAD_O_128K( "ps1_dat1.data1", 0x000000, CRC(5b22d714) SHA1(f6cb1fe661f7691269840245f06875845fd6eb33) ) /* Same DATA as World set, but labeled PS1 */
+ NAMCOS2_DATA_LOAD_E_128K( "ps1_dat0.13s", 0x000000, CRC(ee4194b0) SHA1(a0c2a807db70164ed761e5ad04301e5ae1173e7a) ) /* Same DATA as World set, but labeled PS1 */
+ NAMCOS2_DATA_LOAD_O_128K( "ps1_dat1.13p", 0x000000, CRC(5b22d714) SHA1(f6cb1fe661f7691269840245f06875845fd6eb33) ) /* Same DATA as World set, but labeled PS1 */
ROM_REGION( 0x100000, "c140", 0 ) /* Sound voices */
ROM_LOAD( "ps_voi-1.voice1", 0x000000, 0x080000, CRC(f67376ed) SHA1(b54257aad34c6ad03d5b040e6a5dda94a48b6780) )
@@ -4461,9 +4472,9 @@ ROM_START( rthun2 )
ROM_LOAD( "shape.bin", 0x000000, 0x80000, CRC(cf58fbbe) SHA1(fbe3b2f0c3267b298993d6238d97b119e13e07f6) )
ROM_REGION16_BE( 0x200000, "data_rom", 0 ) /* Shared data roms */
- NAMCOS2_DATA_LOAD_E_128K( "rst1_data0.bin", 0x000000, CRC(0baf44ee) SHA1(5135d634f76893adb26a32976a69e2d47e2385c6) )
- NAMCOS2_DATA_LOAD_O_128K( "rst1_data1.bin", 0x000000, CRC(58a8daac) SHA1(c13ae8fc25b748a006c6db5b4b7ae593738544e8) )
- NAMCOS2_DATA_LOAD_E_128K( "rst1_data2.bin", 0x100000, CRC(8e850a2a) SHA1(e5230e80a23ca6d09c2c53f443ecf70cc74075d7) )
+ NAMCOS2_DATA_LOAD_E_128K( "rst1_data0.13s", 0x000000, CRC(0baf44ee) SHA1(5135d634f76893adb26a32976a69e2d47e2385c6) )
+ NAMCOS2_DATA_LOAD_O_128K( "rst1_data1.13p", 0x000000, CRC(58a8daac) SHA1(c13ae8fc25b748a006c6db5b4b7ae593738544e8) )
+ NAMCOS2_DATA_LOAD_E_128K( "rst1_data2.13r", 0x100000, CRC(8e850a2a) SHA1(e5230e80a23ca6d09c2c53f443ecf70cc74075d7) )
ROM_REGION( 0x100000, "c140", 0 ) /* Sound voices */
ROM_LOAD( "rst1_voi1.bin", 0x000000, 0x080000, CRC(e42027cd) SHA1(fa3a81118c7f112289c27023236dec2e9cbc78b5) )
@@ -4504,9 +4515,9 @@ ROM_START( rthun2j )
ROM_LOAD( "shape.bin", 0x000000, 0x80000, CRC(cf58fbbe) SHA1(fbe3b2f0c3267b298993d6238d97b119e13e07f6) )
ROM_REGION16_BE( 0x200000, "data_rom", 0 ) /* Shared data roms */
- NAMCOS2_DATA_LOAD_E_128K( "rst1_data0.bin", 0x000000, CRC(0baf44ee) SHA1(5135d634f76893adb26a32976a69e2d47e2385c6) )
- NAMCOS2_DATA_LOAD_O_128K( "rst1_data1.bin", 0x000000, CRC(58a8daac) SHA1(c13ae8fc25b748a006c6db5b4b7ae593738544e8) )
- NAMCOS2_DATA_LOAD_E_128K( "rst1_data2.bin", 0x100000, CRC(8e850a2a) SHA1(e5230e80a23ca6d09c2c53f443ecf70cc74075d7) )
+ NAMCOS2_DATA_LOAD_E_128K( "rst1_data0.13s", 0x000000, CRC(0baf44ee) SHA1(5135d634f76893adb26a32976a69e2d47e2385c6) )
+ NAMCOS2_DATA_LOAD_O_128K( "rst1_data1.13p", 0x000000, CRC(58a8daac) SHA1(c13ae8fc25b748a006c6db5b4b7ae593738544e8) )
+ NAMCOS2_DATA_LOAD_E_128K( "rst1_data2.13r", 0x100000, CRC(8e850a2a) SHA1(e5230e80a23ca6d09c2c53f443ecf70cc74075d7) )
ROM_REGION( 0x100000, "c140", 0 ) /* Sound voices */
ROM_LOAD( "rst1_voi1.bin", 0x000000, 0x080000, CRC(e42027cd) SHA1(fa3a81118c7f112289c27023236dec2e9cbc78b5) )
@@ -4656,10 +4667,10 @@ ROM_START( sgunner2 )
ROM_LOAD( "sns_sha0.bin", 0x000000, 0x80000, CRC(0374fd67) SHA1(2f09536ef4f8e1aa719108e73642feb376d6efff) )
ROM_REGION16_BE( 0x200000, "data_rom", 0 ) /* Shared data roms */
- NAMCOS2_DATA_LOAD_E_128K( "sns_dat0.bin", 0x000000, CRC(48295d93) SHA1(2b314128d5ed7d30895967dbd2ecd8f1dfdc61ca) )
- NAMCOS2_DATA_LOAD_O_128K( "sns_dat1.bin", 0x000000, CRC(b44cc656) SHA1(7126ef28bf174c6c560469fa6dc4cfb439811850) )
- NAMCOS2_DATA_LOAD_E_128K( "sns_dat2.bin", 0x100000, CRC(ca2ae645) SHA1(8addc8ed8244d0ff4c03909e865e3f15934963f1) )
- NAMCOS2_DATA_LOAD_O_128K( "sns_dat3.bin", 0x100000, CRC(203bb018) SHA1(36e20ab81ed69a941e13518ff2ae52acd6b22a78) )
+ NAMCOS2_DATA_LOAD_E_128K( "sns_dat0.13s", 0x000000, CRC(48295d93) SHA1(2b314128d5ed7d30895967dbd2ecd8f1dfdc61ca) )
+ NAMCOS2_DATA_LOAD_O_128K( "sns_dat1.13p", 0x000000, CRC(b44cc656) SHA1(7126ef28bf174c6c560469fa6dc4cfb439811850) )
+ NAMCOS2_DATA_LOAD_E_128K( "sns_dat2.13r", 0x100000, CRC(ca2ae645) SHA1(8addc8ed8244d0ff4c03909e865e3f15934963f1) )
+ NAMCOS2_DATA_LOAD_O_128K( "sns_dat3.13n", 0x100000, CRC(203bb018) SHA1(36e20ab81ed69a941e13518ff2ae52acd6b22a78) )
ROM_REGION( 0x100000, "c140", 0 ) /* Sound voices */
ROM_LOAD( "sns_voi1.bin", 0x000000, 0x080000, CRC(219c97f7) SHA1(d4b1d81e3d0e2585bc2fa305c0d80beef15b2a9f) )
@@ -4708,10 +4719,10 @@ ROM_START( sgunner2j )
ROM_LOAD( "sns_sha0.bin", 0x000000, 0x80000, CRC(0374fd67) SHA1(2f09536ef4f8e1aa719108e73642feb376d6efff) )
ROM_REGION16_BE( 0x200000, "data_rom", 0 ) /* Shared data roms */
- NAMCOS2_DATA_LOAD_E_128K( "sns_dat0.bin", 0x000000, CRC(48295d93) SHA1(2b314128d5ed7d30895967dbd2ecd8f1dfdc61ca) )
- NAMCOS2_DATA_LOAD_O_128K( "sns_dat1.bin", 0x000000, CRC(b44cc656) SHA1(7126ef28bf174c6c560469fa6dc4cfb439811850) )
- NAMCOS2_DATA_LOAD_E_128K( "sns_dat2.bin", 0x100000, CRC(ca2ae645) SHA1(8addc8ed8244d0ff4c03909e865e3f15934963f1) )
- NAMCOS2_DATA_LOAD_O_128K( "sns_dat3.bin", 0x100000, CRC(203bb018) SHA1(36e20ab81ed69a941e13518ff2ae52acd6b22a78) )
+ NAMCOS2_DATA_LOAD_E_128K( "sns_dat0.13s", 0x000000, CRC(48295d93) SHA1(2b314128d5ed7d30895967dbd2ecd8f1dfdc61ca) )
+ NAMCOS2_DATA_LOAD_O_128K( "sns_dat1.13p", 0x000000, CRC(b44cc656) SHA1(7126ef28bf174c6c560469fa6dc4cfb439811850) )
+ NAMCOS2_DATA_LOAD_E_128K( "sns_dat2.13r", 0x100000, CRC(ca2ae645) SHA1(8addc8ed8244d0ff4c03909e865e3f15934963f1) )
+ NAMCOS2_DATA_LOAD_O_128K( "sns_dat3.13n", 0x100000, CRC(203bb018) SHA1(36e20ab81ed69a941e13518ff2ae52acd6b22a78) )
ROM_REGION( 0x100000, "c140", 0 ) /* Sound voices */
ROM_LOAD( "sns_voi1.bin", 0x000000, 0x080000, CRC(219c97f7) SHA1(d4b1d81e3d0e2585bc2fa305c0d80beef15b2a9f) )
@@ -4798,8 +4809,8 @@ ROM_START( sws92 )
ROM_LOAD( "sss_sha0.bin", 0x000000, 0x80000, CRC(b71a731a) SHA1(29eab0ad5618f54e6c790d20f7dc895afae6c709) )
ROM_REGION16_BE( 0x200000, "data_rom", 0 ) /* Shared data roms */
- NAMCOS2_DATA_LOAD_E_256K( "sss1dat0.bin", 0x000000, CRC(db3e6aec) SHA1(928960e3dc9c8225e695d12e9b18fbb7f151c151) )
- NAMCOS2_DATA_LOAD_O_256K( "sss1dat1.bin", 0x000000, CRC(463b5ba8) SHA1(029dce2e7ee50181392b6ef409bbd192105fb065) )
+ NAMCOS2_DATA_LOAD_E_256K( "sss1dat0.13s", 0x000000, CRC(db3e6aec) SHA1(928960e3dc9c8225e695d12e9b18fbb7f151c151) )
+ NAMCOS2_DATA_LOAD_O_256K( "sss1dat1.13p", 0x000000, CRC(463b5ba8) SHA1(029dce2e7ee50181392b6ef409bbd192105fb065) )
ROM_REGION( 0x100000, "c140", 0 ) /* Sound voices */
ROM_LOAD( "ss_voi1.bin", 0x000000, 0x080000, CRC(503e51b7) SHA1(2e159fcc9bb0bef9a3476ae233bc8d61fabbb4bd) )
@@ -4841,10 +4852,10 @@ ROM_START( sws92g )
ROM_LOAD( "sss_sha0.bin", 0x000000, 0x80000, CRC(b71a731a) SHA1(29eab0ad5618f54e6c790d20f7dc895afae6c709) )
ROM_REGION16_BE( 0x200000, "data_rom", 0 ) /* Shared data roms */
- NAMCOS2_DATA_LOAD_E_256K( "sss1dat0.bin", 0x000000, CRC(db3e6aec) SHA1(928960e3dc9c8225e695d12e9b18fbb7f151c151) )
- NAMCOS2_DATA_LOAD_O_256K( "sss1dat1.bin", 0x000000, CRC(463b5ba8) SHA1(029dce2e7ee50181392b6ef409bbd192105fb065) )
- NAMCOS2_DATA_LOAD_E_256K( "ssg1dat2.bin", 0x080000, CRC(754128aa) SHA1(459ffb08bcd905644d6019e5b25870dcb1e2b418) )
- NAMCOS2_DATA_LOAD_O_256K( "ssg1dat3.bin", 0x080000, CRC(cb3fed01) SHA1(68887d46fd07cd8fb67d58f37e74a6aefdae4328) )
+ NAMCOS2_DATA_LOAD_E_256K( "sss1dat0.13s", 0x000000, CRC(db3e6aec) SHA1(928960e3dc9c8225e695d12e9b18fbb7f151c151) )
+ NAMCOS2_DATA_LOAD_O_256K( "sss1dat1.13p", 0x000000, CRC(463b5ba8) SHA1(029dce2e7ee50181392b6ef409bbd192105fb065) )
+ NAMCOS2_DATA_LOAD_E_256K( "ssg1dat2.13r", 0x080000, CRC(754128aa) SHA1(459ffb08bcd905644d6019e5b25870dcb1e2b418) )
+ NAMCOS2_DATA_LOAD_O_256K( "ssg1dat3.13n", 0x080000, CRC(cb3fed01) SHA1(68887d46fd07cd8fb67d58f37e74a6aefdae4328) )
ROM_REGION( 0x100000, "c140", 0 ) /* Sound voices */
ROM_LOAD( "ss_voi1.bin", 0x000000, 0x080000, CRC(503e51b7) SHA1(2e159fcc9bb0bef9a3476ae233bc8d61fabbb4bd) )
@@ -4886,8 +4897,8 @@ ROM_START( sws93 )
ROM_LOAD( "sst_sha0.bin", 0x000000, 0x80000, CRC(4f64d4bd) SHA1(0eb5311448cfd91b1e139b64b2f35b5179237e58) )
ROM_REGION16_BE( 0x200000, "data_rom", 0 ) /* Shared data roms */
- NAMCOS2_DATA_LOAD_E_512K( "sst1dat0.bin", 0x000000, CRC(b99c9656) SHA1(ac9e6bf46204dad70caf0d75614a20af0269a07f) )
- NAMCOS2_DATA_LOAD_O_512K( "sst1dat1.bin", 0x000000, CRC(60cf6281) SHA1(c02a5bf8f4f94cbe8b0448c9457af53cd1c043d0) )
+ NAMCOS2_DATA_LOAD_E_512K( "sst1dat0.13s", 0x000000, CRC(b99c9656) SHA1(ac9e6bf46204dad70caf0d75614a20af0269a07f) )
+ NAMCOS2_DATA_LOAD_O_512K( "sst1dat1.13p", 0x000000, CRC(60cf6281) SHA1(c02a5bf8f4f94cbe8b0448c9457af53cd1c043d0) )
ROM_REGION( 0x100000, "c140", 0 ) /* Sound voices */
ROM_LOAD( "ss_voi1.bin", 0x000000, 0x080000, CRC(503e51b7) SHA1(2e159fcc9bb0bef9a3476ae233bc8d61fabbb4bd) )
@@ -4928,9 +4939,9 @@ ROM_START( suzuka8h )
ROM_LOAD( "eh2-sha0.bin", 0x000000, 0x80000, CRC(7f24619c) SHA1(0d19ab621cb42c5315be9a6b56f6711fc46ffff7) )
ROM_REGION16_BE( 0x200000, "data_rom", 0 ) /* Shared data roms */
- NAMCOS2_DATA_LOAD_E_256K( "eh1-d0.bin", 0x000000, CRC(b43e5dfa) SHA1(7e24ee46169532cdb5c504239f7961f8d17e86e4) )
- NAMCOS2_DATA_LOAD_O_256K( "eh1-d1.bin", 0x000000, CRC(9825d5bf) SHA1(720f0e90c69a2e0c48889d510a15102768226a67) )
- NAMCOS2_DATA_LOAD_O_256K( "eh1-d3.bin", 0x100000, CRC(f46d301f) SHA1(70797fd584735844539553efcad53e11239ec10e) )
+ NAMCOS2_DATA_LOAD_E_256K( "eh1-d0.13s", 0x000000, CRC(b43e5dfa) SHA1(7e24ee46169532cdb5c504239f7961f8d17e86e4) )
+ NAMCOS2_DATA_LOAD_O_256K( "eh1-d1.13p", 0x000000, CRC(9825d5bf) SHA1(720f0e90c69a2e0c48889d510a15102768226a67) )
+ NAMCOS2_DATA_LOAD_O_256K( "eh1-d3.13n", 0x100000, CRC(f46d301f) SHA1(70797fd584735844539553efcad53e11239ec10e) )
ROM_REGION( 0x100, "c45_road:clut", 0 ) /* prom for road colors */
ROM_LOAD( "ehs1_landdt.10w", 0, 0x100, CRC(cde7e8a6) SHA1(860273daf2e649418746adf50a67ae33f9f3740c) )
@@ -4975,9 +4986,9 @@ ROM_START( suzuka8hj )
ROM_LOAD( "eh1-sha0.bin", 0x000000, 0x80000, CRC(39585cf9) SHA1(8cc18b5745ab2cf50d4df0a17fc1a57771db28ab) )
ROM_REGION16_BE( 0x200000, "data_rom", 0 ) /* Shared data roms */
- NAMCOS2_DATA_LOAD_E_256K( "eh1-d0.bin", 0x000000, CRC(b43e5dfa) SHA1(7e24ee46169532cdb5c504239f7961f8d17e86e4) )
- NAMCOS2_DATA_LOAD_O_256K( "eh1-d1.bin", 0x000000, CRC(9825d5bf) SHA1(720f0e90c69a2e0c48889d510a15102768226a67) )
- NAMCOS2_DATA_LOAD_O_256K( "eh1-d3.bin", 0x100000, CRC(f46d301f) SHA1(70797fd584735844539553efcad53e11239ec10e) )
+ NAMCOS2_DATA_LOAD_E_256K( "eh1-d0.13s", 0x000000, CRC(b43e5dfa) SHA1(7e24ee46169532cdb5c504239f7961f8d17e86e4) )
+ NAMCOS2_DATA_LOAD_O_256K( "eh1-d1.13p", 0x000000, CRC(9825d5bf) SHA1(720f0e90c69a2e0c48889d510a15102768226a67) )
+ NAMCOS2_DATA_LOAD_O_256K( "eh1-d3.13n", 0x100000, CRC(f46d301f) SHA1(70797fd584735844539553efcad53e11239ec10e) )
ROM_REGION( 0x100, "c45_road:clut", 0 ) /* prom for road colors */
ROM_LOAD( "ehs1_landdt.10w", 0, 0x100, CRC(cde7e8a6) SHA1(860273daf2e649418746adf50a67ae33f9f3740c) )
@@ -5028,8 +5039,8 @@ ROM_START( suzuk8h2 )
ROM_REGION16_BE( 0x200000, "data_rom", 0 ) /* Shared data roms */
NAMCOS2_DATA_LOAD_E_512K( "ehs1-dat0.13s", 0x000000, CRC(12a202fb) SHA1(dca1b88cb524d54a699d4f6003854cfc980e084b) )
- NAMCOS2_DATA_LOAD_O_512K( "ehs1-dat1.13r", 0x000000, CRC(91790905) SHA1(988af294959dbb8636f808347b44897a133d3203) )
- NAMCOS2_DATA_LOAD_E_512K( "ehs1-dat2.13p", 0x100000, CRC(087da1f3) SHA1(e9c4ba0383e883502c0f45ae6e6d5daba4eccb01) )
+ NAMCOS2_DATA_LOAD_O_512K( "ehs1-dat1.13p", 0x000000, CRC(91790905) SHA1(988af294959dbb8636f808347b44897a133d3203) )
+ NAMCOS2_DATA_LOAD_E_512K( "ehs1-dat2.13r", 0x100000, CRC(087da1f3) SHA1(e9c4ba0383e883502c0f45ae6e6d5daba4eccb01) )
NAMCOS2_DATA_LOAD_O_512K( "ehs1-dat3.13n", 0x100000, CRC(85aecb3f) SHA1(00ab6104dee0cd0fbdb0235b88b41e4d26794f98) )
ROM_REGION( 0x100, "c45_road:clut", 0 ) /* prom for road colors */
@@ -5081,8 +5092,8 @@ ROM_START( suzuk8h2j )
ROM_REGION16_BE( 0x200000, "data_rom", 0 ) /* Shared data roms */
NAMCOS2_DATA_LOAD_E_512K( "ehs1-dat0.13s", 0x000000, CRC(12a202fb) SHA1(dca1b88cb524d54a699d4f6003854cfc980e084b) )
- NAMCOS2_DATA_LOAD_O_512K( "ehs1-dat1.13r", 0x000000, CRC(91790905) SHA1(988af294959dbb8636f808347b44897a133d3203) )
- NAMCOS2_DATA_LOAD_E_512K( "ehs1-dat2.13p", 0x100000, CRC(087da1f3) SHA1(e9c4ba0383e883502c0f45ae6e6d5daba4eccb01) )
+ NAMCOS2_DATA_LOAD_O_512K( "ehs1-dat1.13p", 0x000000, CRC(91790905) SHA1(988af294959dbb8636f808347b44897a133d3203) )
+ NAMCOS2_DATA_LOAD_E_512K( "ehs1-dat2.13r", 0x100000, CRC(087da1f3) SHA1(e9c4ba0383e883502c0f45ae6e6d5daba4eccb01) )
NAMCOS2_DATA_LOAD_O_512K( "ehs1-dat3.13n", 0x100000, CRC(85aecb3f) SHA1(00ab6104dee0cd0fbdb0235b88b41e4d26794f98) )
ROM_REGION( 0x100, "c45_road:clut", 0 ) /* prom for road colors */
@@ -5137,8 +5148,8 @@ ROM_START( valkyrie )
NAMCOS2_GFXROM_LOAD_128K( "wdshape.bin", 0x000000, CRC(3b5e0249) SHA1(259bbabf57a8ad739c646c56aad6d0b92e10adcd) )
ROM_REGION16_BE( 0x200000, "data_rom", 0 ) /* Shared data roms */
- NAMCOS2_DATA_LOAD_E_128K( "wd1dat0.bin", 0x000000, CRC(ea209f48) SHA1(5e73a745dc2faaa4ce6c633d4072d41e9e494276) )
- NAMCOS2_DATA_LOAD_O_128K( "wd1dat1.bin", 0x000000, CRC(04b48ada) SHA1(aa046f8856bdd5b56d481c2c12ad2808c6517a5f) )
+ NAMCOS2_DATA_LOAD_E_128K( "wd1dat0.13s", 0x000000, CRC(ea209f48) SHA1(5e73a745dc2faaa4ce6c633d4072d41e9e494276) )
+ NAMCOS2_DATA_LOAD_O_128K( "wd1dat1.13p", 0x000000, CRC(04b48ada) SHA1(aa046f8856bdd5b56d481c2c12ad2808c6517a5f) )
ROM_REGION( 0x100000, "c140", 0 ) /* Sound voices */
ROM_LOAD( "wd1voi1.bin", 0x000000, 0x040000, CRC(f1ace193) SHA1(dd13bdf4b99c6bf4e356d623ff2e3da72db331dd) )
@@ -5187,10 +5198,10 @@ ROM_START( kyukaidk )
NAMCOS2_GFXROM_LOAD_128K( "ky1_sha.bin", 0x000000, CRC(380a20d7) SHA1(9627d2e0192779d50bfb25d5c19976275818c310) )
ROM_REGION16_BE( 0x200000, "data_rom", 0 ) /* Shared data roms */
- NAMCOS2_DATA_LOAD_E_128K( "ky1_d0.bin", 0x000000, CRC(c9cf399d) SHA1(90cba42781b1e03ecc3f5b802d740ace6b88baaa) )
- NAMCOS2_DATA_LOAD_O_128K( "ky1_d1.bin", 0x000000, CRC(6d4f21b9) SHA1(f234a785f61969be684d2a4aed59616f125d72fc) )
- NAMCOS2_DATA_LOAD_E_128K( "ky1_d2.bin", 0x100000, CRC(eb6d19c8) SHA1(c9fdb33fe191d3c4d284db7cbb05d852551a998d) )
- NAMCOS2_DATA_LOAD_O_128K( "ky1_d3.bin", 0x100000, CRC(95674701) SHA1(9a8832837b9a3f8b75437717ea84d86261bfce59) )
+ NAMCOS2_DATA_LOAD_E_128K( "ky1_d0.13s", 0x000000, CRC(c9cf399d) SHA1(90cba42781b1e03ecc3f5b802d740ace6b88baaa) )
+ NAMCOS2_DATA_LOAD_O_128K( "ky1_d1.13p", 0x000000, CRC(6d4f21b9) SHA1(f234a785f61969be684d2a4aed59616f125d72fc) )
+ NAMCOS2_DATA_LOAD_E_128K( "ky1_d2.13r", 0x100000, CRC(eb6d19c8) SHA1(c9fdb33fe191d3c4d284db7cbb05d852551a998d) )
+ NAMCOS2_DATA_LOAD_O_128K( "ky1_d3.13n", 0x100000, CRC(95674701) SHA1(9a8832837b9a3f8b75437717ea84d86261bfce59) )
ROM_REGION( 0x100000, "c140", 0 ) /* Sound voices */
ROM_LOAD( "ky1_v1.bin", 0x000000, 0x080000, CRC(5ff81aec) SHA1(0535eda474de0a4aa3b48649b04afe2b7a8619c9) )
@@ -5234,10 +5245,10 @@ ROM_START( kyukaidko )
NAMCOS2_GFXROM_LOAD_128K( "ky1_sha.bin", 0x000000, CRC(380a20d7) SHA1(9627d2e0192779d50bfb25d5c19976275818c310) )
ROM_REGION16_BE( 0x200000, "data_rom", 0 ) /* Shared data roms */
- NAMCOS2_DATA_LOAD_E_128K( "ky1_d0.bin", 0x000000, CRC(c9cf399d) SHA1(90cba42781b1e03ecc3f5b802d740ace6b88baaa) )
- NAMCOS2_DATA_LOAD_O_128K( "ky1_d1.bin", 0x000000, CRC(6d4f21b9) SHA1(f234a785f61969be684d2a4aed59616f125d72fc) )
- NAMCOS2_DATA_LOAD_E_128K( "ky1_d2.bin", 0x100000, CRC(eb6d19c8) SHA1(c9fdb33fe191d3c4d284db7cbb05d852551a998d) )
- NAMCOS2_DATA_LOAD_O_128K( "ky1_d3.bin", 0x100000, CRC(95674701) SHA1(9a8832837b9a3f8b75437717ea84d86261bfce59) )
+ NAMCOS2_DATA_LOAD_E_128K( "ky1_d0.13s", 0x000000, CRC(c9cf399d) SHA1(90cba42781b1e03ecc3f5b802d740ace6b88baaa) )
+ NAMCOS2_DATA_LOAD_O_128K( "ky1_d1.13p", 0x000000, CRC(6d4f21b9) SHA1(f234a785f61969be684d2a4aed59616f125d72fc) )
+ NAMCOS2_DATA_LOAD_E_128K( "ky1_d2.13r", 0x100000, CRC(eb6d19c8) SHA1(c9fdb33fe191d3c4d284db7cbb05d852551a998d) )
+ NAMCOS2_DATA_LOAD_O_128K( "ky1_d3.13n", 0x100000, CRC(95674701) SHA1(9a8832837b9a3f8b75437717ea84d86261bfce59) )
ROM_REGION( 0x100000, "c140", 0 ) /* Sound voices */
ROM_LOAD( "ky1_v1.bin", 0x000000, 0x080000, CRC(5ff81aec) SHA1(0535eda474de0a4aa3b48649b04afe2b7a8619c9) )
diff --git a/src/mame/drivers/namcos21.cpp b/src/mame/drivers/namcos21.cpp
index 656a683bc33..d4b0b2b385b 100644
--- a/src/mame/drivers/namcos21.cpp
+++ b/src/mame/drivers/namcos21.cpp
@@ -291,11 +291,6 @@ Filter Board
#include "sound/c140.h"
#include "sound/ym2151.h"
-
-// TODO: basic parameters to get 60.606060 Hz, x2 is for interlace
-#define MCFG_SCREEN_RAW_PARAMS_NAMCO480I \
- MCFG_SCREEN_RAW_PARAMS(12288000*2, 768, 0, 496, 264*2,0,480)
-
#define ENABLE_LOGGING 0
#define NAMCOS21_NUM_COLORS 0x8000
@@ -858,39 +853,41 @@ void namcos21_state::configure_c148_standard(machine_config &config)
m_slave_intc->link_c148_device(m_master_intc);
}
-MACHINE_CONFIG_START(namcos21_state::winrun)
- MCFG_DEVICE_ADD("maincpu", M68000,12288000) /* Master */
- MCFG_DEVICE_PROGRAM_MAP(winrun_master_map)
- MCFG_TIMER_DRIVER_ADD_SCANLINE("scantimer", namcos21_state, screen_scanline, "screen", 0, 1)
+void namcos21_state::winrun(machine_config &config)
+{
+ M68000(config, m_maincpu, 12288000); /* Master */
+ m_maincpu->set_addrmap(AS_PROGRAM, &namcos21_state::winrun_master_map);
+ TIMER(config, "scantimer").configure_scanline(FUNC(namcos21_state::screen_scanline), "screen", 0, 1);
- MCFG_DEVICE_ADD("slave", M68000,12288000) /* Slave */
- MCFG_DEVICE_PROGRAM_MAP(winrun_slave_map)
+ M68000(config, m_slave, 12288000); /* Slave */
+ m_slave->set_addrmap(AS_PROGRAM, &namcos21_state::winrun_slave_map);
- MCFG_DEVICE_ADD("audiocpu", MC6809E, 3072000) /* Sound */
- MCFG_DEVICE_PROGRAM_MAP(sound_map)
- MCFG_DEVICE_PERIODIC_INT_DRIVER(namcos21_state, irq0_line_hold, 2*60)
- MCFG_DEVICE_PERIODIC_INT_DRIVER(namcos21_state, irq1_line_hold, 120)
+ MC6809E(config, m_audiocpu, 3072000); /* Sound */
+ m_audiocpu->set_addrmap(AS_PROGRAM, &namcos21_state::sound_map);
+ m_audiocpu->set_periodic_int(FUNC(namcos21_state::irq0_line_hold), attotime::from_hz(2*60));
+ m_audiocpu->set_periodic_int(FUNC(namcos21_state::irq1_line_hold), attotime::from_hz(120));
configure_c65_namcos21(config);
NAMCOS21_DSP(config, m_namcos21_dsp, 0);
m_namcos21_dsp->set_renderer_tag("namcos21_3d");
- MCFG_DEVICE_ADD("gpu", M68000,12288000) /* graphics coprocessor */
- MCFG_DEVICE_PROGRAM_MAP(winrun_gpu_map)
+ m68000_device &gpu(M68000(config, "gpu", 12288000)); /* graphics coprocessor */
+ gpu.set_addrmap(AS_PROGRAM, &namcos21_state::winrun_gpu_map);
configure_c148_standard(config);
NAMCO_C148(config, m_gpu_intc, 0, "gpu", false);
NAMCO_C139(config, m_sci, 0);
- MCFG_QUANTUM_TIME(attotime::from_hz(6000)) /* 100 CPU slices per frame */
+ config.m_minimum_quantum = attotime::from_hz(6000); /* 100 CPU slices per frame */
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_1);
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_RAW_PARAMS_NAMCO480I
- MCFG_SCREEN_UPDATE_DRIVER(namcos21_state, screen_update)
- MCFG_SCREEN_PALETTE(m_palette)
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ // TODO: basic parameters to get 60.606060 Hz, x2 is for interlace
+ m_screen->set_raw(12288000*2, 768, 0, 496, 264*2, 0, 480);
+ m_screen->set_screen_update(FUNC(namcos21_state::screen_update));
+ m_screen->set_palette(m_palette);
PALETTE(config, m_palette).set_format(palette_device::xBRG_888, NAMCOS21_NUM_COLORS);
@@ -909,7 +906,7 @@ MACHINE_CONFIG_START(namcos21_state::winrun)
m_c140->add_route(1, "rspeaker", 0.50);
YM2151(config, "ymsnd", 3579580).add_route(0, "lspeaker", 0.30).add_route(1, "rspeaker", 0.30);
-MACHINE_CONFIG_END
+}
ROM_START( winrun )
diff --git a/src/mame/drivers/namcos21_c67.cpp b/src/mame/drivers/namcos21_c67.cpp
index dc2c5a0adbb..51cee217c0c 100644
--- a/src/mame/drivers/namcos21_c67.cpp
+++ b/src/mame/drivers/namcos21_c67.cpp
@@ -271,10 +271,6 @@ Namco System 21 Video Hardware
#include "sound/ym2151.h"
#include "emupal.h"
-// TODO: basic parameters to get 60.606060 Hz, x2 is for interlace
-#define MCFG_SCREEN_RAW_PARAMS_NAMCO480I \
- MCFG_SCREEN_RAW_PARAMS(12288000*2, 768, 0, 496, 264*2,0,480)
-
#define ENABLE_LOGGING 0
#define NAMCOS21_NUM_COLORS 0x8000
@@ -810,32 +806,34 @@ void namcos21_c67_state::configure_c148_standard(machine_config &config)
}
// starblad, solvalou, aircomb, cybsled base state
-MACHINE_CONFIG_START(namcos21_c67_state::namcos21)
- MCFG_DEVICE_ADD("maincpu", M68000,12288000) /* Master */
- MCFG_DEVICE_PROGRAM_MAP(master_map)
- MCFG_TIMER_DRIVER_ADD_SCANLINE("scantimer", namcos21_c67_state, screen_scanline, "screen", 0, 1)
+void namcos21_c67_state::namcos21(machine_config &config)
+{
+ M68000(config, m_maincpu, 12288000); /* Master */
+ m_maincpu->set_addrmap(AS_PROGRAM, &namcos21_c67_state::master_map);
+ TIMER(config, "scantimer").configure_scanline(FUNC(namcos21_c67_state::screen_scanline), "screen", 0, 1);
- MCFG_DEVICE_ADD("slave", M68000,12288000) /* Slave */
- MCFG_DEVICE_PROGRAM_MAP(slave_map)
+ M68000(config, m_slave, 12288000); /* Slave */
+ m_slave->set_addrmap(AS_PROGRAM, &namcos21_c67_state::slave_map);
- MCFG_DEVICE_ADD("audiocpu", MC6809E, 3072000) /* Sound */
- MCFG_DEVICE_PROGRAM_MAP(sound_map)
- MCFG_DEVICE_PERIODIC_INT_DRIVER(namcos21_c67_state, irq0_line_hold, 2*60)
- MCFG_DEVICE_PERIODIC_INT_DRIVER(namcos21_c67_state, irq1_line_hold, 120)
+ MC6809E(config, m_audiocpu, 3072000); /* Sound */
+ m_audiocpu->set_addrmap(AS_PROGRAM, &namcos21_c67_state::sound_map);
+ m_audiocpu->set_periodic_int(FUNC(namcos21_c67_state::irq0_line_hold), attotime::from_hz(2*60));
+ m_audiocpu->set_periodic_int(FUNC(namcos21_c67_state::irq1_line_hold), attotime::from_hz(120));
configure_c68_namcos21(config);
NAMCOS21_DSP_C67(config, m_namcos21_dsp_c67, 0);
m_namcos21_dsp_c67->set_renderer_tag("namcos21_3d");
- MCFG_QUANTUM_TIME(attotime::from_hz(12000))
+ config.m_minimum_quantum = attotime::from_hz(12000);
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_1);
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_RAW_PARAMS_NAMCO480I
- MCFG_SCREEN_UPDATE_DRIVER(namcos21_c67_state, screen_update)
- MCFG_SCREEN_PALETTE(m_palette)
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ // TODO: basic parameters to get 60.606060 Hz, x2 is for interlace
+ m_screen->set_raw(12288000*2, 768, 0, 496, 264*2, 0, 480);
+ m_screen->set_screen_update(FUNC(namcos21_c67_state::screen_update));
+ m_screen->set_palette(m_palette);
NAMCOS21_3D(config, m_namcos21_3d, 0);
m_namcos21_3d->set_zz_shift_mult(11, 0x200);
@@ -865,33 +863,37 @@ MACHINE_CONFIG_START(namcos21_c67_state::namcos21)
m_c140->add_route(1, "rspeaker", 0.50);
YM2151(config, "ymsnd", 3579580).add_route(0, "lspeaker", 0.30).add_route(1, "rspeaker", 0.30);
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(namcos21_c67_state::aircomb)
+void namcos21_c67_state::aircomb(machine_config &config)
+{
namcos21(config);
m_namcos21_dsp_c67->set_gametype(namcos21_dsp_c67_device::NAMCOS21_AIRCOMBAT);
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(namcos21_c67_state::starblad)
+void namcos21_c67_state::starblad(machine_config &config)
+{
namcos21(config);
m_namcos21_dsp_c67->set_gametype(namcos21_dsp_c67_device::NAMCOS21_STARBLADE);
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(namcos21_c67_state::cybsled)
+void namcos21_c67_state::cybsled(machine_config &config)
+{
namcos21(config);
m_namcos21_dsp_c67->set_gametype(namcos21_dsp_c67_device::NAMCOS21_CYBERSLED);
-MACHINE_CONFIG_END
+}
WRITE_LINE_MEMBER(namcos21_c67_state::yield_hack)
{
m_maincpu->yield();
}
-MACHINE_CONFIG_START(namcos21_c67_state::solvalou)
+void namcos21_c67_state::solvalou(machine_config &config)
+{
namcos21(config);
m_namcos21_dsp_c67->set_gametype(namcos21_dsp_c67_device::NAMCOS21_SOLVALOU);
m_namcos21_dsp_c67->yield_hack_callback().set(FUNC(namcos21_c67_state::yield_hack)); // VCK function
-MACHINE_CONFIG_END
+}
ROM_START( starblad )
diff --git a/src/mame/drivers/namcos21_de.cpp b/src/mame/drivers/namcos21_de.cpp
index f06353186cd..7b1d98d4bcc 100644
--- a/src/mame/drivers/namcos21_de.cpp
+++ b/src/mame/drivers/namcos21_de.cpp
@@ -48,9 +48,6 @@ Driver's Eyes works,
#include "sound/c140.h"
#include "emupal.h"
-// TODO: basic parameters to get 60.606060 Hz, x2 is for interlace
-#define MCFG_SCREEN_RAW_PARAMS_NAMCO480I \
- MCFG_SCREEN_RAW_PARAMS(12288000*2, 768, 0, 496, 264*2,0,480)
#define ENABLE_LOGGING 0
@@ -183,35 +180,37 @@ static GFXDECODE_START( gfx_namcos21 )
GFXDECODE_END
-MACHINE_CONFIG_START(namco_de_pcbstack_device::device_add_mconfig)
- MCFG_DEVICE_ADD("maincpu", M68000,12288000) /* Master */
- MCFG_DEVICE_PROGRAM_MAP(driveyes_master_map)
- MCFG_TIMER_DRIVER_ADD_SCANLINE("scantimer", namco_de_pcbstack_device, screen_scanline, "screen", 0, 1)
+void namco_de_pcbstack_device::device_add_mconfig(machine_config &config)
+{
+ M68000(config, m_maincpu, 12288000); /* Master */
+ m_maincpu->set_addrmap(AS_PROGRAM, &namco_de_pcbstack_device::driveyes_master_map);
+ TIMER(config, "scantimer").configure_scanline(FUNC(namco_de_pcbstack_device::screen_scanline), "screen", 0, 1);
- MCFG_DEVICE_ADD("slave", M68000,12288000) /* Slave */
- MCFG_DEVICE_PROGRAM_MAP(driveyes_slave_map)
+ M68000(config, m_slave, 12288000); /* Slave */
+ m_slave->set_addrmap(AS_PROGRAM, &namco_de_pcbstack_device::driveyes_slave_map);
- MCFG_DEVICE_ADD("audiocpu", MC6809E, 3072000) /* Sound */
- MCFG_DEVICE_PROGRAM_MAP(sound_map)
- MCFG_DEVICE_PERIODIC_INT_DRIVER(namco_de_pcbstack_device, irq0_line_hold, 2*60)
- MCFG_DEVICE_PERIODIC_INT_DRIVER(namco_de_pcbstack_device, irq1_line_hold, 120)
+ MC6809E(config, m_audiocpu, 3072000); /* Sound */
+ m_audiocpu->set_addrmap(AS_PROGRAM, &namco_de_pcbstack_device::sound_map);
+ m_audiocpu->set_periodic_int(FUNC(namco_de_pcbstack_device::irq0_line_hold), attotime::from_hz(2*60));
+ m_audiocpu->set_periodic_int(FUNC(namco_de_pcbstack_device::irq1_line_hold), attotime::from_hz(120));
configure_c68_namcos21(config);
NAMCOS21_DSP(config, m_namcos21_dsp, 0);
m_namcos21_dsp->set_renderer_tag("namcos21_3d");
- MCFG_QUANTUM_TIME(attotime::from_hz(6000)) /* 100 CPU slices per frame */
+ config.m_minimum_quantum = attotime::from_hz(6000); /* 100 CPU slices per frame */
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_1);
configure_c148_standard(config);
NAMCO_C139(config, m_sci, 0);
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_RAW_PARAMS_NAMCO480I
- MCFG_SCREEN_UPDATE_DRIVER(namco_de_pcbstack_device, screen_update)
- MCFG_SCREEN_PALETTE(m_palette)
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ // TODO: basic parameters to get 60.606060 Hz, x2 is for interlace
+ m_screen->set_raw(12288000*2, 768, 0, 496, 264*2, 0, 480);
+ m_screen->set_screen_update(FUNC(namco_de_pcbstack_device::screen_update));
+ m_screen->set_palette(m_palette);
GFXDECODE(config, "gfxdecode", m_palette, gfx_namcos21);
PALETTE(config, m_palette).set_format(palette_device::xBRG_888, NAMCOS21_NUM_COLORS);
@@ -239,7 +238,7 @@ MACHINE_CONFIG_START(namco_de_pcbstack_device::device_add_mconfig)
m_c140->add_route(1, "rspeaker", 0.50);
YM2151(config, "ymsnd", 3579580).add_route(0, "lspeaker", 0.30).add_route(1, "rspeaker", 0.30);
-MACHINE_CONFIG_END
+}
uint32_t namco_de_pcbstack_device::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
diff --git a/src/mame/drivers/namcos22.cpp b/src/mame/drivers/namcos22.cpp
index 9fdb6eeeed2..c91fc4628c6 100644
--- a/src/mame/drivers/namcos22.cpp
+++ b/src/mame/drivers/namcos22.cpp
@@ -3377,8 +3377,8 @@ static INPUT_PORTS_START( alpiner )
PORT_BIT( 0x0010, IP_ACTIVE_LOW, IPT_START1 ) // Decision / View Change
PORT_BIT( 0x0020, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_16WAY // L Selection
PORT_BIT( 0x0040, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT) PORT_16WAY // R Selection
- PORT_BIT( 0x0080, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_CUSTOM_MEMBER(DEVICE_SELF, namcos22_state, alpine_motor_read, (void *)0) // steps are free
- PORT_BIT( 0x0100, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_CUSTOM_MEMBER(DEVICE_SELF, namcos22_state, alpine_motor_read, (void *)1) // steps are locked
+ PORT_BIT( 0x0080, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_CUSTOM_MEMBER(DEVICE_SELF, namcos22_state, alpine_motor_read, 0) // steps are free
+ PORT_BIT( 0x0100, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_CUSTOM_MEMBER(DEVICE_SELF, namcos22_state, alpine_motor_read, 1) // steps are locked
PORT_BIT( 0xfe00, IP_ACTIVE_LOW, IPT_UNKNOWN )
PORT_START("ADC.0")
@@ -3877,12 +3877,12 @@ void namcos22_state::machine_start()
}
// System22
-MACHINE_CONFIG_START(namcos22_state::namcos22)
-
+void namcos22_state::namcos22(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M68020, 49.152_MHz_XTAL/2) // MC68020RP25E
- MCFG_DEVICE_PROGRAM_MAP(namcos22_am)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", namcos22_state, namcos22_interrupt)
+ M68020(config, m_maincpu, 49.152_MHz_XTAL/2); // MC68020RP25E
+ m_maincpu->set_addrmap(AS_PROGRAM, &namcos22_state::namcos22_am);
+ m_maincpu->set_vblank_int("screen", FUNC(namcos22_state::namcos22_interrupt));
tms32025_device& master(TMS32025(config, m_master, 40_MHz_XTAL));
master.set_addrmap(AS_PROGRAM, &namcos22_state::master_dsp_program);
@@ -3894,7 +3894,7 @@ MACHINE_CONFIG_START(namcos22_state::namcos22)
master.xf_out_cb().set(FUNC(namcos22_state::dsp_xf_output_w));
master.dr_in_cb().set(FUNC(namcos22_state::master_serial_io_r));
master.set_vblank_int("screen", FUNC(namcos22_state::dsp_vblank_irq));
- MCFG_TIMER_DRIVER_ADD_PERIODIC("dsp_serial", namcos22_state, dsp_serial_pulse, attotime::from_hz(SERIAL_IO_PERIOD))
+ TIMER(config, "dsp_serial").configure_periodic(FUNC(namcos22_state::dsp_serial_pulse), attotime::from_hz(SERIAL_IO_PERIOD));
tms32025_device& slave(TMS32025(config, m_slave, 40_MHz_XTAL));
slave.set_addrmap(AS_PROGRAM, &namcos22_state::slave_dsp_program);
@@ -3906,140 +3906,141 @@ MACHINE_CONFIG_START(namcos22_state::namcos22)
slave.xf_out_cb().set(FUNC(namcos22_state::dsp_xf_output_w));
slave.dx_out_cb().set(FUNC(namcos22_state::slave_serial_io_w));
- MCFG_DEVICE_ADD("mcu", NAMCO_C74, 49.152_MHz_XTAL/3) // C74 on the CPU board has no periodic interrupts, it runs entirely off Timer A0
- MCFG_DEVICE_PROGRAM_MAP(mcu_s22_program)
- MCFG_DEVICE_IO_MAP(mcu_s22_io)
+ NAMCO_C74(config, m_mcu, 49.152_MHz_XTAL/3); // C74 on the CPU board has no periodic interrupts, it runs entirely off Timer A0
+ m_mcu->set_addrmap(AS_PROGRAM, &namcos22_state::mcu_s22_program);
+ m_mcu->set_addrmap(AS_IO, &namcos22_state::mcu_s22_io);
- MCFG_DEVICE_ADD("iomcu", NAMCO_C74, 6.144_MHz_XTAL)
- MCFG_DEVICE_PROGRAM_MAP(iomcu_s22_program)
- MCFG_DEVICE_IO_MAP(iomcu_s22_io)
+ NAMCO_C74(config, m_iomcu, 6.144_MHz_XTAL);
+ m_iomcu->set_addrmap(AS_PROGRAM, &namcos22_state::iomcu_s22_program);
+ m_iomcu->set_addrmap(AS_IO, &namcos22_state::iomcu_s22_io);
EEPROM_2864(config, "eeprom").write_time(attotime::zero);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- //MCFG_SCREEN_VIDEO_ATTRIBUTES(VIDEO_ALWAYS_UPDATE)
- MCFG_SCREEN_RAW_PARAMS(PIXEL_CLOCK, HTOTAL, HBEND, HBSTART, VTOTAL, VBEND, VBSTART)
- MCFG_SCREEN_UPDATE_DRIVER(namcos22_state, screen_update_namcos22)
- MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE(*this, namcos22_state, screen_vblank))
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ //m_screen->set_video_attributes(VIDEO_ALWAYS_UPDATE);
+ m_screen->set_raw(PIXEL_CLOCK, HTOTAL, HBEND, HBSTART, VTOTAL, VBEND, VBSTART);
+ m_screen->set_screen_update(FUNC(namcos22_state::screen_update_namcos22));
+ m_screen->screen_vblank().set(FUNC(namcos22_state::screen_vblank));
- MCFG_PALETTE_ADD("palette", 0x8000)
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_namcos22)
+ PALETTE(config, m_palette).set_entries(0x8000);
+ GFXDECODE(config, m_gfxdecode, m_palette, gfx_namcos22);
/* sound hardware */
SPEAKER(config, "lspeaker").front_left();
SPEAKER(config, "rspeaker").front_right();
- MCFG_DEVICE_ADD("c352", C352, 49.152_MHz_XTAL/2, 288)
- MCFG_SOUND_ROUTE(0, "lspeaker", 1.00)
- MCFG_SOUND_ROUTE(1, "rspeaker", 1.00)
-MACHINE_CONFIG_END
+ C352(config, m_c352, 49.152_MHz_XTAL/2, 288);
+ m_c352->add_route(0, "lspeaker", 1.00);
+ m_c352->add_route(1, "rspeaker", 1.00);
+}
-MACHINE_CONFIG_START(namcos22_state::cybrcomm)
+void namcos22_state::cybrcomm(machine_config &config)
+{
namcos22(config);
SPEAKER(config, "rear_left").rear_left();
SPEAKER(config, "rear_right").rear_right();
- MCFG_DEVICE_MODIFY("c352")
- MCFG_SOUND_ROUTE(2, "rear_left", 1.00)
- MCFG_SOUND_ROUTE(3, "rear_right", 1.00)
-MACHINE_CONFIG_END
+ m_c352->add_route(2, "rear_left", 1.00);
+ m_c352->add_route(3, "rear_right", 1.00);
+}
// System Super22
-MACHINE_CONFIG_START(namcos22_state::namcos22s)
+void namcos22_state::namcos22s(machine_config &config)
+{
namcos22(config);
/* basic machine hardware */
- MCFG_DEVICE_REPLACE("maincpu", M68EC020, 49.152_MHz_XTAL/2) // MC68EC020FG25
- MCFG_DEVICE_PROGRAM_MAP(namcos22s_am)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", namcos22_state, namcos22s_interrupt)
+ M68EC020(config.replace(), m_maincpu, 49.152_MHz_XTAL/2); // MC68EC020FG25
+ m_maincpu->set_addrmap(AS_PROGRAM, &namcos22_state::namcos22s_am);
+ m_maincpu->set_vblank_int("screen", FUNC(namcos22_state::namcos22s_interrupt));
- MCFG_DEVICE_REPLACE("mcu", M37710S4, 49.152_MHz_XTAL/3)
- MCFG_DEVICE_PROGRAM_MAP(mcu_program)
- MCFG_DEVICE_IO_MAP(mcu_io)
- MCFG_TIMER_DRIVER_ADD_SCANLINE("mcu_irq", namcos22_state, mcu_irq, "screen", 0, 240)
- MCFG_QUANTUM_TIME(attotime::from_hz(9000)) // erratic inputs otherwise, probably mcu vs maincpu shareram
+ M37710S4(config.replace(), m_mcu, 49.152_MHz_XTAL/3);
+ m_mcu->set_addrmap(AS_PROGRAM, &namcos22_state::mcu_program);
+ m_mcu->set_addrmap(AS_IO, &namcos22_state::mcu_io);
+ TIMER(config, "mcu_irq").configure_scanline(FUNC(namcos22_state::mcu_irq), "screen", 0, 240);
+ config.m_minimum_quantum = attotime::from_hz(9000); // erratic inputs otherwise, probably mcu vs maincpu shareram
- MCFG_DEVICE_REMOVE("iomcu")
+ config.device_remove("iomcu");
MB87078(config, m_mb87078);
m_mb87078->gain_changed().set(FUNC(namcos22_state::mb87078_gain_changed));
/* video hardware */
- MCFG_SCREEN_MODIFY("screen")
- MCFG_SCREEN_UPDATE_DRIVER(namcos22_state, screen_update_namcos22s)
+ m_screen->set_screen_update(FUNC(namcos22_state::screen_update_namcos22s));
- MCFG_DEVICE_REPLACE("gfxdecode", GFXDECODE, "palette", gfx_super)
-MACHINE_CONFIG_END
+ GFXDECODE(config.replace(), m_gfxdecode, m_palette, gfx_super);
+}
-MACHINE_CONFIG_START(namcos22_state::airco22b)
+void namcos22_state::airco22b(machine_config &config)
+{
namcos22s(config);
SPEAKER(config, "bodysonic").subwoofer();
- MCFG_DEVICE_MODIFY("c352")
- MCFG_SOUND_ROUTE(2, "bodysonic", 0.50) // to subwoofer
-MACHINE_CONFIG_END
+ m_c352->add_route(2, "bodysonic", 0.50); // to subwoofer
+}
-MACHINE_CONFIG_START(namcos22_state::alpine)
+void namcos22_state::alpine(machine_config &config)
+{
namcos22s(config);
- MCFG_DEVICE_MODIFY("mcu")
- MCFG_DEVICE_IO_MAP(alpine_io_map)
+ m_mcu->set_addrmap(AS_IO, &namcos22_state::alpine_io_map);
- MCFG_TIMER_DRIVER_ADD("motor_timer", namcos22_state, alpine_steplock_callback)
-MACHINE_CONFIG_END
+ TIMER(config, m_motor_timer).configure_generic(FUNC(namcos22_state::alpine_steplock_callback));
+}
-MACHINE_CONFIG_START(namcos22_state::alpinesa)
+void namcos22_state::alpinesa(machine_config &config)
+{
alpine(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(alpinesa_am)
-MACHINE_CONFIG_END
+ m_maincpu->set_addrmap(AS_PROGRAM, &namcos22_state::alpinesa_am);
+}
-MACHINE_CONFIG_START(namcos22_state::cybrcycc)
+void namcos22_state::cybrcycc(machine_config &config)
+{
namcos22s(config);
SPEAKER(config, "tank", 0.0, 0.0, 0.0);
- MCFG_DEVICE_MODIFY("c352")
- MCFG_SOUND_ROUTE(2, "tank", 1.00)
-MACHINE_CONFIG_END
+ m_c352->add_route(2, "tank", 1.00);
+}
-MACHINE_CONFIG_START(namcos22_state::dirtdash)
+void namcos22_state::dirtdash(machine_config &config)
+{
namcos22s(config);
SPEAKER(config, "road", 0.0, 0.0, 0.0);
- MCFG_DEVICE_MODIFY("c352")
- MCFG_SOUND_ROUTE(3, "road", 1.00)
-MACHINE_CONFIG_END
+ m_c352->add_route(3, "road", 1.00);
+}
-MACHINE_CONFIG_START(namcos22_state::timecris)
+void namcos22_state::timecris(machine_config &config)
+{
namcos22s(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(timecris_am)
-MACHINE_CONFIG_END
+ m_maincpu->set_addrmap(AS_PROGRAM, &namcos22_state::timecris_am);
+}
-MACHINE_CONFIG_START(namcos22_state::tokyowar)
+void namcos22_state::tokyowar(machine_config &config)
+{
namcos22s(config);
SPEAKER(config, "vibration").subwoofer();
SPEAKER(config, "seat").rear_center();
- MCFG_DEVICE_MODIFY("c352")
- MCFG_SOUND_ROUTE(2, "vibration", 0.50) // to "bass shaker"
- MCFG_SOUND_ROUTE(3, "seat", 1.00)
-MACHINE_CONFIG_END
+ m_c352->add_route(2, "vibration", 0.50); // to "bass shaker"
+ m_c352->add_route(3, "seat", 1.00);
+}
-MACHINE_CONFIG_START(namcos22_state::propcycl)
+void namcos22_state::propcycl(machine_config &config)
+{
namcos22s(config);
- MCFG_TIMER_DRIVER_ADD_PERIODIC("pc_p_upd", namcos22_state, propcycl_pedal_update, attotime::from_msec(20))
- MCFG_TIMER_DRIVER_ADD("pc_p_int", namcos22_state, propcycl_pedal_interrupt)
-MACHINE_CONFIG_END
+ TIMER(config, "pc_p_upd").configure_periodic(FUNC(namcos22_state::propcycl_pedal_update), attotime::from_msec(20));
+ TIMER(config, m_pc_pedal_interrupt).configure_generic(FUNC(namcos22_state::propcycl_pedal_interrupt));
+}
MACHINE_START_MEMBER(namcos22_state,adillor)
{
@@ -4049,12 +4050,13 @@ MACHINE_START_MEMBER(namcos22_state,adillor)
elem = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(namcos22_state::adillor_trackball_interrupt),this));
}
-MACHINE_CONFIG_START(namcos22_state::adillor)
+void namcos22_state::adillor(machine_config &config)
+{
namcos22s(config);
- MCFG_TIMER_DRIVER_ADD_PERIODIC("ar_tb_upd", namcos22_state, adillor_trackball_update, attotime::from_msec(20))
+ TIMER(config, "ar_tb_upd").configure_periodic(FUNC(namcos22_state::adillor_trackball_update), attotime::from_msec(20));
MCFG_MACHINE_START_OVERRIDE(namcos22_state,adillor)
-MACHINE_CONFIG_END
+}
diff --git a/src/mame/drivers/nanos.cpp b/src/mame/drivers/nanos.cpp
index a2198847cad..4e982e40032 100644
--- a/src/mame/drivers/nanos.cpp
+++ b/src/mame/drivers/nanos.cpp
@@ -466,7 +466,8 @@ static GFXDECODE_START( gfx_nanos )
GFXDECODE_ENTRY( "chargen", 0x0000, nanos_charlayout, 0, 1 )
GFXDECODE_END
-MACHINE_CONFIG_START(nanos_state::nanos)
+void nanos_state::nanos(machine_config &config)
+{
/* basic machine hardware */
Z80(config, m_maincpu, XTAL(4'000'000));
m_maincpu->set_addrmap(AS_PROGRAM, &nanos_state::mem_map);
@@ -474,15 +475,15 @@ MACHINE_CONFIG_START(nanos_state::nanos)
m_maincpu->set_daisy_config(nanos_daisy_chain);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(50)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */
- MCFG_SCREEN_UPDATE_DRIVER(nanos_state, screen_update)
- MCFG_SCREEN_SIZE(80*8, 25*10)
- MCFG_SCREEN_VISIBLE_AREA(0,80*8-1,0,25*10-1)
- MCFG_SCREEN_PALETTE("palette")
-
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_nanos)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(50);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */
+ screen.set_screen_update(FUNC(nanos_state::screen_update));
+ screen.set_size(80*8, 25*10);
+ screen.set_visarea(0,80*8-1,0,25*10-1);
+ screen.set_palette("palette");
+
+ GFXDECODE(config, "gfxdecode", "palette", gfx_nanos);
PALETTE(config, "palette", palette_device::MONOCHROME);
/* devices */
@@ -517,13 +518,13 @@ MACHINE_CONFIG_START(nanos_state::nanos)
/* UPD765 */
UPD765A(config, m_fdc, 8'000'000, false, true);
- MCFG_FLOPPY_DRIVE_ADD(m_floppy, nanos_floppies, "525hd", nanos_state::floppy_formats)
+ FLOPPY_CONNECTOR(config, m_floppy, nanos_floppies, "525hd", nanos_state::floppy_formats);
/* internal ram */
RAM(config, RAM_TAG).set_default_size("64K");
- MCFG_TIMER_DRIVER_ADD_PERIODIC("keyboard_timer", nanos_state, keyboard_callback, attotime::from_hz(24000))
-MACHINE_CONFIG_END
+ TIMER(config, "keyboard_timer").configure_periodic(FUNC(nanos_state::keyboard_callback), attotime::from_hz(24000));
+}
/* ROM definition */
ROM_START( nanos )
diff --git a/src/mame/drivers/naomi.cpp b/src/mame/drivers/naomi.cpp
index 62ac2911252..e159a5eeddd 100644
--- a/src/mame/drivers/naomi.cpp
+++ b/src/mame/drivers/naomi.cpp
@@ -321,25 +321,29 @@ Games known to use this PCB include....
Sticker EPROM FLASHROMs X76F100 EPM7064S 315-5881
Game on cart IC22# # of SOP56 IC37# IC41# IC42# Notes
----------------------------------------------------------------------------------------------------------------------------------
-Club Kart: European Session (2003, prototype) no cart * 21 (64Mb) present 315-6206 not present * instead of EPROM have tiny PCB with 2 flashroms on it
+Club Kart: European Session (2003, prototype) no cart * 21 (64Mb)** present 315-6206 not present * flash-PCB ** game data ROMs is not dumped
Crackin' DJ part 2 840-0068C 23674 20 (64Mb) present 315-6206 317-0311-COM PCB have label 840-0068B-01 837-14124, requires regular 837-13551 and 837-13938 rotary JVS boards, and turntable simulation
Crazy Taxi 840-0002C ? 13 (64Mb) ? 315-6206 ? not dumped, likely same as regular 171-7919A cart
Ferrari F355 Challenge (twin/deluxe, preview) no cart 22848P* 21 (64Mb) present 315-6206 317-0267-COM * other ROM board we've seen had 2x flashroms PCB instead of IC22 EEPROM, contents is the same.
/Ferrari F355 Challenge 2 - International
\Course Edition (twin/deluxe, prototype) no cart 23399 21 (64Mb) present 315-6206 317-0287-COM content is the same as regular 171-7919A cart
-Mushiking (MUSHIUSA '04 1ST, Prototype) no sticker none 11*(64Mb) present 315-6206 not present * only first 7 flash roms contain game data, PCB have label 840-0150B-FLS.
Inu No Osanpo / Dog Walking (Rev A) 840-0073C 22294A 16 (64Mb) present 315-6206 317-0316-JPN requires 837-13844 JVS IO with DIPSW 1 ON
-Samba de Amigo (prototype) no cart * 21*(64Mb) present 315-6206 317-0270-COM * only first 14 flash roms contain game data, instead of EPROM have tiny PCB with 2 flashroms on it
-Shootout Pool Prize Ver.B -P 840-0136C ** 21*(64Mb) present 317-6206 not present * only first 4 flash roms contain game data, ** instead of EPROM have tiny PCB with 2 flashroms on it
+/Mushiking The King Of Beetle
+\(MUSHIUSA '04 1ST, Prototype) not present none 11*(64Mb) present 315-6206 not present * only first 7 flash roms contain game data, PCB have label 840-0150B-FLS.
+Samba de Amigo (prototype) no cart ** 21*(64Mb) present 315-6206 317-0270-COM * only first 14 flash roms contain game data, ** instead of EPROM have tiny PCB with 2 flashroms on it
+/Shootout Pool Prize (Export) / Shootout
+\Pool The Medal (Japan) Version B (prototype) 840-0136C ** 21*(64Mb) present 317-6206 not present * only first 4 flash roms contain game data, ** instead of EPROM have tiny PCB with 2 flashroms on it
Soul Surfer (Rev A) 840-0095C 23838C 21 (64Mb) present 315-6206 not present
Star Horse (live and backup) 840-0055B 23626 17 (64Mb) present 315-6206 not present requires 837-13785 ARCNET&IO BD
-Horse Data 840-0034B - 2 (64Mb) present 315-6206 not present not contain game data, used in stack with 840-0121(sound&backup) ROM board as game backup data storage, have JP3 and JP4 in position 2-3
+Star Horse Progress (backup data) 840-0034B - 2 (64Mb) present 315-6206 not present not contain game data, used in stack with 840-0121(sound&backup) ROM board as game backup data storage, have JP3 and JP4 in position 2-3
The House of the Dead 2 (prototype) no cart A1E2 21 (64Mb) present 315-6206 present no label on IC42
-The King of Route 66 (Rev A) 840-0087C 23819A 20 (64Mb) present 315-6206 not present content is the same as regular 171-8132A cart
+The King of Route 66 (prototype) no cart 23819* 21 (64Mb) present 315-6206 not present * flash-PCB with printed label "EPR-23819 IC22 0109 CHK" handwritten "1/11" - it is assumed that only 20 flash roms are used
+The King of Route 66 (Rev A) 840-0087C 23819A 20 (64Mb) present 315-6206 not present content is the same as regular 171-8132B cart
The Maze of the Kings (prototype) no cart * 21 (64Mb) present 315-6206 FRI * flash-PCB, not dumped but known to exist
Tokyo Bus Guide (Rev A) 840-0045C 23468A 18 (64Mb) present 315-6206 317-0290-COM requires 837-13844 JVS IO
-Virtua Athletics (prototype) no cart none 21*(64Mb) present 315-6206 present * only first 14 flash roms contain game data, have Japan text label "Overseas sales (NA & EU)"
+Virtua Athletics / Virtua Athlete (prototype) no cart none 21*(64Mb) present 315-6206 present * only first 14 flash roms contain game data, have Japan text label "Overseas sales (NA & EU)"
Virtua NBA (prototype) no cart * 21 (64Mb) present 315-6206 317-0271-COM * instead of EPROM have tiny PCB with 2 flashroms on it
+Virtua NBA (prototype, 15.11) no cart * 21 (64Mb) present 315-6206 317-0271-COM * instead of EPROM have tiny PCB with 2 flashroms on it
Virtua Tennis / Power Smash (prototype) no cart * 21 (64Mb) present 315-6206 317-0263-COM * flash-PCB, title screen have label "SOFT R&D Dept.#3", not dumped but known to exist
Wave Runner GP (USA, Rev A) 840-0064C 23725A 12 (64Mb) present 315-6206 317-0306-COM PCB s/n is 840-0064B-01
@@ -377,7 +381,9 @@ Games known to use this PCB include....
Sticker EPROM mask ROMs X76F100 XC9536 315-5881
Game on cart IC22# # of SOP44 IC37# IC41# IC42# Notes
------------------------------------------------------------------------------------------------------------------------------
-18 Wheeler (deluxe) (Rev A) 840-0023C 22185A 20 (64Mb) present 315-6213 317-0273-COM
+18 Wheeler (deluxe) ? 22185 20 (64Mb) ? ? ?
+18 Wheeler (deluxe, Rev A) 840-0023C 22185A 20 (64Mb) present 315-6213 317-0273-COM
+18 Wheeler (deluxe, Rev T) ? 22185T 20 (64Mb) ? ? ?
18 Wheeler (standard) 840-0036C 23298 20 (64Mb) present 315-6213 317-0273-COM
18 Wheeler (upright) 840-0037C 23299 20 (64Mb) present 315-6213 317-0273-COM
Airline Pilots (World, Rev B) ? 21787B 11 (64Mb) present 315-6213 317-0251-COM 2 known BIOS 21801 (USA), 21802 (EXP)
@@ -389,16 +395,17 @@ Dead Or Alive 2 (Rev A) 841-0003C 22121A 21 (64Mb)
Dead Or Alive 2 841-0003C-01 22207 21 (64Mb) present 315-6213 317-5048-COM have unlocked Tag and Survival game modes, possible USA or international release
Dead Or Alive 2 Millennium 841-0003C DOA2 Ver.M 21 (64Mb) present 315-6213 317-5048-COM joystick + 3 buttons
Death Crimson OX 841-0016C 23524 10 (64Mb) present 315-6213 317-5066-COM
-Death Crimson OX 841-0016C 23524A 10 (64Mb) present 315-6213 317-5066-COM cart case had no revision label
+Death Crimson OX (Rev A) 841-0016C 23524A 10 (64Mb) present 315-6213 317-5066-COM cart case had no revision label
Dengen Tenshi Taisen Janshi Shangri-La 841-0004C 22060 12 (64Mb) ? 315-6213 317-5050-JPN
-Derby Owners Club (Japan) (Rev B) 840-0016C 22099B 14 (64Mb) ? 315-6213 317-0262-JPN touch panel + 2 buttons + card reader
+Derby Owners Club (Japan, Rev B) 840-0016C 22099B 14 (64Mb) ? 315-6213 317-0262-JPN touch panel + 2 buttons + card reader
Derby Owners Club 2000 (Japan) * 22222 16 (64Mb) present 315-6213 not present * no cart, master unit stickers: 833-13937-01, DOC 4050-01, DOC S. not dumped.
-Derby Owners Club 2000 Ver.2 (Japan) (Rev A) 840-0052C 22284A 16 (64Mb) present 315-6213 not present
-Dynamite Baseball '99 (Japan) (Rev B) 840-0019C 22141B 19 (64Mb) ? 315-6213 317-0269-JPN requires special panel (joystick + 2 buttons + bat controller for each player)
+Derby Owners Club 2000 Ver.2 (Japan, Rev A) 840-0052C 22284A 16 (64Mb) present 315-6213 not present
+Dynamite Baseball '99 (Japan, Rev B) 840-0019C 22141B 19 (64Mb) ? 315-6213 317-0269-JPN requires special panel (joystick + 2 buttons + bat controller for each player)
Dynamite Baseball NAOMI (Japan) 840-0001C 21575 21 (64Mb) ? 315-6213 317-0246-JPN requires special panel (joystick + 2 buttons + bat controller for each player)
Ferrari F355 Challenge (deluxe, no link) 834-13842 21902 21 (64Mb) present 315-6213 317-0254-COM BIOS 21862 (JPN), 21863 (USA), 21864 (EXP)
Ferrari F355 Challenge (twin/deluxe) 834-13950 22848 21 (64Mb) present 315-6213 317-0267-COM BIOS 22849 (JPN), 22850 (USA), 22851 (EXP)
-Ferrari F355 Challenge 2 (twin/deluxe) 840-0042C 23399 21 (64Mb) present 315-6213 317-0287-COM BIOS 22849 (JPN), 22850 (USA), 22851 (EXP)
+/Ferrari F355 Challenge 2 - International
+\Course Edition (twin/deluxe) 840-0042C 23399 21 (64Mb) present 315-6213 317-0287-COM BIOS 22849 (JPN), 22850 (USA), 22851 (EXP)
Giant Gram: All Japan Pro Wrestling 2 840-0007C 21820 9 (64Mb) ? 315-6213 317-0253-JPN joystick + 3 buttons
Guilty Gear X 841-0013C 23356 14 (64Mb) present 315-6213 317-5063-COM
Gun Spike 841-0012C 23210 12 (64Mb) present 315-6213 317-5060-COM \same ROM board
@@ -407,13 +414,15 @@ Heavy Metal Geomatrix (Rev B) HMG016007 23716A 11 (64Mb)
Idol Janshi Suchie-Pai 3 841-0002C 21979 14 (64Mb) ? 315-6213 317-5047-JPN requires mahjong panel
Jambo! Safari (Rev A) 840-0013C 22826A 8 (64Mb) ? 315-6213 317-0264-COM
Mars TV 840-0025C 22993 15 (64Mb) present 315-6213 317-0274-JPN
-Marvel Vs. Capcom 2 (USA) (Rev A) 841-0007C-01 23062A 14 (64Mb) present 315-6213 317-5053-COM
+Marvel Vs. Capcom 2 (USA, Rev A) 841-0007C-01 23062A 14 (64Mb) present 315-6213 317-5053-COM
OutTrigger 840-0017C 22163 19 (64Mb) ? 315-6213 317-0266-COM requires regular 837-13551 and 837-13938 rotary JVS boards, and special panel
Power Stone 841-0001C 21597 8 (64Mb) present 315-6213 317-5046-COM joystick + 3 buttons
Power Stone 2 841-0008C 23127 9 (64Mb) present 315-6213 317-5054-COM joystick + 3 buttons
Puyo Puyo Da! 841-0006C 22206 20 (64Mb) ? 315-6213 317-5052-COM
-Ring Out 4x4 840-0004C 21779 10 (64Mb) present 315-6213 317-0250-COM requires 2 JVS boards
-Samba de Amigo (Rev B) (Rev A) 840-0020C 22966B 16 (64Mb) present 315-6213 317-0270-COM will boot but requires special controller to play it
+Ring Out 4x4 ? 21779 10 (64Mb) ? ? ?
+Ring Out 4x4 (Rev A) 840-0004C 21779A 10 (64Mb) present 315-6213 317-0250-COM requires 2 JVS boards
+Samba de Amigo (Rev A) 840-0020C 22966A 16 (64Mb) present 315-6213 317-0270-COM will boot but requires special controller to play it
+Samba de Amigo (Rev B) 840-0020C 22966B 16 (64Mb) present 315-6213 317-0270-COM will boot but requires special controller to play it
Sega Marine Fishing 840-0027C 22221 10 (64Mb) ? 315-6213 not present ROM 3&4 not present. Requires 837-13844 JVS IO with all DIPSW Off and fishing controller
Sega Strike Fighter (Rev A) 840-0035C 23323A 20 (64Mb) present 315-6213 317-0281-COM have "Rev. A" label on case
Sega Strike Fighter (Rev A, no training mode) 840-0035C 23786A 20 (64Mb) present 315-6213 317-0281-COM have no training mode, "Rev. A" label on PCB, cart case have no revision label
@@ -423,17 +432,20 @@ Spawn In the Demon's Hand (Rev B) 841-0005C 22977B 10 (64Mb)
World Series 99 840-0012C 22059 21 (64Mb) ? 315-6213 317-0259-COM \same ROM board
Super Major League 99 840-0012C-01 22059 21 (64Mb) ? 315-6213 317-0259-COM /
The House of the Dead 2 834-13636 21385 20 (64Mb) not present not present \ ROM board type is 837-13390
-The House of the Dead 2 (USA) 834-13636-01 21585 20 (64Mb) not present not present / uses Lattice ispLSI 2032 80LJ instead of Xilinx
+The House of the Dead 2 (Export) ? 21805 20 (64Mb) ? not present | uses Lattice ispLSI 2032 80LJ instead of Xilinx
+The House of the Dead 2 (USA) 834-13636-01 21585 20 (64Mb) not present not present /
The Typing of the Dead 840-0026C 23021 20 (64Mb) present 315-6213 not present
The Typing of the Dead (Rev A) 840-0026C 23021A 20 (64Mb) present 315-6213 not present
-Touch de UNO! / Unou Nouryoku Check Machine 840-0008C 22073 4 (64Mb) present 315-6213 317-0255-JPN requires 837-13844 JVS IO with DIPSW 5 On, ELO AccuTouch-compatible touch screen controller and special printer.
+Touch de Uno! / Unou Nouryoku Check Machine 840-0008C 22073 4 (64Mb) present 315-6213 317-0255-JPN requires 837-13844 JVS IO with DIPSW 5 On, ELO AccuTouch-compatible touch screen controller and special printer.
Toy Fighter 840-0011C 22035 10 (64Mb) present 315-6212 317-0257-COM joystick + 3 buttons
Virtua NBA 840-0021C 22949 21 (64Mb) present 315-6213 317-0271-COM
Virtua NBA (USA) 840-0021C-01 23073 21 (64Mb) present 315-6213 not present PCB s/n is 840-0021B-01
+Virtua Striker 2 Ver. 2000 840-0010C 21929 14 (64Mb) ? ? ?
Virtua Striker 2 Ver. 2000 (Rev C) 840-0010C 21929C 14 (64Mb)* present 315-6213 317-0258-COM joystick + 3 buttons *(+1x 32Mb)
Virtua Tennis / Power Smash 840-0015C 22927 11 (64Mb) present 315-6213 317-0263-COM
Virtual On Oratorio Tangram M.S.B.S. ver5.66 840-0028C 23198 13 (64Mb) ? 315-6213 317-0279-COM
Zombie Revenge 840-0003C 21707 19 (64Mb) ? 315-6213 317-0249-COM joystick + 3 buttons
+Zombie Revenge (Export) ? 21834 19 (64Mb) ? ? ?
Zombie Revenge (Rev A) 840-0003C 21707A 19 (64Mb) present 315-6213 317-0249-COM joystick + 3 buttons
@@ -475,7 +487,7 @@ Notes:
JP6 - JUMPER Unknown function (1-2)
SW1 - PUSHBUTTON
SW2 - 8X2 DIPswitch
- SCSI-CTRL - SCSI-II controller MB86604A
+ SCSI-CTRL - SCSI-II controller MB86604A (ic45)
CNDB25 - DB-25 SCSI-II connector
IC17S-IC38S - Intel DA28F640J5 FlashROM (SOP56), 64Mb.
IC16 - EPROM (DIP42), not populated.
@@ -527,7 +539,7 @@ Notes:
On the end of the number, -JPN means it requires Japanese BIOS, -COM will run with any BIOS
IC11 - EPROM (DIP42), either 27C160 or 27C322
JP1 - JUMPER Sets the size of the EPROM. 1-2 = 32M, 2-3 = 16M
- IC13S - EEPROM (SOIC8) 25LC040 serial EEPROM
+ IC13S - EEPROM (SOIC8) 25LC040 serial EEPROM (on PCB etched as AT25010)
IC14 - 256 x 9 AsyncFIFO, 5.0V (SOP28)
IC15 - SRAM (SOJ28) 32kx8, IDT71256
IC17S-IC38S - MaskROM (SOP44), either 32Mb or 64Mb. Not all positions are populated
@@ -538,25 +550,27 @@ from NAOMI side it read as X76F100-type, probably simulated by ACTEL FPGA.
Actual data is shuffled, address bits 3 to 6 have reversed order, i.e. 8 7 3 4 5 6 2 1 0.
Games known to use this PCB include....
- Sticker EPROM mask ROMs 25LC040 A54SX32
-Game on cart IC11# # of SOP44 IC13S# IC1# Notes
------------------------------------------------------------------------------------------------------------------------------------------------
-Club Kart: European Session (2003, Rev A) 840-0139C 24173A 18 (64Mb) present 317-0382-COM
-Club Kart Prize (Rev A) 840-0129C 24082A 16 (64Mb) present 317-0368-COM requires Naomi-based hopper controller (Naomi bd + 840-0130 cart + 837-14381 "G2 EXPANSION BD")
-Club Kart Prize Version B 840-0137C 24149 16 (64Mb) present 317-0368-COM requires Naomi-based or 837-14438 hopper controller (selected by P1 BUTTON1 bit)
-Giant Gram 2000 840-0039C 23377 20 (64Mb) present 317-0296-COM
-Kick '4' Cash 840-0140C 24212 16 (64Mb) present 317-0397-COM requires 837-14438 "SH I/O BD" hopper controller
-Marvel Vs. Capcom 2 New Age of Heroes (Export) (Rev A) 841-0007C-02 23085A 14 (64Mb)* present 317-5058-COM *(+2x 32Mb) have factory wire-mod connecting IC13S serial EEPROM CLK pin to IC11 ROM /OE pin
-Marvel Vs. Capcom 2 New Age of Heroes (Korea) (Rev A) 841-0007C-03 23085A 14 (64Mb)* present 317-5058-COM *(+2x 32Mb) have factory wire-mod connecting IC13S serial EEPROM CLK pin to IC11 ROM /OE pin
-MushiKing The King of Beetles 2K3 2ND 840-0150C 24217 6 (64Mb) present 317-0394-COM requires 610-0669 barcode reader, 838-14245-92 "MAPLE/232C CONVERT BD" (MIE-based), 838-14243 "RFID CHIP R/W BD" and RFID chip
-Quiz Ah Megamisama 840-0030C 23227 16 (64Mb) present 317-0280-JPN
-Shootout Pool 840-0098C 23844 4 (64Mb) present 317-0336-COM requires regular 837-13551 and 837-13938 rotary JVS boards
-Shootout Pool Prize / Shootout Pool The Medal (Rev A) 840-0128C 24065A 4 (64Mb) present 317-0367-COM requires Naomi-based hopper controller
-Shootout Pool Prize Ver. B / Shootout Pool The Medal Ver. B 840-0136C 24148 4 (64Mb) present 317-0367-COM requires Naomi-based or 837-14438 hopper controller (selected by P1 BUTTON1 bit)
-SWP Hopper Board 840-0130C 24083 20 (64Mb) present 317-0339-COM reused VF4 Evo ROM board with all maskroms still in place; there is an additional 837-14381 IO board
-Touch de UNO! 2 840-0022C 23071 6 (64Mb) present 317-0276-JPN requires 837-13844 JVS IO with DIPSW 5 On, ELO AccuTouch-compatible touch screen controller and special printer.
-Virtua Fighter 4 Evolution 840-0106B 23934 20 (64Mb) present 317-0339-COM
-Virtua Tennis 2 / Power Smash 2 (Rev A) 840-0084C 22327A 18 (64Mb) present 317-0320-COM
+ Sticker EPROM mask ROMs 25LC040 A54SX32
+Game on cart IC11# # of SOP44 IC13S# IC1# Notes
+------------------------------------------------------------------------------------------------------------------------------------------
+Club Kart: European Session (2003, Rev A) 840-0139C 24173A 18 (64Mb) present 317-0382-COM
+Club Kart Prize (Export, Japan, Rev A) 840-0129C 24082A 16 (64Mb) present 317-0368-COM requires Naomi-based hopper controller (Naomi bd + 840-0130 cart + 837-14381 "G2 EXPANSION BD")
+Club Kart Prize Version B (Export, Japan) 840-0137C 24149 16 (64Mb) present 317-0368-COM requires Naomi-based or 837-14438 hopper controller (selected by P1 BUTTON1 bit)
+Giant Gram 2000 840-0039C 23377 20 (64Mb) present 317-0296-COM
+Kick '4' Cash 840-0140C 24212 16 (64Mb) present 317-0397-COM requires 837-14438 "SH I/O BD" hopper controller
+Marvel Vs. Capcom 2 New Age of Heroes (Export, Rev A) 841-0007C-02 23085A 14 (64Mb)* present 317-5058-COM *(+2x 32Mb) have factory wire-mod connecting IC13S serial EEPROM CLK pin to IC11 ROM /OE pin
+Marvel Vs. Capcom 2 New Age of Heroes (Korea, Rev A) 841-0007C-03 23085A 14 (64Mb)* present 317-5058-COM *(+2x 32Mb) have factory wire-mod connecting IC13S serial EEPROM CLK pin to IC11 ROM /OE pin
+MushiKing The King of Beetles 2K3 2ND 840-0150C 24217 6 (64Mb) present 317-0394-COM requires 610-0669 barcode reader, 838-14245-92 "MAPLE/232C CONVERT BD" (MIE-based), 838-14243 "RFID CHIP R/W BD" and RFID chip
+Quiz Ah Megamisama 840-0030C 23227 16 (64Mb) present 317-0280-JPN
+Shootout Pool 840-0098C 23844 4 (64Mb) present 317-0336-COM requires regular 837-13551 and 837-13938 rotary JVS boards
+/Shootout Pool Prize (Export) /
+\Shootout Pool The Medal (Japan, Rev A) 840-0128C 24065A 4 (64Mb) present 317-0367-COM requires Naomi-based hopper controller
+/Shootout Pool Prize (Export) /
+\Shootout Pool The Medal (Japan) Version B 840-0136C 24148 4 (64Mb) present 317-0367-COM requires Naomi-based or 837-14438 hopper controller (selected by P1 BUTTON1 bit)
+SWP Hopper Board 840-0130C 24083 20 (64Mb) present 317-0339-COM reused VF4 Evo ROM board with all maskROMs still in place; there is an additional 837-14381 IO board
+Touch de Uno! 2 840-0022C 23071 6 (64Mb) present 317-0276-JPN requires 837-13844 JVS IO with DIPSW 5 On, ELO AccuTouch-compatible touch screen controller and special printer.
+Virtua Fighter 4 Evolution (World) 840-0106B 23934 20 (64Mb) present 317-0339-COM
+Virtua Tennis 2 / Power Smash 2 (Rev A) 840-0084C 22327A 18 (64Mb) present 317-0320-COM
PFSB 128M Mask ROM board
@@ -600,10 +614,11 @@ Capcom Vs. SNK Millennium Fight 2000 841-0011C 23511 7 (128Mb) 3
Capcom Vs. SNK Millennium Fight 2000 (Rev A) 841-0011C 23511A 7 (128Mb) 315-6219 315-6213 317-5059-COM ? Date on screen: 000804
Capcom Vs. SNK Millennium Fight 2000 (Rev C) 841-0011C 23511C 7 (128Mb) 315-6319 315-6213 317-5059-COM ? Date on screen: 000904
Club Kart: European Session 840-0062C 23704 11 (128Mb) 315-6319A 315-6213 317-0313-COM present
-Club Kart: European Session (Rev C) 840-0062C * 11 (128Mb) 315-6319A 315-6213 317-0313-COM present * EPR have handwritten Japanese label possibly readable as 'teteto 74 lcl'
+Club Kart: European Session (Rev A) 840-0062C * 11 (128Mb) 315-6319A 315-6213 317-0313-COM present * EPR have handwritten Japanese label possibly readable as 'teteto 74 lcl'
+Club Kart: European Session (Rev C) ? 23704C 11 (128Mb) ? ? ? ?
Club Kart: European Session (Rev D) 840-0062C 23704D 11 (128Mb) 315-6319A 315-6213 317-0313-COM present
Crackin' DJ 840-0043C 23450 10 (128Mb) 315-6319 315-6213 317-0288-COM ? requires regular 837-13551 and 837-13938 rotary JVS boards, and turntable simulation
-Derby Owners Club II Ver.2.1 (Japan) (Rev B) 840-0083C 22306B 11 (128Mb) 315-6319A 315-6213 317-0327-JPN present
+Derby Owners Club II Ver.2.1 (Japan, Rev B) 840-0083C 22306B 11 (128Mb) 315-6319A 315-6213 317-0327-JPN present
Derby Owners Club World Edition (Rev B) 840-0088C 22336B 7 (128Mb) 315-6319A 315-6213 not present present
Derby Owners Club World Edition (Rev C) 840-0088C 22336C 7 (128Mb) 315-6319A 315-6213 not present not present
Derby Owners Club World Edition EX (Rev D) 840-0088C 22336D 7 (128Mb) 315-6319A 315-6213 not present not present 2 MaskROM are different from Rev C
@@ -612,19 +627,19 @@ Mobile Suit Gundam: Federation Vs. Zeon 841-0017C 23638 10 (128Mb) 3
Moero! Justice Gakuen / Project Justice (Rev A) 841-0015C 23548A 11 (128Mb) 315-6319A 315-6213 317-5065-COM present
MushiKing The King Of Beetles 2004 Second (Jpn) 840-0152C 24241 5 (128Mb) 315-6319A 315-6213 not present not present requires 610-0669 barcode reader
MushiKing The King Of Beetles 2005 First (Jpn) 840-0158C 24286 7 (128Mb) 315-6319A 315-6213 not present not present requires 610-0669 barcode reader
-Oinori-daimyoujin Matsuri 840-0126B 24053 5 (128Mb) 315-6319A 315-6213 not present not present requires 837-14274 "G2 EXPANSION BD" (similar to hopper 837-14381 but with ARC NET chip)
+Oinori-daimyoujin Matsuri 840-0126B 24053 5 (128Mb) 315-6319A 315-6213 not present not present no cart, requires 837-14274 "G2 EXPANSION BD" (similar to hopper 837-14381 but with ARC NET chip)
Samba de Amigo Ver. 2000 840-0047C 23600 11 (128Mb) 315-6319A 315-6213 317-0295-COM ?
Star Horse (main screens) 840-0054C 23625 4 (128Mb) 315-6319 315-6213 not present present requires 837-13785 ARCNET&IO BD
Star Horse (satellite) 840-0056C 23627 6 (128Mb)* 315-6319 315-6213 not present present * +1 (64Mb), requires 837-13785 ARCNET&IO BD
-Star Horse 2001 (satellite) (Rev B) 840-0078B 23739B 7 (128Mb) 315-6319 315-6213 not present present requires 837-13785 ARCNET&IO BD
+Star Horse 2001 (satellite, Rev B) 840-0078B 23739B 7 (128Mb) 315-6319A 315-6213 not present present requires 837-13785 ARCNET&IO BD
Star Horse Progress (main screen, Rev B) 840-0120B 24087B 6 (128Mb) 315-6319A 315-6213 not present not present requires 837-13785 ARCNET&IO BD
Star Horse Progress (sound & backup, Rev A) 840-0121B 24097A 6 (128Mb) 315-6319A 315-6213 not present not present requires 837-13785 ARCNET&IO BD
Star Horse Progress (live, Rev A) 840-0122B 24107A 11 (128Mb) 315-6319A 315-6213 not present not present requires 837-13785 ARCNET&IO BD
Star Horse Progress (satellite, Rev A) 840-0123B 24122A 7 (128Mb) 315-6319A 315-6213 not present not present requires 837-13785 ARCNET&IO BD
The King of Route 66 (Rev A) 840-0087C 23819A 10 (128Mb) 315-6319A 315-6213 not present present
-Virtua Fighter 4 840-0080C 23785 11 (128Mb) ? ? 317-0324-COM ?
-Virtua Striker 3 840-0061C 23663 11 (128Mb) 315-6319A 315-6213 317-0310-COM ?
-Virtua Striker 3 (Rev B) 840-0061C 23663B 11 (128Mb) 315-6319A 315-6213 317-0310-COM present
+Virtua Fighter 4 (World) 840-0080C 23785 11 (128Mb) ? ? 317-0324-COM ?
+Virtua Striker 3 (World) 840-0061C 23663 11 (128Mb) 315-6319A 315-6213 317-0310-COM present
+Virtua Striker 3 (World, Rev B) 840-0061C 23663B 11 (128Mb) 315-6319A 315-6213 317-0310-COM present
Wave Runner GP 840-0064C 24059 6 (128Mb) 315-6319A 315-6213 not present present
Wild Riders 840-0046C 23622 10 (128Mb) 315-6319A 315-6213 317-0301-COM ?
WWF Royal Rumble 840-0040C 22261 8 (128Mb) 315-6319 315-6213 317-0285-COM ?
@@ -665,20 +680,23 @@ Notes:
CN4 - 6 legs connector for ISP programming
Games known to use this PCB include....
- Sticker EPROM FLASHROMs XC3S50 PIC16C621A XCF01S
-Game on cart IC7# # of SOP56 IC2# IC3# IC4# Notes
+ Sticker EPROM FLASHROMs XC3S50 PIC16C621A XCF01S
+Game on cart IC7# # of SOP56 IC2# IC3# IC4# Notes
-------------------------------------------------------------------------------------------------------------------------------------------
Akatsuki Blitzkampf Ausf. Achse 841-0058C not present 4 (512Mb) present 317-5130-JPN present IC2# is labeled "VER.2" - IC4# is marked "5A" - IC#10 & IC#11 are empty
-Dynamite Deka EX / Asian Dynamite 840-0175C not present 4 (512Mb) present 317-0495-COM present IC2# is labeled "VER.2"
-Dynamite Deka EX / Asian Dynamite (older) 840-0175C not present 4 (512Mb) present 317-0495-COM present 2x PCBs dumped, 840-0175B and 840-0168B, contents is the same.
+Asian Dynamite / Dynamite Deka EX 840-0175C not present 4 (512Mb) present 317-0495-COM present IC2# is labeled "VER.2"
+Asian Dynamite / Dynamite Deka EX (older) 840-0175C not present 4 (512Mb) present 317-0495-COM present 2x PCBs dumped, 840-0175B and 840-0168B, contents is the same.
Illvelo (Illmatic Envelope) 841-0059C not present 4 (512Mb) present 317-5131-JPN present IC2# is labeled "VER.2" - IC#11 is empty
Mamoru-kun wa Norowarete Shimatta 841-0060C not present 4 (512Mb) present 317-5132-JPN present IC2# is labeled "VER.2"
Manic Panic Ghost! (USA) 840-0170C-01 not present 5 (512Mb) present 317-0461-COM present requires 837-14672 sensor board (SH4 based) - PCB s/n is 840-0170B-01
-Melty Blood Actress Again 841-0061C not present 6 (512Mb) present 317-5133-JPN present IC2# is labeled "REV.A" - IC4# is marked "5A"
+Melty Blood Actress Again (Japan) 841-0061C not present 6 (512Mb) present 317-5133-JPN present IC2# is labeled "REV.A" - IC4# is marked "5A"
Melty Blood Actress Again Version A (Rev A) 841-0061C 24455 6 (512Mb) present 317-5133-JPN present IC2# is labeled "REV.A" - IC4# is marked "5A"
-Mushiking - The King Of Beetles II ENG (Ver. 1.001) 840-0164C not present 2 (512Mb) present 317-0437-COM present requires 610-0669 barcode reader, 838-14245-92 "MAPLE/232C CONVERT BD" (MIE-based), 838-14243 "RFID CHIP R/W BD" and RFID chip
-Mushiking - The King Of Beetles II ENG (Ver. 2.001) 840-0164C 24357 2 (512Mb) present 317-0437-COM present IC4# is marked "18"
-Mushiking - The King Of Beetles IV ENG 840-0180C not present 2 (512Mb) present 317-0437-COM present IC2# is labeled "VER.1", IC4# is marked "8A", requires 610-0669 barcode reader, 838-14245-92 "MAPLE/232C CONVERT BD" (MIE-based), 838-14243 "RFID CHIP R/W BD" and RFID chip
+/Mushiking The King Of Beetles
+\Mushiking II / III / III+ (Ver. 1.001) (World) 840-0164C not present 2 (512Mb) present 317-0437-COM present requires 610-0669 barcode reader, 838-14245-92 "MAPLE/232C CONVERT BD" (MIE-based), 838-14243 "RFID CHIP R/W BD" and RFID chip
+/Mushiking The King Of Beetles
+\Mushiking II / III / III+ (Ver. 2.001) (World) 840-0164C 24357 2 (512Mb) present 317-0437-COM present IC4# is marked "18"
+/Mushiking The King Of Beetles
+\Mushiking IV / V / VI (World) 840-0180C not present 2 (512Mb) present 317-0437-COM present IC2# is labeled "VER.1", IC4# is marked "8A", requires 610-0669 barcode reader, 838-14245-92 "MAPLE/232C CONVERT BD" (MIE-based), 838-14243 "RFID CHIP R/W BD" and RFID chip
Pokasuka Ghost! 840-0170C not present 5 (512Mb) present 317-0461-COM present requires 837-14672 sensor board (SH4 based)
Radirgy Noa 841-0062C not present 4 (512Mb) present 317-5138-JPN present IC2# is labeled "VER.2" - IC4# is marked "8A"
Rhythm Tengoku 841-0177C not present 4 (512Mb) present 317-0503-JPN present IC2# is labeled "VER.2" - IC4# is marked "8A"
@@ -728,22 +746,23 @@ Notes:
CN1/2/3 - connectors joining to main board
Games known to use this PCB include....
- Cart Sticker FL0-FL3 FLASHROMs X76F100 EPM7064 EPM7064 315-5881 Known Game
- Game Type on cart FLASHROM # of SOP48 IC @ 1F IC @ 1H IC @ 2K IC @ 1M code (1) Notes
--------------------------------------------------------------------------------------------------------------------------------------------------------------
+ Cart Sticker FL0-FL3 FLASHROMs X76F100 EPM7064 EPM7064 315-5881 Known Game
+ Game Type on cart FLASHROM # of SOP48 IC @ 1F IC @ 1H IC @ 2K IC @ 1M code (1) Notes
+--------------------------------------------------------------------------------------------------------------------------------------------------------------
/Gun Survivor 2 Biohazard
-\Code: Veronica (Japan, Ver.E) F1X 25709801 1 (64Mb) 14 (128Mb) not present NAODEC2A NAODEC1B 317-5075-COM BHF1 uses Namco FCA JVS I/O (not dumped), will crash if COMM.BOARD not present
+\Code: Veronica (Japan, BHF1 Ver.E) F1X 25709801 1 (64Mb) 14 (128Mb) not present NAODEC2A NAODEC1B 317-5075-COM BHF1 uses Namco FCA JVS I/O (not dumped), will crash if COMM.BOARD not present
/Gun Survivor 2 Biohazard
-\Code: Veronica (World, Ver.E) F1X 25709801 1 (64Mb) 14 (128Mb) not present NAODEC2A NAODEC1B 317-5075-COM BHF2
-/Shin Nihon Prowrestling Toukon /FL0 & FL1 have pin55 raised from PCB.
-\Retsuden 4 Arcade Edition (Japan, Ver.A) F2X 25349801 2 (64Mb) 15 (128Mb) not present NAODEC2A NAODEC1B 317-5040-COM TRF1 \They are connected together and go to pin89 on 2K.
-World Kicks PCB (Japan, WKC1 Ver.A) F2 25509801 2 (64Mb) 9 (128Mb) not present NAODEC2A NAODEC1B 317-5040-COM WKC1 uses Namco V226 JVS I/O (not dumped)
-World Kicks PCB (World, WKC2 Ver.A) F2 25509801 2 (64Mb) 9 (128Mb) not present NAODEC2A NAODEC1B 317-5040-COM WKC2
-World Kicks (Japan, WK1 Ver.A) F2 25209801 2 (64Mb) 9 (128Mb) not present NAODEC2A NAODEC1A 317-5040-COM WK1
-World Kicks (World, WK2 Ver.A) F2 25209801 2 (64Mb) 9 (128Mb) not present NAODEC2A NAODEC1A 317-5040-COM WK2
-World Kicks (US, WK3 Ver.A) F2 25209801 2 (64Mb) 9 (128Mb) not present NAODEC2A NAODEC1A 317-5040-COM WK3
+\Code: Veronica (World, BHF2 Ver.E) F1X 25709801 1 (64Mb) 14 (128Mb) not present NAODEC2A NAODEC1B 317-5075-COM BHF2
+/Shin Nihon Prowrestling Toukon Retsuden 4 /FL0 & FL1 have pin55 raised from PCB.
+\Arcade Edition (Japan, TRF1 Ver.A) F2X 25349801 2 (64Mb) 15 (128Mb) not present NAODEC2A NAODEC1B 317-5040-COM TRF1 \They are connected together and go to pin89 on 2K.
+World Kicks PCB (Japan, WKC1 Ver.A) F2 25509801 2 (64Mb) 9 (128Mb) not present NAODEC2A NAODEC1B 317-5040-COM WKC1 uses Namco V226 JVS I/O (not dumped)
+World Kicks PCB (World, WKC2 Ver.A) F2 25509801 2 (64Mb) 9 (128Mb) not present NAODEC2A NAODEC1B 317-5040-COM WKC2 uses Namco V226 JVS I/O (not dumped)
+World Kicks (Japan, WK1 Ver.A) F2 25209801 2 (64Mb) 9 (128Mb) not present NAODEC2A NAODEC1A 317-5040-COM WK1
+World Kicks (World, WK2 Ver.A) F2 25209801 2 (64Mb) 9 (128Mb) not present NAODEC2A NAODEC1A 317-5040-COM WK2
+World Kicks (US, WK3 Ver.A) F2 25209801 2 (64Mb) 9 (128Mb) not present NAODEC2A NAODEC1A 317-5040-COM WK3
-(1) note: the number in the game code has the following meaning: 1 = Japan, 2 = Asia, 3 = US, 4 = World.
+(1) note: the number in the game code has the following meaning: 1 = Japan, 2 = World, 3 = US, 4 = Asia.
+ real meaning of 2 and 4 is not clear, it can be like "some other part of World", also possible Europe
MASK C (C) Namco 2000
@@ -784,17 +803,18 @@ Notes:
CN1/2/3 - connectors joining to main board
Games known to use this PCB include....
- Cart Sticker FL0-FL3 FLASHROMs X76F100 CY37128 315-5881 Known Game
- Game Type on cart FLASHROM # of SOP48 IC @ 1F IC @ 2J IC @ 1M code (1) Notes
+ Cart Sticker FL0-FL3 FLASHROMs X76F100 CY37128 315-5881 Known Game
+ Game Type on cart FLASHROM # of SOP48 IC @ 1F IC @ 2J IC @ 1M code (1) Notes
----------------------------------------------------------------------------------------------------------------------------------------
-Mazan: Flash of the Blade (World, Ver.A) F1X 25869812 1 (64Mb) 8 (128Mb) present NAODEC3 317-0266-COM MAZ2 uses 2x Namco FCB JVS I/O (not dumped)
-Mazan: Flash of the Blade (US, Ver.A) F1X 25869812 1 (64Mb) 8 (128Mb) present NAODEC3 317-0266-COM MAZ3
-Ninja Assault (Japan, Ver.A) F3 25469801 3 (64Mb) 9 (128Mb) present NAODEC3 317-5068-COM NJA1 uses Namco JYU JVS I/O
-Ninja Assault (World, Ver.A) F3 25469801 3 (64Mb) 9 (128Mb) present NAODEC3 317-5068-COM NJA2
-Ninja Assault (US, Ver.A) F3 25469801 3 (64Mb) 9 (128Mb) present NAODEC3 317-5068-COM NJA3
-Ninja Assault (Asia, Ver.A) F3 25469801 3 (64Mb) 9 (128Mb) present NAODEC3 317-5068-COM NJA4
+Mazan: Flash of the Blade (World, MAZ2 Ver.A) F1X 25869812 1 (64Mb) 8 (128Mb) present NAODEC3 317-0266-COM MAZ2 uses 2x Namco FCB JVS I/O (not dumped)
+Mazan: Flash of the Blade (US, MAZ3 Ver.A) F1X 25869812 1 (64Mb) 8 (128Mb) present NAODEC3 317-0266-COM MAZ3
+Ninja Assault (Japan, NJA1 Ver.A) F3 25469801 3 (64Mb) 9 (128Mb) present NAODEC3 317-5068-COM NJA1 uses Namco JYU JVS I/O
+Ninja Assault (World, NJA2 Ver.A) F3 25469801 3 (64Mb) 9 (128Mb) present NAODEC3 317-5068-COM NJA2
+Ninja Assault (US, NJA3 Ver.A) F3 25469801 3 (64Mb) 9 (128Mb) present NAODEC3 317-5068-COM NJA3
+Ninja Assault (Asia, NJA4 Ver.A) F3 25469801 3 (64Mb) 9 (128Mb) present NAODEC3 317-5068-COM NJA4
-(1) note: the number in the game code has the following meaning: 1 = Japan, 2 = Asia, 3 = US, 4 = World.
+(1) note: the number in the game code has the following meaning: 1 = Japan, 2 = World, 3 = US, 4 = Asia.
+ real meaning of 2 and 4 is not clear, it can be like "some other part of World", also possible Europe
Note! Generally, games that require a special I/O board or controller will not boot at all with a
standard NAOMI I/O board. Usually they display a message saying the I/O board is not acceptable
@@ -1823,8 +1843,8 @@ void naomi_state::naomi_port(address_map &map)
READ64_MEMBER(atomiswave_state::aw_flash_r)
{
- return (uint64_t)m_awflash->read(space, offset*8) | (uint64_t)m_awflash->read(space, (offset*8)+1)<<8 | (uint64_t)m_awflash->read(space, (offset*8)+2)<<16 | (uint64_t)m_awflash->read(space, (offset*8)+3)<<24 |
- (uint64_t)m_awflash->read(space, (offset*8)+4)<<32 | (uint64_t)m_awflash->read(space, (offset*8)+5)<<40 | (uint64_t)m_awflash->read(space, (offset*8)+6)<<48 | (uint64_t)m_awflash->read(space, (offset*8)+7)<<56;
+ return (uint64_t)m_awflash->read(offset*8) | (uint64_t)m_awflash->read((offset*8)+1)<<8 | (uint64_t)m_awflash->read((offset*8)+2)<<16 | (uint64_t)m_awflash->read((offset*8)+3)<<24 |
+ (uint64_t)m_awflash->read((offset*8)+4)<<32 | (uint64_t)m_awflash->read((offset*8)+5)<<40 | (uint64_t)m_awflash->read((offset*8)+6)<<48 | (uint64_t)m_awflash->read((offset*8)+7)<<56;
}
WRITE64_MEMBER(atomiswave_state::aw_flash_w)
@@ -1843,7 +1863,7 @@ WRITE64_MEMBER(atomiswave_state::aw_flash_w)
data >>= (i*8);
- m_awflash->write(space, addr, data);
+ m_awflash->write(addr, data);
}
// TODO: don't we have a common function for this?
@@ -3095,12 +3115,12 @@ void naomi_state::naomigd_kb(machine_config &config)
* Naomi 2
*/
/*
-MACHINE_CONFIG_START((naomi2_state::naomi2)
+void naomi2_state::naomi2(machine_config &config)
+{
naomi(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(naomi2_map)
- MCFG_DEVICE_IO_MAP(naomi_port)
-MACHINE_CONFIG_END
+ m_maincpu->set_addrmap(AS_PROGRAM, &naomi2_state::naomi2_map);
+ m_maincpu->set_addrmap(AS_IO, &naomi2_state::naomi_port);
+}
*/
/*
* Naomi 2 GD-Rom
@@ -3435,6 +3455,7 @@ OFF OFF ON Australia
Gun board info:
"838-13143-nn IC BD GUN SENSE xxx" board, D78213 MCU based, was used in big number of Model2 / Model3 / NAOMI / Chihiro / Lindbergh games.
known firmwares:
+ EPR-20006A oldest revision?
EPR-21262 - older revision, used in: 04 HOD (House of the Dead), 06 JPT (Jurassic Park The Lost World).
TG12 - newer revision, used in: 08 SPY, 09 SPY UR, 11 SPY UR EXTRA - Confidential Mission and later games, backward compatible with older games as well.
*/
@@ -3451,6 +3472,7 @@ OFF OFF ON Australia
ROM_SYSTEM_BIOS( 3, "bios3", "HOTD2 (Proto)" ) \
ROM_LOAD16_WORD_SWAP_BIOS( 3, "hotd2biosproto.ic27", 0x000000, 0x200000, CRC(ea74e967) SHA1(e4d037480eb6555d335a8ab9cd6c56122335586d) ) \
ROM_REGION( 0x10000, "gunboard", 0 ) \
+ ROM_LOAD( "epr-20006a.ic2",0x00000, 0x10000, CRC(45f310dc) SHA1(b7cf40a1671dc351b607d8d6bba0d51ea128eb75) ) \
ROM_LOAD( "epr-21262.ic2", 0x00000, 0x10000, CRC(c9adf9b6) SHA1(fc2a331430ef2f009f653b242220599c824cd1d2) ) \
ROM_LOAD( "tg12.ic2", 0x00000, 0x10000, CRC(2c9600b1) SHA1(91813a43851c48d400fde41b1198dabf55bade2d) )
@@ -5483,7 +5505,7 @@ ROM_START( 18wheelro )
ROM_PARAMETER( ":rom_board:segam2crypt:key", "2807cf54" )
ROM_END
-/* 18 Wheeler (deluxe) (Rev A) */
+/* 18 Wheeler (deluxe, Rev A) */
ROM_START( 18wheelr )
NAOMI_BIOS
NAOMI_DEFAULT_EEPROM
@@ -5527,7 +5549,7 @@ ROM_START( 18wheelr )
ROM_PARAMETER( ":rom_board:segam2crypt:key", "2807cf54" )
ROM_END
-/* 18 Wheeler (deluxe) (Rev T) */
+/* 18 Wheeler (deluxe, Rev T) */
ROM_START( 18wheelrt )
NAOMI_BIOS
NAOMI_DEFAULT_EEPROM
@@ -6081,6 +6103,9 @@ ROM_START( qmegamis )
ROM_COPY( "rom_board", 0x1000000, 0x400000, 0xc00000 )
+ /* ROM_REGION(0x200, "some_eeprom", 0)
+ ROM_LOAD( "25lc040.ic13s", 0x000, 0x200, NO_DUMP ) */
+
// 840-0030 2000 317-0280-JPN Naomi
ROM_PARAMETER( ":rom_board:key", "cd9b4896" )
ROM_END
@@ -6141,6 +6166,33 @@ ROM_START( samba )
ROM_PARAMETER( ":rom_board:segam2crypt:key", "280a8b5d" )
ROM_END
+ROM_START( sambaa )
+ NAOMI_BIOS
+ NAOMI_DEFAULT_EEPROM
+
+ ROM_REGION( 0x8800000, "rom_board", ROMREGION_ERASEFF)
+ ROM_LOAD("epr-22966a.ic22",0x0000000, 0x0400000, CRC(ad99ba06) SHA1(91a984853ac7a66316ae71fad7b5645c77962df3) )
+ ROM_LOAD("mpr-22950.ic1", 0x0800000, 0x0800000, CRC(16dee15c) SHA1(b46849e492756ff406bf8956303472255fcf55a5) )
+ ROM_LOAD("mpr-22951.ic2", 0x1000000, 0x0800000, CRC(f509496f) SHA1(41281576f7d58c8ede9c0a89bfd46a98d5b97033) )
+ ROM_LOAD("mpr-22952.ic3", 0x1800000, 0x0800000, CRC(fb9b3ef0) SHA1(e9d44b673c273e97445a12186496a0594e291542) )
+ ROM_LOAD("mpr-22953.ic4", 0x2000000, 0x0800000, CRC(07207ce0) SHA1(b802bb4e78f3737a4e333f819b9a4e0249037288) )
+ ROM_LOAD("mpr-22954.ic5", 0x2800000, 0x0800000, CRC(c8e797d1) SHA1(fadbd1e24882787634229003245293ce79ba2617) )
+ ROM_LOAD("mpr-22955.ic6", 0x3000000, 0x0800000, CRC(064ef007) SHA1(8325f9aa537ce329e71dce2b588a3d4fc176c37b) )
+ ROM_LOAD("mpr-22956.ic7", 0x3800000, 0x0800000, CRC(fe8f2964) SHA1(3a33162f797cd93b7dbb313b531215e340719110) )
+ ROM_LOAD("mpr-22957.ic8", 0x4000000, 0x0800000, CRC(74842c01) SHA1(b02884925270edb66831ab502a0aa2f9430adc9f) )
+ ROM_LOAD("mpr-22958.ic9", 0x4800000, 0x0800000, CRC(b1ead447) SHA1(06b848eb7f592763768050a1ae82b4cac9499684) )
+ ROM_LOAD("mpr-22959.ic10", 0x5000000, 0x0800000, CRC(d32d7983) SHA1(86a9e5eae4598b6998f0ea578d6152e66c1a0df1) )
+ ROM_LOAD("mpr-22960.ic11", 0x5800000, 0x0800000, CRC(6c3b228e) SHA1(782c0fda106222be75b1973586c8bf78fd2186e7) )
+ ROM_LOAD("mpr-22961.ic12s",0x6000000, 0x0800000, CRC(d6d26a8d) SHA1(7d416f8ac9fbbeb9bfe217ccc8eccf1644511110) )
+ ROM_LOAD("mpr-22962.ic13s",0x6800000, 0x0800000, CRC(c2f41101) SHA1(0bf87cbffb7d6a5ab32543cef56c9759f475419a) )
+ ROM_LOAD("mpr-22963.ic14s",0x7000000, 0x0800000, CRC(a53e9919) SHA1(d81eb79bc706f85ebfbc56a9b2889ae62d629e8e) )
+ ROM_LOAD("mpr-22964.ic15s",0x7800000, 0x0800000, CRC(f581d5a3) SHA1(8cf769f5b0a48951246bb60e9cf58232bcee7bc8) )
+ ROM_LOAD("mpr-22965.ic16s",0x8000000, 0x0800000, CRC(8f7bfa8a) SHA1(19f137b1552978d232785c4408805b71835585c6) )
+
+ // 840-0020 1999 317-0270-COM Naomi
+ ROM_PARAMETER( ":rom_board:segam2crypt:key", "280a8b5d" )
+ROM_END
+
// prototype - boots on USA BIOS only, have fewer regular songs, but have several sound tracks from Sega games instead (Afterburner, Outrun, Sonic, etc)
ROM_START( sambap )
NAOMI_BIOS
@@ -6215,6 +6267,9 @@ ROM_START( shootopl )
ROM_COPY( "rom_board", 0x1000000, 0x400000, 0xc00000 )
+ /* ROM_REGION(0x200, "some_eeprom", 0)
+ ROM_LOAD( "25lc040.ic13s", 0x000, 0x200, NO_DUMP ) */
+
// 840-0098 2002 317-0336-COM Naomi
ROM_PARAMETER( ":rom_board:key", "a0f37ca7" )
ROM_END
@@ -6254,6 +6309,9 @@ ROM_START( shootplm )
ROM_COPY( "rom_board", 0x1000000, 0x400000, 0xc00000 )
+ /* ROM_REGION(0x200, "some_eeprom", 0)
+ ROM_LOAD( "25lc040.ic13s", 0x000, 0x200, NO_DUMP ) */
+
// 840-0136 2002 317-0367-COM Naomi
ROM_PARAMETER( ":rom_board:key", "9dbde9cd" )
ROM_END
@@ -6541,6 +6599,39 @@ ROM_START( virnbap )
ROM_PARAMETER( ":rom_board:segam2crypt:key", "28068b58" )
ROM_END
+// IC22 ROM header contains IC1-21 sums which match regular mask ROM data, however actual 1-21 ROMs contain quite different data, probably from earlier version.
+ROM_START( virnbapa )
+ NAOMI_BIOS
+ NAOMI_DEFAULT_EEPROM
+
+ ROM_REGION( 0xb000000, "rom_board", ROMREGION_ERASEFF)
+ ROM_LOAD("11-15.ic22", 0x0000000, 0x0400000, CRC(b389295a) SHA1(9c96cd85373fa69c99085c1f1591e7df02861bac) )
+ ROM_LOAD("rom1.ic1s", 0x0800000, 0x0800000, CRC(f77b588d) SHA1(6f1cdd48e1d1f60bb95253ed204346d8fdc06265) )
+ ROM_LOAD("rom2.ic2s", 0x1000000, 0x0800000, CRC(90851aa4) SHA1(6f60956e70a315c619d07d7635f9136f0e4f6563) )
+ ROM_LOAD("rom3.ic3s", 0x1800000, 0x0800000, CRC(1fc5cd0d) SHA1(0249fc398e93ed4871c53aec585e49ac42924b9a) )
+ ROM_LOAD("rom4.ic4s", 0x2000000, 0x0800000, CRC(bb0922b1) SHA1(77597298e8a0ec9b33b4b776f0bebe41b9d07029) )
+ ROM_LOAD("rom5.ic5s", 0x2800000, 0x0800000, CRC(ba187afe) SHA1(0a951ba7feae31f439b37c970fe0f7bf3bacdd79) )
+ ROM_LOAD("rom6.ic6s", 0x3000000, 0x0800000, CRC(91c452ab) SHA1(9239cb0d49f8f8cb6cbc2aa57c3037d71a832bee) )
+ ROM_LOAD("rom7.ic7s", 0x3800000, 0x0800000, CRC(11e4c24b) SHA1(ef78e093ed4eae1659513e3fd7d26d313fca4943) )
+ ROM_LOAD("rom8.ic8s", 0x4000000, 0x0800000, CRC(72629663) SHA1(735590adfc837d399d6b2f3763299018215adab6) )
+ ROM_LOAD("rom9.ic9s", 0x4800000, 0x0800000, CRC(54b660e6) SHA1(34c1f46fb8eb92a21b94c9a4e9952cc13413fe99) )
+ ROM_LOAD("rom10.ic10s", 0x5000000, 0x0800000, CRC(8fc00425) SHA1(61da4ad778ce627f7e76d8f583edf6a8822cc98f) )
+ ROM_LOAD("rom11.ic11s", 0x5800000, 0x0800000, CRC(352eacfa) SHA1(9588f3abcdc11afb19facf84e937650faf672432) )
+ ROM_LOAD("rom12.ic12s", 0x6000000, 0x0800000, CRC(4b42b46d) SHA1(7893ed9412e69ba6ee075ff8721c0d7e8558091a) )
+ ROM_LOAD("rom13.ic13s", 0x6800000, 0x0800000, CRC(6edbb058) SHA1(f00047b910033fc198dd3876a7c1fa7402d8d38a) )
+ ROM_LOAD("rom14.ic14s", 0x7000000, 0x0800000, CRC(aa3885d5) SHA1(7280927ff7493fd1810c445b27e7de22528d545f) )
+ ROM_LOAD("rom15.ic15s", 0x7800000, 0x0800000, CRC(293293d8) SHA1(0cbc4df3e958c3c3bae06afcf04f73823b888fec) )
+ ROM_LOAD("rom16.ic16s", 0x8000000, 0x0800000, CRC(83ea7a33) SHA1(8be818d12382c74f85c95bf55f3cacf6c0a5cfaf) )
+ ROM_LOAD("rom17.ic17s", 0x8800000, 0x0800000, CRC(97be8db7) SHA1(ef4cf816c78cc6a9f9fbc80f42d7de1fd0434039) )
+ ROM_LOAD("rom18.ic18s", 0x9000000, 0x0800000, CRC(20c2bc4d) SHA1(b3c94bda80ec821c3bd16f69be11313612f3d484) )
+ ROM_LOAD("rom19.ic19s", 0x9800000, 0x0800000, CRC(195d646f) SHA1(43add13d4a96fb2a23e1c8d8a2b143bdc22a64c7) )
+ ROM_LOAD("rom20.ic20s", 0xa000000, 0x0800000, CRC(df62f303) SHA1(c5ad85d86079efa3dd233e10a68442ca03e532f1) )
+ ROM_LOAD("rom21.ic21s", 0xa800000, 0x0800000, CRC(194594f2) SHA1(aa19dfa37b90bb00362808d1319a29bf55d7d3eb) )
+
+ // 840-0021 2000 317-0271-COM Naomi
+ ROM_PARAMETER( ":rom_board:segam2crypt:key", "28068b58" )
+ROM_END
+
// 1999/07/01 07:48
ROM_START( vs2_2ko )
NAOMI_BIOS
@@ -7443,6 +7534,9 @@ ROM_START( vtenis2c )
ROM_COPY( "rom_board", 0x1000000, 0x400000, 0xc00000 )
+ /* ROM_REGION(0x200, "some_eeprom", 0)
+ ROM_LOAD( "25lc040.ic13s", 0x000, 0x200, NO_DUMP ) */
+
// 840-0084 2001 317-0320-COM Naomi
ROM_PARAMETER( ":rom_board:key", "2d2d4743" )
ROM_END
@@ -9034,7 +9128,7 @@ ROM_START( keyboard )
ROM_END
-ROM_START( lupinsho )
+ROM_START( lupinshoo )
NAOMIGD_BIOS
NAOMI_DEFAULT_EEPROM
@@ -9045,6 +9139,17 @@ ROM_START( lupinsho )
ROM_LOAD("317-0325-jpn.pic", 0x00, 0x4000, CRC(f71cb2fc) SHA1(281b3b3b03edf9a39e380976de528b7c9674de53) )
ROM_END
+ROM_START( lupinsho )
+ NAOMIGD_BIOS
+ NAOMI_DEFAULT_EEPROM
+
+ DISK_REGION( "gdrom" )
+ DISK_IMAGE_READONLY( "gds-0018a", 0, SHA1(c4ed336d4be039bd6673fccd097579f3500d6eca) )
+
+ ROM_REGION( 0x4000, "pic", ROMREGION_ERASEFF)
+ ROM_LOAD("317-0325-jpn.pic", 0x00, 0x4000, CRC(f71cb2fc) SHA1(281b3b3b03edf9a39e380976de528b7c9674de53) )
+ROM_END
+
ROM_START( vathlete )
NAOMIGD_BIOS
NAOMI_DEFAULT_EEPROM
@@ -9293,8 +9398,7 @@ ROM_START( dragntr3 )
ROM_REGION( 0x4000, "pic", ROMREGION_ERASEFF)
//PIC16F628A
- // copy, original labels unknown
- ROM_LOAD("317-xxxx-com.pic", 0x00, 0x4000, CRC(8df4d33a) SHA1(0d27ec46a64af60b1e46ad4b3d34b6df5448f81a) )
+ ROM_LOAD("317-0426-jpn.pic", 0x00, 0x4000, CRC(8df4d33a) SHA1(0d27ec46a64af60b1e46ad4b3d34b6df5448f81a) )
ROM_REGION(0x4000, "satl_pic", ROMREGION_ERASEFF)
//PIC16C621A (317-0390-COM)
@@ -9431,6 +9535,29 @@ ROM_START( kingrt66 )
ROM_PARAMETER( ":rom_board:segam2crypt:key", "-1") // 315-5881 not populated
ROM_END
+// 171-7885A type flash ROM board, handwritten "RTS ATEI 3/6" "RT66", possible preview/demo version for ATEI 2002 show.
+ROM_START( kingrt66p )
+ NAOMI2_BIOS
+ NAOMI_DEFAULT_EEPROM
+
+ ROM_REGION( 0xa800000, "rom_board", ROMREGION_ERASEFF)
+ // flash ROM module, printed label "EPR-23819 IC22 0109 CHK" handwritten "1/11", which probably means build date 11 Jan 2002.
+ ROM_LOAD( "epr-23819-1-11.ic22", 0x0000000, 0x00400000, CRC(a9602240) SHA1(feb2fd5c1d2fe8a58be1440ddad4bdd1d7f2d850) )
+ // IC 1-21 ROMs not dumped, but checksums in IC22 header match data from release version.
+ ROM_LOAD("mpr-23808.ic1", 0x00800000, 0x01000000, CRC(e911bc86) SHA1(0dc658851e20425b2e697e538bb4297a221f6ae8) )
+ ROM_LOAD("mpr-23809.ic2", 0x01800000, 0x01000000, CRC(2716aba0) SHA1(4c245874da244926bf9ac6636af4fa67e07a21e8) )
+ ROM_LOAD("mpr-23810.ic3", 0x02800000, 0x01000000, CRC(2226accb) SHA1(c4dc71e87c2ccd866f4180129181b7ced8caf22c) )
+ ROM_LOAD("mpr-23811.ic4", 0x03800000, 0x01000000, CRC(bbad4a93) SHA1(724c3376102b2dc79b852af1e90748b2e0023b82) )
+ ROM_LOAD("mpr-23812.ic5", 0x04800000, 0x01000000, CRC(7beabe22) SHA1(d3cd926fc768d480ff45f1e30024bb0e31bd7d2c) )
+ ROM_LOAD("mpr-23813.ic6", 0x05800000, 0x01000000, CRC(fe0b94ea) SHA1(0e46dff932036bec49c78a612bcfd27e07b516e8) )
+ ROM_LOAD("mpr-23814.ic7", 0x06800000, 0x01000000, CRC(0cdf7325) SHA1(41668f873b7842dac1bc85aa2b6bd6512edc9b64) )
+ ROM_LOAD("mpr-23815.ic8", 0x07800000, 0x01000000, CRC(ef327ab8) SHA1(9dfc564084a75b9c3935374347f1709d2e86e469) )
+ ROM_LOAD("mpr-23816.ic9", 0x08800000, 0x01000000, CRC(bbaf0765) SHA1(3b79a4eff504b2156bea8b86c6cdd8e41e7bf268) )
+ ROM_LOAD("mpr-23817.ic10", 0x09800000, 0x01000000, CRC(e179cfb6) SHA1(1120036238439f8ac1041150396e4b60e4a243bc) )
+
+ ROM_PARAMETER( ":rom_board:segam2crypt:key", "-1") // 315-5881 not populated
+ROM_END
+
ROM_START( soulsurf )
NAOMI2_BIOS
NAOMI_DEFAULT_EEPROM
@@ -9492,6 +9619,9 @@ ROM_START( vf4evoct )
ROM_COPY( "rom_board", 0x1000000, 0x400000, 0xc00000 )
+ /* ROM_REGION(0x200, "some_eeprom", 0)
+ ROM_LOAD( "25lc040.ic13s", 0x000, 0x200, NO_DUMP ) */
+
// 840-0106 2002 317-0339-COM Naomi 2
ROM_PARAMETER( ":rom_board:key", "1e5bb0cd" )
ROM_END
@@ -9696,17 +9826,21 @@ ROM_START( clubk2k3 )
ROM_COPY( "rom_board", 0x1000000, 0x400000, 0xc00000 )
+/* ROM_REGION(0x200, "some_eeprom", 0)
+ ROM_LOAD( "25lc040.ic13s", 0x000, 0x200, NO_DUMP ) */
+
// 840-0139 2003 317-0382-COM Naomi 2
ROM_PARAMETER( ":rom_board:key", "d8b0fa4c" )
ROM_END
-// uses the same mask roms data as clubk2k3, but not in 32bit dissected form, EPR doesn't have checksumms for them, so rom test shows all roms as BAD
+// 171-7885A type flash ROM board
ROM_START( clubk2kp )
NAOMI2_BIOS
NAOMI_DEFAULT_EEPROM
ROM_REGION( 0xa000000, "rom_board", ROMREGION_ERASEFF)
- ROM_LOAD( "ic22.bin", 0x0000000, 0x400000, CRC(1e601d98) SHA1(70d244c1b7cde236d833585b8d2064ba6d727825) )
+ ROM_LOAD( "ic22.bin", 0x0000000, 0x400000, CRC(334fc561) SHA1(e8c8707b0d13216ec7071da05823e330deb810d4) ) // flash ROM module
+ // game data ROMs not dumped, not the same as regular revision. technically, all below should be marked as NO_DUMP.
ROM_LOAD32_WORD( "opr-24151.ic17s", 0x1000000, 0x800000, CRC(91594439) SHA1(a195bfe0c70a0c7048b547af0a92c98d126230c6) )
ROM_LOAD32_WORD( "opr-24152.ic18", 0x1000002, 0x800000, CRC(fd131f88) SHA1(bc27b3ab5b41a3fe33b541b7cca28d6baed157b3) )
ROM_LOAD32_WORD( "opr-24153.ic19s", 0x2000000, 0x800000, CRC(795df2a6) SHA1(80f740806dcaacc28752cea98b254cbee51972a4) )
@@ -9956,6 +10090,18 @@ ROM_START( initdv2jo )
ROM_LOAD( "317-0345-jpn.pic", 0x000000, 0x004000, CRC(56e1274a) SHA1(735a6071226f3297de64bc0a38be741e87f5d023) )
ROM_END
+ROM_START( initdv2ja )
+ NAOMI2_BIOS
+ NAOMI_DEFAULT_EEPROM
+
+ DISK_REGION( "gdrom" )
+ DISK_IMAGE_READONLY( "gds-0026a", 0, SHA1(f56a85ebb842838561c15cb53ce81eb341e91300) )
+
+ ROM_REGION( 0x4000, "pic", ROMREGION_ERASEFF)
+ //PIC16C622A (317-0345-JPN)
+ //(sticker 253-5508-0345J)
+ ROM_LOAD( "317-0345-jpn.pic", 0x000000, 0x004000, CRC(56e1274a) SHA1(735a6071226f3297de64bc0a38be741e87f5d023) )
+ROM_END
ROM_START( initdv2e )
NAOMI2_BIOS
@@ -9969,6 +10115,35 @@ ROM_START( initdv2e )
ROM_LOAD( "317-0357-exp.pic", 0x000000, 0x004000, CRC(38f84b4d) SHA1(03c12d8580da1a4b3a554e62fd8b1f3447b7ebbd) )
ROM_END
+ROM_START( clubkcyco )
+ NAOMI2_BIOS
+ NAOMI_DEFAULT_EEPROM
+
+ DISK_REGION( "gdrom" )
+ DISK_IMAGE_READONLY( "gds-0029", 0, SHA1(e73317c459b7f3e966c1be8784c55cbdfe230b88) )
+
+ ROM_REGION( 0x4000, "pic", ROMREGION_ERASEFF)
+ //PIC16C622A (317-0358-COM)
+ //(sticker 253-5508-0358)
+ ROM_LOAD( "317-0358-com.pic", 0x000000, 0x004000, CRC(dd33e50f) SHA1(c51712754022fc3adc350fa0714bf60fd0d163cf) )
+
+/*
+ Cycraft Motion PC:
+ Mainboard Advantech PCM-5820
+ CAN Module PCM-3680
+ IO Module PCM-3724
+ 128mb PC133 Ram
+
+ SanDisk CF With Linux:
+ Simuline CYCRAFT
+ SMCP: V1.65
+ GAME: Club-Kart
+ (c) 2003 Simuline Inc.
+*/
+ DISK_REGION( "cycraft" )
+ DISK_IMAGE( "cycraft_clubkart_smcp_v1.65", 0, SHA1(c77df6eaf425e4e86f871914aa024debc1940713) )
+ROM_END
+
ROM_START( clubkcyc )
NAOMI2_BIOS
NAOMI_DEFAULT_EEPROM
@@ -10582,7 +10757,7 @@ ROM_START( ggisuka )
ROM_REGION( 0x9000000, "rom_board", ROMREGION_ERASE)
ROM_LOAD( "ax1201p01.ic18", 0x0000000, 0x0800000, CRC(0a78d52c) SHA1(e9006dc43cd11d5ba49a092a1dff31dc10700c28) )
- ROM_LOAD( "ax1201m01.ic10", 0x0800000, 0x1000000, CRC(df96ce30) SHA1(25a9f743b1c2b11896d0c7a2dc1c198fc977aaca) ) // 2x mirrored 8MB data, TODO: check is IC10 Mask ROM not 16MB but 8MB
+ ROM_LOAD( "ax1201m01.ic10", 0x0800000, 0x1000000, CRC(df96ce30) SHA1(25a9f743b1c2b11896d0c7a2dc1c198fc977aaca) ) // 2x mirrored 8MB data, TODO: check if IC10 mask ROM not 16MB but 8MB
ROM_LOAD( "ax1202m01.ic11", 0x1000000, 0x1000000, CRC(dfc6fd67) SHA1(f9d35b18a03d22f70feda42d314b0f9dd54eea55) )
ROM_LOAD( "ax1203m01.ic12", 0x2000000, 0x1000000, CRC(bf623df9) SHA1(8b9a8e8100ff6d2ce9a982ab8eb1d542f1c7af03) )
ROM_LOAD( "ax1204m01.ic13", 0x3000000, 0x1000000, CRC(c80c3930) SHA1(5c39fde36e2ebbfe72967d7d0202eb454a8d3bbe) )
@@ -10938,15 +11113,17 @@ ROM_END
/* 0017 */ GAME( 1999, otrigger, naomi, naomim2, naomi, naomi_state, init_naomi, ROT0, "Sega", "OutTrigger", GAME_FLAGS )
/* 0018 */ GAME( 1999, sgtetris, naomi, naomim2, naomi, naomi_state, init_naomi, ROT0, "Sega", "Sega Tetris", GAME_FLAGS )
/* 0019 */ GAME( 1999, dybb99, naomi, naomim2, dybbnao, naomi_state, init_naomi, ROT0, "Sega", "Dynamite Baseball '99 (Japan, Rev B)", GAME_FLAGS )
+/* 0020 */ GAME( 1999, sambaa, samba, naomim2, naomi, naomi_state, init_naomi, ROT0, "Sega", "Samba De Amigo (Rev A)", GAME_FLAGS )
/* 0020 */ GAME( 1999, samba, naomi, naomim2, naomi, naomi_state, init_naomi, ROT0, "Sega", "Samba De Amigo (Rev B)", GAME_FLAGS )
/* none */ GAME( 1999, sambap, samba, naomim2, naomi, naomi_state, init_naomi, ROT0, "Sega", "Samba De Amigo (USA, prototype)", GAME_FLAGS )
-/* none */ GAME( 2000, virnbap, virnba, naomim2, naomi, naomi_state, init_naomi, ROT0, "Sega", "Virtua NBA (prototype)", GAME_FLAGS )
+/* none */ GAME( 1999, virnbap, virnba, naomim2, naomi, naomi_state, init_naomi, ROT0, "Sega", "Virtua NBA (prototype)", GAME_FLAGS )
+/* none */ GAME( 1999, virnbapa, virnba, naomim2, naomi, naomi_state, init_naomi, ROT0, "Sega", "Virtua NBA (prototype, 15.11)", GAME_FLAGS )
/* 0021 */ GAME( 2000, virnbao, virnba, naomim2, naomi, naomi_state, init_naomi, ROT0, "Sega", "Virtua NBA", GAME_FLAGS )
/* 0021-01 */ GAME( 2000, virnba, naomi, naomim2, naomi, naomi_state, init_naomi, ROT0, "Sega", "Virtua NBA (USA)", GAME_FLAGS )
/* 0022 */ GAME( 2000, tduno2, naomi, naomim1, naomi, naomi_state, init_naomi, ROT0, "Sega", "Touch de Uno! 2 (Japan)", GAME_FLAGS )
/* 0023 */ GAME( 2000, 18wheelro, 18wheelr, naomim2, 18wheelr,naomi_state, init_naomi, ROT0, "Sega", "18 Wheeler (deluxe)", GAME_FLAGS )
-/* 0023 */ GAME( 2000, 18wheelr, naomi, naomim2, 18wheelr,naomi_state, init_naomi, ROT0, "Sega", "18 Wheeler (deluxe) (Rev A)", GAME_FLAGS )
-/* 0023 */ GAME( 2000, 18wheelrt, 18wheelr, naomim2, 18wheelr,naomi_state, init_naomi, ROT0, "Sega", "18 Wheeler (deluxe) (Rev T)", GAME_FLAGS )
+/* 0023 */ GAME( 2000, 18wheelr, naomi, naomim2, 18wheelr,naomi_state, init_naomi, ROT0, "Sega", "18 Wheeler (deluxe, Rev A)", GAME_FLAGS )
+/* 0023 */ GAME( 2000, 18wheelrt, 18wheelr, naomim2, 18wheelr,naomi_state, init_naomi, ROT0, "Sega", "18 Wheeler (deluxe, Rev T)", GAME_FLAGS )
/* 0025 */ GAME( 1999, marstv, naomi, naomim2, marstv, naomi_state, init_naomi, ROT0, "Sega", "Mars TV (Japan)", GAME_FLAGS )
/* 0026 */ GAME( 2000, totdo, totd, naomim2_kb, naomi_kb, naomi_state, init_naomi, ROT0, "Sega", "The Typing of the Dead", GAME_FLAGS )
/* 0026 */ GAME( 2000, totd, naomi, naomim2_kb, naomi_kb, naomi_state, init_naomi, ROT0, "Sega", "The Typing of the Dead (Rev A)", GAME_FLAGS )
@@ -10976,7 +11153,7 @@ ROM_END
/* 0064 */ GAME( 2001, wrungpo, wrungp, naomim2, naomi, naomi_state, init_naomi, ROT0, "CRI / Sega", "Wave Runner GP (USA, Rev A)", GAME_FLAGS )
/* 0064 */ GAME( 2001, wrungp, naomi, naomim2, naomi, naomi_state, init_naomi, ROT0, "CRI / Sega", "Wave Runner GP", GAME_FLAGS )
/* 0068 */ GAME( 2001, crakndj2, naomi, naomim2, crackndj,naomi_state, init_naomi, ROT0, "Sega", "Crackin' DJ Part 2 (Japan)", GAME_FLAGS )
-/* 0073 */ GAME( 2001, inunoos, naomi, naomim2, naomi, naomi_state, init_naomi, ROT0, "Sega / Cave", "Inu No Osanpo / Dog Walking (Japan, Export, Rev A)", GAME_FLAGS )
+/* 0073 */ GAME( 2001, inunoos, naomi, naomim2, naomi, naomi_state, init_naomi, ROT0, "Wow Entertainment / Sega", "Inu No Osanpo / Dog Walking (Japan, Export, Rev A)", GAME_FLAGS )
/* 0078 */ GAME( 2002, shors2k1, naomi, naomim2, naomi, naomi_state, init_naomi, ROT270,"Sega", "Star Horse 2001 (satellite, Rev B)", GAME_FLAGS )
/* 0083 */ GAME( 2001, derbyoc2, naomi, naomim2, naomi, naomi_state, init_naomi, ROT0, "Sega", "Derby Owners Club II Ver.2.1 (Japan, Rev B)", GAME_FLAGS )
/* 0084 */ GAME( 2001, vtenis2c, naomi, naomim1, naomi, naomi_state, init_naomi, ROT0, "Sega", "Virtua Tennis 2 / Power Smash 2 (Rev A)", GAME_FLAGS )
@@ -10989,7 +11166,7 @@ ROM_END
/* 0122 */ GAME( 2003, shorsepl, shorsep, naomim2, naomi, naomi_state, init_naomi, ROT0, "Sega", "Star Horse Progress (live, Rev A)", GAME_FLAGS )
/* 0123 */ GAME( 2003, shorsep, naomi, naomim2, naomi, naomi_state, init_naomi, ROT270,"Sega", "Star Horse Progress (satellite, Rev A)", GAME_FLAGS )
/* 0126 */ GAME( 2003, oinori, naomi, naomim2, naomi, naomi_state, init_naomi, ROT0, "Sega", "Oinori-daimyoujin Matsuri", GAME_FLAGS )
-/* 0128 */ GAME( 2003, shootpl, naomi, naomim1, naomi, naomi_state, init_naomi, ROT0, "Sega", "Shootout Pool Prize (Export) / Shootout Pool The Medal (Japan) (Rev A)", GAME_FLAGS )
+/* 0128 */ GAME( 2003, shootpl, naomi, naomim1, naomi, naomi_state, init_naomi, ROT0, "Sega", "Shootout Pool Prize (Export) / Shootout Pool The Medal (Japan, Rev A)", GAME_FLAGS )
/* 0130 */ GAME( 2002, hopper, naomi, naomi, naomi, naomi_state, init_naomi, ROT0, "Sega", "SWP Hopper Board", GAME_FLAGS )
// 0132 Mushiking 2K3 2ND (Japan)
/* 0136 */ GAME( 2004, shootplm, naomi, naomim1, naomi, naomi_state, init_naomi, ROT0, "Sega", "Shootout Pool Prize (Export) / Shootout Pool The Medal (Japan) Version B", GAME_FLAGS ) // Build: 23 Jan 2004
@@ -11004,40 +11181,41 @@ ROM_END
/* 0166 */ GAME( 2006, zunou, naomi, naomim4, naomi, naomi_state, init_naomi, ROT0, "Sega", "Touch De Zunou (Japan, Rev A)", GAME_FLAGS )
/* 0170-01 */ GAME( 2007, manicpnc, naomi, naomim4, naomi, naomi_state, init_naomi, ROT0, "Sega", "Manic Panic Ghosts! (USA, Export)", GAME_FLAGS )
/* 0170 */ GAME( 2007, pokasuka, manicpnc, naomim4, naomi, naomi_state, init_naomi, ROT0, "Sega", "Pokasuka Ghost! (Japan)", GAME_FLAGS )
-// 0171 Mushiking 2K6 2ND (Japan)
+// 0171 Mushiking 2K6 2ND (Japan) note: starting from ver 2K6 was moved to SystemSP platform and later to PC-based hardware
/* 0175 */ GAME( 2007, asndynmt, naomi, naomim4, naomi, naomi_state, init_naomi, ROT0, "Sega", "Asian Dynamite / Dynamite Deka EX", GAME_FLAGS )
/* 0175 */ GAME( 2007, asndynmto, asndynmt, naomim4, naomi, naomi_state, init_naomi, ROT0, "Sega", "Asian Dynamite / Dynamite Deka EX (older)", GAME_FLAGS ) // no revision stickers, presumably older revision but might be release for Asian market
/* 0177 */ GAME( 2007, rhytngk, naomi, naomim4, naomi, naomi_state, init_naomi, ROT0, "Sega / Nintendo - J.P ROOM", "Rhythm Tengoku (Japan)", GAME_FLAGS )
/* 0180 */ GAME( 2007, mushik4e, naomi, naomim4, naomi, naomi_state, init_naomi, ROT0, "Sega", "Mushiking The King Of Beetles - Mushiking IV / V / VI (World)", GAME_FLAGS ) // not for Japan or Korea, version can be changed in secret menu, ~equivalent of Japanese 2K6 versions.
/* 0186 */ GAME( 2009, shorsepr, naomi, naomim4, naomi, naomi_state, init_naomi, ROT270,"Sega", "Star Horse Progress Returns (satellite)", GAME_FLAGS )
-// 0xxx Mushiking 2K3 1ST (Japan)
-// 0xxx Mushiking 2K4 1ST (Japan)
-// 0xxx Mushiking 2K5 2ND (Japan) note: starting from ver 2K6 2ND was moved to SystemSP platform and later to PC-based hardware
+// 00xx Mayjinsen (Formation Battle in May) - prototype, never released
+// 01xx Mushiking 2K3 1ST (Japan)
+// 01xx Mushiking 2K4 1ST (Japan)
+// 01xx Mushiking 2K5 2ND (Japan)
// 0xxx Star Horse 2001 (main screens, server)
// 0xxx Star Horse 2002 (whole set)
// 0xxx Star Horse Progress Returns (main screens, server)
-// 00xx Mayjinsen (Formation Battle in May) - prototype, never released
/* Cartridge prototypes of games released on GD-ROM */
/* none */ GAME( 2003, puyofevp, puyofev, naomim1, naomi, naomi_state, init_naomi, ROT0, "Sega", "Puyo Puyo Fever (prototype ver 0.01)", GAME_FLAGS )
/* none */ GAME( 2001, vathletep, vathlete, naomim2, naomi, naomi_state, init_naomi, ROT0, "Sega", "Virtua Athletics / Virtua Athlete (prototype)", GAME_FLAGS )
/* 840-xxxxx (Sega Naomi 2 cart games) */
-/* 0046 */ GAME( 2001, wldrider, naomi2, naomi2m2, naomi, naomi2_state, init_naomi2, ROT0, "Sega", "Wild Riders", GAME_FLAGS )
-/* 0061 */ GAME( 2001, vstrik3co,vstrik3c,naomi2m2, naomi, naomi2_state, init_naomi2, ROT0, "Sega", "Virtua Striker 3 (World)", GAME_FLAGS ) // not for Japan
-/* 0061 */ GAME( 2001, vstrik3c, naomi2, naomi2m2, naomi, naomi2_state, init_naomi2, ROT0, "Sega", "Virtua Striker 3 (World, Rev B)", GAME_FLAGS ) // not for Japan
-/* 0062 */ GAME( 2001, clubkrto, clubkrt, naomi2m2, naomi, naomi2_state, init_naomi2, ROT0, "Sega", "Club Kart: European Session", GAME_FLAGS )
-/* 0062 */ GAME( 2001, clubkrta, clubkrt, naomi2m2, naomi, naomi2_state, init_naomi2, ROT0, "Sega", "Club Kart: European Session (Rev A)", GAME_FLAGS )
-/* 0062 */ GAME( 2001, clubkrtc, clubkrt, naomi2m2, naomi, naomi2_state, init_naomi2, ROT0, "Sega", "Club Kart: European Session (Rev C)", GAME_FLAGS )
-/* 0062 */ GAME( 2001, clubkrt, naomi2, naomi2m2, naomi, naomi2_state, init_naomi2, ROT0, "Sega", "Club Kart: European Session (Rev D)", GAME_FLAGS )
-/* 0080 */ GAME( 2002, vf4cart, naomi2, naomi2m2, naomi, naomi2_state, init_naomi2, ROT0, "Sega", "Virtua Fighter 4 (World)", GAME_FLAGS ) // not for Japan
-/* 0087 */ GAME( 2002, kingrt66, naomi2, naomi2m2, naomi, naomi2_state, init_naomi2, ROT0, "Sega", "The King of Route 66 (Rev A)", GAME_FLAGS )
-/* 0095 */ GAME( 2002, soulsurf, naomi2, naomi2m2, naomi, naomi2_state, init_naomi2, ROT0, "Sega", "Soul Surfer (Rev A)", GAME_FLAGS )
-/* 0106 */ GAME( 2002, vf4evoct, naomi2, naomi2m1, naomi, naomi2_state, init_naomi2, ROT0, "Sega", "Virtua Fighter 4 Evolution (World)", GAME_FLAGS ) // not for Japan
-/* 0129 */ GAME( 2003, clubkprz, naomi2, naomi2m1, naomi, naomi2_state, init_naomi2, ROT0, "Sega", "Club Kart Prize (Export, Japan)", GAME_FLAGS )
-/* 0137 */ GAME( 2004, clubkpzb, naomi2, naomi2m1, naomi, naomi2_state, init_naomi2, ROT0, "Sega", "Club Kart Prize Version B (Export, Japan)", GAME_FLAGS )
-/* 0139 */ GAME( 2003, clubk2k3, naomi2, naomi2m1, naomi, naomi2_state, init_naomi2, ROT0, "Sega", "Club Kart: European Session (2003, Rev A)", GAME_FLAGS )
-/* none */ GAME( 2003, clubk2kp, clubk2k3,naomi2m2, naomi, naomi2_state, init_naomi2, ROT0, "Sega", "Club Kart: European Session (2003, prototype)", GAME_FLAGS )
+/* 0046 */ GAME( 2001, wldrider, naomi2, naomi2m2, naomi, naomi2_state, init_naomi2, ROT0, "Wow Entertainment / Sega", "Wild Riders", GAME_FLAGS )
+/* 0061 */ GAME( 2001, vstrik3co,vstrik3c,naomi2m2, naomi, naomi2_state, init_naomi2, ROT0, "Amusement Vision / Sega", "Virtua Striker 3 (World)", GAME_FLAGS ) // not for Japan
+/* 0061 */ GAME( 2001, vstrik3c, naomi2, naomi2m2, naomi, naomi2_state, init_naomi2, ROT0, "Amusement Vision / Sega", "Virtua Striker 3 (World, Rev B)", GAME_FLAGS ) // not for Japan
+/* 0062 */ GAME( 2001, clubkrto, clubkrt, naomi2m2, naomi, naomi2_state, init_naomi2, ROT0, "Sega", "Club Kart: European Session", GAME_FLAGS )
+/* 0062 */ GAME( 2001, clubkrta, clubkrt, naomi2m2, naomi, naomi2_state, init_naomi2, ROT0, "Sega", "Club Kart: European Session (Rev A)", GAME_FLAGS )
+/* 0062 */ GAME( 2001, clubkrtc, clubkrt, naomi2m2, naomi, naomi2_state, init_naomi2, ROT0, "Sega", "Club Kart: European Session (Rev C)", GAME_FLAGS )
+/* 0062 */ GAME( 2001, clubkrt, naomi2, naomi2m2, naomi, naomi2_state, init_naomi2, ROT0, "Sega", "Club Kart: European Session (Rev D)", GAME_FLAGS )
+/* 0080 */ GAME( 2002, vf4cart, naomi2, naomi2m2, naomi, naomi2_state, init_naomi2, ROT0, "Sega", "Virtua Fighter 4 (World)", GAME_FLAGS ) // not for Japan
+/* none */ GAME( 2002, kingrt66p,kingrt66,naomi2m2, naomi, naomi2_state, init_naomi2, ROT0, "Sega", "The King of Route 66 (prototype)", GAME_FLAGS )
+/* 0087 */ GAME( 2002, kingrt66, naomi2, naomi2m2, naomi, naomi2_state, init_naomi2, ROT0, "Sega", "The King of Route 66 (Rev A)", GAME_FLAGS )
+/* 0095 */ GAME( 2002, soulsurf, naomi2, naomi2m2, naomi, naomi2_state, init_naomi2, ROT0, "Sega", "Soul Surfer (Rev A)", GAME_FLAGS )
+/* 0106 */ GAME( 2002, vf4evoct, naomi2, naomi2m1, naomi, naomi2_state, init_naomi2, ROT0, "Sega", "Virtua Fighter 4 Evolution (World)", GAME_FLAGS ) // not for Japan
+/* 0129 */ GAME( 2003, clubkprz, naomi2, naomi2m1, naomi, naomi2_state, init_naomi2, ROT0, "Sega", "Club Kart Prize (Export, Japan, Rev A)", GAME_FLAGS )
+/* 0137 */ GAME( 2004, clubkpzb, naomi2, naomi2m1, naomi, naomi2_state, init_naomi2, ROT0, "Sega", "Club Kart Prize Version B (Export, Japan)", GAME_FLAGS )
+/* 0139 */ GAME( 2003, clubk2k3, naomi2, naomi2m1, naomi, naomi2_state, init_naomi2, ROT0, "Sega", "Club Kart: European Session (2003, Rev A)", GAME_FLAGS )
+/* none */ GAME( 2003, clubk2kp, clubk2k3,naomi2m2, naomi, naomi2_state, init_naomi2, ROT0, "Sega", "Club Kart: European Session (2003, prototype)", GAME_FLAGS )
/* 841-xxxxx ("Licensed by Sega" Naomi cart games)*/
/* 0001 */ GAME( 1999, pstone, naomi, naomim2, naomi, naomi_state, init_naomi, ROT0, "Capcom", "Power Stone", GAME_FLAGS )
@@ -11067,9 +11245,9 @@ ROM_END
/* 0058 */ GAME( 2008, ausfache, naomi, naomim4, naomi, naomi_state, init_naomi, ROT0, "Subtle Style", "Akatsuki Blitzkampf Ausf. Achse (Japan)", GAME_FLAGS )
/* 0059 */ GAME( 2008, illvelo, naomi, naomim4, naomi, naomi_state, init_naomi, ROT270,"Milestone", "Illvelo (Illmatic Envelope) (Japan)", GAME_FLAGS )
/* 0060 */ GAME( 2008, mamonoro, naomi, naomim4, naomi, naomi_state, init_naomi, ROT270,"G.Rev", "Mamoru-kun wa Norowarete Shimatta! (Japan)", GAME_FLAGS )
-/* 0061 */ GAME( 2008, mbaao, mbaa, naomim4, naomi, naomi_state, init_naomi, ROT0, "Type-Moon/Ecole", "Melty Blood Actress Again (Japan)", GAME_FLAGS )
-/* 0061 */ GAME( 2008, mbaa, naomi, naomim4, naomi, naomi_state, init_naomi, ROT0, "Type-Moon/Ecole", "Melty Blood Actress Again Version A (Japan, Rev A)", GAME_FLAGS )
-/* 0062 */ GAME( 2009, radirgyn, naomi, naomim4, naomi, naomi_state, init_naomi, ROT0, "Milestone/Lucky", "Radirgy Noa (Japan)", GAME_FLAGS )
+/* 0061 */ GAME( 2008, mbaao, mbaa, naomim4, naomi, naomi_state, init_naomi, ROT0, "Type-Moon / Ecole", "Melty Blood Actress Again (Japan)", GAME_FLAGS )
+/* 0061 */ GAME( 2008, mbaa, naomi, naomim4, naomi, naomi_state, init_naomi, ROT0, "Type-Moon / Ecole", "Melty Blood Actress Again Version A (Japan, Rev A)", GAME_FLAGS )
+/* 0062 */ GAME( 2009, radirgyn, naomi, naomim4, naomi, naomi_state, init_naomi, ROT0, "Milestone / Lucky", "Radirgy Noa (Japan)", GAME_FLAGS )
/* HMG016007 */ GAME( 2001, hmgeo, naomi, naomim2, naomi, naomi_state, init_naomi, ROT0, "Capcom", "Heavy Metal Geomatrix (Rev B)", GAME_FLAGS )
/* Cart games on Namco custom ROM board
@@ -11109,23 +11287,23 @@ ROM_END
// 0009 Dynamic Golf / Virtua Golf (GDS-0009)
/* 0009A */ GAME( 2001, dygolf, naomigd, naomigd, naomi, naomi_state, init_naomigd, ROT0, "Sega", "Virtua Golf / Dynamic Golf (Rev A) (GDS-0009A)", GAME_FLAGS )
/* 0010 */ GAME( 2001, wsbbgd, naomigd, naomigd, dybbnao, naomi_state, init_naomigd, ROT0, "Sega", "World Series Baseball / Super Major League (GDS-0010)", GAME_FLAGS )
-/* 0011 */ GAME( 1999, vtennisg, naomigd, naomigd, naomi, naomi_state, init_naomigd, ROT0, "Sega", "Virtua Tennis / Power Smash (GDS-0011)", GAME_FLAGS )
+/* 0011 */ GAME( 2001, vtennisg, naomigd, naomigd, naomi, naomi_state, init_naomigd, ROT0, "Sega", "Virtua Tennis / Power Smash (GDS-0011)", GAME_FLAGS )
/* 0012 */ GAME( 2001, vf4o, vf4, naomi2gd, naomi, naomi2_state, init_naomi2, ROT0, "Sega", "Virtua Fighter 4 (GDS-0012)", GAME_FLAGS )
// 0012A Virtua Fighter 4 (Rev A) (GDS-0012A)
-/* 0012B */ GAME( 2001, vf4b, vf4, naomi2gd, naomi, naomi2_state, init_naomi2, ROT0, "Sega", "Virtua Fighter 4 (Rev B) (GDS-0012B)", GAME_FLAGS )
-/* 0012C */ GAME( 2001, vf4, naomi2, naomi2gd, naomi, naomi2_state, init_naomi2, ROT0, "Sega", "Virtua Fighter 4 Version C (GDS-0012C)", GAME_FLAGS )
+/* 0012B */ GAME( 2001, vf4b, vf4, naomi2gd, naomi, naomi2_state, init_naomi2, ROT0, "Sega", "Virtua Fighter 4 (Rev B) (GDS-0012B)", GAME_FLAGS )
+/* 0012C */ GAME( 2001, vf4, naomi2, naomi2gd, naomi, naomi2_state, init_naomi2, ROT0, "Sega", "Virtua Fighter 4 Version C (GDS-0012C)", GAME_FLAGS )
/* 0013 */ GAME( 2001, shaktmsp, naomigd, naomigd, shaktamb, naomi_state, init_naomigd, ROT0, "Sega", "Shakatto Tambourine Motto Norinori Shinkyoku Tsuika (2K1 SPR) (GDS-0013)", GAME_FLAGS )
-/* 0014 */ GAME( 2001, beachspi, naomi2, naomi2gd, naomi, naomi2_state, init_naomi2, ROT0, "Sega", "Beach Spikers (GDS-0014)", GAME_FLAGS )
+/* 0014 */ GAME( 2001, beachspi, naomi2, naomi2gd, naomi, naomi2_state, init_naomi2, ROT0, "CRI / Sega", "Beach Spikers (GDS-0014)", GAME_FLAGS )
// 0015 Virtua Tennis 2 / Power Smash 2 (GDS-0015)
/* 0015A */ GAME( 2001, vtennis2, naomigd, naomigd, naomi, naomi_state, init_naomigd, ROT0, "Sega", "Virtua Tennis 2 / Power Smash 2 (Rev A) (GDS-0015A)", GAME_FLAGS )
/* 0016 */ GAME( 2001, shaktamb, naomigd, naomigd, shaktamb, naomi_state, init_naomigd, ROT0, "Sega", "Shakatto Tambourine Cho Powerup Chu (2K1 AUT) (GDS-0016)", GAME_FLAGS )
/* 0017 */ GAME( 2001, keyboard, naomigd, naomigd_kb, naomi_kb, naomi_state, init_naomigd, ROT0, "Sega", "La Keyboard (GDS-0017)", GAME_FLAGS )
-/* 0018 */ GAME( 2001, lupinsho, naomigd, naomigd, hotd2, naomi_state, init_naomigd, ROT0, "Sega / Eighting", "Lupin The Third - The Shooting (GDS-0018)", GAME_FLAGS )
-// 0018A Lupin The Third - The Shooting (Rev A) (GDS-0018A) known to exists
+/* 0018 */ GAME( 2001, lupinshoo,lupinsho,naomigd, hotd2, naomi_state, init_naomigd, ROT0, "Sega / Eighting", "Lupin The Third - The Shooting (GDS-0018)", GAME_FLAGS )
+/* 0018A */ GAME( 2001, lupinsho, naomigd, naomigd, hotd2, naomi_state, init_naomigd, ROT0, "Sega / Eighting", "Lupin The Third - The Shooting (Rev A) (GDS-0018A)", GAME_FLAGS )
/* 0019 */ GAME( 2001, vathlete, naomigd, naomigd, naomi, naomi_state, init_naomigd, ROT0, "Sega", "Virtua Athletics / Virtua Athlete (GDS-0019)", GAME_FLAGS )
/* 0020 */ GAME( 2002, initdo, initd, naomi2gd, naomi, naomi2_state, init_naomi2, ROT0, "Sega", "Initial D Arcade Stage (Japan) (GDS-0020)", GAME_FLAGS )
-// 0020A Initial D Arcade Stage (Rev A) (GDS-0020A)
-/* 0020B */ GAME( 2002, initd, naomi2, naomi2gd, naomi, naomi2_state, init_naomi2, ROT0, "Sega", "Initial D Arcade Stage (Rev B) (Japan) (GDS-0020B)", GAME_FLAGS )
+// 0020A Initial D Arcade Stage (Japan, Rev A) (GDS-0020A)
+/* 0020B */ GAME( 2002, initd, naomi2, naomi2gd, naomi, naomi2_state, init_naomi2, ROT0, "Sega", "Initial D Arcade Stage (Japan, Rev B) (GDS-0020B)", GAME_FLAGS )
// 0021 Lupin The Third - The Typing (GDS-0021)
/* 0021A */ GAME( 2002, luptype, naomigd, naomigd_kb, naomi_kb, naomi_state, init_naomigd, ROT0, "Sega", "Lupin The Third - The Typing (Rev A) (GDS-0021A)", GAME_FLAGS )
/* 0022 */ GAME( 2002, mok, naomigd, naomigd, hotd2, naomi_state, init_naomigd, ROT0, "Sega", "The Maze of the Kings (GDS-0022)", GAME_FLAGS )
@@ -11140,44 +11318,44 @@ ROM_END
/* 0024B */ GAME( 2002, vf4evob, vf4evo, naomi2gd, naomi, naomi2_state, init_naomi2, ROT0, "Sega", "Virtua Fighter 4 Evolution (Version B) (Japan) (GDS-0024B)", GAME_FLAGS )
/* 0024C */ GAME( 2002, vf4evo, naomi2, naomi2gd, naomi, naomi2_state, init_naomi2, ROT0, "Sega", "Virtua Fighter 4 Evolution (Version B) (Japan) (GDS-0024C)", GAME_FLAGS )
/* 0025 */ GAME( 2002, initdexpo,initdexp,naomi2gd, naomi, naomi2_state, init_naomi2, ROT0, "Sega", "Initial D Arcade Stage (Export) (GDS-0025)", GAME_FLAGS )
-/* 0025A */ GAME( 2002, initdexp, naomi2, naomi2gd, naomi, naomi2_state, init_naomi2, ROT0, "Sega", "Initial D Arcade Stage (Export) (Rev A) (GDS-0025A)", GAME_FLAGS )
+/* 0025A */ GAME( 2002, initdexp, naomi2, naomi2gd, naomi, naomi2_state, init_naomi2, ROT0, "Sega", "Initial D Arcade Stage (Export, Rev A) (GDS-0025A)", GAME_FLAGS )
/* 0026 */ GAME( 2002, initdv2jo,initdv2j,naomi2gd, naomi, naomi2_state, init_naomi2, ROT0, "Sega", "Initial D Arcade Stage Ver. 2 (Japan) (GDS-0026)", GAME_FLAGS )
-// 0026A Initial D Arcade Stage Ver. 2 (Japan) (Rev A) (GDS-0026A)
-/* 0026B */ GAME( 2003, initdv2j, naomi2, naomi2gd, naomi, naomi2_state, init_naomi2, ROT0, "Sega", "Initial D Arcade Stage Ver. 2 (Japan) (Rev B) (GDS-0026B)", GAME_FLAGS )
+/* 0026A */ GAME( 2002, initdv2ja,initdv2j,naomi2gd, naomi, naomi2_state, init_naomi2, ROT0, "Sega", "Initial D Arcade Stage Ver. 2 (Japan, Rev A) (GDS-0026A)", GAME_FLAGS )
+/* 0026B */ GAME( 2003, initdv2j, naomi2, naomi2gd, naomi, naomi2_state, init_naomi2, ROT0, "Sega", "Initial D Arcade Stage Ver. 2 (Japan, Rev B) (GDS-0026B)", GAME_FLAGS )
/* 0027 */ GAME( 2003, initdv2e, initdv2j,naomi2gd, naomi, naomi2_state, init_naomi2, ROT0, "Sega", "Initial D Arcade Stage Ver. 2 (Export) (GDS-0027)", GAME_FLAGS )
-// 0028
-// 0029 Club Kart for Cycraft (GDS-0029)
+// 0028 Shakka to Tambourine 4EVER (GD SOFT TMB 4EVER)
+/* 0029 */ GAME( 2003, clubkcyco,clubkcyc,naomi2gd, naomi, naomi2_state, init_naomi2, ROT0, "Sega", "Club Kart for Cycraft (GDS-0029)", GAME_FLAGS )
/* 0029A */ GAME( 2003, clubkcyc, naomi2, naomi2gd, naomi, naomi2_state, init_naomi2, ROT0, "Sega", "Club Kart for Cycraft (Rev A) (GDS-0029A)", GAME_FLAGS )
/* 0030A */ GAME( 2003, dragntra, dragntr, naomigd, naomi, naomi_state, init_naomigd, ROT0, "Sega", "Dragon Treasure (Rev A) (GDS-0030A)", GAME_FLAGS )
/* 0030B */ GAME( 2003, dragntr, naomigd, naomigd, naomi, naomi_state, init_naomigd, ROT0, "Sega", "Dragon Treasure (Rev B) (GDS-0030B)", GAME_FLAGS )
/* 0031 */ GAME( 2003, puyofevj, puyofev, naomigd, naomi, naomi_state, init_naomigd, ROT0, "Sega", "Puyo Puyo Fever (Japan) (GDS-0031)", GAME_FLAGS )
// 0032 Initial D Arcade Stage Ver. 3 (Japan) (GDS-0032)
-// 0032A Initial D Arcade Stage Ver. 3 (Japan) (Rev A) (GDS-0032A)
-/* 0032B */ GAME( 2004, initdv3jb,initdv3j,naomi2gd, naomi, naomi2_state, init_naomi2, ROT0, "Sega", "Initial D Arcade Stage Ver. 3 (Japan) (Rev B) (GDS-0032B)", GAME_FLAGS )
-/* 0032C */ GAME( 2004, initdv3j, naomi2, naomi2gd, naomi, naomi2_state, init_naomi2, ROT0, "Sega", "Initial D Arcade Stage Ver. 3 (Japan) (Rev C) (GDS-0032C)", GAME_FLAGS )
+// 0032A Initial D Arcade Stage Ver. 3 (Japan, Rev A) (GDS-0032A)
+/* 0032B */ GAME( 2004, initdv3jb,initdv3j,naomi2gd, naomi, naomi2_state, init_naomi2, ROT0, "Sega", "Initial D Arcade Stage Ver. 3 (Japan, Rev B) (GDS-0032B)", GAME_FLAGS )
+/* 0032C */ GAME( 2004, initdv3j, naomi2, naomi2gd, naomi, naomi2_state, init_naomi2, ROT0, "Sega", "Initial D Arcade Stage Ver. 3 (Japan, Rev C) (GDS-0032C)", GAME_FLAGS )
/* 0033 */ GAME( 2004, initdv3e, naomi2, naomi2gd, naomi, naomi2_state, init_naomi2, ROT0, "Sega", "Initial D Arcade Stage Ver. 3 (Export) (GDS-0033)", GAME_FLAGS )
/* 0034 */ GAME( 2003, puyofev, naomigd, naomigd, naomi, naomi_state, init_naomigd, ROT0, "Sega", "Puyo Pop Fever (World) (GDS-0034)", GAME_FLAGS )
-// 0035
+// 0035 GD SOFT KIT DKG
// 0036 Virtua Fighter 4 Final Tuned (GDS-0036)
-/* 0036A */ GAME( 2004, vf4tuneda,vf4tuned,naomi2gd, naomi, naomi2_state, init_naomi2, ROT0, "Sega", "Virtua Fighter 4 Final Tuned (GDS-0036A)", GAME_FLAGS )
-// 0036B Virtua Fighter 4 Final Tuned (GDS-0036B)
-// 0036C Virtua Fighter 4 Final Tuned (GDS-0036C)
+/* 0036A */ GAME( 2004, vf4tuneda,vf4tuned,naomi2gd, naomi, naomi2_state, init_naomi2, ROT0, "Sega", "Virtua Fighter 4 Final Tuned (Rev A) (GDS-0036A)", GAME_FLAGS )
+// 0036B Virtua Fighter 4 Final Tuned (Rev B) (GDS-0036B)
+// 0036C Virtua Fighter 4 Final Tuned (Rev C) (GDS-0036C)
/* 0036D */ GAME( 2004, vf4tunedd,vf4tuned,naomi2gd, naomi, naomi2_state, init_naomi2, ROT0, "Sega", "Virtua Fighter 4 Final Tuned (Ver. A) (GDS-0036D)", GAME_FLAGS )
-// 0036E Virtua Fighter 4 Final Tuned (GDS-0036E)
+// 0036E Virtua Fighter 4 Final Tuned (Rev E) (GDS-0036E)
/* 0036F */ GAME( 2004, vf4tuned, naomi2, naomi2gd, naomi, naomi2_state, init_naomi2, ROT0, "Sega", "Virtua Fighter 4 Final Tuned (Ver. B) (GDS-0036F)", GAME_FLAGS )
// 0037 Dragon Treasure 2 (GDS-0037)
/* 0037A */ GAME( 2004, dragntr2, naomigd, naomigd, naomi, naomi_state, init_naomigd, ROT0, "Sega", "Dragon Treasure 2 (Rev A) (GDS-0037A)", GAME_FLAGS )
-// 0038
-// 0039 Initial D Arcade Stage Ver. 3 Cycraft Edition (GDS-0039)
-/* 0039A */ GAME( 2006, inidv3ca, inidv3cy,naomi2gd, naomi, naomi2_state, init_naomi2, ROT0, "Sega", "Initial D Arcade Stage Ver. 3 Cycraft Edition (Rev A) (GDS-0039A)", GAME_FLAGS )
-/* 0039B */ GAME( 2006, inidv3cy, naomi2, naomi2gd, naomi, naomi2_state, init_naomi2, ROT0, "Sega", "Initial D Arcade Stage Ver. 3 Cycraft Edition (Rev B) (GDS-0039B)", GAME_FLAGS )
-// 0040
+// 0038 Initial D Arcade Stage Ver. 3 Cycraft Edition (Japan) (NAOMI2 GDROM TOS SP)
+// 0039 Initial D Arcade Stage Ver. 3 Cycraft Edition (Export) (GDS-0039)
+/* 0039A */ GAME( 2004, inidv3ca, inidv3cy,naomi2gd, naomi, naomi2_state, init_naomi2, ROT0, "Sega", "Initial D Arcade Stage Ver. 3 Cycraft Edition (Export, Rev A) (GDS-0039A)", GAME_FLAGS )
+/* 0039B */ GAME( 2006, inidv3cy, naomi2, naomi2gd, naomi, naomi2_state, init_naomi2, ROT0, "Sega", "Initial D Arcade Stage Ver. 3 Cycraft Edition (Export, Rev B) (GDS-0039B)", GAME_FLAGS )
+// 0040 NAOMI2 GDROM MTG
// 0041 Dragon Treasure 3 (GDS-0041)
/* 0041A */ GAME( 2005, dragntr3, naomigd, naomigd, naomi, naomi_state, init_naomigd, ROT0, "Sega", "Dragon Treasure 3 (Rev A) (GDS-0041A)", GAME_FLAGS )
// 0042 NAOMI DIMM Firm Update for CF-BOX (GDS-0042)
-/* 0042A */ GAME( 2001, ndcfboxa, naomigd, naomigd, naomi, naomi_state, init_naomigd, ROT0, "Sega", "Naomi DIMM Firmware Update for CF-BOX (4.01) (GDS-0042A)", GAME_FLAGS )
+/* 0042A */ GAME( 2009, ndcfboxa, naomigd, naomigd, naomi, naomi_state, init_naomigd, ROT0, "Sega", "Naomi DIMM Firmware Update for CF-BOX (4.01) (GDS-0042A)", GAME_FLAGS )
// 00?? Get Bass 2 (GDS-00xx)
-// 00?? Pochinya (GDS-00xx)
+// 00?? Yonin Uchi Mahjong MJ, not sure it was released on GD-ROM, might be satellite CD/DVD, or even not for NAOMI but other hardware.
/* GDL-xxxx ("licensed by Sega" GD-ROM games) */
/* 0001 */ GAME( 2001, gundmgd, naomigd, naomigd, naomi, naomi_state, init_naomigd, ROT0,"Capcom / Banpresto","Mobile Suit Gundam: Federation Vs. Zeon (GDL-0001)", GAME_FLAGS )
@@ -11186,18 +11364,18 @@ ROM_END
/* 0004 */ GAME( 2001, cvsgd, naomigd, naomigd, naomi, naomi_state, init_naomigd, ROT0, "Capcom / SNK", "Capcom Vs. SNK Millennium Fight 2000 Pro (Japan) (GDL-0004)", MACHINE_IMPERFECT_GRAPHICS|MACHINE_IMPERFECT_SOUND )
/* 0005 */ GAME( 2001, starseek, naomigd, naomigd, naomi, naomi_state, init_naomigd, ROT0, "G.Rev", "Doki Doki Idol Star Seeker (GDL-0005)", MACHINE_IMPERFECT_GRAPHICS|MACHINE_IMPERFECT_SOUND )
/* 0006 */ GAME( 2001, gundmxgd, naomigd, naomigd, naomi, naomi_state, init_naomigd, ROT0, "Capcom", "Mobile Suit Gundam: Federation Vs. Zeon DX (USA, Japan) (GDL-0006)", GAME_FLAGS )
-// 0007 Capcom Vs. SNK 2 (GDL-0007)
-/* 0007A */ GAME( 2001, cvs2mf, cvs2, naomigd, naomi, naomi_state, init_naomigd, ROT0, "Capcom / SNK", "Capcom Vs. SNK 2 Millionaire Fighting 2001 (Rev A) (GDL-0007A)", GAME_FLAGS )
-/* 0008 */ GAME( 2001, cvs2, naomigd, naomigd, naomi, naomi_state, init_naomigd, ROT0, "Capcom / SNK", "Capcom Vs. SNK 2 Mark Of The Millennium 2001 (GDL-0008)", GAME_FLAGS )
-// 0009
+// 0007 Capcom Vs. SNK 2 (Japan) (GDL-0007)
+/* 0007A */ GAME( 2001, cvs2mf, cvs2, naomigd, naomi, naomi_state, init_naomigd, ROT0, "Capcom / SNK", "Capcom Vs. SNK 2 Millionaire Fighting 2001 (Japan, Rev A) (GDL-0007A)", GAME_FLAGS )
+/* 0008 */ GAME( 2001, cvs2, naomigd, naomigd, naomi, naomi_state, init_naomigd, ROT0, "Capcom / SNK", "Capcom Vs. SNK 2 Mark Of The Millennium 2001 (USA) (GDL-0008)", GAME_FLAGS )
+// 0009 Capcom Vs. SNK 2 (Export)
/* 0010 */ GAME( 2001, ikaruga, naomigd, naomigd, naomi, naomi_state, init_naomigd, ROT270, "Treasure", "Ikaruga (GDL-0010)", GAME_FLAGS )
/* 0011 */ GAME( 2002, ggxx, naomigd, naomigd, naomi, naomi_state, init_ggxx, ROT0,"Arc System Works","Guilty Gear XX (GDL-0011)", GAME_FLAGS )
-/* 0012 */ GAME( 2002, cleoftp, naomigd, naomigd, naomi, naomi_state, init_naomigd, ROT0, "Altron", "Cleopatra Fortune Plus (GDL-0012)", MACHINE_IMPERFECT_GRAPHICS|MACHINE_IMPERFECT_SOUND )
+/* 0012 */ GAME( 2002, cleoftp, naomigd, naomigd, naomi, naomi_state, init_naomigd, ROT0, "Altron / Taito", "Cleopatra Fortune Plus (GDL-0012)", MACHINE_IMPERFECT_GRAPHICS|MACHINE_IMPERFECT_SOUND )
/* 0013 */ GAME( 2002, moeru, naomigd, naomigd, naomi, naomi_state, init_naomigd, ROT0, "Altron", "Moeru Casinyo (Japan) (GDL-0013)", GAME_FLAGS )
// 0014 Musapey's Choco Marker (GDL-0014)
/* 0014A */ GAME( 2002, chocomk, naomigd, naomigd, naomi, naomi_state, init_naomigd, ROT0, "Ecole Software", "Musapey's Choco Marker (Rev A) (GDL-0014A)", GAME_FLAGS )
-// 0015
-// 0016 Yonin Uchi Mahjong MJ (GDL-0016)
+// 0015 GD SOFT MOGACHO
+// 0016 GD SOFT POCHI (Pochinya ?)
/* 0017 */ GAME( 2002, quizqgd, naomigd, naomigd, naomi, naomi_state, init_naomigd, ROT270, "Amedio (Taito license)","Quiz Keitai Q mode (GDL-0017)", GAME_FLAGS )
/* 0018 */ GAME( 2002, azumanga, naomigd, naomigd, naomi, naomi_state, init_naomigd, ROT0, "MOSS (Taito license)","Azumanga Daioh Puzzle Bobble (GDL-0018)", GAME_FLAGS )
/* 0019 */ GAME( 2003, ggxxrlo, ggxxrl, naomigd, naomi, naomi_state, init_ggxxrl, ROT0, "Arc System Works","Guilty Gear XX #Reload (Japan) (GDL-0019)", GAME_FLAGS )
@@ -11210,12 +11388,12 @@ ROM_END
/* 0024 */ GAME( 2003, psyvar2, naomigd, naomigd, naomi, naomi_state, init_naomigd, ROT270, "Success", "Psyvariar 2 - The Will To Fabricate (Japan) (GDL-0024)", GAME_FLAGS )
/* 0025 */ GAME( 2004, cfield, naomigd, naomigd, naomi, naomi_state, init_naomigd, ROT0, "Able", "Chaos Field (Japan) (GDL-0025)", GAME_FLAGS )
/* 0026 */ GAME( 2004, trizeal, naomigd, naomigd, naomi, naomi_state, init_naomigd, ROT270, "Triangle Service", "Trizeal (Japan) (GDL-0026)", GAME_FLAGS )
-// 0027
+// 0027 Chaos Field (Export)
/* 0028 */ GAME( 2005, meltyblo, meltybld,naomigd, naomi, naomi_state, init_naomigd, ROT0, "Ecole Software", "Melty Blood Act Cadenza (Japan) (GDL-0028)", GAME_FLAGS )
// 0028A Melty Blood Act Cadenza (Rev A) (GDL-0028A)
// 0028B Melty Blood Act Cadenza (Rev B) (GDL-0028B)
/* 0028C */ GAME( 2005, meltybld, naomigd, naomigd, naomi, naomi_state, init_naomigd, ROT0, "Ecole Software", "Melty Blood Act Cadenza Ver. A (Japan) (GDL-0028C)", GAME_FLAGS )
-// 0029
+// 0029 ExZeus - game was planned as GD-ROM release but was canceled, no GD discs was manufactured, only few prototype cartridges owned by game developer(s) known to exists
/* 0030 */ GAME( 2005, senkoo, senko, naomigd, naomi, naomi_state, init_naomigd, ROT0, "G.Rev", "Senko No Ronde (Japan) (GDL-0030)", GAME_FLAGS )
/* 0030A */ GAME( 2005, senko, naomigd, naomigd, naomi, naomi_state, init_naomigd, ROT0, "G.Rev", "Senko No Ronde (Japan, Rev A) (GDL-0030A)", GAME_FLAGS )
/* 0031 */ GAME( 2005, ss2005o, ss2005, naomigd, naomi, naomi_state, init_naomigd, ROT0, "Starfish", "Super Shanghai 2005 (Japan) (GDL-0031)", GAME_FLAGS )
@@ -11235,23 +11413,28 @@ ROM_END
/* 0040 */ GAME( 2006, karous, naomigd, naomigd, naomi, naomi_state, init_naomigd, ROT270, "Milestone", "Karous (Japan) (GDL-0040)", GAME_FLAGS )
/* 0041 */ GAME( 2006, ggxxac, naomigd, naomigd, naomi, naomi_state, init_naomigd, ROT0,"Arc System Works","Guilty Gear XX Accent Core (Japan) (GDL-0041)", GAME_FLAGS )
/* 0042 */ GAME( 2006, takoron, naomigd, naomigd, naomi, naomi_state, init_naomigd, ROT0, "Compile", "Noukone Puzzle Takoron (Japan) (GDL-0042)", GAME_FLAGS )
-// 00?? ExZeus - game was planned as GD-ROM release but was canceled, no GD discs was manufactured, only few prototype cartridges owned by game developer(s) known to exists
/* CDP-xxxxx and CDV-xxxxx (CD-ROM and DVD-ROM for Naomi 2 Satellite Terminal) */
+// CDP-10001?- World Club Champion Football Serie A 2001-2002 (Sega, 2002)
+// CDP-10001?- World Club Champion Football Serie A 2001-2002 Ver.1.2 (Sega, 2002)
/* CDP-10001C*/ GAME( 2003, wccf116, naomigd, naomigd, naomi, naomi_state, init_naomigd, ROT0, "Hitmaker / Sega", "World Club Champion Football Serie A 2001-2002 Ver.2 (Japan) (CDP-10001C)", GAME_FLAGS )
/* CDP-10003 */ GAME( 2002, wccf1dup, naomigd, naomigd, naomi, naomi_state, init_naomigd, ROT0, "Hitmaker / Sega", "World Club Champion Football Serie A 2001-2002 DIMM FIRM Ver.3.03 (CDP-10003)", GAME_FLAGS )
-/* CDV-10002 */ GAME( 2004, wccf212e, naomigd, naomigd, naomi, naomi_state, init_naomigd, ROT0, "Hitmaker / Sega", "World Club Champion Football Serie A 2002-2003 Ver.2.12 (Export) (CDV-10002)", GAME_FLAGS )
+// CDV-10001 - World Club Champion Football Serie A 2001-2002 Ver.2.11 (Japan) (Sega, 2002)
+/* CDV-10002 */ GAME( 2004, wccf212e, naomigd, naomigd, naomi, naomi_state, init_naomigd, ROT0, "Hitmaker / Sega", "World Club Champion Football Serie A 2002-2003 Ver.2.12 (Italy) (CDV-10002)", GAME_FLAGS )
+// CDV-10003 - World Club Champion Football Serie A 2002-2003 Ver.2 (Japan) (Sega, 2004)
+// CDV-10004 - World Club Champion Football Serie A 2002-2003 Ver.2 (Korea) (Sega, 2004)
/* CDV-10007 */ GAME( 2004, wccf2chk, naomigd, naomigd, naomi, naomi_state, init_naomigd, ROT0, "Hitmaker / Sega", "World Club Champion Football Serie A 2002-2003 Drive Checker (CDV-10007)", GAME_FLAGS ) // actually just disc ejector
/* CDV-10008 */ GAME( 2004, wccf234j, naomigd, naomigd, naomi, naomi_state, init_naomigd, ROT0, "Hitmaker / Sega", "World Club Champion Football Serie A 2002-2003 Ver.2.34 (Japan) (CDV-10008)", GAME_FLAGS )
-/* CDV-10013 */ GAME( 2005, wccf310j, naomigd, naomigd, naomi, naomi_state, init_naomigd, ROT0, "Sega", "World Club Champion Football European Clubs 2004-2005 (Japan) (CDV-10013)", GAME_FLAGS )
+// CDV-10011 - World Club Champion Football European Clubs 2004-2005 (Sega, 2005)
+// CDV-10011P- World Club Champion Football European Clubs 2004-2005 (Sega, 2005)
+/* CDV-10013 */ GAME( 2005, wccf310j, naomigd, naomigd, naomi, naomi_state, init_naomigd, ROT0, "Sega", "World Club Champion Football European Clubs 2004-2005 (Asia) (CDV-10013)", GAME_FLAGS )
/* CDV-10015 */ GAME( 2005, wccf331e, wccf322e,naomigd, naomi, naomi_state, init_naomigd, ROT0, "Sega", "World Club Champion Football European Clubs 2004-2005 Ver.1.1 (Export) (CDV-10015)", GAME_FLAGS )
/* CDV-10015P*/ GAME( 2005, wccf322e, naomigd, naomigd, naomi, naomi_state, init_naomigd, ROT0, "Sega", "World Club Champion Football European Clubs 2004-2005 Ver.3.22 (Export) (CDV-10015P)", GAME_FLAGS )
+// CDV-10020 - World Club Champion Football European Clubs 2004-2005 Ver.1.1 (Sega, 2005)
+// CDV-10021 - World Club Champion Football European Clubs 2004-2005 Ver.1.2 (Sega, 2005)
+// CDV-10025 - World Club Champion Football European Clubs 2005-2006 (Sega, 2006)
+// CDV-10025A- World Club Champion Football European Clubs 2005-2006 (Sega, 2006)
/* CDV-10027 */ GAME( 2006, wccf420e, naomigd, naomigd, naomi, naomi_state, init_naomigd, ROT0, "Sega", "World Club Champion Football European Clubs 2005-2006 (Export) (CDV-10027)", GAME_FLAGS )
-// CD?-????? - World Club Champion Football Serie A 2001-2002 (Sega, 2002)
-// CD?-????? - World Club Champion Football Serie A 2001-2002 Ver.1.2 (Sega, 2002)
-// CD?-????? - World Club Champion Football Serie A 2002-2003 Ver.2 (Sega, 2004)
-// CD?-????? - World Club Champion Football European Clubs 2004-2005 Ver.1.2 (Sega, 2005)
-// CD?-????? - World Club Champion Football European Clubs 2005-2006 bugfix (Sega, 2006)
/* MDA-Gxxxx (Compact Flash replacement of Naomi 2 GD-ROM releases) */
// 0001 - Club Kart Cycraft Edition (GDS-0029)
diff --git a/src/mame/drivers/nascom1.cpp b/src/mame/drivers/nascom1.cpp
index b03189cd72e..547d8ff98fe 100644
--- a/src/mame/drivers/nascom1.cpp
+++ b/src/mame/drivers/nascom1.cpp
@@ -14,6 +14,7 @@
#include "imagedev/cassette.h"
#include "imagedev/snapquik.h"
#include "machine/ay31015.h"
+#include "machine/clock.h"
#include "machine/ram.h"
#include "machine/z80pio.h"
@@ -85,8 +86,7 @@ private:
DECLARE_WRITE_LINE_MEMBER(nascom1_hd6402_so);
DECLARE_DEVICE_IMAGE_LOAD_MEMBER( nascom1_cassette );
DECLARE_DEVICE_IMAGE_UNLOAD_MEMBER( nascom1_cassette );
- DECLARE_SNAPSHOT_LOAD_MEMBER( nascom1 );
- DECLARE_SNAPSHOT_LOAD_MEMBER( charrom );
+ template<int Dest> DECLARE_SNAPSHOT_LOAD_MEMBER( nascom );
};
class nascom1_state : public nascom_state
@@ -110,7 +110,7 @@ class nascom2_state : public nascom_state
public:
nascom2_state(const machine_config &mconfig, device_type type, const char *tag) :
nascom_state(mconfig, type, tag),
- m_nasbus(*this, "nasbus"),
+ m_nasbus(*this, NASBUS_TAG),
m_socket1(*this, "socket1"),
m_socket2(*this, "socket2"),
m_lsw1(*this, "lsw1")
@@ -119,7 +119,6 @@ public:
void nascom2(machine_config &config);
void nascom2c(machine_config &config);
- void init_nascom2();
void init_nascom2c();
private:
@@ -231,9 +230,10 @@ DEVICE_IMAGE_UNLOAD_MEMBER( nascom_state, nascom1_cassette )
// SNAPSHOTS
//**************************************************************************
-SNAPSHOT_LOAD_MEMBER( nascom_state, nascom1 )
+template<int Dest>
+SNAPSHOT_LOAD_MEMBER( nascom_state, nascom )
{
- uint8_t line[28];
+ uint8_t line[29];
while (image.fread(&line, sizeof(line)) == sizeof(line))
{
@@ -244,38 +244,15 @@ SNAPSHOT_LOAD_MEMBER( nascom_state, nascom1 )
{
for (int i = 0; i < 8; i++)
{
- m_maincpu->space(AS_PROGRAM).write_byte(addr++, b[i]);
- }
- }
- else
- {
- image.seterror(IMAGE_ERROR_UNSPECIFIED, "Unsupported file format");
- return image_init_result::FAIL;
- }
- dummy = 0x00;
- while (!image.image_feof() && dummy != 0x0a && dummy != 0x1f)
- {
- image.fread(&dummy, 1);
- }
- }
-
- return image_init_result::PASS;
-}
-
-SNAPSHOT_LOAD_MEMBER(nascom_state, charrom)
-{
- uint8_t line[28];
-
- while (image.fread(&line, sizeof(line)) == sizeof(line))
- {
- unsigned int addr, b[8], dummy;
-
- if (sscanf((char *)line, "%4x %x %x %x %x %x %x %x %x",
- &addr, &b[0], &b[1], &b[2], &b[3], &b[4], &b[5], &b[6], &b[7]) == 9)
- {
- for (int i = 0; i < 8; i++)
- {
- m_gfx1_region->base()[addr++] = b[i];
+ switch (Dest)
+ {
+ case 0: // snapshot
+ m_maincpu->space(AS_PROGRAM).write_byte(addr++, b[i]);
+ break;
+ case 1: // character rom
+ m_gfx1_region->base()[addr++] = b[i];
+ break;
+ }
}
}
else
@@ -393,15 +370,6 @@ void nascom2_state::machine_reset()
m_maincpu->set_state_int(Z80_PC, m_lsw1->read() << 12);
}
-void nascom2_state::init_nascom2()
-{
- init_nascom();
-
- // setup nasbus
- m_nasbus->set_program_space(&m_maincpu->space(AS_PROGRAM));
- m_nasbus->set_io_space(&m_maincpu->space(AS_IO));
-}
-
// since we don't know for which regions we should disable ram, we just let other devices
// overwrite the region they need, and re-install our ram when they are disabled
WRITE_LINE_MEMBER( nascom2_state::ram_disable_w )
@@ -417,10 +385,6 @@ void nascom2_state::init_nascom2c()
{
// install memory
m_maincpu->space(AS_PROGRAM).install_ram(0x0000, 0x0000 + m_ram->size() - 1, m_ram->pointer());
-
- // setup nasbus
- m_nasbus->set_program_space(&m_maincpu->space(AS_PROGRAM));
- m_nasbus->set_io_space(&m_maincpu->space(AS_IO));
}
WRITE_LINE_MEMBER( nascom2_state::ram_disable_cpm_w )
@@ -701,11 +665,13 @@ void nascom_state::nascom(machine_config &config)
// uart
AY31015(config, m_hd6402);
- m_hd6402->set_tx_clock((16_MHz_XTAL / 16) / 256);
- m_hd6402->set_rx_clock((16_MHz_XTAL / 16) / 256);
m_hd6402->read_si_callback().set(FUNC(nascom_state::nascom1_hd6402_si));
m_hd6402->write_so_callback().set(FUNC(nascom_state::nascom1_hd6402_so));
+ clock_device &uart_clock(CLOCK(config, "uart_clock", (16_MHz_XTAL / 16) / 256));
+ uart_clock.signal_handler().set(m_hd6402, FUNC(ay31015_device::write_tcp));
+ uart_clock.signal_handler().append(m_hd6402, FUNC(ay31015_device::write_rcp));
+
// cassette is connected to the uart
CASSETTE(config, m_cassette);
m_cassette->set_interface("nascom_cass");
@@ -717,11 +683,11 @@ void nascom_state::nascom(machine_config &config)
RAM(config, m_ram).set_default_size("48K").set_extra_options("8K,16K,32K");
// devices
- snapshot_image_device &snapshot(SNAPSHOT(config, "snapshot", 0));
- snapshot.set_handler(snapquick_load_delegate(&SNAPSHOT_LOAD_NAME(nascom_state, nascom1), this), "nas", 0.5);
+ snapshot_image_device &snapshot(SNAPSHOT(config, "snapshot"));
+ snapshot.set_handler(snapquick_load_delegate(&SNAPSHOT_LOAD_NAME(nascom_state, nascom<0>), this), "nas", attotime::from_msec(500));
snapshot.set_interface("nascom_snap");
- snapshot_image_device &snapchar(SNAPSHOT(config, "snapchar", 0));
- snapchar.set_handler(snapquick_load_delegate(&SNAPSHOT_LOAD_NAME(nascom_state, charrom), this), "chr", 0.5);
+ snapshot_image_device &snapchar(SNAPSHOT(config, "snapchar"));
+ snapchar.set_handler(snapquick_load_delegate(&SNAPSHOT_LOAD_NAME(nascom_state, nascom<1>), this), "chr", attotime::from_msec(500));
snapchar.set_interface("nascom_char");
}
@@ -737,7 +703,8 @@ void nascom1_state::nascom1(machine_config &config)
SOFTWARE_LIST(config, "snap_list").set_original("nascom_snap").set_filter("NASCOM1");
}
-MACHINE_CONFIG_START(nascom2_state::nascom2)
+void nascom2_state::nascom2(machine_config &config)
+{
nascom(config);
Z80(config, m_maincpu, 16_MHz_XTAL / 4);
@@ -758,31 +725,32 @@ MACHINE_CONFIG_START(nascom2_state::nascom2)
m_socket2->set_device_load(device_image_load_delegate(&nascom2_state::device_image_load_socket2, this));
// nasbus expansion bus
- MCFG_NASBUS_ADD(NASBUS_TAG)
- MCFG_NASBUS_RAM_DISABLE_HANDLER(WRITELINE(*this, nascom2_state, ram_disable_w))
- MCFG_NASBUS_SLOT_ADD("nasbus1", nasbus_slot_cards, nullptr)
- MCFG_NASBUS_SLOT_ADD("nasbus2", nasbus_slot_cards, nullptr)
- MCFG_NASBUS_SLOT_ADD("nasbus3", nasbus_slot_cards, nullptr)
- MCFG_NASBUS_SLOT_ADD("nasbus4", nasbus_slot_cards, nullptr)
+ nasbus_device &nasbus(NASBUS(config, NASBUS_TAG));
+ nasbus.ram_disable().set(FUNC(nascom2_state::ram_disable_w));
+ nasbus.set_program_space(m_maincpu, AS_PROGRAM);
+ nasbus.set_io_space(m_maincpu, AS_IO);
+ NASBUS_SLOT(config, "nasbus1", nasbus_slot_cards, nullptr);
+ NASBUS_SLOT(config, "nasbus2", nasbus_slot_cards, nullptr);
+ NASBUS_SLOT(config, "nasbus3", nasbus_slot_cards, nullptr);
+ NASBUS_SLOT(config, "nasbus4", nasbus_slot_cards, nullptr);
// software
SOFTWARE_LIST(config, "snap_list").set_original("nascom_snap").set_filter("NASCOM2");
SOFTWARE_LIST(config, "socket_list").set_original("nascom_socket");
SOFTWARE_LIST(config, "floppy_list").set_original("nascom_flop");
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(nascom2_state::nascom2c)
+void nascom2_state::nascom2c(machine_config &config)
+{
nascom2(config);
m_maincpu->set_addrmap(AS_PROGRAM, &nascom2_state::nascom2c_mem);
m_ram->set_default_size("60K");
- MCFG_DEVICE_MODIFY(NASBUS_TAG)
- MCFG_NASBUS_RAM_DISABLE_HANDLER(WRITELINE(*this, nascom2_state, ram_disable_cpm_w))
- MCFG_DEVICE_MODIFY("nasbus1")
- MCFG_SLOT_DEFAULT_OPTION("floppy")
-MACHINE_CONFIG_END
+ subdevice<nasbus_device>(NASBUS_TAG)->ram_disable().set(FUNC(nascom2_state::ram_disable_cpm_w));
+ subdevice<nasbus_slot_device>("nasbus1")->set_default_option("floppy");
+}
//**************************************************************************
@@ -845,5 +813,5 @@ ROM_END
// YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS
COMP( 1978, nascom1, 0, 0, nascom1, nascom1, nascom1_state, init_nascom, "Nascom Microcomputers", "Nascom 1", MACHINE_NO_SOUND_HW )
-COMP( 1979, nascom2, 0, 0, nascom2, nascom2, nascom2_state, init_nascom2, "Nascom Microcomputers", "Nascom 2", MACHINE_NO_SOUND_HW )
+COMP( 1979, nascom2, 0, 0, nascom2, nascom2, nascom2_state, init_nascom, "Nascom Microcomputers", "Nascom 2", MACHINE_NO_SOUND_HW )
COMP( 1980, nascom2c, nascom2, 0, nascom2c, nascom2c, nascom2_state, init_nascom2c, "Nascom Microcomputers", "Nascom 2 (CP/M)", MACHINE_NO_SOUND_HW )
diff --git a/src/mame/drivers/nbmj8688.cpp b/src/mame/drivers/nbmj8688.cpp
index d4ebe4c45ed..bbb4bbd7773 100644
--- a/src/mame/drivers/nbmj8688.cpp
+++ b/src/mame/drivers/nbmj8688.cpp
@@ -2453,23 +2453,23 @@ READ8_MEMBER(nbmj8688_state::dipsw2_r)
return m_nb1413m3->dipsw2_r(space,offset);
}
-MACHINE_CONFIG_START(nbmj8688_state::NBMJDRV_4096)
-
+void nbmj8688_state::NBMJDRV_4096(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, 5000000) /* 5.00 MHz */
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", nbmj8688_state, irq0_line_hold)
+ Z80(config, m_maincpu, 5000000); /* 5.00 MHz */
+ m_maincpu->set_vblank_int("screen", FUNC(nbmj8688_state::irq0_line_hold));
NB1413M3(config, m_nb1413m3, 0);
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(512, 256)
- MCFG_SCREEN_VISIBLE_AREA(0, 512-1, 16, 240-1)
- MCFG_SCREEN_UPDATE_DRIVER(nbmj8688_state, screen_update)
- MCFG_SCREEN_PALETTE("palette")
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(512, 256);
+ screen.set_visarea(0, 512-1, 16, 240-1);
+ screen.set_screen_update(FUNC(nbmj8688_state::screen_update));
+ screen.set_palette("palette");
PALETTE(config, "palette", FUNC(nbmj8688_state::mbmj8688_12bit), 4096);
@@ -2483,12 +2483,14 @@ MACHINE_CONFIG_START(nbmj8688_state::NBMJDRV_4096)
psg.port_b_read_callback().set(FUNC(nbmj8688_state::dipsw2_r)); // DIPSW-B read
psg.add_route(ALL_OUTPUTS, "speaker", 0.35);
- MCFG_DEVICE_ADD("dac", DAC_8BIT_R2R, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 0.5) // unknown DAC
- MCFG_DEVICE_ADD("vref", VOLTAGE_REGULATOR, 0) MCFG_VOLTAGE_REGULATOR_OUTPUT(5.0)
- MCFG_SOUND_ROUTE(0, "dac", 1.0, DAC_VREF_POS_INPUT) MCFG_SOUND_ROUTE(0, "dac", -1.0, DAC_VREF_NEG_INPUT)
-MACHINE_CONFIG_END
+ DAC_8BIT_R2R(config, "dac", 0).add_route(ALL_OUTPUTS, "speaker", 0.5); // unknown DAC
+ voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref"));
+ vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT);
+ vref.add_route(0, "dac", -1.0, DAC_VREF_NEG_INPUT);
+}
-MACHINE_CONFIG_START(nbmj8688_state::NBMJDRV_256)
+void nbmj8688_state::NBMJDRV_256(machine_config &config)
+{
NBMJDRV_4096(config);
/* basic machine hardware */
@@ -2497,9 +2499,10 @@ MACHINE_CONFIG_START(nbmj8688_state::NBMJDRV_256)
subdevice<palette_device>("palette")->set_entries(256).set_init(FUNC(nbmj8688_state::mbmj8688_8bit));
MCFG_VIDEO_START_OVERRIDE(nbmj8688_state,mbmj8688_8bit)
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(nbmj8688_state::NBMJDRV_65536)
+void nbmj8688_state::NBMJDRV_65536(machine_config &config)
+{
NBMJDRV_4096(config);
/* basic machine hardware */
@@ -2508,20 +2511,20 @@ MACHINE_CONFIG_START(nbmj8688_state::NBMJDRV_65536)
subdevice<palette_device>("palette")->set_entries(65536).set_init(FUNC(nbmj8688_state::mbmj8688_16bit));
MCFG_VIDEO_START_OVERRIDE(nbmj8688_state,mbmj8688_hybrid_16bit)
-MACHINE_CONFIG_END
+}
// --------------------------------------------------------------------------------
-MACHINE_CONFIG_START(nbmj8688_state::crystalg)
+void nbmj8688_state::crystalg(machine_config &config)
+{
NBMJDRV_256(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(secolove_map)
- MCFG_DEVICE_IO_MAP(crystalg_io_map)
+ m_maincpu->set_addrmap(AS_PROGRAM, &nbmj8688_state::secolove_map);
+ m_maincpu->set_addrmap(AS_IO, &nbmj8688_state::crystalg_io_map);
m_nb1413m3->set_type(NB1413M3_CRYSTALG);
-MACHINE_CONFIG_END
+}
void nbmj8688_state::crystal2(machine_config &config)
{
@@ -2537,28 +2540,28 @@ void nbmj8688_state::nightlov(machine_config &config)
m_nb1413m3->set_type(NB1413M3_NIGHTLOV);
}
-MACHINE_CONFIG_START(nbmj8688_state::apparel)
+void nbmj8688_state::apparel(machine_config &config)
+{
NBMJDRV_256(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(secolove_map)
- MCFG_DEVICE_IO_MAP(secolove_io_map)
+ m_maincpu->set_addrmap(AS_PROGRAM, &nbmj8688_state::secolove_map);
+ m_maincpu->set_addrmap(AS_IO, &nbmj8688_state::secolove_io_map);
m_nb1413m3->set_type(NB1413M3_APPAREL);
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(nbmj8688_state::mbmj_h12bit)
+void nbmj8688_state::mbmj_h12bit(machine_config &config)
+{
NBMJDRV_4096(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(secolove_map)
- MCFG_DEVICE_IO_MAP(secolove_io_map)
+ m_maincpu->set_addrmap(AS_PROGRAM, &nbmj8688_state::secolove_map);
+ m_maincpu->set_addrmap(AS_IO, &nbmj8688_state::secolove_io_map);
/* video hardware */
MCFG_VIDEO_START_OVERRIDE(nbmj8688_state,mbmj8688_hybrid_12bit)
-MACHINE_CONFIG_END
+}
void nbmj8688_state::citylove(machine_config &config)
{
@@ -2582,42 +2585,40 @@ void nbmj8688_state::secolove(machine_config &config)
}
/*Same as h12bit HW with different sound HW + NMI enable bit*/
-MACHINE_CONFIG_START(nbmj8688_state::barline)
+void nbmj8688_state::barline(machine_config &config)
+{
mbmj_h12bit(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_IO_MAP(barline_io_map)
+ m_maincpu->set_addrmap(AS_IO, &nbmj8688_state::barline_io_map);
m_nb1413m3->set_type(NB1413M3_BARLINE);
- MCFG_DEVICE_REPLACE("psg", YM3812, 20000000/8)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 0.35)
+ YM3812(config.replace(), "psg", 20000000/8).add_route(ALL_OUTPUTS, "speaker", 0.35);
config.device_remove("dac");
config.device_remove("vref");
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(nbmj8688_state::mbmj_p16bit)
+void nbmj8688_state::mbmj_p16bit(machine_config &config)
+{
NBMJDRV_65536(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(secolove_map)
- MCFG_DEVICE_IO_MAP(secolove_io_map)
+ m_maincpu->set_addrmap(AS_PROGRAM, &nbmj8688_state::secolove_map);
+ m_maincpu->set_addrmap(AS_IO, &nbmj8688_state::secolove_io_map);
/* video hardware */
MCFG_VIDEO_START_OVERRIDE(nbmj8688_state,mbmj8688_pure_16bit)
-MACHINE_CONFIG_END
-
-MACHINE_CONFIG_START(nbmj8688_state::mbmj_p16bit_LCD)
+}
+void nbmj8688_state::mbmj_p16bit_LCD(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, 5000000) /* 5.00 MHz */
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", nbmj8688_state, irq0_line_hold)
- MCFG_DEVICE_PROGRAM_MAP(secolove_map)
- MCFG_DEVICE_IO_MAP(secolove_io_map)
- MCFG_DEVICE_IO_MAP(p16bit_LCD_io_map)
+ Z80(config, m_maincpu, 5000000); /* 5.00 MHz */
+ m_maincpu->set_vblank_int("screen", FUNC(nbmj8688_state::irq0_line_hold));
+ m_maincpu->set_addrmap(AS_PROGRAM, &nbmj8688_state::secolove_map);
+ m_maincpu->set_addrmap(AS_IO, &nbmj8688_state::p16bit_LCD_io_map);
NB1413M3(config, m_nb1413m3, 0);
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
@@ -2626,13 +2627,13 @@ MACHINE_CONFIG_START(nbmj8688_state::mbmj_p16bit_LCD)
PALETTE(config, "palette", FUNC(nbmj8688_state::mbmj8688_16bit), 65536);
config.set_default_layout(layout_nbmj8688);
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(512, 256)
- MCFG_SCREEN_VISIBLE_AREA(0, 512-1, 16, 240-1)
- MCFG_SCREEN_UPDATE_DRIVER(nbmj8688_state, screen_update)
- MCFG_SCREEN_PALETTE("palette")
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(512, 256);
+ screen.set_visarea(0, 512-1, 16, 240-1);
+ screen.set_screen_update(FUNC(nbmj8688_state::screen_update));
+ screen.set_palette("palette");
PALETTE(config, "palette_lcd", FUNC(nbmj8688_state::mbmj8688_lcd), 2);
@@ -2645,8 +2646,8 @@ MACHINE_CONFIG_START(nbmj8688_state::mbmj_p16bit_LCD)
lcd0.set_visarea(0, 480-1, 0, 64-1);
lcd0.set_screen_update("lcdc0", FUNC(hd61830_device::screen_update));
lcd0.set_palette("palette_lcd");
- MCFG_DEVICE_ADD("lcdc0", HD61830B, 5000000/2) // ???
- MCFG_VIDEO_SET_SCREEN("lcd0")
+ HD61830B(config, m_lcdc0, 5000000/2); // ???
+ m_lcdc0->set_screen("lcd0");
screen_device &lcd1(SCREEN(config, "lcd1", SCREEN_TYPE_LCD));
lcd1.set_physical_aspect(15, 3);
@@ -2657,8 +2658,8 @@ MACHINE_CONFIG_START(nbmj8688_state::mbmj_p16bit_LCD)
lcd1.set_visarea(0, 480-1, 0, 64-1);
lcd1.set_screen_update("lcdc1", FUNC(hd61830_device::screen_update));
lcd1.set_palette("palette_lcd");
- MCFG_DEVICE_ADD("lcdc1", HD61830B, 5000000/2) // ???
- MCFG_VIDEO_SET_SCREEN("lcd1")
+ HD61830B(config, m_lcdc1, 5000000/2); // ???
+ m_lcdc1->set_screen("lcd1");
MCFG_VIDEO_START_OVERRIDE(nbmj8688_state,mbmj8688_pure_16bit_LCD)
@@ -2670,10 +2671,11 @@ MACHINE_CONFIG_START(nbmj8688_state::mbmj_p16bit_LCD)
psg.port_b_read_callback().set(FUNC(nbmj8688_state::dipsw2_r)); // DIPSW-B read
psg.add_route(ALL_OUTPUTS, "speaker", 0.35);
- MCFG_DEVICE_ADD("dac", DAC_8BIT_R2R, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 0.5) // unknown DAC
- MCFG_DEVICE_ADD("vref", VOLTAGE_REGULATOR, 0) MCFG_VOLTAGE_REGULATOR_OUTPUT(5.0)
- MCFG_SOUND_ROUTE(0, "dac", 1.0, DAC_VREF_POS_INPUT) MCFG_SOUND_ROUTE(0, "dac", -1.0, DAC_VREF_NEG_INPUT)
-MACHINE_CONFIG_END
+ DAC_8BIT_R2R(config, "dac", 0).add_route(ALL_OUTPUTS, "speaker", 0.5); // unknown DAC
+ voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref"));
+ vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT);
+ vref.add_route(0, "dac", -1.0, DAC_VREF_NEG_INPUT);
+}
void nbmj8688_state::bijokkoy(machine_config &config)
{
@@ -2731,16 +2733,16 @@ void nbmj8688_state::vipclub(machine_config &config)
m_nb1413m3->set_type(NB1413M3_VIPCLUB);
}
-MACHINE_CONFIG_START(nbmj8688_state::seiha)
+void nbmj8688_state::seiha(machine_config &config)
+{
NBMJDRV_65536(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(secolove_map)
- MCFG_DEVICE_IO_MAP(seiha_io_map)
+ m_maincpu->set_addrmap(AS_PROGRAM, &nbmj8688_state::secolove_map);
+ m_maincpu->set_addrmap(AS_IO, &nbmj8688_state::seiha_io_map);
m_nb1413m3->set_type(NB1413M3_SEIHA);
-MACHINE_CONFIG_END
+}
void nbmj8688_state::seiham(machine_config &config)
{
@@ -2749,39 +2751,39 @@ void nbmj8688_state::seiham(machine_config &config)
m_nb1413m3->set_type(NB1413M3_SEIHAM);
}
-MACHINE_CONFIG_START(nbmj8688_state::mjgaiden)
+void nbmj8688_state::mjgaiden(machine_config &config)
+{
NBMJDRV_4096(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(ojousan_map)
- MCFG_DEVICE_IO_MAP(mjgaiden_io_map)
+ m_maincpu->set_addrmap(AS_PROGRAM, &nbmj8688_state::ojousan_map);
+ m_maincpu->set_addrmap(AS_IO, &nbmj8688_state::mjgaiden_io_map);
m_nb1413m3->set_type(NB1413M3_OJOUSAN);
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(nbmj8688_state::iemoto)
+void nbmj8688_state::iemoto(machine_config &config)
+{
NBMJDRV_65536(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(secolove_map)
- MCFG_DEVICE_IO_MAP(iemoto_io_map)
+ m_maincpu->set_addrmap(AS_PROGRAM, &nbmj8688_state::secolove_map);
+ m_maincpu->set_addrmap(AS_IO, &nbmj8688_state::iemoto_io_map);
m_nb1413m3->set_type(NB1413M3_IEMOTO);
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(nbmj8688_state::ojousan)
+void nbmj8688_state::ojousan(machine_config &config)
+{
NBMJDRV_65536(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(ojousan_map)
- MCFG_DEVICE_IO_MAP(iemoto_io_map)
+ m_maincpu->set_addrmap(AS_PROGRAM, &nbmj8688_state::ojousan_map);
+ m_maincpu->set_addrmap(AS_IO, &nbmj8688_state::iemoto_io_map);
m_nb1413m3->set_type(NB1413M3_OJOUSAN);
-MACHINE_CONFIG_END
+}
void nbmj8688_state::ojousanm(machine_config &config)
{
@@ -2790,13 +2792,13 @@ void nbmj8688_state::ojousanm(machine_config &config)
m_nb1413m3->set_type(NB1413M3_OJOUSANM);
}
-MACHINE_CONFIG_START(nbmj8688_state::swinggal)
+void nbmj8688_state::swinggal(machine_config &config)
+{
ojousan(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(secolove_map)
- MCFG_DEVICE_IO_MAP(iemoto_io_map)
-MACHINE_CONFIG_END
+ m_maincpu->set_addrmap(AS_PROGRAM, &nbmj8688_state::secolove_map);
+ m_maincpu->set_addrmap(AS_IO, &nbmj8688_state::iemoto_io_map);
+}
void nbmj8688_state::iemotom(machine_config &config)
{
@@ -2826,14 +2828,14 @@ void nbmj8688_state::korinaim(machine_config &config)
m_nb1413m3->set_type(NB1413M3_KORINAIM);
}
-MACHINE_CONFIG_START(nbmj8688_state::mbmj_p12bit)
+void nbmj8688_state::mbmj_p12bit(machine_config &config)
+{
NBMJDRV_4096(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(mjsikaku_map)
- MCFG_DEVICE_IO_MAP(kaguya_io_map)
-MACHINE_CONFIG_END
+ m_maincpu->set_addrmap(AS_PROGRAM, &nbmj8688_state::mjsikaku_map);
+ m_maincpu->set_addrmap(AS_IO, &nbmj8688_state::kaguya_io_map);
+}
void nbmj8688_state::kaguya(machine_config &config)
{
@@ -2870,41 +2872,40 @@ void nbmj8688_state::idhimitu(machine_config &config)
m_nb1413m3->set_type(NB1413M3_IDHIMITU);
}
-MACHINE_CONFIG_START(nbmj8688_state::mjsikaku)
+void nbmj8688_state::mjsikaku(machine_config &config)
+{
NBMJDRV_4096(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(mjsikaku_map)
- MCFG_DEVICE_IO_MAP(mjsikaku_io_map)
+ m_maincpu->set_addrmap(AS_PROGRAM, &nbmj8688_state::mjsikaku_map);
+ m_maincpu->set_addrmap(AS_IO, &nbmj8688_state::mjsikaku_io_map);
m_nb1413m3->set_type(NB1413M3_MJSIKAKU);
/* sound hardware */
- MCFG_DEVICE_REPLACE("psg", YM3812, 20000000/8)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 0.7)
-MACHINE_CONFIG_END
+ YM3812(config.replace(), "psg", 20000000/8).add_route(ALL_OUTPUTS, "speaker", 0.7);
+}
-MACHINE_CONFIG_START(nbmj8688_state::mmsikaku)
+void nbmj8688_state::mmsikaku(machine_config &config)
+{
NBMJDRV_4096(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(secolove_map)
- MCFG_DEVICE_IO_MAP(mmsikaku_io_map)
+ m_maincpu->set_addrmap(AS_PROGRAM, &nbmj8688_state::secolove_map);
+ m_maincpu->set_addrmap(AS_IO, &nbmj8688_state::mmsikaku_io_map);
m_nb1413m3->set_type(NB1413M3_MMSIKAKU);
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(nbmj8688_state::otonano)
+void nbmj8688_state::otonano(machine_config &config)
+{
mjsikaku(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_IO_MAP(otonano_io_map)
+ m_maincpu->set_addrmap(AS_IO, &nbmj8688_state::otonano_io_map);
m_nb1413m3->set_type(NB1413M3_OTONANO);
-MACHINE_CONFIG_END
+}
void nbmj8688_state::mjcamera(machine_config &config)
{
diff --git a/src/mame/drivers/nbmj8891.cpp b/src/mame/drivers/nbmj8891.cpp
index 233225b3b3e..760357e048e 100644
--- a/src/mame/drivers/nbmj8891.cpp
+++ b/src/mame/drivers/nbmj8891.cpp
@@ -2189,26 +2189,26 @@ static INPUT_PORTS_START( taiwanmb )
INPUT_PORTS_END
-MACHINE_CONFIG_START(nbmj8891_state::gionbana)
-
+void nbmj8891_state::gionbana(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, 20000000/4) /* 5.00 MHz ? */
- MCFG_DEVICE_PROGRAM_MAP(gionbana_map)
- MCFG_DEVICE_IO_MAP(gionbana_io_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", nbmj8891_state, irq0_line_hold)
+ Z80(config, m_maincpu, 20000000/4); /* 5.00 MHz ? */
+ m_maincpu->set_addrmap(AS_PROGRAM, &nbmj8891_state::gionbana_map);
+ m_maincpu->set_addrmap(AS_IO, &nbmj8891_state::gionbana_io_map);
+ m_maincpu->set_vblank_int("screen", FUNC(nbmj8891_state::irq0_line_hold));
NB1413M3(config, m_nb1413m3, 0, NB1413M3_GIONBANA);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(512, 256)
- MCFG_SCREEN_VISIBLE_AREA(0, 512-1, 8, 248-1)
- MCFG_SCREEN_UPDATE_DRIVER(nbmj8891_state, screen_update)
- MCFG_SCREEN_PALETTE("palette")
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_refresh_hz(60);
+ m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ m_screen->set_size(512, 256);
+ m_screen->set_visarea(0, 512-1, 8, 248-1);
+ m_screen->set_screen_update(FUNC(nbmj8891_state::screen_update));
+ m_screen->set_palette(m_palette);
- MCFG_PALETTE_ADD("palette", 256)
+ PALETTE(config, m_palette).set_entries(256);
/* sound hardware */
@@ -2216,31 +2216,32 @@ MACHINE_CONFIG_START(nbmj8891_state::gionbana)
YM3812(config, "fmsnd", 2500000).add_route(ALL_OUTPUTS, "speaker", 0.5);
- MCFG_DEVICE_ADD("dac", DAC_8BIT_R2R, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 0.37) // unknown DAC
- MCFG_DEVICE_ADD("vref", VOLTAGE_REGULATOR, 0) MCFG_VOLTAGE_REGULATOR_OUTPUT(5.0)
- MCFG_SOUND_ROUTE(0, "dac", 1.0, DAC_VREF_POS_INPUT) MCFG_SOUND_ROUTE(0, "dac", -1.0, DAC_VREF_NEG_INPUT)
-MACHINE_CONFIG_END
+ DAC_8BIT_R2R(config, "dac", 0).add_route(ALL_OUTPUTS, "speaker", 0.37); // unknown DAC
+ voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref"));
+ vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT);
+ vref.add_route(0, "dac", -1.0, DAC_VREF_NEG_INPUT);
+}
-MACHINE_CONFIG_START(nbmj8891_state::mgion)
+void nbmj8891_state::mgion(machine_config &config)
+{
gionbana(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(mgion_map)
- MCFG_DEVICE_IO_MAP(mgion_io_map)
+ m_maincpu->set_addrmap(AS_PROGRAM, &nbmj8891_state::mgion_map);
+ m_maincpu->set_addrmap(AS_IO, &nbmj8891_state::mgion_io_map);
m_nb1413m3->set_type(NB1413M3_MGION);
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(nbmj8891_state::omotesnd)
+void nbmj8891_state::omotesnd(machine_config &config)
+{
gionbana(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(omotesnd_map)
- MCFG_DEVICE_IO_MAP(omotesnd_io_map)
+ m_maincpu->set_addrmap(AS_PROGRAM, &nbmj8891_state::omotesnd_map);
+ m_maincpu->set_addrmap(AS_IO, &nbmj8891_state::omotesnd_io_map);
m_nb1413m3->set_type(NB1413M3_OMOTESND);
@@ -2251,7 +2252,7 @@ MACHINE_CONFIG_START(nbmj8891_state::omotesnd)
fmsnd.port_a_read_callback().set_ioport("DSWA");
fmsnd.port_b_read_callback().set_ioport("DSWB");
fmsnd.add_route(ALL_OUTPUTS, "speaker", 0.35);
-MACHINE_CONFIG_END
+}
void nbmj8891_state::abunai(machine_config &config)
{
@@ -2261,76 +2262,74 @@ void nbmj8891_state::abunai(machine_config &config)
}
/* NBMJDRV2 */
-MACHINE_CONFIG_START(nbmj8891_state::mjcamerb)
+void nbmj8891_state::mjcamerb(machine_config &config)
+{
gionbana(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_IO_MAP(hanamomo_io_map)
+ m_maincpu->set_addrmap(AS_IO, &nbmj8891_state::hanamomo_io_map);
m_nb1413m3->set_type(NB1413M3_MJCAMERB);
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
/* video hardware */
- MCFG_SCREEN_MODIFY("screen")
- MCFG_SCREEN_VISIBLE_AREA(0, 512-1, 16, 240-1)
+ m_screen->set_visarea(0, 512-1, 16, 240-1);
MCFG_VIDEO_START_OVERRIDE(nbmj8891_state,_1layer)
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(nbmj8891_state::mmcamera)
+void nbmj8891_state::mmcamera(machine_config &config)
+{
gionbana(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_IO_MAP(hanamomo_io_map)
+ m_maincpu->set_addrmap(AS_IO, &nbmj8891_state::hanamomo_io_map);
m_nb1413m3->set_type(NB1413M3_MMCAMERA);
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
/* video hardware */
- MCFG_SCREEN_MODIFY("screen")
- MCFG_SCREEN_VISIBLE_AREA(0, 512-1, 16, 240-1)
+ m_screen->set_visarea(0, 512-1, 16, 240-1);
MCFG_VIDEO_START_OVERRIDE(nbmj8891_state,_1layer)
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(nbmj8891_state::hanamomo)
+void nbmj8891_state::hanamomo(machine_config &config)
+{
gionbana(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(hanamomo_map)
- MCFG_DEVICE_IO_MAP(hanamomo_io_map)
+ m_maincpu->set_addrmap(AS_PROGRAM, &nbmj8891_state::hanamomo_map);
+ m_maincpu->set_addrmap(AS_IO, &nbmj8891_state::hanamomo_io_map);
m_nb1413m3->set_type(NB1413M3_HANAMOMO);
/* video hardware */
- MCFG_SCREEN_MODIFY("screen")
- MCFG_SCREEN_VISIBLE_AREA(0, 512-1, 16, 240-1)
+ m_screen->set_visarea(0, 512-1, 16, 240-1);
MCFG_VIDEO_START_OVERRIDE(nbmj8891_state,_1layer)
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(nbmj8891_state::msjiken)
+void nbmj8891_state::msjiken(machine_config &config)
+{
hanamomo(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(gionbana_map)
- MCFG_DEVICE_IO_MAP(msjiken_io_map)
+ m_maincpu->set_addrmap(AS_PROGRAM, &nbmj8891_state::gionbana_map);
+ m_maincpu->set_addrmap(AS_IO, &nbmj8891_state::msjiken_io_map);
m_nb1413m3->set_type(NB1413M3_MSJIKEN);
-MACHINE_CONFIG_END
+}
/* NBMJDRV3 */
-MACHINE_CONFIG_START(nbmj8891_state::telmahjn)
+void nbmj8891_state::telmahjn(machine_config &config)
+{
gionbana(config);
m_nb1413m3->set_type(NB1413M3_TELMAHJN);
/* video hardware */
MCFG_VIDEO_START_OVERRIDE(nbmj8891_state,_1layer)
-MACHINE_CONFIG_END
+}
void nbmj8891_state::mgmen89(machine_config &config)
{
@@ -2340,7 +2339,8 @@ void nbmj8891_state::mgmen89(machine_config &config)
}
/* NBMJDRV4 */
-MACHINE_CONFIG_START(nbmj8891_state::mjfocus)
+void nbmj8891_state::mjfocus(machine_config &config)
+{
gionbana(config);
/* basic machine hardware */
@@ -2349,7 +2349,7 @@ MACHINE_CONFIG_START(nbmj8891_state::mjfocus)
/* video hardware */
MCFG_VIDEO_START_OVERRIDE(nbmj8891_state,_1layer)
-MACHINE_CONFIG_END
+}
void nbmj8891_state::pairsnb(machine_config &config)
{
@@ -2366,105 +2366,105 @@ void nbmj8891_state::pairsten(machine_config &config)
}
/* NBMJDRV5 */
-MACHINE_CONFIG_START(nbmj8891_state::mjnanpas)
+void nbmj8891_state::mjnanpas(machine_config &config)
+{
gionbana(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(club90s_map)
+ m_maincpu->set_addrmap(AS_PROGRAM, &nbmj8891_state::club90s_map);
m_nb1413m3->set_type(NB1413M3_MJNANPAS);
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(nbmj8891_state::maiko)
+void nbmj8891_state::maiko(machine_config &config)
+{
mjnanpas(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(maiko_map)
- MCFG_DEVICE_IO_MAP(maiko_io_map)
+ m_maincpu->set_addrmap(AS_PROGRAM, &nbmj8891_state::maiko_map);
+ m_maincpu->set_addrmap(AS_IO, &nbmj8891_state::maiko_io_map);
m_nb1413m3->set_type(NB1413M3_MAIKO);
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(nbmj8891_state::mmaiko)
+void nbmj8891_state::mmaiko(machine_config &config)
+{
maiko(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(mmaiko_map)
+ m_maincpu->set_addrmap(AS_PROGRAM, &nbmj8891_state::mmaiko_map);
m_nb1413m3->set_type(NB1413M3_MMAIKO);
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(nbmj8891_state::lovehous)
+void nbmj8891_state::lovehous(machine_config &config)
+{
mjnanpas(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(lovehous_map)
- MCFG_DEVICE_IO_MAP(lovehous_io_map)
+ m_maincpu->set_addrmap(AS_PROGRAM, &nbmj8891_state::lovehous_map);
+ m_maincpu->set_addrmap(AS_IO, &nbmj8891_state::lovehous_io_map);
m_nb1413m3->set_type(NB1413M3_LOVEHOUS);
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(nbmj8891_state::hanaoji)
+void nbmj8891_state::hanaoji(machine_config &config)
+{
maiko(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(hanaoji_map)
+ m_maincpu->set_addrmap(AS_PROGRAM, &nbmj8891_state::hanaoji_map);
m_nb1413m3->set_type(NB1413M3_HANAOJI);
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(nbmj8891_state::hnxmasev)
+void nbmj8891_state::hnxmasev(machine_config &config)
+{
maiko(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(hnxmasev_map)
- MCFG_DEVICE_IO_MAP(maiko_io_map)
-MACHINE_CONFIG_END
+ m_maincpu->set_addrmap(AS_PROGRAM, &nbmj8891_state::hnxmasev_map);
+ m_maincpu->set_addrmap(AS_IO, &nbmj8891_state::maiko_io_map);
+}
-MACHINE_CONFIG_START(nbmj8891_state::hnageman)
+void nbmj8891_state::hnageman(machine_config &config)
+{
maiko(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(hnageman_map)
- MCFG_DEVICE_IO_MAP(maiko_io_map)
-MACHINE_CONFIG_END
+ m_maincpu->set_addrmap(AS_PROGRAM, &nbmj8891_state::hnageman_map);
+ m_maincpu->set_addrmap(AS_IO, &nbmj8891_state::maiko_io_map);
+}
-MACHINE_CONFIG_START(nbmj8891_state::scandal)
+void nbmj8891_state::scandal(machine_config &config)
+{
hanamomo(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(scandalm_map)
- MCFG_DEVICE_IO_MAP(scandal_io_map)
+ m_maincpu->set_addrmap(AS_PROGRAM, &nbmj8891_state::scandalm_map);
+ m_maincpu->set_addrmap(AS_IO, &nbmj8891_state::scandal_io_map);
m_nb1413m3->set_type(NB1413M3_SCANDAL);
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(nbmj8891_state::bananadr)
+void nbmj8891_state::bananadr(machine_config &config)
+{
mjnanpas(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(scandalm_map)
- MCFG_DEVICE_IO_MAP(bananadr_io_map)
+ m_maincpu->set_addrmap(AS_PROGRAM, &nbmj8891_state::scandalm_map);
+ m_maincpu->set_addrmap(AS_IO, &nbmj8891_state::bananadr_io_map);
m_nb1413m3->set_type(NB1413M3_BANANADR);
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
-MACHINE_CONFIG_END
+}
void nbmj8891_state::club90s(machine_config &config)
{
@@ -2488,21 +2488,20 @@ void nbmj8891_state::chinmoku(machine_config &config)
}
/* NBMJDRV6 */
-MACHINE_CONFIG_START(nbmj8891_state::mjfocusm)
+void nbmj8891_state::mjfocusm(machine_config &config)
+{
gionbana(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(scandalm_map)
- MCFG_DEVICE_IO_MAP(scandalm_io_map)
+ m_maincpu->set_addrmap(AS_PROGRAM, &nbmj8891_state::scandalm_map);
+ m_maincpu->set_addrmap(AS_IO, &nbmj8891_state::scandalm_io_map);
m_nb1413m3->set_type(NB1413M3_MJFOCUSM);
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
/* video hardware */
- MCFG_SCREEN_MODIFY("screen")
- MCFG_SCREEN_VISIBLE_AREA(0, 512-1, 16, 240-1)
+ m_screen->set_visarea(0, 512-1, 16, 240-1);
MCFG_VIDEO_START_OVERRIDE(nbmj8891_state,_1layer)
/* sound hardware */
@@ -2510,7 +2509,7 @@ MACHINE_CONFIG_START(nbmj8891_state::mjfocusm)
fmsnd.port_a_read_callback().set_ioport("DSWA");
fmsnd.port_b_read_callback().set_ioport("DSWB");
fmsnd.add_route(ALL_OUTPUTS, "speaker", 0.7);
-MACHINE_CONFIG_END
+}
void nbmj8891_state::scandalm(machine_config &config)
{
@@ -2519,22 +2518,21 @@ void nbmj8891_state::scandalm(machine_config &config)
m_nb1413m3->set_type(NB1413M3_SCANDALM);
}
-MACHINE_CONFIG_START(nbmj8891_state::taiwanmb)
+void nbmj8891_state::taiwanmb(machine_config &config)
+{
gionbana(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(taiwanmb_map)
- MCFG_DEVICE_IO_MAP(taiwanmb_io_map)
-// MCFG_DEVICE_VBLANK_INT_DRIVER("screen", nbmj8891_state, irq0_line_hold)
+ m_maincpu->set_addrmap(AS_PROGRAM, &nbmj8891_state::taiwanmb_map);
+ m_maincpu->set_addrmap(AS_IO, &nbmj8891_state::taiwanmb_io_map);
+// m_maincpu->set_vblank_int("screen", FUNC(nbmj8891_state::irq0_line_hold));
m_nb1413m3->set_type(NB1413M3_TAIWANMB);
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
/* video hardware */
- MCFG_SCREEN_MODIFY("screen")
- MCFG_SCREEN_VISIBLE_AREA(0, 512-1, 16, 240-1)
+ m_screen->set_visarea(0, 512-1, 16, 240-1);
MCFG_VIDEO_START_OVERRIDE(nbmj8891_state,_1layer)
/* sound hardware */
@@ -2542,7 +2540,7 @@ MACHINE_CONFIG_START(nbmj8891_state::taiwanmb)
fmsnd.port_a_read_callback().set_ioport("DSWA");
fmsnd.port_b_read_callback().set_ioport("DSWB");
fmsnd.add_route(ALL_OUTPUTS, "speaker", 0.7);
-MACHINE_CONFIG_END
+}
ROM_START( gionbana )
diff --git a/src/mame/drivers/nbmj8900.cpp b/src/mame/drivers/nbmj8900.cpp
index 1280f139ddc..6f6d794fc0f 100644
--- a/src/mame/drivers/nbmj8900.cpp
+++ b/src/mame/drivers/nbmj8900.cpp
@@ -304,48 +304,48 @@ INPUT_PORTS_END
-MACHINE_CONFIG_START(nbmj8900_state::ohpaipee)
-
+void nbmj8900_state::ohpaipee(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, 20000000/4) /* 5.00 MHz ? */
- MCFG_DEVICE_PROGRAM_MAP(ohpaipee_map)
- MCFG_DEVICE_IO_MAP(ohpaipee_io_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", nbmj8900_state, irq0_line_hold)
+ Z80(config, m_maincpu, 20000000/4); /* 5.00 MHz ? */
+ m_maincpu->set_addrmap(AS_PROGRAM, &nbmj8900_state::ohpaipee_map);
+ m_maincpu->set_addrmap(AS_IO, &nbmj8900_state::ohpaipee_io_map);
+ m_maincpu->set_vblank_int("screen", FUNC(nbmj8900_state::irq0_line_hold));
NB1413M3(config, m_nb1413m3, 0, NB1413M3_OHPAIPEE);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(512, 256)
- MCFG_SCREEN_VISIBLE_AREA(0, 512-1, 8, 248-1)
- MCFG_SCREEN_UPDATE_DRIVER(nbmj8900_state, screen_update)
- MCFG_SCREEN_PALETTE("palette")
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_refresh_hz(60);
+ m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ m_screen->set_size(512, 256);
+ m_screen->set_visarea(0, 512-1, 8, 248-1);
+ m_screen->set_screen_update(FUNC(nbmj8900_state::screen_update));
+ m_screen->set_palette("palette");
- MCFG_PALETTE_ADD("palette", 256)
+ PALETTE(config, "palette").set_entries(256);
/* sound hardware */
SPEAKER(config, "speaker").front_center();
- MCFG_DEVICE_ADD("ymsnd", YM3812, 2500000)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 0.7)
+ YM3812(config, "ymsnd", 2500000).add_route(ALL_OUTPUTS, "speaker", 0.7);
- MCFG_DEVICE_ADD("dac", DAC_8BIT_R2R, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 0.42) // unknown DAC
- MCFG_DEVICE_ADD("vref", VOLTAGE_REGULATOR, 0) MCFG_VOLTAGE_REGULATOR_OUTPUT(5.0)
- MCFG_SOUND_ROUTE(0, "dac", 1.0, DAC_VREF_POS_INPUT) MCFG_SOUND_ROUTE(0, "dac", -1.0, DAC_VREF_NEG_INPUT)
-MACHINE_CONFIG_END
+ DAC_8BIT_R2R(config, "dac", 0).add_route(ALL_OUTPUTS, "speaker", 0.42); // unknown DAC
+ voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref"));
+ vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT);
+ vref.add_route(0, "dac", -1.0, DAC_VREF_NEG_INPUT);
+}
-MACHINE_CONFIG_START(nbmj8900_state::togenkyo)
+void nbmj8900_state::togenkyo(machine_config &config)
+{
ohpaipee(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(togenkyo_map)
+ m_maincpu->set_addrmap(AS_PROGRAM, &nbmj8900_state::togenkyo_map);
m_nb1413m3->set_type(NB1413M3_TOGENKYO);
-MACHINE_CONFIG_END
+}
ROM_START( ohpaipee )
diff --git a/src/mame/drivers/nbmj8991.cpp b/src/mame/drivers/nbmj8991.cpp
index 5e0a6d0f0e2..c42bd8cae89 100644
--- a/src/mame/drivers/nbmj8991.cpp
+++ b/src/mame/drivers/nbmj8991.cpp
@@ -1327,77 +1327,77 @@ static INPUT_PORTS_START( av2mj2rg )
INPUT_PORTS_END
-MACHINE_CONFIG_START(nbmj8991_state::nbmjdrv1) // galkoku
-
+void nbmj8991_state::nbmjdrv1(machine_config &config) // galkoku
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, 25000000/5) /* 5.00 MHz ? */
- MCFG_DEVICE_PROGRAM_MAP(galkoku_map)
- MCFG_DEVICE_IO_MAP(galkoku_io_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", nbmj8991_state, irq0_line_hold)
+ Z80(config, m_maincpu, 25000000/5); /* 5.00 MHz ? */
+ m_maincpu->set_addrmap(AS_PROGRAM, &nbmj8991_state::galkoku_map);
+ m_maincpu->set_addrmap(AS_IO, &nbmj8991_state::galkoku_io_map);
+ m_maincpu->set_vblank_int("screen", FUNC(nbmj8991_state::irq0_line_hold));
NB1413M3(config, m_nb1413m3, 0);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(1024, 512)
- MCFG_SCREEN_VISIBLE_AREA(0, 640-1, 0, 240-1)
- MCFG_SCREEN_UPDATE_DRIVER(nbmj8991_state, screen_update_type1)
- MCFG_SCREEN_PALETTE("palette")
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_refresh_hz(60);
+ m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ m_screen->set_size(1024, 512);
+ m_screen->set_visarea(0, 640-1, 0, 240-1);
+ m_screen->set_screen_update(FUNC(nbmj8991_state::screen_update_type1));
+ m_screen->set_palette(m_palette);
- MCFG_PALETTE_ADD("palette", 256)
+ PALETTE(config, m_palette).set_entries(256);
/* sound hardware */
SPEAKER(config, "speaker").front_center();
YM3812(config, "fmsnd", 25000000/10).add_route(ALL_OUTPUTS, "speaker", 0.7);
- MCFG_DEVICE_ADD("dac", DAC_8BIT_R2R, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 0.25) // unknown DAC
- MCFG_DEVICE_ADD("vref", VOLTAGE_REGULATOR, 0) MCFG_VOLTAGE_REGULATOR_OUTPUT(5.0)
- MCFG_SOUND_ROUTE(0, "dac", 1.0, DAC_VREF_POS_INPUT) MCFG_SOUND_ROUTE(0, "dac", -1.0, DAC_VREF_NEG_INPUT)
-MACHINE_CONFIG_END
-
+ DAC_8BIT_R2R(config, "dac", 0).add_route(ALL_OUTPUTS, "speaker", 0.25); // unknown DAC
+ voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref"));
+ vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT);
+ vref.add_route(0, "dac", -1.0, DAC_VREF_NEG_INPUT);
+}
-MACHINE_CONFIG_START(nbmj8991_state::nbmjdrv2) // pstadium
+void nbmj8991_state::nbmjdrv2(machine_config &config) // pstadium
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, 6000000/2) /* 3.00 MHz */
- MCFG_DEVICE_PROGRAM_MAP(pstadium_map)
- MCFG_DEVICE_IO_MAP(pstadium_io_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", nbmj8991_state, irq0_line_hold)
+ Z80(config, m_maincpu, 6000000/2); /* 3.00 MHz */
+ m_maincpu->set_addrmap(AS_PROGRAM, &nbmj8991_state::pstadium_map);
+ m_maincpu->set_addrmap(AS_IO, &nbmj8991_state::pstadium_io_map);
+ m_maincpu->set_vblank_int("screen", FUNC(nbmj8991_state::irq0_line_hold));
NB1413M3(config, m_nb1413m3, 0);
- MCFG_DEVICE_ADD("audiocpu", Z80, 4000000) /* 4.00 MHz */
- MCFG_DEVICE_PROGRAM_MAP(nbmj8991_sound_map)
- MCFG_DEVICE_IO_MAP(nbmj8991_sound_io_map)
- MCFG_DEVICE_PERIODIC_INT_DRIVER(nbmj8991_state, irq0_line_hold, 128*60) // ?
+ Z80(config, m_audiocpu, 4000000); /* 4.00 MHz */
+ m_audiocpu->set_addrmap(AS_PROGRAM, &nbmj8991_state::nbmj8991_sound_map);
+ m_audiocpu->set_addrmap(AS_IO, &nbmj8991_state::nbmj8991_sound_io_map);
+ m_audiocpu->set_periodic_int(FUNC(nbmj8991_state::irq0_line_hold), attotime::from_hz(128*60)); // ?
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(1024, 512)
- MCFG_SCREEN_VISIBLE_AREA(0, 640-1, 0, 240-1)
- MCFG_SCREEN_UPDATE_DRIVER(nbmj8991_state, screen_update_type2)
- MCFG_SCREEN_PALETTE("palette")
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_refresh_hz(60);
+ m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ m_screen->set_size(1024, 512);
+ m_screen->set_visarea(0, 640-1, 0, 240-1);
+ m_screen->set_screen_update(FUNC(nbmj8991_state::screen_update_type2));
+ m_screen->set_palette(m_palette);
- MCFG_PALETTE_ADD("palette", 256)
+ PALETTE(config, m_palette).set_entries(256);
/* sound hardware */
SPEAKER(config, "speaker").front_center();
GENERIC_LATCH_8(config, m_soundlatch);
- MCFG_DEVICE_ADD("fmsnd", YM3812, 25000000/6.25)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 0.7)
+ YM3812(config, "fmsnd", 25000000/6.25).add_route(ALL_OUTPUTS, "speaker", 0.7);
- MCFG_DEVICE_ADD("dac1", DAC_8BIT_R2R, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 0.25) // unknown DAC
- MCFG_DEVICE_ADD("dac2", DAC_8BIT_R2R, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 0.25) // unknown DAC
- MCFG_DEVICE_ADD("vref", VOLTAGE_REGULATOR, 0) MCFG_VOLTAGE_REGULATOR_OUTPUT(5.0)
- MCFG_SOUND_ROUTE(0, "dac1", 1.0, DAC_VREF_POS_INPUT) MCFG_SOUND_ROUTE(0, "dac1", -1.0, DAC_VREF_NEG_INPUT)
- MCFG_SOUND_ROUTE(0, "dac2", 1.0, DAC_VREF_POS_INPUT) MCFG_SOUND_ROUTE(0, "dac2", -1.0, DAC_VREF_NEG_INPUT)
-MACHINE_CONFIG_END
+ DAC_8BIT_R2R(config, "dac1", 0).add_route(ALL_OUTPUTS, "speaker", 0.25); // unknown DAC
+ DAC_8BIT_R2R(config, "dac2", 0).add_route(ALL_OUTPUTS, "speaker", 0.25); // unknown DAC
+ voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref"));
+ vref.add_route(0, "dac1", 1.0, DAC_VREF_POS_INPUT); vref.add_route(0, "dac1", -1.0, DAC_VREF_NEG_INPUT);
+ vref.add_route(0, "dac2", 1.0, DAC_VREF_POS_INPUT); vref.add_route(0, "dac2", -1.0, DAC_VREF_NEG_INPUT);
+}
void nbmj8991_state::nbmjdrv3(machine_config &config)
@@ -1422,39 +1422,39 @@ void nbmj8991_state::galkoku(machine_config &config)
}
-MACHINE_CONFIG_START(nbmj8991_state::galkaika)
+void nbmj8991_state::galkaika(machine_config &config)
+{
nbmjdrv1(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(galkaika_map)
+ m_maincpu->set_addrmap(AS_PROGRAM, &nbmj8991_state::galkaika_map);
m_nb1413m3->set_type(NB1413M3_GALKAIKA);
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(nbmj8991_state::tokyogal)
+void nbmj8991_state::tokyogal(machine_config &config)
+{
nbmjdrv1(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(tokyogal_map)
+ m_maincpu->set_addrmap(AS_PROGRAM, &nbmj8991_state::tokyogal_map);
m_nb1413m3->set_type(NB1413M3_TOKYOGAL);
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(nbmj8991_state::tokimbsj)
+void nbmj8991_state::tokimbsj(machine_config &config)
+{
nbmjdrv1(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(galkaika_map)
+ m_maincpu->set_addrmap(AS_PROGRAM, &nbmj8991_state::galkaika_map);
m_nb1413m3->set_type(NB1413M3_TOKIMBSJ);
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
-MACHINE_CONFIG_END
+}
void nbmj8991_state::mcontest(machine_config &config)
@@ -1473,17 +1473,17 @@ void nbmj8991_state::uchuuai(machine_config &config)
}
-MACHINE_CONFIG_START(nbmj8991_state::hyouban)
+void nbmj8991_state::hyouban(machine_config &config)
+{
nbmjdrv3(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_IO_MAP(hyouban_io_map)
+ m_maincpu->set_addrmap(AS_IO, &nbmj8991_state::hyouban_io_map);
m_nb1413m3->set_type(NB1413M3_HYOUBAN);
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
-MACHINE_CONFIG_END
+}
void nbmj8991_state::pstadium(machine_config &config)
@@ -1494,26 +1494,26 @@ void nbmj8991_state::pstadium(machine_config &config)
}
-MACHINE_CONFIG_START(nbmj8991_state::triplew1)
+void nbmj8991_state::triplew1(machine_config &config)
+{
nbmjdrv2(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(triplew1_map)
+ m_maincpu->set_addrmap(AS_PROGRAM, &nbmj8991_state::triplew1_map);
m_nb1413m3->set_type(NB1413M3_TRIPLEW1);
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(nbmj8991_state::triplew2)
+void nbmj8991_state::triplew2(machine_config &config)
+{
nbmjdrv2(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(triplew2_map)
+ m_maincpu->set_addrmap(AS_PROGRAM, &nbmj8991_state::triplew2_map);
m_nb1413m3->set_type(NB1413M3_TRIPLEW2);
-MACHINE_CONFIG_END
+}
void nbmj8991_state::ntopstar(machine_config &config)
@@ -1524,15 +1524,15 @@ void nbmj8991_state::ntopstar(machine_config &config)
}
-MACHINE_CONFIG_START(nbmj8991_state::mjlstory)
+void nbmj8991_state::mjlstory(machine_config &config)
+{
nbmjdrv2(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(mjlstory_map)
+ m_maincpu->set_addrmap(AS_PROGRAM, &nbmj8991_state::mjlstory_map);
m_nb1413m3->set_type(NB1413M3_MJLSTORY);
-MACHINE_CONFIG_END
+}
void nbmj8991_state::vanilla(machine_config &config)
@@ -1543,14 +1543,15 @@ void nbmj8991_state::vanilla(machine_config &config)
}
-MACHINE_CONFIG_START(nbmj8991_state::finalbny)
+void nbmj8991_state::finalbny(machine_config &config)
+{
nbmjdrv2(config);
/* basic machine hardware */
m_nb1413m3->set_type(NB1413M3_FINALBNY);
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
-MACHINE_CONFIG_END
+}
void nbmj8991_state::qmhayaku(machine_config &config)
@@ -1561,41 +1562,41 @@ void nbmj8991_state::qmhayaku(machine_config &config)
}
-MACHINE_CONFIG_START(nbmj8991_state::mjgottub)
+void nbmj8991_state::mjgottub(machine_config &config)
+{
nbmjdrv2(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(triplew1_map)
+ m_maincpu->set_addrmap(AS_PROGRAM, &nbmj8991_state::triplew1_map);
m_nb1413m3->set_type(NB1413M3_MJGOTTUB);
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(nbmj8991_state::av2mj1bb)
+void nbmj8991_state::av2mj1bb(machine_config &config)
+{
nbmjdrv2(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(av2mj1bb_map)
- MCFG_DEVICE_IO_MAP(av2mj1bb_io_map)
+ m_maincpu->set_addrmap(AS_PROGRAM, &nbmj8991_state::av2mj1bb_map);
+ m_maincpu->set_addrmap(AS_IO, &nbmj8991_state::av2mj1bb_io_map);
m_nb1413m3->set_type(NB1413M3_AV2MJ1BB);
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(nbmj8991_state::av2mj2rg)
+void nbmj8991_state::av2mj2rg(machine_config &config)
+{
nbmjdrv2(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(av2mj2rg_map)
- MCFG_DEVICE_IO_MAP(av2mj1bb_io_map)
+ m_maincpu->set_addrmap(AS_PROGRAM, &nbmj8991_state::av2mj2rg_map);
+ m_maincpu->set_addrmap(AS_IO, &nbmj8991_state::av2mj1bb_io_map);
m_nb1413m3->set_type(NB1413M3_AV2MJ2RG);
-MACHINE_CONFIG_END
+}
diff --git a/src/mame/drivers/nbmj9195.cpp b/src/mame/drivers/nbmj9195.cpp
index 8c1a270fe72..6d113bd3ddf 100644
--- a/src/mame/drivers/nbmj9195.cpp
+++ b/src/mame/drivers/nbmj9195.cpp
@@ -2507,8 +2507,8 @@ static const z80_daisy_config daisy_chain_sound[] =
m_maincpu->out_pd_callback().set(FUNC(nbmj9195_state::clutsel_w)); \
m_maincpu->out_pe_callback().set(FUNC(nbmj9195_state::outcoin_flag_w));
-MACHINE_CONFIG_START(nbmj9195_state::NBMJDRV1_base)
-
+void nbmj9195_state::NBMJDRV1_base(machine_config &config)
+{
/* basic machine hardware */
TMPZ84C011(config, m_maincpu, 12000000/2); /* TMPZ84C011, 6.00 MHz */
m_maincpu->set_daisy_config(daisy_chain_main);
@@ -2536,32 +2536,33 @@ MACHINE_CONFIG_START(nbmj9195_state::NBMJDRV1_base)
m_screen->set_palette(m_palette);
m_screen->screen_vblank().set(m_maincpu, FUNC(tmpz84c011_device::trg1)).invert();
- MCFG_PALETTE_ADD(m_palette, 256)
+ PALETTE(config, m_palette).set_entries(256);
/* sound hardware */
SPEAKER(config, "speaker").front_center();
GENERIC_LATCH_8(config, m_soundlatch);
- MCFG_DEVICE_ADD("ymsnd", YM3812, 4000000)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 0.7)
+ YM3812(config, "ymsnd", 4000000).add_route(ALL_OUTPUTS, "speaker", 0.7);
- MCFG_DEVICE_ADD("dac1", DAC_8BIT_R2R, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 0.25) // unknown DAC
- MCFG_DEVICE_ADD("dac2", DAC_8BIT_R2R, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 0.25) // unknown DAC
- MCFG_DEVICE_ADD("vref", VOLTAGE_REGULATOR, 0) MCFG_VOLTAGE_REGULATOR_OUTPUT(5.0)
- MCFG_SOUND_ROUTE(0, "dac1", 1.0, DAC_VREF_POS_INPUT) MCFG_SOUND_ROUTE(0, "dac1", -1.0, DAC_VREF_NEG_INPUT)
- MCFG_SOUND_ROUTE(0, "dac2", 1.0, DAC_VREF_POS_INPUT) MCFG_SOUND_ROUTE(0, "dac2", -1.0, DAC_VREF_NEG_INPUT)
-MACHINE_CONFIG_END
+ DAC_8BIT_R2R(config, "dac1", 0).add_route(ALL_OUTPUTS, "speaker", 0.25); // unknown DAC
+ DAC_8BIT_R2R(config, "dac2", 0).add_route(ALL_OUTPUTS, "speaker", 0.25); // unknown DAC
+ voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref"));
+ vref.add_route(0, "dac1", 1.0, DAC_VREF_POS_INPUT); vref.add_route(0, "dac1", -1.0, DAC_VREF_NEG_INPUT);
+ vref.add_route(0, "dac2", 1.0, DAC_VREF_POS_INPUT); vref.add_route(0, "dac2", -1.0, DAC_VREF_NEG_INPUT);
+}
-MACHINE_CONFIG_START(nbmj9195_state::NBMJDRV1)
+void nbmj9195_state::NBMJDRV1(machine_config &config)
+{
NBMJDRV1_base(config);
/* basic machine hardware */
OTHERS_TMZ84C011_MAIN_PORTS
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(nbmj9195_state::NBMJDRV2)
+void nbmj9195_state::NBMJDRV2(machine_config &config)
+{
NBMJDRV1_base(config);
/* basic machine hardware */
@@ -2569,59 +2570,64 @@ MACHINE_CONFIG_START(nbmj9195_state::NBMJDRV2)
/* video hardware */
MCFG_VIDEO_START_OVERRIDE(nbmj9195_state,_1layer)
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(nbmj9195_state::NBMJDRV3)
+void nbmj9195_state::NBMJDRV3(machine_config &config)
+{
NBMJDRV1_base(config);
/* basic machine hardware */
MSCOUTM_TMZ84C011_MAIN_PORTS
/* video hardware */
- MCFG_DEVICE_MODIFY("palette")
- MCFG_PALETTE_ENTRIES(512)
+ m_palette->set_entries(512);
MCFG_VIDEO_START_OVERRIDE(nbmj9195_state,nb22090)
-MACHINE_CONFIG_END
+}
//-------------------------------------------------------------------------
-MACHINE_CONFIG_START(nbmj9195_state::mjuraden)
+void nbmj9195_state::mjuraden(machine_config &config)
+{
NBMJDRV1(config);
/* basic machine hardware */
m_maincpu->set_addrmap(AS_PROGRAM, &nbmj9195_state::mjuraden_map);
m_maincpu->set_addrmap(AS_IO, &nbmj9195_state::mjuraden_io_map);
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(nbmj9195_state::koinomp)
+void nbmj9195_state::koinomp(machine_config &config)
+{
NBMJDRV1(config);
/* basic machine hardware */
m_maincpu->set_addrmap(AS_PROGRAM, &nbmj9195_state::koinomp_map);
m_maincpu->set_addrmap(AS_IO, &nbmj9195_state::koinomp_io_map);
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(nbmj9195_state::patimono)
+void nbmj9195_state::patimono(machine_config &config)
+{
NBMJDRV1(config);
/* basic machine hardware */
m_maincpu->set_addrmap(AS_IO, &nbmj9195_state::patimono_io_map);
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(nbmj9195_state::janbari)
+void nbmj9195_state::janbari(machine_config &config)
+{
patimono(config);
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(nbmj9195_state::mmehyou)
+void nbmj9195_state::mmehyou(machine_config &config)
+{
NBMJDRV1(config);
/* basic machine hardware */
@@ -2629,205 +2635,227 @@ MACHINE_CONFIG_START(nbmj9195_state::mmehyou)
m_maincpu->set_addrmap(AS_IO, &nbmj9195_state::mmehyou_io_map);
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(nbmj9195_state::ultramhm)
+void nbmj9195_state::ultramhm(machine_config &config)
+{
koinomp(config);
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(nbmj9195_state::gal10ren)
+void nbmj9195_state::gal10ren(machine_config &config)
+{
NBMJDRV1(config);
/* basic machine hardware */
m_maincpu->set_addrmap(AS_IO, &nbmj9195_state::gal10ren_io_map);
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(nbmj9195_state::renaiclb)
+void nbmj9195_state::renaiclb(machine_config &config)
+{
NBMJDRV1(config);
/* basic machine hardware */
m_maincpu->set_addrmap(AS_IO, &nbmj9195_state::renaiclb_io_map);
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(nbmj9195_state::mjlaman)
+void nbmj9195_state::mjlaman(machine_config &config)
+{
NBMJDRV1(config);
/* basic machine hardware */
m_maincpu->set_addrmap(AS_IO, &nbmj9195_state::mjlaman_io_map);
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(nbmj9195_state::mkeibaou)
+void nbmj9195_state::mkeibaou(machine_config &config)
+{
NBMJDRV1(config);
/* basic machine hardware */
m_maincpu->set_addrmap(AS_IO, &nbmj9195_state::mkeibaou_io_map);
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(nbmj9195_state::pachiten)
+void nbmj9195_state::pachiten(machine_config &config)
+{
NBMJDRV1(config);
/* basic machine hardware */
m_maincpu->set_addrmap(AS_IO, &nbmj9195_state::pachiten_io_map);
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(nbmj9195_state::sailorws)
+void nbmj9195_state::sailorws(machine_config &config)
+{
NBMJDRV1(config);
/* basic machine hardware */
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(nbmj9195_state::sailorwr)
+void nbmj9195_state::sailorwr(machine_config &config)
+{
NBMJDRV1(config);
/* basic machine hardware */
m_maincpu->set_addrmap(AS_IO, &nbmj9195_state::sailorwr_io_map);
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(nbmj9195_state::psailor1)
+void nbmj9195_state::psailor1(machine_config &config)
+{
NBMJDRV1(config);
/* basic machine hardware */
m_maincpu->set_addrmap(AS_IO, &nbmj9195_state::psailor1_io_map);
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(nbmj9195_state::psailor2)
+void nbmj9195_state::psailor2(machine_config &config)
+{
NBMJDRV1(config);
/* basic machine hardware */
m_maincpu->set_addrmap(AS_IO, &nbmj9195_state::psailor2_io_map);
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(nbmj9195_state::otatidai)
+void nbmj9195_state::otatidai(machine_config &config)
+{
NBMJDRV1(config);
/* basic machine hardware */
m_maincpu->set_addrmap(AS_IO, &nbmj9195_state::otatidai_io_map);
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(nbmj9195_state::yosimoto)
+void nbmj9195_state::yosimoto(machine_config &config)
+{
NBMJDRV1(config);
/* basic machine hardware */
m_maincpu->set_addrmap(AS_IO, &nbmj9195_state::yosimoto_io_map);
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(nbmj9195_state::yosimotm)
+void nbmj9195_state::yosimotm(machine_config &config)
+{
NBMJDRV1(config);
/* basic machine hardware */
m_maincpu->set_addrmap(AS_IO, &nbmj9195_state::yosimotm_io_map);
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(nbmj9195_state::jituroku)
+void nbmj9195_state::jituroku(machine_config &config)
+{
NBMJDRV1(config);
/* basic machine hardware */
m_maincpu->set_addrmap(AS_IO, &nbmj9195_state::jituroku_io_map);
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(nbmj9195_state::ngpgal)
+void nbmj9195_state::ngpgal(machine_config &config)
+{
NBMJDRV2(config);
/* basic machine hardware */
m_maincpu->set_addrmap(AS_PROGRAM, &nbmj9195_state::ngpgal_map);
m_maincpu->set_addrmap(AS_IO, &nbmj9195_state::ngpgal_io_map);
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(nbmj9195_state::mjgottsu)
+void nbmj9195_state::mjgottsu(machine_config &config)
+{
NBMJDRV2(config);
/* basic machine hardware */
m_maincpu->set_addrmap(AS_PROGRAM, &nbmj9195_state::ngpgal_map);
m_maincpu->set_addrmap(AS_IO, &nbmj9195_state::mjgottsu_io_map);
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(nbmj9195_state::bakuhatu)
+void nbmj9195_state::bakuhatu(machine_config &config)
+{
NBMJDRV2(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
m_maincpu->set_addrmap(AS_PROGRAM, &nbmj9195_state::ngpgal_map);
m_maincpu->set_addrmap(AS_IO, &nbmj9195_state::mjgottsu_io_map);
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(nbmj9195_state::cmehyou)
+void nbmj9195_state::cmehyou(machine_config &config)
+{
NBMJDRV2(config);
/* basic machine hardware */
m_maincpu->set_addrmap(AS_PROGRAM, &nbmj9195_state::ngpgal_map);
m_maincpu->set_addrmap(AS_IO, &nbmj9195_state::cmehyou_io_map);
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(nbmj9195_state::mjkoiura)
+void nbmj9195_state::mjkoiura(machine_config &config)
+{
NBMJDRV2(config);
/* basic machine hardware */
m_maincpu->set_addrmap(AS_PROGRAM, &nbmj9195_state::mjuraden_map);
m_maincpu->set_addrmap(AS_IO, &nbmj9195_state::mjkoiura_io_map);
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(nbmj9195_state::mkoiuraa)
+void nbmj9195_state::mkoiuraa(machine_config &config)
+{
NBMJDRV2(config);
/* basic machine hardware */
m_maincpu->set_addrmap(AS_PROGRAM, &nbmj9195_state::mjuraden_map);
m_maincpu->set_addrmap(AS_IO, &nbmj9195_state::mkoiuraa_io_map);
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(nbmj9195_state::mscoutm)
+void nbmj9195_state::mscoutm(machine_config &config)
+{
NBMJDRV3(config);
/* basic machine hardware */
m_maincpu->set_addrmap(AS_PROGRAM, &nbmj9195_state::mscoutm_map);
m_maincpu->set_addrmap(AS_IO, &nbmj9195_state::mscoutm_io_map);
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(nbmj9195_state::imekura)
+void nbmj9195_state::imekura(machine_config &config)
+{
NBMJDRV3(config);
/* basic machine hardware */
m_maincpu->set_addrmap(AS_PROGRAM, &nbmj9195_state::mjegolf_map);
m_maincpu->set_addrmap(AS_IO, &nbmj9195_state::imekura_io_map);
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(nbmj9195_state::mjegolf)
+void nbmj9195_state::mjegolf(machine_config &config)
+{
NBMJDRV3(config);
/* basic machine hardware */
m_maincpu->set_addrmap(AS_PROGRAM, &nbmj9195_state::mjegolf_map);
m_maincpu->set_addrmap(AS_IO, &nbmj9195_state::mjegolf_io_map);
-MACHINE_CONFIG_END
+}
diff --git a/src/mame/drivers/nc.cpp b/src/mame/drivers/nc.cpp
index 48f562c3dee..a6be3546a7b 100644
--- a/src/mame/drivers/nc.cpp
+++ b/src/mame/drivers/nc.cpp
@@ -1378,36 +1378,35 @@ INPUT_PORTS_END
MACHINE_CONFIG_START(nc_state::nc_base)
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, /*6000000*/ 4606000) /* Russell Marks says this is more accurate */
- MCFG_DEVICE_PROGRAM_MAP(nc_map)
- MCFG_QUANTUM_TIME(attotime::from_hz(60))
+ Z80(config, m_maincpu, /*6000000*/ 4606000); /* Russell Marks says this is more accurate */
+ m_maincpu->set_addrmap(AS_PROGRAM, &nc_state::nc_map);
+ config.m_minimum_quantum = attotime::from_hz(60);
/* video hardware */
- MCFG_SCREEN_ADD("screen", LCD)
- MCFG_SCREEN_REFRESH_RATE(50)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */
- MCFG_SCREEN_PALETTE("palette")
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_LCD));
+ screen.set_refresh_hz(50);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */
+ screen.set_palette("palette");
PALETTE(config, "palette", FUNC(nc_state::nc_colours), NC_NUM_COLOURS);
/* sound hardware */
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("beep.1", BEEP, 0)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.50)
- MCFG_DEVICE_ADD("beep.2", BEEP, 0)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.50)
+ BEEP(config, m_beeper1, 0).add_route(ALL_OUTPUTS, "mono", 0.50);
+ BEEP(config, m_beeper2, 0).add_route(ALL_OUTPUTS, "mono", 0.50);
/* printer */
- MCFG_DEVICE_ADD("centronics", CENTRONICS, centronics_devices, "printer")
- MCFG_CENTRONICS_BUSY_HANDLER(WRITELINE(*this, nc_state, write_centronics_busy))
+ CENTRONICS(config, m_centronics, centronics_devices, "printer");
+ m_centronics->busy_handler().set(FUNC(nc_state::write_centronics_busy));
- MCFG_CENTRONICS_OUTPUT_LATCH_ADD("cent_data_out", "centronics")
+ output_latch_device &cent_data_out(OUTPUT_LATCH(config, "cent_data_out"));
+ m_centronics->set_output_latch(cent_data_out);
/* uart */
I8251(config, m_uart, 0);
- MCFG_DEVICE_ADD("uart_clock", CLOCK, 19200)
- MCFG_CLOCK_SIGNAL_HANDLER(WRITELINE(*this, nc_state, write_uart_clock))
+ clock_device &uart_clock(CLOCK(config, "uart_clock", 19200));
+ uart_clock.signal_handler().set(FUNC(nc_state::write_uart_clock));
/* cartridge */
MCFG_GENERIC_CARTSLOT_ADD("cardslot", generic_plain_slot, nullptr)
@@ -1419,24 +1418,23 @@ MACHINE_CONFIG_START(nc_state::nc_base)
NVRAM(config, "nvram", nvram_device::DEFAULT_NONE);
/* dummy timer */
- MCFG_TIMER_DRIVER_ADD_PERIODIC("dummy_timer", nc_state, dummy_timer_callback, attotime::from_hz(50))
+ TIMER(config, "dummy_timer").configure_periodic(FUNC(nc_state::dummy_timer_callback), attotime::from_hz(50));
MACHINE_CONFIG_END
-MACHINE_CONFIG_START(nc100_state::nc100)
+void nc100_state::nc100(machine_config &config)
+{
nc_base(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_IO_MAP(nc100_io)
+ m_maincpu->set_addrmap(AS_IO, &nc100_state::nc100_io);
/* video hardware */
- MCFG_SCREEN_MODIFY("screen")
- MCFG_SCREEN_SIZE(480, 64)
- MCFG_SCREEN_VISIBLE_AREA(0, 480-1, 0, 64-1)
- MCFG_SCREEN_UPDATE_DRIVER(nc100_state, screen_update_nc100)
+ screen_device &screen(*subdevice<screen_device>("screen"));
+ screen.set_size(480, 64);
+ screen.set_visarea(0, 480-1, 0, 64-1);
+ screen.set_screen_update(FUNC(nc100_state::screen_update_nc100));
/* printer */
- MCFG_DEVICE_MODIFY("centronics")
- MCFG_CENTRONICS_ACK_HANDLER(WRITELINE(*this, nc100_state, write_nc100_centronics_ack))
+ m_centronics->ack_handler().set(FUNC(nc100_state::write_nc100_centronics_ack));
/* uart */
m_uart->rxrdy_handler().set(FUNC(nc100_state::nc100_rxrdy_callback));
@@ -1445,7 +1443,7 @@ MACHINE_CONFIG_START(nc100_state::nc100)
/* rtc */
tc8521_device &rtc(TC8521(config, "rtc", XTAL(32'768)));
rtc.out_alarm_callback().set(FUNC(nc100_state::nc100_tc8521_alarm_callback));
-MACHINE_CONFIG_END
+}
static const floppy_format_type ibmpc_floppy_formats[] = {
FLOPPY_PC_FORMAT,
@@ -1458,25 +1456,24 @@ static void ibmpc_floppies(device_slot_interface &device)
device.option_add("525dd", FLOPPY_525_DD);
}
-MACHINE_CONFIG_START(nc200_state::nc200)
+void nc200_state::nc200(machine_config &config)
+{
nc_base(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_IO_MAP(nc200_io)
+ m_maincpu->set_addrmap(AS_IO, &nc200_state::nc200_io);
/* video hardware */
- MCFG_SCREEN_MODIFY("screen")
- MCFG_SCREEN_SIZE(NC200_SCREEN_WIDTH, NC200_SCREEN_HEIGHT)
- MCFG_SCREEN_VISIBLE_AREA(0, NC200_SCREEN_WIDTH-1, 0, NC200_SCREEN_HEIGHT-1)
- MCFG_SCREEN_UPDATE_DRIVER(nc200_state, screen_update_nc200)
+ screen_device &screen(*subdevice<screen_device>("screen"));
+ screen.set_size(NC200_SCREEN_WIDTH, NC200_SCREEN_HEIGHT);
+ screen.set_visarea(0, NC200_SCREEN_WIDTH-1, 0, NC200_SCREEN_HEIGHT-1);
+ screen.set_screen_update(FUNC(nc200_state::screen_update_nc200));
palette_device &palette(*subdevice<palette_device>("palette"));
palette.set_entries(NC200_NUM_COLOURS);
palette.set_init(FUNC(nc200_state::nc_colours));
/* printer */
- MCFG_DEVICE_MODIFY("centronics")
- MCFG_CENTRONICS_ACK_HANDLER(WRITELINE(*this, nc200_state, write_nc200_centronics_ack))
+ m_centronics->ack_handler().set(FUNC(nc200_state::write_nc200_centronics_ack));
/* uart */
m_uart->rxrdy_handler().set(FUNC(nc200_state::nc200_rxrdy_callback));
@@ -1484,14 +1481,14 @@ MACHINE_CONFIG_START(nc200_state::nc200)
UPD765A(config, m_fdc, 8'000'000, true, true);
m_fdc->intrq_wr_callback().set(FUNC(nc200_state::nc200_fdc_interrupt));
- MCFG_FLOPPY_DRIVE_ADD("upd765:0", ibmpc_floppies, "525dd", ibmpc_floppy_formats)
- MCFG_FLOPPY_DRIVE_ADD("upd765:1", ibmpc_floppies, "525dd", ibmpc_floppy_formats)
+ FLOPPY_CONNECTOR(config, "upd765:0", ibmpc_floppies, "525dd", ibmpc_floppy_formats);
+ FLOPPY_CONNECTOR(config, "upd765:1", ibmpc_floppies, "525dd", ibmpc_floppy_formats);
- MCFG_DEVICE_ADD("mc", MC146818, 4.194304_MHz_XTAL)
+ MC146818(config, "mc", 4.194304_MHz_XTAL);
/* internal ram */
m_ram->set_default_size("128K");
-MACHINE_CONFIG_END
+}
/***************************************************************************
diff --git a/src/mame/drivers/neogeo.cpp b/src/mame/drivers/neogeo.cpp
index a472b602d20..3832b156820 100644
--- a/src/mame/drivers/neogeo.cpp
+++ b/src/mame/drivers/neogeo.cpp
@@ -572,6 +572,8 @@ public:
}
// mainboard configurations
+ void cartslot_config(machine_config &config, unsigned count);
+ void cartslot_fixed(machine_config &config, char const *dflt);
void mv1fz(machine_config &config);
// fixed software configurations
@@ -1591,7 +1593,6 @@ void mvs_state::machine_start()
ngarcade_base_state::machine_start();
m_sprgen->m_fixed_layer_bank_type = 0;
- m_sprgen->set_screen(m_screen);
m_curr_slot = -1;
set_slot_idx(0);
@@ -1907,8 +1908,8 @@ INPUT_CHANGED_MEMBER(aes_base_state::aes_jp1)
*
*************************************/
-MACHINE_CONFIG_START(neogeo_base_state::neogeo_base)
-
+void neogeo_base_state::neogeo_base(machine_config &config)
+{
/* basic machine hardware */
M68000(config, m_maincpu, NEOGEO_MAIN_CPU_CLOCK);
@@ -1927,14 +1928,14 @@ MACHINE_CONFIG_START(neogeo_base_state::neogeo_base)
/* video hardware */
config.set_default_layout(layout_neogeo);
- MCFG_SCREEN_ADD(m_screen, RASTER)
- MCFG_SCREEN_RAW_PARAMS(NEOGEO_PIXEL_CLOCK, NEOGEO_HTOTAL, NEOGEO_HBEND, NEOGEO_HBSTART, NEOGEO_VTOTAL, NEOGEO_VBEND, NEOGEO_VBSTART)
- MCFG_SCREEN_UPDATE_DRIVER(neogeo_base_state, screen_update)
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_raw(NEOGEO_PIXEL_CLOCK, NEOGEO_HTOTAL, NEOGEO_HBEND, NEOGEO_HBSTART, NEOGEO_VTOTAL, NEOGEO_VBEND, NEOGEO_VBSTART);
+ m_screen->set_screen_update(FUNC(neogeo_base_state::screen_update));
/* 4096 colors * two banks * normal and shadow */
- MCFG_DEVICE_ADD(m_palette, PALETTE, palette_device::BLACK, 4096*2*2)
+ PALETTE(config, m_palette, palette_device::BLACK, 4096*2*2);
- MCFG_DEVICE_ADD(m_sprgen, NEOGEO_SPRITE_OPTIMZIED, 0)
+ NEOGEO_SPRITE_OPTIMZIED(config, m_sprgen, 0).set_screen(m_screen);
/* audio hardware */
INPUT_MERGER_ALL_HIGH(config, m_audionmi);
@@ -1948,10 +1949,11 @@ MACHINE_CONFIG_START(neogeo_base_state::neogeo_base)
YM2610(config, m_ym, NEOGEO_YM2610_CLOCK);
m_ym->irq_handler().set_inputline(m_audiocpu, 0);
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(neogeo_base_state::neogeo_stereo)
+void neogeo_base_state::neogeo_stereo(machine_config &config)
+{
SPEAKER(config, "lspeaker").front_left();
SPEAKER(config, "rspeaker").front_right();
@@ -1959,7 +1961,7 @@ MACHINE_CONFIG_START(neogeo_base_state::neogeo_stereo)
m_ym->add_route(0, "rspeaker", 0.28);
m_ym->add_route(1, "lspeaker", 0.98);
m_ym->add_route(2, "rspeaker", 0.98);
-MACHINE_CONFIG_END
+}
void ngarcade_base_state::neogeo_arcade(machine_config &config)
@@ -1979,134 +1981,129 @@ void ngarcade_base_state::neogeo_arcade(machine_config &config)
}
-MACHINE_CONFIG_START(ngarcade_base_state::neogeo_mono)
+void ngarcade_base_state::neogeo_mono(machine_config &config)
+{
SPEAKER(config, "speaker").front_center();
m_ym->add_route(0, "speaker", 0.28);
m_ym->add_route(1, "speaker", 0.49);
m_ym->add_route(2, "speaker", 0.49);
-MACHINE_CONFIG_END
-
+}
// configurable slot
-#define NEOGEO_CONFIG_CARTSLOT(_tag) \
- MCFG_NEOGEO_CARTRIDGE_ADD(_tag, neogeo_cart, nullptr)
-
-// non-configurable slot (to be used for non-softlist sets, until we introduce some 'template' concept)
-// a single cart in slot 1, with pre-defined cart type
-#define NEOGEO_CONFIG_ONE_FIXED_CARTSLOT(_default) \
- MCFG_NEOGEO_CARTRIDGE_ADD("cslot1", neogeo_cart, _default) \
- MCFG_SET_IMAGE_LOADABLE(false)
+void mvs_state::cartslot_config(machine_config &config, unsigned count)
+{
+ for (unsigned i = 0; i < count; i++)
+ NEOGEO_CART_SLOT(config, m_slots[i], neogeo_cart, nullptr);
+}
-MACHINE_CONFIG_START(mvs_led_state::mv1)
+void mvs_led_state::mv1(machine_config &config)
+{
neogeo_arcade(config);
neogeo_stereo(config);
NG_MEMCARD(config, m_memcard, 0);
- MCFG_NEOGEO_CONTROL_EDGE_CONNECTOR_ADD("edge", neogeo_arc_edge, "joy", false)
+ NEOGEO_CTRL_EDGE_CONNECTOR(config, m_edge, neogeo_arc_edge, "joy", false);
- MCFG_NEOGEO_CONTROL_PORT_ADD("ctrl1", neogeo_arc_pin15, "", false)
- MCFG_NEOGEO_CONTROL_PORT_ADD("ctrl2", neogeo_arc_pin15, "", false)
+ NEOGEO_CONTROL_PORT(config, m_ctrl1, neogeo_arc_pin15, "", false);
+ NEOGEO_CONTROL_PORT(config, m_ctrl2, neogeo_arc_pin15, "", false);
- NEOGEO_CONFIG_CARTSLOT("cslot1")
+ cartslot_config(config, 1);
- MCFG_SOFTWARE_LIST_ADD("cart_list", "neogeo")
-MACHINE_CONFIG_END
+ SOFTWARE_LIST(config, "cart_list").set_type("neogeo", SOFTWARE_LIST_ORIGINAL_SYSTEM);
+}
-MACHINE_CONFIG_START(mvs_led_state::mv1f)
+void mvs_led_state::mv1f(machine_config &config)
+{
neogeo_arcade(config);
neogeo_stereo(config);
- MCFG_NEOGEO_CONTROL_EDGE_CONNECTOR_ADD("edge", neogeo_arc_edge, "joy", false)
+ NEOGEO_CTRL_EDGE_CONNECTOR(config, m_edge, neogeo_arc_edge, "joy", false);
- MCFG_NEOGEO_CONTROL_PORT_ADD("ctrl1", neogeo_arc_pin15, "", false)
- MCFG_NEOGEO_CONTROL_PORT_ADD("ctrl2", neogeo_arc_pin15, "", false)
+ NEOGEO_CONTROL_PORT(config, m_ctrl1, neogeo_arc_pin15, "", false);
+ NEOGEO_CONTROL_PORT(config, m_ctrl2, neogeo_arc_pin15, "", false);
- NEOGEO_CONFIG_CARTSLOT("cslot1")
+ cartslot_config(config, 1);
- MCFG_SOFTWARE_LIST_ADD("cart_list", "neogeo")
-MACHINE_CONFIG_END
+ SOFTWARE_LIST(config, "cart_list").set_type("neogeo", SOFTWARE_LIST_ORIGINAL_SYSTEM);
+}
-MACHINE_CONFIG_START(mvs_state::mv1fz)
+void mvs_state::mv1fz(machine_config &config)
+{
neogeo_arcade(config);
neogeo_mono(config);
- MCFG_NEOGEO_CONTROL_EDGE_CONNECTOR_ADD("edge", neogeo_arc_edge, "joy", false)
+ NEOGEO_CTRL_EDGE_CONNECTOR(config, m_edge, neogeo_arc_edge, "joy", false);
- NEOGEO_CONFIG_CARTSLOT("cslot1")
+ cartslot_config(config, 1);
- MCFG_SOFTWARE_LIST_ADD("cart_list", "neogeo")
-MACHINE_CONFIG_END
+ SOFTWARE_LIST(config, "cart_list").set_type("neogeo", SOFTWARE_LIST_ORIGINAL_SYSTEM);
+}
-MACHINE_CONFIG_START(mvs_led_el_state::mv2f)
+void mvs_led_el_state::mv2f(machine_config &config)
+{
neogeo_arcade(config);
neogeo_stereo(config);
NG_MEMCARD(config, m_memcard, 0);
- MCFG_NEOGEO_CONTROL_EDGE_CONNECTOR_ADD("edge", neogeo_arc_edge, "joy", false)
+ NEOGEO_CTRL_EDGE_CONNECTOR(config, m_edge, neogeo_arc_edge, "joy", false);
- MCFG_NEOGEO_CONTROL_PORT_ADD("ctrl1", neogeo_arc_pin15, "", false)
- MCFG_NEOGEO_CONTROL_PORT_ADD("ctrl2", neogeo_arc_pin15, "", false)
+ NEOGEO_CONTROL_PORT(config, m_ctrl1, neogeo_arc_pin15, "", false);
+ NEOGEO_CONTROL_PORT(config, m_ctrl2, neogeo_arc_pin15, "", false);
- NEOGEO_CONFIG_CARTSLOT("cslot1")
- NEOGEO_CONFIG_CARTSLOT("cslot2")
+ cartslot_config(config, 2);
- MCFG_SOFTWARE_LIST_ADD("cart_list", "neogeo")
-MACHINE_CONFIG_END
+ SOFTWARE_LIST(config, "cart_list").set_type("neogeo", SOFTWARE_LIST_ORIGINAL_SYSTEM);
+}
-MACHINE_CONFIG_START(mvs_led_el_state::mv4f)
+void mvs_led_el_state::mv4f(machine_config &config)
+{
neogeo_arcade(config);
neogeo_stereo(config);
NG_MEMCARD(config, m_memcard, 0);
- MCFG_NEOGEO_CONTROL_EDGE_CONNECTOR_ADD("edge", neogeo_arc_edge, "joy", false)
+ NEOGEO_CTRL_EDGE_CONNECTOR(config, m_edge, neogeo_arc_edge, "joy", false);
- MCFG_NEOGEO_CONTROL_PORT_ADD("ctrl1", neogeo_arc_pin15, "", false)
- MCFG_NEOGEO_CONTROL_PORT_ADD("ctrl2", neogeo_arc_pin15, "", false)
+ NEOGEO_CONTROL_PORT(config, m_ctrl1, neogeo_arc_pin15, "", false);
+ NEOGEO_CONTROL_PORT(config, m_ctrl2, neogeo_arc_pin15, "", false);
- NEOGEO_CONFIG_CARTSLOT("cslot1")
- NEOGEO_CONFIG_CARTSLOT("cslot2")
- NEOGEO_CONFIG_CARTSLOT("cslot3")
- NEOGEO_CONFIG_CARTSLOT("cslot4")
+ cartslot_config(config, 4);
- MCFG_SOFTWARE_LIST_ADD("cart_list", "neogeo")
-MACHINE_CONFIG_END
+ SOFTWARE_LIST(config, "cart_list").set_type("neogeo", SOFTWARE_LIST_ORIGINAL_SYSTEM);
+}
-MACHINE_CONFIG_START(mvs_led_el_state::mv6f)
+void mvs_led_el_state::mv6f(machine_config &config)
+{
neogeo_arcade(config);
neogeo_stereo(config);
NG_MEMCARD(config, m_memcard, 0);
- MCFG_NEOGEO_CONTROL_EDGE_CONNECTOR_ADD("edge", neogeo_arc_edge, "joy", false)
+ NEOGEO_CTRL_EDGE_CONNECTOR(config, m_edge, neogeo_arc_edge, "joy", false);
- MCFG_NEOGEO_CONTROL_PORT_ADD("ctrl1", neogeo_arc_pin15, "", false)
- MCFG_NEOGEO_CONTROL_PORT_ADD("ctrl2", neogeo_arc_pin15, "", false)
+ NEOGEO_CONTROL_PORT(config, m_ctrl1, neogeo_arc_pin15, "", false);
+ NEOGEO_CONTROL_PORT(config, m_ctrl2, neogeo_arc_pin15, "", false);
- NEOGEO_CONFIG_CARTSLOT("cslot1")
- NEOGEO_CONFIG_CARTSLOT("cslot2")
- NEOGEO_CONFIG_CARTSLOT("cslot3")
- NEOGEO_CONFIG_CARTSLOT("cslot4")
- NEOGEO_CONFIG_CARTSLOT("cslot5")
- NEOGEO_CONFIG_CARTSLOT("cslot6")
+ cartslot_config(config, 6);
- MCFG_SOFTWARE_LIST_ADD("cart_list", "neogeo")
-MACHINE_CONFIG_END
+ SOFTWARE_LIST(config, "cart_list").set_type("neogeo", SOFTWARE_LIST_ORIGINAL_SYSTEM);
+}
-MACHINE_CONFIG_START(mvs_led_state::mv1_fixed)
+void mvs_led_state::mv1_fixed(machine_config &config)
+{
neogeo_arcade(config);
neogeo_stereo(config);
NG_MEMCARD(config, m_memcard, 0);
- MCFG_NEOGEO_CONTROL_EDGE_CONNECTOR_ADD("edge", neogeo_arc_edge, "joy", true)
+ NEOGEO_CTRL_EDGE_CONNECTOR(config, m_edge, neogeo_arc_edge, "joy", true);
- MCFG_NEOGEO_CONTROL_PORT_ADD("ctrl1", neogeo_arc_pin15, "", true)
- MCFG_NEOGEO_CONTROL_PORT_ADD("ctrl2", neogeo_arc_pin15, "", true)
-MACHINE_CONFIG_END
+ NEOGEO_CONTROL_PORT(config, m_ctrl1, neogeo_arc_pin15, "", true);
+ NEOGEO_CONTROL_PORT(config, m_ctrl2, neogeo_arc_pin15, "", true);
+}
@@ -2115,7 +2112,6 @@ void aes_base_state::machine_start()
neogeo_base_state::machine_start();
m_sprgen->m_fixed_layer_bank_type = 0;
- m_sprgen->set_screen(m_screen);
}
void aes_state::machine_start()
@@ -2138,7 +2134,8 @@ void aes_state::device_post_load()
}
-MACHINE_CONFIG_START(aes_state::aes)
+void aes_state::aes(machine_config &config)
+{
neogeo_base(config);
neogeo_stereo(config);
@@ -2146,14 +2143,13 @@ MACHINE_CONFIG_START(aes_state::aes)
NG_MEMCARD(config, m_memcard, 0);
- MCFG_NEOGEO_CARTRIDGE_ADD("cslot1", neogeo_cart, nullptr)
+ NEOGEO_CART_SLOT(config, m_slots[0], neogeo_cart, nullptr);
- MCFG_NEOGEO_CONTROL_PORT_ADD("ctrl1", neogeo_controls, "joy", false)
- MCFG_NEOGEO_CONTROL_PORT_ADD("ctrl2", neogeo_controls, "joy", false)
+ NEOGEO_CONTROL_PORT(config, m_ctrl1, neogeo_controls, "joy", false);
+ NEOGEO_CONTROL_PORT(config, m_ctrl2, neogeo_controls, "joy", false);
- MCFG_SOFTWARE_LIST_ADD("cart_list","neogeo")
- MCFG_SOFTWARE_LIST_FILTER("cart_list","AES")
-MACHINE_CONFIG_END
+ SOFTWARE_LIST(config, "cart_list").set_type("neogeo", SOFTWARE_LIST_ORIGINAL_SYSTEM).set_filter("AES");
+}
@@ -2353,7 +2349,7 @@ MACHINE_CONFIG_END
ROM_Y_ZOOM
#define ROM_Y_ZOOM \
- ROM_REGION( 0x20000, "zoomy", 0 ) \
+ ROM_REGION( 0x20000, "spritegen:zoomy", 0 ) \
ROM_LOAD( "000-lo.lo", 0x00000, 0x20000, CRC(5a86cff2) SHA1(5992277debadeb64d1c1c64b0a92d9293eaf7e4a) )
@@ -2400,7 +2396,7 @@ ROM_START( aes )
ROM_REGION( 0x90000, "audiocpu", ROMREGION_ERASEFF )
- ROM_REGION( 0x20000, "zoomy", 0 )
+ ROM_REGION( 0x20000, "spritegen:zoomy", 0 )
ROM_LOAD( "000-lo.lo", 0x00000, 0x20000, CRC(5a86cff2) SHA1(5992277debadeb64d1c1c64b0a92d9293eaf7e4a) )
ROM_REGION( 0x20000, "fixed", ROMREGION_ERASEFF )
@@ -2424,373 +2420,438 @@ CONS( 1990, aes, 0, 0, aes, aes, aes_state, e
// non-configurable slot (to be used for non-softlist sets, until we introduce some 'template' concept)
// a single cart in slot 1, with pre-defined cart type
-#define NEOGEO_CONFIG_ONE_FIXED_CARTSLOT(_default) \
- MCFG_NEOGEO_CARTRIDGE_ADD("cslot1", neogeo_cart, _default) \
- MCFG_SET_IMAGE_LOADABLE(false)
-
+void mvs_state::cartslot_fixed(machine_config &config, char const *dflt)
+{
+ NEOGEO_CART_SLOT(config, m_slots[0], neogeo_cart, dflt).set_user_loadable(false);
+}
// machine config for one-game fixed config, loaded without using softlists
-MACHINE_CONFIG_START(mvs_led_state::neobase)
+void mvs_led_state::neobase(machine_config &config)
+{
mv1_fixed(config);
- NEOGEO_CONFIG_ONE_FIXED_CARTSLOT("rom")
-MACHINE_CONFIG_END
+ cartslot_fixed(config, "rom");
+}
// used by fatfury2 & ssideki
-MACHINE_CONFIG_START(mvs_led_state::fatfur2)
+void mvs_led_state::fatfur2(machine_config &config)
+{
mv1_fixed(config);
- NEOGEO_CONFIG_ONE_FIXED_CARTSLOT("rom_fatfur2")
-MACHINE_CONFIG_END
+ cartslot_fixed(config, "rom_fatfur2");
+}
-MACHINE_CONFIG_START(mvs_state::kizuna4p)
+void mvs_state::kizuna4p(machine_config &config)
+{
neogeo_arcade(config);
neogeo_mono(config);
- MCFG_NEOGEO_CONTROL_EDGE_CONNECTOR_ADD("edge", neogeo_arc_edge_fixed, "kiz4p", true)
+ NEOGEO_CTRL_EDGE_CONNECTOR(config, m_edge, neogeo_arc_edge_fixed, "kiz4p", true);
- NEOGEO_CONFIG_ONE_FIXED_CARTSLOT("rom")
-MACHINE_CONFIG_END
+ cartslot_fixed(config, "rom");
+}
-MACHINE_CONFIG_START(mvs_led_state::kof97oro)
+void mvs_led_state::kof97oro(machine_config &config)
+{
mv1_fixed(config);
- NEOGEO_CONFIG_ONE_FIXED_CARTSLOT("boot_kof97oro")
-MACHINE_CONFIG_END
+ cartslot_fixed(config, "boot_kof97oro");
+}
-MACHINE_CONFIG_START(mvs_led_state::kog)
+void mvs_led_state::kog(machine_config &config)
+{
mv1_fixed(config);
- NEOGEO_CONFIG_ONE_FIXED_CARTSLOT("boot_kog")
-MACHINE_CONFIG_END
+ cartslot_fixed(config, "boot_kog");
+}
-MACHINE_CONFIG_START(mvs_state::irrmaze)
+void mvs_state::irrmaze(machine_config &config)
+{
neogeo_arcade(config);
neogeo_mono(config);
- MCFG_NEOGEO_CONTROL_EDGE_CONNECTOR_ADD("edge", neogeo_arc_edge_fixed, "irrmaze", true)
+ NEOGEO_CTRL_EDGE_CONNECTOR(config, m_edge, neogeo_arc_edge_fixed, "irrmaze", true);
config.set_default_layout(layout_irrmaze);
- NEOGEO_CONFIG_ONE_FIXED_CARTSLOT("rom")
-MACHINE_CONFIG_END
+ cartslot_fixed(config, "rom");
+}
-MACHINE_CONFIG_START(mvs_led_state::kof98)
+void mvs_led_state::kof98(machine_config &config)
+{
mv1_fixed(config);
- NEOGEO_CONFIG_ONE_FIXED_CARTSLOT("rom_kof98")
-MACHINE_CONFIG_END
+ cartslot_fixed(config, "rom_kof98");
+}
-MACHINE_CONFIG_START(mvs_led_state::mslugx)
+void mvs_led_state::mslugx(machine_config &config)
+{
mv1_fixed(config);
- NEOGEO_CONFIG_ONE_FIXED_CARTSLOT("rom_mslugx")
-MACHINE_CONFIG_END
+ cartslot_fixed(config, "rom_mslugx");
+}
-MACHINE_CONFIG_START(mvs_led_state::kof99)
+void mvs_led_state::kof99(machine_config &config)
+{
mv1_fixed(config);
- NEOGEO_CONFIG_ONE_FIXED_CARTSLOT("sma_kof99")
-MACHINE_CONFIG_END
+ cartslot_fixed(config, "sma_kof99");
+}
-MACHINE_CONFIG_START(mvs_led_state::kof99k)
+void mvs_led_state::kof99k(machine_config &config)
+{
mv1_fixed(config);
- NEOGEO_CONFIG_ONE_FIXED_CARTSLOT("cmc42_kof99k")
-MACHINE_CONFIG_END
+ cartslot_fixed(config, "cmc42_kof99k");
+}
-MACHINE_CONFIG_START(mvs_led_state::garou)
+void mvs_led_state::garou(machine_config &config)
+{
mv1_fixed(config);
- NEOGEO_CONFIG_ONE_FIXED_CARTSLOT("sma_garou")
-MACHINE_CONFIG_END
+ cartslot_fixed(config, "sma_garou");
+}
-MACHINE_CONFIG_START(mvs_led_state::garouh)
+void mvs_led_state::garouh(machine_config &config)
+{
mv1_fixed(config);
- NEOGEO_CONFIG_ONE_FIXED_CARTSLOT("sma_garouh")
-MACHINE_CONFIG_END
+ cartslot_fixed(config, "sma_garouh");
+}
-MACHINE_CONFIG_START(mvs_led_state::garoubl)
+void mvs_led_state::garoubl(machine_config &config)
+{
mv1_fixed(config);
- NEOGEO_CONFIG_ONE_FIXED_CARTSLOT("boot_garoubl")
-MACHINE_CONFIG_END
+ cartslot_fixed(config, "boot_garoubl");
+}
-MACHINE_CONFIG_START(mvs_led_state::mslug3)
+void mvs_led_state::mslug3(machine_config &config)
+{
mv1_fixed(config);
- NEOGEO_CONFIG_ONE_FIXED_CARTSLOT("sma_mslug3")
-MACHINE_CONFIG_END
+ cartslot_fixed(config, "sma_mslug3");
+}
-MACHINE_CONFIG_START(mvs_led_state::mslug3a)
+void mvs_led_state::mslug3a(machine_config &config)
+{
mv1_fixed(config);
- NEOGEO_CONFIG_ONE_FIXED_CARTSLOT("sma_mslug3a")
-MACHINE_CONFIG_END
+ cartslot_fixed(config, "sma_mslug3a");
+}
-MACHINE_CONFIG_START(mvs_led_state::mslug3h)
+void mvs_led_state::mslug3h(machine_config &config)
+{
mv1_fixed(config);
- NEOGEO_CONFIG_ONE_FIXED_CARTSLOT("cmc42_mslug3h")
-MACHINE_CONFIG_END
+ cartslot_fixed(config, "cmc42_mslug3h");
+}
-MACHINE_CONFIG_START(mvs_led_state::mslug3b6)
+void mvs_led_state::mslug3b6(machine_config &config)
+{
mv1_fixed(config);
- NEOGEO_CONFIG_ONE_FIXED_CARTSLOT("boot_mslug3b6")
-MACHINE_CONFIG_END
+ cartslot_fixed(config, "boot_mslug3b6");
+}
-MACHINE_CONFIG_START(mvs_led_state::kof2000)
+void mvs_led_state::kof2000(machine_config &config)
+{
mv1_fixed(config);
- NEOGEO_CONFIG_ONE_FIXED_CARTSLOT("sma_kof2k")
-MACHINE_CONFIG_END
+ cartslot_fixed(config, "sma_kof2k");
+}
-MACHINE_CONFIG_START(mvs_led_state::kof2000n)
+void mvs_led_state::kof2000n(machine_config &config)
+{
mv1_fixed(config);
- NEOGEO_CONFIG_ONE_FIXED_CARTSLOT("cmc50_kof2000n")
-MACHINE_CONFIG_END
+ cartslot_fixed(config, "cmc50_kof2000n");
+}
-MACHINE_CONFIG_START(mvs_led_state::zupapa)
+void mvs_led_state::zupapa(machine_config &config)
+{
mv1_fixed(config);
- NEOGEO_CONFIG_ONE_FIXED_CARTSLOT("cmc42_zupapa")
-MACHINE_CONFIG_END
+ cartslot_fixed(config, "cmc42_zupapa");
+}
-MACHINE_CONFIG_START(mvs_led_state::sengoku3)
+void mvs_led_state::sengoku3(machine_config &config)
+{
mv1_fixed(config);
- NEOGEO_CONFIG_ONE_FIXED_CARTSLOT("cmc42_sengoku3")
-MACHINE_CONFIG_END
+ cartslot_fixed(config, "cmc42_sengoku3");
+}
-MACHINE_CONFIG_START(mvs_led_state::kof2001)
+void mvs_led_state::kof2001(machine_config &config)
+{
mv1_fixed(config);
- NEOGEO_CONFIG_ONE_FIXED_CARTSLOT("cmc50_kof2001")
-MACHINE_CONFIG_END
+ cartslot_fixed(config, "cmc50_kof2001");
+}
-MACHINE_CONFIG_START(mvs_led_state::cthd2k3)
+void mvs_led_state::cthd2k3(machine_config &config)
+{
mv1_fixed(config);
- NEOGEO_CONFIG_ONE_FIXED_CARTSLOT("boot_cthd2k3")
-MACHINE_CONFIG_END
+ cartslot_fixed(config, "boot_cthd2k3");
+}
-MACHINE_CONFIG_START(mvs_led_state::ct2k3sp)
+void mvs_led_state::ct2k3sp(machine_config &config)
+{
mv1_fixed(config);
- NEOGEO_CONFIG_ONE_FIXED_CARTSLOT("boot_ct2k3sp")
-MACHINE_CONFIG_END
+ cartslot_fixed(config, "boot_ct2k3sp");
+}
-MACHINE_CONFIG_START(mvs_led_state::ct2k3sa)
+void mvs_led_state::ct2k3sa(machine_config &config)
+{
mv1_fixed(config);
- NEOGEO_CONFIG_ONE_FIXED_CARTSLOT("boot_ct2k3sa")
-MACHINE_CONFIG_END
+ cartslot_fixed(config, "boot_ct2k3sa");
+}
-MACHINE_CONFIG_START(mvs_led_state::kof2002)
+void mvs_led_state::kof2002(machine_config &config)
+{
mv1_fixed(config);
- NEOGEO_CONFIG_ONE_FIXED_CARTSLOT("k2k2_kof2k2")
-MACHINE_CONFIG_END
+ cartslot_fixed(config, "k2k2_kof2k2");
+}
-MACHINE_CONFIG_START(mvs_led_state::kof2002b)
+void mvs_led_state::kof2002b(machine_config &config)
+{
mv1_fixed(config);
- NEOGEO_CONFIG_ONE_FIXED_CARTSLOT("boot_kf2k2b")
-MACHINE_CONFIG_END
+ cartslot_fixed(config, "boot_kf2k2b");
+}
-MACHINE_CONFIG_START(mvs_led_state::kf2k2pls)
+void mvs_led_state::kf2k2pls(machine_config &config)
+{
mv1_fixed(config);
- NEOGEO_CONFIG_ONE_FIXED_CARTSLOT("k2k2_kf2k2p")
-MACHINE_CONFIG_END
+ cartslot_fixed(config, "k2k2_kf2k2p");
+}
-MACHINE_CONFIG_START(mvs_led_state::kf2k2mp)
+void mvs_led_state::kf2k2mp(machine_config &config)
+{
mv1_fixed(config);
- NEOGEO_CONFIG_ONE_FIXED_CARTSLOT("boot_kf2k2mp")
-MACHINE_CONFIG_END
+ cartslot_fixed(config, "boot_kf2k2mp");
+}
-MACHINE_CONFIG_START(mvs_led_state::kf2k2mp2)
+void mvs_led_state::kf2k2mp2(machine_config &config)
+{
mv1_fixed(config);
- NEOGEO_CONFIG_ONE_FIXED_CARTSLOT("boot_kf2k2mp2")
-MACHINE_CONFIG_END
+ cartslot_fixed(config, "boot_kf2k2mp2");
+}
-MACHINE_CONFIG_START(mvs_led_state::kof10th)
+void mvs_led_state::kof10th(machine_config &config)
+{
mv1_fixed(config);
- NEOGEO_CONFIG_ONE_FIXED_CARTSLOT("boot_kf10th")
-MACHINE_CONFIG_END
+ cartslot_fixed(config, "boot_kf10th");
+}
-MACHINE_CONFIG_START(mvs_led_state::kf10thep)
+void mvs_led_state::kf10thep(machine_config &config)
+{
mv1_fixed(config);
- NEOGEO_CONFIG_ONE_FIXED_CARTSLOT("boot_kf10thep")
-MACHINE_CONFIG_END
+ cartslot_fixed(config, "boot_kf10thep");
+}
-MACHINE_CONFIG_START(mvs_led_state::kf2k5uni)
+void mvs_led_state::kf2k5uni(machine_config &config)
+{
mv1_fixed(config);
- NEOGEO_CONFIG_ONE_FIXED_CARTSLOT("boot_kf2k5uni")
-MACHINE_CONFIG_END
+ cartslot_fixed(config, "boot_kf2k5uni");
+}
-MACHINE_CONFIG_START(mvs_led_state::kof2k4se)
+void mvs_led_state::kof2k4se(machine_config &config)
+{
mv1_fixed(config);
- NEOGEO_CONFIG_ONE_FIXED_CARTSLOT("boot_kf2k4se")
-MACHINE_CONFIG_END
+ cartslot_fixed(config, "boot_kf2k4se");
+}
-MACHINE_CONFIG_START(mvs_led_state::mslug5)
+void mvs_led_state::mslug5(machine_config &config)
+{
mv1_fixed(config);
- NEOGEO_CONFIG_ONE_FIXED_CARTSLOT("pvc_mslug5")
-MACHINE_CONFIG_END
+ cartslot_fixed(config, "pvc_mslug5");
+}
-MACHINE_CONFIG_START(mvs_led_state::ms5plus)
+void mvs_led_state::ms5plus(machine_config &config)
+{
mv1_fixed(config);
- NEOGEO_CONFIG_ONE_FIXED_CARTSLOT("boot_ms5plus")
-MACHINE_CONFIG_END
+ cartslot_fixed(config, "boot_ms5plus");
+}
-MACHINE_CONFIG_START(mvs_led_state::svc)
+void mvs_led_state::svc(machine_config &config)
+{
mv1_fixed(config);
- NEOGEO_CONFIG_ONE_FIXED_CARTSLOT("pvc_svc")
-MACHINE_CONFIG_END
+ cartslot_fixed(config, "pvc_svc");
+}
-MACHINE_CONFIG_START(mvs_led_state::svcboot)
+void mvs_led_state::svcboot(machine_config &config)
+{
mv1_fixed(config);
- NEOGEO_CONFIG_ONE_FIXED_CARTSLOT("boot_svcboot")
-MACHINE_CONFIG_END
+ cartslot_fixed(config, "boot_svcboot");
+}
-MACHINE_CONFIG_START(mvs_led_state::svcplus)
+void mvs_led_state::svcplus(machine_config &config)
+{
mv1_fixed(config);
- NEOGEO_CONFIG_ONE_FIXED_CARTSLOT("boot_svcplus")
-MACHINE_CONFIG_END
+ cartslot_fixed(config, "boot_svcplus");
+}
-MACHINE_CONFIG_START(mvs_led_state::svcplusa)
+void mvs_led_state::svcplusa(machine_config &config)
+{
mv1_fixed(config);
- NEOGEO_CONFIG_ONE_FIXED_CARTSLOT("boot_svcplusa")
-MACHINE_CONFIG_END
+ cartslot_fixed(config, "boot_svcplusa");
+}
-MACHINE_CONFIG_START(mvs_led_state::svcsplus)
+void mvs_led_state::svcsplus(machine_config &config)
+{
mv1_fixed(config);
- NEOGEO_CONFIG_ONE_FIXED_CARTSLOT("boot_svcsplus")
-MACHINE_CONFIG_END
+ cartslot_fixed(config, "boot_svcsplus");
+}
-MACHINE_CONFIG_START(mvs_led_state::samsho5)
+void mvs_led_state::samsho5(machine_config &config)
+{
mv1_fixed(config);
- NEOGEO_CONFIG_ONE_FIXED_CARTSLOT("k2k2_samsh5")
-MACHINE_CONFIG_END
+ cartslot_fixed(config, "k2k2_samsh5");
+}
-MACHINE_CONFIG_START(mvs_led_state::samsho5b)
+void mvs_led_state::samsho5b(machine_config &config)
+{
mv1_fixed(config);
- NEOGEO_CONFIG_ONE_FIXED_CARTSLOT("boot_samsho5b")
-MACHINE_CONFIG_END
+ cartslot_fixed(config, "boot_samsho5b");
+}
-MACHINE_CONFIG_START(mvs_led_state::kof2003)
+void mvs_led_state::kof2003(machine_config &config)
+{
mv1_fixed(config);
- NEOGEO_CONFIG_ONE_FIXED_CARTSLOT("pvc_kf2k3")
-MACHINE_CONFIG_END
+ cartslot_fixed(config, "pvc_kf2k3");
+}
-MACHINE_CONFIG_START(mvs_led_state::kof2003h)
+void mvs_led_state::kof2003h(machine_config &config)
+{
mv1_fixed(config);
- NEOGEO_CONFIG_ONE_FIXED_CARTSLOT("pvc_kf2k3h")
-MACHINE_CONFIG_END
+ cartslot_fixed(config, "pvc_kf2k3h");
+}
-MACHINE_CONFIG_START(mvs_led_state::kf2k3bl)
+void mvs_led_state::kf2k3bl(machine_config &config)
+{
mv1_fixed(config);
- NEOGEO_CONFIG_ONE_FIXED_CARTSLOT("boot_kf2k3bl")
-MACHINE_CONFIG_END
+ cartslot_fixed(config, "boot_kf2k3bl");
+}
-MACHINE_CONFIG_START(mvs_led_state::kf2k3pl)
+void mvs_led_state::kf2k3pl(machine_config &config)
+{
mv1_fixed(config);
- NEOGEO_CONFIG_ONE_FIXED_CARTSLOT("boot_kf2k3pl")
-MACHINE_CONFIG_END
+ cartslot_fixed(config, "boot_kf2k3pl");
+}
-MACHINE_CONFIG_START(mvs_led_state::kf2k3upl)
+void mvs_led_state::kf2k3upl(machine_config &config)
+{
mv1_fixed(config);
- NEOGEO_CONFIG_ONE_FIXED_CARTSLOT("boot_kf2k3upl")
-MACHINE_CONFIG_END
+ cartslot_fixed(config, "boot_kf2k3upl");
+}
-MACHINE_CONFIG_START(mvs_led_state::samsh5sp)
+void mvs_led_state::samsh5sp(machine_config &config)
+{
mv1_fixed(config);
- NEOGEO_CONFIG_ONE_FIXED_CARTSLOT("k2k2_sams5s")
-MACHINE_CONFIG_END
+ cartslot_fixed(config, "k2k2_sams5s");
+}
-MACHINE_CONFIG_START(mvs_led_state::neogeo_mj)
+void mvs_led_state::neogeo_mj(machine_config &config)
+{
mv1_fixed(config);
set_default_bios_tag("japan");
- //no joystick panel
- MCFG_DEVICE_REMOVE("edge")
- MCFG_NEOGEO_CONTROL_EDGE_CONNECTOR_ADD("edge", neogeo_arc_edge, "", false)
+ // no joystick panel
+ m_edge->set_default_option("");
+ m_edge->set_fixed(false);
- //P1 mahjong controller
- MCFG_DEVICE_REMOVE("ctrl1")
- MCFG_DEVICE_REMOVE("ctrl2")
- MCFG_NEOGEO_CONTROL_PORT_ADD("ctrl1", neogeo_arc_pin15, "mahjong", false)
- MCFG_NEOGEO_CONTROL_PORT_ADD("ctrl2", neogeo_arc_pin15, "", true)
+ // P1 mahjong controller
+ m_ctrl1->set_default_option("mahjong");
+ m_ctrl1->set_fixed(false);
- NEOGEO_CONFIG_ONE_FIXED_CARTSLOT("rom")
-MACHINE_CONFIG_END
+ cartslot_fixed(config, "rom");
+}
-MACHINE_CONFIG_START(mvs_led_state::preisle2)
+void mvs_led_state::preisle2(machine_config &config)
+{
mv1_fixed(config);
- NEOGEO_CONFIG_ONE_FIXED_CARTSLOT("cmc42_preisle2")
-MACHINE_CONFIG_END
+ cartslot_fixed(config, "cmc42_preisle2");
+}
-MACHINE_CONFIG_START(mvs_led_state::nitd)
+void mvs_led_state::nitd(machine_config &config)
+{
mv1_fixed(config);
- NEOGEO_CONFIG_ONE_FIXED_CARTSLOT("cmc42_nitd")
-MACHINE_CONFIG_END
+ cartslot_fixed(config, "cmc42_nitd");
+}
-MACHINE_CONFIG_START(mvs_led_state::s1945p)
+void mvs_led_state::s1945p(machine_config &config)
+{
mv1_fixed(config);
- NEOGEO_CONFIG_ONE_FIXED_CARTSLOT("cmc42_s1945p")
-MACHINE_CONFIG_END
+ cartslot_fixed(config, "cmc42_s1945p");
+}
-MACHINE_CONFIG_START(mvs_led_state::lans2004)
+void mvs_led_state::lans2004(machine_config &config)
+{
mv1_fixed(config);
- NEOGEO_CONFIG_ONE_FIXED_CARTSLOT("boot_lans2004")
-MACHINE_CONFIG_END
+ cartslot_fixed(config, "boot_lans2004");
+}
-MACHINE_CONFIG_START(mvs_led_state::pnyaa)
+void mvs_led_state::pnyaa(machine_config &config)
+{
mv1_fixed(config);
- NEOGEO_CONFIG_ONE_FIXED_CARTSLOT("pcm2_pnyaa")
-MACHINE_CONFIG_END
+ cartslot_fixed(config, "pcm2_pnyaa");
+}
-MACHINE_CONFIG_START(mvs_led_state::popbounc)
+void mvs_led_state::popbounc(machine_config &config)
+{
mv1_fixed(config);
- MCFG_DEVICE_REMOVE("edge")
- MCFG_NEOGEO_CONTROL_EDGE_CONNECTOR_ADD("edge", neogeo_arc_edge_fixed, "dial", true)
- NEOGEO_CONFIG_ONE_FIXED_CARTSLOT("rom")
-MACHINE_CONFIG_END
+ NEOGEO_CTRL_EDGE_CONNECTOR(config.replace(), m_edge, neogeo_arc_edge_fixed, "dial", true);
-MACHINE_CONFIG_START(mvs_led_state::ganryu)
+ cartslot_fixed(config, "rom");
+}
+
+void mvs_led_state::ganryu(machine_config &config)
+{
mv1_fixed(config);
- NEOGEO_CONFIG_ONE_FIXED_CARTSLOT("cmc42_ganryu")
-MACHINE_CONFIG_END
+ cartslot_fixed(config, "cmc42_ganryu");
+}
-MACHINE_CONFIG_START(mvs_led_state::bangbead)
+void mvs_led_state::bangbead(machine_config &config)
+{
mv1_fixed(config);
- NEOGEO_CONFIG_ONE_FIXED_CARTSLOT("cmc42_bangbead")
-MACHINE_CONFIG_END
+ cartslot_fixed(config, "cmc42_bangbead");
+}
-MACHINE_CONFIG_START(mvs_led_state::mslug4)
+void mvs_led_state::mslug4(machine_config &config)
+{
mv1_fixed(config);
- NEOGEO_CONFIG_ONE_FIXED_CARTSLOT("pcm2_mslug4")
-MACHINE_CONFIG_END
+ cartslot_fixed(config, "pcm2_mslug4");
+}
-MACHINE_CONFIG_START(mvs_led_state::ms4plus)
+void mvs_led_state::ms4plus(machine_config &config)
+{
mv1_fixed(config);
- NEOGEO_CONFIG_ONE_FIXED_CARTSLOT("pcm2_ms4p")
-MACHINE_CONFIG_END
+ cartslot_fixed(config, "pcm2_ms4p");
+}
-MACHINE_CONFIG_START(mvs_led_state::rotd)
+void mvs_led_state::rotd(machine_config &config)
+{
mv1_fixed(config);
- NEOGEO_CONFIG_ONE_FIXED_CARTSLOT("pcm2_rotd")
-MACHINE_CONFIG_END
+ cartslot_fixed(config, "pcm2_rotd");
+}
-MACHINE_CONFIG_START(mvs_led_state::matrim)
+void mvs_led_state::matrim(machine_config &config)
+{
mv1_fixed(config);
- NEOGEO_CONFIG_ONE_FIXED_CARTSLOT("k2k2_matrim")
-MACHINE_CONFIG_END
+ cartslot_fixed(config, "k2k2_matrim");
+}
-MACHINE_CONFIG_START(mvs_led_state::matrimbl)
+void mvs_led_state::matrimbl(machine_config &config)
+{
mv1_fixed(config);
- NEOGEO_CONFIG_ONE_FIXED_CARTSLOT("boot_matrimbl")
-MACHINE_CONFIG_END
+ cartslot_fixed(config, "boot_matrimbl");
+}
-MACHINE_CONFIG_START(mvs_led_state::jockeygp)
+void mvs_led_state::jockeygp(machine_config &config)
+{
mv1_fixed(config);
- NEOGEO_CONFIG_ONE_FIXED_CARTSLOT("cmc50_jockeygp")
-MACHINE_CONFIG_END
+ cartslot_fixed(config, "cmc50_jockeygp");
+}
-MACHINE_CONFIG_START(mvs_led_state::vliner)
+void mvs_led_state::vliner(machine_config &config)
+{
mv1_fixed(config);
+
// input handlers are installed at DRIVER_INIT...
- MCFG_DEVICE_REMOVE("edge")
- MCFG_DEVICE_REMOVE("ctrl1")
- MCFG_DEVICE_REMOVE("ctrl2")
+ config.device_remove("edge");
+ config.device_remove("ctrl1");
+ config.device_remove("ctrl2");
- NEOGEO_CONFIG_ONE_FIXED_CARTSLOT("rom_vliner")
-MACHINE_CONFIG_END
+ cartslot_fixed(config, "rom_vliner");
+}
-MACHINE_CONFIG_START(mvs_led_state::sbp)
+void mvs_led_state::sbp(machine_config &config)
+{
mv1_fixed(config);
- NEOGEO_CONFIG_ONE_FIXED_CARTSLOT("boot_sbp")
-MACHINE_CONFIG_END
+ cartslot_fixed(config, "boot_sbp");
+}
@@ -6632,7 +6693,7 @@ ROM_END
The following ID's are used by Korean releases:
ID-0122 - Pae Wang Jeon Seol / Legend of a Warrior (Korean censored Samurai Shodown IV)
- ID-0123 - Quiz Daisousa Sen - The Last Count Down (Korean release)
+ ID-0123 - Quiz Salibtamjeong - The Last Count Down (Korean localized Quiz Daisousa Sen)
ID-0124 - Real Bout Fatal Fury Special / Real Bout Garou Densetsu Special (Korean release)
ID-0134 - The Last Soldier (Korean release of The Last Blade)
ID-0140 - Real Bout Fatal Fury 2 - The Newcomers (Korean release)
@@ -11643,7 +11704,7 @@ GAME( 1991, gpilotsh, gpilots, neobase, neogeo, mvs_led_state, empty_ini
GAME( 1991, gpilotsp, gpilots, neobase, neogeo, mvs_led_state, empty_init, ROT0, "SNK", "Ghost Pilots (prototype)", MACHINE_SUPPORTS_SAVE )
GAME( 1990, joyjoy, neogeo, neobase, neogeo, mvs_led_state, empty_init, ROT0, "SNK", "Puzzled / Joy Joy Kid (NGM-021 ~ NGH-021)", MACHINE_SUPPORTS_SAVE )
GAME( 1991, quizdais, neogeo, neobase, neogeo, mvs_led_state, empty_init, ROT0, "SNK", "Quiz Daisousa Sen - The Last Count Down (NGM-023 ~ NGH-023)", MACHINE_SUPPORTS_SAVE )
-GAME( 1991, quizdaisk, quizdais, neobase, neogeo, mvs_led_state, empty_init, ROT0, "SNK", "Quiz Daisousa Sen - The Last Count Down (Korean release)", MACHINE_SUPPORTS_SAVE )
+GAME( 1995, quizdaisk, quizdais, neobase, neogeo, mvs_led_state, empty_init, ROT0, "SNK / Viccom", "Quiz Salibtamjeong - The Last Count Down (Korean localized Quiz Daisousa Sen)", MACHINE_SUPPORTS_SAVE )
GAME( 1992, lresort, neogeo, neobase, neogeo, mvs_led_state, empty_init, ROT0, "SNK", "Last Resort", MACHINE_SUPPORTS_SAVE )
GAME( 1992, lresortp, lresort, neobase, neogeo, mvs_led_state, empty_init, ROT0, "SNK", "Last Resort (prototype)", MACHINE_SUPPORTS_SAVE )
GAME( 1991, eightman, neogeo, neobase, neogeo, mvs_led_state, empty_init, ROT0, "SNK / Pallas", "Eight Man (NGM-025 ~ NGH-025)", MACHINE_SUPPORTS_SAVE )
@@ -11740,7 +11801,7 @@ GAME( 1999, garoubl, garou, garoubl, neogeo, mvs_led_state, empty_ini
GAME( 2000, mslug3, neogeo, mslug3, neogeo, mvs_led_state, empty_init, ROT0, "SNK", "Metal Slug 3 (NGM-2560)" , MACHINE_SUPPORTS_SAVE ) /* Encrypted Code & GFX */
GAME( 2000, mslug3a, mslug3, mslug3a, neogeo, mvs_led_state, empty_init, ROT0, "SNK", "Metal Slug 3 (NGM-2560, earlier)" , MACHINE_SUPPORTS_SAVE ) /* Encrypted Code & GFX - revision Mar/17/2000 1:36 (from SMA rom) */
GAME( 2000, mslug3h, mslug3, mslug3h, neogeo, mvs_led_state, empty_init, ROT0, "SNK", "Metal Slug 3 (NGH-2560)" , MACHINE_SUPPORTS_SAVE ) /* Encrypted GFX */
-GAME( 2000, mslug3b6, mslug3, mslug3b6, neogeo, mvs_led_state, empty_init, ROT0, "bootleg", "Metal Slug 6 (Metal Slug 3 bootleg)", MACHINE_SUPPORTS_SAVE ) /* real Metal Slug 6 is an Atomiswave HW game, see naomi.c ;-) */
+GAME( 2000, mslug3b6, mslug3, mslug3b6, neogeo, mvs_led_state, empty_init, ROT0, "bootleg", "Metal Slug 6 (Metal Slug 3 bootleg)", MACHINE_SUPPORTS_SAVE ) /* real Metal Slug 6 is an Atomiswave HW game, see naomi.cpp ;-) */
GAME( 2000, kof2000, neogeo, kof2000, neogeo, mvs_led_state, empty_init, ROT0, "SNK", "The King of Fighters 2000 (NGM-2570 ~ NGH-2570)" , MACHINE_SUPPORTS_SAVE ) /* Encrypted Code & GFX */
GAME( 2000, kof2000n, kof2000, kof2000n, neogeo, mvs_led_state, empty_init, ROT0, "SNK", "The King of Fighters 2000 (not encrypted)" , MACHINE_SUPPORTS_SAVE ) /* Encrypted GFX */
GAME( 2001, zupapa, neogeo, zupapa, neogeo, mvs_led_state, empty_init, ROT0, "SNK", "Zupapa!" , MACHINE_SUPPORTS_SAVE ) /* Encrypted GFX */
@@ -11764,7 +11825,7 @@ GAME( 2004, kof2k4se, kof2002, kof2k4se, neogeo, mvs_led_state, empty_ini
GAME( 2003, mslug5, neogeo, mslug5, neogeo, mvs_led_state, empty_init, ROT0, "SNK Playmore", "Metal Slug 5 (NGM-2680)", MACHINE_SUPPORTS_SAVE )
GAME( 2003, mslug5h, mslug5, mslug5, neogeo, mvs_led_state, empty_init, ROT0, "SNK Playmore", "Metal Slug 5 (NGH-2680)", MACHINE_SUPPORTS_SAVE ) /* Also found in later MVS carts */
GAME( 2003, ms5plus, mslug5, ms5plus, neogeo, mvs_led_state, empty_init, ROT0, "bootleg", "Metal Slug 5 Plus (bootleg)", MACHINE_SUPPORTS_SAVE )
-GAME( 2003, svc, neogeo, svc, neogeo, mvs_led_state, empty_init, ROT0, "SNK Playmore", "SNK vs. Capcom - SVC Chaos (NGM-2690 ~ NGH-2690)", MACHINE_SUPPORTS_SAVE )
+GAME( 2003, svc, neogeo, svc, neogeo, mvs_led_state, empty_init, ROT0, "Playmore / Capcom", "SNK vs. Capcom - SVC Chaos (NGM-2690 ~ NGH-2690)", MACHINE_SUPPORTS_SAVE )
GAME( 2003, svcboot, svc, svcboot, neogeo, mvs_led_state, empty_init, ROT0, "bootleg", "SNK vs. Capcom - SVC Chaos (bootleg)", MACHINE_SUPPORTS_SAVE )
GAME( 2003, svcplus, svc, svcplus, neogeo, mvs_led_state, empty_init, ROT0, "bootleg", "SNK vs. Capcom - SVC Chaos Plus (bootleg set 1)", MACHINE_SUPPORTS_SAVE )
GAME( 2003, svcplusa, svc, svcplusa, neogeo, mvs_led_state, empty_init, ROT0, "bootleg", "SNK vs. Capcom - SVC Chaos Plus (bootleg set 2)", MACHINE_SUPPORTS_SAVE )
@@ -11814,7 +11875,7 @@ GAME( 1992, viewpoin, neogeo, neobase, neogeo, mvs_led_state, empty_ini
GAME( 1994, janshin, neogeo, neogeo_mj, neogeo_mj, mvs_led_state, empty_init, ROT0, "Aicom", "Janshin Densetsu - Quest of Jongmaster", MACHINE_SUPPORTS_SAVE )
GAME( 1995, pulstar, neogeo, neobase, neogeo, mvs_led_state, empty_init, ROT0, "Aicom", "Pulstar", MACHINE_SUPPORTS_SAVE )
GAME( 1998, blazstar, neogeo, neobase, neogeo, mvs_led_state, empty_init, ROT0, "Yumekobo", "Blazing Star", MACHINE_SUPPORTS_SAVE )
-GAME( 1999, preisle2, neogeo, preisle2, neogeo, mvs_led_state, empty_init, ROT0, "Yumekobo", "Prehistoric Isle 2" , MACHINE_SUPPORTS_SAVE ) /* Encrypted GFX */
+GAME( 1999, preisle2, neogeo, preisle2, neogeo, mvs_led_state, empty_init, ROT0, "Yumekobo / Saurus", "Prehistoric Isle 2" , MACHINE_SUPPORTS_SAVE ) /* Encrypted GFX */
// Data East Corporation
GAME( 1993, spinmast, neogeo, neobase, neogeo, mvs_led_state, empty_init, ROT0, "Data East Corporation", "Spin Master / Miracle Adventure", MACHINE_SUPPORTS_SAVE )
@@ -11855,14 +11916,14 @@ GAME( 1994, zedblade, neogeo, neobase, neogeo, mvs_led_state, empty_ini
GAME( 1999, s1945p, neogeo, s1945p, neogeo, mvs_led_state, empty_init, ROT0, "Psikyo", "Strikers 1945 Plus" , MACHINE_SUPPORTS_SAVE ) /* Encrypted GFX */
// Saurus
-GAME( 1995, quizkof, neogeo, neobase, neogeo, mvs_led_state, empty_init, ROT0, "Saurus", "Quiz King of Fighters (SAM-080 ~ SAH-080)", MACHINE_SUPPORTS_SAVE )
-GAME( 1995, quizkofk, quizkof, neobase, neogeo, mvs_led_state, empty_init, ROT0, "Saurus", "Quiz King of Fighters (Korean release)", MACHINE_SUPPORTS_SAVE )
+GAME( 1995, quizkof, neogeo, neobase, neogeo, mvs_led_state, empty_init, ROT0, "Saurus (SNK license)", "Quiz King of Fighters (SAM-080 ~ SAH-080)", MACHINE_SUPPORTS_SAVE )
+GAME( 1996, quizkofk, quizkof, neobase, neogeo, mvs_led_state, empty_init, ROT0, "Saurus / Viccom (SNK license)", "Quiz King of Fighters (Korea)", MACHINE_SUPPORTS_SAVE )
GAME( 1995, stakwin, neogeo, neobase, neogeo, mvs_led_state, empty_init, ROT0, "Saurus", "Stakes Winner / Stakes Winner - GI Kinzen Seiha e no Michi", MACHINE_SUPPORTS_SAVE )
GAME( 1995, stakwindev, stakwin, neobase, neogeo, mvs_led_state, empty_init, ROT0, "Saurus", "Stakes Winner / Stakes Winner - GI Kinzen Seiha e no Michi (early development board)", MACHINE_SUPPORTS_SAVE | MACHINE_NOT_WORKING | MACHINE_IS_INCOMPLETE )
GAME( 1996, ragnagrd, neogeo, neobase, neogeo, mvs_led_state, empty_init, ROT0, "Saurus", "Ragnagard / Shin-Oh-Ken", MACHINE_SUPPORTS_SAVE )
GAME( 1996, pgoal, neogeo, neobase, neogeo, mvs_led_state, empty_init, ROT0, "Saurus", "Pleasure Goal / Futsal - 5 on 5 Mini Soccer (NGM-219)", MACHINE_SUPPORTS_SAVE )
-GAME( 1996, ironclad, neogeo, neobase, neogeo, mvs_led_state, empty_init, ROT0, "Saurus", "Choutetsu Brikin'ger - Iron Clad (prototype)", MACHINE_SUPPORTS_SAVE )
-GAME( 1996, ironclado, ironclad, neobase, neogeo, mvs_led_state, empty_init, ROT0, "bootleg", "Choutetsu Brikin'ger - Iron Clad (prototype, bootleg)", MACHINE_SUPPORTS_SAVE )
+GAME( 1996, ironclad, neogeo, neobase, neogeo, mvs_led_state, empty_init, ROT0, "Saurus", "Choutetsu Brikin'ger / Iron Clad (prototype)", MACHINE_SUPPORTS_SAVE )
+GAME( 1996, ironclado, ironclad, neobase, neogeo, mvs_led_state, empty_init, ROT0, "bootleg", "Choutetsu Brikin'ger / Iron Clad (prototype, bootleg)", MACHINE_SUPPORTS_SAVE )
GAME( 1996, stakwin2, neogeo, neobase, neogeo, mvs_led_state, empty_init, ROT0, "Saurus", "Stakes Winner 2", MACHINE_SUPPORTS_SAVE )
GAME( 1997, shocktro, neogeo, neobase, neogeo, mvs_led_state, empty_init, ROT0, "Saurus", "Shock Troopers (set 1)", MACHINE_SUPPORTS_SAVE )
GAME( 1997, shocktroa, shocktro, neobase, neogeo, mvs_led_state, empty_init, ROT0, "Saurus", "Shock Troopers (set 2)", MACHINE_SUPPORTS_SAVE )
@@ -11892,8 +11953,8 @@ GAME( 1996, sdodgeb, neogeo, neobase, neogeo, mvs_led_state, empty_ini
GAME( 1996, twsoc96, neogeo, neobase, neogeo, mvs_led_state, empty_init, ROT0, "Tecmo", "Tecmo World Soccer '96", MACHINE_SUPPORTS_SAVE )
// Viccom
-GAME( 1994, fightfev, neogeo, neobase, neogeo, mvs_led_state, empty_init, ROT0, "Viccom", "Fight Fever (set 1)", MACHINE_SUPPORTS_SAVE )
-GAME( 1994, fightfeva, fightfev, neobase, neogeo, mvs_led_state, empty_init, ROT0, "Viccom", "Fight Fever (set 2)", MACHINE_SUPPORTS_SAVE )
+GAME( 1994, fightfev, neogeo, neobase, neogeo, mvs_led_state, empty_init, ROT0, "Viccom", "Fight Fever / Wang Jung Wang (set 1)", MACHINE_SUPPORTS_SAVE )
+GAME( 1994, fightfeva, fightfev, neobase, neogeo, mvs_led_state, empty_init, ROT0, "Viccom", "Fight Fever / Wang Jung Wang (set 2)", MACHINE_SUPPORTS_SAVE )
// Video System Co.
GAME( 1994, pspikes2, neogeo, neobase, neogeo, mvs_led_state, empty_init, ROT0, "Video System Co.", "Power Spikes II (NGM-068)", MACHINE_SUPPORTS_SAVE )
@@ -11955,7 +12016,7 @@ GAME( 2005, lasthope, neogeo, neobase, neogeo, mvs_led_state, empty_ini
// Fast Striker 1.5 (c)2010 - MVS/AES
// GunLord (c)2012 - MVS/AES
// Neo XYX (c)2013 - MVS/AES
-// Razion (c)2014 - MVS/AES?
+// Razion (c)2014 - MVS/AES
// Kraut Buster (c)2016 - MVS/AES
// N.C.I - LE CORTEX
diff --git a/src/mame/drivers/neogeocd.cpp b/src/mame/drivers/neogeocd.cpp
index 6f6a6910f0a..8b7787dab4a 100644
--- a/src/mame/drivers/neogeocd.cpp
+++ b/src/mame/drivers/neogeocd.cpp
@@ -1033,7 +1033,8 @@ uint32_t ngcd_state::screen_update(screen_device &screen, bitmap_rgb32 &bitmap,
}
-MACHINE_CONFIG_START(ngcd_state::neocd)
+void ngcd_state::neocd(machine_config &config)
+{
neogeo_base(config);
neogeo_stereo(config);
@@ -1045,8 +1046,7 @@ MACHINE_CONFIG_START(ngcd_state::neocd)
subdevice<hc259_device>("systemlatch")->q_out_cb<1>().set_log("NeoCD: write to regular vector change address?"); // what IS going on with "neocdz doubledr" and why do games write here if it's hooked up to nothing?
- MCFG_SCREEN_MODIFY("screen")
- MCFG_SCREEN_UPDATE_DRIVER(ngcd_state, screen_update)
+ m_screen->set_screen_update(FUNC(ngcd_state::screen_update));
// temporary until things are cleaned up
LC89510_TEMP(config, m_tempcdc, 0); // cd controller
@@ -1057,15 +1057,14 @@ MACHINE_CONFIG_START(ngcd_state::neocd)
NVRAM(config, "saveram", nvram_device::DEFAULT_ALL_0);
- MCFG_NEOGEO_CONTROL_PORT_ADD("ctrl1", neogeo_controls, "joy", false)
- MCFG_NEOGEO_CONTROL_PORT_ADD("ctrl2", neogeo_controls, "joy", false)
+ NEOGEO_CONTROL_PORT(config, m_ctrl1, neogeo_controls, "joy", false);
+ NEOGEO_CONTROL_PORT(config, m_ctrl2, neogeo_controls, "joy", false);
- MCFG_CDROM_ADD( "cdrom" )
- MCFG_CDROM_INTERFACE("neocd_cdrom")
- MCFG_SOFTWARE_LIST_ADD("cd_list","neocd")
+ CDROM(config, "cdrom").set_interface("neocd_cdrom");
+ SOFTWARE_LIST(config, "cd_list").set_type("neocd", SOFTWARE_LIST_ORIGINAL_SYSTEM);
m_ym->set_addrmap(0, &ngcd_state::neocd_ym_map);
-MACHINE_CONFIG_END
+}
@@ -1087,7 +1086,7 @@ ROM_START( neocd )
ROM_REGION( 0x200000, "maincpu", ROMREGION_ERASE00 )
/* 2MB of 68K RAM */
- ROM_REGION( 0x20000, "zoomy", 0 )
+ ROM_REGION( 0x20000, "spritegen:zoomy", 0 )
ROM_LOAD( "000-lo.lo", 0x00000, 0x20000, CRC(5a86cff2) SHA1(5992277debadeb64d1c1c64b0a92d9293eaf7e4a) )
ROM_END
@@ -1101,7 +1100,7 @@ ROM_START( neocdz )
ROM_REGION( 0x200000, "maincpu", ROMREGION_ERASE00 )
/* 2MB of 68K RAM */
- ROM_REGION( 0x20000, "zoomy", 0 )
+ ROM_REGION( 0x20000, "spritegen:zoomy", 0 )
ROM_LOAD( "000-lo.lo", 0x00000, 0x20000, CRC(5a86cff2) SHA1(5992277debadeb64d1c1c64b0a92d9293eaf7e4a) )
ROM_END
diff --git a/src/mame/drivers/neopcb.cpp b/src/mame/drivers/neopcb.cpp
index 18c0ed85e85..9f1a460ae08 100644
--- a/src/mame/drivers/neopcb.cpp
+++ b/src/mame/drivers/neopcb.cpp
@@ -69,16 +69,17 @@ void neopcb_state::device_post_load()
membank("cpu_bank")->set_base(m_region_maincpu->base() + m_bank_base);
}
-MACHINE_CONFIG_START(neopcb_state::neopcb)
+void neopcb_state::neopcb(machine_config &config)
+{
neogeo_arcade(config);
neogeo_mono(config);
- MCFG_NEOGEO_CONTROL_EDGE_CONNECTOR_ADD("edge", neogeo_arc_edge, "joy", true)
+ NEOGEO_CTRL_EDGE_CONNECTOR(config, m_edge, neogeo_arc_edge, "joy", true);
- MCFG_CMC_PROT_ADD("cmc50")
- MCFG_PCM2_PROT_ADD("pcm2")
- MCFG_PVC_PROT_ADD("pvc")
-MACHINE_CONFIG_END
+ NG_CMC_PROT(config, "cmc50", 0);
+ NG_PCM2_PROT(config, "pcm2", 0);
+ NG_PVC_PROT(config, "pvc", 0);
+}
// Game specific input definitions
@@ -106,7 +107,7 @@ INPUT_PORTS_END
*************************************/
#define ROM_Y_ZOOM \
- ROM_REGION( 0x20000, "zoomy", 0 ) \
+ ROM_REGION( 0x20000, "spritegen:zoomy", 0 ) \
ROM_LOAD( "000-lo.lo", 0x00000, 0x20000, CRC(5a86cff2) SHA1(5992277debadeb64d1c1c64b0a92d9293eaf7e4a) )
@@ -475,7 +476,7 @@ void neopcb_state::install_common()
m_bank_base = 0;
init_audio();
m_audiocpu->reset();
- init_ym();
+ m_ym->reset();
init_sprites();
}
@@ -552,6 +553,6 @@ void neopcb_state::init_kf2k3pcb()
GAME( 2003, ms5pcb, 0, neopcb, dualbios, neopcb_state, init_ms5pcb, ROT0, "SNK Playmore", "Metal Slug 5 (JAMMA PCB)", MACHINE_SUPPORTS_SAVE )
-GAME( 2003, svcpcb, 0, neopcb, dualbios, neopcb_state, init_svcpcb, ROT0, "SNK Playmore", "SNK vs. Capcom - SVC Chaos (JAMMA PCB, set 1)", MACHINE_SUPPORTS_SAVE )
-GAME( 2003, svcpcba, svcpcb, neopcb, dualbios, neopcb_state, init_svcpcb, ROT0, "SNK Playmore", "SNK vs. Capcom - SVC Chaos (JAMMA PCB, set 2)" , MACHINE_SUPPORTS_SAVE ) /* Encrypted Code */
+GAME( 2003, svcpcb, 0, neopcb, dualbios, neopcb_state, init_svcpcb, ROT0, "Playmore / Capcom", "SNK vs. Capcom - SVC Chaos (JAMMA PCB, set 1)", MACHINE_SUPPORTS_SAVE )
+GAME( 2003, svcpcba, svcpcb, neopcb, dualbios, neopcb_state, init_svcpcb, ROT0, "Playmore / Capcom", "SNK vs. Capcom - SVC Chaos (JAMMA PCB, set 2)", MACHINE_SUPPORTS_SAVE ) /* Encrypted Code */
GAME( 2003, kf2k3pcb, 0, neopcb, neogeo, neopcb_state, init_kf2k3pcb, ROT0, "SNK Playmore", "The King of Fighters 2003 (Japan, JAMMA PCB)", MACHINE_SUPPORTS_SAVE )
diff --git a/src/mame/drivers/neoprint.cpp b/src/mame/drivers/neoprint.cpp
index 97f1886528c..2a86c3a906f 100644
--- a/src/mame/drivers/neoprint.cpp
+++ b/src/mame/drivers/neoprint.cpp
@@ -55,8 +55,13 @@ public:
void nprsp(machine_config &config);
void init_98best44();
+ void init_npmillen();
void init_npcartv1();
+ void init_npotogib();
void init_nprsp();
+ void init_npscv1();
+ void init_npskv();
+ void init_npsprgv4();
void init_unkneo();
protected:
@@ -499,7 +504,8 @@ void neoprint_state::machine_start()
m_upd4990a->c2_w(1);
}
-MACHINE_CONFIG_START(neoprint_state::neoprint)
+void neoprint_state::neoprint(machine_config &config)
+{
M68000(config, m_maincpu, 12000000);
m_maincpu->set_addrmap(AS_PROGRAM, &neoprint_state::neoprint_map);
m_maincpu->set_periodic_int(FUNC(neoprint_state::irq3_line_hold), attotime::from_hz(45)); /* camera / printer irq, unknown timing */
@@ -586,7 +592,7 @@ void neoprint_state::nprsp(machine_config &config)
// uses NEO-MVS PROGBK1 (Same as NeoGeo MVS cart)
// and PSTM-ROMC (unique to NeoPrint) (has ZMC chip)
-ROM_START( neoprint )
+ROM_START( neoprint ) // NP 1.21 19961210 string
ROM_REGION( 0x200000, "maincpu", ROMREGION_ERASEFF )
ROM_LOAD16_WORD_SWAP( "ep1.bin", 0x000000, 0x80000, CRC(271da3ee) SHA1(50132d2ac5524e880ec0c2ba3617bf516fd36e7d) )
// ROM_RELOAD( 0x100000, 0x80000 ) /* checks the same string from above to be present there? Why? */
@@ -604,7 +610,7 @@ ROM_START( neoprint )
ROM_LOAD32_BYTE( "c4.bin", 0x200001, 0x80000, CRC(c7e5e6ce) SHA1(f1e37732446ae6146b3cb51a9714c5edd539d7e4) )
ROM_END
-ROM_START( npcartv1 )
+ROM_START( npcartv1 ) // NP 1.11 19961018 string
ROM_REGION( 0x200000, "maincpu", ROMREGION_ERASEFF )
ROM_LOAD16_WORD_SWAP( "ep1.bin", 0x000000, 0x80000, CRC(18606198) SHA1(d968e09131c22769e22c7310aca1f02e739f38f1) )
// ROM_RELOAD( 0x100000, 0x80000 ) /* checks the same string from above to be present there? Why? */
@@ -620,12 +626,27 @@ ROM_START( npcartv1 )
ROM_LOAD32_BYTE( "c2.bin", 0x00001, 0x80000, CRC(7ce39dc2) SHA1(c5be90657350258b670b55dd9c77f7899133ced3) )
ROM_END
+ROM_START( npsprgv4 ) // NP 1.30 19970228 string
+ ROM_REGION( 0x200000, "maincpu", ROMREGION_ERASEFF )
+ ROM_LOAD16_WORD_SWAP( "p004-ep1 neo-mvs progbk1.ep1", 0x000000, 0x80000, CRC(4a322439) SHA1(4478f0e20d2c892a2c8e67ccc1173fd5edaa42e3) )
+
+ ROM_REGION( 0x20000, "audiocpu", 0 ) /* Z80 program */
+ ROM_LOAD( "p004-m1 neo-pstm cha136.m1", 0x00000, 0x20000, CRC(6d77cdaa) SHA1(f88a93b3085b18b6663b4e51fccaa41958aafae1) ) // same as 98best44
+
+ ROM_REGION( 0x200000, "ymsnd", 0 ) /* Samples */
+ ROM_LOAD( "p004-v1 neo-mvs progbk1.v1", 0x000000, 0x200000, CRC(118a84fd) SHA1(9059297a42a329eca47a82327c301853219013bd) ) // same as 98best44
+
+ ROM_REGION( 0x800000, "gfx1", ROMREGION_ERASE00 )
+ ROM_LOAD32_BYTE( "p004-c1 neo-pstm cha136.c1", 0x000000, 0x200000, CRC(3654d45c) SHA1(f2f770d090e45008da682775847fdb3433163eae) )
+ ROM_LOAD32_BYTE( "p004-c2 neo-pstm cha136.c2", 0x000001, 0x200000, CRC(de75f729) SHA1(b8880c8b358aa4b59d79493458d27a0a13d80094) )
+ROM_END
+
/* logo: Neo Print
small text: Cassette supporting Neo Print and Neo Print Multi
(cassette=cartridge)
title: '98 NeoPri Best 44 version */
-ROM_START( 98best44 )
+ROM_START( 98best44 ) // NP 1.30 19970430 string
ROM_REGION( 0x200000, "maincpu", ROMREGION_ERASEFF )
ROM_LOAD16_WORD_SWAP( "p060-ep1", 0x000000, 0x080000, CRC(d42e505d) SHA1(0ad6b0288f36c339832730a03e53cbc07dab4f82))
// ROM_RELOAD( 0x100000, 0x80000 ) /* checks the same string from above to be present there? Why? */
@@ -641,7 +662,86 @@ ROM_START( 98best44 )
ROM_LOAD32_BYTE( "pt060-c2", 0x000001, 0x100000, CRC(66a8e56a) SHA1(adfd1e52d52806a785f1e9b1ae2ac969b6ed60af) )
ROM_END
-ROM_START( nprsp )
+ROM_START( npsprg98 ) // NP 1.30 19970430 string
+ ROM_REGION( 0x200000, "maincpu", ROMREGION_ERASEFF )
+ ROM_LOAD16_WORD_SWAP( "p042-p1 neo-mvs progbk1.p1", 0x000000, 0x100000, CRC(c0621456) SHA1(eb615a11f909a680aed2d99c641b3c47be4fc56e) )
+
+ ROM_REGION( 0x20000, "audiocpu", 0 ) /* Z80 program */
+ ROM_LOAD( "pt004-m1 neo-pstm cha136.m1", 0x00000, 0x20000, CRC(6d77cdaa) SHA1(f88a93b3085b18b6663b4e51fccaa41958aafae1) ) // same as 98best44
+
+ ROM_REGION( 0x200000, "ymsnd", 0 ) /* Samples */
+ ROM_LOAD( "pt004-v1 neo-mvs progbk1.v1", 0x000000, 0x200000, CRC(118a84fd) SHA1(9059297a42a329eca47a82327c301853219013bd) ) // same as 98best44
+
+ ROM_REGION( 0x400000, "gfx1", ROMREGION_ERASE00 )
+ ROM_LOAD32_BYTE( "p042-c1 neo-pstm cha136.c1", 0x000000, 0x100000, CRC(bc822f3f) SHA1(a24e0a556d2f15a61fd80a049b7b31d61cb0596e) )
+ ROM_LOAD32_BYTE( "p042-c2 neo-pstm cha136.c2", 0x000001, 0x100000, CRC(95a4a0a9) SHA1(2e07006af6c84c98a5b5ab3191e3278766e91faa) )
+ROM_END
+
+ROM_START( npskv ) // NP 1.30 19970430 string
+ ROM_REGION( 0x200000, "maincpu", ROMREGION_ERASEFF )
+ ROM_LOAD16_WORD_SWAP( "p012-p1 neo-mvs progbk1.p1", 0x000000, 0x100000, CRC(de8996f6) SHA1(8fb2bc78206ec543148740f94c19bcdb50ad3271) )
+
+ ROM_REGION( 0x20000, "audiocpu", 0 ) /* Z80 program */
+ ROM_LOAD( "p004-m1 neo-pstm cha136.m1", 0x00000, 0x20000, CRC(6d77cdaa) SHA1(f88a93b3085b18b6663b4e51fccaa41958aafae1) ) // same as 98best44
+
+ ROM_REGION( 0x200000, "ymsnd", 0 ) /* Samples */
+ ROM_LOAD( "p04-v1 neo-mvs progbk1.v1", 0x000000, 0x200000, CRC(118a84fd) SHA1(9059297a42a329eca47a82327c301853219013bd) ) // same as 98best44
+
+ ROM_REGION( 0x400000, "gfx1", ROMREGION_ERASE00 )
+ ROM_LOAD32_BYTE( "p012-c1 neo-pstm cha136.c1", 0x000000, 0x100000, CRC(315f27c0) SHA1(889c82073ac0fb94e5bd7b6ff11f19261d79f011) )
+ ROM_LOAD32_BYTE( "p012-c2 neo-pstm cha136.c2", 0x000001, 0x100000, CRC(0711f184) SHA1(4ab860c5e200fec70374ab552c97b59a35ca73c3) )
+ROM_END
+
+ROM_START( npusagif ) // NP 1.30 19970430 string
+ ROM_REGION( 0x200000, "maincpu", ROMREGION_ERASEFF )
+ ROM_LOAD16_WORD_SWAP( "p061-ep1 neo-mvs progbk1.ep1", 0x000000, 0x080000, CRC(ec6d7fda) SHA1(f219f8a9763f92ef952236ea3e01fe9b684823df) )
+
+ ROM_REGION( 0x20000, "audiocpu", 0 ) /* Z80 program */
+ ROM_LOAD( "pt004-m1 neo-pstm cha136.m1", 0x00000, 0x20000, CRC(6d77cdaa) SHA1(f88a93b3085b18b6663b4e51fccaa41958aafae1) ) // same as 98best44
+
+ ROM_REGION( 0x200000, "ymsnd", 0 ) /* Samples */
+ ROM_LOAD( "pt004-v1 neo-mvs progbk1.v1", 0x000000, 0x200000, CRC(118a84fd) SHA1(9059297a42a329eca47a82327c301853219013bd) ) // same as 98best44
+
+ ROM_REGION( 0x400000, "gfx1", ROMREGION_ERASE00 )
+ ROM_LOAD32_BYTE( "p061-c1 neo-pstm cha136.c1", 0x000000, 0x100000, CRC(9686c78d) SHA1(a72a191540bbe3121e3be9e05e683ba9f2714aba) )
+ ROM_LOAD32_BYTE( "p061-c2 neo-pstm cha136.c2", 0x000001, 0x100000, CRC(f354b86b) SHA1(1058465af35fef6923f7fbe2cccf4c01509528d6) )
+ROM_END
+
+ROM_START( npotogib ) // NP 1.30 19970430 string
+ ROM_REGION( 0x200000, "maincpu", ROMREGION_ERASEFF )
+ ROM_LOAD16_WORD_SWAP( "p0025-ep1 neo-mvs progbk1.ep1", 0x000000, 0x080000, CRC(eaefe748) SHA1(9facab7e70901a9030d40b823473e46cfa5389ad) )
+
+ ROM_REGION( 0x20000, "audiocpu", 0 ) /* Z80 program */
+ ROM_LOAD( "pt004-m1 neo-pstm cha136.m1", 0x00000, 0x20000, CRC(6d77cdaa) SHA1(f88a93b3085b18b6663b4e51fccaa41958aafae1) ) // same as 98best44
+
+ ROM_REGION( 0x200000, "ymsnd", 0 ) /* Samples */
+ ROM_LOAD( "pt004-v1 neo-mvs progbk1.v1", 0x000000, 0x200000, CRC(118a84fd) SHA1(9059297a42a329eca47a82327c301853219013bd) ) // same as 98best44
+
+ ROM_REGION( 0x400000, "gfx1", ROMREGION_ERASE00 )
+ ROM_LOAD32_BYTE( "p0025-c1 pstm-romc.c1", 0x000000, 0x80000, CRC(585451c5) SHA1(288d1f725c8747d260f46ed7ef8f380c991e8b33) )
+ ROM_LOAD32_BYTE( "p0025-c2 pstm-romc.c2", 0x000001, 0x80000, CRC(74468a3d) SHA1(55b85c02d033636e8f7feda79bb3c0b29408f361) )
+ ROM_LOAD32_BYTE( "p0025-c3 pstm-romc.c3", 0x200001, 0x80000, CRC(ef1854e7) SHA1(e254bcf03845b61d9f40efeaba7fba133aaad79d) )
+ ROM_LOAD32_BYTE( "p0025-c4 pstm-romc.c4", 0x200002, 0x80000, CRC(a2261905) SHA1(cb05a11ed4c302448c3e6779cb5428dd0c907e18) )
+ROM_END
+
+ROM_START( npfpit ) // NP 1.30 19990225 string
+ ROM_REGION( 0x200000, "maincpu", ROMREGION_ERASEFF )
+ ROM_LOAD16_WORD_SWAP( "po97-ep1 neo-mvs progbk1.ep1", 0x000000, 0x080000, CRC(d2940f25) SHA1(d65e719d9df993e1433e580797bf0580d564c9a2) )
+
+ ROM_REGION( 0x20000, "audiocpu", 0 ) /* Z80 program */
+ ROM_LOAD( "pt004-m1 neo-pstm cha136.m1", 0x00000, 0x20000, CRC(6d77cdaa) SHA1(f88a93b3085b18b6663b4e51fccaa41958aafae1) ) // same as 98best44
+
+ ROM_REGION( 0x200000, "ymsnd", 0 ) /* Samples */
+ ROM_LOAD( "pt004-v1 neo-mvs progbk1.v1", 0x000000, 0x200000, CRC(118a84fd) SHA1(9059297a42a329eca47a82327c301853219013bd) ) // same as 98best44
+
+ ROM_REGION( 0x400000, "gfx1", ROMREGION_ERASE00 )
+ ROM_LOAD32_BYTE( "p097-c1 pstm-romc.c1", 0x000000, 0x80000, CRC(60163d90) SHA1(3707be8064c083814a0c4a31bccc7150aa250891) )
+ ROM_LOAD32_BYTE( "p097-c2 pstm-romc.c2", 0x000001, 0x80000, CRC(29f59ff7) SHA1(acb427383bb2f7fd675d7f5b97fea7f092bdc8d5) )
+ ROM_LOAD32_BYTE( "p097-c3 pstm-romc.c3", 0x200001, 0x80000, CRC(8ceddebf) SHA1(2d11721f3b9724358cc528e8028b091972506b91) )
+ ROM_LOAD32_BYTE( "p097-c4 pstm-romc.c4", 0x200002, 0x80000, CRC(88d0fb2e) SHA1(78bd4262e009ede7c179b783ab2b9bd1662a6f56) )
+ROM_END
+
+ROM_START( nprsp ) // STAFYAMA19980925 string
ROM_REGION( 0x200000, "maincpu", ROMREGION_ERASEFF )
ROM_LOAD16_WORD_SWAP( "s038a-ep1.bin", 0x000000, 0x080000, CRC(529fb4fa) SHA1(f31ba8998bb01458f43df1934222995f22d590a1) ) // program ROM
ROM_LOAD16_WORD_SWAP( "s046-ep2.bin", 0x080000, 0x080000, CRC(846ae929) SHA1(e5544cde32794865e17d7dffd4e603ad5418d91e) ) // data ROM
@@ -659,6 +759,73 @@ ROM_START( nprsp )
// 8bpp might be possible with another ROM?
ROM_END
+ROM_START( npssr2 ) // STAFYAMA19980925 string
+ ROM_REGION( 0x200000, "maincpu", ROMREGION_ERASEFF )
+ ROM_LOAD16_WORD_SWAP( "s038a-ep1 nps-prg1.ep1", 0x000000, 0x080000, CRC(529fb4fa) SHA1(f31ba8998bb01458f43df1934222995f22d590a1) ) // program ROM, same as nprsp
+ ROM_LOAD16_WORD_SWAP( "s072-ep2 nps-prg1.ep2", 0x080000, 0x080000, CRC(5514e29f) SHA1(fd508b6b4b2ed587b5dfd4a186865c72181612e6) ) // data ROM
+
+ ROM_REGION( 0x20000, "audiocpu", 0 ) /* Z80 program */
+ ROM_LOAD( "s001-m1 neo-pstm cha64c.m1", 0x00000, 0x20000, CRC(ea8111c1) SHA1(69e6bb7ad9a8d61db4513a762c0ce9e9da2a1785) )
+
+ ROM_REGION( 0x200000, "ymsnd", 0 ) /* Samples */
+ ROM_LOAD( "s001-v1 nps-prg1.v1", 0x000000, 0x100000, CRC(13d63625) SHA1(4a9e3b1192a4a7e405becfd5d2a95ffc14ae6e79) )
+
+ ROM_REGION( 0x800000, "gfx1", ROMREGION_ERASE00 )
+ ROM_LOAD32_BYTE( "s072-c1 neo-pstm cha64c.c1", 0x000000, 0x200000, CRC(c5f72b00) SHA1(b81a9d6025e79f98bdfd55d630ede181ef821132) )
+ ROM_LOAD32_BYTE( "s072-c2 neo-pstm cha64c.c2", 0x000001, 0x200000, CRC(3153db5a) SHA1(2166f452131f64e3806d177b5c5a6ddcd312adfd) )
+ ROM_LOAD32_BYTE( "s072-c3 neo-pstm cha64c.c3", 0x000002, 0x200000, CRC(57e8888f) SHA1(59acb22b2744bb798dd4779d9413d01bee79b43e) )
+
+ ROM_REGION( 0x100, "eeprom", ROMREGION_ERASE00 )
+ ROM_LOAD( "br9020 nps-prg1.u5", 0x000, 0x100, NO_DUMP ) // dump provided was 0xff filled
+ROM_END
+
+ROM_START( npmillen ) // NP 1.30 19990225 string
+ ROM_REGION( 0x200000, "maincpu", ROMREGION_ERASEFF )
+ ROM_LOAD16_WORD_SWAP( "p093-ep1.bin", 0x000000, 0x080000, CRC(47783f56) SHA1(1845e90b05a58010054c4158ef08e167e61ea370) )
+
+ ROM_REGION( 0x20000, "audiocpu", 0 )
+ ROM_LOAD( "p016-m1.bin", 0x00000, 0x20000, CRC(f40cf036) SHA1(63041318d8bec144a4688cc5f45107f8331809bf) )
+
+ ROM_REGION( 0x200000, "ymsnd", 0 )
+ ROM_LOAD( "p016-v1.bin", 0x000000, 0x200000, CRC(400ca9ce) SHA1(f8636a4600200ef9000a25e80cf20f252703ad37) )
+
+ ROM_REGION( 0x400000, "gfx1", ROMREGION_ERASE00 )
+ ROM_LOAD32_BYTE( "p093-c1.bin", 0x000000, 0x80000, CRC(bbb8266b) SHA1(3cbe8c9a6a82d9927910833b5874fe0a4a8c8384) )
+ ROM_LOAD32_BYTE( "p093-c2.bin", 0x000001, 0x80000, CRC(a82e79f4) SHA1(cc3a0171d488167212c2baaeda7c6cf13bb19611) )
+ ROM_LOAD32_BYTE( "p093-c3.bin", 0x200001, 0x80000, CRC(11554065) SHA1(4a75dbcc04b5f6bf82cf22093ed3d29ae8ee4c5d) )
+ ROM_LOAD32_BYTE( "p093-c4.bin", 0x200002, 0x80000, CRC(01d9c22a) SHA1(bf3f40de7f70cb5bb0fe487021ab110192c3b247) )
+ROM_END
+
+ROM_START( npscv1 ) // NP 1.10 19961015 string
+ ROM_REGION( 0x200000, "maincpu", ROMREGION_ERASEFF )
+ ROM_LOAD16_WORD_SWAP( "np-jp1 neo-mvs progbk1.ep1", 0x000000, 0x080000, CRC(c4648dfa) SHA1(ca7770f363027e3fe2f47d77085464486c024d2a) )
+
+ ROM_REGION( 0x20000, "audiocpu", 0 ) /* Z80 program */
+ ROM_LOAD( "np-m1 pstm-romc.m1", 0x00000, 0x20000, CRC(adbcad85) SHA1(76ebecea081a47b9fb133ef7793b48b51ef2f5c5) )
+
+ ROM_REGION( 0x80000, "ymsnd", 0 ) /* Samples */
+ ROM_LOAD( "np-v1 neo-mvs progbk1.v1", 0x000000, 0x80000, CRC(99d414e8) SHA1(5aecb09c7f18fca18f61e67047dfca06744928ed) )
+
+ ROM_REGION( 0x200000, "gfx1", ROMREGION_ERASE00 )
+ ROM_LOAD32_BYTE( "np-jc1 pstm-romc.c1", 0x000000, 0x080000, CRC(a729d3d4) SHA1(b0a8dfd2fc5c6707e5dd2a6d702a5d43a927c716) )
+ ROM_LOAD32_BYTE( "np-jc2 pstm-romc.c2", 0x000001, 0x080000, CRC(c9687cd8) SHA1(809d9efd7ea76de0884ad76effb71217e9068f89) )
+ROM_END
+
+ROM_START( npcramen ) // ? string
+ ROM_REGION( 0x200000, "maincpu", ROMREGION_ERASEFF )
+ ROM_LOAD16_WORD_SWAP( "l009-ep1 neo-mvs progbk1.ep1", 0x000000, 0x080000, BAD_DUMP CRC(ff470ded) SHA1(d33dd90f9ac1cc7f2dcadb6a855d9cd5f3260d00) ) // 111111111xxxxxxxxxx = 0xFF, reads were consistent, but..
+
+ ROM_REGION( 0x20000, "audiocpu", ROMREGION_ERASEFF ) /* Z80 program */
+ // empty (removed or never populated)?
+
+ ROM_REGION( 0x80000, "ymsnd", ROMREGION_ERASEFF ) /* Samples */
+ // empty (removed or never populated)?
+
+ ROM_REGION( 0x200000, "gfx1", ROMREGION_ERASE00 )
+ ROM_LOAD32_BYTE( "l009-c1 pstm-romc.c1", 0x000000, 0x080000, CRC(d6b44550) SHA1(d402ffe372646b93344f7e36d29e4fe913f2479a) )
+ ROM_LOAD32_BYTE( "l009-c2 pstm-romc.c2", 0x000001, 0x080000, CRC(d63dea34) SHA1(cf2dbf982ed955fe5a4c737d1752cdb66ab5f84a) )
+ROM_END
+
/* FIXME: get rid of these two, probably something to do with irq3 and camera / printer devices */
void neoprint_state::init_npcartv1()
{
@@ -677,6 +844,33 @@ void neoprint_state::init_98best44()
ROM[0x1312/2] = 0x4e71;
}
+void neoprint_state::init_npmillen()
+{
+ uint16_t *ROM = (uint16_t *)memregion( "maincpu" )->base();
+
+ ROM[0x1312/2] = 0x4e71;
+
+ ROM[0x42a8/2] = 0x4e71; //ROM checksum
+}
+
+void neoprint_state::init_npsprgv4()
+{
+ uint16_t *ROM = (uint16_t *)memregion( "maincpu" )->base();
+
+ ROM[0x12e8/2] = 0x4e71;
+
+ ROM[0x3ba0/2] = 0x4e71; //ROM checksum
+}
+
+void neoprint_state::init_npskv()
+{
+ uint16_t *ROM = (uint16_t *)memregion( "maincpu" )->base();
+
+ ROM[0x130a/2] = 0x4e71;
+
+ ROM[0x3bf4/2] = 0x4e71; //ROM checksum
+}
+
void neoprint_state::init_nprsp()
{
uint16_t *ROM = (uint16_t *)memregion( "maincpu" )->base();
@@ -695,7 +889,33 @@ void neoprint_state::init_unkneo()
ROM[0x12c2/2] = 0x4e71;
}
-GAME( 1996, neoprint, 0, neoprint, neoprint, neoprint_state, init_unkneo, ROT0, "SNK", "Neo Print (Japan) (T2d)", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS | MACHINE_NOT_WORKING )
-GAME( 1996, npcartv1, 0, neoprint, neoprint, neoprint_state, init_npcartv1, ROT0, "SNK", "Neo Print V1 (World) (E1a)", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS | MACHINE_NOT_WORKING )
-GAME( 1998, 98best44, 0, neoprint, neoprint, neoprint_state, init_98best44, ROT0, "SNK", "Neo Print - '98 NeoPri Best 44 (Japan) (T4i 3.07)", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS | MACHINE_NOT_WORKING )
-GAME( 1996, nprsp, 0, nprsp, neoprint, neoprint_state, init_nprsp, ROT0, "SNK", "NeopriSP Retro Collection (Japan)", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS | MACHINE_NOT_WORKING )
+void neoprint_state::init_npscv1()
+{
+ uint16_t *ROM = (uint16_t *)memregion( "maincpu" )->base();
+ ROM[0x1242/2] = 0x4e71;
+
+ ROM[0x4390/2] = 0x4e71; //ROM checksum
+}
+
+void neoprint_state::init_npotogib()
+{
+ uint16_t *ROM = (uint16_t *)memregion( "maincpu" )->base();
+ ROM[0x1312/2] = 0x4e71;
+
+ ROM[0x3f4e/2] = 0x4e71; //ROM checksum
+}
+
+GAME( 1996, neoprint, 0, neoprint, neoprint, neoprint_state, init_unkneo, ROT0, "SNK", "Neo Print (Japan) (T2d)", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS | MACHINE_NOT_WORKING )
+GAME( 1996, npcartv1, 0, neoprint, neoprint, neoprint_state, init_npcartv1, ROT0, "SNK", "Neo Print V1 (World) (E1a)", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS | MACHINE_NOT_WORKING )
+GAME( 1996, npscv1, 0, neoprint, neoprint, neoprint_state, init_npscv1, ROT0, "SNK", "Neo Print - Senyou Cassette Ver. 1 (Japan)", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS | MACHINE_NOT_WORKING )
+GAME( 1996, npcramen, 0, neoprint, neoprint, neoprint_state, empty_init, ROT0, "SNK", "Neo Print - Chicken Ramen (Japan)", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS | MACHINE_NOT_WORKING )
+GAME( 1997, npsprgv4, 0, neoprint, neoprint, neoprint_state, init_npsprgv4, ROT0, "SNK", "Neo Print - Spring Ver. 4 (Japan) (T4f 1.00)", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS | MACHINE_NOT_WORKING )
+GAME( 1997, npskv, 0, neoprint, neoprint, neoprint_state, init_npskv, ROT0, "SNK", "Neo Print - Suizokukan Version (Japan) (T4i 2.00)", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS | MACHINE_NOT_WORKING )
+GAME( 1997, npotogib, 0, neoprint, neoprint, neoprint_state, init_npotogib, ROT0, "SNK", "Neo Print - Otogibanashi (Japan) (T4i 3.00)", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS | MACHINE_NOT_WORKING )
+GAME( 1997, npusagif, 0, neoprint, neoprint, neoprint_state, init_98best44, ROT0, "SNK", "Neo Print - Usagi Frame (Japan) (T4i 3.07)", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS | MACHINE_NOT_WORKING )
+GAME( 1998, 98best44, 0, neoprint, neoprint, neoprint_state, init_98best44, ROT0, "SNK", "Neo Print - '98 NeoPri Best 44 (Japan) (T4i 3.07)", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS | MACHINE_NOT_WORKING )
+GAME( 1998, npsprg98, 0, neoprint, neoprint, neoprint_state, init_npmillen, ROT0, "SNK", "Neo Print - Spring '98 (T4i 3.07)", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS | MACHINE_NOT_WORKING )
+GAME( 1999, npmillen, 0, neoprint, neoprint, neoprint_state, init_npmillen, ROT0, "SNK", "Neo Print - Millennium Multi Shot Edition (World) (T4i 3.07)", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS | MACHINE_NOT_WORKING )
+GAME( 1999, npfpit, 0, neoprint, neoprint, neoprint_state, init_npmillen, ROT0, "SNK", "Neo Print - Fuyo Pri Iitoko Tori (Japan) (T4i 3.07)", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS | MACHINE_NOT_WORKING )
+GAME( 1996, nprsp, 0, nprsp, neoprint, neoprint_state, init_nprsp, ROT0, "SNK", "NeopriSP Retro Collection (Japan)", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS | MACHINE_NOT_WORKING )
+GAME( 1996, npssr2, 0, nprsp, neoprint, neoprint_state, init_nprsp, ROT0, "SNK", "Neo Print Special: Sekai Ryokou 2 (Japan)", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS | MACHINE_NOT_WORKING )
diff --git a/src/mame/drivers/neptunp2.cpp b/src/mame/drivers/neptunp2.cpp
index 6baed13488f..3e2bc25b33d 100644
--- a/src/mame/drivers/neptunp2.cpp
+++ b/src/mame/drivers/neptunp2.cpp
@@ -99,30 +99,29 @@ static GFXDECODE_START( gfx_neptunp2 )
// GFXDECODE_ENTRY( "gfx1", 0, charlayout, 0, 8 )
GFXDECODE_END
-MACHINE_CONFIG_START(neptunp2_state::neptunp2)
-
+void neptunp2_state::neptunp2(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu",I80188,20000000) // N80C188-20 AMD
- MCFG_DEVICE_PROGRAM_MAP(neptunp2_map)
- MCFG_DEVICE_IO_MAP(neptunp2_io)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", neptunp2_state, irq0_line_hold)
+ I80188(config, m_maincpu, 20000000); // N80C188-20 AMD
+ m_maincpu->set_addrmap(AS_PROGRAM, &neptunp2_state::neptunp2_map);
+ m_maincpu->set_addrmap(AS_IO, &neptunp2_state::neptunp2_io);
+ m_maincpu->set_vblank_int("screen", FUNC(neptunp2_state::irq0_line_hold));
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_UPDATE_DRIVER(neptunp2_state, screen_update)
- MCFG_SCREEN_SIZE(32*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1)
- MCFG_SCREEN_PALETTE("palette")
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_screen_update(FUNC(neptunp2_state::screen_update));
+ screen.set_size(32*8, 32*8);
+ screen.set_visarea(0*8, 32*8-1, 2*8, 30*8-1);
+ screen.set_palette("palette");
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_neptunp2)
- MCFG_PALETTE_ADD("palette", 512)
+ GFXDECODE(config, "gfxdecode", "palette", gfx_neptunp2);
+ PALETTE(config, "palette").set_entries(512);
/* sound hardware */
SPEAKER(config, "mono").front_center();
-
-MACHINE_CONFIG_END
+}
/***************************************************************************
diff --git a/src/mame/drivers/nes.cpp b/src/mame/drivers/nes.cpp
index 34acda1dcef..090834d40db 100644
--- a/src/mame/drivers/nes.cpp
+++ b/src/mame/drivers/nes.cpp
@@ -165,21 +165,21 @@ void nes_state::setup_disk(nes_disksys_device *slot)
address_space &space = m_maincpu->space(AS_PROGRAM);
// Set up memory handlers
- space.install_read_handler(0x4020, 0x40ff, read8_delegate(FUNC(nes_disksys_device::read_ex), (nes_disksys_device *)slot));
- space.install_write_handler(0x4020, 0x40ff, write8_delegate(FUNC(nes_disksys_device::write_ex), (nes_disksys_device *)slot));
- space.install_read_handler(0x4100, 0x5fff, read8_delegate(FUNC(device_nes_cart_interface::read_l), (device_nes_cart_interface *)slot));
- space.install_write_handler(0x4100, 0x5fff, write8_delegate(FUNC(device_nes_cart_interface::write_l), (device_nes_cart_interface *)slot));
- space.install_read_handler(0x6000, 0x7fff, read8_delegate(FUNC(nes_disksys_device::read_m), (nes_disksys_device *)slot));
- space.install_write_handler(0x6000, 0x7fff, write8_delegate(FUNC(nes_disksys_device::write_m), (nes_disksys_device *)slot));
- space.install_read_handler(0x8000, 0xffff, read8_delegate(FUNC(nes_disksys_device::read_h), (nes_disksys_device *)slot));
- space.install_write_handler(0x8000, 0xffff, write8_delegate(FUNC(nes_disksys_device::write_h), (nes_disksys_device *)slot));
+ space.install_read_handler(0x4020, 0x40ff, read8sm_delegate(FUNC(nes_disksys_device::read_ex), (nes_disksys_device *)slot));
+ space.install_write_handler(0x4020, 0x40ff, write8sm_delegate(FUNC(nes_disksys_device::write_ex), (nes_disksys_device *)slot));
+ space.install_read_handler(0x4100, 0x5fff, read8sm_delegate(FUNC(device_nes_cart_interface::read_l), (device_nes_cart_interface *)slot));
+ space.install_write_handler(0x4100, 0x5fff, write8sm_delegate(FUNC(device_nes_cart_interface::write_l), (device_nes_cart_interface *)slot));
+ space.install_read_handler(0x6000, 0x7fff, read8sm_delegate(FUNC(nes_disksys_device::read_m), (nes_disksys_device *)slot));
+ space.install_write_handler(0x6000, 0x7fff, write8sm_delegate(FUNC(nes_disksys_device::write_m), (nes_disksys_device *)slot));
+ space.install_read_handler(0x8000, 0xffff, read8sm_delegate(FUNC(nes_disksys_device::read_h), (nes_disksys_device *)slot));
+ space.install_write_handler(0x8000, 0xffff, write8sm_delegate(FUNC(nes_disksys_device::write_h), (nes_disksys_device *)slot));
slot->vram_alloc(0x2000);
slot->prgram_alloc(0x8000);
slot->pcb_start(machine(), m_ciram.get(), false);
- m_ppu->space(AS_PROGRAM).install_readwrite_handler(0, 0x1fff, read8_delegate(FUNC(device_nes_cart_interface::chr_r),(device_nes_cart_interface *)slot), write8_delegate(FUNC(device_nes_cart_interface::chr_w),(device_nes_cart_interface *)slot));
- m_ppu->space(AS_PROGRAM).install_readwrite_handler(0x2000, 0x3eff, read8_delegate(FUNC(device_nes_cart_interface::nt_r),(device_nes_cart_interface *)slot), write8_delegate(FUNC(device_nes_cart_interface::nt_w),(device_nes_cart_interface *)slot));
+ m_ppu->space(AS_PROGRAM).install_readwrite_handler(0, 0x1fff, read8sm_delegate(FUNC(device_nes_cart_interface::chr_r),(device_nes_cart_interface *)slot), write8sm_delegate(FUNC(device_nes_cart_interface::chr_w),(device_nes_cart_interface *)slot));
+ m_ppu->space(AS_PROGRAM).install_readwrite_handler(0x2000, 0x3eff, read8sm_delegate(FUNC(device_nes_cart_interface::nt_r),(device_nes_cart_interface *)slot), write8sm_delegate(FUNC(device_nes_cart_interface::nt_w),(device_nes_cart_interface *)slot));
m_ppu->set_scanline_callback(ppu2c0x_device::scanline_delegate(FUNC(device_nes_cart_interface::scanline_irq),(device_nes_cart_interface *)slot));
m_ppu->set_hblank_callback(ppu2c0x_device::hblank_delegate(FUNC(nes_disksys_device::hblank_irq),(nes_disksys_device *)slot));
m_ppu->set_latch(ppu2c0x_device::latch_delegate(FUNC(device_nes_cart_interface::ppu_latch),(device_nes_cart_interface *)slot));
diff --git a/src/mame/drivers/nes_vt.cpp b/src/mame/drivers/nes_vt.cpp
index ba74fe07ae0..9f5ef1b4f27 100644
--- a/src/mame/drivers/nes_vt.cpp
+++ b/src/mame/drivers/nes_vt.cpp
@@ -1506,14 +1506,14 @@ static INPUT_PORTS_START( nes_vt_fp )
PORT_DIPNAME( 0x06, 0x00, "Cartridge Select" ) PORT_CODE(KEYCODE_3) PORT_TOGGLE
PORT_DIPSETTING( 0x00, "472-in-1" )
PORT_DIPSETTING( 0x06, "128-in-1" )
-MACHINE_CONFIG_END
+INPUT_PORTS_END
static INPUT_PORTS_START( nes_vt_fa )
PORT_START("CARTSEL")
PORT_DIPNAME( 0x01, 0x00, "Cartridge Select" ) PORT_CODE(KEYCODE_3) PORT_TOGGLE
PORT_DIPSETTING( 0x00, "508-in-1" )
PORT_DIPSETTING( 0x01, "130-in-1" )
-MACHINE_CONFIG_END
+INPUT_PORTS_END
ROM_START( vdogdeme )
@@ -1581,6 +1581,16 @@ ROM_START( mc_sp69 )
ROM_LOAD( "sports game 69-in-1.prg", 0x00000, 0x400000, CRC(1242da7f) SHA1(bb8f99b1f4a4783b3f7e54d74f1f2a6a628da154) )
ROM_END
+ROM_START( polmega )
+ ROM_REGION( 0x400000, "mainrom", 0 )
+ ROM_LOAD( "megamax.bin", 0x00000, 0x400000, CRC(ef3aade3) SHA1(0c130080ace000cbe43e70a805d4301e05840294) )
+ROM_END
+
+ROM_START( silv35 )
+ ROM_REGION( 0x400000, "mainrom", 0 )
+ ROM_LOAD( "silverlit35.bin", 0x00000, 0x400000, CRC(7540e350) SHA1(a0cb456136560fa4d8a365dd44d815ec0e9fc2e7) )
+ROM_END
+
ROM_START( pjoyn50 )
ROM_REGION( 0x400000, "mainrom", 0 )
ROM_LOAD( "power joy navigator 50-in-1.prg", 0x00000, 0x400000, CRC(d1bbadd4) SHA1(2186c71bcedf6c2eedf58233faa26fca9586aa40) )
@@ -1832,6 +1842,10 @@ CONS( 200?, ii32in1, 0, 0, nes_vt, nes_vt, nes_vt_state, empty_init, "Int
// this has 'Shark' and 'Octopus' etc. like mc_dgear but uses scrambled bank registers
CONS( 200?, mc_sp69, 0, 0, nes_vt_sp69, nes_vt, nes_vt_state, empty_init, "<unknown>", "Sports Game 69 in 1", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND)
+// CPU die is marked 'VH2009' There's also a 62256 RAM chip on the PCB, some scrambled opcodes?
+CONS( 200?, polmega, 0, 0, nes_vt, nes_vt, nes_vt_state, empty_init, "Polaroid", "Megamax GPD001SDG", MACHINE_NOT_WORKING )
+CONS( 200?, silv35, 0, 0, nes_vt, nes_vt, nes_vt_state, empty_init, "SilverLit", "35 in 1 Super Twins", MACHINE_NOT_WORKING )
+
// Hummer systems, scrambled bank register
CONS( 200?, mc_sam60, 0, 0, nes_vt_hum, nes_vt, nes_vt_state, empty_init, "Hummer Technology Co., Ltd.", "Samuri (60 in 1)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND )
CONS( 200?, zdog, 0, 0, nes_vt_hum, nes_vt, nes_vt_state, empty_init, "Hummer Technology Co., Ltd.", "ZDog (44 in 1)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND )
diff --git a/src/mame/drivers/newbrain.cpp b/src/mame/drivers/newbrain.cpp
index 24516b7d654..f8ae3adb39d 100644
--- a/src/mame/drivers/newbrain.cpp
+++ b/src/mame/drivers/newbrain.cpp
@@ -92,7 +92,7 @@ READ8_MEMBER( newbrain_state::mreq_r )
{
bool romov = 1, raminh = 0;
int exrm = 0;
- uint8_t data = m_exp->mreq_r(space, offset, 0xff, romov, exrm, raminh);
+ uint8_t data = m_exp->mreq_r(offset, 0xff, romov, exrm, raminh);
int rom0 = 1, rom1 = 1, rom2 = 1;
int a15_14_13 = romov ? (offset >> 13) : exrm;
@@ -138,7 +138,7 @@ WRITE8_MEMBER( newbrain_state::mreq_w )
{
bool romov = 1, raminh = 0;
int exrm = 0;
- m_exp->mreq_w(space, offset, data, romov, exrm, raminh);
+ m_exp->mreq_w(offset, data, romov, exrm, raminh);
int a15_14_13 = romov ? (offset >> 13) : exrm;
if (!m_pwrup) a15_14_13 = 7;
@@ -158,7 +158,7 @@ WRITE8_MEMBER( newbrain_state::mreq_w )
READ8_MEMBER( newbrain_state::iorq_r )
{
bool prtov = 0;
- uint8_t data = m_exp->iorq_r(space, offset, 0xff, prtov);
+ uint8_t data = m_exp->iorq_r(offset, 0xff, prtov);
if (!prtov)
{
@@ -201,7 +201,7 @@ READ8_MEMBER( newbrain_state::iorq_r )
WRITE8_MEMBER( newbrain_state::iorq_w )
{
bool prtov = 0;
- m_exp->iorq_w(space, offset, 0xff, prtov);
+ m_exp->iorq_w(offset, 0xff, prtov);
if (!prtov)
{
@@ -806,10 +806,11 @@ void newbrain_state::device_timer(emu_timer &timer, device_timer_id id, int para
//**************************************************************************
//-------------------------------------------------
-// MACHINE_CONFIG( newbrain )
+// machine_config( newbrain )
//-------------------------------------------------
-MACHINE_CONFIG_START(newbrain_state::newbrain)
+void newbrain_state::newbrain(machine_config &config)
+{
// basic system hardware
Z80(config, m_maincpu, XTAL(16'000'000)/4);
m_maincpu->set_addrmap(AS_PROGRAM, &newbrain_state::newbrain_mreq);
@@ -829,7 +830,7 @@ MACHINE_CONFIG_START(newbrain_state::newbrain)
newbrain_video(config);
// devices
- MCFG_NEWBRAIN_EXPANSION_SLOT_ADD(NEWBRAIN_EXPANSION_SLOT_TAG, XTAL(16'000'000)/4, newbrain_expansion_cards, "eim")
+ NEWBRAIN_EXPANSION_SLOT(config, m_exp, XTAL(16'000'000)/4, newbrain_expansion_cards, "eim");
CASSETTE(config, m_cassette1);
m_cassette1->set_default_state((cassette_state)(CASSETTE_STOPPED | CASSETTE_MOTOR_DISABLED | CASSETTE_SPEAKER_MUTED));
@@ -842,11 +843,11 @@ MACHINE_CONFIG_START(newbrain_state::newbrain)
// internal ram
RAM(config, RAM_TAG).set_default_size("32K");
-MACHINE_CONFIG_END
+}
//-------------------------------------------------
-// MACHINE_CONFIG( newbrain_ad )
+// machine_config( newbrain_ad )
//-------------------------------------------------
void newbrain_state::newbrain_ad(machine_config &config)
@@ -857,7 +858,7 @@ void newbrain_state::newbrain_ad(machine_config &config)
//-------------------------------------------------
-// MACHINE_CONFIG( newbrain_a )
+// machine_config( newbrain_a )
//-------------------------------------------------
void newbrain_state::newbrain_a(machine_config &config)
@@ -868,7 +869,7 @@ void newbrain_state::newbrain_a(machine_config &config)
//-------------------------------------------------
-// MACHINE_CONFIG( newbrain_md )
+// machine_config( newbrain_md )
//-------------------------------------------------
void newbrain_state::newbrain_md(machine_config &config)
diff --git a/src/mame/drivers/news.cpp b/src/mame/drivers/news.cpp
index f3314c0a476..28029890885 100644
--- a/src/mame/drivers/news.cpp
+++ b/src/mame/drivers/news.cpp
@@ -130,22 +130,22 @@ void news_state::machine_reset()
m_bgpic = 0;
}
-MACHINE_CONFIG_START(news_state::news)
-
+void news_state::news(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80,8000000) /* ? MHz */
- MCFG_DEVICE_PROGRAM_MAP(news_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", news_state, irq0_line_hold)
+ Z80(config, m_maincpu, 8000000); /* ? MHz */
+ m_maincpu->set_addrmap(AS_PROGRAM, &news_state::news_map);
+ m_maincpu->set_vblank_int("screen", FUNC(news_state::irq0_line_hold));
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(256, 256)
- MCFG_SCREEN_VISIBLE_AREA(0, 256-1, 16, 256-16-1)
- MCFG_SCREEN_UPDATE_DRIVER(news_state, screen_update_news)
- MCFG_SCREEN_PALETTE("palette")
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(256, 256);
+ screen.set_visarea(0, 256-1, 16, 256-16-1);
+ screen.set_screen_update(FUNC(news_state::screen_update_news));
+ screen.set_palette("palette");
GFXDECODE(config, m_gfxdecode, "palette", gfx_news);
PALETTE(config, "palette").set_format(palette_device::xRGB_444, 0x100).set_endianness(ENDIANNESS_BIG);
@@ -153,9 +153,8 @@ MACHINE_CONFIG_START(news_state::news)
/* sound hardware */
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("oki", OKIM6295, 1056000, okim6295_device::PIN7_HIGH) // clock frequency & pin 7 not verified
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
-MACHINE_CONFIG_END
+ OKIM6295(config, "oki", 1056000, okim6295_device::PIN7_HIGH).add_route(ALL_OUTPUTS, "mono", 1.0); // clock frequency & pin 7 not verified
+}
diff --git a/src/mame/drivers/next.cpp b/src/mame/drivers/next.cpp
index c35c99d64dd..c7fe7db08a9 100644
--- a/src/mame/drivers/next.cpp
+++ b/src/mame/drivers/next.cpp
@@ -995,28 +995,28 @@ static void next_scsi_devices(device_slot_interface &device)
void next_state::ncr5390(device_t *device)
{
- devcb_base *devcb;
- (void)devcb;
- MCFG_DEVICE_CLOCK(10000000)
- MCFG_NCR5390_IRQ_HANDLER(WRITELINE(*this, next_state, scsi_irq))
- MCFG_NCR5390_DRQ_HANDLER(WRITELINE(*this, next_state, scsi_drq))
-}
+ ncr5390_device &adapter = downcast<ncr5390_device &>(*device);
-MACHINE_CONFIG_START(next_state::next_base)
+ adapter.set_clock(10000000);
+ adapter.irq_handler_cb().set(*this, FUNC(next_state::scsi_irq));
+ adapter.drq_handler_cb().set(*this, FUNC(next_state::scsi_drq));
+}
+void next_state::next_base(machine_config &config)
+{
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */
- MCFG_SCREEN_UPDATE_DRIVER(next_state, screen_update)
- MCFG_SCREEN_SIZE(1120, 900)
- MCFG_SCREEN_VISIBLE_AREA(0, 1120-1, 0, 832-1)
- MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE(*this, next_state, vblank_w))
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */
+ screen.set_screen_update(FUNC(next_state::screen_update));
+ screen.set_size(1120, 900);
+ screen.set_visarea(0, 1120-1, 0, 832-1);
+ screen.screen_vblank().set(FUNC(next_state::vblank_w));
// devices
- MCFG_NSCSI_BUS_ADD("scsibus")
+ NSCSI_BUS(config, "scsibus");
- MCFG_DEVICE_ADD("rtc", MCCS1850, XTAL(32'768))
+ MCCS1850(config, rtc, XTAL(32'768));
SCC8530(config, scc, XTAL(25'000'000));
scc->intrq_callback().set(FUNC(next_state::scc_irq));
@@ -1026,15 +1026,14 @@ MACHINE_CONFIG_START(next_state::next_base)
keyboard->int_power_wr_callback().set(FUNC(next_state::power_irq));
keyboard->int_nmi_wr_callback().set(FUNC(next_state::nmi_irq));
- MCFG_NSCSI_ADD("scsibus:0", next_scsi_devices, "harddisk", false)
- MCFG_NSCSI_ADD("scsibus:1", next_scsi_devices, "cdrom", false)
- MCFG_NSCSI_ADD("scsibus:2", next_scsi_devices, nullptr, false)
- MCFG_NSCSI_ADD("scsibus:3", next_scsi_devices, nullptr, false)
- MCFG_NSCSI_ADD("scsibus:4", next_scsi_devices, nullptr, false)
- MCFG_NSCSI_ADD("scsibus:5", next_scsi_devices, nullptr, false)
- MCFG_NSCSI_ADD("scsibus:6", next_scsi_devices, nullptr, false)
- MCFG_NSCSI_ADD("scsibus:7", next_scsi_devices, "ncr5390", true)
- MCFG_SLOT_OPTION_MACHINE_CONFIG("ncr5390", [this] (device_t *device) { ncr5390(device); })
+ NSCSI_CONNECTOR(config, "scsibus:0", next_scsi_devices, "harddisk");
+ NSCSI_CONNECTOR(config, "scsibus:1", next_scsi_devices, "cdrom");
+ NSCSI_CONNECTOR(config, "scsibus:2", next_scsi_devices, nullptr);
+ NSCSI_CONNECTOR(config, "scsibus:3", next_scsi_devices, nullptr);
+ NSCSI_CONNECTOR(config, "scsibus:4", next_scsi_devices, nullptr);
+ NSCSI_CONNECTOR(config, "scsibus:5", next_scsi_devices, nullptr);
+ NSCSI_CONNECTOR(config, "scsibus:6", next_scsi_devices, nullptr);
+ NSCSI_CONNECTOR(config, "scsibus:7", next_scsi_devices, "ncr5390", true).set_option_machine_config("ncr5390", [this] (device_t *device) { ncr5390(device); });
MB8795(config, net, 0);
net->tx_irq().set(FUNC(next_state::net_tx_irq));
@@ -1045,70 +1044,77 @@ MACHINE_CONFIG_START(next_state::next_base)
NEXTMO(config, mo, 0);
mo->irq_wr_callback().set(FUNC(next_state::mo_irq));
mo->drq_wr_callback().set(FUNC(next_state::mo_drq));
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(next_state::next)
+void next_state::next(machine_config &config)
+{
next_base(config);
- MCFG_DEVICE_ADD("maincpu", M68030, XTAL(25'000'000))
- MCFG_DEVICE_PROGRAM_MAP(next_0b_m_nofdc_mem)
-MACHINE_CONFIG_END
+ M68030(config, maincpu, XTAL(25'000'000));
+ maincpu->set_addrmap(AS_PROGRAM, &next_state::next_0b_m_nofdc_mem);
+}
-MACHINE_CONFIG_START(next_state::next_fdc_base)
+void next_state::next_fdc_base(machine_config &config)
+{
next_base(config);
N82077AA(config, fdc, n82077aa_device::MODE_PS2);
fdc->intrq_wr_callback().set(FUNC(next_state::fdc_irq));
fdc->drq_wr_callback().set(FUNC(next_state::fdc_drq));
- MCFG_FLOPPY_DRIVE_ADD("fdc:0", next_floppies, "35ed", next_state::floppy_formats)
+ FLOPPY_CONNECTOR(config, "fdc:0", next_floppies, "35ed", next_state::floppy_formats);
// software list
- MCFG_SOFTWARE_LIST_ADD("flop_list", "next")
-MACHINE_CONFIG_END
+ SOFTWARE_LIST(config, "flop_list").set_original("next");
+}
-MACHINE_CONFIG_START(next_state::nexts)
+void next_state::nexts(machine_config &config)
+{
next_fdc_base(config);
- MCFG_DEVICE_ADD("maincpu", M68040, XTAL(25'000'000))
- MCFG_DEVICE_PROGRAM_MAP(next_0b_m_mem)
-MACHINE_CONFIG_END
+ M68040(config, maincpu, XTAL(25'000'000));
+ maincpu->set_addrmap(AS_PROGRAM, &next_state::next_0b_m_mem);
+}
-MACHINE_CONFIG_START(next_state::nexts2)
+void next_state::nexts2(machine_config &config)
+{
next_fdc_base(config);
- MCFG_DEVICE_ADD("maincpu", M68040, XTAL(25'000'000))
- MCFG_DEVICE_PROGRAM_MAP(next_0b_m_mem)
-MACHINE_CONFIG_END
+ M68040(config, maincpu, XTAL(25'000'000));
+ maincpu->set_addrmap(AS_PROGRAM, &next_state::next_0b_m_mem);
+}
-MACHINE_CONFIG_START(next_state::nextsc)
+void next_state::nextsc(machine_config &config)
+{
next_fdc_base(config);
- MCFG_DEVICE_ADD("maincpu", M68040, XTAL(25'000'000))
- MCFG_DEVICE_PROGRAM_MAP(next_2c_c_mem)
-MACHINE_CONFIG_END
+ M68040(config, maincpu, XTAL(25'000'000));
+ maincpu->set_addrmap(AS_PROGRAM, &next_state::next_2c_c_mem);
+}
-MACHINE_CONFIG_START(next_state::nextst)
+void next_state::nextst(machine_config &config)
+{
next_fdc_base(config);
- MCFG_DEVICE_ADD("maincpu", M68040, XTAL(33'000'000))
- MCFG_DEVICE_PROGRAM_MAP(next_0b_m_mem)
-MACHINE_CONFIG_END
+ M68040(config, maincpu, XTAL(33'000'000));
+ maincpu->set_addrmap(AS_PROGRAM, &next_state::next_0b_m_mem);
+}
-MACHINE_CONFIG_START(next_state::nextstc)
+void next_state::nextstc(machine_config &config)
+{
next_fdc_base(config);
- MCFG_DEVICE_ADD("maincpu", M68040, XTAL(33'000'000))
- MCFG_DEVICE_PROGRAM_MAP(next_0c_c_mem)
- MCFG_SCREEN_MODIFY("screen")
- MCFG_SCREEN_VISIBLE_AREA(0, 832-1, 0, 624-1)
-MACHINE_CONFIG_END
+ M68040(config, maincpu, XTAL(33'000'000));
+ maincpu->set_addrmap(AS_PROGRAM, &next_state::next_0c_c_mem);
+ subdevice<screen_device>("screen")->set_visarea(0, 832-1, 0, 624-1);
+}
-MACHINE_CONFIG_START(next_state::nextct)
+void next_state::nextct(machine_config &config)
+{
next_fdc_base(config);
- MCFG_DEVICE_ADD("maincpu", M68040, XTAL(33'000'000))
- MCFG_DEVICE_PROGRAM_MAP(next_0c_m_mem)
-MACHINE_CONFIG_END
+ M68040(config, maincpu, XTAL(33'000'000));
+ maincpu->set_addrmap(AS_PROGRAM, &next_state::next_0c_m_mem);
+}
-MACHINE_CONFIG_START(next_state::nextctc)
+void next_state::nextctc(machine_config &config)
+{
next_fdc_base(config);
- MCFG_DEVICE_ADD("maincpu", M68040, XTAL(33'000'000))
- MCFG_DEVICE_PROGRAM_MAP(next_0c_c_mem)
- MCFG_SCREEN_MODIFY("screen")
- MCFG_SCREEN_VISIBLE_AREA(0, 832-1, 0, 624-1)
-MACHINE_CONFIG_END
+ M68040(config, maincpu, XTAL(33'000'000));
+ maincpu->set_addrmap(AS_PROGRAM, &next_state::next_0c_c_mem);
+ subdevice<screen_device>("screen")->set_visarea(0, 832-1, 0, 624-1);
+}
/* ROM definition */
#define ROM_NEXT_V1 \
diff --git a/src/mame/drivers/nexus3d.cpp b/src/mame/drivers/nexus3d.cpp
index d8b1622050f..14d04558fd8 100644
--- a/src/mame/drivers/nexus3d.cpp
+++ b/src/mame/drivers/nexus3d.cpp
@@ -122,24 +122,23 @@ void nexus3d_state::machine_reset()
{
}
-MACHINE_CONFIG_START(nexus3d_state::nexus3d)
-
+void nexus3d_state::nexus3d(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", ARM920T, 200000000)
- MCFG_DEVICE_PROGRAM_MAP(nexus3d_map)
+ ARM920T(config, m_maincpu, 200000000);
+ m_maincpu->set_addrmap(AS_PROGRAM, &nexus3d_state::nexus3d_map);
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */)
- MCFG_SCREEN_SIZE(320, 256)
- MCFG_SCREEN_VISIBLE_AREA(0, 320-1, 0, 256-1)
- MCFG_SCREEN_UPDATE_DRIVER(nexus3d_state, screen_update_nexus3d)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500) /* not accurate */);
+ screen.set_size(320, 256);
+ screen.set_visarea(0, 320-1, 0, 256-1);
+ screen.set_screen_update(FUNC(nexus3d_state::screen_update_nexus3d));
- MCFG_PALETTE_ADD("palette", 256)
+ PALETTE(config, "palette").set_entries(256);
SERFLASH(config, m_serflash, 0);
-
-MACHINE_CONFIG_END
+}
diff --git a/src/mame/drivers/nforcepc.cpp b/src/mame/drivers/nforcepc.cpp
index 9eeba267bc5..3bb38d17b8b 100644
--- a/src/mame/drivers/nforcepc.cpp
+++ b/src/mame/drivers/nforcepc.cpp
@@ -4,7 +4,7 @@
/*
Computer based on a motherboard utilizing the nForce chipset (also known as CRUSH11 or CRUSH12)
- Start with the following compoents:
+ Start with the following components:
- An Asus A7N266-C motherboard using:
- nForce 415-D northbridge
- nForce MCP-D southbridge (with integrated APU)
@@ -14,6 +14,7 @@
- An IDE hard disk
- A floppy disk drive
- A keyboard
+ - A ddr dimm memory module
Later add:
- A Nvidia NV25 based AGP video card
@@ -24,18 +25,29 @@
#include "cpu/i386/i386.h"
#include "machine/pci.h"
#include "machine/pci-ide.h"
+#include "includes/xbox_pci.h"
#include "includes/nforcepc.h"
+// for now let's use this as the contents of the spd chip in the ddr dimm memory module
+static const uint8_t test_spd_data[] = {
+ 0x80,0x08,0x07,0x0D,0x0A,0x01,0x40,0x00,0x04,0x75,0x75,0x00,0x82,0x10,0x00,0x01,0x0E,0x04,0x0C,0x01,0x02,0x20,0xC0,0xA0,0x75,0x00,
+ 0x00,0x50,0x3C,0x50,0x2D,0x40,0x90,0x90,0x50,0x50,0x00,0x00,0x00,0x00,0x00,0x41,0x4B,0x30,0x32,0x75,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xEA,0xAD,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0x59,0x4D,0x44,0x35,
+ 0x33,0x32,0x4D,0x36,0x34,0x36,0x43,0x36,0x2D,0x48,0x20,0x20,0x20
+};
+
/*
Pci devices
*/
+// NVIDIA Corporation nForce CPU bridge
+
DEFINE_DEVICE_TYPE(CRUSH11, crush11_host_device, "crush11", "NVIDIA Corporation nForce CPU bridge")
void crush11_host_device::config_map(address_map &map)
{
pci_host_device::config_map(map);
- map(0x50, 0x50).rw(FUNC(crush11_host_device::test_r), FUNC(crush11_host_device::test_w));
+ map(0xf0, 0xf0).rw(FUNC(crush11_host_device::test_r), FUNC(crush11_host_device::test_w));
}
crush11_host_device::crush11_host_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
@@ -90,7 +102,7 @@ void crush11_host_device::map_extra(uint64_t memory_window_start, uint64_t memor
READ8_MEMBER(crush11_host_device::test_r)
{
- return 0;
+ return 4;
}
WRITE8_MEMBER(crush11_host_device::test_w)
@@ -99,13 +111,156 @@ WRITE8_MEMBER(crush11_host_device::test_w)
}
/*
+ Ddevices connected to SMBus
+*/
+
+// access logger
+
+DEFINE_DEVICE_TYPE(SMBUS_LOGGER, smbus_logger_device, "smbus_logger", "SMBUS LOGGER")
+
+smbus_logger_device::smbus_logger_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+ : device_t(mconfig, SMBUS_LOGGER, tag, owner, clock)
+{
+}
+
+int smbus_logger_device::execute_command(int command, int rw, int data)
+{
+ if (rw == 1)
+ {
+ logerror("smbus read from %02x R %02x\n", command, buffer[command]);
+ return buffer[command];
+ }
+ buffer[command] = (uint8_t)data;
+ logerror("smbus write to %02x W %02x\n", command, data);
+ return 0;
+}
+
+void smbus_logger_device::device_start()
+{
+ memset(buffer, 0, sizeof(buffer));
+}
+
+void smbus_logger_device::device_reset()
+{
+}
+
+// read-only data
+
+DEFINE_DEVICE_TYPE(SMBUS_ROM, smbus_rom_device, "smbus_rom", "SMBUS ROM")
+
+smbus_rom_device::smbus_rom_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) :
+ device_t(mconfig, SMBUS_ROM, tag, owner, clock)
+{
+}
+
+smbus_rom_device::smbus_rom_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock, const uint8_t *data, int size) :
+ smbus_rom_device(mconfig, tag, owner, clock)
+{
+ buffer = data;
+ buffer_size = size;
+}
+
+int smbus_rom_device::execute_command(int command, int rw, int data)
+{
+ if ((rw == 1) && (command < buffer_size) && (buffer != nullptr))
+ {
+ logerror("smbus rom read from %02x %02x\n", command, buffer[command]);
+ return buffer[command];
+ }
+ return 0;
+}
+
+void smbus_rom_device::device_start()
+{
+}
+
+void smbus_rom_device::device_reset()
+{
+}
+
+// Asus AS99127F chip
+
+DEFINE_DEVICE_TYPE(AS99127F, as99127f_device, "as99127f", "Asus AS99127F")
+
+as99127f_device::as99127f_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+ : device_t(mconfig, AS99127F, tag, owner, clock)
+{
+}
+
+int as99127f_device::execute_command(int command, int rw, int data)
+{
+ if (rw == 1)
+ {
+ logerror("smbus read from %02x R %02x\n", command, buffer[command]);
+ return buffer[command];
+ }
+ buffer[command] = (uint8_t)data;
+ logerror("smbus write to %02x W %02x\n", command, data);
+ return 0;
+}
+
+void as99127f_device::device_start()
+{
+ memset(buffer, 0, sizeof(buffer));
+}
+
+DEFINE_DEVICE_TYPE(AS99127F_SENSOR2, as99127f_sensor2_device, "as99127f_sensor2", "Asus AS99127F temperature sensor 2")
+
+as99127f_sensor2_device::as99127f_sensor2_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+ : device_t(mconfig, AS99127F_SENSOR2, tag, owner, clock)
+{
+}
+
+int as99127f_sensor2_device::execute_command(int command, int rw, int data)
+{
+ if (rw == 1)
+ {
+ logerror("smbus read from %02x R %02x\n", command, buffer[command]);
+ return buffer[command];
+ }
+ buffer[command] = (uint8_t)data;
+ logerror("smbus write to %02x W %02x\n", command, data);
+ return 0;
+}
+
+void as99127f_sensor2_device::device_start()
+{
+ memset(buffer, 0, sizeof(buffer));
+}
+
+DEFINE_DEVICE_TYPE(AS99127F_SENSOR3, as99127f_sensor3_device, "as99127f_sensor3", "Asus AS99127F temperature sensor 3")
+
+as99127f_sensor3_device::as99127f_sensor3_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+ : device_t(mconfig, AS99127F_SENSOR3, tag, owner, clock)
+{
+}
+
+int as99127f_sensor3_device::execute_command(int command, int rw, int data)
+{
+ if (rw == 1)
+ {
+ logerror("smbus read from %02x R %02x\n", command, buffer[command]);
+ return buffer[command];
+ }
+ buffer[command] = (uint8_t)data;
+ logerror("smbus write to %02x W %02x\n", command, data);
+ return 0;
+}
+
+void as99127f_sensor3_device::device_start()
+{
+ memset(buffer, 0, sizeof(buffer));
+}
+
+/*
Machine state
*/
class nforcepc_state : public driver_device
{
public:
- struct boot_state_info {
+ struct boot_state_info
+ {
uint8_t val;
const char *const message;
};
@@ -120,17 +275,28 @@ private:
void nforce_map(address_map &map);
void nforce_map_io(address_map &map);
DECLARE_WRITE8_MEMBER(boot_state_award_w);
+ IRQ_CALLBACK_MEMBER(irq_callback);
+ DECLARE_WRITE_LINE_MEMBER(maincpu_interrupt);
virtual void machine_start() override;
virtual void machine_reset() override;
+
+ required_device<cpu_device> m_maincpu;
+ required_device<mcpx_isalpc_device> isalpc;
+ required_device<as99127f_device> m_as99127f;
};
-nforcepc_state::nforcepc_state(const machine_config &mconfig, device_type type, const char *tag) : driver_device(mconfig, type, tag)
+nforcepc_state::nforcepc_state(const machine_config &mconfig, device_type type, const char *tag) :
+ driver_device(mconfig, type, tag),
+ m_maincpu(*this, "maincpu"),
+ isalpc(*this, ":pci:01.0"),
+ m_as99127f(*this, ":pci:01.1:12d")
{
}
void nforcepc_state::machine_start()
{
+ m_as99127f->get_buffer()[0x4f] = 0x12;
}
void nforcepc_state::machine_reset()
@@ -138,19 +304,30 @@ void nforcepc_state::machine_reset()
}
const nforcepc_state::boot_state_info nforcepc_state::boot_state_infos_award[] = {
+ { 0xC0, "Turn off chipset cache" },
{ 0, nullptr }
};
WRITE8_MEMBER(nforcepc_state::boot_state_award_w)
{
const char *desc = "";
- for(int i=0; boot_state_infos_award[i].message; i++)
- if(boot_state_infos_award[i].val == data) {
+ for (int i = 0; boot_state_infos_award[i].message; i++)
+ if (boot_state_infos_award[i].val == data)
+ {
desc = boot_state_infos_award[i].message;
break;
}
logerror("Boot state %02x - %s\n", data, desc);
+}
+
+IRQ_CALLBACK_MEMBER(nforcepc_state::irq_callback)
+{
+ return isalpc->acknowledge();
+}
+WRITE_LINE_MEMBER(nforcepc_state::maincpu_interrupt)
+{
+ m_maincpu->set_input_line(0, state ? HOLD_LINE : CLEAR_LINE);
}
void nforcepc_state::nforce_map(address_map &map)
@@ -172,14 +349,33 @@ void nforcepc_state::nforcepc(machine_config &config)
athlonxp_device &maincpu(ATHLONXP(config, "maincpu", 90000000));
maincpu.set_addrmap(AS_PROGRAM, &nforcepc_state::nforce_map);
maincpu.set_addrmap(AS_IO, &nforcepc_state::nforce_map_io);
- PCI_ROOT(config, ":pci", 0);
- CRUSH11(config, ":pci:00.0", 0, "maincpu", 2 * 1024 * 1024);
- /* maincpu.set_irq_acknowledge_callback("pci:07.0:pic8259_master", FUNC(pic8259_device::inta_cb));
- maincpu.smiact().set("pci:00.0", FUNC(i82439hx_host_device::smi_act_w));
+ maincpu.set_irq_acknowledge_callback(FUNC(nforcepc_state::irq_callback));
- i82371sb_isa_device &isa(I82371SB_ISA(config, ":pci:07.0", 0));
- isa.boot_state_hook().set(FUNC(nforcepc_state::boot_state_phoenix_ver40_rev6_w));
- isa.smi().set_inputline(":maincpu", INPUT_LINE_SMI);
+ PCI_ROOT(config, ":pci", 0);
+ CRUSH11(config, ":pci:00.0", 0, "maincpu", 2 * 1024 * 1024); /* 10de:01a4 NVIDIA Corporation nForce CPU bridge
+ 10de:01ac NVIDIA Corporation nForce 220/420 Memory Controller
+ 10de:01ad NVIDIA Corporation nForce 220/420 Memory Controller
+ 10de:01ab NVIDIA Corporation nForce 420 Memory Controller (DDR)*/
+ mcpx_isalpc_device &isa(MCPX_ISALPC(config, ":pci:01.0", 0, 0x10430c11)); // 10de:01b2 NVIDIA Corporation nForce ISA Bridge (LPC bus)
+ isa.boot_state_hook().set(FUNC(nforcepc_state::boot_state_award_w));
+ isa.interrupt_output().set(FUNC(nforcepc_state::maincpu_interrupt));
+ MCPX_SMBUS(config, ":pci:01.1", 0); // 10de:01b4 NVIDIA Corporation nForce PCI System Management (SMBus)
+ SMBUS_ROM(config, ":pci:01.1:050", 0, test_spd_data, sizeof(test_spd_data)); // these 3 are on smbus number 0
+ SMBUS_LOGGER(config, ":pci:01.1:051", 0);
+ SMBUS_LOGGER(config, ":pci:01.1:052", 0);
+ SMBUS_LOGGER(config, ":pci:01.1:108", 0); // these 4 are on smbus number 1
+ AS99127F(config, ":pci:01.1:12d", 0);
+ AS99127F_SENSOR2(config, ":pci:01.1:148", 0);
+ AS99127F_SENSOR3(config, ":pci:01.1:149", 0);
+ /*10de:01c2 NVIDIA Corporation nForce USB Controller
+ 10de:01c2 NVIDIA Corporation nForce USB Controller
+ 10de:01b0 NVIDIA Corporation nForce Audio Processing Unit
+ 10de:01b1 NVIDIA Corporation nForce AC'97 Audio Controller
+ 10de:01b8 NVIDIA Corporation nForce PCI-to-PCI bridge
+ 10de:01bc NVIDIA Corporation nForce IDE
+ 10de:01b7 NVIDIA Corporation nForce AGP to PCI Bridge
+ */
+ /* maincpu.smiact().set("pci:00.0", FUNC(i82439hx_host_device::smi_act_w));
i82371sb_ide_device &ide(I82371SB_IDE(config, ":pci:07.1", 0));
ide.irq_pri().set(":pci:07.0", FUNC(i82371sb_isa_device::pc_irq14_w));
@@ -189,9 +385,9 @@ void nforcepc_state::nforcepc(machine_config &config)
ROM_START(nforcepc)
ROM_REGION32_LE(0x40000, ":pci:00.0", 0) /* PC bios */
ROM_SYSTEM_BIOS(0, "a7n266c", "a7n266c") // Motherboard dump. Chip: SST49LF020 Package: PLCC32 Label had 3 lines of text: "A7NC3" "1001.D" "GSQ98"
- ROMX_LOAD("a7n266c.bin", 0, 0x40000, CRC(F4F0E4FC), ROM_BIOS(0))
- ROM_SYSTEM_BIOS(1, "a7n266c1001d", "a7n266c1001d") // bios version 1001.D dwonloaded from Asus website
- ROMX_LOAD("a7nc101d.awd", 0, 0x40000, CRC(EAD1147C), ROM_BIOS(1))
+ ROMX_LOAD("a7n266c.bin", 0, 0x40000, CRC(f4f0e4fc) SHA1(87f11545db178914623e41fb51e328da479a2efc), ROM_BIOS(0))
+ ROM_SYSTEM_BIOS(1, "a7n266c1001d", "a7n266c1001d") // bios version 1001.D downloaded from Asus website
+ ROMX_LOAD("a7nc101d.awd", 0, 0x40000, CRC(ead1147c) SHA1(27227df98e0c5fb9fecdb4bb6ef72df19766c330), ROM_BIOS(1))
ROM_END
static INPUT_PORTS_START(nforcepc)
diff --git a/src/mame/drivers/ngen.cpp b/src/mame/drivers/ngen.cpp
index eb8c8ad9804..c250242658d 100644
--- a/src/mame/drivers/ngen.cpp
+++ b/src/mame/drivers/ngen.cpp
@@ -307,7 +307,7 @@ WRITE16_MEMBER(ngen_state::peripheral_w)
case 0x0e:
case 0x0f:
if(ACCESSING_BITS_0_7)
- m_dmac->write(space,offset,data & 0xff);
+ m_dmac->write(offset,data & 0xff);
break;
case 0x80: // DMA page offset?
case 0x81:
@@ -340,11 +340,11 @@ WRITE16_MEMBER(ngen_state::peripheral_w)
break;
case 0x144:
if(ACCESSING_BITS_0_7)
- m_crtc->address_w(space,0,data & 0xff);
+ m_crtc->address_w(data & 0xff);
break;
case 0x145:
if(ACCESSING_BITS_0_7)
- m_crtc->register_w(space,0,data & 0xff);
+ m_crtc->register_w(data & 0xff);
break;
case 0x146:
case 0x147:
@@ -381,7 +381,7 @@ READ16_MEMBER(ngen_state::peripheral_r)
case 0x0e:
case 0x0f:
if(ACCESSING_BITS_0_7)
- ret = m_dmac->read(space,offset);
+ ret = m_dmac->read(offset);
logerror("DMA read offset %04x mask %04x returning %04x\n",offset,mem_mask,ret);
break;
case 0x80: // DMA page offset?
@@ -411,11 +411,11 @@ READ16_MEMBER(ngen_state::peripheral_r)
break;
case 0x144:
if(ACCESSING_BITS_0_7)
- ret = m_crtc->status_r(space,0);
+ ret = m_crtc->status_r();
break;
case 0x145:
if(ACCESSING_BITS_0_7)
- ret = m_crtc->register_r(space,0);
+ ret = m_crtc->register_r();
break;
case 0x146:
case 0x147: // keyboard UART
@@ -534,7 +534,7 @@ WRITE16_MEMBER(ngen_state::hfd_w)
case 0x16:
case 0x17:
if(ACCESSING_BITS_0_7)
- m_hdc->write(space,offset-0x10,data & 0xff);
+ m_hdc->write(offset-0x10,data & 0xff);
logerror("WD1010 register %i write %02x mask %04x\n",offset-0x10,data & 0xff,mem_mask);
break;
case 0x18:
@@ -583,7 +583,7 @@ READ16_MEMBER(ngen_state::hfd_r)
case 0x16:
case 0x17:
if(ACCESSING_BITS_0_7)
- ret = m_hdc->read(space,offset-0x10);
+ ret = m_hdc->read(offset-0x10);
logerror("WD1010 register %i read, mask %04x\n",offset-0x10,mem_mask);
break;
case 0x18:
@@ -814,7 +814,7 @@ READ16_MEMBER( ngen_state::b38_crtc_r )
{
case 0:
if(ACCESSING_BITS_0_7)
- ret = m_crtc->register_r(space,0);
+ ret = m_crtc->register_r();
break;
case 1:
if(ACCESSING_BITS_0_7)
@@ -830,11 +830,11 @@ WRITE16_MEMBER( ngen_state::b38_crtc_w )
{
case 0:
if(ACCESSING_BITS_0_7)
- m_crtc->address_w(space,0,data & 0xff);
+ m_crtc->address_w(data & 0xff);
break;
case 1:
if(ACCESSING_BITS_0_7)
- m_crtc->register_w(space,0,data & 0xff);
+ m_crtc->register_w(data & 0xff);
break;
}
}
diff --git a/src/mame/drivers/ngp.cpp b/src/mame/drivers/ngp.cpp
index 2d383252057..567969f18b7 100644
--- a/src/mame/drivers/ngp.cpp
+++ b/src/mame/drivers/ngp.cpp
@@ -168,12 +168,12 @@ private:
emu_timer* m_seconds_timer;
struct {
- int present;
+ int present;
uint8_t manufacturer_id;
uint8_t device_id;
uint8_t *data;
uint8_t org_data[16];
- int state;
+ int state;
uint8_t command[2];
} m_flash_chip[2];
@@ -186,27 +186,27 @@ private:
required_shared_ptr<uint8_t> m_mainram;
required_device<k1ge_device> m_k1ge;
- DECLARE_READ8_MEMBER( ngp_io_r );
- DECLARE_WRITE8_MEMBER( ngp_io_w );
+ uint8_t ngp_io_r(offs_t offset);
+ void ngp_io_w(offs_t offset, uint8_t data);
- void flash_w( int which, offs_t offset, uint8_t data );
- DECLARE_WRITE8_MEMBER( flash0_w );
- DECLARE_WRITE8_MEMBER( flash1_w );
+ template <int Which> void flash_w(offs_t offset, uint8_t data);
+ void flash0_w(offs_t offset, uint8_t data);
+ void flash1_w(offs_t offset, uint8_t data);
- DECLARE_READ8_MEMBER( ngp_z80_comm_r );
- DECLARE_WRITE8_MEMBER( ngp_z80_comm_w );
- DECLARE_WRITE8_MEMBER( ngp_z80_signal_main_w );
+ uint8_t ngp_z80_comm_r();
+ void ngp_z80_comm_w(uint8_t data);
+ void ngp_z80_signal_main_w(uint8_t data);
- DECLARE_WRITE8_MEMBER( ngp_z80_clear_irq );
+ void ngp_z80_clear_irq(uint8_t data);
- DECLARE_WRITE_LINE_MEMBER( ngp_vblank_pin_w );
- DECLARE_WRITE_LINE_MEMBER( ngp_hblank_pin_w );
- DECLARE_WRITE8_MEMBER( ngp_tlcs900_porta );
+ DECLARE_WRITE_LINE_MEMBER(ngp_vblank_pin_w);
+ DECLARE_WRITE_LINE_MEMBER(ngp_hblank_pin_w);
+ void ngp_tlcs900_porta(offs_t offset, uint8_t data);
uint32_t screen_update_ngp(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
TIMER_CALLBACK_MEMBER(ngp_seconds_callback);
- DECLARE_DEVICE_IMAGE_LOAD_MEMBER( ngp_cart);
- DECLARE_DEVICE_IMAGE_UNLOAD_MEMBER( ngp_cart );
+ DECLARE_DEVICE_IMAGE_LOAD_MEMBER(ngp_cart);
+ DECLARE_DEVICE_IMAGE_UNLOAD_MEMBER(ngp_cart);
void ngp_mem(address_map &map);
void z80_io(address_map &map);
@@ -225,28 +225,28 @@ private:
TIMER_CALLBACK_MEMBER(ngp_state::ngp_seconds_callback)
{
m_io_reg[0x16] += 1;
- if ( ( m_io_reg[0x16] & 0x0f ) == 0x0a )
+ if ((m_io_reg[0x16] & 0x0f) == 0x0a)
{
m_io_reg[0x16] += 0x06;
}
- if ( m_io_reg[0x16] >= 0x60 )
+ if (m_io_reg[0x16] >= 0x60)
{
m_io_reg[0x16] = 0;
m_io_reg[0x15] += 1;
- if ( ( m_io_reg[0x15] & 0x0f ) == 0x0a ) {
+ if ((m_io_reg[0x15] & 0x0f) == 0x0a) {
m_io_reg[0x15] += 0x06;
}
- if ( m_io_reg[0x15] >= 0x60 )
+ if (m_io_reg[0x15] >= 0x60)
{
m_io_reg[0x15] = 0;
m_io_reg[0x14] += 1;
- if ( ( m_io_reg[0x14] & 0x0f ) == 0x0a ) {
+ if ((m_io_reg[0x14] & 0x0f) == 0x0a) {
m_io_reg[0x14] += 0x06;
}
- if ( m_io_reg[0x14] == 0x24 )
+ if (m_io_reg[0x14] == 0x24)
{
m_io_reg[0x14] = 0;
}
@@ -255,11 +255,11 @@ TIMER_CALLBACK_MEMBER(ngp_state::ngp_seconds_callback)
}
-READ8_MEMBER( ngp_state::ngp_io_r )
+uint8_t ngp_state::ngp_io_r(offs_t offset)
{
uint8_t data = m_io_reg[offset];
- switch( offset )
+ switch (offset)
{
case 0x30: /* Read controls */
data = m_io_controls->read();
@@ -274,15 +274,15 @@ READ8_MEMBER( ngp_state::ngp_io_r )
}
-WRITE8_MEMBER( ngp_state::ngp_io_w )
+void ngp_state::ngp_io_w(offs_t offset, uint8_t data)
{
- switch( offset )
+ switch (offset)
{
case 0x20: /* t6w28 "right" */
case 0x21: /* t6w28 "left" */
- if ( m_io_reg[0x38] == 0x55 && m_io_reg[0x39] == 0xAA )
+ if (m_io_reg[0x38] == 0x55 && m_io_reg[0x39] == 0xAA)
{
- m_t6w28->write( space, 0, data );
+ m_t6w28->write(0, data);
}
break;
@@ -298,27 +298,27 @@ WRITE8_MEMBER( ngp_state::ngp_io_w )
case 0x37:
break;
case 0x38: /* Sound enable/disable. */
- switch( data )
+ switch (data)
{
case 0x55: /* Enabled sound */
- m_t6w28->set_enable( true );
+ m_t6w28->set_enable(true);
break;
case 0xAA: /* Disable sound */
- m_t6w28->set_enable( false );
+ m_t6w28->set_enable(false);
break;
}
break;
case 0x39: /* Z80 enable/disable. */
- switch( data )
+ switch (data)
{
case 0x55: /* Enable Z80 */
- m_z80->resume(SUSPEND_REASON_HALT );
+ m_z80->resume(SUSPEND_REASON_HALT);
m_z80->reset();
- m_z80->set_input_line(0, CLEAR_LINE );
+ m_z80->set_input_line(0, CLEAR_LINE);
break;
case 0xAA: /* Disable Z80 */
- m_z80->suspend(SUSPEND_REASON_HALT, 1 );
+ m_z80->suspend(SUSPEND_REASON_HALT, 1);
break;
}
break;
@@ -331,226 +331,226 @@ WRITE8_MEMBER( ngp_state::ngp_io_w )
}
-void ngp_state::flash_w( int which, offs_t offset, uint8_t data )
+template <int Which> void ngp_state::flash_w(offs_t offset, uint8_t data)
{
- if ( ! m_flash_chip[which].present )
+ if (!m_flash_chip[Which].present)
return;
- switch( m_flash_chip[which].state )
+ switch (m_flash_chip[Which].state)
{
case F_READ:
- if ( offset == 0x5555 && data == 0xaa )
- m_flash_chip[which].state = F_PROG1;
- m_flash_chip[which].command[0] = 0;
+ if (offset == 0x5555 && data == 0xaa)
+ m_flash_chip[Which].state = F_PROG1;
+ m_flash_chip[Which].command[0] = 0;
break;
case F_PROG1:
- if ( offset == 0x2aaa && data == 0x55 )
- m_flash_chip[which].state = F_PROG2;
+ if (offset == 0x2aaa && data == 0x55)
+ m_flash_chip[Which].state = F_PROG2;
else
- m_flash_chip[which].state = F_READ;
+ m_flash_chip[Which].state = F_READ;
break;
case F_PROG2:
- if ( data == 0x30 )
+ if (data == 0x30)
{
- if ( m_flash_chip[which].command[0] == 0x80 )
+ if (m_flash_chip[Which].command[0] == 0x80)
{
int size = 0x10000;
- uint8_t *block = m_flash_chip[which].data;
+ uint8_t *block = m_flash_chip[Which].data;
- m_flash_chip[which].state = F_AUTO_BLOCK_ERASE;
- switch( m_flash_chip[which].device_id )
+ m_flash_chip[Which].state = F_AUTO_BLOCK_ERASE;
+ switch (m_flash_chip[Which].device_id)
{
case 0xab:
- if ( offset < 0x70000 )
- block = m_flash_chip[which].data + ( offset & 0x70000 );
+ if (offset < 0x70000)
+ block = m_flash_chip[Which].data + (offset & 0x70000);
else
{
- if ( offset & 0x8000 )
+ if (offset & 0x8000)
{
- if ( offset & 0x4000 )
+ if (offset & 0x4000)
{
- block = m_flash_chip[which].data + ( offset & 0x7c000 );
+ block = m_flash_chip[Which].data + (offset & 0x7c000);
size = 0x4000;
}
else
{
- block = m_flash_chip[which].data + ( offset & 0x7e000 );
+ block = m_flash_chip[Which].data + (offset & 0x7e000);
size = 0x2000;
}
}
else
{
- block = m_flash_chip[which].data + ( offset & 0x78000 );
+ block = m_flash_chip[Which].data + (offset & 0x78000);
size = 0x8000;
}
}
break;
case 0x2c:
- if ( offset < 0xf0000 )
- block = m_flash_chip[which].data + ( offset & 0xf0000 );
+ if (offset < 0xf0000)
+ block = m_flash_chip[Which].data + (offset & 0xf0000);
else
{
- if ( offset & 0x8000 )
+ if (offset & 0x8000)
{
- if ( offset & 0x4000 )
+ if (offset & 0x4000)
{
- block = m_flash_chip[which].data + ( offset & 0xfc000 );
+ block = m_flash_chip[Which].data + (offset & 0xfc000);
size = 0x4000;
}
else
{
- block = m_flash_chip[which].data + ( offset & 0xfe000 );
+ block = m_flash_chip[Which].data + (offset & 0xfe000);
size = 0x2000;
}
}
else
{
- block = m_flash_chip[which].data + ( offset & 0xf8000 );
+ block = m_flash_chip[Which].data + (offset & 0xf8000);
size = 0x8000;
}
}
break;
case 0x2f:
- if ( offset < 0x1f0000 )
- block = m_flash_chip[which].data + ( offset & 0x1f0000 );
+ if (offset < 0x1f0000)
+ block = m_flash_chip[Which].data + (offset & 0x1f0000);
else
{
- if ( offset & 0x8000 )
+ if (offset & 0x8000)
{
- if ( offset & 0x4000 )
+ if (offset & 0x4000)
{
- block = m_flash_chip[which].data + ( offset & 0x1fc000 );
+ block = m_flash_chip[Which].data + (offset & 0x1fc000);
size = 0x4000;
}
else
{
- block = m_flash_chip[which].data + ( offset & 0x1fe000 );
+ block = m_flash_chip[Which].data + (offset & 0x1fe000);
size = 0x2000;
}
}
else
{
- block = m_flash_chip[which].data + ( offset & 0x1f8000 );
+ block = m_flash_chip[Which].data + (offset & 0x1f8000);
size = 0x8000;
}
}
break;
}
- memset( block, 0xFF, size );
+ memset(block, 0xFF, size);
}
else
- m_flash_chip[which].state = F_READ;
+ m_flash_chip[Which].state = F_READ;
}
- else if ( offset == 0x5555 )
+ else if (offset == 0x5555)
{
- switch( data )
+ switch (data)
{
case 0x80:
- m_flash_chip[which].command[0] = 0x80;
- m_flash_chip[which].state = F_COMMAND;
+ m_flash_chip[Which].command[0] = 0x80;
+ m_flash_chip[Which].state = F_COMMAND;
break;
case 0x90:
- m_flash_chip[which].data[0x1fc000] = m_flash_chip[which].manufacturer_id;
- m_flash_chip[which].data[0xfc000] = m_flash_chip[which].manufacturer_id;
- m_flash_chip[which].data[0x7c000] = m_flash_chip[which].manufacturer_id;
- m_flash_chip[which].data[0] = m_flash_chip[which].manufacturer_id;
- m_flash_chip[which].data[0x1fc001] = m_flash_chip[which].device_id;
- m_flash_chip[which].data[0xfc001] = m_flash_chip[which].device_id;
- m_flash_chip[which].data[0x7c001] = m_flash_chip[which].device_id;
- m_flash_chip[which].data[1] = m_flash_chip[which].device_id;
- m_flash_chip[which].data[0x1fc002] = 0x02;
- m_flash_chip[which].data[0xfc002] = 0x02;
- m_flash_chip[which].data[0x7c002] = 0x02;
- m_flash_chip[which].data[2] = 0x02;
- m_flash_chip[which].data[0x1fc003] = 0x80;
- m_flash_chip[which].data[0xfc003] = 0x80;
- m_flash_chip[which].data[0x7c003] = 0x80;
- m_flash_chip[which].data[3] = 0x80;
- m_flash_chip[which].state = F_ID_READ;
+ m_flash_chip[Which].data[0x1fc000] = m_flash_chip[Which].manufacturer_id;
+ m_flash_chip[Which].data[0xfc000] = m_flash_chip[Which].manufacturer_id;
+ m_flash_chip[Which].data[0x7c000] = m_flash_chip[Which].manufacturer_id;
+ m_flash_chip[Which].data[0] = m_flash_chip[Which].manufacturer_id;
+ m_flash_chip[Which].data[0x1fc001] = m_flash_chip[Which].device_id;
+ m_flash_chip[Which].data[0xfc001] = m_flash_chip[Which].device_id;
+ m_flash_chip[Which].data[0x7c001] = m_flash_chip[Which].device_id;
+ m_flash_chip[Which].data[1] = m_flash_chip[Which].device_id;
+ m_flash_chip[Which].data[0x1fc002] = 0x02;
+ m_flash_chip[Which].data[0xfc002] = 0x02;
+ m_flash_chip[Which].data[0x7c002] = 0x02;
+ m_flash_chip[Which].data[2] = 0x02;
+ m_flash_chip[Which].data[0x1fc003] = 0x80;
+ m_flash_chip[Which].data[0xfc003] = 0x80;
+ m_flash_chip[Which].data[0x7c003] = 0x80;
+ m_flash_chip[Which].data[3] = 0x80;
+ m_flash_chip[Which].state = F_ID_READ;
break;
case 0x9a:
- if ( m_flash_chip[which].command[0] == 0x9a )
- m_flash_chip[which].state = F_BLOCK_PROTECT;
+ if (m_flash_chip[Which].command[0] == 0x9a)
+ m_flash_chip[Which].state = F_BLOCK_PROTECT;
else
{
- m_flash_chip[which].command[0] = 0x9a;
- m_flash_chip[which].state = F_COMMAND;
+ m_flash_chip[Which].command[0] = 0x9a;
+ m_flash_chip[Which].state = F_COMMAND;
}
break;
case 0xa0:
- m_flash_chip[which].state = F_AUTO_PROGRAM;
+ m_flash_chip[Which].state = F_AUTO_PROGRAM;
break;
case 0xf0:
default:
- m_flash_chip[which].state = F_READ;
+ m_flash_chip[Which].state = F_READ;
break;
}
}
else
- m_flash_chip[which].state = F_READ;
+ m_flash_chip[Which].state = F_READ;
break;
case F_COMMAND:
- if ( offset == 0x5555 && data == 0xaa )
- m_flash_chip[which].state = F_PROG1;
+ if (offset == 0x5555 && data == 0xaa)
+ m_flash_chip[Which].state = F_PROG1;
else
- m_flash_chip[which].state = F_READ;
+ m_flash_chip[Which].state = F_READ;
break;
case F_ID_READ:
- if ( offset == 0x5555 && data == 0xaa )
- m_flash_chip[which].state = F_PROG1;
+ if (offset == 0x5555 && data == 0xaa)
+ m_flash_chip[Which].state = F_PROG1;
else
- m_flash_chip[which].state = F_READ;
- m_flash_chip[which].command[0] = 0;
+ m_flash_chip[Which].state = F_READ;
+ m_flash_chip[Which].command[0] = 0;
break;
case F_AUTO_PROGRAM:
/* Only 1 -> 0 changes can be programmed */
- m_flash_chip[which].data[offset] = m_flash_chip[which].data[offset] & data;
- m_flash_chip[which].state = F_READ;
+ m_flash_chip[Which].data[offset] = m_flash_chip[Which].data[offset] & data;
+ m_flash_chip[Which].state = F_READ;
break;
case F_AUTO_CHIP_ERASE:
- m_flash_chip[which].state = F_READ;
+ m_flash_chip[Which].state = F_READ;
break;
case F_AUTO_BLOCK_ERASE:
- m_flash_chip[which].state = F_READ;
+ m_flash_chip[Which].state = F_READ;
break;
case F_BLOCK_PROTECT:
- m_flash_chip[which].state = F_READ;
+ m_flash_chip[Which].state = F_READ;
break;
}
- if ( m_flash_chip[which].state == F_READ )
+ if (m_flash_chip[Which].state == F_READ)
{
/* Exit command/back to normal operation*/
- m_flash_chip[which].data[0] = m_flash_chip[which].org_data[0];
- m_flash_chip[which].data[1] = m_flash_chip[which].org_data[1];
- m_flash_chip[which].data[2] = m_flash_chip[which].org_data[2];
- m_flash_chip[which].data[3] = m_flash_chip[which].org_data[3];
- m_flash_chip[which].data[0x7c000] = m_flash_chip[which].org_data[4];
- m_flash_chip[which].data[0x7c001] = m_flash_chip[which].org_data[5];
- m_flash_chip[which].data[0x7c002] = m_flash_chip[which].org_data[6];
- m_flash_chip[which].data[0x7c003] = m_flash_chip[which].org_data[7];
- m_flash_chip[which].data[0xfc000] = m_flash_chip[which].org_data[8];
- m_flash_chip[which].data[0xfc001] = m_flash_chip[which].org_data[9];
- m_flash_chip[which].data[0xfc002] = m_flash_chip[which].org_data[10];
- m_flash_chip[which].data[0xfc003] = m_flash_chip[which].org_data[11];
- m_flash_chip[which].data[0x1fc000] = m_flash_chip[which].org_data[12];
- m_flash_chip[which].data[0x1fc001] = m_flash_chip[which].org_data[13];
- m_flash_chip[which].data[0x1fc002] = m_flash_chip[which].org_data[14];
- m_flash_chip[which].data[0x1fc003] = m_flash_chip[which].org_data[15];
- m_flash_chip[which].command[0] = 0;
+ m_flash_chip[Which].data[0] = m_flash_chip[Which].org_data[0];
+ m_flash_chip[Which].data[1] = m_flash_chip[Which].org_data[1];
+ m_flash_chip[Which].data[2] = m_flash_chip[Which].org_data[2];
+ m_flash_chip[Which].data[3] = m_flash_chip[Which].org_data[3];
+ m_flash_chip[Which].data[0x7c000] = m_flash_chip[Which].org_data[4];
+ m_flash_chip[Which].data[0x7c001] = m_flash_chip[Which].org_data[5];
+ m_flash_chip[Which].data[0x7c002] = m_flash_chip[Which].org_data[6];
+ m_flash_chip[Which].data[0x7c003] = m_flash_chip[Which].org_data[7];
+ m_flash_chip[Which].data[0xfc000] = m_flash_chip[Which].org_data[8];
+ m_flash_chip[Which].data[0xfc001] = m_flash_chip[Which].org_data[9];
+ m_flash_chip[Which].data[0xfc002] = m_flash_chip[Which].org_data[10];
+ m_flash_chip[Which].data[0xfc003] = m_flash_chip[Which].org_data[11];
+ m_flash_chip[Which].data[0x1fc000] = m_flash_chip[Which].org_data[12];
+ m_flash_chip[Which].data[0x1fc001] = m_flash_chip[Which].org_data[13];
+ m_flash_chip[Which].data[0x1fc002] = m_flash_chip[Which].org_data[14];
+ m_flash_chip[Which].data[0x1fc003] = m_flash_chip[Which].org_data[15];
+ m_flash_chip[Which].command[0] = 0;
}
}
-WRITE8_MEMBER( ngp_state::flash0_w )
+void ngp_state::flash0_w(offs_t offset, uint8_t data)
{
- flash_w( 0, offset, data );
+ flash_w<0>(offset, data);
}
-WRITE8_MEMBER( ngp_state::flash1_w )
+void ngp_state::flash1_w(offs_t offset, uint8_t data)
{
- flash_w( 1, offset, data );
+ flash_w<1>(offset, data);
}
@@ -566,21 +566,21 @@ void ngp_state::ngp_mem(address_map &map)
}
-READ8_MEMBER( ngp_state::ngp_z80_comm_r )
+uint8_t ngp_state::ngp_z80_comm_r()
{
return m_io_reg[0x3c];
}
-WRITE8_MEMBER( ngp_state::ngp_z80_comm_w )
+void ngp_state::ngp_z80_comm_w(uint8_t data)
{
m_io_reg[0x3c] = data;
}
-WRITE8_MEMBER( ngp_state::ngp_z80_signal_main_w )
+void ngp_state::ngp_z80_signal_main_w(uint8_t data)
{
- m_maincpu->set_input_line(TLCS900_INT5, ASSERT_LINE );
+ m_maincpu->set_input_line(TLCS900_INT5, ASSERT_LINE);
}
@@ -593,12 +593,12 @@ void ngp_state::z80_mem(address_map &map)
}
-WRITE8_MEMBER( ngp_state::ngp_z80_clear_irq )
+void ngp_state::ngp_z80_clear_irq(uint8_t data)
{
- m_z80->set_input_line(0, CLEAR_LINE );
+ m_z80->set_input_line(0, CLEAR_LINE);
/* I am not exactly sure what causes the maincpu INT5 signal to be cleared. This will do for now. */
- m_maincpu->set_input_line(TLCS900_INT5, CLEAR_LINE );
+ m_maincpu->set_input_line(TLCS900_INT5, CLEAR_LINE);
}
@@ -610,46 +610,46 @@ void ngp_state::z80_io(address_map &map)
INPUT_CHANGED_MEMBER(ngp_state::power_callback)
{
- if ( m_io_reg[0x33] & 0x04 )
+ if (m_io_reg[0x33] & 0x04)
{
- m_maincpu->set_input_line(TLCS900_NMI, (m_io_power->read() & 0x01 ) ? CLEAR_LINE : ASSERT_LINE );
+ m_maincpu->set_input_line(TLCS900_NMI, (m_io_power->read() & 0x01 ) ? CLEAR_LINE : ASSERT_LINE);
}
}
-static INPUT_PORTS_START( ngp )
+static INPUT_PORTS_START(ngp)
PORT_START("Controls")
- PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_NAME("Up")
- PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_NAME("Down")
- PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_NAME("Left")
- PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_NAME("Right")
- PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_BUTTON1) PORT_NAME("Button A")
- PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_BUTTON2) PORT_NAME("Button B")
- PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_SELECT) PORT_NAME("Option")
- PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_UNUSED )
+ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP) PORT_NAME("Up")
+ PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN) PORT_NAME("Down")
+ PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT) PORT_NAME("Left")
+ PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT) PORT_NAME("Right")
+ PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_BUTTON1) PORT_NAME("Button A")
+ PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_BUTTON2) PORT_NAME("Button B")
+ PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_SELECT) PORT_NAME("Option")
+ PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_UNUSED)
PORT_START("Power")
- PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_POWER_ON ) PORT_CHANGED_MEMBER(DEVICE_SELF, ngp_state, power_callback, nullptr)
+ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_POWER_ON) PORT_CHANGED_MEMBER(DEVICE_SELF, ngp_state, power_callback, nullptr)
INPUT_PORTS_END
-WRITE_LINE_MEMBER( ngp_state::ngp_vblank_pin_w )
+WRITE_LINE_MEMBER(ngp_state::ngp_vblank_pin_w)
{
- m_maincpu->set_input_line(TLCS900_INT4, state ? ASSERT_LINE : CLEAR_LINE );
+ m_maincpu->set_input_line(TLCS900_INT4, state ? ASSERT_LINE : CLEAR_LINE);
}
-WRITE_LINE_MEMBER( ngp_state::ngp_hblank_pin_w )
+WRITE_LINE_MEMBER(ngp_state::ngp_hblank_pin_w)
{
- m_maincpu->set_input_line(TLCS900_TIO, state ? ASSERT_LINE : CLEAR_LINE );
+ m_maincpu->set_input_line(TLCS900_TIO, state ? ASSERT_LINE : CLEAR_LINE);
}
-WRITE8_MEMBER( ngp_state::ngp_tlcs900_porta )
+void ngp_state::ngp_tlcs900_porta(offs_t offset, uint8_t data)
{
int to3 = BIT(data,3);
- if ( to3 && ! m_old_to3 )
- m_z80->set_input_line(0, ASSERT_LINE );
+ if (to3 && ! m_old_to3)
+ m_z80->set_input_line(0, ASSERT_LINE);
m_old_to3 = to3;
}
@@ -710,7 +710,7 @@ void ngp_state::machine_start()
}
m_seconds_timer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(ngp_state::ngp_seconds_callback),this));
- m_seconds_timer->adjust( attotime::from_seconds(1), 0, attotime::from_seconds(1) );
+ m_seconds_timer->adjust(attotime::from_seconds(1), 0, attotime::from_seconds(1));
save_item(NAME(m_io_reg));
save_item(NAME(m_old_to3));
@@ -737,7 +737,7 @@ void ngp_state::machine_reset()
m_z80->suspend(SUSPEND_REASON_HALT, 1);
m_z80->set_input_line(0, CLEAR_LINE);
- if ( m_nvram_loaded )
+ if (m_nvram_loaded)
{
m_maincpu->set_state_int(TLCS900_PC, 0xFF1800);
}
@@ -746,12 +746,12 @@ void ngp_state::machine_reset()
uint32_t ngp_state::screen_update_ngp(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{
- m_k1ge->update( bitmap, cliprect );
+ m_k1ge->update(bitmap, cliprect);
return 0;
}
-DEVICE_IMAGE_LOAD_MEMBER( ngp_state, ngp_cart )
+DEVICE_IMAGE_LOAD_MEMBER(ngp_state, ngp_cart)
{
uint32_t size = m_cart->common_get_size("rom");
@@ -798,7 +798,7 @@ DEVICE_IMAGE_LOAD_MEMBER( ngp_state, ngp_cart )
}
-DEVICE_IMAGE_UNLOAD_MEMBER( ngp_state, ngp_cart )
+DEVICE_IMAGE_UNLOAD_MEMBER(ngp_state, ngp_cart)
{
m_flash_chip[0].present = 0;
m_flash_chip[0].state = F_READ;
@@ -826,46 +826,45 @@ void ngp_state::nvram_write(emu_file &file)
}
-MACHINE_CONFIG_START(ngp_state::ngp_common)
-
+void ngp_state::ngp_common(machine_config &config)
+{
TMP95C061(config, m_maincpu, 6.144_MHz_XTAL);
m_maincpu->set_am8_16(1);
m_maincpu->set_addrmap(AS_PROGRAM, &ngp_state::ngp_mem);
m_maincpu->porta_write().set(FUNC(ngp_state::ngp_tlcs900_porta));
- MCFG_DEVICE_ADD( "soundcpu", Z80, 6.144_MHz_XTAL/2 )
- MCFG_DEVICE_PROGRAM_MAP( z80_mem)
- MCFG_DEVICE_IO_MAP( z80_io)
+ z80_device &soundcpu(Z80(config, "soundcpu", 6.144_MHz_XTAL/2));
+ soundcpu.set_addrmap(AS_PROGRAM, &ngp_state::z80_mem);
+ soundcpu.set_addrmap(AS_IO, &ngp_state::z80_io);
- MCFG_SCREEN_ADD( "screen", LCD )
- MCFG_SCREEN_RAW_PARAMS( 6.144_MHz_XTAL, 515, 0, 160 /*480*/, 199, 0, 152 )
- MCFG_SCREEN_UPDATE_DRIVER(ngp_state, screen_update_ngp)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_LCD));
+ screen.set_raw(6.144_MHz_XTAL, 515, 0, 160 /*480*/, 199, 0, 152);
+ screen.set_screen_update(FUNC(ngp_state::screen_update_ngp));
/* sound hardware */
SPEAKER(config, "lspeaker").front_left();
SPEAKER(config, "rspeaker").front_right();
- MCFG_DEVICE_ADD( "t6w28", T6W28, 6.144_MHz_XTAL/2 )
- MCFG_SOUND_ROUTE( 0, "lspeaker", 0.50 )
- MCFG_SOUND_ROUTE( 1, "rspeaker", 0.50 )
+ T6W28(config, m_t6w28, 6.144_MHz_XTAL/2);
+ m_t6w28->add_route(0, "lspeaker", 0.50);
+ m_t6w28->add_route(1, "rspeaker", 0.50);
- MCFG_DEVICE_ADD("ldac", DAC_8BIT_R2R, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 0.25) // unknown DAC
- MCFG_DEVICE_ADD("rdac", DAC_8BIT_R2R, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 0.25) // unknown DAC
- MCFG_DEVICE_ADD("vref", VOLTAGE_REGULATOR, 0) MCFG_VOLTAGE_REGULATOR_OUTPUT(5.0)
- MCFG_SOUND_ROUTE(0, "ldac", 1.0, DAC_VREF_POS_INPUT) MCFG_SOUND_ROUTE(0, "ldac", -1.0, DAC_VREF_NEG_INPUT)
- MCFG_SOUND_ROUTE(0, "rdac", 1.0, DAC_VREF_POS_INPUT) MCFG_SOUND_ROUTE(0, "rdac", -1.0, DAC_VREF_NEG_INPUT)
-MACHINE_CONFIG_END
+ DAC_8BIT_R2R(config, m_ldac, 0).add_route(ALL_OUTPUTS, "lspeaker", 0.25); // unknown DAC
+ DAC_8BIT_R2R(config, m_rdac, 0).add_route(ALL_OUTPUTS, "rspeaker", 0.25); // unknown DAC
+ voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref"));
+ vref.add_route(0, "ldac", 1.0, DAC_VREF_POS_INPUT); vref.add_route(0, "ldac", -1.0, DAC_VREF_NEG_INPUT);
+ vref.add_route(0, "rdac", 1.0, DAC_VREF_POS_INPUT); vref.add_route(0, "rdac", -1.0, DAC_VREF_NEG_INPUT);
+}
MACHINE_CONFIG_START(ngp_state::ngp)
ngp_common(config);
- K1GE(config , m_k1ge, 6.144_MHz_XTAL, "screen");
+ K1GE(config, m_k1ge, 6.144_MHz_XTAL, "screen");
m_k1ge->vblank_callback().set(FUNC(ngp_state::ngp_vblank_pin_w));
m_k1ge->hblank_callback().set(FUNC(ngp_state::ngp_hblank_pin_w));
- MCFG_SCREEN_MODIFY("screen")
- MCFG_SCREEN_PALETTE("k1ge:palette")
+ subdevice<screen_device>("screen")->set_palette("k1ge:palette");
MCFG_GENERIC_CARTSLOT_ADD("cartslot", generic_plain_slot, "ngp_cart")
MCFG_GENERIC_EXTENSIONS("bin,ngp,npc,ngc")
@@ -873,19 +872,18 @@ MACHINE_CONFIG_START(ngp_state::ngp)
MCFG_GENERIC_UNLOAD(ngp_state, ngp_cart)
/* software lists */
- MCFG_SOFTWARE_LIST_ADD("cart_list","ngp")
- MCFG_SOFTWARE_LIST_COMPATIBLE_ADD("ngpc_list","ngpc")
+ SOFTWARE_LIST(config, "cart_list").set_original("ngp");
+ SOFTWARE_LIST(config, "ngpc_list").set_compatible("ngpc");
MACHINE_CONFIG_END
MACHINE_CONFIG_START(ngp_state::ngpc)
ngp_common(config);
- K2GE(config , m_k1ge, 6.144_MHz_XTAL, "screen");
+ K2GE(config, m_k1ge, 6.144_MHz_XTAL, "screen");
m_k1ge->vblank_callback().set(FUNC(ngp_state::ngp_vblank_pin_w));
m_k1ge->hblank_callback().set(FUNC(ngp_state::ngp_hblank_pin_w));
- MCFG_SCREEN_MODIFY("screen")
- MCFG_SCREEN_PALETTE("k1ge:palette")
+ subdevice<screen_device>("screen")->set_palette("k1ge:palette");
MCFG_GENERIC_CARTSLOT_ADD("cartslot", generic_plain_slot, "ngp_cart")
MCFG_GENERIC_EXTENSIONS("bin,ngp,npc,ngc")
@@ -893,23 +891,23 @@ MACHINE_CONFIG_START(ngp_state::ngpc)
MCFG_GENERIC_UNLOAD(ngp_state, ngp_cart)
/* software lists */
- MCFG_SOFTWARE_LIST_ADD("cart_list","ngpc")
- MCFG_SOFTWARE_LIST_COMPATIBLE_ADD("ngp_list","ngp")
+ SOFTWARE_LIST(config, "cart_list").set_original("ngpc");
+ SOFTWARE_LIST(config, "ngp_list").set_compatible("ngp");
MACHINE_CONFIG_END
-ROM_START( ngp )
- ROM_REGION( 0x10000, "maincpu" , 0 )
- ROM_LOAD( "ngp_bios.ngp", 0x0000, 0x10000, CRC(6232df8d) SHA1(2f6429b68446536d8b03f35d02f1e98beb6460a0) )
+ROM_START(ngp)
+ ROM_REGION(0x10000, "maincpu" , 0)
+ ROM_LOAD("ngp_bios.ngp", 0x0000, 0x10000, CRC(6232df8d) SHA1(2f6429b68446536d8b03f35d02f1e98beb6460a0))
ROM_END
-ROM_START( ngpc )
- ROM_REGION( 0x10000, "maincpu", 0 )
- ROM_LOAD( "ngpcbios.rom", 0x0000, 0x10000, CRC(6eeb6f40) SHA1(edc13192054a59be49c6d55f83b70e2510968e86) )
+ROM_START(ngpc)
+ ROM_REGION(0x10000, "maincpu", 0)
+ ROM_LOAD("ngpcbios.rom", 0x0000, 0x10000, CRC(6eeb6f40) SHA1(edc13192054a59be49c6d55f83b70e2510968e86))
ROM_END
-// YEAR NAME PARENT COMPAT MACHINE INPUT STATE INIT COMPANY FULLNAME FLAGS
-CONS( 1998, ngp, 0, 0, ngp, ngp, ngp_state, empty_init, "SNK", "NeoGeo Pocket", MACHINE_SUPPORTS_SAVE )
-CONS( 1999, ngpc, ngp, 0, ngpc, ngp, ngp_state, empty_init, "SNK", "NeoGeo Pocket Color", MACHINE_SUPPORTS_SAVE )
+// YEAR NAME PARENT COMPAT MACHINE INPUT STATE INIT COMPANY FULLNAME FLAGS
+CONS(1998, ngp, 0, 0, ngp, ngp, ngp_state, empty_init, "SNK", "NeoGeo Pocket", MACHINE_SUPPORTS_SAVE)
+CONS(1999, ngpc, ngp, 0, ngpc, ngp, ngp_state, empty_init, "SNK", "NeoGeo Pocket Color", MACHINE_SUPPORTS_SAVE)
diff --git a/src/mame/drivers/nibble.cpp b/src/mame/drivers/nibble.cpp
index 76710cc0714..c510a5daeb5 100644
--- a/src/mame/drivers/nibble.cpp
+++ b/src/mame/drivers/nibble.cpp
@@ -333,20 +333,20 @@ GFXDECODE_END
* Machine Drivers *
*************************/
-MACHINE_CONFIG_START(nibble_state::nibble)
-
+void nibble_state::nibble(machine_config &config)
+{
UPD7811(config, m_maincpu, MASTER_CLOCK / 3); // type guessed; clock not verified
m_maincpu->set_addrmap(AS_PROGRAM, &nibble_state::nibble_map);
//m_maincpu->set_vblank_int("screen", FUNC(nibble_state::nibble_interrupt));
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(32*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 0*8, 32*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(nibble_state, screen_update_nibble)
- MCFG_SCREEN_PALETTE("palette")
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(32*8, 32*8);
+ screen.set_visarea(0*8, 32*8-1, 0*8, 32*8-1);
+ screen.set_screen_update(FUNC(nibble_state::screen_update_nibble));
+ screen.set_palette("palette");
GFXDECODE(config, m_gfxdecode, "palette", gfx_nibble);
@@ -367,7 +367,7 @@ MACHINE_CONFIG_START(nibble_state::nibble)
SPEAKER(config, "mono").front_center();
AY8910(config, "aysnd", MASTER_CLOCK/8).add_route(ALL_OUTPUTS, "mono", 0.50);
-MACHINE_CONFIG_END
+}
/*************************
diff --git a/src/mame/drivers/nichild.cpp b/src/mame/drivers/nichild.cpp
index a2873212d43..7f150a625a7 100644
--- a/src/mame/drivers/nichild.cpp
+++ b/src/mame/drivers/nichild.cpp
@@ -230,8 +230,8 @@ INTERRUPT_GEN_MEMBER(nichild_state::vdp_irq)
}
-MACHINE_CONFIG_START(nichild_state::nichild)
-
+void nichild_state::nichild(machine_config &config)
+{
/* basic machine hardware */
TMPZ84C011(config, m_maincpu, MAIN_CLOCK/4);
//m_maincpu->set_daisy_config(daisy_chain_main);
@@ -256,7 +256,7 @@ MACHINE_CONFIG_START(nichild_state::nichild)
/* sound hardware */
SPEAKER(config, "mono").front_center();
// YM3812(config, "fmsnd", SOUND_CLOCK).add_route(ALL_OUTPUTS, "speaker", 0.7);
-MACHINE_CONFIG_END
+}
/***************************************************************************
diff --git a/src/mame/drivers/nightgal.cpp b/src/mame/drivers/nightgal.cpp
index 6e1440b4a66..67d47158bcc 100644
--- a/src/mame/drivers/nightgal.cpp
+++ b/src/mame/drivers/nightgal.cpp
@@ -216,18 +216,18 @@ void nightgal_state::nightgal_palette(palette_device &palette) const
bit0 = BIT(color_prom[i], 0);
bit1 = BIT(color_prom[i], 1);
bit2 = BIT(color_prom[i], 2);
- int const r = combine_3_weights(weights_rg, bit0, bit1, bit2);
+ int const r = combine_weights(weights_rg, bit0, bit1, bit2);
// green component
bit0 = BIT(color_prom[i], 3);
bit1 = BIT(color_prom[i], 4);
bit2 = BIT(color_prom[i], 5);
- int const g = combine_3_weights(weights_rg, bit0, bit1, bit2);
+ int const g = combine_weights(weights_rg, bit0, bit1, bit2);
// blue component
bit0 = BIT(color_prom[i], 6);
bit1 = BIT(color_prom[i], 7);
- int const b = combine_2_weights(weights_b, bit0, bit1);
+ int const b = combine_weights(weights_b, bit0, bit1);
palette.set_pen_color(i, rgb_t(r, g, b));
}
@@ -788,26 +788,26 @@ void nightgal_state::machine_reset()
memset(m_blit_raw_data, 0, ARRAY_LENGTH(m_blit_raw_data));
}
-MACHINE_CONFIG_START(nightgal_state::royalqn)
-
+void nightgal_state::royalqn(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80,MASTER_CLOCK / 8) /* ? MHz */
- MCFG_DEVICE_PROGRAM_MAP(royalqn_map)
- MCFG_DEVICE_IO_MAP(royalqn_io)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", nightgal_state, irq0_line_hold)
+ Z80(config, m_maincpu, MASTER_CLOCK / 8); /* ? MHz */
+ m_maincpu->set_addrmap(AS_PROGRAM, &nightgal_state::royalqn_map);
+ m_maincpu->set_addrmap(AS_IO, &nightgal_state::royalqn_io);
+ m_maincpu->set_vblank_int("screen", FUNC(nightgal_state::irq0_line_hold));
- MCFG_DEVICE_ADD("sub", NSC8105, MASTER_CLOCK / 8)
- MCFG_DEVICE_PROGRAM_MAP(royalqn_nsc_map)
+ NSC8105(config, m_subcpu, MASTER_CLOCK / 8);
+ m_subcpu->set_addrmap(AS_PROGRAM, &nightgal_state::royalqn_nsc_map);
- MCFG_QUANTUM_PERFECT_CPU("maincpu")
+ config.m_perfect_cpu_quantum = subtag("maincpu");
- MCFG_JANGOU_BLITTER_ADD("blitter", MASTER_CLOCK/4)
+ JANGOU_BLITTER(config, m_blitter, MASTER_CLOCK/4);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_RAW_PARAMS(MASTER_CLOCK/4,320,0,256,264,16,240)
- MCFG_SCREEN_UPDATE_DRIVER(nightgal_state, screen_update_nightgal)
- MCFG_SCREEN_PALETTE(m_palette)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_raw(MASTER_CLOCK/4,320,0,256,264,16,240);
+ screen.set_screen_update(FUNC(nightgal_state::screen_update_nightgal));
+ screen.set_palette(m_palette);
PALETTE(config, m_palette, FUNC(nightgal_state::nightgal_palette), 0x20);
@@ -818,67 +818,65 @@ MACHINE_CONFIG_START(nightgal_state::royalqn)
aysnd.port_a_read_callback().set(FUNC(nightgal_state::input_1p_r));
aysnd.port_b_read_callback().set(FUNC(nightgal_state::input_2p_r));
aysnd.add_route(ALL_OUTPUTS, "mono", 0.40);
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(nightgal_state::sexygal)
+void nightgal_state::sexygal(machine_config &config)
+{
royalqn(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(sexygal_map)
- MCFG_DEVICE_IO_MAP(sexygal_io)
+ m_maincpu->set_addrmap(AS_PROGRAM, &nightgal_state::sexygal_map);
+ m_maincpu->set_addrmap(AS_IO, &nightgal_state::sexygal_io);
- MCFG_DEVICE_MODIFY("sub")
- MCFG_DEVICE_PROGRAM_MAP(sexygal_nsc_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", nightgal_state, irq0_line_hold)
+ m_subcpu->set_addrmap(AS_PROGRAM, &nightgal_state::sexygal_nsc_map);
+ m_subcpu->set_vblank_int("screen", FUNC(nightgal_state::irq0_line_hold));
- MCFG_DEVICE_ADD("audiocpu", NSC8105, MASTER_CLOCK / 8)
- MCFG_DEVICE_PROGRAM_MAP(sexygal_audio_map)
+ NSC8105(config, m_audiocpu, MASTER_CLOCK / 8);
+ m_audiocpu->set_addrmap(AS_PROGRAM, &nightgal_state::sexygal_audio_map);
- MCFG_DEVICE_ADD("sampleclk", CLOCK, 6000) // quite a wild guess
- MCFG_CLOCK_SIGNAL_HANDLER(INPUTLINE("audiocpu", INPUT_LINE_NMI))
+ clock_device &sampleclk(CLOCK(config, "sampleclk", 6000)); // quite a wild guess
+ sampleclk.signal_handler().set_inputline(m_audiocpu, INPUT_LINE_NMI);
- MCFG_DEVICE_ADD("dac", DAC_8BIT_R2R, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25) // unknown DAC
- MCFG_DEVICE_ADD("vref", VOLTAGE_REGULATOR, 0) MCFG_VOLTAGE_REGULATOR_OUTPUT(5.0)
- MCFG_SOUND_ROUTE(0, "dac", 1.0, DAC_VREF_POS_INPUT) MCFG_SOUND_ROUTE(0, "dac", -1.0, DAC_VREF_NEG_INPUT)
+ DAC_8BIT_R2R(config, "dac", 0).add_route(ALL_OUTPUTS, "mono", 0.25); // unknown DAC
+ voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref"));
+ vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT);
+ vref.add_route(0, "dac", -1.0, DAC_VREF_NEG_INPUT);
- MCFG_DEVICE_REMOVE("aysnd")
+ config.device_remove("aysnd");
ym2203_device &ymsnd(YM2203(config, "ymsnd", MASTER_CLOCK / 8));
ymsnd.port_a_read_callback().set(FUNC(nightgal_state::input_1p_r));
ymsnd.port_b_read_callback().set(FUNC(nightgal_state::input_2p_r));
ymsnd.add_route(ALL_OUTPUTS, "mono", 0.40);
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(nightgal_state::sweetgal)
+void nightgal_state::sweetgal(machine_config &config)
+{
sexygal(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(sweetgal_map)
+ m_maincpu->set_addrmap(AS_PROGRAM, &nightgal_state::sweetgal_map);
// doesn't have the extra NSC8105 (so how does this play samples?)
- MCFG_DEVICE_REMOVE("audiocpu")
- MCFG_DEVICE_REMOVE("sampleclk")
-MACHINE_CONFIG_END
+ config.device_remove("audiocpu");
+ config.device_remove("sampleclk");
+}
-MACHINE_CONFIG_START(nightgal_state::ngalsumr)
+void nightgal_state::ngalsumr(machine_config &config)
+{
royalqn(config);
- MCFG_DEVICE_MODIFY("maincpu")
// TODO: happens from protection device
- MCFG_DEVICE_PERIODIC_INT_DRIVER(nightgal_state, nmi_line_pulse, 60)
-
-MACHINE_CONFIG_END
+ m_maincpu->set_periodic_int(FUNC(nightgal_state::nmi_line_pulse), attotime::from_hz(60));
+}
-MACHINE_CONFIG_START(nightgal_state::sgaltrop)
+void nightgal_state::sgaltrop(machine_config &config)
+{
sexygal(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_IO_MAP(sgaltrop_io)
+ m_maincpu->set_addrmap(AS_IO, &nightgal_state::sgaltrop_io);
- MCFG_DEVICE_MODIFY("sub")
- MCFG_DEVICE_PROGRAM_MAP(sgaltrop_nsc_map)
+ m_subcpu->set_addrmap(AS_PROGRAM, &nightgal_state::sgaltrop_nsc_map);
- MCFG_DEVICE_REMOVE("audiocpu")
- MCFG_DEVICE_REMOVE("sampleclk")
-MACHINE_CONFIG_END
+ config.device_remove("audiocpu");
+ config.device_remove("sampleclk");
+}
/*
Night Gal
diff --git a/src/mame/drivers/nightmare.cpp b/src/mame/drivers/nightmare.cpp
index 9310db538fd..e3b89a4614d 100644
--- a/src/mame/drivers/nightmare.cpp
+++ b/src/mame/drivers/nightmare.cpp
@@ -347,13 +347,11 @@ void nightmare_state::nightmare_map(address_map &map)
void nightmare_state::nightmare_io_map(address_map &map)
{
- map(0x0001, 0x0001).r("ic8", FUNC(cdp1852_device::read)).w(FUNC(nightmare_state::unkout_w));
- map(0x0002, 0x0002).r("ic9", FUNC(cdp1852_device::read)).w("ic10", FUNC(cdp1852_device::write));
+ map(1, 1).r("ic8", FUNC(cdp1852_device::read)).w(FUNC(nightmare_state::unkout_w));
+ map(2, 2).r("ic9", FUNC(cdp1852_device::read)).w("ic10", FUNC(cdp1852_device::write));
- map(0x0004, 0x0004).rw(m_vdc, FUNC(tms9928a_device::vram_r), FUNC(tms9928a_device::vram_w));
- map(0x0005, 0x0005).rw(m_vdc, FUNC(tms9928a_device::register_r), FUNC(tms9928a_device::register_w));
- map(0x0006, 0x0006).rw(m_vdc2, FUNC(tms9928a_device::vram_r), FUNC(tms9928a_device::vram_w));
- map(0x0007, 0x0007).rw(m_vdc2, FUNC(tms9928a_device::register_r), FUNC(tms9928a_device::register_w));
+ map(4, 5).rw(m_vdc, FUNC(tms9928a_device::read), FUNC(tms9928a_device::write));
+ map(6, 7).rw(m_vdc2, FUNC(tms9928a_device::read), FUNC(tms9928a_device::write));
}
void nightmare_state::nightmare_sound_map(address_map &map)
diff --git a/src/mame/drivers/ninjaw.cpp b/src/mame/drivers/ninjaw.cpp
index c34b15683e1..c25bc3d0bd6 100644
--- a/src/mame/drivers/ninjaw.cpp
+++ b/src/mame/drivers/ninjaw.cpp
@@ -751,7 +751,7 @@ void ninjaw_state::ninjaw(machine_config &config)
// Let's use a better timer (was 6000 before) based off actual CPU timing.
// Might as well bump the divider in case the bug still occurs before resorting to perfect CPU.
config.m_minimum_quantum = attotime::from_hz(16000000/1024); /* CPU slices */
- //MCFG_QUANTUM_PERFECT_CPU("maincpu")
+ //config.m_perfect_cpu_quantum = subtag("maincpu");
tc0040ioc_device &tc0040ioc(TC0040IOC(config, "tc0040ioc", 0));
tc0040ioc.read_0_callback().set_ioport("DSWA");
diff --git a/src/mame/drivers/nitedrvr.cpp b/src/mame/drivers/nitedrvr.cpp
index 9d8a10441bf..8cb9572a515 100644
--- a/src/mame/drivers/nitedrvr.cpp
+++ b/src/mame/drivers/nitedrvr.cpp
@@ -140,34 +140,33 @@ GFXDECODE_END
/* Machine Driver */
-MACHINE_CONFIG_START(nitedrvr_state::nitedrvr)
-
+void nitedrvr_state::nitedrvr(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M6502, 12.096_MHz_XTAL / 12) // 1 MHz
- MCFG_DEVICE_PROGRAM_MAP(nitedrvr_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", nitedrvr_state, irq0_line_hold)
+ M6502(config, m_maincpu, 12.096_MHz_XTAL / 12); // 1 MHz
+ m_maincpu->set_addrmap(AS_PROGRAM, &nitedrvr_state::nitedrvr_map);
+ m_maincpu->set_vblank_int("screen", FUNC(nitedrvr_state::irq0_line_hold));
WATCHDOG_TIMER(config, "watchdog").set_vblank_count("screen", 3);
- MCFG_TIMER_DRIVER_ADD_PERIODIC("crash_timer", nitedrvr_state, nitedrvr_crash_toggle_callback, PERIOD_OF_555_ASTABLE(RES_K(180), 330, CAP_U(1)))
+ TIMER(config, "crash_timer").configure_periodic(FUNC(nitedrvr_state::nitedrvr_crash_toggle_callback), PERIOD_OF_555_ASTABLE(RES_K(180), 330, CAP_U(1)));
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_RAW_PARAMS(12.096_MHz_XTAL / 2, 384, 0, 256, 278, 0, 256) // ~57 Hz
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_raw(12.096_MHz_XTAL / 2, 384, 0, 256, 278, 0, 256); // ~57 Hz
// PROM derives VRESET, VBLANK, VSYNC, IRQ from vertical scan count and last VBLANK
- MCFG_SCREEN_UPDATE_DRIVER(nitedrvr_state, screen_update_nitedrvr)
- MCFG_SCREEN_PALETTE(m_palette)
+ screen.set_screen_update(FUNC(nitedrvr_state::screen_update_nitedrvr));
+ screen.set_palette(m_palette);
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_nitedrvr)
+ GFXDECODE(config, m_gfxdecode, m_palette, gfx_nitedrvr);
PALETTE(config, m_palette, palette_device::MONOCHROME);
/* sound hardware */
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("discrete", DISCRETE, nitedrvr_discrete)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
-MACHINE_CONFIG_END
+ DISCRETE(config, m_discrete, nitedrvr_discrete).add_route(ALL_OUTPUTS, "mono", 1.0);
+}
/* ROMs */
diff --git a/src/mame/drivers/niyanpai.cpp b/src/mame/drivers/niyanpai.cpp
index 74ea1878ff3..5cdbd6a3f82 100644
--- a/src/mame/drivers/niyanpai.cpp
+++ b/src/mame/drivers/niyanpai.cpp
@@ -154,8 +154,6 @@ void niyanpai_state::niyanpai_map(address_map &map)
map(0x240a01, 0x240a01).w(FUNC(niyanpai_state::clutsel_0_w));
map(0x240c01, 0x240c01).w(FUNC(niyanpai_state::clutsel_1_w));
map(0x240e01, 0x240e01).w(FUNC(niyanpai_state::clutsel_2_w));
-
- map(0xfffc00, 0xffffff).rw(m_tmp68301, FUNC(tmp68301_device::regs_r), FUNC(tmp68301_device::regs_w)); // TMP68301 Registers
}
void niyanpai_state::musobana_map(address_map &map)
@@ -193,8 +191,6 @@ void niyanpai_state::musobana_map(address_map &map)
map(0x280000, 0x280001).r(FUNC(niyanpai_state::dipsw_r));
map(0x280200, 0x280201).r(FUNC(niyanpai_state::musobana_inputport_0_r));
map(0x280400, 0x280401).portr("SYSTEM");
-
- map(0xfffc00, 0xffffff).rw(m_tmp68301, FUNC(tmp68301_device::regs_r), FUNC(tmp68301_device::regs_w)); // TMP68301 Registers
}
void niyanpai_state::mhhonban_map(address_map &map)
@@ -234,8 +230,6 @@ void niyanpai_state::mhhonban_map(address_map &map)
map(0x280000, 0x280001).r(FUNC(niyanpai_state::dipsw_r));
map(0x280200, 0x280201).r(FUNC(niyanpai_state::musobana_inputport_0_r));
map(0x280400, 0x280401).portr("SYSTEM");
-
- map(0xfffc00, 0xffffff).rw(m_tmp68301, FUNC(tmp68301_device::regs_r), FUNC(tmp68301_device::regs_w)); // TMP68301 Registers
}
void niyanpai_state::zokumahj_map(address_map &map)
@@ -274,8 +268,6 @@ void niyanpai_state::zokumahj_map(address_map &map)
map(0x280000, 0x280001).r(FUNC(niyanpai_state::dipsw_r));
map(0x280200, 0x280201).r(FUNC(niyanpai_state::musobana_inputport_0_r));
map(0x280400, 0x280401).portr("SYSTEM");
-
- map(0xfffc00, 0xffffff).rw(m_tmp68301, FUNC(tmp68301_device::regs_r), FUNC(tmp68301_device::regs_w)); // TMP68301 Registers
}
@@ -687,64 +679,60 @@ INPUT_PORTS_END
WRITE_LINE_MEMBER(niyanpai_state::vblank_irq)
{
if (state)
- m_tmp68301->external_interrupt_0();
+ m_maincpu->external_interrupt_0();
}
-MACHINE_CONFIG_START(niyanpai_state::niyanpai)
-
+void niyanpai_state::niyanpai(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD(m_maincpu, M68000, 12288000/2) /* TMP68301, 6.144 MHz */
- MCFG_DEVICE_PROGRAM_MAP(niyanpai_map)
- MCFG_DEVICE_IRQ_ACKNOWLEDGE_DEVICE("tmp68301",tmp68301_device,irq_callback)
-
- TMP68301(config, m_tmp68301, 0);
- m_tmp68301->set_cputag(m_maincpu);
- m_tmp68301->out_parallel_callback().set(FUNC(niyanpai_state::tmp68301_parallel_port_w));
+ TMP68301(config, m_maincpu, 12288000/2); /* TMP68301, 6.144 MHz */
+ m_maincpu->set_addrmap(AS_PROGRAM, &niyanpai_state::niyanpai_map);
+ m_maincpu->out_parallel_callback().set(FUNC(niyanpai_state::tmp68301_parallel_port_w));
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(1024, 512)
- MCFG_SCREEN_VISIBLE_AREA(0, 640-1, 0, 240-1)
- MCFG_SCREEN_UPDATE_DRIVER(niyanpai_state, screen_update)
- MCFG_SCREEN_PALETTE("palette")
- MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE(*this, niyanpai_state, vblank_irq))
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_refresh_hz(60);
+ m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ m_screen->set_size(1024, 512);
+ m_screen->set_visarea(0, 640-1, 0, 240-1);
+ m_screen->set_screen_update(FUNC(niyanpai_state::screen_update));
+ m_screen->set_palette(m_palette);
+ m_screen->screen_vblank().set(FUNC(niyanpai_state::vblank_irq));
- MCFG_PALETTE_ADD("palette", 256*3)
+ PALETTE(config, m_palette).set_entries(256*3);
/* sound hardware */
NICHISND(config, "nichisnd", 0);
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(niyanpai_state::musobana)
+void niyanpai_state::musobana(machine_config &config)
+{
niyanpai(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(musobana_map)
+ m_maincpu->set_addrmap(AS_PROGRAM, &niyanpai_state::musobana_map);
MCFG_MACHINE_START_OVERRIDE(niyanpai_state, musobana)
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(niyanpai_state::mhhonban)
+void niyanpai_state::mhhonban(machine_config &config)
+{
musobana(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(mhhonban_map)
-MACHINE_CONFIG_END
+ m_maincpu->set_addrmap(AS_PROGRAM, &niyanpai_state::mhhonban_map);
+}
-MACHINE_CONFIG_START(niyanpai_state::zokumahj)
+void niyanpai_state::zokumahj(machine_config &config)
+{
musobana(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(zokumahj_map)
-MACHINE_CONFIG_END
+ m_maincpu->set_addrmap(AS_PROGRAM, &niyanpai_state::zokumahj_map);
+}
ROM_START( niyanpai )
diff --git a/src/mame/drivers/nmg5.cpp b/src/mame/drivers/nmg5.cpp
index 86024675c58..29f0938e8b5 100644
--- a/src/mame/drivers/nmg5.cpp
+++ b/src/mame/drivers/nmg5.cpp
@@ -978,14 +978,14 @@ void nmg5_state::machine_reset()
m_input_data = 0;
}
-MACHINE_CONFIG_START(nmg5_state::nmg5)
-
+void nmg5_state::nmg5(machine_config &config)
+{
/* basic machine hardware */
- M68000(config, m_maincpu, 16000000); /* 16 MHz */
+ M68000(config, m_maincpu, 16000000); /* 16 MHz */
m_maincpu->set_addrmap(AS_PROGRAM, &nmg5_state::nmg5_map);
m_maincpu->set_vblank_int("screen", FUNC(nmg5_state::irq6_line_hold));
- Z80(config, m_soundcpu, 4000000); /* 4 MHz */
+ Z80(config, m_soundcpu, 4000000); /* 4 MHz */
m_soundcpu->set_addrmap(AS_PROGRAM, &nmg5_state::nmg5_sound_map);
m_soundcpu->set_addrmap(AS_IO, &nmg5_state::sound_io_map);
diff --git a/src/mame/drivers/nmk16.cpp b/src/mame/drivers/nmk16.cpp
index c0e7a2a8a5c..027d15ebbc6 100644
--- a/src/mame/drivers/nmk16.cpp
+++ b/src/mame/drivers/nmk16.cpp
@@ -41,7 +41,7 @@ Action is simply a hack of USSAF Mustang.
The NMK004 CPU is a Toshiba TMP90C840 with internal ROM.
The dumped internal ROM has a date string of 900315 in ROM and a version number of V-00
-The later games (from GunNail onwards) have an higher resolution (384x224 instead
+The later games (from GunNail onwards) have a higher resolution (384x224 instead
of 256x224) but the hardware is pretty much the same. It's obvious that the higher
res is an afterthought, because the tilemap layout is weird (the left 8 screen
columns have to be taken from the rightmost 8 columns of the tilemap), and the
@@ -7324,7 +7324,7 @@ Other: Lattice pLSI 1032 x 2
void nmk16_state::init_redhawk()
{
- decryptcode( machine(), 23, 22, 21, 20, 19, 18, 16, 15, 14, 17, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0 );
+ decryptcode( machine(), 23, 22, 21, 20, 19, 18, 16, 15, 14, 17, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0 );
}
ROM_START( redhawk ) /* U.S.A., Canada & South America, (c) 1997 */
@@ -7666,12 +7666,7 @@ ROM_END
void nmk16_state::init_grdnstrmg()
{
- // todo collapse to one bitswap
- decryptcode( machine(),23, 22, 21, 20, 19, 18, 13,17, 16,15, 14, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0 );
- decryptcode( machine(),23, 22, 21, 20, 19, 18, 17,16, 14,15, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0 );
- decryptcode( machine(),23, 22, 21, 20, 19, 18, 17,15, 16,14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0 );
- decryptcode( machine(),23, 22, 21, 20, 19, 18, 16,17, 15,14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0 );
-
+ decryptcode( machine(), 23, 22, 21, 20, 19, 18, 13, 16, 15 ,14, 17, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0 );
}
ROM_START( grdnstrmg ) /* Germany */
@@ -7688,7 +7683,7 @@ ROM_START( grdnstrmg ) /* Germany */
ROM_LOAD16_BYTE( "gs10_br4.uc11",0x100001, 0x080000, CRC(1d3b57e1) SHA1(a2da598d6cbe257de5b66905a5ad9de90711ccc7) )
ROM_LOAD16_BYTE( "gs9_br2.uc4", 0x100000, 0x080000, CRC(4d2c220b) SHA1(066067f7e80973ba0483559ac04f99292cc82dce) )
- // the other sets have larger regions here because they contain 2 sets of tiles in the ROMs, one for each orientation.
+ // some other sets have larger regions here because they contain 2 sets of tiles in the ROMs, one for each orientation.
// this set only contains the tile data for the required orientation.
ROM_REGION( 0x200000, "bgtile", 0 ) /* Layer 0, 16x16x8 */
ROM_LOAD( "gs10_cr5.uc15", 0x000000, 0x080000, CRC(2c8c23e3) SHA1(4c1a460dfc250f9aea77e2ddd82278ee816365be) )
@@ -7703,6 +7698,38 @@ ROM_START( grdnstrmg ) /* Germany */
ROM_LOAD( "gs2_s2.uc18", 0x00000, 0x40000, CRC(e911ce33) SHA1(a29c4dea98a22235122303325c63c15fadd3431d) ) //
ROM_END
+void nmk16_state::init_grdnstrmau()
+{
+ decryptcode( machine(), 23, 22, 21, 20, 19, 18, 13, 16, 14, 15, 17, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0 );
+}
+
+ROM_START( grdnstrmau )
+ ROM_REGION( 0x80000, "maincpu", 0 ) /* 68000 Code */
+ ROM_LOAD16_BYTE( "uc9_27c020.10", 0x000000, 0x040000, CRC(548932b4) SHA1(c90c7e769235d12b07b24deac436202c650cf3e8) )
+ ROM_LOAD16_BYTE( "uc1_27c020.9", 0x000001, 0x040000, CRC(269e2fbc) SHA1(17c3511a44f044927c23f2e5bb8e75c29e3fbcc2) )
+
+ ROM_REGION( 0x10000, "audiocpu", 0 ) /* Z80 Code */
+ ROM_LOAD( "uc14_27c512.8", 0x00000, 0x10000, CRC(5d8cf28e) SHA1(2a440bf5136f95af137b6688e566a14e65be94b1) )
+
+ ROM_REGION( 0x200000, "sprites", 0 ) /* Sprites, 16x16x4 */
+ ROM_LOAD16_BYTE( "uc3_27c040.8", 0x000000, 0x80000, CRC(9fc36932) SHA1(bc1617b1c4452114171b0d4fc4478346e8db4e00) )
+ ROM_LOAD16_BYTE( "uc10_27c040.9", 0x000001, 0x80000, CRC(6e809d09) SHA1(c884b387a30930df7cd60b9bd80431577de9f356) )
+ ROM_LOAD16_BYTE( "uc4_27c040.10", 0x100000, 0x80000, CRC(73bd6451) SHA1(a620d115f9c1b33f2c37a5263d6e53255af87cfb) )
+ ROM_LOAD16_BYTE( "uc11_27c040.8", 0x100001, 0x80000, CRC(e699a3c9) SHA1(db9337581a8231c72c8dd5e05b0a35121c3a1552) )
+
+ ROM_REGION( 0x200000, "bgtile", 0 ) /* Layer 0, 16x16x8 */
+ ROM_LOAD( "uc15_27c040.10", 0x000000, 0x80000, CRC(0822f7e0) SHA1(b6ce51bbeeea021d4f8678e35df4e14166bd4d8b) )
+ ROM_LOAD( "uc19_27c040.8", 0x080000, 0x80000, CRC(fa078e35) SHA1(e65175cc5a5e7214068b3f4686e37b872396424d) )
+ ROM_LOAD( "uc6_27c040.9", 0x100000, 0x80000, CRC(ec288b95) SHA1(59e3728ce553d1af81bd023700669345b114c8e3) )
+ ROM_LOAD( "uc12_27c040.10", 0x180000, 0x80000, CRC(a9ceec33) SHA1(d4f76f7a8203755fe756a9e17100f830db34eaab) )
+
+ ROM_REGION( 0x10000, "fgtile", 0 ) /* Layer 1, 8x8x4 */
+ ROM_LOAD( "uc2_27c512.9", 0x00000, 0x10000, CRC(b38d8446) SHA1(b2c8efb3db71b7428fcadc0d7098f8bc77dd6670) )
+
+ ROM_REGION( 0x40000, "oki1", 0 ) /* Samples */
+ ROM_LOAD( "uc18_27c020.9", 0x00000, 0x40000, CRC(e911ce33) SHA1(a29c4dea98a22235122303325c63c15fadd3431d) )
+ROM_END
+
// 紅狐戰機 II (Hóng Hú Zhànjī II)
ROM_START( redfoxwp2 )
ROM_REGION( 0x80000, "maincpu", 0 ) /* 68000 Code */
@@ -7728,10 +7755,7 @@ ROM_END
void nmk16_state::init_redfoxwp2a()
{
- // todo collapse to one bitswap
- decryptcode( machine(),23, 22, 21, 20, 19, 18, 17, 16, /* */ 13,15, 14, /* */ 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0 );
- decryptcode( machine(),23, 22, 21, 20, 19, 18, 17, 16, /* */14,15, /* */ 13,12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0 );
- decryptcode( machine(),23, 22, 21, 20, 19, 18, /* */ 16, 17, /* */ 15,14,13,12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0 );
+ decryptcode( machine(), 23, 22, 21, 20, 19, 18, 16, 17, 13, 14, 15, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0 );
}
// 紅狐戰機 II (Hóng Hú Zhànjī II)
@@ -8239,7 +8263,7 @@ UC1, UC2 & UC3 have solder pads for both MX29F1610 Flash & 27C160 EPROMs
void nmk16_state::init_spec2k()
{
- decryptcode( machine(), 23, 22, 21, 20, 19, 18, 17, 13, 14, 15, 16, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0 );
+ decryptcode( machine(), 23, 22, 21, 20, 19, 18, 17, 13, 14, 15, 16, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0 );
}
ROM_START( spec2kh )
@@ -8447,6 +8471,7 @@ GAME( 1998, grdnstrmk, grdnstrm, grdnstrmk, grdnstrk, nmk16_state, init_
GAME( 1998, redfoxwp2, grdnstrm, grdnstrmk, grdnstrk, nmk16_state, init_grdnstrm, ROT270, "Afega", "Hong Hu Zhanji II (China, set 1)", 0 )
GAME( 1998, redfoxwp2a, grdnstrm, grdnstrmk, grdnstrk, nmk16_state, init_redfoxwp2a, ROT270, "Afega", "Hong Hu Zhanji II (China, set 2)", 0 )
GAME( 1998, grdnstrmg, grdnstrm, grdnstrmk, grdnstrk, nmk16_state, init_grdnstrmg, ROT270, "Afega", "Guardian Storm (Germany)", 0 )
+GAME( 1998, grdnstrmau, grdnstrm, grdnstrm, grdnstrm, nmk16_state, init_grdnstrmau, ORIENTATION_FLIP_Y, "Afega", "Guardian Storm (horizontal, Australia)", 0 )
// is there a 'bubble 2000' / 'hot bubble' version with Afega copyright, or is the only Afega release dolmen above, this seems like a sequel, not a clone?
GAME( 1998, bubl2000, 0, popspops, bubl2000, nmk16_state, init_bubl2000, ROT0, "Afega (Tuning license)", "Bubble 2000", 0 ) // on a tuning board - Has a Demo Sound DSW
diff --git a/src/mame/drivers/nmkmedal.cpp b/src/mame/drivers/nmkmedal.cpp
index ec7e3d196bd..91fea27838e 100644
--- a/src/mame/drivers/nmkmedal.cpp
+++ b/src/mame/drivers/nmkmedal.cpp
@@ -55,14 +55,14 @@ void nmkmedal_state::mem_map(address_map &map)
static INPUT_PORTS_START( trocana )
INPUT_PORTS_END
-MACHINE_CONFIG_START(nmkmedal_state::trocana)
- MCFG_DEVICE_ADD("maincpu", TMP90841, 16500000 / 2) // actually TMP90C041AN
- MCFG_DEVICE_PROGRAM_MAP(mem_map)
+void nmkmedal_state::trocana(machine_config &config)
+{
+ TMP90841(config, m_maincpu, 16500000 / 2); // actually TMP90C041AN
+ m_maincpu->set_addrmap(AS_PROGRAM, &nmkmedal_state::mem_map);
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("oki", OKIM6376, 16500000 / 16) // actually MSM6650
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
-MACHINE_CONFIG_END
+ OKIM6376(config, "oki", 16500000 / 16).add_route(ALL_OUTPUTS, "mono", 1.0); // actually MSM6650
+}
ROM_START( trocana)
ROM_REGION(0x10000, "maincpu", 0)
diff --git a/src/mame/drivers/nokia_3310.cpp b/src/mame/drivers/nokia_3310.cpp
index 86cbbd2d2b8..ea7919f0682 100644
--- a/src/mame/drivers/nokia_3310.cpp
+++ b/src/mame/drivers/nokia_3310.cpp
@@ -262,7 +262,7 @@ void noki3310_state::machine_reset()
m_timer_fiq8->adjust(attotime::from_hz(1000), 0, attotime::from_hz(1000));
// simulate power-on input
- if (machine().system().name && (machine().system().name[4] == '8' || machine().system().name[4] == '5'))
+ if (machine().system().name[4] == '8' || machine().system().name[4] == '5')
m_power_on = ~0x10;
else
m_power_on = ~0x02;
@@ -700,60 +700,56 @@ static INPUT_PORTS_START( noki3310 )
INPUT_PORTS_END
-MACHINE_CONFIG_START(noki3310_state::noki3310)
-
+void noki3310_state::noki3310(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", ARM7_BE, 26000000 / 2) // MAD2WD1 13 MHz, clock internally supplied to ARM core can be divided by 2, in sleep mode a 32768 Hz clock is used
- MCFG_DEVICE_PROGRAM_MAP(noki3310_map)
+ ARM7_BE(config, m_maincpu, 26000000 / 2); // MAD2WD1 13 MHz, clock internally supplied to ARM core can be divided by 2, in sleep mode a 32768 Hz clock is used
+ m_maincpu->set_addrmap(AS_PROGRAM, &noki3310_state::noki3310_map);
/* video hardware */
- MCFG_SCREEN_ADD_MONOCHROME("screen", LCD, rgb_t::white())
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */)
- MCFG_SCREEN_SIZE(84, 48)
- MCFG_SCREEN_VISIBLE_AREA(0, 84-1, 0, 48-1)
- MCFG_SCREEN_UPDATE_DEVICE("pcd8544", pcd8544_device, screen_update)
- MCFG_SCREEN_PALETTE("palette")
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_LCD, rgb_t::white()));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500) /* not accurate */);
+ screen.set_size(84, 48);
+ screen.set_visarea(0, 84-1, 0, 48-1);
+ screen.set_screen_update("pcd8544", FUNC(pcd8544_device::screen_update));
+ screen.set_palette("palette");
PALETTE(config, "palette", palette_device::MONOCHROME_INVERTED);
- MCFG_PCD8544_ADD("pcd8544")
- MCFG_PCD8544_SCREEN_UPDATE_CALLBACK(noki3310_state, pcd8544_screen_update)
+ PCD8544(config, m_pcd8544, 0);
+ m_pcd8544->set_screen_update_cb(FUNC(noki3310_state::pcd8544_screen_update), this);
INTEL_TE28F160(config, "flash");
+}
-MACHINE_CONFIG_END
-
-MACHINE_CONFIG_START(noki3310_state::noki3330)
+void noki3310_state::noki3330(machine_config &config)
+{
noki3310(config);
INTEL_TE28F320(config.replace(), "flash");
+}
-MACHINE_CONFIG_END
-
-MACHINE_CONFIG_START(noki3310_state::noki3410)
+void noki3310_state::noki3410(machine_config &config)
+{
noki3330(config);
- MCFG_SCREEN_MODIFY("screen")
- MCFG_SCREEN_SIZE(96, 65) // Philips OM6206
-
-MACHINE_CONFIG_END
+ subdevice<screen_device>("screen")->set_size(96, 65); // Philips OM6206
+}
-MACHINE_CONFIG_START(noki3310_state::noki7110)
+void noki3310_state::noki7110(machine_config &config)
+{
noki3330(config);
- MCFG_SCREEN_MODIFY("screen")
- MCFG_SCREEN_SIZE(96, 65) // Epson SED1565
-
-MACHINE_CONFIG_END
+ subdevice<screen_device>("screen")->set_size(96, 65); // Epson SED1565
+}
-MACHINE_CONFIG_START(noki3310_state::noki6210)
+void noki3310_state::noki6210(machine_config &config)
+{
noki3330(config);
- MCFG_SCREEN_MODIFY("screen")
- MCFG_SCREEN_SIZE(96, 60)
-
-MACHINE_CONFIG_END
+ subdevice<screen_device>("screen")->set_size(96, 60);
+}
// MAD2 internal ROMS
diff --git a/src/mame/drivers/notechan.cpp b/src/mame/drivers/notechan.cpp
index cc6f1cd901d..e70841aa0d0 100644
--- a/src/mame/drivers/notechan.cpp
+++ b/src/mame/drivers/notechan.cpp
@@ -505,21 +505,21 @@ INPUT_PORTS_END
* Machine Config *
*********************************************/
-MACHINE_CONFIG_START(notechan_state::notechan)
+void notechan_state::notechan(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, CPU_CLOCK) // unknown...
- MCFG_DEVICE_PROGRAM_MAP(notechan_map)
- MCFG_DEVICE_IO_MAP(notechan_port_map)
- MCFG_DEVICE_PERIODIC_INT_DRIVER(driver_device, irq0_line_hold, 60)
+ Z80(config, m_maincpu, CPU_CLOCK); // unknown...
+ m_maincpu->set_addrmap(AS_PROGRAM, &notechan_state::notechan_map);
+ m_maincpu->set_addrmap(AS_IO, &notechan_state::notechan_port_map);
+ m_maincpu->set_periodic_int(FUNC(driver_device::irq0_line_hold), attotime::from_hz(60));
/* NO VIDEO */
/* sound hardware */
SPEAKER(config, "speaker").front_center();
- MCFG_DEVICE_ADD("oki", OKIM6295, SND_CLOCK, okim6295_device::PIN7_HIGH) // match the real sounds
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 1.0)
-MACHINE_CONFIG_END
+ OKIM6295(config, m_oki, SND_CLOCK, okim6295_device::PIN7_HIGH).add_route(ALL_OUTPUTS, "speaker", 1.0); // match the real sounds
+}
/*********************************************
diff --git a/src/mame/drivers/notetaker.cpp b/src/mame/drivers/notetaker.cpp
index 65a1d53ab0b..e1936339928 100644
--- a/src/mame/drivers/notetaker.cpp
+++ b/src/mame/drivers/notetaker.cpp
@@ -104,6 +104,7 @@ DONE:
#include "cpu/i86/i86.h"
#include "imagedev/floppy.h"
#include "machine/ay31015.h"
+#include "machine/clock.h"
#include "machine/pic8259.h"
#include "machine/wd_fdc.h"
#include "sound/dac.h"
@@ -798,7 +799,8 @@ void notetaker_state::ep_reset()
static INPUT_PORTS_START( notetakr )
INPUT_PORTS_END
-MACHINE_CONFIG_START(notetaker_state::notetakr)
+void notetaker_state::notetakr(machine_config &config)
+{
/* basic machine hardware */
/* IO CPU: 8086@8MHz */
I8086(config, m_iop_cpu, 24_MHz_XTAL / 3); /* iD8086-2 @ E4A; 24Mhz crystal divided down to 8Mhz by i8284 clock generator */
@@ -820,13 +822,13 @@ MACHINE_CONFIG_START(notetaker_state::notetakr)
m_ep_pic->out_int_callback().set_inputline(m_ep_cpu, 0);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60.975)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(250))
- MCFG_SCREEN_UPDATE_DRIVER(notetaker_state, screen_update)
- MCFG_SCREEN_SIZE(640, 480)
- MCFG_SCREEN_VISIBLE_AREA(0, 640-1, 0, 480-1)
- MCFG_SCREEN_PALETTE("palette")
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60.975);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(250));
+ screen.set_screen_update(FUNC(notetaker_state::screen_update));
+ screen.set_size(640, 480);
+ screen.set_visarea(0, 640-1, 0, 480-1);
+ screen.set_palette("palette");
PALETTE(config, "palette", palette_device::MONOCHROME);
@@ -847,27 +849,32 @@ MACHINE_CONFIG_START(notetaker_state::notetakr)
m_crtc->set_screen("screen");
AY31015(config, m_kbduart); // HD6402, == AY-3-1015D
- m_kbduart->set_rx_clock(960_kHz_XTAL); // hard-wired to 960KHz xtal #f11 (60000 baud, 16 clocks per baud)
- m_kbduart->set_tx_clock(960_kHz_XTAL); // hard-wired to 960KHz xtal #f11 (60000 baud, 16 clocks per baud)
m_kbduart->write_dav_callback().set(m_iop_pic, FUNC(pic8259_device::ir6_w)); // DataRecvd = KbdInt
+ clock_device &kbdclock(CLOCK(config, "kbdclock", 960_kHz_XTAL)); // hard-wired to 960KHz xtal #f11 (60000 baud, 16 clocks per baud)
+ kbdclock.signal_handler().set(m_kbduart, FUNC(ay31015_device::write_rcp));
+ kbdclock.signal_handler().append(m_kbduart, FUNC(ay31015_device::write_tcp));
+
AY31015(config, m_eiauart); // HD6402, == AY-3-1015D
- m_eiauart->set_rx_clock(((960_kHz_XTAL/10)/4)/5); // hard-wired through an mc14568b divider set to divide by 4, the result set to divide by 5; this resulting 4800hz signal being 300 baud (16 clocks per baud)
- m_eiauart->set_tx_clock(((960_kHz_XTAL/10)/4)/5); // hard-wired through an mc14568b divider set to divide by 4, the result set to divide by 5; this resulting 4800hz signal being 300 baud (16 clocks per baud)
m_eiauart->write_dav_callback().set(m_iop_pic, FUNC(pic8259_device::ir3_w)); // EIADataReady = EIAInt
+ clock_device &eiaclock(CLOCK(config, "eiaclock", ((960_kHz_XTAL/10)/4)/5)); // hard-wired through an mc14568b divider set to divide by 4, the result set to divide by 5; this resulting 4800hz signal being 300 baud (16 clocks per baud)
+ eiaclock.signal_handler().set(m_eiauart, FUNC(ay31015_device::write_rcp));
+ eiaclock.signal_handler().append(m_eiauart, FUNC(ay31015_device::write_tcp));
+
/* Floppy */
FD1791(config, m_fdc, (((24_MHz_XTAL/3)/2)/2)); // 2mhz, from 24mhz ip clock divided by 6 via 8284, an additional 2 by LS161 at #e1 on display/floppy board
- MCFG_FLOPPY_DRIVE_ADD("wd1791:0", notetaker_floppies, "525dd", floppy_image_device::default_floppy_formats)
+ FLOPPY_CONNECTOR(config, "wd1791:0", notetaker_floppies, "525dd", floppy_image_device::default_floppy_formats);
/* sound hardware */
SPEAKER(config, "lspeaker").front_left();
SPEAKER(config, "rspeaker").front_right();
// TODO: hook DAC up to two HA2425 (sample and hold) chips and hook those up to the speakers
- MCFG_DEVICE_ADD("dac", DAC1200, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 0.5) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 0.5) // unknown DAC
- MCFG_DEVICE_ADD("vref", VOLTAGE_REGULATOR, 0) MCFG_VOLTAGE_REGULATOR_OUTPUT(5.0)
- MCFG_SOUND_ROUTE(0, "dac", 1.0, DAC_VREF_POS_INPUT) MCFG_SOUND_ROUTE(0, "dac", -1.0, DAC_VREF_NEG_INPUT)
-MACHINE_CONFIG_END
+ DAC1200(config, m_dac, 0).add_route(ALL_OUTPUTS, "lspeaker", 0.5).add_route(ALL_OUTPUTS, "rspeaker", 0.5); // unknown DAC
+ voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref"));
+ vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT);
+ vref.add_route(0, "dac", -1.0, DAC_VREF_NEG_INPUT);
+}
void notetaker_state::init_notetakr()
{
diff --git a/src/mame/drivers/nova2001.cpp b/src/mame/drivers/nova2001.cpp
index 70cd70d8a2a..e19726fc8c1 100644
--- a/src/mame/drivers/nova2001.cpp
+++ b/src/mame/drivers/nova2001.cpp
@@ -124,7 +124,6 @@ e000 - e7ff R/W Work RAM
#include "emu.h"
#include "includes/nova2001.h"
-#include "cpu/z80/z80.h"
#include "machine/watchdog.h"
#include "sound/ay8910.h"
#include "screen.h"
@@ -183,7 +182,7 @@ MACHINE_START_MEMBER(nova2001_state,ninjakun)
void nova2001_state::nova2001_map(address_map &map)
{
map(0x0000, 0x7fff).rom();
- map(0xa000, 0xa7ff).ram().w(FUNC(nova2001_state::nova2001_fg_videoram_w)).share("fg_videoram");
+ map(0xa000, 0xa7ff).ram().w(FUNC(nova2001_state::fg_videoram_w)).share("fg_videoram");
map(0xa800, 0xafff).ram().w(FUNC(nova2001_state::nova2001_bg_videoram_w)).share("bg_videoram");
map(0xb000, 0xb7ff).ram().share("spriteram");
map(0xb800, 0xbfff).w(FUNC(nova2001_state::nova2001_flipscreen_w));
@@ -199,42 +198,38 @@ void nova2001_state::nova2001_map(address_map &map)
}
-void nova2001_state::ninjakun_cpu1_map(address_map &map)
+void nova2001_state::ninjakun_shared_map(address_map &map)
{
- map(0x0000, 0x1fff).rom();
- map(0x2000, 0x7fff).rom();
+ map(0x2000, 0x7fff).rom().region("maincpu", 0x2000);
map(0x8000, 0x8001).w("ay1", FUNC(ay8910_device::address_data_w));
map(0x8001, 0x8001).r("ay1", FUNC(ay8910_device::data_r));
map(0x8002, 0x8003).w("ay2", FUNC(ay8910_device::address_data_w));
map(0x8003, 0x8003).r("ay2", FUNC(ay8910_device::data_r));
map(0xa000, 0xa000).portr("IN0");
map(0xa001, 0xa001).portr("IN1");
- map(0xa002, 0xa002).portr("IN2").w(FUNC(nova2001_state::ninjakun_cpu1_io_A002_w));
- map(0xa003, 0xa003).w(FUNC(nova2001_state::pkunwar_flipscreen_w));
- map(0xc000, 0xc7ff).ram().w(FUNC(nova2001_state::nova2001_fg_videoram_w)).share("fg_videoram");
+ map(0xa002, 0xa002).portr("IN2");
+ map(0xc000, 0xc7ff).ram().w(FUNC(nova2001_state::fg_videoram_w)).share("fg_videoram");
map(0xc800, 0xcfff).rw(FUNC(nova2001_state::ninjakun_bg_videoram_r), FUNC(nova2001_state::ninjakun_bg_videoram_w)).share("bg_videoram");
map(0xd000, 0xd7ff).ram().share("spriteram");
- map(0xd800, 0xd9ff).ram().w(FUNC(nova2001_state::ninjakun_paletteram_w)).share("palette");
+ map(0xd800, 0xd9ff).ram().w(FUNC(nova2001_state::paletteram_w)).share("palette");
+}
+
+void nova2001_state::ninjakun_cpu1_map(address_map &map)
+{
+ ninjakun_shared_map(map);
+ map(0x0000, 0x1fff).rom().region("maincpu", 0);
+ map(0xa002, 0xa002).w(FUNC(nova2001_state::ninjakun_cpu1_io_A002_w));
+ map(0xa003, 0xa003).w(FUNC(nova2001_state::pkunwar_flipscreen_w));
map(0xe000, 0xe3ff).ram().share("share1");
map(0xe400, 0xe7ff).ram().share("share2");
}
void nova2001_state::ninjakun_cpu2_map(address_map &map)
{
- map(0x0000, 0x1fff).rom();
- map(0x2000, 0x7fff).rom().region("maincpu", 0x2000);
- map(0x8000, 0x8001).w("ay1", FUNC(ay8910_device::address_data_w));
- map(0x8001, 0x8001).r("ay1", FUNC(ay8910_device::data_r));
- map(0x8002, 0x8003).w("ay2", FUNC(ay8910_device::address_data_w));
- map(0x8003, 0x8003).r("ay2", FUNC(ay8910_device::data_r));
- map(0xa000, 0xa000).portr("IN0");
- map(0xa001, 0xa001).portr("IN1");
- map(0xa002, 0xa002).portr("IN2").w(FUNC(nova2001_state::ninjakun_cpu2_io_A002_w));
+ ninjakun_shared_map(map);
+ map(0x0000, 0x1fff).rom().region("sub", 0);
+ map(0xa002, 0xa002).w(FUNC(nova2001_state::ninjakun_cpu2_io_A002_w));
map(0xa003, 0xa003).w(FUNC(nova2001_state::nova2001_flipscreen_w));
- map(0xc000, 0xc7ff).ram().w(FUNC(nova2001_state::nova2001_fg_videoram_w)).share("fg_videoram");
- map(0xc800, 0xcfff).rw(FUNC(nova2001_state::ninjakun_bg_videoram_r), FUNC(nova2001_state::ninjakun_bg_videoram_w)).share("bg_videoram");
- map(0xd000, 0xd7ff).ram().share("spriteram");
- map(0xd800, 0xd9ff).ram().w(FUNC(nova2001_state::ninjakun_paletteram_w)).share("palette");
map(0xe000, 0xe3ff).ram().share("share2"); /* swapped wrt CPU1 */
map(0xe400, 0xe7ff).ram().share("share1"); /* swapped wrt CPU1 */
}
@@ -264,16 +259,16 @@ void nova2001_state::raiders5_cpu1_map(address_map &map)
{
map(0x0000, 0x7fff).rom();
map(0x8000, 0x87ff).ram().share("spriteram");
- map(0x8800, 0x8fff).ram().w(FUNC(nova2001_state::nova2001_fg_videoram_w)).share("fg_videoram");
+ map(0x8800, 0x8fff).ram().w(FUNC(nova2001_state::fg_videoram_w)).share("fg_videoram");
map(0x9000, 0x97ff).rw(FUNC(nova2001_state::ninjakun_bg_videoram_r), FUNC(nova2001_state::ninjakun_bg_videoram_w)).share("bg_videoram");
- map(0xa000, 0xa000).w(FUNC(nova2001_state::nova2001_scroll_x_w));
- map(0xa001, 0xa001).w(FUNC(nova2001_state::nova2001_scroll_y_w));
+ map(0xa000, 0xa000).w(FUNC(nova2001_state::scroll_x_w));
+ map(0xa001, 0xa001).w(FUNC(nova2001_state::scroll_y_w));
map(0xa002, 0xa002).w(FUNC(nova2001_state::pkunwar_flipscreen_w));
map(0xc000, 0xc001).w("ay1", FUNC(ay8910_device::address_data_w));
map(0xc001, 0xc001).r("ay1", FUNC(ay8910_device::data_r));
map(0xc002, 0xc003).w("ay2", FUNC(ay8910_device::address_data_w));
map(0xc003, 0xc003).r("ay2", FUNC(ay8910_device::data_r));
- map(0xd000, 0xd1ff).ram().w(FUNC(nova2001_state::ninjakun_paletteram_w)).share("palette");
+ map(0xd000, 0xd1ff).ram().w(FUNC(nova2001_state::paletteram_w)).share("palette");
map(0xe000, 0xe7ff).ram().share("share1");
}
@@ -289,8 +284,8 @@ void nova2001_state::raiders5_cpu2_map(address_map &map)
map(0xc000, 0xc000).nopr(); /* unknown */
map(0xc800, 0xc800).nopr(); /* unknown */
map(0xd000, 0xd000).nopr(); /* unknown */
- map(0xe000, 0xe000).w(FUNC(nova2001_state::nova2001_scroll_x_w));
- map(0xe001, 0xe001).w(FUNC(nova2001_state::nova2001_scroll_y_w));
+ map(0xe000, 0xe000).w(FUNC(nova2001_state::scroll_x_w));
+ map(0xe001, 0xe001).w(FUNC(nova2001_state::scroll_y_w));
map(0xe002, 0xe002).w(FUNC(nova2001_state::pkunwar_flipscreen_w));
}
@@ -646,22 +641,22 @@ GFXDECODE_END
*
*************************************/
-MACHINE_CONFIG_START(nova2001_state::nova2001)
-
+void nova2001_state::nova2001(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, MAIN_CLOCK/4) // 3 MHz verified on schematics
- MCFG_DEVICE_PROGRAM_MAP(nova2001_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", nova2001_state, irq0_line_hold)
+ Z80(config, m_maincpu, MAIN_CLOCK/4); // 3 MHz verified on schematics
+ m_maincpu->set_addrmap(AS_PROGRAM, &nova2001_state::nova2001_map);
+ m_maincpu->set_vblank_int("screen", FUNC(nova2001_state::irq0_line_hold));
WATCHDOG_TIMER(config, "watchdog");
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_SIZE(32*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 4*8, 28*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(nova2001_state, screen_update_nova2001)
- MCFG_SCREEN_PALETTE(m_palette)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_size(32*8, 32*8);
+ screen.set_visarea(0*8, 32*8-1, 4*8, 28*8-1);
+ screen.set_screen_update(FUNC(nova2001_state::screen_update_nova2001));
+ screen.set_palette(m_palette);
GFXDECODE(config, m_gfxdecode, m_palette, gfx_nova2001);
PALETTE(config, m_palette, FUNC(nova2001_state::nova2001_palette)).set_format(1, &nova2001_state::BBGGRRII, 512);
@@ -672,39 +667,38 @@ MACHINE_CONFIG_START(nova2001_state::nova2001)
SPEAKER(config, "mono").front_center();
ay8910_device &ay1(AY8910(config, "ay1", MAIN_CLOCK/6)); // 2 MHz verified on schematics
- ay1.port_a_write_callback().set(FUNC(nova2001_state::nova2001_scroll_x_w));
- ay1.port_b_write_callback().set(FUNC(nova2001_state::nova2001_scroll_y_w));
+ ay1.port_a_write_callback().set(FUNC(nova2001_state::scroll_x_w));
+ ay1.port_b_write_callback().set(FUNC(nova2001_state::scroll_y_w));
ay1.add_route(ALL_OUTPUTS, "mono", 0.25);
ay8910_device &ay2(AY8910(config, "ay2", MAIN_CLOCK/6));
ay2.port_a_read_callback().set_ioport("DSW1");
ay2.port_b_read_callback().set_ioport("DSW2");
ay2.add_route(ALL_OUTPUTS, "mono", 0.25);
-MACHINE_CONFIG_END
-
-MACHINE_CONFIG_START(nova2001_state::ninjakun)
+}
+void nova2001_state::ninjakun(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, MAIN_CLOCK/4) // 3 MHz
- MCFG_DEVICE_PROGRAM_MAP(ninjakun_cpu1_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", nova2001_state, irq0_line_hold)
+ Z80(config, m_maincpu, MAIN_CLOCK/4); // 3 MHz
+ m_maincpu->set_addrmap(AS_PROGRAM, &nova2001_state::ninjakun_cpu1_map);
+ m_maincpu->set_vblank_int("screen", FUNC(nova2001_state::irq0_line_hold));
- MCFG_DEVICE_ADD("sub", Z80, MAIN_CLOCK/4) // 3 MHz
- MCFG_DEVICE_PROGRAM_MAP(ninjakun_cpu2_map)
- MCFG_DEVICE_PERIODIC_INT_DRIVER(nova2001_state, irq0_line_hold, 4*60) /* ? */
+ z80_device &subcpu(Z80(config, "sub", MAIN_CLOCK/4)); // 3 MHz
+ subcpu.set_addrmap(AS_PROGRAM, &nova2001_state::ninjakun_cpu2_map);
+ subcpu.set_periodic_int(FUNC(nova2001_state::irq0_line_hold), attotime::from_hz(4*60)); /* ? */
- MCFG_QUANTUM_TIME(attotime::from_hz(6000)) /* 100 CPU slices per frame */
+ config.m_minimum_quantum = attotime::from_hz(6000); /* 100 CPU slices per frame */
MCFG_MACHINE_START_OVERRIDE(nova2001_state,ninjakun)
/* video hardware */
-
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_SIZE(32*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 4*8, 28*8-1 )
- MCFG_SCREEN_UPDATE_DRIVER(nova2001_state, screen_update_ninjakun)
- MCFG_SCREEN_PALETTE(m_palette)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_size(32*8, 32*8);
+ screen.set_visarea(0*8, 32*8-1, 4*8, 28*8-1);
+ screen.set_screen_update(FUNC(nova2001_state::screen_update_ninjakun));
+ screen.set_palette(m_palette);
GFXDECODE(config, m_gfxdecode, m_palette, gfx_ninjakun);
PALETTE(config, m_palette).set_format(1, &nova2001_state::BBGGRRII, 768);
@@ -720,26 +714,26 @@ MACHINE_CONFIG_START(nova2001_state::ninjakun)
ay1.add_route(ALL_OUTPUTS, "mono", 0.20);
ay8910_device &ay2(AY8910(config, "ay2", MAIN_CLOCK/4)); // 3 MHz
- ay2.port_a_write_callback().set(FUNC(nova2001_state::nova2001_scroll_x_w));
- ay2.port_b_write_callback().set(FUNC(nova2001_state::nova2001_scroll_y_w));
+ ay2.port_a_write_callback().set(FUNC(nova2001_state::scroll_x_w));
+ ay2.port_b_write_callback().set(FUNC(nova2001_state::scroll_y_w));
ay2.add_route(ALL_OUTPUTS, "mono", 0.20);
-MACHINE_CONFIG_END
-
-MACHINE_CONFIG_START(nova2001_state::pkunwar)
+}
+void nova2001_state::pkunwar(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, MAIN_CLOCK/4) // 3 MHz
- MCFG_DEVICE_PROGRAM_MAP(pkunwar_map)
- MCFG_DEVICE_IO_MAP(pkunwar_io)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", nova2001_state, irq0_line_hold)
+ Z80(config, m_maincpu, MAIN_CLOCK/4); // 3 MHz
+ m_maincpu->set_addrmap(AS_PROGRAM, &nova2001_state::pkunwar_map);
+ m_maincpu->set_addrmap(AS_IO, &nova2001_state::pkunwar_io);
+ m_maincpu->set_vblank_int("screen", FUNC(nova2001_state::irq0_line_hold));
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_SIZE(32*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 4*8, 28*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(nova2001_state, screen_update_pkunwar)
- MCFG_SCREEN_PALETTE(m_palette)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_size(32*8, 32*8);
+ screen.set_visarea(0*8, 32*8-1, 4*8, 28*8-1);
+ screen.set_screen_update(FUNC(nova2001_state::screen_update_pkunwar));
+ screen.set_palette(m_palette);
GFXDECODE(config, m_gfxdecode, m_palette, gfx_pkunwar);
PALETTE(config, m_palette, FUNC(nova2001_state::nova2001_palette)).set_format(1, &nova2001_state::BBGGRRII, 512);
@@ -758,29 +752,29 @@ MACHINE_CONFIG_START(nova2001_state::pkunwar)
ay2.port_a_read_callback().set_ioport("IN2");
ay2.port_b_read_callback().set_ioport("DSW1");
ay2.add_route(ALL_OUTPUTS, "mono", 0.25);
-MACHINE_CONFIG_END
-
-MACHINE_CONFIG_START(nova2001_state::raiders5)
+}
+void nova2001_state::raiders5(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, MAIN_CLOCK/4) // 3 MHz
- MCFG_DEVICE_PROGRAM_MAP(raiders5_cpu1_map)
- MCFG_DEVICE_IO_MAP(raiders5_io)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", nova2001_state, irq0_line_hold)
+ Z80(config, m_maincpu, MAIN_CLOCK/4); // 3 MHz
+ m_maincpu->set_addrmap(AS_PROGRAM, &nova2001_state::raiders5_cpu1_map);
+ m_maincpu->set_addrmap(AS_IO, &nova2001_state::raiders5_io);
+ m_maincpu->set_vblank_int("screen", FUNC(nova2001_state::irq0_line_hold));
- MCFG_DEVICE_ADD("sub", Z80, MAIN_CLOCK/4) // 3 MHz
- MCFG_DEVICE_PROGRAM_MAP(raiders5_cpu2_map)
- MCFG_DEVICE_PERIODIC_INT_DRIVER(nova2001_state, irq0_line_hold, 4*60) /* ? */
+ z80_device &subcpu(Z80(config, "sub", MAIN_CLOCK/4)); // 3 MHz
+ subcpu.set_addrmap(AS_PROGRAM, &nova2001_state::raiders5_cpu2_map);
+ subcpu.set_periodic_int(FUNC(nova2001_state::irq0_line_hold), attotime::from_hz(4*60)); /* ? */
- MCFG_QUANTUM_TIME(attotime::from_hz(24000))
+ config.m_minimum_quantum = attotime::from_hz(24000);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_SIZE(32*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 4*8, 28*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(nova2001_state, screen_update_raiders5)
- MCFG_SCREEN_PALETTE(m_palette)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_size(32*8, 32*8);
+ screen.set_visarea(0*8, 32*8-1, 4*8, 28*8-1);
+ screen.set_screen_update(FUNC(nova2001_state::screen_update_raiders5));
+ screen.set_palette(m_palette);
GFXDECODE(config, m_gfxdecode, m_palette, gfx_raiders5);
PALETTE(config, m_palette).set_format(1, &nova2001_state::BBGGRRII, 768);
@@ -799,7 +793,7 @@ MACHINE_CONFIG_START(nova2001_state::raiders5)
ay2.port_a_read_callback().set_ioport("IN2");
ay2.port_b_read_callback().set_ioport("DSW1");
ay2.add_route(ALL_OUTPUTS, "mono", 0.25);
-MACHINE_CONFIG_END
+}
@@ -866,13 +860,13 @@ ROM_START( nova2001u )
ROM_END
ROM_START( ninjakun ) /* Original Board? */
- ROM_REGION( 0x10000, "maincpu", 0 )
+ ROM_REGION( 0x8000, "maincpu", 0 )
ROM_LOAD( "ninja-1.7a", 0x0000, 0x02000, CRC(1c1dc141) SHA1(423d3ed35e73a8d5bfce075a889b0322b207bd0d) )
ROM_LOAD( "ninja-2.7b", 0x2000, 0x02000, CRC(39cc7d37) SHA1(7f0d0e1e92cb6a57f15eb7fc51a67112f1c5fc8e) )
ROM_LOAD( "ninja-3.7d", 0x4000, 0x02000, CRC(d542bfe3) SHA1(3814d8f5b1acda21438fff4f71670fa653dc7b30) )
ROM_LOAD( "ninja-4.7e", 0x6000, 0x02000, CRC(a57385c6) SHA1(77925a281e64889bfe967c3d42a388529aaf7eb6) )
- ROM_REGION( 0x10000, "sub", 0 )
+ ROM_REGION( 0x2000, "sub", 0 )
ROM_LOAD( "ninja-5.7h", 0x0000, 0x02000, CRC(164a42c4) SHA1(16b434b33b76b878514f67c23315d4c6da7bfc9e) )
ROM_REGION( 0x08000, "gfx1", 0 )
@@ -921,11 +915,11 @@ ROM_START( pkunwarj )
ROM_END
ROM_START( raiders5 )
- ROM_REGION( 0x10000, "maincpu", 0 )
+ ROM_REGION( 0x8000, "maincpu", 0 )
ROM_LOAD( "raiders5.1", 0x0000, 0x4000, CRC(47cea11f) SHA1(0499e6627ad9c16775fdc59f2ff56dfdfc23490a) )
ROM_LOAD( "raiders5.2", 0x4000, 0x4000, CRC(eb2ff410) SHA1(5c995b66b6301cd3cd58efd173481deaa036f842) )
- ROM_REGION( 0x10000, "sub", 0 )
+ ROM_REGION( 0x4000, "sub", 0 )
ROM_LOAD( "raiders5.2", 0x0000, 0x4000, CRC(eb2ff410) SHA1(5c995b66b6301cd3cd58efd173481deaa036f842) )
ROM_REGION( 0x8000, "gfx1", 0 ) // (need lineswapping)
@@ -937,11 +931,11 @@ ROM_START( raiders5 )
ROM_END
ROM_START( raiders5t )
- ROM_REGION( 0x10000, "maincpu", 0 )
+ ROM_REGION( 0x8000, "maincpu", 0 )
ROM_LOAD( "raiders1.4c", 0x0000, 0x4000, CRC(4e2d5679) SHA1(a1c1603ba98814a83b92ad024ca4422aea872111) )
ROM_LOAD( "raiders2.4d", 0x4000, 0x4000, CRC(c8604be1) SHA1(6d23f26174bb9b2f7db3a5fa6b39674fe237135b) )
- ROM_REGION( 0x10000, "sub", 0 )
+ ROM_REGION( 0x4000, "sub", 0 )
ROM_LOAD( "raiders2.4d", 0x0000, 0x4000, CRC(c8604be1) SHA1(6d23f26174bb9b2f7db3a5fa6b39674fe237135b) )
ROM_REGION( 0x8000, "gfx1", 0 ) // (need lineswapping)
@@ -973,7 +967,7 @@ To make it possible to decode graphics without resorting to ROM_CONTINUE
trickery, this function makes an address line rotation, bringing bit "bit" to
bit 0 and shifting left by one place all the intervening bits.
-This code is overly generic because it is used for several games in ninjakd2.c
+This code is overly generic because it is used for several games in ninjakd2.cpp
******************************************************************************/
@@ -981,9 +975,9 @@ void nova2001_state::lineswap_gfx_roms(const char *region, const int bit)
{
const int length = memregion(region)->bytes();
- uint8_t* const src = memregion(region)->base();
+ u8* const src = memregion(region)->base();
- std::vector<uint8_t> temp(length);
+ std::vector<u8> temp(length);
const int mask = (1 << (bit + 1)) - 1;
@@ -1028,7 +1022,7 @@ void nova2001_state::init_raiders5()
// many of these don't explicitly state Japan, eg. Nova 2001 could easily be used anywhere.
-// YEAR, NAME, PARENT, MACHINE, INPUT, STATE, INIT, MONITOR,COMPANY,FULLNAME,FLAGS
+// YEAR, NAME, PARENT, MACHINE, INPUT, STATE, INIT, MONITOR,COMPANY,FULLNAME,FLAGS
GAME( 1983, nova2001, 0, nova2001, nova2001, nova2001_state, empty_init, ROT0, "UPL", "Nova 2001 (Japan)", MACHINE_SUPPORTS_SAVE )
GAME( 1983, nova2001h, nova2001, nova2001, nova2001, nova2001_state, empty_init, ROT0, "UPL", "Nova 2001 (Japan, hack?)", MACHINE_SUPPORTS_SAVE )
GAME( 1983, nova2001u, nova2001, nova2001, nova2001, nova2001_state, empty_init, ROT0, "UPL (Universal license)", "Nova 2001 (US)", MACHINE_SUPPORTS_SAVE )
diff --git a/src/mame/drivers/novag6502.cpp b/src/mame/drivers/novag6502.cpp
deleted file mode 100644
index 0b01b43c99d..00000000000
--- a/src/mame/drivers/novag6502.cpp
+++ /dev/null
@@ -1,1078 +0,0 @@
-// license:BSD-3-Clause
-// copyright-holders:hap
-// thanks-to:Berger
-/******************************************************************************
-
- Novag generic 6502 based chess computer driver
-
- NOTE: MAME doesn't include a generalized implementation for boardpieces yet,
- greatly affecting user playability of emulated electronic board games.
- As workaround for the chess games, use an external chess GUI on the side,
- such as Arena(in editmode).
-
- TODO:
- - cforte ACIA?
- - verify supercon IRQ and beeper frequency
- - sforte irq active time (21.5us is too long)
- - sforte/sexpert led handling is correct?
- - printer port
-
-******************************************************************************
-
-Super Constellation Chess Computer (model 844):
-- UMC UM6502C @ 4 MHz (8MHz XTAL), 600Hz? IRQ(source unknown?)
-- 2*2KB RAM TC5516APL-2 battery-backed, 2*32KB ROM custom label
-- TTL, buzzer, 24 LEDs, 8*8 chessboard buttons
-- external ports for clock and printer, not emulated here
-
-
-******************************************************************************
-
-Constellation Forte:
-- R65C02P4 @ 5MHz (10MHz XTAL)
-- 2*2KB RAM(NEC D449C-3), 2*32KB ROM(27C256)
-- HLCD0538P, 10-digit 7seg LCD display
-- TTL, 18 LEDs, 8*8 chessboard buttons
-
-When it was first added to MAME as skeleton driver in mmodular.c, cforteb romset
-was assumed to be Super Forte B, but it definitely isn't. I/O is similar to supercon.
-
-
-******************************************************************************
-
-Super Expert (model 878/887/902):
-- 65C02 @ 5MHz or 6MHz (10MHz or 12MHz XTAL)
-- 8KB RAM battery-backed, 3*32KB ROM
-- HD44780 LCD controller (16x1)
-- beeper(32KHz/32), IRQ(32KHz/128) via MC14060
-- optional R65C51P2 ACIA @ 1.8432MHz, for IBM PC interface (only works in version C?)
-- printer port, magnetic sensors, 8*8 chessboard leds
-
-I/O via TTL, hardware design was very awkward.
-Super Forte is very similar, just a cheaper plastic case and chessboard buttons
-instead of magnet sensors.
-
-******************************************************************************/
-
-#include "emu.h"
-#include "includes/novagbase.h"
-
-#include "bus/rs232/rs232.h"
-#include "cpu/m6502/m6502.h"
-#include "cpu/m6502/m65c02.h"
-#include "cpu/m6502/r65c02.h"
-#include "machine/mos6551.h"
-#include "machine/nvram.h"
-#include "video/hlcd0538.h"
-#include "screen.h"
-#include "speaker.h"
-
-// internal artwork
-#include "novag_cforte.lh" // clickable
-#include "novag_sexpert.lh" // clickable
-#include "novag_sforte.lh" // clickable
-#include "novag_supercon.lh" // clickable
-
-
-class novag6502_state : public novagbase_state
-{
-public:
- novag6502_state(const machine_config &mconfig, device_type type, const char *tag) :
- novagbase_state(mconfig, type, tag),
- m_hlcd0538(*this, "hlcd0538"),
- m_rombank(*this, "rombank")
- { }
-
- void supercon(machine_config &config);
- void cforte(machine_config &config);
- void sforte_map(address_map &map);
- void sexpert(machine_config &config);
- void sforte(machine_config &config);
-
- void init_sexpert();
-
- DECLARE_INPUT_CHANGED_MEMBER(sexpert_cpu_freq);
-
-private:
- optional_device<hlcd0538_device> m_hlcd0538;
- optional_memory_bank m_rombank;
-
- TIMER_DEVICE_CALLBACK_MEMBER(irq_on) { m_maincpu->set_input_line(M6502_IRQ_LINE, ASSERT_LINE); }
- TIMER_DEVICE_CALLBACK_MEMBER(irq_off) { m_maincpu->set_input_line(M6502_IRQ_LINE, CLEAR_LINE); }
-
- // Super Constellation
- DECLARE_WRITE8_MEMBER(supercon_mux_w);
- DECLARE_WRITE8_MEMBER(supercon_control_w);
- DECLARE_READ8_MEMBER(supercon_input1_r);
- DECLARE_READ8_MEMBER(supercon_input2_r);
- void supercon_map(address_map &map);
-
- // Constellation Forte
- void cforte_prepare_display();
- DECLARE_WRITE64_MEMBER(cforte_lcd_output_w);
- DECLARE_WRITE8_MEMBER(cforte_mux_w);
- DECLARE_WRITE8_MEMBER(cforte_control_w);
- void cforte_map(address_map &map);
-
- // Super Expert
- DECLARE_WRITE8_MEMBER(sexpert_leds_w);
- DECLARE_WRITE8_MEMBER(sexpert_mux_w);
- DECLARE_WRITE8_MEMBER(sexpert_lcd_control_w);
- DECLARE_WRITE8_MEMBER(sexpert_lcd_data_w);
- DECLARE_READ8_MEMBER(sexpert_input1_r);
- DECLARE_READ8_MEMBER(sexpert_input2_r);
- DECLARE_MACHINE_RESET(sexpert);
- void sexpert_map(address_map &map);
- void sexpert_set_cpu_freq();
-
- // Super Forte
- DECLARE_WRITE8_MEMBER(sforte_lcd_control_w);
- DECLARE_WRITE8_MEMBER(sforte_lcd_data_w);
-};
-
-
-// machine start/reset
-
-void novagbase_state::machine_start()
-{
- // resolve handlers
- m_out_x.resolve();
- m_out_a.resolve();
- m_out_digit.resolve();
-
- // zerofill
- memset(m_display_state, 0, sizeof(m_display_state));
- memset(m_display_decay, 0, sizeof(m_display_decay));
- memset(m_display_segmask, 0, sizeof(m_display_segmask));
-
- m_inp_mux = 0;
- m_led_select = 0;
- m_led_data = 0;
- m_lcd_control = 0;
- m_lcd_data = 0;
-
- // register for savestates
- save_item(NAME(m_display_maxy));
- save_item(NAME(m_display_maxx));
- save_item(NAME(m_display_wait));
-
- save_item(NAME(m_display_state));
- save_item(NAME(m_display_decay));
- save_item(NAME(m_display_segmask));
-
- save_item(NAME(m_inp_mux));
- save_item(NAME(m_led_select));
- save_item(NAME(m_led_data));
- save_item(NAME(m_lcd_control));
- save_item(NAME(m_lcd_data));
-}
-
-void novagbase_state::machine_reset()
-{
-}
-
-
-
-/***************************************************************************
-
- Helper Functions
-
-***************************************************************************/
-
-// The device may strobe the outputs very fast, it is unnoticeable to the user.
-// To prevent flickering here, we need to simulate a decay.
-
-void novagbase_state::display_update()
-{
- for (int y = 0; y < m_display_maxy; y++)
- {
- u32 active_state = 0;
-
- for (int x = 0; x <= m_display_maxx; x++)
- {
- // turn on powered segments
- if (m_display_state[y] >> x & 1)
- m_display_decay[y][x] = m_display_wait;
-
- // determine active state
- u32 ds = (m_display_decay[y][x] != 0) ? 1 : 0;
- active_state |= (ds << x);
-
- // output to y.x, or y.a when always-on
- if (x != m_display_maxx)
- m_out_x[y][x] = ds;
- else
- m_out_a[y] = ds;
- }
-
- // output to digity
- if (m_display_segmask[y] != 0)
- m_out_digit[y] = active_state & m_display_segmask[y];
- }
-}
-
-TIMER_DEVICE_CALLBACK_MEMBER(novagbase_state::display_decay_tick)
-{
- // slowly turn off unpowered segments
- for (int y = 0; y < m_display_maxy; y++)
- for (int x = 0; x <= m_display_maxx; x++)
- if (m_display_decay[y][x] != 0)
- m_display_decay[y][x]--;
-
- display_update();
-}
-
-void novagbase_state::set_display_size(int maxx, int maxy)
-{
- m_display_maxx = maxx;
- m_display_maxy = maxy;
-}
-
-void novagbase_state::set_display_segmask(u32 digits, u32 mask)
-{
- // set a segment mask per selected digit, but leave unselected ones alone
- for (int i = 0; i < 0x20; i++)
- {
- if (digits & 1)
- m_display_segmask[i] = mask;
- digits >>= 1;
- }
-}
-
-void novagbase_state::display_matrix(int maxx, int maxy, u32 setx, u32 sety, bool update)
-{
- set_display_size(maxx, maxy);
-
- // update current state
- u32 mask = (1 << maxx) - 1;
- for (int y = 0; y < maxy; y++)
- m_display_state[y] = (sety >> y & 1) ? ((setx & mask) | (1 << maxx)) : 0;
-
- if (update)
- display_update();
-}
-
-
-// LCD
-
-void novagbase_state::novag_lcd_palette(palette_device &palette) const
-{
- palette.set_pen_color(0, rgb_t(138, 146, 148)); // background
- palette.set_pen_color(1, rgb_t(92, 83, 88)); // lcd pixel on
- palette.set_pen_color(2, rgb_t(131, 136, 139)); // lcd pixel off
-}
-
-HD44780_PIXEL_UPDATE(novagbase_state::novag_lcd_pixel_update)
-{
- // char size is 5x8
- if (x > 4 || y > 7)
- return;
-
- if (line < 2 && pos < 8)
- {
- // internal: (8+8)*1, external: 1*16
- bitmap.pix16(1 + y, 1 + line*8*6 + pos*6 + x) = state ? 1 : 2;
- }
-}
-
-
-// generic input handlers
-
-u16 novagbase_state::read_inputs(int columns)
-{
- u16 ret = 0;
-
- // read selected input rows
- for (int i = 0; i < columns; i++)
- if (m_inp_mux >> i & 1)
- ret |= m_inp_matrix[i]->read();
-
- return ret;
-}
-
-
-
-// Devices, I/O
-
-/******************************************************************************
- Super Constellation
-******************************************************************************/
-
-// TTL
-
-WRITE8_MEMBER(novag6502_state::supercon_mux_w)
-{
- // d0-d7: input mux, led data
- m_inp_mux = m_led_data = data;
- display_matrix(8, 3, m_led_data, m_led_select);
-}
-
-WRITE8_MEMBER(novag6502_state::supercon_control_w)
-{
- // d0-d3: ?
- // d4-d6: select led row
- m_led_select = data >> 4 & 7;
- display_matrix(8, 3, m_led_data, m_led_select);
-
- // d7: enable beeper
- m_beeper->set_state(data >> 7 & 1);
-}
-
-READ8_MEMBER(novag6502_state::supercon_input1_r)
-{
- // d0-d7: multiplexed inputs (chessboard squares)
- return ~read_inputs(8) & 0xff;
-}
-
-READ8_MEMBER(novag6502_state::supercon_input2_r)
-{
- // d0-d5: ?
- // d6,d7: multiplexed inputs (side panel)
- return (read_inputs(8) >> 2 & 0xc0) ^ 0xff;
-}
-
-
-
-/******************************************************************************
- Constellation Forte
-******************************************************************************/
-
-// TTL/generic
-
-void novag6502_state::cforte_prepare_display()
-{
- // 3 led rows
- display_matrix(8, 3, m_led_data, m_led_select, false);
-
- // lcd panel (mostly handled in cforte_lcd_output_w)
- set_display_segmask(0x3ff0, 0xff);
- set_display_size(8, 3+13);
- display_update();
-}
-
-WRITE64_MEMBER(novag6502_state::cforte_lcd_output_w)
-{
- // 4 rows used
- u32 rowdata[4];
- for (int i = 0; i < 4; i++)
- rowdata[i] = (data >> i & 1) ? u32(data >> 8) : 0;
-
- // 2 segments per row
- for (int dig = 0; dig < 13; dig++)
- {
- m_display_state[dig+3] = 0;
- for (int i = 0; i < 4; i++)
- m_display_state[dig+3] |= ((rowdata[i] >> (2*dig) & 3) << (2*i));
-
- m_display_state[dig+3] = bitswap<8>(m_display_state[dig+3],7,2,0,4,6,5,3,1);
- }
-
- cforte_prepare_display();
-}
-
-WRITE8_MEMBER(novag6502_state::cforte_mux_w)
-{
- // d0-d7: input mux, led data
- m_inp_mux = m_led_data = data;
- cforte_prepare_display();
-}
-
-WRITE8_MEMBER(novag6502_state::cforte_control_w)
-{
- // d0: HLCD0538 data in
- // d1: HLCD0538 clk
- // d2: HLCD0538 lcd
- m_hlcd0538->write_data(data & 1);
- m_hlcd0538->write_clk(data >> 1 & 1);
- m_hlcd0538->write_lcd(data >> 2 & 1);
-
- // d3: unused?
-
- // d4-d6: select led row
- m_led_select = data >> 4 & 7;
- cforte_prepare_display();
-
- // d7: enable beeper
- m_beeper->set_state(data >> 7 & 1);
-}
-
-
-
-/******************************************************************************
- Super Expert
-******************************************************************************/
-
-// TTL/generic
-
-WRITE8_MEMBER(novag6502_state::sexpert_lcd_control_w)
-{
- // d0: HD44780 RS
- // d1: HD44780 R/W
- // d2: HD44780 E
- if (m_lcd_control & ~data & 4 && ~data & 2)
- m_lcd->write(m_lcd_control & 1, m_lcd_data);
- m_lcd_control = data & 7;
-}
-
-WRITE8_MEMBER(novag6502_state::sexpert_lcd_data_w)
-{
- // d0-d7: HD44780 data
- m_lcd_data = data;
-}
-
-WRITE8_MEMBER(novag6502_state::sexpert_leds_w)
-{
- // d0-d7: chessboard leds
- m_led_data = data;
-}
-
-WRITE8_MEMBER(novag6502_state::sexpert_mux_w)
-{
- // d0: rom bankswitch
- m_rombank->set_entry(data & 1);
-
- // d3: enable beeper
- m_beeper->set_state(data >> 3 & 1);
-
- // d4-d7: 74145 to input mux/led select
- m_inp_mux = 1 << (data >> 4 & 0xf) & 0xff;
- display_matrix(8, 8, m_led_data, m_inp_mux);
- m_led_data = 0; // ?
-}
-
-READ8_MEMBER(novag6502_state::sexpert_input1_r)
-{
- // d0-d7: multiplexed inputs (chessboard squares)
- return ~read_inputs(8) & 0xff;
-}
-
-READ8_MEMBER(novag6502_state::sexpert_input2_r)
-{
- // d0-d2: printer port
- // d5-d7: multiplexed inputs (side panel)
- return ~read_inputs(8) >> 3 & 0xe0;
-}
-
-void novag6502_state::sexpert_set_cpu_freq()
-{
- // machines were released with either 5MHz or 6MHz CPU
- m_maincpu->set_unscaled_clock((ioport("FAKE")->read() & 1) ? (12_MHz_XTAL/2) : (10_MHz_XTAL/2));
-}
-
-MACHINE_RESET_MEMBER(novag6502_state, sexpert)
-{
- novagbase_state::machine_reset();
-
- sexpert_set_cpu_freq();
- m_rombank->set_entry(0);
-}
-
-void novag6502_state::init_sexpert()
-{
- m_rombank->configure_entries(0, 2, memregion("maincpu")->base() + 0x8000, 0x8000);
-}
-
-
-
-/******************************************************************************
- Super Forte
-******************************************************************************/
-
-WRITE8_MEMBER(novag6502_state::sforte_lcd_control_w)
-{
- // d3: rom bankswitch
- m_rombank->set_entry(data >> 3 & 1);
-
- // assume same as sexpert
- sexpert_lcd_control_w(space, 0, data);
-}
-
-WRITE8_MEMBER(novag6502_state::sforte_lcd_data_w)
-{
- // d0-d2: input mux/led select
- m_inp_mux = 1 << (data & 7);
-
- // if lcd is disabled, misc control
- if (~m_lcd_control & 4)
- {
- // d5,d6: led data, but not both at same time?
- if ((data & 0x60) != 0x60)
- display_matrix(2, 8, data >> 5 & 3, m_inp_mux);
-
- // d7: enable beeper
- m_beeper->set_state(data >> 7 & 1);
- }
-
- // assume same as sexpert
- sexpert_lcd_data_w(space, 0, data);
-}
-
-
-
-/******************************************************************************
- Address Maps
-******************************************************************************/
-
-// Super Constellation / Constellation Forte
-
-void novag6502_state::supercon_map(address_map &map)
-{
- map(0x0000, 0x0fff).ram().share("nvram");
- map(0x1c00, 0x1c00).nopw(); // printer/clock?
- map(0x1d00, 0x1d00).nopw(); // printer/clock?
- map(0x1e00, 0x1e00).rw(FUNC(novag6502_state::supercon_input2_r), FUNC(novag6502_state::supercon_mux_w));
- map(0x1f00, 0x1f00).rw(FUNC(novag6502_state::supercon_input1_r), FUNC(novag6502_state::supercon_control_w));
- map(0x2000, 0xffff).rom();
-}
-
-void novag6502_state::cforte_map(address_map &map)
-{
- supercon_map(map);
- map(0x1e00, 0x1e00).rw(FUNC(novag6502_state::supercon_input2_r), FUNC(novag6502_state::cforte_mux_w));
- map(0x1f00, 0x1f00).rw(FUNC(novag6502_state::supercon_input1_r), FUNC(novag6502_state::cforte_control_w));
-}
-
-
-// Super Expert / Super Forte
-
-void novag6502_state::sforte_map(address_map &map)
-{
- map(0x0000, 0x1fef).ram().share("nvram"); // 8KB RAM, but RAM CE pin is deactivated on $1ff0-$1fff
- map(0x1ff0, 0x1ff0).r(FUNC(novag6502_state::sexpert_input1_r));
- map(0x1ff1, 0x1ff1).r(FUNC(novag6502_state::sexpert_input2_r));
- map(0x1ff2, 0x1ff2).nopw(); // printer
- map(0x1ff3, 0x1ff3).nopw(); // printer
- map(0x1ff6, 0x1ff6).w(FUNC(novag6502_state::sforte_lcd_control_w));
- map(0x1ff7, 0x1ff7).w(FUNC(novag6502_state::sforte_lcd_data_w));
- map(0x1ffc, 0x1fff).rw("acia", FUNC(mos6551_device::read), FUNC(mos6551_device::write));
- map(0x2000, 0x7fff).rom();
- map(0x8000, 0xffff).bankr("rombank");
-}
-
-void novag6502_state::sexpert_map(address_map &map)
-{
- sforte_map(map);
- map(0x1ff4, 0x1ff4).w(FUNC(novag6502_state::sexpert_leds_w));
- map(0x1ff5, 0x1ff5).w(FUNC(novag6502_state::sexpert_mux_w));
- map(0x1ff6, 0x1ff6).w(FUNC(novag6502_state::sexpert_lcd_control_w));
- map(0x1ff7, 0x1ff7).w(FUNC(novag6502_state::sexpert_lcd_data_w));
-}
-
-
-
-/******************************************************************************
- Input Ports
-******************************************************************************/
-
-INPUT_PORTS_START( novag_cb_buttons )
- PORT_START("IN.0")
- PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
- PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
- PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
- PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
- PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
- PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
- PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
- PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
-
- PORT_START("IN.1")
- PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
- PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
- PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
- PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
- PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
- PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
- PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
- PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
-
- PORT_START("IN.2")
- PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
- PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
- PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
- PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
- PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
- PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
- PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
- PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
-
- PORT_START("IN.3")
- PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
- PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
- PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
- PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
- PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
- PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
- PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
- PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
-
- PORT_START("IN.4")
- PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
- PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
- PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
- PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
- PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
- PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
- PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
- PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
-
- PORT_START("IN.5")
- PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
- PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
- PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
- PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
- PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
- PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
- PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
- PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
-
- PORT_START("IN.6")
- PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
- PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
- PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
- PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
- PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
- PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
- PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
- PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
-
- PORT_START("IN.7")
- PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
- PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
- PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
- PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
- PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
- PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
- PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
- PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
-INPUT_PORTS_END
-
-INPUT_PORTS_START( novag_cb_magnets )
- PORT_START("IN.0")
- PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
- PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
- PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
- PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
- PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
- PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
- PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
- PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
-
- PORT_START("IN.1")
- PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
- PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
- PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
- PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
- PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
- PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
- PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
- PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
-
- PORT_START("IN.2")
- PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
- PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
- PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
- PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
- PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
- PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
- PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
- PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
-
- PORT_START("IN.3")
- PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
- PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
- PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
- PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
- PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
- PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
- PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
- PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
-
- PORT_START("IN.4")
- PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
- PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
- PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
- PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
- PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
- PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
- PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
- PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
-
- PORT_START("IN.5")
- PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
- PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
- PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
- PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
- PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
- PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
- PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
- PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
-
- PORT_START("IN.6")
- PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
- PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
- PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
- PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
- PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
- PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
- PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
- PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
-
- PORT_START("IN.7")
- PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
- PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
- PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
- PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
- PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
- PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
- PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
- PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
-INPUT_PORTS_END
-
-
-static INPUT_PORTS_START( supercon )
- PORT_INCLUDE( novag_cb_buttons )
-
- PORT_MODIFY("IN.0")
- PORT_BIT(0x100, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_I) PORT_NAME("New Game")
- PORT_BIT(0x200, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_8) PORT_NAME("Multi Move / Player/Player / King")
-
- PORT_MODIFY("IN.1")
- PORT_BIT(0x100, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_U) PORT_NAME("Verify / Set Up")
- PORT_BIT(0x200, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_7) PORT_NAME("Best Move/Random / Training Level / Queen")
-
- PORT_MODIFY("IN.2")
- PORT_BIT(0x100, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_Y) PORT_NAME("Change Color")
- PORT_BIT(0x200, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_6) PORT_NAME("Sound / Depth Search / Bishop")
-
- PORT_MODIFY("IN.3")
- PORT_BIT(0x100, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_T) PORT_NAME("Clear Board")
- PORT_BIT(0x200, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_5) PORT_NAME("Solve Mate / Knight")
-
- PORT_MODIFY("IN.4")
- PORT_BIT(0x100, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_R) PORT_NAME("Print Moves")
- PORT_BIT(0x200, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_4) PORT_NAME("Print Board / Rook")
-
- PORT_MODIFY("IN.5")
- PORT_BIT(0x100, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_E) PORT_NAME("Form Size")
- PORT_BIT(0x200, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_3) PORT_NAME("Print List / Acc. Time / Pawn")
-
- PORT_MODIFY("IN.6")
- PORT_BIT(0x100, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_W) PORT_NAME("Hint")
- PORT_BIT(0x200, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_2) PORT_NAME("Set Level")
-
- PORT_MODIFY("IN.7")
- PORT_BIT(0x100, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_Q) PORT_NAME("Go")
- PORT_BIT(0x200, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_1) PORT_NAME("Take Back")
-INPUT_PORTS_END
-
-
-static INPUT_PORTS_START( cforte )
- PORT_INCLUDE( novag_cb_buttons )
-
- PORT_MODIFY("IN.0")
- PORT_BIT(0x100, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_I) PORT_NAME("New Game")
- PORT_BIT(0x200, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_8) PORT_NAME("Player/Player / Gambit/Large / King")
-
- PORT_MODIFY("IN.1")
- PORT_BIT(0x100, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_U) PORT_NAME("Verify/Set Up / Pro-Op")
- PORT_BIT(0x200, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_7) PORT_NAME("Random/Tour/Normal / Training Level / Queen")
-
- PORT_MODIFY("IN.2")
- PORT_BIT(0x100, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_Y) PORT_NAME("Change Color / Time Control / Priority")
- PORT_BIT(0x200, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_6) PORT_NAME("Sound / Depth Search / Bishop")
-
- PORT_MODIFY("IN.3")
- PORT_BIT(0x100, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_T) PORT_NAME("Flip Display / Clear Board / Clear Book")
- PORT_BIT(0x200, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_5) PORT_NAME("Solve Mate / Infinite / Knight")
-
- PORT_MODIFY("IN.4")
- PORT_BIT(0x100, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_R) PORT_NAME("Print Moves / Print Evaluations / Print Book")
- PORT_BIT(0x200, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_4) PORT_NAME("Print Board / Interface / Rook")
-
- PORT_MODIFY("IN.5")
- PORT_BIT(0x100, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_E) PORT_NAME("Trace Forward / Auto Play / No/End")
- PORT_BIT(0x200, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_3) PORT_NAME("Print List / Acc. Time / Pawn")
-
- PORT_MODIFY("IN.6")
- PORT_BIT(0x100, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_W) PORT_NAME("Hint / Next Best / Yes/Start")
- PORT_BIT(0x200, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_2) PORT_NAME("Set Level")
-
- PORT_MODIFY("IN.7")
- PORT_BIT(0x100, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_Q) PORT_NAME("Go / ->")
- PORT_BIT(0x200, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_1) PORT_NAME("Take Back / Restore / <-")
-INPUT_PORTS_END
-
-
-static INPUT_PORTS_START( sexy_shared )
- PORT_MODIFY("IN.0")
- PORT_BIT(0x100, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_A) PORT_NAME("Go")
- PORT_BIT(0x200, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_Q) PORT_NAME("Take Back / Analyze Games")
- PORT_BIT(0x400, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_1) PORT_NAME("->")
-
- PORT_MODIFY("IN.1")
- PORT_BIT(0x100, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_S) PORT_NAME("Set Level")
- PORT_BIT(0x200, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_W) PORT_NAME("Flip Display / Time Control")
- PORT_BIT(0x400, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_2) PORT_NAME("<-")
-
- PORT_MODIFY("IN.2")
- PORT_BIT(0x100, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_D) PORT_NAME("Hint / Next Best")
- PORT_BIT(0x200, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_E) PORT_NAME("Priority / Tournament Book / Pawn")
- PORT_BIT(0x400, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_3) PORT_NAME("Yes/Start / Start of Game")
-
- PORT_MODIFY("IN.3")
- PORT_BIT(0x100, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_F) PORT_NAME("Trace Forward / AutoPlay")
- PORT_BIT(0x200, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_R) PORT_NAME("Pro-Op / Restore Game / Rook")
- PORT_BIT(0x400, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_4) PORT_NAME("No/End / End of Game")
-
- PORT_MODIFY("IN.4")
- PORT_BIT(0x100, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_G) PORT_NAME("Clear Board / Delete Pro-Op")
- PORT_BIT(0x200, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_T) PORT_NAME("Best Move/Random / Review / Knight")
- PORT_BIT(0x400, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_5) PORT_NAME("Print Book / Store Game")
-
- PORT_MODIFY("IN.5")
- PORT_BIT(0x100, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_H) PORT_NAME("Change Color")
- PORT_BIT(0x200, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_Y) PORT_NAME("Sound / Info / Bishop")
- PORT_BIT(0x400, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_6) PORT_NAME("Print Moves / Print Evaluations")
-
- PORT_MODIFY("IN.6")
- PORT_BIT(0x100, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_J) PORT_NAME("Verify/Set Up / Pro-Op Book/Both Books")
- PORT_BIT(0x200, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_U) PORT_NAME("Solve Mate / Infinite / Queen")
- PORT_BIT(0x400, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_7) PORT_NAME("Print List / Acc. Time")
-
- PORT_MODIFY("IN.7")
- PORT_BIT(0x100, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_K) PORT_NAME("New Game")
- PORT_BIT(0x200, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_I) PORT_NAME("Player/Player / Gambit Book / King")
- PORT_BIT(0x400, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_8) PORT_NAME("Print Board / Interface")
-
- PORT_START("FAKE")
- PORT_CONFNAME( 0x01, 0x00, "CPU Frequency" ) PORT_CHANGED_MEMBER(DEVICE_SELF, novag6502_state, sexpert_cpu_freq, nullptr) // factory set
- PORT_CONFSETTING( 0x00, "5MHz" )
- PORT_CONFSETTING( 0x01, "6MHz" )
-INPUT_PORTS_END
-
-INPUT_CHANGED_MEMBER(novag6502_state::sexpert_cpu_freq)
-{
- sexpert_set_cpu_freq();
-}
-
-static INPUT_PORTS_START( sexpert )
- PORT_INCLUDE( novag_cb_magnets )
- PORT_INCLUDE( sexy_shared )
-INPUT_PORTS_END
-
-static INPUT_PORTS_START( sforte )
- PORT_INCLUDE( novag_cb_buttons )
- PORT_INCLUDE( sexy_shared )
-INPUT_PORTS_END
-
-
-
-/******************************************************************************
- Machine Drivers
-******************************************************************************/
-
-MACHINE_CONFIG_START(novag6502_state::supercon)
-
- /* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M6502, 8_MHz_XTAL/2)
- MCFG_DEVICE_PERIODIC_INT_DRIVER(novag6502_state, irq0_line_hold, 600) // guessed
- MCFG_DEVICE_PROGRAM_MAP(supercon_map)
-
- NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_1);
-
- MCFG_TIMER_DRIVER_ADD_PERIODIC("display_decay", novag6502_state, display_decay_tick, attotime::from_msec(1))
- config.set_default_layout(layout_novag_supercon);
-
- /* sound hardware */
- SPEAKER(config, "mono").front_center();
- BEEP(config, m_beeper, 1024); // guessed
- m_beeper->add_route(ALL_OUTPUTS, "mono", 0.25);
-MACHINE_CONFIG_END
-
-MACHINE_CONFIG_START(novag6502_state::cforte)
-
- /* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", R65C02, 10_MHz_XTAL/2)
- MCFG_DEVICE_PROGRAM_MAP(cforte_map)
- MCFG_TIMER_DRIVER_ADD_PERIODIC("irq_on", novag6502_state, irq_on, attotime::from_hz(32.768_kHz_XTAL/128)) // 256Hz
- MCFG_TIMER_START_DELAY(attotime::from_hz(32.768_kHz_XTAL/128) - attotime::from_usec(11)) // active for 11us
- MCFG_TIMER_DRIVER_ADD_PERIODIC("irq_off", novag6502_state, irq_off, attotime::from_hz(32.768_kHz_XTAL/128))
-
- NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_1);
-
- /* video hardware */
- HLCD0538(config, m_hlcd0538, 0);
- m_hlcd0538->write_cols_callback().set(FUNC(novag6502_state::cforte_lcd_output_w));
-
- MCFG_TIMER_DRIVER_ADD_PERIODIC("display_decay", novag6502_state, display_decay_tick, attotime::from_msec(1))
- config.set_default_layout(layout_novag_cforte);
-
- /* sound hardware */
- SPEAKER(config, "mono").front_center();
- BEEP(config, m_beeper, 32.768_kHz_XTAL/32); // 1024Hz
- m_beeper->add_route(ALL_OUTPUTS, "mono", 0.25);
-MACHINE_CONFIG_END
-
-MACHINE_CONFIG_START(novag6502_state::sexpert)
-
- /* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M65C02, 10_MHz_XTAL/2) // or 12_MHz_XTAL/2
- MCFG_DEVICE_PROGRAM_MAP(sexpert_map)
- MCFG_TIMER_DRIVER_ADD_PERIODIC("irq_on", novag6502_state, irq_on, attotime::from_hz(32.768_kHz_XTAL/128)) // 256Hz
- MCFG_TIMER_START_DELAY(attotime::from_hz(32.768_kHz_XTAL/128) - attotime::from_nsec(21500)) // active for 21.5us
- MCFG_TIMER_DRIVER_ADD_PERIODIC("irq_off", novag6502_state, irq_off, attotime::from_hz(32.768_kHz_XTAL/128))
-
- mos6551_device &acia(MOS6551(config, "acia", 0)); // R65C51P2 - RTS to CTS, DCD to GND
- acia.set_xtal(1.8432_MHz_XTAL);
- acia.irq_handler().set_inputline("maincpu", m65c02_device::NMI_LINE);
- acia.rts_handler().set("acia", FUNC(mos6551_device::write_cts));
- acia.txd_handler().set("rs232", FUNC(rs232_port_device::write_txd));
- acia.dtr_handler().set("rs232", FUNC(rs232_port_device::write_dtr));
-
- rs232_port_device &rs232(RS232_PORT(config, "rs232", default_rs232_devices, nullptr));
- rs232.rxd_handler().set("acia", FUNC(mos6551_device::write_rxd));
- rs232.dsr_handler().set("acia", FUNC(mos6551_device::write_dsr));
-
- NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_1);
-
- MCFG_MACHINE_RESET_OVERRIDE(novag6502_state, sexpert)
-
- /* video hardware */
- MCFG_SCREEN_ADD("screen", LCD)
- MCFG_SCREEN_REFRESH_RATE(60) // arbitrary
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500))
- MCFG_SCREEN_SIZE(6*16+1, 10)
- MCFG_SCREEN_VISIBLE_AREA(0, 6*16, 0, 10-1)
- MCFG_SCREEN_UPDATE_DEVICE("hd44780", hd44780_device, screen_update)
- MCFG_SCREEN_PALETTE("palette")
- PALETTE(config, "palette", FUNC(novag6502_state::novag_lcd_palette), 3);
-
- MCFG_HD44780_ADD("hd44780")
- MCFG_HD44780_LCD_SIZE(2, 8)
- MCFG_HD44780_PIXEL_UPDATE_CB(novag6502_state, novag_lcd_pixel_update)
-
- MCFG_TIMER_DRIVER_ADD_PERIODIC("display_decay", novag6502_state, display_decay_tick, attotime::from_msec(1))
- config.set_default_layout(layout_novag_sexpert);
-
- /* sound hardware */
- SPEAKER(config, "mono").front_center();
- BEEP(config, m_beeper, 32.768_kHz_XTAL/32); // 1024Hz
- m_beeper->add_route(ALL_OUTPUTS, "mono", 0.25);
-MACHINE_CONFIG_END
-
-MACHINE_CONFIG_START(novag6502_state::sforte)
- sexpert(config);
-
- /* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(sforte_map)
- MCFG_TIMER_MODIFY("irq_on")
- MCFG_TIMER_START_DELAY(attotime::from_hz(32.768_kHz_XTAL/128) - attotime::from_usec(11)) // active for ?us (assume same as cforte)
-
- config.set_default_layout(layout_novag_sforte);
-MACHINE_CONFIG_END
-
-
-
-/******************************************************************************
- ROM Definitions
-******************************************************************************/
-
-ROM_START( supercon )
- ROM_REGION( 0x10000, "maincpu", 0 )
- ROM_LOAD("novag_8441", 0x0000, 0x8000, CRC(b853cf6e) SHA1(1a759072a5023b92c07f1fac01b7a21f7b5b45d0) ) // label obscured by Q.C. sticker
- ROM_LOAD("novag_8442", 0x8000, 0x8000, CRC(c8f82331) SHA1(f7fd039f9a3344db9749931490ded9e9e309cfbe) )
-ROM_END
-
-
-ROM_START( cfortea )
- ROM_REGION( 0x10000, "maincpu", 0 )
- ROM_LOAD("a_903_l", 0x0000, 0x8000, CRC(01e7e306) SHA1(6a2b982bb0f412a63f5d3603958dd863e38669d9) ) // NEC D27C256AD-12
- ROM_LOAD("a_903_h", 0x8000, 0x8000, CRC(c5a5573f) SHA1(7e11eb2f3d96bc41386a14a19635427a386ec1ec) ) // "
-ROM_END
-
-ROM_START( cforteb )
- ROM_REGION( 0x10000, "maincpu", 0 )
- ROM_LOAD("forte_b_l.bin", 0x0000, 0x8000, CRC(e3d194a1) SHA1(80457580d7c57e07895fd14bfdaf14b30952afca) )
- ROM_LOAD("forte_b_h.bin", 0x8000, 0x8000, CRC(dd824be8) SHA1(cd8666b6b525887f9fc48a730b71ceabcf07f3b9) )
-ROM_END
-
-
-ROM_START( sfortea )
- ROM_REGION( 0x18000, "maincpu", 0 )
- ROM_LOAD("sfalo.u3", 0x0000, 0x8000, CRC(86e0230a) SHA1(0d6e18a17e636b8c7292c8f331349d361892d1a8) )
- ROM_LOAD("sfahi.u1", 0x8000, 0x8000, CRC(81c02746) SHA1(0bf68b68ade5a3263bead88da0a8965fc71483c1) )
- ROM_LOAD("sfabook.u2", 0x10000, 0x8000, CRC(3e42cf7c) SHA1(b2faa36a127e08e5755167a25ed4a07f12d62957) )
-ROM_END
-
-ROM_START( sfortea1 )
- ROM_REGION( 0x18000, "maincpu", 0 )
- ROM_LOAD("sfa_lo.u3", 0x0000, 0x8000, CRC(78734bfd) SHA1(b6d8e9efccee6f6d0b0cd257a82162bf8ccec719) )
- ROM_LOAD("sfa_hi_1.u1", 0x8000, 0x8000, CRC(e5e84580) SHA1(bae55c3da7b720bf6ccfb450e383c53cebd5e9ef) )
- ROM_LOAD("sfa_hi_0.u2", 0x10000, 0x8000, CRC(3e42cf7c) SHA1(b2faa36a127e08e5755167a25ed4a07f12d62957) )
-ROM_END
-
-ROM_START( sforteb )
- ROM_REGION( 0x18000, "maincpu", 0 )
- ROM_LOAD("forte_b_lo.u3", 0x0000, 0x8000, CRC(48bfe5d6) SHA1(323642686b6d2fb8db2b7d50c6cd431058078ce1) )
- ROM_LOAD("forte_b_hi1.u1", 0x8000, 0x8000, CRC(9778ca2c) SHA1(d8b88b9768a1a9171c68cbb0892b817d68d78351) )
- ROM_LOAD("forte_b_hi0.u2", 0x10000, 0x8000, CRC(bb07ad52) SHA1(30cf9005021ab2d7b03facdf2d3588bc94dc68a6) )
-ROM_END
-
-ROM_START( sfortec )
- ROM_REGION( 0x18000, "maincpu", 0 )
- ROM_LOAD("sfl_c_111.u3", 0x0000, 0x8000, CRC(f040cf30) SHA1(1fc1220b8ed67cdffa3866d230ce001721cf684f) ) // Toshiba TC57256AD-12
- ROM_LOAD("sfh_c_111.u1", 0x8000, 0x8000, CRC(0f926b32) SHA1(9c7270ecb3f41dd9172a9a7928e6e04e64b2a340) ) // NEC D27C256AD-12
- ROM_LOAD("h0_c_c26.u2", 0x10000, 0x8000, CRC(c6a1419a) SHA1(017a0ffa9aa59438c879624a7ddea2071d1524b8) ) // Toshiba TC57256AD-12
-ROM_END
-
-
-ROM_START( sexperta )
- ROM_REGION( 0x18000, "maincpu", 0 )
- ROM_LOAD("se_lo_b15.u3", 0x0000, 0x8000, CRC(6cc9527c) SHA1(29bab809399f2863a88a9c41535ecec0a4fd65ea) )
- ROM_LOAD("se_hi1_b15.u1", 0x8000, 0x8000, CRC(6e57f0c0) SHA1(ea44769a6f54721fd4543366bda932e86e497d43) )
- ROM_LOAD("sef_hi0_a23.u2", 0x10000, 0x8000, CRC(7d4e1528) SHA1(53c7d458a5571afae402f00ae3d0f5066634b068) )
-ROM_END
-
-ROM_START( sexpertb )
- ROM_REGION( 0x18000, "maincpu", 0 )
- ROM_LOAD("se_lo_619.u3", 0x0000, 0x8000, CRC(92002eb6) SHA1(ed8ca16701e00b48fa55c856fa4a8c6613079c02) )
- ROM_LOAD("se_hi1_619.u1", 0x8000, 0x8000, CRC(814b4420) SHA1(c553e6a8c048dcc1cf48d410111a86e06b99d356) )
- ROM_LOAD("sef_hi0_605.u2", 0x10000, 0x8000, CRC(bb07ad52) SHA1(30cf9005021ab2d7b03facdf2d3588bc94dc68a6) )
-ROM_END
-
-ROM_START( sexpertc )
- ROM_REGION( 0x18000, "maincpu", 0 )
- ROM_LOAD("se_lo_v3.6.u3", 0x0000, 0x8000, CRC(5a29105e) SHA1(be37bb29b530dbba847a5e8d27d81b36525e47f7) )
- ROM_LOAD("se_hi1.u1", 0x8000, 0x8000, CRC(0085c2c4) SHA1(d84bf4afb022575db09dd9dc12e9b330acce35fa) )
- ROM_LOAD("se_hi0.u2", 0x10000, 0x8000, CRC(2d085064) SHA1(76162322aa7d23a5c07e8356d0bbbb33816419af) )
-ROM_END
-
-ROM_START( sexpertc1 )
- ROM_REGION( 0x18000, "maincpu", 0 )
- ROM_LOAD("se_lo_v1.2.u3", 0x0000, 0x8000, CRC(43ed7a9e) SHA1(273c485e5be6b107b6c5c448003ba7686d4a6d06) )
- ROM_LOAD("se_hi1.u1", 0x8000, 0x8000, CRC(0085c2c4) SHA1(d84bf4afb022575db09dd9dc12e9b330acce35fa) )
- ROM_LOAD("se_hi0.u2", 0x10000, 0x8000, CRC(2d085064) SHA1(76162322aa7d23a5c07e8356d0bbbb33816419af) )
-ROM_END
-
-
-
-/******************************************************************************
- Drivers
-******************************************************************************/
-
-// YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS
-CONS( 1984, supercon, 0, 0, supercon, supercon, novag6502_state, empty_init, "Novag", "Super Constellation", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
-
-CONS( 1986, cfortea, 0, 0, cforte, cforte, novag6502_state, empty_init, "Novag", "Constellation Forte (version A)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
-CONS( 1986, cforteb, cfortea, 0, cforte, cforte, novag6502_state, empty_init, "Novag", "Constellation Forte (version B)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
-
-CONS( 1987, sfortea, 0, 0, sforte, sforte, novag6502_state, init_sexpert, "Novag", "Super Forte (version A, set 1)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
-CONS( 1987, sfortea1, sfortea, 0, sforte, sforte, novag6502_state, init_sexpert, "Novag", "Super Forte (version A, set 2)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
-CONS( 1988, sforteb, sfortea, 0, sforte, sforte, novag6502_state, init_sexpert, "Novag", "Super Forte (version B)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
-CONS( 1990, sfortec, sfortea, 0, sforte, sforte, novag6502_state, init_sexpert, "Novag", "Super Forte (version C)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
-
-CONS( 1987, sexperta, 0, 0, sexpert, sexpert, novag6502_state, init_sexpert, "Novag", "Super Expert (version A)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
-CONS( 1988, sexpertb, sexperta, 0, sexpert, sexpert, novag6502_state, init_sexpert, "Novag", "Super Expert (version B)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
-CONS( 1990, sexpertc, sexperta, 0, sexpert, sexpert, novag6502_state, init_sexpert, "Novag", "Super Expert (version C, V3.6)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
-CONS( 1990, sexpertc1, sexperta, 0, sexpert, sexpert, novag6502_state, init_sexpert, "Novag", "Super Expert (version C, V1.2)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
diff --git a/src/mame/drivers/novag_cforte.cpp b/src/mame/drivers/novag_cforte.cpp
new file mode 100644
index 00000000000..64c0564f214
--- /dev/null
+++ b/src/mame/drivers/novag_cforte.cpp
@@ -0,0 +1,259 @@
+// license:BSD-3-Clause
+// copyright-holders:hap
+// thanks-to:Berger
+/******************************************************************************
+*
+* novag_cforte.cpp, subdriver of machine/novagbase.cpp, machine/chessbase.cpp
+
+TODO:
+- RS232 port?
+
+*******************************************************************************
+
+Novag Constellation Forte overview:
+- R65C02P4 @ 5MHz (10MHz XTAL)
+- 2*2KB RAM(NEC D449C-3), 2*32KB ROM(27C256)
+- HLCD0538P, 10-digit 7seg LCD display
+- TTL, 18 LEDs, 8*8 chessboard buttons
+
+I/O is similar to supercon
+
+******************************************************************************/
+
+#include "emu.h"
+#include "includes/novagbase.h"
+
+#include "cpu/m6502/r65c02.h"
+#include "machine/nvram.h"
+#include "video/hlcd0538.h"
+#include "speaker.h"
+
+// internal artwork
+#include "novag_cforte.lh" // clickable
+
+
+namespace {
+
+class cforte_state : public novagbase_state
+{
+public:
+ cforte_state(const machine_config &mconfig, device_type type, const char *tag) :
+ novagbase_state(mconfig, type, tag),
+ m_hlcd0538(*this, "hlcd0538")
+ { }
+
+ // machine drivers
+ void cforte(machine_config &config);
+
+private:
+ // devices/pointers
+ optional_device<hlcd0538_device> m_hlcd0538;
+
+ // address maps
+ void main_map(address_map &map);
+
+ // I/O handlers
+ void prepare_display();
+ DECLARE_WRITE64_MEMBER(lcd_output_w);
+ DECLARE_WRITE8_MEMBER(mux_w);
+ DECLARE_WRITE8_MEMBER(control_w);
+ DECLARE_READ8_MEMBER(input1_r);
+ DECLARE_READ8_MEMBER(input2_r);
+};
+
+
+/******************************************************************************
+ Devices, I/O
+******************************************************************************/
+
+// TTL/generic
+
+void cforte_state::prepare_display()
+{
+ // 3 led rows
+ display_matrix(8, 3, m_led_data, m_led_select, false);
+
+ // lcd panel (mostly handled in lcd_output_w)
+ set_display_segmask(0x3ff0, 0xff);
+ set_display_size(8, 3+13);
+ display_update();
+}
+
+WRITE64_MEMBER(cforte_state::lcd_output_w)
+{
+ // 4 rows used
+ u32 rowdata[4];
+ for (int i = 0; i < 4; i++)
+ rowdata[i] = (data >> i & 1) ? u32(data >> 8) : 0;
+
+ // 2 segments per row
+ for (int dig = 0; dig < 13; dig++)
+ {
+ m_display_state[dig+3] = 0;
+ for (int i = 0; i < 4; i++)
+ m_display_state[dig+3] |= ((rowdata[i] >> (2*dig) & 3) << (2*i));
+
+ m_display_state[dig+3] = bitswap<8>(m_display_state[dig+3],7,2,0,4,6,5,3,1);
+ }
+
+ prepare_display();
+}
+
+WRITE8_MEMBER(cforte_state::mux_w)
+{
+ // d0-d7: input mux, led data
+ m_inp_mux = m_led_data = data;
+ prepare_display();
+}
+
+WRITE8_MEMBER(cforte_state::control_w)
+{
+ // d0: HLCD0538 data in
+ // d1: HLCD0538 clk
+ // d2: HLCD0538 lcd
+ m_hlcd0538->data_w(data & 1);
+ m_hlcd0538->clk_w(data >> 1 & 1);
+ m_hlcd0538->lcd_w(data >> 2 & 1);
+
+ // d3: unused?
+
+ // d4-d6: select led row
+ m_led_select = data >> 4 & 7;
+ prepare_display();
+
+ // d7: enable beeper
+ m_beeper->set_state(data >> 7 & 1);
+}
+
+READ8_MEMBER(cforte_state::input1_r)
+{
+ // d0-d7: multiplexed inputs (chessboard squares)
+ return ~read_inputs(8) & 0xff;
+}
+
+READ8_MEMBER(cforte_state::input2_r)
+{
+ // d0-d5: ?
+ // d6,d7: multiplexed inputs (side panel)
+ return (read_inputs(8) >> 2 & 0xc0) ^ 0xff;
+}
+
+
+
+/******************************************************************************
+ Address Maps
+******************************************************************************/
+
+void cforte_state::main_map(address_map &map)
+{
+ map(0x0000, 0x0fff).ram().share("nvram");
+ map(0x1c00, 0x1c00).nopw(); // printer?
+ map(0x1d00, 0x1d00).nopw(); // printer?
+ map(0x1e00, 0x1e00).rw(FUNC(cforte_state::input2_r), FUNC(cforte_state::mux_w));
+ map(0x1f00, 0x1f00).rw(FUNC(cforte_state::input1_r), FUNC(cforte_state::control_w));
+ map(0x2000, 0xffff).rom();
+}
+
+
+
+/******************************************************************************
+ Input Ports
+******************************************************************************/
+
+static INPUT_PORTS_START( cforte )
+ PORT_INCLUDE( generic_cb_buttons )
+
+ PORT_MODIFY("IN.0")
+ PORT_BIT(0x100, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_I) PORT_NAME("New Game")
+ PORT_BIT(0x200, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_8) PORT_NAME("Player/Player / Gambit/Large / King")
+
+ PORT_MODIFY("IN.1")
+ PORT_BIT(0x100, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_U) PORT_NAME("Verify/Set Up / Pro-Op")
+ PORT_BIT(0x200, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_7) PORT_NAME("Random/Tour/Normal / Training Level / Queen")
+
+ PORT_MODIFY("IN.2")
+ PORT_BIT(0x100, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_Y) PORT_NAME("Change Color / Time Control / Priority")
+ PORT_BIT(0x200, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_6) PORT_NAME("Sound / Depth Search / Bishop")
+
+ PORT_MODIFY("IN.3")
+ PORT_BIT(0x100, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_T) PORT_NAME("Flip Display / Clear Board / Clear Book")
+ PORT_BIT(0x200, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_5) PORT_NAME("Solve Mate / Infinite / Knight")
+
+ PORT_MODIFY("IN.4")
+ PORT_BIT(0x100, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_R) PORT_NAME("Print Moves / Print Evaluations / Print Book")
+ PORT_BIT(0x200, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_4) PORT_NAME("Print Board / Interface / Rook")
+
+ PORT_MODIFY("IN.5")
+ PORT_BIT(0x100, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_E) PORT_NAME("Trace Forward / Auto Play / No/End")
+ PORT_BIT(0x200, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_3) PORT_NAME("Print List / Acc. Time / Pawn")
+
+ PORT_MODIFY("IN.6")
+ PORT_BIT(0x100, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_W) PORT_NAME("Hint / Next Best / Yes/Start")
+ PORT_BIT(0x200, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_2) PORT_NAME("Set Level")
+
+ PORT_MODIFY("IN.7")
+ PORT_BIT(0x100, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_Q) PORT_NAME("Go / ->")
+ PORT_BIT(0x200, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_1) PORT_NAME("Take Back / Restore / <-")
+INPUT_PORTS_END
+
+
+
+/******************************************************************************
+ Machine Drivers
+******************************************************************************/
+
+void cforte_state::cforte(machine_config &config)
+{
+ /* basic machine hardware */
+ R65C02(config, m_maincpu, 10_MHz_XTAL/2);
+ m_maincpu->set_addrmap(AS_PROGRAM, &cforte_state::main_map);
+
+ const attotime irq_period = attotime::from_hz(32.768_kHz_XTAL/128); // 256Hz
+ TIMER(config, m_irq_on).configure_periodic(FUNC(cforte_state::irq_on<M6502_IRQ_LINE>), irq_period);
+ m_irq_on->set_start_delay(irq_period - attotime::from_usec(11)); // active for 11us
+ TIMER(config, "irq_off").configure_periodic(FUNC(cforte_state::irq_off<M6502_IRQ_LINE>), irq_period);
+
+ NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_1);
+
+ /* video hardware */
+ HLCD0538(config, m_hlcd0538);
+ m_hlcd0538->write_cols().set(FUNC(cforte_state::lcd_output_w));
+
+ TIMER(config, "display_decay").configure_periodic(FUNC(cforte_state::display_decay_tick), attotime::from_msec(1));
+ config.set_default_layout(layout_novag_cforte);
+
+ /* sound hardware */
+ SPEAKER(config, "mono").front_center();
+ BEEP(config, m_beeper, 32.768_kHz_XTAL/32); // 1024Hz
+ m_beeper->add_route(ALL_OUTPUTS, "mono", 0.25);
+}
+
+
+
+/******************************************************************************
+ ROM Definitions
+******************************************************************************/
+
+ROM_START( cfortea )
+ ROM_REGION( 0x10000, "maincpu", 0 )
+ ROM_LOAD("a_903_l", 0x0000, 0x8000, CRC(01e7e306) SHA1(6a2b982bb0f412a63f5d3603958dd863e38669d9) ) // NEC D27C256AD-12
+ ROM_LOAD("a_903_h", 0x8000, 0x8000, CRC(c5a5573f) SHA1(7e11eb2f3d96bc41386a14a19635427a386ec1ec) ) // "
+ROM_END
+
+ROM_START( cforteb )
+ ROM_REGION( 0x10000, "maincpu", 0 )
+ ROM_LOAD("forte_b_l.bin", 0x0000, 0x8000, CRC(e3d194a1) SHA1(80457580d7c57e07895fd14bfdaf14b30952afca) )
+ ROM_LOAD("forte_b_h.bin", 0x8000, 0x8000, CRC(dd824be8) SHA1(cd8666b6b525887f9fc48a730b71ceabcf07f3b9) )
+ROM_END
+
+} // anonymous namespace
+
+
+
+/******************************************************************************
+ Drivers
+******************************************************************************/
+
+// YEAR NAME PARENT CMP MACHINE INPUT STATE INIT COMPANY, FULLNAME, FLAGS
+CONS( 1986, cfortea, 0, 0, cforte, cforte, cforte_state, empty_init, "Novag", "Constellation Forte (version A)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
+CONS( 1986, cforteb, cfortea, 0, cforte, cforte, cforte_state, empty_init, "Novag", "Constellation Forte (version B)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
diff --git a/src/mame/drivers/novagf8.cpp b/src/mame/drivers/novag_delta1.cpp
index 37f5553ec80..e8882ce902b 100644
--- a/src/mame/drivers/novagf8.cpp
+++ b/src/mame/drivers/novag_delta1.cpp
@@ -2,17 +2,11 @@
// copyright-holders:hap
// thanks-to:Berger
/******************************************************************************
+*
+* novag_delta1.cpp, subdriver of machine/novagbase.cpp, machine/chessbase.cpp
- Novag generic F8 based chess computer driver
+Novag Delta-1, the chess engine seems similar to Boris (see aci_boris.cpp)
- TODO:
- - ccdelta1 doesn't work, goes bonkers when you press Enter. CPU core bug?
- - hardware is similar to MK I, the drivers can be merged in theory.
- But I prefer my source code to be licensed BSD3, mk1.cpp is GPL2.
-
-******************************************************************************
-
-Delta-1:
- 3850PK CPU at ~2MHz, 3853PK memory interface
- 4KB ROM(2332A), 256 bytes RAM(2*2111A-4)
- 4-digit 7seg panel, no sound, no chessboard
@@ -26,59 +20,60 @@ Delta-1:
#include "machine/f3853.h"
// internal artwork
-#include "novag_delta1.lh"
+#include "novag_delta1.lh" // clickable
+
+namespace {
-class novagf8_state : public novagbase_state
+class delta1_state : public novagbase_state
{
public:
- novagf8_state(const machine_config &mconfig, device_type type, const char *tag)
- : novagbase_state(mconfig, type, tag)
+ delta1_state(const machine_config &mconfig, device_type type, const char *tag) :
+ novagbase_state(mconfig, type, tag)
{ }
+ // machine drivers
void delta1(machine_config &config);
- DECLARE_INPUT_CHANGED_MEMBER(reset_button);
+protected:
+ virtual void machine_start() override;
private:
- u8 m_io[2]; // F8 CPU I/O ports
+ // address maps
+ void main_map(address_map &map);
+ void main_io(address_map &map);
- // Delta-1
- DECLARE_WRITE8_MEMBER(delta1_io0_w);
- DECLARE_WRITE8_MEMBER(delta1_io1_w);
- DECLARE_READ8_MEMBER(delta1_io0_r);
- DECLARE_READ8_MEMBER(delta1_io1_r);
- void delta1_io(address_map &map);
- void delta1_map(address_map &map);
+ // I/O handlers
+ DECLARE_WRITE8_MEMBER(mux_w);
+ DECLARE_WRITE8_MEMBER(digit_w);
+ DECLARE_READ8_MEMBER(input_r);
- virtual void machine_start() override;
+ TIMER_DEVICE_CALLBACK_MEMBER(blink) { m_blink = !m_blink; }
+ bool m_blink;
};
-void novagf8_state::machine_start()
+void delta1_state::machine_start()
{
novagbase_state::machine_start();
- // zerofill
- memset(m_io, 0, sizeof(m_io));
+ // zerofill/register for savestates
+ m_blink = false;
+ save_item(NAME(m_blink));
- // register for savestates
- save_item(NAME(m_io));
+ // game reads from uninitialized RAM while it's thinking
+ for (int i = 0; i < 0x100; i++)
+ m_maincpu->space(AS_PROGRAM).write_byte(i + 0x2000, machine().rand());
}
-
-// Devices, I/O
-
/******************************************************************************
- Delta-1
+ Devices, I/O
******************************************************************************/
// CPU I/O ports
-WRITE8_MEMBER(novagf8_state::delta1_io0_w)
+WRITE8_MEMBER(delta1_state::mux_w)
{
- m_io[0] = data;
-
// IO00-02: MC14028B A-C (IO03: GND)
// MC14028B Q3-Q7: input mux
// MC14028B Q4-Q7: digit select through 75492
@@ -87,29 +82,23 @@ WRITE8_MEMBER(novagf8_state::delta1_io0_w)
// update display here
set_display_segmask(0xf, 0x7f);
- display_matrix(7, 4, m_led_data, sel >> 4);
+ display_matrix(7, 4, m_7seg_data, sel >> 4);
+
+ m_led_select = data;
}
-READ8_MEMBER(novagf8_state::delta1_io0_r)
+READ8_MEMBER(delta1_state::input_r)
{
// IO04-07: multiplexed inputs
- return read_inputs(5) << 4 | m_io[0];
+ return read_inputs(5) << 4 | m_led_select;
}
-WRITE8_MEMBER(novagf8_state::delta1_io1_w)
+WRITE8_MEMBER(delta1_state::digit_w)
{
- m_io[1] = data;
-
- // IO17: segment commons, active low (always 0?)
+ // IO17: R/C circuit to segment commons (for automated blinking)
// IO10-16: digit segments A-G
- data = (data & 0x80) ? 0 : (data & 0x7f);
- m_led_data = bitswap<7>(data, 0,1,2,3,4,5,6);
-}
-
-READ8_MEMBER(novagf8_state::delta1_io1_r)
-{
- // unused?
- return m_io[1];
+ data = (data & 0x80 && m_blink) ? 0 : (data & 0x7f);
+ m_7seg_data = bitswap<7>(data, 0,1,2,3,4,5,6);
}
@@ -118,20 +107,18 @@ READ8_MEMBER(novagf8_state::delta1_io1_r)
Address Maps
******************************************************************************/
-// Delta-1
-
-void novagf8_state::delta1_map(address_map &map)
+void delta1_state::main_map(address_map &map)
{
map.global_mask(0x3fff);
map(0x0000, 0x0fff).mirror(0x1000).rom(); // _A13
map(0x2000, 0x20ff).mirror(0x1f00).ram(); // A13
}
-void novagf8_state::delta1_io(address_map &map)
+void delta1_state::main_io(address_map &map)
{
- map(0x0, 0x0).rw(FUNC(novagf8_state::delta1_io0_r), FUNC(novagf8_state::delta1_io0_w));
- map(0x1, 0x1).rw(FUNC(novagf8_state::delta1_io1_r), FUNC(novagf8_state::delta1_io1_w));
- map(0xc, 0xf).rw("f3853", FUNC(f3853_device::read), FUNC(f3853_device::write));
+ map(0x00, 0x00).rw(FUNC(delta1_state::input_r), FUNC(delta1_state::mux_w));
+ map(0x01, 0x01).w(FUNC(delta1_state::digit_w));
+ map(0x0c, 0x0f).rw("f3853", FUNC(f3853_device::read), FUNC(f3853_device::write));
}
@@ -140,15 +127,9 @@ void novagf8_state::delta1_io(address_map &map)
Input Ports
******************************************************************************/
-INPUT_CHANGED_MEMBER(novagf8_state::reset_button)
-{
- // wired directly to CPU reset pin
- m_maincpu->set_input_line(INPUT_LINE_RESET, newval ? ASSERT_LINE : CLEAR_LINE);
-}
-
static INPUT_PORTS_START( delta1 )
PORT_START("IN.0")
- PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_Y) PORT_NAME("Time Set")
+ PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_S) PORT_NAME("Time Set")
PORT_BIT(0x0d, IP_ACTIVE_HIGH, IPT_UNUSED)
PORT_START("IN.1")
@@ -172,11 +153,11 @@ static INPUT_PORTS_START( delta1 )
PORT_START("IN.4")
PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_U) PORT_NAME("FP / Black Bishop") // find position
PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_I) PORT_NAME("EP / Black Knight") // enter position
- PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_O) PORT_NAME("Color / Black Pawn")
+ PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_O) PORT_NAME("Change Color / Black Pawn")
PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("Enter")
PORT_START("RESET") // not on matrix
- PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_N) PORT_CHANGED_MEMBER(DEVICE_SELF, novagf8_state, reset_button, nullptr) PORT_NAME("New Game")
+ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_N) PORT_CHANGED_MEMBER(DEVICE_SELF, delta1_state, reset_button, nullptr) PORT_NAME("New Game")
INPUT_PORTS_END
@@ -185,20 +166,21 @@ INPUT_PORTS_END
Machine Drivers
******************************************************************************/
-MACHINE_CONFIG_START(novagf8_state::delta1)
-
+void delta1_state::delta1(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", F8, 2000000) // LC circuit, measured 2MHz
- MCFG_DEVICE_PROGRAM_MAP(delta1_map)
- MCFG_DEVICE_IO_MAP(delta1_io)
- MCFG_DEVICE_IRQ_ACKNOWLEDGE_DEVICE("f3853", f3853_device, int_acknowledge)
+ F8(config, m_maincpu, 2000000); // LC circuit, measured 2MHz
+ m_maincpu->set_addrmap(AS_PROGRAM, &delta1_state::main_map);
+ m_maincpu->set_addrmap(AS_IO, &delta1_state::main_io);
+ m_maincpu->set_irq_acknowledge_callback("f3853", FUNC(f3853_device::int_acknowledge));
f3853_device &f3853(F3853(config, "f3853", 2000000));
f3853.int_req_callback().set_inputline("maincpu", F8_INPUT_LINE_INT_REQ);
- MCFG_TIMER_DRIVER_ADD_PERIODIC("display_decay", novagf8_state, display_decay_tick, attotime::from_msec(1))
+ TIMER(config, "display_blink").configure_periodic(FUNC(delta1_state::blink), attotime::from_msec(250)); // approximation
+ TIMER(config, "display_decay").configure_periodic(FUNC(delta1_state::display_decay_tick), attotime::from_msec(1));
config.set_default_layout(layout_novag_delta1);
-MACHINE_CONFIG_END
+}
@@ -211,11 +193,13 @@ ROM_START( ccdelta1 )
ROM_LOAD("ma_winke_y1d", 0x0000, 0x1000, CRC(ddc04aca) SHA1(bbf334c82bc89b2f131f5a50f0a617bc3bc4c329) ) // 2332a
ROM_END
+} // anonymous namespace
+
/******************************************************************************
Drivers
******************************************************************************/
-// YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS
-CONS( 1979, ccdelta1, 0, 0, delta1, delta1, novagf8_state, empty_init, "Novag", "Chess Champion: Delta-1", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW | MACHINE_NOT_WORKING )
+// YEAR NAME PARENT CMP MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS
+CONS( 1979, ccdelta1, 0, 0, delta1, delta1, delta1_state, empty_init, "Novag", "Chess Champion: Delta-1", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW | MACHINE_CLICKABLE_ARTWORK )
diff --git a/src/mame/drivers/novag68k.cpp b/src/mame/drivers/novag_diablo.cpp
index 358e41755d6..9b9086401f5 100644
--- a/src/mame/drivers/novag68k.cpp
+++ b/src/mame/drivers/novag_diablo.cpp
@@ -2,20 +2,15 @@
// copyright-holders:hap
// thanks-to:yoyo_chessboard
/******************************************************************************
+*
+* novag_diablo.cpp, subdriver of machine/novagbase.cpp, machine/chessbase.cpp
- Novag generic 68000 based chess computer driver
+TODO:
+- hook up RS232 port (when connected, I'm only getting "New Game")
- NOTE: MAME doesn't include a generalized implementation for boardpieces yet,
- greatly affecting user playability of emulated electronic board games.
- As workaround for the chess games, use an external chess GUI on the side,
- such as Arena(in editmode).
+*******************************************************************************
- TODO:
- - RS232 port
-
-******************************************************************************
-
-Diablo 68000:
+Novag Diablo 68000 overview:
- M68000 @ 16MHz, IPL1 256Hz, IPL2 from ACIA IRQ(always high)
- 2*8KB RAM TC5565 battery-backed, 2*32KB hashtable RAM TC55257 3*32KB ROM
- HD44780 LCD controller (16x1)
@@ -29,6 +24,7 @@ Scorpio 68000 hardware is very similar, but with chessboard buttons and side led
#include "emu.h"
#include "includes/novagbase.h"
+#include "bus/rs232/rs232.h"
#include "cpu/m68000/m68000.h"
#include "machine/mos6551.h"
#include "machine/nvram.h"
@@ -40,44 +36,48 @@ Scorpio 68000 hardware is very similar, but with chessboard buttons and side led
#include "novag_scorpio68k.lh" // clickable
-class novag68k_state : public novagbase_state
+namespace {
+
+class diablo_state : public novagbase_state
{
public:
- novag68k_state(const machine_config &mconfig, device_type type, const char *tag)
- : novagbase_state(mconfig, type, tag)
+ diablo_state(const machine_config &mconfig, device_type type, const char *tag) :
+ novagbase_state(mconfig, type, tag),
+ m_screen(*this, "screen"),
+ m_acia(*this, "acia"),
+ m_rs232(*this, "rs232")
{ }
+ // machine drivers
void diablo68k(machine_config &config);
void scorpio68k(machine_config &config);
private:
- TIMER_DEVICE_CALLBACK_MEMBER(irq_on) { m_maincpu->set_input_line(M68K_IRQ_2, ASSERT_LINE); }
- TIMER_DEVICE_CALLBACK_MEMBER(irq_off) { m_maincpu->set_input_line(M68K_IRQ_2, CLEAR_LINE); }
-
- // Diablo 68000
- DECLARE_WRITE8_MEMBER(diablo68k_control_w);
- DECLARE_WRITE8_MEMBER(diablo68k_lcd_data_w);
- DECLARE_WRITE8_MEMBER(diablo68k_leds_w);
- DECLARE_READ8_MEMBER(diablo68k_input1_r);
- DECLARE_READ8_MEMBER(diablo68k_input2_r);
- void diablo68k_map(address_map &map);
+ // devices/pointers
+ required_device<screen_device> m_screen;
+ required_device<mos6551_device> m_acia;
+ required_device<rs232_port_device> m_rs232;
- // Scorpio 68000
- DECLARE_WRITE8_MEMBER(scorpio68k_control_w);
+ // address maps
+ void diablo68k_map(address_map &map);
void scorpio68k_map(address_map &map);
-};
-
+ // I/O handlers
+ DECLARE_WRITE8_MEMBER(control_w);
+ DECLARE_WRITE8_MEMBER(lcd_data_w);
+ DECLARE_WRITE8_MEMBER(leds_w);
+ DECLARE_READ8_MEMBER(input1_r);
+ DECLARE_READ8_MEMBER(input2_r);
+};
-// Devices, I/O
/******************************************************************************
- Diablo 68000
+ Devices, I/O
******************************************************************************/
// TTL
-WRITE8_MEMBER(novag68k_state::diablo68k_control_w)
+WRITE8_MEMBER(diablo_state::control_w)
{
// d0: HD44780 E
// d1: HD44780 RS
@@ -88,31 +88,34 @@ WRITE8_MEMBER(novag68k_state::diablo68k_control_w)
// d7: enable beeper
m_beeper->set_state(data >> 7 & 1);
+ // d2,d3: side leds(scorpio)
+ u8 leds2 = ~data >> 2 & 3;
+
// d4-d6: input mux, led select
m_inp_mux = 1 << (data >> 4 & 0x7) & 0xff;
- display_matrix(8, 8, m_led_data, m_inp_mux);
+ display_matrix(8+2, 8, m_led_data | leds2 << 8, m_inp_mux);
m_led_data = 0; // ?
}
-WRITE8_MEMBER(novag68k_state::diablo68k_lcd_data_w)
+WRITE8_MEMBER(diablo_state::lcd_data_w)
{
// d0-d7: HD44780 data
m_lcd_data = data;
}
-WRITE8_MEMBER(novag68k_state::diablo68k_leds_w)
+WRITE8_MEMBER(diablo_state::leds_w)
{
// d0-d7: chessboard leds
m_led_data = data;
}
-READ8_MEMBER(novag68k_state::diablo68k_input1_r)
+READ8_MEMBER(diablo_state::input1_r)
{
// d0-d7: multiplexed inputs (chessboard squares)
return ~read_inputs(8) & 0xff;
}
-READ8_MEMBER(novag68k_state::diablo68k_input2_r)
+READ8_MEMBER(diablo_state::input2_r)
{
// d0-d2: multiplexed inputs (side panel)
// other: ?
@@ -122,52 +125,27 @@ READ8_MEMBER(novag68k_state::diablo68k_input2_r)
/******************************************************************************
- Scorpio 68000
-******************************************************************************/
-
-WRITE8_MEMBER(novag68k_state::scorpio68k_control_w)
-{
- // d0: HD44780 E
- // d1: HD44780 RS
- if (m_lcd_control & ~data & 1)
- m_lcd->write(m_lcd_control >> 1 & 1, m_lcd_data);
- m_lcd_control = data & 3;
-
- // d7: enable beeper
- m_beeper->set_state(data >> 7 & 1);
-
- // d4-d6: input mux, led select
- // d2,d3: led data
- m_inp_mux = 1 << (data >> 4 & 0x7) & 0xff;
- display_matrix(2, 8, ~data >> 2 & 3, m_inp_mux);
-}
-
-
-
-/******************************************************************************
Address Maps
******************************************************************************/
-// Diablo 68000 / Scorpio 68000
-
-void novag68k_state::diablo68k_map(address_map &map)
+void diablo_state::diablo68k_map(address_map &map)
{
map(0x000000, 0x00ffff).rom();
map(0x200000, 0x20ffff).rom().region("maincpu", 0x10000);
map(0x280000, 0x28ffff).ram();
map(0x300000, 0x300007).rw("acia", FUNC(mos6551_device::read), FUNC(mos6551_device::write)).umask16(0xff00);
map(0x380000, 0x380001).nopr();
- map(0x380000, 0x380000).w(FUNC(novag68k_state::diablo68k_leds_w));
- map(0x3a0000, 0x3a0000).w(FUNC(novag68k_state::diablo68k_lcd_data_w));
- map(0x3c0000, 0x3c0000).rw(FUNC(novag68k_state::diablo68k_input2_r), FUNC(novag68k_state::diablo68k_control_w));
- map(0x3e0000, 0x3e0000).r(FUNC(novag68k_state::diablo68k_input1_r));
+ map(0x380000, 0x380000).w(FUNC(diablo_state::leds_w));
+ map(0x3a0000, 0x3a0000).w(FUNC(diablo_state::lcd_data_w));
+ map(0x3c0000, 0x3c0000).rw(FUNC(diablo_state::input2_r), FUNC(diablo_state::control_w));
+ map(0x3e0000, 0x3e0000).r(FUNC(diablo_state::input1_r));
map(0xff8000, 0xffbfff).ram().share("nvram");
}
-void novag68k_state::scorpio68k_map(address_map &map)
+void diablo_state::scorpio68k_map(address_map &map)
{
diablo68k_map(map);
- map(0x380000, 0x380000).w(FUNC(novag68k_state::scorpio68k_control_w));
+ map(0x380000, 0x380000).w(FUNC(diablo_state::control_w));
map(0x3c0000, 0x3c0001).nopw();
}
@@ -220,12 +198,12 @@ static INPUT_PORTS_START( diablo68k_sidepanel )
INPUT_PORTS_END
static INPUT_PORTS_START( diablo68k )
- PORT_INCLUDE( novag_cb_magnets )
+ PORT_INCLUDE( generic_cb_magnets )
PORT_INCLUDE( diablo68k_sidepanel )
INPUT_PORTS_END
static INPUT_PORTS_START( scorpio68k )
- PORT_INCLUDE( novag_cb_buttons )
+ PORT_INCLUDE( generic_cb_buttons )
PORT_INCLUDE( diablo68k_sidepanel )
INPUT_PORTS_END
@@ -235,52 +213,54 @@ INPUT_PORTS_END
Machine Drivers
******************************************************************************/
-MACHINE_CONFIG_START(novag68k_state::diablo68k)
-
+void diablo_state::diablo68k(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M68000, 16_MHz_XTAL)
- MCFG_DEVICE_PROGRAM_MAP(diablo68k_map)
- MCFG_TIMER_DRIVER_ADD_PERIODIC("irq_on", novag68k_state, irq_on, attotime::from_hz(32.768_kHz_XTAL/128)) // 256Hz
- MCFG_TIMER_START_DELAY(attotime::from_hz(32.768_kHz_XTAL/128) - attotime::from_nsec(1100)) // active for 1.1us
- MCFG_TIMER_DRIVER_ADD_PERIODIC("irq_off", novag68k_state, irq_off, attotime::from_hz(32.768_kHz_XTAL/128))
+ M68000(config, m_maincpu, 16_MHz_XTAL);
+ m_maincpu->set_addrmap(AS_PROGRAM, &diablo_state::diablo68k_map);
- mos6551_device &acia(MOS6551(config, "acia", 0));
- acia.set_xtal(1.8432_MHz_XTAL);
+ const attotime irq_period = attotime::from_hz(32.768_kHz_XTAL/128); // 256Hz
+ TIMER(config, m_irq_on).configure_periodic(FUNC(diablo_state::irq_on<M68K_IRQ_2>), irq_period);
+ m_irq_on->set_start_delay(irq_period - attotime::from_nsec(1100)); // active for 1.1us
+ TIMER(config, "irq_off").configure_periodic(FUNC(diablo_state::irq_off<M68K_IRQ_2>), irq_period);
+
+ MOS6551(config, m_acia).set_xtal(1.8432_MHz_XTAL);
+ RS232_PORT(config, m_rs232, default_rs232_devices, nullptr);
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
/* video hardware */
- MCFG_SCREEN_ADD("screen", LCD)
- MCFG_SCREEN_REFRESH_RATE(60) // arbitrary
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500))
- MCFG_SCREEN_SIZE(6*16+1, 10)
- MCFG_SCREEN_VISIBLE_AREA(0, 6*16, 0, 10-1)
- MCFG_SCREEN_UPDATE_DEVICE("hd44780", hd44780_device, screen_update)
- MCFG_SCREEN_PALETTE("palette")
- PALETTE(config, "palette", FUNC(novag68k_state::novag_lcd_palette), 3);
-
- MCFG_HD44780_ADD("hd44780")
- MCFG_HD44780_LCD_SIZE(2, 8)
- MCFG_HD44780_PIXEL_UPDATE_CB(novag68k_state, novag_lcd_pixel_update)
-
- MCFG_TIMER_DRIVER_ADD_PERIODIC("display_decay", novag68k_state, display_decay_tick, attotime::from_msec(1))
+ SCREEN(config, m_screen, SCREEN_TYPE_LCD);
+ m_screen->set_refresh_hz(60); // arbitrary
+ m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(2500));
+ m_screen->set_size(6*16+1, 10);
+ m_screen->set_visarea_full();
+ m_screen->set_screen_update("hd44780", FUNC(hd44780_device::screen_update));
+ m_screen->set_palette("palette");
+
+ PALETTE(config, "palette", FUNC(diablo_state::novag_lcd_palette), 3);
+
+ HD44780(config, m_lcd, 0);
+ m_lcd->set_lcd_size(2, 8);
+ m_lcd->set_pixel_update_cb(FUNC(diablo_state::novag_lcd_pixel_update), this);
+
+ TIMER(config, "display_decay").configure_periodic(FUNC(diablo_state::display_decay_tick), attotime::from_msec(1));
config.set_default_layout(layout_novag_diablo68k);
/* sound hardware */
SPEAKER(config, "mono").front_center();
BEEP(config, m_beeper, 32.768_kHz_XTAL/32); // 1024Hz
m_beeper->add_route(ALL_OUTPUTS, "mono", 0.25);
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(novag68k_state::scorpio68k)
+void diablo_state::scorpio68k(machine_config &config)
+{
diablo68k(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(scorpio68k_map)
-
+ m_maincpu->set_addrmap(AS_PROGRAM, &diablo_state::scorpio68k_map);
config.set_default_layout(layout_novag_scorpio68k);
-MACHINE_CONFIG_END
+}
@@ -303,12 +283,15 @@ ROM_START( scorpio68 )
ROM_LOAD16_BYTE("502.u4", 0x10000, 0x8000, CRC(553a5c8c) SHA1(ccb5460ff10766a5ca8008ae2cffcff794318108) ) // no odd rom
ROM_END
+} // anonymous namespace
+
/******************************************************************************
Drivers
******************************************************************************/
-// YEAR NAME PARENT CMP MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS
-CONS( 1991, diablo68, 0, 0, diablo68k, diablo68k, novag68k_state, empty_init, "Novag", "Diablo 68000", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
-CONS( 1991, scorpio68, 0, 0, scorpio68k, scorpio68k, novag68k_state, empty_init, "Novag", "Scorpio 68000", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
+// YEAR NAME PARENT CMP MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS
+CONS( 1991, diablo68, 0, 0, diablo68k, diablo68k, diablo_state, empty_init, "Novag", "Diablo 68000", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
+
+CONS( 1991, scorpio68, 0, 0, scorpio68k, scorpio68k, diablo_state, empty_init, "Novag", "Scorpio 68000", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
diff --git a/src/mame/drivers/novagmcs48.cpp b/src/mame/drivers/novag_presto.cpp
index 6066c821f14..bb0522d9fa9 100644
--- a/src/mame/drivers/novagmcs48.cpp
+++ b/src/mame/drivers/novag_presto.cpp
@@ -2,26 +2,20 @@
// copyright-holders:hap
// thanks-to:Berger
/******************************************************************************
+*
+* novag_presto.cpp, subdriver of machine/novagbase.cpp, machine/chessbase.cpp
- Novag generic MCS-48 based chess computer driver
+TODO:
+- is led handling correct? mux data needs to be auto cleared
+ similar to diablo/sexpert
- NOTE: MAME doesn't include a generalized implementation for boardpieces yet,
- greatly affecting user playability of emulated electronic board games.
- As workaround for the chess games, use an external chess GUI on the side,
- such as Arena(in editmode).
+*******************************************************************************
- TODO:
- - is presto led handling correct? mux data needs to be auto cleared
- similar to diablo/sexpert
-
-******************************************************************************
-
-Presto:
+Novag Presto overview:
- NEC D80C49C MCU(serial 186), OSC from LC circuit measured ~6MHz
- buzzer, 16+4 LEDs, 8*8 chessboard buttons
-Octo:
-- NEC D80C49HC MCU(serial 111), OSC from LC circuit measured ~12MHz
+Octo has a NEC D80C49HC MCU(serial 111), OSC from LC circuit measured ~12MHz
The buzzer has a little electronic circuit going on, not sure whatfor.
Otherwise, it's identical to Presto. The MCU internal ROM is same too.
@@ -38,45 +32,71 @@ Otherwise, it's identical to Presto. The MCU internal ROM is same too.
#include "novag_presto.lh" // clickable
-class novagmcs48_state : public novagbase_state
+namespace {
+
+class presto_state : public novagbase_state
{
public:
- novagmcs48_state(const machine_config &mconfig, device_type type, const char *tag)
- : novagbase_state(mconfig, type, tag)
+ presto_state(const machine_config &mconfig, device_type type, const char *tag) :
+ novagbase_state(mconfig, type, tag),
+ m_maincpu(*this, "maincpu")
{ }
+ // machine drivers
void presto(machine_config &config);
void octo(machine_config &config);
- DECLARE_INPUT_CHANGED_MEMBER(octo_cpu_freq);
+protected:
+ // devices/pointers
+ required_device<mcs48_cpu_device> m_maincpu;
+
+ // I/O handlers
+ DECLARE_WRITE8_MEMBER(mux_w);
+ DECLARE_WRITE8_MEMBER(control_w);
+ DECLARE_READ8_MEMBER(input_r);
+};
+
+class octo_state : public presto_state
+{
+public:
+ octo_state(const machine_config &mconfig, device_type type, const char *tag) :
+ presto_state(mconfig, type, tag)
+ { }
+
+ DECLARE_INPUT_CHANGED_MEMBER(octo_cpu_freq) { octo_set_cpu_freq(); }
-private:
- // Presto/Octo
- DECLARE_WRITE8_MEMBER(presto_mux_w);
- DECLARE_WRITE8_MEMBER(presto_control_w);
- DECLARE_READ8_MEMBER(presto_input_r);
- DECLARE_MACHINE_RESET(octo);
+protected:
+ virtual void machine_reset() override;
void octo_set_cpu_freq();
};
+void octo_state::machine_reset()
+{
+ presto_state::machine_reset();
+ octo_set_cpu_freq();
+}
+void octo_state::octo_set_cpu_freq()
+{
+ // Octo was released with either 12MHz or 15MHz CPU
+ m_maincpu->set_unscaled_clock((ioport("FAKE")->read() & 1) ? (15000000) : (12000000));
+}
-// Devices, I/O
/******************************************************************************
- Presto/Octo
+ Devices, I/O
******************************************************************************/
// MCU ports/generic
-WRITE8_MEMBER(novagmcs48_state::presto_mux_w)
+WRITE8_MEMBER(presto_state::mux_w)
{
// D0-D7: input mux low, led data
m_inp_mux = (m_inp_mux & ~0xff) | (~data & 0xff);
display_matrix(8, 3, m_inp_mux, m_led_select);
}
-WRITE8_MEMBER(novagmcs48_state::presto_control_w)
+WRITE8_MEMBER(presto_state::control_w)
{
// P21: input mux high
m_inp_mux = (m_inp_mux & 0xff) | (~data << 7 & 0x100);
@@ -89,24 +109,12 @@ WRITE8_MEMBER(novagmcs48_state::presto_control_w)
m_inp_mux &= ~0xff; // ?
}
-READ8_MEMBER(novagmcs48_state::presto_input_r)
+READ8_MEMBER(presto_state::input_r)
{
// P10-P17: multiplexed inputs
return ~read_inputs(9) & 0xff;
}
-void novagmcs48_state::octo_set_cpu_freq()
-{
- // Octo was released with either 12MHz or 15MHz CPU
- m_maincpu->set_unscaled_clock((ioport("FAKE")->read() & 1) ? (15000000) : (12000000));
-}
-
-MACHINE_RESET_MEMBER(novagmcs48_state, octo)
-{
- novagbase_state::machine_reset();
- octo_set_cpu_freq();
-}
-
/******************************************************************************
@@ -114,7 +122,7 @@ MACHINE_RESET_MEMBER(novagmcs48_state, octo)
******************************************************************************/
static INPUT_PORTS_START( presto )
- PORT_INCLUDE( novag_cb_buttons )
+ PORT_INCLUDE( generic_cb_buttons )
PORT_START("IN.8")
PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("Black/White") // Octo calls it "Change Color"
@@ -131,49 +139,41 @@ static INPUT_PORTS_START( octo )
PORT_INCLUDE( presto )
PORT_START("FAKE")
- PORT_CONFNAME( 0x01, 0x00, "CPU Frequency" ) PORT_CHANGED_MEMBER(DEVICE_SELF, novagmcs48_state, octo_cpu_freq, nullptr) // factory set
+ PORT_CONFNAME( 0x01, 0x00, "CPU Frequency" ) PORT_CHANGED_MEMBER(DEVICE_SELF, octo_state, octo_cpu_freq, nullptr) // factory set
PORT_CONFSETTING( 0x00, "12MHz" )
PORT_CONFSETTING( 0x01, "15MHz" )
INPUT_PORTS_END
-INPUT_CHANGED_MEMBER(novagmcs48_state::octo_cpu_freq)
-{
- octo_set_cpu_freq();
-}
-
/******************************************************************************
Machine Drivers
******************************************************************************/
-MACHINE_CONFIG_START(novagmcs48_state::presto)
-
+void presto_state::presto(machine_config &config)
+{
/* basic machine hardware */
- i8049_device &maincpu(I8049(config, m_maincpu, 6000000)); // LC circuit, measured 6MHz
- maincpu.p1_in_cb().set(FUNC(novagmcs48_state::presto_input_r));
- maincpu.p2_out_cb().set(FUNC(novagmcs48_state::presto_control_w));
- maincpu.bus_out_cb().set(FUNC(novagmcs48_state::presto_mux_w));
+ I8049(config, m_maincpu, 6000000); // LC circuit, measured 6MHz
+ m_maincpu->p1_in_cb().set(FUNC(presto_state::input_r));
+ m_maincpu->p2_out_cb().set(FUNC(presto_state::control_w));
+ m_maincpu->bus_out_cb().set(FUNC(presto_state::mux_w));
- MCFG_TIMER_DRIVER_ADD_PERIODIC("display_decay", novagmcs48_state, display_decay_tick, attotime::from_msec(1))
+ TIMER(config, "display_decay").configure_periodic(FUNC(presto_state::display_decay_tick), attotime::from_msec(1));
config.set_default_layout(layout_novag_presto);
/* sound hardware */
SPEAKER(config, "speaker").front_center();
- MCFG_DEVICE_ADD("dac", DAC_1BIT, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 0.25)
- MCFG_DEVICE_ADD("vref", VOLTAGE_REGULATOR, 0) MCFG_VOLTAGE_REGULATOR_OUTPUT(5.0)
- MCFG_SOUND_ROUTE(0, "dac", 1.0, DAC_VREF_POS_INPUT)
-MACHINE_CONFIG_END
+ DAC_1BIT(config, m_dac).add_route(ALL_OUTPUTS, "speaker", 0.25);
+ VOLTAGE_REGULATOR(config, "vref").add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT);
+}
-MACHINE_CONFIG_START(novagmcs48_state::octo)
+void presto_state::octo(machine_config &config)
+{
presto(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_CLOCK(12000000) // LC circuit, measured, see octo_set_cpu_freq
-
- MCFG_MACHINE_RESET_OVERRIDE(novagmcs48_state, octo)
-MACHINE_CONFIG_END
+ m_maincpu->set_clock(12000000); // LC circuit, measured, see octo_set_cpu_freq
+}
@@ -191,12 +191,14 @@ ROM_START( nocto )
ROM_LOAD("d80c49hc_111", 0x0000, 0x0800, CRC(29a0eb4c) SHA1(e058d6018e53ddcaa3b5ec25b33b8bff091b04db) ) // same program as npresto
ROM_END
+} // anonymous namespace
+
/******************************************************************************
Drivers
******************************************************************************/
-// YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS
-CONS( 1984, npresto, 0, 0, presto, presto, novagmcs48_state, empty_init, "Novag", "Presto (Novag)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
-CONS( 1987, nocto, npresto, 0, octo, octo, novagmcs48_state, empty_init, "Novag", "Octo (Novag)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
+// YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS
+CONS( 1984, npresto, 0, 0, presto, presto, presto_state, empty_init, "Novag", "Presto (Novag)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
+CONS( 1987, nocto, npresto, 0, octo, octo, octo_state, empty_init, "Novag", "Octo (Novag)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
diff --git a/src/mame/drivers/novag_scon.cpp b/src/mame/drivers/novag_scon.cpp
new file mode 100644
index 00000000000..b4b3ee4772f
--- /dev/null
+++ b/src/mame/drivers/novag_scon.cpp
@@ -0,0 +1,195 @@
+// license:BSD-3-Clause
+// copyright-holders:hap
+/******************************************************************************
+*
+* novag_scon.cpp, subdriver of machine/novagbase.cpp, machine/chessbase.cpp
+
+TODO:
+- verify IRQ and beeper frequency
+
+*******************************************************************************
+
+Novag Super Constellation Chess Computer (model 844) overview:
+- UMC UM6502C @ 4 MHz (8MHz XTAL), 600Hz? IRQ(source unknown?)
+- 2*2KB RAM TC5516APL-2 battery-backed, 2*32KB ROM custom label
+- TTL, buzzer, 24 LEDs, 8*8 chessboard buttons
+- external ports for clock and printer, not emulated here
+
+******************************************************************************/
+
+#include "emu.h"
+#include "includes/novagbase.h"
+
+#include "cpu/m6502/m6502.h"
+#include "machine/nvram.h"
+#include "speaker.h"
+
+// internal artwork
+#include "novag_supercon.lh" // clickable
+
+
+namespace {
+
+class scon_state : public novagbase_state
+{
+public:
+ scon_state(const machine_config &mconfig, device_type type, const char *tag) :
+ novagbase_state(mconfig, type, tag)
+ { }
+
+ // machine drivers
+ void scon(machine_config &config);
+
+private:
+ // address maps
+ void main_map(address_map &map);
+
+ // I/O handlers
+ DECLARE_WRITE8_MEMBER(mux_w);
+ DECLARE_WRITE8_MEMBER(control_w);
+ DECLARE_READ8_MEMBER(input1_r);
+ DECLARE_READ8_MEMBER(input2_r);
+};
+
+
+/******************************************************************************
+ Devices, I/O
+******************************************************************************/
+
+// TTL
+
+WRITE8_MEMBER(scon_state::mux_w)
+{
+ // d0-d7: input mux, led data
+ m_inp_mux = m_led_data = data;
+ display_matrix(8, 3, m_led_data, m_led_select);
+}
+
+WRITE8_MEMBER(scon_state::control_w)
+{
+ // d0-d3: ?
+ // d4-d6: select led row
+ m_led_select = data >> 4 & 7;
+ display_matrix(8, 3, m_led_data, m_led_select);
+
+ // d7: enable beeper
+ m_beeper->set_state(data >> 7 & 1);
+}
+
+READ8_MEMBER(scon_state::input1_r)
+{
+ // d0-d7: multiplexed inputs (chessboard squares)
+ return ~read_inputs(8) & 0xff;
+}
+
+READ8_MEMBER(scon_state::input2_r)
+{
+ // d0-d5: ?
+ // d6,d7: multiplexed inputs (side panel)
+ return (read_inputs(8) >> 2 & 0xc0) ^ 0xff;
+}
+
+
+
+/******************************************************************************
+ Address Maps
+******************************************************************************/
+
+void scon_state::main_map(address_map &map)
+{
+ map(0x0000, 0x0fff).ram().share("nvram");
+ map(0x1c00, 0x1c00).nopw(); // printer/clock?
+ map(0x1d00, 0x1d00).nopw(); // printer/clock?
+ map(0x1e00, 0x1e00).rw(FUNC(scon_state::input2_r), FUNC(scon_state::mux_w));
+ map(0x1f00, 0x1f00).rw(FUNC(scon_state::input1_r), FUNC(scon_state::control_w));
+ map(0x2000, 0xffff).rom();
+}
+
+
+
+/******************************************************************************
+ Input Ports
+******************************************************************************/
+
+static INPUT_PORTS_START( scon )
+ PORT_INCLUDE( generic_cb_buttons )
+
+ PORT_MODIFY("IN.0")
+ PORT_BIT(0x100, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_I) PORT_NAME("New Game")
+ PORT_BIT(0x200, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_8) PORT_NAME("Multi Move / Player/Player / King")
+
+ PORT_MODIFY("IN.1")
+ PORT_BIT(0x100, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_U) PORT_NAME("Verify / Set Up")
+ PORT_BIT(0x200, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_7) PORT_NAME("Best Move/Random / Training Level / Queen")
+
+ PORT_MODIFY("IN.2")
+ PORT_BIT(0x100, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_Y) PORT_NAME("Change Color")
+ PORT_BIT(0x200, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_6) PORT_NAME("Sound / Depth Search / Bishop")
+
+ PORT_MODIFY("IN.3")
+ PORT_BIT(0x100, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_T) PORT_NAME("Clear Board")
+ PORT_BIT(0x200, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_5) PORT_NAME("Solve Mate / Knight")
+
+ PORT_MODIFY("IN.4")
+ PORT_BIT(0x100, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_R) PORT_NAME("Print Moves")
+ PORT_BIT(0x200, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_4) PORT_NAME("Print Board / Rook")
+
+ PORT_MODIFY("IN.5")
+ PORT_BIT(0x100, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_E) PORT_NAME("Form Size")
+ PORT_BIT(0x200, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_3) PORT_NAME("Print List / Acc. Time / Pawn")
+
+ PORT_MODIFY("IN.6")
+ PORT_BIT(0x100, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_W) PORT_NAME("Hint")
+ PORT_BIT(0x200, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_2) PORT_NAME("Set Level")
+
+ PORT_MODIFY("IN.7")
+ PORT_BIT(0x100, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_Q) PORT_NAME("Go")
+ PORT_BIT(0x200, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_1) PORT_NAME("Take Back")
+INPUT_PORTS_END
+
+
+
+/******************************************************************************
+ Machine Drivers
+******************************************************************************/
+
+void scon_state::scon(machine_config &config)
+{
+ /* basic machine hardware */
+ M6502(config, m_maincpu, 8_MHz_XTAL/2); // UM6502C
+ m_maincpu->set_addrmap(AS_PROGRAM, &scon_state::main_map);
+ m_maincpu->set_periodic_int(FUNC(scon_state::irq0_line_hold), attotime::from_hz(600)); // guessed
+
+ NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_1);
+
+ TIMER(config, "display_decay").configure_periodic(FUNC(scon_state::display_decay_tick), attotime::from_msec(1));
+ config.set_default_layout(layout_novag_supercon);
+
+ /* sound hardware */
+ SPEAKER(config, "mono").front_center();
+ BEEP(config, m_beeper, 1024); // guessed
+ m_beeper->add_route(ALL_OUTPUTS, "mono", 0.25);
+}
+
+
+
+/******************************************************************************
+ ROM Definitions
+******************************************************************************/
+
+ROM_START( supercon )
+ ROM_REGION( 0x10000, "maincpu", 0 )
+ ROM_LOAD("novag_8441", 0x0000, 0x8000, CRC(b853cf6e) SHA1(1a759072a5023b92c07f1fac01b7a21f7b5b45d0) ) // label obscured by Q.C. sticker
+ ROM_LOAD("novag_8442", 0x8000, 0x8000, CRC(c8f82331) SHA1(f7fd039f9a3344db9749931490ded9e9e309cfbe) )
+ROM_END
+
+} // anonymous namespace
+
+
+
+/******************************************************************************
+ Drivers
+******************************************************************************/
+
+// YEAR NAME PARENT CMP MACHINE INPUT STATE INIT COMPANY, FULLNAME, FLAGS
+CONS( 1984, supercon, 0, 0, scon, scon, scon_state, empty_init, "Novag", "Super Constellation", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
diff --git a/src/mame/drivers/novag_sexpert.cpp b/src/mame/drivers/novag_sexpert.cpp
new file mode 100644
index 00000000000..7980386c952
--- /dev/null
+++ b/src/mame/drivers/novag_sexpert.cpp
@@ -0,0 +1,450 @@
+// license:BSD-3-Clause
+// copyright-holders:hap
+// thanks-to:Berger
+/******************************************************************************
+*
+* novag_sexpert.cpp, subdriver of machine/novagbase.cpp, machine/chessbase.cpp
+
+TODO:
+- sforte irq active time (21.5us is too long)
+- led handling is correct?
+
+*******************************************************************************
+
+Novag Super Expert (model 878/887/902) overview:
+- 65C02 @ 5MHz or 6MHz (10MHz or 12MHz XTAL)
+- 8KB RAM battery-backed, 3*32KB ROM
+- HD44780 LCD controller (16x1)
+- beeper(32KHz/32), IRQ(32KHz/128) via MC14060
+- optional R65C51P2 ACIA @ 1.8432MHz, for IBM PC interface (only works in version C?)
+- printer port, magnetic sensors, 8*8 chessboard leds
+
+I/O via TTL, hardware design was very awkward.
+
+Super Forte is very similar, just a cheaper plastic case and chessboard buttons
+instead of magnet sensors.
+
+******************************************************************************/
+
+#include "emu.h"
+#include "includes/novagbase.h"
+
+#include "bus/rs232/rs232.h"
+#include "cpu/m6502/m65c02.h"
+#include "machine/mos6551.h"
+#include "machine/nvram.h"
+#include "screen.h"
+#include "speaker.h"
+
+// internal artwork
+#include "novag_sexpert.lh" // clickable
+#include "novag_sforte.lh" // clickable
+
+
+namespace {
+
+class sexpert_state : public novagbase_state
+{
+public:
+ sexpert_state(const machine_config &mconfig, device_type type, const char *tag) :
+ novagbase_state(mconfig, type, tag),
+ m_screen(*this, "screen"),
+ m_acia(*this, "acia"),
+ m_rs232(*this, "rs232")
+ { }
+
+ // machine drivers
+ void sexpert(machine_config &config);
+
+ void init_sexpert();
+
+ DECLARE_INPUT_CHANGED_MEMBER(sexpert_cpu_freq) { sexpert_set_cpu_freq(); }
+
+protected:
+ // devices/pointers
+ required_device<screen_device> m_screen;
+ required_device<mos6551_device> m_acia;
+ required_device<rs232_port_device> m_rs232;
+
+ virtual void machine_reset() override;
+
+ void sexpert_set_cpu_freq();
+
+ // address maps
+ void sexpert_map(address_map &map);
+
+ // I/O handlers
+ virtual DECLARE_WRITE8_MEMBER(lcd_control_w);
+ virtual DECLARE_WRITE8_MEMBER(lcd_data_w);
+ DECLARE_WRITE8_MEMBER(leds_w);
+ DECLARE_WRITE8_MEMBER(mux_w);
+ DECLARE_READ8_MEMBER(input1_r);
+ DECLARE_READ8_MEMBER(input2_r);
+};
+
+class sforte_state : public sexpert_state
+{
+public:
+ sforte_state(const machine_config &mconfig, device_type type, const char *tag) :
+ sexpert_state(mconfig, type, tag)
+ { }
+
+ // machine drivers
+ void sforte(machine_config &config);
+
+private:
+ // address maps
+ void sforte_map(address_map &map);
+
+ // I/O handlers
+ virtual DECLARE_WRITE8_MEMBER(lcd_control_w) override;
+ virtual DECLARE_WRITE8_MEMBER(lcd_data_w) override;
+};
+
+void sexpert_state::sexpert_set_cpu_freq()
+{
+ // machines were released with either 5MHz or 6MHz CPU
+ m_maincpu->set_unscaled_clock((ioport("FAKE")->read() & 1) ? (12_MHz_XTAL/2) : (10_MHz_XTAL/2));
+}
+
+void sexpert_state::machine_reset()
+{
+ novagbase_state::machine_reset();
+
+ sexpert_set_cpu_freq();
+ m_rombank->set_entry(0);
+}
+
+void sexpert_state::init_sexpert()
+{
+ m_rombank->configure_entries(0, 2, memregion("maincpu")->base() + 0x8000, 0x8000);
+}
+
+
+/******************************************************************************
+ Devices, I/O
+******************************************************************************/
+
+// TTL/generic
+
+WRITE8_MEMBER(sexpert_state::lcd_control_w)
+{
+ // d0: HD44780 RS
+ // d1: HD44780 R/W
+ // d2: HD44780 E
+ if (m_lcd_control & ~data & 4 && ~data & 2)
+ m_lcd->write(m_lcd_control & 1, m_lcd_data);
+ m_lcd_control = data & 7;
+}
+
+WRITE8_MEMBER(sexpert_state::lcd_data_w)
+{
+ // d0-d7: HD44780 data
+ m_lcd_data = data;
+}
+
+WRITE8_MEMBER(sexpert_state::leds_w)
+{
+ // d0-d7: chessboard leds
+ m_led_data = data;
+}
+
+WRITE8_MEMBER(sexpert_state::mux_w)
+{
+ // d0: rom bankswitch
+ m_rombank->set_entry(data & 1);
+
+ // d3: enable beeper
+ m_beeper->set_state(data >> 3 & 1);
+
+ // d4-d7: 74145 to input mux/led select
+ m_inp_mux = 1 << (data >> 4 & 0xf) & 0xff;
+ display_matrix(8, 8, m_led_data, m_inp_mux);
+ m_led_data = 0; // ?
+}
+
+READ8_MEMBER(sexpert_state::input1_r)
+{
+ // d0-d7: multiplexed inputs (chessboard squares)
+ return ~read_inputs(8) & 0xff;
+}
+
+READ8_MEMBER(sexpert_state::input2_r)
+{
+ // d0-d2: printer port
+ // d5-d7: multiplexed inputs (side panel)
+ return ~read_inputs(8) >> 3 & 0xe0;
+}
+
+
+// sforte-specific
+
+WRITE8_MEMBER(sforte_state::lcd_control_w)
+{
+ // d3: rom bankswitch
+ m_rombank->set_entry(data >> 3 & 1);
+
+ // assume same as sexpert
+ sexpert_state::lcd_control_w(space, offset, data);
+}
+
+WRITE8_MEMBER(sforte_state::lcd_data_w)
+{
+ // d0-d2: input mux/led select
+ m_inp_mux = 1 << (data & 7);
+
+ // if lcd is disabled, misc control
+ if (~m_lcd_control & 4)
+ {
+ // d5,d6: led data, but not both at same time?
+ if ((data & 0x60) != 0x60)
+ display_matrix(2, 8, data >> 5 & 3, m_inp_mux);
+
+ // d7: enable beeper
+ m_beeper->set_state(data >> 7 & 1);
+ }
+
+ // assume same as sexpert
+ sexpert_state::lcd_data_w(space, offset, data);
+}
+
+
+
+/******************************************************************************
+ Address Maps
+******************************************************************************/
+
+void sexpert_state::sexpert_map(address_map &map)
+{
+ map(0x0000, 0x1fef).ram().share("nvram"); // 8KB RAM, but RAM CE pin is deactivated on $1ff0-$1fff
+ map(0x1ff0, 0x1ff0).r(FUNC(sexpert_state::input1_r));
+ map(0x1ff1, 0x1ff1).r(FUNC(sexpert_state::input2_r));
+ map(0x1ff2, 0x1ff2).nopw(); // printer
+ map(0x1ff3, 0x1ff3).nopw(); // printer
+ map(0x1ff4, 0x1ff4).w(FUNC(sexpert_state::leds_w));
+ map(0x1ff5, 0x1ff5).w(FUNC(sexpert_state::mux_w));
+ map(0x1ff6, 0x1ff6).w(FUNC(sexpert_state::lcd_control_w));
+ map(0x1ff7, 0x1ff7).w(FUNC(sexpert_state::lcd_data_w));
+ map(0x1ffc, 0x1fff).rw("acia", FUNC(mos6551_device::read), FUNC(mos6551_device::write));
+ map(0x2000, 0x7fff).rom();
+ map(0x8000, 0xffff).bankr("rombank");
+}
+
+void sforte_state::sforte_map(address_map &map)
+{
+ sexpert_map(map);
+ map(0x1ff4, 0x1ff4).nopw();
+ map(0x1ff5, 0x1ff5).nopw();
+ map(0x1ff6, 0x1ff6).w(FUNC(sforte_state::lcd_control_w));
+ map(0x1ff7, 0x1ff7).w(FUNC(sforte_state::lcd_data_w));
+}
+
+
+
+/******************************************************************************
+ Input Ports
+******************************************************************************/
+
+static INPUT_PORTS_START( sexy_shared )
+ PORT_MODIFY("IN.0")
+ PORT_BIT(0x100, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_A) PORT_NAME("Go")
+ PORT_BIT(0x200, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_Q) PORT_NAME("Take Back / Analyze Games")
+ PORT_BIT(0x400, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_1) PORT_NAME("->")
+
+ PORT_MODIFY("IN.1")
+ PORT_BIT(0x100, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_S) PORT_NAME("Set Level")
+ PORT_BIT(0x200, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_W) PORT_NAME("Flip Display / Time Control")
+ PORT_BIT(0x400, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_2) PORT_NAME("<-")
+
+ PORT_MODIFY("IN.2")
+ PORT_BIT(0x100, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_D) PORT_NAME("Hint / Next Best")
+ PORT_BIT(0x200, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_E) PORT_NAME("Priority / Tournament Book / Pawn")
+ PORT_BIT(0x400, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_3) PORT_NAME("Yes/Start / Start of Game")
+
+ PORT_MODIFY("IN.3")
+ PORT_BIT(0x100, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_F) PORT_NAME("Trace Forward / AutoPlay")
+ PORT_BIT(0x200, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_R) PORT_NAME("Pro-Op / Restore Game / Rook")
+ PORT_BIT(0x400, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_4) PORT_NAME("No/End / End of Game")
+
+ PORT_MODIFY("IN.4")
+ PORT_BIT(0x100, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_G) PORT_NAME("Clear Board / Delete Pro-Op")
+ PORT_BIT(0x200, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_T) PORT_NAME("Best Move/Random / Review / Knight")
+ PORT_BIT(0x400, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_5) PORT_NAME("Print Book / Store Game")
+
+ PORT_MODIFY("IN.5")
+ PORT_BIT(0x100, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_H) PORT_NAME("Change Color")
+ PORT_BIT(0x200, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_Y) PORT_NAME("Sound / Info / Bishop")
+ PORT_BIT(0x400, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_6) PORT_NAME("Print Moves / Print Evaluations")
+
+ PORT_MODIFY("IN.6")
+ PORT_BIT(0x100, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_J) PORT_NAME("Verify/Set Up / Pro-Op Book/Both Books")
+ PORT_BIT(0x200, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_U) PORT_NAME("Solve Mate / Infinite / Queen")
+ PORT_BIT(0x400, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_7) PORT_NAME("Print List / Acc. Time")
+
+ PORT_MODIFY("IN.7")
+ PORT_BIT(0x100, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_K) PORT_NAME("New Game")
+ PORT_BIT(0x200, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_I) PORT_NAME("Player/Player / Gambit Book / King")
+ PORT_BIT(0x400, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_8) PORT_NAME("Print Board / Interface")
+
+ PORT_START("FAKE")
+ PORT_CONFNAME( 0x01, 0x00, "CPU Frequency" ) PORT_CHANGED_MEMBER(DEVICE_SELF, sexpert_state, sexpert_cpu_freq, nullptr) // factory set
+ PORT_CONFSETTING( 0x00, "5MHz" )
+ PORT_CONFSETTING( 0x01, "6MHz" )
+INPUT_PORTS_END
+
+static INPUT_PORTS_START( sexpert )
+ PORT_INCLUDE( generic_cb_magnets )
+ PORT_INCLUDE( sexy_shared )
+INPUT_PORTS_END
+
+static INPUT_PORTS_START( sforte )
+ PORT_INCLUDE( generic_cb_buttons )
+ PORT_INCLUDE( sexy_shared )
+INPUT_PORTS_END
+
+
+
+/******************************************************************************
+ Machine Drivers
+******************************************************************************/
+
+void sexpert_state::sexpert(machine_config &config)
+{
+ /* basic machine hardware */
+ M65C02(config, m_maincpu, 10_MHz_XTAL/2); // or 12_MHz_XTAL/2
+ m_maincpu->set_addrmap(AS_PROGRAM, &sexpert_state::sexpert_map);
+
+ const attotime irq_period = attotime::from_hz(32.768_kHz_XTAL/128); // 256Hz
+ TIMER(config, m_irq_on).configure_periodic(FUNC(sexpert_state::irq_on<M6502_IRQ_LINE>), irq_period);
+ m_irq_on->set_start_delay(irq_period - attotime::from_nsec(21500)); // active for 21.5us
+ TIMER(config, "irq_off").configure_periodic(FUNC(sexpert_state::irq_off<M6502_IRQ_LINE>), irq_period);
+
+ MOS6551(config, m_acia).set_xtal(1.8432_MHz_XTAL); // R65C51P2 - RTS to CTS, DCD to GND
+ m_acia->irq_handler().set_inputline("maincpu", m65c02_device::NMI_LINE);
+ m_acia->rts_handler().set("acia", FUNC(mos6551_device::write_cts));
+ m_acia->txd_handler().set("rs232", FUNC(rs232_port_device::write_txd));
+ m_acia->dtr_handler().set("rs232", FUNC(rs232_port_device::write_dtr));
+
+ RS232_PORT(config, m_rs232, default_rs232_devices, nullptr);
+ m_rs232->rxd_handler().set("acia", FUNC(mos6551_device::write_rxd));
+ m_rs232->dsr_handler().set("acia", FUNC(mos6551_device::write_dsr));
+
+ NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_1);
+
+ /* video hardware */
+ SCREEN(config, m_screen, SCREEN_TYPE_LCD);
+ m_screen->set_refresh_hz(60); // arbitrary
+ m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(2500));
+ m_screen->set_size(6*16+1, 10);
+ m_screen->set_visarea_full();
+ m_screen->set_screen_update("hd44780", FUNC(hd44780_device::screen_update));
+ m_screen->set_palette("palette");
+
+ PALETTE(config, "palette", FUNC(sexpert_state::novag_lcd_palette), 3);
+
+ HD44780(config, m_lcd, 0);
+ m_lcd->set_lcd_size(2, 8);
+ m_lcd->set_pixel_update_cb(FUNC(sexpert_state::novag_lcd_pixel_update), this);
+
+ TIMER(config, "display_decay").configure_periodic(FUNC(sexpert_state::display_decay_tick), attotime::from_msec(1));
+ config.set_default_layout(layout_novag_sexpert);
+
+ /* sound hardware */
+ SPEAKER(config, "mono").front_center();
+ BEEP(config, m_beeper, 32.768_kHz_XTAL/32); // 1024Hz
+ m_beeper->add_route(ALL_OUTPUTS, "mono", 0.25);
+}
+
+void sforte_state::sforte(machine_config &config)
+{
+ sexpert(config);
+
+ /* basic machine hardware */
+ m_maincpu->set_addrmap(AS_PROGRAM, &sforte_state::sforte_map);
+
+ m_irq_on->set_start_delay(m_irq_on->period() - attotime::from_usec(11)); // active for ?us (assume same as cforte)
+
+ config.set_default_layout(layout_novag_sforte);
+}
+
+
+
+/******************************************************************************
+ ROM Definitions
+******************************************************************************/
+
+ROM_START( sexperta )
+ ROM_REGION( 0x18000, "maincpu", 0 )
+ ROM_LOAD("se_lo_b15.u3", 0x0000, 0x8000, CRC(6cc9527c) SHA1(29bab809399f2863a88a9c41535ecec0a4fd65ea) )
+ ROM_LOAD("se_hi1_b15.u1", 0x8000, 0x8000, CRC(6e57f0c0) SHA1(ea44769a6f54721fd4543366bda932e86e497d43) )
+ ROM_LOAD("sef_hi0_a23.u2", 0x10000, 0x8000, CRC(7d4e1528) SHA1(53c7d458a5571afae402f00ae3d0f5066634b068) )
+ROM_END
+
+ROM_START( sexpertb )
+ ROM_REGION( 0x18000, "maincpu", 0 )
+ ROM_LOAD("se_lo_619.u3", 0x0000, 0x8000, CRC(92002eb6) SHA1(ed8ca16701e00b48fa55c856fa4a8c6613079c02) )
+ ROM_LOAD("se_hi1_619.u1", 0x8000, 0x8000, CRC(814b4420) SHA1(c553e6a8c048dcc1cf48d410111a86e06b99d356) )
+ ROM_LOAD("sef_hi0_605.u2", 0x10000, 0x8000, CRC(bb07ad52) SHA1(30cf9005021ab2d7b03facdf2d3588bc94dc68a6) )
+ROM_END
+
+ROM_START( sexpertc )
+ ROM_REGION( 0x18000, "maincpu", 0 )
+ ROM_LOAD("se_lo_v3.6.u3", 0x0000, 0x8000, CRC(5a29105e) SHA1(be37bb29b530dbba847a5e8d27d81b36525e47f7) )
+ ROM_LOAD("se_hi1.u1", 0x8000, 0x8000, CRC(0085c2c4) SHA1(d84bf4afb022575db09dd9dc12e9b330acce35fa) )
+ ROM_LOAD("se_hi0.u2", 0x10000, 0x8000, CRC(2d085064) SHA1(76162322aa7d23a5c07e8356d0bbbb33816419af) )
+ROM_END
+
+ROM_START( sexpertc1 )
+ ROM_REGION( 0x18000, "maincpu", 0 )
+ ROM_LOAD("se_lo_v1.2.u3", 0x0000, 0x8000, CRC(43ed7a9e) SHA1(273c485e5be6b107b6c5c448003ba7686d4a6d06) )
+ ROM_LOAD("se_hi1.u1", 0x8000, 0x8000, CRC(0085c2c4) SHA1(d84bf4afb022575db09dd9dc12e9b330acce35fa) )
+ ROM_LOAD("se_hi0.u2", 0x10000, 0x8000, CRC(2d085064) SHA1(76162322aa7d23a5c07e8356d0bbbb33816419af) )
+ROM_END
+
+
+ROM_START( sfortea )
+ ROM_REGION( 0x18000, "maincpu", 0 )
+ ROM_LOAD("sfalo.u3", 0x0000, 0x8000, CRC(86e0230a) SHA1(0d6e18a17e636b8c7292c8f331349d361892d1a8) )
+ ROM_LOAD("sfahi.u1", 0x8000, 0x8000, CRC(81c02746) SHA1(0bf68b68ade5a3263bead88da0a8965fc71483c1) )
+ ROM_LOAD("sfabook.u2", 0x10000, 0x8000, CRC(3e42cf7c) SHA1(b2faa36a127e08e5755167a25ed4a07f12d62957) )
+ROM_END
+
+ROM_START( sfortea1 )
+ ROM_REGION( 0x18000, "maincpu", 0 )
+ ROM_LOAD("sfa_lo.u3", 0x0000, 0x8000, CRC(78734bfd) SHA1(b6d8e9efccee6f6d0b0cd257a82162bf8ccec719) )
+ ROM_LOAD("sfa_hi_1.u1", 0x8000, 0x8000, CRC(e5e84580) SHA1(bae55c3da7b720bf6ccfb450e383c53cebd5e9ef) )
+ ROM_LOAD("sfa_hi_0.u2", 0x10000, 0x8000, CRC(3e42cf7c) SHA1(b2faa36a127e08e5755167a25ed4a07f12d62957) )
+ROM_END
+
+ROM_START( sforteb )
+ ROM_REGION( 0x18000, "maincpu", 0 )
+ ROM_LOAD("forte_b_lo.u3", 0x0000, 0x8000, CRC(48bfe5d6) SHA1(323642686b6d2fb8db2b7d50c6cd431058078ce1) )
+ ROM_LOAD("forte_b_hi1.u1", 0x8000, 0x8000, CRC(9778ca2c) SHA1(d8b88b9768a1a9171c68cbb0892b817d68d78351) )
+ ROM_LOAD("forte_b_hi0.u2", 0x10000, 0x8000, CRC(bb07ad52) SHA1(30cf9005021ab2d7b03facdf2d3588bc94dc68a6) )
+ROM_END
+
+ROM_START( sfortec )
+ ROM_REGION( 0x18000, "maincpu", 0 )
+ ROM_LOAD("sfl_c_111.u3", 0x0000, 0x8000, CRC(f040cf30) SHA1(1fc1220b8ed67cdffa3866d230ce001721cf684f) ) // Toshiba TC57256AD-12
+ ROM_LOAD("sfh_c_111.u1", 0x8000, 0x8000, CRC(0f926b32) SHA1(9c7270ecb3f41dd9172a9a7928e6e04e64b2a340) ) // NEC D27C256AD-12
+ ROM_LOAD("h0_c_c26.u2", 0x10000, 0x8000, CRC(c6a1419a) SHA1(017a0ffa9aa59438c879624a7ddea2071d1524b8) ) // Toshiba TC57256AD-12
+ROM_END
+
+} // anonymous namespace
+
+
+
+/******************************************************************************
+ Drivers
+******************************************************************************/
+
+// YEAR NAME PARENT CMP MACHINE INPUT STATE INIT COMPANY, FULLNAME, FLAGS
+CONS( 1987, sexperta, 0, 0, sexpert, sexpert, sexpert_state, init_sexpert, "Novag", "Super Expert (version A)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
+CONS( 1988, sexpertb, sexperta, 0, sexpert, sexpert, sexpert_state, init_sexpert, "Novag", "Super Expert (version B)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
+CONS( 1990, sexpertc, sexperta, 0, sexpert, sexpert, sexpert_state, init_sexpert, "Novag", "Super Expert (version C, V3.6)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
+CONS( 1990, sexpertc1, sexperta, 0, sexpert, sexpert, sexpert_state, init_sexpert, "Novag", "Super Expert (version C, V1.2)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
+
+CONS( 1987, sfortea, 0, 0, sforte, sforte, sforte_state, init_sexpert, "Novag", "Super Forte (version A, set 1)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
+CONS( 1987, sfortea1, sfortea, 0, sforte, sforte, sforte_state, init_sexpert, "Novag", "Super Forte (version A, set 2)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
+CONS( 1988, sforteb, sfortea, 0, sforte, sforte, sforte_state, init_sexpert, "Novag", "Super Forte (version B)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
+CONS( 1990, sfortec, sfortea, 0, sforte, sforte, sforte_state, init_sexpert, "Novag", "Super Forte (version C)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
diff --git a/src/mame/drivers/nsm.cpp b/src/mame/drivers/nsm.cpp
index d8f10617a91..817578bebd7 100644
--- a/src/mame/drivers/nsm.cpp
+++ b/src/mame/drivers/nsm.cpp
@@ -65,18 +65,18 @@ void nsm_state::nsm_map(address_map &map)
void nsm_state::nsm_io_map(address_map &map)
{
// 00-71 selected by IC600 (74LS151)
- map(0x0000, 0x0001).r(FUNC(nsm_state::ff_r)); // 5v supply
- map(0x0010, 0x0011).nopr(); // antenna
- map(0x0020, 0x0021).nopr(); // reset circuit
- map(0x0030, 0x0031).r(FUNC(nsm_state::ff_r)); // service plug
- map(0x0040, 0x0041).r(FUNC(nsm_state::ff_r)); // service plug
- map(0x0050, 0x0051).r(FUNC(nsm_state::ff_r)); // test of internal battery
- map(0x0060, 0x0061).r(FUNC(nsm_state::ff_r)); // sum of analog outputs of ay2
- //AM_RANGE(0x0070, 0x0071) AM_READNOP // serial data in
- map(0x0f70, 0x0f7d).nopw();
- map(0x0fe4, 0x0fff).nopr();
- map(0x7fb0, 0x7fbf).w(FUNC(nsm_state::cru_w));
- map(0x7fd0, 0x7fd1).w(FUNC(nsm_state::oe_w));
+ map(0x0000, 0x001f).r(FUNC(nsm_state::ff_r)); // 5v supply
+ map(0x0100, 0x011f).nopr(); // antenna
+ map(0x0200, 0x021f).nopr(); // reset circuit
+ map(0x0300, 0x031f).r(FUNC(nsm_state::ff_r)); // service plug
+ map(0x0400, 0x041f).r(FUNC(nsm_state::ff_r)); // service plug
+ map(0x0500, 0x051f).r(FUNC(nsm_state::ff_r)); // test of internal battery
+ map(0x0600, 0x061f).r(FUNC(nsm_state::ff_r)); // sum of analog outputs of ay2
+ //map(0x0700, 0x071f).nopr(); // serial data in
+ map(0x1ee0, 0x1efb).nopw();
+ map(0xfe40, 0xffff).nopr();
+ map(0xff60, 0xff7f).w(FUNC(nsm_state::cru_w));
+ map(0xffa0, 0xffa3).w(FUNC(nsm_state::oe_w));
}
static INPUT_PORTS_START( nsm )
diff --git a/src/mame/drivers/nsmpoker.cpp b/src/mame/drivers/nsmpoker.cpp
index 3245fade5a9..a9f4e995120 100644
--- a/src/mame/drivers/nsmpoker.cpp
+++ b/src/mame/drivers/nsmpoker.cpp
@@ -175,7 +175,7 @@ INTERRUPT_GEN_MEMBER(nsmpoker_state::nsmpoker_interrupt)
READ8_MEMBER(nsmpoker_state::debug_r)
{
- return machine().rand() & 0xff;
+ return BIT(machine().rand(), offset);
}
@@ -194,8 +194,8 @@ void nsmpoker_state::nsmpoker_map(address_map &map)
void nsmpoker_state::nsmpoker_portmap(address_map &map)
{
- map.global_mask(0xff);
- map(0xf0, 0xf0).r(FUNC(nsmpoker_state::debug_r)); // kind of trap at beginning
+ map.global_mask(0xfff);
+ map(0xf00, 0xf0f).r(FUNC(nsmpoker_state::debug_r)); // kind of trap at beginning
}
/* I/O byte R/W
@@ -419,8 +419,8 @@ void nsmpoker_state::machine_reset()
* Machine Drivers *
*************************/
-MACHINE_CONFIG_START(nsmpoker_state::nsmpoker)
-
+void nsmpoker_state::nsmpoker(machine_config &config)
+{
// CPU TMS9995, standard variant; no line connections
TMS9995(config, m_maincpu, MASTER_CLOCK/2);
m_maincpu->set_addrmap(AS_PROGRAM, &nsmpoker_state::nsmpoker_map);
@@ -428,18 +428,17 @@ MACHINE_CONFIG_START(nsmpoker_state::nsmpoker)
m_maincpu->set_vblank_int("screen", FUNC(nsmpoker_state::nsmpoker_interrupt));
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(32*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 0*8, 32*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(nsmpoker_state, screen_update_nsmpoker)
- MCFG_SCREEN_PALETTE("palette")
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(32*8, 32*8);
+ screen.set_visarea(0*8, 32*8-1, 0*8, 32*8-1);
+ screen.set_screen_update(FUNC(nsmpoker_state::screen_update_nsmpoker));
+ screen.set_palette("palette");
GFXDECODE(config, m_gfxdecode, "palette", gfx_nsmpoker);
PALETTE(config, "palette", FUNC(nsmpoker_state::nsmpoker_palette), 16);
-
-MACHINE_CONFIG_END
+}
/*************************
diff --git a/src/mame/drivers/nss.cpp b/src/mame/drivers/nss.cpp
index 2071ad6b0cc..0586a8d61a8 100644
--- a/src/mame/drivers/nss.cpp
+++ b/src/mame/drivers/nss.cpp
@@ -832,24 +832,24 @@ void nss_state::machine_reset()
m_joy_flag = 1;
}
-MACHINE_CONFIG_START(nss_state::nss)
-
+void nss_state::nss(machine_config &config)
+{
/* base snes hardware */
- MCFG_DEVICE_ADD("maincpu", _5A22, MCLK_NTSC) /* 2.68Mhz, also 3.58Mhz */
- MCFG_DEVICE_PROGRAM_MAP(snes_map)
+ _5A22(config, m_maincpu, MCLK_NTSC); /* 2.68Mhz, also 3.58Mhz */
+ m_maincpu->set_addrmap(AS_PROGRAM, &nss_state::snes_map);
// runs at 24.576 MHz / 12 = 2.048 MHz
- MCFG_DEVICE_ADD("soundcpu", SPC700, XTAL(24'576'000) / 12)
- MCFG_DEVICE_PROGRAM_MAP(spc_mem)
+ SPC700(config, m_soundcpu, XTAL(24'576'000) / 12);
+ m_soundcpu->set_addrmap(AS_PROGRAM, &nss_state::spc_mem);
- MCFG_QUANTUM_PERFECT_CPU("maincpu")
+ config.m_perfect_cpu_quantum = subtag("maincpu");
/* nss hardware */
- MCFG_DEVICE_ADD("bios", Z80, 4000000)
- MCFG_DEVICE_PROGRAM_MAP(bios_map)
- MCFG_DEVICE_IO_MAP(bios_io_map)
+ Z80(config, m_bioscpu, 4000000);
+ m_bioscpu->set_addrmap(AS_PROGRAM, &nss_state::bios_map);
+ m_bioscpu->set_addrmap(AS_IO, &nss_state::bios_io_map);
- MCFG_M50458_ADD("m50458", 4000000, "osd") /* TODO: correct clock */
+ M50458(config, m_m50458, 4000000, "osd"); /* TODO: correct clock */
S3520CF(config, m_s3520cf); /* RTC */
RP5H01(config, m_rp5h01, 0);
M6M80011AP(config, "m6m80011ap");
@@ -857,32 +857,32 @@ MACHINE_CONFIG_START(nss_state::nss)
/* sound hardware */
SPEAKER(config, "lspeaker").front_left();
SPEAKER(config, "rspeaker").front_right();
- MCFG_DEVICE_ADD("spc700", SNES_SOUND)
- MCFG_SOUND_ROUTE(0, "lspeaker", 1.00)
- MCFG_SOUND_ROUTE(1, "rspeaker", 1.00)
+ SNES_SOUND(config, m_spc700);
+ m_spc700->add_route(0, "lspeaker", 1.00);
+ m_spc700->add_route(1, "rspeaker", 1.00);
/* video hardware */
/* TODO: the screen should actually superimpose, but for the time being let's just separate outputs */
config.set_default_layout(layout_dualhsxs);
// SNES PPU
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_RAW_PARAMS(DOTCLK_NTSC, SNES_HTOTAL, 0, SNES_SCR_WIDTH, SNES_VTOTAL_NTSC, 0, SNES_SCR_HEIGHT_NTSC)
- MCFG_SCREEN_UPDATE_DRIVER( snes_state, screen_update )
- MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE(*this, nss_state, nss_vblank_irq))
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_raw(DOTCLK_NTSC, SNES_HTOTAL, 0, SNES_SCR_WIDTH, SNES_VTOTAL_NTSC, 0, SNES_SCR_HEIGHT_NTSC);
+ m_screen->set_screen_update(FUNC(snes_state::screen_update));
+ m_screen->screen_vblank().set(FUNC(nss_state::nss_vblank_irq));
SNES_PPU(config, m_ppu, MCLK_NTSC);
m_ppu->open_bus_callback().set([this] { return snes_open_bus_r(); }); // lambda because overloaded function name
m_ppu->set_screen("screen");
// NSS
- MCFG_SCREEN_ADD("osd", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500))
- MCFG_SCREEN_SIZE(288+22, 216+22)
- MCFG_SCREEN_VISIBLE_AREA(0, 288-1, 0, 216-1)
- MCFG_SCREEN_UPDATE_DRIVER(nss_state,screen_update)
-MACHINE_CONFIG_END
+ screen_device &osd(SCREEN(config, "osd", SCREEN_TYPE_RASTER));
+ osd.set_refresh_hz(60);
+ osd.set_vblank_time(ATTOSECONDS_IN_USEC(2500));
+ osd.set_size(288+22, 216+22);
+ osd.set_visarea(0, 288-1, 0, 216-1);
+ osd.set_screen_update(FUNC(nss_state::screen_update));
+}
/***************************************************************************
diff --git a/src/mame/drivers/nycaptor.cpp b/src/mame/drivers/nycaptor.cpp
index 722a9e3853a..c522d0aead7 100644
--- a/src/mame/drivers/nycaptor.cpp
+++ b/src/mame/drivers/nycaptor.cpp
@@ -798,7 +798,6 @@ void nycaptor_state::nycaptor(machine_config &config)
DAC_8BIT_R2R(config, "dac", 0).add_route(ALL_OUTPUTS, "speaker", 0.25); // unknown DAC
voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref", 0));
- vref.set_output(5.0);
vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT);
vref.add_route(0, "dac", -1.0, DAC_VREF_NEG_INPUT);
}
@@ -868,7 +867,6 @@ void nycaptor_state::cyclshtg(machine_config &config)
DAC_8BIT_R2R(config, "dac", 0).add_route(ALL_OUTPUTS, "speaker", 0.25); // unknown DAC
voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref", 0));
- vref.set_output(5.0);
vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT);
vref.add_route(0, "dac", -1.0, DAC_VREF_NEG_INPUT);
}
@@ -936,7 +934,6 @@ void nycaptor_state::bronx(machine_config &config)
DAC_8BIT_R2R(config, "dac", 0).add_route(ALL_OUTPUTS, "speaker", 0.25); // unknown DAC
voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref", 0));
- vref.set_output(5.0);
vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT);
vref.add_route(0, "dac", -1.0, DAC_VREF_NEG_INPUT);
}
diff --git a/src/mame/drivers/nyny.cpp b/src/mame/drivers/nyny.cpp
index c8f9650be34..70c933ae030 100644
--- a/src/mame/drivers/nyny.cpp
+++ b/src/mame/drivers/nyny.cpp
@@ -415,8 +415,8 @@ READ8_MEMBER(nyny_state::nyny_pia_1_2_r)
uint8_t ret = 0;
/* the address bits are directly connected to the chip selects */
- if (BIT(offset, 2)) ret = m_pia1->read(space, offset & 0x03);
- if (BIT(offset, 3)) ret = m_pia2->read_alt(space, offset & 0x03);
+ if (BIT(offset, 2)) ret = m_pia1->read(offset & 0x03);
+ if (BIT(offset, 3)) ret = m_pia2->read_alt(offset & 0x03);
return ret;
}
@@ -425,8 +425,8 @@ READ8_MEMBER(nyny_state::nyny_pia_1_2_r)
WRITE8_MEMBER(nyny_state::nyny_pia_1_2_w)
{
/* the address bits are directly connected to the chip selects */
- if (BIT(offset, 2)) m_pia1->write(space, offset & 0x03, data);
- if (BIT(offset, 3)) m_pia2->write_alt(space, offset & 0x03, data);
+ if (BIT(offset, 2)) m_pia1->write(offset & 0x03, data);
+ if (BIT(offset, 3)) m_pia2->write_alt(offset & 0x03, data);
}
@@ -596,25 +596,25 @@ void nyny_state::machine_reset()
*
*************************************/
-MACHINE_CONFIG_START(nyny_state::nyny)
-
+void nyny_state::nyny(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", MC6809, 5600000) /* 1.40 MHz? The clock signal is generated by analog chips */
- MCFG_DEVICE_PROGRAM_MAP(nyny_main_map)
- MCFG_DEVICE_PERIODIC_INT_DRIVER(nyny_state, update_pia_1, 25)
+ MC6809(config, m_maincpu, 5600000); /* 1.40 MHz? The clock signal is generated by analog chips */
+ m_maincpu->set_addrmap(AS_PROGRAM, &nyny_state::nyny_main_map);
+ m_maincpu->set_periodic_int(FUNC(nyny_state::update_pia_1), attotime::from_hz(25));
- MCFG_DEVICE_ADD("audiocpu", M6802, AUDIO_CPU_1_CLOCK)
- MCFG_DEVICE_PROGRAM_MAP(nyny_audio_1_map)
+ M6802(config, m_audiocpu, AUDIO_CPU_1_CLOCK);
+ m_audiocpu->set_addrmap(AS_PROGRAM, &nyny_state::nyny_audio_1_map);
- MCFG_DEVICE_ADD("audio2", M6802, AUDIO_CPU_2_CLOCK)
- MCFG_DEVICE_PROGRAM_MAP(nyny_audio_2_map)
+ M6802(config, m_audiocpu2, AUDIO_CPU_2_CLOCK);
+ m_audiocpu2->set_addrmap(AS_PROGRAM, &nyny_state::nyny_audio_2_map);
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_RAW_PARAMS(PIXEL_CLOCK, 256, 0, 256, 256, 0, 256) /* temporary, CRTC will configure screen */
- MCFG_SCREEN_UPDATE_DEVICE("crtc", mc6845_device, screen_update)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_raw(PIXEL_CLOCK, 256, 0, 256, 256, 0, 256); /* temporary, CRTC will configure screen */
+ screen.set_screen_update("crtc", FUNC(mc6845_device::screen_update));
PALETTE(config, m_palette, palette_device::RGB_3BIT);
@@ -668,10 +668,11 @@ MACHINE_CONFIG_START(nyny_state::nyny)
AY8910(config, "ay3", AUDIO_CPU_2_CLOCK).add_route(ALL_OUTPUTS, "speaker", 0.03);
- MCFG_DEVICE_ADD("dac", DAC_8BIT_R2R, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 0.25) // unknown DAC
- MCFG_DEVICE_ADD("vref", VOLTAGE_REGULATOR, 0) MCFG_VOLTAGE_REGULATOR_OUTPUT(5.0)
- MCFG_SOUND_ROUTE(0, "dac", 1.0, DAC_VREF_POS_INPUT) MCFG_SOUND_ROUTE(0, "dac", -1.0, DAC_VREF_NEG_INPUT)
-MACHINE_CONFIG_END
+ DAC_8BIT_R2R(config, "dac", 0).add_route(ALL_OUTPUTS, "speaker", 0.25); // unknown DAC
+ voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref"));
+ vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT);
+ vref.add_route(0, "dac", -1.0, DAC_VREF_NEG_INPUT);
+}
diff --git a/src/mame/drivers/ob68k1a.cpp b/src/mame/drivers/ob68k1a.cpp
index 6b3f02220eb..e7efa1696fe 100644
--- a/src/mame/drivers/ob68k1a.cpp
+++ b/src/mame/drivers/ob68k1a.cpp
@@ -76,9 +76,9 @@ Notes:
READ8_MEMBER( ob68k1a_state::pia_r )
{
if (offset) {
- return m_pia1->read(space,0);
+ return m_pia1->read(0);
} else {
- return m_pia0->read(space,0);
+ return m_pia0->read(0);
}
}
@@ -90,9 +90,9 @@ READ8_MEMBER( ob68k1a_state::pia_r )
WRITE8_MEMBER( ob68k1a_state::pia_w )
{
if (offset) {
- m_pia1->write(space,0,data);
+ m_pia1->write(0,data);
} else {
- m_pia0->write(space,0,data);
+ m_pia0->write(0,data);
}
}
@@ -160,8 +160,8 @@ void ob68k1a_state::machine_start()
void ob68k1a_state::machine_reset()
{
// initialize COM8116
- m_dbrg->write_stt(0x0e);
- m_dbrg->write_str(0x0e);
+ m_dbrg->stt_w(0x0e);
+ m_dbrg->str_w(0x0e);
// set reset vector
void *ram = m_maincpu->space(AS_PROGRAM).get_write_ptr(0);
@@ -179,7 +179,7 @@ void ob68k1a_state::machine_reset()
//**************************************************************************
//-------------------------------------------------
-// MACHINE_CONFIG( ob68k1a )
+// machine_config( ob68k1a )
//-------------------------------------------------
void ob68k1a_state::ob68k1a(machine_config &config)
diff --git a/src/mame/drivers/octopus.cpp b/src/mame/drivers/octopus.cpp
index ce0d1e97811..7b9f7686b27 100644
--- a/src/mame/drivers/octopus.cpp
+++ b/src/mame/drivers/octopus.cpp
@@ -524,9 +524,9 @@ READ8_MEMBER(octopus_state::rtc_r)
uint8_t ret = 0xff;
if(m_rtc_data)
- ret = m_rtc->read(space,1);
+ ret = m_rtc->read(1);
else if(m_rtc_address)
- ret = m_rtc->read(space,0);
+ ret = m_rtc->read(0);
return ret;
}
@@ -534,9 +534,9 @@ READ8_MEMBER(octopus_state::rtc_r)
WRITE8_MEMBER(octopus_state::rtc_w)
{
if(m_rtc_data)
- m_rtc->write(space,1,data);
+ m_rtc->write(1,data);
else if(m_rtc_address)
- m_rtc->write(space,0,data);
+ m_rtc->write(0,data);
}
// RTC/FDC control - PPI port B
@@ -895,16 +895,17 @@ void octopus_centronics_devices(device_slot_interface &device)
device.option_add("printer", CENTRONICS_PRINTER);
}
-MACHINE_CONFIG_START(octopus_state::octopus)
+void octopus_state::octopus(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu",I8088, 24_MHz_XTAL / 3) // 8MHz
- MCFG_DEVICE_PROGRAM_MAP(octopus_mem)
- MCFG_DEVICE_IO_MAP(octopus_io)
- MCFG_DEVICE_IRQ_ACKNOWLEDGE_DRIVER(octopus_state, x86_irq_cb)
+ I8088(config, m_maincpu, 24_MHz_XTAL / 3); // 8MHz
+ m_maincpu->set_addrmap(AS_PROGRAM, &octopus_state::octopus_mem);
+ m_maincpu->set_addrmap(AS_IO, &octopus_state::octopus_io);
+ m_maincpu->set_irq_acknowledge_callback(FUNC(octopus_state::x86_irq_cb));
- MCFG_DEVICE_ADD("subcpu",Z80, 24_MHz_XTAL / 4) // 6MHz
- MCFG_DEVICE_PROGRAM_MAP(octopus_sub_mem)
- MCFG_DEVICE_IO_MAP(octopus_sub_io)
+ Z80(config, m_subcpu, 24_MHz_XTAL / 4); // 6MHz
+ m_subcpu->set_addrmap(AS_PROGRAM, &octopus_state::octopus_sub_mem);
+ m_subcpu->set_addrmap(AS_IO, &octopus_state::octopus_sub_io);
AM9517A(config, m_dma1, 24_MHz_XTAL / 6); // 4MHz
m_dma1->out_hreq_callback().set(m_dma2, FUNC(am9517a_device::dreq0_w));
@@ -968,17 +969,17 @@ MACHINE_CONFIG_START(octopus_state::octopus)
m_kb_uart->rts_handler().set(FUNC(octopus_state::beep_w));
rs232_port_device &keyboard_port(RS232_PORT(config, "keyboard_port", keyboard, "octopus"));
keyboard_port.rxd_handler().set(m_kb_uart, FUNC(i8251_device::write_rxd));
- MCFG_DEVICE_ADD("keyboard_clock_rx", CLOCK, 9600 * 64)
- MCFG_CLOCK_SIGNAL_HANDLER(WRITELINE(m_kb_uart,i8251_device,write_rxc))
- MCFG_DEVICE_ADD("keyboard_clock_tx", CLOCK, 1200 * 64)
- MCFG_CLOCK_SIGNAL_HANDLER(WRITELINE(m_kb_uart,i8251_device,write_txc))
+ clock_device &keyboard_clock_rx(CLOCK(config, "keyboard_clock_rx", 9600 * 64));
+ keyboard_clock_rx.signal_handler().set(m_kb_uart, FUNC(i8251_device::write_rxc));
+ clock_device &keyboard_clock_tx(CLOCK(config, "keyboard_clock_tx", 1200 * 64));
+ keyboard_clock_tx.signal_handler().set(m_kb_uart, FUNC(i8251_device::write_txc));
FD1793(config, m_fdc, 16_MHz_XTAL / 8);
m_fdc->intrq_wr_callback().set(m_pic1, FUNC(pic8259_device::ir5_w));
m_fdc->drq_wr_callback().set(m_dma2, FUNC(am9517a_device::dreq1_w));
- MCFG_FLOPPY_DRIVE_ADD("fdc:0", octopus_floppies, "525dd", floppy_image_device::default_floppy_formats)
- MCFG_FLOPPY_DRIVE_ADD("fdc:1", octopus_floppies, "525dd", floppy_image_device::default_floppy_formats)
- MCFG_SOFTWARE_LIST_ADD("fd_list","octopus")
+ FLOPPY_CONNECTOR(config, "fdc:0", octopus_floppies, "525dd", floppy_image_device::default_floppy_formats);
+ FLOPPY_CONNECTOR(config, "fdc:1", octopus_floppies, "525dd", floppy_image_device::default_floppy_formats);
+ SOFTWARE_LIST(config, "fd_list").set_original("octopus");
PIT8253(config, m_pit, 0);
m_pit->set_clk<0>(4.9152_MHz_XTAL / 2); // DART channel A
@@ -989,8 +990,7 @@ MACHINE_CONFIG_START(octopus_state::octopus)
m_pit->out_handler<2>().set(FUNC(octopus_state::spk_freq_w));
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("speaker", SPEAKER_SOUND)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.50)
+ SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.50);
Z80SIO(config, m_serial, 16_MHz_XTAL / 4); // clock rate not mentioned in tech manual
m_serial->out_int_callback().set(m_pic1, FUNC(pic8259_device::ir1_w));
@@ -1008,9 +1008,9 @@ MACHINE_CONFIG_START(octopus_state::octopus)
serial_b.cts_handler().set(m_serial, FUNC(z80sio_device::ctsb_w)).invert();
//serial_b.ri_handler().set(m_serial, FUNC(z80sio_device::rib_w)).invert();
- MCFG_DEVICE_ADD(m_parallel, CENTRONICS, octopus_centronics_devices, "printer")
- MCFG_CENTRONICS_BUSY_HANDLER(WRITELINE(*this, octopus_state, parallel_busy_w))
- MCFG_CENTRONICS_SELECT_HANDLER(WRITELINE(*this, octopus_state, parallel_slctout_w))
+ CENTRONICS(config, m_parallel, octopus_centronics_devices, "printer");
+ m_parallel->busy_handler().set(FUNC(octopus_state::parallel_busy_w));
+ m_parallel->select_handler().set(FUNC(octopus_state::parallel_slctout_w));
// TODO: Winchester HD controller (Xebec/SASI compatible? uses TTL logic)
/* video hardware */
@@ -1029,8 +1029,7 @@ MACHINE_CONFIG_START(octopus_state::octopus)
ADDRESS_MAP_BANK(config, "z80_bank").set_map(&octopus_state::octopus_mem).set_options(ENDIANNESS_LITTLE, 8, 32, 0x10000);
RAM(config, "ram").set_default_size("256K").set_extra_options("128K,512K,768K");
-
-MACHINE_CONFIG_END
+}
/* ROM definition */
ROM_START( octopus )
diff --git a/src/mame/drivers/odyssey.cpp b/src/mame/drivers/odyssey.cpp
index 7e88e16b326..628fe45caa9 100644
--- a/src/mame/drivers/odyssey.cpp
+++ b/src/mame/drivers/odyssey.cpp
@@ -133,20 +133,20 @@ void odyssey_state::machine_reset()
* Machine Config *
**************************************/
-MACHINE_CONFIG_START(odyssey_state::odyssey)
-
+void odyssey_state::odyssey(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", PENTIUM, 133000000) // a Celeron at 1.70 GHz on the MB I checked.
- MCFG_DEVICE_PROGRAM_MAP(odyssey_map)
+ PENTIUM(config, m_maincpu, 133000000); // a Celeron at 1.70 GHz on the MB I checked.
+ m_maincpu->set_addrmap(AS_PROGRAM, &odyssey_state::odyssey_map);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(640, 480)
- MCFG_SCREEN_VISIBLE_AREA(0, 640-1, 0, 480-1)
- MCFG_SCREEN_UPDATE_DRIVER(odyssey_state, screen_update)
-MACHINE_CONFIG_END
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(640, 480);
+ screen.set_visarea(0, 640-1, 0, 480-1);
+ screen.set_screen_update(FUNC(odyssey_state::screen_update));
+}
/**************************************
diff --git a/src/mame/drivers/odyssey2.cpp b/src/mame/drivers/odyssey2.cpp
index 514a9ec6228..edd3f07a9b8 100644
--- a/src/mame/drivers/odyssey2.cpp
+++ b/src/mame/drivers/odyssey2.cpp
@@ -673,14 +673,16 @@ GFXDECODE_END
-MACHINE_CONFIG_START(odyssey2_state::odyssey2_cartslot)
- MCFG_O2_CARTRIDGE_ADD("cartslot", o2_cart, nullptr)
+void odyssey2_state::odyssey2_cartslot(machine_config &config)
+{
+ O2_CART_SLOT(config, m_cart, o2_cart, nullptr);
- MCFG_SOFTWARE_LIST_ADD("cart_list","odyssey2")
-MACHINE_CONFIG_END
+ SOFTWARE_LIST(config, "cart_list").set_original("odyssey2");
+}
-MACHINE_CONFIG_START(odyssey2_state::odyssey2)
+void odyssey2_state::odyssey2(machine_config &config)
+{
/* basic machine hardware */
I8048(config, m_maincpu, ((XTAL(7'159'090) * 3) / 4));
m_maincpu->set_addrmap(AS_PROGRAM, &odyssey2_state::odyssey2_mem);
@@ -694,53 +696,67 @@ MACHINE_CONFIG_START(odyssey2_state::odyssey2)
m_maincpu->t0_in_cb().set("cartslot", FUNC(o2_cart_slot_device::t0_read));
m_maincpu->t1_in_cb().set(FUNC(odyssey2_state::t1_read));
- MCFG_QUANTUM_TIME(attotime::from_hz(60))
+ config.m_minimum_quantum = attotime::from_hz(60);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_RAW_PARAMS( XTAL(7'159'090)/2 * 2, i8244_device::LINE_CLOCKS, i8244_device::START_ACTIVE_SCAN, i8244_device::END_ACTIVE_SCAN, i8244_device::LINES, i8244_device::START_Y, i8244_device::START_Y + i8244_device::SCREEN_HEIGHT )
- MCFG_SCREEN_UPDATE_DRIVER(odyssey2_state, screen_update_odyssey2)
- MCFG_SCREEN_PALETTE("palette")
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_screen_update(FUNC(odyssey2_state::screen_update_odyssey2));
+ screen.set_palette("palette");
GFXDECODE(config, "gfxdecode", "palette", gfx_odyssey2);
PALETTE(config, "palette", FUNC(odyssey2_state::odyssey2_palette), 32);
/* sound hardware */
SPEAKER(config, "mono").front_center();
- MCFG_I8244_ADD( "i8244", XTAL(7'159'090)/2 * 2, "screen", INPUTLINE( "maincpu", 0 ), WRITE16( *this, odyssey2_state, scanline_postprocess ) )
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.40)
+ I8244(config, m_i8244, XTAL(7'159'090)/2 * 2);
+ m_i8244->set_screen("screen");
+ m_i8244->irq_cb().set_inputline(m_maincpu, MCS48_INPUT_IRQ);
+ m_i8244->postprocess_cb().set(FUNC(odyssey2_state::scanline_postprocess));
+ m_i8244->add_route(ALL_OUTPUTS, "mono", 0.40);
odyssey2_cartslot(config);
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(odyssey2_state::videopac)
+void odyssey2_state::videopac(machine_config &config)
+{
/* basic machine hardware */
I8048(config, m_maincpu, (XTAL(17'734'470) / 3));
m_maincpu->set_addrmap(AS_PROGRAM, &odyssey2_state::odyssey2_mem);
m_maincpu->set_addrmap(AS_IO, &odyssey2_state::odyssey2_io);
+ m_maincpu->p1_in_cb().set(FUNC(odyssey2_state::p1_read));
+ m_maincpu->p1_out_cb().set(FUNC(odyssey2_state::p1_write));
+ m_maincpu->p2_in_cb().set(FUNC(odyssey2_state::p2_read));
+ m_maincpu->p2_out_cb().set(FUNC(odyssey2_state::p2_write));
+ m_maincpu->bus_in_cb().set(FUNC(odyssey2_state::bus_read));
+ m_maincpu->bus_out_cb().set(FUNC(odyssey2_state::bus_write));
+ m_maincpu->t0_in_cb().set("cartslot", FUNC(o2_cart_slot_device::t0_read));
+ m_maincpu->t1_in_cb().set(FUNC(odyssey2_state::t1_read));
- MCFG_QUANTUM_TIME(attotime::from_hz(60))
+ config.m_minimum_quantum = attotime::from_hz(60);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_RAW_PARAMS( XTAL(17'734'470)/5 * 2, i8244_device::LINE_CLOCKS, i8244_device::START_ACTIVE_SCAN, i8244_device::END_ACTIVE_SCAN, i8245_device::LINES, i8244_device::START_Y, i8244_device::START_Y + i8244_device::SCREEN_HEIGHT )
- MCFG_SCREEN_UPDATE_DRIVER(odyssey2_state, screen_update_odyssey2)
- MCFG_SCREEN_PALETTE("palette")
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_screen_update(FUNC(odyssey2_state::screen_update_odyssey2));
+ screen.set_palette("palette");
GFXDECODE(config, "gfxdecode", "palette", gfx_odyssey2);
PALETTE(config, "palette", FUNC(odyssey2_state::odyssey2_palette), 16);
/* sound hardware */
SPEAKER(config, "mono").front_center();
- MCFG_I8245_ADD( "i8244", XTAL(17'734'470)/5 * 2, "screen", INPUTLINE( "maincpu", 0 ), WRITE16( *this, odyssey2_state, scanline_postprocess ) )
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.40)
+ I8245(config, m_i8244, XTAL(17'734'470)/5 * 2);
+ m_i8244->set_screen("screen");
+ m_i8244->irq_cb().set_inputline(m_maincpu, MCS48_INPUT_IRQ);
+ m_i8244->postprocess_cb().set(FUNC(odyssey2_state::scanline_postprocess));
+ m_i8244->add_route(ALL_OUTPUTS, "mono", 0.40);
odyssey2_cartslot(config);
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(g7400_state::g7400)
+void g7400_state::g7400(machine_config &config)
+{
/* basic machine hardware */
I8048(config, m_maincpu, XTAL(5'911'000));
m_maincpu->set_addrmap(AS_PROGRAM, &g7400_state::odyssey2_mem);
@@ -755,13 +771,12 @@ MACHINE_CONFIG_START(g7400_state::g7400)
m_maincpu->t1_in_cb().set(FUNC(g7400_state::t1_read));
m_maincpu->prog_out_cb().set(m_i8243, FUNC(i8243_device::prog_w));
- MCFG_QUANTUM_TIME(attotime::from_hz(60))
+ config.m_minimum_quantum = attotime::from_hz(60);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_RAW_PARAMS(3540000 * 2, i8244_device::LINE_CLOCKS, i8244_device::START_ACTIVE_SCAN, i8244_device::END_ACTIVE_SCAN, i8245_device::LINES, i8244_device::START_Y, i8244_device::START_Y + i8244_device::SCREEN_HEIGHT)
- MCFG_SCREEN_UPDATE_DRIVER(odyssey2_state, screen_update_odyssey2)
- MCFG_SCREEN_PALETTE("palette")
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_screen_update(FUNC(odyssey2_state::screen_update_odyssey2));
+ screen.set_palette("palette");
GFXDECODE(config, "gfxdecode", "palette", gfx_odyssey2);
PALETTE(config, "palette", FUNC(g7400_state::g7400_palette), 16);
@@ -772,20 +787,23 @@ MACHINE_CONFIG_START(g7400_state::g7400)
m_i8243->p6_out_cb().set(FUNC(g7400_state::i8243_p6_w));
m_i8243->p7_out_cb().set(FUNC(g7400_state::i8243_p7_w));
- MCFG_EF9340_1_ADD("ef9340_1", 3540000, "screen")
+ EF9340_1(config, m_ef9340_1, 3540000, "screen");
SPEAKER(config, "mono").front_center();
- MCFG_I8245_ADD("i8244", 3540000 * 2, "screen", INPUTLINE("maincpu", 0), WRITE16(*this, g7400_state, scanline_postprocess))
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.40)
+ I8245(config, m_i8244, 3540000 * 2);
+ m_i8244->set_screen("screen");
+ m_i8244->irq_cb().set_inputline(m_maincpu, MCS48_INPUT_IRQ);
+ m_i8244->postprocess_cb().set(FUNC(g7400_state::scanline_postprocess));
+ m_i8244->add_route(ALL_OUTPUTS, "mono", 0.40);
odyssey2_cartslot(config);
- MCFG_DEVICE_REMOVE("cart_list")
- MCFG_SOFTWARE_LIST_ADD("cart_list","g7400")
- MCFG_SOFTWARE_LIST_COMPATIBLE_ADD("ody2_list","odyssey2")
-MACHINE_CONFIG_END
+ SOFTWARE_LIST(config.replace(), "cart_list").set_original("g7400");
+ SOFTWARE_LIST(config, "ody2_list").set_compatible("odyssey2");
+}
-MACHINE_CONFIG_START(g7400_state::odyssey3)
+void g7400_state::odyssey3(machine_config &config)
+{
/* basic machine hardware */
I8048(config, m_maincpu, XTAL(5'911'000));
m_maincpu->set_addrmap(AS_PROGRAM, &g7400_state::odyssey2_mem);
@@ -800,13 +818,12 @@ MACHINE_CONFIG_START(g7400_state::odyssey3)
m_maincpu->t1_in_cb().set(FUNC(g7400_state::t1_read));
m_maincpu->prog_out_cb().set(m_i8243, FUNC(i8243_device::prog_w));
- MCFG_QUANTUM_TIME(attotime::from_hz(60))
+ config.m_minimum_quantum = attotime::from_hz(60);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_RAW_PARAMS(3540000 * 2, i8244_device::LINE_CLOCKS, i8244_device::START_ACTIVE_SCAN, i8244_device::END_ACTIVE_SCAN, i8244_device::LINES, i8244_device::START_Y, i8244_device::START_Y + i8244_device::SCREEN_HEIGHT)
- MCFG_SCREEN_UPDATE_DRIVER(odyssey2_state, screen_update_odyssey2)
- MCFG_SCREEN_PALETTE("palette")
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_screen_update(FUNC(odyssey2_state::screen_update_odyssey2));
+ screen.set_palette("palette");
GFXDECODE(config, "gfxdecode", "palette", gfx_odyssey2);
PALETTE(config, "palette", FUNC(g7400_state::g7400_palette), 16);
@@ -817,17 +834,19 @@ MACHINE_CONFIG_START(g7400_state::odyssey3)
m_i8243->p6_out_cb().set(FUNC(g7400_state::i8243_p6_w));
m_i8243->p7_out_cb().set(FUNC(g7400_state::i8243_p7_w));
- MCFG_EF9340_1_ADD("ef9340_1", 3540000, "screen")
+ EF9340_1(config, m_ef9340_1, 3540000, "screen");
SPEAKER(config, "mono").front_center();
- MCFG_I8244_ADD("i8244", 3540000 * 2, "screen", INPUTLINE("maincpu", 0), WRITE16(*this, g7400_state, scanline_postprocess))
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.40)
+ I8244(config, m_i8244, 3540000 * 2);
+ m_i8244->set_screen("screen");
+ m_i8244->irq_cb().set_inputline(m_maincpu, MCS48_INPUT_IRQ);
+ m_i8244->postprocess_cb().set(FUNC(g7400_state::scanline_postprocess));
+ m_i8244->add_route(ALL_OUTPUTS, "mono", 0.40);
odyssey2_cartslot(config);
- MCFG_DEVICE_REMOVE("cart_list")
- MCFG_SOFTWARE_LIST_ADD("cart_list","g7400")
- MCFG_SOFTWARE_LIST_COMPATIBLE_ADD("ody2_list","odyssey2")
-MACHINE_CONFIG_END
+ SOFTWARE_LIST(config.replace(), "cart_list").set_original("g7400");
+ SOFTWARE_LIST(config, "ody2_list").set_compatible("odyssey2");
+}
ROM_START (odyssey2)
diff --git a/src/mame/drivers/offtwall.cpp b/src/mame/drivers/offtwall.cpp
index 4ccdaba7da1..9cbc03d71a9 100644
--- a/src/mame/drivers/offtwall.cpp
+++ b/src/mame/drivers/offtwall.cpp
@@ -336,18 +336,18 @@ GFXDECODE_END
*
*************************************/
-MACHINE_CONFIG_START(offtwall_state::offtwall)
-
+void offtwall_state::offtwall(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M68000, ATARI_CLOCK_14MHz/2)
- MCFG_DEVICE_PROGRAM_MAP(main_map)
+ M68000(config, m_maincpu, ATARI_CLOCK_14MHz/2);
+ m_maincpu->set_addrmap(AS_PROGRAM, &offtwall_state::main_map);
EEPROM_2816(config, "eeprom").lock_after_write(true);
WATCHDOG_TIMER(config, "watchdog");
/* video hardware */
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_offtwall)
+ GFXDECODE(config, "gfxdecode", "palette", gfx_offtwall);
PALETTE(config, "palette").set_format(palette_device::IRGB_1555, 2048);
ATARI_VAD(config, m_vad, 0, "screen");
@@ -355,13 +355,13 @@ MACHINE_CONFIG_START(offtwall_state::offtwall)
TILEMAP(config, "vad:playfield", "gfxdecode", 2, 8, 8, TILEMAP_SCAN_COLS, 64, 64).set_info_callback(DEVICE_SELF_OWNER, FUNC(offtwall_state::get_playfield_tile_info));
ATARI_MOTION_OBJECTS(config, "vad:mob", 0, "screen", offtwall_state::s_mob_config).set_gfxdecode("gfxdecode");
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_VIDEO_ATTRIBUTES(VIDEO_UPDATE_BEFORE_VBLANK)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_video_attributes(VIDEO_UPDATE_BEFORE_VBLANK);
/* note: these parameters are from published specs, not derived */
/* the board uses a VAD chip to generate video signals */
- MCFG_SCREEN_RAW_PARAMS(ATARI_CLOCK_14MHz/2, 456, 0, 336, 262, 0, 240)
- MCFG_SCREEN_UPDATE_DRIVER(offtwall_state, screen_update_offtwall)
- MCFG_SCREEN_PALETTE("palette")
+ screen.set_raw(ATARI_CLOCK_14MHz/2, 456, 0, 336, 262, 0, 240);
+ screen.set_screen_update(FUNC(offtwall_state::screen_update_offtwall));
+ screen.set_palette("palette");
/* sound hardware */
SPEAKER(config, "mono").front_center();
@@ -371,7 +371,7 @@ MACHINE_CONFIG_START(offtwall_state::offtwall)
m_jsa->test_read_cb().set_ioport("260010").bit(6);
m_jsa->add_route(ALL_OUTPUTS, "mono", 1.0);
config.device_remove("jsa:oki1");
-MACHINE_CONFIG_END
+}
diff --git a/src/mame/drivers/ohmygod.cpp b/src/mame/drivers/ohmygod.cpp
index bc50df1fd15..23cc72d956d 100644
--- a/src/mame/drivers/ohmygod.cpp
+++ b/src/mame/drivers/ohmygod.cpp
@@ -320,36 +320,36 @@ void ohmygod_state::machine_reset()
m_scrolly = 0;
}
-MACHINE_CONFIG_START(ohmygod_state::ohmygod)
-
+void ohmygod_state::ohmygod(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M68000, 12000000)
- MCFG_DEVICE_PROGRAM_MAP(ohmygod_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", ohmygod_state, irq1_line_hold)
+ M68000(config, m_maincpu, 12000000);
+ m_maincpu->set_addrmap(AS_PROGRAM, &ohmygod_state::ohmygod_map);
+ m_maincpu->set_vblank_int("screen", FUNC(ohmygod_state::irq1_line_hold));
WATCHDOG_TIMER(config, "watchdog").set_time(attotime::from_seconds(3)); /* a guess, and certainly wrong */
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(64*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(12*8, (64-12)*8-1, 0*8, 30*8-1 )
- MCFG_SCREEN_UPDATE_DRIVER(ohmygod_state, screen_update_ohmygod)
- MCFG_SCREEN_PALETTE(m_palette)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(64*8, 32*8);
+ screen.set_visarea(12*8, (64-12)*8-1, 0*8, 30*8-1 );
+ screen.set_screen_update(FUNC(ohmygod_state::screen_update_ohmygod));
+ screen.set_palette(m_palette);
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_ohmygod)
+ GFXDECODE(config, m_gfxdecode, m_palette, gfx_ohmygod);
PALETTE(config, m_palette).set_format(palette_device::xGRB_555, 1024);
/* sound hardware */
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("oki", OKIM6295, 14000000/8, okim6295_device::PIN7_HIGH)
- MCFG_DEVICE_ADDRESS_MAP(0, oki_map)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
-MACHINE_CONFIG_END
+ okim6295_device &oki(OKIM6295(config, "oki", 14000000/8, okim6295_device::PIN7_HIGH));
+ oki.set_addrmap(0, &ohmygod_state::oki_map);
+ oki.add_route(ALL_OUTPUTS, "mono", 1.0);
+}
/***************************************************************************
diff --git a/src/mame/drivers/ojankohs.cpp b/src/mame/drivers/ojankohs.cpp
index 07afdc92e42..4170bea8dae 100644
--- a/src/mame/drivers/ojankohs.cpp
+++ b/src/mame/drivers/ojankohs.cpp
@@ -712,25 +712,26 @@ void ojankohs_state::machine_reset()
m_screen_refresh = 0;
}
-MACHINE_CONFIG_START(ojankohs_state::ojankohs)
-
+void ojankohs_state::ojankohs(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80,12000000/2) /* 6.00 MHz ? */
- MCFG_DEVICE_PROGRAM_MAP(ojankohs_map)
- MCFG_DEVICE_IO_MAP(ojankohs_io_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", ojankohs_state, irq0_line_hold)
+ Z80(config, m_maincpu, 12000000/2); /* 6.00 MHz ? */
+ m_maincpu->set_addrmap(AS_PROGRAM, &ojankohs_state::ojankohs_map);
+ m_maincpu->set_addrmap(AS_IO, &ojankohs_state::ojankohs_io_map);
+ m_maincpu->set_vblank_int("screen", FUNC(ojankohs_state::irq0_line_hold));
MCFG_MACHINE_START_OVERRIDE(ojankohs_state,ojankohs)
+
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(512, 512)
- MCFG_SCREEN_VISIBLE_AREA(0, 288-1, 0, 224-1)
- MCFG_SCREEN_UPDATE_DRIVER(ojankohs_state, screen_update_ojankohs)
- MCFG_SCREEN_PALETTE(m_palette)
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_refresh_hz(60);
+ m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ m_screen->set_size(512, 512);
+ m_screen->set_visarea(0, 288-1, 0, 224-1);
+ m_screen->set_screen_update(FUNC(ojankohs_state::screen_update_ojankohs));
+ m_screen->set_palette(m_palette);
GFXDECODE(config, m_gfxdecode, m_palette, gfx_ojankohs);
PALETTE(config, m_palette).set_entries(1024);
@@ -747,31 +748,32 @@ MACHINE_CONFIG_START(ojankohs_state::ojankohs)
aysnd.port_b_read_callback().set(FUNC(ojankohs_state::ojankohs_dipsw2_r));
aysnd.add_route(ALL_OUTPUTS, "mono", 0.15);
- MCFG_DEVICE_ADD("msm", MSM5205, 384000)
- MCFG_MSM5205_VCLK_CB(WRITELINE(*this, ojankohs_state, ojankohs_adpcm_int)) /* IRQ handler */
- MCFG_MSM5205_PRESCALER_SELECTOR(S48_4B) /* 8 KHz */
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.50)
-MACHINE_CONFIG_END
-
-MACHINE_CONFIG_START(ojankohs_state::ojankoy)
+ MSM5205(config, m_msm, 384000);
+ m_msm->vck_legacy_callback().set(FUNC(ojankohs_state::ojankohs_adpcm_int)); /* IRQ handler */
+ m_msm->set_prescaler_selector(msm5205_device::S48_4B); /* 8 KHz */
+ m_msm->add_route(ALL_OUTPUTS, "mono", 0.50);
+}
+void ojankohs_state::ojankoy(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80,12000000/2) /* 6.00 MHz ? */
- MCFG_DEVICE_PROGRAM_MAP(ojankoy_map)
- MCFG_DEVICE_IO_MAP(ojankoy_io_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", ojankohs_state, irq0_line_hold)
+ Z80(config, m_maincpu, 12000000/2); /* 6.00 MHz ? */
+ m_maincpu->set_addrmap(AS_PROGRAM, &ojankohs_state::ojankoy_map);
+ m_maincpu->set_addrmap(AS_IO, &ojankohs_state::ojankoy_io_map);
+ m_maincpu->set_vblank_int("screen", FUNC(ojankohs_state::irq0_line_hold));
MCFG_MACHINE_START_OVERRIDE(ojankohs_state,ojankoy)
+
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(512, 512)
- MCFG_SCREEN_VISIBLE_AREA(0, 288-1, 0, 224-1)
- MCFG_SCREEN_UPDATE_DRIVER(ojankohs_state, screen_update_ojankohs)
- MCFG_SCREEN_PALETTE(m_palette)
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_refresh_hz(60);
+ m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ m_screen->set_size(512, 512);
+ m_screen->set_visarea(0, 288-1, 0, 224-1);
+ m_screen->set_screen_update(FUNC(ojankohs_state::screen_update_ojankohs));
+ m_screen->set_palette(m_palette);
GFXDECODE(config, m_gfxdecode, m_palette, gfx_ojankohs);
PALETTE(config, m_palette, FUNC(ojankohs_state::ojankoy_palette), 1024);
@@ -786,31 +788,32 @@ MACHINE_CONFIG_START(ojankohs_state::ojankoy)
aysnd.port_b_read_callback().set_ioport("dsw2");
aysnd.add_route(ALL_OUTPUTS, "mono", 0.15);
- MCFG_DEVICE_ADD("msm", MSM5205, 384000)
- MCFG_MSM5205_VCLK_CB(WRITELINE(*this, ojankohs_state, ojankohs_adpcm_int)) /* IRQ handler */
- MCFG_MSM5205_PRESCALER_SELECTOR(S48_4B) /* 8 KHz */
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.50)
-MACHINE_CONFIG_END
-
-MACHINE_CONFIG_START(ojankohs_state::ccasino)
+ MSM5205(config, m_msm, 384000);
+ m_msm->vck_legacy_callback().set(FUNC(ojankohs_state::ojankohs_adpcm_int)); /* IRQ handler */
+ m_msm->set_prescaler_selector(msm5205_device::S48_4B); /* 8 KHz */
+ m_msm->add_route(ALL_OUTPUTS, "mono", 0.50);
+}
+void ojankohs_state::ccasino(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80,12000000/2) /* 6.00 MHz ? */
- MCFG_DEVICE_PROGRAM_MAP(ojankoy_map)
- MCFG_DEVICE_IO_MAP(ccasino_io_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", ojankohs_state, irq0_line_hold)
+ Z80(config, m_maincpu, 12000000/2); /* 6.00 MHz ? */
+ m_maincpu->set_addrmap(AS_PROGRAM, &ojankohs_state::ojankoy_map);
+ m_maincpu->set_addrmap(AS_IO, &ojankohs_state::ccasino_io_map);
+ m_maincpu->set_vblank_int("screen", FUNC(ojankohs_state::irq0_line_hold));
MCFG_MACHINE_START_OVERRIDE(ojankohs_state,ojankohs)
+
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(512, 512)
- MCFG_SCREEN_VISIBLE_AREA(0, 288-1, 0, 224-1)
- MCFG_SCREEN_UPDATE_DRIVER(ojankohs_state, screen_update_ojankohs)
- MCFG_SCREEN_PALETTE(m_palette)
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_refresh_hz(60);
+ m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ m_screen->set_size(512, 512);
+ m_screen->set_visarea(0, 288-1, 0, 224-1);
+ m_screen->set_screen_update(FUNC(ojankohs_state::screen_update_ojankohs));
+ m_screen->set_palette(m_palette);
GFXDECODE(config, m_gfxdecode, m_palette, gfx_ojankohs);
PALETTE(config, m_palette).set_entries(1024);
@@ -827,31 +830,32 @@ MACHINE_CONFIG_START(ojankohs_state::ccasino)
aysnd.port_b_read_callback().set_ioport("dsw2");
aysnd.add_route(ALL_OUTPUTS, "mono", 0.15);
- MCFG_DEVICE_ADD("msm", MSM5205, 384000)
- MCFG_MSM5205_VCLK_CB(WRITELINE(*this, ojankohs_state, ojankohs_adpcm_int)) /* IRQ handler */
- MCFG_MSM5205_PRESCALER_SELECTOR(S48_4B) /* 8 KHz */
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.50)
-MACHINE_CONFIG_END
-
-MACHINE_CONFIG_START(ojankohs_state::ojankoc)
+ MSM5205(config, m_msm, 384000);
+ m_msm->vck_legacy_callback().set(FUNC(ojankohs_state::ojankohs_adpcm_int)); /* IRQ handler */
+ m_msm->set_prescaler_selector(msm5205_device::S48_4B); /* 8 KHz */
+ m_msm->add_route(ALL_OUTPUTS, "mono", 0.50);
+}
+void ojankohs_state::ojankoc(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80,8000000/2) /* 4.00 MHz */
- MCFG_DEVICE_PROGRAM_MAP(ojankoc_map)
- MCFG_DEVICE_IO_MAP(ojankoc_io_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", ojankohs_state, irq0_line_hold)
+ Z80(config, m_maincpu, 8000000/2); /* 4.00 MHz */
+ m_maincpu->set_addrmap(AS_PROGRAM, &ojankohs_state::ojankoc_map);
+ m_maincpu->set_addrmap(AS_IO, &ojankohs_state::ojankoc_io_map);
+ m_maincpu->set_vblank_int("screen", FUNC(ojankohs_state::irq0_line_hold));
MCFG_MACHINE_START_OVERRIDE(ojankohs_state,ojankoc)
+
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(32*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0, 256-1, 8, 248-1)
- MCFG_SCREEN_UPDATE_DRIVER(ojankohs_state, screen_update_ojankoc)
- MCFG_SCREEN_PALETTE(m_palette)
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_refresh_hz(60);
+ m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ m_screen->set_size(32*8, 32*8);
+ m_screen->set_visarea(0, 256-1, 8, 248-1);
+ m_screen->set_screen_update(FUNC(ojankohs_state::screen_update_ojankoc));
+ m_screen->set_palette(m_palette);
PALETTE(config, m_palette).set_entries(16);
@@ -865,11 +869,11 @@ MACHINE_CONFIG_START(ojankohs_state::ojankoc)
aysnd.port_b_read_callback().set_ioport("dsw2");
aysnd.add_route(ALL_OUTPUTS, "mono", 0.15);
- MCFG_DEVICE_ADD("msm", MSM5205, 8000000/22)
- MCFG_MSM5205_VCLK_CB(WRITELINE(*this, ojankohs_state, ojankohs_adpcm_int)) /* IRQ handler */
- MCFG_MSM5205_PRESCALER_SELECTOR(S48_4B) /* 8 KHz */
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.50)
-MACHINE_CONFIG_END
+ MSM5205(config, m_msm, 8000000/22);
+ m_msm->vck_legacy_callback().set(FUNC(ojankohs_state::ojankohs_adpcm_int)); /* IRQ handler */
+ m_msm->set_prescaler_selector(msm5205_device::S48_4B); /* 8 KHz */
+ m_msm->add_route(ALL_OUTPUTS, "mono", 0.50);
+}
ROM_START( ojankohs )
diff --git a/src/mame/drivers/okean240.cpp b/src/mame/drivers/okean240.cpp
index ce1a6af84e8..a12bee1167d 100644
--- a/src/mame/drivers/okean240.cpp
+++ b/src/mame/drivers/okean240.cpp
@@ -507,11 +507,12 @@ static GFXDECODE_START( gfx_okean240a )
GFXDECODE_END
-MACHINE_CONFIG_START(okean240_state::okean240t)
+void okean240_state::okean240t(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu",I8080, XTAL(12'000'000) / 6)
- MCFG_DEVICE_PROGRAM_MAP(okean240_mem)
- MCFG_DEVICE_IO_MAP(okean240t_io)
+ I8080(config, m_maincpu, XTAL(12'000'000) / 6);
+ m_maincpu->set_addrmap(AS_PROGRAM, &okean240_state::okean240_mem);
+ m_maincpu->set_addrmap(AS_IO, &okean240_state::okean240t_io);
i8251_device &uart(I8251(config, "uart", 0));
uart.txd_handler().set("rs232", FUNC(rs232_port_device::write_txd));
@@ -541,22 +542,22 @@ MACHINE_CONFIG_START(okean240_state::okean240t)
PIC8259(config, "pic", 0);
/* video hardware */
- MCFG_SCREEN_ADD("screen1", RASTER)
- MCFG_SCREEN_REFRESH_RATE(50)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */
- MCFG_SCREEN_SIZE(256, 256)
- MCFG_SCREEN_VISIBLE_AREA(0, 255, 0, 255)
- MCFG_SCREEN_UPDATE_DRIVER(okean240_state, screen_update_okean240)
- MCFG_SCREEN_PALETTE("palette")
+ screen_device &screen1(SCREEN(config, "screen1", SCREEN_TYPE_RASTER));
+ screen1.set_refresh_hz(50);
+ screen1.set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */
+ screen1.set_size(256, 256);
+ screen1.set_visarea(0, 255, 0, 255);
+ screen1.set_screen_update(FUNC(okean240_state::screen_update_okean240));
+ screen1.set_palette("palette");
PALETTE(config, "palette", palette_device::MONOCHROME);
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(okean240_state::okean240a)
+void okean240_state::okean240a(machine_config &config)
+{
okean240t(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_IO_MAP(okean240a_io)
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_okean240a)
+ m_maincpu->set_addrmap(AS_IO, &okean240_state::okean240a_io);
+ GFXDECODE(config, "gfxdecode", "palette", gfx_okean240a);
subdevice<rs232_port_device>("rs232")->set_default_option("keyboard");
m_ppikbd->in_pa_callback().set(FUNC(okean240_state::okean240a_port40_r));
@@ -564,19 +565,19 @@ MACHINE_CONFIG_START(okean240_state::okean240a)
m_ppikbd->in_pc_callback().set(FUNC(okean240_state::okean240a_port42_r));
subdevice<pit8253_device>("pit")->set_clk<1>(1536000); // artificial rate
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(okean240_state::okean240)
+void okean240_state::okean240(machine_config &config)
+{
okean240t(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_IO_MAP(okean240_io)
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_okean240)
- MCFG_DEVICE_REMOVE("uart")
- MCFG_DEVICE_REMOVE("rs232")
+ m_maincpu->set_addrmap(AS_IO, &okean240_state::okean240_io);
+ GFXDECODE(config, "gfxdecode", "palette", gfx_okean240);
+ config.device_remove("uart");
+ config.device_remove("rs232");
subdevice<pit8253_device>("pit")->out_handler<1>().set_nop();
generic_keyboard_device &keyboard(GENERIC_KEYBOARD(config, "keyboard", 0));
keyboard.set_keyboard_callback(FUNC(okean240_state::kbd_put));
-MACHINE_CONFIG_END
+}
/* ROM definition */
ROM_START( okean240 )
diff --git a/src/mame/drivers/olibochu.cpp b/src/mame/drivers/olibochu.cpp
index c2e3866edd9..8f3db209f83 100644
--- a/src/mame/drivers/olibochu.cpp
+++ b/src/mame/drivers/olibochu.cpp
@@ -459,29 +459,29 @@ TIMER_DEVICE_CALLBACK_MEMBER(olibochu_state::olibochu_scanline)
m_maincpu->set_input_line_and_vector(0, HOLD_LINE, 0xcf); /* RST 08h */
}
-MACHINE_CONFIG_START(olibochu_state::olibochu)
-
+void olibochu_state::olibochu(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, 4000000) /* 4 MHz ?? */
- MCFG_DEVICE_PROGRAM_MAP(olibochu_map)
- MCFG_TIMER_DRIVER_ADD_SCANLINE("scantimer", olibochu_state, olibochu_scanline, "screen", 0, 1)
+ Z80(config, m_maincpu, 4000000); /* 4 MHz ?? */
+ m_maincpu->set_addrmap(AS_PROGRAM, &olibochu_state::olibochu_map);
+ TIMER(config, "scantimer").configure_scanline(FUNC(olibochu_state::olibochu_scanline), "screen", 0, 1);
- MCFG_DEVICE_ADD("audiocpu", Z80, 4000000) /* 4 MHz ?? */
- MCFG_DEVICE_PROGRAM_MAP(olibochu_sound_map)
- MCFG_DEVICE_PERIODIC_INT_DRIVER(olibochu_state, irq0_line_hold, 60) //???
+ z80_device &audiocpu(Z80(config, "audiocpu", 4000000)); /* 4 MHz ?? */
+ audiocpu.set_addrmap(AS_PROGRAM, &olibochu_state::olibochu_sound_map);
+ audiocpu.set_periodic_int(FUNC(olibochu_state::irq0_line_hold), attotime::from_hz(60)); //???
-// MCFG_QUANTUM_PERFECT_CPU("maincpu")
+// config.m_perfect_cpu_quantum = subtag("maincpu");
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(32*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 1*8, 31*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(olibochu_state, screen_update_olibochu)
- MCFG_SCREEN_PALETTE(m_palette)
-
- MCFG_DEVICE_ADD(m_gfxdecode, GFXDECODE, m_palette, gfx_olibochu)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(32*8, 32*8);
+ screen.set_visarea(0*8, 32*8-1, 1*8, 31*8-1);
+ screen.set_screen_update(FUNC(olibochu_state::screen_update_olibochu));
+ screen.set_palette(m_palette);
+
+ GFXDECODE(config, m_gfxdecode, m_palette, gfx_olibochu);
PALETTE(config, m_palette, FUNC(olibochu_state::olibochu_palette), 512);
/* sound hardware */
@@ -490,7 +490,7 @@ MACHINE_CONFIG_START(olibochu_state::olibochu)
GENERIC_LATCH_8(config, m_soundlatch);
AY8910(config, "aysnd", 2'000'000).add_route(ALL_OUTPUTS, "mono", 0.50);
-MACHINE_CONFIG_END
+}
diff --git a/src/mame/drivers/olytext.cpp b/src/mame/drivers/olytext.cpp
index 0512ddb6f52..2d2d717cbc7 100644
--- a/src/mame/drivers/olytext.cpp
+++ b/src/mame/drivers/olytext.cpp
@@ -148,32 +148,31 @@ static void olytext_floppies(device_slot_interface &device)
// MACHINE CONFIGURATION
//**************************************************************************
-MACHINE_CONFIG_START( olytext_state::olytext )
- MCFG_DEVICE_ADD("maincpu", Z80, 16_MHz_XTAL / 4)
- MCFG_DEVICE_PROGRAM_MAP(mem_map)
- MCFG_DEVICE_IO_MAP(io_map)
+void olytext_state::olytext(machine_config &config)
+{
+ Z80(config, m_maincpu, 16_MHz_XTAL / 4);
+ m_maincpu->set_addrmap(AS_PROGRAM, &olytext_state::mem_map);
+ m_maincpu->set_addrmap(AS_IO, &olytext_state::io_map);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_SIZE(80*8, 28*11)
- MCFG_SCREEN_VISIBLE_AREA(0, (80*8)-1, 0, (28*11)-1)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */
- MCFG_SCREEN_UPDATE_DRIVER(olytext_state, screen_update)
- //MCFG_SCREEN_PALETTE("palette")
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_size(80*8, 28*11);
+ screen.set_visarea(0, (80*8)-1, 0, (28*11)-1);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */
+ screen.set_screen_update(FUNC(olytext_state::screen_update));
+ //screen.set_palette("palette");
PALETTE(config, "palette", palette_device::MONOCHROME);
/* devices */
WD1772(config, "fdc", 16_MHz_XTAL / 8); // divisor guess
- MCFG_FLOPPY_DRIVE_ADD("fdc:0", olytext_floppies, "525qd", floppy_image_device::default_floppy_formats)
- MCFG_FLOPPY_DRIVE_SOUND(true)
- MCFG_FLOPPY_DRIVE_ADD("fdc:1", olytext_floppies, "525qd", floppy_image_device::default_floppy_formats)
- MCFG_FLOPPY_DRIVE_SOUND(true)
+ FLOPPY_CONNECTOR(config, "fdc:0", olytext_floppies, "525qd", floppy_image_device::default_floppy_formats).enable_sound(true);
+ FLOPPY_CONNECTOR(config, "fdc:1", olytext_floppies, "525qd", floppy_image_device::default_floppy_formats).enable_sound(true);
/* keyboard */
generic_keyboard_device &keyboard(GENERIC_KEYBOARD(config, "keyboard", 0));
keyboard.set_keyboard_callback(FUNC(olytext_state::keyboard_put));
-MACHINE_CONFIG_END
+}
//**************************************************************************
diff --git a/src/mame/drivers/omegrace.cpp b/src/mame/drivers/omegrace.cpp
index a9cbe0c208c..e1533bfd65a 100644
--- a/src/mame/drivers/omegrace.cpp
+++ b/src/mame/drivers/omegrace.cpp
@@ -513,38 +513,38 @@ INPUT_PORTS_END
*
*************************************/
-MACHINE_CONFIG_START(omegrace_state::omegrace)
-
+void omegrace_state::omegrace(machine_config &config)
+{
/* basic machine hardware */
/* main CPU */
/* XTAL101 Crystal @ 12mhz */
/* through 74LS161, Pin 13 = divide by 4 */
- MCFG_DEVICE_ADD("maincpu", Z80, XTAL(12'000'000)/4)
- MCFG_DEVICE_PROGRAM_MAP(main_map)
- MCFG_DEVICE_IO_MAP(port_map)
- MCFG_DEVICE_PERIODIC_INT_DRIVER(omegrace_state, irq0_line_hold, 250)
+ Z80(config, m_maincpu, XTAL(12'000'000)/4);
+ m_maincpu->set_addrmap(AS_PROGRAM, &omegrace_state::main_map);
+ m_maincpu->set_addrmap(AS_IO, &omegrace_state::port_map);
+ m_maincpu->set_periodic_int(FUNC(omegrace_state::irq0_line_hold), attotime::from_hz(250));
/* audio CPU */
/* XTAL101 Crystal @ 12mhz */
/* through 74LS161, Pin 12 = divide by 8 */
/* Fed to CPU as 1.5mhz though line J4-D */
- MCFG_DEVICE_ADD("audiocpu", Z80, XTAL(12'000'000)/8)
- MCFG_DEVICE_PROGRAM_MAP(sound_map)
- MCFG_DEVICE_IO_MAP(sound_port)
- MCFG_DEVICE_PERIODIC_INT_DRIVER(omegrace_state, nmi_line_pulse, 250)
+ Z80(config, m_audiocpu, XTAL(12'000'000)/8);
+ m_audiocpu->set_addrmap(AS_PROGRAM, &omegrace_state::sound_map);
+ m_audiocpu->set_addrmap(AS_IO, &omegrace_state::sound_port);
+ m_audiocpu->set_periodic_int(FUNC(omegrace_state::nmi_line_pulse), attotime::from_hz(250));
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
WATCHDOG_TIMER(config, "watchdog");
/* video hardware */
- MCFG_VECTOR_ADD("vector")
- MCFG_SCREEN_ADD("screen", VECTOR)
- MCFG_SCREEN_REFRESH_RATE(40)
- MCFG_SCREEN_SIZE(400, 300)
- MCFG_SCREEN_VISIBLE_AREA(522, 1566, 522, 1566)
- MCFG_SCREEN_UPDATE_DEVICE("vector", vector_device, screen_update)
+ VECTOR(config, "vector", 0);
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_VECTOR));
+ screen.set_refresh_hz(40);
+ screen.set_size(400, 300);
+ screen.set_visarea(522, 1566, 522, 1566);
+ screen.set_screen_update("vector", FUNC(vector_device::screen_update));
DVG(config, m_dvg, 0);
m_dvg->set_vector_tag("vector");
@@ -559,7 +559,7 @@ MACHINE_CONFIG_START(omegrace_state::omegrace)
AY8912(config, "ay1", XTAL(12'000'000)/12).add_route(ALL_OUTPUTS, "mono", 0.25);
AY8912(config, "ay2", XTAL(12'000'000)/12).add_route(ALL_OUTPUTS, "mono", 0.25);
-MACHINE_CONFIG_END
+}
diff --git a/src/mame/drivers/ondra.cpp b/src/mame/drivers/ondra.cpp
index 12c9f073cd2..040e09fb591 100644
--- a/src/mame/drivers/ondra.cpp
+++ b/src/mame/drivers/ondra.cpp
@@ -122,38 +122,39 @@ WRITE_LINE_MEMBER(ondra_state::vblank_irq)
}
/* Machine driver */
-MACHINE_CONFIG_START(ondra_state::ondra)
+void ondra_state::ondra(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, 2000000)
- MCFG_DEVICE_PROGRAM_MAP(ondra_mem)
- MCFG_DEVICE_IO_MAP(ondra_io)
+ Z80(config, m_maincpu, 2000000);
+ m_maincpu->set_addrmap(AS_PROGRAM, &ondra_state::ondra_mem);
+ m_maincpu->set_addrmap(AS_IO, &ondra_state::ondra_io);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(50)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */
- MCFG_SCREEN_SIZE(320, 256)
- MCFG_SCREEN_VISIBLE_AREA(0, 320-1, 0, 256-1)
- MCFG_SCREEN_UPDATE_DRIVER(ondra_state, screen_update_ondra)
- MCFG_SCREEN_PALETTE("palette")
- MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE(*this, ondra_state, vblank_irq))
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(50);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */
+ screen.set_size(320, 256);
+ screen.set_visarea(0, 320-1, 0, 256-1);
+ screen.set_screen_update(FUNC(ondra_state::screen_update_ondra));
+ screen.set_palette("palette");
+ screen.screen_vblank().set(FUNC(ondra_state::vblank_irq));
PALETTE(config, "palette", palette_device::MONOCHROME);
// sound hardware
SPEAKER(config, "mono").front_center();
- WAVE(config, "wave", "cassette").add_route(ALL_OUTPUTS, "mono", 0.25);
+ WAVE(config, "wave", m_cassette).add_route(ALL_OUTPUTS, "mono", 0.25);
- MCFG_CASSETTE_ADD( "cassette" )
- MCFG_CASSETTE_DEFAULT_STATE(CASSETTE_STOPPED | CASSETTE_MOTOR_ENABLED | CASSETTE_SPEAKER_ENABLED)
- MCFG_CASSETTE_INTERFACE("ondra_cass")
+ CASSETTE(config, m_cassette);
+ m_cassette->set_default_state(CASSETTE_STOPPED | CASSETTE_MOTOR_ENABLED | CASSETTE_SPEAKER_ENABLED);
+ m_cassette->set_interface("ondra_cass");
- MCFG_SOFTWARE_LIST_ADD("cass_list","ondra")
+ SOFTWARE_LIST(config, "cass_list").set_original("ondra");
/* internal ram */
RAM(config, RAM_TAG).set_default_size("64K").set_default_value(0x00);
-MACHINE_CONFIG_END
+}
/* ROM definition */
diff --git a/src/mame/drivers/oneshot.cpp b/src/mame/drivers/oneshot.cpp
index 695db6e8ae9..22a79edfefa 100644
--- a/src/mame/drivers/oneshot.cpp
+++ b/src/mame/drivers/oneshot.cpp
@@ -35,6 +35,85 @@ NOTE: An eBay auction of the PCB shows "1996.9.16 PROMAT" on the JAMMA+ adapter
One Shot One Kill. This information was used for the year & manufacturer.
Also listed in an Approved Game list on a HK government site as "Promet"
+
+Main board:
++---------------------------------------------+
+| 5MHz +------------+ |
+|VOL YM3812 Z80A M6295 |25x6 row pin| |
+| YM3014 6116 PAL +------------+ |
+| PAL |
+| +---------+ |
+| KM681000LP | ACTEL | |
+| | A1020A | |
+| KM681000LP | PL84C | |
+|J +---------+ |
+|A |
+|M +---------++---------+ |
+|M MB.ROM | Cypress || ACTEL | |
+|A KM6264 | CY7C384A|| A1020A | |
+| KM6264 PAL | -XJC || PL84C | |
+| +---------++---------+ |
+| PAL PAL KM681000LP |
+| DSW2 6 6116 KM681000LP PAL |
+| 8 6116 PAL |
+| DSW1 0 +------------+ |
+| 27MHz 0 CXK58256 |25x4 row pin| |
+|LED 12MHz 0 CXK58256 +------------+ |
++---------------------------------------------+
+
+ CPU: 68000, Z80A
+Sound: YM2812/YM3014 + OKI M6295 (badged as K-666/K-664 + AD-65)
+ OSC: 27MHz, 12MHz & 5MHz
+ RAM: Samsung KM681000LP-10 128Kx8 Low power SRAM x 4
+ Samsung KM6264AL-10 8Kx8 Low power SRAM x 2
+ Sony CXK58256-10L 32Kx8 High speed SRAM x 2
+ UMC UM6116K-2 2Kx8 SRAM x 3
+Other: Cypress CY7C384A 2K Very high speed Gate CMOS FPGA
+ Actel A1020A FPGA
+ DSW 8 position dipswitch x 2
+ LED - Power LED
+ VOL - Volume adjust pot
+Connectors to ROM board:
+ 25 pins by 6 rows & 25 pins by 4 rows
+
+Rom board:
++-----------------------+
+| +------------+ |
+| |25x6 row pin| |
+| +------------+ |
+| U15* UI8 |
+| |
+| UA2 UI8A |
+| |
+| U14* UI11 |
+| |
+| UA22 UI11A |
+| |
+| UA24 UI13 |
+| |
+| +---------+ UI13A |
+| | ACTEL | |
+| | A1020A | UI16 |
+| | PL84C | |
+| +---------+ UI16A |
+| +------------+ |
+| |25x4 row pin| |
+| +------------+ |
++-----------------------+
+
+Note: * denotes unpopulated
+
+Other: Actel A1020A FPGA
+Connectors to main board:
+ 25 pins by 6 rows & 25 pins by 4 rows
+
+For One Shot One Kill:
+ There is an additional board that connects to the JAMMA connector that has some logic chips,
+ a JAMMA edge connector and two 4 pin headers to connect the light guns as well as a 2 wire jumper
+ that connects to some ROM board logic chips (assumed) for light gun input. Also the YM3812 sound
+ chip appears to be unpopulated for One Shot One Kill.
+ The ROM board for One Shot One Kill has 8 additional logic chips along the front edge of the PCB
+
*/
#include "emu.h"
@@ -50,9 +129,9 @@ NOTE: An eBay auction of the PCB shows "1996.9.16 PROMAT" on the JAMMA+ adapter
#include "speaker.h"
-READ16_MEMBER(oneshot_state::oneshot_in0_word_r)
+u16 oneshot_state::oneshot_in0_word_r()
{
- int data = ioport("DSW1")->read();
+ const u16 data = m_io_dsw1->read();
switch (data & 0x0c)
{
@@ -73,7 +152,7 @@ READ16_MEMBER(oneshot_state::oneshot_in0_word_r)
return data;
}
-READ16_MEMBER(oneshot_state::oneshot_gun_x_p1_r)
+u16 oneshot_state::oneshot_gun_x_p1_r()
{
/* shots must be in a different location to register */
m_p1_wobble ^= 1;
@@ -81,12 +160,12 @@ READ16_MEMBER(oneshot_state::oneshot_gun_x_p1_r)
return m_gun_x_p1 ^ m_p1_wobble;
}
-READ16_MEMBER(oneshot_state::oneshot_gun_y_p1_r)
+u16 oneshot_state::oneshot_gun_y_p1_r()
{
return m_gun_y_p1;
}
-READ16_MEMBER(oneshot_state::oneshot_gun_x_p2_r)
+u16 oneshot_state::oneshot_gun_x_p2_r()
{
/* shots must be in a different location to register */
m_p2_wobble ^= 1;
@@ -94,34 +173,32 @@ READ16_MEMBER(oneshot_state::oneshot_gun_x_p2_r)
return m_gun_x_p2 ^ m_p2_wobble;
}
-READ16_MEMBER(oneshot_state::oneshot_gun_y_p2_r)
+u16 oneshot_state::oneshot_gun_y_p2_r()
{
return m_gun_y_p2;
}
-WRITE16_MEMBER(oneshot_state::soundbank_w)
+void oneshot_state::soundbank_w(u8 data)
{
- if (ACCESSING_BITS_0_7)
- {
- m_oki->set_rom_bank((data & 0x03) ^ 0x03);
- }
+ m_oki->set_rom_bank((data & 0x03) ^ 0x03);
}
-void oneshot_state::oneshot_map(address_map &map)
+void oneshot_state::mem_map(address_map &map)
{
map(0x000000, 0x03ffff).rom();
map(0x080000, 0x087fff).ram();
map(0x0c0000, 0x0c07ff).ram().w(m_palette, FUNC(palette_device::write16)).share("palette");
- map(0x120000, 0x120fff).ram().share("sprites");
- map(0x180000, 0x180fff).ram().w(FUNC(oneshot_state::oneshot_mid_videoram_w)).share("mid_videoram"); // some people , girl etc.
- map(0x181000, 0x181fff).ram().w(FUNC(oneshot_state::oneshot_fg_videoram_w)).share("fg_videoram"); // credits etc.
- map(0x182000, 0x182fff).ram().w(FUNC(oneshot_state::oneshot_bg_videoram_w)).share("bg_videoram"); // credits etc.
+ map(0x120000, 0x120fff).ram().share("spriteram");
+ //map(0x13f000, 0x13f000).noprw(); // Unknown read / writes
+ map(0x180000, 0x180fff).ram().w(FUNC(oneshot_state::mid_videoram_w)).share("mid_videoram"); // some people , girl etc.
+ map(0x181000, 0x181fff).ram().w(FUNC(oneshot_state::fg_videoram_w)).share("fg_videoram"); // credits etc.
+ map(0x182000, 0x182fff).ram().w(FUNC(oneshot_state::bg_videoram_w)).share("bg_videoram"); // credits etc.
map(0x188000, 0x18800f).writeonly().share("scroll"); // scroll registers
map(0x190003, 0x190003).r("soundlatch", FUNC(generic_latch_8_device::read));
map(0x190011, 0x190011).w("soundlatch", FUNC(generic_latch_8_device::write));
- map(0x190018, 0x190019).w(FUNC(oneshot_state::soundbank_w));
+ map(0x190019, 0x190019).w(FUNC(oneshot_state::soundbank_w));
map(0x190026, 0x190027).r(FUNC(oneshot_state::oneshot_gun_x_p1_r));
map(0x19002e, 0x19002f).r(FUNC(oneshot_state::oneshot_gun_x_p2_r));
map(0x190036, 0x190037).r(FUNC(oneshot_state::oneshot_gun_y_p1_r));
@@ -133,7 +210,7 @@ void oneshot_state::oneshot_map(address_map &map)
map(0x19c034, 0x19c035).portr("P2");
}
-void oneshot_state::oneshot_sound_map(address_map &map)
+void oneshot_state::sound_map(address_map &map)
{
map(0x0000, 0x7fff).rom();
map(0x8000, 0x8000).rw("soundlatch", FUNC(generic_latch_8_device::read), FUNC(generic_latch_8_device::write));
@@ -316,10 +393,8 @@ static const gfx_layout oneshot16x16_layout =
RGN_FRAC(1,8),
8,
{ RGN_FRAC(0,8),RGN_FRAC(1,8),RGN_FRAC(2,8),RGN_FRAC(3,8),RGN_FRAC(4,8),RGN_FRAC(5,8),RGN_FRAC(6,8),RGN_FRAC(7,8) },
- { 0,1,2,3,4,5,6,7,
- 64+0,64+1,64+2,64+3,64+4,64+5,64+6,64+7 },
- { 0*8, 1*8, 2*8, 3*8, 4*8, 5*8, 6*8, 7*8,
- 128+0*8, 128+1*8, 128+2*8, 128+3*8, 128+4*8, 128+5*8, 128+6*8, 128+7*8 },
+ { STEP8(0,1), STEP8(8*8,1) },
+ { STEP8(0,8), STEP8(8*8*2,8) },
16*16
};
@@ -329,15 +404,15 @@ static const gfx_layout oneshot8x8_layout =
RGN_FRAC(1,8),
8,
{ RGN_FRAC(0,8),RGN_FRAC(1,8),RGN_FRAC(2,8),RGN_FRAC(3,8),RGN_FRAC(4,8),RGN_FRAC(5,8),RGN_FRAC(6,8),RGN_FRAC(7,8) },
- { 0,1,2,3,4,5,6,7 },
- { 0*8, 1*8, 2*8, 3*8, 4*8, 5*8, 6*8, 7*8 },
+ { STEP8(0,1) },
+ { STEP8(0,8) },
8*8
};
static GFXDECODE_START( gfx_oneshot )
- GFXDECODE_ENTRY( "gfx1", 0, oneshot16x16_layout, 0x00, 4 ) /* sprites */
- GFXDECODE_ENTRY( "gfx1", 0, oneshot8x8_layout, 0x00, 4 ) /* sprites */
+ GFXDECODE_ENTRY( "gfx1", 0, oneshot16x16_layout, 0, 4 ) /* sprites */
+ GFXDECODE_ENTRY( "gfx1", 0, oneshot8x8_layout, 0, 4 ) /* sprites */
GFXDECODE_END
void oneshot_state::machine_start()
@@ -365,11 +440,11 @@ void oneshot_state::machine_reset()
void oneshot_state::oneshot(machine_config &config)
{
/* basic machine hardware */
- M68000(config, m_maincpu, 12000000);
- m_maincpu->set_addrmap(AS_PROGRAM, &oneshot_state::oneshot_map);
+ M68000(config, m_maincpu, 12_MHz_XTAL);
+ m_maincpu->set_addrmap(AS_PROGRAM, &oneshot_state::mem_map);
m_maincpu->set_vblank_int("screen", FUNC(oneshot_state::irq4_line_hold));
- Z80(config, "audiocpu", 5000000).set_addrmap(AS_PROGRAM, &oneshot_state::oneshot_sound_map);
+ Z80(config, "audiocpu", 5_MHz_XTAL).set_addrmap(AS_PROGRAM, &oneshot_state::sound_map); // Not verified
/* video hardware */
screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
@@ -387,11 +462,11 @@ void oneshot_state::oneshot(machine_config &config)
GENERIC_LATCH_8(config, "soundlatch");
- ym3812_device &ymsnd(YM3812(config, "ymsnd", 3500000));
+ ym3812_device &ymsnd(YM3812(config, "ymsnd", 5_MHz_XTAL/2)); // 2.5MHz or 3MHz (12MHz/4)
ymsnd.irq_handler().set_inputline("audiocpu", 0);
ymsnd.add_route(ALL_OUTPUTS, "mono", 1.0);
- OKIM6295(config, m_oki, 1056000, okim6295_device::PIN7_HIGH); // clock frequency & pin 7 not verified
+ OKIM6295(config, m_oki, 5_MHz_XTAL/4, okim6295_device::PIN7_HIGH); // 1.25MHz??? - clock frequency & pin 7 not verified
m_oki->add_route(ALL_OUTPUTS, "mono", 1.0);
}
@@ -401,6 +476,13 @@ void oneshot_state::maddonna(machine_config &config)
subdevice<screen_device>("screen")->set_screen_update(FUNC(oneshot_state::screen_update_maddonna));
}
+void oneshot_state::komocomo(machine_config &config)
+{
+ oneshot(config);
+ subdevice<screen_device>("screen")->set_screen_update(FUNC(oneshot_state::screen_update_komocomo));
+}
+
+
ROM_START( oneshot )
ROM_REGION( 0x40000, "maincpu", 0 ) /* 68000 Code */
@@ -411,21 +493,21 @@ ROM_START( oneshot )
ROM_LOAD( "1shot.ua2", 0x00000, 0x010000, CRC(f655b80e) SHA1(2574a812c35801755c187a47f46ccdb0983c5feb) )
ROM_REGION( 0x400000, "gfx1", 0 ) /* Sprites */
- ROM_LOAD( "1shot-ui.16a",0x000000, 0x080000, CRC(f765f9a2) SHA1(f6c386e0421fcb0e420585dd27d9dad951bb2556) )
- ROM_LOAD( "1shot-ui.13a",0x080000, 0x080000, CRC(3361b5d8) SHA1(f7db674d479765d4e58fb663aa5e13dde2abcce7) )
- ROM_LOAD( "1shot-ui.11a",0x100000, 0x080000, CRC(8f8bd027) SHA1(fbec952ab5604c8e20c5e7cfd2844f4fe5441186) )
- ROM_LOAD( "1shot-ui.08a",0x180000, 0x080000, CRC(254b1701) SHA1(163bfa70508fca20be70dd0af8b768ab6bf211b9) )
- ROM_LOAD( "1shot-ui.16", 0x200000, 0x080000, CRC(ff246b27) SHA1(fef6029030268174ef9648b8f437aeda68475346) )
- ROM_LOAD( "1shot-ui.13", 0x280000, 0x080000, CRC(80342e83) SHA1(2ac2b300382a607a539d2b0982ab596f05be3ad3) )
- ROM_LOAD( "1shot-ui.11", 0x300000, 0x080000, CRC(b8938345) SHA1(318cf0d070db786680a45811bbd765fa37caaf62) )
- ROM_LOAD( "1shot-ui.08", 0x380000, 0x080000, CRC(c9953bef) SHA1(21917a9dcc0afaeec20672ad863d0c9d583369e3) )
+ ROM_LOAD( "1shot-ui.16a", 0x000000, 0x080000, CRC(f765f9a2) SHA1(f6c386e0421fcb0e420585dd27d9dad951bb2556) )
+ ROM_LOAD( "1shot-ui.13a", 0x080000, 0x080000, CRC(3361b5d8) SHA1(f7db674d479765d4e58fb663aa5e13dde2abcce7) )
+ ROM_LOAD( "1shot-ui.11a", 0x100000, 0x080000, CRC(8f8bd027) SHA1(fbec952ab5604c8e20c5e7cfd2844f4fe5441186) )
+ ROM_LOAD( "1shot-ui.08a", 0x180000, 0x080000, CRC(254b1701) SHA1(163bfa70508fca20be70dd0af8b768ab6bf211b9) )
+ ROM_LOAD( "1shot-ui.16", 0x200000, 0x080000, CRC(ff246b27) SHA1(fef6029030268174ef9648b8f437aeda68475346) )
+ ROM_LOAD( "1shot-ui.13", 0x280000, 0x080000, CRC(80342e83) SHA1(2ac2b300382a607a539d2b0982ab596f05be3ad3) )
+ ROM_LOAD( "1shot-ui.11", 0x300000, 0x080000, CRC(b8938345) SHA1(318cf0d070db786680a45811bbd765fa37caaf62) )
+ ROM_LOAD( "1shot-ui.08", 0x380000, 0x080000, CRC(c9953bef) SHA1(21917a9dcc0afaeec20672ad863d0c9d583369e3) )
ROM_REGION( 0x100000, "oki", 0 ) /* Samples */
ROM_LOAD( "1shot.u15", 0x000000, 0x080000, CRC(e3759a47) SHA1(1159335924a6d68a0a24bfbe0c9182107f3f05f8) )
ROM_LOAD( "1shot.u14", 0x080000, 0x080000, CRC(222e33f8) SHA1(2665afdf4cb1a29325df62efc1843a4b2cf34a4e) )
ROM_REGION( 0x10000, "user1", 0 )
- ROM_LOAD( "1shot.mb", 0x00000, 0x10000, CRC(6b213183) SHA1(599c59d155d11edb151bfaed1d24ef964462a447) ) // motherboard rom, zooming?
+ ROM_LOAD( "1shot.mb", 0x00000, 0x10000, CRC(6b213183) SHA1(599c59d155d11edb151bfaed1d24ef964462a447) ) // motherboard rom, unknown purpose
ROM_END
ROM_START( maddonna )
@@ -441,28 +523,54 @@ ROM_START( maddonna )
ROM_LOAD( "maddonna.b7", 0x080000, 0x080000, CRC(4920d2ec) SHA1(e72a374bca81ffa4f925326455e007df7227ae08) )
ROM_LOAD( "maddonna.b9", 0x100000, 0x080000, CRC(3a8a3feb) SHA1(832654902963c163644134431fd1221e1895cfec) )
ROM_LOAD( "maddonna.b11", 0x180000, 0x080000, CRC(6f9b7fdf) SHA1(14ced1d43eae3b6db4a0a4c12fb26cbd13eb7428) )
- ROM_LOAD( "maddonna.b6", 0x200000, 0x080000, CRC(b02e9e0e) SHA1(6e527a2bfda0f4f420c10139c75dac2704e08d08) )
- ROM_LOAD( "maddonna.b8", 0x280000, 0x080000, CRC(03f1de40) SHA1(bb0c0525155404c0740ac5f048f71ae7651a5941) )
- ROM_LOAD( "maddonna.b10", 0x300000, 0x080000, CRC(87936423) SHA1(dda42f3685427edad7686d9712ff07d2fd9bf57e) )
- ROM_LOAD( "maddonna.b12", 0x380000, 0x080000, CRC(879ab23c) SHA1(5288016542a10e60ccb28a930d8dfe4db41c6fc6) )
+ ROM_LOAD( "maddonna.b6", 0x200000, 0x080000, CRC(b02e9e0e) SHA1(6e527a2bfda0f4f420c10139c75dac2704e08d08) )
+ ROM_LOAD( "maddonna.b8", 0x280000, 0x080000, CRC(03f1de40) SHA1(bb0c0525155404c0740ac5f048f71ae7651a5941) )
+ ROM_LOAD( "maddonna.b10", 0x300000, 0x080000, CRC(87936423) SHA1(dda42f3685427edad7686d9712ff07d2fd9bf57e) )
+ ROM_LOAD( "maddonna.b12", 0x380000, 0x080000, CRC(879ab23c) SHA1(5288016542a10e60ccb28a930d8dfe4db41c6fc6) )
ROM_REGION( 0x100000, "oki", ROMREGION_ERASE00 ) /* Samples */
/* no samples for this game */
ROM_REGION( 0x10000, "user1", 0 )
- ROM_LOAD( "x1", 0x00000, 0x10000, CRC(6b213183) SHA1(599c59d155d11edb151bfaed1d24ef964462a447) ) // motherboard rom, zooming?
+ ROM_LOAD( "x1", 0x00000, 0x10000, CRC(6b213183) SHA1(599c59d155d11edb151bfaed1d24ef964462a447) ) // motherboard rom, unknown purpose
ROM_END
-// The tiles containing the copyright string (tiles 0x3979 onwards) differ in this set.
-// Both versions have tiles containing the 'Tuning - Germany' copyright messages, but
-// the parent set has additional tiles containing the '(c)Copyright 1995' which is shown
-// on the title screen.
-//
-// The lack of these tiles in this set causes all subsequent tiles to be shifted. It is
-// likely that the correct program roms for this set either don't show '(c)Copyright 1995'
-// or display it using the regular font instead.
+ROM_START( komocomo ) // ROM PCB marked : GAME B/D TOPnew1 002
+ ROM_REGION( 0x40000, "maincpu", 0 ) /* 68000 Code */
+ ROM_LOAD16_BYTE( "11.ua24", 0x00000, 0x10000, CRC(31c18579) SHA1(da97207afced0cf844b111752e9f634a49bc7115) )
+ ROM_LOAD16_BYTE( "10.ua22", 0x00001, 0x10000, CRC(fa839c0f) SHA1(53aee489e694e5777bd5ac20aa2b51c2c9e5493a) )
+
+ ROM_REGION( 0x10000, "audiocpu", 0 ) /* Z80 Code */
+ ROM_LOAD( "9.ua2", 0x00000, 0x010000, CRC(f2080071) SHA1(68cbae9559879b2dc19c41a7efbd13ab4a569d3f) )
+
+ ROM_REGION( 0x400000, "gfx1", 0 ) /* Sprites */
+ ROM_LOAD( "8.ui16a", 0x000000, 0x080000, CRC(11ac04ab) SHA1(321a7af3bdf47fa0ec1f7bbd758dd1023b409a06) )
+ ROM_LOAD( "6.ui13a", 0x080000, 0x080000, CRC(bb498592) SHA1(f7946a40d35ae0726860dd65f1aaf1c145d51afd) )
+ ROM_LOAD( "4.ui11a", 0x100000, 0x080000, CRC(d22dd6d8) SHA1(f466167d088275cdc973535401895272d48c8079) )
+ ROM_LOAD( "2.ui8a", 0x180000, 0x080000, CRC(cc5360f8) SHA1(61670b970a71af8f008052a98c10127f8b412a85) )
+ ROM_LOAD( "7.ui16", 0x200000, 0x080000, CRC(dc71de75) SHA1(adc8f51acf34e41b94a740dc2b7a66b23a7ffcf5) )
+ ROM_LOAD( "5.ui13", 0x280000, 0x080000, CRC(56bc3719) SHA1(947d7fe45273052fbd666ad8e9bef9818c6e3104) )
+ ROM_LOAD( "3.ui11", 0x300000, 0x080000, CRC(646073d1) SHA1(87593ccbe9419da2ea70763784acc12221b5bed8) )
+ ROM_LOAD( "1.ui8", 0x380000, 0x080000, CRC(58ba6622) SHA1(ee5a759ab22a663da5bba1db5fec23958bfee771) )
+
+ ROM_REGION( 0x100000, "oki", ROMREGION_ERASE00 ) /* Samples */
+ /* no samples for this game */
+
+ ROM_REGION( 0x10000, "user1", 0 )
+ ROM_LOAD( "12.bin", 0x00000, 0x10000, CRC(6b213183) SHA1(599c59d155d11edb151bfaed1d24ef964462a447) ) // motherboard rom, unknown purpose
+ROM_END
+
+
+/* The tiles containing the copyright string (tiles 0x3979 onwards) differ in this set.
+ Both versions have tiles containing the 'Tuning - Germany' copyright messages, but
+ the parent set has additional tiles containing the '(c)Copyright 1995' which is shown
+ on the title screen.
+
+ The lack of these tiles in this set causes all subsequent tiles to be shifted. It is
+ likely that the correct program roms for this set either don't show '(c)Copyright 1995'
+ or display it using the regular font instead. */
-ROM_START( maddonnb )
+ROM_START( maddonnab )
ROM_REGION( 0x40000, "maincpu", 0 ) /* 68000 Code */
/* program roms missing in this dump, gfx don't seem 100% correct for other ones */
ROM_LOAD16_BYTE( "maddonnb.b16", 0x00000, 0x20000, NO_DUMP )
@@ -485,11 +593,13 @@ ROM_START( maddonnb )
/* no samples for this game */
ROM_REGION( 0x10000, "user1", 0 )
- ROM_LOAD( "x1", 0x00000, 0x10000, CRC(6b213183) SHA1(599c59d155d11edb151bfaed1d24ef964462a447) ) // motherboard rom, zooming?
+ ROM_LOAD( "x1", 0x00000, 0x10000, CRC(6b213183) SHA1(599c59d155d11edb151bfaed1d24ef964462a447) ) // motherboard rom, unknown purpose
ROM_END
+// all sets have a large (unused) PROMAT logo in them
+GAME( 1995, maddonna, 0, maddonna, maddonna, oneshot_state, empty_init, ROT0, "Promat (Tuning license)", "Mad Donna (Tuning, set 1)", MACHINE_SUPPORTS_SAVE )
+GAME( 1995, maddonnab,maddonna, maddonna, maddonna, oneshot_state, empty_init, ROT0, "Promat (Tuning license)", "Mad Donna (Tuning, set 2)", MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE )
+GAME( 1995, komocomo, maddonna, komocomo, maddonna, oneshot_state, empty_init, ROT0, "bootleg", "Komo Como (Topmar, bootleg?)", MACHINE_SUPPORTS_SAVE ) // shows TOPMAR (an anagram of PROMAT) on the side, possibly a hack of the original PROMAT version
-GAME( 1995, maddonna, 0, maddonna, maddonna, oneshot_state, empty_init, ROT0, "Tuning", "Mad Donna (set 1)", MACHINE_SUPPORTS_SAVE )
-GAME( 1995, maddonnb, maddonna, maddonna, maddonna, oneshot_state, empty_init, ROT0, "Tuning", "Mad Donna (set 2)", MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE )
GAME( 1996, oneshot, 0, oneshot, oneshot , oneshot_state, empty_init, ROT0, "Promat", "One Shot One Kill", MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE )
diff --git a/src/mame/drivers/opwolf.cpp b/src/mame/drivers/opwolf.cpp
index 71f6202ef6c..432b2145c76 100644
--- a/src/mame/drivers/opwolf.cpp
+++ b/src/mame/drivers/opwolf.cpp
@@ -933,35 +933,35 @@ TIMER_DEVICE_CALLBACK_MEMBER(opwolf_state::cchip_irq_clear_cb)
// MACHINE DEFINTIONS
//**************************************************************************
-MACHINE_CONFIG_START(opwolf_state::opwolf)
-
+void opwolf_state::opwolf(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M68000, CPU_CLOCK ) /* 8 MHz */
- MCFG_DEVICE_PROGRAM_MAP(opwolf_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", opwolf_state, interrupt)
+ M68000(config, m_maincpu, CPU_CLOCK); /* 8 MHz */
+ m_maincpu->set_addrmap(AS_PROGRAM, &opwolf_state::opwolf_map);
+ m_maincpu->set_vblank_int("screen", FUNC(opwolf_state::interrupt));
- MCFG_DEVICE_ADD("audiocpu", Z80, SOUND_CPU_CLOCK ) /* 4 MHz */
- MCFG_DEVICE_PROGRAM_MAP(opwolf_sound_z80_map)
+ Z80(config, m_audiocpu, SOUND_CPU_CLOCK); /* 4 MHz */
+ m_audiocpu->set_addrmap(AS_PROGRAM, &opwolf_state::opwolf_sound_z80_map);
TAITO_CCHIP(config, m_cchip, 12_MHz_XTAL); /* 12MHz measured on pin 20 */
m_cchip->in_pb_callback().set_ioport("IN0");
m_cchip->in_pc_callback().set_ioport("IN1");
m_cchip->out_pb_callback().set(FUNC(opwolf_state::counters_w));
- MCFG_TIMER_DRIVER_ADD("cchip_irq_clear", opwolf_state, cchip_irq_clear_cb)
+ TIMER(config, "cchip_irq_clear").configure_generic(FUNC(opwolf_state::cchip_irq_clear_cb));
- MCFG_QUANTUM_TIME(attotime::from_hz(600)) /* 10 CPU slices per frame - enough for the sound CPU to read all commands */
+ config.m_minimum_quantum = attotime::from_hz(600); /* 10 CPU slices per frame - enough for the sound CPU to read all commands */
MCFG_MACHINE_RESET_OVERRIDE(opwolf_state,opwolf)
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(40*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 40*8-1, 1*8, 31*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(opwolf_state, screen_update_opwolf)
- MCFG_SCREEN_PALETTE("palette")
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(40*8, 32*8);
+ screen.set_visarea(0*8, 40*8-1, 1*8, 31*8-1);
+ screen.set_screen_update(FUNC(opwolf_state::screen_update_opwolf));
+ screen.set_palette("palette");
GFXDECODE(config, "gfxdecode", "palette", gfx_opwolf);
PALETTE(config, "palette").set_format(palette_device::xRGB_444, 2048);
@@ -984,58 +984,58 @@ MACHINE_CONFIG_START(opwolf_state::opwolf)
ymsnd.add_route(0, "lspeaker", 1.0);
ymsnd.add_route(1, "rspeaker", 1.0);
- MCFG_DEVICE_ADD("msm0", MSM5205, 384000)
- MCFG_MSM5205_VCLK_CB(WRITELINE(*this, opwolf_state, msm5205_vck_w<0>))
- MCFG_MSM5205_PRESCALER_SELECTOR(S48_4B) /* 8 kHz */
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 1.0)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 1.0)
+ MSM5205(config, m_msm[0], 384000);
+ m_msm[0]->vck_legacy_callback().set(FUNC(opwolf_state::msm5205_vck_w<0>));
+ m_msm[0]->set_prescaler_selector(msm5205_device::S48_4B); /* 8 kHz */
+ m_msm[0]->add_route(ALL_OUTPUTS, "lspeaker", 1.0);
+ m_msm[0]->add_route(ALL_OUTPUTS, "rspeaker", 1.0);
- MCFG_DEVICE_ADD("msm1", MSM5205, 384000)
- MCFG_MSM5205_VCLK_CB(WRITELINE(*this, opwolf_state, msm5205_vck_w<1>))
- MCFG_MSM5205_PRESCALER_SELECTOR(S48_4B) /* 8 kHz */
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 1.0)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 1.0)
+ MSM5205(config, m_msm[1], 384000);
+ m_msm[1]->vck_legacy_callback().set(FUNC(opwolf_state::msm5205_vck_w<1>));
+ m_msm[1]->set_prescaler_selector(msm5205_device::S48_4B); /* 8 kHz */
+ m_msm[1]->add_route(ALL_OUTPUTS, "lspeaker", 1.0);
+ m_msm[1]->add_route(ALL_OUTPUTS, "rspeaker", 1.0);
pc060ha_device &ciu(PC060HA(config, "ciu", 0));
ciu.set_master_tag(m_maincpu);
ciu.set_slave_tag(m_audiocpu);
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(opwolf_state::opwolfp)
+void opwolf_state::opwolfp(machine_config &config)
+{
opwolf(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu") /* 8 MHz */
- MCFG_DEVICE_PROGRAM_MAP(opwolfp_map)
+ m_maincpu->set_addrmap(AS_PROGRAM, &opwolf_state::opwolfp_map);
- MCFG_DEVICE_REMOVE("cchip")
- MCFG_DEVICE_REMOVE("cchip_irq_clear")
-MACHINE_CONFIG_END
-
-MACHINE_CONFIG_START(opwolf_state::opwolfb) /* OSC clocks unknown for the bootleg, but changed to match original sets */
+ config.device_remove("cchip");
+ config.device_remove("cchip_irq_clear");
+}
+void opwolf_state::opwolfb(machine_config &config) /* OSC clocks unknown for the bootleg, but changed to match original sets */
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M68000, CPU_CLOCK ) /* 8 MHz ??? */
- MCFG_DEVICE_PROGRAM_MAP(opwolfb_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", opwolf_state, irq5_line_hold)
+ M68000(config, m_maincpu, CPU_CLOCK); /* 8 MHz ??? */
+ m_maincpu->set_addrmap(AS_PROGRAM, &opwolf_state::opwolfb_map);
+ m_maincpu->set_vblank_int("screen", FUNC(opwolf_state::irq5_line_hold));
- MCFG_DEVICE_ADD("audiocpu", Z80, SOUND_CPU_CLOCK ) /* 4 MHz ??? */
- MCFG_DEVICE_PROGRAM_MAP(opwolf_sound_z80_map)
+ Z80(config, m_audiocpu, SOUND_CPU_CLOCK); /* 4 MHz ??? */
+ m_audiocpu->set_addrmap(AS_PROGRAM, &opwolf_state::opwolf_sound_z80_map);
- MCFG_DEVICE_ADD("sub", Z80, SOUND_CPU_CLOCK ) /* 4 MHz ??? */
- MCFG_DEVICE_PROGRAM_MAP(opwolfb_sub_z80_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", opwolf_state, irq0_line_hold)
+ z80_device &sub(Z80(config, "sub", SOUND_CPU_CLOCK)); /* 4 MHz ??? */
+ sub.set_addrmap(AS_PROGRAM, &opwolf_state::opwolfb_sub_z80_map);
+ sub.set_vblank_int("screen", FUNC(opwolf_state::irq0_line_hold));
- MCFG_QUANTUM_TIME(attotime::from_hz(600)) /* 10 CPU slices per frame - enough for the sound CPU to read all commands */
+ config.m_minimum_quantum = attotime::from_hz(600); /* 10 CPU slices per frame - enough for the sound CPU to read all commands */
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(40*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 40*8-1, 1*8, 31*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(opwolf_state, screen_update_opwolf)
- MCFG_SCREEN_PALETTE("palette")
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(40*8, 32*8);
+ screen.set_visarea(0*8, 40*8-1, 1*8, 31*8-1);
+ screen.set_screen_update(FUNC(opwolf_state::screen_update_opwolf));
+ screen.set_palette("palette");
GFXDECODE(config, "gfxdecode", "palette", gfx_opwolfb);
PALETTE(config, "palette").set_format(palette_device::xRGB_444, 2048);
@@ -1058,22 +1058,22 @@ MACHINE_CONFIG_START(opwolf_state::opwolfb) /* OSC clocks unknown for the bootle
ymsnd.add_route(0, "lspeaker", 1.0);
ymsnd.add_route(1, "rspeaker", 1.0);
- MCFG_DEVICE_ADD("msm0", MSM5205, 384000)
- MCFG_MSM5205_VCLK_CB(WRITELINE(*this, opwolf_state, msm5205_vck_w<0>))
- MCFG_MSM5205_PRESCALER_SELECTOR(S48_4B) /* 8 kHz */
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 1.0)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 1.0)
+ MSM5205(config, m_msm[0], 384000);
+ m_msm[0]->vck_legacy_callback().set(FUNC(opwolf_state::msm5205_vck_w<0>));
+ m_msm[0]->set_prescaler_selector(msm5205_device::S48_4B); /* 8 kHz */
+ m_msm[0]->add_route(ALL_OUTPUTS, "lspeaker", 1.0);
+ m_msm[0]->add_route(ALL_OUTPUTS, "rspeaker", 1.0);
- MCFG_DEVICE_ADD("msm1", MSM5205, 384000)
- MCFG_MSM5205_VCLK_CB(WRITELINE(*this, opwolf_state, msm5205_vck_w<1>))
- MCFG_MSM5205_PRESCALER_SELECTOR(S48_4B) /* 8 kHz */
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 1.0)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 1.0)
+ MSM5205(config, m_msm[1], 384000);
+ m_msm[1]->vck_legacy_callback().set(FUNC(opwolf_state::msm5205_vck_w<1>));
+ m_msm[1]->set_prescaler_selector(msm5205_device::S48_4B); /* 8 kHz */
+ m_msm[1]->add_route(ALL_OUTPUTS, "lspeaker", 1.0);
+ m_msm[1]->add_route(ALL_OUTPUTS, "rspeaker", 1.0);
pc060ha_device &ciu(PC060HA(config, "ciu", 0));
ciu.set_master_tag(m_maincpu);
ciu.set_slave_tag(m_audiocpu);
-MACHINE_CONFIG_END
+}
//**************************************************************************
diff --git a/src/mame/drivers/orao.cpp b/src/mame/drivers/orao.cpp
index f8f98b1934e..7d7bf272614 100644
--- a/src/mame/drivers/orao.cpp
+++ b/src/mame/drivers/orao.cpp
@@ -171,19 +171,20 @@ static INPUT_PORTS_START( orao )
INPUT_PORTS_END
/* Machine driver */
-MACHINE_CONFIG_START(orao_state::orao)
+void orao_state::orao(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M6502, 1000000)
- MCFG_DEVICE_PROGRAM_MAP(orao_mem)
+ M6502(config, m_maincpu, 1000000);
+ m_maincpu->set_addrmap(AS_PROGRAM, &orao_state::orao_mem);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(50)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */
- MCFG_SCREEN_SIZE(256, 256)
- MCFG_SCREEN_VISIBLE_AREA(0, 256-1, 0, 256-1)
- MCFG_SCREEN_UPDATE_DRIVER(orao_state, screen_update_orao)
- MCFG_SCREEN_PALETTE("palette")
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(50);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */
+ screen.set_size(256, 256);
+ screen.set_visarea(0, 256-1, 0, 256-1);
+ screen.set_screen_update(FUNC(orao_state::screen_update_orao));
+ screen.set_palette("palette");
PALETTE(config, "palette", palette_device::MONOCHROME);
@@ -193,13 +194,13 @@ MACHINE_CONFIG_START(orao_state::orao)
SPEAKER_SOUND(config, "speaker").add_route(ALL_OUTPUTS, "mono", 0.50);
WAVE(config, "wave", "cassette").add_route(ALL_OUTPUTS, "mono", 0.25);
- MCFG_CASSETTE_ADD( "cassette")
- MCFG_CASSETTE_FORMATS(orao_cassette_formats)
- MCFG_CASSETTE_DEFAULT_STATE(CASSETTE_STOPPED | CASSETTE_SPEAKER_ENABLED | CASSETTE_MOTOR_ENABLED)
- MCFG_CASSETTE_INTERFACE("orao_cass")
+ CASSETTE(config, m_cassette);
+ m_cassette->set_formats(orao_cassette_formats);
+ m_cassette->set_default_state(CASSETTE_STOPPED | CASSETTE_SPEAKER_ENABLED | CASSETTE_MOTOR_ENABLED);
+ m_cassette->set_interface("orao_cass");
- MCFG_SOFTWARE_LIST_ADD("cass_list","orao")
-MACHINE_CONFIG_END
+ SOFTWARE_LIST(config, "cass_list").set_original("orao");
+}
/* ROM definition */
ROM_START( orao )
diff --git a/src/mame/drivers/orbit.cpp b/src/mame/drivers/orbit.cpp
index 41097621386..1cd1a45117e 100644
--- a/src/mame/drivers/orbit.cpp
+++ b/src/mame/drivers/orbit.cpp
@@ -265,14 +265,14 @@ void orbit_state::machine_reset()
*
*************************************/
-MACHINE_CONFIG_START(orbit_state::orbit)
-
+void orbit_state::orbit(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD(m_maincpu, M6800, MASTER_CLOCK / 16)
- MCFG_DEVICE_PROGRAM_MAP(main_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", orbit_state, interrupt)
+ M6800(config, m_maincpu, MASTER_CLOCK / 16);
+ m_maincpu->set_addrmap(AS_PROGRAM, &orbit_state::main_map);
+ m_maincpu->set_vblank_int("screen", FUNC(orbit_state::interrupt));
- MCFG_TIMER_DRIVER_ADD_SCANLINE("32v", orbit_state, nmi_32v, "screen", 0, 32)
+ TIMER(config, "32v").configure_scanline(FUNC(orbit_state::nmi_32v), "screen", 0, 32);
F9334(config, m_latch); // M6
/* BIT0 => UNUSED */
@@ -291,12 +291,12 @@ MACHINE_CONFIG_START(orbit_state::orbit)
WATCHDOG_TIMER(config, "watchdog");
/* video hardware */
- MCFG_SCREEN_ADD(m_screen, RASTER)
- MCFG_SCREEN_RAW_PARAMS(MASTER_CLOCK*2, 384*2, 0, 256*2, 261*2, 0, 240*2)
- MCFG_SCREEN_UPDATE_DRIVER(orbit_state, screen_update)
- MCFG_SCREEN_PALETTE(m_palette)
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_raw(MASTER_CLOCK*2, 384*2, 0, 256*2, 261*2, 0, 240*2);
+ m_screen->set_screen_update(FUNC(orbit_state::screen_update));
+ m_screen->set_palette(m_palette);
- MCFG_DEVICE_ADD(m_gfxdecode, GFXDECODE, m_palette, gfx_orbit)
+ GFXDECODE(config, m_gfxdecode, m_palette, gfx_orbit);
PALETTE(config, m_palette, palette_device::MONOCHROME);
@@ -304,10 +304,10 @@ MACHINE_CONFIG_START(orbit_state::orbit)
SPEAKER(config, "lspeaker").front_left();
SPEAKER(config, "rspeaker").front_right();
- MCFG_DEVICE_ADD(m_discrete, DISCRETE, orbit_discrete)
- MCFG_SOUND_ROUTE(0, "lspeaker", 1.0)
- MCFG_SOUND_ROUTE(1, "rspeaker", 1.0)
-MACHINE_CONFIG_END
+ DISCRETE(config, m_discrete, orbit_discrete);
+ m_discrete->add_route(0, "lspeaker", 1.0);
+ m_discrete->add_route(1, "rspeaker", 1.0);
+}
diff --git a/src/mame/drivers/oric.cpp b/src/mame/drivers/oric.cpp
index 2f931263de7..f37c11748c0 100644
--- a/src/mame/drivers/oric.cpp
+++ b/src/mame/drivers/oric.cpp
@@ -87,6 +87,7 @@ public:
TIMER_CALLBACK_MEMBER(update_tape);
virtual void machine_start() override;
+ virtual void machine_reset() override;
virtual void video_start() override;
uint32_t screen_update_oric(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
DECLARE_WRITE_LINE_MEMBER(vblank_w);
@@ -306,11 +307,11 @@ void oric_state::update_psg(address_space &space)
{
if(m_via_ca2)
if(m_via_cb2)
- m_psg->address_w(space, 0, m_via_a);
+ m_psg->address_w(m_via_a);
else
- m_via->write_pa(space, 0, m_psg->data_r(space, 0));
+ m_via->write_pa(space, 0, m_psg->data_r());
else if(m_via_cb2)
- m_psg->data_w(space, 0, m_via_a);
+ m_psg->data_w(m_via_a);
}
void oric_state::update_irq()
@@ -411,6 +412,11 @@ void oric_state::machine_start()
}
+void oric_state::machine_reset()
+{
+ m_tape_timer->adjust(attotime::from_hz(4800), 0, attotime::from_hz(4800));
+}
+
void telestrat_state::machine_start()
{
machine_start_common();
@@ -428,6 +434,7 @@ void telestrat_state::machine_start()
void telestrat_state::machine_reset()
{
+ m_tape_timer->adjust(attotime::from_hz(4800), 0, attotime::from_hz(4800));
m_port_314 = 0x00;
m_via2_a = 0xff;
remap();
diff --git a/src/mame/drivers/orion.cpp b/src/mame/drivers/orion.cpp
index fdde04dd27a..d3c78eb099e 100644
--- a/src/mame/drivers/orion.cpp
+++ b/src/mame/drivers/orion.cpp
@@ -123,7 +123,7 @@ void orion_state::orion128(machine_config &config)
cassette.set_default_state(CASSETTE_STOPPED | CASSETTE_SPEAKER_ENABLED | CASSETTE_MOTOR_ENABLED);
cassette.set_interface("orion_cass");
- SOFTWARE_LIST(config, "cass_list").set_type("orion_cass", SOFTWARE_LIST_ORIGINAL_SYSTEM);
+ SOFTWARE_LIST(config, "cass_list").set_original("orion_cass");
FD1793(config, m_fdc, 8_MHz_XTAL / 8);
@@ -131,13 +131,13 @@ void orion_state::orion128(machine_config &config)
FLOPPY_CONNECTOR(config, "fd1", "525qd", FLOPPY_525_QD, true, orion_floppy_formats);
FLOPPY_CONNECTOR(config, "fd2", "525qd", FLOPPY_525_QD, true, orion_floppy_formats);
FLOPPY_CONNECTOR(config, "fd3", "525qd", FLOPPY_525_QD, true, orion_floppy_formats);
- SOFTWARE_LIST(config, "flop_list").set_type("orion_flop", SOFTWARE_LIST_ORIGINAL_SYSTEM);
+ SOFTWARE_LIST(config, "flop_list").set_original("orion_flop");
auto &cart(GENERIC_CARTSLOT(config, "cartslot"));
generic_plain_slot(cart);
cart.set_interface("orion_cart");
- SOFTWARE_LIST(config, "cart_list").set_type("orion_cart", SOFTWARE_LIST_ORIGINAL_SYSTEM);
+ SOFTWARE_LIST(config, "cart_list").set_original("orion_cart");
/* internal ram */
RAM(config, m_ram);
@@ -199,7 +199,7 @@ void orion_z80_state::orionz80(machine_config &config)
cassette.set_default_state(CASSETTE_STOPPED | CASSETTE_SPEAKER_ENABLED | CASSETTE_MOTOR_ENABLED);
cassette.set_interface("orion_cass");
- SOFTWARE_LIST(config, "cass_list").set_type("orion_cass", SOFTWARE_LIST_ORIGINAL_SYSTEM);
+ SOFTWARE_LIST(config, "cass_list").set_original("orion_cass");
FD1793(config, m_fdc, 8_MHz_XTAL / 8);
@@ -207,13 +207,13 @@ void orion_z80_state::orionz80(machine_config &config)
FLOPPY_CONNECTOR(config, "fd1", "525qd", FLOPPY_525_QD, true, orion_floppy_formats);
FLOPPY_CONNECTOR(config, "fd2", "525qd", FLOPPY_525_QD, true, orion_floppy_formats);
FLOPPY_CONNECTOR(config, "fd3", "525qd", FLOPPY_525_QD, true, orion_floppy_formats);
- SOFTWARE_LIST(config, "flop_list").set_type("orion_flop", SOFTWARE_LIST_ORIGINAL_SYSTEM);
+ SOFTWARE_LIST(config, "flop_list").set_original("orion_flop");
auto &cart(GENERIC_CARTSLOT(config, "cartslot"));
generic_plain_slot(cart);
cart.set_interface("orion_cart");
- SOFTWARE_LIST(config, "cart_list").set_type("orion_cart", SOFTWARE_LIST_ORIGINAL_SYSTEM);
+ SOFTWARE_LIST(config, "cart_list").set_original("orion_cart");
/* internal ram */
RAM(config, m_ram);
@@ -271,7 +271,7 @@ void orion_pro_state::orionpro(machine_config &config)
cassette.set_default_state(CASSETTE_STOPPED | CASSETTE_SPEAKER_ENABLED | CASSETTE_MOTOR_ENABLED);
cassette.set_interface("orion_cass");
- SOFTWARE_LIST(config, "cass_list").set_type("orion_cass", SOFTWARE_LIST_ORIGINAL_SYSTEM);
+ SOFTWARE_LIST(config, "cass_list").set_original("orion_cass");
FD1793(config, m_fdc, 8_MHz_XTAL / 8);
@@ -279,13 +279,14 @@ void orion_pro_state::orionpro(machine_config &config)
FLOPPY_CONNECTOR(config, "fd1", "525qd", FLOPPY_525_QD, true, orion_floppy_formats);
FLOPPY_CONNECTOR(config, "fd2", "525qd", FLOPPY_525_QD, true, orion_floppy_formats);
FLOPPY_CONNECTOR(config, "fd3", "525qd", FLOPPY_525_QD, true, orion_floppy_formats);
- SOFTWARE_LIST(config, "flop_list").set_type("orion_flop", SOFTWARE_LIST_ORIGINAL_SYSTEM);
+ SOFTWARE_LIST(config, "flop_list").set_original("orionpro_flop");
+ SOFTWARE_LIST(config, "flop128_list").set_compatible("orion_flop");
auto &cart(GENERIC_CARTSLOT(config, "cartslot"));
generic_plain_slot(cart);
cart.set_interface("orion_cart");
- SOFTWARE_LIST(config, "cart_list").set_type("orion_cart", SOFTWARE_LIST_ORIGINAL_SYSTEM);
+ SOFTWARE_LIST(config, "cart_list").set_original("orion_cart");
/* internal ram */
RAM(config, m_ram);
diff --git a/src/mame/drivers/osbexec.cpp b/src/mame/drivers/osbexec.cpp
index 0c2b1e31d79..09303009a4f 100644
--- a/src/mame/drivers/osbexec.cpp
+++ b/src/mame/drivers/osbexec.cpp
@@ -528,7 +528,8 @@ static const z80_daisy_config osbexec_daisy_config[] =
};
-MACHINE_CONFIG_START(osbexec_state::osbexec)
+void osbexec_state::osbexec(machine_config &config)
+{
Z80(config, m_maincpu, MAIN_CLOCK/6);
m_maincpu->set_addrmap(AS_PROGRAM, &osbexec_state::osbexec_mem);
m_maincpu->set_addrmap(AS_IO, &osbexec_state::osbexec_io);
@@ -545,8 +546,7 @@ MACHINE_CONFIG_START(osbexec_state::osbexec)
PALETTE(config, "palette", palette_device::MONOCHROME_HIGHLIGHT);
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD(m_speaker, SPEAKER_SOUND)
- MCFG_SOUND_ROUTE( ALL_OUTPUTS, "mono", 1.00 )
+ SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 1.00);
PIA6821(config, m_pia[0], 0);
m_pia[0]->readpa_handler().set(FUNC(osbexec_state::osbexec_pia0_a_r));
@@ -558,7 +558,7 @@ MACHINE_CONFIG_START(osbexec_state::osbexec)
m_pia[0]->irqa_handler().set("mainirq", FUNC(input_merger_device::in_w<0>));
m_pia[0]->irqb_handler().set("mainirq", FUNC(input_merger_device::in_w<1>));
- MCFG_DEVICE_ADD(m_pia[1], PIA6821, 0)
+ PIA6821(config, m_pia[1], 0);
m_pia[1]->irqa_handler().set("mainirq", FUNC(input_merger_device::in_w<2>));
m_pia[1]->irqb_handler().set("mainirq", FUNC(input_merger_device::in_w<3>));
@@ -601,15 +601,15 @@ MACHINE_CONFIG_START(osbexec_state::osbexec)
MB8877(config, m_mb8877, MAIN_CLOCK/24);
m_mb8877->intrq_wr_callback().set(m_pia[1], FUNC(pia6821_device::cb1_w));
- MCFG_FLOPPY_DRIVE_ADD("mb8877:0", osborne2_floppies, "525ssdd", floppy_image_device::default_floppy_formats)
- MCFG_FLOPPY_DRIVE_ADD("mb8877:1", osborne2_floppies, "525ssdd", floppy_image_device::default_floppy_formats)
+ FLOPPY_CONNECTOR(config, "mb8877:0", osborne2_floppies, "525ssdd", floppy_image_device::default_floppy_formats);
+ FLOPPY_CONNECTOR(config, "mb8877:1", osborne2_floppies, "525ssdd", floppy_image_device::default_floppy_formats);
/* internal ram */
RAM(config, RAM_TAG).set_default_size("136K"); /* 128KB Main RAM + RAM in ROM bank (8) */
/* software lists */
- MCFG_SOFTWARE_LIST_ADD("flop_list", "osborne2")
-MACHINE_CONFIG_END
+ SOFTWARE_LIST(config, "flop_list").set_original("osborne2");
+}
ROM_START( osbexec )
diff --git a/src/mame/drivers/othello.cpp b/src/mame/drivers/othello.cpp
index 7e2d26959c6..b7588ab04c4 100644
--- a/src/mame/drivers/othello.cpp
+++ b/src/mame/drivers/othello.cpp
@@ -251,14 +251,14 @@ WRITE8_MEMBER(othello_state::ack_w)
WRITE8_MEMBER(othello_state::ay_address_w)
{
- if (m_ay_select & 1) m_ay[0]->address_w(space, 0, data);
- if (m_ay_select & 2) m_ay[1]->address_w(space, 0, data);
+ if (m_ay_select & 1) m_ay[0]->address_w(data);
+ if (m_ay_select & 2) m_ay[1]->address_w(data);
}
WRITE8_MEMBER(othello_state::ay_data_w)
{
- if (m_ay_select & 1) m_ay[0]->data_w(space, 0, data);
- if (m_ay_select & 2) m_ay[1]->data_w(space, 0, data);
+ if (m_ay_select & 1) m_ay[0]->data_w(data);
+ if (m_ay_select & 2) m_ay[1]->data_w(data);
}
void othello_state::audio_map(address_map &map)
@@ -435,7 +435,6 @@ void othello_state::othello(machine_config &config)
DAC_8BIT_R2R(config, "dac", 0).add_route(ALL_OUTPUTS, "speaker", 0.3); // unknown DAC
voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref", 0));
- vref.set_output(5.0);
vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT);
vref.add_route(0, "dac", -1.0, DAC_VREF_NEG_INPUT);
}
diff --git a/src/mame/drivers/otomedius.cpp b/src/mame/drivers/otomedius.cpp
index 0e71a41f04c..04b1646fe53 100644
--- a/src/mame/drivers/otomedius.cpp
+++ b/src/mame/drivers/otomedius.cpp
@@ -67,20 +67,20 @@ void konami_pc_state::machine_reset()
{
}
-MACHINE_CONFIG_START(konami_pc_state::konami_pc)
-
+void konami_pc_state::konami_pc(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", PENTIUM3, 100000000) // not correct, but why bother?
- MCFG_DEVICE_PROGRAM_MAP(konami_pc_map)
+ PENTIUM3(config, m_maincpu, 100000000); // not correct, but why bother?
+ m_maincpu->set_addrmap(AS_PROGRAM, &konami_pc_state::konami_pc_map);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(640, 480)
- MCFG_SCREEN_VISIBLE_AREA(0, 640-1, 0, 480-1)
- MCFG_SCREEN_UPDATE_DRIVER(konami_pc_state, screen_update_konami_pc)
-MACHINE_CONFIG_END
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(640, 480);
+ screen.set_visarea(0, 640-1, 0, 480-1);
+ screen.set_screen_update(FUNC(konami_pc_state::screen_update_konami_pc));
+}
/***************************************************************************
diff --git a/src/mame/drivers/p112.cpp b/src/mame/drivers/p112.cpp
index 178c57f5d9d..7b4c6cb4ad3 100644
--- a/src/mame/drivers/p112.cpp
+++ b/src/mame/drivers/p112.cpp
@@ -90,25 +90,24 @@ uint32_t p112_state::screen_update_p112(screen_device &screen, bitmap_ind16 &bit
return 0;
}
-MACHINE_CONFIG_START(p112_state::p112)
+void p112_state::p112(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu",Z180, XTAL(16'000'000))
- MCFG_DEVICE_PROGRAM_MAP(p112_mem)
- MCFG_DEVICE_IO_MAP(p112_io)
-
+ Z180(config, m_maincpu, XTAL(16'000'000));
+ m_maincpu->set_addrmap(AS_PROGRAM, &p112_state::p112_mem);
+ m_maincpu->set_addrmap(AS_IO, &p112_state::p112_io);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(50)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */
- MCFG_SCREEN_SIZE(240, 320)
- MCFG_SCREEN_VISIBLE_AREA(0, 240-1, 0, 320-1)
- MCFG_SCREEN_UPDATE_DRIVER(p112_state, screen_update_p112)
- MCFG_SCREEN_PALETTE("palette")
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(50);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */
+ screen.set_size(240, 320);
+ screen.set_visarea(0, 240-1, 0, 320-1);
+ screen.set_screen_update(FUNC(p112_state::screen_update_p112));
+ screen.set_palette("palette");
PALETTE(config, "palette", palette_device::MONOCHROME);
-
-MACHINE_CONFIG_END
+}
/* ROM definition */
ROM_START( p112 )
diff --git a/src/mame/drivers/p2000t.cpp b/src/mame/drivers/p2000t.cpp
index 67d0cb832a7..1f5a0fccc51 100644
--- a/src/mame/drivers/p2000t.cpp
+++ b/src/mame/drivers/p2000t.cpp
@@ -221,49 +221,50 @@ READ8_MEMBER( p2000t_state::videoram_r )
}
/* Machine definition */
-MACHINE_CONFIG_START(p2000t_state::p2000t)
+void p2000t_state::p2000t(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, 2500000)
- MCFG_DEVICE_PROGRAM_MAP(p2000t_mem)
- MCFG_DEVICE_IO_MAP(p2000t_io)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", p2000t_state, p2000_interrupt)
+ Z80(config, m_maincpu, 2500000);
+ m_maincpu->set_addrmap(AS_PROGRAM, &p2000t_state::p2000t_mem);
+ m_maincpu->set_addrmap(AS_IO, &p2000t_state::p2000t_io);
+ m_maincpu->set_vblank_int("screen", FUNC(p2000t_state::p2000_interrupt));
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(50)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500))
- MCFG_SCREEN_SIZE(40 * 12, 24 * 20)
- MCFG_SCREEN_VISIBLE_AREA(0, 40 * 12 - 1, 0, 24 * 20 - 1)
- MCFG_SCREEN_UPDATE_DEVICE("saa5050", saa5050_device, screen_update)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(50);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500));
+ screen.set_size(40 * 12, 24 * 20);
+ screen.set_visarea(0, 40 * 12 - 1, 0, 24 * 20 - 1);
+ screen.set_screen_update("saa5050", FUNC(saa5050_device::screen_update));
- MCFG_DEVICE_ADD("saa5050", SAA5050, 6000000)
- MCFG_SAA5050_D_CALLBACK(READ8(*this, p2000t_state, videoram_r))
- MCFG_SAA5050_SCREEN_SIZE(40, 24, 80)
+ saa5050_device &saa5050(SAA5050(config, "saa5050", 6000000));
+ saa5050.d_cb().set(FUNC(p2000t_state::videoram_r));
+ saa5050.set_screen_size(40, 24, 80);
/* sound hardware */
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("speaker", SPEAKER_SOUND)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25)
-MACHINE_CONFIG_END
+ SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25);
+}
/* Machine definition */
-MACHINE_CONFIG_START(p2000m_state::p2000m)
+void p2000m_state::p2000m(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, 2500000)
- MCFG_DEVICE_PROGRAM_MAP(p2000m_mem)
- MCFG_DEVICE_IO_MAP(p2000t_io)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", p2000m_state, p2000_interrupt)
- MCFG_QUANTUM_TIME(attotime::from_hz(60))
+ Z80(config, m_maincpu, 2500000);
+ m_maincpu->set_addrmap(AS_PROGRAM, &p2000m_state::p2000m_mem);
+ m_maincpu->set_addrmap(AS_IO, &p2000m_state::p2000t_io);
+ m_maincpu->set_vblank_int("screen", FUNC(p2000m_state::p2000_interrupt));
+ config.m_minimum_quantum = attotime::from_hz(60);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(50)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */
- MCFG_SCREEN_SIZE(80 * 12, 24 * 20)
- MCFG_SCREEN_VISIBLE_AREA(0, 80 * 12 - 1, 0, 24 * 20 - 1)
- MCFG_SCREEN_UPDATE_DRIVER(p2000m_state, screen_update_p2000m)
- MCFG_SCREEN_PALETTE(m_palette)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(50);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */
+ screen.set_size(80 * 12, 24 * 20);
+ screen.set_visarea(0, 80 * 12 - 1, 0, 24 * 20 - 1);
+ screen.set_screen_update(FUNC(p2000m_state::screen_update_p2000m));
+ screen.set_palette(m_palette);
GFXDECODE(config, m_gfxdecode, m_palette, gfx_p2000m);
PALETTE(config, m_palette, FUNC(p2000m_state::p2000m_palette), 4);
@@ -271,7 +272,7 @@ MACHINE_CONFIG_START(p2000m_state::p2000m)
/* sound hardware */
SPEAKER(config, "mono").front_center();
SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25);
-MACHINE_CONFIG_END
+}
ROM_START(p2000t)
diff --git a/src/mame/drivers/p8k.cpp b/src/mame/drivers/p8k.cpp
index a5302baf1aa..79efb9f0aae 100644
--- a/src/mame/drivers/p8k.cpp
+++ b/src/mame/drivers/p8k.cpp
@@ -416,7 +416,8 @@ GFXDECODE_END
****************************************************************************/
-MACHINE_CONFIG_START(p8k_state::p8k)
+void p8k_state::p8k(machine_config &config)
+{
/* basic machine hardware */
z80_device& maincpu(Z80(config, "maincpu", 16_MHz_XTAL / 4));
maincpu.set_daisy_config(p8k_daisy_chain);
@@ -473,25 +474,25 @@ MACHINE_CONFIG_START(p8k_state::p8k)
m_pio2->out_int_callback().set_inputline(m_maincpu, INPUT_LINE_IRQ0);
m_pio2->in_pa_callback().set_ioport("DSW");
- I8272A(config, m_i8272, 16_MHz_XTAL / 8, true);
+ I8272A(config, m_i8272, 16_MHz_XTAL / 2, true);
m_i8272->drq_wr_callback().set("dma", FUNC(z80dma_device::rdy_w));
- MCFG_FLOPPY_DRIVE_ADD("i8272:0", p8k_floppies, "525hd", floppy_image_device::default_floppy_formats)
- MCFG_FLOPPY_DRIVE_ADD("i8272:1", p8k_floppies, "525hd", floppy_image_device::default_floppy_formats)
+ FLOPPY_CONNECTOR(config, "i8272:0", p8k_floppies, "525hd", floppy_image_device::default_floppy_formats);
+ FLOPPY_CONNECTOR(config, "i8272:1", p8k_floppies, "525hd", floppy_image_device::default_floppy_formats);
/* sound hardware */
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("beeper", BEEP, 3250)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.5)
-MACHINE_CONFIG_END
+ BEEP(config, "beeper", 3250).add_route(ALL_OUTPUTS, "mono", 0.5);
+}
-MACHINE_CONFIG_START(p8k_state::p8k_16)
+void p8k_state::p8k_16(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z8001, XTAL(4'000'000) )
- MCFG_DEVICE_PROGRAM_MAP(p8k_16_memmap)
- MCFG_DEVICE_DATA_MAP(p8k_16_datamap)
- MCFG_DEVICE_IO_MAP(p8k_16_iomap)
- MCFG_DEVICE_IRQ_ACKNOWLEDGE_DEVICE("p8k_16_daisy", p8k_16_daisy_device, irq_callback)
+ Z8001(config, m_maincpu, XTAL(4'000'000));
+ m_maincpu->set_addrmap(AS_PROGRAM, &p8k_state::p8k_16_memmap);
+ m_maincpu->set_addrmap(AS_DATA, &p8k_state::p8k_16_datamap);
+ m_maincpu->set_addrmap(AS_IO, &p8k_state::p8k_16_iomap);
+ m_maincpu->set_irq_acknowledge_callback("p8k_16_daisy", FUNC(p8k_16_daisy_device::irq_callback));
P8K_16_DAISY(config, m_daisy, 0);
m_daisy->set_daisy_config(p8k_16_daisy_chain);
@@ -531,9 +532,8 @@ MACHINE_CONFIG_START(p8k_state::p8k_16)
/* sound hardware */
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("beeper", BEEP, 3250)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.5)
-MACHINE_CONFIG_END
+ BEEP(config, "beeper", 3250).add_route(ALL_OUTPUTS, "mono", 0.5);
+}
/* ROM definition */
ROM_START( p8000 )
diff --git a/src/mame/drivers/pachifev.cpp b/src/mame/drivers/pachifev.cpp
index dda8e0b9c67..f10fb475d3e 100644
--- a/src/mame/drivers/pachifev.cpp
+++ b/src/mame/drivers/pachifev.cpp
@@ -155,10 +155,10 @@ void pachifev_state::pachifev_map(address_map &map)
map(0xff04, 0xff04).portr("DSW1");
map(0xff06, 0xff06).portr("DSW2");
map(0xff08, 0xff08).portr("DSW3");
- map(0xff10, 0xff10).rw("tms9928a", FUNC(tms9928a_device::vram_r), FUNC(tms9928a_device::vram_w));
- map(0xff12, 0xff12).rw("tms9928a", FUNC(tms9928a_device::register_r), FUNC(tms9928a_device::register_w));
- map(0xff20, 0xff20).w("y2404_1", FUNC(y2404_device::command_w));
- map(0xff30, 0xff30).w("y2404_2", FUNC(y2404_device::command_w));
+ map(0xff10, 0xff10).rw("tms9928a", FUNC(tms9928a_device::vram_read), FUNC(tms9928a_device::vram_write));
+ map(0xff12, 0xff12).rw("tms9928a", FUNC(tms9928a_device::register_read), FUNC(tms9928a_device::register_write));
+ map(0xff20, 0xff20).w("y2404_1", FUNC(y2404_device::write));
+ map(0xff30, 0xff30).w("y2404_2", FUNC(y2404_device::write));
map(0xff40, 0xff40).w(FUNC(pachifev_state::controls_w));
map(0xff50, 0xff50).nopw(); /* unknown */
map(0xfffa, 0xfffb).noprw(); /* decrementer */
@@ -167,7 +167,7 @@ void pachifev_state::pachifev_map(address_map &map)
void pachifev_state::pachifev_cru(address_map &map)
{
- map(0x000, 0x000).r(FUNC(pachifev_state::controls_r));
+ map(0x0000, 0x0001).r(FUNC(pachifev_state::controls_r));
}
@@ -350,8 +350,8 @@ void pachifev_state::machine_start()
save_item(NAME(m_cnt));
}
-MACHINE_CONFIG_START(pachifev_state::pachifev)
-
+void pachifev_state::pachifev(machine_config &config)
+{
// CPU TMS9995, standard variant; no line connections
TMS9995(config, m_maincpu, XTAL(12'000'000));
m_maincpu->set_addrmap(AS_PROGRAM, &pachifev_state::pachifev_map);
@@ -368,16 +368,14 @@ MACHINE_CONFIG_START(pachifev_state::pachifev)
/* sound hardware */
SPEAKER(config, "mono").front_center();
#if USE_MSM
- MCFG_DEVICE_ADD("adpcm", MSM5205, XTAL(384'000)) /* guess */
- MCFG_MSM5205_VCLK_CB(WRITELINE(*this, pachifev_state,pf_adpcm_int)) /* interrupt function */
- MCFG_MSM5205_PRESCALER_SELECTOR(MSM5205_S48_4B) /* 8kHz */
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.00)
+ msm5205_device &adpcm(MSM5205(config, "adpcm", XTAL(384'000))); /* guess */
+ adpcm.vck_legacy_callback().set(FUNC(pachifev_state::pf_adpcm_int)); /* interrupt function */
+ adpcm.set_prescaler_selector(msm5205_device::S48_4B); /* 8kHz */
+ adpcm.add_route(ALL_OUTPUTS, "mono", 1.00);
#endif
- MCFG_DEVICE_ADD("y2404_1", Y2404, XTAL(10'738'635)/3) /* guess */
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.30)
- MCFG_DEVICE_ADD("y2404_2", Y2404, XTAL(10'738'635)/3) /* guess */
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.30)
-MACHINE_CONFIG_END
+ Y2404(config, "y2404_1", XTAL(10'738'635)/3).add_route(ALL_OUTPUTS, "mono", 0.30); /* guess */
+ Y2404(config, "y2404_2", XTAL(10'738'635)/3).add_route(ALL_OUTPUTS, "mono", 0.30); /* guess */
+}
ROM_START( pachifev )
ROM_REGION( 0x10000, "maincpu", 0 )
diff --git a/src/mame/drivers/pacman.cpp b/src/mame/drivers/pacman.cpp
index a7f551473d0..ed05527b38f 100644
--- a/src/mame/drivers/pacman.cpp
+++ b/src/mame/drivers/pacman.cpp
@@ -1376,8 +1376,8 @@ void pacman_state::writeport(address_map &map)
void pacman_state::vanvan_portmap(address_map &map)
{
map.global_mask(0xff);
- map(0x01, 0x01).w("sn1", FUNC(sn76496_device::command_w));
- map(0x02, 0x02).w("sn2", FUNC(sn76496_device::command_w));
+ map(0x01, 0x01).w("sn1", FUNC(sn76496_device::write));
+ map(0x02, 0x02).w("sn2", FUNC(sn76496_device::write));
}
void pacman_state::dremshpr_portmap(address_map &map)
@@ -1417,7 +1417,7 @@ void pacman_state::bigbucks_portmap(address_map &map)
void pacman_state::s2650games_dataport(address_map &map)
{
- map(S2650_DATA_PORT, S2650_DATA_PORT).w("sn1", FUNC(sn76496_device::command_w));
+ map(S2650_DATA_PORT, S2650_DATA_PORT).w("sn1", FUNC(sn76496_device::write));
}
void pacman_state::drivfrcp_portmap(address_map &map)
@@ -3564,31 +3564,33 @@ void pacman_state::pacman(machine_config &config, bool latch)
m_namco_sound->add_route(ALL_OUTPUTS, "mono", 1.0);
}
-MACHINE_CONFIG_START(pacman_state::maketrax)
+void pacman_state::maketrax(machine_config &config)
+{
pacman(config);
MCFG_MACHINE_RESET_OVERRIDE(pacman_state,maketrax)
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(pacman_state::korosuke)
+void pacman_state::korosuke(machine_config &config)
+{
maketrax(config);
// 8K on original boards
m_mainlatch->q_out_cb<7>().set_nop(); // outputs 4-7 go to protection chip at 6P
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(pacman_state::pengojpm)
+void pacman_state::pengojpm(machine_config &config)
+{
pacman(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(pengojpm_map)
-MACHINE_CONFIG_END
+ m_maincpu->set_addrmap(AS_PROGRAM, &pacman_state::pengojpm_map);
+}
-MACHINE_CONFIG_START(pacman_state::birdiy)
+void pacman_state::birdiy(machine_config &config)
+{
pacman(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(birdiy_map)
- MCFG_DEVICE_REMOVE_ADDRESS_MAP(AS_IO)
+ Z80(config.replace(), m_maincpu, MASTER_CLOCK/6);
+ m_maincpu->set_addrmap(AS_PROGRAM, &pacman_state::birdiy_map);
// 74LS259 at 8K or 4099 at 7K
m_mainlatch->q_out_cb<0>().set_nop();
@@ -3597,58 +3599,56 @@ MACHINE_CONFIG_START(pacman_state::birdiy)
m_mainlatch->q_out_cb<7>().set(FUNC(pacman_state::coin_counter_w));
MCFG_VIDEO_START_OVERRIDE(pacman_state,birdiy)
-MACHINE_CONFIG_END
-
-
+}
-MACHINE_CONFIG_START(pacman_state::piranha)
+void pacman_state::piranha(machine_config &config)
+{
pacman(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_IO_MAP(piranha_portmap)
-MACHINE_CONFIG_END
+ m_maincpu->set_addrmap(AS_IO, &pacman_state::piranha_portmap);
+}
-MACHINE_CONFIG_START(pacman_state::nmouse)
+void pacman_state::nmouse(machine_config &config)
+{
pacman(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_IO_MAP(nmouse_portmap)
-MACHINE_CONFIG_END
+ m_maincpu->set_addrmap(AS_IO, &pacman_state::nmouse_portmap);
+}
-MACHINE_CONFIG_START(pacman_state::mspacman)
+void pacman_state::mspacman(machine_config &config)
+{
pacman(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(mspacman_map)
+ m_maincpu->set_addrmap(AS_PROGRAM, &pacman_state::mspacman_map);
m_mainlatch->q_out_cb<6>().set(FUNC(pacman_state::coin_lockout_global_w));
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(pacman_state::woodpek)
+void pacman_state::woodpek(machine_config &config)
+{
pacman(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(woodpek_map)
-MACHINE_CONFIG_END
+ m_maincpu->set_addrmap(AS_PROGRAM, &pacman_state::woodpek_map);
+}
-MACHINE_CONFIG_START(pacman_state::numcrash)
+void pacman_state::numcrash(machine_config &config)
+{
pacman(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(numcrash_map)
+ m_maincpu->set_addrmap(AS_PROGRAM, &pacman_state::numcrash_map);
m_mainlatch->q_out_cb<3>().set_nop(); // ???
m_mainlatch->q_out_cb<7>().set_nop(); // ???
-MACHINE_CONFIG_END
+}
void pacman_state::alibaba(machine_config &config)
{
@@ -3669,107 +3669,104 @@ void pacman_state::alibaba(machine_config &config)
latch2.q_out_cb<2>().set(FUNC(pacman_state::irq_mask_w));
}
-MACHINE_CONFIG_START(pacman_state::dremshpr)
+void pacman_state::dremshpr(machine_config &config)
+{
pacman(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(dremshpr_map)
- MCFG_DEVICE_IO_MAP(dremshpr_portmap)
+ m_maincpu->set_addrmap(AS_PROGRAM, &pacman_state::dremshpr_map);
+ m_maincpu->set_addrmap(AS_IO, &pacman_state::dremshpr_portmap);
- MCFG_DEVICE_MODIFY("screen")
- MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE(*this, pacman_state, vblank_nmi))
+ subdevice<screen_device>("screen")->screen_vblank().set(FUNC(pacman_state::vblank_nmi));
/* sound hardware */
config.device_remove("namco");
AY8910(config, "ay8910", 14318000/8).add_route(ALL_OUTPUTS, "mono", 0.50);
m_mainlatch->q_out_cb<1>().set_nop();
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(pacman_state::theglobp)
+void pacman_state::theglobp(machine_config &config)
+{
pacman(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(epos_map)
- MCFG_DEVICE_IO_MAP(epos_portmap)
+ m_maincpu->set_addrmap(AS_PROGRAM, &pacman_state::epos_map);
+ m_maincpu->set_addrmap(AS_IO, &pacman_state::epos_portmap);
MCFG_MACHINE_START_OVERRIDE(pacman_state,theglobp)
MCFG_MACHINE_RESET_OVERRIDE(pacman_state,theglobp)
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(pacman_state::acitya)
+void pacman_state::acitya(machine_config &config)
+{
pacman(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(epos_map)
- MCFG_DEVICE_IO_MAP(epos_portmap)
+ m_maincpu->set_addrmap(AS_PROGRAM, &pacman_state::epos_map);
+ m_maincpu->set_addrmap(AS_IO, &pacman_state::epos_portmap);
MCFG_MACHINE_START_OVERRIDE(pacman_state,acitya)
MCFG_MACHINE_RESET_OVERRIDE(pacman_state,acitya)
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(pacman_state::eeekk)
+void pacman_state::eeekk(machine_config &config)
+{
pacman(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(epos_map)
- MCFG_DEVICE_IO_MAP(epos_portmap)
+ m_maincpu->set_addrmap(AS_PROGRAM, &pacman_state::epos_map);
+ m_maincpu->set_addrmap(AS_IO, &pacman_state::epos_portmap);
MCFG_MACHINE_START_OVERRIDE(pacman_state,eeekk)
MCFG_MACHINE_RESET_OVERRIDE(pacman_state,eeekk)
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(pacman_state::vanvan)
+void pacman_state::vanvan(machine_config &config)
+{
pacman(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(dremshpr_map)
- MCFG_DEVICE_IO_MAP(vanvan_portmap)
+ m_maincpu->set_addrmap(AS_PROGRAM, &pacman_state::dremshpr_map);
+ m_maincpu->set_addrmap(AS_IO, &pacman_state::vanvan_portmap);
/* video hardware */
- MCFG_SCREEN_MODIFY("screen")
- MCFG_SCREEN_VISIBLE_AREA(2*8, 34*8-1, 0*8, 28*8-1)
- MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE(*this, pacman_state, vblank_nmi))
+ screen_device &screen(*subdevice<screen_device>("screen"));
+ screen.set_visarea(2*8, 34*8-1, 0*8, 28*8-1);
+ screen.screen_vblank().set(FUNC(pacman_state::vblank_nmi));
/* sound hardware */
- MCFG_DEVICE_REMOVE("namco")
- MCFG_DEVICE_ADD("sn1", SN76496, 1789750)
+ config.device_remove("namco");
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.75)
- MCFG_DEVICE_ADD("sn2", SN76496, 1789750)
+ SN76496(config, "sn1", 1789750).add_route(ALL_OUTPUTS, "mono", 0.75);
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.75)
+ SN76496(config, "sn2", 1789750).add_route(ALL_OUTPUTS, "mono", 0.75);
m_mainlatch->q_out_cb<1>().set_nop();
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(pacman_state::bigbucks)
+void pacman_state::bigbucks(machine_config &config)
+{
pacman(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(bigbucks_map)
- MCFG_DEVICE_IO_MAP(bigbucks_portmap)
- MCFG_DEVICE_PERIODIC_INT_DRIVER(pacman_state, periodic_irq, 20*60)
+ m_maincpu->set_addrmap(AS_PROGRAM, &pacman_state::bigbucks_map);
+ m_maincpu->set_addrmap(AS_IO, &pacman_state::bigbucks_portmap);
+ m_maincpu->set_periodic_int(FUNC(pacman_state::periodic_irq), attotime::from_hz(20*60));
- MCFG_SCREEN_MODIFY("screen")
- MCFG_SCREEN_VISIBLE_AREA(0*8, 36*8-1, 0*8, 28*8-1)
+ subdevice<screen_device>("screen")->set_visarea(0*8, 36*8-1, 0*8, 28*8-1);
m_mainlatch->q_out_cb<7>().set_nop(); /*?*/
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(pacman_state::s2650games)
+void pacman_state::s2650games(machine_config &config)
+{
pacman(config);
/* basic machine hardware */
@@ -3787,110 +3784,110 @@ MACHINE_CONFIG_START(pacman_state::s2650games)
m_mainlatch->q_out_cb<6>().set_nop();
m_mainlatch->q_out_cb<7>().set(FUNC(pacman_state::coin_counter_w));
- MCFG_GFXDECODE_MODIFY("gfxdecode", gfx_s2650games)
+ m_gfxdecode->set_info(gfx_s2650games);
- MCFG_SCREEN_MODIFY("screen")
- MCFG_SCREEN_SIZE(32*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */)
- MCFG_SCREEN_UPDATE_DRIVER(pacman_state, screen_update_s2650games)
- MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE(*this, pacman_state, s2650_interrupt))
+ screen_device &screen(*subdevice<screen_device>("screen"));
+ screen.set_size(32*8, 32*8);
+ screen.set_visarea(0*8, 32*8-1, 2*8, 30*8-1);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */
+ screen.set_screen_update(FUNC(pacman_state::screen_update_s2650games));
+ screen.screen_vblank().set(FUNC(pacman_state::s2650_interrupt));
MCFG_VIDEO_START_OVERRIDE(pacman_state,s2650games)
/* sound hardware */
- MCFG_DEVICE_REMOVE("namco")
- MCFG_DEVICE_ADD("sn1", SN76496, MASTER_CLOCK/6) /* 1H */
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.75)
-MACHINE_CONFIG_END
+ config.device_remove("namco");
+ SN76496(config, "sn1", MASTER_CLOCK/6).add_route(ALL_OUTPUTS, "mono", 0.75); /* 1H */
+}
-MACHINE_CONFIG_START(pacman_state::drivfrcp)
+void pacman_state::drivfrcp(machine_config &config)
+{
s2650games(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_IO_MAP(drivfrcp_portmap)
-MACHINE_CONFIG_END
+ m_maincpu->set_addrmap(AS_IO, &pacman_state::drivfrcp_portmap);
+}
-MACHINE_CONFIG_START(pacman_state::_8bpm )
+void pacman_state::_8bpm(machine_config &config)
+{
s2650games(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_IO_MAP(_8bpm_portmap)
-MACHINE_CONFIG_END
+ m_maincpu->set_addrmap(AS_IO, &pacman_state::_8bpm_portmap);
+}
-MACHINE_CONFIG_START(pacman_state::porky)
+void pacman_state::porky(machine_config &config)
+{
s2650games(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_IO_MAP(porky_portmap)
-MACHINE_CONFIG_END
+ m_maincpu->set_addrmap(AS_IO, &pacman_state::porky_portmap);
+}
-MACHINE_CONFIG_START(pacman_state::rocktrv2)
+void pacman_state::rocktrv2(machine_config &config)
+{
pacman(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(rocktrv2_map)
+ m_maincpu->set_addrmap(AS_PROGRAM, &pacman_state::rocktrv2_map);
- MCFG_SCREEN_MODIFY("screen")
- MCFG_SCREEN_VISIBLE_AREA(0*8, 36*8-1, 0*8, 28*8-1)
- MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE(*this, pacman_state, rocktrv2_vblank_irq))
-MACHINE_CONFIG_END
+ screen_device &screen(*subdevice<screen_device>("screen"));
+ screen.set_visarea(0*8, 36*8-1, 0*8, 28*8-1);
+ screen.screen_vblank().set(FUNC(pacman_state::rocktrv2_vblank_irq));
+}
-MACHINE_CONFIG_START(pacman_state::mschamp)
+void pacman_state::mschamp(machine_config &config)
+{
pacman(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(mschamp_map)
- MCFG_DEVICE_IO_MAP(mschamp_portmap)
+ m_maincpu->set_addrmap(AS_PROGRAM, &pacman_state::mschamp_map);
+ m_maincpu->set_addrmap(AS_IO, &pacman_state::mschamp_portmap);
MCFG_MACHINE_RESET_OVERRIDE(pacman_state,mschamp)
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(pacman_state::superabc)
+void pacman_state::superabc(machine_config &config)
+{
pacman(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(superabc_map)
+ m_maincpu->set_addrmap(AS_PROGRAM, &pacman_state::superabc_map);
NVRAM(config, "28c16.u17", nvram_device::DEFAULT_ALL_0);
MCFG_MACHINE_RESET_OVERRIDE(pacman_state,superabc)
/* video hardware */
- MCFG_GFXDECODE_MODIFY("gfxdecode", gfx_superabc)
-MACHINE_CONFIG_END
+ m_gfxdecode->set_info(gfx_superabc);
+}
-MACHINE_CONFIG_START(pacman_state::crush4)
+void pacman_state::crush4(machine_config &config)
+{
mschamp(config);
/* basic machine hardware */
- MCFG_GFXDECODE_MODIFY("gfxdecode", gfx_crush4)
-MACHINE_CONFIG_END
+ m_gfxdecode->set_info(gfx_crush4);
+}
-MACHINE_CONFIG_START(pacman_state::crushs)
+void pacman_state::crushs(machine_config &config)
+{
pacman(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(crushs_map)
- MCFG_DEVICE_IO_MAP(crushs_portmap)
+ m_maincpu->set_addrmap(AS_PROGRAM, &pacman_state::crushs_map);
+ m_maincpu->set_addrmap(AS_IO, &pacman_state::crushs_portmap);
/* sound hardware */
AY8912(config, "ay8912", 1789750).add_route(ALL_OUTPUTS, "mono", 0.75);
-MACHINE_CONFIG_END
+}
@@ -6337,6 +6334,27 @@ ROM_START( sprglbpg )
ROM_END
+// 2 PCB set (G-GA-2 and G-GB-2). It was modified to use one 27128 instead of eight 2716 for the program ROMs.
+ROM_START( theglobme )
+ ROM_REGION( 0x10000, "maincpu", 0 )
+ ROM_LOAD( "globo_1-8_a.6e", 0x0000, 0x4000, CRC(57252220) SHA1(ee02a1f8817cb5c55d67653391f4509bb5a30403) )
+
+ ROM_REGION( 0x2000, "gfx1", 0 )
+ ROM_LOAD( "globo-10_b.5e", 0x0000, 0x0800, CRC(36408c76) SHA1(f5bb18e38de57adc2aed6211048d9f0ee0e58df7) )
+ ROM_LOAD( "globo-12_b.5h", 0x0800, 0x0800, CRC(b8ba069c) SHA1(f8d8e40afd8214a6d951af8de2761703b0651f79) )
+ ROM_LOAD( "globo-11_b.5f", 0x1000, 0x0800, CRC(890b8ebf) SHA1(1bf64f4ca1fca8efd35ac3d414d2bb755c5e44cc) )
+ ROM_LOAD( "globo-13_b.5j", 0x1800, 0x0800, CRC(7c4456a4) SHA1(74f55ae921cdf8f1f7a866d75a63244187426f17) )
+
+ ROM_REGION( 0x0120, "proms", 0 )
+ ROM_LOAD( "n82s123an_a.7f", 0x0000, 0x0020, CRC(1f617527) SHA1(448845cab63800a05fcb106897503d994377f78f) )
+ ROM_LOAD( "n82s129n_b.4a", 0x0020, 0x0100, CRC(28faa769) SHA1(7588889f3102d4e0ca7918f536556209b2490ea1) )
+
+ ROM_REGION( 0x0200, "namco", 0 ) /* sound PROMs, Harris 63S141J */
+ ROM_LOAD( "63s141_b.1m", 0x0000, 0x0100, CRC(a9cc86bf) SHA1(bbcec0570aeceb582ff8238a4bc8546a23430081) )
+ ROM_LOAD( "63s141_b.3m", 0x0100, 0x0100, CRC(77245b66) SHA1(0c4d0bee858b97632411c440bea6948a74759746) ) /* timing - not used */
+ROM_END
+
+
ROM_START( beastfp )
ROM_REGION( 0x20000, "maincpu", 0 )
ROM_LOAD( "bf-u2.bin", 0x0000, 0x2000, CRC(3afc517b) SHA1(5b74bca9e9cd4d8bcf94a340f8f0e53fe1dcfc1d) )
@@ -7636,6 +7654,7 @@ GAME( 1983, acitya, bwcasino, acitya, acitya, pacman_state, empty_init,
GAME( 1983, theglobp, suprglob, theglobp, theglobp, pacman_state, empty_init, ROT90, "Epos Corporation", "The Glob (Pac-Man hardware)", MACHINE_SUPPORTS_SAVE )
GAME( 1983, sprglobp, suprglob, theglobp, theglobp, pacman_state, empty_init, ROT90, "Epos Corporation", "Super Glob (Pac-Man hardware)", MACHINE_SUPPORTS_SAVE )
GAME( 1984, sprglbpg, suprglob, pacman, theglobp, pacman_state, empty_init, ROT90, "bootleg (Software Labor)", "Super Glob (Pac-Man hardware) (German bootleg)", MACHINE_SUPPORTS_SAVE )
+GAME( 1983, theglobme,suprglob, woodpek, theglobp, pacman_state, empty_init, ROT90, "Magic Electronics Inc.", "The Glob (Pacman hardware, Magic Electronics Inc. license)", MACHINE_SUPPORTS_SAVE )
GAME( 1984, beastfp, suprglob, theglobp, theglobp, pacman_state, empty_init, ROT90, "Epos Corporation", "Beastie Feastie (conversion kit)", MACHINE_SUPPORTS_SAVE )
GAME( 1984, eeekk, 0, eeekk, eeekk, pacman_state, empty_init, ROT90, "Epos Corporation", "Eeekk!", MACHINE_SUPPORTS_SAVE )
diff --git a/src/mame/drivers/palestra.cpp b/src/mame/drivers/palestra.cpp
new file mode 100644
index 00000000000..a4c188675fd
--- /dev/null
+++ b/src/mame/drivers/palestra.cpp
@@ -0,0 +1,95 @@
+// license:BSD-3-Clause
+// copyright-holders:Sergey Svishchev
+
+/***************************************************************************
+
+ Palestra-02 (a Pong clone)
+
+ https://www.mobygames.com/game/dedicated-console/palestra-02
+ database entry
+ http://www.ccjvq.com/slydc/palestra02.rar
+ schematics
+ http://discreteconsoles.blogspot.com/2015/10/emulation-of-ay-3-8500-1-and-clones-soon.html
+ photos
+ https://www.youtube.com/watch?v=3XZxkTvOF4Y
+ gameplay video
+
+ To do:
+ - write 74H53 device
+ - trace the boards (schematic contains several errors)
+ - hook up inputs
+
+***************************************************************************/
+
+#include "emu.h"
+
+#include "machine/netlist.h"
+
+#include "video/fixfreq.h"
+
+#include "netlist/devices/net_lib.h"
+
+#include "machine/nl_palestra.h"
+
+#include "screen.h"
+
+#include <cmath>
+
+
+#define MASTER_CLOCK (4000000)
+#define V_TOTAL_PONG 315
+#define H_TOTAL_PONG 256 // tbc
+
+class palestra_state : public driver_device
+{
+public:
+ palestra_state(const machine_config &mconfig, device_type type, const char *tag)
+ : driver_device(mconfig, type, tag)
+ , m_maincpu(*this, "maincpu")
+ , m_video(*this, "fixfreq")
+ {
+ }
+
+ // devices
+ required_device<netlist_mame_device> m_maincpu;
+ required_device<fixedfreq_device> m_video;
+
+ void palestra(machine_config &config);
+
+protected:
+ // driver_device overrides
+ virtual void machine_start() override { };
+ virtual void machine_reset() override { };
+
+ virtual void video_start() override { };
+
+private:
+};
+
+
+static INPUT_PORTS_START(palestra)
+INPUT_PORTS_END
+
+
+MACHINE_CONFIG_START(palestra_state::palestra)
+ NETLIST_CPU(config, m_maincpu, NETLIST_CLOCK);
+ m_maincpu->set_constructor(netlist_palestra);
+
+ MCFG_NETLIST_ANALOG_OUTPUT("maincpu", "vid0", "videomix", fixedfreq_device, update_composite_monochrome, "fixfreq")
+
+ SCREEN(config, "screen", SCREEN_TYPE_RASTER);
+ FIXFREQ(config, m_video).set_screen("screen");
+ m_video->set_monitor_clock(MASTER_CLOCK);
+ m_video->set_horz_params(H_TOTAL_PONG-64,H_TOTAL_PONG-40,H_TOTAL_PONG-8,H_TOTAL_PONG);
+ m_video->set_vert_params(V_TOTAL_PONG-19,V_TOTAL_PONG-16,V_TOTAL_PONG-12,V_TOTAL_PONG);
+ m_video->set_fieldcount(1);
+ m_video->set_threshold(1);
+ m_video->set_gain(0.36);
+MACHINE_CONFIG_END
+
+
+ROM_START( palestra ) /* dummy to satisfy game entry*/
+ ROM_REGION( 0x10000, "maincpu", ROMREGION_ERASE00 )
+ROM_END
+
+CONS( 1978, palestra, 0, 0, palestra, palestra, palestra_state, empty_init, "LPO", "Palestra-02", MACHINE_IS_SKELETON)
diff --git a/src/mame/drivers/palm.cpp b/src/mame/drivers/palm.cpp
index 21643b58ecd..1b69491e78a 100644
--- a/src/mame/drivers/palm.cpp
+++ b/src/mame/drivers/palm.cpp
@@ -182,31 +182,32 @@ void palm_state::palm_map(address_map &map)
MACHINE DRIVERS
***************************************************************************/
-MACHINE_CONFIG_START(palm_state::palm)
+void palm_state::palm(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD( "maincpu", M68000, 32768*506 ) /* 16.580608 MHz */
- MCFG_DEVICE_PROGRAM_MAP( palm_map)
- MCFG_DEVICE_DISASSEMBLE_OVERRIDE(palm_state, palm_dasm_override)
+ M68000(config, m_maincpu, 32768*506); /* 16.580608 MHz */
+ m_maincpu->set_addrmap(AS_PROGRAM, &palm_state::palm_map);
+ m_maincpu->set_dasm_override(FUNC(palm_state::palm_dasm_override));
- MCFG_QUANTUM_TIME( attotime::from_hz(60) )
+ config.m_minimum_quantum = attotime::from_hz(60);
- MCFG_SCREEN_ADD( "screen", LCD )
- MCFG_SCREEN_REFRESH_RATE( 60 )
- MCFG_SCREEN_VBLANK_TIME( ATTOSECONDS_IN_USEC(1260) )
/* video hardware */
- MCFG_SCREEN_VIDEO_ATTRIBUTES( VIDEO_UPDATE_BEFORE_VBLANK )
- MCFG_SCREEN_SIZE( 160, 220 )
- MCFG_SCREEN_VISIBLE_AREA( 0, 159, 0, 219 )
- MCFG_SCREEN_UPDATE_DEVICE(MC68328_TAG, mc68328_device, screen_update)
- MCFG_SCREEN_PALETTE("palette")
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_LCD));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(1260));
+ screen.set_video_attributes(VIDEO_UPDATE_BEFORE_VBLANK);
+ screen.set_size(160, 220);
+ screen.set_visarea(0, 159, 0, 219);
+ screen.set_screen_update(MC68328_TAG, FUNC(mc68328_device::screen_update));
+ screen.set_palette("palette");
PALETTE(config, "palette", FUNC(palm_state::palm_palette), 2);
/* audio hardware */
SPEAKER(config, "speaker").front_center();
- MCFG_DEVICE_ADD("dac", DAC_1BIT, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 0.25)
- MCFG_DEVICE_ADD("vref", VOLTAGE_REGULATOR, 0) MCFG_VOLTAGE_REGULATOR_OUTPUT(5.0)
- MCFG_SOUND_ROUTE(0, "dac", 1.0, DAC_VREF_POS_INPUT)
+ DAC_1BIT(config, "dac", 0).add_route(ALL_OUTPUTS, "speaker", 0.25);
+ voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref", 0));
+ vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT);
MC68328(config, m_lsi, 0, "maincpu"); // on-board peripherals
m_lsi->out_port_f().set(FUNC(palm_state::palm_port_f_out));
@@ -216,7 +217,7 @@ MACHINE_CONFIG_START(palm_state::palm)
m_lsi->out_spim().set(FUNC(palm_state::palm_spim_out));
m_lsi->in_spim().set(FUNC(palm_state::palm_spim_in));
m_lsi->spim_xch_trigger().set(FUNC(palm_state::palm_spim_exchange));
-MACHINE_CONFIG_END
+}
static INPUT_PORTS_START( palm )
PORT_START( "PENX" )
diff --git a/src/mame/drivers/palmz22.cpp b/src/mame/drivers/palmz22.cpp
index a0548582971..9afea7cc2c3 100644
--- a/src/mame/drivers/palmz22.cpp
+++ b/src/mame/drivers/palmz22.cpp
@@ -288,19 +288,19 @@ void palmz22_state::init_palmz22()
{
}
-MACHINE_CONFIG_START(palmz22_state::palmz22)
- MCFG_DEVICE_ADD(m_maincpu, ARM920T, 266000000)
- MCFG_DEVICE_PROGRAM_MAP(map)
-
- MCFG_PALETTE_ADD("palette", 32768)
+void palmz22_state::palmz22(machine_config &config)
+{
+ ARM920T(config, m_maincpu, 266000000);
+ m_maincpu->set_addrmap(AS_PROGRAM, &palmz22_state::map);
- MCFG_SCREEN_ADD("screen", LCD)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */
- MCFG_SCREEN_SIZE(160, 160)
- MCFG_SCREEN_VISIBLE_AREA(0, 160 - 1, 0, 160 - 1)
+ PALETTE(config, "palette").set_entries(32768);
- MCFG_SCREEN_UPDATE_DEVICE("s3c2410", s3c2410_device, screen_update)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_LCD));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */
+ screen.set_size(160, 160);
+ screen.set_visarea(0, 160 - 1, 0, 160 - 1);
+ screen.set_screen_update("s3c2410", FUNC(s3c2410_device::screen_update));
S3C2410(config, m_s3c2410, 12000000);
m_s3c2410->set_palette_tag("palette");
@@ -317,7 +317,7 @@ MACHINE_CONFIG_START(palmz22_state::palmz22)
NAND(config, m_nand, 0);
m_nand->set_nand_type(nand_device::chip::K9F5608U0D_J);
m_nand->rnb_wr_callback().set(m_s3c2410, FUNC(s3c2410_device::frnb_w));
-MACHINE_CONFIG_END
+}
static INPUT_PORTS_START( palmz22 )
PORT_START( "PENB" )
diff --git a/src/mame/drivers/pandoras.cpp b/src/mame/drivers/pandoras.cpp
index a6ceb3c40f6..c617c02f6c6 100644
--- a/src/mame/drivers/pandoras.cpp
+++ b/src/mame/drivers/pandoras.cpp
@@ -305,8 +305,8 @@ READ8_MEMBER(pandoras_state::pandoras_portB_r)
return (m_audiocpu->total_cycles() / 512) & 0x0f;
}
-MACHINE_CONFIG_START(pandoras_state::pandoras)
-
+void pandoras_state::pandoras(machine_config &config)
+{
/* basic machine hardware */
MC6809E(config, m_maincpu, MASTER_CLOCK/6); /* CPU A */
m_maincpu->set_addrmap(AS_PROGRAM, &pandoras_state::pandoras_master_map);
@@ -323,7 +323,7 @@ MACHINE_CONFIG_START(pandoras_state::pandoras)
m_mcu->p1_out_cb().set("dac", FUNC(dac_byte_interface::data_w));
m_mcu->p2_out_cb().set(FUNC(pandoras_state::i8039_irqen_and_status_w));
- MCFG_QUANTUM_TIME(attotime::from_hz(6000)) /* 100 CPU slices per frame - needed for correct synchronization of the sound CPUs */
+ config.m_minimum_quantum = attotime::from_hz(6000); /* 100 CPU slices per frame - needed for correct synchronization of the sound CPUs */
ls259_device &mainlatch(LS259(config, "mainlatch")); // C3
mainlatch.q_out_cb<0>().set(FUNC(pandoras_state::cpua_irq_enable_w)); // ENA
@@ -337,14 +337,14 @@ MACHINE_CONFIG_START(pandoras_state::pandoras)
WATCHDOG_TIMER(config, "watchdog");
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(32*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(pandoras_state, screen_update_pandoras)
- MCFG_SCREEN_PALETTE(m_palette)
- MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE(*this, pandoras_state, vblank_irq))
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(32*8, 32*8);
+ screen.set_visarea(0*8, 32*8-1, 2*8, 30*8-1);
+ screen.set_screen_update(FUNC(pandoras_state::screen_update_pandoras));
+ screen.set_palette(m_palette);
+ screen.screen_vblank().set(FUNC(pandoras_state::vblank_irq));
GFXDECODE(config, m_gfxdecode, m_palette, gfx_pandoras);
PALETTE(config, m_palette, FUNC(pandoras_state::pandoras_palette), 16*16+16*16, 32);
@@ -360,10 +360,11 @@ MACHINE_CONFIG_START(pandoras_state::pandoras)
aysnd.port_b_read_callback().set(FUNC(pandoras_state::pandoras_portB_r));
aysnd.add_route(ALL_OUTPUTS, "speaker", 0.4);
- MCFG_DEVICE_ADD("dac", DAC_8BIT_R2R, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 0.12) // unknown DAC
- MCFG_DEVICE_ADD("vref", VOLTAGE_REGULATOR, 0) MCFG_VOLTAGE_REGULATOR_OUTPUT(5.0)
- MCFG_SOUND_ROUTE(0, "dac", 1.0, DAC_VREF_POS_INPUT) MCFG_SOUND_ROUTE(0, "dac", -1.0, DAC_VREF_NEG_INPUT)
-MACHINE_CONFIG_END
+ DAC_8BIT_R2R(config, "dac", 0).add_route(ALL_OUTPUTS, "speaker", 0.12); // unknown DAC
+ voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref"));
+ vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT);
+ vref.add_route(0, "dac", -1.0, DAC_VREF_NEG_INPUT);
+}
/***************************************************************************
diff --git a/src/mame/drivers/pangofun.cpp b/src/mame/drivers/pangofun.cpp
index fb0478d8aa8..cf2895b11bd 100644
--- a/src/mame/drivers/pangofun.cpp
+++ b/src/mame/drivers/pangofun.cpp
@@ -179,21 +179,21 @@ void pangofun_state::machine_start()
{
}
-MACHINE_CONFIG_START(pangofun_state::pangofun)
+void pangofun_state::pangofun(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", I486, 25000000 ) /* I486 ?? Mhz (25 according to POST) */
- MCFG_DEVICE_PROGRAM_MAP(pcat_map)
- MCFG_DEVICE_IO_MAP(pcat_io)
- MCFG_DEVICE_IRQ_ACKNOWLEDGE_DEVICE("pic8259_1", pic8259_device, inta_cb)
+ I486(config, m_maincpu, 25000000); /* I486 ?? Mhz (25 according to POST) */
+ m_maincpu->set_addrmap(AS_PROGRAM, &pangofun_state::pcat_map);
+ m_maincpu->set_addrmap(AS_IO, &pangofun_state::pcat_io);
+ m_maincpu->set_irq_acknowledge_callback("pic8259_1", FUNC(pic8259_device::inta_cb));
/* video hardware */
pcvideo_vga(config);
- MCFG_SCREEN_MODIFY("screen")
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */
+ subdevice<screen_device>("screen")->set_refresh_hz(60);
+ subdevice<screen_device>("screen")->set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */
pcat_common(config);
-MACHINE_CONFIG_END
+}
ROM_START(pangofun)
diff --git a/src/mame/drivers/panicr.cpp b/src/mame/drivers/panicr.cpp
index a4cef282692..b22d278d528 100644
--- a/src/mame/drivers/panicr.cpp
+++ b/src/mame/drivers/panicr.cpp
@@ -602,22 +602,22 @@ TIMER_DEVICE_CALLBACK_MEMBER(panicr_state::scanline)
m_maincpu->set_input_line_and_vector(0, HOLD_LINE, 0xc8/4);
}
-MACHINE_CONFIG_START(panicr_state::panicr)
- MCFG_DEVICE_ADD("maincpu", V20,MASTER_CLOCK/2) /* Sony 8623h9 CXQ70116D-8 (V20 compatible) */
- MCFG_DEVICE_PROGRAM_MAP(panicr_map)
- MCFG_TIMER_DRIVER_ADD_SCANLINE("scantimer", panicr_state, scanline, "screen", 0, 1)
-
- MCFG_DEVICE_ADD("t5182", T5182, 0)
+void panicr_state::panicr(machine_config &config)
+{
+ V20(config, m_maincpu, MASTER_CLOCK/2); /* Sony 8623h9 CXQ70116D-8 (V20 compatible) */
+ m_maincpu->set_addrmap(AS_PROGRAM, &panicr_state::panicr_map);
+ TIMER(config, "scantimer").configure_scanline(FUNC(panicr_state::scanline), "screen", 0, 1);
+ T5182(config, m_t5182, 0);
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */)
- MCFG_SCREEN_SIZE(32*8, 32*8)
-// MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 0*8, 32*8-1)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(panicr_state, screen_update)
- MCFG_SCREEN_PALETTE(m_palette)
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_refresh_hz(60);
+ m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(2500) /* not accurate */);
+ m_screen->set_size(32*8, 32*8);
+// m_screen->set_visarea(0*8, 32*8-1, 0*8, 32*8-1);
+ m_screen->set_visarea(0*8, 32*8-1, 2*8, 30*8-1);
+ m_screen->set_screen_update(FUNC(panicr_state::screen_update));
+ m_screen->set_palette(m_palette);
GFXDECODE(config, m_gfxdecode, m_palette, gfx_panicr);
PALETTE(config, m_palette, FUNC(panicr_state::panicr_palette), 256 * 4, 256);
@@ -629,7 +629,7 @@ MACHINE_CONFIG_START(panicr_state::panicr)
ymsnd.irq_handler().set(m_t5182, FUNC(t5182_device::ym2151_irq_handler));
ymsnd.add_route(0, "mono", 1.0);
ymsnd.add_route(1, "mono", 1.0);
-MACHINE_CONFIG_END
+}
ROM_START( panicr )
diff --git a/src/mame/drivers/paradise.cpp b/src/mame/drivers/paradise.cpp
index 0db6858a5d7..4c73aef6164 100644
--- a/src/mame/drivers/paradise.cpp
+++ b/src/mame/drivers/paradise.cpp
@@ -731,23 +731,23 @@ INTERRUPT_GEN_MEMBER(paradise_state::irq)
m_maincpu->set_input_line(INPUT_LINE_IRQ0, HOLD_LINE);
}
-MACHINE_CONFIG_START(paradise_state::paradise)
-
+void paradise_state::paradise(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, XTAL(12'000'000)/2) /* Z8400B - 6mhz Verified */
- MCFG_DEVICE_PROGRAM_MAP(paradise_map)
- MCFG_DEVICE_IO_MAP(paradise_io_map)
- MCFG_DEVICE_PERIODIC_INT_DRIVER(paradise_state, irq, 4*54) /* No nmi routine, timing is confirmed (i.e. three timing irqs for each vblank irq */
+ Z80(config, m_maincpu, XTAL(12'000'000)/2); /* Z8400B - 6mhz Verified */
+ m_maincpu->set_addrmap(AS_PROGRAM, &paradise_state::paradise_map);
+ m_maincpu->set_addrmap(AS_IO, &paradise_state::paradise_io_map);
+ m_maincpu->set_periodic_int(FUNC(paradise_state::irq), attotime::from_hz(4*54)); /* No nmi routine, timing is confirmed (i.e. three timing irqs for each vblank irq */
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(54) /* 54 verified */
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */ /* we're using PORT_VBLANK */)
- MCFG_SCREEN_SIZE(256, 256)
- MCFG_SCREEN_VISIBLE_AREA(0, 256-1, 0+16, 256-1-16)
- MCFG_SCREEN_UPDATE_DRIVER(paradise_state, screen_update_paradise)
- MCFG_SCREEN_PALETTE(m_palette)
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_refresh_hz(54); /* 54 verified */
+ m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(2500) /* not accurate */ /* we're using PORT_VBLANK */);
+ m_screen->set_size(256, 256);
+ m_screen->set_visarea(0, 256-1, 0+16, 256-1-16);
+ m_screen->set_screen_update(FUNC(paradise_state::screen_update_paradise));
+ m_screen->set_palette(m_palette);
GFXDECODE(config, m_gfxdecode, m_palette, gfx_paradise);
PALETTE(config, m_palette).set_entries(0x800 + 16);
@@ -756,62 +756,60 @@ MACHINE_CONFIG_START(paradise_state::paradise)
/* sound hardware */
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("oki1", OKIM6295, XTAL(12'000'000)/12, okim6295_device::PIN7_HIGH) /* verified on pcb */
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.50)
+ OKIM6295(config, "oki1", XTAL(12'000'000)/12, okim6295_device::PIN7_HIGH).add_route(ALL_OUTPUTS, "mono", 0.50); /* verified on pcb */
- MCFG_DEVICE_ADD("oki2", OKIM6295, XTAL(12'000'000)/12, okim6295_device::PIN7_HIGH) /* verified on pcb */
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.50)
-MACHINE_CONFIG_END
+ OKIM6295(config, m_oki2, XTAL(12'000'000)/12, okim6295_device::PIN7_HIGH).add_route(ALL_OUTPUTS, "mono", 0.50); /* verified on pcb */
+}
-MACHINE_CONFIG_START(paradise_state::tgtball)
+void paradise_state::tgtball(machine_config &config)
+{
paradise(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(tgtball_map)
-MACHINE_CONFIG_END
+ m_maincpu->set_addrmap(AS_PROGRAM, &paradise_state::tgtball_map);
+}
-MACHINE_CONFIG_START(paradise_state::torus)
+void paradise_state::torus(machine_config &config)
+{
paradise(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(torus_map)
- MCFG_DEVICE_IO_MAP(torus_io_map)
+ m_maincpu->set_addrmap(AS_PROGRAM, &paradise_state::torus_map);
+ m_maincpu->set_addrmap(AS_IO, &paradise_state::torus_io_map);
- MCFG_GFXDECODE_MODIFY("gfxdecode", gfx_torus)
- MCFG_SCREEN_MODIFY("screen")
- MCFG_SCREEN_UPDATE_DRIVER(paradise_state, screen_update_torus)
+ m_gfxdecode->set_info(gfx_torus);
+ m_screen->set_screen_update(FUNC(paradise_state::screen_update_torus));
- MCFG_DEVICE_REMOVE("oki2")
-MACHINE_CONFIG_END
+ config.device_remove("oki2");
+}
-MACHINE_CONFIG_START(paradise_state::madball)
+void paradise_state::madball(machine_config &config)
+{
torus(config);
- MCFG_GFXDECODE_MODIFY("gfxdecode", gfx_madball)
+ m_gfxdecode->set_info(gfx_madball);
- MCFG_SCREEN_MODIFY("screen")
- MCFG_SCREEN_UPDATE_DRIVER(paradise_state, screen_update_madball)
-MACHINE_CONFIG_END
+ m_screen->set_screen_update(FUNC(paradise_state::screen_update_madball));
+}
-MACHINE_CONFIG_START(paradise_state::penky)
+void paradise_state::penky(machine_config &config)
+{
paradise(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(torus_map)
- MCFG_DEVICE_IO_MAP(torus_io_map)
-MACHINE_CONFIG_END
+ m_maincpu->set_addrmap(AS_PROGRAM, &paradise_state::torus_map);
+ m_maincpu->set_addrmap(AS_IO, &paradise_state::torus_io_map);
+}
-MACHINE_CONFIG_START(paradise_state::penkyi)
+void paradise_state::penkyi(machine_config &config)
+{
penky(config);
// TODO add ticket dispenser
- MCFG_DEVICE_REMOVE("oki2")
-MACHINE_CONFIG_END
+ config.device_remove("oki2");
+}
/***************************************************************************
diff --git a/src/mame/drivers/paranoia.cpp b/src/mame/drivers/paranoia.cpp
index e51b1d7e0bd..affe48db73e 100644
--- a/src/mame/drivers/paranoia.cpp
+++ b/src/mame/drivers/paranoia.cpp
@@ -165,7 +165,8 @@ WRITE_LINE_MEMBER(paranoia_state::i8155_timer_out)
//logerror("Timer out %d\n", state);
}
-MACHINE_CONFIG_START(paranoia_state::paranoia)
+void paranoia_state::paranoia(machine_config &config)
+{
/* basic machine hardware */
H6280(config, m_maincpu, PCE_MAIN_CLOCK/3);
m_maincpu->set_addrmap(AS_PROGRAM, &paranoia_state::pce_mem);
@@ -175,15 +176,15 @@ MACHINE_CONFIG_START(paranoia_state::paranoia)
m_maincpu->add_route(0, "lspeaker", 1.00);
m_maincpu->add_route(1, "rspeaker", 1.00);
- MCFG_QUANTUM_TIME(attotime::from_hz(60))
+ config.m_minimum_quantum = attotime::from_hz(60);
- MCFG_DEVICE_ADD("sub", I8085A, 18000000/3)
- MCFG_DEVICE_PROGRAM_MAP(paranoia_8085_map)
- MCFG_DEVICE_IO_MAP(paranoia_8085_io_map)
+ i8085a_cpu_device &sub(I8085A(config, "sub", 18000000/3));
+ sub.set_addrmap(AS_PROGRAM, &paranoia_state::paranoia_8085_map);
+ sub.set_addrmap(AS_IO, &paranoia_state::paranoia_8085_io_map);
- MCFG_DEVICE_ADD("sub2", Z80, 18000000/6)
- MCFG_DEVICE_PROGRAM_MAP(paranoia_z80_map)
- MCFG_DEVICE_IO_MAP(paranoia_z80_io_map)
+ z80_device &sub2(Z80(config, "sub2", 18000000/6));
+ sub2.set_addrmap(AS_PROGRAM, &paranoia_state::paranoia_z80_map);
+ sub2.set_addrmap(AS_IO, &paranoia_state::paranoia_z80_io_map);
i8155_device &i8155(I8155(config, "i8155", 1000000 /*?*/));
i8155.out_pa_callback().set(FUNC(paranoia_state::i8155_a_w));
@@ -192,23 +193,24 @@ MACHINE_CONFIG_START(paranoia_state::paranoia)
i8155.out_to_callback().set(FUNC(paranoia_state::i8155_timer_out));
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_RAW_PARAMS(PCE_MAIN_CLOCK, huc6260_device::WPF, 64, 64 + 1024 + 64, huc6260_device::LPF, 18, 18 + 242)
- MCFG_SCREEN_UPDATE_DRIVER( pce_common_state, screen_update )
- MCFG_SCREEN_PALETTE("huc6260")
-
- MCFG_DEVICE_ADD( "huc6260", HUC6260, PCE_MAIN_CLOCK )
- MCFG_HUC6260_NEXT_PIXEL_DATA_CB(READ16("huc6270", huc6270_device, next_pixel))
- MCFG_HUC6260_TIME_TIL_NEXT_EVENT_CB(READ16("huc6270", huc6270_device, time_until_next_event))
- MCFG_HUC6260_VSYNC_CHANGED_CB(WRITELINE("huc6270", huc6270_device, vsync_changed))
- MCFG_HUC6260_HSYNC_CHANGED_CB(WRITELINE("huc6270", huc6270_device, hsync_changed))
- MCFG_DEVICE_ADD( "huc6270", HUC6270, 0 )
- MCFG_HUC6270_VRAM_SIZE(0x10000)
- MCFG_HUC6270_IRQ_CHANGED_CB(INPUTLINE("maincpu", 0))
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_raw(PCE_MAIN_CLOCK, huc6260_device::WPF, 64, 64 + 1024 + 64, huc6260_device::LPF, 18, 18 + 242);
+ screen.set_screen_update(FUNC(pce_common_state::screen_update));
+ screen.set_palette(m_huc6260);
+
+ HUC6260(config, m_huc6260, PCE_MAIN_CLOCK);
+ m_huc6260->next_pixel_data().set("huc6270", FUNC(huc6270_device::next_pixel));
+ m_huc6260->time_til_next_event().set("huc6270", FUNC(huc6270_device::time_until_next_event));
+ m_huc6260->vsync_changed().set("huc6270", FUNC(huc6270_device::vsync_changed));
+ m_huc6260->hsync_changed().set("huc6270", FUNC(huc6270_device::hsync_changed));
+
+ huc6270_device &huc6270(HUC6270(config, "huc6270", 0));
+ huc6270.set_vram_size(0x10000);
+ huc6270.irq().set_inputline(m_maincpu, 0);
SPEAKER(config, "lspeaker").front_left();
SPEAKER(config, "rspeaker").front_right();
-MACHINE_CONFIG_END
+}
ROM_START(paranoia)
ROM_REGION( 0x40000, "maincpu", 0 )
diff --git a/src/mame/drivers/pasha2.cpp b/src/mame/drivers/pasha2.cpp
index 9acbc634bb2..5885b1c6aba 100644
--- a/src/mame/drivers/pasha2.cpp
+++ b/src/mame/drivers/pasha2.cpp
@@ -398,41 +398,39 @@ void pasha2_state::machine_reset()
m_vbuffer = 0;
}
-MACHINE_CONFIG_START(pasha2_state::pasha2)
-
+void pasha2_state::pasha2(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", E116XT, 20000000*4) /* 4x internal multiplier */
- MCFG_DEVICE_PROGRAM_MAP(pasha2_map)
- MCFG_DEVICE_IO_MAP(pasha2_io)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", pasha2_state, irq0_line_hold)
+ E116XT(config, m_maincpu, 20000000*4); /* 4x internal multiplier */
+ m_maincpu->set_addrmap(AS_PROGRAM, &pasha2_state::pasha2_map);
+ m_maincpu->set_addrmap(AS_IO, &pasha2_state::pasha2_io);
+ m_maincpu->set_vblank_int("screen", FUNC(pasha2_state::irq0_line_hold));
- MCFG_DEVICE_ADD("audiocpu", AT89C52, 12000000) /* clock from docs */
+ AT89C52(config, m_audiocpu, 12000000); /* clock from docs */
/* TODO : ports are unimplemented; P0,P1,P2,P3 and Serial Port Used */
EEPROM_93C46_16BIT(config, "eeprom");
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(512, 512)
- MCFG_SCREEN_VISIBLE_AREA(0, 383, 0, 239)
- MCFG_SCREEN_UPDATE_DRIVER(pasha2_state, screen_update_pasha2)
- MCFG_SCREEN_PALETTE(m_palette)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(512, 512);
+ screen.set_visarea(0, 383, 0, 239);
+ screen.set_screen_update(FUNC(pasha2_state::screen_update_pasha2));
+ screen.set_palette(m_palette);
PALETTE(config, m_palette).set_entries(0x200);
/* sound hardware */
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("oki1", OKIM6295, 1000000, okim6295_device::PIN7_HIGH)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
+ OKIM6295(config, m_oki[0], 1000000, okim6295_device::PIN7_HIGH).add_route(ALL_OUTPUTS, "mono", 1.0);
- MCFG_DEVICE_ADD("oki2", OKIM6295, 1000000, okim6295_device::PIN7_HIGH)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
+ OKIM6295(config, m_oki[1], 1000000, okim6295_device::PIN7_HIGH).add_route(ALL_OUTPUTS, "mono", 1.0);
//and ATMEL DREAM SAM9773
-MACHINE_CONFIG_END
+}
ROM_START( pasha2 )
ROM_REGION16_BE( 0x80000, "maincpu", 0 ) /* Hyperstone CPU Code */
diff --git a/src/mame/drivers/paso1600.cpp b/src/mame/drivers/paso1600.cpp
index 694e1e8b3c1..e01e46d17c4 100644
--- a/src/mame/drivers/paso1600.cpp
+++ b/src/mame/drivers/paso1600.cpp
@@ -188,23 +188,23 @@ WRITE8_MEMBER( paso1600_state::paso1600_pcg_w )
WRITE8_MEMBER( paso1600_state::paso1600_6845_address_w )
{
m_crtc_index = data;
- m_crtc->address_w(space, offset, data);
+ m_crtc->address_w(data);
}
WRITE8_MEMBER( paso1600_state::paso1600_6845_data_w )
{
m_crtc_vreg[m_crtc_index] = data;
- m_crtc->register_w(space, offset, data);
+ m_crtc->register_w(data);
}
READ8_MEMBER( paso1600_state::paso1600_6845_data_r )
{
- return m_crtc->register_r(space, offset);
+ return m_crtc->register_r();
}
READ8_MEMBER( paso1600_state::paso1600_6845_status_r )
{
- return m_crtc->status_r(space, offset);
+ return m_crtc->status_r();
}
READ8_MEMBER( paso1600_state::key_r )
@@ -304,25 +304,25 @@ WRITE8_MEMBER(paso1600_state::pc_dma_write_byte)
space.write_byte(offset, data);
}
-MACHINE_CONFIG_START(paso1600_state::paso1600)
+void paso1600_state::paso1600(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", I8086, 16000000/2)
- MCFG_DEVICE_PROGRAM_MAP(paso1600_map)
- MCFG_DEVICE_IO_MAP(paso1600_io)
- MCFG_DEVICE_IRQ_ACKNOWLEDGE_DEVICE("pic8259", pic8259_device, inta_cb)
+ I8086(config, m_maincpu, 16000000/2);
+ m_maincpu->set_addrmap(AS_PROGRAM, &paso1600_state::paso1600_map);
+ m_maincpu->set_addrmap(AS_IO, &paso1600_state::paso1600_io);
+ m_maincpu->set_irq_acknowledge_callback("pic8259", FUNC(pic8259_device::inta_cb));
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(50)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */
- MCFG_SCREEN_SIZE(640, 480)
- MCFG_SCREEN_VISIBLE_AREA(0, 640-1, 0, 480-1)
- MCFG_SCREEN_UPDATE_DRIVER(paso1600_state, screen_update_paso1600)
- MCFG_SCREEN_PALETTE("palette")
-
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_paso1600)
- MCFG_PALETTE_ADD("palette", 8)
-// MCFG_PALETTE_INIT(black_and_white)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(50);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */
+ screen.set_size(640, 480);
+ screen.set_visarea(0, 640-1, 0, 480-1);
+ screen.set_screen_update(FUNC(paso1600_state::screen_update_paso1600));
+ screen.set_palette(m_palette);
+
+ GFXDECODE(config, m_gfxdecode, m_palette, gfx_paso1600);
+ PALETTE(config, m_palette).set_entries(8);
/* Devices */
h46505_device &crtc(H46505(config, "crtc", 16000000/4)); /* unknown clock, hand tuned to get ~60 fps */
@@ -336,7 +336,7 @@ MACHINE_CONFIG_START(paso1600_state::paso1600)
AM9517A(config, m_dma, 16000000/4);
m_dma->in_memr_callback().set(FUNC(paso1600_state::pc_dma_read_byte));
m_dma->out_memw_callback().set(FUNC(paso1600_state::pc_dma_write_byte));
-MACHINE_CONFIG_END
+}
ROM_START( paso1600 )
ROM_REGION16_LE(0x2000,"ipl", 0)
diff --git a/src/mame/drivers/pasogo.cpp b/src/mame/drivers/pasogo.cpp
index a5058fa31aa..3ad45975fb5 100644
--- a/src/mame/drivers/pasogo.cpp
+++ b/src/mame/drivers/pasogo.cpp
@@ -141,12 +141,12 @@ private:
required_shared_ptr<uint16_t> m_vram;
required_device<palette_device> m_palette;
- DECLARE_READ16_MEMBER(ems_r);
- DECLARE_WRITE16_MEMBER(ems_w);
- DECLARE_READ16_MEMBER(emsram_r);
- DECLARE_WRITE16_MEMBER(emsram_w);
- DECLARE_READ8_MEMBER(vg230_io_r);
- DECLARE_WRITE8_MEMBER(vg230_io_w);
+ uint16_t ems_r(offs_t offset, uint16_t mem_mask);
+ void ems_w(offs_t offset, uint16_t data, uint16_t mem_mask);
+ uint16_t emsram_r(offs_t offset, uint16_t mem_mask);
+ void emsram_w(offs_t offset, uint16_t data, uint16_t mem_mask);
+ uint8_t vg230_io_r(offs_t offset);
+ void vg230_io_w(offs_t offset, uint8_t data);
struct
{
@@ -229,7 +229,7 @@ void pasogo_state::machine_start()
m_vg230.bios_timer.data=0x7200; // HACK
}
-READ8_MEMBER( pasogo_state::vg230_io_r )
+uint8_t pasogo_state::vg230_io_r(offs_t offset)
{
int log = true;
uint8_t data = 0;
@@ -315,7 +315,7 @@ READ8_MEMBER( pasogo_state::vg230_io_r )
}
-WRITE8_MEMBER( pasogo_state::vg230_io_w )
+void pasogo_state::vg230_io_w(offs_t offset, uint8_t data)
{
int log = true;
@@ -387,7 +387,7 @@ WRITE8_MEMBER( pasogo_state::vg230_io_w )
}
-READ16_MEMBER( pasogo_state::ems_r )
+uint16_t pasogo_state::ems_r(offs_t offset, uint16_t mem_mask)
{
uint8_t data = 0;
uint8_t index;
@@ -407,7 +407,7 @@ READ16_MEMBER( pasogo_state::ems_r )
}
-WRITE16_MEMBER( pasogo_state::ems_w )
+void pasogo_state::ems_w(offs_t offset, uint16_t data, uint16_t mem_mask)
{
uint8_t index;
@@ -434,16 +434,16 @@ WRITE16_MEMBER( pasogo_state::ems_w )
}
}
-READ16_MEMBER( pasogo_state::emsram_r )
+uint16_t pasogo_state::emsram_r(offs_t offset, uint16_t mem_mask)
{
m_ems->set_bank(m_ems_bank[(offset >> 13) & 0x1f] & 0x7fff);
- return m_ems->read16(space, offset & 0x1fff, mem_mask);
+ return m_ems->read16(offset & 0x1fff, mem_mask);
}
-WRITE16_MEMBER( pasogo_state::emsram_w )
+void pasogo_state::emsram_w(offs_t offset, uint16_t data, uint16_t mem_mask)
{
m_ems->set_bank(m_ems_bank[(offset >> 13) & 0x1f] & 0x7fff);
- m_ems->write16(space, offset & 0x1fff, data, mem_mask);
+ m_ems->write16(offset & 0x1fff, data, mem_mask);
}
void pasogo_state::emsbank_map(address_map &map)
@@ -544,38 +544,38 @@ void pasogo_state::machine_reset()
contrast(*color->fields().first(), nullptr, 0, color->read());
}
-MACHINE_CONFIG_START(pasogo_state::pasogo)
-
- MCFG_DEVICE_ADD("maincpu", V30, XTAL(32'220'000)/2)
- MCFG_DEVICE_PROGRAM_MAP(pasogo_mem)
- MCFG_DEVICE_IO_MAP(pasogo_io)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", pasogo_state, pasogo_interrupt)
- MCFG_DEVICE_IRQ_ACKNOWLEDGE_DEVICE("mb:pic8259", pic8259_device, inta_cb)
+void pasogo_state::pasogo(machine_config &config)
+{
+ V30(config, m_maincpu, XTAL(32'220'000)/2);
+ m_maincpu->set_addrmap(AS_PROGRAM, &pasogo_state::pasogo_mem);
+ m_maincpu->set_addrmap(AS_IO, &pasogo_state::pasogo_io);
+ m_maincpu->set_vblank_int("screen", FUNC(pasogo_state::pasogo_interrupt));
+ m_maincpu->set_irq_acknowledge_callback("mb:pic8259", FUNC(pic8259_device::inta_cb));
ADDRESS_MAP_BANK(config, "ems").set_map(&pasogo_state::emsbank_map).set_options(ENDIANNESS_LITTLE, 16, 32, 0x4000);
- MCFG_IBM5160_MOTHERBOARD_ADD("mb", "maincpu")
+ IBM5160_MOTHERBOARD(config, "mb", 0).set_cputag(m_maincpu);
RAM(config, RAM_TAG).set_default_size("512K");
// It's a CGA device right so lets use isa_cga! Well, not so much.
// The carts use vg230 specific registers and mostly ignore the mc6845.
- MCFG_SCREEN_ADD("screen", LCD)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_SIZE(320, 240)
- MCFG_SCREEN_VISIBLE_AREA(0, 320-1, 0, 240-1)
- MCFG_SCREEN_UPDATE_DRIVER(pasogo_state, screen_update_pasogo)
- MCFG_SCREEN_PALETTE("palette")
- MCFG_PALETTE_ADD("palette", 2)
-
- MCFG_GENERIC_CARTSLOT_ADD("cartslot", generic_plain_slot, "pasogo_cart")
- MCFG_GENERIC_WIDTH(GENERIC_ROM16_WIDTH)
- MCFG_GENERIC_MANDATORY
-
- MCFG_SOFTWARE_LIST_ADD("cart_list","pasogo")
-
- MCFG_TIMER_DRIVER_ADD_PERIODIC("vg230_timer", pasogo_state, vg230_timer, attotime::from_hz(1))
-MACHINE_CONFIG_END
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_LCD));
+ screen.set_refresh_hz(60);
+ screen.set_size(320, 240);
+ screen.set_visarea(0, 320-1, 0, 240-1);
+ screen.set_screen_update(FUNC(pasogo_state::screen_update_pasogo));
+ screen.set_palette(m_palette);
+ PALETTE(config, m_palette).set_entries(2);
+
+ GENERIC_CARTSLOT(config, m_cart, generic_plain_slot, "pasogo_cart");
+ m_cart->set_width(GENERIC_ROM16_WIDTH);
+ m_cart->set_must_be_loaded(true);
+
+ SOFTWARE_LIST(config, "cart_list").set_original("pasogo");
+
+ TIMER(config, "vg230_timer").configure_periodic(FUNC(pasogo_state::vg230_timer), attotime::from_hz(1));
+}
ROM_START( pasogo )
ROM_REGION( 0x10000, "empty", ROMREGION_ERASEFF )
diff --git a/src/mame/drivers/pasopia.cpp b/src/mame/drivers/pasopia.cpp
index 31600cc2d50..3ce53dbc8a5 100644
--- a/src/mame/drivers/pasopia.cpp
+++ b/src/mame/drivers/pasopia.cpp
@@ -286,7 +286,8 @@ We preset all banks here, so that bankswitching will incur no speed penalty.
m_pio_timer->adjust(attotime::from_hz(50), 0, attotime::from_hz(50));
}
-MACHINE_CONFIG_START(pasopia_state::pasopia)
+void pasopia_state::pasopia(machine_config &config)
+{
/* basic machine hardware */
Z80(config, m_maincpu, 4000000);
@@ -295,14 +296,14 @@ MACHINE_CONFIG_START(pasopia_state::pasopia)
m_maincpu->set_daisy_config(pasopia_daisy);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */
- MCFG_SCREEN_SIZE(640, 480)
- MCFG_SCREEN_VISIBLE_AREA(0, 640-1, 0, 480-1)
- MCFG_SCREEN_UPDATE_DEVICE("crtc", h46505_device, screen_update)
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_pasopia)
- MCFG_PALETTE_ADD("palette", 8)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */
+ screen.set_size(640, 480);
+ screen.set_visarea(0, 640-1, 0, 480-1);
+ screen.set_screen_update("crtc", FUNC(h46505_device::screen_update));
+ GFXDECODE(config, "gfxdecode", m_palette, gfx_pasopia);
+ PALETTE(config, m_palette).set_entries(8);
/* Devices */
H46505(config, m_crtc, XTAL(4'000'000)/4); /* unknown clock, hand tuned to get ~60 fps */
@@ -334,7 +335,7 @@ MACHINE_CONFIG_START(pasopia_state::pasopia)
m_pio->out_int_callback().set_inputline(m_maincpu, INPUT_LINE_IRQ0);
m_pio->out_pa_callback().set(FUNC(pasopia_state::mux_w));
m_pio->in_pb_callback().set(FUNC(pasopia_state::keyb_r));
-MACHINE_CONFIG_END
+}
/* ROM definition */
ROM_START( pasopia )
diff --git a/src/mame/drivers/pasopia7.cpp b/src/mame/drivers/pasopia7.cpp
index ce1d0834d02..96ba59b0c1c 100644
--- a/src/mame/drivers/pasopia7.cpp
+++ b/src/mame/drivers/pasopia7.cpp
@@ -535,7 +535,7 @@ WRITE8_MEMBER( pasopia7_state::pasopia7_6845_w )
if(offset == 0)
{
m_addr_latch = data;
- m_crtc->address_w(space, offset, data);
+ m_crtc->address_w(data);
}
else
{
@@ -547,7 +547,7 @@ WRITE8_MEMBER( pasopia7_state::pasopia7_6845_w )
else if(m_addr_latch == 0x0f)
m_cursor_addr = (m_cursor_addr & 0x3f00) | (data & 0xff);
- m_crtc->register_w(space, offset, data);
+ m_crtc->register_w(data);
/* double pump the pixel clock if we are in 640 x 200 mode */
if(m_screen_type == 1) // raster
@@ -572,8 +572,8 @@ READ8_MEMBER( pasopia7_state::pasopia7_fdc_r )
{
switch(offset)
{
- case 4: return m_fdc->msr_r(space, 0, 0xff);
- case 5: return m_fdc->fifo_r(space, 0, 0xff);
+ case 4: return m_fdc->msr_r();
+ case 5: return m_fdc->fifo_r();
//case 6: bit 7 interrupt bit
}
@@ -586,7 +586,7 @@ WRITE8_MEMBER( pasopia7_state::pasopia7_fdc_w )
{
case 0: m_fdc->tc_w(false); break;
case 2: m_fdc->tc_w(true); break;
- case 5: m_fdc->fifo_w(space, 0, data, 0xff); break;
+ case 5: m_fdc->fifo_w(data); break;
case 6:
if(data & 0x80)
m_fdc->reset();
@@ -919,7 +919,8 @@ static void pasopia7_floppies(device_slot_interface &device)
device.option_add("525hd", FLOPPY_525_HD);
}
-MACHINE_CONFIG_START(pasopia7_state::p7_base)
+void pasopia7_state::p7_base(machine_config &config)
+{
/* basic machine hardware */
Z80(config, m_maincpu, XTAL(4'000'000));
m_maincpu->set_addrmap(AS_PROGRAM, &pasopia7_state::pasopia7_mem);
@@ -929,11 +930,9 @@ MACHINE_CONFIG_START(pasopia7_state::p7_base)
/* Audio */
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("sn1", SN76489A, 1996800) // unknown clock / divider
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.50)
+ SN76489A(config, m_sn1, 1996800).add_route(ALL_OUTPUTS, "mono", 0.50); // unknown clock / divider
- MCFG_DEVICE_ADD("sn2", SN76489A, 1996800) // unknown clock / divider
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.50)
+ SN76489A(config, m_sn2, 1996800).add_route(ALL_OUTPUTS, "mono", 0.50); // unknown clock / divider
/* Devices */
Z80CTC(config, m_ctc, XTAL(4'000'000));
@@ -965,50 +964,54 @@ MACHINE_CONFIG_START(pasopia7_state::p7_base)
m_ppi2->out_pc_callback().set(FUNC(pasopia7_state::nmi_reg_w));
UPD765A(config, m_fdc, 8'000'000, true, true);
- MCFG_FLOPPY_DRIVE_ADD("fdc:0", pasopia7_floppies, "525hd", floppy_image_device::default_floppy_formats)
- MCFG_FLOPPY_DRIVE_ADD("fdc:1", pasopia7_floppies, "525hd", floppy_image_device::default_floppy_formats)
-MACHINE_CONFIG_END
+ FLOPPY_CONNECTOR(config, "fdc:0", pasopia7_floppies, "525hd", floppy_image_device::default_floppy_formats);
+ FLOPPY_CONNECTOR(config, "fdc:1", pasopia7_floppies, "525hd", floppy_image_device::default_floppy_formats);
+}
-MACHINE_CONFIG_START(pasopia7_state::p7_raster)
+void pasopia7_state::p7_raster(machine_config &config)
+{
p7_base(config);
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */
- MCFG_SCREEN_SIZE(640, 480)
- MCFG_SCREEN_VISIBLE_AREA(0, 640-1, 0, 32-1)
- MCFG_SCREEN_PALETTE(m_palette)
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_refresh_hz(60);
+ m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */
+ m_screen->set_size(640, 480);
+ m_screen->set_visarea(0, 640-1, 0, 32-1);
+ m_screen->set_palette(m_palette);
+ m_screen->set_screen_update(FUNC(pasopia7_state::screen_update_pasopia7));
MCFG_VIDEO_START_OVERRIDE(pasopia7_state,pasopia7)
- MCFG_SCREEN_UPDATE_DRIVER(pasopia7_state, screen_update_pasopia7)
+
PALETTE(config, m_palette, palette_device::BRG_3BIT);
GFXDECODE(config, "gfxdecode", m_palette, gfx_pasopia7);
H46505(config, m_crtc, VDP_CLOCK); /* unknown clock, hand tuned to get ~60 fps */
- m_crtc->set_screen("screen");
+ m_crtc->set_screen(m_screen);
m_crtc->set_show_border_area(false);
m_crtc->set_char_width(8);
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(pasopia7_state::p7_lcd)
+void pasopia7_state::p7_lcd(machine_config &config)
+{
p7_base(config);
- MCFG_SCREEN_ADD("screen", LCD)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */
- MCFG_SCREEN_SIZE(640, 480)
- MCFG_SCREEN_VISIBLE_AREA(0, 640-1, 0, 200-1)
+ SCREEN(config, m_screen, SCREEN_TYPE_LCD);
+ m_screen->set_refresh_hz(60);
+ m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */
+ m_screen->set_size(640, 480);
+ m_screen->set_visarea(0, 640-1, 0, 200-1);
+ m_screen->set_screen_update(FUNC(pasopia7_state::screen_update_pasopia7));
+ m_screen->set_palette(m_palette);
+
MCFG_VIDEO_START_OVERRIDE(pasopia7_state,pasopia7)
- MCFG_SCREEN_UPDATE_DRIVER(pasopia7_state, screen_update_pasopia7)
- MCFG_SCREEN_PALETTE(m_palette)
PALETTE(config, m_palette, FUNC(pasopia7_state::p7_lcd_palette), 8);
GFXDECODE(config, "gfxdecode", m_palette, gfx_pasopia7);
H46505(config, m_crtc, LCD_CLOCK); /* unknown clock, hand tuned to get ~60 fps */
- m_crtc->set_screen("screen");
+ m_crtc->set_screen(m_screen);
m_crtc->set_show_border_area(false);
m_crtc->set_char_width(8);
-MACHINE_CONFIG_END
+}
/* ROM definition */
ROM_START( pasopia7 )
diff --git a/src/mame/drivers/pass.cpp b/src/mame/drivers/pass.cpp
index 4bc1a2f511f..da1d72c0a06 100644
--- a/src/mame/drivers/pass.cpp
+++ b/src/mame/drivers/pass.cpp
@@ -241,26 +241,26 @@ static GFXDECODE_START( gfx_pass )
GFXDECODE_END
/* todo : is this correct? */
-MACHINE_CONFIG_START(pass_state::pass)
-
+void pass_state::pass(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M68000, 14318180/2 )
- MCFG_DEVICE_PROGRAM_MAP(pass_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", pass_state, irq1_line_hold) /* all the same */
+ M68000(config, m_maincpu, 14318180/2);
+ m_maincpu->set_addrmap(AS_PROGRAM, &pass_state::pass_map);
+ m_maincpu->set_vblank_int("screen", FUNC(pass_state::irq1_line_hold)); /* all the same */
- MCFG_DEVICE_ADD("audiocpu", Z80, 14318180/4 )
- MCFG_DEVICE_PROGRAM_MAP(pass_sound_map)
- MCFG_DEVICE_IO_MAP(pass_sound_io_map)
- MCFG_DEVICE_PERIODIC_INT_DRIVER(pass_state, irq0_line_hold, 60) /* probably not accurate, unknown timing and generation (ym2203 sound chip?). */
+ z80_device &audiocpu(Z80(config, "audiocpu", 14318180/4));
+ audiocpu.set_addrmap(AS_PROGRAM, &pass_state::pass_sound_map);
+ audiocpu.set_addrmap(AS_IO, &pass_state::pass_sound_io_map);
+ audiocpu.set_periodic_int(FUNC(pass_state::irq0_line_hold), attotime::from_hz(60)); /* probably not accurate, unknown timing and generation (ym2203 sound chip?). */
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(64*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(8*8, 48*8-1, 2*8, 30*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(pass_state, screen_update_pass)
- MCFG_SCREEN_PALETTE("palette")
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(64*8, 32*8);
+ screen.set_visarea(8*8, 48*8-1, 2*8, 30*8-1);
+ screen.set_screen_update(FUNC(pass_state::screen_update_pass));
+ screen.set_palette("palette");
PALETTE(config, "palette").set_format(palette_device::xRGB_555, 0x200);
GFXDECODE(config, m_gfxdecode, "palette", gfx_pass);
@@ -271,12 +271,10 @@ MACHINE_CONFIG_START(pass_state::pass)
GENERIC_LATCH_8(config, "soundlatch");
- MCFG_DEVICE_ADD("ymsnd", YM2203, 14318180/4)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.60)
+ YM2203(config, "ymsnd", 14318180/4).add_route(ALL_OUTPUTS, "mono", 0.60);
- MCFG_DEVICE_ADD("oki", OKIM6295, 792000, okim6295_device::PIN7_HIGH) // clock frequency & pin 7 not verified
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.60)
-MACHINE_CONFIG_END
+ OKIM6295(config, "oki", 792000, okim6295_device::PIN7_HIGH).add_route(ALL_OUTPUTS, "mono", 0.60); // clock frequency & pin 7 not verified
+}
ROM_START( pass )
diff --git a/src/mame/drivers/pastelg.cpp b/src/mame/drivers/pastelg.cpp
index 84d48465236..5a253adb99d 100644
--- a/src/mame/drivers/pastelg.cpp
+++ b/src/mame/drivers/pastelg.cpp
@@ -397,26 +397,26 @@ static INPUT_PORTS_START( galds )
INPUT_PORTS_END
-MACHINE_CONFIG_START(pastelg_state::pastelg)
-
+void pastelg_state::pastelg(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, 19968000/4) /* unknown divider, galds definitely relies on this for correct voice pitch */
- MCFG_DEVICE_PROGRAM_MAP(pastelg_map)
- MCFG_DEVICE_IO_MAP(pastelg_io_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", pastelg_state, irq0_line_assert) // nmiclock not written, chip is 1411M1 instead of 1413M3
+ Z80(config, m_maincpu, 19968000/4); /* unknown divider, galds definitely relies on this for correct voice pitch */
+ m_maincpu->set_addrmap(AS_PROGRAM, &pastelg_state::pastelg_map);
+ m_maincpu->set_addrmap(AS_IO, &pastelg_state::pastelg_io_map);
+ m_maincpu->set_vblank_int("screen", FUNC(pastelg_state::irq0_line_assert)); // nmiclock not written, chip is 1411M1 instead of 1413M3
NB1413M3(config, m_nb1413m3, 0, NB1413M3_PASTELG);
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(256, 256)
- MCFG_SCREEN_VISIBLE_AREA(0, 256-1, 16, 240-1)
- MCFG_SCREEN_UPDATE_DRIVER(pastelg_state, screen_update_pastelg)
- MCFG_SCREEN_PALETTE("palette")
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_refresh_hz(60);
+ m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ m_screen->set_size(256, 256);
+ m_screen->set_visarea(0, 256-1, 16, 240-1);
+ m_screen->set_screen_update(FUNC(pastelg_state::screen_update_pastelg));
+ m_screen->set_palette("palette");
PALETTE(config, "palette", FUNC(pastelg_state::pastelg_palette), 32);
@@ -428,10 +428,11 @@ MACHINE_CONFIG_START(pastelg_state::pastelg)
aysnd.port_b_read_callback().set_ioport("DSWB");
aysnd.add_route(ALL_OUTPUTS, "speaker", 0.35);
- MCFG_DEVICE_ADD("dac", DAC_8BIT_R2R, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 0.25) // unknown DAC
- MCFG_DEVICE_ADD("vref", VOLTAGE_REGULATOR, 0) MCFG_VOLTAGE_REGULATOR_OUTPUT(5.0)
- MCFG_SOUND_ROUTE(0, "dac", 1.0, DAC_VREF_POS_INPUT) MCFG_SOUND_ROUTE(0, "dac", -1.0, DAC_VREF_NEG_INPUT)
-MACHINE_CONFIG_END
+ DAC_8BIT_R2R(config, "dac", 0).add_route(ALL_OUTPUTS, "speaker", 0.25); // unknown DAC
+ voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref"));
+ vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT);
+ vref.add_route(0, "dac", -1.0, DAC_VREF_NEG_INPUT);
+}
/*
@@ -456,25 +457,25 @@ Note
*/
-MACHINE_CONFIG_START(pastelg_state::threeds)
-
+void pastelg_state::threeds(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, 19968000/4) /* unknown divider, galds definitely relies on this for correct voice pitch */
- MCFG_DEVICE_PROGRAM_MAP(pastelg_map)
- MCFG_DEVICE_IO_MAP(threeds_io_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", pastelg_state, irq0_line_assert)
+ Z80(config, m_maincpu, 19968000/4); /* unknown divider, galds definitely relies on this for correct voice pitch */
+ m_maincpu->set_addrmap(AS_PROGRAM, &pastelg_state::pastelg_map);
+ m_maincpu->set_addrmap(AS_IO, &pastelg_state::threeds_io_map);
+ m_maincpu->set_vblank_int("screen", FUNC(pastelg_state::irq0_line_assert));
NB1413M3(config, m_nb1413m3, 0);
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(256, 256)
- MCFG_SCREEN_VISIBLE_AREA(0, 256-1, 16, 240-1)
- MCFG_SCREEN_UPDATE_DRIVER(pastelg_state, screen_update_pastelg)
- MCFG_SCREEN_PALETTE("palette")
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_refresh_hz(60);
+ m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ m_screen->set_size(256, 256);
+ m_screen->set_visarea(0, 256-1, 16, 240-1);
+ m_screen->set_screen_update(FUNC(pastelg_state::screen_update_pastelg));
+ m_screen->set_palette("palette");
PALETTE(config, "palette", FUNC(pastelg_state::pastelg_palette), 32);
@@ -486,10 +487,11 @@ MACHINE_CONFIG_START(pastelg_state::threeds)
aysnd.port_b_read_callback().set_ioport("DSWA");
aysnd.add_route(ALL_OUTPUTS, "speaker", 0.35);
- MCFG_DEVICE_ADD("dac", DAC_8BIT_R2R, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 0.25) // unknown DAC
- MCFG_DEVICE_ADD("vref", VOLTAGE_REGULATOR, 0) MCFG_VOLTAGE_REGULATOR_OUTPUT(5.0)
- MCFG_SOUND_ROUTE(0, "dac", 1.0, DAC_VREF_POS_INPUT) MCFG_SOUND_ROUTE(0, "dac", -1.0, DAC_VREF_NEG_INPUT)
-MACHINE_CONFIG_END
+ DAC_8BIT_R2R(config, "dac", 0).add_route(ALL_OUTPUTS, "speaker", 0.25); // unknown DAC
+ voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref"));
+ vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT);
+ vref.add_route(0, "dac", -1.0, DAC_VREF_NEG_INPUT);
+}
ROM_START( pastelg )
diff --git a/src/mame/drivers/patapata.cpp b/src/mame/drivers/patapata.cpp
index 21386d69fa7..9638f33ef2b 100644
--- a/src/mame/drivers/patapata.cpp
+++ b/src/mame/drivers/patapata.cpp
@@ -285,37 +285,36 @@ TIMER_DEVICE_CALLBACK_MEMBER(patapata_state::scanline)
if (param==128) m_maincpu->set_input_line(1, HOLD_LINE);
}
-MACHINE_CONFIG_START(patapata_state::patapata)
+void patapata_state::patapata(machine_config &config)
+{
+ M68000(config, m_maincpu, 16_MHz_XTAL); // 16 MHz XTAL, 16 MHz CPU
+ m_maincpu->set_addrmap(AS_PROGRAM, &patapata_state::main_map);
+ m_maincpu->set_vblank_int("screen", FUNC(patapata_state::irq4_line_hold)); // 1 + 4 valid? (4 main VBL)
- MCFG_DEVICE_ADD("maincpu", M68000, 16_MHz_XTAL) // 16 MHz XTAL, 16 MHz CPU
- MCFG_DEVICE_PROGRAM_MAP(main_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", patapata_state, irq4_line_hold) // 1 + 4 valid? (4 main VBL)
- MCFG_TIMER_DRIVER_ADD_SCANLINE("scantimer", patapata_state, scanline, "screen", 0, 1)
+ TIMER(config, "scantimer").configure_scanline(FUNC(patapata_state::scanline), "screen", 0, 1);
- MCFG_DEVICE_ADD(m_gfxdecode, GFXDECODE, "palette", gfx_patapata)
+ GFXDECODE(config, m_gfxdecode, "palette", gfx_patapata);
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(64*8, 64*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 60*8-1, 0*8, 44*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(patapata_state, screen_update)
- MCFG_SCREEN_PALETTE("palette")
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(64*8, 64*8);
+ screen.set_visarea(0*8, 60*8-1, 0*8, 44*8-1);
+ screen.set_screen_update(FUNC(patapata_state::screen_update));
+ screen.set_palette("palette");
PALETTE(config, "palette").set_format(palette_device::RRRRGGGGBBBBRGBx, 0x600/2);
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("oki1", OKIM6295, 16_MHz_XTAL / 4, okim6295_device::PIN7_LOW) // not verified
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.40)
+ OKIM6295(config, "oki1", 16_MHz_XTAL / 4, okim6295_device::PIN7_LOW).add_route(ALL_OUTPUTS, "mono", 0.40); // not verified
- MCFG_DEVICE_ADD("oki2", OKIM6295, 16_MHz_XTAL / 4, okim6295_device::PIN7_LOW) // not verified
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.40)
+ OKIM6295(config, "oki2", 16_MHz_XTAL / 4, okim6295_device::PIN7_LOW).add_route(ALL_OUTPUTS, "mono", 0.40); // not verified
nmk112_device &nmk112(NMK112(config, "nmk112", 0)); // or 212? difficult to read (maybe 212 is 2* 112?)
nmk112.set_rom0_tag("oki1");
nmk112.set_rom1_tag("oki2");
-MACHINE_CONFIG_END
+}
ROM_START( patapata )
ROM_REGION( 0x80000, "maincpu", 0 ) /* 68000 code */
diff --git a/src/mame/drivers/patinho_feio.cpp b/src/mame/drivers/patinho_feio.cpp
index 3dc8ebb7cc7..2e4697a8186 100644
--- a/src/mame/drivers/patinho_feio.cpp
+++ b/src/mame/drivers/patinho_feio.cpp
@@ -85,7 +85,7 @@ void patinho_feio_state::update_panel(uint8_t ACC, uint8_t opcode, uint8_t mem_d
WRITE8_MEMBER(patinho_feio_state::decwriter_data_w)
{
- m_decwriter->write(space, 0, data);
+ m_decwriter->write(data);
m_maincpu->set_iodev_status(0xA, IODEV_BUSY);
@@ -113,7 +113,7 @@ void patinho_feio_state::decwriter_kbd_input(u8 data)
WRITE8_MEMBER(patinho_feio_state::teletype_data_w)
{
- m_tty->write(space, 0, data);
+ m_tty->write(data);
m_maincpu->set_iodev_status(0xB, IODEV_READY);
m_teletype_timer->adjust(attotime::from_hz(10)); //10 characters per second
diff --git a/src/mame/drivers/pbaction.cpp b/src/mame/drivers/pbaction.cpp
index 0e12ebdd703..e327f926ff3 100644
--- a/src/mame/drivers/pbaction.cpp
+++ b/src/mame/drivers/pbaction.cpp
@@ -448,8 +448,8 @@ static const z80_daisy_config daisy_chain[] =
{ nullptr }
};
-MACHINE_CONFIG_START(pbaction_state::pbaction)
-
+void pbaction_state::pbaction(machine_config &config)
+{
/* basic machine hardware */
Z80(config, m_maincpu, 4_MHz_XTAL);
m_maincpu->set_addrmap(AS_PROGRAM, &pbaction_state::pbaction_map);
@@ -463,14 +463,14 @@ MACHINE_CONFIG_START(pbaction_state::pbaction)
m_ctc->intr_callback().set_inputline(m_audiocpu, 0);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(32*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(pbaction_state, screen_update_pbaction)
- MCFG_SCREEN_PALETTE(m_palette)
- MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE(*this, pbaction_state, vblank_irq))
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(32*8, 32*8);
+ screen.set_visarea(0*8, 32*8-1, 2*8, 30*8-1);
+ screen.set_screen_update(FUNC(pbaction_state::screen_update_pbaction));
+ screen.set_palette(m_palette);
+ screen.screen_vblank().set(FUNC(pbaction_state::vblank_irq));
GFXDECODE(config, m_gfxdecode, m_palette, gfx_pbaction);
PALETTE(config, m_palette).set_format(palette_device::xBGR_444, 256);
@@ -483,7 +483,7 @@ MACHINE_CONFIG_START(pbaction_state::pbaction)
AY8910(config, "ay1", 12_MHz_XTAL/8).add_route(ALL_OUTPUTS, "mono", 0.25);
AY8910(config, "ay2", 12_MHz_XTAL/8).add_route(ALL_OUTPUTS, "mono", 0.25);
AY8910(config, "ay3", 12_MHz_XTAL/8).add_route(ALL_OUTPUTS, "mono", 0.25);
-MACHINE_CONFIG_END
+}
void pbaction_state::pbactionx(machine_config &config)
{
diff --git a/src/mame/drivers/pc.cpp b/src/mame/drivers/pc.cpp
index 61336c9c9c9..64e490b327e 100644
--- a/src/mame/drivers/pc.cpp
+++ b/src/mame/drivers/pc.cpp
@@ -203,24 +203,25 @@ MACHINE_CONFIG_START(pc_state::pccga)
/* basic machine hardware */
MCFG_CPU_PC(pc8, pc8, I8088, 4772720) /* 4,77 MHz */
- MCFG_IBM5160_MOTHERBOARD_ADD("mb", "maincpu")
- MCFG_DEVICE_INPUT_DEFAULTS(pccga)
+ ibm5160_mb_device &mb(IBM5160_MOTHERBOARD(config, "mb", 0));
+ mb.set_cputag(m_maincpu);
+ mb.set_input_default(DEVICE_INPUT_DEFAULTS_NAME(pccga));
// FIXME: determine ISA bus clock
- MCFG_DEVICE_ADD("isa1", ISA8_SLOT, 0, "mb:isa", pc_isa8_cards, "cga", false)
- MCFG_DEVICE_ADD("isa2", ISA8_SLOT, 0, "mb:isa", pc_isa8_cards, "fdc_xt", false)
- MCFG_DEVICE_ADD("isa3", ISA8_SLOT, 0, "mb:isa", pc_isa8_cards, "lpt", false)
- MCFG_DEVICE_ADD("isa4", ISA8_SLOT, 0, "mb:isa", pc_isa8_cards, "com", false)
- MCFG_DEVICE_ADD("isa5", ISA8_SLOT, 0, "mb:isa", pc_isa8_cards, nullptr, false)
+ ISA8_SLOT(config, "isa1", 0, "mb:isa", pc_isa8_cards, "cga", false);
+ ISA8_SLOT(config, "isa2", 0, "mb:isa", pc_isa8_cards, "fdc_xt", false);
+ ISA8_SLOT(config, "isa3", 0, "mb:isa", pc_isa8_cards, "lpt", false);
+ ISA8_SLOT(config, "isa4", 0, "mb:isa", pc_isa8_cards, "com", false);
+ ISA8_SLOT(config, "isa5", 0, "mb:isa", pc_isa8_cards, nullptr, false);
/* keyboard */
- MCFG_PC_KBDC_SLOT_ADD("mb:pc_kbdc", "kbd", pc_xt_keyboards, STR_KBD_IBM_PC_XT_83)
+ PC_KBDC_SLOT(config, "kbd", pc_xt_keyboards, STR_KBD_IBM_PC_XT_83).set_pc_kbdc_slot(subdevice("mb:pc_kbdc"));
/* internal ram */
RAM(config, RAM_TAG).set_default_size("640K").set_extra_options("64K, 128K, 256K, 512K");
/* software lists */
- MCFG_SOFTWARE_LIST_ADD("disk_list","ibm5150")
+ SOFTWARE_LIST(config, "disk_list").set_original("ibm5150");
MACHINE_CONFIG_END
@@ -253,13 +254,12 @@ Expansion: 8087 FPU
******************************************************************************/
-MACHINE_CONFIG_START(pc_state::ataripc1)
+void pc_state::ataripc1(machine_config &config)
+{
pccga(config);
- MCFG_DEVICE_MODIFY("isa1")
- MCFG_SLOT_DEFAULT_OPTION("ega")
- MCFG_DEVICE_MODIFY("isa2")
- MCFG_SLOT_OPTION_MACHINE_CONFIG("fdc_xt", cfg_single_360K)
-MACHINE_CONFIG_END
+ subdevice<isa8_slot_device>("isa1")->set_default_option("ega");
+ subdevice<isa8_slot_device>("isa2")->set_option_machine_config("fdc_xt", cfg_single_360K);
+}
ROM_START ( ataripc1 )
ROM_REGION(0x10000,"bios", 0)
@@ -329,7 +329,7 @@ INPUT_PORTS_END
MACHINE_CONFIG_START(pc_state::bondwell)
pccga(config);
- MCFG_DEVICE_REMOVE("maincpu")
+ config.device_remove("maincpu");
MCFG_CPU_PC(pc8, pc8, I8088, 4772720) // turbo?
MACHINE_CONFIG_END
@@ -355,13 +355,14 @@ ToDo: The ROM for the CGA is available (see ROM section)
******************************************************************************/
-MACHINE_CONFIG_START(pc_state::mpc1600)
+void pc_state::mpc1600(machine_config &config)
+{
pccga(config);
- MCFG_DEVICE_ADD("isa6", ISA8_SLOT, 0, "mb:isa", pc_isa8_cards, nullptr, false)
- MCFG_DEVICE_ADD("isa7", ISA8_SLOT, 0, "mb:isa", pc_isa8_cards, nullptr, false)
- MCFG_DEVICE_ADD("isa8", ISA8_SLOT, 0, "mb:isa", pc_isa8_cards, nullptr, false)
+ ISA8_SLOT(config, "isa6", 0, "mb:isa", pc_isa8_cards, nullptr, false);
+ ISA8_SLOT(config, "isa7", 0, "mb:isa", pc_isa8_cards, nullptr, false);
+ ISA8_SLOT(config, "isa8", 0, "mb:isa", pc_isa8_cards, nullptr, false);
subdevice<ram_device>(RAM_TAG)->set_default_size("128K").set_extra_options("256K, 512K, 640K");
-MACHINE_CONFIG_END
+}
ROM_START( mpc1600 )
ROM_REGION(0x10000,"bios", 0)
@@ -407,12 +408,12 @@ CPU:
******************************************************************************/
-MACHINE_CONFIG_START(pc_state::comport)
+void pc_state::comport(machine_config &config)
+{
pccga(config);
- MCFG_DEVICE_MODIFY("isa1")
- MCFG_SLOT_DEFAULT_OPTION("ega")
+ subdevice<isa8_slot_device>("isa1")->set_default_option("ega");
subdevice<ram_device>(RAM_TAG)->set_default_size("128K").set_extra_options("256K, 512K, 640K");
-MACHINE_CONFIG_END
+}
ROM_START( comport )
ROM_REGION(0x10000, "bios", 0)
@@ -423,7 +424,7 @@ ROM_START( comport )
ROMX_LOAD("compaq_portable_rev_c.bin", 0xe000, 0x2000, CRC(1d1f7c38) SHA1(d9782eb46cd1a7d40f3e8b37eb48db04ac588acb), ROM_BIOS(1))
ROM_REGION(0x8000,"gfx1", 0)
- ROM_LOAD("compaq_portable_video_cpqvid.bin", 0x0000, 0x2000, BAD_DUMP CRC(3ae64565) SHA1(6eeb06620e588a2f7bfab72eb4fadbd70503ea94))
+ ROM_LOAD("compaq_portable_video_cpqvid.bin", 0x0000, 0x1ffe, BAD_DUMP CRC(3ae64565) SHA1(6eeb06620e588a2f7bfab72eb4fadbd70503ea94))
ROM_END
@@ -445,11 +446,11 @@ Expansion: Expansion box, with 5 ISA slots and space for a 5.25" drive and a har
******************************************************************************/
-MACHINE_CONFIG_START(pc_state::dgone)
+void pc_state::dgone(machine_config &config)
+{
pccga(config);
- MCFG_DEVICE_MODIFY("isa2")
- MCFG_SLOT_OPTION_MACHINE_CONFIG("fdc_xt", cfg_dual_720K)
-MACHINE_CONFIG_END
+ subdevice<isa8_slot_device>("isa2")->set_option_machine_config("fdc_xt", cfg_dual_720K);
+}
ROM_START( dgone )
ROM_REGION(0x10000,"bios", 0)
@@ -485,7 +486,7 @@ Options: 8087 FPU, EagleNet File server, EightPort serial card, High Resolution
MACHINE_CONFIG_START(pc_state::eagle1600)
pccga(config);
- MCFG_DEVICE_REMOVE("maincpu")
+ config.device_remove("maincpu");
MCFG_CPU_PC(pc16, pc16, I8086, 8000000)
MACHINE_CONFIG_END
@@ -555,11 +556,10 @@ void pc_state::epc_io(address_map &map)
MACHINE_CONFIG_START(pc_state::epc)
pccga(config);
- MCFG_DEVICE_REMOVE("maincpu")
+ config.device_remove("maincpu");
MCFG_CPU_PC(pc8, epc, I8088, 4772720)
- MCFG_DEVICE_MODIFY("isa1")
- MCFG_SLOT_DEFAULT_OPTION("ega")
- MCFG_DEVICE_ADD("i8251", I8251, 0) // clock?
+ subdevice<isa8_slot_device>("isa1")->set_default_option("ega");
+ I8251(config, "i8251", 0); // clock?
MACHINE_CONFIG_END
ROM_START( epc )
@@ -617,17 +617,18 @@ MACHINE_CONFIG_START(pc_state::ibm5550)
/* basic machine hardware */
MCFG_CPU_PC(pc16, ibm5550, I8086, 8000000)
- MCFG_IBM5160_MOTHERBOARD_ADD("mb", "maincpu")
- MCFG_DEVICE_INPUT_DEFAULTS(pccga)
+ ibm5160_mb_device &mb(IBM5160_MOTHERBOARD(config, "mb", 0));
+ mb.set_cputag(m_maincpu);
+ mb.set_input_default(DEVICE_INPUT_DEFAULTS_NAME(pccga));
// FIXME: determine ISA bus clock
- MCFG_DEVICE_ADD("isa1", ISA8_SLOT, 0, "mb:isa", pc_isa8_cards, "cga", false)
- MCFG_DEVICE_ADD("isa2", ISA8_SLOT, 0, "mb:isa", pc_isa8_cards, "fdc_xt", false)
- MCFG_DEVICE_ADD("isa3", ISA8_SLOT, 0, "mb:isa", pc_isa8_cards, "lpt", false)
- MCFG_DEVICE_ADD("isa4", ISA8_SLOT, 0, "mb:isa", pc_isa8_cards, "com", false)
+ ISA8_SLOT(config, "isa1", 0, "mb:isa", pc_isa8_cards, "cga", false);
+ ISA8_SLOT(config, "isa2", 0, "mb:isa", pc_isa8_cards, "fdc_xt", false);
+ ISA8_SLOT(config, "isa3", 0, "mb:isa", pc_isa8_cards, "lpt", false);
+ ISA8_SLOT(config, "isa4", 0, "mb:isa", pc_isa8_cards, "com", false);
/* keyboard */
- MCFG_PC_KBDC_SLOT_ADD("mb:pc_kbdc", "kbd", pc_xt_keyboards, STR_KBD_IBM_PC_XT_83)
+ PC_KBDC_SLOT(config, "kbd", pc_xt_keyboards, STR_KBD_IBM_PC_XT_83).set_pc_kbdc_slot(subdevice("mb:pc_kbdc"));
/* internal ram */
RAM(config, RAM_TAG).set_default_size("640K").set_extra_options("64K, 128K, 256K, 512K");
@@ -679,20 +680,16 @@ Misc: A Kaypro 16/2 is a configuration without harddisk but with two floppy disk
******************************************************************************/
-MACHINE_CONFIG_START(pc_state::kaypro16)
+void pc_state::kaypro16(machine_config &config)
+{
pccga(config);
- MCFG_DEVICE_MODIFY("isa1")
- MCFG_SLOT_FIXED(true)
- MCFG_DEVICE_MODIFY("isa2")
- MCFG_SLOT_FIXED(true)
- MCFG_DEVICE_MODIFY("isa3")
- MCFG_SLOT_FIXED(true)
- MCFG_DEVICE_MODIFY("isa4")
- MCFG_SLOT_FIXED(true)
- MCFG_DEVICE_MODIFY("isa5")
- MCFG_SLOT_DEFAULT_OPTION(nullptr)
+ subdevice<isa8_slot_device>("isa1")->set_fixed(true);
+ subdevice<isa8_slot_device>("isa2")->set_fixed(true);
+ subdevice<isa8_slot_device>("isa3")->set_fixed(true);
+ subdevice<isa8_slot_device>("isa4")->set_fixed(true);
+ subdevice<isa8_slot_device>("isa5")->set_default_option(nullptr);
subdevice<ram_device>(RAM_TAG)->set_default_size("256K").set_extra_options("512K, 640K");
-MACHINE_CONFIG_END
+}
ROM_START( kaypro16 )
ROM_REGION(0x10000, "bios", 0)
@@ -704,11 +701,11 @@ ROM_END
******************************************************************************/
// MK-88
-MACHINE_CONFIG_START(pc_state::mk88)
+void pc_state::mk88(machine_config &config)
+{
poisk2(config);
- MCFG_DEVICE_MODIFY("isa1")
- MCFG_SLOT_DEFAULT_OPTION("cga_ec1841")
-MACHINE_CONFIG_END
+ subdevice<isa8_slot_device>("isa1")->set_default_option("cga_ec1841");
+}
// MK-88
ROM_START( mk88 )
@@ -749,14 +746,15 @@ Options: 8087 FPU, K101 memory upgrade in 64K steps, 1.2MB floppy and controller
******************************************************************************/
-MACHINE_CONFIG_START(pc_state::ncrpc4i)
+void pc_state::ncrpc4i(machine_config & config)
+{
pccga(config);
//MCFG_DEVICE_MODIFY("mb:isa")
- MCFG_DEVICE_ADD("isa6", ISA8_SLOT, 0, "mb:isa", pc_isa8_cards, nullptr, false) // FIXME: determine ISA bus clock
- MCFG_DEVICE_ADD("isa7", ISA8_SLOT, 0, "mb:isa", pc_isa8_cards, nullptr, false)
+ ISA8_SLOT(config, "isa6", 0, "mb:isa", pc_isa8_cards, nullptr, false); // FIXME: determine ISA bus clock
+ ISA8_SLOT(config, "isa7", 0, "mb:isa", pc_isa8_cards, nullptr, false);
subdevice<ram_device>(RAM_TAG)->set_default_size("640K").set_extra_options("64K, 128K, 256K, 512K");
-MACHINE_CONFIG_END
+}
ROM_START( ncrpc4i )
ROM_REGION(0x10000,"bios", 0)
@@ -787,15 +785,14 @@ static DEVICE_INPUT_DEFAULTS_START( m15 )
DEVICE_INPUT_DEFAULTS("DSW0", 0x01, 0x00)
DEVICE_INPUT_DEFAULTS_END
-MACHINE_CONFIG_START(pc_state::m15)
+void pc_state::m15(machine_config &config)
+{
pccga(config);
- MCFG_DEVICE_MODIFY("mb")
- MCFG_DEVICE_INPUT_DEFAULTS(m15)
- MCFG_DEVICE_MODIFY("isa2")
- MCFG_SLOT_OPTION_MACHINE_CONFIG("fdc_xt", cfg_dual_720K)
+ subdevice<ibm5160_mb_device>("mb")->set_input_default(DEVICE_INPUT_DEFAULTS_NAME(m15));
+ subdevice<isa8_slot_device>("isa2")->set_option_machine_config("fdc_xt", cfg_dual_720K);
subdevice<ram_device>(RAM_TAG)->set_default_size("448K").set_extra_options("16K, 160K, 304K");
-MACHINE_CONFIG_END
+}
ROM_START( olivm15 )
ROM_REGION(0x10000,"bios", 0)
@@ -822,14 +819,11 @@ Options: 8087 FPU
MACHINE_CONFIG_START(pc_state::olytext30)
pccga(config);
- MCFG_DEVICE_REMOVE("maincpu")
+ config.device_remove("maincpu");
MCFG_CPU_PC(pc8, pc8, V20, XTAL(14'318'181)/3) /* 4,77 MHz */
- MCFG_DEVICE_MODIFY("isa2")
- MCFG_SLOT_OPTION_MACHINE_CONFIG("fdc_xt", cfg_single_720K)
- MCFG_DEVICE_MODIFY("isa3")
- MCFG_SLOT_DEFAULT_OPTION("")
- MCFG_DEVICE_MODIFY("isa5")
- MCFG_SLOT_DEFAULT_OPTION("hdc")
+ subdevice<isa8_slot_device>("isa2")->set_option_machine_config("fdc_xt", cfg_single_720K);
+ subdevice<isa8_slot_device>("isa3")->set_default_option("");
+ subdevice<isa8_slot_device>("isa5")->set_default_option("hdc");
subdevice<ram_device>(RAM_TAG)->set_default_size("768K");
MACHINE_CONFIG_END
@@ -847,16 +841,17 @@ MACHINE_CONFIG_START(pc_state::poisk2)
/* basic machine hardware */
MCFG_CPU_PC(pc16, pc16, I8086, 4772720)
- MCFG_IBM5160_MOTHERBOARD_ADD("mb", "maincpu")
- MCFG_DEVICE_INPUT_DEFAULTS(pccga)
+ ibm5160_mb_device &mb(IBM5160_MOTHERBOARD(config, "mb", 0));
+ mb.set_cputag(m_maincpu);
+ mb.set_input_default(DEVICE_INPUT_DEFAULTS_NAME(pccga));
- MCFG_DEVICE_ADD("isa1", ISA8_SLOT, 0, "mb:isa", pc_isa8_cards, "cga_poisk2", false) // FIXME: determine ISA bus clock
- MCFG_DEVICE_ADD("isa2", ISA8_SLOT, 0, "mb:isa", pc_isa8_cards, "fdc_xt", false)
- MCFG_DEVICE_ADD("isa3", ISA8_SLOT, 0, "mb:isa", pc_isa8_cards, "lpt", false)
- MCFG_DEVICE_ADD("isa4", ISA8_SLOT, 0, "mb:isa", pc_isa8_cards, "com", false)
+ ISA8_SLOT(config, "isa1", 0, "mb:isa", pc_isa8_cards, "cga_poisk2", false); // FIXME: determine ISA bus clock
+ ISA8_SLOT(config, "isa2", 0, "mb:isa", pc_isa8_cards, "fdc_xt", false);
+ ISA8_SLOT(config, "isa3", 0, "mb:isa", pc_isa8_cards, "lpt", false);
+ ISA8_SLOT(config, "isa4", 0, "mb:isa", pc_isa8_cards, "com", false);
/* keyboard */
- MCFG_PC_KBDC_SLOT_ADD("mb:pc_kbdc", "kbd", pc_xt_keyboards, STR_KBD_IBM_PC_XT_83)
+ PC_KBDC_SLOT(config, "kbd", pc_xt_keyboards, STR_KBD_IBM_PC_XT_83).set_pc_kbdc_slot(subdevice("mb:pc_kbdc"));
/* internal ram */
RAM(config, RAM_TAG).set_default_size("640K").set_extra_options("64K, 128K, 256K, 512K");
@@ -938,18 +933,17 @@ MACHINE_CONFIG_START(pc_state::iskr3104)
/* basic machine hardware */
MCFG_CPU_PC(pc16, pc16, I8086, 4772720)
- MCFG_IBM5160_MOTHERBOARD_ADD("mb", "maincpu")
- MCFG_DEVICE_INPUT_DEFAULTS(iskr3104)
-
- MCFG_DEVICE_ADD("isa1", ISA8_SLOT, 0, "mb:isa", pc_isa8_cards, "ega", false) // FIXME: determine ISA bus clock
- MCFG_SLOT_OPTION_DEFAULT_BIOS("ega", "iskr3104")
+ ibm5160_mb_device &mb(IBM5160_MOTHERBOARD(config, "mb", 0));
+ mb.set_cputag(m_maincpu);
+ mb.set_input_default(DEVICE_INPUT_DEFAULTS_NAME(iskr3104));
- MCFG_DEVICE_ADD("isa2", ISA8_SLOT, 0, "mb:isa", pc_isa8_cards, "fdc_xt", false)
- MCFG_DEVICE_ADD("isa3", ISA8_SLOT, 0, "mb:isa", pc_isa8_cards, "lpt", false)
- MCFG_DEVICE_ADD("isa4", ISA8_SLOT, 0, "mb:isa", pc_isa8_cards, "com", false)
+ ISA8_SLOT(config, "isa1", 0, "mb:isa", pc_isa8_cards, "ega", false).set_option_default_bios("ega", "iskr3104"); // FIXME: determine ISA bus clock
+ ISA8_SLOT(config, "isa2", 0, "mb:isa", pc_isa8_cards, "fdc_xt", false);
+ ISA8_SLOT(config, "isa3", 0, "mb:isa", pc_isa8_cards, "lpt", false);
+ ISA8_SLOT(config, "isa4", 0, "mb:isa", pc_isa8_cards, "com", false);
/* keyboard */
- MCFG_PC_KBDC_SLOT_ADD("mb:pc_kbdc", "kbd", pc_xt_keyboards, STR_KBD_IBM_PC_XT_83)
+ PC_KBDC_SLOT(config, "kbd", pc_xt_keyboards, STR_KBD_IBM_PC_XT_83).set_pc_kbdc_slot(subdevice("mb:pc_kbdc"));
/* internal ram */
RAM(config, RAM_TAG).set_default_size("640K").set_extra_options("64K, 128K, 256K, 512K");
@@ -1014,19 +1008,20 @@ MACHINE_CONFIG_START(pc_state::siemens)
/* basic machine hardware */
MCFG_CPU_PC(pc8, pc8, I8088, XTAL(14'318'181)/3) /* 4,77 MHz */
- MCFG_IBM5150_MOTHERBOARD_ADD("mb", "maincpu")
- MCFG_DEVICE_INPUT_DEFAULTS(siemens)
+ ibm5150_mb_device &mb(IBM5150_MOTHERBOARD(config, "mb", 0));
+ mb.set_cputag(m_maincpu);
+ mb.set_input_default(DEVICE_INPUT_DEFAULTS_NAME(siemens));
// FIXME: determine ISA bus clock
- MCFG_DEVICE_ADD("isa1", ISA8_SLOT, 0, "mb:isa", pc_isa8_cards, "hercules", false)
- MCFG_DEVICE_ADD("isa2", ISA8_SLOT, 0, "mb:isa", pc_isa8_cards, "fdc_xt", false)
- MCFG_DEVICE_ADD("isa3", ISA8_SLOT, 0, "mb:isa", pc_isa8_cards, "lpt", false)
- MCFG_DEVICE_ADD("isa4", ISA8_SLOT, 0, "mb:isa", pc_isa8_cards, "com", false)
- MCFG_DEVICE_ADD("isa5", ISA8_SLOT, 0, "mb:isa", pc_isa8_cards, "hdc", false)
- MCFG_DEVICE_ADD("isa6", ISA8_SLOT, 0, "mb:isa", pc_isa8_cards, nullptr, false)
+ ISA8_SLOT(config, "isa1", 0, "mb:isa", pc_isa8_cards, "hercules", false);
+ ISA8_SLOT(config, "isa2", 0, "mb:isa", pc_isa8_cards, "fdc_xt", false);
+ ISA8_SLOT(config, "isa3", 0, "mb:isa", pc_isa8_cards, "lpt", false);
+ ISA8_SLOT(config, "isa4", 0, "mb:isa", pc_isa8_cards, "com", false);
+ ISA8_SLOT(config, "isa5", 0, "mb:isa", pc_isa8_cards, "hdc", false);
+ ISA8_SLOT(config, "isa6", 0, "mb:isa", pc_isa8_cards, nullptr, false);
/* keyboard */
- MCFG_PC_KBDC_SLOT_ADD("mb:pc_kbdc", "kbd", pc_xt_keyboards, STR_KBD_IBM_PC_XT_83)
+ PC_KBDC_SLOT(config, "kbd", pc_xt_keyboards, STR_KBD_IBM_PC_XT_83).set_pc_kbdc_slot(subdevice("mb:pc_kbdc"));
/* internal ram */
RAM(config, RAM_TAG).set_default_size("640K").set_extra_options("64K, 128K, 256K, 512K");
@@ -1057,27 +1052,28 @@ Options: 8087 FPU
MACHINE_CONFIG_START(pc_state::laser_turbo_xt)
MCFG_CPU_PC(pc8, pc8, I8088, XTAL(14'318'181)/3) /* 4,77 MHz */
- MCFG_IBM5160_MOTHERBOARD_ADD("mb","maincpu")
- MCFG_DEVICE_INPUT_DEFAULTS(pccga)
+ ibm5160_mb_device &mb(IBM5160_MOTHERBOARD(config, "mb", 0));
+ mb.set_cputag(m_maincpu);
+ mb.set_input_default(DEVICE_INPUT_DEFAULTS_NAME(pccga));
// FIXME: determine ISA bus clock
- MCFG_DEVICE_ADD("isa1", ISA8_SLOT, 0, "mb:isa", pc_isa8_cards, "cga", false)
- MCFG_DEVICE_ADD("isa2", ISA8_SLOT, 0, "mb:isa", pc_isa8_cards, "com", false) // Multi I/O card (includes FDC)
- MCFG_DEVICE_ADD("isa3", ISA8_SLOT, 0, "mb:isa", pc_isa8_cards, "fdc_xt", false)
- MCFG_DEVICE_ADD("isa4", ISA8_SLOT, 0, "mb:isa", pc_isa8_cards, nullptr, false)
- MCFG_DEVICE_ADD("isa5", ISA8_SLOT, 0, "mb:isa", pc_isa8_cards, nullptr, false)
- MCFG_DEVICE_ADD("isa6", ISA8_SLOT, 0, "mb:isa", pc_isa8_cards, nullptr, false)
- MCFG_DEVICE_ADD("isa7", ISA8_SLOT, 0, "mb:isa", pc_isa8_cards, nullptr, false)
- MCFG_DEVICE_ADD("isa8", ISA8_SLOT, 0, "mb:isa", pc_isa8_cards, nullptr, false)
+ ISA8_SLOT(config, "isa1", 0, "mb:isa", pc_isa8_cards, "cga", false);
+ ISA8_SLOT(config, "isa2", 0, "mb:isa", pc_isa8_cards, "com", false); // Multi I/O card (includes FDC)
+ ISA8_SLOT(config, "isa3", 0, "mb:isa", pc_isa8_cards, "fdc_xt", false);
+ ISA8_SLOT(config, "isa4", 0, "mb:isa", pc_isa8_cards, nullptr, false);
+ ISA8_SLOT(config, "isa5", 0, "mb:isa", pc_isa8_cards, nullptr, false);
+ ISA8_SLOT(config, "isa6", 0, "mb:isa", pc_isa8_cards, nullptr, false);
+ ISA8_SLOT(config, "isa7", 0, "mb:isa", pc_isa8_cards, nullptr, false);
+ ISA8_SLOT(config, "isa8", 0, "mb:isa", pc_isa8_cards, nullptr, false);
/* keyboard */
- MCFG_PC_KBDC_SLOT_ADD("mb:pc_kbdc", "kbd", pc_xt_keyboards, STR_KBD_IBM_PC_XT_83)
+ PC_KBDC_SLOT(config, "kbd", pc_xt_keyboards, STR_KBD_IBM_PC_XT_83).set_pc_kbdc_slot(subdevice("mb:pc_kbdc"));
/* internal ram */
RAM(config, RAM_TAG).set_default_size("640K").set_extra_options("512K,768K,896K,1024K,1408K,1536K,1664K");
/* software lists */
- MCFG_SOFTWARE_LIST_ADD("disk_list","ibm5150")
+ SOFTWARE_LIST(config, "disk_list").set_original("ibm5150");
MACHINE_CONFIG_END
ROM_START( laser_turbo_xt )
@@ -1136,23 +1132,23 @@ MACHINE_CONFIG_START(pc_state::zenith)
/* basic machine hardware */
MCFG_CPU_PC(zenith, pc8, I8088, XTAL(14'318'181)/3) /* 4,77 MHz */
- MCFG_IBM5150_MOTHERBOARD_ADD("mb", "maincpu")
- MCFG_DEVICE_INPUT_DEFAULTS(pccga)
+ ibm5150_mb_device &mb(IBM5150_MOTHERBOARD(config, "mb", 0));
+ mb.set_cputag(m_maincpu);
+ mb.set_input_default(DEVICE_INPUT_DEFAULTS_NAME(pccga));
- MCFG_DEVICE_ADD("isa1", ISA8_SLOT, 0, "mb:isa", pc_isa8_cards, "cga", false) // FIXME: determine ISA bus clock
- MCFG_DEVICE_ADD("isa2", ISA8_SLOT, 0, "mb:isa", pc_isa8_cards, "fdc_xt", false)
- MCFG_SLOT_OPTION_MACHINE_CONFIG("fdc_xt", cfg_dual_720K)
- MCFG_DEVICE_ADD("isa3", ISA8_SLOT, 0, "mb:isa", pc_isa8_cards, "lpt", false)
- MCFG_DEVICE_ADD("isa4", ISA8_SLOT, 0, "mb:isa", pc_isa8_cards, "com", false)
+ ISA8_SLOT(config, "isa1", 0, "mb:isa", pc_isa8_cards, "cga", false); // FIXME: determine ISA bus clock
+ ISA8_SLOT(config, "isa2", 0, "mb:isa", pc_isa8_cards, "fdc_xt", false).set_option_machine_config("fdc_xt", cfg_dual_720K);
+ ISA8_SLOT(config, "isa3", 0, "mb:isa", pc_isa8_cards, "lpt", false);
+ ISA8_SLOT(config, "isa4", 0, "mb:isa", pc_isa8_cards, "com", false);
/* keyboard */
- MCFG_PC_KBDC_SLOT_ADD("mb:pc_kbdc", "kbd", pc_xt_keyboards, STR_KBD_IBM_PC_XT_83)
+ PC_KBDC_SLOT(config, "kbd", pc_xt_keyboards, STR_KBD_IBM_PC_XT_83).set_pc_kbdc_slot(subdevice("mb:pc_kbdc"));
/* internal ram */
RAM(config, RAM_TAG).set_default_size("640K").set_extra_options("128K, 256K, 512K");
/* software lists */
- MCFG_SOFTWARE_LIST_ADD("disk_list","ibm5150")
+ SOFTWARE_LIST(config, "disk_list").set_original("ibm5150");
MACHINE_CONFIG_END
ROM_START( zdsupers )
diff --git a/src/mame/drivers/pc100.cpp b/src/mame/drivers/pc100.cpp
index 5faf9330f26..c4c446ed822 100644
--- a/src/mame/drivers/pc100.cpp
+++ b/src/mame/drivers/pc100.cpp
@@ -634,7 +634,8 @@ static void pc100_floppies(device_slot_interface &device)
#define MASTER_CLOCK 6988800
-MACHINE_CONFIG_START(pc100_state::pc100)
+void pc100_state::pc100(machine_config &config)
+{
/* basic machine hardware */
I8086(config, m_maincpu, MASTER_CLOCK);
m_maincpu->set_addrmap(AS_PROGRAM, &pc100_state::pc100_map);
@@ -642,10 +643,10 @@ MACHINE_CONFIG_START(pc100_state::pc100)
m_maincpu->set_vblank_int("screen", FUNC(pc100_state::pc100_vblank_irq));
m_maincpu->set_irq_acknowledge_callback("pic8259", FUNC(pic8259_device::inta_cb));
- MCFG_TIMER_DRIVER_ADD_PERIODIC("600hz", pc100_state, pc100_600hz_irq, attotime::from_hz(MASTER_CLOCK/600))
- MCFG_TIMER_DRIVER_ADD_PERIODIC("100hz", pc100_state, pc100_100hz_irq, attotime::from_hz(MASTER_CLOCK/100))
- MCFG_TIMER_DRIVER_ADD_PERIODIC("50hz", pc100_state, pc100_50hz_irq, attotime::from_hz(MASTER_CLOCK/50))
- MCFG_TIMER_DRIVER_ADD_PERIODIC("10hz", pc100_state, pc100_10hz_irq, attotime::from_hz(MASTER_CLOCK/10))
+ TIMER(config, "600hz").configure_periodic(FUNC(pc100_state::pc100_600hz_irq), attotime::from_hz(MASTER_CLOCK/600));
+ TIMER(config, "100hz").configure_periodic(FUNC(pc100_state::pc100_100hz_irq), attotime::from_hz(MASTER_CLOCK/100));
+ TIMER(config, "50hz").configure_periodic(FUNC(pc100_state::pc100_50hz_irq), attotime::from_hz(MASTER_CLOCK/50));
+ TIMER(config, "10hz").configure_periodic(FUNC(pc100_state::pc100_10hz_irq), attotime::from_hz(MASTER_CLOCK/10));
i8255_device &ppi1(I8255(config, "ppi8255_1"));
ppi1.out_pa_callback().set(FUNC(pc100_state::rtc_porta_w));
@@ -671,21 +672,21 @@ MACHINE_CONFIG_START(pc100_state::pc100)
m_fdc->intrq_wr_callback().set(FUNC(pc100_state::irqnmi_w));
m_fdc->drq_wr_callback().set(FUNC(pc100_state::drqnmi_w));
- MCFG_DEVICE_ADD("rtc", MSM58321, XTAL(32'768))
- MCFG_MSM58321_D0_HANDLER(WRITELINE(*this, pc100_state, rtc_portc_0_w))
- MCFG_MSM58321_D1_HANDLER(WRITELINE(*this, pc100_state, rtc_portc_1_w))
- MCFG_MSM58321_D2_HANDLER(WRITELINE(*this, pc100_state, rtc_portc_2_w))
- MCFG_MSM58321_D3_HANDLER(WRITELINE(*this, pc100_state, rtc_portc_3_w))
+ MSM58321(config, m_rtc, XTAL(32'768));
+ m_rtc->d0_handler().set(FUNC(pc100_state::rtc_portc_0_w));
+ m_rtc->d1_handler().set(FUNC(pc100_state::rtc_portc_1_w));
+ m_rtc->d2_handler().set(FUNC(pc100_state::rtc_portc_2_w));
+ m_rtc->d3_handler().set(FUNC(pc100_state::rtc_portc_3_w));
- MCFG_FLOPPY_DRIVE_ADD("upd765:0", pc100_floppies, "525dd", floppy_image_device::default_floppy_formats)
- MCFG_FLOPPY_DRIVE_ADD("upd765:1", pc100_floppies, "525dd", floppy_image_device::default_floppy_formats)
+ FLOPPY_CONNECTOR(config, "upd765:0", pc100_floppies, "525dd", floppy_image_device::default_floppy_formats);
+ FLOPPY_CONNECTOR(config, "upd765:1", pc100_floppies, "525dd", floppy_image_device::default_floppy_formats);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
/* TODO: Unknown Pixel Clock and CRTC is dynamic */
- MCFG_SCREEN_RAW_PARAMS(MASTER_CLOCK*4, 1024, 0, 768, 264*2, 0, 512)
- MCFG_SCREEN_UPDATE_DRIVER(pc100_state, screen_update_pc100)
- MCFG_SCREEN_PALETTE("palette")
+ screen.set_raw(MASTER_CLOCK*4, 1024, 0, 768, 264*2, 0, 512);
+ screen.set_screen_update(FUNC(pc100_state::screen_update_pc100));
+ screen.set_palette(m_palette);
GFXDECODE(config, "gfxdecode", m_palette, gfx_pc100);
PALETTE(config, m_palette).set_format(palette_device::xBGR_333, 16);
@@ -693,7 +694,7 @@ MACHINE_CONFIG_START(pc100_state::pc100)
SPEAKER(config, "mono").front_center();
BEEP(config, m_beeper, 2400).add_route(ALL_OUTPUTS, "mono", 0.50);
-MACHINE_CONFIG_END
+}
/* ROM definition */
ROM_START( pc100 )
diff --git a/src/mame/drivers/pc1512.cpp b/src/mame/drivers/pc1512.cpp
index c523b83473b..6063960ff70 100644
--- a/src/mame/drivers/pc1512.cpp
+++ b/src/mame/drivers/pc1512.cpp
@@ -558,16 +558,16 @@ READ8_MEMBER( pc1640_state::io_r )
offs_t addr = offset & 0x3ff;
bool decoded = false;
- if ( addr <= 0x00f) { data = m_dmac->read(space, offset & 0x0f); decoded = true; }
+ if ( addr <= 0x00f) { data = m_dmac->read(offset & 0x0f); decoded = true; }
else if (addr >= 0x020 && addr <= 0x021) { data = m_pic->read(offset & 0x01); decoded = true; }
else if (addr >= 0x040 && addr <= 0x043) { data = m_pit->read(offset & 0x03); decoded = true; }
else if (addr >= 0x060 && addr <= 0x06f) { data = system_r(space, offset & 0x0f); decoded = true; }
- else if (addr >= 0x070 && addr <= 0x073) { data = m_rtc->read(space, offset & 0x01); decoded = true; }
+ else if (addr >= 0x070 && addr <= 0x073) { data = m_rtc->read(offset & 0x01); decoded = true; }
else if (addr >= 0x078 && addr <= 0x07f) { data = mouse_r(space, offset & 0x07); decoded = true; }
else if (addr >= 0x378 && addr <= 0x37b) { data = printer_r(space, offset & 0x03); decoded = true; }
else if (addr >= 0x3b0 && addr <= 0x3df) { decoded = true; }
- else if (addr >= 0x3f4 && addr <= 0x3f4) { data = m_fdc->fdc->msr_r(space, offset & 0x01); decoded = true; }
- else if (addr >= 0x3f5 && addr <= 0x3f5) { data = m_fdc->fdc->fifo_r(space, offset & 0x01); decoded = true; }
+ else if (addr >= 0x3f4 && addr <= 0x3f4) { data = m_fdc->fdc->msr_r(); decoded = true; }
+ else if (addr >= 0x3f5 && addr <= 0x3f5) { data = m_fdc->fdc->fifo_r(); decoded = true; }
else if (addr >= 0x3f8 && addr <= 0x3ff) { data = m_uart->ins8250_r(space, offset & 0x07); decoded = true; }
if (decoded)
@@ -1152,14 +1152,15 @@ void pc1640_state::machine_start()
//**************************************************************************
//-------------------------------------------------
-// MACHINE_CONFIG( pc1512 )
+// machine_config( pc1512 )
//-------------------------------------------------
-MACHINE_CONFIG_START(pc1512_state::pc1512)
- MCFG_DEVICE_ADD(I8086_TAG, I8086, 24_MHz_XTAL / 3)
- MCFG_DEVICE_PROGRAM_MAP(pc1512_mem)
- MCFG_DEVICE_IO_MAP(pc1512_io)
- MCFG_DEVICE_IRQ_ACKNOWLEDGE_DEVICE(I8259A2_TAG, pic8259_device, inta_cb)
+void pc1512_state::pc1512(machine_config &config)
+{
+ I8086(config, m_maincpu, 24_MHz_XTAL / 3);
+ m_maincpu->set_addrmap(AS_PROGRAM, &pc1512_state::pc1512_mem);
+ m_maincpu->set_addrmap(AS_IO, &pc1512_state::pc1512_io);
+ m_maincpu->set_irq_acknowledge_callback(I8259A2_TAG, FUNC(pic8259_device::inta_cb));
// video
pc1512_video(config);
@@ -1173,11 +1174,11 @@ MACHINE_CONFIG_START(pc1512_state::pc1512)
m_kb->clock_wr_callback().set(FUNC(pc1512_state::kbclk_w));
m_kb->data_wr_callback().set(FUNC(pc1512_state::kbdata_w));
- MCFG_PC1512_MOUSE_PORT_ADD(PC1512_MOUSE_PORT_TAG, pc1512_mouse_port_devices, "mouse")
- MCFG_PC1512_MOUSE_PORT_X_CB(WRITE8(*this, pc1512_state, mouse_x_w))
- MCFG_PC1512_MOUSE_PORT_Y_CB(WRITE8(*this, pc1512_state, mouse_y_w))
- MCFG_PC1512_MOUSE_PORT_M1_CB(WRITELINE(PC1512_KEYBOARD_TAG, pc1512_keyboard_device, m1_w))
- MCFG_PC1512_MOUSE_PORT_M2_CB(WRITELINE(PC1512_KEYBOARD_TAG, pc1512_keyboard_device, m2_w))
+ pc1512_mouse_port_device &mouse(PC1512_MOUSE_PORT(config, PC1512_MOUSE_PORT_TAG, pc1512_mouse_port_devices, "mouse"));
+ mouse.x_wr_callback().set(FUNC(pc1512_base_state::mouse_x_w));
+ mouse.y_wr_callback().set(FUNC(pc1512_base_state::mouse_y_w));
+ mouse.m1_wr_callback().set(m_kb, FUNC(pc1512_keyboard_device::m1_w));
+ mouse.m2_wr_callback().set(m_kb, FUNC(pc1512_keyboard_device::m2_w));
AM9517A(config, m_dmac, 24_MHz_XTAL / 6);
m_dmac->out_hreq_callback().set(FUNC(pc1512_state::hrq_w));
@@ -1196,10 +1197,10 @@ MACHINE_CONFIG_START(pc1512_state::pc1512)
m_dmac->out_dack_callback<2>().set(FUNC(pc1512_state::dack2_w));
m_dmac->out_dack_callback<3>().set(FUNC(pc1512_state::dack3_w));
- PIC8259(config, m_pic, 0);
+ PIC8259(config, m_pic);
m_pic->out_int_callback().set_inputline(m_maincpu, INPUT_LINE_IRQ0);
- PIT8253(config, m_pit, 0);
+ PIT8253(config, m_pit);
m_pit->set_clk<0>(28.636363_MHz_XTAL / 24);
m_pit->out_handler<0>().set(m_pic, FUNC(pic8259_device::ir0_w));
m_pit->set_clk<1>(28.636363_MHz_XTAL / 24);
@@ -1213,8 +1214,8 @@ MACHINE_CONFIG_START(pc1512_state::pc1512)
PC_FDC_XT(config, m_fdc, 0);
m_fdc->intrq_wr_callback().set(FUNC(pc1512_state::fdc_int_w));
m_fdc->drq_wr_callback().set(FUNC(pc1512_state::fdc_drq_w));
- MCFG_FLOPPY_DRIVE_ADD(PC_FDC_XT_TAG ":0", pc1512_floppies, "525dd", pc1512_base_state::floppy_formats)
- MCFG_FLOPPY_DRIVE_ADD(PC_FDC_XT_TAG ":1", pc1512_floppies, nullptr, pc1512_base_state::floppy_formats)
+ FLOPPY_CONNECTOR(config, PC_FDC_XT_TAG ":0", pc1512_floppies, "525dd", pc1512_base_state::floppy_formats);
+ FLOPPY_CONNECTOR(config, PC_FDC_XT_TAG ":1", pc1512_floppies, nullptr, pc1512_base_state::floppy_formats);
INS8250(config, m_uart, 1.8432_MHz_XTAL);
m_uart->out_tx_callback().set(RS232_TAG, FUNC(rs232_port_device::write_txd));
@@ -1222,13 +1223,15 @@ MACHINE_CONFIG_START(pc1512_state::pc1512)
m_uart->out_rts_callback().set(RS232_TAG, FUNC(rs232_port_device::write_rts));
m_uart->out_int_callback().set(m_pic, FUNC(pic8259_device::ir4_w));
- MCFG_DEVICE_ADD(m_centronics, CENTRONICS, centronics_devices, "printer")
- MCFG_CENTRONICS_ACK_HANDLER(WRITELINE(*this, pc1512_state, write_centronics_ack))
- MCFG_CENTRONICS_BUSY_HANDLER(WRITELINE(*this, pc1512_state, write_centronics_busy))
- MCFG_CENTRONICS_PERROR_HANDLER(WRITELINE(*this, pc1512_state, write_centronics_perror))
- MCFG_CENTRONICS_SELECT_HANDLER(WRITELINE(*this, pc1512_state, write_centronics_select))
- MCFG_CENTRONICS_FAULT_HANDLER(WRITELINE(*this, pc1512_state, write_centronics_fault))
- MCFG_CENTRONICS_OUTPUT_LATCH_ADD("cent_data_out", CENTRONICS_TAG)
+ CENTRONICS(config, m_centronics, centronics_devices, "printer");
+ m_centronics->ack_handler().set(FUNC(pc1512_state::write_centronics_ack));
+ m_centronics->busy_handler().set(FUNC(pc1512_state::write_centronics_busy));
+ m_centronics->perror_handler().set(FUNC(pc1512_state::write_centronics_perror));
+ m_centronics->select_handler().set(FUNC(pc1512_state::write_centronics_select));
+ m_centronics->fault_handler().set(FUNC(pc1512_state::write_centronics_fault));
+
+ OUTPUT_LATCH(config, m_cent_data_out);
+ m_centronics->set_output_latch(*m_cent_data_out);
rs232_port_device &rs232(RS232_PORT(config, RS232_TAG, default_rs232_devices, nullptr));
rs232.rxd_handler().set(m_uart, FUNC(ins8250_uart_device::rx_w));
@@ -1239,7 +1242,8 @@ MACHINE_CONFIG_START(pc1512_state::pc1512)
// ISA8 bus
isa8_device &isa(ISA8(config, ISA_BUS_TAG, 0));
- isa.set_cputag(I8086_TAG);
+ isa.set_memspace(m_maincpu, AS_PROGRAM);
+ isa.set_iospace(m_maincpu, AS_IO);
isa.irq2_callback().set(m_pic, FUNC(pic8259_device::ir2_w));
isa.irq3_callback().set(m_pic, FUNC(pic8259_device::ir3_w));
isa.irq4_callback().set(m_pic, FUNC(pic8259_device::ir4_w));
@@ -1249,51 +1253,52 @@ MACHINE_CONFIG_START(pc1512_state::pc1512)
isa.drq1_callback().set(I8237A5_TAG, FUNC(am9517a_device::dreq1_w));
isa.drq2_callback().set(I8237A5_TAG, FUNC(am9517a_device::dreq2_w));
isa.drq3_callback().set(I8237A5_TAG, FUNC(am9517a_device::dreq3_w));
- MCFG_DEVICE_ADD("isa1", ISA8_SLOT, 0, ISA_BUS_TAG, pc_isa8_cards, nullptr, false) // FIXME: determine ISA clock
- MCFG_DEVICE_ADD("isa2", ISA8_SLOT, 0, ISA_BUS_TAG, pc_isa8_cards, nullptr, false)
- MCFG_DEVICE_ADD("isa3", ISA8_SLOT, 0, ISA_BUS_TAG, pc_isa8_cards, nullptr, false)
+ ISA8_SLOT(config, "isa1", 0, ISA_BUS_TAG, pc_isa8_cards, nullptr, false); // FIXME: determine ISA clock
+ ISA8_SLOT(config, "isa2", 0, ISA_BUS_TAG, pc_isa8_cards, nullptr, false);
+ ISA8_SLOT(config, "isa3", 0, ISA_BUS_TAG, pc_isa8_cards, nullptr, false);
// internal ram
RAM(config, RAM_TAG).set_default_size("512K").set_extra_options("544K,576K,608K,640K");
// software list
- MCFG_SOFTWARE_LIST_ADD("flop_list", "pc1512_flop")
- MCFG_SOFTWARE_LIST_ADD("hdd_list", "pc1512_hdd")
-MACHINE_CONFIG_END
+ SOFTWARE_LIST(config, "flop_list").set_original("pc1512_flop");
+ SOFTWARE_LIST(config, "hdd_list").set_original("pc1512_hdd");
+}
//-------------------------------------------------
-// MACHINE_CONFIG( pc1512dd )
+// machine_config( pc1512dd )
//-------------------------------------------------
-MACHINE_CONFIG_START(pc1512_state::pc1512dd)
+void pc1512_state::pc1512dd(machine_config &config)
+{
pc1512(config);
- MCFG_DEVICE_MODIFY(PC_FDC_XT_TAG ":1")
- MCFG_SLOT_DEFAULT_OPTION("525dd")
-MACHINE_CONFIG_END
+ subdevice<floppy_connector>(PC_FDC_XT_TAG ":1")->set_default_option("525dd");
+}
//-------------------------------------------------
-// MACHINE_CONFIG( pc1512hd )
+// machine_config( pc1512hd )
//-------------------------------------------------
-MACHINE_CONFIG_START(pc1512_state::pc1512hd)
+void pc1512_state::pc1512hd(machine_config &config)
+{
pc1512(config);
- MCFG_DEVICE_MODIFY("isa1")
- //MCFG_SLOT_DEFAULT_OPTION("wdxt_gen")
- MCFG_SLOT_DEFAULT_OPTION("hdc")
-MACHINE_CONFIG_END
+ //subdevice<isa8_slot_device>("isa1")->set_default_option("wdxt_gen");
+ subdevice<isa8_slot_device>("isa1")->set_default_option("hdc");
+}
//-------------------------------------------------
-// MACHINE_CONFIG( pc1640 )
+// machine_config( pc1640 )
//-------------------------------------------------
-MACHINE_CONFIG_START(pc1640_state::pc1640)
- MCFG_DEVICE_ADD(I8086_TAG, I8086, 24_MHz_XTAL / 3)
- MCFG_DEVICE_PROGRAM_MAP(pc1640_mem)
- MCFG_DEVICE_IO_MAP(pc1640_io)
- MCFG_DEVICE_IRQ_ACKNOWLEDGE_DEVICE(I8259A2_TAG, pic8259_device, inta_cb)
+void pc1640_state::pc1640(machine_config &config)
+{
+ I8086(config, m_maincpu, 24_MHz_XTAL / 3);
+ m_maincpu->set_addrmap(AS_PROGRAM, &pc1640_state::pc1640_mem);
+ m_maincpu->set_addrmap(AS_IO, &pc1640_state::pc1640_io);
+ m_maincpu->set_irq_acknowledge_callback(I8259A2_TAG, FUNC(pic8259_device::inta_cb));
// sound
SPEAKER(config, "mono").front_center();
@@ -1304,11 +1309,11 @@ MACHINE_CONFIG_START(pc1640_state::pc1640)
m_kb->clock_wr_callback().set(FUNC(pc1512_base_state::kbclk_w));
m_kb->data_wr_callback().set(FUNC(pc1512_base_state::kbdata_w));
- MCFG_PC1512_MOUSE_PORT_ADD(PC1512_MOUSE_PORT_TAG, pc1512_mouse_port_devices, "mouse")
- MCFG_PC1512_MOUSE_PORT_X_CB(WRITE8(*this, pc1512_base_state, mouse_x_w))
- MCFG_PC1512_MOUSE_PORT_Y_CB(WRITE8(*this, pc1512_base_state, mouse_y_w))
- MCFG_PC1512_MOUSE_PORT_M1_CB(WRITELINE(PC1512_KEYBOARD_TAG, pc1512_keyboard_device, m1_w))
- MCFG_PC1512_MOUSE_PORT_M2_CB(WRITELINE(PC1512_KEYBOARD_TAG, pc1512_keyboard_device, m2_w))
+ pc1512_mouse_port_device &mouse(PC1512_MOUSE_PORT(config, PC1512_MOUSE_PORT_TAG, pc1512_mouse_port_devices, "mouse"));
+ mouse.x_wr_callback().set(FUNC(pc1512_base_state::mouse_x_w));
+ mouse.y_wr_callback().set(FUNC(pc1512_base_state::mouse_y_w));
+ mouse.m1_wr_callback().set(m_kb, FUNC(pc1512_keyboard_device::m1_w));
+ mouse.m2_wr_callback().set(m_kb, FUNC(pc1512_keyboard_device::m2_w));
AM9517A(config, m_dmac, 24_MHz_XTAL / 6);
m_dmac->out_hreq_callback().set(FUNC(pc1640_state::hrq_w));
@@ -1344,8 +1349,8 @@ MACHINE_CONFIG_START(pc1640_state::pc1640)
PC_FDC_XT(config, m_fdc, 0);
m_fdc->intrq_wr_callback().set(FUNC(pc1512_base_state::fdc_int_w));
m_fdc->drq_wr_callback().set(FUNC(pc1512_base_state::fdc_drq_w));
- MCFG_FLOPPY_DRIVE_ADD(PC_FDC_XT_TAG ":0", pc1512_floppies, "525dd", pc1512_base_state::floppy_formats)
- MCFG_FLOPPY_DRIVE_ADD(PC_FDC_XT_TAG ":1", pc1512_floppies, nullptr, pc1512_base_state::floppy_formats)
+ FLOPPY_CONNECTOR(config, PC_FDC_XT_TAG ":0", pc1512_floppies, "525dd", pc1512_base_state::floppy_formats);
+ FLOPPY_CONNECTOR(config, PC_FDC_XT_TAG ":1", pc1512_floppies, nullptr, pc1512_base_state::floppy_formats);
INS8250(config, m_uart, 1.8432_MHz_XTAL);
m_uart->out_tx_callback().set(RS232_TAG, FUNC(rs232_port_device::write_txd));
@@ -1353,13 +1358,15 @@ MACHINE_CONFIG_START(pc1640_state::pc1640)
m_uart->out_rts_callback().set(RS232_TAG, FUNC(rs232_port_device::write_rts));
m_uart->out_int_callback().set(m_pic, FUNC(pic8259_device::ir4_w));
- MCFG_DEVICE_ADD(m_centronics, CENTRONICS, centronics_devices, "printer")
- MCFG_CENTRONICS_ACK_HANDLER(WRITELINE(*this, pc1512_base_state, write_centronics_ack))
- MCFG_CENTRONICS_BUSY_HANDLER(WRITELINE(*this, pc1512_base_state, write_centronics_busy))
- MCFG_CENTRONICS_PERROR_HANDLER(WRITELINE(*this, pc1512_base_state, write_centronics_perror))
- MCFG_CENTRONICS_SELECT_HANDLER(WRITELINE(*this, pc1512_base_state, write_centronics_select))
- MCFG_CENTRONICS_FAULT_HANDLER(WRITELINE(*this, pc1512_base_state, write_centronics_fault))
- MCFG_CENTRONICS_OUTPUT_LATCH_ADD("cent_data_out", CENTRONICS_TAG)
+ CENTRONICS(config, m_centronics, centronics_devices, "printer");
+ m_centronics->ack_handler().set(FUNC(pc1512_state::write_centronics_ack));
+ m_centronics->busy_handler().set(FUNC(pc1512_state::write_centronics_busy));
+ m_centronics->perror_handler().set(FUNC(pc1512_state::write_centronics_perror));
+ m_centronics->select_handler().set(FUNC(pc1512_state::write_centronics_select));
+ m_centronics->fault_handler().set(FUNC(pc1512_state::write_centronics_fault));
+
+ OUTPUT_LATCH(config, m_cent_data_out);
+ m_centronics->set_output_latch(*m_cent_data_out);
rs232_port_device &rs232(RS232_PORT(config, RS232_TAG, default_rs232_devices, nullptr));
rs232.rxd_handler().set(m_uart, FUNC(ins8250_uart_device::rx_w));
@@ -1370,7 +1377,8 @@ MACHINE_CONFIG_START(pc1640_state::pc1640)
// ISA8 bus
isa8_device &isa(ISA8(config, ISA_BUS_TAG, 0));
- isa.set_cputag(I8086_TAG);
+ isa.set_memspace(m_maincpu, AS_PROGRAM);
+ isa.set_iospace(m_maincpu, AS_IO);
isa.irq2_callback().set(m_pic, FUNC(pic8259_device::ir2_w));
isa.irq3_callback().set(m_pic, FUNC(pic8259_device::ir3_w));
isa.irq4_callback().set(m_pic, FUNC(pic8259_device::ir4_w));
@@ -1380,42 +1388,42 @@ MACHINE_CONFIG_START(pc1640_state::pc1640)
isa.drq1_callback().set(I8237A5_TAG, FUNC(am9517a_device::dreq1_w));
isa.drq2_callback().set(I8237A5_TAG, FUNC(am9517a_device::dreq2_w));
isa.drq3_callback().set(I8237A5_TAG, FUNC(am9517a_device::dreq3_w));
- MCFG_DEVICE_ADD("isa1", ISA8_SLOT, 0, ISA_BUS_TAG, pc_isa8_cards, nullptr, false) // FIXME: determine ISA bus clock
- MCFG_DEVICE_ADD("isa2", ISA8_SLOT, 0, ISA_BUS_TAG, pc_isa8_cards, nullptr, false)
- MCFG_DEVICE_ADD("isa3", ISA8_SLOT, 0, ISA_BUS_TAG, pc_isa8_cards, nullptr, false)
- MCFG_DEVICE_ADD("isa4", ISA8_SLOT, 0, ISA_BUS_TAG, pc_isa8_cards, nullptr, false)
- MCFG_DEVICE_ADD("isa5", ISA8_SLOT, 0, ISA_BUS_TAG, pc1640_isa8_cards, "iga", false)
+ ISA8_SLOT(config, "isa1", 0, ISA_BUS_TAG, pc_isa8_cards, nullptr, false); // FIXME: determine ISA bus clock
+ ISA8_SLOT(config, "isa2", 0, ISA_BUS_TAG, pc_isa8_cards, nullptr, false);
+ ISA8_SLOT(config, "isa3", 0, ISA_BUS_TAG, pc_isa8_cards, nullptr, false);
+ ISA8_SLOT(config, "isa4", 0, ISA_BUS_TAG, pc_isa8_cards, nullptr, false);
+ ISA8_SLOT(config, "isa5", 0, ISA_BUS_TAG, pc1640_isa8_cards, "iga", false);
// internal ram
RAM(config, RAM_TAG).set_default_size("640K");
// software list
- MCFG_SOFTWARE_LIST_ADD("flop_list", "pc1640_flop")
- MCFG_SOFTWARE_LIST_ADD("hdd_list", "pc1640_hdd")
-MACHINE_CONFIG_END
+ SOFTWARE_LIST(config, "flop_list").set_original("pc1640_flop");
+ SOFTWARE_LIST(config, "hdd_list").set_original("pc1640_hdd");
+}
//-------------------------------------------------
-// MACHINE_CONFIG( pc1640dd )
+// machine_config( pc1640dd )
//-------------------------------------------------
-MACHINE_CONFIG_START(pc1640_state::pc1640dd)
+void pc1640_state::pc1640dd(machine_config &config)
+{
pc1640(config);
- MCFG_DEVICE_MODIFY(PC_FDC_XT_TAG ":1")
- MCFG_SLOT_DEFAULT_OPTION("525dd")
-MACHINE_CONFIG_END
+ subdevice<floppy_connector>(PC_FDC_XT_TAG ":1")->set_default_option("525dd");
+}
//-------------------------------------------------
-// MACHINE_CONFIG( pc1640hd )
+// machine_config( pc1640hd )
//-------------------------------------------------
-MACHINE_CONFIG_START(pc1640_state::pc1640hd)
+void pc1640_state::pc1640hd(machine_config &config)
+{
pc1640(config);
- MCFG_DEVICE_MODIFY("isa1")
- //MCFG_SLOT_DEFAULT_OPTION("wdxt_gen")
- MCFG_SLOT_DEFAULT_OPTION("hdc")
-MACHINE_CONFIG_END
+ //subdevice<isa8_slot_device>("isa1")->set_default_option("wdxt_gen");
+ subdevice<isa8_slot_device>("isa1")->set_default_option("hdc");
+}
diff --git a/src/mame/drivers/pc2000.cpp b/src/mame/drivers/pc2000.cpp
index 0cf410cf845..9f111f5e8b3 100644
--- a/src/mame/drivers/pc2000.cpp
+++ b/src/mame/drivers/pc2000.cpp
@@ -957,7 +957,7 @@ void gl3000s_state::gl3000s(machine_config &config)
SOFTWARE_LIST(config, "gl2000_cart").set_compatible("gl2000");
SOFTWARE_LIST(config, "misterx_cart").set_compatible("misterx");
-MACHINE_CONFIG_END
+}
void gl4004_state::gl4000(machine_config &config)
{
diff --git a/src/mame/drivers/pc4.cpp b/src/mame/drivers/pc4.cpp
index a2661b1aa1c..ffdfd572770 100644
--- a/src/mame/drivers/pc4.cpp
+++ b/src/mame/drivers/pc4.cpp
@@ -217,19 +217,20 @@ void pc4_state::machine_start()
m_blink = 0;
}
-MACHINE_CONFIG_START(pc4_state::pc4)
+void pc4_state::pc4(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, XTAL(4'000'000))
- MCFG_DEVICE_PROGRAM_MAP(pc4_mem)
- MCFG_DEVICE_IO_MAP(pc4_io)
+ Z80(config, m_maincpu, XTAL(4'000'000));
+ m_maincpu->set_addrmap(AS_PROGRAM, &pc4_state::pc4_mem);
+ m_maincpu->set_addrmap(AS_IO, &pc4_state::pc4_io);
/* video hardware */
- MCFG_SCREEN_ADD("screen", LCD)
- MCFG_SCREEN_REFRESH_RATE(72)
- MCFG_SCREEN_UPDATE_DRIVER(pc4_state, screen_update)
- MCFG_SCREEN_SIZE(240, 36)
- MCFG_SCREEN_VISIBLE_AREA(0, 240-1, 0, 36-1)
- MCFG_SCREEN_PALETTE("palette")
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_LCD));
+ screen.set_refresh_hz(72);
+ screen.set_screen_update(FUNC(pc4_state::screen_update));
+ screen.set_size(240, 36);
+ screen.set_visarea(0, 240-1, 0, 36-1);
+ screen.set_palette("palette");
PALETTE(config, "palette", FUNC(pc4_state::pc4_palette), 2);
GFXDECODE(config, "gfxdecode", "palette", gfx_pc4);
@@ -239,7 +240,7 @@ MACHINE_CONFIG_START(pc4_state::pc4)
BEEP(config, m_beep, 3250).add_route(ALL_OUTPUTS, "mono", 1.00);
RP5C01(config, "rtc", XTAL(32'768));
-MACHINE_CONFIG_END
+}
ROM_START( pc4 )
ROM_REGION( 0x20000, "maincpu", 0 )
diff --git a/src/mame/drivers/pc6001.cpp b/src/mame/drivers/pc6001.cpp
index 8ce0970755b..38fcea1268d 100644
--- a/src/mame/drivers/pc6001.cpp
+++ b/src/mame/drivers/pc6001.cpp
@@ -1287,8 +1287,7 @@ TIMER_DEVICE_CALLBACK_MEMBER(pc6001_state::cassette_callback)
else
cas_data_i>>=1;
#else
- address_space &space = m_maincpu->space(AS_PROGRAM);
- m_cur_keycode = m_cas_hack->read_rom(space, m_cas_offset++);
+ m_cur_keycode = m_cas_hack->read_rom(m_cas_offset++);
popmessage("%04x %04x", m_cas_offset, m_cas_maxsize);
if(m_cas_offset > m_cas_maxsize)
{
@@ -1350,7 +1349,7 @@ void pc6001_state::machine_reset()
set_videoram_bank(0xc000);
if (m_cart->exists())
- m_maincpu->space(AS_PROGRAM).install_read_handler(0x4000, 0x5fff, read8_delegate(FUNC(generic_slot_device::read_rom),(generic_slot_device*)m_cart));
+ m_maincpu->space(AS_PROGRAM).install_read_handler(0x4000, 0x5fff, read8sm_delegate(FUNC(generic_slot_device::read_rom),(generic_slot_device*)m_cart));
std::string region_tag;
m_cart_rom = memregion(region_tag.assign(m_cart->tag()).append(GENERIC_ROM_REGION_TAG).c_str());
@@ -1440,16 +1439,6 @@ void pc6001sr_state::machine_reset()
}
-#if 0
-static const cassette_interface pc6001_cassette_interface =
-{
- pc6001_cassette_formats,
- nullptr,
- (cassette_state)(CASSETTE_STOPPED | CASSETTE_MOTOR_DISABLED | CASSETTE_SPEAKER_ENABLED),
- nullptr
-};
-#endif
-
static const gfx_layout char_layout =
{
8, 16,
@@ -1481,25 +1470,26 @@ GFXDECODE_END
#define PC6001_MAIN_CLOCK 7987200
-MACHINE_CONFIG_START(pc6001_state::pc6001)
+void pc6001_state::pc6001(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu",Z80, PC6001_MAIN_CLOCK / 2) // PD 780C-1, ~4 Mhz
- MCFG_DEVICE_PROGRAM_MAP(pc6001_map)
- MCFG_DEVICE_IO_MAP(pc6001_io)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", pc6001_state, vrtc_irq)
- MCFG_DEVICE_IRQ_ACKNOWLEDGE_DRIVER(pc6001_state, irq_callback)
+ Z80(config, m_maincpu, PC6001_MAIN_CLOCK / 2); // PD 780C-1, ~4 Mhz
+ m_maincpu->set_addrmap(AS_PROGRAM, &pc6001_state::pc6001_map);
+ m_maincpu->set_addrmap(AS_IO, &pc6001_state::pc6001_io);
+ m_maincpu->set_vblank_int("screen", FUNC(pc6001_state::vrtc_irq));
+ m_maincpu->set_irq_acknowledge_callback(FUNC(pc6001_state::irq_callback));
-// MCFG_DEVICE_ADD("subcpu", I8049, 7987200)
+// I8049(config, "subcpu", 7987200);
GFXDECODE(config, "gfxdecode", m_palette, gfx_pc6001m2);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_UPDATE_DRIVER(pc6001_state, screen_update_pc6001)
- MCFG_SCREEN_SIZE(320, 25+192+26)
- MCFG_SCREEN_VISIBLE_AREA(0, 319, 0, 239)
- MCFG_SCREEN_PALETTE(m_palette)
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_refresh_hz(60);
+ m_screen->set_screen_update(FUNC(pc6001_state::screen_update_pc6001));
+ m_screen->set_size(320, 25+192+26);
+ m_screen->set_visarea(0, 319, 0, 239);
+ m_screen->set_palette(m_palette);
PALETTE(config, m_palette, FUNC(pc6001_state::pc6001_palette), 16+4);
@@ -1512,13 +1502,14 @@ MACHINE_CONFIG_START(pc6001_state::pc6001)
m_ppi->out_pc_callback().set(FUNC(pc6001_state::ppi_portc_w));
/* uart */
- MCFG_DEVICE_ADD("uart", I8251, 0)
+ I8251(config, "uart", 0);
- MCFG_GENERIC_CARTSLOT_ADD("cartslot", generic_plain_slot, "pc6001_cart")
+ GENERIC_CARTSLOT(config, m_cart, generic_plain_slot, "pc6001_cart");
-// MCFG_CASSETTE_ADD("cassette", pc6001_cassette_interface)
- MCFG_GENERIC_CARTSLOT_ADD("cas_hack", generic_plain_slot, "pc6001_cass")
- MCFG_GENERIC_EXTENSIONS("cas,p6")
+// CASSETTE(config, m_cassette);
+// m_cassette->set_formats(pc6001_cassette_formats);
+// m_cassette->set_default_state(CASSETTE_STOPPED | CASSETTE_MOTOR_DISABLED | CASSETTE_SPEAKER_ENABLED);
+ GENERIC_CARTSLOT(config, m_cas_hack, generic_plain_slot, "pc6001_cass", "cas,p6");
SPEAKER(config, "mono").front_center();
ay8910_device &ay8910(AY8910(config, "ay8910", PC6001_MAIN_CLOCK/4));
@@ -1528,61 +1519,59 @@ MACHINE_CONFIG_START(pc6001_state::pc6001)
// WAVE(config, "wave", "cassette").add_route(ALL_OUTPUTS, "mono", 0.25);
/* TODO: accurate timing on this */
- MCFG_TIMER_DRIVER_ADD_PERIODIC("keyboard_timer", pc6001_state, keyboard_callback, attotime::from_hz(250))
- MCFG_TIMER_DRIVER_ADD_PERIODIC("cassette_timer", pc6001_state, cassette_callback, attotime::from_hz(1200/12))
-MACHINE_CONFIG_END
+ TIMER(config, "keyboard_timer").configure_periodic(FUNC(pc6001_state::keyboard_callback), attotime::from_hz(250));
+ TIMER(config, "cassette_timer").configure_periodic(FUNC(pc6001_state::cassette_callback), attotime::from_hz(1200/12));
+}
-MACHINE_CONFIG_START(pc6001mk2_state::pc6001mk2)
+void pc6001mk2_state::pc6001mk2(machine_config &config)
+{
pc6001(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(pc6001mk2_map)
- MCFG_DEVICE_IO_MAP(pc6001mk2_io)
+ m_maincpu->set_addrmap(AS_PROGRAM, &pc6001mk2_state::pc6001mk2_map);
+ m_maincpu->set_addrmap(AS_IO, &pc6001mk2_state::pc6001mk2_io);
// MCFG_MACHINE_RESET_OVERRIDE(pc6001mk2_state,pc6001mk2)
- MCFG_SCREEN_MODIFY("screen")
- MCFG_SCREEN_UPDATE_DRIVER(pc6001mk2_state, screen_update_pc6001mk2)
+ m_screen->set_screen_update(FUNC(pc6001mk2_state::screen_update_pc6001mk2));
m_palette->set_entries(16+16);
m_palette->set_init(FUNC(pc6001mk2_state::pc6001mk2_palette));
- MCFG_GFXDECODE_MODIFY("gfxdecode", gfx_pc6001m2)
-
- MCFG_DEVICE_ADD("upd7752", UPD7752, PC6001_MAIN_CLOCK/4)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.00)
+ subdevice<gfxdecode_device>("gfxdecode")->set_info(gfx_pc6001m2);
-MACHINE_CONFIG_END
+ UPD7752(config, "upd7752", PC6001_MAIN_CLOCK/4).add_route(ALL_OUTPUTS, "mono", 1.00);
+}
-MACHINE_CONFIG_START(pc6601_state::pc6601)
+void pc6601_state::pc6601(machine_config &config)
+{
pc6001mk2(config);
/* basic machine hardware */
- MCFG_DEVICE_REPLACE("maincpu", Z80, PC6001_MAIN_CLOCK / 2)
- MCFG_DEVICE_PROGRAM_MAP(pc6001mk2_map)
- MCFG_DEVICE_IO_MAP(pc6601_io)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", pc6001_state, vrtc_irq)
- MCFG_DEVICE_IRQ_ACKNOWLEDGE_DRIVER(pc6001_state, irq_callback)
-MACHINE_CONFIG_END
-
-MACHINE_CONFIG_START(pc6001sr_state::pc6001sr)
+ Z80(config.replace(), m_maincpu, PC6001_MAIN_CLOCK / 2);
+ m_maincpu->set_addrmap(AS_PROGRAM, &pc6601_state::pc6001mk2_map);
+ m_maincpu->set_addrmap(AS_IO, &pc6601_state::pc6601_io);
+ m_maincpu->set_vblank_int("screen", FUNC(pc6001_state::vrtc_irq));
+ m_maincpu->set_irq_acknowledge_callback(FUNC(pc6001_state::irq_callback));
+}
+
+void pc6001sr_state::pc6001sr(machine_config &config)
+{
pc6001mk2(config);
/* basic machine hardware */
//*Yes*, PC-6001 SR Z80 CPU is actually slower than older models (better waitstates tho?)
- MCFG_DEVICE_REPLACE("maincpu", Z80, XTAL(3'579'545))
- MCFG_DEVICE_PROGRAM_MAP(pc6001sr_map)
- MCFG_DEVICE_IO_MAP(pc6001sr_io)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", pc6001sr_state, sr_vrtc_irq)
- MCFG_DEVICE_IRQ_ACKNOWLEDGE_DRIVER(pc6001_state, irq_callback)
+ Z80(config.replace(), m_maincpu, XTAL(3'579'545));
+ m_maincpu->set_addrmap(AS_PROGRAM, &pc6001sr_state::pc6001sr_map);
+ m_maincpu->set_addrmap(AS_IO, &pc6001sr_state::pc6001sr_io);
+ m_maincpu->set_vblank_int("screen", FUNC(pc6001sr_state::sr_vrtc_irq));
+ m_maincpu->set_irq_acknowledge_callback(FUNC(pc6001_state::irq_callback));
// MCFG_MACHINE_RESET_OVERRIDE(pc6001sr_state,pc6001sr)
- MCFG_SCREEN_MODIFY("screen")
- MCFG_SCREEN_UPDATE_DRIVER(pc6001sr_state, screen_update_pc6001sr)
-MACHINE_CONFIG_END
+ m_screen->set_screen_update(FUNC(pc6001sr_state::screen_update_pc6001sr));
+}
/* ROM definition */
ROM_START( pc6001 )
diff --git a/src/mame/drivers/pc8001.cpp b/src/mame/drivers/pc8001.cpp
index acbdbed71b0..c13e1f13755 100644
--- a/src/mame/drivers/pc8001.cpp
+++ b/src/mame/drivers/pc8001.cpp
@@ -479,99 +479,101 @@ void pc8001_state::machine_start()
/* Machine Drivers */
-MACHINE_CONFIG_START(pc8001_state::pc8001)
+void pc8001_state::pc8001(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD(Z80_TAG, Z80, XTAL(4'000'000))
- MCFG_DEVICE_PROGRAM_MAP(pc8001_mem)
- MCFG_DEVICE_IO_MAP(pc8001_io)
+ Z80(config, m_maincpu, XTAL(4'000'000));
+ m_maincpu->set_addrmap(AS_PROGRAM, &pc8001_state::pc8001_mem);
+ m_maincpu->set_addrmap(AS_IO, &pc8001_state::pc8001_io);
/* video hardware */
- MCFG_SCREEN_ADD(SCREEN_TAG, RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_UPDATE_DEVICE(UPD3301_TAG, upd3301_device, screen_update)
- MCFG_SCREEN_SIZE(640, 220)
- MCFG_SCREEN_VISIBLE_AREA(0, 640-1, 0, 200-1)
+ screen_device &screen(SCREEN(config, SCREEN_TAG, SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_screen_update(UPD3301_TAG, FUNC(upd3301_device::screen_update));
+ screen.set_size(640, 220);
+ screen.set_visarea(0, 640-1, 0, 200-1);
/* sound hardware */
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("beeper", BEEP, 2000)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25)
+ BEEP(config, m_beep, 2000).add_route(ALL_OUTPUTS, "mono", 0.25);
/* devices */
- MCFG_DEVICE_ADD(I8251_TAG, I8251, 0)
+ I8251(config, I8251_TAG, 0);
- MCFG_DEVICE_ADD(I8255A_TAG, I8255A, 0)
+ I8255A(config, I8255A_TAG, 0);
I8257(config, m_dma, XTAL(4'000'000));
m_dma->out_hrq_cb().set(FUNC(pc8001_state::hrq_w));
m_dma->in_memr_cb().set(FUNC(pc8001_state::dma_mem_r));
- m_dma->out_iow_cb<2>().set(UPD3301_TAG, FUNC(upd3301_device::dack_w));
+ m_dma->out_iow_cb<2>().set(m_crtc, FUNC(upd3301_device::dack_w));
UPD1990A(config, m_rtc);
- MCFG_DEVICE_ADD(UPD3301_TAG, UPD3301, XTAL(14'318'181))
- MCFG_UPD3301_CHARACTER_WIDTH(8)
- MCFG_UPD3301_DRAW_CHARACTER_CALLBACK_OWNER(pc8001_state, pc8001_display_pixels)
- MCFG_UPD3301_DRQ_CALLBACK(WRITELINE(m_dma, i8257_device, dreq2_w))
- MCFG_VIDEO_SET_SCREEN(SCREEN_TAG)
+ UPD3301(config, m_crtc, XTAL(14'318'181));
+ m_crtc->set_character_width(8);
+ m_crtc->set_display_callback(FUNC(pc8001_state::pc8001_display_pixels), this);
+ m_crtc->drq_wr_callback().set(m_dma, FUNC(i8257_device::dreq2_w));
+ m_crtc->set_screen(SCREEN_TAG);
- MCFG_DEVICE_ADD(m_centronics, CENTRONICS, centronics_devices, "printer")
- MCFG_CENTRONICS_ACK_HANDLER(WRITELINE(*this, pc8001_state, write_centronics_ack))
- MCFG_CENTRONICS_BUSY_HANDLER(WRITELINE(*this, pc8001_state, write_centronics_busy))
+ CENTRONICS(config, m_centronics, centronics_devices, "printer");
+ m_centronics->ack_handler().set(FUNC(pc8001_state::write_centronics_ack));
+ m_centronics->busy_handler().set(FUNC(pc8001_state::write_centronics_busy));
- MCFG_CENTRONICS_OUTPUT_LATCH_ADD("cent_data_out", CENTRONICS_TAG)
+ OUTPUT_LATCH(config, m_cent_data_out);
+ m_centronics->set_output_latch(*m_cent_data_out);
- MCFG_CASSETTE_ADD("cassette")
- MCFG_CASSETTE_DEFAULT_STATE(CASSETTE_STOPPED | CASSETTE_MOTOR_ENABLED | CASSETTE_SPEAKER_MUTED)
+ CASSETTE(config, m_cassette);
+ m_cassette->set_default_state(CASSETTE_STOPPED | CASSETTE_MOTOR_ENABLED | CASSETTE_SPEAKER_MUTED);
RAM(config, RAM_TAG).set_default_size("16K").set_extra_options("32K,64K");
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(pc8001mk2_state::pc8001mk2)
+void pc8001mk2_state::pc8001mk2(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD(Z80_TAG, Z80, XTAL(4'000'000))
- MCFG_DEVICE_PROGRAM_MAP(pc8001mk2_mem)
- MCFG_DEVICE_IO_MAP(pc8001mk2_io)
+ Z80(config, m_maincpu, XTAL(4'000'000));
+ m_maincpu->set_addrmap(AS_PROGRAM, &pc8001mk2_state::pc8001mk2_mem);
+ m_maincpu->set_addrmap(AS_IO, &pc8001mk2_state::pc8001mk2_io);
/* video hardware */
- MCFG_SCREEN_ADD(SCREEN_TAG, RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_UPDATE_DEVICE(UPD3301_TAG, upd3301_device, screen_update)
- MCFG_SCREEN_SIZE(640, 220)
- MCFG_SCREEN_VISIBLE_AREA(0, 640-1, 0, 200-1)
+ screen_device &screen(SCREEN(config, SCREEN_TAG, SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_screen_update(UPD3301_TAG, FUNC(upd3301_device::screen_update));
+ screen.set_size(640, 220);
+ screen.set_visarea(0, 640-1, 0, 200-1);
/* sound hardware */
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("beeper", BEEP, 2000)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25)
+ BEEP(config, m_beep, 2000).add_route(ALL_OUTPUTS, "mono", 0.25);
/* devices */
- MCFG_DEVICE_ADD(I8251_TAG, I8251, 0)
+ I8251(config, I8251_TAG, 0);
- MCFG_DEVICE_ADD(I8255A_TAG, I8255A, 0)
+ I8255A(config, I8255A_TAG, 0);
I8257(config, m_dma, XTAL(4'000'000));
m_dma->out_hrq_cb().set(FUNC(pc8001_state::hrq_w));
m_dma->in_memr_cb().set(FUNC(pc8001_state::dma_mem_r));
- m_dma->out_iow_cb<2>().set(UPD3301_TAG, FUNC(upd3301_device::dack_w));
+ m_dma->out_iow_cb<2>().set(m_crtc, FUNC(upd3301_device::dack_w));
UPD1990A(config, m_rtc);
- MCFG_DEVICE_ADD(UPD3301_TAG, UPD3301, XTAL(14'318'181))
- MCFG_UPD3301_CHARACTER_WIDTH(8)
- MCFG_UPD3301_DRAW_CHARACTER_CALLBACK_OWNER(pc8001_state, pc8001_display_pixels)
- MCFG_UPD3301_DRQ_CALLBACK(WRITELINE(m_dma, i8257_device, dreq2_w))
- MCFG_VIDEO_SET_SCREEN(SCREEN_TAG)
+ UPD3301(config, m_crtc, XTAL(14'318'181));
+ m_crtc->set_character_width(8);
+ m_crtc->set_display_callback(FUNC(pc8001_state::pc8001_display_pixels), this);
+ m_crtc->drq_wr_callback().set(m_dma, FUNC(i8257_device::dreq2_w));
+ m_crtc->set_screen(SCREEN_TAG);
- MCFG_DEVICE_ADD(m_centronics, CENTRONICS, centronics_devices, "printer")
+ CENTRONICS(config, m_centronics, centronics_devices, "printer");
- MCFG_CENTRONICS_OUTPUT_LATCH_ADD("cent_data_out", CENTRONICS_TAG)
+ OUTPUT_LATCH(config, m_cent_data_out);
+ m_centronics->set_output_latch(*m_cent_data_out);
- MCFG_CASSETTE_ADD("cassette")
- MCFG_CASSETTE_DEFAULT_STATE(CASSETTE_STOPPED | CASSETTE_MOTOR_ENABLED | CASSETTE_SPEAKER_MUTED)
+ CASSETTE(config, m_cassette);
+ m_cassette->set_default_state(CASSETTE_STOPPED | CASSETTE_MOTOR_ENABLED | CASSETTE_SPEAKER_MUTED);
RAM(config, RAM_TAG).set_default_size("64K");
-MACHINE_CONFIG_END
+}
/* ROMs */
diff --git a/src/mame/drivers/pc8401a.cpp b/src/mame/drivers/pc8401a.cpp
index aa97d5b96c9..7de2b1b5d45 100644
--- a/src/mame/drivers/pc8401a.cpp
+++ b/src/mame/drivers/pc8401a.cpp
@@ -267,7 +267,7 @@ WRITE8_MEMBER( pc8401a_state::rtc_ctrl_w )
READ8_MEMBER( pc8401a_state::io_rom_data_r )
{
//logerror("I/O ROM read from %05x\n", m_io_addr);
- return m_io_cart->read_rom(space, m_io_addr);
+ return m_io_cart->read_rom(m_io_addr);
}
WRITE8_MEMBER( pc8401a_state::io_rom_addr_w )
@@ -570,14 +570,15 @@ WRITE8_MEMBER( pc8401a_state::ppi_pc_w )
/* Machine Drivers */
-MACHINE_CONFIG_START(pc8401a_state::pc8401a)
+void pc8401a_state::pc8401a(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD(Z80_TAG, Z80, 4000000) // NEC uPD70008C
- MCFG_DEVICE_PROGRAM_MAP(pc8401a_mem)
- MCFG_DEVICE_IO_MAP(pc8401a_io)
+ Z80(config, m_maincpu, 4000000); // NEC uPD70008C
+ m_maincpu->set_addrmap(AS_PROGRAM, &pc8401a_state::pc8401a_mem);
+ m_maincpu->set_addrmap(AS_IO, &pc8401a_state::pc8401a_io);
/* fake keyboard */
- MCFG_TIMER_DRIVER_ADD_PERIODIC("keyboard", pc8401a_state, pc8401a_keyboard_tick, attotime::from_hz(64))
+ TIMER(config, "keyboard").configure_periodic(FUNC(pc8401a_state::pc8401a_keyboard_tick), attotime::from_hz(64));
/* devices */
UPD1990A(config, m_rtc);
@@ -599,25 +600,24 @@ MACHINE_CONFIG_START(pc8401a_state::pc8401a)
pc8401a_video(config);
/* option ROM cartridge */
- MCFG_GENERIC_CARTSLOT_ADD("cartslot", generic_plain_slot, nullptr)
- MCFG_GENERIC_EXTENSIONS("bin,rom")
+ GENERIC_CARTSLOT(config, m_cart, generic_plain_slot, nullptr, "bin,rom");
/* I/O ROM cartridge */
- MCFG_GENERIC_CARTSLOT_ADD("io_cart", generic_linear_slot, nullptr)
- MCFG_GENERIC_EXTENSIONS("bin,rom")
+ GENERIC_CARTSLOT(config, m_io_cart, generic_linear_slot, nullptr, "bin,rom");
/* internal ram */
RAM(config, RAM_TAG).set_default_size("64K").set_extra_options("96K");
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(pc8500_state::pc8500)
+void pc8500_state::pc8500(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD(Z80_TAG, Z80, 4000000) // NEC uPD70008C
- MCFG_DEVICE_PROGRAM_MAP(pc8401a_mem)
- MCFG_DEVICE_IO_MAP(pc8500_io)
+ Z80(config, m_maincpu, 4000000); // NEC uPD70008C
+ m_maincpu->set_addrmap(AS_PROGRAM, &pc8500_state::pc8401a_mem);
+ m_maincpu->set_addrmap(AS_IO, &pc8500_state::pc8500_io);
/* fake keyboard */
- MCFG_TIMER_DRIVER_ADD_PERIODIC("keyboard", pc8401a_state, pc8401a_keyboard_tick, attotime::from_hz(64))
+ TIMER(config, "keyboard").configure_periodic(FUNC(pc8401a_state::pc8401a_keyboard_tick), attotime::from_hz(64));
/* devices */
UPD1990A(config, m_rtc);
@@ -639,16 +639,14 @@ MACHINE_CONFIG_START(pc8500_state::pc8500)
pc8500_video(config);
/* option ROM cartridge */
- MCFG_GENERIC_CARTSLOT_ADD("cartslot", generic_plain_slot, nullptr)
- MCFG_GENERIC_EXTENSIONS("bin,rom")
+ GENERIC_CARTSLOT(config, m_cart, generic_plain_slot, nullptr, "bin,rom");
/* I/O ROM cartridge */
- MCFG_GENERIC_CARTSLOT_ADD("io_cart", generic_linear_slot, nullptr)
- MCFG_GENERIC_EXTENSIONS("bin,rom")
+ GENERIC_CARTSLOT(config, m_io_cart, generic_linear_slot, nullptr, "bin,rom");
/* internal ram */
RAM(config, RAM_TAG).set_default_size("64K").set_extra_options("96K");
-MACHINE_CONFIG_END
+}
/* ROMs */
diff --git a/src/mame/drivers/pc8801.cpp b/src/mame/drivers/pc8801.cpp
index 874ffa4b93d..327f2044fe4 100644
--- a/src/mame/drivers/pc8801.cpp
+++ b/src/mame/drivers/pc8801.cpp
@@ -1476,23 +1476,23 @@ WRITE8_MEMBER(pc8801_state::pc8801_rtc_w)
READ8_MEMBER(pc8801_state::pc8801_sound_board_r)
{
if(m_has_opna)
- return m_opna->read(space, offset);
+ return m_opna->read(offset);
- return (offset & 2) ? 0xff : m_opn->read(space, offset);
+ return (offset & 2) ? 0xff : m_opn->read(offset);
}
WRITE8_MEMBER(pc8801_state::pc8801_sound_board_w)
{
if(m_has_opna)
- m_opna->write(space, offset,data);
+ m_opna->write(offset,data);
else if((offset & 2) == 0)
- m_opn->write(space, offset, data);
+ m_opn->write(offset, data);
}
READ8_MEMBER(pc8801_state::pc8801_opna_r)
{
if(m_has_opna && (offset & 2) == 0)
- return m_opna->read(space, (offset & 1) | ((offset & 4) >> 1));
+ return m_opna->read((offset & 1) | ((offset & 4) >> 1));
return 0xff;
}
@@ -1500,7 +1500,7 @@ READ8_MEMBER(pc8801_state::pc8801_opna_r)
WRITE8_MEMBER(pc8801_state::pc8801_opna_w)
{
if(m_has_opna && (offset & 2) == 0)
- m_opna->write(space, (offset & 1) | ((offset & 4) >> 1),data);
+ m_opna->write((offset & 1) | ((offset & 4) >> 1),data);
else if(m_has_opna && offset == 2)
{
m_sound_irq_mask = ((data & 0x80) == 0);
@@ -2340,21 +2340,22 @@ WRITE_LINE_MEMBER( pc8801_state::rxrdy_w )
// ...
}
-MACHINE_CONFIG_START(pc8801_state::pc8801)
+void pc8801_state::pc8801(machine_config &config)
+{
/* main CPU */
- MCFG_DEVICE_ADD("maincpu", Z80, MASTER_CLOCK) /* 4 MHz */
- MCFG_DEVICE_PROGRAM_MAP(pc8801_mem)
- MCFG_DEVICE_IO_MAP(pc8801_io)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", pc8801_state, pc8801_vrtc_irq)
- MCFG_DEVICE_IRQ_ACKNOWLEDGE_DRIVER(pc8801_state,pc8801_irq_callback)
+ Z80(config, m_maincpu, MASTER_CLOCK); /* 4 MHz */
+ m_maincpu->set_addrmap(AS_PROGRAM, &pc8801_state::pc8801_mem);
+ m_maincpu->set_addrmap(AS_IO, &pc8801_state::pc8801_io);
+ m_maincpu->set_vblank_int("screen", FUNC(pc8801_state::pc8801_vrtc_irq));
+ m_maincpu->set_irq_acknowledge_callback(FUNC(pc8801_state::pc8801_irq_callback));
/* sub CPU(5 inch floppy drive) */
- MCFG_DEVICE_ADD(m_fdccpu, Z80, MASTER_CLOCK) /* 4 MHz */
- MCFG_DEVICE_PROGRAM_MAP(pc8801fdc_mem)
- MCFG_DEVICE_IO_MAP(pc8801fdc_io)
+ Z80(config, m_fdccpu, MASTER_CLOCK); /* 4 MHz */
+ m_fdccpu->set_addrmap(AS_PROGRAM, &pc8801_state::pc8801fdc_mem);
+ m_fdccpu->set_addrmap(AS_IO, &pc8801_state::pc8801fdc_io);
- //MCFG_QUANTUM_TIME(attotime::from_hz(300000))
- MCFG_QUANTUM_PERFECT_CPU("maincpu")
+ //config.m_minimum_quantum = attotime::from_hz(300000);
+ config.m_perfect_cpu_quantum = subtag("maincpu");
i8255_device &d8255_master(I8255(config, "d8255_master"));
d8255_master.in_pa_callback().set("d8255_slave", FUNC(i8255_device::pb_r));
@@ -2375,25 +2376,25 @@ MACHINE_CONFIG_START(pc8801_state::pc8801)
I8214(config, I8214_TAG, MASTER_CLOCK);
#endif
UPD1990A(config, m_rtc);
- //MCFG_CENTRONICS_ADD("centronics", centronics_devices, "printer")
- MCFG_CASSETTE_ADD("cassette")
- MCFG_CASSETTE_DEFAULT_STATE(CASSETTE_STOPPED | CASSETTE_MOTOR_ENABLED | CASSETTE_SPEAKER_MUTED)
+ //CENTRONICS(config, "centronics", centronics_devices, "printer");
+ CASSETTE(config, m_cassette);
+ m_cassette->set_default_state(CASSETTE_STOPPED | CASSETTE_MOTOR_ENABLED | CASSETTE_SPEAKER_MUTED);
- MCFG_SOFTWARE_LIST_ADD("tape_list","pc8801_cass")
+ SOFTWARE_LIST(config, "tape_list").set_original("pc8801_cass");
i8251_device &i8251(I8251(config, I8251_TAG, 0));
i8251.txd_handler().set(FUNC(pc8801_state::txdata_callback));
i8251.rts_handler().set(FUNC(pc8801_state::rxrdy_w));
- MCFG_FLOPPY_DRIVE_ADD("upd765:0", pc88_floppies, "525hd", floppy_image_device::default_floppy_formats)
- MCFG_FLOPPY_DRIVE_ADD("upd765:1", pc88_floppies, "525hd", floppy_image_device::default_floppy_formats)
- MCFG_SOFTWARE_LIST_ADD("disk_list","pc8801_flop")
+ FLOPPY_CONNECTOR(config, "upd765:0", pc88_floppies, "525hd", floppy_image_device::default_floppy_formats);
+ FLOPPY_CONNECTOR(config, "upd765:1", pc88_floppies, "525hd", floppy_image_device::default_floppy_formats);
+ SOFTWARE_LIST(config, "disk_list").set_original("pc8801_flop");
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_RAW_PARAMS(PIXEL_CLOCK_24KHz,848,0,640,448,0,400)
- MCFG_SCREEN_UPDATE_DRIVER(pc8801_state, screen_update)
- MCFG_SCREEN_PALETTE(m_palette)
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_raw(PIXEL_CLOCK_24KHz,848,0,640,448,0,400);
+ m_screen->set_screen_update(FUNC(pc8801_state::screen_update));
+ m_screen->set_palette(m_palette);
GFXDECODE(config, "gfxdecode", m_palette, gfx_pc8801);
PALETTE(config, m_palette, FUNC(pc8801_state::pc8801_palette), 0x10);
@@ -2414,26 +2415,28 @@ MACHINE_CONFIG_START(pc8801_state::pc8801)
m_opna->port_b_read_callback().set(FUNC(pc8801_state::opn_portb_r));
m_opna->add_route(ALL_OUTPUTS, "mono", 1.00);
- MCFG_DEVICE_ADD("beeper", BEEP, 2400)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.10)
+ BEEP(config, m_beeper, 2400).add_route(ALL_OUTPUTS, "mono", 0.10);
- MCFG_TIMER_DRIVER_ADD_PERIODIC("rtc_timer", pc8801_state, pc8801_rtc_irq, attotime::from_hz(600))
-MACHINE_CONFIG_END
+ TIMER(config, "rtc_timer").configure_periodic(FUNC(pc8801_state::pc8801_rtc_irq), attotime::from_hz(600));
+}
-MACHINE_CONFIG_START(pc8801_state::pc8801fh)
+void pc8801_state::pc8801fh(machine_config &config)
+{
pc8801(config);
MCFG_MACHINE_RESET_OVERRIDE(pc8801_state, pc8801_clock_speed )
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(pc8801_state::pc8801ma)
+void pc8801_state::pc8801ma(machine_config &config)
+{
pc8801(config);
MCFG_MACHINE_RESET_OVERRIDE(pc8801_state, pc8801_dic )
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(pc8801_state::pc8801mc)
+void pc8801_state::pc8801mc(machine_config &config)
+{
pc8801(config);
MCFG_MACHINE_RESET_OVERRIDE(pc8801_state, pc8801_cdrom )
-MACHINE_CONFIG_END
+}
/* TODO: clean this up */
diff --git a/src/mame/drivers/pc88va.cpp b/src/mame/drivers/pc88va.cpp
index 5906ed879ce..508edd48ccd 100644
--- a/src/mame/drivers/pc88va.cpp
+++ b/src/mame/drivers/pc88va.cpp
@@ -1585,31 +1585,31 @@ WRITE8_MEMBER(pc88va_state::dma_memw_cb)
}
-MACHINE_CONFIG_START(pc88va_state::pc88va)
-
- MCFG_DEVICE_ADD("maincpu", V30, 8000000) /* 8 MHz */
- MCFG_DEVICE_PROGRAM_MAP(pc88va_map)
- MCFG_DEVICE_IO_MAP(pc88va_io_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", pc88va_state, pc88va_vrtc_irq)
- MCFG_DEVICE_IRQ_ACKNOWLEDGE_DEVICE("pic8259_master", pic8259_device, inta_cb)
+void pc88va_state::pc88va(machine_config &config)
+{
+ V30(config, m_maincpu, 8000000); /* 8 MHz */
+ m_maincpu->set_addrmap(AS_PROGRAM, &pc88va_state::pc88va_map);
+ m_maincpu->set_addrmap(AS_IO, &pc88va_state::pc88va_io_map);
+ m_maincpu->set_vblank_int("screen", FUNC(pc88va_state::pc88va_vrtc_irq));
+ m_maincpu->set_irq_acknowledge_callback("pic8259_master", FUNC(pic8259_device::inta_cb));
#if TEST_SUBFDC
- MCFG_DEVICE_ADD("fdccpu", Z80, 8000000) /* 8 MHz */
- MCFG_DEVICE_PROGRAM_MAP(pc88va_z80_map)
- MCFG_DEVICE_IO_MAP(pc88va_z80_io_map)
+ z80_device &fdccpu(Z80(config, "fdccpu", 8000000)); /* 8 MHz */
+ fdccpu.set_addrmap(AS_PROGRAM, &pc88va_state::pc88va_z80_map);
+ fdccpu.set_addrmap(AS_IO, &pc88va_state::pc88va_z80_io_map);
- MCFG_QUANTUM_PERFECT_CPU("maincpu")
+ config.m_perfect_cpu_quantum = subtag("maincpu");
#endif
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_SIZE(640, 480)
- MCFG_SCREEN_VISIBLE_AREA(0, 640-1, 0, 200-1)
- MCFG_SCREEN_UPDATE_DRIVER(pc88va_state, screen_update_pc88va)
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_refresh_hz(60);
+ m_screen->set_size(640, 480);
+ m_screen->set_visarea(0, 640-1, 0, 200-1);
+ m_screen->set_screen_update(FUNC(pc88va_state::screen_update_pc88va));
- MCFG_PALETTE_ADD("palette", 32)
-// MCFG_PALETTE_INIT_OWNER(pc88va_state, pc8801 )
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_pc88va)
+ PALETTE(config, m_palette).set_entries(32);
+// m_palette->set_init(FUNC(pc88va_state::pc8801));
+ GFXDECODE(config, m_gfxdecode, m_palette, gfx_pc88va);
i8255_device &d8255_2(I8255(config, "d8255_2"));
d8255_2.in_pa_callback().set("d8255_2s", FUNC(i8255_device::pb_r));
@@ -1653,7 +1653,7 @@ MACHINE_CONFIG_START(pc88va_state::pc88va)
m_fdc->drq_wr_callback().set(FUNC(pc88va_state::fdc_drq));
FLOPPY_CONNECTOR(config, m_fdd[0], pc88va_floppies, "525hd", pc88va_state::floppy_formats);
FLOPPY_CONNECTOR(config, m_fdd[1], pc88va_floppies, "525hd", pc88va_state::floppy_formats);
- MCFG_SOFTWARE_LIST_ADD("disk_list","pc88va")
+ SOFTWARE_LIST(config, "disk_list").set_original("pc88va");
pit8253_device &pit8253(PIT8253(config, "pit8253", 0));
pit8253.set_clk<0>(8000000); /* general purpose timer 1 */
@@ -1664,12 +1664,12 @@ MACHINE_CONFIG_START(pc88va_state::pc88va)
ADDRESS_MAP_BANK(config, "sysbank").set_map(&pc88va_state::sysbank_map).set_options(ENDIANNESS_LITTLE, 16, 18+4, 0x40000);
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("ym", YM2203, 3993600) //unknown clock / divider
- MCFG_SOUND_ROUTE(0, "mono", 0.25)
- MCFG_SOUND_ROUTE(1, "mono", 0.25)
- MCFG_SOUND_ROUTE(2, "mono", 0.50)
- MCFG_SOUND_ROUTE(3, "mono", 0.50)
-MACHINE_CONFIG_END
+ ym2203_device &ym(YM2203(config, "ym", 3993600)); //unknown clock / divider
+ ym.add_route(0, "mono", 0.25);
+ ym.add_route(1, "mono", 0.25);
+ ym.add_route(2, "mono", 0.50);
+ ym.add_route(3, "mono", 0.50);
+}
ROM_START( pc88va2 )
diff --git a/src/mame/drivers/pc9801.cpp b/src/mame/drivers/pc9801.cpp
index 63a1b75d4ad..3d776a7ce23 100644
--- a/src/mame/drivers/pc9801.cpp
+++ b/src/mame/drivers/pc9801.cpp
@@ -2228,7 +2228,9 @@ void pc9801_state::pc9801_mouse(machine_config &config)
void pc9801_state::pc9801_cbus(machine_config &config)
{
- pc9801_slot_device &cbus0(PC9801CBUS_SLOT(config, "cbus0", m_maincpu, pc9801_cbus_devices, "pc9801_26"));
+ pc9801_slot_device &cbus0(PC9801CBUS_SLOT(config, "cbus0", pc9801_cbus_devices, "pc9801_26"));
+ cbus0.set_memspace(m_maincpu, AS_PROGRAM);
+ cbus0.set_iospace(m_maincpu, AS_IO);
cbus0.int_cb<0>().set("ir3", FUNC(input_merger_device::in_w<0>));
cbus0.int_cb<1>().set("ir5", FUNC(input_merger_device::in_w<0>));
cbus0.int_cb<2>().set("ir6", FUNC(input_merger_device::in_w<0>));
@@ -2237,7 +2239,9 @@ void pc9801_state::pc9801_cbus(machine_config &config)
cbus0.int_cb<5>().set("ir12", FUNC(input_merger_device::in_w<0>));
cbus0.int_cb<6>().set("ir13", FUNC(input_merger_device::in_w<0>));
- pc9801_slot_device &cbus1(PC9801CBUS_SLOT(config, "cbus1", m_maincpu, pc9801_cbus_devices, nullptr));
+ pc9801_slot_device &cbus1(PC9801CBUS_SLOT(config, "cbus1", pc9801_cbus_devices, nullptr));
+ cbus1.set_memspace(m_maincpu, AS_PROGRAM);
+ cbus1.set_iospace(m_maincpu, AS_IO);
cbus1.int_cb<0>().set("ir3", FUNC(input_merger_device::in_w<1>));
cbus1.int_cb<1>().set("ir5", FUNC(input_merger_device::in_w<1>));
cbus1.int_cb<2>().set("ir6", FUNC(input_merger_device::in_w<1>));
@@ -2313,8 +2317,8 @@ void pc9801_state::pc9801_common(machine_config &config)
m_dmac->out_eop_callback().set(FUNC(pc9801_state::tc_w));
m_dmac->in_memr_callback().set(FUNC(pc9801_state::dma_read_byte));
m_dmac->out_memw_callback().set(FUNC(pc9801_state::dma_write_byte));
- m_dmac->in_ior_callback<2>().set(m_fdc_2hd, FUNC(upd765a_device::mdma_r));
- m_dmac->out_iow_callback<2>().set(m_fdc_2hd, FUNC(upd765a_device::mdma_w));
+ m_dmac->in_ior_callback<2>().set(m_fdc_2hd, FUNC(upd765a_device::dma_r));
+ m_dmac->out_iow_callback<2>().set(m_fdc_2hd, FUNC(upd765a_device::dma_w));
m_dmac->out_dack_callback<0>().set(FUNC(pc9801_state::dack0_w));
m_dmac->out_dack_callback<1>().set(FUNC(pc9801_state::dack1_w));
m_dmac->out_dack_callback<2>().set(FUNC(pc9801_state::dack2_w));
@@ -2367,12 +2371,12 @@ void pc9801_state::pc9801_common(machine_config &config)
UPD7220(config, m_hgdc1, 21.0526_MHz_XTAL / 8);
m_hgdc1->set_addrmap(0, &pc9801_state::upd7220_1_map);
- m_hgdc1->set_draw_text_callback(FUNC(pc9801_state::hgdc_draw_text), this);
+ m_hgdc1->set_draw_text(FUNC(pc9801_state::hgdc_draw_text));
m_hgdc1->vsync_wr_callback().set(m_hgdc2, FUNC(upd7220_device::ext_sync_w));
UPD7220(config, m_hgdc2, 21.0526_MHz_XTAL / 8);
m_hgdc2->set_addrmap(0, &pc9801_state::upd7220_2_map);
- m_hgdc2->set_display_pixels_callback(FUNC(pc9801_state::hgdc_display_pixels), this);
+ m_hgdc2->set_display_pixels(FUNC(pc9801_state::hgdc_display_pixels));
SPEAKER(config, "mono").front_center();
@@ -2404,8 +2408,8 @@ void pc9801_state::pc9801(machine_config &config)
pc9801_sasi(config);
UPD1990A(config, m_rtc);
- m_dmac->in_ior_callback<3>().set(m_fdc_2dd, FUNC(upd765a_device::mdma_r));
- m_dmac->out_iow_callback<3>().set(m_fdc_2dd, FUNC(upd765a_device::mdma_w));
+ m_dmac->in_ior_callback<3>().set(m_fdc_2dd, FUNC(upd765a_device::dma_r));
+ m_dmac->out_iow_callback<3>().set(m_fdc_2dd, FUNC(upd765a_device::dma_w));
PALETTE(config, m_palette, FUNC(pc9801_state::pc9801_palette), 16);
}
@@ -2946,7 +2950,7 @@ void pc9801_state::init_pc9801vm_kanji()
uint8_t *chargen = memregion("chargen")->base();
uint8_t *raw_kanji = memregion("raw_kanji")->base();
uint8_t *kanji = memregion("kanji")->base();
-
+
/* swap bits for 8x8 characters, discard 8x8 "graphics" characters */
/* TODO: should we keep and use the "graphics" characters? */
for( uint32_t i = 0; i < 0x100; i++ )
diff --git a/src/mame/drivers/pcat_dyn.cpp b/src/mame/drivers/pcat_dyn.cpp
index 292ebb90a9e..416b0fa45af 100644
--- a/src/mame/drivers/pcat_dyn.cpp
+++ b/src/mame/drivers/pcat_dyn.cpp
@@ -206,7 +206,8 @@ void pcat_dyn_state::pcat_dyn(machine_config &config)
serport.cts_handler().set("ns16550", FUNC(ins8250_uart_device::cts_w));
ISA8(config, m_isabus, 0);
- m_isabus->set_cputag("maincpu");
+ m_isabus->set_memspace("maincpu", AS_PROGRAM);
+ m_isabus->set_iospace("maincpu", AS_IO);
m_isabus->irq2_callback().set("pic8259_2", FUNC(pic8259_device::ir2_w));
m_isabus->irq3_callback().set("pic8259_1", FUNC(pic8259_device::ir3_w));
//m_isabus->irq4_callback().set("pic8259_1", FUNC(pic8259_device::ir4_w));
diff --git a/src/mame/drivers/pcat_nit.cpp b/src/mame/drivers/pcat_nit.cpp
index 5966c54379e..16e3f1a1a0e 100644
--- a/src/mame/drivers/pcat_nit.cpp
+++ b/src/mame/drivers/pcat_nit.cpp
@@ -231,12 +231,13 @@ void pcat_nit_state::machine_start()
membank("rombank")->set_entry(0);
}
-MACHINE_CONFIG_START(pcat_nit_state::pcat_nit)
+void pcat_nit_state::pcat_nit(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", I386, 14318180*2) /* I386 ?? Mhz */
- MCFG_DEVICE_PROGRAM_MAP(pcat_map)
- MCFG_DEVICE_IO_MAP(pcat_nit_io)
- MCFG_DEVICE_IRQ_ACKNOWLEDGE_DEVICE("pic8259_1", pic8259_device, inta_cb)
+ I386(config, m_maincpu, 14318180*2); /* I386 ?? Mhz */
+ m_maincpu->set_addrmap(AS_PROGRAM, &pcat_nit_state::pcat_map);
+ m_maincpu->set_addrmap(AS_IO, &pcat_nit_state::pcat_nit_io);
+ m_maincpu->set_irq_acknowledge_callback("pic8259_1", FUNC(pic8259_device::inta_cb));
/* video hardware */
pcvideo_vga(config);
@@ -247,17 +248,18 @@ MACHINE_CONFIG_START(pcat_nit_state::pcat_nit)
uart.out_tx_callback().set("microtouch", FUNC(microtouch_device::rx));
uart.out_int_callback().set("pic8259_1", FUNC(pic8259_device::ir4_w));
- MCFG_MICROTOUCH_ADD( "microtouch", 9600, WRITELINE(uart, ins8250_uart_device, rx_w) ) // rate?
+ MICROTOUCH(config, m_microtouch, 9600).stx().set(uart, FUNC(ins8250_uart_device::rx_w)); // rate?
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(pcat_nit_state::bonanza)
+void pcat_nit_state::bonanza(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", I386, 14318180*2) /* I386 ?? Mhz */
- MCFG_DEVICE_PROGRAM_MAP(bonanza_map)
- MCFG_DEVICE_IO_MAP(bonanza_io_map)
- MCFG_DEVICE_IRQ_ACKNOWLEDGE_DEVICE("pic8259_1", pic8259_device, inta_cb)
+ I386(config, m_maincpu, 14318180*2); /* I386 ?? Mhz */
+ m_maincpu->set_addrmap(AS_PROGRAM, &pcat_nit_state::bonanza_map);
+ m_maincpu->set_addrmap(AS_IO, &pcat_nit_state::bonanza_io_map);
+ m_maincpu->set_irq_acknowledge_callback("pic8259_1", FUNC(pic8259_device::inta_cb));
/* video hardware */
pcvideo_cirrus_gd5428(config);
@@ -267,10 +269,10 @@ MACHINE_CONFIG_START(pcat_nit_state::bonanza)
uart.out_tx_callback().set("microtouch", FUNC(microtouch_device::rx));
uart.out_int_callback().set("pic8259_1", FUNC(pic8259_device::ir4_w));
- MCFG_MICROTOUCH_ADD( "microtouch", 9600, WRITELINE(uart, ins8250_uart_device, rx_w) ) // rate?
+ MICROTOUCH(config, m_microtouch, 9600).stx().set(uart, FUNC(ins8250_uart_device::rx_w)); // rate?
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
-MACHINE_CONFIG_END
+}
/***************************************
*
diff --git a/src/mame/drivers/pcd.cpp b/src/mame/drivers/pcd.cpp
index 65c8328b54a..dce3bd79b43 100644
--- a/src/mame/drivers/pcd.cpp
+++ b/src/mame/drivers/pcd.cpp
@@ -50,7 +50,6 @@ public:
, m_scsi_data_out(*this, "scsi_data_out")
, m_scsi_data_in(*this, "scsi_data_in")
, m_ram(*this, "ram")
- , m_req_hack(nullptr)
{ }
void pcx(machine_config &config);
@@ -63,8 +62,6 @@ private:
DECLARE_READ8_MEMBER( nmi_io_r );
DECLARE_WRITE8_MEMBER( nmi_io_w );
- DECLARE_READ8_MEMBER( rtc_r );
- DECLARE_WRITE8_MEMBER( rtc_w );
DECLARE_READ8_MEMBER( stat_r );
DECLARE_WRITE8_MEMBER( stat_w );
DECLARE_READ8_MEMBER( led_r );
@@ -93,7 +90,6 @@ private:
// driver_device overrides
virtual void machine_start() override;
virtual void machine_reset() override;
- virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override;
required_device<i80186_cpu_device> m_maincpu;
required_device<pic8259_device> m_pic1;
@@ -108,7 +104,6 @@ private:
required_device<ram_device> m_ram;
uint8_t m_stat, m_led;
int m_msg, m_bsy, m_io, m_cd, m_req, m_rst;
- emu_timer *m_req_hack;
uint16_t m_dskctl;
struct {
uint16_t ctl;
@@ -125,16 +120,8 @@ private:
// MACHINE EMULATION
//**************************************************************************
-void pcd_state::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr)
-{
- // TODO: remove this hack
- if(m_req)
- m_maincpu->drq0_w(1);
-}
-
void pcd_state::machine_start()
{
- m_req_hack = timer_alloc();
save_item(NAME(m_mmu.ctl));
save_item(NAME(m_mmu.regs));
}
@@ -189,18 +176,6 @@ WRITE8_MEMBER( pcd_state::nmi_io_w )
m_maincpu->pulse_input_line(INPUT_LINE_NMI, attotime::zero);
}
-READ8_MEMBER( pcd_state::rtc_r )
-{
- m_rtc->write(space, 0, offset);
- return m_rtc->read(space, 1);
-}
-
-WRITE8_MEMBER( pcd_state::rtc_w )
-{
- m_rtc->write(space, 0, offset);
- m_rtc->write(space, 1, data);
-}
-
READ8_MEMBER( pcd_state::stat_r )
{
return m_stat;
@@ -377,7 +352,6 @@ WRITE_LINE_MEMBER(pcd_state::write_scsi_req)
if(!m_cd)
{
m_maincpu->drq0_w(1);
- m_req_hack->adjust(attotime::from_msec(10)); // poke the dmac
}
else if(m_msg)
{
@@ -387,8 +361,6 @@ WRITE_LINE_MEMBER(pcd_state::write_scsi_req)
}
else
{
- if(m_req_hack) // this might be called before machine_start
- m_req_hack->adjust(attotime::never);
m_scsi->write_ack(0);
}
check_scsi_irq();
@@ -457,7 +429,7 @@ void pcd_state::pcd_io(address_map &map)
map(0xf820, 0xf821).rw(m_pic2, FUNC(pic8259_device::read), FUNC(pic8259_device::write));
map(0xf840, 0xf840).rw(FUNC(pcd_state::stat_r), FUNC(pcd_state::stat_w));
map(0xf841, 0xf841).rw(FUNC(pcd_state::led_r), FUNC(pcd_state::led_w));
- map(0xf880, 0xf8bf).rw(FUNC(pcd_state::rtc_r), FUNC(pcd_state::rtc_w));
+ map(0xf880, 0xf8bf).rw(m_rtc, FUNC(mc146818_device::read_direct), FUNC(mc146818_device::write_direct));
map(0xf900, 0xf903).rw(m_fdc, FUNC(wd2793_device::read), FUNC(wd2793_device::write));
map(0xf904, 0xf905).rw(FUNC(pcd_state::dskctl_r), FUNC(pcd_state::dskctl_w));
map(0xf940, 0xf943).rw(FUNC(pcd_state::scsi_r), FUNC(pcd_state::scsi_w));
@@ -595,6 +567,8 @@ void pcd_state::pcx(machine_config &config)
subdevice<pcd_keyboard_device>("keyboard")->out_tx_handler().set("video", FUNC(pcx_video_device::rx_w));
m_usart[1]->txd_handler().set_nop();
+
+ SOFTWARE_LIST(config, "flop_ls").set_original("pcx_flop");
}
//**************************************************************************
diff --git a/src/mame/drivers/pce.cpp b/src/mame/drivers/pce.cpp
index 36d86941249..29b365e6443 100644
--- a/src/mame/drivers/pce.cpp
+++ b/src/mame/drivers/pce.cpp
@@ -305,7 +305,8 @@ static void pce_cart(device_slot_interface &device)
device.option_add_internal("sf2", PCE_ROM_SF2);
}
-MACHINE_CONFIG_START(pce_state::pce_common)
+void pce_state::pce_common(machine_config &config)
+{
/* basic machine hardware */
H6280(config, m_maincpu, MAIN_CLOCK/3);
m_maincpu->set_addrmap(AS_PROGRAM, &pce_state::pce_mem);
@@ -315,51 +316,54 @@ MACHINE_CONFIG_START(pce_state::pce_common)
m_maincpu->add_route(0, "lspeaker", 1.00);
m_maincpu->add_route(1, "rspeaker", 1.00);
- MCFG_QUANTUM_TIME(attotime::from_hz(60))
+ config.m_minimum_quantum = attotime::from_hz(60);
MCFG_MACHINE_START_OVERRIDE(pce_state, pce )
MCFG_MACHINE_RESET_OVERRIDE(pce_state, mess_pce )
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_RAW_PARAMS(MAIN_CLOCK, huc6260_device::WPF, 64, 64 + 1024 + 64, huc6260_device::LPF, 18, 18 + 242)
- MCFG_SCREEN_UPDATE_DRIVER( pce_state, screen_update )
- MCFG_SCREEN_PALETTE("huc6260")
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_raw(MAIN_CLOCK, huc6260_device::WPF, 64, 64 + 1024 + 64, huc6260_device::LPF, 18, 18 + 242);
+ screen.set_screen_update(FUNC(pce_state::screen_update));
+ screen.set_palette(m_huc6260);
- MCFG_DEVICE_ADD( "huc6260", HUC6260, MAIN_CLOCK )
- MCFG_HUC6260_NEXT_PIXEL_DATA_CB(READ16("huc6270", huc6270_device, next_pixel))
- MCFG_HUC6260_TIME_TIL_NEXT_EVENT_CB(READ16("huc6270", huc6270_device, time_until_next_event))
- MCFG_HUC6260_VSYNC_CHANGED_CB(WRITELINE("huc6270", huc6270_device, vsync_changed))
- MCFG_HUC6260_HSYNC_CHANGED_CB(WRITELINE("huc6270", huc6270_device, hsync_changed))
+ HUC6260(config, m_huc6260, MAIN_CLOCK);
+ m_huc6260->next_pixel_data().set("huc6270", FUNC(huc6270_device::next_pixel));
+ m_huc6260->time_til_next_event().set("huc6270", FUNC(huc6270_device::time_until_next_event));
+ m_huc6260->vsync_changed().set("huc6270", FUNC(huc6270_device::vsync_changed));
+ m_huc6260->hsync_changed().set("huc6270", FUNC(huc6270_device::hsync_changed));
- MCFG_DEVICE_ADD( "huc6270", HUC6270, 0 )
- MCFG_HUC6270_VRAM_SIZE(0x10000)
- MCFG_HUC6270_IRQ_CHANGED_CB(INPUTLINE("maincpu", 0))
+ huc6270_device &huc6270(HUC6270(config, "huc6270", 0));
+ huc6270.set_vram_size(0x10000);
+ huc6270.irq().set_inputline(m_maincpu, 0);
SPEAKER(config, "lspeaker").front_left();
SPEAKER(config, "rspeaker").front_right();
PCE_CD(config, m_cd, 0);
- MCFG_SOFTWARE_LIST_ADD("cd_list","pcecd")
-MACHINE_CONFIG_END
+ SOFTWARE_LIST(config, "cd_list").set_original("pcecd");
+}
-MACHINE_CONFIG_START(pce_state::pce)
+void pce_state::pce(machine_config &config)
+{
pce_common(config);
- MCFG_PCE_CARTRIDGE_ADD("cartslot", pce_cart, nullptr)
- MCFG_SOFTWARE_LIST_ADD("cart_list","pce")
-MACHINE_CONFIG_END
+ PCE_CART_SLOT(config, m_cartslot, pce_cart, nullptr, "pce_cart");
+ SOFTWARE_LIST(config, "cart_list").set_original("pce");
+}
-MACHINE_CONFIG_START(pce_state::tg16)
+void pce_state::tg16(machine_config &config)
+{
pce_common(config);
- MCFG_TG16_CARTRIDGE_ADD("cartslot", pce_cart, nullptr)
- MCFG_SOFTWARE_LIST_ADD("cart_list","tg16")
-MACHINE_CONFIG_END
+ PCE_CART_SLOT(config, m_cartslot, pce_cart, nullptr, "tg16_cart");
+ SOFTWARE_LIST(config, "cart_list").set_original("tg16");
+}
-MACHINE_CONFIG_START(pce_state::sgx)
+void pce_state::sgx(machine_config &config)
+{
/* basic machine hardware */
H6280(config, m_maincpu, MAIN_CLOCK/3);
m_maincpu->set_addrmap(AS_PROGRAM, &pce_state::sgx_mem);
@@ -369,53 +373,56 @@ MACHINE_CONFIG_START(pce_state::sgx)
m_maincpu->add_route(0, "lspeaker", 1.00);
m_maincpu->add_route(1, "rspeaker", 1.00);
- MCFG_QUANTUM_TIME(attotime::from_hz(60))
+ config.m_minimum_quantum = attotime::from_hz(60);
MCFG_MACHINE_START_OVERRIDE(pce_state, pce )
MCFG_MACHINE_RESET_OVERRIDE(pce_state, mess_pce )
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_RAW_PARAMS(MAIN_CLOCK, huc6260_device::WPF, 64, 64 + 1024 + 64, huc6260_device::LPF, 18, 18 + 242)
- MCFG_SCREEN_UPDATE_DRIVER( pce_state, screen_update )
- MCFG_SCREEN_PALETTE("huc6260")
-
- MCFG_DEVICE_ADD( "huc6260", HUC6260, MAIN_CLOCK )
- MCFG_HUC6260_NEXT_PIXEL_DATA_CB(READ16("huc6202", huc6202_device, next_pixel))
- MCFG_HUC6260_TIME_TIL_NEXT_EVENT_CB(READ16("huc6202", huc6202_device, time_until_next_event))
- MCFG_HUC6260_VSYNC_CHANGED_CB(WRITELINE("huc6202", huc6202_device, vsync_changed))
- MCFG_HUC6260_HSYNC_CHANGED_CB(WRITELINE("huc6202", huc6202_device, hsync_changed))
- MCFG_DEVICE_ADD( "huc6270_0", HUC6270, 0 )
- MCFG_HUC6270_VRAM_SIZE(0x10000)
- MCFG_HUC6270_IRQ_CHANGED_CB(INPUTLINE("maincpu", 0))
- MCFG_DEVICE_ADD( "huc6270_1", HUC6270, 0 )
- MCFG_HUC6270_VRAM_SIZE(0x10000)
- MCFG_HUC6270_IRQ_CHANGED_CB(INPUTLINE("maincpu", 0))
- MCFG_DEVICE_ADD( "huc6202", HUC6202, 0 )
- MCFG_HUC6202_NEXT_PIXEL_0_CB(READ16("huc6270_0", huc6270_device, next_pixel))
- MCFG_HUC6202_TIME_TIL_NEXT_EVENT_0_CB(READ16("huc6270_0", huc6270_device, time_until_next_event))
- MCFG_HUC6202_VSYNC_CHANGED_0_CB(WRITELINE("huc6270_0", huc6270_device, vsync_changed))
- MCFG_HUC6202_HSYNC_CHANGED_0_CB(WRITELINE("huc6270_0", huc6270_device, hsync_changed))
- MCFG_HUC6202_READ_0_CB(READ8("huc6270_0", huc6270_device, read))
- MCFG_HUC6202_WRITE_0_CB(WRITE8("huc6270_0", huc6270_device, write))
- MCFG_HUC6202_NEXT_PIXEL_1_CB(READ16("huc6270_1", huc6270_device, next_pixel))
- MCFG_HUC6202_TIME_TIL_NEXT_EVENT_1_CB(READ16("huc6270_1", huc6270_device, time_until_next_event))
- MCFG_HUC6202_VSYNC_CHANGED_1_CB(WRITELINE("huc6270_1", huc6270_device, vsync_changed))
- MCFG_HUC6202_HSYNC_CHANGED_1_CB(WRITELINE("huc6270_1", huc6270_device, hsync_changed))
- MCFG_HUC6202_READ_1_CB(READ8("huc6270_1", huc6270_device, read))
- MCFG_HUC6202_WRITE_1_CB(WRITE8("huc6270_1", huc6270_device, write))
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_raw(MAIN_CLOCK, huc6260_device::WPF, 64, 64 + 1024 + 64, huc6260_device::LPF, 18, 18 + 242);
+ screen.set_screen_update(FUNC(pce_state::screen_update));
+ screen.set_palette(m_huc6260);
+
+ HUC6260(config, m_huc6260, MAIN_CLOCK);
+ m_huc6260->next_pixel_data().set("huc6202", FUNC(huc6202_device::next_pixel));
+ m_huc6260->time_til_next_event().set("huc6202", FUNC(huc6202_device::time_until_next_event));
+ m_huc6260->vsync_changed().set("huc6202", FUNC(huc6202_device::vsync_changed));
+ m_huc6260->hsync_changed().set("huc6202", FUNC(huc6202_device::hsync_changed));
+
+ huc6270_device &huc6270_0(HUC6270(config, "huc6270_0", 0));
+ huc6270_0.set_vram_size(0x10000);
+ huc6270_0.irq().set_inputline(m_maincpu, 0);
+
+ huc6270_device &huc6270_1(HUC6270(config, "huc6270_1", 0));
+ huc6270_1.set_vram_size(0x10000);
+ huc6270_1.irq().set_inputline(m_maincpu, 0);
+
+ huc6202_device &huc6202(HUC6202(config, "huc6202", 0 ));
+ huc6202.next_pixel_0_callback().set("huc6270_0", FUNC(huc6270_device::next_pixel));
+ huc6202.time_til_next_event_0_callback().set("huc6270_0", FUNC(huc6270_device::time_until_next_event));
+ huc6202.vsync_changed_0_callback().set("huc6270_0", FUNC(huc6270_device::vsync_changed));
+ huc6202.hsync_changed_0_callback().set("huc6270_0", FUNC(huc6270_device::hsync_changed));
+ huc6202.read_0_callback().set("huc6270_0", FUNC(huc6270_device::read));
+ huc6202.write_0_callback().set("huc6270_0", FUNC(huc6270_device::write));
+ huc6202.next_pixel_1_callback().set("huc6270_1", FUNC(huc6270_device::next_pixel));
+ huc6202.time_til_next_event_1_callback().set("huc6270_1", FUNC(huc6270_device::time_until_next_event));
+ huc6202.vsync_changed_1_callback().set("huc6270_1", FUNC(huc6270_device::vsync_changed));
+ huc6202.hsync_changed_1_callback().set("huc6270_1", FUNC(huc6270_device::hsync_changed));
+ huc6202.read_1_callback().set("huc6270_1", FUNC(huc6270_device::read));
+ huc6202.write_1_callback().set("huc6270_1", FUNC(huc6270_device::write));
SPEAKER(config, "lspeaker").front_left();
SPEAKER(config, "rspeaker").front_right();
- MCFG_PCE_CARTRIDGE_ADD("cartslot", pce_cart, nullptr)
- MCFG_SOFTWARE_LIST_ADD("cart_list","sgx")
- MCFG_SOFTWARE_LIST_COMPATIBLE_ADD("pce_list","pce")
+ PCE_CART_SLOT(config, m_cartslot, pce_cart, nullptr, "pce_cart");
+ SOFTWARE_LIST(config, "cart_list").set_original("sgx");
+ SOFTWARE_LIST(config, "pce_list").set_compatible("pce");
PCE_CD(config, m_cd, 0);
- MCFG_SOFTWARE_LIST_ADD("cd_list","pcecd")
-MACHINE_CONFIG_END
+ SOFTWARE_LIST(config, "cd_list").set_original("pcecd");
+}
/***************************************************************************
diff --git a/src/mame/drivers/pce220.cpp b/src/mame/drivers/pce220.cpp
index fbc1dee727b..80d62bea1c0 100644
--- a/src/mame/drivers/pce220.cpp
+++ b/src/mame/drivers/pce220.cpp
@@ -944,21 +944,22 @@ void pce220_state::pce220_palette(palette_device &palette) const
}
-MACHINE_CONFIG_START(pce220_state::pce220)
+void pce220_state::pce220(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu",Z80, 3072000 ) // CMOS-SC7852
- MCFG_DEVICE_PROGRAM_MAP(pce220_mem)
- MCFG_DEVICE_IO_MAP(pce220_io)
+ Z80(config, m_maincpu, 3072000); // CMOS-SC7852
+ m_maincpu->set_addrmap(AS_PROGRAM, &pce220_state::pce220_mem);
+ m_maincpu->set_addrmap(AS_IO, &pce220_state::pce220_io);
/* video hardware */
// 4 lines x 24 characters, resp. 144 x 32 pixel
- MCFG_SCREEN_ADD("screen", LCD)
- MCFG_SCREEN_REFRESH_RATE(50)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */
- MCFG_SCREEN_UPDATE_DRIVER(pce220_state, screen_update)
- MCFG_SCREEN_SIZE(24*6, 4*8)
- MCFG_SCREEN_VISIBLE_AREA(0, 24*6-1, 0, 4*8-1)
- MCFG_SCREEN_PALETTE("palette")
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_LCD));
+ screen.set_refresh_hz(50);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */
+ screen.set_screen_update(FUNC(pce220_state::screen_update));
+ screen.set_size(24*6, 4*8);
+ screen.set_visarea(0, 24*6-1, 0, 4*8-1);
+ screen.set_palette("palette");
PALETTE(config, "palette", FUNC(pce220_state::pce220_palette), 2);
@@ -966,7 +967,7 @@ MACHINE_CONFIG_START(pce220_state::pce220)
SPEAKER(config, "mono").front_center();
BEEP(config, m_beep, 3250).add_route(ALL_OUTPUTS, "mono", 0.50);
- MCFG_TIMER_DRIVER_ADD_PERIODIC("pce220_timer", pce220_state, pce220_timer_callback, attotime::from_msec(468))
+ TIMER(config, "pce220_timer").configure_periodic(FUNC(pce220_state::pce220_timer_callback), attotime::from_msec(468));
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
@@ -974,23 +975,24 @@ MACHINE_CONFIG_START(pce220_state::pce220)
RAM(config, RAM_TAG).set_default_size("64K"); // 32K internal + 32K external card
PCE220SERIAL(config, m_serial, 0);
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(pcg850v_state::pcg815)
+void pcg850v_state::pcg815(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu",Z80, XTAL(4'000'000) ) // 3.54MHz
- MCFG_DEVICE_PROGRAM_MAP(pce220_mem)
- MCFG_DEVICE_IO_MAP(pcg850v_io)
+ Z80(config, m_maincpu, XTAL(4'000'000)); // 3.54MHz
+ m_maincpu->set_addrmap(AS_PROGRAM, &pcg850v_state::pce220_mem);
+ m_maincpu->set_addrmap(AS_IO, &pcg850v_state::pcg850v_io);
/* video hardware */
// 4 lines x 24 characters, resp. 144 x 32 pixel
- MCFG_SCREEN_ADD("screen", LCD)
- MCFG_SCREEN_REFRESH_RATE(50)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */
- MCFG_SCREEN_UPDATE_DRIVER(pcg850v_state, screen_update)
- MCFG_SCREEN_SIZE(144, 32)
- MCFG_SCREEN_VISIBLE_AREA(0, 144-1, 0, 32-1)
- MCFG_SCREEN_PALETTE("palette")
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_LCD));
+ screen.set_refresh_hz(50);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */
+ screen.set_screen_update(FUNC(pcg850v_state::screen_update));
+ screen.set_size(144, 32);
+ screen.set_visarea(0, 144-1, 0, 32-1);
+ screen.set_palette("palette");
PALETTE(config, "palette", FUNC(pcg850v_state::pce220_palette), 2);
@@ -998,7 +1000,7 @@ MACHINE_CONFIG_START(pcg850v_state::pcg815)
SPEAKER(config, "mono").front_center();
BEEP(config, m_beep, 3250).add_route(ALL_OUTPUTS, "mono", 0.50);
- MCFG_TIMER_DRIVER_ADD_PERIODIC("pce220_timer", pcg850v_state, pce220_timer_callback, attotime::from_msec(468))
+ TIMER(config, "pce220_timer").configure_periodic(FUNC(pcg850v_state::pce220_timer_callback), attotime::from_msec(468));
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
@@ -1006,23 +1008,24 @@ MACHINE_CONFIG_START(pcg850v_state::pcg815)
RAM(config, RAM_TAG).set_default_size("64K"); // 32K internal + 32K external card
PCE220SERIAL(config, m_serial, 0);
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(pcg850v_state::pcg850v)
+void pcg850v_state::pcg850v(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu",Z80, XTAL(8'000'000) ) // CMOS-SC7852
- MCFG_DEVICE_PROGRAM_MAP(pce220_mem)
- MCFG_DEVICE_IO_MAP(pcg850v_io)
+ Z80(config, m_maincpu, XTAL(8'000'000)); // CMOS-SC7852
+ m_maincpu->set_addrmap(AS_PROGRAM, &pcg850v_state::pce220_mem);
+ m_maincpu->set_addrmap(AS_IO, &pcg850v_state::pcg850v_io);
/* video hardware */
// 6 lines x 24 characters, resp. 144 x 48 pixel
- MCFG_SCREEN_ADD("screen", LCD)
- MCFG_SCREEN_REFRESH_RATE(50)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */
- MCFG_SCREEN_UPDATE_DRIVER(pcg850v_state, screen_update)
- MCFG_SCREEN_SIZE(144, 48)
- MCFG_SCREEN_VISIBLE_AREA(0, 144-1, 0, 48-1)
- MCFG_SCREEN_PALETTE("palette")
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_LCD));
+ screen.set_refresh_hz(50);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */
+ screen.set_screen_update(FUNC(pcg850v_state::screen_update));
+ screen.set_size(144, 48);
+ screen.set_visarea(0, 144-1, 0, 48-1);
+ screen.set_palette("palette");
PALETTE(config, "palette", FUNC(pcg850v_state::pce220_palette), 2);
@@ -1030,7 +1033,7 @@ MACHINE_CONFIG_START(pcg850v_state::pcg850v)
SPEAKER(config, "mono").front_center();
BEEP(config, m_beep, 3250).add_route(ALL_OUTPUTS, "mono", 0.50);
- MCFG_TIMER_DRIVER_ADD_PERIODIC("pce220_timer", pcg850v_state, pce220_timer_callback, attotime::from_msec(468))
+ TIMER(config, "pce220_timer").configure_periodic(FUNC(pcg850v_state::pce220_timer_callback), attotime::from_msec(468));
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
@@ -1038,7 +1041,7 @@ MACHINE_CONFIG_START(pcg850v_state::pcg850v)
RAM(config, RAM_TAG).set_default_size("64K"); // 32K internal + 32K external card
PCE220SERIAL(config, m_serial, 0);
-MACHINE_CONFIG_END
+}
/* ROM definition */
ROM_START( pce220 )
diff --git a/src/mame/drivers/pcfx.cpp b/src/mame/drivers/pcfx.cpp
index 4562f434752..b478d2c5ebd 100644
--- a/src/mame/drivers/pcfx.cpp
+++ b/src/mame/drivers/pcfx.cpp
@@ -417,35 +417,36 @@ uint32_t pcfx_state::screen_update(screen_device &screen, bitmap_rgb32 &bitmap,
}
-MACHINE_CONFIG_START(pcfx_state::pcfx)
- MCFG_DEVICE_ADD( "maincpu", V810, XTAL(21'477'272) )
- MCFG_DEVICE_PROGRAM_MAP( pcfx_mem)
- MCFG_DEVICE_IO_MAP( pcfx_io)
+void pcfx_state::pcfx(machine_config &config)
+{
+ V810(config, m_maincpu, XTAL(21'477'272));
+ m_maincpu->set_addrmap(AS_PROGRAM, &pcfx_state::pcfx_mem);
+ m_maincpu->set_addrmap(AS_IO, &pcfx_state::pcfx_io);
- MCFG_SCREEN_ADD( "screen", RASTER )
- MCFG_SCREEN_UPDATE_DRIVER(pcfx_state, screen_update)
- MCFG_SCREEN_RAW_PARAMS(XTAL(21'477'272), huc6261_device::WPF, 64, 64 + 1024 + 64, huc6261_device::LPF, 18, 18 + 242)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_screen_update(FUNC(pcfx_state::screen_update));
+ screen.set_raw(XTAL(21'477'272), huc6261_device::WPF, 64, 64 + 1024 + 64, huc6261_device::LPF, 18, 18 + 242);
- MCFG_DEVICE_ADD( "huc6270_a", HUC6270, 0 )
- MCFG_HUC6270_VRAM_SIZE(0x20000)
- MCFG_HUC6270_IRQ_CHANGED_CB(WRITELINE(*this, pcfx_state, irq12_w))
+ huc6270_device &huc6270_a(HUC6270(config, "huc6270_a", 0));
+ huc6270_a.set_vram_size(0x20000);
+ huc6270_a.irq().set(FUNC(pcfx_state::irq12_w));
- MCFG_DEVICE_ADD( "huc6270_b", HUC6270, 0 )
- MCFG_HUC6270_VRAM_SIZE(0x20000)
- MCFG_HUC6270_IRQ_CHANGED_CB(WRITELINE(*this, pcfx_state, irq14_w))
+ huc6270_device &huc6270_b(HUC6270(config, "huc6270_b", 0));
+ huc6270_b.set_vram_size(0x20000);
+ huc6270_b.irq().set(FUNC(pcfx_state::irq14_w));
- MCFG_DEVICE_ADD("huc6261", HUC6261, XTAL(21'477'272))
- MCFG_HUC6261_VDC1("huc6270_a")
- MCFG_HUC6261_VDC2("huc6270_b")
- MCFG_HUC6261_KING("huc6272")
+ HUC6261(config, m_huc6261, XTAL(21'477'272));
+ m_huc6261->set_vdc1_tag("huc6270_a");
+ m_huc6261->set_vdc2_tag("huc6270_b");
+ m_huc6261->set_king_tag("huc6272");
- MCFG_DEVICE_ADD( "huc6272", HUC6272, XTAL(21'477'272) )
- MCFG_HUC6272_IRQ_CHANGED_CB(WRITELINE(*this, pcfx_state, irq13_w))
- MCFG_HUC6272_RAINBOW("huc6271")
+ huc6272_device &huc6272(HUC6272(config, "huc6272", XTAL(21'477'272)));
+ huc6272.irq_changed_callback().set(FUNC(pcfx_state::irq13_w));
+ huc6272.set_rainbow_tag("huc6271");
- MCFG_DEVICE_ADD( "huc6271", HUC6271, XTAL(21'477'272) )
+ HUC6271(config, "huc6271", XTAL(21'477'272));
- MCFG_SOFTWARE_LIST_ADD("cd_list", "pcfx")
+ SOFTWARE_LIST(config, "cd_list").set_original("pcfx");
/* sound hardware */
SPEAKER(config, "lspeaker").front_left();
@@ -457,7 +458,7 @@ MACHINE_CONFIG_START(pcfx_state::pcfx)
huc6230.cdda_cb().set("huc6272", FUNC(huc6272_device::cdda_update));
huc6230.add_route(0, "lspeaker", 1.0);
huc6230.add_route(1, "rspeaker", 1.0);
-MACHINE_CONFIG_END
+}
ROM_START( pcfx )
diff --git a/src/mame/drivers/pcktgal.cpp b/src/mame/drivers/pcktgal.cpp
index 405055488ab..5a2c05a40d0 100644
--- a/src/mame/drivers/pcktgal.cpp
+++ b/src/mame/drivers/pcktgal.cpp
@@ -223,26 +223,26 @@ void pcktgal_state::machine_start()
save_item(NAME(m_toggle));
}
-MACHINE_CONFIG_START(pcktgal_state::pcktgal)
-
+void pcktgal_state::pcktgal(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M6502, 2000000)
- MCFG_DEVICE_PROGRAM_MAP(pcktgal_map)
+ M6502(config, m_maincpu, 2000000);
+ m_maincpu->set_addrmap(AS_PROGRAM, &pcktgal_state::pcktgal_map);
- MCFG_DEVICE_ADD("audiocpu", DECO_222, 1500000)
- MCFG_DEVICE_PROGRAM_MAP(pcktgal_sound_map)
- /* IRQs are caused by the ADPCM chip */
- /* NMIs are caused by the main CPU */
+ DECO_222(config, m_audiocpu, 1500000);
+ m_audiocpu->set_addrmap(AS_PROGRAM, &pcktgal_state::pcktgal_sound_map);
+ /* IRQs are caused by the ADPCM chip */
+ /* NMIs are caused by the main CPU */
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(32*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(pcktgal_state, screen_update_pcktgal)
- MCFG_SCREEN_PALETTE(m_palette)
- MCFG_SCREEN_VBLANK_CALLBACK(INPUTLINE("maincpu", INPUT_LINE_NMI))
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(32*8, 32*8);
+ screen.set_visarea(0*8, 32*8-1, 2*8, 30*8-1);
+ screen.set_screen_update(FUNC(pcktgal_state::screen_update_pcktgal));
+ screen.set_palette(m_palette);
+ screen.screen_vblank().set_inputline(m_maincpu, INPUT_LINE_NMI);
GFXDECODE(config, m_gfxdecode, "palette", gfx_pcktgal);
PALETTE(config, m_palette, FUNC(pcktgal_state::pcktgal_palette), 512);
@@ -256,32 +256,28 @@ MACHINE_CONFIG_START(pcktgal_state::pcktgal)
GENERIC_LATCH_8(config, m_soundlatch);
- MCFG_DEVICE_ADD("ym1", YM2203, 1500000)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.60)
-
- MCFG_DEVICE_ADD("ym2", YM3812, 3000000)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
-
- MCFG_DEVICE_ADD("msm", MSM5205, 384000)
- MCFG_MSM5205_VCLK_CB(WRITELINE(*this, pcktgal_state, adpcm_int)) // interrupt function
- MCFG_MSM5205_PRESCALER_SELECTOR(S48_4B) // 8kHz
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.70)
-MACHINE_CONFIG_END
+ YM2203(config, "ym1", 1500000).add_route(ALL_OUTPUTS, "mono", 0.60);
+ YM3812(config, "ym2", 3000000).add_route(ALL_OUTPUTS, "mono", 1.00);
+ MSM5205(config, m_msm, 384000);
+ m_msm->vck_legacy_callback().set(FUNC(pcktgal_state::adpcm_int));
+ m_msm->set_prescaler_selector(msm5205_device::S48_4B); // 8kHz
+ m_msm->add_route(ALL_OUTPUTS, "mono", 0.70);
+}
-MACHINE_CONFIG_START(pcktgal_state::bootleg)
+void pcktgal_state::bootleg(machine_config &config)
+{
pcktgal(config);
- MCFG_GFXDECODE_MODIFY("gfxdecode", gfx_bootleg)
- MCFG_SCREEN_MODIFY("screen")
- MCFG_SCREEN_UPDATE_DRIVER(pcktgal_state, screen_update_pcktgalb)
-MACHINE_CONFIG_END
+ m_gfxdecode->set_info(gfx_bootleg);
+ subdevice<screen_device>("screen")->set_screen_update(FUNC(pcktgal_state::screen_update_pcktgalb));
+}
-MACHINE_CONFIG_START(pcktgal_state::pcktgal2)
+void pcktgal_state::pcktgal2(machine_config &config)
+{
pcktgal(config);
- MCFG_DEVICE_REMOVE("audiocpu")
- MCFG_DEVICE_ADD("audiocpu", M6502, 1500000) /* doesn't use the encrypted 222 */
- MCFG_DEVICE_PROGRAM_MAP(pcktgal_sound_map)
-MACHINE_CONFIG_END
+ M6502(config.replace(), m_audiocpu, 1500000); /* doesn't use the encrypted 222 */
+ m_audiocpu->set_addrmap(AS_PROGRAM, &pcktgal_state::pcktgal_sound_map);
+}
/***************************************************************************/
diff --git a/src/mame/drivers/pcm.cpp b/src/mame/drivers/pcm.cpp
index e8dc1e64561..02d5f704f9e 100644
--- a/src/mame/drivers/pcm.cpp
+++ b/src/mame/drivers/pcm.cpp
@@ -256,7 +256,8 @@ static GFXDECODE_START( gfx_pcm )
GFXDECODE_ENTRY( "chargen", 0x0000, pcm_charlayout, 0, 1 )
GFXDECODE_END
-MACHINE_CONFIG_START(pcm_state::pcm)
+void pcm_state::pcm(machine_config &config)
+{
/* basic machine hardware */
Z80(config, m_maincpu, XTAL(10'000'000) /4);
m_maincpu->set_addrmap(AS_PROGRAM, &pcm_state::pcm_mem);
@@ -264,15 +265,15 @@ MACHINE_CONFIG_START(pcm_state::pcm)
m_maincpu->set_daisy_config(pcm_daisy_chain);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(50)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */
- MCFG_SCREEN_UPDATE_DRIVER(pcm_state, screen_update)
- MCFG_SCREEN_SIZE(64*8, 16*8)
- MCFG_SCREEN_VISIBLE_AREA(0, 64*8-1, 0, 16*8-1)
- MCFG_SCREEN_PALETTE("palette")
-
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_pcm)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(50);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */
+ screen.set_screen_update(FUNC(pcm_state::screen_update));
+ screen.set_size(64*8, 16*8);
+ screen.set_visarea(0, 64*8-1, 0, 16*8-1);
+ screen.set_palette("palette");
+
+ GFXDECODE(config, "gfxdecode", "palette", gfx_pcm);
PALETTE(config, "palette", palette_device::MONOCHROME);
/* Sound */
@@ -282,7 +283,7 @@ MACHINE_CONFIG_START(pcm_state::pcm)
/* Devices */
K7659_KEYBOARD(config, K7659_KEYBOARD_TAG, 0);
- MCFG_CASSETTE_ADD("cassette")
+ CASSETTE(config, m_cass);
Z80PIO(config, m_pio_u, XTAL(10'000'000)/4);
m_pio_u->out_int_callback().set_inputline(m_maincpu, INPUT_LINE_IRQ0);
@@ -304,7 +305,7 @@ MACHINE_CONFIG_START(pcm_state::pcm)
m_ctc_s->zc_callback<0>().append("sio", FUNC(z80sio_device::txca_w));
m_ctc_s->zc_callback<1>().set("sio", FUNC(z80sio_device::rxtxcb_w));
m_ctc_s->zc_callback<2>().set(FUNC(pcm_state::pcm_82_w)); // speaker
-MACHINE_CONFIG_END
+}
/* ROM definition */
ROM_START( pcm )
diff --git a/src/mame/drivers/pcw.cpp b/src/mame/drivers/pcw.cpp
index 43f851910ec..1cb0b1f986d 100644
--- a/src/mame/drivers/pcw.cpp
+++ b/src/mame/drivers/pcw.cpp
@@ -1242,7 +1242,7 @@ void pcw_state::pcw(machine_config &config)
m_keyboard_mcu->t0_in_cb().set(FUNC(pcw_state::mcu_kb_t0_r));
m_keyboard_mcu->bus_in_cb().set(FUNC(pcw_state::mcu_kb_data_r));
-// MCFG_QUANTUM_TIME(attotime::from_hz(50))
+// config.m_minimum_quantum = attotime::from_hz(50);
config.m_perfect_cpu_quantum = subtag("maincpu");
/* video hardware */
diff --git a/src/mame/drivers/pcw16.cpp b/src/mame/drivers/pcw16.cpp
index c527eb293d7..58d7340d28e 100644
--- a/src/mame/drivers/pcw16.cpp
+++ b/src/mame/drivers/pcw16.cpp
@@ -167,11 +167,11 @@ uint8_t pcw16_state::read_bank_data(uint8_t type, uint16_t offset)
}
if(type < 0x40) // first flash
{
- return m_flash0->read(machine().dummy_space(), ((type & 0x3f)*0x4000)+offset);
+ return m_flash0->read(((type & 0x3f)*0x4000)+offset);
}
else // second flash
{
- return m_flash1->read(machine().dummy_space(), ((type & 0x3f)*0x4000)+offset);
+ return m_flash1->read(((type & 0x3f)*0x4000)+offset);
}
}
}
@@ -188,11 +188,11 @@ void pcw16_state::write_bank_data(uint8_t type, uint16_t offset, uint8_t data)
return; // first four sectors are write protected
if(type < 0x40) // first flash
{
- m_flash0->write(machine().dummy_space(), ((type & 0x3f)*0x4000)+offset, data);
+ m_flash0->write(((type & 0x3f)*0x4000)+offset, data);
}
else // second flash
{
- m_flash1->write(machine().dummy_space(), ((type & 0x3f)*0x4000)+offset, data);
+ m_flash1->write(((type & 0x3f)*0x4000)+offset, data);
}
}
}
@@ -1010,12 +1010,13 @@ static void pcw16_com(device_slot_interface &device)
device.option_add("msystems_mouse", MSYSTEMS_HLE_SERIAL_MOUSE);
}
-MACHINE_CONFIG_START(pcw16_state::pcw16)
+void pcw16_state::pcw16(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, 16000000)
- MCFG_DEVICE_PROGRAM_MAP(pcw16_map)
- MCFG_DEVICE_IO_MAP(pcw16_io)
- MCFG_QUANTUM_TIME(attotime::from_hz(60))
+ Z80(config, m_maincpu, 16000000);
+ m_maincpu->set_addrmap(AS_PROGRAM, &pcw16_state::pcw16_map);
+ m_maincpu->set_addrmap(AS_IO, &pcw16_state::pcw16_io);
+ config.m_minimum_quantum = attotime::from_hz(60);
ns16550_device &uart1(NS16550(config, "ns16550_1", XTAL(1'843'200))); /* TODO: Verify uart model */
uart1.out_tx_callback().set("serport1", FUNC(rs232_port_device::write_txd));
@@ -1043,13 +1044,13 @@ MACHINE_CONFIG_START(pcw16_state::pcw16)
serport2.cts_handler().set(m_uart2, FUNC(ins8250_uart_device::cts_w));
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(50)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */
- MCFG_SCREEN_SIZE(PCW16_SCREEN_WIDTH, PCW16_SCREEN_HEIGHT)
- MCFG_SCREEN_VISIBLE_AREA(0, PCW16_SCREEN_WIDTH-1, 0, PCW16_SCREEN_HEIGHT-1)
- MCFG_SCREEN_UPDATE_DRIVER(pcw16_state, screen_update_pcw16)
- MCFG_SCREEN_PALETTE("palette")
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(50);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */
+ screen.set_size(PCW16_SCREEN_WIDTH, PCW16_SCREEN_HEIGHT);
+ screen.set_visarea(0, PCW16_SCREEN_WIDTH-1, 0, PCW16_SCREEN_HEIGHT-1);
+ screen.set_screen_update(FUNC(pcw16_state::screen_update_pcw16));
+ screen.set_palette("palette");
PALETTE(config, "palette", FUNC(pcw16_state::pcw16_colours), PCW16_NUM_COLOURS);
@@ -1063,10 +1064,10 @@ MACHINE_CONFIG_START(pcw16_state::pcw16)
PC_FDC_SUPERIO(config, m_fdc, 48_MHz_XTAL / 2);
m_fdc->intrq_wr_callback().set(FUNC(pcw16_state::fdc_interrupt));
- MCFG_FLOPPY_DRIVE_ADD("fdc:0", pcw16_floppies, "35hd", pcw16_state::floppy_formats)
- MCFG_FLOPPY_DRIVE_ADD("fdc:1", pcw16_floppies, "35hd", pcw16_state::floppy_formats)
+ FLOPPY_CONNECTOR(config, "fdc:0", pcw16_floppies, "35hd", pcw16_state::floppy_formats);
+ FLOPPY_CONNECTOR(config, "fdc:1", pcw16_floppies, "35hd", pcw16_state::floppy_formats);
- MCFG_SOFTWARE_LIST_ADD("disk_list","pcw16")
+ SOFTWARE_LIST(config, "disk_list").set_original("pcw16");
/* internal ram */
RAM(config, RAM_TAG).set_default_size("2M");
@@ -1074,13 +1075,14 @@ MACHINE_CONFIG_START(pcw16_state::pcw16)
INTEL_E28F008SA(config, "flash0");
INTEL_E28F008SA(config, "flash1");
- MCFG_AT_KEYB_ADD("at_keyboard", 3, WRITELINE(*this, pcw16_state, pcw16_keyboard_callback))
+ AT_KEYB(config, m_keyboard, pc_keyboard_device::KEYBOARD_TYPE::AT, 3);
+ m_keyboard->keypress().set(FUNC(pcw16_state::pcw16_keyboard_callback));
/* video ints */
- MCFG_TIMER_DRIVER_ADD_PERIODIC("video_timer", pcw16_state, pcw16_timer_callback, attotime::from_usec(5830))
+ TIMER(config, "video_timer").configure_periodic(FUNC(pcw16_state::pcw16_timer_callback), attotime::from_usec(5830));
/* rtc timer */
- MCFG_TIMER_DRIVER_ADD_PERIODIC("rtc_timer", pcw16_state, rtc_timer_callback, attotime::from_hz(256))
-MACHINE_CONFIG_END
+ TIMER(config, "rtc_timer").configure_periodic(FUNC(pcw16_state::rtc_timer_callback), attotime::from_hz(256));
+}
/***************************************************************************
diff --git a/src/mame/drivers/pcxt.cpp b/src/mame/drivers/pcxt.cpp
index 31105722580..db4b48940a3 100644
--- a/src/mame/drivers/pcxt.cpp
+++ b/src/mame/drivers/pcxt.cpp
@@ -494,33 +494,34 @@ static void filetto_isa8_cards(device_slot_interface &device)
}
-MACHINE_CONFIG_START(pcxt_state::filetto)
- MCFG_DEVICE_ADD("maincpu", I8088, XTAL(14'318'181)/3)
- MCFG_DEVICE_PROGRAM_MAP(filetto_map)
- MCFG_DEVICE_IO_MAP(filetto_io)
- MCFG_DEVICE_IRQ_ACKNOWLEDGE_DEVICE("mb:pic8259", pic8259_device, inta_cb)
- MCFG_PCNOPPI_MOTHERBOARD_ADD("mb","maincpu")
- MCFG_DEVICE_ADD("isa1", ISA8_SLOT, 0, "mb:isa", filetto_isa8_cards, "filetto", true) // FIXME: determine ISA bus clock
+void pcxt_state::filetto(machine_config &config)
+{
+ I8088(config, m_maincpu, XTAL(14'318'181)/3);
+ m_maincpu->set_addrmap(AS_PROGRAM, &pcxt_state::filetto_map);
+ m_maincpu->set_addrmap(AS_IO, &pcxt_state::filetto_io);
+ m_maincpu->set_irq_acknowledge_callback("mb:pic8259", FUNC(pic8259_device::inta_cb));
+ PCNOPPI_MOTHERBOARD(config, "mb", 0).set_cputag(m_maincpu);
+ ISA8_SLOT(config, "isa1", 0, "mb:isa", filetto_isa8_cards, "filetto", true); // FIXME: determine ISA bus clock
- MCFG_DEVICE_ADD("voice", HC55516, 8000000/4)//8923S-UM5100 is a HC55536 with ROM hook-up
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mb:mono", 0.60)
+ HC55516(config, "voice", 8000000/4).add_route(ALL_OUTPUTS, "mb:mono", 0.60); //8923S-UM5100 is a HC55536 with ROM hook-up
RAM(config, RAM_TAG).set_default_size("640K");
ADDRESS_MAP_BANK(config, "bank").set_map(&pcxt_state::bank_map).set_options(ENDIANNESS_LITTLE, 8, 18, 0x10000);
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(pcxt_state::tetriskr)
- MCFG_DEVICE_ADD("maincpu", I8088, XTAL(14'318'181)/3)
- MCFG_DEVICE_PROGRAM_MAP(tetriskr_map)
- MCFG_DEVICE_IO_MAP(tetriskr_io)
- MCFG_DEVICE_IRQ_ACKNOWLEDGE_DEVICE("mb:pic8259", pic8259_device, inta_cb)
- MCFG_PCNOPPI_MOTHERBOARD_ADD("mb","maincpu")
+void pcxt_state::tetriskr(machine_config &config)
+{
+ I8088(config, m_maincpu, XTAL(14'318'181)/3);
+ m_maincpu->set_addrmap(AS_PROGRAM, &pcxt_state::tetriskr_map);
+ m_maincpu->set_addrmap(AS_IO, &pcxt_state::tetriskr_io);
+ m_maincpu->set_irq_acknowledge_callback("mb:pic8259", FUNC(pic8259_device::inta_cb));
+ PCNOPPI_MOTHERBOARD(config, "mb", 0).set_cputag(m_maincpu);
- MCFG_DEVICE_ADD("isa1", ISA8_SLOT, 0, "mb:isa", filetto_isa8_cards, "tetriskr", true) // FIXME: determine ISA bus clock
+ ISA8_SLOT(config, "isa1", 0, "mb:isa", filetto_isa8_cards, "tetriskr", true); // FIXME: determine ISA bus clock
RAM(config, RAM_TAG).set_default_size("640K");
-MACHINE_CONFIG_END
+}
ROM_START( filetto )
ROM_REGION( 0x10000, "bios", 0 )
diff --git a/src/mame/drivers/pdp11.cpp b/src/mame/drivers/pdp11.cpp
index aa8dcbc9811..ec0cac1ed4f 100644
--- a/src/mame/drivers/pdp11.cpp
+++ b/src/mame/drivers/pdp11.cpp
@@ -156,7 +156,7 @@ WRITE16_MEMBER(pdp11_state::teletype_ctrl_w)
switch(offset)
{
case 3:
- m_terminal->write(space, 0, data);
+ m_terminal->write(data);
break;
}
}
@@ -367,18 +367,20 @@ void pdp11_state::pdp11(machine_config &config)
RX01(config, "rx01", 0);
}
-MACHINE_CONFIG_START(pdp11_state::pdp11ub2)
+void pdp11_state::pdp11ub2(machine_config &config)
+{
pdp11(config);
MCFG_MACHINE_RESET_OVERRIDE(pdp11_state,pdp11ub2)
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(pdp11_state::pdp11qb)
+void pdp11_state::pdp11qb(machine_config &config)
+{
pdp11(config);
MCFG_MACHINE_RESET_OVERRIDE(pdp11_state,pdp11qb)
m_maincpu->set_initial_mode(0 << 13);
m_maincpu->set_addrmap(AS_PROGRAM, &pdp11_state::pdp11qb_mem);
-MACHINE_CONFIG_END
+}
/* ROM definition */
ROM_START( pdp11ub )
diff --git a/src/mame/drivers/pegasus.cpp b/src/mame/drivers/pegasus.cpp
index 74bce94db65..77ddc422697 100644
--- a/src/mame/drivers/pegasus.cpp
+++ b/src/mame/drivers/pegasus.cpp
@@ -463,15 +463,15 @@ image_init_result pegasus_state::load_cart(device_image_interface &image, generi
void pegasus_state::machine_start()
{
if (m_exp_00->exists())
- m_maincpu->space(AS_PROGRAM).install_read_handler(0x0000, 0x0fff, read8_delegate(FUNC(generic_slot_device::read_rom),(generic_slot_device*)m_exp_00));
+ m_maincpu->space(AS_PROGRAM).install_read_handler(0x0000, 0x0fff, read8sm_delegate(FUNC(generic_slot_device::read_rom),(generic_slot_device*)m_exp_00));
if (m_exp_01->exists())
- m_maincpu->space(AS_PROGRAM).install_read_handler(0x1000, 0x1fff, read8_delegate(FUNC(generic_slot_device::read_rom),(generic_slot_device*)m_exp_01));
+ m_maincpu->space(AS_PROGRAM).install_read_handler(0x1000, 0x1fff, read8sm_delegate(FUNC(generic_slot_device::read_rom),(generic_slot_device*)m_exp_01));
if (m_exp_02->exists())
- m_maincpu->space(AS_PROGRAM).install_read_handler(0x2000, 0x2fff, read8_delegate(FUNC(generic_slot_device::read_rom),(generic_slot_device*)m_exp_02));
+ m_maincpu->space(AS_PROGRAM).install_read_handler(0x2000, 0x2fff, read8sm_delegate(FUNC(generic_slot_device::read_rom),(generic_slot_device*)m_exp_02));
if (m_exp_0c->exists())
- m_maincpu->space(AS_PROGRAM).install_read_handler(0xc000, 0xcfff, read8_delegate(FUNC(generic_slot_device::read_rom),(generic_slot_device*)m_exp_0c));
+ m_maincpu->space(AS_PROGRAM).install_read_handler(0xc000, 0xcfff, read8sm_delegate(FUNC(generic_slot_device::read_rom),(generic_slot_device*)m_exp_0c));
if (m_exp_0d->exists())
- m_maincpu->space(AS_PROGRAM).install_read_handler(0xd000, 0xdfff, read8_delegate(FUNC(generic_slot_device::read_rom),(generic_slot_device*)m_exp_0d));
+ m_maincpu->space(AS_PROGRAM).install_read_handler(0xd000, 0xdfff, read8sm_delegate(FUNC(generic_slot_device::read_rom),(generic_slot_device*)m_exp_0d));
}
void pegasus_state::machine_reset()
@@ -490,25 +490,25 @@ void pegasus_state::init_pegasus()
MACHINE_CONFIG_START(pegasus_state::pegasus)
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", MC6809, XTAL(4'000'000)) // actually a 6809C - 4MHZ clock coming in, 1MHZ internally
- MCFG_DEVICE_PROGRAM_MAP(pegasus_mem)
+ MC6809(config, m_maincpu, XTAL(4'000'000)); // actually a 6809C - 4MHZ clock coming in, 1MHZ internally
+ m_maincpu->set_addrmap(AS_PROGRAM, &pegasus_state::pegasus_mem);
- MCFG_TIMER_DRIVER_ADD_PERIODIC("pegasus_firq", pegasus_state, pegasus_firq, attotime::from_hz(400))
+ TIMER(config, "pegasus_firq").configure_periodic(FUNC(pegasus_state::pegasus_firq), attotime::from_hz(400));
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(50)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */
- MCFG_SCREEN_UPDATE_DRIVER(pegasus_state, screen_update)
- MCFG_SCREEN_SIZE(32*8, 16*16)
- MCFG_SCREEN_VISIBLE_AREA(0, 32*8-1, 0, 16*16-1)
- MCFG_SCREEN_PALETTE("palette")
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_pegasus)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(50);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */
+ screen.set_screen_update(FUNC(pegasus_state::screen_update));
+ screen.set_size(32*8, 16*16);
+ screen.set_visarea(0, 32*8-1, 0, 16*16-1);
+ screen.set_palette("palette");
+ GFXDECODE(config, "gfxdecode", "palette", gfx_pegasus);
PALETTE(config, "palette", palette_device::MONOCHROME);
/* sound hardware */
SPEAKER(config, "mono").front_center();
- WAVE(config, "wave", "cassette").add_route(ALL_OUTPUTS, "mono", 0.05);
+ WAVE(config, "wave", m_cass).add_route(ALL_OUTPUTS, "mono", 0.05);
/* devices */
PIA6821(config, m_pia_s, 0);
@@ -541,18 +541,18 @@ MACHINE_CONFIG_START(pegasus_state::pegasus)
MCFG_GENERIC_SOCKET_ADD("exp0d", generic_plain_slot, "pegasus_cart")
MCFG_GENERIC_LOAD(pegasus_state, exp0d_load)
- MCFG_CASSETTE_ADD("cassette")
- MCFG_CASSETTE_DEFAULT_STATE(CASSETTE_STOPPED|CASSETTE_MOTOR_ENABLED)
+ CASSETTE(config, m_cass);
+ m_cass->set_default_state(CASSETTE_STOPPED|CASSETTE_MOTOR_ENABLED);
/* Software lists */
- MCFG_SOFTWARE_LIST_ADD("cart_list", "pegasus_cart")
+ SOFTWARE_LIST(config, "cart_list").set_original("pegasus_cart");
MACHINE_CONFIG_END
-MACHINE_CONFIG_START(pegasus_state::pegasusm)
+void pegasus_state::pegasusm(machine_config &config)
+{
pegasus(config);
- MCFG_DEVICE_MODIFY( "maincpu" )
- MCFG_DEVICE_PROGRAM_MAP(pegasusm_mem)
-MACHINE_CONFIG_END
+ m_maincpu->set_addrmap(AS_PROGRAM, &pegasus_state::pegasusm_mem);
+}
/* ROM definition */
diff --git a/src/mame/drivers/pencil2.cpp b/src/mame/drivers/pencil2.cpp
index 624e697cc44..435f8cd3056 100644
--- a/src/mame/drivers/pencil2.cpp
+++ b/src/mame/drivers/pencil2.cpp
@@ -149,10 +149,9 @@ void pencil2_state::io_map(address_map &map)
map(0x10, 0x1f).w(FUNC(pencil2_state::port10_w));
map(0x30, 0x3f).w(FUNC(pencil2_state::port30_w));
map(0x80, 0x9f).w(FUNC(pencil2_state::port80_w));
- map(0xa0, 0xa0).mirror(0x1e).rw("tms9928a", FUNC(tms9928a_device::vram_r), FUNC(tms9928a_device::vram_w));
- map(0xa1, 0xa1).mirror(0x1e).rw("tms9928a", FUNC(tms9928a_device::register_r), FUNC(tms9928a_device::register_w));
+ map(0xa0, 0xa1).mirror(0x1e).rw("tms9928a", FUNC(tms9928a_device::read), FUNC(tms9928a_device::write));
map(0xc0, 0xdf).w(FUNC(pencil2_state::portc0_w));
- map(0xe0, 0xff).w("sn76489a", FUNC(sn76489a_device::command_w));
+ map(0xe0, 0xff).w("sn76489a", FUNC(sn76489a_device::write));
map(0xe0, 0xe0).portr("E0");
map(0xe1, 0xe1).portr("E1");
map(0xe2, 0xe2).r(FUNC(pencil2_state::porte2_r));
@@ -308,14 +307,15 @@ INPUT_PORTS_END
void pencil2_state::machine_start()
{
if (m_cart->exists())
- m_maincpu->space(AS_PROGRAM).install_read_handler(0x8000, 0xffff, read8_delegate(FUNC(generic_slot_device::read_rom),(generic_slot_device*)m_cart));
+ m_maincpu->space(AS_PROGRAM).install_read_handler(0x8000, 0xffff, read8sm_delegate(FUNC(generic_slot_device::read_rom),(generic_slot_device*)m_cart));
}
-MACHINE_CONFIG_START(pencil2_state::pencil2)
+void pencil2_state::pencil2(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, XTAL(10'738'635)/3)
- MCFG_DEVICE_PROGRAM_MAP(mem_map)
- MCFG_DEVICE_IO_MAP(io_map)
+ Z80(config, m_maincpu, XTAL(10'738'635)/3);
+ m_maincpu->set_addrmap(AS_PROGRAM, &pencil2_state::mem_map);
+ m_maincpu->set_addrmap(AS_IO, &pencil2_state::io_map);
/* video hardware */
tms9929a_device &vdp(TMS9929A(config, "tms9928a", XTAL(10'738'635)));
@@ -325,27 +325,27 @@ MACHINE_CONFIG_START(pencil2_state::pencil2)
// sound hardware
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("sn76489a", SN76489A, XTAL(10'738'635)/3) // guess
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.00)
- WAVE(config, "wave", "cassette").add_route(ALL_OUTPUTS, "mono", 0.25);
+ SN76489A(config, "sn76489a", XTAL(10'738'635)/3).add_route(ALL_OUTPUTS, "mono", 1.00); // guess
+ WAVE(config, "wave", m_cass).add_route(ALL_OUTPUTS, "mono", 0.25);
/* cassette */
- MCFG_CASSETTE_ADD( "cassette" )
- MCFG_CASSETTE_DEFAULT_STATE(CASSETTE_STOPPED | CASSETTE_MOTOR_ENABLED | CASSETTE_SPEAKER_ENABLED)
+ CASSETTE(config, m_cass);
+ m_cass->set_default_state(CASSETTE_STOPPED | CASSETTE_MOTOR_ENABLED | CASSETTE_SPEAKER_ENABLED);
/* cartridge */
- MCFG_GENERIC_CARTSLOT_ADD("cartslot", generic_plain_slot, "pencil2_cart")
+ GENERIC_CARTSLOT(config, m_cart, generic_plain_slot, "pencil2_cart");
/* printer */
- MCFG_DEVICE_ADD(m_centronics, CENTRONICS, centronics_devices, "printer")
- MCFG_CENTRONICS_ACK_HANDLER(WRITELINE(*this, pencil2_state, write_centronics_ack))
- MCFG_CENTRONICS_BUSY_HANDLER(WRITELINE(*this, pencil2_state, write_centronics_busy))
+ CENTRONICS(config, m_centronics, centronics_devices, "printer");
+ m_centronics->ack_handler().set(FUNC(pencil2_state::write_centronics_ack));
+ m_centronics->busy_handler().set(FUNC(pencil2_state::write_centronics_busy));
- MCFG_CENTRONICS_OUTPUT_LATCH_ADD("cent_data_out", "centronics")
+ output_latch_device &cent_data_out(OUTPUT_LATCH(config, "cent_data_out"));
+ m_centronics->set_output_latch(cent_data_out);
/* Software lists */
- MCFG_SOFTWARE_LIST_ADD("cart_list", "pencil2")
-MACHINE_CONFIG_END
+ SOFTWARE_LIST(config, "cart_list").set_original("pencil2");
+}
/* ROM definition */
ROM_START( pencil2 )
diff --git a/src/mame/drivers/pengadvb.cpp b/src/mame/drivers/pengadvb.cpp
index 66ca6bbaf9e..efc6dd434c5 100644
--- a/src/mame/drivers/pengadvb.cpp
+++ b/src/mame/drivers/pengadvb.cpp
@@ -54,15 +54,15 @@ public:
void init_pengadvb();
private:
- DECLARE_READ8_MEMBER(mem_r);
- DECLARE_WRITE8_MEMBER(mem_w);
- DECLARE_WRITE8_MEMBER(megarom_bank_w);
+ uint8_t mem_r(offs_t offset);
+ void mem_w(offs_t offset, uint8_t data);
+ void megarom_bank_w(offs_t offset, uint8_t data);
- DECLARE_WRITE8_MEMBER(pengadvb_psg_port_b_w);
- DECLARE_READ8_MEMBER(pengadvb_ppi_port_a_r);
- DECLARE_WRITE8_MEMBER(pengadvb_ppi_port_a_w);
- DECLARE_READ8_MEMBER(pengadvb_ppi_port_b_r);
- DECLARE_WRITE8_MEMBER(pengadvb_ppi_port_c_w);
+ void psg_port_b_w(uint8_t data);
+ uint8_t ppi_port_a_r();
+ void ppi_port_a_w(uint8_t data);
+ uint8_t ppi_port_b_r();
+ void ppi_port_c_w(uint8_t data);
virtual void machine_start() override;
virtual void machine_reset() override;
@@ -86,17 +86,17 @@ private:
***************************************************************************/
-READ8_MEMBER(pengadvb_state::mem_r)
+uint8_t pengadvb_state::mem_r(offs_t offset)
{
- return m_page[offset >> 14 & 3]->read8(space, offset);
+ return m_page[offset >> 14 & 3]->read8(offset);
}
-WRITE8_MEMBER(pengadvb_state::mem_w)
+void pengadvb_state::mem_w(offs_t offset, uint8_t data)
{
- m_page[offset >> 14 & 3]->write8(space, offset, data);
+ m_page[offset >> 14 & 3]->write8(offset, data);
}
-WRITE8_MEMBER(pengadvb_state::megarom_bank_w)
+void pengadvb_state::megarom_bank_w(offs_t offset, uint8_t data)
{
m_bank[offset >> 13 & 3]->set_entry(data & 0xf);
}
@@ -126,8 +126,7 @@ void pengadvb_state::io_mem(address_map &map)
{
map.unmap_value_high();
map.global_mask(0xff);
- map(0x98, 0x98).rw("tms9128", FUNC(tms9128_device::vram_r), FUNC(tms9128_device::vram_w));
- map(0x99, 0x99).rw("tms9128", FUNC(tms9128_device::register_r), FUNC(tms9128_device::register_w));
+ map(0x98, 0x99).rw("tms9128", FUNC(tms9128_device::read), FUNC(tms9128_device::write));
map(0xa0, 0xa1).w("aysnd", FUNC(ay8910_device::address_data_w));
map(0xa2, 0xa2).r("aysnd", FUNC(ay8910_device::data_r));
map(0xa8, 0xab).rw("ppi8255", FUNC(i8255_device::read), FUNC(i8255_device::write));
@@ -165,7 +164,7 @@ INPUT_PORTS_END
***************************************************************************/
// AY8910
-WRITE8_MEMBER(pengadvb_state::pengadvb_psg_port_b_w)
+void pengadvb_state::psg_port_b_w(uint8_t data)
{
// leftover from msx ver?
}
@@ -173,12 +172,12 @@ WRITE8_MEMBER(pengadvb_state::pengadvb_psg_port_b_w)
/**************************************************************************/
// I8255
-READ8_MEMBER(pengadvb_state::pengadvb_ppi_port_a_r)
+uint8_t pengadvb_state::ppi_port_a_r()
{
return m_primary_slot_reg;
}
-WRITE8_MEMBER(pengadvb_state::pengadvb_ppi_port_a_w)
+void pengadvb_state::ppi_port_a_w(uint8_t data)
{
if (data != m_primary_slot_reg)
{
@@ -189,7 +188,7 @@ WRITE8_MEMBER(pengadvb_state::pengadvb_ppi_port_a_w)
}
}
-READ8_MEMBER(pengadvb_state::pengadvb_ppi_port_b_r)
+uint8_t pengadvb_state::ppi_port_b_r()
{
// TODO: dipswitch
switch (m_kb_matrix_row)
@@ -204,7 +203,7 @@ READ8_MEMBER(pengadvb_state::pengadvb_ppi_port_b_r)
return 0xff;
}
-WRITE8_MEMBER(pengadvb_state::pengadvb_ppi_port_c_w)
+void pengadvb_state::ppi_port_c_w(uint8_t data)
{
m_kb_matrix_row = data & 0x0f;
}
@@ -227,10 +226,10 @@ void pengadvb_state::pengadvb(machine_config &config)
ADDRESS_MAP_BANK(config, "page3").set_map(&pengadvb_state::bank_mem).set_options(ENDIANNESS_LITTLE, 8, 18, 0x10000);
i8255_device &ppi(I8255(config, "ppi8255"));
- ppi.in_pa_callback().set(FUNC(pengadvb_state::pengadvb_ppi_port_a_r));
- ppi.out_pa_callback().set(FUNC(pengadvb_state::pengadvb_ppi_port_a_w));
- ppi.in_pb_callback().set(FUNC(pengadvb_state::pengadvb_ppi_port_b_r));
- ppi.out_pc_callback().set(FUNC(pengadvb_state::pengadvb_ppi_port_c_w));
+ ppi.in_pa_callback().set(FUNC(pengadvb_state::ppi_port_a_r));
+ ppi.out_pa_callback().set(FUNC(pengadvb_state::ppi_port_a_w));
+ ppi.in_pb_callback().set(FUNC(pengadvb_state::ppi_port_b_r));
+ ppi.out_pc_callback().set(FUNC(pengadvb_state::ppi_port_c_w));
/* video hardware */
tms9128_device &vdp(TMS9128(config, "tms9128", XTAL(10'738'635)));
@@ -243,7 +242,7 @@ void pengadvb_state::pengadvb(machine_config &config)
SPEAKER(config, "mono").front_center();
ay8910_device &aysnd(AY8910(config, "aysnd", XTAL(10'738'635)/6));
aysnd.port_a_read_callback().set_ioport("IN0");
- aysnd.port_b_write_callback().set(FUNC(pengadvb_state::pengadvb_psg_port_b_w));
+ aysnd.port_b_write_callback().set(FUNC(pengadvb_state::psg_port_b_w));
aysnd.add_route(ALL_OUTPUTS, "mono", 0.50);
}
diff --git a/src/mame/drivers/pengo.cpp b/src/mame/drivers/pengo.cpp
index 650bfb08e38..0c9efb42b7e 100644
--- a/src/mame/drivers/pengo.cpp
+++ b/src/mame/drivers/pengo.cpp
@@ -68,7 +68,9 @@
#include "cpu/z80/z80.h"
#include "machine/74259.h"
+#include "machine/gen_latch.h"
#include "machine/segacrpt_device.h"
+#include "sound/ay8910.h"
#include "screen.h"
#include "speaker.h"
@@ -86,6 +88,7 @@ public:
void pengoe(machine_config &config);
void pengou(machine_config &config);
void pengo(machine_config &config);
+ void schick(machine_config &config);
void init_penta();
@@ -100,6 +103,9 @@ private:
void decrypted_opcodes_map(address_map &map);
void jrpacmbl_map(address_map &map);
void pengo_map(address_map &map);
+ void schick_map(address_map &map);
+ void schick_audio_map(address_map &map);
+ void schick_audio_io_map(address_map &map);
};
@@ -189,7 +195,30 @@ void pengo_state::jrpacmbl_map(address_map &map)
map(0x90c0, 0x90ff).portr("P1");
}
+void pengo_state::schick_map(address_map &map) // everything needs to be verified
+{
+ map(0x0000, 0x7fff).rom();
+ map(0x8000, 0x83ff).ram().w(FUNC(pengo_state::pacman_videoram_w)).share("videoram");
+ map(0x8400, 0x87ff).ram().w(FUNC(pengo_state::pacman_colorram_w)).share("colorram");
+ map(0x8800, 0x8fef).ram().share("mainram");
+ map(0x8ff0, 0x8fff).ram().share("spriteram");
+ map(0x9020, 0x902f).writeonly().share("spriteram2");
+}
+void pengo_state::schick_audio_map(address_map &map)
+{
+ map(0x0000, 0x1fff).rom();
+ map(0x4000, 0x43ff).ram();
+ map(0x6000, 0x6000).r("soundlatch", FUNC(generic_latch_8_device::read));
+}
+
+void pengo_state::schick_audio_io_map(address_map &map)
+{
+ map.global_mask(0xff);
+ map(0x00, 0x01).w("ay1", FUNC(ay8910_device::address_data_w));
+ map(0x10, 0x11).w("ay2", FUNC(ay8910_device::address_data_w));
+ map(0x80, 0x81).w("ay3", FUNC(ay8910_device::address_data_w));
+}
/*************************************
*
@@ -286,6 +315,49 @@ static INPUT_PORTS_START( pengo )
INPUT_PORTS_END
+static INPUT_PORTS_START( schick )
+ PORT_START("IN0")
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_UNKNOWN )
+ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_UNKNOWN )
+ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNKNOWN )
+ PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNKNOWN )
+ PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_UNKNOWN )
+ PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_UNKNOWN )
+ PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNKNOWN )
+ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN )
+
+ PORT_START("IN1")
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_UNKNOWN )
+ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_UNKNOWN )
+ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNKNOWN )
+ PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNKNOWN )
+ PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_UNKNOWN )
+ PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_UNKNOWN )
+ PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNKNOWN )
+ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN )
+
+ PORT_START("SW1")
+ PORT_DIPUNKNOWN_DIPLOC(0x01, 0x01, "SW1:1")
+ PORT_DIPUNKNOWN_DIPLOC(0x02, 0x02, "SW1:2")
+ PORT_DIPUNKNOWN_DIPLOC(0x04, 0x04, "SW1:3")
+ PORT_DIPUNKNOWN_DIPLOC(0x08, 0x08, "SW1:4")
+ PORT_DIPUNKNOWN_DIPLOC(0x10, 0x10, "SW1:5")
+ PORT_DIPUNKNOWN_DIPLOC(0x20, 0x20, "SW1:6")
+ PORT_DIPUNKNOWN_DIPLOC(0x40, 0x40, "SW1:7")
+ PORT_DIPUNKNOWN_DIPLOC(0x80, 0x80, "SW1:8")
+
+ PORT_START("SW2")
+ PORT_DIPUNKNOWN_DIPLOC(0x01, 0x01, "SW2:1")
+ PORT_DIPUNKNOWN_DIPLOC(0x02, 0x02, "SW2:2")
+ PORT_DIPUNKNOWN_DIPLOC(0x04, 0x04, "SW2:3")
+ PORT_DIPUNKNOWN_DIPLOC(0x08, 0x08, "SW2:4")
+ PORT_DIPUNKNOWN_DIPLOC(0x10, 0x10, "SW2:5")
+ PORT_DIPUNKNOWN_DIPLOC(0x20, 0x20, "SW2:6")
+ PORT_DIPUNKNOWN_DIPLOC(0x40, 0x40, "SW2:7")
+ PORT_DIPUNKNOWN_DIPLOC(0x80, 0x80, "SW2:8")
+INPUT_PORTS_END
+
+
static INPUT_PORTS_START( jrpacmbl )
PORT_START("P1")
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_4WAY
@@ -452,7 +524,44 @@ void pengo_state::jrpacmbl(machine_config &config)
MCFG_VIDEO_START_OVERRIDE(pengo_state,jrpacman)
}
+void pengo_state::schick(machine_config &config) // all dividers unknown
+{
+ /* basic machine hardware */
+ Z80(config, m_maincpu, MASTER_CLOCK/6);
+ m_maincpu->set_addrmap(AS_PROGRAM, &pengo_state::schick_map);
+ m_maincpu->set_addrmap(AS_OPCODES, &pengo_state::decrypted_opcodes_map);
+
+ z80_device &audiocpu(Z80(config, "audiocpu", MASTER_CLOCK/6));
+ audiocpu.set_addrmap(AS_PROGRAM, &pengo_state::schick_audio_map);
+ audiocpu.set_addrmap(AS_IO, &pengo_state::schick_audio_io_map);
+ GENERIC_LATCH_8(config, "soundlatch");
+
+ WATCHDOG_TIMER(config, m_watchdog);
+
+ LS259(config, m_latch); // 3I
+
+ /* video hardware */
+ GFXDECODE(config, m_gfxdecode, m_palette, gfx_pengo);
+ PALETTE(config, m_palette).set_entries(128); // wrong
+
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER)); // to be verified
+ screen.set_raw(PIXEL_CLOCK, HTOTAL, HBEND, HBSTART, VTOTAL, VBEND, VBSTART);
+ screen.set_screen_update(FUNC(pengo_state::screen_update_pacman));
+ screen.set_palette(m_palette);
+ screen.screen_vblank().set(FUNC(pengo_state::vblank_irq));
+
+ MCFG_VIDEO_START_OVERRIDE(pengo_state, pengo)
+
+ /* sound hardware */
+ SPEAKER(config, "mono").front_center();
+
+ AY8910(config, "ay1", MASTER_CLOCK/12).add_route(ALL_OUTPUTS, "mono", 0.13);
+
+ AY8910(config, "ay2", MASTER_CLOCK/12).add_route(ALL_OUTPUTS, "mono", 0.13);
+
+ AY8910(config, "ay3", MASTER_CLOCK/12).add_route(ALL_OUTPUTS, "mono", 0.13);
+}
/*************************************
*
@@ -671,6 +780,24 @@ ROM_START( penta )
ROM_LOAD( "pr1636.70", 0x0100, 0x0100, CRC(77245b66) SHA1(0c4d0bee858b97632411c440bea6948a74759746) ) /* timing - not used */
ROM_END
+// MH032288 PCB. LC ('lato componenti', components side in Italian) so maybe produced in Italy?
+// A plastic block in a corner covers probably the main CPU and the decryption logic.
+// Might fit better in a different driver once decrypted
+ROM_START( schick )
+ ROM_REGION( 0x10000, "maincpu", 0 )
+ ROM_LOAD( "27c512.8d", 0x0000, 0x10000, CRC(38986329) SHA1(bfd62d6a49d25acc582e5f076833c3b22c1a7fd7) )
+
+ ROM_REGION( 0x8000, "audiocpu", 0 )
+ ROM_LOAD( "27c256.7m", 0x0000, 0x8000, CRC(694dadca) SHA1(65d436d6c8ebf6a9b5af286122e7391973d463e0) ) // identical to bombjack, but 4x
+
+ ROM_REGION( 0x10000, "gfx1", 0 )
+ ROM_LOAD( "27c256.4e", 0x0000, 0x8000, CRC(edb4a243) SHA1(64f35b5142ffb3bfbd6a2899af9d1d719b83e2a1) )
+ ROM_LOAD( "4.27c256.4f", 0x8000, 0x8000, CRC(f666a52a) SHA1(877e1112c9c9a39b55934f6a382ad35fc9bf6859) ) // only labeled ROM
+
+ ROM_REGION( 0x0400, "proms", ROMREGION_ERASEFF )
+ // currently not dumped
+ROM_END
+
ROM_START( jrpacmbl )
ROM_REGION( 0x10000, "maincpu", 0 )
@@ -790,3 +917,4 @@ GAME( 1982, pengo5, pengo, pengoe, pengo, pengo_state, empty_init, ROT
GAME( 1982, pengob, pengo, pengo, pengo, pengo_state, init_penta, ROT90, "bootleg", "Pengo (bootleg)", MACHINE_SUPPORTS_SAVE )
GAME( 1982, penta, pengo, pengo, pengo, pengo_state, init_penta, ROT90, "bootleg (Grinbee Shouji)", "Penta", MACHINE_SUPPORTS_SAVE ) // Grinbee Shouji was a subsidiary of Orca
GAME( 1983, jrpacmbl, jrpacman, jrpacmbl, jrpacmbl, pengo_state, empty_init, ROT90, "bootleg", "Jr. Pac-Man (Pengo hardware)", MACHINE_NO_COCKTAIL | MACHINE_SUPPORTS_SAVE )
+GAME( 1988, schick, 0, schick, schick, pengo_state, empty_init, ROT90, "Microhard", "Super Chick", MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE ) // encrypted, scheme suspected similar to the Penta one
diff --git a/src/mame/drivers/pentagon.cpp b/src/mame/drivers/pentagon.cpp
index 82c56cac504..54ee980e21a 100644
--- a/src/mame/drivers/pentagon.cpp
+++ b/src/mame/drivers/pentagon.cpp
@@ -276,23 +276,22 @@ GFXDECODE_END
-MACHINE_CONFIG_START(pentagon_state::pentagon)
+void pentagon_state::pentagon(machine_config &config)
+{
spectrum_128(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_CLOCK(XTAL(14'000'000) / 4)
- MCFG_DEVICE_PROGRAM_MAP(pentagon_mem)
- MCFG_DEVICE_IO_MAP(pentagon_io)
- MCFG_DEVICE_OPCODES_MAP(pentagon_switch)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", pentagon_state, pentagon_interrupt)
+ m_maincpu->set_clock(XTAL(14'000'000) / 4);
+ m_maincpu->set_addrmap(AS_PROGRAM, &pentagon_state::pentagon_mem);
+ m_maincpu->set_addrmap(AS_IO, &pentagon_state::pentagon_io);
+ m_maincpu->set_addrmap(AS_OPCODES, &pentagon_state::pentagon_switch);
+ m_maincpu->set_vblank_int("screen", FUNC(pentagon_state::pentagon_interrupt));
MCFG_MACHINE_RESET_OVERRIDE(pentagon_state, pentagon )
- MCFG_SCREEN_MODIFY("screen")
- //MCFG_SCREEN_RAW_PARAMS(XTAL(14'000'000) / 2, 448, 0, 352, 320, 0, 304)
- MCFG_SCREEN_RAW_PARAMS(XTAL(14'000'000) / 2, 448, 0, 352, 320, 0, 287)
+ //m_screen->set_raw(XTAL(14'000'000) / 2, 448, 0, 352, 320, 0, 304);
+ m_screen->set_raw(XTAL(14'000'000) / 2, 448, 0, 352, 320, 0, 287);
MCFG_VIDEO_START_OVERRIDE(pentagon_state, pentagon )
BETA_DISK(config, m_beta, 0);
- MCFG_GFXDECODE_MODIFY("gfxdecode", gfx_pentagon)
+ subdevice<gfxdecode_device>("gfxdecode")->set_info(gfx_pentagon);
SPEAKER(config, "lspeaker").front_left();
SPEAKER(config, "rspeaker").front_right();
@@ -303,10 +302,10 @@ MACHINE_CONFIG_START(pentagon_state::pentagon)
ay8912.add_route(1, "rspeaker", 0.25);
ay8912.add_route(2, "rspeaker", 0.50);
- MCFG_DEVICE_REMOVE("exp")
+ config.device_remove("exp");
- MCFG_SOFTWARE_LIST_ADD("cass_list_pen","pentagon_cass")
-MACHINE_CONFIG_END
+ SOFTWARE_LIST(config, "cass_list_pen").set_original("pentagon_cass");
+}
void pentagon_state::pent1024(machine_config &config)
{
diff --git a/src/mame/drivers/peoplepc.cpp b/src/mame/drivers/peoplepc.cpp
index 7b426d6057a..4d01fbce79e 100644
--- a/src/mame/drivers/peoplepc.cpp
+++ b/src/mame/drivers/peoplepc.cpp
@@ -243,7 +243,8 @@ static DEVICE_INPUT_DEFAULTS_START(keyboard)
DEVICE_INPUT_DEFAULTS( "RS232_STOPBITS", 0xff, RS232_STOPBITS_1 )
DEVICE_INPUT_DEFAULTS_END
-MACHINE_CONFIG_START(peoplepc_state::olypeopl)
+void peoplepc_state::olypeopl(machine_config &config)
+{
/* basic machine hardware */
I8086(config, m_maincpu, XTAL(14'745'600)/3);
m_maincpu->set_addrmap(AS_PROGRAM, &peoplepc_state::peoplepc_map);
@@ -269,11 +270,11 @@ MACHINE_CONFIG_START(peoplepc_state::olypeopl)
I8255(config, "ppi8255");
- MCFG_SCREEN_ADD_MONOCHROME("screen", RASTER, rgb_t::green())
- MCFG_SCREEN_RAW_PARAMS(XTAL(22'000'000),640,0,640,475,0,475)
- MCFG_SCREEN_UPDATE_DEVICE( "h46505", mc6845_device, screen_update )
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER, rgb_t::green()));
+ screen.set_raw(XTAL(22'000'000), 640, 0, 640, 475, 0, 475);
+ screen.set_screen_update("h46505", FUNC(mc6845_device::screen_update));
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfxdecode_device::empty)
+ GFXDECODE(config, m_gfxdecode, m_palette, gfxdecode_device::empty);
PALETTE(config, m_palette, palette_device::MONOCHROME);
h46505_device &crtc(H46505(config, "h46505", XTAL(22'000'000)/8));
@@ -287,14 +288,14 @@ MACHINE_CONFIG_START(peoplepc_state::olypeopl)
m_dmac->out_tc_cb().set(FUNC(peoplepc_state::tc_w));
m_dmac->in_memr_cb().set(FUNC(peoplepc_state::memory_read_byte));
m_dmac->out_memw_cb().set(FUNC(peoplepc_state::memory_write_byte));
- m_dmac->in_ior_cb<0>().set("upd765", FUNC(upd765a_device::mdma_r));
- m_dmac->out_iow_cb<0>().set("upd765", FUNC(upd765a_device::mdma_w));
+ m_dmac->in_ior_cb<0>().set("upd765", FUNC(upd765a_device::dma_r));
+ m_dmac->out_iow_cb<0>().set("upd765", FUNC(upd765a_device::dma_w));
UPD765A(config, m_fdc, 8'000'000, true, true);
m_fdc->intrq_wr_callback().set("pic8259_0", FUNC(pic8259_device::ir2_w));
m_fdc->drq_wr_callback().set(m_dmac, FUNC(i8257_device::dreq0_w));
- MCFG_FLOPPY_DRIVE_ADD("upd765:0", peoplepc_floppies, "525qd", peoplepc_state::floppy_formats)
- MCFG_FLOPPY_DRIVE_ADD("upd765:1", peoplepc_floppies, "525qd", peoplepc_state::floppy_formats)
+ FLOPPY_CONNECTOR(config, "upd765:0", peoplepc_floppies, "525qd", peoplepc_state::floppy_formats);
+ FLOPPY_CONNECTOR(config, "upd765:1", peoplepc_floppies, "525qd", peoplepc_state::floppy_formats);
I8251(config, m_8251key, 0);
m_8251key->rxrdy_handler().set("pic8259_1", FUNC(pic8259_device::ir1_w));
@@ -305,7 +306,7 @@ MACHINE_CONFIG_START(peoplepc_state::olypeopl)
kbd.set_option_device_input_defaults("keyboard", DEVICE_INPUT_DEFAULTS_NAME(keyboard));
I8251(config, m_8251ser, 0);
-MACHINE_CONFIG_END
+}
ROM_START( olypeopl )
ROM_REGION(0x2000,"maincpu", 0)
diff --git a/src/mame/drivers/peplus.cpp b/src/mame/drivers/peplus.cpp
index e4fed0a6e15..ac6296de55e 100644
--- a/src/mame/drivers/peplus.cpp
+++ b/src/mame/drivers/peplus.cpp
@@ -459,7 +459,7 @@ WRITE8_MEMBER(peplus_state::crtc_display_w)
m_bg_tilemap->mark_tile_dirty(m_vid_address);
/* An access here triggers a device read !*/
- m_crtc->register_r(space, 0);
+ m_crtc->register_r();
}
WRITE8_MEMBER(peplus_state::duart_w)
@@ -978,10 +978,10 @@ void peplus_state::peplus_palette(palette_device &palette) const
uint8_t const *const color_prom = memregion("proms")->base();
uint32_t const proms_size = memregion("proms")->bytes();
/* prom bits
- 7654 3210
- ---- -xxx red component.
- --xx x--- green component.
- xx-- ---- blue component.
+ 7654 3210
+ ---- -xxx red component.
+ --xx x--- green component.
+ xx-- ---- blue component.
*/
for (int i = 0; i < palette.entries(); i++)
@@ -1371,7 +1371,8 @@ void peplus_state::machine_start()
* Machine Driver *
*************************/
-MACHINE_CONFIG_START(peplus_state::peplus)
+void peplus_state::peplus(machine_config &config)
+{
// basic machine hardware
I80C32(config, m_maincpu, XTAL(20'000'000)/2); // 10MHz
m_maincpu->set_addrmap(AS_PROGRAM, &peplus_state::main_map);
@@ -1399,7 +1400,7 @@ MACHINE_CONFIG_START(peplus_state::peplus)
m_crtc->set_on_update_addr_change_callback(FUNC(peplus_state::crtc_addr), this);
m_crtc->out_vsync_callback().set(FUNC(peplus_state::crtc_vsync));
- X2404P(config, m_i2cmem);
+ I2C_X2404P(config, m_i2cmem);
// sound hardware
SPEAKER(config, "mono").front_center();
diff --git a/src/mame/drivers/perq.cpp b/src/mame/drivers/perq.cpp
index c067da028b7..9e92fad8353 100644
--- a/src/mame/drivers/perq.cpp
+++ b/src/mame/drivers/perq.cpp
@@ -29,8 +29,9 @@ private:
static INPUT_PORTS_START( perq )
INPUT_PORTS_END
-MACHINE_CONFIG_START(perq_state::perq)
-MACHINE_CONFIG_END
+void perq_state::perq(machine_config &config)
+{
+}
ROM_START( perq )
ROM_REGION( 0x10000, "maincpu", 0 )
diff --git a/src/mame/drivers/pes.cpp b/src/mame/drivers/pes.cpp
index 1e51fe6a583..eac3d5b4f8a 100644
--- a/src/mame/drivers/pes.cpp
+++ b/src/mame/drivers/pes.cpp
@@ -110,7 +110,7 @@ READ8_MEMBER( pes_state::data_to_i8031)
WRITE8_MEMBER(pes_state::data_from_i8031)
{
- m_terminal->write(space,0,data);
+ m_terminal->write(data);
#ifdef DEBUG_SERIAL_CB
fprintf(stderr,"callback: output from i8031/pes to pc/terminal: %02X\n",data);
#endif
diff --git a/src/mame/drivers/pet.cpp b/src/mame/drivers/pet.cpp
index bc66b62bb8e..c6597fcc414 100644
--- a/src/mame/drivers/pet.cpp
+++ b/src/mame/drivers/pet.cpp
@@ -530,10 +530,10 @@ void pet_state::update_speaker()
READ8_MEMBER( pet_state::read )
{
int sel = offset >> 12;
- int norom = m_exp->norom_r(space, offset, sel);
+ int norom = m_exp->norom_r(offset, sel);
uint8_t data = 0;
- data = m_exp->read(space, offset, data, sel);
+ data = m_exp->read(offset, data, sel);
switch (sel)
{
@@ -555,7 +555,7 @@ READ8_MEMBER( pet_state::read )
if (norom)
{
if (m_cart_9000 && m_cart_9000->exists())
- data = m_cart_9000->read_rom(space, offset & 0xfff);
+ data = m_cart_9000->read_rom(offset & 0xfff);
else
data = m_rom->base()[offset - 0x9000];
}
@@ -565,7 +565,7 @@ READ8_MEMBER( pet_state::read )
if (norom)
{
if (m_cart_a000 && m_cart_a000->exists())
- data = m_cart_a000->read_rom(space, offset & 0xfff);
+ data = m_cart_a000->read_rom(offset & 0xfff);
else
data = m_rom->base()[offset - 0x9000];
}
@@ -575,7 +575,7 @@ READ8_MEMBER( pet_state::read )
if (norom)
{
if (m_cart_b000 && m_cart_b000->exists())
- data = m_cart_b000->read_rom(space, offset & 0xfff);
+ data = m_cart_b000->read_rom(offset & 0xfff);
else
data = m_rom->base()[offset - 0x9000];
}
@@ -595,11 +595,11 @@ READ8_MEMBER( pet_state::read )
if (BIT(offset, 4))
{
- data &= m_pia1->read(space, offset & 0x03);
+ data &= m_pia1->read(offset & 0x03);
}
if (BIT(offset, 5))
{
- data &= m_pia2->read(space, offset & 0x03);
+ data &= m_pia2->read(offset & 0x03);
}
if (BIT(offset, 6))
{
@@ -607,7 +607,7 @@ READ8_MEMBER( pet_state::read )
}
if (m_crtc && BIT(offset, 7) && BIT(offset, 0))
{
- data &= m_crtc->register_r(space, 0);
+ data &= m_crtc->register_r();
}
}
else if (norom)
@@ -629,7 +629,7 @@ WRITE8_MEMBER( pet_state::write )
{
int sel = offset >> 12;
- m_exp->write(space, offset, data, sel);
+ m_exp->write(offset, data, sel);
switch (sel)
{
@@ -652,11 +652,11 @@ WRITE8_MEMBER( pet_state::write )
{
if (BIT(offset, 4))
{
- m_pia1->write(space, offset & 0x03, data);
+ m_pia1->write(offset & 0x03, data);
}
if (BIT(offset, 5))
{
- m_pia2->write(space, offset & 0x03, data);
+ m_pia2->write(offset & 0x03, data);
}
if (BIT(offset, 6))
{
@@ -666,11 +666,11 @@ WRITE8_MEMBER( pet_state::write )
{
if (BIT(offset, 0))
{
- m_crtc->register_w(space, 0, data);
+ m_crtc->register_w(data);
}
else
{
- m_crtc->address_w(space, 0, data);
+ m_crtc->address_w(data);
}
}
}
@@ -758,7 +758,7 @@ void cbm8296_state::read_pla2_eprom(offs_t offset, int phi2, int brw, int casena
READ8_MEMBER( cbm8296_state::read )
{
- int norom = m_exp->norom_r(space, offset, offset >> 12) && !BIT(m_cr, 7);
+ int norom = m_exp->norom_r(offset, offset >> 12) && !BIT(m_cr, 7);
int phi2 = 1, brw = 1, noscreen = 1, noio = BIT(m_cr, 6);
int ramsela = BIT(m_via_pa, 0), ramsel9 = BIT(m_via_pa, 1), ramon = BIT(m_via_pa, 2);
int cswff = 1, cs9 = 1, csa = 1, csio = 1, cse = 1, cskb = 1, fa12 = 1, fa15 = 1, casena1 = 1, casena2 = 1, endra = 1;
@@ -788,14 +788,14 @@ READ8_MEMBER( cbm8296_state::read )
if (!cs9)
{
if (m_cart_9000 && m_cart_9000->exists())
- data = m_cart_9000->read_rom(space, offset & 0xfff);
+ data = m_cart_9000->read_rom(offset & 0xfff);
else
data = m_rom->base()[offset & 0xfff];
}
if (!csa)
{
if (m_cart_a000 && m_cart_a000->exists())
- data = m_cart_a000->read_rom(space, offset & 0xfff);
+ data = m_cart_a000->read_rom(offset & 0xfff);
else
data = m_rom->base()[0x1000 | (offset & 0xfff)];
}
@@ -813,11 +813,11 @@ READ8_MEMBER( cbm8296_state::read )
if (BIT(offset, 4))
{
- data &= m_pia1->read(space, offset & 0x03);
+ data &= m_pia1->read(offset & 0x03);
}
if (BIT(offset, 5))
{
- data &= m_pia2->read(space, offset & 0x03);
+ data &= m_pia2->read(offset & 0x03);
}
if (BIT(offset, 6))
{
@@ -825,7 +825,7 @@ READ8_MEMBER( cbm8296_state::read )
}
if (BIT(offset, 7) && BIT(offset, 0))
{
- data &= m_crtc->register_r(space, 0);
+ data &= m_crtc->register_r();
}
}
@@ -839,7 +839,7 @@ READ8_MEMBER( cbm8296_state::read )
WRITE8_MEMBER( cbm8296_state::write )
{
- int norom = m_exp->norom_r(space, offset, offset >> 12) && !BIT(m_cr, 7);
+ int norom = m_exp->norom_r(offset, offset >> 12) && !BIT(m_cr, 7);
int phi2 = 1, brw = 0, noscreen = 1, noio = BIT(m_cr, 6);
int ramsela = BIT(m_via_pa, 0), ramsel9 = BIT(m_via_pa, 1), ramon = BIT(m_via_pa, 2);
int cswff = 1, cs9 = 1, csa = 1, csio = 1, cse = 1, cskb = 1, fa12 = 1, fa15 = 1, casena1 = 1, casena2 = 1, endra = 1;
@@ -868,11 +868,11 @@ WRITE8_MEMBER( cbm8296_state::write )
{
if (BIT(offset, 4))
{
- m_pia1->write(space, offset & 0x03, data);
+ m_pia1->write(offset & 0x03, data);
}
if (BIT(offset, 5))
{
- m_pia2->write(space, offset & 0x03, data);
+ m_pia2->write(offset & 0x03, data);
}
if (BIT(offset, 6))
{
@@ -882,11 +882,11 @@ WRITE8_MEMBER( cbm8296_state::write )
{
if (BIT(offset, 0))
{
- m_crtc->register_w(space, 0, data);
+ m_crtc->register_w(data);
}
else
{
- m_crtc->address_w(space, 0, data);
+ m_crtc->address_w(data);
}
}
}
@@ -1783,8 +1783,8 @@ void pet_state::base_pet_devices(machine_config &config, const char *default_dri
m_user->pl_handler().set(m_via, FUNC(via6522_device::write_pa7));
m_user->pm_handler().set(m_via, FUNC(via6522_device::write_cb2));
- quickload_image_device &quickload(QUICKLOAD(config, "quickload", 0));
- quickload.set_handler(snapquick_load_delegate(&QUICKLOAD_LOAD_NAME(pet_state, cbm_pet), this), "p00,prg", CBM_QUICKLOAD_DELAY_SECONDS);
+ quickload_image_device &quickload(QUICKLOAD(config, "quickload"));
+ quickload.set_handler(snapquick_load_delegate(&QUICKLOAD_LOAD_NAME(pet_state, cbm_pet), this), "p00,prg", CBM_QUICKLOAD_DELAY);
quickload.set_interface("cbm_quik");
SOFTWARE_LIST(config, "cass_list").set_original("pet_cass");
diff --git a/src/mame/drivers/peyper.cpp b/src/mame/drivers/peyper.cpp
index c81928a9184..f3dc37a2f57 100644
--- a/src/mame/drivers/peyper.cpp
+++ b/src/mame/drivers/peyper.cpp
@@ -601,12 +601,13 @@ void peyper_state::machine_reset()
}
-MACHINE_CONFIG_START(peyper_state::peyper)
+void peyper_state::peyper(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, 2'500'000)
- MCFG_DEVICE_PROGRAM_MAP(peyper_map)
- MCFG_DEVICE_IO_MAP(peyper_io)
- MCFG_DEVICE_PERIODIC_INT_DRIVER(peyper_state, irq0_line_hold, 1250)
+ Z80(config, m_maincpu, 2'500'000);
+ m_maincpu->set_addrmap(AS_PROGRAM, &peyper_state::peyper_map);
+ m_maincpu->set_addrmap(AS_IO, &peyper_state::peyper_io);
+ m_maincpu->set_periodic_int(FUNC(peyper_state::irq0_line_hold), attotime::from_hz(1250));
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
/* video hardware */
@@ -631,7 +632,7 @@ MACHINE_CONFIG_START(peyper_state::peyper)
kbdc.in_rl_callback().set(FUNC(peyper_state::sw_r)); // kbd RL lines
kbdc.in_shift_callback().set_constant(1); // Shift key
kbdc.in_ctrl_callback().set_constant(1);
-MACHINE_CONFIG_END
+}
// Not allowed to set up an array all at once, so we have this mess
void peyper_state::init_peyper()
diff --git a/src/mame/drivers/pg685.cpp b/src/mame/drivers/pg685.cpp
index 2778847fd66..fc4beba17ad 100644
--- a/src/mame/drivers/pg685.cpp
+++ b/src/mame/drivers/pg685.cpp
@@ -422,11 +422,12 @@ void pg685_state::pg685_module(machine_config &config)
MM58167(config, "rtc", XTAL(32'768));
}
-MACHINE_CONFIG_START(pg685_state::pg675)
+void pg685_state::pg675(machine_config &config)
+{
// main cpu
- MCFG_DEVICE_ADD("maincpu", I8088, XTAL(15'000'000) / 3)
- MCFG_DEVICE_PROGRAM_MAP(pg675_mem)
- MCFG_DEVICE_IRQ_ACKNOWLEDGE_DEVICE("mainpic", pic8259_device, inta_cb)
+ I8088(config, m_maincpu, XTAL(15'000'000) / 3);
+ m_maincpu->set_addrmap(AS_PROGRAM, &pg685_state::pg675_mem);
+ m_maincpu->set_irq_acknowledge_callback("mainpic", FUNC(pic8259_device::inta_cb));
pic8259_device &mainpic(PIC8259(config, "mainpic", 0));
mainpic.out_int_callback().set_inputline(m_maincpu, 0);
@@ -437,9 +438,9 @@ MACHINE_CONFIG_START(pg685_state::pg675)
// ram
// video hardware
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_RAW_PARAMS(12288000, 882, 0, 720, 370, 0, 350 ) // not real values
- MCFG_SCREEN_UPDATE_DEVICE( "crtc", mc6845_device, screen_update )
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_raw(12288000, 882, 0, 720, 370, 0, 350 ); // not real values
+ screen.set_screen_update("crtc", FUNC(mc6845_device::screen_update));
mc6845_device &crtc(MC6845(config, "crtc", 12288000));
crtc.set_screen("screen");
@@ -452,7 +453,7 @@ MACHINE_CONFIG_START(pg685_state::pg675)
// devices
pg685_module(config);
- MCFG_DEVICE_ADD("mainuart", I8251, XTAL(12'288'000) / 6) // divider guessed
+ I8251(config, "mainuart", XTAL(12'288'000) / 6); // divider guessed
// rs232 port
@@ -465,18 +466,16 @@ MACHINE_CONFIG_START(pg685_state::pg675)
// floppy
// m_fdc->intrq_wr_callback(FUNC(zorba_state::fdc_intrq_w));
// m_fdc->drq_wr_callback(FUNC(zorba_state::fdc_drq_w));
- MCFG_FLOPPY_DRIVE_ADD("fdc:0", pg675_floppies, "525dd", floppy_image_device::default_floppy_formats)
- MCFG_FLOPPY_DRIVE_SOUND(true)
- MCFG_FLOPPY_DRIVE_ADD("fdc:1", pg675_floppies, "525dd", floppy_image_device::default_floppy_formats)
- MCFG_FLOPPY_DRIVE_SOUND(true)
-
-MACHINE_CONFIG_END
+ FLOPPY_CONNECTOR(config, "fdc:0", pg675_floppies, "525dd", floppy_image_device::default_floppy_formats).enable_sound(true);
+ FLOPPY_CONNECTOR(config, "fdc:1", pg675_floppies, "525dd", floppy_image_device::default_floppy_formats).enable_sound(true);
+}
-MACHINE_CONFIG_START(pg685_state::pg685)
+void pg685_state::pg685(machine_config &config)
+{
// main cpu
- MCFG_DEVICE_ADD("maincpu", V20, XTAL(15'000'000) / 3)
- MCFG_DEVICE_PROGRAM_MAP(pg685_mem)
- MCFG_DEVICE_IRQ_ACKNOWLEDGE_DEVICE("mainpic", pic8259_device, inta_cb)
+ V20(config, m_maincpu, XTAL(15'000'000) / 3);
+ m_maincpu->set_addrmap(AS_PROGRAM, &pg685_state::pg685_mem);
+ m_maincpu->set_irq_acknowledge_callback("mainpic", FUNC(pic8259_device::inta_cb));
pic8259_device &mainpic(PIC8259(config, "mainpic", 0));
mainpic.out_int_callback().set_inputline(m_maincpu, 0);
@@ -487,9 +486,9 @@ MACHINE_CONFIG_START(pg685_state::pg685)
// ram
// video hardware
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_RAW_PARAMS(12288000, 882, 0, 720, 370, 0, 350 ) // not real values
- MCFG_SCREEN_UPDATE_DEVICE( "crtc", mc6845_device, screen_update )
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_raw(12288000, 882, 0, 720, 370, 0, 350 ); // not real values
+ screen.set_screen_update("crtc", FUNC(mc6845_device::screen_update));
mc6845_device &crtc(MC6845(config, "crtc", 12288000));
crtc.set_screen("screen");
@@ -503,7 +502,7 @@ MACHINE_CONFIG_START(pg685_state::pg685)
pg685_backplane(config);
pg685_module(config);
- MCFG_DEVICE_ADD("mainuart", I8251, XTAL(12'288'000) / 6) // divider guessed
+ I8251(config, "mainuart", XTAL(12'288'000) / 6); // divider guessed
// rs232 port
@@ -516,19 +515,19 @@ MACHINE_CONFIG_START(pg685_state::pg685)
// floppy
// m_fdc->drq_wr_callback(FUNC(zorba_state::fdc_drq_w));
- MCFG_FLOPPY_DRIVE_ADD("fdc:0", pg685_floppies, "525qd", floppy_image_device::default_floppy_formats)
- MCFG_FLOPPY_DRIVE_SOUND(true)
+ FLOPPY_CONNECTOR(config, "fdc:0", pg685_floppies, "525qd", floppy_image_device::default_floppy_formats).enable_sound(true);
// harddisk
wd2010_device& hdc(WD2010(config, "hdc", XTAL(10'000'000) / 2)); // divider guessed
hdc.out_intrq_callback().set("mainpic", FUNC(pic8259_device::ir3_w));
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(pg685_state::pg685oua12)
+void pg685_state::pg685oua12(machine_config &config)
+{
// main cpu
- MCFG_DEVICE_ADD("maincpu", I80286, XTAL(20'000'000) / 2)
- MCFG_DEVICE_PROGRAM_MAP(pg685oua12_mem)
- MCFG_DEVICE_IRQ_ACKNOWLEDGE_DEVICE("mainpic", pic8259_device, inta_cb)
+ I80286(config, m_maincpu, XTAL(20'000'000) / 2);
+ m_maincpu->set_addrmap(AS_PROGRAM, &pg685_state::pg685oua12_mem);
+ m_maincpu->set_irq_acknowledge_callback("mainpic", FUNC(pic8259_device::inta_cb));
pic8259_device &mainpic(PIC8259(config, "mainpic", 0));
mainpic.out_int_callback().set_inputline(m_maincpu, 0);
@@ -539,9 +538,9 @@ MACHINE_CONFIG_START(pg685_state::pg685oua12)
// ram
// video hardware
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_RAW_PARAMS(12288000, 882, 0, 720, 370, 0, 350 ) // not real values
- MCFG_SCREEN_UPDATE_DEVICE( "crtc", mc6845_device, screen_update )
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_raw(12288000, 882, 0, 720, 370, 0, 350 ); // not real values
+ screen.set_screen_update("crtc", FUNC(mc6845_device::screen_update));
mc6845_device &crtc(MC6845(config, "crtc", 12288000));
crtc.set_screen("screen");
@@ -555,7 +554,7 @@ MACHINE_CONFIG_START(pg685_state::pg685oua12)
pg685_backplane(config);
pg685_module(config);
- MCFG_DEVICE_ADD("mainuart", I8251, 12288000 / 6) // wrong
+ I8251(config, "mainuart", 12288000 / 6); // wrong
// rs232 port
@@ -567,14 +566,12 @@ MACHINE_CONFIG_START(pg685_state::pg685oua12)
// floppy
// m_fdc->drq_wr_callback(FUNC(zorba_state::fdc_drq_w));
- MCFG_FLOPPY_DRIVE_ADD("fdc:0", pg685_floppies, "525qd", floppy_image_device::default_floppy_formats)
- MCFG_FLOPPY_DRIVE_SOUND(true)
+ FLOPPY_CONNECTOR(config, "fdc:0", pg685_floppies, "525qd", floppy_image_device::default_floppy_formats).enable_sound(true);
// harddisk
wd2010_device& hdc(WD2010(config, "hdc", XTAL(10'000'000) / 2)); // divider guessed
hdc.out_intrq_callback().set("mainpic", FUNC(pic8259_device::ir3_w));
-
-MACHINE_CONFIG_END
+}
//**************************************************************************
diff --git a/src/mame/drivers/pgm.cpp b/src/mame/drivers/pgm.cpp
index 188c1103104..2f3ac8a9cf8 100644
--- a/src/mame/drivers/pgm.cpp
+++ b/src/mame/drivers/pgm.cpp
@@ -490,7 +490,7 @@ TIMER_DEVICE_CALLBACK_MEMBER(pgm_state::pgm_interrupt)
{
int scanline = param;
-// already being generated by MCFG_DEVICE_VBLANK_INT_DRIVER("screen", pgm_state, irq6_line_hold)
+// already being generated by m_maincpu->set_vblank_int("screen", FUNC(pgm_state::irq6_line_hold));
// if(scanline == 224)
// m_maincpu->set_input_line(6, HOLD_LINE);
diff --git a/src/mame/drivers/pgm3.cpp b/src/mame/drivers/pgm3.cpp
index 4d3fa198943..ba95a80a902 100644
--- a/src/mame/drivers/pgm3.cpp
+++ b/src/mame/drivers/pgm3.cpp
@@ -104,25 +104,25 @@ void pgm3_state::machine_reset()
{
}
-MACHINE_CONFIG_START(pgm3_state::pgm3)
-
+void pgm3_state::pgm3(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", ARM9, 800000000) // wrong, see notes at top of driver
- MCFG_DEVICE_PROGRAM_MAP(pgm3_map)
- MCFG_DEVICE_DISABLE()
+ ARM9(config, m_maincpu, 800000000); // wrong, see notes at top of driver
+ m_maincpu->set_addrmap(AS_PROGRAM, &pgm3_state::pgm3_map);
+ m_maincpu->set_disable();
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(1280, 720)
- MCFG_SCREEN_VISIBLE_AREA(0, 1280-1, 0, 720-1)
- MCFG_SCREEN_UPDATE_DRIVER(pgm3_state, screen_update_pgm3)
- MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE(*this, pgm3_state, screen_vblank_pgm3))
- MCFG_SCREEN_PALETTE("palette")
-
- MCFG_PALETTE_ADD("palette", 0x1000)
-MACHINE_CONFIG_END
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(1280, 720);
+ screen.set_visarea(0, 1280-1, 0, 720-1);
+ screen.set_screen_update(FUNC(pgm3_state::screen_update_pgm3));
+ screen.screen_vblank().set(FUNC(pgm3_state::screen_vblank_pgm3));
+ screen.set_palette("palette");
+
+ PALETTE(config, "palette").set_entries(0x1000);
+}
ROM_START( kov3hd )
ROM_REGION( 0x04000, "maincpu", ROMREGION_ERASE00 )
diff --git a/src/mame/drivers/phc25.cpp b/src/mame/drivers/phc25.cpp
index ca346dd36c0..ce75201c8c5 100644
--- a/src/mame/drivers/phc25.cpp
+++ b/src/mame/drivers/phc25.cpp
@@ -308,11 +308,12 @@ void phc25_state::video_start()
/* Machine Driver */
-MACHINE_CONFIG_START(phc25_state::phc25)
+void phc25_state::phc25(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD(Z80_TAG, Z80, XTAL(4'000'000))
- MCFG_DEVICE_PROGRAM_MAP(phc25_mem)
- MCFG_DEVICE_IO_MAP(phc25_io)
+ Z80(config, m_maincpu, XTAL(4'000'000));
+ m_maincpu->set_addrmap(AS_PROGRAM, &phc25_state::phc25_mem);
+ m_maincpu->set_addrmap(AS_IO, &phc25_state::phc25_io);
/* sound hardware */
SPEAKER(config, "mono").front_center();
@@ -320,51 +321,56 @@ MACHINE_CONFIG_START(phc25_state::phc25)
psg.port_a_read_callback().set_ioport("JOY0");
psg.port_b_read_callback().set_ioport("JOY1");
psg.add_route(ALL_OUTPUTS, "mono", 1.00);
- WAVE(config, "wave", "cassette").add_route(ALL_OUTPUTS, "mono", 0.15);
+ WAVE(config, "wave", m_cassette).add_route(ALL_OUTPUTS, "mono", 0.15);
/* devices */
- MCFG_CASSETTE_ADD("cassette")
- MCFG_CASSETTE_FORMATS(phc25_cassette_formats)
- MCFG_CASSETTE_DEFAULT_STATE(CASSETTE_PLAY | CASSETTE_MOTOR_DISABLED | CASSETTE_SPEAKER_ENABLED)
- MCFG_CASSETTE_INTERFACE("phc25_cass")
+ CASSETTE(config, m_cassette);
+ m_cassette->set_formats(phc25_cassette_formats);
+ m_cassette->set_default_state(CASSETTE_PLAY | CASSETTE_MOTOR_DISABLED | CASSETTE_SPEAKER_ENABLED);
+ m_cassette->set_interface("phc25_cass");
- MCFG_DEVICE_ADD(m_centronics, CENTRONICS, centronics_devices, "printer")
- MCFG_CENTRONICS_BUSY_HANDLER(WRITELINE(*this, phc25_state, write_centronics_busy))
+ CENTRONICS(config, m_centronics, centronics_devices, "printer");
+ m_centronics->busy_handler().set(FUNC(phc25_state::write_centronics_busy));
- MCFG_CENTRONICS_OUTPUT_LATCH_ADD("cent_data_out", CENTRONICS_TAG)
+ output_latch_device &cent_data_out(OUTPUT_LATCH(config, "cent_data_out"));
+ m_centronics->set_output_latch(cent_data_out);
/* internal ram */
RAM(config, RAM_TAG).set_default_size("16K");
/* software lists */
- MCFG_SOFTWARE_LIST_ADD("cass_list", "phc25_cass")
-MACHINE_CONFIG_END
+ SOFTWARE_LIST(config, "cass_list").set_original("phc25_cass");
+}
-MACHINE_CONFIG_START(phc25_state::pal)
+void phc25_state::pal(machine_config &config)
+{
phc25(config);
/* video hardware */
- MCFG_SCREEN_MC6847_PAL_ADD(SCREEN_TAG, MC6847_TAG)
-
- MCFG_DEVICE_ADD(MC6847_TAG, MC6847_PAL, XTAL(4'433'619))
- MCFG_MC6847_FSYNC_CALLBACK(WRITELINE(*this, phc25_state, irq_w))
- MCFG_MC6847_INPUT_CALLBACK(READ8(*this, phc25_state, video_ram_r))
- MCFG_MC6847_CHARROM_CALLBACK(phc25_state, pal_char_rom_r)
- MCFG_MC6847_FIXED_MODE(mc6847_pal_device::MODE_GM2 | mc6847_pal_device::MODE_GM1 | mc6847_pal_device::MODE_INTEXT)
+ SCREEN(config, "screen", SCREEN_TYPE_RASTER);
+
+ MC6847_PAL(config, m_vdg, XTAL(4'433'619));
+ m_vdg->set_screen("screen");
+ m_vdg->fsync_wr_callback().set(FUNC(phc25_state::irq_w));
+ m_vdg->input_callback().set(FUNC(phc25_state::video_ram_r));
+ m_vdg->set_get_char_rom(FUNC(phc25_state::pal_char_rom_r));
+ m_vdg->set_get_fixed_mode(mc6847_pal_device::MODE_GM2 | mc6847_pal_device::MODE_GM1 | mc6847_pal_device::MODE_INTEXT);
// other lines not connected
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(phc25_state::ntsc)
+void phc25_state::ntsc(machine_config &config)
+{
phc25(config);
/* video hardware */
- MCFG_SCREEN_MC6847_NTSC_ADD(SCREEN_TAG, MC6847_TAG)
-
- MCFG_DEVICE_ADD(MC6847_TAG, MC6847_NTSC, XTAL(3'579'545))
- MCFG_MC6847_FSYNC_CALLBACK(WRITELINE(*this, phc25_state, irq_w))
- MCFG_MC6847_INPUT_CALLBACK(READ8(*this, phc25_state, video_ram_r))
- MCFG_MC6847_CHARROM_CALLBACK(phc25_state, ntsc_char_rom_r)
- MCFG_MC6847_FIXED_MODE(mc6847_ntsc_device::MODE_GM2 | mc6847_ntsc_device::MODE_GM1 | mc6847_ntsc_device::MODE_INTEXT)
+ SCREEN(config, "screen", SCREEN_TYPE_RASTER);
+
+ MC6847_NTSC(config, m_vdg, XTAL(3'579'545));
+ m_vdg->set_screen("screen");
+ m_vdg->fsync_wr_callback().set(FUNC(phc25_state::irq_w));
+ m_vdg->input_callback().set(FUNC(phc25_state::video_ram_r));
+ m_vdg->set_get_char_rom(FUNC(phc25_state::ntsc_char_rom_r));
+ m_vdg->set_get_fixed_mode(mc6847_ntsc_device::MODE_GM2 | mc6847_ntsc_device::MODE_GM1 | mc6847_ntsc_device::MODE_INTEXT);
// other lines not connected
-MACHINE_CONFIG_END
+}
/* ROMs */
diff --git a/src/mame/drivers/photon.cpp b/src/mame/drivers/photon.cpp
index a895d38de4c..8dcb71f8453 100644
--- a/src/mame/drivers/photon.cpp
+++ b/src/mame/drivers/photon.cpp
@@ -214,23 +214,23 @@ uint32_t photon_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap
return video_update(screen, bitmap, cliprect, memregion("maincpu")->base());
}
-MACHINE_CONFIG_START(photon_state::photon)
-
+void photon_state::photon(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu",I8080, 1780000)
- MCFG_DEVICE_PROGRAM_MAP(pk8000_mem)
- MCFG_DEVICE_IO_MAP(pk8000_io)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", photon_state, interrupt)
- MCFG_DEVICE_IRQ_ACKNOWLEDGE_DRIVER(photon_state, irq_callback)
+ I8080(config, m_maincpu, 1780000);
+ m_maincpu->set_addrmap(AS_PROGRAM, &photon_state::pk8000_mem);
+ m_maincpu->set_addrmap(AS_IO, &photon_state::pk8000_io);
+ m_maincpu->set_vblank_int("screen", FUNC(photon_state::interrupt));
+ m_maincpu->set_irq_acknowledge_callback(FUNC(photon_state::irq_callback));
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(50)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */
- MCFG_SCREEN_SIZE(256+32, 192+32)
- MCFG_SCREEN_VISIBLE_AREA(0, 256+32-1, 0, 192+32-1)
- MCFG_SCREEN_UPDATE_DRIVER(photon_state, screen_update)
- MCFG_SCREEN_PALETTE("palette")
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(50);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */
+ screen.set_size(256+32, 192+32);
+ screen.set_visarea(0, 256+32-1, 0, 192+32-1);
+ screen.set_screen_update(FUNC(photon_state::screen_update));
+ screen.set_palette("palette");
PALETTE(config, "palette", FUNC(photon_state::pk8000_palette), 16);
@@ -247,7 +247,7 @@ MACHINE_CONFIG_START(photon_state::photon)
/* audio hardware */
SPEAKER(config, "mono").front_center();
SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.50);
-MACHINE_CONFIG_END
+}
/*
Dump was made using custom adaptor, hence it is marked as bad dump.
diff --git a/src/mame/drivers/photon2.cpp b/src/mame/drivers/photon2.cpp
index 2ca17daaecf..9d4f207ee6d 100644
--- a/src/mame/drivers/photon2.cpp
+++ b/src/mame/drivers/photon2.cpp
@@ -358,29 +358,30 @@ void photon2_state::machine_start()
save_item(NAME(m_nmi_enable));
}
-MACHINE_CONFIG_START(photon2_state::photon2)
+void photon2_state::photon2(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, 3500000) /* 3.5 MHz */
- MCFG_DEVICE_PROGRAM_MAP(spectrum_mem)
- MCFG_DEVICE_IO_MAP(spectrum_io)
- MCFG_TIMER_DRIVER_ADD_SCANLINE("scantimer", photon2_state, spec_interrupt_hack, "screen", 0, 1)
+ Z80(config, m_maincpu, 3500000); /* 3.5 MHz */
+ m_maincpu->set_addrmap(AS_PROGRAM, &photon2_state::spectrum_mem);
+ m_maincpu->set_addrmap(AS_IO, &photon2_state::spectrum_io);
+ TIMER(config, "scantimer").configure_scanline(FUNC(photon2_state::spec_interrupt_hack), "screen", 0, 1);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(50.08)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */
- MCFG_SCREEN_SIZE(SPEC_SCREEN_WIDTH, SPEC_SCREEN_HEIGHT)
- MCFG_SCREEN_VISIBLE_AREA(0, SPEC_SCREEN_WIDTH-1, 0, SPEC_SCREEN_HEIGHT-1)
- MCFG_SCREEN_UPDATE_DRIVER(photon2_state, screen_update_spectrum)
- MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE(*this, photon2_state, screen_vblank_spectrum))
- MCFG_SCREEN_PALETTE("palette")
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(50.08);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */
+ screen.set_size(SPEC_SCREEN_WIDTH, SPEC_SCREEN_HEIGHT);
+ screen.set_visarea(0, SPEC_SCREEN_WIDTH-1, 0, SPEC_SCREEN_HEIGHT-1);
+ screen.set_screen_update(FUNC(photon2_state::screen_update_spectrum));
+ screen.screen_vblank().set(FUNC(photon2_state::screen_vblank_spectrum));
+ screen.set_palette("palette");
PALETTE(config, "palette", FUNC(photon2_state::photon2_palette), 16);
/* sound hardware */
SPEAKER(config, "mono").front_center();
SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.50);
-MACHINE_CONFIG_END
+}
/*************************************
*
diff --git a/src/mame/drivers/photoply.cpp b/src/mame/drivers/photoply.cpp
index 9d911acd4fb..0e8e8d69e10 100644
--- a/src/mame/drivers/photoply.cpp
+++ b/src/mame/drivers/photoply.cpp
@@ -302,14 +302,14 @@ GFXDECODE_END
MACHINE_CONFIG_START(photoply_state::photoply)
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", I486DX4, 75000000) /* I486DX4, 75 or 100 Mhz */
- MCFG_DEVICE_PROGRAM_MAP(photoply_map)
- MCFG_DEVICE_IO_MAP(photoply_io)
- MCFG_DEVICE_IRQ_ACKNOWLEDGE_DEVICE("pic8259_1", pic8259_device, inta_cb)
+ I486DX4(config, m_maincpu, 75000000); /* I486DX4, 75 or 100 Mhz */
+ m_maincpu->set_addrmap(AS_PROGRAM, &photoply_state::photoply_map);
+ m_maincpu->set_addrmap(AS_IO, &photoply_state::photoply_io);
+ m_maincpu->set_irq_acknowledge_callback("pic8259_1", FUNC(pic8259_device::inta_cb));
pcat_common(config);
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "vga", gfx_photoply)
+ GFXDECODE(config, "gfxdecode", "vga", gfx_photoply);
ide_controller_32_device &ide(IDE_CONTROLLER_32(config, "ide").options(ata_devices, "hdd", nullptr, true));
ide.irq_handler().set("pic8259_2", FUNC(pic8259_device::ir6_w));
@@ -320,12 +320,11 @@ MACHINE_CONFIG_START(photoply_state::photoply)
MCFG_PCI_BUS_LEGACY_ADD("pcibus", 0)
MCFG_PCI_BUS_LEGACY_DEVICE(5, DEVICE_SELF, photoply_state, sis_pcm_r, sis_pcm_w)
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_RAW_PARAMS(XTAL(25'174'800),900,0,640,526,0,480)
- MCFG_SCREEN_UPDATE_DEVICE("vga", cirrus_gd5446_device, screen_update)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_raw(XTAL(25'174'800),900,0,640,526,0,480);
+ screen.set_screen_update("vga", FUNC(cirrus_gd5446_device::screen_update));
- MCFG_DEVICE_ADD("vga", CIRRUS_GD5446, 0)
- MCFG_VIDEO_SET_SCREEN("screen")
+ CIRRUS_GD5446(config, "vga", 0).set_screen("screen");
EEPROM_93C46_16BIT(config, "eeprom")
.write_time(attotime::from_usec(1))
diff --git a/src/mame/drivers/phunsy.cpp b/src/mame/drivers/phunsy.cpp
index 53bf403f95d..fc48c97ea3b 100644
--- a/src/mame/drivers/phunsy.cpp
+++ b/src/mame/drivers/phunsy.cpp
@@ -373,8 +373,8 @@ void phunsy_state::phunsy(machine_config &config)
CASSETTE(config, m_cass);
/* quickload */
- quickload_image_device &quickload(QUICKLOAD(config, "quickload", 0));
- quickload.set_handler(snapquick_load_delegate(&QUICKLOAD_LOAD_NAME(phunsy_state, phunsy), this), "bin", 2);
+ quickload_image_device &quickload(QUICKLOAD(config, "quickload"));
+ quickload.set_handler(snapquick_load_delegate(&QUICKLOAD_LOAD_NAME(phunsy_state, phunsy), this), "bin", attotime::from_seconds(2));
}
diff --git a/src/mame/drivers/picno.cpp b/src/mame/drivers/picno.cpp
index 497525bd842..035943a0648 100644
--- a/src/mame/drivers/picno.cpp
+++ b/src/mame/drivers/picno.cpp
@@ -66,20 +66,21 @@ void picno_state::io_map(address_map &map)
static INPUT_PORTS_START( picno )
INPUT_PORTS_END
-MACHINE_CONFIG_START(picno_state::picno)
+void picno_state::picno(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", H83002, XTAL(20'000'000)) /* TODO: correct CPU type (H8/532), crystal is a guess, divided by 2 in the cpu */
- MCFG_DEVICE_PROGRAM_MAP(mem_map)
- MCFG_DEVICE_IO_MAP(io_map)
+ H83002(config, m_maincpu, XTAL(20'000'000)); /* TODO: correct CPU type (H8/532), crystal is a guess, divided by 2 in the cpu */
+ m_maincpu->set_addrmap(AS_PROGRAM, &picno_state::mem_map);
+ m_maincpu->set_addrmap(AS_IO, &picno_state::io_map);
//MCFG_SPEAKER_STANDARD_STEREO("lspeaker", "rspeaker") // no speaker in the unit, but there's a couple of sockets on the back
//MCFG_SOUND_ROUTE(0, "lspeaker", 1.0)
//MCFG_SOUND_ROUTE(1, "rspeaker", 1.0)
- MCFG_GENERIC_CARTSLOT_ADD("cartslot", generic_linear_slot, "picno_cart")
+ GENERIC_CARTSLOT(config, "cartslot", generic_linear_slot, "picno_cart");
- MCFG_SOFTWARE_LIST_ADD("cart_list", "picno")
-MACHINE_CONFIG_END
+ SOFTWARE_LIST(config, "cart_list").set_original("picno");
+}
ROM_START( picno )
ROM_REGION(0x88000, "roms", 0)
diff --git a/src/mame/drivers/piggypas.cpp b/src/mame/drivers/piggypas.cpp
index 3d5493df5cb..400d87a235b 100644
--- a/src/mame/drivers/piggypas.cpp
+++ b/src/mame/drivers/piggypas.cpp
@@ -204,7 +204,7 @@ HD44780_PIXEL_UPDATE(piggypas_state::piggypas_pixel_update)
void piggypas_state::piggypas(machine_config &config)
{
/* basic machine hardware */
- I80C31(config, m_maincpu, XTAL(8'448'000)); // OKI M80C31F or M80C154S
+ I80C31(config, m_maincpu, 8.448_MHz_XTAL); // OKI M80C31F or M80C154S
m_maincpu->set_addrmap(AS_PROGRAM, &piggypas_state::piggypas_map);
m_maincpu->set_addrmap(AS_IO, &piggypas_state::piggypas_io);
m_maincpu->port_out_cb<1>().set(FUNC(piggypas_state::led_strobe_w));
@@ -231,7 +231,7 @@ void piggypas_state::piggypas(machine_config &config)
/* sound hardware */
SPEAKER(config, "mono").front_center();
- okim6295_device &oki(OKIM6295(config, "oki", XTAL(8'448'000) / 8, okim6295_device::PIN7_HIGH)); // clock and pin 7 not verified
+ okim6295_device &oki(OKIM6295(config, "oki", 8.448_MHz_XTAL / 8, okim6295_device::PIN7_HIGH)); // clock not verified
oki.add_route(ALL_OUTPUTS, "mono", 1.0);
i8255_device &ppi(I8255A(config, "ppi")); // OKI M82C55A-2
@@ -291,6 +291,42 @@ ROM_START( fidlstix )
ROM_LOAD( "fiddle.u14", 0x00000, 0x40000, CRC(baf4e1cd) SHA1(ae153f832cbd188e9f3f357a1a1f68cc8264d346) )
ROM_END
+/*
+
+8.448MHz Crystal
+P-80C31-16 cpu
+M6295 (Verified with DMM that Pin 7 tied to VCC)
+DS1220AD-150
+M82C55A-2
+UCN5832A
+2 Line Display LCD
+HD44780A00 (underneath board the LCD is mounted to)
+
+-----------------------------------------------------------------------------
+
+Factory Wire Mods
+
+
+Parts Side:
+
+ - Pin 1 of U25 (74LS373) pulled up and jumper wired to pin 5 of U2 (CM1232P)
+
+Solder Side:
+
+ - Ground test point near C32 jumper wired to pin 2 of J8
+ (pin 2 of J8 connected to pins 5 and 6 of L6 (CM1232P))
+
+ - Pin 1 of J1 jumper wired with a 1K +/-5% 1/4 watt resistor to pin 10 of J1
+
+*/
+ROM_START( hoopitup )
+ ROM_REGION( 0x10000, "maincpu", 0 )
+ ROM_LOAD( "us a05449-01c.u6", 0x00000, 0x08000, CRC(8fc6a07d) SHA1(c1c7ad708eb84e9801fb5acea0b3b797923886c3) )
+
+ ROM_REGION( 0x40000, "oki", 0 )
+ ROM_LOAD( "sound ad5.u14", 0x00000, 0x40000, CRC(e6f647c3) SHA1(8f208af76e5f94b5db479ecbd65922fd834250cf) )
+ROM_END
+
// bad dump of program rom
ROM_START( jackbean )
ROM_REGION( 0x10000, "maincpu", 0 )
@@ -323,16 +359,18 @@ ROM_END
// COPYRIGHT (c) 1990, 1991, 1992, DOYLE & ASSOC., INC. VERSION 04.40
-GAME( 1992, piggypas, 0, piggypas, piggypas, piggypas_state, empty_init, ROT0, "Doyle & Assoc.", "Piggy Pass (version 04.40)", MACHINE_IS_SKELETON_MECHANICAL )
+GAME( 1992, piggypas, 0, piggypas, piggypas, piggypas_state, empty_init, ROT0, "Doyle & Assoc.", "Piggy Pass (version 04.40)", MACHINE_NOT_WORKING | MACHINE_MECHANICAL )
// COPYRIGHT (c) 1990, 1991, 1992, DOYLE & ASSOC., INC. VERSION 05.22
-GAME( 1992, hoopshot, 0, piggypas, piggypas, piggypas_state, empty_init, ROT0, "Doyle & Assoc.", "Hoop Shot (version 05.22)", MACHINE_IS_SKELETON_MECHANICAL )
+GAME( 1992, hoopshot, 0, piggypas, piggypas, piggypas_state, empty_init, ROT0, "Doyle & Assoc.", "Hoop Shot (version 05.22)", MACHINE_NOT_WORKING | MACHINE_MECHANICAL )
// Quick $ilver Development Co. 10/08/96 ROUND REV 6
-GAME( 1996, rndrndqs, 0, fidlstix, piggypas, piggypas_state, empty_init, ROT0, "Quick $ilver Development Co.", "Round and Round (Rev 6) (Quick $ilver)", MACHINE_IS_SKELETON_MECHANICAL )
+GAME( 1996, rndrndqs, 0, fidlstix, piggypas, piggypas_state, empty_init, ROT0, "Quick $ilver Development Co.", "Round and Round (Rev 6) (Quick $ilver)", MACHINE_NOT_WORKING | MACHINE_MECHANICAL )
// Quick$ilver Development Co. 10/02/95 -FIDDLESTIX- REV 15T
-GAME( 1995, fidlstix, 0, fidlstix, piggypas, piggypas_state, empty_init, ROT0, "Quick $ilver Development Co.", "Fiddle Stix (1st Rev)", MACHINE_IS_SKELETON_MECHANICAL )
+GAME( 1995, fidlstix, 0, fidlstix, piggypas, piggypas_state, empty_init, ROT0, "Quick $ilver Development Co.", "Fiddle Stix (1st Rev)", MACHINE_NOT_WORKING | MACHINE_MECHANICAL )
+// Quick $ilver Development Co. 11/20/95 HoopItUp REV 23
+GAME( 1995, hoopitup, 0, fidlstix, piggypas, piggypas_state, empty_init, ROT0, "Atari Games", "Hoop it Up World Tour - 3 on 3 (Rev 23)", MACHINE_NOT_WORKING | MACHINE_MECHANICAL )
// bad dump, so version unknown
-GAME( 199?, jackbean, 0, piggypas, piggypas, piggypas_state, empty_init, ROT0, "Doyle & Assoc.", "Jack & The Beanstalk (Doyle & Assoc.?)", MACHINE_IS_SKELETON_MECHANICAL )
+GAME( 199?, jackbean, 0, piggypas, piggypas, piggypas_state, empty_init, ROT0, "Doyle & Assoc.", "Jack & The Beanstalk (Doyle & Assoc.?)", MACHINE_NOT_WORKING | MACHINE_MECHANICAL )
// bad dump, so version unknown
-GAME( 199?, dumpump, 0, piggypas, piggypas, piggypas_state, empty_init, ROT0, "Doyle & Assoc.", "Dump The Ump", MACHINE_IS_SKELETON_MECHANICAL )
+GAME( 199?, dumpump, 0, piggypas, piggypas, piggypas_state, empty_init, ROT0, "Doyle & Assoc.", "Dump The Ump", MACHINE_NOT_WORKING | MACHINE_MECHANICAL )
// bad dump, so version unknown
-GAME( 199?, 3lilpigs, 0, piggypas, piggypas, piggypas_state, empty_init, ROT0, "Doyle & Assoc.", "3 Lil' Pigs", MACHINE_IS_SKELETON_MECHANICAL )
+GAME( 199?, 3lilpigs, 0, piggypas, piggypas, piggypas_state, empty_init, ROT0, "Doyle & Assoc.", "3 Lil' Pigs", MACHINE_NOT_WORKING | MACHINE_MECHANICAL )
diff --git a/src/mame/drivers/pinball2k.cpp b/src/mame/drivers/pinball2k.cpp
index cfda2c12e4b..eda9e7d8e0d 100644
--- a/src/mame/drivers/pinball2k.cpp
+++ b/src/mame/drivers/pinball2k.cpp
@@ -605,10 +605,10 @@ void pinball2k_state::ramdac_map(address_map &map)
MACHINE_CONFIG_START(pinball2k_state::mediagx)
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", MEDIAGX, 166000000)
- MCFG_DEVICE_PROGRAM_MAP(mediagx_map)
- MCFG_DEVICE_IO_MAP(mediagx_io)
- MCFG_DEVICE_IRQ_ACKNOWLEDGE_DEVICE("pic8259_1", pic8259_device, inta_cb)
+ MEDIAGX(config, m_maincpu, 166000000);
+ m_maincpu->set_addrmap(AS_PROGRAM, &pinball2k_state::mediagx_map);
+ m_maincpu->set_addrmap(AS_IO, &pinball2k_state::mediagx_io);
+ m_maincpu->set_irq_acknowledge_callback("pic8259_1", FUNC(pic8259_device::inta_cb));
pcat_common(config);
@@ -622,14 +622,14 @@ MACHINE_CONFIG_START(pinball2k_state::mediagx)
m_ramdac->set_addrmap(0, &pinball2k_state::ramdac_map);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_SIZE(640, 480)
- MCFG_SCREEN_VISIBLE_AREA(0, 639, 0, 239)
- MCFG_SCREEN_UPDATE_DRIVER(pinball2k_state, screen_update_mediagx)
-
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_cga)
- MCFG_PALETTE_ADD("palette", 256)
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_refresh_hz(60);
+ m_screen->set_size(640, 480);
+ m_screen->set_visarea(0, 639, 0, 239);
+ m_screen->set_screen_update(FUNC(pinball2k_state::screen_update_mediagx));
+
+ GFXDECODE(config, m_gfxdecode, m_palette, gfx_cga);
+ PALETTE(config, m_palette).set_entries(256);
/* sound hardware */
SPEAKER(config, "lspeaker").front_left();
diff --git a/src/mame/drivers/pingpong.cpp b/src/mame/drivers/pingpong.cpp
index 9f03d6454fb..bd86b6567a6 100644
--- a/src/mame/drivers/pingpong.cpp
+++ b/src/mame/drivers/pingpong.cpp
@@ -103,7 +103,7 @@ void pingpong_state::pingpong_map(address_map &map)
map(0xa980, 0xa980).portr("DSW2");
map(0xa000, 0xa000).w(FUNC(pingpong_state::coin_w)); /* coin counters + irq enables */
map(0xa200, 0xa200).nopw(); /* SN76496 data latch */
- map(0xa400, 0xa400).w("snsnd", FUNC(sn76496_device::command_w)); /* trigger read */
+ map(0xa400, 0xa400).w("snsnd", FUNC(sn76496_device::write)); /* trigger read */
map(0xa600, 0xa600).w("watchdog", FUNC(watchdog_timer_device::reset_w));
}
@@ -125,7 +125,7 @@ void pingpong_state::merlinmm_map(address_map &map)
map(0xa100, 0xa100).portr("IN2");
map(0xa180, 0xa180).portr("IN3");
map(0xa200, 0xa200).nopw(); /* SN76496 data latch */
- map(0xa400, 0xa400).w("snsnd", FUNC(sn76496_device::command_w)); /* trigger read */
+ map(0xa400, 0xa400).w("snsnd", FUNC(sn76496_device::write)); /* trigger read */
map(0xa600, 0xa600).w("watchdog", FUNC(watchdog_timer_device::reset_w));
}
@@ -448,22 +448,22 @@ static GFXDECODE_START( gfx_pingpong )
GFXDECODE_END
-MACHINE_CONFIG_START(pingpong_state::pingpong)
-
+void pingpong_state::pingpong(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu",Z80,18432000/6) /* 3.072 MHz (probably) */
- MCFG_DEVICE_PROGRAM_MAP(pingpong_map)
- MCFG_TIMER_DRIVER_ADD_SCANLINE("scantimer", pingpong_state, pingpong_interrupt, "screen", 0, 1)
+ Z80(config, m_maincpu,18432000/6); /* 3.072 MHz (probably) */
+ m_maincpu->set_addrmap(AS_PROGRAM, &pingpong_state::pingpong_map);
+ TIMER(config, "scantimer").configure_scanline(FUNC(pingpong_state::pingpong_interrupt), "screen", 0, 1);
WATCHDOG_TIMER(config, "watchdog");
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(456, 262)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(pingpong_state, screen_update_pingpong)
- MCFG_SCREEN_PALETTE(m_palette)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(456, 262);
+ screen.set_visarea(0*8, 32*8-1, 2*8, 30*8-1);
+ screen.set_screen_update(FUNC(pingpong_state::screen_update_pingpong));
+ screen.set_palette(m_palette);
GFXDECODE(config, m_gfxdecode, m_palette, gfx_pingpong);
PALETTE(config, m_palette, FUNC(pingpong_state::pingpong_palette), 64*4+64*4, 32);
@@ -471,20 +471,18 @@ MACHINE_CONFIG_START(pingpong_state::pingpong)
/* sound hardware */
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("snsnd", SN76496, 18432000/8)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
-MACHINE_CONFIG_END
+ SN76496(config, "snsnd", 18432000/8).add_route(ALL_OUTPUTS, "mono", 1.0);
+}
/* too fast! */
-MACHINE_CONFIG_START(pingpong_state::merlinmm)
+void pingpong_state::merlinmm(machine_config &config)
+{
pingpong(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(merlinmm_map)
- MCFG_TIMER_MODIFY("scantimer")
- MCFG_TIMER_DRIVER_CALLBACK(pingpong_state, merlinmm_interrupt)
+ m_maincpu->set_addrmap(AS_PROGRAM, &pingpong_state::merlinmm_map);
+ subdevice<timer_device>("scantimer")->set_callback(FUNC(pingpong_state::merlinmm_interrupt));
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
-MACHINE_CONFIG_END
+}
/***************************************************************************
diff --git a/src/mame/drivers/pinkiri8.cpp b/src/mame/drivers/pinkiri8.cpp
index e7c9c751a72..d5ad19d1baa 100644
--- a/src/mame/drivers/pinkiri8.cpp
+++ b/src/mame/drivers/pinkiri8.cpp
@@ -1106,32 +1106,31 @@ static GFXDECODE_START( gfx_pinkiri8 )
GFXDECODE_ENTRY( "gfx1", 0, charlayout, 0, 0x100 )
GFXDECODE_END
-MACHINE_CONFIG_START(pinkiri8_state::pinkiri8)
- MCFG_DEVICE_ADD("maincpu",Z180,XTAL(32'000'000)/2)
- MCFG_DEVICE_PROGRAM_MAP(pinkiri8_map)
- MCFG_DEVICE_IO_MAP(pinkiri8_io)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", pinkiri8_state, nmi_line_assert)
-
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(64*8, 64*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 62*8-1, 0*8, 32*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(pinkiri8_state, screen_update_pinkiri8)
- MCFG_SCREEN_PALETTE("palette")
+void pinkiri8_state::pinkiri8(machine_config &config)
+{
+ Z180(config, m_maincpu, XTAL(32'000'000)/2);
+ m_maincpu->set_addrmap(AS_PROGRAM, &pinkiri8_state::pinkiri8_map);
+ m_maincpu->set_addrmap(AS_IO, &pinkiri8_state::pinkiri8_io);
+ m_maincpu->set_vblank_int("screen", FUNC(pinkiri8_state::nmi_line_assert));
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_pinkiri8)
- MCFG_PALETTE_ADD("palette", 0x2000)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(64*8, 64*8);
+ screen.set_visarea(0*8, 62*8-1, 0*8, 32*8-1);
+ screen.set_screen_update(FUNC(pinkiri8_state::screen_update_pinkiri8));
+ screen.set_palette(m_palette);
+ GFXDECODE(config, m_gfxdecode, m_palette, gfx_pinkiri8);
+ PALETTE(config, m_palette).set_entries(0x2000);
- MCFG_DEVICE_ADD("janshivdp", JANSHIVDP, 0)
+ JANSHIVDP(config, m_vdp, 0);
/* sound hardware */
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("oki", OKIM6295, 1056000, okim6295_device::PIN7_HIGH) // clock frequency & pin 7 not verified
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.5)
-MACHINE_CONFIG_END
+ OKIM6295(config, "oki", 1056000, okim6295_device::PIN7_HIGH).add_route(ALL_OUTPUTS, "mono", 0.5); // clock frequency & pin 7 not verified
+}
/***************************************************************************
diff --git a/src/mame/drivers/pipbug.cpp b/src/mame/drivers/pipbug.cpp
index d63fdb2149c..b045abfa294 100644
--- a/src/mame/drivers/pipbug.cpp
+++ b/src/mame/drivers/pipbug.cpp
@@ -174,8 +174,8 @@ void pipbug_state::pipbug(machine_config &config)
m_rs232->set_option_device_input_defaults("terminal", DEVICE_INPUT_DEFAULTS_NAME(terminal));
/* quickload */
- quickload_image_device &quickload(QUICKLOAD(config, "quickload", 0));
- quickload.set_handler(snapquick_load_delegate(&QUICKLOAD_LOAD_NAME(pipbug_state, pipbug), this), "pgm", 1);
+ quickload_image_device &quickload(QUICKLOAD(config, "quickload"));
+ quickload.set_handler(snapquick_load_delegate(&QUICKLOAD_LOAD_NAME(pipbug_state, pipbug), this), "pgm", attotime::from_seconds(1));
}
diff --git a/src/mame/drivers/pirates.cpp b/src/mame/drivers/pirates.cpp
index 07595c472c4..aa543f63141 100644
--- a/src/mame/drivers/pirates.cpp
+++ b/src/mame/drivers/pirates.cpp
@@ -252,32 +252,30 @@ GFXDECODE_END
/* Machine Driver + Related bits */
-MACHINE_CONFIG_START(pirates_state::pirates)
- MCFG_DEVICE_ADD("maincpu", M68000, 16000000) /* 16mhz */
- MCFG_DEVICE_PROGRAM_MAP(pirates_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", pirates_state, irq1_line_hold)
+void pirates_state::pirates(machine_config &config)
+{
+ M68000(config, m_maincpu, 32_MHz_XTAL / 2); // 16MHz verified on PCB
+ m_maincpu->set_addrmap(AS_PROGRAM, &pirates_state::pirates_map);
+ m_maincpu->set_vblank_int("screen", FUNC(pirates_state::irq1_line_hold));
EEPROM_93C46_16BIT(config, "eeprom");
GFXDECODE(config, m_gfxdecode, m_palette, gfx_pirates);
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(36*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 36*8-1, 2*8, 30*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(pirates_state, screen_update)
- MCFG_SCREEN_PALETTE(m_palette)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(36*8, 32*8);
+ screen.set_visarea(0*8, 36*8-1, 2*8, 30*8-1);
+ screen.set_screen_update(FUNC(pirates_state::screen_update));
+ screen.set_palette(m_palette);
PALETTE(config, m_palette).set_format(palette_device::xRGB_555, 0x2000);
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("oki", OKIM6295, 1333333, okim6295_device::PIN7_LOW)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
-MACHINE_CONFIG_END
-
-
+ OKIM6295(config, m_oki, 24_MHz_XTAL / 18, okim6295_device::PIN7_LOW).add_route(ALL_OUTPUTS, "mono", 1.0); // 1.3333333MHz verified on PCB
+}
/* Rom Loading */
@@ -325,27 +323,25 @@ ROM_START( piratesb )
ROM_END
-
-
ROM_START( genix )
ROM_REGION( 0x100000, "maincpu", 0 ) /* 68000 Code (encrypted) */
- ROM_LOAD16_BYTE( "1.15", 0x00000, 0x80000, CRC(d26abfb0) SHA1(4a89ba7504f86cb612796c376f359ab61ec3d902) )
- ROM_LOAD16_BYTE( "2.16", 0x00001, 0x80000, CRC(a14a25b4) SHA1(9fa64c6514bdee56b5654b001f8367283b461e8a) )
+ ROM_LOAD16_BYTE( "11.u15.15c", 0x00000, 0x80000, CRC(d26abfb0) SHA1(4a89ba7504f86cb612796c376f359ab61ec3d902) )
+ ROM_LOAD16_BYTE( "12.u16.16c", 0x00001, 0x80000, CRC(a14a25b4) SHA1(9fa64c6514bdee56b5654b001f8367283b461e8a) )
ROM_REGION( 0x200000, "gfx1", 0 ) /* GFX (encrypted) */
- ROM_LOAD( "7.34", 0x000000, 0x040000, CRC(58da8aac) SHA1(bfc8449ba842f8ceac62ebdf6005d8f19d96afa6) )
- ROM_LOAD( "9.35", 0x080000, 0x040000, CRC(96bad9a8) SHA1(4e757cca0ab157f0c935087c9702c88741bf7a79) )
- ROM_LOAD( "8.48", 0x100000, 0x040000, CRC(0ddc58b6) SHA1(d52437607695ddebfe8494fd214efd20ba72d549) )
- ROM_LOAD( "10.49",0x180000, 0x040000, CRC(2be308c5) SHA1(22fc0991557643c22f6763f186b74900a33a39e0) )
+ ROM_LOAD( "17.u34.12g", 0x000000, 0x040000, CRC(58da8aac) SHA1(bfc8449ba842f8ceac62ebdf6005d8f19d96afa6) )
+ ROM_LOAD( "19.u35.12h", 0x080000, 0x040000, CRC(96bad9a8) SHA1(4e757cca0ab157f0c935087c9702c88741bf7a79) )
+ ROM_LOAD( "18.u48.13g", 0x100000, 0x040000, CRC(0ddc58b6) SHA1(d52437607695ddebfe8494fd214efd20ba72d549) )
+ ROM_LOAD( "20.u49.13h", 0x180000, 0x040000, CRC(2be308c5) SHA1(22fc0991557643c22f6763f186b74900a33a39e0) )
ROM_REGION( 0x200000, "gfx2", 0 ) /* GFX (encrypted) */
- ROM_LOAD( "6.69", 0x000000, 0x040000, CRC(b8422af7) SHA1(d3290fc6ea2670c445731e2b493205874dc4b319) )
- ROM_LOAD( "5.70", 0x080000, 0x040000, CRC(e46125c5) SHA1(73d9a51f30a9c1a8397145d2a4397696ef37f4e5) )
- ROM_LOAD( "4.71", 0x100000, 0x040000, CRC(7a8ed21b) SHA1(f380156c44de2fc316f390adee09b6a3cd404dec) )
- ROM_LOAD( "3.72", 0x180000, 0x040000, CRC(f78bd6ca) SHA1(c70857b8053f9a6e3e15bbc9f7d13354b0966b30) )
+ ROM_LOAD( "16.u69.6g", 0x000000, 0x040000, CRC(b8422af7) SHA1(d3290fc6ea2670c445731e2b493205874dc4b319) )
+ ROM_LOAD( "15.u70.4g", 0x080000, 0x040000, CRC(e46125c5) SHA1(73d9a51f30a9c1a8397145d2a4397696ef37f4e5) )
+ ROM_LOAD( "14.u71.3g", 0x100000, 0x040000, CRC(7a8ed21b) SHA1(f380156c44de2fc316f390adee09b6a3cd404dec) )
+ ROM_LOAD( "13.u72.1g", 0x180000, 0x040000, CRC(f78bd6ca) SHA1(c70857b8053f9a6e3e15bbc9f7d13354b0966b30) )
ROM_REGION( 0x080000, "oki", 0) /* OKI samples (encrypted) */
- ROM_LOAD( "0.31", 0x000000, 0x080000, CRC(80d087bc) SHA1(04d1aacc273c7ffa57b48bd043d55b5b3d993f74) )
+ ROM_LOAD( "10.u31.1b", 0x000000, 0x080000, CRC(80d087bc) SHA1(04d1aacc273c7ffa57b48bd043d55b5b3d993f74) )
ROM_END
/* Init */
diff --git a/src/mame/drivers/piratesh.cpp b/src/mame/drivers/piratesh.cpp
index 0dfc7b2a8bb..5933f7d580c 100644
--- a/src/mame/drivers/piratesh.cpp
+++ b/src/mame/drivers/piratesh.cpp
@@ -616,7 +616,7 @@ void piratesh_state::piratesh(machine_config &config)
/* video hardware */
screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
screen.set_video_attributes(VIDEO_UPDATE_AFTER_VBLANK);
-// MCFG_SCREEN_REFRESH_RATE(60)
+// screen.set_refresh_hz(60);
screen.set_raw(6000000, 288+16+32+48, 0, 287, 224+16+8+16, 0, 223); // TODO
screen.set_vblank_time(ATTOSECONDS_IN_USEC(600));
screen.set_size(64*8, 32*8);
diff --git a/src/mame/drivers/pitagjr.cpp b/src/mame/drivers/pitagjr.cpp
index f2b30986bfc..9c9be7f61b7 100644
--- a/src/mame/drivers/pitagjr.cpp
+++ b/src/mame/drivers/pitagjr.cpp
@@ -209,22 +209,23 @@ uint32_t pitagjr_state::screen_update(screen_device &screen, bitmap_ind16 &bitma
return 0;
}
-MACHINE_CONFIG_START(pitagjr_state::pitajr)
+void pitagjr_state::pitajr(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", HD63705, XTAL(2'000'000)) // probably a m6805-based MCU with internal boot ROM
- MCFG_DEVICE_PROGRAM_MAP(pitajr_mem)
+ HD63705(config, m_maincpu, XTAL(2'000'000)); // probably a m6805-based MCU with internal boot ROM
+ m_maincpu->set_addrmap(AS_PROGRAM, &pitagjr_state::pitajr_mem);
/* video hardware */
- MCFG_SCREEN_ADD("screen", LCD)
- MCFG_SCREEN_REFRESH_RATE(50)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */
- MCFG_SCREEN_UPDATE_DRIVER(pitagjr_state, screen_update)
- MCFG_SCREEN_SIZE( 200, 100 ) // FIXME
- MCFG_SCREEN_VISIBLE_AREA( 0, 200-1, 0, 100-1 )
- MCFG_SCREEN_PALETTE("palette")
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_LCD));
+ screen.set_refresh_hz(50);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */
+ screen.set_screen_update(FUNC(pitagjr_state::screen_update));
+ screen.set_size(200, 100); // FIXME
+ screen.set_visarea(0, 200-1, 0, 100-1);
+ screen.set_palette("palette");
PALETTE(config, "palette", FUNC(pitagjr_state::pitagjr_palette), 2);
-MACHINE_CONFIG_END
+}
/* ROM definition */
diff --git a/src/mame/drivers/pk8000.cpp b/src/mame/drivers/pk8000.cpp
index 941ad1c568f..b0a4c204aeb 100644
--- a/src/mame/drivers/pk8000.cpp
+++ b/src/mame/drivers/pk8000.cpp
@@ -360,22 +360,23 @@ uint32_t pk8000_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap
return video_update(screen, bitmap, cliprect, m_ram->pointer());
}
-MACHINE_CONFIG_START(pk8000_state::pk8000)
+void pk8000_state::pk8000(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu",I8080, 1780000)
- MCFG_DEVICE_PROGRAM_MAP(pk8000_mem)
- MCFG_DEVICE_IO_MAP(pk8000_io)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", pk8000_state, interrupt)
- MCFG_DEVICE_IRQ_ACKNOWLEDGE_DRIVER(pk8000_state, irq_callback)
+ I8080(config, m_maincpu, 1780000);
+ m_maincpu->set_addrmap(AS_PROGRAM, &pk8000_state::pk8000_mem);
+ m_maincpu->set_addrmap(AS_IO, &pk8000_state::pk8000_io);
+ m_maincpu->set_vblank_int("screen", FUNC(pk8000_state::interrupt));
+ m_maincpu->set_irq_acknowledge_callback(FUNC(pk8000_state::irq_callback));
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(50)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */
- MCFG_SCREEN_SIZE(256+32, 192+32)
- MCFG_SCREEN_VISIBLE_AREA(0, 256+32-1, 0, 192+32-1)
- MCFG_SCREEN_UPDATE_DRIVER(pk8000_state, screen_update)
- MCFG_SCREEN_PALETTE("palette")
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(50);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */
+ screen.set_size(256+32, 192+32);
+ screen.set_visarea(0, 256+32-1, 0, 192+32-1);
+ screen.set_screen_update(FUNC(pk8000_state::screen_update));
+ screen.set_palette("palette");
PALETTE(config, "palette", FUNC(pk8000_state::pk8000_palette), 16);
@@ -392,15 +393,15 @@ MACHINE_CONFIG_START(pk8000_state::pk8000)
/* audio hardware */
SPEAKER(config, "mono").front_center();
SPEAKER_SOUND(config, "speaker").add_route(ALL_OUTPUTS, "mono", 0.50);
- WAVE(config, "wave", "cassette").add_route(ALL_OUTPUTS, "mono", 0.25);
+ WAVE(config, "wave", m_cassette).add_route(ALL_OUTPUTS, "mono", 0.25);
- MCFG_CASSETTE_ADD( "cassette" )
- MCFG_CASSETTE_FORMATS(fmsx_cassette_formats)
- MCFG_CASSETTE_DEFAULT_STATE(CASSETTE_PLAY)
+ CASSETTE(config, m_cassette);
+ m_cassette->set_formats(fmsx_cassette_formats);
+ m_cassette->set_default_state(CASSETTE_PLAY);
/* internal ram */
RAM(config, RAM_TAG).set_default_size("64K");
-MACHINE_CONFIG_END
+}
/* ROM definition */
ROM_START( vesta )
diff --git a/src/mame/drivers/pk8020.cpp b/src/mame/drivers/pk8020.cpp
index c845ad68667..734ce7c32a6 100644
--- a/src/mame/drivers/pk8020.cpp
+++ b/src/mame/drivers/pk8020.cpp
@@ -189,24 +189,25 @@ static void pk8020_floppies(device_slot_interface &device)
* 7 floppy
*/
/* Machine driver */
-MACHINE_CONFIG_START(pk8020_state::pk8020)
+void pk8020_state::pk8020(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", I8080, 20_MHz_XTAL / 8)
- MCFG_DEVICE_PROGRAM_MAP(pk8020_mem)
- MCFG_DEVICE_IO_MAP(pk8020_io)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", pk8020_state, pk8020_interrupt)
- MCFG_DEVICE_IRQ_ACKNOWLEDGE_DEVICE("pic8259", pic8259_device, inta_cb)
+ I8080(config, m_maincpu, 20_MHz_XTAL / 8);
+ m_maincpu->set_addrmap(AS_PROGRAM, &pk8020_state::pk8020_mem);
+ m_maincpu->set_addrmap(AS_IO, &pk8020_state::pk8020_io);
+ m_maincpu->set_vblank_int("screen", FUNC(pk8020_state::pk8020_interrupt));
+ m_maincpu->set_irq_acknowledge_callback("pic8259", FUNC(pic8259_device::inta_cb));
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(50)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */
- MCFG_SCREEN_SIZE(512, 256)
- MCFG_SCREEN_VISIBLE_AREA(0, 512-1, 0, 256-1)
- MCFG_SCREEN_UPDATE_DRIVER(pk8020_state, screen_update_pk8020)
- MCFG_SCREEN_PALETTE(m_palette)
-
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, m_palette, gfx_pk8020)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(50);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */
+ screen.set_size(512, 256);
+ screen.set_visarea(0, 512-1, 0, 256-1);
+ screen.set_screen_update(FUNC(pk8020_state::screen_update_pk8020));
+ screen.set_palette(m_palette);
+
+ GFXDECODE(config, "gfxdecode", m_palette, gfx_pk8020);
PALETTE(config, m_palette, FUNC(pk8020_state::pk8020_palette), 16);
I8255(config, m_ppi8255_1);
@@ -246,24 +247,23 @@ MACHINE_CONFIG_START(pk8020_state::pk8020)
FD1793(config, m_wd1793, 20_MHz_XTAL / 20);
m_wd1793->intrq_wr_callback().set(m_pic8259, FUNC(pic8259_device::ir7_w));
- MCFG_FLOPPY_DRIVE_ADD("wd1793:0", pk8020_floppies, "qd", pk8020_state::floppy_formats)
- MCFG_FLOPPY_DRIVE_ADD("wd1793:1", pk8020_floppies, "qd", pk8020_state::floppy_formats)
- MCFG_FLOPPY_DRIVE_ADD("wd1793:2", pk8020_floppies, "qd", pk8020_state::floppy_formats)
- MCFG_FLOPPY_DRIVE_ADD("wd1793:3", pk8020_floppies, "qd", pk8020_state::floppy_formats)
+ FLOPPY_CONNECTOR(config, "wd1793:0", pk8020_floppies, "qd", pk8020_state::floppy_formats);
+ FLOPPY_CONNECTOR(config, "wd1793:1", pk8020_floppies, "qd", pk8020_state::floppy_formats);
+ FLOPPY_CONNECTOR(config, "wd1793:2", pk8020_floppies, "qd", pk8020_state::floppy_formats);
+ FLOPPY_CONNECTOR(config, "wd1793:3", pk8020_floppies, "qd", pk8020_state::floppy_formats);
- MCFG_SOFTWARE_LIST_ADD("flop_list", "korvet_flop")
+ SOFTWARE_LIST(config, "flop_list").set_original("korvet_flop");
/* audio hardware */
SPEAKER(config, "mono").front_center();
SPEAKER_SOUND(config, "speaker").add_route(ALL_OUTPUTS, "mono", 0.25);
WAVE(config, "wave", "cassette").add_route(ALL_OUTPUTS, "mono", 0.25);
- MCFG_CASSETTE_ADD( "cassette" )
- MCFG_CASSETTE_DEFAULT_STATE(CASSETTE_PLAY)
+ CASSETTE(config, "cassette").set_default_state(CASSETTE_PLAY);
/* internal ram */
RAM(config, RAM_TAG).set_default_size("258K").set_default_value(0x00); // 64 + 4*48 + 2 = 258
-MACHINE_CONFIG_END
+}
/* ROM definition */
diff --git a/src/mame/drivers/pktgaldx.cpp b/src/mame/drivers/pktgaldx.cpp
index 242f251ce0c..2bbb8596766 100644
--- a/src/mame/drivers/pktgaldx.cpp
+++ b/src/mame/drivers/pktgaldx.cpp
@@ -338,26 +338,26 @@ void pktgaldx_state::machine_start()
{
}
-MACHINE_CONFIG_START(pktgaldx_state::pktgaldx)
-
+void pktgaldx_state::pktgaldx(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M68000, 28_MHz_XTAL / 2) // The clock input is 14.000MHz on pin 6
- MCFG_DEVICE_PROGRAM_MAP(pktgaldx_map)
- MCFG_DEVICE_OPCODES_MAP(decrypted_opcodes_map)
+ M68000(config, m_maincpu, 28_MHz_XTAL / 2); // The clock input is 14.000MHz on pin 6
+ m_maincpu->set_addrmap(AS_PROGRAM, &pktgaldx_state::pktgaldx_map);
+ m_maincpu->set_addrmap(AS_OPCODES, &pktgaldx_state::decrypted_opcodes_map);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(58)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */)
- MCFG_SCREEN_SIZE(40*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 40*8-1, 1*8, 31*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(pktgaldx_state, screen_update_pktgaldx)
- MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE(*this, pktgaldx_state, vblank_w))
- MCFG_SCREEN_PALETTE(m_palette)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(58);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500) /* not accurate */);
+ screen.set_size(40*8, 32*8);
+ screen.set_visarea(0*8, 40*8-1, 1*8, 31*8-1);
+ screen.set_screen_update(FUNC(pktgaldx_state::screen_update_pktgaldx));
+ screen.screen_vblank().set(FUNC(pktgaldx_state::vblank_w));
+ screen.set_palette(m_palette);
- PALETTE(config, "palette").set_format(palette_device::xBGR_888, 4096);
+ PALETTE(config, m_palette).set_format(palette_device::xBGR_888, 4096);
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_pktgaldx)
+ GFXDECODE(config, m_gfxdecode, m_palette, gfx_pktgaldx);
DECO16IC(config, m_deco_tilegen, 0);
m_deco_tilegen->set_split(0);
@@ -389,48 +389,48 @@ MACHINE_CONFIG_START(pktgaldx_state::pktgaldx)
SPEAKER(config, "lspeaker").front_left();
SPEAKER(config, "rspeaker").front_right();
- MCFG_DEVICE_ADD("oki1", OKIM6295, 32.22_MHz_XTAL / 32, okim6295_device::PIN7_HIGH)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 0.75)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 0.75)
-
- MCFG_DEVICE_ADD("oki2", OKIM6295, 32.22_MHz_XTAL / 16, okim6295_device::PIN7_HIGH)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 0.60)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 0.60)
-MACHINE_CONFIG_END
+ okim6295_device &oki1(OKIM6295(config, "oki1", 32.22_MHz_XTAL / 32, okim6295_device::PIN7_HIGH));
+ oki1.add_route(ALL_OUTPUTS, "lspeaker", 0.75);
+ oki1.add_route(ALL_OUTPUTS, "rspeaker", 0.75);
+ OKIM6295(config, m_oki2, 32.22_MHz_XTAL / 16, okim6295_device::PIN7_HIGH);
+ m_oki2->add_route(ALL_OUTPUTS, "lspeaker", 0.60);
+ m_oki2->add_route(ALL_OUTPUTS, "rspeaker", 0.60);
+}
-MACHINE_CONFIG_START(pktgaldx_state::pktgaldb)
+void pktgaldx_state::pktgaldb(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M68000, 16000000)
- MCFG_DEVICE_PROGRAM_MAP(pktgaldb_map)
+ M68000(config, m_maincpu, 16000000);
+ m_maincpu->set_addrmap(AS_PROGRAM, &pktgaldx_state::pktgaldb_map);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(58)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */)
- MCFG_SCREEN_SIZE(40*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 40*8-1, 1*8, 31*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(pktgaldx_state, screen_update_pktgaldb)
- MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE(*this, pktgaldx_state, vblank_w))
- MCFG_SCREEN_PALETTE(m_palette)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(58);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500) /* not accurate */);
+ screen.set_size(40*8, 32*8);
+ screen.set_visarea(0*8, 40*8-1, 1*8, 31*8-1);
+ screen.set_screen_update(FUNC(pktgaldx_state::screen_update_pktgaldb));
+ screen.screen_vblank().set(FUNC(pktgaldx_state::vblank_w));
+ screen.set_palette(m_palette);
PALETTE(config, m_palette).set_format(palette_device::xBGR_888, 4096);
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, m_palette, gfx_bootleg)
+ GFXDECODE(config, m_gfxdecode, m_palette, gfx_bootleg);
/* sound hardware */
SPEAKER(config, "lspeaker").front_left();
SPEAKER(config, "rspeaker").front_right();
- MCFG_DEVICE_ADD("oki1", OKIM6295, 32220000/32, okim6295_device::PIN7_HIGH)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 0.75)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 0.75)
+ okim6295_device &oki1(OKIM6295(config, "oki1", 32220000/32, okim6295_device::PIN7_HIGH));
+ oki1.add_route(ALL_OUTPUTS, "lspeaker", 0.75);
+ oki1.add_route(ALL_OUTPUTS, "rspeaker", 0.75);
- MCFG_DEVICE_ADD("oki2", OKIM6295, 32220000/16, okim6295_device::PIN7_HIGH)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 0.60)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 0.60)
-MACHINE_CONFIG_END
+ OKIM6295(config, m_oki2, 32220000/16, okim6295_device::PIN7_HIGH);
+ m_oki2->add_route(ALL_OUTPUTS, "lspeaker", 0.60);
+ m_oki2->add_route(ALL_OUTPUTS, "rspeaker", 0.60);
+}
ROM_START( pktgaldx )
diff --git a/src/mame/drivers/plan80.cpp b/src/mame/drivers/plan80.cpp
index 773d2f2ebe0..65adfc6b469 100644
--- a/src/mame/drivers/plan80.cpp
+++ b/src/mame/drivers/plan80.cpp
@@ -233,24 +233,25 @@ static GFXDECODE_START( gfx_plan80 )
GFXDECODE_END
-MACHINE_CONFIG_START(plan80_state::plan80)
+void plan80_state::plan80(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu",I8080, 2048000)
- MCFG_DEVICE_PROGRAM_MAP(plan80_mem)
- MCFG_DEVICE_IO_MAP(plan80_io)
+ I8080(config, m_maincpu, 2048000);
+ m_maincpu->set_addrmap(AS_PROGRAM, &plan80_state::plan80_mem);
+ m_maincpu->set_addrmap(AS_IO, &plan80_state::plan80_io);
/* video hardware */
- MCFG_SCREEN_ADD_MONOCHROME("screen", RASTER, rgb_t::green())
- MCFG_SCREEN_REFRESH_RATE(50)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */
- MCFG_SCREEN_UPDATE_DRIVER(plan80_state, screen_update)
- MCFG_SCREEN_SIZE(48*6, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0, 48*6-1, 0, 32*8-1)
- MCFG_SCREEN_PALETTE("palette")
-
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_plan80)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER, rgb_t::green()));
+ screen.set_refresh_hz(50);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */
+ screen.set_screen_update(FUNC(plan80_state::screen_update));
+ screen.set_size(48*6, 32*8);
+ screen.set_visarea(0, 48*6-1, 0, 32*8-1);
+ screen.set_palette("palette");
+
+ GFXDECODE(config, "gfxdecode", "palette", gfx_plan80);
PALETTE(config, "palette", palette_device::MONOCHROME);
-MACHINE_CONFIG_END
+}
/* ROM definition */
ROM_START( plan80 )
diff --git a/src/mame/drivers/play_1.cpp b/src/mame/drivers/play_1.cpp
index 8bc2377518b..babe72507cb 100644
--- a/src/mame/drivers/play_1.cpp
+++ b/src/mame/drivers/play_1.cpp
@@ -470,7 +470,8 @@ WRITE_LINE_MEMBER( play_1_state::clock_w )
}
}
-MACHINE_CONFIG_START(play_1_state::play_1)
+void play_1_state::play_1(machine_config &config)
+{
/* basic machine hardware */
CDP1802(config, m_maincpu, 400000); // 2 gates, 1 cap, 1 resistor oscillating somewhere between 350 to 450 kHz
m_maincpu->set_addrmap(AS_PROGRAM, &play_1_state::play_1_map);
@@ -486,23 +487,22 @@ MACHINE_CONFIG_START(play_1_state::play_1)
/* Video */
config.set_default_layout(layout_play_1);
- MCFG_DEVICE_ADD("xpoint", CLOCK, 100) // crossing-point detector
- MCFG_CLOCK_SIGNAL_HANDLER(WRITELINE(*this, play_1_state, clock_w))
+ clock_device &xpoint(CLOCK(config, "xpoint", 100)); // crossing-point detector
+ xpoint.signal_handler().set(FUNC(play_1_state::clock_w));
/* Sound */
genpin_audio(config);
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("speaker", SPEAKER_SOUND)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.50)
- MCFG_DEVICE_ADD("monotone", CLOCK, 0) // sound device
- MCFG_CLOCK_SIGNAL_HANDLER(WRITELINE("speaker", speaker_sound_device, level_w))
-MACHINE_CONFIG_END
+ SPEAKER_SOUND(config, "speaker").add_route(ALL_OUTPUTS, "mono", 0.50);
+ CLOCK(config, m_monotone, 0); // sound device
+ m_monotone->signal_handler().set("speaker", FUNC(speaker_sound_device::level_w));
+}
-MACHINE_CONFIG_START(play_1_state::chance)
+void play_1_state::chance(machine_config &config)
+{
play_1(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(chance_map)
-MACHINE_CONFIG_END
+ m_maincpu->set_addrmap(AS_PROGRAM, &play_1_state::chance_map);
+}
/*-------------------------------------------------------------------
/ Space Gambler (03/78)
diff --git a/src/mame/drivers/play_2.cpp b/src/mame/drivers/play_2.cpp
index 19acc54fb22..c8c99938b6d 100644
--- a/src/mame/drivers/play_2.cpp
+++ b/src/mame/drivers/play_2.cpp
@@ -324,15 +324,15 @@ WRITE8_MEMBER( play_2_state::sound_g_w )
switch (data)
{
case 0x01:
- m_aysnd1->data_w(space, 0, m_psg_latch);
+ m_aysnd1->data_w(m_psg_latch);
break;
case 0x02:
- m_psg_latch = m_aysnd1->data_r(space, 0);
+ m_psg_latch = m_aysnd1->data_r();
break;
case 0x03:
- m_aysnd1->address_w(space, 0, m_psg_latch);
+ m_aysnd1->address_w(m_psg_latch);
break;
}
}
diff --git a/src/mame/drivers/play_3.cpp b/src/mame/drivers/play_3.cpp
index 2bbedc27b12..fc80f44261c 100644
--- a/src/mame/drivers/play_3.cpp
+++ b/src/mame/drivers/play_3.cpp
@@ -475,7 +475,8 @@ WRITE_LINE_MEMBER( play_3_state::q4013a_w )
m_clockcnt = 0;
}
-MACHINE_CONFIG_START(play_3_state::play_3)
+void play_3_state::play_3(machine_config &config)
+{
/* basic machine hardware */
CDP1802(config, m_maincpu, 3.579545_MHz_XTAL);
m_maincpu->set_addrmap(AS_PROGRAM, &play_3_state::play_3_map);
@@ -493,8 +494,8 @@ MACHINE_CONFIG_START(play_3_state::play_3)
config.set_default_layout(layout_play_3);
// Devices
- MCFG_DEVICE_ADD("xpoint", CLOCK, 60) // crossing-point detector
- MCFG_CLOCK_SIGNAL_HANDLER(WRITELINE(*this, play_3_state, clock2_w))
+ clock_device &xpoint(CLOCK(config, "xpoint", 60)); // crossing-point detector
+ xpoint.signal_handler().set(FUNC(play_3_state::clock2_w));
// This is actually a 4013 chip (has 2 RS flipflops)
TTL7474(config, m_4013a, 0);
@@ -518,28 +519,29 @@ MACHINE_CONFIG_START(play_3_state::play_3)
SPEAKER(config, "rspeaker").front_right();
AY8910(config, m_aysnd1, 3.579545_MHz_XTAL / 2).add_route(ALL_OUTPUTS, "lspeaker", 0.75);
AY8910(config, m_aysnd2, 3.579545_MHz_XTAL / 2).add_route(ALL_OUTPUTS, "rspeaker", 0.75);
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(play_3_state::megaaton)
+void play_3_state::megaaton(machine_config &config)
+{
play_3(config);
m_maincpu->set_clock(2.95_MHz_XTAL);
m_maincpu->set_addrmap(AS_IO, &play_3_state::megaaton_io);
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(play_3_state::sklflite)
+void play_3_state::sklflite(machine_config &config)
+{
play_3(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_IO_MAP(sklflite_io)
+ m_maincpu->set_addrmap(AS_IO, &play_3_state::sklflite_io);
- MCFG_DEVICE_REMOVE("audiocpu")
- MCFG_DEVICE_REMOVE("aysnd1")
- MCFG_DEVICE_REMOVE("aysnd2")
- MCFG_DEVICE_REMOVE("lspeaker")
- MCFG_DEVICE_REMOVE("rspeaker")
+ config.device_remove("audiocpu");
+ config.device_remove("aysnd1");
+ config.device_remove("aysnd2");
+ config.device_remove("lspeaker");
+ config.device_remove("rspeaker");
EFO_ZSU1(config, m_zsu, 0);
-MACHINE_CONFIG_END
+}
/*-------------------------------------------------------------------
diff --git a/src/mame/drivers/playmark.cpp b/src/mame/drivers/playmark.cpp
index 818ab320eff..e3043157202 100644
--- a/src/mame/drivers/playmark.cpp
+++ b/src/mame/drivers/playmark.cpp
@@ -186,7 +186,7 @@ READ8_MEMBER(playmark_state::playmark_snd_command_r)
}
else if ((m_oki_control & 0x38) == 0x28)
{
- data = (m_oki->read(space, 0) & 0x0f);
+ data = (m_oki->read() & 0x0f);
// logerror("PC$%03x PortB reading %02x from the OKI status port\n", m_maincpu->pcbase(), data);
}
@@ -238,7 +238,7 @@ WRITE8_MEMBER(playmark_state::playmark_snd_control_w)
if ((data & 0x38) == 0x18)
{
// logerror("PC$%03x Writing %02x to OKI1, PortC=%02x, Code=%02x\n",m_maincpu->pcbase(),m_oki_command,m_oki_control,m_snd_command);
- m_oki->write(space, 0, m_oki_command);
+ m_oki->write(m_oki_command);
}
}
@@ -254,7 +254,7 @@ WRITE8_MEMBER(playmark_state::hrdtimes_snd_control_w)
if ((data & 0x38) == 0x18)
{
// logerror("PC$%03x Writing %02x to OKI1, PortC=%02x, Code=%02x\n",m_maincpu->pcbase(),m_oki_command,m_oki_control,m_snd_command);
- m_oki->write(space, 0, m_oki_command);
+ m_oki->write(m_oki_command);
}
}
@@ -1041,12 +1041,12 @@ MACHINE_RESET_MEMBER(playmark_state,playmark)
m_dispenser_latch = 0;
}
-MACHINE_CONFIG_START(playmark_state::bigtwin)
-
+void playmark_state::bigtwin(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M68000, 12000000) /* 12 MHz */
- MCFG_DEVICE_PROGRAM_MAP(bigtwin_main_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", playmark_state, irq2_line_hold)
+ M68000(config, m_maincpu, 12000000); /* 12 MHz */
+ m_maincpu->set_addrmap(AS_PROGRAM, &playmark_state::bigtwin_main_map);
+ m_maincpu->set_vblank_int("screen", FUNC(playmark_state::irq2_line_hold));
PIC16C57(config, m_audiocpu, 12000000);
m_audiocpu->write_a().set(FUNC(playmark_state::playmark_oki_banking_w));
@@ -1059,13 +1059,13 @@ MACHINE_CONFIG_START(playmark_state::bigtwin)
MCFG_MACHINE_RESET_OVERRIDE(playmark_state,playmark)
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(58)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(64*8, 64*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 40*8-1, 2*8, 32*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(playmark_state, screen_update_bigtwin)
- MCFG_SCREEN_PALETTE(m_palette)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(58);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(64*8, 64*8);
+ screen.set_visarea(0*8, 40*8-1, 2*8, 32*8-1);
+ screen.set_screen_update(FUNC(playmark_state::screen_update_bigtwin));
+ screen.set_palette(m_palette);
GFXDECODE(config, m_gfxdecode, m_palette, gfx_bigtwin);
PALETTE(config, m_palette).set_format(palette_device::RRRRGGGGBBBBRGBx, 1024);
@@ -1075,17 +1075,17 @@ MACHINE_CONFIG_START(playmark_state::bigtwin)
/* sound hardware */
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("oki", OKIM6295, 1000000, okim6295_device::PIN7_HIGH)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
- MCFG_DEVICE_ADDRESS_MAP(0, oki_map)
-MACHINE_CONFIG_END
-
-MACHINE_CONFIG_START(playmark_state::bigtwinb)
+ OKIM6295(config, m_oki, 1000000, okim6295_device::PIN7_HIGH);
+ m_oki->add_route(ALL_OUTPUTS, "mono", 1.0);
+ m_oki->set_addrmap(0, &playmark_state::oki_map);
+}
+void playmark_state::bigtwinb(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M68000, XTAL(24'000'000)/2)
- MCFG_DEVICE_PROGRAM_MAP(bigtwinb_main_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", playmark_state, irq2_line_hold)
+ M68000(config, m_maincpu, XTAL(24'000'000)/2);
+ m_maincpu->set_addrmap(AS_PROGRAM, &playmark_state::bigtwinb_main_map);
+ m_maincpu->set_vblank_int("screen", FUNC(playmark_state::irq2_line_hold));
PIC16C57(config, m_audiocpu, XTAL(24'000'000)/2);
m_audiocpu->write_a().set(FUNC(playmark_state::playmark_oki_banking_w));
@@ -1098,13 +1098,13 @@ MACHINE_CONFIG_START(playmark_state::bigtwinb)
MCFG_MACHINE_RESET_OVERRIDE(playmark_state,playmark)
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(58)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(64*8, 64*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 40*8-1, 2*8, 32*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(playmark_state, screen_update_bigtwinb)
- MCFG_SCREEN_PALETTE(m_palette)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(58);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(64*8, 64*8);
+ screen.set_visarea(0*8, 40*8-1, 2*8, 32*8-1);
+ screen.set_screen_update(FUNC(playmark_state::screen_update_bigtwinb));
+ screen.set_palette(m_palette);
GFXDECODE(config, m_gfxdecode, m_palette, gfx_bigtwinb);
PALETTE(config, m_palette).set_format(palette_device::RRRRGGGGBBBBRGBx, 1024);
@@ -1114,17 +1114,17 @@ MACHINE_CONFIG_START(playmark_state::bigtwinb)
/* sound hardware */
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("oki", OKIM6295, 1000000, okim6295_device::PIN7_HIGH)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
- MCFG_DEVICE_ADDRESS_MAP(0, oki_map)
-MACHINE_CONFIG_END
-
-MACHINE_CONFIG_START(playmark_state::wbeachvl)
+ OKIM6295(config, m_oki, 1000000, okim6295_device::PIN7_HIGH);
+ m_oki->add_route(ALL_OUTPUTS, "mono", 1.0);
+ m_oki->set_addrmap(0, &playmark_state::oki_map);
+}
+void playmark_state::wbeachvl(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M68000, 12000000) /* 12 MHz */
- MCFG_DEVICE_PROGRAM_MAP(wbeachvl_main_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", playmark_state, irq2_line_hold)
+ M68000(config, m_maincpu, 12000000); /* 12 MHz */
+ m_maincpu->set_addrmap(AS_PROGRAM, &playmark_state::wbeachvl_main_map);
+ m_maincpu->set_vblank_int("screen", FUNC(playmark_state::irq2_line_hold));
PIC16C57(config, m_audiocpu, XTAL(24'000'000)/2); /* 12MHz with internal 4x divisor */
m_audiocpu->write_a().set(FUNC(playmark_state::playmark_oki_banking_w)); // wrong?
@@ -1140,13 +1140,13 @@ MACHINE_CONFIG_START(playmark_state::wbeachvl)
MCFG_MACHINE_RESET_OVERRIDE(playmark_state,playmark)
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(58)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(64*8, 64*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 40*8-1, 2*8, 32*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(playmark_state, screen_update_wbeachvl)
- MCFG_SCREEN_PALETTE(m_palette)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(58);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(64*8, 64*8);
+ screen.set_visarea(0*8, 40*8-1, 2*8, 32*8-1);
+ screen.set_screen_update(FUNC(playmark_state::screen_update_wbeachvl));
+ screen.set_palette(m_palette);
GFXDECODE(config, m_gfxdecode, m_palette, gfx_wbeachvl);
PALETTE(config, m_palette).set_format(palette_device::RGBx_555, 2048);
@@ -1156,17 +1156,17 @@ MACHINE_CONFIG_START(playmark_state::wbeachvl)
/* sound hardware */
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("oki", OKIM6295, 1000000, okim6295_device::PIN7_HIGH)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
- MCFG_DEVICE_ADDRESS_MAP(0, oki_map)
-MACHINE_CONFIG_END
-
-MACHINE_CONFIG_START(playmark_state::excelsr)
+ OKIM6295(config, m_oki, 1000000, okim6295_device::PIN7_HIGH);
+ m_oki->add_route(ALL_OUTPUTS, "mono", 1.0);
+ m_oki->set_addrmap(0, &playmark_state::oki_map);
+}
+void playmark_state::excelsr(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M68000, XTAL(24'000'000)/2) /* 12 MHz */
- MCFG_DEVICE_PROGRAM_MAP(excelsr_main_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", playmark_state, irq2_line_hold)
+ M68000(config, m_maincpu, XTAL(24'000'000)/2); /* 12 MHz */
+ m_maincpu->set_addrmap(AS_PROGRAM, &playmark_state::excelsr_main_map);
+ m_maincpu->set_vblank_int("screen", FUNC(playmark_state::irq2_line_hold));
PIC16C57(config, m_audiocpu, XTAL(24'000'000)/2); /* 12MHz with internal 4x divisor */
m_audiocpu->write_a().set(FUNC(playmark_state::playmark_oki_banking_w));
@@ -1179,13 +1179,13 @@ MACHINE_CONFIG_START(playmark_state::excelsr)
MCFG_MACHINE_RESET_OVERRIDE(playmark_state,playmark)
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(58)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(64*8, 64*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 40*8-1, 2*8, 32*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(playmark_state, screen_update_excelsr)
- MCFG_SCREEN_PALETTE(m_palette)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(58);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(64*8, 64*8);
+ screen.set_visarea(0*8, 40*8-1, 2*8, 32*8-1);
+ screen.set_screen_update(FUNC(playmark_state::screen_update_excelsr));
+ screen.set_palette(m_palette);
GFXDECODE(config, m_gfxdecode, m_palette, gfx_excelsr);
PALETTE(config, m_palette).set_format(palette_device::RRRRGGGGBBBBRGBx, 1024);
@@ -1195,17 +1195,17 @@ MACHINE_CONFIG_START(playmark_state::excelsr)
/* sound hardware */
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("oki", OKIM6295, XTAL(1'000'000), okim6295_device::PIN7_HIGH) /* 1MHz resonator */
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
- MCFG_DEVICE_ADDRESS_MAP(0, oki_map)
-MACHINE_CONFIG_END
-
-MACHINE_CONFIG_START(playmark_state::hrdtimes)
+ OKIM6295(config, m_oki, XTAL(1'000'000), okim6295_device::PIN7_HIGH); /* 1MHz resonator */
+ m_oki->add_route(ALL_OUTPUTS, "mono", 1.0);
+ m_oki->set_addrmap(0, &playmark_state::oki_map);
+}
+void playmark_state::hrdtimes(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M68000, XTAL(24'000'000)/2) /* verified on pcb */
- MCFG_DEVICE_PROGRAM_MAP(hrdtimes_main_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", playmark_state, irq6_line_hold)
+ M68000(config, m_maincpu, XTAL(24'000'000)/2); /* verified on pcb */
+ m_maincpu->set_addrmap(AS_PROGRAM, &playmark_state::hrdtimes_main_map);
+ m_maincpu->set_vblank_int("screen", FUNC(playmark_state::irq6_line_hold));
PIC16C57(config, m_audiocpu, XTAL(24'000'000)/2); /* verified on pcb */
// m_audiocpu->write_a().set(FUNC(playmark_state::playmark_oki_banking_w)); // Banking data output but not wired. Port C is wired to the OKI banking instead
@@ -1219,13 +1219,13 @@ MACHINE_CONFIG_START(playmark_state::hrdtimes)
MCFG_MACHINE_RESET_OVERRIDE(playmark_state,playmark)
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(58)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(64*8, 64*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 40*8-1, 2*8, 30*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(playmark_state, screen_update_hrdtimes)
- MCFG_SCREEN_PALETTE(m_palette)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(58);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(64*8, 64*8);
+ screen.set_visarea(0*8, 40*8-1, 2*8, 30*8-1);
+ screen.set_screen_update(FUNC(playmark_state::screen_update_hrdtimes));
+ screen.set_palette(m_palette);
GFXDECODE(config, m_gfxdecode, m_palette, gfx_hrdtimes);
PALETTE(config, m_palette).set_format(palette_device::RRRRGGGGBBBBRGBx, 1024);
@@ -1235,17 +1235,17 @@ MACHINE_CONFIG_START(playmark_state::hrdtimes)
/* sound hardware */
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("oki", OKIM6295, XTAL(1'000'000), okim6295_device::PIN7_HIGH) /* verified on pcb */
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
- MCFG_DEVICE_ADDRESS_MAP(0, oki_map)
-MACHINE_CONFIG_END
-
-MACHINE_CONFIG_START(playmark_state::hotmind)
+ OKIM6295(config, m_oki, XTAL(1'000'000), okim6295_device::PIN7_HIGH); /* verified on pcb */
+ m_oki->add_route(ALL_OUTPUTS, "mono", 1.0);
+ m_oki->set_addrmap(0, &playmark_state::oki_map);
+}
+void playmark_state::hotmind(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M68000, XTAL(24'000'000)/2) /* verified on pcb */
- MCFG_DEVICE_PROGRAM_MAP(hotmind_main_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", playmark_state, irq6_line_hold) // irq 2 and 6 point to the same location on hotmind
+ M68000(config, m_maincpu, XTAL(24'000'000)/2); /* verified on pcb */
+ m_maincpu->set_addrmap(AS_PROGRAM, &playmark_state::hotmind_main_map);
+ m_maincpu->set_vblank_int("screen", FUNC(playmark_state::irq6_line_hold)); // irq 2 and 6 point to the same location on hotmind
PIC16C57(config, m_audiocpu, XTAL(24'000'000)/2); /* verified on pcb */
// m_audiocpu->write_a().set(FUNC(playmark_state::playmark_oki_banking_w)); // Banking data output but not wired. Port C is wired to the OKI banking instead
@@ -1260,36 +1260,36 @@ MACHINE_CONFIG_START(playmark_state::hotmind)
MCFG_MACHINE_RESET_OVERRIDE(playmark_state,playmark)
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(58)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(64*8, 64*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 40*8-1, 2*8, 30*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(playmark_state, screen_update_hrdtimes)
- MCFG_SCREEN_PALETTE(m_palette)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(58);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(64*8, 64*8);
+ screen.set_visarea(0*8, 40*8-1, 2*8, 30*8-1);
+ screen.set_screen_update(FUNC(playmark_state::screen_update_hrdtimes));
+ screen.set_palette(m_palette);
GFXDECODE(config, m_gfxdecode, m_palette, gfx_hotmind);
PALETTE(config, m_palette).set_format(palette_device::RRRRGGGGBBBBRGBx, 1024);
MCFG_VIDEO_START_OVERRIDE(playmark_state,hotmind)
- MCFG_TICKET_DISPENSER_ADD("ticket", attotime::from_msec(350), TICKET_MOTOR_ACTIVE_HIGH, TICKET_STATUS_ACTIVE_HIGH )
- MCFG_TICKET_DISPENSER_ADD("token", attotime::from_msec(350), TICKET_MOTOR_ACTIVE_HIGH, TICKET_STATUS_ACTIVE_HIGH )
+ TICKET_DISPENSER(config, m_ticket, attotime::from_msec(350), TICKET_MOTOR_ACTIVE_HIGH, TICKET_STATUS_ACTIVE_HIGH);
+ TICKET_DISPENSER(config, m_token, attotime::from_msec(350), TICKET_MOTOR_ACTIVE_HIGH, TICKET_STATUS_ACTIVE_HIGH);
/* sound hardware */
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("oki", OKIM6295, XTAL(1'000'000), okim6295_device::PIN7_HIGH) /* verified on pcb */
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
- MCFG_DEVICE_ADDRESS_MAP(0, oki_map)
-MACHINE_CONFIG_END
-
-MACHINE_CONFIG_START(playmark_state::luckboomh)
+ OKIM6295(config, m_oki, XTAL(1'000'000), okim6295_device::PIN7_HIGH); /* verified on pcb */
+ m_oki->add_route(ALL_OUTPUTS, "mono", 1.0);
+ m_oki->set_addrmap(0, &playmark_state::oki_map);
+}
+void playmark_state::luckboomh(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M68000, XTAL(24'000'000)/2) /* verified on pcb */
- MCFG_DEVICE_PROGRAM_MAP(luckboomh_main_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", playmark_state, irq6_line_hold)
+ M68000(config, m_maincpu, XTAL(24'000'000)/2); /* verified on pcb */
+ m_maincpu->set_addrmap(AS_PROGRAM, &playmark_state::luckboomh_main_map);
+ m_maincpu->set_vblank_int("screen", FUNC(playmark_state::irq6_line_hold));
PIC16C57(config, m_audiocpu, XTAL(24'000'000)/2); /* verified on pcb */
// m_audiocpu->write_a().set(FUNC(playmark_state::playmark_oki_banking_w)); // Banking data output but not wired. Port C is wired to the OKI banking instead
@@ -1304,29 +1304,29 @@ MACHINE_CONFIG_START(playmark_state::luckboomh)
MCFG_MACHINE_RESET_OVERRIDE(playmark_state,playmark)
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(58)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(64*8, 64*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 40*8-1, 2*8, 30*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(playmark_state, screen_update_hrdtimes)
- MCFG_SCREEN_PALETTE(m_palette)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(58);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(64*8, 64*8);
+ screen.set_visarea(0*8, 40*8-1, 2*8, 30*8-1);
+ screen.set_screen_update(FUNC(playmark_state::screen_update_hrdtimes));
+ screen.set_palette(m_palette);
GFXDECODE(config, m_gfxdecode, m_palette, gfx_luckboomh);
PALETTE(config, m_palette).set_format(palette_device::RRRRGGGGBBBBRGBx, 1024);
MCFG_VIDEO_START_OVERRIDE(playmark_state,luckboomh)
- MCFG_TICKET_DISPENSER_ADD("ticket", attotime::from_msec(350), TICKET_MOTOR_ACTIVE_HIGH, TICKET_STATUS_ACTIVE_HIGH )
- MCFG_TICKET_DISPENSER_ADD("token", attotime::from_msec(350), TICKET_MOTOR_ACTIVE_HIGH, TICKET_STATUS_ACTIVE_HIGH )
+ TICKET_DISPENSER(config, m_ticket, attotime::from_msec(350), TICKET_MOTOR_ACTIVE_HIGH, TICKET_STATUS_ACTIVE_HIGH);
+ TICKET_DISPENSER(config, m_token, attotime::from_msec(350), TICKET_MOTOR_ACTIVE_HIGH, TICKET_STATUS_ACTIVE_HIGH);
/* sound hardware */
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("oki", OKIM6295, XTAL(1'000'000), okim6295_device::PIN7_HIGH) /* verified on pcb */
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
- MCFG_DEVICE_ADDRESS_MAP(0, oki_map)
-MACHINE_CONFIG_END
+ OKIM6295(config, m_oki, XTAL(1'000'000), okim6295_device::PIN7_HIGH); /* verified on pcb */
+ m_oki->add_route(ALL_OUTPUTS, "mono", 1.0);
+ m_oki->set_addrmap(0, &playmark_state::oki_map);
+}
/***************************************************************************
diff --git a/src/mame/drivers/plus4.cpp b/src/mame/drivers/plus4.cpp
index 3f7866dcd5b..95fc4a8b922 100644
--- a/src/mame/drivers/plus4.cpp
+++ b/src/mame/drivers/plus4.cpp
@@ -295,7 +295,7 @@ uint8_t plus4_state::read_memory(address_space &space, offs_t offset, int ba, in
}
else if (!_6551 && m_acia)
{
- data = m_acia->read(space, offset & 0x03);
+ data = m_acia->read(offset & 0x03);
}
else if (!keyport)
{
@@ -371,7 +371,7 @@ uint8_t plus4_state::read_memory(address_space &space, offs_t offset, int ba, in
data = m_ram->pointer()[offset & m_ram->mask()];
}
- return m_exp->cd_r(space, offset, data, ba, cs0, c1l, c1h, cs1, c2l, c2h);
+ return m_exp->cd_r(offset, data, ba, cs0, c1l, c1h, cs1, c2l, c2h);
}
@@ -416,7 +416,7 @@ WRITE8_MEMBER( plus4_state::write )
}
else if (!_6551 && m_acia)
{
- m_acia->write(space, offset & 0x03, data);
+ m_acia->write(offset & 0x03, data);
}
else if (!addr_clk)
{
@@ -431,7 +431,7 @@ WRITE8_MEMBER( plus4_state::write )
m_ram->pointer()[offset & m_ram->mask()] = data;
}
- m_exp->cd_w(space, offset, data, ba, cs0, c1l, c1h, cs1, c2l, c2h);
+ m_exp->cd_w(offset, data, ba, cs0, c1l, c1h, cs1, c2l, c2h);
}
@@ -837,7 +837,7 @@ void plus4_state::machine_reset()
//**************************************************************************
//-------------------------------------------------
-// MACHINE_CONFIG( plus4 )
+// machine_config( plus4 )
//-------------------------------------------------
void plus4_state::plus4(machine_config &config)
@@ -930,8 +930,8 @@ void plus4_state::plus4(machine_config &config)
m_exp->cd_wr_callback().set(FUNC(plus4_state::write));
m_exp->aec_wr_callback().set_inputline(MOS7501_TAG, INPUT_LINE_HALT);
- quickload_image_device &quickload(QUICKLOAD(config, "quickload", 0));
- quickload.set_handler(snapquick_load_delegate(&QUICKLOAD_LOAD_NAME(plus4_state, cbm_c16), this), "p00,prg", CBM_QUICKLOAD_DELAY_SECONDS);
+ quickload_image_device &quickload(QUICKLOAD(config, "quickload"));
+ quickload.set_handler(snapquick_load_delegate(&QUICKLOAD_LOAD_NAME(plus4_state, cbm_c16), this), "p00,prg", CBM_QUICKLOAD_DELAY);
// internal ram
RAM(config, m_ram).set_default_size("64K");
@@ -939,7 +939,7 @@ void plus4_state::plus4(machine_config &config)
//-------------------------------------------------
-// MACHINE_CONFIG( plus4p )
+// machine_config( plus4p )
//-------------------------------------------------
void c16_state::plus4p(machine_config &config)
@@ -958,7 +958,7 @@ void c16_state::plus4p(machine_config &config)
}
//-------------------------------------------------
-// MACHINE_CONFIG( plus4n )
+// machine_config( plus4n )
//-------------------------------------------------
void c16_state::plus4n(machine_config &config)
@@ -978,7 +978,7 @@ void c16_state::plus4n(machine_config &config)
//-------------------------------------------------
-// MACHINE_CONFIG( c16n )
+// machine_config( c16n )
//-------------------------------------------------
void c16_state::c16n(machine_config &config)
@@ -999,7 +999,7 @@ void c16_state::c16n(machine_config &config)
//-------------------------------------------------
-// MACHINE_CONFIG( c16p )
+// machine_config( c16p )
//-------------------------------------------------
void c16_state::c16p(machine_config &config)
@@ -1027,7 +1027,7 @@ void c16_state::c232(machine_config &config)
//-------------------------------------------------
-// MACHINE_CONFIG( v364 )
+// machine_config( v364 )
//-------------------------------------------------
void c16_state::v364(machine_config &config)
diff --git a/src/mame/drivers/pmi80.cpp b/src/mame/drivers/pmi80.cpp
index 86ace8c1736..93a6f48aa8a 100644
--- a/src/mame/drivers/pmi80.cpp
+++ b/src/mame/drivers/pmi80.cpp
@@ -168,16 +168,17 @@ void pmi80_state::machine_start()
}
-MACHINE_CONFIG_START(pmi80_state::pmi80)
+void pmi80_state::pmi80(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu",I8080, XTAL(1'000'000))
- MCFG_DEVICE_PROGRAM_MAP(pmi80_mem)
- MCFG_DEVICE_IO_MAP(pmi80_io)
+ I8080(config, m_maincpu, XTAL(1'000'000));
+ m_maincpu->set_addrmap(AS_PROGRAM, &pmi80_state::pmi80_mem);
+ m_maincpu->set_addrmap(AS_IO, &pmi80_state::pmi80_io);
/* video hardware */
config.set_default_layout(layout_pmi80);
-MACHINE_CONFIG_END
+}
/* ROM definition */
ROM_START( pmi80 )
diff --git a/src/mame/drivers/pntnpuzl.cpp b/src/mame/drivers/pntnpuzl.cpp
index e8272f42498..bd4695a2963 100644
--- a/src/mame/drivers/pntnpuzl.cpp
+++ b/src/mame/drivers/pntnpuzl.cpp
@@ -353,9 +353,10 @@ static INPUT_PORTS_START( pntnpuzl )
PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_D)
INPUT_PORTS_END
-MACHINE_CONFIG_START(pntnpuzl_state::pntnpuzl)
- MCFG_DEVICE_ADD("maincpu", M68000, 12_MHz_XTAL)
- MCFG_DEVICE_PROGRAM_MAP(pntnpuzl_map)
+void pntnpuzl_state::pntnpuzl(machine_config &config)
+{
+ M68000(config, m_maincpu, 12_MHz_XTAL);
+ m_maincpu->set_addrmap(AS_PROGRAM, &pntnpuzl_state::pntnpuzl_map);
EEPROM_93C46_16BIT(config, "eeprom");
@@ -373,13 +374,12 @@ MACHINE_CONFIG_START(pntnpuzl_state::pntnpuzl)
mcu.ach7_cb().set_constant(0x180); // ?
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_RAW_PARAMS(XTAL(25'174'800),900,0,640,526,0,480)
- MCFG_SCREEN_UPDATE_DEVICE("vga", vga_device, screen_update)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_raw(XTAL(25'174'800),900,0,640,526,0,480);
+ screen.set_screen_update("vga", FUNC(vga_device::screen_update));
- MCFG_DEVICE_ADD("vga", VGA, 0)
- MCFG_VIDEO_SET_SCREEN("screen")
-MACHINE_CONFIG_END
+ VGA(config, "vga", 0).set_screen("screen");
+}
ROM_START( pntnpuzl )
ROM_REGION( 0x80000, "maincpu", 0 ) /* 68000 Code */
diff --git a/src/mame/drivers/pockchal.cpp b/src/mame/drivers/pockchal.cpp
index 0d4a900e346..f0a699cd39d 100644
--- a/src/mame/drivers/pockchal.cpp
+++ b/src/mame/drivers/pockchal.cpp
@@ -92,7 +92,7 @@ void pockchalv1_state::machine_start()
{
address_space &space = m_maincpu->space(AS_PROGRAM);
if (m_cart->exists())
- space.install_read_handler(0x0000, 0x7fff, read8_delegate(FUNC(generic_slot_device::read_rom),(generic_slot_device*)m_cart));
+ space.install_read_handler(0x0000, 0x7fff, read8sm_delegate(FUNC(generic_slot_device::read_rom),(generic_slot_device*)m_cart));
}
void pockchalv1_state::machine_reset()
@@ -101,31 +101,29 @@ void pockchalv1_state::machine_reset()
MACHINE_CONFIG_START(pockchalv1_state::pockchalv1)
-
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", TMP90845,8000000) /* ? MHz */
- MCFG_DEVICE_PROGRAM_MAP(pockchalv1_map)
-// MCFG_DEVICE_VBLANK_INT_DRIVER("screen", pockchalv1_state, irq0_line_hold)
+ TMP90845(config, m_maincpu, 8000000); /* ? MHz */
+ m_maincpu->set_addrmap(AS_PROGRAM, &pockchalv1_state::pockchalv1_map);
+// m_maincpu->->set_vblank_int("screen", FUNC(pockchalv1_state::irq0_line_hold));
// wrong, it's a b&w / greyscale thing
PALETTE(config, "palette").set_format(palette_device::xRGB_444, 0x100).set_endianness(ENDIANNESS_BIG);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(256, 256)
- MCFG_SCREEN_VISIBLE_AREA(0, 256-1, 16, 256-16-1)
- MCFG_SCREEN_UPDATE_DRIVER(pockchalv1_state, screen_update_pockchalv1)
- MCFG_SCREEN_PALETTE("palette")
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(256, 256);
+ screen.set_visarea(0, 256-1, 16, 256-16-1);
+ screen.set_screen_update(FUNC(pockchalv1_state::screen_update_pockchalv1));
+ screen.set_palette("palette");
MCFG_GENERIC_CARTSLOT_ADD("cartslot", generic_plain_slot, "pockchalw_cart")
MCFG_GENERIC_EXTENSIONS("bin")
MCFG_GENERIC_LOAD(pockchalv1_state, pockchalv1_cart)
MCFG_GENERIC_MANDATORY
- MCFG_SOFTWARE_LIST_COMPATIBLE_ADD("pc1_list","pockchalw")
-
+ SOFTWARE_LIST(config, "pc1_list").set_compatible("pockchalw");
MACHINE_CONFIG_END
diff --git a/src/mame/drivers/pockstat.cpp b/src/mame/drivers/pockstat.cpp
index 869cfc9bc0e..f78ee0d9f40 100644
--- a/src/mame/drivers/pockstat.cpp
+++ b/src/mame/drivers/pockstat.cpp
@@ -795,11 +795,11 @@ READ32_MEMBER(pockstat_state::ps_rombank_r)
if (m_ftlb_regs.entry[index] == bank)
{
//printf( "Address %08x is assigned to %08x in entry %d\n", 0x02000000 + (offset << 2), index * 0x2000 + ((offset << 2) & 0x1fff), index );
- return m_cart->read32_rom(space, index * (0x2000/4) + (offset & (0x1fff/4)), mem_mask);
+ return m_cart->read32_rom(index * (0x2000/4) + (offset & (0x1fff/4)), mem_mask);
}
}
}
- return m_cart->read32_rom(space, offset & 0x7fff, mem_mask);
+ return m_cart->read32_rom(offset & 0x7fff, mem_mask);
}
@@ -831,7 +831,7 @@ WRITE32_MEMBER(pockstat_state::ps_flash_w)
READ32_MEMBER(pockstat_state::ps_flash_r)
{
- return m_cart->read32_rom(space, offset, mem_mask);
+ return m_cart->read32_rom(offset, mem_mask);
}
READ32_MEMBER(pockstat_state::ps_audio_r)
@@ -981,23 +981,24 @@ DEVICE_IMAGE_LOAD_MEMBER( pockstat_state, pockstat_flash )
MACHINE_CONFIG_START(pockstat_state::pockstat)
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", ARM7, DEFAULT_CLOCK)
- MCFG_DEVICE_PROGRAM_MAP(pockstat_mem)
+ ARM7(config, m_maincpu, DEFAULT_CLOCK);
+ m_maincpu->set_addrmap(AS_PROGRAM, &pockstat_state::pockstat_mem);
/* video hardware */
- MCFG_SCREEN_ADD("screen", LCD)
- MCFG_SCREEN_REFRESH_RATE(50)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */
- MCFG_SCREEN_SIZE(32, 32)
- MCFG_SCREEN_VISIBLE_AREA(0, 32-1, 0, 32-1)
- MCFG_SCREEN_UPDATE_DRIVER(pockstat_state, screen_update_pockstat)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_LCD));
+ screen.set_refresh_hz(50);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */
+ screen.set_size(32, 32);
+ screen.set_visarea(0, 32-1, 0, 32-1);
+ screen.set_screen_update(FUNC(pockstat_state::screen_update_pockstat));
PALETTE(config, "palette", palette_device::MONOCHROME);
SPEAKER(config, "speaker").front_center();
- MCFG_DEVICE_ADD("dac", DAC_16BIT_R2R_TWOS_COMPLEMENT, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 0.5) // unknown DAC
- MCFG_DEVICE_ADD("vref", VOLTAGE_REGULATOR, 0) MCFG_VOLTAGE_REGULATOR_OUTPUT(5.0)
- MCFG_SOUND_ROUTE(0, "dac", 1.0, DAC_VREF_POS_INPUT) MCFG_SOUND_ROUTE(0, "dac", -1.0, DAC_VREF_NEG_INPUT)
+ DAC_16BIT_R2R_TWOS_COMPLEMENT(config, "dac", 0).add_route(ALL_OUTPUTS, "speaker", 0.5); // unknown DAC
+ voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref"));
+ vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT);
+ vref.add_route(0, "dac", -1.0, DAC_VREF_NEG_INPUT);
/* cartridge */
MCFG_GENERIC_CARTSLOT_ADD("cartslot", generic_plain_slot, "pockstat_cart")
diff --git a/src/mame/drivers/pofo.cpp b/src/mame/drivers/pofo.cpp
index 582d7baaaf8..01a62f67877 100644
--- a/src/mame/drivers/pofo.cpp
+++ b/src/mame/drivers/pofo.cpp
@@ -590,7 +590,7 @@ READ8_MEMBER( portfolio_state::mem_r )
case CCM_A:
if (LOG) logerror("%s %s CCM0 read %05x\n", machine().time().as_string(), machine().describe_context(), offset & 0x1ffff);
- data = m_ccm->nrdi_r(space, offset & 0x1ffff);
+ data = m_ccm->nrdi_r(offset & 0x1ffff);
break;
case CCM_B:
@@ -607,7 +607,7 @@ READ8_MEMBER( portfolio_state::mem_r )
data = m_rom[offset & 0x3ffff];
}
- data = m_exp->nrdi_r(space, offset, data, iom, bcom, ncc1);
+ data = m_exp->nrdi_r(offset, data, iom, bcom, ncc1);
return data;
}
@@ -638,7 +638,7 @@ WRITE8_MEMBER( portfolio_state::mem_w )
case CCM_A:
if (LOG) logerror("%s %s CCM0 write %05x:%02x\n", machine().time().as_string(), machine().describe_context(), offset & 0x1ffff, data);
- m_ccm->nwri_w(space, offset & 0x1ffff, data);
+ m_ccm->nwri_w(offset & 0x1ffff, data);
break;
case CCM_B:
@@ -647,7 +647,7 @@ WRITE8_MEMBER( portfolio_state::mem_w )
}
}
- m_exp->nwri_w(space, offset, data, iom, bcom, ncc1);
+ m_exp->nwri_w(offset, data, iom, bcom, ncc1);
}
@@ -703,7 +703,7 @@ READ8_MEMBER( portfolio_state::io_r )
}
}
- data = m_exp->nrdi_r(space, offset, data, iom, bcom, ncc1);
+ data = m_exp->nrdi_r(offset, data, iom, bcom, ncc1);
return data;
}
@@ -767,7 +767,7 @@ WRITE8_MEMBER( portfolio_state::io_w )
}
}
- m_exp->nwri_w(space, offset, data, iom, bcom, ncc1);
+ m_exp->nwri_w(offset, data, iom, bcom, ncc1);
}
@@ -1011,60 +1011,60 @@ void portfolio_state::machine_reset()
//**************************************************************************
//-------------------------------------------------
-// MACHINE_CONFIG( portfolio )
+// machine_config( portfolio )
//-------------------------------------------------
-MACHINE_CONFIG_START(portfolio_state::portfolio)
+void portfolio_state::portfolio(machine_config &config)
+{
// basic machine hardware
- MCFG_DEVICE_ADD(M80C88A_TAG, I8088, XTAL(4'915'200))
- MCFG_DEVICE_PROGRAM_MAP(portfolio_mem)
- MCFG_DEVICE_IO_MAP(portfolio_io)
- MCFG_DEVICE_IRQ_ACKNOWLEDGE_DRIVER(portfolio_state,portfolio_int_ack)
+ I8088(config, m_maincpu, XTAL(4'915'200));
+ m_maincpu->set_addrmap(AS_PROGRAM, &portfolio_state::portfolio_mem);
+ m_maincpu->set_addrmap(AS_IO, &portfolio_state::portfolio_io);
+ m_maincpu->set_irq_acknowledge_callback(FUNC(portfolio_state::portfolio_int_ack));
// video hardware
- MCFG_SCREEN_ADD(SCREEN_TAG, LCD)
- MCFG_SCREEN_REFRESH_RATE(72)
- MCFG_SCREEN_UPDATE_DEVICE(HD61830_TAG, hd61830_device, screen_update)
- MCFG_SCREEN_SIZE(240, 64)
- MCFG_SCREEN_VISIBLE_AREA(0, 240-1, 0, 64-1)
- MCFG_SCREEN_PALETTE("palette")
+ screen_device &screen(SCREEN(config, SCREEN_TAG, SCREEN_TYPE_LCD));
+ screen.set_refresh_hz(72);
+ screen.set_screen_update(HD61830_TAG, FUNC(hd61830_device::screen_update));
+ screen.set_size(240, 64);
+ screen.set_visarea(0, 240-1, 0, 64-1);
+ screen.set_palette("palette");
PALETTE(config, "palette", FUNC(portfolio_state::portfolio_palette), 2);
GFXDECODE(config, "gfxdecode", "palette", gfx_portfolio);
- MCFG_DEVICE_ADD(HD61830_TAG, HD61830, XTAL(4'915'200)/2/2)
- MCFG_DEVICE_ADDRESS_MAP(0, portfolio_lcdc)
- MCFG_HD61830_RD_CALLBACK(READ8(*this, portfolio_state, hd61830_rd_r))
- MCFG_VIDEO_SET_SCREEN(SCREEN_TAG)
+ HD61830(config, m_lcdc, XTAL(4'915'200)/2/2);
+ m_lcdc->set_addrmap(0, &portfolio_state::portfolio_lcdc);
+ m_lcdc->rd_rd_callback().set(FUNC(portfolio_state::hd61830_rd_r));
+ m_lcdc->set_screen(SCREEN_TAG);
// sound hardware
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD(PCD3311T_TAG, PCD3311, XTAL(3'578'640))
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25)
+ PCD3311(config, m_dtmf, XTAL(3'578'640)).add_route(ALL_OUTPUTS, "mono", 0.25);
// devices
- MCFG_PORTFOLIO_MEMORY_CARD_SLOT_ADD(PORTFOLIO_MEMORY_CARD_SLOT_A_TAG, portfolio_memory_cards, nullptr)
+ PORTFOLIO_MEMORY_CARD_SLOT(config, m_ccm, portfolio_memory_cards, nullptr);
- MCFG_PORTFOLIO_EXPANSION_SLOT_ADD(PORTFOLIO_EXPANSION_SLOT_TAG, XTAL(4'915'200), portfolio_expansion_cards, nullptr)
- MCFG_PORTFOLIO_EXPANSION_SLOT_EINT_CALLBACK(WRITELINE(*this, portfolio_state, eint_w))
- MCFG_PORTFOLIO_EXPANSION_SLOT_NMIO_CALLBACK(INPUTLINE(M80C88A_TAG, INPUT_LINE_NMI))
- MCFG_PORTFOLIO_EXPANSION_SLOT_WAKE_CALLBACK(WRITELINE(*this, portfolio_state, wake_w))
+ PORTFOLIO_EXPANSION_SLOT(config, m_exp, XTAL(4'915'200), portfolio_expansion_cards, nullptr);
+ m_exp->eint_wr_callback().set(FUNC(portfolio_state::eint_w));
+ m_exp->nmio_wr_callback().set_inputline(m_maincpu, INPUT_LINE_NMI);
+ m_exp->wake_wr_callback().set(FUNC(portfolio_state::wake_w));
- MCFG_TIMER_DRIVER_ADD_PERIODIC("counter", portfolio_state, counter_tick, attotime::from_hz(XTAL(32'768)/16384))
- MCFG_TIMER_DRIVER_ADD_PERIODIC(TIMER_TICK_TAG, portfolio_state, system_tick, attotime::from_hz(XTAL(32'768)/32768))
+ TIMER(config, "counter").configure_periodic(FUNC(portfolio_state::counter_tick), attotime::from_hz(XTAL(32'768)/16384));
+ TIMER(config, TIMER_TICK_TAG).configure_periodic(FUNC(portfolio_state::system_tick), attotime::from_hz(XTAL(32'768)/32768));
// fake keyboard
- MCFG_TIMER_DRIVER_ADD_PERIODIC("keyboard", portfolio_state, keyboard_tick, attotime::from_usec(2500))
+ TIMER(config, "keyboard").configure_periodic(FUNC(portfolio_state::keyboard_tick), attotime::from_usec(2500));
// software list
- MCFG_SOFTWARE_LIST_ADD("cart_list", "pofo")
+ SOFTWARE_LIST(config, "cart_list").set_original("pofo");
// internal ram
RAM(config, RAM_TAG).set_default_size("128K");
NVRAM(config, "nvram", nvram_device::DEFAULT_RANDOM);
-MACHINE_CONFIG_END
+}
diff --git a/src/mame/drivers/poisk1.cpp b/src/mame/drivers/poisk1.cpp
index ccb3a81dda8..d7cf7be86f4 100644
--- a/src/mame/drivers/poisk1.cpp
+++ b/src/mame/drivers/poisk1.cpp
@@ -41,26 +41,27 @@
#include "speaker.h"
+//#define LOG_GENERAL (1U << 0) //defined in logmacro.h already
+#define LOG_KEYBOARD (1U << 1)
+#define LOG_DEBUG (1U << 2)
+
+//#define VERBOSE (LOG_DEBUG)
+//#define LOG_OUTPUT_FUNC printf
+#include "logmacro.h"
+
+#define LOGKBD(...) LOGMASKED(LOG_KEYBOARD, __VA_ARGS__)
+#define LOGDBG(...) LOGMASKED(LOG_DEBUG, __VA_ARGS__)
+
+
#define CGA_PALETTE_SETS 83
/* one for colour, one for mono, 81 for colour composite */
#define BG_COLOR(x) (((x)&7) | (((x)&0x10) >> 1))
-#define VERBOSE_DBG 0
-
-#define DBG_LOG(N,M,A) \
- do { \
- if(VERBOSE_DBG>=N) \
- { \
- if( M ) \
- logerror("%11.6f at %s: %-10s",machine().time().as_double(),machine().describe_context(),(char*)M ); \
- logerror A; \
- } \
- } while (0)
-
#define POISK1_UPDATE_ROW(name) \
void name(bitmap_rgb32 &bitmap, const rectangle &cliprect, uint8_t *videoram, uint16_t ma, uint8_t ra, uint8_t stride)
+
class p1_state : public driver_device
{
public:
@@ -167,21 +168,21 @@ private:
READ8_MEMBER(p1_state::p1_trap_r)
{
uint8_t data = m_video.trap[offset];
- DBG_LOG(1, "trap", ("R %.2x $%02x\n", 0x28 + offset, data));
+ LOG("trap R %.2x $%02x\n", 0x28 + offset, data);
if (offset == 0) m_maincpu->set_input_line(INPUT_LINE_NMI, CLEAR_LINE);
return data;
}
WRITE8_MEMBER(p1_state::p1_trap_w)
{
- DBG_LOG(1, "trap", ("W %.2x $%02x\n", 0x28 + offset, data));
+ LOG("trap W %.2x $%02x\n", 0x28 + offset, data);
}
READ8_MEMBER(p1_state::p1_cga_r)
{
uint16_t port = offset + 0x3d0;
- DBG_LOG(1, "cga", ("R %.4x\n", port));
+ LOG("cga R %.4x\n", port);
m_video.trap[1] = 0x40 | ((port >> 8) & 0x3f);
m_video.trap[0] = port & 255;
m_maincpu->set_input_line(INPUT_LINE_NMI, ASSERT_LINE);
@@ -192,7 +193,7 @@ WRITE8_MEMBER(p1_state::p1_cga_w)
{
uint16_t port = offset + 0x3d0;
- DBG_LOG(1, "cga", ("W %.4x $%02x\n", port, data));
+ LOG("cga W %.4x $%02x\n", port, data);
m_video.trap[2] = data;
m_video.trap[1] = 0xC0 | ((port >> 8) & 0x3f);
m_video.trap[0] = port & 255;
@@ -201,7 +202,7 @@ WRITE8_MEMBER(p1_state::p1_cga_w)
WRITE8_MEMBER(p1_state::p1_vram_w)
{
- DBG_LOG(1, "vram", ("W %.4x $%02x\n", offset, data));
+ LOG("vram W %.4x $%02x\n", offset, data);
if (m_video.videoram_base) m_video.videoram_base[offset] = data;
m_video.trap[2] = data;
m_video.trap[1] = 0x80 | ((offset >> 8) & 0x3f);
@@ -223,7 +224,7 @@ WRITE8_MEMBER(p1_state::p1_ppi2_porta_w)
{
address_space &program = m_maincpu->space(AS_PROGRAM);
- DBG_LOG(1, "color_select_68", ("W $%02x\n", data));
+ LOG("color_select_68 W $%02x\n", data);
// NMI DISABLE
if (BIT((data ^ m_video.color_select_68), 3))
@@ -266,7 +267,7 @@ WRITE8_MEMBER(p1_state::p1_ppi2_porta_w)
WRITE8_MEMBER(p1_state::p1_ppi_portc_w)
{
- DBG_LOG(1, "mode_control_6a", ("W $%02x\n", data));
+ LOG("mode_control_6a W $%02x\n", data);
m_video.mode_control_6a = data;
set_palette_luts();
@@ -324,7 +325,7 @@ POISK1_UPDATE_ROW(p1_state::cga_gfx_2bpp_update_row)
uint16_t odd, offset;
int i;
- if (ra == 0) DBG_LOG(1, "cga_gfx_2bpp_update_row", ("\n"));
+ if (ra == 0) LOG("cga_gfx_2bpp_update_row\n");
odd = (ra & 1) << 13;
offset = (ma & 0x1fff) | odd;
for (i = 0; i < stride; i++)
@@ -352,7 +353,7 @@ POISK1_UPDATE_ROW(p1_state::cga_gfx_1bpp_update_row)
uint16_t odd, offset;
int i;
- if (ra == 0) DBG_LOG(1, "cga_gfx_1bpp_update_row", ("bg %d\n", bg));
+ if (ra == 0) LOG("cga_gfx_1bpp_update_row bg %d\n", bg);
odd = (ra & 1) << 13;
offset = (ma & 0x1fff) | odd;
for (i = 0; i < stride; i++)
@@ -384,7 +385,7 @@ POISK1_UPDATE_ROW(p1_state::poisk1_gfx_1bpp_update_row)
uint16_t odd, offset;
int i;
- if (ra == 0) DBG_LOG(1, "poisk1_gfx_1bpp_update_row", ("bg %d\n", bg));
+ if (ra == 0) LOG("poisk1_gfx_1bpp_update_row bg %d\n", bg);
odd = (ra & 1) << 13;
offset = (ma & 0x1fff) | odd;
for (i = 0; i < stride; i++)
@@ -406,8 +407,6 @@ POISK1_UPDATE_ROW(p1_state::poisk1_gfx_1bpp_update_row)
// Initialise the cga palette
void p1_state::p1_palette(palette_device &palette) const
{
- DBG_LOG(0, "init", ("palette_init()\n"));
-
for (int i = 0; i < CGA_PALETTE_SETS * 16; i++)
palette.set_pen_color(i, cga_palette[i][0], cga_palette[i][1], cga_palette[i][2]);
}
@@ -416,8 +415,6 @@ void p1_state::video_start()
{
address_space &space = m_maincpu->space(AS_PROGRAM);
- DBG_LOG(0, "init", ("video_start()\n"));
-
memset(&m_video, 0, sizeof(m_video));
m_video.videoram_base = std::make_unique<uint8_t[]>(0x8000);
m_video.videoram = m_video.videoram_base.get();
@@ -478,7 +475,7 @@ WRITE_LINE_MEMBER(p1_state::p1_pit8253_out2_changed)
WRITE8_MEMBER(p1_state::p1_ppi_porta_w)
{
m_kbpoll_mask = data;
- DBG_LOG(2, "p1_ppi_porta_w", ("( %02X -> %02X )\n", data, m_kbpoll_mask));
+ LOGDBG("p1_ppi_porta_w %02X <- %02X\n", m_kbpoll_mask, data);
}
READ8_MEMBER(p1_state::p1_ppi_porta_r)
@@ -486,7 +483,7 @@ READ8_MEMBER(p1_state::p1_ppi_porta_r)
uint8_t ret;
ret = m_kbpoll_mask;
- DBG_LOG(1, "p1_ppi_porta_r", ("= %02X\n", ret));
+ LOG("p1_ppi_porta_r = %02X\n", ret);
return ret;
}
@@ -504,7 +501,7 @@ READ8_MEMBER(p1_state::p1_ppi_portb_r)
}
ret = key & 0xff;
-// DBG_LOG(1,"p1_ppi_portb_r",("= %02X\n", ret));
+// LOG("p1_ppi_portb_r = %02X\n", ret);
return ret;
}
@@ -522,7 +519,7 @@ READ8_MEMBER(p1_state::p1_ppi_portc_r)
}
ret = (key >> 8) & 0xff;
- DBG_LOG(2,"p1_ppi_portc_r",("= %02X\n", ret));
+ LOGDBG("p1_ppi_portc_r = %02X\n", ret);
return ret;
}
@@ -535,7 +532,7 @@ READ8_MEMBER(p1_state::p1_ppi2_portc_r)
data = (data & ~0x10) | (tap_val < 0 ? 0x10 : 0x00);
- DBG_LOG(2, "p1_ppi_portc_r", ("= %02X (tap_val %f) at %s\n", data, tap_val, machine().describe_context()));
+ LOGDBG("p1_ppi_portc_r = %02X (tap_val %f) at %s\n", data, tap_val, machine().describe_context());
return data;
}
@@ -562,7 +559,7 @@ READ8_MEMBER(p1_state::p1_ppi_r)
case 3:
return m_ppi8255n2->read(offset);
default:
- DBG_LOG(1, "p1ppi", ("R %.2x (unimp)\n", 0x60 + offset));
+ LOG("p1ppi R %.2x (unimp)\n", 0x60 + offset);
return 0xff;
}
}
@@ -584,7 +581,7 @@ WRITE8_MEMBER(p1_state::p1_ppi_w)
case 3:
return m_ppi8255n2->write(offset, data);
default:
- DBG_LOG(1, "p1ppi", ("W %.2x $%02x (unimp)\n", 0x60 + offset, data));
+ LOG("p1ppi W %.2x $%02x (unimp)\n", 0x60 + offset, data);
return;
}
}
@@ -599,21 +596,16 @@ void p1_state::init_poisk1()
{
address_space &program = m_maincpu->space(AS_PROGRAM);
- DBG_LOG(0, "init", ("driver_init()\n"));
-
program.install_readwrite_bank(0, m_ram->size() - 1, "bank10");
membank("bank10")->set_base(m_ram->pointer());
}
void p1_state::machine_start()
{
- DBG_LOG(0, "init", ("machine_start()\n"));
}
void p1_state::machine_reset()
{
- DBG_LOG(0, "init", ("machine_reset()\n"));
-
m_kbpoll_mask = 0;
}
@@ -642,14 +634,15 @@ static INPUT_PORTS_START( poisk1 )
PORT_INCLUDE( poisk1_keyboard_v91 )
INPUT_PORTS_END
-MACHINE_CONFIG_START(p1_state::poisk1)
+void p1_state::poisk1(machine_config &config)
+{
/* basic machine hardware */
I8088(config, m_maincpu, 5000000);
m_maincpu->set_addrmap(AS_PROGRAM, &p1_state::poisk1_map);
m_maincpu->set_addrmap(AS_IO, &p1_state::poisk1_io);
m_maincpu->set_irq_acknowledge_callback("pic8259", FUNC(pic8259_device::inta_cb));
- PIT8253(config, m_pit8253, 0);
+ PIT8253(config, m_pit8253);
m_pit8253->set_clk<0>(XTAL(15'000'000)/12); /* heartbeat IRQ */
m_pit8253->out_handler<0>().set(m_pic8259, FUNC(pic8259_device::ir0_w));
m_pit8253->set_clk<1>(XTAL(15'000'000)/12); /* keyboard poll -- XXX edge or level triggered? */
@@ -657,7 +650,7 @@ MACHINE_CONFIG_START(p1_state::poisk1)
m_pit8253->set_clk<2>(XTAL(15'000'000)/12); /* pio port c pin 4, and speaker polling enough */
m_pit8253->out_handler<2>().set(FUNC(p1_state::p1_pit8253_out2_changed));
- PIC8259(config, m_pic8259, 0);
+ PIC8259(config, m_pic8259);
m_pic8259->out_int_callback().set_inputline(m_maincpu, 0);
I8255A(config, m_ppi8255n1);
@@ -673,38 +666,38 @@ MACHINE_CONFIG_START(p1_state::poisk1)
m_ppi8255n2->in_pc_callback().set(FUNC(p1_state::p1_ppi2_portc_r)); /*62H*/
ISA8(config, m_isabus, 0);
- m_isabus->set_cputag("maincpu");
+ m_isabus->set_memspace("maincpu", AS_PROGRAM);
+ m_isabus->set_iospace("maincpu", AS_IO);
m_isabus->irq2_callback().set(m_pic8259, FUNC(pic8259_device::ir2_w));
m_isabus->irq3_callback().set(m_pic8259, FUNC(pic8259_device::ir3_w));
m_isabus->irq4_callback().set(m_pic8259, FUNC(pic8259_device::ir4_w));
m_isabus->irq5_callback().set(m_pic8259, FUNC(pic8259_device::ir5_w));
m_isabus->irq7_callback().set(m_pic8259, FUNC(pic8259_device::ir7_w));
- MCFG_DEVICE_ADD("isa1", ISA8_SLOT, 0, "isa", p1_isa8_cards, "fdc", false) // FIXME: determine ISA bus clock
- MCFG_DEVICE_ADD("isa2", ISA8_SLOT, 0, "isa", p1_isa8_cards, nullptr, false)
- MCFG_DEVICE_ADD("isa3", ISA8_SLOT, 0, "isa", p1_isa8_cards, nullptr, false)
- MCFG_DEVICE_ADD("isa4", ISA8_SLOT, 0, "isa", p1_isa8_cards, nullptr, false)
+ ISA8_SLOT(config, "isa1", 0, m_isabus, p1_isa8_cards, "fdc", false); // FIXME: determine ISA bus clock
+ ISA8_SLOT(config, "isa2", 0, m_isabus, p1_isa8_cards, nullptr, false);
+ ISA8_SLOT(config, "isa3", 0, m_isabus, p1_isa8_cards, nullptr, false);
+ ISA8_SLOT(config, "isa4", 0, m_isabus, p1_isa8_cards, nullptr, false);
- MCFG_CASSETTE_ADD( "cassette" )
- MCFG_CASSETTE_DEFAULT_STATE(CASSETTE_STOPPED | CASSETTE_MOTOR_ENABLED | CASSETTE_SPEAKER_ENABLED)
+ CASSETTE(config, m_cassette);
+ m_cassette->set_default_state(CASSETTE_STOPPED | CASSETTE_MOTOR_ENABLED | CASSETTE_SPEAKER_ENABLED);
- MCFG_SOFTWARE_LIST_ADD("flop_list","poisk1_flop")
-// MCFG_SOFTWARE_LIST_ADD("cass_list","poisk1_cass")
+ SOFTWARE_LIST(config, "flop_list").set_original("poisk1_flop");
+// SOFTWARE_LIST(config, "cass_list").set_original("poisk1_cass");
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD( "speaker", SPEAKER_SOUND )
- MCFG_SOUND_ROUTE( ALL_OUTPUTS, "mono", 1.00 )
+ SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 1.00);
- MCFG_SCREEN_ADD( "screen", RASTER )
- MCFG_SCREEN_RAW_PARAMS( XTAL(15'000'000), 912,0,640, 262,0,200 )
- MCFG_SCREEN_UPDATE_DRIVER( p1_state, screen_update )
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_raw(XTAL(15'000'000), 912,0,640, 262,0,200);
+ m_screen->set_screen_update(FUNC(p1_state::screen_update));
/* XXX verify palette */
PALETTE(config, m_palette, FUNC(p1_state::p1_palette), CGA_PALETTE_SETS * 16);
/* internal ram */
RAM(config, RAM_TAG).set_default_size("512K");
-MACHINE_CONFIG_END
+}
ROM_START( poisk1 )
ROM_REGION16_LE(0x10000,"bios", 0)
diff --git a/src/mame/drivers/pokechmp.cpp b/src/mame/drivers/pokechmp.cpp
index 9dcdfdc4add..11662fdc8c7 100644
--- a/src/mame/drivers/pokechmp.cpp
+++ b/src/mame/drivers/pokechmp.cpp
@@ -226,8 +226,8 @@ WRITE_LINE_MEMBER(pokechmp_state::sound_irq)
m_audiocpu->set_input_line(0, HOLD_LINE);
}
-MACHINE_CONFIG_START(pokechmp_state::pokechmp)
-
+void pokechmp_state::pokechmp(machine_config &config)
+{
/* basic machine hardware */
M6502(config, m_maincpu, 4_MHz_XTAL/4);
m_maincpu->set_addrmap(AS_PROGRAM, &pokechmp_state::pokechmp_map);
@@ -246,7 +246,7 @@ MACHINE_CONFIG_START(pokechmp_state::pokechmp)
screen.screen_vblank().set_inputline(m_maincpu, INPUT_LINE_NMI);
screen.screen_vblank().append(FUNC(pokechmp_state::sound_irq));
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_pokechmp)
+ GFXDECODE(config, m_gfxdecode, m_palette, gfx_pokechmp);
PALETTE(config, m_palette).set_format(palette_device::xBGR_555, 0x400);
/* sound hardware */
@@ -254,17 +254,15 @@ MACHINE_CONFIG_START(pokechmp_state::pokechmp)
GENERIC_LATCH_8(config, m_soundlatch);
- MCFG_DEVICE_ADD("ym1", YM2203, XTAL(4'000'000)/4)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.60)
+ YM2203(config, "ym1", XTAL(4'000'000)/4).add_route(ALL_OUTPUTS, "mono", 0.60);
- MCFG_DEVICE_ADD("ym2", YM3812, XTAL(24'000'000)/16)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
+ YM3812(config, "ym2", XTAL(24'000'000)/16).add_route(ALL_OUTPUTS, "mono", 1.0);
- MCFG_DEVICE_ADD("oki", OKIM6295, XTAL(24'000'000)/16, okim6295_device::PIN7_LOW)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.50) /* sound fx */
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.50)
- MCFG_DEVICE_ADDRESS_MAP(0, pokechmp_oki_map)
-MACHINE_CONFIG_END
+ okim6295_device &oki(OKIM6295(config, "oki", XTAL(24'000'000)/16, okim6295_device::PIN7_LOW));
+ oki.add_route(ALL_OUTPUTS, "mono", 0.50); /* sound fx */
+ oki.add_route(ALL_OUTPUTS, "mono", 0.50);
+ oki.set_addrmap(0, &pokechmp_state::pokechmp_oki_map);
+}
void pokechmp_state::init_pokechmp()
{
diff --git a/src/mame/drivers/pokemini.cpp b/src/mame/drivers/pokemini.cpp
index 8fe2547852c..7b369fe7b87 100644
--- a/src/mame/drivers/pokemini.cpp
+++ b/src/mame/drivers/pokemini.cpp
@@ -126,7 +126,7 @@ private:
READ8_MEMBER( pokemini_state::rom_r )
{
offset += 0x2100;
- return m_cart->read_rom(space, offset & 0x1fffff);
+ return m_cart->read_rom(offset & 0x1fffff);
}
void pokemini_state::pokemini_mem_map(address_map &map)
diff --git a/src/mame/drivers/poker72.cpp b/src/mame/drivers/poker72.cpp
index ff8c55b240a..96522df743a 100644
--- a/src/mame/drivers/poker72.cpp
+++ b/src/mame/drivers/poker72.cpp
@@ -371,20 +371,21 @@ void poker72_state::machine_reset()
membank("bank1")->set_entry(0);
}
-MACHINE_CONFIG_START(poker72_state::poker72)
+void poker72_state::poker72(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80,8000000) /* ? MHz */
- MCFG_DEVICE_PROGRAM_MAP(poker72_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", poker72_state, irq0_line_hold)
+ Z80(config, m_maincpu, 8000000); /* ? MHz */
+ m_maincpu->set_addrmap(AS_PROGRAM, &poker72_state::poker72_map);
+ m_maincpu->set_vblank_int("screen", FUNC(poker72_state::irq0_line_hold));
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(64*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0, 64*8-1, 0, 32*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(poker72_state, screen_update_poker72)
- MCFG_SCREEN_PALETTE(m_palette)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(64*8, 32*8);
+ screen.set_visarea(0, 64*8-1, 0, 32*8-1);
+ screen.set_screen_update(FUNC(poker72_state::screen_update_poker72));
+ screen.set_palette(m_palette);
GFXDECODE(config, m_gfxdecode, m_palette, gfx_poker72);
PALETTE(config, m_palette, FUNC(poker72_state::poker72_palette), 0xe00);
@@ -395,7 +396,7 @@ MACHINE_CONFIG_START(poker72_state::poker72)
ay.port_a_read_callback().set_ioport("SW2");
ay.port_b_read_callback().set_ioport("SW3");
ay.add_route(ALL_OUTPUTS, "mono", 0.50);
-MACHINE_CONFIG_END
+}
diff --git a/src/mame/drivers/polepos.cpp b/src/mame/drivers/polepos.cpp
index 85a32760f35..583ca54b1a4 100644
--- a/src/mame/drivers/polepos.cpp
+++ b/src/mame/drivers/polepos.cpp
@@ -1053,7 +1053,6 @@ void polepos_state::topracern(machine_config &config)
dac.add_route(ALL_OUTPUTS, "rspeaker", 0.12);
voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref", 0));
- vref.set_output(5.0);
vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT);
vref.add_route(0, "dac", -1.0, DAC_VREF_NEG_INPUT);
}
diff --git a/src/mame/drivers/poly.cpp b/src/mame/drivers/poly.cpp
index 9853ee4f05c..06d9be0e9cf 100644
--- a/src/mame/drivers/poly.cpp
+++ b/src/mame/drivers/poly.cpp
@@ -248,36 +248,35 @@ static void poly_floppies(device_slot_interface &device)
}
-MACHINE_CONFIG_START(poly_state::poly)
+void poly_state::poly(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", MC6809, 12.0576_MHz_XTAL / 3)
- MCFG_DEVICE_PROGRAM_MAP(poly_mem)
+ MC6809(config, m_maincpu, 12.0576_MHz_XTAL / 3);
+ m_maincpu->set_addrmap(AS_PROGRAM, &poly_state::poly_mem);
ADDRESS_MAP_BANK(config, "bankdev").set_map(&poly_state::poly_bank).set_options(ENDIANNESS_LITTLE, 8, 17, 0x10000);
- MCFG_INPUT_MERGER_ANY_HIGH("irqs")
- MCFG_INPUT_MERGER_OUTPUT_HANDLER(INPUTLINE("maincpu", M6809_IRQ_LINE))
+ INPUT_MERGER_ANY_HIGH(config, "irqs").output_handler().set_inputline(m_maincpu, M6809_IRQ_LINE);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(50)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500))
- MCFG_SCREEN_SIZE(40 * 12, 24 * 20)
- MCFG_SCREEN_VISIBLE_AREA(0, 40 * 12 - 1, 0, 24 * 20 - 1)
- MCFG_SCREEN_UPDATE_DRIVER(poly_state, screen_update)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(50);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500));
+ screen.set_size(40 * 12, 24 * 20);
+ screen.set_visarea(0, 40 * 12 - 1, 0, 24 * 20 - 1);
+ screen.set_screen_update(FUNC(poly_state::screen_update));
- MCFG_DEVICE_ADD("saa5050_1", SAA5050, 12.0576_MHz_XTAL / 2)
- MCFG_SAA5050_D_CALLBACK(READ8(*this, poly_state, videoram_1_r))
- MCFG_SAA5050_SCREEN_SIZE(40, 24, 40)
+ SAA5050(config, m_trom[0], 12.0576_MHz_XTAL / 2);
+ m_trom[0]->d_cb().set(FUNC(poly_state::videoram_1_r));
+ m_trom[0]->set_screen_size(40, 24, 40);
- MCFG_DEVICE_ADD("saa5050_2", SAA5050, 12.0576_MHz_XTAL / 2)
- MCFG_SAA5050_D_CALLBACK(READ8(*this, poly_state, videoram_2_r))
- MCFG_SAA5050_SCREEN_SIZE(40, 24, 40)
+ SAA5050(config, m_trom[1], 12.0576_MHz_XTAL / 2);
+ m_trom[1]->d_cb().set(FUNC(poly_state::videoram_2_r));
+ m_trom[1]->set_screen_size(40, 24, 40);
/* sound hardware */
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("speaker", SPEAKER_SOUND)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.50)
+ SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.50);
/* internal ram */
RAM(config, m_ram).set_default_size("128K").set_extra_options("64K");
@@ -343,21 +342,23 @@ MACHINE_CONFIG_START(poly_state::poly)
/* software lists */
SOFTWARE_LIST(config, "flop_list").set_original("poly_flop").set_filter("POLY1");
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(poly_state::poly2)
+void poly_state::poly2(machine_config &config)
+{
poly(config);
/* internal ram */
m_ram->set_default_size("128K");
/* software lists */
- MCFG_SOFTWARE_LIST_FILTER("flop_list", "POLY2")
-MACHINE_CONFIG_END
+ subdevice<software_list_device>("flop_list")->set_filter("POLY2");
+}
-MACHINE_CONFIG_START(polydev_state::polydev)
+void polydev_state::polydev(machine_config &config)
+{
poly(config);
/* fdc */
@@ -365,15 +366,13 @@ MACHINE_CONFIG_START(polydev_state::polydev)
m_fdc->hld_wr_callback().set(FUNC(polydev_state::motor_w));
m_fdc->set_force_ready(true);
- MCFG_FLOPPY_DRIVE_ADD("fdc:0", poly_floppies, "525sd", polydev_state::floppy_formats)
- MCFG_FLOPPY_DRIVE_SOUND(true)
- MCFG_FLOPPY_DRIVE_ADD("fdc:1", poly_floppies, nullptr, polydev_state::floppy_formats)
- MCFG_FLOPPY_DRIVE_SOUND(true)
+ FLOPPY_CONNECTOR(config, "fdc:0", poly_floppies, "525sd", polydev_state::floppy_formats).enable_sound(true);
+ FLOPPY_CONNECTOR(config, "fdc:1", poly_floppies, nullptr, polydev_state::floppy_formats).enable_sound(true);
/* remove devices*/
- //MCFG_DEVICE_REMOVE("netup")
- //MCFG_DEVICE_REMOVE("netdown")
-MACHINE_CONFIG_END
+ //config.device_remove("netup");
+ //config.device_remove("netdown");
+}
/* ROM definition */
diff --git a/src/mame/drivers/poly88.cpp b/src/mame/drivers/poly88.cpp
index 3d24a4bf349..60ea6f60a35 100644
--- a/src/mame/drivers/poly88.cpp
+++ b/src/mame/drivers/poly88.cpp
@@ -197,33 +197,33 @@ GFXDECODE_END
MACHINE_CONFIG_START(poly88_state::poly88)
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", I8080A, XTAL(16'588'800) / 9) // uses 8224 clock generator
- MCFG_DEVICE_PROGRAM_MAP(poly88_mem)
- MCFG_DEVICE_IO_MAP(poly88_io)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", poly88_state, poly88_interrupt)
- MCFG_DEVICE_IRQ_ACKNOWLEDGE_DRIVER(poly88_state,poly88_irq_callback)
+ I8080A(config, m_maincpu, XTAL(16'588'800) / 9); // uses 8224 clock generator
+ m_maincpu->set_addrmap(AS_PROGRAM, &poly88_state::poly88_mem);
+ m_maincpu->set_addrmap(AS_IO, &poly88_state::poly88_io);
+ m_maincpu->set_vblank_int("screen", FUNC(poly88_state::poly88_interrupt));
+ m_maincpu->set_irq_acknowledge_callback(FUNC(poly88_state::poly88_irq_callback));
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */
- MCFG_SCREEN_SIZE(64*10, 16*15)
- MCFG_SCREEN_VISIBLE_AREA(0, 64*10-1, 0, 16*15-1)
- MCFG_SCREEN_UPDATE_DRIVER(poly88_state, screen_update_poly88)
- MCFG_SCREEN_PALETTE("palette")
-
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_poly88)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */
+ screen.set_size(64*10, 16*15);
+ screen.set_visarea(0, 64*10-1, 0, 16*15-1);
+ screen.set_screen_update(FUNC(poly88_state::screen_update_poly88));
+ screen.set_palette("palette");
+
+ GFXDECODE(config, "gfxdecode", "palette", gfx_poly88);
PALETTE(config, "palette", palette_device::MONOCHROME);
/* audio hardware */
SPEAKER(config, "mono").front_center();
- WAVE(config, "wave", "cassette").add_route(ALL_OUTPUTS, "mono", 0.25);
+ WAVE(config, "wave", m_cassette).add_route(ALL_OUTPUTS, "mono", 0.25);
/* cassette */
- MCFG_CASSETTE_ADD( "cassette" )
- MCFG_CASSETTE_CREATE_OPTS(&poly88_cassette_options)
- MCFG_CASSETTE_DEFAULT_STATE(CASSETTE_STOPPED | CASSETTE_SPEAKER_ENABLED)
+ CASSETTE(config, m_cassette);
+ m_cassette->set_create_opts(&poly88_cassette_options);
+ m_cassette->set_default_state(CASSETTE_STOPPED | CASSETTE_SPEAKER_ENABLED);
/* uart */
I8251(config, m_uart, XTAL(16'588'800) / 9);
@@ -231,15 +231,15 @@ MACHINE_CONFIG_START(poly88_state::poly88)
m_uart->rxrdy_handler().set(FUNC(poly88_state::poly88_usart_rxready));
/* snapshot */
- MCFG_SNAPSHOT_ADD("snapshot", poly88_state, poly88, "img", 2)
+ MCFG_SNAPSHOT_ADD("snapshot", poly88_state, poly88, "img", attotime::from_seconds(2))
MACHINE_CONFIG_END
-MACHINE_CONFIG_START(poly88_state::poly8813)
+void poly88_state::poly8813(machine_config &config)
+{
poly88(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(poly8813_mem)
- MCFG_DEVICE_IO_MAP(poly8813_io)
-MACHINE_CONFIG_END
+ m_maincpu->set_addrmap(AS_PROGRAM, &poly88_state::poly8813_mem);
+ m_maincpu->set_addrmap(AS_IO, &poly88_state::poly8813_io);
+}
/* ROM definition */
ROM_START( poly88 )
diff --git a/src/mame/drivers/poly880.cpp b/src/mame/drivers/poly880.cpp
index 30b9b44df64..d079ba13e65 100644
--- a/src/mame/drivers/poly880.cpp
+++ b/src/mame/drivers/poly880.cpp
@@ -245,11 +245,12 @@ void poly880_state::machine_start()
/* Machine Driver */
-MACHINE_CONFIG_START(poly880_state::poly880)
+void poly880_state::poly880(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD(Z80_TAG, Z80, XTAL(7'372'800)/8)
- MCFG_DEVICE_PROGRAM_MAP(poly880_mem)
- MCFG_DEVICE_IO_MAP(poly880_io)
+ Z80(config, m_maincpu, XTAL(7'372'800)/8);
+ m_maincpu->set_addrmap(AS_PROGRAM, &poly880_state::poly880_mem);
+ m_maincpu->set_addrmap(AS_IO, &poly880_state::poly880_io);
/* video hardware */
config.set_default_layout(layout_poly880);
@@ -270,12 +271,12 @@ MACHINE_CONFIG_START(poly880_state::poly880)
z80pio_device& pio2(Z80PIO(config, Z80PIO2_TAG, XTAL(7'372'800)/16));
pio2.out_int_callback().set_inputline(m_maincpu, INPUT_LINE_IRQ0);
- MCFG_CASSETTE_ADD("cassette")
- MCFG_CASSETTE_DEFAULT_STATE(CASSETTE_STOPPED | CASSETTE_MOTOR_ENABLED | CASSETTE_SPEAKER_MUTED)
+ CASSETTE(config, m_cassette);
+ m_cassette->set_default_state(CASSETTE_STOPPED | CASSETTE_MOTOR_ENABLED | CASSETTE_SPEAKER_MUTED);
/* internal ram */
RAM(config, RAM_TAG).set_default_size("1K");
-MACHINE_CONFIG_END
+}
/* ROMs */
diff --git a/src/mame/drivers/polyplay.cpp b/src/mame/drivers/polyplay.cpp
index 276dec717b0..e1c572457b9 100644
--- a/src/mame/drivers/polyplay.cpp
+++ b/src/mame/drivers/polyplay.cpp
@@ -276,7 +276,8 @@ GFXDECODE_END
/* the machine driver */
-MACHINE_CONFIG_START(polyplay_state::polyplay_zre)
+void polyplay_state::polyplay_zre(machine_config &config)
+{
/* basic machine hardware */
Z80(config, m_maincpu, POLYPLAY_MAIN_CLOCK / 4); /* UB880D */
m_maincpu->set_daisy_config(daisy_chain_zre);
@@ -299,12 +300,12 @@ MACHINE_CONFIG_START(polyplay_state::polyplay_zre)
m_z80pio->out_pb_callback().set(FUNC(polyplay_state::pio_portb_w));
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(50)
- MCFG_SCREEN_SIZE(64*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 64*8-1, 0*8, 32*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(polyplay_state, screen_update_polyplay)
- MCFG_SCREEN_PALETTE(m_palette)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(50);
+ screen.set_size(64*8, 32*8);
+ screen.set_visarea(0*8, 64*8-1, 0*8, 32*8-1);
+ screen.set_screen_update(FUNC(polyplay_state::screen_update_polyplay));
+ screen.set_palette(m_palette);
GFXDECODE(config, m_gfxdecode, m_palette, gfx_polyplay);
PALETTE(config, m_palette, FUNC(polyplay_state::polyplay_palette), 10);
@@ -313,7 +314,7 @@ MACHINE_CONFIG_START(polyplay_state::polyplay_zre)
SPEAKER(config, "mono").front_center();
SPEAKER_SOUND(config, m_speaker1).add_route(ALL_OUTPUTS, "mono", 0.5);
SPEAKER_SOUND(config, m_speaker2).add_route(ALL_OUTPUTS, "mono", 0.5);
-MACHINE_CONFIG_END
+}
void polyplay_state::polyplay_zrepp(machine_config &config)
{
diff --git a/src/mame/drivers/pong.cpp b/src/mame/drivers/pong.cpp
index 0f7c0b87957..515789872e3 100644
--- a/src/mame/drivers/pong.cpp
+++ b/src/mame/drivers/pong.cpp
@@ -4,6 +4,7 @@
Pong (c) 1972 Atari
Pong Doubles (c) 1973 Atari
+Rebound (c) 1974 Atari
Breakout (c) 1976 Atari
driver by Couriersud
@@ -27,6 +28,7 @@ driver by Couriersud
TM-0?? Dr. Pong/Puppy Pong/Snoopy Pong (1974) A001433? NO
422,TM-029 Superpong (1974) A000423 NO
TM-014,029 Pong Doubles/Coupe Davis (1973) A000785 NO
+ TM-001,023,029,032 Rebound/Spike/Volleyball (1974) A000517,A000846,SPIKE-(A or B) NO
TM-058 Breakout/Breakout Cocktail/Consolette (1976) A004533 NO
Notes:
@@ -41,6 +43,7 @@ TODO: Dr. Pong, Pong In-A-Barrel, Puppy Pong, Snoopy Pong, and Cocktail Pong are
be verified.
TODO: Superpong is believed to use the Pong (Rev E) PCB with some minor modifications, this
needs to be verified.
+TODO: Volleyball...
***************************************************************************/
@@ -58,10 +61,12 @@ TODO: Superpong is believed to use the Pong (Rev E) PCB with some minor modifica
#include "machine/nl_breakout.h"
#include "machine/nl_pong.h"
#include "machine/nl_pongd.h"
+#include "machine/nl_rebound.h"
#include "screen.h"
#include "speaker.h"
+#include "rebound.lh"
#include "breakout.lh"
#include <cmath>
@@ -115,13 +120,6 @@ TODO: Superpong is believed to use the Pong (Rev E) PCB with some minor modifica
#define V_TOTAL_BREAKOUT (0xFC) // 252
#define H_TOTAL_BREAKOUT (448) // 448
-#if 0
-#define HBSTART (H_TOTAL_PONG)
-#define HBEND (80)
-#define VBSTART (V_TOTAL_PONG)
-#define VBEND (16)
-#endif
-
enum input_changed_enum
{
IC_PADDLE1,
@@ -184,6 +182,15 @@ public:
void pongd(machine_config &config);
void pong(machine_config &config);
void pongf(machine_config &config);
+
+ NETLIST_START(pong)
+
+ MEMREGION_SOURCE("maincpu")
+ PARAM(NETLIST.USE_DEACTIVATE, 1)
+ INCLUDE(pong_schematics)
+
+ NETLIST_END()
+
protected:
// driver_device overrides
@@ -260,13 +267,56 @@ private:
};
-static NETLIST_START(pong)
+class rebound_state : public ttl_mono_state
+{
+public:
+ rebound_state(const machine_config &mconfig, device_type type, const char *tag)
+ : ttl_mono_state(mconfig, type, tag)
+ , m_sw1a(*this, "maincpu:dsw1a")
+ , m_sw1b(*this, "maincpu:dsw1b")
+ {
+ }
+
+ // sub devices
+ required_device<netlist_mame_logic_input_device> m_sw1a;
+ required_device<netlist_mame_logic_input_device> m_sw1b;
+
+ DECLARE_INPUT_CHANGED_MEMBER(input_changed);
+
+ NETDEV_ANALOG_CALLBACK_MEMBER(led_credit_cb)
+ {
+ output().set_value("credit_led", (data < 3.5) ? 1 : 0);
+ }
+
+ NETDEV_ANALOG_CALLBACK_MEMBER(coin_counter_cb)
+ {
+ machine().bookkeeping().coin_counter_w(0, (data < 1.0));
+ }
+
+ void rebound(machine_config &config);
+
+ NETLIST_START(rebound)
+
+ //MEMREGION_SOURCE("maincpu")
+ LOCAL_SOURCE(rebound_schematics)
+ PARAM(NETLIST.USE_DEACTIVATE, 1)
+ //FIXME: unknown name causes segmentation fault
+ //INCLUDE(rebound)
+ INCLUDE(rebound_schematics)
+
+ NETLIST_END()
+
+protected:
- MEMREGION_SOURCE("maincpu")
- PARAM(NETLIST.USE_DEACTIVATE, 1)
- INCLUDE(pong_schematics)
+ // driver_device overrides
+ virtual void machine_start() override { };
+ virtual void machine_reset() override { };
+ virtual void video_start() override { };
+
+private:
+
+};
-NETLIST_END()
INPUT_CHANGED_MEMBER(pong_state::input_changed)
{
@@ -281,6 +331,20 @@ INPUT_CHANGED_MEMBER(pong_state::input_changed)
}
}
+INPUT_CHANGED_MEMBER(rebound_state::input_changed)
+{
+ int numpad = uintptr_t(param);
+
+ switch (numpad)
+ {
+ case IC_SWITCH:
+ m_sw1a->write(newval ? 1 : 0);
+ m_sw1b->write(newval ? 1 : 0);
+ break;
+ }
+}
+
+
static INPUT_PORTS_START( pong )
PORT_START( "PADDLE0" ) /* fake input port for player 1 paddle */
PORT_BIT( 0xff, 0x00, IPT_PADDLE ) PORT_SENSITIVITY(2) PORT_KEYDELTA(100) PORT_CENTERDELTA(0) NETLIST_ANALOG_PORT_CHANGED("maincpu", "pot0")
@@ -375,11 +439,36 @@ static INPUT_PORTS_START( breakout )
INPUT_PORTS_END
+static INPUT_PORTS_START( rebound )
+// FIXME later
+ PORT_START( "PADDLE0" ) /* fake input port for player 1 paddle */
+ PORT_BIT( 0xff, 0x00, IPT_PADDLE ) PORT_SENSITIVITY(1) PORT_KEYDELTA(100) PORT_CENTERDELTA(0) NETLIST_ANALOG_PORT_CHANGED("maincpu", "pot1")
+
+ PORT_START( "PADDLE1" ) /* fake input port for player 2 paddle */
+ PORT_BIT( 0xff, 0x00, IPT_PADDLE ) PORT_SENSITIVITY(1) PORT_KEYDELTA(100) PORT_CENTERDELTA(0) PORT_PLAYER(2) NETLIST_ANALOG_PORT_CHANGED("maincpu", "pot2")
+
+ PORT_START("IN0") /* fake as well */
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_COIN1 ) NETLIST_LOGIC_PORT_CHANGED("maincpu", "coinsw")
+ PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START1 ) NETLIST_LOGIC_PORT_CHANGED("maincpu", "startsw")
+ PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_SERVICE ) PORT_NAME("Antenna") NETLIST_LOGIC_PORT_CHANGED("maincpu", "antenna")
+
+ PORT_START("DIPS")
+ PORT_DIPNAME( 0x03, 0x00, "Game Won" ) PORT_DIPLOCATION("SW1A:1,SW1A:2") PORT_CHANGED_MEMBER(DEVICE_SELF, rebound_state, input_changed, IC_SWITCH)
+ PORT_DIPSETTING( 0x00, "11" )
+ PORT_DIPSETTING( 0x03, "15" )
+
+ PORT_DIPNAME( 0x04, 0x00, DEF_STR( Coinage ) ) PORT_DIPLOCATION("SW1A:3") NETLIST_LOGIC_PORT_CHANGED("maincpu", "dsw2")
+ PORT_DIPSETTING( 0x00, DEF_STR( 1C_1C ) )
+ PORT_DIPSETTING( 0x04, DEF_STR( 1C_2C ) )
+INPUT_PORTS_END
+
+
MACHINE_CONFIG_START(pong_state::pong)
/* basic machine hardware */
MCFG_DEVICE_ADD("maincpu", NETLIST_CPU, NETLIST_CLOCK)
- MCFG_NETLIST_SETUP(pong)
+ //MCFG_NETLIST_SETUP(pong)
+ MCFG_NETLIST_SETUP_MEMBER(this, &pong_state::NETLIST_NAME(pong))
MCFG_NETLIST_ANALOG_INPUT("maincpu", "vr0", "ic_b9_R.R")
MCFG_NETLIST_ANALOG_MULT_OFFSET(1.0 / 100.0 * RES_K(50), RES_K(56) )
@@ -393,21 +482,23 @@ MACHINE_CONFIG_START(pong_state::pong)
MCFG_NETLIST_LOGIC_INPUT("maincpu", "antenna", "antenna.IN", 0)
MCFG_NETLIST_ANALOG_OUTPUT("maincpu", "snd0", "sound", pong_state, sound_cb, "")
- MCFG_NETLIST_ANALOG_OUTPUT("maincpu", "vid0", "videomix", fixedfreq_device, update_vid, "fixfreq")
+ MCFG_NETLIST_ANALOG_OUTPUT("maincpu", "vid0", "videomix", fixedfreq_device, update_composite_monochrome, "fixfreq")
/* video hardware */
- MCFG_FIXFREQ_ADD("fixfreq", "screen")
- MCFG_FIXFREQ_MONITOR_CLOCK(MASTER_CLOCK)
- MCFG_FIXFREQ_HORZ_PARAMS(H_TOTAL_PONG-67,H_TOTAL_PONG-40,H_TOTAL_PONG-8,H_TOTAL_PONG)
- MCFG_FIXFREQ_VERT_PARAMS(V_TOTAL_PONG-22,V_TOTAL_PONG-19,V_TOTAL_PONG-12,V_TOTAL_PONG)
- MCFG_FIXFREQ_FIELDCOUNT(1)
- MCFG_FIXFREQ_SYNC_THRESHOLD(0.11)
+ SCREEN(config, "screen", SCREEN_TYPE_RASTER);
+ FIXFREQ(config, m_video).set_screen("screen");
+ m_video->set_monitor_clock(MASTER_CLOCK);
+ m_video->set_horz_params(H_TOTAL_PONG-67,H_TOTAL_PONG-40,H_TOTAL_PONG-8,H_TOTAL_PONG);
+ m_video->set_vert_params(V_TOTAL_PONG-22,V_TOTAL_PONG-19,V_TOTAL_PONG-12,V_TOTAL_PONG);
+ m_video->set_fieldcount(1);
+ m_video->set_threshold(0.11);
/* sound hardware */
SPEAKER(config, "speaker").front_center();
- MCFG_DEVICE_ADD("dac", DAC_16BIT_R2R_TWOS_COMPLEMENT, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 0.5) // unknown DAC
- MCFG_DEVICE_ADD("vref", VOLTAGE_REGULATOR, 0) MCFG_VOLTAGE_REGULATOR_OUTPUT(5.0)
- MCFG_SOUND_ROUTE(0, "dac", 1.0, DAC_VREF_POS_INPUT) MCFG_SOUND_ROUTE(0, "dac", -1.0, DAC_VREF_NEG_INPUT)
+ DAC_16BIT_R2R_TWOS_COMPLEMENT(config, m_dac, 0).add_route(ALL_OUTPUTS, "speaker", 0.5); // unknown DAC
+ voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref"));
+ vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT);
+ vref.add_route(0, "dac", -1.0, DAC_VREF_NEG_INPUT);
MACHINE_CONFIG_END
MACHINE_CONFIG_START(breakout_state::breakout)
@@ -435,7 +526,7 @@ MACHINE_CONFIG_START(breakout_state::breakout)
MCFG_NETLIST_LOGIC_INPUT("maincpu", "antenna", "antenna.IN", 0)
MCFG_NETLIST_ANALOG_OUTPUT("maincpu", "snd0", "sound", breakout_state, sound_cb, "")
- MCFG_NETLIST_ANALOG_OUTPUT("maincpu", "vid0", "videomix", fixedfreq_device, update_vid, "fixfreq")
+ MCFG_NETLIST_ANALOG_OUTPUT("maincpu", "vid0", "videomix", fixedfreq_device, update_composite_monochrome, "fixfreq")
// Leds and lamps
@@ -445,22 +536,24 @@ MACHINE_CONFIG_START(breakout_state::breakout)
MCFG_NETLIST_ANALOG_OUTPUT("maincpu", "coin_counter", "CON_T", breakout_state, coin_counter_cb, "")
/* video hardware */
- MCFG_FIXFREQ_ADD("fixfreq", "screen")
+ SCREEN(config, "screen", SCREEN_TYPE_RASTER);
+ FIXFREQ(config, m_video).set_screen("screen");
/* The Pixel width is a 2,1,2,1,2,1,1,1 repeating pattern
* Thus we must use double resolution horizontally
*/
- MCFG_FIXFREQ_MONITOR_CLOCK(MASTER_CLOCK_BREAKOUT*2)
- MCFG_FIXFREQ_HORZ_PARAMS((H_TOTAL_BREAKOUT-104)*2,(H_TOTAL_BREAKOUT-72)*2,(H_TOTAL_BREAKOUT-8)*2, (H_TOTAL_BREAKOUT)*2)
- MCFG_FIXFREQ_VERT_PARAMS(V_TOTAL_BREAKOUT-22,V_TOTAL_BREAKOUT-23,V_TOTAL_BREAKOUT-4, V_TOTAL_BREAKOUT)
- MCFG_FIXFREQ_FIELDCOUNT(1)
- MCFG_FIXFREQ_SYNC_THRESHOLD(1.0)
- MCFG_FIXFREQ_GAIN(1.5)
+ m_video->set_monitor_clock(MASTER_CLOCK_BREAKOUT*2);
+ m_video->set_horz_params((H_TOTAL_BREAKOUT-104)*2,(H_TOTAL_BREAKOUT-72)*2,(H_TOTAL_BREAKOUT-8)*2, (H_TOTAL_BREAKOUT)*2);
+ m_video->set_vert_params(V_TOTAL_BREAKOUT-22,V_TOTAL_BREAKOUT-23,V_TOTAL_BREAKOUT-4, V_TOTAL_BREAKOUT);
+ m_video->set_fieldcount(1);
+ m_video->set_threshold(1.0);
+ m_video->set_gain(1.5);
/* sound hardware */
SPEAKER(config, "speaker").front_center();
- MCFG_DEVICE_ADD("dac", DAC_16BIT_R2R_TWOS_COMPLEMENT, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 0.5) // unknown DAC
- MCFG_DEVICE_ADD("vref", VOLTAGE_REGULATOR, 0) MCFG_VOLTAGE_REGULATOR_OUTPUT(5.0)
- MCFG_SOUND_ROUTE(0, "dac", 1.0, DAC_VREF_POS_INPUT) MCFG_SOUND_ROUTE(0, "dac", -1.0, DAC_VREF_NEG_INPUT)
+ DAC_16BIT_R2R_TWOS_COMPLEMENT(config, m_dac, 0).add_route(ALL_OUTPUTS, "speaker", 0.5); // unknown DAC
+ voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref"));
+ vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT);
+ vref.add_route(0, "dac", -1.0, DAC_VREF_NEG_INPUT);
MACHINE_CONFIG_END
MACHINE_CONFIG_START(pong_state::pongf)
@@ -486,28 +579,78 @@ MACHINE_CONFIG_START(pong_state::pongd)
MCFG_NETLIST_LOGIC_INPUT("maincpu", "sw1b", "DIPSW2.POS", 0)
MCFG_NETLIST_LOGIC_INPUT("maincpu", "coinsw", "COIN_SW.POS", 0)
MCFG_NETLIST_LOGIC_INPUT("maincpu", "startsw", "START_SW.POS", 0)
+
#if 0
MCFG_NETLIST_LOGIC_INPUT("maincpu", "antenna", "antenna.IN", 0, 0x01)
#endif
MCFG_NETLIST_ANALOG_OUTPUT("maincpu", "snd0", "AUDIO", pong_state, sound_cb, "")
- MCFG_NETLIST_ANALOG_OUTPUT("maincpu", "vid0", "videomix", fixedfreq_device, update_vid, "fixfreq")
+ MCFG_NETLIST_ANALOG_OUTPUT("maincpu", "vid0", "videomix", fixedfreq_device, update_composite_monochrome, "fixfreq")
/* video hardware */
- MCFG_FIXFREQ_ADD("fixfreq", "screen")
- MCFG_FIXFREQ_MONITOR_CLOCK(MASTER_CLOCK)
- MCFG_FIXFREQ_HORZ_PARAMS(H_TOTAL_PONG-67,H_TOTAL_PONG-52,H_TOTAL_PONG-8,H_TOTAL_PONG)
- MCFG_FIXFREQ_VERT_PARAMS(V_TOTAL_PONG-22,V_TOTAL_PONG-19,V_TOTAL_PONG-12,V_TOTAL_PONG)
- MCFG_FIXFREQ_FIELDCOUNT(1)
- MCFG_FIXFREQ_SYNC_THRESHOLD(0.11)
+ SCREEN(config, "screen", SCREEN_TYPE_RASTER);
+ FIXFREQ(config, m_video).set_screen("screen");
+ m_video->set_monitor_clock(MASTER_CLOCK);
+ m_video->set_horz_params(H_TOTAL_PONG-67,H_TOTAL_PONG-52,H_TOTAL_PONG-8,H_TOTAL_PONG);
+ m_video->set_vert_params(V_TOTAL_PONG-22,V_TOTAL_PONG-19,V_TOTAL_PONG-12,V_TOTAL_PONG);
+ m_video->set_fieldcount(1);
+ m_video->set_threshold(0.11);
/* sound hardware */
SPEAKER(config, "speaker").front_center();
- MCFG_DEVICE_ADD("dac", DAC_16BIT_R2R_TWOS_COMPLEMENT, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 0.5) // unknown DAC
- MCFG_DEVICE_ADD("vref", VOLTAGE_REGULATOR, 0) MCFG_VOLTAGE_REGULATOR_OUTPUT(5.0)
- MCFG_SOUND_ROUTE(0, "dac", 1.0, DAC_VREF_POS_INPUT) MCFG_SOUND_ROUTE(0, "dac", -1.0, DAC_VREF_NEG_INPUT)
+ DAC_16BIT_R2R_TWOS_COMPLEMENT(config, m_dac, 0).add_route(ALL_OUTPUTS, "speaker", 0.5); // unknown DAC
+ voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref"));
+ vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT);
+ vref.add_route(0, "dac", -1.0, DAC_VREF_NEG_INPUT);
MACHINE_CONFIG_END
+MACHINE_CONFIG_START(rebound_state::rebound)
+
+ /* basic machine hardware */
+ MCFG_DEVICE_ADD("maincpu", NETLIST_CPU, NETLIST_CLOCK)
+ MCFG_NETLIST_SETUP(rebound_schematics)
+ //FIXME: doesn't work - segmentation fault
+ //MCFG_NETLIST_SETUP_MEMBER(this, &rebound_state::NETLIST_NAME(rebound))
+
+ // FIXME: Later
+ MCFG_NETLIST_ANALOG_INPUT("maincpu", "pot1", "POTP1.DIAL")
+ MCFG_NETLIST_ANALOG_INPUT("maincpu", "pot2", "POTP2.DIAL")
+ MCFG_NETLIST_LOGIC_INPUT("maincpu", "antenna", "antenna.IN", 0)
+ MCFG_NETLIST_LOGIC_INPUT("maincpu", "coinsw", "COIN1_SW.POS", 0)
+ MCFG_NETLIST_LOGIC_INPUT("maincpu", "startsw", "START_SW.POS", 0)
+
+ MCFG_NETLIST_LOGIC_INPUT("maincpu", "dsw1a", "DSW1a.POS", 0)
+ MCFG_NETLIST_LOGIC_INPUT("maincpu", "dsw1b", "DSW1b.POS", 0)
+ MCFG_NETLIST_LOGIC_INPUT("maincpu", "dsw2", "DSW2.POS", 0)
+
+ MCFG_NETLIST_ANALOG_OUTPUT("maincpu", "snd0", "sound", rebound_state, sound_cb, "")
+ MCFG_NETLIST_ANALOG_OUTPUT("maincpu", "vid0", "videomix", fixedfreq_device, update_composite_monochrome, "fixfreq")
+
+ MCFG_NETLIST_ANALOG_OUTPUT("maincpu", "led_credit", "CON11", rebound_state, led_credit_cb, "")
+ MCFG_NETLIST_ANALOG_OUTPUT("maincpu", "coin_counter", "CON10", rebound_state, coin_counter_cb, "")
+
+ /* video hardware */
+ SCREEN(config, "screen", SCREEN_TYPE_RASTER);
+ FIXFREQ(config, m_video).set_screen("screen");
+ m_video->set_monitor_clock(MASTER_CLOCK);
+ //m_video->set_horz_params(H_TOTAL_PONG-67,H_TOTAL_PONG-40,H_TOTAL_PONG-8,H_TOTAL_PONG);
+ m_video->set_horz_params(H_TOTAL_PONG-51,H_TOTAL_PONG-40,H_TOTAL_PONG-8,H_TOTAL_PONG);
+ m_video->set_vert_params(V_TOTAL_PONG-22,V_TOTAL_PONG-19,V_TOTAL_PONG-12,V_TOTAL_PONG);
+ m_video->set_fieldcount(1);
+ m_video->set_threshold(1.0);
+ m_video->set_gain(0.6);
+ m_video->set_horz_scale(2);
+
+ /* sound hardware */
+ SPEAKER(config, "speaker").front_center();
+ //FIXME: this is not related to reality at all.
+ DAC_16BIT_R2R_TWOS_COMPLEMENT(config, m_dac, 0).add_route(ALL_OUTPUTS, "speaker", 0.5); // unknown DAC
+ voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref"));
+ vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT);
+ vref.add_route(0, "dac", -1.0, DAC_VREF_NEG_INPUT);
+MACHINE_CONFIG_END
+
+
/***************************************************************************
Game driver(s)
@@ -531,6 +674,11 @@ ROM_START( pongd ) /* dummy to satisfy game entry*/
ROM_REGION( 0x10000, "maincpu", ROMREGION_ERASE00 )
ROM_END
+ROM_START( rebound ) /* dummy to satisfy game entry*/
+ ROM_REGION( 0x10000, "maincpu", ROMREGION_ERASE00 )
+ROM_END
+
+
/* // 100% TTL - NO ROMS
ROM_START( pongbarl ) // dummy to satisfy game entry
@@ -573,15 +721,18 @@ ROM_END
GAME( 1972, pong, 0, pong, pong, pong_state, empty_init, ROT0, "Atari", "Pong (Rev E) external [TTL]", MACHINE_SUPPORTS_SAVE)
GAME( 1972, pongf, 0, pongf, pong, pong_state, empty_init, ROT0, "Atari", "Pong (Rev E) [TTL]", MACHINE_SUPPORTS_SAVE)
GAME( 1973, pongd, 0, pongd, pongd, pong_state, empty_init, ROT0, "Atari", "Pong Doubles [TTL]", MACHINE_SUPPORTS_SAVE)
+GAMEL( 1974, rebound, 0, rebound, rebound, rebound_state, empty_init, ROT0, "Atari", "Rebound (Rev B) [TTL]", MACHINE_SUPPORTS_SAVE, layout_rebound)
GAMEL( 1976, breakout, 0, breakout, breakout, breakout_state, empty_init, ROT90, "Atari", "Breakout [TTL]", MACHINE_SUPPORTS_SAVE, layout_breakout)
// 100% TTL
-//GAME( 1973, coupedav, pongd, pongd, pongd, driver_device, empty_init, ROT0, "Atari France", "Coupe Davis [TTL]", MACHINE_SUPPORTS_SAVE)
-//GAME( 1973, pongbarl, pong, pong, pong, driver_device, empty_init, ROT0, "Atari", "Pong In-A-Barrel [TTL]", MACHINE_SUPPORTS_SAVE)
-//GAME( 1974, cktpong, pong, pong, pong, driver_device, empty_init, ROT0, "Atari / National Entertainment Co.", "Cocktail Pong [TTL]", MACHINE_SUPPORTS_SAVE)
-//GAME( 1974, drpong, pong, pong, pong, driver_device, empty_init, ROT0, "Atari", "Dr. Pong [TTL]", MACHINE_SUPPORTS_SAVE)
-//GAME( 1974, pupppong, pong, pong, pong, driver_device, empty_init, ROT0, "Atari", "Puppy Pong [TTL]", MACHINE_SUPPORTS_SAVE)
-//GAME( 1974, snoopong, pong, pong, pong, driver_device, empty_init, ROT0, "Atari", "Snoopy Pong [TTL]", MACHINE_SUPPORTS_SAVE)
-//GAME( 1974, suprpong, 0, suprpong, pong, driver_device, empty_init, ROT0, "Atari", "Superpong [TTL]", MACHINE_SUPPORTS_SAVE)
-//GAMEL( 1976, breakckt, breakout, breakout, breakout, driver_device, empty_init, ROT90, "Atari", "Breakout Cocktail [TTL]", MACHINE_SUPPORTS_SAVE, layout_breakckt)
-//GAMEL( 1976, consolet, breakout, breakout, breakout, driver_device, empty_init, ROT90, "Atari Europe", "Consolette [TTL]", MACHINE_SUPPORTS_SAVE, layout_consolet)
+//GAMEL(1974, spike, rebound, rebound, rebound, rebound_state, empty_init, ROT0, "Atari/Kee", "Spike [TTL]", MACHINE_IS_SKELETON)
+//GAMEL(1974, volleyball, rebound, rebound, rebound, rebound_state, empty_init, ROT0, "Atari", "Volleyball [TTL]", MACHINE_IS_SKELETON)
+//GAME( 1973, coupedav, pongd, pongd, pongd, pong_state, empty_init, ROT0, "Atari France", "Coupe Davis [TTL]", MACHINE_SUPPORTS_SAVE)
+//GAME( 1973, pongbarl, pong, pong, pong, pong_state, empty_init, ROT0, "Atari", "Pong In-A-Barrel [TTL]", MACHINE_SUPPORTS_SAVE)
+//GAME( 1974, cktpong, pong, pong, pong, pong_state, empty_init, ROT0, "Atari / National Entertainment Co.", "Cocktail Pong [TTL]", MACHINE_SUPPORTS_SAVE)
+//GAME( 1974, drpong, pong, pong, pong, pong_state, empty_init, ROT0, "Atari", "Dr. Pong [TTL]", MACHINE_SUPPORTS_SAVE)
+//GAME( 1974, pupppong, pong, pong, pong, pong_state, empty_init, ROT0, "Atari", "Puppy Pong [TTL]", MACHINE_SUPPORTS_SAVE)
+//GAME( 1974, snoopong, pong, pong, pong, pong_state, empty_init, ROT0, "Atari", "Snoopy Pong [TTL]", MACHINE_SUPPORTS_SAVE)
+//GAME( 1974, suprpong, 0, suprpong, pong, pong_state, empty_init, ROT0, "Atari", "Superpong [TTL]", MACHINE_SUPPORTS_SAVE)
+//GAMEL( 1976, breakckt, breakout, breakout, breakout, breakout_state, empty_init, ROT90, "Atari", "Breakout Cocktail [TTL]", MACHINE_SUPPORTS_SAVE, layout_breakckt)
+//GAMEL( 1976, consolet, breakout, breakout, breakout, breakout_state, empty_init, ROT90, "Atari Europe", "Consolette [TTL]", MACHINE_SUPPORTS_SAVE, layout_consolet)
diff --git a/src/mame/drivers/poolshrk.cpp b/src/mame/drivers/poolshrk.cpp
index ce6ca8118fb..106d142f315 100644
--- a/src/mame/drivers/poolshrk.cpp
+++ b/src/mame/drivers/poolshrk.cpp
@@ -216,32 +216,31 @@ void poolshrk_state::poolshrk_palette(palette_device &palette) const
}
-MACHINE_CONFIG_START(poolshrk_state::poolshrk)
-
+void poolshrk_state::poolshrk(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M6800, 11055000 / 8) /* ? */
- MCFG_DEVICE_PROGRAM_MAP(poolshrk_cpu_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", poolshrk_state, irq0_line_assert)
+ M6800(config, m_maincpu, 11055000 / 8); /* ? */
+ m_maincpu->set_addrmap(AS_PROGRAM, &poolshrk_state::poolshrk_cpu_map);
+ m_maincpu->set_vblank_int("screen", FUNC(poolshrk_state::irq0_line_assert));
WATCHDOG_TIMER(config, m_watchdog);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_SIZE(256, 256)
- MCFG_SCREEN_VISIBLE_AREA(1, 255, 24, 255)
- MCFG_SCREEN_UPDATE_DRIVER(poolshrk_state, screen_update)
- MCFG_SCREEN_PALETTE(m_palette)
-
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, m_palette, gfx_poolshrk)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_size(256, 256);
+ screen.set_visarea(1, 255, 24, 255);
+ screen.set_screen_update(FUNC(poolshrk_state::screen_update));
+ screen.set_palette(m_palette);
+
+ GFXDECODE(config, m_gfxdecode, m_palette, gfx_poolshrk);
PALETTE(config, m_palette, FUNC(poolshrk_state::poolshrk_palette), 4);
/* sound hardware */
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("discrete", DISCRETE, poolshrk_discrete)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
-MACHINE_CONFIG_END
+ DISCRETE(config, m_discrete, poolshrk_discrete).add_route(ALL_OUTPUTS, "mono", 1.0);
+}
ROM_START( poolshrk )
diff --git a/src/mame/drivers/pooyan.cpp b/src/mame/drivers/pooyan.cpp
index 6bc9f9a649c..284134f4ad0 100644
--- a/src/mame/drivers/pooyan.cpp
+++ b/src/mame/drivers/pooyan.cpp
@@ -193,11 +193,11 @@ void pooyan_state::machine_start()
}
-MACHINE_CONFIG_START(pooyan_state::pooyan)
-
+void pooyan_state::pooyan(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, MASTER_CLOCK/3/2)
- MCFG_DEVICE_PROGRAM_MAP(main_map)
+ Z80(config, m_maincpu, MASTER_CLOCK/3/2);
+ m_maincpu->set_addrmap(AS_PROGRAM, &pooyan_state::main_map);
ls259_device &mainlatch(LS259(config, "mainlatch")); // B2
mainlatch.q_out_cb<0>().set(FUNC(pooyan_state::irq_enable_w));
@@ -211,20 +211,20 @@ MACHINE_CONFIG_START(pooyan_state::pooyan)
WATCHDOG_TIMER(config, "watchdog");
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_SIZE(32*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(pooyan_state, screen_update)
- MCFG_SCREEN_PALETTE("palette")
- MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE(*this, pooyan_state, vblank_irq))
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_size(32*8, 32*8);
+ screen.set_visarea(0*8, 32*8-1, 2*8, 30*8-1);
+ screen.set_screen_update(FUNC(pooyan_state::screen_update));
+ screen.set_palette(m_palette);
+ screen.screen_vblank().set(FUNC(pooyan_state::vblank_irq));
GFXDECODE(config, m_gfxdecode, m_palette, gfx_pooyan);
PALETTE(config, m_palette, FUNC(pooyan_state::pooyan_palette), 16*16+16*16, 32);
/* sound hardware */
TIMEPLT_AUDIO(config, "timeplt_audio");
-MACHINE_CONFIG_END
+}
/*************************************
diff --git a/src/mame/drivers/popobear.cpp b/src/mame/drivers/popobear.cpp
index a9f1823e99c..672c799b83e 100644
--- a/src/mame/drivers/popobear.cpp
+++ b/src/mame/drivers/popobear.cpp
@@ -642,35 +642,33 @@ TIMER_DEVICE_CALLBACK_MEMBER(popobear_state::irq)
m_maincpu->set_input_line(2, ASSERT_LINE);
}
-MACHINE_CONFIG_START(popobear_state::popobear)
- MCFG_DEVICE_ADD("maincpu", M68000, XTAL(42'000'000)/4) // XTAL CORRECT, DIVISOR GUESSED
- MCFG_DEVICE_PROGRAM_MAP(popobear_mem)
+void popobear_state::popobear(machine_config &config)
+{
+ M68000(config, m_maincpu, XTAL(42'000'000)/4); // XTAL CORRECT, DIVISOR GUESSED
+ m_maincpu->set_addrmap(AS_PROGRAM, &popobear_state::popobear_mem);
// levels 2,3,5 look interesting
- //MCFG_DEVICE_VBLANK_INT_DRIVER("screen", popobear_state, irq5_line_assert)
- //MCFG_DEVICE_PERIODIC_INT_DRIVER(popobear_state, irq2_line_assert, 120)
- MCFG_TIMER_DRIVER_ADD_SCANLINE("scantimer", popobear_state, irq, "screen", 0, 1)
-
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */
- MCFG_SCREEN_UPDATE_DRIVER(popobear_state, screen_update)
- MCFG_SCREEN_PALETTE(m_palette)
-
- MCFG_SCREEN_SIZE(128*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0, 479, 0, 239)
+ //->set_vblank_int("screen", popobear_state, irq5_line_assert)
+ //->set_periodic_int(FUNC(popobear_state, irq2_line_assert, 120)
+ TIMER(config, "scantimer").configure_scanline(FUNC(popobear_state::irq), "screen", 0, 1);
+
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */
+ screen.set_screen_update(FUNC(popobear_state::screen_update));
+ screen.set_palette(m_palette);
+ screen.set_size(128*8, 32*8);
+ screen.set_visarea(0, 479, 0, 239);
PALETTE(config, m_palette).set_format(palette_device::xBGR_555, 256*2);
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_popobear)
+ GFXDECODE(config, m_gfxdecode, m_palette, gfx_popobear);
- MCFG_DEVICE_ADD("ymsnd", YM2413, XTAL(42'000'000)/16) // XTAL CORRECT, DIVISOR GUESSED
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
+ YM2413(config, "ymsnd", XTAL(42'000'000)/16).add_route(ALL_OUTPUTS, "mono", 1.0); // XTAL CORRECT, DIVISOR GUESSED
- MCFG_DEVICE_ADD("oki", OKIM6295, XTAL(42'000'000)/32, okim6295_device::PIN7_LOW) // XTAL CORRECT, DIVISOR GUESSED
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
-MACHINE_CONFIG_END
+ OKIM6295(config, "oki", XTAL(42'000'000)/32, okim6295_device::PIN7_LOW).add_route(ALL_OUTPUTS, "mono", 1.0); // XTAL CORRECT, DIVISOR GUESSED
+}
ROM_START( popobear )
diff --git a/src/mame/drivers/popper.cpp b/src/mame/drivers/popper.cpp
index 40ee2ae1cfb..93bd11f34ab 100644
--- a/src/mame/drivers/popper.cpp
+++ b/src/mame/drivers/popper.cpp
@@ -479,7 +479,7 @@ WRITE8_MEMBER( popper_state::ay1_w )
m_ay[1]->reset();
}
- m_ay[0]->write_bc1_bc2(space, offset, data);
+ m_ay[0]->write_bc1_bc2(offset, data);
}
@@ -534,20 +534,21 @@ void popper_state::machine_reset()
// MACHINE DEFINTIONS
//**************************************************************************
-MACHINE_CONFIG_START(popper_state::popper)
- MCFG_DEVICE_ADD("maincpu", Z80, XTAL(18'432'000)/3/2)
- MCFG_DEVICE_PROGRAM_MAP(main_map)
+void popper_state::popper(machine_config &config)
+{
+ Z80(config, m_maincpu, XTAL(18'432'000)/3/2);
+ m_maincpu->set_addrmap(AS_PROGRAM, &popper_state::main_map);
- MCFG_DEVICE_ADD("subcpu", Z80, XTAL(18'432'000)/3/2)
- MCFG_DEVICE_PROGRAM_MAP(sub_map)
+ Z80(config, m_subcpu, XTAL(18'432'000)/3/2);
+ m_subcpu->set_addrmap(AS_PROGRAM, &popper_state::sub_map);
- MCFG_QUANTUM_PERFECT_CPU("maincpu")
+ config.m_perfect_cpu_quantum = subtag("maincpu");
// video hardware
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_RAW_PARAMS(XTAL(18'432'000)/3, 384, 48, 328, 264, 16, 240)
- MCFG_SCREEN_UPDATE_DRIVER(popper_state, screen_update)
- MCFG_SCREEN_PALETTE("palette")
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_raw(XTAL(18'432'000)/3, 384, 48, 328, 264, 16, 240);
+ m_screen->set_screen_update(FUNC(popper_state::screen_update));
+ m_screen->set_palette("palette");
GFXDECODE(config, m_gfxdecode, "palette", gfx_popper);
@@ -559,7 +560,7 @@ MACHINE_CONFIG_START(popper_state::popper)
AY8910(config, m_ay[0], XTAL(18'432'000)/3/2/2).add_route(ALL_OUTPUTS, "mono", 0.25);
AY8910(config, m_ay[1], XTAL(18'432'000)/3/2/2).add_route(ALL_OUTPUTS, "mono", 0.25);
-MACHINE_CONFIG_END
+}
//**************************************************************************
diff --git a/src/mame/drivers/portrait.cpp b/src/mame/drivers/portrait.cpp
index 385f5720e95..5f0ea95b14e 100644
--- a/src/mame/drivers/portrait.cpp
+++ b/src/mame/drivers/portrait.cpp
@@ -254,23 +254,24 @@ static GFXDECODE_START( gfx_portrait )
GFXDECODE_END
-MACHINE_CONFIG_START(portrait_state::portrait)
- MCFG_DEVICE_ADD("maincpu", Z80, 4000000) /* 4 MHz ? */
- MCFG_DEVICE_PROGRAM_MAP(portrait_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", portrait_state, irq0_line_hold)
+void portrait_state::portrait(machine_config &config)
+{
+ Z80(config, m_maincpu, 4000000); /* 4 MHz ? */
+ m_maincpu->set_addrmap(AS_PROGRAM, &portrait_state::portrait_map);
+ m_maincpu->set_vblank_int("screen", FUNC(portrait_state::irq0_line_hold));
- MCFG_DEVICE_ADD("audiocpu", I8039, 3120000) /* ? */
- MCFG_DEVICE_PROGRAM_MAP(portrait_sound_map)
+ i8039_device &audiocpu(I8039(config, "audiocpu", 3120000)); /* ? */
+ audiocpu.set_addrmap(AS_PROGRAM, &portrait_state::portrait_sound_map);
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(50)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(64*8, 64*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 54*8-1, 0*8, 40*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(portrait_state, screen_update)
- MCFG_SCREEN_PALETTE(m_palette)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(50);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(64*8, 64*8);
+ screen.set_visarea(0*8, 54*8-1, 0*8, 40*8-1);
+ screen.set_screen_update(FUNC(portrait_state::screen_update));
+ screen.set_palette(m_palette);
GFXDECODE(config, m_gfxdecode, m_palette, gfx_portrait);
PALETTE(config, m_palette, FUNC(portrait_state::portrait_palette), 0x800, 0x40);
@@ -281,7 +282,7 @@ MACHINE_CONFIG_START(portrait_state::portrait)
GENERIC_LATCH_8(config, "soundlatch");
TMS5200(config, m_tms, 640000).add_route(ALL_OUTPUTS, "mono", 1.0);
-MACHINE_CONFIG_END
+}
ROM_START( portrait )
diff --git a/src/mame/drivers/potgoldu.cpp b/src/mame/drivers/potgoldu.cpp
index f6e19d70af8..3eb610b779f 100644
--- a/src/mame/drivers/potgoldu.cpp
+++ b/src/mame/drivers/potgoldu.cpp
@@ -78,8 +78,8 @@ static INPUT_PORTS_START( potgold )
INPUT_PORTS_END
-MACHINE_CONFIG_START(potgold_state::potgold)
-
+void potgold_state::potgold(machine_config &config)
+{
/* basic machine hardware */
TMS34010(config, m_maincpu, XTAL(40'000'000));
m_maincpu->set_addrmap(AS_PROGRAM, &potgold_state::potgold_map);
@@ -88,13 +88,13 @@ MACHINE_CONFIG_START(potgold_state::potgold)
m_maincpu->set_pixels_per_clock(1);
m_maincpu->set_scanline_rgb32_callback(FUNC(potgold_state::scanline_update));
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_RAW_PARAMS(VIDEO_CLOCK/2, 444, 0, 320, 233, 0, 200)
- MCFG_SCREEN_UPDATE_DEVICE("maincpu", tms34010_device, tms340x0_rgb32)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_raw(VIDEO_CLOCK/2, 444, 0, 320, 233, 0, 200);
+ screen.set_screen_update("maincpu", FUNC(tms34010_device::tms340x0_rgb32));
/* sound hardware */
/* YM2413 */
-MACHINE_CONFIG_END
+}
ROM_START( potgoldu )
ROM_REGION16_LE( 0x400000, "user1", 0 ) /* 34010 code */
diff --git a/src/mame/drivers/powerbal.cpp b/src/mame/drivers/powerbal.cpp
index 09cca74a673..d5ae925c83e 100644
--- a/src/mame/drivers/powerbal.cpp
+++ b/src/mame/drivers/powerbal.cpp
@@ -626,24 +626,24 @@ MACHINE_RESET_MEMBER(powerbal_state,powerbal)
configure_oki_banks();
}
-MACHINE_CONFIG_START(powerbal_state::powerbal)
-
+void powerbal_state::powerbal(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M68000, 12000000) /* 12 MHz */
- MCFG_DEVICE_PROGRAM_MAP(powerbal_main_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", powerbal_state, irq2_line_hold)
+ M68000(config, m_maincpu, 12000000); /* 12 MHz */
+ m_maincpu->set_addrmap(AS_PROGRAM, &powerbal_state::powerbal_main_map);
+ m_maincpu->set_vblank_int("screen", FUNC(powerbal_state::irq2_line_hold));
MCFG_MACHINE_START_OVERRIDE(powerbal_state,powerbal)
MCFG_MACHINE_RESET_OVERRIDE(powerbal_state,powerbal)
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(61)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(128*8, 64*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 40*8-1, 0*8, 30*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(powerbal_state, screen_update_powerbal)
- MCFG_SCREEN_PALETTE(m_palette)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(61);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(128*8, 64*8);
+ screen.set_visarea(0*8, 40*8-1, 0*8, 30*8-1);
+ screen.set_screen_update(FUNC(powerbal_state::screen_update_powerbal));
+ screen.set_palette(m_palette);
GFXDECODE(config, m_gfxdecode, m_palette, gfx_powerbal);
PALETTE(config, m_palette).set_format(palette_device::RRRRGGGGBBBBRGBx, 512);
@@ -653,17 +653,17 @@ MACHINE_CONFIG_START(powerbal_state::powerbal)
/* sound hardware */
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("oki", OKIM6295, 1000000, okim6295_device::PIN7_HIGH)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
- MCFG_DEVICE_ADDRESS_MAP(0, oki_map)
-MACHINE_CONFIG_END
-
-MACHINE_CONFIG_START(powerbal_state::magicstk)
+ OKIM6295(config, m_oki, 1000000, okim6295_device::PIN7_HIGH);
+ m_oki->add_route(ALL_OUTPUTS, "mono", 1.0);
+ m_oki->set_addrmap(0, &powerbal_state::oki_map);
+}
+void powerbal_state::magicstk(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M68000, 12000000) /* 12 MHz */
- MCFG_DEVICE_PROGRAM_MAP(magicstk_main_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", powerbal_state, irq2_line_hold)
+ M68000(config, m_maincpu, 12000000); /* 12 MHz */
+ m_maincpu->set_addrmap(AS_PROGRAM, &powerbal_state::magicstk_main_map);
+ m_maincpu->set_vblank_int("screen", FUNC(powerbal_state::irq2_line_hold));
EEPROM_93C46_16BIT(config, "eeprom").default_value(0);
@@ -671,13 +671,13 @@ MACHINE_CONFIG_START(powerbal_state::magicstk)
MCFG_MACHINE_RESET_OVERRIDE(powerbal_state,powerbal)
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(61)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */)
- MCFG_SCREEN_SIZE(128*8, 64*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 40*8-1, 0*8, 30*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(powerbal_state, screen_update_powerbal)
- MCFG_SCREEN_PALETTE(m_palette)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(61);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500) /* not accurate */);
+ screen.set_size(128*8, 64*8);
+ screen.set_visarea(0*8, 40*8-1, 0*8, 30*8-1);
+ screen.set_screen_update(FUNC(powerbal_state::screen_update_powerbal));
+ screen.set_palette(m_palette);
GFXDECODE(config, m_gfxdecode, m_palette, gfx_powerbal);
PALETTE(config, m_palette).set_format(palette_device::RRRRGGGGBBBBRGBx, 512);
@@ -687,25 +687,23 @@ MACHINE_CONFIG_START(powerbal_state::magicstk)
/* sound hardware */
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("oki", OKIM6295, 1000000, okim6295_device::PIN7_HIGH)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
- MCFG_DEVICE_ADDRESS_MAP(0, oki_map)
-MACHINE_CONFIG_END
-
-MACHINE_CONFIG_START(powerbal_state::atombjt)
+ OKIM6295(config, m_oki, 1000000, okim6295_device::PIN7_HIGH);
+ m_oki->add_route(ALL_OUTPUTS, "mono", 1.0);
+ m_oki->set_addrmap(0, &powerbal_state::oki_map);
+}
+void powerbal_state::atombjt(machine_config &config)
+{
powerbal(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(atombjt_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", powerbal_state, irq6_line_hold)
+ m_maincpu->set_addrmap(AS_PROGRAM, &powerbal_state::atombjt_map);
+ m_maincpu->set_vblank_int("screen", FUNC(powerbal_state::irq6_line_hold));
- MCFG_SCREEN_MODIFY("screen")
- MCFG_SCREEN_SIZE(512, 256) \
- MCFG_SCREEN_VISIBLE_AREA(0*8, 48*8-1, 2*8, 30*8-1) \
+ subdevice<screen_device>("screen")->set_size(512, 256);
+ subdevice<screen_device>("screen")->set_visarea(0*8, 48*8-1, 2*8, 30*8-1);
MCFG_VIDEO_START_OVERRIDE(powerbal_state,atombjt)
-MACHINE_CONFIG_END
+}
/*
Power Balls
diff --git a/src/mame/drivers/powerstack.cpp b/src/mame/drivers/powerstack.cpp
index 8f25734b9c3..d5444770d65 100644
--- a/src/mame/drivers/powerstack.cpp
+++ b/src/mame/drivers/powerstack.cpp
@@ -27,10 +27,11 @@ private:
static INPUT_PORTS_START( powerstack )
INPUT_PORTS_END
-MACHINE_CONFIG_START(powerstack_state::powerstack)
-// MCFG_DEVICE_ADD("maincpu", PPC604, 300'000'000) // PPC604E @ 300MHz
-// MCFG_DEVICE_PROGRAM_MAP(mem_map)
-MACHINE_CONFIG_END
+void powerstack_state::powerstack(machine_config &config)
+{
+// ppc604_device &maincpu(PPC604(config, "maincpu", 300'000'000)); // PPC604E @ 300MHz
+// maincpu.set_addrmap(AS_PROGRAM, &powerstack_state::mem_map);
+}
ROM_START( powerstk )
ROM_REGION( 0x80000, "roms", 0 )
diff --git a/src/mame/drivers/pp01.cpp b/src/mame/drivers/pp01.cpp
index 22386146fac..21f0d21d743 100644
--- a/src/mame/drivers/pp01.cpp
+++ b/src/mame/drivers/pp01.cpp
@@ -199,20 +199,21 @@ static INPUT_PORTS_START( pp01 )
INPUT_PORTS_END
/* Machine driver */
-MACHINE_CONFIG_START(pp01_state::pp01)
+void pp01_state::pp01(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", I8080, 2000000)
- MCFG_DEVICE_PROGRAM_MAP(pp01_mem)
- MCFG_DEVICE_IO_MAP(pp01_io)
+ I8080(config, m_maincpu, 2000000);
+ m_maincpu->set_addrmap(AS_PROGRAM, &pp01_state::pp01_mem);
+ m_maincpu->set_addrmap(AS_IO, &pp01_state::pp01_io);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(50)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */
- MCFG_SCREEN_SIZE(256, 256)
- MCFG_SCREEN_VISIBLE_AREA(0, 256-1, 0, 256-1)
- MCFG_SCREEN_UPDATE_DRIVER(pp01_state, screen_update_pp01)
- MCFG_SCREEN_PALETTE("palette")
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(50);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */
+ screen.set_size(256, 256);
+ screen.set_visarea(0, 256-1, 0, 256-1);
+ screen.set_screen_update(FUNC(pp01_state::screen_update_pp01));
+ screen.set_palette("palette");
PALETTE(config, "palette", FUNC(pp01_state::pp01_palette), 8);
@@ -222,7 +223,7 @@ MACHINE_CONFIG_START(pp01_state::pp01)
//WAVE(config, "wave", "cassette").add_route(ALL_OUTPUTS, "mono", 0.25);
/* Devices */
- MCFG_DEVICE_ADD("uart", I8251, 0)
+ I8251(config, "uart", 0);
// when rts and dtr are both high, the uart is being used for cassette operations
PIT8253(config, m_pit, 0);
@@ -243,7 +244,7 @@ MACHINE_CONFIG_START(pp01_state::pp01)
/* internal ram */
RAM(config, RAM_TAG).set_default_size("64K").set_default_value(0x00);
-MACHINE_CONFIG_END
+}
/* ROM definition */
diff --git a/src/mame/drivers/ppmast93.cpp b/src/mame/drivers/ppmast93.cpp
index ed8d38628d9..5294c66c52f 100644
--- a/src/mame/drivers/ppmast93.cpp
+++ b/src/mame/drivers/ppmast93.cpp
@@ -373,28 +373,29 @@ uint32_t ppmast93_state::screen_update(screen_device &screen, bitmap_ind16 &bitm
return 0;
}
-MACHINE_CONFIG_START(ppmast93_state::ppmast93)
+void ppmast93_state::ppmast93(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80,5000000) /* 5 MHz */
- MCFG_DEVICE_PROGRAM_MAP(ppmast93_cpu1_map)
- MCFG_DEVICE_IO_MAP(ppmast93_cpu1_io)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", ppmast93_state, irq0_line_hold)
+ Z80(config, m_maincpu, 5000000); /* 5 MHz */
+ m_maincpu->set_addrmap(AS_PROGRAM, &ppmast93_state::ppmast93_cpu1_map);
+ m_maincpu->set_addrmap(AS_IO, &ppmast93_state::ppmast93_cpu1_io);
+ m_maincpu->set_vblank_int("screen", FUNC(ppmast93_state::irq0_line_hold));
- MCFG_DEVICE_ADD("sub", Z80,5000000) /* 5 MHz */
- MCFG_DEVICE_PROGRAM_MAP(ppmast93_cpu2_map)
- MCFG_DEVICE_IO_MAP(ppmast93_cpu2_io)
- MCFG_DEVICE_PERIODIC_INT_DRIVER(ppmast93_state, irq0_line_hold, 8000)
+ z80_device &sub(Z80(config, "sub", 5000000)); /* 5 MHz */
+ sub.set_addrmap(AS_PROGRAM, &ppmast93_state::ppmast93_cpu2_map);
+ sub.set_addrmap(AS_IO, &ppmast93_state::ppmast93_cpu2_io);
+ sub.set_periodic_int(FUNC(ppmast93_state::irq0_line_hold), attotime::from_hz(8000));
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(55)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(256, 256)
- MCFG_SCREEN_VISIBLE_AREA(0, 256-1, 0, 256-1)
- MCFG_SCREEN_UPDATE_DRIVER(ppmast93_state, screen_update)
- MCFG_SCREEN_PALETTE("palette")
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(55);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(256, 256);
+ screen.set_visarea(0, 256-1, 0, 256-1);
+ screen.set_screen_update(FUNC(ppmast93_state::screen_update));
+ screen.set_palette("palette");
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_ppmast93)
+ GFXDECODE(config, m_gfxdecode, "palette", gfx_ppmast93);
PALETTE(config, "palette", palette_device::RGB_444_PROMS, "proms", 0x100);
@@ -403,13 +404,13 @@ MACHINE_CONFIG_START(ppmast93_state::ppmast93)
GENERIC_LATCH_8(config, "soundlatch");
- MCFG_DEVICE_ADD("ymsnd", YM2413, 5000000/2)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 1.0)
+ YM2413(config, "ymsnd", 5000000/2).add_route(ALL_OUTPUTS, "speaker", 1.0);
- MCFG_DEVICE_ADD("dac", DAC_8BIT_R2R, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 0.3) // unknown DAC
- MCFG_DEVICE_ADD("vref", VOLTAGE_REGULATOR, 0) MCFG_VOLTAGE_REGULATOR_OUTPUT(5.0)
- MCFG_SOUND_ROUTE(0, "dac", 1.0, DAC_VREF_POS_INPUT) MCFG_SOUND_ROUTE(0, "dac", -1.0, DAC_VREF_NEG_INPUT)
-MACHINE_CONFIG_END
+ DAC_8BIT_R2R(config, "dac", 0).add_route(ALL_OUTPUTS, "speaker", 0.3); // unknown DAC
+ voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref"));
+ vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT);
+ vref.add_route(0, "dac", -1.0, DAC_VREF_NEG_INPUT);
+}
ROM_START( ppmast93 )
ROM_REGION( 0x20000, "maincpu", 0 )
diff --git a/src/mame/drivers/prestige.cpp b/src/mame/drivers/prestige.cpp
index fbc565d4fd6..eb89d393fc1 100644
--- a/src/mame/drivers/prestige.cpp
+++ b/src/mame/drivers/prestige.cpp
@@ -743,104 +743,110 @@ TIMER_DEVICE_CALLBACK_MEMBER(prestige_state::irq_timer)
m_maincpu->set_input_line(0, ASSERT_LINE);
}
-MACHINE_CONFIG_START(prestige_state::prestige_base)
+void prestige_state::prestige_base(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu",Z80, XTAL(8'000'000)) // Z84C008
- MCFG_DEVICE_PROGRAM_MAP(prestige_mem)
- MCFG_DEVICE_IO_MAP(prestige_io)
- MCFG_DEVICE_IRQ_ACKNOWLEDGE_DRIVER(prestige_state,prestige_int_ack)
+ Z80(config, m_maincpu, XTAL(8'000'000)); // Z84C008
+ m_maincpu->set_addrmap(AS_PROGRAM, &prestige_state::prestige_mem);
+ m_maincpu->set_addrmap(AS_IO, &prestige_state::prestige_io);
+ m_maincpu->set_irq_acknowledge_callback(FUNC(prestige_state::prestige_int_ack));
- MCFG_TIMER_DRIVER_ADD_PERIODIC("irq_timer", prestige_state, irq_timer, attotime::from_hz(200))
+ TIMER(config, "irq_timer").configure_periodic(FUNC(prestige_state::irq_timer), attotime::from_hz(200));
/* video hardware */
- MCFG_SCREEN_ADD("screen", LCD)
- MCFG_SCREEN_REFRESH_RATE(50)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */
- MCFG_SCREEN_UPDATE_DRIVER(prestige_state, screen_update_1bpp)
- MCFG_SCREEN_SIZE( 240, 100 )
- MCFG_SCREEN_VISIBLE_AREA( 0, 240-1, 0, 100-1 )
- MCFG_SCREEN_PALETTE("palette")
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_LCD));
+ screen.set_refresh_hz(50);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */
+ screen.set_screen_update(FUNC(prestige_state::screen_update_1bpp));
+ screen.set_size(240, 100);
+ screen.set_visarea(0, 240-1, 0, 100-1);
+ screen.set_palette("palette");
PALETTE(config, "palette", FUNC(prestige_state::prestige_palette), 2);
/* cartridge */
- MCFG_GENERIC_CARTSLOT_ADD("cartslot", generic_plain_slot, "genius_cart")
+ GENERIC_CARTSLOT(config, m_cart, generic_plain_slot, "genius_cart");
/* internal ram */
RAM(config, RAM_TAG).set_default_size("32K").set_extra_options("64K");
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(prestige_state::glcolor)
+void prestige_state::glcolor(machine_config &config)
+{
prestige_base(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_IO_MAP(glcolor_io)
+ m_maincpu->set_addrmap(AS_IO, &prestige_state::glcolor_io);
/* video hardware */
- MCFG_SCREEN_MODIFY("screen")
- MCFG_SCREEN_UPDATE_DRIVER(prestige_state, screen_update_2bpp)
- MCFG_SCREEN_SIZE( 160, 80 )
- MCFG_SCREEN_VISIBLE_AREA( 0, 160-1, 0, 80-1 )
+ screen_device &screen(*subdevice<screen_device>("screen"));
+ screen.set_screen_update(FUNC(prestige_state::screen_update_2bpp));
+ screen.set_size(160, 80);
+ screen.set_visarea(0, 160-1, 0, 80-1);
subdevice<palette_device>("palette")->set_entries(4).set_init(FUNC(prestige_state::glcolor_palette));
- MCFG_SOFTWARE_LIST_ADD("cart_list", "glcolor")
- MCFG_SOFTWARE_LIST_COMPATIBLE_ADD("snotec_cart", "snotec")
-MACHINE_CONFIG_END
+ SOFTWARE_LIST(config, "cart_list").set_original("glcolor");
+ SOFTWARE_LIST(config, "snotec_cart").set_compatible("snotec");
+}
-MACHINE_CONFIG_START(prestige_state::glmcolor)
+void prestige_state::glmcolor(machine_config &config)
+{
glcolor(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_IO_MAP(prestige_io)
-MACHINE_CONFIG_END
+ m_maincpu->set_addrmap(AS_IO, &prestige_state::prestige_io);
+}
-MACHINE_CONFIG_START(prestige_state::snotec)
+void prestige_state::snotec(machine_config &config)
+{
glcolor(config);
- MCFG_SOFTWARE_LIST_REMOVE("cart_list")
- MCFG_SOFTWARE_LIST_REMOVE("snotec_cart")
- MCFG_SOFTWARE_LIST_ADD("cart_list", "snotec")
- MCFG_SOFTWARE_LIST_COMPATIBLE_ADD("glcolor_cart", "glcolor")
-MACHINE_CONFIG_END
+ config.device_remove("snotec_cart");
+ SOFTWARE_LIST(config.replace(), "cart_list").set_original("snotec");
+ SOFTWARE_LIST(config, "glcolor_cart").set_compatible("glcolor");
+}
-MACHINE_CONFIG_START(prestige_state::prestige)
+void prestige_state::prestige(machine_config &config)
+{
prestige_base(config);
- MCFG_SOFTWARE_LIST_COMPATIBLE_ADD("gl6000sl_cart", "gl6000sl")
- MCFG_SOFTWARE_LIST_COMPATIBLE_ADD("misterx_cart", "misterx")
- MCFG_SOFTWARE_LIST_COMPATIBLE_ADD("gl2000_cart", "gl2000")
-MACHINE_CONFIG_END
+ SOFTWARE_LIST(config, "gl6000sl_cart").set_compatible("gl6000sl");
+ SOFTWARE_LIST(config, "misterx_cart").set_compatible("misterx");
+ SOFTWARE_LIST(config, "gl2000_cart").set_compatible("gl2000");
+}
-MACHINE_CONFIG_START(prestige_state::gl6000sl)
+void prestige_state::gl6000sl(machine_config &config)
+{
prestige_base(config);
- MCFG_SOFTWARE_LIST_ADD("cart_list", "gl6000sl")
- MCFG_SOFTWARE_LIST_COMPATIBLE_ADD("misterx_cart", "misterx")
- MCFG_SOFTWARE_LIST_COMPATIBLE_ADD("gl2000_cart", "gl2000")
-MACHINE_CONFIG_END
+ SOFTWARE_LIST(config, "cart_list").set_original("gl6000sl");
+ SOFTWARE_LIST(config, "misterx_cart").set_compatible("misterx");
+ SOFTWARE_LIST(config, "gl2000_cart").set_compatible("gl2000");
+}
-MACHINE_CONFIG_START(prestige_state::gl7007sl)
+void prestige_state::gl7007sl(machine_config &config)
+{
prestige_base(config);
- MCFG_SOFTWARE_LIST_COMPATIBLE_ADD("gl6000sl_cart", "gl6000sl")
- MCFG_SOFTWARE_LIST_COMPATIBLE_ADD("gl2000_cart", "gl2000")
- MCFG_SOFTWARE_LIST_COMPATIBLE_ADD("misterx_cart", "misterx")
-MACHINE_CONFIG_END
+ SOFTWARE_LIST(config, "gl6000sl_cart").set_compatible("gl6000sl");
+ SOFTWARE_LIST(config, "gl2000_cart").set_compatible("gl2000");
+ SOFTWARE_LIST(config, "misterx_cart").set_compatible("misterx");
+}
-MACHINE_CONFIG_START(prestige_state::gjmovie)
+void prestige_state::gjmovie(machine_config &config)
+{
prestige_base(config);
- MCFG_SOFTWARE_LIST_ADD("cart_list", "gjmovie")
-MACHINE_CONFIG_END
+ SOFTWARE_LIST(config, "cart_list").set_original("gjmovie");
+}
-MACHINE_CONFIG_START(prestige_state::princ)
+void prestige_state::princ(machine_config &config)
+{
prestige_base(config);
- MCFG_DEVICE_REMOVE("cartslot")
- MCFG_GENERIC_CARTSLOT_ADD("cartslot", generic_plain_slot, "princ_cart")
- MCFG_SOFTWARE_LIST_ADD("cart_list", "princ")
-MACHINE_CONFIG_END
+ config.device_remove("cartslot");
+ GENERIC_CARTSLOT(config, m_cart, generic_plain_slot, "princ_cart");
+ SOFTWARE_LIST(config, "cart_list").set_original("princ");
+}
/* ROM definition */
ROM_START( gl6000sl )
diff --git a/src/mame/drivers/primo.cpp b/src/mame/drivers/primo.cpp
index 803f97bcb58..01d473632fe 100644
--- a/src/mame/drivers/primo.cpp
+++ b/src/mame/drivers/primo.cpp
@@ -248,89 +248,87 @@ static const struct CassetteOptions primo_cassette_options = {
MACHINE_CONFIG_START(primo_state::primoa32)
/* basic machine hardware */
- MCFG_DEVICE_ADD( "maincpu", Z80, 2500000 )
- MCFG_DEVICE_PROGRAM_MAP( primo32_mem)
- MCFG_DEVICE_IO_MAP( primoa_port)
+ Z80(config, m_maincpu, 2500000);
+ m_maincpu->set_addrmap(AS_PROGRAM, &primo_state::primo32_mem);
+ m_maincpu->set_addrmap(AS_IO, &primo_state::primoa_port);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE( 50 )
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */
- MCFG_SCREEN_SIZE( 256, 192 )
- MCFG_SCREEN_VISIBLE_AREA( 0, 256-1, 0, 192-1 )
- MCFG_SCREEN_UPDATE_DRIVER(primo_state, screen_update_primo)
- MCFG_SCREEN_PALETTE("palette")
- MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE(*this, primo_state, vblank_irq))
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_refresh_hz(50);
+ m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */
+ m_screen->set_size(256, 192);
+ m_screen->set_visarea(0, 256-1, 0, 192-1);
+ m_screen->set_screen_update(FUNC(primo_state::screen_update_primo));
+ m_screen->set_palette("palette");
+ m_screen->screen_vblank().set(FUNC(primo_state::vblank_irq));
PALETTE(config, "palette", palette_device::MONOCHROME);
/* sound hardware */
SPEAKER(config, "mono").front_center();
- WAVE(config, "wave", "cassette").add_route(ALL_OUTPUTS, "mono", 0.25);
+ WAVE(config, "wave", m_cassette).add_route(ALL_OUTPUTS, "mono", 0.25);
SPEAKER_SOUND(config, "speaker").add_route(ALL_OUTPUTS, "mono", 0.50);
/* snapshot/quickload */
- MCFG_SNAPSHOT_ADD("snapshot", primo_state, primo, "pss", 0)
- MCFG_QUICKLOAD_ADD("quickload", primo_state, primo, "pp", 0)
+ MCFG_SNAPSHOT_ADD("snapshot", primo_state, primo, "pss")
+ MCFG_QUICKLOAD_ADD("quickload", primo_state, primo, "pp")
- MCFG_CASSETTE_ADD( "cassette" )
- MCFG_CASSETTE_FORMATS(primo_ptp_format)
- MCFG_CASSETTE_CREATE_OPTS(&primo_cassette_options)
- MCFG_CASSETTE_DEFAULT_STATE(CASSETTE_STOPPED | CASSETTE_SPEAKER_ENABLED)
+ CASSETTE(config, m_cassette);
+ m_cassette->set_formats(primo_ptp_format);
+ m_cassette->set_create_opts(&primo_cassette_options);
+ m_cassette->set_default_state(CASSETTE_STOPPED | CASSETTE_SPEAKER_ENABLED);
/* floppy from serial bus */
- MCFG_CBM_IEC_ADD(nullptr)
+ cbm_iec_slot_device::add(config, m_iec, nullptr);
/* cartridge */
- MCFG_GENERIC_CARTSLOT_ADD("cartslot1", generic_plain_slot, nullptr)
- MCFG_GENERIC_EXTENSIONS("bin,rom")
- MCFG_GENERIC_CARTSLOT_ADD("cartslot2", generic_plain_slot, nullptr)
- MCFG_GENERIC_EXTENSIONS("bin,rom")
+ GENERIC_CARTSLOT(config, m_cart1, generic_plain_slot, nullptr, "bin,rom");
+ GENERIC_CARTSLOT(config, m_cart2, generic_plain_slot, nullptr, "bin,rom");
MACHINE_CONFIG_END
-MACHINE_CONFIG_START(primo_state::primoa48)
+void primo_state::primoa48(machine_config &config)
+{
primoa32(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(primo48_mem)
-MACHINE_CONFIG_END
+ m_maincpu->set_addrmap(AS_PROGRAM, &primo_state::primo48_mem);
+}
-MACHINE_CONFIG_START(primo_state::primoa64)
+void primo_state::primoa64(machine_config &config)
+{
primoa32(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(primo64_mem)
-MACHINE_CONFIG_END
+ m_maincpu->set_addrmap(AS_PROGRAM, &primo_state::primo64_mem);
+}
-MACHINE_CONFIG_START(primo_state::primob32)
+void primo_state::primob32(machine_config &config)
+{
primoa32(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_IO_MAP(primob_port)
+ m_maincpu->set_addrmap(AS_IO, &primo_state::primob_port);
MCFG_MACHINE_RESET_OVERRIDE(primo_state, primob)
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(primo_state::primob48)
+void primo_state::primob48(machine_config &config)
+{
primoa48(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_IO_MAP(primob_port)
+ m_maincpu->set_addrmap(AS_IO, &primo_state::primob_port);
MCFG_MACHINE_RESET_OVERRIDE(primo_state, primob)
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(primo_state::primob64)
+void primo_state::primob64(machine_config &config)
+{
primoa64(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_IO_MAP(primob_port)
+ m_maincpu->set_addrmap(AS_IO, &primo_state::primob_port);
MCFG_MACHINE_RESET_OVERRIDE(primo_state, primob)
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(primo_state::primoc64)
+void primo_state::primoc64(machine_config &config)
+{
primoa64(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_IO_MAP(primob_port)
+ m_maincpu->set_addrmap(AS_IO, &primo_state::primob_port);
MCFG_MACHINE_RESET_OVERRIDE(primo_state, primob)
-MACHINE_CONFIG_END
+}
ROM_START( primoa32 )
ROM_REGION( 0x14000, "maincpu", ROMREGION_ERASEFF )
diff --git a/src/mame/drivers/pro80.cpp b/src/mame/drivers/pro80.cpp
index 67643c7a06a..8b15dee23d9 100644
--- a/src/mame/drivers/pro80.cpp
+++ b/src/mame/drivers/pro80.cpp
@@ -175,11 +175,12 @@ void pro80_state::machine_reset()
m_cass_in = 0;
}
-MACHINE_CONFIG_START(pro80_state::pro80)
+void pro80_state::pro80(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, XTAL(4'000'000) / 2)
- MCFG_DEVICE_PROGRAM_MAP(pro80_mem)
- MCFG_DEVICE_IO_MAP(pro80_io)
+ Z80(config, m_maincpu, XTAL(4'000'000) / 2);
+ m_maincpu->set_addrmap(AS_PROGRAM, &pro80_state::pro80_mem);
+ m_maincpu->set_addrmap(AS_IO, &pro80_state::pro80_io);
/* video hardware */
config.set_default_layout(layout_pro80);
@@ -189,10 +190,10 @@ MACHINE_CONFIG_START(pro80_state::pro80)
WAVE(config, "wave", "cassette").add_route(ALL_OUTPUTS, "mono", 0.05);
/* Devices */
- MCFG_CASSETTE_ADD( "cassette" )
+ CASSETTE(config, m_cass);
Z80PIO(config, "pio", XTAL(4'000'000) / 2);
- MCFG_TIMER_DRIVER_ADD_PERIODIC("timer_p", pro80_state, timer_p, attotime::from_hz(40000)) // cass read
-MACHINE_CONFIG_END
+ TIMER(config, "timer_p").configure_periodic(FUNC(pro80_state::timer_p), attotime::from_hz(40000)); // cass read
+}
/* ROM definition */
ROM_START( pro80 )
diff --git a/src/mame/drivers/proconn.cpp b/src/mame/drivers/proconn.cpp
index 72b46428cdc..949c1cc24f4 100644
--- a/src/mame/drivers/proconn.cpp
+++ b/src/mame/drivers/proconn.cpp
@@ -59,7 +59,7 @@ public:
void init_proconn();
private:
- template <unsigned N> DECLARE_WRITE8_MEMBER( ay_w ) { m_ay->address_data_w(space, N, data); }
+ template <unsigned N> DECLARE_WRITE8_MEMBER( ay_w ) { m_ay->address_data_w(N, data); }
template <unsigned N> DECLARE_WRITE8_MEMBER( ctc_w ) { m_z80ctc->write(space, N, data); }
@@ -71,8 +71,6 @@ private:
template <unsigned N> DECLARE_WRITE8_MEMBER( pio4_w ) { m_z80pio[3]->write(space, N, data); }
template <unsigned N> DECLARE_WRITE8_MEMBER( pio5_w ) { m_z80pio[4]->write(space, N, data); }
- template <unsigned N> DECLARE_READ8_MEMBER( ay_r ) { return m_ay->data_r(space, N); }
-
template <unsigned N> DECLARE_READ8_MEMBER( ctc_r ) { return m_z80ctc->read(space, N); }
template <unsigned N> DECLARE_READ8_MEMBER( sio_r ) { return m_z80sio->cd_ba_r(space, N); }
@@ -176,7 +174,7 @@ void proconn_state::proconn_portmap(address_map &map)
map(0x03fe, 0x03fe).rw(FUNC(proconn_state::ctc_r<3>), FUNC(proconn_state::ctc_w<3>));
// ay (meters connected to it?)
- map(0x00fd, 0x00fd).rw(FUNC(proconn_state::ay_r<0>), FUNC(proconn_state::ay_w<0>));
+ map(0x00fd, 0x00fd).r(m_ay, FUNC(ay8910_device::data_r)).w(FUNC(proconn_state::ay_w<0>));
map(0x00fc, 0x00fc).w(FUNC(proconn_state::ay_w<1>));
// ??
@@ -335,7 +333,7 @@ void proconn_state::proconn(machine_config &config)
m_ay->add_route(ALL_OUTPUTS, "rspeaker", 0.33);
METERS(config, m_meters, 0);
- m_meters->set_number_meters(8);
+ m_meters->set_number(8);
}
diff --git a/src/mame/drivers/prof180x.cpp b/src/mame/drivers/prof180x.cpp
index 5c50a37cf6c..6deb8e8301e 100644
--- a/src/mame/drivers/prof180x.cpp
+++ b/src/mame/drivers/prof180x.cpp
@@ -196,7 +196,7 @@ void prof180x_state::prof180x_io(address_map &map)
{
map(0x08, 0x08).mirror(0xff00).w(FUNC(prof180x_state::flr_w));
map(0x09, 0x09).select(0xff00).r(FUNC(prof180x_state::status_r));
- map(0x0a, 0x0a).mirror(0xff00).rw(FDC9268_TAG, FUNC(upd765a_device::mdma_r), FUNC(upd765a_device::mdma_w));
+ map(0x0a, 0x0a).mirror(0xff00).rw(FDC9268_TAG, FUNC(upd765a_device::dma_r), FUNC(upd765a_device::dma_w));
map(0x0b, 0x0b).mirror(0xff00).w("cent_data_out", FUNC(output_latch_device::bus_w));
map(0x0c, 0x0d).mirror(0xff00).m(FDC9268_TAG, FUNC(upd765a_device::map));
}
@@ -238,38 +238,41 @@ void prof180x_state::machine_reset()
}
}
-MACHINE_CONFIG_START(prof180x_state::prof180x)
+void prof180x_state::prof180x(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD(HD64180_TAG, Z80, XTAL(9'216'000))
- MCFG_DEVICE_PROGRAM_MAP(prof180x_mem)
- MCFG_DEVICE_IO_MAP(prof180x_io)
+ z80_device &maincpu(Z80(config, HD64180_TAG, XTAL(9'216'000)));
+ maincpu.set_addrmap(AS_PROGRAM, &prof180x_state::prof180x_mem);
+ maincpu.set_addrmap(AS_IO, &prof180x_state::prof180x_io);
/* video hardware */
- MCFG_SCREEN_ADD(SCREEN_TAG, RASTER)
- MCFG_SCREEN_UPDATE_DRIVER(prof180x_state, screen_update)
- MCFG_SCREEN_REFRESH_RATE(50)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */
- MCFG_SCREEN_SIZE(640, 480)
- MCFG_SCREEN_VISIBLE_AREA(0, 640-1, 0, 480-1)
+ screen_device &screen(SCREEN(config, SCREEN_TAG, SCREEN_TYPE_RASTER));
+ screen.set_screen_update(FUNC(prof180x_state::screen_update));
+ screen.set_refresh_hz(50);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */
+ screen.set_size(640, 480);
+ screen.set_visarea(0, 640-1, 0, 480-1);
/* devices */
UPD765A(config, FDC9268_TAG, 8'000'000, false, true);
- MCFG_FLOPPY_DRIVE_ADD(FDC9268_TAG ":0", prof180x_floppies, "35dd", floppy_image_device::default_floppy_formats)
- MCFG_FLOPPY_DRIVE_ADD(FDC9268_TAG ":1", prof180x_floppies, "35dd", floppy_image_device::default_floppy_formats)
- MCFG_FLOPPY_DRIVE_ADD(FDC9268_TAG ":2", prof180x_floppies, "35dd", floppy_image_device::default_floppy_formats)
- MCFG_FLOPPY_DRIVE_ADD(FDC9268_TAG ":3", prof180x_floppies, "35dd", floppy_image_device::default_floppy_formats)
+ FLOPPY_CONNECTOR(config, FDC9268_TAG ":0", prof180x_floppies, "35dd", floppy_image_device::default_floppy_formats);
+ FLOPPY_CONNECTOR(config, FDC9268_TAG ":1", prof180x_floppies, "35dd", floppy_image_device::default_floppy_formats);
+ FLOPPY_CONNECTOR(config, FDC9268_TAG ":2", prof180x_floppies, "35dd", floppy_image_device::default_floppy_formats);
+ FLOPPY_CONNECTOR(config, FDC9268_TAG ":3", prof180x_floppies, "35dd", floppy_image_device::default_floppy_formats);
+
+ //RTC8583(config, MK3835_TAG, rtc_intf);
- //MCFG_RTC8583_ADD(MK3835_TAG, rtc_intf)
- MCFG_DEVICE_ADD(m_centronics, CENTRONICS, centronics_devices, "printer")
+ CENTRONICS(config, m_centronics, centronics_devices, "printer");
- MCFG_CENTRONICS_OUTPUT_LATCH_ADD("cent_data_out", CENTRONICS_TAG)
+ output_latch_device &latch(OUTPUT_LATCH(config, "cent_data_out"));
+ m_centronics->set_output_latch(latch);
/* internal ram */
RAM(config, RAM_TAG).set_default_size("128K").set_extra_options("256K,512K");
/* software lists */
- MCFG_SOFTWARE_LIST_ADD("flop_list", "prof180")
-MACHINE_CONFIG_END
+ SOFTWARE_LIST(config, "flop_list").set_original("prof180");
+}
/* ROM definition */
diff --git a/src/mame/drivers/prof80.cpp b/src/mame/drivers/prof80.cpp
index 32c63660a2f..21426bd4a5e 100644
--- a/src/mame/drivers/prof80.cpp
+++ b/src/mame/drivers/prof80.cpp
@@ -447,14 +447,15 @@ void prof80_state::machine_start()
//**************************************************************************
//-------------------------------------------------
-// MACHINE_CONFIG( prof80 )
+// machine_config( prof80 )
//-------------------------------------------------
-MACHINE_CONFIG_START(prof80_state::prof80)
+void prof80_state::prof80(machine_config &config)
+{
// basic machine hardware
- MCFG_DEVICE_ADD(Z80_TAG, Z80, XTAL(6'000'000))
- MCFG_DEVICE_PROGRAM_MAP(prof80_mem)
- MCFG_DEVICE_IO_MAP(prof80_io)
+ Z80(config, m_maincpu, XTAL(6'000'000));
+ m_maincpu->set_addrmap(AS_PROGRAM, &prof80_state::prof80_mem);
+ m_maincpu->set_addrmap(AS_IO, &prof80_state::prof80_io);
// MMU
PROF80_MMU(config, m_mmu, 0);
@@ -465,10 +466,10 @@ MACHINE_CONFIG_START(prof80_state::prof80)
// FDC
UPD765A(config, m_fdc, 8'000'000, true, true);
- MCFG_FLOPPY_DRIVE_ADD(UPD765_TAG ":0", prof80_floppies, "525qd", floppy_image_device::default_floppy_formats)
- MCFG_FLOPPY_DRIVE_ADD(UPD765_TAG ":1", prof80_floppies, "525qd", floppy_image_device::default_floppy_formats)
- MCFG_FLOPPY_DRIVE_ADD(UPD765_TAG ":2", prof80_floppies, nullptr, floppy_image_device::default_floppy_formats)
- MCFG_FLOPPY_DRIVE_ADD(UPD765_TAG ":3", prof80_floppies, nullptr, floppy_image_device::default_floppy_formats)
+ FLOPPY_CONNECTOR(config, UPD765_TAG ":0", prof80_floppies, "525qd", floppy_image_device::default_floppy_formats);
+ FLOPPY_CONNECTOR(config, UPD765_TAG ":1", prof80_floppies, "525qd", floppy_image_device::default_floppy_formats);
+ FLOPPY_CONNECTOR(config, UPD765_TAG ":2", prof80_floppies, nullptr, floppy_image_device::default_floppy_formats);
+ FLOPPY_CONNECTOR(config, UPD765_TAG ":3", prof80_floppies, nullptr, floppy_image_device::default_floppy_formats);
// DEMUX latches
LS259(config, m_flra);
@@ -492,12 +493,12 @@ MACHINE_CONFIG_START(prof80_state::prof80)
m_flrb->q_out_cb<7>().set(m_mmu, FUNC(prof80_mmu_device::mme_w)); // MME
// ECB bus
- MCFG_ECBBUS_ADD()
- MCFG_ECBBUS_SLOT_ADD(1, "ecb_1", ecbbus_cards, "grip21")
- MCFG_ECBBUS_SLOT_ADD(2, "ecb_2", ecbbus_cards, nullptr)
- MCFG_ECBBUS_SLOT_ADD(3, "ecb_3", ecbbus_cards, nullptr)
- MCFG_ECBBUS_SLOT_ADD(4, "ecb_4", ecbbus_cards, nullptr)
- MCFG_ECBBUS_SLOT_ADD(5, "ecb_5", ecbbus_cards, nullptr)
+ ECBBUS(config, m_ecb);
+ ECBBUS_SLOT(config, "ecb_1", 1, ecbbus_cards, "grip21");
+ ECBBUS_SLOT(config, "ecb_2", 2, ecbbus_cards, nullptr);
+ ECBBUS_SLOT(config, "ecb_3", 3, ecbbus_cards, nullptr);
+ ECBBUS_SLOT(config, "ecb_4", 4, ecbbus_cards, nullptr);
+ ECBBUS_SLOT(config, "ecb_5", 5, ecbbus_cards, nullptr);
// V24
RS232_PORT(config, m_rs232a, default_rs232_devices, nullptr);
@@ -507,8 +508,8 @@ MACHINE_CONFIG_START(prof80_state::prof80)
RAM(config, RAM_TAG).set_default_size("128K");
// software lists
- MCFG_SOFTWARE_LIST_ADD("flop_list", "prof80")
-MACHINE_CONFIG_END
+ SOFTWARE_LIST(config, "flop_list").set_original("prof80");
+}
diff --git a/src/mame/drivers/progolf.cpp b/src/mame/drivers/progolf.cpp
index e84624d7d4f..b40a1b5018e 100644
--- a/src/mame/drivers/progolf.cpp
+++ b/src/mame/drivers/progolf.cpp
@@ -418,30 +418,31 @@ void progolf_state::progolf_palette(palette_device &palette) const
}
}
-MACHINE_CONFIG_START(progolf_state::progolf)
+void progolf_state::progolf(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", DECO_222, 3000000/2) /* guess, 3 Mhz makes the game to behave worse? */
- MCFG_DEVICE_PROGRAM_MAP(main_cpu)
+ DECO_222(config, m_maincpu, 3000000/2); /* guess, 3 Mhz makes the game to behave worse? */
+ m_maincpu->set_addrmap(AS_PROGRAM, &progolf_state::main_cpu);
- MCFG_DEVICE_ADD("audiocpu", M6502, 500000)
- MCFG_DEVICE_PROGRAM_MAP(sound_cpu)
+ M6502(config, m_audiocpu, 500000);
+ m_audiocpu->set_addrmap(AS_PROGRAM, &progolf_state::sound_cpu);
- MCFG_QUANTUM_PERFECT_CPU("maincpu")
+ config.m_perfect_cpu_quantum = subtag("maincpu");
generic_latch_8_device &soundlatch(GENERIC_LATCH_8(config, "soundlatch"));
soundlatch.data_pending_callback().set_inputline(m_audiocpu, 0);
soundlatch.set_separate_acknowledge(true);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(57)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(3072))
- MCFG_SCREEN_SIZE(256, 256)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 0*8, 32*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(progolf_state, screen_update)
- MCFG_SCREEN_PALETTE(m_palette)
-
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, m_palette, gfx_progolf)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(57);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(3072));
+ screen.set_size(256, 256);
+ screen.set_visarea(0*8, 32*8-1, 0*8, 32*8-1);
+ screen.set_screen_update(FUNC(progolf_state::screen_update));
+ screen.set_palette(m_palette);
+
+ GFXDECODE(config, m_gfxdecode, m_palette, gfx_progolf);
PALETTE(config, m_palette, FUNC(progolf_state::progolf_palette), 32 * 3);
mc6845_device &crtc(MC6845(config, "crtc", 3000000/4)); /* hand tuned to get ~57 fps */
@@ -455,14 +456,15 @@ MACHINE_CONFIG_START(progolf_state::progolf)
AY8910(config, "ay1", 12000000/8).add_route(ALL_OUTPUTS, "mono", 0.23);
AY8910(config, "ay2", 12000000/8).add_route(ALL_OUTPUTS, "mono", 0.23);
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(progolf_state::progolfa)
+void progolf_state::progolfa(machine_config &config)
+{
progolf(config);
- MCFG_DEVICE_REMOVE("maincpu") /* different encrypted cpu to progolf */
- MCFG_DEVICE_ADD("maincpu", DECO_CPU6, 3000000/2) /* guess, 3 Mhz makes the game to behave worse? */
- MCFG_DEVICE_PROGRAM_MAP(main_cpu)
-MACHINE_CONFIG_END
+ /* different encrypted cpu to progolf */
+ DECO_CPU6(config.replace(), m_maincpu, 3000000/2); /* guess, 3 Mhz makes the game to behave worse? */
+ m_maincpu->set_addrmap(AS_PROGRAM, &progolf_state::main_cpu);
+}
ROM_START( progolf )
diff --git a/src/mame/drivers/prophet600.cpp b/src/mame/drivers/prophet600.cpp
index d4b8201f856..ff4c48f87ba 100644
--- a/src/mame/drivers/prophet600.cpp
+++ b/src/mame/drivers/prophet600.cpp
@@ -271,10 +271,11 @@ void prophet600_state::machine_start()
}
// master crystal is 8 MHz, all clocks derived from there
-MACHINE_CONFIG_START(prophet600_state::prophet600)
- MCFG_DEVICE_ADD(MAINCPU_TAG, Z80, XTAL(8'000'000)/2)
- MCFG_DEVICE_PROGRAM_MAP(cpu_map)
- MCFG_DEVICE_IO_MAP(io_map)
+void prophet600_state::prophet600(machine_config &config)
+{
+ Z80(config, m_maincpu, XTAL(8'000'000)/2);
+ m_maincpu->set_addrmap(AS_PROGRAM, &prophet600_state::cpu_map);
+ m_maincpu->set_addrmap(AS_IO, &prophet600_state::io_map);
config.set_default_layout(layout_prophet600);
@@ -289,15 +290,13 @@ MACHINE_CONFIG_START(prophet600_state::prophet600)
m_acia->txd_handler().set("mdout", FUNC(midi_port_device::write_txd));
m_acia->irq_handler().set(FUNC(prophet600_state::acia_irq_w));
- MCFG_MIDI_PORT_ADD("mdin", midiin_slot, "midiin")
- MCFG_MIDI_RX_HANDLER(WRITELINE(UART_TAG, acia6850_device, write_rxd))
-
- MCFG_MIDI_PORT_ADD("mdout", midiout_slot, "midiout")
+ MIDI_PORT(config, "mdin", midiin_slot, "midiin").rxd_handler().set(m_acia, FUNC(acia6850_device::write_rxd));
- MCFG_DEVICE_ADD("acia_clock", CLOCK, XTAL(8'000'000)/16) // 500kHz = 16 times the MIDI rate
- MCFG_CLOCK_SIGNAL_HANDLER(WRITELINE(*this, prophet600_state, acia_clock_w))
+ MIDI_PORT(config, "mdout", midiout_slot, "midiout");
-MACHINE_CONFIG_END
+ clock_device &acia_clock(CLOCK(config, "acia_clock", XTAL(8'000'000)/16)); // 500kHz = 16 times the MIDI rate
+ acia_clock.signal_handler().set(FUNC(prophet600_state::acia_clock_w));
+}
static INPUT_PORTS_START( prophet600 )
INPUT_PORTS_END
diff --git a/src/mame/drivers/proteus.cpp b/src/mame/drivers/proteus.cpp
index 17d6ef67eff..fbdd9ecf67c 100644
--- a/src/mame/drivers/proteus.cpp
+++ b/src/mame/drivers/proteus.cpp
@@ -162,12 +162,12 @@ WRITE_LINE_MEMBER(proteus_state::ptm_o3_callback)
READ8_MEMBER(proteus_state::network_r)
{
- return m_adlc->read(space, offset >> 1);
+ return m_adlc->read(offset >> 1);
}
WRITE8_MEMBER(proteus_state::network_w)
{
- m_adlc->write(space, offset >> 1, data);
+ m_adlc->write(offset >> 1, data);
}
@@ -321,14 +321,15 @@ static void proteus_floppies(device_slot_interface &device)
}
-MACHINE_CONFIG_START(proteus_state::proteus)
+void proteus_state::proteus(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", MC6809, 4_MHz_XTAL)
- MCFG_DEVICE_PROGRAM_MAP(proteus_6809_mem)
+ MC6809(config, m_maincpu, 4_MHz_XTAL);
+ m_maincpu->set_addrmap(AS_PROGRAM, &proteus_state::proteus_6809_mem);
- MCFG_DEVICE_ADD("z80", Z80, 4_MHz_XTAL)
- MCFG_DEVICE_PROGRAM_MAP(proteus_z80_mem)
- MCFG_DEVICE_IO_MAP(proteus_z80_io)
+ Z80(config, m_z80, 4_MHz_XTAL);
+ m_z80->set_addrmap(AS_PROGRAM, &proteus_state::proteus_z80_mem);
+ m_z80->set_addrmap(AS_IO, &proteus_state::proteus_z80_io);
INPUT_MERGER_ANY_HIGH(config, m_irqs);
m_irqs->output_handler().set_inputline(m_maincpu, M6809_IRQ_LINE);
@@ -339,10 +340,8 @@ MACHINE_CONFIG_START(proteus_state::proteus)
m_fdc->hld_wr_callback().set(FUNC(proteus_state::motor_w));
m_fdc->set_force_ready(true);
- MCFG_FLOPPY_DRIVE_ADD("fdc:0", proteus_floppies, "8dssd", proteus_state::floppy_formats)
- MCFG_FLOPPY_DRIVE_SOUND(true)
- MCFG_FLOPPY_DRIVE_ADD("fdc:1", proteus_floppies, "8dssd", proteus_state::floppy_formats)
- MCFG_FLOPPY_DRIVE_SOUND(true)
+ FLOPPY_CONNECTOR(config, "fdc:0", proteus_floppies, "8dssd", proteus_state::floppy_formats).enable_sound(true);
+ FLOPPY_CONNECTOR(config, "fdc:1", proteus_floppies, "8dssd", proteus_state::floppy_formats).enable_sound(true);
/* ram */
RAM(config, RAM_TAG).set_default_size("64K");
@@ -366,9 +365,10 @@ MACHINE_CONFIG_START(proteus_state::proteus)
m_pia->irqa_handler().set("irqs", FUNC(input_merger_device::in_w<2>));
m_pia->irqb_handler().set("irqs", FUNC(input_merger_device::in_w<3>));
- MCFG_DEVICE_ADD("parallel", CENTRONICS, centronics_devices, "printer")
- MCFG_CENTRONICS_ACK_HANDLER(WRITELINE("pia", pia6821_device, ca1_w))
- MCFG_CENTRONICS_OUTPUT_LATCH_ADD("cent_data_out", "parallel")
+ centronics_device &parallel(CENTRONICS(config, "parallel", centronics_devices, "printer"));
+ parallel.ack_handler().set(m_pia, FUNC(pia6821_device::ca1_w));
+ output_latch_device &cent_data_out(OUTPUT_LATCH(config, "cent_data_out"));
+ parallel.set_output_latch(cent_data_out);
/* terminal port */
ACIA6850(config, m_acia[0], 0);
@@ -413,9 +413,8 @@ MACHINE_CONFIG_START(proteus_state::proteus)
acia2_clock.signal_handler().append(m_acia[2], FUNC(acia6850_device::write_rxc));
/* software lists */
- MCFG_SOFTWARE_LIST_ADD("flop_list", "poly_flop")
- MCFG_SOFTWARE_LIST_FILTER("flop_list", "PROTEUS")
-MACHINE_CONFIG_END
+ SOFTWARE_LIST(config, "flop_list").set_original("poly_flop").set_filter("PROTEUS");
+}
ROM_START(proteus)
diff --git a/src/mame/drivers/proteus3.cpp b/src/mame/drivers/proteus3.cpp
index f6d8a4bb0af..c18892408bf 100644
--- a/src/mame/drivers/proteus3.cpp
+++ b/src/mame/drivers/proteus3.cpp
@@ -380,20 +380,21 @@ void proteus3_state::machine_reset()
Machine Drivers
******************************************************************************/
-MACHINE_CONFIG_START(proteus3_state::proteus3)
+void proteus3_state::proteus3(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M6800, XTAL(3'579'545)) /* Divided by 4 internally */
- MCFG_DEVICE_PROGRAM_MAP(proteus3_mem)
+ M6800(config, m_maincpu, XTAL(3'579'545)); /* Divided by 4 internally */
+ m_maincpu->set_addrmap(AS_PROGRAM, &proteus3_state::proteus3_mem);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(50)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(200))
- MCFG_SCREEN_SIZE(64*8, 16*12)
- MCFG_SCREEN_VISIBLE_AREA(0, 64*8-1, 0, 16*12-1)
- MCFG_SCREEN_UPDATE_DRIVER(proteus3_state, screen_update_proteus3)
- MCFG_SCREEN_PALETTE("palette")
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_proteus3)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(50);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(200));
+ screen.set_size(64*8, 16*12);
+ screen.set_visarea(0, 64*8-1, 0, 16*12-1);
+ screen.set_screen_update(FUNC(proteus3_state::screen_update_proteus3));
+ screen.set_palette("palette");
+ GFXDECODE(config, "gfxdecode", "palette", gfx_proteus3);
PALETTE(config, "palette", palette_device::MONOCHROME);
/* Devices */
@@ -409,12 +410,12 @@ MACHINE_CONFIG_START(proteus3_state::proteus3)
ACIA6850(config, m_acia1, 0);
m_acia1->txd_handler().set(FUNC(proteus3_state::acia1_txdata_w));
- MCFG_CASSETTE_ADD("cassette")
- MCFG_CASSETTE_DEFAULT_STATE(CASSETTE_PLAY | CASSETTE_MOTOR_ENABLED | CASSETTE_SPEAKER_ENABLED)
+ CASSETTE(config, m_cass);
+ m_cass->set_default_state(CASSETTE_PLAY | CASSETTE_MOTOR_ENABLED | CASSETTE_SPEAKER_ENABLED);
SPEAKER(config, "mono").front_center();
- WAVE(config, "wave", "cassette").add_route(ALL_OUTPUTS, "mono", 0.25);
- MCFG_TIMER_DRIVER_ADD_PERIODIC("timer_c", proteus3_state, timer_c, attotime::from_hz(4800))
- MCFG_TIMER_DRIVER_ADD_PERIODIC("timer_p", proteus3_state, timer_p, attotime::from_hz(40000))
+ WAVE(config, "wave", m_cass).add_route(ALL_OUTPUTS, "mono", 0.25);
+ TIMER(config, "timer_c").configure_periodic(FUNC(proteus3_state::timer_c), attotime::from_hz(4800));
+ TIMER(config, "timer_p").configure_periodic(FUNC(proteus3_state::timer_p), attotime::from_hz(40000));
// optional tty keyboard
ACIA6850(config, m_acia2, 0);
@@ -442,7 +443,7 @@ MACHINE_CONFIG_START(proteus3_state::proteus3)
m_brg->out_f<13>().set(FUNC(proteus3_state::write_f13_clock));
m_brg->out_f<14>().set(FUNC(proteus3_state::write_f14_clock));
m_brg->out_f<15>().set(FUNC(proteus3_state::write_f15_clock));
-MACHINE_CONFIG_END
+}
diff --git a/src/mame/drivers/pse.cpp b/src/mame/drivers/pse.cpp
index f4d72e12467..7dfb6a595b2 100644
--- a/src/mame/drivers/pse.cpp
+++ b/src/mame/drivers/pse.cpp
@@ -99,20 +99,21 @@ void pse_state::video_start()
{
}
-MACHINE_CONFIG_START(pse_state::pse)
-
+void pse_state::pse(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", NETLIST_CPU, NETLIST_CLOCK)
- MCFG_NETLIST_SETUP(pse)
+ NETLIST_CPU(config, m_maincpu, NETLIST_CLOCK);
+ m_maincpu->set_constructor(netlist_pse);
/* video hardware */
- MCFG_FIXFREQ_ADD("fixfreq", "screen")
- MCFG_FIXFREQ_MONITOR_CLOCK(MASTER_CLOCK)
- MCFG_FIXFREQ_HORZ_PARAMS(H_TOTAL-67,H_TOTAL-40,H_TOTAL-8,H_TOTAL)
- MCFG_FIXFREQ_VERT_PARAMS(V_TOTAL-22,V_TOTAL-19,V_TOTAL-12,V_TOTAL)
- MCFG_FIXFREQ_FIELDCOUNT(1)
- MCFG_FIXFREQ_SYNC_THRESHOLD(0.30)
-MACHINE_CONFIG_END
+ SCREEN(config, "screen", SCREEN_TYPE_RASTER);
+ FIXFREQ(config, m_video).set_screen("screen");
+ m_video->set_monitor_clock(MASTER_CLOCK);
+ m_video->set_horz_params(H_TOTAL-67,H_TOTAL-40,H_TOTAL-8,H_TOTAL);
+ m_video->set_vert_params(V_TOTAL-22,V_TOTAL-19,V_TOTAL-12,V_TOTAL);
+ m_video->set_fieldcount(1);
+ m_video->set_threshold(0.30);
+}
/***************************************************************************
diff --git a/src/mame/drivers/psikyo.cpp b/src/mame/drivers/psikyo.cpp
index 5492b3ce37c..ca2e2365af8 100644
--- a/src/mame/drivers/psikyo.cpp
+++ b/src/mame/drivers/psikyo.cpp
@@ -97,7 +97,7 @@ CUSTOM_INPUT_MEMBER(psikyo_state::mcu_status_r)
01A550: andi.b #$4, D0
01A554: bne $1a54e
- Interestingly, s1945jn has the code that spins on this bit,
+ Interestingly, s1945nj has the code that spins on this bit,
but said code is never reached. Prototype? */
if (m_mcu_status)
ret = 0x01;
@@ -107,19 +107,19 @@ CUSTOM_INPUT_MEMBER(psikyo_state::mcu_status_r)
return ret;
}
-static const uint8_t s1945_table[256] = {
+static const u8 s1945_table[256] = {
0x00, 0x00, 0x64, 0xae, 0x00, 0x00, 0x26, 0x2c, 0x00, 0x00, 0x2c, 0xda, 0x00, 0x00, 0x2c, 0xbc,
0x00, 0x00, 0x2c, 0x9e, 0x00, 0x00, 0x2f, 0x0e, 0x00, 0x00, 0x31, 0x10, 0x00, 0x00, 0xc5, 0x1e,
0x00, 0x00, 0x32, 0x90, 0x00, 0x00, 0xac, 0x5c, 0x00, 0x00, 0x2b, 0xc0
};
-static const uint8_t s1945a_table[256] = {
+static const u8 s1945a_table[256] = {
0x00, 0x00, 0x64, 0xbe, 0x00, 0x00, 0x26, 0x2c, 0x00, 0x00, 0x2c, 0xda, 0x00, 0x00, 0x2c, 0xbc,
0x00, 0x00, 0x2c, 0x9e, 0x00, 0x00, 0x2f, 0x0e, 0x00, 0x00, 0x31, 0x10, 0x00, 0x00, 0xc7, 0x2a,
0x00, 0x00, 0x32, 0x90, 0x00, 0x00, 0xad, 0x4c, 0x00, 0x00, 0x2b, 0xc0
};
-static const uint8_t s1945j_table[256] = {
+static const u8 s1945j_table[256] = {
0x00, 0x00, 0x64, 0xb6, 0x00, 0x00, 0x26, 0x2c, 0x00, 0x00, 0x2c, 0xda, 0x00, 0x00, 0x2c, 0xbc,
0x00, 0x00, 0x2c, 0x9e, 0x00, 0x00, 0x2f, 0x0e, 0x00, 0x00, 0x31, 0x10, 0x00, 0x00, 0xc5, 0x92,
0x00, 0x00, 0x32, 0x90, 0x00, 0x00, 0xac, 0x64, 0x00, 0x00, 0x2b, 0xc0
@@ -148,8 +148,8 @@ WRITE32_MEMBER(psikyo_state::s1945_mcu_w)
m_s1945_mcu_direction = data;
break;
case 0x07:
- psikyo_switch_banks(1, (data >> 6) & 3);
- psikyo_switch_banks(0, (data >> 4) & 3);
+ switch_bgbanks(1, (data >> 6) & 3);
+ switch_bgbanks(0, (data >> 4) & 3);
m_s1945_mcu_bctrl = data;
break;
case 0x0b:
@@ -201,7 +201,7 @@ READ32_MEMBER(psikyo_state::s1945_mcu_r)
{
case 0:
{
- uint32_t res;
+ u32 res;
if (m_s1945_mcu_control & 16)
{
res = m_s1945_mcu_latching & 4 ? 0x0000ff00 : m_s1945_mcu_latch1 << 8;
@@ -250,16 +250,16 @@ WRITE32_MEMBER(psikyo_state::vram_w)
void psikyo_state::psikyo_map(address_map &map)
{
- map(0x000000, 0x0fffff).rom(); // ROM (not all used)
+ map(0x000000, 0x0fffff).rom(); // ROM (not all used)
map(0x400000, 0x401fff).ram().share("spriteram"); // Sprites, buffered by two frames (list buffered + fb buffered)
map(0x600000, 0x601fff).ram().w(m_palette, FUNC(palette_device::write32)).share("palette"); // Palette
- map(0x800000, 0x801fff).ram().w(FUNC(psikyo_state::vram_w<0>)).share("vram_0"); // Layer 0
- map(0x802000, 0x803fff).ram().w(FUNC(psikyo_state::vram_w<1>)).share("vram_1"); // Layer 1
- map(0x804000, 0x807fff).ram().share("vregs"); // RAM + Vregs
-// AM_RANGE(0xc00000, 0xc0000b) AM_READ(psikyo_input_r) // Depends on board
-// AM_RANGE(0xc00004, 0xc0000b) AM_WRITE(s1945_mcu_w) // MCU on sh404
-// AM_RANGE(0xc00010, 0xc00013) AM_WRITE(psikyo_soundlatch_w) // Depends on board
- map(0xfe0000, 0xffffff).ram(); // RAM
+ map(0x800000, 0x801fff).ram().w(FUNC(psikyo_state::vram_w<0>)).share("vram_0"); // Layer 0
+ map(0x802000, 0x803fff).ram().w(FUNC(psikyo_state::vram_w<1>)).share("vram_1"); // Layer 1
+ map(0x804000, 0x807fff).ram().share("vregs"); // RAM + Vregs
+// map(0xc00000, 0xc0000b).r(FUNC(psikyo_state::input_r)); // Depends on board
+// map(0xc00004, 0xc0000b).w(FUNC(psikyo_state::s1945_mcu_w)); // MCU on sh404
+// map(0xc00010, 0xc00013).w(m_soundlatch, FUNC(generic_latch_8_device::write)); // Depends on board
+ map(0xfe0000, 0xffffff).ram(); // RAM
}
template<int Shift>
@@ -268,32 +268,11 @@ WRITE8_MEMBER(psikyo_state::sound_bankswitch_w)
m_audiobank->set_entry((data >> Shift) & 0x03);
}
-READ32_MEMBER(psikyo_state::s1945bl_oki_r)
+WRITE8_MEMBER(psikyo_state::s1945bl_okibank_w)
{
- uint8_t dat = m_oki->read(space, 0);
- return dat << 24;
-}
-
-WRITE32_MEMBER(psikyo_state::s1945bl_oki_w)
-{
- if (ACCESSING_BITS_24_31)
- {
- m_oki->write(space, 0, data >> 24);
- }
-
- if (ACCESSING_BITS_16_23)
- {
- // not at all sure about this, it seems to write 0 too often
- uint8_t bank = (data & 0x00ff0000) >> 16;
- if (bank < 4)
- m_okibank->set_entry(bank);
- }
-
- if (ACCESSING_BITS_8_15)
- printf("ACCESSING_BITS_8_15 ?? %08x %08x\n", data & 0x0000ff00, mem_mask);
-
- if (ACCESSING_BITS_0_7)
- printf("ACCESSING_BITS_0_7 ?? %08x %08x\n", data & 0x000000ff, mem_mask);
+ // not at all sure about this, it seems to write 0 too often
+ if (data < 5)
+ m_okibank->set_entry(data);
}
void psikyo_state::s1945bl_oki_map(address_map &map)
@@ -304,19 +283,20 @@ void psikyo_state::s1945bl_oki_map(address_map &map)
void psikyo_state::psikyo_bootleg_map(address_map &map)
{
- map(0x000000, 0x0fffff).rom(); // ROM (not all used)
+ map(0x000000, 0x0fffff).rom(); // ROM (not all used)
map(0x200000, 0x200fff).ram().share("boot_spritebuf"); // RAM (it copies the spritelist here, the HW probably doesn't have automatic buffering like the originals?
map(0x400000, 0x401fff).ram().share("spriteram"); // Sprites, buffered by two frames (list buffered + fb buffered)
map(0x600000, 0x601fff).ram().w(m_palette, FUNC(palette_device::write32)).share("palette"); // Palette
- map(0x800000, 0x801fff).ram().w(FUNC(psikyo_state::vram_w<0>)).share("vram_0"); // Layer 0
- map(0x802000, 0x803fff).ram().w(FUNC(psikyo_state::vram_w<1>)).share("vram_1"); // Layer 1
- map(0x804000, 0x807fff).ram().share("vregs"); // RAM + Vregs
- map(0xc00000, 0xc0000b).r(FUNC(psikyo_state::gunbird_input_r)); // input ports
+ map(0x800000, 0x801fff).ram().w(FUNC(psikyo_state::vram_w<0>)).share("vram_0"); // Layer 0
+ map(0x802000, 0x803fff).ram().w(FUNC(psikyo_state::vram_w<1>)).share("vram_1"); // Layer 1
+ map(0x804000, 0x807fff).ram().share("vregs"); // RAM + Vregs
+ map(0xc00000, 0xc0000b).r(FUNC(psikyo_state::gunbird_input_r)); // input ports
- map(0xc00018, 0xc0001b).rw(FUNC(psikyo_state::s1945bl_oki_r), FUNC(psikyo_state::s1945bl_oki_w));
+ map(0xc00018, 0xc00018).rw(m_oki, FUNC(okim6295_device::read), FUNC(okim6295_device::write));
+ map(0xc00019, 0xc00019).w(FUNC(psikyo_state::s1945bl_okibank_w));
- map(0xfe0000, 0xffffff).ram(); // RAM
+ map(0xfe0000, 0xffffff).ram(); // RAM
}
@@ -382,7 +362,7 @@ void psikyo_state::gunbird_map(address_map &map)
map(0xc00013, 0xc00013).w(m_soundlatch, FUNC(generic_latch_8_device::write));
}
-void psikyo_state::s1945jn_map(address_map &map)
+void psikyo_state::s1945n_map(address_map &map)
{
psikyo_map(map);
map(0xc00000, 0xc0000b).r(FUNC(psikyo_state::gunbird_input_r));
@@ -706,6 +686,31 @@ static INPUT_PORTS_START( btlkroad )
PORT_DIPSETTING( 0x00000000, DEF_STR( On ) )
INPUT_PORTS_END
+static INPUT_PORTS_START( btlkroadk )
+ PORT_INCLUDE( btlkroad )
+
+ PORT_MODIFY("DSW") /* c00004 -> c00007 */
+ /***********************************************
+
+ Bit 0 1 2 3
+ 1 1 1 1 Japan
+
+ 0 1 1 1 USA & Canada
+ 0 0 1 1 Korea
+ 0 1 0 1 Hong Kong
+ 0 1 1 0 Taiwan
+ Other World
+
+ ************************************************/
+ PORT_CONFNAME( 0x0000000f, 0x0000000c, DEF_STR( Region ) ) // Game code supports multi-region, but set default to Korea
+ PORT_CONFSETTING( 0x0000000f, DEF_STR( Japan ) )
+ PORT_CONFSETTING( 0x0000000e, "USA & Canada (Jaleco license)" )
+ PORT_CONFSETTING( 0x0000000c, DEF_STR( Korea ) )
+ PORT_CONFSETTING( 0x0000000a, DEF_STR( Hong_Kong ) )
+ PORT_CONFSETTING( 0x00000006, DEF_STR( Taiwan ) )
+ PORT_CONFSETTING( 0x00000000, DEF_STR( World ) )
+INPUT_PORTS_END
+
/***************************************************************************
Gun Bird
@@ -1040,13 +1045,14 @@ void psikyo_state::sngkace(machine_config &config)
m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */ // we're using PORT_VBLANK
m_screen->set_size(320, 256);
m_screen->set_visarea(0, 320-1, 0, 256-32-1);
- m_screen->set_screen_update(FUNC(psikyo_state::screen_update_psikyo));
- m_screen->screen_vblank().set(FUNC(psikyo_state::screen_vblank_psikyo));
+ m_screen->set_screen_update(FUNC(psikyo_state::screen_update));
+ m_screen->screen_vblank().set(FUNC(psikyo_state::screen_vblank));
m_screen->set_palette(m_palette);
GFXDECODE(config, m_gfxdecode, m_palette, gfx_psikyo);
PALETTE(config, m_palette).set_format(palette_device::xRGB_555, 0x1000);
+ BUFFERED_SPRITERAM32(config, m_spriteram);
MCFG_VIDEO_START_OVERRIDE(psikyo_state,sngkace)
/* sound hardware */
@@ -1085,13 +1091,14 @@ void psikyo_state::gunbird(machine_config &config)
m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */ // we're using PORT_VBLANK
m_screen->set_size(320, 256);
m_screen->set_visarea(0, 320-1, 0, 256-32-1);
- m_screen->set_screen_update(FUNC(psikyo_state::screen_update_psikyo));
- m_screen->screen_vblank().set(FUNC(psikyo_state::screen_vblank_psikyo));
+ m_screen->set_screen_update(FUNC(psikyo_state::screen_update));
+ m_screen->screen_vblank().set(FUNC(psikyo_state::screen_vblank));
m_screen->set_palette(m_palette);
GFXDECODE(config, m_gfxdecode, m_palette, gfx_psikyo);
PALETTE(config, m_palette).set_format(palette_device::xRGB_555, 0x1000);
+ BUFFERED_SPRITERAM32(config, m_spriteram);
MCFG_VIDEO_START_OVERRIDE(psikyo_state,psikyo)
/* sound hardware */
@@ -1106,10 +1113,10 @@ void psikyo_state::gunbird(machine_config &config)
m_soundlatch->set_separate_acknowledge(true);
}
-void psikyo_state::s1945jn(machine_config &config)
+void psikyo_state::s1945n(machine_config &config)
{
gunbird(config);
- m_maincpu->set_addrmap(AS_PROGRAM, &psikyo_state::s1945jn_map);
+ m_maincpu->set_addrmap(AS_PROGRAM, &psikyo_state::s1945n_map);
}
void psikyo_state::s1945bl(machine_config &config) /* Bootleg hardware based on the unprotected Japanese Strikers 1945 set */
@@ -1125,13 +1132,14 @@ void psikyo_state::s1945bl(machine_config &config) /* Bootleg hardware based on
m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */ // we're using PORT_VBLANK
m_screen->set_size(320, 256);
m_screen->set_visarea(0, 320-1, 0, 256-32-1);
- m_screen->set_screen_update(FUNC(psikyo_state::screen_update_psikyo_bootleg));
- m_screen->screen_vblank().set(FUNC(psikyo_state::screen_vblank_psikyo));
+ m_screen->set_screen_update(FUNC(psikyo_state::screen_update_bootleg));
+ m_screen->screen_vblank().set(FUNC(psikyo_state::screen_vblank_bootleg));
m_screen->set_palette(m_palette);
GFXDECODE(config, m_gfxdecode, m_palette, gfx_psikyo);
PALETTE(config, m_palette).set_format(palette_device::xRGB_555, 0x1000);
+ BUFFERED_SPRITERAM32(config, m_spriteram);
MCFG_VIDEO_START_OVERRIDE(psikyo_state,psikyo)
/* sound hardware */
@@ -1167,13 +1175,14 @@ void psikyo_state::s1945(machine_config &config)
m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */ // we're using PORT_VBLANK
m_screen->set_size(320, 256);
m_screen->set_visarea(0, 320-1, 0, 256-32-1);
- m_screen->set_screen_update(FUNC(psikyo_state::screen_update_psikyo));
- m_screen->screen_vblank().set(FUNC(psikyo_state::screen_vblank_psikyo));
+ m_screen->set_screen_update(FUNC(psikyo_state::screen_update));
+ m_screen->screen_vblank().set(FUNC(psikyo_state::screen_vblank));
m_screen->set_palette(m_palette);
GFXDECODE(config, m_gfxdecode, m_palette, gfx_psikyo);
PALETTE(config, m_palette).set_format(palette_device::xRGB_555, 0x1000);
+ BUFFERED_SPRITERAM32(config, m_spriteram);
MCFG_VIDEO_START_OVERRIDE(psikyo_state,psikyo)
/* sound hardware */
@@ -1421,7 +1430,7 @@ ROM_END
ROM_START( btlkroadk )
ROM_REGION( 0x100000, "maincpu", 0 ) /* Main CPU Code */
ROM_LOAD32_WORD_SWAP( "4,dot.u46", 0x000000, 0x040000, CRC(e724d429) SHA1(8b5f80366fd22d6f7e7d8a9623de4fe231303267) ) // 1&0
- ROM_LOAD32_WORD_SWAP( "5,dot.u39", 0x000002, 0x040000, CRC(c0d65765) SHA1(a6a26e6b9693a2ef245e9aaa4c9daa888aebb360)) // 3&2
+ ROM_LOAD32_WORD_SWAP( "5,dot.u39", 0x000002, 0x040000, CRC(c0d65765) SHA1(a6a26e6b9693a2ef245e9aaa4c9daa888aebb360) ) // 3&2
ROM_REGION( 0x020000, "audiocpu", 0 ) /* Sound CPU Code */
ROM_LOAD( "3,k.u71", 0x00000, 0x20000, CRC(e0f0c597) SHA1(cc337633f1f579baf0f8ba1dd65c5d51122a7e97) )
@@ -1492,7 +1501,7 @@ ROM_START( s1945n )
ROM_LOAD( "u1.bin", 0x000000, 0x040000, CRC(dee22654) SHA1(5df05b0029ff7b1f7f04b41da7823d2aa8034bd2) )
ROM_END
-ROM_START( s1945jn )
+ROM_START( s1945nj )
ROM_REGION( 0x100000, "maincpu", 0 ) /* Main CPU Code */
ROM_LOAD32_WORD_SWAP( "1-u46.bin", 0x000000, 0x040000, CRC(95028132) SHA1(6ed8e53efb0511dca37c35a7da17217f5aa83734) ) // 1&0
ROM_LOAD32_WORD_SWAP( "2-u39.bin", 0x000002, 0x040000, CRC(3df79a16) SHA1(6184f27579d846a40313fd11b57c46ac0d02fc76) ) // 3&2
@@ -1519,8 +1528,7 @@ ROM_START( s1945jn )
ROM_LOAD( "u1.bin", 0x000000, 0x040000, CRC(dee22654) SHA1(5df05b0029ff7b1f7f04b41da7823d2aa8034bd2) )
ROM_END
-/* closely based on s1945jn set, unsurprising because it's unprotected */
-ROM_START( s1945bl )
+ROM_START( s1945bl ) /* closely based on s1945nj set, unsurprising because it's unprotected */
ROM_REGION( 0x100000, "maincpu", 0 ) /* Main CPU Code */
ROM_LOAD32_BYTE( "27c010-1", 0x000000, 0x020000, CRC(d3361536) SHA1(430df1c98645603c17333222834d344efd4fb584) ) // 1-u46.bin [odd 1/2] 99.797821%
ROM_LOAD32_BYTE( "27c010-2", 0x000001, 0x020000, CRC(1d1916b1) SHA1(4e200454c16d0bd45c4146ee41902a811a55c008) ) // 1-u46.bin [even 1/2] 99.793243%
@@ -1539,8 +1547,9 @@ ROM_START( s1945bl )
ROM_LOAD( "rv27c040.m6", 0x000000, 0x080000, CRC(c22e5b65) SHA1(d807bd7c136d6b51f54258b44ebf3eecbd5b35fa) )
ROM_REGION( 0x040000, "spritelut", 0 ) /* */
- ROM_LOAD16_BYTE( "27c010-b", 0x000000, 0x020000, CRC(e38d5ab7) SHA1(73a708ebc305cb6297efd3296da23c87898e805e) ) // u1.bin [even] IDENTICAL
- ROM_LOAD16_BYTE( "27c010-a", 0x000001, 0x020000, CRC(cb8c65ec) SHA1(a55c5c5067b50a1243e7ba60fa1f9569bfed5de8) ) // u1.bin [odd] 99.999237%
+ // in 27c010-a 0x460E:01 but should 0x00. Might be bit rot or error when bootleggers copied U1 as all other graphics data matches.
+ ROM_LOAD16_BYTE( "27c010-b", 0x000000, 0x020000, CRC(e38d5ab7) SHA1(73a708ebc305cb6297efd3296da23c87898e805e) ) // u1.bin [even] IDENTICAL
+ ROM_LOAD16_BYTE( "27c010-a", 0x000001, 0x020000, CRC(cb8c65ec) SHA1(a55c5c5067b50a1243e7ba60fa1f9569bfed5de8) ) // u1.bin [odd] 99.999237%
ROM_REGION( 0x080000, "unknown", 0 ) /* unknown - matches Semicom's Dream World */
ROM_LOAD( "27c512", 0x000000, 0x010000, CRC(0da8db45) SHA1(7d5bd71c5b0b28ff74c732edd7c662f46f2ab25b) )
@@ -1822,7 +1831,7 @@ ROM_END
void psikyo_state::init_sngkace()
{
{
- uint8_t *RAM = memregion("ymsnd")->base();
+ u8 *RAM = memregion("ymsnd")->base();
int len = memregion("ymsnd")->bytes();
/* Bit 6&7 of the samples are swapped. Naughty, naughty... */
@@ -1833,7 +1842,7 @@ void psikyo_state::init_sngkace()
}
}
- m_ka302c_banking = 0; // SH201B doesn't have any gfx banking
+ m_ka302c_banking = false; // SH201B doesn't have any gfx banking
/* setup audiocpu banks */
m_audiobank->configure_entries(0, 4, memregion("audiocpu")->base(), 0x8000);
@@ -1842,7 +1851,7 @@ void psikyo_state::init_sngkace()
#if 0
if (!strcmp(machine().system().name,"sngkace"))
{
- uint8_t *ROM = memregion("maincpu")->base();
+ u8 *ROM = memregion("maincpu")->base();
ROM[0x995] = 0x4e;
ROM[0x994] = 0x71;
ROM[0x997] = 0x4e;
@@ -1852,7 +1861,7 @@ void psikyo_state::init_sngkace()
#endif
}
-void psikyo_state::s1945_mcu_init( )
+void psikyo_state::s1945_mcu_init()
{
m_s1945_mcu_direction = 0x00;
m_s1945_mcu_inlatch = 0xff;
@@ -1880,7 +1889,7 @@ void psikyo_state::init_tengai()
s1945_mcu_init();
m_s1945_mcu_table = nullptr;
- m_ka302c_banking = 0; // Banking is controlled by mcu
+ m_ka302c_banking = false; // Banking is controlled by mcu
/* setup audiocpu banks */
/* The banked rom is seen at 8200-ffff, so the last 0x200 bytes of the rom not reachable. */
@@ -1889,7 +1898,7 @@ void psikyo_state::init_tengai()
void psikyo_state::init_gunbird()
{
- m_ka302c_banking = 1;
+ m_ka302c_banking = true;
/* setup audiocpu banks */
/* The banked rom is seen at 8200-ffff, so the last 0x200 bytes of the rom not reachable. */
@@ -1902,7 +1911,7 @@ void psikyo_state::init_s1945()
s1945_mcu_init();
m_s1945_mcu_table = s1945_table;
- m_ka302c_banking = 0; // Banking is controlled by mcu
+ m_ka302c_banking = false; // Banking is controlled by mcu
/* setup audiocpu banks */
/* The banked rom is seen at 8200-ffff, so the last 0x200 bytes of the rom not reachable. */
@@ -1914,7 +1923,7 @@ void psikyo_state::init_s1945a()
s1945_mcu_init();
m_s1945_mcu_table = s1945a_table;
- m_ka302c_banking = 0; // Banking is controlled by mcu
+ m_ka302c_banking = false; // Banking is controlled by mcu
/* setup audiocpu banks */
/* The banked rom is seen at 8200-ffff, so the last 0x200 bytes of the rom not reachable. */
@@ -1926,7 +1935,7 @@ void psikyo_state::init_s1945j()
s1945_mcu_init();
m_s1945_mcu_table = s1945j_table;
- m_ka302c_banking = 0; // Banking is controlled by mcu
+ m_ka302c_banking = false; // Banking is controlled by mcu
/* setup audiocpu banks */
/* The banked rom is seen at 8200-ffff, so the last 0x200 bytes of the rom not reachable. */
@@ -1935,9 +1944,9 @@ void psikyo_state::init_s1945j()
void psikyo_state::init_s1945bl()
{
- m_ka302c_banking = 1;
+ m_ka302c_banking = true;
- m_okibank->configure_entries(0, 4, memregion("oki")->base() + 0x30000, 0x10000);
+ m_okibank->configure_entries(0, 5, memregion("oki")->base() + 0x30000, 0x10000);
m_okibank->set_entry(0);
}
@@ -1950,24 +1959,24 @@ void psikyo_state::init_s1945bl()
***************************************************************************/
-GAME( 1993, samuraia, 0, sngkace, samuraia, psikyo_state, init_sngkace, ROT270, "Psikyo", "Samurai Aces (World)", MACHINE_SUPPORTS_SAVE ) // Banpresto?
-GAME( 1993, sngkace, samuraia, sngkace, sngkace, psikyo_state, init_sngkace, ROT270, "Psikyo", "Sengoku Ace (Japan, set 1)", MACHINE_SUPPORTS_SAVE ) // Banpresto?
-GAME( 1993, sngkacea, samuraia, sngkace, sngkace, psikyo_state, init_sngkace, ROT270, "Psikyo", "Sengoku Ace (Japan, set 2)", MACHINE_SUPPORTS_SAVE ) // Banpresto?
+GAME( 1993, samuraia, 0, sngkace, samuraia, psikyo_state, init_sngkace, ROT270, "Psikyo", "Samurai Aces (World)", MACHINE_SUPPORTS_SAVE ) // Banpresto?
+GAME( 1993, sngkace, samuraia, sngkace, sngkace, psikyo_state, init_sngkace, ROT270, "Psikyo", "Sengoku Ace (Japan, set 1)", MACHINE_SUPPORTS_SAVE ) // Banpresto?
+GAME( 1993, sngkacea, samuraia, sngkace, sngkace, psikyo_state, init_sngkace, ROT270, "Psikyo", "Sengoku Ace (Japan, set 2)", MACHINE_SUPPORTS_SAVE ) // Banpresto?
-GAME( 1994, gunbird, 0, gunbird, gunbird, psikyo_state, init_gunbird, ROT270, "Psikyo", "Gunbird (World)", MACHINE_SUPPORTS_SAVE )
-GAME( 1994, gunbirdk, gunbird, gunbird, gunbirdj, psikyo_state, init_gunbird, ROT270, "Psikyo", "Gunbird (Korea)", MACHINE_SUPPORTS_SAVE )
-GAME( 1994, gunbirdj, gunbird, gunbird, gunbirdj, psikyo_state, init_gunbird, ROT270, "Psikyo", "Gunbird (Japan)", MACHINE_SUPPORTS_SAVE )
+GAME( 1994, gunbird, 0, gunbird, gunbird, psikyo_state, init_gunbird, ROT270, "Psikyo", "Gunbird (World)", MACHINE_SUPPORTS_SAVE )
+GAME( 1994, gunbirdk, gunbird, gunbird, gunbirdj, psikyo_state, init_gunbird, ROT270, "Psikyo", "Gunbird (Korea)", MACHINE_SUPPORTS_SAVE )
+GAME( 1994, gunbirdj, gunbird, gunbird, gunbirdj, psikyo_state, init_gunbird, ROT270, "Psikyo", "Gunbird (Japan)", MACHINE_SUPPORTS_SAVE )
-GAME( 1994, btlkroad, 0, gunbird, btlkroad, psikyo_state, init_gunbird, ROT0, "Psikyo", "Battle K-Road", MACHINE_SUPPORTS_SAVE )
-GAME( 1994, btlkroadk, btlkroad, gunbird, btlkroad, psikyo_state, init_gunbird, ROT0, "Psikyo", "Battle K-Road (Korean PCB)", MACHINE_SUPPORTS_SAVE ) // game code is still multi-region, but sound rom appears to be Korea specific at least
+GAME( 1994, btlkroad, 0, gunbird, btlkroad, psikyo_state, init_gunbird, ROT0, "Psikyo", "Battle K-Road", MACHINE_SUPPORTS_SAVE )
+GAME( 1994, btlkroadk, btlkroad, gunbird, btlkroadk, psikyo_state, init_gunbird, ROT0, "Psikyo", "Battle K-Road (Korea)", MACHINE_SUPPORTS_SAVE ) // game code is still multi-region, but sound rom appears to be Korea specific at least
-GAME( 1995, s1945, 0, s1945, s1945, psikyo_state, init_s1945, ROT270, "Psikyo", "Strikers 1945 (World)", MACHINE_SUPPORTS_SAVE )
-GAME( 1995, s1945a, s1945, s1945, s1945a, psikyo_state, init_s1945a, ROT270, "Psikyo", "Strikers 1945 (Japan / World)", MACHINE_SUPPORTS_SAVE ) // Region dip - 0x0f=Japan, anything else=World
-GAME( 1995, s1945j, s1945, s1945, s1945j, psikyo_state, init_s1945j, ROT270, "Psikyo", "Strikers 1945 (Japan)", MACHINE_SUPPORTS_SAVE )
-GAME( 1995, s1945n, s1945, s1945jn, s1945, psikyo_state, init_gunbird, ROT270, "Psikyo", "Strikers 1945 (World, unprotected)", MACHINE_SUPPORTS_SAVE )
-GAME( 1995, s1945jn, s1945, s1945jn, s1945j, psikyo_state, init_gunbird, ROT270, "Psikyo", "Strikers 1945 (Japan, unprotected)", MACHINE_SUPPORTS_SAVE )
-GAME( 1995, s1945k, s1945, s1945, s1945j, psikyo_state, init_s1945, ROT270, "Psikyo", "Strikers 1945 (Korea)", MACHINE_SUPPORTS_SAVE )
-GAME( 1995, s1945bl, s1945, s1945bl, s1945bl, psikyo_state, init_s1945bl, ROT270, "bootleg", "Strikers 1945 (Hong Kong, bootleg)", MACHINE_SUPPORTS_SAVE )
+GAME( 1995, s1945, 0, s1945, s1945, psikyo_state, init_s1945, ROT270, "Psikyo", "Strikers 1945 (World)", MACHINE_SUPPORTS_SAVE )
+GAME( 1995, s1945a, s1945, s1945, s1945a, psikyo_state, init_s1945a, ROT270, "Psikyo", "Strikers 1945 (Japan / World)", MACHINE_SUPPORTS_SAVE ) // Region dip - 0x0f=Japan, anything else=World
+GAME( 1995, s1945j, s1945, s1945, s1945j, psikyo_state, init_s1945j, ROT270, "Psikyo", "Strikers 1945 (Japan)", MACHINE_SUPPORTS_SAVE )
+GAME( 1995, s1945n, s1945, s1945n, s1945, psikyo_state, init_gunbird, ROT270, "Psikyo", "Strikers 1945 (World, unprotected)", MACHINE_SUPPORTS_SAVE )
+GAME( 1995, s1945nj, s1945, s1945n, s1945j, psikyo_state, init_gunbird, ROT270, "Psikyo", "Strikers 1945 (Japan, unprotected)", MACHINE_SUPPORTS_SAVE )
+GAME( 1995, s1945k, s1945, s1945, s1945j, psikyo_state, init_s1945, ROT270, "Psikyo", "Strikers 1945 (Korea)", MACHINE_SUPPORTS_SAVE )
+GAME( 1995, s1945bl, s1945, s1945bl, s1945bl, psikyo_state, init_s1945bl, ROT270, "bootleg", "Strikers 1945 (Hong Kong, bootleg)", MACHINE_SUPPORTS_SAVE )
-GAME( 1996, tengai, 0, s1945, tengai, psikyo_state, init_tengai, ROT0, "Psikyo", "Tengai (World)", MACHINE_SUPPORTS_SAVE )
-GAME( 1996, tengaij, tengai, s1945, tengaij, psikyo_state, init_tengai, ROT0, "Psikyo", "Sengoku Blade: Sengoku Ace Episode II / Tengai", MACHINE_SUPPORTS_SAVE ) // Region dip - 0x0f=Japan, anything else=World
+GAME( 1996, tengai, 0, s1945, tengai, psikyo_state, init_tengai, ROT0, "Psikyo", "Tengai (World)", MACHINE_SUPPORTS_SAVE )
+GAME( 1996, tengaij, tengai, s1945, tengaij, psikyo_state, init_tengai, ROT0, "Psikyo", "Sengoku Blade: Sengoku Ace Episode II / Tengai", MACHINE_SUPPORTS_SAVE ) // Region dip - 0x0f=Japan, anything else=World
diff --git a/src/mame/drivers/psion.cpp b/src/mame/drivers/psion.cpp
index 7396377a534..ae92011d2a4 100644
--- a/src/mame/drivers/psion.cpp
+++ b/src/mame/drivers/psion.cpp
@@ -569,24 +569,25 @@ static GFXDECODE_START( gfx_psion )
GFXDECODE_END
/* basic configuration for 2 lines display */
-MACHINE_CONFIG_START(psion_state::psion_2lines)
+void psion_state::psion_2lines(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", HD63701, 980000) // should be HD6303 at 0.98MHz
+ HD63701(config, m_maincpu, 980000); // should be HD6303 at 0.98MHz
/* video hardware */
- MCFG_SCREEN_ADD("screen", LCD)
- MCFG_SCREEN_REFRESH_RATE(50)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */
- MCFG_SCREEN_UPDATE_DEVICE("hd44780", hd44780_device, screen_update)
- MCFG_SCREEN_SIZE(6*16, 9*2)
- MCFG_SCREEN_VISIBLE_AREA(0, 6*16-1, 0, 9*2-1)
- MCFG_SCREEN_PALETTE("palette")
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_LCD));
+ screen.set_refresh_hz(50);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */
+ screen.set_screen_update("hd44780", FUNC(hd44780_device::screen_update));
+ screen.set_size(6*16, 9*2);
+ screen.set_visarea(0, 6*16-1, 0, 9*2-1);
+ screen.set_palette("palette");
PALETTE(config, "palette", FUNC(psion_state::psion_palette), 2);
GFXDECODE(config, "gfxdecode", "palette", gfx_psion);
- MCFG_HD44780_ADD("hd44780")
- MCFG_HD44780_LCD_SIZE(2, 16)
+ HD44780(config, m_lcdc, 0);
+ m_lcdc->set_lcd_size(2, 16);
/* sound hardware */
SPEAKER(config, "mono").front_center();
@@ -595,88 +596,83 @@ MACHINE_CONFIG_START(psion_state::psion_2lines)
NVRAM(config, "nvram1").set_custom_handler(FUNC(psion_state::nvram_init)); // sys_regs
NVRAM(config, "nvram2", nvram_device::DEFAULT_ALL_0); // RAM
- MCFG_TIMER_DRIVER_ADD_PERIODIC("nmi_timer", psion_state, nmi_timer, attotime::from_seconds(1))
+ TIMER(config, "nmi_timer").configure_periodic(FUNC(psion_state::nmi_timer), attotime::from_seconds(1));
/* Datapack */
PSION_DATAPACK(config, m_pack1, 0);
PSION_DATAPACK(config, m_pack2, 0);
/* Software lists */
- MCFG_SOFTWARE_LIST_ADD("pack_list", "psion2")
-MACHINE_CONFIG_END
+ SOFTWARE_LIST(config, "pack_list").set_original("psion2");
+}
/* basic configuration for 4 lines display */
-MACHINE_CONFIG_START(psion_state::psion_4lines)
+void psion_state::psion_4lines(machine_config &config)
+{
psion_2lines(config);
/* video hardware */
- MCFG_SCREEN_MODIFY("screen")
- MCFG_SCREEN_SIZE(6*20, 9*4)
- MCFG_SCREEN_VISIBLE_AREA(0, 6*20-1, 0, 9*4-1)
+ subdevice<screen_device>("screen")->set_size(6*20, 9*4);
+ subdevice<screen_device>("screen")->set_visarea(0, 6*20-1, 0, 9*4-1);
- MCFG_DEVICE_MODIFY("hd44780")
- MCFG_HD44780_LCD_SIZE(4, 20)
- MCFG_HD44780_PIXEL_UPDATE_CB(psion_state,lz_pixel_update)
-MACHINE_CONFIG_END
+ m_lcdc->set_lcd_size(4, 20);
+ m_lcdc->set_pixel_update_cb(FUNC(psion_state::lz_pixel_update), this);
+}
-MACHINE_CONFIG_START(psion1_state::psion1)
+void psion1_state::psion1(machine_config &config)
+{
psion_2lines(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(psion1_mem)
+ m_maincpu->set_addrmap(AS_PROGRAM, &psion1_state::psion1_mem);
- MCFG_DEVICE_MODIFY("nmi_timer")
- MCFG_TIMER_START_DELAY(attotime::from_seconds(1))
+ subdevice<timer_device>("nmi_timer")->set_start_delay(attotime::from_seconds(1));
- MCFG_SCREEN_MODIFY("screen")
- MCFG_SCREEN_SIZE(6*16, 1*8)
- MCFG_SCREEN_VISIBLE_AREA(0, 6*16-1, 0, 8*1-1)
+ subdevice<screen_device>("screen")->set_size(6*16, 1*8);
+ subdevice<screen_device>("screen")->set_visarea(0, 6*16-1, 0, 8*1-1);
- MCFG_DEVICE_MODIFY("hd44780")
- MCFG_HD44780_LCD_SIZE(1, 16)
- MCFG_HD44780_PIXEL_UPDATE_CB(psion1_state,psion1_pixel_update)
+ m_lcdc->set_lcd_size(1, 16);
+ m_lcdc->set_pixel_update_cb(FUNC(psion1_state::psion1_pixel_update), this);
/* Software lists */
- MCFG_SOFTWARE_LIST_REMOVE("pack_list")
- MCFG_SOFTWARE_LIST_ADD("pack_list", "psion1")
-MACHINE_CONFIG_END
+ SOFTWARE_LIST(config.replace(), "pack_list").set_original("psion1");
+}
-MACHINE_CONFIG_START(psion_state::psioncm)
+void psion_state::psioncm(machine_config &config)
+{
psion_2lines(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(psioncm_mem)
-MACHINE_CONFIG_END
+ m_maincpu->set_addrmap(AS_PROGRAM, &psion_state::psioncm_mem);
+}
-MACHINE_CONFIG_START(psion_state::psionla)
+void psion_state::psionla(machine_config &config)
+{
psion_2lines(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(psionla_mem)
-MACHINE_CONFIG_END
+ m_maincpu->set_addrmap(AS_PROGRAM, &psion_state::psionla_mem);
+}
-MACHINE_CONFIG_START(psion_state::psionlam)
+void psion_state::psionlam(machine_config &config)
+{
psion_2lines(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(psionlam_mem)
-MACHINE_CONFIG_END
+ m_maincpu->set_addrmap(AS_PROGRAM, &psion_state::psionlam_mem);
+}
-MACHINE_CONFIG_START(psion_state::psionp350)
+void psion_state::psionp350(machine_config &config)
+{
psion_2lines(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(psionp350_mem)
+ m_maincpu->set_addrmap(AS_PROGRAM, &psion_state::psionp350_mem);
NVRAM(config, "nvram3", nvram_device::DEFAULT_ALL_0); // paged RAM
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(psion_state::psionlz)
+void psion_state::psionlz(machine_config &config)
+{
psion_4lines(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(psionlz_mem)
+ m_maincpu->set_addrmap(AS_PROGRAM, &psion_state::psionlz_mem);
NVRAM(config, "nvram3", nvram_device::DEFAULT_ALL_0); // paged RAM
-MACHINE_CONFIG_END
+}
/* ROM definition */
diff --git a/src/mame/drivers/psx.cpp b/src/mame/drivers/psx.cpp
index e7f09bb3d00..e5e313c67b6 100644
--- a/src/mame/drivers/psx.cpp
+++ b/src/mame/drivers/psx.cpp
@@ -29,17 +29,15 @@
#include <zlib.h>
-#define PSXCD_TAG "psxcd"
-
class psx1_state : public driver_device
{
public:
- psx1_state(const machine_config &mconfig, device_type type, const char *tag)
- : driver_device(mconfig, type, tag),
+ psx1_state(const machine_config &mconfig, device_type type, const char *tag) :
+ driver_device(mconfig, type, tag),
m_maincpu(*this, "maincpu"),
m_ram(*this, "maincpu:ram"),
m_parallel(*this, "parallel"),
- m_psxcd(*this, PSXCD_TAG)
+ m_psxcd(*this, "psxcd")
{
}
@@ -521,8 +519,8 @@ void psx1_state::subcpu_map(address_map &map)
void psx1_state::psx_base(machine_config &config)
{
m_maincpu->set_addrmap(AS_PROGRAM, &psx1_state::psx_map);
- m_maincpu->cd_read().set(PSXCD_TAG, FUNC(psxcd_device::read));
- m_maincpu->cd_write().set(PSXCD_TAG, FUNC(psxcd_device::write));
+ m_maincpu->cd_read().set(m_psxcd, FUNC(psxcd_device::read));
+ m_maincpu->cd_write().set(m_psxcd, FUNC(psxcd_device::write));
m_maincpu->subdevice<ram_device>("ram")->set_default_size("2M");
psxcontrollerports_device &controllers(PSXCONTROLLERPORTS(config, "controllers", 0));
@@ -545,8 +543,8 @@ void psx1_state::psx_base(machine_config &config)
spu.add_route(0, "lspeaker", 1.00);
spu.add_route(1, "rspeaker", 1.00);
- quickload_image_device &quickload(QUICKLOAD(config, "quickload", 0));
- quickload.set_handler(snapquick_load_delegate(&QUICKLOAD_LOAD_NAME(psx1_state, psx_exe_load), this), "cpe,exe,psf,psx", 0);
+ quickload_image_device &quickload(QUICKLOAD(config, "quickload"));
+ quickload.set_handler(snapquick_load_delegate(&QUICKLOAD_LOAD_NAME(psx1_state, psx_exe_load), this), "cpe,exe,psf,psx");
PSX_PARALLEL_SLOT(config, "parallel", psx_parallel_devices, nullptr);
diff --git a/src/mame/drivers/pt68k4.cpp b/src/mame/drivers/pt68k4.cpp
index b5b7727e9f6..b28086c04f3 100644
--- a/src/mame/drivers/pt68k4.cpp
+++ b/src/mame/drivers/pt68k4.cpp
@@ -403,84 +403,82 @@ void pt68k4_isa8_cards(device_slot_interface &device)
device.option_add("xtide", ISA8_XTIDE); // Monk only
}
-MACHINE_CONFIG_START(pt68k4_state::pt68k2)
+void pt68k4_state::pt68k2(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD(M68K_TAG, M68000, 16_MHz_XTAL / 2) // 68k2 came in 8, 10, and 12 MHz versions
- MCFG_DEVICE_PROGRAM_MAP(pt68k2_mem)
+ M68000(config, m_maincpu, 16_MHz_XTAL / 2); // 68k2 came in 8, 10, and 12 MHz versions
+ m_maincpu->set_addrmap(AS_PROGRAM, &pt68k4_state::pt68k2_mem);
- MCFG_DEVICE_ADD("duart1", MC68681, 3.6864_MHz_XTAL)
- MCFG_MC68681_IRQ_CALLBACK(WRITELINE(*this, pt68k4_state, duart1_irq))
- MCFG_MC68681_OUTPORT_CALLBACK(WRITE8(*this, pt68k4_state, duart1_out))
+ MC68681(config, m_duart1, 3.6864_MHz_XTAL);
+ m_duart1->irq_cb().set(FUNC(pt68k4_state::duart1_irq));
+ m_duart1->outport_cb().set(FUNC(pt68k4_state::duart1_out));
- MCFG_DEVICE_ADD("duart2", MC68681, 3.6864_MHz_XTAL)
+ MC68681(config, m_duart2, 3.6864_MHz_XTAL);
- MCFG_DEVICE_ADD(KBDC_TAG, PC_KBDC, 0)
- MCFG_PC_KBDC_OUT_CLOCK_CB(WRITELINE(*this, pt68k4_state, keyboard_clock_w))
- MCFG_PC_KBDC_OUT_DATA_CB(WRITELINE(*this, pt68k4_state, keyboard_data_w))
- MCFG_PC_KBDC_SLOT_ADD(KBDC_TAG, "kbd", pc_xt_keyboards, STR_KBD_IBM_PC_XT_83)
+ pc_kbdc_device &pc_kbdc(PC_KBDC(config, KBDC_TAG, 0));
+ pc_kbdc.out_clock_cb().set(FUNC(pt68k4_state::keyboard_clock_w));
+ pc_kbdc.out_data_cb().set(FUNC(pt68k4_state::keyboard_data_w));
+ PC_KBDC_SLOT(config, "kbd", pc_xt_keyboards, STR_KBD_IBM_PC_XT_83).set_pc_kbdc_slot(&pc_kbdc);
- MCFG_DEVICE_ADD(TIMEKEEPER_TAG, M48T02, 0)
+ M48T02(config, TIMEKEEPER_TAG, 0);
WD1772(config, m_wdfdc, 16_MHz_XTAL / 2);
- MCFG_FLOPPY_DRIVE_ADD(m_floppy_connector[0], pt68k_floppies, "525dd", pt68k4_state::floppy_formats)
- MCFG_FLOPPY_DRIVE_ADD(m_floppy_connector[1], pt68k_floppies, "525dd", pt68k4_state::floppy_formats)
+ FLOPPY_CONNECTOR(config, m_floppy_connector[0], pt68k_floppies, "525dd", pt68k4_state::floppy_formats);
+ FLOPPY_CONNECTOR(config, m_floppy_connector[1], pt68k_floppies, "525dd", pt68k4_state::floppy_formats);
ISA8(config, m_isa, 0);
- m_isa->set_cputag(M68K_TAG);
m_isa->set_custom_spaces();
m_isa->irq5_callback().set(FUNC(pt68k4_state::irq5_w));
- MCFG_DEVICE_ADD("isa1", ISA8_SLOT, 0, ISABUS_TAG, pt68k4_isa8_cards, "cga", false) // FIXME: determine ISA bus clock
- MCFG_DEVICE_ADD("isa2", ISA8_SLOT, 0, ISABUS_TAG, pt68k4_isa8_cards, nullptr, false)
- MCFG_DEVICE_ADD("isa3", ISA8_SLOT, 0, ISABUS_TAG, pt68k4_isa8_cards, nullptr, false)
- MCFG_DEVICE_ADD("isa4", ISA8_SLOT, 0, ISABUS_TAG, pt68k4_isa8_cards, nullptr, false)
- MCFG_DEVICE_ADD("isa5", ISA8_SLOT, 0, ISABUS_TAG, pt68k4_isa8_cards, nullptr, false)
- MCFG_DEVICE_ADD("isa6", ISA8_SLOT, 0, ISABUS_TAG, pt68k4_isa8_cards, nullptr, false)
+ ISA8_SLOT(config, "isa1", 0, m_isa, pt68k4_isa8_cards, "cga", false); // FIXME: determine ISA bus clock
+ ISA8_SLOT(config, "isa2", 0, m_isa, pt68k4_isa8_cards, nullptr, false);
+ ISA8_SLOT(config, "isa3", 0, m_isa, pt68k4_isa8_cards, nullptr, false);
+ ISA8_SLOT(config, "isa4", 0, m_isa, pt68k4_isa8_cards, nullptr, false);
+ ISA8_SLOT(config, "isa5", 0, m_isa, pt68k4_isa8_cards, nullptr, false);
+ ISA8_SLOT(config, "isa6", 0, m_isa, pt68k4_isa8_cards, nullptr, false),
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD(SPEAKER_TAG, SPEAKER_SOUND)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.00)
+ SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 1.00);
- MCFG_SOFTWARE_LIST_ADD("flop525_list", "pt68k2")
-MACHINE_CONFIG_END
+ SOFTWARE_LIST(config, "flop525_list").set_original("pt68k2");
+}
-MACHINE_CONFIG_START(pt68k4_state::pt68k4)
+void pt68k4_state::pt68k4(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD(M68K_TAG, M68000, XTAL(16'000'000))
- MCFG_DEVICE_PROGRAM_MAP(pt68k4_mem)
+ M68000(config, m_maincpu, XTAL(16'000'000));
+ m_maincpu->set_addrmap(AS_PROGRAM, &pt68k4_state::pt68k4_mem);
// add the DUARTS. first one has the console on channel A at 19200.
- MCFG_DEVICE_ADD("duart1", MC68681, XTAL(16'000'000) / 4)
- MCFG_MC68681_IRQ_CALLBACK(WRITELINE(*this, pt68k4_state, duart1_irq))
- MCFG_MC68681_OUTPORT_CALLBACK(WRITE8(*this, pt68k4_state, duart1_out))
+ MC68681(config, m_duart1, XTAL(16'000'000) / 4);
+ m_duart1->irq_cb().set(FUNC(pt68k4_state::duart1_irq));
+ m_duart1->outport_cb().set(FUNC(pt68k4_state::duart1_out));
- MCFG_DEVICE_ADD("duart2", MC68681, XTAL(16'000'000) / 4)
+ MC68681(config, m_duart2, XTAL(16'000'000) / 4);
- MCFG_DEVICE_ADD(KBDC_TAG, PC_KBDC, 0)
- MCFG_PC_KBDC_OUT_CLOCK_CB(WRITELINE(*this, pt68k4_state, keyboard_clock_w))
- MCFG_PC_KBDC_OUT_DATA_CB(WRITELINE(*this, pt68k4_state, keyboard_data_w))
- MCFG_PC_KBDC_SLOT_ADD(KBDC_TAG, "kbd", pc_xt_keyboards, STR_KBD_IBM_PC_XT_83)
+ pc_kbdc_device &pc_kbdc(PC_KBDC(config, KBDC_TAG, 0));
+ pc_kbdc.out_clock_cb().set(FUNC(pt68k4_state::keyboard_clock_w));
+ pc_kbdc.out_data_cb().set(FUNC(pt68k4_state::keyboard_data_w));
+ PC_KBDC_SLOT(config, "kbd", pc_xt_keyboards, STR_KBD_IBM_PC_XT_83).set_pc_kbdc_slot(&pc_kbdc);
- MCFG_DEVICE_ADD(TIMEKEEPER_TAG, M48T02, 0)
+ M48T02(config, TIMEKEEPER_TAG, 0);
ISA8(config, m_isa, 0);
- m_isa->set_cputag(M68K_TAG);
m_isa->set_custom_spaces();
- MCFG_DEVICE_ADD("isa1", ISA8_SLOT, 0, ISABUS_TAG, pt68k4_isa8_cards, "fdc_at", false) // FIXME: determine ISA bus clock
- MCFG_DEVICE_ADD("isa2", ISA8_SLOT, 0, ISABUS_TAG, pt68k4_isa8_cards, "cga", false)
- MCFG_DEVICE_ADD("isa3", ISA8_SLOT, 0, ISABUS_TAG, pt68k4_isa8_cards, nullptr, false)
- MCFG_DEVICE_ADD("isa4", ISA8_SLOT, 0, ISABUS_TAG, pt68k4_isa8_cards, nullptr, false)
- MCFG_DEVICE_ADD("isa5", ISA8_SLOT, 0, ISABUS_TAG, pt68k4_isa8_cards, nullptr, false)
- MCFG_DEVICE_ADD("isa6", ISA8_SLOT, 0, ISABUS_TAG, pt68k4_isa8_cards, nullptr, false)
- MCFG_DEVICE_ADD("isa7", ISA8_SLOT, 0, ISABUS_TAG, pt68k4_isa8_cards, nullptr, false)
+ ISA8_SLOT(config, "isa1", 0, m_isa, pt68k4_isa8_cards, "fdc_at", false); // FIXME: determine ISA bus clock
+ ISA8_SLOT(config, "isa2", 0, m_isa, pt68k4_isa8_cards, "cga", false);
+ ISA8_SLOT(config, "isa3", 0, m_isa, pt68k4_isa8_cards, nullptr, false);
+ ISA8_SLOT(config, "isa4", 0, m_isa, pt68k4_isa8_cards, nullptr, false);
+ ISA8_SLOT(config, "isa5", 0, m_isa, pt68k4_isa8_cards, nullptr, false);
+ ISA8_SLOT(config, "isa6", 0, m_isa, pt68k4_isa8_cards, nullptr, false),
+ ISA8_SLOT(config, "isa7", 0, m_isa, pt68k4_isa8_cards, nullptr, false),
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD(SPEAKER_TAG, SPEAKER_SOUND)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.00)
+ SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 1.00);
- MCFG_SOFTWARE_LIST_ADD("flop525_list", "pt68k2")
-MACHINE_CONFIG_END
+ SOFTWARE_LIST(config, "flop525_list").set_original("pt68k2");
+}
/* ROM definition */
ROM_START( pt68k2 )
diff --git a/src/mame/drivers/ptcsol.cpp b/src/mame/drivers/ptcsol.cpp
index 381e6361a31..750a85a6842 100644
--- a/src/mame/drivers/ptcsol.cpp
+++ b/src/mame/drivers/ptcsol.cpp
@@ -121,6 +121,7 @@
//#include "bus/s100/s100.h"
#include "imagedev/cassette.h"
#include "machine/ay31015.h"
+#include "machine/clock.h"
#include "machine/keyboard.h"
#include "sound/spkrdev.h"
#include "sound/wave.h"
@@ -157,6 +158,8 @@ public:
, m_cass2(*this, "cassette2")
, m_uart(*this, "uart")
, m_uart_s(*this, "uart_s")
+ , m_uart_clock(*this, "uart_clock")
+ , m_uart_s_clock(*this, "uart_s_clock")
, m_rs232(*this, "rs232")
, m_p_videoram(*this, "videoram")
, m_p_chargen(*this, "chargen")
@@ -211,6 +214,8 @@ private:
required_device<cassette_image_device> m_cass2;
required_device<ay31015_device> m_uart;
required_device<ay31015_device> m_uart_s;
+ required_device<clock_device> m_uart_clock;
+ required_device<clock_device> m_uart_s_clock;
required_device<rs232_port_device> m_rs232;
required_shared_ptr<uint8_t> m_p_videoram;
required_region_ptr<u8> m_p_chargen;
@@ -420,8 +425,7 @@ WRITE8_MEMBER( sol20_state::sol20_fa_w )
m_cassette_timer->adjust(attotime::zero);
// bit 5 baud rate */
- m_uart->set_receiver_clock((BIT(data, 5)) ? 4800.0 : 19200.0);
- m_uart->set_transmitter_clock((BIT(data, 5)) ? 4800.0 : 19200.0);
+ m_uart_clock->set_unscaled_clock(BIT(data, 5) ? 4800 : 19200);
}
WRITE8_MEMBER( sol20_state::sol20_fd_w )
@@ -613,8 +617,7 @@ void sol20_state::machine_reset()
s_clock = s_bauds[s_count] << 4;
// these lines could be commented out for now if you want better performance
- m_uart_s->set_receiver_clock(s_clock);
- m_uart_s->set_transmitter_clock(s_clock);
+ m_uart_s_clock->set_unscaled_clock(s_clock);
// boot-bank
membank("boot")->set_entry(1);
@@ -769,19 +772,23 @@ void sol20_state::sol20(machine_config &config)
m_cass2->set_interface("sol20_cass");
AY51013(config, m_uart); // TMS6011NC
- m_uart->set_tx_clock(4800.0);
- m_uart->set_rx_clock(4800.0);
m_uart->set_auto_rdav(true); // ROD (pin 4) tied to RDD (pin 18)
+ CLOCK(config, m_uart_clock, 4800);
+ m_uart_clock->signal_handler().set(m_uart, FUNC(ay51013_device::write_rcp));
+ m_uart_clock->signal_handler().append(m_uart, FUNC(ay51013_device::write_tcp));
+
RS232_PORT(config, m_rs232, default_rs232_devices, nullptr);
AY51013(config, m_uart_s); // TMS6011NC
m_uart_s->read_si_callback().set(m_rs232, FUNC(rs232_port_device::rxd_r));
m_uart_s->write_so_callback().set(m_rs232, FUNC(rs232_port_device::write_txd));
- m_uart_s->set_tx_clock(4800.0);
- m_uart_s->set_rx_clock(4800.0);
m_uart_s->set_auto_rdav(true); // ROD (pin 4) tied to RDD (pin 18)
+ CLOCK(config, m_uart_s_clock, 4800);
+ m_uart_s_clock->signal_handler().set(m_uart_s, FUNC(ay51013_device::write_rcp));
+ m_uart_s_clock->signal_handler().append(m_uart_s, FUNC(ay51013_device::write_tcp));
+
generic_keyboard_device &keyboard(GENERIC_KEYBOARD(config, "keyboard", 0));
keyboard.set_keyboard_callback(FUNC(sol20_state::kbd_put));
diff --git a/src/mame/drivers/pturn.cpp b/src/mame/drivers/pturn.cpp
index 1f23febb9d2..14d50a76a92 100644
--- a/src/mame/drivers/pturn.cpp
+++ b/src/mame/drivers/pturn.cpp
@@ -517,14 +517,15 @@ void pturn_state::machine_reset()
m_nmi_sub = false;
}
-MACHINE_CONFIG_START(pturn_state::pturn)
- MCFG_DEVICE_ADD("maincpu", Z80, 12000000/3)
- MCFG_DEVICE_PROGRAM_MAP(main_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", pturn_state, main_intgen)
+void pturn_state::pturn(machine_config &config)
+{
+ Z80(config, m_maincpu, 12000000/3);
+ m_maincpu->set_addrmap(AS_PROGRAM, &pturn_state::main_map);
+ m_maincpu->set_vblank_int("screen", FUNC(pturn_state::main_intgen));
- MCFG_DEVICE_ADD("audiocpu", Z80, 12000000/3)
- MCFG_DEVICE_PROGRAM_MAP(sub_map)
- MCFG_DEVICE_PERIODIC_INT_DRIVER(pturn_state, sub_intgen, 3*60)
+ Z80(config, m_audiocpu, 12000000/3);
+ m_audiocpu->set_addrmap(AS_PROGRAM, &pturn_state::sub_map);
+ m_audiocpu->set_periodic_int(FUNC(pturn_state::sub_intgen), attotime::from_hz(3*60));
ls259_device &mainlatch(LS259(config, "mainlatch"));
mainlatch.q_out_cb<0>().set(FUNC(pturn_state::flip_w));
@@ -535,17 +536,17 @@ MACHINE_CONFIG_START(pturn_state::pturn)
mainlatch.q_out_cb<5>().set(FUNC(pturn_state::fgbank_w));
mainlatch.q_out_cb<6>().set_nop(); // toggles frequently during gameplay
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(32*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(pturn_state, screen_update)
- MCFG_SCREEN_PALETTE(m_palette)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(32*8, 32*8);
+ screen.set_visarea(0*8, 32*8-1, 2*8, 30*8-1);
+ screen.set_screen_update(FUNC(pturn_state::screen_update));
+ screen.set_palette(m_palette);
PALETTE(config, m_palette, palette_device::RGB_444_PROMS, "proms", 0x100);
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_pturn)
+ GFXDECODE(config, m_gfxdecode, m_palette, gfx_pturn);
/* sound hardware */
SPEAKER(config, "mono").front_center();
@@ -555,7 +556,7 @@ MACHINE_CONFIG_START(pturn_state::pturn)
AY8910(config, "ay1", 2000000).add_route(ALL_OUTPUTS, "mono", 0.25);
AY8910(config, "ay2", 2000000).add_route(ALL_OUTPUTS, "mono", 0.25);
-MACHINE_CONFIG_END
+}
ROM_START( pturn )
diff --git a/src/mame/drivers/puckpkmn.cpp b/src/mame/drivers/puckpkmn.cpp
index ff51a3480e4..23a81639696 100644
--- a/src/mame/drivers/puckpkmn.cpp
+++ b/src/mame/drivers/puckpkmn.cpp
@@ -278,36 +278,34 @@ void md_boot_state::puckpkmna_map(address_map &map)
map(0x70001c, 0x70001d).r(FUNC(md_boot_state::puckpkmna_70001c_r));
}
-MACHINE_CONFIG_START(md_boot_state::puckpkmn)
+void md_boot_state::puckpkmn(machine_config &config)
+{
md_ntsc(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(puckpkmn_map)
+ m_maincpu->set_addrmap(AS_PROGRAM, &md_boot_state::puckpkmn_map);
MCFG_MACHINE_START_OVERRIDE(md_boot_state, md_bootleg)
- MCFG_DEVICE_REMOVE("genesis_snd_z80")
+ config.device_remove("genesis_snd_z80");
- MCFG_DEVICE_ADD("oki", OKIM6295, XTAL(4'000'000) / 4, okim6295_device::PIN7_HIGH)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 0.25)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker",0.25)
-MACHINE_CONFIG_END
+ okim6295_device &oki(OKIM6295(config, "oki", XTAL(4'000'000) / 4, okim6295_device::PIN7_HIGH));
+ oki.add_route(ALL_OUTPUTS, "lspeaker", 0.25);
+ oki.add_route(ALL_OUTPUTS, "rspeaker", 0.25);
+}
-MACHINE_CONFIG_START(md_boot_state::puckpkmna)
+void md_boot_state::puckpkmna(machine_config &config)
+{
puckpkmn(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(puckpkmna_map)
-
-MACHINE_CONFIG_END
+ m_maincpu->set_addrmap(AS_PROGRAM, &md_boot_state::puckpkmna_map);
+}
-MACHINE_CONFIG_START(md_boot_state::jzth)
+void md_boot_state::jzth(machine_config &config)
+{
puckpkmn(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(jzth_map)
-
-MACHINE_CONFIG_END
+ m_maincpu->set_addrmap(AS_PROGRAM, &md_boot_state::jzth_map);
+}
/* Genie's Hardware (contains no real sega parts) */
diff --git a/src/mame/drivers/punchout.cpp b/src/mame/drivers/punchout.cpp
index 344dd66a340..b9faf70cad0 100644
--- a/src/mame/drivers/punchout.cpp
+++ b/src/mame/drivers/punchout.cpp
@@ -622,15 +622,15 @@ MACHINE_RESET_MEMBER(punchout_state, spnchout)
}
-MACHINE_CONFIG_START(punchout_state::punchout)
-
+void punchout_state::punchout(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, XTAL(8'000'000)/2)
- MCFG_DEVICE_PROGRAM_MAP(punchout_map)
- MCFG_DEVICE_IO_MAP(punchout_io_map)
+ Z80(config, m_maincpu, XTAL(8'000'000)/2);
+ m_maincpu->set_addrmap(AS_PROGRAM, &punchout_state::punchout_map);
+ m_maincpu->set_addrmap(AS_IO, &punchout_state::punchout_io_map);
- MCFG_DEVICE_ADD("audiocpu", N2A03, NTSC_APU_CLOCK)
- MCFG_DEVICE_PROGRAM_MAP(punchout_sound_map)
+ N2A03(config, m_audiocpu, NTSC_APU_CLOCK);
+ m_audiocpu->set_addrmap(AS_PROGRAM, &punchout_state::punchout_sound_map);
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
@@ -645,8 +645,8 @@ MACHINE_CONFIG_START(punchout_state::punchout)
mainlatch.q_out_cb<7>().set_nop(); // enable NVRAM?
/* video hardware */
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_punchout)
- MCFG_PALETTE_ADD("palette", 0x200)
+ GFXDECODE(config, m_gfxdecode, m_palette, gfx_punchout);
+ PALETTE(config, m_palette).set_entries(0x200);
config.set_default_layout(layout_dualhovu);
screen_device &top(SCREEN(config, "top", SCREEN_TYPE_RASTER));
@@ -659,13 +659,13 @@ MACHINE_CONFIG_START(punchout_state::punchout)
top.screen_vblank().set(FUNC(punchout_state::vblank_irq));
top.screen_vblank().append_inputline(m_audiocpu, INPUT_LINE_NMI);
- MCFG_SCREEN_ADD("bottom", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(32*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(punchout_state, screen_update_punchout_bottom)
- MCFG_SCREEN_PALETTE("palette")
+ screen_device &bottom(SCREEN(config, "bottom", SCREEN_TYPE_RASTER));
+ bottom.set_refresh_hz(60);
+ bottom.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ bottom.set_size(32*8, 32*8);
+ bottom.set_visarea(0*8, 32*8-1, 2*8, 30*8-1);
+ bottom.set_screen_update(FUNC(punchout_state::screen_update_punchout_bottom));
+ bottom.set_palette(m_palette);
/* sound hardware */
// FIXME: this makes no sense - "lspeaker" on left and "mono" on right, with nothing routed to "mono"
@@ -675,43 +675,41 @@ MACHINE_CONFIG_START(punchout_state::punchout)
GENERIC_LATCH_8(config, "soundlatch");
GENERIC_LATCH_8(config, "soundlatch2");
- MCFG_DEVICE_ADD("vlm", VLM5030, N2A03_NTSC_XTAL/6)
- MCFG_DEVICE_ADDRESS_MAP(0, punchout_vlm_map)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 0.50)
-MACHINE_CONFIG_END
+ VLM5030(config, m_vlm, N2A03_NTSC_XTAL/6);
+ m_vlm->set_addrmap(0, &punchout_state::punchout_vlm_map);
+ m_vlm->add_route(ALL_OUTPUTS, "lspeaker", 0.50);
+}
-MACHINE_CONFIG_START(punchout_state::spnchout)
+void punchout_state::spnchout(machine_config &config)
+{
punchout(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_IO_MAP(spnchout_io_map)
+ m_maincpu->set_addrmap(AS_IO, &punchout_state::spnchout_io_map);
RP5C01(config, m_rtc, 0); // OSCIN -> Vcc
m_rtc->remove_battery();
RP5H01(config, m_rp5h01, 0);
MCFG_MACHINE_RESET_OVERRIDE(punchout_state, spnchout)
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(punchout_state::armwrest)
+void punchout_state::armwrest(machine_config &config)
+{
punchout(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(armwrest_map)
+ m_maincpu->set_addrmap(AS_PROGRAM, &punchout_state::armwrest_map);
/* video hardware */
- MCFG_GFXDECODE_MODIFY("gfxdecode", gfx_armwrest)
+ m_gfxdecode->set_info(gfx_armwrest);
MCFG_VIDEO_START_OVERRIDE(punchout_state, armwrest)
- MCFG_SCREEN_MODIFY("top")
- MCFG_SCREEN_UPDATE_DRIVER(punchout_state, screen_update_armwrest_top)
- MCFG_SCREEN_MODIFY("bottom")
- MCFG_SCREEN_UPDATE_DRIVER(punchout_state, screen_update_armwrest_bottom)
-MACHINE_CONFIG_END
+ subdevice<screen_device>("top")->set_screen_update(FUNC(punchout_state::screen_update_armwrest_top));
+ subdevice<screen_device>("bottom")->set_screen_update(FUNC(punchout_state::screen_update_armwrest_bottom));
+}
diff --git a/src/mame/drivers/pv1000.cpp b/src/mame/drivers/pv1000.cpp
index 5b3c23d7c52..abc184e8645 100644
--- a/src/mame/drivers/pv1000.cpp
+++ b/src/mame/drivers/pv1000.cpp
@@ -177,12 +177,12 @@ private:
required_device<gfxdecode_device> m_gfxdecode;
required_device<screen_device> m_screen;
required_device<palette_device> m_palette;
- void pv1000(address_map &map);
+ void pv1000_mem(address_map &map);
void pv1000_io(address_map &map);
};
-void pv1000_state::pv1000(address_map &map)
+void pv1000_state::pv1000_mem(address_map &map)
{
//AM_RANGE(0x0000, 0x7fff) // mapped by the cartslot
map(0xb800, 0xbbff).ram().share("videoram");
@@ -395,7 +395,7 @@ void pv1000_state::machine_start()
if (m_cart->exists())
{
- m_maincpu->space(AS_PROGRAM).install_read_handler(0x0000, 0x7fff, read8_delegate(FUNC(generic_slot_device::read_rom),(generic_slot_device*)m_cart));
+ m_maincpu->space(AS_PROGRAM).install_read_handler(0x0000, 0x7fff, read8sm_delegate(FUNC(generic_slot_device::read_rom),(generic_slot_device*)m_cart));
// FIXME: this is needed for gfx decoding, but there is probably a cleaner solution!
std::string region_tag;
@@ -441,11 +441,9 @@ GFXDECODE_END
MACHINE_CONFIG_START(pv1000_state::pv1000)
-
- MCFG_DEVICE_ADD( "maincpu", Z80, 17897725/5 )
- MCFG_DEVICE_PROGRAM_MAP( pv1000 )
- MCFG_DEVICE_IO_MAP( pv1000_io )
-
+ Z80(config, m_maincpu, 17897725/5);
+ m_maincpu->set_addrmap(AS_PROGRAM, &pv1000_state::pv1000_mem);
+ m_maincpu->set_addrmap(AS_IO, &pv1000_state::pv1000_io);
/* D65010G031 - Video & sound chip */
SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
@@ -455,7 +453,7 @@ MACHINE_CONFIG_START(pv1000_state::pv1000)
PALETTE(config, m_palette, palette_device::BGR_3BIT);
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_pv1000)
+ GFXDECODE(config, m_gfxdecode, m_palette, gfx_pv1000);
SPEAKER(config, "mono").front_center();
PV1000(config, m_sound, 17897725).add_route(ALL_OUTPUTS, "mono", 1.00);
@@ -466,7 +464,7 @@ MACHINE_CONFIG_START(pv1000_state::pv1000)
MCFG_GENERIC_LOAD(pv1000_state, pv1000_cart)
/* Software lists */
- MCFG_SOFTWARE_LIST_ADD("cart_list","pv1000")
+ SOFTWARE_LIST(config, "cart_list").set_original("pv1000");
MACHINE_CONFIG_END
diff --git a/src/mame/drivers/pv2000.cpp b/src/mame/drivers/pv2000.cpp
index faaa9c7159d..f286ff9fd9d 100644
--- a/src/mame/drivers/pv2000.cpp
+++ b/src/mame/drivers/pv2000.cpp
@@ -184,8 +184,7 @@ void pv2000_state::pv2000_map(address_map &map)
{
map(0x0000, 0x3fff).rom();
- map(0x4000, 0x4000).rw("tms9928a", FUNC(tms9928a_device::vram_r), FUNC(tms9928a_device::vram_w));
- map(0x4001, 0x4001).rw("tms9928a", FUNC(tms9928a_device::register_r), FUNC(tms9928a_device::register_w));
+ map(0x4000, 0x4001).rw("tms9928a", FUNC(tms9928a_device::read), FUNC(tms9928a_device::write));
map(0x7000, 0x7fff).ram();
//AM_RANGE(0x8000, 0xbfff) ext ram?
@@ -205,7 +204,7 @@ void pv2000_state::pv2000_io_map(address_map &map)
map(0x20, 0x20).rw(FUNC(pv2000_state::keys_lo_r), FUNC(pv2000_state::keys_w));
//sn76489a
- map(0x40, 0x40).r(FUNC(pv2000_state::keys_mod_r)).w("sn76489a", FUNC(sn76489a_device::command_w));
+ map(0x40, 0x40).r(FUNC(pv2000_state::keys_mod_r)).w("sn76489a", FUNC(sn76489a_device::write));
/* Cassette input. Gets hit a lot after a GLOAD command */
map(0x60, 0x60).rw(FUNC(pv2000_state::cass_in), FUNC(pv2000_state::cass_out));
@@ -356,7 +355,7 @@ WRITE_LINE_MEMBER( pv2000_state::pv2000_vdp_interrupt )
void pv2000_state::machine_start()
{
if (m_cart->exists())
- m_maincpu->space(AS_PROGRAM).install_read_handler(0xc000, 0xffff, read8_delegate(FUNC(generic_slot_device::read_rom),(generic_slot_device*)m_cart));
+ m_maincpu->space(AS_PROGRAM).install_read_handler(0xc000, 0xffff, read8sm_delegate(FUNC(generic_slot_device::read_rom),(generic_slot_device*)m_cart));
}
void pv2000_state::machine_reset()
@@ -387,11 +386,10 @@ DEVICE_IMAGE_LOAD_MEMBER( pv2000_state, pv2000_cart )
/* Machine Drivers */
MACHINE_CONFIG_START(pv2000_state::pv2000)
-
// basic machine hardware
- MCFG_DEVICE_ADD("maincpu", Z80, XTAL(7'159'090)/2) // 3.579545 MHz
- MCFG_DEVICE_PROGRAM_MAP(pv2000_map)
- MCFG_DEVICE_IO_MAP(pv2000_io_map)
+ Z80(config, m_maincpu, XTAL(7'159'090)/2); // 3.579545 MHz
+ m_maincpu->set_addrmap(AS_PROGRAM, &pv2000_state::pv2000_map);
+ m_maincpu->set_addrmap(AS_IO, &pv2000_state::pv2000_io_map);
// video hardware
tms9928a_device &vdp(TMS9928A(config, "tms9928a", XTAL(10'738'635)));
@@ -403,14 +401,13 @@ MACHINE_CONFIG_START(pv2000_state::pv2000)
// sound hardware
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("sn76489a", SN76489A, XTAL(7'159'090)/2) /* 3.579545 MHz */
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.00)
+ SN76489A(config, "sn76489a", XTAL(7'159'090)/2).add_route(ALL_OUTPUTS, "mono", 1.00); /* 3.579545 MHz */
- WAVE(config, "wave", "cassette").add_route(ALL_OUTPUTS, "mono", 0.25);
+ WAVE(config, "wave", m_cass).add_route(ALL_OUTPUTS, "mono", 0.25);
/* cassette */
- MCFG_CASSETTE_ADD( "cassette" )
- MCFG_CASSETTE_DEFAULT_STATE(CASSETTE_STOPPED | CASSETTE_MOTOR_DISABLED)
+ CASSETTE(config, m_cass);
+ m_cass->set_default_state(CASSETTE_STOPPED | CASSETTE_MOTOR_DISABLED);
/* cartridge */
MCFG_GENERIC_CARTSLOT_ADD("cartslot", generic_plain_slot, "pv2000_cart")
@@ -418,7 +415,7 @@ MACHINE_CONFIG_START(pv2000_state::pv2000)
MCFG_GENERIC_LOAD(pv2000_state, pv2000_cart)
/* Software lists */
- MCFG_SOFTWARE_LIST_ADD("cart_list","pv2000")
+ SOFTWARE_LIST(config, "cart_list").set_original("pv2000");
MACHINE_CONFIG_END
diff --git a/src/mame/drivers/pv9234.cpp b/src/mame/drivers/pv9234.cpp
index a3ff1a54d85..39cb02f1cac 100644
--- a/src/mame/drivers/pv9234.cpp
+++ b/src/mame/drivers/pv9234.cpp
@@ -149,23 +149,23 @@ uint32_t pv9234_state::screen_update_pv9234(screen_device &screen, bitmap_ind16
return 0;
}
-MACHINE_CONFIG_START(pv9234_state::pv9234)
+void pv9234_state::pv9234(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", ARM7, 4915000) //probably a more powerful clone.
- MCFG_DEVICE_PROGRAM_MAP(pv9234_map)
-
+ ARM7(config, m_maincpu, 4915000); //probably a more powerful clone.
+ m_maincpu->set_addrmap(AS_PROGRAM, &pv9234_state::pv9234_map);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(50)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */
- MCFG_SCREEN_SIZE(640, 480)
- MCFG_SCREEN_VISIBLE_AREA(0, 640-1, 0, 480-1)
- MCFG_SCREEN_UPDATE_DRIVER(pv9234_state, screen_update_pv9234)
- MCFG_SCREEN_PALETTE("palette")
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(50);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */
+ screen.set_size(640, 480);
+ screen.set_visarea(0, 640-1, 0, 480-1);
+ screen.set_screen_update(FUNC(pv9234_state::screen_update_pv9234));
+ screen.set_palette("palette");
PALETTE(config, "palette", palette_device::MONOCHROME);
-MACHINE_CONFIG_END
+}
/* ROM definition */
ROM_START( pv9234 )
diff --git a/src/mame/drivers/pwrview.cpp b/src/mame/drivers/pwrview.cpp
index f9295d7d81c..2c9d76c2c62 100644
--- a/src/mame/drivers/pwrview.cpp
+++ b/src/mame/drivers/pwrview.cpp
@@ -404,15 +404,16 @@ static void pwrview_floppies(device_slot_interface &device)
device.option_add("525dd", FLOPPY_525_DD);
}
-MACHINE_CONFIG_START(pwrview_state::pwrview)
- MCFG_DEVICE_ADD("maincpu", I80186, XTAL(16'000'000))
- MCFG_DEVICE_PROGRAM_MAP(pwrview_map)
- MCFG_DEVICE_OPCODES_MAP(pwrview_fetch_map)
- MCFG_DEVICE_IO_MAP(pwrview_io)
+void pwrview_state::pwrview(machine_config &config)
+{
+ I80186(config, m_maincpu, XTAL(16'000'000));
+ m_maincpu->set_addrmap(AS_PROGRAM, &pwrview_state::pwrview_map);
+ m_maincpu->set_addrmap(AS_OPCODES, &pwrview_state::pwrview_fetch_map);
+ m_maincpu->set_addrmap(AS_IO, &pwrview_state::pwrview_io);
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_RAW_PARAMS(XTAL(64'000'000)/8, 480, 0, 384, 1040, 0, 960) // clock unknown
- MCFG_SCREEN_UPDATE_DEVICE("crtc", hd6845_device, screen_update)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_raw(XTAL(64'000'000)/8, 480, 0, 384, 1040, 0, 960); // clock unknown
+ screen.set_screen_update("crtc", FUNC(hd6845_device::screen_update));
PIT8253(config, m_pit, 0);
m_pit->set_clk<0>(XTAL(16'000'000)/16); // clocks unknown, fix above when found
@@ -423,8 +424,8 @@ MACHINE_CONFIG_START(pwrview_state::pwrview)
UPD765A(config, "fdc", 8'000'000, true, true); // Rockwell R7675P
//fdc.intrq_wr_callback().set("pic1", FUNC(pic8259_device::ir6_w));
//fdc.drq_wr_callback().set(m_maincpu, FUNC(i80186_cpu_device::drq1_w));
- MCFG_FLOPPY_DRIVE_ADD("fdc:0", pwrview_floppies, "525dd", floppy_image_device::default_floppy_formats)
- MCFG_FLOPPY_DRIVE_ADD("fdc:1", pwrview_floppies, "525dd", floppy_image_device::default_floppy_formats)
+ FLOPPY_CONNECTOR(config, "fdc:0", pwrview_floppies, "525dd", floppy_image_device::default_floppy_formats);
+ FLOPPY_CONNECTOR(config, "fdc:1", pwrview_floppies, "525dd", floppy_image_device::default_floppy_formats);
I8251(config, "uart", 0);
@@ -435,7 +436,7 @@ MACHINE_CONFIG_START(pwrview_state::pwrview)
crtc.set_update_row_callback(FUNC(pwrview_state::update_row), this);
ADDRESS_MAP_BANK(config, "bios_bank").set_map(&pwrview_state::bios_bank).set_options(ENDIANNESS_LITTLE, 16, 17, 0x8000);
-MACHINE_CONFIG_END
+}
ROM_START(pwrview)
ROM_REGION(0x8000, "bios", 0)
diff --git a/src/mame/drivers/px4.cpp b/src/mame/drivers/px4.cpp
index e3df0086904..66f62a566cb 100644
--- a/src/mame/drivers/px4.cpp
+++ b/src/mame/drivers/px4.cpp
@@ -1146,7 +1146,7 @@ READ8_MEMBER( px4p_state::ramdisk_data_r )
else if (m_ramdisk_address < 0x40000)
{
// read from rom
- ret = m_rdsocket->read_rom(space, m_ramdisk_address);
+ ret = m_rdsocket->read_rom(m_ramdisk_address);
}
m_ramdisk_address = (m_ramdisk_address & 0xffff00) | ((m_ramdisk_address & 0xff) + 1);
@@ -1485,19 +1485,20 @@ void px4p_state::px4p_palette(palette_device &palette) const
// MACHINE DRIVERS
//**************************************************************************
-MACHINE_CONFIG_START(px4_state::px4)
+void px4_state::px4(machine_config &config)
+{
// basic machine hardware
- MCFG_DEVICE_ADD("maincpu", Z80, XTAL(7'372'800) / 2) // uPD70008
- MCFG_DEVICE_PROGRAM_MAP(px4_mem)
- MCFG_DEVICE_IO_MAP(px4_io)
+ Z80(config, m_z80, XTAL(7'372'800) / 2); // uPD70008
+ m_z80->set_addrmap(AS_PROGRAM, &px4_state::px4_mem);
+ m_z80->set_addrmap(AS_IO, &px4_state::px4_io);
// video hardware
- MCFG_SCREEN_ADD("screen", LCD)
- MCFG_SCREEN_REFRESH_RATE(72)
- MCFG_SCREEN_SIZE(240, 64)
- MCFG_SCREEN_VISIBLE_AREA(0, 239, 0, 63)
- MCFG_SCREEN_UPDATE_DRIVER(px4_state, screen_update_px4)
- MCFG_SCREEN_PALETTE("palette")
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_LCD));
+ screen.set_refresh_hz(72);
+ screen.set_size(240, 64);
+ screen.set_visarea(0, 239, 0, 63);
+ screen.set_screen_update(FUNC(px4_state::screen_update_px4));
+ screen.set_palette("palette");
config.set_default_layout(layout_px4);
@@ -1507,30 +1508,31 @@ MACHINE_CONFIG_START(px4_state::px4)
SPEAKER(config, "mono").front_center();
SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 1.0);
- MCFG_TIMER_DRIVER_ADD_PERIODIC("one_sec", px4_state, upd7508_1sec_callback, attotime::from_seconds(1))
- MCFG_TIMER_DRIVER_ADD_PERIODIC("frc", px4_state, frc_tick, attotime::from_hz(XTAL(7'372'800) / 2 / 6))
+ TIMER(config, "one_sec").configure_periodic(FUNC(px4_state::upd7508_1sec_callback), attotime::from_seconds(1));
+ TIMER(config, "frc").configure_periodic(FUNC(px4_state::frc_tick), attotime::from_hz(XTAL(7'372'800) / 2 / 6));
// internal ram
RAM(config, RAM_TAG).set_default_size("64K");
NVRAM(config, "nvram", nvram_device::DEFAULT_NONE);
// centronics printer
- MCFG_DEVICE_ADD(m_centronics, CENTRONICS, centronics_devices, "printer")
- MCFG_CENTRONICS_BUSY_HANDLER(WRITELINE(*this, px4_state, centronics_busy_w))
- MCFG_CENTRONICS_PERROR_HANDLER(WRITELINE(*this, px4_state, centronics_perror_w))
+ CENTRONICS(config, m_centronics, centronics_devices, "printer");
+ m_centronics->busy_handler().set(FUNC(px4_state::centronics_busy_w));
+ m_centronics->perror_handler().set(FUNC(px4_state::centronics_perror_w));
- MCFG_CENTRONICS_OUTPUT_LATCH_ADD("cent_data_out", "centronics")
+ output_latch_device &latch(OUTPUT_LATCH(config, "cent_data_out"));
+ m_centronics->set_output_latch(latch);
// external cassette
- MCFG_CASSETTE_ADD("extcas")
- MCFG_CASSETTE_DEFAULT_STATE(CASSETTE_PLAY | CASSETTE_SPEAKER_ENABLED | CASSETTE_MOTOR_DISABLED)
+ CASSETTE(config, m_ext_cas);
+ m_ext_cas->set_default_state(CASSETTE_PLAY | CASSETTE_SPEAKER_ENABLED | CASSETTE_MOTOR_DISABLED);
- MCFG_TIMER_DRIVER_ADD("extcas_timer", px4_state, ext_cassette_read)
+ TIMER(config, m_ext_cas_timer).configure_generic(FUNC(px4_state::ext_cassette_read));
// sio port
- MCFG_EPSON_SIO_ADD("sio", nullptr)
- MCFG_EPSON_SIO_RX(WRITELINE(*this, px4_state, sio_rx_w))
- MCFG_EPSON_SIO_PIN(WRITELINE(*this, px4_state, sio_pin_w))
+ EPSON_SIO(config, m_sio, nullptr);
+ m_sio->rx_callback().set(FUNC(px4_state::sio_rx_w));
+ m_sio->pin_callback().set(FUNC(px4_state::sio_pin_w));
// rs232 port
RS232_PORT(config, m_rs232, default_rs232_devices, nullptr);
@@ -1540,25 +1542,25 @@ MACHINE_CONFIG_START(px4_state::px4)
m_rs232->cts_handler().set(FUNC(px4_state::rs232_cts_w));
// rom capsules
- MCFG_GENERIC_CARTSLOT_ADD("capsule1", generic_plain_slot, "px4_cart")
- MCFG_GENERIC_CARTSLOT_ADD("capsule2", generic_plain_slot, "px4_cart")
+ GENERIC_CARTSLOT(config, m_caps1, generic_plain_slot, "px4_cart");
+ GENERIC_CARTSLOT(config, m_caps2, generic_plain_slot, "px4_cart");
// software list
- MCFG_SOFTWARE_LIST_ADD("cart_list", "px4_cart")
- MCFG_SOFTWARE_LIST_ADD("epson_cpm_list", "epson_cpm")
-MACHINE_CONFIG_END
+ SOFTWARE_LIST(config, "cart_list").set_original("px4_cart");
+ SOFTWARE_LIST(config, "epson_cpm_list").set_original("epson_cpm");
+}
-MACHINE_CONFIG_START(px4p_state::px4p)
+void px4p_state::px4p(machine_config &config)
+{
px4(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_IO_MAP(px4p_io)
+ m_z80->set_addrmap(AS_IO, &px4p_state::px4p_io);
NVRAM(config, "rdnvram", nvram_device::DEFAULT_ALL_0);
subdevice<palette_device>("palette")->set_init(FUNC(px4p_state::px4p_palette));
- MCFG_GENERIC_CARTSLOT_ADD("ramdisk_socket", generic_plain_slot, "px4_cart")
-MACHINE_CONFIG_END
+ GENERIC_CARTSLOT(config, m_rdsocket, generic_plain_slot, "px4_cart");
+}
//**************************************************************************
diff --git a/src/mame/drivers/px8.cpp b/src/mame/drivers/px8.cpp
index fdb96f8cb75..73e4213b248 100644
--- a/src/mame/drivers/px8.cpp
+++ b/src/mame/drivers/px8.cpp
@@ -737,59 +737,58 @@ void px8_state::machine_reset()
MACHINE DRIVERS
***************************************************************************/
-MACHINE_CONFIG_START(px8_state::px8)
+void px8_state::px8(machine_config &config)
+{
/* main cpu (uPD70008) */
- MCFG_DEVICE_ADD(UPD70008_TAG, Z80, XTAL_CR1 / 4) /* 2.45 MHz */
- MCFG_DEVICE_PROGRAM_MAP(px8_mem)
- MCFG_DEVICE_IO_MAP(px8_io)
+ Z80(config, m_maincpu, XTAL_CR1 / 4); /* 2.45 MHz */
+ m_maincpu->set_addrmap(AS_PROGRAM, &px8_state::px8_mem);
+ m_maincpu->set_addrmap(AS_IO, &px8_state::px8_io);
/* slave cpu (HD6303) */
- MCFG_DEVICE_ADD(HD6303_TAG, M6803, XTAL_CR1 / 4) /* 614 kHz */
- MCFG_DEVICE_PROGRAM_MAP(px8_slave_mem)
- MCFG_DEVICE_DISABLE()
+ m6803_cpu_device &slave(M6803(config, HD6303_TAG, XTAL_CR1 / 4)); /* 614 kHz */
+ slave.set_addrmap(AS_PROGRAM, &px8_state::px8_slave_mem);
+ slave.set_disable();
/* sub CPU (uPD7508) */
-// MCFG_DEVICE_ADD(UPD7508_TAG, UPD7508, 200000) /* 200 kHz */
-// MCFG_DEVICE_IO_MAP(px8_sub_io)
-// MCFG_DEVICE_DISABLE()
+// upd7508_device &sub(UPD7508(config, UPD7508_TAG, 200000)); /* 200 kHz */
+// sub.set_addrmap(AS_IO, &px8_state::px8_sub_io);
+// sub.set_disable();
/* video hardware */
config.set_default_layout(layout_px8);
- MCFG_SCREEN_ADD(SCREEN_TAG, LCD)
- MCFG_SCREEN_REFRESH_RATE(72)
- MCFG_SCREEN_UPDATE_DRIVER(px8_state, screen_update)
- MCFG_SCREEN_SIZE(480, 64)
- MCFG_SCREEN_VISIBLE_AREA(0, 479, 0, 63)
- MCFG_SCREEN_PALETTE("palette")
+ screen_device &screen(SCREEN(config, SCREEN_TAG, SCREEN_TYPE_LCD));
+ screen.set_refresh_hz(72);
+ screen.set_screen_update(FUNC(px8_state::screen_update));
+ screen.set_size(480, 64);
+ screen.set_visarea(0, 479, 0, 63);
+ screen.set_palette("palette");
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_px8)
+ GFXDECODE(config, "gfxdecode", "palette", gfx_px8);
PALETTE(config, "palette", FUNC(px8_state::px8_palette), 2);
/* sound hardware */
SPEAKER(config, "mono").front_center();
- WAVE(config, "wave", "cassette").add_route(0, "mono", 0.25);
+ WAVE(config, "wave", m_cassette).add_route(0, "mono", 0.25);
/* cartridge */
- MCFG_GENERIC_CARTSLOT_ADD("capsule1", generic_plain_slot, "px8_cart")
- MCFG_GENERIC_EXTENSIONS("bin,rom")
+ GENERIC_CARTSLOT(config, "capsule1", generic_plain_slot, "px8_cart", "bin,rom");
- MCFG_GENERIC_CARTSLOT_ADD("capsule2", generic_plain_slot, "px8_cart")
- MCFG_GENERIC_EXTENSIONS("bin,rom")
+ GENERIC_CARTSLOT(config, "capsule2", generic_plain_slot, "px8_cart", "bin,rom");
/* devices */
- MCFG_DEVICE_ADD(I8251_TAG, I8251, 0)
+ I8251(config, I8251_TAG, 0);
- MCFG_CASSETTE_ADD("cassette")
- MCFG_CASSETTE_DEFAULT_STATE(CASSETTE_STOPPED | CASSETTE_MOTOR_DISABLED | CASSETTE_SPEAKER_ENABLED)
+ CASSETTE(config, m_cassette);
+ m_cassette->set_default_state(CASSETTE_STOPPED | CASSETTE_MOTOR_DISABLED | CASSETTE_SPEAKER_ENABLED);
/* internal ram */
RAM(config, RAM_TAG).set_default_size("64K");
// software
- MCFG_SOFTWARE_LIST_ADD("cart_list", "px8_cart")
- MCFG_SOFTWARE_LIST_ADD("epson_cpm_list", "epson_cpm")
-MACHINE_CONFIG_END
+ SOFTWARE_LIST(config, "cart_list").set_original("px8_cart");
+ SOFTWARE_LIST(config, "epson_cpm_list").set_original("epson_cpm");
+}
/***************************************************************************
ROMS
diff --git a/src/mame/drivers/pyl601.cpp b/src/mame/drivers/pyl601.cpp
index 13c06294886..5a16c67a810 100644
--- a/src/mame/drivers/pyl601.cpp
+++ b/src/mame/drivers/pyl601.cpp
@@ -544,52 +544,53 @@ static GFXDECODE_START( gfx_pyl601a )
GFXDECODE_ENTRY( "chargen", 0x0000, pyl601a_charlayout, 0, 1 )
GFXDECODE_END
-MACHINE_CONFIG_START(pyl601_state::pyl601)
+void pyl601_state::pyl601(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu",M6800, XTAL(1'000'000))
- MCFG_DEVICE_PROGRAM_MAP(pyl601_mem)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", pyl601_state, pyl601_interrupt)
+ M6800(config, m_maincpu, 1_MHz_XTAL);
+ m_maincpu->set_addrmap(AS_PROGRAM, &pyl601_state::pyl601_mem);
+ m_maincpu->set_vblank_int("screen", FUNC(pyl601_state::pyl601_interrupt));
/* video hardware */
- MCFG_SCREEN_ADD_MONOCHROME("screen", RASTER, rgb_t::green())
- MCFG_SCREEN_REFRESH_RATE(50)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */
- MCFG_SCREEN_SIZE(640, 200)
- MCFG_SCREEN_VISIBLE_AREA(0, 640 - 1, 0, 200 - 1)
- MCFG_SCREEN_UPDATE_DEVICE("crtc", mc6845_device, screen_update)
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_pyl601)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER, rgb_t::green()));
+ screen.set_refresh_hz(50);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */
+ screen.set_size(640, 200);
+ screen.set_visarea(0, 640 - 1, 0, 200 - 1);
+ screen.set_screen_update("crtc", FUNC(mc6845_device::screen_update));
+ GFXDECODE(config, "gfxdecode", m_palette, gfx_pyl601);
PALETTE(config, m_palette, palette_device::MONOCHROME);
/* sound hardware */
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("speaker", SPEAKER_SOUND)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.50)
+ SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.50);
/* Devices */
- mc6845_device &crtc(MC6845(config, "crtc", XTAL(2'000'000)));
+ mc6845_device &crtc(MC6845(config, "crtc", 2_MHz_XTAL));
crtc.set_screen("screen");
crtc.set_show_border_area(false);
crtc.set_char_width(8); /* ? */
crtc.set_update_row_callback(FUNC(pyl601_state::pyl601_update_row), this);
UPD765A(config, m_fdc, 8'000'000, true, true);
- MCFG_FLOPPY_DRIVE_ADD("upd765:0", pyl601_floppies, "525hd", pyl601_state::floppy_formats)
- MCFG_FLOPPY_DRIVE_ADD("upd765:1", pyl601_floppies, "525hd", pyl601_state::floppy_formats)
- MCFG_SOFTWARE_LIST_ADD("flop_list","pyl601")
+ FLOPPY_CONNECTOR(config, "upd765:0", pyl601_floppies, "525hd", pyl601_state::floppy_formats);
+ FLOPPY_CONNECTOR(config, "upd765:1", pyl601_floppies, "525hd", pyl601_state::floppy_formats);
+ SOFTWARE_LIST(config, "flop_list").set_original("pyl601");
/* internal ram */
RAM(config, RAM_TAG).set_default_size("576K"); // 64 + 512
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(pyl601_state::pyl601a)
+void pyl601_state::pyl601a(machine_config &config)
+{
pyl601(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_CLOCK( XTAL(2'000'000))
- MCFG_GFXDECODE_MODIFY("gfxdecode", gfx_pyl601a)
+ m_maincpu->set_clock(2_MHz_XTAL);
+
+ subdevice<gfxdecode_device>("gfxdecode")->set_info(gfx_pyl601a);
subdevice<mc6845_device>("crtc")->set_update_row_callback(FUNC(pyl601_state::pyl601a_update_row), this);
-MACHINE_CONFIG_END
+}
/* ROM definition */
ROM_START( pyl601 )
diff --git a/src/mame/drivers/pzletime.cpp b/src/mame/drivers/pzletime.cpp
index 53a3015f514..0366ad0a56d 100644
--- a/src/mame/drivers/pzletime.cpp
+++ b/src/mame/drivers/pzletime.cpp
@@ -334,21 +334,21 @@ void pzletime_state::machine_reset()
m_ticket = 0;
}
-MACHINE_CONFIG_START(pzletime_state::pzletime)
-
+void pzletime_state::pzletime(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu",M68000,10000000)
- MCFG_DEVICE_PROGRAM_MAP(pzletime_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", pzletime_state, irq4_line_hold)
+ M68000(config, m_maincpu, 10000000);
+ m_maincpu->set_addrmap(AS_PROGRAM, &pzletime_state::pzletime_map);
+ m_maincpu->set_vblank_int("screen", FUNC(pzletime_state::irq4_line_hold));
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */)
- MCFG_SCREEN_SIZE(64*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 48*8-1, 0*8, 28*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(pzletime_state, screen_update_pzletime)
- MCFG_SCREEN_PALETTE(m_palette)
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_refresh_hz(60);
+ m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(2500) /* not accurate */);
+ m_screen->set_size(64*8, 32*8);
+ m_screen->set_visarea(0*8, 48*8-1, 0*8, 28*8-1);
+ m_screen->set_screen_update(FUNC(pzletime_state::screen_update_pzletime));
+ m_screen->set_palette(m_palette);
GFXDECODE(config, m_gfxdecode, m_palette, gfx_pzletime);
PALETTE(config, m_palette, FUNC(pzletime_state::pzletime_palette));
@@ -360,7 +360,7 @@ MACHINE_CONFIG_START(pzletime_state::pzletime)
SPEAKER(config, "mono").front_center();
OKIM6295(config, m_oki, 937500, okim6295_device::PIN7_HIGH); //freq & pin7 taken from stlforce
m_oki->add_route(ALL_OUTPUTS, "mono", 1.0);
-MACHINE_CONFIG_END
+}
/***************************************************************************
diff --git a/src/mame/drivers/ql.cpp b/src/mame/drivers/ql.cpp
index 080bf1d724a..d7c00923d23 100644
--- a/src/mame/drivers/ql.cpp
+++ b/src/mame/drivers/ql.cpp
@@ -254,15 +254,15 @@ READ8_MEMBER( ql_state::read )
}
if (m_qimi_enabled)
{
- data = m_qimi->read(space, offset, data);
+ data = m_qimi->read(offset, data);
}
m_cart->romoeh_w(cart_romoeh);
- data = m_cart->read(space, offset & 0x7fff, data);
+ data = m_cart->read(offset & 0x7fff, data);
m_cart->romoeh_w(0);
m_exp->romoeh_w(exp_romoeh);
- data = m_exp->read(space, offset, data);
+ data = m_exp->read(offset, data);
m_exp->romoeh_w(0);
return data;
@@ -309,14 +309,14 @@ WRITE8_MEMBER( ql_state::write )
}
if (m_qimi_enabled)
{
- m_qimi->write(space, offset, data);
+ m_qimi->write(offset, data);
}
m_cart->romoeh_w(0);
- m_cart->write(space, offset & 0x7fff, data);
+ m_cart->write(offset & 0x7fff, data);
m_exp->romoeh_w(0);
- m_exp->write(space, offset, data);
+ m_exp->write(offset, data);
}
@@ -895,13 +895,14 @@ void ql_state::machine_reset()
//**************************************************************************
//-------------------------------------------------
-// MACHINE_CONFIG( ql )
+// machine_config( ql )
//-------------------------------------------------
-MACHINE_CONFIG_START(ql_state::ql)
+void ql_state::ql(machine_config &config)
+{
// basic machine hardware
- MCFG_DEVICE_ADD(m_maincpu, M68008, X1/2)
- MCFG_DEVICE_PROGRAM_MAP(ql_mem)
+ M68008(config, m_maincpu, X1/2);
+ m_maincpu->set_addrmap(AS_PROGRAM, &ql_state::ql_mem);
I8749(config, m_ipc, X4);
m_ipc->set_addrmap(AS_IO, &ql_state::ipc_io);
@@ -912,17 +913,16 @@ MACHINE_CONFIG_START(ql_state::ql)
m_ipc->bus_in_cb().set(FUNC(ql_state::ipc_bus_r));
// video hardware
- MCFG_SCREEN_ADD(SCREEN_TAG, RASTER)
- MCFG_SCREEN_REFRESH_RATE(50.08)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) // not accurate
- MCFG_SCREEN_UPDATE_DEVICE(ZX8301_TAG, zx8301_device, screen_update)
- MCFG_SCREEN_SIZE(960, 312)
- MCFG_SCREEN_VISIBLE_AREA(0, 512-1, 0, 256-1)
+ screen_device &screen(SCREEN(config, SCREEN_TAG, SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(50.08);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500)); // not accurate
+ screen.set_screen_update(ZX8301_TAG, FUNC(zx8301_device::screen_update));
+ screen.set_size(960, 312);
+ screen.set_visarea(0, 512-1, 0, 256-1);
// sound hardware
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("speaker", SPEAKER_SOUND)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25)
+ SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25);
// devices
ZX8301(config, m_zx8301, X1, m_maincpu);
@@ -954,43 +954,44 @@ MACHINE_CONFIG_START(ql_state::ql)
RS232_PORT(config, m_ser2, default_rs232_devices, nullptr); // wired as DTE
m_ser2->cts_handler().set(m_zx8302, FUNC(zx8302_device::write_cts2));
- MCFG_DEVICE_ADD("exp", QL_EXPANSION_SLOT, 0, ql_expansion_cards, nullptr) // FIXME: what's the clock on the slot?
- //MCFG_QL_EXPANSION_SLOT_IPL0L_CALLBACK()
- //MCFG_QL_EXPANSION_SLOT_IPL1L_CALLBACK()
- //MCFG_QL_EXPANSION_SLOT_BERRL_CALLBACK()
- MCFG_QL_EXPANSION_SLOT_EXTINTL_CALLBACK(WRITELINE(*this, ql_state, exp_extintl_w))
+ QL_EXPANSION_SLOT(config, m_exp, 0, ql_expansion_cards, nullptr); // FIXME: what's the clock on the slot?
+ //m_exp->ipl0l_wr_callback().set();
+ //m_exp->ipl1l_wr_callback().set();(
+ //m_exp->berrl_wr_callback().set();
+ m_exp->extintl_wr_callback().set(FUNC(ql_state::exp_extintl_w));
- MCFG_DEVICE_ADD("rom", QL_ROM_CARTRIDGE_SLOT, ql_rom_cartridge_cards, nullptr)
+ QL_ROM_CARTRIDGE_SLOT(config, m_cart, ql_rom_cartridge_cards, nullptr);
QIMI(config, m_qimi, 0);
m_qimi->extint_wr_callback().set(FUNC(ql_state::qimi_extintl_w));
// software lists
- MCFG_SOFTWARE_LIST_ADD("cart_list", "ql_cart")
- MCFG_SOFTWARE_LIST_ADD("cass_list", "ql_cass")
- MCFG_SOFTWARE_LIST_ADD("flop_list", "ql_flop")
+ SOFTWARE_LIST(config, "cart_list").set_original("ql_cart");
+ SOFTWARE_LIST(config, "cass_list").set_original("ql_cass");
+ SOFTWARE_LIST(config, "flop_list").set_original("ql_flop");
// internal ram
RAM(config, m_ram).set_default_size("128K");
-MACHINE_CONFIG_END
+}
//-------------------------------------------------
-// MACHINE_CONFIG( ql_ntsc )
+// machine_config( ql_ntsc )
//-------------------------------------------------
-MACHINE_CONFIG_START(ql_state::ql_ntsc)
+void ql_state::ql_ntsc(machine_config &config)
+{
ql(config);
// video hardware
- MCFG_SCREEN_MODIFY(SCREEN_TAG)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_SIZE(960, 262)
- MCFG_SCREEN_VISIBLE_AREA(0, 512-1, 0, 256-1)
-MACHINE_CONFIG_END
+ screen_device &screen(*subdevice<screen_device>(SCREEN_TAG));
+ screen.set_refresh_hz(60);
+ screen.set_size(960, 262);
+ screen.set_visarea(0, 512-1, 0, 256-1);
+ }
//-------------------------------------------------
-// MACHINE_CONFIG( opd )
+// machine_config( opd )
//-------------------------------------------------
void ql_state::opd(machine_config &config)
@@ -1003,7 +1004,7 @@ void ql_state::opd(machine_config &config)
/*
//-------------------------------------------------
-// MACHINE_CONFIG( megaopd )
+// machine_config( megaopd )
//-------------------------------------------------
void ql_state::megaopd(machine_config &config)
diff --git a/src/mame/drivers/quakeat.cpp b/src/mame/drivers/quakeat.cpp
index e7738bcf74d..5b575462c74 100644
--- a/src/mame/drivers/quakeat.cpp
+++ b/src/mame/drivers/quakeat.cpp
@@ -124,27 +124,27 @@ void quakeat_state::machine_start()
}
/*************************************************************/
-MACHINE_CONFIG_START(quakeat_state::quake)
+void quakeat_state::quake(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", PENTIUM2, 233000000) /* Pentium II, 233MHz */
- MCFG_DEVICE_PROGRAM_MAP(quake_map)
- MCFG_DEVICE_IO_MAP(quake_io)
- MCFG_DEVICE_IRQ_ACKNOWLEDGE_DEVICE("pic8259_1", pic8259_device, inta_cb)
+ PENTIUM2(config, m_maincpu, 233000000); /* Pentium II, 233MHz */
+ m_maincpu->set_addrmap(AS_PROGRAM, &quakeat_state::quake_map);
+ m_maincpu->set_addrmap(AS_IO, &quakeat_state::quake_io);
+ m_maincpu->set_irq_acknowledge_callback("pic8259_1", FUNC(pic8259_device::inta_cb));
pcat_common(config);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(64*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 64*8-1, 0*8, 32*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(quakeat_state, screen_update_quake)
- MCFG_SCREEN_PALETTE("palette")
-
- MCFG_PALETTE_ADD("palette", 0x100)
-
-MACHINE_CONFIG_END
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(64*8, 32*8);
+ screen.set_visarea(0*8, 64*8-1, 0*8, 32*8-1);
+ screen.set_screen_update(FUNC(quakeat_state::screen_update_quake));
+ screen.set_palette("palette");
+
+ PALETTE(config, "palette").set_entries(0x100);
+}
ROM_START(quake)
diff --git a/src/mame/drivers/quasar.cpp b/src/mame/drivers/quasar.cpp
index d52d2abefa1..3edcfd88703 100644
--- a/src/mame/drivers/quasar.cpp
+++ b/src/mame/drivers/quasar.cpp
@@ -343,7 +343,6 @@ void quasar_state::quasar(machine_config &config)
SPEAKER(config, "speaker").front_center();
DAC_8BIT_R2R(config, "dac", 0).add_route(ALL_OUTPUTS, "speaker", 1.0); // unknown DAC
voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref", 0));
- vref.set_output(5.0);
vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT);
vref.add_route(0, "dac", -1.0, DAC_VREF_NEG_INPUT);
}
diff --git a/src/mame/drivers/queen.cpp b/src/mame/drivers/queen.cpp
index ff1e9cf2af0..2d4e875db57 100644
--- a/src/mame/drivers/queen.cpp
+++ b/src/mame/drivers/queen.cpp
@@ -283,10 +283,10 @@ void queen_state::machine_reset()
MACHINE_CONFIG_START(queen_state::queen)
- MCFG_DEVICE_ADD("maincpu", PENTIUM3, 533000000/16) // Celeron or Pentium 3, 533 Mhz
- MCFG_DEVICE_PROGRAM_MAP(queen_map)
- MCFG_DEVICE_IO_MAP(queen_io)
- MCFG_DEVICE_IRQ_ACKNOWLEDGE_DEVICE("pic8259_1", pic8259_device, inta_cb)
+ PENTIUM3(config, m_maincpu, 533000000/16); // Celeron or Pentium 3, 533 Mhz
+ m_maincpu->set_addrmap(AS_PROGRAM, &queen_state::queen_map);
+ m_maincpu->set_addrmap(AS_IO, &queen_state::queen_io);
+ m_maincpu->set_irq_acknowledge_callback("pic8259_1", FUNC(pic8259_device::inta_cb));
pcat_common(config);
diff --git a/src/mame/drivers/quickpick5.cpp b/src/mame/drivers/quickpick5.cpp
index a71f39a66c9..597dc1de381 100644
--- a/src/mame/drivers/quickpick5.cpp
+++ b/src/mame/drivers/quickpick5.cpp
@@ -119,11 +119,11 @@ READ8_MEMBER(quickpick5_state::vram_r)
offset |= 0x800;
if ((offset >= 0x800) && (offset <= 0x880))
{
- return m_k051649->k051649_waveform_r(space, offset & 0x7f);
+ return m_k051649->k051649_waveform_r(offset & 0x7f);
}
else if ((offset >= 0x8e0) && (offset <= 0x8ff))
{
- return m_k051649->k051649_test_r(space, offset-0x8e0);
+ return m_k051649->k051649_test_r();
}
}
@@ -143,26 +143,26 @@ WRITE8_MEMBER(quickpick5_state::vram_w)
offset |= 0x800;
if ((offset >= 0x800) && (offset < 0x880))
{
- m_k051649->k051649_waveform_w(space, offset-0x800, data);
+ m_k051649->k051649_waveform_w(offset-0x800, data);
return;
}
else if (offset < 0x88a)
{
- m_k051649->k051649_frequency_w(space, offset-0x880, data);
+ m_k051649->k051649_frequency_w(offset-0x880, data);
return;
}
else if (offset < 0x88f)
{
- m_k051649->k051649_volume_w(space, offset-0x88a, data);
+ m_k051649->k051649_volume_w(offset-0x88a, data);
return;
}
else if (offset < 0x890)
{
- m_k051649->k051649_keyonoff_w(space, 0, data);
+ m_k051649->k051649_keyonoff_w(data);
return;
}
- m_k051649->k051649_test_w(space, offset-0x8e0, data);
+ m_k051649->k051649_test_w(data);
return;
}
diff --git a/src/mame/drivers/quizdna.cpp b/src/mame/drivers/quizdna.cpp
index eb46cf5ba49..f4ed0324cc1 100644
--- a/src/mame/drivers/quizdna.cpp
+++ b/src/mame/drivers/quizdna.cpp
@@ -440,25 +440,25 @@ void quizdna_state::machine_start()
}
-MACHINE_CONFIG_START(quizdna_state::quizdna)
-
+void quizdna_state::quizdna(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, MCLK/2) /* 8.000 MHz */
- MCFG_DEVICE_PROGRAM_MAP(quizdna_map)
- MCFG_DEVICE_IO_MAP(quizdna_io_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", quizdna_state, irq0_line_hold)
+ Z80(config, m_maincpu, MCLK/2); /* 8.000 MHz */
+ m_maincpu->set_addrmap(AS_PROGRAM, &quizdna_state::quizdna_map);
+ m_maincpu->set_addrmap(AS_IO, &quizdna_state::quizdna_io_map);
+ m_maincpu->set_vblank_int("screen", FUNC(quizdna_state::irq0_line_hold));
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */)
- MCFG_SCREEN_SIZE(64*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(8*8, 56*8-1, 2*8, 30*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(quizdna_state, screen_update)
- MCFG_SCREEN_PALETTE("palette")
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500) /* not accurate */);
+ screen.set_size(64*8, 32*8);
+ screen.set_visarea(8*8, 56*8-1, 2*8, 30*8-1);
+ screen.set_screen_update(FUNC(quizdna_state::screen_update));
+ screen.set_palette(m_palette);
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_quizdna)
- MCFG_PALETTE_ADD("palette", 2048)
+ GFXDECODE(config, m_gfxdecode, m_palette, gfx_quizdna);
+ PALETTE(config, m_palette).set_entries(2048);
/* sound hardware */
@@ -472,30 +472,27 @@ MACHINE_CONFIG_START(quizdna_state::quizdna)
ymsnd.add_route(2, "mono", 0.10);
ymsnd.add_route(3, "mono", 0.40);
- MCFG_DEVICE_ADD("oki", OKIM6295, (MCLK/1024)*132, okim6295_device::PIN7_HIGH) // clock frequency & pin 7 not verified
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.30)
-MACHINE_CONFIG_END
+ OKIM6295(config, "oki", (MCLK/1024)*132, okim6295_device::PIN7_HIGH).add_route(ALL_OUTPUTS, "mono", 0.30); // clock frequency & pin 7 not verified
+}
-MACHINE_CONFIG_START(quizdna_state::gakupara)
+void quizdna_state::gakupara(machine_config &config)
+{
quizdna(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_IO_MAP(gakupara_io_map)
-
-MACHINE_CONFIG_END
+ m_maincpu->set_addrmap(AS_IO, &quizdna_state::gakupara_io_map);
+}
-MACHINE_CONFIG_START(quizdna_state::gekiretu)
+void quizdna_state::gekiretu(machine_config &config)
+{
quizdna(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(gekiretu_map)
- MCFG_DEVICE_IO_MAP(gekiretu_io_map)
-
-MACHINE_CONFIG_END
+ m_maincpu->set_addrmap(AS_PROGRAM, &quizdna_state::gekiretu_map);
+ m_maincpu->set_addrmap(AS_IO, &quizdna_state::gekiretu_io_map);
+}
/****************************************************************************/
diff --git a/src/mame/drivers/quizo.cpp b/src/mame/drivers/quizo.cpp
index 25843af8f95..4ff533680ee 100644
--- a/src/mame/drivers/quizo.cpp
+++ b/src/mame/drivers/quizo.cpp
@@ -217,29 +217,29 @@ static INPUT_PORTS_START( quizo )
PORT_DIPSETTING( 0x80, DEF_STR( On ) )
INPUT_PORTS_END
-MACHINE_CONFIG_START(quizo_state::quizo)
+void quizo_state::quizo(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80,XTAL1/2)
- MCFG_DEVICE_PROGRAM_MAP(memmap)
- MCFG_DEVICE_IO_MAP(portmap)
-
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", quizo_state, irq0_line_hold)
+ Z80(config, m_maincpu, XTAL1/2);
+ m_maincpu->set_addrmap(AS_PROGRAM, &quizo_state::memmap);
+ m_maincpu->set_addrmap(AS_IO, &quizo_state::portmap);
+ m_maincpu->set_vblank_int("screen", FUNC(quizo_state::irq0_line_hold));
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(320, 200)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 320-1, 0*8, 200-1)
- MCFG_SCREEN_UPDATE_DRIVER(quizo_state, screen_update)
- MCFG_SCREEN_PALETTE("palette")
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(320, 200);
+ screen.set_visarea(0*8, 320-1, 0*8, 200-1);
+ screen.set_screen_update(FUNC(quizo_state::screen_update));
+ screen.set_palette("palette");
PALETTE(config, "palette", FUNC(quizo_state::quizo_palette), 16);
/* sound hardware */
SPEAKER(config, "mono").front_center();
AY8910(config, "aysnd", XTAL2 / 16).add_route(ALL_OUTPUTS, "mono", 1.0);
-MACHINE_CONFIG_END
+}
ROM_START( quizo )
diff --git a/src/mame/drivers/quizpani.cpp b/src/mame/drivers/quizpani.cpp
index 2e694e4cfeb..d9431d663ff 100644
--- a/src/mame/drivers/quizpani.cpp
+++ b/src/mame/drivers/quizpani.cpp
@@ -195,32 +195,31 @@ static GFXDECODE_START( gfx_quizpani )
GFXDECODE_END
-MACHINE_CONFIG_START(quizpani_state::quizpani)
- MCFG_DEVICE_ADD("maincpu", M68000, 10000000)
- MCFG_DEVICE_PROGRAM_MAP(quizpani_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", quizpani_state, irq4_line_hold)
- MCFG_DEVICE_PERIODIC_INT_DRIVER(quizpani_state, irq1_line_hold, 164) // music tempo
+void quizpani_state::quizpani(machine_config &config)
+{
+ M68000(config, m_maincpu, 10000000);
+ m_maincpu->set_addrmap(AS_PROGRAM, &quizpani_state::quizpani_map);
+ m_maincpu->set_vblank_int("screen", FUNC(quizpani_state::irq4_line_hold));
+ m_maincpu->set_periodic_int(FUNC(quizpani_state::irq1_line_hold), attotime::from_hz(164)); // music tempo
GFXDECODE(config, m_gfxdecode, "palette", gfx_quizpani);
PALETTE(config, "palette").set_format(palette_device::RRRRGGGGBBBBRGBx, 0x200);
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(64*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 48*8-1, 0*8, 28*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(quizpani_state, screen_update)
- MCFG_SCREEN_PALETTE("palette")
-
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(64*8, 32*8);
+ screen.set_visarea(0*8, 48*8-1, 0*8, 28*8-1);
+ screen.set_screen_update(FUNC(quizpani_state::screen_update));
+ screen.set_palette("palette");
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("oki", OKIM6295, 16000000/4, okim6295_device::PIN7_LOW)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
+ OKIM6295(config, "oki", 16000000/4, okim6295_device::PIN7_LOW).add_route(ALL_OUTPUTS, "mono", 1.0);
nmk112_device &nmk112(NMK112(config, "nmk112", 0));
nmk112.set_rom0_tag("oki");
-MACHINE_CONFIG_END
+}
ROM_START( quizpani )
ROM_REGION( 0x340000, "maincpu", 0 ) /* 68000 Code */
diff --git a/src/mame/drivers/quizshow.cpp b/src/mame/drivers/quizshow.cpp
index 1cada31386d..c71362a31ff 100644
--- a/src/mame/drivers/quizshow.cpp
+++ b/src/mame/drivers/quizshow.cpp
@@ -414,7 +414,6 @@ void quizshow_state::quizshow(machine_config &config)
DAC_1BIT(config, m_dac, 0).add_route(ALL_OUTPUTS, "speaker", 0.25);
voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref", 0));
- vref.set_output(5.0);
vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT);
}
diff --git a/src/mame/drivers/qvt201.cpp b/src/mame/drivers/qvt201.cpp
index 13c232924db..660628f8057 100644
--- a/src/mame/drivers/qvt201.cpp
+++ b/src/mame/drivers/qvt201.cpp
@@ -99,9 +99,10 @@ void qvt201_state::mem_map(address_map &map)
static INPUT_PORTS_START( qvt201 )
INPUT_PORTS_END
-MACHINE_CONFIG_START(qvt201_state::qvt201)
- MCFG_DEVICE_ADD("maincpu", Z80, 3.6864_MHz_XTAL)
- MCFG_DEVICE_PROGRAM_MAP(mem_map) // IORQ is not used at all
+void qvt201_state::qvt201(machine_config &config)
+{
+ Z80(config, m_maincpu, 3.6864_MHz_XTAL);
+ m_maincpu->set_addrmap(AS_PROGRAM, &qvt201_state::mem_map); // IORQ is not used at all
input_merger_device &mainint(INPUT_MERGER_ANY_HIGH(config, "mainint")); // open collector
mainint.output_handler().set_inputline("maincpu", INPUT_LINE_IRQ0);
@@ -109,11 +110,11 @@ MACHINE_CONFIG_START(qvt201_state::qvt201)
input_merger_device &mainnmi(INPUT_MERGER_ALL_HIGH(config, "mainnmi"));
mainnmi.output_handler().set_inputline("maincpu", INPUT_LINE_NMI);
- MCFG_DEVICE_ADD("duart", SCN2681, 3.6864_MHz_XTAL) // XTAL not directly connected
- MCFG_MC68681_IRQ_CALLBACK(WRITELINE("mainint", input_merger_device, in_w<1>))
- MCFG_MC68681_A_TX_CALLBACK(WRITELINE(m_eia, rs232_port_device, write_txd))
- MCFG_MC68681_B_TX_CALLBACK(WRITELINE("aux", rs232_port_device, write_txd))
- MCFG_MC68681_OUTPORT_CALLBACK(WRITE8(*this, qvt201_state, duart_out_w))
+ scn2681_device &duart(SCN2681(config, "duart", 3.6864_MHz_XTAL)); // XTAL not directly connected
+ duart.irq_cb().set("mainint", FUNC(input_merger_device::in_w<1>));
+ duart.a_tx_cb().set(m_eia, FUNC(rs232_port_device::write_txd));
+ duart.b_tx_cb().set("aux", FUNC(rs232_port_device::write_txd));
+ duart.outport_cb().set(FUNC(qvt201_state::duart_out_w));
RS232_PORT(config, m_eia, default_rs232_devices, nullptr);
m_eia->rxd_handler().set("duart", FUNC(scn2681_device::rx_a_w));
@@ -134,7 +135,7 @@ MACHINE_CONFIG_START(qvt201_state::qvt201)
crtc.intr_callback().set("mainint", FUNC(input_merger_device::in_w<0>));
crtc.breq_callback().set("mainnmi", FUNC(input_merger_device::in_w<0>));
crtc.set_screen("screen");
-MACHINE_CONFIG_END
+}
/**************************************************************************************************************
diff --git a/src/mame/drivers/qvt70.cpp b/src/mame/drivers/qvt70.cpp
index 28843e0e806..1af2ab9274d 100644
--- a/src/mame/drivers/qvt70.cpp
+++ b/src/mame/drivers/qvt70.cpp
@@ -32,10 +32,11 @@ void qvt70_state::mem_map(address_map &map)
static INPUT_PORTS_START( qvt70 )
INPUT_PORTS_END
-MACHINE_CONFIG_START(qvt70_state::qvt70)
- MCFG_DEVICE_ADD("maincpu", Z80, 2'000'000)
- MCFG_DEVICE_PROGRAM_MAP(mem_map)
-MACHINE_CONFIG_END
+void qvt70_state::qvt70(machine_config &config)
+{
+ Z80(config, m_maincpu, 2'000'000);
+ m_maincpu->set_addrmap(AS_PROGRAM, &qvt70_state::mem_map);
+}
/**************************************************************************************************************
diff --git a/src/mame/drivers/qx10.cpp b/src/mame/drivers/qx10.cpp
index d391bf7047e..7a90afdfec6 100644
--- a/src/mame/drivers/qx10.cpp
+++ b/src/mame/drivers/qx10.cpp
@@ -471,12 +471,12 @@ WRITE8_MEMBER(qx10_state::memory_write_byte)
WRITE8_MEMBER(qx10_state::mc146818_w)
{
- m_rtc->write(space, !offset, data);
+ m_rtc->write(!offset, data);
}
READ8_MEMBER(qx10_state::mc146818_r)
{
- return m_rtc->read(space, !offset);
+ return m_rtc->read(!offset);
}
WRITE_LINE_MEMBER(qx10_state::keyboard_irq)
@@ -723,10 +723,10 @@ static void keyboard(device_slot_interface &device)
MACHINE_CONFIG_START(qx10_state::qx10)
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu",Z80, MAIN_CLK / 4)
- MCFG_DEVICE_PROGRAM_MAP(qx10_mem)
- MCFG_DEVICE_IO_MAP(qx10_io)
- MCFG_DEVICE_IRQ_ACKNOWLEDGE_DEVICE("pic8259_master", pic8259_device, inta_cb)
+ Z80(config, m_maincpu, MAIN_CLK / 4);
+ m_maincpu->set_addrmap(AS_PROGRAM, &qx10_state::qx10_mem);
+ m_maincpu->set_addrmap(AS_IO, &qx10_state::qx10_io);
+ m_maincpu->set_irq_acknowledge_callback("pic8259_master", FUNC(pic8259_device::inta_cb));
/* video hardware */
SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
@@ -735,7 +735,7 @@ MACHINE_CONFIG_START(qx10_state::qx10)
m_screen->set_screen_update(FUNC(qx10_state::screen_update));
m_screen->set_size(640, 480);
m_screen->set_visarea(0, 640-1, 0, 480-1);
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, m_palette, gfx_qx10)
+ GFXDECODE(config, "gfxdecode", m_palette, gfx_qx10);
PALETTE(config, m_palette, FUNC(qx10_state::qx10_palette), 8);
/* Devices */
@@ -801,8 +801,8 @@ MACHINE_CONFIG_START(qx10_state::qx10)
UPD7220(config, m_hgdc, MAIN_CLK/6); // unk clock
m_hgdc->set_addrmap(0, &qx10_state::upd7220_map);
- m_hgdc->set_display_pixels_callback(FUNC(qx10_state::hgdc_display_pixels), this);
- m_hgdc->set_draw_text_callback(FUNC(qx10_state::hgdc_draw_text), this);
+ m_hgdc->set_display_pixels(FUNC(qx10_state::hgdc_display_pixels));
+ m_hgdc->set_draw_text(FUNC(qx10_state::hgdc_draw_text));
m_hgdc->set_screen("screen");
MC146818(config, m_rtc, 32.768_kHz_XTAL);
@@ -824,9 +824,9 @@ MACHINE_CONFIG_START(qx10_state::qx10)
RAM(config, RAM_TAG).set_default_size("256K");
// software lists
- MCFG_SOFTWARE_LIST_ADD("flop_list", "qx10_flop")
+ SOFTWARE_LIST(config, "flop_list").set_original("qx10_flop");
- MCFG_QUICKLOAD_ADD("quickload", qx10_state, qx10, "com,cpm", 3)
+ MCFG_QUICKLOAD_ADD("quickload", qx10_state, qx10, "com,cpm", attotime::from_seconds(3))
MACHINE_CONFIG_END
diff --git a/src/mame/drivers/r2dtank.cpp b/src/mame/drivers/r2dtank.cpp
index 7714c7d9f44..dff5a7cfa5a 100644
--- a/src/mame/drivers/r2dtank.cpp
+++ b/src/mame/drivers/r2dtank.cpp
@@ -30,6 +30,9 @@ other = M5L8226 (x2)
RAM = 4116 (x11)
----------------------------------------------------
+
+XTAL values appear to be 3579.545 (X1) and 11.200 (X2).
+
********************************************************************/
#include "emu.h"
@@ -49,7 +52,7 @@ RAM = 4116 (x11)
#define LOG_AUDIO_COMM (0)
-#define MAIN_CPU_MASTER_CLOCK (11200000)
+#define MAIN_CPU_MASTER_CLOCK (11.2_MHz_XTAL)
#define PIXEL_CLOCK (MAIN_CPU_MASTER_CLOCK / 2)
#define CRTC_CLOCK (MAIN_CPU_MASTER_CLOCK / 16)
@@ -198,10 +201,10 @@ READ8_MEMBER(r2dtank_state::AY8910_port_r)
uint8_t ret = 0;
if (m_AY8910_selected & 0x08)
- ret = m_ay1->data_r(space, 0);
+ ret = m_ay1->data_r();
if (m_AY8910_selected & 0x10)
- ret = m_ay2->data_r(space, 0);
+ ret = m_ay2->data_r();
return ret;
}
@@ -210,10 +213,10 @@ READ8_MEMBER(r2dtank_state::AY8910_port_r)
WRITE8_MEMBER(r2dtank_state::AY8910_port_w)
{
if (m_AY8910_selected & 0x08)
- m_ay1->data_address_w(space, m_AY8910_selected >> 2, data);
+ m_ay1->data_address_w(m_AY8910_selected >> 2, data);
if (m_AY8910_selected & 0x10)
- m_ay2->data_address_w(space, m_AY8910_selected >> 2, data);
+ m_ay2->data_address_w(m_AY8910_selected >> 2, data);
}
@@ -324,7 +327,7 @@ MC6845_UPDATE_ROW( r2dtank_state::crtc_update_row )
WRITE8_MEMBER(r2dtank_state::pia_comp_w)
{
- m_pia_main->write(machine().dummy_space(), offset, ~data);
+ m_pia_main->write(offset, ~data);
}
@@ -442,19 +445,20 @@ INPUT_PORTS_END
*
*************************************/
-MACHINE_CONFIG_START(r2dtank_state::r2dtank)
- MCFG_DEVICE_ADD("maincpu", M6809,3000000) /* ?? too fast ? */
- MCFG_DEVICE_PROGRAM_MAP(r2dtank_main_map)
+void r2dtank_state::r2dtank(machine_config &config)
+{
+ MC6809(config, m_maincpu, MAIN_CPU_MASTER_CLOCK / 4); // divider guessed
+ m_maincpu->set_addrmap(AS_PROGRAM, &r2dtank_state::r2dtank_main_map);
- MCFG_DEVICE_ADD("audiocpu", M6802,3000000) /* ?? */
- MCFG_DEVICE_PROGRAM_MAP(r2dtank_audio_map)
+ M6802(config, m_audiocpu, 3.579545_MHz_XTAL);
+ m_audiocpu->set_addrmap(AS_PROGRAM, &r2dtank_state::r2dtank_audio_map);
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_RAW_PARAMS(PIXEL_CLOCK, 256, 0, 256, 256, 0, 256) /* temporary, CRTC will configure screen */
- MCFG_SCREEN_UPDATE_DEVICE("crtc", mc6845_device, screen_update)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_raw(PIXEL_CLOCK, 360, 0, 256, 276, 0, 224);
+ screen.set_screen_update("crtc", FUNC(mc6845_device::screen_update));
PALETTE(config, m_palette, palette_device::BGR_3BIT);
@@ -496,16 +500,15 @@ MACHINE_CONFIG_START(r2dtank_state::r2dtank)
GENERIC_LATCH_8(config, m_soundlatch);
GENERIC_LATCH_8(config, m_soundlatch2);
- AY8910(config, m_ay1, (4000000 / 4));
+ AY8910(config, m_ay1, 3.579545_MHz_XTAL / 4); // probably E clock from MC6802
m_ay1->port_a_read_callback().set_ioport("DSWB");
m_ay1->add_route(ALL_OUTPUTS, "mono", 0.25);
- AY8910(config, m_ay2, (4000000 / 4));
+ AY8910(config, m_ay2, 3.579545_MHz_XTAL / 4);
m_ay2->port_a_read_callback().set_ioport("IN1");
m_ay2->port_b_read_callback().set_ioport("DSWA");
m_ay2->add_route(ALL_OUTPUTS, "mono", 0.25);
-
-MACHINE_CONFIG_END
+}
diff --git a/src/mame/drivers/r9751.cpp b/src/mame/drivers/r9751.cpp
index 6ad473ad72d..72b20893e84 100644
--- a/src/mame/drivers/r9751.cpp
+++ b/src/mame/drivers/r9751.cpp
@@ -52,8 +52,11 @@
#include "cpu/m68000/m68000.h"
#include "machine/terminal.h"
-#include "bus/scsi/scsi.h"
-#include "machine/wd33c93.h"
+#include "machine/nscsi_bus.h"
+#include "machine/nscsi_cd.h"
+#include "machine/nscsi_hd.h"
+
+#include "machine/wd33c9x.h"
#include "machine/pdc.h"
#include "machine/smioc.h"
@@ -85,7 +88,7 @@ public:
m_maincpu(*this, "maincpu"),
m_pdc(*this, "pdc"),
m_smioc(*this, "smioc"),
- m_wd33c93(*this, "wd33c93"),
+ m_wd33c93(*this, "scsi:7:wd33c93"),
m_main_ram(*this, "main_ram")
{
device_trace_init();
@@ -166,6 +169,9 @@ private:
void device_trace_disable(int device);
void* system_trace_context;
+
+ static void scsi_devices(device_slot_interface &device);
+ void wd33c93(device_t *device);
};
#if ENABLE_TRACE_ALL_DEVICES
@@ -957,11 +963,25 @@ INPUT_PORTS_END
Machine Drivers
******************************************************************************/
-MACHINE_CONFIG_START(r9751_state::r9751)
+void r9751_state::scsi_devices(device_slot_interface &device)
+{
+ device.option_add("cdrom", NSCSI_CDROM);
+ device.option_add("harddisk", NSCSI_HARDDISK);
+}
+
+void r9751_state::wd33c93(device_t *device)
+{
+ device->set_clock(10000000);
+ // downcast<wd33c93a_device *>(device)->irq_cb().set(*this, FUNC(r9751_state::scsi_irq_w));
+ // downcast<wd33c93a_device *>(device)->drq_cb().set(*this, FUNC(r9751_state::scsi_drq_w));
+}
+
+void r9751_state::r9751(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M68030, 20000000)
- MCFG_DEVICE_PROGRAM_MAP(r9751_mem)
- MCFG_QUANTUM_TIME(attotime::from_hz(1000))
+ M68030(config, m_maincpu, 20000000);
+ m_maincpu->set_addrmap(AS_PROGRAM, &r9751_state::r9751_mem);
+ config.m_minimum_quantum = attotime::from_hz(1000);
/* i/o hardware */
SMIOC(config, m_smioc, 0);
@@ -972,13 +992,20 @@ MACHINE_CONFIG_START(r9751_state::r9751)
PDC(config, m_pdc, 0);
m_pdc->m68k_r_callback().set(FUNC(r9751_state::pdc_dma_r));
m_pdc->m68k_w_callback().set(FUNC(r9751_state::pdc_dma_w));
- MCFG_DEVICE_ADD("scsi", SCSI_PORT, 0)
- WD33C93(config, m_wd33c93);
- m_wd33c93->set_scsi_port("scsi");
+
+ NSCSI_BUS(config, "scsi", 0);
+ NSCSI_CONNECTOR(config, "scsi:0", scsi_devices, nullptr, false);
+ NSCSI_CONNECTOR(config, "scsi:1", scsi_devices, "harddisk", false);
+ NSCSI_CONNECTOR(config, "scsi:3", scsi_devices, nullptr, false);
+ NSCSI_CONNECTOR(config, "scsi:4", scsi_devices, "cdrom", false);
+ NSCSI_CONNECTOR(config, "scsi:5", scsi_devices, nullptr, false);
+ NSCSI_CONNECTOR(config, "scsi:6", scsi_devices, nullptr, false);
+ NSCSI_CONNECTOR(config, "scsi:7").option_set("wd33c93", WD33C93)
+ .machine_config([this](device_t *device) { wd33c93(device); });
/* software list */
- MCFG_SOFTWARE_LIST_ADD("flop_list","r9751")
-MACHINE_CONFIG_END
+ SOFTWARE_LIST(config, "flop_list").set_original("r9751");
+}
diff --git a/src/mame/drivers/rad_eu3a05.cpp b/src/mame/drivers/rad_eu3a05.cpp
index b2f7b73f1b0..4c9c33be6b3 100644
--- a/src/mame/drivers/rad_eu3a05.cpp
+++ b/src/mame/drivers/rad_eu3a05.cpp
@@ -1146,27 +1146,27 @@ INTERRUPT_GEN_MEMBER(radica_eu3a05_state::interrupt)
*/
}
-MACHINE_CONFIG_START(radica_eu3a05_state::radicasi)
-
+void radica_eu3a05_state::radicasi(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu",M6502,XTAL(21'281'370)/2) // Tetris has a XTAL(21'281'370), not confirmed on Space Invaders, actual CPU clock unknown.
- MCFG_DEVICE_PROGRAM_MAP(radicasi_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", radica_eu3a05_state, interrupt)
+ M6502(config, m_maincpu, XTAL(21'281'370)/2); // Tetris has a XTAL(21'281'370), not confirmed on Space Invaders, actual CPU clock unknown.
+ m_maincpu->set_addrmap(AS_PROGRAM, &radica_eu3a05_state::radicasi_map);
+ m_maincpu->set_vblank_int("screen", FUNC(radica_eu3a05_state::interrupt));
ADDRESS_MAP_BANK(config, "bank").set_map(&radica_eu3a05_state::radicasi_bank_map).set_options(ENDIANNESS_LITTLE, 8, 24, 0x8000);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500))
- MCFG_SCREEN_UPDATE_DRIVER(radica_eu3a05_state, screen_update)
- MCFG_SCREEN_SIZE(32*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 0*8, 28*8-1)
- MCFG_SCREEN_PALETTE("palette")
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500));
+ screen.set_screen_update(FUNC(radica_eu3a05_state::screen_update));
+ screen.set_size(32*8, 32*8);
+ screen.set_visarea(0*8, 32*8-1, 0*8, 28*8-1);
+ screen.set_palette(m_palette);
- MCFG_PALETTE_ADD("palette", 256)
+ PALETTE(config, m_palette).set_entries(256);
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_radicasi_fake)
+ GFXDECODE(config, m_gfxdecode, m_palette, gfx_radicasi_fake);
radica6502_gpio_device &gpio(RADICA6502_GPIO(config, "gpio", 0));
gpio.read_0_callback().set_ioport("IN0");
@@ -1176,7 +1176,7 @@ MACHINE_CONFIG_START(radica_eu3a05_state::radicasi)
radica6502_sound_device &sound(RADICA6502_SOUND(config, "6ch_sound", 8000));
sound.space_read_callback().set(FUNC(radica_eu3a05_state::read_full_space));
sound.add_route(ALL_OUTPUTS, "mono", 1.0);
-MACHINE_CONFIG_END
+}
ROM_START( rad_tetr )
diff --git a/src/mame/drivers/rad_eu3a14.cpp b/src/mame/drivers/rad_eu3a14.cpp
index 10533b5ca2d..7b0c664f2e4 100644
--- a/src/mame/drivers/rad_eu3a14.cpp
+++ b/src/mame/drivers/rad_eu3a14.cpp
@@ -10,23 +10,26 @@
Known to be on this hardware
- Golden Tee Golf Home Edition (developed by FarSight Studios)
- Connectv Football (developed by Medialink)
-
- Also on this hardware
-
- name PCB ID ROM width TSOP pads ROM size SEEPROM die markings
-
- Real Swing Golf 74037 x16 48 not dumped no ELAN EU3A14
- Play TV Basketball 75029 x16 48 not dumped no ELAN EU3A14
- Baseball 3 ? x16 48 not dumped no ELAN EU3A14
-
- Huntin’3 ? x16 48 not dumped no Elan ?
+ name PCB ID ROM width TSOP pads ROM size SEEPROM die markings
+ Golden Tee Golf Home Edition ? x16 48 4MB no ELAN EU3A14 (developed by FarSight Studios)
+ Real Swing Golf 74037 x16 48 4MB no ELAN EU3A14 (developed by FarSight Studios)
+ Baseball 3 ? x16 48 4MB no ELAN EU3A14 (developed by FarSight Studios)
+ Connectv Football ? x16 48 4MB no ELAN EU3A14 (developed by Medialink)
+ Huntin’3 ? x16 48 4MB no Elan ? (developed by V-Tac Technology Co Ltd.)
+ Play TV Basketball 75029 x16 48 4MB no ELAN EU3A14
In many ways this is similar to the rad_eu3a05.cpp hardware
but the video system has changed, here the sprites are more traditional non-tile based, rather
than coming from 'pages'
+ --
+
+ Compared to the XaviXport games camera hookups, Real Swing Golf just has 6 wires, Its camera PCB is the only one with a ceramic resonator.
+ Maybe the CU5502 chip offloads some processing from the CPU?
+
+ The Basketball camera also uses an ETOMS CU5502. It’s different from the others (XaviXport + Real Swing Golf) in that the sensor is on a small PCB with
+ a 3.58MHz resonator with 16 wires going to another small PCB that has a glob and a 4MHz resonator. 6 wires go from that PCB to the main game PCB.
+
*/
#include "emu.h"
@@ -73,24 +76,29 @@ public:
radica_eu3a14_state(const machine_config &mconfig, device_type type, const char *tag)
: driver_device(mconfig, type, tag),
m_maincpu(*this, "maincpu"),
+ m_mainregion(*this, "maincpu"),
m_palram(*this, "palram"),
m_scrollregs(*this, "scrollregs"),
m_tilecfg(*this, "tilecfg"),
m_tilebase(*this, "tilebase"),
+ m_spriteaddr(*this, "spriteaddr"),
m_spritebase(*this, "spritebase"),
m_mainram(*this, "mainram"),
m_dmaparams(*this, "dmaparams"),
m_bank(*this, "bank"),
m_palette(*this, "palette"),
- m_gfxdecode(*this, "gfxdecode")
+ m_gfxdecode(*this, "gfxdecode"),
+ m_tvtype(*this, "TV")
{ }
void radica_eu3a14(machine_config &config);
void radica_eu3a14_adc(machine_config &config);
+ void radica_eu3a14p(machine_config &config);
void init_rad_gtg();
void init_rad_foot();
+ void init_rad_hnt3();
private:
READ8_MEMBER(irq_vector_r);
@@ -112,6 +120,17 @@ private:
DECLARE_WRITE8_MEMBER(radicasi_rombank_lo_w);
DECLARE_WRITE8_MEMBER(radicasi_rombank_hi_w);
+ DECLARE_WRITE8_MEMBER(porta_dir_w);
+ DECLARE_WRITE8_MEMBER(portb_dir_w);
+ DECLARE_WRITE8_MEMBER(portc_dir_w);
+
+ DECLARE_WRITE8_MEMBER(porta_dat_w);
+ DECLARE_WRITE8_MEMBER(portb_dat_w);
+ DECLARE_WRITE8_MEMBER(portc_dat_w);
+
+
+ DECLARE_READ8_MEMBER(radica_5009_unk_r) { return machine().rand(); };
+
DECLARE_READ8_MEMBER(random_r) { return machine().rand(); };
TIMER_DEVICE_CALLBACK_MEMBER(scanline_cb);
@@ -131,25 +150,35 @@ private:
double hue2rgb(double p, double q, double t);
required_device<cpu_device> m_maincpu;
+ required_region_ptr<uint8_t> m_mainregion;
required_shared_ptr<uint8_t> m_palram;
required_shared_ptr<uint8_t> m_scrollregs;
required_shared_ptr<uint8_t> m_tilecfg;
required_shared_ptr<uint8_t> m_tilebase;
+ required_shared_ptr<uint8_t> m_spriteaddr;
required_shared_ptr<uint8_t> m_spritebase;
required_shared_ptr<uint8_t> m_mainram;
required_shared_ptr<uint8_t> m_dmaparams;
required_device<address_map_bank_device> m_bank;
required_device<palette_device> m_palette;
required_device<gfxdecode_device> m_gfxdecode;
+ required_ioport m_tvtype;
uint8_t m_rombank_hi;
uint8_t m_rombank_lo;
int m_tilerambase;
int m_spriterambase;
+ int m_pagewidth;
+ int m_pageheight;
+ int m_bytespertile;
+
+ uint8_t m_portdir[3];
+ void draw_tile(bitmap_ind16 &bitmap, const rectangle &cliprect, int gfxno, int tileno, int base, int palette, int flipx, int flipy, int xpos, int ypos, int transpen, int size);
void handle_palette(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
void draw_page(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, int which, int xbase, int ybase, int size);
void draw_background(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
+ void draw_sprite_line(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, int offset, int count, int pal, int flipx, int xpos, int ypos, int gfxno);
void draw_sprites(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
};
@@ -207,42 +236,117 @@ void radica_eu3a14_state::handle_palette(screen_device &screen, bitmap_ind16 &bi
}
}
+void radica_eu3a14_state::draw_tile(bitmap_ind16 &bitmap, const rectangle &cliprect, int gfxno, int tileno, int base, int palette, int flipx, int flipy, int xpos, int ypos, int transpen, int size)
+{
+ int bppdiv = 1;
+ int baseaddr = base * 256;
+
+ switch (gfxno)
+ {
+ case 0x03: bppdiv = 1; baseaddr += tileno * 256; break; // 16x16 8bpp
+ case 0x04: bppdiv = 2; baseaddr += tileno * 128; break; // 16x16 4bpp
+ case 0x05: bppdiv = 1; baseaddr += tileno * 64; break; // 8x8 8bpp
+ case 0x06: bppdiv = 2; baseaddr += tileno * 64; break; // 8x8 4bpp
+ default: break;
+ }
+ const uint8_t *gfxdata = &m_mainregion[baseaddr & 0x3fffff];
+
+ int xstride = size / bppdiv;
+
+ int count = 0;
+ for (int y = 0; y < size; y++)
+ {
+ int realy = ypos + y;
+ uint16_t* dst = &bitmap.pix16(ypos + y);
+
+ for (int x = 0; x < xstride; x++)
+ {
+ int pix = gfxdata[count];
+
+ if (realy >= cliprect.min_y && realy <= cliprect.max_y)
+ {
+ if (bppdiv == 1) // 8bpp
+ {
+ int realx = x + xpos;
+ if (realx >= cliprect.min_x && realx <= cliprect.max_x)
+ {
+ if (pix)
+ dst[realx] = pix;
+ }
+ }
+ else if (bppdiv == 2) // 4bpp
+ {
+ int realx = (x * 2) + xpos;
+ if (realx >= cliprect.min_x && realx <= cliprect.max_x)
+ {
+ if (pix & 0xf0)
+ dst[realx] = (pix & 0xf0) >> 4;
+ }
+
+ realx++;
+
+ if (realx >= cliprect.min_x && realx <= cliprect.max_x)
+ {
+ if (pix & 0x0f)
+ dst[realx] = pix & 0x0f;
+ }
+ }
+ }
+ count++;
+ }
+ }
+}
+
void radica_eu3a14_state::draw_page(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, int which, int xbase, int ybase, int size)
{
- gfx_element *gfx;
+ int gfxno = 0;
+
+ int pagesize = m_pagewidth * m_pageheight * 2;
int base = (m_tilebase[1] << 8) | m_tilebase[0];
- if (m_tilecfg[2] & 0x04)
+ if (m_tilecfg[2] & 0x04) // 4bpp selection
{
- gfx = m_gfxdecode->gfx(4);
- base <<= 1;
+ gfxno = 4; // 16x16 4bpp
if (size == 8)
{
- gfx = m_gfxdecode->gfx(5);
- base <<= 2;
+ gfxno = 6; // 8x8 4bpp
}
}
- else
+ else // 8bpp selection
{
- gfx = m_gfxdecode->gfx(3);
+ gfxno = 3; // 16x16 8bpp
+
+ if (size == 8)
+ {
+ gfxno = 5; // 8x8 8bpp
+ }
}
int xdraw = xbase;
int ydraw = ybase;
int count = 0;
- for (int i = m_tilerambase+0x1c0*which; i < m_tilerambase+0x1c0*(which+1); i+=2)
+ for (int i = m_tilerambase + pagesize * which; i < m_tilerambase + pagesize * (which + 1); i += m_bytespertile)
{
- int tile = m_mainram[i+0] | (m_mainram[i+1] << 8);
+ int tile = 0;
+ if (m_bytespertile == 2)
+ {
+ tile = m_mainram[i + 0] | (m_mainram[i + 1] << 8);
+ }
+ else if (m_bytespertile == 4) // rad_foot hidden test mode, rad_hnt3 shooting range (not yet correct)
+ {
+ tile = m_mainram[i + 0] | (m_mainram[i + 1] << 8);// | (m_mainram[i + 2] << 16) | | (m_mainram[i + 3] << 24);
+ }
- gfx->transpen(bitmap, cliprect, tile+base, 0, 0, 0, xdraw, ydraw, 0);
- xdraw+=size;
+ draw_tile(bitmap, cliprect, gfxno, tile, base, 0, 0, 0, xdraw, ydraw, 0, size);
+
+ xdraw += size;
count++;
- if (((count % 16) == 0))
+ if (((count % m_pagewidth) == 0))
{
- xdraw -= size*16;
+ xdraw -= size * m_pagewidth;
ydraw += size;
}
}
@@ -253,34 +357,87 @@ void radica_eu3a14_state::draw_background(screen_device &screen, bitmap_ind16 &b
int xscroll = m_scrollregs[0] | (m_scrollregs[1] << 8);
int yscroll = m_scrollregs[2] | (m_scrollregs[3] << 8);
- int size = 16;
- // or 0x10?
- if (m_tilecfg[0] & 0x80)
+ int size;
+
+ // m_tilecfg[0] b-as ?-hh b = bytes per tile s = tilesize / page size? a = always set when tilemaps are in use - check? h = related to page positions, when set uses 2x2 pages? ? = used
+ // m_tilecfg[1] ---- ---? ? = used foot
+ // m_tilecfg[2] ---- -B-- B = 4bpp tiles
+
+ if (m_tilecfg[0] & 0x10)
{
size = 8;
+ m_pagewidth = 32;
+ m_pageheight = 28;
+ }
+ else
+ {
+ size = 16;
+ m_pagewidth = 16;
+ m_pageheight = 14;
+ }
+
+ if (m_tilecfg[0] & 0x80)
+ {
+ m_bytespertile = 4;
+ }
+ else
+ {
+ m_bytespertile = 2;
}
- draw_page(screen, bitmap, cliprect, 0, 0 - xscroll, 0 - yscroll, size);
- draw_page(screen, bitmap, cliprect, 1, (size * 16) - xscroll, 0 - yscroll, size);
- draw_page(screen, bitmap, cliprect, 2, 0 - xscroll, (size * 14) - yscroll, size);
- draw_page(screen, bitmap, cliprect, 3, (size * 16) - xscroll, (size * 14) - yscroll, size);
- draw_page(screen, bitmap, cliprect, 0, (size * 16 * 2) + 0 - xscroll, 0 - yscroll, size);
- draw_page(screen, bitmap, cliprect, 1, (size * 16 * 3) - xscroll, 0 - yscroll, size);
- draw_page(screen, bitmap, cliprect, 2, (size * 16 * 2) + 0 - xscroll, (size * 14) - yscroll, size);
- draw_page(screen, bitmap, cliprect, 3, (size * 16 * 3) - xscroll, (size * 14) - yscroll, size);
+ if ((m_tilecfg[0] & 0x03) == 0x00) // tilemaps arranged as 2x2 pages?
+ {
+ // normal
+ draw_page(screen, bitmap, cliprect, 0, 0 - xscroll, 0 - yscroll, size);
+ draw_page(screen, bitmap, cliprect, 1, (size * m_pagewidth) - xscroll, 0 - yscroll, size);
+ draw_page(screen, bitmap, cliprect, 2, 0 - xscroll, (size * m_pageheight) - yscroll, size);
+ draw_page(screen, bitmap, cliprect, 3, (size * m_pagewidth) - xscroll, (size * m_pageheight) - yscroll, size);
+
+ // wrap x
+ draw_page(screen, bitmap, cliprect, 0, (size * m_pagewidth * 2) + 0 - xscroll, 0 - yscroll, size);
+ draw_page(screen, bitmap, cliprect, 1, (size * m_pagewidth * 3) - xscroll, 0 - yscroll, size);
+ draw_page(screen, bitmap, cliprect, 2, (size * m_pagewidth * 2) + 0 - xscroll, (size * m_pageheight) - yscroll, size);
+ draw_page(screen, bitmap, cliprect, 3, (size * m_pagewidth * 3) - xscroll, (size * m_pageheight) - yscroll, size);
+
+ // wrap y
+ draw_page(screen, bitmap, cliprect, 0, 0 - xscroll, (size * m_pageheight * 2) + 0 - yscroll, size);
+ draw_page(screen, bitmap, cliprect, 1, (size * m_pagewidth) - xscroll, (size * m_pageheight * 2) + 0 - yscroll, size);
+ draw_page(screen, bitmap, cliprect, 2, 0 - xscroll, (size * m_pageheight * 3) - yscroll, size);
+ draw_page(screen, bitmap, cliprect, 3, (size * m_pagewidth) - xscroll, (size * m_pageheight * 3) - yscroll, size);
+
+ // wrap x+y
+ draw_page(screen, bitmap, cliprect, 0, (size * m_pagewidth * 2) + 0 - xscroll, (size * m_pageheight * 2) + 0 - yscroll, size);
+ draw_page(screen, bitmap, cliprect, 1, (size * m_pagewidth * 3) - xscroll, (size * m_pageheight * 2) + 0 - yscroll, size);
+ draw_page(screen, bitmap, cliprect, 2, (size * m_pagewidth * 2) + 0 - xscroll, (size * m_pageheight * 3) - yscroll, size);
+ draw_page(screen, bitmap, cliprect, 3, (size * m_pagewidth * 3) - xscroll, (size * m_pageheight * 3) - yscroll, size);
+ }
+ else if ((m_tilecfg[0] & 0x03) == 0x03) // individual tilemaps? multiple layers?
+ {
+ // normal
+ draw_page(screen, bitmap, cliprect, 0, 0 - xscroll, 0 - yscroll, size);
+ // wrap x
+ draw_page(screen, bitmap, cliprect, 0, (size * m_pagewidth) + 0 - xscroll, 0 - yscroll, size);
+ // wrap y
+ draw_page(screen, bitmap, cliprect, 0, 0 - xscroll, (size * m_pageheight) + 0 - yscroll, size);
+ // wrap x+y
+ draw_page(screen, bitmap, cliprect, 0, (size * m_pagewidth) + 0 - xscroll, (size * m_pageheight) + 0 - yscroll, size);
+ }
+ else
+ {
+ popmessage("m_tilecfg[0] & 0x03 unknown config");
+ }
- draw_page(screen, bitmap, cliprect, 0, 0 - xscroll, (size * 14 * 2) + 0 - yscroll, size);
- draw_page(screen, bitmap, cliprect, 1, (size * 16) - xscroll, (size * 14 * 2) + 0 - yscroll, size);
- draw_page(screen, bitmap, cliprect, 2, 0 - xscroll, (size * 14 * 3) - yscroll, size);
- draw_page(screen, bitmap, cliprect, 3, (size * 16) - xscroll, (size * 14 * 3) - yscroll, size);
+}
- draw_page(screen, bitmap, cliprect, 0, (size * 16 * 2) + 0 - xscroll, (size * 14 * 2) + 0 - yscroll, size);
- draw_page(screen, bitmap, cliprect, 1, (size * 16 * 3) - xscroll, (size * 14 * 2) + 0 - yscroll, size);
- draw_page(screen, bitmap, cliprect, 2, (size * 16 * 2) + 0 - xscroll, (size * 14 * 3) - yscroll, size);
- draw_page(screen, bitmap, cliprect, 3, (size * 16 * 3) - xscroll, (size * 14 * 3) - yscroll, size);
+void radica_eu3a14_state::draw_sprite_line(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, int offset, int count, int pal, int flipx, int xpos, int ypos, int gfxno)
+{
+ int tileno = offset + count;
+ gfx_element *gfx = m_gfxdecode->gfx(gfxno);
+ gfx->transpen(bitmap, cliprect, tileno, pal, flipx, 0, xpos, ypos, 0);
}
+
void radica_eu3a14_state::draw_sprites(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{
// first 4 sprite entries seem to be garbage sprites, so we start at 0x20
@@ -343,8 +500,7 @@ void radica_eu3a14_state::draw_sprites(screen_device &screen, bitmap_ind16 &bitm
int offset = ((m_mainram[i + 5] << 8) + (m_mainram[i + 4] << 0));
int extra = m_mainram[i + 6];
- gfx_element *gfx;
- gfx = m_gfxdecode->gfx(1);
+ int gfxno = 1;
int spritebase = (m_spritebase[1] << 8) | m_spritebase[0];
@@ -357,16 +513,17 @@ void radica_eu3a14_state::draw_sprites(screen_device &screen, bitmap_ind16 &bitm
case 0x00: // 8bpp
case 0x07: // 8bpp
offset >>= 1;
- gfx = m_gfxdecode->gfx(2);
+ gfxno = 2;
break;
case 0x02: // 2bpp
offset <<= 1;
- gfx = m_gfxdecode->gfx(0);
+ gfxno = 0;
pal = 0;
break;
case 0x04: // 4bpp
+ gfxno = 1;
break;
case 0x01: // unknowns
@@ -386,7 +543,7 @@ void radica_eu3a14_state::draw_sprites(screen_device &screen, bitmap_ind16 &bitm
{
for (int xx = 0; xx < width; xx++)
{
- gfx->transpen(bitmap, cliprect, offset + count, pal, flipx, 0, x + xx * 8, y + yy, 0);
+ draw_sprite_line(screen, bitmap, cliprect, offset, count, pal, flipx, x + xx * 8, y + yy, gfxno);
count++;
}
}
@@ -398,6 +555,8 @@ void radica_eu3a14_state::draw_sprites(screen_device &screen, bitmap_ind16 &bitm
uint32_t radica_eu3a14_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{
+ m_spriterambase = (m_spriteaddr[0] * 0x200) - 0x200;
+
bitmap.fill(0, cliprect);
handle_palette(screen, bitmap, cliprect);
@@ -473,10 +632,41 @@ READ8_MEMBER(radica_eu3a14_state::radicasi_pal_ntsc_r)
// how best to handle this, we probably need to run the PAL machine at 50hz
// the text under the radica logo differs between regions
logerror("%s: radicasi_pal_ntsc_r (region + more?)\n", machine().describe_context());
- return 0xff; // NTSC
- //return 0x00; // PAL
+ return m_tvtype->read();
+}
+
+WRITE8_MEMBER(radica_eu3a14_state::porta_dir_w)
+{
+ m_portdir[0] = data;
+ // update state
+}
+
+WRITE8_MEMBER(radica_eu3a14_state::portb_dir_w)
+{
+ m_portdir[1] = data;
+ // update state
+}
+
+WRITE8_MEMBER(radica_eu3a14_state::portc_dir_w)
+{
+ m_portdir[2] = data;
+ // update state
+}
+
+WRITE8_MEMBER(radica_eu3a14_state::porta_dat_w)
+{
+}
+
+WRITE8_MEMBER(radica_eu3a14_state::portb_dat_w)
+{
+}
+
+WRITE8_MEMBER(radica_eu3a14_state::portc_dat_w)
+{
}
+
+
void radica_eu3a14_state::bank_map(address_map &map)
{
map(0x000000, 0x3fffff).rom().region("maincpu", 0);
@@ -490,9 +680,12 @@ void radica_eu3a14_state::radica_eu3a14_map(address_map &map)
map(0x4800, 0x4bff).ram().share("palram");
// similar to eu3a05, at least for pal flags and rom banking
+ // 5001 write
+ // 5004 write
+ // 5006 write
map(0x5007, 0x5007).noprw();
- map(0x5008, 0x5008).nopw(); // startup
- map(0x5009, 0x5009).noprw();
+ map(0x5008, 0x5008).nopw(); // startup (read too)
+ map(0x5009, 0x5009).r(FUNC(radica_eu3a14_state::radica_5009_unk_r)); // rad_hnt3 polls this on startup
map(0x500a, 0x500a).nopw(); // startup
map(0x500b, 0x500b).r(FUNC(radica_eu3a14_state::radicasi_pal_ntsc_r)).nopw(); // PAL / NTSC flag at least
map(0x500c, 0x500c).w(FUNC(radica_eu3a14_state::radicasi_rombank_hi_w));
@@ -501,18 +694,23 @@ void radica_eu3a14_state::radica_eu3a14_map(address_map &map)
// DMA is similar to, but not the same as eu3a05
map(0x500f, 0x5017).ram().share("dmaparams");
map(0x5018, 0x5018).rw(FUNC(radica_eu3a14_state::dma_trigger_r), FUNC(radica_eu3a14_state::dma_trigger_w));
+ // 5019 - 46 on startup (hnt3) 22 (bb3, foot) na (gtg) 09 (rsg)
+ // 501a - 01 on startup (hnt3) 03 (bb3, foot) na (gtg) 02,01 (rsg)
// probably GPIO like eu3a05, although it access 47/48 as unknown instead of 48/49/4a
- map(0x5040, 0x5040).nopw();
- map(0x5041, 0x5041).portr("IN0");
- map(0x5042, 0x5042).nopw();
- map(0x5043, 0x5043).noprw();
- map(0x5044, 0x5044).nopw();
- map(0x5045, 0x5045).portr("IN1").nopw();
+ map(0x5040, 0x5040).w(FUNC(radica_eu3a14_state::porta_dir_w));
+ map(0x5041, 0x5041).portr("IN0").w(FUNC(radica_eu3a14_state::porta_dat_w));
+ map(0x5042, 0x5042).w(FUNC(radica_eu3a14_state::portb_dir_w));
+ map(0x5043, 0x5043).portr("IN1").w(FUNC(radica_eu3a14_state::portb_dat_w));
+ map(0x5044, 0x5044).w(FUNC(radica_eu3a14_state::portc_dir_w));
+ map(0x5045, 0x5045).portr("IN2").w(FUNC(radica_eu3a14_state::portc_dat_w));
+
map(0x5046, 0x5046).nopw();
map(0x5047, 0x5047).nopw();
map(0x5048, 0x5048).nopw();
+ // 5060 - 506e r/w during startup on foot
+
// sound appears to be the same as eu3a05
map(0x5080, 0x5091).rw("6ch_sound", FUNC(radica6502_sound_device::radicasi_sound_addr_r), FUNC(radica6502_sound_device::radicasi_sound_addr_w));
map(0x5092, 0x50a3).rw("6ch_sound", FUNC(radica6502_sound_device::radicasi_sound_size_r), FUNC(radica6502_sound_device::radicasi_sound_size_w));
@@ -521,19 +719,22 @@ void radica_eu3a14_state::radica_eu3a14_map(address_map &map)
map(0x50a6, 0x50a6).nopw(); // startup
map(0x50a7, 0x50a7).nopw(); // startup
map(0x50a8, 0x50a8).r("6ch_sound", FUNC(radica6502_sound_device::radicasi_50a8_r));
- map(0x50a9, 0x50a9).nopw(); // startup
+ map(0x50a9, 0x50a9).nopw(); // startup, read foot
// video regs are here this time
map(0x5100, 0x5100).ram();
+ map(0x5101, 0x5101).ram();
+ map(0x5102, 0x5102).ram();
map(0x5103, 0x5106).ram();
map(0x5107, 0x5107).ram(); // on transitions, maybe layer disables?
-
map(0x5110, 0x5112).ram().share("tilecfg");
map(0x5113, 0x5113).ram(); // written with tilebase?
map(0x5114, 0x5115).ram().share("tilebase");
map(0x5116, 0x5117).ram();
map(0x5121, 0x5124).ram().share("scrollregs");
- map(0x5150, 0x5150).ram(); // startup
+
+ map(0x5140, 0x5140).ram();
+ map(0x5150, 0x5150).ram().share("spriteaddr"); // startup 01 bb3,gtg,rsg, (na) foot 0c hnt3
map(0x5151, 0x5152).ram().share("spritebase");
map(0x5153, 0x5153).ram(); // startup
@@ -589,10 +790,36 @@ static INPUT_PORTS_START( rad_gtg )
PORT_DIPNAME( 0x20, 0x20, DEF_STR( Unknown ) )
PORT_DIPSETTING( 0x20, DEF_STR( Off ) )
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
- PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) // up and down in the menus should be the trackball, maybe these are leftovers from real swing golf or just from development?
+ PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) // up and down in the menus should be the trackball
PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN )
PORT_START("IN1")
+ PORT_DIPNAME( 0x01, 0x01, "IN1" )
+ PORT_DIPSETTING( 0x01, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x02, 0x02, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x02, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x04, 0x04, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x04, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x08, 0x08, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x08, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x10, 0x10, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x10, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x20, 0x20, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x20, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x40, 0x40, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x40, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x80, 0x80, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x80, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+
+ PORT_START("IN2")
PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNUSED )
PORT_DIPNAME( 0x08, 0x08, "Track Y test" ) // trackball up/down direction bit? (read in interrupt, increases / decreases a counter)
PORT_DIPSETTING( 0x08, DEF_STR( Off ) )
@@ -602,10 +829,93 @@ static INPUT_PORTS_START( rad_gtg )
PORT_DIPSETTING( 0x20, DEF_STR( Off ) )
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
PORT_BIT( 0xc0, IP_ACTIVE_LOW, IPT_UNUSED )
+
+ PORT_START("TV")
+ PORT_BIT( 0xff, IP_ACTIVE_LOW, IPT_UNUSED )
+INPUT_PORTS_END
+
+static INPUT_PORTS_START( rad_rsg ) // base unit just has 4 directions + enter and a sensor to swing the club over
+ PORT_START("IN0")
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) // aiming
+ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT )
+ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_BUTTON1 ) // select in menus?
+ PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) // previous in menus?
+ PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) // next in menus?
+ PORT_DIPNAME( 0x20, 0x20, "IN0" )
+ PORT_DIPSETTING( 0x20, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x40, 0x40, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x40, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x80, 0x80, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x80, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+
+ PORT_START("IN1")
+ PORT_DIPNAME( 0x01, 0x01, "IN1" )
+ PORT_DIPSETTING( 0x01, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x02, 0x02, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x02, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x04, 0x04, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x04, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x08, 0x08, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x08, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x10, 0x10, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x10, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x20, 0x20, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x20, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x40, 0x40, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x40, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x80, 0x80, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x80, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+
+ PORT_START("IN2")
+ PORT_DIPNAME( 0x01, 0x01, "IN2" )
+ PORT_DIPSETTING( 0x01, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x02, 0x02, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x02, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x04, 0x04, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x04, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x08, 0x08, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x08, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x10, 0x10, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x10, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x20, 0x20, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x20, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x40, 0x40, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x40, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x80, 0x80, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x80, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+
+ PORT_START("TV")
+ PORT_BIT( 0xff, IP_ACTIVE_LOW, IPT_UNUSED )
+INPUT_PORTS_END
+
+static INPUT_PORTS_START( rad_rsgp )
+ PORT_INCLUDE(rad_rsg)
+
+ PORT_MODIFY("TV")
+ PORT_BIT( 0xff, IP_ACTIVE_HIGH, IPT_UNUSED )
INPUT_PORTS_END
// hold enter and left during power on for test mode
-static INPUT_PORTS_START( radica_eu3a14 )
+static INPUT_PORTS_START( radica_foot )
PORT_START("IN0")
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT )
PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT )
@@ -651,6 +961,268 @@ static INPUT_PORTS_START( radica_eu3a14 )
PORT_DIPNAME( 0x80, 0x80, DEF_STR( Unknown ) )
PORT_DIPSETTING( 0x80, DEF_STR( Off ) )
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+
+ PORT_START("IN2")
+ PORT_DIPNAME( 0x01, 0x01, "IN2" )
+ PORT_DIPSETTING( 0x01, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x02, 0x02, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x02, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x04, 0x04, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x04, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x08, 0x08, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x08, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x10, 0x10, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x10, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x20, 0x20, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x20, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x40, 0x40, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x40, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x80, 0x80, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x80, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+
+ PORT_START("TV")
+ PORT_BIT( 0xff, IP_ACTIVE_HIGH, IPT_UNUSED )
+INPUT_PORTS_END
+
+static INPUT_PORTS_START( radica_hnt3 )
+ PORT_START("IN0")
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP )
+ PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN )
+ PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT )
+ PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT )
+ PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("Menu Previous")
+ PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("Menu Next")
+ PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_NAME("Menu Select")
+ PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_BUTTON4 ) // pause?
+
+ PORT_START("IN1")
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON6 ) PORT_NAME("Fire Gun") // maybe
+ PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON5 ) PORT_NAME("Safety") PORT_TOGGLE
+ PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON7 ) PORT_NAME("Fire Gun (alt)") // maybe
+ PORT_DIPNAME( 0x08, 0x08, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x08, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x10, 0x10, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x10, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x20, 0x20, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x20, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x40, 0x40, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x40, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x80, 0x80, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x80, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+
+ PORT_START("IN2")
+ PORT_DIPNAME( 0x01, 0x01, "IN2" )
+ PORT_DIPSETTING( 0x01, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x02, 0x02, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x02, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x04, 0x04, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x04, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x08, 0x08, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x08, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x10, 0x10, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x10, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x20, 0x20, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x20, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x40, 0x40, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x40, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x80, 0x80, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x80, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+
+ PORT_START("TV")
+ PORT_BIT( 0xff, IP_ACTIVE_LOW, IPT_UNUSED )
+INPUT_PORTS_END
+
+static INPUT_PORTS_START( radica_hnt3p )
+ PORT_INCLUDE(radica_hnt3)
+
+ PORT_MODIFY("TV")
+ PORT_BIT( 0xff, IP_ACTIVE_HIGH, IPT_UNUSED )
+INPUT_PORTS_END
+
+
+static INPUT_PORTS_START( radica_bask )
+ PORT_START("IN0")
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT )
+ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT )
+ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_BUTTON1 )
+ PORT_DIPNAME( 0x08, 0x08, "IN0" )
+ PORT_DIPSETTING( 0x08, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x10, 0x10, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x10, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x20, 0x20, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x20, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x40, 0x40, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x40, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x80, 0x80, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x80, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+
+ PORT_START("IN1")
+ PORT_DIPNAME( 0x01, 0x01, "IN1" )
+ PORT_DIPSETTING( 0x01, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x02, 0x02, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x02, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x04, 0x04, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x04, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x08, 0x08, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x08, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x10, 0x10, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x10, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x20, 0x20, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x20, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x40, 0x40, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x40, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x80, 0x80, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x80, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+
+ PORT_START("IN2")
+ PORT_DIPNAME( 0x01, 0x01, "IN2" )
+ PORT_DIPSETTING( 0x01, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x02, 0x02, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x02, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x04, 0x04, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x04, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x08, 0x08, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x08, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x10, 0x10, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x10, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x20, 0x20, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x20, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x40, 0x40, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x40, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x80, 0x80, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x80, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+
+ PORT_START("TV")
+ PORT_BIT( 0xff, IP_ACTIVE_LOW, IPT_UNUSED )
+INPUT_PORTS_END
+
+static INPUT_PORTS_START( radica_baskp )
+ PORT_INCLUDE(radica_bask)
+
+ PORT_MODIFY("TV")
+ PORT_BIT( 0xff, IP_ACTIVE_HIGH, IPT_UNUSED )
+INPUT_PORTS_END
+
+static INPUT_PORTS_START( radica_bb3 )
+ PORT_START("IN0")
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT )
+ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT )
+ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_UP )
+ PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN )
+ PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON1 )
+ PORT_DIPNAME( 0x20, 0x20, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x20, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x40, 0x40, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x40, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x80, 0x80, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x80, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+
+ PORT_START("IN1")
+ PORT_DIPNAME( 0x01, 0x01, "IN1" )
+ PORT_DIPSETTING( 0x01, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x02, 0x02, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x02, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x04, 0x04, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x04, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x08, 0x08, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x08, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x10, 0x10, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x10, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x20, 0x20, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x20, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x40, 0x40, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x40, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x80, 0x80, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x80, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+
+ PORT_START("IN2")
+ PORT_DIPNAME( 0x01, 0x01, "IN2" )
+ PORT_DIPSETTING( 0x01, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x02, 0x02, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x02, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x04, 0x04, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x04, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x08, 0x08, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x08, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x10, 0x10, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x10, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x20, 0x20, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x20, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x40, 0x40, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x40, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x80, 0x80, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x80, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+
+ PORT_START("TV")
+ PORT_BIT( 0xff, IP_ACTIVE_LOW, IPT_UNUSED )
+INPUT_PORTS_END
+
+static INPUT_PORTS_START( radica_bb3p )
+ PORT_INCLUDE(radica_bb3)
+
+ PORT_MODIFY("TV")
+ PORT_BIT( 0xff, IP_ACTIVE_HIGH, IPT_UNUSED )
INPUT_PORTS_END
void radica_eu3a14_state::machine_start()
@@ -663,6 +1235,12 @@ void radica_eu3a14_state::machine_reset()
m_maincpu->set_state_int(M6502_S, 0x1ff);
m_bank->set_bank(0x01);
+
+ m_portdir[0] = 0x00;
+ m_portdir[1] = 0x00;
+ m_portdir[2] = 0x00;
+
+ m_spriteaddr[0] = 0x14; // ?? rad_foot never writes, other games seem to use it to se sprite location
}
@@ -752,6 +1330,17 @@ static const gfx_layout helper16x16x4_layout =
16 * 16 * 4
};
+static const gfx_layout helper8x8x8_layout =
+{
+ 8,8,
+ RGN_FRAC(1,1),
+ 8,
+ { STEP8(0,1) },
+ { STEP8(0,8) },
+ { STEP8(0,8*8) },
+ 8 * 8 * 8
+};
+
static const gfx_layout helper8x8x4_layout =
{
8,8,
@@ -768,75 +1357,143 @@ static GFXDECODE_START( gfx_helper )
GFXDECODE_ENTRY( "maincpu", 0, helper8x1x2_layout, 0x0, 128 )
GFXDECODE_ENTRY( "maincpu", 0, helper8x1x4_layout, 0x0, 32 )
GFXDECODE_ENTRY( "maincpu", 0, helper8x1x8_layout, 0x0, 2 )
+ // standard decodes
GFXDECODE_ENTRY( "maincpu", 0, helper16x16x8_layout, 0x0, 2 )
GFXDECODE_ENTRY( "maincpu", 0, helper16x16x4_layout, 0x0, 32 )
+ GFXDECODE_ENTRY( "maincpu", 0, helper8x8x8_layout, 0x0, 2 )
GFXDECODE_ENTRY( "maincpu", 0, helper8x8x4_layout, 0x0, 32 )
GFXDECODE_END
-MACHINE_CONFIG_START(radica_eu3a14_state::radica_eu3a14)
+void radica_eu3a14_state::radica_eu3a14(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu",M6502,XTAL(21'477'272)/2) // marked as 21'477'270
- MCFG_DEVICE_PROGRAM_MAP(radica_eu3a14_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", radica_eu3a14_state, interrupt)
+ M6502(config, m_maincpu, XTAL(21'477'272)/2); // marked as 21'477'270
+ m_maincpu->set_addrmap(AS_PROGRAM, &radica_eu3a14_state::radica_eu3a14_map);
+ m_maincpu->set_vblank_int("screen", FUNC(radica_eu3a14_state::interrupt));
ADDRESS_MAP_BANK(config, "bank").set_map(&radica_eu3a14_state::bank_map).set_options(ENDIANNESS_LITTLE, 8, 24, 0x8000);
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_helper)
+ GFXDECODE(config, m_gfxdecode, m_palette, gfx_helper);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500))
- MCFG_SCREEN_UPDATE_DRIVER(radica_eu3a14_state, screen_update)
- MCFG_SCREEN_SIZE(32*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 0*8, 28*8-1)
-
- MCFG_SCREEN_PALETTE("palette")
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500));
+ screen.set_screen_update(FUNC(radica_eu3a14_state::screen_update));
+ screen.set_size(32*8, 32*8);
+ screen.set_visarea(0*8, 32*8-1, 0*8, 28*8-1);
+ screen.set_palette(m_palette);
- MCFG_PALETTE_ADD("palette", 512)
+ PALETTE(config, m_palette).set_entries(512);
/* sound hardware */
SPEAKER(config, "mono").front_center();
radica6502_sound_device &sound(RADICA6502_SOUND(config, "6ch_sound", 8000));
sound.space_read_callback().set(FUNC(radica_eu3a14_state::read_full_space));
sound.add_route(ALL_OUTPUTS, "mono", 1.0);
+}
-MACHINE_CONFIG_END
+void radica_eu3a14_state::radica_eu3a14_adc(machine_config &config)
+{
+ radica_eu3a14(config);
+
+ TIMER(config, "scantimer").configure_scanline(FUNC(radica_eu3a14_state::scanline_cb), "screen", 0, 1);
+}
-MACHINE_CONFIG_START(radica_eu3a14_state::radica_eu3a14_adc)
+
+void radica_eu3a14_state::radica_eu3a14p(machine_config &config) // TODO, clocks differ too, what are they on PAL?
+{
radica_eu3a14(config);
- MCFG_TIMER_DRIVER_ADD_SCANLINE("scantimer", radica_eu3a14_state, scanline_cb, "screen", 0, 1)
-MACHINE_CONFIG_END
+ subdevice<screen_device>("screen")->set_refresh_hz(50);
+}
+
void radica_eu3a14_state::init_rad_gtg()
{
// must be registers to control this
m_tilerambase = 0x0a00 - 0x200;
- m_spriterambase = 0x0220 - 0x200;
}
void radica_eu3a14_state::init_rad_foot()
{
// must be registers to control this
m_tilerambase = 0x0200 - 0x200;
- m_spriterambase = 0x2800 - 0x200;
+}
+
+void radica_eu3a14_state::init_rad_hnt3()
+{
+ // must be registers to control this
+ m_tilerambase = 0x0200 - 0x200;
}
ROM_START( rad_gtg )
ROM_REGION( 0x400000, "maincpu", ROMREGION_ERASE00 )
- ROM_LOAD16_WORD_SWAP( "goldentee.bin", 0x000000, 0x400000, CRC(b1985c63) SHA1(c42a59fcb665eb801d9ca5312b90e39333e52de4) )
+ ROM_LOAD( "goldentee.bin", 0x000000, 0x400000, CRC(2d6cdb85) SHA1(ce6ed39d692ff16ea407f39c37b6e731f952b9d5) )
+ROM_END
+
+ROM_START( rad_rsg )
+ ROM_REGION( 0x400000, "maincpu", ROMREGION_ERASE00 )
+ ROM_LOAD( "realswinggolf.bin", 0x000000, 0x400000, CRC(89e5b6a6) SHA1(0b14aa84d7e7ae7190cd64e3eb125de2104342bc) )
ROM_END
+ROM_START( rad_rsgp )
+ ROM_REGION( 0x400000, "maincpu", ROMREGION_ERASE00 )
+ ROM_LOAD( "realswinggolf.bin", 0x000000, 0x400000, CRC(89e5b6a6) SHA1(0b14aa84d7e7ae7190cd64e3eb125de2104342bc) )
+ROM_END
+
+
ROM_START( rad_foot )
ROM_REGION( 0x400000, "maincpu", ROMREGION_ERASE00 )
ROM_LOAD( "connectvfootball.bin", 0x000000, 0x400000, CRC(00ac4fc0) SHA1(2b60ae5c6bc7e9ef7cdbd3f6a0a0657ed3ab5afe) )
ROM_END
-CONS( 2006, rad_gtg, 0, 0, radica_eu3a14_adc, rad_gtg, radica_eu3a14_state, init_rad_gtg, "Radica (licensed from Incredible Technologies)", "Golden Tee Golf: Home Edition", MACHINE_NOT_WORKING )
+ROM_START( rad_bb3 )
+ ROM_REGION( 0x400000, "maincpu", ROMREGION_ERASE00 )
+ ROM_LOAD( "baseball3.bin", 0x000000, 0x400000, CRC(af86aab0) SHA1(5fed48a295f045ca839f87b0f9b78ecc51104cdc) )
+ROM_END
+
+ROM_START( rad_bb3p )
+ ROM_REGION( 0x400000, "maincpu", ROMREGION_ERASE00 )
+ ROM_LOAD( "baseball3.bin", 0x000000, 0x400000, CRC(af86aab0) SHA1(5fed48a295f045ca839f87b0f9b78ecc51104cdc) )
+ROM_END
+
+ROM_START( rad_hnt3 )
+ ROM_REGION( 0x400000, "maincpu", ROMREGION_ERASE00 )
+ ROM_LOAD( "huntin3.bin", 0x000000, 0x400000, CRC(c8e3e40b) SHA1(81eb16ac5ab6d93525fcfadbc6703b2811d7de7f) )
+ROM_END
+
+ROM_START( rad_hnt3p )
+ ROM_REGION( 0x400000, "maincpu", ROMREGION_ERASE00 )
+ ROM_LOAD( "huntin3.bin", 0x000000, 0x400000, CRC(c8e3e40b) SHA1(81eb16ac5ab6d93525fcfadbc6703b2811d7de7f) )
+ROM_END
+
+ROM_START( rad_bask )
+ ROM_REGION( 0x400000, "maincpu", ROMREGION_ERASE00 )
+ ROM_LOAD( "basketball.bin", 0x000000, 0x400000, CRC(7d6ff53c) SHA1(1c75261d55e0107a3b8e8d4c1eb2854750f2d0e8) )
+ROM_END
+
+ROM_START( rad_baskp )
+ ROM_REGION( 0x400000, "maincpu", ROMREGION_ERASE00 )
+ ROM_LOAD( "basketball.bin", 0x000000, 0x400000, CRC(7d6ff53c) SHA1(1c75261d55e0107a3b8e8d4c1eb2854750f2d0e8) )
+ROM_END
+
+CONS( 2006, rad_gtg, 0, 0, radica_eu3a14_adc, rad_gtg, radica_eu3a14_state, init_rad_gtg, "Radica / FarSight Studios (licensed from Incredible Technologies)", "Golden Tee Golf: Home Edition", MACHINE_NOT_WORKING )
+
+CONS( 2005, rad_rsg, 0, 0, radica_eu3a14, rad_rsg, radica_eu3a14_state, init_rad_gtg, "Radica / FarSight Studios", "Play TV Real Swing Golf", MACHINE_NOT_WORKING )
+CONS( 2005, rad_rsgp, rad_rsg, 0, radica_eu3a14p, rad_rsgp, radica_eu3a14_state, init_rad_gtg, "Radica / FarSight Studios", "Connectv Real Swing Golf", MACHINE_NOT_WORKING )
// also has a Connectv Real Soccer logo in the roms, apparently unused, maybe that was to be the US title (without the logo being changed to Play TV) but Play TV Soccer ended up being a different game licensed from Epoch instead.
-CONS( 2006, rad_foot, 0, 0, radica_eu3a14, radica_eu3a14, radica_eu3a14_state, init_rad_foot, "Radica", "Connectv Football", MACHINE_NOT_WORKING )
+CONS( 2006, rad_foot, 0, 0, radica_eu3a14p, radica_foot, radica_eu3a14_state, init_rad_foot, "Radica / Medialink", "Connectv Football", MACHINE_NOT_WORKING )
+
+CONS( 2005, rad_bb3, 0, 0, radica_eu3a14, radica_bb3, radica_eu3a14_state, init_rad_gtg, "Radica / FarSight Studios", "Play TV Baseball 3", MACHINE_NOT_WORKING )
+CONS( 2005, rad_bb3p, rad_bb3, 0, radica_eu3a14p, radica_bb3p, radica_eu3a14_state, init_rad_gtg, "Radica / FarSight Studios", "Connectv Baseball 3", MACHINE_NOT_WORKING )
+
+CONS( 2005, rad_hnt3, 0, 0, radica_eu3a14, radica_hnt3, radica_eu3a14_state, init_rad_hnt3, "Radica / V-Tac Technology Co Ltd.", "Play TV Huntin' 3", MACHINE_NOT_WORKING )
+CONS( 2005, rad_hnt3p,rad_hnt3, 0, radica_eu3a14p, radica_hnt3p, radica_eu3a14_state, init_rad_hnt3, "Radica / V-Tac Technology Co Ltd.", "Connectv Huntin' 3", MACHINE_NOT_WORKING )
+
+CONS( 2005, rad_bask, 0, 0, radica_eu3a14, radica_bask, radica_eu3a14_state, init_rad_gtg, "Radica / FarSight Studios", "Play TV Basketball", MACHINE_NOT_WORKING )
+CONS( 2005, rad_baskp,rad_bask, 0, radica_eu3a14, radica_baskp, radica_eu3a14_state, init_rad_gtg, "Radica / FarSight Studios", "Connectv Basketball", MACHINE_NOT_WORKING )
diff --git a/src/mame/drivers/radio86.cpp b/src/mame/drivers/radio86.cpp
index 808a14f5161..c66612c34f2 100644
--- a/src/mame/drivers/radio86.cpp
+++ b/src/mame/drivers/radio86.cpp
@@ -462,7 +462,8 @@ GFXDECODE_END
/* Machine driver */
-MACHINE_CONFIG_START(radio86_state::radio86)
+void radio86_state::radio86(machine_config &config)
+{
/* basic machine hardware */
I8080(config, m_maincpu, XTAL(16'000'000) / 9);
m_maincpu->set_addrmap(AS_PROGRAM, &radio86_state::radio86_mem);
@@ -480,9 +481,9 @@ MACHINE_CONFIG_START(radio86_state::radio86)
crtc.drq_wr_callback().set(m_dma8257, FUNC(i8257_device::dreq2_w));
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_UPDATE_DEVICE("i8275", i8275_device, screen_update)
- MCFG_SCREEN_RAW_PARAMS(XTAL(16'000'000) / 2, 516, 0, 78*6, 310, 0, 30*10)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_screen_update("i8275", FUNC(i8275_device::screen_update));
+ screen.set_raw(XTAL(16'000'000) / 2, 516, 0, 78*6, 310, 0, 30*10);
GFXDECODE(config, "gfxdecode", m_palette, gfx_radio86);
PALETTE(config, m_palette, FUNC(radio86_state::radio86_palette), 3);
@@ -496,13 +497,13 @@ MACHINE_CONFIG_START(radio86_state::radio86)
m_dma8257->out_iow_cb<2>().set("i8275", FUNC(i8275_device::dack_w));
m_dma8257->set_reverse_rw_mode(1);
- MCFG_CASSETTE_ADD( "cassette" )
- MCFG_CASSETTE_FORMATS(rkr_cassette_formats)
- MCFG_CASSETTE_DEFAULT_STATE(CASSETTE_STOPPED | CASSETTE_SPEAKER_ENABLED | CASSETTE_MOTOR_ENABLED)
- MCFG_CASSETTE_INTERFACE("radio86_cass")
+ CASSETTE(config, m_cassette);
+ m_cassette->set_formats(rkr_cassette_formats);
+ m_cassette->set_default_state(CASSETTE_STOPPED | CASSETTE_SPEAKER_ENABLED | CASSETTE_MOTOR_ENABLED);
+ m_cassette->set_interface("radio86_cass");
- MCFG_SOFTWARE_LIST_ADD("cass_list", "radio86_cass")
-MACHINE_CONFIG_END
+ SOFTWARE_LIST(config, "cass_list").set_original("radio86_cass");
+}
void radio86_state::kr03(machine_config &config)
@@ -516,81 +517,80 @@ void radio86_state::kr03(machine_config &config)
m_ppi8255_1->out_pc_callback().set(FUNC(radio86_state::radio86_8255_portc_w2));
}
-MACHINE_CONFIG_START(radio86_state::radio16)
+void radio86_state::radio16(machine_config &config)
+{
radio86(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(radio86_16_mem)
-MACHINE_CONFIG_END
+ m_maincpu->set_addrmap(AS_PROGRAM, &radio86_state::radio86_16_mem);
+}
-MACHINE_CONFIG_START(radio86_state::radiorom)
+void radio86_state::radiorom(machine_config &config)
+{
radio86(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(radio86rom_mem)
+ m_maincpu->set_addrmap(AS_PROGRAM, &radio86_state::radio86rom_mem);
I8255(config, m_ppi8255_2);
m_ppi8255_2->in_pa_callback().set(FUNC(radio86_state::radio86rom_romdisk_porta_r));
m_ppi8255_2->out_pb_callback().set(FUNC(radio86_state::radio86_romdisk_portb_w));
m_ppi8255_2->out_pc_callback().set(FUNC(radio86_state::radio86_romdisk_portc_w));
- MCFG_GENERIC_CARTSLOT_ADD("cartslot", generic_plain_slot, "radio86_cart")
- MCFG_GENERIC_EXTENSIONS("bin,rom")
+ GENERIC_CARTSLOT(config, m_cart, generic_plain_slot, "radio86_cart", "bin,rom");
- MCFG_SOFTWARE_LIST_ADD("cart_list", "radio86_cart")
-MACHINE_CONFIG_END
+ SOFTWARE_LIST(config, "cart_list").set_original("radio86_cart");
+}
-MACHINE_CONFIG_START(radio86_state::radioram)
+void radio86_state::radioram(machine_config &config)
+{
radio86(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(radio86ram_mem)
+ m_maincpu->set_addrmap(AS_PROGRAM, &radio86_state::radio86ram_mem);
I8255(config, m_ppi8255_2);
m_ppi8255_2->in_pa_callback().set(FUNC(radio86_state::radio86ram_romdisk_porta_r));
m_ppi8255_2->out_pb_callback().set(FUNC(radio86_state::radio86_romdisk_portb_w));
m_ppi8255_2->out_pc_callback().set(FUNC(radio86_state::radio86_romdisk_portc_w));
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(radio86_state::rk7007)
+void radio86_state::rk7007(machine_config &config)
+{
radio86(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_IO_MAP(rk7007_io)
+ m_maincpu->set_addrmap(AS_IO, &radio86_state::rk7007_io);
i8255_device &ms7007(I8255(config, "ms7007"));
ms7007.out_pa_callback().set(FUNC(radio86_state::radio86_8255_porta_w2));
ms7007.in_pb_callback().set(FUNC(radio86_state::radio86_8255_portb_r2));
ms7007.in_pc_callback().set(FUNC(radio86_state::rk7007_8255_portc_r));
ms7007.out_pc_callback().set(FUNC(radio86_state::radio86_8255_portc_w2));
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(radio86_state::rk700716)
+void radio86_state::rk700716(machine_config &config)
+{
radio16(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_IO_MAP(rk7007_io)
+ m_maincpu->set_addrmap(AS_IO, &radio86_state::rk7007_io);
i8255_device &ms7007(I8255(config, "ms7007"));
ms7007.out_pa_callback().set(FUNC(radio86_state::radio86_8255_porta_w2));
ms7007.in_pb_callback().set(FUNC(radio86_state::radio86_8255_portb_r2));
ms7007.in_pc_callback().set(FUNC(radio86_state::rk7007_8255_portc_r));
ms7007.out_pc_callback().set(FUNC(radio86_state::radio86_8255_portc_w2));
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(radio86_state::mikron2)
+void radio86_state::mikron2(machine_config &config)
+{
radio86(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(mikron2_mem)
-MACHINE_CONFIG_END
+ m_maincpu->set_addrmap(AS_PROGRAM, &radio86_state::mikron2_mem);
+}
-MACHINE_CONFIG_START(radio86_state::impuls03)
+void radio86_state::impuls03(machine_config &config)
+{
radio86(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(impuls03_mem)
-MACHINE_CONFIG_END
+ m_maincpu->set_addrmap(AS_PROGRAM, &radio86_state::impuls03_mem);
+}
/* ROM definition */
ROM_START( radio86 )
diff --git a/src/mame/drivers/raiden.cpp b/src/mame/drivers/raiden.cpp
index 1b05b5b2421..fcbbf23e00b 100644
--- a/src/mame/drivers/raiden.cpp
+++ b/src/mame/drivers/raiden.cpp
@@ -728,6 +728,42 @@ ROM_START( raidenb )/* Different hardware, Main & Sub CPU code not encrypted. */
ROM_LOAD( "jj3010.u0116", 0x0000, 0x0100, NO_DUMP )
ROM_END
+ROM_START( raidenub ) // only region bits differ from raidenb
+ ROM_REGION( 0x100000, "maincpu", 0 ) /* v30 main cpu */
+ ROM_LOAD16_BYTE( "1.u0253", 0x0a0000, 0x10000, CRC(a4b12785) SHA1(446314e82ce01315cb3e3d1f323eaa2ad6fb48dd) )
+ ROM_LOAD16_BYTE( "2.u0252", 0x0a0001, 0x10000, CRC(17640bd5) SHA1(5bbc99900426b1a072b52537ae9a50220c378a0d) )
+ ROM_LOAD16_BYTE( "3u.u022", 0x0c0000, 0x20000, CRC(9d735bf5) SHA1(531981eac2ef0c0635f067a649899f98738d5c67) ) /* Simply labeled as 3u */
+ ROM_LOAD16_BYTE( "4u.u023", 0x0c0001, 0x20000, CRC(95c110ef) SHA1(e6aea374ca63cdd851af66240e51461882d170e8) ) /* Simply labeled as 4u */
+
+ ROM_REGION( 0x100000, "sub", 0 ) /* v30 sub cpu */
+ ROM_LOAD16_BYTE( "5__,raidenb.u042", 0x0c0000, 0x20000, CRC(7aca6d61) SHA1(4d80ec87e54d7495b9bdf819b9985b1c8183c80d) ) /* Simply labeled as 5 */
+ ROM_LOAD16_BYTE( "6__,raidenb.u043", 0x0c0001, 0x20000, CRC(e3d35cc2) SHA1(4329865985aaf3fb524618e2e958563c8fa6ead5) ) /* Simply labeled as 6 */
+
+ ROM_REGION( 0x20000, "audiocpu", 0 ) /* 64k code for sound Z80 */
+ ROM_LOAD( "rai6.u212", 0x000000, 0x08000, CRC(723a483b) SHA1(50e67945e83ea1748fb748de3287d26446d4e0a0) ) /* Should be labeled "8" ??? */
+ ROM_CONTINUE( 0x010000, 0x08000 )
+ ROM_COPY( "audiocpu", 0x000000, 0x018000, 0x08000 )
+
+ ROM_REGION( 0x010000, "gfx1", 0 ) /* Chars */
+ ROM_LOAD( "9", 0x00000, 0x08000, CRC(1922b25e) SHA1(da27122dd1c43770e7385ad602ef397c64d2f754) ) /* On some PCBs there is no explicit */
+ ROM_LOAD( "10", 0x08000, 0x08000, CRC(5f90786a) SHA1(4f63b07c6afbcf5196a433f3356bef984fe303ef) ) /* U location for these two roms */
+
+ ROM_REGION( 0x080000, "gfx2", 0 ) /* tiles */
+ ROM_LOAD( "sei420", 0x00000, 0x80000, CRC(da151f0b) SHA1(02682497caf5f058331f18c652471829fa08d54f) ) /* U919 on this PCB */
+
+ ROM_REGION( 0x080000, "gfx3", 0 ) /* tiles */
+ ROM_LOAD( "sei430", 0x00000, 0x80000, CRC(ac1f57ac) SHA1(1de926a0db73b99904ef119ac816c53d1551156a) ) /* U920 on this PCB */
+
+ ROM_REGION( 0x090000, "gfx4", 0 ) /* Sprites */
+ ROM_LOAD( "sei440", 0x00000, 0x80000, CRC(946d7bde) SHA1(30e8755c2b1ca8bff6278710b8422b51f75eec10) ) /* U165 on this PCB */
+
+ ROM_REGION( 0x40000, "oki", 0 ) /* ADPCM samples */
+ ROM_LOAD( "7.u203", 0x00000, 0x10000, CRC(8f927822) SHA1(592f2719f2c448c3b4b239eeaec078b411e12dbb) )
+
+ ROM_REGION( 0x0100, "proms", 0 ) // N82S135N bipolar PROM
+ ROM_LOAD( "jj3010.u0116", 0x0000, 0x0100, NO_DUMP )
+ROM_END
+
ROM_START( raidenua )/* Different hardware, Main, Sub & sound CPU code not encrypted. */
ROM_REGION( 0x100000, "maincpu", 0 ) /* v30 main cpu */
ROM_LOAD16_BYTE( "1.c8", 0x0a0000, 0x10000, CRC(a4b12785) SHA1(446314e82ce01315cb3e3d1f323eaa2ad6fb48dd) )
@@ -824,3 +860,4 @@ GAME( 1990, raidenua, raiden, raidenu, raiden, raiden_state, empty_init, ROT
/* Alternate hardware. Main, Sub & Sound CPU code not encrypted. It also sports Seibu custom CRTC. */
GAME( 1990, raidenb, raiden, raidenb, raiden, raiden_state, empty_init, ROT270, "Seibu Kaihatsu", "Raiden (set 3)", MACHINE_SUPPORTS_SAVE )
+GAME( 1990, raidenub, raiden, raidenb, raiden, raiden_state, empty_init, ROT270, "Seibu Kaihatsu (Fabtek license)", "Raiden (US set 3)", MACHINE_SUPPORTS_SAVE )
diff --git a/src/mame/drivers/rainbow.cpp b/src/mame/drivers/rainbow.cpp
index 440f474545b..8a5a415c846 100644
--- a/src/mame/drivers/rainbow.cpp
+++ b/src/mame/drivers/rainbow.cpp
@@ -12,7 +12,7 @@ To unlock floppy drives A-D compile with WORKAROUND_RAINBOW_B (prevents a side e
Native single sided 5.25" images with 80 tracks, 10 sectors are well tested (*.IMD / *.TD0=TeleDisk / *.IMG with 400 K).
VT180 images (184.320 Bytes) are very unreliable in CP/M - though a real machine can read them.
5.25 MFM PC style drives and 720 K (3.5 " DS-DD MFM PC formatted disks) (on slots 3 + 4) show regressions / bugs
- as of Dec.2018 (file content bad while dir is OK, seek errors, write fault errors when copying _to_ hard disk).
+ as of Dec.2018 (file content bad while dir is OK, seek errors, write fault errors when copying _to_ hard disk).
ALWAYS USE THE RIGHT SLOT AND SAVE YOUR DATA BEFORE MOUNTING FOREIGN DISK FORMATS!
@@ -27,7 +27,7 @@ The public domain file RBCONVERT.ZIP documents how model 'A' differs from versio
NVRAM files from -A and -B machines are not interchangeable. If problems arise, delete the NVRAM file.
Venix 86-R (BSW) is working, just follow https://github.com/bsdimp/venix/blob/master/doc/MESS-RB-INSTALL.md
-
+
CPM 2.1 / DOS2.11 / DOS 3.x / diag disks boot. UCSD systems (fort_sys, pas_sys) boot, but expect 4 QD drives
loaded with disks (reassign slots, reset and mount three empty 400 K images before startup at #2, #3, #4).
@@ -802,7 +802,7 @@ private:
UPD7220_DISPLAY_PIXELS_MEMBER( rainbow_state::hgdc_display_pixels )
{
- if(m_inp7->read() == 0)
+ if(m_inp7->read() == 0)
return;
const rgb_t *paletteX = m_palette2->palette()->entry_list_raw();
@@ -1417,10 +1417,10 @@ WRITE_LINE_MEMBER(rainbow_state::mpsc_irq)
// PORT 0x06 : Communication bit rates (see page 21 of PC 100 SPEC)
WRITE8_MEMBER(rainbow_state::comm_bitrate_w)
{
- m_dbrg->write_str(data & 0x0f); // PDF is wrong, low nibble is RECEIVE clock (verified in SETUP).
+ m_dbrg->str_w(data & 0x0f); // PDF is wrong, low nibble is RECEIVE clock (verified in SETUP).
logerror("\n(COMM.) receive bitrate = %d ($%02x)\n", comm_rates[data & 0x0f] , data & 0x0f);
- m_dbrg->write_stt( ((data & 0xf0) >> 4) );
+ m_dbrg->stt_w( ((data & 0xf0) >> 4) );
logerror("(COMM.) transmit bitrate = %d ($%02x)\n", comm_rates[((data & 0xf0) >> 4)] ,(data & 0xf0) >> 4);
}
@@ -1548,16 +1548,16 @@ WRITE8_MEMBER(rainbow_state::rtc_w)
{
case 0x00: // Write to 0xED0FE
if (m_rtc->chip_enable())
- m_rtc->write_data(space, offset & 0x01); // Transfer data to DS1315 (data = offset):
+ m_rtc->write_data(offset & 0x01); // Transfer data to DS1315 (data = offset):
else
- m_rtc->read_0(space, 0); // (RTC ACTIVATION) read magic pattern 0
+ m_rtc->read_0(); // (RTC ACTIVATION) read magic pattern 0
break;
case 0x01: // Write to 0xED0FF
if (m_rtc->chip_enable())
- m_rtc->write_data(space, offset & 0x01); // Transfer data to DS1315 (data = offset):
+ m_rtc->write_data(offset & 0x01); // Transfer data to DS1315 (data = offset):
else
- m_rtc->read_1(space, 0); // (RTC ACTIVATION) read magic pattern 1
+ m_rtc->read_1(); // (RTC ACTIVATION) read magic pattern 1
break;
}
}
@@ -1576,7 +1576,7 @@ READ8_MEMBER(rainbow_state::rtc_r)
#ifdef ASSUME_RAINBOW_A_HARDWARE
case 0x00: // read time/date from 0xED000 (ClikClok for 100-A)
if (m_rtc->chip_enable())
- return m_rtc->read_data(space, 0) & 0x01;
+ return m_rtc->read_data() & 0x01;
else
m_rtc->chip_reset();
#else
@@ -1586,25 +1586,25 @@ READ8_MEMBER(rainbow_state::rtc_r)
case 0x0001: // RTC_WRITE_DATA_1 0xFC001
case 0x2001: // RTC_WRITE_DATA_1 0xFE001 (MIRROR)
- m_rtc->write_data(space, offset & 0x01);
+ m_rtc->write_data(offset & 0x01);
break;
// Read actual time/date from ClikClok:
case 0x0004: // 0xFC004
case 0x2004: // 0xFE004 (MIRROR)
if (m_rtc->chip_enable())
- return (m_rtc->read_data(space, 0) & 0x01);
+ return (m_rtc->read_data() & 0x01);
// (RTC ACTIVATION) read magic pattern 0
case 0x0100: // 0xFC100
case 0x2100: // 0xFE100 (MIRROR)
- m_rtc->read_0(space, 0);
+ m_rtc->read_0();
break;
// (RTC ACTIVATION) read magic pattern 1
case 0x0101: // 0xFC101
case 0x2101: // 0xFE101 (MIRROR)
- m_rtc->read_1(space, 0);
+ m_rtc->read_1();
break;
// RESET
@@ -1741,7 +1741,7 @@ WRITE_LINE_MEMBER(rainbow_state::hdc_read_sector)
if (!m_hdc_write_gate) // do not read when WRITE GATE is on
{
- uint8_t sdh = (m_hdc->read(generic_space(), 0x06));
+ uint8_t sdh = (m_hdc->read(0x06));
int drv = (sdh & (8 + 16)) >> 3; // get DRIVE from SDH register
if ((state == 0) && (last_state == 1) && (drv == 0))
@@ -1750,9 +1750,9 @@ WRITE_LINE_MEMBER(rainbow_state::hdc_read_sector)
output().set_value("led1", 0);
switch_off_timer->adjust(attotime::from_msec(500));
- int hi = (m_hdc->read(generic_space(), 0x05)) & 0x07;
- uint16_t cylinder = (m_hdc->read(generic_space(), 0x04)) | (hi << 8);
- uint8_t sector_number = m_hdc->read(generic_space(), 0x03);
+ int hi = (m_hdc->read(0x05)) & 0x07;
+ uint16_t cylinder = (m_hdc->read(0x04)) | (hi << 8);
+ uint8_t sector_number = m_hdc->read(0x03);
hard_disk_file *local_hard_disk;
local_hard_disk = rainbow_hdc_file(0); // one hard disk for now.
@@ -1812,7 +1812,7 @@ WRITE_LINE_MEMBER(rainbow_state::hdc_write_sector)
else
m_hdc_write_gate = true;
- int drv = ((m_hdc->read(generic_space(), 0x06)) & (8 + 16)) >> 3; // get DRIVE from SDH register
+ int drv = ((m_hdc->read(0x06)) & (8 + 16)) >> 3; // get DRIVE from SDH register
if (state == 0 && wg_last == 1 && drv == 0) // Check correct state transition and DRIVE 0 ....
{
@@ -1866,13 +1866,13 @@ int rainbow_state::do_write_sector()
feedback = 10;
output().set_value("led1", 1); // OFF
- uint8_t sdh = (m_hdc->read(generic_space(), 0x06));
+ uint8_t sdh = (m_hdc->read(0x06));
- int hi = (m_hdc->read(generic_space(), 0x05)) & 0x07;
- uint16_t cylinder = (m_hdc->read(generic_space(), 0x04)) | (hi << 8);
+ int hi = (m_hdc->read(0x05)) & 0x07;
+ uint16_t cylinder = (m_hdc->read(0x04)) | (hi << 8);
- int sector_number = m_hdc->read(generic_space(), 0x03);
- int sector_count = m_hdc->read(generic_space(), 0x02); // (1 = single sector)
+ int sector_number = m_hdc->read(0x03);
+ int sector_count = m_hdc->read(0x02); // (1 = single sector)
if (!(cylinder <= info->cylinders && // filter invalid cylinders
SECTOR_SIZES[(sdh >> 5) & 0x03] == info->sectorbytes // 512, may not vary
@@ -1943,7 +1943,7 @@ READ8_MEMBER(rainbow_state::hd_status_68_r)
data = 0xa0; // A0 : OK, DRIVE IS READY (!)
int my_offset = 0x07;
- int stat = m_hdc->read(space, my_offset);
+ int stat = m_hdc->read(my_offset);
// logerror("(x68) WD1010 register %04x (STATUS) read, result : %04x\n", my_offset, stat);
// NOTE: SEEK COMPLETE IS CURRENTLY HARD WIRED / NOT FULLY EMULATED -
@@ -2043,14 +2043,14 @@ positioned over cylinder 0 (the data track furthest away from the spindle).
*/
READ8_MEMBER(rainbow_state::hd_status_69_r)
{
- int hs = m_hdc->read(space, 0x06) & (1 + 2 + 4); // SDH bits 0-2 = HEAD #
+ int hs = m_hdc->read(0x06) & (1 + 2 + 4); // SDH bits 0-2 = HEAD #
// logerror("(x69 READ) %i = HEAD SELECT WD1010\n", hs);
uint8_t data = (hs << 1);
// DRIVE SELECT: 2 bits in SDH register of WDx010 could address 4 drives.
// External circuit supports 1 drive here (DRIVE 0 selected or deselected)
- int drv = ((m_hdc->read(space, 0x06) >> 3) & 0x01); // 0x03 gives error R6 with DIAG.DISK
+ int drv = ((m_hdc->read(0x06) >> 3) & 0x01); // 0x03 gives error R6 with DIAG.DISK
if (drv == 0)
data |= 1; // logerror("(x69 READ) %i = _DRIVE # 0_ SELECT! \n", drv);
@@ -2064,7 +2064,7 @@ READ8_MEMBER(rainbow_state::hd_status_69_r)
data |= 64;
// Fake TRACK 0 signal (normally FROM DRIVE)
- if ((m_hdc->read(space, 0x04) == 0) && (m_hdc->read(space, 0x05) == 0)) // CYL.LO - CYL.HI
+ if ((m_hdc->read(0x04) == 0) && (m_hdc->read(0x05) == 0)) // CYL.LO - CYL.HI
data |= 128; // logerror("(x69 READ) TRACK 00 detected\n");
return data;
@@ -2947,11 +2947,8 @@ READ8_MEMBER(rainbow_state::GDC_EXTRA_REGISTER_r)
break;
case 6:
- data = m_hgdc->read(space, offset & 0x00);
- break;
-
case 7:
- data = m_hgdc->read(space, offset & 0x01);
+ data = m_hgdc->read(offset & 0x01);
break;
default:
@@ -3169,7 +3166,7 @@ WRITE8_MEMBER(rainbow_state::GDC_EXTRA_REGISTER_w)
case 6:
case 7:
- m_hgdc->write(space, offset & 0x01, data);
+ m_hgdc->write(offset & 0x01, data);
break;
} // switch
@@ -3200,26 +3197,26 @@ void rainbow_state::upd7220_map(address_map &map)
map(0x00000, 0x3ffff).rw(FUNC(rainbow_state::vram_r), FUNC(rainbow_state::vram_w)).share("vram");
}
-MACHINE_CONFIG_START(rainbow_state::rainbow)
+void rainbow_state::rainbow(machine_config &config)
+{
config.set_default_layout(layout_rainbow);
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", I8088, 24.0734_MHz_XTAL / 5) // approximately 4.815 MHz
- MCFG_DEVICE_PROGRAM_MAP(rainbow8088_map)
- MCFG_DEVICE_IO_MAP(rainbow8088_io)
- MCFG_DEVICE_IRQ_ACKNOWLEDGE_DRIVER(rainbow_state, irq_callback)
+ I8088(config, m_i8088, 24.0734_MHz_XTAL / 5); // approximately 4.815 MHz
+ m_i8088->set_addrmap(AS_PROGRAM, &rainbow_state::rainbow8088_map);
+ m_i8088->set_addrmap(AS_IO, &rainbow_state::rainbow8088_io);
+ m_i8088->set_irq_acknowledge_callback(FUNC(rainbow_state::irq_callback));
- MCFG_DEVICE_ADD("subcpu", Z80, 24.0734_MHz_XTAL / 6)
- MCFG_DEVICE_PROGRAM_MAP(rainbowz80_mem)
- MCFG_DEVICE_IO_MAP(rainbowz80_io)
+ Z80(config, m_z80, 24.0734_MHz_XTAL / 6);
+ m_z80->set_addrmap(AS_PROGRAM, &rainbow_state::rainbowz80_mem);
+ m_z80->set_addrmap(AS_IO, &rainbow_state::rainbowz80_io);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_RAW_PARAMS(24.0734_MHz_XTAL / 6, 442, 0, 400, 264, 0, 240) // ~NTSC compatible video timing (?)
-
- MCFG_SCREEN_UPDATE_DRIVER(rainbow_state, screen_update_rainbow)
- MCFG_SCREEN_PALETTE("vt100_video:palette")
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "vt100_video:palette", gfx_rainbow)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_raw(24.0734_MHz_XTAL / 6, 442, 0, 400, 264, 0, 240); // ~NTSC compatible video timing (?)
+ screen.set_screen_update(FUNC(rainbow_state::screen_update_rainbow));
+ screen.set_palette("vt100_video:palette");
+ GFXDECODE(config, "gfxdecode", "vt100_video:palette", gfx_rainbow);
RAINBOW_VIDEO(config, m_crtc, 24.0734_MHz_XTAL);
m_crtc->set_screen("screen");
@@ -3233,31 +3230,31 @@ MACHINE_CONFIG_START(rainbow_state::rainbow)
m_hgdc->vsync_wr_callback().set(FUNC(rainbow_state::GDC_vblank_irq)); // "The vsync callback line needs to be below the 7220 DEVICE_ADD line."
m_hgdc->set_addrmap(0, &rainbow_state::upd7220_map);
- m_hgdc->set_display_pixels_callback(FUNC(rainbow_state::hgdc_display_pixels), this);
+ m_hgdc->set_display_pixels(FUNC(rainbow_state::hgdc_display_pixels));
m_hgdc->set_screen(m_screen2); // set_screen needs to be added after 7720 device in the machine config, not after the screen.
- MCFG_PALETTE_ADD("palette2", 32)
+ PALETTE(config, m_palette2).set_entries(32);
- MCFG_SCREEN_ADD("screen2", RASTER)
- MCFG_SCREEN_VIDEO_ATTRIBUTES(VIDEO_UPDATE_AFTER_VBLANK | VIDEO_ALWAYS_UPDATE)
+ SCREEN(config, m_screen2, SCREEN_TYPE_RASTER);
+ m_screen2->set_video_attributes(VIDEO_UPDATE_AFTER_VBLANK | VIDEO_ALWAYS_UPDATE);
// VR241 color monitor is specified for 20 MHz bandwidth ( 60 Hz / 15.72 kHz horizontal rate )
// - sufficient for 800 x 240 non-interlaced at 60 Hz (non interlaced).
- //MCFG_SCREEN_RAW_PARAMS(31188000 / 2 , 992, 0, 800, 262, 0, 240)
+ //m_screen2->set_raw(31188000 / 2 , 992, 0, 800, 262, 0, 240);
// Alternate configuration:
- MCFG_SCREEN_RAW_PARAMS(31188000 / 4 , 496, 0, 400, 262, 0, 240)
+ m_screen2->set_raw(31188000 / 4 , 496, 0, 400, 262, 0, 240);
- MCFG_SCREEN_UPDATE_DEVICE("upd7220", upd7220_device, screen_update)
+ m_screen2->set_screen_update("upd7220", FUNC(upd7220_device::screen_update));
FD1793(config, m_fdc, 24.0734_MHz_XTAL / 24); // no separate 1 Mhz quartz
- MCFG_FLOPPY_DRIVE_ADD(FD1793_TAG ":0", rainbow_floppies, "525qd", rainbow_state::floppy_formats)
- MCFG_FLOPPY_DRIVE_ADD(FD1793_TAG ":1", rainbow_floppies, "525qd", rainbow_state::floppy_formats)
- MCFG_FLOPPY_DRIVE_ADD(FD1793_TAG ":2", rainbow_floppies, "525qd", rainbow_state::floppy_formats)
- MCFG_FLOPPY_DRIVE_ADD(FD1793_TAG ":3", rainbow_floppies, "525qd", rainbow_state::floppy_formats)
- //MCFG_FLOPPY_DRIVE_ADD(FD1793_TAG ":2", rainbow_floppies, "525dd", rainbow_state::floppy_formats)
- //MCFG_FLOPPY_DRIVE_ADD(FD1793_TAG ":3", rainbow_floppies, "35dd", rainbow_state::floppy_formats)
- MCFG_SOFTWARE_LIST_ADD("flop_list", "rainbow")
+ FLOPPY_CONNECTOR(config, FD1793_TAG ":0", rainbow_floppies, "525qd", rainbow_state::floppy_formats);
+ FLOPPY_CONNECTOR(config, FD1793_TAG ":1", rainbow_floppies, "525qd", rainbow_state::floppy_formats);
+ FLOPPY_CONNECTOR(config, FD1793_TAG ":2", rainbow_floppies, "525qd", rainbow_state::floppy_formats);
+ FLOPPY_CONNECTOR(config, FD1793_TAG ":3", rainbow_floppies, "525qd", rainbow_state::floppy_formats);
+ //FLOPPY_CONNECTOR(config, FD1793_TAG ":2", rainbow_floppies, "525dd", rainbow_state::floppy_formats);
+ //FLOPPY_CONNECTOR(config, FD1793_TAG ":3", rainbow_floppies, "35dd", rainbow_state::floppy_formats);
+ SOFTWARE_LIST(config, "flop_list").set_original("rainbow");
/// ********************************* HARD DISK CONTROLLER *****************************************
WD2010(config, m_hdc, 5000000); // 10 Mhz quartz on controller (divided by 2 for WCLK)
@@ -3280,18 +3277,14 @@ MACHINE_CONFIG_START(rainbow_state::rainbow)
m_hdc->in_sc_callback().set_constant(1); // SEEK COMPLETE (VCC = complete)
m_hdc->in_tk000_callback().set_constant(1); // TRACK 00 signal (= from drive)
- MCFG_HARDDISK_ADD("decharddisk1")
+ HARDDISK(config, "decharddisk1");
/// ******************************** / HARD DISK CONTROLLER ****************************************
- MCFG_DEVICE_ADD("corvus", CORVUS_HDC, 0)
- MCFG_HARDDISK_ADD("harddisk1")
- MCFG_HARDDISK_INTERFACE("corvus_hdd")
- MCFG_HARDDISK_ADD("harddisk2")
- MCFG_HARDDISK_INTERFACE("corvus_hdd")
- MCFG_HARDDISK_ADD("harddisk3")
- MCFG_HARDDISK_INTERFACE("corvus_hdd")
- MCFG_HARDDISK_ADD("harddisk4")
- MCFG_HARDDISK_INTERFACE("corvus_hdd")
+ CORVUS_HDC(config, m_corvus_hdc, 0);
+ HARDDISK(config, "harddisk1", "corvus_hdd");
+ HARDDISK(config, "harddisk2", "corvus_hdd");
+ HARDDISK(config, "harddisk3", "corvus_hdd");
+ HARDDISK(config, "harddisk4", "corvus_hdd");
DS1315(config, m_rtc, 0); // DS1315 (ClikClok for DEC-100 B) * OPTIONAL *
@@ -3335,10 +3328,10 @@ MACHINE_CONFIG_START(rainbow_state::rainbow)
prtbrg.set_stages(8);
prtbrg.count_out_cb().set(FUNC(rainbow_state::bitrate_counter_w));
- MCFG_TIMER_DRIVER_ADD_PERIODIC("motor", rainbow_state, hd_motor_tick, attotime::from_hz(60))
+ TIMER(config, "motor").configure_periodic(FUNC(rainbow_state::hd_motor_tick), attotime::from_hz(60));
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
-MACHINE_CONFIG_END
+}
//----------------------------------------------------------------------------------------
// 'Rainbow 100-A' (system module 70-19974-00, PSU H7842-A)
diff --git a/src/mame/drivers/rampart.cpp b/src/mame/drivers/rampart.cpp
index be3258d26c3..4d414967a9a 100644
--- a/src/mame/drivers/rampart.cpp
+++ b/src/mame/drivers/rampart.cpp
@@ -338,11 +338,11 @@ GFXDECODE_END
*
*************************************/
-MACHINE_CONFIG_START(rampart_state::rampart)
-
+void rampart_state::rampart(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M68000, MASTER_CLOCK/2)
- MCFG_DEVICE_PROGRAM_MAP(main_map)
+ M68000(config, m_maincpu, MASTER_CLOCK/2);
+ m_maincpu->set_addrmap(AS_PROGRAM, &rampart_state::main_map);
SLAPSTIC(config, m_slapstic_device, 118, true);
@@ -351,30 +351,28 @@ MACHINE_CONFIG_START(rampart_state::rampart)
WATCHDOG_TIMER(config, "watchdog").set_vblank_count(m_screen, 8);
/* video hardware */
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_rampart)
+ GFXDECODE(config, m_gfxdecode, "palette", gfx_rampart);
PALETTE(config, "palette").set_format(palette_device::IRGB_1555, 512).set_membits(8);
ATARI_MOTION_OBJECTS(config, m_mob, 0, m_screen, rampart_state::s_mob_config);
m_mob->set_gfxdecode(m_gfxdecode);
- MCFG_SCREEN_ADD(m_screen, RASTER)
- MCFG_SCREEN_VIDEO_ATTRIBUTES(VIDEO_UPDATE_BEFORE_VBLANK)
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_video_attributes(VIDEO_UPDATE_BEFORE_VBLANK);
/* note: these parameters are from published specs, not derived */
/* the board uses an SOS-2 chip to generate video signals */
- MCFG_SCREEN_RAW_PARAMS(MASTER_CLOCK/2, 456, 0+12, 336+12, 262, 0, 240)
- MCFG_SCREEN_UPDATE_DRIVER(rampart_state, screen_update_rampart)
- MCFG_SCREEN_PALETTE("palette")
- MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE(*this, rampart_state, video_int_write_line))
+ m_screen->set_raw(MASTER_CLOCK/2, 456, 0+12, 336+12, 262, 0, 240);
+ m_screen->set_screen_update(FUNC(rampart_state::screen_update_rampart));
+ m_screen->set_palette("palette");
+ m_screen->screen_vblank().set(FUNC(rampart_state::video_int_write_line));
/* sound hardware */
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("oki", OKIM6295, MASTER_CLOCK/4/3, okim6295_device::PIN7_LOW)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.60)
+ OKIM6295(config, m_oki, MASTER_CLOCK/4/3, okim6295_device::PIN7_LOW).add_route(ALL_OUTPUTS, "mono", 0.60);
- MCFG_DEVICE_ADD("ymsnd", YM2413, MASTER_CLOCK/4)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
-MACHINE_CONFIG_END
+ YM2413(config, m_ym2413, MASTER_CLOCK/4).add_route(ALL_OUTPUTS, "mono", 1.0);
+}
diff --git a/src/mame/drivers/ramtek.cpp b/src/mame/drivers/ramtek.cpp
index 5dfa5b77d83..b87e632ee69 100644
--- a/src/mame/drivers/ramtek.cpp
+++ b/src/mame/drivers/ramtek.cpp
@@ -110,20 +110,21 @@ void ramtek_state::video_start()
{
}
-MACHINE_CONFIG_START(ramtek_state::ramtek)
-
+void ramtek_state::ramtek(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", NETLIST_CPU, NETLIST_CLOCK)
- MCFG_NETLIST_SETUP(ramtek)
+ NETLIST_CPU(config, m_maincpu, NETLIST_CLOCK);
+ m_maincpu->set_constructor(netlist_ramtek);
/* video hardware */
- MCFG_FIXFREQ_ADD("fixfreq", "screen")
- MCFG_FIXFREQ_MONITOR_CLOCK(MASTER_CLOCK)
- MCFG_FIXFREQ_HORZ_PARAMS(H_TOTAL-67,H_TOTAL-40,H_TOTAL-8,H_TOTAL)
- MCFG_FIXFREQ_VERT_PARAMS(V_TOTAL-22,V_TOTAL-19,V_TOTAL-12,V_TOTAL)
- MCFG_FIXFREQ_FIELDCOUNT(1)
- MCFG_FIXFREQ_SYNC_THRESHOLD(0.30)
-MACHINE_CONFIG_END
+ SCREEN(config, "screen", SCREEN_TYPE_RASTER);
+ FIXFREQ(config, m_video).set_screen("screen");
+ m_video->set_monitor_clock(MASTER_CLOCK);
+ m_video->set_horz_params(H_TOTAL-67,H_TOTAL-40,H_TOTAL-8,H_TOTAL);
+ m_video->set_vert_params(V_TOTAL-22,V_TOTAL-19,V_TOTAL-12,V_TOTAL);
+ m_video->set_fieldcount(1);
+ m_video->set_threshold(0.30);
+}
/***************************************************************************
diff --git a/src/mame/drivers/rastan.cpp b/src/mame/drivers/rastan.cpp
index 55e0f454b82..66367df97c9 100644
--- a/src/mame/drivers/rastan.cpp
+++ b/src/mame/drivers/rastan.cpp
@@ -184,7 +184,7 @@ WRITE_LINE_MEMBER(rastan_state::rastan_msm5205_vck)
if (m_adpcm_ff)
{
- m_adpcm_sel->write_ba(m_adpcm_data[m_adpcm_pos]);
+ m_adpcm_sel->ba_w(m_adpcm_data[m_adpcm_pos]);
m_adpcm_pos = (m_adpcm_pos + 1) & 0xffff;
}
}
@@ -365,28 +365,28 @@ void rastan_state::machine_reset()
}
-MACHINE_CONFIG_START(rastan_state::rastan)
-
+void rastan_state::rastan(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M68000, XTAL(16'000'000)/2) /* verified on pcb */
- MCFG_DEVICE_PROGRAM_MAP(rastan_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", rastan_state, irq5_line_hold)
+ M68000(config, m_maincpu, XTAL(16'000'000)/2); /* verified on pcb */
+ m_maincpu->set_addrmap(AS_PROGRAM, &rastan_state::rastan_map);
+ m_maincpu->set_vblank_int("screen", FUNC(rastan_state::irq5_line_hold));
- MCFG_DEVICE_ADD("audiocpu", Z80, XTAL(16'000'000)/4) /* verified on pcb */
- MCFG_DEVICE_PROGRAM_MAP(rastan_s_map)
+ Z80(config, m_audiocpu, XTAL(16'000'000)/4); /* verified on pcb */
+ m_audiocpu->set_addrmap(AS_PROGRAM, &rastan_state::rastan_s_map);
- MCFG_QUANTUM_TIME(attotime::from_hz(600)) /* 10 CPU slices per frame - enough for the sound CPU to read all commands */
+ config.m_minimum_quantum = attotime::from_hz(600); /* 10 CPU slices per frame - enough for the sound CPU to read all commands */
WATCHDOG_TIMER(config, "watchdog");
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(40*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 40*8-1, 1*8, 31*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(rastan_state, screen_update_rastan)
- MCFG_SCREEN_PALETTE("palette")
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(40*8, 32*8);
+ screen.set_visarea(0*8, 40*8-1, 1*8, 31*8-1);
+ screen.set_screen_update(FUNC(rastan_state::screen_update_rastan));
+ screen.set_palette("palette");
GFXDECODE(config, "gfxdecode", "palette", gfx_rastan);
PALETTE(config, "palette").set_format(palette_device::xBGR_555, 2048);
@@ -408,18 +408,18 @@ MACHINE_CONFIG_START(rastan_state::rastan)
ymsnd.add_route(0, "mono", 0.50);
ymsnd.add_route(1, "mono", 0.50);
- MCFG_DEVICE_ADD("msm", MSM5205, XTAL(384'000)) /* verified on pcb */
- MCFG_MSM5205_VCLK_CB(WRITELINE(*this, rastan_state, rastan_msm5205_vck)) /* VCK function */
- MCFG_MSM5205_PRESCALER_SELECTOR(S48_4B) /* 8 kHz */
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.60)
+ MSM5205(config, m_msm, XTAL(384'000)); /* verified on pcb */
+ m_msm->vck_legacy_callback().set(FUNC(rastan_state::rastan_msm5205_vck)); /* VCK function */
+ m_msm->set_prescaler_selector(msm5205_device::S48_4B); /* 8 kHz */
+ m_msm->add_route(ALL_OUTPUTS, "mono", 0.60);
LS157(config, m_adpcm_sel, 0);
- m_adpcm_sel->out_callback().set("msm", FUNC(msm5205_device::data_w));
+ m_adpcm_sel->out_callback().set(m_msm, FUNC(msm5205_device::data_w));
pc060ha_device &ciu(PC060HA(config, "ciu", 0));
ciu.set_master_tag(m_maincpu);
ciu.set_slave_tag(m_audiocpu);
-MACHINE_CONFIG_END
+}
diff --git a/src/mame/drivers/rastersp.cpp b/src/mame/drivers/rastersp.cpp
index 3161972b8e6..411c4cdff64 100644
--- a/src/mame/drivers/rastersp.cpp
+++ b/src/mame/drivers/rastersp.cpp
@@ -920,7 +920,6 @@ void rastersp_state::rastersp(machine_config &config)
m_rdac->add_route(ALL_OUTPUTS, "rspeaker", 0.5); // unknown DAC
voltage_regulator_device &vreg(VOLTAGE_REGULATOR(config, "vref"));
- vreg.set_output(5.0);
vreg.add_route(0, "ldac", 1.0, DAC_VREF_POS_INPUT);
vreg.add_route(0, "rdac", 1.0, DAC_VREF_POS_INPUT);
vreg.add_route(0, "ldac", -1.0, DAC_VREF_NEG_INPUT);
@@ -954,6 +953,24 @@ ROM_START( rotr )
ROM_END
+ROM_START( rotra )
+ ROM_REGION(0x100000, "bios", 0)
+ ROM_LOAD( "rasterspeed2.1_bootrom4.u10", 0x00000, 0x10000, CRC(6da142d1) SHA1(e2dbd479034677726fc26fd1ba85c4458d89286c) )
+
+ ROM_REGION(0x1000000, "dspboot", 0)
+ ROM_LOAD32_BYTE( "rasterspeed2.1_bootrom4.u10", 0x00000, 0x10000, CRC(6da142d1) SHA1(e2dbd479034677726fc26fd1ba85c4458d89286c) )
+
+ ROM_REGION(0x8000, "proms", 0) /* Xilinx FPGA PROMs */
+ ROM_LOAD( "17128dpc.u72", 0x0000, 0x4000, CRC(5ddf6ee3) SHA1(f3d15b649b5641374a9e14877cea84ba9c57ef3c) )
+ ROM_LOAD( "17128dpc.u73", 0x2000, 0x4000, CRC(9e274cea) SHA1(e974cad4e4b965bf2c9df7d3d0b4eec64629eeb0) )
+
+ ROM_REGION(0x8000, "nvram", 0) /* Default NVRAM */
+ ROM_LOAD( "rotr.nv", 0x0000, 0x8000, CRC(62543517) SHA1(a4bf3431cdab956839bb155c4a8c140d30e5c7ec) )
+
+ DISK_REGION( "scsibus:0:harddisk:image" )
+ DISK_IMAGE( "rotra", 0, SHA1(570d402e5e9bba123edf7dfa9db7a0e6bdb23823) )
+ROM_END
+
/*
Football Crazy runs on the (c)1997 "RASTERSPEED 2.1 31-599-001 ISS 4" PCB, which seems to be a more modern production version.
a PCB photo with the rom sticker showing the text below has also been seen
@@ -991,5 +1008,6 @@ ROM_END
*
*************************************/
-GAME( 1994, rotr, 0, rastersp, rotr, rastersp_state, empty_init, ROT0, "BFM/Mirage", "Rise of the Robots (prototype)", 0 )
-GAME( 1997, fbcrazy, 0, rastersp, rotr, rastersp_state, empty_init, ROT0, "BFM", "Football Crazy (Video Quiz)", MACHINE_NOT_WORKING )
+GAME( 1994, rotr, 0, rastersp, rotr, rastersp_state, empty_init, ROT0, "BFM/Mirage", "Rise of the Robots (prototype)", 0 )
+GAME( 1994, rotra, rotr, rastersp, rotr, rastersp_state, empty_init, ROT0, "BFM/Mirage", "Rise of the Robots (prototype, older)", 0 )
+GAME( 1997, fbcrazy, 0, rastersp, rotr, rastersp_state, empty_init, ROT0, "BFM", "Football Crazy (Video Quiz)", MACHINE_NOT_WORKING )
diff --git a/src/mame/drivers/ravens.cpp b/src/mame/drivers/ravens.cpp
index 38ea7c159e1..b564fd76a0b 100644
--- a/src/mame/drivers/ravens.cpp
+++ b/src/mame/drivers/ravens.cpp
@@ -196,7 +196,7 @@ WRITE8_MEMBER( ravens_state::port1b_w )
else
data = m_term_char;
- m_terminal->write(space, 0, data);
+ m_terminal->write(data);
}
WRITE8_MEMBER( ravens_state::port1c_w )
@@ -351,8 +351,8 @@ void ravens_state::ravens(machine_config &config)
config.set_default_layout(layout_ravens);
/* quickload */
- quickload_image_device &quickload(QUICKLOAD(config, "quickload", 0));
- quickload.set_handler(snapquick_load_delegate(&QUICKLOAD_LOAD_NAME(ravens_state, ravens), this), "pgm", 1);
+ quickload_image_device &quickload(QUICKLOAD(config, "quickload"));
+ quickload.set_handler(snapquick_load_delegate(&QUICKLOAD_LOAD_NAME(ravens_state, ravens), this), "pgm", attotime::from_seconds(1));
/* cassette */
CASSETTE(config, m_cass);
@@ -376,8 +376,8 @@ void ravens_state::ravens2(machine_config &config)
m_terminal->set_keyboard_callback(FUNC(ravens_state::kbd_put));
/* quickload */
- quickload_image_device &quickload(QUICKLOAD(config, "quickload", 0));
- quickload.set_handler(snapquick_load_delegate(&QUICKLOAD_LOAD_NAME(ravens_state, ravens), this), "pgm", 1);
+ quickload_image_device &quickload(QUICKLOAD(config, "quickload"));
+ quickload.set_handler(snapquick_load_delegate(&QUICKLOAD_LOAD_NAME(ravens_state, ravens), this), "pgm", attotime::from_seconds(1));
/* cassette */
CASSETTE(config, m_cass);
diff --git a/src/mame/drivers/rbisland.cpp b/src/mame/drivers/rbisland.cpp
index 38a9e8f2cc8..e3bdc534b22 100644
--- a/src/mame/drivers/rbisland.cpp
+++ b/src/mame/drivers/rbisland.cpp
@@ -653,15 +653,15 @@ WRITE8_MEMBER(rbisland_state::counters_w)
machine().bookkeeping().coin_counter_w(0, data & 0x10);
}
-MACHINE_CONFIG_START(rbisland_state::rbisland)
-
+void rbisland_state::rbisland(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M68000, XTAL(16'000'000)/2) /* verified on pcb */
- MCFG_DEVICE_PROGRAM_MAP(rbisland_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", rbisland_state, interrupt)
+ M68000(config, m_maincpu, XTAL(16'000'000)/2); /* verified on pcb */
+ m_maincpu->set_addrmap(AS_PROGRAM, &rbisland_state::rbisland_map);
+ m_maincpu->set_vblank_int("screen", FUNC(rbisland_state::interrupt));
- MCFG_DEVICE_ADD("audiocpu", Z80, XTAL(16'000'000)/4) /* verified on pcb */
- MCFG_DEVICE_PROGRAM_MAP(rbisland_sound_map)
+ Z80(config, m_audiocpu, XTAL(16'000'000)/4); /* verified on pcb */
+ m_audiocpu->set_addrmap(AS_PROGRAM, &rbisland_state::rbisland_sound_map);
TAITO_CCHIP(config, m_cchip, 12_MHz_XTAL); // 12MHz OSC next to C-Chip
m_cchip->in_pa_callback().set_ioport("800007");
@@ -670,18 +670,18 @@ MACHINE_CONFIG_START(rbisland_state::rbisland)
m_cchip->in_ad_callback().set_ioport("80000D");
m_cchip->out_pb_callback().set(FUNC(rbisland_state::counters_w));
- MCFG_TIMER_DRIVER_ADD("cchip_irq_clear", rbisland_state, cchip_irq_clear_cb)
+ TIMER(config, m_cchip_irq_clear).configure_generic(FUNC(rbisland_state::cchip_irq_clear_cb));
- MCFG_QUANTUM_TIME(attotime::from_hz(600)) /* 10 CPU slices per frame - enough for the sound CPU to read all commands */
+ config.m_minimum_quantum = attotime::from_hz(600); /* 10 CPU slices per frame - enough for the sound CPU to read all commands */
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(40*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 40*8-1, 2*8, 30*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(rbisland_state, screen_update_rainbow)
- MCFG_SCREEN_PALETTE(m_palette)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(40*8, 32*8);
+ screen.set_visarea(0*8, 40*8-1, 2*8, 30*8-1);
+ screen.set_screen_update(FUNC(rbisland_state::screen_update_rainbow));
+ screen.set_palette(m_palette);
GFXDECODE(config, m_gfxdecode, m_palette, gfx_rbisland);
PALETTE(config, m_palette).set_format(palette_device::xBGR_555, 2048);
@@ -706,31 +706,31 @@ MACHINE_CONFIG_START(rbisland_state::rbisland)
pc060ha_device &ciu(PC060HA(config, "ciu", 0));
ciu.set_master_tag(m_maincpu);
ciu.set_slave_tag(m_audiocpu);
-MACHINE_CONFIG_END
+}
/* Jumping: The PCB has 2 Xtals, 18.432MHz and 24MHz */
-MACHINE_CONFIG_START(rbisland_state::jumping)
-
+void rbisland_state::jumping(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M68000, XTAL(18'432'000)/2) /* verified on pcb */
- MCFG_DEVICE_PROGRAM_MAP(jumping_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", rbisland_state, irq4_line_hold)
+ M68000(config, m_maincpu, XTAL(18'432'000)/2); /* verified on pcb */
+ m_maincpu->set_addrmap(AS_PROGRAM, &rbisland_state::jumping_map);
+ m_maincpu->set_vblank_int("screen", FUNC(rbisland_state::irq4_line_hold));
- MCFG_DEVICE_ADD("audiocpu", Z80, XTAL(24'000'000)/4) /* verified on pcb */
- MCFG_DEVICE_PROGRAM_MAP(jumping_sound_map)
+ Z80(config, m_audiocpu, XTAL(24'000'000)/4); /* verified on pcb */
+ m_audiocpu->set_addrmap(AS_PROGRAM, &rbisland_state::jumping_sound_map);
- MCFG_QUANTUM_TIME(attotime::from_hz(600)) /* 10 CPU slices per frame - enough unless otherwise */
+ config.m_minimum_quantum = attotime::from_hz(600); /* 10 CPU slices per frame - enough unless otherwise */
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(40*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 40*8-1, 2*8, 30*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(rbisland_state, screen_update_jumping)
- MCFG_SCREEN_PALETTE(m_palette)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(40*8, 32*8);
+ screen.set_visarea(0*8, 40*8-1, 2*8, 30*8-1);
+ screen.set_screen_update(FUNC(rbisland_state::screen_update_jumping));
+ screen.set_palette(m_palette);
GFXDECODE(config, m_gfxdecode, m_palette, gfx_jumping);
PALETTE(config, m_palette).set_format(palette_device::xBGR_444, 2048);
@@ -745,21 +745,18 @@ MACHINE_CONFIG_START(rbisland_state::jumping)
/* sound hardware */
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("ym1", YM2203, XTAL(24'000'000)/8) /* verified on pcb */
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.30)
+ YM2203(config, "ym1", XTAL(24'000'000)/8).add_route(ALL_OUTPUTS, "mono", 0.30); /* verified on pcb */
- MCFG_DEVICE_ADD("ym2", YM2203, XTAL(24'000'000)/8) /* verified on pcb */
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.30)
-MACHINE_CONFIG_END
+ YM2203(config, "ym2", XTAL(24'000'000)/8).add_route(ALL_OUTPUTS, "mono", 0.30); /* verified on pcb */
+}
/* Imnoe PCB uses 16MHz CPU crystal instead of 18.432 for CPU */
-MACHINE_CONFIG_START(rbisland_state::jumpingi)
+void rbisland_state::jumpingi(machine_config &config)
+{
jumping(config);
- MCFG_DEVICE_REPLACE("maincpu", M68000, XTAL(16'000'000)/2) /* verified on pcb */
- MCFG_DEVICE_PROGRAM_MAP(jumping_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", rbisland_state, irq4_line_hold)
-MACHINE_CONFIG_END
+ m_maincpu->set_clock(XTAL(16'000'000)/2); /* verified on pcb */
+}
/***************************************************************************
DRIVERS
diff --git a/src/mame/drivers/rbmk.cpp b/src/mame/drivers/rbmk.cpp
index dc15e500eb0..e462f197e72 100644
--- a/src/mame/drivers/rbmk.cpp
+++ b/src/mame/drivers/rbmk.cpp
@@ -214,7 +214,7 @@ READ8_MEMBER(rbmk_state::mcu_io_r)
{
if(m_mux_data & 8)
{
- return m_ymsnd->read(space, offset & 1);
+ return m_ymsnd->read(offset & 1);
}
else if(m_mux_data & 4)
{
@@ -230,7 +230,7 @@ READ8_MEMBER(rbmk_state::mcu_io_r)
WRITE8_MEMBER(rbmk_state::mcu_io_w)
{
- if(m_mux_data & 8) { m_ymsnd->write(space, offset & 1, data); }
+ if(m_mux_data & 8) { m_ymsnd->write(offset & 1, data); }
else if(m_mux_data & 4)
{
//printf("%02x %02x W\n",offset,data);
@@ -565,10 +565,11 @@ uint32_t rbmk_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap,
return 0;
}
-MACHINE_CONFIG_START(rbmk_state::rbmk)
- MCFG_DEVICE_ADD("maincpu", M68000, 22000000 /2)
- MCFG_DEVICE_PROGRAM_MAP(rbmk_mem)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", rbmk_state, irq1_line_hold)
+void rbmk_state::rbmk(machine_config &config)
+{
+ M68000(config, m_maincpu, 22000000 /2);
+ m_maincpu->set_addrmap(AS_PROGRAM, &rbmk_state::rbmk_mem);
+ m_maincpu->set_vblank_int("screen", FUNC(rbmk_state::irq1_line_hold));
AT89C4051(config, m_mcu, 22000000 / 4); // frequency isn't right
m_mcu->set_addrmap(AS_PROGRAM, &rbmk_state::mcu_mem);
@@ -577,13 +578,13 @@ MACHINE_CONFIG_START(rbmk_state::rbmk)
GFXDECODE(config, m_gfxdecode, m_palette, gfx_rbmk);
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(58)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(64*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 64*8-1, 0*8, 32*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(rbmk_state, screen_update)
- MCFG_SCREEN_PALETTE(m_palette)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(58);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(64*8, 32*8);
+ screen.set_visarea(0*8, 64*8-1, 0*8, 32*8-1);
+ screen.set_screen_update(FUNC(rbmk_state::screen_update));
+ screen.set_palette(m_palette);
PALETTE(config, m_palette).set_format(palette_device::xBGR_555, 0x800);
@@ -592,25 +593,24 @@ MACHINE_CONFIG_START(rbmk_state::rbmk)
SPEAKER(config, "lspeaker").front_left();
SPEAKER(config, "rspeaker").front_right();
- MCFG_DEVICE_ADD("oki", OKIM6295, 1122000, okim6295_device::PIN7_HIGH) // clock frequency & pin 7 not verified
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 0.47)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 0.47)
+ okim6295_device &oki(OKIM6295(config, "oki", 1122000, okim6295_device::PIN7_HIGH)); // clock frequency & pin 7 not verified
+ oki.add_route(ALL_OUTPUTS, "lspeaker", 0.47);
+ oki.add_route(ALL_OUTPUTS, "rspeaker", 0.47);
YM2151(config, m_ymsnd, 22000000 / 8);
m_ymsnd->add_route(0, "lspeaker", 0.60);
m_ymsnd->add_route(1, "rspeaker", 0.60);
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(rbmk_state::rbspm)
+void rbmk_state::rbspm(machine_config &config)
+{
rbmk(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(rbspm_mem)
+ m_maincpu->set_addrmap(AS_PROGRAM, &rbmk_state::rbspm_mem);
- MCFG_DEVICE_MODIFY("mcu")
- MCFG_DEVICE_DISABLE() // until decapped
+ m_mcu->set_disable(); // until decapped
// PIC16F84 but no CPU core available
-MACHINE_CONFIG_END
+}
// 实战麻将王 (Shízhàn Májiàng Wáng)
ROM_START( rbmk )
diff --git a/src/mame/drivers/rc702.cpp b/src/mame/drivers/rc702.cpp
index 3f4984c0f63..65ae7b0dc50 100644
--- a/src/mame/drivers/rc702.cpp
+++ b/src/mame/drivers/rc702.cpp
@@ -331,7 +331,8 @@ static void floppies(device_slot_interface &device)
device.option_add("525qd", FLOPPY_525_QD);
}
-MACHINE_CONFIG_START(rc702_state::rc702)
+void rc702_state::rc702(machine_config &config)
+{
/* basic machine hardware */
Z80(config, m_maincpu, XTAL(8'000'000) / 2);
m_maincpu->set_addrmap(AS_PROGRAM, &rc702_state::rc702_mem);
@@ -358,8 +359,8 @@ MACHINE_CONFIG_START(rc702_state::rc702)
m_dma->out_eop_callback().set(FUNC(rc702_state::eop_w)).invert(); // real line is active low, mame has it backwards
m_dma->in_memr_callback().set(FUNC(rc702_state::memory_read_byte));
m_dma->out_memw_callback().set(FUNC(rc702_state::memory_write_byte));
- m_dma->in_ior_callback<1>().set(m_fdc, FUNC(upd765a_device::mdma_r));
- m_dma->out_iow_callback<1>().set(m_fdc, FUNC(upd765a_device::mdma_w));
+ m_dma->in_ior_callback<1>().set(m_fdc, FUNC(upd765a_device::dma_r));
+ m_dma->out_iow_callback<1>().set(m_fdc, FUNC(upd765a_device::dma_w));
m_dma->out_iow_callback<2>().set("crtc", FUNC(i8275_device::dack_w));
m_dma->out_iow_callback<3>().set("crtc", FUNC(i8275_device::dack_w));
m_dma->out_dack_callback<1>().set(FUNC(rc702_state::dack1_w));
@@ -367,8 +368,7 @@ MACHINE_CONFIG_START(rc702_state::rc702)
UPD765A(config, m_fdc, 8_MHz_XTAL, true, true);
m_fdc->intrq_wr_callback().set(m_ctc1, FUNC(z80ctc_device::trg3));
m_fdc->drq_wr_callback().set(m_dma, FUNC(am9517a_device::dreq1_w));
- MCFG_FLOPPY_DRIVE_ADD("fdc:0", floppies, "525qd", floppy_image_device::default_floppy_formats)
- MCFG_FLOPPY_DRIVE_SOUND(true)
+ FLOPPY_CONNECTOR(config, "fdc:0", floppies, "525qd", floppy_image_device::default_floppy_formats).enable_sound(true);
/* Keyboard */
generic_keyboard_device &keyboard(GENERIC_KEYBOARD(config, "keyboard", 0));
@@ -379,11 +379,11 @@ MACHINE_CONFIG_START(rc702_state::rc702)
m_7474->comp_output_cb().set(FUNC(rc702_state::qbar_w));
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(50)
- MCFG_SCREEN_SIZE(272*2, 200+4*8)
- MCFG_SCREEN_VISIBLE_AREA(0, 272*2-1, 0, 200-1)
- MCFG_SCREEN_UPDATE_DEVICE("crtc", i8275_device, screen_update)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(50);
+ screen.set_size(272*2, 200+4*8);
+ screen.set_visarea(0, 272*2-1, 0, 200-1);
+ screen.set_screen_update("crtc", FUNC(i8275_device::screen_update));
i8275_device &crtc(I8275(config, "crtc", 11640000/7));
crtc.set_character_width(7);
@@ -397,7 +397,7 @@ MACHINE_CONFIG_START(rc702_state::rc702)
/* sound hardware */
SPEAKER(config, "mono").front_center();
BEEP(config, m_beep, 1000).add_route(ALL_OUTPUTS, "mono", 0.50);
-MACHINE_CONFIG_END
+}
/* ROM definition */
diff --git a/src/mame/drivers/rc759.cpp b/src/mame/drivers/rc759.cpp
index 85161519be8..e5db39cbf0a 100644
--- a/src/mame/drivers/rc759.cpp
+++ b/src/mame/drivers/rc759.cpp
@@ -482,7 +482,7 @@ void rc759_state::rc759_io(address_map &map)
map(0x000, 0x003).mirror(0x0c).rw(m_pic, FUNC(pic8259_device::read), FUNC(pic8259_device::write)).umask16(0x00ff);
map(0x020, 0x020).r(FUNC(rc759_state::keyboard_r));
map(0x056, 0x057).noprw(); // in reality, access to sound and rtc is a bit more involved
- map(0x05a, 0x05a).w(m_snd, FUNC(sn76489a_device::command_w));
+ map(0x05a, 0x05a).w(m_snd, FUNC(sn76489a_device::write));
map(0x05c, 0x05c).rw(FUNC(rc759_state::rtc_r), FUNC(rc759_state::rtc_w));
// AM_RANGE(0x060, 0x06f) AM_WRITE8(crt_control_w, 0x00ff)
map(0x070, 0x077).mirror(0x08).rw(m_ppi, FUNC(i8255_device::read), FUNC(i8255_device::write)).umask16(0x00ff);
diff --git a/src/mame/drivers/rcorsair.cpp b/src/mame/drivers/rcorsair.cpp
index 6eb45d37e5d..cff08bd03b0 100644
--- a/src/mame/drivers/rcorsair.cpp
+++ b/src/mame/drivers/rcorsair.cpp
@@ -156,30 +156,30 @@ uint32_t rcorsair_state::screen_update(screen_device &screen, bitmap_ind16 &bitm
return 0;
}
-MACHINE_CONFIG_START(rcorsair_state::rcorsair)
-
+void rcorsair_state::rcorsair(machine_config &config)
+{
/* Main CPU is probably inside Custom Block with
program code, unknown type */
- MCFG_DEVICE_ADD("maincpu", Z80, 8000000)
- MCFG_DEVICE_PROGRAM_MAP(rcorsair_main_map)
- //MCFG_DEVICE_VBLANK_INT_DRIVER("screen", rcorsair_state, irq0_line_hold)
-
- MCFG_DEVICE_ADD("subcpu", I8035, 8000000)
- MCFG_DEVICE_PROGRAM_MAP(rcorsair_sub_map)
- MCFG_DEVICE_IO_MAP(rcorsair_sub_io_map)
-
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_UPDATE_DRIVER(rcorsair_state, screen_update)
- MCFG_SCREEN_SIZE(256, 256)
- MCFG_SCREEN_VISIBLE_AREA(0, 256-1, 0, 256-1)
- MCFG_SCREEN_PALETTE("palette")
-
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_rcorsair)
- MCFG_PALETTE_ADD("palette", 0x100)
-MACHINE_CONFIG_END
+ Z80(config, m_maincpu, 8000000);
+ m_maincpu->set_addrmap(AS_PROGRAM, &rcorsair_state::rcorsair_main_map);
+ //m_maincpu->set_vblank_int("screen", FUNC(rcorsair_state::irq0_line_hold));
+
+ I8035(config, m_subcpu, 8000000);
+ m_subcpu->set_addrmap(AS_PROGRAM, &rcorsair_state::rcorsair_sub_map);
+ m_subcpu->set_addrmap(AS_IO, &rcorsair_state::rcorsair_sub_io_map);
+
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_screen_update(FUNC(rcorsair_state::screen_update));
+ screen.set_size(256, 256);
+ screen.set_visarea(0, 256-1, 0, 256-1);
+ screen.set_palette("palette");
+
+ GFXDECODE(config, "gfxdecode", "palette", gfx_rcorsair);
+ PALETTE(config, "palette").set_entries(0x100);
+}
ROM_START( rcorsair )
ROM_REGION( 0x6000, "maincpu", 0 )
diff --git a/src/mame/drivers/rd100.cpp b/src/mame/drivers/rd100.cpp
index 881f999e2c1..ef6a9076d93 100644
--- a/src/mame/drivers/rd100.cpp
+++ b/src/mame/drivers/rd100.cpp
@@ -101,27 +101,28 @@ MACHINE_RESET_MEMBER( rd100_state, rd100 )
{
}
-MACHINE_CONFIG_START(rd100_state::rd100)
+void rd100_state::rd100(machine_config &config)
+{
// basic machine hardware
- MCFG_DEVICE_ADD("maincpu", MC6809, XTAL(4'000'000)) // MC6809P???
- MCFG_DEVICE_PROGRAM_MAP(mem_map)
+ MC6809(config, m_maincpu, XTAL(4'000'000)); // MC6809P???
+ m_maincpu->set_addrmap(AS_PROGRAM, &rd100_state::mem_map);
MCFG_MACHINE_RESET_OVERRIDE(rd100_state, rd100)
- MCFG_DEVICE_ADD("pia1", PIA6821, 0)
+ PIA6821(config, "pia1", 0);
- MCFG_DEVICE_ADD("pia2", PIA6821, 0)
+ PIA6821(config, "pia2", 0);
// video hardware
- MCFG_SCREEN_ADD_MONOCHROME("screen", RASTER, rgb_t::green())
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(250))
- MCFG_SCREEN_UPDATE_DRIVER(rd100_state, screen_update)
- MCFG_SCREEN_SIZE(64*6, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0, 64*6-1, 0, 32*8-1)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER, rgb_t::green()));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(250));
+ screen.set_screen_update(FUNC(rd100_state::screen_update));
+ screen.set_size(64*6, 32*8);
+ screen.set_visarea(0, 64*6-1, 0, 32*8-1);
PALETTE(config, "palette", palette_device::MONOCHROME);
- //MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_rd100)
-MACHINE_CONFIG_END
+ //GFXDECODE(config, "gfxdecode", "palette", gfx_rd100);
+}
ROM_START( rd100 )
ROM_REGION( 0x8000, "roms", 0 )
diff --git a/src/mame/drivers/rd110.cpp b/src/mame/drivers/rd110.cpp
index 2b42e238061..b9a9f62cd9e 100644
--- a/src/mame/drivers/rd110.cpp
+++ b/src/mame/drivers/rd110.cpp
@@ -233,7 +233,8 @@ void d110_state::d110_map(address_map &map)
map(0xc000, 0xffff).bankrw("fixed");
}
-MACHINE_CONFIG_START(d110_state::d110)
+void d110_state::d110(machine_config &config)
+{
P8098(config, m_maincpu, 12_MHz_XTAL);
m_maincpu->set_addrmap(AS_PROGRAM, &d110_state::d110_map);
m_maincpu->serial_tx_cb().set(FUNC(d110_state::midi_w));
@@ -247,22 +248,22 @@ MACHINE_CONFIG_START(d110_state::d110)
RAM( config, m_memc ).set_default_size( "32K" );
NVRAM( config, m_memcs, nvram_device::DEFAULT_ALL_0 );
- MCFG_SCREEN_ADD( "screen", LCD )
- MCFG_SCREEN_REFRESH_RATE(50)
- MCFG_SCREEN_UPDATE_DRIVER(d110_state, screen_update)
-// MCFG_SCREEN_SIZE(20*6-1, 2*9-1)
- MCFG_SCREEN_SIZE(16*6-1, (16*6-1)*3/4)
- MCFG_SCREEN_VISIBLE_AREA(0, 16*6-2, 0, (16*6-1)*3/4-1)
- MCFG_SCREEN_PALETTE("palette")
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_LCD));
+ screen.set_refresh_hz(50);
+ screen.set_screen_update(FUNC(d110_state::screen_update));
+// screen.set_size(20*6-1, 2*9-1);
+ screen.set_size(16*6-1, (16*6-1)*3/4);
+ screen.set_visarea(0, 16*6-2, 0, (16*6-1)*3/4-1);
+ screen.set_palette("palette");
PALETTE(config, "palette", FUNC(d110_state::d110_palette), 2);
- MCFG_MSM6222B_01_ADD( m_lcd )
+ MSM6222B_01(config, m_lcd, 0);
- MCFG_TIMER_DRIVER_ADD( m_midi_timer, d110_state, midi_timer_cb )
+ TIMER(config, m_midi_timer).configure_generic(FUNC(d110_state::midi_timer_cb));
- MCFG_TIMER_DRIVER_ADD_PERIODIC( "samples_timer", d110_state, samples_timer_cb, attotime::from_hz(32000*2) )
-MACHINE_CONFIG_END
+ TIMER(config, "samples_timer").configure_periodic(FUNC(d110_state::samples_timer_cb), attotime::from_hz(32000*2) );
+}
ROM_START( d110 )
ROM_REGION( 0x10000, "maincpu", 0 )
diff --git a/src/mame/drivers/re900.cpp b/src/mame/drivers/re900.cpp
index 4c98a94c6c1..f0727f18cb0 100644
--- a/src/mame/drivers/re900.cpp
+++ b/src/mame/drivers/re900.cpp
@@ -264,8 +264,7 @@ void re900_state::mem_io(address_map &map)
map(0x0000, 0xbfff).r(FUNC(re900_state::rom_r));
map(0xc000, 0xdfff).ram().share("nvram");
map(0xe000, 0xefff).w(FUNC(re900_state::watchdog_reset_w));
- map(0xe000, 0xe000).w("tms9128", FUNC(tms9928a_device::vram_w));
- map(0xe001, 0xe001).w("tms9128", FUNC(tms9928a_device::register_w));
+ map(0xe000, 0xe001).w("tms9128", FUNC(tms9928a_device::write));
map(0xe800, 0xe801).w("ay_re900", FUNC(ay8910_device::address_data_w));
map(0xe802, 0xe802).r("ay_re900", FUNC(ay8910_device::data_r));
}
diff --git a/src/mame/drivers/realbrk.cpp b/src/mame/drivers/realbrk.cpp
index 464402e08dc..5bcc5ab632a 100644
--- a/src/mame/drivers/realbrk.cpp
+++ b/src/mame/drivers/realbrk.cpp
@@ -174,7 +174,6 @@ void realbrk_state::base_mem(address_map &map)
map(0x606000, 0x60600f).ram().w(FUNC(realbrk_state::vregs_w)).share("vregs"); // Scroll + Video Regs
map(0x800000, 0x800003).rw("ymz", FUNC(ymz280b_device::read), FUNC(ymz280b_device::write)).umask16(0xff00); // YMZ280
map(0xfe0000, 0xfeffff).ram(); // RAM
- map(0xfffc00, 0xffffff).rw(m_tmp68301, FUNC(tmp68301_device::regs_r), FUNC(tmp68301_device::regs_w)); // TMP68301 Registers
}
/*realbrk specific memory map*/
@@ -218,7 +217,6 @@ void realbrk_state::dai2kaku_mem(address_map &map)
map(0xc00002, 0xc00003).portr("IN1"); // Coins
map(0xc00004, 0xc00005).ram().r(FUNC(realbrk_state::realbrk_dsw_r)).share("dsw_select"); // DSW select
map(0xff0000, 0xfffbff).ram(); // RAM
- map(0xfffd0a, 0xfffd0b).w(FUNC(realbrk_state::dai2kaku_flipscreen_w)); // Hack! Parallel port data register
}
/***************************************************************************
@@ -764,69 +762,67 @@ WRITE_LINE_MEMBER(realbrk_state::vblank_irq)
{
/* VBlank is connected to INT1 (external interrupts pin 1) */
if (state)
- m_tmp68301->external_interrupt_1();
+ m_maincpu->external_interrupt_1();
}
-MACHINE_CONFIG_START(realbrk_state::realbrk)
-
+void realbrk_state::realbrk(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD(m_maincpu, M68000, XTAL(32'000'000) / 2) /* !! TMP68301 !! */
- MCFG_DEVICE_PROGRAM_MAP(realbrk_mem)
- MCFG_DEVICE_IRQ_ACKNOWLEDGE_DEVICE("tmp68301",tmp68301_device,irq_callback)
-
- TMP68301(config, m_tmp68301, 0);
- m_tmp68301->set_cputag(m_maincpu);
- m_tmp68301->out_parallel_callback().set(FUNC(realbrk_state::realbrk_flipscreen_w));
+ TMP68301(config, m_maincpu, XTAL(32'000'000) / 2);
+ m_maincpu->set_addrmap(AS_PROGRAM, &realbrk_state::realbrk_mem);
+ m_maincpu->out_parallel_callback().set(FUNC(realbrk_state::realbrk_flipscreen_w));
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(0x140, 0xe0)
- MCFG_SCREEN_VISIBLE_AREA(0, 0x140-1, 0, 0xe0-1)
- MCFG_SCREEN_UPDATE_DRIVER(realbrk_state, screen_update)
- MCFG_SCREEN_PALETTE(m_palette)
- MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE(*this, realbrk_state, vblank_irq))
-
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_realbrk)
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_refresh_hz(60);
+ m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ m_screen->set_size(0x140, 0xe0);
+ m_screen->set_visarea(0, 0x140-1, 0, 0xe0-1);
+ m_screen->set_screen_update(FUNC(realbrk_state::screen_update));
+ m_screen->set_palette(m_palette);
+ m_screen->screen_vblank().set(FUNC(realbrk_state::vblank_irq));
+
+ GFXDECODE(config, m_gfxdecode, m_palette, gfx_realbrk);
PALETTE(config, m_palette).set_format(palette_device::xBGR_555, 0x8000);
/* sound hardware */
SPEAKER(config, "lspeaker").front_left();
SPEAKER(config, "rspeaker").front_right();
- MCFG_DEVICE_ADD("ymz", YMZ280B, XTAL(33'868'800) / 2)
- MCFG_SOUND_ROUTE(0, "lspeaker", 0.50)
- MCFG_SOUND_ROUTE(1, "rspeaker", 0.50)
+ ymz280b_device &ymz(YMZ280B(config, "ymz", XTAL(33'868'800) / 2));
+ ymz.add_route(0, "lspeaker", 0.50);
+ ymz.add_route(1, "rspeaker", 0.50);
- MCFG_DEVICE_ADD("ymsnd", YM2413, XTAL(3'579'545))
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 0.50)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 0.50)
-MACHINE_CONFIG_END
+ ym2413_device &ymsnd(YM2413(config, "ymsnd", XTAL(3'579'545)));
+ ymsnd.add_route(ALL_OUTPUTS, "lspeaker", 0.50);
+ ymsnd.add_route(ALL_OUTPUTS, "rspeaker", 0.50);
+}
-MACHINE_CONFIG_START(realbrk_state::pkgnsh)
+void realbrk_state::pkgnsh(machine_config &config)
+{
realbrk(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(pkgnsh_mem)
- m_tmp68301->out_parallel_callback().set_nop();
-MACHINE_CONFIG_END
+ m_maincpu->set_addrmap(AS_PROGRAM, &realbrk_state::pkgnsh_mem);
+ m_maincpu->out_parallel_callback().set_nop();
+}
-MACHINE_CONFIG_START(realbrk_state::pkgnshdx)
+void realbrk_state::pkgnshdx(machine_config &config)
+{
pkgnsh(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(pkgnshdx_mem)
-MACHINE_CONFIG_END
-MACHINE_CONFIG_START(realbrk_state::dai2kaku)
+ m_maincpu->set_addrmap(AS_PROGRAM, &realbrk_state::pkgnshdx_mem);
+}
+
+void realbrk_state::dai2kaku(machine_config &config)
+{
realbrk(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(dai2kaku_mem)
- MCFG_GFXDECODE_MODIFY("gfxdecode", gfx_dai2kaku)
- MCFG_SCREEN_MODIFY("screen")
- MCFG_SCREEN_UPDATE_DRIVER(realbrk_state, screen_update_dai2kaku)
-MACHINE_CONFIG_END
+ m_maincpu->set_addrmap(AS_PROGRAM, &realbrk_state::dai2kaku_mem);
+ m_maincpu->out_parallel_callback().set(FUNC(realbrk_state::dai2kaku_flipscreen_w));
+
+ m_gfxdecode->set_info(gfx_dai2kaku);
+ m_screen->set_screen_update(FUNC(realbrk_state::screen_update_dai2kaku));
+}
/***************************************************************************
diff --git a/src/mame/drivers/redalert.cpp b/src/mame/drivers/redalert.cpp
index 85d587ecf1e..a677afeae6f 100644
--- a/src/mame/drivers/redalert.cpp
+++ b/src/mame/drivers/redalert.cpp
@@ -391,61 +391,61 @@ INPUT_PORTS_END
*
*************************************/
-MACHINE_CONFIG_START(redalert_state::redalert)
-
+void redalert_state::redalert(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M6502, MAIN_CPU_CLOCK)
- MCFG_DEVICE_PROGRAM_MAP(redalert_main_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", redalert_state, redalert_vblank_interrupt)
+ M6502(config, m_maincpu, MAIN_CPU_CLOCK);
+ m_maincpu->set_addrmap(AS_PROGRAM, &redalert_state::redalert_main_map);
+ m_maincpu->set_vblank_int("screen", FUNC(redalert_state::redalert_vblank_interrupt));
/* video hardware */
redalert_video(config);
/* audio hardware */
redalert_audio(config);
-MACHINE_CONFIG_END
-
-MACHINE_CONFIG_START(redalert_state::ww3)
+}
+void redalert_state::ww3(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M6502, MAIN_CPU_CLOCK)
- MCFG_DEVICE_PROGRAM_MAP(ww3_main_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", redalert_state, redalert_vblank_interrupt)
+ M6502(config, m_maincpu, MAIN_CPU_CLOCK);
+ m_maincpu->set_addrmap(AS_PROGRAM, &redalert_state::ww3_main_map);
+ m_maincpu->set_vblank_int("screen", FUNC(redalert_state::redalert_vblank_interrupt));
/* video hardware */
ww3_video(config);
/* audio hardware */
ww3_audio(config);
-MACHINE_CONFIG_END
-
-MACHINE_CONFIG_START(redalert_state::panther)
+}
+void redalert_state::panther(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M6502, MAIN_CPU_CLOCK)
- MCFG_DEVICE_PROGRAM_MAP(panther_main_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", redalert_state, redalert_vblank_interrupt)
+ M6502(config, m_maincpu, MAIN_CPU_CLOCK);
+ m_maincpu->set_addrmap(AS_PROGRAM, &redalert_state::panther_main_map);
+ m_maincpu->set_vblank_int("screen", FUNC(redalert_state::redalert_vblank_interrupt));
/* video hardware */
panther_video(config);
/* audio hardware */
ww3_audio(config);
-MACHINE_CONFIG_END
-
-MACHINE_CONFIG_START(redalert_state::demoneye)
+}
+void redalert_state::demoneye(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M6502, MAIN_CPU_CLOCK)
- MCFG_DEVICE_PROGRAM_MAP(demoneye_main_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", redalert_state, redalert_vblank_interrupt)
+ M6502(config, m_maincpu, MAIN_CPU_CLOCK);
+ m_maincpu->set_addrmap(AS_PROGRAM, &redalert_state::demoneye_main_map);
+ m_maincpu->set_vblank_int("screen", FUNC(redalert_state::redalert_vblank_interrupt));
/* video hardware */
demoneye_video(config);
/* audio hardware */
demoneye_audio(config);
-MACHINE_CONFIG_END
+}
diff --git a/src/mame/drivers/redclash.cpp b/src/mame/drivers/redclash.cpp
index 6ce9e4ee47a..0442a7ef404 100644
--- a/src/mame/drivers/redclash.cpp
+++ b/src/mame/drivers/redclash.cpp
@@ -36,7 +36,7 @@ WRITE8_MEMBER( redclash_state::irqack_w )
m_maincpu->set_input_line(0, CLEAR_LINE);
}
-template <unsigned B> WRITE8_MEMBER(redclash_state::redclash_star_w)
+template <unsigned B> WRITE8_MEMBER(redclash_state::star_w)
{
m_stars->set_speed(BIT(data, 0) << B, 1U << B);
}
@@ -45,41 +45,41 @@ void redclash_state::zerohour_map(address_map &map)
{
map(0x0000, 0x2fff).rom();
map(0x3000, 0x37ff).ram();
- map(0x3800, 0x3bff).ram().share("spriteram");
- map(0x4000, 0x43ff).ram().w(FUNC(redclash_state::redclash_videoram_w)).share("videoram");
+ map(0x3800, 0x3bff).ram().share(m_spriteram);
+ map(0x4000, 0x43ff).ram().w(FUNC(redclash_state::videoram_w)).share(m_videoram);
map(0x4800, 0x4800).portr("IN0"); /* IN0 */
map(0x4801, 0x4801).portr("IN1"); /* IN1 */
map(0x4802, 0x4802).portr("DSW1"); /* DSW0 */
map(0x4803, 0x4803).portr("DSW2"); /* DSW1 */
map(0x5000, 0x5007).nopw(); /* to sound board */
- map(0x5800, 0x5800).w(FUNC(redclash_state::redclash_star_w<0>));
+ map(0x5800, 0x5800).w(FUNC(redclash_state::star_w<0>));
map(0x5801, 0x5804).nopw(); /* to sound board */
- map(0x5805, 0x5805).w(FUNC(redclash_state::redclash_star_w<1>));
- map(0x5806, 0x5806).w(FUNC(redclash_state::redclash_star_w<2>));
- map(0x5807, 0x5807).w(FUNC(redclash_state::redclash_flipscreen_w));
- map(0x7000, 0x7000).w(FUNC(redclash_state::redclash_star_reset_w));
+ map(0x5805, 0x5805).w(FUNC(redclash_state::star_w<1>));
+ map(0x5806, 0x5806).w(FUNC(redclash_state::star_w<2>));
+ map(0x5807, 0x5807).w(FUNC(redclash_state::flipscreen_w));
+ map(0x7000, 0x7000).w(FUNC(redclash_state::star_reset_w));
map(0x7800, 0x7800).w(FUNC(redclash_state::irqack_w));
}
void redclash_state::redclash_map(address_map &map)
{
map(0x0000, 0x2fff).rom();
-// AM_RANGE(0x3000, 0x3000) AM_WRITENOP
-// AM_RANGE(0x3800, 0x3800) AM_WRITENOP
- map(0x4000, 0x43ff).ram().w(FUNC(redclash_state::redclash_videoram_w)).share("videoram");
+// map(0x3000, 0x3000).set_nopw();
+// map(0x3800, 0x3800).set_nopw();
+ map(0x4000, 0x43ff).ram().w(FUNC(redclash_state::videoram_w)).share(m_videoram);
map(0x4800, 0x4800).portr("IN0"); /* IN0 */
map(0x4801, 0x4801).portr("IN1"); /* IN1 */
map(0x4802, 0x4802).portr("DSW1"); /* DSW0 */
map(0x4803, 0x4803).portr("DSW2"); /* DSW1 */
map(0x5000, 0x5007).nopw(); /* to sound board */
- map(0x5800, 0x5800).w(FUNC(redclash_state::redclash_star_w<0>));
- map(0x5801, 0x5801).w(FUNC(redclash_state::redclash_gfxbank_w));
- map(0x5805, 0x5805).w(FUNC(redclash_state::redclash_star_w<1>));
- map(0x5806, 0x5806).w(FUNC(redclash_state::redclash_star_w<2>));
- map(0x5807, 0x5807).w(FUNC(redclash_state::redclash_flipscreen_w));
+ map(0x5800, 0x5800).w(FUNC(redclash_state::star_w<0>));
+ map(0x5801, 0x5801).w(FUNC(redclash_state::gfxbank_w));
+ map(0x5805, 0x5805).w(FUNC(redclash_state::star_w<1>));
+ map(0x5806, 0x5806).w(FUNC(redclash_state::star_w<2>));
+ map(0x5807, 0x5807).w(FUNC(redclash_state::flipscreen_w));
map(0x6000, 0x67ff).ram();
- map(0x6800, 0x6bff).ram().share("spriteram");
- map(0x7000, 0x7000).w(FUNC(redclash_state::redclash_star_reset_w));
+ map(0x6800, 0x6bff).ram().share(m_spriteram);
+ map(0x7000, 0x7000).w(FUNC(redclash_state::star_reset_w));
map(0x7800, 0x7800).w(FUNC(redclash_state::irqack_w));
}
@@ -119,7 +119,7 @@ static INPUT_PORTS_START( redclash )
PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_COCKTAIL
PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_UNKNOWN )
/* Note that there are TWO VBlank inputs, one is active low, the other active */
- /* high. There are probably other differencies in the hardware, but emulating */
+ /* high. There are probably other differences in the hardware, but emulating */
/* them this way is enough to get the game running. */
PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_CUSTOM ) PORT_VBLANK("screen")
PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_VBLANK("screen")
@@ -213,7 +213,7 @@ static INPUT_PORTS_START( zerohour )
PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_COCKTAIL
PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_UNKNOWN )
/* Note that there are TWO VBlank inputs, one is active low, the other active */
- /* high. There are probably other differencies in the hardware, but emulating */
+ /* high. There are probably other differences in the hardware, but emulating */
/* them this way is enough to get the game running. */
PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_CUSTOM ) PORT_VBLANK("screen")
PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_VBLANK("screen")
@@ -345,54 +345,37 @@ void redclash_state::machine_reset()
m_gfxbank = 0;
}
-MACHINE_CONFIG_START(redclash_state::zerohour)
-
+void redclash_state::zerohour(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, 4000000) /* 4 MHz */
- MCFG_DEVICE_PROGRAM_MAP(zerohour_map)
+ Z80(config, m_maincpu, 4000000); /* 4 MHz */
+ m_maincpu->set_addrmap(AS_PROGRAM, &redclash_state::zerohour_map);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */)
- MCFG_SCREEN_SIZE(32*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(1*8, 31*8-1, 4*8, 28*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(redclash_state, screen_update_redclash)
- MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE(*this, redclash_state, screen_vblank_redclash))
- MCFG_SCREEN_PALETTE(m_palette)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */
+ screen.set_size(32*8, 32*8);
+ screen.set_visarea(1*8, 31*8-1, 4*8, 28*8-1);
+ screen.set_screen_update(FUNC(redclash_state::screen_update));
+ screen.screen_vblank().set(FUNC(redclash_state::screen_vblank));
+ screen.set_palette(m_palette);
GFXDECODE(config, m_gfxdecode, m_palette, gfx_redclash);
- PALETTE(config, m_palette, FUNC(redclash_state::redclash_palette), 4*8 + 4*16 + 32, 32 + 32);
+ PALETTE(config, m_palette, FUNC(redclash_state::palette), 4*8 + 4*16 + 32, 32 + 32);
ZEROHOUR_STARS(config, m_stars, 0);
/* sound hardware */
-MACHINE_CONFIG_END
-
-
-MACHINE_CONFIG_START(redclash_state::redclash)
-
- /* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, 4000000) /* 4 MHz */
- MCFG_DEVICE_PROGRAM_MAP(redclash_map)
-
- /* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */)
- MCFG_SCREEN_SIZE(32*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(1*8, 31*8-1, 4*8, 28*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(redclash_state, screen_update_redclash)
- MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE(*this, redclash_state, screen_vblank_redclash))
- MCFG_SCREEN_PALETTE(m_palette)
+}
- GFXDECODE(config, m_gfxdecode, m_palette, gfx_redclash);
- PALETTE(config, m_palette, FUNC(redclash_state::redclash_palette), 4*8 + 4*16 + 32, 32 + 32);
- ZEROHOUR_STARS(config, m_stars, 0);
+void redclash_state::redclash(machine_config &config)
+{
+ zerohour(config);
- /* sound hardware */
-MACHINE_CONFIG_END
+ m_maincpu->set_addrmap(AS_PROGRAM, &redclash_state::redclash_map);
+}
@@ -560,6 +543,30 @@ ROM_START( redclashk )
ROM_LOAD( "3.11e", 0x0040, 0x0020, CRC(27fa3a50) SHA1(7cf59b7a37c156640d6ea91554d1c4276c1780e0) ) /* 6331.6w */
ROM_END
+// 2 PCB set (K-00A and K-00B)
+ROM_START( redclashs )
+ ROM_REGION(0x10000, "maincpu", 0 )
+ ROM_LOAD( "1.11c", 0x0000, 0x1000, CRC(62275f85) SHA1(8f5d7113a012cc29e3729d54c4a0319c838a7c0d) )
+ ROM_LOAD( "3.7c", 0x1000, 0x1000, CRC(c2090318) SHA1(71725cdf51aedf5f29fa1dd1a41ad5e62c9a580d) )
+ ROM_LOAD( "2.9c", 0x2000, 0x1000, CRC(b60e5ada) SHA1(37440f382c5e8852d804fa9837c36cc1e9d94d1d) )
+
+ ROM_REGION(0x0800, "gfx1", 0 )
+ ROM_LOAD( "6.a12", 0x0000, 0x0800, CRC(da9bbcc2) SHA1(4cbe03c7f5e99cc2f124e0089ea3c392156b5d92) )
+
+ ROM_REGION( 0x2000, "gfx2", 0 )
+ ROM_LOAD( "4.3e", 0x0000, 0x0800, CRC(483a1293) SHA1(e7812475c7509389bcf8fee35598e9894428eb37) )
+ ROM_CONTINUE( 0x1000, 0x0800 )
+ ROM_LOAD( "5.3d", 0x0800, 0x0800, CRC(c45d9601) SHA1(2f156ad61161d65284df0cc55eb1b3b990eb41cb) )
+ ROM_CONTINUE( 0x1800, 0x0800 )
+
+ ROM_REGION( 0x2000, "gfx3", ROMREGION_ERASE00 )
+ /* gfx data will be rearranged here for 8x8 sprites */
+
+ ROM_REGION( 0x0060, "proms", 0 ) // not dumped for this set
+ ROM_LOAD( "1.12f", 0x0000, 0x0020, CRC(43989681) SHA1(0d471e6f499294f2f62f27392b8370e2af8e38a3) ) /* palette */
+ ROM_LOAD( "2.4a", 0x0020, 0x0020, CRC(9adabf46) SHA1(f3538fdbc4280b6be46a4d7ebb4c34bd1a1ce2b7) ) /* sprite color lookup table */
+ ROM_LOAD( "3.11e", 0x0040, 0x0020, CRC(27fa3a50) SHA1(7cf59b7a37c156640d6ea91554d1c4276c1780e0) ) /* ?? */
+ROM_END
void redclash_state::init_redclash()
{
@@ -576,9 +583,10 @@ void redclash_state::init_redclash()
}
-GAME( 1980, zerohour, 0, zerohour, zerohour, redclash_state, init_redclash, ROT270, "Universal", "Zero Hour (set 1)", MACHINE_NO_SOUND | MACHINE_WRONG_COLORS | MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE )
-GAME( 1980, zerohoura, zerohour, zerohour, zerohour, redclash_state, init_redclash, ROT270, "Universal", "Zero Hour (set 2)", MACHINE_NO_SOUND | MACHINE_WRONG_COLORS | MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE )
-GAME( 1980, zerohouri, zerohour, zerohour, zerohour, redclash_state, init_redclash, ROT270, "bootleg (Inder SA)", "Zero Hour (Inder)", MACHINE_NO_SOUND | MACHINE_WRONG_COLORS | MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE )
-GAME( 1981, redclash, 0, redclash, redclash, redclash_state, init_redclash, ROT270, "Tehkan", "Red Clash (set 1)", MACHINE_NO_SOUND | MACHINE_WRONG_COLORS | MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE )
-GAME( 1981, redclasha, redclash, redclash, redclash, redclash_state, init_redclash, ROT270, "Tehkan", "Red Clash (set 2)", MACHINE_NO_SOUND | MACHINE_WRONG_COLORS | MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE )
-GAME( 1981, redclashk, redclash, redclash, redclash, redclash_state, init_redclash, ROT270, "Tehkan (Kaneko license)", "Red Clash (Kaneko)", MACHINE_NO_SOUND | MACHINE_WRONG_COLORS | MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE )
+GAME( 1980, zerohour, 0, zerohour, zerohour, redclash_state, init_redclash, ROT270, "Universal", "Zero Hour (set 1)", MACHINE_NO_SOUND | MACHINE_WRONG_COLORS | MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE )
+GAME( 1980, zerohoura, zerohour, zerohour, zerohour, redclash_state, init_redclash, ROT270, "Universal", "Zero Hour (set 2)", MACHINE_NO_SOUND | MACHINE_WRONG_COLORS | MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE )
+GAME( 1980, zerohouri, zerohour, zerohour, zerohour, redclash_state, init_redclash, ROT270, "bootleg (Inder SA)", "Zero Hour (Inder)", MACHINE_NO_SOUND | MACHINE_WRONG_COLORS | MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE )
+GAME( 1981, redclash, 0, redclash, redclash, redclash_state, init_redclash, ROT270, "Tehkan", "Red Clash (set 1)", MACHINE_NO_SOUND | MACHINE_WRONG_COLORS | MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE )
+GAME( 1981, redclasha, redclash, redclash, redclash, redclash_state, init_redclash, ROT270, "Tehkan", "Red Clash (set 2)", MACHINE_NO_SOUND | MACHINE_WRONG_COLORS | MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE )
+GAME( 1981, redclashk, redclash, redclash, redclash, redclash_state, init_redclash, ROT270, "Tehkan (Kaneko license)", "Red Clash (Kaneko)", MACHINE_NO_SOUND | MACHINE_WRONG_COLORS | MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE )
+GAME( 1982, redclashs, redclash, redclash, redclash, redclash_state, init_redclash, ROT270, "Tehkan (Suntronics license)", "Red Clash (Suntronics)", MACHINE_NO_SOUND | MACHINE_WRONG_COLORS | MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE )
diff --git a/src/mame/drivers/relief.cpp b/src/mame/drivers/relief.cpp
index 8b84b2f0999..3f55fbc6d43 100644
--- a/src/mame/drivers/relief.cpp
+++ b/src/mame/drivers/relief.cpp
@@ -255,18 +255,18 @@ GFXDECODE_END
*
*************************************/
-MACHINE_CONFIG_START(relief_state::relief)
-
+void relief_state::relief(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M68000, 14.318181_MHz_XTAL/2)
- MCFG_DEVICE_PROGRAM_MAP(main_map)
+ M68000(config, m_maincpu, 14.318181_MHz_XTAL/2);
+ m_maincpu->set_addrmap(AS_PROGRAM, &relief_state::main_map);
EEPROM_2816(config, "eeprom").lock_after_write(true);
WATCHDOG_TIMER(config, "watchdog");
/* video hardware */
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_relief)
+ GFXDECODE(config, m_gfxdecode, "palette", gfx_relief);
PALETTE(config, "palette").set_format(palette_device::IRGB_1555, 2048);
ATARI_VAD(config, m_vad, 0, m_screen);
@@ -275,24 +275,23 @@ MACHINE_CONFIG_START(relief_state::relief)
TILEMAP(config, "vad:playfield2", m_gfxdecode, 2, 8, 8, TILEMAP_SCAN_COLS, 64, 64, 0).set_info_callback(DEVICE_SELF_OWNER, FUNC(relief_state::get_playfield2_tile_info));
ATARI_MOTION_OBJECTS(config, "vad:mob", 0, m_screen, relief_state::s_mob_config).set_gfxdecode(m_gfxdecode);
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_VIDEO_ATTRIBUTES(VIDEO_UPDATE_BEFORE_VBLANK)
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_video_attributes(VIDEO_UPDATE_BEFORE_VBLANK);
/* note: these parameters are from published specs, not derived */
/* the board uses a VAD chip to generate video signals */
- MCFG_SCREEN_RAW_PARAMS(14.318181_MHz_XTAL/2, 456, 0, 336, 262, 0, 240)
- MCFG_SCREEN_UPDATE_DRIVER(relief_state, screen_update_relief)
- MCFG_SCREEN_PALETTE("palette")
+ m_screen->set_raw(14.318181_MHz_XTAL/2, 456, 0, 336, 262, 0, 240);
+ m_screen->set_screen_update(FUNC(relief_state::screen_update_relief));
+ m_screen->set_palette("palette");
/* sound hardware */
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("oki", OKIM6295, 14.318181_MHz_XTAL/4/3, okim6295_device::PIN7_LOW)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.50)
- MCFG_DEVICE_ADDRESS_MAP(0, oki_map)
+ OKIM6295(config, m_oki, 14.318181_MHz_XTAL/4/3, okim6295_device::PIN7_LOW);
+ m_oki->add_route(ALL_OUTPUTS, "mono", 0.50);
+ m_oki->set_addrmap(0, &relief_state::oki_map);
- MCFG_DEVICE_ADD("ymsnd", YM2413, 14.318181_MHz_XTAL/4)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
-MACHINE_CONFIG_END
+ YM2413(config, m_ym2413, 14.318181_MHz_XTAL/4).add_route(ALL_OUTPUTS, "mono", 1.0);
+}
diff --git a/src/mame/drivers/replicator.cpp b/src/mame/drivers/replicator.cpp
index ac92256b446..972be03daf0 100644
--- a/src/mame/drivers/replicator.cpp
+++ b/src/mame/drivers/replicator.cpp
@@ -643,7 +643,6 @@ void replicator_state::replicator(machine_config &config)
SPEAKER(config, "speaker").front_center();
DAC_1BIT(config, m_dac, 0).add_route(0, "speaker", 0.5);
voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref", 0));
- vref.set_output(5.0);
vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT);
}
diff --git a/src/mame/drivers/retofinv.cpp b/src/mame/drivers/retofinv.cpp
index 1a7f11b9174..bb0be85c97b 100644
--- a/src/mame/drivers/retofinv.cpp
+++ b/src/mame/drivers/retofinv.cpp
@@ -220,8 +220,8 @@ void retofinv_state::sound_map(address_map &map)
map(0x2000, 0x27ff).ram(); /* 6116 sram at IC28 */
map(0x4000, 0x4000).r(m_soundlatch, FUNC(generic_latch_8_device::read));
map(0x6000, 0x6000).w(FUNC(retofinv_state::cpu2_m6000_w));
- map(0x8000, 0x8000).w("sn1", FUNC(sn76489a_device::command_w));
- map(0xa000, 0xa000).w("sn2", FUNC(sn76489a_device::command_w));
+ map(0x8000, 0x8000).w("sn1", FUNC(sn76489a_device::write));
+ map(0xa000, 0xa000).w("sn2", FUNC(sn76489a_device::write));
map(0xe000, 0xffff).rom(); /* space for diagnostic ROM */
}
@@ -412,24 +412,24 @@ INTERRUPT_GEN_MEMBER(retofinv_state::sub_vblank_irq)
}
-MACHINE_CONFIG_START(retofinv_state::retofinv)
-
+void retofinv_state::retofinv(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, XTAL(18'432'000)/6) /* XTAL and divider verified, 3.072 MHz */
- MCFG_DEVICE_PROGRAM_MAP(main_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", retofinv_state, main_vblank_irq)
+ Z80(config, m_maincpu, XTAL(18'432'000)/6); /* XTAL and divider verified, 3.072 MHz */
+ m_maincpu->set_addrmap(AS_PROGRAM, &retofinv_state::main_map);
+ m_maincpu->set_vblank_int("screen", FUNC(retofinv_state::main_vblank_irq));
- MCFG_DEVICE_ADD("sub", Z80, XTAL(18'432'000)/6) /* XTAL and divider verified, 3.072 MHz */
- MCFG_DEVICE_PROGRAM_MAP(sub_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", retofinv_state, sub_vblank_irq)
+ Z80(config, m_subcpu, XTAL(18'432'000)/6); /* XTAL and divider verified, 3.072 MHz */
+ m_subcpu->set_addrmap(AS_PROGRAM, &retofinv_state::sub_map);
+ m_subcpu->set_vblank_int("screen", FUNC(retofinv_state::sub_vblank_irq));
- MCFG_DEVICE_ADD("audiocpu", Z80, XTAL(18'432'000)/6) /* XTAL and divider verified, 3.072 MHz */
- MCFG_DEVICE_PROGRAM_MAP(sound_map)
- MCFG_DEVICE_PERIODIC_INT_DRIVER(retofinv_state, nmi_line_pulse, 2*60) // wrong, should be ~128-132 per frame, not 120.
+ Z80(config, m_audiocpu, XTAL(18'432'000)/6); /* XTAL and divider verified, 3.072 MHz */
+ m_audiocpu->set_addrmap(AS_PROGRAM, &retofinv_state::sound_map);
+ m_audiocpu->set_periodic_int(FUNC(retofinv_state::nmi_line_pulse), attotime::from_hz(2*60)); // wrong, should be ~128-132 per frame, not 120.
- MCFG_DEVICE_ADD("68705", TAITO68705_MCU, XTAL(18'432'000)/6) /* XTAL and divider verified, 3.072 MHz */
+ TAITO68705_MCU(config, m_68705, XTAL(18'432'000)/6); /* XTAL and divider verified, 3.072 MHz */
- MCFG_QUANTUM_TIME(attotime::from_hz(6000)) /* 100 CPU slices per frame - enough for the sound CPU to read all commands */
+ config.m_minimum_quantum = attotime::from_hz(6000); /* 100 CPU slices per frame - enough for the sound CPU to read all commands */
LS259(config, m_mainlatch); // IC72 - probably shared between CPUs
m_mainlatch->q_out_cb<0>().set(FUNC(retofinv_state::irq0_ack_w));
@@ -442,13 +442,13 @@ MACHINE_CONFIG_START(retofinv_state::retofinv)
WATCHDOG_TIMER(config, "watchdog");
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60.58) // vsync measured at 60.58hz
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) // not accurate
- MCFG_SCREEN_SIZE(36*8, 28*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 36*8-1, 0*8, 28*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(retofinv_state, screen_update)
- MCFG_SCREEN_PALETTE(m_palette)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60.58); // vsync measured at 60.58hz
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0)); // not accurate
+ screen.set_size(36*8, 28*8);
+ screen.set_visarea(0*8, 36*8-1, 0*8, 28*8-1);
+ screen.set_screen_update(FUNC(retofinv_state::screen_update));
+ screen.set_palette(m_palette);
GFXDECODE(config, m_gfxdecode, m_palette, gfx_retofinv);
PALETTE(config, m_palette, FUNC(retofinv_state::retofinv_palette), 256*2 + 64*16 + 64*16, 256);
@@ -458,42 +458,41 @@ MACHINE_CONFIG_START(retofinv_state::retofinv)
GENERIC_LATCH_8(config, m_soundlatch);
- MCFG_DEVICE_ADD("sn1", SN76489A, XTAL(18'432'000)/6) /* @IC5?; XTAL, chip type, and divider verified, 3.072 MHz */
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.80)
+ SN76489A(config, "sn1", XTAL(18'432'000)/6).add_route(ALL_OUTPUTS, "mono", 0.80); /* @IC5?; XTAL, chip type, and divider verified, 3.072 MHz */
- MCFG_DEVICE_ADD("sn2", SN76489A, XTAL(18'432'000)/6) /* @IC6?; XTAL, chip type, and divider verified, 3.072 MHz */
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.80)
-MACHINE_CONFIG_END
+ SN76489A(config, "sn2", XTAL(18'432'000)/6).add_route(ALL_OUTPUTS, "mono", 0.80); /* @IC6?; XTAL, chip type, and divider verified, 3.072 MHz */
+}
/* bootleg which has different palette clut */
-MACHINE_CONFIG_START(retofinv_state::retofinvb1)
+void retofinv_state::retofinvb1(machine_config &config)
+{
retofinv(config);
m_palette->set_init(FUNC(retofinv_state::retofinv_bl_palette));
-MACHINE_CONFIG_END
+}
/* bootleg which has no mcu */
-MACHINE_CONFIG_START(retofinv_state::retofinvb_nomcu)
+void retofinv_state::retofinvb_nomcu(machine_config &config)
+{
retofinv(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(bootleg_map)
+ m_maincpu->set_addrmap(AS_PROGRAM, &retofinv_state::bootleg_map);
m_mainlatch->q_out_cb<3>().set_nop();
- MCFG_DEVICE_REMOVE("68705")
-MACHINE_CONFIG_END
+ config.device_remove("68705");
+}
-/* bootleg which has different pallete clut and also has no mcu */
-MACHINE_CONFIG_START(retofinv_state::retofinvb1_nomcu)
+/* bootleg which has different palette clut and also has no mcu */
+void retofinv_state::retofinvb1_nomcu(machine_config &config)
+{
retofinvb1(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(bootleg_map)
+ m_maincpu->set_addrmap(AS_PROGRAM, &retofinv_state::bootleg_map);
m_mainlatch->q_out_cb<3>().set_nop();
- MCFG_DEVICE_REMOVE("68705")
-MACHINE_CONFIG_END
+ config.device_remove("68705");
+}
/***************************************************************************
diff --git a/src/mame/drivers/rex6000.cpp b/src/mame/drivers/rex6000.cpp
index 43c3a8b6209..e97c01ba358 100644
--- a/src/mame/drivers/rex6000.cpp
+++ b/src/mame/drivers/rex6000.cpp
@@ -897,22 +897,22 @@ GFXDECODE_END
MACHINE_CONFIG_START(rex6000_state::rex6000)
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu",Z80, XTAL(4'000'000)) //Toshiba microprocessor Z80 compatible at 4.3MHz
- MCFG_DEVICE_PROGRAM_MAP(rex6000_mem)
- MCFG_DEVICE_IO_MAP(rex6000_io)
+ Z80(config, m_maincpu, XTAL(4'000'000)); //Toshiba microprocessor Z80 compatible at 4.3MHz
+ m_maincpu->set_addrmap(AS_PROGRAM, &rex6000_state::rex6000_mem);
+ m_maincpu->set_addrmap(AS_IO, &rex6000_state::rex6000_io);
- MCFG_TIMER_DRIVER_ADD_PERIODIC("sec_timer", rex6000_state, sec_timer, attotime::from_hz(1))
- MCFG_TIMER_DRIVER_ADD_PERIODIC("irq_timer1", rex6000_state, irq_timer1, attotime::from_hz(32))
- MCFG_TIMER_DRIVER_ADD_PERIODIC("irq_timer2", rex6000_state, irq_timer2, attotime::from_hz(4096))
+ TIMER(config, "sec_timer").configure_periodic(FUNC(rex6000_state::sec_timer), attotime::from_hz(1));
+ TIMER(config, "irq_timer1").configure_periodic(FUNC(rex6000_state::irq_timer1), attotime::from_hz(32));
+ TIMER(config, "irq_timer2").configure_periodic(FUNC(rex6000_state::irq_timer2), attotime::from_hz(4096));
/* video hardware */
- MCFG_SCREEN_ADD("screen", LCD)
- MCFG_SCREEN_REFRESH_RATE(50)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */
- MCFG_SCREEN_UPDATE_DRIVER(rex6000_state, screen_update)
- MCFG_SCREEN_SIZE(240, 120)
- MCFG_SCREEN_VISIBLE_AREA(0, 240-1, 0, 120-1)
- MCFG_SCREEN_PALETTE("palette")
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_LCD));
+ screen.set_refresh_hz(50);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */
+ screen.set_screen_update(FUNC(rex6000_state::screen_update));
+ screen.set_size(240, 120);
+ screen.set_visarea(0, 240-1, 0, 120-1);
+ screen.set_palette("palette");
PALETTE(config, "palette", FUNC(rex6000_state::rex6000_palettte), 2);
GFXDECODE(config, "gfxdecode", "palette", gfx_rex6000);
@@ -934,7 +934,7 @@ MACHINE_CONFIG_START(rex6000_state::rex6000)
serport.cts_handler().set(m_uart, FUNC(ins8250_uart_device::cts_w));
/* quickload */
- MCFG_QUICKLOAD_ADD("quickload", rex6000_state, rex6000, "rex,ds2", 0)
+ MCFG_QUICKLOAD_ADD("quickload", rex6000_state, rex6000, "rex,ds2")
tc8521_device &rtc(TC8521(config, TC8521_TAG, XTAL(32'768)));
rtc.out_alarm_callback().set(FUNC(rex6000_state::alarm_irq));
@@ -956,19 +956,18 @@ MACHINE_CONFIG_START(rex6000_state::rex6000)
/* sound hardware */
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD( "beeper", BEEP, 0 )
- MCFG_SOUND_ROUTE( ALL_OUTPUTS, "mono", 1.00 )
+ BEEP(config, m_beep, 0).add_route(ALL_OUTPUTS, "mono", 1.00);
MACHINE_CONFIG_END
MACHINE_CONFIG_START(oz750_state::oz750)
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu",Z80, XTAL(9'830'400)) //Toshiba microprocessor Z80 compatible at 9.8MHz
- MCFG_DEVICE_PROGRAM_MAP(rex6000_mem)
- MCFG_DEVICE_IO_MAP(oz750_io)
+ Z80(config, m_maincpu, XTAL(9'830'400)); //Toshiba microprocessor Z80 compatible at 9.8MHz
+ m_maincpu->set_addrmap(AS_PROGRAM, &oz750_state::rex6000_mem);
+ m_maincpu->set_addrmap(AS_IO, &oz750_state::oz750_io);
- MCFG_TIMER_DRIVER_ADD_PERIODIC("sec_timer", rex6000_state, sec_timer, attotime::from_hz(1))
- MCFG_TIMER_DRIVER_ADD_PERIODIC("irq_timer1", rex6000_state, irq_timer1, attotime::from_hz(64))
- MCFG_TIMER_DRIVER_ADD_PERIODIC("irq_timer2", rex6000_state, irq_timer2, attotime::from_hz(8192))
+ TIMER(config, "sec_timer").configure_periodic(FUNC(rex6000_state::sec_timer), attotime::from_hz(1));
+ TIMER(config, "irq_timer1").configure_periodic(FUNC(rex6000_state::irq_timer1), attotime::from_hz(64));
+ TIMER(config, "irq_timer2").configure_periodic(FUNC(rex6000_state::irq_timer2), attotime::from_hz(8192));
NS16550(config, m_uart, XTAL(9'830'400) / 4);
m_uart->out_tx_callback().set("serport", FUNC(rs232_port_device::write_txd));
@@ -984,13 +983,13 @@ MACHINE_CONFIG_START(oz750_state::oz750)
//serport.cts_handler().set(m_uart, FUNC(ins8250_uart_device::cts_w));
/* video hardware */
- MCFG_SCREEN_ADD("screen", LCD)
- MCFG_SCREEN_REFRESH_RATE(50)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */
- MCFG_SCREEN_UPDATE_DRIVER(oz750_state, screen_update_oz)
- MCFG_SCREEN_SIZE(240, 80)
- MCFG_SCREEN_VISIBLE_AREA(0, 240-1, 0, 80-1)
- MCFG_SCREEN_PALETTE("palette")
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_LCD));
+ screen.set_refresh_hz(50);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */
+ screen.set_screen_update(FUNC(oz750_state::screen_update_oz));
+ screen.set_size(240, 80);
+ screen.set_visarea(0, 240-1, 0, 80-1);
+ screen.set_palette("palette");
PALETTE(config, "palette", FUNC(rex6000_state::rex6000_palettte), 2);
@@ -998,7 +997,7 @@ MACHINE_CONFIG_START(oz750_state::oz750)
ADDRESS_MAP_BANK(config, "bank1").set_map(&oz750_state::oz750_banked_map).set_options(ENDIANNESS_LITTLE, 8, 32, 0x2000);
/* quickload */
- MCFG_QUICKLOAD_ADD("quickload", oz750_state, oz750, "wzd", 0)
+ MCFG_QUICKLOAD_ADD("quickload", oz750_state, oz750, "wzd")
tc8521_device &rtc(TC8521(config, TC8521_TAG, XTAL(32'768)));
rtc.out_alarm_callback().set(FUNC(rex6000_state::alarm_irq));
@@ -1011,8 +1010,7 @@ MACHINE_CONFIG_START(oz750_state::oz750)
/* sound hardware */
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD( "beeper", BEEP, 0 )
- MCFG_SOUND_ROUTE( ALL_OUTPUTS, "mono", 1.00 )
+ BEEP(config, m_beep, 0).add_route(ALL_OUTPUTS, "mono", 1.00);
MACHINE_CONFIG_END
/* ROM definition */
diff --git a/src/mame/drivers/rgum.cpp b/src/mame/drivers/rgum.cpp
index 70a10ed5f30..71a606245ab 100644
--- a/src/mame/drivers/rgum.cpp
+++ b/src/mame/drivers/rgum.cpp
@@ -245,19 +245,20 @@ static GFXDECODE_START( gfx_rgum )
GFXDECODE_END
-MACHINE_CONFIG_START(rgum_state::rgum)
+void rgum_state::rgum(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M65C02,24000000/16) /* ? MHz */
- MCFG_DEVICE_PROGRAM_MAP(rgum_map)
+ M65C02(config, m_maincpu, 24000000/16); /* ? MHz */
+ m_maincpu->set_addrmap(AS_PROGRAM, &rgum_state::rgum_map);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(256, 256)
- MCFG_SCREEN_VISIBLE_AREA(0, 256-1, 0, 256-1)
- MCFG_SCREEN_UPDATE_DRIVER(rgum_state, screen_update_royalgum)
- MCFG_SCREEN_PALETTE("palette")
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(256, 256);
+ screen.set_visarea(0, 256-1, 0, 256-1);
+ screen.set_screen_update(FUNC(rgum_state::screen_update_royalgum));
+ screen.set_palette(m_palette);
mc6845_device &crtc(MC6845(config, "crtc", 24000000/16)); /* unknown clock & type, hand tuned to get ~50 fps (?) */
crtc.set_screen("screen");
@@ -270,13 +271,13 @@ MACHINE_CONFIG_START(rgum_state::rgum)
ppi.in_pb_callback().set_ioport("IN1");
ppi.in_pc_callback().set_ioport("IN2");
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_rgum)
- MCFG_PALETTE_ADD("palette", 0x100)
+ GFXDECODE(config, m_gfxdecode, m_palette, gfx_rgum);
+ PALETTE(config, m_palette).set_entries(0x100);
SPEAKER(config, "mono").front_center();
AY8910(config, "aysnd", 24000000/16).add_route(ALL_OUTPUTS, "mono", 0.50); /* guessed to use the same xtal as the crtc */
-MACHINE_CONFIG_END
+}
diff --git a/src/mame/drivers/risc2500.cpp b/src/mame/drivers/risc2500.cpp
index e84ed89901a..86eea5d52a4 100644
--- a/src/mame/drivers/risc2500.cpp
+++ b/src/mame/drivers/risc2500.cpp
@@ -341,7 +341,6 @@ void risc2500_state::risc2500(machine_config &config)
SPEAKER(config, "speaker").front_center();
DAC_2BIT_BINARY_WEIGHTED_ONES_COMPLEMENT(config, m_dac, 0).add_route(ALL_OUTPUTS, "speaker", 0.25); // unknown DAC
voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref", 0));
- vref.set_output(5.0);
vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT);
vref.add_route(0, "dac", -1.0, DAC_VREF_NEG_INPUT);
}
diff --git a/src/mame/drivers/riscpc.cpp b/src/mame/drivers/riscpc.cpp
index b08056fdbfa..055e68225a8 100644
--- a/src/mame/drivers/riscpc.cpp
+++ b/src/mame/drivers/riscpc.cpp
@@ -814,86 +814,91 @@ void riscpc_state::machine_reset()
m_flyback_timer->adjust( attotime::never);
}
-MACHINE_CONFIG_START(riscpc_state::rpc600)
+void riscpc_state::rpc600(machine_config &config)
+{
/* Basic machine hardware */
- MCFG_DEVICE_ADD( "maincpu", ARM7, 60_MHz_XTAL/2) // ARM610
- MCFG_DEVICE_PROGRAM_MAP(a7000_mem)
+ ARM7(config, m_maincpu, 60_MHz_XTAL/2); // ARM610
+ m_maincpu->set_addrmap(AS_PROGRAM, &riscpc_state::a7000_mem);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */
- MCFG_SCREEN_SIZE(1900, 1080) //max available size
- MCFG_SCREEN_VISIBLE_AREA(0, 1900-1, 0, 1080-1)
- MCFG_SCREEN_UPDATE_DRIVER(riscpc_state, screen_update)
- MCFG_PALETTE_ADD("palette", 0x200)
-MACHINE_CONFIG_END
-
-MACHINE_CONFIG_START(riscpc_state::rpc700)
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_refresh_hz(60);
+ m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */
+ m_screen->set_size(1900, 1080); //max available size
+ m_screen->set_visarea(0, 1900-1, 0, 1080-1);
+ m_screen->set_screen_update(FUNC(riscpc_state::screen_update));
+ PALETTE(config, m_palette).set_entries(0x200);
+}
+
+void riscpc_state::rpc700(machine_config &config)
+{
/* Basic machine hardware */
- MCFG_DEVICE_ADD( "maincpu", ARM7, 80_MHz_XTAL/2) // ARM710
- MCFG_DEVICE_PROGRAM_MAP(a7000_mem)
+ ARM7(config, m_maincpu, 80_MHz_XTAL/2); // ARM710
+ m_maincpu->set_addrmap(AS_PROGRAM, &riscpc_state::a7000_mem);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */
- MCFG_SCREEN_SIZE(1900, 1080) //max available size
- MCFG_SCREEN_VISIBLE_AREA(0, 1900-1, 0, 1080-1)
- MCFG_SCREEN_UPDATE_DRIVER(riscpc_state, screen_update)
- MCFG_PALETTE_ADD("palette", 0x200)
-MACHINE_CONFIG_END
-
-MACHINE_CONFIG_START(riscpc_state::a7000)
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_refresh_hz(60);
+ m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */
+ m_screen->set_size(1900, 1080); //max available size
+ m_screen->set_visarea(0, 1900-1, 0, 1080-1);
+ m_screen->set_screen_update(FUNC(riscpc_state::screen_update));
+ PALETTE(config, m_palette).set_entries(0x200);
+}
+
+void riscpc_state::a7000(machine_config &config)
+{
/* Basic machine hardware */
- MCFG_DEVICE_ADD( "maincpu", ARM7, XTAL(32'000'000) ) // ARM7500
- MCFG_DEVICE_PROGRAM_MAP(a7000_mem)
+ ARM7(config, m_maincpu, XTAL(32'000'000)); // ARM7500
+ m_maincpu->set_addrmap(AS_PROGRAM, &riscpc_state::a7000_mem);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */
- MCFG_SCREEN_SIZE(1900, 1080) //max available size
- MCFG_SCREEN_VISIBLE_AREA(0, 1900-1, 0, 1080-1)
- MCFG_SCREEN_UPDATE_DRIVER(riscpc_state, screen_update)
- MCFG_PALETTE_ADD("palette", 0x200)
-MACHINE_CONFIG_END
-
-MACHINE_CONFIG_START(riscpc_state::a7000p)
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_refresh_hz(60);
+ m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */
+ m_screen->set_size(1900, 1080); //max available size
+ m_screen->set_visarea(0, 1900-1, 0, 1080-1);
+ m_screen->set_screen_update(FUNC(riscpc_state::screen_update));
+ PALETTE(config, m_palette).set_entries(0x200);
+}
+
+void riscpc_state::a7000p(machine_config &config)
+{
a7000(config);
- MCFG_DEVICE_MODIFY("maincpu") // ARM7500FE
- MCFG_DEVICE_CLOCK(XTAL(48'000'000))
-MACHINE_CONFIG_END
+ m_maincpu->set_clock(XTAL(48'000'000)); // ARM7500FE
+}
-MACHINE_CONFIG_START(riscpc_state::sarpc)
+void riscpc_state::sarpc(machine_config &config)
+{
/* Basic machine hardware */
- MCFG_DEVICE_ADD( "maincpu", ARM7, 202000000 ) // StrongARM
- MCFG_DEVICE_PROGRAM_MAP(a7000_mem)
+ ARM7(config, m_maincpu, 202000000); // StrongARM
+ m_maincpu->set_addrmap(AS_PROGRAM, &riscpc_state::a7000_mem);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */
- MCFG_SCREEN_SIZE(1900, 1080) //max available size
- MCFG_SCREEN_VISIBLE_AREA(0, 1900-1, 0, 1080-1)
- MCFG_SCREEN_UPDATE_DRIVER(riscpc_state, screen_update)
- MCFG_PALETTE_ADD("palette", 0x200)
-MACHINE_CONFIG_END
-
-MACHINE_CONFIG_START(riscpc_state::sarpc_j233)
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_refresh_hz(60);
+ m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */
+ m_screen->set_size(1900, 1080); //max available size
+ m_screen->set_visarea(0, 1900-1, 0, 1080-1);
+ m_screen->set_screen_update(FUNC(riscpc_state::screen_update));
+ PALETTE(config, m_palette).set_entries(0x200);
+}
+
+void riscpc_state::sarpc_j233(machine_config &config)
+{
/* Basic machine hardware */
- MCFG_DEVICE_ADD( "maincpu", ARM7, 233000000 ) // StrongARM
- MCFG_DEVICE_PROGRAM_MAP(a7000_mem)
+ ARM7(config, m_maincpu, 233000000); // StrongARM
+ m_maincpu->set_addrmap(AS_PROGRAM, &riscpc_state::a7000_mem);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */
- MCFG_SCREEN_SIZE(1900, 1080) //max available size
- MCFG_SCREEN_VISIBLE_AREA(0, 1900-1, 0, 1080-1)
- MCFG_SCREEN_UPDATE_DRIVER(riscpc_state, screen_update)
- MCFG_PALETTE_ADD("palette", 0x200)
-MACHINE_CONFIG_END
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_refresh_hz(60);
+ m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */
+ m_screen->set_size(1900, 1080); //max available size
+ m_screen->set_visarea(0, 1900-1, 0, 1080-1);
+ m_screen->set_screen_update(FUNC(riscpc_state::screen_update));
+ PALETTE(config, m_palette).set_entries(0x200);
+}
ROM_START(rpc600)
ROM_REGION( 0x800000, "user1", ROMREGION_ERASEFF )
diff --git a/src/mame/drivers/rltennis.cpp b/src/mame/drivers/rltennis.cpp
index 7f120374402..9803fba9585 100644
--- a/src/mame/drivers/rltennis.cpp
+++ b/src/mame/drivers/rltennis.cpp
@@ -181,20 +181,20 @@ void rltennis_state::ramdac_map(address_map &map)
map(0x000, 0x3ff).rw("ramdac", FUNC(ramdac_device::ramdac_pal_r), FUNC(ramdac_device::ramdac_rgb888_w));
}
-MACHINE_CONFIG_START(rltennis_state::rltennis)
-
- MCFG_DEVICE_ADD("maincpu", M68000, RLT_XTAL/2) /* 68000P8 ??? */
- MCFG_DEVICE_PROGRAM_MAP(rltennis_main)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", rltennis_state, interrupt)
+void rltennis_state::rltennis(machine_config &config)
+{
+ M68000(config, m_maincpu, RLT_XTAL/2); /* 68000P8 ??? */
+ m_maincpu->set_addrmap(AS_PROGRAM, &rltennis_state::rltennis_main);
+ m_maincpu->set_vblank_int("screen", FUNC(rltennis_state::interrupt));
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE( RLT_REFRESH_RATE )
- MCFG_SCREEN_SIZE(320, 240)
- MCFG_SCREEN_VISIBLE_AREA(0,319, 0, 239)
- MCFG_SCREEN_UPDATE_DRIVER(rltennis_state, screen_update)
- MCFG_SCREEN_PALETTE("palette")
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(RLT_REFRESH_RATE);
+ screen.set_size(320, 240);
+ screen.set_visarea(0, 319, 0, 239);
+ screen.set_screen_update(FUNC(rltennis_state::screen_update));
+ screen.set_palette("palette");
- MCFG_PALETTE_ADD("palette", 256)
+ PALETTE(config, "palette").set_entries(256);
EEPROM_2864(config, "eeprom");
@@ -204,12 +204,12 @@ MACHINE_CONFIG_START(rltennis_state::rltennis)
SPEAKER(config, "speaker").front_center();
- MCFG_DEVICE_ADD("dac1", DAC_8BIT_R2R, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 0.5) // unknown DAC
- MCFG_DEVICE_ADD("dac2", DAC_8BIT_R2R, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 0.25) // unknown DAC
- MCFG_DEVICE_ADD("vref", VOLTAGE_REGULATOR, 0) MCFG_VOLTAGE_REGULATOR_OUTPUT(5.0)
- MCFG_SOUND_ROUTE(0, "dac1", 1.0, DAC_VREF_POS_INPUT) MCFG_SOUND_ROUTE(0, "dac1", -1.0, DAC_VREF_NEG_INPUT)
- MCFG_SOUND_ROUTE(0, "dac2", 1.0, DAC_VREF_POS_INPUT) MCFG_SOUND_ROUTE(0, "dac2", -1.0, DAC_VREF_NEG_INPUT)
-MACHINE_CONFIG_END
+ DAC_8BIT_R2R(config, "dac1", 0).add_route(ALL_OUTPUTS, "speaker", 0.5); // unknown DAC
+ DAC_8BIT_R2R(config, "dac2", 0).add_route(ALL_OUTPUTS, "speaker", 0.25); // unknown DAC
+ voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref"));
+ vref.add_route(0, "dac1", 1.0, DAC_VREF_POS_INPUT); vref.add_route(0, "dac1", -1.0, DAC_VREF_NEG_INPUT);
+ vref.add_route(0, "dac2", 1.0, DAC_VREF_POS_INPUT); vref.add_route(0, "dac2", -1.0, DAC_VREF_NEG_INPUT);
+}
ROM_START( rltennis )
ROM_REGION( 0x100000, "maincpu", 0 )
diff --git a/src/mame/drivers/rm380z.cpp b/src/mame/drivers/rm380z.cpp
index e2215a65ba4..7b648e24133 100644
--- a/src/mame/drivers/rm380z.cpp
+++ b/src/mame/drivers/rm380z.cpp
@@ -234,29 +234,30 @@ uint32_t rm380z_state::screen_update_rm380z(screen_device &screen, bitmap_ind16
return 0;
}
-MACHINE_CONFIG_START(rm380z_state::rm380z)
+void rm380z_state::rm380z(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD(RM380Z_MAINCPU_TAG, Z80, 16_MHz_XTAL / 4)
- MCFG_DEVICE_PROGRAM_MAP(rm380z_mem)
- MCFG_DEVICE_IO_MAP(rm380z_io)
+ Z80(config, m_maincpu, 16_MHz_XTAL / 4);
+ m_maincpu->set_addrmap(AS_PROGRAM, &rm380z_state::rm380z_mem);
+ m_maincpu->set_addrmap(AS_IO, &rm380z_state::rm380z_io);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(50)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(50);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
// according to videos and pictures of the real hardware, chars are spaced of at least 1 pixel
// and there is at least 1 pixel between each row of characters
- MCFG_SCREEN_SIZE((RM380Z_SCREENCOLS*(RM380Z_CHDIMX+1)), (RM380Z_SCREENROWS*(RM380Z_CHDIMY+1)))
- MCFG_SCREEN_VISIBLE_AREA(0, (RM380Z_SCREENCOLS*(RM380Z_CHDIMX+1))-1, 0, (RM380Z_SCREENROWS*(RM380Z_CHDIMY+1))-1)
- MCFG_SCREEN_UPDATE_DRIVER(rm380z_state, screen_update_rm380z)
- MCFG_SCREEN_PALETTE("palette")
+ screen.set_size((RM380Z_SCREENCOLS*(RM380Z_CHDIMX+1)), (RM380Z_SCREENROWS*(RM380Z_CHDIMY+1)));
+ screen.set_visarea(0, (RM380Z_SCREENCOLS*(RM380Z_CHDIMX+1))-1, 0, (RM380Z_SCREENROWS*(RM380Z_CHDIMY+1))-1);
+ screen.set_screen_update(FUNC(rm380z_state::screen_update_rm380z));
+ screen.set_palette("palette");
PALETTE(config, "palette", palette_device::MONOCHROME);
/* cassette */
- MCFG_CASSETTE_ADD( "cassette" )
-// MCFG_CASSETTE_DEFAULT_STATE(CASSETTE_STOPPED | CASSETTE_MOTOR_ENABLED | CASSETTE_SPEAKER_MUTED)
- MCFG_CASSETTE_DEFAULT_STATE(CASSETTE_PLAY | CASSETTE_MOTOR_ENABLED)
+ CASSETTE(config, m_cassette);
+// m_cassette->set_default_state(CASSETTE_STOPPED | CASSETTE_MOTOR_ENABLED | CASSETTE_SPEAKER_MUTED);
+ m_cassette->set_default_state(CASSETTE_PLAY | CASSETTE_MOTOR_ENABLED);
//m_cassette->change_state((BIT(data,x)) ? CASSETTE_MOTOR_DISABLED : CASSETTE_MOTOR_ENABLED, CASSETTE_MASK_MOTOR);
/* RAM configurations */
@@ -265,36 +266,37 @@ MACHINE_CONFIG_START(rm380z_state::rm380z)
/* floppy disk */
FD1771(config, m_fdc, 1_MHz_XTAL);
- MCFG_FLOPPY_DRIVE_ADD("wd1771:0", rm380z_floppies, "sssd", floppy_image_device::default_floppy_formats)
- MCFG_FLOPPY_DRIVE_ADD("wd1771:1", rm380z_floppies, "sssd", floppy_image_device::default_floppy_formats)
+ FLOPPY_CONNECTOR(config, "wd1771:0", rm380z_floppies, "sssd", floppy_image_device::default_floppy_formats);
+ FLOPPY_CONNECTOR(config, "wd1771:1", rm380z_floppies, "sssd", floppy_image_device::default_floppy_formats);
/* keyboard */
generic_keyboard_device &keyboard(GENERIC_KEYBOARD(config, "keyboard", 0));
keyboard.set_keyboard_callback(FUNC(rm380z_state::keyboard_put));
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(rm380z_state::rm480z)
+void rm380z_state::rm480z(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD(RM380Z_MAINCPU_TAG, Z80, 16_MHz_XTAL / 4)
- MCFG_DEVICE_PROGRAM_MAP(rm480z_mem)
- MCFG_DEVICE_IO_MAP(rm480z_io)
+ Z80(config, m_maincpu, 16_MHz_XTAL / 4);
+ m_maincpu->set_addrmap(AS_PROGRAM, &rm380z_state::rm480z_mem);
+ m_maincpu->set_addrmap(AS_IO, &rm380z_state::rm480z_io);
MCFG_MACHINE_RESET_OVERRIDE(rm380z_state, rm480z)
/* video hardware */
-// MCFG_SCREEN_ADD("screen", RASTER)
-// MCFG_SCREEN_REFRESH_RATE(50)
-// MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
-// MCFG_SCREEN_SIZE((RM380Z_SCREENCOLS*(RM380Z_CHDIMX+1)), (RM380Z_SCREENROWS*(RM380Z_CHDIMY+1)))
-// MCFG_SCREEN_VISIBLE_AREA(0, (RM380Z_SCREENCOLS*(RM380Z_CHDIMX+1))-1, 0, (RM380Z_SCREENROWS*(RM380Z_CHDIMY+1))-1)
-// MCFG_SCREEN_UPDATE_DRIVER(rm380z_state, screen_update_rm480z)
-// MCFG_SCREEN_PALETTE("palette")
+// screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+// screen.set_refresh_hz(50);
+// screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+// screen.set_size((RM380Z_SCREENCOLS*(RM380Z_CHDIMX+1)), (RM380Z_SCREENROWS*(RM380Z_CHDIMY+1)));
+// screen.set_visarea(0, (RM380Z_SCREENCOLS*(RM380Z_CHDIMX+1))-1, 0, (RM380Z_SCREENROWS*(RM380Z_CHDIMY+1))-1);
+// screen.set_screen_update(FUNC(rm380z_state::screen_update_rm480z));
+// screen.set_palette("palette");
-// MCFG_PALETTE_ADD_MONOCHROME("palette")
+// PALETTE(config, "palette", palette_device::MONOCHROME);
/* keyboard */
// generic_keyboard_device &keyboard(GENERIC_KEYBOARD(config, "keyboard", 0));
// keyboard.set_keyboard_callback(FUNC(rm380z_state::keyboard_put));
-MACHINE_CONFIG_END
+}
/* ROM definitions */
diff --git a/src/mame/drivers/rmhaihai.cpp b/src/mame/drivers/rmhaihai.cpp
index be4b0356e2b..5bd7aeb155c 100644
--- a/src/mame/drivers/rmhaihai.cpp
+++ b/src/mame/drivers/rmhaihai.cpp
@@ -71,7 +71,6 @@ protected:
void rmhaihai_io_map(address_map &map);
void rmhaihai_map(address_map &map);
-private:
required_device<cpu_device> m_maincpu;
required_device<msm5205_device> m_msm;
required_device<gfxdecode_device> m_gfxdecode;
@@ -504,27 +503,26 @@ static GFXDECODE_START( gfx_themj )
GFXDECODE_END
-MACHINE_CONFIG_START(rmhaihai_state::rmhaihai)
-
+void rmhaihai_state::rmhaihai(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu",Z80,20000000/4) /* 5 MHz ??? */
- MCFG_DEVICE_PROGRAM_MAP(rmhaihai_map)
- MCFG_DEVICE_IO_MAP(rmhaihai_io_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", rmhaihai_state, irq0_line_hold)
+ Z80(config, m_maincpu, 20000000/4); /* 5 MHz ??? */
+ m_maincpu->set_addrmap(AS_PROGRAM, &rmhaihai_state::rmhaihai_map);
+ m_maincpu->set_addrmap(AS_IO, &rmhaihai_state::rmhaihai_io_map);
+ m_maincpu->set_vblank_int("screen", FUNC(rmhaihai_state::irq0_line_hold));
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(64*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(4*8, 60*8-1, 2*8, 30*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(rmhaihai_state, screen_update)
- MCFG_SCREEN_PALETTE("palette")
-
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_rmhaihai)
-
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(64*8, 32*8);
+ screen.set_visarea(4*8, 60*8-1, 2*8, 30*8-1);
+ screen.set_screen_update(FUNC(rmhaihai_state::screen_update));
+ screen.set_palette("palette");
+
+ GFXDECODE(config, m_gfxdecode, "palette", gfx_rmhaihai);
PALETTE(config, "palette", palette_device::RGB_444_PROMS, "proms", 0x100);
/* sound hardware */
@@ -535,38 +533,34 @@ MACHINE_CONFIG_START(rmhaihai_state::rmhaihai)
aysnd.port_b_read_callback().set_ioport("DSW1");
aysnd.add_route(ALL_OUTPUTS, "mono", 0.30);
- MCFG_DEVICE_ADD("msm", MSM5205, 500000)
- MCFG_MSM5205_PRESCALER_SELECTOR(SEX_4B)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
-MACHINE_CONFIG_END
+ MSM5205(config, m_msm, 500000);
+ m_msm->set_prescaler_selector(msm5205_device::SEX_4B);
+ m_msm->add_route(ALL_OUTPUTS, "mono", 1.0);
+}
-MACHINE_CONFIG_START(rmhaisei_state::rmhaisei)
+void rmhaisei_state::rmhaisei(machine_config &config)
+{
rmhaihai(config);
- /* basic machine hardware */
-
/* video hardware */
- MCFG_GFXDECODE_MODIFY("gfxdecode", gfx_themj)
- MCFG_DEVICE_MODIFY("palette")
- MCFG_PALETTE_ENTRIES(0x200)
-MACHINE_CONFIG_END
+ m_gfxdecode->set_info(gfx_themj);
+ subdevice<palette_device>("palette")->set_entries(0x200);
+}
-MACHINE_CONFIG_START(themj_state::themj)
+void themj_state::themj(machine_config &config)
+{
rmhaihai(config);
/* basic machine hardware */
+ m_maincpu->set_addrmap(AS_PROGRAM, &themj_state::themj_map);
+ m_maincpu->set_addrmap(AS_IO, &themj_state::themj_io_map);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(themj_map)
- MCFG_DEVICE_IO_MAP(themj_io_map)
-
- MCFG_DEVICE_REMOVE("nvram")
+ config.device_remove("nvram");
/* video hardware */
- MCFG_GFXDECODE_MODIFY("gfxdecode", gfx_themj)
- MCFG_DEVICE_MODIFY("palette")
- MCFG_PALETTE_ENTRIES(0x200)
-MACHINE_CONFIG_END
+ m_gfxdecode->set_info(gfx_themj);
+ subdevice<palette_device>("palette")->set_entries(0x200);
+}
diff --git a/src/mame/drivers/rmnimbus.cpp b/src/mame/drivers/rmnimbus.cpp
index f8e367dda5d..5c9c3cffe24 100644
--- a/src/mame/drivers/rmnimbus.cpp
+++ b/src/mame/drivers/rmnimbus.cpp
@@ -127,7 +127,7 @@ void rmnimbus_state::nimbus(machine_config &config)
SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
m_screen->set_raw(4.433619_MHz_XTAL * 2, 650, 0, 640, 260, 0, 250);
m_screen->set_screen_update(FUNC(rmnimbus_state::screen_update_nimbus));
- //MCFG_SCREEN_VIDEO_ATTRIBUTES(VIDEO_UPDATE_SCANLINE)
+ //m_screen->set_video_attributes(VIDEO_UPDATE_SCANLINE);
m_screen->set_palette(m_palette);
PALETTE(config, m_palette).set_entries(16);
diff --git a/src/mame/drivers/rmt32.cpp b/src/mame/drivers/rmt32.cpp
index c704d07b21f..3e93698e165 100644
--- a/src/mame/drivers/rmt32.cpp
+++ b/src/mame/drivers/rmt32.cpp
@@ -349,31 +349,32 @@ void mt32_state::mt32_map(address_map &map)
map(0xc000, 0xffff).bankrw("fixed");
}
-MACHINE_CONFIG_START(mt32_state::mt32)
- i8x9x_device &maincpu(P8098(config, "maincpu", 12_MHz_XTAL));
+void mt32_state::mt32(machine_config &config)
+{
+ i8x9x_device &maincpu(P8098(config, cpu, 12_MHz_XTAL));
maincpu.set_addrmap(AS_PROGRAM, &mt32_state::mt32_map);
maincpu.ach7_cb().set_ioport("A7");
maincpu.serial_tx_cb().set(FUNC(mt32_state::midi_w));
maincpu.in_p0_cb().set(FUNC(mt32_state::port0_r));
- RAM( config, "ram" ).set_default_size( "32K" );
+ RAM(config, ram).set_default_size("32K");
- MCFG_SCREEN_ADD( "screen", LCD )
- MCFG_SCREEN_REFRESH_RATE(50)
- MCFG_SCREEN_UPDATE_DRIVER(mt32_state, screen_update)
-// MCFG_SCREEN_SIZE(20*6-1, 9)
- MCFG_SCREEN_SIZE(20*6-1, (20*6-1)*3/4)
- MCFG_SCREEN_VISIBLE_AREA(0, 20*6-2, 0, (20*6-1)*3/4-1)
- MCFG_SCREEN_PALETTE("palette")
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_LCD));
+ screen.set_refresh_hz(50);
+ screen.set_screen_update(FUNC(mt32_state::screen_update));
+// screen.set_size(20*6-1, 9);
+ screen.set_size(20*6-1, (20*6-1)*3/4);
+ screen.set_visarea(0, 20*6-2, 0, (20*6-1)*3/4-1);
+ screen.set_palette("palette");
PALETTE(config, "palette", FUNC(mt32_state::mt32_palette), 2);
- MCFG_SED1200D0A_ADD( "lcd" )
+ SED1200D0A(config, lcd, 0);
- MCFG_TIMER_DRIVER_ADD( "midi_timer", mt32_state, midi_timer_cb )
+ TIMER(config, midi_timer).configure_generic(FUNC(mt32_state::midi_timer_cb));
- MCFG_TIMER_DRIVER_ADD_PERIODIC( "samples_timer", mt32_state, samples_timer_cb, attotime::from_hz(32000*2) )
-MACHINE_CONFIG_END
+ TIMER(config, "samples_timer").configure_periodic(FUNC(mt32_state::samples_timer_cb), attotime::from_hz(32000*2));
+}
ROM_START( mt32 )
ROM_REGION( 0x10000, "maincpu", 0 )
diff --git a/src/mame/drivers/rockrage.cpp b/src/mame/drivers/rockrage.cpp
index 81abbeb1508..803b9859ffa 100644
--- a/src/mame/drivers/rockrage.cpp
+++ b/src/mame/drivers/rockrage.cpp
@@ -248,26 +248,26 @@ void rockrage_state::machine_reset()
m_vreg = 0;
}
-MACHINE_CONFIG_START(rockrage_state::rockrage)
-
+void rockrage_state::rockrage(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", HD6309E, XTAL(24'000'000) / 8)
- MCFG_DEVICE_PROGRAM_MAP(rockrage_map)
+ HD6309E(config, m_maincpu, XTAL(24'000'000) / 8);
+ m_maincpu->set_addrmap(AS_PROGRAM, &rockrage_state::rockrage_map);
- MCFG_DEVICE_ADD("audiocpu", MC6809E, XTAL(24'000'000) / 16)
- MCFG_DEVICE_PROGRAM_MAP(rockrage_sound_map)
+ MC6809E(config, m_audiocpu, XTAL(24'000'000) / 16);
+ m_audiocpu->set_addrmap(AS_PROGRAM, &rockrage_state::rockrage_sound_map);
WATCHDOG_TIMER(config, "watchdog");
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(32*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(rockrage_state, screen_update_rockrage)
- MCFG_SCREEN_PALETTE("palette")
- MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE(*this, rockrage_state, vblank_irq))
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(32*8, 32*8);
+ screen.set_visarea(0*8, 32*8-1, 2*8, 30*8-1);
+ screen.set_screen_update(FUNC(rockrage_state::screen_update_rockrage));
+ screen.set_palette(m_palette);
+ screen.screen_vblank().set(FUNC(rockrage_state::vblank_irq));
K007342(config, m_k007342, 0);
m_k007342->set_gfxnum(0);
@@ -292,11 +292,11 @@ MACHINE_CONFIG_START(rockrage_state::rockrage)
YM2151(config, "ymsnd", 3579545).add_route(0, "lspeaker", 0.60).add_route(1, "rspeaker", 0.60);
- MCFG_DEVICE_ADD("vlm", VLM5030, 3579545)
- MCFG_DEVICE_ADDRESS_MAP(0, rockrage_vlm_map)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 0.60)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 0.60)
-MACHINE_CONFIG_END
+ VLM5030(config, m_vlm, 3579545);
+ m_vlm->set_addrmap(0, &rockrage_state::rockrage_vlm_map);
+ m_vlm->add_route(ALL_OUTPUTS, "lspeaker", 0.60);
+ m_vlm->add_route(ALL_OUTPUTS, "rspeaker", 0.60);
+}
/***************************************************************************
diff --git a/src/mame/drivers/rocnrope.cpp b/src/mame/drivers/rocnrope.cpp
index d112e720d84..2518a36dfab 100644
--- a/src/mame/drivers/rocnrope.cpp
+++ b/src/mame/drivers/rocnrope.cpp
@@ -206,11 +206,11 @@ WRITE_LINE_MEMBER(rocnrope_state::vblank_irq)
m_maincpu->set_input_line(M6809_IRQ_LINE, ASSERT_LINE);
}
-MACHINE_CONFIG_START(rocnrope_state::rocnrope)
-
+void rocnrope_state::rocnrope(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", KONAMI1, MASTER_CLOCK / 3 / 4) /* Verified in schematics */
- MCFG_DEVICE_PROGRAM_MAP(rocnrope_map)
+ KONAMI1(config, m_maincpu, MASTER_CLOCK / 3 / 4); /* Verified in schematics */
+ m_maincpu->set_addrmap(AS_PROGRAM, &rocnrope_state::rocnrope_map);
ls259_device &mainlatch(LS259(config, "mainlatch")); // B2
mainlatch.q_out_cb<0>().set(FUNC(rocnrope_state::flip_screen_w));
@@ -223,21 +223,21 @@ MACHINE_CONFIG_START(rocnrope_state::rocnrope)
WATCHDOG_TIMER(config, "watchdog");
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(32*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(rocnrope_state, screen_update_rocnrope)
- MCFG_SCREEN_PALETTE(m_palette)
- MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE(*this, rocnrope_state, vblank_irq))
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(32*8, 32*8);
+ screen.set_visarea(0*8, 32*8-1, 2*8, 30*8-1);
+ screen.set_screen_update(FUNC(rocnrope_state::screen_update_rocnrope));
+ screen.set_palette(m_palette);
+ screen.screen_vblank().set(FUNC(rocnrope_state::vblank_irq));
GFXDECODE(config, m_gfxdecode, m_palette, gfx_rocnrope);
PALETTE(config, m_palette, FUNC(rocnrope_state::rocnrope_palette), 16*16+16*16, 32);
/* sound hardware */
TIMEPLT_AUDIO(config, "timeplt_audio");
-MACHINE_CONFIG_END
+}
/*************************************
*
diff --git a/src/mame/drivers/rohga.cpp b/src/mame/drivers/rohga.cpp
index 00bafa5cc90..da1d4c8d39d 100644
--- a/src/mame/drivers/rohga.cpp
+++ b/src/mame/drivers/rohga.cpp
@@ -871,12 +871,12 @@ DECOSPR_COLOUR_CB_MEMBER(rohga_state::schmeisr_col_callback)
return colour;
}
-MACHINE_CONFIG_START(rohga_state::rohga)
-
+void rohga_state::rohga(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M68000, 14000000)
- MCFG_DEVICE_PROGRAM_MAP(rohga_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", rohga_state, irq6_line_assert)
+ M68000(config, m_maincpu, 14000000);
+ m_maincpu->set_addrmap(AS_PROGRAM, &rohga_state::rohga_map);
+ m_maincpu->set_vblank_int("screen", FUNC(rohga_state::irq6_line_assert));
H6280(config, m_audiocpu, 32220000/4/3); /* verified on pcb (8.050Mhz is XIN on pin 10 of H6280 */
m_audiocpu->set_addrmap(AS_PROGRAM, &rohga_state::sound_map);
@@ -884,18 +884,18 @@ MACHINE_CONFIG_START(rohga_state::rohga)
m_audiocpu->add_route(ALL_OUTPUTS, "rspeaker", 0);
/* video hardware */
- MCFG_DEVICE_ADD("spriteram1", BUFFERED_SPRITERAM16)
+ BUFFERED_SPRITERAM16(config, m_spriteram[0]);
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(58)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(529))
- MCFG_SCREEN_SIZE(40*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 40*8-1, 1*8, 31*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(rohga_state, screen_update_rohga)
- MCFG_SCREEN_PALETTE("palette")
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(58);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(529));
+ screen.set_size(40*8, 32*8);
+ screen.set_visarea(0*8, 40*8-1, 1*8, 31*8-1);
+ screen.set_screen_update(FUNC(rohga_state::screen_update_rohga));
+ screen.set_palette(m_palette);
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_rohga)
- MCFG_PALETTE_ADD("palette", 2048)
+ GFXDECODE(config, "gfxdecode", m_palette, gfx_rohga);
+ PALETTE(config, m_palette).set_entries(2048);
DECOCOMN(config, m_decocomn, 0);
m_decocomn->set_palette_tag(m_palette);
@@ -954,21 +954,21 @@ MACHINE_CONFIG_START(rohga_state::rohga)
ymsnd.add_route(0, "lspeaker", 0.78);
ymsnd.add_route(1, "rspeaker", 0.78);
- MCFG_DEVICE_ADD("oki1", OKIM6295, 32220000/32, okim6295_device::PIN7_HIGH)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 1.0)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 1.0)
+ OKIM6295(config, m_oki[0], 32220000/32, okim6295_device::PIN7_HIGH);
+ m_oki[0]->add_route(ALL_OUTPUTS, "lspeaker", 1.0);
+ m_oki[0]->add_route(ALL_OUTPUTS, "rspeaker", 1.0);
- MCFG_DEVICE_ADD("oki2", OKIM6295, 32220000/16, okim6295_device::PIN7_HIGH)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 0.40)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 0.40)
-MACHINE_CONFIG_END
-
-MACHINE_CONFIG_START(rohga_state::wizdfire)
+ OKIM6295(config, m_oki[1], 32220000/16, okim6295_device::PIN7_HIGH);
+ m_oki[1]->add_route(ALL_OUTPUTS, "lspeaker", 0.40);
+ m_oki[1]->add_route(ALL_OUTPUTS, "rspeaker", 0.40);
+}
+void rohga_state::wizdfire(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M68000, 14000000)
- MCFG_DEVICE_PROGRAM_MAP(wizdfire_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", rohga_state, irq6_line_assert)
+ M68000(config, m_maincpu, 14000000);
+ m_maincpu->set_addrmap(AS_PROGRAM, &rohga_state::wizdfire_map);
+ m_maincpu->set_vblank_int("screen", FUNC(rohga_state::irq6_line_assert));
H6280(config, m_audiocpu, 32220000/4/3); /* verified on pcb (8.050Mhz is XIN on pin 10 of H6280 */
m_audiocpu->set_addrmap(AS_PROGRAM, &rohga_state::sound_map);
@@ -976,18 +976,18 @@ MACHINE_CONFIG_START(rohga_state::wizdfire)
m_audiocpu->add_route(ALL_OUTPUTS, "rspeaker", 0);
/* video hardware */
- MCFG_DEVICE_ADD("spriteram1", BUFFERED_SPRITERAM16)
- MCFG_DEVICE_ADD("spriteram2", BUFFERED_SPRITERAM16)
+ BUFFERED_SPRITERAM16(config, m_spriteram[0]);
+ BUFFERED_SPRITERAM16(config, m_spriteram[1]);
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(58)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(529))
- MCFG_SCREEN_SIZE(40*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 40*8-1, 1*8, 31*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(rohga_state, screen_update_wizdfire)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(58);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(529));
+ screen.set_size(40*8, 32*8);
+ screen.set_visarea(0*8, 40*8-1, 1*8, 31*8-1);
+ screen.set_screen_update(FUNC(rohga_state::screen_update_wizdfire));
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_wizdfire)
- MCFG_PALETTE_ADD("palette", 2048)
+ GFXDECODE(config, "gfxdecode", m_palette, gfx_wizdfire);
+ PALETTE(config, m_palette).set_entries(2048);
DECOCOMN(config, m_decocomn, 0);
m_decocomn->set_palette_tag(m_palette);
@@ -1051,21 +1051,21 @@ MACHINE_CONFIG_START(rohga_state::wizdfire)
ymsnd.add_route(0, "lspeaker", 0.80);
ymsnd.add_route(1, "rspeaker", 0.80);
- MCFG_DEVICE_ADD("oki1", OKIM6295, 32220000/32, okim6295_device::PIN7_HIGH)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 1.0)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 1.0)
-
- MCFG_DEVICE_ADD("oki2", OKIM6295, 32220000/16, okim6295_device::PIN7_HIGH)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 0.40)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 0.40)
-MACHINE_CONFIG_END
+ OKIM6295(config, m_oki[0], 32220000/32, okim6295_device::PIN7_HIGH);
+ m_oki[0]->add_route(ALL_OUTPUTS, "lspeaker", 1.0);
+ m_oki[0]->add_route(ALL_OUTPUTS, "rspeaker", 1.0);
-MACHINE_CONFIG_START(rohga_state::nitrobal)
+ OKIM6295(config, m_oki[1], 32220000/16, okim6295_device::PIN7_HIGH);
+ m_oki[1]->add_route(ALL_OUTPUTS, "lspeaker", 0.40);
+ m_oki[1]->add_route(ALL_OUTPUTS, "rspeaker", 0.40);
+}
+void rohga_state::nitrobal(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M68000, 14000000)
- MCFG_DEVICE_PROGRAM_MAP(nitrobal_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", rohga_state, irq6_line_assert)
+ M68000(config, m_maincpu, 14000000);
+ m_maincpu->set_addrmap(AS_PROGRAM, &rohga_state::nitrobal_map);
+ m_maincpu->set_vblank_int("screen", FUNC(rohga_state::irq6_line_assert));
H6280(config, m_audiocpu, 32220000/4/3); /* verified on pcb (8.050Mhz is XIN on pin 10 of H6280 */
m_audiocpu->set_addrmap(AS_PROGRAM, &rohga_state::sound_map);
@@ -1073,18 +1073,18 @@ MACHINE_CONFIG_START(rohga_state::nitrobal)
m_audiocpu->add_route(ALL_OUTPUTS, "rspeaker", 0);
/* video hardware */
- MCFG_DEVICE_ADD("spriteram1", BUFFERED_SPRITERAM16)
- MCFG_DEVICE_ADD("spriteram2", BUFFERED_SPRITERAM16)
+ BUFFERED_SPRITERAM16(config, m_spriteram[0]);
+ BUFFERED_SPRITERAM16(config, m_spriteram[1]);
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(58)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(529))
- MCFG_SCREEN_SIZE(40*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 40*8-1, 1*8, 31*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(rohga_state, screen_update_nitrobal)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(58);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(529));
+ screen.set_size(40*8, 32*8);
+ screen.set_visarea(0*8, 40*8-1, 1*8, 31*8-1);
+ screen.set_screen_update(FUNC(rohga_state::screen_update_nitrobal));
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_wizdfire)
- MCFG_PALETTE_ADD("palette", 2048)
+ GFXDECODE(config, "gfxdecode", m_palette, gfx_wizdfire);
+ PALETTE(config, m_palette).set_entries(2048);
DECOCOMN(config, m_decocomn, 0);
m_decocomn->set_palette_tag(m_palette);
@@ -1149,21 +1149,21 @@ MACHINE_CONFIG_START(rohga_state::nitrobal)
ymsnd.add_route(0, "lspeaker", 0.80);
ymsnd.add_route(1, "rspeaker", 0.80);
- MCFG_DEVICE_ADD("oki1", OKIM6295, 32220000/32, okim6295_device::PIN7_HIGH)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 1.0)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 1.0)
-
- MCFG_DEVICE_ADD("oki2", OKIM6295, 32220000/16, okim6295_device::PIN7_HIGH)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 0.40)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 0.40)
-MACHINE_CONFIG_END
+ OKIM6295(config, m_oki[0], 32220000/32, okim6295_device::PIN7_HIGH);
+ m_oki[0]->add_route(ALL_OUTPUTS, "lspeaker", 1.0);
+ m_oki[0]->add_route(ALL_OUTPUTS, "rspeaker", 1.0);
-MACHINE_CONFIG_START(rohga_state::schmeisr)
+ OKIM6295(config, m_oki[1], 32220000/16, okim6295_device::PIN7_HIGH);
+ m_oki[1]->add_route(ALL_OUTPUTS, "lspeaker", 0.40);
+ m_oki[1]->add_route(ALL_OUTPUTS, "rspeaker", 0.40);
+}
+void rohga_state::schmeisr(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M68000, 14000000)
- MCFG_DEVICE_PROGRAM_MAP(schmeisr_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", rohga_state, irq6_line_assert)
+ M68000(config, m_maincpu, 14000000);
+ m_maincpu->set_addrmap(AS_PROGRAM, &rohga_state::schmeisr_map);
+ m_maincpu->set_vblank_int("screen", FUNC(rohga_state::irq6_line_assert));
H6280(config, m_audiocpu, 32220000/4/3); /* verified on pcb (8.050Mhz is XIN on pin 10 of H6280 */
m_audiocpu->set_addrmap(AS_PROGRAM, &rohga_state::sound_map);
@@ -1171,18 +1171,18 @@ MACHINE_CONFIG_START(rohga_state::schmeisr)
m_audiocpu->add_route(ALL_OUTPUTS, "rspeaker", 0);
/* video hardware */
- MCFG_DEVICE_ADD("spriteram1", BUFFERED_SPRITERAM16)
+ BUFFERED_SPRITERAM16(config, m_spriteram[0]);
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(58)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(529))
- MCFG_SCREEN_SIZE(40*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 40*8-1, 1*8, 31*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(rohga_state, screen_update_rohga)
- MCFG_SCREEN_PALETTE("palette")
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(58);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(529));
+ screen.set_size(40*8, 32*8);
+ screen.set_visarea(0*8, 40*8-1, 1*8, 31*8-1);
+ screen.set_screen_update(FUNC(rohga_state::screen_update_rohga));
+ screen.set_palette(m_palette);
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_schmeisr)
- MCFG_PALETTE_ADD("palette", 2048)
+ GFXDECODE(config, "gfxdecode", m_palette, gfx_schmeisr);
+ PALETTE(config, m_palette).set_entries(2048);
DECOCOMN(config, m_decocomn, 0);
m_decocomn->set_palette_tag(m_palette);
@@ -1241,24 +1241,24 @@ MACHINE_CONFIG_START(rohga_state::schmeisr)
ymsnd.add_route(0, "lspeaker", 0.80);
ymsnd.add_route(1, "rspeaker", 0.80);
- MCFG_DEVICE_ADD("oki1", OKIM6295, 32220000/32, okim6295_device::PIN7_HIGH)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 1.0)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 1.0)
+ OKIM6295(config, m_oki[0], 32220000/32, okim6295_device::PIN7_HIGH);
+ m_oki[0]->add_route(ALL_OUTPUTS, "lspeaker", 1.0);
+ m_oki[0]->add_route(ALL_OUTPUTS, "rspeaker", 1.0);
- MCFG_DEVICE_ADD("oki2", OKIM6295, 32220000/16, okim6295_device::PIN7_HIGH)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 0.40)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 0.40)
-MACHINE_CONFIG_END
+ OKIM6295(config, m_oki[1], 32220000/16, okim6295_device::PIN7_HIGH);
+ m_oki[1]->add_route(ALL_OUTPUTS, "lspeaker", 0.40);
+ m_oki[1]->add_route(ALL_OUTPUTS, "rspeaker", 0.40);
+}
-MACHINE_CONFIG_START(rohga_state::hangzo)
+void rohga_state::hangzo(machine_config &config)
+{
schmeisr(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(hangzo_map)
-MACHINE_CONFIG_END
+ m_maincpu->set_addrmap(AS_PROGRAM, &rohga_state::hangzo_map);
+}
/**********************************************************************************/
diff --git a/src/mame/drivers/rollext.cpp b/src/mame/drivers/rollext.cpp
index 5fdda435c6b..8a5af16a441 100644
--- a/src/mame/drivers/rollext.cpp
+++ b/src/mame/drivers/rollext.cpp
@@ -543,25 +543,26 @@ void rollext_state::machine_start()
}
-MACHINE_CONFIG_START(rollext_state::rollext)
- MCFG_DEVICE_ADD("maincpu", TMS32082_MP, 60000000)
- MCFG_DEVICE_PROGRAM_MAP(memmap)
- //MCFG_DEVICE_VBLANK_INT_DRIVER("screen", rollext_state, vblank_interrupt)
- MCFG_DEVICE_PERIODIC_INT_DRIVER(rollext_state, irq1_line_assert, 60)
- //MCFG_DEVICE_PERIODIC_INT_DRIVER(rollext_state, irq3_line_assert, 500)
-
- MCFG_DEVICE_ADD("pp0", TMS32082_PP, 60000000)
- MCFG_DEVICE_PROGRAM_MAP(memmap);
-
- MCFG_QUANTUM_TIME(attotime::from_hz(100))
-
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(512, 384)
- MCFG_SCREEN_VISIBLE_AREA(0, 511, 0, 383)
- MCFG_SCREEN_UPDATE_DRIVER(rollext_state, screen_update)
-MACHINE_CONFIG_END
+void rollext_state::rollext(machine_config &config)
+{
+ TMS32082_MP(config, m_maincpu, 60000000);
+ m_maincpu->set_addrmap(AS_PROGRAM, &rollext_state::memmap);
+ //m_maincpu->set_vblank_int("screen", FUNC(rollext_state::vblank_interrupt));
+ m_maincpu->set_periodic_int(FUNC(rollext_state::irq1_line_assert), attotime::from_hz(60));
+ //m_maincpu->set_periodic_int(FUNC(rollext_state::irq3_line_assert), attotime::from_hz(500));
+
+ tms32082_pp_device &pp0(TMS32082_PP(config, "pp0", 60000000));
+ pp0.set_addrmap(AS_PROGRAM, &rollext_state::memmap);
+
+ config.m_minimum_quantum = attotime::from_hz(100);
+
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_refresh_hz(60);
+ m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ m_screen->set_size(512, 384);
+ m_screen->set_visarea(0, 511, 0, 383);
+ m_screen->set_screen_update(FUNC(rollext_state::screen_update));
+}
INTERRUPT_GEN_MEMBER(rollext_state::vblank_interrupt)
diff --git a/src/mame/drivers/rollrace.cpp b/src/mame/drivers/rollrace.cpp
index b9e4655c71c..b05c7776697 100644
--- a/src/mame/drivers/rollrace.cpp
+++ b/src/mame/drivers/rollrace.cpp
@@ -249,15 +249,15 @@ INTERRUPT_GEN_MEMBER(rollrace_state::sound_timer_irq)
device.execute().pulse_input_line(INPUT_LINE_NMI, attotime::zero);
}
-MACHINE_CONFIG_START(rollrace_state::rollrace)
-
+void rollrace_state::rollrace(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80,XTAL(24'000'000)/8) /* verified on pcb */
- MCFG_DEVICE_PROGRAM_MAP(rollrace_map)
+ Z80(config, m_maincpu, XTAL(24'000'000)/8); /* verified on pcb */
+ m_maincpu->set_addrmap(AS_PROGRAM, &rollrace_state::rollrace_map);
- MCFG_DEVICE_ADD("audiocpu", Z80,XTAL(24'000'000)/16) /* verified on pcb */
- MCFG_DEVICE_PROGRAM_MAP(rollrace_sound_map)
- MCFG_DEVICE_PERIODIC_INT_DRIVER(rollrace_state, sound_timer_irq, 4*60)
+ z80_device &audiocpu(Z80(config, "audiocpu", XTAL(24'000'000)/16)); /* verified on pcb */
+ audiocpu.set_addrmap(AS_PROGRAM, &rollrace_state::rollrace_sound_map);
+ audiocpu.set_periodic_int(FUNC(rollrace_state::sound_timer_irq), attotime::from_hz(4*60));
ls259_device &mainlatch(LS259(config, "mainlatch"));
mainlatch.q_out_cb<0>().set(FUNC(rollrace_state::flipx_w));
@@ -269,14 +269,14 @@ MACHINE_CONFIG_START(rollrace_state::rollrace)
mainlatch.q_out_cb<6>().set(FUNC(rollrace_state::spritebank_w));
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */)
- MCFG_SCREEN_SIZE(256, 256)
- MCFG_SCREEN_VISIBLE_AREA(0,256-1,16, 255-16)
- MCFG_SCREEN_UPDATE_DRIVER(rollrace_state, screen_update)
- MCFG_SCREEN_PALETTE(m_palette)
- MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE(*this, rollrace_state, vblank_irq))
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500) /* not accurate */);
+ screen.set_size(256, 256);
+ screen.set_visarea(0, 256-1, 16, 255-16);
+ screen.set_screen_update(FUNC(rollrace_state::screen_update));
+ screen.set_palette(m_palette);
+ screen.screen_vblank().set(FUNC(rollrace_state::vblank_irq));
GFXDECODE(config, m_gfxdecode, m_palette, gfx_rollrace);
PALETTE(config, m_palette, FUNC(rollrace_state::rollrace_palette), 256);
@@ -292,16 +292,16 @@ MACHINE_CONFIG_START(rollrace_state::rollrace)
AY8910(config, "ay2", XTAL(24'000'000)/16).add_route(ALL_OUTPUTS, "rspeaker", 0.10); /* verified on pcb */
AY8910(config, "ay3", XTAL(24'000'000)/16).add_route(ALL_OUTPUTS, "lspeaker", 0.10); /* verified on pcb */
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(rollrace_state::rollace2)
+void rollrace_state::rollace2(machine_config &config)
+{
rollrace(config);
/* basic machine hardware */
-// MCFG_SCREEN_MODIFY("screen")
-// MCFG_SCREEN_VISIBLE_AREA(0,256-1,16, 255-16)
-MACHINE_CONFIG_END
+// subdevice<screen_device>("screen")->set_visarea(0, 256-1, 16, 255-16);
+}
/***************************************************************************
diff --git a/src/mame/drivers/ron.cpp b/src/mame/drivers/ron.cpp
index 0a1197e77fc..a2f6d8d91b2 100644
--- a/src/mame/drivers/ron.cpp
+++ b/src/mame/drivers/ron.cpp
@@ -451,9 +451,9 @@ WRITE8_MEMBER(ron_state::audio_p1_w)
//machine().debug_break();
if(m_ay_address_sel == true)
- m_ay->address_w(space, 0, data);
+ m_ay->address_w(data);
else
- m_ay->data_w(space, 0, data);
+ m_ay->data_w(data);
}
WRITE8_MEMBER(ron_state::audio_p2_w)
@@ -486,12 +486,12 @@ WRITE8_MEMBER(ron_state::ay_pa_w)
{
}
-MACHINE_CONFIG_START(ron_state::ron)
-
+void ron_state::ron(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, MAIN_CLOCK)
- MCFG_DEVICE_PROGRAM_MAP(ron_map)
- MCFG_DEVICE_IO_MAP(ron_io)
+ Z80(config, m_maincpu, MAIN_CLOCK);
+ m_maincpu->set_addrmap(AS_PROGRAM, &ron_state::ron_map);
+ m_maincpu->set_addrmap(AS_IO, &ron_state::ron_io);
I8035(config, m_audiocpu, SOUND_CLOCK);
m_audiocpu->set_addrmap(AS_PROGRAM, &ron_state::ron_audio_map);
@@ -503,11 +503,11 @@ MACHINE_CONFIG_START(ron_state::ron)
m_audiocpu->t1_in_cb().set(FUNC(ron_state::audio_t1_r));
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_UPDATE_DRIVER(ron_state, screen_update)
- MCFG_SCREEN_RAW_PARAMS(VIDEO_CLOCK, 320, 0, 256, 264, 0, 240)
- MCFG_SCREEN_PALETTE("palette")
- MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE(*this, ron_state, vblank_irq))
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_screen_update(FUNC(ron_state::screen_update));
+ screen.set_raw(VIDEO_CLOCK, 320, 0, 256, 264, 0, 240);
+ screen.set_palette("palette");
+ screen.screen_vblank().set(FUNC(ron_state::vblank_irq));
GFXDECODE(config, m_gfxdecode, "palette", gfx_ron);
@@ -519,7 +519,7 @@ MACHINE_CONFIG_START(ron_state::ron)
AY8910(config, m_ay, 0); // T0 CLK from I8035 (not verified)
m_ay->add_route(ALL_OUTPUTS, "mono", 0.30);
m_ay->port_a_write_callback().set(FUNC(ron_state::ay_pa_w));
-MACHINE_CONFIG_END
+}
/***************************************************************************
diff --git a/src/mame/drivers/roul.cpp b/src/mame/drivers/roul.cpp
index 1857d4bb465..51e23dcbb38 100644
--- a/src/mame/drivers/roul.cpp
+++ b/src/mame/drivers/roul.cpp
@@ -312,27 +312,28 @@ static INPUT_PORTS_START( roul )
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
INPUT_PORTS_END
-MACHINE_CONFIG_START(roul_state::roul)
+void roul_state::roul(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, 4000000)
- MCFG_DEVICE_PROGRAM_MAP(roul_map)
- MCFG_DEVICE_IO_MAP(roul_cpu_io_map)
+ Z80(config, m_maincpu, 4000000);
+ m_maincpu->set_addrmap(AS_PROGRAM, &roul_state::roul_map);
+ m_maincpu->set_addrmap(AS_IO, &roul_state::roul_cpu_io_map);
- MCFG_DEVICE_ADD("soundcpu", Z80, 4000000)
- MCFG_DEVICE_PROGRAM_MAP(sound_map)
- MCFG_DEVICE_IO_MAP(sound_cpu_io_map)
+ Z80(config, m_soundcpu, 4000000);
+ m_soundcpu->set_addrmap(AS_PROGRAM, &roul_state::sound_map);
+ m_soundcpu->set_addrmap(AS_IO, &roul_state::sound_cpu_io_map);
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(32*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 0*8, 32*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(roul_state, screen_update)
- MCFG_SCREEN_PALETTE("palette")
- MCFG_SCREEN_VBLANK_CALLBACK(INPUTLINE("maincpu", INPUT_LINE_NMI))
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(32*8, 32*8);
+ screen.set_visarea(0*8, 32*8-1, 0*8, 32*8-1);
+ screen.set_screen_update(FUNC(roul_state::screen_update));
+ screen.set_palette("palette");
+ screen.screen_vblank().set_inputline(m_maincpu, INPUT_LINE_NMI);
PALETTE(config, "palette", FUNC(roul_state::roul_palette), 0x100);
@@ -341,7 +342,7 @@ MACHINE_CONFIG_START(roul_state::roul)
GENERIC_LATCH_8(config, m_soundlatch);
AY8910(config, "aysnd", 1000000).add_route(ALL_OUTPUTS, "mono", 1.0);
-MACHINE_CONFIG_END
+}
ROM_START(roul)
ROM_REGION( 0x10000, "maincpu", 0 )
diff --git a/src/mame/drivers/route16.cpp b/src/mame/drivers/route16.cpp
index fdd8eb2fc1d..f733a91e597 100644
--- a/src/mame/drivers/route16.cpp
+++ b/src/mame/drivers/route16.cpp
@@ -660,7 +660,6 @@ void route16_state::stratvox(machine_config &config)
DAC_8BIT_R2R(config, "dac", 0).add_route(ALL_OUTPUTS, "speaker", 0.25); // unknown DAC
voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref", 0));
- vref.set_output(5.0);
vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT);
vref.add_route(0, "dac", -1.0, DAC_VREF_NEG_INPUT);
}
diff --git a/src/mame/drivers/rowamet.cpp b/src/mame/drivers/rowamet.cpp
index 19b6f39b9af..cf734674e2b 100644
--- a/src/mame/drivers/rowamet.cpp
+++ b/src/mame/drivers/rowamet.cpp
@@ -222,24 +222,28 @@ TIMER_DEVICE_CALLBACK_MEMBER( rowamet_state::timer_a )
m_digits[++digit] = patterns[m_p_ram[m_out_offs++]&15];
}
-MACHINE_CONFIG_START(rowamet_state::rowamet)
+void rowamet_state::rowamet(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, 1888888)
- MCFG_DEVICE_PROGRAM_MAP(rowamet_map)
- MCFG_DEVICE_ADD("cpu2", Z80, 1888888)
- MCFG_DEVICE_PROGRAM_MAP(rowamet_sub_map)
- MCFG_DEVICE_IO_MAP(rowamet_sub_io)
- MCFG_TIMER_DRIVER_ADD_PERIODIC("timer_a", rowamet_state, timer_a, attotime::from_hz(200))
+ Z80(config, m_maincpu, 1888888);
+ m_maincpu->set_addrmap(AS_PROGRAM, &rowamet_state::rowamet_map);
+
+ Z80(config, m_cpu2, 1888888);
+ m_cpu2->set_addrmap(AS_PROGRAM, &rowamet_state::rowamet_sub_map);
+ m_cpu2->set_addrmap(AS_IO, &rowamet_state::rowamet_sub_io);
+
+ TIMER(config, "timer_a").configure_periodic(FUNC(rowamet_state::timer_a), attotime::from_hz(200));
/* Video */
config.set_default_layout(layout_rowamet);
/* Sound */
SPEAKER(config, "speaker").front_center();
- MCFG_DEVICE_ADD("dac", DAC_8BIT_R2R, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 0.25) // unknown DAC
- MCFG_DEVICE_ADD("vref", VOLTAGE_REGULATOR, 0) MCFG_VOLTAGE_REGULATOR_OUTPUT(5.0)
- MCFG_SOUND_ROUTE(0, "dac", 1.0, DAC_VREF_POS_INPUT) MCFG_SOUND_ROUTE(0, "dac", -1.0, DAC_VREF_NEG_INPUT)
-MACHINE_CONFIG_END
+ DAC_8BIT_R2R(config, "dac", 0).add_route(ALL_OUTPUTS, "speaker", 0.25); // unknown DAC
+ voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref"));
+ vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT);
+ vref.add_route(0, "dac", -1.0, DAC_VREF_NEG_INPUT);
+}
/*-------------------------------------------------------------------
/ Conan (1983)
diff --git a/src/mame/drivers/royalmah.cpp b/src/mame/drivers/royalmah.cpp
index c8f71683e66..e7911dd960b 100644
--- a/src/mame/drivers/royalmah.cpp
+++ b/src/mame/drivers/royalmah.cpp
@@ -1074,7 +1074,7 @@ READ8_MEMBER(royalmah_state::mjifb_rom_io_r)
{
case 0x8000: return ioport("DSW4")->read(); // dsw 4
case 0x8200: return ioport("DSW3")->read(); // dsw 3
- case 0x9001: return m_ay->data_r(space, 0); // inputs
+ case 0x9001: return m_ay->data_r(); // inputs
case 0x9011: return ioport("SYSTEM")->read();
}
@@ -1095,8 +1095,8 @@ WRITE8_MEMBER(royalmah_state::mjifb_rom_io_w)
switch(offset)
{
case 0x8e00: m_palette_base = data & 0x1f; return;
- case 0x9002: m_ay->data_w(space,0,data); return;
- case 0x9003: m_ay->address_w(space,0,data); return;
+ case 0x9002: m_ay->data_w(data); return;
+ case 0x9003: m_ay->address_w(data); return;
case 0x9010:
mjifb_coin_counter_w(space,0,data);
return;
@@ -1173,7 +1173,7 @@ READ8_MEMBER(royalmah_state::mjdejavu_rom_io_r)
{
case 0x8000: return ioport("DSW2")->read(); // dsw 2
case 0x8001: return ioport("DSW1")->read(); // dsw 1
- case 0x9001: return m_ay->data_r(space, 0); // inputs
+ case 0x9001: return m_ay->data_r(); // inputs
case 0x9011: return ioport("SYSTEM")->read();
}
@@ -1192,10 +1192,10 @@ WRITE8_MEMBER(royalmah_state::mjdejavu_rom_io_w)
offset += 0x8000;
switch(offset)
{
- case 0x8802: m_palette_base = data & 0x1f; return;
- case 0x9002: m_ay->data_w(space,0,data); return;
- case 0x9003: m_ay->address_w(space,0,data); return;
- case 0x9010: janptr96_coin_counter_w(space,0,data); return;
+ case 0x8802: m_palette_base = data & 0x1f; return;
+ case 0x9002: m_ay->data_w(data); return;
+ case 0x9003: m_ay->address_w(data); return;
+ case 0x9010: janptr96_coin_counter_w(space,0,data); return;
case 0x9011: input_port_select_w(space,0,data); return;
case 0x9013:
// if (data) popmessage("%02x",data);
@@ -3532,26 +3532,26 @@ static INPUT_PORTS_START( mjvegasa )
INPUT_PORTS_END
-MACHINE_CONFIG_START(royalmah_state::royalmah)
-
+void royalmah_state::royalmah(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD(m_maincpu, Z80, 18432000/6) /* 3.072 MHz */
- MCFG_DEVICE_PROGRAM_MAP(royalmah_map)
- MCFG_DEVICE_IO_MAP(royalmah_iomap)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", royalmah_state, irq0_line_hold)
+ Z80(config, m_maincpu, 18432000/6); /* 3.072 MHz */
+ m_maincpu->set_addrmap(AS_PROGRAM, &royalmah_state::royalmah_map);
+ m_maincpu->set_addrmap(AS_IO, &royalmah_state::royalmah_iomap);
+ m_maincpu->set_vblank_int("screen", FUNC(royalmah_state::irq0_line_hold));
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
/* video hardware */
PALETTE(config, "palette", FUNC(royalmah_state::royalmah_palette), 16*4);
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_SIZE(256, 256)
- MCFG_SCREEN_VISIBLE_AREA(0, 255, 8, 247)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */)
- MCFG_SCREEN_UPDATE_DRIVER(royalmah_state, screen_update_royalmah)
- MCFG_SCREEN_PALETTE("palette")
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_size(256, 256);
+ screen.set_visarea(0, 255, 8, 247);
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500) /* not accurate */);
+ screen.set_screen_update(FUNC(royalmah_state::screen_update_royalmah));
+ screen.set_palette("palette");
/* sound hardware */
SPEAKER(config, "speaker").front_center();
@@ -3560,106 +3560,107 @@ MACHINE_CONFIG_START(royalmah_state::royalmah)
m_ay->port_a_read_callback().set(FUNC(royalmah_state::player_1_port_r));
m_ay->port_b_read_callback().set(FUNC(royalmah_state::player_2_port_r));
m_ay->add_route(ALL_OUTPUTS, "speaker", 0.33);
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(royalmah_state::janoh)
+void royalmah_state::janoh(machine_config &config)
+{
royalmah(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_CLOCK(8000000/2) /* 4 MHz ? */
- MCFG_DEVICE_PROGRAM_MAP(janoh_map)
+ m_maincpu->set_clock(8000000/2); /* 4 MHz ? */
+ m_maincpu->set_addrmap(AS_PROGRAM, &royalmah_state::janoh_map);
- MCFG_DEVICE_ADD("sub", Z80, 4000000) /* 4 MHz ? */
- MCFG_DEVICE_PROGRAM_MAP(janoh_sub_map)
- MCFG_DEVICE_IO_MAP(janoh_sub_iomap)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", royalmah_state, irq0_line_hold)
-MACHINE_CONFIG_END
+ z80_device &sub(Z80(config, "sub", 4000000)); /* 4 MHz ? */
+ sub.set_addrmap(AS_PROGRAM, &royalmah_state::janoh_sub_map);
+ sub.set_addrmap(AS_IO, &royalmah_state::janoh_sub_iomap);
+ sub.set_vblank_int("screen", FUNC(royalmah_state::irq0_line_hold));
+}
-MACHINE_CONFIG_START(royalmah_state::jansou)
+void royalmah_state::jansou(machine_config &config)
+{
royalmah(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(jansou_map)
- MCFG_DEVICE_IO_MAP(royalmah_iomap)
+ m_maincpu->set_addrmap(AS_PROGRAM, &royalmah_state::jansou_map);
+ m_maincpu->set_addrmap(AS_IO, &royalmah_state::royalmah_iomap);
- MCFG_DEVICE_ADD("audiocpu", Z80, 4000000) /* 4.000 MHz */
- MCFG_DEVICE_PROGRAM_MAP(jansou_sub_map)
- MCFG_DEVICE_IO_MAP(jansou_sub_iomap)
- MCFG_DEVICE_PERIODIC_INT_DRIVER(royalmah_state, irq0_line_hold, 4000000/512)
+ Z80(config, m_audiocpu, 4000000); /* 4.000 MHz */
+ m_audiocpu->set_addrmap(AS_PROGRAM, &royalmah_state::jansou_sub_map);
+ m_audiocpu->set_addrmap(AS_IO, &royalmah_state::jansou_sub_iomap);
+ m_audiocpu->set_periodic_int(FUNC(royalmah_state::irq0_line_hold), attotime::from_hz(4000000/512));
GENERIC_LATCH_8(config, m_soundlatch);
- MCFG_DEVICE_ADD("dac", DAC_8BIT_R2R, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 0.25) // unknown DAC
- MCFG_DEVICE_ADD("vref", VOLTAGE_REGULATOR, 0) MCFG_VOLTAGE_REGULATOR_OUTPUT(5.0)
- MCFG_SOUND_ROUTE(0, "dac", 1.0, DAC_VREF_POS_INPUT) MCFG_SOUND_ROUTE(0, "dac", -1.0, DAC_VREF_NEG_INPUT)
-MACHINE_CONFIG_END
+ DAC_8BIT_R2R(config, "dac", 0).add_route(ALL_OUTPUTS, "speaker", 0.25); // unknown DAC
+ voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref"));
+ vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT);
+ vref.add_route(0, "dac", -1.0, DAC_VREF_NEG_INPUT);
+}
-MACHINE_CONFIG_START(royalmah_state::dondenmj)
+void royalmah_state::dondenmj(machine_config &config)
+{
royalmah(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_CLOCK(8000000/2) /* 4 MHz ? */
- MCFG_DEVICE_IO_MAP(dondenmj_iomap)
-MACHINE_CONFIG_END
+ m_maincpu->set_clock(8000000/2); /* 4 MHz ? */
+ m_maincpu->set_addrmap(AS_IO, &royalmah_state::dondenmj_iomap);
+}
-MACHINE_CONFIG_START(royalmah_state::tahjong)
+void royalmah_state::tahjong(machine_config &config)
+{
royalmah(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_CLOCK(8000000/2) /* 4 MHz ? */
- MCFG_DEVICE_PROGRAM_MAP(tahjong_map)
- MCFG_DEVICE_IO_MAP(tahjong_iomap)
-MACHINE_CONFIG_END
+ m_maincpu->set_clock(8000000/2); /* 4 MHz ? */
+ m_maincpu->set_addrmap(AS_PROGRAM, &royalmah_state::tahjong_map);
+ m_maincpu->set_addrmap(AS_IO, &royalmah_state::tahjong_iomap);
+}
-MACHINE_CONFIG_START(royalmah_state::makaijan)
+void royalmah_state::makaijan(machine_config &config)
+{
royalmah(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_CLOCK(8000000/2) /* 4 MHz ? */
- MCFG_DEVICE_IO_MAP(makaijan_iomap)
-MACHINE_CONFIG_END
+ m_maincpu->set_clock(8000000/2); /* 4 MHz ? */
+ m_maincpu->set_addrmap(AS_IO, &royalmah_state::makaijan_iomap);
+}
-MACHINE_CONFIG_START(royalmah_state::daisyari)
+void royalmah_state::daisyari(machine_config &config)
+{
royalmah(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_CLOCK(8000000/2) /* 4 MHz ? */
- MCFG_DEVICE_IO_MAP(daisyari_iomap)
-MACHINE_CONFIG_END
+ m_maincpu->set_clock(8000000/2); /* 4 MHz ? */
+ m_maincpu->set_addrmap(AS_IO, &royalmah_state::daisyari_iomap);
+}
-MACHINE_CONFIG_START(royalmah_state::mjclub)
+void royalmah_state::mjclub(machine_config &config)
+{
royalmah(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_CLOCK(8000000/2) /* 4 MHz ? */
- MCFG_DEVICE_IO_MAP(mjclub_iomap)
-MACHINE_CONFIG_END
+ m_maincpu->set_clock(8000000/2); /* 4 MHz ? */
+ m_maincpu->set_addrmap(AS_IO, &royalmah_state::mjclub_iomap);
+}
-MACHINE_CONFIG_START(royalmah_state::mjyarou)
+void royalmah_state::mjyarou(machine_config &config)
+{
royalmah(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_IO_MAP(mjyarou_iomap)
-MACHINE_CONFIG_END
+ m_maincpu->set_addrmap(AS_IO, &royalmah_state::mjyarou_iomap);
+}
-MACHINE_CONFIG_START(royalmah_state::ippatsu)
+void royalmah_state::ippatsu(machine_config &config)
+{
dondenmj(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_IO_MAP(ippatsu_iomap)
-MACHINE_CONFIG_END
+ m_maincpu->set_addrmap(AS_IO, &royalmah_state::ippatsu_iomap);
+}
-MACHINE_CONFIG_START(royalmah_state::janyoup2)
+void royalmah_state::janyoup2(machine_config &config)
+{
ippatsu(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_CLOCK(XTAL(18'432'000)/4) // unknown divider
- MCFG_DEVICE_IO_MAP(janyoup2_iomap)
+ m_maincpu->set_clock(XTAL(18'432'000)/4); // unknown divider
+ m_maincpu->set_addrmap(AS_IO, &royalmah_state::janyoup2_iomap);
h46505_device &crtc(H46505(config, "crtc", XTAL(18'432'000)/12)); // unknown divider
crtc.set_screen("screen");
crtc.set_show_border_area(false);
crtc.set_char_width(4);
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(royalmah_state::seljan)
+void royalmah_state::seljan(machine_config &config)
+{
janyoup2(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(seljan_map)
- MCFG_DEVICE_IO_MAP(seljan_iomap)
-MACHINE_CONFIG_END
+ m_maincpu->set_addrmap(AS_PROGRAM, &royalmah_state::seljan_map);
+ m_maincpu->set_addrmap(AS_IO, &royalmah_state::seljan_iomap);
+}
INTERRUPT_GEN_MEMBER(royalmah_state::suzume_irq)
{
@@ -3667,12 +3668,12 @@ INTERRUPT_GEN_MEMBER(royalmah_state::suzume_irq)
device.execute().pulse_input_line(INPUT_LINE_NMI, attotime::zero);
}
-MACHINE_CONFIG_START(royalmah_state::suzume)
+void royalmah_state::suzume(machine_config &config)
+{
dondenmj(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_IO_MAP(suzume_iomap)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", royalmah_state, suzume_irq)
-MACHINE_CONFIG_END
+ m_maincpu->set_addrmap(AS_IO, &royalmah_state::suzume_iomap);
+ m_maincpu->set_vblank_int("screen", FUNC(royalmah_state::suzume_irq));
+}
void royalmah_state::jongshin(machine_config &config)
{
@@ -3680,41 +3681,41 @@ void royalmah_state::jongshin(machine_config &config)
m_maincpu->set_addrmap(AS_IO, &royalmah_state::jongshin_iomap);
}
-MACHINE_CONFIG_START(royalmah_state::tontonb)
+void royalmah_state::tontonb(machine_config &config)
+{
dondenmj(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_IO_MAP(tontonb_iomap)
-MACHINE_CONFIG_END
+ m_maincpu->set_addrmap(AS_IO, &royalmah_state::tontonb_iomap);
+}
-MACHINE_CONFIG_START(royalmah_state::mjdiplob)
+void royalmah_state::mjdiplob(machine_config &config)
+{
dondenmj(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_IO_MAP(mjdiplob_iomap)
-MACHINE_CONFIG_END
+ m_maincpu->set_addrmap(AS_IO, &royalmah_state::mjdiplob_iomap);
+}
-MACHINE_CONFIG_START(royalmah_state::majs101b)
+void royalmah_state::majs101b(machine_config &config)
+{
dondenmj(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_IO_MAP(majs101b_iomap)
-MACHINE_CONFIG_END
+ m_maincpu->set_addrmap(AS_IO, &royalmah_state::majs101b_iomap);
+}
-MACHINE_CONFIG_START(royalmah_state::mjapinky)
+void royalmah_state::mjapinky(machine_config &config)
+{
dondenmj(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(mjapinky_map)
- MCFG_DEVICE_IO_MAP(mjapinky_iomap)
-MACHINE_CONFIG_END
+ m_maincpu->set_addrmap(AS_PROGRAM, &royalmah_state::mjapinky_map);
+ m_maincpu->set_addrmap(AS_IO, &royalmah_state::mjapinky_iomap);
+}
-MACHINE_CONFIG_START(royalmah_state::mjderngr)
+void royalmah_state::mjderngr(machine_config &config)
+{
dondenmj(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_IO_MAP(mjderngr_iomap)
+ m_maincpu->set_addrmap(AS_IO, &royalmah_state::mjderngr_iomap);
/* video hardware */
auto &palette(*subdevice<palette_device>("palette"));
palette.set_entries(16*32);
palette.set_init(FUNC(royalmah_state::mjderngr_palette));
-MACHINE_CONFIG_END
+}
void royalmah_state::janptr96(machine_config &config)
{
@@ -3736,7 +3737,8 @@ void royalmah_state::janptr96(machine_config &config)
}
-MACHINE_CONFIG_START(royalmah_state::mjifb)
+void royalmah_state::mjifb(machine_config &config)
+{
mjderngr(config);
tmp90841_device &tmp(TMP90841(config.replace(), m_maincpu, 8000000)); /* ? */
tmp.set_addrmap(AS_PROGRAM, &royalmah_state::mjifb_map);
@@ -3749,13 +3751,14 @@ MACHINE_CONFIG_START(royalmah_state::mjifb)
tmp.port_read<8>().set(FUNC(royalmah_state::mjifb_p8_r));
tmp.port_write<8>().set(FUNC(royalmah_state::mjifb_p8_w));
- MCFG_SCREEN_MODIFY("screen")
- MCFG_SCREEN_VISIBLE_AREA(0, 255, 8, 255-8)
- MCFG_SCREEN_VBLANK_CALLBACK(INPUTLINE("maincpu", INPUT_LINE_IRQ0))
-MACHINE_CONFIG_END
+ screen_device &screen(*subdevice<screen_device>("screen"));
+ screen.set_visarea(0, 255, 8, 255-8);
+ screen.screen_vblank().set_inputline(m_maincpu, INPUT_LINE_IRQ0);
+}
-MACHINE_CONFIG_START(royalmah_state::mjdejavu)
+void royalmah_state::mjdejavu(machine_config &config)
+{
mjderngr(config);
tmp90841_device &tmp(TMP90841(config.replace(), m_maincpu, 8000000)); /* ? */
tmp.set_addrmap(AS_PROGRAM, &royalmah_state::mjdejavu_map);
@@ -3768,43 +3771,46 @@ MACHINE_CONFIG_START(royalmah_state::mjdejavu)
tmp.port_read<8>().set(FUNC(royalmah_state::mjifb_p8_r));
tmp.port_write<8>().set(FUNC(royalmah_state::mjifb_p8_w));
- MCFG_SCREEN_MODIFY("screen")
- MCFG_SCREEN_VISIBLE_AREA(0, 255, 8, 255-8)
- MCFG_SCREEN_VBLANK_CALLBACK(INPUTLINE("maincpu", INPUT_LINE_IRQ0))
-MACHINE_CONFIG_END
+ screen_device &screen(*subdevice<screen_device>("screen"));
+ screen.set_visarea(0, 255, 8, 255-8);
+ screen.screen_vblank().set_inputline(m_maincpu, INPUT_LINE_IRQ0);
+}
-MACHINE_CONFIG_START(royalmah_state::mjtensin)
+void royalmah_state::mjtensin(machine_config &config)
+{
mjderngr(config);
tmp90841_device &tmp(TMP90841(config.replace(), m_maincpu, 12000000)); /* ? */
tmp.set_addrmap(AS_PROGRAM, &royalmah_state::mjtensin_map);
tmp.port_read<3>().set(FUNC(royalmah_state::mjtensin_p3_r));
tmp.port_write<4>().set(FUNC(royalmah_state::mjtensin_p4_w));
- MCFG_SCREEN_MODIFY("screen")
- MCFG_SCREEN_VISIBLE_AREA(0, 255, 8, 255-8)
- MCFG_SCREEN_VBLANK_CALLBACK(INPUTLINE("maincpu", INPUT_LINE_IRQ0))
+ screen_device &screen(*subdevice<screen_device>("screen"));
+ screen.set_visarea(0, 255, 8, 255-8);
+ screen.screen_vblank().set_inputline(m_maincpu, INPUT_LINE_IRQ0);
/* devices */
MSM6242(config, m_rtc, 32.768_kHz_XTAL).out_int_handler().set_inputline(m_maincpu, INPUT_LINE_IRQ1);
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(royalmah_state::cafetime)
+void royalmah_state::cafetime(machine_config &config)
+{
mjderngr(config);
tmp90841_device &tmp(TMP90841(config.replace(), m_maincpu, 12000000)); /* ? */
tmp.set_addrmap(AS_PROGRAM, &royalmah_state::cafetime_map);
tmp.port_write<3>().set(FUNC(royalmah_state::cafetime_p3_w));
tmp.port_write<4>().set(FUNC(royalmah_state::cafetime_p4_w));
- MCFG_SCREEN_MODIFY("screen")
- MCFG_SCREEN_VISIBLE_AREA(0, 255, 8, 255-8)
- MCFG_SCREEN_VBLANK_CALLBACK(INPUTLINE("maincpu", INPUT_LINE_IRQ0))
+ screen_device &screen(*subdevice<screen_device>("screen"));
+ screen.set_visarea(0, 255, 8, 255-8);
+ screen.screen_vblank().set_inputline(m_maincpu, INPUT_LINE_IRQ0);
/* devices */
MSM6242(config, m_rtc, 32.768_kHz_XTAL).out_int_handler().set_inputline(m_maincpu, INPUT_LINE_IRQ1);
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(royalmah_state::mjvegasa)
+void royalmah_state::mjvegasa(machine_config &config)
+{
mjderngr(config);
tmp90841_device &tmp(TMP90841(config.replace(), m_maincpu, XTAL(8'000'000))); /* ? */
tmp.set_addrmap(AS_PROGRAM, &royalmah_state::mjvegasa_map);
@@ -3812,13 +3818,13 @@ MACHINE_CONFIG_START(royalmah_state::mjvegasa)
tmp.port_write<3>().set(FUNC(royalmah_state::mjvegasa_p3_w));
tmp.port_write<4>().set(FUNC(royalmah_state::mjvegasa_p4_w));
- MCFG_SCREEN_MODIFY("screen")
- MCFG_SCREEN_VISIBLE_AREA(0, 255, 8, 255-8)
- MCFG_SCREEN_VBLANK_CALLBACK(INPUTLINE("maincpu", INPUT_LINE_IRQ0))
+ screen_device &screen(*subdevice<screen_device>("screen"));
+ screen.set_visarea(0, 255, 8, 255-8);
+ screen.screen_vblank().set_inputline(m_maincpu, INPUT_LINE_IRQ0);
/* devices */
MSM6242(config, m_rtc, 32.768_kHz_XTAL).out_int_handler().set_inputline(m_maincpu, INPUT_LINE_IRQ1);
-MACHINE_CONFIG_END
+}
/***************************************************************************
diff --git a/src/mame/drivers/rpunch.cpp b/src/mame/drivers/rpunch.cpp
index 58707cda66d..2e2b36e2ac7 100644
--- a/src/mame/drivers/rpunch.cpp
+++ b/src/mame/drivers/rpunch.cpp
@@ -457,28 +457,27 @@ GFXDECODE_END
*
*************************************/
-MACHINE_CONFIG_START(rpunch_state::rpunch)
-
+void rpunch_state::rpunch(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M68000, MASTER_CLOCK/2)
- MCFG_DEVICE_PROGRAM_MAP(main_map)
+ M68000(config, m_maincpu, MASTER_CLOCK/2);
+ m_maincpu->set_addrmap(AS_PROGRAM, &rpunch_state::main_map);
- MCFG_DEVICE_ADD("audiocpu", Z80, MASTER_CLOCK/4)
- MCFG_DEVICE_PROGRAM_MAP(sound_map)
+ Z80(config, m_audiocpu, MASTER_CLOCK/4);
+ m_audiocpu->set_addrmap(AS_PROGRAM, &rpunch_state::sound_map);
GENERIC_LATCH_8(config, m_soundlatch);
m_soundlatch->data_pending_callback().set("soundirq", FUNC(input_merger_device::in_w<0>));
- MCFG_INPUT_MERGER_ANY_HIGH("soundirq")
- MCFG_INPUT_MERGER_OUTPUT_HANDLER(INPUTLINE("audiocpu", 0))
+ INPUT_MERGER_ANY_HIGH(config, "soundirq").output_handler().set_inputline(m_audiocpu, 0);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_SIZE(304, 224)
- MCFG_SCREEN_VISIBLE_AREA(8, 303-8, 0, 223-8)
- MCFG_SCREEN_UPDATE_DRIVER(rpunch_state, screen_update_rpunch)
- MCFG_SCREEN_PALETTE(m_palette)
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_refresh_hz(60);
+ m_screen->set_size(304, 224);
+ m_screen->set_visarea(8, 303-8, 0, 223-8);
+ m_screen->set_screen_update(FUNC(rpunch_state::screen_update_rpunch));
+ m_screen->set_palette(m_palette);
GFXDECODE(config, m_gfxdecode, m_palette, gfx_rpunch);
PALETTE(config, m_palette).set_format(palette_device::xRGB_555, 1024);
@@ -496,39 +495,38 @@ MACHINE_CONFIG_START(rpunch_state::rpunch)
ymsnd.add_route(0, "mono", 0.50);
ymsnd.add_route(1, "mono", 0.50);
- MCFG_DEVICE_ADD("upd", UPD7759)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.50)
-MACHINE_CONFIG_END
+ UPD7759(config, m_upd7759).add_route(ALL_OUTPUTS, "mono", 0.50);
+}
-MACHINE_CONFIG_START(rpunch_state::svolley)
+void rpunch_state::svolley(machine_config &config)
+{
rpunch(config);
MCFG_VIDEO_START_OVERRIDE(rpunch_state,svolley)
-MACHINE_CONFIG_END
+}
// c+p of above for now, bootleg hw, things need verifying
-MACHINE_CONFIG_START(rpunch_state::svolleybl)
-
+void rpunch_state::svolleybl(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M68000, MASTER_CLOCK/2)
- MCFG_DEVICE_PROGRAM_MAP(main_map)
+ M68000(config, m_maincpu, MASTER_CLOCK/2);
+ m_maincpu->set_addrmap(AS_PROGRAM, &rpunch_state::main_map);
- MCFG_DEVICE_ADD("audiocpu", Z80, MASTER_CLOCK/4)
- MCFG_DEVICE_PROGRAM_MAP(sound_map)
+ Z80(config, m_audiocpu, MASTER_CLOCK/4);
+ m_audiocpu->set_addrmap(AS_PROGRAM, &rpunch_state::sound_map);
GENERIC_LATCH_8(config, m_soundlatch);
m_soundlatch->data_pending_callback().set("soundirq", FUNC(input_merger_device::in_w<0>));
- MCFG_INPUT_MERGER_ANY_HIGH("soundirq")
- MCFG_INPUT_MERGER_OUTPUT_HANDLER(INPUTLINE("audiocpu", 0))
+ INPUT_MERGER_ANY_HIGH(config, "soundirq").output_handler().set_inputline(m_audiocpu, 0);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_SIZE(304, 224)
- MCFG_SCREEN_VISIBLE_AREA(8, 303-8, 0, 223-8)
- MCFG_SCREEN_UPDATE_DRIVER(rpunch_state, screen_update_rpunch)
- MCFG_SCREEN_PALETTE(m_palette)
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_refresh_hz(60);
+ m_screen->set_size(304, 224);
+ m_screen->set_visarea(8, 303-8, 0, 223-8);
+ m_screen->set_screen_update(FUNC(rpunch_state::screen_update_rpunch));
+ m_screen->set_palette(m_palette);
GFXDECODE(config, m_gfxdecode, m_palette, gfx_svolleybl);
PALETTE(config, m_palette).set_format(palette_device::xRGB_555, 1024);
@@ -547,9 +545,8 @@ MACHINE_CONFIG_START(rpunch_state::svolleybl)
ymsnd.add_route(0, "mono", 0.50);
ymsnd.add_route(1, "mono", 0.50);
- MCFG_DEVICE_ADD("upd", UPD7759)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.50)
-MACHINE_CONFIG_END
+ UPD7759(config, m_upd7759).add_route(ALL_OUTPUTS, "mono", 0.50);
+}
diff --git a/src/mame/drivers/rt1715.cpp b/src/mame/drivers/rt1715.cpp
index d5e8aa00963..8cc7fbb8309 100644
--- a/src/mame/drivers/rt1715.cpp
+++ b/src/mame/drivers/rt1715.cpp
@@ -1,22 +1,32 @@
// license:BSD-3-Clause
-// copyright-holders:Miodrag Milanovic, Robbbert
+// copyright-holders:Miodrag Milanovic, Robbbert, Sergey Svishchev
/***************************************************************************
Robotron PC-1715
10/06/2008 Preliminary driver.
-
Notes:
-
- keyboard connected to sio channel a
- sio channel a clock output connected to ctc trigger 0
+ - rt1715w: SCP3 boot crashes in z80dma (Unknown base register XX)
+
+ Docs:
+ - http://www.robotrontechnik.de/html/computer/pc1715w.htm
+ - https://www.tiffe.de/Robotron/PC1715/ -- scanned PDFs
+ https://www.tiffe.de/Robotron/PC1715/MANUAL_PC_1715.pdf
+ - http://www.sax.de/~zander/pc1715/pc_bw.html -- typeset PDFs
+ http://www.sax.de/~zander/pc1715/doku/pc_manu.pdf
+ - http://xepb.org/robotron/
****************************************************************************/
#include "emu.h"
#include "cpu/z80/z80.h"
+#include "imagedev/floppy.h"
+#include "machine/bankdev.h"
#include "machine/ram.h"
+#include "machine/upd765.h"
#include "machine/z80ctc.h"
#include "machine/z80sio.h"
#include "machine/z80dma.h"
@@ -33,6 +43,18 @@ public:
: driver_device(mconfig, type, tag)
, m_maincpu(*this, "maincpu")
, m_ram(*this, RAM_TAG)
+ , m_bankdev(*this, "bankdev%u", 0U)
+ , m_sio0(*this, "sio0")
+ , m_ctc0(*this, "ctc0")
+ , m_fdc(*this, "i8272")
+ , m_floppy(*this, "i8272:%u", 0U)
+ , m_dma(*this, "z80dma")
+ , m_ctc2(*this, "ctc2")
+ , m_screen(*this, "screen")
+ , m_palette(*this, "palette")
+ , m_crtc(*this, "i8275")
+ , m_p_chargen(*this, "gfx")
+ , m_p_videoram(*this, "videoram")
{
}
@@ -40,27 +62,58 @@ public:
void rt1715w(machine_config &config);
private:
+ DECLARE_READ8_MEMBER(memory_read_byte);
+ DECLARE_WRITE8_MEMBER(memory_write_byte);
+ DECLARE_READ8_MEMBER(io_read_byte);
+ DECLARE_WRITE8_MEMBER(io_write_byte);
+ DECLARE_WRITE_LINE_MEMBER(busreq_w);
+ DECLARE_WRITE_LINE_MEMBER(tc_w);
DECLARE_WRITE8_MEMBER(rt1715_floppy_enable);
DECLARE_READ8_MEMBER(k7658_led1_r);
DECLARE_READ8_MEMBER(k7658_led2_r);
DECLARE_READ8_MEMBER(k7658_data_r);
DECLARE_WRITE8_MEMBER(k7658_data_w);
DECLARE_WRITE8_MEMBER(rt1715_rom_disable);
+ DECLARE_WRITE8_MEMBER(rt1715w_set_bank);
+ DECLARE_WRITE8_MEMBER(rt1715w_floppy_motor);
+ DECLARE_WRITE8_MEMBER(rt1715w_krfd_w);
void rt1715_palette(palette_device &palette) const;
- I8275_DRAW_CHARACTER_MEMBER( crtc_display_pixels );
+ I8275_DRAW_CHARACTER_MEMBER(crtc_display_pixels);
+ DECLARE_WRITE_LINE_MEMBER(crtc_drq_w);
void k7658_io(address_map &map);
void k7658_mem(address_map &map);
+ void rt1715_base_io(address_map &map);
void rt1715_io(address_map &map);
+ void rt1715w_io(address_map &map);
void rt1715_mem(address_map &map);
+ void rt1715w_mem(address_map &map);
+ void rt1715w_banked_mem(address_map &map);
- virtual void machine_start() override;
- virtual void machine_reset() override;
+ DECLARE_MACHINE_START(rt1715);
+ DECLARE_MACHINE_RESET(rt1715);
+ DECLARE_MACHINE_START(rt1715w);
+ DECLARE_MACHINE_RESET(rt1715w);
- int m_led1_val;
- int m_led2_val;
required_device<z80_device> m_maincpu;
required_device<ram_device> m_ram;
+ optional_device_array<address_map_bank_device, 2> m_bankdev;
+ required_device<z80sio_device> m_sio0;
+ required_device<z80ctc_device> m_ctc0;
+ optional_device<i8272a_device> m_fdc;
+ optional_device_array<floppy_connector, 2> m_floppy;
+ optional_device<z80dma_device> m_dma;
+ optional_device<z80ctc_device> m_ctc2;
+ required_device<screen_device> m_screen;
+ required_device<palette_device> m_palette;
+ required_device<i8275_device> m_crtc;
+ required_region_ptr<uint8_t> m_p_chargen;
+ optional_shared_ptr<uint8_t> m_p_videoram;
+
+ int m_led1_val;
+ int m_led2_val;
+ u8 m_krfd;
+ uint16_t m_dma_adr;
};
@@ -73,6 +126,24 @@ WRITE8_MEMBER(rt1715_state::rt1715_floppy_enable)
logerror("%s: rt1715_floppy_enable %02x\n", machine().describe_context(), data);
}
+WRITE8_MEMBER(rt1715_state::rt1715w_floppy_motor)
+{
+ logerror("%s: rt1715w_floppy_motor %02x\n", machine().describe_context(), data);
+
+ if (m_floppy[0]->get_device()) m_floppy[0]->get_device()->mon_w(data & 0x80 ? 1 : 0);
+ if (m_floppy[1]->get_device()) m_floppy[1]->get_device()->mon_w(data & 0x08 ? 1 : 0);
+}
+
+WRITE8_MEMBER(rt1715_state::rt1715w_krfd_w)
+{
+ logerror("%s: rt1715w_krfd_w %02x\n", machine().describe_context(), data);
+ m_krfd = data;
+}
+
+WRITE_LINE_MEMBER(rt1715_state::tc_w)
+{
+ m_fdc->tc_w(state & BIT(m_krfd, 7));
+}
/***************************************************************************
KEYBOARD
@@ -127,13 +198,13 @@ WRITE8_MEMBER(rt1715_state::k7658_data_w)
MEMORY HANDLING
***************************************************************************/
-void rt1715_state::machine_start()
+MACHINE_START_MEMBER(rt1715_state, rt1715)
{
membank("bank2")->set_base(m_ram->pointer() + 0x0800);
membank("bank3")->set_base(m_ram->pointer());
}
-void rt1715_state::machine_reset()
+MACHINE_RESET_MEMBER(rt1715_state, rt1715)
{
/* on reset, enable ROM */
membank("bank1")->set_base(memregion("ipl")->base());
@@ -147,12 +218,101 @@ WRITE8_MEMBER(rt1715_state::rt1715_rom_disable)
membank("bank1")->set_base(m_ram->pointer());
}
+MACHINE_START_MEMBER(rt1715_state, rt1715w)
+{
+ membank("bank2")->set_base(m_ram->pointer() + 0x4000);
+ membank("bank3")->set_base(m_ram->pointer());
+}
+
+MACHINE_RESET_MEMBER(rt1715_state, rt1715w)
+{
+ m_bankdev[0]->set_bank(0);
+ m_bankdev[1]->set_bank(0);
+
+ m_dma->rdy_w(1);
+ m_krfd = 0;
+ m_dma_adr = 0;
+}
+
+/*
+ b2..0 = AB18..16
+
+ 0 - Hintergrundbank (Bildschirm, Zeichengeneratoren)
+ 1 - Systembank (gebanktes BIOS, BDOS)
+ 2 - Anwenderbank (TPA)
+ 3 - RAM-Disk
+ 4 - RAM-Disk
+ 5 - RAM-Disk
+*/
+WRITE8_MEMBER(rt1715_state::rt1715w_set_bank)
+{
+ int r = data >> 4;
+ int w = data & 15;
+
+ logerror("%s: rt1715w_set_bank target %x source %x%s\n", machine().describe_context(), r, w, r == w ? "" : " DIFF");
+
+ m_bankdev[0]->set_bank(r);
+ m_bankdev[1]->set_bank(w);
+}
+
+READ8_MEMBER(rt1715_state::memory_read_byte)
+{
+ address_space &prog_space = m_maincpu->space(AS_PROGRAM);
+ return prog_space.read_byte(offset);
+}
+
+WRITE8_MEMBER(rt1715_state::memory_write_byte)
+{
+ address_space &prog_space = m_maincpu->space(AS_PROGRAM);
+ prog_space.write_byte(offset, data);
+}
+
+READ8_MEMBER(rt1715_state::io_read_byte)
+{
+ address_space &prog_space = m_maincpu->space(AS_IO);
+ return prog_space.read_byte(offset);
+}
+
+WRITE8_MEMBER(rt1715_state::io_write_byte)
+{
+ address_space &prog_space = m_maincpu->space(AS_IO);
+ prog_space.write_byte(offset, data);
+}
+
+WRITE_LINE_MEMBER(rt1715_state::busreq_w)
+{
+ // since our Z80 has no support for BUSACK, we assume it is granted immediately
+ m_maincpu->set_input_line(Z80_INPUT_LINE_BUSRQ, state);
+ m_dma->bai_w(state); // tell dma that bus has been granted
+}
+
/***************************************************************************
VIDEO EMULATION
***************************************************************************/
-I8275_DRAW_CHARACTER_MEMBER( rt1715_state::crtc_display_pixels )
+WRITE_LINE_MEMBER(rt1715_state::crtc_drq_w)
+{
+ if (state)
+ {
+ address_space &mem = m_maincpu->space(AS_PROGRAM);
+ m_crtc->dack_w(mem, 0, m_p_videoram[m_dma_adr++]);
+ m_dma_adr %= (80 * 24);
+ }
+}
+
+I8275_DRAW_CHARACTER_MEMBER(rt1715_state::crtc_display_pixels)
{
+ const rgb_t *palette = m_palette->palette()->entry_list_raw();
+ u8 gfx = (lten) ? 0xff : 0;
+
+ if (!vsp)
+ gfx = m_p_chargen[linecount << 7 | charcode];
+
+ if (rvv)
+ gfx ^= 0xff;
+
+ for (u8 i=0; i<8; i++)
+ bitmap.pix32(y, x + i) = palette[BIT(gfx, 7-i) ? (hlgt ? 2 : 1) : 0];
}
/* F4 Character Displayer */
@@ -183,7 +343,7 @@ void rt1715_state::rt1715_palette(palette_device &palette) const
{
palette.set_pen_color(0, rgb_t(0x00, 0x00, 0x00)); // black
palette.set_pen_color(1, rgb_t(0x00, 0x7f, 0x00)); // low intensity
- palette.set_pen_color(2, rgb_t(0x00, 0xff, 0x00)); // high intensitiy
+ palette.set_pen_color(2, rgb_t(0x00, 0xff, 0x00)); // high intensity
}
@@ -197,17 +357,63 @@ void rt1715_state::rt1715_mem(address_map &map)
map(0x0800, 0xffff).bankrw("bank2");
}
-void rt1715_state::rt1715_io(address_map &map)
+void rt1715_state::rt1715_base_io(address_map &map)
{
map.unmap_value_high();
map.global_mask(0xff);
- map(0x00, 0x03).rw("a71", FUNC(z80pio_device::read_alt), FUNC(z80pio_device::write_alt));
- map(0x04, 0x07).rw("a72", FUNC(z80pio_device::read_alt), FUNC(z80pio_device::write_alt));
- map(0x08, 0x0b).rw("a30", FUNC(z80ctc_device::read), FUNC(z80ctc_device::write));
- map(0x0c, 0x0f).rw("a29", FUNC(z80sio_device::ba_cd_r), FUNC(z80sio_device::ba_cd_w));
- map(0x18, 0x19).rw("a26", FUNC(i8275_device::read), FUNC(i8275_device::write));
+ map(0x08, 0x0b).rw(m_ctc0, FUNC(z80ctc_device::read), FUNC(z80ctc_device::write));
+ map(0x0c, 0x0f).rw(m_sio0, FUNC(z80sio_device::ba_cd_r), FUNC(z80sio_device::ba_cd_w));
+// map(0x10, 0x13).rw(m_ctc1, FUNC(z80ctc_device::read), FUNC(z80ctc_device::write));
+// map(0x14, 0x17).rw(m_sio1, FUNC(z80sio_device::ba_cd_r), FUNC(z80sio_device::ba_cd_w));
+ map(0x18, 0x19).rw(m_crtc, FUNC(i8275_device::read), FUNC(i8275_device::write));
+// map(0x2c, 0x2f) // LT107CS -- serial DSR?
+// map(0x30, 0x33) // LT111CS -- serial SEL? (data rate selector)
+}
+
+void rt1715_state::rt1715_io(address_map &map)
+{
+ rt1715_base_io(map);
+
+ map(0x00, 0x03).rw("a71", FUNC(z80pio_device::read_alt), FUNC(z80pio_device::write_alt)); // floppy data
+ map(0x04, 0x07).rw("a72", FUNC(z80pio_device::read_alt), FUNC(z80pio_device::write_alt)); // floppy control/status
map(0x20, 0x20).w(FUNC(rt1715_state::rt1715_floppy_enable));
- map(0x28, 0x28).w(FUNC(rt1715_state::rt1715_rom_disable));
+// map(0x24, 0x27).w(FUNC(rt1715_state::rt1715_rom_enable)); // MEMCS0
+ map(0x28, 0x2b).w(FUNC(rt1715_state::rt1715_rom_disable)); // MEMCS1
+// map(0x34, 0x37) // BWSCS (read: memory start address, write: switch chargen)
+}
+
+void rt1715_state::rt1715w_mem(address_map &map)
+{
+ map(0x0000, 0xffff).r(m_bankdev[0], FUNC(address_map_bank_device::read8)).w(m_bankdev[1], FUNC(address_map_bank_device::write8));
+}
+
+void rt1715_state::rt1715w_banked_mem(address_map &map)
+{
+ map(0x00000, 0x007ff).rom().region("ipl", 0);
+ map(0x02000, 0x02fff).ram().region("gfx", 0);
+ map(0x03000, 0x03fff).ram().share("videoram");
+ map(0x04000, 0x0ffff).bankrw("bank2");
+ map(0x10000, 0x4ffff).bankrw("bank3");
+}
+
+// rt1715w -- decoders A13, A14, page C
+void rt1715_state::rt1715w_io(address_map &map)
+{
+ rt1715_base_io(map);
+
+ map(0x00, 0x00).rw(m_dma, FUNC(z80dma_device::bus_r), FUNC(z80dma_device::bus_w)); // A2
+ map(0x04, 0x07).rw(m_ctc2, FUNC(z80ctc_device::read), FUNC(z80ctc_device::write)); // A4
+// map(0x1a, 0x1b) // chargen write protection
+ map(0x1c, 0x1d).m(m_fdc, FUNC(i8272a_device::map));
+ map(0x20, 0x23).w(FUNC(rt1715_state::rt1715w_krfd_w)); // KRFD -- FD-Steuerregister (A45)
+ map(0x24, 0x27).w(FUNC(rt1715_state::rt1715w_set_bank)); // BR (A62, A63)
+ map(0x28, 0x2b).w(FUNC(rt1715_state::rt1715w_floppy_motor)); // MOS
+ map(0x34, 0x37).portr("S8"); // KON -- Konfigurations-schalter FD (config switch -- A114, DIP S8)
+// map(0x38, 0x3b) // SR (RST1) -- Ru:cksetzen von Flip-Flops im FD
+// map(0x3c, 0x3f) // RST (RST2) -- Ru:cksetzen von Flip-Flops in V.24 (Pru:ftechnik)
+ // used via DMA only
+ map(0x40, 0x40).r(m_fdc, FUNC(i8272a_device::msr_r));
+ map(0x41, 0x41).rw(m_fdc, FUNC(i8272a_device::dma_r), FUNC(i8272a_device::dma_w));
}
void rt1715_state::k7658_mem(address_map &map)
@@ -228,6 +434,34 @@ void rt1715_state::k7658_io(address_map &map)
INPUT PORTS
***************************************************************************/
+static INPUT_PORTS_START( rt1715w )
+ PORT_START("S8")
+ PORT_DIPNAME( 0x01, 0x01, "UNK0" )
+ PORT_DIPSETTING( 0x01, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x02, 0x02, "UNK1" )
+ PORT_DIPSETTING( 0x02, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x04, 0x04, "UNK2" )
+ PORT_DIPSETTING( 0x04, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x08, 0x08, "UNK3" )
+ PORT_DIPSETTING( 0x08, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x10, 0x10, "UNK4" )
+ PORT_DIPSETTING( 0x10, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x20, 0x20, "UNK5" )
+ PORT_DIPSETTING( 0x20, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x40, 0x40, "UNK6" )
+ PORT_DIPSETTING( 0x40, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x80, 0x80, "UNK7" )
+ PORT_DIPSETTING( 0x80, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+INPUT_PORTS_END
+
static INPUT_PORTS_START( k7658 )
PORT_START("row_00")
PORT_BIT(0xff, IP_ACTIVE_LOW, IPT_UNUSED)
@@ -274,57 +508,112 @@ INPUT_PORTS_END
MACHINE DRIVERS
***************************************************************************/
-/* priority unknown */
+/* verify priority -- p. 14 of PC-1715-Servicemanual.pdf */
static const z80_daisy_config rt1715_daisy_chain[] =
{
{ "a71" },
{ "a72" },
- { "a30" },
- { "a29" },
+ { "ctc0" },
+ { "sio0" },
+ { nullptr }
+};
+
+static const z80_daisy_config rt1715w_daisy_chain[] =
+{
+ { "ctc0" },
+ { "sio0" },
{ nullptr }
};
-MACHINE_CONFIG_START(rt1715_state::rt1715)
+static void rt1715w_floppies(device_slot_interface &device)
+{
+ device.option_add("525qd", FLOPPY_525_QD);
+}
+
+void rt1715_state::rt1715(machine_config &config)
+{
/* basic machine hardware */
Z80(config, m_maincpu, 9.832_MHz_XTAL / 4);
m_maincpu->set_addrmap(AS_PROGRAM, &rt1715_state::rt1715_mem);
m_maincpu->set_addrmap(AS_IO, &rt1715_state::rt1715_io);
m_maincpu->set_daisy_config(rt1715_daisy_chain);
+ MCFG_MACHINE_START_OVERRIDE(rt1715_state, rt1715)
+ MCFG_MACHINE_RESET_OVERRIDE(rt1715_state, rt1715)
+
+#if 0
/* keyboard */
- MCFG_DEVICE_ADD("keyboard", Z80, 683000)
- MCFG_DEVICE_PROGRAM_MAP(k7658_mem)
- MCFG_DEVICE_IO_MAP(k7658_io)
+ z80_device &keyboard(Z80(config, "keyboard", 683000));
+ keyboard.set_addrmap(AS_PROGRAM, &rt1715_state::k7658_mem);
+ keyboard.set_addrmap(AS_IO, &rt1715_state::k7658_io);
+#endif
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_UPDATE_DEVICE("a26", i8275_device, screen_update)
- MCFG_SCREEN_RAW_PARAMS(13.824_MHz_XTAL, 864, 0, 624, 320, 0, 300) // ?
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_screen_update("i8275", FUNC(i8275_device::screen_update));
+ m_screen->set_raw(13.824_MHz_XTAL, 864, 0, 624, 320, 0, 300); // ?
GFXDECODE(config, "gfxdecode", "palette", gfx_rt1715);
PALETTE(config, "palette", FUNC(rt1715_state::rt1715_palette), 3);
- MCFG_DEVICE_ADD("a26", I8275, 13.824_MHz_XTAL / 8)
- MCFG_I8275_CHARACTER_WIDTH(8)
- MCFG_I8275_DRAW_CHARACTER_CALLBACK_OWNER(rt1715_state, crtc_display_pixels)
+ I8275(config, m_crtc, 13.824_MHz_XTAL / 8);
+ m_crtc->set_character_width(8);
+ m_crtc->set_display_callback(FUNC(rt1715_state::crtc_display_pixels), this);
+ m_crtc->set_screen(m_screen);
- z80ctc_device& ctc(Z80CTC(config, "a30", 9.832_MHz_XTAL / 4));
- ctc.zc_callback<0>().set("a29", FUNC(z80sio_device::txca_w));
- ctc.zc_callback<2>().set("a29", FUNC(z80sio_device::rxtxcb_w));
+ /* keyboard */
+ Z80SIO(config, m_sio0, 9.832_MHz_XTAL / 4);
- Z80SIO(config, "a29", 9.832_MHz_XTAL / 4);
+ Z80CTC(config, m_ctc0, 9.832_MHz_XTAL / 4);
+ m_ctc0->zc_callback<0>().set(m_sio0, FUNC(z80sio_device::txca_w));
+ m_ctc0->zc_callback<2>().set(m_sio0, FUNC(z80sio_device::rxtxcb_w));
/* floppy */
Z80PIO(config, "a71", 9.832_MHz_XTAL / 4);
Z80PIO(config, "a72", 9.832_MHz_XTAL / 4);
/* internal ram */
- RAM(config, RAM_TAG).set_default_size("64K").set_default_value(0x00);
-MACHINE_CONFIG_END
+ RAM(config, m_ram).set_default_size("64K").set_default_value(0x00);
+}
-MACHINE_CONFIG_START(rt1715_state::rt1715w)
+void rt1715_state::rt1715w(machine_config &config)
+{
rt1715(config);
-MACHINE_CONFIG_END
+
+ m_maincpu->set_clock(15.9744_MHz_XTAL / 4);
+ m_maincpu->set_addrmap(AS_PROGRAM, &rt1715_state::rt1715w_mem);
+ m_maincpu->set_addrmap(AS_IO, &rt1715_state::rt1715w_io);
+ m_maincpu->set_daisy_config(rt1715w_daisy_chain);
+
+ ADDRESS_MAP_BANK(config, "bankdev0").set_map(&rt1715_state::rt1715w_banked_mem).set_options(ENDIANNESS_BIG, 8, 19, 0x10000);
+ ADDRESS_MAP_BANK(config, "bankdev1").set_map(&rt1715_state::rt1715w_banked_mem).set_options(ENDIANNESS_BIG, 8, 19, 0x10000);
+
+ MCFG_MACHINE_START_OVERRIDE(rt1715_state, rt1715w)
+ MCFG_MACHINE_RESET_OVERRIDE(rt1715_state, rt1715w)
+
+ config.device_remove("a71");
+ config.device_remove("a72");
+
+ m_crtc->drq_wr_callback().set(FUNC(rt1715_state::crtc_drq_w));
+
+ // operates in polled mode
+ I8272A(config, m_fdc, 8'000'000 / 4, false);
+ m_fdc->drq_wr_callback().set(m_dma, FUNC(z80dma_device::rdy_w)).invert();
+ FLOPPY_CONNECTOR(config, "i8272:0", rt1715w_floppies, "525qd", floppy_image_device::default_floppy_formats);
+ FLOPPY_CONNECTOR(config, "i8272:1", rt1715w_floppies, "525qd", floppy_image_device::default_floppy_formats);
+
+ Z80DMA(config, m_dma, 15.9744_MHz_XTAL / 4);
+ m_dma->out_busreq_callback().set(FUNC(rt1715_state::busreq_w));
+ m_dma->out_int_callback().set(FUNC(rt1715_state::tc_w));
+ m_dma->in_mreq_callback().set(FUNC(rt1715_state::memory_read_byte));
+ m_dma->out_mreq_callback().set(FUNC(rt1715_state::memory_write_byte));
+ m_dma->in_iorq_callback().set(FUNC(rt1715_state::io_read_byte));
+ m_dma->out_iorq_callback().set(FUNC(rt1715_state::io_write_byte));
+
+ Z80CTC(config, m_ctc2, 15.9744_MHz_XTAL / 4);
+
+ m_ram->set_default_size("256K");
+}
/***************************************************************************
@@ -389,4 +678,4 @@ ROM_END
// YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS
COMP( 1986, rt1715, 0, 0, rt1715, k7658, rt1715_state, empty_init, "Robotron", "Robotron PC-1715", MACHINE_NOT_WORKING | MACHINE_NO_SOUND_HW )
COMP( 1986, rt1715lc, rt1715, 0, rt1715, k7658, rt1715_state, empty_init, "Robotron", "Robotron PC-1715 (latin/cyrillic)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND_HW )
-COMP( 1986, rt1715w, rt1715, 0, rt1715w, k7658, rt1715_state, empty_init, "Robotron", "Robotron PC-1715W", MACHINE_NOT_WORKING | MACHINE_NO_SOUND_HW )
+COMP( 1986, rt1715w, rt1715, 0, rt1715w, rt1715w, rt1715_state, empty_init, "Robotron", "Robotron PC-1715W", MACHINE_NOT_WORKING | MACHINE_NO_SOUND_HW )
diff --git a/src/mame/drivers/rulechan.cpp b/src/mame/drivers/rulechan.cpp
index c421cf10508..08b2ed382e6 100644
--- a/src/mame/drivers/rulechan.cpp
+++ b/src/mame/drivers/rulechan.cpp
@@ -727,8 +727,8 @@ INPUT_PORTS_END
* Machine Driver *
**************************************/
-MACHINE_CONFIG_START(rulechan_state::rulechan)
-
+void rulechan_state::rulechan(machine_config &config)
+{
/* basic machine hardware */
Z80(config, m_maincpu, CPU_CLOCK);
m_maincpu->set_addrmap(AS_PROGRAM, &rulechan_state::main_map);
@@ -741,8 +741,8 @@ MACHINE_CONFIG_START(rulechan_state::rulechan)
/* eeprom */
EEPROM_93C46_8BIT(config, "eeprom");
- MCFG_TIMER_DRIVER_ADD_PERIODIC("ball_speed", rulechan_state, ball_speed, attotime::from_hz(60))
- MCFG_TIMER_DRIVER_ADD_PERIODIC("wheel_speed", rulechan_state, wheel_speed, attotime::from_hz(60))
+ TIMER(config, "ball_speed").configure_periodic(FUNC(rulechan_state::ball_speed), attotime::from_hz(60));
+ TIMER(config, "wheel_speed").configure_periodic(FUNC(rulechan_state::wheel_speed), attotime::from_hz(60));
/* video hardware */
v9938_device &v9938(V9938(config, "v9938", VID_CLOCK));
@@ -757,8 +757,7 @@ MACHINE_CONFIG_START(rulechan_state::rulechan)
ay_re900.port_a_read_callback().set(FUNC(rulechan_state::psg_portA_r));
ay_re900.port_b_read_callback().set(FUNC(rulechan_state::psg_portB_r));
ay_re900.add_route(ALL_OUTPUTS, "mono", 0.5);
-
-MACHINE_CONFIG_END
+}
/**************************************
diff --git a/src/mame/drivers/rungun.cpp b/src/mame/drivers/rungun.cpp
index a96c39610d6..db6766ca25a 100644
--- a/src/mame/drivers/rungun.cpp
+++ b/src/mame/drivers/rungun.cpp
@@ -256,12 +256,6 @@ void rungun_state::rungun_sound_map(address_map &map)
}
-void rungun_state::k054539_map(address_map &map)
-{
- map(0x000000, 0x3fffff).rom().region("k054539", 0);
-}
-
-
static INPUT_PORTS_START( rng )
PORT_START("SYSTEM")
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_COIN1 )
@@ -449,14 +443,14 @@ void rungun_state::rng(machine_config &config)
// SFX
K054539(config, m_k054539_1, 18.432_MHz_XTAL);
- m_k054539_1->set_addrmap(0, &rungun_state::k054539_map);
+ m_k054539_1->set_device_rom_tag("k054539");
m_k054539_1->timer_handler().set(FUNC(rungun_state::k054539_nmi_gen));
m_k054539_1->add_route(0, "rspeaker", 1.0);
m_k054539_1->add_route(1, "lspeaker", 1.0);
// BGM, volumes handtuned to make SFXs audible (still not 100% right tho)
K054539(config, m_k054539_2, 18.432_MHz_XTAL);
- m_k054539_2->set_addrmap(0, &rungun_state::k054539_map);
+ m_k054539_2->set_device_rom_tag("k054539");
m_k054539_2->add_route(0, "rspeaker", 0.6);
m_k054539_2->add_route(1, "lspeaker", 0.6);
}
diff --git a/src/mame/drivers/rx78.cpp b/src/mame/drivers/rx78.cpp
index 5a21fbd418d..c6002549395 100644
--- a/src/mame/drivers/rx78.cpp
+++ b/src/mame/drivers/rx78.cpp
@@ -298,7 +298,7 @@ void rx78_state::rx78_io(address_map &map)
map(0xf5, 0xfb).w(FUNC(rx78_state::vdp_reg_w)); //vdp
map(0xfc, 0xfc).w(FUNC(rx78_state::vdp_bg_reg_w)); //vdp
map(0xfe, 0xfe).w(FUNC(rx78_state::vdp_pri_mask_w));
- map(0xff, 0xff).w("sn1", FUNC(sn76489a_device::command_w)); //psg
+ map(0xff, 0xff).w("sn1", FUNC(sn76489a_device::write)); //psg
}
/* Input ports */
@@ -432,7 +432,7 @@ void rx78_state::machine_reset()
{
address_space &prg = m_maincpu->space(AS_PROGRAM);
if (m_cart->exists())
- prg.install_read_handler(0x2000, 0x5fff, read8_delegate(FUNC(generic_slot_device::read_rom),(generic_slot_device*)m_cart));
+ prg.install_read_handler(0x2000, 0x5fff, read8sm_delegate(FUNC(generic_slot_device::read_rom),(generic_slot_device*)m_cart));
}
DEVICE_IMAGE_LOAD_MEMBER( rx78_state, rx78_cart )
@@ -472,25 +472,24 @@ GFXDECODE_END
MACHINE_CONFIG_START(rx78_state::rx78)
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu",Z80, MASTER_CLOCK/7) // unknown divider
- MCFG_DEVICE_PROGRAM_MAP(rx78_mem)
- MCFG_DEVICE_IO_MAP(rx78_io)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", rx78_state, irq0_line_hold)
+ Z80(config, m_maincpu, MASTER_CLOCK/7); // unknown divider
+ m_maincpu->set_addrmap(AS_PROGRAM, &rx78_state::rx78_mem);
+ m_maincpu->set_addrmap(AS_IO, &rx78_state::rx78_io);
+ m_maincpu->set_vblank_int("screen", FUNC(rx78_state::irq0_line_hold));
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
-// MCFG_SCREEN_REFRESH_RATE(60)
-// MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */
-// MCFG_SCREEN_SIZE(192, 184)
-// MCFG_SCREEN_VISIBLE_AREA(0, 192-1, 0, 184-1)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+// screen.set_refresh_hz(60);
+// screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */
+// screen.set_size(192, 184);
+// screen.set_visarea(0, 192-1, 0, 184-1);
/* guess: generic NTSC video timing at 256x224, system runs at 192x184, suppose with some border area to compensate */
- MCFG_SCREEN_RAW_PARAMS(MASTER_CLOCK/4, 442, 0, 256, 263, 0, 224)
- MCFG_SCREEN_UPDATE_DRIVER(rx78_state, screen_update)
+ screen.set_raw(MASTER_CLOCK/4, 442, 0, 256, 263, 0, 224);
+ screen.set_screen_update(FUNC(rx78_state::screen_update));
+ screen.set_palette("palette");
- MCFG_SCREEN_PALETTE("palette")
-
- MCFG_PALETTE_ADD("palette", 16+1) //+1 for the background color
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_rx78)
+ PALETTE(config, m_palette).set_entries(16+1); //+1 for the background color
+ GFXDECODE(config, "gfxdecode", m_palette, gfx_rx78);
MCFG_GENERIC_CARTSLOT_ADD("cartslot", generic_plain_slot, "rx78_cart")
MCFG_GENERIC_EXTENSIONS("bin,rom")
@@ -498,17 +497,16 @@ MACHINE_CONFIG_START(rx78_state::rx78)
RAM(config, RAM_TAG).set_default_size("32K").set_extra_options("16K");
- MCFG_CASSETTE_ADD( "cassette" )
+ CASSETTE(config, m_cass);
SPEAKER(config, "mono").front_center();
WAVE(config, "wave", "cassette").add_route(ALL_OUTPUTS, "mono", 0.25);
- MCFG_DEVICE_ADD("sn1", SN76489A, XTAL(28'636'363)/8) // unknown divider
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.50)
+ SN76489A(config, "sn1", XTAL(28'636'363)/8).add_route(ALL_OUTPUTS, "mono", 0.50); // unknown divider
/* Software lists */
- MCFG_SOFTWARE_LIST_ADD("cart_list","rx78")
+ SOFTWARE_LIST(config, "cart_list").set_original("rx78");
MACHINE_CONFIG_END
/* ROM definition */
diff --git a/src/mame/drivers/rzone.cpp b/src/mame/drivers/rzone.cpp
index 32142bbd63a..53305092ea2 100644
--- a/src/mame/drivers/rzone.cpp
+++ b/src/mame/drivers/rzone.cpp
@@ -40,8 +40,8 @@
class rzone_state : public hh_sm510_state
{
public:
- rzone_state(const machine_config &mconfig, device_type type, const char *tag)
- : hh_sm510_state(mconfig, type, tag),
+ rzone_state(const machine_config &mconfig, device_type type, const char *tag) :
+ hh_sm510_state(mconfig, type, tag),
m_led_out(*this, "led"),
m_led_off(*this, "led_off")
{ }
@@ -242,8 +242,8 @@ INPUT_PORTS_END
***************************************************************************/
-MACHINE_CONFIG_START(rzone_state::rzbatfor)
-
+void rzone_state::rzbatfor(machine_config &config)
+{
/* basic machine hardware */
SM512(config, m_maincpu); // no external XTAL
m_maincpu->write_segs().set(FUNC(hh_sm510_state::sm510_lcd_segment_w));
@@ -252,23 +252,22 @@ MACHINE_CONFIG_START(rzone_state::rzbatfor)
m_maincpu->write_r().set(FUNC(rzone_state::t2_write_r));
/* video hardware */
- MCFG_SCREEN_SVG_ADD("screen", "svg")
- MCFG_SCREEN_REFRESH_RATE(50)
- MCFG_SCREEN_SIZE(1368, 1080)
- MCFG_SCREEN_VISIBLE_AREA(0, 1368-1, 0, 1080-1)
+ screen_device &screen(SCREEN(config, "screen", "svg"));
+ screen.set_refresh_hz(50);
+ screen.set_size(1368, 1080);
+ screen.set_visarea(0, 1368-1, 0, 1080-1);
- MCFG_TIMER_DRIVER_ADD("led_off", rzone_state, led_off_callback)
- MCFG_TIMER_DRIVER_ADD_PERIODIC("display_decay", hh_sm510_state, display_decay_tick, attotime::from_msec(1))
+ TIMER(config, m_led_off).configure_generic(FUNC(rzone_state::led_off_callback));
+ TIMER(config, "display_decay").configure_periodic(FUNC(hh_sm510_state::display_decay_tick), attotime::from_msec(1));
config.set_default_layout(layout_rzone);
/* sound hardware */
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("speaker", SPEAKER_SOUND)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25)
-MACHINE_CONFIG_END
-
-MACHINE_CONFIG_START(rzone_state::rztoshden)
+ SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25);
+}
+void rzone_state::rztoshden(machine_config &config)
+{
/* basic machine hardware */
SM510(config, m_maincpu);
m_maincpu->set_r_mask_option(sm510_base_device::RMASK_DIRECT);
@@ -278,23 +277,22 @@ MACHINE_CONFIG_START(rzone_state::rztoshden)
m_maincpu->write_r().set(FUNC(rzone_state::t1_write_r));
/* video hardware */
- MCFG_SCREEN_SVG_ADD("screen", "svg")
- MCFG_SCREEN_REFRESH_RATE(50)
- MCFG_SCREEN_SIZE(1392, 1080)
- MCFG_SCREEN_VISIBLE_AREA(0, 1392-1, 0, 1080-1)
+ screen_device &screen(SCREEN(config, "screen", "svg"));
+ screen.set_refresh_hz(50);
+ screen.set_size(1392, 1080);
+ screen.set_visarea(0, 1392-1, 0, 1080-1);
- MCFG_TIMER_DRIVER_ADD("led_off", rzone_state, led_off_callback)
- MCFG_TIMER_DRIVER_ADD_PERIODIC("display_decay", hh_sm510_state, display_decay_tick, attotime::from_msec(1))
+ TIMER(config, m_led_off).configure_generic(FUNC(rzone_state::led_off_callback));
+ TIMER(config, "display_decay").configure_periodic(FUNC(hh_sm510_state::display_decay_tick), attotime::from_msec(1));
config.set_default_layout(layout_rzone);
/* sound hardware */
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("speaker", SPEAKER_SOUND)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25)
-MACHINE_CONFIG_END
-
-MACHINE_CONFIG_START(rzone_state::rzindy500)
+ SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25);
+}
+void rzone_state::rzindy500(machine_config &config)
+{
/* basic machine hardware */
SM510(config, m_maincpu); // no external XTAL
m_maincpu->set_r_mask_option(sm510_base_device::RMASK_DIRECT); // confirmed
@@ -304,20 +302,19 @@ MACHINE_CONFIG_START(rzone_state::rzindy500)
m_maincpu->write_r().set(FUNC(rzone_state::t1_write_r));
/* video hardware */
- MCFG_SCREEN_SVG_ADD("screen", "svg")
- MCFG_SCREEN_REFRESH_RATE(50)
- MCFG_SCREEN_SIZE(1425, 1080)
- MCFG_SCREEN_VISIBLE_AREA(0, 1425-1, 0, 1080-1)
+ screen_device &screen(SCREEN(config, "screen", "svg"));
+ screen.set_refresh_hz(50);
+ screen.set_size(1425, 1080);
+ screen.set_visarea(0, 1425-1, 0, 1080-1);
- MCFG_TIMER_DRIVER_ADD("led_off", rzone_state, led_off_callback)
- MCFG_TIMER_DRIVER_ADD_PERIODIC("display_decay", hh_sm510_state, display_decay_tick, attotime::from_msec(1))
+ TIMER(config, m_led_off).configure_generic(FUNC(rzone_state::led_off_callback));
+ TIMER(config, "display_decay").configure_periodic(FUNC(hh_sm510_state::display_decay_tick), attotime::from_msec(1));
config.set_default_layout(layout_rzone);
/* sound hardware */
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("speaker", SPEAKER_SOUND)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25)
-MACHINE_CONFIG_END
+ SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25);
+}
diff --git a/src/mame/drivers/s11.cpp b/src/mame/drivers/s11.cpp
index e3e55a08f20..b1966c18077 100644
--- a/src/mame/drivers/s11.cpp
+++ b/src/mame/drivers/s11.cpp
@@ -382,10 +382,11 @@ void s11_state::init_s11()
m_irq_active = false;
}
-MACHINE_CONFIG_START(s11_state::s11)
+void s11_state::s11(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M6802, XTAL(4'000'000))
- MCFG_DEVICE_PROGRAM_MAP(s11_main_map)
+ M6802(config, m_maincpu, XTAL(4'000'000));
+ m_maincpu->set_addrmap(AS_PROGRAM, &s11_state::s11_main_map);
MCFG_MACHINE_RESET_OVERRIDE(s11_state, s11)
/* Video */
@@ -443,46 +444,45 @@ MACHINE_CONFIG_START(s11_state::s11)
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
/* Add the soundcard */
- MCFG_DEVICE_ADD("audiocpu", M6808, XTAL(4'000'000))
- MCFG_DEVICE_PROGRAM_MAP(s11_audio_map)
+ M6808(config, m_audiocpu, XTAL(4'000'000));
+ m_audiocpu->set_addrmap(AS_PROGRAM, &s11_state::s11_audio_map);
SPEAKER(config, "speaker").front_center();
- MCFG_DEVICE_ADD("dac", MC1408, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 0.5)
- MCFG_DEVICE_ADD("vref", VOLTAGE_REGULATOR, 0) MCFG_VOLTAGE_REGULATOR_OUTPUT(5.0)
- MCFG_SOUND_ROUTE(0, "dac", 1.0, DAC_VREF_POS_INPUT) MCFG_SOUND_ROUTE(0, "dac", -1.0, DAC_VREF_NEG_INPUT)
- MCFG_SOUND_ROUTE(0, "dac1", 1.0, DAC_VREF_POS_INPUT) MCFG_SOUND_ROUTE(0, "dac1", -1.0, DAC_VREF_NEG_INPUT)
+ MC1408(config, "dac", 0).add_route(ALL_OUTPUTS, "speaker", 0.5);
+ voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref"));
+ vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT); vref.add_route(0, "dac", -1.0, DAC_VREF_NEG_INPUT);
+ vref.add_route(0, "dac1", 1.0, DAC_VREF_POS_INPUT); vref.add_route(0, "dac1", -1.0, DAC_VREF_NEG_INPUT);
SPEAKER(config, "speech").front_center();
- MCFG_DEVICE_ADD("hc55516", HC55516, 0)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speech", 1.00)
+ HC55516(config, m_hc55516, 0).add_route(ALL_OUTPUTS, "speech", 1.00);
PIA6821(config, m_pias, 0);
m_pias->readpa_handler().set(FUNC(s11_state::sound_r));
m_pias->writepa_handler().set(FUNC(s11_state::sound_w));
m_pias->writepb_handler().set("dac", FUNC(dac_byte_interface::data_w));
- m_pias->ca2_handler().set("hc55516", FUNC(hc55516_device::clock_w));
- m_pias->cb2_handler().set("hc55516", FUNC(hc55516_device::digit_w));
- m_pias->irqa_handler().set_inputline("audiocpu", M6808_IRQ_LINE);
- m_pias->irqa_handler().set_inputline("audiocpu", M6808_IRQ_LINE);
+ m_pias->ca2_handler().set(m_hc55516, FUNC(hc55516_device::clock_w));
+ m_pias->cb2_handler().set(m_hc55516, FUNC(hc55516_device::digit_w));
+ m_pias->irqa_handler().set_inputline(m_audiocpu, M6808_IRQ_LINE);
+ m_pias->irqa_handler().set_inputline(m_audiocpu, M6808_IRQ_LINE);
/* Add the background music card */
- MCFG_DEVICE_ADD("bgcpu", MC6809E, 8000000 / 4) // MC68B09E
- MCFG_DEVICE_PROGRAM_MAP(s11_bg_map)
+ MC6809E(config, m_bgcpu, 8000000 / 4); // MC68B09E
+ m_bgcpu->set_addrmap(AS_PROGRAM, &s11_state::s11_bg_map);
SPEAKER(config, "bg").front_center();
YM2151(config, m_ym, 3580000);
m_ym->irq_handler().set(FUNC(s11_state::ym2151_irq_w));
m_ym->add_route(ALL_OUTPUTS, "bg", 0.50);
- MCFG_DEVICE_ADD("dac1", MC1408, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "bg", 0.25)
+ MC1408(config, "dac1", 0).add_route(ALL_OUTPUTS, "bg", 0.25);
PIA6821(config, m_pia40, 0);
m_pia40->writepa_handler().set("dac1", FUNC(dac_byte_interface::data_w));
m_pia40->writepb_handler().set(FUNC(s11_state::pia40_pb_w));
m_pia40->cb2_handler().set(FUNC(s11_state::pia40_cb2_w));
- m_pia40->irqa_handler().set_inputline("bgcpu", M6809_FIRQ_LINE);
- m_pia40->irqb_handler().set_inputline("bgcpu", INPUT_LINE_NMI);
-MACHINE_CONFIG_END
+ m_pia40->irqa_handler().set_inputline(m_bgcpu, M6809_FIRQ_LINE);
+ m_pia40->irqb_handler().set_inputline(m_bgcpu, INPUT_LINE_NMI);
+}
/*----------------------------
diff --git a/src/mame/drivers/s11a.cpp b/src/mame/drivers/s11a.cpp
index ddfc4d8fe4f..da5e5170178 100644
--- a/src/mame/drivers/s11a.cpp
+++ b/src/mame/drivers/s11a.cpp
@@ -174,10 +174,11 @@ void s11a_state::init_s11a()
s11_state::init_s11();
}
-MACHINE_CONFIG_START(s11a_state::s11a)
+void s11a_state::s11a(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M6808, XTAL(4'000'000))
- MCFG_DEVICE_PROGRAM_MAP(s11a_main_map)
+ M6808(config, m_maincpu, XTAL(4'000'000));
+ m_maincpu->set_addrmap(AS_PROGRAM, &s11a_state::s11a_main_map);
MCFG_MACHINE_RESET_OVERRIDE(s11a_state, s11a)
/* Video */
@@ -235,46 +236,45 @@ MACHINE_CONFIG_START(s11a_state::s11a)
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_1);
/* Add the soundcard */
- MCFG_DEVICE_ADD("audiocpu", M6802, XTAL(4'000'000))
- MCFG_DEVICE_PROGRAM_MAP(s11a_audio_map)
+ M6802(config, m_audiocpu, XTAL(4'000'000));
+ m_audiocpu->set_addrmap(AS_PROGRAM, &s11a_state::s11a_audio_map);
SPEAKER(config, "speaker").front_center();
- MCFG_DEVICE_ADD("dac", MC1408, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 0.25)
- MCFG_DEVICE_ADD("vref", VOLTAGE_REGULATOR, 0) MCFG_VOLTAGE_REGULATOR_OUTPUT(5.0)
- MCFG_SOUND_ROUTE(0, "dac", 1.0, DAC_VREF_POS_INPUT) MCFG_SOUND_ROUTE(0, "dac", -1.0, DAC_VREF_NEG_INPUT)
- MCFG_SOUND_ROUTE(0, "dac1", 1.0, DAC_VREF_POS_INPUT) MCFG_SOUND_ROUTE(0, "dac1", -1.0, DAC_VREF_NEG_INPUT)
+ MC1408(config, "dac", 0).add_route(ALL_OUTPUTS, "speaker", 0.25);
+ voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref"));
+ vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT); vref.add_route(0, "dac", -1.0, DAC_VREF_NEG_INPUT);
+ vref.add_route(0, "dac1", 1.0, DAC_VREF_POS_INPUT); vref.add_route(0, "dac1", -1.0, DAC_VREF_NEG_INPUT);
SPEAKER(config, "speech").front_center();
- MCFG_DEVICE_ADD("hc55516", HC55516, 0)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speech", 0.50)
+ HC55516(config, m_hc55516, 0).add_route(ALL_OUTPUTS, "speech", 0.50);
PIA6821(config, m_pias, 0);
m_pias->readpa_handler().set(FUNC(s11_state::sound_r));
m_pias->writepa_handler().set(FUNC(s11_state::sound_w));
m_pias->writepb_handler().set("dac", FUNC(dac_byte_interface::data_w));
m_pias->cb2_handler().set(FUNC(s11_state::pia40_cb2_w));
- m_pias->irqa_handler().set_inputline("audiocpu", M6802_IRQ_LINE);
- m_pias->irqa_handler().set_inputline("audiocpu", M6802_IRQ_LINE);
+ m_pias->irqa_handler().set_inputline(m_audiocpu, M6802_IRQ_LINE);
+ m_pias->irqa_handler().set_inputline(m_audiocpu, M6802_IRQ_LINE);
/* Add the background music card */
- MCFG_DEVICE_ADD("bgcpu", MC6809E, XTAL(8'000'000) / 4) // MC68B09E
- MCFG_DEVICE_PROGRAM_MAP(s11a_bg_map)
+ MC6809E(config, m_bgcpu, XTAL(8'000'000) / 4); // MC68B09E
+ m_bgcpu->set_addrmap(AS_PROGRAM, &s11a_state::s11a_bg_map);
SPEAKER(config, "bg").front_center();
YM2151(config, m_ym, XTAL(3'579'545));
m_ym->irq_handler().set(FUNC(s11a_state::ym2151_irq_w));
m_ym->add_route(ALL_OUTPUTS, "bg", 0.50);
- MCFG_DEVICE_ADD("dac1", MC1408, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "bg", 0.25)
+ MC1408(config, "dac1", 0).add_route(ALL_OUTPUTS, "bg", 0.25);
PIA6821(config, m_pia40, 0);
m_pia40->writepa_handler().set("dac1", FUNC(dac_byte_interface::data_w));
m_pia40->writepb_handler().set(FUNC(s11_state::pia40_pb_w));
m_pia40->ca2_handler().set(FUNC(s11_state::pias_ca2_w));
m_pia40->cb2_handler().set(FUNC(s11_state::pias_cb2_w));
- m_pia40->irqa_handler().set_inputline("bgcpu", M6809_FIRQ_LINE);
- m_pia40->irqb_handler().set_inputline("bgcpu", INPUT_LINE_NMI);
-MACHINE_CONFIG_END
+ m_pia40->irqa_handler().set_inputline(m_bgcpu, M6809_FIRQ_LINE);
+ m_pia40->irqb_handler().set_inputline(m_bgcpu, INPUT_LINE_NMI);
+}
/*------------------------
/ F14 Tomcat 5/87 (#554)
diff --git a/src/mame/drivers/s11b.cpp b/src/mame/drivers/s11b.cpp
index cc40eaa7be5..2d6a5baf276 100644
--- a/src/mame/drivers/s11b.cpp
+++ b/src/mame/drivers/s11b.cpp
@@ -250,10 +250,11 @@ void s11b_state::init_s11b_invert()
m_invert = true;
}
-MACHINE_CONFIG_START(s11b_state::s11b)
+void s11b_state::s11b(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M6808, XTAL(4'000'000))
- MCFG_DEVICE_PROGRAM_MAP(s11b_main_map)
+ M6808(config, m_maincpu, XTAL(4'000'000));
+ m_maincpu->set_addrmap(AS_PROGRAM, &s11b_state::s11b_main_map);
MCFG_MACHINE_RESET_OVERRIDE(s11b_state, s11b)
/* Video */
@@ -311,18 +312,17 @@ MACHINE_CONFIG_START(s11b_state::s11b)
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_1);
/* Add the soundcard */
- MCFG_DEVICE_ADD("audiocpu", M6802, XTAL(4'000'000))
- MCFG_DEVICE_PROGRAM_MAP(s11b_audio_map)
+ M6802(config, m_audiocpu, XTAL(4'000'000));
+ m_audiocpu->set_addrmap(AS_PROGRAM, &s11b_state::s11b_audio_map);
SPEAKER(config, "speaker").front_center();
- MCFG_DEVICE_ADD("dac", MC1408, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 0.25)
- MCFG_DEVICE_ADD("vref", VOLTAGE_REGULATOR, 0) MCFG_VOLTAGE_REGULATOR_OUTPUT(5.0)
- MCFG_SOUND_ROUTE(0, "dac", 1.0, DAC_VREF_POS_INPUT) MCFG_SOUND_ROUTE(0, "dac", -1.0, DAC_VREF_NEG_INPUT)
- MCFG_SOUND_ROUTE(0, "dac1", 1.0, DAC_VREF_POS_INPUT) MCFG_SOUND_ROUTE(0, "dac1", -1.0, DAC_VREF_NEG_INPUT)
+ MC1408(config, "dac", 0).add_route(ALL_OUTPUTS, "speaker", 0.25);
+ voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref"));
+ vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT); vref.add_route(0, "dac", -1.0, DAC_VREF_NEG_INPUT);
+ vref.add_route(0, "dac1", 1.0, DAC_VREF_POS_INPUT); vref.add_route(0, "dac1", -1.0, DAC_VREF_NEG_INPUT);
SPEAKER(config, "speech").front_center();
- MCFG_DEVICE_ADD("hc55516", HC55516, 0)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speech", 0.50)
+ HC55516(config, m_hc55516, 0).add_route(ALL_OUTPUTS, "speech", 0.50);
PIA6821(config, m_pias, 0);
m_pias->readpa_handler().set(FUNC(s11_state::sound_r));
@@ -334,19 +334,18 @@ MACHINE_CONFIG_START(s11b_state::s11b)
m_pias->irqa_handler().set_inputline("audiocpu", M6802_IRQ_LINE);
/* Add the background music card */
- MCFG_DEVICE_ADD("bgcpu", MC6809E, XTAL(8'000'000) / 4) // MC68B09E
- MCFG_DEVICE_PROGRAM_MAP(s11b_bg_map)
- MCFG_QUANTUM_TIME(attotime::from_hz(50))
+ MC6809E(config, m_bgcpu, XTAL(8'000'000) / 4); // MC68B09E
+ m_bgcpu->set_addrmap(AS_PROGRAM, &s11b_state::s11b_bg_map);
+ config.m_minimum_quantum = attotime::from_hz(50);
SPEAKER(config, "bg").front_center();
YM2151(config, m_ym, 3580000);
m_ym->irq_handler().set(FUNC(s11b_state::ym2151_irq_w));
m_ym->add_route(ALL_OUTPUTS, "bg", 0.25);
- MCFG_DEVICE_ADD("dac1", MC1408, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "bg", 0.25)
+ MC1408(config, "dac1", 0).add_route(ALL_OUTPUTS, "bg", 0.25);
- MCFG_DEVICE_ADD("hc55516_bg", HC55516, 0)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speech", 0.50)
+ HC55516(config, m_bg_hc55516, 0).add_route(ALL_OUTPUTS, "speech", 0.50);
PIA6821(config, m_pia40, 0);
m_pia40->writepa_handler().set("dac1", FUNC(dac_byte_interface::data_w));
@@ -355,8 +354,7 @@ MACHINE_CONFIG_START(s11b_state::s11b)
m_pia40->cb2_handler().set(FUNC(s11_state::pia40_cb2_w));
m_pia40->irqa_handler().set_inputline("bgcpu", M6809_FIRQ_LINE);
m_pia40->irqb_handler().set_inputline("bgcpu", INPUT_LINE_NMI);
-
-MACHINE_CONFIG_END
+}
/*-----------------------
/ Bad Cats 12/89
diff --git a/src/mame/drivers/s3.cpp b/src/mame/drivers/s3.cpp
index 3c0b7261150..9a7121a8c79 100644
--- a/src/mame/drivers/s3.cpp
+++ b/src/mame/drivers/s3.cpp
@@ -436,11 +436,12 @@ TIMER_DEVICE_CALLBACK_MEMBER( s3_state::irq )
m_t_c++;
}
-MACHINE_CONFIG_START(s3_state::s3)
+void s3_state::s3(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M6800, 3580000)
- MCFG_DEVICE_PROGRAM_MAP(s3_main_map)
- MCFG_TIMER_DRIVER_ADD_PERIODIC("irq", s3_state, irq, attotime::from_hz(250))
+ M6800(config, m_maincpu, 3580000);
+ m_maincpu->set_addrmap(AS_PROGRAM, &s3_state::s3_main_map);
+ TIMER(config, "irq").configure_periodic(FUNC(s3_state::irq), attotime::from_hz(250));
MCFG_MACHINE_RESET_OVERRIDE(s3_state, s3)
/* Video */
@@ -486,26 +487,28 @@ MACHINE_CONFIG_START(s3_state::s3)
m_pia30->irqb_handler().set_inputline("maincpu", M6800_IRQ_LINE);
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(s3_state::s3a)
+void s3_state::s3a(machine_config &config)
+{
s3(config);
/* Add the soundcard */
- MCFG_DEVICE_ADD("audiocpu", M6802, 3580000)
- MCFG_DEVICE_PROGRAM_MAP(s3_audio_map)
+ M6802(config, m_audiocpu, 3580000);
+ m_audiocpu->set_addrmap(AS_PROGRAM, &s3_state::s3_audio_map);
MCFG_MACHINE_RESET_OVERRIDE(s3_state, s3a)
SPEAKER(config, "speaker").front_center();
- MCFG_DEVICE_ADD("dac", MC1408, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 0.5)
- MCFG_DEVICE_ADD("vref", VOLTAGE_REGULATOR, 0) MCFG_VOLTAGE_REGULATOR_OUTPUT(5.0)
- MCFG_SOUND_ROUTE(0, "dac", 1.0, DAC_VREF_POS_INPUT) MCFG_SOUND_ROUTE(0, "dac", -1.0, DAC_VREF_NEG_INPUT)
+ MC1408(config, "dac", 0).add_route(ALL_OUTPUTS, "speaker", 0.5);
+ voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref"));
+ vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT);
+ vref.add_route(0, "dac", -1.0, DAC_VREF_NEG_INPUT);
PIA6821(config, m_pias, 0);
m_pias->readpb_handler().set(FUNC(s3_state::sound_r));
m_pias->writepa_handler().set("dac", FUNC(dac_byte_interface::data_w));
m_pias->irqa_handler().set_inputline("audiocpu", M6802_IRQ_LINE);
m_pias->irqb_handler().set_inputline("audiocpu", M6802_IRQ_LINE);
-MACHINE_CONFIG_END
+}
//***************************************** SYSTEM 3 ******************************************************
diff --git a/src/mame/drivers/s4.cpp b/src/mame/drivers/s4.cpp
index d20a91c419c..33265e28e2c 100644
--- a/src/mame/drivers/s4.cpp
+++ b/src/mame/drivers/s4.cpp
@@ -430,11 +430,12 @@ TIMER_DEVICE_CALLBACK_MEMBER( s4_state::irq )
m_t_c++;
}
-MACHINE_CONFIG_START(s4_state::s4)
+void s4_state::s4(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M6800, 3580000)
- MCFG_DEVICE_PROGRAM_MAP(s4_main_map)
- MCFG_TIMER_DRIVER_ADD_PERIODIC("irq", s4_state, irq, attotime::from_hz(250))
+ M6800(config, m_maincpu, 3580000);
+ m_maincpu->set_addrmap(AS_PROGRAM, &s4_state::s4_main_map);
+ TIMER(config, "irq").configure_periodic(FUNC(s4_state::irq), attotime::from_hz(250));
MCFG_MACHINE_RESET_OVERRIDE(s4_state, s4)
/* Video */
@@ -480,26 +481,28 @@ MACHINE_CONFIG_START(s4_state::s4)
m_pia30->irqb_handler().set_inputline("maincpu", M6800_IRQ_LINE);
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(s4_state::s4a)
+void s4_state::s4a(machine_config &config)
+{
s4(config);
/* Add the soundcard */
- MCFG_DEVICE_ADD("audiocpu", M6808, 3580000)
- MCFG_DEVICE_PROGRAM_MAP(s4_audio_map)
+ M6808(config, m_audiocpu, 3580000);
+ m_audiocpu->set_addrmap(AS_PROGRAM, &s4_state::s4_audio_map);
MCFG_MACHINE_RESET_OVERRIDE(s4_state, s4a)
SPEAKER(config, "speaker").front_center();
- MCFG_DEVICE_ADD("dac", MC1408, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 0.5)
- MCFG_DEVICE_ADD("vref", VOLTAGE_REGULATOR, 0) MCFG_VOLTAGE_REGULATOR_OUTPUT(5.0)
- MCFG_SOUND_ROUTE(0, "dac", 1.0, DAC_VREF_POS_INPUT) MCFG_SOUND_ROUTE(0, "dac", -1.0, DAC_VREF_NEG_INPUT)
+ MC1408(config, "dac", 0).add_route(ALL_OUTPUTS, "speaker", 0.5);
+ voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref"));
+ vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT);
+ vref.add_route(0, "dac", -1.0, DAC_VREF_NEG_INPUT);
PIA6821(config, m_pias, 0);
m_pias->readpb_handler().set(FUNC(s4_state::sound_r));
m_pias->writepa_handler().set("dac", FUNC(dac_byte_interface::data_w));
m_pias->irqa_handler().set_inputline("audiocpu", M6808_IRQ_LINE);
m_pias->irqb_handler().set_inputline("audiocpu", M6808_IRQ_LINE);
-MACHINE_CONFIG_END
+}
/*--------------------------------
diff --git a/src/mame/drivers/s6.cpp b/src/mame/drivers/s6.cpp
index 56160bc2d06..859102df718 100644
--- a/src/mame/drivers/s6.cpp
+++ b/src/mame/drivers/s6.cpp
@@ -409,10 +409,11 @@ void s6_state::init_s6()
m_irq_timer->adjust(attotime::from_ticks(980,3580000/4),1);
}
-MACHINE_CONFIG_START(s6_state::s6)
+void s6_state::s6(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M6808, 3580000) // 6802 or 6808 could be used here
- MCFG_DEVICE_PROGRAM_MAP(s6_main_map)
+ M6808(config, m_maincpu, 3580000); // 6802 or 6808 could be used here
+ m_maincpu->set_addrmap(AS_PROGRAM, &s6_state::s6_main_map);
MCFG_MACHINE_RESET_OVERRIDE(s6_state, s6)
/* Video */
@@ -458,17 +459,17 @@ MACHINE_CONFIG_START(s6_state::s6)
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
/* Add the soundcard */
- MCFG_DEVICE_ADD("audiocpu", M6802, 3580000)
- MCFG_DEVICE_PROGRAM_MAP(s6_audio_map)
+ M6802(config, m_audiocpu, 3580000);
+ m_audiocpu->set_addrmap(AS_PROGRAM, &s6_state::s6_audio_map);
SPEAKER(config, "speaker").front_center();
- MCFG_DEVICE_ADD("dac", MC1408, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 0.5)
- MCFG_DEVICE_ADD("vref", VOLTAGE_REGULATOR, 0) MCFG_VOLTAGE_REGULATOR_OUTPUT(5.0)
- MCFG_SOUND_ROUTE(0, "dac", 1.0, DAC_VREF_POS_INPUT) MCFG_SOUND_ROUTE(0, "dac", -1.0, DAC_VREF_NEG_INPUT)
+ MC1408(config, "dac", 0).add_route(ALL_OUTPUTS, "speaker", 0.5);
+ voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref"));
+ vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT);
+ vref.add_route(0, "dac", -1.0, DAC_VREF_NEG_INPUT);
SPEAKER(config, "speech").front_center();
- MCFG_DEVICE_ADD("hc55516", HC55516, 0)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speech", 1.00)
+ HC55516(config, m_hc55516, 0).add_route(ALL_OUTPUTS, "speech", 1.00);
PIA6821(config, m_pias, 0);
m_pias->readpb_handler().set(FUNC(s6_state::sound_r));
@@ -477,7 +478,7 @@ MACHINE_CONFIG_START(s6_state::s6)
m_pias->cb2_handler().set(m_hc55516, FUNC(hc55516_device::clock_w));
m_pias->irqa_handler().set_inputline(m_audiocpu, M6802_IRQ_LINE); // FIXME: needs an input merger
m_pias->irqb_handler().set_inputline(m_audiocpu, M6802_IRQ_LINE);
-MACHINE_CONFIG_END
+}
/*--------------------------------
diff --git a/src/mame/drivers/s6a.cpp b/src/mame/drivers/s6a.cpp
index a8a20e9ecc7..39b3aabb706 100644
--- a/src/mame/drivers/s6a.cpp
+++ b/src/mame/drivers/s6a.cpp
@@ -392,10 +392,11 @@ void s6a_state::init_s6a()
m_irq_timer->adjust(attotime::from_ticks(980,3580000/4),1);
}
-MACHINE_CONFIG_START(s6a_state::s6a)
+void s6a_state::s6a(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M6808, 3580000)
- MCFG_DEVICE_PROGRAM_MAP(s6a_main_map)
+ M6808(config, m_maincpu, 3580000);
+ m_maincpu->set_addrmap(AS_PROGRAM, &s6a_state::s6a_main_map);
MCFG_MACHINE_RESET_OVERRIDE(s6a_state, s6a)
/* Video */
@@ -441,17 +442,17 @@ MACHINE_CONFIG_START(s6a_state::s6a)
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
/* Add the soundcard */
- MCFG_DEVICE_ADD("audiocpu", M6802, 3580000)
- MCFG_DEVICE_PROGRAM_MAP(s6a_audio_map)
+ M6802(config, m_audiocpu, 3580000);
+ m_audiocpu->set_addrmap(AS_PROGRAM, &s6a_state::s6a_audio_map);
SPEAKER(config, "speaker").front_center();
- MCFG_DEVICE_ADD("dac", MC1408, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 0.5)
- MCFG_DEVICE_ADD("vref", VOLTAGE_REGULATOR, 0) MCFG_VOLTAGE_REGULATOR_OUTPUT(5.0)
- MCFG_SOUND_ROUTE(0, "dac", 1.0, DAC_VREF_POS_INPUT) MCFG_SOUND_ROUTE(0, "dac", -1.0, DAC_VREF_NEG_INPUT)
+ MC1408(config, "dac", 0).add_route(ALL_OUTPUTS, "speaker", 0.5);
+ voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref"));
+ vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT);
+ vref.add_route(0, "dac", -1.0, DAC_VREF_NEG_INPUT);
SPEAKER(config, "speech").front_center();
- MCFG_DEVICE_ADD("hc55516", HC55516, 0)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speech", 1.00)
+ HC55516(config, m_hc55516, 0).add_route(ALL_OUTPUTS, "speech", 1.00);
PIA6821(config, m_pias, 0);
m_pias->readpb_handler().set(FUNC(s6a_state::sound_r));
@@ -460,7 +461,7 @@ MACHINE_CONFIG_START(s6a_state::s6a)
m_pias->cb2_handler().set("hc55516", FUNC(hc55516_device::clock_w));
m_pias->irqa_handler().set_inputline("audiocpu", M6802_IRQ_LINE); // FIXME: needs an input merger
m_pias->irqb_handler().set_inputline("audiocpu", M6802_IRQ_LINE);
-MACHINE_CONFIG_END
+}
/*--------------------------
diff --git a/src/mame/drivers/s7.cpp b/src/mame/drivers/s7.cpp
index 14c856744a2..f673f35198b 100644
--- a/src/mame/drivers/s7.cpp
+++ b/src/mame/drivers/s7.cpp
@@ -434,10 +434,11 @@ void s7_state::init_s7()
m_irq_timer->adjust(attotime::from_ticks(980,3580000/4),1);
}
-MACHINE_CONFIG_START(s7_state::s7)
+void s7_state::s7(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M6808, 3580000)
- MCFG_DEVICE_PROGRAM_MAP(s7_main_map)
+ M6808(config, m_maincpu, 3580000);
+ m_maincpu->set_addrmap(AS_PROGRAM, &s7_state::s7_main_map);
MCFG_MACHINE_RESET_OVERRIDE(s7_state, s7)
/* Video */
@@ -493,17 +494,17 @@ MACHINE_CONFIG_START(s7_state::s7)
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
/* Add the soundcard */
- MCFG_DEVICE_ADD("audiocpu", M6808, 3580000)
- MCFG_DEVICE_PROGRAM_MAP(s7_audio_map)
+ M6808(config, m_audiocpu, 3580000);
+ m_audiocpu->set_addrmap(AS_PROGRAM, &s7_state::s7_audio_map);
SPEAKER(config, "speaker").front_center();
- MCFG_DEVICE_ADD("dac", MC1408, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 0.5)
- MCFG_DEVICE_ADD("vref", VOLTAGE_REGULATOR, 0) MCFG_VOLTAGE_REGULATOR_OUTPUT(5.0)
- MCFG_SOUND_ROUTE(0, "dac", 1.0, DAC_VREF_POS_INPUT) MCFG_SOUND_ROUTE(0, "dac", -1.0, DAC_VREF_NEG_INPUT)
+ MC1408(config, "dac", 0).add_route(ALL_OUTPUTS, "speaker", 0.5);
+ voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref"));
+ vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT);
+ vref.add_route(0, "dac", -1.0, DAC_VREF_NEG_INPUT);
SPEAKER(config, "speech").front_center();
- MCFG_DEVICE_ADD("hc55516", HC55516, 0)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speech", 1.00)
+ HC55516(config, m_hc55516, 0).add_route(ALL_OUTPUTS, "speech", 1.00);
PIA6821(config, m_pias, 0);
m_pias->readpb_handler().set(FUNC(s7_state::sound_r));
@@ -514,7 +515,7 @@ MACHINE_CONFIG_START(s7_state::s7)
m_pias->cb2_handler().set(m_hc55516, FUNC(hc55516_device::clock_w));
m_pias->irqa_handler().set_inputline(m_audiocpu, M6808_IRQ_LINE); // FIXME: needs an input merger
m_pias->irqb_handler().set_inputline(m_audiocpu, M6808_IRQ_LINE);
-MACHINE_CONFIG_END
+}
diff --git a/src/mame/drivers/s8.cpp b/src/mame/drivers/s8.cpp
index a8a567c99e3..3aaa9aca636 100644
--- a/src/mame/drivers/s8.cpp
+++ b/src/mame/drivers/s8.cpp
@@ -317,10 +317,11 @@ void s8_state::init_s8()
m_irq_timer->adjust(attotime::from_ticks(980,1e6),1);
}
-MACHINE_CONFIG_START(s8_state::s8)
+void s8_state::s8(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M6802, XTAL(4'000'000))
- MCFG_DEVICE_PROGRAM_MAP(s8_main_map)
+ M6802(config, m_maincpu, XTAL(4'000'000));
+ m_maincpu->set_addrmap(AS_PROGRAM, &s8_state::s8_main_map);
MCFG_MACHINE_RESET_OVERRIDE(s8_state, s8)
/* Video */
@@ -364,20 +365,21 @@ MACHINE_CONFIG_START(s8_state::s8)
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
/* Add the soundcard */
- MCFG_DEVICE_ADD("audiocpu", M6808, XTAL(4'000'000))
- MCFG_DEVICE_PROGRAM_MAP(s8_audio_map)
+ M6808(config, m_audiocpu, XTAL(4'000'000));
+ m_audiocpu->set_addrmap(AS_PROGRAM, &s8_state::s8_audio_map);
SPEAKER(config, "speaker").front_center();
- MCFG_DEVICE_ADD("dac", MC1408, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 0.5)
- MCFG_DEVICE_ADD("vref", VOLTAGE_REGULATOR, 0) MCFG_VOLTAGE_REGULATOR_OUTPUT(5.0)
- MCFG_SOUND_ROUTE(0, "dac", 1.0, DAC_VREF_POS_INPUT) MCFG_SOUND_ROUTE(0, "dac", -1.0, DAC_VREF_NEG_INPUT)
+ MC1408(config, "dac", 0).add_route(ALL_OUTPUTS, "speaker", 0.5);
+ voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref"));
+ vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT);
+ vref.add_route(0, "dac", -1.0, DAC_VREF_NEG_INPUT);
PIA6821(config, m_pias, 0);
m_pias->readpa_handler().set(FUNC(s8_state::sound_r));
m_pias->writepb_handler().set("dac", FUNC(dac_byte_interface::data_w));
m_pias->irqa_handler().set_inputline("audiocpu", M6808_IRQ_LINE);
m_pias->irqa_handler().set_inputline("audiocpu", M6808_IRQ_LINE);
-MACHINE_CONFIG_END
+}
/*------------------------------
/ Pennant Fever (#526) 05/1984
diff --git a/src/mame/drivers/s8a.cpp b/src/mame/drivers/s8a.cpp
index 9eb3ff69f20..95cc85f1020 100644
--- a/src/mame/drivers/s8a.cpp
+++ b/src/mame/drivers/s8a.cpp
@@ -289,10 +289,11 @@ void s8a_state::init_s8a()
m_irq_timer->adjust(attotime::from_ticks(980,1e6),1);
}
-MACHINE_CONFIG_START(s8a_state::s8a)
+void s8a_state::s8a(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M6802, XTAL(4'000'000))
- MCFG_DEVICE_PROGRAM_MAP(s8a_main_map)
+ M6802(config, m_maincpu, XTAL(4'000'000));
+ m_maincpu->set_addrmap(AS_PROGRAM, &s8a_state::s8a_main_map);
MCFG_MACHINE_RESET_OVERRIDE(s8a_state, s8a)
/* Video */
@@ -336,20 +337,21 @@ MACHINE_CONFIG_START(s8a_state::s8a)
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
/* Add the soundcard */
- MCFG_DEVICE_ADD("audiocpu", M6808, XTAL(4'000'000))
- MCFG_DEVICE_PROGRAM_MAP(s8a_audio_map)
+ M6808(config, m_audiocpu, XTAL(4'000'000));
+ m_audiocpu->set_addrmap(AS_PROGRAM, &s8a_state::s8a_audio_map);
SPEAKER(config, "speaker").front_center();
- MCFG_DEVICE_ADD("dac", MC1408, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 0.5)
- MCFG_DEVICE_ADD("vref", VOLTAGE_REGULATOR, 0) MCFG_VOLTAGE_REGULATOR_OUTPUT(5.0)
- MCFG_SOUND_ROUTE(0, "dac", 1.0, DAC_VREF_POS_INPUT) MCFG_SOUND_ROUTE(0, "dac", -1.0, DAC_VREF_NEG_INPUT)
+ MC1408(config, "dac", 0).add_route(ALL_OUTPUTS, "speaker", 0.5);
+ voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref"));
+ vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT);
+ vref.add_route(0, "dac", -1.0, DAC_VREF_NEG_INPUT);
PIA6821(config, m_pias, 0);
m_pias->readpa_handler().set(FUNC(s8a_state::sound_r));
m_pias->writepb_handler().set("dac", FUNC(dac_byte_interface::data_w));
m_pias->irqa_handler().set_inputline("audiocpu", M6808_IRQ_LINE);
m_pias->irqa_handler().set_inputline("audiocpu", M6808_IRQ_LINE);
-MACHINE_CONFIG_END
+}
/*----------------------------
diff --git a/src/mame/drivers/s9.cpp b/src/mame/drivers/s9.cpp
index 75639234967..6cb03857b16 100644
--- a/src/mame/drivers/s9.cpp
+++ b/src/mame/drivers/s9.cpp
@@ -323,10 +323,11 @@ void s9_state::init_s9()
m_irq_timer->adjust(attotime::from_ticks(980,1e6),1);
}
-MACHINE_CONFIG_START(s9_state::s9)
+void s9_state::s9(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M6808, XTAL(4'000'000))
- MCFG_DEVICE_PROGRAM_MAP(s9_main_map)
+ M6808(config, m_maincpu, XTAL(4'000'000));
+ m_maincpu->set_addrmap(AS_PROGRAM, &s9_state::s9_main_map);
MCFG_MACHINE_RESET_OVERRIDE(s9_state, s9)
/* Video */
@@ -370,17 +371,17 @@ MACHINE_CONFIG_START(s9_state::s9)
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
/* Add the soundcard */
- MCFG_DEVICE_ADD("audiocpu", M6808, XTAL(4'000'000))
- MCFG_DEVICE_PROGRAM_MAP(s9_audio_map)
+ M6808(config, m_audiocpu, XTAL(4'000'000));
+ m_audiocpu->set_addrmap(AS_PROGRAM, &s9_state::s9_audio_map);
SPEAKER(config, "speaker").front_center();
- MCFG_DEVICE_ADD("dac", MC1408, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 0.5)
- MCFG_DEVICE_ADD("vref", VOLTAGE_REGULATOR, 0) MCFG_VOLTAGE_REGULATOR_OUTPUT(5.0)
- MCFG_SOUND_ROUTE(0, "dac", 1.0, DAC_VREF_POS_INPUT) MCFG_SOUND_ROUTE(0, "dac", -1.0, DAC_VREF_NEG_INPUT)
+ MC1408(config, "dac", 0).add_route(ALL_OUTPUTS, "speaker", 0.5);
+ voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref"));
+ vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT);
+ vref.add_route(0, "dac", -1.0, DAC_VREF_NEG_INPUT);
SPEAKER(config, "speech").front_center();
- MCFG_DEVICE_ADD("hc55516", HC55516, 0)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speech", 1.00)
+ HC55516(config, m_hc55516, 0).add_route(ALL_OUTPUTS, "speech", 1.00);
PIA6821(config, m_pias, 0);
m_pias->readpa_handler().set(FUNC(s9_state::sound_r));
@@ -389,7 +390,7 @@ MACHINE_CONFIG_START(s9_state::s9)
m_pias->cb2_handler().set("hc55516", FUNC(hc55516_device::digit_w));
m_pias->irqa_handler().set_inputline("audiocpu", M6808_IRQ_LINE);
m_pias->irqa_handler().set_inputline("audiocpu", M6808_IRQ_LINE);
-MACHINE_CONFIG_END
+}
/*-----------------------------
/ Rat Race - Sys.9 (Game #527)- Prototype (displays as #500)
diff --git a/src/mame/drivers/sage2.cpp b/src/mame/drivers/sage2.cpp
index a995314c165..5190d825669 100644
--- a/src/mame/drivers/sage2.cpp
+++ b/src/mame/drivers/sage2.cpp
@@ -405,13 +405,14 @@ READ16_MEMBER(sage2_state::rom_r)
//**************************************************************************
//-------------------------------------------------
-// MACHINE_CONFIG( sage2 )
+// machine_config( sage2 )
//-------------------------------------------------
-MACHINE_CONFIG_START(sage2_state::sage2)
+void sage2_state::sage2(machine_config &config)
+{
// basic machine hardware
- MCFG_DEVICE_ADD(M68000_TAG, M68000, XTAL(16'000'000)/2)
- MCFG_DEVICE_PROGRAM_MAP(sage2_mem)
+ M68000(config, m_maincpu, XTAL(16'000'000)/2);
+ m_maincpu->set_addrmap(AS_PROGRAM, &sage2_state::sage2_mem);
// devices
PIC8259(config, m_pic, 0);
@@ -470,25 +471,27 @@ MACHINE_CONFIG_START(sage2_state::sage2)
UPD765A(config, m_fdc, 8'000'000, false, false);
m_fdc->intrq_wr_callback().set(FUNC(sage2_state::fdc_irq));
- MCFG_DEVICE_ADD(m_centronics, CENTRONICS, centronics_devices, "printer")
- MCFG_CENTRONICS_ACK_HANDLER(WRITELINE(*this, sage2_state, write_centronics_ack))
- MCFG_CENTRONICS_BUSY_HANDLER(WRITELINE(*this, sage2_state, write_centronics_busy))
- MCFG_CENTRONICS_PERROR_HANDLER(WRITELINE(*this, sage2_state, write_centronics_perror))
- MCFG_CENTRONICS_SELECT_HANDLER(WRITELINE(*this, sage2_state, write_centronics_select))
- MCFG_CENTRONICS_FAULT_HANDLER(WRITELINE(*this, sage2_state, write_centronics_fault))
+ CENTRONICS(config, m_centronics, centronics_devices, "printer");
+ m_centronics->ack_handler().set(FUNC(sage2_state::write_centronics_ack));
+ m_centronics->busy_handler().set(FUNC(sage2_state::write_centronics_busy));
+ m_centronics->perror_handler().set(FUNC(sage2_state::write_centronics_perror));
+ m_centronics->select_handler().set(FUNC(sage2_state::write_centronics_select));
+ m_centronics->fault_handler().set(FUNC(sage2_state::write_centronics_fault));
+
+ output_latch_device &cent_data_out(OUTPUT_LATCH(config, "cent_data_out"));
+ m_centronics->set_output_latch(cent_data_out);
- MCFG_CENTRONICS_OUTPUT_LATCH_ADD("cent_data_out", "centronics")
+ FLOPPY_CONNECTOR(config, UPD765_TAG ":0", sage2_floppies, "525qd", floppy_image_device::default_floppy_formats);
+ FLOPPY_CONNECTOR(config, UPD765_TAG ":1", sage2_floppies, "525qd", floppy_image_device::default_floppy_formats);
- MCFG_FLOPPY_DRIVE_ADD(UPD765_TAG ":0", sage2_floppies, "525qd", floppy_image_device::default_floppy_formats)
- MCFG_FLOPPY_DRIVE_ADD(UPD765_TAG ":1", sage2_floppies, "525qd", floppy_image_device::default_floppy_formats)
- MCFG_IEEE488_BUS_ADD()
+ IEEE488(config, m_ieee488);
// internal ram
RAM(config, RAM_TAG).set_default_size("512K");
// software list
- MCFG_SOFTWARE_LIST_ADD("flop_list", "sage2")
-MACHINE_CONFIG_END
+ SOFTWARE_LIST(config, "flop_list").set_original("sage2");
+}
diff --git a/src/mame/drivers/sam.cpp b/src/mame/drivers/sam.cpp
index 58e7bef05f8..d89aafa8f87 100644
--- a/src/mame/drivers/sam.cpp
+++ b/src/mame/drivers/sam.cpp
@@ -25,10 +25,11 @@ void sam_state::sam_map(address_map &map)
static INPUT_PORTS_START( sam )
INPUT_PORTS_END
-MACHINE_CONFIG_START(sam_state::sam)
- MCFG_DEVICE_ADD("maincpu", ARM7, XTAL(40'000'000)) // AT91R40008
- MCFG_DEVICE_PROGRAM_MAP(sam_map)
-MACHINE_CONFIG_END
+void sam_state::sam(machine_config &config)
+{
+ arm7_cpu_device &maincpu(ARM7(config, "maincpu", XTAL(40'000'000))); // AT91R40008
+ maincpu.set_addrmap(AS_PROGRAM, &sam_state::sam_map);
+}
#define ROM_LOAD_BOOT_EPROM \
ROM_REGION( 0x100000, "boot", ROMREGION_ERASEFF ) \
diff --git a/src/mame/drivers/sandscrp.cpp b/src/mame/drivers/sandscrp.cpp
index 79d78641f22..979af82096b 100644
--- a/src/mame/drivers/sandscrp.cpp
+++ b/src/mame/drivers/sandscrp.cpp
@@ -133,7 +133,7 @@ private:
INTERRUPT_GEN_MEMBER(interrupt);
void update_irq_state();
- void sandscrp(address_map &map);
+ void sandscrp_mem(address_map &map);
void sandscrp_soundmem(address_map &map);
void sandscrp_soundport(address_map &map);
};
@@ -278,7 +278,7 @@ WRITE8_MEMBER(sandscrp_state::soundlatch_w)
m_soundlatch[Latch]->write(space,0,data);
}
-void sandscrp_state::sandscrp(address_map &map)
+void sandscrp_state::sandscrp_mem(address_map &map)
{
map(0x000000, 0x07ffff).rom(); // ROM
map(0x100000, 0x100001).w(FUNC(sandscrp_state::irq_cause_w)); // IRQ Ack
@@ -467,28 +467,28 @@ GFXDECODE_END
***************************************************************************/
-MACHINE_CONFIG_START(sandscrp_state::sandscrp)
-
+void sandscrp_state::sandscrp(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M68000,12000000) /* TMP68HC000N-12 */
- MCFG_DEVICE_PROGRAM_MAP(sandscrp)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", sandscrp_state, interrupt)
+ M68000(config, m_maincpu, 12000000); /* TMP68HC000N-12 */
+ m_maincpu->set_addrmap(AS_PROGRAM, &sandscrp_state::sandscrp_mem);
+ m_maincpu->set_vblank_int("screen", FUNC(sandscrp_state::interrupt));
- MCFG_DEVICE_ADD("audiocpu", Z80,4000000) /* Z8400AB1, Reads the DSWs: it can't be disabled */
- MCFG_DEVICE_PROGRAM_MAP(sandscrp_soundmem)
- MCFG_DEVICE_IO_MAP(sandscrp_soundport)
+ Z80(config, m_audiocpu, 4000000); /* Z8400AB1, Reads the DSWs: it can't be disabled */
+ m_audiocpu->set_addrmap(AS_PROGRAM, &sandscrp_state::sandscrp_soundmem);
+ m_audiocpu->set_addrmap(AS_IO, &sandscrp_state::sandscrp_soundport);
WATCHDOG_TIMER(config, "watchdog").set_time(attotime::from_seconds(3)); /* a guess, and certainly wrong */
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME( ATTOSECONDS_IN_USEC(2500) /* not accurate */ )
- MCFG_SCREEN_SIZE(256, 256)
- MCFG_SCREEN_VISIBLE_AREA(0, 256-1, 0+16, 256-16-1)
- MCFG_SCREEN_UPDATE_DRIVER(sandscrp_state, screen_update)
- MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE(*this, sandscrp_state, screen_vblank))
- MCFG_SCREEN_PALETTE("palette")
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time( ATTOSECONDS_IN_USEC(2500) /* not accurate */ );
+ screen.set_size(256, 256);
+ screen.set_visarea(0, 256-1, 0+16, 256-16-1);
+ screen.set_screen_update(FUNC(sandscrp_state::screen_update));
+ screen.screen_vblank().set(FUNC(sandscrp_state::screen_vblank));
+ screen.set_palette("palette");
GFXDECODE(config, "gfxdecode", "palette", gfx_sandscrp);
PALETTE(config, "palette").set_format(palette_device::xGRB_555, 2048);
@@ -519,7 +519,7 @@ MACHINE_CONFIG_START(sandscrp_state::sandscrp)
ymsnd.port_a_read_callback().set_ioport("DSW1");
ymsnd.port_b_read_callback().set_ioport("DSW2");
ymsnd.add_route(ALL_OUTPUTS, "mono", 0.5);
-MACHINE_CONFIG_END
+}
/***************************************************************************
diff --git a/src/mame/drivers/sangho.cpp b/src/mame/drivers/sangho.cpp
index bd6e859f44d..91c55bbcd8a 100644
--- a/src/mame/drivers/sangho.cpp
+++ b/src/mame/drivers/sangho.cpp
@@ -477,10 +477,11 @@ void sexyboom_state::machine_reset()
}
-MACHINE_CONFIG_START(pzlestar_state::pzlestar)
- MCFG_DEVICE_ADD("maincpu", Z80, XTAL(21'477'272)/6) // ?
- MCFG_DEVICE_PROGRAM_MAP(sangho_map)
- MCFG_DEVICE_IO_MAP(pzlestar_io_map)
+void pzlestar_state::pzlestar(machine_config &config)
+{
+ Z80(config, m_maincpu, XTAL(21'477'272)/6); // ?
+ m_maincpu->set_addrmap(AS_PROGRAM, &pzlestar_state::sangho_map);
+ m_maincpu->set_addrmap(AS_IO, &pzlestar_state::pzlestar_io_map);
v9958_device &v9958(V9958(config, "v9958", XTAL(21'477'272))); // typical 9958 clock, not verified
v9958.set_screen_ntsc("screen");
@@ -489,16 +490,15 @@ MACHINE_CONFIG_START(pzlestar_state::pzlestar)
SCREEN(config, "screen", SCREEN_TYPE_RASTER);
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("ymsnd", YM2413, XTAL(21'477'272)/6)
-
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
-MACHINE_CONFIG_END
+ YM2413(config, "ymsnd", XTAL(21'477'272)/6).add_route(ALL_OUTPUTS, "mono", 1.0);
+}
-MACHINE_CONFIG_START(sexyboom_state::sexyboom)
- MCFG_DEVICE_ADD("maincpu", Z80, XTAL(21'477'272)/6)
- MCFG_DEVICE_PROGRAM_MAP(sangho_map)
- MCFG_DEVICE_IO_MAP(sexyboom_io_map)
+void sexyboom_state::sexyboom(machine_config &config)
+{
+ Z80(config, m_maincpu, XTAL(21'477'272)/6);
+ m_maincpu->set_addrmap(AS_PROGRAM, &sexyboom_state::sangho_map);
+ m_maincpu->set_addrmap(AS_IO, &sexyboom_state::sexyboom_io_map);
v9958_device &v9958(V9958(config, "v9958", XTAL(21'477'272)));
v9958.set_screen_ntsc("screen");
@@ -506,13 +506,11 @@ MACHINE_CONFIG_START(sexyboom_state::sexyboom)
v9958.int_cb().set_inputline("maincpu", 0);
SCREEN(config, "screen", SCREEN_TYPE_RASTER);
- MCFG_PALETTE_ADD("palette", 19780)
+ PALETTE(config, "palette").set_entries(19780);
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("ymsnd", YM2413, XTAL(21'477'272)/6)
-
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
-MACHINE_CONFIG_END
+ YM2413(config, "ymsnd", XTAL(21'477'272)/6).add_route(ALL_OUTPUTS, "mono", 1.0);
+}
ROM_START( pzlestar )
ROM_REGION( 0x20000*16, "user1", 0 ) // 15 sockets, 13 used
diff --git a/src/mame/drivers/sanremmg.cpp b/src/mame/drivers/sanremmg.cpp
index 6bfed308e06..68278f6de4c 100644
--- a/src/mame/drivers/sanremmg.cpp
+++ b/src/mame/drivers/sanremmg.cpp
@@ -80,22 +80,22 @@ void sanremmg_state::sanremmg_map(address_map &map)
static INPUT_PORTS_START( sanremmg )
INPUT_PORTS_END
-MACHINE_CONFIG_START(sanremmg_state::sanremmg)
-
+void sanremmg_state::sanremmg(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", ARM7, 50000000) // wrong, this is an M30624FG (M16C/62A family) with 256K internal ROM, no CPU core available
- MCFG_DEVICE_PROGRAM_MAP(sanremmg_map)
+ ARM7(config, m_maincpu, 50000000); // wrong, this is an M30624FG (M16C/62A family) with 256K internal ROM, no CPU core available
+ m_maincpu->set_addrmap(AS_PROGRAM, &sanremmg_state::sanremmg_map);
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(64*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(8*8, 48*8-1, 2*8, 30*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(sanremmg_state, screen_update_sanremmg)
- MCFG_SCREEN_PALETTE("palette")
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(64*8, 32*8);
+ screen.set_visarea(8*8, 48*8-1, 2*8, 30*8-1);
+ screen.set_screen_update(FUNC(sanremmg_state::screen_update_sanremmg));
+ screen.set_palette("palette");
PALETTE(config, "palette").set_format(palette_device::xRGB_555, 0x200);
-MACHINE_CONFIG_END
+}
/*
PCB is marked: "ELSY CE" and "2-028B" and "San Remo Games - Via Val D'OLIVI 295 - 18038 SANREMO (IM)" on component side
diff --git a/src/mame/drivers/sanremo.cpp b/src/mame/drivers/sanremo.cpp
index 74fde741300..0c0ac776889 100644
--- a/src/mame/drivers/sanremo.cpp
+++ b/src/mame/drivers/sanremo.cpp
@@ -202,15 +202,15 @@ WRITE8_MEMBER(sanremo_state::lamps_w)
{
/* LAMPS:
- 7654 3210
- ---- ---x DISCARD 1
- ---- --x- DISCARD 2
- ---- -x-- DISCARD 3
- ---- x--- DISCARD 4
- ---x ---- DISCARD 5
- --x- ---- START
- -x-- ---- BET
- x--- ---- (always on)
+ 7654 3210
+ ---- ---x DISCARD 1
+ ---- --x- DISCARD 2
+ ---- -x-- DISCARD 3
+ ---- x--- DISCARD 4
+ ---x ---- DISCARD 5
+ --x- ---- START
+ -x-- ---- BET
+ x--- ---- (always on)
*/
for (int n = 0; n < 7; n++)
m_lamps[n] = BIT(data, n);
@@ -220,9 +220,9 @@ WRITE8_MEMBER(sanremo_state::banksel_w)
{
/* GFX banks selector.
- 7654 3210
- ---x xxxx GFX banks selector
- xxx- ---- unknown
+ 7654 3210
+ ---x xxxx GFX banks selector
+ xxx- ---- unknown
*/
m_banksel = data & 0x1f;
}
@@ -355,24 +355,24 @@ GFXDECODE_END
* Machine Drivers *
*********************************************/
-MACHINE_CONFIG_START(sanremo_state::sanremo)
-
+void sanremo_state::sanremo(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, CPU_CLOCK)
- MCFG_DEVICE_PROGRAM_MAP(sanremo_map)
- MCFG_DEVICE_IO_MAP(sanremo_portmap)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", sanremo_state, irq0_line_hold)
+ Z80(config, m_maincpu, CPU_CLOCK);
+ m_maincpu->set_addrmap(AS_PROGRAM, &sanremo_state::sanremo_map);
+ m_maincpu->set_addrmap(AS_IO, &sanremo_state::sanremo_portmap);
+ m_maincpu->set_vblank_int("screen", FUNC(sanremo_state::irq0_line_hold));
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(70*8, 41*8)
- MCFG_SCREEN_VISIBLE_AREA(0, 48*8-1, 0, 38*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(sanremo_state, screen_update)
- MCFG_SCREEN_PALETTE("palette")
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(70*8, 41*8);
+ screen.set_visarea(0, 48*8-1, 0, 38*8-1);
+ screen.set_screen_update(FUNC(sanremo_state::screen_update));
+ screen.set_palette("palette");
mc6845_device &crtc(MC6845(config, "crtc", CRTC_CLOCK));
// *** MC6845 init ***
@@ -391,7 +391,7 @@ MACHINE_CONFIG_START(sanremo_state::sanremo)
ay8910_device &ay8910(AY8910(config, "ay8910", SND_CLOCK));
ay8910.port_a_read_callback().set_ioport("DSW");
ay8910.add_route(ALL_OUTPUTS, "mono", 1.00);
-MACHINE_CONFIG_END
+}
/*********************************************
diff --git a/src/mame/drivers/sansa_fuze.cpp b/src/mame/drivers/sansa_fuze.cpp
index b82788b4909..c2b6c65a6c8 100644
--- a/src/mame/drivers/sansa_fuze.cpp
+++ b/src/mame/drivers/sansa_fuze.cpp
@@ -43,13 +43,12 @@ static INPUT_PORTS_START( sansa_fuze )
INPUT_PORTS_END
-MACHINE_CONFIG_START(sansa_fuze_state::sansa_fuze)
-
+void sansa_fuze_state::sansa_fuze(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", ARM7, 50000000) // arm based, speed unknown
- MCFG_DEVICE_PROGRAM_MAP(sansa_fuze_map)
-
-MACHINE_CONFIG_END
+ ARM7(config, m_maincpu, 50000000); // arm based, speed unknown
+ m_maincpu->set_addrmap(AS_PROGRAM, &sansa_fuze_state::sansa_fuze_map);
+}
ROM_START( sanfuze2 )
ROM_REGION(0x20000, "maincpu", 0 )
diff --git a/src/mame/drivers/sapi1.cpp b/src/mame/drivers/sapi1.cpp
index e837307202e..f1bee7576da 100644
--- a/src/mame/drivers/sapi1.cpp
+++ b/src/mame/drivers/sapi1.cpp
@@ -37,6 +37,7 @@ ZPS stands for "Základní Počítačová Sestava" (basic computer system).
//#include "cpu/z80/z80.h"
#include "bus/rs232/rs232.h"
#include "machine/ay31015.h"
+#include "machine/clock.h"
#include "machine/keyboard.h"
#include "machine/ram.h"
#include "video/mc6845.h"
@@ -57,6 +58,7 @@ public:
m_line4(*this, "LINE4"),
m_maincpu(*this, "maincpu"),
m_uart(*this, "uart"),
+ m_uart_clock(*this, "uart_clock"),
m_v24(*this, "v24"),
m_palette(*this, "palette")
{
@@ -115,6 +117,7 @@ private:
required_ioport m_line4;
required_device<cpu_device> m_maincpu;
optional_device<ay31015_device> m_uart;
+ optional_device<clock_device> m_uart_clock;
optional_device<rs232_port_device> m_v24;
optional_device<palette_device> m_palette;
@@ -623,26 +626,27 @@ void sapi1_state::init_sapizps3b()
/* Machine driver */
-MACHINE_CONFIG_START(sapi1_state::sapi1)
+void sapi1_state::sapi1(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD(m_maincpu, I8080A, XTAL(18'000'000) / 9) // Tesla MHB8080A + MHB8224 + MHB8228
- MCFG_DEVICE_PROGRAM_MAP(sapi1_mem)
+ I8080A(config, m_maincpu, 18_MHz_XTAL / 9); // Tesla MHB8080A + MHB8224 + MHB8228
+ m_maincpu->set_addrmap(AS_PROGRAM, &sapi1_state::sapi1_mem);
MCFG_MACHINE_RESET_OVERRIDE(sapi1_state, sapi1)
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(50)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */
- MCFG_SCREEN_SIZE(40*6, 24*9)
- MCFG_SCREEN_VISIBLE_AREA(0, 40*6-1, 0, 24*9-1)
- MCFG_SCREEN_UPDATE_DRIVER(sapi1_state, screen_update_sapi1)
- MCFG_SCREEN_PALETTE(m_palette)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(50);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */
+ screen.set_size(40*6, 24*9);
+ screen.set_visarea(0, 40*6-1, 0, 24*9-1);
+ screen.set_screen_update(FUNC(sapi1_state::screen_update_sapi1));
+ screen.set_palette(m_palette);
PALETTE(config, m_palette, palette_device::MONOCHROME);
/* internal ram */
RAM(config, RAM_TAG).set_default_size("64K");
-MACHINE_CONFIG_END
+}
void sapi1_state::sapi2(machine_config &config)
{
@@ -654,25 +658,26 @@ void sapi1_state::sapi2(machine_config &config)
keyboard.set_keyboard_callback(FUNC(sapi1_state::kbd_put));
}
-MACHINE_CONFIG_START(sapi1_state::sapi3)
+void sapi1_state::sapi3(machine_config &config)
+{
sapi2(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(sapi3_mem)
- MCFG_DEVICE_IO_MAP(sapi3_io)
+ m_maincpu->set_addrmap(AS_PROGRAM, &sapi1_state::sapi3_mem);
+ m_maincpu->set_addrmap(AS_IO, &sapi1_state::sapi3_io);
MCFG_MACHINE_RESET_OVERRIDE(sapi1_state, sapizps3 )
- MCFG_SCREEN_MODIFY("screen")
- MCFG_SCREEN_SIZE(40*6, 20*9)
- MCFG_SCREEN_VISIBLE_AREA(0, 40*6-1, 0, 20*9-1)
- MCFG_SCREEN_UPDATE_DRIVER(sapi1_state, screen_update_sapi3)
-MACHINE_CONFIG_END
-MACHINE_CONFIG_START(sapi1_state::sapi3b)
+ screen_device &screen(*subdevice<screen_device>("screen"));
+ screen.set_size(40*6, 20*9);
+ screen.set_visarea(0, 40*6-1, 0, 20*9-1);
+ screen.set_screen_update(FUNC(sapi1_state::screen_update_sapi3));
+}
+
+void sapi1_state::sapi3b(machine_config &config)
+{
sapi3(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(sapi3b_mem)
- MCFG_DEVICE_IO_MAP(sapi3b_io)
+ m_maincpu->set_addrmap(AS_PROGRAM, &sapi1_state::sapi3b_mem);
+ m_maincpu->set_addrmap(AS_IO, &sapi1_state::sapi3b_io);
mc6845_device &crtc(MC6845(config, "crtc", 1008000)); // guess
crtc.set_screen("screen");
@@ -680,10 +685,9 @@ MACHINE_CONFIG_START(sapi1_state::sapi3b)
crtc.set_char_width(6);
crtc.set_update_row_callback(FUNC(sapi1_state::crtc_update_row), this);
- MCFG_SCREEN_MODIFY("screen")
- MCFG_SCREEN_UPDATE_DEVICE("crtc", mc6845_device, screen_update)
- MCFG_SCREEN_NO_PALETTE
-MACHINE_CONFIG_END
+ subdevice<screen_device>("screen")->set_screen_update("crtc", FUNC(mc6845_device::screen_update));
+ subdevice<screen_device>("screen")->set_palette(finder_base::DUMMY_TAG);
+}
static DEVICE_INPUT_DEFAULTS_START( terminal )
DEVICE_INPUT_DEFAULTS( "RS232_RXBAUD", 0xff, RS232_BAUD_9600 )
@@ -694,28 +698,29 @@ static DEVICE_INPUT_DEFAULTS_START( terminal )
DEVICE_INPUT_DEFAULTS( "RS232_STOPBITS", 0xff, RS232_STOPBITS_1 )
DEVICE_INPUT_DEFAULTS_END
-MACHINE_CONFIG_START(sapi1_state::sapi3a)
+void sapi1_state::sapi3a(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", I8080A, XTAL(18'000'000) / 9) // Tesla MHB8080A + MHB8224 + MHB8228
- MCFG_DEVICE_PROGRAM_MAP(sapi3a_mem)
- MCFG_DEVICE_IO_MAP(sapi3a_io)
+ I8080A(config, m_maincpu, 18_MHz_XTAL / 9); // Tesla MHB8080A + MHB8224 + MHB8228
+ m_maincpu->set_addrmap(AS_PROGRAM, &sapi1_state::sapi3a_mem);
+ m_maincpu->set_addrmap(AS_IO, &sapi1_state::sapi3a_io);
MCFG_MACHINE_RESET_OVERRIDE(sapi1_state, sapizps3 )
/* video hardware */
AY51013(config, m_uart); // Tesla MHB1012
- m_uart->set_tx_clock(XTAL(12'288'000) / 80); // not actual rate?
- m_uart->set_rx_clock(XTAL(12'288'000) / 80); // not actual rate?
m_uart->read_si_callback().set(m_v24, FUNC(rs232_port_device::rxd_r));
m_uart->write_so_callback().set(m_v24, FUNC(rs232_port_device::write_txd));
m_uart->set_auto_rdav(true); // RDAV not actually tied to RDE, but pulsed by K155AG3 (=74123N): R25=22k, C14=220
+ CLOCK(config, m_uart_clock, 12.288_MHz_XTAL / 80); // TODO: divider selectable by jumpers
+ m_uart_clock->signal_handler().set(m_uart, FUNC(ay51013_device::write_tcp));
+ m_uart_clock->signal_handler().append(m_uart, FUNC(ay51013_device::write_rcp));
+
RS232_PORT(config, m_v24, default_rs232_devices, "terminal").set_option_device_input_defaults("terminal", DEVICE_INPUT_DEFAULTS_NAME(terminal));
/* internal ram */
RAM(config, RAM_TAG).set_default_size("64K");
-MACHINE_CONFIG_END
-
-
+}
/**************************************
diff --git a/src/mame/drivers/sartorius.cpp b/src/mame/drivers/sartorius.cpp
index d455c705050..17df80470e4 100644
--- a/src/mame/drivers/sartorius.cpp
+++ b/src/mame/drivers/sartorius.cpp
@@ -87,12 +87,13 @@ private:
}
-MACHINE_CONFIG_START(sart3733_state::sart3733)
+void sart3733_state::sart3733(machine_config &config)
+{
i4040_cpu_device &cpu(I4040(config, "maincpu", 750'000)); // clock speed is a complete guess - can't see crystal or multi-phase clock generator
cpu.set_rom_map(&sart3733_state::sart3733_rom);
cpu.set_ram_memory_map(&sart3733_state::sart3733_memory);
cpu.set_ram_status_map(&sart3733_state::sart3733_status);
-MACHINE_CONFIG_END
+}
INPUT_PORTS_START(sart3733)
diff --git a/src/mame/drivers/saturn.cpp b/src/mame/drivers/saturn.cpp
index b4ddb342e4c..b8bd86cd579 100644
--- a/src/mame/drivers/saturn.cpp
+++ b/src/mame/drivers/saturn.cpp
@@ -874,48 +874,44 @@ static void saturn_cart(device_slot_interface &device)
}
-MACHINE_CONFIG_START(sat_console_state::saturnus)
+void sat_console_state::saturnus(machine_config &config)
+{
saturn(config);
- MCFG_DEVICE_ADD("saturn_cdb", SATURN_CDB, 16000000)
-
- MCFG_SOFTWARE_LIST_ADD("cd_list","saturn")
- MCFG_SOFTWARE_LIST_FILTER("cd_list","NTSC-U")
+ SATURN_CDB(config, "saturn_cdb", 16000000);
- MCFG_SATURN_CARTRIDGE_ADD("exp", saturn_cart, nullptr)
- MCFG_SOFTWARE_LIST_ADD("cart_list","sat_cart")
+ SOFTWARE_LIST(config, "cd_list").set_original("saturn").set_filter("NTSC-U");
- MCFG_DEVICE_MODIFY("smpc")
- downcast<smpc_hle_device &>(*device).set_region_code(4);
+ SATURN_CART_SLOT(config, "exp", saturn_cart, nullptr);
+ SOFTWARE_LIST(config, "cart_list").set_original("sat_cart");
-MACHINE_CONFIG_END
+ m_smpc_hle->set_region_code(4);
+}
-MACHINE_CONFIG_START(sat_console_state::saturneu)
+void sat_console_state::saturneu(machine_config &config)
+{
saturn(config);
- MCFG_DEVICE_ADD("saturn_cdb", SATURN_CDB, 16000000)
+ SATURN_CDB(config, "saturn_cdb", 16000000);
- MCFG_SOFTWARE_LIST_ADD("cd_list","saturn")
- MCFG_SOFTWARE_LIST_FILTER("cd_list","PAL")
+ SOFTWARE_LIST(config, "cd_list").set_original("saturn").set_filter("PAL");
- MCFG_SATURN_CARTRIDGE_ADD("exp", saturn_cart, nullptr)
- MCFG_SOFTWARE_LIST_ADD("cart_list","sat_cart")
+ SATURN_CART_SLOT(config, "exp", saturn_cart, nullptr);
+ SOFTWARE_LIST(config, "cart_list").set_original("sat_cart");
- MCFG_DEVICE_MODIFY("smpc")
- downcast<smpc_hle_device &>(*device).set_region_code(12);
-MACHINE_CONFIG_END
+ m_smpc_hle->set_region_code(12);
+}
-MACHINE_CONFIG_START(sat_console_state::saturnjp)
+void sat_console_state::saturnjp(machine_config &config)
+{
saturn(config);
- MCFG_DEVICE_ADD("saturn_cdb", SATURN_CDB, 16000000)
+ SATURN_CDB(config, "saturn_cdb", 16000000);
- MCFG_SOFTWARE_LIST_ADD("cd_list","saturn")
- MCFG_SOFTWARE_LIST_FILTER("cd_list","NTSC-J")
+ SOFTWARE_LIST(config, "cd_list").set_original("saturn").set_filter("NTSC-J");
- MCFG_SATURN_CARTRIDGE_ADD("exp", saturn_cart, nullptr)
- MCFG_SOFTWARE_LIST_ADD("cart_list","sat_cart")
+ SATURN_CART_SLOT(config, "exp", saturn_cart, nullptr);
+ SOFTWARE_LIST(config, "cart_list").set_original("sat_cart");
- MCFG_DEVICE_MODIFY("smpc")
- downcast<smpc_hle_device &>(*device).set_region_code(1);
-MACHINE_CONFIG_END
+ m_smpc_hle->set_region_code(1);
+}
void sat_console_state::saturn_init_driver(int rgn)
diff --git a/src/mame/drivers/sauro.cpp b/src/mame/drivers/sauro.cpp
index f36aa333811..fa40c602acc 100644
--- a/src/mame/drivers/sauro.cpp
+++ b/src/mame/drivers/sauro.cpp
@@ -446,10 +446,10 @@ static GFXDECODE_START( gfx_trckydoc )
GFXDECODE_END
-MACHINE_CONFIG_START(sauro_state::tecfri)
-
+void sauro_state::tecfri(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, XTAL(20'000'000)/4) /* verified on pcb */
+ Z80(config, m_maincpu, XTAL(20'000'000)/4); /* verified on pcb */
LS259(config, m_mainlatch);
m_mainlatch->q_out_cb<4>().set(FUNC(sauro_state::irq_reset_w));
@@ -459,48 +459,44 @@ MACHINE_CONFIG_START(sauro_state::tecfri)
WATCHDOG_TIMER(config, "watchdog");
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(55.72) /* verified on pcb */
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(5000)) // frames per second, vblank duration (otherwise sprites lag)
- MCFG_SCREEN_SIZE(32 * 8, 32 * 8)
- MCFG_SCREEN_VISIBLE_AREA(1 * 8, 31 * 8 - 1, 2 * 8, 30 * 8 - 1)
- MCFG_SCREEN_PALETTE(m_palette)
- MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE(*this, sauro_state, vblank_irq))
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(55.72); /* verified on pcb */
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(5000)); // frames per second, vblank duration (otherwise sprites lag)
+ screen.set_size(32 * 8, 32 * 8);
+ screen.set_visarea(1 * 8, 31 * 8 - 1, 2 * 8, 30 * 8 - 1);
+ screen.set_palette(m_palette);
+ screen.screen_vblank().set(FUNC(sauro_state::vblank_irq));
PALETTE(config, m_palette, palette_device::RGB_444_PROMS, "proms", 1024);
/* sound hardware */
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("ymsnd", YM3812, XTAL(20'000'000)/8) /* verified on pcb */
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
-
-MACHINE_CONFIG_END
+ YM3812(config, "ymsnd", XTAL(20'000'000)/8).add_route(ALL_OUTPUTS, "mono", 1.0); /* verified on pcb */
+}
-MACHINE_CONFIG_START(sauro_state::trckydoc)
+void sauro_state::trckydoc(machine_config &config)
+{
tecfri(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(trckydoc_map)
+ m_maincpu->set_addrmap(AS_PROGRAM, &sauro_state::trckydoc_map);
m_mainlatch->q_out_cb<1>().set(FUNC(sauro_state::flip_screen_w));
m_mainlatch->q_out_cb<2>().set(FUNC(sauro_state::coin1_w));
m_mainlatch->q_out_cb<3>().set(FUNC(sauro_state::coin2_w));
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_trckydoc)
+ GFXDECODE(config, m_gfxdecode, m_palette, gfx_trckydoc);
MCFG_VIDEO_START_OVERRIDE(sauro_state,trckydoc)
- MCFG_SCREEN_MODIFY("screen")
- MCFG_SCREEN_UPDATE_DRIVER(sauro_state, screen_update_trckydoc)
-
-MACHINE_CONFIG_END
+ subdevice<screen_device>("screen")->set_screen_update(FUNC(sauro_state::screen_update_trckydoc));
+}
-MACHINE_CONFIG_START(sauro_state::sauro)
+void sauro_state::sauro(machine_config &config)
+{
tecfri(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(sauro_map)
- MCFG_DEVICE_IO_MAP(sauro_io_map)
+ m_maincpu->set_addrmap(AS_PROGRAM, &sauro_state::sauro_map);
+ m_maincpu->set_addrmap(AS_IO, &sauro_state::sauro_io_map);
// Z3
m_mainlatch->q_out_cb<0>().set(FUNC(sauro_state::flip_screen_w));
@@ -510,36 +506,33 @@ MACHINE_CONFIG_START(sauro_state::sauro)
m_mainlatch->q_out_cb<5>().set(FUNC(sauro_state::sauro_palette_bank0_w));
m_mainlatch->q_out_cb<6>().set(FUNC(sauro_state::sauro_palette_bank1_w));
- MCFG_DEVICE_ADD("audiocpu", Z80, XTAL(20'000'000) / 5) /* verified on pcb */
- MCFG_DEVICE_PROGRAM_MAP(sauro_sound_map)
- MCFG_DEVICE_PERIODIC_INT_DRIVER(sauro_state, irq0_line_hold, 8 * 60) // ?
+ z80_device &audiocpu(Z80(config, "audiocpu", XTAL(20'000'000) / 5)); /* verified on pcb */
+ audiocpu.set_addrmap(AS_PROGRAM, &sauro_state::sauro_sound_map);
+ audiocpu.set_periodic_int(FUNC(sauro_state::irq0_line_hold), attotime::from_hz(8 * 60)); // ?
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_sauro)
+ GFXDECODE(config, m_gfxdecode, m_palette, gfx_sauro);
MCFG_VIDEO_START_OVERRIDE(sauro_state, sauro)
- MCFG_SCREEN_MODIFY("screen")
- MCFG_SCREEN_UPDATE_DRIVER(sauro_state, screen_update_sauro)
+ subdevice<screen_device>("screen")->set_screen_update(FUNC(sauro_state::screen_update_sauro));
GENERIC_LATCH_8(config, m_soundlatch);
- MCFG_DEVICE_MODIFY("ymsnd")
- MCFG_DEVICE_CLOCK(XTAL(20'000'000) / 5) /* verified on pcb */
+ subdevice<ym3812_device>("ymsnd")->set_clock(XTAL(20'000'000) / 5); /* verified on pcb */
SP0256(config, m_sp0256, XTAL(20'000'000) / 5); /* verified on pcb */
m_sp0256->data_request_callback().set_inputline("audiocpu", INPUT_LINE_NMI);
m_sp0256->add_route(ALL_OUTPUTS, "mono", 1.0);
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(sauro_state::saurob)
+void sauro_state::saurob(machine_config &config)
+{
sauro(config);
- MCFG_DEVICE_MODIFY("audiocpu")
- MCFG_DEVICE_PROGRAM_MAP(saurob_sound_map)
+ subdevice<z80_device>("audiocpu")->set_addrmap(AS_PROGRAM, &sauro_state::saurob_sound_map);
/* sound hardware */
- MCFG_DEVICE_REMOVE("speech")
-
-MACHINE_CONFIG_END
+ config.device_remove("speech");
+}
/***************************************************************************
diff --git a/src/mame/drivers/savquest.cpp b/src/mame/drivers/savquest.cpp
index 183f9d1a550..770b38343da 100644
--- a/src/mame/drivers/savquest.cpp
+++ b/src/mame/drivers/savquest.cpp
@@ -813,14 +813,13 @@ void savquest_isa16_cards(device_slot_interface &device)
}
MACHINE_CONFIG_START(savquest_state::savquest)
- MCFG_DEVICE_ADD("maincpu", PENTIUM2, 450000000) // actually Pentium II 450
- MCFG_DEVICE_PROGRAM_MAP(savquest_map)
- MCFG_DEVICE_IO_MAP(savquest_io)
- MCFG_DEVICE_IRQ_ACKNOWLEDGE_DEVICE("pic8259_1", pic8259_device, inta_cb)
+ PENTIUM2(config, m_maincpu, 450000000); // actually Pentium II 450
+ m_maincpu->set_addrmap(AS_PROGRAM, &savquest_state::savquest_map);
+ m_maincpu->set_addrmap(AS_IO, &savquest_state::savquest_io);
+ m_maincpu->set_irq_acknowledge_callback("pic8259_1", FUNC(pic8259_device::inta_cb));
pcat_common(config);
- MCFG_DEVICE_REMOVE("rtc")
- MCFG_DS12885_ADD("rtc")
+ DS12885(config.replace(), "rtc");
MCFG_PCI_BUS_LEGACY_ADD("pcibus", 0)
MCFG_PCI_BUS_LEGACY_DEVICE(0, DEVICE_SELF, savquest_state, intel82439tx_pci_r, intel82439tx_pci_w)
@@ -836,18 +835,19 @@ MACHINE_CONFIG_START(savquest_state::savquest)
/* sound hardware */
isa16_device &isa(ISA16(config, "isa", 0)); // FIXME: determine ISA bus clock
- isa.set_cputag("maincpu");
- MCFG_DEVICE_ADD("isa1", ISA16_SLOT, 0, "isa", savquest_isa16_cards, "sb16", false)
+ isa.set_memspace("maincpu", AS_PROGRAM);
+ isa.set_iospace("maincpu", AS_IO);
+ ISA16_SLOT(config, "isa1", 0, "isa", savquest_isa16_cards, "sb16", false);
/* video hardware */
pcvideo_s3_vga(config);
- MCFG_DEVICE_ADD("voodoo", VOODOO_2, STD_VOODOO_2_CLOCK)
- MCFG_VOODOO_FBMEM(4)
- MCFG_VOODOO_TMUMEM(4,4) /* this is the 12Mb card */
- MCFG_VOODOO_SCREEN_TAG("screen")
- MCFG_VOODOO_CPU_TAG("maincpu")
- MCFG_VOODOO_VBLANK_CB(WRITELINE(*this, savquest_state,vblank_assert))
+ VOODOO_2(config, m_voodoo, STD_VOODOO_2_CLOCK);
+ m_voodoo->set_fbmem(4);
+ m_voodoo->set_tmumem(4, 4); /* this is the 12Mb card */
+ m_voodoo->set_screen_tag("screen");
+ m_voodoo->set_cpu_tag(m_maincpu);
+ m_voodoo->vblank_callback().set(FUNC(savquest_state::vblank_assert));
MACHINE_CONFIG_END
ROM_START( savquest )
diff --git a/src/mame/drivers/sbasketb.cpp b/src/mame/drivers/sbasketb.cpp
index 149426546b1..478c314e5fe 100644
--- a/src/mame/drivers/sbasketb.cpp
+++ b/src/mame/drivers/sbasketb.cpp
@@ -192,14 +192,14 @@ WRITE_LINE_MEMBER(sbasketb_state::vblank_irq)
m_maincpu->set_input_line(0, HOLD_LINE);
}
-MACHINE_CONFIG_START(sbasketb_state::sbasketb)
-
+void sbasketb_state::sbasketb(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD(m_maincpu, KONAMI1, 1400000) /* 1.400 MHz ??? */
- MCFG_DEVICE_PROGRAM_MAP(sbasketb_map)
+ KONAMI1(config, m_maincpu, 1400000); /* 1.400 MHz ??? */
+ m_maincpu->set_addrmap(AS_PROGRAM, &sbasketb_state::sbasketb_map);
- MCFG_DEVICE_ADD(m_audiocpu, Z80, XTAL(14'318'181) / 4) /* 3.5795 MHz */
- MCFG_DEVICE_PROGRAM_MAP(sbasketb_sound_map)
+ Z80(config, m_audiocpu, XTAL(14'318'181) / 4); /* 3.5795 MHz */
+ m_audiocpu->set_addrmap(AS_PROGRAM, &sbasketb_state::sbasketb_sound_map);
ls259_device &mainlatch(LS259(config, "mainlatch")); // B3
mainlatch.q_out_cb<0>().set(FUNC(sbasketb_state::flipscreen_w)); // FLIP
@@ -213,14 +213,14 @@ MACHINE_CONFIG_START(sbasketb_state::sbasketb)
WATCHDOG_TIMER(config, "watchdog");
/* video hardware */
- MCFG_SCREEN_ADD(m_screen, RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(32*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(sbasketb_state, screen_update_sbasketb)
- MCFG_SCREEN_PALETTE(m_palette)
- MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE(*this, sbasketb_state, vblank_irq))
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_refresh_hz(60);
+ m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ m_screen->set_size(32*8, 32*8);
+ m_screen->set_visarea(0*8, 32*8-1, 2*8, 30*8-1);
+ m_screen->set_screen_update(FUNC(sbasketb_state::screen_update_sbasketb));
+ m_screen->set_palette(m_palette);
+ m_screen->screen_vblank().set(FUNC(sbasketb_state::vblank_irq));
GFXDECODE(config, m_gfxdecode, m_palette, gfx_sbasketb);
PALETTE(config, m_palette, FUNC(sbasketb_state::sbasketb_palette), 16*16+16*16*16, 256);
@@ -230,24 +230,24 @@ MACHINE_CONFIG_START(sbasketb_state::sbasketb)
GENERIC_LATCH_8(config, "soundlatch");
- MCFG_DEVICE_ADD(m_soundbrd, TRACKFLD_AUDIO, 0, m_audiocpu, m_vlm)
+ TRACKFLD_AUDIO(config, m_soundbrd, 0, m_audiocpu, m_vlm);
- MCFG_DEVICE_ADD(m_dac, DAC_8BIT_R2R, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 0.4) // unknown DAC
- MCFG_DEVICE_ADD("vref", VOLTAGE_REGULATOR, 0) MCFG_VOLTAGE_REGULATOR_OUTPUT(5.0)
- MCFG_SOUND_ROUTE(0, "dac", 1.0, DAC_VREF_POS_INPUT) MCFG_SOUND_ROUTE(0, "dac", -1.0, DAC_VREF_NEG_INPUT)
+ DAC_8BIT_R2R(config, m_dac, 0).add_route(ALL_OUTPUTS, "speaker", 0.4); // unknown DAC
+ voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref"));
+ vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT);
+ vref.add_route(0, "dac", -1.0, DAC_VREF_NEG_INPUT);
- MCFG_DEVICE_ADD(m_sn, SN76489, XTAL(14'318'181) / 8)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 1.0)
+ SN76489(config, m_sn, XTAL(14'318'181) / 8).add_route(ALL_OUTPUTS, "speaker", 1.0);
- MCFG_DEVICE_ADD(m_vlm, VLM5030, XTAL(3'579'545)) /* Schematics say 3.58MHz, but board uses 3.579545MHz xtal */
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 1.0)
-MACHINE_CONFIG_END
+ VLM5030(config, m_vlm, XTAL(3'579'545)).add_route(ALL_OUTPUTS, "speaker", 1.0); /* Schematics say 3.58MHz, but board uses 3.579545MHz xtal */
+}
-MACHINE_CONFIG_START(sbasketb_state::sbasketbu)
+void sbasketb_state::sbasketbu(machine_config &config)
+{
sbasketb(config);
- MCFG_DEVICE_REPLACE(m_maincpu, MC6809E, 1400000) /* 6809E at 1.400 MHz ??? */
- MCFG_DEVICE_PROGRAM_MAP(sbasketb_map)
-MACHINE_CONFIG_END
+ MC6809E(config.replace(), m_maincpu, 1400000); /* 6809E at 1.400 MHz ??? */
+ m_maincpu->set_addrmap(AS_PROGRAM, &sbasketb_state::sbasketb_map);
+}
diff --git a/src/mame/drivers/sbc6510.cpp b/src/mame/drivers/sbc6510.cpp
index 6abb7f840ce..10ef94c8412 100644
--- a/src/mame/drivers/sbc6510.cpp
+++ b/src/mame/drivers/sbc6510.cpp
@@ -221,7 +221,7 @@ READ8_MEMBER( sbc6510_state::a2_r )
WRITE8_MEMBER( sbc6510_state::a2_w )
{
m_2 = data;
- m_terminal->write(space, 0, data);
+ m_terminal->write(data);
}
void sbc6510_state::machine_start()
diff --git a/src/mame/drivers/sbowling.cpp b/src/mame/drivers/sbowling.cpp
index cbdb28da395..dd915396b75 100644
--- a/src/mame/drivers/sbowling.cpp
+++ b/src/mame/drivers/sbowling.cpp
@@ -412,21 +412,22 @@ void sbowling_state::sbowling_palette(palette_device &palette) const
}
}
-MACHINE_CONFIG_START(sbowling_state::sbowling)
- MCFG_DEVICE_ADD("maincpu", I8080, XTAL(19'968'000)/10) /* ? */
- MCFG_DEVICE_PROGRAM_MAP(main_map)
- MCFG_DEVICE_IO_MAP(port_map)
- MCFG_TIMER_DRIVER_ADD_SCANLINE("scantimer", sbowling_state, interrupt, "screen", 0, 1)
+void sbowling_state::sbowling(machine_config &config)
+{
+ I8080(config, m_maincpu, XTAL(19'968'000)/10); /* ? */
+ m_maincpu->set_addrmap(AS_PROGRAM, &sbowling_state::main_map);
+ m_maincpu->set_addrmap(AS_IO, &sbowling_state::port_map);
+ TIMER(config, "scantimer").configure_scanline(FUNC(sbowling_state::interrupt), "screen", 0, 1);
WATCHDOG_TIMER(config, "watchdog");
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_SIZE(32*8, 262) /* vert size taken from mw8080bw */
- MCFG_SCREEN_VISIBLE_AREA(1*8, 31*8-1, 4*8, 32*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(sbowling_state, screen_update)
- MCFG_SCREEN_PALETTE("palette")
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_size(32*8, 262); /* vert size taken from mw8080bw */
+ screen.set_visarea(1*8, 31*8-1, 4*8, 32*8-1);
+ screen.set_screen_update(FUNC(sbowling_state::screen_update));
+ screen.set_palette("palette");
GFXDECODE(config, m_gfxdecode, "palette", gfx_sbowling);
@@ -436,7 +437,7 @@ MACHINE_CONFIG_START(sbowling_state::sbowling)
SPEAKER(config, "mono").front_center();
AY8910(config, "aysnd", XTAL(19'968'000)/16).add_route(ALL_OUTPUTS, "mono", 0.33); /* ? */
-MACHINE_CONFIG_END
+}
ROM_START( sbowling )
ROM_REGION( 0x10000, "maincpu", 0 )
diff --git a/src/mame/drivers/sbrain.cpp b/src/mame/drivers/sbrain.cpp
index 647b624d74c..b197ddea568 100644
--- a/src/mame/drivers/sbrain.cpp
+++ b/src/mame/drivers/sbrain.cpp
@@ -672,21 +672,23 @@ u32 sbrain_state::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, con
return 0;
}
-MACHINE_CONFIG_START(sbrain_state::sbrain)
+void sbrain_state::sbrain(machine_config &config)
+{
// basic machine hardware
- MCFG_DEVICE_ADD("maincpu", Z80, 16_MHz_XTAL / 4)
- MCFG_DEVICE_PROGRAM_MAP(sbrain_mem)
- MCFG_DEVICE_IO_MAP(sbrain_io)
+ Z80(config, m_maincpu, 16_MHz_XTAL / 4);
+ m_maincpu->set_addrmap(AS_PROGRAM, &sbrain_state::sbrain_mem);
+ m_maincpu->set_addrmap(AS_IO, &sbrain_state::sbrain_io);
- MCFG_DEVICE_ADD("subcpu", Z80, 16_MHz_XTAL / 4)
- MCFG_DEVICE_PROGRAM_MAP(sbrain_submem)
- MCFG_DEVICE_IO_MAP(sbrain_subio)
+ Z80(config, m_subcpu, 16_MHz_XTAL / 4);
+ m_subcpu->set_addrmap(AS_PROGRAM, &sbrain_state::sbrain_submem);
+ m_subcpu->set_addrmap(AS_IO, &sbrain_state::sbrain_subio);
RAM(config, m_ram).set_default_size("64K").set_extra_options("32K");
/* video hardware */
- MCFG_SCREEN_ADD_MONOCHROME("screen", RASTER, rgb_t::amber())
- MCFG_SCREEN_UPDATE_DRIVER(sbrain_state, screen_update)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_color(rgb_t::amber());
+ screen.set_screen_update(FUNC(sbrain_state::screen_update));
DP8350(config, m_crtc, 10.92_MHz_XTAL).set_screen("screen"); // XTAL not directly connected
m_crtc->character_generator_program(1);
@@ -733,26 +735,27 @@ MACHINE_CONFIG_START(sbrain_state::sbrain)
FD1791(config, m_fdc, 16_MHz_XTAL / 16);
m_fdc->set_force_ready(true);
- MCFG_FLOPPY_DRIVE_ADD("fdc:0", sbrain_floppies, "525dd", floppy_image_device::default_floppy_formats)
- MCFG_FLOPPY_DRIVE_SOUND(true)
- MCFG_FLOPPY_DRIVE_ADD("fdc:1", sbrain_floppies, "525dd", floppy_image_device::default_floppy_formats)
- MCFG_FLOPPY_DRIVE_SOUND(true)
- MCFG_FLOPPY_DRIVE_ADD("fdc:2", sbrain_floppies, nullptr, floppy_image_device::default_floppy_formats)
- MCFG_FLOPPY_DRIVE_SOUND(true)
- MCFG_FLOPPY_DRIVE_ADD("fdc:3", sbrain_floppies, nullptr, floppy_image_device::default_floppy_formats)
- MCFG_FLOPPY_DRIVE_SOUND(true)
-
- MCFG_TIMER_DRIVER_ADD_PERIODIC("timer_a", sbrain_state, kbd_scan, attotime::from_hz(15))
-MACHINE_CONFIG_END
+
+ FLOPPY_CONNECTOR(config, "fdc:0", sbrain_floppies, "525dd", floppy_image_device::default_floppy_formats).enable_sound(true);
+ FLOPPY_CONNECTOR(config, "fdc:1", sbrain_floppies, "525dd", floppy_image_device::default_floppy_formats).enable_sound(true);
+ FLOPPY_CONNECTOR(config, "fdc:2", sbrain_floppies, nullptr, floppy_image_device::default_floppy_formats).enable_sound(true);
+ FLOPPY_CONNECTOR(config, "fdc:3", sbrain_floppies, nullptr, floppy_image_device::default_floppy_formats).enable_sound(true);
+
+ TIMER(config, "timer_a", 0).configure_periodic(timer_device::expired_delegate(FUNC(sbrain_state::kbd_scan), this), attotime::from_hz(15));
+}
ROM_START( sbrain )
ROM_REGION( 0x0800, "subcpu", ROMREGION_ERASEFF ) // only the second CPU has its own ROM
- ROM_SYSTEM_BIOS( 0, "4_003", "4.003" )
- ROMX_LOAD("4_003_vc8001.z69", 0x0000, 0x0800, CRC(3ce3cd53) SHA1(fb6ade6bd67de3d9f911a1a48481ca619bda65ae), ROM_BIOS(0))
- ROM_SYSTEM_BIOS( 1, "3_1", "3.1" )
- ROMX_LOAD("3_1.z69", 0x0000, 0x0800, CRC(b6a2e6a5) SHA1(a646faaecb9ac45ee1a42764628e8971524d5c13), ROM_BIOS(1))
- ROM_SYSTEM_BIOS( 2, "3_05", "3.05" )
- ROMX_LOAD("qd_3_05.z69", 0x0000, 0x0800, CRC(aedbe777) SHA1(9ee9ca3f05e11ceb80896f06c3a3ae352db214dc), ROM_BIOS(2))
+ ROM_SYSTEM_BIOS( 0, "4_2", "4.2")
+ ROMX_LOAD("sbii_sb4_2.z69", 0x0000, 0x0800, CRC(89313e26) SHA1(755d494934099a4488abc44a8566c18d7d4fdea3), ROM_BIOS(0))
+ ROM_SYSTEM_BIOS( 1, "4_003", "4.003" )
+ ROMX_LOAD("4_003_vc8001.z69", 0x0000, 0x0800, CRC(3ce3cd53) SHA1(fb6ade6bd67de3d9f911a1a48481ca619bda65ae), ROM_BIOS(1))
+ ROM_SYSTEM_BIOS( 2, "3_1", "3.1" )
+ ROMX_LOAD("3_1.z69", 0x0000, 0x0800, CRC(b6a2e6a5) SHA1(a646faaecb9ac45ee1a42764628e8971524d5c13), ROM_BIOS(2))
+ ROM_SYSTEM_BIOS( 3, "3_05", "3.05" )
+ ROMX_LOAD("qd_3_05.z69", 0x0000, 0x0800, CRC(aedbe777) SHA1(9ee9ca3f05e11ceb80896f06c3a3ae352db214dc), ROM_BIOS(3))
+ ROM_SYSTEM_BIOS( 4, "4_2_50", "4.2 (50Hz hack)")
+ ROMX_LOAD("sbii_sb4_2_50hz.z69", 0x0000, 0x0800, CRC(285a894b) SHA1(694fef446fe19c0962f79951aa4d464489a9d161), ROM_BIOS(4))
// Using the chargen from 'c10' for now.
ROM_REGION( 0x2000, "chargen", 0 )
ROM_LOAD("c10_char.bin", 0x0000, 0x2000, BAD_DUMP CRC(cb530b6f) SHA1(95590bbb433db9c4317f535723b29516b9b9fcbf))
diff --git a/src/mame/drivers/sbrkout.cpp b/src/mame/drivers/sbrkout.cpp
index 9bfaeffec49..77bc57eea4e 100644
--- a/src/mame/drivers/sbrkout.cpp
+++ b/src/mame/drivers/sbrkout.cpp
@@ -556,8 +556,8 @@ GFXDECODE_END
*
*************************************/
-MACHINE_CONFIG_START(sbrkout_state::sbrkout)
-
+void sbrkout_state::sbrkout(machine_config &config)
+{
/* basic machine hardware */
M6502(config, m_maincpu, MAIN_CLOCK/16); // 375 KHz? Should be 750KHz?
m_maincpu->set_addrmap(AS_PROGRAM, &sbrkout_state::main_map);
@@ -576,7 +576,7 @@ MACHINE_CONFIG_START(sbrkout_state::sbrkout)
WATCHDOG_TIMER(config, "watchdog").set_vblank_count(m_screen, 8);
/* video hardware */
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_sbrkout)
+ GFXDECODE(config, m_gfxdecode, m_palette, gfx_sbrkout);
SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
m_screen->set_raw(MAIN_CLOCK/2, 384, 0, 256, 262, 0, 224);
@@ -588,8 +588,8 @@ MACHINE_CONFIG_START(sbrkout_state::sbrkout)
/* sound hardware */
SPEAKER(config, "speaker").front_center();
DAC_1BIT(config, m_dac, 0).add_route(ALL_OUTPUTS, "speaker", 0.99);
- VOLTAGE_REGULATOR(config, "vref").set_output(5.0).add_route(0, m_dac, 1.0, DAC_VREF_POS_INPUT);
-MACHINE_CONFIG_END
+ VOLTAGE_REGULATOR(config, "vref").add_route(0, m_dac, 1.0, DAC_VREF_POS_INPUT);
+}
void sbrkoutct_state::sbrkoutct(machine_config &config)
diff --git a/src/mame/drivers/sbugger.cpp b/src/mame/drivers/sbugger.cpp
index 377222f1d9e..52536def52d 100644
--- a/src/mame/drivers/sbugger.cpp
+++ b/src/mame/drivers/sbugger.cpp
@@ -123,8 +123,8 @@ void sbugger_state::sbugger_map(address_map &map)
void sbugger_state::sbugger_io_map(address_map &map)
{
map(0xe0, 0xe7).rw("i8156", FUNC(i8155_device::io_r), FUNC(i8155_device::io_w));
- map(0xe8, 0xe8).w("sn76489.1", FUNC(sn76489_device::command_w));
- map(0xe9, 0xe9).w("sn76489.2", FUNC(sn76489_device::command_w));
+ map(0xe8, 0xe8).w("sn76489.1", FUNC(sn76489_device::write));
+ map(0xe9, 0xe9).w("sn76489.2", FUNC(sn76489_device::write));
}
@@ -214,11 +214,11 @@ INPUT_PORTS_END
/* machine driver */
-MACHINE_CONFIG_START(sbugger_state::sbugger)
-
- MCFG_DEVICE_ADD("maincpu", I8085A, 6000000) /* 3.00 MHz??? */
- MCFG_DEVICE_PROGRAM_MAP(sbugger_map)
- MCFG_DEVICE_IO_MAP(sbugger_io_map)
+void sbugger_state::sbugger(machine_config &config)
+{
+ I8085A(config, m_maincpu, 6000000); /* 3.00 MHz??? */
+ m_maincpu->set_addrmap(AS_PROGRAM, &sbugger_state::sbugger_map);
+ m_maincpu->set_addrmap(AS_IO, &sbugger_state::sbugger_io_map);
i8156_device &i8156(I8156(config, "i8156", 200000)); /* freq is an approximation */
i8156.in_pa_callback().set_ioport("INPUTS");
@@ -226,27 +226,25 @@ MACHINE_CONFIG_START(sbugger_state::sbugger)
i8156.in_pc_callback().set_ioport("DSW2");
i8156.out_to_callback().set_inputline(m_maincpu, I8085_RST75_LINE);
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_sbugger)
+ GFXDECODE(config, m_gfxdecode, "palette", gfx_sbugger);
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(64*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 64*8-1, 0*8, 32*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(sbugger_state, screen_update)
- MCFG_SCREEN_PALETTE("palette")
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(64*8, 32*8);
+ screen.set_visarea(0*8, 64*8-1, 0*8, 32*8-1);
+ screen.set_screen_update(FUNC(sbugger_state::screen_update));
+ screen.set_palette("palette");
PALETTE(config, "palette", FUNC(sbugger_state::sbugger_palette), 512);
/* sound hardware */
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("sn76489.1", SN76489, 3000000)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
+ SN76489(config, "sn76489.1", 3000000).add_route(ALL_OUTPUTS, "mono", 1.0);
- MCFG_DEVICE_ADD("sn76489.2", SN76489, 3000000)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
-MACHINE_CONFIG_END
+ SN76489(config, "sn76489.2", 3000000).add_route(ALL_OUTPUTS, "mono", 1.0);
+}
/* rom loading */
diff --git a/src/mame/drivers/sc1.cpp b/src/mame/drivers/sc1.cpp
deleted file mode 100644
index 55772bc1337..00000000000
--- a/src/mame/drivers/sc1.cpp
+++ /dev/null
@@ -1,190 +0,0 @@
-// license:BSD-3-Clause
-// copyright-holders:Sandro Ronco
-/***************************************************************************
-
-Schachcomputer SC1
-
-2009-05-12 Skeleton driver.
-
-ToDo:
-- speaker
-- LEDs
-- 7seg sometimes flashes
-
-
-****************************************************************************/
-
-#include "emu.h"
-#include "cpu/z80/z80.h"
-#include "machine/z80pio.h"
-#include "sound/spkrdev.h"
-#include "speaker.h"
-
-#include "sc1.lh"
-
-
-class sc1_state : public driver_device
-{
-public:
- sc1_state(const machine_config &mconfig, device_type type, const char *tag)
- : driver_device(mconfig, type, tag)
- , m_maincpu(*this, "maincpu")
- , m_speaker(*this, "speaker")
- , m_digits(*this, "digit%u", 0U)
- { }
-
- void sc1(machine_config &config);
-
-private:
- DECLARE_WRITE8_MEMBER( matrix_w );
- DECLARE_WRITE8_MEMBER( pio_port_a_w );
- DECLARE_READ8_MEMBER( pio_port_b_r );
-
- void sc1_io(address_map &map);
- void sc1_mem(address_map &map);
-
- uint8_t m_matrix;
- virtual void machine_start() override { m_digits.resolve(); }
- required_device<cpu_device> m_maincpu;
- required_device<speaker_sound_device> m_speaker;
- output_finder<4> m_digits;
-};
-
-/***************************************************************************
-
- Display
-
-***************************************************************************/
-
-WRITE8_MEMBER( sc1_state::pio_port_a_w )
-{
- uint8_t digit = bitswap<8>( data,3,4,6,0,1,2,7,5 ) & 0x7f;
-
- if (m_matrix & 0x04)
- m_digits[3] = digit;
- if (m_matrix & 0x08)
- m_digits[2] = digit;
- if (m_matrix & 0x10)
- m_digits[1] = digit;
- if (m_matrix & 0x20)
- m_digits[0] = digit;
-}
-
-
-/***************************************************************************
-
- Keyboard
-
-***************************************************************************/
-
-WRITE8_MEMBER( sc1_state::matrix_w )
-{
- m_matrix = data;
-}
-
-READ8_MEMBER( sc1_state::pio_port_b_r )
-{
- uint8_t data = 0;
-
- if (m_matrix & 0x01)
- data |= ioport("LINE1")->read();
- if (m_matrix & 0x02)
- data |= ioport("LINE2")->read();
- if (m_matrix & 0x04)
- data |= ioport("LINE3")->read();
- if (m_matrix & 0x08)
- data |= ioport("LINE4")->read();
- if (m_matrix & 0x10)
- data |= ioport("LINE5")->read();
- if (m_matrix & 0x20)
- data |= ioport("LINE6")->read();
- if (m_matrix & 0x40)
- data |= ioport("LINE7")->read();
- if (m_matrix & 0x80)
- data |= ioport("LINE8")->read();
-
- return data;
-}
-
-
-void sc1_state::sc1_mem(address_map &map)
-{
- map.unmap_value_high();
- map(0x0000, 0x0fff).rom();
- map(0x4000, 0x43ff).ram();
-}
-
-void sc1_state::sc1_io(address_map &map)
-{
- map.unmap_value_high();
- map.global_mask(0xff);
- map(0x80, 0x83).rw("z80pio", FUNC(z80pio_device::read_alt), FUNC(z80pio_device::write_alt));
- map(0xfc, 0xfc).w(FUNC(sc1_state::matrix_w));
-}
-
-/* Input ports */
-static INPUT_PORTS_START( sc1 )
- PORT_START("LINE1")
- PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_UNUSED)
- PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("D4") PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_D)
-
- PORT_START("LINE2")
- PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("B2") PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_B)
- PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("F6") PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_F)
-
- PORT_START("LINE3")
- PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("C3") PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_C)
- PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("G7") PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_G)
-
- PORT_START("LINE4")
- PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("A1") PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_A)
- PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("E5") PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_E)
-
- PORT_START("LINE5")
- PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("H8") PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_H)
- PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("CE") PORT_CODE(KEYCODE_DEL)
-
- PORT_START("LINE6")
- PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("K") PORT_CODE(KEYCODE_K)
- PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("ENT") PORT_CODE(KEYCODE_ENTER)
-
- PORT_START("LINE7")
- PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("P") PORT_CODE(KEYCODE_O)
- PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("W/S") PORT_CODE(KEYCODE_W)
-
- PORT_START("LINE8")
- PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("T") PORT_CODE(KEYCODE_T)
- PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("C") PORT_CODE(KEYCODE_M)
-INPUT_PORTS_END
-
-
-MACHINE_CONFIG_START(sc1_state::sc1)
- /* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu",Z80, XTAL(4'000'000))
- MCFG_DEVICE_PROGRAM_MAP(sc1_mem)
- MCFG_DEVICE_IO_MAP(sc1_io)
-
- /* video hardware */
- config.set_default_layout(layout_sc1);
-
- /* devices */
- z80pio_device& pio(Z80PIO(config, "z80pio", XTAL(4'000'000)));
- pio.out_pa_callback().set(FUNC(sc1_state::pio_port_a_w));
- pio.in_pb_callback().set(FUNC(sc1_state::pio_port_b_r));
-
- /* sound hardware */
- SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("speaker", SPEAKER_SOUND)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.50)
-MACHINE_CONFIG_END
-
-/* ROM definition */
-ROM_START( sc1 )
- ROM_REGION( 0x10000, "maincpu", ROMREGION_ERASEFF )
- ROM_LOAD( "sc1.rom", 0x0000, 0x1000, CRC(26965b23) SHA1(01568911446eda9f05ec136df53da147b7c6f2bf))
-ROM_END
-
-/* Driver */
-
-// YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS
-COMP( 1989, sc1, 0, 0, sc1, sc1, sc1_state, empty_init, "VEB Mikroelektronik Erfurt", "Schachcomputer SC1", MACHINE_NOT_WORKING | MACHINE_NO_SOUND )
diff --git a/src/mame/drivers/sc2.cpp b/src/mame/drivers/sc2.cpp
index abe351f6cd7..a6bacd50ea2 100644
--- a/src/mame/drivers/sc2.cpp
+++ b/src/mame/drivers/sc2.cpp
@@ -2,67 +2,107 @@
// copyright-holders:Sandro Ronco
/***************************************************************************
- Schachcomputer SC2
+Schachcomputer SC 2 driver
- Note:
- The HW is very similar to Fidelity Chess Challenger series (see fidelz80.c)
+VEB Mikroelektronik's 2nd chess computer. The chess program is based on
+Fidelity Chess Challenger 10(C?).
- 12/05/2009 Skeleton driver.
+3 versions known: initial version, revision E, revision EP.
+
+Schachcomputer SC 1 was canceled before wide release, it's assumed to
+be on similar hardware(but PCB photos show 10 ROM chips instead of 9).
+
+keypad legend:
+
+R - Rückstellen (reset)
+K - Programmstufen (level)
+W - Figurenwahl (white/black)
+P - Problemeingabe (problem mode)
+T - Tonabschaltung (sound on/off)
+L - Löschen (clear)
+Q - Quittierung (enter)
+
+Fidelity CC10 synonyms: RE, LV, RV, PB, ♪, CL, EN
****************************************************************************/
#include "emu.h"
#include "cpu/z80/z80.h"
-#include "sound/beep.h"
#include "machine/z80pio.h"
+#include "sound/dac.h"
+#include "sound/volt_reg.h"
#include "speaker.h"
#include "sc2.lh"
+
+namespace {
+
class sc2_state : public driver_device
{
public:
- sc2_state(const machine_config &mconfig, device_type type, const char *tag)
- : driver_device(mconfig, type, tag),
- m_beep(*this, "beeper"),
+ sc2_state(const machine_config &mconfig, device_type type, const char *tag) :
+ driver_device(mconfig, type, tag),
m_maincpu(*this, "maincpu"),
+ m_pio(*this, "z80pio"),
+ m_dac(*this, "dac"),
+ m_keypad(*this, "LINE%u", 1),
m_digits(*this, "digit%u", 0U),
m_leds(*this, "led%u", 0U)
{ }
void sc2(machine_config &config);
-private:
- DECLARE_READ8_MEMBER(pio_port_a_r);
- DECLARE_READ8_MEMBER(pio_port_b_r);
- DECLARE_WRITE8_MEMBER(pio_port_a_w);
- DECLARE_WRITE8_MEMBER(pio_port_b_w);
- DECLARE_READ8_MEMBER(sc2_beep);
- uint8_t m_kp_matrix;
- uint8_t m_led_7seg_data[4];
- uint8_t m_led_selected;
- uint8_t m_digit_data;
- uint8_t m_beep_state;
- void sc2_update_display();
+ // Rückstellen is also tied to CPU RESET
+ DECLARE_INPUT_CHANGED_MEMBER(reset_button) { m_maincpu->set_input_line(INPUT_LINE_RESET, newval ? ASSERT_LINE : CLEAR_LINE); }
+
+protected:
virtual void machine_start() override;
- virtual void machine_reset() override;
- void sc2_io(address_map &map);
- void sc2_mem(address_map &map);
- required_device<beep_device> m_beep;
+private:
required_device<cpu_device> m_maincpu;
+ required_device<z80pio_device> m_pio;
+ required_device<dac_bit_interface> m_dac;
+ required_ioport_array<4> m_keypad;
+
output_finder<4> m_digits;
output_finder<2> m_leds;
+
+ void sc2_io(address_map &map);
+ void sc2_mem(address_map &map);
+
+ uint8_t m_kp_matrix;
+ uint8_t m_led_selected;
+ uint8_t m_digit_data;
+
+ void sc2_update_display();
+ DECLARE_READ8_MEMBER(pio_port_b_r);
+ DECLARE_WRITE8_MEMBER(pio_port_a_w);
+ DECLARE_WRITE8_MEMBER(pio_port_b_w);
+ DECLARE_READ8_MEMBER(speaker_w);
+ template<int State> DECLARE_READ8_MEMBER(speaker_w);
};
-READ8_MEMBER( sc2_state::sc2_beep )
+void sc2_state::machine_start()
{
- //if (!machine().side_effects_disabled())
- {
- m_beep_state = ~m_beep_state;
+ m_digits.resolve();
+ m_leds.resolve();
- m_beep->set_state(m_beep_state);
- }
+ m_kp_matrix = 0;
+ m_led_selected = 0;
+ m_digit_data = 0;
+
+ save_item(NAME(m_kp_matrix));
+ save_item(NAME(m_led_selected));
+ save_item(NAME(m_digit_data));
+}
+
+
+template<int State>
+READ8_MEMBER(sc2_state::speaker_w)
+{
+ if (!machine().side_effects_disabled())
+ m_dac->write(State);
return 0xff;
}
@@ -73,136 +113,55 @@ void sc2_state::sc2_mem(address_map &map)
map(0x0000, 0x0fff).rom();
map(0x1000, 0x13ff).ram();
map(0x2000, 0x33ff).rom();
- map(0x3c00, 0x3c00).r(FUNC(sc2_state::sc2_beep));
+ map(0x3400, 0x3400).r(FUNC(sc2_state::speaker_w<1>));
+ map(0x3c00, 0x3c00).r(FUNC(sc2_state::speaker_w<0>));
}
void sc2_state::sc2_io(address_map &map)
{
map.unmap_value_high();
map.global_mask(0xff);
- map(0x00, 0x03).mirror(0xfc).rw("z80pio", FUNC(z80pio_device::read), FUNC(z80pio_device::write));
-}
-
-/* Input ports */
-static INPUT_PORTS_START( sc2 )
- PORT_START("LINE1")
- PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_UNUSED)
- PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("T") PORT_CODE(KEYCODE_T)
- PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("L") PORT_CODE(KEYCODE_L)
- PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Q") PORT_CODE(KEYCODE_Q)
-
- PORT_START("LINE2")
- PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("A1") PORT_CODE(KEYCODE_1)
- PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("B2") PORT_CODE(KEYCODE_2)
- PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("C3") PORT_CODE(KEYCODE_3)
- PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("D4") PORT_CODE(KEYCODE_4)
-
- PORT_START("LINE3")
- PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("E5") PORT_CODE(KEYCODE_5)
- PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("F6") PORT_CODE(KEYCODE_6)
- PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("G7") PORT_CODE(KEYCODE_7)
- PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("H8") PORT_CODE(KEYCODE_8)
-
- PORT_START("LINE4")
- PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("K") PORT_CODE(KEYCODE_K)
- PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("W") PORT_CODE(KEYCODE_W)
- PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("R") PORT_CODE(KEYCODE_R)
- PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("P") PORT_CODE(KEYCODE_O)
-INPUT_PORTS_END
-
-void sc2_state::machine_start()
-{
- m_digits.resolve();
- m_leds.resolve();
-
- save_item(NAME(m_led_7seg_data));
- save_item(NAME(m_kp_matrix));
- save_item(NAME(m_led_selected));
- save_item(NAME(m_digit_data));
- save_item(NAME(m_beep_state));
+ map(0x00, 0x03).mirror(0xfc).rw(m_pio, FUNC(z80pio_device::read), FUNC(z80pio_device::write));
}
-void sc2_state::machine_reset()
-{
- m_kp_matrix = 0;
- m_led_selected = 0;
- m_digit_data = 0;
- m_beep_state = 0;
- memset(m_led_7seg_data, 0, ARRAY_LENGTH(m_led_7seg_data));
-}
void sc2_state::sc2_update_display()
{
- uint8_t digit_data = bitswap<8>( m_digit_data,7,0,1,2,3,4,5,6 ) & 0x7f;
-
- if (!BIT(m_led_selected, 0))
+ // latch display data
+ for (int i = 0; i < 4; i++)
{
- m_digits[0] = digit_data;
- m_led_7seg_data[0] = digit_data;
-
- m_leds[0] = BIT(m_digit_data, 7);
- }
-
- if (!BIT(m_led_selected, 1))
- {
- m_digits[1] = digit_data;
- m_led_7seg_data[1] = digit_data;
-
- m_leds[1] = BIT(m_digit_data, 7);
- }
-
- if (!BIT(m_led_selected, 2))
- {
- m_digits[2] = digit_data;
- m_led_7seg_data[2] = digit_data;
- }
-
- if (!BIT(m_led_selected, 3))
- {
- m_digits[3] = digit_data;
- m_led_7seg_data[3] = digit_data;
+ if (!BIT(m_led_selected, i))
+ {
+ m_digits[i] = m_digit_data & 0x7f;
+
+ // schach/matt leds
+ if (i < 2)
+ m_leds[i] = BIT(m_digit_data, 7);
+ }
}
}
-READ8_MEMBER( sc2_state::pio_port_a_r )
+READ8_MEMBER(sc2_state::pio_port_b_r)
{
- return m_digit_data;
-}
-
-READ8_MEMBER( sc2_state::pio_port_b_r )
-{
- uint8_t data = m_led_selected & 0x0f;
-
- if (BIT(m_kp_matrix, 0))
- {
- data |= ioport("LINE1")->read();
- }
-
- if (BIT(m_kp_matrix, 1))
- {
- data |= ioport("LINE2")->read();
- }
-
- if (BIT(m_kp_matrix, 2))
- {
- data |= ioport("LINE3")->read();
- }
+ uint8_t data = 0x0f;
- if (BIT(m_kp_matrix, 3))
- {
- data |= ioport("LINE4")->read();
- }
+ // read keypad matrix
+ for (int i = 0; i < 4; i++)
+ if (BIT(m_kp_matrix, i))
+ data |= m_keypad[i]->read();
return data;
}
-WRITE8_MEMBER( sc2_state::pio_port_a_w )
+WRITE8_MEMBER(sc2_state::pio_port_a_w)
{
- m_digit_data = data;
+ // digit segment data
+ m_digit_data = bitswap<8>(data,7,0,1,2,3,4,5,6);
}
-WRITE8_MEMBER( sc2_state::pio_port_b_w )
+WRITE8_MEMBER(sc2_state::pio_port_b_w)
{
+ // d0-d3: keypad mux(active high), led mux(active low)
if (data != 0xf1 && data != 0xf2 && data != 0xf4 && data != 0xf8)
{
m_led_selected = data;
@@ -212,44 +171,94 @@ WRITE8_MEMBER( sc2_state::pio_port_b_w )
m_kp_matrix = data;
}
-MACHINE_CONFIG_START(sc2_state::sc2)
- /* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu",Z80, XTAL(4'000'000))
- MCFG_DEVICE_PROGRAM_MAP(sc2_mem)
- MCFG_DEVICE_IO_MAP(sc2_io)
+/* Input ports */
+
+static INPUT_PORTS_START( sc2 )
+ PORT_START("LINE1")
+ PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_UNUSED)
+ PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("T") PORT_CODE(KEYCODE_T)
+ PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("L") PORT_CODE(KEYCODE_L) PORT_CODE(KEYCODE_DEL) PORT_CODE(KEYCODE_BACKSPACE)
+ PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Q") PORT_CODE(KEYCODE_Q) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD)
+
+ PORT_START("LINE2")
+ PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("A1") PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_CODE(KEYCODE_A)
+ PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("B2") PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_CODE(KEYCODE_B)
+ PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("C3") PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_CODE(KEYCODE_C)
+ PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("D4") PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_CODE(KEYCODE_D)
+
+ PORT_START("LINE3")
+ PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("E5") PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_CODE(KEYCODE_E)
+ PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("F6") PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_CODE(KEYCODE_F)
+ PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("G7") PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_CODE(KEYCODE_G)
+ PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("H8") PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_CODE(KEYCODE_H)
+
+ PORT_START("LINE4")
+ PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("K") PORT_CODE(KEYCODE_K)
+ PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("W") PORT_CODE(KEYCODE_W)
+ PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("R") PORT_CODE(KEYCODE_R) PORT_CHANGED_MEMBER(DEVICE_SELF, sc2_state, reset_button, nullptr)
+ PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("P") PORT_CODE(KEYCODE_O)
+INPUT_PORTS_END
+
+
+/* Machine config */
+
+void sc2_state::sc2(machine_config &config)
+{
+ /* basic machine hardware */
+ Z80(config, m_maincpu, 9.8304_MHz_XTAL/4); // U880 Z80 clone
+ m_maincpu->set_addrmap(AS_PROGRAM, &sc2_state::sc2_mem);
+ m_maincpu->set_addrmap(AS_IO, &sc2_state::sc2_io);
/* video hardware */
config.set_default_layout(layout_sc2);
/* devices */
- z80pio_device& pio(Z80PIO(config, "z80pio", XTAL(4'000'000)));
- pio.in_pa_callback().set(FUNC(sc2_state::pio_port_a_r));
- pio.out_pa_callback().set(FUNC(sc2_state::pio_port_a_w));
- pio.in_pb_callback().set(FUNC(sc2_state::pio_port_b_r));
- pio.out_pb_callback().set(FUNC(sc2_state::pio_port_b_w));
+ Z80PIO(config, m_pio, 9.8304_MHz_XTAL/4);
+ m_pio->out_pa_callback().set(FUNC(sc2_state::pio_port_a_w));
+ m_pio->in_pb_callback().set(FUNC(sc2_state::pio_port_b_r));
+ m_pio->out_pb_callback().set(FUNC(sc2_state::pio_port_b_w));
/* sound hardware */
- SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD( "beeper", BEEP, 3250 )
- MCFG_SOUND_ROUTE( ALL_OUTPUTS, "mono", 0.50 )
-MACHINE_CONFIG_END
+ SPEAKER(config, "speaker").front_center();
+ DAC_1BIT(config, m_dac).add_route(ALL_OUTPUTS, "speaker", 0.25);
+ VOLTAGE_REGULATOR(config, "vref").add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT);
+}
+
/* ROM definition */
+
ROM_START( sc2 )
ROM_REGION( 0x10000, "maincpu", ROMREGION_ERASEFF )
- ROM_LOAD( "bm008.bin", 0x0000, 0x0400, CRC(3023ea82) SHA1(07020d153d802c672c39e1af3c716dbe35e23f08))
- ROM_LOAD( "bm009.bin", 0x0400, 0x0400, CRC(6a34814e) SHA1(e58ae6615297b028db135a48a8f9e186a4220f4f))
- ROM_LOAD( "bm010.bin", 0x0800, 0x0400, CRC(deab0373) SHA1(81c9a7197eef8d9131e47ecd2ec35b943caee54e))
- ROM_LOAD( "bm011.bin", 0x0c00, 0x0400, CRC(c8282339) SHA1(8d6b8861281e967a77609b6d77e80afd47d28ed2))
- ROM_LOAD( "bm012.bin", 0x2000, 0x0400, CRC(2e6a4294) SHA1(7b9bd191c9ec73139a65c3a339ab88e1f3eb5ed2))
- ROM_LOAD( "bm013.bin", 0x2400, 0x0400, CRC(3e02eb42) SHA1(2e4a9a8fd04c202c9518550d7e8cf9bfea394153))
- ROM_LOAD( "bm014.bin", 0x2800, 0x0400, CRC(538d449e) SHA1(c4186995b69e97740e01eaff84a20d49d03d180f))
- ROM_LOAD( "bm015.bin", 0x2c00, 0x0400, CRC(b4991dca) SHA1(6a6cdddf5c4afa24773acf693f58c34b99c8d328))
- ROM_LOAD( "bm016.bin", 0x3000, 0x0400, CRC(4fe0853a) SHA1(c2253e320778b0ea468fb54f26ae83d07f9700e6))
+ ROM_LOAD( "bm008.bin", 0x0000, 0x0400, CRC(3023ea82) SHA1(07020d153d802c672c39e1af3c716dbe35e23f08) )
+ ROM_LOAD( "bm009.bin", 0x0400, 0x0400, CRC(6a34814e) SHA1(e58ae6615297b028db135a48a8f9e186a4220f4f) )
+ ROM_LOAD( "bm010.bin", 0x0800, 0x0400, CRC(deab0373) SHA1(81c9a7197eef8d9131e47ecd2ec35b943caee54e) )
+ ROM_LOAD( "bm011.bin", 0x0c00, 0x0400, CRC(c8282339) SHA1(8d6b8861281e967a77609b6d77e80afd47d28ed2) )
+ ROM_LOAD( "bm012.bin", 0x2000, 0x0400, CRC(2e6a4294) SHA1(7b9bd191c9ec73139a65c3a339ab88e1f3eb5ed2) )
+ ROM_LOAD( "bm013.bin", 0x2400, 0x0400, CRC(3e02eb42) SHA1(2e4a9a8fd04c202c9518550d7e8cf9bfea394153) )
+ ROM_LOAD( "bm014.bin", 0x2800, 0x0400, CRC(538d449e) SHA1(c4186995b69e97740e01eaff84a20d49d03d180f) )
+ ROM_LOAD( "bm015.bin", 0x2c00, 0x0400, CRC(b4991dca) SHA1(6a6cdddf5c4afa24773acf693f58c34b99c8d328) )
+ ROM_LOAD( "bm037.bin", 0x3000, 0x0400, CRC(2b67faf1) SHA1(5c65734acaeb766240dbd492a774c56fcfc382f7) )
ROM_END
+ROM_START( sc2a )
+ ROM_REGION( 0x10000, "maincpu", ROMREGION_ERASEFF )
+ ROM_LOAD( "bm008.bin", 0x0000, 0x0400, CRC(3023ea82) SHA1(07020d153d802c672c39e1af3c716dbe35e23f08) )
+ ROM_LOAD( "bm009.bin", 0x0400, 0x0400, CRC(6a34814e) SHA1(e58ae6615297b028db135a48a8f9e186a4220f4f) )
+ ROM_LOAD( "bm010.bin", 0x0800, 0x0400, CRC(deab0373) SHA1(81c9a7197eef8d9131e47ecd2ec35b943caee54e) )
+ ROM_LOAD( "bm011.bin", 0x0c00, 0x0400, CRC(c8282339) SHA1(8d6b8861281e967a77609b6d77e80afd47d28ed2) )
+ ROM_LOAD( "bm012.bin", 0x2000, 0x0400, CRC(2e6a4294) SHA1(7b9bd191c9ec73139a65c3a339ab88e1f3eb5ed2) )
+ ROM_LOAD( "bm013.bin", 0x2400, 0x0400, CRC(3e02eb42) SHA1(2e4a9a8fd04c202c9518550d7e8cf9bfea394153) )
+ ROM_LOAD( "bm014.bin", 0x2800, 0x0400, CRC(538d449e) SHA1(c4186995b69e97740e01eaff84a20d49d03d180f) )
+ ROM_LOAD( "bm015.bin", 0x2c00, 0x0400, CRC(b4991dca) SHA1(6a6cdddf5c4afa24773acf693f58c34b99c8d328) )
+ ROM_LOAD( "bm016.bin", 0x3000, 0x0400, CRC(4fe0853a) SHA1(c2253e320778b0ea468fb54f26ae83d07f9700e6) )
+ROM_END
+
+} // anonymous namespace
+
+
/* Driver */
-// YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS
-COMP( 1981, sc2, 0, 0, sc2, sc2, sc2_state, empty_init, "VEB Mikroelektronik Erfurt", "Schachcomputer SC2", MACHINE_SUPPORTS_SAVE )
+// YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS
+COMP( 1981, sc2, 0, 0, sc2, sc2, sc2_state, empty_init, "VEB Mikroelektronik Erfurt", "Schachcomputer SC 2 (rev. E)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK )
+COMP( 1981, sc2a, sc2, 0, sc2, sc2, sc2_state, empty_init, "VEB Mikroelektronik Erfurt", "Schachcomputer SC 2", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK )
diff --git a/src/mame/drivers/scm_500.cpp b/src/mame/drivers/scm_500.cpp
index 7983f6482e3..ad16a0e2c57 100644
--- a/src/mame/drivers/scm_500.cpp
+++ b/src/mame/drivers/scm_500.cpp
@@ -40,11 +40,10 @@ void scm_500_state::machine_reset()
{
}
-MACHINE_CONFIG_START(scm_500_state::scm_500)
-
+void scm_500_state::scm_500(machine_config &config)
+{
// unknown CPU
-
-MACHINE_CONFIG_END
+}
/*
diff --git a/src/mame/drivers/scobra.cpp b/src/mame/drivers/scobra.cpp
index 3dc34b18c06..f3783395f76 100644
--- a/src/mame/drivers/scobra.cpp
+++ b/src/mame/drivers/scobra.cpp
@@ -866,16 +866,16 @@ static INPUT_PORTS_START( mimonsco )
INPUT_PORTS_END
-MACHINE_CONFIG_START(scobra_state::type1)
-
+void scobra_state::type1(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, 18432000/6) /* 3.072 MHz */
- MCFG_DEVICE_PROGRAM_MAP(type1_map)
+ Z80(config, m_maincpu, 18432000/6); /* 3.072 MHz */
+ m_maincpu->set_addrmap(AS_PROGRAM, &scobra_state::type1_map);
- MCFG_DEVICE_ADD("audiocpu", Z80,14318000/8) /* 1.78975 MHz */
- MCFG_DEVICE_PROGRAM_MAP(scobra_sound_map)
- MCFG_DEVICE_IO_MAP(scobra_sound_io_map)
- MCFG_DEVICE_IRQ_ACKNOWLEDGE_DRIVER(scramble_state,scramble_sh_irq_callback)
+ Z80(config, m_audiocpu, 14318000/8); /* 1.78975 MHz */
+ m_audiocpu->set_addrmap(AS_PROGRAM, &scobra_state::scobra_sound_map);
+ m_audiocpu->set_addrmap(AS_IO, &scobra_state::scobra_sound_io_map);
+ m_audiocpu->set_irq_acknowledge_callback(FUNC(scramble_state::scramble_sh_irq_callback));
ttl7474_device &konami_7474(TTL7474(config, "konami_7474", 0));
konami_7474.comp_output_cb().set(FUNC(scobra_state::scramble_sh_7474_q_callback));
@@ -897,18 +897,18 @@ MACHINE_CONFIG_START(scobra_state::type1)
ttl7474_device &ttl7474_9m_2(TTL7474(config, "7474_9m_2", 0));
ttl7474_9m_2.comp_output_cb().set(FUNC(scobra_state::galaxold_7474_9m_2_q_callback));
- MCFG_TIMER_DRIVER_ADD("int_timer", scobra_state, galaxold_interrupt_timer)
+ TIMER(config, "int_timer").configure_generic(FUNC(scobra_state::galaxold_interrupt_timer));
WATCHDOG_TIMER(config, "watchdog");
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(16000.0/132/2)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(32*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(scobra_state, screen_update_galaxold)
- MCFG_SCREEN_PALETTE(m_palette)
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_refresh_hz(16000.0/132/2);
+ m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ m_screen->set_size(32*8, 32*8);
+ m_screen->set_visarea(0*8, 32*8-1, 2*8, 30*8-1);
+ m_screen->set_screen_update(FUNC(scobra_state::screen_update_galaxold));
+ m_screen->set_palette(m_palette);
GFXDECODE(config, "gfxdecode", m_palette, gfx_scobra);
PALETTE(config, m_palette, FUNC(scobra_state::scrambold_palette), 32+64+2+1); // 32 for characters, 64 for stars, 2 for bullets, 1 for background
@@ -926,13 +926,14 @@ MACHINE_CONFIG_START(scobra_state::type1)
ay2.port_a_read_callback().set(m_soundlatch, FUNC(generic_latch_8_device::read));
ay2.port_b_read_callback().set(FUNC(scramble_state::scramble_portB_r));
ay2.add_route(ALL_OUTPUTS, "mono", 0.16);
-MACHINE_CONFIG_END
+}
/* Rescue, Minefield and Strategy X have extra colors, and custom video initialise */
/* routines to set up the graduated color backgound they use */
-MACHINE_CONFIG_START(scobra_state::rescue)
+void scobra_state::rescue(machine_config &config)
+{
type1(config);
/* basic machine hardware */
@@ -942,14 +943,14 @@ MACHINE_CONFIG_START(scobra_state::rescue)
m_palette->set_init(FUNC(scobra_state::rescue_palette));
MCFG_VIDEO_START_OVERRIDE(scobra_state,rescue)
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(scobra_state::rescuefe)
+void scobra_state::rescuefe(machine_config &config)
+{
rescue(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(rescuefe_map)
-MACHINE_CONFIG_END
+ m_maincpu->set_addrmap(AS_PROGRAM, &scobra_state::rescuefe_map);
+}
void scobra_state::rescueb(machine_config &config)
{
@@ -958,55 +959,55 @@ void scobra_state::rescueb(machine_config &config)
}
-MACHINE_CONFIG_START(scobra_state::minefld)
+void scobra_state::minefld(machine_config &config)
+{
type1(config);
- /* basic machine hardware */
-
/* video hardware */
m_palette->set_entries(32+64+2+256); // 32 for characters, 64 for stars, 2 for bullets, 256 for background
m_palette->set_init(FUNC(scobra_state::minefld_palette));
MCFG_VIDEO_START_OVERRIDE(scobra_state,minefld)
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(scobra_state::minefldfe)
+void scobra_state::minefldfe(machine_config &config)
+{
minefld(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(minefldfe_map)
-MACHINE_CONFIG_END
+ m_maincpu->set_addrmap(AS_PROGRAM, &scobra_state::minefldfe_map);
+}
-MACHINE_CONFIG_START(scobra_state::mimonkey)
+void scobra_state::mimonkey(machine_config &config)
+{
type1(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(mimonkey_map)
+ m_maincpu->set_addrmap(AS_PROGRAM, &scobra_state::mimonkey_map);
/* video hardware */
MCFG_VIDEO_START_OVERRIDE(scobra_state,mimonkey)
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(scobra_state::type2)
+void scobra_state::type2(machine_config &config)
+{
type1(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(type2_map)
-MACHINE_CONFIG_END
+ m_maincpu->set_addrmap(AS_PROGRAM, &scobra_state::type2_map);
+}
-MACHINE_CONFIG_START(scobra_state::tazmani3)
+void scobra_state::tazmani3(machine_config &config)
+{
type2(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(tazmani3_map)
-MACHINE_CONFIG_END
+ m_maincpu->set_addrmap(AS_PROGRAM, &scobra_state::tazmani3_map);
+}
-MACHINE_CONFIG_START(scobra_state::stratgyx)
+void scobra_state::stratgyx(machine_config &config)
+{
type2(config);
/* basic machine hardware */
@@ -1020,32 +1021,31 @@ MACHINE_CONFIG_START(scobra_state::stratgyx)
m_palette->set_init(FUNC(scobra_state::stratgyx_palette));
MCFG_VIDEO_START_OVERRIDE(scobra_state,stratgyx)
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(scobra_state::darkplnt)
+void scobra_state::darkplnt(machine_config &config)
+{
type2(config);
- /* basic machine hardware */
-
/* video hardware */
m_palette->set_entries(32+64+2); // 32 for characters, 64 (buffer) for stars, 2 for bullets
m_palette->set_init(FUNC(scobra_state::darkplnt_palette));
MCFG_VIDEO_START_OVERRIDE(scobra_state,darkplnt)
-MACHINE_CONFIG_END
-
+}
-MACHINE_CONFIG_START(scobra_state::hustler)
+void scobra_state::hustler(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, 18432000/6) /* 3.072 MHz */
- MCFG_DEVICE_PROGRAM_MAP(hustler_map)
+ Z80(config, m_maincpu, 18432000/6); /* 3.072 MHz */
+ m_maincpu->set_addrmap(AS_PROGRAM, &scobra_state::hustler_map);
- MCFG_DEVICE_ADD("audiocpu",Z80,14318000/8) /* 1.78975 MHz */
- MCFG_DEVICE_PROGRAM_MAP(hustler_sound_map)
- MCFG_DEVICE_IO_MAP(hustler_sound_io_map)
- MCFG_DEVICE_IRQ_ACKNOWLEDGE_DRIVER(scramble_state,scramble_sh_irq_callback)
+ Z80(config, m_audiocpu, 14318000/8); /* 1.78975 MHz */
+ m_audiocpu->set_addrmap(AS_PROGRAM, &scobra_state::hustler_sound_map);
+ m_audiocpu->set_addrmap(AS_IO, &scobra_state::hustler_sound_io_map);
+ m_audiocpu->set_irq_acknowledge_callback(FUNC(scramble_state::scramble_sh_irq_callback));
ttl7474_device &konami_7474(TTL7474(config, "konami_7474", 0));
konami_7474.comp_output_cb().set(FUNC(scobra_state::scramble_sh_7474_q_callback));
@@ -1058,7 +1058,7 @@ MACHINE_CONFIG_START(scobra_state::hustler)
ttl7474_device &ttl7474_9m_2(TTL7474(config, "7474_9m_2", 0));
ttl7474_9m_2.comp_output_cb().set(FUNC(scobra_state::galaxold_7474_9m_2_q_callback));
- MCFG_TIMER_DRIVER_ADD("int_timer", scobra_state, galaxold_interrupt_timer)
+ TIMER(config, "int_timer").configure_generic(FUNC(scobra_state::galaxold_interrupt_timer));
WATCHDOG_TIMER(config, "watchdog");
@@ -1072,13 +1072,13 @@ MACHINE_CONFIG_START(scobra_state::hustler)
m_ppi8255_1->out_pb_callback().set(FUNC(scramble_state::scramble_sh_irqtrigger_w));
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(16000.0/132/2)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(32*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(scobra_state, screen_update_galaxold)
- MCFG_SCREEN_PALETTE("palette")
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_refresh_hz(16000.0/132/2);
+ m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ m_screen->set_size(32*8, 32*8);
+ m_screen->set_visarea(0*8, 32*8-1, 2*8, 30*8-1);
+ m_screen->set_screen_update(FUNC(scobra_state::screen_update_galaxold));
+ m_screen->set_palette(m_palette);
GFXDECODE(config, "gfxdecode", m_palette, gfx_scobra);
PALETTE(config, m_palette, FUNC(scobra_state::galaxold_palette), 32+64+2); // 32 for characters, 64 for stars, 2 for bullets
@@ -1093,27 +1093,26 @@ MACHINE_CONFIG_START(scobra_state::hustler)
aysnd.port_a_read_callback().set(m_soundlatch, FUNC(generic_latch_8_device::read));
aysnd.port_b_read_callback().set(FUNC(scramble_state::hustler_portB_r));
aysnd.add_route(ALL_OUTPUTS, "mono", 0.33);
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(scobra_state::hustlerb)
+void scobra_state::hustlerb(machine_config &config)
+{
hustler(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(hustlerb_map)
+ m_maincpu->set_addrmap(AS_PROGRAM, &scobra_state::hustlerb_map);
- MCFG_DEVICE_MODIFY("audiocpu")
- MCFG_DEVICE_PROGRAM_MAP(hustlerb_sound_map)
- MCFG_DEVICE_IO_MAP(hustlerb_sound_io_map)
-MACHINE_CONFIG_END
+ m_audiocpu->set_addrmap(AS_PROGRAM, &scobra_state::hustlerb_sound_map);
+ m_audiocpu->set_addrmap(AS_IO, &scobra_state::hustlerb_sound_io_map);
+}
-MACHINE_CONFIG_START(scobra_state::hustlerb4)
+void scobra_state::hustlerb4(machine_config &config)
+{
hustler(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(hustlerb_map)
-MACHINE_CONFIG_END
+ m_maincpu->set_addrmap(AS_PROGRAM, &scobra_state::hustlerb_map);
+}
diff --git a/src/mame/drivers/scopus.cpp b/src/mame/drivers/scopus.cpp
index 4a3fc845596..95b35269492 100644
--- a/src/mame/drivers/scopus.cpp
+++ b/src/mame/drivers/scopus.cpp
@@ -173,13 +173,13 @@ READ8_MEMBER(sagitta180_state::memory_read_byte)
return prog_space.read_byte(offset);
}
-MACHINE_CONFIG_START(sagitta180_state::sagitta180)
-
+void sagitta180_state::sagitta180(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", I8080, XTAL(10'000'000)) /* guessed ! */
- MCFG_DEVICE_PROGRAM_MAP(maincpu_map)
- MCFG_DEVICE_IO_MAP(maincpu_io_map)
-// MCFG_DEVICE_IRQ_ACKNOWLEDGE_DEVICE("intlatch", i8212_device, inta_cb)
+ I8080(config, m_maincpu, XTAL(10'000'000)); /* guessed ! */
+ m_maincpu->set_addrmap(AS_PROGRAM, &sagitta180_state::maincpu_map);
+ m_maincpu->set_addrmap(AS_IO, &sagitta180_state::maincpu_io_map);
+// m_maincpu->set_irq_acknowledge_callback("intlatch", FUNC(i8212_device::inta_cb));
I8257(config, m_dma8257, XTAL(14'745'600)); /* guessed xtal */
m_dma8257->out_iow_cb<2>().set("crtc", FUNC(i8275_device::dack_w));
@@ -200,29 +200,29 @@ MACHINE_CONFIG_START(sagitta180_state::sagitta180)
uart_clock.signal_handler().set("uart", FUNC(i8251_device::write_txc));
uart_clock.signal_handler().append("uart", FUNC(i8251_device::write_rxc));
-// MCFG_DEVICE_ADD("intlatch", I8212, 0)
-// MCFG_I8212_MD_CALLBACK(GND) // guessed !
-// MCFG_I8212_DI_CALLBACK(READ8("picu", i8214_device, vector_r))
-// MCFG_I8212_INT_CALLBACK(INPUTLINE("maincpu", I8085_INTR_LINE)) // guessed !
+// i8212_device &intlatch(I8212(config, "intlatch", 0));
+// intlatch.md_rd_callback().set_constant(GND); // guessed !
+// intlatch.di_rd_callback().set("picu", FUNC(i8214_device::vector_r));
+// intlatch.int_wr_callback().set_inputline("maincpu", I8085_INTR_LINE); // guessed !
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_UPDATE_DEVICE("crtc", i8275_device, screen_update)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */
- MCFG_SCREEN_SIZE(80*5, 25*8)
- MCFG_SCREEN_VISIBLE_AREA(0, 80*5-1, 0, 25*8-1)
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_sagitta180 )
-
- MCFG_DEVICE_ADD("crtc", I8275, 12480000 / 8) /* guessed xtal */
- MCFG_I8275_CHARACTER_WIDTH(8)
- MCFG_I8275_DRAW_CHARACTER_CALLBACK_OWNER(sagitta180_state, crtc_display_pixels)
- MCFG_I8275_DRQ_CALLBACK(WRITELINE("dma" , i8257_device , dreq2_w))
- MCFG_I8275_IRQ_CALLBACK(INPUTLINE("maincpu" , I8085_INTR_LINE))
- MCFG_VIDEO_SET_SCREEN("screen")
- MCFG_PALETTE_ADD("palette", 3)
-
-MACHINE_CONFIG_END
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_screen_update("crtc", FUNC(i8275_device::screen_update));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */
+ screen.set_size(80*5, 25*8);
+ screen.set_visarea(0, 80*5-1, 0, 25*8-1);
+ GFXDECODE(config, "gfxdecode", m_palette, gfx_sagitta180);
+
+ I8275(config, m_crtc, 12480000 / 8); /* guessed xtal */
+ m_crtc->set_character_width(8);
+ m_crtc->set_display_callback(FUNC(sagitta180_state::crtc_display_pixels), this);
+ m_crtc->drq_wr_callback().set(m_dma8257, FUNC(i8257_device::dreq2_w));
+ m_crtc->irq_wr_callback().set_inputline(m_maincpu, I8085_INTR_LINE);
+ m_crtc->set_screen("screen");
+
+ PALETTE(config, m_palette).set_entries(3);
+}
ROM_START( sagitta180 )
diff --git a/src/mame/drivers/scorpion.cpp b/src/mame/drivers/scorpion.cpp
index 4fb403cbeb1..d88d0f09ca9 100644
--- a/src/mame/drivers/scorpion.cpp
+++ b/src/mame/drivers/scorpion.cpp
@@ -292,36 +292,39 @@ static GFXDECODE_START( gfx_quorum )
GFXDECODE_ENTRY( "maincpu", 0x1fb00, quorum_charlayout, 0, 8 )
GFXDECODE_END
-MACHINE_CONFIG_START(scorpion_state::scorpion)
+void scorpion_state::scorpion(machine_config &config)
+{
spectrum_128(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(scorpion_mem)
- MCFG_DEVICE_IO_MAP(scorpion_io)
- MCFG_DEVICE_OPCODES_MAP(scorpion_switch)
+
+ m_maincpu->set_addrmap(AS_PROGRAM, &scorpion_state::scorpion_mem);
+ m_maincpu->set_addrmap(AS_IO, &scorpion_state::scorpion_io);
+ m_maincpu->set_addrmap(AS_OPCODES, &scorpion_state::scorpion_switch);
MCFG_MACHINE_START_OVERRIDE(scorpion_state, scorpion )
MCFG_MACHINE_RESET_OVERRIDE(scorpion_state, scorpion )
- MCFG_GFXDECODE_MODIFY("gfxdecode", gfx_scorpion)
+ subdevice<gfxdecode_device>("gfxdecode")->set_info(gfx_scorpion);
BETA_DISK(config, m_beta, 0);
/* internal ram */
m_ram->set_default_size("256K");
- MCFG_TIMER_DRIVER_ADD_PERIODIC("nmi_timer", scorpion_state, nmi_check_callback, attotime::from_hz(50))
+ TIMER(config, "nmi_timer").configure_periodic(FUNC(scorpion_state::nmi_check_callback), attotime::from_hz(50));
- MCFG_DEVICE_REMOVE("exp")
-MACHINE_CONFIG_END
+ config.device_remove("exp");
+}
-MACHINE_CONFIG_START(scorpion_state::profi)
+void scorpion_state::profi(machine_config &config)
+{
scorpion(config);
- MCFG_GFXDECODE_MODIFY("gfxdecode", gfx_profi)
-MACHINE_CONFIG_END
+ subdevice<gfxdecode_device>("gfxdecode")->set_info(gfx_profi);
+}
-MACHINE_CONFIG_START(scorpion_state::quorum)
+void scorpion_state::quorum(machine_config &config)
+{
scorpion(config);
- MCFG_GFXDECODE_MODIFY("gfxdecode", gfx_quorum)
-MACHINE_CONFIG_END
+ subdevice<gfxdecode_device>("gfxdecode")->set_info(gfx_quorum);
+}
diff --git a/src/mame/drivers/scotrsht.cpp b/src/mame/drivers/scotrsht.cpp
index 90db90d1fd0..b8685aacfac 100644
--- a/src/mame/drivers/scotrsht.cpp
+++ b/src/mame/drivers/scotrsht.cpp
@@ -187,27 +187,27 @@ static GFXDECODE_START( gfx_scotrsht )
GFXDECODE_ENTRY( "gfx2", 0, spritelayout, 16*16*8, 16*8 ) /* sprites */
GFXDECODE_END
-MACHINE_CONFIG_START(scotrsht_state::scotrsht)
-
+void scotrsht_state::scotrsht(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", MC6809E, 18432000/6) /* 3.072 MHz */
- MCFG_DEVICE_PROGRAM_MAP(scotrsht_map)
+ MC6809E(config, m_maincpu, 18432000/6); /* 3.072 MHz */
+ m_maincpu->set_addrmap(AS_PROGRAM, &scotrsht_state::scotrsht_map);
- MCFG_DEVICE_ADD("audiocpu", Z80, 18432000/6) /* 3.072 MHz */
- MCFG_DEVICE_PROGRAM_MAP(scotrsht_sound_map)
- MCFG_DEVICE_IO_MAP(scotrsht_sound_port)
+ Z80(config, m_audiocpu, 18432000/6); /* 3.072 MHz */
+ m_audiocpu->set_addrmap(AS_PROGRAM, &scotrsht_state::scotrsht_sound_map);
+ m_audiocpu->set_addrmap(AS_IO, &scotrsht_state::scotrsht_sound_port);
WATCHDOG_TIMER(config, "watchdog");
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(32*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(scotrsht_state, screen_update)
- MCFG_SCREEN_PALETTE(m_palette)
- MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE(*this, scotrsht_state, vblank_irq))
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(32*8, 32*8);
+ screen.set_visarea(0*8, 32*8-1, 2*8, 30*8-1);
+ screen.set_screen_update(FUNC(scotrsht_state::screen_update));
+ screen.set_palette(m_palette);
+ screen.screen_vblank().set(FUNC(scotrsht_state::vblank_irq));
GFXDECODE(config, m_gfxdecode, m_palette, gfx_scotrsht);
PALETTE(config, m_palette, FUNC(scotrsht_state::scotrsht_palette), 16*8*16+16*8*16, 256);
@@ -217,9 +217,8 @@ MACHINE_CONFIG_START(scotrsht_state::scotrsht)
GENERIC_LATCH_8(config, m_soundlatch);
- MCFG_DEVICE_ADD("ymsnd", YM2203, 18432000/6)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.40)
-MACHINE_CONFIG_END
+ YM2203(config, "ymsnd", 18432000/6).add_route(ALL_OUTPUTS, "mono", 0.40);
+}
/***************************************************************************
diff --git a/src/mame/drivers/scramble.cpp b/src/mame/drivers/scramble.cpp
index ef27e13b754..7ba5e5890bb 100644
--- a/src/mame/drivers/scramble.cpp
+++ b/src/mame/drivers/scramble.cpp
@@ -1302,16 +1302,16 @@ GFXDECODE_END
/**************************************************************************/
-MACHINE_CONFIG_START(scramble_state::scramble)
-
+void scramble_state::scramble(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, 18432000/6) /* 3.072 MHz */
- MCFG_DEVICE_PROGRAM_MAP(scramble_map)
+ Z80(config, m_maincpu, 18432000/6); /* 3.072 MHz */
+ m_maincpu->set_addrmap(AS_PROGRAM, &scramble_state::scramble_map);
- MCFG_DEVICE_ADD("audiocpu", Z80, 14318000/8) /* 1.78975 MHz */
- MCFG_DEVICE_PROGRAM_MAP(scramble_sound_map)
- MCFG_DEVICE_IO_MAP(scramble_sound_io_map)
- MCFG_DEVICE_IRQ_ACKNOWLEDGE_DRIVER(scramble_state,scramble_sh_irq_callback)
+ Z80(config, m_audiocpu, 14318000/8); /* 1.78975 MHz */
+ m_audiocpu->set_addrmap(AS_PROGRAM, &scramble_state::scramble_sound_map);
+ m_audiocpu->set_addrmap(AS_IO, &scramble_state::scramble_sound_io_map);
+ m_audiocpu->set_irq_acknowledge_callback(FUNC(scramble_state::scramble_sh_irq_callback));
ttl7474_device &ttl7474_9m_1(TTL7474(config, "7474_9m_1", 0));
ttl7474_9m_1.output_cb().set(FUNC(scramble_state::galaxold_7474_9m_1_callback));
@@ -1322,7 +1322,7 @@ MACHINE_CONFIG_START(scramble_state::scramble)
ttl7474_device &konami_7474(TTL7474(config, "konami_7474", 0));
konami_7474.comp_output_cb().set(FUNC(scramble_state::scramble_sh_7474_q_callback));
- MCFG_TIMER_DRIVER_ADD("int_timer", scramble_state, galaxold_interrupt_timer)
+ TIMER(config, "int_timer").configure_generic(FUNC(scramble_state::galaxold_interrupt_timer));
WATCHDOG_TIMER(config, "watchdog");
@@ -1338,13 +1338,13 @@ MACHINE_CONFIG_START(scramble_state::scramble)
m_ppi8255_1->out_pb_callback().set(FUNC(scramble_state::scramble_sh_irqtrigger_w));
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(16000.0/132/2)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(32*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(scramble_state, screen_update_galaxold)
- MCFG_SCREEN_PALETTE("palette")
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_refresh_hz(16000.0/132/2);
+ m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ m_screen->set_size(32*8, 32*8);
+ m_screen->set_visarea(0*8, 32*8-1, 2*8, 30*8-1);
+ m_screen->set_screen_update(FUNC(scramble_state::screen_update_galaxold));
+ m_screen->set_palette(m_palette);
GFXDECODE(config, "gfxdecode", m_palette, gfx_scramble);
PALETTE(config, m_palette, FUNC(scramble_state::scrambold_palette), 32+64+2+1); // 32 for characters, 64 for stars, 2 for bullets, 0/1 for background
@@ -1362,14 +1362,14 @@ MACHINE_CONFIG_START(scramble_state::scramble)
ay2.port_a_read_callback().set(m_soundlatch, FUNC(generic_latch_8_device::read));
ay2.port_b_read_callback().set(FUNC(scramble_state::scramble_portB_r));
ay2.add_route(ALL_OUTPUTS, "mono", 0.16);
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(scramble_state::mars)
+void scramble_state::mars(machine_config &config)
+{
scramble(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(mars_map)
+ m_maincpu->set_addrmap(AS_PROGRAM, &scramble_state::mars_map);
m_ppi8255_1->out_pa_callback().set(m_soundlatch, FUNC(generic_latch_8_device::write));
m_ppi8255_1->out_pb_callback().set(FUNC(scramble_state::scramble_sh_irqtrigger_w));
@@ -1378,42 +1378,42 @@ MACHINE_CONFIG_START(scramble_state::mars)
/* video hardware */
m_palette->set_entries(32+64+2+0); // 32 for characters, 64 for stars, 2 for bullets, 0/1 for background
m_palette->set_init(FUNC(scramble_state::galaxold_palette));
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(scramble_state::devilfsh)
+void scramble_state::devilfsh(machine_config &config)
+{
scramble(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(mars_map)
+ m_maincpu->set_addrmap(AS_PROGRAM, &scramble_state::mars_map);
/* video hardware */
- MCFG_GFXDECODE_MODIFY("gfxdecode", gfx_devilfsh)
+ subdevice<gfxdecode_device>("gfxdecode")->set_info(gfx_devilfsh);
m_palette->set_entries(32+64+2+0); // 32 for characters, 64 for stars, 2 for bullets, 0/1 for background
m_palette->set_init(FUNC(scramble_state::galaxold_palette));
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(scramble_state::newsin7)
+void scramble_state::newsin7(machine_config &config)
+{
scramble(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(newsin7_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", scramble_state, irq0_line_hold) // newsin7a has a corrupt opcode at 0x67, the irq routine instead of NMI avoids it by jumping to 0x68 after doing some other things, probably intentional. newsin7 has this fixed, maybe a bootleg?
+ m_maincpu->set_addrmap(AS_PROGRAM, &scramble_state::newsin7_map);
+ m_maincpu->set_vblank_int("screen", FUNC(scramble_state::irq0_line_hold)); // newsin7a has a corrupt opcode at 0x67, the irq routine instead of NMI avoids it by jumping to 0x68 after doing some other things, probably intentional. newsin7 has this fixed, maybe a bootleg?
/* video hardware */
- MCFG_GFXDECODE_MODIFY("gfxdecode", gfx_newsin7)
+ subdevice<gfxdecode_device>("gfxdecode")->set_info(gfx_newsin7);
m_palette->set_entries(32+64+2+0); // 32 for characters, 64 for stars, 2 for bullets, 0/1 for background
m_palette->set_init(FUNC(scramble_state::galaxold_palette));
MCFG_VIDEO_START_OVERRIDE(scramble_state,newsin7)
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(scramble_state::mrkougb)
+void scramble_state::mrkougb(machine_config &config)
+{
scramble(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(mrkougar_map)
+ m_maincpu->set_addrmap(AS_PROGRAM, &scramble_state::mrkougar_map);
m_ppi8255_1->out_pa_callback().set(m_soundlatch, FUNC(generic_latch_8_device::write));
m_ppi8255_1->out_pb_callback().set(FUNC(scramble_state::mrkougar_sh_irqtrigger_w));
@@ -1422,40 +1422,40 @@ MACHINE_CONFIG_START(scramble_state::mrkougb)
/* video hardware */
m_palette->set_entries(32+64+2+0); // 32 for characters, 64 for stars, 2 for bullets, 0/1 for background
m_palette->set_init(FUNC(scramble_state::galaxold_palette));
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(scramble_state::mrkougar)
+void scramble_state::mrkougar(machine_config &config)
+{
mrkougb(config);
/* video hardware */
- MCFG_GFXDECODE_MODIFY("gfxdecode", gfx_mrkougar)
-MACHINE_CONFIG_END
+ subdevice<gfxdecode_device>("gfxdecode")->set_info(gfx_mrkougar);
+}
-MACHINE_CONFIG_START(scramble_state::ckongs)
+void scramble_state::ckongs(machine_config &config)
+{
scramble(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(ckongs_map)
+ m_maincpu->set_addrmap(AS_PROGRAM, &scramble_state::ckongs_map);
/* video hardware */
m_palette->set_entries(32+64+2+0); // 32 for characters, 64 for stars, 2 for bullets, 0/1 for background
m_palette->set_init(FUNC(scramble_state::galaxold_palette));
MCFG_VIDEO_START_OVERRIDE(scramble_state,ckongs)
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(scramble_state::hotshock)
+void scramble_state::hotshock(machine_config &config)
+{
scramble(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(hotshock_map)
+ m_maincpu->set_addrmap(AS_PROGRAM, &scramble_state::hotshock_map);
- MCFG_DEVICE_REMOVE( "ppi8255_0" )
- MCFG_DEVICE_REMOVE( "ppi8255_1" )
+ config.device_remove( "ppi8255_0" );
+ config.device_remove( "ppi8255_1" );
- MCFG_DEVICE_MODIFY("audiocpu")
- MCFG_DEVICE_IO_MAP(hotshock_sound_io_map)
+ m_audiocpu->set_addrmap(AS_IO, &scramble_state::hotshock_sound_io_map);
MCFG_MACHINE_RESET_OVERRIDE(scramble_state,galaxold)
@@ -1470,9 +1470,10 @@ MACHINE_CONFIG_START(scramble_state::hotshock)
subdevice<ay8910_device>("8910.2")->port_a_read_callback().set(FUNC(scramble_state::hotshock_soundlatch_r));
subdevice<ay8910_device>("8910.2")->reset_routes();
subdevice<ay8910_device>("8910.2")->add_route(ALL_OUTPUTS, "mono", 0.33);
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(scramble_state::cavelon)
+void scramble_state::cavelon(machine_config &config)
+{
scramble(config);
/* basic machine hardware */
@@ -1481,61 +1482,58 @@ MACHINE_CONFIG_START(scramble_state::cavelon)
m_palette->set_entries(32+64+2+0); // 32 for characters, 64 for stars, 2 for bullets, 0/1 for background
m_palette->set_init(FUNC(scramble_state::galaxold_palette));
MCFG_VIDEO_START_OVERRIDE(scramble_state,ckongs)
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(scramble_state::mimonscr)
+void scramble_state::mimonscr(machine_config &config)
+{
scramble(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(mimonscr_map)
+ m_maincpu->set_addrmap(AS_PROGRAM, &scramble_state::mimonscr_map);
/* video hardware */
MCFG_VIDEO_START_OVERRIDE(scramble_state,mimonkey)
-MACHINE_CONFIG_END
+}
/* Triple Punch and Mariner are different - only one CPU, one 8910 */
-MACHINE_CONFIG_START(scramble_state::triplep)
+void scramble_state::triplep(machine_config &config)
+{
scramble(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(triplep_map)
- MCFG_DEVICE_IO_MAP(triplep_io_map)
+ m_maincpu->set_addrmap(AS_PROGRAM, &scramble_state::triplep_map);
+ m_maincpu->set_addrmap(AS_IO, &scramble_state::triplep_io_map);
- MCFG_DEVICE_REMOVE("audiocpu")
- MCFG_DEVICE_REMOVE("ppi8255_1")
- MCFG_DEVICE_REMOVE("konami_7474")
+ config.device_remove("audiocpu");
+ config.device_remove("ppi8255_1");
+ config.device_remove("konami_7474");
/* video hardware */
m_palette->set_entries(32+64+2+0); // 32 for characters, 64 for stars, 2 for bullets
m_palette->set_init(FUNC(scramble_state::galaxold_palette));
/* sound hardware */
- MCFG_DEVICE_MODIFY("8910.1")
- MCFG_DEVICE_CLOCK(18432000/12) // triple punch/knock out ay clock is 1.535MHz, derived from main cpu xtal; verified on hardware
-
-
- MCFG_SOUND_ROUTES_RESET()
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
+ subdevice<ay8910_device>("8910.1")->set_clock(18432000/12); // triple punch/knock out ay clock is 1.535MHz, derived from main cpu xtal; verified on hardware
+ subdevice<ay8910_device>("8910.1")->reset_routes();
+ subdevice<ay8910_device>("8910.1")->add_route(ALL_OUTPUTS, "mono", 1.0);
- MCFG_DEVICE_REMOVE("8910.2")
-MACHINE_CONFIG_END
+ config.device_remove("8910.2");
+}
-MACHINE_CONFIG_START(scramble_state::mariner)
+void scramble_state::mariner(machine_config &config)
+{
triplep(config);
- /* basic machine hardware */
-
/* video hardware */
m_palette->set_entries(32+64+2+16); // 32 for characters, 64 for stars, 2 for bullets, 16 for background
m_palette->set_init(FUNC(scramble_state::mariner_palette));
MCFG_VIDEO_START_OVERRIDE(scramble_state,mariner)
-MACHINE_CONFIG_END
+}
/* Hunchback replaces the Z80 with a S2650 CPU */
-MACHINE_CONFIG_START(scramble_state::hunchbks)
+void scramble_state::hunchbks(machine_config &config)
+{
scramble(config);
/* basic machine hardware */
@@ -1545,28 +1543,28 @@ MACHINE_CONFIG_START(scramble_state::hunchbks)
maincpu.sense_handler().set("screen", FUNC(screen_device::vblank));
maincpu.set_vblank_int("screen", FUNC(scramble_state::hunchbks_vh_interrupt));
- MCFG_SCREEN_MODIFY("screen")
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500))
+ m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(2500));
/* video hardware */
m_palette->set_entries(32+64+2+0); // 32 for characters, 64 for stars, 2 for bullets
m_palette->set_init(FUNC(scramble_state::galaxold_palette));
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(scramble_state::hncholms)
+void scramble_state::hncholms(machine_config &config)
+{
hunchbks(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_CLOCK(18432000/6/2/2)
+ m_maincpu->set_clock(18432000/6/2/2);
MCFG_VIDEO_START_OVERRIDE(scramble_state,scorpion)
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(scramble_state::ad2083)
+void scramble_state::ad2083(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, 18432000/6) /* 3.072 MHz */
- MCFG_DEVICE_PROGRAM_MAP(ad2083_map)
+ Z80(config, m_maincpu, 18432000/6); /* 3.072 MHz */
+ m_maincpu->set_addrmap(AS_PROGRAM, &scramble_state::ad2083_map);
ttl7474_device &ttl7474_9m_1(TTL7474(config, "7474_9m_1", 0));
ttl7474_9m_1.output_cb().set(FUNC(scramble_state::galaxold_7474_9m_1_callback));
@@ -1577,20 +1575,20 @@ MACHINE_CONFIG_START(scramble_state::ad2083)
ttl7474_device &konami_7474(TTL7474(config, "konami_7474", 0));
konami_7474.comp_output_cb().set(FUNC(scramble_state::scramble_sh_7474_q_callback));
- MCFG_TIMER_DRIVER_ADD("int_timer", scramble_state, galaxold_interrupt_timer)
+ TIMER(config, "int_timer").configure_generic(FUNC(scramble_state::galaxold_interrupt_timer));
WATCHDOG_TIMER(config, "watchdog");
MCFG_MACHINE_RESET_OVERRIDE(scramble_state,galaxold)
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(16000.0/132/2)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(32*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(scramble_state, screen_update_galaxold)
- MCFG_SCREEN_PALETTE(m_palette)
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_refresh_hz(16000.0/132/2);
+ m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ m_screen->set_size(32*8, 32*8);
+ m_screen->set_visarea(0*8, 32*8-1, 2*8, 30*8-1);
+ m_screen->set_screen_update(FUNC(scramble_state::screen_update_galaxold));
+ m_screen->set_palette(m_palette);
GFXDECODE(config, "gfxdecode", m_palette, gfx_ad2083);
PALETTE(config, m_palette, FUNC(scramble_state::turtles_palette), 32+64+2+8); // 32 for characters, 64 for stars, 2 for bullets, 8 for background
@@ -1601,20 +1599,19 @@ MACHINE_CONFIG_START(scramble_state::ad2083)
ad2083_audio(config);
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(scramble_state::harem)
+void scramble_state::harem(machine_config &config)
+{
scramble(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(harem_map)
- MCFG_DEVICE_OPCODES_MAP(decrypted_opcodes_map)
+ m_maincpu->set_addrmap(AS_PROGRAM, &scramble_state::harem_map);
+ m_maincpu->set_addrmap(AS_OPCODES, &scramble_state::decrypted_opcodes_map);
- MCFG_DEVICE_MODIFY("audiocpu")
- MCFG_DEVICE_PROGRAM_MAP(harem_sound_map)
- MCFG_DEVICE_IO_MAP(harem_sound_io_map)
+ m_audiocpu->set_addrmap(AS_PROGRAM, &scramble_state::harem_sound_map);
+ m_audiocpu->set_addrmap(AS_IO, &scramble_state::harem_sound_io_map);
MCFG_VIDEO_START_OVERRIDE(scramble_state,harem)
@@ -1625,7 +1622,7 @@ MACHINE_CONFIG_START(scramble_state::harem)
ay3.port_b_write_callback().set(FUNC(scramble_state::harem_digitalker_control_w));
DIGITALKER(config, m_digitalker, 4000000).add_route(ALL_OUTPUTS, "mono", 0.16);
-MACHINE_CONFIG_END
+}
/***************************************************************************
diff --git a/src/mame/drivers/scregg.cpp b/src/mame/drivers/scregg.cpp
index b7a536a629e..b8bc7a411a1 100644
--- a/src/mame/drivers/scregg.cpp
+++ b/src/mame/drivers/scregg.cpp
@@ -269,21 +269,21 @@ MACHINE_RESET_MEMBER(scregg_state,scregg)
m_btime_tilemap[3] = 0;
}
-MACHINE_CONFIG_START(scregg_state::dommy)
-
+void scregg_state::dommy(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M6502, XTAL(12'000'000)/8)
- MCFG_DEVICE_PROGRAM_MAP(dommy_map)
- MCFG_TIMER_DRIVER_ADD_SCANLINE("irq", scregg_state, scregg_interrupt, "screen", 0, 8)
+ M6502(config, m_maincpu, XTAL(12'000'000)/8);
+ m_maincpu->set_addrmap(AS_PROGRAM, &scregg_state::dommy_map);
+ TIMER(config, "irq").configure_scanline(FUNC(scregg_state::scregg_interrupt), "screen", 0, 8);
MCFG_MACHINE_START_OVERRIDE(scregg_state,scregg)
MCFG_MACHINE_RESET_OVERRIDE(scregg_state,scregg)
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_RAW_PARAMS(XTAL(12'000'000)/2, 384, 8, 248, 272, 8, 248)
- MCFG_SCREEN_UPDATE_DRIVER(scregg_state, screen_update_eggs)
- MCFG_SCREEN_PALETTE(m_palette)
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_raw(XTAL(12'000'000)/2, 384, 8, 248, 272, 8, 248);
+ m_screen->set_screen_update(FUNC(scregg_state::screen_update_eggs));
+ m_screen->set_palette(m_palette);
GFXDECODE(config, m_gfxdecode, m_palette, gfx_scregg);
PALETTE(config, m_palette, FUNC(scregg_state::btime_palette), 8);
@@ -294,24 +294,24 @@ MACHINE_CONFIG_START(scregg_state::dommy)
AY8910(config, "ay1", XTAL(12'000'000)/8).add_route(ALL_OUTPUTS, "mono", 0.23);
AY8910(config, "ay2", XTAL(12'000'000)/8).add_route(ALL_OUTPUTS, "mono", 0.23);
-MACHINE_CONFIG_END
-
+}
-MACHINE_CONFIG_START(scregg_state::scregg)
+void scregg_state::scregg(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M6502, XTAL(12'000'000)/8)
- MCFG_DEVICE_PROGRAM_MAP(eggs_map)
- MCFG_TIMER_DRIVER_ADD_SCANLINE("irq", scregg_state, scregg_interrupt, "screen", 0, 8)
+ M6502(config, m_maincpu, XTAL(12'000'000)/8);
+ m_maincpu->set_addrmap(AS_PROGRAM, &scregg_state::eggs_map);
+ TIMER(config, "irq").configure_scanline(FUNC(scregg_state::scregg_interrupt), "screen", 0, 8);
MCFG_MACHINE_START_OVERRIDE(scregg_state,scregg)
MCFG_MACHINE_RESET_OVERRIDE(scregg_state,scregg)
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_RAW_PARAMS(XTAL(12'000'000)/2, 384, 8, 248, 272, 8, 248)
- MCFG_SCREEN_UPDATE_DRIVER(scregg_state, screen_update_eggs)
- MCFG_SCREEN_PALETTE(m_palette)
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_raw(XTAL(12'000'000)/2, 384, 8, 248, 272, 8, 248);
+ m_screen->set_screen_update(FUNC(scregg_state::screen_update_eggs));
+ m_screen->set_palette(m_palette);
GFXDECODE(config, m_gfxdecode, m_palette, gfx_scregg);
PALETTE(config, m_palette, FUNC(scregg_state::btime_palette), 8);
@@ -322,7 +322,7 @@ MACHINE_CONFIG_START(scregg_state::scregg)
AY8910(config, "ay1", XTAL(12'000'000)/8).add_route(ALL_OUTPUTS, "mono", 0.23);
AY8910(config, "ay2", XTAL(12'000'000)/8).add_route(ALL_OUTPUTS, "mono", 0.23);
-MACHINE_CONFIG_END
+}
ROM_START( dommy )
diff --git a/src/mame/drivers/scv.cpp b/src/mame/drivers/scv.cpp
index 265ed7302a6..9c39e51a7d4 100644
--- a/src/mame/drivers/scv.cpp
+++ b/src/mame/drivers/scv.cpp
@@ -649,8 +649,8 @@ static void scv_cart(device_slot_interface &device)
device.option_add_internal("rom128k_ram", SCV_ROM128K_RAM4K);
}
-MACHINE_CONFIG_START(scv_state::scv)
-
+void scv_state::scv(machine_config &config)
+{
upd7801_device &upd(UPD7801(config, m_maincpu, 4_MHz_XTAL));
upd.set_addrmap(AS_PROGRAM, &scv_state::scv_mem);
upd.pa_out_cb().set(FUNC(scv_state::porta_w));
@@ -664,7 +664,7 @@ MACHINE_CONFIG_START(scv_state::scv)
m_screen->set_screen_update(FUNC(scv_state::screen_update_scv));
m_screen->set_palette("palette");
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_scv)
+ GFXDECODE(config, "gfxdecode", "palette", gfx_scv);
PALETTE(config, "palette", FUNC(scv_state::scv_palette), 16);
/* Sound is generated by UPD1771C clocked at XTAL(6'000'000) */
@@ -673,11 +673,11 @@ MACHINE_CONFIG_START(scv_state::scv)
m_upd1771c->ack_handler().set(FUNC(scv_state::upd1771_ack_w));
m_upd1771c->add_route(ALL_OUTPUTS, "mono", 1.00);
- MCFG_SCV_CARTRIDGE_ADD("cartslot", scv_cart, nullptr)
+ SCV_CART_SLOT(config, m_cart, scv_cart, nullptr);
/* Software lists */
- MCFG_SOFTWARE_LIST_ADD("cart_list","scv")
-MACHINE_CONFIG_END
+ SOFTWARE_LIST(config, "cart_list").set_original("scv");
+}
void scv_state::scv_pal(machine_config &config)
diff --git a/src/mame/drivers/scyclone.cpp b/src/mame/drivers/scyclone.cpp
index 44f69db6679..020e76915c5 100644
--- a/src/mame/drivers/scyclone.cpp
+++ b/src/mame/drivers/scyclone.cpp
@@ -655,14 +655,12 @@ void scyclone_state::scyclone(machine_config &config)
DAC_8BIT_R2R(config, "dac", 0).add_route(ALL_OUTPUTS, "speaker", 0.25); // unknown DAC
voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref", 0));
- vref.set_output(5.0);
vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT);
vref.add_route(0, "dac", -1.0, DAC_VREF_NEG_INPUT);
DAC_8BIT_R2R(config, "dac2", 0).add_route(ALL_OUTPUTS, "speaker", 0.25); // unknown DAC
voltage_regulator_device &vref2(VOLTAGE_REGULATOR(config, "vref2", 0));
- vref2.set_output(5.0);
vref2.add_route(0, "dac2", 1.0, DAC_VREF_POS_INPUT);
vref2.add_route(0, "dac2", -1.0, DAC_VREF_NEG_INPUT);
}
diff --git a/src/mame/drivers/sderby.cpp b/src/mame/drivers/sderby.cpp
index 4ea8bbb14ef..4ab2643c85c 100644
--- a/src/mame/drivers/sderby.cpp
+++ b/src/mame/drivers/sderby.cpp
@@ -599,149 +599,143 @@ GFXDECODE_END
* Machine Drivers *
****************************/
-MACHINE_CONFIG_START(sderby_state::sderby)
-
- MCFG_DEVICE_ADD("maincpu", M68000, 12000000)
- MCFG_DEVICE_PROGRAM_MAP(sderby_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", sderby_state, irq2_line_hold)
+void sderby_state::sderby(machine_config &config)
+{
+ M68000(config, m_maincpu, 12000000);
+ m_maincpu->set_addrmap(AS_PROGRAM, &sderby_state::sderby_map);
+ m_maincpu->set_vblank_int("screen", FUNC(sderby_state::irq2_line_hold));
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(64*8, 64*8)
- MCFG_SCREEN_VISIBLE_AREA(4*8, 44*8-1, 3*8, 33*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(sderby_state, screen_update_sderby)
- MCFG_SCREEN_PALETTE(m_palette)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(64*8, 64*8);
+ screen.set_visarea(4*8, 44*8-1, 3*8, 33*8-1);
+ screen.set_screen_update(FUNC(sderby_state::screen_update_sderby));
+ screen.set_palette(m_palette);
GFXDECODE(config, m_gfxdecode, m_palette, gfx_sderby);
PALETTE(config, m_palette).set_format(palette_device::RGBx_555, 0x1000);
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("oki", OKIM6295, 1056000, okim6295_device::PIN7_HIGH) /* clock frequency & pin 7 not verified */
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
-MACHINE_CONFIG_END
-
-MACHINE_CONFIG_START(sderby_state::sderbya)
+ OKIM6295(config, "oki", 1056000, okim6295_device::PIN7_HIGH).add_route(ALL_OUTPUTS, "mono", 1.0); /* clock frequency & pin 7 not verified */
+}
- MCFG_DEVICE_ADD("maincpu", M68000, 12000000)
- MCFG_DEVICE_PROGRAM_MAP(sderbya_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", sderby_state, irq2_line_hold)
+void sderby_state::sderbya(machine_config &config)
+{
+ M68000(config, m_maincpu, 12000000);
+ m_maincpu->set_addrmap(AS_PROGRAM, &sderby_state::sderbya_map);
+ m_maincpu->set_vblank_int("screen", FUNC(sderby_state::irq2_line_hold));
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(64*8, 64*8)
- MCFG_SCREEN_VISIBLE_AREA(4*8, 44*8-1, 3*8, 33*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(sderby_state, screen_update_sderby)
- MCFG_SCREEN_PALETTE(m_palette)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(64*8, 64*8);
+ screen.set_visarea(4*8, 44*8-1, 3*8, 33*8-1);
+ screen.set_screen_update(FUNC(sderby_state::screen_update_sderby));
+ screen.set_palette(m_palette);
GFXDECODE(config, m_gfxdecode, m_palette, gfx_sderby);
PALETTE(config, m_palette).set_format(palette_device::RGBx_555, 0x1000);
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("oki", OKIM6295, 1056000, okim6295_device::PIN7_HIGH) /* clock frequency & pin 7 not verified */
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
-MACHINE_CONFIG_END
-
-MACHINE_CONFIG_START(sderby_state::luckboom)
+ OKIM6295(config, "oki", 1056000, okim6295_device::PIN7_HIGH).add_route(ALL_OUTPUTS, "mono", 1.0); /* clock frequency & pin 7 not verified */
+}
- MCFG_DEVICE_ADD("maincpu", M68000, 12000000)
- MCFG_DEVICE_PROGRAM_MAP(luckboom_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", sderby_state, irq4_line_hold)
+void sderby_state::luckboom(machine_config &config)
+{
+ M68000(config, m_maincpu, 12000000);
+ m_maincpu->set_addrmap(AS_PROGRAM, &sderby_state::luckboom_map);
+ m_maincpu->set_vblank_int("screen", FUNC(sderby_state::irq4_line_hold));
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(64*8, 64*8)
- MCFG_SCREEN_VISIBLE_AREA(4*8, 44*8-1, 3*8, 33*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(sderby_state, screen_update_sderby)
- MCFG_SCREEN_PALETTE(m_palette)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(64*8, 64*8);
+ screen.set_visarea(4*8, 44*8-1, 3*8, 33*8-1);
+ screen.set_screen_update(FUNC(sderby_state::screen_update_sderby));
+ screen.set_palette(m_palette);
GFXDECODE(config, m_gfxdecode, m_palette, gfx_sderby);
PALETTE(config, m_palette).set_format(palette_device::RGBx_555, 0x1000);
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("oki", OKIM6295, 1056000, okim6295_device::PIN7_HIGH) /* clock frequency & pin 7 not verified */
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
-MACHINE_CONFIG_END
-
-MACHINE_CONFIG_START(sderby_state::spacewin)
+ OKIM6295(config, "oki", 1056000, okim6295_device::PIN7_HIGH).add_route(ALL_OUTPUTS, "mono", 1.0); /* clock frequency & pin 7 not verified */
+}
- MCFG_DEVICE_ADD("maincpu", M68000, 12000000)
- MCFG_DEVICE_PROGRAM_MAP(spacewin_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", sderby_state, irq2_line_hold)
+void sderby_state::spacewin(machine_config &config)
+{
+ M68000(config, m_maincpu, 12000000);
+ m_maincpu->set_addrmap(AS_PROGRAM, &sderby_state::spacewin_map);
+ m_maincpu->set_vblank_int("screen", FUNC(sderby_state::irq2_line_hold));
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(64*8, 64*8)
- MCFG_SCREEN_VISIBLE_AREA(4*8, 44*8-1, 3*8, 33*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(sderby_state, screen_update_pmroulet)
- MCFG_SCREEN_PALETTE(m_palette)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(64*8, 64*8);
+ screen.set_visarea(4*8, 44*8-1, 3*8, 33*8-1);
+ screen.set_screen_update(FUNC(sderby_state::screen_update_pmroulet));
+ screen.set_palette(m_palette);
GFXDECODE(config, m_gfxdecode, m_palette, gfx_sderby);
PALETTE(config, m_palette).set_format(palette_device::RGBx_555, 0x1000);
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("oki", OKIM6295, 1056000, okim6295_device::PIN7_HIGH) /* clock frequency & pin 7 not verified */
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
-MACHINE_CONFIG_END
-
-MACHINE_CONFIG_START(sderby_state::shinygld)
+ OKIM6295(config, "oki", 1056000, okim6295_device::PIN7_HIGH).add_route(ALL_OUTPUTS, "mono", 1.0); /* clock frequency & pin 7 not verified */
+}
- MCFG_DEVICE_ADD("maincpu", M68000, 24_MHz_XTAL / 2) // verified
- MCFG_DEVICE_PROGRAM_MAP(shinygld_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", sderby_state, irq4_line_hold)
+void sderby_state::shinygld(machine_config &config)
+{
+ M68000(config, m_maincpu, 24_MHz_XTAL / 2); // verified
+ m_maincpu->set_addrmap(AS_PROGRAM, &sderby_state::shinygld_map);
+ m_maincpu->set_vblank_int("screen", FUNC(sderby_state::irq4_line_hold));
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(57.47) // measured on PCB
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(64*8, 64*8)
- MCFG_SCREEN_VISIBLE_AREA(4*8, 44*8-1, 3*8, 33*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(sderby_state, screen_update_sderby)
- MCFG_SCREEN_PALETTE(m_palette)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(57.47); // measured on PCB
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(64*8, 64*8);
+ screen.set_visarea(4*8, 44*8-1, 3*8, 33*8-1);
+ screen.set_screen_update(FUNC(sderby_state::screen_update_sderby));
+ screen.set_palette(m_palette);
GFXDECODE(config, m_gfxdecode, m_palette, gfx_sderby);
PALETTE(config, m_palette).set_format(palette_device::RGBx_555, 0x1000);
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("oki", OKIM6295, 1.056_MHz_XTAL, okim6295_device::PIN7_HIGH) /* clock frequency & pin 7 verified */
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
-MACHINE_CONFIG_END
-
-MACHINE_CONFIG_START(sderby_state::pmroulet)
+ OKIM6295(config, "oki", 1.056_MHz_XTAL, okim6295_device::PIN7_HIGH).add_route(ALL_OUTPUTS, "mono", 1.0); /* clock frequency & pin 7 verified */
+}
- MCFG_DEVICE_ADD("maincpu", M68000, 12000000)
- MCFG_DEVICE_PROGRAM_MAP(roulette_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", sderby_state, irq2_line_hold)
+void sderby_state::pmroulet(machine_config &config)
+{
+ M68000(config, m_maincpu, 12000000);
+ m_maincpu->set_addrmap(AS_PROGRAM, &sderby_state::roulette_map);
+ m_maincpu->set_vblank_int("screen", FUNC(sderby_state::irq2_line_hold));
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */
- MCFG_SCREEN_SIZE(64*8, 64*8)
- MCFG_SCREEN_VISIBLE_AREA(4*8, 44*8-1, 3*8, 33*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(sderby_state, screen_update_pmroulet)
- MCFG_SCREEN_PALETTE(m_palette)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */
+ screen.set_size(64*8, 64*8);
+ screen.set_visarea(4*8, 44*8-1, 3*8, 33*8-1);
+ screen.set_screen_update(FUNC(sderby_state::screen_update_pmroulet));
+ screen.set_palette(m_palette);
GFXDECODE(config, m_gfxdecode, m_palette, gfx_sderby);
PALETTE(config, m_palette).set_format(palette_device::RGBx_555, 0x1000);
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("oki", OKIM6295, 1056000, okim6295_device::PIN7_HIGH) /* clock frequency & pin 7 not verified */
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
-MACHINE_CONFIG_END
+ OKIM6295(config, "oki", 1056000, okim6295_device::PIN7_HIGH).add_route(ALL_OUTPUTS, "mono", 1.0); /* clock frequency & pin 7 not verified */
+}
/****************************
diff --git a/src/mame/drivers/sderby2.cpp b/src/mame/drivers/sderby2.cpp
index d8865e53b72..3c4f7648a6e 100644
--- a/src/mame/drivers/sderby2.cpp
+++ b/src/mame/drivers/sderby2.cpp
@@ -298,32 +298,33 @@ void sderby2_state::machine_reset()
}
-MACHINE_CONFIG_START(sderby2_state::sderby2)
- MCFG_DEVICE_ADD("maincpu", Z80, XTAL(3'579'545))
- MCFG_DEVICE_PROGRAM_MAP(main_program_map)
- MCFG_DEVICE_IO_MAP(main_io_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", sderby2_state, irq0_line_hold)
+void sderby2_state::sderby2(machine_config &config)
+{
+ Z80(config, m_maincpu, XTAL(3'579'545));
+ m_maincpu->set_addrmap(AS_PROGRAM, &sderby2_state::main_program_map);
+ m_maincpu->set_addrmap(AS_IO, &sderby2_state::main_io_map);
+ m_maincpu->set_vblank_int("screen", FUNC(sderby2_state::irq0_line_hold));
- MCFG_DEVICE_ADD("subcpu", Z80, XTAL(3'579'545))
- MCFG_DEVICE_PROGRAM_MAP(sub_program_map)
- MCFG_DEVICE_IO_MAP(sub_io_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", sderby2_state, irq0_line_hold)
+ Z80(config, m_subcpu, XTAL(3'579'545));
+ m_subcpu->set_addrmap(AS_PROGRAM, &sderby2_state::sub_program_map);
+ m_subcpu->set_addrmap(AS_IO, &sderby2_state::sub_io_map);
+ m_subcpu->set_vblank_int("screen", FUNC(sderby2_state::irq0_line_hold));
// video hardware
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(256, 256)
- MCFG_SCREEN_VISIBLE_AREA(0, 256 - 1, 0, 256 - 1)
- MCFG_SCREEN_VIDEO_ATTRIBUTES(VIDEO_ALWAYS_UPDATE)
- MCFG_SCREEN_UPDATE_DRIVER(sderby2_state, screen_update)
- MCFG_SCREEN_PALETTE(m_palette)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(256, 256);
+ screen.set_visarea(0, 256 - 1, 0, 256 - 1);
+ screen.set_video_attributes(VIDEO_ALWAYS_UPDATE);
+ screen.set_screen_update(FUNC(sderby2_state::screen_update));
+ screen.set_palette(m_palette);
PALETTE(config, m_palette, FUNC(sderby2_state::sderby2_palette), 256+256*3);
GFXDECODE(config, m_gfxdecode, m_palette, gfx_sderby2);
// sound hardware
-MACHINE_CONFIG_END
+}
/*************************************
*
diff --git a/src/mame/drivers/sdk51.cpp b/src/mame/drivers/sdk51.cpp
index a00dbef6757..689055043af 100644
--- a/src/mame/drivers/sdk51.cpp
+++ b/src/mame/drivers/sdk51.cpp
@@ -45,9 +45,9 @@ private:
void datamem_map(address_map &map);
void mem0_map(address_map &map);
- DECLARE_READ8_MEMBER(psen_r);
- DECLARE_READ8_MEMBER(datamem_r);
- DECLARE_WRITE8_MEMBER(datamem_w);
+ u8 psen_r(offs_t offset);
+ u8 datamem_r(offs_t offset);
+ void datamem_w(offs_t offset, u8 data);
u8 brkmem_r(offs_t offset);
void brkmem_w(offs_t offset, u8 data);
@@ -73,19 +73,19 @@ private:
bool m_display_clock;
};
-READ8_MEMBER(sdk51_state::psen_r)
+u8 sdk51_state::psen_r(offs_t offset)
{
- return m_progmem->read8(space, offset);
+ return m_progmem->read8(offset);
}
-READ8_MEMBER(sdk51_state::datamem_r)
+u8 sdk51_state::datamem_r(offs_t offset)
{
- return m_datamem->read8(space, offset);
+ return m_datamem->read8(offset);
}
-WRITE8_MEMBER(sdk51_state::datamem_w)
+void sdk51_state::datamem_w(offs_t offset, u8 data)
{
- m_datamem->write8(space, offset, data);
+ m_datamem->write8(offset, data);
}
u8 sdk51_state::brkmem_r(offs_t offset)
diff --git a/src/mame/drivers/sdk85.cpp b/src/mame/drivers/sdk85.cpp
index 1989ead5fc6..2eeff6a9a4e 100644
--- a/src/mame/drivers/sdk85.cpp
+++ b/src/mame/drivers/sdk85.cpp
@@ -148,11 +148,12 @@ READ8_MEMBER( sdk85_state::kbd_r )
return data;
}
-MACHINE_CONFIG_START(sdk85_state::sdk85)
+void sdk85_state::sdk85(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", I8085A, 6.144_MHz_XTAL)
- MCFG_DEVICE_PROGRAM_MAP(sdk85_mem)
- MCFG_DEVICE_IO_MAP(sdk85_io)
+ I8085A(config, m_maincpu, 6.144_MHz_XTAL);
+ m_maincpu->set_addrmap(AS_PROGRAM, &sdk85_state::sdk85_mem);
+ m_maincpu->set_addrmap(AS_IO, &sdk85_state::sdk85_io);
I8355(config, "romio", 6.144_MHz_XTAL / 2); // Monitor ROM (A14)
@@ -174,7 +175,7 @@ MACHINE_CONFIG_START(sdk85_state::sdk85)
kdc.in_rl_callback().set(FUNC(sdk85_state::kbd_r)); // kbd RL lines
kdc.in_shift_callback().set_constant(1); // Shift key
kdc.in_ctrl_callback().set_constant(1);
-MACHINE_CONFIG_END
+}
/* ROM definition */
ROM_START( sdk85 )
diff --git a/src/mame/drivers/seabattl.cpp b/src/mame/drivers/seabattl.cpp
index 9841b29fac2..44d69cf4bc0 100644
--- a/src/mame/drivers/seabattl.cpp
+++ b/src/mame/drivers/seabattl.cpp
@@ -480,8 +480,8 @@ static GFXDECODE_START( gfx_seabattl )
GFXDECODE_ENTRY( "gfx3", 0, tiles8x8_layout, 24, 1 )
GFXDECODE_END
-MACHINE_CONFIG_START(seabattl_state::seabattl)
-
+void seabattl_state::seabattl(machine_config &config)
+{
/* basic machine hardware */
S2650(config, m_maincpu, 14318180/4/2);
m_maincpu->set_addrmap(AS_PROGRAM, &seabattl_state::seabattl_map);
diff --git a/src/mame/drivers/sealy.cpp b/src/mame/drivers/sealy.cpp
index 661ad948358..93d3c697800 100644
--- a/src/mame/drivers/sealy.cpp
+++ b/src/mame/drivers/sealy.cpp
@@ -101,28 +101,27 @@ static GFXDECODE_START( gfx_sealy )
GFXDECODE_END
-MACHINE_CONFIG_START(sealy_state::sealy)
-
+void sealy_state::sealy(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", H83044, MAIN_CLOCK) /* wrong CPU, but we have not a M16C core ATM */
- MCFG_DEVICE_PROGRAM_MAP(sealy_map)
+ H83044(config, m_maincpu, MAIN_CLOCK); /* wrong CPU, but we have not a M16C core ATM */
+ m_maincpu->set_addrmap(AS_PROGRAM, &sealy_state::sealy_map);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(512, 256)
- MCFG_SCREEN_VISIBLE_AREA(0, 512-1, 0, 256-1)
- MCFG_SCREEN_UPDATE_DRIVER(sealy_state, screen_update_sealy)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(512, 256);
+ screen.set_visarea(0, 512-1, 0, 256-1);
+ screen.set_screen_update(FUNC(sealy_state::screen_update_sealy));
GFXDECODE(config, "gfxdecode", m_palette, gfx_sealy);
PALETTE(config, m_palette, FUNC(sealy_state::sealy_palette), 32768);
/* sound hardware */
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("oki", OKIM6295, MAIN_CLOCK/13, okim6295_device::PIN7_HIGH)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
-MACHINE_CONFIG_END
+ OKIM6295(config, "oki", MAIN_CLOCK/13, okim6295_device::PIN7_HIGH).add_route(ALL_OUTPUTS, "mono", 1.0);
+}
ROM_START( crzyddz )
diff --git a/src/mame/drivers/seattlecmp.cpp b/src/mame/drivers/seattlecmp.cpp
index 0b8e8e38fa3..ce7a1df8e19 100644
--- a/src/mame/drivers/seattlecmp.cpp
+++ b/src/mame/drivers/seattlecmp.cpp
@@ -103,12 +103,13 @@ static DEVICE_INPUT_DEFAULTS_START( terminal )
DEVICE_INPUT_DEFAULTS( "RS232_STOPBITS", 0xff, RS232_STOPBITS_2 )
DEVICE_INPUT_DEFAULTS_END
-MACHINE_CONFIG_START(seattle_comp_state::seattle)
+void seattle_comp_state::seattle(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", I8086, XTAL(24'000'000) / 3) // 8 MHz or 4 MHz selectable
- MCFG_DEVICE_PROGRAM_MAP(mem_map)
- MCFG_DEVICE_IO_MAP(io_map)
- MCFG_DEVICE_IRQ_ACKNOWLEDGE_DEVICE("pic1", pic8259_device, inta_cb)
+ I8086(config, m_maincpu, XTAL(24'000'000) / 3); // 8 MHz or 4 MHz selectable
+ m_maincpu->set_addrmap(AS_PROGRAM, &seattle_comp_state::mem_map);
+ m_maincpu->set_addrmap(AS_IO, &seattle_comp_state::io_map);
+ m_maincpu->set_irq_acknowledge_callback("pic1", FUNC(pic8259_device::inta_cb));
PIC8259(config, m_pic[0], 0);
m_pic[0]->out_int_callback().set_inputline(m_maincpu, INPUT_LINE_INT0);
@@ -138,7 +139,7 @@ MACHINE_CONFIG_START(seattle_comp_state::seattle)
rs232.dsr_handler().set("uart", FUNC(i8251_device::write_dsr));
rs232.cts_handler().set("uart", FUNC(i8251_device::write_cts));
rs232.set_option_device_input_defaults("terminal", DEVICE_INPUT_DEFAULTS_NAME(terminal));
-MACHINE_CONFIG_END
+}
/* ROM definition */
ROM_START( scp300f )
diff --git a/src/mame/drivers/sega_beena.cpp b/src/mame/drivers/sega_beena.cpp
new file mode 100644
index 00000000000..001d50d03b7
--- /dev/null
+++ b/src/mame/drivers/sega_beena.cpp
@@ -0,0 +1,137 @@
+// license:BSD-3-Clause
+// copyright-holders:R. Belmont
+/******************************************************************************
+
+ Sega Beena
+
+ apbeena.cpp
+
+ Skeleton driver for the Sega Advanced Pico BEENA
+
+ H/W is custom Sega SoC with ARM7TDMI core at 81 MHz.
+
+ TODO:
+ Everything!
+ Needs the internal BIOS dumped.
+ Component list / PCB diagram
+
+ cartridge ROM has 'edinburgh' in the header, maybe a system codename?
+ ROM is also full of OGG files containing the string 'Encoded with Speex speex-1.0.4'
+ as well as .mid files for music
+
+*******************************************************************************/
+
+#include "emu.h"
+
+#include "bus/generic/slot.h"
+#include "bus/generic/carts.h"
+#include "cpu/arm7/arm7.h"
+
+#include "softlist.h"
+#include "speaker.h"
+#include "screen.h"
+
+
+class sega_beena_state : public driver_device
+{
+public:
+ sega_beena_state(const machine_config &mconfig, device_type type, const char *tag)
+ : driver_device(mconfig, type, tag)
+ , m_maincpu(*this, "arm7")
+ , m_cart(*this, "cartslot")
+ , m_cart_region(nullptr)
+ , m_bank(*this, "cartbank")
+ { }
+
+ void sega_beena(machine_config &config);
+
+private:
+ virtual void machine_start() override;
+ virtual void machine_reset() override;
+
+ uint32_t screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
+
+ DECLARE_DEVICE_IMAGE_LOAD_MEMBER(cart);
+
+ void beena_arm7_map(address_map &map);
+
+ required_device<arm7_cpu_device> m_maincpu;
+ required_device<generic_slot_device> m_cart;
+ memory_region *m_cart_region;
+ optional_memory_bank m_bank;
+};
+
+void sega_beena_state::beena_arm7_map(address_map &map)
+{
+ map(0x00000000, 0x000001ff).rom().bankr("cartbank");
+ map(0x80000000, 0x807fffff).rom().bankr("cartbank");
+}
+
+void sega_beena_state::machine_start()
+{
+ // if there's a cart, override the standard mapping
+ if (m_cart && m_cart->exists())
+ {
+ std::string region_tag;
+ m_cart_region = memregion(region_tag.assign(m_cart->tag()).append(GENERIC_ROM_REGION_TAG).c_str());
+
+ m_bank->configure_entries(0, (m_cart_region->bytes() + 0x7fffff) / 0x800000, m_cart_region->base(), 0x800000);
+ m_bank->set_entry(0);
+ }
+}
+
+void sega_beena_state::machine_reset()
+{
+}
+
+DEVICE_IMAGE_LOAD_MEMBER(sega_beena_state, cart)
+{
+ uint32_t size = m_cart->common_get_size("rom");
+
+ m_cart->rom_alloc(size, GENERIC_ROM16_WIDTH, ENDIANNESS_LITTLE);
+ m_cart->common_load_rom(m_cart->get_rom_base(), size, "rom");
+
+
+ return image_init_result::PASS;
+}
+
+static INPUT_PORTS_START( sega_beena )
+INPUT_PORTS_END
+
+
+uint32_t sega_beena_state::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect)
+{
+ return 0;
+}
+
+void sega_beena_state::sega_beena(machine_config &config)
+{
+ ARM7_BE(config, m_maincpu, 81'000'000);
+ m_maincpu->set_addrmap(AS_PROGRAM, &sega_beena_state::beena_arm7_map);
+
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(640, 480);
+ screen.set_visarea(0, 640-1, 0, 480-1);
+ screen.set_screen_update(FUNC(sega_beena_state::screen_update));
+
+ SPEAKER(config, "lspeaker").front_left();
+ SPEAKER(config, "rspeaker").front_right();
+
+ GENERIC_CARTSLOT(config, m_cart, generic_plain_slot, "sega_beena_cart");
+ m_cart->set_width(GENERIC_ROM16_WIDTH);
+ m_cart->set_device_load(device_image_load_delegate(&sega_beena_state::device_image_load_cart, this));
+ m_cart->set_must_be_loaded(true);
+
+ SOFTWARE_LIST(config, "cart_list").set_original("sega_beena_cart");
+}
+
+ROM_START( beena )
+ ROM_REGION32_BE( 0x80000, "bios", 0 ) // SoC internal BIOS
+ ROM_LOAD16_WORD_SWAP( "beenabios.bin", 0x000000, 0x080000, NO_DUMP )
+ROM_END
+
+
+// year, name, parent, compat, machine, input, class, init, company, fullname, flags
+CONS( 2009, beena, 0, 0, sega_beena, sega_beena, sega_beena_state, empty_init, "Sega", "Advanced Pico BEENA", MACHINE_IS_SKELETON )
diff --git a/src/mame/drivers/sega_sawatte.cpp b/src/mame/drivers/sega_sawatte.cpp
index 2e96f7d413a..173e56c85a8 100644
--- a/src/mame/drivers/sega_sawatte.cpp
+++ b/src/mame/drivers/sega_sawatte.cpp
@@ -44,9 +44,10 @@ static INPUT_PORTS_START( sawatte )
INPUT_PORTS_END
-MACHINE_CONFIG_START(sawatte_state::sawatte)
- MCFG_SOFTWARE_LIST_ADD("cart_list", "sawatte")
-MACHINE_CONFIG_END
+void sawatte_state::sawatte(machine_config &config)
+{
+ SOFTWARE_LIST(config, "cart_list").set_original("sawatte");
+}
ROM_START( sawatte )
ROM_END
diff --git a/src/mame/drivers/segae.cpp b/src/mame/drivers/segae.cpp
index 9fd3d468b2b..ef357426bc1 100644
--- a/src/mame/drivers/segae.cpp
+++ b/src/mame/drivers/segae.cpp
@@ -308,7 +308,6 @@ GND 8A 8B GND
#include "machine/mc8123.h"
#include "machine/segacrp2_device.h"
#include "machine/upd4701.h"
-#include "sound/sn76496.h"
#include "video/315_5124.h"
#include "speaker.h"
@@ -411,8 +410,9 @@ void systeme_state::io_map(address_map &map)
{
map.global_mask(0xff);
- map(0x7b, 0x7b).w("sn1", FUNC(segapsg_device::command_w));
- map(0x7e, 0x7f).w("sn2", FUNC(segapsg_device::command_w));
+ /* TODO : PSG connection correct? */
+ map(0x7b, 0x7b).w(m_vdp1, FUNC(sega315_5124_device::psg_w));
+ map(0x7e, 0x7f).w(m_vdp2, FUNC(sega315_5124_device::psg_w));
map(0x7e, 0x7e).r(m_vdp1, FUNC(sega315_5124_device::vcount_read));
map(0xba, 0xba).rw(m_vdp1, FUNC(sega315_5124_device::data_read), FUNC(sega315_5124_device::data_write));
map(0xbb, 0xbb).rw(m_vdp1, FUNC(sega315_5124_device::control_read), FUNC(sega315_5124_device::control_write));
@@ -886,39 +886,36 @@ uint32_t systeme_state::screen_update(screen_device &screen, bitmap_rgb32 &bitma
return 0;
}
-MACHINE_CONFIG_START(systeme_state::systeme)
- MCFG_DEVICE_ADD("maincpu", Z80, XTAL(10'738'635)/2) /* Z80B @ 5.3693Mhz */
- MCFG_DEVICE_PROGRAM_MAP(systeme_map)
- MCFG_DEVICE_IO_MAP(io_map)
+void systeme_state::systeme(machine_config &config)
+{
+ Z80(config, m_maincpu, XTAL(10'738'635)/2); /* Z80B @ 5.3693Mhz */
+ m_maincpu->set_addrmap(AS_PROGRAM, &systeme_state::systeme_map);
+ m_maincpu->set_addrmap(AS_IO, &systeme_state::io_map);
I8255(config, m_ppi);
m_ppi->out_pb_callback().set(FUNC(systeme_state::coin_counters_write));
m_ppi->tri_pb_callback().set_constant(0);
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_RAW_PARAMS(XTAL(10'738'635)/2, \
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_raw(XTAL(10'738'635)/2, \
sega315_5124_device::WIDTH , sega315_5124_device::LBORDER_START + sega315_5124_device::LBORDER_WIDTH, sega315_5124_device::LBORDER_START + sega315_5124_device::LBORDER_WIDTH + 256, \
- sega315_5124_device::HEIGHT_NTSC, sega315_5124_device::TBORDER_START + sega315_5124_device::NTSC_192_TBORDER_HEIGHT, sega315_5124_device::TBORDER_START + sega315_5124_device::NTSC_192_TBORDER_HEIGHT + 192)
- MCFG_SCREEN_UPDATE_DRIVER(systeme_state, screen_update)
-
- MCFG_DEVICE_ADD("vdp1", SEGA315_5124, 0)
- MCFG_SEGA315_5124_IS_PAL(false)
- MCFG_DEVICE_ADDRESS_MAP(0, vdp1_map)
-
- MCFG_DEVICE_ADD("vdp2", SEGA315_5124, 0)
- MCFG_SEGA315_5124_IS_PAL(false)
- MCFG_SEGA315_5124_INT_CB(INPUTLINE("maincpu", 0))
- MCFG_DEVICE_ADDRESS_MAP(0, vdp2_map)
+ sega315_5124_device::HEIGHT_NTSC, sega315_5124_device::TBORDER_START + sega315_5124_device::NTSC_192_TBORDER_HEIGHT, sega315_5124_device::TBORDER_START + sega315_5124_device::NTSC_192_TBORDER_HEIGHT + 192);
+ screen.set_screen_update(FUNC(systeme_state::screen_update));
/* sound hardware */
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("sn1", SEGAPSG, XTAL(10'738'635)/3)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.50)
+ SEGA315_5124(config, m_vdp1, XTAL(10'738'635));
+ m_vdp1->set_is_pal(false);
+ m_vdp1->set_addrmap(0, &systeme_state::vdp1_map);
+ m_vdp1->add_route(ALL_OUTPUTS, "mono", 0.50);
- MCFG_DEVICE_ADD("sn2", SEGAPSG, XTAL(10'738'635)/3)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.50)
-MACHINE_CONFIG_END
+ SEGA315_5124(config, m_vdp2, XTAL(10'738'635));
+ m_vdp2->set_is_pal(false);
+ m_vdp2->irq().set_inputline(m_maincpu, 0);
+ m_vdp2->set_addrmap(0, &systeme_state::vdp2_map);
+ m_vdp2->add_route(ALL_OUTPUTS, "mono", 0.50);
+}
void systeme_state::hangonjr(machine_config &config)
{
@@ -944,13 +941,14 @@ void systeme_state::ridleofp(machine_config &config)
ppi.out_pc_callback().append("upd4701", FUNC(upd4701_device::resety_w)).bit(0); // or possibly bit 1
}
-MACHINE_CONFIG_START(systeme_state::systemex)
+void systeme_state::systemex(machine_config &config)
+{
systeme(config);
- MCFG_DEVICE_REPLACE("maincpu", MC8123, XTAL(10'738'635)/2) /* Z80B @ 5.3693Mhz */
- MCFG_DEVICE_PROGRAM_MAP(systeme_map)
- MCFG_DEVICE_IO_MAP(io_map)
- MCFG_DEVICE_OPCODES_MAP(decrypted_opcodes_map)
-MACHINE_CONFIG_END
+ mc8123_device &maincpu(MC8123(config.replace(), m_maincpu, XTAL(10'738'635)/2)); /* Z80B @ 5.3693Mhz */
+ maincpu.set_addrmap(AS_PROGRAM, &systeme_state::systeme_map);
+ maincpu.set_addrmap(AS_IO, &systeme_state::io_map);
+ maincpu.set_addrmap(AS_OPCODES, &systeme_state::decrypted_opcodes_map);
+}
void systeme_state::systemex_315_5177(machine_config &config)
{
@@ -962,13 +960,14 @@ void systeme_state::systemex_315_5177(machine_config &config)
maincpu.set_decrypted_tag(m_decrypted_opcodes);
}
-MACHINE_CONFIG_START(systeme_state::systemeb)
+void systeme_state::systemeb(machine_config &config)
+{
systeme(config);
- MCFG_DEVICE_REPLACE("maincpu", MC8123, XTAL(10'738'635)/2) /* Z80B @ 5.3693Mhz */
- MCFG_DEVICE_PROGRAM_MAP(systeme_map)
- MCFG_DEVICE_IO_MAP(io_map)
- MCFG_DEVICE_OPCODES_MAP(banked_decrypted_opcodes_map)
-MACHINE_CONFIG_END
+ mc8123_device &maincpu(MC8123(config.replace(), m_maincpu, XTAL(10'738'635)/2)); /* Z80B @ 5.3693Mhz */
+ maincpu.set_addrmap(AS_PROGRAM, &systeme_state::systeme_map);
+ maincpu.set_addrmap(AS_IO, &systeme_state::io_map);
+ maincpu.set_addrmap(AS_OPCODES, &systeme_state::banked_decrypted_opcodes_map);
+}
void systeme_state::init_opaopa()
diff --git a/src/mame/drivers/segag80r.cpp b/src/mame/drivers/segag80r.cpp
index df33e01f25d..0e6a28529d5 100644
--- a/src/mame/drivers/segag80r.cpp
+++ b/src/mame/drivers/segag80r.cpp
@@ -827,83 +827,78 @@ GFXDECODE_END
*
*************************************/
-MACHINE_CONFIG_START(segag80r_state::g80r_base)
-
+void segag80r_state::g80r_base(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, VIDEO_CLOCK/4)
- MCFG_DEVICE_PROGRAM_MAP(main_map)
- MCFG_DEVICE_IO_MAP(main_portmap)
- MCFG_DEVICE_OPCODES_MAP(g80r_opcodes_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", segag80r_state, segag80r_vblank_start)
- MCFG_DEVICE_IRQ_ACKNOWLEDGE_DRIVER(segag80r_state, segag80r_irq_ack)
+ Z80(config, m_maincpu, VIDEO_CLOCK/4);
+ m_maincpu->set_addrmap(AS_PROGRAM, &segag80r_state::main_map);
+ m_maincpu->set_addrmap(AS_IO, &segag80r_state::main_portmap);
+ m_maincpu->set_addrmap(AS_OPCODES, &segag80r_state::g80r_opcodes_map);
+ m_maincpu->set_vblank_int("screen", FUNC(segag80r_state::segag80r_vblank_start));
+ m_maincpu->set_irq_acknowledge_callback(FUNC(segag80r_state::segag80r_irq_ack));
/* video hardware */
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_segag80r)
- MCFG_PALETTE_ADD("palette", 64)
+ GFXDECODE(config, m_gfxdecode, m_palette, gfx_segag80r);
+ PALETTE(config, m_palette).set_entries(64);
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_RAW_PARAMS(PIXEL_CLOCK, HTOTAL, HBEND, HBSTART, VTOTAL, VBEND, VBSTART)
- MCFG_SCREEN_UPDATE_DRIVER(segag80r_state, screen_update_segag80r)
- MCFG_SCREEN_PALETTE("palette")
-MACHINE_CONFIG_END
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_raw(PIXEL_CLOCK, HTOTAL, HBEND, HBSTART, VTOTAL, VBEND, VBSTART);
+ m_screen->set_screen_update(FUNC(segag80r_state::screen_update_segag80r));
+ m_screen->set_palette(m_palette);
+}
-MACHINE_CONFIG_START(segag80r_state::astrob)
+void segag80r_state::astrob(machine_config &config)
+{
g80r_base(config);
- /* basic machine hardware */
-
/* sound hardware */
SPEAKER(config, "speaker").front_center();
/* sound boards */
astrob_sound_board(config);
sega_speech_board(config);
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(segag80r_state::sega005)
+void segag80r_state::sega005(machine_config &config)
+{
g80r_base(config);
/* basic machine hardware */
-
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_IO_MAP(main_ppi8255_portmap)
+ m_maincpu->set_addrmap(AS_IO, &segag80r_state::main_ppi8255_portmap);
/* sound hardware */
SPEAKER(config, "speaker").front_center();
/* sound boards */
sega005_sound_board(config);
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(segag80r_state::spaceod)
+void segag80r_state::spaceod(machine_config &config)
+{
g80r_base(config);
- /* basic machine hardware */
-
/* background board changes */
- MCFG_SCREEN_MODIFY("screen")
- MCFG_SCREEN_VIDEO_ATTRIBUTES(VIDEO_ALWAYS_UPDATE)
- MCFG_GFXDECODE_MODIFY("gfxdecode", gfx_spaceod)
- MCFG_DEVICE_MODIFY("palette")
- MCFG_PALETTE_ENTRIES(64+64)
+ m_screen->set_video_attributes(VIDEO_ALWAYS_UPDATE);
+ m_gfxdecode->set_info(gfx_spaceod);
+ m_palette->set_entries(64 + 64);
/* sound hardware */
SPEAKER(config, "speaker").front_center();
/* sound boards */
spaceod_sound_board(config);
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(segag80r_state::monsterb)
+void segag80r_state::monsterb(machine_config &config)
+{
g80r_base(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_IO_MAP(main_ppi8255_portmap)
+ m_maincpu->set_addrmap(AS_IO, &segag80r_state::main_ppi8255_portmap);
i8255_device &ppi(I8255A(config, "ppi8255"));
ppi.out_pa_callback().set(m_soundbrd, FUNC(monsterb_sound_device::sound_a_w));
@@ -912,13 +907,12 @@ MACHINE_CONFIG_START(segag80r_state::monsterb)
ppi.out_pc_callback().set(m_soundbrd, FUNC(monsterb_sound_device::n7751_command_w));
/* background board changes */
- MCFG_GFXDECODE_MODIFY("gfxdecode", gfx_monsterb)
- MCFG_DEVICE_MODIFY("palette")
- MCFG_PALETTE_ENTRIES(64+64)
+ m_gfxdecode->set_info(gfx_monsterb);
+ m_palette->set_entries(64 + 64);
/* sound boards */
- MCFG_DEVICE_ADD(m_soundbrd, MONSTERB_SOUND, 0)
-MACHINE_CONFIG_END
+ MONSTERB_SOUND(config, m_soundbrd, 0);
+}
void segag80r_state::monster2(machine_config &config)
{
@@ -932,25 +926,24 @@ void segag80r_state::monster2(machine_config &config)
maincpu.set_decrypted_tag(":decrypted_opcodes");
}
-MACHINE_CONFIG_START(segag80r_state::pignewt)
+void segag80r_state::pignewt(machine_config &config)
+{
g80r_base(config);
- /* basic machine hardware */
-
/* background board changes */
- MCFG_GFXDECODE_MODIFY("gfxdecode", gfx_monsterb)
- MCFG_DEVICE_MODIFY("palette")
- MCFG_PALETTE_ENTRIES(64+64)
+ m_gfxdecode->set_info(gfx_monsterb);
+ m_palette->set_entries(64 + 64);
/* sound hardware */
SPEAKER(config, "speaker").front_center();
/* sound boards */
SEGAUSB(config, m_usbsnd, 0, m_maincpu).add_route(ALL_OUTPUTS, "speaker", 1.0);
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(segag80r_state::sindbadm)
+void segag80r_state::sindbadm(machine_config &config)
+{
g80r_base(config);
/* basic machine hardware */
@@ -966,9 +959,8 @@ MACHINE_CONFIG_START(segag80r_state::sindbadm)
ppi.out_pc_callback().set(FUNC(segag80r_state::sindbadm_misc_w));
/* video hardware */
- MCFG_GFXDECODE_MODIFY("gfxdecode", gfx_monsterb)
- MCFG_DEVICE_MODIFY("palette")
- MCFG_PALETTE_ENTRIES(64+64)
+ m_gfxdecode->set_info(gfx_monsterb);
+ m_palette->set_entries(64 + 64);
/* sound hardware */
SPEAKER(config, "speaker").front_center();
@@ -979,12 +971,10 @@ MACHINE_CONFIG_START(segag80r_state::sindbadm)
m_audiocpu->set_periodic_int(FUNC(segag80r_state::irq0_line_hold), attotime::from_hz(4*60));
/* sound hardware */
- MCFG_DEVICE_ADD("sn1", SN76496, SINDBADM_SOUND_CLOCK/2) /* matches PCB videos, correct? */
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 1.0)
+ SN76496(config, m_sn1, SINDBADM_SOUND_CLOCK/2).add_route(ALL_OUTPUTS, "speaker", 1.0); /* matches PCB videos, correct? */
- MCFG_DEVICE_ADD("sn2", SN76496, SINDBADM_SOUND_CLOCK/4) /* matches PCB videos, correct? */
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 1.0)
-MACHINE_CONFIG_END
+ SN76496(config, m_sn2, SINDBADM_SOUND_CLOCK/4).add_route(ALL_OUTPUTS, "speaker", 1.0); /* matches PCB videos, correct? */
+}
@@ -1027,7 +1017,7 @@ ROM_START( astrob )
ROM_LOAD( "812a.speech-u3", 0x1800, 0x0800, CRC(410ad0d2) SHA1(9b5f05bb64a6ecfe3543025a10c6ec67de797333) )
ROM_REGION( 0x0440, "proms", 0 ) // not dumped for this set, but believed identical
- ROM_LOAD( "316-0806.video1-u52", 0x0000, 0x0020, CRC(358128B6) SHA1(b6b4b9ecfdcc69b45e69e7a8614153d83be4c62b) ) /* 6331 */
+ ROM_LOAD( "316-0806.video1-u52", 0x0000, 0x0020, CRC(358128b6) SHA1(b6b4b9ecfdcc69b45e69e7a8614153d83be4c62b) ) /* 6331 */
ROM_LOAD( "316-0764.cpu-u15", 0x0400, 0x0020, CRC(c609b79e) SHA1(49dbcbb607079a182d7eb396c0da097166ea91c9) ) /* 6331, CPU board addressing */
ROM_LOAD( "pr84.speech-u30", 0x0420, 0x0020, CRC(adcb81d0) SHA1(74b0efc7e8362b0c98e54a6107981cff656d87e1) ) /* 7051, speech board addressing */
ROM_END
@@ -1065,7 +1055,7 @@ ROM_START( astrob2 )
ROM_LOAD( "812a.speech-u3", 0x1800, 0x0800, CRC(410ad0d2) SHA1(9b5f05bb64a6ecfe3543025a10c6ec67de797333) )
ROM_REGION( 0x0440, "proms", 0 ) // not dumped for this set, but believed identical
- ROM_LOAD( "316-0806.video1-u52", 0x0000, 0x0020, CRC(358128B6) SHA1(b6b4b9ecfdcc69b45e69e7a8614153d83be4c62b) ) /* 6331 */
+ ROM_LOAD( "316-0806.video1-u52", 0x0000, 0x0020, CRC(358128b6) SHA1(b6b4b9ecfdcc69b45e69e7a8614153d83be4c62b) ) /* 6331 */
ROM_LOAD( "316-0764.cpu-u15", 0x0400, 0x0020, CRC(c609b79e) SHA1(49dbcbb607079a182d7eb396c0da097166ea91c9) ) /* 6331, CPU board addressing */
ROM_LOAD( "pr84.speech-u30", 0x0420, 0x0020, CRC(adcb81d0) SHA1(74b0efc7e8362b0c98e54a6107981cff656d87e1) ) /* 7051, speech board addressing */
ROM_END
@@ -1103,7 +1093,7 @@ ROM_START( astrob2a )
ROM_LOAD( "812a.speech-u3", 0x1800, 0x0800, CRC(410ad0d2) SHA1(9b5f05bb64a6ecfe3543025a10c6ec67de797333) )
ROM_REGION( 0x0440, "proms", 0 )
- ROM_LOAD( "316-0806.video1-u52", 0x0000, 0x0020, CRC(358128B6) SHA1(b6b4b9ecfdcc69b45e69e7a8614153d83be4c62b) ) /* 6331 */
+ ROM_LOAD( "316-0806.video1-u52", 0x0000, 0x0020, CRC(358128b6) SHA1(b6b4b9ecfdcc69b45e69e7a8614153d83be4c62b) ) /* 6331 */
ROM_LOAD( "316-0764.cpu-u15", 0x0400, 0x0020, CRC(c609b79e) SHA1(49dbcbb607079a182d7eb396c0da097166ea91c9) ) /* 6331, CPU board addressing */
ROM_LOAD( "pr84.speech-u30", 0x0420, 0x0020, CRC(adcb81d0) SHA1(74b0efc7e8362b0c98e54a6107981cff656d87e1) ) /* 7051, speech board addressing */
ROM_END
@@ -1141,7 +1131,7 @@ ROM_START( astrob2b ) // This was dumped from 2 different PCB sets, with matchin
ROM_LOAD( "812a.speech-u3", 0x1800, 0x0800, CRC(410ad0d2) SHA1(9b5f05bb64a6ecfe3543025a10c6ec67de797333) )
ROM_REGION( 0x0440, "proms", 0 )
- ROM_LOAD( "316-0806.video1-u52", 0x0000, 0x0020, CRC(358128B6) SHA1(b6b4b9ecfdcc69b45e69e7a8614153d83be4c62b) ) /* 6331 */
+ ROM_LOAD( "316-0806.video1-u52", 0x0000, 0x0020, CRC(358128b6) SHA1(b6b4b9ecfdcc69b45e69e7a8614153d83be4c62b) ) /* 6331 */
ROM_LOAD( "316-0764.cpu-u15", 0x0400, 0x0020, CRC(c609b79e) SHA1(49dbcbb607079a182d7eb396c0da097166ea91c9) ) /* 6331, CPU board addressing */
ROM_LOAD( "pr84.speech-u30", 0x0420, 0x0020, CRC(adcb81d0) SHA1(74b0efc7e8362b0c98e54a6107981cff656d87e1) ) /* 7051, speech board addressing */
ROM_END
@@ -1176,7 +1166,7 @@ ROM_START( astrob1 )
ROM_LOAD( "812a.speech-u3", 0x1800, 0x0800, CRC(410ad0d2) SHA1(9b5f05bb64a6ecfe3543025a10c6ec67de797333) )
ROM_REGION( 0x0440, "proms", 0 ) // not dumped for this set, but believed identical
- ROM_LOAD( "316-0806.video1-u52", 0x0000, 0x0020, CRC(358128B6) SHA1(b6b4b9ecfdcc69b45e69e7a8614153d83be4c62b) ) /* 6331 */
+ ROM_LOAD( "316-0806.video1-u52", 0x0000, 0x0020, CRC(358128b6) SHA1(b6b4b9ecfdcc69b45e69e7a8614153d83be4c62b) ) /* 6331 */
ROM_LOAD( "316-0764.cpu-u15", 0x0400, 0x0020, CRC(c609b79e) SHA1(49dbcbb607079a182d7eb396c0da097166ea91c9) ) /* 6331, CPU board addressing */
ROM_LOAD( "pr84.speech-u30", 0x0420, 0x0020, CRC(adcb81d0) SHA1(74b0efc7e8362b0c98e54a6107981cff656d87e1) ) /* 7051, speech board addressing */
ROM_END
@@ -1211,7 +1201,7 @@ ROM_START( astrobg )
ROM_LOAD( "833_speech_de.u03", 0x1800, 0x0800, CRC(08f11459) SHA1(da6dc2bf30b95882f95c21739ec02fc89d286a66) )
ROM_REGION( 0x0440, "proms", 0 ) // not dumped for this set, but believed identical
- ROM_LOAD( "316-0806.video1-u52", 0x0000, 0x0020, CRC(358128B6) SHA1(b6b4b9ecfdcc69b45e69e7a8614153d83be4c62b) ) /* 6331 */
+ ROM_LOAD( "316-0806.video1-u52", 0x0000, 0x0020, CRC(358128b6) SHA1(b6b4b9ecfdcc69b45e69e7a8614153d83be4c62b) ) /* 6331 */
ROM_LOAD( "316-0764.cpu-u15", 0x0400, 0x0020, CRC(c609b79e) SHA1(49dbcbb607079a182d7eb396c0da097166ea91c9) ) /* 6331, CPU board addressing */
ROM_LOAD( "pr84.speech-u30", 0x0420, 0x0020, CRC(adcb81d0) SHA1(74b0efc7e8362b0c98e54a6107981cff656d87e1) ) /* 7051, speech board addressing */
ROM_END
diff --git a/src/mame/drivers/segag80v.cpp b/src/mame/drivers/segag80v.cpp
index 9fc7e572b84..c8a7a7238cf 100644
--- a/src/mame/drivers/segag80v.cpp
+++ b/src/mame/drivers/segag80v.cpp
@@ -1350,7 +1350,7 @@ void segag80v_state::init_zektor()
/* configure sound */
iospace.install_write_handler(0x38, 0x38, write8_delegate(FUNC(speech_sound_device::data_w), (speech_sound_device*)m_speech));
iospace.install_write_handler(0x3b, 0x3b, write8_delegate(FUNC(speech_sound_device::control_w), (speech_sound_device*)m_speech));
- iospace.install_write_handler(0x3c, 0x3d, write8_delegate(FUNC(ay8912_device::address_data_w), (ay8912_device*)m_aysnd));
+ iospace.install_write_handler(0x3c, 0x3d, write8sm_delegate(FUNC(ay8912_device::address_data_w), (ay8912_device*)m_aysnd));
iospace.install_write_handler(0x3e, 0x3e, write8_delegate(FUNC(segag80v_state::zektor1_sh_w),this));
iospace.install_write_handler(0x3f, 0x3f, write8_delegate(FUNC(segag80v_state::zektor2_sh_w),this));
diff --git a/src/mame/drivers/segald.cpp b/src/mame/drivers/segald.cpp
index 6b178a960b8..92b9bc71520 100644
--- a/src/mame/drivers/segald.cpp
+++ b/src/mame/drivers/segald.cpp
@@ -378,31 +378,27 @@ void segald_state::machine_start()
/* DRIVER */
MACHINE_CONFIG_START(segald_state::astron)
-
/* main cpu */
- MCFG_DEVICE_ADD("maincpu", Z80, SCHEMATIC_CLOCK/4)
- MCFG_DEVICE_PROGRAM_MAP(mainmem)
- MCFG_DEVICE_IO_MAP(mainport)
- MCFG_DEVICE_PERIODIC_INT_DRIVER(segald_state, nmi_line_pulse, 1000.0/59.94)
-
+ Z80(config, m_maincpu, SCHEMATIC_CLOCK/4);
+ m_maincpu->set_addrmap(AS_PROGRAM, &segald_state::mainmem);
+ m_maincpu->set_addrmap(AS_IO, &segald_state::mainport);
+ m_maincpu->set_periodic_int(FUNC(segald_state::nmi_line_pulse), attotime::from_hz(1000.0/59.94));
- MCFG_LASERDISC_LDV1000_ADD("laserdisc")
- MCFG_LASERDISC_OVERLAY_DRIVER(256, 256, segald_state, screen_update_astron)
- MCFG_LASERDISC_OVERLAY_PALETTE("palette")
+ PIONEER_LDV1000(config, m_laserdisc, 0);
+ m_laserdisc->set_overlay(256, 256, FUNC(segald_state::screen_update_astron));
+ m_laserdisc->set_overlay_palette(m_palette);
+ m_laserdisc->add_route(0, "lspeaker", 1.0);
+ m_laserdisc->add_route(1, "rspeaker", 1.0);
/* video hardware */
MCFG_LASERDISC_SCREEN_ADD_NTSC("screen", "laserdisc")
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_segald)
- MCFG_PALETTE_ADD("palette", 256)
+ GFXDECODE(config, m_gfxdecode, m_palette, gfx_segald);
+ PALETTE(config, m_palette).set_entries(256);
/* sound hardare */
SPEAKER(config, "lspeaker").front_left();
SPEAKER(config, "rspeaker").front_right();
-
- MCFG_DEVICE_MODIFY("laserdisc")
- MCFG_SOUND_ROUTE(0, "lspeaker", 1.0)
- MCFG_SOUND_ROUTE(1, "rspeaker", 1.0)
MACHINE_CONFIG_END
diff --git a/src/mame/drivers/segapm.cpp b/src/mame/drivers/segapm.cpp
index 497ca93c5fe..494aedcd64e 100644
--- a/src/mame/drivers/segapm.cpp
+++ b/src/mame/drivers/segapm.cpp
@@ -58,23 +58,23 @@ INPUT_PORTS_END
-MACHINE_CONFIG_START(segapm_state::segapm)
-
- MCFG_DEVICE_ADD("maincpu", M68000, 8000000) // ??
- MCFG_DEVICE_PROGRAM_MAP(segapm_map)
+void segapm_state::segapm(machine_config &config)
+{
+ M68000(config, m_maincpu, 8000000); // ??
+ m_maincpu->set_addrmap(AS_PROGRAM, &segapm_state::segapm_map);
// + 2 sh2s on 32x board
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(32*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(segapm_state, screen_update_segapm)
- MCFG_SCREEN_PALETTE("palette")
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(32*8, 32*8);
+ screen.set_visarea(0*8, 32*8-1, 2*8, 30*8-1);
+ screen.set_screen_update(FUNC(segapm_state::screen_update_segapm));
+ screen.set_palette("palette");
PALETTE(config, "palette").set_format(palette_device::xRGB_555, 0x200);
-MACHINE_CONFIG_END
+}
diff --git a/src/mame/drivers/segas16a.cpp b/src/mame/drivers/segas16a.cpp
index 845d34f713a..a9f15030879 100644
--- a/src/mame/drivers/segas16a.cpp
+++ b/src/mame/drivers/segas16a.cpp
@@ -2022,7 +2022,6 @@ void segas16a_state::system16a(machine_config &config)
DAC_8BIT_R2R(config, "dac", 0).add_route(ALL_OUTPUTS, "speaker", 0.4); // unknown DAC
voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref", 0));
- vref.set_output(5.0);
vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT);
vref.add_route(0, "dac", -1.0, DAC_VREF_NEG_INPUT);
}
@@ -2096,15 +2095,15 @@ void segas16a_state::system16a_no7751p(machine_config &config)
}
/*
-static MACHINE_CONFIG_START( system16a_i8751_no7751 )
+void segas16a_state::system16a_i8751_no7751(machine_config &config)
+{
system16a_i8751(config);
- MCFG_DEVICE_REMOVE("n7751")
- MCFG_DEVICE_REMOVE("dac")
- MCFG_DEVICE_REMOVE("vref")
+ config.device_remove("n7751");
+ config.device_remove("dac");
+ config.device_remove("vref");
- MCFG_DEVICE_REPLACE("ymsnd", YM2151, 4000000)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 1.0)
-MACHINE_CONFIG_END
+ YM2151(config.replace(), "ymsnd", 4000000).add_route(ALL_OUTPUTS, "speaker", 1.0);
+}
*/
void segas16a_state::system16a_fd1089a_no7751(machine_config &config)
@@ -2723,10 +2722,6 @@ ROM_START( fantzone )
ROM_LOAD( "epr-7535a.12", 0x0000, 0x8000, CRC(bc1374fa) SHA1(ed2c87ae024dc251e175239f1bccc728fc096548) )
ROM_END
-//*************************************************************************************************************************
-// Fantasy Zone, Sega System 16A
-// CPU: 68000
-//
ROM_START( fantzone1 )
ROM_REGION( 0x40000, "maincpu", 0 ) // 68000 code
ROM_LOAD16_BYTE( "epr-7385.43", 0x000000, 0x8000, CRC(5cb64450) SHA1(5831405359975dd7d8c6614b20fd9b18a5d6410d) )
@@ -2755,6 +2750,39 @@ ROM_END
//*************************************************************************************************************************
// Fantasy Zone, Sega System 16A
+// CPU: FD1089B 317-0016
+//
+ROM_START( fantzonee )
+ ROM_REGION( 0x40000, "maincpu", 0 ) // 68000 code
+ ROM_LOAD16_BYTE( "epr-10170.43", 0x000000, 0x8000, CRC(063c6d76) SHA1(02d52d776330c88d949b10fb715b00507dba1227) )
+ ROM_LOAD16_BYTE( "epr-10167.26", 0x000001, 0x8000, CRC(0ee190b0) SHA1(18c27046a523d73bccf733ecd956e454199a1ee8) )
+ ROM_LOAD16_BYTE( "epr-10171.42", 0x010000, 0x8000, CRC(2ca92d64) SHA1(2eea4d1ae38bba28b806824951a0df4c9f74af6f) )
+ ROM_LOAD16_BYTE( "epr-10168.25", 0x010001, 0x8000, CRC(850964ad) SHA1(bdf603b025b981cc5af47446526562c425990b89) )
+ ROM_LOAD16_BYTE( "epr-10172.41", 0x020000, 0x8000, CRC(b5b624f0) SHA1(a728582efdc9c1b0ed1a27975d6b4e1974339ab2) )
+ ROM_LOAD16_BYTE( "epr-10169.24", 0x020001, 0x8000, CRC(9c57d613) SHA1(cdfaf92b5f44a66ccd6267e0221e4d9ada924e2e) )
+
+ ROM_REGION( 0x18000, "gfx1", 0 ) // tiles
+ ROM_LOAD( "epr-7388.95", 0x00000, 0x08000, CRC(8eb02f6b) SHA1(80511b944b57541669010bd5a0ca52bc98eabd62) )
+ ROM_LOAD( "epr-7389.94", 0x08000, 0x08000, CRC(2f4f71b8) SHA1(ceb39e95cd43904b8e4f89c7227491e139fb3ca6) )
+ ROM_LOAD( "epr-7390.93", 0x10000, 0x08000, CRC(d90609c6) SHA1(4232f6ecb21f242c0c8d81e06b88bc742668609f) )
+
+ ROM_REGION16_BE( 0x30000, "sprites", 0 ) // sprites
+ ROM_LOAD16_BYTE( "epr-7392.10", 0x00001, 0x8000, CRC(5bb7c8b6) SHA1(eaa0ed63ac4f66ee285757e842bdd7b005292600) )
+ ROM_LOAD16_BYTE( "epr-7396.11", 0x00000, 0x8000, CRC(74ae4b57) SHA1(1f24b1faea765994b85f0e7ac8e944c8da22103f) )
+ ROM_LOAD16_BYTE( "epr-7393.17", 0x10001, 0x8000, CRC(14fc7e82) SHA1(ca7caca989a3577dd30ad4f66b0fcce712a454ef) )
+ ROM_LOAD16_BYTE( "epr-7397.18", 0x10000, 0x8000, CRC(e05a1e25) SHA1(9691d9f0763b7483ee6912437902f22ab4b78a05) )
+ ROM_LOAD16_BYTE( "epr-7394.23", 0x20001, 0x8000, CRC(531ca13f) SHA1(19e68bc515f6021e1145cff4f3f0e083839ee8f3) )
+ ROM_LOAD16_BYTE( "epr-7398.24", 0x20000, 0x8000, CRC(68807b49) SHA1(0a189da8cdd2090e76d6d06c55b478abce60542d) )
+
+ ROM_REGION( 0x10000, "soundcpu", 0 ) // sound CPU
+ ROM_LOAD( "epr-7535a.12", 0x0000, 0x8000, CRC(bc1374fa) SHA1(ed2c87ae024dc251e175239f1bccc728fc096548) )
+
+ ROM_REGION( 0x2000, "maincpu:key", 0 ) // decryption key
+ ROM_LOAD( "317-0016.key", 0x0000, 0x2000, BAD_DUMP CRC(16869a2c) SHA1(112b044d0b1b76620a7d75d6f4c4a16eca37e343) ) // hand-crafted needs a proper redump
+ROM_END
+
+//*************************************************************************************************************************
+// Fantasy Zone, Sega System 16A
// CPU: 68000 + NEC 0317-5000 encrypted Z80
//
ROM_START( fantzonep )
@@ -2783,7 +2811,6 @@ ROM_START( fantzonep )
ROM_LOAD( "epr-7391.12", 0x0000, 0x8000, CRC(c03e155e) SHA1(6bbdf308c47b96ba622329520b70fa0ea47248a4) ) // Original encrypted sound code
ROM_END
-
ROM_START( fantzonepr )
ROM_REGION( 0x40000, "maincpu", 0 ) // 68000 code
ROM_LOAD16_BYTE( "ic43-prg-dd2c.bin", 0x000000, 0x8000, CRC(895436e1) SHA1(5cf294fc4fcbacab5d2696aa4f536a8f48d4c4ce) ) // different
@@ -3962,6 +3989,7 @@ GAME( 1986, alexkidd1, alexkidd, system16a_fd1089a, alexkidd, seg
GAME( 1986, fantzone, 0, system16a_no7751, fantzone, segas16a_state, init_generic, ROT0, "Sega", "Fantasy Zone (Rev A, unprotected)", MACHINE_SUPPORTS_SAVE )
GAME( 1986, fantzone1, fantzone, system16a_no7751, fantzone, segas16a_state, init_generic, ROT0, "Sega", "Fantasy Zone (unprotected)", MACHINE_SUPPORTS_SAVE )
GAME( 1986, fantzonep, fantzone, system16a_no7751p, fantzone, segas16a_state, init_generic, ROT0, "Sega", "Fantasy Zone (317-5000)", MACHINE_SUPPORTS_SAVE )
+GAME( 1986, fantzonee, fantzone, system16a_fd1089b_no7751, fantzone, segas16a_state, init_generic, ROT0, "Sega", "Fantasy Zone (FD1089B 317-0016)", MACHINE_SUPPORTS_SAVE )
GAME( 1986, fantzonepr, fantzone, system16a_no7751, fantzone, segas16a_state, init_generic, ROT0, "Sega", "Fantasy Zone (prototype)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE ) // bad / missing gfx ROMs
GAME( 1988, passsht16a, passsht, system16a_fd1094, passsht16a, segas16a_state, init_passsht16a, ROT270, "Sega", "Passing Shot (Japan, 4 Players, System 16A) (FD1094 317-0071)", MACHINE_SUPPORTS_SAVE )
diff --git a/src/mame/drivers/segas16b.cpp b/src/mame/drivers/segas16b.cpp
index f7273528d27..1b13df462e6 100644
--- a/src/mame/drivers/segas16b.cpp
+++ b/src/mame/drivers/segas16b.cpp
@@ -1126,7 +1126,7 @@ WRITE16_MEMBER( segas16b_state::standard_io_w )
WRITE16_MEMBER( segas16b_state::atomicp_sound_w )
{
- m_ym2413->write(space, offset, data >> 8);
+ m_ym2413->write(offset, data >> 8);
}
@@ -2434,7 +2434,9 @@ static INPUT_PORTS_START( dunkshot )
PORT_BIT( 0xff, IP_ACTIVE_LOW, IPT_UNUSED )
PORT_MODIFY("DSW2")
- //"SW2:1" unused
+ PORT_DIPNAME( 0x01, 0x00, "Winner Advances" ) PORT_DIPLOCATION("SW2:1")
+ PORT_DIPSETTING( 0x01, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
PORT_DIPNAME( 0x02, 0x00, DEF_STR( Demo_Sounds ) ) PORT_DIPLOCATION("SW2:2")
PORT_DIPSETTING( 0x02, DEF_STR( Off ) )
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
@@ -2451,7 +2453,9 @@ static INPUT_PORTS_START( dunkshot )
PORT_DIPNAME( 0x40, 0x40, "CPU Starts With +6 Pts." ) PORT_DIPLOCATION("SW2:7")
PORT_DIPSETTING( 0x40, DEF_STR( Off ) )
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
- //"SW2:8" unused
+ PORT_DIPNAME( 0x80, 0x00, DEF_STR( Allow_Continue ) ) PORT_DIPLOCATION("SW2:8")
+ PORT_DIPSETTING( 0x80, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
PORT_START("ANALOGX1") // fake analog X
PORT_BIT( 0xff, 0x00, IPT_TRACKBALL_X ) PORT_SENSITIVITY(75) PORT_KEYDELTA(5) PORT_PLAYER(1) PORT_REVERSE
@@ -2479,6 +2483,15 @@ static INPUT_PORTS_START( dunkshot )
INPUT_PORTS_END
+static INPUT_PORTS_START( dunkshoto )
+ PORT_INCLUDE( dunkshot )
+
+ PORT_MODIFY("DSW2")
+ PORT_DIPUNUSED_DIPLOC( 0x01, IP_ACTIVE_LOW, "SW2:1" )
+ PORT_DIPUNUSED_DIPLOC( 0x80, IP_ACTIVE_LOW, "SW2:8" )
+INPUT_PORTS_END
+
+
static INPUT_PORTS_START( eswat )
PORT_INCLUDE( system16b_generic )
@@ -3729,13 +3742,13 @@ void segas16b_state::system16b(machine_config &config)
m_mapper->pbf().set_inputline(m_soundcpu, 0);
// video hardware
- GFXDECODE(config, m_gfxdecode, "palette", gfx_segas16b);
- PALETTE(config, "palette").set_entries(2048*3);
+ GFXDECODE(config, m_gfxdecode, m_palette, gfx_segas16b);
+ PALETTE(config, m_palette).set_entries(2048*3);
SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
m_screen->set_raw(MASTER_CLOCK_25MHz/4, 400, 0, 320, 262, 0, 224);
m_screen->set_screen_update(FUNC(segas16b_state::screen_update));
- m_screen->set_palette("palette");
+ m_screen->set_palette(m_palette);
SEGA_SYS16B_SPRITES(config, m_sprites, 0);
SEGAIC16VID(config, m_segaic16vid, 0, m_gfxdecode);
@@ -3913,28 +3926,28 @@ void segas16b_state::fpointbla(machine_config &config)
m_sprites->set_local_originx(60); // these align the pieces with the playfield
}
-MACHINE_CONFIG_START(segas16b_state::lockonph)
-
+void segas16b_state::lockonph(machine_config &config)
+{
// basic machine hardware
- MCFG_DEVICE_ADD("maincpu", M68000, XTAL(16'000'000)/2) // ?
- MCFG_DEVICE_PROGRAM_MAP(lockonph_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", segas16b_state, irq4_line_hold)
+ M68000(config, m_maincpu, XTAL(16'000'000)/2); // ?
+ m_maincpu->set_addrmap(AS_PROGRAM, &segas16b_state::lockonph_map);
+ m_maincpu->set_vblank_int("screen", FUNC(segas16b_state::irq4_line_hold));
- MCFG_DEVICE_ADD("soundcpu", Z80, XTAL(16'000'000)/4) // ?
- MCFG_DEVICE_PROGRAM_MAP(lockonph_sound_map)
- MCFG_DEVICE_IO_MAP(lockonph_sound_iomap)
+ Z80(config, m_soundcpu, XTAL(16'000'000)/4); // ?
+ m_soundcpu->set_addrmap(AS_PROGRAM, &segas16b_state::lockonph_sound_map);
+ m_soundcpu->set_addrmap(AS_IO, &segas16b_state::lockonph_sound_iomap);
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
// video hardware
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_lockonph)
- MCFG_PALETTE_ADD("palette", 0x2000*4)
+ GFXDECODE(config, m_gfxdecode, m_palette, gfx_lockonph);
+ PALETTE(config, m_palette).set_entries(0x2000*4);
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_RAW_PARAMS(MASTER_CLOCK_25MHz/4, 400, 0, 320, 262, 0, 224) // wrong, other XTAL seems to be 17Mhz?
- MCFG_SCREEN_UPDATE_DRIVER(segas16b_state, screen_update)
- MCFG_SCREEN_PALETTE("palette")
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_raw(MASTER_CLOCK_25MHz/4, 400, 0, 320, 262, 0, 224); // wrong, other XTAL seems to be 17Mhz?
+ m_screen->set_screen_update(FUNC(segas16b_state::screen_update));
+ m_screen->set_palette(m_palette);
SEGA_SYS16B_SPRITES(config, m_sprites, 0);
SEGAIC16VID(config, m_segaic16vid, 0, m_gfxdecode);
@@ -3950,12 +3963,10 @@ MACHINE_CONFIG_START(segas16b_state::lockonph)
m_ym2151->add_route(0, "mono", 0.5);
m_ym2151->add_route(1, "mono", 0.5);
- MCFG_DEVICE_ADD("oki", OKIM6295, XTAL(16'000'000)/16, okim6295_device::PIN7_LOW) // clock / pin not verified
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.2)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.2)
-
-
-MACHINE_CONFIG_END
+ okim6295_device &oki(OKIM6295(config, "oki", XTAL(16'000'000)/16, okim6295_device::PIN7_LOW)); // clock / pin not verified
+ oki.add_route(ALL_OUTPUTS, "mono", 0.2);
+ oki.add_route(ALL_OUTPUTS, "mono", 0.2);
+}
//**************************************************************************
@@ -3981,11 +3992,11 @@ void segas16b_state::atomicp(machine_config &config) // 10MHz CPU Clock verified
}
-MACHINE_CONFIG_START(segas16b_state::system16c)
+void segas16b_state::system16c(machine_config &config)
+{
system16b(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(system16c_map)
-MACHINE_CONFIG_END
+ m_maincpu->set_addrmap(AS_PROGRAM, &segas16b_state::system16c_map);
+}
@@ -5290,6 +5301,9 @@ ROM_END
// Cotton, Sega System 16B
// CPU: FD1094 (317-0181A)
// ROM Board type: 171-5704
+// Sega game ID: 833-8021-02 COTTON
+// Main board: 837-8023-02
+// ROM board: 834-8022-02
//
ROM_START( cotton )
ROM_REGION( 0x80000, "maincpu", 0 ) // 68000 code
@@ -7448,6 +7462,36 @@ ROM_START( ryukyu )
ROM_LOAD( "opr-13350.a11", 0x10000, 0x20000, CRC(3c59a658) SHA1(2cef13ee9e666bb850fe6c6e6954d7b75df665a9) )
ROM_END
+//*************************************************************************************************************************
+// Ryukyu, Sega System 16B
+// CPU: FD1094 8M2 (317-5023A)
+// ROM Board type: 171-5704
+// Sega game ID: 836-7666 RYUKYU
+// ROM board: 836-7667
+//
+ROM_START( ryukyua )
+ ROM_REGION( 0x20000, "maincpu", 0 ) // 68000 code
+ ROM_LOAD16_BYTE( "epr-13348a.a7", 0x00000, 0x10000, CRC(64f6ada9) SHA1(31e2adc8697c21ca4aa2d9357f7303644168d0a2) )
+ ROM_LOAD16_BYTE( "epr-13347a.a5", 0x00001, 0x10000, CRC(fade1f50) SHA1(46e6224060d526aa362df1a1026ba445832ad7f3) )
+
+ ROM_REGION( 0x2000, "maincpu:key", 0 ) // decryption key
+ ROM_LOAD( "317-5023a.key", 0x0000, 0x2000, NO_DUMP )
+
+ ROM_REGION( 0x60000, "gfx1", 0 ) // tiles
+ ROM_LOAD( "opr-13351.a14", 0x00000, 0x20000, CRC(a68a4e6d) SHA1(ee3e317c7184b41af5dd383d41f7be3eebff0d04) )
+ ROM_LOAD( "opr-13352.a15", 0x20000, 0x20000, CRC(5e5531e4) SHA1(e8e16b35f7985e6cdd77353ca5235db518914744) )
+ ROM_LOAD( "opr-13353.a16", 0x40000, 0x20000, CRC(6d23dfd8) SHA1(21266340290b9854cee0b62fc107cc2981519a80) )
+
+ ROM_REGION16_BE( 0x80000, "sprites", 0 ) // sprites
+ ROM_LOAD16_BYTE( "opr-13354.b1", 0x00001, 0x20000, CRC(f07aad99) SHA1(71759525a5b7fe76d112cec93984f0f89cadbc00) )
+ ROM_LOAD16_BYTE( "opr-13356.b5", 0x00000, 0x20000, CRC(5498290b) SHA1(b3115b636d8cb6ecac22d5264b7961e3b807cf04) )
+ ROM_LOAD16_BYTE( "opr-13355.b2", 0x40001, 0x20000, CRC(67890019) SHA1(165c6a32f305273396ec0e9499e00329caadc484) )
+ ROM_LOAD16_BYTE( "opr-13357.b6", 0x40000, 0x20000, CRC(f9e7cf03) SHA1(2258111499c79443faf84fb0495007016282bb3c) )
+
+ ROM_REGION( 0x50000, "soundcpu", 0 ) // sound CPU
+ ROM_LOAD( "epr-13349.a10", 0x00000, 0x08000, CRC(b83183f8) SHA1(9d6127f51c04a16bb2637dc9992b843b94613c2b) )
+ ROM_LOAD( "opr-13350.a11", 0x10000, 0x20000, CRC(3c59a658) SHA1(2cef13ee9e666bb850fe6c6e6954d7b75df665a9) )
+ROM_END
ROM_START( ryukyud )
ROM_REGION( 0x20000, "maincpu", 0 ) // 68000 code
@@ -9226,9 +9270,9 @@ GAME( 1988, ddux, 0, system16b_fd1094, ddux, segas16b_stat
GAME( 1988, dduxj, ddux, system16b_fd1094, ddux, segas16b_state, init_generic_5521, ROT0, "Sega", "Dynamite Dux (set 2, Japan) (FD1094 317-0094)", 0 )
GAME( 1988, ddux1, ddux, system16b_i8751, ddux, segas16b_state, init_ddux_5704, ROT0, "Sega", "Dynamite Dux (set 1) (8751 317-0095)", 0 )
-GAME( 1987, dunkshot, 0, system16b_fd1089a, dunkshot, segas16b_state, init_dunkshot_5358_small,ROT0, "Sega", "Dunk Shot (Rev C, FD1089A 317-0022)", 0 )
-GAME( 1987, dunkshota, dunkshot, system16b_fd1089a, dunkshot, segas16b_state, init_dunkshot_5358_small,ROT0, "Sega", "Dunk Shot (Rev A, FD1089A 317-0022)", 0 )
-GAME( 1986, dunkshoto, dunkshot, system16b_fd1089a, dunkshot, segas16b_state, init_dunkshot_5358_small,ROT0, "Sega", "Dunk Shot (FD1089A 317-0022)", 0 )
+GAME( 1987, dunkshot, 0, system16b_fd1089a, dunkshot, segas16b_state, init_dunkshot_5358_small,ROT0, "Sega", "Dunk Shot (Rev C, FD1089A 317-0022)", 0 )
+GAME( 1987, dunkshota, dunkshot, system16b_fd1089a, dunkshot, segas16b_state, init_dunkshot_5358_small,ROT0, "Sega", "Dunk Shot (Rev A, FD1089A 317-0022)", 0 )
+GAME( 1986, dunkshoto, dunkshot, system16b_fd1089a, dunkshoto, segas16b_state, init_dunkshot_5358_small,ROT0, "Sega", "Dunk Shot (FD1089A 317-0022)", 0 )
GAME( 1989, eswat, 0, system16b_fd1094_5797, eswat, segas16b_state, init_generic_5797, ROT0, "Sega", "E-Swat - Cyber Police (set 4, World) (FD1094 317-0130)", 0 )
GAME( 1989, eswatu, eswat, system16b_fd1094_5797, eswat, segas16b_state, init_generic_5797, ROT0, "Sega", "E-Swat - Cyber Police (set 3, US) (FD1094 317-0129)", 0 )
@@ -9261,6 +9305,7 @@ GAME( 1988, cencourt, passsht, system16b_mc8123, cencourt, segas16b_stat
GAME( 1991, riotcity, 0, system16b, riotcity, segas16b_state, init_generic_5704, ROT0, "Sega / Westone", "Riot City (Japan)", 0 )
GAME( 1990, ryukyu, 0, system16b_fd1094, ryukyu, segas16b_state, init_generic_5704, ROT0, "Success / Sega", "RyuKyu (Japan) (FD1094 317-5023)", 0 )
+GAME( 1990, ryukyua, ryukyu, system16b_fd1094, ryukyu, segas16b_state, init_generic_5704, ROT0, "Success / Sega", "RyuKyu (Japan) (FD1094 317-5023A)", MACHINE_NOT_WORKING ) // decryption key not available
GAME( 1987, defense, sdi, system16b_fd1089a, sdi, segas16b_state, init_defense_5358_small, ROT0, "Sega", "Defense (System 16B, FD1089A 317-0028)", 0 )
GAME( 1987, sdib, sdi, system16b_fd1089a, sdi, segas16b_state, init_defense_5358_small, ROT0, "Sega", "SDI - Strategic Defense Initiative (System 16B, FD1089A 317-0028)", 0 )
@@ -9818,23 +9863,23 @@ void isgsm_state::machine_reset()
}
-MACHINE_CONFIG_START(isgsm_state::isgsm)
+void isgsm_state::isgsm(machine_config &config)
+{
system16b(config);
// basic machine hardware
- MCFG_DEVICE_REMOVE("maincpu")
- MCFG_DEVICE_REMOVE("mapper")
+ config.device_remove("maincpu");
+ config.device_remove("mapper");
- MCFG_DEVICE_ADD("maincpu", M68000, 16000000) // no obvious CPU, but seems to be clocked faster than an original system16 based on the boot times
- MCFG_DEVICE_PROGRAM_MAP(isgsm_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", isgsm_state, irq4_line_hold)
+ M68000(config, m_maincpu, 16000000); // no obvious CPU, but seems to be clocked faster than an original system16 based on the boot times
+ m_maincpu->set_addrmap(AS_PROGRAM, &isgsm_state::isgsm_map);
+ m_maincpu->set_vblank_int("screen", FUNC(isgsm_state::irq4_line_hold));
- MCFG_DEVICE_MODIFY("soundcpu")
- MCFG_DEVICE_PROGRAM_MAP(bootleg_sound_map)
- MCFG_DEVICE_IO_MAP(bootleg_sound_portmap)
+ m_soundcpu->set_addrmap(AS_PROGRAM, &isgsm_state::bootleg_sound_map);
+ m_soundcpu->set_addrmap(AS_IO, &isgsm_state::bootleg_sound_portmap);
GENERIC_LATCH_8(config, m_soundlatch);
-MACHINE_CONFIG_END
+}
void isgsm_state::init_isgsm()
{
diff --git a/src/mame/drivers/segas18.cpp b/src/mame/drivers/segas18.cpp
index 8ab3a2752e8..ad5e6afac73 100644
--- a/src/mame/drivers/segas18.cpp
+++ b/src/mame/drivers/segas18.cpp
@@ -2749,6 +2749,9 @@ ROM_END
Moonwalker, Sega System 18
CPU: FD1094 (317-0158)
ROM Board: 171-5873B
+ Main board: 837-7530-01
+ Game BD: 833-7528-01 MOONWALKER
+ ROM Board: 834-7529-01
*/
ROM_START( mwalku )
ROM_REGION( 0x80000, "maincpu", 0 ) // 68000 code - custom cpu 317-0158
diff --git a/src/mame/drivers/segas24.cpp b/src/mame/drivers/segas24.cpp
index e0b73147bb8..083eacd7666 100644
--- a/src/mame/drivers/segas24.cpp
+++ b/src/mame/drivers/segas24.cpp
@@ -1967,7 +1967,6 @@ void segas24_state::system24(machine_config &config)
DAC_8BIT_R2R(config, "dac", 0).add_route(ALL_OUTPUTS, "lspeaker", 0.5).add_route(ALL_OUTPUTS, "rspeaker", 0.5); // unknown DAC
voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref", 0));
- vref.set_output(5.0);
vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT);
vref.add_route(0, "dac", -1.0, DAC_VREF_NEG_INPUT);
}
diff --git a/src/mame/drivers/segas32.cpp b/src/mame/drivers/segas32.cpp
index 2741a33d812..c19bcfd4c61 100644
--- a/src/mame/drivers/segas32.cpp
+++ b/src/mame/drivers/segas32.cpp
@@ -5326,7 +5326,30 @@ ROM_START( titlefj )
ROM_LOAD( "mpr-15385.ic1", 0x000000, 0x200000, CRC(5a9b0aa0) SHA1(d208aa165f9eea05e3b8c3f406ff44374e4f6887) )
ROM_END
+/**************************************************************************************************************************
+ **************************************************************************************************************************
+ **************************************************************************************************************************
+ AS-1 - Multi-32
+ not protected?
+*/
+ROM_START( as1 )
+ ROM_REGION( 0x200000, "mainpcb:maincpu", 0 ) /* v60 code */
+ ROM_LOAD32_WORD_x2( "epr15420.ic37", 0x000000, 0x20000, CRC(1f9747b0) SHA1(51d1fbccf6960967d4458ba26fad42ac51978c67) )
+ ROM_LOAD32_WORD_x2( "epr15421.ic40", 0x000002, 0x20000, CRC(aa96422a) SHA1(21cf327d102f5c7c4a4e41d889d9b4d10c44de35) )
+
+ ROM_REGION( 0x80000, "mainpcb:soundcpu", 0 ) /* sound CPU */
+ ROM_LOAD_x4( "epr15367.ic31", 0x00000, 0x20000, CRC(0220f078) SHA1(9fab79fc91764ecf678bfa4d38d1b4054e258b76) )
+
+ ROM_REGION( 0x100000, "mainpcb:gfx1", 0 ) /* tiles */
+ ROM_LOAD16_BYTE( "epr15422.ic3", 0x000000, 0x080000, CRC(6c61ba6d) SHA1(b41237ced4a2e8741ae0339c333bea4221903690) )
+ ROM_LOAD16_BYTE( "epr15423.ic11", 0x000001, 0x080000, CRC(5178912a) SHA1(b637451c28877ddc93c9920bea356888b4c8eea3) )
+ ROM_REGION32_BE( 0x1000000, "mainpcb:sprites", ROMREGION_ERASEFF ) /* sprites */
+ // empty
+
+ ROM_REGION( 0x400000, "mainpcb:sega", ROMREGION_ERASEFF ) /* Sega PCM sound data */
+ // empty
+ROM_END
/*************************************
*
@@ -5921,3 +5944,5 @@ GAME( 1992, scrossu, scross, sega_multi32_analog, scross, segas32_ne
GAME( 1992, titlef, 0, sega_multi32, titlef, segas32_new_state, init_titlef, ROT0, "Sega", "Title Fight (World)", MACHINE_IMPERFECT_GRAPHICS )
GAME( 1992, titlefu, titlef, sega_multi32, titlef, segas32_new_state, init_titlef, ROT0, "Sega", "Title Fight (US)", MACHINE_IMPERFECT_GRAPHICS )
GAME( 1992, titlefj, titlef, sega_multi32, titlef, segas32_new_state, init_titlef, ROT0, "Sega", "Title Fight (Japan)", MACHINE_IMPERFECT_GRAPHICS )
+
+GAME( 1993, as1, 0, sega_multi32, multi32_generic, segas32_new_state, init_holo, ROT0, "Sega", "AS-1 Controller", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND ) // needs laserdisc emulation
diff --git a/src/mame/drivers/segasp.cpp b/src/mame/drivers/segasp.cpp
index 0b80de4614f..3dc915afc43 100644
--- a/src/mame/drivers/segasp.cpp
+++ b/src/mame/drivers/segasp.cpp
@@ -56,6 +56,7 @@ King of Beetle: Battle Terminal ???-????? no
Love & Berry Ver 1.003 834-14661-02 ROM EXP 253-5508-0446 AAFE-01D84934906
Love & Berry Ver 2.000 834-14661-02 ROM EXP 253-5508-0446 AAFE-01D8493xxxx
Love & Berry 3 EXP Ver 1.002 834-14661-01 MDA-C0042 CF US/EXP 253-5508-0446 AAFE-01D64704904
+Love & Berry 3 CHN ???-????? MDA-C0071 CF EXP 253-5508-0446 AAFE-01G15765216
Marine & Marine ???-????? no ???-????-???? AAFE-xxxxxxxxxxx
Medalink 837-14699 no
Medalink 837-14700 no
@@ -456,7 +457,7 @@ ROM_START( dinoking )
ROM_PARAMETER( ":rom_board:id", "5502" ) // actually 8x 128Mbit FlashROMs
ROM_REGION( 0x800, "pic_readout", 0 )
- ROM_LOAD( "317-0408-com.ic15", 0, 0x800, BAD_DUMP CRC(0e94daba) SHA1(4e9722333a29afd0dbadba78b16344b77a689610) )
+ ROM_LOAD( "317-0408-com.ic15", 0, 0x800, CRC(f77c49dc) SHA1(e10173bbbd5930ed159cec9a7dba308e2a3f3c43) )
ROM_END
ROM_START( lovebery )
@@ -540,13 +541,16 @@ ROM_START( dinokior )
ROM_REGION( 0x08000000, "rom_board", ROMREGION_ERASEFF)
+ // DINOSAUR KING
+ // Operation:Dinosaur Rescue
+ // MDA-C0021
DISK_REGION( "cflash" )
DISK_IMAGE( "mda-c0021", 0, SHA1(947c987fb93a32c5acf7839e0186de91b5a9facc) )
ROM_PARAMETER( ":rom_board:id", "5502" ) // actually 8x 128Mbit FlashROMs
ROM_REGION( 0x800, "pic_readout", 0 )
- ROM_LOAD( "317-0408-com.ic15", 0, 0x800, BAD_DUMP CRC(0e94daba) SHA1(4e9722333a29afd0dbadba78b16344b77a689610) )
+ ROM_LOAD( "317-0408-com.ic15", 0, 0x800, CRC(f77c49dc) SHA1(e10173bbbd5930ed159cec9a7dba308e2a3f3c43) )
ROM_END
ROM_START( dinoki25 )
@@ -557,13 +561,16 @@ ROM_START( dinoki25 )
ROM_REGION( 0x08000000, "rom_board", ROMREGION_ERASEFF)
+ // DINOSAUR KING
+ // VER2.5 ENG_ASIA
+ // MDA-C0047
DISK_REGION( "cflash" )
DISK_IMAGE( "mda-c0047", 0, SHA1(0f97291d9c5dbe3e66a5220da05aebdfaa78b35d) )
ROM_PARAMETER( ":rom_board:id", "5508" ) // 8x 512Mbit FlashROMs
ROM_REGION( 0x800, "pic_readout", 0 )
- ROM_LOAD( "317-0408-com.ic15", 0, 0x800, BAD_DUMP CRC(0e94daba) SHA1(4e9722333a29afd0dbadba78b16344b77a689610) )
+ ROM_LOAD( "317-0408-com.ic15", 0, 0x800, CRC(f77c49dc) SHA1(e10173bbbd5930ed159cec9a7dba308e2a3f3c43) )
// DINOSAUR KING
// TYPE-3
@@ -581,6 +588,8 @@ ROM_START( loveber3 )
ROM_REGION( 0x08000000, "rom_board", ROMREGION_ERASEFF)
+ // LOVE AND BERRY III ENG
+ // MDA-C0042
DISK_REGION( "cflash" )
DISK_IMAGE( "mda-c0042", 0, SHA1(9992d90dae8ce7636e4153e02b779c27931b3be6) )
@@ -590,6 +599,26 @@ ROM_START( loveber3 )
ROM_LOAD( "317-0446-com.ic15", 0, 0x800, BAD_DUMP CRC(60f56bf2) SHA1(35e697aca7213e3fb1ebe75bb8991b1b992af6d9) )
ROM_END
+// This game's protection uses contact IC card reader made by Hirocon, with 2 IC card slots, cards probably SLE4428 or SLE5528.
+ROM_START( loveber3cn )
+ SEGASP_BIOS
+ ROM_DEFAULT_BIOS( "v201" )
+ SEGASP_EXP
+ SEGASP_MISC
+
+ ROM_REGION( 0x08000000, "rom_board", ROMREGION_ERASEFF)
+
+ // LOVE AND BERRY III CHN
+ // MDA-C0071
+ DISK_REGION( "cflash" )
+ DISK_IMAGE( "mda-c0071", 0, SHA1(ea65def6d97dc76c08654fae3c89b80a0492575b) ) // unused space contain leftovers from "Disney Magical Dream Dance" game, encrypted, key is 1ffbc9f0
+
+ ROM_PARAMETER( ":rom_board:id", "5508" ) // 8x 512Mbit FlashROMs
+
+ ROM_REGION( 0x800, "pic_readout", 0 )
+ ROM_LOAD( "317-0446-com.ic15", 0, 0x800, BAD_DUMP CRC(60f56bf2) SHA1(35e697aca7213e3fb1ebe75bb8991b1b992af6d9) )
+ROM_END
+
ROM_START( tetgiano )
SEGASP_BIOS
ROM_DEFAULT_BIOS( "v201" )
@@ -598,6 +627,9 @@ ROM_START( tetgiano )
ROM_REGION( 0x08000000, "rom_board", ROMREGION_ERASEFF)
+ // TETRIS - DEKARIS (romaji)
+ // / TETRIS® - GIANT
+ // MDA-C0076
DISK_REGION( "cflash" )
DISK_IMAGE( "mda-c0076", 0, SHA1(6987c888d2a3ada2d07f6396d47fdba507ca859d) )
@@ -624,4 +656,5 @@ GAME( 2009, tetgiant,segasp, segasp, segasp, segasp_state, init_segasp, R
GAME( 2006, dinokior,segasp, segasp, segasp, segasp_state, init_segasp, ROT0, "Sega", "Dinosaur King - Operation: Dinosaur Rescue (USA, Export) (MDA-C0021)", GAME_FLAGS )
GAME( 2008, dinoki25,segasp, segasp, segasp, segasp_state, init_segasp, ROT0, "Sega", "Dinosaur King - D-Team VS. the Alpha Fortress (Export, Ver 2.500) (MDA-C0047)", GAME_FLAGS )
GAME( 2007, loveber3,segasp, segasp, segasp, segasp_state, init_segasp, ROT0, "Sega", "Love And Berry - 3rd-5th Collection (USA, Export, Ver 1.002) (MDA-C0042)", GAME_FLAGS )
+GAME( 2010, loveber3cn,loveber3, segasp, segasp, segasp_state, init_segasp, ROT0, "Sega", "Love And Berry - 3rd-5th Collection (China, Ver 1.001) (MDA-C0071)", GAME_FLAGS )
GAME( 2009, tetgiano,tetgiant, segasp, segasp, segasp_state, init_segasp, ROT0, "Sega", "Tetris Giant / Tetris Dekaris (MDA-C0076)", GAME_FLAGS )
diff --git a/src/mame/drivers/segattl.cpp b/src/mame/drivers/segattl.cpp
index e582698a53a..9d61f5e4863 100644
--- a/src/mame/drivers/segattl.cpp
+++ b/src/mame/drivers/segattl.cpp
@@ -131,20 +131,21 @@ void segattl_state::video_start()
{
}
-MACHINE_CONFIG_START(segattl_state::segattl)
-
+void segattl_state::segattl(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", NETLIST_CPU, NETLIST_CLOCK)
- MCFG_NETLIST_SETUP(segattl)
+ NETLIST_CPU(config, m_maincpu, NETLIST_CLOCK);
+ m_maincpu->set_constructor(netlist_segattl);
/* video hardware */
- MCFG_FIXFREQ_ADD("fixfreq", "screen")
- MCFG_FIXFREQ_MONITOR_CLOCK(MASTER_CLOCK)
- MCFG_FIXFREQ_HORZ_PARAMS(H_TOTAL-67,H_TOTAL-40,H_TOTAL-8,H_TOTAL)
- MCFG_FIXFREQ_VERT_PARAMS(V_TOTAL-22,V_TOTAL-19,V_TOTAL-12,V_TOTAL)
- MCFG_FIXFREQ_FIELDCOUNT(1)
- MCFG_FIXFREQ_SYNC_THRESHOLD(0.30)
-MACHINE_CONFIG_END
+ SCREEN(config, "screen", SCREEN_TYPE_RASTER);
+ FIXFREQ(config, m_video).set_screen("screen");
+ m_video->set_monitor_clock(MASTER_CLOCK);
+ m_video->set_horz_params(H_TOTAL-67,H_TOTAL-40,H_TOTAL-8,H_TOTAL);
+ m_video->set_vert_params(V_TOTAL-22,V_TOTAL-19,V_TOTAL-12,V_TOTAL);
+ m_video->set_fieldcount(1);
+ m_video->set_threshold(0.30);
+}
/***************************************************************************
diff --git a/src/mame/drivers/segaxbd.cpp b/src/mame/drivers/segaxbd.cpp
index 8287207e302..38452f859a1 100644
--- a/src/mame/drivers/segaxbd.cpp
+++ b/src/mame/drivers/segaxbd.cpp
@@ -732,7 +732,7 @@ WRITE8_MEMBER(segaxbd_state::smgp_motor_w)
READ8_MEMBER(segaxbd_rascot_state::commram_r)
{
- return m_commram->right_r(space, m_commram_bank << 3 | offset);
+ return m_commram->right_r(m_commram_bank << 3 | offset);
}
@@ -743,7 +743,7 @@ READ8_MEMBER(segaxbd_rascot_state::commram_r)
WRITE8_MEMBER(segaxbd_rascot_state::commram_w)
{
- m_commram->right_w(space, m_commram_bank << 3 | offset, data);
+ m_commram->right_w(m_commram_bank << 3 | offset, data);
}
@@ -887,9 +887,9 @@ void segaxbd_state::palette_init()
int i2 = (value >> 2) & 1;
int i1 = (value >> 1) & 1;
int i0 = (value >> 0) & 1;
- m_palette_normal[value] = combine_6_weights(weights_normal, i0, i1, i2, i3, i4, 0);
- m_palette_shadow[value] = combine_6_weights(weights_sh, i0, i1, i2, i3, i4, 0);
- m_palette_hilight[value] = combine_6_weights(weights_sh, i0, i1, i2, i3, i4, 1);
+ m_palette_normal[value] = combine_weights(weights_normal, i0, i1, i2, i3, i4, 0);
+ m_palette_shadow[value] = combine_weights(weights_sh, i0, i1, i2, i3, i4, 0);
+ m_palette_hilight[value] = combine_weights(weights_sh, i0, i1, i2, i3, i4, 1);
}
}
@@ -1789,7 +1789,7 @@ void segaxbd_new_state_double::sega_xboard_fd1094_double(machine_config &config)
SEGA_XBD_FD1094(config, "mainpcb", 0);
SEGA_XBD_FD1094(config, "subpcb", 0);
- //MCFG_QUANTUM_PERFECT_CPU("mainpcb:maincpu") // doesn't help..
+ //config.m_perfect_cpu_quantum = subtag("mainpcb:maincpu"); // doesn't help..
}
diff --git a/src/mame/drivers/segaybd.cpp b/src/mame/drivers/segaybd.cpp
index c56ab281192..fbeee43126d 100644
--- a/src/mame/drivers/segaybd.cpp
+++ b/src/mame/drivers/segaybd.cpp
@@ -2722,7 +2722,6 @@ void segaybd_state::init_generic()
save_item(NAME(m_timer_irq_state));
save_item(NAME(m_vblank_irq_state));
save_item(NAME(m_misc_io_data));
- save_item(NAME(m_tmp_bitmap));
}
diff --git a/src/mame/drivers/seibucats.cpp b/src/mame/drivers/seibucats.cpp
index c6d5d7c8364..119003e59bb 100644
--- a/src/mame/drivers/seibucats.cpp
+++ b/src/mame/drivers/seibucats.cpp
@@ -293,41 +293,39 @@ IRQ_CALLBACK_MEMBER(seibucats_state::spi_irq_callback)
}
#endif
-MACHINE_CONFIG_START(seibucats_state::seibucats)
-
+void seibucats_state::seibucats(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu",I386, MAIN_CLOCK)
- MCFG_DEVICE_PROGRAM_MAP(seibucats_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", seibuspi_state, spi_interrupt)
- MCFG_DEVICE_IRQ_ACKNOWLEDGE_DRIVER(seibuspi_state, spi_irq_callback)
+ I386(config, m_maincpu, MAIN_CLOCK);
+ m_maincpu->set_addrmap(AS_PROGRAM, &seibucats_state::seibucats_map);
+ m_maincpu->set_vblank_int("screen", FUNC(seibuspi_state::spi_interrupt));
+ m_maincpu->set_irq_acknowledge_callback(FUNC(seibuspi_state::spi_irq_callback));
EEPROM_93C46_16BIT(config, "eeprom");
//JRC6355E(config, m_rtc, XTAL(32'768));
- MCFG_DEVICE_ADD("usart1", I8251, 0)
- MCFG_DEVICE_ADD("usart2", I8251, 0)
+ I8251(config, "usart1", 0);
+ I8251(config, "usart2", 0);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
-// MCFG_SCREEN_UPDATE_DRIVER(seibucats_state, screen_update)
- MCFG_SCREEN_UPDATE_DRIVER(seibuspi_state, screen_update_sys386f)
- MCFG_SCREEN_RAW_PARAMS(PIXEL_CLOCK, SPI_HTOTAL, SPI_HBEND, SPI_HBSTART, SPI_VTOTAL, SPI_VBEND, SPI_VBSTART)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+// screen.set_screen_update(FUNC(seibucats_state::screen_update));
+ screen.set_screen_update(FUNC(seibuspi_state::screen_update_sys386f));
+ screen.set_raw(PIXEL_CLOCK, SPI_HTOTAL, SPI_HBEND, SPI_HBSTART, SPI_VTOTAL, SPI_VBEND, SPI_VBSTART);
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_seibucats)
+ GFXDECODE(config, m_gfxdecode, m_palette, gfx_seibucats);
- MCFG_DEVICE_ADD(m_palette, PALETTE, palette_device::BLACK, 8192);
-// MCFG_PALETTE_FORMAT(xBBBBBGGGGGRRRRR)
- //MCFG_PALETTE_INIT_OWNER(seibucats_state, seibucats)
+ PALETTE(config, m_palette, palette_device::BLACK, 8192);
/* sound hardware */
SPEAKER(config, "lspeaker").front_left();
SPEAKER(config, "rspeaker").front_right();
- MCFG_DEVICE_ADD("ymz", YMZ280B, XTAL(16'384'000))
- MCFG_SOUND_ROUTE(0, "lspeaker", 1.0)
- MCFG_SOUND_ROUTE(1, "rspeaker", 1.0)
-MACHINE_CONFIG_END
+ ymz280b_device &ymz(YMZ280B(config, "ymz", XTAL(16'384'000)));
+ ymz.add_route(0, "lspeaker", 1.0);
+ ymz.add_route(0, "rspeaker", 1.0);
+}
/***************************************************************************
diff --git a/src/mame/drivers/seibuspi.cpp b/src/mame/drivers/seibuspi.cpp
index 0f1d32c1816..3ae437b0598 100644
--- a/src/mame/drivers/seibuspi.cpp
+++ b/src/mame/drivers/seibuspi.cpp
@@ -3517,6 +3517,43 @@ ROM_START( rdft2jb ) /* SPI Cart, Japan */
ROM_LOAD("flash0_blank_region01.u1053", 0x000000, 0x100000, CRC(7ae7ab76) SHA1(a2b196f470bf64af94002fc4e2640fadad00418f) )
ROM_END
+ROM_START( rdft2jc ) /* SPI SXX2C ROM SUB8 Cart, Japan */
+ ROM_REGION32_LE( 0x200000, "maincpu", 0 ) /* i386 program */
+ ROM_LOAD32_BYTE("seibu_1.u0211", 0x000000, 0x80000, CRC(36b6407c) SHA1(b3f5bb3c582aca71e0c7d9da5951b30c7389cc24) )
+ ROM_LOAD32_BYTE("seibu_2.u0212", 0x000001, 0x80000, CRC(65ee556e) SHA1(13311850aabba9fc373adfd5cd590c114505933f) )
+ ROM_LOAD32_BYTE("seibu_3.u0221", 0x000002, 0x80000, CRC(d2458358) SHA1(18a9cfee77a6a09584bc3fb0073c822d12de5bf1) )
+ ROM_LOAD32_BYTE("seibu_4.u0220", 0x000003, 0x80000, CRC(5c4412f9) SHA1(c72603bee3ce14f40d4bf5e3ae3f041b923edd57) )
+
+ ROM_REGION( 0x40000, "audiocpu", ROMREGION_ERASE00 ) /* 256K RAM, ROM from Z80 point-of-view */
+
+ ROM_REGION( 0x30000, "gfx1", ROMREGION_ERASEFF ) /* text layer roms */
+ ROM_LOAD24_BYTE("fix0.u0524", 0x000001, 0x10000, CRC(6fdf4cf6) SHA1(7e9d4a49e829dfdc373c0f5acfbe8c7a91ac115b) )
+ ROM_LOAD24_BYTE("fix1.u0518", 0x000000, 0x10000, CRC(69b7899b) SHA1(d3cacd4ef4d2c95d803403101beb9d4be75fae61) )
+ ROM_LOAD24_BYTE("fixp.u0514", 0x000002, 0x10000, CRC(99a5fece) SHA1(44ae95d650ed6e00202d3438f5f91a5e52e319cb) )
+
+ ROM_REGION( 0xc00000, "gfx2", ROMREGION_ERASEFF ) /* background layer roms */
+ ROM_LOAD24_WORD("bg-1d.u0535", 0x000000, 0x400000, CRC(6143f576) SHA1(c034923d0663d9ef24357a03098b8cb81dbab9f8) )
+ ROM_LOAD24_BYTE("bg-1p.u0537", 0x000002, 0x200000, CRC(55e64ef7) SHA1(aae991268948d07342ee8ba1b3761bd180aab8ec) )
+ ROM_LOAD24_WORD("bg-2d.u0536", 0x600000, 0x400000, CRC(c607a444) SHA1(dc1aa96a42e9394ca6036359670a4ec6f830c96d) )
+ ROM_LOAD24_BYTE("bg-2p.u0538", 0x600002, 0x200000, CRC(f0830248) SHA1(6075df96b49e70d2243fef691e096119e7a4d044) )
+
+ ROM_REGION( 0x1200000, "gfx3", 0 ) /* sprites */
+ ROM_LOAD("obj3.u0434", 0x0000000, 0x400000, CRC(e08f42dc) SHA1(5188d71d4355eaf43ea8893b4cfc4fe80cc24f41) )
+ ROM_LOAD("obj3b.u0433", 0x0400000, 0x200000, CRC(1b6a523c) SHA1(99a420dbc8e22e7832ccda7cec9fa661a2a2687a) )
+ ROM_LOAD("obj2.u0431", 0x0600000, 0x400000, CRC(7aeadd8e) SHA1(47103c0579240c5b1add4d0b164eaf76f5fa97f0) )
+ ROM_LOAD("obj2b.u0432", 0x0a00000, 0x200000, CRC(5d790a5d) SHA1(1ed5d4ad4c9a7e505ce35dcc90d184c26ce891dc) )
+ ROM_LOAD("obj1.u0429", 0x0c00000, 0x400000, CRC(c2c50f02) SHA1(b81397b5800c6d49f58b7ac7ff6eac56da3c5257) )
+ ROM_LOAD("obj1b.u0430", 0x1000000, 0x200000, CRC(5259321f) SHA1(3c70c1147e49f81371d0f60f7108d9718d56faf4) )
+
+ ROM_REGION32_LE( 0xa00000, "sound01", ROMREGION_ERASE00 ) /* sound roms */
+ ROM_LOAD32_WORD("pcm.u0217", 0x000000, 0x100000, CRC(2edc30b5) SHA1(c25d690d633657fc3687636b9070f36bd305ae06) )
+ ROM_CONTINUE( 0x400000, 0x100000 )
+ ROM_LOAD32_BYTE("sound1.u0222", 0x800000, 0x080000, CRC(b7bd3703) SHA1(6427a7e6de10d6743d6e64b984a1d1c647f5643a) )
+
+ ROM_REGION( 0x100000, "soundflash1", 0 ) /* on SPI motherboard */
+ ROM_LOAD("flash0_blank_region01.u1053", 0x000000, 0x100000, CRC(7ae7ab76) SHA1(a2b196f470bf64af94002fc4e2640fadad00418f) )
+ROM_END
+
ROM_START( rdft2it ) /* SPI Cart, Italy */
ROM_REGION32_LE( 0x200000, "maincpu", 0 ) /* i386 program */
ROM_LOAD32_BYTE("seibu1.bin",0x000000, 0x80000, CRC(501b92a9) SHA1(3e1c5cc63906ec7b97a3478557ec2638c515d726) )
@@ -4139,6 +4176,7 @@ GAME( 1997, rdft2aa, rdft2, rdft2, spi_2button, seibuspi_state, init_rdf
GAME( 1997, rdft2it, rdft2, rdft2, spi_2button, seibuspi_state, init_rdft2, ROT270, "Seibu Kaihatsu", "Raiden Fighters 2 - Operation Hell Dive (Italy)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_GRAPHICS )
// these are unique
GAME( 1997, rdft2jb, rdft2, rdft2, spi_2button, seibuspi_state, init_rdft2, ROT270, "Seibu Kaihatsu", "Raiden Fighters 2 - Operation Hell Dive (Japan set 3)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_GRAPHICS )
+GAME( 1997, rdft2jc, rdft2, rdft2, spi_2button, seibuspi_state, init_rdft2, ROT270, "Seibu Kaihatsu", "Raiden Fighters 2 - Operation Hell Dive (Japan set 4)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_GRAPHICS )
GAME( 1997, rdft2t, rdft2, rdft2, spi_2button, seibuspi_state, init_rdft2, ROT270, "Seibu Kaihatsu", "Raiden Fighters 2 - Operation Hell Dive (Taiwan)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_GRAPHICS )
GAME( 1997, rdft2u, rdft2, rdft2, spi_2button, seibuspi_state, init_rdft2, ROT270, "Seibu Kaihatsu (Fabtek license)", "Raiden Fighters 2 - Operation Hell Dive (US)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_GRAPHICS )
diff --git a/src/mame/drivers/seicross.cpp b/src/mame/drivers/seicross.cpp
index a848fa0edc5..5bf453541af 100644
--- a/src/mame/drivers/seicross.cpp
+++ b/src/mame/drivers/seicross.cpp
@@ -395,30 +395,30 @@ INTERRUPT_GEN_MEMBER(seicross_state::vblank_irq)
}
-MACHINE_CONFIG_START(seicross_state::no_nvram)
-
+void seicross_state::no_nvram(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, XTAL(18'432'000) / 6) /* D780C, 3.072 MHz? */
- MCFG_DEVICE_PROGRAM_MAP(main_map)
- MCFG_DEVICE_IO_MAP(main_portmap)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", seicross_state, vblank_irq)
+ Z80(config, m_maincpu, XTAL(18'432'000) / 6); /* D780C, 3.072 MHz? */
+ m_maincpu->set_addrmap(AS_PROGRAM, &seicross_state::main_map);
+ m_maincpu->set_addrmap(AS_IO, &seicross_state::main_portmap);
+ m_maincpu->set_vblank_int("screen", FUNC(seicross_state::vblank_irq));
- MCFG_DEVICE_ADD("mcu", NSC8105, XTAL(18'432'000) / 6) /* ??? */
- MCFG_DEVICE_PROGRAM_MAP(mcu_no_nvram_map)
+ NSC8105(config, m_mcu, XTAL(18'432'000) / 6); /* ??? */
+ m_mcu->set_addrmap(AS_PROGRAM, &seicross_state::mcu_no_nvram_map);
- MCFG_QUANTUM_TIME(attotime::from_hz(1200)) /* 20 CPU slices per frame - an high value to ensure proper */
+ config.m_minimum_quantum = attotime::from_hz(1200); /* 20 CPU slices per frame - a high value to ensure proper */
/* synchronization of the CPUs */
WATCHDOG_TIMER(config, "watchdog");
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */ /* frames per second, vblank duration */)
- MCFG_SCREEN_SIZE(32*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(seicross_state, screen_update)
- MCFG_SCREEN_PALETTE("palette")
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500) /* not accurate */ /* frames per second, vblank duration */);
+ screen.set_size(32*8, 32*8);
+ screen.set_visarea(0*8, 32*8-1, 2*8, 30*8-1);
+ screen.set_screen_update(FUNC(seicross_state::screen_update));
+ screen.set_palette(m_palette);
GFXDECODE(config, m_gfxdecode, m_palette, gfx_seicross);
PALETTE(config, m_palette, FUNC(seicross_state::seicross_palette), 64);
@@ -431,27 +431,28 @@ MACHINE_CONFIG_START(seicross_state::no_nvram)
aysnd.port_b_write_callback().set(FUNC(seicross_state::portB_w));
aysnd.add_route(ALL_OUTPUTS, "speaker", 0.25);
- MCFG_DEVICE_ADD("dac", DAC_4BIT_R2R, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 0.12) // unknown DAC
- MCFG_DEVICE_ADD("vref", VOLTAGE_REGULATOR, 0) MCFG_VOLTAGE_REGULATOR_OUTPUT(5.0)
- MCFG_SOUND_ROUTE(0, "dac", 1.0, DAC_VREF_POS_INPUT) MCFG_SOUND_ROUTE(0, "dac", -1.0, DAC_VREF_NEG_INPUT)
-MACHINE_CONFIG_END
+ DAC_4BIT_R2R(config, m_dac, 0).add_route(ALL_OUTPUTS, "speaker", 0.12); // unknown DAC
+ voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref"));
+ vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT);
+ vref.add_route(0, "dac", -1.0, DAC_VREF_NEG_INPUT);
+}
-MACHINE_CONFIG_START(seicross_state::nvram)
+void seicross_state::nvram(machine_config &config)
+{
no_nvram(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("mcu")
- MCFG_DEVICE_PROGRAM_MAP(mcu_nvram_map)
+ m_mcu->set_addrmap(AS_PROGRAM, &seicross_state::mcu_nvram_map);
NVRAM(config, "nvram").set_custom_handler(FUNC(seicross_state::nvram_init));
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(seicross_state::friskytb)
+void seicross_state::friskytb(machine_config &config)
+{
nvram(config);
- MCFG_DEVICE_MODIFY("mcu")
- MCFG_DEVICE_OPCODES_MAP(decrypted_opcodes_map)
-MACHINE_CONFIG_END
+ m_mcu->set_addrmap(AS_OPCODES, &seicross_state::decrypted_opcodes_map);
+}
/***************************************************************************
diff --git a/src/mame/drivers/seicupbl.cpp b/src/mame/drivers/seicupbl.cpp
index f74f53ddce3..a052a287d03 100644
--- a/src/mame/drivers/seicupbl.cpp
+++ b/src/mame/drivers/seicupbl.cpp
@@ -11,6 +11,13 @@
- tilemap chip drawings might be merged between this and other
Seibu implementations.
+OSC: 40MHz, 15MHz & 8MHz
+
+Measured clocks:
+ MC68000P12F - 14.99MHz
+ Z0840006PSC - 3.996MHz
+ OKI M6295 - 0.999MHz
+
***************************************************************************/
@@ -25,8 +32,6 @@
#include "speaker.h"
-#define MAIN_CLOCK XTAL(8'000'000)
-
class seicupbl_state : public driver_device
{
public:
@@ -551,34 +556,34 @@ static GFXDECODE_START( gfx_seicupbl_csb )
GFXDECODE_ENTRY( "char", 0, cupsocsb_8x8_tilelayout, 48*16, 16 )
GFXDECODE_ENTRY( "gfx3", 0, cupsocsb_tilelayout, 0*16, 32 )
GFXDECODE_ENTRY( "gfx4", 0, cupsocsb_tilelayout, 32*16, 16 ) /* unused */
- GFXDECODE_ENTRY( "sprite", 0, cupsocsb_spritelayout, 0*16, 8*16 )
+ GFXDECODE_ENTRY( "sprite", 0, cupsocsb_spritelayout, 0*16, 8*16 )
GFXDECODE_ENTRY( "gfx5", 0, cupsocsb_tilelayout, 32*16, 16 )
GFXDECODE_ENTRY( "gfx6", 0, cupsocsb_tilelayout, 16*16, 16 )
GFXDECODE_END
-MACHINE_CONFIG_START(seicupbl_state::cupsocbl)
-
+void seicupbl_state::cupsocbl(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M68000,12000000)
- MCFG_DEVICE_PROGRAM_MAP(cupsocbl_mem)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", seicupbl_state, irq4_line_hold) /* VBL */
+ M68000(config, m_maincpu, 15_MHz_XTAL); // 15MHz verified
+ m_maincpu->set_addrmap(AS_PROGRAM, &seicupbl_state::cupsocbl_mem);
+ m_maincpu->set_vblank_int("screen", FUNC(seicupbl_state::irq4_line_hold)); /* VBL */
- MCFG_DEVICE_ADD("seibucop_boot", SEIBU_COP_BOOTLEG, "maincpu")
+ SEIBU_COP_BOOTLEG(config, "seibucop_boot", m_maincpu);
/*Different Sound hardware*/
- MCFG_DEVICE_ADD("audiocpu", Z80,14318180/4)
- MCFG_DEVICE_PROGRAM_MAP(cupsocbl_sound_mem)
- //MCFG_PERIODIC_INT("screen", nmi_line_pulse)
+ Z80(config, m_audiocpu, 8_MHz_XTAL/2); // 4MHz verified
+ m_audiocpu->set_addrmap(AS_PROGRAM, &seicupbl_state::cupsocbl_sound_mem);
+ //m_audiocpu->set_periodic_int("screen", FUNC(seicupbl_state::nmi_line_pulse));
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(42*8, 36*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 40*8-1, 0*8, 30*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(seicupbl_state, screen_update)
- MCFG_SCREEN_PALETTE(m_palette)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(42*8, 36*8);
+ screen.set_visarea(0*8, 40*8-1, 0*8, 30*8-1);
+ screen.set_screen_update(FUNC(seicupbl_state::screen_update));
+ screen.set_palette(m_palette);
//seibu_crtc_device &crtc(SEIBU_CRTC(config, "crtc", 0));
//crtc.layer_en_callback().set(FUNC(seicupbl_state::tilemap_enable_w));
@@ -597,9 +602,8 @@ MACHINE_CONFIG_START(seicupbl_state::cupsocbl)
GENERIC_LATCH_8(config, m_soundlatch);
m_soundlatch->data_pending_callback().set_inputline(m_audiocpu, INPUT_LINE_NMI);
- MCFG_DEVICE_ADD("oki", OKIM6295, 1000000, okim6295_device::PIN7_HIGH)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
-MACHINE_CONFIG_END
+ OKIM6295(config, m_oki, 8_MHz_XTAL/8, okim6295_device::PIN7_HIGH).add_route(ALL_OUTPUTS, "mono", 1.0); // 1MHz verified
+}
@@ -622,10 +626,12 @@ Seibu Cup Soccer - Seibu - Bootleg
1 x oki 6295
sc_01 (prg)
sc_02 and sc_03 (data)
+8MHz & 40MHz OSC
(prg)
-1 x 68000
+1 x 68000P12
sc_04 and sc_05
+15MHz OSC
(gfx)
2 x ti tpc1020
@@ -701,26 +707,31 @@ ROM_START( cupsocsb )
ROM_LOAD16_BYTE( "sc_14.bin", 0x00001, 0x080000, CRC(566086c2) SHA1(b7d09ce978f99ecc0d1975b31330ed49317701d5) )
ROM_END
-/* slight changes in the program roms compared to above set, all remaining roms were the same */
+/* slight changes in the program roms compared to above set, all remaining roms were the same
+ main PCB is marked: "SOCCER 1", "rev.5" and "lc" on component side ("lc" is the Italian for "Lato Componenti" which translates to "Components Side")
+ main PCB is marked: "SOCCER 1", "rev.5" and "ls" on component side ("ls" is the Italian for "Lato Saldature" which translates to "Solders Side")
+ ROMs PCB is marked: "CALCIO 2", "rev.3" and "lc" on component side ("CALCIO is the Italian for "SOCCER"; "lc" is the Italian for "Lato Componenti" which translates to "Components Side")
+ ROMs PCB is marked: "CALCIO 2", "rev.3" and "ls" on component side ("CALCIO is the Italian for "SOCCER"; "ls" is the Italian for "Lato Saldature" which translates to "Solders Side")
+ main PCB is labelled: "SOCCER" on solder side */
ROM_START( cupsocsb2 )
ROM_REGION( 0x100000, "maincpu", 0 ) /* 68000 Code */
- ROM_LOAD16_BYTE( "4", 0x00001, 0x80000, CRC(83db76f8) SHA1(ffcd0a728de58871b945c15cc27da374b587e170) ) // sldh
- ROM_LOAD16_BYTE( "5", 0x00000, 0x80000, CRC(c01e88c6) SHA1(8f90261792343c92ddd877ab8a2480b5aac82961) ) // sldh
+ ROM_LOAD16_BYTE( "4.27040.u11", 0x00001, 0x80000, CRC(83db76f8) SHA1(ffcd0a728de58871b945c15cc27da374b587e170) ) // actually was a 27c4001
+ ROM_LOAD16_BYTE( "5.27040.u17", 0x00000, 0x80000, CRC(c01e88c6) SHA1(8f90261792343c92ddd877ab8a2480b5aac82961) ) // actually was a 27c4001
ROM_REGION( 0x10000, "audiocpu", 0 ) /* Z80 code */
- ROM_LOAD( "sc_01.bin", 0x000000, 0x08000, CRC(cea39d6d) SHA1(f0b79c03ffafdd1e57673d6d4836becbe415110b) )
+ ROM_LOAD( "1.27512.u20", 0x000000, 0x08000, CRC(cea39d6d) SHA1(f0b79c03ffafdd1e57673d6d4836becbe415110b) ) // 27c512
ROM_CONTINUE( 0x000000, 0x08000 )
ROM_REGION( 0x200000, "sprite", ROMREGION_INVERT ) /* bootleg sprite gfx */
- ROM_LOAD( "sc_07.bin", 0x000000, 0x080000, CRC(dcb29d01) SHA1(72b4234622605f0ab03f21fdb6a61c6dac36000d) )
- ROM_LOAD( "sc_06.bin", 0x080000, 0x080000, CRC(2dc70e05) SHA1(f1d0beb8428a7e1d7c7818e6719abdc543b2fa80) )
+ ROM_LOAD( "7.27040.u86", 0x000000, 0x080000, CRC(dcb29d01) SHA1(72b4234622605f0ab03f21fdb6a61c6dac36000d) ) // actually was a 27c4001
+ ROM_LOAD( "6.27040.u87", 0x080000, 0x080000, CRC(2dc70e05) SHA1(f1d0beb8428a7e1d7c7818e6719abdc543b2fa80) ) // actually was a 27c4001
ROM_COPY( "sprite", 0x00000, 0x100000, 0x100000 )
ROM_REGION( 0x200000, "test1", 0 ) /* bootleg tile gfx */
- ROM_LOAD16_BYTE( "sc_09.bin", 0x000000, 0x080000, CRC(695b6342) SHA1(dfccb43789021ba2568b9284ae61e64f7f89b152) )
- ROM_LOAD16_BYTE( "sc_10.bin", 0x000001, 0x080000, CRC(27e172b8) SHA1(ed86db2f42c8061607d46f2407b0130aaf692a02) )
- ROM_LOAD16_BYTE( "sc_08.bin", 0x100000, 0x080000, CRC(637120f3) SHA1(b4b2ad192e46ff80d4cb440d7fb6dac215a353ed) )
- ROM_LOAD16_BYTE( "sc_11.bin", 0x100001, 0x080000, CRC(0cd5ca5e) SHA1(a59665e543e9383355de2576e6693348ec356591) )
+ ROM_LOAD16_BYTE( "9.27040.u36", 0x000000, 0x080000, CRC(695b6342) SHA1(dfccb43789021ba2568b9284ae61e64f7f89b152) ) // actually was a 27c4001
+ ROM_LOAD16_BYTE( "10.27040.u37", 0x000001, 0x080000, CRC(27e172b8) SHA1(ed86db2f42c8061607d46f2407b0130aaf692a02) ) // actually was a 27c4001
+ ROM_LOAD16_BYTE( "8.27040.u38", 0x100000, 0x080000, CRC(637120f3) SHA1(b4b2ad192e46ff80d4cb440d7fb6dac215a353ed) ) // actually was a 27c4001
+ ROM_LOAD16_BYTE( "11.27040.u39", 0x100001, 0x080000, CRC(0cd5ca5e) SHA1(a59665e543e9383355de2576e6693348ec356591) ) // actually was a 27c4001
ROM_REGION( 0x020000, "char", ROMREGION_INVERT )
ROM_COPY( "test1", 0x080000, 0x00000, 0x020000 )
@@ -738,9 +749,11 @@ ROM_START( cupsocsb2 )
ROM_REGION( 0x080000, "gfx6", ROMREGION_INVERT ) /* LBK tiles */
ROM_COPY( "gfx5", 0x00000, 0x00000, 0x080000 )
+ // A dump of 02.u26 from a second PCB had 3 different bytes: 0x8000 from 0x80 to 0xff; 0x10000 from 0xa4 to 0x4a; 0x18000 from 0x4a to 0xa4.
+ // However the first dump matches all the other sets and all the other ROMs from the second PCB match the ones from the first.
ROM_REGION( 0x100000, "adpcm", ROMREGION_ERASEFF ) /* ADPCM samples */
- ROM_LOAD( "sc_02.bin", 0x000000, 0x020000, CRC(a70d4f03) SHA1(c2482e624c8a828a94206a36d10c1021ad8ca1d0) )
- ROM_LOAD( "sc_03.bin", 0x080000, 0x080000, CRC(6e254d12) SHA1(857779dbd276b688201a8ea3afd5817e38acad2e) )
+ ROM_LOAD( "2.27010.u26", 0x000000, 0x020000, CRC(a70d4f03) SHA1(c2482e624c8a828a94206a36d10c1021ad8ca1d0) ) // 27c010a
+ ROM_LOAD( "3.27040.u25", 0x080000, 0x080000, CRC(6e254d12) SHA1(857779dbd276b688201a8ea3afd5817e38acad2e) ) // actually was a 27c4001
ROM_REGION( 0x200000, "oki", ROMREGION_ERASEFF )
ROM_COPY( "adpcm", 0x00000, 0x000000, 0x20000 ) //bank 0
@@ -757,11 +770,11 @@ ROM_START( cupsocsb2 )
/* these are maths tables, for whatever COP replacement the bootlegs use */
ROM_REGION( 0x500000, "unknown0", 0 )
- ROM_LOAD16_BYTE( "sc_13.bin", 0x00000, 0x010000, CRC(229bddd8) SHA1(0924bf29db9c5a970546f154e7752697fdce6a58) )
- ROM_LOAD16_BYTE( "sc_12.bin", 0x00001, 0x010000, CRC(dabfa826) SHA1(0db587c846755491b169ef7751ba8e7cdc2607e6) )
+ ROM_LOAD16_BYTE( "13.bin", 0x00000, 0x010000, CRC(229bddd8) SHA1(0924bf29db9c5a970546f154e7752697fdce6a58) ) // 27c512
+ ROM_LOAD16_BYTE( "12.bin", 0x00001, 0x010000, CRC(dabfa826) SHA1(0db587c846755491b169ef7751ba8e7cdc2607e6) ) // 27c512
ROM_REGION( 0x500000, "unknown1", 0 )
- ROM_LOAD16_BYTE( "sc_15.bin", 0x00000, 0x080000, CRC(8fd87e65) SHA1(acc9fd0289fa9ab60bec16d3e642039380e5180a) )
- ROM_LOAD16_BYTE( "sc_14.bin", 0x00001, 0x080000, CRC(566086c2) SHA1(b7d09ce978f99ecc0d1975b31330ed49317701d5) )
+ ROM_LOAD16_BYTE( "15.bin", 0x00000, 0x080000, CRC(8fd87e65) SHA1(acc9fd0289fa9ab60bec16d3e642039380e5180a) ) // 27c4001
+ ROM_LOAD16_BYTE( "14.bin", 0x00001, 0x080000, CRC(566086c2) SHA1(b7d09ce978f99ecc0d1975b31330ed49317701d5) ) // 27c4001
ROM_END
ROM_START( cupsocsb3 )
@@ -826,6 +839,6 @@ ROM_START( cupsocsb3 )
ROM_END
-GAME( 1992, cupsocsb, cupsoc, cupsocbl, cupsoc, seicupbl_state, empty_init, ROT0, "bootleg", "Seibu Cup Soccer :Selection: (bootleg, set 1)", MACHINE_UNEMULATED_PROTECTION | MACHINE_NOT_WORKING )
-GAME( 1992, cupsocsb2,cupsoc, cupsocbl, cupsoc, seicupbl_state, empty_init, ROT0, "bootleg", "Seibu Cup Soccer :Selection: (bootleg, set 2)", MACHINE_UNEMULATED_PROTECTION | MACHINE_NOT_WORKING )
-GAME( 1992, cupsocsb3,cupsoc, cupsocbl, cupsoc, seicupbl_state, empty_init, ROT0, "bootleg", "Seibu Cup Soccer :Selection: (bootleg, set 3)", MACHINE_UNEMULATED_PROTECTION | MACHINE_NOT_WORKING )
+GAME( 1992, cupsocsb, cupsoc, cupsocbl, cupsoc, seicupbl_state, empty_init, ROT0, "bootleg", "Seibu Cup Soccer :Selection: (bootleg, set 1)", MACHINE_UNEMULATED_PROTECTION | MACHINE_NOT_WORKING )
+GAME( 1992, cupsocsb2, cupsoc, cupsocbl, cupsoc, seicupbl_state, empty_init, ROT0, "bootleg", "Seibu Cup Soccer :Selection: (bootleg, set 2)", MACHINE_UNEMULATED_PROTECTION | MACHINE_NOT_WORKING )
+GAME( 1992, cupsocsb3, cupsoc, cupsocbl, cupsoc, seicupbl_state, empty_init, ROT0, "bootleg", "Seibu Cup Soccer :Selection: (bootleg, set 3)", MACHINE_UNEMULATED_PROTECTION | MACHINE_NOT_WORKING )
diff --git a/src/mame/drivers/selz80.cpp b/src/mame/drivers/selz80.cpp
index ace9dad4f5b..9956c917ac0 100644
--- a/src/mame/drivers/selz80.cpp
+++ b/src/mame/drivers/selz80.cpp
@@ -216,11 +216,12 @@ void selz80_state::machine_start()
m_digits.resolve();
}
-MACHINE_CONFIG_START(selz80_state::selz80)
+void selz80_state::selz80(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu",Z80, XTAL(4'000'000)) // it's actually a 5MHz XTAL with a NEC uPD780C-1 cpu
- MCFG_DEVICE_PROGRAM_MAP(selz80_mem)
- MCFG_DEVICE_IO_MAP(selz80_io)
+ Z80(config, m_maincpu, XTAL(4'000'000)); // it's actually a 5MHz XTAL with a NEC uPD780C-1 cpu
+ m_maincpu->set_addrmap(AS_PROGRAM, &selz80_state::selz80_mem);
+ m_maincpu->set_addrmap(AS_IO, &selz80_state::selz80_io);
MCFG_MACHINE_RESET_OVERRIDE(selz80_state, selz80 )
/* video hardware */
@@ -247,14 +248,14 @@ MACHINE_CONFIG_START(selz80_state::selz80)
kbdc.in_rl_callback().set(FUNC(selz80_state::kbd_r)); // kbd RL lines
kbdc.in_shift_callback().set_constant(1); // Shift key
kbdc.in_ctrl_callback().set_constant(1);
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(selz80_state::dagz80)
+void selz80_state::dagz80(machine_config &config)
+{
selz80(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(dagz80_mem)
+ m_maincpu->set_addrmap(AS_PROGRAM, &selz80_state::dagz80_mem);
MCFG_MACHINE_RESET_OVERRIDE(selz80_state, dagz80 )
-MACHINE_CONFIG_END
+}
/* ROM definition */
diff --git a/src/mame/drivers/sengokmj.cpp b/src/mame/drivers/sengokmj.cpp
index 4ae31d9a243..47e80655ce3 100644
--- a/src/mame/drivers/sengokmj.cpp
+++ b/src/mame/drivers/sengokmj.cpp
@@ -577,8 +577,8 @@ WRITE16_MEMBER( sengokmj_state::layer_scroll_w )
}
-MACHINE_CONFIG_START(sengokmj_state::sengokmj)
-
+void sengokmj_state::sengokmj(machine_config &config)
+{
/* basic machine hardware */
V30(config, m_maincpu, 16000000/2); /* V30-8 */
m_maincpu->set_addrmap(AS_PROGRAM, &sengokmj_state::sengokmj_map);
diff --git a/src/mame/drivers/senjyo.cpp b/src/mame/drivers/senjyo.cpp
index 91184fa8cca..552359d2af4 100644
--- a/src/mame/drivers/senjyo.cpp
+++ b/src/mame/drivers/senjyo.cpp
@@ -166,9 +166,9 @@ void senjyo_state::senjyo_sound_map(address_map &map)
{
map(0x0000, 0x1fff).rom();
map(0x4000, 0x43ff).ram();
- map(0x8000, 0x8000).w("sn1", FUNC(sn76496_device::command_w));
- map(0x9000, 0x9000).w("sn2", FUNC(sn76496_device::command_w));
- map(0xa000, 0xa000).w("sn3", FUNC(sn76496_device::command_w));
+ map(0x8000, 0x8000).w("sn1", FUNC(sn76496_device::write));
+ map(0x9000, 0x9000).w("sn2", FUNC(sn76496_device::write));
+ map(0xa000, 0xa000).w("sn3", FUNC(sn76496_device::write));
map(0xd000, 0xd000).w(FUNC(senjyo_state::volume_w));
}
@@ -231,9 +231,9 @@ void senjyo_state::starforb_sound_map(address_map &map)
{
map(0x0000, 0x1fff).rom();
map(0x4000, 0x43ff).ram();
- map(0x8000, 0x8000).w("sn1", FUNC(sn76496_device::command_w));
- map(0x9000, 0x9000).w("sn2", FUNC(sn76496_device::command_w));
- map(0xa000, 0xa000).w("sn3", FUNC(sn76496_device::command_w));
+ map(0x8000, 0x8000).w("sn1", FUNC(sn76496_device::write));
+ map(0x9000, 0x9000).w("sn2", FUNC(sn76496_device::write));
+ map(0xa000, 0xa000).w("sn3", FUNC(sn76496_device::write));
map(0xd000, 0xd000).w(FUNC(senjyo_state::volume_w));
map(0xf000, 0xffff).ram();
}
@@ -548,12 +548,12 @@ static GFXDECODE_START( gfx_senjyo )
GFXDECODE_END
-MACHINE_CONFIG_START(senjyo_state::senjyo)
-
+void senjyo_state::senjyo(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, 4000000) /* 4 MHz? */
- MCFG_DEVICE_PROGRAM_MAP(senjyo_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", senjyo_state, irq0_line_assert)
+ Z80(config, m_maincpu, 4000000); /* 4 MHz? */
+ m_maincpu->set_addrmap(AS_PROGRAM, &senjyo_state::senjyo_map);
+ m_maincpu->set_vblank_int("screen", FUNC(senjyo_state::irq0_line_assert));
z80_device& sub(Z80(config, "sub", 2000000)); /* 2 MHz? */
sub.set_daisy_config(senjyo_daisy_chain);
@@ -570,12 +570,12 @@ MACHINE_CONFIG_START(senjyo_state::senjyo)
ctc.zc_callback<2>().set(FUNC(senjyo_state::sound_line_clock));
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(32*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(senjyo_state, screen_update)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(32*8, 32*8);
+ screen.set_visarea(0*8, 32*8-1, 2*8, 30*8-1);
+ screen.set_screen_update(FUNC(senjyo_state::screen_update));
GFXDECODE(config, m_gfxdecode, m_palette, gfx_senjyo);
@@ -585,19 +585,17 @@ MACHINE_CONFIG_START(senjyo_state::senjyo)
/* sound hardware */
SPEAKER(config, "speaker").front_center();
- MCFG_DEVICE_ADD("sn1", SN76496, 2000000)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 0.5)
+ SN76496(config, "sn1", 2000000).add_route(ALL_OUTPUTS, "speaker", 0.5);
- MCFG_DEVICE_ADD("sn2", SN76496, 2000000)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 0.5)
+ SN76496(config, "sn2", 2000000).add_route(ALL_OUTPUTS, "speaker", 0.5);
- MCFG_DEVICE_ADD("sn3", SN76496, 2000000)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 0.5)
+ SN76496(config, "sn3", 2000000).add_route(ALL_OUTPUTS, "speaker", 0.5);
- MCFG_DEVICE_ADD("dac", DAC_4BIT_R2R, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 0.05) // unknown DAC
- MCFG_DEVICE_ADD("vref", VOLTAGE_REGULATOR, 0) MCFG_VOLTAGE_REGULATOR_OUTPUT(5.0)
- MCFG_SOUND_ROUTE(0, "dac", 1.0, DAC_VREF_POS_INPUT) MCFG_SOUND_ROUTE(0, "dac", -1.0, DAC_VREF_NEG_INPUT)
-MACHINE_CONFIG_END
+ DAC_4BIT_R2R(config, m_dac, 0).add_route(ALL_OUTPUTS, "speaker", 0.05); // unknown DAC
+ voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref"));
+ vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT);
+ vref.add_route(0, "dac", -1.0, DAC_VREF_NEG_INPUT);
+}
@@ -622,16 +620,15 @@ void senjyo_state::senjyox_a(machine_config &config)
}
-MACHINE_CONFIG_START(senjyo_state::starforb)
+void senjyo_state::starforb(machine_config &config)
+{
senjyox_e(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(starforb_map)
+ m_maincpu->set_addrmap(AS_PROGRAM, &senjyo_state::starforb_map);
- MCFG_DEVICE_MODIFY("sub")
- MCFG_DEVICE_PROGRAM_MAP(starforb_sound_map)
-MACHINE_CONFIG_END
+ subdevice<z80_device>("sub")->set_addrmap(AS_PROGRAM, &senjyo_state::starforb_sound_map);
+}
/***************************************************************************
diff --git a/src/mame/drivers/seta.cpp b/src/mame/drivers/seta.cpp
index 10b8e864981..8ee07a16bed 100644
--- a/src/mame/drivers/seta.cpp
+++ b/src/mame/drivers/seta.cpp
@@ -111,7 +111,7 @@ TODO:
zombraid not aligned when flipped vertically or horizontally
- bad sound in sokonuke?
-- in msgunda1, colors for the score display screw up after the second animation
+- in msgundam1, colors for the score display screw up after the second animation
in attract mode. The end of the animation also has garbled sprites.
Note that the animation is not present in msgundam.
- Some games: battery backed portion of RAM (e.g. downtown, kiwame, zombraid)
@@ -2789,6 +2789,32 @@ void seta_state::msgundam_map(address_map &map)
map(0xd00000, 0xd00007).rw("pit", FUNC(pit8254_device::read), FUNC(pit8254_device::write)).umask16(0x00ff);
}
+void seta_state::msgundamb_map(address_map &map)
+{
+ map(0x000000, 0x07ffff).rom(); // ROM
+ map(0x100000, 0x1fffff).rom(); // ROM
+ map(0x200000, 0x20ffff).ram(); // RAM
+ map(0x400000, 0x400001).portr("P1"); // P1
+ map(0x400002, 0x400003).portr("P2"); // P2
+ map(0x400004, 0x400005).portr("COINS"); // Coins
+ map(0x400000, 0x400001).w(FUNC(seta_state::ipl1_ack_w)); // Lev 2 IRQ Ack
+ map(0x400004, 0x400005).w(FUNC(seta_state::ipl2_ack_w)); // Lev 4 IRQ Ack
+ map(0x500001, 0x500001).w(FUNC(seta_state::seta_coin_counter_w));
+ map(0x500003, 0x500003).w(FUNC(seta_state::seta_vregs_w)); // Video Registers
+ map(0x500004, 0x500005).nopw();
+ map(0x600000, 0x600003).r(FUNC(seta_state::seta_dsw_r)); // DSW
+ map(0x700400, 0x700fff).ram().share("paletteram1"); // Palette
+ map(0x800000, 0x803fff).ram().w(FUNC(seta_state::vram_w<0>)).share("vram_0"); // VRAM 0&1
+ map(0x880000, 0x883fff).ram().w(FUNC(seta_state::vram_w<1>)).share("vram_1"); // VRAM 2&3
+ map(0x900000, 0x900005).ram().share("vctrl_0"); // VRAM 0&1 Ctrl
+ map(0x980000, 0x980005).ram().share("vctrl_1"); // VRAM 2&3 Ctrl
+ map(0xa00000, 0xa005ff).ram().rw(m_seta001, FUNC(seta001_device::spriteylow_r16), FUNC(seta001_device::spriteylow_w16)); // Sprites Y
+ map(0xa00600, 0xa00607).ram().rw(m_seta001, FUNC(seta001_device::spritectrl_r16), FUNC(seta001_device::spritectrl_w16));
+ map(0xa80000, 0xa80001).ram(); // ? 0x4000
+ map(0xb00000, 0xb03fff).ram().rw(m_seta001, FUNC(seta001_device::spritecode_r16), FUNC(seta001_device::spritecode_w16)); // Sprites Code + X + Attr
+ map(0xc00000, 0xc03fff).rw(m_x1, FUNC(x1_010_device::word_r), FUNC(x1_010_device::word_w)); // Sound
+ map(0xd00000, 0xd00007).rw("pit", FUNC(pit8254_device::read), FUNC(pit8254_device::write)).umask16(0x00ff);
+}
/***************************************************************************
Oishii Puzzle
@@ -2897,7 +2923,6 @@ void kiwame_state::kiwame_map(address_map &map)
map(0xc00000, 0xc03fff).rw(m_x1, FUNC(x1_010_device::word_r), FUNC(x1_010_device::word_w)); // Sound
map(0xd00000, 0xd00009).r(FUNC(kiwame_state::input_r)); // mahjong panel
map(0xe00000, 0xe00003).r(FUNC(kiwame_state::seta_dsw_r)); // DSW
- map(0xfffc00, 0xffffff).rw(m_tmp68301, FUNC(tmp68301_device::regs_r), FUNC(tmp68301_device::regs_w));
}
@@ -4715,7 +4740,7 @@ static INPUT_PORTS_START( gundhara )
PORT_BIT( 0x0001, IP_ACTIVE_LOW, IPT_COIN1 ) PORT_IMPULSE(5)
PORT_BIT( 0x0002, IP_ACTIVE_LOW, IPT_COIN2 ) PORT_IMPULSE(5)
PORT_BIT( 0x0004, IP_ACTIVE_LOW, IPT_SERVICE1 )
- PORT_SERVICE_NO_TOGGLE( 0x0008, IP_ACTIVE_LOW)
+ PORT_SERVICE_NO_TOGGLE( 0x0008, IP_ACTIVE_LOW )
PORT_BIT( 0x0010, IP_ACTIVE_LOW, IPT_UNKNOWN )
PORT_BIT( 0x0020, IP_ACTIVE_LOW, IPT_UNKNOWN )
PORT_BIT( 0x0040, IP_ACTIVE_LOW, IPT_UNKNOWN )
@@ -4754,10 +4779,10 @@ static INPUT_PORTS_START( gundhara )
PORT_DIPSETTING( 0x0100, DEF_STR( Hard ) )
PORT_DIPSETTING( 0x0000, DEF_STR( Hardest ) )
PORT_DIPNAME( 0x0c00, 0x0c00, DEF_STR( Lives ) ) PORT_DIPLOCATION("SW1:3,4")
- PORT_DIPSETTING( 0x0800, "1" )
- PORT_DIPSETTING( 0x0c00, "2" )
- PORT_DIPSETTING( 0x0400, "3" )
- PORT_DIPSETTING( 0x0000, "4" )
+ PORT_DIPSETTING( 0x0800, "2" )
+ PORT_DIPSETTING( 0x0c00, "3" )
+ PORT_DIPSETTING( 0x0400, "4" )
+ PORT_DIPSETTING( 0x0000, "5" )
PORT_DIPNAME( 0x3000, 0x3000, DEF_STR( Bonus_Life ) ) PORT_DIPLOCATION("SW1:5,6")
PORT_DIPSETTING( 0x3000, "200K" )
PORT_DIPSETTING( 0x2000, "200K, Every 200K" )
@@ -5405,11 +5430,11 @@ static INPUT_PORTS_START( msgundam )
PORT_SERVICE_DIPLOC( 0x8000, IP_ACTIVE_LOW, "SW1:8" )
INPUT_PORTS_END
-static INPUT_PORTS_START( msgunda1 )
+static INPUT_PORTS_START( msgundam1 )
PORT_INCLUDE(msgundam)
PORT_MODIFY("COINS") // IN2 - Coins - $400004.w
- /* this set seems to be a japan set, english mode doesn't work correctly */
+ /* this set seems to be a Japan set, English mode doesn't work correctly */
PORT_DIPNAME( 0x0080, 0x0000, DEF_STR( Language ) )
// PORT_DIPSETTING( 0x0080, DEF_STR( English ) )
PORT_DIPSETTING( 0x0000, DEF_STR( Japanese ) )
@@ -8013,7 +8038,7 @@ TIMER_DEVICE_CALLBACK_MEMBER(seta_state::calibr50_interrupt)
void usclssic_state::machine_start()
{
- m_buttonmux->write_ab(0xff);
+ m_buttonmux->ab_w(0xff);
}
@@ -8388,7 +8413,7 @@ void seta_state::daioh(machine_config &config)
/* video hardware */
screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
- screen.set_refresh_hz(57.42); /* verified on PCB */;
+ screen.set_refresh_hz(57.42); /* verified on PCB */
screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
screen.set_size(64*8, 32*8);
screen.set_visarea(0*8, 48*8-1, 1*8, 31*8-1);
@@ -8425,7 +8450,7 @@ void seta_state::daiohp(machine_config &config)
/* video hardware */
screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
- screen.set_refresh_hz(57.42); /* verified on PCB */;
+ screen.set_refresh_hz(57.42); /* verified on PCB */
screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
screen.set_size(64*8, 32*8);
screen.set_visarea(0*8, 48*8-1, 1*8, 31*8-1);
@@ -9155,7 +9180,12 @@ void seta_state::msgundam(machine_config &config)
m_x1->add_route(ALL_OUTPUTS, "mono", 1.0);
}
+void seta_state::msgundamb(machine_config &config)
+{
+ msgundam(config);
+ m_maincpu->set_addrmap(AS_PROGRAM, &seta_state::msgundamb_map);
+}
/***************************************************************************
Oishii Puzzle
@@ -9244,19 +9274,15 @@ void seta_state::triplfun(machine_config &config)
WRITE_LINE_MEMBER(kiwame_state::kiwame_vblank)
{
if (state)
- m_tmp68301->external_interrupt_0();
+ m_maincpu->external_interrupt_0();
}
void kiwame_state::kiwame(machine_config &config)
{
/* basic machine hardware */
- M68000(config, m_maincpu, 16000000); /* 16 MHz */
+ TMP68301(config, m_maincpu, 16000000); /* 16 MHz */
m_maincpu->set_addrmap(AS_PROGRAM, &kiwame_state::kiwame_map);
- m_maincpu->set_irq_acknowledge_callback("tmp68301", FUNC(tmp68301_device::irq_callback));
-
- tmp68301_device &tmp68301(TMP68301(config, "tmp68301", 0));
- tmp68301.set_cputag(m_maincpu);
- tmp68301.out_parallel_callback().set(FUNC(kiwame_state::row_select_w));
+ m_maincpu->out_parallel_callback().set(FUNC(kiwame_state::row_select_w));
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
@@ -10789,6 +10815,32 @@ ROM_START( msgundam1 )
ROM_LOAD( "fa001004.u26", 0x000000, 0x100000, CRC(b965f07c) SHA1(ff7827cc80655465ffbb732d55ba81f21f51a5ca) )
ROM_END
+ROM_START( msgundamb ) // 2 PCB stack, one has a 'Tecnoval - tecnologia valenciana del recreativo' sticker
+ ROM_REGION( 0x300000, "maincpu", 0 ) /* 68000 Code, on lower board */
+ ROM_LOAD16_BYTE( "d-4.bin", 0x000000, 0x040000, CRC(ca5bfa89) SHA1(108435cb65919b4b90be102e7ac2799501149fc8) ) // 27c020
+ ROM_LOAD16_BYTE( "d-2.bin", 0x000001, 0x040000, CRC(b4b86d1b) SHA1(d9b625cfdabcabed9308fccc29c66adfe566a996) ) // 27c020
+ ROM_LOAD16_BYTE( "27c8001-7.bin", 0x100000, 0x100000, CRC(803f279c) SHA1(1095ac434ce553ed56d106556e7d23ccac1f0cd4) ) // 1ST AND 2ND HALF IDENTICAL
+ ROM_LOAD16_BYTE( "27c8001-8.bin", 0x100001, 0x100000, CRC(a310fa93) SHA1(2ee1616699c95ed2b8c46d43de4cffece1b033ea) ) // 1ST AND 2ND HALF IDENTICAL
+
+ ROM_REGION( 0x400000, "gfx1", 0 ) /* Sprites, on top board, almost identical to the original but split */
+ ROM_LOAD16_BYTE( "27c8001-3.bin", 0x000000, 0x100000, CRC(9f36d867) SHA1(01a15dcdcb1077d7c8678762f58ad705dc29e8c9) )
+ ROM_LOAD16_BYTE( "27c8001-2.bin", 0x000001, 0x100000, CRC(70d333d9) SHA1(9ef3b0e0567ceed082921a5c384cfcfeb154f048) )
+ ROM_LOAD16_BYTE( "27c8001-1.bin", 0x200000, 0x100000, CRC(2792692c) SHA1(ed99c589ed15f8c1a4e2ab435a379b35105ba503) )
+ ROM_LOAD16_BYTE( "4.bin", 0x200001, 0x080000, CRC(eb551f1a) SHA1(e9d2fc31c3076164c5ee9722ea1b1e60b4f6d663) ) // mx27c4000
+ ROM_LOAD16_BYTE( "5.bin", 0x300001, 0x080000, CRC(e9aa57e8) SHA1(699c0132f4be81570f748e5ca2f88fc4fc6802bb) ) // mx27c4000
+
+ ROM_REGION( 0x200000, "gfx2", 0 ) /* Layer 1, on lower board */
+ ROM_LOAD16_BYTE( "27c8001-6.bin", 0x000000, 0x100000, CRC(8fbb5478) SHA1(247fd080f0ee18282c4d8b918171cfeab4b40d23) ) // 1ST AND 2ND HALF IDENTICAL, fa001006.u23 [even] IDENTICAL
+ ROM_LOAD16_BYTE( "27c8001-5.bin", 0x000001, 0x100000, CRC(c83ae34a) SHA1(d7bf49843c443c5b7cb9187404a3518eaed577a6) ) // 1ST AND 2ND HALF IDENTICAL, fa001006.u23 [odd] IDENTICAL
+
+ ROM_REGION( 0x080000, "gfx3", 0 ) /* Layer 2, on lower board, identical to the original but split */
+ ROM_LOAD16_BYTE( "d-8.bin", 0x000000, 0x040000, CRC(a03c8345) SHA1(d3c3f0045ebb3d82d82432c212db4a801cb53b60) ) // 27c020
+ ROM_LOAD16_BYTE( "d-9.bin", 0x000001, 0x040000, CRC(cfd47024) SHA1(ab4fbaf258d2694407dd6c896f45d69821ccc408) ) // 27c020
+
+ ROM_REGION( 0x100000, "x1snd", 0 ) /* Samples, on lower board */
+ ROM_LOAD( "27c8001-4.bin", 0x000000, 0x100000, CRC(b965f07c) SHA1(ff7827cc80655465ffbb732d55ba81f21f51a5ca) ) // identical to the original
+ROM_END
+
ROM_START( oisipuzl )
ROM_REGION( 0x180000, "maincpu", 0 ) /* 68000 Code */
ROM_LOAD16_WORD_SWAP( "ss1u200.v10", 0x000000, 0x080000, CRC(f5e53baf) SHA1(057e8b35bc6f65634685b5d0cf38e12f2e62d72c) )
@@ -12143,7 +12195,8 @@ GAME( 1993, madshark, 0, madshark, madshark, seta_state, empty_ini
// end credits shows Allumer as developer.
GAME( 1993, msgundam, 0, msgundam, msgundam, seta_state, empty_init, ROT0, "Banpresto / Allumer", "Mobile Suit Gundam", 0 )
-GAME( 1993, msgundam1, msgundam, msgundam, msgunda1, seta_state, empty_init, ROT0, "Banpresto / Allumer", "Mobile Suit Gundam (Japan)", 0 )
+GAME( 1993, msgundam1, msgundam, msgundam, msgundam1, seta_state, empty_init, ROT0, "Banpresto / Allumer", "Mobile Suit Gundam (Japan)", 0 )
+GAME( 1993, msgundamb, msgundam, msgundamb, msgundam, seta_state, empty_init, ROT0, "bootleg", "Mobile Suit Gundam (bootleg)", 0 )
GAME( 1993, oisipuzl, 0, oisipuzl, oisipuzl, seta_state, empty_init, ROT0, "Sunsoft / Atlus", "Oishii Puzzle Ha Irimasenka", 0 )
GAME( 1993, triplfun, oisipuzl, triplfun, oisipuzl, seta_state, empty_init, ROT0, "bootleg", "Triple Fun", 0 )
diff --git a/src/mame/drivers/seta2.cpp b/src/mame/drivers/seta2.cpp
index a1e7523efb5..147a4ecb235 100644
--- a/src/mame/drivers/seta2.cpp
+++ b/src/mame/drivers/seta2.cpp
@@ -26,7 +26,7 @@ OSC : 50.00000MHz
-------------------------------------------------------------------------------------------
Ordered by Board Year Game By
-------------------------------------------------------------------------------------------
-P-FG01-1 1995 Guardians / Denjin Makai II Banpresto
+P-FG01-1 (also P0-113A) 1995 Guardians / Denjin Makai II Banpresto
P0-113A 1994 Mobile Suit Gundam EX Revue Banpresto
P0-121A ; 2MP1-E00 (Ss) 1996 TelePachi Fever Lion Sunsoft
P0-123A 1996 Wakakusamonogatari Mahjong Yonshimai Maboroshi Ware
@@ -196,7 +196,6 @@ void seta2_state::grdians_map(address_map &map)
map(0xc50000, 0xc5ffff).ram(); // cleared
map(0xc60000, 0xc6003f).ram().w(FUNC(seta2_state::vregs_w)).share("vregs"); // Video Registers
map(0xe00010, 0xe0001f).w(FUNC(seta2_state::sound_bank_w)).umask16(0x00ff); // Samples Banks
- map(0xfffc00, 0xffffff).rw(m_tmp68301, FUNC(tmp68301_device::regs_r), FUNC(tmp68301_device::regs_w)); // TMP68301 Registers
}
/***************************************************************************
@@ -235,7 +234,6 @@ void seta2_state::gundamex_map(address_map &map)
map(0xc50000, 0xc5ffff).ram(); // cleared
map(0xc60000, 0xc6003f).ram().w(FUNC(seta2_state::vregs_w)).share("vregs"); // Video Registers
map(0xe00010, 0xe0001f).w(FUNC(seta2_state::sound_bank_w)).umask16(0x00ff); // Samples Banks
- map(0xfffc00, 0xffffff).rw(m_tmp68301, FUNC(tmp68301_device::regs_r), FUNC(tmp68301_device::regs_w)); // TMP68301 Registers
}
@@ -292,7 +290,6 @@ void seta2_state::mj4simai_map(address_map &map)
map(0xc00000, 0xc3ffff).ram().share("spriteram"); // Sprites
map(0xc40000, 0xc4ffff).ram().w(m_palette, FUNC(palette_device::write16)).share("palette"); // Palette
map(0xc60000, 0xc6003f).ram().w(FUNC(seta2_state::vregs_w)).share("vregs"); // Video Registers
- map(0xfffc00, 0xffffff).rw(m_tmp68301, FUNC(tmp68301_device::regs_r), FUNC(tmp68301_device::regs_w)); // TMP68301 Registers
}
@@ -316,7 +313,6 @@ void seta2_state::myangel_map(address_map &map)
map(0xc00000, 0xc3ffff).ram().share("spriteram"); // Sprites
map(0xc40000, 0xc4ffff).ram().w(m_palette, FUNC(palette_device::write16)).share("palette"); // Palette
map(0xc60000, 0xc6003f).ram().w(FUNC(seta2_state::vregs_w)).share("vregs"); // Video Registers
- map(0xfffc00, 0xffffff).rw(m_tmp68301, FUNC(tmp68301_device::regs_r), FUNC(tmp68301_device::regs_w)); // TMP68301 Registers
}
@@ -340,7 +336,6 @@ void seta2_state::myangel2_map(address_map &map)
map(0xd00000, 0xd3ffff).ram().share("spriteram"); // Sprites
map(0xd40000, 0xd4ffff).ram().w(m_palette, FUNC(palette_device::write16)).share("palette"); // Palette
map(0xd60000, 0xd6003f).ram().w(FUNC(seta2_state::vregs_w)).share("vregs"); // Video Registers
- map(0xfffc00, 0xffffff).rw(m_tmp68301, FUNC(tmp68301_device::regs_r), FUNC(tmp68301_device::regs_w)); // TMP68301 Registers
}
@@ -383,7 +378,6 @@ void seta2_state::pzlbowl_map(address_map &map)
map(0x840000, 0x84ffff).ram().w(m_palette, FUNC(palette_device::write16)).share("palette"); // Palette
map(0x860000, 0x86003f).ram().w(FUNC(seta2_state::vregs_w)).share("vregs"); // Video Registers
map(0x900000, 0x903fff).rw("x1snd", FUNC(x1_010_device::word_r), FUNC(x1_010_device::word_w)); // Sound
- map(0xfffc00, 0xffffff).rw(m_tmp68301, FUNC(tmp68301_device::regs_r), FUNC(tmp68301_device::regs_w)); // TMP68301 Registers
}
@@ -416,7 +410,6 @@ void seta2_state::penbros_map(address_map &map)
map(0x500302, 0x500303).portr("DSW2");
map(0x500300, 0x50030f).w(FUNC(seta2_state::sound_bank_w)).umask16(0x00ff);
map(0xb60000, 0xb6003f).ram().w(FUNC(seta2_state::vregs_w)).share("vregs");
- map(0xfffc00, 0xffffff).rw(m_tmp68301, FUNC(tmp68301_device::regs_r), FUNC(tmp68301_device::regs_w));
}
void seta2_state::ablastb_map(address_map &map)
@@ -482,7 +475,6 @@ void seta2_state::reelquak_map(address_map &map)
map(0xc00000, 0xc3ffff).ram().share("spriteram"); // Sprites
map(0xc40000, 0xc4ffff).ram().w(m_palette, FUNC(palette_device::write16)).share("palette"); // Palette
map(0xc60000, 0xc6003f).ram().w(FUNC(seta2_state::vregs_w)).share("vregs"); // Video Registers
- map(0xfffc00, 0xffffff).rw(m_tmp68301, FUNC(tmp68301_device::regs_r), FUNC(tmp68301_device::regs_w)); // TMP68301 Registers
}
@@ -497,7 +489,6 @@ void seta2_state::namcostr_map(address_map &map)
map(0x200000, 0x20ffff).ram(); // RAM
map(0xc00000, 0xc3ffff).ram().share("spriteram"); // Sprites
map(0xc60000, 0xc6003f).ram().w(FUNC(seta2_state::vregs_w)).share("vregs"); // Video Registers
- map(0xfffc00, 0xffffff).rw(m_tmp68301, FUNC(tmp68301_device::regs_r), FUNC(tmp68301_device::regs_w)); // TMP68301 Registers
}
@@ -540,8 +531,6 @@ void seta2_state::samshoot_map(address_map &map)
map(0x860000, 0x86003f).ram().w(FUNC(seta2_state::vregs_w)).share("vregs"); // Video Registers
map(0x900000, 0x903fff).rw("x1snd", FUNC(x1_010_device::word_r), FUNC(x1_010_device::word_w)); // Sound
-
- map(0xfffc00, 0xffffff).rw(m_tmp68301, FUNC(tmp68301_device::regs_r), FUNC(tmp68301_device::regs_w)); // TMP68301 Registers
}
@@ -635,7 +624,6 @@ void staraudi_state::staraudi_map(address_map &map)
map(0xc40000, 0xc4ffff).ram().w(m_palette, FUNC(palette_device::write16)).share("palette"); // Palette
map(0xc50000, 0xc5ffff).ram(); // cleared
map(0xc60000, 0xc6003f).ram().w(FUNC(staraudi_state::vregs_w)).share("vregs"); // Video Registers
- map(0xfffc00, 0xffffff).rw(m_tmp68301, FUNC(tmp68301_device::regs_r), FUNC(tmp68301_device::regs_w)); // TMP68301 Registers
}
@@ -694,7 +682,6 @@ void seta2_state::telpacfl_map(address_map &map)
map(0xd00006, 0xd00007).r("watchdog", FUNC(watchdog_timer_device::reset16_r));
// AM_RANGE(0xe00000, 0xe00001) AM_WRITE
map(0xe00010, 0xe0001f).w(FUNC(seta2_state::sound_bank_w)).umask16(0x00ff); // Samples Banks
- map(0xfffc00, 0xffffff).rw(m_tmp68301, FUNC(tmp68301_device::regs_r), FUNC(tmp68301_device::regs_w)); // TMP68301 Registers
}
@@ -2301,35 +2288,32 @@ GFXDECODE_END
INTERRUPT_GEN_MEMBER(seta2_state::seta2_interrupt)
{
/* VBlank is connected to INT0 (external interrupts pin 0) */
- m_tmp68301->external_interrupt_0();
+ downcast<tmp68301_device &>(*m_maincpu).external_interrupt_0();
}
INTERRUPT_GEN_MEMBER(seta2_state::samshoot_interrupt)
{
- m_tmp68301->external_interrupt_2(); // to do: hook up x1-10 interrupts
+ downcast<tmp68301_device &>(*m_maincpu).external_interrupt_2(); // to do: hook up x1-10 interrupts
}
-MACHINE_CONFIG_START(seta2_state::seta2)
- MCFG_DEVICE_ADD(m_maincpu, M68301, XTAL(50'000'000)/3) // !! TMP68301 !!
- MCFG_DEVICE_PROGRAM_MAP(mj4simai_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", seta2_state, seta2_interrupt)
- MCFG_DEVICE_IRQ_ACKNOWLEDGE_DEVICE("tmp68301",tmp68301_device,irq_callback)
-
- TMP68301(config, m_tmp68301, 0);
- m_tmp68301->set_cputag(m_maincpu);
+void seta2_state::seta2(machine_config &config)
+{
+ TMP68301(config, m_maincpu, XTAL(50'000'000)/3); // !! TMP68301 !!
+ m_maincpu->set_addrmap(AS_PROGRAM, &seta2_state::mj4simai_map);
+ m_maincpu->set_vblank_int("screen", FUNC(seta2_state::seta2_interrupt));
WATCHDOG_TIMER(config, "watchdog");
// video hardware
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500))
- MCFG_SCREEN_SIZE(0x200, 0x100)
- MCFG_SCREEN_VISIBLE_AREA(0x00, 0x180-1, 0x00, 0xf0-1)
- MCFG_SCREEN_UPDATE_DRIVER(seta2_state, screen_update)
- MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE(*this, seta2_state, screen_vblank))
- MCFG_SCREEN_PALETTE(m_palette)
- //MCFG_SCREEN_VIDEO_ATTRIBUTES(VIDEO_UPDATE_SCANLINE)
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_refresh_hz(60);
+ m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(2500));
+ m_screen->set_size(0x200, 0x100);
+ m_screen->set_visarea(0x00, 0x180-1, 0x00, 0xf0-1);
+ m_screen->set_screen_update(FUNC(seta2_state::screen_update));
+ m_screen->screen_vblank().set(FUNC(seta2_state::screen_vblank));
+ m_screen->set_palette(m_palette);
+ //m_screen->set_video_attributes(VIDEO_UPDATE_SCANLINE);
GFXDECODE(config, m_gfxdecode, m_palette, gfx_seta2);
PALETTE(config, m_palette).set_format(palette_device::xRGB_555, 0x8000+0xf0); // extra 0xf0 because we might draw 256-color object with 16-color granularity
@@ -2337,154 +2321,143 @@ MACHINE_CONFIG_START(seta2_state::seta2)
// sound hardware
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("x1snd", X1_010, XTAL(50'000'000)/3) // clock?
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
- MCFG_DEVICE_ADDRESS_MAP(0, x1_map)
-MACHINE_CONFIG_END
+ x1_010_device &x1snd(X1_010(config, "x1snd", XTAL(50'000'000)/3)); // clock?
+ x1snd.add_route(ALL_OUTPUTS, "mono", 1.0);
+ x1snd.set_addrmap(0, &seta2_state::x1_map);
+}
-MACHINE_CONFIG_START(seta2_state::gundamex)
+void seta2_state::gundamex(machine_config &config)
+{
seta2(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(gundamex_map)
+ m_maincpu->set_addrmap(AS_PROGRAM, &seta2_state::gundamex_map);
- m_tmp68301->in_parallel_callback().set(FUNC(seta2_state::gundamex_eeprom_r));
- m_tmp68301->out_parallel_callback().set(FUNC(seta2_state::gundamex_eeprom_w));
+ downcast<tmp68301_device &>(*m_maincpu).in_parallel_callback().set(FUNC(seta2_state::gundamex_eeprom_r));
+ downcast<tmp68301_device &>(*m_maincpu).out_parallel_callback().set(FUNC(seta2_state::gundamex_eeprom_w));
EEPROM_93C46_16BIT(config, "eeprom");
// video hardware
- MCFG_SCREEN_MODIFY("screen")
- MCFG_SCREEN_VISIBLE_AREA(0x00, 0x180-1, 0x000, 0x0e0-1)
-MACHINE_CONFIG_END
+ m_screen->set_visarea(0x00, 0x180-1, 0x000, 0x0e0-1);
+}
-MACHINE_CONFIG_START(seta2_state::grdians)
+void seta2_state::grdians(machine_config &config)
+{
seta2(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(grdians_map)
+ m_maincpu->set_addrmap(AS_PROGRAM, &seta2_state::grdians_map);
// video hardware
- MCFG_SCREEN_MODIFY("screen")
- MCFG_SCREEN_VISIBLE_AREA(0x00, 0x130-1, 0x00, 0xe8 -1)
-MACHINE_CONFIG_END
+ m_screen->set_visarea(0x00, 0x130-1, 0x00, 0xe8 -1);
+}
-MACHINE_CONFIG_START(seta2_state::myangel)
+void seta2_state::myangel(machine_config &config)
+{
seta2(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(myangel_map)
+ m_maincpu->set_addrmap(AS_PROGRAM, &seta2_state::myangel_map);
// video hardware
- MCFG_SCREEN_MODIFY("screen")
- MCFG_SCREEN_VISIBLE_AREA(0, 0x178-1, 0x00, 0xf0-1)
-MACHINE_CONFIG_END
+ m_screen->set_visarea(0, 0x178-1, 0x00, 0xf0-1);
+}
-MACHINE_CONFIG_START(seta2_state::myangel2)
+void seta2_state::myangel2(machine_config &config)
+{
seta2(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(myangel2_map)
+ m_maincpu->set_addrmap(AS_PROGRAM, &seta2_state::myangel2_map);
// video hardware
- MCFG_SCREEN_MODIFY("screen")
- MCFG_SCREEN_VISIBLE_AREA(0, 0x178-1, 0x00, 0xf0-1)
-MACHINE_CONFIG_END
+ m_screen->set_visarea(0, 0x178-1, 0x00, 0xf0-1);
+}
-MACHINE_CONFIG_START(seta2_state::pzlbowl)
+void seta2_state::pzlbowl(machine_config &config)
+{
seta2(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(pzlbowl_map)
+ m_maincpu->set_addrmap(AS_PROGRAM, &seta2_state::pzlbowl_map);
// video hardware
- MCFG_SCREEN_MODIFY("screen")
- MCFG_SCREEN_VISIBLE_AREA(0x00, 0x180-1, 0x00, 0xf0-1)
-MACHINE_CONFIG_END
+ m_screen->set_visarea(0x00, 0x180-1, 0x00, 0xf0-1);
+}
-MACHINE_CONFIG_START(seta2_state::penbros)
+void seta2_state::penbros(machine_config &config)
+{
seta2(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(penbros_map)
+ m_maincpu->set_addrmap(AS_PROGRAM, &seta2_state::penbros_map);
// video hardware
- MCFG_SCREEN_MODIFY("screen")
- MCFG_SCREEN_VISIBLE_AREA(0, 0x140-1, 0x00, 0xe0-1)
-MACHINE_CONFIG_END
+ m_screen->set_visarea(0, 0x140-1, 0x00, 0xe0-1);
+}
-MACHINE_CONFIG_START(seta2_state::ablastb)
+void seta2_state::ablastb(machine_config &config)
+{
penbros(config);
- MCFG_DEVICE_REPLACE("maincpu", M68000, XTAL(16'000'000)) // TMP68HC000P-16
- MCFG_DEVICE_PROGRAM_MAP(ablastb_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", seta2_state, irq2_line_hold)
-
- MCFG_DEVICE_REMOVE("tmp68301")
-MACHINE_CONFIG_END
+ M68000(config.replace(), m_maincpu, XTAL(16'000'000)); // TMP68HC000P-16
+ m_maincpu->set_addrmap(AS_PROGRAM, &seta2_state::ablastb_map);
+ m_maincpu->set_vblank_int("screen", FUNC(seta2_state::irq2_line_hold));
+}
-MACHINE_CONFIG_START(seta2_state::reelquak)
+void seta2_state::reelquak(machine_config &config)
+{
seta2(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(reelquak_map)
+ m_maincpu->set_addrmap(AS_PROGRAM, &seta2_state::reelquak_map);
- m_tmp68301->out_parallel_callback().set(FUNC(seta2_state::reelquak_leds_w));
+ downcast<tmp68301_device &>(*m_maincpu).out_parallel_callback().set(FUNC(seta2_state::reelquak_leds_w));
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
- MCFG_TICKET_DISPENSER_ADD("dispenser", attotime::from_msec(200), TICKET_MOTOR_ACTIVE_HIGH, TICKET_STATUS_ACTIVE_LOW)
+ TICKET_DISPENSER(config, m_dispenser, attotime::from_msec(200), TICKET_MOTOR_ACTIVE_HIGH, TICKET_STATUS_ACTIVE_LOW);
- MCFG_SCREEN_MODIFY("screen")
- MCFG_SCREEN_VISIBLE_AREA(0x00, 0x140-1, 0x000, 0x0f0-1)
-MACHINE_CONFIG_END
+ m_screen->set_visarea(0x00, 0x140-1, 0x000, 0x0f0-1);
+}
-MACHINE_CONFIG_START(seta2_state::samshoot)
+void seta2_state::samshoot(machine_config &config)
+{
seta2(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(samshoot_map)
- MCFG_DEVICE_PERIODIC_INT_DRIVER(seta2_state, samshoot_interrupt, 60)
+ m_maincpu->set_addrmap(AS_PROGRAM, &seta2_state::samshoot_map);
+ m_maincpu->set_periodic_int(FUNC(seta2_state::samshoot_interrupt), attotime::from_hz(60));
- m_tmp68301->in_parallel_callback().set_ioport("DSW2");
+ downcast<tmp68301_device &>(*m_maincpu).in_parallel_callback().set_ioport("DSW2");
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
- MCFG_SCREEN_MODIFY("screen")
- MCFG_SCREEN_VISIBLE_AREA(0x00, 0x140-1, 0x000, 0x0f0-1)
-MACHINE_CONFIG_END
+ m_screen->set_visarea(0x00, 0x140-1, 0x000, 0x0f0-1);
+}
-MACHINE_CONFIG_START(staraudi_state::staraudi)
+void staraudi_state::staraudi(machine_config &config)
+{
seta2(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(staraudi_map)
+ m_maincpu->set_addrmap(AS_PROGRAM, &staraudi_state::staraudi_map);
SHARP_LH28F016S_16BIT(config, "flash");
UPD4992(config, m_rtc);
// video hardware
- MCFG_SCREEN_MODIFY("screen")
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) // not accurate
- MCFG_SCREEN_VISIBLE_AREA(0x00, 0x140-1, 0x000, 0x0f0-1)
+ m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(2500)); // not accurate
+ m_screen->set_visarea(0x00, 0x140-1, 0x000, 0x0f0-1);
- MCFG_GFXDECODE_MODIFY("gfxdecode", gfx_seta2)
-MACHINE_CONFIG_END
+ m_gfxdecode->set_info(gfx_seta2);
+}
-MACHINE_CONFIG_START(seta2_state::telpacfl)
+void seta2_state::telpacfl(machine_config &config)
+{
seta2(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(telpacfl_map)
+ m_maincpu->set_addrmap(AS_PROGRAM, &seta2_state::telpacfl_map);
- m_tmp68301->in_parallel_callback().set_ioport("KNOB");
+ downcast<tmp68301_device &>(*m_maincpu).in_parallel_callback().set_ioport("KNOB");
EEPROM_93C46_16BIT(config, "eeprom"); // not hooked up, seems unused
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
- MCFG_HOPPER_ADD("dispenser", attotime::from_msec(200), TICKET_MOTOR_ACTIVE_HIGH, TICKET_STATUS_ACTIVE_LOW)
+ HOPPER(config, m_dispenser, attotime::from_msec(200), TICKET_MOTOR_ACTIVE_HIGH, TICKET_STATUS_ACTIVE_LOW);
// video hardware
- MCFG_SCREEN_MODIFY("screen")
- MCFG_SCREEN_VISIBLE_AREA(0x0, 0x180-1, 0x00, 0xf0-1) // still off by 1 because of different CRTC regs?
-MACHINE_CONFIG_END
+ m_screen->set_visarea(0x0, 0x180-1, 0x00, 0xf0-1); // still off by 1 because of different CRTC regs?
+}
/***************************************************************************
@@ -2515,17 +2488,17 @@ void funcube_state::machine_reset()
m_hopper_motor = 0;
}
-MACHINE_CONFIG_START(funcube_state::funcube)
-
- MCFG_DEVICE_ADD("maincpu", MCF5206E, XTAL(25'447'000))
- MCFG_DEVICE_PROGRAM_MAP(funcube_map)
- MCFG_TIMER_DRIVER_ADD_SCANLINE("scantimer", funcube_state, funcube_interrupt, "screen", 0, 1)
+void funcube_state::funcube(machine_config &config)
+{
+ MCF5206E(config, m_maincpu, XTAL(25'447'000));
+ m_maincpu->set_addrmap(AS_PROGRAM, &funcube_state::funcube_map);
+ TIMER(config, "scantimer").configure_scanline(FUNC(funcube_state::funcube_interrupt), "screen", 0, 1);
- MCFG_DEVICE_ADD("sub", H83007, FUNCUBE_SUB_CPU_CLOCK)
- MCFG_DEVICE_PROGRAM_MAP(funcube_sub_map)
- MCFG_DEVICE_IO_MAP(funcube_sub_io)
+ H83007(config, m_sub, FUNCUBE_SUB_CPU_CLOCK);
+ m_sub->set_addrmap(AS_PROGRAM, &funcube_state::funcube_sub_map);
+ m_sub->set_addrmap(AS_IO, &funcube_state::funcube_sub_io);
- MCFG_MCF5206E_PERIPHERAL_ADD("maincpu_onboard")
+ MCF5206E_PERIPHERAL(config, "maincpu_onboard", 0);
FUNCUBE_TOUCHSCREEN(config, "touchscreen", 200).tx_cb().set(":sub:sci1", FUNC(h8_sci_device::rx_w));
@@ -2534,14 +2507,14 @@ MACHINE_CONFIG_START(funcube_state::funcube)
WATCHDOG_TIMER(config, "watchdog");
// video hardware
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) // not accurate
- MCFG_SCREEN_SIZE(0x200, 0x200)
- MCFG_SCREEN_VISIBLE_AREA(0x0+1, 0x140-1+1, 0x00, 0xf0-1)
- MCFG_SCREEN_UPDATE_DRIVER(funcube_state, screen_update)
- MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE(*this, funcube_state, screen_vblank))
- MCFG_SCREEN_PALETTE(m_palette)
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_refresh_hz(60);
+ m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(2500)); // not accurate
+ m_screen->set_size(0x200, 0x200);
+ m_screen->set_visarea(0x0+1, 0x140-1+1, 0x00, 0xf0-1);
+ m_screen->set_screen_update(FUNC(funcube_state::screen_update));
+ m_screen->screen_vblank().set(FUNC(funcube_state::screen_vblank));
+ m_screen->set_palette(m_palette);
GFXDECODE(config, m_gfxdecode, m_palette, gfx_seta2);
PALETTE(config, m_palette).set_format(palette_device::xRGB_555, 0x8000+0xf0); // extra 0xf0 because we might draw 256-color object with 16-color granularity
@@ -2550,52 +2523,48 @@ MACHINE_CONFIG_START(funcube_state::funcube)
SPEAKER(config, "lspeaker").front_left();
SPEAKER(config, "rspeaker").front_right();
- MCFG_DEVICE_ADD("oki", OKIM9810, XTAL(4'096'000))
- MCFG_SOUND_ROUTE(0, "lspeaker", 0.80)
- MCFG_SOUND_ROUTE(1, "rspeaker", 0.80)
-MACHINE_CONFIG_END
+ OKIM9810(config, m_oki, XTAL(4'096'000));
+ m_oki->add_route(0, "lspeaker", 0.80);
+ m_oki->add_route(1, "rspeaker", 0.80);
+}
-MACHINE_CONFIG_START(funcube_state::funcube2)
+void funcube_state::funcube2(machine_config &config)
+{
funcube(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(funcube2_map)
+ m_maincpu->set_addrmap(AS_PROGRAM, &funcube_state::funcube2_map);
- MCFG_DEVICE_MODIFY("sub")
- MCFG_DEVICE_IO_MAP(funcube2_sub_io)
+ m_sub->set_addrmap(AS_IO, &funcube_state::funcube2_sub_io);
// video hardware
- MCFG_SCREEN_MODIFY("screen")
- MCFG_SCREEN_VISIBLE_AREA(0x0, 0x140-1, 0x00, 0xf0-1)
-MACHINE_CONFIG_END
+ m_screen->set_visarea(0x0, 0x140-1, 0x00, 0xf0-1);
+}
-MACHINE_CONFIG_START(funcube_state::funcube3)
+void funcube_state::funcube3(machine_config &config)
+{
funcube2(config);
// video hardware
- MCFG_SCREEN_MODIFY("screen")
- MCFG_SCREEN_VISIBLE_AREA(0x0, 0x140-1, 0x00, 0xf0-1)
-MACHINE_CONFIG_END
-
+ m_screen->set_visarea(0x0, 0x140-1, 0x00, 0xf0-1);
+}
-MACHINE_CONFIG_START(seta2_state::namcostr)
- MCFG_DEVICE_ADD(m_maincpu, M68301, XTAL(50'000'000)/3) // !! TMP68301 !!
- MCFG_DEVICE_PROGRAM_MAP(namcostr_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", seta2_state, seta2_interrupt)
- MCFG_DEVICE_IRQ_ACKNOWLEDGE_DEVICE("tmp68301",tmp68301_device,irq_callback)
- TMP68301(config, m_tmp68301, 0); // does this have a ticket dispenser?
- m_tmp68301->set_cputag(m_maincpu);
+void seta2_state::namcostr(machine_config &config)
+{
+ TMP68301(config, m_maincpu, XTAL(50'000'000)/3); // !! TMP68301 !!
+ m_maincpu->set_addrmap(AS_PROGRAM, &seta2_state::namcostr_map);
+ m_maincpu->set_vblank_int("screen", FUNC(seta2_state::seta2_interrupt));
+ // does this have a ticket dispenser?
// video hardware
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(0x200, 0x200)
- MCFG_SCREEN_VISIBLE_AREA(0x40, 0x1c0-1, 0x00, 0xf0-1)
- MCFG_SCREEN_UPDATE_DRIVER(seta2_state, screen_update)
- MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE(*this, seta2_state, screen_vblank))
- MCFG_SCREEN_PALETTE(m_palette)
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_refresh_hz(60);
+ m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ m_screen->set_size(0x200, 0x200);
+ m_screen->set_visarea(0x40, 0x1c0-1, 0x00, 0xf0-1);
+ m_screen->set_screen_update(FUNC(seta2_state::screen_update));
+ m_screen->screen_vblank().set(FUNC(seta2_state::screen_vblank));
+ m_screen->set_palette(m_palette);
GFXDECODE(config, m_gfxdecode, m_palette, gfx_seta2);
PALETTE(config, m_palette).set_format(palette_device::xRGB_555, 0x8000+0xf0); // extra 0xf0 because we might draw 256-color object with 16-color granularity
@@ -2604,10 +2573,10 @@ MACHINE_CONFIG_START(seta2_state::namcostr)
SPEAKER(config, "lspeaker").front_left();
SPEAKER(config, "rspeaker").front_right();
- MCFG_DEVICE_ADD("oki", OKIM9810, XTAL(4'096'000))
- MCFG_SOUND_ROUTE(0, "lspeaker", 0.80)
- MCFG_SOUND_ROUTE(1, "rspeaker", 0.80)
-MACHINE_CONFIG_END
+ OKIM9810(config, m_oki, XTAL(4'096'000));
+ m_oki->add_route(0, "lspeaker", 0.80);
+ m_oki->add_route(1, "rspeaker", 0.80);
+}
/***************************************************************************
@@ -2911,11 +2880,10 @@ NOTE: There is known to exist an undumped version of Guardians on the
U19, U20, U21 & U22 - graphics ROMS
**********************************************************
-There is known to exist an undumped version of Guardians on the
+
P0-113A PCB with P1-106-1 & P1-107-1 duaghtercards
- It's assumed the programs roms (at least) are different to cope
- with the different hardware configuration.
+ program ROMs verified to match the P-FG01-1 set
CPU: Toshiba TMP68301AF-16 (100 Pin PQFP)
Video: Allumer X1-020 (208 Pin PQFP)
@@ -2961,7 +2929,7 @@ PCB Number: P0-113A BP49KA
| P P | U21* ||
+-+ C A A M M +---------------+|
| N DSW1 L L 3 3 |
-| 1 DSW2 SW1 |
+| 1 DSW2 SW1 2 1 |
+---------------------------------------------------------------+
U2 is KA2 001 001 EPROM
@@ -2973,20 +2941,25 @@ U15 is socketted to receive P1-106-1 daughtercard
U77 is socketted to receive P1-107-1 daughtercard
CN2 - 5 Pin header
CN1 - 10 Pin header
+PAL1 at U51 is KA-201 GAL16V8B
+PAL2 at U52 is KA-102 GAL16V8B
* Denotes not populated.
+Notes:
+ HSync: 15.19kHz
+ VSync: 58.27Hz
+
The daughtercards below are NOT to scale with the above main board.
P1-107-1 (additional RAM)
+-------------------------------+
-| LOGIC JP5 JP6 JP7|
+| 74LS32 JP5 JP6 JP7|
| CXK58257AM-10L CXK58257AM-10L |
| +-----------------------+ |
| |U7 42 pin header to U77| |
| +-----------------------+ |
+-------------------------------+
-Unknown LOGIC chip
JP5 - JP7 single wire connections for power
@@ -3002,15 +2975,14 @@ P1-106-1
| +-----------------------+ |
| | KA2-001-016 U1 | |
| +-----------------------+ |
-|JP1 JP2 JP3 JP4 LOGIC |
+|JP1 JP2 JP3 JP4 74LS00 |
+-------------------------------+
-Unknown LOGIC chip
JP1 - JP4 single wire connections for power
***************************************************************************/
-ROM_START( grdians ) /* P-FG01-1 */
+ROM_START( grdians ) /* P-FG01-1 PCB */
ROM_REGION( 0x200000, "maincpu", 0 ) // TMP68301 Code
ROM_LOAD16_BYTE( "u2.bin", 0x000000, 0x080000, CRC(36adc6f2) SHA1(544e87f88179fe1342e7a06a8948ac1828e85108) )
ROM_LOAD16_BYTE( "u3.bin", 0x000001, 0x080000, CRC(2704f416) SHA1(9081a12cbb9927d36e1c50b52aa2c6003810ee42) )
@@ -3035,6 +3007,27 @@ ROM_START( grdians ) /* P-FG01-1 */
ROM_LOAD( "u32.bin", 0x000000, 0x100000, CRC(cf0f3017) SHA1(8376d3a674f71aec72f52c72758fbc53d9feb1a1) )
ROM_END
+ROM_START( grdiansa ) /* P0-113A PCB */
+ ROM_REGION( 0x200000, "maincpu", 0 ) // TMP68301 Code
+ ROM_LOAD16_BYTE( "ka2_001_001.u2", 0x000000, 0x080000, CRC(36adc6f2) SHA1(544e87f88179fe1342e7a06a8948ac1828e85108) ) // same program code as P-FG01-1 PCB above
+ ROM_LOAD16_BYTE( "ka2_001_004.u3", 0x000001, 0x080000, CRC(2704f416) SHA1(9081a12cbb9927d36e1c50b52aa2c6003810ee42) )
+ ROM_LOAD16_BYTE( "ka2_001_002.u4", 0x100000, 0x080000, CRC(bb52447b) SHA1(61433f683210ab2bc2cf1cc4b5b7a39cc5b6493d) )
+ ROM_LOAD16_BYTE( "ka2_001_003.u5", 0x100001, 0x080000, CRC(9c164a3b) SHA1(6d688c7af9e7e8e8d54b2e4dfbf41f59c79242eb) )
+
+ ROM_REGION( 0x2000000, "sprites", ROMREGION_ERASE) // Sprites
+ ROM_LOAD64_WORD( "ka2-001-010.u18", 0x0800000, 0x200000, CRC(b3e6e95f) SHA1(c61d3def136f4bb6c5857740b0fbea64a98dd1dc) )
+ ROM_LOAD64_WORD( "ka2-001-013.u17", 0x0800002, 0x200000, CRC(9f7feb13) SHA1(0b3010faf87fb5bfe55101e5eabecec6107bf42f) )
+ ROM_LOAD64_WORD( "ka2-001-007.u22", 0x0800004, 0x200000, CRC(d1035051) SHA1(0bc8871b91e777009002e340e1cef92487234271) )
+ ROM_LOAD64_WORD( "ka2-001-016.u1", 0x0800006, 0x200000, CRC(99fc8efa) SHA1(eeaabb3b8d6c99a16c922a2b6ff0973935fd74bd) ) // located on P1-106-1 daughtercard
+ ROM_LOAD64_WORD( "ka2-001-011.u20", 0x1000000, 0x200000, CRC(676edca6) SHA1(32bb507d000e19b004251d24c5fe61a09486cdd1) )
+ ROM_LOAD64_WORD( "ka2-001-014.u19", 0x1000002, 0x200000, CRC(5465ef1b) SHA1(d1f0ff1950672444ece2fd86285a4051ea66f7bb) )
+ ROM_LOAD64_WORD( "ka2-001-008.u23", 0x1000004, 0x200000, CRC(b2c94f31) SHA1(09891516806e2e79673b8b787d8e1caa51523a79) )
+ ROM_LOAD64_WORD( "ka2-001-017.u2", 0x1000006, 0x200000, CRC(60ad7a2b) SHA1(a23c916959f3cfc8b1eead7a72c8312967b3acd7) ) // located on P1-106-1 daughtercard
+
+ ROM_REGION( 0x200000, "x1snd", 0 ) // Samples
+ ROM_LOAD( "ka2-001-015.u28", 0x000000, 0x200000, CRC(fa97cc54) SHA1(d9a869e9428e5f31aee917ea7733cca1247458f2) ) // Identical halves matching parent U32.BIN
+ROM_END
+
/***************************************************************************
MS Gundam Ex Revue
@@ -3117,7 +3110,6 @@ ROM_START( gundamex )
ROM_LOAD64_WORD( "ka-001-014.u19", 0x1000002, 0x200000, CRC(7635e026) SHA1(116a3daab14a17faca85c4a956b356aaf0fc2276) )
ROM_LOAD64_WORD( "ka-001-008.u23", 0x1000004, 0x200000, CRC(db55a60a) SHA1(03d118c7284ca86219891c473e2a89489710ea27) )
-
ROM_REGION( 0x200000, "x1snd", 0 ) // Samples
ROM_LOAD( "ka-001-015.u28", 0x000000, 0x200000, CRC(ada2843b) SHA1(09d06026031bc7558da511c3c0e29187ea0a0099) )
@@ -4353,34 +4345,35 @@ ROM_START( telpacfl )
ROM_LOAD( "kc-002c.u52", 0x117, 0x117, NO_DUMP )
ROM_END
-GAME( 1994, gundamex, 0, gundamex, gundamex, seta2_state, empty_init, ROT0, "Banpresto", "Mobile Suit Gundam EX Revue", 0 )
-GAME( 1995, grdians, 0, grdians, grdians, seta2_state, empty_init, ROT0, "Winkysoft (Banpresto license)", "Guardians / Denjin Makai II", MACHINE_NO_COCKTAIL | MACHINE_IMPERFECT_GRAPHICS )
-GAME( 1996, mj4simai, 0, seta2, mj4simai, mj4simai_state, empty_init, ROT0, "Maboroshi Ware", "Wakakusamonogatari Mahjong Yonshimai (Japan)", MACHINE_NO_COCKTAIL )
-GAME( 1996, myangel, 0, myangel, myangel, seta2_state, empty_init, ROT0, "MOSS / Namco", "Kosodate Quiz My Angel (Japan)", MACHINE_NO_COCKTAIL | MACHINE_IMPERFECT_GRAPHICS )
-GAME( 1997, myangel2, 0, myangel2, myangel2, seta2_state, empty_init, ROT0, "MOSS / Namco", "Kosodate Quiz My Angel 2 (Japan)", MACHINE_NO_COCKTAIL | MACHINE_IMPERFECT_GRAPHICS )
-GAME( 1996, telpacfl, 0, telpacfl, telpacfl, seta2_state, empty_init, ROT270, "Sunsoft", "TelePachi Fever Lion (V1.0)", MACHINE_NO_COCKTAIL | MACHINE_IMPERFECT_GRAPHICS )
-GAME( 1997, reelquak, 0, reelquak, reelquak, seta2_state, empty_init, ROT0, "<unknown>", "Reel'N Quake! (Version 1.05)", MACHINE_NO_COCKTAIL | MACHINE_IMPERFECT_GRAPHICS )
-GAME( 199?, endrichs, 0, reelquak, endrichs, seta2_state, empty_init, ROT0, "E.N.Tiger", "Endless Riches (Ver 1.20)", MACHINE_NO_COCKTAIL | MACHINE_IMPERFECT_GRAPHICS )
-GAME( 1997, staraudi, 0, staraudi, staraudi, staraudi_state, empty_init, ROT0, "Namco", "Star Audition", MACHINE_NO_COCKTAIL | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND )
-GAME( 1999, pzlbowl, 0, pzlbowl, pzlbowl, seta2_state, empty_init, ROT0, "MOSS / Nihon System", "Puzzle De Bowling (Japan)", MACHINE_NO_COCKTAIL )
-GAME( 2000, penbros, 0, penbros, penbros, seta2_state, empty_init, ROT0, "Subsino", "Penguin Brothers (Japan)", MACHINE_NO_COCKTAIL )
-GAME( 2000, ablast, penbros, penbros, penbros, seta2_state, empty_init, ROT0, "Subsino", "Hong Tian Lei (A-Blast) (Japan)", MACHINE_NO_COCKTAIL ) // 轟天雷/Hōng tiān léi
-GAME( 2000, ablastb, penbros, ablastb, penbros, seta2_state, empty_init, ROT0, "bootleg", "Hong Tian Lei (A-Blast) (bootleg)", MACHINE_NO_COCKTAIL | MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND ) // at least "tilemap sprite" scrolly flag differs, FPGA instead of x1-010
-GAME( 2000, namcostr, 0, namcostr, funcube, seta2_state, init_namcostr, ROT0, "Namco", "Namco Stars", MACHINE_NO_COCKTAIL | MACHINE_NOT_WORKING )
-GAME( 2000, deerhunt, 0, samshoot, deerhunt, seta2_state, empty_init, ROT0, "Sammy USA Corporation", "Deer Hunting USA V4.3", MACHINE_NO_COCKTAIL | MACHINE_IMPERFECT_GRAPHICS )
-GAME( 2000, deerhunta, deerhunt, samshoot, deerhunt, seta2_state, empty_init, ROT0, "Sammy USA Corporation", "Deer Hunting USA V4.2", MACHINE_NO_COCKTAIL | MACHINE_IMPERFECT_GRAPHICS )
-GAME( 2000, deerhuntb, deerhunt, samshoot, deerhunt, seta2_state, empty_init, ROT0, "Sammy USA Corporation", "Deer Hunting USA V4.0", MACHINE_NO_COCKTAIL | MACHINE_IMPERFECT_GRAPHICS )
-GAME( 2000, deerhuntc, deerhunt, samshoot, deerhunt, seta2_state, empty_init, ROT0, "Sammy USA Corporation", "Deer Hunting USA V3", MACHINE_NO_COCKTAIL | MACHINE_IMPERFECT_GRAPHICS )
-GAME( 2000, deerhuntd, deerhunt, samshoot, deerhunt, seta2_state, empty_init, ROT0, "Sammy USA Corporation", "Deer Hunting USA V2", MACHINE_NO_COCKTAIL | MACHINE_IMPERFECT_GRAPHICS )
-GAME( 2000, deerhunte, deerhunt, samshoot, deerhunt, seta2_state, empty_init, ROT0, "Sammy USA Corporation", "Deer Hunting USA V1", MACHINE_NO_COCKTAIL | MACHINE_IMPERFECT_GRAPHICS )
-GAME( 2001, turkhunt, 0, samshoot, turkhunt, seta2_state, empty_init, ROT0, "Sammy USA Corporation", "Turkey Hunting USA V1.00", MACHINE_NO_COCKTAIL | MACHINE_IMPERFECT_GRAPHICS )
-GAME( 2001, wschamp, 0, samshoot, wschamp, seta2_state, empty_init, ROT0, "Sammy USA Corporation", "Wing Shooting Championship V2.00", MACHINE_NO_COCKTAIL | MACHINE_IMPERFECT_GRAPHICS )
-GAME( 2001, wschampa, wschamp, samshoot, wschamp, seta2_state, empty_init, ROT0, "Sammy USA Corporation", "Wing Shooting Championship V1.01", MACHINE_NO_COCKTAIL | MACHINE_IMPERFECT_GRAPHICS )
-GAME( 2001, wschampb, wschamp, samshoot, wschamp, seta2_state, empty_init, ROT0, "Sammy USA Corporation", "Wing Shooting Championship V1.00", MACHINE_NO_COCKTAIL | MACHINE_IMPERFECT_GRAPHICS )
-GAME( 2002, trophyh, 0, samshoot, trophyh, seta2_state, empty_init, ROT0, "Sammy USA Corporation", "Trophy Hunting - Bear & Moose V1.00", MACHINE_NO_COCKTAIL | MACHINE_IMPERFECT_GRAPHICS )
+GAME( 1994, gundamex, 0, gundamex, gundamex, seta2_state, empty_init, ROT0, "Banpresto", "Mobile Suit Gundam EX Revue", 0 )
+GAME( 1995, grdians, 0, grdians, grdians, seta2_state, empty_init, ROT0, "Winkysoft (Banpresto license)", "Guardians / Denjin Makai II (P-FG01-1 PCB)", MACHINE_NO_COCKTAIL | MACHINE_IMPERFECT_GRAPHICS )
+GAME( 1995, grdiansa, grdians, grdians, grdians, seta2_state, empty_init, ROT0, "Winkysoft (Banpresto license)", "Guardians / Denjin Makai II (P0-113A PCB)", MACHINE_NO_COCKTAIL | MACHINE_IMPERFECT_GRAPHICS )
+GAME( 1996, mj4simai, 0, seta2, mj4simai, mj4simai_state, empty_init, ROT0, "Maboroshi Ware", "Wakakusamonogatari Mahjong Yonshimai (Japan)", MACHINE_NO_COCKTAIL )
+GAME( 1996, myangel, 0, myangel, myangel, seta2_state, empty_init, ROT0, "MOSS / Namco", "Kosodate Quiz My Angel (Japan)", MACHINE_NO_COCKTAIL | MACHINE_IMPERFECT_GRAPHICS )
+GAME( 1997, myangel2, 0, myangel2, myangel2, seta2_state, empty_init, ROT0, "MOSS / Namco", "Kosodate Quiz My Angel 2 (Japan)", MACHINE_NO_COCKTAIL | MACHINE_IMPERFECT_GRAPHICS )
+GAME( 1996, telpacfl, 0, telpacfl, telpacfl, seta2_state, empty_init, ROT270, "Sunsoft", "TelePachi Fever Lion (V1.0)", MACHINE_NO_COCKTAIL | MACHINE_IMPERFECT_GRAPHICS )
+GAME( 1997, reelquak, 0, reelquak, reelquak, seta2_state, empty_init, ROT0, "<unknown>", "Reel'N Quake! (Version 1.05)", MACHINE_NO_COCKTAIL | MACHINE_IMPERFECT_GRAPHICS )
+GAME( 199?, endrichs, 0, reelquak, endrichs, seta2_state, empty_init, ROT0, "E.N.Tiger", "Endless Riches (Ver 1.20)", MACHINE_NO_COCKTAIL | MACHINE_IMPERFECT_GRAPHICS )
+GAME( 1997, staraudi, 0, staraudi, staraudi, staraudi_state, empty_init, ROT0, "Namco", "Star Audition", MACHINE_NO_COCKTAIL | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND )
+GAME( 1999, pzlbowl, 0, pzlbowl, pzlbowl, seta2_state, empty_init, ROT0, "MOSS / Nihon System", "Puzzle De Bowling (Japan)", MACHINE_NO_COCKTAIL )
+GAME( 2000, penbros, 0, penbros, penbros, seta2_state, empty_init, ROT0, "Subsino", "Penguin Brothers (Japan)", MACHINE_NO_COCKTAIL )
+GAME( 2000, ablast, penbros, penbros, penbros, seta2_state, empty_init, ROT0, "Subsino", "Hong Tian Lei (A-Blast) (Japan)", MACHINE_NO_COCKTAIL ) // 轟天雷/Hōng tiān léi
+GAME( 2000, ablastb, penbros, ablastb, penbros, seta2_state, empty_init, ROT0, "bootleg", "Hong Tian Lei (A-Blast) (bootleg)", MACHINE_NO_COCKTAIL | MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND ) // at least "tilemap sprite" scrolly flag differs, FPGA instead of x1-010
+GAME( 2000, namcostr, 0, namcostr, funcube, seta2_state, init_namcostr, ROT0, "Namco", "Namco Stars", MACHINE_NO_COCKTAIL | MACHINE_NOT_WORKING )
+GAME( 2000, deerhunt, 0, samshoot, deerhunt, seta2_state, empty_init, ROT0, "Sammy USA Corporation", "Deer Hunting USA V4.3", MACHINE_NO_COCKTAIL | MACHINE_IMPERFECT_GRAPHICS )
+GAME( 2000, deerhunta, deerhunt, samshoot, deerhunt, seta2_state, empty_init, ROT0, "Sammy USA Corporation", "Deer Hunting USA V4.2", MACHINE_NO_COCKTAIL | MACHINE_IMPERFECT_GRAPHICS )
+GAME( 2000, deerhuntb, deerhunt, samshoot, deerhunt, seta2_state, empty_init, ROT0, "Sammy USA Corporation", "Deer Hunting USA V4.0", MACHINE_NO_COCKTAIL | MACHINE_IMPERFECT_GRAPHICS )
+GAME( 2000, deerhuntc, deerhunt, samshoot, deerhunt, seta2_state, empty_init, ROT0, "Sammy USA Corporation", "Deer Hunting USA V3", MACHINE_NO_COCKTAIL | MACHINE_IMPERFECT_GRAPHICS )
+GAME( 2000, deerhuntd, deerhunt, samshoot, deerhunt, seta2_state, empty_init, ROT0, "Sammy USA Corporation", "Deer Hunting USA V2", MACHINE_NO_COCKTAIL | MACHINE_IMPERFECT_GRAPHICS )
+GAME( 2000, deerhunte, deerhunt, samshoot, deerhunt, seta2_state, empty_init, ROT0, "Sammy USA Corporation", "Deer Hunting USA V1", MACHINE_NO_COCKTAIL | MACHINE_IMPERFECT_GRAPHICS )
+GAME( 2001, turkhunt, 0, samshoot, turkhunt, seta2_state, empty_init, ROT0, "Sammy USA Corporation", "Turkey Hunting USA V1.00", MACHINE_NO_COCKTAIL | MACHINE_IMPERFECT_GRAPHICS )
+GAME( 2001, wschamp, 0, samshoot, wschamp, seta2_state, empty_init, ROT0, "Sammy USA Corporation", "Wing Shooting Championship V2.00", MACHINE_NO_COCKTAIL | MACHINE_IMPERFECT_GRAPHICS )
+GAME( 2001, wschampa, wschamp, samshoot, wschamp, seta2_state, empty_init, ROT0, "Sammy USA Corporation", "Wing Shooting Championship V1.01", MACHINE_NO_COCKTAIL | MACHINE_IMPERFECT_GRAPHICS )
+GAME( 2001, wschampb, wschamp, samshoot, wschamp, seta2_state, empty_init, ROT0, "Sammy USA Corporation", "Wing Shooting Championship V1.00", MACHINE_NO_COCKTAIL | MACHINE_IMPERFECT_GRAPHICS )
+GAME( 2002, trophyh, 0, samshoot, trophyh, seta2_state, empty_init, ROT0, "Sammy USA Corporation", "Trophy Hunting - Bear & Moose V1.00", MACHINE_NO_COCKTAIL | MACHINE_IMPERFECT_GRAPHICS )
GAME( 2002, trophyht, trophyh, samshoot, trophyht, seta2_state, empty_init, ROT0, "Sammy USA Corporation", "Trophy Hunting - Bear & Moose V1.00 (location test)", MACHINE_NO_COCKTAIL | MACHINE_IMPERFECT_GRAPHICS )
-GAME( 2000, funcube, 0, funcube, funcube, funcube_state, init_funcube, ROT0, "Namco", "Funcube (v1.5)", MACHINE_NO_COCKTAIL )
-GAME( 2001, funcube2, 0, funcube2, funcube, funcube_state, init_funcube2, ROT0, "Namco", "Funcube 2 (v1.1)", MACHINE_NO_COCKTAIL )
-GAME( 2001, funcube3, 0, funcube3, funcube, funcube_state, init_funcube3, ROT0, "Namco", "Funcube 3 (v1.1)", MACHINE_NO_COCKTAIL )
-GAME( 2001, funcube4, 0, funcube2, funcube, funcube_state, init_funcube2, ROT0, "Namco", "Funcube 4 (v1.0)", MACHINE_NO_COCKTAIL )
-GAME( 2002, funcube5, 0, funcube2, funcube, funcube_state, init_funcube2, ROT0, "Namco", "Funcube 5 (v1.0)", MACHINE_NO_COCKTAIL )
+GAME( 2000, funcube, 0, funcube, funcube, funcube_state, init_funcube, ROT0, "Namco", "Funcube (v1.5)", MACHINE_NO_COCKTAIL )
+GAME( 2001, funcube2, 0, funcube2, funcube, funcube_state, init_funcube2, ROT0, "Namco", "Funcube 2 (v1.1)", MACHINE_NO_COCKTAIL )
+GAME( 2001, funcube3, 0, funcube3, funcube, funcube_state, init_funcube3, ROT0, "Namco", "Funcube 3 (v1.1)", MACHINE_NO_COCKTAIL )
+GAME( 2001, funcube4, 0, funcube2, funcube, funcube_state, init_funcube2, ROT0, "Namco", "Funcube 4 (v1.0)", MACHINE_NO_COCKTAIL )
+GAME( 2002, funcube5, 0, funcube2, funcube, funcube_state, init_funcube2, ROT0, "Namco", "Funcube 5 (v1.0)", MACHINE_NO_COCKTAIL )
diff --git a/src/mame/drivers/sf.cpp b/src/mame/drivers/sf.cpp
index bd8e1ffd660..4fd07309f70 100644
--- a/src/mame/drivers/sf.cpp
+++ b/src/mame/drivers/sf.cpp
@@ -530,32 +530,31 @@ void sf_state::machine_reset()
m_fgscroll = 0;
}
-MACHINE_CONFIG_START(sf_state::sfan)
-
+void sf_state::sfan(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M68000, XTAL(8'000'000))
- MCFG_DEVICE_PROGRAM_MAP(sfan_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", sf_state, irq1_line_hold)
+ M68000(config, m_maincpu, XTAL(8'000'000));
+ m_maincpu->set_addrmap(AS_PROGRAM, &sf_state::sfan_map);
+ m_maincpu->set_vblank_int("screen", FUNC(sf_state::irq1_line_hold));
- MCFG_DEVICE_ADD("audiocpu", Z80, XTAL(3'579'545)) /* ? xtal is 3.579545MHz */
- MCFG_DEVICE_PROGRAM_MAP(sound_map)
+ Z80(config, m_audiocpu, XTAL(3'579'545)); /* ? xtal is 3.579545MHz */
+ m_audiocpu->set_addrmap(AS_PROGRAM, &sf_state::sound_map);
- MCFG_DEVICE_ADD("audio2", Z80, XTAL(3'579'545)) /* ? xtal is 3.579545MHz */
- MCFG_DEVICE_PROGRAM_MAP(sound2_map)
- MCFG_DEVICE_IO_MAP(sound2_io_map)
- MCFG_DEVICE_PERIODIC_INT_DRIVER(sf_state, irq0_line_hold, 8000) // ?
+ z80_device &audio2(Z80(config, "audio2", XTAL(3'579'545))); /* ? xtal is 3.579545MHz */
+ audio2.set_addrmap(AS_PROGRAM, &sf_state::sound2_map);
+ audio2.set_addrmap(AS_IO, &sf_state::sound2_io_map);
+ audio2.set_periodic_int(FUNC(sf_state::irq0_line_hold), attotime::from_hz(8000)); // ?
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(64*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(8*8, (64-8)*8-1, 2*8, 30*8-1 )
- MCFG_SCREEN_UPDATE_DRIVER(sf_state, screen_update)
- MCFG_SCREEN_PALETTE(m_palette)
-
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_sf)
-
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(64*8, 32*8);
+ screen.set_visarea(8*8, (64-8)*8-1, 2*8, 30*8-1);
+ screen.set_screen_update(FUNC(sf_state::screen_update));
+ screen.set_palette(m_palette);
+
+ GFXDECODE(config, m_gfxdecode, m_palette, gfx_sf);
PALETTE(config, m_palette).set_format(palette_device::xRGB_444, 1024);
/* sound hardware */
@@ -569,43 +568,34 @@ MACHINE_CONFIG_START(sf_state::sfan)
ymsnd.add_route(0, "lspeaker", 0.60);
ymsnd.add_route(1, "rspeaker", 0.60);
- MCFG_DEVICE_ADD("msm1", MSM5205, 384000)
- MCFG_MSM5205_PRESCALER_SELECTOR(SEX_4B) /* 8KHz playback ? */
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 1.0)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 1.0)
-
- MCFG_DEVICE_ADD("msm2", MSM5205, 384000)
- MCFG_MSM5205_PRESCALER_SELECTOR(SEX_4B) /* 8KHz playback ? */
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 1.0)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 1.0)
-MACHINE_CONFIG_END
+ MSM5205(config, m_msm[0], 384000);
+ m_msm[0]->set_prescaler_selector(msm5205_device::SEX_4B); /* 8KHz playback ? */
+ m_msm[0]->add_route(ALL_OUTPUTS, "lspeaker", 1.0);
+ m_msm[0]->add_route(ALL_OUTPUTS, "rspeaker", 1.0);
+ MSM5205(config, m_msm[1], 384000);
+ m_msm[1]->set_prescaler_selector(msm5205_device::SEX_4B); /* 8KHz playback ? */
+ m_msm[1]->add_route(ALL_OUTPUTS, "lspeaker", 1.0);
+ m_msm[1]->add_route(ALL_OUTPUTS, "rspeaker", 1.0);
+}
-MACHINE_CONFIG_START(sf_state::sfus)
+void sf_state::sfus(machine_config &config)
+{
sfan(config);
+ m_maincpu->set_addrmap(AS_PROGRAM, &sf_state::sfus_map);
+}
- /* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(sfus_map)
-MACHINE_CONFIG_END
-
-
-MACHINE_CONFIG_START(sf_state::sfjp)
+void sf_state::sfjp(machine_config &config)
+{
sfan(config);
+ m_maincpu->set_addrmap(AS_PROGRAM, &sf_state::sfjp_map);
+}
- /* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(sfjp_map)
-MACHINE_CONFIG_END
-
-
-MACHINE_CONFIG_START(sf_state::sfp)
+void sf_state::sfp(machine_config &config)
+{
sfan(config);
-
- /* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", sf_state, irq6_line_hold)
-MACHINE_CONFIG_END
+ m_maincpu->set_vblank_int("screen", FUNC(sf_state::irq6_line_hold));
+}
diff --git a/src/mame/drivers/sfbonus.cpp b/src/mame/drivers/sfbonus.cpp
index f7c17308650..75b6ecea05f 100644
--- a/src/mame/drivers/sfbonus.cpp
+++ b/src/mame/drivers/sfbonus.cpp
@@ -1376,27 +1376,28 @@ void sfbonus_state::ramdac_map(address_map &map)
}
-MACHINE_CONFIG_START(sfbonus_state::sfbonus)
- MCFG_DEVICE_ADD("maincpu", Z80, 6000000) // custom packaged z80 CPU ?? Mhz
- MCFG_DEVICE_PROGRAM_MAP(sfbonus_map)
- MCFG_DEVICE_IO_MAP(sfbonus_io)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", sfbonus_state, irq0_line_hold)
- //MCFG_DEVICE_PERIODIC_INT_DRIVER(sfbonus_state, nmi_line_pulse, 100)
+void sfbonus_state::sfbonus(machine_config &config)
+{
+ Z80(config, m_maincpu, 6000000); // custom packaged z80 CPU ?? Mhz
+ m_maincpu->set_addrmap(AS_PROGRAM, &sfbonus_state::sfbonus_map);
+ m_maincpu->set_addrmap(AS_IO, &sfbonus_state::sfbonus_io);
+ m_maincpu->set_vblank_int("screen", FUNC(sfbonus_state::irq0_line_hold));
+ //m_maincpu->set_periodic_int(FUNC(sfbonus_state::nmi_line_pulse), attotime::from_hz(100));
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_sfbonus)
+ GFXDECODE(config, m_gfxdecode, m_palette, gfx_sfbonus);
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(128*8, 64*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 512-1, 0*8, 288-1)
- MCFG_SCREEN_UPDATE_DRIVER(sfbonus_state, screen_update_sfbonus)
- MCFG_SCREEN_PALETTE("palette")
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(128*8, 64*8);
+ screen.set_visarea(0*8, 512-1, 0*8, 288-1);
+ screen.set_screen_update(FUNC(sfbonus_state::screen_update_sfbonus));
+ screen.set_palette(m_palette);
- MCFG_PALETTE_ADD("palette", 0x100*2) // *2 for priority workaraound / custom drawing
+ PALETTE(config, m_palette).set_entries(0x100*2); // *2 for priority workaraound / custom drawing
ramdac_device &ramdac(RAMDAC(config, "ramdac", 0, m_palette));
ramdac.set_addrmap(0, &sfbonus_state::ramdac_map);
@@ -1404,9 +1405,8 @@ MACHINE_CONFIG_START(sfbonus_state::sfbonus)
/* Parrot 3 seems fine at 1 Mhz, but Double Challenge isn't? */
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("oki", OKIM6295, 1000000, okim6295_device::PIN7_HIGH) // clock frequency & pin 7 not verified
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.00)
-MACHINE_CONFIG_END
+ OKIM6295(config, "oki", 1000000, okim6295_device::PIN7_HIGH).add_route(ALL_OUTPUTS, "mono", 1.00); // clock frequency & pin 7 not verified
+}
/* Super Ball */
ROM_START( suprball )
diff --git a/src/mame/drivers/sfcbox.cpp b/src/mame/drivers/sfcbox.cpp
index da8365da7c6..01d1ec1c550 100644
--- a/src/mame/drivers/sfcbox.cpp
+++ b/src/mame/drivers/sfcbox.cpp
@@ -456,56 +456,56 @@ void sfcbox_state::machine_reset()
m_soundcpu->set_input_line(INPUT_LINE_RESET, ASSERT_LINE);
}
-MACHINE_CONFIG_START(sfcbox_state::sfcbox)
-
+void sfcbox_state::sfcbox(machine_config &config)
+{
/* base snes hardware */
- MCFG_DEVICE_ADD("maincpu", _5A22, 3580000*6) /* 2.68Mhz, also 3.58Mhz */
- MCFG_DEVICE_PROGRAM_MAP(snes_map)
+ _5A22(config, m_maincpu, 3580000*6); /* 2.68Mhz, also 3.58Mhz */
+ m_maincpu->set_addrmap(AS_PROGRAM, &sfcbox_state::snes_map);
// runs at 24.576 MHz / 12 = 2.048 MHz
- MCFG_DEVICE_ADD("soundcpu", SPC700, XTAL(24'576'000) / 12)
- MCFG_DEVICE_PROGRAM_MAP(spc_mem)
+ SPC700(config, m_soundcpu, XTAL(24'576'000) / 12);
+ m_soundcpu->set_addrmap(AS_PROGRAM, &sfcbox_state::spc_mem);
- MCFG_QUANTUM_PERFECT_CPU("maincpu")
+ config.m_perfect_cpu_quantum = subtag("maincpu");
/* sfcbox hardware */
- MCFG_DEVICE_ADD("bios", Z180, XTAL(12'000'000) / 2) /* HD64180RF6X */
- MCFG_DEVICE_PROGRAM_MAP(sfcbox_map)
- MCFG_DEVICE_IO_MAP(sfcbox_io)
+ Z180(config, m_bios, XTAL(12'000'000) / 2); /* HD64180RF6X */
+ m_bios->set_addrmap(AS_PROGRAM, &sfcbox_state::sfcbox_map);
+ m_bios->set_addrmap(AS_IO, &sfcbox_state::sfcbox_io);
- MCFG_MB90082_ADD("mb90082",XTAL(12'000'000) / 2) /* TODO: correct clock */
+ MB90082(config, m_mb90082, XTAL(12'000'000) / 2); /* TODO: correct clock */
S3520CF(config, m_s3520cf); /* RTC */
/* sound hardware */
SPEAKER(config, "lspeaker").front_left();
SPEAKER(config, "rspeaker").front_right();
- MCFG_DEVICE_ADD("spc700", SNES_SOUND)
- MCFG_SOUND_ROUTE(0, "lspeaker", 1.00)
- MCFG_SOUND_ROUTE(1, "rspeaker", 1.00)
+ SNES_SOUND(config, m_spc700);
+ m_spc700->add_route(0, "lspeaker", 1.00);
+ m_spc700->add_route(1, "rspeaker", 1.00);
/* video hardware */
/* TODO: the screen should actually superimpose, but for the time being let's just separate outputs */
config.set_default_layout(layout_dualhsxs);
// SNES PPU
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_RAW_PARAMS(DOTCLK_NTSC, SNES_HTOTAL, 0, SNES_SCR_WIDTH, SNES_VTOTAL_NTSC, 0, SNES_SCR_HEIGHT_NTSC)
- MCFG_SCREEN_UPDATE_DRIVER( snes_state, screen_update )
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_raw(DOTCLK_NTSC, SNES_HTOTAL, 0, SNES_SCR_WIDTH, SNES_VTOTAL_NTSC, 0, SNES_SCR_HEIGHT_NTSC);
+ screen.set_screen_update(FUNC(snes_state::screen_update));
SNES_PPU(config, m_ppu, MCLK_NTSC);
m_ppu->open_bus_callback().set([this] { return snes_open_bus_r(); }); // lambda because overloaded function name
m_ppu->set_screen("screen");
// SFCBOX
- MCFG_SCREEN_ADD("osd", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500))
-// MCFG_SCREEN_SIZE(24*12+22, 12*18+22)
-// MCFG_SCREEN_VISIBLE_AREA(0*8, 24*12-1, 0*8, 12*18-1)
- MCFG_SCREEN_SIZE(24*16+22, 12*16+22)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 24*16-1, 0*8, 12*16-1)
- MCFG_SCREEN_UPDATE_DRIVER(sfcbox_state,screen_update)
-MACHINE_CONFIG_END
+ screen_device &osd(SCREEN(config, "osd", SCREEN_TYPE_RASTER));
+ osd.set_refresh_hz(60);
+ osd.set_vblank_time(ATTOSECONDS_IN_USEC(2500));
+// osd.set_size(24*12+22, 12*18+22);
+// osd.set_visarea(0*8, 24*12-1, 0*8, 12*18-1);
+ osd.set_size(24*16+22, 12*16+22);
+ osd.set_visarea(0*8, 24*16-1, 0*8, 12*16-1);
+ osd.set_screen_update(FUNC(sfcbox_state::screen_update));
+}
/***************************************************************************
diff --git a/src/mame/drivers/sg1000.cpp b/src/mame/drivers/sg1000.cpp
index ce1a99ab3f1..b5ef0daa73b 100644
--- a/src/mame/drivers/sg1000.cpp
+++ b/src/mame/drivers/sg1000.cpp
@@ -136,9 +136,8 @@ void sg1000_state::sg1000_map(address_map &map)
void sg1000_state::sg1000_io_map(address_map &map)
{
map.global_mask(0xff);
- map(0x40, 0x40).mirror(0x3f).w(SN76489AN_TAG, FUNC(sn76489a_device::command_w));
- map(0x80, 0x80).mirror(0x3e).rw(TMS9918A_TAG, FUNC(tms9918a_device::vram_r), FUNC(tms9918a_device::vram_w));
- map(0x81, 0x81).mirror(0x3e).rw(TMS9918A_TAG, FUNC(tms9918a_device::register_r), FUNC(tms9918a_device::register_w));
+ map(0x40, 0x40).mirror(0x3f).w(SN76489AN_TAG, FUNC(sn76489a_device::write));
+ map(0x80, 0x81).mirror(0x3e).rw(TMS9918A_TAG, FUNC(tms9918a_device::read), FUNC(tms9918a_device::write));
map(0xdc, 0xdf).rw(FUNC(sg1000_state::peripheral_r), FUNC(sg1000_state::peripheral_w));
}
@@ -159,9 +158,8 @@ void sg1000_state::omv_map(address_map &map)
void sg1000_state::omv_io_map(address_map &map)
{
map.global_mask(0xff);
- map(0x40, 0x40).mirror(0x3f).w(SN76489AN_TAG, FUNC(sn76489a_device::command_w));
- map(0x80, 0x80).mirror(0x3e).rw(TMS9918A_TAG, FUNC(tms9918a_device::vram_r), FUNC(tms9918a_device::vram_w));
- map(0x81, 0x81).mirror(0x3e).rw(TMS9918A_TAG, FUNC(tms9918a_device::register_r), FUNC(tms9918a_device::register_w));
+ map(0x40, 0x40).mirror(0x3f).w(SN76489AN_TAG, FUNC(sn76489a_device::write));
+ map(0x80, 0x81).mirror(0x3e).rw(TMS9918A_TAG, FUNC(tms9918a_device::read), FUNC(tms9918a_device::write));
map(0xc0, 0xc0).mirror(0x38).portr("C0");
map(0xc1, 0xc1).mirror(0x38).portr("C1");
map(0xc2, 0xc2).mirror(0x38).portr("C2");
@@ -187,9 +185,9 @@ void sg1000_state::sc3000_map(address_map &map)
void sg1000_state::sc3000_io_map(address_map &map)
{
map.global_mask(0xff);
- map(0x7f, 0x7f).w(SN76489AN_TAG, FUNC(sn76489a_device::command_w));
- map(0xbe, 0xbe).rw(TMS9918A_TAG, FUNC(tms9918a_device::vram_r), FUNC(tms9918a_device::vram_w));
- map(0xbf, 0xbf).rw(TMS9918A_TAG, FUNC(tms9918a_device::register_r), FUNC(tms9918a_device::register_w));
+ map(0x00, 0xff).rw(CARTSLOT_TAG, FUNC(sega8_cart_slot_device::read_io), FUNC(sega8_cart_slot_device::write_io));
+ map(0x7f, 0x7f).w(SN76489AN_TAG, FUNC(sn76489a_device::write));
+ map(0xbe, 0xbf).rw(TMS9918A_TAG, FUNC(tms9918a_device::read), FUNC(tms9918a_device::write));
map(0xdc, 0xdf).rw(FUNC(sg1000_state::peripheral_r), FUNC(sg1000_state::peripheral_w));
}
@@ -198,9 +196,8 @@ void sg1000_state::sc3000_io_map(address_map &map)
{
map.global_mask(0xff);
map(0x00, 0x00).mirror(0xdf).rw(UPD9255_TAG, FUNC(i8255_device::read), FUNC(i8255_device::write));
- map(0x00, 0x00).mirror(0x7f).w(SN76489AN_TAG, FUNC(sn76489a_device::command_w));
- map(0x00, 0x00).mirror(0xae).rw(TMS9918A_TAG, FUNC(tms9918a_device::vram_r), FUNC(tms9918a_device::vram_w));
- map(0x01, 0x01).mirror(0xae).rw(TMS9918A_TAG, FUNC(tms9918a_device::register_r), FUNC(tms9918a_device::register_w));
+ map(0x00, 0x00).mirror(0x7f).w(SN76489AN_TAG, FUNC(sn76489a_device::write));
+ map(0x00, 0x01).mirror(0xae).rw(TMS9918A_TAG, FUNC(tms9918a_device::read), FUNC(tms9918a_device::write));
map(0x60, 0x60).mirror(0x9f).r(FUNC(sg1000_state::sc3000_r_r));
}
*/
@@ -222,9 +219,8 @@ void sf7000_state::sf7000_map(address_map &map)
void sf7000_state::sf7000_io_map(address_map &map)
{
map.global_mask(0xff);
- map(0x7f, 0x7f).w(SN76489AN_TAG, FUNC(sn76489a_device::command_w));
- map(0xbe, 0xbe).rw(TMS9918A_TAG, FUNC(tms9918a_device::vram_r), FUNC(tms9918a_device::vram_w));
- map(0xbf, 0xbf).rw(TMS9918A_TAG, FUNC(tms9918a_device::register_r), FUNC(tms9918a_device::register_w));
+ map(0x7f, 0x7f).w(SN76489AN_TAG, FUNC(sn76489a_device::write));
+ map(0xbe, 0xbf).rw(TMS9918A_TAG, FUNC(tms9918a_device::read), FUNC(tms9918a_device::write));
map(0xdc, 0xdf).rw(FUNC(sf7000_state::peripheral_r), FUNC(sf7000_state::peripheral_w));
map(0xe0, 0xe1).m(m_fdc, FUNC(upd765a_device::map));
map(0xe4, 0xe7).rw(UPD9255_1_TAG, FUNC(i8255_device::read), FUNC(i8255_device::write));
@@ -485,7 +481,8 @@ void sc3000_state::machine_start()
timer_set(attotime::zero, TIMER_LIGHTGUN_TICK);
if (m_cart && m_cart->exists() && (m_cart->get_type() == SEGA8_BASIC_L3 || m_cart->get_type() == SEGA8_MUSIC_EDITOR
- || m_cart->get_type() == SEGA8_DAHJEE_TYPEA || m_cart->get_type() == SEGA8_DAHJEE_TYPEB))
+ || m_cart->get_type() == SEGA8_DAHJEE_TYPEA || m_cart->get_type() == SEGA8_DAHJEE_TYPEB
+ || m_cart->get_type() == SEGA8_MULTICART || m_cart->get_type() == SEGA8_MEGACART))
{
m_maincpu->space(AS_PROGRAM).install_read_handler(0xc000, 0xffff, read8_delegate(FUNC(sega8_cart_slot_device::read_ram),(sega8_cart_slot_device*)m_cart));
m_maincpu->space(AS_PROGRAM).install_write_handler(0xc000, 0xffff, write8_delegate(FUNC(sega8_cart_slot_device::write_ram),(sega8_cart_slot_device*)m_cart));
@@ -523,14 +520,15 @@ void sf7000_state::machine_reset()
***************************************************************************/
/*-------------------------------------------------
- MACHINE_CONFIG_START( sg1000 )
+ machine_config( sg1000 )
-------------------------------------------------*/
-MACHINE_CONFIG_START(sg1000_state::sg1000)
+void sg1000_state::sg1000(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD(Z80_TAG, Z80, XTAL(10'738'635)/3)
- MCFG_DEVICE_PROGRAM_MAP(sg1000_map)
- MCFG_DEVICE_IO_MAP(sg1000_io_map)
+ Z80(config, m_maincpu, XTAL(10'738'635)/3);
+ m_maincpu->set_addrmap(AS_PROGRAM, &sg1000_state::sg1000_map);
+ m_maincpu->set_addrmap(AS_IO, &sg1000_state::sg1000_io_map);
/* video hardware */
tms9918a_device &vdp(TMS9918A(config, TMS9918A_TAG, XTAL(10'738'635)));
@@ -542,47 +540,48 @@ MACHINE_CONFIG_START(sg1000_state::sg1000)
/* sound hardware */
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD(SN76489AN_TAG, SN76489A, XTAL(10'738'635)/3)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.00)
+ SN76489A(config, SN76489AN_TAG, XTAL(10'738'635)/3).add_route(ALL_OUTPUTS, "mono", 1.00);
/* expansion slot */
- MCFG_SG1000_EXPANSION_ADD(EXPSLOT_TAG, sg1000_expansion_devices, nullptr, false)
+ SG1000_EXPANSION_SLOT(config, m_sgexpslot, sg1000_expansion_devices, nullptr, false);
/* cartridge */
- MCFG_SG1000_CARTRIDGE_ADD(CARTSLOT_TAG, sg1000_cart, nullptr)
+ SG1000_CART_SLOT(config, CARTSLOT_TAG, sg1000_cart, nullptr);
/* software lists */
- MCFG_SOFTWARE_LIST_ADD("cart_list","sg1000")
+ SOFTWARE_LIST(config, "cart_list").set_original("sg1000");
/* internal ram */
RAM(config, m_ram).set_default_size("1K");
-MACHINE_CONFIG_END
+}
/*-------------------------------------------------
- MACHINE_CONFIG_START( omv )
+ machine_config( omv )
-------------------------------------------------*/
-MACHINE_CONFIG_START(sg1000_state::omv)
+void sg1000_state::omv(machine_config &config)
+{
sg1000(config);
- MCFG_DEVICE_MODIFY(Z80_TAG)
- MCFG_DEVICE_PROGRAM_MAP(omv_map)
- MCFG_DEVICE_IO_MAP(omv_io_map)
- MCFG_DEVICE_REMOVE(CARTSLOT_TAG)
- MCFG_OMV_CARTRIDGE_ADD(CARTSLOT_TAG, sg1000_cart, nullptr)
+ m_maincpu->set_addrmap(AS_PROGRAM, &sg1000_state::omv_map);
+ m_maincpu->set_addrmap(AS_IO, &sg1000_state::omv_io_map);
+
+ config.device_remove(CARTSLOT_TAG);
+ OMV_CART_SLOT(config, CARTSLOT_TAG, sg1000_cart, nullptr);
m_ram->set_default_size("2K");
-MACHINE_CONFIG_END
+}
/*-------------------------------------------------
- MACHINE_CONFIG_START( sc3000 )
+ machine_config( sc3000 )
-------------------------------------------------*/
-MACHINE_CONFIG_START(sc3000_state::sc3000)
+void sc3000_state::sc3000(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD(Z80_TAG, Z80, XTAL(10'738'635)/3) // LH0080A
- MCFG_DEVICE_PROGRAM_MAP(sc3000_map)
- MCFG_DEVICE_IO_MAP(sc3000_io_map)
+ Z80(config, m_maincpu, XTAL(10'738'635)/3); // LH0080A
+ m_maincpu->set_addrmap(AS_PROGRAM, &sc3000_state::sc3000_map);
+ m_maincpu->set_addrmap(AS_IO, &sc3000_state::sc3000_io_map);
/* video hardware */
tms9918a_device &vdp(TMS9918A(config, TMS9918A_TAG, XTAL(10'738'635)));
@@ -594,32 +593,32 @@ MACHINE_CONFIG_START(sc3000_state::sc3000)
/* sound hardware */
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD(SN76489AN_TAG, SN76489A, XTAL(10'738'635)/3)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.00)
+ SN76489A(config, SN76489AN_TAG, XTAL(10'738'635)/3).add_route(ALL_OUTPUTS, "mono", 1.00);
/* sc3000 has all sk1100 features built-in, so add it as a fixed slot */
- MCFG_SG1000_EXPANSION_ADD(EXPSLOT_TAG, sg1000_expansion_devices, "sk1100", true)
+ SG1000_EXPANSION_SLOT(config, m_sgexpslot, sg1000_expansion_devices, "sk1100", true);
/* cartridge */
- MCFG_SC3000_CARTRIDGE_ADD(CARTSLOT_TAG, sg1000_cart, nullptr)
+ SC3000_CART_SLOT(config, CARTSLOT_TAG, sg1000_cart, nullptr);
/* software lists */
- MCFG_SOFTWARE_LIST_ADD("cart_list","sg1000")
+ SOFTWARE_LIST(config, "cart_list").set_original("sg1000");
/* the sk1100 device will add sc3000 cart and cass lists */
/* internal ram */
RAM(config, m_ram).set_default_size("2K");
-MACHINE_CONFIG_END
+}
/*-------------------------------------------------
- MACHINE_CONFIG_START( sf7000 )
+ machine_config( sf7000 )
-------------------------------------------------*/
-MACHINE_CONFIG_START(sf7000_state::sf7000)
+void sf7000_state::sf7000(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD(Z80_TAG, Z80, XTAL(10'738'635)/3)
- MCFG_DEVICE_PROGRAM_MAP(sf7000_map)
- MCFG_DEVICE_IO_MAP(sf7000_io_map)
+ Z80(config, m_maincpu, XTAL(10'738'635)/3);
+ m_maincpu->set_addrmap(AS_PROGRAM, &sf7000_state::sf7000_map);
+ m_maincpu->set_addrmap(AS_IO, &sf7000_state::sf7000_io_map);
/* video hardware */
tms9918a_device &vdp(TMS9918A(config, TMS9918A_TAG, XTAL(10'738'635)));
@@ -631,8 +630,7 @@ MACHINE_CONFIG_START(sf7000_state::sf7000)
/* sound hardware */
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD(SN76489AN_TAG, SN76489A, XTAL(10'738'635)/3)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.00)
+ SN76489A(config, SN76489AN_TAG, XTAL(10'738'635)/3).add_route(ALL_OUTPUTS, "mono", 1.00);
/* devices */
i8255_device &ppi(I8255(config, UPD9255_1_TAG));
@@ -650,21 +648,22 @@ MACHINE_CONFIG_START(sf7000_state::sf7000)
rs232.dsr_handler().set(UPD8251_TAG, FUNC(i8251_device::write_dsr));
UPD765A(config, m_fdc, 8'000'000, false, false);
- MCFG_FLOPPY_DRIVE_ADD(UPD765_TAG ":0", sf7000_floppies, "3ssdd", sf7000_state::floppy_formats)
+ FLOPPY_CONNECTOR(config, UPD765_TAG ":0", sf7000_floppies, "3ssdd", sf7000_state::floppy_formats);
- MCFG_DEVICE_ADD(m_centronics, CENTRONICS, centronics_devices, "printer")
+ CENTRONICS(config, m_centronics, centronics_devices, "printer");
- MCFG_CENTRONICS_OUTPUT_LATCH_ADD("cent_data_out", "centronics")
+ output_latch_device &cent_data_out(OUTPUT_LATCH(config, "cent_data_out"));
+ m_centronics->set_output_latch(cent_data_out);
/* sf7000 (sc3000) has all sk1100 features built-in, so add it as a fixed slot */
- MCFG_SG1000_EXPANSION_ADD(EXPSLOT_TAG, sg1000_expansion_devices, "sk1100", true)
+ SG1000_EXPANSION_SLOT(config, m_sgexpslot, sg1000_expansion_devices, "sk1100", true);
/* software lists */
- MCFG_SOFTWARE_LIST_ADD("flop_list","sf7000")
+ SOFTWARE_LIST(config, "flop_list").set_original("sf7000");
/* internal ram */
RAM(config, m_ram).set_default_size("64K");
-MACHINE_CONFIG_END
+}
/***************************************************************************
ROMS
diff --git a/src/mame/drivers/sg1000a.cpp b/src/mame/drivers/sg1000a.cpp
index 0bd5a5cbcd1..cf91d446fcd 100644
--- a/src/mame/drivers/sg1000a.cpp
+++ b/src/mame/drivers/sg1000a.cpp
@@ -324,18 +324,16 @@ void sg1000a_state::decrypted_opcodes_map(address_map &map)
void sg1000a_state::io_map(address_map &map)
{
map.global_mask(0xff);
- map(0x7f, 0x7f).w("snsnd", FUNC(sn76489a_device::command_w));
- map(0xbe, 0xbe).rw("tms9928a", FUNC(tms9928a_device::vram_r), FUNC(tms9928a_device::vram_w));
- map(0xbf, 0xbf).rw("tms9928a", FUNC(tms9928a_device::register_r), FUNC(tms9928a_device::register_w));
+ map(0x7f, 0x7f).w("snsnd", FUNC(sn76489a_device::write));
+ map(0xbe, 0xbf).rw("tms9928a", FUNC(tms9928a_device::read), FUNC(tms9928a_device::write));
map(0xdc, 0xdf).rw("ppi8255", FUNC(i8255_device::read), FUNC(i8255_device::write));
}
void sg1000a_state::sderby_io_map(address_map &map)
{
map.global_mask(0xff);
- map(0x40, 0x40).mirror(0x3f).w("snsnd", FUNC(sn76489a_device::command_w));
- map(0x80, 0x80).mirror(0x3e).rw("tms9928a", FUNC(tms9928a_device::vram_r), FUNC(tms9928a_device::vram_w));
- map(0x81, 0x81).mirror(0x3e).rw("tms9928a", FUNC(tms9928a_device::register_r), FUNC(tms9928a_device::register_w));
+ map(0x40, 0x40).mirror(0x3f).w("snsnd", FUNC(sn76489a_device::write));
+ map(0x80, 0x81).mirror(0x3e).rw("tms9928a", FUNC(tms9928a_device::read), FUNC(tms9928a_device::write));
// map(0xc0, 0xc1).mirror(0x06) NEC D8251AC UART
map(0xc8, 0xcb).mirror(0x04).rw("ppi8255", FUNC(i8255_device::read), FUNC(i8255_device::write)); // NEC D8255AC-2
}
@@ -468,11 +466,12 @@ WRITE8_MEMBER(sg1000a_state::sg1000a_coin_counter_w)
*
*************************************/
-MACHINE_CONFIG_START(sg1000a_state::sg1000a)
+void sg1000a_state::sg1000a(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, XTAL(3'579'545))
- MCFG_DEVICE_PROGRAM_MAP(program_map)
- MCFG_DEVICE_IO_MAP(io_map)
+ Z80(config, m_maincpu, XTAL(3'579'545));
+ m_maincpu->set_addrmap(AS_PROGRAM, &sg1000a_state::program_map);
+ m_maincpu->set_addrmap(AS_IO, &sg1000a_state::io_map);
i8255_device &ppi(I8255(config, "ppi8255"));
ppi.in_pa_callback().set_ioport("P1");
@@ -490,9 +489,8 @@ MACHINE_CONFIG_START(sg1000a_state::sg1000a)
/* sound hardware */
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("snsnd", SN76489A, XTAL(3'579'545))
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
-MACHINE_CONFIG_END
+ SN76489A(config, "snsnd", XTAL(3'579'545)).add_route(ALL_OUTPUTS, "mono", 1.0);
+}
void sg1000a_state::sg1000ax(machine_config &config)
{
@@ -504,14 +502,14 @@ void sg1000a_state::sg1000ax(machine_config &config)
maincpu.set_decrypted_tag(":decrypted_opcodes");
}
-MACHINE_CONFIG_START(sg1000a_state::sderbys)
+void sg1000a_state::sderbys(machine_config &config)
+{
sg1000a(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_CLOCK(XTAL(10'738'635) / 3)
- MCFG_DEVICE_IO_MAP(sderby_io_map)
+ m_maincpu->set_clock(XTAL(10'738'635) / 3);
+ m_maincpu->set_addrmap(AS_IO, &sg1000a_state::sderby_io_map);
// Actually uses a Sega 315-5066 chip, which is a TMS9918 and SN76489 in the same package but with RGB output
-MACHINE_CONFIG_END
+}
/*************************************
*
diff --git a/src/mame/drivers/shadfrce.cpp b/src/mame/drivers/shadfrce.cpp
index 4cada653a05..17455f2c3a3 100644
--- a/src/mame/drivers/shadfrce.cpp
+++ b/src/mame/drivers/shadfrce.cpp
@@ -535,22 +535,22 @@ GFXDECODE_END
/* Machine Driver Bits */
-MACHINE_CONFIG_START(shadfrce_state::shadfrce)
-
- MCFG_DEVICE_ADD("maincpu", M68000, XTAL(28'000'000) / 2) /* verified on pcb */
- MCFG_DEVICE_PROGRAM_MAP(shadfrce_map)
- MCFG_TIMER_DRIVER_ADD_SCANLINE("scantimer", shadfrce_state, scanline, "screen", 0, 1)
+void shadfrce_state::shadfrce(machine_config &config)
+{
+ M68000(config, m_maincpu, XTAL(28'000'000) / 2); /* verified on pcb */
+ m_maincpu->set_addrmap(AS_PROGRAM, &shadfrce_state::shadfrce_map);
+ TIMER(config, "scantimer").configure_scanline(FUNC(shadfrce_state::scanline), "screen", 0, 1);
- MCFG_DEVICE_ADD("audiocpu", Z80, XTAL(3'579'545)) /* verified on pcb */
- MCFG_DEVICE_PROGRAM_MAP(shadfrce_sound_map)
+ Z80(config, m_audiocpu, XTAL(3'579'545)); /* verified on pcb */
+ m_audiocpu->set_addrmap(AS_PROGRAM, &shadfrce_state::shadfrce_sound_map);
WATCHDOG_TIMER(config, "watchdog");
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_RAW_PARAMS(XTAL(28'000'000) / 4, 448, 0, 320, 272, 8, 248) /* HTOTAL and VTOTAL are guessed */
- MCFG_SCREEN_UPDATE_DRIVER(shadfrce_state, screen_update)
- MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE(*this, shadfrce_state, screen_vblank))
- MCFG_SCREEN_PALETTE(m_palette)
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_raw(XTAL(28'000'000) / 4, 448, 0, 320, 272, 8, 248); /* HTOTAL and VTOTAL are guessed */
+ m_screen->set_screen_update(FUNC(shadfrce_state::screen_update));
+ m_screen->screen_vblank().set(FUNC(shadfrce_state::screen_vblank));
+ m_screen->set_palette(m_palette);
GFXDECODE(config, m_gfxdecode, m_palette, gfx_shadfrce);
PALETTE(config, m_palette).set_format(palette_device::xBGR_555, 0x4000);
@@ -567,10 +567,10 @@ MACHINE_CONFIG_START(shadfrce_state::shadfrce)
ymsnd.add_route(0, "lspeaker", 0.50);
ymsnd.add_route(1, "rspeaker", 0.50);
- MCFG_DEVICE_ADD("oki", OKIM6295, XTAL(13'495'200)/8, okim6295_device::PIN7_HIGH) /* verified on pcb */
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 0.50)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 0.50)
-MACHINE_CONFIG_END
+ OKIM6295(config, m_oki, XTAL(13'495'200)/8, okim6295_device::PIN7_HIGH); /* verified on pcb */
+ m_oki->add_route(ALL_OUTPUTS, "lspeaker", 0.50);
+ m_oki->add_route(ALL_OUTPUTS, "rspeaker", 0.50);
+}
/* Rom Defs. */
diff --git a/src/mame/drivers/shanghai.cpp b/src/mame/drivers/shanghai.cpp
index f60a2c932fd..0493b7b0f53 100644
--- a/src/mame/drivers/shanghai.cpp
+++ b/src/mame/drivers/shanghai.cpp
@@ -398,26 +398,26 @@ void shanghai_state::hd63484_map(address_map &map)
map(0x00000, 0x3ffff).ram();
}
-MACHINE_CONFIG_START(shanghai_state::shanghai)
-
+void shanghai_state::shanghai(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", V30, XTAL(16'000'000)/2) /* NEC D70116C-8 */
- MCFG_DEVICE_PROGRAM_MAP(shanghai_map)
- MCFG_DEVICE_IO_MAP(shanghai_portmap)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", shanghai_state, half_vblank_irq)
+ V30(config, m_maincpu, XTAL(16'000'000)/2); /* NEC D70116C-8 */
+ m_maincpu->set_addrmap(AS_PROGRAM, &shanghai_state::shanghai_map);
+ m_maincpu->set_addrmap(AS_IO, &shanghai_state::shanghai_portmap);
+ m_maincpu->set_vblank_int("screen", FUNC(shanghai_state::half_vblank_irq));
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(57)
- //MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500))
- MCFG_SCREEN_SIZE(384, 280)
- MCFG_SCREEN_VISIBLE_AREA(0, 384-1, 0, 280-1)
- MCFG_SCREEN_UPDATE_DEVICE("hd63484", hd63484_device, update_screen)
- MCFG_SCREEN_PALETTE("palette")
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_refresh_hz(57);
+ //m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(2500));
+ m_screen->set_size(384, 280);
+ m_screen->set_visarea(0, 384-1, 0, 280-1);
+ m_screen->set_screen_update("hd63484", FUNC(hd63484_device::update_screen));
+ m_screen->set_palette("palette");
PALETTE(config, "palette", FUNC(shanghai_state::shanghai_palette)).set_format(palette_device::xBGR_444, 256);
- MCFG_HD63484_ADD("hd63484", 0, hd63484_map)
+ HD63484(config, "hd63484", 0).set_addrmap(0, &shanghai_state::hd63484_map);
/* sound hardware */
SPEAKER(config, "mono").front_center();
@@ -429,29 +429,29 @@ MACHINE_CONFIG_START(shanghai_state::shanghai)
ymsnd.add_route(1, "mono", 0.15);
ymsnd.add_route(2, "mono", 0.15);
ymsnd.add_route(3, "mono", 0.80);
-MACHINE_CONFIG_END
-
+}
-MACHINE_CONFIG_START(shanghai_state::shangha2)
+void shanghai_state::shangha2(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", V30, XTAL(16'000'000)/2) /* ? */
- MCFG_DEVICE_PROGRAM_MAP(shangha2_map)
- MCFG_DEVICE_IO_MAP(shangha2_portmap)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", shanghai_state, half_vblank_irq)
+ V30(config, m_maincpu, XTAL(16'000'000)/2); /* ? */
+ m_maincpu->set_addrmap(AS_PROGRAM, &shanghai_state::shangha2_map);
+ m_maincpu->set_addrmap(AS_IO, &shanghai_state::shangha2_portmap);
+ m_maincpu->set_vblank_int("screen", FUNC(shanghai_state::half_vblank_irq));
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(57)
- //MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500))
- MCFG_SCREEN_SIZE(384, 280)
- MCFG_SCREEN_VISIBLE_AREA(0, 384-1, 0, 280-1)
- MCFG_SCREEN_UPDATE_DEVICE("hd63484", hd63484_device, update_screen)
- MCFG_SCREEN_PALETTE("palette")
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_refresh_hz(57);
+ //m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(2500));
+ m_screen->set_size(384, 280);
+ m_screen->set_visarea(0, 384-1, 0, 280-1);
+ m_screen->set_screen_update("hd63484", FUNC(hd63484_device::update_screen));
+ m_screen->set_palette("palette");
PALETTE(config, "palette").set_format(palette_device::xBGR_444, 256);
- MCFG_HD63484_ADD("hd63484", 0, hd63484_map)
+ HD63484(config, "hd63484", 0).set_addrmap(0, &shanghai_state::hd63484_map);
/* sound hardware */
SPEAKER(config, "mono").front_center();
@@ -463,35 +463,36 @@ MACHINE_CONFIG_START(shanghai_state::shangha2)
ymsnd.add_route(1, "mono", 0.15);
ymsnd.add_route(2, "mono", 0.15);
ymsnd.add_route(3, "mono", 0.80);
-MACHINE_CONFIG_END
-
+}
-MACHINE_CONFIG_START(shanghai_state::kothello)
+void shanghai_state::kothello(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", V30, XTAL(16'000'000))
- MCFG_DEVICE_PROGRAM_MAP(kothello_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", shanghai_state, half_vblank_irq)
+ V30(config, m_maincpu, XTAL(16'000'000));
+ m_maincpu->set_addrmap(AS_PROGRAM, &shanghai_state::kothello_map);
+ m_maincpu->set_vblank_int("screen", FUNC(shanghai_state::half_vblank_irq));
- MCFG_DEVICE_ADD("audiocpu", Z80, XTAL(16'000'000)/4)
- MCFG_DEVICE_PROGRAM_MAP(kothello_sound_map)
- MCFG_DEVICE_IRQ_ACKNOWLEDGE_DEVICE("seibu_sound", seibu_sound_device, im0_vector_cb)
+ z80_device &audiocpu(Z80(config, "audiocpu", XTAL(16'000'000)/4));
+ audiocpu.set_addrmap(AS_PROGRAM, &shanghai_state::kothello_sound_map);
+ audiocpu.set_irq_acknowledge_callback("seibu_sound", FUNC(seibu_sound_device::im0_vector_cb));
- MCFG_QUANTUM_TIME(attotime::from_hz(12000))
+ config.m_minimum_quantum = attotime::from_hz(12000);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(57)
- //MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500))
- MCFG_SCREEN_SIZE(384, 280)
- MCFG_SCREEN_VISIBLE_AREA(0, 384-1, 0, 280-1)
- MCFG_SCREEN_UPDATE_DEVICE("hd63484", hd63484_device, update_screen)
- MCFG_SCREEN_PALETTE("palette")
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_refresh_hz(57);
+ //m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(2500));
+ m_screen->set_size(384, 280);
+ m_screen->set_visarea(0, 384-1, 0, 280-1);
+ m_screen->set_screen_update("hd63484", FUNC(hd63484_device::update_screen));
+ m_screen->set_palette("palette");
PALETTE(config, "palette").set_format(palette_device::xBGR_444, 256);
- MCFG_HD63484_ADD("hd63484", 0, hd63484_map)
- MCFG_HD63484_EXTERNAL_SKEW(2)
+ hd63484_device &hd63484(HD63484(config, "hd63484", 0));
+ hd63484.set_addrmap(0, &shanghai_state::hd63484_map);
+ hd63484.set_external_skew(2);
/* sound hardware */
SPEAKER(config, "mono").front_center();
@@ -511,7 +512,7 @@ MACHINE_CONFIG_START(shanghai_state::kothello)
seibu_sound.ym_write_callback().set("ymsnd", FUNC(ym2203_device::write));
SEIBU_ADPCM(config, "adpcm", 8000).add_route(ALL_OUTPUTS, "mono", 0.80); // actually MSM5205
-MACHINE_CONFIG_END
+}
/***************************************************************************
diff --git a/src/mame/drivers/shangkid.cpp b/src/mame/drivers/shangkid.cpp
index 8cbb3abc4cc..8c631b7ac43 100644
--- a/src/mame/drivers/shangkid.cpp
+++ b/src/mame/drivers/shangkid.cpp
@@ -375,19 +375,19 @@ void shangkid_state::sound_portmap(address_map &map)
/***************************************************************************************/
-MACHINE_CONFIG_START(shangkid_state::chinhero)
-
+void shangkid_state::chinhero(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD(m_maincpu, Z80, XTAL(18'432'000)/6) /* verified on pcb */
- MCFG_DEVICE_PROGRAM_MAP(chinhero_main_map)
+ Z80(config, m_maincpu, XTAL(18'432'000)/6); /* verified on pcb */
+ m_maincpu->set_addrmap(AS_PROGRAM, &shangkid_state::chinhero_main_map);
- MCFG_DEVICE_ADD(m_bbx, Z80, XTAL(18'432'000)/6) /* verified on pcb */
- MCFG_DEVICE_PROGRAM_MAP(chinhero_bbx_map)
- MCFG_DEVICE_IO_MAP(chinhero_bbx_portmap)
+ Z80(config, m_bbx, XTAL(18'432'000)/6); /* verified on pcb */
+ m_bbx->set_addrmap(AS_PROGRAM, &shangkid_state::chinhero_bbx_map);
+ m_bbx->set_addrmap(AS_IO, &shangkid_state::chinhero_bbx_portmap);
- MCFG_DEVICE_ADD(m_audiocpu, Z80, XTAL(18'432'000)/6) /* verified on pcb */
- MCFG_DEVICE_PROGRAM_MAP(chinhero_sound_map)
- MCFG_DEVICE_IO_MAP(sound_portmap)
+ Z80(config, m_audiocpu, XTAL(18'432'000)/6); /* verified on pcb */
+ m_audiocpu->set_addrmap(AS_PROGRAM, &shangkid_state::chinhero_sound_map);
+ m_audiocpu->set_addrmap(AS_IO, &shangkid_state::sound_portmap);
ls259_device &mainlatch(LS259(config, "mainlatch"));
mainlatch.q_out_cb<0>().set_inputline(m_bbx, INPUT_LINE_RESET).invert(); // RESET2
@@ -400,7 +400,7 @@ MACHINE_CONFIG_START(shangkid_state::chinhero)
mainlatch.q_out_cb<6>().set(FUNC(shangkid_state::coin_counter_1_w));
mainlatch.q_out_cb<7>().set(FUNC(shangkid_state::coin_counter_2_w));
- MCFG_QUANTUM_TIME(attotime::from_hz(600))
+ config.m_minimum_quantum = attotime::from_hz(600);
/* video hardware */
screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
@@ -420,18 +420,20 @@ MACHINE_CONFIG_START(shangkid_state::chinhero)
/* sound hardware */
SPEAKER(config, "speaker").front_center();
- MCFG_DEVICE_ADD("dac", DAC_8BIT_R2R, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 0.25) // unknown DAC
- MCFG_DEVICE_ADD("vref", VOLTAGE_REGULATOR, 0) MCFG_VOLTAGE_REGULATOR_OUTPUT(5.0)
- MCFG_SOUND_ROUTE(0, "dac", 1.0, DAC_VREF_POS_INPUT) MCFG_SOUND_ROUTE(0, "dac", -1.0, DAC_VREF_NEG_INPUT)
+ DAC_8BIT_R2R(config, "dac", 0).add_route(ALL_OUTPUTS, "speaker", 0.25); // unknown DAC
+ voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref"));
+ vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT);
+ vref.add_route(0, "dac", -1.0, DAC_VREF_NEG_INPUT);
AY8910(config, m_aysnd, XTAL(18'432'000)/12); /* verified on pcb */
m_aysnd->port_a_write_callback().set(FUNC(shangkid_state::chinhero_ay8910_porta_w));
m_aysnd->port_b_write_callback().set(FUNC(shangkid_state::ay8910_portb_w));
m_aysnd->add_route(ALL_OUTPUTS, "speaker", 0.1);
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(shangkid_state::shangkid)
+void shangkid_state::shangkid(machine_config &config)
+{
chinhero(config);
/* basic machine hardware */
@@ -450,10 +452,10 @@ MACHINE_CONFIG_START(shangkid_state::shangkid)
MCFG_MACHINE_RESET_OVERRIDE(shangkid_state,shangkid)
/* video hardware */
- MCFG_GFXDECODE_MODIFY("gfxdecode", gfx_shangkid)
+ m_gfxdecode->set_info(gfx_shangkid);
m_aysnd->port_a_write_callback().set(FUNC(shangkid_state::shangkid_ay8910_porta_w));
-MACHINE_CONFIG_END
+}
@@ -479,12 +481,12 @@ void shangkid_state::dynamski_portmap(address_map &map)
map(0x00, 0x01).w(m_aysnd, FUNC(ay8910_device::data_address_w));
}
-MACHINE_CONFIG_START(shangkid_state::dynamski)
-
+void shangkid_state::dynamski(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, 3000000) /* ? */
- MCFG_DEVICE_PROGRAM_MAP(dynamski_map)
- MCFG_DEVICE_IO_MAP(dynamski_portmap)
+ Z80(config, m_maincpu, 3000000); /* ? */
+ m_maincpu->set_addrmap(AS_PROGRAM, &shangkid_state::dynamski_map);
+ m_maincpu->set_addrmap(AS_IO, &shangkid_state::dynamski_portmap);
ls259_device &mainlatch(LS259(config, "mainlatch"));
mainlatch.q_out_cb<0>().set(FUNC(shangkid_state::int_enable_1_w));
@@ -492,14 +494,14 @@ MACHINE_CONFIG_START(shangkid_state::dynamski)
mainlatch.q_out_cb<2>().set_nop(); // screen flip?
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */)
- MCFG_SCREEN_SIZE(256+32, 256)
- MCFG_SCREEN_VISIBLE_AREA(0, 255+32, 16, 255-16)
- MCFG_SCREEN_UPDATE_DRIVER(shangkid_state, screen_update_dynamski)
- MCFG_SCREEN_PALETTE("palette")
- MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE(*this, shangkid_state, irq_1_w))
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500) /* not accurate */);
+ screen.set_size(256+32, 256);
+ screen.set_visarea(0, 255+32, 16, 255-16);
+ screen.set_screen_update(FUNC(shangkid_state::screen_update_dynamski));
+ screen.set_palette(m_palette);
+ screen.screen_vblank().set(FUNC(shangkid_state::irq_1_w));
GFXDECODE(config, m_gfxdecode, m_palette, gfx_dynamski);
PALETTE(config, m_palette, FUNC(shangkid_state::dynamski_palette), 16*4 + 16*4, 32);
@@ -508,7 +510,7 @@ MACHINE_CONFIG_START(shangkid_state::dynamski)
SPEAKER(config, "speaker").front_center();
AY8910(config, m_aysnd, 2000000).add_route(ALL_OUTPUTS, "speaker", 0.1);
-MACHINE_CONFIG_END
+}
/***************************************************************************************/
diff --git a/src/mame/drivers/shaolins.cpp b/src/mame/drivers/shaolins.cpp
index a5ef43474c1..e9577900407 100644
--- a/src/mame/drivers/shaolins.cpp
+++ b/src/mame/drivers/shaolins.cpp
@@ -37,8 +37,8 @@ void shaolins_state::shaolins_map(address_map &map)
map(0x0000, 0x0000).w(FUNC(shaolins_state::nmi_w)); /* bit 0 = flip screen, bit 1 = nmi enable, bit 2 = ? */
/* bit 3, bit 4 = coin counters */
map(0x0100, 0x0100).w("watchdog", FUNC(watchdog_timer_device::reset_w));
- map(0x0300, 0x0300).w("sn1", FUNC(sn76489a_device::command_w)); /* trigger chip to read from latch. The program always */
- map(0x0400, 0x0400).w("sn2", FUNC(sn76489a_device::command_w)); /* writes the same number as the latch, so we don't */
+ map(0x0300, 0x0300).w("sn1", FUNC(sn76489a_device::write)); /* trigger chip to read from latch. The program always */
+ map(0x0400, 0x0400).w("sn2", FUNC(sn76489a_device::write)); /* writes the same number as the latch, so we don't */
/* bother emulating them. */
map(0x0500, 0x0500).portr("DSW1");
map(0x0600, 0x0600).portr("DSW2");
@@ -193,22 +193,22 @@ static GFXDECODE_START( gfx_shaolins )
GFXDECODE_END
-MACHINE_CONFIG_START(shaolins_state::shaolins)
-
+void shaolins_state::shaolins(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", MC6809E, MASTER_CLOCK/12) /* verified on pcb */
- MCFG_DEVICE_PROGRAM_MAP(shaolins_map)
- MCFG_TIMER_DRIVER_ADD_SCANLINE("scantimer", shaolins_state, interrupt, "screen", 0, 1)
+ MC6809E(config, m_maincpu, MASTER_CLOCK/12); /* verified on pcb */
+ m_maincpu->set_addrmap(AS_PROGRAM, &shaolins_state::shaolins_map);
+ TIMER(config, "scantimer").configure_scanline(FUNC(shaolins_state::interrupt), "screen", 0, 1);
WATCHDOG_TIMER(config, "watchdog");
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(32*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(shaolins_state, screen_update)
- MCFG_SCREEN_PALETTE(m_palette)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(32*8, 32*8);
+ screen.set_visarea(0*8, 32*8-1, 2*8, 30*8-1);
+ screen.set_screen_update(FUNC(shaolins_state::screen_update));
+ screen.set_palette(m_palette);
GFXDECODE(config, m_gfxdecode, m_palette, gfx_shaolins);
PALETTE(config, m_palette, FUNC(shaolins_state::shaolins_palette), 16*8*16+16*8*16, 256);
@@ -216,23 +216,20 @@ MACHINE_CONFIG_START(shaolins_state::shaolins)
/* sound hardware */
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("sn1", SN76489A, MASTER_CLOCK/12) /* verified on pcb */
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
+ SN76489A(config, "sn1", MASTER_CLOCK/12).add_route(ALL_OUTPUTS, "mono", 1.0); /* verified on pcb */
- MCFG_DEVICE_ADD("sn2", SN76489A, MASTER_CLOCK/6) /* verified on pcb */
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
-MACHINE_CONFIG_END
+ SN76489A(config, "sn2", MASTER_CLOCK/6).add_route(ALL_OUTPUTS, "mono", 1.0); /* verified on pcb */
+}
#if 0 // a bootleg board was found with downgraded sound hardware, but is otherwise the same
-static MACHINE_CONFIG_START( shaolinb )
+void shaolins_state::shaolinb(machine_config &config)
+{
shaolins(config);
- MCFG_DEVICE_REPLACE("sn1", SN76489, MASTER_CLOCK/12) /* only type verified on pcb */
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
+ SN76489(config.replace(), "sn1", MASTER_CLOCK/12).add_route(ALL_OUTPUTS, "mono", 1.0); /* only type verified on pcb */
- MCFG_DEVICE_REPLACE("sn2", SN76489, MASTER_CLOCK/6) /* only type verified on pcb */
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
-MACHINE_CONFIG_END
+ SN76489(config.replace(), "sn2", MASTER_CLOCK/6).add_route(ALL_OUTPUTS, "mono", 1.0);
+}
#endif
/***************************************************************************
diff --git a/src/mame/drivers/shine.cpp b/src/mame/drivers/shine.cpp
index 0831440d68f..d5176110ac4 100644
--- a/src/mame/drivers/shine.cpp
+++ b/src/mame/drivers/shine.cpp
@@ -228,7 +228,8 @@ void shine_state::machine_start()
}
-MACHINE_CONFIG_START(shine_state::shine)
+void shine_state::shine(machine_config &config)
+{
/* basic machine hardware */
M6502(config, m_maincpu, 2000000); // 2MHz ??
m_maincpu->set_addrmap(AS_PROGRAM, &shine_state::shine_mem);
@@ -236,9 +237,10 @@ MACHINE_CONFIG_START(shine_state::shine)
INPUT_MERGER_ANY_HIGH(config, "irqs").output_handler().set_inputline("maincpu", M6502_IRQ_LINE);
/* video hardware */
- MCFG_SCREEN_MC6847_PAL_ADD("screen", "vdg")
+ SCREEN(config, "screen", SCREEN_TYPE_RASTER);
- MC6847_NTSC(config, m_vdg, 3.579545_MHz_XTAL);
+ MC6847_NTSC(config, m_vdg, 3.579545_MHz_XTAL); // or really PAL?
+ m_vdg->set_screen("screen");
m_vdg->input_callback().set(FUNC(shine_state::vdg_videoram_r));
m_vdg->set_black_and_white(true);
@@ -267,7 +269,7 @@ MACHINE_CONFIG_START(shine_state::shine)
auto &cassette(CASSETTE(config, "cassette"));
cassette.set_default_state(CASSETTE_STOPPED | CASSETTE_MOTOR_ENABLED | CASSETTE_SPEAKER_MUTED);
-MACHINE_CONFIG_END
+}
ROM_START( shine )
diff --git a/src/mame/drivers/shisen.cpp b/src/mame/drivers/shisen.cpp
index 3e6fecca5a9..e4e91e6e2ea 100644
--- a/src/mame/drivers/shisen.cpp
+++ b/src/mame/drivers/shisen.cpp
@@ -213,32 +213,32 @@ GFXDECODE_END
-MACHINE_CONFIG_START(shisen_state::shisen)
-
+void shisen_state::shisen(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, 6000000) /* 6 MHz ? */
- MCFG_DEVICE_PROGRAM_MAP(shisen_map)
- MCFG_DEVICE_IO_MAP(shisen_io_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", shisen_state, irq0_line_hold)
-
- MCFG_DEVICE_ADD("soundcpu", Z80, 3579645)
- MCFG_DEVICE_PROGRAM_MAP(shisen_sound_map)
- MCFG_DEVICE_IO_MAP(shisen_sound_io_map)
- MCFG_DEVICE_PERIODIC_INT_DRIVER(shisen_state, nmi_line_pulse, 128*55) /* clocked by V1? (Vigilante) */
+ Z80(config, m_maincpu, 6000000); /* 6 MHz ? */
+ m_maincpu->set_addrmap(AS_PROGRAM, &shisen_state::shisen_map);
+ m_maincpu->set_addrmap(AS_IO, &shisen_state::shisen_io_map);
+ m_maincpu->set_vblank_int("screen", FUNC(shisen_state::irq0_line_hold));
+
+ z80_device &soundcpu(Z80(config, "soundcpu", 3579645));
+ soundcpu.set_addrmap(AS_PROGRAM, &shisen_state::shisen_sound_map);
+ soundcpu.set_addrmap(AS_IO, &shisen_state::shisen_sound_io_map);
+ soundcpu.set_periodic_int(FUNC(shisen_state::nmi_line_pulse), attotime::from_hz(128*55)); /* clocked by V1? (Vigilante) */
/* IRQs are generated by main Z80 and YM2151 */
- MCFG_DEVICE_IRQ_ACKNOWLEDGE_DEVICE("soundirq", rst_neg_buffer_device, inta_cb)
+ soundcpu.set_irq_acknowledge_callback("soundirq", FUNC(rst_neg_buffer_device::inta_cb));
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(55)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(64*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 64*8-1, 0*8, 32*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(shisen_state, screen_update)
- MCFG_SCREEN_PALETTE("palette")
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(55);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(64*8, 32*8);
+ screen.set_visarea(0*8, 64*8-1, 0*8, 32*8-1);
+ screen.set_screen_update(FUNC(shisen_state::screen_update));
+ screen.set_palette(m_palette);
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_shisen)
- MCFG_PALETTE_ADD("palette", 256)
+ GFXDECODE(config, m_gfxdecode, m_palette, gfx_shisen);
+ PALETTE(config, m_palette).set_entries(256);
/* sound hardware */
SPEAKER(config, "lspeaker").front_left();
@@ -250,17 +250,18 @@ MACHINE_CONFIG_START(shisen_state::shisen)
RST_NEG_BUFFER(config, "soundirq", 0).int_callback().set_inputline("soundcpu", 0);
- MCFG_DEVICE_ADD("m72", IREM_M72_AUDIO)
+ IREM_M72_AUDIO(config, m_audio);
ym2151_device &ymsnd(YM2151(config, "ymsnd", 3579545));
ymsnd.irq_handler().set("soundirq", FUNC(rst_neg_buffer_device::rst28_w));
ymsnd.add_route(0, "lspeaker", 0.5);
ymsnd.add_route(1, "rspeaker", 0.5);
- MCFG_DEVICE_ADD("dac", DAC_8BIT_R2R, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 0.25) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 0.25) // unknown DAC
- MCFG_DEVICE_ADD("vref", VOLTAGE_REGULATOR, 0) MCFG_VOLTAGE_REGULATOR_OUTPUT(5.0)
- MCFG_SOUND_ROUTE(0, "dac", 1.0, DAC_VREF_POS_INPUT) MCFG_SOUND_ROUTE(0, "dac", -1.0, DAC_VREF_NEG_INPUT)
-MACHINE_CONFIG_END
+ DAC_8BIT_R2R(config, "dac", 0).add_route(ALL_OUTPUTS, "lspeaker", 0.25).add_route(ALL_OUTPUTS, "rspeaker", 0x25); // unknown DAC
+ voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref"));
+ vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT);
+ vref.add_route(0, "dac", -1.0, DAC_VREF_NEG_INPUT);
+}
diff --git a/src/mame/drivers/shootaway2.cpp b/src/mame/drivers/shootaway2.cpp
index 327e25ef62b..69cc2c03424 100644
--- a/src/mame/drivers/shootaway2.cpp
+++ b/src/mame/drivers/shootaway2.cpp
@@ -81,24 +81,24 @@ void m74_state::sub_map(address_map &map)
static INPUT_PORTS_START( m74 )
INPUT_PORTS_END
-MACHINE_CONFIG_START(m74_state::m74)
- MCFG_DEVICE_ADD("maincpu", M37450, XTAL(8'000'000)) /* C68 @ 8.0MHz - main CPU */
- MCFG_DEVICE_PROGRAM_MAP(c68_map)
+void m74_state::m74(machine_config &config)
+{
+ M37450(config, m_maincpu, XTAL(8'000'000)); /* C68 @ 8.0MHz - main CPU */
+ m_maincpu->set_addrmap(AS_PROGRAM, &m74_state::c68_map);
- MCFG_DEVICE_ADD("subcpu", TMPZ84C011, XTAL(12'000'000) / 3) /* Z84C011 @ 4 MHz - sub CPU */
- MCFG_DEVICE_PROGRAM_MAP(sub_map)
+ TMPZ84C011(config, m_subcpu, XTAL(12'000'000) / 3); /* Z84C011 @ 4 MHz - sub CPU */
+ m_subcpu->set_addrmap(AS_PROGRAM, &m74_state::sub_map);
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */)
- MCFG_SCREEN_UPDATE_DRIVER(m74_state, screen_update)
- MCFG_SCREEN_SIZE(320, 240)
- MCFG_SCREEN_VISIBLE_AREA(0, 319, 0, 239)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500) /* not accurate */);
+ screen.set_screen_update(FUNC(m74_state::screen_update));
+ screen.set_size(320, 240);
+ screen.set_visarea(0, 319, 0, 239);
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("oki", OKIM6295, XTAL(1'000'000), okim6295_device::PIN7_HIGH)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
-MACHINE_CONFIG_END
+ OKIM6295(config, "oki", XTAL(1'000'000), okim6295_device::PIN7_HIGH).add_route(ALL_OUTPUTS, "mono", 1.0);
+}
ROM_START(shootaw2)
ROM_REGION(0x20000, "maincpu", 0) /* C68 / M37450 program ROM */
diff --git a/src/mame/drivers/shootout.cpp b/src/mame/drivers/shootout.cpp
index 63f4cd949b9..32193741630 100644
--- a/src/mame/drivers/shootout.cpp
+++ b/src/mame/drivers/shootout.cpp
@@ -276,25 +276,23 @@ void shootout_state::machine_reset ()
m_ccnt_old_val = 0x40;
}
-MACHINE_CONFIG_START(shootout_state::shootout)
-
+void shootout_state::shootout(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", DECO_222, XTAL(12'000'000) / 6) // 2 MHz?
- MCFG_DEVICE_PROGRAM_MAP(shootout_map)
+ DECO_222(config, m_maincpu, XTAL(12'000'000) / 6); // 2 MHz?
+ m_maincpu->set_addrmap(AS_PROGRAM, &shootout_state::shootout_map);
- MCFG_DEVICE_ADD("audiocpu", M6502, XTAL(12'000'000) / 8) // 1.5 MHz
- MCFG_DEVICE_PROGRAM_MAP(shootout_sound_map)
+ M6502(config, m_audiocpu, XTAL(12'000'000) / 8); // 1.5 MHz
+ m_audiocpu->set_addrmap(AS_PROGRAM, &shootout_state::shootout_sound_map);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
-
- // Guessed parameters based on the 12 MHz XTAL, but they seem resonable (TODO: Real PCB measurements)
- MCFG_SCREEN_RAW_PARAMS (XTAL(12'000'000) / 2, 384, 0, 256, 262, 8, 248)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ // Guessed parameters based on the 12 MHz XTAL, but they seem reasonable (TODO: Real PCB measurements)
+ screen.set_raw(XTAL(12'000'000) / 2, 384, 0, 256, 262, 8, 248);
+ screen.set_screen_update(FUNC(shootout_state::screen_update_shootout));
+ screen.set_palette(m_palette);
- MCFG_SCREEN_UPDATE_DRIVER(shootout_state, screen_update_shootout)
- MCFG_SCREEN_PALETTE(m_palette)
-
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, m_palette, gfx_shootout)
+ GFXDECODE(config, m_gfxdecode, m_palette, gfx_shootout);
PALETTE(config, m_palette, FUNC(shootout_state::shootout_palette), 256);
/* sound hardware */
@@ -305,25 +303,23 @@ MACHINE_CONFIG_START(shootout_state::shootout)
ym2203_device &ymsnd(YM2203(config, "ymsnd", XTAL(12'000'000) / 8)); // 1.5 MHz
ymsnd.irq_handler().set_inputline(m_audiocpu, M6502_IRQ_LINE);
ymsnd.add_route(ALL_OUTPUTS, "mono", 1.00);
-MACHINE_CONFIG_END
-
+}
-MACHINE_CONFIG_START(shootout_state::shootouj)
+void shootout_state::shootouj(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M6502, XTAL(12'000'000) / 6) // 2 MHz? (Assuming the same XTAL as DE-0219 pcb)
- MCFG_DEVICE_PROGRAM_MAP(shootouj_map)
+ M6502(config, m_maincpu, XTAL(12'000'000) / 6); // 2 MHz? (Assuming the same XTAL as DE-0219 pcb)
+ m_maincpu->set_addrmap(AS_PROGRAM, &shootout_state::shootouj_map);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
-
- // Guessed parameters based on the 12 MHz XTAL, but they seem resonable (TODO: Real PCB measurements)
- MCFG_SCREEN_RAW_PARAMS (XTAL(12'000'000) / 2, 384, 0, 256, 262, 8, 248)
-
- MCFG_SCREEN_UPDATE_DRIVER(shootout_state, screen_update_shootouj)
- MCFG_SCREEN_PALETTE(m_palette)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ // Guessed parameters based on the 12 MHz XTAL, but they seem reasonable (TODO: Real PCB measurements)
+ screen.set_raw (XTAL(12'000'000) / 2, 384, 0, 256, 262, 8, 248);
+ screen.set_screen_update(FUNC(shootout_state::screen_update_shootouj));
+ screen.set_palette(m_palette);
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, m_palette, gfx_shootout)
+ GFXDECODE(config, m_gfxdecode, m_palette, gfx_shootout);
PALETTE(config, m_palette, FUNC(shootout_state::shootout_palette), 256);
/* sound hardware */
@@ -336,15 +332,15 @@ MACHINE_CONFIG_START(shootout_state::shootouj)
ymsnd.port_a_write_callback().set(FUNC(shootout_state::bankswitch_w));
ymsnd.port_b_write_callback().set(FUNC(shootout_state::flipscreen_w));
ymsnd.add_route(ALL_OUTPUTS, "mono", 1.00);
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(shootout_state::shootouk)
+void shootout_state::shootouk(machine_config &config)
+{
shootouj(config);
/* the Korean 'bootleg' has the usual DECO222 style encryption */
- MCFG_DEVICE_REMOVE("maincpu")
- MCFG_DEVICE_ADD("maincpu", DECO_222, XTAL(12'000'000) / 6) // 2 MHz? (Assuming the same XTAL as DE-0219 pcb)
- MCFG_DEVICE_PROGRAM_MAP(shootouj_map)
-MACHINE_CONFIG_END
+ DECO_222(config.replace(), m_maincpu, XTAL(12'000'000) / 6); // 2 MHz? (Assuming the same XTAL as DE-0219 pcb)
+ m_maincpu->set_addrmap(AS_PROGRAM, &shootout_state::shootouj_map);
+}
diff --git a/src/mame/drivers/shougi.cpp b/src/mame/drivers/shougi.cpp
index d6717f9ec28..51928319502 100644
--- a/src/mame/drivers/shougi.cpp
+++ b/src/mame/drivers/shougi.cpp
@@ -182,18 +182,18 @@ void shougi_state::shougi_palette(palette_device &palette) const
bit0 = (color_prom[i] >> 0) & 0x01;
bit1 = (color_prom[i] >> 1) & 0x01;
bit2 = (color_prom[i] >> 2) & 0x01;
- int const r = combine_3_weights(weights_r, bit0, bit1, bit2);
+ int const r = combine_weights(weights_r, bit0, bit1, bit2);
/* green component */
bit0 = (color_prom[i] >> 3) & 0x01;
bit1 = (color_prom[i] >> 4) & 0x01;
bit2 = (color_prom[i] >> 5) & 0x01;
- int const g = combine_3_weights(weights_g, bit0, bit1, bit2);
+ int const g = combine_weights(weights_g, bit0, bit1, bit2);
/* blue component */
bit0 = (color_prom[i] >> 6) & 0x01;
bit1 = (color_prom[i] >> 7) & 0x01;
- int const b = combine_2_weights(weights_b, bit0, bit1);
+ int const b = combine_weights(weights_b, bit0, bit1);
palette.set_pen_color(i,rgb_t(r,g,b));
}
@@ -370,39 +370,39 @@ INTERRUPT_GEN_MEMBER(shougi_state::vblank_nmi)
}
-MACHINE_CONFIG_START(shougi_state::shougi)
-
+void shougi_state::shougi(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, XTAL(10'000'000)/4)
- MCFG_DEVICE_PROGRAM_MAP(main_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", shougi_state, vblank_nmi)
+ Z80(config, m_maincpu, XTAL(10'000'000)/4);
+ m_maincpu->set_addrmap(AS_PROGRAM, &shougi_state::main_map);
+ m_maincpu->set_vblank_int("screen", FUNC(shougi_state::vblank_nmi));
- MCFG_DEVICE_ADD("sub", Z80, XTAL(10'000'000)/4)
- MCFG_DEVICE_PROGRAM_MAP(sub_map)
- MCFG_DEVICE_IO_MAP(readport_sub)
+ Z80(config, m_subcpu, XTAL(10'000'000)/4);
+ m_subcpu->set_addrmap(AS_PROGRAM, &shougi_state::sub_map);
+ m_subcpu->set_addrmap(AS_IO, &shougi_state::readport_sub);
- MCFG_DEVICE_ADD("alpha_8201", ALPHA_8201, XTAL(10'000'000)/4/8)
+ ALPHA_8201(config, m_alpha_8201, XTAL(10'000'000)/4/8);
ls259_device &mainlatch(LS259(config, "mainlatch"));
mainlatch.q_out_cb<0>().set_nop(); // 0: sharedram = sub, 1: sharedram = main (TODO!)
mainlatch.q_out_cb<1>().set(FUNC(shougi_state::nmi_enable_w));
mainlatch.q_out_cb<2>().set_nop(); // ?
- mainlatch.q_out_cb<3>().set("alpha_8201", FUNC(alpha_8201_device::mcu_start_w)); // start/halt ALPHA-8201
- mainlatch.q_out_cb<4>().set("alpha_8201", FUNC(alpha_8201_device::bus_dir_w)).invert(); // ALPHA-8201 shared RAM bus direction: 0: mcu, 1: maincpu
+ mainlatch.q_out_cb<3>().set(m_alpha_8201, FUNC(alpha_8201_device::mcu_start_w)); // start/halt ALPHA-8201
+ mainlatch.q_out_cb<4>().set(m_alpha_8201, FUNC(alpha_8201_device::bus_dir_w)).invert(); // ALPHA-8201 shared RAM bus direction: 0: mcu, 1: maincpu
mainlatch.q_out_cb<7>().set_nop(); // nothing? connected to +5v via resistor
- MCFG_QUANTUM_PERFECT_CPU("maincpu")
+ config.m_perfect_cpu_quantum = subtag("maincpu");
WATCHDOG_TIMER(config, "watchdog").set_vblank_count("screen", 0x10); // assuming it's the same as champbas
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(256, 256)
- MCFG_SCREEN_VISIBLE_AREA(0, 255, 0, 255)
- MCFG_SCREEN_UPDATE_DRIVER(shougi_state, screen_update)
- MCFG_SCREEN_PALETTE("palette")
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(256, 256);
+ screen.set_visarea(0, 255, 0, 255);
+ screen.set_screen_update(FUNC(shougi_state::screen_update));
+ screen.set_palette("palette");
PALETTE(config, "palette", FUNC(shougi_state::shougi_palette), 32);
@@ -410,7 +410,7 @@ MACHINE_CONFIG_START(shougi_state::shougi)
SPEAKER(config, "mono").front_center();
AY8910(config, "aysnd", XTAL(10'000'000)/8).add_route(ALL_OUTPUTS, "mono", 0.30);
-MACHINE_CONFIG_END
+}
diff --git a/src/mame/drivers/shtzone.cpp b/src/mame/drivers/shtzone.cpp
index 9b6df3aa13c..c4f01def3cc 100644
--- a/src/mame/drivers/shtzone.cpp
+++ b/src/mame/drivers/shtzone.cpp
@@ -100,27 +100,26 @@ uint32_t shtzone_state::screen_update_shtzone(screen_device &screen, bitmap_ind1
}
-MACHINE_CONFIG_START(shtzone_state::shtzone)
-
+void shtzone_state::shtzone(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("timercpu", Z80,10738000/4)
- MCFG_DEVICE_PROGRAM_MAP(shtzone_map)
+ z80_device &timercpu(Z80(config, "timercpu", 10738000/4));
+ timercpu.set_addrmap(AS_PROGRAM, &shtzone_state::shtzone_map);
/* + SMS CPU */
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(256, 256)
- MCFG_SCREEN_VISIBLE_AREA(0, 256-1, 0, 256-1)
- MCFG_SCREEN_UPDATE_DRIVER(shtzone_state, screen_update_shtzone)
- MCFG_SCREEN_PALETTE("palette")
-
- MCFG_PALETTE_ADD("palette", 0x100)
-
-MACHINE_CONFIG_END
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(256, 256);
+ screen.set_visarea(0, 256-1, 0, 256-1);
+ screen.set_screen_update(FUNC(shtzone_state::screen_update_shtzone));
+ screen.set_palette("palette");
+
+ PALETTE(config, "palette").set_entries(0x100);
+}
ROM_START( shtzone )
diff --git a/src/mame/drivers/shuuz.cpp b/src/mame/drivers/shuuz.cpp
index ab5126a7880..c89f3e5e5b1 100644
--- a/src/mame/drivers/shuuz.cpp
+++ b/src/mame/drivers/shuuz.cpp
@@ -233,18 +233,18 @@ GFXDECODE_END
*
*************************************/
-MACHINE_CONFIG_START(shuuz_state::shuuz)
-
+void shuuz_state::shuuz(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M68000, ATARI_CLOCK_14MHz/2)
- MCFG_DEVICE_PROGRAM_MAP(main_map)
+ M68000(config, m_maincpu, ATARI_CLOCK_14MHz/2);
+ m_maincpu->set_addrmap(AS_PROGRAM, &shuuz_state::main_map);
EEPROM_2816(config, "eeprom").lock_after_write(true);
WATCHDOG_TIMER(config, "watchdog");
/* video hardware */
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_shuuz)
+ GFXDECODE(config, m_gfxdecode, "palette", gfx_shuuz);
PALETTE(config, "palette").set_format(palette_device::IRGB_1555, 1024);
ATARI_VAD(config, m_vad, 0, m_screen);
@@ -252,20 +252,19 @@ MACHINE_CONFIG_START(shuuz_state::shuuz)
TILEMAP(config, "vad:playfield", m_gfxdecode, 2, 8, 8, TILEMAP_SCAN_COLS, 64, 64).set_info_callback(DEVICE_SELF_OWNER, FUNC(shuuz_state::get_playfield_tile_info));
ATARI_MOTION_OBJECTS(config, "vad:mob", 0, m_screen, shuuz_state::s_mob_config).set_gfxdecode(m_gfxdecode);
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_VIDEO_ATTRIBUTES(VIDEO_UPDATE_BEFORE_VBLANK)
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_video_attributes(VIDEO_UPDATE_BEFORE_VBLANK);
/* note: these parameters are from published specs, not derived */
/* the board uses a VAD chip to generate video signals */
- MCFG_SCREEN_RAW_PARAMS(ATARI_CLOCK_14MHz/2, 456, 0, 336, 262, 0, 240)
- MCFG_SCREEN_UPDATE_DRIVER(shuuz_state, screen_update)
- MCFG_SCREEN_PALETTE("palette")
+ m_screen->set_raw(ATARI_CLOCK_14MHz/2, 456, 0, 336, 262, 0, 240);
+ m_screen->set_screen_update(FUNC(shuuz_state::screen_update));
+ m_screen->set_palette("palette");
/* sound hardware */
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("oki", OKIM6295, ATARI_CLOCK_14MHz/16, okim6295_device::PIN7_HIGH)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
-MACHINE_CONFIG_END
+ OKIM6295(config, "oki", ATARI_CLOCK_14MHz/16, okim6295_device::PIN7_HIGH).add_route(ALL_OUTPUTS, "mono", 1.0);
+}
diff --git a/src/mame/drivers/si5500.cpp b/src/mame/drivers/si5500.cpp
index 8b79ce05677..605466f5a07 100644
--- a/src/mame/drivers/si5500.cpp
+++ b/src/mame/drivers/si5500.cpp
@@ -41,7 +41,7 @@ private:
u8 gpibpsi_input_r(offs_t offset);
DECLARE_WRITE_LINE_MEMBER(gpibc_we_w);
DECLARE_WRITE_LINE_MEMBER(gpibc_dbin_w);
- u8 keypad_r();
+ u8 keypad_r(offs_t offset);
void mem_map(address_map &map);
void cru_map(address_map &map);
@@ -93,7 +93,7 @@ WRITE_LINE_MEMBER(si5500_state::gpibc_we_w)
if (!state)
{
u16 pio = m_gpibpsi->pio_outputs();
- m_gpibc->reg8_w(machine().dummy_space(), (pio >> 8) & 7, pio & 0xff);
+ m_gpibc->write((pio >> 8) & 7, pio & 0xff);
}
}
@@ -102,19 +102,17 @@ WRITE_LINE_MEMBER(si5500_state::gpibc_dbin_w)
if (state)
{
u16 pio = m_gpibpsi->pio_outputs();
- m_gpib_data = m_gpibc->reg8_r(machine().dummy_space(), (pio >> 8) & 7);
+ m_gpib_data = m_gpibc->read((pio >> 8) & 7);
}
}
-u8 si5500_state::keypad_r()
+u8 si5500_state::keypad_r(offs_t offset)
{
- u8 result = 0xff;
-
for (int n = 0; n < 4; n++)
if (!BIT(m_keyplatch->output_state(), n))
- result &= m_keypad[n]->read();
-
- return result;
+ if (!BIT(m_keypad[n]->read(), offset))
+ return 0;
+ return 1;
}
void si5500_state::mem_map(address_map &map)
@@ -125,28 +123,19 @@ void si5500_state::mem_map(address_map &map)
void si5500_state::cru_map(address_map &map)
{
- // MAME currently has incompatible addressing for CRU reads and writes
- map(0x00, 0x03).r(m_mainpsi, FUNC(tms9901_device::read));
- map(0x08, 0x0b).r("acc", FUNC(tms9902_device::cruread));
- map(0x0c, 0x0f).r("adpsi", FUNC(tms9901_device::read));
- map(0x16, 0x16).nopr();
- map(0x17, 0x17).r(FUNC(si5500_state::keypad_r));
- map(0x40, 0x43).r("nvrpsi", FUNC(tms9901_device::read));
- map(0x44, 0x47).r(m_gpibpsi, FUNC(tms9901_device::read));
- map(0x80, 0xff).r("novram", FUNC(x2201_device::read_byte));
-
- map(0x000, 0x01f).w(m_mainpsi, FUNC(tms9901_device::write));
- map(0x040, 0x05f).w("acc", FUNC(tms9902_device::cruwrite));
- map(0x060, 0x07f).w("adpsi", FUNC(tms9901_device::write));
- map(0x080, 0x087).w("outlatch1", FUNC(ls259_device::write_d0));
- map(0x088, 0x08f).w("outlatch2", FUNC(ls259_device::write_d0));
- map(0x090, 0x097).w("outlatch3", FUNC(ls259_device::write_d0));
- map(0x0a0, 0x0a7).w("outlatch4", FUNC(ls259_device::write_d0));
- map(0x0a8, 0x0af).w("outlatch5", FUNC(ls259_device::write_d0));
- map(0x0b0, 0x0bf).w(m_keyplatch, FUNC(ls259_device::write_d0));
- map(0x200, 0x21f).w("nvrpsi", FUNC(tms9901_device::write));
- map(0x220, 0x23f).w(m_gpibpsi, FUNC(tms9901_device::write));
- map(0x400, 0x7ff).w("novram", FUNC(x2201_device::write));
+ map(0x0000, 0x003f).rw(m_mainpsi, FUNC(tms9901_device::read), FUNC(tms9901_device::write));
+ map(0x0080, 0x00bf).rw("acc", FUNC(tms9902_device::cruread), FUNC(tms9902_device::cruwrite));
+ map(0x00c0, 0x00ff).rw("adpsi", FUNC(tms9901_device::read), FUNC(tms9901_device::write));
+ map(0x0100, 0x010f).w("outlatch1", FUNC(ls259_device::write_d0));
+ map(0x0110, 0x011f).w("outlatch2", FUNC(ls259_device::write_d0));
+ map(0x0120, 0x012f).w("outlatch3", FUNC(ls259_device::write_d0));
+ map(0x0140, 0x014f).w("outlatch4", FUNC(ls259_device::write_d0));
+ map(0x0150, 0x015f).w("outlatch5", FUNC(ls259_device::write_d0));
+ map(0x0160, 0x016f).w(m_keyplatch, FUNC(ls259_device::write_d0)).nopr();
+ map(0x0170, 0x017f).r(FUNC(si5500_state::keypad_r));
+ map(0x0400, 0x043f).rw("nvrpsi", FUNC(tms9901_device::read), FUNC(tms9901_device::write));
+ map(0x0440, 0x047f).rw(m_gpibpsi, FUNC(tms9901_device::read), FUNC(tms9901_device::write));
+ map(0x0800, 0x0fff).rw("novram", FUNC(x2201_device::read), FUNC(x2201_device::write));
}
static INPUT_PORTS_START(si5500)
diff --git a/src/mame/drivers/sigmab52.cpp b/src/mame/drivers/sigmab52.cpp
index a41586aeaa8..be2c9b164b4 100644
--- a/src/mame/drivers/sigmab52.cpp
+++ b/src/mame/drivers/sigmab52.cpp
@@ -575,14 +575,14 @@ void sigmab52_state::machine_reset()
* Machine Drivers *
*************************/
-MACHINE_CONFIG_START(sigmab52_state::jwildb52)
-
+void sigmab52_state::jwildb52(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", MC6809, XTAL(8'000'000))
- MCFG_DEVICE_PROGRAM_MAP(jwildb52_map)
+ MC6809(config, m_maincpu, XTAL(8'000'000));
+ m_maincpu->set_addrmap(AS_PROGRAM, &sigmab52_state::jwildb52_map);
- MCFG_DEVICE_ADD("audiocpu", MC6809, XTAL(8'000'000))
- MCFG_DEVICE_PROGRAM_MAP(sound_prog_map)
+ MC6809(config, m_audiocpu, XTAL(8'000'000));
+ m_audiocpu->set_addrmap(AS_PROGRAM, &sigmab52_state::sound_prog_map);
ptm6840_device &ptm1(PTM6840(config, "6840ptm_1", XTAL(8'000'000) / 8)); // FIXME
ptm1.irq_callback().set_inputline("maincpu", M6809_IRQ_LINE);
@@ -592,27 +592,25 @@ MACHINE_CONFIG_START(sigmab52_state::jwildb52)
NVRAM(config, "nvram", nvram_device::DEFAULT_NONE);
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(1024, 1024)
- MCFG_SCREEN_VISIBLE_AREA(0, 544-1, 0, 436-1)
- MCFG_SCREEN_UPDATE_DEVICE("hd63484", hd63484_device, update_screen)
- MCFG_SCREEN_PALETTE("palette")
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(1024, 1024);
+ screen.set_visarea(0, 544-1, 0, 436-1);
+ screen.set_screen_update("hd63484", FUNC(hd63484_device::update_screen));
+ screen.set_palette(m_palette);
- MCFG_HD63484_ADD("hd63484", XTAL(8'000'000), jwildb52_hd63484_map)
+ HD63484(config, "hd63484", XTAL(8'000'000)).set_addrmap(0, &sigmab52_state::jwildb52_hd63484_map);
- MCFG_PALETTE_ADD("palette", 16)
+ PALETTE(config, m_palette).set_entries(16);
/* sound hardware */
SPEAKER(config, "mono").front_center();
GENERIC_LATCH_8(config, "soundlatch");
- MCFG_DEVICE_ADD("ymsnd", YM3812, XTAL(3'579'545))
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
-
-MACHINE_CONFIG_END
+ YM3812(config, "ymsnd", XTAL(3'579'545)).add_route(ALL_OUTPUTS, "mono", 1.0);
+}
/*************************
diff --git a/src/mame/drivers/sigmab98.cpp b/src/mame/drivers/sigmab98.cpp
index f752e4e9c1b..d42c03ae818 100644
--- a/src/mame/drivers/sigmab98.cpp
+++ b/src/mame/drivers/sigmab98.cpp
@@ -2841,27 +2841,28 @@ INTERRUPT_GEN_MEMBER(sigmab98_state::sigmab98_vblank_interrupt)
device.execute().set_input_line_and_vector(0, HOLD_LINE, 0x5a);
}
-MACHINE_CONFIG_START(sigmab98_state::sigmab98)
- MCFG_DEVICE_ADD("maincpu", Z80, 10000000) // !! TAXAN KY-80, clock @X1? !!
- MCFG_DEVICE_PROGRAM_MAP(gegege_mem_map)
- MCFG_DEVICE_IO_MAP(gegege_io_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", sigmab98_state, sigmab98_vblank_interrupt)
+void sigmab98_state::sigmab98(machine_config &config)
+{
+ Z80(config, m_maincpu, 10000000); // !! TAXAN KY-80, clock @X1? !!
+ m_maincpu->set_addrmap(AS_PROGRAM, &sigmab98_state::gegege_mem_map);
+ m_maincpu->set_addrmap(AS_IO, &sigmab98_state::gegege_io_map);
+ m_maincpu->set_vblank_int("screen", FUNC(sigmab98_state::sigmab98_vblank_interrupt));
MCFG_MACHINE_RESET_OVERRIDE(sigmab98_state, sigmab98)
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
EEPROM_93C46_16BIT(config, "eeprom");
- MCFG_TICKET_DISPENSER_ADD("hopper", attotime::from_msec(200), TICKET_MOTOR_ACTIVE_LOW, TICKET_STATUS_ACTIVE_LOW )
+ TICKET_DISPENSER(config, m_hopper, attotime::from_msec(200), TICKET_MOTOR_ACTIVE_LOW, TICKET_STATUS_ACTIVE_LOW );
// video hardware
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60) // ?
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) // game reads vblank state
- MCFG_SCREEN_SIZE(0x140, 0x100)
- MCFG_SCREEN_VISIBLE_AREA(0,0x140-1, 0,0xf0-1)
- MCFG_SCREEN_UPDATE_DRIVER(sigmab98_state, screen_update_sigmab98)
- MCFG_SCREEN_PALETTE(m_palette)
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_refresh_hz(60); // ?
+ m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(2500) /* not accurate */); // game reads vblank state
+ m_screen->set_size(0x140, 0x100);
+ m_screen->set_visarea(0,0x140-1, 0,0xf0-1);
+ m_screen->set_screen_update(FUNC(sigmab98_state::screen_update_sigmab98));
+ m_screen->set_palette(m_palette);
GFXDECODE(config, m_gfxdecode, m_palette, gfx_sigmab98);
PALETTE(config, m_palette).set_format(palette_device::xRGB_555, 0x1000 + 1);
@@ -2873,33 +2874,36 @@ MACHINE_CONFIG_START(sigmab98_state::sigmab98)
SPEAKER(config, "lspeaker").front_left();
SPEAKER(config, "rspeaker").front_right();
- MCFG_DEVICE_ADD("ymz", YMZ280B, 16934400) // clock @X2?
- MCFG_SOUND_ROUTE(0, "lspeaker", 1.0)
- MCFG_SOUND_ROUTE(1, "rspeaker", 1.0)
-MACHINE_CONFIG_END
+ ymz280b_device &ymz(YMZ280B(config, "ymz", 16934400)); // clock @X2?
+ ymz.add_route(0, "lspeaker", 1.0);
+ ymz.add_route(1, "rspeaker", 1.0);
+}
-MACHINE_CONFIG_START(sigmab98_state::dodghero)
+void sigmab98_state::dodghero(machine_config &config)
+{
sigmab98(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP( dodghero_mem_map )
- MCFG_DEVICE_IO_MAP( dodghero_io_map )
-MACHINE_CONFIG_END
-MACHINE_CONFIG_START(sigmab98_state::gegege)
+ m_maincpu->set_addrmap(AS_PROGRAM, &sigmab98_state::dodghero_mem_map);
+ m_maincpu->set_addrmap(AS_IO, &sigmab98_state::dodghero_io_map);
+}
+
+void sigmab98_state::gegege(machine_config &config)
+{
sigmab98(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP( gegege_mem_map )
- MCFG_DEVICE_IO_MAP( gegege_io_map )
-MACHINE_CONFIG_END
-MACHINE_CONFIG_START(sigmab98_state::dashhero)
+ m_maincpu->set_addrmap(AS_PROGRAM, &sigmab98_state::gegege_mem_map);
+ m_maincpu->set_addrmap(AS_IO, &sigmab98_state::gegege_io_map);
+}
+
+void sigmab98_state::dashhero(machine_config &config)
+{
sigmab98(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP( gegege_mem_map )
- MCFG_DEVICE_IO_MAP( dashhero_io_map )
- MCFG_DEVICE_REMOVE("nvram") // FIXME: does not survive between sessions otherwise
-MACHINE_CONFIG_END
+ m_maincpu->set_addrmap(AS_PROGRAM, &sigmab98_state::gegege_mem_map);
+ m_maincpu->set_addrmap(AS_IO, &sigmab98_state::dashhero_io_map);
+
+ config.device_remove("nvram"); // FIXME: does not survive between sessions otherwise
+}
/***************************************************************************
@@ -2924,19 +2928,20 @@ TIMER_DEVICE_CALLBACK_MEMBER(lufykzku_state::lufykzku_irq)
m_maincpu->set_input_line_and_vector(0, HOLD_LINE, m_timer1_vector); // this needs to be called often or the state of the door is not read at boot (at least 5 times before bb9 is called)
}
-MACHINE_CONFIG_START(lufykzku_state::lufykzku)
- MCFG_DEVICE_ADD("maincpu", Z80, XTAL(20'000'000) / 2) // !! TAXAN KY-80, clock @X1? !!
- MCFG_DEVICE_PROGRAM_MAP(lufykzku_mem_map)
- MCFG_DEVICE_IO_MAP(lufykzku_io_map)
- MCFG_TIMER_DRIVER_ADD_SCANLINE("scantimer", lufykzku_state, lufykzku_irq, "screen", 0, 1)
+void lufykzku_state::lufykzku(machine_config &config)
+{
+ Z80(config, m_maincpu, XTAL(20'000'000) / 2); // !! TAXAN KY-80, clock @X1? !!
+ m_maincpu->set_addrmap(AS_PROGRAM, &lufykzku_state::lufykzku_mem_map);
+ m_maincpu->set_addrmap(AS_IO, &lufykzku_state::lufykzku_io_map);
+ TIMER(config, "scantimer").configure_scanline(FUNC(lufykzku_state::lufykzku_irq), "screen", 0, 1);
MCFG_MACHINE_RESET_OVERRIDE(lufykzku_state, lufykzku)
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0); // battery backed RAM
// No EEPROM
- MCFG_DEVICE_ADD("watchdog_mb3773", MB3773, 0)
- MCFG_TICKET_DISPENSER_ADD("hopper", attotime::from_msec(200), TICKET_MOTOR_ACTIVE_LOW, TICKET_STATUS_ACTIVE_LOW )
+ MB3773(config, m_watchdog, 0);
+ TICKET_DISPENSER(config, m_hopper, attotime::from_msec(200), TICKET_MOTOR_ACTIVE_LOW, TICKET_STATUS_ACTIVE_LOW );
// 2 x 8-bit parallel/serial converters
TTL165(config, m_dsw_shifter[0]);
@@ -2948,13 +2953,13 @@ MACHINE_CONFIG_START(lufykzku_state::lufykzku)
m_dsw_shifter[1]->qh_callback().set(FUNC(lufykzku_state::dsw_w));
// video hardware
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60) // ?
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) // game reads vblank state
- MCFG_SCREEN_SIZE(0x140, 0x100)
- MCFG_SCREEN_VISIBLE_AREA(0,0x140-1, 0,0xf0-1)
- MCFG_SCREEN_UPDATE_DRIVER(sigmab98_state, screen_update_sigmab98)
- MCFG_SCREEN_PALETTE(m_palette)
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_refresh_hz(60); // ?
+ m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(2500) /* not accurate */); // game reads vblank state
+ m_screen->set_size(0x140, 0x100);
+ m_screen->set_visarea(0,0x140-1, 0,0xf0-1);
+ m_screen->set_screen_update(FUNC(sigmab98_state::screen_update_sigmab98));
+ m_screen->set_palette(m_palette);
GFXDECODE(config, m_gfxdecode, m_palette, gfx_lufykzku);
PALETTE(config, m_palette).set_format(palette_device::xRGB_555, 0x1000 + 1);
@@ -2965,10 +2970,10 @@ MACHINE_CONFIG_START(lufykzku_state::lufykzku)
// sound hardware
SPEAKER(config, "lspeaker").front_left();
SPEAKER(config, "rspeaker").front_right();
- MCFG_DEVICE_ADD("oki", OKIM9810, XTAL(4'096'000))
- MCFG_SOUND_ROUTE(0, "lspeaker", 0.80)
- MCFG_SOUND_ROUTE(1, "rspeaker", 0.80)
-MACHINE_CONFIG_END
+ okim9810_device &oki(OKIM9810(config, "oki", XTAL(4'096'000)));
+ oki.add_route(0, "lspeaker", 0.80);
+ oki.add_route(1, "rspeaker", 0.80);
+}
/***************************************************************************
@@ -2994,30 +2999,32 @@ TIMER_DEVICE_CALLBACK_MEMBER(sigmab98_state::sammymdl_irq)
m_maincpu->set_input_line_and_vector(0, HOLD_LINE, m_timer1_vector);
}
-MACHINE_CONFIG_START(sigmab98_state::sammymdl)
- MCFG_DEVICE_ADD("maincpu", Z80, XTAL(20'000'000) / 2) // !! KL5C80A120FP @ 10MHz? (actually 4 times faster than Z80) !!
- MCFG_DEVICE_PROGRAM_MAP( animalc_map )
- MCFG_DEVICE_IO_MAP( animalc_io )
- MCFG_TIMER_DRIVER_ADD_SCANLINE("scantimer", sigmab98_state, sammymdl_irq, "screen", 0, 1)
+void sigmab98_state::sammymdl(machine_config &config)
+{
+ Z80(config, m_maincpu, XTAL(20'000'000) / 2); // !! KL5C80A120FP @ 10MHz? (actually 4 times faster than Z80) !!
+ m_maincpu->set_addrmap(AS_PROGRAM, &sigmab98_state::animalc_map);
+ m_maincpu->set_addrmap(AS_IO, &sigmab98_state::animalc_io);
+
+ TIMER(config, "scantimer").configure_scanline(FUNC(sigmab98_state::sammymdl_irq), "screen", 0, 1);
MCFG_MACHINE_RESET_OVERRIDE(sigmab98_state, sammymdl )
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0); // battery backed RAM
EEPROM_93C46_8BIT(config, "eeprom");
- MCFG_TICKET_DISPENSER_ADD("hopper", attotime::from_msec(200), TICKET_MOTOR_ACTIVE_LOW, TICKET_STATUS_ACTIVE_LOW )
+ TICKET_DISPENSER(config, m_hopper, attotime::from_msec(200), TICKET_MOTOR_ACTIVE_LOW, TICKET_STATUS_ACTIVE_LOW );
WATCHDOG_TIMER(config, "watchdog");
// video hardware
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60) // ?
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) // game reads vblank state
- MCFG_SCREEN_SIZE(0x140, 0x100)
- MCFG_SCREEN_VISIBLE_AREA(0, 0x140-1, 0, 0xf0-1)
- MCFG_SCREEN_UPDATE_DRIVER(sigmab98_state, screen_update_sigmab98)
- MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE(*this, sigmab98_state, screen_vblank_sammymdl))
- MCFG_SCREEN_PALETTE(m_palette)
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_refresh_hz(60); // ?
+ m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(2500) /* not accurate */); // game reads vblank state
+ m_screen->set_size(0x140, 0x100);
+ m_screen->set_visarea(0, 0x140-1, 0, 0xf0-1);
+ m_screen->set_screen_update(FUNC(sigmab98_state::screen_update_sigmab98));
+ m_screen->screen_vblank().set(FUNC(sigmab98_state::screen_vblank_sammymdl));
+ m_screen->set_palette(m_palette);
GFXDECODE(config, m_gfxdecode, m_palette, gfx_sigmab98);
PALETTE(config, m_palette).set_format(palette_device::xRGB_555, 0x1000 + 1);
@@ -3029,59 +3036,64 @@ MACHINE_CONFIG_START(sigmab98_state::sammymdl)
SPEAKER(config, "lspeaker").front_left();
SPEAKER(config, "rspeaker").front_right();
- MCFG_DEVICE_ADD("oki", OKIM9810, XTAL(4'096'000))
- MCFG_SOUND_ROUTE(0, "lspeaker", 0.80)
- MCFG_SOUND_ROUTE(1, "rspeaker", 0.80)
-MACHINE_CONFIG_END
+ okim9810_device &oki(OKIM9810(config, "oki", XTAL(4'096'000)));
+ oki.add_route(0, "lspeaker", 0.80);
+ oki.add_route(1, "rspeaker", 0.80);
+}
-MACHINE_CONFIG_START(sigmab98_state::animalc)
+void sigmab98_state::animalc(machine_config &config)
+{
sammymdl(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP( animalc_map )
- MCFG_DEVICE_IO_MAP( animalc_io )
-MACHINE_CONFIG_END
-MACHINE_CONFIG_START(sigmab98_state::gocowboy)
+ m_maincpu->set_addrmap(AS_PROGRAM, &sigmab98_state::animalc_map);
+ m_maincpu->set_addrmap(AS_IO, &sigmab98_state::animalc_io);
+}
+
+void sigmab98_state::gocowboy(machine_config &config)
+{
sammymdl(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP( gocowboy_map )
- MCFG_DEVICE_IO_MAP( gocowboy_io )
- MCFG_DEVICE_REMOVE("hopper")
- MCFG_TICKET_DISPENSER_ADD("hopper_small", attotime::from_msec(1000), TICKET_MOTOR_ACTIVE_LOW, TICKET_STATUS_ACTIVE_LOW )
- MCFG_TICKET_DISPENSER_ADD("hopper_large", attotime::from_msec(1000), TICKET_MOTOR_ACTIVE_LOW, TICKET_STATUS_ACTIVE_LOW )
-MACHINE_CONFIG_END
+ m_maincpu->set_addrmap(AS_PROGRAM, &sigmab98_state::gocowboy_map);
+ m_maincpu->set_addrmap(AS_IO, &sigmab98_state::gocowboy_io);
+
+ config.device_remove("hopper");
+ TICKET_DISPENSER(config, m_hopper_small, attotime::from_msec(1000), TICKET_MOTOR_ACTIVE_LOW, TICKET_STATUS_ACTIVE_LOW );
+ TICKET_DISPENSER(config, m_hopper_large, attotime::from_msec(1000), TICKET_MOTOR_ACTIVE_LOW, TICKET_STATUS_ACTIVE_LOW );
+}
-MACHINE_CONFIG_START(sigmab98_state::haekaka)
+void sigmab98_state::haekaka(machine_config &config)
+{
sammymdl(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP( haekaka_map )
- MCFG_DEVICE_IO_MAP( haekaka_io )
-MACHINE_CONFIG_END
-MACHINE_CONFIG_START(sigmab98_state::itazuram)
+ m_maincpu->set_addrmap(AS_PROGRAM, &sigmab98_state::haekaka_map);
+ m_maincpu->set_addrmap(AS_IO, &sigmab98_state::haekaka_io);
+}
+
+void sigmab98_state::itazuram(machine_config &config)
+{
sammymdl(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP( itazuram_map )
- MCFG_DEVICE_IO_MAP( itazuram_io )
-MACHINE_CONFIG_END
-MACHINE_CONFIG_START(sigmab98_state::pyenaget)
+ m_maincpu->set_addrmap(AS_PROGRAM, &sigmab98_state::itazuram_map);
+ m_maincpu->set_addrmap(AS_IO, &sigmab98_state::itazuram_io);
+}
+
+void sigmab98_state::pyenaget(machine_config &config)
+{
sammymdl(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP( haekaka_map )
- MCFG_DEVICE_IO_MAP( pyenaget_io )
-MACHINE_CONFIG_END
-MACHINE_CONFIG_START(sigmab98_state::tdoboon)
+ m_maincpu->set_addrmap(AS_PROGRAM, &sigmab98_state::haekaka_map);
+ m_maincpu->set_addrmap(AS_IO, &sigmab98_state::pyenaget_io);
+}
+
+void sigmab98_state::tdoboon(machine_config &config)
+{
sammymdl(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP( tdoboon_map )
- MCFG_DEVICE_IO_MAP( tdoboon_io )
- MCFG_SCREEN_MODIFY("screen")
- MCFG_SCREEN_VISIBLE_AREA(0,0x140-1, 0+4,0xf0+4-1)
-MACHINE_CONFIG_END
+ m_maincpu->set_addrmap(AS_PROGRAM, &sigmab98_state::tdoboon_map);
+ m_maincpu->set_addrmap(AS_IO, &sigmab98_state::tdoboon_io);
+
+ m_screen->set_visarea(0,0x140-1, 0+4,0xf0+4-1);
+}
/***************************************************************************
diff --git a/src/mame/drivers/silkroad.cpp b/src/mame/drivers/silkroad.cpp
index 7b5979491d5..f050c3c146f 100644
--- a/src/mame/drivers/silkroad.cpp
+++ b/src/mame/drivers/silkroad.cpp
@@ -280,21 +280,21 @@ void silkroad_state::machine_start()
m_okibank->configure_entries(0, 4, memregion("oki1")->base() + 0x20000, 0x20000);
}
-MACHINE_CONFIG_START(silkroad_state::silkroad)
-
+void silkroad_state::silkroad(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M68EC020, XTAL(32'000'000)/2) /* 16MHz */
- MCFG_DEVICE_PROGRAM_MAP(cpu_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", silkroad_state, irq4_line_hold)
+ M68EC020(config, m_maincpu, XTAL(32'000'000)/2); /* 16MHz */
+ m_maincpu->set_addrmap(AS_PROGRAM, &silkroad_state::cpu_map);
+ m_maincpu->set_vblank_int("screen", FUNC(silkroad_state::irq4_line_hold));
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(64*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(6*8+2, 64*8-1-(10*8)-2, 2*8, 32*8-1-(2*8))
- MCFG_SCREEN_UPDATE_DRIVER(silkroad_state, screen_update)
- MCFG_SCREEN_PALETTE(m_palette)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(64*8, 32*8);
+ screen.set_visarea(6*8+2, 64*8-1-(10*8)-2, 2*8, 32*8-1-(2*8));
+ screen.set_screen_update(FUNC(silkroad_state::screen_update));
+ screen.set_palette(m_palette);
GFXDECODE(config, m_gfxdecode, m_palette, gfx_silkroad);
PALETTE(config, m_palette).set_format(palette_device::xRGB_555, 0x2000).set_membits(16);
@@ -305,15 +305,15 @@ MACHINE_CONFIG_START(silkroad_state::silkroad)
YM2151(config, "ymsnd", XTAL(3'579'545)).add_route(0, "lspeaker", 1.0).add_route(1, "rspeaker", 1.0);
- MCFG_DEVICE_ADD("oki1", OKIM6295, XTAL(32'000'000)/32, okim6295_device::PIN7_HIGH) // clock frequency & pin 7 not verified (was 1056000)
- MCFG_DEVICE_ADDRESS_MAP(0, oki_map)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 0.45)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 0.45)
+ okim6295_device &oki1(OKIM6295(config, "oki1", XTAL(32'000'000)/32, okim6295_device::PIN7_HIGH)); // clock frequency & pin 7 not verified (was 1056000)
+ oki1.set_addrmap(0, &silkroad_state::oki_map);
+ oki1.add_route(ALL_OUTPUTS, "lspeaker", 0.45);
+ oki1.add_route(ALL_OUTPUTS, "rspeaker", 0.45);
- MCFG_DEVICE_ADD("oki2", OKIM6295, XTAL(32'000'000)/16, okim6295_device::PIN7_HIGH) // clock frequency & pin 7 not verified (was 2112000)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 0.45)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 0.45)
-MACHINE_CONFIG_END
+ okim6295_device &oki2(OKIM6295(config, "oki2", XTAL(32'000'000)/16, okim6295_device::PIN7_HIGH)); // clock frequency & pin 7 not verified (was 2112000)
+ oki2.add_route(ALL_OUTPUTS, "lspeaker", 0.45);
+ oki2.add_route(ALL_OUTPUTS, "rspeaker", 0.45);
+}
/***************************************************************************
diff --git a/src/mame/drivers/silvmil.cpp b/src/mame/drivers/silvmil.cpp
index ed75b00ef21..a0e538791fb 100644
--- a/src/mame/drivers/silvmil.cpp
+++ b/src/mame/drivers/silvmil.cpp
@@ -53,8 +53,6 @@ public:
void puzzlove(machine_config &config);
void silvmil(machine_config &config);
- void init_silvmil();
-
private:
/* devices */
required_device<cpu_device> m_maincpu;
@@ -63,94 +61,91 @@ private:
required_device<generic_latch_8_device> m_soundlatch;
/* memory pointers */
- required_shared_ptr<uint16_t> m_bg_videoram;
- required_shared_ptr<uint16_t> m_fg_videoram;
- required_shared_ptr<uint16_t> m_spriteram;
+ required_shared_ptr<u16> m_bg_videoram;
+ required_shared_ptr<u16> m_fg_videoram;
+ required_shared_ptr<u16> m_spriteram;
/* video-related */
tilemap_t *m_bg_layer;
tilemap_t *m_fg_layer;
- int m_silvmil_tilebank[4];
- int m_whichbank;
-
- DECLARE_WRITE16_MEMBER(silvmil_tilebank_w)
- {
- m_silvmil_tilebank[m_whichbank] = (data>>8) & 0x1f;
-
- // printf("%08x tilebank_w %04x (which = %04x)\n",pc, data, m_whichbank);
- m_fg_layer->mark_all_dirty();
- m_bg_layer->mark_all_dirty();
- }
-
- DECLARE_WRITE16_MEMBER(silvmil_tilebank1_w)
- {
- m_whichbank = (data>>8)&0x3;
- }
-
- DECLARE_WRITE16_MEMBER(silvmil_fg_scrolly_w)
- {
- m_fg_layer->set_scrolly(0, data + 8);
- }
-
- DECLARE_WRITE16_MEMBER(silvmil_bg_scrolly_w)
- {
- m_bg_layer->set_scrolly(0, data + 8);
- }
-
- DECLARE_WRITE16_MEMBER(silvmil_fg_scrollx_w)
- {
- m_fg_layer->set_scrollx(0, data);
- }
-
- DECLARE_WRITE16_MEMBER(silvmil_bg_scrollx_w)
- {
- m_bg_layer->set_scrollx(0, data + 4);
- }
-
-
- DECLARE_WRITE16_MEMBER(silvmil_fg_videoram_w)
- {
- COMBINE_DATA(&m_fg_videoram[offset]);
- m_fg_layer->mark_tile_dirty(offset);
- }
-
- DECLARE_WRITE16_MEMBER(silvmil_bg_videoram_w)
- {
- COMBINE_DATA(&m_bg_videoram[offset]);
- m_bg_layer->mark_tile_dirty(offset);
- }
-
- DECLARE_WRITE16_MEMBER(silvmil_soundcmd_w)
- {
- if (ACCESSING_BITS_0_7)
- {
- m_soundlatch->write(space, 0, data & 0xff);
- machine().scheduler().boost_interleave(attotime::zero, attotime::from_usec(20));
-
- }
- }
+ int m_tilebank[4];
+ int m_whichbank;
+
+ void tilebank_w(u16 data);
+ void tilebank1_w(u16 data);
+ void fg_scrolly_w(u16 data);
+ void bg_scrolly_w(u16 data);
+ void fg_scrollx_w(u16 data);
+ void bg_scrollx_w(u16 data);
+ void fg_videoram_w(offs_t offset, u16 data, u16 mem_mask = ~0);
+ void bg_videoram_w(offs_t offset, u16 data, u16 mem_mask = ~0);
+ DECLARE_WRITE8_MEMBER(soundcmd_w);
TILE_GET_INFO_MEMBER(get_bg_tile_info);
TILE_GET_INFO_MEMBER(get_fg_tile_info);
- TILEMAP_MAPPER_MEMBER(deco16_scan_rows);
+ TILEMAP_MAPPER_MEMBER(scan_rows);
virtual void machine_start() override;
virtual void machine_reset() override;
virtual void video_start() override;
- uint32_t screen_update_silvmil(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
- void tumblepb_gfx1_rearrange();
+ u32 screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
- void silvmil_map(address_map &map);
- void silvmil_sound_map(address_map &map);
+ void mem_map(address_map &map);
+ void sound_map(address_map &map);
};
+void silvmil_state::tilebank_w(u16 data)
+{
+ m_tilebank[m_whichbank] = (data >> 8) & 0x1f;
+
+// printf("%08x tilebank_w %04x (which = %04x)\n",pc, data, m_whichbank);
+ m_fg_layer->mark_all_dirty();
+ m_bg_layer->mark_all_dirty();
+}
+
+void silvmil_state::tilebank1_w(u16 data)
+{
+ m_whichbank = (data >> 8) & 0x3;
+}
+
+void silvmil_state::fg_scrolly_w(u16 data)
+{
+ m_fg_layer->set_scrolly(0, data + 8);
+}
+
+void silvmil_state::bg_scrolly_w(u16 data)
+{
+ m_bg_layer->set_scrolly(0, data + 8);
+}
+
+void silvmil_state::fg_scrollx_w(u16 data)
+{
+ m_fg_layer->set_scrollx(0, data);
+}
+
+void silvmil_state::bg_scrollx_w(u16 data)
+{
+ m_bg_layer->set_scrollx(0, data + 4);
+}
+
+void silvmil_state::fg_videoram_w(offs_t offset, u16 data, u16 mem_mask)
+{
+ COMBINE_DATA(&m_fg_videoram[offset]);
+ m_fg_layer->mark_tile_dirty(offset);
+}
+
+void silvmil_state::bg_videoram_w(offs_t offset, u16 data, u16 mem_mask)
+{
+ COMBINE_DATA(&m_bg_videoram[offset]);
+ m_bg_layer->mark_tile_dirty(offset);
+}
TILE_GET_INFO_MEMBER(silvmil_state::get_bg_tile_info)
{
int data = m_bg_videoram[tile_index];
int tile = data & 0x3ff;
int color = (data >> 12) & 0x0f;
- int bank = m_silvmil_tilebank[(data&0xc00)>>10]*0x400;
+ int bank = m_tilebank[(data & 0xc00) >> 10] * 0x400;
SET_TILE_INFO_MEMBER(1, tile + bank, color + 0x20, 0);
}
@@ -160,12 +155,12 @@ TILE_GET_INFO_MEMBER(silvmil_state::get_fg_tile_info)
int data = m_fg_videoram[tile_index];
int tile = data & 0x3ff;
int color = (data >> 12) & 0x0f;
- int bank = m_silvmil_tilebank[(data&0xc00)>>10]*0x400;
+ int bank = m_tilebank[(data & 0xc00) >> 10] * 0x400;
SET_TILE_INFO_MEMBER(1, tile + bank, color + 0x10, 0);
}
-TILEMAP_MAPPER_MEMBER(silvmil_state::deco16_scan_rows)
+TILEMAP_MAPPER_MEMBER(silvmil_state::scan_rows)
{
/* logical (col,row) -> memory offset */
return (col & 0x1f) + ((row & 0x1f) << 5) + ((col & 0x20) << 5) + ((row & 0x20) << 6);
@@ -173,13 +168,13 @@ TILEMAP_MAPPER_MEMBER(silvmil_state::deco16_scan_rows)
void silvmil_state::video_start()
{
- m_bg_layer = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(silvmil_state::get_bg_tile_info),this), tilemap_mapper_delegate(FUNC(silvmil_state::deco16_scan_rows),this), 16, 16, 64, 32);
- m_fg_layer = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(silvmil_state::get_fg_tile_info),this), tilemap_mapper_delegate(FUNC(silvmil_state::deco16_scan_rows),this), 16, 16, 64, 32);
+ m_bg_layer = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(silvmil_state::get_bg_tile_info),this), tilemap_mapper_delegate(FUNC(silvmil_state::scan_rows),this), 16, 16, 64, 32);
+ m_fg_layer = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(silvmil_state::get_fg_tile_info),this), tilemap_mapper_delegate(FUNC(silvmil_state::scan_rows),this), 16, 16, 64, 32);
m_fg_layer->set_transparent_pen(0);
}
-uint32_t silvmil_state::screen_update_silvmil(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
+u32 silvmil_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{
m_bg_layer->draw(screen, bitmap, cliprect, 0, 0);
m_fg_layer->draw(screen, bitmap, cliprect, 0, 0);
@@ -188,22 +183,28 @@ uint32_t silvmil_state::screen_update_silvmil(screen_device &screen, bitmap_ind1
}
-void silvmil_state::silvmil_map(address_map &map)
+WRITE8_MEMBER(silvmil_state::soundcmd_w)
+{
+ m_soundlatch->write(space, 0, data & 0xff);
+ machine().scheduler().boost_interleave(attotime::zero, attotime::from_usec(20));
+}
+
+void silvmil_state::mem_map(address_map &map)
{
map(0x000000, 0x0fffff).rom();
- map(0x100000, 0x100001).w(FUNC(silvmil_state::silvmil_tilebank1_w));
- map(0x100002, 0x100003).w(FUNC(silvmil_state::silvmil_fg_scrollx_w));
- map(0x100004, 0x100005).w(FUNC(silvmil_state::silvmil_fg_scrolly_w));
- map(0x100006, 0x100007).w(FUNC(silvmil_state::silvmil_bg_scrollx_w));
- map(0x100008, 0x100009).w(FUNC(silvmil_state::silvmil_bg_scrolly_w));
- map(0x10000e, 0x10000f).w(FUNC(silvmil_state::silvmil_tilebank_w));
+ map(0x100000, 0x100001).w(FUNC(silvmil_state::tilebank1_w));
+ map(0x100002, 0x100003).w(FUNC(silvmil_state::fg_scrollx_w));
+ map(0x100004, 0x100005).w(FUNC(silvmil_state::fg_scrolly_w));
+ map(0x100006, 0x100007).w(FUNC(silvmil_state::bg_scrollx_w));
+ map(0x100008, 0x100009).w(FUNC(silvmil_state::bg_scrolly_w));
+ map(0x10000e, 0x10000f).w(FUNC(silvmil_state::tilebank_w));
- map(0x120000, 0x120fff).ram().w(FUNC(silvmil_state::silvmil_fg_videoram_w)).share("fg_videoram");
- map(0x122000, 0x122fff).ram().w(FUNC(silvmil_state::silvmil_bg_videoram_w)).share("bg_videoram");
+ map(0x120000, 0x120fff).ram().w(FUNC(silvmil_state::fg_videoram_w)).share("fg_videoram");
+ map(0x122000, 0x122fff).ram().w(FUNC(silvmil_state::bg_videoram_w)).share("bg_videoram");
map(0x200000, 0x2005ff).ram().w("palette", FUNC(palette_device::write16)).share("palette");
map(0x210000, 0x2107ff).ram().share("spriteram");
- map(0x270000, 0x270001).w(FUNC(silvmil_state::silvmil_soundcmd_w));
+ map(0x270001, 0x270001).w(FUNC(silvmil_state::soundcmd_w));
map(0x280000, 0x280001).portr("P1_P2");
map(0x280002, 0x280003).portr("COIN");
map(0x280004, 0x280005).portr("DSW");
@@ -366,69 +367,77 @@ static const gfx_layout tlayout =
RGN_FRAC(1,2),
4,
{ RGN_FRAC(1,2)+8, RGN_FRAC(1,2)+0, 8, 0 },
- { 32*8+0, 32*8+1, 32*8+2, 32*8+3, 32*8+4, 32*8+5, 32*8+6, 32*8+7,
- 0, 1, 2, 3, 4, 5, 6, 7 },
- { 0*16, 1*16, 2*16, 3*16, 4*16, 5*16, 6*16, 7*16,
- 8*16, 9*16, 10*16, 11*16, 12*16, 13*16, 14*16, 15*16 },
+ { STEP8(8*2*16,1), STEP8(0,1) },
+ { STEP16(0,8*2) },
+ 64*8
+};
+
+static const gfx_layout tlayout_alt =
+{
+ 16,16,
+ RGN_FRAC(1,2),
+ 4,
+ { 8, 0, RGN_FRAC(1,2)+8, RGN_FRAC(1,2)+0 },
+ { STEP8(0,1), STEP8(8*2*16,1) },
+ { STEP16(0,8*2) },
64*8
};
static GFXDECODE_START( gfx_silvmil )
- GFXDECODE_ENTRY( "gfx2", 0, tlayout, 0, 64 ) /* Tiles 16x16 */
- GFXDECODE_ENTRY( "gfx1", 0, tlayout, 0, 64 ) /* Sprites 16x16 */
+ GFXDECODE_ENTRY( "gfx2", 0, tlayout, 0, 64 ) /* Sprites 16x16 */
+ GFXDECODE_ENTRY( "gfx1", 0, tlayout_alt, 0, 64 ) /* Tiles 16x16 */
GFXDECODE_END
void silvmil_state::machine_start()
{
- save_item(NAME(m_silvmil_tilebank));
+ save_item(NAME(m_tilebank));
save_item(NAME(m_whichbank));
}
void silvmil_state::machine_reset()
{
- m_silvmil_tilebank[0] = 0;
- m_silvmil_tilebank[1] = 0;
- m_silvmil_tilebank[2] = 0;
- m_silvmil_tilebank[3] = 0;
+ m_tilebank[0] = 0;
+ m_tilebank[1] = 0;
+ m_tilebank[2] = 0;
+ m_tilebank[3] = 0;
m_whichbank = 0;
}
-void silvmil_state::silvmil_sound_map(address_map &map)
+void silvmil_state::sound_map(address_map &map)
{
map(0x0000, 0xbfff).rom();
- map(0xd000, 0xd7ff).ram();
map(0xc000, 0xc001).rw("ymsnd", FUNC(ym2151_device::read), FUNC(ym2151_device::write));
map(0xc002, 0xc002).rw("oki", FUNC(okim6295_device::read), FUNC(okim6295_device::write)).mirror(1);
map(0xc006, 0xc006).r(m_soundlatch, FUNC(generic_latch_8_device::read));
map(0xc00f, 0xc00f).nopw(); // ??
+ map(0xd000, 0xd7ff).ram();
}
-MACHINE_CONFIG_START(silvmil_state::silvmil)
-
+void silvmil_state::silvmil(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M68000, XTAL(12'000'000)) /* Verified */
- MCFG_DEVICE_PROGRAM_MAP(silvmil_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", silvmil_state, irq6_line_hold)
-
- MCFG_DEVICE_ADD("audiocpu", Z80, XTAL(4'096'000)) /* Verified */
- MCFG_DEVICE_PROGRAM_MAP(silvmil_sound_map)
+ M68000(config, m_maincpu, XTAL(12'000'000)); /* Verified */
+ m_maincpu->set_addrmap(AS_PROGRAM, &silvmil_state::mem_map);
+ m_maincpu->set_vblank_int("screen", FUNC(silvmil_state::irq6_line_hold));
+ z80_device &audiocpu(Z80(config, "audiocpu", XTAL(4'096'000))); /* Verified */
+ audiocpu.set_addrmap(AS_PROGRAM, &silvmil_state::sound_map);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(64*8, 64*8)
- MCFG_SCREEN_VISIBLE_AREA(0, 40*8-1, 0, 30*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(silvmil_state, screen_update_silvmil)
- MCFG_SCREEN_PALETTE("palette")
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(64*8, 64*8);
+ screen.set_visarea(0, 40*8-1, 0, 30*8-1);
+ screen.set_screen_update(FUNC(silvmil_state::screen_update));
+ screen.set_palette("palette");
PALETTE(config, "palette").set_format(palette_device::xRGB_555, 0x300);
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_silvmil)
+ GFXDECODE(config, m_gfxdecode, "palette", gfx_silvmil);
DECO_SPRITE(config, m_sprgen, 0);
m_sprgen->set_gfx_region(0);
@@ -444,22 +453,18 @@ MACHINE_CONFIG_START(silvmil_state::silvmil)
ymsnd.irq_handler().set_inputline("audiocpu", 0);
ymsnd.add_route(ALL_OUTPUTS, "mono", 0.25);
- MCFG_DEVICE_ADD("oki", OKIM6295, XTAL(4'096'000)/4, okim6295_device::PIN7_HIGH) /* Verified */
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25)
-MACHINE_CONFIG_END
+ OKIM6295(config, "oki", XTAL(4'096'000)/4, okim6295_device::PIN7_HIGH).add_route(ALL_OUTPUTS, "mono", 0.25); /* Verified */
+}
-MACHINE_CONFIG_START(silvmil_state::puzzlove)
+void silvmil_state::puzzlove(machine_config &config)
+{
silvmil(config);
- MCFG_DEVICE_REMOVE("audiocpu")
- MCFG_DEVICE_ADD("audiocpu", Z80, XTAL(4'000'000)) /* Verified */
- MCFG_DEVICE_PROGRAM_MAP(silvmil_sound_map)
+ subdevice<z80_device>("audiocpu")->set_clock(XTAL(4'000'000)); /* Verified */
m_sprgen->set_bootleg_type(1);
- MCFG_DEVICE_REMOVE("oki")
- MCFG_DEVICE_ADD("oki", OKIM6295, XTAL(4'000'000)/4, okim6295_device::PIN7_HIGH) /* Verified */
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25)
-MACHINE_CONFIG_END
+ subdevice<okim6295_device>("oki")->set_clock(XTAL(4'000'000)/4); /* Verified */
+}
void silvmil_state::puzzlovek(machine_config &config)
{
@@ -576,32 +581,7 @@ ROM_START( puzzlovek )
ROM_LOAD16_BYTE( "8.u56", 0x100001, 0x80000, CRC(95b5f049) SHA1(1104dac1fbf6a894b7d8294b3f44a0edbf363157) ) // sldh
ROM_END
-void silvmil_state::tumblepb_gfx1_rearrange()
-{
- uint8_t *rom = memregion("gfx1")->base();
- int len = memregion("gfx1")->bytes();
- int i;
-
- /* gfx data is in the wrong order */
- for (i = 0; i < len; i++)
- {
- if ((i & 0x20) == 0)
- {
- int t = rom[i]; rom[i] = rom[i + 0x20]; rom[i + 0x20] = t;
- }
- }
- /* low/high half are also swapped */
- for (i = 0; i < len / 2; i++)
- {
- int t = rom[i]; rom[i] = rom[i + len / 2]; rom[i + len / 2] = t;
- }
-}
-
-void silvmil_state::init_silvmil()
-{
- tumblepb_gfx1_rearrange();
-}
-GAME( 1995, silvmil, 0, silvmil, silvmil, silvmil_state, init_silvmil, ROT270, "Para", "Silver Millennium", MACHINE_SUPPORTS_SAVE )
-GAME( 1994, puzzlove, 0, puzzlove, puzzlove, silvmil_state, init_silvmil, ROT0, "Para", "PuzzLove", MACHINE_SUPPORTS_SAVE )
-GAME( 1994, puzzlovek, puzzlove, puzzlovek, puzzlovek, silvmil_state, init_silvmil, ROT0, "Para", "PuzzLove (Korea)", MACHINE_SUPPORTS_SAVE )
+GAME( 1995, silvmil, 0, silvmil, silvmil, silvmil_state, empty_init, ROT270, "Para", "Silver Millennium", MACHINE_SUPPORTS_SAVE )
+GAME( 1994, puzzlove, 0, puzzlove, puzzlove, silvmil_state, empty_init, ROT0, "Para", "PuzzLove", MACHINE_SUPPORTS_SAVE )
+GAME( 1994, puzzlovek, puzzlove, puzzlovek, puzzlovek, silvmil_state, empty_init, ROT0, "Para", "PuzzLove (Korea)", MACHINE_SUPPORTS_SAVE )
diff --git a/src/mame/drivers/simpl156.cpp b/src/mame/drivers/simpl156.cpp
index ab25c3fcab1..a203d88f76d 100644
--- a/src/mame/drivers/simpl156.cpp
+++ b/src/mame/drivers/simpl156.cpp
@@ -401,29 +401,29 @@ DECOSPR_PRIORITY_CB_MEMBER(simpl156_state::pri_callback)
}
-MACHINE_CONFIG_START(simpl156_state::chainrec)
-
+void simpl156_state::chainrec(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", ARM, 28000000 /* /4 */) /*DE156*/ /* 7.000 MHz */ /* measured at 7.. seems to need 28? */
- MCFG_DEVICE_PROGRAM_MAP(chainrec_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", simpl156_state, simpl156_vbl_interrupt)
+ ARM(config, m_maincpu, 28000000 /* /4 */); /*DE156*/ /* 7.000 MHz */ /* measured at 7.. seems to need 28? */
+ m_maincpu->set_addrmap(AS_PROGRAM, &simpl156_state::chainrec_map);
+ m_maincpu->set_vblank_int("screen", FUNC(simpl156_state::simpl156_vbl_interrupt));
EEPROM_93C46_16BIT(config, "eeprom"); // 93C45
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(58)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(800))
- MCFG_SCREEN_SIZE(64*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 40*8-1, 1*8, 31*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(simpl156_state, screen_update_simpl156)
- MCFG_SCREEN_PALETTE(m_palette)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(58);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(800));
+ screen.set_size(64*8, 32*8);
+ screen.set_visarea(0*8, 40*8-1, 1*8, 31*8-1);
+ screen.set_screen_update(FUNC(simpl156_state::screen_update_simpl156));
+ screen.set_palette(m_palette);
PALETTE(config, m_palette);
m_palette->set_format(palette_device::xBGR_555, 4096);
m_palette->set_membits(16);
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, m_palette, gfx_simpl156)
+ GFXDECODE(config, "gfxdecode", m_palette, gfx_simpl156);
DECO16IC(config, m_deco_tilegen, 0);
m_deco_tilegen->set_split(0);
@@ -449,50 +449,48 @@ MACHINE_CONFIG_START(simpl156_state::chainrec)
SPEAKER(config, "lspeaker").front_left();
SPEAKER(config, "rspeaker").front_right();
- MCFG_DEVICE_ADD("okisfx", OKIM6295, 32220000/32, okim6295_device::PIN7_HIGH)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 0.6)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 0.6)
+ okim6295_device &okisfx(OKIM6295(config, "okisfx", 32220000/32, okim6295_device::PIN7_HIGH));
+ okisfx.add_route(ALL_OUTPUTS, "lspeaker", 0.6);
+ okisfx.add_route(ALL_OUTPUTS, "rspeaker", 0.6);
- MCFG_DEVICE_ADD("okimusic", OKIM6295, 32220000/16, okim6295_device::PIN7_HIGH)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 0.2)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 0.2)
-MACHINE_CONFIG_END
+ OKIM6295(config, m_okimusic, 32220000/16, okim6295_device::PIN7_HIGH);
+ m_okimusic->add_route(ALL_OUTPUTS, "lspeaker", 0.2);
+ m_okimusic->add_route(ALL_OUTPUTS, "rspeaker", 0.2);
+}
-MACHINE_CONFIG_START(simpl156_state::magdrop)
+void simpl156_state::magdrop(machine_config &config)
+{
chainrec(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(magdrop_map)
-MACHINE_CONFIG_END
+ m_maincpu->set_addrmap(AS_PROGRAM, &simpl156_state::magdrop_map);
+}
-MACHINE_CONFIG_START(simpl156_state::magdropp)
+void simpl156_state::magdropp(machine_config &config)
+{
chainrec(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(magdropp_map)
-MACHINE_CONFIG_END
+ m_maincpu->set_addrmap(AS_PROGRAM, &simpl156_state::magdropp_map);
+}
-MACHINE_CONFIG_START(simpl156_state::joemacr)
+void simpl156_state::joemacr(machine_config &config)
+{
chainrec(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(joemacr_map)
-MACHINE_CONFIG_END
+ m_maincpu->set_addrmap(AS_PROGRAM, &simpl156_state::joemacr_map);
+}
-MACHINE_CONFIG_START(simpl156_state::mitchell156)
+void simpl156_state::mitchell156(machine_config &config)
+{
chainrec(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(mitchell156_map)
+ m_maincpu->set_addrmap(AS_PROGRAM, &simpl156_state::mitchell156_map);
- MCFG_DEVICE_REPLACE("okimusic", OKIM6295, 32220000/32, okim6295_device::PIN7_HIGH)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 0.2)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 0.2)
-MACHINE_CONFIG_END
+ m_okimusic->set_clock(32220000/32);
+}
/*
diff --git a/src/mame/drivers/simple_st0016.cpp b/src/mame/drivers/simple_st0016.cpp
index a9218cb746c..877226f41a8 100644
--- a/src/mame/drivers/simple_st0016.cpp
+++ b/src/mame/drivers/simple_st0016.cpp
@@ -467,41 +467,45 @@ uint32_t st0016_state::screen_update_st0016(screen_device &screen, bitmap_ind16
}
-MACHINE_CONFIG_START(st0016_state::st0016)
+void st0016_state::st0016(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu",ST0016_CPU,8000000) /* 8 MHz ? */
- MCFG_DEVICE_PROGRAM_MAP(st0016_mem)
- MCFG_DEVICE_IO_MAP(st0016_io)
- MCFG_TIMER_DRIVER_ADD_SCANLINE("scantimer", st0016_state, st0016_int, "screen", 0, 1)
+ ST0016_CPU(config, m_maincpu, 8000000); /* 8 MHz ? */
+ m_maincpu->set_addrmap(AS_PROGRAM, &st0016_state::st0016_mem);
+ m_maincpu->set_addrmap(AS_IO, &st0016_state::st0016_io);
+
+ TIMER(config, "scantimer").configure_scanline(FUNC(st0016_state::st0016_int), "screen", 0, 1);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(48*8, 48*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 48*8-1, 0*8, 48*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(st0016_state, screen_update_st0016)
- MCFG_SCREEN_PALETTE("maincpu:palette")
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_refresh_hz(60);
+ m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ m_screen->set_size(48*8, 48*8);
+ m_screen->set_visarea(0*8, 48*8-1, 0*8, 48*8-1);
+ m_screen->set_screen_update(FUNC(st0016_state::screen_update_st0016));
+ m_screen->set_palette("maincpu:palette");
// MCFG_VIDEO_START_OVERRIDE(st0016_state,st0016)
+}
-MACHINE_CONFIG_END
-
-MACHINE_CONFIG_START(st0016_state::mayjinsn)
+void st0016_state::mayjinsn(machine_config &config)
+{
st0016(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_IO_MAP(st0016_m2_io)
- MCFG_DEVICE_ADD("sub", V810, 10000000)//25 Mhz ?
- MCFG_DEVICE_PROGRAM_MAP(v810_mem)
- MCFG_QUANTUM_TIME(attotime::from_hz(60))
-MACHINE_CONFIG_END
-
-MACHINE_CONFIG_START(st0016_state::renju)
+
+ m_maincpu->set_addrmap(AS_IO, &st0016_state::st0016_m2_io);
+
+ V810(config, m_subcpu, 10000000); //25 Mhz ?
+ m_subcpu->set_addrmap(AS_PROGRAM, &st0016_state::v810_mem);
+
+ config.m_minimum_quantum = attotime::from_hz(60);
+}
+
+void st0016_state::renju(machine_config &config)
+{
st0016(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(renju_mem)
-MACHINE_CONFIG_END
+ m_maincpu->set_addrmap(AS_PROGRAM, &st0016_state::renju_mem);
+}
/*************************************
*
diff --git a/src/mame/drivers/sk1.cpp b/src/mame/drivers/sk1.cpp
index bdb91ff66e7..1ad5581e705 100644
--- a/src/mame/drivers/sk1.cpp
+++ b/src/mame/drivers/sk1.cpp
@@ -89,10 +89,11 @@ void sk1_state::sk1_memory(address_map &map)
}
-MACHINE_CONFIG_START(sk1_state::sk1)
+void sk1_state::sk1(machine_config &config)
+{
// just to attach the memory map to something until I can work out what the CPU core is
ADDRESS_MAP_BANK(config, "dummy").set_map(&sk1_state::sk1_memory).set_data_width(8).set_addr_width(16);
-MACHINE_CONFIG_END
+}
INPUT_PORTS_START(sk1)
diff --git a/src/mame/drivers/skeetsht.cpp b/src/mame/drivers/skeetsht.cpp
index 32b80cf0063..5f7e7286e02 100644
--- a/src/mame/drivers/skeetsht.cpp
+++ b/src/mame/drivers/skeetsht.cpp
@@ -113,7 +113,7 @@ READ16_MEMBER(skeetsht_state::ramdac_r)
if (offset & 8)
offset = (offset & ~8) | 4;
- return m_tlc34076->read(space, offset);
+ return m_tlc34076->read(offset);
}
WRITE16_MEMBER(skeetsht_state::ramdac_w)
@@ -123,7 +123,7 @@ WRITE16_MEMBER(skeetsht_state::ramdac_w)
if (offset & 8)
offset = (offset & ~8) | 4;
- m_tlc34076->write(space, offset, data);
+ m_tlc34076->write(offset, data);
}
@@ -144,13 +144,13 @@ WRITE8_MEMBER(skeetsht_state::tms_w)
if ((offset & 1) == 0)
m_lastdataw = data;
else
- m_tms->host_w(space, offset >> 1, (m_lastdataw << 8) | data, 0xffff);
+ m_tms->host_w(offset >> 1, (m_lastdataw << 8) | data);
}
READ8_MEMBER(skeetsht_state::tms_r)
{
if ((offset & 1) == 0)
- m_lastdatar = m_tms->host_r(space, offset >> 1, 0xffff);
+ m_lastdatar = m_tms->host_r(offset >> 1);
return m_lastdatar >> ((offset & 1) ? 0 : 8);
}
@@ -178,9 +178,9 @@ WRITE8_MEMBER(skeetsht_state::hc11_porta_w)
WRITE8_MEMBER(skeetsht_state::ay8910_w)
{
if (m_ay_sel)
- m_ay->data_w(space, 0, data);
+ m_ay->data_w(data);
else
- m_ay->address_w(space, 0, data);
+ m_ay->address_w(data);
}
@@ -214,7 +214,6 @@ void skeetsht_state::tms_program_map(address_map &map)
{
map(0x00000000, 0x003fffff).ram().share("tms_vram");
map(0x00440000, 0x004fffff).rw(FUNC(skeetsht_state::ramdac_r), FUNC(skeetsht_state::ramdac_w));
- map(0xc0000000, 0xc00001ff).rw(m_tms, FUNC(tms34010_device::io_register_r), FUNC(tms34010_device::io_register_w));
map(0xff800000, 0xffbfffff).rom().mirror(0x00400000).region("tms", 0);
}
diff --git a/src/mame/drivers/skimaxx.cpp b/src/mame/drivers/skimaxx.cpp
index 5beefdc72d3..f5b619d8da7 100644
--- a/src/mame/drivers/skimaxx.cpp
+++ b/src/mame/drivers/skimaxx.cpp
@@ -380,7 +380,6 @@ void skimaxx_state::tms_program_map(address_map &map)
map(0x02000000, 0x0200000f).ram();
map(0x02100000, 0x0210000f).ram();
map(0x04000000, 0x047fffff).rom().region("tmsgfx", 0);
- map(0xc0000000, 0xc00001ff).rw(m_tms, FUNC(tms34010_device::io_register_r), FUNC(tms34010_device::io_register_w));
map(0xff800000, 0xffffffff).rom().region("tms", 0);
}
@@ -503,13 +502,14 @@ void skimaxx_state::machine_reset()
*
*************************************/
-MACHINE_CONFIG_START(skimaxx_state::skimaxx)
- MCFG_DEVICE_ADD("maincpu", M68EC030, XTAL(40'000'000))
- MCFG_DEVICE_PROGRAM_MAP(m68030_1_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", skimaxx_state, irq3_line_hold) // 1,3,7 are identical, rest is RTE
+void skimaxx_state::skimaxx(machine_config &config)
+{
+ M68EC030(config, m_maincpu, XTAL(40'000'000));
+ m_maincpu->set_addrmap(AS_PROGRAM, &skimaxx_state::m68030_1_map);
+ m_maincpu->set_vblank_int("screen", FUNC(skimaxx_state::irq3_line_hold)); // 1,3,7 are identical, rest is RTE
- MCFG_DEVICE_ADD("subcpu", M68EC030, XTAL(40'000'000))
- MCFG_DEVICE_PROGRAM_MAP(m68030_2_map)
+ M68EC030(config, m_subcpu, XTAL(40'000'000));
+ m_subcpu->set_addrmap(AS_PROGRAM, &skimaxx_state::m68030_2_map);
/* video hardware */
@@ -523,16 +523,16 @@ MACHINE_CONFIG_START(skimaxx_state::skimaxx)
m_tms->set_shiftreg_in_callback(FUNC(skimaxx_state::to_shiftreg));
m_tms->set_shiftreg_out_callback(FUNC(skimaxx_state::from_shiftreg));
- MCFG_SCREEN_ADD("screen", RASTER)
-// MCFG_SCREEN_RAW_PARAMS(40000000/4, 156*4, 0, 100*4, 328, 0, 300) // TODO - Wrong but TMS overrides it anyway
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500))
- MCFG_SCREEN_SIZE(0x400, 0x100)
- MCFG_SCREEN_VISIBLE_AREA(0, 0x280-1, 0, 0xf0-1)
- MCFG_SCREEN_UPDATE_DEVICE("tms", tms34010_device, tms340x0_ind16)
- MCFG_SCREEN_PALETTE("palette")
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+// screen.set_raw(40000000/4, 156*4, 0, 100*4, 328, 0, 300); // TODO - Wrong but TMS overrides it anyway
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500));
+ screen.set_size(0x400, 0x100);
+ screen.set_visarea(0, 0x280-1, 0, 0xf0-1);
+ screen.set_screen_update("tms", FUNC(tms34010_device::tms340x0_ind16));
+ screen.set_palette("palette");
-// MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_skimaxx)
+// GFXDECODE(config, "gfxdecode", "palette", gfx_skimaxx);
PALETTE(config, "palette", palette_device::RGB_555);
@@ -540,18 +540,14 @@ MACHINE_CONFIG_START(skimaxx_state::skimaxx)
SPEAKER(config, "lspeaker").front_left();
SPEAKER(config, "rspeaker").front_right();
- MCFG_DEVICE_ADD("oki1", OKIM6295, XTAL(4'000'000), okim6295_device::PIN7_LOW) // ?
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 1.0)
+ OKIM6295(config, "oki1", XTAL(4'000'000), okim6295_device::PIN7_LOW).add_route(ALL_OUTPUTS, "lspeaker", 1.0); // ?
- MCFG_DEVICE_ADD("oki2", OKIM6295, XTAL(4'000'000)/2, okim6295_device::PIN7_HIGH) // ?
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 1.0)
+ OKIM6295(config, "oki2", XTAL(4'000'000)/2, okim6295_device::PIN7_HIGH).add_route(ALL_OUTPUTS, "lspeaker", 1.0); // ?
- MCFG_DEVICE_ADD("oki3", OKIM6295, XTAL(4'000'000), okim6295_device::PIN7_LOW) // ?
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 1.0)
+ OKIM6295(config, "oki3", XTAL(4'000'000), okim6295_device::PIN7_LOW).add_route(ALL_OUTPUTS, "rspeaker", 1.0); // ?
- MCFG_DEVICE_ADD("oki4", OKIM6295, XTAL(4'000'000)/2, okim6295_device::PIN7_HIGH) // ?
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 1.0)
-MACHINE_CONFIG_END
+ OKIM6295(config, "oki4", XTAL(4'000'000)/2, okim6295_device::PIN7_HIGH).add_route(ALL_OUTPUTS, "rspeaker", 1.0); // ?
+}
/*************************************
diff --git a/src/mame/drivers/skullxbo.cpp b/src/mame/drivers/skullxbo.cpp
index 9a7ffb11a17..7dd479a6eac 100644
--- a/src/mame/drivers/skullxbo.cpp
+++ b/src/mame/drivers/skullxbo.cpp
@@ -226,36 +226,36 @@ GFXDECODE_END
*
*************************************/
-MACHINE_CONFIG_START(skullxbo_state::skullxbo)
-
+void skullxbo_state::skullxbo(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M68000, ATARI_CLOCK_14MHz/2)
- MCFG_DEVICE_PROGRAM_MAP(main_map)
+ M68000(config, m_maincpu, ATARI_CLOCK_14MHz/2);
+ m_maincpu->set_addrmap(AS_PROGRAM, &skullxbo_state::main_map);
- MCFG_TIMER_DRIVER_ADD("scan_timer", skullxbo_state, scanline_timer)
+ TIMER(config, m_scanline_timer).configure_generic(FUNC(skullxbo_state::scanline_timer));
EEPROM_2816(config, "eeprom").lock_after_write(true);
WATCHDOG_TIMER(config, "watchdog");
/* video hardware */
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_skullxbo)
+ GFXDECODE(config, m_gfxdecode, "palette", gfx_skullxbo);
PALETTE(config, "palette").set_format(palette_device::IRGB_1555, 2048);
- MCFG_TILEMAP_ADD_STANDARD("playfield", "gfxdecode", 2, skullxbo_state, get_playfield_tile_info, 16,8, SCAN_COLS, 64,64)
- MCFG_TILEMAP_ADD_STANDARD_TRANSPEN("alpha", "gfxdecode", 2, skullxbo_state, get_alpha_tile_info, 16,8, SCAN_ROWS, 64,32, 0)
+ TILEMAP(config, m_playfield_tilemap, m_gfxdecode, 2, 16,8, TILEMAP_SCAN_COLS, 64,64).set_info_callback(FUNC(skullxbo_state::get_playfield_tile_info));
+ TILEMAP(config, m_alpha_tilemap, m_gfxdecode, 2, 16,8, TILEMAP_SCAN_ROWS, 64,32, 0).set_info_callback(FUNC(skullxbo_state::get_alpha_tile_info));
ATARI_MOTION_OBJECTS(config, m_mob, 0, m_screen, skullxbo_state::s_mob_config);
m_mob->set_gfxdecode(m_gfxdecode);
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_VIDEO_ATTRIBUTES(VIDEO_UPDATE_BEFORE_VBLANK)
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_video_attributes(VIDEO_UPDATE_BEFORE_VBLANK);
/* note: these parameters are from published specs, not derived */
/* the board uses an SOS-2 chip to generate video signals */
- MCFG_SCREEN_RAW_PARAMS(ATARI_CLOCK_14MHz, 456*2, 0, 336*2, 262, 0, 240)
- MCFG_SCREEN_UPDATE_DRIVER(skullxbo_state, screen_update_skullxbo)
- MCFG_SCREEN_PALETTE("palette")
- MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE(*this, skullxbo_state, video_int_write_line))
+ m_screen->set_raw(ATARI_CLOCK_14MHz, 456*2, 0, 336*2, 262, 0, 240);
+ m_screen->set_screen_update(FUNC(skullxbo_state::screen_update_skullxbo));
+ m_screen->set_palette("palette");
+ m_screen->screen_vblank().set(FUNC(skullxbo_state::video_int_write_line));
/* sound hardware */
SPEAKER(config, "mono").front_center();
@@ -264,7 +264,7 @@ MACHINE_CONFIG_START(skullxbo_state::skullxbo)
m_jsa->main_int_cb().set_inputline(m_maincpu, M68K_IRQ_4);
m_jsa->test_read_cb().set_ioport("FF5802").bit(7);
m_jsa->add_route(ALL_OUTPUTS, "mono", 1.0);
-MACHINE_CONFIG_END
+}
diff --git a/src/mame/drivers/skyarmy.cpp b/src/mame/drivers/skyarmy.cpp
index c16ee02e5f4..b1569bd04d7 100644
--- a/src/mame/drivers/skyarmy.cpp
+++ b/src/mame/drivers/skyarmy.cpp
@@ -1,5 +1,5 @@
// license:BSD-3-Clause
-// copyright-holders:Tomasz Slanina,Ryan Holtz
+// copyright-holders:Tomasz Slanina, Ryan Holtz
/*
2010.04.05. stephh
@@ -13,15 +13,20 @@
2003.01.01. Tomasz Slanina
changes :
- - nmi generation ( incorrect freq probably)
+ - nmi generation (incorrect freq probably)
- music/sfx (partially)
- more sprite tiles (twice than before)
- fixed sprites flips
- scrolling (2nd game level)
- better colors (weird 'hack' .. but works in most cases ( comparing with screens from emustatus ))
- dips - lives
- - visible area .. a bit smaller (at least bg 'generation' is not visible for scrolling levels )
+ - visible area .. a bit smaller (at least bg 'generation' is not visible for scrolling levels)
- cpu clock .. now 4 mhz
+
+ TODO :
+ - Bridgepiece helicopters joining from the right side don't fly forward, this is especially a problem
+ on the 3rd level making it impossible to complete it.
+ What is it not caused by: memory map mirrors, spriteram writeonly, power-on ram contents
*/
#include "emu.h"
@@ -214,10 +219,10 @@ void skyarmy_state::skyarmy_map(address_map &map)
{
map(0x0000, 0x7fff).rom();
map(0x8000, 0x87ff).ram();
- map(0x8800, 0x8fff).ram().w(FUNC(skyarmy_state::videoram_w)).share("videoram"); /* Video RAM */
- map(0x9000, 0x93ff).ram().w(FUNC(skyarmy_state::colorram_w)).share("colorram"); /* Color RAM */
- map(0x9800, 0x983f).ram().share("spriteram"); /* Sprites */
- map(0x9840, 0x985f).ram().share("scrollram"); /* Scroll RAM */
+ map(0x8800, 0x8fff).ram().w(FUNC(skyarmy_state::videoram_w)).share("videoram");
+ map(0x9000, 0x93ff).ram().w(FUNC(skyarmy_state::colorram_w)).share("colorram");
+ map(0x9800, 0x983f).ram().share("spriteram");
+ map(0x9840, 0x985f).ram().share("scrollram");
map(0xa000, 0xa000).portr("DSW");
map(0xa001, 0xa001).portr("P1");
map(0xa002, 0xa002).portr("P2");
@@ -320,13 +325,13 @@ static GFXDECODE_START( gfx_skyarmy )
GFXDECODE_ENTRY( "gfx2", 0, spritelayout, 0, 8 )
GFXDECODE_END
-MACHINE_CONFIG_START(skyarmy_state::skyarmy)
-
- MCFG_DEVICE_ADD("maincpu", Z80,4000000)
- MCFG_DEVICE_PROGRAM_MAP(skyarmy_map)
- MCFG_DEVICE_IO_MAP(skyarmy_io_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", skyarmy_state, irq0_line_hold)
- MCFG_DEVICE_PERIODIC_INT_DRIVER(skyarmy_state, nmi_source, 650) /* Hz */
+void skyarmy_state::skyarmy(machine_config &config)
+{
+ Z80(config, m_maincpu, 4000000);
+ m_maincpu->set_addrmap(AS_PROGRAM, &skyarmy_state::skyarmy_map);
+ m_maincpu->set_addrmap(AS_IO, &skyarmy_state::skyarmy_io_map);
+ m_maincpu->set_vblank_int("screen", FUNC(skyarmy_state::irq0_line_hold));
+ m_maincpu->set_periodic_int(FUNC(skyarmy_state::nmi_source), attotime::from_hz(650));
ls259_device &latch(LS259(config, "latch")); // 11C
latch.q_out_cb<0>().set(FUNC(skyarmy_state::coin_counter_w));
@@ -336,13 +341,13 @@ MACHINE_CONFIG_START(skyarmy_state::skyarmy)
latch.q_out_cb<7>().set_nop(); // video RAM buffering?
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(32*8,32*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8,32*8-1,1*8,31*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(skyarmy_state, screen_update)
- MCFG_SCREEN_PALETTE(m_palette)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(32*8,32*8);
+ screen.set_visarea(0*8,32*8-1,1*8,31*8-1);
+ screen.set_screen_update(FUNC(skyarmy_state::screen_update));
+ screen.set_palette(m_palette);
GFXDECODE(config, m_gfxdecode, m_palette, gfx_skyarmy);
PALETTE(config, m_palette, FUNC(skyarmy_state::skyarmy_palette), 32);
@@ -351,7 +356,7 @@ MACHINE_CONFIG_START(skyarmy_state::skyarmy)
SPEAKER(config, "mono").front_center();
AY8910(config, "ay0", 2500000).add_route(ALL_OUTPUTS, "mono", 0.15);
AY8910(config, "ay1", 2500000).add_route(ALL_OUTPUTS, "mono", 0.15);
-MACHINE_CONFIG_END
+}
ROM_START( skyarmy )
diff --git a/src/mame/drivers/skydiver.cpp b/src/mame/drivers/skydiver.cpp
index 3838ca1096a..2d0cb744059 100644
--- a/src/mame/drivers/skydiver.cpp
+++ b/src/mame/drivers/skydiver.cpp
@@ -335,12 +335,12 @@ GFXDECODE_END
*
*************************************/
-MACHINE_CONFIG_START(skydiver_state::skydiver)
-
+void skydiver_state::skydiver(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M6800, 12.096_MHz_XTAL / 16) /* ???? */
- MCFG_DEVICE_PROGRAM_MAP(skydiver_map)
- MCFG_DEVICE_PERIODIC_INT_DRIVER(skydiver_state, interrupt, 5*60)
+ M6800(config, m_maincpu, 12.096_MHz_XTAL / 16); /* ???? */
+ m_maincpu->set_addrmap(AS_PROGRAM, &skydiver_state::skydiver_map);
+ m_maincpu->set_periodic_int(FUNC(skydiver_state::interrupt), attotime::from_hz(5*60));
WATCHDOG_TIMER(config, m_watchdog).set_vblank_count("screen", 8); // 128V clocks the same as VBLANK
@@ -372,19 +372,19 @@ MACHINE_CONFIG_START(skydiver_state::skydiver)
latch3.q_out_cb<7>().set("discrete", FUNC(discrete_device::write_line<SKYDIVER_NOISE_RST>));
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_RAW_PARAMS(12.096_MHz_XTAL / 2, 384, 0, 256, 262, 0, 224)
- MCFG_SCREEN_UPDATE_DRIVER(skydiver_state, screen_update)
- MCFG_SCREEN_PALETTE(m_palette)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_raw(12.096_MHz_XTAL / 2, 384, 0, 256, 262, 0, 224);
+ screen.set_screen_update(FUNC(skydiver_state::screen_update));
+ screen.set_palette(m_palette);
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, m_palette, gfx_skydiver)
+ GFXDECODE(config, m_gfxdecode, m_palette, gfx_skydiver);
PALETTE(config, m_palette, FUNC(skydiver_state::skydiver_palette), ARRAY_LENGTH(colortable_source));
/* sound hardware */
SPEAKER(config, "mono").front_center();
DISCRETE(config, m_discrete, skydiver_discrete).add_route(ALL_OUTPUTS, "mono", 1.0);
-MACHINE_CONFIG_END
+}
diff --git a/src/mame/drivers/skyfox.cpp b/src/mame/drivers/skyfox.cpp
index d54509276fb..52124948780 100644
--- a/src/mame/drivers/skyfox.cpp
+++ b/src/mame/drivers/skyfox.cpp
@@ -222,24 +222,24 @@ void skyfox_state::machine_reset()
m_bg_ctrl = 0;
}
-MACHINE_CONFIG_START(skyfox_state::skyfox)
-
+void skyfox_state::skyfox(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, XTAL(8'000'000)/2) /* Verified at 4MHz */
- MCFG_DEVICE_PROGRAM_MAP(skyfox_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", skyfox_state, skyfox_interrupt)
+ Z80(config, m_maincpu, XTAL(8'000'000)/2); /* Verified at 4MHz */
+ m_maincpu->set_addrmap(AS_PROGRAM, &skyfox_state::skyfox_map);
+ m_maincpu->set_vblank_int("screen", FUNC(skyfox_state::skyfox_interrupt));
- MCFG_DEVICE_ADD("audiocpu", Z80, XTAL(14'318'181)/8) /* Verified at 1.789772MHz */
- MCFG_DEVICE_PROGRAM_MAP(skyfox_sound_map)
+ Z80(config, m_audiocpu, XTAL(14'318'181)/8); /* Verified at 1.789772MHz */
+ m_audiocpu->set_addrmap(AS_PROGRAM, &skyfox_state::skyfox_sound_map);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(62.65)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */)
- MCFG_SCREEN_SIZE(512, 256)
- MCFG_SCREEN_VISIBLE_AREA(0+0x60, 320-1+0x60, 0+16, 256-1-16) // from $30*2 to $CC*2+8
- MCFG_SCREEN_UPDATE_DRIVER(skyfox_state, screen_update_skyfox)
- MCFG_SCREEN_PALETTE(m_palette)
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_refresh_hz(62.65);
+ m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(2500) /* not accurate */);
+ m_screen->set_size(512, 256);
+ m_screen->set_visarea(0+0x60, 320-1+0x60, 0+16, 256-1-16); // from $30*2 to $CC*2+8
+ m_screen->set_screen_update(FUNC(skyfox_state::screen_update_skyfox));
+ m_screen->set_palette(m_palette);
GFXDECODE(config, m_gfxdecode, m_palette, gfx_skyfox);
PALETTE(config, m_palette, FUNC(skyfox_state::skyfox_palette), 256+256); // 256 static colors (+256 for the background??)
@@ -249,12 +249,10 @@ MACHINE_CONFIG_START(skyfox_state::skyfox)
GENERIC_LATCH_8(config, m_soundlatch);
- MCFG_DEVICE_ADD("ym1", YM2203, XTAL(14'318'181)/8) /* Verified at 1.789772MHz */
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.80)
+ YM2203(config, "ym1", XTAL(14'318'181)/8).add_route(ALL_OUTPUTS, "mono", 0.80); /* Verified at 1.789772MHz */
- MCFG_DEVICE_ADD("ym2", YM2203, XTAL(14'318'181)/8) /* Verified at 1.789772MHz */
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.80)
-MACHINE_CONFIG_END
+ YM2203(config, "ym2", XTAL(14'318'181)/8).add_route(ALL_OUTPUTS, "mono", 0.80); /* Verified at 1.789772MHz */
+}
diff --git a/src/mame/drivers/skylncr.cpp b/src/mame/drivers/skylncr.cpp
index 0bbceeabed6..3ef552923fb 100644
--- a/src/mame/drivers/skylncr.cpp
+++ b/src/mame/drivers/skylncr.cpp
@@ -1645,13 +1645,13 @@ INTERRUPT_GEN_MEMBER(skylncr_state::skylncr_vblank_interrupt)
* Machine Driver *
*************************************/
-MACHINE_CONFIG_START(skylncr_state::skylncr)
-
+void skylncr_state::skylncr(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, MASTER_CLOCK/4)
- MCFG_DEVICE_PROGRAM_MAP(mem_map_skylncr)
- MCFG_DEVICE_IO_MAP(io_map_skylncr)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", skylncr_state, skylncr_vblank_interrupt)
+ Z80(config, m_maincpu, MASTER_CLOCK/4);
+ m_maincpu->set_addrmap(AS_PROGRAM, &skylncr_state::mem_map_skylncr);
+ m_maincpu->set_addrmap(AS_IO, &skylncr_state::io_map_skylncr);
+ m_maincpu->set_vblank_int("screen", FUNC(skylncr_state::skylncr_vblank_interrupt));
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
@@ -1666,19 +1666,19 @@ MACHINE_CONFIG_START(skylncr_state::skylncr)
ppi1.in_pb_callback().set_ioport("IN3");
ppi1.in_pc_callback().set_ioport("IN4");
- MCFG_TICKET_DISPENSER_ADD("hopper", attotime::from_msec(HOPPER_PULSE), TICKET_MOTOR_ACTIVE_HIGH, TICKET_STATUS_ACTIVE_HIGH)
+ TICKET_DISPENSER(config, m_hopper, attotime::from_msec(HOPPER_PULSE), TICKET_MOTOR_ACTIVE_HIGH, TICKET_STATUS_ACTIVE_HIGH);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(512, 256)
- MCFG_SCREEN_VISIBLE_AREA(0, 512-1, 0, 256-1)
- MCFG_SCREEN_UPDATE_DRIVER(skylncr_state, screen_update_skylncr)
- MCFG_SCREEN_PALETTE("palette")
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(512, 256);
+ screen.set_visarea(0, 512-1, 0, 256-1);
+ screen.set_screen_update(FUNC(skylncr_state::screen_update_skylncr));
+ screen.set_palette(m_palette);
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_skylncr)
- MCFG_PALETTE_ADD("palette", 0x200)
+ GFXDECODE(config, m_gfxdecode, m_palette, gfx_skylncr);
+ PALETTE(config, m_palette).set_entries(0x200);
ramdac_device &ramdac(RAMDAC(config, "ramdac", 0, m_palette));
ramdac.set_addrmap(0, &skylncr_state::ramdac_map);
@@ -1694,44 +1694,42 @@ MACHINE_CONFIG_START(skylncr_state::skylncr)
aysnd.port_a_read_callback().set_ioport("DSW3");
aysnd.port_b_read_callback().set_ioport("DSW4");
aysnd.add_route(ALL_OUTPUTS, "mono", 1.0);
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(skylncr_state::mbutrfly)
+void skylncr_state::mbutrfly(machine_config &config)
+{
skylncr(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_IO_MAP(io_map_mbutrfly)
-MACHINE_CONFIG_END
+ m_maincpu->set_addrmap(AS_IO, &skylncr_state::io_map_mbutrfly);
+}
-MACHINE_CONFIG_START(skylncr_state::neraidou)
+void skylncr_state::neraidou(machine_config &config)
+{
skylncr(config);
- /* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_GFXDECODE_MODIFY("gfxdecode", gfx_neraidou)
-MACHINE_CONFIG_END
+ m_gfxdecode->set_info(gfx_neraidou);
+}
-MACHINE_CONFIG_START(skylncr_state::sstar97)
+void skylncr_state::sstar97(machine_config &config)
+{
skylncr(config);
- /* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_GFXDECODE_MODIFY("gfxdecode", gfx_sstar97)
-MACHINE_CONFIG_END
+ m_gfxdecode->set_info(gfx_sstar97);
+}
-MACHINE_CONFIG_START(skylncr_state::bdream97)
+void skylncr_state::bdream97(machine_config &config)
+{
skylncr(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_OPCODES_MAP(bdream97_opcode_map)
+ m_maincpu->set_addrmap(AS_OPCODES, &skylncr_state::bdream97_opcode_map);
- MCFG_GFXDECODE_MODIFY("gfxdecode", gfx_bdream97)
-MACHINE_CONFIG_END
+ m_gfxdecode->set_info(gfx_bdream97);
+}
/**********************************
diff --git a/src/mame/drivers/skyraid.cpp b/src/mame/drivers/skyraid.cpp
index 8d5940354dc..d04de7654ea 100644
--- a/src/mame/drivers/skyraid.cpp
+++ b/src/mame/drivers/skyraid.cpp
@@ -222,25 +222,25 @@ static GFXDECODE_START( gfx_skyraid )
GFXDECODE_END
-MACHINE_CONFIG_START(skyraid_state::skyraid)
-
+void skyraid_state::skyraid(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M6502, 12096000 / 12)
- MCFG_DEVICE_PROGRAM_MAP(skyraid_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", skyraid_state, irq0_line_hold)
+ M6502(config, m_maincpu, 12096000 / 12);
+ m_maincpu->set_addrmap(AS_PROGRAM, &skyraid_state::skyraid_map);
+ m_maincpu->set_vblank_int("screen", FUNC(skyraid_state::irq0_line_hold));
WATCHDOG_TIMER(config, "watchdog").set_vblank_count("screen", 4);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(22 * 1000000 / 15750))
- MCFG_SCREEN_SIZE(512, 240)
- MCFG_SCREEN_VISIBLE_AREA(0, 511, 0, 239)
- MCFG_SCREEN_UPDATE_DRIVER(skyraid_state, screen_update_skyraid)
- MCFG_SCREEN_PALETTE(m_palette)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(22 * 1000000 / 15750));
+ screen.set_size(512, 240);
+ screen.set_visarea(0, 511, 0, 239);
+ screen.set_screen_update(FUNC(skyraid_state::screen_update_skyraid));
+ screen.set_palette(m_palette);
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, m_palette, gfx_skyraid)
+ GFXDECODE(config, m_gfxdecode, m_palette, gfx_skyraid);
PALETTE(config, m_palette, FUNC(skyraid_state::skyraid_palette), 20);
@@ -248,7 +248,7 @@ MACHINE_CONFIG_START(skyraid_state::skyraid)
SPEAKER(config, "mono").front_center();
DISCRETE(config, m_discrete, skyraid_discrete).add_route(ALL_OUTPUTS, "mono", 1.0);
-MACHINE_CONFIG_END
+}
ROM_START( skyraid )
diff --git a/src/mame/drivers/slapfght.cpp b/src/mame/drivers/slapfght.cpp
index 2aae8d40ba2..b9815e7d36e 100644
--- a/src/mame/drivers/slapfght.cpp
+++ b/src/mame/drivers/slapfght.cpp
@@ -889,12 +889,12 @@ GFXDECODE_END
***************************************************************************/
-MACHINE_CONFIG_START(slapfght_state::perfrman)
-
+void slapfght_state::perfrman(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, XTAL(16'000'000)/4) // 4MHz? XTAL is known, divider is guessed
- MCFG_DEVICE_PROGRAM_MAP(perfrman_map)
- MCFG_DEVICE_IO_MAP(io_map_nomcu)
+ Z80(config, m_maincpu, XTAL(16'000'000)/4); // 4MHz? XTAL is known, divider is guessed
+ m_maincpu->set_addrmap(AS_PROGRAM, &slapfght_state::perfrman_map);
+ m_maincpu->set_addrmap(AS_IO, &slapfght_state::io_map_nomcu);
ls259_device &mainlatch(LS259(config, "mainlatch"));
mainlatch.q_out_cb<0>().set(FUNC(slapfght_state::sound_reset_w));
@@ -902,11 +902,11 @@ MACHINE_CONFIG_START(slapfght_state::perfrman)
mainlatch.q_out_cb<3>().set(FUNC(slapfght_state::irq_enable_w));
mainlatch.q_out_cb<6>().set(FUNC(slapfght_state::palette_bank_w));
- MCFG_DEVICE_ADD("audiocpu", Z80, XTAL(16'000'000)/8) // 2MHz? XTAL is known, divider is guessed
- MCFG_DEVICE_PROGRAM_MAP(perfrman_sound_map)
- MCFG_DEVICE_PERIODIC_INT_DRIVER(slapfght_state, sound_nmi, 240) // music speed, verified
+ Z80(config, m_audiocpu, XTAL(16'000'000)/8); // 2MHz? XTAL is known, divider is guessed
+ m_audiocpu->set_addrmap(AS_PROGRAM, &slapfght_state::perfrman_sound_map);
+ m_audiocpu->set_periodic_int(FUNC(slapfght_state::sound_nmi), attotime::from_hz(240)); // music speed, verified
- MCFG_QUANTUM_PERFECT_CPU("maincpu")
+ config.m_perfect_cpu_quantum = subtag("maincpu");
/* video hardware */
BUFFERED_SPRITERAM8(config, m_spriteram);
@@ -921,7 +921,7 @@ MACHINE_CONFIG_START(slapfght_state::perfrman)
m_screen->screen_vblank().append(FUNC(slapfght_state::vblank_irq));
m_screen->set_palette(m_palette);
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_perfrman)
+ GFXDECODE(config, m_gfxdecode, m_palette, gfx_perfrman);
PALETTE(config, m_palette, palette_device::RGB_444_PROMS, "proms", 256);
MCFG_VIDEO_START_OVERRIDE(slapfght_state, perfrman)
@@ -937,28 +937,28 @@ MACHINE_CONFIG_START(slapfght_state::perfrman)
ay2.port_a_read_callback().set_ioport("DSW1");
ay2.port_b_read_callback().set_ioport("DSW2");
ay2.add_route(ALL_OUTPUTS, "mono", 0.25);
-MACHINE_CONFIG_END
-
+}
-MACHINE_CONFIG_START(slapfght_state::tigerh)
+void slapfght_state::tigerh(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, XTAL(36'000'000)/6) // 6MHz
- MCFG_DEVICE_PROGRAM_MAP(tigerh_map_mcu)
- MCFG_DEVICE_IO_MAP(io_map_mcu)
+ Z80(config, m_maincpu, XTAL(36'000'000)/6); // 6MHz
+ m_maincpu->set_addrmap(AS_PROGRAM, &slapfght_state::tigerh_map_mcu);
+ m_maincpu->set_addrmap(AS_IO, &slapfght_state::io_map_mcu);
ls259_device &mainlatch(LS259(config, "mainlatch"));
mainlatch.q_out_cb<0>().set(FUNC(slapfght_state::sound_reset_w));
mainlatch.q_out_cb<1>().set(FUNC(slapfght_state::flipscreen_w));
mainlatch.q_out_cb<3>().set(FUNC(slapfght_state::irq_enable_w));
- MCFG_DEVICE_ADD("audiocpu", Z80, XTAL(36'000'000)/12) // 3MHz
- MCFG_DEVICE_PROGRAM_MAP(tigerh_sound_map)
- MCFG_DEVICE_PERIODIC_INT_DRIVER(slapfght_state, sound_nmi, 360) // music speed, verified with pcb recording
+ Z80(config, m_audiocpu, XTAL(36'000'000)/12); // 3MHz
+ m_audiocpu->set_addrmap(AS_PROGRAM, &slapfght_state::tigerh_sound_map);
+ m_audiocpu->set_periodic_int(FUNC(slapfght_state::sound_nmi), attotime::from_hz(360)); // music speed, verified with pcb recording
TAITO68705_MCU_TIGER(config, m_bmcu, 36_MHz_XTAL/12); // 3MHz
- MCFG_QUANTUM_PERFECT_CPU("maincpu")
+ config.m_perfect_cpu_quantum = subtag("maincpu");
/* video hardware */
BUFFERED_SPRITERAM8(config, m_spriteram);
@@ -973,7 +973,7 @@ MACHINE_CONFIG_START(slapfght_state::tigerh)
m_screen->screen_vblank().append(FUNC(slapfght_state::vblank_irq));
m_screen->set_palette(m_palette);
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_slapfght)
+ GFXDECODE(config, m_gfxdecode, m_palette, gfx_slapfght);
PALETTE(config, m_palette, palette_device::RGB_444_PROMS, "proms", 256);
MCFG_VIDEO_START_OVERRIDE(slapfght_state, slapfight)
@@ -989,34 +989,34 @@ MACHINE_CONFIG_START(slapfght_state::tigerh)
ay2.port_a_read_callback().set_ioport("DSW1");
ay2.port_b_read_callback().set_ioport("DSW2");
ay2.add_route(ALL_OUTPUTS, "mono", 0.25);
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(slapfght_state::tigerhb1)
+void slapfght_state::tigerhb1(machine_config &config)
+{
tigerh(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(tigerhb1_map)
- MCFG_DEVICE_IO_MAP(io_map_nomcu)
+ m_maincpu->set_addrmap(AS_PROGRAM, &slapfght_state::tigerhb1_map);
+ m_maincpu->set_addrmap(AS_IO, &slapfght_state::io_map_nomcu);
- MCFG_DEVICE_REMOVE("bmcu")
-MACHINE_CONFIG_END
+ config.device_remove("bmcu");
+}
-MACHINE_CONFIG_START(slapfght_state::tigerhb2)
+void slapfght_state::tigerhb2(machine_config &config)
+{
tigerhb1(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(tigerhb2_map)
-MACHINE_CONFIG_END
-
+ m_maincpu->set_addrmap(AS_PROGRAM, &slapfght_state::tigerhb2_map);
+}
-MACHINE_CONFIG_START(slapfght_state::slapfigh)
+void slapfght_state::slapfigh(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu",Z80, XTAL(36'000'000)/6) // 6MHz
- MCFG_DEVICE_PROGRAM_MAP(slapfigh_map_mcu)
- MCFG_DEVICE_IO_MAP(io_map_mcu)
+ Z80(config, m_maincpu, XTAL(36'000'000)/6); // 6MHz
+ m_maincpu->set_addrmap(AS_PROGRAM, &slapfght_state::slapfigh_map_mcu);
+ m_maincpu->set_addrmap(AS_IO, &slapfght_state::io_map_mcu);
ls259_device &mainlatch(LS259(config, "mainlatch"));
mainlatch.q_out_cb<0>().set(FUNC(slapfght_state::sound_reset_w));
@@ -1024,14 +1024,14 @@ MACHINE_CONFIG_START(slapfght_state::slapfigh)
mainlatch.q_out_cb<3>().set(FUNC(slapfght_state::irq_enable_w));
mainlatch.q_out_cb<4>().set_membank("bank1");
- MCFG_DEVICE_ADD("audiocpu", Z80, XTAL(36'000'000)/12) // 3MHz
- MCFG_DEVICE_PROGRAM_MAP(tigerh_sound_map)
- MCFG_DEVICE_PERIODIC_INT_DRIVER(slapfght_state, sound_nmi, 180)
+ Z80(config, m_audiocpu, XTAL(36'000'000)/12); // 3MHz
+ m_audiocpu->set_addrmap(AS_PROGRAM, &slapfght_state::tigerh_sound_map);
+ m_audiocpu->set_periodic_int(FUNC(slapfght_state::sound_nmi), attotime::from_hz(180));
TAITO68705_MCU(config, m_bmcu, 36_MHz_XTAL/12); // 3MHz
m_bmcu->aux_strobe_cb().set(FUNC(slapfght_state::scroll_from_mcu_w));
- MCFG_QUANTUM_PERFECT_CPU("maincpu")
+ config.m_perfect_cpu_quantum = subtag("maincpu");
/* video hardware */
BUFFERED_SPRITERAM8(config, m_spriteram);
@@ -1046,7 +1046,7 @@ MACHINE_CONFIG_START(slapfght_state::slapfigh)
m_screen->screen_vblank().append(FUNC(slapfght_state::vblank_irq));
m_screen->set_palette(m_palette);
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_slapfght)
+ GFXDECODE(config, m_gfxdecode, m_palette, gfx_slapfght);
PALETTE(config, m_palette, palette_device::RGB_444_PROMS, "proms", 256);
MCFG_VIDEO_START_OVERRIDE(slapfght_state, slapfight)
@@ -1062,43 +1062,43 @@ MACHINE_CONFIG_START(slapfght_state::slapfigh)
ay2.port_a_read_callback().set_ioport("DSW1");
ay2.port_b_read_callback().set_ioport("DSW2");
ay2.add_route(ALL_OUTPUTS, "mono", 0.25);
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(slapfght_state::slapfighb1)
+void slapfght_state::slapfighb1(machine_config &config)
+{
slapfigh(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(slapfighb1_map)
- MCFG_DEVICE_IO_MAP(io_map_nomcu)
+ m_maincpu->set_addrmap(AS_PROGRAM, &slapfght_state::slapfighb1_map);
+ m_maincpu->set_addrmap(AS_IO, &slapfght_state::io_map_nomcu);
- MCFG_DEVICE_REMOVE("bmcu")
-MACHINE_CONFIG_END
+ config.device_remove("bmcu");
+}
-MACHINE_CONFIG_START(slapfght_state::slapfighb2)
+void slapfght_state::slapfighb2(machine_config &config)
+{
slapfighb1(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(slapfighb2_map)
-MACHINE_CONFIG_END
+ m_maincpu->set_addrmap(AS_PROGRAM, &slapfght_state::slapfighb2_map);
+}
-MACHINE_CONFIG_START(slapfght_state::getstarb1)
+void slapfght_state::getstarb1(machine_config &config)
+{
slapfighb1(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_IO_MAP(getstarb1_io_map)
-MACHINE_CONFIG_END
+ m_maincpu->set_addrmap(AS_IO, &slapfght_state::getstarb1_io_map);
+}
-MACHINE_CONFIG_START(slapfght_state::getstarb2)
+void slapfght_state::getstarb2(machine_config &config)
+{
slapfighb1(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(getstar_map)
- MCFG_DEVICE_IO_MAP(getstarb2_io_map)
-MACHINE_CONFIG_END
+ m_maincpu->set_addrmap(AS_PROGRAM, &slapfght_state::getstar_map);
+ m_maincpu->set_addrmap(AS_IO, &slapfght_state::getstarb2_io_map);
+}
diff --git a/src/mame/drivers/slc1.cpp b/src/mame/drivers/slc1.cpp
index 9d02c12419c..2ed1575bdb4 100644
--- a/src/mame/drivers/slc1.cpp
+++ b/src/mame/drivers/slc1.cpp
@@ -13,6 +13,8 @@ This computer is both a Z80 trainer, and a chess computer.
There is no chess board attached. You supply your own
and you sync the pieces and the computer instructions.
+ The chess engine was copied from Fidelity's Sensory
+ Chess Challenger 8.
When started, it is in Chess mode. Press 11111 to switch to
Trainer mode.
@@ -56,6 +58,8 @@ Pasting doesn't work, but if it did...
#include "slc1.lh"
+namespace {
+
class slc1_state : public driver_device
{
public:
@@ -267,20 +271,20 @@ INPUT_PORTS_END
***************************************************************************/
-MACHINE_CONFIG_START(slc1_state::slc1)
+void slc1_state::slc1(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, 2500000)
- MCFG_DEVICE_PROGRAM_MAP(mem_map)
- MCFG_DEVICE_IO_MAP(io_map)
+ Z80(config, m_maincpu, 2500000);
+ m_maincpu->set_addrmap(AS_PROGRAM, &slc1_state::mem_map);
+ m_maincpu->set_addrmap(AS_IO, &slc1_state::io_map);
/* video hardware */
config.set_default_layout(layout_slc1);
/* sound hardware */
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("speaker", SPEAKER_SOUND)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.50)
-MACHINE_CONFIG_END
+ SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.50);
+}
/***************************************************************************
@@ -297,6 +301,8 @@ ROM_START(slc1)
ROMX_LOAD("sc1-v2.bin", 0x0000, 0x1000, CRC(1f122a85) SHA1(d60f89f8b59d04f4cecd6e3ecfe0a24152462a36), ROM_BIOS(1))
ROM_END
+} // anonymous namespace
+
-/* YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME */
-COMP( 1989, slc1, 0, 0, slc1, slc1, slc1_state, empty_init, "Dr. Dieter Scheuschner", "SLC-1" , 0 )
+/* YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME */
+COMP( 1989, slc1, 0, 0, slc1, slc1, slc1_state, empty_init, "Dieter Scheuschner", "Schach- und Lerncomputer SLC 1", 0 )
diff --git a/src/mame/drivers/slc1a.cpp b/src/mame/drivers/slc1a.cpp
new file mode 100644
index 00000000000..6009bfead12
--- /dev/null
+++ b/src/mame/drivers/slc1a.cpp
@@ -0,0 +1,212 @@
+// license:BSD-3-Clause
+// copyright-holders:Sandro Ronco
+/***************************************************************************
+
+This appears to be a prototype or alternate version of SLC 1.
+The ROM was first assumed to be VEB SC 1, but unfortunately it isn't.
+
+TODO:
+- merge with slc1.cpp? but hardware differs too much
+- any way to access the "Lern" part?
+- speaker, it's very noisy if hooked up as it is now
+- LED(s)? they're not on digit d7
+- 7seg sometimes flashes
+
+****************************************************************************/
+
+#include "emu.h"
+#include "cpu/z80/z80.h"
+#include "machine/z80pio.h"
+#include "sound/dac.h"
+#include "sound/volt_reg.h"
+#include "speaker.h"
+
+#include "slc1a.lh"
+
+
+namespace {
+
+class slc1_state : public driver_device
+{
+public:
+ slc1_state(const machine_config &mconfig, device_type type, const char *tag) :
+ driver_device(mconfig, type, tag),
+ m_maincpu(*this, "maincpu"),
+ m_pio(*this, "z80pio"),
+ m_dac(*this, "dac"),
+ m_keypad(*this, "LINE%u", 1),
+ m_digits(*this, "digit%u", 0U)
+ { }
+
+ void slc1(machine_config &config);
+
+protected:
+ virtual void machine_start() override;
+
+private:
+ required_device<cpu_device> m_maincpu;
+ required_device<z80pio_device> m_pio;
+ required_device<dac_bit_interface> m_dac;
+ required_ioport_array<8> m_keypad;
+
+ output_finder<4> m_digits;
+
+ void main_io(address_map &map);
+ void main_map(address_map &map);
+
+ uint8_t m_matrix;
+
+ DECLARE_WRITE8_MEMBER(matrix_w);
+ DECLARE_WRITE8_MEMBER(pio_port_a_w);
+ DECLARE_READ8_MEMBER(pio_port_b_r);
+};
+
+void slc1_state::machine_start()
+{
+ m_digits.resolve();
+
+ m_matrix = 0;
+ save_item(NAME(m_matrix));
+}
+
+/***************************************************************************
+
+ Display
+
+***************************************************************************/
+
+WRITE8_MEMBER(slc1_state::pio_port_a_w)
+{
+ // digit segment data
+ uint8_t digit = bitswap<8>(data,3,4,6,0,1,2,7,5);
+
+ if (m_matrix & 0x04)
+ m_digits[3] = digit;
+ if (m_matrix & 0x08)
+ m_digits[2] = digit;
+ if (m_matrix & 0x10)
+ m_digits[1] = digit;
+ if (m_matrix & 0x20)
+ m_digits[0] = digit;
+}
+
+
+/***************************************************************************
+
+ Keyboard
+
+***************************************************************************/
+
+WRITE8_MEMBER(slc1_state::matrix_w)
+{
+ // d1: speaker out
+ //m_dac->write(BIT(data, 1));
+
+ // keypad/led mux
+ m_matrix = data;
+}
+
+READ8_MEMBER(slc1_state::pio_port_b_r)
+{
+ uint8_t data = 0;
+
+ // read keypad matrix
+ for (int i = 0; i < 8; i++)
+ if (BIT(m_matrix, i))
+ data |= m_keypad[i]->read();
+
+ return data;
+}
+
+
+void slc1_state::main_map(address_map &map)
+{
+ map.unmap_value_high();
+ map(0x0000, 0x0fff).rom();
+ map(0x4000, 0x43ff).ram();
+}
+
+void slc1_state::main_io(address_map &map)
+{
+ map.unmap_value_high();
+ map.global_mask(0xff);
+ map(0x80, 0x83).rw(m_pio, FUNC(z80pio_device::read_alt), FUNC(z80pio_device::write_alt));
+ map(0xfc, 0xfc).w(FUNC(slc1_state::matrix_w));
+}
+
+
+/* Input ports */
+
+static INPUT_PORTS_START( slc1 )
+ PORT_START("LINE1")
+ PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_UNUSED)
+ PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("D4 T") PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_CODE(KEYCODE_D)
+
+ PORT_START("LINE2")
+ PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("B2 S") PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_CODE(KEYCODE_B)
+ PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("F6 K") PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_CODE(KEYCODE_F)
+
+ PORT_START("LINE3")
+ PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("C3 L") PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_CODE(KEYCODE_C)
+ PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("G7") PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_CODE(KEYCODE_G)
+
+ PORT_START("LINE4")
+ PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("A1 B") PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_CODE(KEYCODE_A)
+ PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("E5 D") PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_CODE(KEYCODE_E)
+
+ PORT_START("LINE5")
+ PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("H8") PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_CODE(KEYCODE_H)
+ PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("C") PORT_CODE(KEYCODE_R)
+
+ PORT_START("LINE6")
+ PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_UNUSED)
+ PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("A") PORT_CODE(KEYCODE_O)
+
+ PORT_START("LINE7")
+ PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_UNUSED)
+ PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Z") PORT_CODE(KEYCODE_Z) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD)
+
+ PORT_START("LINE8")
+ PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_UNUSED)
+ PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("St") PORT_CODE(KEYCODE_S) PORT_CODE(KEYCODE_BACKSPACE) PORT_CODE(KEYCODE_DEL)
+INPUT_PORTS_END
+
+
+/* Machine config */
+
+void slc1_state::slc1(machine_config &config)
+{
+ /* basic machine hardware */
+ Z80(config, m_maincpu, 2500000); // U880 Z80 clone
+ m_maincpu->set_addrmap(AS_PROGRAM, &slc1_state::main_map);
+ m_maincpu->set_addrmap(AS_IO, &slc1_state::main_io);
+
+ /* video hardware */
+ config.set_default_layout(layout_slc1a);
+
+ /* devices */
+ Z80PIO(config, m_pio, 2500000);
+ m_pio->out_pa_callback().set(FUNC(slc1_state::pio_port_a_w));
+ m_pio->in_pb_callback().set(FUNC(slc1_state::pio_port_b_r));
+
+ /* sound hardware */
+ SPEAKER(config, "speaker").front_center();
+ DAC_1BIT(config, m_dac).add_route(ALL_OUTPUTS, "speaker", 0.25);
+ VOLTAGE_REGULATOR(config, "vref").add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT);
+}
+
+
+/* ROM definition */
+
+ROM_START( slc1a )
+ ROM_REGION( 0x10000, "maincpu", ROMREGION_ERASEFF )
+ ROM_LOAD( "sc1.rom", 0x0000, 0x1000, CRC(26965b23) SHA1(01568911446eda9f05ec136df53da147b7c6f2bf))
+ROM_END
+
+} // anonymous namespace
+
+
+/* Driver */
+
+// YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS
+COMP( 1989, slc1a, slc1, 0, slc1, slc1, slc1_state, empty_init, "Dieter Scheuschner", "Schach- und Lerncomputer SLC 1 (prototype?)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_SUPPORTS_SAVE )
diff --git a/src/mame/drivers/sleic.cpp b/src/mame/drivers/sleic.cpp
index 92681d38aba..35775bad8bd 100644
--- a/src/mame/drivers/sleic.cpp
+++ b/src/mame/drivers/sleic.cpp
@@ -67,11 +67,12 @@ void sleic_state::init_sleic()
{
}
-MACHINE_CONFIG_START(sleic_state::sleic)
+void sleic_state::sleic(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", I8088, 8000000)
- MCFG_DEVICE_PROGRAM_MAP(sleic_map)
-MACHINE_CONFIG_END
+ I8088(config, m_maincpu, 8000000);
+ m_maincpu->set_addrmap(AS_PROGRAM, &sleic_state::sleic_map);
+}
/*-------------------------------------------------------------------
/ Bike Race (1992)
diff --git a/src/mame/drivers/slicer.cpp b/src/mame/drivers/slicer.cpp
index cc388934a9d..47e5762fdaf 100644
--- a/src/mame/drivers/slicer.cpp
+++ b/src/mame/drivers/slicer.cpp
@@ -98,16 +98,17 @@ static void slicer_floppies(device_slot_interface &device)
device.option_add("8dsdd", FLOPPY_8_DSDD);
}
-MACHINE_CONFIG_START(slicer_state::slicer)
- MCFG_DEVICE_ADD("maincpu", I80186, 16_MHz_XTAL / 2)
- MCFG_DEVICE_PROGRAM_MAP(slicer_map)
- MCFG_DEVICE_IO_MAP(slicer_io)
+void slicer_state::slicer(machine_config &config)
+{
+ i80186_cpu_device &maincpu(I80186(config, "maincpu", 16_MHz_XTAL / 2));
+ maincpu.set_addrmap(AS_PROGRAM, &slicer_state::slicer_map);
+ maincpu.set_addrmap(AS_IO, &slicer_state::slicer_io);
- MCFG_DEVICE_ADD("duart", SCN2681, 3.6864_MHz_XTAL)
- MCFG_MC68681_IRQ_CALLBACK(WRITELINE("maincpu", i80186_cpu_device, int0_w))
- MCFG_MC68681_A_TX_CALLBACK(WRITELINE("rs232_1", rs232_port_device, write_txd))
- MCFG_MC68681_B_TX_CALLBACK(WRITELINE("rs232_2", rs232_port_device, write_txd))
- MCFG_MC68681_OUTPORT_CALLBACK(WRITE8(*this, slicer_state, sio_out_w))
+ scn2681_device &duart(SCN2681(config, "duart", 3.6864_MHz_XTAL));
+ duart.irq_cb().set("maincpu", FUNC(i80186_cpu_device::int0_w));
+ duart.a_tx_cb().set("rs232_1", FUNC(rs232_port_device::write_txd));
+ duart.b_tx_cb().set("rs232_2", FUNC(rs232_port_device::write_txd));
+ duart.outport_cb().set(FUNC(slicer_state::sio_out_w));
rs232_port_device &rs232_1(RS232_PORT(config, "rs232_1", default_rs232_devices, "terminal"));
rs232_1.rxd_handler().set("duart", FUNC(scn2681_device::rx_a_w));
@@ -117,10 +118,10 @@ MACHINE_CONFIG_START(slicer_state::slicer)
FD1797(config, m_fdc, 16_MHz_XTAL / 2 / 8);
m_fdc->intrq_wr_callback().set("maincpu", FUNC(i80186_cpu_device::int1_w));
m_fdc->drq_wr_callback().set("maincpu", FUNC(i80186_cpu_device::drq0_w));
- MCFG_FLOPPY_DRIVE_ADD("fdc:0", slicer_floppies, "525dd", floppy_image_device::default_floppy_formats)
- MCFG_FLOPPY_DRIVE_ADD("fdc:1", slicer_floppies, nullptr, floppy_image_device::default_floppy_formats)
- MCFG_FLOPPY_DRIVE_ADD("fdc:2", slicer_floppies, nullptr, floppy_image_device::default_floppy_formats)
- MCFG_FLOPPY_DRIVE_ADD("fdc:3", slicer_floppies, nullptr, floppy_image_device::default_floppy_formats)
+ FLOPPY_CONNECTOR(config, "fdc:0", slicer_floppies, "525dd", floppy_image_device::default_floppy_formats);
+ FLOPPY_CONNECTOR(config, "fdc:1", slicer_floppies, nullptr, floppy_image_device::default_floppy_formats);
+ FLOPPY_CONNECTOR(config, "fdc:2", slicer_floppies, nullptr, floppy_image_device::default_floppy_formats);
+ FLOPPY_CONNECTOR(config, "fdc:3", slicer_floppies, nullptr, floppy_image_device::default_floppy_formats);
ls259_device &drivelatch(LS259(config, "drivelatch")); // U29
drivelatch.q_out_cb<0>().set("sasi", FUNC(scsi_port_device::write_sel));
@@ -132,18 +133,19 @@ MACHINE_CONFIG_START(slicer_state::slicer)
drivelatch.q_out_cb<6>().set(FUNC(slicer_state::drive_size_w));
drivelatch.q_out_cb<7>().set("fdc", FUNC(fd1797_device::dden_w));
- MCFG_DEVICE_ADD("sasi", SCSI_PORT, 0)
- MCFG_SCSI_DATA_INPUT_BUFFER("sasi_data_in")
- MCFG_SCSI_BSY_HANDLER(WRITELINE("sasi_ctrl_in", input_buffer_device, write_bit3))
- MCFG_SCSI_MSG_HANDLER(WRITELINE("sasi_ctrl_in", input_buffer_device, write_bit4))
- MCFG_SCSI_CD_HANDLER(WRITELINE("sasi_ctrl_in", input_buffer_device, write_bit5))
- MCFG_SCSI_REQ_HANDLER(WRITELINE("sasi_ctrl_in", input_buffer_device, write_bit6))
- MCFG_SCSI_IO_HANDLER(WRITELINE("sasi_ctrl_in", input_buffer_device, write_bit7))
-
- MCFG_SCSI_OUTPUT_LATCH_ADD("sasi_data_out", "sasi")
- MCFG_DEVICE_ADD("sasi_data_in", INPUT_BUFFER, 0)
- MCFG_DEVICE_ADD("sasi_ctrl_in", INPUT_BUFFER, 0)
-MACHINE_CONFIG_END
+ SCSI_PORT(config, m_sasi, 0);
+ m_sasi->set_data_input_buffer("sasi_data_in");
+ m_sasi->bsy_handler().set("sasi_ctrl_in", FUNC(input_buffer_device::write_bit3));
+ m_sasi->msg_handler().set("sasi_ctrl_in", FUNC(input_buffer_device::write_bit4));
+ m_sasi->cd_handler().set("sasi_ctrl_in", FUNC(input_buffer_device::write_bit5));
+ m_sasi->req_handler().set("sasi_ctrl_in", FUNC(input_buffer_device::write_bit6));
+ m_sasi->io_handler().set("sasi_ctrl_in", FUNC(input_buffer_device::write_bit7));
+
+ output_latch_device &sasi_data_out(OUTPUT_LATCH(config, "sasi_data_out"));
+ m_sasi->set_output_latch(sasi_data_out);
+ INPUT_BUFFER(config, "sasi_data_in");
+ INPUT_BUFFER(config, "sasi_ctrl_in");
+}
ROM_START( slicer )
ROM_REGION(0x8001, "bios", 0)
diff --git a/src/mame/drivers/sliver.cpp b/src/mame/drivers/sliver.cpp
index 28621979a7c..6b40485c904 100644
--- a/src/mame/drivers/sliver.cpp
+++ b/src/mame/drivers/sliver.cpp
@@ -516,11 +516,13 @@ TIMER_DEVICE_CALLBACK_MEMBER ( sliver_state::obj_irq_cb )
m_maincpu->set_input_line(3, HOLD_LINE);
}
-MACHINE_CONFIG_START(sliver_state::sliver)
- MCFG_DEVICE_ADD("maincpu", M68000, 12000000)
- MCFG_DEVICE_PROGRAM_MAP(sliver_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", sliver_state, irq4_line_hold)
- MCFG_TIMER_DRIVER_ADD_PERIODIC("obj_actel", sliver_state, obj_irq_cb, attotime::from_hz(60)) /* unknown clock, causes "obj actel ready error" without this */
+void sliver_state::sliver(machine_config &config)
+{
+ M68000(config, m_maincpu, 12000000);
+ m_maincpu->set_addrmap(AS_PROGRAM, &sliver_state::sliver_map);
+ m_maincpu->set_vblank_int("screen", FUNC(sliver_state::irq4_line_hold));
+
+ TIMER(config, "obj_actel").configure_periodic(FUNC(sliver_state::obj_irq_cb), attotime::from_hz(60)); /* unknown clock, causes "obj actel ready error" without this */
// irq 2 valid but not used?
I8051(config, m_audiocpu, 8000000);
@@ -528,14 +530,14 @@ MACHINE_CONFIG_START(sliver_state::sliver)
m_audiocpu->set_addrmap(AS_IO, &sliver_state::soundmem_io);
m_audiocpu->port_out_cb<1>().set(FUNC(sliver_state::oki_setbank));
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500))
- MCFG_SCREEN_SIZE(64*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 384-1-16, 0*8, 240-1)
- MCFG_SCREEN_UPDATE_DRIVER(sliver_state, screen_update)
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_refresh_hz(60);
+ m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(2500));
+ m_screen->set_size(64*8, 32*8);
+ m_screen->set_visarea(0*8, 384-1-16, 0*8, 240-1);
+ m_screen->set_screen_update(FUNC(sliver_state::screen_update));
- MCFG_PALETTE_ADD("palette", 0x100)
+ PALETTE(config, "palette").set_entries(0x100);
ramdac_device &ramdac(RAMDAC(config, "ramdac", 0, "palette"));
ramdac.set_addrmap(0, &sliver_state::ramdac_map);
@@ -544,11 +546,11 @@ MACHINE_CONFIG_START(sliver_state::sliver)
GENERIC_LATCH_8(config, m_soundlatch);
- MCFG_DEVICE_ADD("oki", OKIM6295, 1000000, okim6295_device::PIN7_HIGH)
- MCFG_DEVICE_ADDRESS_MAP(0, oki_map)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 0.6)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 0.6)
-MACHINE_CONFIG_END
+ okim6295_device &oki(OKIM6295(config, "oki", 1000000, okim6295_device::PIN7_HIGH));
+ oki.set_addrmap(0, &sliver_state::oki_map);
+ oki.add_route(ALL_OUTPUTS, "lspeaker", 0.6);
+ oki.add_route(ALL_OUTPUTS, "rspeaker", 0.6);
+}
ROM_START( sliver )
ROM_REGION( 0x100000, "maincpu", 0 ) /* 68000 Code */
diff --git a/src/mame/drivers/slotcarn.cpp b/src/mame/drivers/slotcarn.cpp
index 6297b40a6d9..989ce132421 100644
--- a/src/mame/drivers/slotcarn.cpp
+++ b/src/mame/drivers/slotcarn.cpp
@@ -543,12 +543,12 @@ void slotcarn_state::machine_start()
* Machine Driver *
***********************************/
-MACHINE_CONFIG_START(slotcarn_state::slotcarn)
-
+void slotcarn_state::slotcarn(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, CPU_CLOCK) // 2.5 Mhz?
- MCFG_DEVICE_PROGRAM_MAP(slotcarn_map)
- MCFG_DEVICE_IO_MAP(spielbud_io_map)
+ Z80(config, m_maincpu, CPU_CLOCK); // 2.5 Mhz?
+ m_maincpu->set_addrmap(AS_PROGRAM, &slotcarn_state::slotcarn_map);
+ m_maincpu->set_addrmap(AS_IO, &slotcarn_state::spielbud_io_map);
i8255_device &ppi0(I8255A(config, "ppi8255_0"));
ppi0.in_pa_callback().set_ioport("IN0");
@@ -563,9 +563,9 @@ MACHINE_CONFIG_START(slotcarn_state::slotcarn)
ppi2.in_pb_callback().set_ioport("IN4");
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_RAW_PARAMS(PIXEL_CLOCK, 512, 0, 512, 256, 0, 256) /* temporary, CRTC will configure screen */
- MCFG_SCREEN_UPDATE_DEVICE("crtc", mc6845_device, screen_update)
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_raw(PIXEL_CLOCK, 512, 0, 512, 256, 0, 256); /* temporary, CRTC will configure screen */
+ m_screen->set_screen_update("crtc", FUNC(mc6845_device::screen_update));
mc6845_device &crtc(MC6845(config, "crtc", CRTC_CLOCK));
crtc.set_screen(m_screen);
@@ -576,8 +576,8 @@ MACHINE_CONFIG_START(slotcarn_state::slotcarn)
crtc.out_hsync_callback().set(FUNC(slotcarn_state::hsync_changed));
crtc.out_vsync_callback().set_inputline(m_maincpu, 0);
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_slotcarn)
- MCFG_PALETTE_ADD("palette", 0x400)
+ GFXDECODE(config, "gfxdecode", "palette", gfx_slotcarn);
+ PALETTE(config, "palette").set_entries(0x400);
/* sound hardware */
SPEAKER(config, "mono").front_center();
@@ -585,7 +585,7 @@ MACHINE_CONFIG_START(slotcarn_state::slotcarn)
ay8910_device &aysnd(AY8910(config, "aysnd", SND_CLOCK));
aysnd.port_b_read_callback().set_ioport("DSW2");
aysnd.add_route(ALL_OUTPUTS, "mono", 0.50);
-MACHINE_CONFIG_END
+}
/******************************
diff --git a/src/mame/drivers/sm1800.cpp b/src/mame/drivers/sm1800.cpp
index 28c674285d3..5567f5bbbae 100644
--- a/src/mame/drivers/sm1800.cpp
+++ b/src/mame/drivers/sm1800.cpp
@@ -160,24 +160,25 @@ static GFXDECODE_START( gfx_sm1800 )
GFXDECODE_END
-MACHINE_CONFIG_START(sm1800_state::sm1800)
+void sm1800_state::sm1800(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu",I8080, XTAL(2'000'000))
- MCFG_DEVICE_PROGRAM_MAP(sm1800_mem)
- MCFG_DEVICE_IO_MAP(sm1800_io)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", sm1800_state, sm1800_vblank_interrupt)
- MCFG_DEVICE_IRQ_ACKNOWLEDGE_DRIVER(sm1800_state,sm1800_irq_callback)
+ I8080(config, m_maincpu, XTAL(2'000'000));
+ m_maincpu->set_addrmap(AS_PROGRAM, &sm1800_state::sm1800_mem);
+ m_maincpu->set_addrmap(AS_IO, &sm1800_state::sm1800_io);
+ m_maincpu->set_vblank_int("screen", FUNC(sm1800_state::sm1800_vblank_interrupt));
+ m_maincpu->set_irq_acknowledge_callback(FUNC(sm1800_state::sm1800_irq_callback));
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_UPDATE_DEVICE("i8275", i8275_device, screen_update)
- MCFG_SCREEN_REFRESH_RATE(50)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */
- MCFG_SCREEN_SIZE(640, 480)
- MCFG_SCREEN_VISIBLE_AREA(0, 640-1, 0, 480-1)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_screen_update("i8275", FUNC(i8275_device::screen_update));
+ screen.set_refresh_hz(50);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */
+ screen.set_size(640, 480);
+ screen.set_visarea(0, 640-1, 0, 480-1);
PALETTE(config, m_palette, FUNC(sm1800_state::sm1800_palette), 3);
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, m_palette, gfx_sm1800)
+ GFXDECODE(config, "gfxdecode", m_palette, gfx_sm1800);
/* Devices */
I8255(config, m_ppi);
@@ -186,12 +187,12 @@ MACHINE_CONFIG_START(sm1800_state::sm1800)
m_ppi->in_pc_callback().set(FUNC(sm1800_state::sm1800_8255_portc_r));
m_ppi->out_pc_callback().set(FUNC(sm1800_state::sm1800_8255_portc_w));
- MCFG_DEVICE_ADD("i8275", I8275, 2000000)
- MCFG_I8275_CHARACTER_WIDTH(8)
- MCFG_I8275_DRAW_CHARACTER_CALLBACK_OWNER(sm1800_state, crtc_display_pixels)
+ I8275(config, m_crtc, 2000000);
+ m_crtc->set_character_width(8);
+ m_crtc->set_display_callback(FUNC(sm1800_state::crtc_display_pixels), this);
- MCFG_DEVICE_ADD("i8251", I8251, 0)
-MACHINE_CONFIG_END
+ I8251(config, m_uart, 0);
+}
/* ROM definition */
ROM_START( sm1800 )
diff --git a/src/mame/drivers/sm7238.cpp b/src/mame/drivers/sm7238.cpp
index ab77077b35f..609d984f36c 100644
--- a/src/mame/drivers/sm7238.cpp
+++ b/src/mame/drivers/sm7238.cpp
@@ -360,24 +360,25 @@ void sm7238_state::sm7238_palette(palette_device &palette) const
palette.set_pen_color(2, 0x00, 0xff, 0x00); // highlight
}
-MACHINE_CONFIG_START(sm7238_state::sm7238)
- MCFG_DEVICE_ADD("maincpu", I8080, 16.5888_MHz_XTAL/9)
- MCFG_DEVICE_PROGRAM_MAP(sm7238_mem)
- MCFG_DEVICE_IO_MAP(sm7238_io)
- MCFG_DEVICE_IRQ_ACKNOWLEDGE_DEVICE("pic8259", pic8259_device, inta_cb)
+void sm7238_state::sm7238(machine_config &config)
+{
+ I8080(config, m_maincpu, 16.5888_MHz_XTAL/9);
+ m_maincpu->set_addrmap(AS_PROGRAM, &sm7238_state::sm7238_mem);
+ m_maincpu->set_addrmap(AS_IO, &sm7238_state::sm7238_io);
+ m_maincpu->set_irq_acknowledge_callback("pic8259", FUNC(pic8259_device::inta_cb));
ADDRESS_MAP_BANK(config, "videobank").set_map(&sm7238_state::videobank_map).set_options(ENDIANNESS_LITTLE, 8, 32, 0x2000);
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_RAW_PARAMS(20.625_MHz_XTAL, KSM_TOTAL_HORZ, 0, KSM_DISP_HORZ, KSM_TOTAL_VERT, 0, KSM_DISP_VERT);
- MCFG_SCREEN_UPDATE_DRIVER(sm7238_state, screen_update)
- MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE(m_pic8259, pic8259_device, ir2_w))
- MCFG_SCREEN_PALETTE("palette")
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_raw(20.625_MHz_XTAL, KSM_TOTAL_HORZ, 0, KSM_DISP_HORZ, KSM_TOTAL_VERT, 0, KSM_DISP_VERT);
+ m_screen->set_screen_update(FUNC(sm7238_state::screen_update));
+ m_screen->screen_vblank().set(m_pic8259, FUNC(pic8259_device::ir2_w));
+ m_screen->set_palette("palette");
PALETTE(config, "palette", FUNC(sm7238_state::sm7238_palette), 3);
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_sm7238)
+ GFXDECODE(config, "gfxdecode", "palette", gfx_sm7238);
PIC8259(config, m_pic8259, 0);
m_pic8259->out_int_callback().set_inputline(m_maincpu, 0);
@@ -427,7 +428,7 @@ MACHINE_CONFIG_START(sm7238_state::sm7238)
prtr.rxd_handler().set(m_i8251prn, FUNC(i8251_device::write_rxd));
prtr.cts_handler().set(m_i8251prn, FUNC(i8251_device::write_cts));
prtr.dsr_handler().set(m_i8251prn, FUNC(i8251_device::write_dsr));
-MACHINE_CONFIG_END
+}
ROM_START( sm7238 )
ROM_REGION(0xa000, "maincpu", ROMREGION_ERASE00)
diff --git a/src/mame/drivers/smc777.cpp b/src/mame/drivers/smc777.cpp
index f1849557425..442c694bc6e 100644
--- a/src/mame/drivers/smc777.cpp
+++ b/src/mame/drivers/smc777.cpp
@@ -7,8 +7,8 @@
driver by Angelo Salese
TODO:
- - no real documentation, the entire driver is just a bunch of educated
- guesses ...
+ - Implement SMC-70 specific features;
+ - Implement GFX modes other than 160x100x4
- ROM/RAM bankswitch, it apparently happens after one instruction prefetching.
We currently use an hackish implementation until the MAME/MESS framework can
support that ...
@@ -89,16 +89,17 @@ private:
DECLARE_READ8_MEMBER(key_r);
DECLARE_WRITE8_MEMBER(key_w);
DECLARE_WRITE8_MEMBER(border_col_w);
- DECLARE_READ8_MEMBER(system_input_r);
- DECLARE_WRITE8_MEMBER(system_output_w);
+ DECLARE_READ8_MEMBER(io_status_1c_r);
+ DECLARE_READ8_MEMBER(io_status_1d_r);
+ DECLARE_WRITE8_MEMBER(io_control_w);
DECLARE_WRITE8_MEMBER(color_mode_w);
DECLARE_WRITE8_MEMBER(ramdac_w);
- DECLARE_READ8_MEMBER(display_reg_r);
- DECLARE_WRITE8_MEMBER(display_reg_w);
+ DECLARE_READ8_MEMBER(gcw_r);
+ DECLARE_WRITE8_MEMBER(gcw_w);
DECLARE_READ8_MEMBER(smc777_mem_r);
DECLARE_WRITE8_MEMBER(smc777_mem_w);
- DECLARE_READ8_MEMBER(irq_mask_r);
- DECLARE_WRITE8_MEMBER(irq_mask_w);
+ DECLARE_READ8_MEMBER(vsync_irq_status_r);
+ DECLARE_WRITE8_MEMBER(vsync_irq_enable_w);
void smc777_palette(palette_device &palette) const;
uint32_t screen_update_smc777(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
INTERRUPT_GEN_MEMBER(vblank_irq);
@@ -106,8 +107,8 @@ private:
DECLARE_READ8_MEMBER(fdc_r);
DECLARE_WRITE8_MEMBER(fdc_w);
- DECLARE_READ8_MEMBER(fdc_request_r);
- DECLARE_WRITE8_MEMBER(floppy_select_w);
+ DECLARE_READ8_MEMBER(fdc1_fast_status_r);
+ DECLARE_WRITE8_MEMBER(fdc1_select_w);
DECLARE_WRITE_LINE_MEMBER(fdc_intrq_w);
DECLARE_WRITE_LINE_MEMBER(fdc_drq_w);
@@ -144,11 +145,12 @@ private:
struct { uint8_t r,g,b; } m_pal;
uint8_t m_raminh,m_raminh_pending_change; //bankswitch
uint8_t m_raminh_prefetch;
- uint8_t m_irq_mask;
uint8_t m_pal_mode;
uint8_t m_keyb_cmd;
uint8_t m_crtc_vreg[0x20];
uint8_t m_crtc_addr;
+ bool m_vsync_idf;
+ bool m_vsync_ief;
};
@@ -308,12 +310,12 @@ WRITE8_MEMBER(smc777_state::mc6845_w)
if(offset == 0)
{
m_crtc_addr = data;
- m_crtc->address_w(space, 0,data);
+ m_crtc->address_w(data);
}
else
{
m_crtc_vreg[m_crtc_addr] = data;
- m_crtc->register_w(space, 0,data);
+ m_crtc->register_w(data);
}
}
@@ -456,26 +458,25 @@ WRITE8_MEMBER( smc777_state::fdc_w )
m_fdc->write(offset, data ^ 0xff);
}
-READ8_MEMBER( smc777_state::fdc_request_r )
+READ8_MEMBER( smc777_state::fdc1_fast_status_r )
{
uint8_t data = 0;
+ // TODO: inverted wrt documentation?
data |= !m_fdc_drq_flag << 6;
data |= m_fdc_irq_flag << 7;
return data;
}
-WRITE8_MEMBER( smc777_state::floppy_select_w )
+WRITE8_MEMBER( smc777_state::fdc1_select_w )
{
floppy_image_device *floppy = nullptr;
- // ---- xxxx select floppy drive (yes, 15 of them, A to P)
- switch (data & 0x01)
- {
- case 0: floppy = m_floppy0->get_device(); break;
- case 1: floppy = m_floppy1->get_device(); break;
- }
+ // x--- ---- SIDE1: [SMC-70] side select
+ // ---- --x- EXDS: [SMC-70] external drive select (0=internal, 1=external)
+ // ---- ---x DS01: select floppy drive
+ floppy = (data & 1 ? m_floppy1 : m_floppy0)->get_device();
m_fdc->set_floppy(floppy);
@@ -547,36 +548,59 @@ WRITE8_MEMBER(smc777_state::border_col_w)
}
-READ8_MEMBER(smc777_state::system_input_r)
+READ8_MEMBER(smc777_state::io_status_1c_r)
{
- printf("System FF R %02x\n",m_system_data & 0x0f);
-
- switch(m_system_data & 0x0f)
- {
- case 0x00:
- return ((m_raminh & 1) << 4); //unknown bit, Dragon's Alphabet and Bird Crush relies on this for correct colors
- }
+ /*
+ * RES x--- ---- Power On bit (1=reset switch)
+ * HiZ -x-- ---- [SMC-70] no drive (always '1'?)
+ * LPH --x- ---- [SMC-70] light pen H position
+ * CP ---x ---- [SMC-777] color board (active low)
+ * LPV ---x x--- [SMC-70] light pen V position
+ * ID ---- -x-- 0=SMC-777 1=SMC-70
+ * MD ---- --xx [SMC-70] boot mode (00=DISK; 10=ROM; 11=EXT)
+ */
+ printf("System R\n");
- return m_system_data;
+ return 0;
}
+READ8_MEMBER(smc777_state::io_status_1d_r)
+{
+ /*
+ * TCIN x--- ---- CMT read data
+ * HiZ -x-- ---- [SMC-70] no drive (always '1'?)
+ * LPIN --x- ---- [SMC-70] light pen input
+ * PR_BUSY ---x ---- printer busy
+ * PR_ACK ---- x--- printer ACK
+ * ID ---- -x-- 0=SMC-777 1=SMC-70
+ * MD ---- --xx [SMC-70] boot mode (00=DISK; 10=ROM; 11=EXT)
+ */
+ return 0;
+}
-WRITE8_MEMBER(smc777_state::system_output_w)
+WRITE8_MEMBER(smc777_state::io_control_w)
{
/*
- ---x 0000 ram inibit signal
- ---x 1001 beep
- all the rest is unknown at current time
- */
+ * flip-flop based
+ * ---x -111 cassette write
+ * ---x -110 printer strobe
+ * ---x -101 beeper
+ * ---x -100 cassette start (MONITOR_ON_OFF)
+ * ---x -011 0=RGB 1=Component
+ * ---x -010 0=525 lines 1=625 lines (NTSC/PAL switch?)
+ * ---x -001 1=display disable
+ * ---x -000 ram inibit signal
+ */
m_system_data = data;
- switch(m_system_data & 0x0f)
+ switch(m_system_data & 0x07)
{
case 0x00:
+ // "ROM / RAM register change is done at the beginning of the next M1 cycle"
m_raminh_pending_change = ((data & 0x10) >> 4) ^ 1;
m_raminh_prefetch = (uint8_t)(m_maincpu->state_int(Z80_R)) & 0x7f;
break;
- case 0x02: printf("Interlace %s\n",data & 0x10 ? "on" : "off"); break;
+ case 0x02: printf("Screen line number %d\n",data & 0x10 ? 625 : 525); break;
case 0x05: m_beeper->set_state(data & 0x10); break;
default: printf("System FF W %02x\n",data); break;
}
@@ -584,7 +608,14 @@ WRITE8_MEMBER(smc777_state::system_output_w)
WRITE8_MEMBER(smc777_state::color_mode_w)
{
- switch(data & 0x0f)
+ /*
+ * ---x -111 gfx palette select
+ * ---x -110 text palette select
+ * ---x -101 joy 2 out
+ * ...
+ * ---x -000 joy 2 out
+ */
+ switch(data & 0x07)
{
case 0x06: m_pal_mode = (data & 0x10) ^ 0x10; break;
default: printf("Color FF %02x\n",data); break;
@@ -608,18 +639,29 @@ WRITE8_MEMBER(smc777_state::ramdac_w)
}
}
-READ8_MEMBER(smc777_state::display_reg_r)
+READ8_MEMBER(smc777_state::gcw_r)
{
return m_display_reg;
}
/* x */
-WRITE8_MEMBER(smc777_state::display_reg_w)
+WRITE8_MEMBER(smc777_state::gcw_w)
{
/*
- x--- ---- width 80 / 40 switch (0 = 640 x 200 1 = 320 x 200)
- ---- -x-- mode select?
- */
+ * x--- ---- text mode (0 = 80x25 1 = 40x25)
+ * -x-- ---- text page (in 40x25 mode)
+ * --x- ---- color mode (1=for 2bpp mode, blue is replaced with white)
+ * ---x ---- [SMC-70] interlace
+ * ---- xxyy gfx mode (model dependant)
+ * [SMC-70]
+ * ---- 11-- 640x400x1 bpp
+ * ---- 10-- 640x200x2 bpp
+ * ---- 01-- 320x200x4 bpp
+ * ---- 00yy 160x100x4 bpp, bits 0-1 selects page
+ * [SMC-777]
+ * ---- 1--- 640x200x2 bpp
+ * ---- 0--- 320x200x4 bpp
+ */
m_display_reg = data;
}
@@ -628,7 +670,8 @@ READ8_MEMBER(smc777_state::smc777_mem_r)
{
uint8_t z80_r;
- if(m_raminh_prefetch != 0xff) //do the bankswitch AFTER that the prefetch instruction is executed (FIXME: this is an hackish implementation)
+ // TODO: do the bankswitch AFTER that the prefetch instruction is executed (hackish implementation)
+ if(m_raminh_prefetch != 0xff)
{
z80_r = (uint8_t)m_maincpu->state_int(Z80_R);
@@ -650,17 +693,25 @@ WRITE8_MEMBER(smc777_state::smc777_mem_w)
m_work_ram[offset] = data;
}
-READ8_MEMBER(smc777_state::irq_mask_r)
+READ8_MEMBER(smc777_state::vsync_irq_status_r)
{
- return m_irq_mask;
+ if (m_vsync_idf == true)
+ {
+ m_vsync_idf = false;
+ return 1;
+ }
+
+ return 0;
}
-WRITE8_MEMBER(smc777_state::irq_mask_w)
+WRITE8_MEMBER(smc777_state::vsync_irq_enable_w)
{
if(data & 0xfe)
- printf("Irq mask = %02x\n",data & 0xfe);
+ logerror("Irq mask = %02x\n",data & 0xfe);
- m_irq_mask = data & 1;
+ // IRQ mask
+ m_vsync_ief = BIT(data,0);
+ // TODO: clear idf on 1->0 irq mask transition?
}
void smc777_state::smc777_mem(address_map &map)
@@ -677,34 +728,40 @@ void smc777_state::smc777_io(address_map &map)
map(0x10, 0x17).select(0xff00).rw(FUNC(smc777_state::pcg_r), FUNC(smc777_state::pcg_w));
map(0x18, 0x19).mirror(0xff00).w(FUNC(smc777_state::mc6845_w));
map(0x1a, 0x1b).mirror(0xff00).rw(FUNC(smc777_state::key_r), FUNC(smc777_state::key_w));
- map(0x1c, 0x1c).mirror(0xff00).rw(FUNC(smc777_state::system_input_r), FUNC(smc777_state::system_output_w));
-// AM_RANGE(0x1d, 0x1d) system and control read, printer strobe write
-// AM_RANGE(0x1e, 0x1f) rs232 irq control
- map(0x20, 0x20).mirror(0xff00).rw(FUNC(smc777_state::display_reg_r), FUNC(smc777_state::display_reg_w));
- map(0x21, 0x21).mirror(0xff00).rw(FUNC(smc777_state::irq_mask_r), FUNC(smc777_state::irq_mask_w));
-// AM_RANGE(0x22, 0x22) printer output data
+ map(0x1c, 0x1c).mirror(0xff00).rw(FUNC(smc777_state::io_status_1c_r), FUNC(smc777_state::io_control_w));
+ map(0x1d, 0x1d).mirror(0xff00).rw(FUNC(smc777_state::io_status_1d_r), FUNC(smc777_state::io_control_w));
+// map(0x1e, 0x1f) rs232 irq control
+ map(0x20, 0x20).mirror(0xff00).rw(FUNC(smc777_state::gcw_r), FUNC(smc777_state::gcw_w));
+ map(0x21, 0x21).mirror(0xff00).rw(FUNC(smc777_state::vsync_irq_status_r), FUNC(smc777_state::vsync_irq_enable_w));
+// map(0x22, 0x22) printer output data
map(0x23, 0x23).mirror(0xff00).w(FUNC(smc777_state::border_col_w));
-// AM_RANGE(0x24, 0x24) rtc write address
-// AM_RANGE(0x25, 0x25) rtc read
-// AM_RANGE(0x26, 0x26) rs232 #1
-// AM_RANGE(0x28, 0x2c) fdc #2
-// AM_RANGE(0x2d, 0x2f) rs232 #2
+// map(0x24, 0x24) rtc write address (M5M58321RS)
+// map(0x25, 0x25) rtc read
+// map(0x26, 0x26) rs232 #1
+// map(0x28, 0x2c) fdc #2 (8")
+// map(0x2d, 0x2f) rs232 #2
map(0x30, 0x33).mirror(0xff00).rw(FUNC(smc777_state::fdc_r), FUNC(smc777_state::fdc_w));
- map(0x34, 0x34).mirror(0xff00).rw(FUNC(smc777_state::fdc_request_r), FUNC(smc777_state::floppy_select_w));
-// AM_RANGE(0x35, 0x37) rs232 #3
-// AM_RANGE(0x38, 0x3b) cache disk unit
-// AM_RANGE(0x3c, 0x3d) rgb superimposer
-// AM_RANGE(0x40, 0x47) ieee-488
-// AM_RANGE(0x48, 0x4f) hdd (winchester)
+ map(0x34, 0x34).mirror(0xff00).rw(FUNC(smc777_state::fdc1_fast_status_r), FUNC(smc777_state::fdc1_select_w));
+// map(0x35, 0x37) rs232 #3
+// map(0x38, 0x3b) cache disk unit
+ // 0x38 (R) CDSTS status port (W) CDCMD command port
+ // 0x39 (W) track register
+ // 0x3a (W) sector register
+ // 0x3b (RW) data port
+// map(0x3c, 0x3d) rgb superimposer / genlock control
+// map(0x40, 0x47) ieee-488 / TMS9914A I/F
+ map(0x44, 0x44).mirror(0xff00).portr("GPDSW"); // normally unmapped in GPIB interface
+// map(0x48, 0x49) hdd (winchester)
+ // TODO: address bit 8 selects joy port 2
map(0x51, 0x51).mirror(0xff00).portr("JOY_1P").w(FUNC(smc777_state::color_mode_w));
map(0x52, 0x52).select(0xff00).w(FUNC(smc777_state::ramdac_w));
- map(0x53, 0x53).mirror(0xff00).w("sn1", FUNC(sn76489a_device::command_w));
-// AM_RANGE(0x54, 0x59) vrt controller
-// AM_RANGE(0x5a, 0x5b) ram banking
-// AM_RANGE(0x70, 0x70) auto-start rom
-// AM_RANGE(0x74, 0x74) ieee-488 rom
-// AM_RANGE(0x75, 0x75) vrt controller rom
-// AM_RANGE(0x7e, 0x7f) kanji rom
+ map(0x53, 0x53).mirror(0xff00).w("sn1", FUNC(sn76489a_device::write));
+// map(0x54, 0x59) vrt controller
+// map(0x5a, 0x5b) ram banking
+// map(0x70, 0x70) auto-start ROM (ext-ROM)
+// map(0x74, 0x74) ieee-488 GPIB ROM port
+// map(0x75, 0x75) vrt controller ROM
+// map(0x7e, 0x7f) kanji ROM
map(0x80, 0xff).select(0xff00).rw(FUNC(smc777_state::fbuf_r), FUNC(smc777_state::fbuf_w));
}
@@ -841,6 +898,32 @@ static INPUT_PORTS_START( smc777 )
PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_UNUSED )
PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNUSED )
PORT_BIT( 0x80, IP_ACTIVE_HIGH,IPT_UNKNOWN ) //status?
+
+ PORT_START("GPDSW")
+ PORT_DIPNAME( 0x01, 0x00, "GPDSW" )
+ PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x01, DEF_STR( On ) )
+ PORT_DIPNAME( 0x02, 0x00, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x02, DEF_STR( On ) )
+ PORT_DIPNAME( 0x04, 0x00, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x04, DEF_STR( On ) )
+ PORT_DIPNAME( 0x08, 0x00, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x08, DEF_STR( On ) )
+ PORT_DIPNAME( 0x10, 0x00, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x10, DEF_STR( On ) )
+ PORT_DIPNAME( 0x20, 0x00, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x20, DEF_STR( On ) )
+ PORT_DIPNAME( 0x40, 0x00, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x40, DEF_STR( On ) )
+ PORT_DIPNAME( 0x80, 0x00, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x80, DEF_STR( On ) )
INPUT_PORTS_END
/*
@@ -988,6 +1071,7 @@ void smc777_state::machine_reset()
m_raminh_pending_change = 1;
m_raminh_prefetch = 0xff;
m_pal_mode = 0x10;
+ m_vsync_idf = false;
m_beeper->set_state(0);
}
@@ -1010,8 +1094,11 @@ void smc777_state::smc777_palette(palette_device &palette) const
INTERRUPT_GEN_MEMBER(smc777_state::vblank_irq)
{
- if(m_irq_mask)
+ if(m_vsync_ief)
+ {
device.execute().set_input_line(0,HOLD_LINE);
+ m_vsync_idf = true;
+ }
}
@@ -1023,19 +1110,19 @@ static void smc777_floppies(device_slot_interface &device)
MACHINE_CONFIG_START(smc777_state::smc777)
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu",Z80, MASTER_CLOCK)
- MCFG_DEVICE_PROGRAM_MAP(smc777_mem)
- MCFG_DEVICE_IO_MAP(smc777_io)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", smc777_state, vblank_irq)
+ Z80(config, m_maincpu, MASTER_CLOCK);
+ m_maincpu->set_addrmap(AS_PROGRAM, &smc777_state::smc777_mem);
+ m_maincpu->set_addrmap(AS_IO, &smc777_state::smc777_io);
+ m_maincpu->set_vblank_int("screen", FUNC(smc777_state::vblank_irq));
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */
- MCFG_SCREEN_SIZE(0x400, 400)
- MCFG_SCREEN_VISIBLE_AREA(0, 660-1, 0, 220-1) //normal 640 x 200 + 20 pixels for border color
- MCFG_SCREEN_UPDATE_DRIVER(smc777_state, screen_update_smc777)
- MCFG_SCREEN_PALETTE(m_palette)
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_refresh_hz(60);
+ m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */
+ m_screen->set_size(0x400, 400);
+ m_screen->set_visarea(0, 660-1, 0, 220-1); //normal 640 x 200 + 20 pixels for border color
+ m_screen->set_screen_update(FUNC(smc777_state::screen_update_smc777));
+ m_screen->set_palette(m_palette);
PALETTE(config, m_palette, FUNC(smc777_state::smc777_palette), 0x20); // 16 + 8 colors (SMC-777 + SMC-70) + 8 empty entries (SMC-70)
@@ -1052,22 +1139,21 @@ MACHINE_CONFIG_START(smc777_state::smc777)
m_fdc->drq_wr_callback().set(FUNC(smc777_state::fdc_drq_w));
// does it really support 16 of them?
- MCFG_FLOPPY_DRIVE_ADD("fdc:0", smc777_floppies, "ssdd", floppy_image_device::default_floppy_formats)
- MCFG_FLOPPY_DRIVE_ADD("fdc:1", smc777_floppies, "ssdd", floppy_image_device::default_floppy_formats)
+ FLOPPY_CONNECTOR(config, "fdc:0", smc777_floppies, "ssdd", floppy_image_device::default_floppy_formats);
+ FLOPPY_CONNECTOR(config, "fdc:1", smc777_floppies, "ssdd", floppy_image_device::default_floppy_formats);
- MCFG_SOFTWARE_LIST_ADD("flop_list", "smc777")
- MCFG_QUICKLOAD_ADD("quickload", smc777_state, smc777, "com,cpm", 3)
+ SOFTWARE_LIST(config, "flop_list").set_original("smc777");
+ MCFG_QUICKLOAD_ADD("quickload", smc777_state, smc777, "com,cpm", attotime::from_seconds(3))
/* sound hardware */
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("sn1", SN76489A, MASTER_CLOCK) // unknown clock / divider
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.50)
+ SN76489A(config, "sn1", MASTER_CLOCK).add_route(ALL_OUTPUTS, "mono", 0.50); // unknown clock / divider
BEEP(config, m_beeper, 300); // TODO: correct frequency
m_beeper->add_route(ALL_OUTPUTS, "mono", 0.50);
- MCFG_TIMER_DRIVER_ADD_PERIODIC("keyboard_timer", smc777_state, keyboard_callback, attotime::from_hz(240/32))
+ TIMER(config, "keyboard_timer").configure_periodic(FUNC(smc777_state::keyboard_callback), attotime::from_hz(240/32));
MACHINE_CONFIG_END
/* ROM definition */
diff --git a/src/mame/drivers/sms.cpp b/src/mame/drivers/sms.cpp
index df706904160..9b9852492c3 100644
--- a/src/mame/drivers/sms.cpp
+++ b/src/mame/drivers/sms.cpp
@@ -301,7 +301,7 @@ void sms_state::sg1000m3_io(address_map &map)
{
map.global_mask(0xff);
map.unmap_value_high();
- map(0x40, 0x7f).rw(FUNC(sms_state::sms_count_r), FUNC(sms_state::sms_psg_w));
+ map(0x40, 0x7f).r(FUNC(sms_state::sms_count_r)).w(m_vdp, FUNC(sega315_5124_device::psg_w));
map(0x80, 0x80).mirror(0x3e).rw(m_vdp, FUNC(sega315_5124_device::data_read), FUNC(sega315_5124_device::data_write));
map(0x81, 0x81).mirror(0x3e).rw(m_vdp, FUNC(sega315_5124_device::control_read), FUNC(sega315_5124_device::control_write));
map(0xc0, 0xc7).mirror(0x38).rw(FUNC(sms_state::sg1000m3_peripheral_r), FUNC(sms_state::sg1000m3_peripheral_w));
@@ -313,7 +313,7 @@ void sms_state::sms_io(address_map &map)
map.unmap_value_high();
map(0x00, 0x00).mirror(0x3e).w(FUNC(sms_state::sms_mem_control_w));
map(0x01, 0x01).mirror(0x3e).w(FUNC(sms_state::sms_io_control_w));
- map(0x40, 0x7f).rw(FUNC(sms_state::sms_count_r), FUNC(sms_state::sms_psg_w));
+ map(0x40, 0x7f).r(FUNC(sms_state::sms_count_r)).w(m_vdp, FUNC(sega315_5124_device::psg_w));
map(0x80, 0x80).mirror(0x3e).rw(m_vdp, FUNC(sega315_5124_device::data_read), FUNC(sega315_5124_device::data_write));
map(0x81, 0x81).mirror(0x3e).rw(m_vdp, FUNC(sega315_5124_device::control_read), FUNC(sega315_5124_device::control_write));
map(0xc0, 0xc0).mirror(0x3e).r(FUNC(sms_state::sms_input_port_dc_r));
@@ -331,7 +331,7 @@ void sms_state::smskr_io(address_map &map)
map.unmap_value_high();
map(0x3e, 0x3e).w(FUNC(sms_state::sms_mem_control_w));
map(0x3f, 0x3f).w(FUNC(sms_state::sms_io_control_w));
- map(0x40, 0x7f).rw(FUNC(sms_state::sms_count_r), FUNC(sms_state::sms_psg_w));
+ map(0x40, 0x7f).r(FUNC(sms_state::sms_count_r)).w(m_vdp, FUNC(sega315_5124_device::psg_w));
map(0x80, 0x80).mirror(0x3e).rw(m_vdp, FUNC(sega315_5124_device::data_read), FUNC(sega315_5124_device::data_write));
map(0x81, 0x81).mirror(0x3e).rw(m_vdp, FUNC(sega315_5124_device::control_read), FUNC(sega315_5124_device::control_write));
map(0xc0, 0xc0).mirror(0x3e).r(FUNC(sms_state::sms_input_port_dc_r));
@@ -347,7 +347,7 @@ void sms_state::smsj_io(address_map &map)
map.unmap_value_high();
map(0x3e, 0x3e).w(FUNC(sms_state::sms_mem_control_w));
map(0x3f, 0x3f).w(FUNC(sms_state::sms_io_control_w));
- map(0x40, 0x7f).rw(FUNC(sms_state::sms_count_r), FUNC(sms_state::sms_psg_w));
+ map(0x40, 0x7f).r(FUNC(sms_state::sms_count_r)).w(m_vdp, FUNC(sega315_5124_device::psg_w));
map(0x80, 0x80).mirror(0x3e).rw(m_vdp, FUNC(sega315_5124_device::data_read), FUNC(sega315_5124_device::data_write));
map(0x81, 0x81).mirror(0x3e).rw(m_vdp, FUNC(sega315_5124_device::control_read), FUNC(sega315_5124_device::control_write));
map(0xc0, 0xc0).r(FUNC(sms_state::sms_input_port_dc_r));
@@ -371,7 +371,7 @@ void sms_state::gg_io(address_map &map)
map(0x06, 0x06).w(FUNC(sms_state::gg_psg_stereo_w));
map(0x3e, 0x3e).w(FUNC(sms_state::sms_mem_control_w));
map(0x3f, 0x3f).w(FUNC(sms_state::sms_io_control_w));
- map(0x40, 0x7f).rw(FUNC(sms_state::sms_count_r), FUNC(sms_state::gg_psg_w));
+ map(0x40, 0x7f).r(FUNC(sms_state::sms_count_r)).w(m_vdp, FUNC(sega315_5124_device::psg_w));
map(0x80, 0x80).mirror(0x3e).rw(m_vdp, FUNC(sega315_5124_device::data_read), FUNC(sega315_5124_device::data_write));
map(0x81, 0x81).mirror(0x3e).rw(m_vdp, FUNC(sega315_5124_device::control_read), FUNC(sega315_5124_device::control_write));
map(0xc0, 0xc0).r(FUNC(sms_state::sms_input_port_dc_r));
@@ -493,35 +493,33 @@ static INPUT_PORTS_START( gg )
INPUT_PORTS_END
-MACHINE_CONFIG_START(sms_state::sms_base)
+void sms_state::sms_base(machine_config &config)
+{
/* basic machine hardware */
SPEAKER(config, "mono").front_center();
- MCFG_SMS_CARTRIDGE_ADD("slot", sms_cart, nullptr)
+ SMS_CART_SLOT(config, "slot", sms_cart, nullptr);
- MCFG_SOFTWARE_LIST_ADD("cart_list","sms")
+ SOFTWARE_LIST(config, "cart_list").set_original("sms");
- MCFG_SMS_CONTROL_PORT_ADD(CONTROL1_TAG, sms_control_port_devices, "joypad")
- MCFG_SMS_CONTROL_PORT_TH_INPUT_HANDLER(WRITELINE(*this, sms_state, sms_ctrl1_th_input))
- MCFG_SMS_CONTROL_PORT_PIXEL_HANDLER(READ32(*this, sms_state, sms_pixel_color))
+ SMS_CONTROL_PORT(config, m_port_ctrl1, sms_control_port_devices, "joypad");
+ m_port_ctrl1->th_input_handler().set(FUNC(sms_state::sms_ctrl1_th_input));
+ m_port_ctrl1->pixel_handler().set(FUNC(sms_state::sms_pixel_color));
- MCFG_SMS_CONTROL_PORT_ADD(CONTROL2_TAG, sms_control_port_devices, "joypad")
- MCFG_SMS_CONTROL_PORT_TH_INPUT_HANDLER(WRITELINE(*this, sms_state, sms_ctrl2_th_input))
- MCFG_SMS_CONTROL_PORT_PIXEL_HANDLER(READ32(*this, sms_state, sms_pixel_color))
-MACHINE_CONFIG_END
+ SMS_CONTROL_PORT(config, m_port_ctrl2, sms_control_port_devices, "joypad");
+ m_port_ctrl2->th_input_handler().set(FUNC(sms_state::sms_ctrl2_th_input));
+ m_port_ctrl2->pixel_handler().set(FUNC(sms_state::sms_pixel_color));
+}
-MACHINE_CONFIG_START(sms_state::sms_ntsc_base)
+void sms_state::sms_ntsc_base(machine_config &config)
+{
sms_base(config);
- MCFG_DEVICE_ADD("maincpu", Z80, XTAL(10'738'635)/3)
- MCFG_DEVICE_PROGRAM_MAP(sms_mem)
- MCFG_DEVICE_IO_MAP(sms_io)
-
- MCFG_QUANTUM_TIME(attotime::from_hz(60))
+ Z80(config, m_maincpu, XTAL(10'738'635)/3);
+ m_maincpu->set_addrmap(AS_PROGRAM, &sms_state::sms_mem);
+ m_maincpu->set_addrmap(AS_IO, &sms_state::sms_io);
- /* actually, PSG is embedded in the VDP chip */
- MCFG_DEVICE_ADD("segapsg", SEGAPSG, XTAL(10'738'635)/3)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.00)
-MACHINE_CONFIG_END
+ config.m_minimum_quantum = attotime::from_hz(60);
+}
/*
For SMS drivers, the ratio between CPU and pixel clocks, set through dividers, is 2/3. The
@@ -578,11 +576,12 @@ MACHINE_CONFIG_START(sms_state::sms2_ntsc)
MCFG_SCREEN_SMS_NTSC_RAW_PARAMS(XTAL(10'738'635)/2)
MCFG_SCREEN_UPDATE_DRIVER(sms_state, screen_update_sms)
- MCFG_DEVICE_ADD("sms_vdp", SEGA315_5246, 0)
- MCFG_SEGA315_5246_SET_SCREEN("screen")
- MCFG_SEGA315_5246_IS_PAL(false)
- MCFG_SEGA315_5246_INT_CB(INPUTLINE("maincpu", 0))
- MCFG_SEGA315_5246_PAUSE_CB(WRITELINE(*this, sms_state, sms_pause_callback))
+ SEGA315_5246(config, m_vdp, XTAL(10'738'635));
+ m_vdp->set_screen(m_main_scr);
+ m_vdp->set_is_pal(false);
+ m_vdp->irq().set_inputline(m_maincpu, 0);
+ m_vdp->pause().set(FUNC(sms_state::sms_pause_callback));
+ m_vdp->add_route(ALL_OUTPUTS, "mono", 1.00);
m_has_bios_full = true;
MACHINE_CONFIG_END
@@ -591,8 +590,7 @@ MACHINE_CONFIG_END
MACHINE_CONFIG_START(sms_state::sms1_ntsc)
sms_ntsc_base(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(sms1_mem) // This adds the SegaScope handlers for 3-D glasses
+ m_maincpu->set_addrmap(AS_PROGRAM, &sms_state::sms1_mem); // This adds the SegaScope handlers for 3-D glasses
/* video hardware */
MCFG_SCREEN_ADD("screen", RASTER)
@@ -614,85 +612,54 @@ MACHINE_CONFIG_START(sms_state::sms1_ntsc)
MCFG_VIDEO_START_OVERRIDE(sms_state,sms1)
MCFG_VIDEO_RESET_OVERRIDE(sms_state,sms1)
- MCFG_DEVICE_ADD("sms_vdp", SEGA315_5124, 0)
- MCFG_SEGA315_5124_SET_SCREEN("screen")
- MCFG_SEGA315_5124_IS_PAL(false)
- MCFG_SEGA315_5124_INT_CB(INPUTLINE("maincpu", 0))
- MCFG_SEGA315_5124_PAUSE_CB(WRITELINE(*this, sms_state, sms_pause_callback))
+ SEGA315_5124(config, m_vdp, XTAL(10'738'635));
+ m_vdp->set_screen(m_main_scr);
+ m_vdp->set_is_pal(false);
+ m_vdp->irq().set_inputline(m_maincpu, 0);
+ m_vdp->pause().set(FUNC(sms_state::sms_pause_callback));
+ m_vdp->add_route(ALL_OUTPUTS, "mono", 1.00);
// card and expansion slots, not present in Master System II
- MCFG_SMS_CARD_ADD("mycard", sms_cart, nullptr)
- MCFG_SMS_EXPANSION_ADD("smsexp", sms_expansion_devices, nullptr)
+ SMS_CARD_SLOT(config, "mycard", sms_cart, nullptr);
+ SMS_EXPANSION_SLOT(config, "smsexp", sms_expansion_devices, nullptr);
m_has_bios_full = true;
m_has_pwr_led = true;
MACHINE_CONFIG_END
-MACHINE_CONFIG_START(smssdisp_state::sms_sdisp)
+void smssdisp_state::sms_sdisp(machine_config &config)
+{
sms1_ntsc(config);
- MCFG_DEVICE_MODIFY("sms_vdp")
- MCFG_SEGA315_5124_INT_CB(WRITELINE(*this, smssdisp_state, sms_store_int_callback))
+ m_vdp->irq().set(FUNC(smssdisp_state::sms_store_int_callback));
- MCFG_DEVICE_ADD("control", Z80, XTAL(10'738'635)/3)
- MCFG_DEVICE_PROGRAM_MAP(sms_store_mem)
+ Z80(config, m_control_cpu, XTAL(10'738'635)/3);
+ m_control_cpu->set_addrmap(AS_PROGRAM, &smssdisp_state::sms_store_mem);
/* Both CPUs seem to communicate with the VDP etc? */
- MCFG_DEVICE_IO_MAP(sms_io)
-
- MCFG_DEVICE_REMOVE("mycard")
- MCFG_DEVICE_REMOVE("smsexp")
-
- MCFG_SMS_CARTRIDGE_ADD("slot2", sms_cart, nullptr)
- MCFG_SMS_CARTRIDGE_ADD("slot3", sms_cart, nullptr)
- MCFG_SMS_CARTRIDGE_ADD("slot4", sms_cart, nullptr)
- MCFG_SMS_CARTRIDGE_ADD("slot5", sms_cart, nullptr)
- MCFG_SMS_CARTRIDGE_ADD("slot6", sms_cart, nullptr)
- MCFG_SMS_CARTRIDGE_ADD("slot7", sms_cart, nullptr)
- MCFG_SMS_CARTRIDGE_ADD("slot8", sms_cart, nullptr)
- MCFG_SMS_CARTRIDGE_ADD("slot9", sms_cart, nullptr)
- MCFG_SMS_CARTRIDGE_ADD("slot10", sms_cart, nullptr)
- MCFG_SMS_CARTRIDGE_ADD("slot11", sms_cart, nullptr)
- MCFG_SMS_CARTRIDGE_ADD("slot12", sms_cart, nullptr)
- MCFG_SMS_CARTRIDGE_ADD("slot13", sms_cart, nullptr)
- MCFG_SMS_CARTRIDGE_ADD("slot14", sms_cart, nullptr)
- MCFG_SMS_CARTRIDGE_ADD("slot15", sms_cart, nullptr)
- MCFG_SMS_CARTRIDGE_ADD("slot16", sms_cart, nullptr)
-
- MCFG_SMS_CARD_ADD("slot17", sms_cart, nullptr)
- MCFG_SMS_CARD_ADD("slot18", sms_cart, nullptr)
- MCFG_SMS_CARD_ADD("slot19", sms_cart, nullptr)
- MCFG_SMS_CARD_ADD("slot20", sms_cart, nullptr)
- MCFG_SMS_CARD_ADD("slot21", sms_cart, nullptr)
- MCFG_SMS_CARD_ADD("slot22", sms_cart, nullptr)
- MCFG_SMS_CARD_ADD("slot23", sms_cart, nullptr)
- MCFG_SMS_CARD_ADD("slot24", sms_cart, nullptr)
- MCFG_SMS_CARD_ADD("slot25", sms_cart, nullptr)
- MCFG_SMS_CARD_ADD("slot26", sms_cart, nullptr)
- MCFG_SMS_CARD_ADD("slot27", sms_cart, nullptr)
- MCFG_SMS_CARD_ADD("slot28", sms_cart, nullptr)
- MCFG_SMS_CARD_ADD("slot29", sms_cart, nullptr)
- MCFG_SMS_CARD_ADD("slot30", sms_cart, nullptr)
- MCFG_SMS_CARD_ADD("slot31", sms_cart, nullptr)
- MCFG_SMS_CARD_ADD("slot32", sms_cart, nullptr)
+ m_control_cpu->set_addrmap(AS_IO, &smssdisp_state::sms_io);
+
+ config.device_remove("mycard");
+ config.device_remove("smsexp");
+
+ for (int i = 1; i < 16; i++)
+ SMS_CART_SLOT(config, m_slots[i], sms_cart, nullptr);
+ for (int i = 0; i < 16; i++)
+ SMS_CARD_SLOT(config, m_cards[i], sms_cart, nullptr);
m_has_bios_full = false;
- m_is_sdisp = true;
m_has_pwr_led = false;
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(sms_state::sms_pal_base)
+void sms_state::sms_pal_base(machine_config &config)
+{
sms_base(config);
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, MASTER_CLOCK_PAL/15)
- MCFG_DEVICE_PROGRAM_MAP(sms_mem)
- MCFG_DEVICE_IO_MAP(sms_io)
-
- MCFG_QUANTUM_TIME(attotime::from_hz(50))
+ Z80(config, m_maincpu, MASTER_CLOCK_PAL/15);
+ m_maincpu->set_addrmap(AS_PROGRAM, &sms_state::sms_mem);
+ m_maincpu->set_addrmap(AS_IO, &sms_state::sms_io);
- /* actually, PSG is embedded in the VDP chip */
- MCFG_DEVICE_ADD("segapsg", SEGAPSG, MASTER_CLOCK_PAL/15)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.00)
-MACHINE_CONFIG_END
+ config.m_minimum_quantum = attotime::from_hz(50);
+}
MACHINE_CONFIG_START(sms_state::sms2_pal)
sms_pal_base(config);
@@ -702,11 +669,12 @@ MACHINE_CONFIG_START(sms_state::sms2_pal)
MCFG_SCREEN_SMS_PAL_RAW_PARAMS(MASTER_CLOCK_PAL/10)
MCFG_SCREEN_UPDATE_DRIVER(sms_state, screen_update_sms)
- MCFG_DEVICE_ADD("sms_vdp", SEGA315_5246, 0)
- MCFG_SEGA315_5246_SET_SCREEN("screen")
- MCFG_SEGA315_5246_IS_PAL(true)
- MCFG_SEGA315_5246_INT_CB(INPUTLINE("maincpu", 0))
- MCFG_SEGA315_5246_PAUSE_CB(WRITELINE(*this, sms_state, sms_pause_callback))
+ SEGA315_5246(config, m_vdp, MASTER_CLOCK_PAL/5);
+ m_vdp->set_screen(m_main_scr);
+ m_vdp->set_is_pal(true);
+ m_vdp->irq().set_inputline(m_maincpu, 0);
+ m_vdp->pause().set(FUNC(sms_state::sms_pause_callback));
+ m_vdp->add_route(ALL_OUTPUTS, "mono", 1.00);
m_has_bios_full = true;
MACHINE_CONFIG_END
@@ -714,8 +682,7 @@ MACHINE_CONFIG_END
MACHINE_CONFIG_START(sms_state::sms1_pal)
sms_pal_base(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(sms1_mem) // This adds the SegaScope handlers for 3-D glasses
+ m_maincpu->set_addrmap(AS_PROGRAM, &sms_state::sms1_mem); // This adds the SegaScope handlers for 3-D glasses
/* video hardware */
MCFG_SCREEN_ADD("screen", RASTER)
@@ -737,34 +704,32 @@ MACHINE_CONFIG_START(sms_state::sms1_pal)
MCFG_VIDEO_START_OVERRIDE(sms_state,sms1)
MCFG_VIDEO_RESET_OVERRIDE(sms_state,sms1)
- MCFG_DEVICE_ADD("sms_vdp", SEGA315_5124, 0)
- MCFG_SEGA315_5124_SET_SCREEN("screen")
- MCFG_SEGA315_5124_IS_PAL(true)
- MCFG_SEGA315_5124_INT_CB(INPUTLINE("maincpu", 0))
- MCFG_SEGA315_5124_PAUSE_CB(WRITELINE(*this, sms_state, sms_pause_callback))
+ SEGA315_5124(config, m_vdp, MASTER_CLOCK_PAL/5);
+ m_vdp->set_screen(m_main_scr);
+ m_vdp->set_is_pal(true);
+ m_vdp->irq().set_inputline(m_maincpu, 0);
+ m_vdp->pause().set(FUNC(sms_state::sms_pause_callback));
+ m_vdp->add_route(ALL_OUTPUTS, "mono", 1.00);
// card and expansion slots, not present in Master System II
- MCFG_SMS_CARD_ADD("mycard", sms_cart, nullptr)
- MCFG_SMS_EXPANSION_ADD("smsexp", sms_expansion_devices, nullptr)
+ SMS_CARD_SLOT(config, "mycard", sms_cart, nullptr);
+ SMS_EXPANSION_SLOT(config, "smsexp", sms_expansion_devices, nullptr);
m_has_bios_full = true;
m_has_pwr_led = true;
MACHINE_CONFIG_END
-MACHINE_CONFIG_START(sms_state::sms_paln_base)
+void sms_state::sms_paln_base(machine_config &config)
+{
sms_base(config);
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, MASTER_CLOCK_PALN/3)
- MCFG_DEVICE_PROGRAM_MAP(sms_mem)
- MCFG_DEVICE_IO_MAP(sms_io)
-
- MCFG_QUANTUM_TIME(attotime::from_hz(50))
+ Z80(config, m_maincpu, MASTER_CLOCK_PALN/3);
+ m_maincpu->set_addrmap(AS_PROGRAM, &sms_state::sms_mem);
+ m_maincpu->set_addrmap(AS_IO, &sms_state::sms_io);
- /* actually, PSG is embedded in the VDP chip */
- MCFG_DEVICE_ADD("segapsg", SEGAPSG, MASTER_CLOCK_PALN/3)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.00)
-MACHINE_CONFIG_END
+ config.m_minimum_quantum = attotime::from_hz(50);
+}
MACHINE_CONFIG_START(sms_state::sms3_paln)
sms_paln_base(config);
@@ -774,11 +739,12 @@ MACHINE_CONFIG_START(sms_state::sms3_paln)
MCFG_SCREEN_SMS_PAL_RAW_PARAMS(MASTER_CLOCK_PALN/2)
MCFG_SCREEN_UPDATE_DRIVER(sms_state, screen_update_sms)
- MCFG_DEVICE_ADD("sms_vdp", SEGA315_5246, 0)
- MCFG_SEGA315_5246_SET_SCREEN("screen")
- MCFG_SEGA315_5246_IS_PAL(true)
- MCFG_SEGA315_5246_INT_CB(INPUTLINE("maincpu", 0))
- MCFG_SEGA315_5246_PAUSE_CB(WRITELINE(*this, sms_state, sms_pause_callback))
+ SEGA315_5246(config, m_vdp, MASTER_CLOCK_PALN);
+ m_vdp->set_screen(m_main_scr);
+ m_vdp->set_is_pal(true);
+ m_vdp->irq().set_inputline(m_maincpu, 0);
+ m_vdp->pause().set(FUNC(sms_state::sms_pause_callback));
+ m_vdp->add_route(ALL_OUTPUTS, "mono", 1.00);
m_has_bios_full = true;
MACHINE_CONFIG_END
@@ -786,8 +752,7 @@ MACHINE_CONFIG_END
MACHINE_CONFIG_START(sms_state::sms1_paln)
sms_paln_base(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(sms1_mem) // This adds the SegaScope handlers for 3-D glasses
+ m_maincpu->set_addrmap(AS_PROGRAM, &sms_state::sms1_mem); // This adds the SegaScope handlers for 3-D glasses
/* video hardware */
MCFG_SCREEN_ADD("screen", RASTER)
@@ -809,35 +774,33 @@ MACHINE_CONFIG_START(sms_state::sms1_paln)
MCFG_VIDEO_START_OVERRIDE(sms_state,sms1)
MCFG_VIDEO_RESET_OVERRIDE(sms_state,sms1)
- MCFG_DEVICE_ADD("sms_vdp", SEGA315_5124, 0)
- MCFG_SEGA315_5124_SET_SCREEN("screen")
- MCFG_SEGA315_5124_IS_PAL(true)
- MCFG_SEGA315_5124_INT_CB(INPUTLINE("maincpu", 0))
- MCFG_SEGA315_5124_PAUSE_CB(WRITELINE(*this, sms_state, sms_pause_callback))
+ SEGA315_5124(config, m_vdp, MASTER_CLOCK_PALN);
+ m_vdp->set_screen(m_main_scr);
+ m_vdp->set_is_pal(true);
+ m_vdp->irq().set_inputline(m_maincpu, 0);
+ m_vdp->pause().set(FUNC(sms_state::sms_pause_callback));
+ m_vdp->add_route(ALL_OUTPUTS, "mono", 1.00);
// card and expansion slots, not present in Tec Toy Master System III
- MCFG_SMS_CARD_ADD("mycard", sms_cart, nullptr)
- MCFG_SMS_EXPANSION_ADD("smsexp", sms_expansion_devices, nullptr)
+ SMS_CARD_SLOT(config, "mycard", sms_cart, nullptr);
+ SMS_EXPANSION_SLOT(config, "smsexp", sms_expansion_devices, nullptr);
m_has_bios_full = true;
m_has_pwr_led = true;
MACHINE_CONFIG_END
-MACHINE_CONFIG_START(sms_state::sms_br_base)
+void sms_state::sms_br_base(machine_config &config)
+{
sms_base(config);
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, MASTER_CLOCK_PALM/3)
- MCFG_DEVICE_PROGRAM_MAP(sms_mem)
- MCFG_DEVICE_IO_MAP(sms_io)
+ Z80(config, m_maincpu, MASTER_CLOCK_PALM/3);
+ m_maincpu->set_addrmap(AS_PROGRAM, &sms_state::sms_mem);
+ m_maincpu->set_addrmap(AS_IO, &sms_state::sms_io);
// PAL-M has near the same frequency of NTSC
- MCFG_QUANTUM_TIME(attotime::from_hz(60))
-
- /* actually, PSG is embedded in the VDP chip */
- MCFG_DEVICE_ADD("segapsg", SEGAPSG, MASTER_CLOCK_PALM/3)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.00)
-MACHINE_CONFIG_END
+ config.m_minimum_quantum = attotime::from_hz(60);
+}
MACHINE_CONFIG_START(sms_state::sms3_br)
sms_br_base(config);
@@ -847,11 +810,12 @@ MACHINE_CONFIG_START(sms_state::sms3_br)
MCFG_SCREEN_SMS_NTSC_RAW_PARAMS(MASTER_CLOCK_PALM/2)
MCFG_SCREEN_UPDATE_DRIVER(sms_state, screen_update_sms)
- MCFG_DEVICE_ADD("sms_vdp", SEGA315_5246, 0)
- MCFG_SEGA315_5246_SET_SCREEN("screen")
- MCFG_SEGA315_5246_IS_PAL(false) // PAL-M has same line count of NTSC
- MCFG_SEGA315_5246_INT_CB(INPUTLINE("maincpu", 0))
- MCFG_SEGA315_5246_PAUSE_CB(WRITELINE(*this, sms_state, sms_pause_callback))
+ SEGA315_5246(config, m_vdp, MASTER_CLOCK_PALM);
+ m_vdp->set_screen(m_main_scr);
+ m_vdp->set_is_pal(false); // PAL-M has same line count of NTSC
+ m_vdp->irq().set_inputline(m_maincpu, 0);
+ m_vdp->pause().set(FUNC(sms_state::sms_pause_callback));
+ m_vdp->add_route(ALL_OUTPUTS, "mono", 1.00);
m_has_bios_full = true;
MACHINE_CONFIG_END
@@ -859,8 +823,7 @@ MACHINE_CONFIG_END
MACHINE_CONFIG_START(sms_state::sms1_br)
sms_br_base(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(sms1_mem) // This adds the SegaScope handlers for 3-D glasses
+ m_maincpu->set_addrmap(AS_PROGRAM, &sms_state::sms1_mem); // This adds the SegaScope handlers for 3-D glasses
/* video hardware */
// PAL-M height/width parameters are the same of NTSC screens.
@@ -883,106 +846,108 @@ MACHINE_CONFIG_START(sms_state::sms1_br)
MCFG_VIDEO_START_OVERRIDE(sms_state,sms1)
MCFG_VIDEO_RESET_OVERRIDE(sms_state,sms1)
- MCFG_DEVICE_ADD("sms_vdp", SEGA315_5124, 0)
- MCFG_SEGA315_5124_SET_SCREEN("screen")
- MCFG_SEGA315_5124_IS_PAL(false) // PAL-M has same line count of NTSC
- MCFG_SEGA315_5124_INT_CB(INPUTLINE("maincpu", 0))
- MCFG_SEGA315_5124_PAUSE_CB(WRITELINE(*this, sms_state, sms_pause_callback))
+ SEGA315_5124(config, m_vdp, MASTER_CLOCK_PALM);
+ m_vdp->set_screen(m_main_scr);
+ m_vdp->set_is_pal(false); // PAL-M has same line count of NTSC
+ m_vdp->irq().set_inputline(m_maincpu, 0);
+ m_vdp->pause().set(FUNC(sms_state::sms_pause_callback));
+ m_vdp->add_route(ALL_OUTPUTS, "mono", 1.00);
// card and expansion slots, not present in Tec Toy Master System III
- MCFG_SMS_CARD_ADD("mycard", sms_cart, nullptr)
- MCFG_SMS_EXPANSION_ADD("smsexp", sms_expansion_devices, nullptr)
+ SMS_CARD_SLOT(config, "mycard", sms_cart, nullptr);
+ SMS_EXPANSION_SLOT(config, "smsexp", sms_expansion_devices, nullptr);
m_has_bios_full = true;
m_has_pwr_led = true;
MACHINE_CONFIG_END
-MACHINE_CONFIG_START(sms_state::sms2_kr)
+void sms_state::sms2_kr(machine_config &config)
+{
sms2_ntsc(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_IO_MAP(smskr_io)
- MCFG_DEVICE_REMOVE("slot")
- MCFG_SG1000MK3_CARTRIDGE_ADD("slot", sg1000mk3_cart, nullptr)
- MCFG_SOFTWARE_LIST_ADD("cart_list2","sg1000")
+ m_maincpu->set_addrmap(AS_IO, &sms_state::smskr_io);
+
+ config.device_remove("slot");
+ SG1000MK3_CART_SLOT(config, "slot", sg1000mk3_cart, nullptr);
+ SOFTWARE_LIST(config, "cart_list2").set_original("sg1000");
// Despite having a Japanese cartridge slot, this version is detected as Export region.
m_has_jpn_sms_cart_slot = true;
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(sms_state::sms1_kr)
+void sms_state::sms1_kr(machine_config &config)
+{
sms1_ntsc(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_IO_MAP(smskr_io)
+
+ m_maincpu->set_addrmap(AS_IO, &sms_state::smskr_io);
// need to replace the cartridge slot with the Japanese version, so to
// keep the usual media order, remove and reinsert all of them.
- MCFG_DEVICE_REMOVE("slot")
- MCFG_DEVICE_REMOVE("mycard")
- MCFG_DEVICE_REMOVE("smsexp")
- MCFG_SG1000MK3_CARTRIDGE_ADD("slot", sg1000mk3_cart, nullptr)
- MCFG_SMS_CARD_ADD("mycard", sms_cart, nullptr)
- MCFG_SMS_EXPANSION_ADD("smsexp", sms_expansion_devices, nullptr)
+ config.device_remove("slot");
+ config.device_remove("mycard");
+ config.device_remove("smsexp");
+ SG1000MK3_CART_SLOT(config, "slot", sg1000mk3_cart, nullptr);
+ SMS_CARD_SLOT(config, "mycard", sms_cart, nullptr);
+ SMS_EXPANSION_SLOT(config, "smsexp", sms_expansion_devices, nullptr);
- MCFG_SOFTWARE_LIST_ADD("cart_list2","sg1000")
+ SOFTWARE_LIST(config, "cart_list2").set_original("sg1000");
- MCFG_DEVICE_MODIFY("sms_vdp")
- MCFG_SEGA315_5124_CSYNC_CB(WRITELINE(*this, sms_state, sms_csync_callback))
+ m_vdp->csync().set(FUNC(sms_state::sms_csync_callback));
m_has_bios_full = false;
m_has_bios_2000 = true;
m_ioctrl_region_is_japan = true;
m_has_jpn_sms_cart_slot = true;
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(sms_state::smsj)
+void sms_state::smsj(machine_config &config)
+{
sms1_kr(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_IO_MAP(smsj_io)
- MCFG_DEVICE_ADD("ym2413", YM2413, XTAL(10'738'635)/3)
+ m_maincpu->set_addrmap(AS_IO, &sms_state::smsj_io);
+
+ YM2413(config, m_ym, XTAL(10'738'635)/3);
// if this output gain is changed, the gain set when unmute the output need
// to be changed too, probably along the gain set for the Mark III FM Unit.
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.00)
+ m_ym->add_route(ALL_OUTPUTS, "mono", 1.00);
m_is_smsj = true;
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(sms_state::sg1000m3)
+void sms_state::sg1000m3(machine_config &config)
+{
sms1_ntsc(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_IO_MAP(sg1000m3_io)
+
+ m_maincpu->set_addrmap(AS_IO, &sms_state::sg1000m3_io);
// Remove and reinsert all media slots, as done with the sms1_kr config,
// and also replace the expansion slot with the SG-1000 version.
- MCFG_DEVICE_REMOVE("slot")
- MCFG_DEVICE_REMOVE("mycard")
- MCFG_DEVICE_REMOVE("smsexp")
- MCFG_SG1000MK3_CARTRIDGE_ADD("slot", sg1000mk3_cart, nullptr)
- MCFG_SMS_CARD_ADD("mycard", sms_cart, nullptr)
- MCFG_SG1000_EXPANSION_ADD("sgexp", sg1000_expansion_devices, nullptr, false)
+ config.device_remove("slot");
+ config.device_remove("mycard");
+ config.device_remove("smsexp");
+ SG1000MK3_CART_SLOT(config, "slot", sg1000mk3_cart, nullptr);
+ SMS_CARD_SLOT(config, "mycard", sms_cart, nullptr);
+ SG1000_EXPANSION_SLOT(config, "sgexp", sg1000_expansion_devices, nullptr, false);
- MCFG_SOFTWARE_LIST_ADD("cart_list2","sg1000")
+ SOFTWARE_LIST(config, "cart_list2").set_original("sg1000");
// Mark III does not have TH connected.
- MCFG_SMS_CONTROL_PORT_MODIFY(CONTROL1_TAG)
- MCFG_SMS_CONTROL_PORT_TH_INPUT_HANDLER(NOOP)
- MCFG_SMS_CONTROL_PORT_MODIFY(CONTROL2_TAG)
- MCFG_SMS_CONTROL_PORT_TH_INPUT_HANDLER(NOOP)
+ m_port_ctrl1->th_input_handler().set_nop();
+ m_port_ctrl2->th_input_handler().set_nop();
m_has_bios_full = false;
m_is_mark_iii = true;
m_has_jpn_sms_cart_slot = true;
-MACHINE_CONFIG_END
+}
MACHINE_CONFIG_START(sms_state::gamegear)
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, MASTER_CLOCK_GG/9)
- MCFG_DEVICE_PROGRAM_MAP(sms_mem)
- MCFG_DEVICE_IO_MAP(gg_io)
+ Z80(config, m_maincpu, MASTER_CLOCK_GG/9);
+ m_maincpu->set_addrmap(AS_PROGRAM, &sms_state::sms_mem);
+ m_maincpu->set_addrmap(AS_IO, &sms_state::gg_io);
- MCFG_QUANTUM_TIME(attotime::from_hz(60))
+ config.m_minimum_quantum = attotime::from_hz(60);
/* video hardware */
MCFG_SCREEN_ADD("screen", LCD)
@@ -992,41 +957,39 @@ MACHINE_CONFIG_START(sms_state::gamegear)
MCFG_VIDEO_START_OVERRIDE(sms_state,gamegear)
MCFG_VIDEO_RESET_OVERRIDE(sms_state,gamegear)
- /* VDP chip of the Gamegear 2 ASIC version */
- MCFG_DEVICE_ADD("sms_vdp", SEGA315_5377, 0)
- MCFG_SEGA315_5377_SET_SCREEN("screen")
- MCFG_SEGA315_5377_IS_PAL(false)
- MCFG_SEGA315_5377_INT_CB(INPUTLINE("maincpu", 0))
- MCFG_SEGA315_5377_PAUSE_CB(WRITELINE(*this, sms_state, sms_pause_callback))
-
/* sound hardware */
SPEAKER(config, "lspeaker").front_left();
SPEAKER(config, "rspeaker").front_right();
- /* actually, PSG is embedded in the VDP chip */
- MCFG_DEVICE_ADD("gamegear", GAMEGEAR, MASTER_CLOCK_GG/9)
- MCFG_SOUND_ROUTE(0, "lspeaker", 1.00)
- MCFG_SOUND_ROUTE(1, "rspeaker", 1.00)
+ /* VDP chip of the Gamegear 2 ASIC version */
+ SEGA315_5377(config, m_vdp, MASTER_CLOCK_GG/3);
+ m_vdp->set_screen(m_main_scr);
+ m_vdp->set_is_pal(false);
+ m_vdp->irq().set_inputline(m_maincpu, 0);
+ m_vdp->pause().set(FUNC(sms_state::sms_pause_callback));
+ m_vdp->add_route(0, "lspeaker", 1.00);
+ m_vdp->add_route(1, "rspeaker", 1.00);
/* cartridge */
- MCFG_GG_CARTRIDGE_ADD("slot", gg_cart, nullptr)
+ GAMEGEAR_CART_SLOT(config, "slot", gg_cart, nullptr);
- MCFG_SOFTWARE_LIST_ADD("cart_list", "gamegear")
+ SOFTWARE_LIST(config, "cart_list").set_original("gamegear");
- MCFG_GG_EXT_PORT_ADD("ext", gg_ext_port_devices, nullptr)
- MCFG_GG_EXT_PORT_TH_INPUT_HANDLER(WRITELINE(*this, sms_state, gg_ext_th_input))
+ GG_EXT_PORT(config, m_port_gg_ext, gg_ext_port_devices, nullptr);
+ m_port_gg_ext->th_input_handler().set(FUNC(sms_state::gg_ext_th_input));
// only for GG-TV mod (may be simulated with a driver modified with SMS screen settings)
- //MCFG_GG_EXT_PORT_PIXEL_HANDLER(READ32(*this, sms_state, sms_pixel_color))
+ //m_port_gg_ext->pixel_handler().set(FUNC(sms_state::sms_pixel_color));
m_is_gamegear = true;
m_has_bios_0400 = true;
m_has_pwr_led = true;
MACHINE_CONFIG_END
-MACHINE_CONFIG_START(sms_state::gamegeaj)
+void sms_state::gamegeaj(machine_config &config)
+{
gamegear(config);
m_ioctrl_region_is_japan = true;
-MACHINE_CONFIG_END
+}
ROM_START(sms1)
diff --git a/src/mame/drivers/sms_bootleg.cpp b/src/mame/drivers/sms_bootleg.cpp
index bd9dba5a882..6a6b1e51019 100644
--- a/src/mame/drivers/sms_bootleg.cpp
+++ b/src/mame/drivers/sms_bootleg.cpp
@@ -264,7 +264,7 @@ void smsbootleg_state::sms_supergame_io(address_map &map)
map(0x14, 0x14).nopr(); //AM_READ_PORT("IN1") // seem to be from a coinage / timer MCU, changing them directly changes the credits / time value
map(0x18, 0x18).w(FUNC(smsbootleg_state::port18_w));
- map(0x40, 0x7f).rw(FUNC(smsbootleg_state::sms_count_r), FUNC(smsbootleg_state::sms_psg_w));
+ map(0x40, 0x7f).r(FUNC(smsbootleg_state::sms_count_r)).w(m_vdp, FUNC(sega315_5124_device::psg_w));
map(0x80, 0x80).mirror(0x3e).rw(m_vdp, FUNC(sega315_5124_device::data_read), FUNC(sega315_5124_device::data_write));
map(0x81, 0x81).mirror(0x3e).rw(m_vdp, FUNC(sega315_5124_device::control_read), FUNC(sega315_5124_device::control_write));
@@ -273,34 +273,32 @@ void smsbootleg_state::sms_supergame_io(address_map &map)
-MACHINE_CONFIG_START(smsbootleg_state::sms_supergame)
+void smsbootleg_state::sms_supergame(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, XTAL(10'738'635)/3)
- MCFG_DEVICE_PROGRAM_MAP(sms_supergame_map)
- MCFG_DEVICE_IO_MAP(sms_supergame_io)
+ Z80(config, m_maincpu, XTAL(10'738'635)/3);
+ m_maincpu->set_addrmap(AS_PROGRAM, &smsbootleg_state::sms_supergame_map);
+ m_maincpu->set_addrmap(AS_IO, &smsbootleg_state::sms_supergame_io);
- MCFG_QUANTUM_TIME(attotime::from_hz(60))
+ config.m_minimum_quantum = attotime::from_hz(60);
/* sound hardware */
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("segapsg", SEGAPSG, XTAL(10'738'635)/3)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.00)
-
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_RAW_PARAMS(XTAL(10'738'635)/2, \
+ SCREEN(config, m_main_scr, SCREEN_TYPE_RASTER);
+ m_main_scr->set_raw(XTAL(10'738'635)/2, \
sega315_5124_device::WIDTH , sega315_5124_device::LBORDER_START + sega315_5124_device::LBORDER_WIDTH - 2, sega315_5124_device::LBORDER_START + sega315_5124_device::LBORDER_WIDTH + 256 + 10, \
- sega315_5124_device::HEIGHT_NTSC, sega315_5124_device::TBORDER_START + sega315_5124_device::NTSC_224_TBORDER_HEIGHT, sega315_5124_device::TBORDER_START + sega315_5124_device::NTSC_224_TBORDER_HEIGHT + 224)
- MCFG_SCREEN_REFRESH_RATE(XTAL(10'738'635)/2 / (sega315_5124_device::WIDTH * sega315_5124_device::HEIGHT_NTSC))
- MCFG_SCREEN_UPDATE_DRIVER(sms_state, screen_update_sms)
-
- MCFG_DEVICE_ADD("sms_vdp", SEGA315_5246, 0)
- MCFG_SEGA315_5246_SET_SCREEN("screen")
- MCFG_SEGA315_5246_IS_PAL(false)
- MCFG_SEGA315_5246_INT_CB(INPUTLINE("maincpu", 0))
- MCFG_SEGA315_5246_PAUSE_CB(WRITELINE(*this, sms_state, sms_pause_callback))
-
-MACHINE_CONFIG_END
+ sega315_5124_device::HEIGHT_NTSC, sega315_5124_device::TBORDER_START + sega315_5124_device::NTSC_224_TBORDER_HEIGHT, sega315_5124_device::TBORDER_START + sega315_5124_device::NTSC_224_TBORDER_HEIGHT + 224);
+ m_main_scr->set_refresh_hz(XTAL(10'738'635)/2 / (sega315_5124_device::WIDTH * sega315_5124_device::HEIGHT_NTSC));
+ m_main_scr->set_screen_update(FUNC(sms_state::screen_update_sms));
+
+ SEGA315_5246(config, m_vdp, XTAL(10'738'635));
+ m_vdp->set_screen(m_main_scr);
+ m_vdp->set_is_pal(false);
+ m_vdp->irq().set_inputline(m_maincpu, 0);
+ m_vdp->pause().set(FUNC(sms_state::sms_pause_callback));
+ m_vdp->add_route(ALL_OUTPUTS, "mono", 1.00);
+}
diff --git a/src/mame/drivers/smsmcorp.cpp b/src/mame/drivers/smsmcorp.cpp
index 3ee0d75c1ba..6839e4c8286 100644
--- a/src/mame/drivers/smsmcorp.cpp
+++ b/src/mame/drivers/smsmcorp.cpp
@@ -551,14 +551,15 @@ void smsmfg_state::machine_reset()
m_communication_port_status = 0;
}
-MACHINE_CONFIG_START(smsmfg_state::sms)
- MCFG_DEVICE_ADD("maincpu", I8088, XTAL(24'000'000)/8)
- MCFG_DEVICE_PROGRAM_MAP(sms_map)
+void smsmfg_state::sms(machine_config &config)
+{
+ I8088(config, m_maincpu, XTAL(24'000'000)/8);
+ m_maincpu->set_addrmap(AS_PROGRAM, &smsmfg_state::sms_map);
- MCFG_DEVICE_ADD("soundcpu", Z80, XTAL(16'000'000)/8)
- MCFG_DEVICE_PROGRAM_MAP(sub_map)
+ z80_device &soundcpu(Z80(config, "soundcpu", XTAL(16'000'000)/8));
+ soundcpu.set_addrmap(AS_PROGRAM, &smsmfg_state::sub_map);
- MCFG_QUANTUM_TIME(attotime::from_hz(6000))
+ config.m_minimum_quantum = attotime::from_hz(6000);
i8255_device &ppi0(I8255A(config, "ppi8255_0"));
ppi0.out_pa_callback().set(FUNC(smsmfg_state::ppi0_a_w));
@@ -573,13 +574,13 @@ MACHINE_CONFIG_START(smsmfg_state::sms)
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(0x1b0, 0x100)
- MCFG_SCREEN_VISIBLE_AREA(0, 0x1af, 0, 0xff)
- MCFG_SCREEN_UPDATE_DRIVER(smsmfg_state, screen_update_sms)
- MCFG_SCREEN_PALETTE("palette")
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_refresh_hz(60);
+ m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ m_screen->set_size(0x1b0, 0x100);
+ m_screen->set_visarea(0, 0x1af, 0, 0xff);
+ m_screen->set_screen_update(FUNC(smsmfg_state::screen_update_sms));
+ m_screen->set_palette("palette");
PALETTE(config, "palette", palette_device::BGR_3BIT);
@@ -587,16 +588,16 @@ MACHINE_CONFIG_START(smsmfg_state::sms)
SPEAKER(config, "mono").front_center();
AY8910(config, "aysnd", XTAL(16'000'000)/8).add_route(ALL_OUTPUTS, "mono", 0.25);
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(smsmfg_state::sureshot)
+void smsmfg_state::sureshot(machine_config &config)
+{
sms(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(sureshot_map)
+ m_maincpu->set_addrmap(AS_PROGRAM, &smsmfg_state::sureshot_map);
MCFG_MACHINE_START_OVERRIDE(smsmfg_state,sureshot)
-MACHINE_CONFIG_END
+}
/*************************************
*
diff --git a/src/mame/drivers/snes.cpp b/src/mame/drivers/snes.cpp
index a3df5a5be09..a5103b41fcb 100644
--- a/src/mame/drivers/snes.cpp
+++ b/src/mame/drivers/snes.cpp
@@ -154,10 +154,10 @@ READ8_MEMBER( snes_console_state::snes20_hi_r )
// take care of add-on IO
if ((m_cartslot->get_type() == SNES_ST010 || m_cartslot->get_type() == SNES_ST011)
&& (offset >= 0x600000 && offset < 0x680000 && (offset & 0xffff) < 0x4000))
- return m_cartslot->chip_read(space, offset);
+ return m_cartslot->chip_read(offset);
else if ((m_cartslot->get_type() == SNES_ST010 || m_cartslot->get_type() == SNES_ST011)
&& (offset >= 0x680000 && offset < 0x700000 && (offset & 0xffff) < 0x8000))
- return m_cartslot->chip_read(space, offset);
+ return m_cartslot->chip_read(offset);
else if (m_cartslot->get_type() == SNES_CX4
&& (offset < 0x400000 && (offset & 0xffff) >= 0x6000 && (offset & 0xffff) < 0x8000)) // hack until we emulate the real CPU
return CX4_read((offset & 0xffff) - 0x6000);
@@ -169,37 +169,37 @@ READ8_MEMBER( snes_console_state::snes20_hi_r )
else if (address < 0x6000)
return snes_r_io(space, address);
else if (address < 0x8000)
- return snes_open_bus_r(space, 0);
+ return snes_open_bus_r();
else
- return m_cartslot->read_h(space, offset);
+ return m_cartslot->read_h(offset);
}
else if (offset < 0x700000)
{
if (address < 0x8000)
- return snes_open_bus_r(space, 0);
+ return snes_open_bus_r();
else
- return m_cartslot->read_h(space, offset);
+ return m_cartslot->read_h(offset);
}
else
{
if (m_type == SNES_SUFAMITURBO && address >= 0x8000 && offset < 0x740000)
- return m_cartslot->read_h(space, offset);
+ return m_cartslot->read_h(offset);
// here usually there is SRAM mirrored in the whole range, but if ROM is very large then arrives here too (see tokimeki and wizardg4)
if (m_cartslot->m_cart->get_rom_size() > 0x200000 && address >= 0x8000)
- return m_cartslot->read_h(space, offset);
+ return m_cartslot->read_h(offset);
else
{
if (m_cartslot->m_cart->get_nvram_size() > 0x8000)
{
// In this case, SRAM is mapped in 0x8000 chunks at diff offsets: 0x700000-0x707fff, 0x710000-0x717fff, etc.
offset = ((offset - 0x700000) / 0x10000) * 0x8000 + (offset & 0x7fff);
- return m_cartslot->read_ram(space, offset);
+ return m_cartslot->read_ram(offset);
}
else if (m_cartslot->m_cart->get_nvram_size() > 0)
- return m_cartslot->read_ram(space, offset);
+ return m_cartslot->read_ram(offset);
else
- return snes_open_bus_r(space, 0);
+ return snes_open_bus_r();
}
}
}
@@ -211,16 +211,16 @@ WRITE8_MEMBER( snes_console_state::snes20_hi_w )
// take care of add-on IO
if ((m_cartslot->get_type() == SNES_ST010 || m_cartslot->get_type() == SNES_ST011)
&& (offset >= 0x600000 && offset < 0x680000 && (offset & 0xffff) < 0x4000))
- { m_cartslot->chip_write(space, offset, data); return; }
+ { m_cartslot->chip_write(offset, data); return; }
else if ((m_cartslot->get_type() == SNES_ST010 || m_cartslot->get_type() == SNES_ST011)
&& (offset >= 0x680000 && offset < 0x700000 && (offset & 0xffff) < 0x8000))
- { m_cartslot->chip_write(space, offset, data); return; }
+ { m_cartslot->chip_write(offset, data); return; }
else if (m_cartslot->get_type() == SNES_CX4
&& (offset < 0x400000 && (offset & 0xffff) >= 0x6000 && (offset & 0xffff) < 0x8000)) // hack until we emulate the real CPU
{ CX4_write(machine(), (offset & 0xffff) - 0x6000, data); return; }
else if (m_type == SNES_SUFAMITURBO
&& address >= 0x8000 && ((offset >= 0x600000 && offset < 0x640000) || (offset >= 0x700000 && offset < 0x740000)))
- { m_cartslot->write_h(space, offset, data); return; }
+ { m_cartslot->write_h(offset, data); return; }
if (offset < 0x400000)
{
@@ -235,10 +235,10 @@ WRITE8_MEMBER( snes_console_state::snes20_hi_w )
{
// In this case, SRAM is mapped in 0x8000 chunks at diff offsets: 0x700000-0x707fff, 0x710000-0x717fff, etc.
offset = ((offset - 0x700000) / 0x10000) * 0x8000 + (offset & 0x7fff);
- m_cartslot->write_ram(space, offset, data);
+ m_cartslot->write_ram(offset, data);
}
else if (m_cartslot->m_cart->get_nvram_size() > 0)
- m_cartslot->write_ram(space, offset, data);
+ m_cartslot->write_ram(offset, data);
}
}
@@ -249,10 +249,10 @@ READ8_MEMBER( snes_console_state::snes20_lo_r )
// take care of add-on IO
if ((m_cartslot->get_type() == SNES_ST010 /*|| m_cartslot->get_type() == SNES_ST011*/) // why does this break moritash?
&& (offset >= 0x600000 && offset < 0x680000 && (offset & 0xffff) < 0x4000))
- return m_cartslot->chip_read(space, offset);
+ return m_cartslot->chip_read(offset);
else if ((m_cartslot->get_type() == SNES_ST010 || m_cartslot->get_type() == SNES_ST011)
&& (offset >= 0x680000 && offset < 0x700000 && (offset & 0xffff) < 0x8000))
- return m_cartslot->chip_read(space, offset);
+ return m_cartslot->chip_read(offset);
else if (m_cartslot->get_type() == SNES_CX4
&& (offset < 0x400000 && (offset & 0xffff) >= 0x6000 && (offset & 0xffff) < 0x8000)) // hack until we emulate the real CPU
return CX4_read((offset & 0xffff) - 0x6000);
@@ -264,37 +264,37 @@ READ8_MEMBER( snes_console_state::snes20_lo_r )
else if (address < 0x6000)
return snes_r_io(space, address);
else if (address < 0x8000)
- return snes_open_bus_r(space, 0);
+ return snes_open_bus_r();
else
- return m_cartslot->read_l(space, offset);
+ return m_cartslot->read_l(offset);
}
else if (offset < 0x700000)
{
if (address < 0x8000)
- return snes_open_bus_r(space, 0);
+ return snes_open_bus_r();
else
- return m_cartslot->read_l(space, offset);
+ return m_cartslot->read_l(offset);
}
else
{
if (m_type == SNES_SUFAMITURBO && address >= 0x8000 && offset < 0x740000)
- return m_cartslot->read_l(space, offset);
+ return m_cartslot->read_l(offset);
// here usually there is SRAM mirrored in the whole range, but if ROM is very large then arrives here too (see tokimeki and wizardg4)
if (m_cartslot->m_cart->get_rom_size() > 0x200000 && address >= 0x8000)
- return m_cartslot->read_l(space, offset);
+ return m_cartslot->read_l(offset);
else
{
if (m_cartslot->m_cart->get_nvram_size() > 0x8000)
{
// In this case, SRAM is mapped in 0x8000 chunks at diff offsets: 0x700000-0x707fff, 0x710000-0x717fff, etc.
offset = ((offset - 0x700000) / 0x10000) * 0x8000 + (offset & 0x7fff);
- return m_cartslot->read_ram(space, offset);
+ return m_cartslot->read_ram(offset);
}
else if (m_cartslot->m_cart->get_nvram_size() > 0)
- return m_cartslot->read_ram(space, offset);
+ return m_cartslot->read_ram(offset);
else
- return snes_open_bus_r(space, 0);
+ return snes_open_bus_r();
}
}
}
@@ -303,7 +303,7 @@ WRITE8_MEMBER( snes_console_state::snes20_lo_w )
{
if (m_type == SNES_SUFAMITURBO
&& (offset & 0xffff) >= 0x8000 && ((offset >= 0x600000 && offset < 0x640000) || (offset >= 0x700000 && offset < 0x740000)))
- { m_cartslot->write_l(space, offset, data); return; }
+ { m_cartslot->write_l(offset, data); return; }
// other add-on writes matches the hi handler
snes20_hi_w(space, offset, data, 0xff);
@@ -329,7 +329,7 @@ READ8_MEMBER( snes_console_state::snes21_lo_r )
if (m_type == SNES_BSXHI && m_cartslot->m_cart->get_nvram_size() && offset >= 0x200000)
{
int mask = (m_cartslot->m_cart->get_nvram_size() - 1) & 0x7fff;
- return m_cartslot->read_ram(space, (offset - 0x6000) & mask);
+ return m_cartslot->read_ram((offset - 0x6000) & mask);
}
if (m_cartslot->m_cart->get_nvram_size() && offset >= 0x300000)
@@ -337,15 +337,15 @@ READ8_MEMBER( snes_console_state::snes21_lo_r )
/* Donkey Kong Country checks this and detects a copier if 0x800 is not masked out due to sram size */
/* OTOH Secret of Mana does not work properly if sram is not mirrored on later banks */
int mask = (m_cartslot->m_cart->get_nvram_size() - 1) & 0x7fff; /* Limit SRAM size to what's actually present */
- return m_cartslot->read_ram(space, (offset - 0x6000) & mask);
+ return m_cartslot->read_ram((offset - 0x6000) & mask);
}
else
- return snes_open_bus_r(space, 0);
+ return snes_open_bus_r();
}
}
// ROM access
- return m_cartslot->read_l(space, offset);
+ return m_cartslot->read_l(offset);
}
WRITE8_MEMBER( snes_console_state::snes21_lo_w )
@@ -362,7 +362,7 @@ WRITE8_MEMBER( snes_console_state::snes21_lo_w )
if (m_type == SNES_BSXHI && m_cartslot->m_cart->get_nvram_size() && offset >= 0x200000)
{
int mask = (m_cartslot->m_cart->get_nvram_size() - 1) & 0x7fff;
- m_cartslot->write_ram(space, (offset - 0x6000) & mask, data);
+ m_cartslot->write_ram((offset - 0x6000) & mask, data);
return;
}
if (m_cartslot->m_cart->get_nvram_size() && offset >= 0x300000)
@@ -370,7 +370,7 @@ WRITE8_MEMBER( snes_console_state::snes21_lo_w )
/* Donkey Kong Country checks this and detects a copier if 0x800 is not masked out due to sram size */
/* OTOH Secret of Mana does not work properly if sram is not mirrored on later banks */
int mask = (m_cartslot->m_cart->get_nvram_size() - 1) & 0x7fff; /* Limit SRAM size to what's actually present */
- m_cartslot->write_ram(space, (offset - 0x6000) & mask, data);
+ m_cartslot->write_ram((offset - 0x6000) & mask, data);
}
}
}
@@ -391,7 +391,7 @@ READ8_MEMBER( snes_console_state::snes21_hi_r )
if (m_type == SNES_BSXHI && m_cartslot->m_cart->get_nvram_size() && offset >= 0x200000)
{
int mask = (m_cartslot->m_cart->get_nvram_size() - 1) & 0x7fff;
- return m_cartslot->read_ram(space, (offset - 0x6000) & mask);
+ return m_cartslot->read_ram((offset - 0x6000) & mask);
}
if (m_cartslot->m_cart->get_nvram_size() && offset >= 0x300000)
@@ -399,15 +399,15 @@ READ8_MEMBER( snes_console_state::snes21_hi_r )
/* Donkey Kong Country checks this and detects a copier if 0x800 is not masked out due to sram size */
/* OTOH Secret of Mana does not work properly if sram is not mirrored on later banks */
int mask = (m_cartslot->m_cart->get_nvram_size() - 1) & 0x7fff; /* Limit SRAM size to what's actually present */
- return m_cartslot->read_ram(space, (offset - 0x6000) & mask);
+ return m_cartslot->read_ram((offset - 0x6000) & mask);
}
else
- return snes_open_bus_r(space, 0);
+ return snes_open_bus_r();
}
}
// ROM access
- return m_cartslot->read_h(space, offset);
+ return m_cartslot->read_h(offset);
}
WRITE8_MEMBER( snes_console_state::snes21_hi_w )
@@ -424,7 +424,7 @@ WRITE8_MEMBER( snes_console_state::snes21_hi_w )
if (m_type == SNES_BSXHI && m_cartslot->m_cart->get_nvram_size() && offset >= 0x200000)
{
int mask = (m_cartslot->m_cart->get_nvram_size() - 1) & 0x7fff;
- m_cartslot->write_ram(space, (offset - 0x6000) & mask, data);
+ m_cartslot->write_ram((offset - 0x6000) & mask, data);
return;
}
if (m_cartslot->m_cart->get_nvram_size() && offset >= 0x300000)
@@ -432,7 +432,7 @@ WRITE8_MEMBER( snes_console_state::snes21_hi_w )
/* Donkey Kong Country checks this and detects a copier if 0x800 is not masked out due to sram size */
/* OTOH Secret of Mana does not work properly if sram is not mirrored on later banks */
int mask = (m_cartslot->m_cart->get_nvram_size() - 1) & 0x7fff; /* Limit SRAM size to what's actually present */
- m_cartslot->write_ram(space, (offset - 0x6000) & mask, data);
+ m_cartslot->write_ram((offset - 0x6000) & mask, data);
}
}
}
@@ -453,19 +453,19 @@ READ8_MEMBER( snes_console_state::snessfx_hi_r )
else if (address < 0x6000)
{
if (address >= 0x3000 && address < 0x3300)
- return m_cartslot->chip_read(space, offset);
+ return m_cartslot->chip_read(offset);
else
return snes_r_io(space, address);
}
else if (address < 0x8000)
- return m_cartslot->read_ram(space, offset & 0x1fff);
+ return m_cartslot->read_ram(offset & 0x1fff);
else
- return m_cartslot->read_h(space, offset);
+ return m_cartslot->read_h(offset);
}
else if (offset < 0x600000)
- return m_cartslot->read_h(space, offset);
+ return m_cartslot->read_h(offset);
else
- return m_cartslot->read_ram(space, offset);
+ return m_cartslot->read_ram(offset);
}
READ8_MEMBER( snes_console_state::snessfx_lo_r )
@@ -479,19 +479,19 @@ READ8_MEMBER( snes_console_state::snessfx_lo_r )
else if (address < 0x6000)
{
if (address >= 0x3000 && address < 0x3300)
- return m_cartslot->chip_read(space, offset);
+ return m_cartslot->chip_read(offset);
else
return snes_r_io(space, address);
}
else if (address < 0x8000)
- return m_cartslot->read_ram(space, offset & 0x1fff);
+ return m_cartslot->read_ram(offset & 0x1fff);
else
- return m_cartslot->read_l(space, offset);
+ return m_cartslot->read_l(offset);
}
else if (offset < 0x600000)
- return m_cartslot->read_l(space, offset);
+ return m_cartslot->read_l(offset);
else
- return m_cartslot->read_ram(space, offset);
+ return m_cartslot->read_ram(offset);
}
WRITE8_MEMBER( snes_console_state::snessfx_hi_w )
@@ -504,15 +504,15 @@ WRITE8_MEMBER( snes_console_state::snessfx_hi_w )
else if (address < 0x6000)
{
if (address >= 0x3000 && address < 0x3300)
- m_cartslot->chip_write(space, offset, data);
+ m_cartslot->chip_write(offset, data);
else
snes_w_io(space, address, data);
}
else if (address < 0x8000)
- m_cartslot->write_ram(space, offset & 0x1fff, data);
+ m_cartslot->write_ram(offset & 0x1fff, data);
}
else if (offset >= 0x600000)
- m_cartslot->write_ram(space, offset, data);
+ m_cartslot->write_ram(offset, data);
}
WRITE8_MEMBER( snes_console_state::snessfx_lo_w )
@@ -535,19 +535,19 @@ READ8_MEMBER( snes_console_state::snessa1_hi_r )
else if (address < 0x6000)
{
if (address >= 0x2200 && address < 0x2400)
- return m_cartslot->chip_read(space, offset); // SA-1 Regs
+ return m_cartslot->chip_read(offset); // SA-1 Regs
else if (address >= 0x3000 && address < 0x3800)
- return m_cartslot->chip_read(space, offset); // Internal SA-1 RAM (2K)
+ return m_cartslot->chip_read(offset); // Internal SA-1 RAM (2K)
else
return snes_r_io(space, address);
}
else if (address < 0x8000)
- return m_cartslot->chip_read(space, offset); // SA-1 BWRAM
+ return m_cartslot->chip_read(offset); // SA-1 BWRAM
else
- return m_cartslot->read_h(space, offset);
+ return m_cartslot->read_h(offset);
}
else
- return m_cartslot->read_h(space, offset);
+ return m_cartslot->read_h(offset);
}
READ8_MEMBER( snes_console_state::snessa1_lo_r )
@@ -561,19 +561,19 @@ READ8_MEMBER( snes_console_state::snessa1_lo_r )
else if (address < 0x6000)
{
if (address >= 0x2200 && address < 0x2400)
- return m_cartslot->chip_read(space, offset); // SA-1 Regs
+ return m_cartslot->chip_read(offset); // SA-1 Regs
else if (address >= 0x3000 && address < 0x3800)
- return m_cartslot->chip_read(space, offset); // Internal SA-1 RAM (2K)
+ return m_cartslot->chip_read(offset); // Internal SA-1 RAM (2K)
else
return snes_r_io(space, address);
}
else if (address < 0x8000)
- return m_cartslot->chip_read(space, offset); // SA-1 BWRAM
+ return m_cartslot->chip_read(offset); // SA-1 BWRAM
else
- return m_cartslot->read_l(space, offset);
+ return m_cartslot->read_l(offset);
}
else if (offset < 0x500000)
- return m_cartslot->chip_read(space, offset); // SA-1 BWRAM (not mirrored above!)
+ return m_cartslot->chip_read(offset); // SA-1 BWRAM (not mirrored above!)
else
return snes_r_io(space, address); // nothing mapped here!
}
@@ -588,21 +588,21 @@ WRITE8_MEMBER( snes_console_state::snessa1_hi_w )
else if (address < 0x6000)
{
if (address >= 0x2200 && address < 0x2400)
- m_cartslot->chip_write(space, offset, data); // SA-1 Regs
+ m_cartslot->chip_write(offset, data); // SA-1 Regs
else if (address >= 0x3000 && address < 0x3800)
- m_cartslot->chip_write(space, offset, data); // Internal SA-1 RAM (2K)
+ m_cartslot->chip_write(offset, data); // Internal SA-1 RAM (2K)
else
snes_w_io(space, address, data);
}
else if (address < 0x8000)
- m_cartslot->chip_write(space, offset, data); // SA-1 BWRAM
+ m_cartslot->chip_write(offset, data); // SA-1 BWRAM
}
}
WRITE8_MEMBER( snes_console_state::snessa1_lo_w )
{
if (offset >= 0x400000 && offset < 0x500000)
- m_cartslot->chip_write(space, offset, data); // SA-1 BWRAM (not mirrored above!)
+ m_cartslot->chip_write(offset, data); // SA-1 BWRAM (not mirrored above!)
else
snessa1_hi_w(space, offset, data, 0xff);
}
@@ -623,21 +623,21 @@ READ8_MEMBER( snes_console_state::snes7110_hi_r )
{
uint16_t limit = (m_cartslot->get_type() == SNES_SPC7110_RTC) ? 0x4843 : 0x4840;
if (address >= 0x4800 && address < limit)
- return m_cartslot->chip_read(space, address);
+ return m_cartslot->chip_read(address);
return snes_r_io(space, address);
}
else if (address < 0x8000)
{
if (offset < 0x10000)
- return m_cartslot->read_ram(space, offset);
+ return m_cartslot->read_ram(offset);
if (offset >= 0x300000 && offset < 0x310000)
- return m_cartslot->read_ram(space, offset);
+ return m_cartslot->read_ram(offset);
}
else
- return m_cartslot->read_h(space, offset);
+ return m_cartslot->read_h(offset);
}
- return m_cartslot->read_h(space, offset);
+ return m_cartslot->read_h(offset);
}
READ8_MEMBER( snes_console_state::snes7110_lo_r )
@@ -652,24 +652,24 @@ READ8_MEMBER( snes_console_state::snes7110_lo_r )
{
uint16_t limit = (m_cartslot->get_type() == SNES_SPC7110_RTC) ? 0x4843 : 0x4840;
if (address >= 0x4800 && address < limit)
- return m_cartslot->chip_read(space, address);
+ return m_cartslot->chip_read(address);
return snes_r_io(space, address);
}
else if (address < 0x8000)
{
if (offset < 0x10000)
- return m_cartslot->read_ram(space, offset);
+ return m_cartslot->read_ram(offset);
if (offset >= 0x300000 && offset < 0x310000)
- return m_cartslot->read_ram(space, offset);
+ return m_cartslot->read_ram(offset);
}
else
- return m_cartslot->read_l(space, offset);
+ return m_cartslot->read_l(offset);
}
if (offset >= 0x500000 && offset < 0x510000)
- return m_cartslot->chip_read(space, 0x4800);
+ return m_cartslot->chip_read(0x4800);
- return snes_open_bus_r(space, 0);
+ return snes_open_bus_r();
}
WRITE8_MEMBER( snes_console_state::snes7110_hi_w )
@@ -689,7 +689,7 @@ WRITE8_MEMBER( snes_console_state::snes7110_lo_w )
uint16_t limit = (m_cartslot->get_type() == SNES_SPC7110_RTC) ? 0x4843 : 0x4840;
if (address >= 0x4800 && address < limit)
{
- m_cartslot->chip_write(space, address, data);
+ m_cartslot->chip_write(address, data);
return;
}
snes_w_io(space, address, data);
@@ -697,9 +697,9 @@ WRITE8_MEMBER( snes_console_state::snes7110_lo_w )
else if (address < 0x8000)
{
if (offset < 0x10000)
- m_cartslot->write_ram(space, offset, data);
+ m_cartslot->write_ram(offset, data);
if (offset >= 0x300000 && offset < 0x310000)
- m_cartslot->write_ram(space, offset, data);
+ m_cartslot->write_ram(offset, data);
}
}
}
@@ -720,25 +720,25 @@ READ8_MEMBER( snes_console_state::snessdd1_lo_r )
else if (address < 0x6000)
{
if (address >= 0x4800 && address < 0x4808)
- return m_cartslot->chip_read(space, address);
+ return m_cartslot->chip_read(address);
return snes_r_io(space, address);
}
else if (address < 0x8000)
- return snes_open_bus_r(space, 0);
+ return snes_open_bus_r();
else
- return m_cartslot->read_l(space, offset);
+ return m_cartslot->read_l(offset);
}
else if (offset >= 0x700000 && address < 0x8000 && m_cartslot->m_cart->get_nvram_size()) // NVRAM access
- return m_cartslot->read_ram(space, offset);
+ return m_cartslot->read_ram(offset);
else // ROM access
- return m_cartslot->read_l(space, offset);
+ return m_cartslot->read_l(offset);
}
READ8_MEMBER( snes_console_state::snessdd1_hi_r )
{
if (offset >= 0x400000)
- return m_cartslot->read_h(space, offset);
+ return m_cartslot->read_h(offset);
else
return snessdd1_lo_r(space, offset, 0xff);
}
@@ -759,19 +759,19 @@ WRITE8_MEMBER( snes_console_state::snessdd1_hi_w )
{
if (address >= 0x4300 && address < 0x4380)
{
- m_cartslot->chip_write(space, address, data);
+ m_cartslot->chip_write(address, data);
// here we don't return, but we let the w_io happen...
}
if (address >= 0x4800 && address < 0x4808)
{
- m_cartslot->chip_write(space, address, data);
+ m_cartslot->chip_write(address, data);
return;
}
snes_w_io(space, address, data);
}
}
if (offset >= 0x700000 && address < 0x8000 && m_cartslot->m_cart->get_nvram_size())
- return m_cartslot->write_ram(space, offset, data);
+ return m_cartslot->write_ram(offset, data);
}
@@ -790,22 +790,22 @@ READ8_MEMBER( snes_console_state::snesbsx_hi_r )
else if (address < 0x6000)
{
if (address >= 0x2188 && address < 0x21a0)
- return m_cartslot->chip_read(space, offset);
+ return m_cartslot->chip_read(offset);
if (address >= 0x5000)
- return m_cartslot->chip_read(space, offset);
+ return m_cartslot->chip_read(offset);
return snes_r_io(space, address);
}
else if (address < 0x8000)
{
if (offset >= 0x200000)
- return m_cartslot->read_h(space, offset);
+ return m_cartslot->read_h(offset);
else
- return snes_open_bus_r(space, 0);
+ return snes_open_bus_r();
}
else
- return m_cartslot->read_h(space, offset);
+ return m_cartslot->read_h(offset);
}
- return m_cartslot->read_h(space, offset);
+ return m_cartslot->read_h(offset);
}
WRITE8_MEMBER( snes_console_state::snesbsx_hi_w )
@@ -819,12 +819,12 @@ WRITE8_MEMBER( snes_console_state::snesbsx_hi_w )
{
if (address >= 0x2188 && address < 0x21a0)
{
- m_cartslot->chip_write(space, offset, data);
+ m_cartslot->chip_write(offset, data);
return;
}
if (address >= 0x5000)
{
- m_cartslot->chip_write(space, offset, data);
+ m_cartslot->chip_write(offset, data);
return;
}
snes_w_io(space, address, data);
@@ -832,12 +832,12 @@ WRITE8_MEMBER( snes_console_state::snesbsx_hi_w )
else if (address < 0x8000)
{
if (offset >= 0x200000)
- return m_cartslot->write_l(space, offset, data);
+ return m_cartslot->write_l(offset, data);
}
else
- return m_cartslot->write_l(space, offset, data);
+ return m_cartslot->write_l(offset, data);
}
- return m_cartslot->write_l(space, offset, data);
+ return m_cartslot->write_l(offset, data);
}
READ8_MEMBER( snes_console_state::snesbsx_lo_r )
@@ -851,22 +851,22 @@ READ8_MEMBER( snes_console_state::snesbsx_lo_r )
else if (address < 0x6000)
{
if (address >= 0x2188 && address < 0x21a0)
- return m_cartslot->chip_read(space, offset);
+ return m_cartslot->chip_read(offset);
if (address >= 0x5000)
- return m_cartslot->chip_read(space, offset);
+ return m_cartslot->chip_read(offset);
return snes_r_io(space, address);
}
else if (address < 0x8000)
{
if (offset >= 0x200000)
- return m_cartslot->read_l(space, offset);
+ return m_cartslot->read_l(offset);
else
- return snes_open_bus_r(space, 0);
+ return snes_open_bus_r();
}
else
- return m_cartslot->read_l(space, offset);
+ return m_cartslot->read_l(offset);
}
- return m_cartslot->read_l(space, offset);
+ return m_cartslot->read_l(offset);
}
WRITE8_MEMBER( snes_console_state::snesbsx_lo_w )
@@ -890,14 +890,14 @@ READ8_MEMBER( snes_console_state::snessgb_hi_r )
else if (address < 0x6000)
return snes_r_io(space, address);
else if (address < 0x8000)
- return m_cartslot->chip_read(space, offset);
+ return m_cartslot->chip_read(offset);
else
- return m_cartslot->read_h(space, offset);
+ return m_cartslot->read_h(offset);
}
else if (address >= 0x8000)
- return m_cartslot->read_h(space, offset);
+ return m_cartslot->read_h(offset);
- return snes_open_bus_r(space, 0);
+ return snes_open_bus_r();
}
READ8_MEMBER( snes_console_state::snessgb_lo_r )
@@ -915,7 +915,7 @@ WRITE8_MEMBER( snes_console_state::snessgb_hi_w )
else if (address < 0x6000)
snes_w_io(space, address, data);
else if (address < 0x8000)
- m_cartslot->chip_write(space, offset, data);
+ m_cartslot->chip_write(offset, data);
}
}
@@ -941,18 +941,18 @@ READ8_MEMBER( snes_console_state::pfest94_hi_r )
else if (address < 0x8000)
{
if (offset < 0x100000) // DSP access
- return m_cartslot->chip_read(space, offset);
+ return m_cartslot->chip_read(offset);
else if (offset == 0x106000) // menu access
- return m_cartslot->chip_read(space, offset + 0x8000);
+ return m_cartslot->chip_read(offset + 0x8000);
else if (offset >= 0x300000 && m_cartslot->m_cart->get_nvram_size()) // NVRAM access
- return m_cartslot->read_ram(space, offset);
+ return m_cartslot->read_ram(offset);
else
- return snes_open_bus_r(space, 0);
+ return snes_open_bus_r();
}
else
- return m_cartslot->read_h(space, offset);
+ return m_cartslot->read_h(offset);
}
- return m_cartslot->read_h(space, offset);
+ return m_cartslot->read_h(offset);
}
WRITE8_MEMBER( snes_console_state::pfest94_hi_w )
@@ -967,11 +967,11 @@ WRITE8_MEMBER( snes_console_state::pfest94_hi_w )
else if (address < 0x8000)
{
if (offset < 0x100000) // DSP access
- m_cartslot->chip_write(space, offset, data);
+ m_cartslot->chip_write(offset, data);
else if (offset == 0x206000) // menu access
- m_cartslot->chip_write(space, offset + 0x8000, data);
+ m_cartslot->chip_write(offset + 0x8000, data);
else if (offset >= 0x300000 && m_cartslot->m_cart->get_nvram_size()) // NVRAM access
- m_cartslot->write_ram(space, offset, data);
+ m_cartslot->write_ram(offset, data);
}
}
}
@@ -989,16 +989,16 @@ READ8_MEMBER( snes_console_state::pfest94_lo_r )
else if (address < 0x8000)
{
if (offset < 0x100000) // DSP access
- return m_cartslot->chip_read(space, offset);
+ return m_cartslot->chip_read(offset);
else if (offset == 0x106000) // menu access
- return m_cartslot->chip_read(space, offset + 0x8000);
+ return m_cartslot->chip_read(offset + 0x8000);
else if (offset >= 0x300000 && m_cartslot->m_cart->get_nvram_size()) // NVRAM access
- return m_cartslot->read_ram(space, offset);
+ return m_cartslot->read_ram(offset);
else
- return snes_open_bus_r(space, 0);
+ return snes_open_bus_r();
}
else
- return m_cartslot->read_l(space, offset);
+ return m_cartslot->read_l(offset);
}
return 0xff; // or open_bus?
}
@@ -1234,20 +1234,20 @@ void snes_console_state::machine_start()
m_maincpu->set_5a22_map();
break;
case SNES_DSP:
- m_maincpu->space(AS_PROGRAM).install_read_handler(0x208000, 0x20ffff, 0, 0x9f0000, 0, read8_delegate(FUNC(base_sns_cart_slot_device::chip_read),(base_sns_cart_slot_device*)m_cartslot));
- m_maincpu->space(AS_PROGRAM).install_write_handler(0x208000, 0x20ffff, 0, 0x9f0000, 0, write8_delegate(FUNC(base_sns_cart_slot_device::chip_write),(base_sns_cart_slot_device*)m_cartslot));
+ m_maincpu->space(AS_PROGRAM).install_read_handler(0x208000, 0x20ffff, 0, 0x9f0000, 0, read8sm_delegate(FUNC(base_sns_cart_slot_device::chip_read),(base_sns_cart_slot_device*)m_cartslot));
+ m_maincpu->space(AS_PROGRAM).install_write_handler(0x208000, 0x20ffff, 0, 0x9f0000, 0, write8sm_delegate(FUNC(base_sns_cart_slot_device::chip_write),(base_sns_cart_slot_device*)m_cartslot));
break;
case SNES_DSP_2MB:
- m_maincpu->space(AS_PROGRAM).install_read_handler(0x600000, 0x607fff, 0, 0x8f0000, 0, read8_delegate(FUNC(base_sns_cart_slot_device::chip_read),(base_sns_cart_slot_device*)m_cartslot));
- m_maincpu->space(AS_PROGRAM).install_write_handler(0x600000, 0x607fff, 0, 0x8f0000, 0, write8_delegate(FUNC(base_sns_cart_slot_device::chip_write),(base_sns_cart_slot_device*)m_cartslot));
+ m_maincpu->space(AS_PROGRAM).install_read_handler(0x600000, 0x607fff, 0, 0x8f0000, 0, read8sm_delegate(FUNC(base_sns_cart_slot_device::chip_read),(base_sns_cart_slot_device*)m_cartslot));
+ m_maincpu->space(AS_PROGRAM).install_write_handler(0x600000, 0x607fff, 0, 0x8f0000, 0, write8sm_delegate(FUNC(base_sns_cart_slot_device::chip_write),(base_sns_cart_slot_device*)m_cartslot));
break;
case SNES_DSP4:
- m_maincpu->space(AS_PROGRAM).install_read_handler(0x308000, 0x30ffff, 0, 0x8f0000, 0, read8_delegate(FUNC(base_sns_cart_slot_device::chip_read),(base_sns_cart_slot_device*)m_cartslot));
- m_maincpu->space(AS_PROGRAM).install_write_handler(0x308000, 0x30ffff, 0, 0x8f0000, 0, write8_delegate(FUNC(base_sns_cart_slot_device::chip_write),(base_sns_cart_slot_device*)m_cartslot));
+ m_maincpu->space(AS_PROGRAM).install_read_handler(0x308000, 0x30ffff, 0, 0x8f0000, 0, read8sm_delegate(FUNC(base_sns_cart_slot_device::chip_read),(base_sns_cart_slot_device*)m_cartslot));
+ m_maincpu->space(AS_PROGRAM).install_write_handler(0x308000, 0x30ffff, 0, 0x8f0000, 0, write8sm_delegate(FUNC(base_sns_cart_slot_device::chip_write),(base_sns_cart_slot_device*)m_cartslot));
break;
case SNES_OBC1:
- m_maincpu->space(AS_PROGRAM).install_read_handler(0x006000, 0x007fff, 0, 0xbf0000, 0, read8_delegate(FUNC(base_sns_cart_slot_device::chip_read),(base_sns_cart_slot_device*)m_cartslot));
- m_maincpu->space(AS_PROGRAM).install_write_handler(0x006000, 0x007fff, 0, 0xbf0000, 0, write8_delegate(FUNC(base_sns_cart_slot_device::chip_write),(base_sns_cart_slot_device*)m_cartslot));
+ m_maincpu->space(AS_PROGRAM).install_read_handler(0x006000, 0x007fff, 0, 0xbf0000, 0, read8sm_delegate(FUNC(base_sns_cart_slot_device::chip_read),(base_sns_cart_slot_device*)m_cartslot));
+ m_maincpu->space(AS_PROGRAM).install_write_handler(0x006000, 0x007fff, 0, 0xbf0000, 0, write8sm_delegate(FUNC(base_sns_cart_slot_device::chip_write),(base_sns_cart_slot_device*)m_cartslot));
break;
case SNES_SFX:
m_maincpu->space(AS_PROGRAM).install_readwrite_handler(0x000000, 0x7dffff, read8_delegate(FUNC(snes_console_state::snessfx_lo_r),this), write8_delegate(FUNC(snes_console_state::snessfx_lo_w),this));
@@ -1274,15 +1274,15 @@ void snes_console_state::machine_start()
case SNES_DSP_MODE21:
m_maincpu->space(AS_PROGRAM).install_readwrite_handler(0x000000, 0x7dffff, read8_delegate(FUNC(snes_console_state::snes21_lo_r),this), write8_delegate(FUNC(snes_console_state::snes21_lo_w),this));
m_maincpu->space(AS_PROGRAM).install_readwrite_handler(0x800000, 0xffffff, read8_delegate(FUNC(snes_console_state::snes21_hi_r),this), write8_delegate(FUNC(snes_console_state::snes21_hi_w),this));
- m_maincpu->space(AS_PROGRAM).install_read_handler(0x006000, 0x007fff, 0, 0x9f0000, 0, read8_delegate(FUNC(base_sns_cart_slot_device::chip_read),(base_sns_cart_slot_device*)m_cartslot));
- m_maincpu->space(AS_PROGRAM).install_write_handler(0x006000, 0x007fff, 0, 0x9f0000, 0, write8_delegate(FUNC(base_sns_cart_slot_device::chip_write),(base_sns_cart_slot_device*)m_cartslot));
+ m_maincpu->space(AS_PROGRAM).install_read_handler(0x006000, 0x007fff, 0, 0x9f0000, 0, read8sm_delegate(FUNC(base_sns_cart_slot_device::chip_read),(base_sns_cart_slot_device*)m_cartslot));
+ m_maincpu->space(AS_PROGRAM).install_write_handler(0x006000, 0x007fff, 0, 0x9f0000, 0, write8sm_delegate(FUNC(base_sns_cart_slot_device::chip_write),(base_sns_cart_slot_device*)m_cartslot));
m_maincpu->set_5a22_map();
break;
case SNES_SRTC:
m_maincpu->space(AS_PROGRAM).install_readwrite_handler(0x000000, 0x7dffff, read8_delegate(FUNC(snes_console_state::snes21_lo_r),this), write8_delegate(FUNC(snes_console_state::snes21_lo_w),this));
m_maincpu->space(AS_PROGRAM).install_readwrite_handler(0x800000, 0xffffff, read8_delegate(FUNC(snes_console_state::snes21_hi_r),this), write8_delegate(FUNC(snes_console_state::snes21_hi_w),this));
- m_maincpu->space(AS_PROGRAM).install_read_handler(0x002800, 0x002800, 0, 0xbf0000, 0, read8_delegate(FUNC(base_sns_cart_slot_device::chip_read),(base_sns_cart_slot_device*)m_cartslot));
- m_maincpu->space(AS_PROGRAM).install_write_handler(0x002801, 0x002801, 0, 0xbf0000, 0, write8_delegate(FUNC(base_sns_cart_slot_device::chip_write),(base_sns_cart_slot_device*)m_cartslot));
+ m_maincpu->space(AS_PROGRAM).install_read_handler(0x002800, 0x002800, 0, 0xbf0000, 0, read8sm_delegate(FUNC(base_sns_cart_slot_device::chip_read),(base_sns_cart_slot_device*)m_cartslot));
+ m_maincpu->space(AS_PROGRAM).install_write_handler(0x002801, 0x002801, 0, 0xbf0000, 0, write8sm_delegate(FUNC(base_sns_cart_slot_device::chip_write),(base_sns_cart_slot_device*)m_cartslot));
m_maincpu->set_5a22_map();
break;
case SNES_SPC7110:
@@ -1298,29 +1298,29 @@ void snes_console_state::machine_start()
break;
// pirate 'mappers'
case SNES_POKEMON:
- m_maincpu->space(AS_PROGRAM).install_read_handler(0x800000, 0x80ffff, 0, 0x780000, 0, read8_delegate(FUNC(base_sns_cart_slot_device::chip_read),(base_sns_cart_slot_device*)m_cartslot));
- m_maincpu->space(AS_PROGRAM).install_write_handler(0x800000, 0x80ffff, 0, 0x780000, 0, write8_delegate(FUNC(base_sns_cart_slot_device::chip_write),(base_sns_cart_slot_device*)m_cartslot));
+ m_maincpu->space(AS_PROGRAM).install_read_handler(0x800000, 0x80ffff, 0, 0x780000, 0, read8sm_delegate(FUNC(base_sns_cart_slot_device::chip_read),(base_sns_cart_slot_device*)m_cartslot));
+ m_maincpu->space(AS_PROGRAM).install_write_handler(0x800000, 0x80ffff, 0, 0x780000, 0, write8sm_delegate(FUNC(base_sns_cart_slot_device::chip_write),(base_sns_cart_slot_device*)m_cartslot));
break;
case SNES_TEKKEN2:
- m_maincpu->space(AS_PROGRAM).install_read_handler(0x808000, 0x8087ff, 0, 0x3f0000, 0, read8_delegate(FUNC(base_sns_cart_slot_device::chip_read),(base_sns_cart_slot_device*)m_cartslot));
- m_maincpu->space(AS_PROGRAM).install_write_handler(0x808000, 0x8087ff, 0, 0x3f0000, 0, write8_delegate(FUNC(base_sns_cart_slot_device::chip_write),(base_sns_cart_slot_device*)m_cartslot));
+ m_maincpu->space(AS_PROGRAM).install_read_handler(0x808000, 0x8087ff, 0, 0x3f0000, 0, read8sm_delegate(FUNC(base_sns_cart_slot_device::chip_read),(base_sns_cart_slot_device*)m_cartslot));
+ m_maincpu->space(AS_PROGRAM).install_write_handler(0x808000, 0x8087ff, 0, 0x3f0000, 0, write8sm_delegate(FUNC(base_sns_cart_slot_device::chip_write),(base_sns_cart_slot_device*)m_cartslot));
break;
case SNES_MCPIR1:
case SNES_MCPIR2:
- m_maincpu->space(AS_PROGRAM).install_write_handler(0xffff00, 0xffffff, write8_delegate(FUNC(base_sns_cart_slot_device::chip_write),(base_sns_cart_slot_device*)m_cartslot));
+ m_maincpu->space(AS_PROGRAM).install_write_handler(0xffff00, 0xffffff, write8sm_delegate(FUNC(base_sns_cart_slot_device::chip_write),(base_sns_cart_slot_device*)m_cartslot));
break;
case SNES_20COL:
- m_maincpu->space(AS_PROGRAM).install_write_handler(0x008000, 0x008fff, write8_delegate(FUNC(base_sns_cart_slot_device::chip_write),(base_sns_cart_slot_device*)m_cartslot));
+ m_maincpu->space(AS_PROGRAM).install_write_handler(0x008000, 0x008fff, write8sm_delegate(FUNC(base_sns_cart_slot_device::chip_write),(base_sns_cart_slot_device*)m_cartslot));
break;
case SNES_SOULBLAD:
// reads from xxx0-xxx3in range [80-bf] return a fixed sequence of 4bits; reads in range [c0-ff] return open bus
- m_maincpu->space(AS_PROGRAM).install_read_handler(0x808000, 0x808003, 0, 0x3f7ff0, 0, read8_delegate(FUNC(base_sns_cart_slot_device::chip_read),(base_sns_cart_slot_device*)m_cartslot));
- m_maincpu->space(AS_PROGRAM).install_read_handler(0xc00000, 0xffffff, read8_delegate(FUNC(snes_console_state::snes_open_bus_r),this));
+ m_maincpu->space(AS_PROGRAM).install_read_handler(0x808000, 0x808003, 0, 0x3f7ff0, 0, read8sm_delegate(FUNC(base_sns_cart_slot_device::chip_read),(base_sns_cart_slot_device*)m_cartslot));
+ m_maincpu->space(AS_PROGRAM).install_read_handler(0xc00000, 0xffffff, read8smo_delegate(FUNC(snes_console_state::snes_open_bus_r),this));
break;
case SNES_BUGS:
case SNES_BANANA:
-// m_maincpu->space(AS_PROGRAM).install_read_handler(0x808000, 0x80ffff, 0, 0x780000, 0, read8_delegate(FUNC(base_sns_cart_slot_device::chip_read),(base_sns_cart_slot_device*)m_cartslot));
-// m_maincpu->space(AS_PROGRAM).install_write_handler(0x808000, 0x80ffff, 0, 0x780000, 0, write8_delegate(FUNC(base_sns_cart_slot_device::chip_write),(base_sns_cart_slot_device*)m_cartslot));
+// m_maincpu->space(AS_PROGRAM).install_read_handler(0x808000, 0x80ffff, 0, 0x780000, 0, read8sm_delegate(FUNC(base_sns_cart_slot_device::chip_read),(base_sns_cart_slot_device*)m_cartslot));
+// m_maincpu->space(AS_PROGRAM).install_write_handler(0x808000, 0x80ffff, 0, 0x780000, 0, write8sm_delegate(FUNC(base_sns_cart_slot_device::chip_write),(base_sns_cart_slot_device*)m_cartslot));
// m_maincpu->set_5a22_map();
break;
}
@@ -1334,60 +1334,60 @@ void snes_console_state::machine_reset()
}
-MACHINE_CONFIG_START(snes_console_state::snes)
-
+void snes_console_state::snes(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", _5A22, MCLK_NTSC) /* 2.68 MHz, also 3.58 MHz */
- MCFG_DEVICE_PROGRAM_MAP(snes_map)
+ _5A22(config, m_maincpu, MCLK_NTSC); /* 2.68 MHz, also 3.58 MHz */
+ m_maincpu->set_addrmap(AS_PROGRAM, &snes_console_state::snes_map);
// runs at 24.576 MHz / 12 = 2.048 MHz
- MCFG_DEVICE_ADD("soundcpu", SPC700, XTAL(24'576'000) / 12)
- MCFG_DEVICE_PROGRAM_MAP(spc_map)
+ SPC700(config, m_soundcpu, XTAL(24'576'000) / 12);
+ m_soundcpu->set_addrmap(AS_PROGRAM, &snes_console_state::spc_map);
- //MCFG_QUANTUM_TIME(attotime::from_hz(48000))
- MCFG_QUANTUM_PERFECT_CPU("maincpu")
+ //config.m_minimum_quantum = attotime::from_hz(48000);
+ config.m_perfect_cpu_quantum = subtag("maincpu");
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_RAW_PARAMS(DOTCLK_NTSC * 2, SNES_HTOTAL * 2, 0, SNES_SCR_WIDTH * 2, SNES_VTOTAL_NTSC, 0, SNES_SCR_HEIGHT_NTSC)
- MCFG_SCREEN_UPDATE_DRIVER( snes_state, screen_update )
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_raw(DOTCLK_NTSC * 2, SNES_HTOTAL * 2, 0, SNES_SCR_WIDTH * 2, SNES_VTOTAL_NTSC, 0, SNES_SCR_HEIGHT_NTSC);
+ m_screen->set_screen_update(FUNC(snes_state::screen_update));
SNES_PPU(config, m_ppu, MCLK_NTSC);
- m_ppu->open_bus_callback().set([this] { return snes_open_bus_r(); }); // lambda because overloaded function name
+ m_ppu->open_bus_callback().set(FUNC(snes_console_state::snes_open_bus_r));
m_ppu->set_screen("screen");
- MCFG_SNES_CONTROL_PORT_ADD("ctrl1", snes_control_port_devices, "joypad")
- MCFG_SNESCTRL_ONSCREEN_CB(snes_console_state, onscreen_cb)
- MCFG_SNES_CONTROL_PORT_ADD("ctrl2", snes_control_port_devices, "joypad")
- MCFG_SNESCTRL_ONSCREEN_CB(snes_console_state, onscreen_cb)
- MCFG_SNESCTRL_GUNLATCH_CB(snes_console_state, gun_latch_cb)
+ SNES_CONTROL_PORT(config, m_ctrl1, snes_control_port_devices, "joypad");
+ m_ctrl1->set_onscreen_callback(FUNC(snes_console_state::onscreen_cb), this);
+ SNES_CONTROL_PORT(config, m_ctrl2, snes_control_port_devices, "joypad");
+ m_ctrl2->set_onscreen_callback(FUNC(snes_console_state::onscreen_cb), this);
+ m_ctrl2->set_gunlatch_callback(FUNC(snes_console_state::gun_latch_cb), this);
/* sound hardware */
SPEAKER(config, "lspeaker").front_left();
SPEAKER(config, "rspeaker").front_right();
- MCFG_DEVICE_ADD("spc700", SNES_SOUND)
- MCFG_SOUND_ROUTE(0, "lspeaker", 1.00)
- MCFG_SOUND_ROUTE(1, "rspeaker", 1.00)
+ SNES_SOUND(config, m_spc700);
+ m_spc700->add_route(0, "lspeaker", 1.00);
+ m_spc700->add_route(1, "rspeaker", 1.00);
SNS_CART_SLOT(config, m_cartslot, MCLK_NTSC, snes_cart, nullptr);
m_cartslot->irq_callback().set_inputline(m_maincpu, G65816_LINE_IRQ);
+ m_cartslot->open_bus_callback().set(FUNC(snes_console_state::snes_open_bus_r));
- MCFG_SOFTWARE_LIST_ADD("cart_list","snes")
- MCFG_SOFTWARE_LIST_ADD("bsx_list","snes_bspack")
- MCFG_SOFTWARE_LIST_ADD("st_list","snes_strom")
-MACHINE_CONFIG_END
+ SOFTWARE_LIST(config, "cart_list").set_original("snes");
+ SOFTWARE_LIST(config, "bsx_list").set_original("snes_bspack");
+ SOFTWARE_LIST(config, "st_list").set_original("snes_strom");
+}
-MACHINE_CONFIG_START(snes_console_state::snespal)
+void snes_console_state::snespal(machine_config &config)
+{
snes(config);
- MCFG_DEVICE_MODIFY( "maincpu" )
- MCFG_DEVICE_CLOCK( MCLK_PAL )
+ m_maincpu->set_clock(MCLK_PAL);
- MCFG_SCREEN_MODIFY("screen")
- MCFG_SCREEN_RAW_PARAMS(DOTCLK_PAL, SNES_HTOTAL, 0, SNES_SCR_WIDTH, SNES_VTOTAL_PAL, 0, SNES_SCR_HEIGHT_PAL)
+ m_screen->set_raw(DOTCLK_PAL, SNES_HTOTAL, 0, SNES_SCR_WIDTH, SNES_VTOTAL_PAL, 0, SNES_SCR_HEIGHT_PAL);
m_ppu->set_clock(MCLK_PAL);
m_cartslot->set_clock(MCLK_PAL);
-MACHINE_CONFIG_END
+}
diff --git a/src/mame/drivers/snesb.cpp b/src/mame/drivers/snesb.cpp
index 376ccaa3095..e26162aadc8 100644
--- a/src/mame/drivers/snesb.cpp
+++ b/src/mame/drivers/snesb.cpp
@@ -15,6 +15,7 @@
- Gundam Wing: Endless Duel
- Legend
- Rushing Beat
+ - Venom & Spider-Man - Separation Anxiety
Not dumped:
- Final Fight 3
@@ -22,14 +23,15 @@
TODO:
- all games : (re)add PORT_DIPLOCATION
- - kiinstb : fix gfx glitches, missing texts
+ - kinstb : fix gfx glitches, missing texts
- ffight2b : remove hack for starting credits (RAM - mainly 0x7eadce where credits are stored - is filled with 0x55,
so you are awarded 55 credits on a hard reset)
- sblast2b : dipswitches
- sblast2b : pressing start during gameplay changes the character used. Intentional?
- - denseib : fix gfx glitches, missing texts
+ - denseib,2: fix gfx glitches, missing texts
- legendsb : dipswitches
- rushbets : everything
+ - venom : gfx glitches on second level
***************************************************************************
@@ -167,6 +169,7 @@ public:
void init_iron();
void init_denseib();
+ void init_denseib2();
void init_kinstb();
void init_sblast2b();
void init_ffight2b();
@@ -756,23 +759,23 @@ static INPUT_PORTS_START( venom )
PORT_BIT( 0x000f, IP_ACTIVE_HIGH, IPT_UNUSED )
INPUT_PORTS_END
-MACHINE_CONFIG_START(snesb_state::kinstb)
-
+void snesb_state::kinstb(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", _5A22, 3580000*6) /* 2.68Mhz, also 3.58Mhz */
- MCFG_DEVICE_PROGRAM_MAP(snesb_map)
+ _5A22(config, m_maincpu, 3580000*6); /* 2.68Mhz, also 3.58Mhz */
+ m_maincpu->set_addrmap(AS_PROGRAM, &snesb_state::snesb_map);
/* audio CPU */
// runs at 24.576 MHz / 12 = 2.048 MHz
- MCFG_DEVICE_ADD("soundcpu", SPC700, XTAL(24'576'000) / 12)
- MCFG_DEVICE_PROGRAM_MAP(spc_mem)
+ SPC700(config, m_soundcpu, XTAL(24'576'000) / 12);
+ m_soundcpu->set_addrmap(AS_PROGRAM, &snesb_state::spc_mem);
- MCFG_QUANTUM_PERFECT_CPU("maincpu")
+ config.m_perfect_cpu_quantum = subtag("maincpu");
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_RAW_PARAMS(DOTCLK_NTSC, SNES_HTOTAL, 0, SNES_SCR_WIDTH, SNES_VTOTAL_NTSC, 0, SNES_SCR_HEIGHT_NTSC)
- MCFG_SCREEN_UPDATE_DRIVER( snes_state, screen_update )
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_raw(DOTCLK_NTSC, SNES_HTOTAL, 0, SNES_SCR_WIDTH, SNES_VTOTAL_NTSC, 0, SNES_SCR_HEIGHT_NTSC);
+ m_screen->set_screen_update(FUNC(snes_state::screen_update));
SNES_PPU(config, m_ppu, MCLK_NTSC);
m_ppu->open_bus_callback().set([this] { return snes_open_bus_r(); }); // lambda because overloaded function name
@@ -781,22 +784,23 @@ MACHINE_CONFIG_START(snesb_state::kinstb)
/* sound hardware */
SPEAKER(config, "lspeaker").front_left();
SPEAKER(config, "rspeaker").front_right();
- MCFG_DEVICE_ADD("spc700", SNES_SOUND)
- MCFG_SOUND_ROUTE(0, "lspeaker", 1.00)
- MCFG_SOUND_ROUTE(1, "rspeaker", 1.00)
-MACHINE_CONFIG_END
+ SNES_SOUND(config, m_spc700);
+ m_spc700->add_route(0, "lspeaker", 1.00);
+ m_spc700->add_route(1, "rspeaker", 1.00);
+}
void snesb_state::mcu_io_map(address_map &map)
{
}
-MACHINE_CONFIG_START(snesb_state::mk3snes)
+void snesb_state::mk3snes(machine_config &config)
+{
kinstb(config);
- MCFG_DEVICE_ADD("mcu", I8751, XTAL(8'000'000))
- MCFG_DEVICE_IO_MAP(mcu_io_map)
-MACHINE_CONFIG_END
+ i8751_device &mcu(I8751(config, "mcu", XTAL(8'000'000)));
+ mcu.set_addrmap(AS_IO, &snesb_state::mcu_io_map);
+}
MACHINE_RESET_MEMBER( snesb_state, ffight2b )
@@ -808,10 +812,11 @@ MACHINE_RESET_MEMBER( snesb_state, ffight2b )
cpu0space.write_byte(0x7eadce, 0x00);
}
-MACHINE_CONFIG_START(snesb_state::ffight2b)
+void snesb_state::ffight2b(machine_config &config)
+{
kinstb(config);
MCFG_MACHINE_RESET_OVERRIDE( snesb_state, ffight2b )
-MACHINE_CONFIG_END
+}
void snesb_state::init_kinstb()
{
@@ -934,6 +939,68 @@ void snesb_state::init_denseib()
init_snes_hirom();
}
+void snesb_state::init_denseib2()
+{
+ uint8_t *src = memregion("user7")->base();
+ uint8_t *dst = memregion("user3")->base();
+
+ static const uint8_t address_tab_high[0x40] = {
+ 0x0b, 0x1d, 0x05, 0x15, 0x09, 0x19, 0x04, 0x13, 0x02, 0x1f, 0x07, 0x17, 0x0d, 0x11, 0x0a, 0x1a,
+ 0x14, 0x0e, 0x18, 0x06, 0x1e, 0x01, 0x10, 0x0c, 0x1b, 0x0f, 0x16, 0x00, 0x12, 0x08, 0x1c, 0x03,
+ 0x2b, 0x3d, 0x25, 0x35, 0x29, 0x39, 0x24, 0x33, 0x22, 0x3f, 0x27, 0x37, 0x2d, 0x31, 0x2a, 0x3a,
+ 0x34, 0x2e, 0x38, 0x26, 0x3e, 0x21, 0x30, 0x2c, 0x3b, 0x2f, 0x36, 0x20, 0x32, 0x28, 0x3c, 0x23
+ };
+
+ static const uint8_t address_tab_low[0x40] = {
+ 0x14, 0x1d, 0x11, 0x3c, 0x0a, 0x29, 0x2d, 0x2e, 0x30, 0x32, 0x16, 0x36, 0x05, 0x25, 0x26, 0x37,
+ 0x20, 0x21, 0x27, 0x28, 0x33, 0x34, 0x23, 0x12, 0x1e, 0x1f, 0x3b, 0x24, 0x2c, 0x35, 0x38, 0x39,
+ 0x3d, 0x0c, 0x2a, 0x0d, 0x22, 0x18, 0x19, 0x1a, 0x03, 0x08, 0x04, 0x3a, 0x0b, 0x0f, 0x15, 0x17,
+ 0x1b, 0x13, 0x00, 0x1c, 0x2b, 0x01, 0x06, 0x2f, 0x07, 0x09, 0x02, 0x31, 0x10, 0x0e, 0x3f, 0x3e
+ };
+
+ static const uint8_t data_high[16] = {
+ 0x03, 0x04, 0x85, 0x01, 0x81, 0x87, 0x07, 0x05, 0x86, 0x00, 0x02, 0x82, 0x84, 0x83, 0x06, 0x80
+ };
+
+ static const uint8_t data_low[16] = {
+ 0x30, 0x40, 0x58, 0x10, 0x18, 0x78, 0x70, 0x50, 0x68, 0x00, 0x20, 0x28, 0x48, 0x38, 0x60, 0x08
+ };
+
+ for (int i = 0; i < 0x200000; i++)
+ {
+ int j = (address_tab_high[i >> 15] << 15) + (i & 0x7fc0) + address_tab_low[i & 0x3f];
+
+ dst[i] = data_high[src[j]>>4] | data_low[src[j]&0xf];
+
+ if (i >= 0x00000 && i < 0x10000) {
+ dst[i] = bitswap<8>(dst[i],2,1,3,0,7,4,5,6) ^ 0xff;
+ }
+
+ if (i >= 0x10000 && i < 0x20000) {
+ dst[i] = bitswap<8>(dst[i],1,7,4,5,6,0,3,2);
+ }
+
+ if (i >= 0x20000 && i < 0x30000) {
+ dst[i] = bitswap<8>(dst[i],0,2,6,7,5,3,4,1) ^ 0xff;
+ }
+
+ if (i >= 0x30000 && i < 0x40000) {
+ dst[i] = bitswap<8>(dst[i],6,5,0,3,1,7,2,4) ^ 0xff;
+ }
+ }
+
+ /* boot vector */
+ dst[0xfffc] = 0x40;
+ dst[0xfffd] = 0xf7;
+
+ /* extra inputs */
+ m_maincpu->space(AS_PROGRAM).install_read_handler(0x770071, 0x770071, read8_delegate(FUNC(snesb_state::snesb_dsw1_r),this));
+ m_maincpu->space(AS_PROGRAM).install_read_handler(0x770073, 0x770073, read8_delegate(FUNC(snesb_state::snesb_dsw2_r),this));
+ m_maincpu->space(AS_PROGRAM).install_read_handler(0x770079, 0x770079, read8_delegate(FUNC(snesb_state::snesb_coin_r),this));
+
+ init_snes_hirom();
+}
+
void snesb_state::init_legendsb()
{
u8 *rom = memregion("user3")->base();
@@ -1352,6 +1419,21 @@ ROM_START( denseib )
ROM_REGION(0x800, "user6", ROMREGION_ERASEFF)
ROM_END
+ROM_START( denseib2 )
+ ROM_REGION( 0x200000, "user3", ROMREGION_ERASEFF )
+
+ ROM_REGION(0x100, "sound_ipl", 0)
+ ROM_LOAD("spc700.rom", 0, 0x40, CRC(44bb3a40) SHA1(97e352553e94242ae823547cd853eecda55c20f0) )
+
+ ROM_REGION(0x800, "user6", ROMREGION_ERASEFF)
+
+ ROM_REGION( 0x200000, "user7", 0 )
+ ROM_LOAD( "u31.bin", 0x000000, 0x080000, CRC(834723a8) SHA1(3f56bba5017f77147e7d52618678f1e2eff4991b) )
+ ROM_LOAD( "u32.bin", 0x080000, 0x080000, CRC(9748e86b) SHA1(68a62e0961d735602ae6ebd1aca5990c588ccbb1) )
+ ROM_LOAD( "u33.bin", 0x100000, 0x080000, CRC(abcc6b61) SHA1(ef90f23b674f6dd36b3d60c9c395a1d4bc853798) )
+ ROM_LOAD( "u34.bin", 0x180000, 0x080000, CRC(0a16ac96) SHA1(ddc11009d4b35a151aa7e357346f3ac109e112ef) )
+ROM_END
+
ROM_START( sblast2b )
ROM_REGION( 0x180000, "user3", ROMREGION_ERASEFF )
@@ -1455,13 +1537,14 @@ ROM_START( venom )
ROM_LOAD( "u34.bin", 0x280000, 0x0080000, CRC(7a09c9e0) SHA1(794965d5501ec0e21f1f3a8cb8fd66f913d42760) )
ROM_END
-GAME( 199?, kinstb, 0, kinstb, kinstb, snesb_state, init_kinstb, ROT0, "bootleg", "Killer Instinct (SNES bootleg)", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS )
-GAME( 199?, mk3snes, 0, mk3snes, kinstb, snesb_state, init_mk3snes, ROT0, "bootleg", "Mortal Kombat 3 (SNES bootleg)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS )
-GAME( 1996, ffight2b, 0, ffight2b, ffight2b, snesb_state, init_ffight2b, ROT0, "bootleg", "Final Fight 2 (SNES bootleg)", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS )
-GAME( 1996, iron, 0, kinstb, iron, snesb_state, init_iron, ROT0, "bootleg", "Iron (SNES bootleg)", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS )
-GAME( 1996, denseib, 0, kinstb, denseib, snesb_state, init_denseib, ROT0, "bootleg", "Ghost Chaser Densei (SNES bootleg)", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS )
-GAME( 1997, sblast2b, 0, kinstb, sblast2b, snesb_state, init_sblast2b, ROT0, "bootleg", "Sonic Blast Man 2 Special Turbo (SNES bootleg)", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS)
-GAME( 1996, endless, 0, kinstb, endless, snesb_state, init_endless, ROT0, "bootleg", "Gundam Wing: Endless Duel (SNES bootleg)", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS )
-GAME( 1996, legendsb, 0, kinstb, kinstb, snesb_state, init_legendsb, ROT0, "bootleg", "Legend (SNES bootleg)", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS )
-GAME( 1997, rushbets, 0, kinstb, kinstb, snesb_state, init_rushbets, ROT0, "bootleg", "Rushing Beat Shura (SNES bootleg)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS )
-GAME( 1997, venom, 0, kinstb, venom, snesb_state, init_venom, ROT0, "bootleg", "Venom & Spider-Man - Separation Anxiety (SNES bootleg)", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS )
+GAME( 199?, kinstb, 0, kinstb, kinstb, snesb_state, init_kinstb, ROT0, "bootleg", "Killer Instinct (SNES bootleg)", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS )
+GAME( 199?, mk3snes, 0, mk3snes, kinstb, snesb_state, init_mk3snes, ROT0, "bootleg", "Mortal Kombat 3 (SNES bootleg)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS )
+GAME( 1996, ffight2b, 0, ffight2b, ffight2b, snesb_state, init_ffight2b, ROT0, "bootleg", "Final Fight 2 (SNES bootleg)", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS )
+GAME( 1996, iron, 0, kinstb, iron, snesb_state, init_iron, ROT0, "bootleg", "Iron (SNES bootleg)", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS )
+GAME( 1996, denseib, 0, kinstb, denseib, snesb_state, init_denseib, ROT0, "bootleg", "Ghost Chaser Densei (SNES bootleg, set 1)", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS )
+GAME( 1996, denseib2, denseib, kinstb, denseib, snesb_state, init_denseib2, ROT0, "bootleg", "Ghost Chaser Densei (SNES bootleg, set 2)", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS )
+GAME( 1997, sblast2b, 0, kinstb, sblast2b, snesb_state, init_sblast2b, ROT0, "bootleg", "Sonic Blast Man 2 Special Turbo (SNES bootleg)", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS)
+GAME( 1996, endless, 0, kinstb, endless, snesb_state, init_endless, ROT0, "bootleg", "Gundam Wing: Endless Duel (SNES bootleg)", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS )
+GAME( 1996, legendsb, 0, kinstb, kinstb, snesb_state, init_legendsb, ROT0, "bootleg", "Legend (SNES bootleg)", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS )
+GAME( 1997, rushbets, 0, kinstb, kinstb, snesb_state, init_rushbets, ROT0, "bootleg", "Rushing Beat Shura (SNES bootleg)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS )
+GAME( 1997, venom, 0, kinstb, venom, snesb_state, init_venom, ROT0, "bootleg", "Venom & Spider-Man - Separation Anxiety (SNES bootleg)", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS )
diff --git a/src/mame/drivers/snk6502.cpp b/src/mame/drivers/snk6502.cpp
index cb6d6b296d2..15c8cc8a462 100644
--- a/src/mame/drivers/snk6502.cpp
+++ b/src/mame/drivers/snk6502.cpp
@@ -802,24 +802,24 @@ MACHINE_RESET_MEMBER(snk6502_state,sasuke)
*
*************************************/
-MACHINE_CONFIG_START(snk6502_state::sasuke)
-
+void snk6502_state::sasuke(machine_config &config)
+{
// basic machine hardware
- MCFG_DEVICE_ADD("maincpu", M6502, MASTER_CLOCK / 16) // 700 kHz
- MCFG_DEVICE_PROGRAM_MAP(sasuke_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", snk6502_state, satansat_interrupt)
+ M6502(config, m_maincpu, MASTER_CLOCK / 16); // 700 kHz
+ m_maincpu->set_addrmap(AS_PROGRAM, &snk6502_state::sasuke_map);
+ m_maincpu->set_vblank_int("screen", FUNC(snk6502_state::satansat_interrupt));
MCFG_MACHINE_RESET_OVERRIDE(snk6502_state,sasuke)
// video hardware
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE((MASTER_CLOCK / 16) / (45 * 32 * 8))
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(32*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 0*8, 28*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(snk6502_state, screen_update)
- MCFG_SCREEN_PALETTE(m_palette)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz((MASTER_CLOCK / 16) / (45 * 32 * 8));
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(32*8, 32*8);
+ screen.set_visarea(0*8, 32*8-1, 0*8, 28*8-1);
+ screen.set_screen_update(FUNC(snk6502_state::screen_update));
+ screen.set_palette(m_palette);
GFXDECODE(config, m_gfxdecode, m_palette, gfx_sasuke);
PALETTE(config, m_palette, FUNC(snk6502_state::satansat_palette), 32);
@@ -830,42 +830,41 @@ MACHINE_CONFIG_START(snk6502_state::sasuke)
crtc.set_show_border_area(false);
crtc.set_char_width(8);
- MCFG_TIMER_DRIVER_ADD_PERIODIC("sasuke_timer", snk6502_state, sasuke_update_counter, attotime::from_hz(MASTER_CLOCK / 8))
+ TIMER(config, "sasuke_timer").configure_periodic(FUNC(snk6502_state::sasuke_update_counter), attotime::from_hz(MASTER_CLOCK / 8));
// sound hardware
- MCFG_DEVICE_ADD("snk6502", SASUKE_SOUND, 0)
-MACHINE_CONFIG_END
+ SASUKE_SOUND(config, "snk6502", 0);
+}
-MACHINE_CONFIG_START(snk6502_state::satansat)
+void snk6502_state::satansat(machine_config &config)
+{
sasuke(config);
// basic machine hardware
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(satansat_map)
+ m_maincpu->set_addrmap(AS_PROGRAM, &snk6502_state::satansat_map);
// video hardware
- MCFG_GFXDECODE_MODIFY("gfxdecode", gfx_satansat)
+ m_gfxdecode->set_info(gfx_satansat);
// sound hardware
- MCFG_DEVICE_REPLACE("snk6502", SATANSAT_SOUND, 0)
-MACHINE_CONFIG_END
-
-MACHINE_CONFIG_START(snk6502_state::vanguard)
+ SATANSAT_SOUND(config.replace(), "snk6502", 0);
+}
+void snk6502_state::vanguard(machine_config &config)
+{
// basic machine hardware
- MCFG_DEVICE_ADD("maincpu", M6502, MASTER_CLOCK / 16) // adjusted using common divisor
-
- MCFG_DEVICE_PROGRAM_MAP(vanguard_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", snk6502_state, snk6502_interrupt)
+ M6502(config, m_maincpu, MASTER_CLOCK / 16); // adjusted using common divisor
+ m_maincpu->set_addrmap(AS_PROGRAM, &snk6502_state::vanguard_map);
+ m_maincpu->set_vblank_int("screen", FUNC(snk6502_state::snk6502_interrupt));
// video hardware
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE((MASTER_CLOCK / 16) / (45 * 32 * 8))
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(32*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 0*8, 28*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(snk6502_state, screen_update)
- MCFG_SCREEN_PALETTE(m_palette)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz((MASTER_CLOCK / 16) / (45 * 32 * 8));
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(32*8, 32*8);
+ screen.set_visarea(0*8, 32*8-1, 0*8, 28*8-1);
+ screen.set_screen_update(FUNC(snk6502_state::screen_update));
+ screen.set_palette(m_palette);
GFXDECODE(config, m_gfxdecode, m_palette, gfx_vanguard);
PALETTE(config, m_palette, FUNC(snk6502_state::snk6502_palette), 64);
@@ -877,39 +876,40 @@ MACHINE_CONFIG_START(snk6502_state::vanguard)
crtc.set_char_width(8);
// sound hardware
- MCFG_DEVICE_ADD("snk6502", VANGUARD_SOUND, 0)
-MACHINE_CONFIG_END
+ VANGUARD_SOUND(config, "snk6502", 0);
+}
-MACHINE_CONFIG_START(fantasy_state::fantasy)
+void fantasy_state::fantasy(machine_config &config)
+{
vanguard(config);
// basic machine hardware
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(fantasy_map)
+ m_maincpu->set_addrmap(AS_PROGRAM, &fantasy_state::fantasy_map);
// sound hardware
- MCFG_DEVICE_REPLACE("snk6502", FANTASY_SOUND, 0)
-MACHINE_CONFIG_END
+ FANTASY_SOUND(config.replace(), "snk6502", 0);
+}
-MACHINE_CONFIG_START(fantasy_state::nibbler)
+void fantasy_state::nibbler(machine_config &config)
+{
fantasy(config);
// sound hardware
- MCFG_DEVICE_REPLACE("snk6502", NIBBLER_SOUND, 0)
-MACHINE_CONFIG_END
+ NIBBLER_SOUND(config.replace(), "snk6502", 0);
+}
-MACHINE_CONFIG_START(fantasy_state::pballoon)
+void fantasy_state::pballoon(machine_config &config)
+{
nibbler(config);
// basic machine hardware
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(pballoon_map)
+ m_maincpu->set_addrmap(AS_PROGRAM, &fantasy_state::pballoon_map);
MCFG_VIDEO_START_OVERRIDE(snk6502_state, pballoon)
// sound hardware
- MCFG_DEVICE_REPLACE("snk6502", PBALLOON_SOUND, 0)
-MACHINE_CONFIG_END
+ PBALLOON_SOUND(config.replace(), "snk6502", 0);
+}
/*************************************
diff --git a/src/mame/drivers/snookr10.cpp b/src/mame/drivers/snookr10.cpp
index dcd1516d651..b97bab7da6a 100644
--- a/src/mame/drivers/snookr10.cpp
+++ b/src/mame/drivers/snookr10.cpp
@@ -1040,67 +1040,60 @@ GFXDECODE_END
* Machine Drivers *
**************************/
-MACHINE_CONFIG_START(snookr10_state::snookr10)
-
+void snookr10_state::snookr10(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M65SC02, MASTER_CLOCK/8) /* 2 MHz (1.999 MHz measured) */
- MCFG_DEVICE_PROGRAM_MAP(snookr10_map)
+ M65SC02(config, m_maincpu, MASTER_CLOCK/8); /* 2 MHz (1.999 MHz measured) */
+ m_maincpu->set_addrmap(AS_PROGRAM, &snookr10_state::snookr10_map);
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(96*4, 30*8)
- MCFG_SCREEN_VISIBLE_AREA(0*4, 96*4-1, 0*8, 30*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(snookr10_state, screen_update_snookr10)
- MCFG_SCREEN_PALETTE("palette")
- MCFG_SCREEN_VBLANK_CALLBACK(INPUTLINE("maincpu", INPUT_LINE_NMI))
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(96*4, 30*8);
+ screen.set_visarea(0*4, 96*4-1, 0*8, 30*8-1);
+ screen.set_screen_update(FUNC(snookr10_state::screen_update_snookr10));
+ screen.set_palette("palette");
+ screen.screen_vblank().set_inputline(m_maincpu, INPUT_LINE_NMI);
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_snookr10)
+ GFXDECODE(config, m_gfxdecode, "palette", gfx_snookr10);
PALETTE(config, "palette", FUNC(snookr10_state::snookr10_palette), 256);
/* sound hardware */
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("oki", OKIM6295, MASTER_CLOCK/16, okim6295_device::PIN7_HIGH) /* 1 MHz (995.5 kHz measured); pin7 checked HIGH on PCB */
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.8)
-
-MACHINE_CONFIG_END
+ OKIM6295(config, "oki", MASTER_CLOCK/16, okim6295_device::PIN7_HIGH).add_route(ALL_OUTPUTS, "mono", 1.8); /* 1 MHz (995.5 kHz measured); pin7 checked HIGH on PCB */
+}
-MACHINE_CONFIG_START(snookr10_state::apple10)
+void snookr10_state::apple10(machine_config &config)
+{
snookr10(config);
- /* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
-
/* video hardware */
subdevice<palette_device>("palette")->set_init(FUNC(snookr10_state::apple10_palette));
MCFG_VIDEO_START_OVERRIDE(snookr10_state, apple10)
+}
-MACHINE_CONFIG_END
-
-MACHINE_CONFIG_START(snookr10_state::tenballs)
+void snookr10_state::tenballs(machine_config &config)
+{
snookr10(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(tenballs_map)
-
-MACHINE_CONFIG_END
+ m_maincpu->set_addrmap(AS_PROGRAM, &snookr10_state::tenballs_map);
+}
-MACHINE_CONFIG_START(snookr10_state::crystalc)
+void snookr10_state::crystalc(machine_config &config)
+{
snookr10(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(crystalc_map)
+ m_maincpu->set_addrmap(AS_PROGRAM, &snookr10_state::crystalc_map);
subdevice<palette_device>("palette")->set_init(FUNC(snookr10_state::crystalc_palette));
MCFG_VIDEO_START_OVERRIDE(snookr10_state, crystalc)
-
-MACHINE_CONFIG_END
+}
/*************************
diff --git a/src/mame/drivers/snowbros.cpp b/src/mame/drivers/snowbros.cpp
index fb950b66082..3e39a07bbdb 100644
--- a/src/mame/drivers/snowbros.cpp
+++ b/src/mame/drivers/snowbros.cpp
@@ -150,7 +150,7 @@ TIMER_DEVICE_CALLBACK_MEMBER(snowbros_state::snowbros_irq)
TIMER_DEVICE_CALLBACK_MEMBER(snowbros_state::snowbros3_irq)
{
- int status = m_oki->read_status();
+ int status = m_oki->read();
int scanline = param;
if(scanline == 240)
@@ -166,8 +166,8 @@ TIMER_DEVICE_CALLBACK_MEMBER(snowbros_state::snowbros3_irq)
{
if ((status&0x08)==0x00)
{
- m_oki->write_command(0x80|m_sb3_music);
- m_oki->write_command(0x00|0x82);
+ m_oki->write(0x80|m_sb3_music);
+ m_oki->write(0x00|0x82);
}
}
@@ -175,7 +175,7 @@ TIMER_DEVICE_CALLBACK_MEMBER(snowbros_state::snowbros3_irq)
{
if ((status&0x08)==0x08)
{
- m_oki->write_command(0x40); /* Stop playing music */
+ m_oki->write(0x40); /* Stop playing music */
}
}
@@ -424,22 +424,22 @@ void snowbros_state::sb3_play_music(int data)
void snowbros_state::sb3_play_sound (int data)
{
- int status = m_oki->read_status();
+ int status = m_oki->read();
if ((status&0x01)==0x00)
{
- m_oki->write_command(0x80|data);
- m_oki->write_command(0x00|0x12);
+ m_oki->write(0x80|data);
+ m_oki->write(0x00|0x12);
}
else if ((status&0x02)==0x00)
{
- m_oki->write_command(0x80|data);
- m_oki->write_command(0x00|0x22);
+ m_oki->write(0x80|data);
+ m_oki->write(0x00|0x22);
}
else if ((status&0x04)==0x00)
{
- m_oki->write_command(0x80|data);
- m_oki->write_command(0x00|0x42);
+ m_oki->write(0x80|data);
+ m_oki->write(0x00|0x42);
}
@@ -450,7 +450,7 @@ WRITE16_MEMBER(snowbros_state::sb3_sound_w)
if (data == 0x00fe)
{
m_sb3_music_is_playing = 0;
- m_oki->write_command(0x78); /* Stop sounds */
+ m_oki->write(0x78); /* Stop sounds */
}
else /* the alternating 0x00-0x2f or 0x30-0x5f might be something to do with the channels */
{
@@ -2034,7 +2034,7 @@ void snowbros_state::yutnori(machine_config &config)
okim6295_device &oki2(OKIM6295(config, "oki2", XTAL(16'000'000)/16, okim6295_device::PIN7_HIGH)); // clock frequency & pin 7 not verified
oki2.add_route(ALL_OUTPUTS, "mono", 1.0);
-MACHINE_CONFIG_END
+}
/***************************************************************************
diff --git a/src/mame/drivers/socrates.cpp b/src/mame/drivers/socrates.cpp
index dcbc94adf65..d13ec3cbda1 100644
--- a/src/mame/drivers/socrates.cpp
+++ b/src/mame/drivers/socrates.cpp
@@ -1465,66 +1465,64 @@ TIMER_CALLBACK_MEMBER(socrates_state::kbmcu_sim_cb)
}
}
-MACHINE_CONFIG_START(socrates_state::socrates)
+void socrates_state::socrates(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, XTAL(21'477'272)/6) /* Toshiba TMPZ84C00AP @ 3.579545 MHz, verified, xtal is divided by 6 */
- MCFG_DEVICE_PROGRAM_MAP(z80_mem)
- MCFG_DEVICE_IO_MAP(z80_io)
- MCFG_QUANTUM_TIME(attotime::from_hz(60))
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", socrates_state, assert_irq)
+ Z80(config, m_maincpu, XTAL(21'477'272)/6); /* Toshiba TMPZ84C00AP @ 3.579545 MHz, verified, xtal is divided by 6 */
+ m_maincpu->set_addrmap(AS_PROGRAM, &socrates_state::z80_mem);
+ m_maincpu->set_addrmap(AS_IO, &socrates_state::z80_io);
+ m_maincpu->set_vblank_int("screen", FUNC(socrates_state::assert_irq));
+ config.m_minimum_quantum = attotime::from_hz(60);
ADDRESS_MAP_BANK(config, "rombank1").set_map(&socrates_state::socrates_rombank_map).set_options(ENDIANNESS_LITTLE, 8, 32, 0x4000);
ADDRESS_MAP_BANK(config, "rambank1").set_map(&socrates_state::socrates_rambank_map).set_options(ENDIANNESS_LITTLE, 8, 32, 0x4000);
ADDRESS_MAP_BANK(config, "rambank2").set_map(&socrates_state::socrates_rambank_map).set_options(ENDIANNESS_LITTLE, 8, 32, 0x4000);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */
- MCFG_SCREEN_SIZE(264, 228) // technically the screen size is 256x228 but super painter abuses what I suspect is a hardware bug to display repeated pixels of the very last pixel beyond this horizontal space, well into hblank
- MCFG_SCREEN_VISIBLE_AREA(0, 263, 0, 219) // the last few rows are usually cut off by the screen bottom but are indeed displayed if you mess with v-hold
- MCFG_SCREEN_UPDATE_DRIVER(socrates_state, screen_update_socrates)
- MCFG_SCREEN_PALETTE("palette")
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_refresh_hz(60);
+ m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */
+ m_screen->set_size(264, 228); // technically the screen size is 256x228 but super painter abuses what I suspect is a hardware bug to display repeated pixels of the very last pixel beyond this horizontal space, well into hblank
+ m_screen->set_visarea(0, 263, 0, 219); // the last few rows are usually cut off by the screen bottom but are indeed displayed if you mess with v-hold
+ m_screen->set_screen_update(FUNC(socrates_state::screen_update_socrates));
+ m_screen->set_palette("palette");
PALETTE(config, "palette", FUNC(socrates_state::socrates_palette), 256);
/* sound hardware */
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("soc_snd", SOCRATES_SOUND, XTAL(21'477'272)/(512+256)) // this is correct, as strange as it sounds.
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25)
+ SOCRATES_SOUND(config, m_sound, XTAL(21'477'272)/(512+256)).add_route(ALL_OUTPUTS, "mono", 0.25); // this is correct, as strange as it sounds.
- MCFG_GENERIC_CARTSLOT_ADD("cartslot", generic_plain_slot, "socrates_cart")
+ GENERIC_CARTSLOT(config, m_cart, generic_plain_slot, "socrates_cart");
/* Software lists */
- MCFG_SOFTWARE_LIST_ADD("cart_list", "socrates")
-MACHINE_CONFIG_END
+ SOFTWARE_LIST(config, "cart_list").set_original("socrates");
+}
-MACHINE_CONFIG_START(socrates_state::socrates_pal)
+void socrates_state::socrates_pal(machine_config &config)
+{
socrates(config);
- MCFG_DEVICE_REPLACE("maincpu", Z80, XTAL(26'601'712)/8)
- MCFG_DEVICE_PROGRAM_MAP(z80_mem)
- MCFG_DEVICE_IO_MAP(z80_io)
- MCFG_QUANTUM_TIME(attotime::from_hz(50))
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", socrates_state, assert_irq)
+ m_maincpu->set_clock(XTAL(26'601'712)/8);
- MCFG_SCREEN_MODIFY("screen")
- MCFG_SCREEN_REFRESH_RATE(50)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) // not accurate
- MCFG_SCREEN_SIZE(264, 238) // technically the screen size is 256x228 but super painter abuses what I suspect is a hardware bug to display repeated pixels of the very last pixel beyond this horizontal space, well into hblank
- MCFG_SCREEN_VISIBLE_AREA(0, 263, 0, 229) // the last few rows are usually cut off by the screen bottom but are indeed displayed if you mess with v-hold
- MCFG_SCREEN_UPDATE_DRIVER(socrates_state, screen_update_socrates)
+ config.m_minimum_quantum = attotime::from_hz(50);
- MCFG_DEVICE_REPLACE("soc_snd", SOCRATES_SOUND, XTAL(26'601'712)/(512+256)) // this is correct, as strange as it sounds.
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25)
-MACHINE_CONFIG_END
+ m_screen->set_refresh_hz(50);
+ m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(2500)); // not accurate
+ m_screen->set_size(264, 238); // technically the screen size is 256x228 but super painter abuses what I suspect is a hardware bug to display repeated pixels of the very last pixel beyond this horizontal space, well into hblank
+ m_screen->set_visarea(0, 263, 0, 229); // the last few rows are usually cut off by the screen bottom but are indeed displayed if you mess with v-hold
+ m_screen->set_screen_update(FUNC(socrates_state::screen_update_socrates));
-MACHINE_CONFIG_START(iqunlimz_state::iqunlimz)
+ m_sound->set_clock(XTAL(26'601'712)/(512+256)); // this is correct, as strange as it sounds.
+}
+
+void iqunlimz_state::iqunlimz(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, XTAL(4'000'000)) /* not accurate */
- MCFG_DEVICE_PROGRAM_MAP(iqunlimz_mem)
- MCFG_DEVICE_IO_MAP(iqunlimz_io)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", iqunlimz_state, assert_irq)
+ Z80(config, m_maincpu, XTAL(4'000'000)); /* not accurate */
+ m_maincpu->set_addrmap(AS_PROGRAM, &iqunlimz_state::iqunlimz_mem);
+ m_maincpu->set_addrmap(AS_IO, &iqunlimz_state::iqunlimz_io);
+ m_maincpu->set_vblank_int("screen", FUNC(iqunlimz_state::assert_irq));
ADDRESS_MAP_BANK(config, "rombank1").set_map(&iqunlimz_state::iqunlimz_rombank_map).set_options(ENDIANNESS_LITTLE, 8, 32, 0x4000);
ADDRESS_MAP_BANK(config, "rombank2").set_map(&iqunlimz_state::iqunlimz_rombank_map).set_options(ENDIANNESS_LITTLE, 8, 32, 0x4000);
@@ -1532,23 +1530,22 @@ MACHINE_CONFIG_START(iqunlimz_state::iqunlimz)
ADDRESS_MAP_BANK(config, "rambank2").set_map(&iqunlimz_state::iqunlimz_rambank_map).set_options(ENDIANNESS_LITTLE, 8, 32, 0x4000);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */
- MCFG_SCREEN_UPDATE_DRIVER(iqunlimz_state, screen_update)
- MCFG_SCREEN_SIZE(256, 224)
- MCFG_SCREEN_VISIBLE_AREA(0, 256-1, 0, 224-1)
- MCFG_SCREEN_PALETTE("palette")
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_refresh_hz(60);
+ m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */
+ m_screen->set_screen_update(FUNC(iqunlimz_state::screen_update));
+ m_screen->set_size(256, 224);
+ m_screen->set_visarea(0, 256-1, 0, 224-1);
+ m_screen->set_palette("palette");
PALETTE(config, "palette", FUNC(iqunlimz_state::socrates_palette), 256);
/* sound hardware */
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("soc_snd", SOCRATES_SOUND, XTAL(21'477'272)/(512+256))
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25)
+ SOCRATES_SOUND(config, m_sound, XTAL(21'477'272)/(512+256)).add_route(ALL_OUTPUTS, "mono", 0.25);
- MCFG_GENERIC_CARTSLOT_ADD("cartslot", generic_plain_slot, nullptr)
-MACHINE_CONFIG_END
+ GENERIC_CARTSLOT(config, m_cart, generic_plain_slot, nullptr);
+}
/******************************************************************************
ROM Definitions
diff --git a/src/mame/drivers/softbox.cpp b/src/mame/drivers/softbox.cpp
index 699130f946d..634bb426a93 100644
--- a/src/mame/drivers/softbox.cpp
+++ b/src/mame/drivers/softbox.cpp
@@ -355,15 +355,12 @@ void softbox_state::ieee488_ifc(int state)
// MACHINE CONFIGURATION
//**************************************************************************
-//-------------------------------------------------
-// MACHINE_CONFIG( softbox )
-//-------------------------------------------------
-
-MACHINE_CONFIG_START(softbox_state::softbox)
+void softbox_state::softbox(machine_config &config)
+{
// basic machine hardware
- MCFG_DEVICE_ADD(Z80_TAG, Z80, XTAL(8'000'000)/2)
- MCFG_DEVICE_PROGRAM_MAP(softbox_mem)
- MCFG_DEVICE_IO_MAP(softbox_io)
+ Z80(config, m_maincpu, XTAL(8'000'000)/2);
+ m_maincpu->set_addrmap(AS_PROGRAM, &softbox_state::softbox_mem);
+ m_maincpu->set_addrmap(AS_IO, &softbox_state::softbox_io);
// devices
i8251_device &i8251(I8251(config, I8251_TAG, 0));
@@ -392,23 +389,19 @@ MACHINE_CONFIG_START(softbox_state::softbox)
dbrg.fr_handler().set(I8251_TAG, FUNC(i8251_device::write_rxc));
dbrg.ft_handler().set(I8251_TAG, FUNC(i8251_device::write_txc));
- MCFG_CBM_IEEE488_ADD("c8050")
+ ieee488_device::add_cbm_devices(config, "c8050");
- MCFG_DEVICE_ADD(CORVUS_HDC_TAG, CORVUS_HDC, 0)
- MCFG_HARDDISK_ADD("harddisk1")
- MCFG_HARDDISK_INTERFACE("corvus_hdd")
- MCFG_HARDDISK_ADD("harddisk2")
- MCFG_HARDDISK_INTERFACE("corvus_hdd")
- MCFG_HARDDISK_ADD("harddisk3")
- MCFG_HARDDISK_INTERFACE("corvus_hdd")
- MCFG_HARDDISK_ADD("harddisk4")
- MCFG_HARDDISK_INTERFACE("corvus_hdd")
+ CORVUS_HDC(config, m_hdc, 0);
+ HARDDISK(config, "harddisk1", "corvus_hdd");
+ HARDDISK(config, "harddisk2", "corvus_hdd");
+ HARDDISK(config, "harddisk3", "corvus_hdd");
+ HARDDISK(config, "harddisk4", "corvus_hdd");
- MCFG_IMI7000_BUS_ADD("imi5000h", nullptr, nullptr, nullptr)
+ imi7000_bus_device::add_config(config, "imi5000h", nullptr, nullptr, nullptr);
// software lists
- MCFG_SOFTWARE_LIST_ADD("flop_list", "softbox")
-MACHINE_CONFIG_END
+ SOFTWARE_LIST(config, "flop_list").set_original("softbox");
+}
diff --git a/src/mame/drivers/solbourne.cpp b/src/mame/drivers/solbourne.cpp
index fd0ee9cc345..bab72f99079 100644
--- a/src/mame/drivers/solbourne.cpp
+++ b/src/mame/drivers/solbourne.cpp
@@ -26,8 +26,9 @@ private:
static INPUT_PORTS_START( solbourne )
INPUT_PORTS_END
-MACHINE_CONFIG_START(solbourne_state::solbourne)
-MACHINE_CONFIG_END
+void solbourne_state::solbourne(machine_config &config)
+{
+}
ROM_START( sols5e )
ROM_REGION( 0x20000, "maincpu", 0 )
diff --git a/src/mame/drivers/solomon.cpp b/src/mame/drivers/solomon.cpp
index 1a2b20f3eec..39cdefa9b9d 100644
--- a/src/mame/drivers/solomon.cpp
+++ b/src/mame/drivers/solomon.cpp
@@ -209,27 +209,27 @@ INTERRUPT_GEN_MEMBER(solomon_state::vblank_irq)
-MACHINE_CONFIG_START(solomon_state::solomon)
-
+void solomon_state::solomon(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, 4000000) /* 4.0 MHz (?????) */
- MCFG_DEVICE_PROGRAM_MAP(main_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", solomon_state, vblank_irq)
-
- MCFG_DEVICE_ADD("audiocpu", Z80, 3072000)
- MCFG_DEVICE_PROGRAM_MAP(sound_map)
- MCFG_DEVICE_IO_MAP(sound_portmap)
- MCFG_DEVICE_PERIODIC_INT_DRIVER(solomon_state, irq0_line_hold, 2*60) /* ??? */
+ Z80(config, m_maincpu, 4000000); /* 4.0 MHz (?????) */
+ m_maincpu->set_addrmap(AS_PROGRAM, &solomon_state::main_map);
+ m_maincpu->set_vblank_int("screen", FUNC(solomon_state::vblank_irq));
+
+ Z80(config, m_audiocpu, 3072000);
+ m_audiocpu->set_addrmap(AS_PROGRAM, &solomon_state::sound_map);
+ m_audiocpu->set_addrmap(AS_IO, &solomon_state::sound_portmap);
+ m_audiocpu->set_periodic_int(FUNC(solomon_state::irq0_line_hold), attotime::from_hz(2*60)); /* ??? */
/* NMIs are caused by the main CPU */
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(32*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(solomon_state, screen_update_solomon)
- MCFG_SCREEN_PALETTE(m_palette)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(32*8, 32*8);
+ screen.set_visarea(0*8, 32*8-1, 2*8, 30*8-1);
+ screen.set_screen_update(FUNC(solomon_state::screen_update_solomon));
+ screen.set_palette(m_palette);
GFXDECODE(config, m_gfxdecode, m_palette, gfx_solomon);
PALETTE(config, m_palette).set_format(palette_device::xBGR_444, 256);
@@ -242,7 +242,7 @@ MACHINE_CONFIG_START(solomon_state::solomon)
AY8910(config, "ay1", 1500000).add_route(ALL_OUTPUTS, "mono", 0.12);
AY8910(config, "ay2", 1500000).add_route(ALL_OUTPUTS, "mono", 0.12);
AY8910(config, "ay3", 1500000).add_route(ALL_OUTPUTS, "mono", 0.12);
-MACHINE_CONFIG_END
+}
/***************************************************************************
diff --git a/src/mame/drivers/sonson.cpp b/src/mame/drivers/sonson.cpp
index b7127053fdc..b12d9e7624e 100644
--- a/src/mame/drivers/sonson.cpp
+++ b/src/mame/drivers/sonson.cpp
@@ -225,16 +225,16 @@ GFXDECODE_END
-MACHINE_CONFIG_START(sonson_state::sonson)
-
+void sonson_state::sonson(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", MC6809, XTAL(12'000'000)/2) // HD68B09P (/4 internally)
- MCFG_DEVICE_PROGRAM_MAP(main_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", sonson_state, irq0_line_hold)
+ MC6809(config, m_maincpu, XTAL(12'000'000)/2); // HD68B09P (/4 internally)
+ m_maincpu->set_addrmap(AS_PROGRAM, &sonson_state::main_map);
+ m_maincpu->set_vblank_int("screen", FUNC(sonson_state::irq0_line_hold));
- MCFG_DEVICE_ADD("audiocpu", MC6809, XTAL(12'000'000)/2) // HD68B09P (/4 internally)
- MCFG_DEVICE_PROGRAM_MAP(sound_map)
- MCFG_DEVICE_PERIODIC_INT_DRIVER(sonson_state, irq0_line_hold, 4*60) /* FIRQs are triggered by the main CPU */
+ MC6809(config, m_audiocpu, XTAL(12'000'000)/2); // HD68B09P (/4 internally)
+ m_audiocpu->set_addrmap(AS_PROGRAM, &sonson_state::sound_map);
+ m_audiocpu->set_periodic_int(FUNC(sonson_state::irq0_line_hold), attotime::from_hz(4*60)); /* FIRQs are triggered by the main CPU */
ls259_device &mainlatch(LS259(config, "mainlatch")); // A9
mainlatch.q_out_cb<0>().set(FUNC(sonson_state::flipscreen_w));
@@ -243,14 +243,14 @@ MACHINE_CONFIG_START(sonson_state::sonson)
mainlatch.q_out_cb<7>().set(FUNC(sonson_state::coin1_counter_w));
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(57.37)
- MCFG_SCREEN_SIZE(32*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(1*8, 31*8-1, 1*8, 31*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(sonson_state, screen_update_sonson)
- MCFG_SCREEN_PALETTE(m_palette)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(57.37);
+ screen.set_size(32*8, 32*8);
+ screen.set_visarea(1*8, 31*8-1, 1*8, 31*8-1);
+ screen.set_screen_update(FUNC(sonson_state::screen_update_sonson));
+ screen.set_palette(m_palette);
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, m_palette, gfx_sonson)
+ GFXDECODE(config, m_gfxdecode, m_palette, gfx_sonson);
PALETTE(config, m_palette, FUNC(sonson_state::sonson_palette), 64*4 + 32*8, 32);
@@ -262,7 +262,7 @@ MACHINE_CONFIG_START(sonson_state::sonson)
AY8910(config, "ay1", XTAL(12'000'000)/8).add_route(ALL_OUTPUTS, "mono", 0.30); /* 1.5 MHz */
AY8910(config, "ay2", XTAL(12'000'000)/8).add_route(ALL_OUTPUTS, "mono", 0.30); /* 1.5 MHz */
-MACHINE_CONFIG_END
+}
diff --git a/src/mame/drivers/sorcerer.cpp b/src/mame/drivers/sorcerer.cpp
index f76ddad5d35..a18bd44d42f 100644
--- a/src/mame/drivers/sorcerer.cpp
+++ b/src/mame/drivers/sorcerer.cpp
@@ -408,64 +408,64 @@ DEVICE_INPUT_DEFAULTS_END
MACHINE_CONFIG_START(sorcerer_state::sorcerer)
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, ES_CPU_CLOCK)
- MCFG_DEVICE_PROGRAM_MAP(sorcerer_mem)
- MCFG_DEVICE_IO_MAP(sorcerer_io)
+ Z80(config, m_maincpu, ES_CPU_CLOCK);
+ m_maincpu->set_addrmap(AS_PROGRAM, &sorcerer_state::sorcerer_mem);
+ m_maincpu->set_addrmap(AS_IO, &sorcerer_state::sorcerer_io);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(50)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(200))
- MCFG_SCREEN_SIZE(64*8, 30*8)
- MCFG_SCREEN_VISIBLE_AREA(0, 64*8-1, 0, 30*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(sorcerer_state, screen_update)
- MCFG_SCREEN_PALETTE("palette")
-
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_sorcerer)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(50);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(200));
+ screen.set_size(64*8, 30*8);
+ screen.set_visarea(0, 64*8-1, 0, 30*8-1);
+ screen.set_screen_update(FUNC(sorcerer_state::screen_update));
+ screen.set_palette("palette");
+
+ GFXDECODE(config, "gfxdecode", "palette", gfx_sorcerer);
PALETTE(config, "palette", palette_device::MONOCHROME);
/* sound hardware */
SPEAKER(config, "mono").front_center();
- WAVE(config, "wave", "cassette").add_route(ALL_OUTPUTS, "mono", 0.05); // cass1 speaker
- WAVE(config, "wave2", "cassette2").add_route(ALL_OUTPUTS, "mono", 0.05); // cass2 speaker
+ WAVE(config, "wave", m_cassette1).add_route(ALL_OUTPUTS, "mono", 0.05); // cass1 speaker
+ WAVE(config, "wave2", m_cassette2).add_route(ALL_OUTPUTS, "mono", 0.05); // cass2 speaker
AY31015(config, m_uart);
- m_uart->set_tx_clock(ES_UART_CLOCK);
- m_uart->set_rx_clock(ES_UART_CLOCK);
m_uart->set_auto_rdav(true);
+ CLOCK(config, m_uart_clock, ES_UART_CLOCK);
+ m_uart_clock->signal_handler().set(m_uart, FUNC(ay31015_device::write_tcp));
+ m_uart_clock->signal_handler().append(m_uart, FUNC(ay31015_device::write_rcp));
+
RS232_PORT(config, "rs232", default_rs232_devices, "null_modem").set_option_device_input_defaults("terminal", DEVICE_INPUT_DEFAULTS_NAME(terminal));
/* printer */
- MCFG_DEVICE_ADD("centronics", CENTRONICS, centronics_devices, "covox")
-
/* The use of the parallel port as a general purpose port is not emulated.
Currently the only use is to read the printer status in the Centronics CENDRV bios routine. */
- MCFG_CENTRONICS_BUSY_HANDLER(WRITELINE("cent_status_in", input_buffer_device, write_bit7))
+ CENTRONICS(config, m_centronics, centronics_devices, "covox");
+ m_centronics->busy_handler().set("cent_status_in", FUNC(input_buffer_device::write_bit7));
- MCFG_DEVICE_ADD("cent_status_in", INPUT_BUFFER, 0)
+ INPUT_BUFFER(config, "cent_status_in");
/* quickload */
- MCFG_SNAPSHOT_ADD("snapshot", sorcerer_state, sorcerer, "snp", 2)
- MCFG_QUICKLOAD_ADD("quickload", sorcerer_state, sorcerer, "bin", 3)
+ MCFG_SNAPSHOT_ADD("snapshot", sorcerer_state, sorcerer, "snp", attotime::from_seconds(2))
+ MCFG_QUICKLOAD_ADD("quickload", sorcerer_state, sorcerer, "bin", attotime::from_seconds(3))
- MCFG_CASSETTE_ADD( "cassette" )
- MCFG_CASSETTE_FORMATS(sorcerer_cassette_formats)
- MCFG_CASSETTE_DEFAULT_STATE(CASSETTE_PLAY | CASSETTE_MOTOR_ENABLED | CASSETTE_SPEAKER_ENABLED)
- MCFG_CASSETTE_INTERFACE("sorcerer_cass")
+ CASSETTE(config, m_cassette1);
+ m_cassette1->set_formats(sorcerer_cassette_formats);
+ m_cassette1->set_default_state(CASSETTE_PLAY | CASSETTE_MOTOR_ENABLED | CASSETTE_SPEAKER_ENABLED);
+ m_cassette1->set_interface("sorcerer_cass");
- MCFG_CASSETTE_ADD( "cassette2" )
- MCFG_CASSETTE_FORMATS(sorcerer_cassette_formats)
- MCFG_CASSETTE_DEFAULT_STATE(CASSETTE_PLAY | CASSETTE_MOTOR_ENABLED | CASSETTE_SPEAKER_ENABLED)
- MCFG_CASSETTE_INTERFACE("sorcerer_cass")
+ CASSETTE(config, m_cassette2);
+ m_cassette2->set_formats(sorcerer_cassette_formats);
+ m_cassette2->set_default_state(CASSETTE_PLAY | CASSETTE_MOTOR_ENABLED | CASSETTE_SPEAKER_ENABLED);
+ m_cassette2->set_interface("sorcerer_cass");
/* cartridge */
- MCFG_GENERIC_CARTSLOT_ADD("cartslot", generic_plain_slot, "sorcerer_cart")
- MCFG_GENERIC_EXTENSIONS("bin,rom")
+ GENERIC_CARTSLOT(config, m_cart, generic_plain_slot, "sorcerer_cart", "bin,rom");
/* software lists */
- MCFG_SOFTWARE_LIST_ADD("cart_list","sorcerer_cart")
- MCFG_SOFTWARE_LIST_ADD("cass_list","sorcerer_cass")
+ SOFTWARE_LIST(config, "cart_list").set_original("sorcerer_cart");
+ SOFTWARE_LIST(config, "cass_list").set_original("sorcerer_cass");
// internal ram
RAM(config, RAM_TAG).set_default_size("48K").set_extra_options("8K,16K,32K");
@@ -476,29 +476,27 @@ static void floppies(device_slot_interface &device)
device.option_add("525qd", FLOPPY_525_QD);
}
-MACHINE_CONFIG_START(sorcerer_state::sorcererd)
+void sorcerer_state::sorcererd(machine_config &config)
+{
sorcerer(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(sorcererd_mem)
- MCFG_DEVICE_IO_MAP(sorcererd_io)
+ m_maincpu->set_addrmap(AS_PROGRAM, &sorcerer_state::sorcererd_mem);
+ m_maincpu->set_addrmap(AS_IO, &sorcerer_state::sorcererd_io);
MCFG_MACHINE_START_OVERRIDE(sorcerer_state, sorcererd )
MICROPOLIS(config, m_fdc, 0);
m_fdc->set_default_drive_tags();
- MCFG_LEGACY_FLOPPY_4_DRIVES_ADD(sorcerer_floppy_interface)
+ legacy_floppy_image_device::add_4drives(config, &sorcerer_floppy_interface);
FD1793(config, m_fdc2, 8_MHz_XTAL / 8); // confirmed clock
m_fdc2->set_force_ready(true); // should be able to get rid of this when fdc issue is fixed
m_fdc2->intrq_wr_callback().set(FUNC(sorcerer_state::intrq_w));
m_fdc2->drq_wr_callback().set(FUNC(sorcerer_state::drq_w));
- MCFG_FLOPPY_DRIVE_ADD("fdc2:0", floppies, "525qd", floppy_image_device::default_floppy_formats)
- MCFG_FLOPPY_DRIVE_SOUND(true)
- MCFG_FLOPPY_DRIVE_ADD("fdc2:1", floppies, "525qd", floppy_image_device::default_floppy_formats)
- MCFG_FLOPPY_DRIVE_SOUND(true)
+ FLOPPY_CONNECTOR(config, "fdc2:0", floppies, "525qd", floppy_image_device::default_floppy_formats).enable_sound(true);
+ FLOPPY_CONNECTOR(config, "fdc2:1", floppies, "525qd", floppy_image_device::default_floppy_formats).enable_sound(true);
- MCFG_SOFTWARE_LIST_ADD("flop_list","sorcerer_flop")
-MACHINE_CONFIG_END
+ SOFTWARE_LIST(config, "flop_list").set_original("sorcerer_flop");
+}
void sorcerer_state::init_sorcerer()
diff --git a/src/mame/drivers/sothello.cpp b/src/mame/drivers/sothello.cpp
index 30956b73eb0..a02039dd890 100644
--- a/src/mame/drivers/sothello.cpp
+++ b/src/mame/drivers/sothello.cpp
@@ -354,21 +354,21 @@ void sothello_state::machine_reset()
m_msm_data = 0;
}
-MACHINE_CONFIG_START(sothello_state::sothello)
-
+void sothello_state::sothello(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, XTAL(21'477'272) / 6)
- MCFG_DEVICE_PROGRAM_MAP(maincpu_mem_map)
- MCFG_DEVICE_IO_MAP(maincpu_io_map)
+ Z80(config, m_maincpu, XTAL(21'477'272) / 6);
+ m_maincpu->set_addrmap(AS_PROGRAM, &sothello_state::maincpu_mem_map);
+ m_maincpu->set_addrmap(AS_IO, &sothello_state::maincpu_io_map);
- MCFG_DEVICE_ADD("soundcpu", Z80, XTAL(21'477'272) / 6)
- MCFG_DEVICE_PROGRAM_MAP(soundcpu_mem_map)
- MCFG_DEVICE_IO_MAP(soundcpu_io_map)
+ Z80(config, m_soundcpu, XTAL(21'477'272) / 6);
+ m_soundcpu->set_addrmap(AS_PROGRAM, &sothello_state::soundcpu_mem_map);
+ m_soundcpu->set_addrmap(AS_IO, &sothello_state::soundcpu_io_map);
- MCFG_DEVICE_ADD("subcpu", MC6809, XTAL(8'000'000)) // divided by 4 internally
- MCFG_DEVICE_PROGRAM_MAP(subcpu_mem_map)
+ MC6809(config, m_subcpu, XTAL(8'000'000)); // divided by 4 internally
+ m_subcpu->set_addrmap(AS_PROGRAM, &sothello_state::subcpu_mem_map);
- MCFG_QUANTUM_TIME(attotime::from_hz(600))
+ config.m_minimum_quantum = attotime::from_hz(600);
/* video hardware */
v9938_device &v9938(V9938(config, "v9938", XTAL(21'477'272)));
@@ -391,11 +391,11 @@ MACHINE_CONFIG_START(sothello_state::sothello)
ymsnd.add_route(2, "mono", 0.25);
ymsnd.add_route(3, "mono", 0.50);
- MCFG_DEVICE_ADD("msm", MSM5205, XTAL(384'000))
- MCFG_MSM5205_VCLK_CB(WRITELINE(*this, sothello_state, adpcm_int)) /* interrupt function */
- MCFG_MSM5205_PRESCALER_SELECTOR(S48_4B) /* changed on the fly */
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
-MACHINE_CONFIG_END
+ MSM5205(config, m_msm, XTAL(384'000));
+ m_msm->vck_legacy_callback().set(FUNC(sothello_state::adpcm_int)); /* interrupt function */
+ m_msm->set_prescaler_selector(msm5205_device::S48_4B); /* changed on the fly */
+ m_msm->add_route(ALL_OUTPUTS, "mono", 1.0);
+}
/***************************************************************************
diff --git a/src/mame/drivers/spacefb.cpp b/src/mame/drivers/spacefb.cpp
index 8a8c52e7f6a..70e88898b1d 100644
--- a/src/mame/drivers/spacefb.cpp
+++ b/src/mame/drivers/spacefb.cpp
@@ -330,8 +330,8 @@ INPUT_PORTS_END
*
*************************************/
-MACHINE_CONFIG_START(spacefb_state::spacefb)
-
+void spacefb_state::spacefb(machine_config &config)
+{
/* basic machine hardware */
Z80(config, m_maincpu, SPACEFB_MAIN_CPU_CLOCK);
m_maincpu->set_addrmap(AS_PROGRAM, &spacefb_state::spacefb_main_map);
@@ -344,17 +344,16 @@ MACHINE_CONFIG_START(spacefb_state::spacefb)
m_audiocpu->t0_in_cb().set(FUNC(spacefb_state::audio_t0_r));
m_audiocpu->t1_in_cb().set(FUNC(spacefb_state::audio_t1_r));
- MCFG_QUANTUM_TIME(attotime::from_hz(180))
+ config.m_minimum_quantum = attotime::from_hz(180);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_RAW_PARAMS(SPACEFB_PIXEL_CLOCK, SPACEFB_HTOTAL, SPACEFB_HBEND, SPACEFB_HBSTART, SPACEFB_VTOTAL, SPACEFB_VBEND, SPACEFB_VBSTART)
- MCFG_SCREEN_UPDATE_DRIVER(spacefb_state, screen_update)
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_raw(SPACEFB_PIXEL_CLOCK, SPACEFB_HTOTAL, SPACEFB_HBEND, SPACEFB_HBSTART, SPACEFB_VTOTAL, SPACEFB_VBEND, SPACEFB_VBSTART);
+ m_screen->set_screen_update(FUNC(spacefb_state::screen_update));
/* audio hardware */
spacefb_audio(config);
-
-MACHINE_CONFIG_END
+}
diff --git a/src/mame/drivers/spaceg.cpp b/src/mame/drivers/spaceg.cpp
index 6ae5771ac79..911c4c94902 100644
--- a/src/mame/drivers/spaceg.cpp
+++ b/src/mame/drivers/spaceg.cpp
@@ -164,10 +164,12 @@ Notes:
**************************************************************************************/
#include "emu.h"
-#include "includes/mw8080bw.h"
#include "cpu/z80/z80.h"
+#include "sound/samples.h"
+#include "sound/sn76477.h"
#include "emupal.h"
+#include "screen.h"
#include "speaker.h"
diff --git a/src/mame/drivers/spartanxtec.cpp b/src/mame/drivers/spartanxtec.cpp
index ba840dfc246..f8258357338 100644
--- a/src/mame/drivers/spartanxtec.cpp
+++ b/src/mame/drivers/spartanxtec.cpp
@@ -359,32 +359,32 @@ void spartanxtec_state::spartanxtec_palette(palette_device &palette) const
-MACHINE_CONFIG_START(spartanxtec_state::spartanxtec)
-
+void spartanxtec_state::spartanxtec(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80,4000000) /* ? MHz */
- MCFG_DEVICE_PROGRAM_MAP(spartanxtec_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", spartanxtec_state, irq0_line_assert)
+ Z80(config, m_maincpu, 4000000); /* ? MHz */
+ m_maincpu->set_addrmap(AS_PROGRAM, &spartanxtec_state::spartanxtec_map);
+ m_maincpu->set_vblank_int("screen", FUNC(spartanxtec_state::irq0_line_assert));
- MCFG_DEVICE_ADD("audiocpu", Z80,4000000)
- MCFG_DEVICE_PROGRAM_MAP(spartanxtec_sound_map)
- MCFG_DEVICE_IO_MAP(spartanxtec_sound_io)
- MCFG_DEVICE_PERIODIC_INT_DRIVER(spartanxtec_state, irq0_line_assert, 1000) // controls speed of music
-// MCFG_DEVICE_VBLANK_INT_DRIVER("screen", spartanxtec_state, irq0_line_hold)
+ Z80(config, m_audiocpu, 4000000);
+ m_audiocpu->set_addrmap(AS_PROGRAM, &spartanxtec_state::spartanxtec_sound_map);
+ m_audiocpu->set_addrmap(AS_IO, &spartanxtec_state::spartanxtec_sound_io);
+ m_audiocpu->set_periodic_int(FUNC(spartanxtec_state::irq0_line_assert), attotime::from_hz(1000)); // controls speed of music
+// m_audiocpu->set_vblank_int("screen", FUNC(spartanxtec_state::irq0_line_hold));
/* video hardware */
// todo, proper screen timings for this bootleg PCB - as visible area is less it's probably ~60hz, not 55
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(1790))
- MCFG_SCREEN_SIZE(64*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA((64*8-256)/2, 64*8-(64*8-256)/2-1, 0*8, 32*8-1-16)
- MCFG_SCREEN_UPDATE_DRIVER(spartanxtec_state, screen_update_spartanxtec)
- MCFG_SCREEN_PALETTE(m_palette)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(1790));
+ screen.set_size(64*8, 32*8);
+ screen.set_visarea((64*8-256)/2, 64*8-(64*8-256)/2-1, 0*8, 32*8-1-16);
+ screen.set_screen_update(FUNC(spartanxtec_state::screen_update_spartanxtec));
+ screen.set_palette(m_palette);
PALETTE(config, m_palette, FUNC(spartanxtec_state::spartanxtec_palette), 0x200);
- MCFG_DEVICE_ADD(m_gfxdecode, GFXDECODE, m_palette, gfx_news)
+ GFXDECODE(config, m_gfxdecode, m_palette, gfx_news);
/* sound hardware */
SPEAKER(config, "mono").front_center();
@@ -397,8 +397,7 @@ MACHINE_CONFIG_START(spartanxtec_state::spartanxtec)
AY8912(config, "ay2", 1000000).add_route(ALL_OUTPUTS, "mono", 0.25);
AY8912(config, "ay3", 1000000).add_route(ALL_OUTPUTS, "mono", 0.25);
-
-MACHINE_CONFIG_END
+}
diff --git a/src/mame/drivers/spbactn.cpp b/src/mame/drivers/spbactn.cpp
index d6ba0827234..e231e4e5225 100644
--- a/src/mame/drivers/spbactn.cpp
+++ b/src/mame/drivers/spbactn.cpp
@@ -422,7 +422,7 @@ void spbactn_state::spbactn(machine_config &config)
// actual blanking frequencies unknown, but should be close to NTSC
m_screen->set_raw(XTAL(22'656'000) / 2, 720, 0, 512, 262, 16, 240);
#else
- // MCFG_SCREEN_RAW_PARAMS breaks sprites; keeping this in for now
+ // set_raw breaks sprites; keeping this in for now
m_screen->set_refresh_hz(60);
m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(0));
m_screen->set_size(64*8, 32*8);
diff --git a/src/mame/drivers/spc1000.cpp b/src/mame/drivers/spc1000.cpp
index 51d1c928844..23c5d8699e2 100644
--- a/src/mame/drivers/spc1000.cpp
+++ b/src/mame/drivers/spc1000.cpp
@@ -466,20 +466,22 @@ void spc1000_exp(device_slot_interface &device)
device.option_add("vdp", SPC1000_VDP_EXP);
}
-MACHINE_CONFIG_START(spc1000_state::spc1000)
+void spc1000_state::spc1000(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu",Z80, XTAL(4'000'000))
- MCFG_DEVICE_PROGRAM_MAP(spc1000_mem)
- MCFG_DEVICE_IO_MAP(spc1000_io)
+ Z80(config, m_maincpu, XTAL(4'000'000));
+ m_maincpu->set_addrmap(AS_PROGRAM, &spc1000_state::spc1000_mem);
+ m_maincpu->set_addrmap(AS_IO, &spc1000_state::spc1000_io);
/* video hardware */
- MCFG_SCREEN_MC6847_NTSC_ADD("screen", "mc6847")
-
- MCFG_DEVICE_ADD("mc6847", MC6847_NTSC, XTAL(3'579'545))
- MCFG_MC6847_FSYNC_CALLBACK(WRITELINE(*this, spc1000_state, irq_w))
- MCFG_MC6847_INPUT_CALLBACK(READ8(*this, spc1000_state, mc6847_videoram_r))
- MCFG_MC6847_CHARROM_CALLBACK(spc1000_state, get_char_rom)
- MCFG_MC6847_FIXED_MODE(mc6847_ntsc_device::MODE_GM2)
+ SCREEN(config, "screen", SCREEN_TYPE_RASTER);
+
+ MC6847_NTSC(config, m_vdg, XTAL(3'579'545));
+ m_vdg->set_screen("screen");
+ m_vdg->fsync_wr_callback().set(FUNC(spc1000_state::irq_w));
+ m_vdg->input_callback().set(FUNC(spc1000_state::mc6847_videoram_r));
+ m_vdg->set_get_char_rom(FUNC(spc1000_state::get_char_rom));
+ m_vdg->set_get_fixed_mode(mc6847_ntsc_device::MODE_GM2);
// other lines not connected
/* sound hardware */
@@ -488,26 +490,28 @@ MACHINE_CONFIG_START(spc1000_state::spc1000)
ay8910.port_a_read_callback().set(FUNC(spc1000_state::porta_r));
ay8910.port_b_write_callback().set("cent_data_out", FUNC(output_latch_device::bus_w));
ay8910.add_route(ALL_OUTPUTS, "mono", 1.00);
- WAVE(config, "wave", "cassette").add_route(ALL_OUTPUTS, "mono", 0.05);
+ WAVE(config, "wave", m_cass).add_route(ALL_OUTPUTS, "mono", 0.05);
+
+ SPC1000_EXP_SLOT(config, "ext1", spc1000_exp);
- MCFG_DEVICE_ADD("ext1", SPC1000_EXP_SLOT, 0)
- MCFG_DEVICE_SLOT_INTERFACE(spc1000_exp, nullptr, false)
+ CENTRONICS(config, m_centronics, centronics_devices, "printer");
+ m_centronics->busy_handler().set(FUNC(spc1000_state::centronics_busy_w));
- MCFG_DEVICE_ADD(m_centronics, CENTRONICS, centronics_devices, "printer")
- MCFG_CENTRONICS_BUSY_HANDLER(WRITELINE(*this, spc1000_state, centronics_busy_w))
- MCFG_CENTRONICS_OUTPUT_LATCH_ADD("cent_data_out", "centronics")
- MCFG_DEVICE_ADD("cent_status_in", INPUT_BUFFER, 0)
+ output_latch_device &cent_data_out(OUTPUT_LATCH(config, "cent_data_out"));
+ m_centronics->set_output_latch(cent_data_out);
- MCFG_CASSETTE_ADD("cassette")
- MCFG_CASSETTE_FORMATS(spc1000_cassette_formats)
- MCFG_CASSETTE_DEFAULT_STATE(CASSETTE_STOPPED | CASSETTE_SPEAKER_ENABLED | CASSETTE_MOTOR_DISABLED)
- MCFG_CASSETTE_INTERFACE("spc1000_cass")
+ INPUT_BUFFER(config, "cent_status_in");
- MCFG_SOFTWARE_LIST_ADD("cass_list", "spc1000_cass")
+ CASSETTE(config, m_cass);
+ m_cass->set_formats(spc1000_cassette_formats);
+ m_cass->set_default_state(CASSETTE_STOPPED | CASSETTE_SPEAKER_ENABLED | CASSETTE_MOTOR_DISABLED);
+ m_cass->set_interface("spc1000_cass");
+
+ SOFTWARE_LIST(config, "cass_list").set_original("spc1000_cass");
/* internal ram */
RAM(config, RAM_TAG).set_default_size("64K");
-MACHINE_CONFIG_END
+}
/* ROM definition */
ROM_START( spc1000 )
diff --git a/src/mame/drivers/spc1500.cpp b/src/mame/drivers/spc1500.cpp
index c7860f951c6..bbbacb5a135 100644
--- a/src/mame/drivers/spc1500.cpp
+++ b/src/mame/drivers/spc1500.cpp
@@ -410,12 +410,12 @@ WRITE8_MEMBER( spc1500_state::crtc_w)
if((offset & 1) == 0)
{
m_crtc_index = data & 0x1f;
- m_vdg->address_w(space, 0, data);
+ m_vdg->address_w(data);
}
else
{
m_crtc_vreg[m_crtc_index] = data;
- m_vdg->register_w(space, 0, data);
+ m_vdg->register_w(data);
}
}
@@ -423,7 +423,7 @@ READ8_MEMBER( spc1500_state::crtc_r)
{
if (offset & 1)
{
- return m_vdg->register_r(space, 0);
+ return m_vdg->register_r();
}
return 0;
}
@@ -648,8 +648,8 @@ WRITE8_MEMBER( spc1500_state::double_w)
if (offset < 0x1900) { crtc_w(space, offset, data); } else
if (offset < 0x1a00) {} else
if (offset < 0x1b00) { m_pio->write(offset, data); } else
- if (offset < 0x1c00) { m_sound->data_w(space, offset, data);} else
- if (offset < 0x1d00) { m_sound->address_w(space, offset, data);} else
+ if (offset < 0x1c00) { m_sound->data_w(data);} else
+ if (offset < 0x1d00) { m_sound->address_w(data);} else
if (offset < 0x1e00) { romsel(space, offset, data);} else
if (offset < 0x1f00) { ramsel(space, offset, data);} else
if (offset < 0x2000) {} else
@@ -675,7 +675,7 @@ READ8_MEMBER( spc1500_state::io_r)
if (offset < 0x1900) { return crtc_r(space, offset); } else
if (offset < 0x1a00) { return keyboard_r(space, offset); } else
if (offset < 0x1b00) { return m_pio->read(offset); } else
- if (offset < 0x1c00) { return m_sound->data_r(space, offset); } else
+ if (offset < 0x1c00) { return m_sound->data_r(); } else
if (offset < 0x2000) {} else
if (offset < 0x10000){
if (offset < 0x4000)
@@ -877,22 +877,23 @@ READ8_MEMBER( spc1500_state::porta_r )
return data;
}
-MACHINE_CONFIG_START(spc1500_state::spc1500)
+void spc1500_state::spc1500(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu",Z80, XTAL(4'000'000))
- MCFG_DEVICE_PROGRAM_MAP(spc1500_mem)
- //MCFG_DEVICE_IO_MAP(spc1500_io)
- MCFG_DEVICE_IO_MAP(spc1500_double_io)
- MCFG_DEVICE_PERIODIC_INT_DRIVER(spc1500_state, irq0_line_hold, 60)
+ Z80(config, m_maincpu, XTAL(4'000'000));
+ m_maincpu->set_addrmap(AS_PROGRAM, &spc1500_state::spc1500_mem);
+ //m_maincpu->set_addrmap(AS_IO, &spc1500_state::spc1500_io);
+ m_maincpu->set_addrmap(AS_IO, &spc1500_state::spc1500_double_io);
+ m_maincpu->set_periodic_int(FUNC(spc1500_state::irq0_line_hold), attotime::from_hz(60));
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */
- MCFG_SCREEN_SIZE(640, 400)
- MCFG_SCREEN_VISIBLE_AREA(0,640-1,0,400-1)
- MCFG_SCREEN_UPDATE_DEVICE("mc6845", mc6845_device, screen_update )
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */
+ screen.set_size(640, 400);
+ screen.set_visarea(0,640-1,0,400-1);
+ screen.set_screen_update("mc6845", FUNC(mc6845_device::screen_update));
PALETTE(config, m_palette, FUNC(spc1500_state::spc_palette), 8);
@@ -911,7 +912,7 @@ MACHINE_CONFIG_START(spc1500_state::spc1500)
m_pio->out_pb_callback().set(FUNC(spc1500_state::portb_w));
m_pio->out_pc_callback().set(FUNC(spc1500_state::portc_w));
- MCFG_TIMER_DRIVER_ADD_PERIODIC("1hz", spc1500_state, timer, attotime::from_hz(1))
+ TIMER(config, "1hz").configure_periodic(FUNC(spc1500_state::timer), attotime::from_hz(1));
/* sound hardware */
SPEAKER(config, "mono").front_center();
@@ -919,23 +920,26 @@ MACHINE_CONFIG_START(spc1500_state::spc1500)
m_sound->port_a_read_callback().set(FUNC(spc1500_state::psga_r));
m_sound->port_b_write_callback().set(FUNC(spc1500_state::psgb_w));
m_sound->add_route(ALL_OUTPUTS, "mono", 1.00);
- WAVE(config, "wave", "cassette").add_route(ALL_OUTPUTS, "mono", 0.25);
+ WAVE(config, "wave", m_cass).add_route(ALL_OUTPUTS, "mono", 0.25);
+
+ CENTRONICS(config, m_centronics, centronics_devices, "printer");
+ m_centronics->busy_handler().set(FUNC(spc1500_state::centronics_busy_w));
- MCFG_DEVICE_ADD(m_centronics, CENTRONICS, centronics_devices, "printer")
- MCFG_CENTRONICS_BUSY_HANDLER(WRITELINE(*this, spc1500_state, centronics_busy_w))
- MCFG_CENTRONICS_OUTPUT_LATCH_ADD("cent_data_out", "centronics")
- MCFG_DEVICE_ADD("cent_status_in", INPUT_BUFFER, 0)
+ output_latch_device &cent_data_out(OUTPUT_LATCH(config, "cent_data_out"));
+ m_centronics->set_output_latch(cent_data_out);
- MCFG_CASSETTE_ADD("cassette")
- MCFG_CASSETTE_FORMATS(spc1000_cassette_formats)
- MCFG_CASSETTE_DEFAULT_STATE(CASSETTE_STOPPED | CASSETTE_SPEAKER_MUTED | CASSETTE_MOTOR_DISABLED)
- MCFG_CASSETTE_INTERFACE("spc1500_cass")
+ INPUT_BUFFER(config, "cent_status_in");
- MCFG_SOFTWARE_LIST_ADD("cass_list", "spc1500_cass")
+ CASSETTE(config, m_cass);
+ m_cass->set_formats(spc1000_cassette_formats);
+ m_cass->set_default_state(CASSETTE_STOPPED | CASSETTE_SPEAKER_MUTED | CASSETTE_MOTOR_DISABLED);
+ m_cass->set_interface("spc1500_cass");
+
+ SOFTWARE_LIST(config, "cass_list").set_original("spc1500_cass");
/* internal ram */
RAM(config, RAM_TAG).set_default_size("64K");
-MACHINE_CONFIG_END
+ }
/* ROM definition */
ROM_START( spc1500 )
diff --git a/src/mame/drivers/spec128.cpp b/src/mame/drivers/spec128.cpp
index de427ad095c..b005bb8fae9 100644
--- a/src/mame/drivers/spec128.cpp
+++ b/src/mame/drivers/spec128.cpp
@@ -165,19 +165,28 @@ resulting mess can be seen in the F4 viewer display.
/****************************************************************************************************/
/* Spectrum 128 specific functions */
+READ8_MEMBER(spectrum_state::spectrum_128_opcode_fetch_r)
+{
+ /* this allows expansion devices to act upon opcode fetches from MEM addresses */
+ if (BIT(m_port_7ffd_data, 4))
+ m_exp->opcode_fetch(offset);
+
+ return m_maincpu->space(AS_PROGRAM).read_byte(offset);
+}
+
WRITE8_MEMBER( spectrum_state::spectrum_128_bank1_w )
{
- if (m_exp->romcs())
- m_exp->mreq_w(space, offset, data);
+ if (m_exp->romcs() && BIT(m_port_7ffd_data, 4))
+ m_exp->mreq_w(offset, data);
}
READ8_MEMBER( spectrum_state::spectrum_128_bank1_r )
{
uint8_t data;
- if (m_exp->romcs())
+ if (m_exp->romcs() && BIT(m_port_7ffd_data, 4))
{
- data = m_exp->mreq_r(space, offset);
+ data = m_exp->mreq_r(offset);
}
else
{
@@ -235,11 +244,12 @@ READ8_MEMBER( spectrum_state::spectrum_128_ula_r )
void spectrum_state::spectrum_128_io(address_map &map)
{
+ map(0x0000, 0xffff).rw(m_exp, FUNC(spectrum_expansion_slot_device::iorq_r), FUNC(spectrum_expansion_slot_device::iorq_w));
map(0x0000, 0x0000).rw(FUNC(spectrum_state::spectrum_port_fe_r), FUNC(spectrum_state::spectrum_port_fe_w)).select(0xfffe);
map(0x0001, 0x0001).w(FUNC(spectrum_state::spectrum_128_port_7ffd_w)).mirror(0x7ffc); // (A15 | A1) == 0, note: reading from this port does write to it by value from data bus
map(0x8000, 0x8000).w("ay8912", FUNC(ay8910_device::data_w)).mirror(0x3ffd);
map(0xc000, 0xc000).rw("ay8912", FUNC(ay8910_device::data_r), FUNC(ay8910_device::address_w)).mirror(0x3ffd);
- map(0x0001, 0x0001).r(FUNC(spectrum_state::spectrum_128_ula_r)).mirror(0xfffe);
+ map(0x0001, 0x0001).r(FUNC(spectrum_state::spectrum_128_ula_r)); // .mirror(0xfffe);
}
void spectrum_state::spectrum_128_mem(address_map &map)
@@ -250,10 +260,9 @@ void spectrum_state::spectrum_128_mem(address_map &map)
map(0xc000, 0xffff).bankrw("bank4");
}
-void spectrum_state::init_spec128()
+void spectrum_state::spectrum_128_fetch(address_map &map)
{
- // setup expansion slot
- m_exp->set_io_space(&m_maincpu->space(AS_IO));
+ map(0x0000, 0xffff).r(FUNC(spectrum_state::spectrum_128_opcode_fetch_r));
}
MACHINE_RESET_MEMBER(spectrum_state,spectrum_128)
@@ -296,36 +305,36 @@ static GFXDECODE_START( spec128 )
GFXDECODE_END
-MACHINE_CONFIG_START(spectrum_state::spectrum_128)
+void spectrum_state::spectrum_128(machine_config &config)
+{
spectrum(config);
- MCFG_DEVICE_REMOVE("maincpu")
-
- MCFG_DEVICE_ADD("maincpu", Z80, X1_128_SINCLAIR / 5)
- MCFG_DEVICE_PROGRAM_MAP(spectrum_128_mem)
- MCFG_DEVICE_IO_MAP(spectrum_128_io)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", spectrum_state, spec_interrupt)
- MCFG_QUANTUM_TIME(attotime::from_hz(60))
+ Z80(config.replace(), m_maincpu, X1_128_SINCLAIR / 5);
+ m_maincpu->set_addrmap(AS_PROGRAM, &spectrum_state::spectrum_128_mem);
+ m_maincpu->set_addrmap(AS_IO, &spectrum_state::spectrum_128_io);
+ m_maincpu->set_addrmap(AS_OPCODES, &spectrum_state::spectrum_128_fetch);
+ m_maincpu->set_vblank_int("screen", FUNC(spectrum_state::spec_interrupt));
+ config.m_minimum_quantum = attotime::from_hz(60);
MCFG_MACHINE_RESET_OVERRIDE(spectrum_state, spectrum_128 )
/* video hardware */
- MCFG_SCREEN_MODIFY("screen")
- MCFG_SCREEN_RAW_PARAMS(X1_128_SINCLAIR / 2.5f, 456, 0, 352, 311, 0, 296)
+ m_screen->set_raw(X1_128_SINCLAIR / 2.5f, 456, 0, 352, 311, 0, 296);
MCFG_VIDEO_START_OVERRIDE(spectrum_state, spectrum_128 )
- MCFG_GFXDECODE_MODIFY("gfxdecode", spec128)
+ subdevice<gfxdecode_device>("gfxdecode")->set_info(spec128);
/* sound hardware */
AY8912(config, "ay8912", X1_128_SINCLAIR / 10).add_route(ALL_OUTPUTS, "mono", 0.25);
/* expansion port */
- MCFG_DEVICE_MODIFY("exp")
- MCFG_DEVICE_SLOT_INTERFACE(spec128_expansion_devices, nullptr, false)
+ SPECTRUM_EXPANSION_SLOT(config.replace(), m_exp, spec128_expansion_devices, nullptr);
+ m_exp->irq_handler().set_inputline(m_maincpu, INPUT_LINE_IRQ0);
+ m_exp->nmi_handler().set_inputline(m_maincpu, INPUT_LINE_NMI);
/* internal ram */
m_ram->set_default_size("128K");
-MACHINE_CONFIG_END
+}
@@ -381,8 +390,8 @@ ROM_START(hc2000)
ROMX_LOAD("hc2000.v2", 0x14000,0x4000, CRC(65d90464) SHA1(5e2096e6460ff2120c8ada97579fdf82c1199c09), ROM_BIOS(1))
ROM_END
-// YEAR NAME PARENT COMPAT MACHINE CLASS STATE INIT COMPANY FULLNAME FLAGS
-COMP( 1986, spec128, 0, 0, spectrum_128, spec128, spectrum_state, init_spec128, "Sinclair Research Ltd", "ZX Spectrum 128", 0 )
-COMP( 1986, specpls2, spec128, 0, spectrum_128, spec_plus, spectrum_state, init_spec128, "Amstrad plc", "ZX Spectrum +2", 0 )
-COMP( 1991, hc128, spec128, 0, spectrum_128, spec_plus, spectrum_state, init_spec128, "ICE-Felix", "HC-128", 0 )
-COMP( 1992, hc2000, spec128, 0, spectrum_128, spec_plus, spectrum_state, init_spec128, "ICE-Felix", "HC-2000", MACHINE_NOT_WORKING )
+// YEAR NAME PARENT COMPAT MACHINE CLASS STATE INIT COMPANY FULLNAME FLAGS
+COMP( 1986, spec128, 0, 0, spectrum_128, spec128, spectrum_state, empty_init, "Sinclair Research Ltd", "ZX Spectrum 128", 0 )
+COMP( 1986, specpls2, spec128, 0, spectrum_128, spec_plus, spectrum_state, empty_init, "Amstrad plc", "ZX Spectrum +2", 0 )
+COMP( 1991, hc128, spec128, 0, spectrum_128, spec_plus, spectrum_state, empty_init, "ICE-Felix", "HC-128", 0 )
+COMP( 1992, hc2000, spec128, 0, spectrum_128, spec_plus, spectrum_state, empty_init, "ICE-Felix", "HC-2000", MACHINE_NOT_WORKING )
diff --git a/src/mame/drivers/special.cpp b/src/mame/drivers/special.cpp
index 60378882403..ac625fa7cb5 100644
--- a/src/mame/drivers/special.cpp
+++ b/src/mame/drivers/special.cpp
@@ -364,30 +364,32 @@ static void specimx_floppies(device_slot_interface &device)
}
/* Machine driver */
-MACHINE_CONFIG_START(special_state::special)
+void special_state::special(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", I8080, 2000000)
- MCFG_DEVICE_PROGRAM_MAP(specialist_mem)
+ I8080(config, m_maincpu, 2000000);
+ m_maincpu->set_addrmap(AS_PROGRAM, &special_state::specialist_mem);
+
MCFG_MACHINE_RESET_OVERRIDE(special_state, special )
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(50)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */
- MCFG_SCREEN_SIZE(384, 256)
- MCFG_SCREEN_VISIBLE_AREA(0, 384-1, 0, 256-1)
- MCFG_SCREEN_UPDATE_DRIVER(special_state, screen_update_special)
- MCFG_SCREEN_PALETTE(m_palette)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(50);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */
+ screen.set_size(384, 256);
+ screen.set_visarea(0, 384-1, 0, 256-1);
+ screen.set_screen_update(FUNC(special_state::screen_update_special));
+ screen.set_palette(m_palette);
PALETTE(config, m_palette, palette_device::MONOCHROME);
/* audio hardware */
SPEAKER(config, "speaker").front_center();
DAC_1BIT(config, "dac", 0).add_route(ALL_OUTPUTS, "speaker", 0.0625);
- MCFG_DEVICE_ADD("vref", VOLTAGE_REGULATOR, 0) MCFG_VOLTAGE_REGULATOR_OUTPUT(5.0)
- MCFG_SOUND_ROUTE(0, "dac", 1.0, DAC_VREF_POS_INPUT)
+ voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref", 0));
+ vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT);
- WAVE(config, "wave", "cassette").add_route(ALL_OUTPUTS, "speaker", 0.25);
+ WAVE(config, "wave", m_cassette).add_route(ALL_OUTPUTS, "speaker", 0.25);
/* Devices */
I8255(config, m_ppi);
@@ -398,25 +400,25 @@ MACHINE_CONFIG_START(special_state::special)
m_ppi->in_pc_callback().set(FUNC(special_state::specialist_8255_portc_r));
m_ppi->out_pc_callback().set(FUNC(special_state::specialist_8255_portc_w));
- MCFG_CASSETTE_ADD( "cassette" )
- MCFG_CASSETTE_FORMATS(rks_cassette_formats)
- MCFG_CASSETTE_DEFAULT_STATE(CASSETTE_STOPPED | CASSETTE_SPEAKER_ENABLED | CASSETTE_MOTOR_ENABLED)
- MCFG_CASSETTE_INTERFACE("special_cass")
+ CASSETTE(config, m_cassette);
+ m_cassette->set_formats(rks_cassette_formats);
+ m_cassette->set_default_state(CASSETTE_STOPPED | CASSETTE_SPEAKER_ENABLED | CASSETTE_MOTOR_ENABLED);
+ m_cassette->set_interface("special_cass");
- MCFG_SOFTWARE_LIST_ADD("cass_list","special_cass")
-MACHINE_CONFIG_END
+ SOFTWARE_LIST(config, "cass_list").set_original("special_cass");
+}
-MACHINE_CONFIG_START(special_state::specialp)
+void special_state::specialp(machine_config &config)
+{
special(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(specialp_mem)
+ m_maincpu->set_addrmap(AS_PROGRAM, &special_state::specialp_mem);
- MCFG_SCREEN_MODIFY("screen")
- MCFG_SCREEN_UPDATE_DRIVER(special_state, screen_update_specialp)
- MCFG_SCREEN_SIZE(512, 256)
- MCFG_SCREEN_VISIBLE_AREA(0, 512-1, 0, 256-1)
-MACHINE_CONFIG_END
+ screen_device &screen(*subdevice<screen_device>("screen"));
+ screen.set_screen_update(FUNC(special_state::screen_update_specialp));
+ screen.set_size(512, 256);
+ screen.set_visarea(0, 512-1, 0, 256-1);
+}
void special_state::specialm(machine_config &config)
{
@@ -429,17 +431,17 @@ void special_state::specialm(machine_config &config)
m_ppi->out_pc_callback().set(FUNC(special_state::specialist_8255_portc_w));
}
-MACHINE_CONFIG_START(special_state::specimx)
+void special_state::specimx(machine_config &config)
+{
special(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(specimx_mem)
+ m_maincpu->set_addrmap(AS_PROGRAM, &special_state::specimx_mem);
MCFG_MACHINE_START_OVERRIDE (special_state, specimx )
MCFG_MACHINE_RESET_OVERRIDE (special_state, specimx )
/* video hardware */
- MCFG_SCREEN_MODIFY("screen")
- MCFG_SCREEN_UPDATE_DRIVER(special_state, screen_update_specimx)
+ subdevice<screen_device>("screen")->set_screen_update(FUNC(special_state::screen_update_specimx));
+
MCFG_VIDEO_START_OVERRIDE(special_state,specimx)
m_palette->set_init(FUNC(special_state::specimx_palette));
@@ -466,45 +468,47 @@ MACHINE_CONFIG_START(special_state::specimx)
FD1793(config, m_fdc, 8_MHz_XTAL / 8);
m_fdc->drq_wr_callback().set(FUNC(special_state::fdc_drq));
- MCFG_FLOPPY_DRIVE_ADD("fd0", specimx_floppies, "525qd", special_state::specimx_floppy_formats)
- MCFG_FLOPPY_DRIVE_ADD("fd1", specimx_floppies, "525qd", special_state::specimx_floppy_formats)
- MCFG_SOFTWARE_LIST_ADD("flop_list","special_flop")
+ FLOPPY_CONNECTOR(config, "fd0", specimx_floppies, "525qd", special_state::specimx_floppy_formats);
+ FLOPPY_CONNECTOR(config, "fd1", specimx_floppies, "525qd", special_state::specimx_floppy_formats);
+ SOFTWARE_LIST(config, "flop_list").set_original("special_flop");
/* internal ram */
RAM(config, m_ram).set_default_size("128K").set_default_value(0x00);
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(special_state::erik)
+void special_state::erik(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, 4000000)
- MCFG_DEVICE_PROGRAM_MAP(erik_mem)
- MCFG_DEVICE_IO_MAP(erik_io_map)
+ Z80(config, m_maincpu, 4000000);
+ m_maincpu->set_addrmap(AS_PROGRAM, &special_state::erik_mem);
+ m_maincpu->set_addrmap(AS_IO, &special_state::erik_io_map);
+
MCFG_MACHINE_RESET_OVERRIDE(special_state, erik )
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(50)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */
- MCFG_SCREEN_SIZE(384, 256)
- MCFG_SCREEN_VISIBLE_AREA(0, 384-1, 0, 256-1)
- MCFG_SCREEN_UPDATE_DRIVER(special_state, screen_update_erik)
- MCFG_SCREEN_PALETTE(m_palette)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(50);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */
+ screen.set_size(384, 256);
+ screen.set_visarea(0, 384-1, 0, 256-1);
+ screen.set_screen_update(FUNC(special_state::screen_update_erik));
+ screen.set_palette(m_palette);
PALETTE(config, m_palette, FUNC(special_state::erik_palette), 8);
/* audio hardware */
SPEAKER(config, "speaker").front_center();
DAC_1BIT(config, "dac", 0).add_route(ALL_OUTPUTS, "speaker", 0.0625);
- MCFG_DEVICE_ADD("vref", VOLTAGE_REGULATOR, 0) MCFG_VOLTAGE_REGULATOR_OUTPUT(5.0)
- MCFG_SOUND_ROUTE(0, "dac", 1.0, DAC_VREF_POS_INPUT)
+ voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref", 0));
+ vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT);
- WAVE(config, "wave", "cassette").add_route(ALL_OUTPUTS, "speaker", 0.25);
+ WAVE(config, "wave", m_cassette).add_route(ALL_OUTPUTS, "speaker", 0.25);
/* Devices */
- MCFG_CASSETTE_ADD( "cassette" )
- MCFG_CASSETTE_FORMATS(rks_cassette_formats)
- MCFG_CASSETTE_DEFAULT_STATE(CASSETTE_STOPPED | CASSETTE_SPEAKER_ENABLED | CASSETTE_MOTOR_ENABLED)
- MCFG_CASSETTE_INTERFACE("special_cass")
+ CASSETTE(config, m_cassette);
+ m_cassette->set_formats(rks_cassette_formats);
+ m_cassette->set_default_state(CASSETTE_STOPPED | CASSETTE_SPEAKER_ENABLED | CASSETTE_MOTOR_ENABLED);
+ m_cassette->set_interface("special_cass");
I8255(config, m_ppi);
m_ppi->in_pa_callback().set(FUNC(special_state::specialist_8255_porta_r));
@@ -516,12 +520,12 @@ MACHINE_CONFIG_START(special_state::erik)
FD1793(config, m_fdc, 8_MHz_XTAL / 8);
m_fdc->drq_wr_callback().set(FUNC(special_state::fdc_drq));
- MCFG_FLOPPY_DRIVE_ADD("fd0", specimx_floppies, "525qd", special_state::specimx_floppy_formats)
- MCFG_FLOPPY_DRIVE_ADD("fd1", specimx_floppies, "525qd", special_state::specimx_floppy_formats)
+ FLOPPY_CONNECTOR(config, "fd0", specimx_floppies, "525qd", special_state::specimx_floppy_formats);
+ FLOPPY_CONNECTOR(config, "fd1", specimx_floppies, "525qd", special_state::specimx_floppy_formats);
/* internal ram */
RAM(config, m_ram).set_default_size("192K").set_default_value(0x00);
-MACHINE_CONFIG_END
+}
/* ROM definition */
ROM_START( special )
diff --git a/src/mame/drivers/specpls3.cpp b/src/mame/drivers/specpls3.cpp
index deee57e2cec..3c3e2855565 100644
--- a/src/mame/drivers/specpls3.cpp
+++ b/src/mame/drivers/specpls3.cpp
@@ -175,7 +175,7 @@ static const int spectrum_plus3_memory_selections[]=
WRITE8_MEMBER( spectrum_state::spectrum_plus3_port_3ffd_w )
{
if (m_floppy==1)
- m_upd765->fifo_w(space, 0, data, 0xff);
+ m_upd765->fifo_w(data);
}
READ8_MEMBER( spectrum_state::spectrum_plus3_port_3ffd_r )
@@ -183,7 +183,7 @@ READ8_MEMBER( spectrum_state::spectrum_plus3_port_3ffd_r )
if (m_floppy==0)
return 0xff;
else
- return m_upd765->fifo_r(space, 0, 0xff);
+ return m_upd765->fifo_r();
}
@@ -192,71 +192,53 @@ READ8_MEMBER( spectrum_state::spectrum_plus3_port_2ffd_r )
if (m_floppy==0)
return 0xff;
else
- return m_upd765->msr_r(space, 0, 0xff);
+ return m_upd765->msr_r();
}
void spectrum_state::spectrum_plus3_update_memory()
{
- address_space &space = m_maincpu->space(AS_PROGRAM);
- uint8_t *messram = m_ram->pointer();
-
if (m_port_7ffd_data & 8)
{
logerror("+3 SCREEN 1: BLOCK 7\n");
- m_screen_location = messram + (7 << 14);
+ m_screen_location = m_ram->pointer() + (7 << 14);
}
else
{
logerror("+3 SCREEN 0: BLOCK 5\n");
- m_screen_location = messram + (5 << 14);
+ m_screen_location = m_ram->pointer() + (5 << 14);
}
if ((m_port_1ffd_data & 0x01) == 0)
{
/* select ram at 0x0c000-0x0ffff */
int ram_page = m_port_7ffd_data & 0x07;
- unsigned char *ram_data = messram + (ram_page<<14);
+ unsigned char *ram_data = m_ram->pointer() + (ram_page<<14);
membank("bank4")->set_base(ram_data);
logerror("RAM at 0xc000: %02x\n", ram_page);
/* Reset memory between 0x4000 - 0xbfff in case extended paging was being used */
/* Bank 5 in 0x4000 - 0x7fff */
- membank("bank2")->set_base(messram + (5 << 14));
+ membank("bank2")->set_base(m_ram->pointer() + (5 << 14));
/* Bank 2 in 0x8000 - 0xbfff */
- membank("bank3")->set_base(messram + (2 << 14));
-
- /* ROM switching */
- int ROMSelection = BIT(m_port_7ffd_data, 4) | ((m_port_1ffd_data >> 1) & 0x02);
-
- /* rom 0 is editor, rom 1 is syntax, rom 2 is DOS, rom 3 is 48 BASIC */
- unsigned char *ChosenROM = memregion("maincpu")->base() + 0x010000 + (ROMSelection << 14);
-
- membank("bank1")->set_base(ChosenROM);
- space.unmap_write(0x0000, 0x3fff);
-
- logerror("rom switch: %02x\n", ROMSelection);
+ membank("bank3")->set_base(m_ram->pointer() + (2 << 14));
}
else
{
/* Extended memory paging */
int MemorySelection = (m_port_1ffd_data >> 1) & 0x03;
const int *memory_selection = &spectrum_plus3_memory_selections[(MemorySelection << 2)];
- unsigned char *ram_data = messram + (memory_selection[0] << 14);
+ unsigned char *ram_data = m_ram->pointer() + (memory_selection[0] << 14);
- membank("bank1")->set_base(ram_data);
- /* allow writes to 0x0000-0x03fff */
- space.install_write_bank(0x0000, 0x3fff, "bank1");
-
- ram_data = messram + (memory_selection[1] << 14);
+ ram_data = m_ram->pointer() + (memory_selection[1] << 14);
membank("bank2")->set_base(ram_data);
- ram_data = messram + (memory_selection[2] << 14);
+ ram_data = m_ram->pointer() + (memory_selection[2] << 14);
membank("bank3")->set_base(ram_data);
- ram_data = messram + (memory_selection[3] << 14);
+ ram_data = m_ram->pointer() + (memory_selection[3] << 14);
membank("bank4")->set_base(ram_data);
logerror("extended memory paging: %02x\n", MemorySelection);
@@ -264,6 +246,49 @@ void spectrum_state::spectrum_plus3_update_memory()
}
+WRITE8_MEMBER(spectrum_state::spectrum_plus3_bank1_w)
+{
+ if (m_exp->romcs())
+ {
+ m_exp->mreq_w(offset, data);
+ }
+ else if ((m_port_1ffd_data & 0x01) != 0)
+ {
+ /* Extended memory paging */
+ int MemorySelection = (m_port_1ffd_data >> 1) & 0x03;
+ const int *memory_selection = &spectrum_plus3_memory_selections[(MemorySelection << 2)];
+ m_ram->pointer()[(memory_selection[0] << 14) + offset] = data;
+ }
+}
+
+READ8_MEMBER(spectrum_state::spectrum_plus3_bank1_r)
+{
+ uint8_t data;
+
+ if (m_exp->romcs())
+ {
+ data = m_exp->mreq_r(offset);
+ }
+ else
+ {
+ if ((m_port_1ffd_data & 0x01) == 0)
+ {
+ /* ROM switching */
+ int ROMSelection = BIT(m_port_7ffd_data, 4) | ((m_port_1ffd_data >> 1) & 0x02);
+
+ /* rom 0 is editor, rom 1 is syntax, rom 2 is DOS, rom 3 is 48 BASIC */
+ data = memregion("maincpu")->base()[0x010000 + (ROMSelection << 14) + offset];
+ }
+ else
+ {
+ /* Extended memory paging */
+ int MemorySelection = (m_port_1ffd_data >> 1) & 0x03;
+ const int *memory_selection = &spectrum_plus3_memory_selections[(MemorySelection << 2)];
+ data = m_ram->pointer()[(memory_selection[0] << 14) + offset];
+ }
+ }
+ return data;
+}
WRITE8_MEMBER( spectrum_state::spectrum_plus3_port_7ffd_w )
{
@@ -307,7 +332,7 @@ WRITE8_MEMBER( spectrum_state::spectrum_plus3_port_1ffd_w )
The function decodes the ports appropriately */
void spectrum_state::spectrum_plus3_io(address_map &map)
{
- map.unmap_value_high();
+ map(0x0000, 0xffff).rw(m_exp, FUNC(spectrum_expansion_slot_device::iorq_r), FUNC(spectrum_expansion_slot_device::iorq_w));
map(0x0000, 0x0000).rw(FUNC(spectrum_state::spectrum_port_fe_r), FUNC(spectrum_state::spectrum_port_fe_w)).select(0xfffe);
map(0x4000, 0x4000).w(FUNC(spectrum_state::spectrum_plus3_port_7ffd_w)).mirror(0x3ffd);
map(0x8000, 0x8000).w("ay8912", FUNC(ay8910_device::data_w)).mirror(0x3ffd);
@@ -319,7 +344,7 @@ void spectrum_state::spectrum_plus3_io(address_map &map)
void spectrum_state::spectrum_plus3_mem(address_map &map)
{
- map(0x0000, 0x3fff).bankr("bank1");
+ map(0x0000, 0x3fff).rw(FUNC(spectrum_state::spectrum_plus3_bank1_r), FUNC(spectrum_state::spectrum_plus3_bank1_w)); //.bankr("bank1");
map(0x4000, 0x7fff).bankrw("bank2");
map(0x8000, 0xbfff).bankrw("bank3");
map(0xc000, 0xffff).bankrw("bank4");
@@ -341,17 +366,11 @@ MACHINE_RESET_MEMBER(spectrum_state,spectrum_plus3)
void spectrum_state::init_plus3()
{
m_floppy = 1;
-
- // setup expansion slot
- m_exp->set_io_space(&m_maincpu->space(AS_IO));
}
void spectrum_state::init_plus2()
{
m_floppy = 0;
-
- // setup expansion slot
- m_exp->set_io_space(&m_maincpu->space(AS_IO));
}
static void specpls3_floppies(device_slot_interface &device)
@@ -378,26 +397,29 @@ static GFXDECODE_START( specpls3 )
GFXDECODE_END
-MACHINE_CONFIG_START(spectrum_state::spectrum_plus3)
+void spectrum_state::spectrum_plus3(machine_config &config)
+{
spectrum_128(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(spectrum_plus3_mem)
- MCFG_DEVICE_IO_MAP(spectrum_plus3_io)
- MCFG_SCREEN_MODIFY("screen")
- MCFG_SCREEN_REFRESH_RATE(50.01)
- MCFG_GFXDECODE_MODIFY("gfxdecode", specpls3)
+
+ m_maincpu->set_addrmap(AS_PROGRAM, &spectrum_state::spectrum_plus3_mem);
+ m_maincpu->set_addrmap(AS_IO, &spectrum_state::spectrum_plus3_io);
+
+ m_screen->set_refresh_hz(50.01);
+
+ subdevice<gfxdecode_device>("gfxdecode")->set_info(specpls3);
MCFG_MACHINE_RESET_OVERRIDE(spectrum_state, spectrum_plus3 )
UPD765A(config, m_upd765, 4'000'000, true, true);
- MCFG_FLOPPY_DRIVE_ADD("upd765:0", specpls3_floppies, "3ssdd", floppy_image_device::default_floppy_formats)
- MCFG_FLOPPY_DRIVE_ADD("upd765:1", specpls3_floppies, "3ssdd", floppy_image_device::default_floppy_formats)
+ FLOPPY_CONNECTOR(config, "upd765:0", specpls3_floppies, "3ssdd", floppy_image_device::default_floppy_formats);
+ FLOPPY_CONNECTOR(config, "upd765:1", specpls3_floppies, "3ssdd", floppy_image_device::default_floppy_formats);
- MCFG_DEVICE_MODIFY("exp")
- MCFG_DEVICE_SLOT_INTERFACE(specpls3_expansion_devices, nullptr, false)
+ SPECTRUM_EXPANSION_SLOT(config.replace(), m_exp, specpls3_expansion_devices, nullptr);
+ m_exp->irq_handler().set_inputline(m_maincpu, INPUT_LINE_IRQ0);
+ m_exp->nmi_handler().set_inputline(m_maincpu, INPUT_LINE_NMI);
- MCFG_SOFTWARE_LIST_ADD("flop_list", "specpls3_flop")
-MACHINE_CONFIG_END
+ SOFTWARE_LIST(config, "flop_list").set_original("specpls3_flop");
+}
/***************************************************************************
diff --git a/src/mame/drivers/spectra.cpp b/src/mame/drivers/spectra.cpp
index fb5d20cb989..b903183c366 100644
--- a/src/mame/drivers/spectra.cpp
+++ b/src/mame/drivers/spectra.cpp
@@ -269,7 +269,7 @@ void spectra_state::spectra(machine_config &config)
m_snsnd->set_envelope_params(0, 0);
m_snsnd->set_enable(1);
m_snsnd->add_route(ALL_OUTPUTS, "mono", 0.30);
-MACHINE_CONFIG_END
+}
/*--------------------------------
/ Spectra IV
diff --git a/src/mame/drivers/spectrum.cpp b/src/mame/drivers/spectrum.cpp
index 445b4ae16f5..26d8263160f 100644
--- a/src/mame/drivers/spectrum.cpp
+++ b/src/mame/drivers/spectrum.cpp
@@ -292,19 +292,27 @@ SamRam
/****************************************************************************************************/
/* Spectrum 48k functions */
+READ8_MEMBER(spectrum_state::opcode_fetch_r)
+{
+ /* this allows expansion devices to act upon opcode fetches from MEM addresses */
+ m_exp->opcode_fetch(offset);
+
+ return m_maincpu->space(AS_PROGRAM).read_byte(offset);
+}
+
WRITE8_MEMBER(spectrum_state::spectrum_rom_w)
{
if (m_exp->romcs())
- m_exp->mreq_w(space, offset, data);
+ m_exp->mreq_w(offset, data);
}
READ8_MEMBER(spectrum_state::spectrum_rom_r)
{
uint8_t data;
- data = m_exp->mreq_r(space, offset);
-
- if (!m_exp->romcs())
+ if (m_exp->romcs())
+ data = m_exp->mreq_r(offset);
+ else
data = memregion("maincpu")->base()[offset];
return data;
@@ -360,6 +368,10 @@ READ8_MEMBER(spectrum_state::spectrum_port_fe_r)
int joy1 = m_io_joy1.read_safe(0x1f) & 0x1f;
int joy2 = m_io_joy2.read_safe(0x1f) & 0x1f;
+ /* expansion port */
+ if (m_exp)
+ data = m_exp->iorq_r(offset);
+
/* Caps - V */
if ((lines & 1) == 0)
{
@@ -410,13 +422,9 @@ READ8_MEMBER(spectrum_state::spectrum_port_fe_r)
data &= ~0x40;
}
- /* expansion port */
- if (m_exp)
- data &= m_exp->port_fe_r(space, offset);
-
/* Issue 2 Spectrums default to having bits 5, 6 & 7 set.
Issue 3 Spectrums default to having bits 5 & 7 set and bit 6 reset. */
- if (m_io_config->read() & 0x80)
+ if ((m_io_config->read() & 0x80) == 0)
data ^= (0x40);
return data;
@@ -435,16 +443,22 @@ void spectrum_state::spectrum_mem(address_map &map)
{
map(0x0000, 0x3fff).rw(FUNC(spectrum_state::spectrum_rom_r), FUNC(spectrum_state::spectrum_rom_w));
map(0x4000, 0x5aff).ram().share("video_ram");
- // AM_RANGE(0x5b00, 0x7fff) AM_RAM
- // AM_RANGE(0x8000, 0xffff) AM_RAM
+ //map(0x5b00, 0x7fff).ram();
+ //map(0x8000, 0xffff).ram();
+}
+
+void spectrum_state::spectrum_fetch(address_map &map)
+{
+ map(0x0000, 0xffff).r(FUNC(spectrum_state::opcode_fetch_r));
}
/* ports are not decoded full.
The function decodes the ports appropriately */
void spectrum_state::spectrum_io(address_map &map)
{
+ map(0x0000, 0xffff).rw(m_exp, FUNC(spectrum_expansion_slot_device::iorq_r), FUNC(spectrum_expansion_slot_device::iorq_w));
map(0x00, 0x00).rw(FUNC(spectrum_state::spectrum_port_fe_r), FUNC(spectrum_state::spectrum_port_fe_w)).select(0xfffe);
- map(0x01, 0x01).r(FUNC(spectrum_state::spectrum_port_ula_r)).mirror(0xfffe);
+ map(0x01, 0x01).r(FUNC(spectrum_state::spectrum_port_ula_r)); // .mirror(0xfffe);
}
/* Input ports */
@@ -617,9 +631,6 @@ void spectrum_state::init_spectrum()
case 16*1024:
space.install_ram(0x5b00, 0x7fff, nullptr);
}
-
- // setup expansion slot
- m_exp->set_io_space(&m_maincpu->space(AS_IO));
}
MACHINE_RESET_MEMBER(spectrum_state,spectrum)
@@ -668,12 +679,13 @@ INTERRUPT_GEN_MEMBER(spectrum_state::spec_interrupt)
m_irq_off_timer->adjust(m_maincpu->clocks_to_attotime(32));
}
-MACHINE_CONFIG_START(spectrum_state::spectrum_common)
-
+void spectrum_state::spectrum_common(machine_config &config)
+{
/* basic machine hardware */
Z80(config, m_maincpu, X1 / 4); /* This is verified only for the ZX Spectrum. Other clones are reported to have different clocks */
m_maincpu->set_addrmap(AS_PROGRAM, &spectrum_state::spectrum_mem);
m_maincpu->set_addrmap(AS_IO, &spectrum_state::spectrum_io);
+ m_maincpu->set_addrmap(AS_OPCODES, &spectrum_state::spectrum_fetch);
m_maincpu->set_vblank_int("screen", FUNC(spectrum_state::spec_interrupt));
config.m_minimum_quantum = attotime::from_hz(60);
@@ -703,10 +715,10 @@ MACHINE_CONFIG_START(spectrum_state::spectrum_common)
m_exp->nmi_handler().set_inputline(m_maincpu, INPUT_LINE_NMI);
/* devices */
- snapshot_image_device &snapshot(SNAPSHOT(config, "snapshot", 0));
- snapshot.set_handler(snapquick_load_delegate(&SNAPSHOT_LOAD_NAME(spectrum_state, spectrum), this), "ach,frz,plusd,prg,sem,sit,sna,snp,snx,sp,z80,zx", 0);
- quickload_image_device &quickload(QUICKLOAD(config, "quickload", 0));
- quickload.set_handler(snapquick_load_delegate(&QUICKLOAD_LOAD_NAME(spectrum_state, spectrum), this), "raw,scr", 2); // The delay prevents the screen from being cleared by the RAM test at boot
+ snapshot_image_device &snapshot(SNAPSHOT(config, "snapshot"));
+ snapshot.set_handler(snapquick_load_delegate(&SNAPSHOT_LOAD_NAME(spectrum_state, spectrum), this), "ach,frz,plusd,prg,sem,sit,sna,snp,snx,sp,z80,zx");
+ quickload_image_device &quickload(QUICKLOAD(config, "quickload"));
+ quickload.set_handler(snapquick_load_delegate(&QUICKLOAD_LOAD_NAME(spectrum_state, spectrum), this), "raw,scr", attotime::from_seconds(2)); // The delay prevents the screen from being cleared by the RAM test at boot
CASSETTE(config, m_cassette);
m_cassette->set_formats(tzx_cassette_formats);
@@ -714,7 +726,7 @@ MACHINE_CONFIG_START(spectrum_state::spectrum_common)
m_cassette->set_interface("spectrum_cass");
SOFTWARE_LIST(config, "cass_list").set_original("spectrum_cass");
-MACHINE_CONFIG_END
+}
void spectrum_state::spectrum(machine_config &config)
{
diff --git a/src/mame/drivers/speedatk.cpp b/src/mame/drivers/speedatk.cpp
index 989c5471d8d..893988686af 100644
--- a/src/mame/drivers/speedatk.cpp
+++ b/src/mame/drivers/speedatk.cpp
@@ -306,23 +306,23 @@ WRITE8_MEMBER(speedatk_state::output_w)
logerror("%02x\n",data);
}
-MACHINE_CONFIG_START(speedatk_state::speedatk)
-
- MCFG_DEVICE_ADD("maincpu", Z80,MASTER_CLOCK/2) //divider is unknown
- MCFG_DEVICE_PROGRAM_MAP(speedatk_mem)
- MCFG_DEVICE_IO_MAP(speedatk_io)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", speedatk_state, irq0_line_hold)
+void speedatk_state::speedatk(machine_config &config)
+{
+ Z80(config, m_maincpu, MASTER_CLOCK/2); //divider is unknown
+ m_maincpu->set_addrmap(AS_PROGRAM, &speedatk_state::speedatk_mem);
+ m_maincpu->set_addrmap(AS_IO, &speedatk_state::speedatk_io);
+ m_maincpu->set_vblank_int("screen", FUNC(speedatk_state::irq0_line_hold));
WATCHDOG_TIMER(config, "watchdog").set_vblank_count("screen", 8); // timing is unknown
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(320, 256)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 0*8, 32*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(speedatk_state, screen_update)
- MCFG_SCREEN_PALETTE(m_palette)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(320, 256);
+ screen.set_visarea(0*8, 32*8-1, 0*8, 32*8-1);
+ screen.set_screen_update(FUNC(speedatk_state::screen_update));
+ screen.set_palette(m_palette);
H46505(config, m_crtc, MASTER_CLOCK/16); /* hand tuned to get ~60 fps */
m_crtc->set_screen("screen");
@@ -339,7 +339,7 @@ MACHINE_CONFIG_START(speedatk_state::speedatk)
aysnd.port_b_read_callback().set_ioport("DSW");
aysnd.port_a_write_callback().set(FUNC(speedatk_state::output_w));
aysnd.add_route(ALL_OUTPUTS, "mono", 0.5);
-MACHINE_CONFIG_END
+}
ROM_START( speedatk )
ROM_REGION( 0x10000, "maincpu", 0 )
diff --git a/src/mame/drivers/speedbal.cpp b/src/mame/drivers/speedbal.cpp
index 6f849385d04..a2937c9a869 100644
--- a/src/mame/drivers/speedbal.cpp
+++ b/src/mame/drivers/speedbal.cpp
@@ -263,27 +263,27 @@ GFXDECODE_END
-MACHINE_CONFIG_START(speedbal_state::speedbal)
-
+void speedbal_state::speedbal(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, XTAL(4'000'000)) // 4 MHz
- MCFG_DEVICE_PROGRAM_MAP(main_cpu_map)
- MCFG_DEVICE_IO_MAP(main_cpu_io_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", speedbal_state, irq0_line_hold)
+ Z80(config, m_maincpu, XTAL(4'000'000)); // 4 MHz
+ m_maincpu->set_addrmap(AS_PROGRAM, &speedbal_state::main_cpu_map);
+ m_maincpu->set_addrmap(AS_IO, &speedbal_state::main_cpu_io_map);
+ m_maincpu->set_vblank_int("screen", FUNC(speedbal_state::irq0_line_hold));
- MCFG_DEVICE_ADD("audiocpu", Z80, XTAL(4'000'000)) // 4 MHz
- MCFG_DEVICE_PROGRAM_MAP(sound_cpu_map)
- MCFG_DEVICE_IO_MAP(sound_cpu_io_map)
- MCFG_DEVICE_PERIODIC_INT_DRIVER(speedbal_state, irq0_line_hold, 1000/2) // approximate?
+ z80_device &audiocpu(Z80(config, "audiocpu", XTAL(4'000'000))); // 4 MHz
+ audiocpu.set_addrmap(AS_PROGRAM, &speedbal_state::sound_cpu_map);
+ audiocpu.set_addrmap(AS_IO, &speedbal_state::sound_cpu_io_map);
+ audiocpu.set_periodic_int(FUNC(speedbal_state::irq0_line_hold), attotime::from_hz(1000/2)); // approximate?
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(56.4) // measured
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */)
- MCFG_SCREEN_SIZE(32*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(speedbal_state, screen_update)
- MCFG_SCREEN_PALETTE(m_palette)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(56.4); // measured
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500) /* not accurate */);
+ screen.set_size(32*8, 32*8);
+ screen.set_visarea(0*8, 32*8-1, 2*8, 30*8-1);
+ screen.set_screen_update(FUNC(speedbal_state::screen_update));
+ screen.set_palette(m_palette);
GFXDECODE(config, m_gfxdecode, m_palette, gfx_speedbal);
PALETTE(config, m_palette).set_format(palette_device::RGBx_444, 768).set_endianness(ENDIANNESS_BIG);
@@ -291,9 +291,8 @@ MACHINE_CONFIG_START(speedbal_state::speedbal)
/* sound hardware */
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("ymsnd", YM3812, XTAL(4'000'000)) // 4 MHz(?)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
-MACHINE_CONFIG_END
+ YM3812(config, "ymsnd", XTAL(4'000'000)).add_route(ALL_OUTPUTS, "mono", 1.0); // 4 MHz(?)
+}
void speedbal_state::init_speedbal()
diff --git a/src/mame/drivers/speedspn.cpp b/src/mame/drivers/speedspn.cpp
index 3dd654b07e2..9b77b916489 100644
--- a/src/mame/drivers/speedspn.cpp
+++ b/src/mame/drivers/speedspn.cpp
@@ -281,25 +281,25 @@ void speedspn_state::machine_start()
}
-MACHINE_CONFIG_START(speedspn_state::speedspn)
-
+void speedspn_state::speedspn(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu",Z80,6000000) /* 6 MHz */
- MCFG_DEVICE_PROGRAM_MAP(program_map)
- MCFG_DEVICE_IO_MAP(io_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", speedspn_state, irq0_line_hold)
+ Z80(config, m_maincpu, 6000000); /* 6 MHz */
+ m_maincpu->set_addrmap(AS_PROGRAM, &speedspn_state::program_map);
+ m_maincpu->set_addrmap(AS_IO, &speedspn_state::io_map);
+ m_maincpu->set_vblank_int("screen", FUNC(speedspn_state::irq0_line_hold));
- MCFG_DEVICE_ADD("audiocpu", Z80,6000000) /* 6 MHz */
- MCFG_DEVICE_PROGRAM_MAP(sound_map)
+ Z80(config, m_audiocpu, 6000000); /* 6 MHz */
+ m_audiocpu->set_addrmap(AS_PROGRAM, &speedspn_state::sound_map);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(64*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(8*8, 56*8-1, 1*8, 31*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(speedspn_state, screen_update)
- MCFG_SCREEN_PALETTE(m_palette)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(64*8, 32*8);
+ screen.set_visarea(8*8, 56*8-1, 1*8, 31*8-1);
+ screen.set_screen_update(FUNC(speedspn_state::screen_update));
+ screen.set_palette(m_palette);
GFXDECODE(config, m_gfxdecode, m_palette, gfx_speedspn);
PALETTE(config, m_palette).set_format(palette_device::xRGB_444, 0x400);
@@ -309,10 +309,10 @@ MACHINE_CONFIG_START(speedspn_state::speedspn)
GENERIC_LATCH_8(config, m_soundlatch);
- MCFG_DEVICE_ADD("oki", OKIM6295, 1122000, okim6295_device::PIN7_HIGH) // clock frequency & pin 7 not verified
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
- MCFG_DEVICE_ADDRESS_MAP(0, oki_map)
-MACHINE_CONFIG_END
+ OKIM6295(config, m_oki, 1122000, okim6295_device::PIN7_HIGH); // clock frequency & pin 7 not verified
+ m_oki->add_route(ALL_OUTPUTS, "mono", 1.0);
+ m_oki->set_addrmap(0, &speedspn_state::oki_map);
+}
/*** ROM LOADING *************************************************************/
diff --git a/src/mame/drivers/speglsht.cpp b/src/mame/drivers/speglsht.cpp
index 6fdcc06bde5..3d4a28d9c44 100644
--- a/src/mame/drivers/speglsht.cpp
+++ b/src/mame/drivers/speglsht.cpp
@@ -413,35 +413,35 @@ uint32_t speglsht_state::screen_update_speglsht(screen_device &screen, bitmap_rg
return 0;
}
-MACHINE_CONFIG_START(speglsht_state::speglsht)
+void speglsht_state::speglsht(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu",ST0016_CPU, 8000000) /* 8 MHz ? */
- MCFG_DEVICE_PROGRAM_MAP(st0016_mem)
- MCFG_DEVICE_IO_MAP(st0016_io)
-
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", speglsht_state, irq0_line_hold)
+ ST0016_CPU(config, m_maincpu, 8000000); /* 8 MHz ? */
+ m_maincpu->set_addrmap(AS_PROGRAM, &speglsht_state::st0016_mem);
+ m_maincpu->set_addrmap(AS_IO, &speglsht_state::st0016_io);
+ m_maincpu->set_vblank_int("screen", FUNC(speglsht_state::irq0_line_hold));
R3051(config, m_subcpu, 25000000);
m_subcpu->set_endianness(ENDIANNESS_LITTLE);
m_subcpu->set_addrmap(AS_PROGRAM, &speglsht_state::speglsht_mem);
m_subcpu->set_vblank_int("screen", FUNC(speglsht_state::irq4_line_assert));
- MCFG_QUANTUM_TIME(attotime::from_hz(6000))
+ config.m_minimum_quantum = attotime::from_hz(6000);
MCFG_MACHINE_RESET_OVERRIDE(speglsht_state,speglsht)
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(512, 512)
- MCFG_SCREEN_VISIBLE_AREA(0, 319, 8, 239-8)
- MCFG_SCREEN_UPDATE_DRIVER(speglsht_state, screen_update_speglsht)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(512, 512);
+ screen.set_visarea(0, 319, 8, 239-8);
+ screen.set_screen_update(FUNC(speglsht_state::screen_update_speglsht));
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_speglsht)
- MCFG_PALETTE_ADD("palette", 16*16*4+1)
+ GFXDECODE(config, "gfxdecode", m_palette, gfx_speglsht);
+ PALETTE(config, m_palette).set_entries(16*16*4+1);
MCFG_VIDEO_START_OVERRIDE(speglsht_state,speglsht)
-MACHINE_CONFIG_END
+}
ROM_START( speglsht )
ROM_REGION( 0x400000, "maincpu", 0 )
diff --git a/src/mame/drivers/spg110.cpp b/src/mame/drivers/spg110.cpp
new file mode 100644
index 00000000000..a10d01132fe
--- /dev/null
+++ b/src/mame/drivers/spg110.cpp
@@ -0,0 +1,399 @@
+// license:BSD-3-Clause
+// copyright-holders:David Haywood
+/******************************************************************************
+
+ Short Description:
+
+ die markings show
+
+ "SunPlus PA7801" ( known as Sunplus SPG110? )
+ Classic Arcade Pinball
+ EA Sports (NHL95 + Madden 95)
+ Spiderman 5-in-1 (original release)
+
+*******************************************************************************/
+
+#include "emu.h"
+
+#include "cpu/unsp/unsp.h"
+#include "machine/spg110.h"
+#include "screen.h"
+#include "speaker.h"
+
+class spg110_game_state : public driver_device
+{
+public:
+ spg110_game_state(const machine_config &mconfig, device_type type, const char *tag)
+ : driver_device(mconfig, type, tag)
+ , m_maincpu(*this, "maincpu")
+ , m_screen(*this, "screen")
+ , m_spg(*this, "spg")
+ { }
+
+ void spg110_base(machine_config &config);
+
+protected:
+
+ required_device<unsp_device> m_maincpu;
+ required_device<screen_device> m_screen;
+ required_device<spg110_device> m_spg;
+
+ virtual void mem_map(address_map &map);
+};
+
+/*************************
+* Machine Hardware *
+*************************/
+
+void spg110_game_state::mem_map(address_map &map)
+{
+ map(0x004000, 0x0fffff).rom().region("maincpu", 0x8000);
+ map(0x000000, 0x003fff).m(m_spg, FUNC(spg110_device::map));
+}
+
+static INPUT_PORTS_START( jak_capb )
+ PORT_START("PA")
+ PORT_DIPNAME( 0x0001, 0x0000, "PA" )
+ PORT_DIPSETTING( 0x0000, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0001, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0002, 0x0000, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0002, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0004, 0x0000, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0004, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0008, 0x0000, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0008, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0010, 0x0000, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0010, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0020, 0x0000, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0020, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0040, 0x0000, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0040, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0080, 0x0000, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0080, DEF_STR( On ) )
+ PORT_BIT( 0x0100, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("Menu")
+ PORT_BIT( 0x0200, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_NAME("Left Flipper")
+ PORT_BIT( 0x0400, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("Nudge")// nudge (motion control)
+ PORT_BIT( 0x0800, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_NAME("Right Flipper")
+ PORT_DIPNAME( 0x1000, 0x0000, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x1000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x2000, 0x0000, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x2000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x4000, 0x0000, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x4000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x8000, 0x0000, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x8000, DEF_STR( On ) )
+
+ PORT_START("PB")
+ PORT_DIPNAME( 0x0001, 0x0000, "PB" )
+ PORT_DIPSETTING( 0x0000, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0001, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0002, 0x0000, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0002, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0004, 0x0000, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0004, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0008, 0x0000, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0008, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0010, 0x0000, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0010, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0020, 0x0000, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0020, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0040, 0x0000, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0040, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0080, 0x0000, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0080, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0100, 0x0000, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0100, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0200, 0x0000, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0200, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0400, 0x0000, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0400, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0800, 0x0000, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0800, DEF_STR( On ) )
+ PORT_DIPNAME( 0x1000, 0x0000, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x1000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x2000, 0x0000, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x2000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x4000, 0x0000, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x4000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x8000, 0x0000, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x8000, DEF_STR( On ) )
+
+ PORT_START("PC")
+ PORT_DIPNAME( 0x0001, 0x0000, "PC" )
+ PORT_DIPSETTING( 0x0000, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0001, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0002, 0x0000, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0002, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0004, 0x0000, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0004, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0008, 0x0000, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0008, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0010, 0x0000, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0010, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0020, 0x0000, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0020, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0040, 0x0000, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0040, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0080, 0x0000, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0080, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0100, 0x0000, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0100, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0200, 0x0000, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0200, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0400, 0x0000, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0400, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0800, 0x0000, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0800, DEF_STR( On ) )
+ PORT_DIPNAME( 0x1000, 0x0000, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x1000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x2000, 0x0000, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x2000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x4000, 0x0000, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x4000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x8000, 0x0000, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x8000, DEF_STR( On ) )
+
+ PORT_START("JOYX")
+ PORT_BIT( 0xffff, IP_ACTIVE_HIGH, IPT_UNUSED )
+
+ PORT_START("JOYY")
+ PORT_BIT(0x0fff, 0x0000, IPT_AD_STICK_Y) PORT_SENSITIVITY(100) PORT_KEYDELTA(100) PORT_MINMAX(0x00,0x0fff) PORT_NAME("Plunger")
+INPUT_PORTS_END
+
+static INPUT_PORTS_START( jak_spdmo )
+ PORT_START("PA")
+ PORT_DIPNAME( 0x0001, 0x0000, "PA" )
+ PORT_DIPSETTING( 0x0000, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0001, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0002, 0x0000, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0002, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0004, 0x0000, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0004, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0008, 0x0000, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0008, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0010, 0x0000, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0010, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0020, 0x0000, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0020, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0040, 0x0000, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0040, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0080, 0x0000, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0080, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0100, 0x0000, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0100, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0200, 0x0000, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0200, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0400, 0x0000, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0400, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0800, 0x0000, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0800, DEF_STR( On ) )
+ PORT_DIPNAME( 0x1000, 0x0000, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x1000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x2000, 0x0000, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x2000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x4000, 0x0000, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x4000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x8000, 0x0000, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x8000, DEF_STR( On ) )
+
+ PORT_START("PB")
+ PORT_DIPNAME( 0x0001, 0x0000, "PB" )
+ PORT_DIPSETTING( 0x0000, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0001, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0002, 0x0000, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0002, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0004, 0x0000, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0004, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0008, 0x0000, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0008, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0010, 0x0000, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0010, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0020, 0x0000, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0020, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0040, 0x0000, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0040, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0080, 0x0000, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0080, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0100, 0x0000, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0100, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0200, 0x0000, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0200, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0400, 0x0000, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0400, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0800, 0x0000, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0800, DEF_STR( On ) )
+ PORT_DIPNAME( 0x1000, 0x0000, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x1000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x2000, 0x0000, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x2000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x4000, 0x0000, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x4000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x8000, 0x0000, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x8000, DEF_STR( On ) )
+
+ PORT_START("PC")
+ PORT_DIPNAME( 0x0001, 0x0000, "PC" )
+ PORT_DIPSETTING( 0x0000, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0001, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0002, 0x0000, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0002, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0004, 0x0000, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0004, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0008, 0x0000, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0008, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0010, 0x0000, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0010, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0020, 0x0000, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0020, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0040, 0x0000, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0040, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0080, 0x0000, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0080, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0100, 0x0000, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0100, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0200, 0x0000, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0200, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0400, 0x0000, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0400, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0800, 0x0000, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0800, DEF_STR( On ) )
+ PORT_DIPNAME( 0x1000, 0x0000, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x1000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x2000, 0x0000, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x2000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x4000, 0x0000, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x4000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x8000, 0x0000, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x8000, DEF_STR( On ) )
+
+ PORT_START("JOYX")
+
+ PORT_START("JOYY")
+
+INPUT_PORTS_END
+
+void spg110_game_state::spg110_base(machine_config &config)
+{
+ UNSP(config, m_maincpu, XTAL(27'000'000));
+ m_maincpu->set_addrmap(AS_PROGRAM, &spg110_game_state::mem_map);
+
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_refresh_hz(60);
+ m_screen->set_size(320, 262);
+ m_screen->set_visarea(0, 320-1, 0, 240-1);
+ m_screen->set_screen_update("spg", FUNC(spg110_device::screen_update));
+ m_screen->screen_vblank().set(m_spg, FUNC(spg110_device::vblank));
+
+ SPEAKER(config, "lspeaker").front_left();
+ SPEAKER(config, "rspeaker").front_right();
+// m_spg->add_route(ALL_OUTPUTS, "lspeaker", 0.5);
+// m_spg->add_route(ALL_OUTPUTS, "rspeaker", 0.5);
+
+ SPG110(config, m_spg, XTAL(27'000'000), m_maincpu, m_screen);
+ m_spg->porta_in().set_ioport("PA");
+ m_spg->portb_in().set_ioport("PB");
+ m_spg->portc_in().set_ioport("PC");
+ m_spg->adc_in<0>().set_ioport("JOYX");
+ m_spg->adc_in<1>().set_ioport("JOYY");
+}
+
+ROM_START( jak_capb )
+ ROM_REGION( 0x200000, "maincpu", ROMREGION_ERASE00 )
+ ROM_LOAD16_WORD_SWAP( "classicarcadepinball.bin", 0x000000, 0x200000, CRC(b643dab0) SHA1(f57d546758ba442e28b5f0f48b3819b2fc2eb7f7) )
+ROM_END
+
+
+ROM_START( jak_spdmo )
+ ROM_REGION( 0x800000, "maincpu", ROMREGION_ERASE00 )
+ ROM_LOAD16_WORD_SWAP( "spidermaneyes.bin", 0x000000, 0x200000, CRC(d5eaa6ae) SHA1(df226d378b41cf6ef90b9f72e48ff5e66385dcba) )
+ROM_END
+
+// JAKKS Pacific Inc TV games
+CONS( 2004, jak_capb, 0, 0, spg110_base, jak_capb, spg110_game_state, empty_init, "JAKKS Pacific Inc / HotGen Ltd", "Classic Arcade Pinball (JAKKS Pacific TV Game)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS )
+CONS( 2004, jak_spdmo, jak_spdm, 0, spg110_base, jak_spdmo, spg110_game_state, empty_init, "JAKKS Pacific Inc / Digital Eclipse", "Spider-Man (JAKKS Pacific TV Game) (older hardare)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS ) // this is the smaller more 'square' style joystick that was originally released before the GameKey slot was added.
diff --git a/src/mame/drivers/spiders.cpp b/src/mame/drivers/spiders.cpp
index 423e95dd834..b076d4a5e70 100644
--- a/src/mame/drivers/spiders.cpp
+++ b/src/mame/drivers/spiders.cpp
@@ -504,22 +504,22 @@ INPUT_PORTS_END
*
*************************************/
-MACHINE_CONFIG_START(spiders_state::spiders)
-
+void spiders_state::spiders(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", MC6809, 2800000)
- MCFG_DEVICE_PROGRAM_MAP(spiders_main_map)
- MCFG_DEVICE_PERIODIC_INT_DRIVER(spiders_state, update_pia_1, 25)
+ MC6809(config, m_maincpu, 2800000);
+ m_maincpu->set_addrmap(AS_PROGRAM, &spiders_state::spiders_main_map);
+ m_maincpu->set_periodic_int(FUNC(spiders_state::update_pia_1), attotime::from_hz(25));
- MCFG_DEVICE_ADD("audiocpu", M6802, 3000000)
- MCFG_DEVICE_PROGRAM_MAP(spiders_audio_map)
+ M6802(config, m_audiocpu, 3000000);
+ m_audiocpu->set_addrmap(AS_PROGRAM, &spiders_state::spiders_audio_map);
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_RAW_PARAMS(PIXEL_CLOCK, 256, 0, 256, 256, 0, 256) /* temporary, CRTC will configure screen */
- MCFG_SCREEN_UPDATE_DEVICE("crtc", mc6845_device, screen_update)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_raw(PIXEL_CLOCK, 256, 0, 256, 256, 0, 256); /* temporary, CRTC will configure screen */
+ screen.set_screen_update("crtc", FUNC(mc6845_device::screen_update));
PALETTE(config, m_palette, palette_device::RGB_3BIT);
@@ -549,8 +549,7 @@ MACHINE_CONFIG_START(spiders_state::spiders)
m_pia[2]->irqa_handler().set("mainirq", FUNC(input_merger_device::in_w<3>));
m_pia[2]->irqb_handler().set("mainirq", FUNC(input_merger_device::in_w<4>));
- MCFG_INPUT_MERGER_ANY_HIGH("mainirq")
- MCFG_INPUT_MERGER_OUTPUT_HANDLER(INPUTLINE("maincpu", M6809_IRQ_LINE))
+ INPUT_MERGER_ANY_HIGH(config, "mainirq").output_handler().set_inputline(m_maincpu, M6809_IRQ_LINE);
PIA6821(config, m_pia[3], 0);
m_pia[3]->writepa_handler().set(FUNC(spiders_state::spiders_audio_a_w));
@@ -568,8 +567,7 @@ MACHINE_CONFIG_START(spiders_state::spiders)
/* audio hardware */
spiders_audio(config);
-
-MACHINE_CONFIG_END
+}
diff --git a/src/mame/drivers/spinb.cpp b/src/mame/drivers/spinb.cpp
index 022c4f13c90..26bf27e48fa 100644
--- a/src/mame/drivers/spinb.cpp
+++ b/src/mame/drivers/spinb.cpp
@@ -461,17 +461,17 @@ WRITE8_MEMBER( spinb_state::sndbank_m_w )
void spinb_state::update_sound_a()
{
if (m_sndbank_a != 0xff)
- m_ic14a->write_ba(m_p_audio[m_sound_addr_a]);
+ m_ic14a->ba_w(m_p_audio[m_sound_addr_a]);
else
- m_ic14a->write_ba(0);
+ m_ic14a->ba_w(0);
}
void spinb_state::update_sound_m()
{
if (m_sndbank_m != 0xff)
- m_ic14m->write_ba(m_p_music[m_sound_addr_m]);
+ m_ic14m->ba_w(m_p_music[m_sound_addr_m]);
else
- m_ic14m->write_ba(0);
+ m_ic14m->ba_w(0);
}
WRITE_LINE_MEMBER( spinb_state::ic5a_w )
diff --git a/src/mame/drivers/spirit76.cpp b/src/mame/drivers/spirit76.cpp
index 327a4eba9c5..aff49228c39 100644
--- a/src/mame/drivers/spirit76.cpp
+++ b/src/mame/drivers/spirit76.cpp
@@ -121,14 +121,16 @@ void spirit76_state::machine_reset()
m_t_c = 0;
}
-MACHINE_CONFIG_START(spirit76_state::spirit76)
+void spirit76_state::spirit76(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M6800, 500000)
- MCFG_DEVICE_PROGRAM_MAP(maincpu_map)
- MCFG_TIMER_DRIVER_ADD_PERIODIC("irq", spirit76_state, irq, attotime::from_hz(120))
+ M6800(config, m_maincpu, 500000);
+ m_maincpu->set_addrmap(AS_PROGRAM, &spirit76_state::maincpu_map);
+
+ TIMER(config, "irq").configure_periodic(FUNC(spirit76_state::irq), attotime::from_hz(120));
/* video hardware */
- //MCFG_DEFAULT_LAYOUT()
+ //config.set_default_layout();
//6821pia
pia6821_device &pia(PIA6821(config, "pia", 0));
@@ -143,7 +145,7 @@ MACHINE_CONFIG_START(spirit76_state::spirit76)
/* sound hardware */
genpin_audio(config);
-MACHINE_CONFIG_END
+}
ROM_START(spirit76)
diff --git a/src/mame/drivers/splash.cpp b/src/mame/drivers/splash.cpp
index e0a0db999f4..4ad1ea62f4c 100644
--- a/src/mame/drivers/splash.cpp
+++ b/src/mame/drivers/splash.cpp
@@ -523,7 +523,7 @@ void splash_state::splash(machine_config &config)
GENERIC_LATCH_8(config, m_soundlatch);
m_soundlatch->data_pending_callback().set_inputline(m_audiocpu, 0);
- YM3812(config, "ymsnd", XTAL(30'000'000)/8).add_route(ALL_OUTPUTS, "mono", 0.80); /* 3.75MHz (30/8) */
+ YM3812(config, "ymsnd", XTAL(30'000'000)/8).add_route(ALL_OUTPUTS, "mono", 0.80); /* 3.75MHz (30/8) */
MSM5205(config, m_msm, XTAL(384'000));
m_msm->vck_legacy_callback().set(FUNC(splash_state::splash_msm5205_int)); /* IRQ handler */
@@ -641,11 +641,11 @@ void funystrp_state::machine_start()
void funystrp_state::funystrp(machine_config &config)
{
/* basic machine hardware */
- M68000(config, m_maincpu, XTAL(24'000'000)/2); /* 12 MHz (24/2) */
+ M68000(config, m_maincpu, XTAL(24'000'000)/2); /* 12 MHz (24/2) */
m_maincpu->set_addrmap(AS_PROGRAM, &funystrp_state::funystrp_map);
m_maincpu->set_vblank_int("screen", FUNC(funystrp_state::irq6_line_hold));
- Z80(config, m_audiocpu, XTAL(24'000'000)/4); /* 6MHz (24/4) */
+ Z80(config, m_audiocpu, XTAL(24'000'000)/4); /* 6MHz (24/4) */
m_audiocpu->set_addrmap(AS_PROGRAM, &funystrp_state::funystrp_sound_map);
m_audiocpu->set_addrmap(AS_IO, &funystrp_state::funystrp_sound_io_map);
@@ -670,12 +670,12 @@ void funystrp_state::funystrp(machine_config &config)
m_soundlatch->data_pending_callback().set_inputline(m_audiocpu, INPUT_LINE_NMI);
MSM5205(config, m_msm1, XTAL(400'000));
- m_msm1->vck_legacy_callback().set(FUNC(funystrp_state::adpcm_int1)); /* interrupt function */
+ m_msm1->vck_legacy_callback().set(FUNC(funystrp_state::adpcm_int1)); /* interrupt function */
m_msm1->set_prescaler_selector(msm5205_device::S48_4B); /* 1 / 48 */ /* Sample rate = 400kHz/64 */
m_msm1->add_route(ALL_OUTPUTS, "mono", 0.80);
MSM5205(config, m_msm2, XTAL(400'000));
- m_msm2->vck_legacy_callback().set(FUNC(funystrp_state::adpcm_int2)); /* interrupt function */
+ m_msm2->vck_legacy_callback().set(FUNC(funystrp_state::adpcm_int2)); /* interrupt function */
m_msm2->set_prescaler_selector(msm5205_device::S96_4B); /* 1 / 96 */ /* Sample rate = 400kHz/96 */
m_msm2->add_route(ALL_OUTPUTS, "mono", 0.80);
}
diff --git a/src/mame/drivers/splus.cpp b/src/mame/drivers/splus.cpp
index 8942e711733..1810b6ee3f7 100644
--- a/src/mame/drivers/splus.cpp
+++ b/src/mame/drivers/splus.cpp
@@ -135,7 +135,7 @@ private:
required_ioport m_i30;
required_ioport m_sensor;
required_device<i80c32_device> m_maincpu;
- required_device<x2404p_device> m_i2cmem;
+ required_device<i2c_x2404p_device> m_i2cmem;
output_finder<9> m_digits;
output_finder<5,8> m_leds;
};
@@ -700,7 +700,7 @@ void splus_state::splus(machine_config &config) // basic machine hardware
screen.set_visarea(0*8, 40*8-1, 0*8, 25*8-1);
screen.set_palette("palette");
- X2404P(config, m_i2cmem);
+ I2C_X2404P(config, m_i2cmem);
// sound hardware
SPEAKER(config, "mono").front_center();
diff --git a/src/mame/drivers/spool99.cpp b/src/mame/drivers/spool99.cpp
index 14b5f4639be..7eb2bb75e2a 100644
--- a/src/mame/drivers/spool99.cpp
+++ b/src/mame/drivers/spool99.cpp
@@ -208,7 +208,7 @@ READ8_MEMBER(spool99_state::spool99_io_r)
// case 0xafe5: return 1;
// case 0xafe6: return 1;
case 0xafe7: return m_eeprom->do_read();
- case 0xaff8: return m_oki->read(space,0);
+ case 0xaff8: return m_oki->read();
}
}
// printf("%04x %d\n",offset+0xaf00,io_switch);
@@ -267,7 +267,7 @@ READ8_MEMBER(spool99_state::vcarn_io_r)
case 0xa725: return ioport("HOLD3")->read();
case 0xa726: return ioport("HOLD4")->read();
case 0xa727: return ioport("HOLD2")->read();
- case 0xa780: return m_oki->read(space,0);
+ case 0xa780: return m_oki->read();
case 0xa7a0: return ioport("HOLD1")->read();
case 0xa7a1: return ioport("HOLD5")->read();
case 0xa7a2: return ioport("START")->read();
@@ -367,21 +367,21 @@ INPUT_PORTS_END
-MACHINE_CONFIG_START(spool99_state::spool99)
-
- MCFG_DEVICE_ADD("maincpu", Z80, 24000000/8)
- MCFG_DEVICE_PROGRAM_MAP(spool99_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", spool99_state, irq0_line_hold)
+void spool99_state::spool99(machine_config &config)
+{
+ Z80(config, m_maincpu, 24000000/8);
+ m_maincpu->set_addrmap(AS_PROGRAM, &spool99_state::spool99_map);
+ m_maincpu->set_vblank_int("screen", FUNC(spool99_state::irq0_line_hold));
GFXDECODE(config, m_gfxdecode, "palette", gfx_spool99);
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(64*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(7*8, 55*8-1, 1*8, 31*8-1) //384x240,raw guess
- MCFG_SCREEN_UPDATE_DRIVER(spool99_state, screen_update)
- MCFG_SCREEN_PALETTE("palette")
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(64*8, 32*8);
+ screen.set_visarea(7*8, 55*8-1, 1*8, 31*8-1); //384x240,raw guess
+ screen.set_screen_update(FUNC(spool99_state::screen_update));
+ screen.set_palette("palette");
PALETTE(config, "palette").set_format(palette_device::xBGR_444, 0x200);
@@ -391,20 +391,18 @@ MACHINE_CONFIG_START(spool99_state::spool99)
SPEAKER(config, "lspeaker").front_left();
SPEAKER(config, "rspeaker").front_right();
- MCFG_DEVICE_ADD("oki", OKIM6295, 1000000, okim6295_device::PIN7_HIGH) // clock frequency & pin 7 not verified
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 0.47)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 0.47)
-MACHINE_CONFIG_END
+ OKIM6295(config, m_oki, 1000000, okim6295_device::PIN7_HIGH); // clock frequency & pin 7 not verified
+ m_oki->add_route(ALL_OUTPUTS, "lspeaker", 0.47);
+ m_oki->add_route(ALL_OUTPUTS, "rspeaker", 0.47);
+}
-MACHINE_CONFIG_START(spool99_state::vcarn)
+void spool99_state::vcarn(machine_config &config)
+{
spool99(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(vcarn_map)
-
- MCFG_SCREEN_MODIFY("screen")
- MCFG_SCREEN_VISIBLE_AREA(0*8, 64*8-1, 1*8, 31*8-1) //512x240, raw guess
+ m_maincpu->set_addrmap(AS_PROGRAM, &spool99_state::vcarn_map);
-MACHINE_CONFIG_END
+ subdevice<screen_device>("screen")->set_visarea(0*8, 64*8-1, 1*8, 31*8-1); //512x240, raw guess
+}
ROM_START( spool99 )
diff --git a/src/mame/drivers/sprcros2.cpp b/src/mame/drivers/sprcros2.cpp
index 1f10dc36802..91a6caefa6b 100644
--- a/src/mame/drivers/sprcros2.cpp
+++ b/src/mame/drivers/sprcros2.cpp
@@ -260,9 +260,9 @@ void sprcros2_state::master_map(address_map &map)
void sprcros2_state::master_io(address_map &map)
{
map.global_mask(0xff);
- map(0x00, 0x00).portr("P1").w("sn1", FUNC(sn76489_device::command_w));
- map(0x01, 0x01).portr("P2").w("sn2", FUNC(sn76489_device::command_w));
- map(0x02, 0x02).portr("EXTRA").w("sn3", FUNC(sn76489_device::command_w));
+ map(0x00, 0x00).portr("P1").w("sn1", FUNC(sn76489_device::write));
+ map(0x01, 0x01).portr("P2").w("sn2", FUNC(sn76489_device::write));
+ map(0x02, 0x02).portr("EXTRA").w("sn3", FUNC(sn76489_device::write));
map(0x04, 0x04).portr("DSW1");
map(0x05, 0x05).portr("DSW2");
map(0x07, 0x07).w(FUNC(sprcros2_state::master_output_w));
@@ -452,27 +452,28 @@ TIMER_DEVICE_CALLBACK_MEMBER(sprcros2_state::master_scanline)
m_master_cpu->set_input_line(0, HOLD_LINE);
}
-MACHINE_CONFIG_START(sprcros2_state::sprcros2)
-
+void sprcros2_state::sprcros2(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("master_cpu",Z80,MAIN_CLOCK/4)
- MCFG_DEVICE_PROGRAM_MAP(master_map)
- MCFG_DEVICE_IO_MAP(master_io)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", sprcros2_state, master_vblank_irq)
- MCFG_TIMER_DRIVER_ADD_SCANLINE("scantimer", sprcros2_state, master_scanline, "screen", 0, 1)
+ Z80(config, m_master_cpu, MAIN_CLOCK/4);
+ m_master_cpu->set_addrmap(AS_PROGRAM, &sprcros2_state::master_map);
+ m_master_cpu->set_addrmap(AS_IO, &sprcros2_state::master_io);
+ m_master_cpu->set_vblank_int("screen", FUNC(sprcros2_state::master_vblank_irq));
- MCFG_DEVICE_ADD("slave_cpu",Z80,MAIN_CLOCK/4)
- MCFG_DEVICE_PROGRAM_MAP(slave_map)
- MCFG_DEVICE_IO_MAP(slave_io)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", sprcros2_state, slave_vblank_irq)
+ TIMER(config, "scantimer").configure_scanline(FUNC(sprcros2_state::master_scanline), "screen", 0, 1);
- MCFG_QUANTUM_PERFECT_CPU("master_cpu")
+ Z80(config, m_slave_cpu, MAIN_CLOCK/4);
+ m_slave_cpu->set_addrmap(AS_PROGRAM, &sprcros2_state::slave_map);
+ m_slave_cpu->set_addrmap(AS_IO, &sprcros2_state::slave_io);
+ m_slave_cpu->set_vblank_int("screen", FUNC(sprcros2_state::slave_vblank_irq));
+
+ config.m_perfect_cpu_quantum = subtag("master_cpu");
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_UPDATE_DRIVER(sprcros2_state, screen_update)
- MCFG_SCREEN_RAW_PARAMS(MAIN_CLOCK/2, 343, 8, 256-8, 262, 16, 240) // TODO: Wrong screen parameters
- MCFG_SCREEN_PALETTE("palette")
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_screen_update(FUNC(sprcros2_state::screen_update));
+ screen.set_raw(MAIN_CLOCK/2, 343, 8, 256-8, 262, 16, 240); // TODO: Wrong screen parameters
+ screen.set_palette("palette");
GFXDECODE(config, m_gfxdecode, "palette", gfx_sprcros2);
@@ -483,7 +484,7 @@ MACHINE_CONFIG_START(sprcros2_state::sprcros2)
SN76489(config, "sn1", 10000000/4).add_route(ALL_OUTPUTS, "mono", 0.50);
SN76489(config, "sn2", 10000000/4).add_route(ALL_OUTPUTS, "mono", 0.50);
SN76489(config, "sn3", 10000000/4).add_route(ALL_OUTPUTS, "mono", 0.50);
-MACHINE_CONFIG_END
+}
/***************************************************************************
diff --git a/src/mame/drivers/sprint2.cpp b/src/mame/drivers/sprint2.cpp
index c10ed7f9300..3db9afd6015 100644
--- a/src/mame/drivers/sprint2.cpp
+++ b/src/mame/drivers/sprint2.cpp
@@ -489,23 +489,23 @@ static GFXDECODE_START( gfx_sprint2 )
GFXDECODE_END
-MACHINE_CONFIG_START(sprint2_state::sprint2)
-
+void sprint2_state::sprint2(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M6502, 12.096_MHz_XTAL / 16)
- MCFG_DEVICE_PROGRAM_MAP(sprint2_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", sprint2_state, sprint2)
+ M6502(config, m_maincpu, 12.096_MHz_XTAL / 16);
+ m_maincpu->set_addrmap(AS_PROGRAM, &sprint2_state::sprint2_map);
+ m_maincpu->set_vblank_int("screen", FUNC(sprint2_state::sprint2));
WATCHDOG_TIMER(config, m_watchdog).set_vblank_count(m_screen, 8);
/* video hardware */
- MCFG_SCREEN_ADD(m_screen, RASTER)
- MCFG_SCREEN_RAW_PARAMS(12.096_MHz_XTAL, 768, 0, 512, 262, 0, 224)
- MCFG_SCREEN_UPDATE_DRIVER(sprint2_state, screen_update_sprint2)
- MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE(*this, sprint2_state, screen_vblank_sprint2))
- MCFG_SCREEN_PALETTE(m_palette)
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_raw(12.096_MHz_XTAL, 768, 0, 512, 262, 0, 224);
+ m_screen->set_screen_update(FUNC(sprint2_state::screen_update_sprint2));
+ m_screen->screen_vblank().set(FUNC(sprint2_state::screen_vblank_sprint2));
+ m_screen->set_palette(m_palette);
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, m_palette, gfx_sprint2)
+ GFXDECODE(config, m_gfxdecode, m_palette, gfx_sprint2);
PALETTE(config, m_palette, FUNC(sprint2_state::sprint2_palette), 12, 4);
/* sound hardware */
@@ -520,40 +520,40 @@ MACHINE_CONFIG_START(sprint2_state::sprint2)
m_outlatch->q_out_cb<4>().set_output("led1"); // START LAMP2
//m_outlatch->q_out_cb<6>().set(FUNC(sprint2_state::sprint2_spare_w));
- MCFG_DEVICE_ADD("discrete", DISCRETE, sprint2_discrete)
- MCFG_SOUND_ROUTE(0, "lspeaker", 1.0)
- MCFG_SOUND_ROUTE(1, "rspeaker", 1.0)
-MACHINE_CONFIG_END
+ DISCRETE(config, m_discrete, sprint2_discrete);
+ m_discrete->add_route(0, "lspeaker", 1.0);
+ m_discrete->add_route(1, "rspeaker", 1.0);
+}
-MACHINE_CONFIG_START(sprint2_state::sprint1)
+void sprint2_state::sprint1(machine_config &config)
+{
sprint2(config);
/* sound hardware */
- MCFG_DEVICE_REMOVE("lspeaker")
- MCFG_DEVICE_REMOVE("rspeaker")
+ config.device_remove("lspeaker");
+ config.device_remove("rspeaker");
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_REMOVE("discrete")
+ config.device_remove("discrete");
- MCFG_DEVICE_ADD("discrete", DISCRETE, sprint1_discrete)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
-MACHINE_CONFIG_END
+ DISCRETE(config, m_discrete, sprint1_discrete).add_route(ALL_OUTPUTS, "mono", 1.0);
+}
-MACHINE_CONFIG_START(sprint2_state::dominos)
+void sprint2_state::dominos(machine_config &config)
+{
sprint2(config);
/* sound hardware */
- MCFG_DEVICE_REMOVE("lspeaker")
- MCFG_DEVICE_REMOVE("rspeaker")
+ config.device_remove("lspeaker");
+ config.device_remove("rspeaker");
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_REMOVE("discrete")
+ config.device_remove("discrete");
- MCFG_DEVICE_ADD("discrete", DISCRETE, dominos_discrete)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
-MACHINE_CONFIG_END
+ DISCRETE(config, m_discrete, dominos_discrete).add_route(ALL_OUTPUTS, "mono", 1.0);
+}
void sprint2_state::dominos4(machine_config &config)
{
diff --git a/src/mame/drivers/sprint4.cpp b/src/mame/drivers/sprint4.cpp
index e87350c727c..12e903cc2b5 100644
--- a/src/mame/drivers/sprint4.cpp
+++ b/src/mame/drivers/sprint4.cpp
@@ -379,22 +379,22 @@ static GFXDECODE_START( gfx_sprint4 )
GFXDECODE_END
-MACHINE_CONFIG_START(sprint4_state::sprint4)
-
+void sprint4_state::sprint4(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M6502, PIXEL_CLOCK / 8)
- MCFG_DEVICE_PROGRAM_MAP(sprint4_cpu_map)
+ M6502(config, m_maincpu, PIXEL_CLOCK / 8);
+ m_maincpu->set_addrmap(AS_PROGRAM, &sprint4_state::sprint4_cpu_map);
WATCHDOG_TIMER(config, m_watchdog).set_vblank_count(m_screen, 8);
/* video hardware */
- MCFG_SCREEN_ADD(m_screen, RASTER)
- MCFG_SCREEN_RAW_PARAMS(PIXEL_CLOCK, HTOTAL, 0, 256, VTOTAL, 0, 224)
- MCFG_SCREEN_UPDATE_DRIVER(sprint4_state, screen_update)
- MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE(*this, sprint4_state, screen_vblank))
- MCFG_SCREEN_PALETTE(m_palette)
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_raw(PIXEL_CLOCK, HTOTAL, 0, 256, VTOTAL, 0, 224);
+ m_screen->set_screen_update(FUNC(sprint4_state::screen_update));
+ m_screen->screen_vblank().set(FUNC(sprint4_state::screen_vblank));
+ m_screen->set_palette(m_palette);
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, m_palette, gfx_sprint4)
+ GFXDECODE(config, m_gfxdecode, m_palette, gfx_sprint4);
PALETTE(config, m_palette, FUNC(sprint4_state::sprint4_palette), 10, 6);
/* sound hardware */
@@ -411,11 +411,10 @@ MACHINE_CONFIG_START(sprint4_state::sprint4)
latch.q_out_cb<6>().set("discrete", FUNC(discrete_device::write_line<SPRINT4_SCREECH_EN_3>));
latch.q_out_cb<7>().set("discrete", FUNC(discrete_device::write_line<SPRINT4_SCREECH_EN_4>));
- MCFG_DEVICE_ADD("discrete", DISCRETE, sprint4_discrete)
- MCFG_SOUND_ROUTE(0, "lspeaker", 1.0)
- MCFG_SOUND_ROUTE(1, "rspeaker", 1.0)
-
-MACHINE_CONFIG_END
+ DISCRETE(config, m_discrete, sprint4_discrete);
+ m_discrete->add_route(0, "lspeaker", 1.0);
+ m_discrete->add_route(1, "rspeaker", 1.0);
+}
ROM_START( sprint4 )
diff --git a/src/mame/drivers/sprint8.cpp b/src/mame/drivers/sprint8.cpp
index c952722d2e2..c11afb6c1a7 100644
--- a/src/mame/drivers/sprint8.cpp
+++ b/src/mame/drivers/sprint8.cpp
@@ -456,29 +456,28 @@ static GFXDECODE_START( gfx_sprint8 )
GFXDECODE_END
-MACHINE_CONFIG_START(sprint8_state::sprint8)
-
+void sprint8_state::sprint8(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M6800, 11055000 / 11) /* ? */
- MCFG_DEVICE_PROGRAM_MAP(sprint8_map)
+ M6800(config, m_maincpu, 11055000 / 11); /* ? */
+ m_maincpu->set_addrmap(AS_PROGRAM, &sprint8_state::sprint8_map);
-
- MCFG_TIMER_DRIVER_ADD_PERIODIC("input_timer", sprint8_state, input_callback, attotime::from_hz(60))
+ TIMER(config, "input_timer").configure_periodic(FUNC(sprint8_state::input_callback), attotime::from_hz(60));
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_SIZE(512, 261)
- MCFG_SCREEN_VISIBLE_AREA(0, 495, 0, 231)
- MCFG_SCREEN_UPDATE_DRIVER(sprint8_state, screen_update)
- MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE(*this, sprint8_state, screen_vblank))
- MCFG_SCREEN_PALETTE(m_palette)
-
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, m_palette, gfx_sprint8)
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_refresh_hz(60);
+ m_screen->set_size(512, 261);
+ m_screen->set_visarea(0, 495, 0, 231);
+ m_screen->set_screen_update(FUNC(sprint8_state::screen_update));
+ m_screen->screen_vblank().set(FUNC(sprint8_state::screen_vblank));
+ m_screen->set_palette(m_palette);
+
+ GFXDECODE(config, m_gfxdecode, m_palette, gfx_sprint8);
PALETTE(config, m_palette, FUNC(sprint8_state::sprint8_palette), 36, 18);
sprint8_audio(config);
-MACHINE_CONFIG_END
+}
ROM_START( sprint8 )
diff --git a/src/mame/drivers/spyhuntertec.cpp b/src/mame/drivers/spyhuntertec.cpp
index 5e554220c9c..6bd9b1c6bf3 100644
--- a/src/mame/drivers/spyhuntertec.cpp
+++ b/src/mame/drivers/spyhuntertec.cpp
@@ -668,39 +668,36 @@ void spyhuntertec_state::machine_reset()
-MACHINE_CONFIG_START(spyhuntertec_state::spyhuntertec)
-
+void spyhuntertec_state::spyhuntertec(machine_config &config)
+{
// note: no ctc, no nvram
// 2*z80, 3*ay8912
// 2 XTALs: one 20MHz, other one near maincpu ?MHz
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, 4000000 ) // NEC D780C-2 (rated 6MHz)
- MCFG_DEVICE_PROGRAM_MAP(spyhuntertec_map)
- MCFG_DEVICE_IO_MAP(spyhuntertec_portmap)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", spyhuntertec_state, irq0_line_hold)
- MCFG_TIMER_DRIVER_ADD("analog_timer", spyhuntertec_state, analog_count_callback)
+ Z80(config, m_maincpu, 4000000); // NEC D780C-2 (rated 6MHz)
+ m_maincpu->set_addrmap(AS_PROGRAM, &spyhuntertec_state::spyhuntertec_map);
+ m_maincpu->set_addrmap(AS_IO, &spyhuntertec_state::spyhuntertec_portmap);
+ m_maincpu->set_vblank_int("screen", FUNC(spyhuntertec_state::irq0_line_hold));
+ TIMER(config, m_analog_timer).configure_generic(FUNC(spyhuntertec_state::analog_count_callback));
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_VIDEO_ATTRIBUTES(VIDEO_UPDATE_BEFORE_VBLANK)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */)
- MCFG_SCREEN_SIZE(30*16, 30*8)
- MCFG_SCREEN_VISIBLE_AREA(0, 30*16-1, 0, 30*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(spyhuntertec_state, screen_update_spyhuntertec)
- MCFG_SCREEN_PALETTE("palette")
-
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_spyhuntertec)
- MCFG_PALETTE_ADD("palette", 64+4)
-
-// MCFG_PALETTE_INIT_OWNER(spyhuntertec_state,spyhunt)
-
-
- MCFG_DEVICE_ADD("audiocpu", Z80, 4000000 ) // SGS Z8400B1 (rated 2.5MHz?)
- MCFG_DEVICE_PROGRAM_MAP(spyhuntertec_sound_map)
- MCFG_DEVICE_IO_MAP(spyhuntertec_sound_portmap)
- MCFG_DEVICE_PERIODIC_INT_DRIVER(spyhuntertec_state, irq0_line_assert, 1000)
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_video_attributes(VIDEO_UPDATE_BEFORE_VBLANK);
+ m_screen->set_refresh_hz(60);
+ m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(2500) /* not accurate */);
+ m_screen->set_size(30*16, 30*8);
+ m_screen->set_visarea(0, 30*16-1, 0, 30*8-1);
+ m_screen->set_screen_update(FUNC(spyhuntertec_state::screen_update_spyhuntertec));
+ m_screen->set_palette(m_palette);
+
+ GFXDECODE(config, m_gfxdecode, m_palette, gfx_spyhuntertec);
+ PALETTE(config, m_palette).set_entries(64+4); // FUNC(spyhuntertec_state::spyhunt)
+
+ Z80(config, m_audiocpu, 4000000); // SGS Z8400B1 (rated 2.5MHz?)
+ m_audiocpu->set_addrmap(AS_PROGRAM, &spyhuntertec_state::spyhuntertec_sound_map);
+ m_audiocpu->set_addrmap(AS_IO, &spyhuntertec_state::spyhuntertec_sound_portmap);
+ m_audiocpu->set_periodic_int(FUNC(spyhuntertec_state::irq0_line_assert), attotime::from_hz(1000));
SPEAKER(config, "mono").front_center();
@@ -718,8 +715,7 @@ MACHINE_CONFIG_START(spyhuntertec_state::spyhuntertec)
ay2.port_a_write_callback().set(FUNC(spyhuntertec_state::ay2_porta_w));
AY8912(config, "ay3", 3000000/2).add_route(ALL_OUTPUTS, "mono", 0.25); // "
-
-MACHINE_CONFIG_END
+}
diff --git a/src/mame/drivers/squale.cpp b/src/mame/drivers/squale.cpp
index b8d71898146..3526408558e 100644
--- a/src/mame/drivers/squale.cpp
+++ b/src/mame/drivers/squale.cpp
@@ -783,8 +783,8 @@ void squale_state::machine_reset()
MACHINE_CONFIG_START(squale_state::squale)
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", MC6809, CPU_CLOCK)
- MCFG_DEVICE_PROGRAM_MAP(squale_mem)
+ MC6809(config, m_maincpu, CPU_CLOCK);
+ m_maincpu->set_addrmap(AS_PROGRAM, &squale_state::squale_mem);
/* Cartridge pia */
PIA6821(config, m_pia_u72, 0);
@@ -813,33 +813,33 @@ MACHINE_CONFIG_START(squale_state::squale)
m_ay8910->port_b_write_callback().set(FUNC(squale_state::ay_portb_w));
m_ay8910->add_route(ALL_OUTPUTS, "mono", 0.50);
- MCFG_DEVICE_ADD ("ef6850", ACIA6850, 0)
+ ACIA6850(config, m_acia, 0);
/* screen */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(50)
- MCFG_SCREEN_UPDATE_DEVICE("ef9365", ef9365_device, screen_update)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(50);
+ screen.set_screen_update("ef9365", FUNC(ef9365_device::screen_update));
+ screen.set_size(256, 256);
+ screen.set_visarea(0, 256-1, 0, 256-1);
- MCFG_SCREEN_SIZE(256, 256)
- MCFG_SCREEN_VISIBLE_AREA(0, 256-1, 0, 256-1)
- MCFG_PALETTE_ADD("palette", 16)
+ PALETTE(config, "palette").set_entries(16);
- MCFG_DEVICE_ADD("ef9365", EF9365, VIDEO_CLOCK)
- MCFG_EF936X_PALETTE("palette")
- MCFG_EF936X_BITPLANES_CNT(4);
- MCFG_EF936X_DISPLAYMODE(DISPLAY_MODE_256x256);
- MCFG_TIMER_DRIVER_ADD_SCANLINE("squale_sl", squale_state, squale_scanline, "screen", 0, 10)
+ EF9365(config, m_ef9365, VIDEO_CLOCK);
+ m_ef9365->set_palette_tag("palette");
+ m_ef9365->set_nb_bitplanes(4);
+ m_ef9365->set_display_mode(ef9365_device::DISPLAY_MODE_256x256);
+ TIMER(config, "squale_sl").configure_scanline(FUNC(squale_state::squale_scanline), "screen", 0, 10);
/* Floppy */
WD1770(config, m_fdc, 8_MHz_XTAL);
- MCFG_FLOPPY_DRIVE_ADD("wd1770:0", squale_floppies, "525qd", floppy_image_device::default_floppy_formats)
- MCFG_FLOPPY_DRIVE_ADD("wd1770:1", squale_floppies, "525qd", floppy_image_device::default_floppy_formats)
- MCFG_SOFTWARE_LIST_ADD("flop525_list", "squale")
+ FLOPPY_CONNECTOR(config, "wd1770:0", squale_floppies, "525qd", floppy_image_device::default_floppy_formats);
+ FLOPPY_CONNECTOR(config, "wd1770:1", squale_floppies, "525qd", floppy_image_device::default_floppy_formats);
+ SOFTWARE_LIST(config, "flop525_list").set_original("squale");
/* Cartridge slot */
MCFG_GENERIC_CARTSLOT_ADD("cartslot", generic_linear_slot, "squale_cart")
MCFG_GENERIC_LOAD(squale_state, squale_cart)
- MCFG_SOFTWARE_LIST_ADD("cart_list", "squale_cart")
+ SOFTWARE_LIST(config, "cart_list").set_original("squale_cart");
MACHINE_CONFIG_END
/* ROM definition */
diff --git a/src/mame/drivers/srmp2.cpp b/src/mame/drivers/srmp2.cpp
index d68744cda27..fd7352d610e 100644
--- a/src/mame/drivers/srmp2.cpp
+++ b/src/mame/drivers/srmp2.cpp
@@ -1135,13 +1135,13 @@ static GFXDECODE_START( gfx_srmp3 )
GFXDECODE_END
-MACHINE_CONFIG_START(srmp2_state::srmp2)
-
+void srmp2_state::srmp2(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M68000,16000000/2) /* 8.00 MHz */
- MCFG_DEVICE_PROGRAM_MAP(srmp2_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", srmp2_state, irq4_line_assert)
- MCFG_DEVICE_PERIODIC_INT_DRIVER(srmp2_state, irq2_line_assert, 15*60) /* Interrupt times is not understood */
+ M68000(config, m_maincpu, 16000000/2); /* 8.00 MHz */
+ m_maincpu->set_addrmap(AS_PROGRAM, &srmp2_state::srmp2_map);
+ m_maincpu->set_vblank_int("screen", FUNC(srmp2_state::irq4_line_assert));
+ m_maincpu->set_periodic_int(FUNC(srmp2_state::irq2_line_assert), attotime::from_hz(15*60)); /* Interrupt times is not understood */
MCFG_MACHINE_START_OVERRIDE(srmp2_state,srmp2)
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
@@ -1150,13 +1150,13 @@ MACHINE_CONFIG_START(srmp2_state::srmp2)
m_seta001->set_gfxdecode_tag("gfxdecode");
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(464, 256-16)
- MCFG_SCREEN_VISIBLE_AREA(16, 464-1, 8, 256-1-24)
- MCFG_SCREEN_UPDATE_DRIVER(srmp2_state, screen_update_srmp2)
- MCFG_SCREEN_PALETTE("palette")
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(464, 256-16);
+ screen.set_visarea(16, 464-1, 8, 256-1-24);
+ screen.set_screen_update(FUNC(srmp2_state::screen_update_srmp2));
+ screen.set_palette("palette");
GFXDECODE(config, "gfxdecode", "palette", gfx_srmp2);
PALETTE(config, "palette", FUNC(srmp2_state::srmp2_palette)).set_format(palette_device::xRGB_555, 1024); // sprites only
@@ -1169,22 +1169,19 @@ MACHINE_CONFIG_START(srmp2_state::srmp2)
aysnd.port_b_read_callback().set_ioport("DSW1");
aysnd.add_route(ALL_OUTPUTS, "mono", 0.40);
- MCFG_DEVICE_ADD("msm", MSM5205, 384000)
- MCFG_MSM5205_VCLK_CB(WRITELINE(*this, srmp2_state, adpcm_int)) /* IRQ handler */
- MCFG_MSM5205_PRESCALER_SELECTOR(S48_4B) /* 8 KHz, 4 Bits */
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.45)
-MACHINE_CONFIG_END
-
-
-MACHINE_CONFIG_START(srmp2_state::srmp3)
+ MSM5205(config, m_msm, 384000);
+ m_msm->vck_legacy_callback().set(FUNC(srmp2_state::adpcm_int)); /* IRQ handler */
+ m_msm->set_prescaler_selector(msm5205_device::S48_4B); /* 8 KHz, 4 Bits */
+ m_msm->add_route(ALL_OUTPUTS, "mono", 0.45);
+}
+void srmp2_state::srmp3(machine_config &config)
+{
/* basic machine hardware */
-
- MCFG_DEVICE_ADD("maincpu", Z80, 3500000) /* 3.50 MHz ? */
- // 4000000, /* 4.00 MHz ? */
- MCFG_DEVICE_PROGRAM_MAP(srmp3_map)
- MCFG_DEVICE_IO_MAP(srmp3_io_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", srmp2_state, irq0_line_assert)
+ Z80(config, m_maincpu, 3500000); /* 3.50 MHz? or 4.00 MHz? */
+ m_maincpu->set_addrmap(AS_PROGRAM, &srmp2_state::srmp3_map);
+ m_maincpu->set_addrmap(AS_IO, &srmp2_state::srmp3_io_map);
+ m_maincpu->set_vblank_int("screen", FUNC(srmp2_state::irq0_line_assert));
MCFG_MACHINE_START_OVERRIDE(srmp2_state,srmp3)
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
@@ -1194,13 +1191,13 @@ MACHINE_CONFIG_START(srmp2_state::srmp3)
m_seta001->set_gfxbank_callback(FUNC(srmp2_state::srmp3_gfxbank_callback), this);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(400, 256-16)
- MCFG_SCREEN_VISIBLE_AREA(16, 400-1, 8, 256-1-24)
- MCFG_SCREEN_UPDATE_DRIVER(srmp2_state, screen_update_srmp3)
- MCFG_SCREEN_PALETTE("palette")
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(400, 256-16);
+ screen.set_visarea(16, 400-1, 8, 256-1-24);
+ screen.set_screen_update(FUNC(srmp2_state::screen_update_srmp3));
+ screen.set_palette("palette");
GFXDECODE(config, "gfxdecode", "palette", gfx_srmp3);
PALETTE(config, "palette", FUNC(srmp2_state::srmp3_palette)).set_format(palette_device::xRGB_555, 512); // sprites only
@@ -1213,29 +1210,29 @@ MACHINE_CONFIG_START(srmp2_state::srmp3)
aysnd.port_b_read_callback().set_ioport("DSW1");
aysnd.add_route(ALL_OUTPUTS, "mono", 0.20);
- MCFG_DEVICE_ADD("msm", MSM5205, 384000)
- MCFG_MSM5205_VCLK_CB(WRITELINE(*this, srmp2_state, adpcm_int)) /* IRQ handler */
- MCFG_MSM5205_PRESCALER_SELECTOR(S48_4B) /* 8 KHz, 4 Bits */
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.45)
-MACHINE_CONFIG_END
+ MSM5205(config, m_msm, 384000);
+ m_msm->vck_legacy_callback().set(FUNC(srmp2_state::adpcm_int)); /* IRQ handler */
+ m_msm->set_prescaler_selector(msm5205_device::S48_4B); /* 8 KHz, 4 Bits */
+ m_msm->add_route(ALL_OUTPUTS, "mono", 0.45);
+}
-MACHINE_CONFIG_START(srmp2_state::rmgoldyh)
+void srmp2_state::rmgoldyh(machine_config &config)
+{
srmp3(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(rmgoldyh_map)
- MCFG_DEVICE_IO_MAP(rmgoldyh_io_map)
+ m_maincpu->set_addrmap(AS_PROGRAM, &srmp2_state::rmgoldyh_map);
+ m_maincpu->set_addrmap(AS_IO, &srmp2_state::rmgoldyh_io_map);
MCFG_MACHINE_START_OVERRIDE(srmp2_state,rmgoldyh)
-MACHINE_CONFIG_END
-
-MACHINE_CONFIG_START(srmp2_state::mjyuugi)
+}
+void srmp2_state::mjyuugi(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M68000,16000000/2) /* 8.00 MHz */
- MCFG_DEVICE_PROGRAM_MAP(mjyuugi_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", srmp2_state, irq4_line_assert)
- MCFG_DEVICE_PERIODIC_INT_DRIVER(srmp2_state, irq2_line_assert, 15*60) /* Interrupt times is not understood */
+ M68000(config, m_maincpu, 16000000/2); /* 8.00 MHz */
+ m_maincpu->set_addrmap(AS_PROGRAM, &srmp2_state::mjyuugi_map);
+ m_maincpu->set_vblank_int("screen", FUNC(srmp2_state::irq4_line_assert));
+ m_maincpu->set_periodic_int(FUNC(srmp2_state::irq2_line_assert), attotime::from_hz(15*60)); /* Interrupt times is not understood */
MCFG_MACHINE_START_OVERRIDE(srmp2_state,mjyuugi)
@@ -1246,13 +1243,13 @@ MACHINE_CONFIG_START(srmp2_state::mjyuugi)
m_seta001->set_gfxbank_callback(FUNC(srmp2_state::srmp3_gfxbank_callback), this);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(400, 256-16)
- MCFG_SCREEN_VISIBLE_AREA(16, 400-1, 0, 256-1-16)
- MCFG_SCREEN_UPDATE_DRIVER(srmp2_state, screen_update_mjyuugi)
- MCFG_SCREEN_PALETTE("palette")
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(400, 256-16);
+ screen.set_visarea(16, 400-1, 0, 256-1-16);
+ screen.set_screen_update(FUNC(srmp2_state::screen_update_mjyuugi));
+ screen.set_palette("palette");
GFXDECODE(config, "gfxdecode", "palette", gfx_srmp3);
PALETTE(config, "palette").set_format(palette_device::xRGB_555, 512); // sprites only
@@ -1265,11 +1262,11 @@ MACHINE_CONFIG_START(srmp2_state::mjyuugi)
aysnd.port_b_read_callback().set_ioport("DSW1");
aysnd.add_route(ALL_OUTPUTS, "mono", 0.20);
- MCFG_DEVICE_ADD("msm", MSM5205, 384000)
- MCFG_MSM5205_VCLK_CB(WRITELINE(*this, srmp2_state, adpcm_int)) /* IRQ handler */
- MCFG_MSM5205_PRESCALER_SELECTOR(S48_4B) /* 8 KHz, 4 Bits */
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.45)
-MACHINE_CONFIG_END
+ MSM5205(config, m_msm, 384000);
+ m_msm->vck_legacy_callback().set(FUNC(srmp2_state::adpcm_int)); /* IRQ handler */
+ m_msm->set_prescaler_selector(msm5205_device::S48_4B); /* 8 KHz, 4 Bits */
+ m_msm->add_route(ALL_OUTPUTS, "mono", 0.45);
+}
diff --git a/src/mame/drivers/srmp5.cpp b/src/mame/drivers/srmp5.cpp
index 40096beda47..525e7be34bb 100644
--- a/src/mame/drivers/srmp5.cpp
+++ b/src/mame/drivers/srmp5.cpp
@@ -566,27 +566,27 @@ static GFXDECODE_START( gfx_srmp5 )
//GFXDECODE_ENTRY( "gfx1", 0, tile_16x16x8_layout, 0x0, 0x800 )
GFXDECODE_END
-MACHINE_CONFIG_START(srmp5_state::srmp5)
-
+void srmp5_state::srmp5(machine_config &config)
+{
/* basic machine hardware */
R3051(config, m_maincpu, 25000000);
m_maincpu->set_endianness(ENDIANNESS_LITTLE);
m_maincpu->set_addrmap(AS_PROGRAM, &srmp5_state::srmp5_mem);
m_maincpu->set_vblank_int("screen", FUNC(srmp5_state::irq4_line_assert));
- MCFG_DEVICE_ADD("soundcpu",ST0016_CPU,8000000)
- MCFG_DEVICE_PROGRAM_MAP(st0016_mem)
- MCFG_DEVICE_IO_MAP(st0016_io)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", srmp5_state, irq0_line_hold)
+ ST0016_CPU(config, m_soundcpu, 8000000);
+ m_soundcpu->set_addrmap(AS_PROGRAM, &srmp5_state::st0016_mem);
+ m_soundcpu->set_addrmap(AS_IO, &srmp5_state::st0016_io);
+ m_soundcpu->set_vblank_int("screen", FUNC(srmp5_state::irq0_line_hold));
- MCFG_QUANTUM_TIME(attotime::from_hz(6000))
+ config.m_minimum_quantum = attotime::from_hz(6000);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_SIZE(96*8, 64*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 42*8-1, 2*8, 32*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(srmp5_state, screen_update_srmp5)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_size(96*8, 64*8);
+ screen.set_visarea(0*8, 42*8-1, 2*8, 32*8-1);
+ screen.set_screen_update(FUNC(srmp5_state::screen_update_srmp5));
PALETTE(config, m_palette).set_format(palette_device::xBGR_555, 0x10000); // 0x20000? only first 0x1800 entries seem to be used outside memory test
m_palette->set_membits(16);
@@ -594,8 +594,8 @@ MACHINE_CONFIG_START(srmp5_state::srmp5)
#ifdef DEBUG_CHAR
GFXDECODE(config, m_gfxdecode, m_palette, gfx_srmp5);
#endif
+}
-MACHINE_CONFIG_END
ROM_START( srmp5 )
ROM_REGION( 0x200000, "maincpu", 0 ) // "PRG00" - "PRG03"
diff --git a/src/mame/drivers/srmp6.cpp b/src/mame/drivers/srmp6.cpp
index 08154034d1c..2643a5ee1b6 100644
--- a/src/mame/drivers/srmp6.cpp
+++ b/src/mame/drivers/srmp6.cpp
@@ -26,6 +26,8 @@ TODO:
- fix DMA operations
- fix video emulation
+Video reference : https://youtu.be/wNm3tu1iGvM
+
Are there other games on this 'System S12' hardware ???
---------------- dump infos ----------------
@@ -70,6 +72,7 @@ Dumped 06/15/2000
#include "emu.h"
#include "cpu/m68000/m68000.h"
+#include "video/bufsprite.h"
#include "sound/nile.h"
#include "emupal.h"
#include "screen.h"
@@ -81,51 +84,54 @@ class srmp6_state : public driver_device
public:
srmp6_state(const machine_config &mconfig, device_type type, const char *tag) :
driver_device(mconfig, type, tag),
- m_sprram(*this, "sprram"),
m_chrram(*this, "chrram"),
m_dmaram(*this, "dmaram"),
m_video_regs(*this, "video_regs"),
+ m_nile_region(*this, "nile"),
+ m_nile_bank(*this, "nile_bank"),
+ m_key_io(*this, "KEY%u", 0U),
m_maincpu(*this, "maincpu"),
m_gfxdecode(*this, "gfxdecode"),
- m_palette(*this, "palette")
+ m_palette(*this, "palette"),
+ m_sprram(*this, "sprram")
{ }
void srmp6(machine_config &config);
private:
- std::unique_ptr<uint16_t[]> m_tileram;
- required_shared_ptr<uint16_t> m_sprram;
- required_shared_ptr<uint16_t> m_chrram;
- optional_shared_ptr<uint16_t> m_dmaram;
- required_shared_ptr<uint16_t> m_video_regs;
+ std::unique_ptr<u16[]> m_tileram;
+ required_shared_ptr<u16> m_chrram;
+ optional_shared_ptr<u16> m_dmaram;
+ required_shared_ptr<u16> m_video_regs;
+ required_region_ptr<u8> m_nile_region;
- std::unique_ptr<uint16_t[]> m_sprram_old;
+ required_memory_bank m_nile_bank;
+ required_ioport_array<4> m_key_io;
int m_brightness;
- uint16_t m_input_select;
+ u16 m_input_select;
- unsigned short m_lastb;
- unsigned short m_lastb2;
+ u16 m_lastb;
+ u16 m_lastb2;
int m_destl;
- void init_INIT();
-
- DECLARE_WRITE16_MEMBER(srmp6_input_select_w);
- DECLARE_READ16_MEMBER(srmp6_inputs_r);
+ DECLARE_WRITE16_MEMBER(input_select_w);
+ DECLARE_READ16_MEMBER(inputs_r);
DECLARE_WRITE16_MEMBER(video_regs_w);
DECLARE_READ16_MEMBER(video_regs_r);
- DECLARE_WRITE16_MEMBER(srmp6_dma_w);
+ DECLARE_WRITE16_MEMBER(dma_w);
DECLARE_READ16_MEMBER(tileram_r);
DECLARE_WRITE16_MEMBER(tileram_w);
DECLARE_WRITE16_MEMBER(paletteram_w);
- DECLARE_READ16_MEMBER(srmp6_irq_ack_r);
+ DECLARE_READ16_MEMBER(irq_ack_r);
virtual void machine_start() override;
virtual void video_start() override;
- uint32_t screen_update_srmp6(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
+ u32 screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
void update_palette();
- uint32_t process(uint8_t b,uint32_t dst_offset);
+ u32 process(u8 b,u32 dst_offset);
required_device<cpu_device> m_maincpu;
required_device<gfxdecode_device> m_gfxdecode;
required_device<palette_device> m_palette;
+ required_device<buffered_spriteram16_device> m_sprram;
void srmp6_map(address_map &map);
};
@@ -137,105 +143,109 @@ static const gfx_layout tiles8x8_layout =
8,8,
(0x100000*16)/0x40,
8,
- { 0,1,2,3,4,5,6,7 },
- { 0*8,1*8,2*8,3*8,4*8,5*8,6*8,7*8 },
- { 0*64,1*64,2*64,3*64,4*64,5*64,6*64,7*64 },
+ { STEP8(0,1) },
+ { STEP8(0,8) },
+ { STEP8(0,8*8) },
8*64
};
+static inline u8 get_fade(int c, int f) // same as CPS3?
+{
+ // bit 7 unknown
+ // bit 6 fade enable / disable
+ // bit 5 fade mode
+ // bit 4-0 fade value
+ if (f & 0x40) // Fading enable / disable
+ {
+ f &= 0x3f;
+ c = (f & 0x20) ? (c + (((0x1f - c) * (f & 0x1f)) / 0x1f)) : ((c * f) / 0x1f);
+ c = std::max(0, std::min(0x1f, c));
+ }
+ return c;
+}
+
void srmp6_state::update_palette()
{
- int8_t r, g ,b;
- int brg = m_brightness - 0x60;
- int i;
+ int brg = m_brightness & 0x7f;
- for(i = 0; i < 0x800; i++)
+ for (int i = 0; i < m_palette->entries(); i++)
{
- r = m_palette->basemem().read16(i) >> 0 & 0x1F;
- g = m_palette->basemem().read16(i) >> 5 & 0x1F;
- b = m_palette->basemem().read16(i) >> 10 & 0x1F;
-
- if(brg < 0) {
- r += (r * brg) >> 5;
- if(r < 0) r = 0;
- g += (g * brg) >> 5;
- if(g < 0) g = 0;
- b += (b * brg) >> 5;
- if(b < 0) b = 0;
- }
- else if(brg > 0) {
- r += ((0x1F - r) * brg) >> 5;
- if(r > 0x1F) r = 0x1F;
- g += ((0x1F - g) * brg) >> 5;
- if(g > 0x1F) g = 0x1F;
- b += ((0x1F - b) * brg) >> 5;
- if(b > 0x1F) b = 0x1F;
+ u8 r = m_palette->basemem().read16(i) >> 0 & 0x1F;
+ u8 g = m_palette->basemem().read16(i) >> 5 & 0x1F;
+ u8 b = m_palette->basemem().read16(i) >> 10 & 0x1F;
+
+ if (brg & 0x40)
+ {
+ r = get_fade(r, brg);
+ g = get_fade(g, brg);
+ b = get_fade(b, brg);
}
- m_palette->set_pen_color(i, rgb_t(r << 3, g << 3, b << 3));
+ m_palette->set_pen_color(i, pal5bit(r), pal5bit(g), pal5bit(b));
}
}
void srmp6_state::video_start()
{
- m_tileram = make_unique_clear<uint16_t[]>(0x100000*16/2);
+ m_tileram = make_unique_clear<u16[]>(0x100000*16/2);
m_dmaram.allocate(0x100/2);
- m_sprram_old = make_unique_clear<uint16_t[]>(0x80000/2);
/* create the char set (gfx will then be updated dynamically from RAM) */
- m_gfxdecode->set_gfx(0, std::make_unique<gfx_element>(m_palette, tiles8x8_layout, (uint8_t*)m_tileram.get(), 0, m_palette->entries() / 256, 0));
+ m_gfxdecode->set_gfx(0, std::make_unique<gfx_element>(m_palette, tiles8x8_layout, (u8*)m_tileram.get(), 0, m_palette->entries() / 256, 0));
m_gfxdecode->gfx(0)->set_granularity(256);
- m_brightness = 0x60;
+ m_brightness = 0;
+
+ save_pointer(NAME(m_tileram), 0x100000*16/2);
+ save_item(NAME(m_brightness));
}
#if 0
-static int xixi=0;
+static int xixi = 0;
#endif
-uint32_t srmp6_state::screen_update_srmp6(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect)
+u32 srmp6_state::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect)
{
int alpha;
int x,y,tileno,height,width,xw,yw,sprite,xb,yb;
- uint16_t *sprite_list = m_sprram_old.get();
- uint16_t mainlist_offset = 0;
+ u16 *sprite_list = m_sprram->buffer();
+ u16 mainlist_offset = 0;
union
{
- int16_t a;
- uint16_t b;
+ s16 a;
+ u16 b;
} temp;
bitmap.fill(0, cliprect);
#if 0
/* debug */
- if(machine().input().code_pressed_once(KEYCODE_Q))
+ if (machine().input().code_pressed_once(KEYCODE_Q))
{
++xixi;
- printf("%x\n",xixi);
+ logerror("%x\n",xixi);
}
- if(machine().input().code_pressed_once(KEYCODE_W))
+ if (machine().input().code_pressed_once(KEYCODE_W))
{
--xixi;
- printf("%x\n",xixi);
+ logerror("%x\n",xixi);
}
#endif
/* Main spritelist is 0x0000 - 0x1fff in spriteram, sublists follow */
while (mainlist_offset<0x2000/2)
{
- uint16_t *sprite_sublist = &m_sprram_old[sprite_list[mainlist_offset+1]<<3];
- uint16_t sublist_length=sprite_list[mainlist_offset+0]&0x7fff; //+1 ?
- int16_t global_x,global_y, flip_x, flip_y;
- uint16_t global_pal;
+ u16 *sprite_sublist = &sprite_list[sprite_list[mainlist_offset+1]<<3];
+ u16 sublist_length=sprite_list[mainlist_offset+0] & 0x7fff; //+1 ?
+ s16 global_x,global_y, flip_x, flip_y;
+ u16 global_pal;
/* end of list marker */
if (sprite_list[mainlist_offset+0] == 0x8000)
break;
-
- if(sprite_list[mainlist_offset+0]!=0)
+ if (sprite_list[mainlist_offset+0] != 0)
{
temp.b=sprite_list[mainlist_offset+2];
global_x=temp.a;
@@ -244,19 +254,19 @@ uint32_t srmp6_state::screen_update_srmp6(screen_device &screen, bitmap_rgb32 &b
global_pal = sprite_list[mainlist_offset+4] & 0x7;
- if((sprite_list[mainlist_offset+5] & 0x700) == 0x700)
+ if ((sprite_list[mainlist_offset+5] & 0x700) == 0x700)
{
- alpha = (sprite_list[mainlist_offset+5] & 0x1F) << 3;
+ alpha = pal5bit(sprite_list[mainlist_offset+5] & 0x1F);
}
else
{
alpha = 255;
}
- // printf("%x %x \n",sprite_list[mainlist_offset+1],sublist_length);
+ // logerror("%x %x \n",sprite_list[mainlist_offset+1],sublist_length);
- while(sublist_length)
+ while (sublist_length)
{
- sprite=sprite_sublist[0]&0x7fff;
+ sprite=sprite_sublist[0] & 0x7fff;
flip_x=sprite_sublist[1]>>8&1;
flip_y=sprite_sublist[1]>>9&1;
temp.b=sprite_sublist[2];
@@ -266,26 +276,26 @@ uint32_t srmp6_state::screen_update_srmp6(screen_device &screen, bitmap_rgb32 &b
//x+=global_x;
//y+=global_y;
- width=((sprite_sublist[1])&0x3);
- height=((sprite_sublist[1]>>2)&0x3);
+ width=((sprite_sublist[1]) & 0x3);
+ height=((sprite_sublist[1]>>2) & 0x3);
height = 1 << height;
width = 1 << width;
y-=height*8;
tileno = sprite;
- //tileno += (sprite_list[4]&0xf)*0x4000; // this makes things worse in places (title screen for example)
+ //tileno += (sprite_list[4] & 0xf)*0x4000; // this makes things worse in places (title screen for example)
- for(xw=0;xw<width;xw++)
+ for (xw = 0; xw < width; xw++)
{
- for(yw=0;yw<height;yw++)
+ for (yw = 0; yw < height; yw++)
{
- if(!flip_x)
+ if (!flip_x)
xb=x+xw*8+global_x;
else
xb=x+(width-xw-1)*8+global_x;
- if(!flip_y)
+ if (!flip_y)
yb=y+yw*8+global_y;
else
yb=y+(height-yw-1)*8+global_y;
@@ -294,7 +304,6 @@ uint32_t srmp6_state::screen_update_srmp6(screen_device &screen, bitmap_rgb32 &b
tileno++;
}
}
-
sprite_sublist+=8;
--sublist_length;
}
@@ -302,9 +311,9 @@ uint32_t srmp6_state::screen_update_srmp6(screen_device &screen, bitmap_rgb32 &b
mainlist_offset+=8;
}
- memcpy(m_sprram_old.get(), m_sprram, 0x80000);
+ m_sprram->copy();
- if(machine().input().code_pressed_once(KEYCODE_Q))
+ if (machine().input().code_pressed_once(KEYCODE_Q))
{
FILE *p=fopen("tileram.bin","wb");
fwrite(m_tileram.get(), 1, 0x100000*16, p);
@@ -321,25 +330,23 @@ uint32_t srmp6_state::screen_update_srmp6(screen_device &screen, bitmap_rgb32 &b
void srmp6_state::machine_start()
{
- membank("bank1")->configure_entries(0, 16, memregion("nile")->base(), 0x200000);
+ m_nile_bank->configure_entries(0, 16, memregion("nile")->base(), 0x200000);
+ save_item(NAME(m_input_select));
}
-WRITE16_MEMBER(srmp6_state::srmp6_input_select_w)
+WRITE16_MEMBER(srmp6_state::input_select_w)
{
m_input_select = data & 0x0f;
}
-READ16_MEMBER(srmp6_state::srmp6_inputs_r)
+READ16_MEMBER(srmp6_state::inputs_r)
{
- if (offset == 0) // DSW
- return ioport("DSW")->read();
-
switch (m_input_select) // inputs
{
- case 1<<0: return ioport("KEY0")->read();
- case 1<<1: return ioport("KEY1")->read();
- case 1<<2: return ioport("KEY2")->read();
- case 1<<3: return ioport("KEY3")->read();
+ case 1<<0: return m_key_io[0]->read();
+ case 1<<1: return m_key_io[1]->read();
+ case 1<<2: return m_key_io[2]->read();
+ case 1<<3: return m_key_io[3]->read();
}
return 0;
@@ -348,20 +355,20 @@ READ16_MEMBER(srmp6_state::srmp6_inputs_r)
WRITE16_MEMBER(srmp6_state::video_regs_w)
{
- switch(offset)
+ switch (offset)
{
case 0x5e/2: // bank switch, used by ROM check
{
LOG(("%x\n",data));
- membank("bank1")->set_entry(data & 0x0f);
+ m_nile_bank->set_entry(data & 0x0f);
break;
}
// set by IT4
case 0x5c/2: // either 0x40 explicitely in many places, or according $2083b0 (IT4)
//Fade in/out (0x40(dark)-0x60(normal)-0x7e?(bright) reset by 0x00?
- data = (!data)?0x60:(data == 0x5e)?0x60:data;
- if (m_brightness != data) {
+ if (m_brightness != data)
+ {
m_brightness = data;
update_palette();
}
@@ -392,18 +399,17 @@ READ16_MEMBER(srmp6_state::video_regs_r)
/* DMA RLE stuff - the same as CPS3 */
-uint32_t srmp6_state::process(uint8_t b,uint32_t dst_offset)
+u32 srmp6_state::process(u8 b,u32 dst_offset)
{
- int l=0;
+ int l = 0;
- uint8_t *tram=(uint8_t*)m_tileram.get();
+ u8 *tram=(u8*)m_tileram.get();
if (m_lastb == m_lastb2) //rle
{
- int i;
- int rle=(b+1)&0xff;
+ int rle=(b+1) & 0xff;
- for(i=0;i<rle;++i)
+ for (int i = 0; i <rle; ++i)
{
tram[dst_offset + m_destl] = m_lastb;
m_gfxdecode->gfx(0)->mark_dirty((dst_offset + m_destl)/0x40);
@@ -427,18 +433,17 @@ uint32_t srmp6_state::process(uint8_t b,uint32_t dst_offset)
}
-WRITE16_MEMBER(srmp6_state::srmp6_dma_w)
+WRITE16_MEMBER(srmp6_state::dma_w)
{
- uint16_t* dmaram = m_dmaram;
+ u16* dmaram = m_dmaram;
COMBINE_DATA(&dmaram[offset]);
if (offset==13 && dmaram[offset]==0x40)
{
- const uint8_t *rom = memregion("nile")->base();
- uint32_t srctab=2*((((uint32_t)dmaram[5])<<16)|dmaram[4]);
- uint32_t srcdata=2*((((uint32_t)dmaram[11])<<16)|dmaram[10]);
- uint32_t len=4*(((((uint32_t)dmaram[7]&3)<<16)|dmaram[6])+1); //??? WRONG!
- int tempidx=0;
+ u32 srctab=2*((((u32)dmaram[5])<<16)|dmaram[4]);
+ u32 srcdata=2*((((u32)dmaram[11])<<16)|dmaram[10]);
+ u32 len=4*(((((u32)dmaram[7]&3)<<16)|dmaram[6])+1); //??? WRONG!
+ int tempidx = 0;
/* show params */
LOG(("DMA! %04x %04x %04x %04x %04x %04x %04x %04x %04x %04x %04x %04x %04x %04x\n",
@@ -462,22 +467,21 @@ WRITE16_MEMBER(srmp6_state::srmp6_dma_w)
m_lastb = 0xfffe;
m_lastb2 = 0xffff;
- while(1)
+ while (1)
{
- int i;
- uint8_t ctrl=rom[srcdata];
+ u8 ctrl=m_nile_region[srcdata];
++srcdata;
- for(i=0;i<8;++i)
+ for (int i = 0; i < 8; ++i)
{
- uint8_t p=rom[srcdata];
+ u8 p=m_nile_region[srcdata];
- if(ctrl&0x80)
+ if (ctrl & 0x80)
{
- uint8_t real_byte;
- real_byte = rom[srctab+p*2];
+ u8 real_byte;
+ real_byte = m_nile_region[srctab+p*2];
tempidx+=process(real_byte,tempidx);
- real_byte = rom[srctab+p*2+1];//px[DMA_XOR((current_table_address+p*2+1))];
+ real_byte = m_nile_region[srctab+p*2+1];//px[DMA_XOR((current_table_address+p*2+1))];
tempidx+=process(real_byte,tempidx);
}
else
@@ -488,8 +492,7 @@ WRITE16_MEMBER(srmp6_state::srmp6_dma_w)
ctrl<<=1;
++srcdata;
-
- if(tempidx>=len)
+ if (tempidx >= len)
{
LOG(("%x\n",srcdata));
return;
@@ -507,52 +510,38 @@ READ16_MEMBER(srmp6_state::tileram_r)
WRITE16_MEMBER(srmp6_state::tileram_w)
{
- //uint16_t tmp;
+ //u16 tmp;
COMBINE_DATA(&m_chrram[offset]);
/* are the DMA registers enabled some other way, or always mapped here, over RAM? */
if (offset >= 0xfff00/2 && offset <= 0xfff1a/2 )
{
offset &=0x1f;
- srmp6_dma_w(space,offset,data,mem_mask);
+ dma_w(space,offset,data,mem_mask);
}
}
WRITE16_MEMBER(srmp6_state::paletteram_w)
{
- int8_t r, g, b;
- int brg = m_brightness - 0x60;
+ int brg = m_brightness & 0x7f;
m_palette->write16(space, offset, data, mem_mask);
- if(brg)
+ if (brg & 0x40)
{
- r = data >> 0 & 0x1F;
- g = data >> 5 & 0x1F;
- b = data >> 10 & 0x1F;
-
- if(brg < 0) {
- r += (r * brg) >> 5;
- if(r < 0) r = 0;
- g += (g * brg) >> 5;
- if(g < 0) g = 0;
- b += (b * brg) >> 5;
- if(b < 0) b = 0;
- }
- else if(brg > 0) {
- r += ((0x1F - r) * brg) >> 5;
- if(r > 0x1F) r = 0x1F;
- g += ((0x1F - g) * brg) >> 5;
- if(g > 0x1F) g = 0x1F;
- b += ((0x1F - b) * brg) >> 5;
- if(b > 0x1F) b = 0x1F;
- }
+ u8 r = m_palette->basemem().read16(offset) >> 0 & 0x1F;
+ u8 g = m_palette->basemem().read16(offset) >> 5 & 0x1F;
+ u8 b = m_palette->basemem().read16(offset) >> 10 & 0x1F;
- m_palette->set_pen_color(offset, rgb_t(r << 3, g << 3, b << 3));
+ r = get_fade(r, brg);
+ g = get_fade(g, brg);
+ b = get_fade(b, brg);
+
+ m_palette->set_pen_color(offset, pal5bit(r), pal5bit(g), pal5bit(b));
}
}
-READ16_MEMBER(srmp6_state::srmp6_irq_ack_r)
+READ16_MEMBER(srmp6_state::irq_ack_r)
{
m_maincpu->set_input_line(4, CLEAR_LINE);
return 0; // value read doesn't matter
@@ -562,26 +551,29 @@ void srmp6_state::srmp6_map(address_map &map)
{
map(0x000000, 0x0fffff).rom();
map(0x200000, 0x23ffff).ram(); // work RAM
- map(0x600000, 0x7fffff).bankr("bank1"); // banked ROM (used by ROM check)
- map(0x800000, 0x9fffff).rom().region("user1", 0);
- map(0x300000, 0x300005).rw(FUNC(srmp6_state::srmp6_inputs_r), FUNC(srmp6_state::srmp6_input_select_w)); // inputs
- map(0x480000, 0x480fff).ram().w(FUNC(srmp6_state::paletteram_w)).share("palette");
- map(0x4d0000, 0x4d0001).r(FUNC(srmp6_state::srmp6_irq_ack_r));
+ map(0x300000, 0x300005).w(FUNC(srmp6_state::input_select_w)); // inputs
+ map(0x300000, 0x300001).portr("DSW");
+ map(0x300002, 0x300005).r(FUNC(srmp6_state::inputs_r)); // inputs
// OBJ RAM: checked [$400000-$47dfff]
map(0x400000, 0x47ffff).ram().share("sprram");
- // CHR RAM: checked [$500000-$5fffff]
- map(0x500000, 0x5fffff).rw(FUNC(srmp6_state::tileram_r), FUNC(srmp6_state::tileram_w)).share("chrram");
- //AM_RANGE(0x5fff00, 0x5fffff) AM_WRITE(dma_w) AM_SHARE("dmaram")
+ map(0x480000, 0x480fff).ram().w(FUNC(srmp6_state::paletteram_w)).share("palette");
map(0x4c0000, 0x4c006f).rw(FUNC(srmp6_state::video_regs_r), FUNC(srmp6_state::video_regs_w)).share("video_regs"); // ? gfx regs ST-0026 NiLe
+ map(0x4d0000, 0x4d0001).r(FUNC(srmp6_state::irq_ack_r));
map(0x4e0000, 0x4e00ff).rw("nile", FUNC(nile_device::nile_snd_r), FUNC(nile_device::nile_snd_w));
map(0x4e0100, 0x4e0101).rw("nile", FUNC(nile_device::nile_sndctrl_r), FUNC(nile_device::nile_sndctrl_w));
//AM_RANGE(0x4e0110, 0x4e0111) AM_NOP // ? accessed once ($268dc, written $b.w)
+
+ // CHR RAM: checked [$500000-$5fffff]
+ map(0x500000, 0x5fffff).rw(FUNC(srmp6_state::tileram_r), FUNC(srmp6_state::tileram_w)).share("chrram");
//AM_RANGE(0x5fff00, 0x5fff1f) AM_RAM // ? see routine $5ca8, video_regs related ???
+ //AM_RANGE(0x5fff00, 0x5fffff) AM_WRITE(dma_w) AM_SHARE("dmaram")
+ map(0x600000, 0x7fffff).bankr("nile_bank"); // banked ROM (used by ROM check)
+ map(0x800000, 0x9fffff).rom().region("user1", 0);
//AM_RANGE(0xf00004, 0xf00005) AM_RAM // ?
//AM_RANGE(0xf00006, 0xf00007) AM_RAM // ?
@@ -695,12 +687,14 @@ void srmp6_state::srmp6(machine_config &config)
screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
screen.set_size(64*8, 64*8);
screen.set_visarea(0*8, 42*8-1, 0*8, 30*8-1);
- screen.set_screen_update(FUNC(srmp6_state::screen_update_srmp6));
+ screen.set_screen_update(FUNC(srmp6_state::screen_update));
PALETTE(config, m_palette).set_format(palette_device::xBGR_555, 0x800);
GFXDECODE(config, m_gfxdecode, m_palette, gfxdecode_device::empty);
+ BUFFERED_SPRITERAM16(config, m_sprram);
+
/* sound hardware */
SPEAKER(config, "lspeaker").front_left();
SPEAKER(config, "rspeaker").front_right();
diff --git a/src/mame/drivers/srumbler.cpp b/src/mame/drivers/srumbler.cpp
index 1eb3d4490a0..be68eac5b0b 100644
--- a/src/mame/drivers/srumbler.cpp
+++ b/src/mame/drivers/srumbler.cpp
@@ -245,31 +245,31 @@ GFXDECODE_END
-MACHINE_CONFIG_START(srumbler_state::srumbler)
-
+void srumbler_state::srumbler(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", MC6809, 6000000) /* HD68B09P at 6 MHz (?) */
- MCFG_DEVICE_PROGRAM_MAP(srumbler_map)
- MCFG_TIMER_DRIVER_ADD_SCANLINE("scantimer", srumbler_state, interrupt, "screen", 0, 1)
+ MC6809(config, m_maincpu, 6000000); /* HD68B09P at 6 MHz (?) */
+ m_maincpu->set_addrmap(AS_PROGRAM, &srumbler_state::srumbler_map);
+ TIMER(config, "scantimer").configure_scanline(FUNC(srumbler_state::interrupt), "screen", 0, 1);
- MCFG_DEVICE_ADD("audiocpu", Z80, 3000000) /* 3 MHz ??? */
- MCFG_DEVICE_PROGRAM_MAP(srumbler_sound_map)
- MCFG_DEVICE_PERIODIC_INT_DRIVER(srumbler_state, irq0_line_hold, 4*60)
+ z80_device &audiocpu(Z80(config, "audiocpu", 3000000)); /* 3 MHz ??? */
+ audiocpu.set_addrmap(AS_PROGRAM, &srumbler_state::srumbler_sound_map);
+ audiocpu.set_periodic_int(FUNC(srumbler_state::irq0_line_hold), attotime::from_hz(4*60));
/* video hardware */
- MCFG_DEVICE_ADD("spriteram", BUFFERED_SPRITERAM8)
+ BUFFERED_SPRITERAM8(config, m_spriteram);
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(64*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(10*8, (64-10)*8-1, 1*8, 31*8-1 )
- MCFG_SCREEN_UPDATE_DRIVER(srumbler_state, screen_update)
- MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE("spriteram", buffered_spriteram8_device, vblank_copy_rising))
- MCFG_SCREEN_PALETTE(m_palette)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(64*8, 32*8);
+ screen.set_visarea(10*8, (64-10)*8-1, 1*8, 31*8-1 );
+ screen.set_screen_update(FUNC(srumbler_state::screen_update));
+ screen.screen_vblank().set(m_spriteram, FUNC(buffered_spriteram8_device::vblank_copy_rising));
+ screen.set_palette(m_palette);
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_srumbler)
+ GFXDECODE(config, m_gfxdecode, m_palette, gfx_srumbler);
PALETTE(config, m_palette).set_format(palette_device::RGBx_444, 512);
@@ -278,18 +278,18 @@ MACHINE_CONFIG_START(srumbler_state::srumbler)
GENERIC_LATCH_8(config, "soundlatch");
- MCFG_DEVICE_ADD("ym1", YM2203, 4000000)
- MCFG_SOUND_ROUTE(0, "mono", 0.10)
- MCFG_SOUND_ROUTE(1, "mono", 0.10)
- MCFG_SOUND_ROUTE(2, "mono", 0.10)
- MCFG_SOUND_ROUTE(3, "mono", 0.30)
-
- MCFG_DEVICE_ADD("ym2", YM2203, 4000000)
- MCFG_SOUND_ROUTE(0, "mono", 0.10)
- MCFG_SOUND_ROUTE(1, "mono", 0.10)
- MCFG_SOUND_ROUTE(2, "mono", 0.10)
- MCFG_SOUND_ROUTE(3, "mono", 0.30)
-MACHINE_CONFIG_END
+ ym2203_device &ym1(YM2203(config, "ym1", 4000000));
+ ym1.add_route(0, "mono", 0.10);
+ ym1.add_route(1, "mono", 0.10);
+ ym1.add_route(2, "mono", 0.10);
+ ym1.add_route(3, "mono", 0.30);
+
+ ym2203_device &ym2(YM2203(config, "ym2", 4000000));
+ ym2.add_route(0, "mono", 0.10);
+ ym2.add_route(1, "mono", 0.10);
+ ym2.add_route(2, "mono", 0.10);
+ ym2.add_route(3, "mono", 0.30);
+}
diff --git a/src/mame/drivers/ssem.cpp b/src/mame/drivers/ssem.cpp
index 8a1ac6410e1..ce1b398f9ab 100644
--- a/src/mame/drivers/ssem.cpp
+++ b/src/mame/drivers/ssem.cpp
@@ -634,20 +634,20 @@ void ssem_state::machine_reset()
MACHINE_CONFIG_START(ssem_state::ssem)
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", SSEMCPU, 700)
- MCFG_DEVICE_PROGRAM_MAP(ssem_map)
+ SSEMCPU(config, m_maincpu, 700);
+ m_maincpu->set_addrmap(AS_PROGRAM, &ssem_state::ssem_map);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(50)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(256, 280)
- MCFG_SCREEN_VISIBLE_AREA(0, 255, 0, 279)
- MCFG_SCREEN_UPDATE_DRIVER(ssem_state, screen_update_ssem)
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_refresh_hz(50);
+ m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ m_screen->set_size(256, 280);
+ m_screen->set_visarea(0, 255, 0, 279);
+ m_screen->set_screen_update(FUNC(ssem_state::screen_update_ssem));
PALETTE(config, "palette", palette_device::MONOCHROME);
/* quickload */
- MCFG_QUICKLOAD_ADD("quickload", ssem_state, ssem_store, "snp,asm", 1)
+ MCFG_QUICKLOAD_ADD("quickload", ssem_state, ssem_store, "snp,asm", attotime::from_seconds(1))
MACHINE_CONFIG_END
diff --git a/src/mame/drivers/ssfindo.cpp b/src/mame/drivers/ssfindo.cpp
index abb19fd6dc0..4bc633cb729 100644
--- a/src/mame/drivers/ssfindo.cpp
+++ b/src/mame/drivers/ssfindo.cpp
@@ -796,46 +796,45 @@ static INPUT_PORTS_START( tetfight )
INPUT_PORTS_END
-MACHINE_CONFIG_START(ssfindo_state::ssfindo)
-
+void ssfindo_state::ssfindo(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", ARM7, 54000000) // guess...
- MCFG_DEVICE_PROGRAM_MAP(ssfindo_map)
+ ARM7(config, m_maincpu, 54000000); // guess...
+ m_maincpu->set_addrmap(AS_PROGRAM, &ssfindo_state::ssfindo_map);
+ m_maincpu->set_vblank_int("screen", FUNC(ssfindo_state::interrupt));
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", ssfindo_state, interrupt)
+ I2C_24C01(config, m_i2cmem);
- MCFG_24C01_ADD("i2cmem")
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */
+ screen.set_size(320, 256);
+ screen.set_visarea(0, 319, 0, 239);
+ screen.set_screen_update(FUNC(ssfindo_state::screen_update));
+ screen.set_palette(m_palette);
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */)
- MCFG_SCREEN_SIZE(320, 256)
- MCFG_SCREEN_VISIBLE_AREA(0, 319, 0, 239)
- MCFG_SCREEN_UPDATE_DRIVER(ssfindo_state, screen_update)
- MCFG_SCREEN_PALETTE("palette")
-
- MCFG_PALETTE_ADD("palette", 256)
-MACHINE_CONFIG_END
+ PALETTE(config, m_palette).set_entries(256);
+}
-MACHINE_CONFIG_START(ssfindo_state::ppcar)
+void ssfindo_state::ppcar(machine_config &config)
+{
ssfindo(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(ppcar_map)
+ m_maincpu->set_addrmap(AS_PROGRAM, &ssfindo_state::ppcar_map);
- MCFG_DEVICE_REMOVE("i2cmem")
-MACHINE_CONFIG_END
+ config.device_remove("i2cmem");
+}
-MACHINE_CONFIG_START(ssfindo_state::tetfight)
+void ssfindo_state::tetfight(machine_config &config)
+{
ppcar(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(tetfight_map)
+ m_maincpu->set_addrmap(AS_PROGRAM, &ssfindo_state::tetfight_map);
- MCFG_24C02_ADD("i2cmem")
-MACHINE_CONFIG_END
+ I2C_24C02(config, m_i2cmem);
+}
ROM_START( ssfindo )
ROM_REGION(0x100000, "maincpu", 0 ) /* ARM 32 bit code */
diff --git a/src/mame/drivers/sshot.cpp b/src/mame/drivers/sshot.cpp
index 207fcd43a67..195a5abd836 100644
--- a/src/mame/drivers/sshot.cpp
+++ b/src/mame/drivers/sshot.cpp
@@ -344,27 +344,27 @@ static GFXDECODE_START( gfx_supershot )
GFXDECODE_ENTRY( "gfx", 0, supershot_charlayout, 0, 1 )
GFXDECODE_END
-MACHINE_CONFIG_START(supershot_state::supershot)
-
+void supershot_state::supershot(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", SCMP, XTAL(11'289'000)/4)
- MCFG_DEVICE_PROGRAM_MAP(supershot_map)
+ SCMP(config, m_maincpu, XTAL(11'289'000)/4);
+ m_maincpu->set_addrmap(AS_PROGRAM, &supershot_state::supershot_map);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500))
- MCFG_SCREEN_SIZE((32)*8, (32)*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 0*8, 32*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(supershot_state, screen_update_supershot)
- MCFG_SCREEN_PALETTE("palette")
-
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_supershot)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500));
+ screen.set_size((32)*8, (32)*8);
+ screen.set_visarea(0*8, 32*8-1, 0*8, 32*8-1);
+ screen.set_screen_update(FUNC(supershot_state::screen_update_supershot));
+ screen.set_palette("palette");
+
+ GFXDECODE(config, m_gfxdecode, "palette", gfx_supershot);
PALETTE(config, "palette", palette_device::MONOCHROME);
/* sound hardware */
//...
-MACHINE_CONFIG_END
+}
ROM_START( sshot )
diff --git a/src/mame/drivers/ssingles.cpp b/src/mame/drivers/ssingles.cpp
index ec22d683741..c95a32a9c47 100644
--- a/src/mame/drivers/ssingles.cpp
+++ b/src/mame/drivers/ssingles.cpp
@@ -161,8 +161,9 @@ class ssingles_state : public driver_device
{
public:
ssingles_state(const machine_config &mconfig, device_type type, const char *tag)
- : driver_device(mconfig, type, tag),
- m_maincpu(*this, "maincpu") { }
+ : driver_device(mconfig, type, tag)
+ , m_maincpu(*this, "maincpu")
+ { }
void ssingles(machine_config &config);
void atamanot(machine_config &config);
@@ -171,6 +172,9 @@ public:
DECLARE_CUSTOM_INPUT_MEMBER(controls_r);
+protected:
+ virtual void video_start() override;
+
private:
uint8_t m_videoram[VMEM_SIZE];
uint8_t m_colorram[VMEM_SIZE];
@@ -178,6 +182,9 @@ private:
pen_t m_pens[NUM_PENS];
uint8_t m_atamanot_prot_state;
+
+ required_device<cpu_device> m_maincpu;
+
DECLARE_WRITE8_MEMBER(ssingles_videoram_w);
DECLARE_WRITE8_MEMBER(ssingles_colorram_w);
DECLARE_READ8_MEMBER(c000_r);
@@ -186,11 +193,10 @@ private:
DECLARE_READ8_MEMBER(atamanot_prot_r);
DECLARE_WRITE8_MEMBER(atamanot_prot_w);
- virtual void video_start() override;
DECLARE_WRITE_LINE_MEMBER(atamanot_irq);
MC6845_UPDATE_ROW(ssingles_update_row);
MC6845_UPDATE_ROW(atamanot_update_row);
- required_device<cpu_device> m_maincpu;
+
void atamanot_io_map(address_map &map);
void atamanot_map(address_map &map);
void ssingles_io_map(address_map &map);
@@ -198,16 +204,16 @@ private:
};
//fake palette
-static const uint8_t ssingles_colors[NUM_PENS*3]=
+static constexpr rgb_t ssingles_colors[NUM_PENS] =
{
- 0x00,0x00,0x00, 0xff,0xff,0xff, 0xff,0x00,0x00, 0x80,0x00,0x00,
- 0x00,0x00,0x00, 0xf0,0xf0,0xf0, 0xff,0xff,0x00, 0x40,0x40,0x40,
- 0x00,0x00,0x00, 0xff,0xff,0xff, 0xff,0x00,0x00, 0xff,0xff,0x00,
- 0x00,0x00,0x00, 0xff,0xff,0x00, 0xd0,0x00,0x00, 0x80,0x00,0x00,
- 0x00,0x00,0x00, 0xff,0x00,0x00, 0xff,0xff,0x00, 0x80,0x80,0x00,
- 0x00,0x00,0x00, 0xff,0x00,0x00, 0x40,0x40,0x40, 0xd0,0xd0,0xd0,
- 0x00,0x00,0x00, 0x00,0x00,0xff, 0x60,0x40,0x30, 0xff,0xff,0x00,
- 0x00,0x00,0x00, 0xff,0x00,0xff, 0x80,0x00,0x80, 0x40,0x00,0x40
+ { 0x00,0x00,0x00 }, { 0xff,0xff,0xff }, { 0xff,0x00,0x00 }, { 0x80,0x00,0x00 },
+ { 0x00,0x00,0x00 }, { 0xf0,0xf0,0xf0 }, { 0xff,0xff,0x00 }, { 0x40,0x40,0x40 },
+ { 0x00,0x00,0x00 }, { 0xff,0xff,0xff }, { 0xff,0x00,0x00 }, { 0xff,0xff,0x00 },
+ { 0x00,0x00,0x00 }, { 0xff,0xff,0x00 }, { 0xd0,0x00,0x00 }, { 0x80,0x00,0x00 },
+ { 0x00,0x00,0x00 }, { 0xff,0x00,0x00 }, { 0xff,0xff,0x00 }, { 0x80,0x80,0x00 },
+ { 0x00,0x00,0x00 }, { 0xff,0x00,0x00 }, { 0x40,0x40,0x40 }, { 0xd0,0xd0,0xd0 },
+ { 0x00,0x00,0x00 }, { 0x00,0x00,0xff }, { 0x60,0x40,0x30 }, { 0xff,0xff,0x00 },
+ { 0x00,0x00,0x00 }, { 0xff,0x00,0xff }, { 0x80,0x00,0x80 }, { 0x40,0x00,0x40 }
};
MC6845_UPDATE_ROW( ssingles_state::ssingles_update_row )
@@ -300,13 +306,8 @@ WRITE8_MEMBER(ssingles_state::ssingles_colorram_w)
void ssingles_state::video_start()
{
- {
- int i;
- for(i=0;i<NUM_PENS;++i)
- {
- m_pens[i]=rgb_t(ssingles_colors[3*i], ssingles_colors[3*i+1], ssingles_colors[3*i+2]);
- }
- }
+ for (int i=0; i<NUM_PENS; ++i)
+ m_pens[i] = ssingles_colors[i];
}
@@ -552,19 +553,19 @@ static GFXDECODE_START( gfx_atamanot )
GFXDECODE_ENTRY( "kanji_lc", 0, layout_8x16, 0, 8 )
GFXDECODE_END
-MACHINE_CONFIG_START(ssingles_state::ssingles)
-
- MCFG_DEVICE_ADD("maincpu", Z80,4000000) /* ? MHz */
- MCFG_DEVICE_PROGRAM_MAP(ssingles_map)
- MCFG_DEVICE_IO_MAP(ssingles_io_map)
+void ssingles_state::ssingles(machine_config &config)
+{
+ Z80(config, m_maincpu, 4000000); /* ? MHz */
+ m_maincpu->set_addrmap(AS_PROGRAM, &ssingles_state::ssingles_map);
+ m_maincpu->set_addrmap(AS_IO, &ssingles_state::ssingles_io_map);
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_RAW_PARAMS(4000000, 256, 0, 256, 256, 0, 256) /* temporary, CRTC will configure screen */
- MCFG_SCREEN_UPDATE_DEVICE("crtc", mc6845_device, screen_update)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_raw(4000000, 256, 0, 256, 256, 0, 256); /* temporary, CRTC will configure screen */
+ screen.set_screen_update("crtc", FUNC(mc6845_device::screen_update));
- MCFG_PALETTE_ADD("palette", 4) //guess
+ PALETTE(config, "palette").set_entries(4); //guess
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_ssingles)
+ GFXDECODE(config, "gfxdecode", "palette", gfx_ssingles);
mc6845_device &crtc(MC6845(config, "crtc", 1000000 /* ? MHz */));
crtc.set_screen("screen");
@@ -579,26 +580,26 @@ MACHINE_CONFIG_START(ssingles_state::ssingles)
AY8910(config, "ay1", 1500000).add_route(ALL_OUTPUTS, "mono", 0.5); /* ? MHz */
AY8910(config, "ay2", 1500000).add_route(ALL_OUTPUTS, "mono", 0.5); /* ? MHz */
-
-MACHINE_CONFIG_END
+}
WRITE_LINE_MEMBER(ssingles_state::atamanot_irq)
{
// ...
}
-MACHINE_CONFIG_START(ssingles_state::atamanot)
+void ssingles_state::atamanot(machine_config &config)
+{
ssingles(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(atamanot_map)
- MCFG_DEVICE_IO_MAP(atamanot_io_map)
+
+ m_maincpu->set_addrmap(AS_PROGRAM, &ssingles_state::atamanot_map);
+ m_maincpu->set_addrmap(AS_IO, &ssingles_state::atamanot_io_map);
mc6845_device &crtc(*subdevice<mc6845_device>("crtc"));
crtc.set_update_row_callback(FUNC(ssingles_state::atamanot_update_row), this);
crtc.out_vsync_callback().set(FUNC(ssingles_state::atamanot_irq));
- MCFG_GFXDECODE_MODIFY("gfxdecode", gfx_atamanot)
-MACHINE_CONFIG_END
+ subdevice<gfxdecode_device>("gfxdecode")->set_info(gfx_atamanot);
+}
ROM_START( ssingles )
ROM_REGION( 0x10000, "maincpu", 0 ) /* Z80 main CPU */
diff --git a/src/mame/drivers/sslam.cpp b/src/mame/drivers/sslam.cpp
index d9a2dbe60db..634bfc7eb90 100644
--- a/src/mame/drivers/sslam.cpp
+++ b/src/mame/drivers/sslam.cpp
@@ -219,7 +219,7 @@ static const uint8_t sslam_snd_loop[8][19] =
TIMER_CALLBACK_MEMBER(sslam_state::music_playback)
{
int pattern = 0;
- if ((m_oki->read_status() & 0x08) == 0)
+ if ((m_oki->read() & 0x08) == 0)
{
m_bar += 1;
pattern = sslam_snd_loop[m_melody][m_bar];
@@ -230,8 +230,8 @@ TIMER_CALLBACK_MEMBER(sslam_state::music_playback)
pattern = sslam_snd_loop[m_melody][m_bar];
}
logerror("Changing bar in music track to pattern %02x\n",pattern);
- m_oki->write_command(0x80 | pattern);
- m_oki->write_command(0x81);
+ m_oki->write(0x80 | pattern);
+ m_oki->write(0x81);
}
else if (pattern == 0x00) { /* Non-looped track. Stop playing it */
m_track = 0;
@@ -251,7 +251,7 @@ TIMER_CALLBACK_MEMBER(sslam_state::music_playback)
void sslam_state::sslam_play(int track, int data)
{
- int status = m_oki->read_status();
+ int status = m_oki->read();
if (data < 0x80) {
if (track) {
@@ -259,24 +259,24 @@ void sslam_state::sslam_play(int track, int data)
m_track = data;
m_bar = 0;
if (status & 0x08)
- m_oki->write_command(0x40);
- m_oki->write_command((0x80 | data));
- m_oki->write_command(0x81);
+ m_oki->write(0x40);
+ m_oki->write((0x80 | data));
+ m_oki->write(0x81);
m_music_timer->adjust(attotime::from_msec(4), 0, attotime::from_hz(250)); /* 250Hz for smooth sequencing */
}
}
else {
if ((status & 0x01) == 0) {
- m_oki->write_command((0x80 | data));
- m_oki->write_command(0x11);
+ m_oki->write((0x80 | data));
+ m_oki->write(0x11);
}
else if ((status & 0x02) == 0) {
- m_oki->write_command((0x80 | data));
- m_oki->write_command(0x21);
+ m_oki->write((0x80 | data));
+ m_oki->write(0x21);
}
else if ((status & 0x04) == 0) {
- m_oki->write_command((0x80 | data));
- m_oki->write_command(0x41);
+ m_oki->write((0x80 | data));
+ m_oki->write(0x41);
}
}
}
@@ -288,7 +288,7 @@ void sslam_state::sslam_play(int track, int data)
m_bar = 0;
}
data &= 0x7f;
- m_oki->write_command(data);
+ m_oki->write(data);
}
}
@@ -430,7 +430,7 @@ READ8_MEMBER(sslam_state::playmark_snd_command_r)
data = m_soundlatch->read(space,0);
}
else if ((m_oki_control & 0x38) == 0x28) {
- data = (m_oki->read(space,0) & 0x0f);
+ data = (m_oki->read() & 0x0f);
}
return data;
@@ -456,7 +456,7 @@ WRITE8_MEMBER(sslam_state::playmark_snd_control_w)
if ((data & 0x38) == 0x18)
{
- m_oki->write(space, 0, m_oki_command);
+ m_oki->write(m_oki_command);
}
// !(data & 0x80) -> sound enable
diff --git a/src/mame/drivers/ssozumo.cpp b/src/mame/drivers/ssozumo.cpp
index efab2602a00..269406a9c8f 100644
--- a/src/mame/drivers/ssozumo.cpp
+++ b/src/mame/drivers/ssozumo.cpp
@@ -194,27 +194,27 @@ INTERRUPT_GEN_MEMBER(ssozumo_state::sound_timer_irq)
device.execute().pulse_input_line(INPUT_LINE_NMI, attotime::zero);
}
-MACHINE_CONFIG_START(ssozumo_state::ssozumo)
-
+void ssozumo_state::ssozumo(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M6502, 1200000) /* 1.2 MHz ???? */
- MCFG_DEVICE_PROGRAM_MAP(ssozumo_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", ssozumo_state, irq0_line_hold)
+ M6502(config, m_maincpu, 1200000); /* 1.2 MHz ???? */
+ m_maincpu->set_addrmap(AS_PROGRAM, &ssozumo_state::ssozumo_map);
+ m_maincpu->set_vblank_int("screen", FUNC(ssozumo_state::irq0_line_hold));
- MCFG_DEVICE_ADD("audiocpu", M6502, 975000) /* 975 kHz ?? */
- MCFG_DEVICE_PROGRAM_MAP(ssozumo_sound_map)
- MCFG_DEVICE_PERIODIC_INT_DRIVER(ssozumo_state, sound_timer_irq, 272/16*57) // guess, assume to be the same as tagteam
+ M6502(config, m_audiocpu, 975000); /* 975 kHz ?? */
+ m_audiocpu->set_addrmap(AS_PROGRAM, &ssozumo_state::ssozumo_sound_map);
+ m_audiocpu->set_periodic_int(FUNC(ssozumo_state::sound_timer_irq), attotime::from_hz(272/16*57)); // guess, assume to be the same as tagteam
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
-// MCFG_SCREEN_REFRESH_RATE(60)
-// MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */)
-// MCFG_SCREEN_SIZE(32*8, 32*8)
-// MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8 - 1, 1*8, 31*8 - 1)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+// screen.set_refresh_hz(60);
+// screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500) /* not accurate */);
+// screen.set_size(32*8, 32*8);
+// screen.set_visarea(0*8, 32*8 - 1, 1*8, 31*8 - 1);
// DECO video CRTC, unverified
- MCFG_SCREEN_RAW_PARAMS(XTAL(12'000'000)/2,384,0,256,272,8,248)
- MCFG_SCREEN_UPDATE_DRIVER(ssozumo_state, screen_update)
- MCFG_SCREEN_PALETTE(m_palette)
+ screen.set_raw(XTAL(12'000'000)/2,384,0,256,272,8,248);
+ screen.set_screen_update(FUNC(ssozumo_state::screen_update));
+ screen.set_palette(m_palette);
GFXDECODE(config, m_gfxdecode, m_palette, gfx_ssozumo);
PALETTE(config, m_palette, FUNC(ssozumo_state::ssozumo_palette), 64 + 16);
@@ -227,10 +227,11 @@ MACHINE_CONFIG_START(ssozumo_state::ssozumo)
YM2149(config, "ay1", 1500000).add_route(ALL_OUTPUTS, "speaker", 0.3);
YM2149(config, "ay2", 1500000).add_route(ALL_OUTPUTS, "speaker", 0.3);
- MCFG_DEVICE_ADD("dac", DAC_8BIT_R2R, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 0.3) // unknown DAC
- MCFG_DEVICE_ADD("vref", VOLTAGE_REGULATOR, 0) MCFG_VOLTAGE_REGULATOR_OUTPUT(5.0)
- MCFG_SOUND_ROUTE(0, "dac", 1.0, DAC_VREF_POS_INPUT) MCFG_SOUND_ROUTE(0, "dac", -1.0, DAC_VREF_NEG_INPUT)
-MACHINE_CONFIG_END
+ DAC_8BIT_R2R(config, "dac", 0).add_route(ALL_OUTPUTS, "speaker", 0.3); // unknown DAC
+ voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref"));
+ vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT);
+ vref.add_route(0, "dac", -1.0, DAC_VREF_NEG_INPUT);
+}
diff --git a/src/mame/drivers/sspeedr.cpp b/src/mame/drivers/sspeedr.cpp
index 199fce035cb..fdab0a73dfa 100644
--- a/src/mame/drivers/sspeedr.cpp
+++ b/src/mame/drivers/sspeedr.cpp
@@ -188,31 +188,31 @@ static GFXDECODE_START( gfx_sspeedr )
GFXDECODE_END
-MACHINE_CONFIG_START(sspeedr_state::sspeedr)
-
+void sspeedr_state::sspeedr(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, XTAL(19'968'000)/8)
- MCFG_DEVICE_PROGRAM_MAP(sspeedr_map)
- MCFG_DEVICE_IO_MAP(sspeedr_io_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", sspeedr_state, irq0_line_assert)
+ Z80(config, m_maincpu, XTAL(19'968'000)/8);
+ m_maincpu->set_addrmap(AS_PROGRAM, &sspeedr_state::sspeedr_map);
+ m_maincpu->set_addrmap(AS_IO, &sspeedr_state::sspeedr_io_map);
+ m_maincpu->set_vblank_int("screen", FUNC(sspeedr_state::irq0_line_assert));
WATCHDOG_TIMER(config, "watchdog");
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(59.39)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(16 * 1000000 / 15680))
- MCFG_SCREEN_SIZE(376, 256)
- MCFG_SCREEN_VISIBLE_AREA(0, 375, 0, 247)
- MCFG_SCREEN_UPDATE_DRIVER(sspeedr_state, screen_update_sspeedr)
- MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE(*this, sspeedr_state, screen_vblank_sspeedr))
- MCFG_SCREEN_PALETTE(m_palette)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(59.39);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(16 * 1000000 / 15680));
+ screen.set_size(376, 256);
+ screen.set_visarea(0, 375, 0, 247);
+ screen.set_screen_update(FUNC(sspeedr_state::screen_update_sspeedr));
+ screen.screen_vblank().set(FUNC(sspeedr_state::screen_vblank_sspeedr));
+ screen.set_palette(m_palette);
GFXDECODE(config, m_gfxdecode, m_palette, gfx_sspeedr);
PALETTE(config, m_palette, FUNC(sspeedr_state::sspeedr_palette), 16);
/* sound hardware */
-MACHINE_CONFIG_END
+}
ROM_START( sspeedr )
diff --git a/src/mame/drivers/ssrj.cpp b/src/mame/drivers/ssrj.cpp
index c9525374917..62dae0c18e5 100644
--- a/src/mame/drivers/ssrj.cpp
+++ b/src/mame/drivers/ssrj.cpp
@@ -140,22 +140,22 @@ static GFXDECODE_START( gfx_ssrj )
GFXDECODE_ENTRY( "gfx1", 0, charlayout, 0, 0x10 )
GFXDECODE_END
-MACHINE_CONFIG_START(ssrj_state::ssrj)
-
+void ssrj_state::ssrj(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80,8000000/2)
- MCFG_DEVICE_PROGRAM_MAP(ssrj_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", ssrj_state, irq0_line_hold)
+ Z80(config, m_maincpu, 8000000/2);
+ m_maincpu->set_addrmap(AS_PROGRAM, &ssrj_state::ssrj_map);
+ m_maincpu->set_vblank_int("screen", FUNC(ssrj_state::irq0_line_hold));
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(40*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 34*8-1, 1*8, 31*8-1) // unknown res
- MCFG_SCREEN_UPDATE_DRIVER(ssrj_state, screen_update)
- MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE(*this, ssrj_state, screen_vblank))
- MCFG_SCREEN_PALETTE(m_palette)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(40*8, 32*8);
+ screen.set_visarea(0*8, 34*8-1, 1*8, 31*8-1); // unknown res
+ screen.set_screen_update(FUNC(ssrj_state::screen_update));
+ screen.screen_vblank().set(FUNC(ssrj_state::screen_vblank));
+ screen.set_palette(m_palette);
GFXDECODE(config, m_gfxdecode, m_palette, gfx_ssrj);
PALETTE(config, m_palette, FUNC(ssrj_state::ssrj_palette), 128);
@@ -166,7 +166,7 @@ MACHINE_CONFIG_START(ssrj_state::ssrj)
ay8910_device &aysnd(AY8910(config, "aysnd", 8000000/5));
aysnd.port_b_read_callback().set_ioport("IN3");
aysnd.add_route(ALL_OUTPUTS, "mono", 0.30);
-MACHINE_CONFIG_END
+}
/***************************************************************************
diff --git a/src/mame/drivers/sstrangr.cpp b/src/mame/drivers/sstrangr.cpp
index 472f4a49740..752f772fcfa 100644
--- a/src/mame/drivers/sstrangr.cpp
+++ b/src/mame/drivers/sstrangr.cpp
@@ -194,24 +194,23 @@ static INPUT_PORTS_START( sstrangr )
INPUT_PORTS_END
-MACHINE_CONFIG_START(sstrangr_state::sstrangr)
-
+void sstrangr_state::sstrangr(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu",I8080,1996800) /* clock is a guess, taken from mw8080bw */
- MCFG_DEVICE_PROGRAM_MAP(sstrangr_map)
- MCFG_DEVICE_IO_MAP(sstrangr_io_map)
- MCFG_DEVICE_PERIODIC_INT_DRIVER(sstrangr_state, irq0_line_hold, 2*60)
+ I8080(config, m_maincpu, 1996800); /* clock is a guess, taken from mw8080bw */
+ m_maincpu->set_addrmap(AS_PROGRAM, &sstrangr_state::sstrangr_map);
+ m_maincpu->set_addrmap(AS_IO, &sstrangr_state::sstrangr_io_map);
+ m_maincpu->set_periodic_int(FUNC(sstrangr_state::irq0_line_hold), attotime::from_hz(2*60));
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_SIZE(32*8, 262) /* vert size is a guess, taken from mw8080bw */
- MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 4*8, 32*8-1)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_UPDATE_DRIVER(sstrangr_state, screen_update_sstrangr)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_size(32*8, 262); /* vert size is a guess, taken from mw8080bw */
+ screen.set_visarea(0*8, 32*8-1, 4*8, 32*8-1);
+ screen.set_refresh_hz(60);
+ screen.set_screen_update(FUNC(sstrangr_state::screen_update_sstrangr));
/* sound hardware */
-
-MACHINE_CONFIG_END
+}
@@ -264,17 +263,15 @@ static INPUT_PORTS_START( sstrngr2 )
INPUT_PORTS_END
-MACHINE_CONFIG_START(sstrangr_state::sstrngr2)
+void sstrangr_state::sstrngr2(machine_config &config)
+{
sstrangr(config);
- /* basic machine hardware */
-
/* video hardware */
- MCFG_SCREEN_MODIFY("screen")
- MCFG_SCREEN_UPDATE_DRIVER(sstrangr_state, screen_update_sstrngr2)
+ subdevice<screen_device>("screen")->set_screen_update(FUNC(sstrangr_state::screen_update_sstrngr2));
PALETTE(config, m_palette, palette_device::RBG_3BIT);
-MACHINE_CONFIG_END
+}
diff --git a/src/mame/drivers/ssv.cpp b/src/mame/drivers/ssv.cpp
index 1f6e65e7c1c..b3e49b25fe5 100644
--- a/src/mame/drivers/ssv.cpp
+++ b/src/mame/drivers/ssv.cpp
@@ -455,7 +455,7 @@ void ssv_state::drifto94_map(address_map &map)
READ16_MEMBER(ssv_state::gdfs_eeprom_r)
{
- return m_adc->data_r(space, 0) | (m_eeprom->do_read() << 8);
+ return m_adc->data_r() | (m_eeprom->do_read() << 8);
}
WRITE16_MEMBER(ssv_state::gdfs_eeprom_w)
@@ -477,7 +477,7 @@ WRITE16_MEMBER(ssv_state::gdfs_eeprom_w)
// clock line asserted: write latch or select next bit to read
m_eeprom->clk_write(BIT(data, 13) ? ASSERT_LINE : CLEAR_LINE);
- m_adc->address_w(space, 0, (data & 0x0700) >> 8);
+ m_adc->address_w((data & 0x0700) >> 8);
m_adc->start_w(BIT(data, 11));
}
}
diff --git a/src/mame/drivers/st17xx.cpp b/src/mame/drivers/st17xx.cpp
index fb0d51cb550..72bb94eae28 100644
--- a/src/mame/drivers/st17xx.cpp
+++ b/src/mame/drivers/st17xx.cpp
@@ -91,21 +91,22 @@ void st17xx_state::machine_start()
/* Machine Driver */
-MACHINE_CONFIG_START(st17xx_state::st17xx)
+void st17xx_state::st17xx(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", ARM7, 50000000) /* speed unknown */
- MCFG_DEVICE_PROGRAM_MAP(cpu_map)
+ arm7_cpu_device &maincpu(ARM7(config, "maincpu", 50000000)); /* speed unknown */
+ maincpu.set_addrmap(AS_PROGRAM, &st17xx_state::cpu_map);
/* video hardware */
- MCFG_SCREEN_ADD(SCREEN_TAG, RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */
- MCFG_SCREEN_UPDATE_DRIVER(st17xx_state, screen_update)
- MCFG_SCREEN_SIZE(640, 480)
- MCFG_SCREEN_VISIBLE_AREA(0, 640-1, 0, 480-1)
-
- MCFG_PALETTE_ADD("palette", 64)
-MACHINE_CONFIG_END
+ screen_device &screen(SCREEN(config, SCREEN_TAG, SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */
+ screen.set_screen_update(FUNC(st17xx_state::screen_update));
+ screen.set_size(640, 480);
+ screen.set_visarea(0, 640-1, 0, 480-1);
+
+ PALETTE(config, "palette").set_entries(64);
+}
/* ROMs */
diff --git a/src/mame/drivers/st_mp100.cpp b/src/mame/drivers/st_mp100.cpp
index 720ee21fece..6b6fc7f13cf 100644
--- a/src/mame/drivers/st_mp100.cpp
+++ b/src/mame/drivers/st_mp100.cpp
@@ -709,10 +709,11 @@ TIMER_DEVICE_CALLBACK_MEMBER( st_mp100_state::u11_timer )
m_pia_u11->ca1_w(m_u11_timer);
}
-MACHINE_CONFIG_START(st_mp100_state::st_mp100)
+void st_mp100_state::st_mp100(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M6800, 1000000) // no xtal, just 2 chips forming a random oscillator
- MCFG_DEVICE_PROGRAM_MAP(st_mp100_map)
+ M6800(config, m_maincpu, 1000000); // no xtal, just 2 chips forming a random oscillator
+ m_maincpu->set_addrmap(AS_PROGRAM, &st_mp100_state::st_mp100_map);
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
@@ -732,7 +733,7 @@ MACHINE_CONFIG_START(st_mp100_state::st_mp100)
m_pia_u10->cb2_handler().set(FUNC(st_mp100_state::u10_cb2_w));
m_pia_u10->irqa_handler().set_inputline("maincpu", M6800_IRQ_LINE);
m_pia_u10->irqb_handler().set_inputline("maincpu", M6800_IRQ_LINE);
- MCFG_TIMER_DRIVER_ADD_PERIODIC("timer_x", st_mp100_state, timer_x, attotime::from_hz(120)) // mains freq*2
+ TIMER(config, "timer_x").configure_periodic(FUNC(st_mp100_state::timer_x), attotime::from_hz(120)); // mains freq*2
PIA6821(config, m_pia_u11, 0);
m_pia_u11->readpa_handler().set(FUNC(st_mp100_state::u11_a_r));
@@ -742,8 +743,8 @@ MACHINE_CONFIG_START(st_mp100_state::st_mp100)
m_pia_u11->cb2_handler().set(FUNC(st_mp100_state::u11_cb2_w));
m_pia_u11->irqa_handler().set_inputline("maincpu", M6800_IRQ_LINE);
m_pia_u11->irqb_handler().set_inputline("maincpu", M6800_IRQ_LINE);
- MCFG_TIMER_DRIVER_ADD_PERIODIC("timer_d", st_mp100_state, u11_timer, attotime::from_hz(634)) // 555 timer*2
-MACHINE_CONFIG_END
+ TIMER(config, "timer_d").configure_periodic(FUNC(st_mp100_state::u11_timer), attotime::from_hz(634)); // 555 timer*2
+}
/*--------------------------------
diff --git a/src/mame/drivers/st_mp200.cpp b/src/mame/drivers/st_mp200.cpp
index d26b452066d..2584e2948b0 100644
--- a/src/mame/drivers/st_mp200.cpp
+++ b/src/mame/drivers/st_mp200.cpp
@@ -580,10 +580,11 @@ TIMER_DEVICE_CALLBACK_MEMBER( st_mp200_state::u11_timer )
m_pia_u11->ca1_w(m_u11_timer);
}
-MACHINE_CONFIG_START(st_mp200_state::st_mp200)
+void st_mp200_state::st_mp200(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M6800, 1000000) // no xtal, just 2 chips forming a random oscillator
- MCFG_DEVICE_PROGRAM_MAP(st_mp200_map)
+ M6800(config, m_maincpu, 1000000); // no xtal, just 2 chips forming a random oscillator
+ m_maincpu->set_addrmap(AS_PROGRAM, &st_mp200_state::st_mp200_map);
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
@@ -603,7 +604,7 @@ MACHINE_CONFIG_START(st_mp200_state::st_mp200)
m_pia_u10->cb2_handler().set(FUNC(st_mp200_state::u10_cb2_w));
m_pia_u10->irqa_handler().set_inputline("maincpu", M6800_IRQ_LINE);
m_pia_u10->irqb_handler().set_inputline("maincpu", M6800_IRQ_LINE);
- MCFG_TIMER_DRIVER_ADD_PERIODIC("timer_x", st_mp200_state, timer_x, attotime::from_hz(120)) // mains freq*2
+ TIMER(config, "timer_x").configure_periodic(FUNC(st_mp200_state::timer_x), attotime::from_hz(120)); // mains freq*2
PIA6821(config, m_pia_u11, 0);
m_pia_u11->readpa_handler().set(FUNC(st_mp200_state::u11_a_r));
@@ -613,15 +614,15 @@ MACHINE_CONFIG_START(st_mp200_state::st_mp200)
m_pia_u11->cb2_handler().set(FUNC(st_mp200_state::u11_cb2_w));
m_pia_u11->irqa_handler().set_inputline("maincpu", M6800_IRQ_LINE);
m_pia_u11->irqb_handler().set_inputline("maincpu", M6800_IRQ_LINE);
- MCFG_TIMER_DRIVER_ADD_PERIODIC("timer_d", st_mp200_state, u11_timer, attotime::from_hz(634)) // 555 timer*2
-MACHINE_CONFIG_END
+ TIMER(config, "timer_d").configure_periodic(FUNC(st_mp200_state::u11_timer), attotime::from_hz(634)); // 555 timer*2
+}
-MACHINE_CONFIG_START(st_mp200_state::st_mp201)
+void st_mp200_state::st_mp201(machine_config &config)
+{
st_mp200(config);
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("speech", S14001A, S14001_CLOCK)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.00)
-MACHINE_CONFIG_END
+ S14001A(config, m_s14001a, S14001_CLOCK).add_route(ALL_OUTPUTS, "mono", 1.00);
+}
/*--------------------------------
diff --git a/src/mame/drivers/stactics.cpp b/src/mame/drivers/stactics.cpp
index 497d414840e..9221c11257c 100644
--- a/src/mame/drivers/stactics.cpp
+++ b/src/mame/drivers/stactics.cpp
@@ -308,12 +308,12 @@ void stactics_state::machine_start()
*
*************************************/
-MACHINE_CONFIG_START(stactics_state::stactics)
-
+void stactics_state::stactics(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", I8080, 1933560)
- MCFG_DEVICE_PROGRAM_MAP(main_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", stactics_state, interrupt)
+ I8080(config, m_maincpu, 1933560);
+ m_maincpu->set_addrmap(AS_PROGRAM, &stactics_state::main_map);
+ m_maincpu->set_vblank_int("screen", FUNC(stactics_state::interrupt));
LS259(config, m_outlatch); // 50
m_outlatch->q_out_cb<0>().set(FUNC(stactics_state::coin_lockout_1_w)); // COIN REJECT 1
@@ -344,7 +344,7 @@ MACHINE_CONFIG_START(stactics_state::stactics)
stactics_video(config);
/* audio hardware */
-MACHINE_CONFIG_END
+}
diff --git a/src/mame/drivers/stargame.cpp b/src/mame/drivers/stargame.cpp
index 10b96f5fd3e..12963c3030c 100644
--- a/src/mame/drivers/stargame.cpp
+++ b/src/mame/drivers/stargame.cpp
@@ -103,21 +103,22 @@ static const z80_daisy_config daisy_chain[] =
};
-MACHINE_CONFIG_START(stargame_state::stargame)
+void stargame_state::stargame(machine_config &config)
+{
/* basic machine hardware */
Z80(config, m_maincpu, 15000000 / 4); // clock line marked as CK4 and derived from 15MHz crystal
m_maincpu->set_addrmap(AS_PROGRAM, &stargame_state::maincpu_map);
m_maincpu->set_addrmap(AS_IO, &stargame_state::maincpu_io);
m_maincpu->set_daisy_config(daisy_chain);
- MCFG_DEVICE_ADD("audiocpu", Z80, 15000000 / 3) // ? check divider - clock line marked as CK6 and derived from 15MHz crystal
- MCFG_DEVICE_PROGRAM_MAP(audiocpu_map)
- MCFG_DEVICE_IO_MAP(audiocpu_io)
+ Z80(config, m_audiocpu, 15000000 / 3); // ? check divider - clock line marked as CK6 and derived from 15MHz crystal
+ m_audiocpu->set_addrmap(AS_PROGRAM, &stargame_state::audiocpu_map);
+ m_audiocpu->set_addrmap(AS_IO, &stargame_state::audiocpu_io);
MCFG_MACHINE_RESET_OVERRIDE(stargame_state, stargame)
/* video hardware */
- //MCFG_DEFAULT_LAYOUT()
+ //config.set_default_layout();
Z80CTC(config, m_ctc, 15000000 / 4);
m_ctc->intr_callback().set_inputline(m_maincpu, INPUT_LINE_IRQ0);
@@ -126,8 +127,7 @@ MACHINE_CONFIG_START(stargame_state::stargame)
/* sound hardware */
genpin_audio(config);
SPEAKER(config, "measnd").front_center();
- MCFG_DEVICE_ADD("mea8000", MEA8000, 15000000 / 4)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "measnd", 1.0)
+ MEA8000(config, "mea8000", 15000000 / 4).add_route(ALL_OUTPUTS, "measnd", 1.0);
SPEAKER(config, "aysnd").front_center();
AY8910(config, "ay", 15000000 / 8).add_route(ALL_OUTPUTS, "aysnd", 0.25); // clock line marked as CK2 and derived from 15MHz crystal
@@ -144,7 +144,7 @@ MACHINE_CONFIG_START(stargame_state::stargame)
GENERIC_LATCH_8(config, "soundlatch").data_pending_callback().set_inputline(m_audiocpu, INPUT_LINE_NMI);
WATCHDOG_TIMER(config, "watchdog");
-MACHINE_CONFIG_END
+}
ROM_START(spcship)
ROM_REGION(0x4000, "maincpu", 0)
diff --git a/src/mame/drivers/starshp1.cpp b/src/mame/drivers/starshp1.cpp
index c54b83ef210..9ab274acc87 100644
--- a/src/mame/drivers/starshp1.cpp
+++ b/src/mame/drivers/starshp1.cpp
@@ -294,13 +294,13 @@ static GFXDECODE_START( gfx_starshp1 )
GFXDECODE_END
-MACHINE_CONFIG_START(starshp1_state::starshp1)
-
+void starshp1_state::starshp1(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M6502, STARSHP1_CPU_CLOCK)
- MCFG_DEVICE_PROGRAM_MAP(starshp1_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", starshp1_state, starshp1_interrupt)
+ M6502(config, m_maincpu, STARSHP1_CPU_CLOCK);
+ m_maincpu->set_addrmap(AS_PROGRAM, &starshp1_state::starshp1_map);
+ m_maincpu->set_vblank_int("screen", FUNC(starshp1_state::starshp1_interrupt));
f9334_device &misclatch(F9334(config, "misclatch")); // C8
misclatch.q_out_cb<0>().set(FUNC(starshp1_state::ship_explode_w));
@@ -315,20 +315,19 @@ MACHINE_CONFIG_START(starshp1_state::starshp1)
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_RAW_PARAMS(STARSHP1_PIXEL_CLOCK, STARSHP1_HTOTAL, STARSHP1_HBEND, STARSHP1_HBSTART, STARSHP1_VTOTAL, STARSHP1_VBEND, STARSHP1_VBSTART)
- MCFG_SCREEN_UPDATE_DRIVER(starshp1_state, screen_update_starshp1)
- MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE(*this, starshp1_state, screen_vblank_starshp1))
- MCFG_SCREEN_PALETTE(m_palette)
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_raw(STARSHP1_PIXEL_CLOCK, STARSHP1_HTOTAL, STARSHP1_HBEND, STARSHP1_HBSTART, STARSHP1_VTOTAL, STARSHP1_VBEND, STARSHP1_VBSTART);
+ m_screen->set_screen_update(FUNC(starshp1_state::screen_update_starshp1));
+ m_screen->screen_vblank().set(FUNC(starshp1_state::screen_vblank_starshp1));
+ m_screen->set_palette(m_palette);
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, m_palette, gfx_starshp1)
+ GFXDECODE(config, m_gfxdecode, m_palette, gfx_starshp1);
PALETTE(config, m_palette, FUNC(starshp1_state::starshp1_palette), 19, 8);
/* sound hardware */
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("discrete", DISCRETE, starshp1_discrete)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
+ DISCRETE(config, m_discrete, starshp1_discrete).add_route(ALL_OUTPUTS, "mono", 1.0);
f9334_device &audiolatch(F9334(config, "audiolatch")); // D9
audiolatch.q_out_cb<0>().set(FUNC(starshp1_state::attract_w));
@@ -338,7 +337,7 @@ MACHINE_CONFIG_START(starshp1_state::starshp1)
audiolatch.q_out_cb<4>().set("discrete", FUNC(discrete_device::write_line<STARSHP1_SL2>));
audiolatch.q_out_cb<5>().set("discrete", FUNC(discrete_device::write_line<STARSHP1_MOLVL>));
audiolatch.q_out_cb<6>().set("discrete", FUNC(discrete_device::write_line<STARSHP1_NOISE_FREQ>));
-MACHINE_CONFIG_END
+}
/***************************************************************************
diff --git a/src/mame/drivers/starwars.cpp b/src/mame/drivers/starwars.cpp
index 04995349634..88e614cfe61 100644
--- a/src/mame/drivers/starwars.cpp
+++ b/src/mame/drivers/starwars.cpp
@@ -48,7 +48,7 @@ WRITE8_MEMBER(starwars_state::quad_pokeyn_w)
int control = (offset & 0x20) >> 2;
int pokey_reg = (offset % 8) | control;
- m_pokey[pokey_num]->write(space, pokey_reg, data);
+ m_pokey[pokey_num]->write(pokey_reg, data);
}
/*************************************
@@ -298,17 +298,17 @@ INPUT_PORTS_END
*
*************************************/
-MACHINE_CONFIG_START(starwars_state::starwars)
-
+void starwars_state::starwars(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", MC6809E, MASTER_CLOCK / 8)
- MCFG_DEVICE_PROGRAM_MAP(main_map)
- MCFG_DEVICE_PERIODIC_INT_DRIVER(starwars_state, irq0_line_assert, CLOCK_3KHZ / 12)
+ MC6809E(config, m_maincpu, MASTER_CLOCK / 8);
+ m_maincpu->set_addrmap(AS_PROGRAM, &starwars_state::main_map);
+ m_maincpu->set_periodic_int(FUNC(starwars_state::irq0_line_assert), attotime::from_hz(CLOCK_3KHZ / 12));
WATCHDOG_TIMER(config, "watchdog").set_time(attotime::from_hz(CLOCK_3KHZ / 128));
- MCFG_DEVICE_ADD("audiocpu", MC6809E, MASTER_CLOCK / 8)
- MCFG_DEVICE_PROGRAM_MAP(sound_map)
+ MC6809E(config, m_audiocpu, MASTER_CLOCK / 8);
+ m_audiocpu->set_addrmap(AS_PROGRAM, &starwars_state::sound_map);
adc0809_device &adc(ADC0809(config, "adc", MASTER_CLOCK / 16)); // designated as "137243-001" on parts list and "157249-120" on schematics
adc.in_callback<0>().set_ioport("STICKY"); // pitch
@@ -335,12 +335,12 @@ MACHINE_CONFIG_START(starwars_state::starwars)
outlatch.q_out_cb<7>().set(FUNC(starwars_state::recall_w)); // NVRAM array recall
/* video hardware */
- MCFG_VECTOR_ADD("vector")
- MCFG_SCREEN_ADD("screen", VECTOR)
- MCFG_SCREEN_REFRESH_RATE(CLOCK_3KHZ / 12 / 6)
- MCFG_SCREEN_SIZE(400, 300)
- MCFG_SCREEN_VISIBLE_AREA(0, 250, 0, 280)
- MCFG_SCREEN_UPDATE_DEVICE("vector", vector_device, screen_update)
+ VECTOR(config, "vector", 0);
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_VECTOR));
+ screen.set_refresh_hz(CLOCK_3KHZ / 12 / 6);
+ screen.set_size(400, 300);
+ screen.set_visarea(0, 250, 0, 280);
+ screen.set_screen_update("vector", FUNC(vector_device::screen_update));
avg_device &avg(AVG_STARWARS(config, "avg", 0));
avg.set_vector_tag("vector");
@@ -362,19 +362,19 @@ MACHINE_CONFIG_START(starwars_state::starwars)
GENERIC_LATCH_8(config, m_mainlatch);
m_mainlatch->data_pending_callback().set(m_riot, FUNC(riot6532_device::pa6_w));
m_mainlatch->data_pending_callback().append(FUNC(starwars_state::boost_interleave_hack));
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(starwars_state::esb)
+void starwars_state::esb(machine_config &config)
+{
starwars(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(esb_main_map)
+ m_maincpu->set_addrmap(AS_PROGRAM, &starwars_state::esb_main_map);
SLAPSTIC(config, m_slapstic_device, 101, false);
subdevice<ls259_device>("outlatch")->q_out_cb<4>().append_membank("bank2");
-MACHINE_CONFIG_END
+}
diff --git a/src/mame/drivers/statriv2.cpp b/src/mame/drivers/statriv2.cpp
index 286765200a4..00a9eac52f7 100644
--- a/src/mame/drivers/statriv2.cpp
+++ b/src/mame/drivers/statriv2.cpp
@@ -65,8 +65,7 @@ PROM use is unknown
Issues:
* statusbj - very glitchy, bad video, seems to spin
* hangman - keys are weird, spinner is busted
- *
-quaquiz2 - no inputs, needs NVRAM
+ * quaquiz2 - no inputs, needs NVRAM
*/
@@ -95,7 +94,9 @@ public:
{ }
void statriv2(machine_config &config);
+ void statusbj(machine_config &config);
void funcsino(machine_config &config);
+ void tripdraw(machine_config &config);
void statriv2v(machine_config &config);
void init_addr_xlh();
@@ -112,7 +113,7 @@ private:
required_device<tms9927_device> m_tms;
required_shared_ptr<uint8_t> m_videoram;
tilemap_t *m_tilemap;
- required_shared_ptr<uint8_t> m_question_offset;
+ optional_shared_ptr<uint8_t> m_question_offset;
required_device<gfxdecode_device> m_gfxdecode;
required_device<palette_device> m_palette;
uint8_t m_question_offset_low;
@@ -129,12 +130,15 @@ private:
TILE_GET_INFO_MEMBER(vertical_tile_info);
virtual void video_start() override;
void statriv2_palette(palette_device &palette) const;
+ void check_coin_status();
DECLARE_VIDEO_START(vertical);
uint32_t screen_update_statriv2(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
INTERRUPT_GEN_MEMBER(statriv2_interrupt);
+ INTERRUPT_GEN_MEMBER(tripdraw_interrupt);
- void statriv2_io_map(address_map &map);
void statriv2_map(address_map &map);
+ void statusbj_io_map(address_map &map);
+ void statriv2_io_map(address_map &map);
};
@@ -229,19 +233,30 @@ uint32_t statriv2_state::screen_update_statriv2(screen_device &screen, bitmap_in
*
*************************************/
-INTERRUPT_GEN_MEMBER(statriv2_state::statriv2_interrupt)
+void statriv2_state::check_coin_status()
{
uint8_t new_coin = ioport("COIN")->read();
/* check the coin inputs once per frame */
m_latched_coin |= new_coin & (new_coin ^ m_last_coin);
m_last_coin = new_coin;
+}
+
+INTERRUPT_GEN_MEMBER(statriv2_state::statriv2_interrupt)
+{
+ check_coin_status();
device.execute().set_input_line(I8085_RST75_LINE, ASSERT_LINE);
device.execute().set_input_line(I8085_RST75_LINE, CLEAR_LINE);
}
+INTERRUPT_GEN_MEMBER(statriv2_state::tripdraw_interrupt)
+{
+ check_coin_status();
+ device.execute().set_input_line(I8085_RST55_LINE, ASSERT_LINE);
+ device.execute().set_input_line(I8085_RST55_LINE, CLEAR_LINE);
+}
/*************************************
*
@@ -255,7 +270,7 @@ READ8_MEMBER(statriv2_state::question_data_r)
uint32_t qromsize = memregion("questions")->bytes();
uint32_t address;
- if (m_question_offset_high == 0xff)
+ if (m_question_offset_high == 0xff && !machine().side_effects_disabled())
m_question_offset[m_question_offset_low]++;
address = m_question_offset[m_question_offset_low];
@@ -302,15 +317,20 @@ void statriv2_state::statriv2_map(address_map &map)
map(0xc800, 0xcfff).ram().w(FUNC(statriv2_state::statriv2_videoram_w)).share("videoram");
}
-void statriv2_state::statriv2_io_map(address_map &map)
+void statriv2_state::statusbj_io_map(address_map &map)
{
map(0x20, 0x23).rw("ppi8255", FUNC(i8255_device::read), FUNC(i8255_device::write));
- map(0x28, 0x2b).r(FUNC(statriv2_state::question_data_r)).writeonly().share("question_offset");
map(0xb0, 0xb1).w("aysnd", FUNC(ay8910_device::address_data_w));
map(0xb1, 0xb1).r("aysnd", FUNC(ay8910_device::data_r));
map(0xc0, 0xcf).rw(m_tms, FUNC(tms9927_device::read), FUNC(tms9927_device::write));
}
+void statriv2_state::statriv2_io_map(address_map &map)
+{
+ statusbj_io_map(map);
+ map(0x28, 0x2b).r(FUNC(statriv2_state::question_data_r)).writeonly().share("question_offset");
+}
+
/*************************************
*
@@ -387,6 +407,42 @@ static INPUT_PORTS_START( funcsino )
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_COIN1 )
INPUT_PORTS_END
+static INPUT_PORTS_START( tripdraw )
+ PORT_START("IN0")
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_POKER_BET )
+ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_GAMBLE_DEAL )
+ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_NAME("Draw") PORT_CODE(KEYCODE_3)
+ PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_POKER_HOLD1 ) PORT_NAME("Discard 1 / Lo")
+ PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_POKER_HOLD2 ) PORT_NAME("Discard 2")
+ PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_POKER_HOLD3 ) PORT_NAME("Discard 3 / Double")
+ PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_POKER_HOLD4 ) PORT_NAME("Discard 4")
+ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_POKER_HOLD5 ) PORT_NAME("Discard 5 / Hi")
+
+ PORT_START("IN1")
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_NAME("Stand") PORT_CODE(KEYCODE_4)
+ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_UNKNOWN )
+ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_CUSTOM ) PORT_CUSTOM_MEMBER(DEVICE_SELF, statriv2_state, latched_coin_r, "COIN")
+ PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNUSED )
+ PORT_DIPNAME( 0x10, 0x10, "DIP switch? 10" )
+ PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x10, DEF_STR( On ) )
+ PORT_DIPNAME( 0x20, 0x20, "DIP switch? 20" )
+ PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x20, DEF_STR( On ) )
+ PORT_DIPNAME( 0x40, 0x40, "DIP switch? 40" )
+ PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x40, DEF_STR( On ) )
+ PORT_DIPNAME( 0x80, 0x80, "DIP switch? 80" )
+ PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x80, DEF_STR( On ) )
+
+ PORT_START("IN2")
+ PORT_BIT( 0x0f, IP_ACTIVE_LOW, IPT_UNUSED )
+
+ PORT_START("COIN")
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_COIN1 )
+INPUT_PORTS_END
+
static INPUT_PORTS_START( bigcsino ) // flyer shows 8 buttons on the cabinet
PORT_START("IN0")
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_POKER_BET ) PORT_NAME("Play")
@@ -605,13 +661,14 @@ GFXDECODE_END
*
*************************************/
-MACHINE_CONFIG_START(statriv2_state::statriv2)
+void statriv2_state::statriv2(machine_config &config)
+{
/* basic machine hardware */
/* FIXME: The 8085A had a max clock of 6MHz, internally divided by 2! */
- MCFG_DEVICE_ADD("maincpu", I8085A, MASTER_CLOCK)
- MCFG_DEVICE_PROGRAM_MAP(statriv2_map)
- MCFG_DEVICE_IO_MAP(statriv2_io_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", statriv2_state, statriv2_interrupt)
+ I8085A(config, m_maincpu, MASTER_CLOCK);
+ m_maincpu->set_addrmap(AS_PROGRAM, &statriv2_state::statriv2_map);
+ m_maincpu->set_addrmap(AS_IO, &statriv2_state::statriv2_io_map);
+ m_maincpu->set_vblank_int("screen", FUNC(statriv2_state::statriv2_interrupt));
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
@@ -625,10 +682,10 @@ MACHINE_CONFIG_START(statriv2_state::statriv2)
ppi.out_pc_callback().set(FUNC(statriv2_state::ppi_portc_hi_w));
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_RAW_PARAMS(MASTER_CLOCK/2, 384, 0, 320, 270, 0, 240)
- MCFG_SCREEN_UPDATE_DRIVER(statriv2_state, screen_update_statriv2)
- MCFG_SCREEN_PALETTE(m_palette)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_raw(MASTER_CLOCK/2, 384, 0, 320, 270, 0, 240);
+ screen.set_screen_update(FUNC(statriv2_state::screen_update_statriv2));
+ screen.set_palette(m_palette);
TMS9927(config, m_tms, MASTER_CLOCK/2/8).set_char_width(8);
@@ -639,29 +696,42 @@ MACHINE_CONFIG_START(statriv2_state::statriv2)
SPEAKER(config, "mono").front_center();
AY8910(config, "aysnd", MASTER_CLOCK/8).add_route(ALL_OUTPUTS, "mono", 1.0);
-MACHINE_CONFIG_END
+}
+
+void statriv2_state::statusbj(machine_config &config)
+{
+ statriv2(config);
+ m_maincpu->set_addrmap(AS_IO, &statriv2_state::statusbj_io_map); // no question data
+}
-MACHINE_CONFIG_START(statriv2_state::statriv2v)
+void statriv2_state::statriv2v(machine_config &config)
+{
statriv2(config);
/* basic machine hardware */
- MCFG_SCREEN_MODIFY("screen")
- MCFG_SCREEN_RAW_PARAMS(MASTER_CLOCK/2, 392, 0, 256, 262, 0, 256)
+ subdevice<screen_device>("screen")->set_raw(MASTER_CLOCK/2, 392, 0, 256, 262, 0, 256);
MCFG_VIDEO_START_OVERRIDE(statriv2_state, vertical)
- MCFG_GFXDECODE_MODIFY("gfxdecode", gfx_vertical)
-MACHINE_CONFIG_END
+ m_gfxdecode->set_info(gfx_vertical);
+}
-MACHINE_CONFIG_START(statriv2_state::funcsino)
- statriv2(config);
+void statriv2_state::funcsino(machine_config &config)
+{
+ statusbj(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_CLOCK(MASTER_CLOCK/2) /* 3 MHz?? seems accurate */
-MACHINE_CONFIG_END
+ m_maincpu->set_clock(MASTER_CLOCK/2); /* 3 MHz?? seems accurate */
+}
+void statriv2_state::tripdraw(machine_config &config)
+{
+ statusbj(config);
+
+ /* basic machine hardware */
+ m_maincpu->set_vblank_int("screen", FUNC(statriv2_state::tripdraw_interrupt));
+}
/*************************************
@@ -1622,11 +1692,11 @@ void statriv2_state::init_laserdisc()
*
*************************************/
-GAME( 1981, statusbj, 0, statriv2, statusbj, statriv2_state, empty_init, ROT0, "Status Games", "Status Black Jack (V1.0c)", MACHINE_SUPPORTS_SAVE )
+GAME( 1981, statusbj, 0, statusbj, statusbj, statriv2_state, empty_init, ROT0, "Status Games", "Status Black Jack (V1.0c)", MACHINE_SUPPORTS_SAVE )
GAME( 1981, funcsino, 0, funcsino, funcsino, statriv2_state, empty_init, ROT0, "Status Games", "Status Fun Casino (V1.3s)", MACHINE_SUPPORTS_SAVE )
-GAME( 1981, tripdraw, 0, statriv2, funcsino, statriv2_state, empty_init, ROT0, "Status Games", "Tripple Draw (V3.1 s)", MACHINE_SUPPORTS_SAVE | MACHINE_NOT_WORKING )
-GAME( 1984, bigcsino, 0, statriv2, bigcsino, statriv2_state, empty_init, ROT0, "Status Games", "Big Casino", MACHINE_SUPPORTS_SAVE )
-GAME( 1984, hangman, 0, statriv2, hangman, statriv2_state, init_addr_lmh, ROT0, "Status Games", "Hangman", MACHINE_SUPPORTS_SAVE )
+GAME( 1981, tripdraw, 0, tripdraw, tripdraw, statriv2_state, empty_init, ROT0, "Status Games", "Tripple Draw (V3.1 s)", MACHINE_SUPPORTS_SAVE )
+GAME( 1984, bigcsino, 0, statusbj, bigcsino, statriv2_state, empty_init, ROT0, "Status Games", "Big Casino", MACHINE_SUPPORTS_SAVE )
+GAME( 1984, hangman, 0, statusbj, hangman, statriv2_state, init_addr_lmh, ROT0, "Status Games", "Hangman", MACHINE_SUPPORTS_SAVE )
GAME( 1984, trivquiz, 0, statriv2, statriv2, statriv2_state, init_addr_lhx, ROT0, "Status Games", "Triv Quiz", MACHINE_SUPPORTS_SAVE )
GAME( 1984, statriv2, 0, statriv2, statriv2, statriv2_state, init_addr_xlh, ROT0, "Status Games", "Triv Two", MACHINE_SUPPORTS_SAVE )
GAME( 1985, statriv2v, statriv2, statriv2v, statriv2, statriv2_state, init_addr_xlh, ROT90, "Status Games", "Triv Two (Vertical)", MACHINE_SUPPORTS_SAVE )
@@ -1640,23 +1710,23 @@ GAME( 1986, supertr2, 0, statriv2, supertr2, statriv2_state, init_addr
GAME( 1988, supertr3, 0, statriv2, supertr2, statriv2_state, init_addr_lmh, ROT0, "Status Games", "Super Triv III", MACHINE_SUPPORTS_SAVE )
GAME( 1988, nsupertr3, supertr3, statriv2, supertr2, statriv2_state, init_addr_lmh, ROT0, "Status Games", "New Super Triv III", MACHINE_SUPPORTS_SAVE | MACHINE_NOT_WORKING ) // new questions don't appear correctly, coinage problems
// The following Casino Strip sets don't show the version on screen (at least without the laserdisc video). It was taken from the rom labels / from the Dragon's Lair Project archive.
-GAME( 1984, cs1_spp, 0, statriv2, funcsino, statriv2_state, init_laserdisc, ROT0, "Status Games", "Casino Strip I (Poker version, for Pioneer LD, set 1)", MACHINE_SUPPORTS_SAVE | MACHINE_NOT_WORKING )
-GAME( 1984, cs1_spp2, cs1_spp, statriv2, funcsino, statriv2_state, init_laserdisc, ROT0, "Status Games", "Casino Strip I (Poker version, for Pioneer LD, set 2)", MACHINE_SUPPORTS_SAVE | MACHINE_NOT_WORKING )
-GAME( 1988, cs2_sps, 0, statriv2, funcsino, statriv2_state, init_laserdisc, ROT0, "Status Games", "Casino Strip II (Poker version, for Sony LD)", MACHINE_SUPPORTS_SAVE | MACHINE_NOT_WORKING )
-GAME( 1992, cs3_qps, 0, statriv2, funcsino, statriv2_state, init_laserdisc, ROT0, "Quantum Industries", "Casino Strip III (Poker version, for Sony LD)", MACHINE_SUPPORTS_SAVE | MACHINE_NOT_WORKING )
-GAME( 1985, cs5_spp, 0, statriv2, funcsino, statriv2_state, init_laserdisc, ROT0, "Status Games", "Casino Strip V (Poker version, for Pioneer LD)", MACHINE_SUPPORTS_SAVE | MACHINE_NOT_WORKING )
-GAME( 1985, cs5_ssp, 0, statriv2, funcsino, statriv2_state, init_laserdisc, ROT0, "Status Games", "Casino Strip V (Shooting Game version, for Pioneer LD)", MACHINE_SUPPORTS_SAVE | MACHINE_NOT_WORKING )
-GAME( 1988, cs6_sps, 0, statriv2, funcsino, statriv2_state, init_laserdisc, ROT0, "Status Games", "Casino Strip VI (Poker version, for Sony LD)", MACHINE_SUPPORTS_SAVE | MACHINE_NOT_WORKING )
-GAME( 1985, cs6_ssp, 0, statriv2, funcsino, statriv2_state, init_laserdisc, ROT0, "Status Games", "Casino Strip VI (Shooting Game version, for Pioneer LD)", MACHINE_SUPPORTS_SAVE | MACHINE_NOT_WORKING )
-GAME( 1986, cs8_ssp, 0, statriv2, funcsino, statriv2_state, init_laserdisc, ROT0, "Status Games", "Casino Strip VIII (Shooting Game version, for Pioneer LD)", MACHINE_SUPPORTS_SAVE | MACHINE_NOT_WORKING )
-GAME( 1985, cs8_spp, 0, statriv2, funcsino, statriv2_state, init_laserdisc, ROT0, "Status Games", "Casino Strip VIII (Poker version, for Pioneer LD)", MACHINE_SUPPORTS_SAVE | MACHINE_NOT_WORKING )
-GAME( 1988, cs8_sps, 0, statriv2, funcsino, statriv2_state, init_laserdisc, ROT0, "Status Games", "Casino Strip VIII (Poker version, for Sony LD)", MACHINE_SUPPORTS_SAVE | MACHINE_NOT_WORKING )
-GAME( 1992, cs9_qps, 0, statriv2, funcsino, statriv2_state, init_laserdisc, ROT0, "Quantum Industries", "Casino Strip IX (Poker version, for Sony LD)", MACHINE_SUPPORTS_SAVE | MACHINE_NOT_WORKING )
-GAME( 1985, cs9_spp, 0, statriv2, funcsino, statriv2_state, init_laserdisc, ROT0, "Status Games", "Casino Strip IX (Poker version, for Pioneer LD)", MACHINE_SUPPORTS_SAVE | MACHINE_NOT_WORKING )
-GAME( 1988, cs10_sps, 0, statriv2, funcsino, statriv2_state, init_laserdisc, ROT0, "Status Games", "Casino Strip X (Poker version, for Sony LD)", MACHINE_SUPPORTS_SAVE | MACHINE_NOT_WORKING )
-GAME( 1988, cs11_ssp, 0, statriv2, funcsino, statriv2_state, init_laserdisc, ROT0, "Status Games", "Casino Strip XI (Shooting Game version, for Pioneer LD)", MACHINE_SUPPORTS_SAVE | MACHINE_NOT_WORKING )
-GAME( 1988, cs11_sps, 0, statriv2, funcsino, statriv2_state, init_laserdisc, ROT0, "Status Games", "Casino Strip XI (Poker version, for Sony LD, set 1)", MACHINE_SUPPORTS_SAVE | MACHINE_NOT_WORKING )
-GAME( 1988, cs11_sps2, cs11_sps, statriv2, funcsino, statriv2_state, init_laserdisc, ROT0, "Status Games", "Casino Strip XI (Poker version, for Sony LD, set 2)", MACHINE_SUPPORTS_SAVE | MACHINE_NOT_WORKING )
-GAME( 1988, cs12_sps, 0, statriv2, funcsino, statriv2_state, init_laserdisc, ROT0, "Status Games", "Casino Strip XII (Poker version, for Sony LD)", MACHINE_SUPPORTS_SAVE | MACHINE_NOT_WORKING )
-GAME( 1996, cspe_qps, 0, statriv2, funcsino, statriv2_state, init_laserdisc, ROT0, "Quantum Industries", "Casino Strip Private Eyes / All Start (Poker version, for Sony LD)", MACHINE_SUPPORTS_SAVE | MACHINE_NOT_WORKING )
-GAME( 1993, csv1_qps, 0, statriv2, funcsino, statriv2_state, init_laserdisc, ROT0, "Quantum Industries", "Casino Strip Vivid 1 (Poker version, for Sony LD)", MACHINE_SUPPORTS_SAVE | MACHINE_NOT_WORKING )
+GAME( 1984, cs1_spp, 0, statusbj, funcsino, statriv2_state, init_laserdisc, ROT0, "Status Games", "Casino Strip I (Poker version, for Pioneer LD, set 1)", MACHINE_SUPPORTS_SAVE | MACHINE_NOT_WORKING )
+GAME( 1984, cs1_spp2, cs1_spp, statusbj, funcsino, statriv2_state, init_laserdisc, ROT0, "Status Games", "Casino Strip I (Poker version, for Pioneer LD, set 2)", MACHINE_SUPPORTS_SAVE | MACHINE_NOT_WORKING )
+GAME( 1988, cs2_sps, 0, statusbj, funcsino, statriv2_state, init_laserdisc, ROT0, "Status Games", "Casino Strip II (Poker version, for Sony LD)", MACHINE_SUPPORTS_SAVE | MACHINE_NOT_WORKING )
+GAME( 1992, cs3_qps, 0, statusbj, funcsino, statriv2_state, init_laserdisc, ROT0, "Quantum Industries", "Casino Strip III (Poker version, for Sony LD)", MACHINE_SUPPORTS_SAVE | MACHINE_NOT_WORKING )
+GAME( 1985, cs5_spp, 0, statusbj, funcsino, statriv2_state, init_laserdisc, ROT0, "Status Games", "Casino Strip V (Poker version, for Pioneer LD)", MACHINE_SUPPORTS_SAVE | MACHINE_NOT_WORKING )
+GAME( 1985, cs5_ssp, 0, statusbj, funcsino, statriv2_state, init_laserdisc, ROT0, "Status Games", "Casino Strip V (Shooting Game version, for Pioneer LD)", MACHINE_SUPPORTS_SAVE | MACHINE_NOT_WORKING )
+GAME( 1988, cs6_sps, 0, statusbj, funcsino, statriv2_state, init_laserdisc, ROT0, "Status Games", "Casino Strip VI (Poker version, for Sony LD)", MACHINE_SUPPORTS_SAVE | MACHINE_NOT_WORKING )
+GAME( 1985, cs6_ssp, 0, statusbj, funcsino, statriv2_state, init_laserdisc, ROT0, "Status Games", "Casino Strip VI (Shooting Game version, for Pioneer LD)", MACHINE_SUPPORTS_SAVE | MACHINE_NOT_WORKING )
+GAME( 1986, cs8_ssp, 0, statusbj, funcsino, statriv2_state, init_laserdisc, ROT0, "Status Games", "Casino Strip VIII (Shooting Game version, for Pioneer LD)", MACHINE_SUPPORTS_SAVE | MACHINE_NOT_WORKING )
+GAME( 1985, cs8_spp, 0, statusbj, funcsino, statriv2_state, init_laserdisc, ROT0, "Status Games", "Casino Strip VIII (Poker version, for Pioneer LD)", MACHINE_SUPPORTS_SAVE | MACHINE_NOT_WORKING )
+GAME( 1988, cs8_sps, 0, statusbj, funcsino, statriv2_state, init_laserdisc, ROT0, "Status Games", "Casino Strip VIII (Poker version, for Sony LD)", MACHINE_SUPPORTS_SAVE | MACHINE_NOT_WORKING )
+GAME( 1992, cs9_qps, 0, statusbj, funcsino, statriv2_state, init_laserdisc, ROT0, "Quantum Industries", "Casino Strip IX (Poker version, for Sony LD)", MACHINE_SUPPORTS_SAVE | MACHINE_NOT_WORKING )
+GAME( 1985, cs9_spp, 0, statusbj, funcsino, statriv2_state, init_laserdisc, ROT0, "Status Games", "Casino Strip IX (Poker version, for Pioneer LD)", MACHINE_SUPPORTS_SAVE | MACHINE_NOT_WORKING )
+GAME( 1988, cs10_sps, 0, statusbj, funcsino, statriv2_state, init_laserdisc, ROT0, "Status Games", "Casino Strip X (Poker version, for Sony LD)", MACHINE_SUPPORTS_SAVE | MACHINE_NOT_WORKING )
+GAME( 1988, cs11_ssp, 0, statusbj, funcsino, statriv2_state, init_laserdisc, ROT0, "Status Games", "Casino Strip XI (Shooting Game version, for Pioneer LD)", MACHINE_SUPPORTS_SAVE | MACHINE_NOT_WORKING )
+GAME( 1988, cs11_sps, 0, statusbj, funcsino, statriv2_state, init_laserdisc, ROT0, "Status Games", "Casino Strip XI (Poker version, for Sony LD, set 1)", MACHINE_SUPPORTS_SAVE | MACHINE_NOT_WORKING )
+GAME( 1988, cs11_sps2, cs11_sps, statusbj, funcsino, statriv2_state, init_laserdisc, ROT0, "Status Games", "Casino Strip XI (Poker version, for Sony LD, set 2)", MACHINE_SUPPORTS_SAVE | MACHINE_NOT_WORKING )
+GAME( 1988, cs12_sps, 0, statusbj, funcsino, statriv2_state, init_laserdisc, ROT0, "Status Games", "Casino Strip XII (Poker version, for Sony LD)", MACHINE_SUPPORTS_SAVE | MACHINE_NOT_WORKING )
+GAME( 1996, cspe_qps, 0, statusbj, funcsino, statriv2_state, init_laserdisc, ROT0, "Quantum Industries", "Casino Strip Private Eyes / All Start (Poker version, for Sony LD)", MACHINE_SUPPORTS_SAVE | MACHINE_NOT_WORKING )
+GAME( 1993, csv1_qps, 0, statusbj, funcsino, statriv2_state, init_laserdisc, ROT0, "Quantum Industries", "Casino Strip Vivid 1 (Poker version, for Sony LD)", MACHINE_SUPPORTS_SAVE | MACHINE_NOT_WORKING )
diff --git a/src/mame/drivers/stellafr.cpp b/src/mame/drivers/stellafr.cpp
index aaf0cc53787..a70fd63d307 100644
--- a/src/mame/drivers/stellafr.cpp
+++ b/src/mame/drivers/stellafr.cpp
@@ -90,21 +90,22 @@ static INPUT_PORTS_START( stellafr )
INPUT_PORTS_END
-MACHINE_CONFIG_START(stellafr_state::stellafr)
- MCFG_DEVICE_ADD("maincpu", M68000, 10000000 ) //?
- MCFG_DEVICE_PROGRAM_MAP(stellafr_map)
- MCFG_DEVICE_IRQ_ACKNOWLEDGE_DRIVER(stellafr_state, irq_ack)
+void stellafr_state::stellafr(machine_config &config)
+{
+ M68000(config, m_maincpu, 10000000 ); //?
+ m_maincpu->set_addrmap(AS_PROGRAM, &stellafr_state::stellafr_map);
+ m_maincpu->set_irq_acknowledge_callback(FUNC(stellafr_state::irq_ack));
- MCFG_DEVICE_ADD("duart", MC68681, 3686400)
- MCFG_MC68681_IRQ_CALLBACK(INPUTLINE("maincpu", M68K_IRQ_2)) // ?
- MCFG_MC68681_OUTPORT_CALLBACK(WRITE8(*this, stellafr_state, duart_output_w))
+ MC68681(config, m_duart, 3686400);
+ m_duart->irq_cb().set_inputline(m_maincpu, M68K_IRQ_2); // ?
+ m_duart->outport_cb().set(FUNC(stellafr_state::duart_output_w));
SPEAKER(config, "mono").front_center();
ay8910_device &aysnd(AY8910(config, "aysnd", 1000000));
aysnd.add_route(ALL_OUTPUTS, "mono", 1.0);
aysnd.port_a_read_callback().set_ioport("INPUTS");
aysnd.port_b_write_callback().set(FUNC(stellafr_state::ay8910_portb_w));
-MACHINE_CONFIG_END
+}
diff --git a/src/mame/drivers/stlforce.cpp b/src/mame/drivers/stlforce.cpp
index 6de179c48d5..53be5c03c6f 100644
--- a/src/mame/drivers/stlforce.cpp
+++ b/src/mame/drivers/stlforce.cpp
@@ -196,25 +196,25 @@ uint32_t stlforce_state::screen_update(screen_device &screen, bitmap_ind16 &bitm
return m_video->draw(screen, bitmap, cliprect);
}
-MACHINE_CONFIG_START(stlforce_state::stlforce)
-
+void stlforce_state::stlforce(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M68000, 15000000)
- MCFG_DEVICE_PROGRAM_MAP(stlforce_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", stlforce_state, irq4_line_hold)
+ M68000(config, m_maincpu, 15000000);
+ m_maincpu->set_addrmap(AS_PROGRAM, &stlforce_state::stlforce_map);
+ m_maincpu->set_vblank_int("screen", FUNC(stlforce_state::irq4_line_hold));
EEPROM_93C46_16BIT(config, "eeprom");
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(58)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */)
- MCFG_SCREEN_SIZE(64*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(8, 48*8-1-8-2, 0, 30*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(stlforce_state, screen_update)
- MCFG_SCREEN_PALETTE(m_palette)
-
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_stlforce)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(58);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500) /* not accurate */);
+ screen.set_size(64*8, 32*8);
+ screen.set_visarea(8, 48*8-1-8-2, 0, 30*8-1);
+ screen.set_screen_update(FUNC(stlforce_state::screen_update));
+ screen.set_palette(m_palette);
+
+ GFXDECODE(config, m_gfxdecode, m_palette, gfx_stlforce);
PALETTE(config, m_palette).set_format(palette_device::xBGR_555, 0x800);
EDEVICES_SFORCE_VID(config, m_video, 0);
@@ -233,27 +233,24 @@ MACHINE_CONFIG_START(stlforce_state::stlforce)
/* sound hardware */
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("oki", OKIM6295, XTAL(32'000'000)/32, okim6295_device::PIN7_HIGH)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
-MACHINE_CONFIG_END
+ OKIM6295(config, "oki", XTAL(32'000'000)/32, okim6295_device::PIN7_HIGH).add_route(ALL_OUTPUTS, "mono", 1.0);
+}
-MACHINE_CONFIG_START(stlforce_state::twinbrat)
+void stlforce_state::twinbrat(machine_config &config)
+{
stlforce(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_CLOCK(XTAL(14'745'600))
+ m_maincpu->set_clock(XTAL(14'745'600));
- MCFG_SCREEN_MODIFY("screen")
- MCFG_SCREEN_VISIBLE_AREA(3*8, 44*8-1, 0*8, 30*8-1)
+ subdevice<screen_device>("screen")->set_visarea(3*8, 44*8-1, 0*8, 30*8-1);
/* modify m_video */
m_video->set_spritexoffset(10);
- MCFG_DEVICE_MODIFY("oki")
- MCFG_DEVICE_CLOCK(XTAL(30'000'000) / 32) // verified on 2 PCBs
- MCFG_DEVICE_ADDRESS_MAP(0, twinbrat_oki_map)
-MACHINE_CONFIG_END
+ subdevice<okim6295_device>("oki")->set_clock(XTAL(30'000'000) / 32); // verified on 2 PCBs
+ subdevice<okim6295_device>("oki")->set_addrmap(0, &stlforce_state::twinbrat_oki_map);
+}
ROM_START( stlforce )
ROM_REGION( 0x80000, "maincpu", 0 ) /* 68000 code */
diff --git a/src/mame/drivers/storio.cpp b/src/mame/drivers/storio.cpp
new file mode 100644
index 00000000000..f61ebdf9fd8
--- /dev/null
+++ b/src/mame/drivers/storio.cpp
@@ -0,0 +1,171 @@
+// license:BSD-3-Clause
+// copyright-holders:David Haywood
+/******************************************************************************
+
+ VTech Storio and VTech V.Reader
+ Main processor: Nuvoton W55FA9363SDN (ARM926EJ-S CPU core)
+ http://www.dingsung.com.cn/download/n32905/1507301944.pdf
+
+ Storio (Europe) and V.Reader (North America) cartridges are physically
+ different, but there is no software region lock, so you can play
+ Storio games on the V.Reader (and viceversa) by modifying the game's
+ plastic cartrige (so it can fit in).
+
+ Skeleton driver, to reference Software List so that it gets validated
+
+ TODO: everything!
+
+*******************************************************************************/
+
+#include "emu.h"
+
+#include "cpu/arm7/arm7.h"
+#include "cpu/arm7/arm7core.h"
+
+#include "bus/generic/slot.h"
+#include "bus/generic/carts.h"
+
+#include "screen.h"
+#include "softlist.h"
+#include "speaker.h"
+
+class vtech_storio_state : public driver_device
+{
+public:
+ vtech_storio_state(const machine_config &mconfig, device_type type, const char *tag)
+ : driver_device(mconfig, type, tag)
+ , m_maincpu(*this, "maincpu")
+ , m_screen(*this, "screen")
+ , m_cart(*this, "cartslot")
+ , m_cart_region(nullptr)
+ { }
+
+ void vtech_storio(machine_config &config);
+
+private:
+ virtual void machine_start() override;
+ virtual void machine_reset() override;
+
+ DECLARE_DEVICE_IMAGE_LOAD_MEMBER(cart);
+
+ required_device<cpu_device> m_maincpu;
+
+ required_device<screen_device> m_screen;
+ required_device<generic_slot_device> m_cart;
+ memory_region *m_cart_region;
+
+ uint32_t screen_update_storio(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
+};
+
+uint32_t vtech_storio_state::screen_update_storio(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect)
+{
+ return 0;
+}
+
+void vtech_storio_state::machine_start()
+{
+ // if there's a cart, override the standard mapping
+ if (m_cart && m_cart->exists())
+ {
+ std::string region_tag;
+ m_cart_region = memregion(region_tag.assign(m_cart->tag()).append(GENERIC_ROM_REGION_TAG).c_str());
+ }
+}
+
+void vtech_storio_state::machine_reset()
+{
+}
+
+DEVICE_IMAGE_LOAD_MEMBER(vtech_storio_state, cart)
+{
+ uint32_t size = m_cart->common_get_size("rom");
+
+ m_cart->rom_alloc(size, GENERIC_ROM16_WIDTH, ENDIANNESS_LITTLE);
+ m_cart->common_load_rom(m_cart->get_rom_base(), size, "rom");
+
+ return image_init_result::PASS;
+}
+
+static INPUT_PORTS_START( vtech_storio )
+INPUT_PORTS_END
+
+
+void vtech_storio_state::vtech_storio(machine_config &config)
+{
+ ARM9(config, m_maincpu, 240000000); // ARM926EJ-S CPU core (probably 240MHz, but not sure)
+
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_refresh_hz(60);
+ m_screen->set_size(320, 262);
+ m_screen->set_visarea(0, 320-1, 0, 240-1);
+ m_screen->set_screen_update(FUNC(vtech_storio_state::screen_update_storio));
+
+ SPEAKER(config, "lspeaker").front_left();
+ SPEAKER(config, "rspeaker").front_right();
+
+ GENERIC_CARTSLOT(config, m_cart, generic_plain_slot, "vtech_storio_cart");
+ m_cart->set_width(GENERIC_ROM16_WIDTH);
+ m_cart->set_device_load(device_image_load_delegate(&vtech_storio_state::device_image_load_cart, this));
+
+ SOFTWARE_LIST(config, "cart_list").set_original("vtech_storio_cart");
+}
+
+// BIOS is 1 GBIT (128M × 8 BIT) CMOS NAND EEPROM (Toshiba TC58NVG0S3ETA00)
+
+// ROM image from VTech, not padded to the real ROM size
+ROM_START( vreader )
+ ROM_REGION( 0x038e906c, "maincpu", ROMREGION_ERASEFF )
+ ROM_LOAD( "useng-pack_20111017.bin", 0x000000, 0x038e906c, CRC(add3f7e5) SHA1(43ecfb0ba3c98c5852f93ed620021697167aa156) )
+ROM_END
+
+// ROM image from VTech, not padded to the real ROM size
+ROM_START( vreadercaen )
+ ROM_REGION( 0x038e906c, "maincpu", ROMREGION_ERASEFF )
+ ROM_LOAD( "caeng-pack_20111017.bin", 0x000000, 0x038e906c, CRC(0b64caf3) SHA1(79648e2b315c59f60aaf8cb8806fdbe773e484a2) )
+ROM_END
+
+// ROM image from VTech, not padded to the real ROM size
+ROM_START( vreadercafr )
+ ROM_REGION( 0x037d93a6, "maincpu", ROMREGION_ERASEFF )
+ ROM_LOAD( "cafre-pack_20111017.bin", 0x000000, 0x037d93a6, CRC(d3e0039c) SHA1(3d69f4afcf56ba40261bba0af335680c3c05b319) )
+ROM_END
+
+// ROM image from VTech, not padded to the real ROM size
+ROM_START( storio )
+ ROM_REGION( 0x01bf3dcb, "maincpu", ROMREGION_ERASEFF )
+ ROM_LOAD( "gbeng-pack_20111017.bin", 0x000000, 0x01bf3dcb, CRC(b0962d2c) SHA1(4f316cbcc87ae24022568a358ac94c7b4cac39a6) )
+ROM_END
+
+// ROM image from VTech, not padded to the real ROM size
+ROM_START( storiode )
+ ROM_REGION( 0x03740a0d, "maincpu", ROMREGION_ERASEFF )
+ ROM_LOAD( "deger-pack_20111017.bin", 0x000000, 0x03740a0d, CRC(548c8882) SHA1(e64474be082bd3ae3c365c6c766b2ec5081f3ebd) )
+ROM_END
+
+// ROM image from VTech, not padded to the real ROM size
+ROM_START( storioes )
+ ROM_REGION( 0x03c62bfc, "maincpu", ROMREGION_ERASEFF )
+ ROM_LOAD( "esspa-pack_20111017.bin", 0x000000, 0x03c62bfc, CRC(fe9b78f9) SHA1(c114a8f82799861a0cca432ee145e436aca5f400) )
+ROM_END
+
+// ROM image from VTech, not padded to the real ROM size
+ROM_START( storiofr )
+ ROM_REGION( 0x038c2a19, "maincpu", ROMREGION_ERASEFF )
+ ROM_LOAD( "frfre-pack_20111017.bin", 0x000000, 0x038c2a19, CRC(f3d87f50) SHA1(240ddebd4cb1c4be24afb4da35c65ddf64628034) )
+ROM_END
+
+// ROM image from VTech, not padded to the real ROM size
+ROM_START( storionl )
+ ROM_REGION( 0x03af81c6, "maincpu", ROMREGION_ERASEFF )
+ ROM_LOAD( "nldut-pack_20111017.bin", 0x000000, 0x03af81c6, CRC(6cfac599) SHA1(d16b45fd287c9d823bde13b88eb6c8158ac2b475) )
+ROM_END
+
+// year, name, parent, compat, machine, input, class, init, company, fullname, flags
+CONS( 2011, vreader, 0, 0, vtech_storio, vtech_storio, vtech_storio_state, empty_init, "VTech", "V.Reader (US, English, 2011-10-17)", MACHINE_IS_SKELETON )
+CONS( 2011, vreadercaen, vreader, 0, vtech_storio, vtech_storio, vtech_storio_state, empty_init, "VTech", "V.Reader (CA, English, 2011-10-17)", MACHINE_IS_SKELETON )
+CONS( 2011, vreadercafr, vreader, 0, vtech_storio, vtech_storio, vtech_storio_state, empty_init, "VTech", "V.Reader (CA, French, 2011-10-17)", MACHINE_IS_SKELETON )
+CONS( 2011, storio, vreader, 0, vtech_storio, vtech_storio, vtech_storio_state, empty_init, "VTech", "Storio (GB, English, 2011-10-17)", MACHINE_IS_SKELETON )
+CONS( 2011, storiode, vreader, 0, vtech_storio, vtech_storio, vtech_storio_state, empty_init, "VTech", "Storio (DE, German, 2011-10-17)", MACHINE_IS_SKELETON )
+CONS( 2011, storioes, vreader, 0, vtech_storio, vtech_storio, vtech_storio_state, empty_init, "VTech", "Storio (ES, Spanish, 2011-10-17)", MACHINE_IS_SKELETON )
+CONS( 2011, storiofr, vreader, 0, vtech_storio, vtech_storio, vtech_storio_state, empty_init, "VTech", "Storio (FR, French, 2011-10-17)", MACHINE_IS_SKELETON )
+CONS( 2011, storionl, vreader, 0, vtech_storio, vtech_storio, vtech_storio_state, empty_init, "VTech", "Storio (NL, Dutch, 2011-10-17)", MACHINE_IS_SKELETON )
diff --git a/src/mame/drivers/stratos.cpp b/src/mame/drivers/stratos.cpp
index 1c4cb161ce3..42b7a8364e8 100644
--- a/src/mame/drivers/stratos.cpp
+++ b/src/mame/drivers/stratos.cpp
@@ -349,20 +349,21 @@ void stratos_state::stratos_mem(address_map &map)
static INPUT_PORTS_START( stratos )
INPUT_PORTS_END
-MACHINE_CONFIG_START(stratos_state::stratos)
- MCFG_DEVICE_ADD("maincpu", M65C02, 5670000)
- MCFG_DEVICE_PROGRAM_MAP(stratos_mem)
+void stratos_state::stratos(machine_config &config)
+{
+ M65C02(config, maincpu, 5670000);
+ maincpu->set_addrmap(AS_PROGRAM, &stratos_state::stratos_mem);
- MCFG_SCREEN_ADD("screen", LCD)
- MCFG_SCREEN_REFRESH_RATE(50)
- MCFG_SCREEN_SIZE(240, 64)
- MCFG_SCREEN_VISIBLE_AREA(0, 239, 0, 63)
- MCFG_SCREEN_UPDATE_DRIVER(stratos_state, screen_update)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_LCD));
+ screen.set_refresh_hz(50);
+ screen.set_size(240, 64);
+ screen.set_visarea(0, 239, 0, 63);
+ screen.set_screen_update(FUNC(stratos_state::screen_update));
- MCFG_TIMER_DRIVER_ADD_PERIODIC("irq", stratos_state, irq_timer, attotime::from_hz(1000))
+ TIMER(config, "irq").configure_periodic(FUNC(stratos_state::irq_timer), attotime::from_hz(1000));
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
-MACHINE_CONFIG_END
+}
ROM_START( stratos )
ROM_REGION(0x20000, "roms_8000", 0)
@@ -374,5 +375,5 @@ ROM_START( stratos )
ROM_FILL(0x00000, 0x10000, 0xff)
ROM_END
-/* YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS */
-CONS( 1986, stratos, 0, 0, stratos, stratos, stratos_state, init_stratos, "Saitek", "Kasparov Stratos Chess Computer", MACHINE_NOT_WORKING | MACHINE_NO_SOUND)
+/* YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS */
+CONS( 1986, stratos, 0, 0, stratos, stratos, stratos_state, init_stratos, "SciSys", "Kasparov Chess Computer: Stratos", MACHINE_NOT_WORKING | MACHINE_NO_SOUND)
diff --git a/src/mame/drivers/strkzn.cpp b/src/mame/drivers/strkzn.cpp
index 2835d263db1..c8cc13becbe 100644
--- a/src/mame/drivers/strkzn.cpp
+++ b/src/mame/drivers/strkzn.cpp
@@ -56,15 +56,16 @@ void strkzn_state::light_io(address_map &map)
map(0x0007, 0x0007).nopr();
}
-MACHINE_CONFIG_START(strkzn_state::strkzn)
- MCFG_DEVICE_ADD("maincpu", Z80, 4000000)
- MCFG_DEVICE_PROGRAM_MAP(main_mem)
- MCFG_DEVICE_IO_MAP(main_io)
-
- MCFG_DEVICE_ADD("lightcpu", I80188, 10000000)
- MCFG_DEVICE_PROGRAM_MAP(light_mem)
- MCFG_DEVICE_IO_MAP(light_io)
-MACHINE_CONFIG_END
+void strkzn_state::strkzn(machine_config &config)
+{
+ Z80(config, m_maincpu, 4000000);
+ m_maincpu->set_addrmap(AS_PROGRAM, &strkzn_state::main_mem);
+ m_maincpu->set_addrmap(AS_IO, &strkzn_state::main_io);
+
+ I80188(config, m_lightcpu, 10000000);
+ m_lightcpu->set_addrmap(AS_PROGRAM, &strkzn_state::light_mem);
+ m_lightcpu->set_addrmap(AS_IO, &strkzn_state::light_io);
+}
INPUT_PORTS_START( strkzn )
INPUT_PORTS_END
diff --git a/src/mame/drivers/studio2.cpp b/src/mame/drivers/studio2.cpp
index ab9a8fac273..7991df403a7 100644
--- a/src/mame/drivers/studio2.cpp
+++ b/src/mame/drivers/studio2.cpp
@@ -514,10 +514,10 @@ WRITE8_MEMBER( mpt02_state::dma_w )
/* Machine Initialization */
// trampolines to cartridge
-READ8_MEMBER( studio2_state::cart_400 ) { return m_cart->read_rom(space, offset); }
-READ8_MEMBER( studio2_state::cart_a00 ) { return m_cart->read_rom(space, offset + 0x600); }
-READ8_MEMBER( studio2_state::cart_e00 ) { return m_cart->read_rom(space, offset + 0xa00); }
-READ8_MEMBER( mpt02_state::cart_c00 ) { return m_cart->read_rom(space, offset + 0x800); }
+READ8_MEMBER( studio2_state::cart_400 ) { return m_cart->read_rom(offset); }
+READ8_MEMBER( studio2_state::cart_a00 ) { return m_cart->read_rom(offset + 0x600); }
+READ8_MEMBER( studio2_state::cart_e00 ) { return m_cart->read_rom(offset + 0xa00); }
+READ8_MEMBER( mpt02_state::cart_c00 ) { return m_cart->read_rom(offset + 0x800); }
void studio2_state::machine_start()
{
@@ -645,10 +645,11 @@ MACHINE_CONFIG_START(studio2_state::studio2_cartslot)
MCFG_GENERIC_LOAD(studio2_state, studio2_cart_load)
/* software lists */
- MCFG_SOFTWARE_LIST_ADD("cart_list", "studio2")
+ SOFTWARE_LIST(config, "cart_list").set_original("studio2");
MACHINE_CONFIG_END
-MACHINE_CONFIG_START(studio2_state::studio2)
+void studio2_state::studio2(machine_config &config)
+{
/* basic machine hardware */
CDP1802(config, m_maincpu, 1760000); /* the real clock is derived from an oscillator circuit */
m_maincpu->set_addrmap(AS_PROGRAM, &studio2_state::studio2_map);
@@ -672,9 +673,10 @@ MACHINE_CONFIG_START(studio2_state::studio2)
BEEP(config, m_beeper, 300).add_route(ALL_OUTPUTS, "mono", 1.00);
studio2_cartslot(config);
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(visicom_state::visicom)
+void visicom_state::visicom(machine_config &config)
+{
/* basic machine hardware */
CDP1802(config, m_maincpu, XTAL(3'579'545)/2);
m_maincpu->set_addrmap(AS_PROGRAM, &visicom_state::visicom_map);
@@ -699,14 +701,14 @@ MACHINE_CONFIG_START(visicom_state::visicom)
SPEAKER(config, "mono").front_center();
BEEP(config, m_beeper, 300).add_route(ALL_OUTPUTS, "mono", 1.00);
- MCFG_GENERIC_CARTSLOT_ADD("cartslot", generic_plain_slot, "visicom_cart")
- MCFG_GENERIC_EXTENSIONS("bin,rom")
+ GENERIC_CARTSLOT(config, m_cart, generic_plain_slot, "visicom_cart", "bin,rom");
/* software lists */
- MCFG_SOFTWARE_LIST_ADD("cart_list", "visicom")
-MACHINE_CONFIG_END
+ SOFTWARE_LIST(config, "cart_list").set_original("visicom");
+}
-MACHINE_CONFIG_START(mpt02_state::mpt02)
+void mpt02_state::mpt02(machine_config &config)
+{
/* basic machine hardware */
CDP1802(config, m_maincpu, 1.75_MHz_XTAL);
m_maincpu->set_addrmap(AS_PROGRAM, &mpt02_state::mpt02_map);
@@ -735,7 +737,7 @@ MACHINE_CONFIG_START(mpt02_state::mpt02)
m_cti->add_route(ALL_OUTPUTS, "mono", 0.25);
studio2_cartslot(config);
-MACHINE_CONFIG_END
+}
/* ROMs */
diff --git a/src/mame/drivers/stuntair.cpp b/src/mame/drivers/stuntair.cpp
index 5457f0cf70f..3fcf547ecd6 100644
--- a/src/mame/drivers/stuntair.cpp
+++ b/src/mame/drivers/stuntair.cpp
@@ -518,16 +518,16 @@ void stuntair_state::machine_reset()
{
}
-MACHINE_CONFIG_START(stuntair_state::stuntair)
-
+void stuntair_state::stuntair(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, XTAL(18'432'000)/6) /* 3 MHz? */
- MCFG_DEVICE_PROGRAM_MAP(stuntair_map)
+ Z80(config, m_maincpu, XTAL(18'432'000)/6); /* 3 MHz? */
+ m_maincpu->set_addrmap(AS_PROGRAM, &stuntair_state::stuntair_map);
- MCFG_DEVICE_ADD("audiocpu", Z80, XTAL(18'432'000)/6) /* 3 MHz? */
- MCFG_DEVICE_PROGRAM_MAP(stuntair_sound_map)
- MCFG_DEVICE_IO_MAP(stuntair_sound_portmap)
- MCFG_DEVICE_PERIODIC_INT_DRIVER(stuntair_state, irq0_line_hold, 420) // drives music tempo, timing is approximate based on PCB audio recording.. and where is irq ack?
+ Z80(config, m_audiocpu, XTAL(18'432'000)/6); /* 3 MHz? */
+ m_audiocpu->set_addrmap(AS_PROGRAM, &stuntair_state::stuntair_sound_map);
+ m_audiocpu->set_addrmap(AS_IO, &stuntair_state::stuntair_sound_portmap);
+ m_audiocpu->set_periodic_int(FUNC(stuntair_state::irq0_line_hold), attotime::from_hz(420)); // drives music tempo, timing is approximate based on PCB audio recording.. and where is irq ack?
ls259_device &mainlatch(LS259(config, "mainlatch")); // type and location not verified
mainlatch.q_out_cb<0>().set_nop(); // set but never cleared
@@ -544,14 +544,14 @@ MACHINE_CONFIG_START(stuntair_state::stuntair)
WATCHDOG_TIMER(config, "watchdog");
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60) // ?
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(256, 256)
- MCFG_SCREEN_VISIBLE_AREA(0, 256-1, 16, 256-16-1)
- MCFG_SCREEN_UPDATE_DRIVER(stuntair_state, screen_update_stuntair)
- MCFG_SCREEN_PALETTE(m_palette)
- MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE(*this, stuntair_state, stuntair_irq))
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60); // ?
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(256, 256);
+ screen.set_visarea(0, 256-1, 16, 256-16-1);
+ screen.set_screen_update(FUNC(stuntair_state::screen_update_stuntair));
+ screen.set_palette(m_palette);
+ screen.screen_vblank().set(FUNC(stuntair_state::stuntair_irq));
GFXDECODE(config, m_gfxdecode, m_palette, gfx_stuntair);
PALETTE(config, m_palette, FUNC(stuntair_state::stuntair_palette), 0x100 + 2);
@@ -567,7 +567,7 @@ MACHINE_CONFIG_START(stuntair_state::stuntair)
ay1.add_route(ALL_OUTPUTS, "mono", 0.50);
AY8910(config, "ay2", XTAL(18'432'000)/12).add_route(ALL_OUTPUTS, "mono", 0.50);
-MACHINE_CONFIG_END
+}
diff --git a/src/mame/drivers/su2000.cpp b/src/mame/drivers/su2000.cpp
index 3fc8bdac1d4..d5efb43f96d 100644
--- a/src/mame/drivers/su2000.cpp
+++ b/src/mame/drivers/su2000.cpp
@@ -126,25 +126,26 @@ static void ide_interrupt(device_t *device, int state)
*
*************************************/
-MACHINE_CONFIG_START(su2000_state::su2000)
+void su2000_state::su2000(machine_config &config)
+{
/* Basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", I486, I486_CLOCK)
- MCFG_DEVICE_PROGRAM_MAP(pcat_map)
- MCFG_DEVICE_IO_MAP(pcat_io)
- MCFG_DEVICE_IRQ_ACKNOWLEDGE_DEVICE("pic8259_1", pic8259_device, inta_cb)
+ I486(config, m_maincpu, I486_CLOCK);
+ m_maincpu->set_addrmap(AS_PROGRAM, &su2000_state::pcat_map);
+ m_maincpu->set_addrmap(AS_IO, &su2000_state::pcat_io);
+ m_maincpu->set_irq_acknowledge_callback("pic8259_1", FUNC(pic8259_device::inta_cb));
#if 0
- MCFG_DEVICE_ADD("tracker", TMS32031, TMS320C1_CLOCK)
- MCFG_DEVICE_PROGRAM_MAP(tracker_map)
+ tms32031_device &tracker(TMS32031(config, "tracker", TMS320C1_CLOCK));
+ tracker.set_addrmap(AS_PROGRAM, &su2000_state::tracker_map);
- MCFG_DEVICE_ADD("pix_cpu1", MC88110, MC88110_CLOCK)
- MCFG_DEVICE_PROGRAM_MAP(pix_cpu_a)
+ mc88100_device &pix_cpu1(MC88110(config, "pix_cpu1", MC88110_CLOCK));
+ pix_cpu1.set_addrmap(AS_PROGRAM, &su2000_state::pix_cpu_a);
- MCFG_DEVICE_ADD("pix_cpu2", MC88110, MC88110_CLOCK)
- MCFG_DEVICE_PROGRAM_MAP(pix_cpu_b)
+ mc88100_device &pix_cpu2(MC88110(config, "pix_cpu2", MC88110_CLOCK));
+ pix_cpu2.set_addrmap(AS_PROGRAM, &su2000_state::pix_cpu_b);
- MCFG_DEVICE_ADD("format_c", M68000, XTAL(10'000'000))
- MCFG_DEVICE_PROGRAM_MAP(formatc_map)
+ m68000_device &format_c(M68000(config, "format_c", XTAL(10'000'000)));
+ format_c.set_addrmap(AS_PROGRAM, &su2000_state::formatc_map);
#endif
/* Video hardware */
@@ -155,7 +156,7 @@ MACHINE_CONFIG_START(su2000_state::su2000)
DS12885(config.replace(), m_mc146818); // TODO: Rename m_mc146818 to m_rtc
m_mc146818->irq().set("pic8259_2", FUNC(pic8259_device::ir0_w));
m_mc146818->set_century_index(0x32);
-MACHINE_CONFIG_END
+}
/*************************************
diff --git a/src/mame/drivers/sub.cpp b/src/mame/drivers/sub.cpp
index d75efae046e..1cfb53523a4 100644
--- a/src/mame/drivers/sub.cpp
+++ b/src/mame/drivers/sub.cpp
@@ -304,17 +304,17 @@ INTERRUPT_GEN_MEMBER(sub_state::sound_irq)
-MACHINE_CONFIG_START(sub_state::sub)
-
+void sub_state::sub(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80,MASTER_CLOCK/6) /* ? MHz */
- MCFG_DEVICE_PROGRAM_MAP(subm_map)
- MCFG_DEVICE_IO_MAP(subm_io)
+ Z80(config, m_maincpu, MASTER_CLOCK/6); /* ? MHz */
+ m_maincpu->set_addrmap(AS_PROGRAM, &sub_state::subm_map);
+ m_maincpu->set_addrmap(AS_IO, &sub_state::subm_io);
- MCFG_DEVICE_ADD("soundcpu", Z80,MASTER_CLOCK/6) /* ? MHz */
- MCFG_DEVICE_PROGRAM_MAP(subm_sound_map)
- MCFG_DEVICE_IO_MAP(subm_sound_io)
- MCFG_DEVICE_PERIODIC_INT_DRIVER(sub_state, sound_irq, 120) //???
+ Z80(config, m_soundcpu, MASTER_CLOCK/6); /* ? MHz */
+ m_soundcpu->set_addrmap(AS_PROGRAM, &sub_state::subm_sound_map);
+ m_soundcpu->set_addrmap(AS_IO, &sub_state::subm_sound_io);
+ m_soundcpu->set_periodic_int(FUNC(sub_state::sound_irq), attotime::from_hz(120)); //???
ls259_device &mainlatch(LS259(config, "mainlatch"));
mainlatch.q_out_cb<0>().set(FUNC(sub_state::int_mask_w));
@@ -325,14 +325,14 @@ MACHINE_CONFIG_START(sub_state::sub)
WATCHDOG_TIMER(config, "watchdog");
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(256, 256)
- MCFG_SCREEN_VISIBLE_AREA(0, 256-1, 16, 256-16-1)
- MCFG_SCREEN_UPDATE_DRIVER(sub_state, screen_update)
- MCFG_SCREEN_PALETTE(m_palette)
- MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE(*this, sub_state, main_irq))
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(256, 256);
+ screen.set_visarea(0, 256-1, 16, 256-16-1);
+ screen.set_screen_update(FUNC(sub_state::screen_update));
+ screen.set_palette(m_palette);
+ screen.screen_vblank().set(FUNC(sub_state::main_irq));
GFXDECODE(config, m_gfxdecode, m_palette, gfx_sub);
PALETTE(config, m_palette, FUNC(sub_state::sub_palette), 0x400, 0x100);
@@ -348,7 +348,7 @@ MACHINE_CONFIG_START(sub_state::sub)
AY8910(config, "ay1", MASTER_CLOCK/6/2).add_route(ALL_OUTPUTS, "mono", 0.23); /* ? Mhz */
AY8910(config, "ay2", MASTER_CLOCK/6/2).add_route(ALL_OUTPUTS, "mono", 0.23); /* ? Mhz */
-MACHINE_CONFIG_END
+}
ROM_START( sub )
diff --git a/src/mame/drivers/subs.cpp b/src/mame/drivers/subs.cpp
index aeecb9e28c0..b5622eac858 100644
--- a/src/mame/drivers/subs.cpp
+++ b/src/mame/drivers/subs.cpp
@@ -173,36 +173,36 @@ GFXDECODE_END
*
*************************************/
-MACHINE_CONFIG_START(subs_state::subs)
-
+void subs_state::subs(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M6502,12096000/16) /* clock input is the "4H" signal */
- MCFG_DEVICE_PROGRAM_MAP(main_map)
- MCFG_DEVICE_PERIODIC_INT_DRIVER(subs_state, interrupt, 4*57)
+ M6502(config, m_maincpu, 12096000/16); /* clock input is the "4H" signal */
+ m_maincpu->set_addrmap(AS_PROGRAM, &subs_state::main_map);
+ m_maincpu->set_periodic_int(FUNC(subs_state::interrupt), attotime::from_hz(4*57));
/* video hardware */
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, m_palette, gfx_subs)
+ GFXDECODE(config, m_gfxdecode, m_palette, gfx_subs);
PALETTE(config, m_palette, FUNC(subs_state::subs_palette), 4);
config.set_default_layout(layout_dualhsxs);
- MCFG_SCREEN_ADD("lscreen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(57)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */)
- MCFG_SCREEN_SIZE(32*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 0*8, 28*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(subs_state, screen_update_left)
- MCFG_SCREEN_PALETTE(m_palette)
+ screen_device &lscreen(SCREEN(config, "lscreen", SCREEN_TYPE_RASTER));
+ lscreen.set_refresh_hz(57);
+ lscreen.set_vblank_time(ATTOSECONDS_IN_USEC(2500) /* not accurate */);
+ lscreen.set_size(32*8, 32*8);
+ lscreen.set_visarea(0*8, 32*8-1, 0*8, 28*8-1);
+ lscreen.set_screen_update(FUNC(subs_state::screen_update_left));
+ lscreen.set_palette(m_palette);
- MCFG_SCREEN_ADD("rscreen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(57)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */)
- MCFG_SCREEN_SIZE(32*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 0*8, 28*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(subs_state, screen_update_right)
- MCFG_SCREEN_PALETTE(m_palette)
+ screen_device &rscreen(SCREEN(config, "rscreen", SCREEN_TYPE_RASTER));
+ rscreen.set_refresh_hz(57);
+ rscreen.set_vblank_time(ATTOSECONDS_IN_USEC(2500) /* not accurate */);
+ rscreen.set_size(32*8, 32*8);
+ rscreen.set_visarea(0*8, 32*8-1, 0*8, 28*8-1);
+ rscreen.set_screen_update(FUNC(subs_state::screen_update_right));
+ rscreen.set_palette(m_palette);
/* sound hardware */
@@ -221,7 +221,7 @@ MACHINE_CONFIG_START(subs_state::subs)
latch.q_out_cb<5>().set(m_discrete, FUNC(discrete_device::write_line<SUBS_CRASH_EN>));
latch.q_out_cb<6>().set(FUNC(subs_state::invert1_w));
latch.q_out_cb<7>().set(FUNC(subs_state::invert2_w));
-MACHINE_CONFIG_END
+}
diff --git a/src/mame/drivers/subsino.cpp b/src/mame/drivers/subsino.cpp
index 0a55731dfaa..c9272645251 100644
--- a/src/mame/drivers/subsino.cpp
+++ b/src/mame/drivers/subsino.cpp
@@ -2704,11 +2704,12 @@ GFXDECODE_END
* Machine Drivers *
***************************************************************************/
-MACHINE_CONFIG_START(subsino_state::victor21)
+void subsino_state::victor21(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z180, XTAL(12'000'000) / 8) /* Unknown clock */
- MCFG_DEVICE_PROGRAM_MAP(victor21_map)
- MCFG_DEVICE_IO_MAP(subsino_iomap)
+ Z180(config, m_maincpu, XTAL(12'000'000) / 8); /* Unknown clock */
+ m_maincpu->set_addrmap(AS_PROGRAM, &subsino_state::victor21_map);
+ m_maincpu->set_addrmap(AS_IO, &subsino_state::subsino_iomap);
i8255_device &ppi(I8255A(config, "ppi"));
ppi.out_pa_callback().set(FUNC(subsino_state::out_a_w));
@@ -2717,16 +2718,16 @@ MACHINE_CONFIG_START(subsino_state::victor21)
ppi.tri_pb_callback().set_constant(0);
ppi.in_pc_callback().set_ioport("INC");
- MCFG_TICKET_DISPENSER_ADD("hopper", attotime::from_msec(200), TICKET_MOTOR_ACTIVE_HIGH, TICKET_STATUS_ACTIVE_LOW)
+ TICKET_DISPENSER(config, m_hopper, attotime::from_msec(200), TICKET_MOTOR_ACTIVE_HIGH, TICKET_STATUS_ACTIVE_LOW);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(512, 256)
- MCFG_SCREEN_VISIBLE_AREA(0, 512-1, 0+16, 256-16-1)
- MCFG_SCREEN_UPDATE_DRIVER(subsino_state, screen_update)
- MCFG_SCREEN_PALETTE(m_palette)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(512, 256);
+ screen.set_visarea(0, 512-1, 0+16, 256-16-1);
+ screen.set_screen_update(FUNC(subsino_state::screen_update));
+ screen.set_palette(m_palette);
GFXDECODE(config, m_gfxdecode, m_palette, subsino_depth3);
@@ -2737,39 +2738,38 @@ MACHINE_CONFIG_START(subsino_state::victor21)
/* sound hardware */
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("ymsnd", YM2413, XTAL(3'579'545))
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
+ YM2413(config, "ymsnd", XTAL(3'579'545)).add_route(ALL_OUTPUTS, "mono", 1.0);
- MCFG_DEVICE_ADD("oki", OKIM6295, XTAL(4'433'619) / 4, okim6295_device::PIN7_HIGH) /* Clock frequency & pin 7 not verified */
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
-MACHINE_CONFIG_END
+ OKIM6295(config, "oki", XTAL(4'433'619) / 4, okim6295_device::PIN7_HIGH).add_route(ALL_OUTPUTS, "mono", 1.0); /* Clock frequency & pin 7 not verified */
+}
/* same but with an additional protection. */
-MACHINE_CONFIG_START(subsino_state::victor5)
+void subsino_state::victor5(machine_config &config)
+{
victor21(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(victor5_map)
-MACHINE_CONFIG_END
+ m_maincpu->set_addrmap(AS_PROGRAM, &subsino_state::victor5_map);
+}
-MACHINE_CONFIG_START(subsino_state::crsbingo)
+void subsino_state::crsbingo(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z180, XTAL(12'000'000) / 8) /* Unknown CPU and clock */
- MCFG_DEVICE_PROGRAM_MAP(crsbingo_map)
- MCFG_DEVICE_IO_MAP(subsino_iomap)
+ Z180(config, m_maincpu, XTAL(12'000'000) / 8); /* Unknown CPU and clock */
+ m_maincpu->set_addrmap(AS_PROGRAM, &subsino_state::crsbingo_map);
+ m_maincpu->set_addrmap(AS_IO, &subsino_state::subsino_iomap);
- MCFG_TICKET_DISPENSER_ADD("hopper", attotime::from_msec(200), TICKET_MOTOR_ACTIVE_HIGH, TICKET_STATUS_ACTIVE_LOW)
+ TICKET_DISPENSER(config, m_hopper, attotime::from_msec(200), TICKET_MOTOR_ACTIVE_HIGH, TICKET_STATUS_ACTIVE_LOW);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(512, 256)
- MCFG_SCREEN_VISIBLE_AREA(0, 512-1, 0+16, 256-16-1)
- MCFG_SCREEN_UPDATE_DRIVER(subsino_state, screen_update)
- MCFG_SCREEN_PALETTE(m_palette)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(512, 256);
+ screen.set_visarea(0, 512-1, 0+16, 256-16-1);
+ screen.set_screen_update(FUNC(subsino_state::screen_update));
+ screen.set_palette(m_palette);
GFXDECODE(config, m_gfxdecode, m_palette, subsino_depth4);
@@ -2780,16 +2780,16 @@ MACHINE_CONFIG_START(subsino_state::crsbingo)
/* sound hardware */
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("ymsnd", YM2413, XTAL(3'579'545)) /* Unknown clock */
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
-MACHINE_CONFIG_END
+ YM2413(config, "ymsnd", XTAL(3'579'545)).add_route(ALL_OUTPUTS, "mono", 1.0); /* Unknown clock */
+}
-MACHINE_CONFIG_START(subsino_state::srider)
+void subsino_state::srider(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z180, XTAL(12'000'000) / 8) /* Unknown clock */
- MCFG_DEVICE_PROGRAM_MAP(srider_map)
- MCFG_DEVICE_IO_MAP(subsino_iomap)
+ Z180(config, m_maincpu, XTAL(12'000'000) / 8); /* Unknown clock */
+ m_maincpu->set_addrmap(AS_PROGRAM, &subsino_state::srider_map);
+ m_maincpu->set_addrmap(AS_IO, &subsino_state::subsino_iomap);
i8255_device &ppi1(I8255A(config, "ppi1"));
ppi1.in_pa_callback().set_ioport("SW1");
@@ -2801,16 +2801,16 @@ MACHINE_CONFIG_START(subsino_state::srider)
ppi2.in_pb_callback().set_ioport("INA");
ppi2.in_pc_callback().set_ioport("INB");
- MCFG_TICKET_DISPENSER_ADD("hopper", attotime::from_msec(200), TICKET_MOTOR_ACTIVE_HIGH, TICKET_STATUS_ACTIVE_LOW)
+ TICKET_DISPENSER(config, m_hopper, attotime::from_msec(200), TICKET_MOTOR_ACTIVE_HIGH, TICKET_STATUS_ACTIVE_LOW);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(512, 256)
- MCFG_SCREEN_VISIBLE_AREA(0, 512-1, 0+16, 256-16-1)
- MCFG_SCREEN_UPDATE_DRIVER(subsino_state, screen_update)
- MCFG_SCREEN_PALETTE(m_palette)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(512, 256);
+ screen.set_visarea(0, 512-1, 0+16, 256-16-1);
+ screen.set_screen_update(FUNC(subsino_state::screen_update));
+ screen.set_palette(m_palette);
GFXDECODE(config, m_gfxdecode, m_palette, subsino_depth4);
@@ -2821,27 +2821,26 @@ MACHINE_CONFIG_START(subsino_state::srider)
/* sound hardware */
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("ymsnd", YM3812, XTAL(3'579'545))
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
+ YM3812(config, "ymsnd", XTAL(3'579'545)).add_route(ALL_OUTPUTS, "mono", 1.0);
- MCFG_DEVICE_ADD("oki", OKIM6295, XTAL(4'433'619) / 4, okim6295_device::PIN7_HIGH) /* Clock frequency & pin 7 not verified */
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
-MACHINE_CONFIG_END
+ OKIM6295(config, "oki", XTAL(4'433'619) / 4, okim6295_device::PIN7_HIGH).add_route(ALL_OUTPUTS, "mono", 1.0); /* Clock frequency & pin 7 not verified */
+}
-MACHINE_CONFIG_START(subsino_state::sharkpy)
+void subsino_state::sharkpy(machine_config &config)
+{
srider(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(sharkpy_map)
-MACHINE_CONFIG_END
+ m_maincpu->set_addrmap(AS_PROGRAM, &subsino_state::sharkpy_map);
+}
-MACHINE_CONFIG_START(subsino_state::tisub)
+void subsino_state::tisub(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z180, XTAL(12'000'000) / 8) /* Unknown CPU and clock */
- MCFG_DEVICE_PROGRAM_MAP(tisub_map)
- MCFG_DEVICE_IO_MAP(subsino_iomap)
+ Z180(config, m_maincpu, XTAL(12'000'000) / 8); /* Unknown CPU and clock */
+ m_maincpu->set_addrmap(AS_PROGRAM, &subsino_state::tisub_map);
+ m_maincpu->set_addrmap(AS_IO, &subsino_state::subsino_iomap);
i8255_device &ppi1(I8255A(config, "ppi1"));
ppi1.in_pa_callback().set_ioport("SW1");
@@ -2853,16 +2852,16 @@ MACHINE_CONFIG_START(subsino_state::tisub)
ppi2.in_pb_callback().set_ioport("INA");
ppi2.in_pc_callback().set_ioport("INB");
- MCFG_TICKET_DISPENSER_ADD("hopper", attotime::from_msec(200), TICKET_MOTOR_ACTIVE_HIGH, TICKET_STATUS_ACTIVE_LOW)
+ TICKET_DISPENSER(config, m_hopper, attotime::from_msec(200), TICKET_MOTOR_ACTIVE_HIGH, TICKET_STATUS_ACTIVE_LOW);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(512, 256)
- MCFG_SCREEN_VISIBLE_AREA(0, 512-1, 0+16, 256-16-1)
- MCFG_SCREEN_UPDATE_DRIVER(subsino_state, screen_update_reels)
- MCFG_SCREEN_PALETTE(m_palette)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(512, 256);
+ screen.set_visarea(0, 512-1, 0+16, 256-16-1);
+ screen.set_screen_update(FUNC(subsino_state::screen_update_reels));
+ screen.set_palette(m_palette);
GFXDECODE(config, m_gfxdecode, m_palette, subsino_depth4_reels);
@@ -2873,15 +2872,15 @@ MACHINE_CONFIG_START(subsino_state::tisub)
/* sound hardware */
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("ymsnd", YM3812, XTAL(3'579'545)) /* Unknown clock */
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
-MACHINE_CONFIG_END
+ YM3812(config, "ymsnd", XTAL(3'579'545)).add_route(ALL_OUTPUTS, "mono", 1.0); /* Unknown clock */
+}
-MACHINE_CONFIG_START(subsino_state::stbsub)
+void subsino_state::stbsub(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z180, XTAL(12'000'000) / 8) /* Unknown clock */
- MCFG_DEVICE_PROGRAM_MAP(stbsub_map)
- MCFG_DEVICE_IO_MAP(subsino_iomap)
+ Z180(config, m_maincpu, XTAL(12'000'000) / 8); /* Unknown clock */
+ m_maincpu->set_addrmap(AS_PROGRAM, &subsino_state::stbsub_map);
+ m_maincpu->set_addrmap(AS_IO, &subsino_state::subsino_iomap);
i8255_device &ppi1(I8255A(config, "ppi1"));
ppi1.in_pa_callback().set_ioport("SW1");
@@ -2894,16 +2893,16 @@ MACHINE_CONFIG_START(subsino_state::stbsub)
ppi2.in_pc_callback().set_ioport("INA");
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
- MCFG_TICKET_DISPENSER_ADD("hopper", attotime::from_msec(200), TICKET_MOTOR_ACTIVE_HIGH, TICKET_STATUS_ACTIVE_LOW)
+ TICKET_DISPENSER(config, m_hopper, attotime::from_msec(200), TICKET_MOTOR_ACTIVE_HIGH, TICKET_STATUS_ACTIVE_LOW);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(512, 256)
- MCFG_SCREEN_VISIBLE_AREA(0, 512-1, 0+16, 256-16-1)
- MCFG_SCREEN_UPDATE_DRIVER(subsino_state, screen_update_stbsub_reels)
- MCFG_SCREEN_PALETTE(m_palette)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(512, 256);
+ screen.set_visarea(0, 512-1, 0+16, 256-16-1);
+ screen.set_screen_update(FUNC(subsino_state::screen_update_stbsub_reels));
+ screen.set_palette(m_palette);
GFXDECODE(config, m_gfxdecode, m_palette, subsino_stbsub);
@@ -2918,17 +2917,16 @@ MACHINE_CONFIG_START(subsino_state::stbsub)
/* sound hardware */
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("ymsnd", YM3812, XTAL(3'579'545))
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
-MACHINE_CONFIG_END
+ YM3812(config, "ymsnd", XTAL(3'579'545)).add_route(ALL_OUTPUTS, "mono", 1.0);
+}
-MACHINE_CONFIG_START(subsino_state::mtrainnv)
+void subsino_state::mtrainnv(machine_config &config)
+{
stbsub(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(mtrainnv_map)
-MACHINE_CONFIG_END
+ m_maincpu->set_addrmap(AS_PROGRAM, &subsino_state::mtrainnv_map);
+}
/***************************************************************************
diff --git a/src/mame/drivers/subsino2.cpp b/src/mame/drivers/subsino2.cpp
index 59885ec840a..2d6931de584 100644
--- a/src/mame/drivers/subsino2.cpp
+++ b/src/mame/drivers/subsino2.cpp
@@ -22,7 +22,9 @@ Year Game CPU Sound Custom
1999 Bishou Jan H8/3044** SS9904 SS9601, SS9802, SS9803 HM86171 RAMDAC, Battery
1999 X-Train/P-Train AM188-EM M6295 SS9601, SS9802, SS9803 HM86171 RAMDAC, Battery
2000 New 2001 H8/3044** SS9904 SS9601, SS9802, SS9803 HM86171 RAMDAC, Battery
+2001 Queen Bee H8/3044** SS9804 SS9601, SS9802, SS9803 HM86171 RAMDAC, Battery
2001 Humlan's Lyckohjul H8/3044** SS9804 SS9601, SS9802, SS9803 HM86171 RAMDAC, Battery
+2002 Super Queen Bee H8/3044** ? ? ?
2006 X-Plan AM188-EM M6295 SS9601, SS9802, SS9803 HM86171 RAMDAC, Battery
----------------------------------------------------------------------------------------------------------------
*SS9600 **SS9689
@@ -34,7 +36,7 @@ To do:
- ptrain: missing scroll in race screens.
- humlan: empty reels when bonus image should scroll in via L0 scroll. The image (crown/fruits) is at y > 0x100 in the tilemap.
- saklove, xplan: remove IRQ hacks (when an AM188-EM core will be available).
-- bishjan, new2001, humlan, saklove: game is sometimes too fast (can bishjan read the VBLANK state? saklove and xplan can).
+- bishjan, new2001, humlan, saklove, squeenb: game is sometimes too fast (can bishjan read the VBLANK state? saklove and xplan can).
- xtrain: it runs faster than a video from the real thing. It doesn't use vblank irqs (but reads the vblank bit).
- mtrain: implement hopper. Double up does not work?
@@ -113,7 +115,10 @@ public:
void init_bishjan();
void init_new2001();
+ void init_queenbee();
+ void init_queenbeeb();
void init_humlan();
+ void init_squeenb();
void init_xtrain();
void init_expcard();
void init_wtrnymph();
@@ -2380,24 +2385,25 @@ INPUT_PORTS_END
Bishou Jan
***************************************************************************/
-MACHINE_CONFIG_START(subsino2_state::bishjan)
- MCFG_DEVICE_ADD("maincpu", H83044, XTAL(44'100'000) / 3)
- MCFG_DEVICE_PROGRAM_MAP( bishjan_map )
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", subsino2_state, irq0_line_hold)
+void subsino2_state::bishjan(machine_config &config)
+{
+ H83044(config, m_maincpu, XTAL(44'100'000) / 3);
+ m_maincpu->set_addrmap(AS_PROGRAM, &subsino2_state::bishjan_map);
+ m_maincpu->set_vblank_int("screen", FUNC(subsino2_state::irq0_line_hold));
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
- MCFG_TICKET_DISPENSER_ADD("hopper", attotime::from_msec(200), TICKET_MOTOR_ACTIVE_HIGH, TICKET_STATUS_ACTIVE_HIGH)
+ TICKET_DISPENSER(config, m_hopper, attotime::from_msec(200), TICKET_MOTOR_ACTIVE_HIGH, TICKET_STATUS_ACTIVE_HIGH);
// video hardware
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_SIZE( 512, 256 )
- MCFG_SCREEN_VISIBLE_AREA( 0, 512-1, 0, 256-16-1 )
- MCFG_SCREEN_REFRESH_RATE( 60 )
- MCFG_SCREEN_UPDATE_DRIVER(subsino2_state, screen_update_subsino2)
- MCFG_SCREEN_PALETTE("palette")
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_size(512, 256);
+ m_screen->set_visarea(0, 512-1, 0, 256-16-1);
+ m_screen->set_refresh_hz(60);
+ m_screen->set_screen_update(FUNC(subsino2_state::screen_update_subsino2));
+ m_screen->set_palette(m_palette);
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_ss9601)
- MCFG_PALETTE_ADD( "palette", 256 )
+ GFXDECODE(config, m_gfxdecode, m_palette, gfx_ss9601);
+ PALETTE(config, m_palette).set_entries(256);
ramdac_device &ramdac(RAMDAC(config, "ramdac", 0, m_palette)); // HMC HM86171 VGA 256 colour RAMDAC
ramdac.set_addrmap(0, &subsino2_state::ramdac_map);
@@ -2406,50 +2412,51 @@ MACHINE_CONFIG_START(subsino2_state::bishjan)
// sound hardware
// SS9904
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(subsino2_state::new2001)
+void subsino2_state::new2001(machine_config &config)
+{
bishjan(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP( new2001_map )
+ m_maincpu->set_addrmap(AS_PROGRAM, &subsino2_state::new2001_map);
- MCFG_SCREEN_MODIFY("screen")
- MCFG_SCREEN_SIZE( 640, 256 )
- MCFG_SCREEN_VISIBLE_AREA( 0, 640-1, 0, 256-16-1 )
-MACHINE_CONFIG_END
+ m_screen->set_size(640, 256);
+ m_screen->set_visarea(0, 640-1, 0, 256-16-1);
+}
-MACHINE_CONFIG_START(subsino2_state::humlan)
+void subsino2_state::humlan(machine_config &config)
+{
bishjan(config);
- MCFG_DEVICE_REPLACE("maincpu", H83044, XTAL(48'000'000) / 3)
- MCFG_DEVICE_PROGRAM_MAP( humlan_map )
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", subsino2_state, irq0_line_hold)
+ H83044(config.replace(), m_maincpu, XTAL(48'000'000) / 3);
+ m_maincpu->set_addrmap(AS_PROGRAM, &subsino2_state::humlan_map);
+ m_maincpu->set_vblank_int("screen", FUNC(subsino2_state::irq0_line_hold));
// sound hardware
// SS9804
-MACHINE_CONFIG_END
+}
/***************************************************************************
Magic Train
***************************************************************************/
-MACHINE_CONFIG_START(subsino2_state::mtrain)
- MCFG_DEVICE_ADD("maincpu", Z180, XTAL(12'000'000) / 8) /* Unknown clock */
- MCFG_DEVICE_PROGRAM_MAP( mtrain_map )
- MCFG_DEVICE_IO_MAP( mtrain_io )
+void subsino2_state::mtrain(machine_config &config)
+{
+ Z180(config, m_maincpu, XTAL(12'000'000) / 8); /* Unknown clock */
+ m_maincpu->set_addrmap(AS_PROGRAM, &subsino2_state::mtrain_map);
+ m_maincpu->set_addrmap(AS_IO, &subsino2_state::mtrain_io);
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
// video hardware
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_SIZE( 512, 256 )
- MCFG_SCREEN_VISIBLE_AREA( 0, 512-1, 0, 256-32-1 )
- MCFG_SCREEN_REFRESH_RATE( 58.7270 )
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) // game reads vblank state
- MCFG_SCREEN_UPDATE_DRIVER(subsino2_state, screen_update_subsino2)
- MCFG_SCREEN_PALETTE("palette")
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_size(512, 256);
+ m_screen->set_visarea(0, 512-1, 0, 256-32-1);
+ m_screen->set_refresh_hz(58.7270);
+ m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(2500) /* not accurate */); // game reads vblank state
+ m_screen->set_screen_update(FUNC(subsino2_state::screen_update_subsino2));
+ m_screen->set_palette(m_palette);
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_ss9601)
- MCFG_PALETTE_ADD( "palette", 256 )
+ GFXDECODE(config, m_gfxdecode, m_palette, gfx_ss9601);
+ PALETTE(config, m_palette).set_entries(256);
ramdac_device &ramdac(RAMDAC(config, "ramdac", 0, m_palette)); // HMC HM86171 VGA 256 colour RAMDAC
ramdac.set_addrmap(0, &subsino2_state::ramdac_map);
@@ -2459,32 +2466,33 @@ MACHINE_CONFIG_START(subsino2_state::mtrain)
// sound hardware
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("oki", OKIM6295, XTAL(8'467'200) / 8, okim6295_device::PIN7_HIGH) // probably
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
-MACHINE_CONFIG_END
+ OKIM6295(config, m_oki, XTAL(8'467'200) / 8, okim6295_device::PIN7_HIGH); // probably
+ m_oki->add_route(ALL_OUTPUTS, "mono", 1.0);
+}
/***************************************************************************
Sakura Love - Ying Hua Lian
***************************************************************************/
-MACHINE_CONFIG_START(subsino2_state::saklove)
- MCFG_DEVICE_ADD("maincpu", I80188, XTAL(20'000'000)*2 ) // !! AMD AM188-EM !!
- MCFG_DEVICE_PROGRAM_MAP( saklove_map )
- MCFG_DEVICE_IO_MAP( saklove_io )
+void subsino2_state::saklove(machine_config &config)
+{
+ I80188(config, m_maincpu, XTAL(20'000'000)*2); // !! AMD AM188-EM !!
+ m_maincpu->set_addrmap(AS_PROGRAM, &subsino2_state::saklove_map);
+ m_maincpu->set_addrmap(AS_IO, &subsino2_state::saklove_io);
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
// video hardware
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_SIZE( 512, 256 )
- MCFG_SCREEN_VISIBLE_AREA( 0, 512-1, 0, 256-16-1 )
- MCFG_SCREEN_REFRESH_RATE( 58.7270 )
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) // game reads vblank state
- MCFG_SCREEN_UPDATE_DRIVER(subsino2_state, screen_update_subsino2)
- MCFG_SCREEN_PALETTE("palette")
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_size(512, 256);
+ m_screen->set_visarea(0, 512-1, 0, 256-16-1);
+ m_screen->set_refresh_hz(58.7270);
+ m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(2500) /* not accurate */); // game reads vblank state
+ m_screen->set_screen_update(FUNC(subsino2_state::screen_update_subsino2));
+ m_screen->set_palette(m_palette);
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_ss9601)
- MCFG_PALETTE_ADD( "palette", 256 )
+ GFXDECODE(config, m_gfxdecode, m_palette, gfx_ss9601);
+ PALETTE(config, m_palette).set_entries(256);
ramdac_device &ramdac(RAMDAC(config, "ramdac", 0, m_palette)); // HMC HM86171 VGA 256 colour RAMDAC
ramdac.set_addrmap(0, &subsino2_state::ramdac_map);
@@ -2494,36 +2502,35 @@ MACHINE_CONFIG_START(subsino2_state::saklove)
// sound hardware
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("oki", OKIM6295, XTAL(8'467'200) / 8, okim6295_device::PIN7_HIGH)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.80)
+ OKIM6295(config, m_oki, XTAL(8'467'200) / 8, okim6295_device::PIN7_HIGH).add_route(ALL_OUTPUTS, "mono", 0.80);
- MCFG_DEVICE_ADD("ymsnd", YM3812, XTAL(12'000'000) / 4) // ? chip and clock unknown
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.80)
-MACHINE_CONFIG_END
+ YM3812(config, "ymsnd", XTAL(12'000'000) / 4).add_route(ALL_OUTPUTS, "mono", 0.80); // ? chip and clock unknown
+}
/***************************************************************************
X-Plan
***************************************************************************/
-MACHINE_CONFIG_START(subsino2_state::xplan)
- MCFG_DEVICE_ADD("maincpu", I80188, XTAL(20'000'000)*2 ) // !! AMD AM188-EM !!
- MCFG_DEVICE_PROGRAM_MAP( xplan_map )
- MCFG_DEVICE_IO_MAP( xplan_io )
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", subsino2_state, am188em_int0_irq)
+void subsino2_state::xplan(machine_config &config)
+{
+ I80188(config, m_maincpu, XTAL(20'000'000)*2); // !! AMD AM188-EM !!
+ m_maincpu->set_addrmap(AS_PROGRAM, &subsino2_state::xplan_map);
+ m_maincpu->set_addrmap(AS_IO, &subsino2_state::xplan_io);
+ m_maincpu->set_vblank_int("screen", FUNC(subsino2_state::am188em_int0_irq));
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
// video hardware
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_SIZE( 512, 256 )
- MCFG_SCREEN_VISIBLE_AREA( 0, 512-1, 0, 256-16-1 )
- MCFG_SCREEN_REFRESH_RATE( 58.7270 )
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) // game reads vblank state
- MCFG_SCREEN_UPDATE_DRIVER(subsino2_state, screen_update_subsino2)
- MCFG_SCREEN_PALETTE("palette")
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_size(512, 256);
+ m_screen->set_visarea(0, 512-1, 0, 256-16-1);
+ m_screen->set_refresh_hz(58.7270);
+ m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(2500) /* not accurate */); // game reads vblank state
+ m_screen->set_screen_update(FUNC(subsino2_state::screen_update_subsino2));
+ m_screen->set_palette(m_palette);
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_ss9601)
- MCFG_PALETTE_ADD( "palette", 256 )
+ GFXDECODE(config, m_gfxdecode, m_palette, gfx_ss9601);
+ PALETTE(config, m_palette).set_entries(256);
ramdac_device &ramdac(RAMDAC(config, "ramdac", 0, m_palette)); // HMC HM86171 VGA 256 colour RAMDAC
ramdac.set_addrmap(0, &subsino2_state::ramdac_map);
@@ -2533,21 +2540,20 @@ MACHINE_CONFIG_START(subsino2_state::xplan)
// sound hardware
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("oki", OKIM6295, XTAL(8'467'200) / 8, okim6295_device::PIN7_HIGH) // probably
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
-MACHINE_CONFIG_END
+ OKIM6295(config, m_oki, XTAL(8'467'200) / 8, okim6295_device::PIN7_HIGH).add_route(ALL_OUTPUTS, "mono", 1.0); // probably
+}
-MACHINE_CONFIG_START(subsino2_state::xtrain)
+void subsino2_state::xtrain(machine_config &config)
+{
xplan(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_IO_MAP(xtrain_io)
-MACHINE_CONFIG_END
+ m_maincpu->set_addrmap(AS_IO, &subsino2_state::xtrain_io);
+}
-MACHINE_CONFIG_START(subsino2_state::expcard)
+void subsino2_state::expcard(machine_config &config)
+{
xplan(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_IO_MAP(expcard_io)
-MACHINE_CONFIG_END
+ m_maincpu->set_addrmap(AS_IO, &subsino2_state::expcard_io);
+}
/***************************************************************************
@@ -2698,6 +2704,100 @@ void subsino2_state::init_new2001()
/***************************************************************************
+Queen Bee
+(c) 2001 Subsino
+
+no ROM labels available
+
+***************************************************************************/
+
+ROM_START( queenbee )
+ ROM_REGION( 0x80000, "maincpu", 0 ) // H8/3044
+ ROM_LOAD( "27c020 u21.bin", 0x00000, 0x40000, CRC(baec0241) SHA1(345cfee7bdb4f4c61caa828372a121f3917bb4eb) )
+ ROM_FILL( 0x40000, 0x40000, 0xff )
+
+ ROM_REGION( 0x200000, "tilemap", 0 )
+ ROM_LOAD32_BYTE( "27c4001 u25.bin", 0x000000, 0x80000, CRC(628ed650) SHA1(dadbc5f73f6a5773303d834a44d2eab836874cfe) )
+ ROM_LOAD32_BYTE( "27c4001 u26.bin", 0x000001, 0x80000, CRC(27a169df) SHA1(d36989c300051a0c41752638ab5134a9b04c50a4) )
+ ROM_LOAD32_BYTE( "27c4001 u27.bin", 0x000002, 0x80000, CRC(27e8c4b9) SHA1(b010b9dcadb357cf4e79d97ce84b86f792bd8ecf) )
+ ROM_LOAD32_BYTE( "27c4001 u28.bin", 0x000003, 0x80000, CRC(7f139a04) SHA1(595a114806756e6f77a6fe20a13515b211ffdf2a) )
+
+ ROM_REGION( 0x80000, "samples", 0 )
+ ROM_LOAD( "27c4001 u9.bin", 0x000000, 0x80000, CRC(c7cda990) SHA1(193144fe0c31fc8342bd44aa4899bf15f0bc399d) )
+ROM_END
+
+void subsino2_state::init_queenbee()
+{
+ uint16_t *rom = (uint16_t*)memregion("maincpu")->base();
+
+ // patch serial protection test (ERROR 093099 otherwise)
+ rom[0x1cc6/2] = 0x4066;
+
+ // rts -> rte
+ rom[0x3e6a/2] = 0x5670; // IRQ 8
+ rom[0x3fbe/2] = 0x5670; // IRQ 0
+}
+
+ROM_START( queenbeeb )
+ ROM_REGION( 0x80000, "maincpu", 0 ) // H8/3044
+ ROM_LOAD( "u21", 0x00000, 0x40000, CRC(23e0ad8f) SHA1(d913ebd249c471ab36aabe515a8b36bb3590c1ca) )
+ ROM_FILL( 0x40000, 0x40000, 0xff )
+
+ ROM_REGION( 0x200000, "tilemap", 0 ) // this PCB has a single surface mounted ROM, which hasn't been dumped.
+ ROM_LOAD( "gfx", 0x000000, 0x200000, NO_DUMP )
+ // following ROMs are taken from humlan for testing, it doesn't seem to be a case of just differently split ROMs.
+ // ROM_LOAD32_BYTE( "hlj__truemax_3_v402.u25", 0x000000, 0x80000, CRC(dfc8d795) SHA1(93e0fe271c7390596f73092720befe11d8354838) )
+ // ROM_LOAD32_BYTE( "hlj__truemax_4_v402.u26", 0x000001, 0x80000, CRC(31c774d6) SHA1(13fcdb42f5fd7d0cadd3fd7030037c21b7585f0f) )
+ // ROM_LOAD32_BYTE( "hlj__truemax_5_v402.u27", 0x000002, 0x80000, CRC(28e14be8) SHA1(778906427175ca50ad5b0a7c5978c36ed29ef994) )
+ // ROM_LOAD32_BYTE( "hlj__truemax_6_v402.u28", 0x000003, 0x80000, CRC(d1c7ae17) SHA1(3ddb8ad38eeb5ab0a944d7d26cfb890a4327ef2e) )
+
+ ROM_REGION( 0x40000, "samples", 0 )
+ ROM_LOAD( "u9", 0x000000, 0x40000, NO_DUMP )
+ROM_END
+
+void subsino2_state::init_queenbeeb()
+{
+ uint16_t *rom = (uint16_t*)memregion("maincpu")->base();
+
+ // patch serial protection test (ERROR 093099 otherwise)
+ rom[0x1826/2] = 0x4066;
+
+ // rts -> rte
+ rom[0x3902/2] = 0x5670; // IRQ 8
+ rom[0x3a56/2] = 0x5670; // IRQ 0
+}
+
+// make sure these are really queenbee
+ROM_START( queenbeei )
+ ROM_REGION( 0x80000, "maincpu", 0 ) // H8/3044
+ ROM_LOAD( "u21 9ac9 v100", 0x00000, 0x40000, CRC(061b406f) SHA1(2a5433817e41610e9ba90302a6b9608f769176a0) )
+ ROM_FILL( 0x40000, 0x40000, 0xff )
+
+ ROM_REGION( 0x200000, "tilemap", 0 )
+ ROM_LOAD( "gfx", 0x000000, 0x200000, NO_DUMP )
+
+ ROM_REGION( 0x80000, "samples", 0 )
+ ROM_LOAD( "u9", 0x000000, 0x80000, NO_DUMP )
+ROM_END
+
+ROM_START( queenbeesa )
+ ROM_REGION( 0x80000, "maincpu", 0 ) // H8/3044
+ ROM_LOAD( "00b0 u21 1v101", 0x00000, 0x40000, CRC(19e31fd7) SHA1(01cf507958b0411d21dd660280f45668d7c5b9d9) )
+ ROM_FILL( 0x40000, 0x40000, 0xff )
+
+ ROM_REGION( 0x200000, "tilemap", 0 )
+ ROM_LOAD( "gfx", 0x000000, 0x200000, NO_DUMP )
+
+ ROM_REGION( 0x80000, "samples", 0 )
+ ROM_LOAD( "u9", 0x000000, 0x80000, NO_DUMP )
+ROM_END
+
+
+
+
+
+/***************************************************************************
+
Humlan's Lyckohjul (Sweden, V402)
(c) 2001 Subsino & Truemax
@@ -2738,6 +2838,42 @@ void subsino2_state::init_humlan()
/***************************************************************************
+Super Queen Bee
+(c) 2002 Subsino
+
+no ROM labels available
+
+***************************************************************************/
+
+ROM_START( squeenb )
+ ROM_REGION( 0x80000, "maincpu", 0 ) // H8/3044
+ ROM_LOAD( "u21", 0x00000, 0x40000, CRC(9edc4062) SHA1(515c8e648f839c99905fd5a861688fc62a45c4ed) )
+ ROM_FILL( 0x40000, 0x40000, 0xff )
+
+ ROM_REGION( 0x200000, "tilemap", 0 )
+ ROM_LOAD32_BYTE( "u25", 0x000000, 0x80000, CRC(842c0a33) SHA1(defb79c158d5091ca8830e9f03dda382d03d51ef) )
+ ROM_LOAD32_BYTE( "u26", 0x000001, 0x80000, CRC(11b67abb) SHA1(e388e3aefbcceda1390c00e6590cbdd686982b2e) )
+ ROM_LOAD32_BYTE( "u27", 0x000002, 0x80000, CRC(d713131a) SHA1(74a95e1ef0d30da53a91a5232574687f816df2eb) )
+ ROM_LOAD32_BYTE( "u28", 0x000003, 0x80000, CRC(dfa39f39) SHA1(992f74c04cbf4af06a02812052ce701228d4e174) )
+
+ ROM_REGION( 0x80000, "samples", 0 )
+ ROM_LOAD( "u9", 0x000000, 0x80000, CRC(c7cda990) SHA1(193144fe0c31fc8342bd44aa4899bf15f0bc399d) )
+ROM_END
+
+void subsino2_state::init_squeenb()
+{
+ uint16_t *rom = (uint16_t*)memregion("maincpu")->base();
+
+ // patch serial protection test (ERROR 093099 otherwise)
+ rom[0x1814/2] = 0x4066;
+
+ // rts -> rte
+ rom[0x399a/2] = 0x5670; // IRQ 8
+ rom[0x3aa8/2] = 0x5670; // IRQ 0
+}
+
+/***************************************************************************
+
Express Card / Top Card
(c) 1998 American Alpha
@@ -3177,13 +3313,29 @@ void subsino2_state::init_wtrnymph()
rom[0xc2d7] = 0x18;
}
-GAME( 1996, mtrain, 0, mtrain, mtrain, subsino2_state, init_mtrain, ROT0, "Subsino", "Magic Train (Ver. 1.31)", 0 )
-GAME( 1996, wtrnymph, 0, mtrain, wtrnymph, subsino2_state, init_wtrnymph, ROT0, "Subsino", "Water-Nymph (Ver. 1.4)", 0 )
-GAME( 1998, expcard, 0, expcard, expcard, subsino2_state, init_expcard, ROT0, "American Alpha", "Express Card / Top Card (Ver. 1.5)", 0 )
-GAME( 1998, saklove, 0, saklove, saklove, subsino2_state, init_saklove, ROT0, "Subsino", "Ying Hua Lian 2.0 (China, Ver. 1.02)", 0 )
-GAME( 1999, xtrain, 0, xtrain, xtrain, subsino2_state, init_xtrain, ROT0, "Subsino", "X-Train (Ver. 1.3)", 0 )
-GAME( 1999, ptrain, 0, xtrain, xtrain, subsino2_state, init_ptrain, ROT0, "Subsino", "Panda Train (Novamatic 1.7)", MACHINE_IMPERFECT_GRAPHICS )
-GAME( 1999, bishjan, 0, bishjan, bishjan, subsino2_state, init_bishjan, ROT0, "Subsino", "Bishou Jan (Japan, Ver. 203)", MACHINE_NO_SOUND )
-GAME( 2000, new2001, 0, new2001, new2001, subsino2_state, init_new2001, ROT0, "Subsino", "New 2001 (Italy, Ver. 200N)", MACHINE_NO_SOUND )
-GAME( 2006, xplan, 0, xplan, xplan, subsino2_state, init_xplan, ROT0, "Subsino", "X-Plan (Ver. 101)", 0 )
-GAME( 2001, humlan, 0, humlan, humlan, subsino2_state, init_humlan, ROT0, "Subsino (Truemax license)", "Humlan's Lyckohjul (Sweden, Ver. 402)", MACHINE_NO_SOUND | MACHINE_IMPERFECT_GRAPHICS )
+GAME( 1996, mtrain, 0, mtrain, mtrain, subsino2_state, init_mtrain, ROT0, "Subsino", "Magic Train (Ver. 1.31)", 0 )
+
+GAME( 1996, wtrnymph, 0, mtrain, wtrnymph, subsino2_state, init_wtrnymph, ROT0, "Subsino", "Water-Nymph (Ver. 1.4)", 0 )
+
+GAME( 1998, expcard, 0, expcard, expcard, subsino2_state, init_expcard, ROT0, "Subsino (American Alpha license)", "Express Card / Top Card (Ver. 1.5)", 0 )
+
+GAME( 1998, saklove, 0, saklove, saklove, subsino2_state, init_saklove, ROT0, "Subsino", "Ying Hua Lian 2.0 (China, Ver. 1.02)", 0 )
+
+GAME( 1999, xtrain, 0, xtrain, xtrain, subsino2_state, init_xtrain, ROT0, "Subsino", "X-Train (Ver. 1.3)", 0 )
+
+GAME( 1999, ptrain, 0, xtrain, xtrain, subsino2_state, init_ptrain, ROT0, "Subsino", "Panda Train (Novamatic 1.7)", MACHINE_IMPERFECT_GRAPHICS )
+
+GAME( 1999, bishjan, 0, bishjan, bishjan, subsino2_state, init_bishjan, ROT0, "Subsino", "Bishou Jan (Japan, Ver. 203)", MACHINE_NO_SOUND )
+
+GAME( 2000, new2001, 0, new2001, new2001, subsino2_state, init_new2001, ROT0, "Subsino", "New 2001 (Italy, Ver. 200N)", MACHINE_NO_SOUND )
+
+GAME( 2006, xplan, 0, xplan, xplan, subsino2_state, init_xplan, ROT0, "Subsino", "X-Plan (Ver. 101)", 0 )
+
+GAME( 2001, queenbee, 0, humlan, humlan, subsino2_state, init_queenbee, ROT0, "Subsino (American Alpha license)", "Queen Bee (Ver. 114)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_IMPERFECT_GRAPHICS ) // severe timing issues
+GAME( 2001, queenbeeb,queenbee, humlan, humlan, subsino2_state, init_queenbeeb,ROT0, "Subsino", "Queen Bee (Brazil, Ver. 202)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_IMPERFECT_GRAPHICS ) // severe timing issues, only program ROM available
+GAME( 2001, queenbeei,queenbee, humlan, humlan, subsino2_state, empty_init, ROT0, "Subsino", "Queen Bee (Israel, Ver. 100)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_IMPERFECT_GRAPHICS ) // severe timing issues, only program ROM available
+GAME( 2001, queenbeesa,queenbee,humlan, humlan, subsino2_state, empty_init, ROT0, "Subsino", "Queen Bee (SA-101-HARD)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_IMPERFECT_GRAPHICS ) // severe timing issues, only program ROM available
+
+GAME( 2001, humlan, queenbee, humlan, humlan, subsino2_state, init_humlan, ROT0, "Subsino (Truemax license)", "Humlan's Lyckohjul (Sweden, Ver. 402)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_IMPERFECT_GRAPHICS ) // severe timing issues
+
+GAME( 2002, squeenb, 0, humlan, humlan, subsino2_state, init_squeenb, ROT0, "Subsino", "Super Queen Bee (Ver. 101)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_IMPERFECT_GRAPHICS ) // severe timing issues
diff --git a/src/mame/drivers/summit.cpp b/src/mame/drivers/summit.cpp
index d2a7f4e0c06..17f3cf907e0 100644
--- a/src/mame/drivers/summit.cpp
+++ b/src/mame/drivers/summit.cpp
@@ -314,24 +314,25 @@ void summit_state::summit_palette(palette_device &palette) const
{
}
-MACHINE_CONFIG_START(summit_state::summit)
+void summit_state::summit(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80,4000000)
- MCFG_DEVICE_PROGRAM_MAP(mainmap)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", summit_state, irq0_line_hold)
+ Z80(config, m_maincpu, 4000000);
+ m_maincpu->set_addrmap(AS_PROGRAM, &summit_state::mainmap);
+ m_maincpu->set_vblank_int("screen", FUNC(summit_state::irq0_line_hold));
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(256, 256)
- MCFG_SCREEN_VISIBLE_AREA(0, 256-1, 16, 256-16-1)
- MCFG_SCREEN_UPDATE_DRIVER(summit_state, screen_update_summit)
- MCFG_SCREEN_PALETTE(m_palette)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(256, 256);
+ screen.set_visarea(0, 256-1, 16, 256-16-1);
+ screen.set_screen_update(FUNC(summit_state::screen_update_summit));
+ screen.set_palette(m_palette);
GFXDECODE(config, m_gfxdecode, m_palette, gfx_summit);
PALETTE(config, m_palette, FUNC(summit_state::summit_palette), 256);
-MACHINE_CONFIG_END
+}
ROM_START( pushover )
diff --git a/src/mame/drivers/sumt8035.cpp b/src/mame/drivers/sumt8035.cpp
index f2c6ca9e801..d1e67fd4e00 100644
--- a/src/mame/drivers/sumt8035.cpp
+++ b/src/mame/drivers/sumt8035.cpp
@@ -239,13 +239,13 @@ static INPUT_PORTS_START( summit )
INPUT_PORTS_END
-MACHINE_CONFIG_START(sumt8035_state::summit)
+void sumt8035_state::summit(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu",I8035,5000000)
- MCFG_DEVICE_PROGRAM_MAP(sumt_map)
- MCFG_DEVICE_IO_MAP(sumt_portmap)
-
-MACHINE_CONFIG_END
+ I8035(config, m_maincpu, 5000000);
+ m_maincpu->set_addrmap(AS_PROGRAM, &sumt8035_state::sumt_map);
+ m_maincpu->set_addrmap(AS_IO, &sumt8035_state::sumt_portmap);
+}
ROM_START( sm_ngacc )
diff --git a/src/mame/drivers/sun2.cpp b/src/mame/drivers/sun2.cpp
index a7ae02f5ccd..acdc6a49214 100644
--- a/src/mame/drivers/sun2.cpp
+++ b/src/mame/drivers/sun2.cpp
@@ -300,7 +300,7 @@ READ16_MEMBER( sun2_state::tl_mmu_r )
switch ((m_pagemap[entry] >> 22) & 7)
{
case 0: // type 0 space
- return m_type0space->read16(space, tmp, mem_mask);
+ return m_type0space->read16(tmp, mem_mask);
case 1: // type 1 space
// EPROM space is special: the MMU has a trap door
@@ -326,13 +326,13 @@ READ16_MEMBER( sun2_state::tl_mmu_r )
}
//printf("read device space @ %x\n", tmp<<1);
- return m_type1space->read16(space, tmp, mem_mask);
+ return m_type1space->read16(tmp, mem_mask);
case 2: // type 2 space
- return m_type2space->read16(space, tmp, mem_mask);
+ return m_type2space->read16(tmp, mem_mask);
case 3: // type 3 space
- return m_type3space->read16(space, tmp, mem_mask);
+ return m_type3space->read16(tmp, mem_mask);
}
}
else
@@ -445,20 +445,20 @@ WRITE16_MEMBER( sun2_state::tl_mmu_w )
switch ((m_pagemap[entry] >> 22) & 7)
{
case 0: // type 0
- m_type0space->write16(space, tmp, data, mem_mask);
+ m_type0space->write16(tmp, data, mem_mask);
return;
case 1: // type 1
//printf("write device space @ %x\n", tmp<<1);
- m_type1space->write16(space, tmp, data, mem_mask);
+ m_type1space->write16(tmp, data, mem_mask);
return;
case 2: // type 2
- m_type2space->write16(space, tmp, data, mem_mask);
+ m_type2space->write16(tmp, data, mem_mask);
return;
case 3: // type 3
- m_type3space->write16(space, tmp, data, mem_mask);
+ m_type3space->write16(tmp, data, mem_mask);
return;
}
}
@@ -611,10 +611,11 @@ void sun2_state::machine_reset()
m_maincpu->reset();
}
-MACHINE_CONFIG_START(sun2_state::sun2vme)
+void sun2_state::sun2vme(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M68010, 19.6608_MHz_XTAL / 2) // or 24_MHz_XTAL / 2 by jumper setting
- MCFG_DEVICE_PROGRAM_MAP(sun2_mem)
+ M68010(config, m_maincpu, 19.6608_MHz_XTAL / 2); // or 24_MHz_XTAL / 2 by jumper setting
+ m_maincpu->set_addrmap(AS_PROGRAM, &sun2_state::sun2_mem);
RAM(config, RAM_TAG).set_default_size("2M").set_extra_options("4M,6M,8M").set_default_value(0x00);
@@ -630,11 +631,11 @@ MACHINE_CONFIG_START(sun2_state::sun2vme)
// MMU Type 3 device space
ADDRESS_MAP_BANK(config, "type3").set_map(&sun2_state::vmetype3space_map).set_options(ENDIANNESS_BIG, 16, 32, 0x1000000);
- MCFG_SCREEN_ADD("bwtwo", RASTER)
- MCFG_SCREEN_UPDATE_DRIVER(sun2_state, bw2_update)
- MCFG_SCREEN_SIZE(1152,900)
- MCFG_SCREEN_VISIBLE_AREA(0, 1152-1, 0, 900-1)
- MCFG_SCREEN_REFRESH_RATE(72)
+ screen_device &bwtwo(SCREEN(config, "bwtwo", SCREEN_TYPE_RASTER));
+ bwtwo.set_screen_update(FUNC(sun2_state::bw2_update));
+ bwtwo.set_size(1152,900);
+ bwtwo.set_visarea(0, 1152-1, 0, 900-1);
+ bwtwo.set_refresh_hz(72);
am9513a_device &timer(AM9513A(config, "timer", 19.6608_MHz_XTAL / 4));
timer.fout_cb().set("timer", FUNC(am9513_device::gate1_w));
@@ -644,8 +645,7 @@ MACHINE_CONFIG_START(sun2_state::sun2vme)
timer.out4_cb().set("irq5", FUNC(input_merger_device::in_w<2>));
timer.out5_cb().set("irq5", FUNC(input_merger_device::in_w<3>));
- MCFG_INPUT_MERGER_ANY_HIGH("irq5") // 74LS05 open collectors
- MCFG_INPUT_MERGER_OUTPUT_HANDLER(INPUTLINE("maincpu", M68K_IRQ_5))
+ INPUT_MERGER_ANY_HIGH(config, "irq5").output_handler().set_inputline(m_maincpu, M68K_IRQ_5); // 74LS05 open collectors
SCC8530N(config, SCC1_TAG, 19.6608_MHz_XTAL / 4);
scc8530_device& scc2(SCC8530N(config, SCC2_TAG, 19.6608_MHz_XTAL / 4));
@@ -662,12 +662,13 @@ MACHINE_CONFIG_START(sun2_state::sun2vme)
rs232b.rxd_handler().set(SCC2_TAG, FUNC(z80scc_device::rxb_w));
rs232b.dcd_handler().set(SCC2_TAG, FUNC(z80scc_device::dcdb_w));
rs232b.cts_handler().set(SCC2_TAG, FUNC(z80scc_device::ctsb_w));
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(sun2_state::sun2mbus)
+void sun2_state::sun2mbus(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M68010, 39.3216_MHz_XTAL / 4)
- MCFG_DEVICE_PROGRAM_MAP(sun2_mem)
+ M68010(config, m_maincpu, 39.3216_MHz_XTAL / 4);
+ m_maincpu->set_addrmap(AS_PROGRAM, &sun2_state::sun2_mem);
RAM(config, RAM_TAG).set_default_size("2M").set_extra_options("4M").set_default_value(0x00);
@@ -683,11 +684,11 @@ MACHINE_CONFIG_START(sun2_state::sun2mbus)
// MMU Type 3 device space
ADDRESS_MAP_BANK(config, "type3").set_map(&sun2_state::mbustype3space_map).set_options(ENDIANNESS_BIG, 16, 32, 0x1000000);
- MCFG_SCREEN_ADD("bwtwo", RASTER)
- MCFG_SCREEN_UPDATE_DRIVER(sun2_state, bw2_update)
- MCFG_SCREEN_SIZE(1152,900)
- MCFG_SCREEN_VISIBLE_AREA(0, 1152-1, 0, 900-1)
- MCFG_SCREEN_REFRESH_RATE(72)
+ screen_device &bwtwo(SCREEN(config, "bwtwo", SCREEN_TYPE_RASTER));
+ bwtwo.set_screen_update(FUNC(sun2_state::bw2_update));
+ bwtwo.set_size(1152,900);
+ bwtwo.set_visarea(0, 1152-1, 0, 900-1);
+ bwtwo.set_refresh_hz(72);
am9513a_device &timer(AM9513A(config, "timer", 39.3216_MHz_XTAL / 8));
timer.fout_cb().set("timer", FUNC(am9513_device::gate1_w));
@@ -697,8 +698,7 @@ MACHINE_CONFIG_START(sun2_state::sun2mbus)
timer.out4_cb().set("irq5", FUNC(input_merger_device::in_w<2>));
timer.out5_cb().set("irq5", FUNC(input_merger_device::in_w<3>));
- MCFG_INPUT_MERGER_ANY_HIGH("irq5") // 74LS05 open collectors
- MCFG_INPUT_MERGER_OUTPUT_HANDLER(INPUTLINE("maincpu", M68K_IRQ_5))
+ INPUT_MERGER_ANY_HIGH(config, "irq5").output_handler().set_inputline(m_maincpu, M68K_IRQ_5); // 74LS05 open collectors
SCC8530N(config, SCC1_TAG, 39.3216_MHz_XTAL / 8);
scc8530_device& scc2(SCC8530N(config, SCC2_TAG, 39.3216_MHz_XTAL / 8));
@@ -717,7 +717,7 @@ MACHINE_CONFIG_START(sun2_state::sun2mbus)
rs232b.cts_handler().set(SCC2_TAG, FUNC(z80scc_device::ctsb_w));
MM58167(config, "rtc", 32.768_kHz_XTAL);
-MACHINE_CONFIG_END
+}
/* ROM definition */
ROM_START( sun2_120 ) // ROMs are located on the '501-1007' CPU PCB at locations B11 and B10; J400 is set to 1-2 for 27128 EPROMs and 3-4 for 27256 EPROMs
diff --git a/src/mame/drivers/sun3.cpp b/src/mame/drivers/sun3.cpp
index 68a5c9863f1..cda7adcc082 100644
--- a/src/mame/drivers/sun3.cpp
+++ b/src/mame/drivers/sun3.cpp
@@ -319,8 +319,8 @@ void sun3_state::ncr5380(device_t *device)
{
devcb_base *devcb;
(void)devcb;
- MCFG_DEVICE_CLOCK(10000000)
-// MCFG_NCR5380N_DRQ_HANDLER(WRITELINE(*this, sun3_state, drq_w))
+ downcast<ncr5380n_device &>(*device).set_clock(10000000);
+// downcast<ncr5380n_device &>(*device).drq_handler().set(FUNC(sun3_state::drq_w));
}
static void scsi_devices(device_slot_interface &device)
@@ -543,7 +543,7 @@ READ32_MEMBER( sun3_state::tl_mmu_r )
switch ((m_pagemap[entry] >> 26) & 3)
{
case 0: // type 0 space
- return m_type0space->read32(space, tmp, mem_mask);
+ return m_type0space->read32(tmp, mem_mask);
case 1: // type 1 space
// magic ROM bypass
@@ -551,13 +551,13 @@ READ32_MEMBER( sun3_state::tl_mmu_r )
{
return m_rom_ptr[offset & 0x3fff];
}
- return m_type1space->read32(space, tmp, mem_mask);
+ return m_type1space->read32(tmp, mem_mask);
case 2: // type 2 space
- return m_type2space->read32(space, tmp, mem_mask);
+ return m_type2space->read32(tmp, mem_mask);
case 3: // type 3 space
- return m_type3space->read32(space, tmp, mem_mask);
+ return m_type3space->read32(tmp, mem_mask);
}
}
else
@@ -693,20 +693,20 @@ WRITE32_MEMBER( sun3_state::tl_mmu_w )
switch ((m_pagemap[entry] >> 26) & 3)
{
case 0: // type 0
- m_type0space->write32(space, tmp, data, mem_mask);
+ m_type0space->write32(tmp, data, mem_mask);
return;
case 1: // type 1
//printf("write device space @ %x\n", tmp<<1);
- m_type1space->write32(space, tmp, data, mem_mask);
+ m_type1space->write32(tmp, data, mem_mask);
return;
case 2: // type 2
- m_type2space->write32(space, tmp, data, mem_mask);
+ m_type2space->write32(tmp, data, mem_mask);
return;
case 3: // type 3
- m_type3space->write32(space, tmp, data, mem_mask);
+ m_type3space->write32(tmp, data, mem_mask);
return;
}
}
@@ -1008,16 +1008,17 @@ void sun3_state::machine_reset()
}
// The base Sun 3004 CPU board
-MACHINE_CONFIG_START(sun3_state::sun3)
+void sun3_state::sun3(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M68020, 16670000)
- MCFG_DEVICE_PROGRAM_MAP(sun3_mem)
+ M68020(config, m_maincpu, 16670000);
+ m_maincpu->set_addrmap(AS_PROGRAM, &sun3_state::sun3_mem);
- MCFG_SCREEN_ADD("bwtwo", RASTER)
- MCFG_SCREEN_UPDATE_DRIVER(sun3_state, bw2_update)
- MCFG_SCREEN_SIZE(1600,1100)
- MCFG_SCREEN_VISIBLE_AREA(0, 1152-1, 0, 900-1)
- MCFG_SCREEN_REFRESH_RATE(72)
+ screen_device &bwtwo(SCREEN(config, "bwtwo", SCREEN_TYPE_RASTER));
+ bwtwo.set_screen_update(FUNC(sun3_state::bw2_update));
+ bwtwo.set_size(1600,1100);
+ bwtwo.set_visarea(0, 1152-1, 0, 900-1);
+ bwtwo.set_refresh_hz(72);
RAM(config, m_ram).set_default_size("4M").set_extra_options("6M,8M,12M,16M,20M,24M,28M,32M").set_default_value(0x00);
@@ -1035,7 +1036,7 @@ MACHINE_CONFIG_START(sun3_state::sun3)
// MMU Type 3 device space
ADDRESS_MAP_BANK(config, "type3").set_map(&sun3_state::vmetype3space_map).set_options(ENDIANNESS_BIG, 32, 32, 0x80000000);
- MCFG_TIMER_DRIVER_ADD_PERIODIC("timer", sun3_state, sun3_timer, attotime::from_hz(100))
+ TIMER(config, "timer").configure_periodic(FUNC(sun3_state::sun3_timer), attotime::from_hz(100));
SCC8530N(config, m_scc1, 4.9152_MHz_XTAL);
m_scc1->out_txda_callback().set(KEYBOARD_TAG, FUNC(sun_keyboard_port_device::write_txd));
@@ -1061,70 +1062,73 @@ MACHINE_CONFIG_START(sun3_state::sun3)
AM79C90(config, m_lance, 10'000'000); // clock is a guess
- MCFG_NSCSI_BUS_ADD("scsibus")
- MCFG_NSCSI_ADD("scsibus:0", scsi_devices, nullptr, false)
- MCFG_NSCSI_ADD("scsibus:1", scsi_devices, "harddisk", false)
- MCFG_NSCSI_ADD("scsibus:2", scsi_devices, nullptr, false)
- MCFG_NSCSI_ADD("scsibus:3", scsi_devices, nullptr, false)
- MCFG_NSCSI_ADD("scsibus:4", scsi_devices, nullptr, false)
- MCFG_NSCSI_ADD("scsibus:5", scsi_devices, nullptr, false)
- MCFG_NSCSI_ADD("scsibus:6", scsi_devices, "cdrom", false)
- MCFG_NSCSI_ADD("scsibus:7", scsi_devices, "ncr5380", true)
- MCFG_SLOT_OPTION_MACHINE_CONFIG("ncr5380", [this] (device_t *device) { ncr5380(device); })
-MACHINE_CONFIG_END
+ NSCSI_BUS(config, "scsibus");
+ NSCSI_CONNECTOR(config, "scsibus:0", scsi_devices, nullptr);
+ NSCSI_CONNECTOR(config, "scsibus:1", scsi_devices, "harddisk");
+ NSCSI_CONNECTOR(config, "scsibus:2", scsi_devices, nullptr);
+ NSCSI_CONNECTOR(config, "scsibus:3", scsi_devices, nullptr);
+ NSCSI_CONNECTOR(config, "scsibus:4", scsi_devices, nullptr);
+ NSCSI_CONNECTOR(config, "scsibus:5", scsi_devices, nullptr);
+ NSCSI_CONNECTOR(config, "scsibus:6", scsi_devices, "cdrom");
+ NSCSI_CONNECTOR(config, "scsibus:7", scsi_devices, "ncr5380", true).set_option_machine_config("ncr5380", [this] (device_t *device) { ncr5380(device); });
+}
// Sun 3/60
-MACHINE_CONFIG_START(sun3_state::sun3_60)
+void sun3_state::sun3_60(machine_config &config)
+{
sun3(config);
- MCFG_DEVICE_REPLACE("maincpu", M68020, 20000000)
- MCFG_DEVICE_PROGRAM_MAP(sun3_mem)
-
- MCFG_SCREEN_MODIFY("bwtwo")
- MCFG_SCREEN_UPDATE_DRIVER(sun3_state, bw2_16x11_update)
- MCFG_SCREEN_SIZE(1600,1100)
- MCFG_SCREEN_VISIBLE_AREA(0, 1600-1, 0, 1100-1)
- MCFG_SCREEN_REFRESH_RATE(72)
-MACHINE_CONFIG_END
+ M68020(config.replace(), m_maincpu, 20000000);
+ m_maincpu->set_addrmap(AS_PROGRAM, &sun3_state::sun3_mem);
+
+ screen_device &bwtwo(*subdevice<screen_device>("bwtwo"));
+ bwtwo.set_screen_update(FUNC(sun3_state::bw2_16x11_update));
+ bwtwo.set_size(1600,1100);
+ bwtwo.set_visarea(0, 1600-1, 0, 1100-1);
+ bwtwo.set_refresh_hz(72);
+}
// Sun 3/E
-MACHINE_CONFIG_START(sun3_state::sun3e)
+void sun3_state::sun3e(machine_config &config)
+{
sun3(config);
- MCFG_DEVICE_REPLACE("maincpu", M68020, 20000000)
- MCFG_DEVICE_PROGRAM_MAP(sun3_mem)
-MACHINE_CONFIG_END
+ M68020(config.replace(), m_maincpu, 20000000);
+ m_maincpu->set_addrmap(AS_PROGRAM, &sun3_state::sun3_mem);
+}
// 3/260 and 3/280 (the Sun 3200 board)
-MACHINE_CONFIG_START(sun3_state::sun3200)
+void sun3_state::sun3200(machine_config &config)
+{
sun3(config);
- MCFG_DEVICE_REPLACE("maincpu", M68020, 25000000)
- MCFG_DEVICE_PROGRAM_MAP(sun3_mem)
+ M68020(config.replace(), m_maincpu, 25000000);
+ m_maincpu->set_addrmap(AS_PROGRAM, &sun3_state::sun3_mem);
- MCFG_SCREEN_MODIFY("bwtwo")
- MCFG_SCREEN_UPDATE_DRIVER(sun3_state, bw2_16x11_update)
- MCFG_SCREEN_SIZE(1600,1100)
- MCFG_SCREEN_VISIBLE_AREA(0, 1600-1, 0, 1100-1)
- MCFG_SCREEN_REFRESH_RATE(72)
+ screen_device &bwtwo(*subdevice<screen_device>("bwtwo"));
+ bwtwo.set_screen_update(FUNC(sun3_state::bw2_16x11_update));
+ bwtwo.set_size(1600,1100);
+ bwtwo.set_visarea(0, 1600-1, 0, 1100-1);
+ bwtwo.set_refresh_hz(72);
m_ram->set_default_size("32M").set_extra_options("64M,96M,128M");
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(sun3_state::sun3_50)
+void sun3_state::sun3_50(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M68020, 15700000)
- MCFG_DEVICE_PROGRAM_MAP(sun3_mem)
+ M68020(config, m_maincpu, 15700000);
+ m_maincpu->set_addrmap(AS_PROGRAM, &sun3_state::sun3_mem);
AM79C90(config, m_lance, 10'000'000); // clock is a guess
- MCFG_SCREEN_ADD("bwtwo", RASTER)
- MCFG_SCREEN_UPDATE_DRIVER(sun3_state, bw2_350_update)
- MCFG_SCREEN_SIZE(1600,1100)
- MCFG_SCREEN_VISIBLE_AREA(0, 1152-1, 0, 900-1)
- MCFG_SCREEN_REFRESH_RATE(72)
+ screen_device &bwtwo(SCREEN(config, "bwtwo", SCREEN_TYPE_RASTER));
+ bwtwo.set_screen_update(FUNC(sun3_state::bw2_350_update));
+ bwtwo.set_size(1600,1100);
+ bwtwo.set_visarea(0, 1152-1, 0, 900-1);
+ bwtwo.set_refresh_hz(72);
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
- MCFG_TIMER_DRIVER_ADD_PERIODIC("timer", sun3_state, sun3_timer, attotime::from_hz(100))
+ TIMER(config, "timer").configure_periodic(FUNC(sun3_state::sun3_timer), attotime::from_hz(100));
RAM(config, m_ram).set_default_size("4M").set_default_value(0x00);
@@ -1162,17 +1166,16 @@ MACHINE_CONFIG_START(sun3_state::sun3_50)
rs232b.dcd_handler().set(m_scc2, FUNC(z80scc_device::dcdb_w));
rs232b.cts_handler().set(m_scc2, FUNC(z80scc_device::ctsb_w));
- MCFG_NSCSI_BUS_ADD("scsibus")
- MCFG_NSCSI_ADD("scsibus:0", scsi_devices, nullptr, false)
- MCFG_NSCSI_ADD("scsibus:1", scsi_devices, "harddisk", false)
- MCFG_NSCSI_ADD("scsibus:2", scsi_devices, nullptr, false)
- MCFG_NSCSI_ADD("scsibus:3", scsi_devices, nullptr, false)
- MCFG_NSCSI_ADD("scsibus:4", scsi_devices, nullptr, false)
- MCFG_NSCSI_ADD("scsibus:5", scsi_devices, nullptr, false)
- MCFG_NSCSI_ADD("scsibus:6", scsi_devices, "cdrom", false)
- MCFG_NSCSI_ADD("scsibus:7", scsi_devices, "ncr5380", true)
- MCFG_SLOT_OPTION_MACHINE_CONFIG("ncr5380", [this] (device_t *device) { ncr5380(device); })
-MACHINE_CONFIG_END
+ NSCSI_BUS(config, "scsibus");
+ NSCSI_CONNECTOR(config, "scsibus:0", scsi_devices, nullptr);
+ NSCSI_CONNECTOR(config, "scsibus:1", scsi_devices, "harddisk");
+ NSCSI_CONNECTOR(config, "scsibus:2", scsi_devices, nullptr);
+ NSCSI_CONNECTOR(config, "scsibus:3", scsi_devices, nullptr);
+ NSCSI_CONNECTOR(config, "scsibus:4", scsi_devices, nullptr);
+ NSCSI_CONNECTOR(config, "scsibus:5", scsi_devices, nullptr);
+ NSCSI_CONNECTOR(config, "scsibus:6", scsi_devices, "cdrom");
+ NSCSI_CONNECTOR(config, "scsibus:7", scsi_devices, "ncr5380", true).set_option_machine_config("ncr5380", [this] (device_t *device) { ncr5380(device); });
+}
/* ROM definition */
diff --git a/src/mame/drivers/sun3x.cpp b/src/mame/drivers/sun3x.cpp
index 6fb4a9d82a1..c2e84f952c2 100644
--- a/src/mame/drivers/sun3x.cpp
+++ b/src/mame/drivers/sun3x.cpp
@@ -591,12 +591,13 @@ static void sun_floppies(device_slot_interface &device)
device.option_add("35hd", FLOPPY_35_HD);
}
-MACHINE_CONFIG_START(sun3x_state::sun3_80)
+void sun3x_state::sun3_80(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M68030, 20000000)
- MCFG_DEVICE_PROGRAM_MAP(sun3_80_mem)
+ M68030(config, m_maincpu, 20000000);
+ m_maincpu->set_addrmap(AS_PROGRAM, &sun3x_state::sun3_80_mem);
- MCFG_DEVICE_ADD(TIMEKEEPER_TAG, M48T02, 0)
+ M48T02(config, TIMEKEEPER_TAG, 0);
SCC8530N(config, m_scc1, 4.9152_MHz_XTAL);
m_scc1->out_txda_callback().set(KEYBOARD_TAG, FUNC(sun_keyboard_port_device::write_txd));
@@ -619,25 +620,24 @@ MACHINE_CONFIG_START(sun3x_state::sun3_80)
rs232b.dcd_handler().set(m_scc2, FUNC(z80scc_device::dcdb_w));
rs232b.cts_handler().set(m_scc2, FUNC(z80scc_device::ctsb_w));
- MCFG_DEVICE_ADD("scsi", SCSI_PORT, 0)
- MCFG_SCSIDEV_ADD("scsi:" SCSI_PORT_DEVICE1, "harddisk", SCSIHD, SCSI_ID_6)
- MCFG_SCSIDEV_ADD("scsi:" SCSI_PORT_DEVICE2, "harddisk", SCSIHD, SCSI_ID_5)
+ scsi_port_device &scsi(SCSI_PORT(config, "scsi"));
+ scsi.set_slot_device(1, "harddisk", SCSIHD, DEVICE_INPUT_DEFAULTS_NAME(SCSI_ID_6));
+ scsi.set_slot_device(2, "harddisk", SCSIHD, DEVICE_INPUT_DEFAULTS_NAME(SCSI_ID_5));
- MCFG_DEVICE_ADD(ESP_TAG, NCR539X, 20000000/2)
- MCFG_LEGACY_SCSI_PORT("scsi")
+ NCR539X(config, ESP_TAG, 20000000/2).set_scsi_port("scsi");
N82077AA(config, m_fdc, n82077aa_device::MODE_PS2);
- MCFG_FLOPPY_DRIVE_ADD("fdc:0", sun_floppies, "35hd", sun3x_state::floppy_formats)
+ FLOPPY_CONNECTOR(config, "fdc:0", sun_floppies, "35hd", sun3x_state::floppy_formats);
// the timekeeper has no interrupt output, so 3/80 includes a dedicated timer circuit
- MCFG_TIMER_DRIVER_ADD_PERIODIC("timer", sun3x_state, sun380_timer, attotime::from_hz(100))
-
- MCFG_SCREEN_ADD("bwtwo", RASTER)
- MCFG_SCREEN_UPDATE_DRIVER(sun3x_state, bw2_update)
- MCFG_SCREEN_SIZE(1152,900)
- MCFG_SCREEN_VISIBLE_AREA(0, 1152-1, 0, 900-1)
- MCFG_SCREEN_REFRESH_RATE(72)
-MACHINE_CONFIG_END
+ TIMER(config, "timer").configure_periodic(FUNC(sun3x_state::sun380_timer), attotime::from_hz(100));
+
+ screen_device &bwtwo(SCREEN(config, "bwtwo", SCREEN_TYPE_RASTER));
+ bwtwo.set_screen_update(FUNC(sun3x_state::bw2_update));
+ bwtwo.set_size(1152,900);
+ bwtwo.set_visarea(0, 1152-1, 0, 900-1);
+ bwtwo.set_refresh_hz(72);
+}
void sun3x_state::sun3_460(machine_config &config)
{
diff --git a/src/mame/drivers/sun4.cpp b/src/mame/drivers/sun4.cpp
index bcea4fdf672..50d7016544c 100644
--- a/src/mame/drivers/sun4.cpp
+++ b/src/mame/drivers/sun4.cpp
@@ -956,7 +956,7 @@ READ32_MEMBER( sun4_state::sun4_insn_data_r )
switch (entry.type)
{
case 0: // type 0 space
- return m_type0space->read32(space, tmp, mem_mask);
+ return m_type0space->read32(tmp, mem_mask);
case 1: // type 1 space
// magic EPROM bypass
@@ -965,7 +965,7 @@ READ32_MEMBER( sun4_state::sun4_insn_data_r )
return m_rom_ptr[offset & 0x1ffff];
}
//printf("Read type 1 @ VA %08x, phys %08x\n", offset<<2, tmp<<2);
- return m_type1space->read32(space, tmp, mem_mask);
+ return m_type1space->read32(tmp, mem_mask);
default:
//logerror("sun4: access to unhandled memory type\n");
@@ -1019,12 +1019,12 @@ WRITE32_MEMBER( sun4_state::sun4_insn_data_w )
switch (entry.type)
{
case 0: // type 0
- m_type0space->write32(space, tmp, data, mem_mask);
+ m_type0space->write32(tmp, data, mem_mask);
return;
case 1: // type 1
//printf("write device space @ %x\n", tmp<<1);
- m_type1space->write32(space, tmp, data, mem_mask);
+ m_type1space->write32(tmp, data, mem_mask);
return;
default:
@@ -1356,20 +1356,20 @@ READ8_MEMBER( sun4_state::fdc_r )
switch(offset)
{
case 0: // Main Status (R, 82072)
- return m_fdc->msr_r(space, 0, 0xff);
+ return m_fdc->msr_r();
case 1: // FIFO Data Port (R, 82072)
case 5: // FIFO Data Port (R, 82077)
- return m_fdc->fifo_r(space, 0, 0xff);
+ return m_fdc->fifo_r();
case 2: // Digital Output Register (R, 82077)
- return m_fdc->dor_r(space, 0, 0xff);
+ return m_fdc->dor_r();
case 4: // Main Status Register (R, 82077)
- return m_fdc->msr_r(space, 0, 0xff);
+ return m_fdc->msr_r();
case 7:// Digital Input Register (R, 82077)
- return m_fdc->dir_r(space, 0, 0xff);
+ return m_fdc->dir_r();
default:
break;
@@ -1384,16 +1384,16 @@ WRITE8_MEMBER( sun4_state::fdc_w )
{
case 0: // Data Rate Select Register (W, 82072)
case 4: // Data Rate Select Register (W, 82077)
- m_fdc->dsr_w(space, 0, data, 0xff);
+ m_fdc->dsr_w(data);
break;
case 1: // FIFO Data Port (W, 82072)
case 5: // FIFO Data Port (W, 82077)
- m_fdc->fifo_w(space, 0, data, 0xff);
+ m_fdc->fifo_w(data);
break;
case 7: // Configuration Control REgister (W, 82077)
- m_fdc->ccr_w(space, 0, data, 0xff);
+ m_fdc->ccr_w(data);
break;
default:
@@ -1839,14 +1839,15 @@ static void sun_scsi_devices(device_slot_interface &device)
void sun4_state::ncr53c90a(device_t *device)
{
- devcb_base *devcb;
- (void)devcb;
- MCFG_DEVICE_CLOCK(10000000)
- MCFG_NCR5390_IRQ_HANDLER(WRITELINE(*this, sun4_state, scsi_irq))
- MCFG_NCR5390_DRQ_HANDLER(WRITELINE(*this, sun4_state, scsi_drq))
+ ncr53c90a_device &adapter = downcast<ncr53c90a_device &>(*device);
+
+ adapter.set_clock(10000000);
+ adapter.irq_handler_cb().set(*this, FUNC(sun4_state::scsi_irq));
+ adapter.drq_handler_cb().set(*this, FUNC(sun4_state::scsi_drq));
}
-MACHINE_CONFIG_START(sun4_state::sun4)
+void sun4_state::sun4(machine_config &config)
+{
/* basic machine hardware */
MB86901(config, m_maincpu, 16'670'000);
m_maincpu->add_asi_desc([](sparc_disassembler *dasm) { dasm->add_asi_desc(sun4_asi_desc); });
@@ -1920,19 +1921,19 @@ MACHINE_CONFIG_START(sun4_state::sun4)
rs232b.dcd_handler().set(m_scc2, FUNC(z80scc_device::dcdb_w));
rs232b.cts_handler().set(m_scc2, FUNC(z80scc_device::ctsb_w));
- MCFG_NSCSI_BUS_ADD("scsibus")
- MCFG_NSCSI_ADD("scsibus:0", sun_scsi_devices, "harddisk", false)
- MCFG_NSCSI_ADD("scsibus:1", sun_scsi_devices, nullptr, false)
- MCFG_NSCSI_ADD("scsibus:2", sun_scsi_devices, nullptr, false)
- MCFG_NSCSI_ADD("scsibus:3", sun_scsi_devices, nullptr, false)
- MCFG_NSCSI_ADD("scsibus:4", sun_scsi_devices, nullptr, false)
- MCFG_NSCSI_ADD("scsibus:5", sun_scsi_devices, nullptr, false)
- MCFG_NSCSI_ADD("scsibus:6", sun_scsi_devices, "cdrom", false)
- MCFG_NSCSI_ADD("scsibus:7", sun_scsi_devices, "ncr53c90a", true)
- MCFG_SLOT_OPTION_MACHINE_CONFIG("ncr53c90a", [this] (device_t *device) { ncr53c90a(device); })
-MACHINE_CONFIG_END
-
-MACHINE_CONFIG_START(sun4_state::sun4c)
+ NSCSI_BUS(config, "scsibus");
+ NSCSI_CONNECTOR(config, "scsibus:0", sun_scsi_devices, "harddisk");
+ NSCSI_CONNECTOR(config, "scsibus:1", sun_scsi_devices, nullptr);
+ NSCSI_CONNECTOR(config, "scsibus:2", sun_scsi_devices, nullptr);
+ NSCSI_CONNECTOR(config, "scsibus:3", sun_scsi_devices, nullptr);
+ NSCSI_CONNECTOR(config, "scsibus:4", sun_scsi_devices, nullptr);
+ NSCSI_CONNECTOR(config, "scsibus:5", sun_scsi_devices, nullptr);
+ NSCSI_CONNECTOR(config, "scsibus:6", sun_scsi_devices, "cdrom");
+ NSCSI_CONNECTOR(config, "scsibus:7", sun_scsi_devices, "ncr53c90a", true).set_option_machine_config("ncr53c90a", [this] (device_t *device) { ncr53c90a(device); });
+}
+
+void sun4_state::sun4c(machine_config &config)
+{
/* basic machine hardware */
MB86901(config, m_maincpu, 20'000'000);
m_maincpu->add_asi_desc([](sparc_disassembler *dasm) { dasm->add_asi_desc(sun4c_asi_desc); });
@@ -2004,23 +2005,22 @@ MACHINE_CONFIG_START(sun4_state::sun4c)
rs232b.dcd_handler().set(m_scc2, FUNC(z80scc_device::dcdb_w));
rs232b.cts_handler().set(m_scc2, FUNC(z80scc_device::ctsb_w));
- MCFG_NSCSI_BUS_ADD("scsibus")
- MCFG_NSCSI_ADD("scsibus:0", sun_scsi_devices, "harddisk", false)
- MCFG_NSCSI_ADD("scsibus:1", sun_scsi_devices, "cdrom", false)
- MCFG_NSCSI_ADD("scsibus:2", sun_scsi_devices, nullptr, false)
- MCFG_NSCSI_ADD("scsibus:3", sun_scsi_devices, nullptr, false)
- MCFG_NSCSI_ADD("scsibus:4", sun_scsi_devices, nullptr, false)
- MCFG_NSCSI_ADD("scsibus:5", sun_scsi_devices, nullptr, false)
- MCFG_NSCSI_ADD("scsibus:6", sun_scsi_devices, nullptr, false)
- MCFG_NSCSI_ADD("scsibus:7", sun_scsi_devices, "ncr53c90a", true)
- MCFG_SLOT_OPTION_MACHINE_CONFIG("ncr53c90a", [this] (device_t *device) { ncr53c90a(device); })
+ NSCSI_BUS(config, "scsibus");
+ NSCSI_CONNECTOR(config, "scsibus:0", sun_scsi_devices, "harddisk");
+ NSCSI_CONNECTOR(config, "scsibus:1", sun_scsi_devices, "cdrom");
+ NSCSI_CONNECTOR(config, "scsibus:2", sun_scsi_devices, nullptr);
+ NSCSI_CONNECTOR(config, "scsibus:3", sun_scsi_devices, nullptr);
+ NSCSI_CONNECTOR(config, "scsibus:4", sun_scsi_devices, nullptr);
+ NSCSI_CONNECTOR(config, "scsibus:5", sun_scsi_devices, nullptr);
+ NSCSI_CONNECTOR(config, "scsibus:6", sun_scsi_devices, nullptr);
+ NSCSI_CONNECTOR(config, "scsibus:7", sun_scsi_devices, "ncr53c90a", true).set_option_machine_config("ncr53c90a", [this] (device_t *device) { ncr53c90a(device); });
// SBus
SBUS(config, m_sbus, 20'000'000, "maincpu", "type1");
SBUS_SLOT(config, m_sbus_slot[0], 20'000'000, m_sbus, sbus_cards, nullptr);
SBUS_SLOT(config, m_sbus_slot[1], 20'000'000, m_sbus, sbus_cards, nullptr);
SBUS_SLOT(config, m_sbus_slot[2], 20'000'000, m_sbus, sbus_cards, nullptr);
-MACHINE_CONFIG_END
+}
void sun4_state::sun4_20(machine_config &config)
{
diff --git a/src/mame/drivers/suna16.cpp b/src/mame/drivers/suna16.cpp
index a8416f5dbf6..6449ad12a1e 100644
--- a/src/mame/drivers/suna16.cpp
+++ b/src/mame/drivers/suna16.cpp
@@ -867,7 +867,6 @@ void suna16_state::bssoccer(machine_config &config)
DAC_4BIT_R2R(config, "ldac2", 0).add_route(ALL_OUTPUTS, "lspeaker", 0.2); // unknown DAC
DAC_4BIT_R2R(config, "rdac2", 0).add_route(ALL_OUTPUTS, "rspeaker", 0.2); // unknown DAC
voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref", 0));
- vref.set_output(5.0);
vref.add_route(0, "ldac", 1.0, DAC_VREF_POS_INPUT);
vref.add_route(0, "ldac", -1.0, DAC_VREF_NEG_INPUT);
vref.add_route(0, "rdac", 1.0, DAC_VREF_POS_INPUT);
@@ -930,7 +929,6 @@ void suna16_state::uballoon(machine_config &config)
DAC_4BIT_R2R(config, "ldac", 0).add_route(ALL_OUTPUTS, "lspeaker", 0.25); // unknown DAC
DAC_4BIT_R2R(config, "rdac", 0).add_route(ALL_OUTPUTS, "rspeaker", 0.25); // unknown DAC
voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref", 0));
- vref.set_output(5.0);
vref.add_route(0, "ldac", 1.0, DAC_VREF_POS_INPUT);
vref.add_route(0, "ldac", -1.0, DAC_VREF_NEG_INPUT);
vref.add_route(0, "rdac", 1.0, DAC_VREF_POS_INPUT);
@@ -989,7 +987,6 @@ void suna16_state::sunaq(machine_config &config)
DAC_4BIT_R2R(config, "ldac", 0).add_route(ALL_OUTPUTS, "lspeaker", 0.25); // unknown DAC
DAC_4BIT_R2R(config, "rdac", 0).add_route(ALL_OUTPUTS, "rspeaker", 0.25); // unknown DAC
voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref", 0));
- vref.set_output(5.0);
vref.add_route(0, "ldac", 1.0, DAC_VREF_POS_INPUT);
vref.add_route(0, "ldac", -1.0, DAC_VREF_NEG_INPUT);
vref.add_route(0, "rdac", 1.0, DAC_VREF_POS_INPUT);
@@ -1060,7 +1057,6 @@ void suna16_state::bestbest(machine_config &config)
DAC_4BIT_R2R(config, "ldac2", 0).add_route(ALL_OUTPUTS, "lspeaker", 0.2); // unknown DAC
DAC_4BIT_R2R(config, "rdac2", 0).add_route(ALL_OUTPUTS, "rspeaker", 0.2); // unknown DAC
voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref", 0));
- vref.set_output(5.0);
vref.add_route(0, "ldac", 1.0, DAC_VREF_POS_INPUT);
vref.add_route(0, "ldac", -1.0, DAC_VREF_NEG_INPUT);
vref.add_route(0, "rdac", 1.0, DAC_VREF_POS_INPUT);
diff --git a/src/mame/drivers/suna8.cpp b/src/mame/drivers/suna8.cpp
index cf0abc02232..b71d7ccef27 100644
--- a/src/mame/drivers/suna8.cpp
+++ b/src/mame/drivers/suna8.cpp
@@ -2045,7 +2045,6 @@ void suna8_state::brickzn11(machine_config &config)
DAC_4BIT_R2R(config, "ldac2", 0).add_route(ALL_OUTPUTS, "speaker", 0.17); // unknown DAC
DAC_4BIT_R2R(config, "rdac2", 0).add_route(ALL_OUTPUTS, "speaker", 0.17); // unknown DAC
voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref", 0));
- vref.set_output(5.0);
vref.add_route(0, "ldac", 1.0, DAC_VREF_POS_INPUT);
vref.add_route(0, "ldac", -1.0, DAC_VREF_NEG_INPUT);
vref.add_route(0, "rdac", 1.0, DAC_VREF_POS_INPUT);
diff --git a/src/mame/drivers/supbtime.cpp b/src/mame/drivers/supbtime.cpp
index 4e63f2bf75b..11639322f48 100644
--- a/src/mame/drivers/supbtime.cpp
+++ b/src/mame/drivers/supbtime.cpp
@@ -337,22 +337,23 @@ GFXDECODE_END
// MACHINE DEFINITIONS
//**************************************************************************
-MACHINE_CONFIG_START(supbtime_state::supbtime)
- MCFG_DEVICE_ADD("maincpu", M68000, XTAL(28'000'000) / 2)
- MCFG_DEVICE_PROGRAM_MAP(supbtime_map)
+void supbtime_state::supbtime(machine_config &config)
+{
+ M68000(config, m_maincpu, XTAL(28'000'000) / 2);
+ m_maincpu->set_addrmap(AS_PROGRAM, &supbtime_state::supbtime_map);
H6280(config, m_audiocpu, XTAL(32'220'000) / 8);
m_audiocpu->set_addrmap(AS_PROGRAM, &supbtime_state::sound_map);
m_audiocpu->add_route(ALL_OUTPUTS, "mono", 0); // internal sound unused
// video hardware
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_RAW_PARAMS(XTAL(28'000'000) / 4, 442, 0, 320, 274, 8, 248)
- MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE(*this, supbtime_state, vblank_w))
- MCFG_SCREEN_UPDATE_DRIVER(supbtime_state, screen_update_supbtime)
- MCFG_SCREEN_PALETTE("palette")
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_raw(XTAL(28'000'000) / 4, 442, 0, 320, 274, 8, 248);
+ screen.screen_vblank().set(FUNC(supbtime_state::vblank_w));
+ screen.set_screen_update(FUNC(supbtime_state::screen_update_supbtime));
+ screen.set_palette("palette");
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_supbtime)
+ GFXDECODE(config, "gfxdecode", "palette", gfx_supbtime);
PALETTE(config, "palette").set_format(palette_device::xBGR_444, 1024);
DECO16IC(config, m_deco_tilegen, 0);
@@ -383,27 +384,24 @@ MACHINE_CONFIG_START(supbtime_state::supbtime)
ymsnd.add_route(0, "mono", 0.45);
ymsnd.add_route(1, "mono", 0.45);
- MCFG_DEVICE_ADD("oki", OKIM6295, XTAL(21'477'272) / 20, okim6295_device::PIN7_HIGH) // clock frequency & pin 7 not verified
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.50)
-MACHINE_CONFIG_END
+ OKIM6295(config, "oki", XTAL(21'477'272) / 20, okim6295_device::PIN7_HIGH).add_route(ALL_OUTPUTS, "mono", 0.50); // clock frequency & pin 7 not verified
+}
-MACHINE_CONFIG_START(supbtime_state::chinatwn)
+void supbtime_state::chinatwn(machine_config &config)
+{
supbtime(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(chinatwn_map)
+ m_maincpu->set_addrmap(AS_PROGRAM, &supbtime_state::chinatwn_map);
- MCFG_SCREEN_MODIFY("screen")
- MCFG_SCREEN_UPDATE_DRIVER(supbtime_state, screen_update_chinatwn)
-MACHINE_CONFIG_END
+ subdevice<screen_device>("screen")->set_screen_update(FUNC(supbtime_state::screen_update_chinatwn));
+}
-MACHINE_CONFIG_START(supbtime_state::tumblep)
+void supbtime_state::tumblep(machine_config &config)
+{
supbtime(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(tumblep_map)
+ m_maincpu->set_addrmap(AS_PROGRAM, &supbtime_state::tumblep_map);
- MCFG_SCREEN_MODIFY("screen")
- MCFG_SCREEN_UPDATE_DRIVER(supbtime_state, screen_update_tumblep)
-MACHINE_CONFIG_END
+ subdevice<screen_device>("screen")->set_screen_update(FUNC(supbtime_state::screen_update_tumblep));
+}
//**************************************************************************
diff --git a/src/mame/drivers/supdrapo.cpp b/src/mame/drivers/supdrapo.cpp
index 26335c0787b..0b6f81f5bb7 100644
--- a/src/mame/drivers/supdrapo.cpp
+++ b/src/mame/drivers/supdrapo.cpp
@@ -451,24 +451,24 @@ WRITE8_MEMBER(supdrapo_state::ay8910_outputb_w)
Machine Driver
**********************************************************************/
-MACHINE_CONFIG_START(supdrapo_state::supdrapo)
-
- MCFG_DEVICE_ADD("maincpu", Z80, CPU_CLOCK) /* guess */
- MCFG_DEVICE_PROGRAM_MAP(sdpoker_mem)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", supdrapo_state, irq0_line_hold)
+void supdrapo_state::supdrapo(machine_config &config)
+{
+ Z80(config, m_maincpu, CPU_CLOCK); /* guess */
+ m_maincpu->set_addrmap(AS_PROGRAM, &supdrapo_state::sdpoker_mem);
+ m_maincpu->set_vblank_int("screen", FUNC(supdrapo_state::irq0_line_hold));
WATCHDOG_TIMER(config, m_watchdog);
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(256, 256)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 0*8, 32*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(supdrapo_state, screen_update)
- MCFG_SCREEN_PALETTE(m_palette)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(256, 256);
+ screen.set_visarea(0*8, 32*8-1, 0*8, 32*8-1);
+ screen.set_screen_update(FUNC(supdrapo_state::screen_update));
+ screen.set_palette(m_palette);
GFXDECODE(config, m_gfxdecode, m_palette, gfx_supdrapo);
PALETTE(config, m_palette, FUNC(supdrapo_state::supdrapo_palette), 0x100);
@@ -479,7 +479,7 @@ MACHINE_CONFIG_START(supdrapo_state::supdrapo)
aysnd.port_a_write_callback().set(FUNC(supdrapo_state::ay8910_outputa_w));
aysnd.port_b_write_callback().set(FUNC(supdrapo_state::ay8910_outputb_w));
aysnd.add_route(ALL_OUTPUTS, "mono", 0.50);
-MACHINE_CONFIG_END
+}
/*********************************************************************
diff --git a/src/mame/drivers/supduck.cpp b/src/mame/drivers/supduck.cpp
index c34cb79c02d..5a18c908aa1 100644
--- a/src/mame/drivers/supduck.cpp
+++ b/src/mame/drivers/supduck.cpp
@@ -443,30 +443,29 @@ void supduck_state::machine_reset()
MACHINE_CONFIG_START(supduck_state::supduck)
-
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M68000, XTAL(8'000'000)) /* Verified on PCB */
- MCFG_DEVICE_PROGRAM_MAP(main_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", supduck_state, irq2_line_hold) // 2 & 4?
+ M68000(config, m_maincpu, XTAL(8'000'000)); /* Verified on PCB */
+ m_maincpu->set_addrmap(AS_PROGRAM, &supduck_state::main_map);
+ m_maincpu->set_vblank_int("screen", FUNC(supduck_state::irq2_line_hold)); // 2 & 4?
- MCFG_DEVICE_ADD("audiocpu", Z80, XTAL(8'000'000)/4) /* 2MHz - verified on PCB */
- MCFG_DEVICE_PROGRAM_MAP(sound_map)
+ Z80(config, m_audiocpu, XTAL(8'000'000)/4); /* 2MHz - verified on PCB */
+ m_audiocpu->set_addrmap(AS_PROGRAM, &supduck_state::sound_map);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500))
- MCFG_SCREEN_UPDATE_DRIVER(supduck_state, screen_update)
- MCFG_SCREEN_SIZE(32*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1)
- MCFG_SCREEN_PALETTE("palette")
- MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE("spriteram", buffered_spriteram16_device, vblank_copy_rising))
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500));
+ screen.set_screen_update(FUNC(supduck_state::screen_update));
+ screen.set_size(32*8, 32*8);
+ screen.set_visarea(0*8, 32*8-1, 2*8, 30*8-1);
+ screen.set_palette(m_palette);
+ screen.screen_vblank().set(m_spriteram, FUNC(buffered_spriteram16_device::vblank_copy_rising));
- MCFG_DEVICE_ADD("spriteram", BUFFERED_SPRITERAM16)
+ BUFFERED_SPRITERAM16(config, m_spriteram);
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_supduck)
+ GFXDECODE(config, m_gfxdecode, m_palette, gfx_supduck);
- MCFG_DEVICE_ADD("spritegen", TIGEROAD_SPRITE, 0)
+ TIGEROAD_SPRITE(config, m_spritegen, 0);
MCFG_PALETTE_ADD("palette", 0x800/2)
MCFG_PALETTE_FORMAT(xRGBRRRRGGGGBBBB_bit4)
@@ -476,14 +475,12 @@ MACHINE_CONFIG_START(supduck_state::supduck)
GENERIC_LATCH_8(config, m_soundlatch);
- MCFG_DEVICE_ADD("oki", OKIM6295, XTAL(8'000'000)/8, okim6295_device::PIN7_HIGH) // 1MHz - Verified on PCB, pin 7 not verified
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
- MCFG_DEVICE_ADDRESS_MAP(0, oki_map)
-
+ okim6295_device &oki(OKIM6295(config, "oki", XTAL(8'000'000)/8, okim6295_device::PIN7_HIGH)); // 1MHz - Verified on PCB, pin 7 not verified
+ oki.add_route(ALL_OUTPUTS, "mono", 1.0);
+ oki.set_addrmap(0, &supduck_state::oki_map);
MACHINE_CONFIG_END
-
/***************************************************************************
Game driver(s)
diff --git a/src/mame/drivers/super6.cpp b/src/mame/drivers/super6.cpp
index 5f57e9a2b9a..3226df0480d 100644
--- a/src/mame/drivers/super6.cpp
+++ b/src/mame/drivers/super6.cpp
@@ -440,7 +440,7 @@ void super6_state::machine_reset()
//**************************************************************************
//-------------------------------------------------
-// MACHINE_CONFIG( super6 )
+// machine_config( super6 )
//-------------------------------------------------
void super6_state::super6(machine_config &config)
diff --git a/src/mame/drivers/super80.cpp b/src/mame/drivers/super80.cpp
index cc1d59c7fa9..1baebade4f0 100644
--- a/src/mame/drivers/super80.cpp
+++ b/src/mame/drivers/super80.cpp
@@ -751,8 +751,8 @@ void super80_state::super80(machine_config &config)
INPUT_BUFFER(config, "cent_status_in", 0);
/* quickload */
- quickload_image_device &quickload(QUICKLOAD(config, "quickload", 0));
- quickload.set_handler(snapquick_load_delegate(&QUICKLOAD_LOAD_NAME(super80_state, super80), this), "bin", 3);
+ quickload_image_device &quickload(QUICKLOAD(config, "quickload"));
+ quickload.set_handler(snapquick_load_delegate(&QUICKLOAD_LOAD_NAME(super80_state, super80), this), "bin", attotime::from_seconds(3));
/* cassette */
CASSETTE(config, m_cassette);
@@ -845,8 +845,8 @@ void super80_state::super80v(machine_config &config)
INPUT_BUFFER(config, "cent_status_in", 0);
/* quickload */
- quickload_image_device &quickload(QUICKLOAD(config, "quickload", 0));
- quickload.set_handler(snapquick_load_delegate(&QUICKLOAD_LOAD_NAME(super80_state, super80), this), "bin", 3);
+ quickload_image_device &quickload(QUICKLOAD(config, "quickload"));
+ quickload.set_handler(snapquick_load_delegate(&QUICKLOAD_LOAD_NAME(super80_state, super80), this), "bin", attotime::from_seconds(3));
/* cassette */
CASSETTE(config, m_cassette);
diff --git a/src/mame/drivers/superchs.cpp b/src/mame/drivers/superchs.cpp
index 932d8b66fb8..fd9604c16bf 100644
--- a/src/mame/drivers/superchs.cpp
+++ b/src/mame/drivers/superchs.cpp
@@ -223,18 +223,18 @@ GFXDECODE_END
MACHINE DRIVERS
***********************************************************/
-MACHINE_CONFIG_START(superchs_state::superchs)
-
+void superchs_state::superchs(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M68EC020, XTAL(40'000'000)/2) /* 20MHz - verified */
- MCFG_DEVICE_PROGRAM_MAP(superchs_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", superchs_state, irq2_line_hold)
+ M68EC020(config, m_maincpu, XTAL(40'000'000)/2); /* 20MHz - verified */
+ m_maincpu->set_addrmap(AS_PROGRAM, &superchs_state::superchs_map);
+ m_maincpu->set_vblank_int("screen", FUNC(superchs_state::irq2_line_hold));
- MCFG_DEVICE_ADD("sub", M68000, XTAL(32'000'000)/2) /* 16MHz - verified */
- MCFG_DEVICE_PROGRAM_MAP(superchs_cpub_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", superchs_state, irq4_line_hold)
+ M68000(config, m_subcpu, XTAL(32'000'000)/2); /* 16MHz - verified */
+ m_subcpu->set_addrmap(AS_PROGRAM, &superchs_state::superchs_cpub_map);
+ m_subcpu->set_vblank_int("screen", FUNC(superchs_state::irq4_line_hold));
- MCFG_QUANTUM_TIME(attotime::from_hz(480)) /* Need to interleave CPU 1 & 3 */
+ config.m_minimum_quantum = attotime::from_hz(480); /* Need to interleave CPU 1 & 3 */
EEPROM_93C46_16BIT(config, "eeprom");
@@ -255,13 +255,13 @@ MACHINE_CONFIG_START(superchs_state::superchs)
// there are 'vibration' control bits somewhere!
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(40*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0, 40*8-1, 2*8, 32*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(superchs_state, screen_update_superchs)
- MCFG_SCREEN_PALETTE(m_palette)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(40*8, 32*8);
+ screen.set_visarea(0, 40*8-1, 2*8, 32*8-1);
+ screen.set_screen_update(FUNC(superchs_state::screen_update_superchs));
+ screen.set_palette(m_palette);
GFXDECODE(config, m_gfxdecode, m_palette, gfx_superchs);
PALETTE(config, m_palette).set_format(palette_device::xRGB_888, 8192);
@@ -275,15 +275,15 @@ MACHINE_CONFIG_START(superchs_state::superchs)
/* sound hardware */
TAITO_EN(config, "taito_en", 0);
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(superchs_state::chase3)
+void superchs_state::chase3(machine_config &config)
+{
superchs(config);
- MCFG_DEVICE_MODIFY("sub")
- MCFG_DEVICE_PROGRAM_MAP(chase3_cpub_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", superchs_state, irq4_line_hold)
-MACHINE_CONFIG_END
+ m_subcpu->set_addrmap(AS_PROGRAM, &superchs_state::chase3_cpub_map);
+ m_subcpu->set_vblank_int("screen", FUNC(superchs_state::irq4_line_hold));
+}
/***************************************************************************/
diff --git a/src/mame/drivers/supercrd.cpp b/src/mame/drivers/supercrd.cpp
index ff3e1dd79d2..c108b6033fe 100644
--- a/src/mame/drivers/supercrd.cpp
+++ b/src/mame/drivers/supercrd.cpp
@@ -230,18 +230,18 @@ void supercrd_state::supercrd_palette(palette_device &palette) const
bit0 = BIT(color_prom[i], 0);
bit1 = BIT(color_prom[i], 1);
bit2 = BIT(color_prom[i], 2);
- int const r = combine_3_weights(weights_r, bit0, bit1, bit2);
+ int const r = combine_weights(weights_r, bit0, bit1, bit2);
// blue component */
bit0 = BIT(color_prom[i], 3);
bit1 = BIT(color_prom[i], 4);
bit2 = BIT(color_prom[i], 5);
- int const b = combine_3_weights(weights_b, bit0, bit1, bit2);
+ int const b = combine_weights(weights_b, bit0, bit1, bit2);
// green component */
bit0 = BIT(color_prom[i], 6);
bit1 = BIT(color_prom[i], 7);
- int const g = combine_2_weights(weights_g, bit0, bit1);
+ int const g = combine_weights(weights_g, bit0, bit1);
palette.set_pen_color(i, rgb_t(r, g, b));
}
@@ -422,25 +422,26 @@ GFXDECODE_END
* Machine Drivers *
**************************/
-MACHINE_CONFIG_START(supercrd_state::supercrd)
+void supercrd_state::supercrd(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, MASTER_CLOCK/8) /* 2MHz, guess */
- MCFG_DEVICE_PROGRAM_MAP(supercrd_map)
+ Z80(config, m_maincpu, MASTER_CLOCK/8); /* 2MHz, guess */
+ m_maincpu->set_addrmap(AS_PROGRAM, &supercrd_state::supercrd_map);
// NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
-// MCFG_DEVICE_ADD("ppi8255_0", I8255, 0)
-// MCFG_DEVICE_ADD("ppi8255_1", I8255, 0)
+// I8255(config, "ppi8255_0", 0);
+// I8255(config, "ppi8255_1", 0);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE((124+1)*4, (30+1)*8) /* Taken from MC6845 init, registers 00 & 04. Normally programmed with (value-1) */
- MCFG_SCREEN_VISIBLE_AREA(0*4, 96*4-1, 0*8, 29*8-1) /* Taken from MC6845 init, registers 01 & 06 */
- MCFG_SCREEN_UPDATE_DRIVER(supercrd_state, screen_update_supercrd)
- MCFG_SCREEN_PALETTE("palette")
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size((124+1)*4, (30+1)*8); /* Taken from MC6845 init, registers 00 & 04. Normally programmed with (value-1) */
+ screen.set_visarea(0*4, 96*4-1, 0*8, 29*8-1); /* Taken from MC6845 init, registers 01 & 06 */
+ screen.set_screen_update(FUNC(supercrd_state::screen_update_supercrd));
+ screen.set_palette("palette");
GFXDECODE(config, m_gfxdecode, "palette", gfx_supercrd);
PALETTE(config, "palette", FUNC(supercrd_state::supercrd_palette), 0x200);
@@ -453,8 +454,8 @@ MACHINE_CONFIG_START(supercrd_state::supercrd)
/* sound hardware */
SPEAKER(config, "mono").front_center();
-// MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.75)
-MACHINE_CONFIG_END
+// .add_route(ALL_OUTPUTS, "mono", 0.75);
+}
/*************************
diff --git a/src/mame/drivers/superdq.cpp b/src/mame/drivers/superdq.cpp
index 46fa1572638..fe721023bde 100644
--- a/src/mame/drivers/superdq.cpp
+++ b/src/mame/drivers/superdq.cpp
@@ -123,18 +123,18 @@ void superdq_state::superdq_palette(palette_device &palette) const
bit0 = BIT(color_prom[i], 7);
bit1 = BIT(color_prom[i], 6);
bit2 = BIT(color_prom[i], 5);
- int const r = combine_3_weights(rweights, bit2, bit1, bit0);
+ int const r = combine_weights(rweights, bit2, bit1, bit0);
// green component
bit0 = BIT(color_prom[i], 4);
bit1 = BIT(color_prom[i], 3);
bit2 = BIT(color_prom[i], 2);
- int const g = combine_3_weights(gweights, bit2, bit1, bit0);
+ int const g = combine_weights(gweights, bit2, bit1, bit0);
// blue component
bit0 = BIT(color_prom[i], 1);
bit1 = BIT(color_prom[i], 0);
- int const b = combine_2_weights(bweights, bit1, bit0);
+ int const b = combine_weights(bweights, bit1, bit0);
palette.set_pen_color(i, rgb_t(r, g, b));
}
@@ -228,7 +228,7 @@ void superdq_state::superdq_io(address_map &map)
map(0x01, 0x01).portr("IN1");
map(0x02, 0x02).portr("DSW1");
map(0x03, 0x03).portr("DSW2");
- map(0x04, 0x04).r(FUNC(superdq_state::superdq_ld_r)).w("snsnd", FUNC(sn76496_device::command_w));
+ map(0x04, 0x04).r(FUNC(superdq_state::superdq_ld_r)).w("snsnd", FUNC(sn76496_device::write));
map(0x08, 0x08).w(FUNC(superdq_state::superdq_io_w));
map(0x0c, 0x0d).noprw(); /* HD46505S */
}
@@ -339,15 +339,17 @@ void superdq_state::machine_start()
MACHINE_CONFIG_START(superdq_state::superdq)
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, MASTER_CLOCK/8)
- MCFG_DEVICE_PROGRAM_MAP(superdq_map)
- MCFG_DEVICE_IO_MAP(superdq_io)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", superdq_state, superdq_vblank)
+ Z80(config, m_maincpu, MASTER_CLOCK/8);
+ m_maincpu->set_addrmap(AS_PROGRAM, &superdq_state::superdq_map);
+ m_maincpu->set_addrmap(AS_IO, &superdq_state::superdq_io);
+ m_maincpu->set_vblank_int("screen", FUNC(superdq_state::superdq_vblank));
- MCFG_LASERDISC_LDV1000_ADD("laserdisc")
- MCFG_LASERDISC_OVERLAY_DRIVER(256, 256, superdq_state, screen_update_superdq)
- MCFG_LASERDISC_OVERLAY_PALETTE(m_palette);
+ PIONEER_LDV1000(config, m_laserdisc, 0);
+ m_laserdisc->set_overlay(256, 256, FUNC(superdq_state::screen_update_superdq));
+ m_laserdisc->set_overlay_palette(m_palette);
+ m_laserdisc->add_route(0, "lspeaker", 1.0);
+ m_laserdisc->add_route(1, "rspeaker", 1.0);
/* video hardware */
MCFG_LASERDISC_SCREEN_ADD_NTSC("screen", "laserdisc")
@@ -360,10 +362,6 @@ MACHINE_CONFIG_START(superdq_state::superdq)
SPEAKER(config, "rspeaker").front_right();
SN76496(config, "snsnd", MASTER_CLOCK/8).add_route(ALL_OUTPUTS, "lspeaker", 0.8);
-
- MCFG_DEVICE_MODIFY("laserdisc")
- MCFG_SOUND_ROUTE(0, "lspeaker", 1.0)
- MCFG_SOUND_ROUTE(1, "rspeaker", 1.0)
MACHINE_CONFIG_END
diff --git a/src/mame/drivers/superqix.cpp b/src/mame/drivers/superqix.cpp
index 91b648c49be..e94562ea990 100644
--- a/src/mame/drivers/superqix.cpp
+++ b/src/mame/drivers/superqix.cpp
@@ -289,7 +289,7 @@ TIMER_CALLBACK_MEMBER(superqix_state::mcu_port3_w_cb)
TIMER_CALLBACK_MEMBER(superqix_state::z80_ay1_sync_address_w_cb)
{
- m_ay1->address_w(m_maincpu->space(AS_PROGRAM), 0, param, 0xff);
+ m_ay1->address_w(param);
}
diff --git a/src/mame/drivers/superslave.cpp b/src/mame/drivers/superslave.cpp
index 57ea3da5a8d..fb714ae8785 100644
--- a/src/mame/drivers/superslave.cpp
+++ b/src/mame/drivers/superslave.cpp
@@ -358,7 +358,7 @@ void superslave_state::machine_reset()
//**************************************************************************
//-------------------------------------------------
-// MACHINE_CONFIG( superslave )
+// machine_config( superslave )
//-------------------------------------------------
void superslave_state::superslave(machine_config &config)
diff --git a/src/mame/drivers/supertnk.cpp b/src/mame/drivers/supertnk.cpp
index 451c9d57b58..92c009d8b86 100644
--- a/src/mame/drivers/supertnk.cpp
+++ b/src/mame/drivers/supertnk.cpp
@@ -346,8 +346,8 @@ void supertnk_state::supertnk_map(address_map &map)
void supertnk_state::supertnk_io_map(address_map &map)
{
- map(0x0000, 0x0000).nopw();
- map(0x0400, 0x0407).w("outlatch", FUNC(ls259_device::write_d0));
+ map(0x0000, 0x0001).nopw();
+ map(0x0800, 0x080f).w("outlatch", FUNC(ls259_device::write_d0));
}
diff --git a/src/mame/drivers/superwng.cpp b/src/mame/drivers/superwng.cpp
index b5e4d5f66e2..b32a9b82861 100644
--- a/src/mame/drivers/superwng.cpp
+++ b/src/mame/drivers/superwng.cpp
@@ -477,26 +477,25 @@ void superwng_state::machine_reset()
m_nmi_enable = 0;
}
-MACHINE_CONFIG_START(superwng_state::superwng)
-
+void superwng_state::superwng(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, MASTER_CLOCK/4)
- MCFG_DEVICE_PROGRAM_MAP(superwng_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", superwng_state, superwng_nmi_interrupt)
-
- MCFG_DEVICE_ADD("audiocpu", Z80, MASTER_CLOCK/4)
- MCFG_DEVICE_PROGRAM_MAP(superwng_sound_map)
- MCFG_DEVICE_PERIODIC_INT_DRIVER(superwng_state, superwng_sound_nmi_assert, 4*60)
+ Z80(config, m_maincpu, MASTER_CLOCK/4);
+ m_maincpu->set_addrmap(AS_PROGRAM, &superwng_state::superwng_map);
+ m_maincpu->set_vblank_int("screen", FUNC(superwng_state::superwng_nmi_interrupt));
+ Z80(config, m_audiocpu, MASTER_CLOCK/4);
+ m_audiocpu->set_addrmap(AS_PROGRAM, &superwng_state::superwng_sound_map);
+ m_audiocpu->set_periodic_int(FUNC(superwng_state::superwng_sound_nmi_assert), attotime::from_hz(4*60));
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500))
- MCFG_SCREEN_SIZE(32*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(superwng_state, screen_update_superwng)
- MCFG_SCREEN_PALETTE(m_palette)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500));
+ screen.set_size(32*8, 32*8);
+ screen.set_visarea(0*8, 32*8-1, 2*8, 30*8-1);
+ screen.set_screen_update(FUNC(superwng_state::screen_update_superwng));
+ screen.set_palette(m_palette);
GFXDECODE(config, m_gfxdecode, m_palette, gfx_superwng);
@@ -509,7 +508,7 @@ MACHINE_CONFIG_START(superwng_state::superwng)
ay1.add_route(ALL_OUTPUTS, "mono", 0.50);
AY8910(config, "ay2", MASTER_CLOCK/12).add_route(ALL_OUTPUTS, "mono", 0.50);
-MACHINE_CONFIG_END
+}
ROM_START( superwng )
ROM_REGION( 0x20000, "maincpu", 0 )
diff --git a/src/mame/drivers/supracan.cpp b/src/mame/drivers/supracan.cpp
index df00616a2ce..30dcba191a4 100644
--- a/src/mame/drivers/supracan.cpp
+++ b/src/mame/drivers/supracan.cpp
@@ -1762,7 +1762,7 @@ void supracan_state::machine_start()
m_line_off_timer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(supracan_state::supracan_line_off_callback),this));
if (m_cart->exists())
- m_maincpu->space(AS_PROGRAM).install_read_handler(0x000000, 0x3fffff, read16_delegate(FUNC(generic_slot_device::read16_rom),(generic_slot_device*)m_cart));
+ m_maincpu->space(AS_PROGRAM).install_read_handler(0x000000, 0x3fffff, read16s_delegate(FUNC(generic_slot_device::read16_rom),(generic_slot_device*)m_cart));
}
@@ -1883,34 +1883,34 @@ INTERRUPT_GEN_MEMBER(supracan_state::supracan_sound_irq)
MACHINE_CONFIG_START(supracan_state::supracan)
- MCFG_DEVICE_ADD( "maincpu", M68000, XTAL(10'738'635) ) /* Correct frequency unknown */
- MCFG_DEVICE_PROGRAM_MAP( supracan_mem )
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", supracan_state, supracan_irq)
+ M68000(config, m_maincpu, XTAL(10'738'635)); /* Correct frequency unknown */
+ m_maincpu->set_addrmap(AS_PROGRAM, &supracan_state::supracan_mem);
+ m_maincpu->set_vblank_int("screen", FUNC(supracan_state::supracan_irq));
- MCFG_DEVICE_ADD( "soundcpu", M6502, XTAL(3'579'545) ) /* TODO: Verify actual clock */
- MCFG_DEVICE_PROGRAM_MAP( supracan_sound_mem )
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", supracan_state, supracan_sound_irq)
+ M6502(config, m_soundcpu, XTAL(3'579'545)); /* TODO: Verify actual clock */
+ m_soundcpu->set_addrmap(AS_PROGRAM, &supracan_state::supracan_sound_mem);
+ m_soundcpu->set_vblank_int("screen", FUNC(supracan_state::supracan_sound_irq));
#if !(SOUNDCPU_BOOT_HACK)
- MCFG_QUANTUM_PERFECT_CPU("maincpu")
- MCFG_QUANTUM_PERFECT_CPU("soundcpu")
+ config.m_perfect_cpu_quantum = subtag("maincpu");
+ config.m_perfect_cpu_quantum = subtag("soundcpu");
#endif
- MCFG_SCREEN_ADD( "screen", RASTER )
- MCFG_SCREEN_RAW_PARAMS(XTAL(10'738'635)/2, 348, 0, 256, 256, 0, 240 ) /* No idea if this is correct */
- MCFG_SCREEN_UPDATE_DRIVER(supracan_state, screen_update_supracan)
- MCFG_SCREEN_PALETTE("palette")
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_raw(XTAL(10'738'635)/2, 348, 0, 256, 256, 0, 240 ); /* No idea if this is correct */
+ m_screen->set_screen_update(FUNC(supracan_state::screen_update_supracan));
+ m_screen->set_palette("palette");
PALETTE(config, "palette", FUNC(supracan_state::supracan_palette)).set_format(palette_device::xBGR_555, 32768);
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_supracan)
+ GFXDECODE(config, m_gfxdecode, "palette", gfx_supracan);
MCFG_GENERIC_CARTSLOT_ADD("cartslot", generic_plain_slot, "supracan_cart")
MCFG_GENERIC_WIDTH(GENERIC_ROM16_WIDTH)
MCFG_GENERIC_ENDIAN(ENDIANNESS_BIG)
MCFG_GENERIC_LOAD(supracan_state, supracan_cart)
- MCFG_SOFTWARE_LIST_ADD("cart_list","supracan")
+ SOFTWARE_LIST(config, "cart_list").set_original("supracan");
MACHINE_CONFIG_END
diff --git a/src/mame/drivers/suprgolf.cpp b/src/mame/drivers/suprgolf.cpp
index 8c179c2d359..b17af194452 100644
--- a/src/mame/drivers/suprgolf.cpp
+++ b/src/mame/drivers/suprgolf.cpp
@@ -496,13 +496,13 @@ void suprgolf_state::machine_reset()
#define MASTER_CLOCK XTAL(12'000'000)
-MACHINE_CONFIG_START(suprgolf_state::suprgolf)
-
+void suprgolf_state::suprgolf(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80,MASTER_CLOCK/2) /* guess */
- MCFG_DEVICE_PROGRAM_MAP(suprgolf_map)
- MCFG_DEVICE_IO_MAP(io_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", suprgolf_state, irq0_line_hold)
+ Z80(config, m_maincpu, MASTER_CLOCK/2); /* guess */
+ m_maincpu->set_addrmap(AS_PROGRAM, &suprgolf_state::suprgolf_map);
+ m_maincpu->set_addrmap(AS_IO, &suprgolf_state::io_map);
+ m_maincpu->set_vblank_int("screen", FUNC(suprgolf_state::irq0_line_hold));
i8255_device &ppi0(I8255A(config, "ppi8255_0"));
ppi0.in_pa_callback().set(FUNC(suprgolf_state::p1_r));
@@ -517,16 +517,16 @@ MACHINE_CONFIG_START(suprgolf_state::suprgolf)
ppi1.out_pc_callback().set(FUNC(suprgolf_state::vregs_w));
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */)
- MCFG_SCREEN_SIZE(256, 256)
- MCFG_SCREEN_VISIBLE_AREA(0, 255, 0, 191)
- MCFG_SCREEN_UPDATE_DRIVER(suprgolf_state, screen_update)
- MCFG_SCREEN_PALETTE("palette")
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */
+ screen.set_size(256, 256);
+ screen.set_visarea(0, 255, 0, 191);
+ screen.set_screen_update(FUNC(suprgolf_state::screen_update));
+ screen.set_palette(m_palette);
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_suprgolf)
- MCFG_PALETTE_ADD("palette", 0x800)
+ GFXDECODE(config, m_gfxdecode, m_palette, gfx_suprgolf);
+ PALETTE(config, m_palette).set_entries(0x800);
/* sound hardware */
SPEAKER(config, "mono").front_center();
@@ -539,11 +539,11 @@ MACHINE_CONFIG_START(suprgolf_state::suprgolf)
ymsnd.port_b_write_callback().set(FUNC(suprgolf_state::writeB));
ymsnd.add_route(ALL_OUTPUTS, "mono", 0.5);
- MCFG_DEVICE_ADD("msm", MSM5205, XTAL(384'000)) /* guess */
- MCFG_MSM5205_VCLK_CB(WRITELINE(*this, suprgolf_state, adpcm_int)) /* interrupt function */
- MCFG_MSM5205_PRESCALER_SELECTOR(S48_4B) /* 4KHz 4-bit */
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
-MACHINE_CONFIG_END
+ MSM5205(config, m_msm, XTAL(384'000)); /* guess */
+ m_msm->vck_legacy_callback().set(FUNC(suprgolf_state::adpcm_int)); /* interrupt function */
+ m_msm->set_prescaler_selector(msm5205_device::S48_4B); /* 4KHz 4-bit */
+ m_msm->add_route(ALL_OUTPUTS, "mono", 1.0);
+}
ROM_START( suprgolf )
ROM_REGION( 0x10000, "maincpu", 0 ) // on the YUVO-702A main board
diff --git a/src/mame/drivers/suprloco.cpp b/src/mame/drivers/suprloco.cpp
index 9d0428c4996..0125c1bab1b 100644
--- a/src/mame/drivers/suprloco.cpp
+++ b/src/mame/drivers/suprloco.cpp
@@ -58,8 +58,8 @@ void suprloco_state::sound_map(address_map &map)
{
map(0x0000, 0x7fff).rom();
map(0x8000, 0x87ff).ram();
- map(0xa000, 0xa003).w("sn1", FUNC(sn76496_device::command_w));
- map(0xc000, 0xc003).w("sn2", FUNC(sn76496_device::command_w));
+ map(0xa000, 0xa003).w("sn1", FUNC(sn76496_device::write));
+ map(0xc000, 0xc003).w("sn2", FUNC(sn76496_device::write));
map(0xe000, 0xe000).r("ppi", FUNC(i8255_device::acka_r));
}
@@ -163,8 +163,8 @@ static GFXDECODE_START( gfx_suprloco )
GFXDECODE_END
-MACHINE_CONFIG_START(suprloco_state::suprloco)
-
+void suprloco_state::suprloco(machine_config &config)
+{
/* basic machine hardware */
sega_315_5015_device &maincpu(SEGA_315_5015(config, m_maincpu, 4000000)); /* 4 MHz (?) */
maincpu.set_addrmap(AS_PROGRAM, &suprloco_state::main_map);
@@ -172,9 +172,9 @@ MACHINE_CONFIG_START(suprloco_state::suprloco)
maincpu.set_vblank_int("screen", FUNC(suprloco_state::irq0_line_hold));
maincpu.set_decrypted_tag(":decrypted_opcodes");
- MCFG_DEVICE_ADD("audiocpu", Z80, 4000000)
- MCFG_DEVICE_PROGRAM_MAP(sound_map)
- MCFG_DEVICE_PERIODIC_INT_DRIVER(suprloco_state, irq0_line_hold, 4*60) /* NMIs are caused by the main CPU */
+ Z80(config, m_audiocpu, 4000000);
+ m_audiocpu->set_addrmap(AS_PROGRAM, &suprloco_state::sound_map);
+ m_audiocpu->set_periodic_int(FUNC(suprloco_state::irq0_line_hold), attotime::from_hz(4*60)); /* NMIs are caused by the main CPU */
i8255_device &ppi(I8255A(config, "ppi"));
ppi.out_pb_callback().set(FUNC(suprloco_state::control_w));
@@ -183,13 +183,13 @@ MACHINE_CONFIG_START(suprloco_state::suprloco)
ppi.out_pc_callback().append_inputline(m_audiocpu, INPUT_LINE_NMI).bit(7).invert();
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(5000))
- MCFG_SCREEN_SIZE(32*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(1*8, 31*8-1, 0*8, 28*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(suprloco_state, screen_update)
- MCFG_SCREEN_PALETTE("palette")
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(5000));
+ screen.set_size(32*8, 32*8);
+ screen.set_visarea(1*8, 31*8-1, 0*8, 28*8-1);
+ screen.set_screen_update(FUNC(suprloco_state::screen_update));
+ screen.set_palette("palette");
GFXDECODE(config, m_gfxdecode, "palette", gfx_suprloco);
PALETTE(config, "palette", FUNC(suprloco_state::suprloco_palette), 512+256);
@@ -197,12 +197,10 @@ MACHINE_CONFIG_START(suprloco_state::suprloco)
/* sound hardware */
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("sn1", SN76496, 4000000)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
+ SN76496(config, "sn1", 4000000).add_route(ALL_OUTPUTS, "mono", 1.0);
- MCFG_DEVICE_ADD("sn2", SN76496, 2000000)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
-MACHINE_CONFIG_END
+ SN76496(config, "sn2", 2000000).add_route(ALL_OUTPUTS, "mono", 1.0);
+}
/***************************************************************************
diff --git a/src/mame/drivers/suprnova.cpp b/src/mame/drivers/suprnova.cpp
index 7278a77fefb..fae1e70d3e6 100644
--- a/src/mame/drivers/suprnova.cpp
+++ b/src/mame/drivers/suprnova.cpp
@@ -787,44 +787,49 @@ GFXDECODE_END
/***** MACHINE DRIVER *****/
-MACHINE_CONFIG_START(skns_state::skns)
- MCFG_DEVICE_ADD("maincpu", SH2,28638000)
- MCFG_DEVICE_PROGRAM_MAP(skns_map)
- MCFG_TIMER_DRIVER_ADD_SCANLINE("scantimer", skns_state, irq, "screen", 0, 1)
+void skns_state::skns(machine_config &config)
+{
+ SH2(config, m_maincpu, 28638000);
+ m_maincpu->set_addrmap(AS_PROGRAM, &skns_state::skns_map);
+
+ TIMER(config, "scantimer").configure_scanline(FUNC(skns_state::irq), "screen", 0, 1);
- MCFG_DEVICE_ADD("rtc", MSM6242, XTAL(32'768))
+ MSM6242(config, "rtc", XTAL(32'768));
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_1);
- MCFG_TIMER_DRIVER_ADD_PERIODIC("int15_timer", skns_state, interrupt_callback, attotime::from_msec(2))
- MCFG_TIMER_PARAM(15)
- MCFG_TIMER_DRIVER_ADD_PERIODIC("int11_timer", skns_state, interrupt_callback, attotime::from_msec(8))
- MCFG_TIMER_PARAM(11)
- MCFG_TIMER_DRIVER_ADD_PERIODIC("int9_timer", skns_state, interrupt_callback, attotime::from_hz(28638000/1824))
- MCFG_TIMER_PARAM(9)
+ timer_device &int15_timer(TIMER(config, "int15_timer"));
+ int15_timer.configure_periodic(FUNC(skns_state::interrupt_callback), attotime::from_msec(2));
+ int15_timer.config_param(15);
+ timer_device &int11_timer(TIMER(config, "int11_timer"));
+ int11_timer.configure_periodic(FUNC(skns_state::interrupt_callback), attotime::from_msec(8));
+ int11_timer.config_param(11);
+ timer_device &int9_timer(TIMER(config, "int9_timer"));
+ int9_timer.configure_periodic(FUNC(skns_state::interrupt_callback), attotime::from_hz(28638000/1824));
+ int9_timer.config_param(9);
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_VIDEO_ATTRIBUTES(VIDEO_ALWAYS_UPDATE)
- MCFG_SCREEN_REFRESH_RATE(59.5971) // measured by Guru
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(340,262)
- MCFG_SCREEN_VISIBLE_AREA(0,319,0,239)
- MCFG_SCREEN_UPDATE_DRIVER(skns_state, screen_update)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_video_attributes(VIDEO_ALWAYS_UPDATE);
+ screen.set_refresh_hz(59.5971); // measured by Guru
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(340,262);
+ screen.set_visarea(0,319,0,239);
+ screen.set_screen_update(FUNC(skns_state::screen_update));
- MCFG_PALETTE_ADD("palette", 32768)
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", skns_bg)
+ PALETTE(config, m_palette).set_entries(32768);
+ GFXDECODE(config, m_gfxdecode, m_palette, skns_bg);
- MCFG_DEVICE_ADD("spritegen", SKNS_SPRITE, 0)
+ SKNS_SPRITE(config, m_spritegen, 0);
/* sound hardware */
SPEAKER(config, "lspeaker").front_left();
SPEAKER(config, "rspeaker").front_right();
- MCFG_DEVICE_ADD("ymz", YMZ280B, 33333333 / 2)
- MCFG_SOUND_ROUTE(0, "lspeaker", 1.0)
- MCFG_SOUND_ROUTE(1, "rspeaker", 1.0)
-MACHINE_CONFIG_END
+ ymz280b_device &ymz(YMZ280B(config, "ymz", 33333333 / 2));
+ ymz.add_route(0, "lspeaker", 1.0);
+ ymz.add_route(1, "rspeaker", 1.0);
+}
MACHINE_RESET_MEMBER(skns_state,sknsa)
{
@@ -857,30 +862,35 @@ MACHINE_RESET_MEMBER(skns_state,sknsk)
}
-MACHINE_CONFIG_START(skns_state::sknsa)
+void skns_state::sknsa(machine_config &config)
+{
skns(config);
MCFG_MACHINE_RESET_OVERRIDE(skns_state,sknsa)
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(skns_state::sknsj)
+void skns_state::sknsj(machine_config &config)
+{
skns(config);
MCFG_MACHINE_RESET_OVERRIDE(skns_state,sknsj)
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(skns_state::sknsu)
+void skns_state::sknsu(machine_config &config)
+{
skns(config);
MCFG_MACHINE_RESET_OVERRIDE(skns_state,sknsu)
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(skns_state::sknse)
+void skns_state::sknse(machine_config &config)
+{
skns(config);
MCFG_MACHINE_RESET_OVERRIDE(skns_state,sknse)
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(skns_state::sknsk)
+void skns_state::sknsk(machine_config &config)
+{
skns(config);
MCFG_MACHINE_RESET_OVERRIDE(skns_state,sknsk)
-MACHINE_CONFIG_END
+}
/***** IDLE SKIPPING *****/
@@ -1247,20 +1257,20 @@ ROM_START( galpanis )
ROM_LOAD16_BYTE( "gps-001-e1.u8", 0x000001, 0x100000, CRC(ded57bd0) SHA1(4c0122f0521829d4d83b6b1c403f7e6470f14951) )
ROM_REGION( 0x1000000, "spritegen", 0 )
- ROM_LOAD( "gps10000.u24", 0x000000, 0x400000, CRC(a1a7acf2) SHA1(52c86ae907f0c0236808c19f652955b09e90ec5a) )
- ROM_LOAD( "gps10100.u20", 0x400000, 0x400000, CRC(49f764b6) SHA1(9f4289858c3dac625ef623cc381a47b45aa5d8e2) )
- ROM_LOAD( "gps10200.u17", 0x800000, 0x400000, CRC(51980272) SHA1(6c0706d913b33995579aaf0688c4bf26d6d35a78) )
+ ROM_LOAD( "gps-100-00.u24", 0x000000, 0x400000, CRC(a1a7acf2) SHA1(52c86ae907f0c0236808c19f652955b09e90ec5a) )
+ ROM_LOAD( "gps-101-00.u20", 0x400000, 0x400000, CRC(49f764b6) SHA1(9f4289858c3dac625ef623cc381a47b45aa5d8e2) )
+ ROM_LOAD( "gps-102-00.u17", 0x800000, 0x400000, CRC(51980272) SHA1(6c0706d913b33995579aaf0688c4bf26d6d35a78) )
ROM_REGION( 0x800000, "gfx2", 0 )
- ROM_LOAD( "gps20000.u16", 0x000000, 0x400000, CRC(c146a09e) SHA1(5af5a7b9d9a55ec7aba3fd85a3a0211b92b1b84f) )
- ROM_LOAD( "gps20100.u13", 0x400000, 0x400000, CRC(9dfa2dc6) SHA1(a058c42fd76c23c0e5c8c11f5617fd29e056be7d) )
+ ROM_LOAD( "gps-200-00.u16", 0x000000, 0x400000, CRC(c146a09e) SHA1(5af5a7b9d9a55ec7aba3fd85a3a0211b92b1b84f) )
+ ROM_LOAD( "gps-201-00.u13", 0x400000, 0x400000, CRC(9dfa2dc6) SHA1(a058c42fd76c23c0e5c8c11f5617fd29e056be7d) )
ROM_REGION( 0x800000, "gfx3", ROMREGION_ERASE00 ) /* Tiles Plane B */
/* First 0x040000 bytes (0x03ff Tiles) are RAM Based Tiles */
/* 0x040000 - 0x3fffff empty? */
ROM_REGION( 0x400000, "ymz", 0 ) /* Samples */
- ROM_LOAD( "gps30000.u4", 0x000000, 0x400000, CRC(9e4da8e3) SHA1(6506d9300a442883357003a05fd2c78d364c35bb) )
+ ROM_LOAD( "gps-300-00.u4", 0x000000, 0x400000, CRC(9e4da8e3) SHA1(6506d9300a442883357003a05fd2c78d364c35bb) )
ROM_END
ROM_START( galpanise )
@@ -1271,20 +1281,20 @@ ROM_START( galpanise )
ROM_LOAD16_BYTE( "u8", 0x000001, 0x100000, CRC(098eff7c) SHA1(3cac22cbb11905a46afaa62c0470624b3b554fc0) ) /* mask ROM with no labels */
ROM_REGION( 0x1000000, "spritegen", 0 )
- ROM_LOAD( "gps10000.u24", 0x000000, 0x400000, CRC(a1a7acf2) SHA1(52c86ae907f0c0236808c19f652955b09e90ec5a) )
- ROM_LOAD( "gps10100.u20", 0x400000, 0x400000, CRC(49f764b6) SHA1(9f4289858c3dac625ef623cc381a47b45aa5d8e2) )
- ROM_LOAD( "gps10200.u17", 0x800000, 0x400000, CRC(51980272) SHA1(6c0706d913b33995579aaf0688c4bf26d6d35a78) )
+ ROM_LOAD( "gps-100-00.u24", 0x000000, 0x400000, CRC(a1a7acf2) SHA1(52c86ae907f0c0236808c19f652955b09e90ec5a) )
+ ROM_LOAD( "gps-101-00.u20", 0x400000, 0x400000, CRC(49f764b6) SHA1(9f4289858c3dac625ef623cc381a47b45aa5d8e2) )
+ ROM_LOAD( "gps-102-00.u17", 0x800000, 0x400000, CRC(51980272) SHA1(6c0706d913b33995579aaf0688c4bf26d6d35a78) )
ROM_REGION( 0x800000, "gfx2", 0 )
- ROM_LOAD( "gps20000.u16", 0x000000, 0x400000, CRC(c146a09e) SHA1(5af5a7b9d9a55ec7aba3fd85a3a0211b92b1b84f) )
- ROM_LOAD( "gps20100.u13", 0x400000, 0x400000, CRC(9dfa2dc6) SHA1(a058c42fd76c23c0e5c8c11f5617fd29e056be7d) )
+ ROM_LOAD( "gps-200-00.u16", 0x000000, 0x400000, CRC(c146a09e) SHA1(5af5a7b9d9a55ec7aba3fd85a3a0211b92b1b84f) )
+ ROM_LOAD( "gps-201-00.u13", 0x400000, 0x400000, CRC(9dfa2dc6) SHA1(a058c42fd76c23c0e5c8c11f5617fd29e056be7d) )
ROM_REGION( 0x800000, "gfx3", ROMREGION_ERASE00 ) /* Tiles Plane B */
/* First 0x040000 bytes (0x03ff Tiles) are RAM Based Tiles */
/* 0x040000 - 0x3fffff empty? */
ROM_REGION( 0x400000, "ymz", 0 ) /* Samples */
- ROM_LOAD( "gps30000.u4", 0x000000, 0x400000, CRC(9e4da8e3) SHA1(6506d9300a442883357003a05fd2c78d364c35bb) )
+ ROM_LOAD( "gps-300-00.u4", 0x000000, 0x400000, CRC(9e4da8e3) SHA1(6506d9300a442883357003a05fd2c78d364c35bb) )
ROM_END
ROM_START( galpanisj )
@@ -1295,20 +1305,44 @@ ROM_START( galpanisj )
ROM_LOAD16_BYTE( "gps-001-j1.u8", 0x000001, 0x100000, CRC(e764177a) SHA1(3a1333eb1022ed1a275b9c3d44b5f4ab81618fb6) )
ROM_REGION( 0x1000000, "spritegen", 0 )
- ROM_LOAD( "gps10000.u24", 0x000000, 0x400000, CRC(a1a7acf2) SHA1(52c86ae907f0c0236808c19f652955b09e90ec5a) )
- ROM_LOAD( "gps10100.u20", 0x400000, 0x400000, CRC(49f764b6) SHA1(9f4289858c3dac625ef623cc381a47b45aa5d8e2) )
- ROM_LOAD( "gps10200.u17", 0x800000, 0x400000, CRC(51980272) SHA1(6c0706d913b33995579aaf0688c4bf26d6d35a78) )
+ ROM_LOAD( "gps-100-00.u24", 0x000000, 0x400000, CRC(a1a7acf2) SHA1(52c86ae907f0c0236808c19f652955b09e90ec5a) )
+ ROM_LOAD( "gps-101-00.u20", 0x400000, 0x400000, CRC(49f764b6) SHA1(9f4289858c3dac625ef623cc381a47b45aa5d8e2) )
+ ROM_LOAD( "gps-102-00.u17", 0x800000, 0x400000, CRC(51980272) SHA1(6c0706d913b33995579aaf0688c4bf26d6d35a78) )
+
+ ROM_REGION( 0x800000, "gfx2", 0 )
+ ROM_LOAD( "gps-200-00.u16", 0x000000, 0x400000, CRC(c146a09e) SHA1(5af5a7b9d9a55ec7aba3fd85a3a0211b92b1b84f) )
+ ROM_LOAD( "gps-201-00.u13", 0x400000, 0x400000, CRC(9dfa2dc6) SHA1(a058c42fd76c23c0e5c8c11f5617fd29e056be7d) )
+
+ ROM_REGION( 0x800000, "gfx3", ROMREGION_ERASE00 ) /* Tiles Plane B */
+ /* First 0x040000 bytes (0x03ff Tiles) are RAM Based Tiles */
+ /* 0x040000 - 0x3fffff empty? */
+
+ ROM_REGION( 0x400000, "ymz", 0 ) /* Samples */
+ ROM_LOAD( "gps-300-00.u4", 0x000000, 0x400000, CRC(9e4da8e3) SHA1(6506d9300a442883357003a05fd2c78d364c35bb) )
+ROM_END
+
+ROM_START( galpanisa )
+ SKNS_ASIA
+
+ ROM_REGION32_BE( 0x200000, "user1", 0 ) /* SH-2 Code mapped at 0x04000000 */
+ ROM_LOAD16_BYTE( "gps-000-a0_9abc.u10", 0x000000, 0x100000, CRC(4e24b799) SHA1(614f4eb6a7b0ab03ea6ada28a670ed0759b3f4f9) ) /* hand written labels with checksum */
+ ROM_LOAD16_BYTE( "gps-001-a0_bd64.u8", 0x000001, 0x100000, CRC(aa4db8af) SHA1(10cc15fa065b6a2dcaf8c7d701c5ae7c18e4e863) ) /* hand written labels with checksum */
+
+ ROM_REGION( 0x1000000, "spritegen", 0 )
+ ROM_LOAD( "gps-100-00.u24", 0x000000, 0x400000, CRC(a1a7acf2) SHA1(52c86ae907f0c0236808c19f652955b09e90ec5a) )
+ ROM_LOAD( "gps-101-00.u20", 0x400000, 0x400000, CRC(49f764b6) SHA1(9f4289858c3dac625ef623cc381a47b45aa5d8e2) )
+ ROM_LOAD( "gps-102-00.u17", 0x800000, 0x400000, CRC(51980272) SHA1(6c0706d913b33995579aaf0688c4bf26d6d35a78) )
ROM_REGION( 0x800000, "gfx2", 0 )
- ROM_LOAD( "gps20000.u16", 0x000000, 0x400000, CRC(c146a09e) SHA1(5af5a7b9d9a55ec7aba3fd85a3a0211b92b1b84f) )
- ROM_LOAD( "gps20100.u13", 0x400000, 0x400000, CRC(9dfa2dc6) SHA1(a058c42fd76c23c0e5c8c11f5617fd29e056be7d) )
+ ROM_LOAD( "gps-200-00.u16", 0x000000, 0x400000, CRC(c146a09e) SHA1(5af5a7b9d9a55ec7aba3fd85a3a0211b92b1b84f) )
+ ROM_LOAD( "gps-201-00.u13", 0x400000, 0x400000, CRC(9dfa2dc6) SHA1(a058c42fd76c23c0e5c8c11f5617fd29e056be7d) )
ROM_REGION( 0x800000, "gfx3", ROMREGION_ERASE00 ) /* Tiles Plane B */
/* First 0x040000 bytes (0x03ff Tiles) are RAM Based Tiles */
/* 0x040000 - 0x3fffff empty? */
ROM_REGION( 0x400000, "ymz", 0 ) /* Samples */
- ROM_LOAD( "gps30000.u4", 0x000000, 0x400000, CRC(9e4da8e3) SHA1(6506d9300a442883357003a05fd2c78d364c35bb) )
+ ROM_LOAD( "gps-300-00.u4", 0x000000, 0x400000, CRC(9e4da8e3) SHA1(6506d9300a442883357003a05fd2c78d364c35bb) )
ROM_END
ROM_START( galpanisk )
@@ -1319,20 +1353,20 @@ ROM_START( galpanisk )
ROM_LOAD16_BYTE( "gps-001-k1.u8", 0x000001, 0x100000, CRC(354e601d) SHA1(4d176f2337a3b0b63548b2e542f9fa87d0a1ef7b) )
ROM_REGION( 0x1000000, "spritegen", 0 )
- ROM_LOAD( "gps10000.u24", 0x000000, 0x400000, CRC(a1a7acf2) SHA1(52c86ae907f0c0236808c19f652955b09e90ec5a) )
- ROM_LOAD( "gps10100.u20", 0x400000, 0x400000, CRC(49f764b6) SHA1(9f4289858c3dac625ef623cc381a47b45aa5d8e2) )
- ROM_LOAD( "gps10200.u17", 0x800000, 0x400000, CRC(51980272) SHA1(6c0706d913b33995579aaf0688c4bf26d6d35a78) )
+ ROM_LOAD( "gps-100-00.u24", 0x000000, 0x400000, CRC(a1a7acf2) SHA1(52c86ae907f0c0236808c19f652955b09e90ec5a) )
+ ROM_LOAD( "gps-101-00.u20", 0x400000, 0x400000, CRC(49f764b6) SHA1(9f4289858c3dac625ef623cc381a47b45aa5d8e2) )
+ ROM_LOAD( "gps-102-00.u17", 0x800000, 0x400000, CRC(51980272) SHA1(6c0706d913b33995579aaf0688c4bf26d6d35a78) )
ROM_REGION( 0x800000, "gfx2", 0 )
- ROM_LOAD( "gps20000.u16", 0x000000, 0x400000, CRC(c146a09e) SHA1(5af5a7b9d9a55ec7aba3fd85a3a0211b92b1b84f) )
- ROM_LOAD( "gps20100.u13", 0x400000, 0x400000, CRC(9dfa2dc6) SHA1(a058c42fd76c23c0e5c8c11f5617fd29e056be7d) )
+ ROM_LOAD( "gps-200-00.u16", 0x000000, 0x400000, CRC(c146a09e) SHA1(5af5a7b9d9a55ec7aba3fd85a3a0211b92b1b84f) )
+ ROM_LOAD( "gps-201-00.u13", 0x400000, 0x400000, CRC(9dfa2dc6) SHA1(a058c42fd76c23c0e5c8c11f5617fd29e056be7d) )
ROM_REGION( 0x800000, "gfx3", ROMREGION_ERASE00 ) /* Tiles Plane B */
/* First 0x040000 bytes (0x03ff Tiles) are RAM Based Tiles */
/* 0x040000 - 0x3fffff empty? */
ROM_REGION( 0x400000, "ymz", 0 ) /* Samples */
- ROM_LOAD( "gps30000.u4", 0x000000, 0x400000, CRC(9e4da8e3) SHA1(6506d9300a442883357003a05fd2c78d364c35bb) )
+ ROM_LOAD( "gps-300-00.u4", 0x000000, 0x400000, CRC(9e4da8e3) SHA1(6506d9300a442883357003a05fd2c78d364c35bb) )
ROM_END
ROM_START( galpans2 ) //only the 2 program ROMs were dumped, but mask ROMs are supposed to match.
@@ -1931,6 +1965,7 @@ GAME( 1996, jjparads, skns, sknsj, skns_1p, skns_state, init_jjparads, RO
GAME( 1997, galpanis, skns, sknse, galpanis, skns_state, init_galpanis, ROT0, "Kaneko", "Gals Panic S - Extra Edition (Europe, set 1)", MACHINE_IMPERFECT_GRAPHICS )
GAME( 1997, galpanise, galpanis, sknse, galpanis, skns_state, init_galpanis, ROT0, "Kaneko", "Gals Panic S - Extra Edition (Europe, set 2)", MACHINE_IMPERFECT_GRAPHICS )
GAME( 1997, galpanisj, galpanis, sknsj, galpanis, skns_state, init_galpanis, ROT0, "Kaneko", "Gals Panic S - Extra Edition (Japan)", MACHINE_IMPERFECT_GRAPHICS )
+GAME( 1997, galpanisa, galpanis, sknsa, galpanis, skns_state, init_galpanis, ROT0, "Kaneko", "Gals Panic S - Extra Edition (Asia)", MACHINE_IMPERFECT_GRAPHICS )
GAME( 1997, galpanisk, galpanis, sknsk, galpanis, skns_state, init_galpanis, ROT0, "Kaneko", "Gals Panic S - Extra Edition (Korea)", MACHINE_IMPERFECT_GRAPHICS )
GAME( 1997, jjparad2, skns, sknsj, skns_1p, skns_state, init_jjparad2, ROT0, "Electro Design", "Jan Jan Paradise 2", MACHINE_IMPERFECT_GRAPHICS )
diff --git a/src/mame/drivers/suprridr.cpp b/src/mame/drivers/suprridr.cpp
index c04ea685c0b..de1c458ea2d 100644
--- a/src/mame/drivers/suprridr.cpp
+++ b/src/mame/drivers/suprridr.cpp
@@ -321,28 +321,28 @@ GFXDECODE_END
*
*************************************/
-MACHINE_CONFIG_START(suprridr_state::suprridr)
-
+void suprridr_state::suprridr(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, XTAL(49'152'000)/16) /* 3 MHz */
- MCFG_DEVICE_PROGRAM_MAP(main_map)
- MCFG_DEVICE_IO_MAP(main_portmap)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", suprridr_state, main_nmi_gen)
+ Z80(config, m_maincpu, XTAL(49'152'000)/16); /* 3 MHz */
+ m_maincpu->set_addrmap(AS_PROGRAM, &suprridr_state::main_map);
+ m_maincpu->set_addrmap(AS_IO, &suprridr_state::main_portmap);
+ m_maincpu->set_vblank_int("screen", FUNC(suprridr_state::main_nmi_gen));
- MCFG_DEVICE_ADD("audiocpu", Z80, 10000000/4) /* 2.5 MHz */
- MCFG_DEVICE_PROGRAM_MAP(sound_map)
- MCFG_DEVICE_IO_MAP(sound_portmap)
+ Z80(config, m_audiocpu, 10000000/4); /* 2.5 MHz */
+ m_audiocpu->set_addrmap(AS_PROGRAM, &suprridr_state::sound_map);
+ m_audiocpu->set_addrmap(AS_IO, &suprridr_state::sound_portmap);
WATCHDOG_TIMER(config, "watchdog");
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(32*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(suprridr_state, screen_update)
- MCFG_SCREEN_PALETTE(m_palette)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(32*8, 32*8);
+ screen.set_visarea(0*8, 32*8-1, 2*8, 30*8-1);
+ screen.set_screen_update(FUNC(suprridr_state::screen_update));
+ screen.set_palette(m_palette);
GFXDECODE(config, m_gfxdecode, m_palette, gfx_suprridr);
PALETTE(config, m_palette, FUNC(suprridr_state::suprridr_palette), 96);
@@ -359,7 +359,7 @@ MACHINE_CONFIG_START(suprridr_state::suprridr)
GENERIC_LATCH_8(config, m_soundlatch);
m_soundlatch->data_pending_callback().set_inputline(m_audiocpu, 0);
m_soundlatch->set_separate_acknowledge(true);
-MACHINE_CONFIG_END
+}
diff --git a/src/mame/drivers/supstarf.cpp b/src/mame/drivers/supstarf.cpp
index e9debe5ab14..2cf19fe2b3a 100644
--- a/src/mame/drivers/supstarf.cpp
+++ b/src/mame/drivers/supstarf.cpp
@@ -89,8 +89,8 @@ READ8_MEMBER(supstarf_state::psg_latch_r)
{
if (m_pcs[d])
{
- m_psg[d]->address_w(space, 0, offset);
- result &= m_psg[d]->data_r(space, 0);
+ m_psg[d]->address_w(offset);
+ result &= m_psg[d]->data_r();
}
}
@@ -106,8 +106,8 @@ WRITE8_MEMBER(supstarf_state::psg_latch_w)
{
if (m_pcs[d])
{
- m_psg[d]->address_w(space, 0, offset);
- m_psg[d]->data_w(space, 0, data);
+ m_psg[d]->address_w(offset);
+ m_psg[d]->data_w(data);
}
}
diff --git a/src/mame/drivers/sv8000.cpp b/src/mame/drivers/sv8000.cpp
index 5937dac7408..8c61b9643aa 100644
--- a/src/mame/drivers/sv8000.cpp
+++ b/src/mame/drivers/sv8000.cpp
@@ -182,7 +182,7 @@ void sv8000_state::machine_start()
m_inv = 0;
if (m_cart->exists())
- m_maincpu->space(AS_PROGRAM).install_read_handler(0x0000, 0x0fff, read8_delegate(FUNC(generic_slot_device::read_rom),(generic_slot_device*)m_cart));
+ m_maincpu->space(AS_PROGRAM).install_read_handler(0x0000, 0x0fff, read8sm_delegate(FUNC(generic_slot_device::read_rom),(generic_slot_device*)m_cart));
save_item(NAME(m_column));
save_item(NAME(m_ag));
@@ -376,10 +376,10 @@ READ8_MEMBER( sv8000_state::mc6847_videoram_r )
MACHINE_CONFIG_START(sv8000_state::sv8000)
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu",Z80, XTAL(10'738'635)/3) /* Not verified */
- MCFG_DEVICE_PROGRAM_MAP(sv8000_mem)
- MCFG_DEVICE_IO_MAP(sv8000_io)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", sv8000_state, irq0_line_hold)
+ Z80(config, m_maincpu, XTAL(10'738'635)/3); /* Not verified */
+ m_maincpu->set_addrmap(AS_PROGRAM, &sv8000_state::sv8000_mem);
+ m_maincpu->set_addrmap(AS_IO, &sv8000_state::sv8000_io);
+ m_maincpu->set_vblank_int("screen", FUNC(sv8000_state::irq0_line_hold));
i8255_device &ppi(I8255(config, "i8255"));
ppi.in_pa_callback().set(FUNC(sv8000_state::i8255_porta_r));
@@ -391,10 +391,11 @@ MACHINE_CONFIG_START(sv8000_state::sv8000)
/* video hardware */
// S68047P - Unknown whether the internal or an external character rom is used
- MCFG_DEVICE_ADD("s68047p", S68047, XTAL(10'738'635)/3 ) // Clock not verified
- MCFG_MC6847_INPUT_CALLBACK(READ8(*this, sv8000_state, mc6847_videoram_r))
+ S68047(config, m_s68047p, XTAL(10'738'635)/3); // Clock not verified
+ m_s68047p->input_callback().set(FUNC(sv8000_state::mc6847_videoram_r));
+ m_s68047p->set_screen("screen");
- MCFG_SCREEN_MC6847_NTSC_ADD("screen", "s68047p")
+ SCREEN(config, "screen", SCREEN_TYPE_RASTER);
/* sound hardware */
SPEAKER(config, "mono").front_center();
@@ -411,7 +412,7 @@ MACHINE_CONFIG_START(sv8000_state::sv8000)
MCFG_GENERIC_LOAD(sv8000_state, cart)
/* software lists */
- MCFG_SOFTWARE_LIST_ADD("cart_list","sv8000")
+ SOFTWARE_LIST(config, "cart_list").set_original("sv8000");
MACHINE_CONFIG_END
/* ROM definition */
diff --git a/src/mame/drivers/svi318.cpp b/src/mame/drivers/svi318.cpp
index bcca2074c81..3a7d60fb647 100644
--- a/src/mame/drivers/svi318.cpp
+++ b/src/mame/drivers/svi318.cpp
@@ -63,6 +63,7 @@ public:
m_expander(*this, "exp"),
m_keyboard(*this, "KEY.%u", 0),
m_buttons(*this, "BUTTONS"),
+ m_led_caps_lock(*this, "led_caps_lock"),
m_intvdp(0), m_intexp(0),
m_romdis(1), m_ramdis(1),
m_cart(1), m_bk21(1),
@@ -78,14 +79,14 @@ public:
void svi328p(machine_config &config);
private:
- DECLARE_READ8_MEMBER( ppi_port_a_r );
- DECLARE_READ8_MEMBER( ppi_port_b_r );
- DECLARE_WRITE8_MEMBER( ppi_port_c_w );
- DECLARE_WRITE8_MEMBER( bank_w );
+ uint8_t ppi_port_a_r();
+ uint8_t ppi_port_b_r();
+ void ppi_port_c_w(uint8_t data);
+ void bank_w(uint8_t data);
DECLARE_WRITE_LINE_MEMBER( intvdp_w );
- READ8_MEMBER( mreq_r );
- WRITE8_MEMBER( mreq_w );
+ uint8_t mreq_r(offs_t offset);
+ void mreq_w(offs_t offset, uint8_t data);
// from expander bus
DECLARE_WRITE_LINE_MEMBER( intexp_w );
@@ -93,9 +94,6 @@ private:
DECLARE_WRITE_LINE_MEMBER( ramdis_w );
DECLARE_WRITE_LINE_MEMBER( ctrl1_w );
- DECLARE_READ8_MEMBER( excs_r );
- DECLARE_WRITE8_MEMBER( excs_w );
-
DECLARE_DEVICE_IMAGE_LOAD_MEMBER(cartridge);
void svi3x8_io(address_map &map);
@@ -116,6 +114,7 @@ private:
required_device<svi_expander_device> m_expander;
required_ioport_array<16> m_keyboard;
required_ioport m_buttons;
+ output_finder<> m_led_caps_lock;
int m_intvdp;
int m_intexp;
@@ -151,10 +150,8 @@ void svi3x8_state::svi3x8_io_bank(address_map &map)
{
map(0x000, 0x0ff).rw(m_expander, FUNC(svi_expander_device::iorq_r), FUNC(svi_expander_device::iorq_w));
map(0x100, 0x17f).rw(m_expander, FUNC(svi_expander_device::iorq_r), FUNC(svi_expander_device::iorq_w));
- map(0x180, 0x180).mirror(0x22).w(m_vdp, FUNC(tms9928a_device::vram_w));
- map(0x181, 0x181).mirror(0x22).w(m_vdp, FUNC(tms9928a_device::register_w));
- map(0x184, 0x184).mirror(0x22).r(m_vdp, FUNC(tms9928a_device::vram_r));
- map(0x185, 0x185).mirror(0x22).r(m_vdp, FUNC(tms9928a_device::register_r));
+ map(0x180, 0x181).mirror(0x22).w(m_vdp, FUNC(tms9928a_device::write));
+ map(0x184, 0x185).mirror(0x22).r(m_vdp, FUNC(tms9928a_device::read));
map(0x188, 0x188).mirror(0x23).w("psg", FUNC(ay8910_device::address_w));
map(0x18c, 0x18c).mirror(0x23).w("psg", FUNC(ay8910_device::data_w));
map(0x190, 0x190).mirror(0x23).r("psg", FUNC(ay8910_device::data_r));
@@ -342,6 +339,8 @@ WRITE_LINE_MEMBER( svi3x8_state::intvdp_w )
void svi3x8_state::machine_start()
{
+ m_led_caps_lock.resolve();
+
// register for save states
save_item(NAME(m_intvdp));
save_item(NAME(m_intexp));
@@ -371,16 +370,16 @@ void svi3x8_state::machine_reset()
ctrl1_w(1);
}
-READ8_MEMBER( svi3x8_state::mreq_r )
+uint8_t svi3x8_state::mreq_r(offs_t offset)
{
// ctrl1 inverts a15
if (m_ctrl1 == 0)
offset ^= 0x8000;
if (CCS1 || CCS2 || CCS3 || CCS4)
- return m_cart_rom->read_rom(space, offset);
+ return m_cart_rom->read_rom(offset);
- uint8_t data = m_expander->mreq_r(space, offset);
+ uint8_t data = m_expander->mreq_r(offset);
if (ROMCS)
data = m_basic->as_u8(offset);
@@ -394,7 +393,7 @@ READ8_MEMBER( svi3x8_state::mreq_r )
return data;
}
-WRITE8_MEMBER( svi3x8_state::mreq_w )
+void svi3x8_state::mreq_w(offs_t offset, uint8_t data)
{
// ctrl1 inverts a15
if (m_ctrl1 == 0)
@@ -403,7 +402,7 @@ WRITE8_MEMBER( svi3x8_state::mreq_w )
if (CCS1 || CCS2 || CCS3 || CCS4)
return;
- m_expander->mreq_w(space, offset, data);
+ m_expander->mreq_w(offset, data);
if (m_bk21 == 0 && IS_SVI328 && offset < 0x8000)
m_ram->write(offset, data);
@@ -412,7 +411,7 @@ WRITE8_MEMBER( svi3x8_state::mreq_w )
m_ram->write(IS_SVI328 ? offset : offset - 0xc000, data);
}
-WRITE8_MEMBER( svi3x8_state::bank_w )
+void svi3x8_state::bank_w(uint8_t data)
{
logerror("bank_w: %02x\n", data);
@@ -427,10 +426,10 @@ WRITE8_MEMBER( svi3x8_state::bank_w )
m_rom2 = BIT(data, 6);
m_rom3 = BIT(data, 7);
- output().set_value("led_caps_lock", BIT(data, 5));
+ m_led_caps_lock = BIT(data, 5);
}
-READ8_MEMBER( svi3x8_state::ppi_port_a_r )
+uint8_t svi3x8_state::ppi_port_a_r()
{
uint8_t data = 0x3f;
@@ -446,13 +445,13 @@ READ8_MEMBER( svi3x8_state::ppi_port_a_r )
return data;
}
-READ8_MEMBER( svi3x8_state::ppi_port_b_r )
+uint8_t svi3x8_state::ppi_port_b_r()
{
// bit 0-7, keyboard data
return m_keyboard[m_keyboard_row]->read();
}
-WRITE8_MEMBER( svi3x8_state::ppi_port_c_w )
+void svi3x8_state::ppi_port_c_w(uint8_t data)
{
// bit 0-3, keyboard row
m_keyboard_row = data & 0x0f;
@@ -494,22 +493,6 @@ WRITE_LINE_MEMBER( svi3x8_state::ctrl1_w )
m_io->set_bank(m_ctrl1);
}
-READ8_MEMBER( svi3x8_state::excs_r )
-{
- if (offset & 1)
- return m_vdp->register_read();
- else
- return m_vdp->vram_read();
-}
-
-WRITE8_MEMBER( svi3x8_state::excs_w )
-{
- if (offset & 1)
- m_vdp->register_write(data);
- else
- m_vdp->vram_write(data);
-}
-
//**************************************************************************
// CARTRIDGE
@@ -532,9 +515,9 @@ DEVICE_IMAGE_LOAD_MEMBER( svi3x8_state, cartridge )
MACHINE_CONFIG_START(svi3x8_state::svi318)
// basic machine hardware
- MCFG_DEVICE_ADD("maincpu", Z80, XTAL(10'738'635) / 3)
- MCFG_DEVICE_PROGRAM_MAP(svi3x8_mem)
- MCFG_DEVICE_IO_MAP(svi3x8_io)
+ Z80(config, m_maincpu, XTAL(10'738'635) / 3);
+ m_maincpu->set_addrmap(AS_PROGRAM, &svi3x8_state::svi3x8_mem);
+ m_maincpu->set_addrmap(AS_IO, &svi3x8_state::svi3x8_io);
RAM(config, m_ram).set_default_size("16K");
@@ -548,33 +531,33 @@ MACHINE_CONFIG_START(svi3x8_state::svi318)
// sound hardware
SPEAKER(config, "mono").front_center();
SPEAKER_SOUND(config, "speaker").add_route(ALL_OUTPUTS, "mono", 0.25);
- WAVE(config, "wave", "cassette").add_route(ALL_OUTPUTS, "mono", 0.25);
+ WAVE(config, "wave", m_cassette).add_route(ALL_OUTPUTS, "mono", 0.25);
ay8910_device &psg(AY8910(config, "psg", XTAL(10'738'635) / 6));
psg.port_a_read_callback().set_ioport("JOY");
psg.port_b_write_callback().set(FUNC(svi3x8_state::bank_w));
psg.add_route(ALL_OUTPUTS, "mono", 0.75);
// cassette
- MCFG_CASSETTE_ADD("cassette")
- MCFG_CASSETTE_FORMATS(svi_cassette_formats)
- MCFG_CASSETTE_DEFAULT_STATE(CASSETTE_STOPPED)
- MCFG_CASSETTE_INTERFACE("svi318_cass")
- MCFG_SOFTWARE_LIST_ADD("cass_list", "svi318_cass")
+ CASSETTE(config, m_cassette);
+ m_cassette->set_formats(svi_cassette_formats);
+ m_cassette->set_default_state(CASSETTE_STOPPED);
+ m_cassette->set_interface("svi318_cass");
+ SOFTWARE_LIST(config, "cass_list").set_original("svi318_cass");
// cartridge slot
MCFG_GENERIC_CARTSLOT_ADD("cartslot", generic_plain_slot, "svi318_cart")
MCFG_GENERIC_EXTENSIONS("bin,rom")
MCFG_GENERIC_LOAD(svi3x8_state, cartridge)
- MCFG_SOFTWARE_LIST_ADD("cart_list", "svi318_cart")
+ SOFTWARE_LIST(config, "cart_list").set_original("svi318_cart");
// expander bus
- MCFG_SVI_EXPANDER_BUS_ADD("exp")
- MCFG_SVI_EXPANDER_INT_HANDLER(WRITELINE(*this, svi3x8_state, intexp_w))
- MCFG_SVI_EXPANDER_ROMDIS_HANDLER(WRITELINE(*this, svi3x8_state, romdis_w))
- MCFG_SVI_EXPANDER_RAMDIS_HANDLER(WRITELINE(*this, svi3x8_state, ramdis_w))
- MCFG_SVI_EXPANDER_CTRL1_HANDLER(WRITELINE(*this, svi3x8_state, ctrl1_w))
- MCFG_SVI_EXPANDER_EXCSR_HANDLER(READ8(*this, svi3x8_state, excs_r))
- MCFG_SVI_EXPANDER_EXCSW_HANDLER(WRITE8(*this, svi3x8_state, excs_w))
+ SVI_EXPANDER(config, m_expander, svi_expander_modules);
+ m_expander->int_handler().set(FUNC(svi3x8_state::intexp_w));
+ m_expander->romdis_handler().set(FUNC(svi3x8_state::romdis_w));
+ m_expander->ramdis_handler().set(FUNC(svi3x8_state::ramdis_w));
+ m_expander->ctrl1_handler().set(FUNC(svi3x8_state::ctrl1_w));
+ m_expander->excsr_handler().set(m_vdp, FUNC(tms9928a_device::read));
+ m_expander->excsw_handler().set(m_vdp, FUNC(tms9928a_device::write));
MACHINE_CONFIG_END
void svi3x8_state::svi318p(machine_config &config)
diff --git a/src/mame/drivers/svision.cpp b/src/mame/drivers/svision.cpp
index f58246bd9b0..b7b1d2db97e 100644
--- a/src/mame/drivers/svision.cpp
+++ b/src/mame/drivers/svision.cpp
@@ -509,47 +509,52 @@ MACHINE_CONFIG_START(svision_state::svision_base)
MCFG_GENERIC_MANDATORY
MCFG_GENERIC_LOAD(svision_state, svision_cart)
- MCFG_SOFTWARE_LIST_ADD("cart_list", "svision")
+ SOFTWARE_LIST(config, "cart_list").set_original("svision");
MACHINE_CONFIG_END
-MACHINE_CONFIG_START(svision_state::svision)
+void svision_state::svision(machine_config &config)
+{
svision_base(config);
- MCFG_DEVICE_ADD(m_maincpu, M65C02, 4000000)
- MCFG_DEVICE_PROGRAM_MAP(svision_mem)
+ M65C02(config, m_maincpu, 4000000);
+ m_maincpu->set_addrmap(AS_PROGRAM, &svision_state::svision_mem);
- MCFG_SCREEN_ADD(m_screen, LCD)
- MCFG_SCREEN_REFRESH_RATE(61)
- MCFG_SCREEN_SIZE(3+160+3, 160)
- MCFG_SCREEN_VISIBLE_AREA(3+0, 3+160-1, 0, 160-1)
- MCFG_SCREEN_UPDATE_DRIVER(svision_state, screen_update_svision)
- MCFG_SCREEN_PALETTE(m_palette)
- MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE(*this, svision_state, frame_int_w))
+ SCREEN(config, m_screen, SCREEN_TYPE_LCD);
+ m_screen->set_refresh_hz(61);
+ m_screen->set_size(3+160+3, 160);
+ m_screen->set_visarea(3+0, 3+160-1, 0, 160-1);
+ m_screen->set_screen_update(FUNC(svision_state::screen_update_svision));
+ m_screen->set_palette(m_palette);
+ m_screen->screen_vblank().set(FUNC(svision_state::frame_int_w));
PALETTE(config, m_palette, FUNC(svision_state::svision_palette), ARRAY_LENGTH(svision_pens));
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(svision_state::svisions)
+void svision_state::svisions(machine_config &config)
+{
svision(config);
- MCFG_TIMER_DRIVER_ADD_PERIODIC("pet_timer", svision_state, svision_pet_timer_dev, attotime::from_seconds(8))
-MACHINE_CONFIG_END
+ TIMER(config, "pet_timer").configure_periodic(FUNC(svision_state::svision_pet_timer_dev), attotime::from_seconds(8));
+}
-MACHINE_CONFIG_START(svision_state::svisionp)
+void svision_state::svisionp(machine_config &config)
+{
svision(config);
m_maincpu->set_clock(4430000);
m_screen->set_refresh(HZ_TO_ATTOSECONDS(50));
m_palette->set_init(FUNC(svision_state::svisionp_palette));
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(svision_state::svisionn)
+void svision_state::svisionn(machine_config &config)
+{
svision(config);
m_maincpu->set_clock(3560000/*?*/);
m_screen->set_refresh(HZ_TO_ATTOSECONDS(60));
m_palette->set_init(FUNC(svision_state::svisionn_palette));
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(svision_state::tvlinkp)
+void svision_state::tvlinkp(machine_config &config)
+{
svisionp(config);
m_maincpu->set_addrmap(AS_PROGRAM, address_map_constructor(&std::remove_pointer_t<decltype(this)>::tvlink_mem, tag(), this));
@@ -557,7 +562,7 @@ MACHINE_CONFIG_START(svision_state::tvlinkp)
m_screen->set_screen_update(FUNC(svision_state::screen_update_tvlink));
MCFG_MACHINE_RESET_OVERRIDE(svision_state, tvlink)
-MACHINE_CONFIG_END
+}
ROM_START(svision)
ROM_REGION(0x80000, "maincpu", ROMREGION_ERASE00)
diff --git a/src/mame/drivers/svmu.cpp b/src/mame/drivers/svmu.cpp
index c1e3b142858..468315ccc5d 100644
--- a/src/mame/drivers/svmu.cpp
+++ b/src/mame/drivers/svmu.cpp
@@ -75,9 +75,9 @@ WRITE8_MEMBER(svmu_state::page_w)
READ8_MEMBER(svmu_state::prog_r)
{
if (m_page == 1)
- return m_flash->read(space, offset);
+ return m_flash->read(offset);
else if (m_page == 2)
- return m_flash->read(space, 0x10000 + offset);
+ return m_flash->read(0x10000 + offset);
else
return m_bios[offset];
}
@@ -85,9 +85,9 @@ READ8_MEMBER(svmu_state::prog_r)
WRITE8_MEMBER(svmu_state::prog_w)
{
if (m_page == 1)
- m_flash->write(space, offset, data);
+ m_flash->write(offset, data);
else if (m_page == 2)
- m_flash->write(space, 0x10000 + offset, data);
+ m_flash->write(0x10000 + offset, data);
}
/*
@@ -341,8 +341,8 @@ void svmu_state::svmu(machine_config &config)
/* devices */
ATMEL_29C010(config, m_flash);
- quickload_image_device &quickload(QUICKLOAD(config, "quickload", 0));
- quickload.set_handler(snapquick_load_delegate(&QUICKLOAD_LOAD_NAME(svmu_state, svmu), this), "vms,bin", 0);
+ quickload_image_device &quickload(QUICKLOAD(config, "quickload"));
+ quickload.set_handler(snapquick_load_delegate(&QUICKLOAD_LOAD_NAME(svmu_state, svmu), this), "vms,bin");
quickload.set_interface("svmu_quik");
/* Software lists */
diff --git a/src/mame/drivers/swtpc.cpp b/src/mame/drivers/swtpc.cpp
index 5f2343136f7..c4250611299 100644
--- a/src/mame/drivers/swtpc.cpp
+++ b/src/mame/drivers/swtpc.cpp
@@ -97,10 +97,11 @@ void swtpc_state::machine_start()
m_maincpu->space(AS_PROGRAM).install_ram(0, m_ram->size() - 1, m_ram->pointer());
}
-MACHINE_CONFIG_START(swtpc_state::swtpc)
+void swtpc_state::swtpc(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M6800, XTAL(1'843'200) / 2)
- MCFG_DEVICE_PROGRAM_MAP(mem_map)
+ M6800(config, m_maincpu, XTAL(1'843'200) / 2);
+ m_maincpu->set_addrmap(AS_PROGRAM, &swtpc_state::mem_map);
MC14411(config, m_brg, XTAL(1'843'200));
m_brg->out_f<7>().set("io0", FUNC(ss50_interface_port_device::f600_1200_w)); // 1200b
@@ -144,50 +145,46 @@ MACHINE_CONFIG_START(swtpc_state::swtpc)
m_brg->out_f<13>().append("io6", FUNC(ss50_interface_port_device::f110_w));
m_brg->out_f<13>().append("io7", FUNC(ss50_interface_port_device::f110_w));
- MCFG_SS50_INTERFACE_PORT_ADD("io0", default_2rs_devices, nullptr)
- MCFG_SS50_INTERFACE_IRQ_CALLBACK(WRITELINE("mainirq", input_merger_device, in_w<0>))
- MCFG_SS50_INTERFACE_FIRQ_CALLBACK(WRITELINE("mainnmi", input_merger_device, in_w<0>))
- MCFG_SS50_INTERFACE_PORT_ADD("io1", default_2rs_devices, "mps")
- MCFG_SS50_INTERFACE_IRQ_CALLBACK(WRITELINE("mainirq", input_merger_device, in_w<1>))
- MCFG_SS50_INTERFACE_FIRQ_CALLBACK(WRITELINE("mainnmi", input_merger_device, in_w<1>))
- MCFG_SS50_INTERFACE_PORT_ADD("io2", default_2rs_devices, nullptr)
- MCFG_SS50_INTERFACE_IRQ_CALLBACK(WRITELINE("mainirq", input_merger_device, in_w<2>))
- MCFG_SS50_INTERFACE_FIRQ_CALLBACK(WRITELINE("mainnmi", input_merger_device, in_w<2>))
- MCFG_SS50_INTERFACE_PORT_ADD("io3", default_2rs_devices, nullptr)
- MCFG_SS50_INTERFACE_IRQ_CALLBACK(WRITELINE("mainirq", input_merger_device, in_w<3>))
- MCFG_SS50_INTERFACE_FIRQ_CALLBACK(WRITELINE("mainnmi", input_merger_device, in_w<3>))
- MCFG_SS50_INTERFACE_PORT_ADD("io4", default_2rs_devices, nullptr)
- MCFG_SS50_INTERFACE_IRQ_CALLBACK(WRITELINE("mainirq", input_merger_device, in_w<4>))
- MCFG_SS50_INTERFACE_FIRQ_CALLBACK(WRITELINE("mainnmi", input_merger_device, in_w<4>))
- MCFG_SS50_INTERFACE_PORT_ADD("io5", default_2rs_devices, nullptr)
- MCFG_SS50_INTERFACE_IRQ_CALLBACK(WRITELINE("mainirq", input_merger_device, in_w<5>))
- MCFG_SS50_INTERFACE_FIRQ_CALLBACK(WRITELINE("mainnmi", input_merger_device, in_w<5>))
- MCFG_SS50_INTERFACE_PORT_ADD("io6", default_2rs_devices, nullptr)
- MCFG_SS50_INTERFACE_IRQ_CALLBACK(WRITELINE("mainirq", input_merger_device, in_w<6>))
- MCFG_SS50_INTERFACE_FIRQ_CALLBACK(WRITELINE("mainnmi", input_merger_device, in_w<6>))
- MCFG_SS50_INTERFACE_PORT_ADD("io7", default_2rs_devices, nullptr)
- MCFG_SS50_INTERFACE_IRQ_CALLBACK(WRITELINE("mainirq", input_merger_device, in_w<7>))
- MCFG_SS50_INTERFACE_FIRQ_CALLBACK(WRITELINE("mainnmi", input_merger_device, in_w<7>))
-
- MCFG_INPUT_MERGER_ANY_HIGH("mainirq")
- MCFG_INPUT_MERGER_OUTPUT_HANDLER(INPUTLINE("maincpu", M6800_IRQ_LINE))
- MCFG_INPUT_MERGER_ANY_HIGH("mainnmi")
- MCFG_INPUT_MERGER_OUTPUT_HANDLER(INPUTLINE("maincpu", INPUT_LINE_NMI))
+ ss50_interface_port_device &io0(SS50_INTERFACE(config, "io0", ss50_default_2rs_devices, nullptr));
+ io0.irq_cb().set("mainirq", FUNC(input_merger_device::in_w<0>));
+ io0.firq_cb().set("mainnmi", FUNC(input_merger_device::in_w<0>));
+ ss50_interface_port_device &io1(SS50_INTERFACE(config, "io1", ss50_default_2rs_devices, "mps"));
+ io1.irq_cb().set("mainirq", FUNC(input_merger_device::in_w<1>));
+ io1.firq_cb().set("mainnmi", FUNC(input_merger_device::in_w<1>));
+ ss50_interface_port_device &io2(SS50_INTERFACE(config, "io2", ss50_default_2rs_devices, nullptr));
+ io2.irq_cb().set("mainirq", FUNC(input_merger_device::in_w<2>));
+ io2.firq_cb().set("mainnmi", FUNC(input_merger_device::in_w<2>));
+ ss50_interface_port_device &io3(SS50_INTERFACE(config, "io3", ss50_default_2rs_devices, nullptr));
+ io3.irq_cb().set("mainirq", FUNC(input_merger_device::in_w<3>));
+ io3.firq_cb().set("mainnmi", FUNC(input_merger_device::in_w<3>));
+ ss50_interface_port_device &io4(SS50_INTERFACE(config, "io4", ss50_default_2rs_devices, nullptr));
+ io4.irq_cb().set("mainirq", FUNC(input_merger_device::in_w<4>));
+ io4.firq_cb().set("mainnmi", FUNC(input_merger_device::in_w<4>));
+ ss50_interface_port_device &io5(SS50_INTERFACE(config, "io5", ss50_default_2rs_devices, nullptr));
+ io5.irq_cb().set("mainirq", FUNC(input_merger_device::in_w<5>));
+ io5.firq_cb().set("mainnmi", FUNC(input_merger_device::in_w<5>));
+ ss50_interface_port_device &io6(SS50_INTERFACE(config, "io6", ss50_default_2rs_devices, nullptr));
+ io6.irq_cb().set("mainirq", FUNC(input_merger_device::in_w<6>));
+ io6.firq_cb().set("mainnmi", FUNC(input_merger_device::in_w<6>));
+ ss50_interface_port_device &io7(SS50_INTERFACE(config, "io7", ss50_default_2rs_devices, nullptr));
+ io7.irq_cb().set("mainirq", FUNC(input_merger_device::in_w<7>));
+ io7.firq_cb().set("mainnmi", FUNC(input_merger_device::in_w<7>));
+
+ INPUT_MERGER_ANY_HIGH(config, "mainirq").output_handler().set_inputline(m_maincpu, M6800_IRQ_LINE);
+ INPUT_MERGER_ANY_HIGH(config, "mainnmi").output_handler().set_inputline(m_maincpu, INPUT_LINE_NMI);
RAM(config, RAM_TAG).set_default_size("2K").set_extra_options("4K,8K,12K,16K,20K,24K,28K,32K");
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(swtpc_state::swtpcm)
+void swtpc_state::swtpcm(machine_config &config)
+{
swtpc(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_CLOCK(XTAL(1'797'100) / 2)
+ m_maincpu->set_clock(XTAL(1'797'100) / 2);
- MCFG_DEVICE_MODIFY("brg")
- MCFG_DEVICE_CLOCK(XTAL(1'797'100))
+ m_brg->set_clock(XTAL(1'797'100));
- MCFG_DEVICE_MODIFY("io1")
- MCFG_SLOT_DEFAULT_OPTION("mpc")
-MACHINE_CONFIG_END
+ subdevice<ss50_interface_port_device>("io1")->set_default_option("mpc");
+}
/* ROM definition */
ROM_START( swtpc )
diff --git a/src/mame/drivers/symbolics.cpp b/src/mame/drivers/symbolics.cpp
index 3e5966b0902..88a3fc628b2 100644
--- a/src/mame/drivers/symbolics.cpp
+++ b/src/mame/drivers/symbolics.cpp
@@ -318,22 +318,22 @@ void symbolics_state::machine_reset()
*/
}
-MACHINE_CONFIG_START(symbolics_state::symbolics)
+void symbolics_state::symbolics(machine_config &config)
+{
/* basic machine hardware */
// per page 159 of http://bitsavers.trailing-edge.com/pdf/symbolics/3600_series/Lisp_Machine_Hardware_Memos.pdf:
//XTALS: 16MHz @H11 (68k CPU clock)
// 4.9152MHz @J5 (driving the two MPSCs serial clocks)
// 66.67MHz @J10 (main lispcpu/system clock)
- MCFG_DEVICE_ADD("maincpu", M68000, XTAL(16'000'000)/2) /* MC68000L8 @A27; clock is derived from the 16Mhz xtal @ H11, verified from patent */
- MCFG_DEVICE_PROGRAM_MAP(m68k_mem)
+ M68000(config, m_maincpu, XTAL(16'000'000)/2); /* MC68000L8 @A27; clock is derived from the 16Mhz xtal @ H11, verified from patent */
+ m_maincpu->set_addrmap(AS_PROGRAM, &symbolics_state::m68k_mem);
//ADD ME:
// Framebuffer
// DMA Controller
// I8274 MPSC #1 (synchronous serial for keyboard)
// I8274 MPSC #2 (EIA/debug console?)
-
-MACHINE_CONFIG_END
+}
/******************************************************************************
ROM Definitions
diff --git a/src/mame/drivers/sys2900.cpp b/src/mame/drivers/sys2900.cpp
index 3ab265c8496..b4d27a20a64 100644
--- a/src/mame/drivers/sys2900.cpp
+++ b/src/mame/drivers/sys2900.cpp
@@ -141,20 +141,21 @@ uint32_t sys2900_state::screen_update_sys2900(screen_device &screen, bitmap_ind1
return 0;
}
-MACHINE_CONFIG_START(sys2900_state::sys2900)
+void sys2900_state::sys2900(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, XTAL(8'000'000) / 2)
- MCFG_DEVICE_PROGRAM_MAP(mem_map)
- MCFG_DEVICE_IO_MAP(io_map)
+ Z80(config, m_maincpu, XTAL(8'000'000) / 2);
+ m_maincpu->set_addrmap(AS_PROGRAM, &sys2900_state::mem_map);
+ m_maincpu->set_addrmap(AS_IO, &sys2900_state::io_map);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(50)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */
- MCFG_SCREEN_SIZE(640, 480)
- MCFG_SCREEN_VISIBLE_AREA(0, 640-1, 0, 480-1)
- MCFG_SCREEN_UPDATE_DRIVER(sys2900_state, screen_update_sys2900)
- MCFG_SCREEN_PALETTE("palette")
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(50);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */
+ screen.set_size(640, 480);
+ screen.set_visarea(0, 640-1, 0, 480-1);
+ screen.set_screen_update(FUNC(sys2900_state::screen_update_sys2900));
+ screen.set_palette("palette");
PALETTE(config, "palette", palette_device::MONOCHROME);
@@ -162,7 +163,7 @@ MACHINE_CONFIG_START(sys2900_state::sys2900)
Z80PIO(config, "pio", 0);
Z80SIO(config, "sio1", 0);
Z80SIO(config, "sio2", 0);
-MACHINE_CONFIG_END
+}
/* ROM definition */
ROM_START( sys2900 )
diff --git a/src/mame/drivers/sys9002.cpp b/src/mame/drivers/sys9002.cpp
index 7820b4fc476..8015eb12407 100644
--- a/src/mame/drivers/sys9002.cpp
+++ b/src/mame/drivers/sys9002.cpp
@@ -121,20 +121,21 @@ static DEVICE_INPUT_DEFAULTS_START( uart2 )
DEVICE_INPUT_DEFAULTS( "RS232_STOPBITS", 0xff, RS232_STOPBITS_1 )
DEVICE_INPUT_DEFAULTS_END
-MACHINE_CONFIG_START(sys9002_state::sys9002)
+void sys9002_state::sys9002(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu",I8085A, XTAL(2'000'000)) // XTAL not visible on images
- MCFG_DEVICE_PROGRAM_MAP(sys9002_mem)
- MCFG_DEVICE_IO_MAP(sys9002_io)
+ I8085A(config, m_maincpu, XTAL(2'000'000)); // XTAL not visible on images
+ m_maincpu->set_addrmap(AS_PROGRAM, &sys9002_state::sys9002_mem);
+ m_maincpu->set_addrmap(AS_IO, &sys9002_state::sys9002_io);
/* video hardware */
- MCFG_SCREEN_ADD_MONOCHROME("screen", RASTER, rgb_t::green())
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) // not correct
- MCFG_SCREEN_UPDATE_DEVICE("crtc", mc6845_device, screen_update)
- MCFG_SCREEN_SIZE(32*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1)
- //MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_mx2178)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER, rgb_t::green()));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500)); // not correct
+ screen.set_screen_update("crtc", FUNC(mc6845_device::screen_update));
+ screen.set_size(32*8, 32*8);
+ screen.set_visarea(0*8, 32*8-1, 2*8, 30*8-1);
+ //GFXDECODE(config, "gfxdecode", m_palette, gfx_mx2178);
PALETTE(config, m_palette, palette_device::MONOCHROME);
/* Devices */
@@ -172,7 +173,7 @@ MACHINE_CONFIG_START(sys9002_state::sys9002)
rs232b.dsr_handler().set("uart2", FUNC(i8251_device::write_dsr));
rs232b.cts_handler().set("uart2", FUNC(i8251_device::write_cts));
rs232b.set_option_device_input_defaults("terminal", DEVICE_INPUT_DEFAULTS_NAME(uart2));
-MACHINE_CONFIG_END
+}
/* ROM definition */
ROM_START( sys9002 )
diff --git a/src/mame/drivers/system1.cpp b/src/mame/drivers/system1.cpp
index c077f2ceea1..f5deda2c5f1 100644
--- a/src/mame/drivers/system1.cpp
+++ b/src/mame/drivers/system1.cpp
@@ -835,8 +835,8 @@ void system1_state::sound_map(address_map &map)
{
map(0x0000, 0x7fff).rom();
map(0x8000, 0x87ff).mirror(0x1800).ram();
- map(0xa000, 0xa000).mirror(0x1fff).w("sn1", FUNC(sn76489a_device::command_w));
- map(0xc000, 0xc000).mirror(0x1fff).w("sn2", FUNC(sn76489a_device::command_w));
+ map(0xa000, 0xa000).mirror(0x1fff).w("sn1", FUNC(sn76489a_device::write));
+ map(0xc000, 0xc000).mirror(0x1fff).w("sn2", FUNC(sn76489a_device::write));
map(0xe000, 0xe000).mirror(0x1fff).r(FUNC(system1_state::sound_data_r));
}
@@ -2173,7 +2173,7 @@ void system1_state::sys1ppi(machine_config &config)
TIMER(config, "soundirq", 0).configure_scanline(FUNC(system1_state::soundirq_gen), "screen", 32, 64);
- MCFG_QUANTUM_TIME(attotime::from_hz(6000))
+ config.m_minimum_quantum = attotime::from_hz(6000);
I8255A(config, m_ppi8255);
m_ppi8255->out_pa_callback().set(FUNC(system1_state::soundport_w));
diff --git a/src/mame/drivers/system16.cpp b/src/mame/drivers/system16.cpp
index 06609402562..83b760a1f4a 100644
--- a/src/mame/drivers/system16.cpp
+++ b/src/mame/drivers/system16.cpp
@@ -2060,18 +2060,18 @@ GFXDECODE_END
*
*************************************/
-MACHINE_CONFIG_START(segas1x_bootleg_state::z80_ym2151)
-
- MCFG_DEVICE_ADD("soundcpu", Z80, 4000000)
- MCFG_DEVICE_PROGRAM_MAP(sound_map)
- MCFG_DEVICE_IO_MAP(sound_io_map)
+void segas1x_bootleg_state::z80_ym2151(machine_config &config)
+{
+ Z80(config, m_soundcpu, 4000000);
+ m_soundcpu->set_addrmap(AS_PROGRAM, &segas1x_bootleg_state::sound_map);
+ m_soundcpu->set_addrmap(AS_IO, &segas1x_bootleg_state::sound_io_map);
/* sound hardware */
SPEAKER(config, "lspeaker").front_left();
SPEAKER(config, "rspeaker").front_right();
YM2151(config, "ymsnd", 4000000).add_route(0, "lspeaker", 0.32).add_route(1, "rspeaker", 0.32);
-MACHINE_CONFIG_END
+}
WRITE_LINE_MEMBER(segas1x_bootleg_state::sound_cause_nmi)
{
@@ -2098,56 +2098,58 @@ void segas1x_bootleg_state::z80_ym2151_upd7759(machine_config &config)
m_upd7759->add_route(ALL_OUTPUTS, "rspeaker", 0.48);
}
-MACHINE_CONFIG_START(segas1x_bootleg_state::datsu_ym2151_msm5205)
+void segas1x_bootleg_state::datsu_ym2151_msm5205(machine_config &config)
+{
/* TODO:
- other games might use this sound configuration
- speaker is likely to be mono for the bootlegs, not stereo.
- check msm5205 frequency.
*/
- MCFG_DEVICE_ADD("soundcpu",Z80, 4000000)
- MCFG_DEVICE_PROGRAM_MAP(tturfbl_sound_map)
- MCFG_DEVICE_IO_MAP(tturfbl_sound_io_map)
+ Z80(config, m_soundcpu, 4000000);
+ m_soundcpu->set_addrmap(AS_PROGRAM, &segas1x_bootleg_state::tturfbl_sound_map);
+ m_soundcpu->set_addrmap(AS_IO, &segas1x_bootleg_state::tturfbl_sound_io_map);
SPEAKER(config, "lspeaker").front_left();
SPEAKER(config, "rspeaker").front_right();
YM2151(config, "ymsnd", 4000000).add_route(0, "lspeaker", 0.32).add_route(1, "rspeaker", 0.32);
- MCFG_DEVICE_ADD("5205", MSM5205, 220000)
- MCFG_MSM5205_VCLK_CB(WRITELINE(*this, segas1x_bootleg_state, tturfbl_msm5205_callback))
- MCFG_MSM5205_PRESCALER_SELECTOR(S48_4B)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 0.80)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 0.80)
-MACHINE_CONFIG_END
+ MSM5205(config, m_msm, 220000);
+ m_msm->vck_legacy_callback().set(FUNC(segas1x_bootleg_state::tturfbl_msm5205_callback));
+ m_msm->set_prescaler_selector(msm5205_device::S48_4B);
+ m_msm->add_route(ALL_OUTPUTS, "lspeaker", 0.80);
+ m_msm->add_route(ALL_OUTPUTS, "rspeaker", 0.80);
+}
-MACHINE_CONFIG_START(segas1x_bootleg_state::datsu_2x_ym2203_msm5205)
- MCFG_DEVICE_ADD("soundcpu", Z80, 4000000)
- MCFG_DEVICE_PROGRAM_MAP(shinobi_datsu_sound_map)
+void segas1x_bootleg_state::datsu_2x_ym2203_msm5205(machine_config &config)
+{
+ Z80(config, m_soundcpu, 4000000);
+ m_soundcpu->set_addrmap(AS_PROGRAM, &segas1x_bootleg_state::shinobi_datsu_sound_map);
/* sound hardware */
SPEAKER(config, "mono").front_center();
// 2x YM2203C, one at U57, one at U56
- MCFG_DEVICE_ADD("ym1", YM2203, 4000000)
- MCFG_SOUND_ROUTE(0, "mono", 0.50)
- MCFG_SOUND_ROUTE(1, "mono", 0.50)
- MCFG_SOUND_ROUTE(2, "mono", 0.50)
- MCFG_SOUND_ROUTE(3, "mono", 0.80)
-
- MCFG_DEVICE_ADD("ym2", YM2203, 4000000)
- MCFG_SOUND_ROUTE(0, "mono", 0.50)
- MCFG_SOUND_ROUTE(1, "mono", 0.50)
- MCFG_SOUND_ROUTE(2, "mono", 0.50)
- MCFG_SOUND_ROUTE(3, "mono", 0.80)
+ ym2203_device &ym1(YM2203(config, "ym1", 4000000));
+ ym1.add_route(0, "mono", 0.50);
+ ym1.add_route(1, "mono", 0.50);
+ ym1.add_route(2, "mono", 0.50);
+ ym1.add_route(3, "mono", 0.80);
+
+ ym2203_device &ym2(YM2203(config, "ym2", 4000000));
+ ym2.add_route(0, "mono", 0.50);
+ ym2.add_route(1, "mono", 0.50);
+ ym2.add_route(2, "mono", 0.50);
+ ym2.add_route(3, "mono", 0.80);
LS157(config, m_adpcm_select, 0);
m_adpcm_select->out_callback().set("5205", FUNC(msm5205_device::data_w));
- MCFG_DEVICE_ADD("5205", MSM5205, 384000)
- MCFG_MSM5205_VCLK_CB(WRITELINE(*this, segas1x_bootleg_state, datsu_msm5205_callback))
- MCFG_MSM5205_PRESCALER_SELECTOR(S48_4B)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.80)
-MACHINE_CONFIG_END
+ MSM5205(config, m_msm, 384000);
+ m_msm->vck_legacy_callback().set(FUNC(segas1x_bootleg_state::datsu_msm5205_callback));
+ m_msm->set_prescaler_selector(msm5205_device::S48_4B);
+ m_msm->add_route(ALL_OUTPUTS, "mono", 0.80);
+}
/*************************************
@@ -2157,120 +2159,111 @@ MACHINE_CONFIG_END
*************************************/
/* System 16A/B Bootlegs */
-MACHINE_CONFIG_START(segas1x_bootleg_state::system16_base)
-
+void segas1x_bootleg_state::system16_base(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M68000, 10000000)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", segas1x_bootleg_state, irq4_line_hold)
+ M68000(config, m_maincpu, 10000000);
+ m_maincpu->set_vblank_int("screen", FUNC(segas1x_bootleg_state::irq4_line_hold));
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(40*8, 36*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 40*8-1, 0*8, 28*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(segas1x_bootleg_state, screen_update_system16)
- MCFG_SCREEN_PALETTE("palette")
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_refresh_hz(60);
+ m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ m_screen->set_size(40*8, 36*8);
+ m_screen->set_visarea(0*8, 40*8-1, 0*8, 28*8-1);
+ m_screen->set_screen_update(FUNC(segas1x_bootleg_state::screen_update_system16));
+ m_screen->set_palette(m_palette);
- GFXDECODE(config, m_gfxdecode, "palette", gfx_sys16);
- PALETTE(config, "palette").set_entries(2048*SHADOW_COLORS_MULTIPLIER);
+ GFXDECODE(config, m_gfxdecode, m_palette, gfx_sys16);
+ PALETTE(config, m_palette).set_entries(2048*SHADOW_COLORS_MULTIPLIER);
MCFG_VIDEO_START_OVERRIDE(segas1x_bootleg_state,system16)
GENERIC_LATCH_8(config, m_soundlatch);
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(segas1x_bootleg_state::shinobi_datsu)
+void segas1x_bootleg_state::shinobi_datsu(machine_config &config)
+{
system16_base(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(shinobib_map)
+ m_maincpu->set_addrmap(AS_PROGRAM, &segas1x_bootleg_state::shinobib_map);
BOOTLEG_SYS16A_SPRITES(config, m_sprites, 0, 189-117, 0, 1, 2, 3, 4, 5, 6, 7);
MCFG_VIDEO_START_OVERRIDE(segas1x_bootleg_state, s16a_bootleg_shinobi )
- MCFG_SCREEN_MODIFY("screen")
- MCFG_SCREEN_UPDATE_DRIVER(segas1x_bootleg_state, screen_update_s16a_bootleg)
+ m_screen->set_screen_update(FUNC(segas1x_bootleg_state::screen_update_s16a_bootleg));
datsu_2x_ym2203_msm5205(config);
-MACHINE_CONFIG_END
-
+}
-MACHINE_CONFIG_START(segas1x_bootleg_state::passshtb)
+void segas1x_bootleg_state::passshtb(machine_config &config)
+{
system16_base(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(passshtb_map)
+ m_maincpu->set_addrmap(AS_PROGRAM, &segas1x_bootleg_state::passshtb_map);
BOOTLEG_SYS16A_SPRITES(config, m_sprites, 0, 189-117, 1, 0, 3, 2, 5, 4, 7, 6);
MCFG_VIDEO_START_OVERRIDE(segas1x_bootleg_state, s16a_bootleg_passsht )
- MCFG_SCREEN_MODIFY("screen")
- MCFG_SCREEN_UPDATE_DRIVER(segas1x_bootleg_state, screen_update_s16a_bootleg)
+ m_screen->set_screen_update(FUNC(segas1x_bootleg_state::screen_update_s16a_bootleg));
z80_ym2151_upd7759(config);
-MACHINE_CONFIG_END
-
+}
-MACHINE_CONFIG_START(segas1x_bootleg_state::passsht4b)
+void segas1x_bootleg_state::passsht4b(machine_config &config)
+{
system16_base(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(passht4b_map)
+ m_maincpu->set_addrmap(AS_PROGRAM, &segas1x_bootleg_state::passht4b_map);
// wrong
BOOTLEG_SYS16A_SPRITES(config, m_sprites, 0, 189-117, 1, 0, 3, 2, 5, 4, 7, 6);
- MCFG_VIDEO_START_OVERRIDE(segas1x_bootleg_state, s16a_bootleg_passsht )
- MCFG_SCREEN_MODIFY("screen")
- MCFG_SCREEN_UPDATE_DRIVER(segas1x_bootleg_state, screen_update_s16a_bootleg_passht4b)
+ MCFG_VIDEO_START_OVERRIDE(segas1x_bootleg_state, s16a_bootleg_passsht)
+ m_screen->set_screen_update(FUNC(segas1x_bootleg_state::screen_update_s16a_bootleg_passht4b));
datsu_2x_ym2203_msm5205(config);
- MCFG_DEVICE_MODIFY("5205")
- MCFG_MSM5205_PRESCALER_SELECTOR(S96_4B)
-MACHINE_CONFIG_END
+ m_msm->set_prescaler_selector(msm5205_device::S96_4B);
+}
-MACHINE_CONFIG_START(segas1x_bootleg_state::wb3bb)
+void segas1x_bootleg_state::wb3bb(machine_config &config)
+{
system16_base(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(wb3bbl_map)
+ m_maincpu->set_addrmap(AS_PROGRAM, &segas1x_bootleg_state::wb3bbl_map);
BOOTLEG_SYS16A_SPRITES(config, m_sprites, 0, 189-117, 4, 0, 5, 1, 6, 2, 7, 3);
m_sprites->set_local_originy(0);
- MCFG_VIDEO_START_OVERRIDE(segas1x_bootleg_state, s16a_bootleg_wb3bl )
- MCFG_SCREEN_MODIFY("screen")
- MCFG_SCREEN_UPDATE_DRIVER(segas1x_bootleg_state, screen_update_s16a_bootleg)
+ MCFG_VIDEO_START_OVERRIDE(segas1x_bootleg_state, s16a_bootleg_wb3bl)
+ m_screen->set_screen_update(FUNC(segas1x_bootleg_state::screen_update_s16a_bootleg));
z80_ym2151(config);
-MACHINE_CONFIG_END
-
-
-MACHINE_CONFIG_START(segas1x_bootleg_state::goldnaxeb_base)
+}
+void segas1x_bootleg_state::goldnaxeb_base(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M68000, 10000000)
- MCFG_DEVICE_PROGRAM_MAP(goldnaxeb1_map)
- MCFG_DEVICE_OPCODES_MAP(decrypted_opcodes_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", segas1x_bootleg_state, irq4_line_hold)
-
+ M68000(config, m_maincpu, 10000000);
+ m_maincpu->set_addrmap(AS_PROGRAM, &segas1x_bootleg_state::goldnaxeb1_map);
+ m_maincpu->set_addrmap(AS_OPCODES, &segas1x_bootleg_state::decrypted_opcodes_map);
+ m_maincpu->set_vblank_int("screen", FUNC(segas1x_bootleg_state::irq4_line_hold));
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(40*8, 28*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 40*8-1, 0*8, 28*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(segas1x_bootleg_state, screen_update_system16)
- MCFG_SCREEN_PALETTE("palette")
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_refresh_hz(60);
+ m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ m_screen->set_size(40*8, 28*8);
+ m_screen->set_visarea(0*8, 40*8-1, 0*8, 28*8-1);
+ m_screen->set_screen_update(FUNC(segas1x_bootleg_state::screen_update_system16));
+ m_screen->set_palette(m_palette);
- GFXDECODE(config, m_gfxdecode, "palette", gfx_sys16);
- PALETTE(config, "palette", palette_device::BLACK, 2048*SHADOW_COLORS_MULTIPLIER);
+ GFXDECODE(config, m_gfxdecode, m_palette, gfx_sys16);
+ PALETTE(config, m_palette, palette_device::BLACK, 2048*SHADOW_COLORS_MULTIPLIER);
SEGA_SYS16B_SPRITES(config, m_sprites, 0);
m_sprites->set_local_originx(189-121);
@@ -2278,166 +2271,165 @@ MACHINE_CONFIG_START(segas1x_bootleg_state::goldnaxeb_base)
MCFG_VIDEO_START_OVERRIDE(segas1x_bootleg_state,system16)
GENERIC_LATCH_8(config, m_soundlatch);
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(segas1x_bootleg_state::goldnaxeb1)
+void segas1x_bootleg_state::goldnaxeb1(machine_config &config)
+{
goldnaxeb_base(config);
- subdevice<palette_device>("palette")->set_entries(0x2000*SHADOW_COLORS_MULTIPLIER);
+ m_palette->set_entries(0x2000*SHADOW_COLORS_MULTIPLIER);
z80_ym2151_upd7759(config);
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(segas1x_bootleg_state::goldnaxeb2)
+void segas1x_bootleg_state::goldnaxeb2(machine_config &config)
+{
goldnaxeb_base(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(goldnaxeb2_map)
- MCFG_DEVICE_REMOVE_ADDRESS_MAP(AS_OPCODES)
+ m_maincpu->set_addrmap(AS_PROGRAM, &segas1x_bootleg_state::goldnaxeb2_map);
+ m_maincpu->set_addrmap(AS_OPCODES, address_map_constructor());
- subdevice<palette_device>("palette")->set_entries(0x2000*SHADOW_COLORS_MULTIPLIER);
+ m_palette->set_entries(0x2000*SHADOW_COLORS_MULTIPLIER);
datsu_2x_ym2203_msm5205(config);
-MACHINE_CONFIG_END
-
+}
-MACHINE_CONFIG_START(segas1x_bootleg_state::bayrouteb1)
+void segas1x_bootleg_state::bayrouteb1(machine_config &config)
+{
goldnaxeb_base(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(bayrouteb1_map)
+ m_maincpu->set_addrmap(AS_PROGRAM, &segas1x_bootleg_state::bayrouteb1_map);
z80_ym2151_upd7759(config);
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(segas1x_bootleg_state::bayrouteb2)
+void segas1x_bootleg_state::bayrouteb2(machine_config &config)
+{
goldnaxeb_base(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(bayrouteb2_map)
- MCFG_DEVICE_REMOVE_ADDRESS_MAP(AS_OPCODES)
+ m_maincpu->set_addrmap(AS_PROGRAM, &segas1x_bootleg_state::bayrouteb2_map);
+ m_maincpu->set_addrmap(AS_OPCODES, address_map_constructor());
datsu_ym2151_msm5205(config);
m_sprites->set_local_originx(189-107);
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(segas1x_bootleg_state::tturfbl)
+void segas1x_bootleg_state::tturfbl(machine_config &config)
+{
system16_base(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(tturfbl_map)
+ m_maincpu->set_addrmap(AS_PROGRAM, &segas1x_bootleg_state::tturfbl_map);
datsu_ym2151_msm5205(config);
SEGA_SYS16B_SPRITES(config, m_sprites, 0);
m_sprites->set_local_originx(189-107);
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(segas1x_bootleg_state::dduxbl)
+void segas1x_bootleg_state::dduxbl(machine_config &config)
+{
system16_base(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(dduxbl_map)
+ m_maincpu->set_addrmap(AS_PROGRAM, &segas1x_bootleg_state::dduxbl_map);
SEGA_SYS16B_SPRITES(config, m_sprites, 0);
m_sprites->set_local_originx(189-112);
z80_ym2151(config);
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(segas1x_bootleg_state::eswatbl)
+void segas1x_bootleg_state::eswatbl(machine_config &config)
+{
system16_base(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(eswatbl_map)
+ m_maincpu->set_addrmap(AS_PROGRAM, &segas1x_bootleg_state::eswatbl_map);
SEGA_SYS16B_SPRITES(config, m_sprites, 0);
m_sprites->set_local_originx(189-124);
z80_ym2151_upd7759(config);
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(segas1x_bootleg_state::eswatbl2)
+void segas1x_bootleg_state::eswatbl2(machine_config &config)
+{
system16_base(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(eswatbl2_map)
+ m_maincpu->set_addrmap(AS_PROGRAM, &segas1x_bootleg_state::eswatbl2_map);
SEGA_SYS16B_SPRITES(config, m_sprites, 0);
m_sprites->set_local_originx(189-121);
datsu_2x_ym2203_msm5205(config);
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(segas1x_bootleg_state::tetrisbl)
+void segas1x_bootleg_state::tetrisbl(machine_config &config)
+{
system16_base(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(tetrisbl_map)
+ m_maincpu->set_addrmap(AS_PROGRAM, &segas1x_bootleg_state::tetrisbl_map);
SEGA_SYS16B_SPRITES(config, m_sprites, 0);
m_sprites->set_local_originx(189-112);
z80_ym2151(config);
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(segas1x_bootleg_state::altbeastbl)
+void segas1x_bootleg_state::altbeastbl(machine_config &config)
+{
system16_base(config);
+
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(tetrisbl_map)
+ m_maincpu->set_addrmap(AS_PROGRAM, &segas1x_bootleg_state::tetrisbl_map);
SEGA_SYS16B_SPRITES(config, m_sprites, 0);
m_sprites->set_local_originx(189-112);
datsu_2x_ym2203_msm5205(config);
- MCFG_DEVICE_MODIFY("5205")
- MCFG_MSM5205_PRESCALER_SELECTOR(S96_4B)
-MACHINE_CONFIG_END
+ m_msm->set_prescaler_selector(msm5205_device::S96_4B);
+}
-MACHINE_CONFIG_START(segas1x_bootleg_state::beautyb)
+void segas1x_bootleg_state::beautyb(machine_config &config)
+{
system16_base(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(beautyb_map)
+ m_maincpu->set_addrmap(AS_PROGRAM, &segas1x_bootleg_state::beautyb_map);
// no sprites
z80_ym2151(config);
-MACHINE_CONFIG_END
-
+}
/* System 18 Bootlegs */
-MACHINE_CONFIG_START(segas1x_bootleg_state::system18)
-
+void segas1x_bootleg_state::system18(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M68000, 10000000)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", segas1x_bootleg_state, irq4_line_hold)
+ M68000(config, m_maincpu, 10000000);
+ m_maincpu->set_vblank_int("screen", FUNC(segas1x_bootleg_state::irq4_line_hold));
- MCFG_DEVICE_ADD("soundcpu", Z80, 8000000)
- MCFG_DEVICE_PROGRAM_MAP(sound_18_map)
- MCFG_DEVICE_IO_MAP(sound_18_io_map)
+ Z80(config, m_soundcpu, 8000000);
+ m_soundcpu->set_addrmap(AS_PROGRAM, &segas1x_bootleg_state::sound_18_map);
+ m_soundcpu->set_addrmap(AS_IO, &segas1x_bootleg_state::sound_18_io_map);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(40*8, 28*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 40*8-1, 0*8, 28*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(segas1x_bootleg_state, screen_update_system18old)
- MCFG_SCREEN_PALETTE("palette")
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_refresh_hz(60);
+ m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ m_screen->set_size(40*8, 28*8);
+ m_screen->set_visarea(0*8, 40*8-1, 0*8, 28*8-1);
+ m_screen->set_screen_update(FUNC(segas1x_bootleg_state::screen_update_system18old));
+ m_screen->set_palette(m_palette);
- GFXDECODE(config, m_gfxdecode, "palette", gfx_sys16);
- PALETTE(config, "palette").set_entries((2048+2048)*SHADOW_COLORS_MULTIPLIER); // 64 extra colours for vdp (but we use 2048 so shadow mask works)
+ GFXDECODE(config, m_gfxdecode, m_palette, gfx_sys16);
+ PALETTE(config, m_palette).set_entries((2048+2048)*SHADOW_COLORS_MULTIPLIER); // 64 extra colours for vdp (but we use 2048 so shadow mask works)
MCFG_VIDEO_START_OVERRIDE(segas1x_bootleg_state,system18old)
@@ -2450,50 +2442,49 @@ MACHINE_CONFIG_START(segas1x_bootleg_state::system18)
GENERIC_LATCH_8(config, m_soundlatch);
- MCFG_DEVICE_ADD("3438.0", YM3438, 8000000)
- MCFG_SOUND_ROUTE(0, "lspeaker", 0.40)
- MCFG_SOUND_ROUTE(1, "rspeaker", 0.40)
-
- MCFG_DEVICE_ADD("3438.1", YM3438, 8000000)
- MCFG_SOUND_ROUTE(0, "lspeaker", 0.40)
- MCFG_SOUND_ROUTE(1, "rspeaker", 0.40)
+ ym3438_device &ym3438_0(YM3438(config, "3438.0", 8000000));
+ ym3438_0.add_route(0, "lspeaker", 0.40);
+ ym3438_0.add_route(1, "rspeaker", 0.40);
- MCFG_DEVICE_ADD("5c68", RF5C68, 8000000)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 1.0)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 1.0)
- MCFG_DEVICE_ADDRESS_MAP(0, pcm_map)
-MACHINE_CONFIG_END
+ ym3438_device &ym3438_1(YM3438(config, "3438.1", 8000000));
+ ym3438_1.add_route(0, "lspeaker", 0.40);
+ ym3438_1.add_route(1, "rspeaker", 0.40);
+ rf5c68_device &rf5c68(RF5C68(config, "5c68", 8000000));
+ rf5c68.add_route(ALL_OUTPUTS, "lspeaker", 1.0);
+ rf5c68.add_route(ALL_OUTPUTS, "rspeaker", 1.0);
+ rf5c68.set_addrmap(0, &segas1x_bootleg_state::pcm_map);
+}
-MACHINE_CONFIG_START(segas1x_bootleg_state::astormbl)
+void segas1x_bootleg_state::astormbl(machine_config &config)
+{
system18(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(astormbl_map)
-MACHINE_CONFIG_END
-
-MACHINE_CONFIG_START(segas1x_bootleg_state::astormb2)
+ m_maincpu->set_addrmap(AS_PROGRAM, &segas1x_bootleg_state::astormbl_map);
+}
+void segas1x_bootleg_state::astormb2(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M68000, XTAL(24'000'000)/2) /* 12MHz */
- MCFG_DEVICE_PROGRAM_MAP(astormbl_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", segas1x_bootleg_state, irq4_line_hold)
+ M68000(config, m_maincpu, XTAL(24'000'000)/2); /* 12MHz */
+ m_maincpu->set_addrmap(AS_PROGRAM, &segas1x_bootleg_state::astormbl_map);
+ m_maincpu->set_vblank_int("screen", FUNC(segas1x_bootleg_state::irq4_line_hold));
- MCFG_DEVICE_ADD("soundcpu", Z80, XTAL(8'000'000)/2) /* 4MHz */
- MCFG_DEVICE_PROGRAM_MAP(sys18bl_sound_map)
+ Z80(config, m_soundcpu, XTAL(8'000'000)/2); /* 4MHz */
+ m_soundcpu->set_addrmap(AS_PROGRAM, &segas1x_bootleg_state::sys18bl_sound_map);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(58.271) /* V-Sync is 58.271Hz & H-Sync is ~ 14.48KHz measured */
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(40*8, 28*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 40*8-1, 0*8, 28*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(segas1x_bootleg_state, screen_update_system18old)
- MCFG_SCREEN_PALETTE("palette")
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_refresh_hz(58.271); /* V-Sync is 58.271Hz & H-Sync is ~ 14.48KHz measured */
+ m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ m_screen->set_size(40*8, 28*8);
+ m_screen->set_visarea(0*8, 40*8-1, 0*8, 28*8-1);
+ m_screen->set_screen_update(FUNC(segas1x_bootleg_state::screen_update_system18old));
+ m_screen->set_palette(m_palette);
- GFXDECODE(config, m_gfxdecode, "palette", gfx_sys16);
- PALETTE(config, "palette").set_entries((2048+2048)*SHADOW_COLORS_MULTIPLIER); // 64 extra colours for vdp (but we use 2048 so shadow mask works)
+ GFXDECODE(config, m_gfxdecode, m_palette, gfx_sys16);
+ PALETTE(config, m_palette).set_entries((2048+2048)*SHADOW_COLORS_MULTIPLIER); // 64 extra colours for vdp (but we use 2048 so shadow mask works)
MCFG_VIDEO_START_OVERRIDE(segas1x_bootleg_state,system18old)
@@ -2506,57 +2497,56 @@ MACHINE_CONFIG_START(segas1x_bootleg_state::astormb2)
// 1 OKI M6295 instead of original sound hardware
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("oki", OKIM6295, XTAL(8'000'000)/8, okim6295_device::PIN7_HIGH) // 1MHz clock and pin verified
- MCFG_DEVICE_ADDRESS_MAP(0, sys18bl_oki_map)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
-MACHINE_CONFIG_END
+ okim6295_device &oki(OKIM6295(config, "oki", XTAL(8'000'000)/8, okim6295_device::PIN7_HIGH)); // 1MHz clock and pin verified
+ oki.set_addrmap(0, &segas1x_bootleg_state::sys18bl_oki_map);
+ oki.add_route(ALL_OUTPUTS, "mono", 1.0);
+}
-MACHINE_CONFIG_START(segas1x_bootleg_state::mwalkbl)
+void segas1x_bootleg_state::mwalkbl(machine_config &config)
+{
astormb2(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(mwalkbl_map)
-MACHINE_CONFIG_END
-
+ m_maincpu->set_addrmap(AS_PROGRAM, &segas1x_bootleg_state::mwalkbl_map);
+}
-MACHINE_CONFIG_START(segas1x_bootleg_state::shdancbl)
+void segas1x_bootleg_state::shdancbl(machine_config &config)
+{
system18(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(shdancbl_map)
-
- MCFG_DEVICE_MODIFY("soundcpu")
- MCFG_DEVICE_PROGRAM_MAP(shdancbl_sound_map)
- MCFG_DEVICE_IO_MAP(shdancbl_sound_io_map)
- MCFG_DEVICE_REMOVE("5c68")
-
- MCFG_DEVICE_ADD("5205", MSM5205, 200000)
- MCFG_MSM5205_VCLK_CB(WRITELINE(*this, segas1x_bootleg_state, shdancbl_msm5205_callback))
- MCFG_MSM5205_PRESCALER_SELECTOR(S48_4B)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 0.80)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 0.80)
-MACHINE_CONFIG_END
-
-MACHINE_CONFIG_START(segas1x_bootleg_state::shdancbla)
+ m_maincpu->set_addrmap(AS_PROGRAM, &segas1x_bootleg_state::shdancbl_map);
+
+ m_soundcpu->set_addrmap(AS_PROGRAM, &segas1x_bootleg_state::shdancbl_sound_map);
+ m_soundcpu->set_addrmap(AS_IO, &segas1x_bootleg_state::shdancbl_sound_io_map);
+
+ config.device_remove("5c68");
+
+ MSM5205(config, m_msm, 200000);
+ m_msm->vck_legacy_callback().set(FUNC(segas1x_bootleg_state::shdancbl_msm5205_callback));
+ m_msm->set_prescaler_selector(msm5205_device::S48_4B);
+ m_msm->add_route(ALL_OUTPUTS, "lspeaker", 0.80);
+ m_msm->add_route(ALL_OUTPUTS, "rspeaker", 0.80);
+}
+
+void segas1x_bootleg_state::shdancbla(machine_config &config)
+{
system18(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(shdancbla_map)
+ m_maincpu->set_addrmap(AS_PROGRAM, &segas1x_bootleg_state::shdancbla_map);
- MCFG_DEVICE_MODIFY("soundcpu")
- MCFG_DEVICE_PROGRAM_MAP(shdancbla_sound_map)
- MCFG_DEVICE_IO_MAP(shdancbl_sound_io_map)
- MCFG_DEVICE_REMOVE("5c68")
+ m_soundcpu->set_addrmap(AS_PROGRAM, &segas1x_bootleg_state::shdancbla_sound_map);
+ m_soundcpu->set_addrmap(AS_IO, &segas1x_bootleg_state::shdancbl_sound_io_map);
- MCFG_DEVICE_ADD("5205", MSM5205, 200000)
- MCFG_MSM5205_VCLK_CB(WRITELINE(*this, segas1x_bootleg_state, shdancbl_msm5205_callback))
- MCFG_MSM5205_PRESCALER_SELECTOR(S48_4B)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 0.80)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 0.80)
-MACHINE_CONFIG_END
+ config.device_remove("5c68");
+
+ MSM5205(config, m_msm, 200000);
+ m_msm->vck_legacy_callback().set(FUNC(segas1x_bootleg_state::shdancbl_msm5205_callback));
+ m_msm->set_prescaler_selector(msm5205_device::S48_4B);
+ m_msm->add_route(ALL_OUTPUTS, "lspeaker", 0.80);
+ m_msm->add_route(ALL_OUTPUTS, "rspeaker", 0.80);
+}
MACHINE_RESET_MEMBER(segas1x_bootleg_state,ddcrewbl)
@@ -2571,24 +2561,24 @@ MACHINE_RESET_MEMBER(segas1x_bootleg_state,ddcrewbl)
}
-MACHINE_CONFIG_START(segas1x_bootleg_state::ddcrewbl)
-
+void segas1x_bootleg_state::ddcrewbl(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M68000, 10000000)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", segas1x_bootleg_state, irq4_line_hold)
- MCFG_DEVICE_PROGRAM_MAP(ddcrewbl_map)
+ M68000(config, m_maincpu, 10000000);
+ m_maincpu->set_addrmap(AS_PROGRAM, &segas1x_bootleg_state::ddcrewbl_map);
+ m_maincpu->set_vblank_int("screen", FUNC(segas1x_bootleg_state::irq4_line_hold));
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(40*8, 28*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 40*8-1, 0*8, 28*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(segas1x_bootleg_state, screen_update_system18old)
- MCFG_SCREEN_PALETTE("palette")
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_refresh_hz(60);
+ m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ m_screen->set_size(40*8, 28*8);
+ m_screen->set_visarea(0*8, 40*8-1, 0*8, 28*8-1);
+ m_screen->set_screen_update(FUNC(segas1x_bootleg_state::screen_update_system18old));
+ m_screen->set_palette(m_palette);
- GFXDECODE(config, m_gfxdecode, "palette", gfx_sys16);
- PALETTE(config, "palette").set_entries((2048+2048)*SHADOW_COLORS_MULTIPLIER);
+ GFXDECODE(config, m_gfxdecode, m_palette, gfx_sys16);
+ PALETTE(config, m_palette).set_entries((2048+2048)*SHADOW_COLORS_MULTIPLIER);
MCFG_VIDEO_START_OVERRIDE(segas1x_bootleg_state,system18old)
@@ -2599,9 +2589,9 @@ MACHINE_CONFIG_START(segas1x_bootleg_state::ddcrewbl)
/* sound hardware */
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("oki", OKIM6295, 10000000/10, okim6295_device::PIN7_HIGH) // clock and pin not verified
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
-MACHINE_CONFIG_END
+ okim6295_device &oki(OKIM6295(config, "oki", 10000000/10, okim6295_device::PIN7_HIGH)); // clock and pin not verified
+ oki.add_route(ALL_OUTPUTS, "mono", 1.0);
+}
/*************************************
diff --git a/src/mame/drivers/tagteam.cpp b/src/mame/drivers/tagteam.cpp
index 185e8590854..1046292c820 100644
--- a/src/mame/drivers/tagteam.cpp
+++ b/src/mame/drivers/tagteam.cpp
@@ -209,25 +209,25 @@ INTERRUPT_GEN_MEMBER(tagteam_state::sound_timer_irq)
}
-MACHINE_CONFIG_START(tagteam_state::tagteam)
-
+void tagteam_state::tagteam(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M6502, XTAL(12'000'000)/8)
- MCFG_DEVICE_PROGRAM_MAP(main_map)
- MCFG_DEVICE_PERIODIC_INT_DRIVER(tagteam_state, irq0_line_assert, 272/16*57) // connected to bit 4 of vcount (basically once every 16 scanlines)
+ M6502(config, m_maincpu, XTAL(12'000'000)/8);
+ m_maincpu->set_addrmap(AS_PROGRAM, &tagteam_state::main_map);
+ m_maincpu->set_periodic_int(FUNC(tagteam_state::irq0_line_assert), attotime::from_hz(272/16*57)); // connected to bit 4 of vcount (basically once every 16 scanlines)
- MCFG_DEVICE_ADD("audiocpu", M6502, XTAL(12'000'000)/2/6) // daughterboard gets 12mhz/2 from mainboard, but how it's divided further is a guess
- MCFG_DEVICE_PROGRAM_MAP(sound_map)
- MCFG_DEVICE_PERIODIC_INT_DRIVER(tagteam_state, sound_timer_irq, 272/16*57) // same source as maincpu irq
+ M6502(config, m_audiocpu, XTAL(12'000'000)/2/6); // daughterboard gets 12mhz/2 from mainboard, but how it's divided further is a guess
+ m_audiocpu->set_addrmap(AS_PROGRAM, &tagteam_state::sound_map);
+ m_audiocpu->set_periodic_int(FUNC(tagteam_state::sound_timer_irq), attotime::from_hz(272/16*57)); // same source as maincpu irq
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(57) // measured?
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(3072))
- MCFG_SCREEN_SIZE(32*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 1*8, 31*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(tagteam_state, screen_update)
- MCFG_SCREEN_PALETTE(m_palette)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(57); // measured?
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(3072));
+ screen.set_size(32*8, 32*8);
+ screen.set_visarea(0*8, 32*8-1, 1*8, 31*8-1);
+ screen.set_screen_update(FUNC(tagteam_state::screen_update));
+ screen.set_palette(m_palette);
GFXDECODE(config, m_gfxdecode, m_palette, gfx_tagteam);
PALETTE(config, m_palette, FUNC(tagteam_state::tagteam_palette), 32);
@@ -241,10 +241,11 @@ MACHINE_CONFIG_START(tagteam_state::tagteam)
AY8910(config, "ay1", XTAL(12'000'000)/8).add_route(ALL_OUTPUTS, "speaker", 0.25);
AY8910(config, "ay2", XTAL(12'000'000)/8).add_route(ALL_OUTPUTS, "speaker", 0.25);
- MCFG_DEVICE_ADD("dac", DAC_8BIT_R2R, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 0.25) // unknown DAC
- MCFG_DEVICE_ADD("vref", VOLTAGE_REGULATOR, 0) MCFG_VOLTAGE_REGULATOR_OUTPUT(5.0)
- MCFG_SOUND_ROUTE(0, "dac", 1.0, DAC_VREF_POS_INPUT) MCFG_SOUND_ROUTE(0, "dac", -1.0, DAC_VREF_NEG_INPUT)
-MACHINE_CONFIG_END
+ DAC_8BIT_R2R(config, "dac", 0).add_route(ALL_OUTPUTS, "speaker", 0.25); // unknown DAC
+ voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref"));
+ vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT);
+ vref.add_route(0, "dac", -1.0, DAC_VREF_NEG_INPUT);
+}
diff --git a/src/mame/drivers/tail2nos.cpp b/src/mame/drivers/tail2nos.cpp
index 8e595e64e54..06c6e75470e 100644
--- a/src/mame/drivers/tail2nos.cpp
+++ b/src/mame/drivers/tail2nos.cpp
@@ -232,16 +232,16 @@ void tail2nos_state::machine_reset()
{
}
-MACHINE_CONFIG_START(tail2nos_state::tail2nos)
-
+void tail2nos_state::tail2nos(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M68000,XTAL(20'000'000)/2) /* verified on pcb */
- MCFG_DEVICE_PROGRAM_MAP(main_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", tail2nos_state, irq6_line_hold)
+ M68000(config, m_maincpu, XTAL(20'000'000)/2); /* verified on pcb */
+ m_maincpu->set_addrmap(AS_PROGRAM, &tail2nos_state::main_map);
+ m_maincpu->set_vblank_int("screen", FUNC(tail2nos_state::irq6_line_hold));
- MCFG_DEVICE_ADD("audiocpu", Z80,XTAL(20'000'000)/4) /* verified on pcb */
- MCFG_DEVICE_PROGRAM_MAP(sound_map)
- MCFG_DEVICE_IO_MAP(sound_port_map)
+ Z80(config, m_audiocpu, XTAL(20'000'000)/4); /* verified on pcb */
+ m_audiocpu->set_addrmap(AS_PROGRAM, &tail2nos_state::sound_map);
+ m_audiocpu->set_addrmap(AS_IO, &tail2nos_state::sound_port_map);
/* IRQs are triggered by the YM2608 */
ACIA6850(config, m_acia, 0);
@@ -250,13 +250,13 @@ MACHINE_CONFIG_START(tail2nos_state::tail2nos)
//m_acia->rts_handler().set("link", FUNC(rs232_port_device::write_rts));
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(64*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 40*8-1, 1*8, 31*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(tail2nos_state, screen_update_tail2nos)
- MCFG_SCREEN_PALETTE(m_palette)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(64*8, 32*8);
+ screen.set_visarea(0*8, 40*8-1, 1*8, 31*8-1);
+ screen.set_screen_update(FUNC(tail2nos_state::screen_update_tail2nos));
+ screen.set_palette(m_palette);
GFXDECODE(config, m_gfxdecode, m_palette, gfx_tail2nos);
PALETTE(config, m_palette).set_format(palette_device::xRGB_555, 2048);
@@ -285,7 +285,7 @@ MACHINE_CONFIG_START(tail2nos_state::tail2nos)
ymsnd.add_route(0, "rspeaker", 0.25);
ymsnd.add_route(1, "lspeaker", 1.0);
ymsnd.add_route(2, "rspeaker", 1.0);
-MACHINE_CONFIG_END
+}
diff --git a/src/mame/drivers/taito.cpp b/src/mame/drivers/taito.cpp
index 2a0c0e31438..c5a723dae68 100644
--- a/src/mame/drivers/taito.cpp
+++ b/src/mame/drivers/taito.cpp
@@ -313,8 +313,7 @@ WRITE8_MEMBER( taito_state::io_w )
WRITE_LINE_MEMBER( taito_state::pia_cb2_w )
{
- address_space& space = m_maincpu->space(AS_PROGRAM);
- m_votrax->write(space, 0, m_votrax_cmd);
+ m_votrax->write(m_votrax_cmd);
}
READ8_MEMBER( taito_state::pia_pb_r )
@@ -350,13 +349,14 @@ TIMER_DEVICE_CALLBACK_MEMBER( taito_state::timer_a )
m_digits[++digit] = patterns[m_p_ram[m_out_offs++]&15];
}
-MACHINE_CONFIG_START(taito_state::taito)
+void taito_state::taito(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD(m_maincpu, I8080, 19000000/9)
- MCFG_DEVICE_PROGRAM_MAP(taito_map)
+ I8080(config, m_maincpu, 19000000/9);
+ m_maincpu->set_addrmap(AS_PROGRAM, &taito_state::taito_map);
- MCFG_DEVICE_ADD(m_cpu2, M6802, 1000000) // cpu & clock are a guess
- MCFG_DEVICE_PROGRAM_MAP(taito_sub_map)
+ M6802(config, m_cpu2, 1000000); // cpu & clock are a guess
+ m_cpu2->set_addrmap(AS_PROGRAM, &taito_state::taito_sub_map);
/* Video */
config.set_default_layout(layout_taito);
@@ -365,9 +365,10 @@ MACHINE_CONFIG_START(taito_state::taito)
genpin_audio(config);
SPEAKER(config, "speaker").front_center();
- MCFG_DEVICE_ADD("dac", DAC_8BIT_R2R, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 0.475) // unknown DAC
- MCFG_DEVICE_ADD("vref", VOLTAGE_REGULATOR, 0) MCFG_VOLTAGE_REGULATOR_OUTPUT(5.0)
- MCFG_SOUND_ROUTE(0, "dac", 1.0, DAC_VREF_POS_INPUT) MCFG_SOUND_ROUTE(0, "dac", -1.0, DAC_VREF_NEG_INPUT)
+ DAC_8BIT_R2R(config, "dac", 0).add_route(ALL_OUTPUTS, "speaker", 0.475); // unknown DAC
+ voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref"));
+ vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT);
+ vref.add_route(0, "dac", -1.0, DAC_VREF_NEG_INPUT);
PIA6821(config, m_pia);
//m_pia->readpa_handler().set(FUNC(taito_state::pia_pa_r));
@@ -379,8 +380,8 @@ MACHINE_CONFIG_START(taito_state::taito)
m_pia->irqa_handler().set_inputline(m_cpu2, INPUT_LINE_NMI);
m_pia->irqb_handler().set_inputline(m_cpu2, M6802_IRQ_LINE);
- MCFG_TIMER_DRIVER_ADD_PERIODIC("timer_a", taito_state, timer_a, attotime::from_hz(200))
-MACHINE_CONFIG_END
+ TIMER(config, "timer_a").configure_periodic(FUNC(taito_state::timer_a), attotime::from_hz(200));
+}
void taito_state::shock(machine_config &config)
{
diff --git a/src/mame/drivers/taito_b.cpp b/src/mame/drivers/taito_b.cpp
index 11f9039f46b..db5fc1d16cd 100644
--- a/src/mame/drivers/taito_b.cpp
+++ b/src/mame/drivers/taito_b.cpp
@@ -1979,7 +1979,7 @@ void taitob_state::hitice(machine_config &config)
Z80(config, m_audiocpu, 24_MHz_XTAL / 4); /* 6 MHz Z80B */
m_audiocpu->set_addrmap(AS_PROGRAM, &taitob_state::viofight_sound_map);
- MCFG_QUANTUM_TIME(attotime::from_hz(600))
+ config.m_minimum_quantum = attotime::from_hz(600);
TC0220IOC(config, m_tc0220ioc, 0);
m_tc0220ioc->read_0_callback().set_ioport("DSWA");
diff --git a/src/mame/drivers/taito_f2.cpp b/src/mame/drivers/taito_f2.cpp
index a4e6c07ce9e..886c71cea5f 100644
--- a/src/mame/drivers/taito_f2.cpp
+++ b/src/mame/drivers/taito_f2.cpp
@@ -4815,7 +4815,9 @@ ROM_START( footchmp )
/* no Delta-T samples */
-// Pals c80-08.45 c80-09.46
+ ROM_REGION( 0x400, "plds", 0 )
+ ROM_LOAD( "c80-08.ic45", 0x000, 0x104, CRC(6137dd15) SHA1(fb20df118da69b52767d5e6c81fa85174c50c5c5) ) // pal16l8bcn
+ ROM_LOAD( "c80-09.ic46", 0x200, 0x104, CRC(4ca48869) SHA1(8ba46ab625d3cbf3431ca2e6f3a9207d402202ef) ) // pal16l8bcn
ROM_END
ROM_START( hthero )
diff --git a/src/mame/drivers/taito_f3.cpp b/src/mame/drivers/taito_f3.cpp
index d77c43d9f47..f6586ae1caa 100644
--- a/src/mame/drivers/taito_f3.cpp
+++ b/src/mame/drivers/taito_f3.cpp
@@ -4106,12 +4106,13 @@ void taito_f3_state::init_bubsymph()
READ32_MEMBER(taito_f3_state::bubsympb_oki_r)
{
- return m_oki->read(space,0);
+ return m_oki->read();
}
+
WRITE32_MEMBER(taito_f3_state::bubsympb_oki_w)
{
//printf("write %08x %08x\n",data,mem_mask);
- if (ACCESSING_BITS_0_7) m_oki->write(space, 0,data&0xff);
+ if (ACCESSING_BITS_0_7) m_oki->write(data&0xff);
//if (mem_mask==0x000000ff) downcast<okim6295_device *>(device)->write(0,data&0xff);
if (ACCESSING_BITS_16_23)
{
diff --git a/src/mame/drivers/taito_l.cpp b/src/mame/drivers/taito_l.cpp
index f2cce198f88..034a0c37395 100644
--- a/src/mame/drivers/taito_l.cpp
+++ b/src/mame/drivers/taito_l.cpp
@@ -321,7 +321,7 @@ READ8_MEMBER(taitol_1cpu_state::extport_select_and_ym2203_r)
{
for (auto &mux : m_mux)
mux->select_w((offset >> 1) & 1);
- return m_ymsnd->read(space, offset & 1);
+ return m_ymsnd->read(offset & 1);
}
WRITE8_MEMBER(taitol_state::mcu_control_w)
@@ -1452,43 +1452,43 @@ WRITE8_MEMBER(fhawk_state::portA_w)
//logerror ("YM2203 bank change val=%02x %s\n", data & 0x03, machine().describe_context() );
}
-MACHINE_CONFIG_START(taitol_state::l_system_video)
+void taitol_state::l_system_video(machine_config &config)
+{
for (int bank = 0; bank < 4; bank++)
{
ADDRESS_MAP_BANK(config, m_ram_bnks[bank]).set_map(&taitol_state::tc0090lvc_map).set_options(ENDIANNESS_LITTLE, 8, 20, 0x1000);
}
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(40*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 40*8-1, 2*8, 30*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(taitol_state, screen_update_taitol)
- MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE(*this, taitol_state, screen_vblank_taitol))
- MCFG_SCREEN_PALETTE(m_palette)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(40*8, 32*8);
+ screen.set_visarea(0*8, 40*8-1, 2*8, 30*8-1);
+ screen.set_screen_update(FUNC(taitol_state::screen_update_taitol));
+ screen.screen_vblank().set(FUNC(taitol_state::screen_vblank_taitol));
+ screen.set_palette(m_palette);
GFXDECODE(config, m_gfxdecode, m_palette, taito_l);
PALETTE(config, m_palette, palette_device::BLACK).set_format(palette_device::xBGR_444, 256);
- MCFG_TIMER_DRIVER_ADD_SCANLINE("scantimer", taitol_state, vbl_interrupt, "screen", 0, 1)
-MACHINE_CONFIG_END
-
-
-MACHINE_CONFIG_START(fhawk_state::fhawk)
+ TIMER(config, "scantimer").configure_scanline(FUNC(taitol_state::vbl_interrupt), "screen", 0, 1);
+}
+void fhawk_state::fhawk(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, XTAL(13'330'560)/2) /* verified freq on pin122 of TC0090LVC cpu */
- MCFG_DEVICE_PROGRAM_MAP(fhawk_map)
- MCFG_DEVICE_IRQ_ACKNOWLEDGE_DRIVER(taitol_state, irq_callback)
+ Z80(config, m_main_cpu, XTAL(13'330'560)/2); /* verified freq on pin122 of TC0090LVC cpu */
+ m_main_cpu->set_addrmap(AS_PROGRAM, &fhawk_state::fhawk_map);
+ m_main_cpu->set_irq_acknowledge_callback(FUNC(taitol_state::irq_callback));
- MCFG_DEVICE_ADD("audiocpu", Z80, 12_MHz_XTAL/3) /* verified on pcb */
- MCFG_DEVICE_PROGRAM_MAP(fhawk_3_map)
+ Z80(config, m_audio_cpu, 12_MHz_XTAL/3); /* verified on pcb */
+ m_audio_cpu->set_addrmap(AS_PROGRAM, &fhawk_state::fhawk_3_map);
- MCFG_DEVICE_ADD("slave", Z80, 12_MHz_XTAL/3) /* verified on pcb */
- MCFG_DEVICE_PROGRAM_MAP(fhawk_2_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", taitol_state, irq0_line_hold)
+ z80_device &slave(Z80(config, "slave", 12_MHz_XTAL/3)); /* verified on pcb */
+ slave.set_addrmap(AS_PROGRAM, &fhawk_state::fhawk_2_map);
+ slave.set_vblank_int("screen", FUNC(taitol_state::irq0_line_hold));
- MCFG_QUANTUM_PERFECT_CPU("maincpu")
+ config.m_perfect_cpu_quantum = subtag("maincpu");
tc0220ioc_device &tc0220ioc(TC0220IOC(config, "tc0220ioc", 0));
tc0220ioc.read_0_callback().set_ioport("DSWA");
@@ -1518,47 +1518,42 @@ MACHINE_CONFIG_START(fhawk_state::fhawk)
pc060ha_device &ciu(PC060HA(config, "ciu", 0));
ciu.set_master_tag("slave");
ciu.set_slave_tag(m_audio_cpu);
-MACHINE_CONFIG_END
-
+}
-MACHINE_CONFIG_START(champwr_state::champwr)
+void champwr_state::champwr(machine_config &config)
+{
fhawk(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(champwr_map)
+ m_main_cpu->set_addrmap(AS_PROGRAM, &champwr_state::champwr_map);
- MCFG_DEVICE_MODIFY("audiocpu")
- MCFG_DEVICE_PROGRAM_MAP(champwr_3_map)
+ m_audio_cpu->set_addrmap(AS_PROGRAM, &champwr_state::champwr_3_map);
- MCFG_DEVICE_MODIFY("slave")
- MCFG_DEVICE_PROGRAM_MAP(champwr_2_map)
+ subdevice<cpu_device>("slave")->set_addrmap(AS_PROGRAM, &champwr_state::champwr_2_map);
/* sound hardware */
subdevice<ym2203_device>("ymsnd")->port_b_write_callback().set(FUNC(champwr_state::msm5205_volume_w));
- MCFG_DEVICE_ADD("msm", MSM5205, 384_kHz_XTAL)
- MCFG_MSM5205_VCLK_CB(WRITELINE(*this, champwr_state, msm5205_vck)) /* VCK function */
- MCFG_MSM5205_PRESCALER_SELECTOR(S48_4B) /* 8 kHz */
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.80)
-MACHINE_CONFIG_END
-
-
-
-MACHINE_CONFIG_START(taitol_2cpu_state::raimais)
+ MSM5205(config, m_msm, 384_kHz_XTAL);
+ m_msm->vck_legacy_callback().set(FUNC(champwr_state::msm5205_vck)); /* VCK function */
+ m_msm->set_prescaler_selector(msm5205_device::S48_4B); /* 8 kHz */
+ m_msm->add_route(ALL_OUTPUTS, "mono", 0.80);
+}
- MCFG_DEVICE_ADD("maincpu", Z80, 13330560/2) // needs verification from pin122 of TC0090LVC
- MCFG_DEVICE_PROGRAM_MAP(raimais_map)
- MCFG_DEVICE_IRQ_ACKNOWLEDGE_DRIVER(taitol_state, irq_callback)
+void taitol_2cpu_state::raimais(machine_config &config)
+{
+ Z80(config, m_main_cpu, 13330560/2); // needs verification from pin122 of TC0090LVC
+ m_main_cpu->set_addrmap(AS_PROGRAM, &taitol_2cpu_state::raimais_map);
+ m_main_cpu->set_irq_acknowledge_callback(FUNC(taitol_state::irq_callback));
- MCFG_DEVICE_ADD("audiocpu", Z80, 12000000/3) // not verified
- MCFG_DEVICE_PROGRAM_MAP(raimais_3_map)
+ Z80(config, m_audio_cpu, 12000000/3); // not verified
+ m_audio_cpu->set_addrmap(AS_PROGRAM, &taitol_2cpu_state::raimais_3_map);
- MCFG_DEVICE_ADD("slave", Z80, 12000000/3) // not verified
- MCFG_DEVICE_PROGRAM_MAP(raimais_2_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", taitol_state, irq0_line_hold)
+ z80_device &slave(Z80(config, "slave", 12000000/3)); // not verified
+ slave.set_addrmap(AS_PROGRAM, &taitol_2cpu_state::raimais_2_map);
+ slave.set_vblank_int("screen", FUNC(taitol_state::irq0_line_hold));
- MCFG_QUANTUM_PERFECT_CPU("maincpu")
+ config.m_perfect_cpu_quantum = subtag("maincpu");
tc0040ioc_device &tc0040ioc(TC0040IOC(config, "tc0040ioc", 0));
tc0040ioc.read_0_callback().set_ioport("DSWA");
@@ -1588,8 +1583,7 @@ MACHINE_CONFIG_START(taitol_2cpu_state::raimais)
tc0140syt_device &tc0140syt(TC0140SYT(config, "tc0140syt", 0));
tc0140syt.set_master_tag("slave");
tc0140syt.set_slave_tag(m_audio_cpu);
-MACHINE_CONFIG_END
-
+}
void taitol_2cpu_state::kurikint(machine_config &config)
{
@@ -1697,7 +1691,7 @@ void horshoes_state::horshoes(machine_config &config)
UPD4701A(config, m_upd4701, 0);
m_upd4701->set_portx_tag("AN0");
- m_upd4701->set_portx_tag("AN1");
+ m_upd4701->set_porty_tag("AN1");
}
@@ -1734,18 +1728,18 @@ void taitol_1cpu_state::cachat(machine_config &config)
m_ymsnd->port_b_read_callback().set_ioport("DSWB");
}
-MACHINE_CONFIG_START(taitol_2cpu_state::evilston)
-
+void taitol_2cpu_state::evilston(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, XTAL(13'330'560)/2) /* not verified */
- MCFG_DEVICE_PROGRAM_MAP(evilston_map)
- MCFG_DEVICE_IRQ_ACKNOWLEDGE_DRIVER(taitol_state, irq_callback)
+ Z80(config, m_main_cpu, XTAL(13'330'560)/2); /* not verified */
+ m_main_cpu->set_addrmap(AS_PROGRAM, &taitol_2cpu_state::evilston_map);
+ m_main_cpu->set_irq_acknowledge_callback(FUNC(taitol_state::irq_callback));
- MCFG_DEVICE_ADD("audiocpu", Z80, 12_MHz_XTAL/3) /* not verified */
- MCFG_DEVICE_PROGRAM_MAP(evilston_2_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", taitol_state, irq0_line_hold)
+ Z80(config, m_audio_cpu, 12_MHz_XTAL/3); /* not verified */
+ m_audio_cpu->set_addrmap(AS_PROGRAM, &taitol_2cpu_state::evilston_2_map);
+ m_audio_cpu->set_vblank_int("screen", FUNC(taitol_state::irq0_line_hold));
- MCFG_QUANTUM_TIME(attotime::from_hz(6000))
+ config.m_minimum_quantum = attotime::from_hz(6000);
tc0510nio_device &tc0510nio(TC0510NIO(config, "tc0510nio", 0));
tc0510nio.read_0_callback().set_ioport("DSWA");
@@ -1772,7 +1766,7 @@ MACHINE_CONFIG_START(taitol_2cpu_state::evilston)
ymsnd.add_route(1, "mono", 0.25);
ymsnd.add_route(2, "mono", 0.25);
ymsnd.add_route(3, "mono", 0.80);
-MACHINE_CONFIG_END
+}
ROM_START( raimais )
diff --git a/src/mame/drivers/taito_o.cpp b/src/mame/drivers/taito_o.cpp
index 06f1a166ba3..c43880d7313 100644
--- a/src/mame/drivers/taito_o.cpp
+++ b/src/mame/drivers/taito_o.cpp
@@ -233,21 +233,21 @@ void taitoo_state::machine_start()
{
}
-MACHINE_CONFIG_START(taitoo_state::parentj)
-
- MCFG_DEVICE_ADD("maincpu", M68000,12000000 ) /*?? MHz */
- MCFG_DEVICE_PROGRAM_MAP(parentj_map)
- MCFG_TIMER_DRIVER_ADD_SCANLINE("scantimer", taitoo_state, parentj_interrupt, "screen", 0, 1)
+void taitoo_state::parentj(machine_config &config)
+{
+ M68000(config, m_maincpu, 12000000); /*?? MHz */
+ m_maincpu->set_addrmap(AS_PROGRAM, &taitoo_state::parentj_map);
+ TIMER(config, "scantimer").configure_scanline(FUNC(taitoo_state::parentj_interrupt), "screen", 0, 1);
WATCHDOG_TIMER(config, m_watchdog);
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(64*16, 64*16)
- MCFG_SCREEN_VISIBLE_AREA(0*16, 32*16-1, 3*16, 31*16-1)
- MCFG_SCREEN_UPDATE_DRIVER(taitoo_state, screen_update_parentj)
- MCFG_SCREEN_PALETTE(m_palette)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(64*16, 64*16);
+ screen.set_visarea(0*16, 32*16-1, 3*16, 31*16-1);
+ screen.set_screen_update(FUNC(taitoo_state::screen_update_parentj));
+ screen.set_palette(m_palette);
GFXDECODE(config, m_gfxdecode, m_palette, gfx_parentj);
PALETTE(config, m_palette).set_format(palette_device::xBGR_555, 33*16);
@@ -265,7 +265,7 @@ MACHINE_CONFIG_START(taitoo_state::parentj)
ymsnd.port_a_read_callback().set_ioport("DSWA");
ymsnd.port_b_read_callback().set_ioport("DSWB");
ymsnd.add_route(ALL_OUTPUTS, "mono", 1.0);
-MACHINE_CONFIG_END
+}
ROM_START( parentj )
ROM_REGION( 0x20000, "maincpu", 0 ) /* 68000 Code */
diff --git a/src/mame/drivers/taito_z.cpp b/src/mame/drivers/taito_z.cpp
index 95b46bf9623..212b127169d 100644
--- a/src/mame/drivers/taito_z.cpp
+++ b/src/mame/drivers/taito_z.cpp
@@ -2920,7 +2920,7 @@ static INPUT_PORTS_START( spacegnu )
TAITO_COINAGE_US_LOC(SW A)
INPUT_PORTS_END
-static INPUT_PORTS_START( dblaxle )
+static INPUT_PORTS_START( dblaxle ) // Side by Side linkable versions
PORT_START("DSWA")
PORT_DIPUNUSED_DIPLOC( 0x01, 0x01, "SW A:1" )
PORT_DIPNAME( 0x02, 0x02, "Gear shift" ) PORT_DIPLOCATION("SW A:2")
@@ -2974,6 +2974,35 @@ static INPUT_PORTS_START( dblaxle )
PORT_BIT( 0xff, 0x80, IPT_PADDLE ) PORT_MINMAX(0x40, 0xc0) PORT_SENSITIVITY(100) PORT_KEYDELTA(4) PORT_NAME("Steering Wheel")
INPUT_PORTS_END
+static INPUT_PORTS_START( dblaxles ) // Single player versions
+ PORT_INCLUDE(dblaxle)
+
+ PORT_MODIFY("DSWA")
+ PORT_DIPNAME( 0x01, 0x01, "Handle Pulse" ) PORT_DIPLOCATION("SW A:1")
+ PORT_DIPSETTING( 0x01, DEF_STR( Normal ) )
+ PORT_DIPSETTING( 0x00, "Fast" )
+
+ PORT_MODIFY("DSWB")
+ PORT_DIPNAME( 0x04, 0x00, "Back Gear" ) PORT_DIPLOCATION("SW B:3") // If set to NORMAL you need to keep REVERSE pressed to go forward
+ PORT_DIPSETTING( 0x04, DEF_STR( Normal ) )
+ PORT_DIPSETTING( 0x00, "No Back Gear" )
+ PORT_DIPNAME( 0x08, 0x08, "Vibration Mode" ) PORT_DIPLOCATION("SW B:4")
+ PORT_DIPSETTING( 0x08, "Partial Vibration" )
+ PORT_DIPSETTING( 0x00, "All The Time Vibration" )
+ PORT_DIPNAME( 0x10, 0x10, "Steering Wheel Vibration" ) PORT_DIPLOCATION("SW B:5")
+ PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x10, DEF_STR( On ) )
+ PORT_DIPNAME( 0x20, 0x20, "Select Round" ) PORT_DIPLOCATION("SW B:6")
+ PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x20, DEF_STR( On ) )
+ PORT_DIPNAME( 0x40, 0x40, DEF_STR( Allow_Continue ) ) PORT_DIPLOCATION("SW B:7")
+ PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x40, DEF_STR( On ) )
+ PORT_DIPNAME( 0x80, 0x00, "Buy-In" ) PORT_DIPLOCATION("SW B:8") // manual states "In countries except North America this setting should be ON"
+ PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x80, DEF_STR( On ) ) // You buy truck upgrades like Big Tires, Engine and Nitro canisters before the race
+INPUT_PORTS_END
+
static INPUT_PORTS_START( pwheelsj )
PORT_INCLUDE(dblaxle)
@@ -3870,7 +3899,7 @@ void taitoz_state::racingb(machine_config &config)
MCFG_MACHINE_START_OVERRIDE(taitoz_state,taitoz)
MCFG_MACHINE_RESET_OVERRIDE(taitoz_state,taitoz)
- MCFG_QUANTUM_TIME(attotime::from_hz(600))
+ config.m_minimum_quantum = attotime::from_hz(600);
TC0510NIO(config, m_tc0510nio, 0);
m_tc0510nio->read_0_callback().set_ioport("DSWA");
@@ -5334,7 +5363,7 @@ ROM_START( spacegunj )
ROM_LOAD( "pal16r4-c57-14.96", 0x0a00, 0x0104, CRC(75e1bf61) SHA1(e8358329a78ec0ab87641b2ecaec0b2b67c6ca30) )
ROM_END
-ROM_START( dblaxle )
+ROM_START( dblaxle ) /* Manual refers to this version as the "Version Without Communication" */
ROM_REGION( 0x80000, "maincpu", 0 ) /* 512K for 68000 code (CPU A) */
ROM_LOAD16_BYTE( "c78_49-1.2", 0x00000, 0x20000, CRC(a6f0c631) SHA1(371cb7807d2350ceca36fc0fb6a65d3179c011b0) )
ROM_LOAD16_BYTE( "c78_51-1.4", 0x00001, 0x20000, CRC(ef24e83b) SHA1(a0bc1d2192bccfcb6f859aa0a27f43cc92080e1e) )
@@ -5381,7 +5410,54 @@ ROM_START( dblaxle )
ROM_LOAD( "c84-11.17", 0x00000, 0x00400, CRC(10728853) SHA1(45d7cc8e06fbe01295cc2194bca9586f0ef8b12b) )
ROM_END
-ROM_START( dblaxleu )
+ROM_START( dblaxleu ) /* Manual refers to this version as the "Version Without Communication" */
+ ROM_REGION( 0x80000, "maincpu", 0 ) /* 512K for 68000 code (CPU A) */
+ ROM_LOAD16_BYTE( "c78_49+.2", 0x00000, 0x20000, CRC(3bb0344a) SHA1(dad031033838bf65c83fb3715a9727f2d165909b) ) /* Actual label is C78 49* */
+ ROM_LOAD16_BYTE( "c78_51+.4", 0x00001, 0x20000, CRC(918176cb) SHA1(b78bce351e240b447fbb9a1f44c8efa3e6b98cbe) ) /* Actual label is C78 51* */
+ ROM_LOAD16_BYTE( "c78_50+.3", 0x40000, 0x20000, CRC(5a12e2bb) SHA1(53a91cc8fcf42934aa282f5a1bb286461dc2a421) ) /* Actual label is C78 50* */
+ ROM_LOAD16_BYTE( "c78_53+.5", 0x40001, 0x20000, CRC(62f910d4) SHA1(3d952ffcb30a264751b4b282ae8c26ecea09c05c) ) /* Actual label is C78 53* */
+
+ ROM_REGION( 0x40000, "sub", 0 ) /* 256K for 68000 code (CPU B) */
+ ROM_LOAD16_BYTE( "c78-30+.35", 0x00000, 0x20000, CRC(f73b3ce1) SHA1(1794d1c74599d58302c6dbfabcc1b3110d19b1fb) ) /* Label missing, it's either C78 30 or C78 30* */
+ ROM_LOAD16_BYTE( "c78-31+.36", 0x00001, 0x20000, CRC(4639adee) SHA1(24569dd4801c622758e60d3e526480ac6b5f85d2) ) /* Label missing, it's either C78 31 or C78 31* */
+
+ ROM_REGION( 0x20000, "audiocpu", 0 ) /* sound cpu */
+ ROM_LOAD ( "c78-34.c42", 0x00000, 0x20000, CRC(f2186943) SHA1(2e9aed39fddf3aa1db7e20f8a709b6b82cc3e7df) )
+
+ ROM_REGION( 0x100000, "gfx1", 0 )
+ ROM_LOAD16_BYTE( "c78-10.12", 0x00000, 0x80000, CRC(44b1897c) SHA1(7ad179db6d7dfeb139ea13cb4a231f99d177f2b1) ) /* SCR 8x8 */
+ ROM_LOAD16_BYTE( "c78-11.11", 0x00001, 0x80000, CRC(7db3d4a3) SHA1(fc3c44ed36b212688a5bd8dc61321a994578258e) )
+
+ ROM_REGION( 0x400000, "gfx2", 0 )
+ ROM_LOAD32_BYTE( "c78-08.25", 0x000000, 0x100000, CRC(6c725211) SHA1(3c1765f44fe57b496d305e994516674f71bd4c3c) ) /* OBJ 16x8 */
+ ROM_LOAD32_BYTE( "c78-07.33", 0x000001, 0x100000, CRC(9da00d5b) SHA1(f6b664c7495b936ce1b99852da45ec92cb37062a) )
+ ROM_LOAD32_BYTE( "c78-06.23", 0x000002, 0x100000, CRC(8309e91b) SHA1(3f27557bc82bf42cc77e3c7e363b51a0b119144d) )
+ ROM_LOAD32_BYTE( "c78-05.31", 0x000003, 0x100000, CRC(90001f68) SHA1(5c08dfe6a2e12e6ca84035815563f38fc2c2c029) )
+// ROMX_LOAD ( "c78-05l.1", 0x000003, 0x080000, CRC(f24bf972) , ROM_SKIP(7) )
+// ROMX_LOAD ( "c78-05h.2", 0x000007, 0x080000, CRC(c01039b5) , ROM_SKIP(7) )
+
+ ROM_REGION16_LE( 0x80000, "tc0150rod", 0 )
+ ROM_LOAD16_WORD( "c78-09.12", 0x000000, 0x80000, CRC(0dbde6f5) SHA1(4049271e3738b54e0c56d191889b1aea5664d49f) ) /* ROD, road lines */
+
+ ROM_REGION16_LE( 0x80000, "user1", 0 )
+ ROM_LOAD16_WORD( "c78-04.3", 0x00000, 0x80000, CRC(cc1aa37c) SHA1(cfa2eb338dc81c98c637c2f0b14d2baea8b115f5) ) /* STY spritemap */
+
+ ROM_REGION( 0x180000, "ymsnd", 0 ) /* ADPCM samples */
+ ROM_LOAD( "c78-12.33", 0x000000, 0x100000, CRC(b0267404) SHA1(ffd337336ff9b096e3725f733364762f6e6d3fab) )
+ ROM_LOAD( "c78-13.46", 0x100000, 0x080000, CRC(1b363aa2) SHA1(0aae3988024654e98cc0c784307b1c329c8f0783) )
+
+ ROM_REGION( 0x80000, "ymsnd.deltat", 0 ) /* Delta-T samples */
+ ROM_LOAD( "c78-14.31", 0x00000, 0x80000, CRC(9cad4dfb) SHA1(9187ef827a3f1bc9233d0e45e72c72c0956c5912) )
+
+ ROM_REGION( 0x10000, "user2", 0 ) /* unused ROMs */
+ ROM_LOAD( "c78-25.15", 0x00000, 0x10000, CRC(7245a6f6) SHA1(5bdde4e3bcde8c59dc84478c3cc079d7ef8ee9c5) ) // 98% compression
+ ROM_LOAD( "c78-15.22", 0x00000, 0x00100, CRC(fbf81f30) SHA1(c868452c334792345dcced075f6df69cff9e31ca) ) // road A/B internal priority
+ ROM_LOAD( "c78-21.74", 0x00000, 0x00100, CRC(2926bf27) SHA1(bfbbe6c71bb29a05959f3de0d940816139f9ebfe) ) // road/sprite priority and palette select
+ ROM_LOAD( "c84-10.16", 0x00000, 0x00400, CRC(643e8bfc) SHA1(a6e6086fb8fbd102e01ec72fe60a4232f5909565) )
+ ROM_LOAD( "c84-11.17", 0x00000, 0x00400, CRC(10728853) SHA1(45d7cc8e06fbe01295cc2194bca9586f0ef8b12b) )
+ROM_END
+
+ROM_START( dblaxleul ) /* Side by side linkable version */
ROM_REGION( 0x80000, "maincpu", 0 ) /* 512K for 68000 code (CPU A) */
ROM_LOAD16_BYTE( "c78_41-1.2", 0x00000, 0x20000, CRC(cf297fe4) SHA1(4875de63e8336062c27d83b55938bcb3d08a24a3) )
ROM_LOAD16_BYTE( "c78_43-1.4", 0x00001, 0x20000, CRC(38a8bad6) SHA1(50977a6a364893549d2f7899bbc4e0c67086697e) )
@@ -5428,7 +5504,7 @@ ROM_START( dblaxleu )
ROM_LOAD( "c84-11.17", 0x00000, 0x00400, CRC(10728853) SHA1(45d7cc8e06fbe01295cc2194bca9586f0ef8b12b) )
ROM_END
-ROM_START( pwheelsj )
+ROM_START( pwheelsj ) /* Side by side linkable version */
ROM_REGION( 0x80000, "maincpu", 0 ) /* 512K for 68000 code (CPU A) */
ROM_LOAD16_BYTE( "c78_26-2.2", 0x00000, 0x20000, CRC(25c8eb2e) SHA1(a526b886c76a19c9ce1abc25cf433574564605a3) )
ROM_LOAD16_BYTE( "c78_28-2.4", 0x00001, 0x20000, CRC(a9500eb1) SHA1(ad300add3439515512003703df46e2f9317f2ee8) )
@@ -5617,9 +5693,10 @@ GAME( 1990, spacegun, 0, spacegun, spacegun, taitoz_state, init_bshar
GAME( 1990, spacegunj, spacegun, spacegun, spacegnj, taitoz_state, init_bshark, ORIENTATION_FLIP_X, "Taito Corporation", "Space Gun (Japan)", MACHINE_SUPPORTS_SAVE )
GAME( 1990, spacegunu, spacegun, spacegun, spacegnu, taitoz_state, init_bshark, ORIENTATION_FLIP_X, "Taito America Corporation", "Space Gun (US)", MACHINE_SUPPORTS_SAVE )
-GAMEL(1991, dblaxle, 0, dblaxle, dblaxle, taitoz_state, init_taitoz, ROT0, "Taito America Corporation", "Double Axle (US)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE, layout_dblaxle )
-GAMEL(1991, dblaxleu, dblaxle, dblaxle, dblaxle, taitoz_state, init_taitoz, ROT0, "Taito America Corporation", "Double Axle (US, earlier)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE, layout_dblaxle )
-GAMEL(1991, pwheelsj, dblaxle, dblaxle, pwheelsj, taitoz_state, init_taitoz, ROT0, "Taito Corporation", "Power Wheels (Japan)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE, layout_dblaxle )
+GAMEL(1991, dblaxle, 0, dblaxle, dblaxles, taitoz_state, init_taitoz, ROT0, "Taito America Corporation", "Double Axle (US, Rev 1)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE, layout_dblaxle )
+GAMEL(1991, dblaxleu, dblaxle, dblaxle, dblaxles, taitoz_state, init_taitoz, ROT0, "Taito America Corporation", "Double Axle (US)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE, layout_dblaxle )
+GAMEL(1991, dblaxleul, dblaxle, dblaxle, dblaxle, taitoz_state, init_taitoz, ROT0, "Taito America Corporation", "Double Axle (US, Rev 1, Linkable)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE, layout_dblaxle )
+GAMEL(1991, pwheelsj, dblaxle, dblaxle, pwheelsj, taitoz_state, init_taitoz, ROT0, "Taito Corporation", "Power Wheels (Japan, Rev 2, Linkable)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE, layout_dblaxle )
GAMEL(1991, racingb, 0, racingb, racingb, taitoz_state, init_taitoz, ROT0, "Taito Corporation Japan", "Racing Beat (World)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE, layout_dblaxle )
GAMEL(1991, racingbj, racingb, racingb, racingb, taitoz_state, init_taitoz, ROT0, "Taito Corporation", "Racing Beat (Japan)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE, layout_dblaxle )
diff --git a/src/mame/drivers/taitoair.cpp b/src/mame/drivers/taitoair.cpp
index 0b64bb3e9f2..0ec2eb8e635 100644
--- a/src/mame/drivers/taitoair.cpp
+++ b/src/mame/drivers/taitoair.cpp
@@ -704,11 +704,11 @@ void taitoair_state::machine_reset()
void taitoair_state::airsys(machine_config &config)
{
/* basic machine hardware */
- M68000(config, m_maincpu, XTAL(12'000'000)); // MC68000P12
+ M68000(config, m_maincpu, XTAL(12'000'000)); // MC68000P12
m_maincpu->set_addrmap(AS_PROGRAM, &taitoair_state::airsys_map);
m_maincpu->set_vblank_int("screen", FUNC(taitoair_state::irq5_line_hold));
- Z80(config, m_audiocpu, XTAL(16'000'000) / 4); // Z8400AB1
+ Z80(config, m_audiocpu, XTAL(16'000'000) / 4); // Z8400AB1
m_audiocpu->set_addrmap(AS_PROGRAM, &taitoair_state::sound_map);
TMS32025(config, m_dsp, XTAL(36'000'000)); // Unverified
diff --git a/src/mame/drivers/taitogn.cpp b/src/mame/drivers/taitogn.cpp
index 02a63da92ff..00aee424ec8 100644
--- a/src/mame/drivers/taitogn.cpp
+++ b/src/mame/drivers/taitogn.cpp
@@ -460,10 +460,10 @@ WRITE8_MEMBER(taitogn_state::control_w)
m_zoom->reset();
// assume that this also readys the sound flash chips
- m_pgmflash->write(space, 0, 0xff);
- m_sndflash[0]->write(space, 0, 0xff);
- m_sndflash[1]->write(space, 0, 0xff);
- m_sndflash[2]->write(space, 0, 0xff);
+ m_pgmflash->write(0, 0xff);
+ m_sndflash[0]->write(0, 0xff);
+ m_sndflash[1]->write(0, 0xff);
+ m_sndflash[2]->write(0, 0xff);
}
}
@@ -595,7 +595,7 @@ READ32_MEMBER(taitogn_state::zsg2_ext_r)
{
case 0x000000:
case 0x100000:
- case 0x200000: return m_sndflash[offset >> 20]->read(space, offset & 0xfffff) | m_sndflash[offset >> 20]->read(space, (offset & 0xfffff) | 1) << 16;
+ case 0x200000: return m_sndflash[offset >> 20]->read(offset & 0xfffff) | m_sndflash[offset >> 20]->read((offset & 0xfffff) | 1) << 16;
default:
break;
diff --git a/src/mame/drivers/taitosj.cpp b/src/mame/drivers/taitosj.cpp
index 41345a67756..e34022abd85 100644
--- a/src/mame/drivers/taitosj.cpp
+++ b/src/mame/drivers/taitosj.cpp
@@ -1770,43 +1770,41 @@ WRITE8_MEMBER(taitosj_state::taitosj_dacvol_w)
m_dacvol->write(NODE_01, data ^ 0xff); // 7416 hex inverter
}
-MACHINE_CONFIG_START(taitosj_state::nomcu)
-
+void taitosj_state::nomcu(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu",Z80,XTAL(8'000'000)/2) /* 8 MHz / 2, on CPU board */
- MCFG_DEVICE_PROGRAM_MAP(taitosj_main_nomcu_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", taitosj_state, irq0_line_hold)
+ Z80(config, m_maincpu, XTAL(8'000'000)/2); /* 8 MHz / 2, on CPU board */
+ m_maincpu->set_addrmap(AS_PROGRAM, &taitosj_state::taitosj_main_nomcu_map);
+ m_maincpu->set_vblank_int("screen", FUNC(taitosj_state::irq0_line_hold));
- MCFG_DEVICE_ADD("audiocpu", Z80,XTAL(6'000'000)/2) /* 6 MHz / 2, on GAME board */
- MCFG_DEVICE_PROGRAM_MAP(taitosj_audio_map)
+ Z80(config, m_audiocpu, XTAL(6'000'000)/2); /* 6 MHz / 2, on GAME board */
+ m_audiocpu->set_addrmap(AS_PROGRAM, &taitosj_state::taitosj_audio_map);
/* interrupts: */
/* - no interrupts synced with vblank */
/* - NMI triggered by the main CPU */
/* - periodic IRQ, with frequency 6000000/(4*16*16*10*16) = 36.621 Hz, */
- MCFG_DEVICE_PERIODIC_INT_DRIVER(taitosj_state, irq0_line_hold, XTAL(6'000'000)/(4*16*16*10*16))
+ m_audiocpu->set_periodic_int(FUNC(taitosj_state::irq0_line_hold), attotime::from_hz(XTAL(6'000'000)/(4*16*16*10*16)));
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */)
- MCFG_SCREEN_SIZE(32*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(taitosj_state, screen_update_taitosj)
- MCFG_SCREEN_PALETTE("palette")
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_refresh_hz(60);
+ m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(2500) /* not accurate */);
+ m_screen->set_size(32*8, 32*8);
+ m_screen->set_visarea(0*8, 32*8-1, 2*8, 30*8-1);
+ m_screen->set_screen_update(FUNC(taitosj_state::screen_update_taitosj));
+ m_screen->set_palette(m_palette);
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_taitosj)
- MCFG_PALETTE_ADD("palette", 64)
+ GFXDECODE(config, m_gfxdecode, m_palette, gfx_taitosj);
+ PALETTE(config, m_palette).set_entries(64);
/* sound hardware */
SPEAKER(config, "speaker").front_center();
- MCFG_INPUT_MERGER_ALL_HIGH("soundnmi")
- MCFG_INPUT_MERGER_OUTPUT_HANDLER(WRITELINE("soundnmi2", input_merger_device, in_w<0>))
+ INPUT_MERGER_ALL_HIGH(config, m_soundnmi).output_handler().set(m_soundnmi2, FUNC(input_merger_device::in_w<0>));
- MCFG_INPUT_MERGER_ANY_HIGH("soundnmi2")
- MCFG_INPUT_MERGER_OUTPUT_HANDLER(INPUTLINE("audiocpu", INPUT_LINE_NMI))
+ INPUT_MERGER_ANY_HIGH(config, m_soundnmi2).output_handler().set_inputline(m_audiocpu, INPUT_LINE_NMI);
AY8910(config, m_ay1, XTAL(6'000'000)/4); // 6mhz/4 on GAME board, AY-3-8910 @ IC53 (this is the only AY which uses proper mixing resistors, the 3 below have outputs tied together)
m_ay1->port_a_read_callback().set_ioport("DSW2");
@@ -1837,19 +1835,20 @@ MACHINE_CONFIG_START(taitosj_state::nomcu)
WATCHDOG_TIMER(config, "watchdog").set_vblank_count("screen", 128); // 74LS393 on CPU board, counts 128 vblanks before firing watchdog
- MCFG_DEVICE_ADD("dac", DAC_8BIT_R2R, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 0.15) // 30k r-2r network
- MCFG_DEVICE_ADD("dacvol", DISCRETE, taitosj_dacvol_discrete)
- MCFG_SOUND_ROUTE(0, "dac", 1.0, DAC_VREF_POS_INPUT) MCFG_SOUND_ROUTE(0, "dac", -1.0, DAC_VREF_NEG_INPUT)
-MACHINE_CONFIG_END
+ DAC_8BIT_R2R(config, m_dac, 0).add_route(ALL_OUTPUTS, "speaker", 0.15); // 30k r-2r network
+ DISCRETE(config, m_dacvol, taitosj_dacvol_discrete);
+ m_dacvol->add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT);
+ m_dacvol->add_route(0, "dac", -1.0, DAC_VREF_NEG_INPUT);
+}
/* same as above, but with additional 68705 MCU */
-MACHINE_CONFIG_START(taitosj_state::mcu)
+void taitosj_state::mcu(machine_config &config)
+{
nomcu(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(taitosj_main_mcu_map)
+ m_maincpu->set_addrmap(AS_PROGRAM, &taitosj_state::taitosj_main_mcu_map);
TAITO_SJ_SECURITY_MCU(config, m_mcu, XTAL(3'000'000)); /* xtal is 3MHz, divided by 4 internally */
m_mcu->set_int_mode(taito_sj_security_mcu_device::int_mode::LATCH);
@@ -1858,20 +1857,19 @@ MACHINE_CONFIG_START(taitosj_state::mcu)
m_mcu->m68intrq_cb().set(FUNC(taitosj_state::mcu_intrq_w));
m_mcu->busrq_cb().set(FUNC(taitosj_state::mcu_busrq_w));
- MCFG_QUANTUM_TIME(attotime::from_hz(6000))
-MACHINE_CONFIG_END
+ config.m_minimum_quantum = attotime::from_hz(6000);
+}
-MACHINE_CONFIG_START(taitosj_state::kikstart)
+void taitosj_state::kikstart(machine_config &config)
+{
mcu(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(kikstart_main_map)
+ m_maincpu->set_addrmap(AS_PROGRAM, &taitosj_state::kikstart_main_map);
- MCFG_SCREEN_MODIFY("screen")
- MCFG_SCREEN_UPDATE_DRIVER(taitosj_state, screen_update_kikstart)
-MACHINE_CONFIG_END
+ m_screen->set_screen_update(FUNC(taitosj_state::screen_update_kikstart));
+}
diff --git a/src/mame/drivers/taitottl.cpp b/src/mame/drivers/taitottl.cpp
index 37fdc944bb8..809242a9338 100644
--- a/src/mame/drivers/taitottl.cpp
+++ b/src/mame/drivers/taitottl.cpp
@@ -136,20 +136,21 @@ void taitottl_state::video_start()
{
}
-MACHINE_CONFIG_START(taitottl_state::taitottl)
-
+void taitottl_state::taitottl(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", NETLIST_CPU, NETLIST_CLOCK)
- MCFG_NETLIST_SETUP(taitottl)
+ NETLIST_CPU(config, m_maincpu, NETLIST_CLOCK);
+ m_maincpu->set_constructor(netlist_taitottl);
/* video hardware */
- MCFG_FIXFREQ_ADD("fixfreq", "screen")
- MCFG_FIXFREQ_MONITOR_CLOCK(MASTER_CLOCK)
- MCFG_FIXFREQ_HORZ_PARAMS(H_TOTAL-67,H_TOTAL-40,H_TOTAL-8,H_TOTAL)
- MCFG_FIXFREQ_VERT_PARAMS(V_TOTAL-22,V_TOTAL-19,V_TOTAL-12,V_TOTAL)
- MCFG_FIXFREQ_FIELDCOUNT(1)
- MCFG_FIXFREQ_SYNC_THRESHOLD(0.30)
-MACHINE_CONFIG_END
+ SCREEN(config, "screen", SCREEN_TYPE_RASTER);
+ FIXFREQ(config, m_video).set_screen("screen");
+ m_video->set_monitor_clock(MASTER_CLOCK);
+ m_video->set_horz_params(H_TOTAL-67,H_TOTAL-40,H_TOTAL-8,H_TOTAL);
+ m_video->set_vert_params(V_TOTAL-22,V_TOTAL-19,V_TOTAL-12,V_TOTAL);
+ m_video->set_fieldcount(1);
+ m_video->set_threshold(0.30);
+}
/***************************************************************************
diff --git a/src/mame/drivers/taitotx.cpp b/src/mame/drivers/taitotx.cpp
index 83e5169e335..f12ad04a2fb 100644
--- a/src/mame/drivers/taitotx.cpp
+++ b/src/mame/drivers/taitotx.cpp
@@ -172,23 +172,22 @@ void taito_type_x_state::machine_reset()
}
// todo: different configs for the different machine types.
-MACHINE_CONFIG_START(taito_type_x_state::taito_type_x)
-
+void taito_type_x_state::taito_type_x(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", PENTIUM3, 733333333) /* Wrong, much newer processors, much faster. */
- MCFG_DEVICE_PROGRAM_MAP(taito_type_x_map)
+ PENTIUM3(config, m_maincpu, 733333333); /* Wrong, much newer processors, much faster. */
+ m_maincpu->set_addrmap(AS_PROGRAM, &taito_type_x_state::taito_type_x_map);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(640, 480)
- MCFG_SCREEN_VISIBLE_AREA(0, 640-1, 0, 480-1)
- MCFG_SCREEN_UPDATE_DRIVER(taito_type_x_state, screen_update_taito_type_x)
-
- MCFG_PALETTE_ADD("palette", 0x10000)
-
-MACHINE_CONFIG_END
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(640, 480);
+ screen.set_visarea(0, 640-1, 0, 480-1);
+ screen.set_screen_update(FUNC(taito_type_x_state::screen_update_taito_type_x));
+
+ PALETTE(config, "palette").set_entries(0x10000);
+}
diff --git a/src/mame/drivers/taitowlf.cpp b/src/mame/drivers/taitowlf.cpp
index 0fa7d7b05f7..71ff3629d2e 100644
--- a/src/mame/drivers/taitowlf.cpp
+++ b/src/mame/drivers/taitowlf.cpp
@@ -372,10 +372,10 @@ void taitowlf_state::taitowlf_palette(palette_device &palette) const
MACHINE_CONFIG_START(taitowlf_state::taitowlf)
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", PENTIUM, 200000000)
- MCFG_DEVICE_PROGRAM_MAP(taitowlf_map)
- MCFG_DEVICE_IO_MAP(taitowlf_io)
- MCFG_DEVICE_IRQ_ACKNOWLEDGE_DEVICE("pic8259_1", pic8259_device, inta_cb)
+ PENTIUM(config, m_maincpu, 200000000);
+ m_maincpu->set_addrmap(AS_PROGRAM, &taitowlf_state::taitowlf_map);
+ m_maincpu->set_addrmap(AS_IO, &taitowlf_state::taitowlf_io);
+ m_maincpu->set_irq_acknowledge_callback("pic8259_1", FUNC(pic8259_device::inta_cb));
MCFG_PCI_BUS_LEGACY_ADD("pcibus", 0)
@@ -389,12 +389,12 @@ MACHINE_CONFIG_START(taitowlf_state::taitowlf)
pcvideo_vga(config);
#else
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(512, 256)
- MCFG_SCREEN_VISIBLE_AREA(0, 512-1, 0, 256-1)
- MCFG_SCREEN_UPDATE_DRIVER(taitowlf_state, screen_update_taitowlf)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(512, 256);
+ screen.set_visarea(0, 512-1, 0, 256-1);
+ screen.set_screen_update(FUNC(taitowlf_state::screen_update_taitowlf));
PALETTE(config, m_palette, FUNC(taitowlf_state::taitowlf_palette), 256);
#endif
MACHINE_CONFIG_END
diff --git a/src/mame/drivers/tamag1.cpp b/src/mame/drivers/tamag1.cpp
index 7268ab91784..b589354c0d2 100644
--- a/src/mame/drivers/tamag1.cpp
+++ b/src/mame/drivers/tamag1.cpp
@@ -121,9 +121,9 @@ INPUT_CHANGED_MEMBER(tamag1_state::input_changed)
static INPUT_PORTS_START( tama )
PORT_START("K0")
- PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_CHANGED_MEMBER(DEVICE_SELF, tamag1_state, input_changed, (void *)E0C6S46_LINE_K00)
- PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_CHANGED_MEMBER(DEVICE_SELF, tamag1_state, input_changed, (void *)E0C6S46_LINE_K01)
- PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_CHANGED_MEMBER(DEVICE_SELF, tamag1_state, input_changed, (void *)E0C6S46_LINE_K02)
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_CHANGED_MEMBER(DEVICE_SELF, tamag1_state, input_changed, E0C6S46_LINE_K00)
+ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_CHANGED_MEMBER(DEVICE_SELF, tamag1_state, input_changed, E0C6S46_LINE_K01)
+ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_CHANGED_MEMBER(DEVICE_SELF, tamag1_state, input_changed, E0C6S46_LINE_K02)
PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNUSED )
INPUT_PORTS_END
diff --git a/src/mame/drivers/tandy1t.cpp b/src/mame/drivers/tandy1t.cpp
index eb07e4b6e65..5b2e4e95f50 100644
--- a/src/mame/drivers/tandy1t.cpp
+++ b/src/mame/drivers/tandy1t.cpp
@@ -573,7 +573,7 @@ void tandy1000_state::tandy1000_io(address_map &map)
map(0x0000, 0x00ff).m(m_mb, FUNC(t1000_mb_device::map));
map(0x0060, 0x0063).rw(FUNC(tandy1000_state::tandy1000_pio_r), FUNC(tandy1000_state::tandy1000_pio_w));
map(0x00a0, 0x00a0).w(FUNC(tandy1000_state::nmi_vram_bank_w));
- map(0x00c0, 0x00c0).w("sn76496", FUNC(ncr8496_device::command_w));
+ map(0x00c0, 0x00c0).w("sn76496", FUNC(ncr8496_device::write));
map(0x0200, 0x0207).rw("pc_joy", FUNC(pc_joy_device::joy_port_r), FUNC(pc_joy_device::joy_port_w));
map(0x0378, 0x037f).rw(FUNC(tandy1000_state::pc_t1t_p37x_r), FUNC(tandy1000_state::pc_t1t_p37x_w));
map(0x03d0, 0x03df).r(m_video, FUNC(pcvideo_t1000_device::read)).w(m_video, FUNC(pcvideo_t1000_device::write));
@@ -600,7 +600,7 @@ void tandy1000_state::tandy1000_16_io(address_map &map)
map(0x0060, 0x0063).rw(FUNC(tandy1000_state::tandy1000_pio_r), FUNC(tandy1000_state::tandy1000_pio_w));
map(0x0065, 0x0065).w(FUNC(tandy1000_state::devctrl_w));
map(0x00a0, 0x00a0).r(FUNC(tandy1000_state::unk_r));
- map(0x00c0, 0x00c1).w("sn76496", FUNC(ncr8496_device::command_w));
+ map(0x00c0, 0x00c1).w("sn76496", FUNC(ncr8496_device::write));
map(0x0200, 0x0207).rw("pc_joy", FUNC(pc_joy_device::joy_port_r), FUNC(pc_joy_device::joy_port_w));
map(0x0378, 0x037f).rw(FUNC(tandy1000_state::pc_t1t_p37x_r), FUNC(tandy1000_state::pc_t1t_p37x_w));
map(0x03d0, 0x03df).r(m_video, FUNC(pcvideo_t1000_device::read)).w(m_video, FUNC(pcvideo_t1000_device::write));
@@ -658,78 +658,84 @@ static GFXDECODE_START( gfx_t1000 )
GFXDECODE_ENTRY( "gfx1", 0x0000, t1000_charlayout, 3, 1 )
GFXDECODE_END
-MACHINE_CONFIG_START(tandy1000_state::tandy1000_common)
- MCFG_DEVICE_ADD("mb", T1000_MOTHERBOARD, 0)
- downcast<t1000_mb_device &>(*device).set_cputag("maincpu");
+void tandy1000_state::tandy1000_common(machine_config &config)
+{
+ T1000_MOTHERBOARD(config, m_mb, 0);
+ m_mb->set_cputag("maincpu");
/* video hardware */
- MCFG_DEVICE_ADD("pcvideo_t1000", PCVIDEO_T1000, 0)
- MCFG_VIDEO_SET_SCREEN("pcvideo_t1000:screen")
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "pcvideo_t1000:palette", gfx_t1000)
+ PCVIDEO_T1000(config, m_video, 0);
+ m_video->set_screen("pcvideo_t1000:screen");
+ GFXDECODE(config, "gfxdecode", "pcvideo_t1000:palette", gfx_t1000);
/* sound hardware */
- MCFG_DEVICE_ADD("sn76496", NCR8496, XTAL(14'318'181)/4)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mb:mono", 0.80)
+ NCR8496(config, "sn76496", XTAL(14'318'181)/4).add_route(ALL_OUTPUTS, "mb:mono", 0.80);
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
- MCFG_DEVICE_ADD("isa_fdc", ISA8_SLOT, 0, "mb:isa", pc_isa8_cards, "fdc_xt", true) // FIXME: determine ISA bus clock
- MCFG_SLOT_OPTION_MACHINE_CONFIG("fdc_xt", cfg_fdc_35)
+ isa8_slot_device &isa_fdc(ISA8_SLOT(config, "isa_fdc", 0, "mb:isa", pc_isa8_cards, "fdc_xt", true)); // FIXME: determine ISA bus clock
+ isa_fdc.set_option_machine_config("fdc_xt", cfg_fdc_35);
- MCFG_DEVICE_ADD("isa_lpt", ISA8_SLOT, 0, "mb:isa", pc_isa8_cards, "lpt", true)
- MCFG_DEVICE_ADD("isa_com", ISA8_SLOT, 0, "mb:isa", pc_isa8_cards, "com", true)
+ ISA8_SLOT(config, "isa_lpt", 0, "mb:isa", pc_isa8_cards, "lpt", true);
+ ISA8_SLOT(config, "isa_com", 0, "mb:isa", pc_isa8_cards, "com", true);
PC_JOY(config, "pc_joy");
/* internal ram */
RAM(config, m_ram).set_default_size("640K");
- MCFG_SOFTWARE_LIST_ADD("disk_list","t1000")
- MCFG_SOFTWARE_LIST_COMPATIBLE_ADD("pc_list","ibm5150")
-MACHINE_CONFIG_END
+ SOFTWARE_LIST(config, "disk_list").set_original("t1000");
+ SOFTWARE_LIST(config, "pc_list").set_compatible("ibm5150");
+}
-MACHINE_CONFIG_START(tandy1000_state::tandy1000_90key)
- MCFG_PC_KEYB_ADD("pc_keyboard", WRITELINE("mb:pic8259", pic8259_device, ir1_w))
-MACHINE_CONFIG_END
+void tandy1000_state::tandy1000_90key(machine_config &config)
+{
+ PC_KEYB(config, m_keyboard);
+ m_keyboard->keypress().set("mb:pic8259", FUNC(pic8259_device::ir1_w));
+}
-MACHINE_CONFIG_START(tandy1000_state::tandy1000_101key)
- MCFG_AT_KEYB_ADD("pc_keyboard", 1, WRITELINE("mb:pic8259", pic8259_device, ir1_w))
-MACHINE_CONFIG_END
+void tandy1000_state::tandy1000_101key(machine_config &config)
+{
+ AT_KEYB(config, m_keyboard, pc_keyboard_device::KEYBOARD_TYPE::AT, 1);
+ m_keyboard->keypress().set("mb:pic8259", FUNC(pic8259_device::ir1_w));
+}
-MACHINE_CONFIG_START(tandy1000_state::t1000hx)
- MCFG_DEVICE_ADD("maincpu", I8088, 8000000)
- MCFG_DEVICE_PROGRAM_MAP(tandy1000_map)
- MCFG_DEVICE_IO_MAP(tandy1000_io)
- MCFG_DEVICE_IRQ_ACKNOWLEDGE_DEVICE("mb:pic8259", pic8259_device, inta_cb)
+void tandy1000_state::t1000hx(machine_config &config)
+{
+ I8088(config, m_maincpu, 8000000);
+ m_maincpu->set_addrmap(AS_PROGRAM, &tandy1000_state::tandy1000_map);
+ m_maincpu->set_addrmap(AS_IO, &tandy1000_state::tandy1000_io);
+ m_maincpu->set_irq_acknowledge_callback("mb:pic8259", FUNC(pic8259_device::inta_cb));
tandy1000_common(config);
tandy1000_90key(config);
// plus cards are isa with a nonstandard conntector
- MCFG_DEVICE_ADD("plus1", ISA8_SLOT, 0, "mb:isa", pc_isa8_cards, nullptr, false) // FIXME: determine ISA bus clock
+ ISA8_SLOT(config, "plus1", 0, "mb:isa", pc_isa8_cards, nullptr, false); // FIXME: determine ISA bus clock
m_ram->set_extra_options("256K, 384K");
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(tandy1000_state::t1000sx)
+void tandy1000_state::t1000sx(machine_config &config)
+{
t1000hx(config);
- MCFG_DEVICE_MODIFY("isa_fdc")
- MCFG_SLOT_OPTION_MACHINE_CONFIG("fdc_xt", cfg_fdc_525)
+ subdevice<isa8_slot_device>("isa_fdc")->set_option_machine_config("fdc_xt", cfg_fdc_525);
- MCFG_DEVICE_ADD("isa1", ISA8_SLOT, 0, "mb:isa", pc_isa8_cards, nullptr, false) // FIXME: determine ISA bus clock
- MCFG_DEVICE_ADD("isa2", ISA8_SLOT, 0, "mb:isa", pc_isa8_cards, nullptr, false)
- MCFG_DEVICE_ADD("isa3", ISA8_SLOT, 0, "mb:isa", pc_isa8_cards, nullptr, false)
- MCFG_DEVICE_ADD("isa4", ISA8_SLOT, 0, "mb:isa", pc_isa8_cards, nullptr, false)
+ ISA8_SLOT(config, "isa1", 0, "mb:isa", pc_isa8_cards, nullptr, false); // FIXME: determine ISA bus clock
+ ISA8_SLOT(config, "isa2", 0, "mb:isa", pc_isa8_cards, nullptr, false);
+ ISA8_SLOT(config, "isa3", 0, "mb:isa", pc_isa8_cards, nullptr, false);
+ ISA8_SLOT(config, "isa4", 0, "mb:isa", pc_isa8_cards, nullptr, false);
m_ram->set_extra_options("384K");
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(tandy1000_state::t1000rl)
- MCFG_DEVICE_ADD("maincpu", I8086, XTAL(28'636'363) / 3)
- MCFG_DEVICE_PROGRAM_MAP(tandy1000_bank_map)
- MCFG_DEVICE_IO_MAP(tandy1000_bank_io)
- MCFG_DEVICE_IRQ_ACKNOWLEDGE_DEVICE("mb:pic8259", pic8259_device, inta_cb)
+void tandy1000_state::t1000rl(machine_config &config)
+{
+ I8086(config, m_maincpu, XTAL(28'636'363) / 3);
+ m_maincpu->set_addrmap(AS_PROGRAM, &tandy1000_state::tandy1000_bank_map);
+ m_maincpu->set_addrmap(AS_IO, &tandy1000_state::tandy1000_bank_io);
+ m_maincpu->set_irq_acknowledge_callback("mb:pic8259", FUNC(pic8259_device::inta_cb));
tandy1000_common(config);
@@ -740,44 +746,45 @@ MACHINE_CONFIG_START(tandy1000_state::t1000rl)
MCFG_MACHINE_RESET_OVERRIDE(tandy1000_state,tandy1000rl)
m_ram->set_extra_options("384K");
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(tandy1000_state::t1000sl2)
+void tandy1000_state::t1000sl2(machine_config &config)
+{
t1000rl(config);
- MCFG_DEVICE_MODIFY( "maincpu" )
- MCFG_DEVICE_CLOCK( XTAL(24'000'000) / 3 )
+ m_maincpu->set_clock(XTAL(24'000'000) / 3);
- MCFG_DEVICE_ADD("isa1", ISA8_SLOT, 0, "mb:isa", pc_isa8_cards, nullptr, false) // FIXME: determine ISA bus clock
- MCFG_DEVICE_ADD("isa2", ISA8_SLOT, 0, "mb:isa", pc_isa8_cards, nullptr, false)
- MCFG_DEVICE_ADD("isa3", ISA8_SLOT, 0, "mb:isa", pc_isa8_cards, nullptr, false)
- MCFG_DEVICE_ADD("isa4", ISA8_SLOT, 0, "mb:isa", pc_isa8_cards, nullptr, false)
-MACHINE_CONFIG_END
+ ISA8_SLOT(config, "isa1", 0, "mb:isa", pc_isa8_cards, nullptr, false); // FIXME: determine ISA bus clock
+ ISA8_SLOT(config, "isa2", 0, "mb:isa", pc_isa8_cards, nullptr, false);
+ ISA8_SLOT(config, "isa3", 0, "mb:isa", pc_isa8_cards, nullptr, false);
+ ISA8_SLOT(config, "isa4", 0, "mb:isa", pc_isa8_cards, nullptr, false);
+}
-MACHINE_CONFIG_START(tandy1000_state::t1000tl)
- MCFG_DEVICE_ADD("maincpu", I80286, XTAL(28'636'363) / 2)
- MCFG_DEVICE_PROGRAM_MAP(tandy1000_286_map)
- MCFG_DEVICE_IO_MAP(tandy1000_16_io)
- MCFG_DEVICE_IRQ_ACKNOWLEDGE_DEVICE("mb:pic8259", pic8259_device, inta_cb)
+void tandy1000_state::t1000tl(machine_config &config)
+{
+ I80286(config, m_maincpu, XTAL(28'636'363) / 2);
+ m_maincpu->set_addrmap(AS_PROGRAM, &tandy1000_state::tandy1000_286_map);
+ m_maincpu->set_addrmap(AS_IO, &tandy1000_state::tandy1000_16_io);
+ m_maincpu->set_irq_acknowledge_callback("mb:pic8259", FUNC(pic8259_device::inta_cb));
tandy1000_common(config);
tandy1000_101key(config);
- MCFG_DEVICE_ADD("isa1", ISA8_SLOT, 0, "mb:isa", pc_isa8_cards, nullptr, false) // FIXME: determine ISA bus clock
- MCFG_DEVICE_ADD("isa2", ISA8_SLOT, 0, "mb:isa", pc_isa8_cards, nullptr, false)
- MCFG_DEVICE_ADD("isa3", ISA8_SLOT, 0, "mb:isa", pc_isa8_cards, nullptr, false)
- MCFG_DEVICE_ADD("isa4", ISA8_SLOT, 0, "mb:isa", pc_isa8_cards, nullptr, false)
- MCFG_DEVICE_ADD("isa5", ISA8_SLOT, 0, "mb:isa", pc_isa8_cards, nullptr, false)
-MACHINE_CONFIG_END
+ ISA8_SLOT(config, "isa1", 0, "mb:isa", pc_isa8_cards, nullptr, false); // FIXME: determine ISA bus clock
+ ISA8_SLOT(config, "isa2", 0, "mb:isa", pc_isa8_cards, nullptr, false);
+ ISA8_SLOT(config, "isa3", 0, "mb:isa", pc_isa8_cards, nullptr, false);
+ ISA8_SLOT(config, "isa4", 0, "mb:isa", pc_isa8_cards, nullptr, false);
+ ISA8_SLOT(config, "isa5", 0, "mb:isa", pc_isa8_cards, nullptr, false);
+}
-MACHINE_CONFIG_START(tandy1000_state::t1000tx)
+void tandy1000_state::t1000tx(machine_config &config)
+{
t1000tl(config);
- MCFG_DEVICE_MODIFY( "maincpu" )
- MCFG_DEVICE_IO_MAP(tandy1000tx_io)
+ m_maincpu->set_addrmap(AS_IO, &tandy1000_state::tandy1000tx_io);
- MCFG_DEVICE_REMOVE("pc_keyboard")
+ config.device_remove("pc_keyboard");
tandy1000_90key(config);
-MACHINE_CONFIG_END
+}
#ifdef UNUSED_DEFINITION
ROM_START( t1000 )
diff --git a/src/mame/drivers/tandy2k.cpp b/src/mame/drivers/tandy2k.cpp
index 8da3bf03738..0604b1f950e 100644
--- a/src/mame/drivers/tandy2k.cpp
+++ b/src/mame/drivers/tandy2k.cpp
@@ -14,11 +14,11 @@
- HDL is also connected to WP/TS input where TS is used to detect motor status
- 3 second motor off delay timer
- video (video RAM is at memory top - 0x1400, i.e. 0x1ec00)
- - keyboard ROM
- - hires graphics board
+ - keyboard ROM, same as earlier tandy 1000
- WD1010
- hard disk
- - mouse
+ - clock/mouse 8042 mcu ROM, probably same as tandy 1000 isa clock/mouse adapter
+ - sab3019 rtc
*/
@@ -213,33 +213,80 @@ READ8_MEMBER( tandy2k_state::kbint_clr_r )
m_kb->busy_w(1);
m_pic1->ir0_w(CLEAR_LINE);
- m_pc_keyboard->read(space, 0);
+ return m_pc_keyboard->read(space, 0);
}
return 0xff;
}
-READ16_MEMBER( tandy2k_state::vpac_r )
+READ8_MEMBER( tandy2k_state::clkmouse_r )
{
- if (ACCESSING_BITS_0_7)
+ uint8_t ret = 0;
+ switch (offset)
{
- return m_vpac->read(space, offset);
- }
- else
- {
- return 0xff00;
+ case 0:
+ if (!m_clkmouse_cnt)
+ return 0;
+ ret = m_clkmouse_cmd[--m_clkmouse_cnt];
+ m_pic1->ir2_w(0);
+ if (m_clkmouse_cnt > 0)
+ m_mcu_delay->adjust(attotime::from_msec(1));
+ break;
+ case 2:
+ ret = m_buttons->read();
+ if (m_clkmouse_cnt)
+ ret |= 1;
+ break;
}
+ return ret;
}
-WRITE16_MEMBER( tandy2k_state::vpac_w )
+WRITE8_MEMBER( tandy2k_state::clkmouse_w )
{
- if (ACCESSING_BITS_0_7)
+ switch (offset)
{
- m_vpac->write(space, offset, data & 0xff);
- }
- else
- {
- addr_ctrl_w(space, offset, data >> 8);
+ case 0:
+ m_pic1->ir2_w(0);
+ if (m_clkmouse_cnt < 8)
+ m_clkmouse_cmd[m_clkmouse_cnt++] = data;
+ break;
+ case 1:
+ break;
+ case 2:
+ if (m_clkmouse_cnt < 8)
+ m_clkmouse_cmd[m_clkmouse_cnt++] = data;
+ switch (m_clkmouse_cmd[0])
+ {
+ case 0x01: //set time
+ break;
+ case 0x02: //read time
+ break;
+ case 0x08:
+ if(m_clkmouse_cmd[1] > 0)
+ m_clkmouse_irq |= MO_IRQ;
+ else
+ m_clkmouse_irq &= ~MO_IRQ;
+ if(m_clkmouse_cmd[2] > 0)
+ m_clkmouse_irq |= BT_IRQ;
+ else
+ m_clkmouse_irq &= ~BT_IRQ;
+ break;
+ case 0x20:
+ if(m_clkmouse_cmd[1] > 0)
+ m_mouse_timer->adjust(attotime::from_hz(40), 0, attotime::from_hz(40));
+ else
+ m_mouse_timer->adjust(attotime::never);
+ break;
+ }
+ m_clkmouse_cnt = 0;
+ break;
+ case 3:
+ m_pic1->ir2_w(0);
+ m_clkmouse_cnt = 0;
+ m_clkmouse_irq = 0;
+ m_mouse_x = m_x_axis->read();
+ m_mouse_y = m_y_axis->read();
+ break;
}
}
@@ -306,11 +353,16 @@ WRITE8_MEMBER( tandy2k_state::addr_ctrl_w )
// Memory Maps
+void tandy2k_state::vrambank_mem(address_map &map)
+{
+ map(0x00000, 0x17fff).ram().share("hires_ram");
+ map(0x18000, 0x1ffff).noprw();
+}
+
void tandy2k_state::tandy2k_mem(address_map &map)
{
map.unmap_value_high();
-// AM_RANGE(0x00000, 0xdffff) AM_RAM
- map(0xe0000, 0xf7fff).ram().share("hires_ram");
+ map(0xe0000, 0xe7fff).rw(m_vrambank, FUNC(address_map_bank_device::read16), FUNC(address_map_bank_device::write16));
map(0xf8000, 0xfbfff).rw(FUNC(tandy2k_state::char_ram_r), FUNC(tandy2k_state::char_ram_w)).umask16(0x00ff);
map(0xfc000, 0xfdfff).mirror(0x2000).rom().region(I80186_TAG, 0);
}
@@ -328,13 +380,13 @@ void tandy2k_state::tandy2k_io(address_map &map)
map(0x00052, 0x00052).mirror(0x8).r(FUNC(tandy2k_state::kbint_clr_r));
map(0x00060, 0x00063).mirror(0xc).rw(m_pic0, FUNC(pic8259_device::read), FUNC(pic8259_device::write)).umask16(0x00ff);
map(0x00070, 0x00073).mirror(0xc).rw(m_pic1, FUNC(pic8259_device::read), FUNC(pic8259_device::write)).umask16(0x00ff);
- map(0x00080, 0x00080).mirror(0xe).rw(m_fdc, FUNC(i8272a_device::mdma_r), FUNC(i8272a_device::mdma_w));
-// AM_RANGE(0x00100, 0x0017f) AM_DEVREADWRITE8(CRT9007_TAG, crt9007_t, read, write, 0x00ff) AM_WRITE8(addr_ctrl_w, 0xff00)
- map(0x00100, 0x0017f).rw(FUNC(tandy2k_state::vpac_r), FUNC(tandy2k_state::vpac_w));
-// AM_RANGE(0x00180, 0x00180) AM_READ8(hires_status_r, 0x00ff)
-// AM_RANGE(0x00180, 0x001bf) AM_WRITE(hires_palette_w)
-// AM_RANGE(0x001a0, 0x001a0) AM_READ8(hires_plane_w, 0x00ff)
-// AM_RANGE(0x0ff00, 0x0ffff) AM_READWRITE(i186_internal_port_r, i186_internal_port_w)
+ map(0x00080, 0x00080).mirror(0xe).rw(m_fdc, FUNC(i8272a_device::dma_r), FUNC(i8272a_device::dma_w));
+ map(0x00100, 0x0017f).rw(m_vpac, FUNC(crt9007_device::read), FUNC(crt9007_device::write)).umask16(0x00ff);
+ map(0x00100, 0x0017f).w(FUNC(tandy2k_state::addr_ctrl_w)).umask16(0xff00);
+ map(0x00180, 0x00180).r(FUNC(tandy2k_state::hires_status_r)).umask16(0x00ff);
+ map(0x00180, 0x0018f).mirror(0x10).w(m_colpal, FUNC(palette_device::write8)).umask16(0x00ff).share("colpal");
+ map(0x001a0, 0x001a0).w(FUNC(tandy2k_state::hires_plane_w)).umask16(0x00ff);
+ map(0x002fc, 0x002ff).rw(FUNC(tandy2k_state::clkmouse_r), FUNC(tandy2k_state::clkmouse_w));
}
void tandy2k_state::tandy2k_hd_io(address_map &map)
@@ -355,13 +407,85 @@ void tandy2k_state::vpac_mem(address_map &map)
static INPUT_PORTS_START( tandy2k )
// defined in machine/tandy2kb.c
PORT_INCLUDE(pc_keyboard)
+
+ PORT_MODIFY("pc_keyboard_2")
+ PORT_BIT(0x0200, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Cursor Up") PORT_CODE(KEYCODE_UP) /* 29 A9 */
+ PORT_BIT(0x0800, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Cursor Left") PORT_CODE(KEYCODE_LEFT) /* 2B AB */
+
+ PORT_MODIFY("pc_keyboard_3")
+ PORT_BIT(0x0400, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Caps") PORT_CODE(KEYCODE_CAPSLOCK) PORT_TOGGLE /* Caps Lock 3A BA */
+
+ PORT_MODIFY("pc_keyboard_4")
+ PORT_BIT(0x0020, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("NumLock") PORT_CODE(KEYCODE_NUMLOCK) PORT_TOGGLE /* Num Lock 45 C5 */
+ /* Hold corresponds to Scroll Lock, but pauses the system when pressed - leaving unmapped by default to avoid conflicting with the UI Toggle key */
+ PORT_BIT(0x0040, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Hold") /* 46 C6 */
+ PORT_BIT(0x0080, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("KP 7 \\") PORT_CODE(KEYCODE_7_PAD) /* Keypad 7 47 C7 */
+ PORT_BIT(0x0100, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("KP 8 ~") PORT_CODE(KEYCODE_8_PAD) /* Keypad 8 48 C8 */
+ PORT_BIT(0x0200, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("KP 9 (PgUp)") PORT_CODE(KEYCODE_9_PAD) /* Keypad 9 (PgUp) 49 C9 */
+ PORT_BIT(0x0400, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Cursor Down") PORT_CODE(KEYCODE_DOWN) /* 4A CA */
+ PORT_BIT(0x0800, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("KP 4 |") PORT_CODE(KEYCODE_4_PAD) /* Keypad 4 4B CB */
+ PORT_BIT(0x2000, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("KP 6") PORT_CODE(KEYCODE_6_PAD) /* Keypad 6 4D CD */
+ PORT_BIT(0x4000, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Cursor Right") PORT_CODE(KEYCODE_RIGHT) /* 4E CE */
+ PORT_BIT(0x8000, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("KP 1 (End)") PORT_CODE(KEYCODE_1_PAD) /* Keypad 1 (End) 4F CF */
+
+ PORT_MODIFY("pc_keyboard_5")
+ PORT_BIT(0x0001, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("KP 2 `") PORT_CODE(KEYCODE_2_PAD) /* Keypad 2 50 D0 */
+ PORT_BIT(0x0002, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("KP 3 (PgDn)") PORT_CODE(KEYCODE_3_PAD) /* Keypad 3 (PgDn) 51 D1 */
+ PORT_BIT(0x0004, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("KP 0") PORT_CODE(KEYCODE_0_PAD) /* Keypad 0 52 D2 */
+ PORT_BIT(0x0008, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("KP - (Del)") PORT_CODE(KEYCODE_MINUS_PAD) /* - Delete 53 D3 */
+ PORT_BIT(0x0010, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Break") PORT_CODE(KEYCODE_STOP) /* Break 54 D4 */
+ PORT_BIT(0x0020, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("+ Insert") PORT_CODE(KEYCODE_PLUS_PAD) /* + Insert 55 D5 */
+ PORT_BIT(0x0040, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME(".") PORT_CODE(KEYCODE_DEL_PAD) /* . 56 D6 */
+ PORT_BIT(0x0080, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Enter") PORT_CODE(KEYCODE_ENTER_PAD) /* Enter 57 D7 */
+ PORT_BIT(0x0100, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Home") PORT_CODE(KEYCODE_HOME) /* HOME 58 D8 */
+ PORT_BIT(0x0200, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("F11") PORT_CODE(KEYCODE_F11) /* F11 59 D9 */
+ PORT_BIT(0x0400, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("F12") PORT_CODE(KEYCODE_F12) /* F12 5a Da */
+
+ PORT_START("MOUSEBTN")
+ PORT_BIT( 0xff8f, IP_ACTIVE_HIGH, IPT_UNUSED )
+ PORT_BIT( 0x0010, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_CODE(MOUSECODE_BUTTON1) PORT_CHANGED_MEMBER(DEVICE_SELF, tandy2k_state, input_changed, nullptr)
+ PORT_BIT( 0x0020, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_CODE(MOUSECODE_BUTTON2) PORT_CHANGED_MEMBER(DEVICE_SELF, tandy2k_state, input_changed, nullptr)
+ PORT_BIT( 0x0040, IP_ACTIVE_LOW, IPT_UNUSED ) /* this would be button three but AFAIK no tandy mouse ever had one */
+
+ PORT_START("MOUSEX")
+ PORT_BIT( 0xffff, 0x00, IPT_MOUSE_X ) PORT_SENSITIVITY(50) PORT_KEYDELTA(0) PORT_CHANGED_MEMBER(DEVICE_SELF, tandy2k_state, input_changed, nullptr)
+
+ PORT_START("MOUSEY")
+ PORT_BIT( 0xffff, 0x00, IPT_MOUSE_Y ) PORT_SENSITIVITY(50) PORT_KEYDELTA(0) PORT_CHANGED_MEMBER(DEVICE_SELF, tandy2k_state, input_changed, nullptr)
INPUT_PORTS_END
+INPUT_CHANGED_MEMBER(tandy2k_state::input_changed)
+{
+ if (m_clkmouse_cnt || !m_clkmouse_irq)
+ return;
+ if ((m_clkmouse_irq & BT_IRQ) && (field.name()[5] == 'B'))
+ {
+ m_clkmouse_cnt = 1;
+ m_clkmouse_cmd[0] = 'B';
+ }
+ else if ((m_clkmouse_irq & MO_IRQ))
+ {
+ uint16_t x = m_x_axis->read();
+ uint16_t y = m_y_axis->read();
+ uint16_t dx = x - m_mouse_x;
+ uint16_t dy = y - m_mouse_y;
+ m_mouse_x = x;
+ m_mouse_y = y;
+ m_clkmouse_cnt = 5;
+ m_clkmouse_cmd[4] = 'M';
+ m_clkmouse_cmd[3] = dx & 0xff;
+ m_clkmouse_cmd[2] = dx >> 8;
+ m_clkmouse_cmd[1] = dy & 0xff;
+ m_clkmouse_cmd[0] = dy >> 8;
+ }
+ m_pic1->ir2_w(1);
+}
+
// Video
uint32_t tandy2k_state::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect)
{
- const pen_t *pen = m_palette->pens();
+ const pen_t *cpen = m_colpal->pens();
address_space &program = m_maincpu->space(AS_PROGRAM);
for (int y = 0; y < 400; y++)
@@ -370,18 +494,32 @@ uint32_t tandy2k_state::screen_update(screen_device &screen, bitmap_rgb32 &bitma
for (int sx = 0; sx < 80; sx++)
{
- offs_t addr = m_ram->size() - 0x1400 + (((y / 16) * 80) + sx) * 2;
- uint16_t vidla = program.read_word(addr);
- uint8_t attr = vidla >> 8;
- uint8_t data = m_char_ram[((vidla & 0xff) << 4) | cgra];
- if(attr & 0x80)
- data = ~data;
-
- for (int x = 0; x < 8; x++)
+ if (m_hires_en & 2)
+ {
+ uint8_t a = ((uint8_t *)m_hires_ram.target())[(y * 80) + sx];
+ uint8_t b = ((uint8_t *)m_hires_ram.target())[(y * 80) + sx + 0x8000];
+ uint8_t c = ((uint8_t *)m_hires_ram.target())[(y * 80) + sx + 0x8000 * 2];
+ for (int x = 0; x < 8; x++)
+ {
+ int color = BIT(a, x) | (BIT(b, x) << 1) | (BIT(c, x) << 2);
+ bitmap.pix32(y, (sx * 8) + (7 - x)) = cpen[color];
+ }
+ }
+ else
{
- int color = BIT(data, 7);
- bitmap.pix32(y, (sx * 8) + x) = pen[color];
- data <<= 1;
+ offs_t addr = m_ram->size() - 0x1400 + (((y / 16) * 80) + sx) * 2;
+ uint16_t vidla = program.read_word(addr);
+ uint8_t attr = vidla >> 8;
+ uint8_t data = m_char_ram[((vidla & 0xff) << 4) | cgra];
+ if(attr & 0x80)
+ data = ~data;
+
+ for (int x = 0; x < 8; x++)
+ {
+ int color = 4 | (BIT(attr, 6) << 1) | BIT(data, 7);
+ bitmap.pix32(y, (sx * 8) + x) = cpen[color];
+ data <<= 1;
+ }
}
}
}
@@ -429,6 +567,23 @@ WRITE_LINE_MEMBER( tandy2k_state::vpac_sld_w )
m_vac->sld_w(state);
}
+WRITE8_MEMBER( tandy2k_state::hires_plane_w )
+{
+ int bank = 3;
+ if (((data & 1) + ((data >> 1) & 1) + ((data >> 2) & 1)) == 1)
+ bank = (data & 1) ? 0 : (data & 2) ? 1 : (data & 4) ? 2 : 0;
+ m_vrambank->set_bank(bank);
+ m_hires_en = (data >> 4) & 3;
+}
+
+// bit 0 - 0 = hires board installed
+// bit 1 - 0 = 1 plane, 1 = 3 planes
+// bit 2-4 - board rev
+READ8_MEMBER( tandy2k_state::hires_status_r )
+{
+ return 2;
+}
+
WRITE8_MEMBER( tandy2k_state::vidla_w )
{
m_vidla = data;
@@ -463,7 +618,7 @@ WRITE8_MEMBER( tandy2k_state::drb_attr_w )
CRT9021_DRAW_CHARACTER_MEMBER( tandy2k_state::vac_draw_character )
{
- const pen_t *pen = m_palette->pens();
+ const pen_t *pen = m_colpal->pens();
for (int i = 0; i < 8; i++)
{
@@ -744,6 +899,8 @@ void tandy2k_state::machine_start()
program.install_ram(0x00000, ram_size - 1, ram);
m_char_ram.allocate(0x1000);
+ m_mouse_timer = timer_alloc(MOUS_TIMER);
+ m_mcu_delay = timer_alloc(MCU_DELAY);
// register for state saving
save_item(NAME(m_dma_mux));
@@ -759,6 +916,19 @@ void tandy2k_state::machine_start()
save_item(NAME(m_clkcnt));
save_item(NAME(m_outspkr));
save_item(NAME(m_spkrdata));
+ save_item(NAME(m_clkmouse_cmd));
+ save_item(NAME(m_clkmouse_cnt));
+ save_item(NAME(m_clkmouse_irq));
+ save_item(NAME(m_mouse_x));
+ save_item(NAME(m_mouse_y));
+ save_item(NAME(m_hires_en));
+}
+
+void tandy2k_state::machine_reset()
+{
+ m_hires_en = 0;
+ m_clkmouse_cnt = 0;
+ m_clkmouse_irq = 0;
}
void tandy2k_state::device_reset_after_children()
@@ -766,6 +936,39 @@ void tandy2k_state::device_reset_after_children()
m_pc_keyboard->enable(0);
}
+void tandy2k_state::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr)
+{
+ switch (id)
+ {
+ case MOUS_TIMER:
+ {
+ uint16_t x = m_x_axis->read();
+ uint16_t y = m_y_axis->read();
+ uint16_t dx = x - m_mouse_x;
+ uint16_t dy = y - m_mouse_y;
+ m_mouse_x = x;
+ m_mouse_y = y;
+ m_clkmouse_cnt = 5;
+ m_clkmouse_cmd[4] = 'A';
+ m_clkmouse_cmd[3] = dx & 0xff;
+ m_clkmouse_cmd[2] = dx >> 8;
+ m_clkmouse_cmd[1] = dy & 0xff;
+ m_clkmouse_cmd[0] = dy >> 8;
+ m_pic1->ir2_w(1);
+ break;
+ }
+ case MCU_DELAY:
+ m_pic1->ir2_w(1);
+ break;
+ }
+}
+
+rgb_t tandy2k_state::IRGB(uint32_t raw)
+{
+ uint8_t i = (raw >> 3) & 1;
+ return rgb_t(pal2bit(((raw & 4) >> 1) | i), pal2bit((raw & 2) | i), pal2bit(((raw & 1) << 1) | i));
+}
+
// Machine Driver
void tandy2k_state::tandy2k(machine_config &config)
@@ -778,7 +981,6 @@ void tandy2k_state::tandy2k(machine_config &config)
// video hardware
screen_device &screen(SCREEN(config, SCREEN_TAG, SCREEN_TYPE_RASTER));
- screen.set_color(rgb_t::green());
screen.set_refresh_hz(50);
screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500)); // not accurate
screen.set_size(640, 400);
@@ -786,7 +988,7 @@ void tandy2k_state::tandy2k(machine_config &config)
//screen.set_screen_update(CRT9021B_TAG, FUNC(crt9021_device::screen_update));
screen.set_screen_update(FUNC(tandy2k_state::screen_update));
- PALETTE(config, m_palette, palette_device::MONOCHROME);
+ PALETTE(config, m_colpal).set_format(1, &tandy2k_state::IRGB, 8);
crt9007_device &vpac(CRT9007(config, CRT9007_TAG, 16_MHz_XTAL * 28 / 20 / 8));
vpac.set_addrmap(0, &tandy2k_state::vpac_mem);
@@ -813,6 +1015,8 @@ void tandy2k_state::tandy2k(machine_config &config)
CRT9021(config, m_vac, 16_MHz_XTAL * 28 / 20);
m_vac->set_screen(SCREEN_TAG);
+ ADDRESS_MAP_BANK(config, m_vrambank).set_map(&tandy2k_state::vrambank_mem).set_options(ENDIANNESS_LITTLE, 16, 17, 0x8000);
+
TIMER(config, "vidldsh").configure_generic(FUNC(tandy2k_state::vidldsh_tick));
// sound hardware
diff --git a/src/mame/drivers/tank8.cpp b/src/mame/drivers/tank8.cpp
index f49ed135a26..63a6f3da119 100644
--- a/src/mame/drivers/tank8.cpp
+++ b/src/mame/drivers/tank8.cpp
@@ -328,33 +328,31 @@ static GFXDECODE_START( gfx_tank8 )
GFXDECODE_END
-MACHINE_CONFIG_START(tank8_state::tank8)
-
+void tank8_state::tank8(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M6800, 11055000 / 10) /* ? */
- MCFG_DEVICE_PROGRAM_MAP(tank8_cpu_map)
-
+ M6800(config, m_maincpu, 11055000 / 10); /* ? */
+ m_maincpu->set_addrmap(AS_PROGRAM, &tank8_state::tank8_cpu_map);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_VIDEO_ATTRIBUTES(VIDEO_UPDATE_AFTER_VBLANK)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(30 * 1000000 / 15681))
- MCFG_SCREEN_SIZE(512, 524)
- MCFG_SCREEN_VISIBLE_AREA(16, 495, 0, 463)
- MCFG_SCREEN_UPDATE_DRIVER(tank8_state, screen_update)
- MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE(*this, tank8_state, screen_vblank))
- MCFG_SCREEN_PALETTE(m_palette)
-
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, m_palette, gfx_tank8)
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_video_attributes(VIDEO_UPDATE_AFTER_VBLANK);
+ m_screen->set_refresh_hz(60);
+ m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(30 * 1000000 / 15681));
+ m_screen->set_size(512, 524);
+ m_screen->set_visarea(16, 495, 0, 463);
+ m_screen->set_screen_update(FUNC(tank8_state::screen_update));
+ m_screen->screen_vblank().set(FUNC(tank8_state::screen_vblank));
+ m_screen->set_palette(m_palette);
+
+ GFXDECODE(config, m_gfxdecode, m_palette, gfx_tank8);
PALETTE(config, m_palette, FUNC(tank8_state::tank8_palette), 20, 10);
/* sound hardware */
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("discrete", DISCRETE, tank8_discrete)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.80)
-MACHINE_CONFIG_END
+ DISCRETE(config, m_discrete, tank8_discrete).add_route(ALL_OUTPUTS, "mono", 0.80);
+}
ROM_START( tank8a )
diff --git a/src/mame/drivers/tankbust.cpp b/src/mame/drivers/tankbust.cpp
index 3c4c097ea47..bf7cef07fae 100644
--- a/src/mame/drivers/tankbust.cpp
+++ b/src/mame/drivers/tankbust.cpp
@@ -330,30 +330,30 @@ INTERRUPT_GEN_MEMBER(tankbust_state::vblank_irq)
device.execute().set_input_line(0, HOLD_LINE);
}
-MACHINE_CONFIG_START(tankbust_state::tankbust)
-
+void tankbust_state::tankbust(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, XTAL(14'318'181)/2) /* Verified on PCB */
- MCFG_DEVICE_PROGRAM_MAP(main_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", tankbust_state, vblank_irq)
+ Z80(config, m_maincpu, XTAL(14'318'181)/2); /* Verified on PCB */
+ m_maincpu->set_addrmap(AS_PROGRAM, &tankbust_state::main_map);
+ m_maincpu->set_vblank_int("screen", FUNC(tankbust_state::vblank_irq));
- MCFG_DEVICE_ADD("sub", Z80, XTAL(14'318'181)/4) /* Verified on PCB */
-// MCFG_DEVICE_ADD("sub", Z80, XTAL(14'318'181)/3) /* Accurate to audio recording, but apparently incorrect clock */
- MCFG_DEVICE_PROGRAM_MAP(map_cpu2)
- MCFG_DEVICE_IO_MAP(port_map_cpu2)
+ Z80(config, m_subcpu, XTAL(14'318'181)/4); /* Verified on PCB */
+// Z80(config, m_subcpu, XTAL(14'318'181)/3); /* Accurate to audio recording, but apparently incorrect clock */
+ m_subcpu->set_addrmap(AS_PROGRAM, &tankbust_state::map_cpu2);
+ m_subcpu->set_addrmap(AS_IO, &tankbust_state::port_map_cpu2);
- MCFG_QUANTUM_TIME(attotime::from_hz(6000))
+ config.m_minimum_quantum = attotime::from_hz(6000);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */)
- MCFG_SCREEN_SIZE ( 64*8, 32*8 )
- MCFG_SCREEN_VISIBLE_AREA ( 16*8, 56*8-1, 1*8, 31*8-1 )
-// MCFG_SCREEN_VISIBLE_AREA ( 0*8, 64*8-1, 1*8, 31*8-1 )
- MCFG_SCREEN_UPDATE_DRIVER(tankbust_state, screen_update)
- MCFG_SCREEN_PALETTE(m_palette)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500) /* not accurate */);
+ screen.set_size( 64*8, 32*8);
+ screen.set_visarea( 16*8, 56*8-1, 1*8, 31*8-1);
+// screen.set_visarea( 0*8, 64*8-1, 1*8, 31*8-1);
+ screen.set_screen_update(FUNC(tankbust_state::screen_update));
+ screen.set_palette(m_palette);
GFXDECODE(config, m_gfxdecode, m_palette, gfx_tankbust);
PALETTE(config, m_palette, FUNC(tankbust_state::tankbust_palette), 128);
@@ -367,7 +367,7 @@ MACHINE_CONFIG_START(tankbust_state::tankbust)
ay1.add_route(ALL_OUTPUTS, "mono", 0.10);
AY8910(config, "ay2", XTAL(14'318'181)/16).add_route(ALL_OUTPUTS, "mono", 0.10); /* Verified on PCB */
-MACHINE_CONFIG_END
+}
/***************************************************************************
diff --git a/src/mame/drivers/tapatune.cpp b/src/mame/drivers/tapatune.cpp
index fdf098e40a9..2b3a9414c2f 100644
--- a/src/mame/drivers/tapatune.cpp
+++ b/src/mame/drivers/tapatune.cpp
@@ -522,32 +522,35 @@ INPUT_PORTS_END
*
*************************************/
-MACHINE_CONFIG_START(tapatune_state::tapatune_base)
+void tapatune_state::tapatune_base(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, XTAL(24'000'000) / 4)
- MCFG_DEVICE_PROGRAM_MAP(maincpu_map)
- MCFG_DEVICE_IO_MAP(maincpu_io_map)
- MCFG_DEVICE_PERIODIC_INT_DRIVER(tapatune_state, irq0_line_assert, XTAL(24'000'000) / 4 / 4 / 4096)
+ Z80(config, m_maincpu, XTAL(24'000'000) / 4);
+ m_maincpu->set_addrmap(AS_PROGRAM, &tapatune_state::maincpu_map);
+ m_maincpu->set_addrmap(AS_IO, &tapatune_state::maincpu_io_map);
+ m_maincpu->set_periodic_int(FUNC(tapatune_state::irq0_line_assert), attotime::from_ticks(4 * 4096, XTAL(24'000'000) / 4));
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
- MCFG_TICKET_DISPENSER_ADD("ticket", attotime::from_msec(100), TICKET_MOTOR_ACTIVE_LOW, TICKET_STATUS_ACTIVE_LOW)
+ TICKET_DISPENSER(config, "ticket", attotime::from_msec(100), TICKET_MOTOR_ACTIVE_LOW, TICKET_STATUS_ACTIVE_LOW);
/* sound hardware */
SPEAKER(config, "lspeaker").front_left();
SPEAKER(config, "rspeaker").front_right();
- MCFG_DEVICE_ADD("bsmt", BSMT2000, XTAL(24'000'000))
- MCFG_SOUND_ROUTE(0, "lspeaker", 1.0)
- MCFG_SOUND_ROUTE(1, "rspeaker", 1.0)
-MACHINE_CONFIG_END
+ BSMT2000(config, m_bsmt, XTAL(24'000'000));
+ m_bsmt->add_route(0, "lspeaker", 1.0);
+ m_bsmt->add_route(1, "rspeaker", 1.0);
+}
-MACHINE_CONFIG_START(tapatune_state::tapatune)
+void tapatune_state::tapatune(machine_config &config)
+{
tapatune_base(config);
- MCFG_DEVICE_ADD("videocpu", M68000, XTAL(24'000'000) / 2)
- MCFG_DEVICE_PROGRAM_MAP(video_map)
- MCFG_QUANTUM_PERFECT_CPU("videocpu")
+ M68000(config, m_videocpu, XTAL(24'000'000) / 2);
+ m_videocpu->set_addrmap(AS_PROGRAM, &tapatune_state::video_map);
+
+ config.m_perfect_cpu_quantum = subtag("videocpu");
h46505_device &crtc(H46505(config, "crtc", XTAL(24'000'000) / 16));
crtc.set_screen("screen");
@@ -558,10 +561,10 @@ MACHINE_CONFIG_START(tapatune_state::tapatune)
crtc.out_vsync_callback().set(FUNC(tapatune_state::crtc_vsync));
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_RAW_PARAMS(XTAL(24'000'000) / 16 * 5, 500, 0, 320, 250, 0, 240)
- MCFG_SCREEN_UPDATE_DEVICE("crtc", h46505_device, screen_update)
-MACHINE_CONFIG_END
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_raw(XTAL(24'000'000) / 16 * 5, 500, 0, 320, 250, 0, 240);
+ screen.set_screen_update("crtc", FUNC(h46505_device::screen_update));
+}
/*************************************
*
diff --git a/src/mame/drivers/targeth.cpp b/src/mame/drivers/targeth.cpp
index 2460c289cd7..3afa4def461 100644
--- a/src/mame/drivers/targeth.cpp
+++ b/src/mame/drivers/targeth.cpp
@@ -268,28 +268,28 @@ static INPUT_PORTS_START( targeth )
INPUT_PORTS_END
-MACHINE_CONFIG_START(targeth_state::targeth)
-
+void targeth_state::targeth(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M68000, XTAL(24'000'000)/2) /* 12 MHz */
- MCFG_DEVICE_PROGRAM_MAP(main_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", targeth_state, irq2_line_hold)
+ M68000(config, m_maincpu, XTAL(24'000'000)/2); /* 12 MHz */
+ m_maincpu->set_addrmap(AS_PROGRAM, &targeth_state::main_map);
+ m_maincpu->set_vblank_int("screen", FUNC(targeth_state::irq2_line_hold));
- MCFG_DEVICE_ADD("gaelco_ds5002fp", GAELCO_DS5002FP, XTAL(24'000'000) / 2)
- MCFG_DEVICE_ADDRESS_MAP(0, mcu_hostmem_map)
+ gaelco_ds5002fp_device &ds5002fp(GAELCO_DS5002FP(config, "gaelco_ds5002fp", XTAL(24'000'000) / 2));
+ ds5002fp.set_addrmap(0, &targeth_state::mcu_hostmem_map);
LS259(config, m_outlatch);
m_outlatch->q_out_cb<2>().set(FUNC(targeth_state::coin1_counter_w));
m_outlatch->q_out_cb<3>().set(FUNC(targeth_state::coin2_counter_w));
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */)
- MCFG_SCREEN_SIZE(64*16, 16*16)
- MCFG_SCREEN_VISIBLE_AREA(3*8, 23*16-8-1, 16, 16*16-8-1)
- MCFG_SCREEN_UPDATE_DRIVER(targeth_state, screen_update)
- MCFG_SCREEN_PALETTE(m_palette)
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_refresh_hz(60);
+ m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(2500) /* not accurate */);
+ m_screen->set_size(64*16, 16*16);
+ m_screen->set_visarea(3*8, 23*16-8-1, 16, 16*16-8-1);
+ m_screen->set_screen_update(FUNC(targeth_state::screen_update));
+ m_screen->set_palette(m_palette);
GFXDECODE(config, "gfxdecode", m_palette, gfx_targeth);
PALETTE(config, m_palette).set_format(palette_device::xBGR_555, 1024);
@@ -297,10 +297,10 @@ MACHINE_CONFIG_START(targeth_state::targeth)
/* sound hardware */
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("oki", OKIM6295, XTAL(1'000'000), okim6295_device::PIN7_HIGH) // 1MHz resonator - pin 7 not verified
- MCFG_DEVICE_ADDRESS_MAP(0, oki_map)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
-MACHINE_CONFIG_END
+ okim6295_device &oki(OKIM6295(config, "oki", XTAL(1'000'000), okim6295_device::PIN7_HIGH)); // 1MHz resonator - pin 7 not verified
+ oki.set_addrmap(0, &targeth_state::oki_map);
+ oki.add_route(ALL_OUTPUTS, "mono", 1.0);
+}
ROM_START( targeth )
ROM_REGION( 0x100000, "maincpu", 0 ) /* 68000 code */
diff --git a/src/mame/drivers/tasman.cpp b/src/mame/drivers/tasman.cpp
index 9d43ffbc680..3e8efe41fbd 100644
--- a/src/mame/drivers/tasman.cpp
+++ b/src/mame/drivers/tasman.cpp
@@ -645,27 +645,28 @@ TIMER_DEVICE_CALLBACK_MEMBER(kongambl_state::kongambl_vblank)
}
-MACHINE_CONFIG_START(kongambl_state::kongambl)
- MCFG_DEVICE_ADD("maincpu", M68EC020, 25000000)
- MCFG_DEVICE_PROGRAM_MAP(kongambl_map)
- MCFG_TIMER_DRIVER_ADD_SCANLINE("scantimer", kongambl_state, kongambl_vblank, "screen", 0, 1)
+void kongambl_state::kongambl(machine_config &config)
+{
+ M68EC020(config, m_maincpu, 25000000);
+ m_maincpu->set_addrmap(AS_PROGRAM, &kongambl_state::kongambl_map);
+ TIMER(config, "scantimer").configure_scanline(FUNC(kongambl_state::kongambl_vblank), "screen", 0, 1);
- MCFG_DEVICE_ADD("sndcpu", M68000, 16000000)
- MCFG_DEVICE_PROGRAM_MAP(kongamaud_map)
- MCFG_DEVICE_PERIODIC_INT_DRIVER(kongambl_state, irq2_line_hold, 480)
+ m68000_device &sndcpu(M68000(config, "sndcpu", 16000000));
+ sndcpu.set_addrmap(AS_PROGRAM, &kongambl_state::kongamaud_map);
+ sndcpu.set_periodic_int(FUNC(kongambl_state::irq2_line_hold), attotime::from_hz(480));
K053252(config, m_k053252, 25000000);
m_k053252->set_offsets(0, 16); // TBD
m_k053252->int1_ack().set(FUNC(kongambl_state::vblank_irq_ack_w));
m_k053252->int2_ack().set(FUNC(kongambl_state::hblank_irq_ack_w));
- m_k053252->set_screen("screen");
+ m_k053252->set_screen(m_screen);
EEPROM_93C46_16BIT(config, "eeprom");
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_RAW_PARAMS(25000000, 288+16+32+48, 0, 287, 224+16+8+16, 0, 223) // fake, they'll be changed by CCU anyway, TBD
- MCFG_SCREEN_UPDATE_DRIVER(kongambl_state, screen_update_kongambl)
- MCFG_SCREEN_PALETTE(m_palette)
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_raw(25000000, 288+16+32+48, 0, 287, 224+16+8+16, 0, 223); // fake, they'll be changed by CCU anyway, TBD
+ m_screen->set_screen_update(FUNC(kongambl_state::screen_update_kongambl));
+ m_screen->set_palette(m_palette);
PALETTE(config, m_palette).set_format(palette_device::xRGB_888, 32768);
@@ -689,7 +690,7 @@ MACHINE_CONFIG_START(kongambl_state::kongambl)
SPEAKER(config, "lspeaker").front_left();
SPEAKER(config, "rspeaker").front_right();
-MACHINE_CONFIG_END
+}
ROM_START( kingtut )
diff --git a/src/mame/drivers/tatsumi.cpp b/src/mame/drivers/tatsumi.cpp
index 55d45161738..51aa5849fda 100644
--- a/src/mame/drivers/tatsumi.cpp
+++ b/src/mame/drivers/tatsumi.cpp
@@ -864,25 +864,25 @@ MACHINE_RESET_MEMBER(apache3_state,apache3)
}
-MACHINE_CONFIG_START(apache3_state::apache3)
-
+void apache3_state::apache3(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", V30, CLOCK_1 / 2)
- MCFG_DEVICE_PROGRAM_MAP(apache3_v30_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", tatsumi_state, v30_interrupt)
+ V30(config, m_maincpu, CLOCK_1 / 2);
+ m_maincpu->set_addrmap(AS_PROGRAM, &apache3_state::apache3_v30_map);
+ m_maincpu->set_vblank_int("screen", FUNC(tatsumi_state::v30_interrupt));
- MCFG_DEVICE_ADD("sub", M68000, CLOCK_2 / 4)
- MCFG_DEVICE_PROGRAM_MAP(apache3_68000_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", apache3_state, irq4_line_hold)
+ M68000(config, m_subcpu, CLOCK_2 / 4);
+ m_subcpu->set_addrmap(AS_PROGRAM, &apache3_state::apache3_68000_map);
+ m_subcpu->set_vblank_int("screen", FUNC(apache3_state::irq4_line_hold));
- MCFG_DEVICE_ADD("audiocpu", V20, CLOCK_1 / 2)
- MCFG_DEVICE_PROGRAM_MAP(apache3_v20_map)
+ V20(config, m_audiocpu, CLOCK_1 / 2);
+ m_audiocpu->set_addrmap(AS_PROGRAM, &apache3_state::apache3_v20_map);
- MCFG_DEVICE_ADD("sub2", Z80, CLOCK_2 / 8)
- MCFG_DEVICE_PROGRAM_MAP(apache3_z80_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", apache3_state, irq0_line_hold)
+ Z80(config, m_subcpu2, CLOCK_2 / 8);
+ m_subcpu2->set_addrmap(AS_PROGRAM, &apache3_state::apache3_z80_map);
+ m_subcpu2->set_vblank_int("screen", FUNC(apache3_state::irq0_line_hold));
- MCFG_QUANTUM_TIME(attotime::from_hz(6000))
+ config.m_minimum_quantum = attotime::from_hz(6000);
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
MCFG_MACHINE_RESET_OVERRIDE(apache3_state, apache3)
@@ -898,9 +898,9 @@ MACHINE_CONFIG_START(apache3_state::apache3)
I8255(config, "ppi");
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_RAW_PARAMS(CLOCK_2 / 8, 400, 0, 320, 272, 0, 240) // TODO: Hook up CRTC
- MCFG_SCREEN_UPDATE_DRIVER(apache3_state, screen_update_apache3)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_raw(CLOCK_2 / 8, 400, 0, 320, 272, 0, 240); // TODO: Hook up CRTC
+ screen.set_screen_update(FUNC(apache3_state::screen_update_apache3));
GFXDECODE(config, m_gfxdecode, m_palette, gfx_apache3);
PALETTE(config, m_palette).set_format(palette_device::xRGB_555, 1024 + 4096); // 1024 real colours, and 4096 arranged as series of CLUTs
@@ -924,25 +924,25 @@ MACHINE_CONFIG_START(apache3_state::apache3)
m_ym2151->add_route(0, "lspeaker", 0.45);
m_ym2151->add_route(1, "rspeaker", 0.45);
- MCFG_DEVICE_ADD("oki", OKIM6295, CLOCK_1 / 4 / 2, okim6295_device::PIN7_HIGH)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 0.75)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 0.75)
-MACHINE_CONFIG_END
-
-MACHINE_CONFIG_START(roundup5_state::roundup5)
+ OKIM6295(config, m_oki, CLOCK_1 / 4 / 2, okim6295_device::PIN7_HIGH);
+ m_oki->add_route(ALL_OUTPUTS, "lspeaker", 0.75);
+ m_oki->add_route(ALL_OUTPUTS, "rspeaker", 0.75);
+}
+void roundup5_state::roundup5(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", V30, CLOCK_1 / 2)
- MCFG_DEVICE_PROGRAM_MAP(roundup5_v30_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", tatsumi_state, v30_interrupt)
+ V30(config, m_maincpu, CLOCK_1 / 2);
+ m_maincpu->set_addrmap(AS_PROGRAM, &roundup5_state::roundup5_v30_map);
+ m_maincpu->set_vblank_int("screen", FUNC(tatsumi_state::v30_interrupt));
- MCFG_DEVICE_ADD("sub", M68000, CLOCK_2 / 4)
- MCFG_DEVICE_PROGRAM_MAP(roundup5_68000_map)
+ M68000(config, m_subcpu, CLOCK_2 / 4);
+ m_subcpu->set_addrmap(AS_PROGRAM, &roundup5_state::roundup5_68000_map);
- MCFG_DEVICE_ADD("audiocpu", Z80, CLOCK_1 / 4)
- MCFG_DEVICE_PROGRAM_MAP(roundup5_z80_map)
+ Z80(config, m_audiocpu, CLOCK_1 / 4);
+ m_audiocpu->set_addrmap(AS_PROGRAM, &roundup5_state::roundup5_z80_map);
- MCFG_QUANTUM_TIME(attotime::from_hz(6000))
+ config.m_minimum_quantum = attotime::from_hz(6000);
i8255_device &ppi(I8255(config, "ppi"));
ppi.in_pa_callback().set_ioport("IN0");
@@ -950,9 +950,9 @@ MACHINE_CONFIG_START(roundup5_state::roundup5)
ppi.out_pc_callback().set(FUNC(roundup5_state::output_w));
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_RAW_PARAMS(CLOCK_2 / 8, 400, 0, 320, 272, 0, 240) // TODO: Hook up CRTC
- MCFG_SCREEN_UPDATE_DRIVER(roundup5_state, screen_update_roundup5)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_raw(CLOCK_2 / 8, 400, 0, 320, 272, 0, 240); // TODO: Hook up CRTC
+ screen.set_screen_update(FUNC(roundup5_state::screen_update_roundup5));
GFXDECODE(config, m_gfxdecode, m_palette, gfx_roundup5);
PALETTE(config, m_palette).set_format(palette_device::xRGB_555, 1024 + 4096); // 1024 real colours, and 4096 arranged as series of CLUTs
@@ -969,10 +969,10 @@ MACHINE_CONFIG_START(roundup5_state::roundup5)
m_ym2151->add_route(0, "lspeaker", 0.45);
m_ym2151->add_route(1, "rspeaker", 0.45);
- MCFG_DEVICE_ADD("oki", OKIM6295, CLOCK_1 / 4 / 2, okim6295_device::PIN7_HIGH)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 0.75)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 0.75)
-MACHINE_CONFIG_END
+ OKIM6295(config, m_oki, CLOCK_1 / 4 / 2, okim6295_device::PIN7_HIGH);
+ m_oki->add_route(ALL_OUTPUTS, "lspeaker", 0.75);
+ m_oki->add_route(ALL_OUTPUTS, "rspeaker", 0.75);
+}
void cyclwarr_state::machine_reset()
{
@@ -1000,22 +1000,22 @@ void cyclwarr_state::machine_reset()
m_road_color_bank = m_prev_road_bank = 0;
}
-MACHINE_CONFIG_START(cyclwarr_state::cyclwarr)
-
+void cyclwarr_state::cyclwarr(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M68000, CLOCK_2 / 4)
- MCFG_DEVICE_PROGRAM_MAP(master_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", cyclwarr_state, irq5_line_hold)
+ M68000(config, m_maincpu, CLOCK_2 / 4);
+ m_maincpu->set_addrmap(AS_PROGRAM, &cyclwarr_state::master_map);
+ m_maincpu->set_vblank_int("screen", FUNC(cyclwarr_state::irq5_line_hold));
- MCFG_DEVICE_ADD("sub", M68000, CLOCK_2 / 4)
- MCFG_DEVICE_PROGRAM_MAP(slave_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", cyclwarr_state, irq5_line_hold)
+ M68000(config, m_subcpu, CLOCK_2 / 4);
+ m_subcpu->set_addrmap(AS_PROGRAM, &cyclwarr_state::slave_map);
+ m_subcpu->set_vblank_int("screen", FUNC(cyclwarr_state::irq5_line_hold));
- MCFG_DEVICE_ADD("audiocpu", Z80, CLOCK_1 / 4)
- MCFG_DEVICE_PROGRAM_MAP(sound_map)
+ Z80(config, m_audiocpu, CLOCK_1 / 4);
+ m_audiocpu->set_addrmap(AS_PROGRAM, &cyclwarr_state::sound_map);
// saner sync value (avoids crashing after crediting)
- MCFG_QUANTUM_TIME(attotime::from_hz(CLOCK_2 / 1024))
+ config.m_minimum_quantum = attotime::from_hz(CLOCK_2 / 1024);
cxd1095_device &io1(CXD1095(config, "io1", 0));
io1.in_portb_cb().set_ioport("SERVICE");
@@ -1031,9 +1031,9 @@ MACHINE_CONFIG_START(cyclwarr_state::cyclwarr)
io2.out_porte_cb().set(FUNC(cyclwarr_state::cyclwarr_control_w));
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_RAW_PARAMS(CLOCK_2 / 8, 400, 0, 320, 272, 0, 240) // TODO: Hook up CRTC
- MCFG_SCREEN_UPDATE_DRIVER(cyclwarr_state, screen_update_cyclwarr)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_raw(CLOCK_2 / 8, 400, 0, 320, 272, 0, 240); // TODO: Hook up CRTC
+ screen.set_screen_update(FUNC(cyclwarr_state::screen_update_cyclwarr));
GFXDECODE(config, m_gfxdecode, m_palette, gfx_cyclwarr);
PALETTE(config, m_palette).set_format(palette_device::xRGB_555, 8192 + 8192);
@@ -1052,25 +1052,24 @@ MACHINE_CONFIG_START(cyclwarr_state::cyclwarr)
m_ym2151->add_route(0, "lspeaker", 0.45);
m_ym2151->add_route(1, "rspeaker", 0.45);
- MCFG_DEVICE_ADD("oki", OKIM6295, CLOCK_1 / 8, okim6295_device::PIN7_HIGH)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 0.75)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 0.75)
-MACHINE_CONFIG_END
+ OKIM6295(config, m_oki, CLOCK_1 / 8, okim6295_device::PIN7_HIGH);
+ m_oki->add_route(ALL_OUTPUTS, "lspeaker", 0.75);
+ m_oki->add_route(ALL_OUTPUTS, "rspeaker", 0.75);
+}
-MACHINE_CONFIG_START(cyclwarr_state::bigfight)
+void cyclwarr_state::bigfight(machine_config &config)
+{
cyclwarr(config);
// TODO: it's same video HW, we don't know how/where video registers are mapped
-// MCFG_SCREEN_MODIFY("screen")
-// MCFG_SCREEN_UPDATE_DRIVER(cyclwarr_state, screen_update_bigfight)
+// subdevice<screen_device>("screen")->set_screen_update(FUNC(cyclwarr_state::screen_update_bigfight));
MCFG_VIDEO_START_OVERRIDE(cyclwarr_state, bigfight)
/* sound hardware */
// TODO: 2MHz was too fast. Can the clock be software controlled?
- MCFG_DEVICE_MODIFY("oki")
- MCFG_DEVICE_CLOCK(CLOCK_1 / 8 / 2)
-MACHINE_CONFIG_END
+ m_oki->set_clock(CLOCK_1 / 8 / 2);
+}
/***************************************************************************/
diff --git a/src/mame/drivers/tavernie.cpp b/src/mame/drivers/tavernie.cpp
index 47f4bb58f70..ec03e61a2bc 100644
--- a/src/mame/drivers/tavernie.cpp
+++ b/src/mame/drivers/tavernie.cpp
@@ -297,10 +297,11 @@ void tavernie_state::kbd_put(u8 data)
m_pia_ivg->cb1_w(1);
}
-MACHINE_CONFIG_START(tavernie_state::cpu09)
+void tavernie_state::cpu09(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", MC6809, 4_MHz_XTAL)
- MCFG_DEVICE_PROGRAM_MAP(cpu09_mem)
+ MC6809(config, m_maincpu, 4_MHz_XTAL);
+ m_maincpu->set_addrmap(AS_PROGRAM, &tavernie_state::cpu09_mem);
MCFG_MACHINE_RESET_OVERRIDE(tavernie_state, cpu09)
/* sound hardware */
@@ -308,7 +309,7 @@ MACHINE_CONFIG_START(tavernie_state::cpu09)
WAVE(config, "wave", "cassette").add_route(ALL_OUTPUTS, "mono", 0.05);
/* Devices */
- MCFG_CASSETTE_ADD( "cassette" )
+ CASSETTE(config, m_cass);
pia6821_device &pia(PIA6821(config, "pia", 0));
pia.readpa_handler().set(FUNC(tavernie_state::pa_r));
@@ -335,28 +336,27 @@ MACHINE_CONFIG_START(tavernie_state::cpu09)
clock_device &acia_clock(CLOCK(config, "acia_clock", 153600));
acia_clock.signal_handler().set("acia", FUNC(acia6850_device::write_txc));
acia_clock.signal_handler().append("acia", FUNC(acia6850_device::write_rxc));
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(tavernie_state::ivg09)
+void tavernie_state::ivg09(machine_config &config)
+{
cpu09(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(ivg09_mem)
+ m_maincpu->set_addrmap(AS_PROGRAM, &tavernie_state::ivg09_mem);
MCFG_MACHINE_RESET_OVERRIDE(tavernie_state, ivg09)
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(50)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */
- MCFG_SCREEN_SIZE(80*8, 25*10)
- MCFG_SCREEN_VISIBLE_AREA(0, 80*8-1, 0, 25*10-1)
- MCFG_SCREEN_UPDATE_DEVICE("crtc", mc6845_device, screen_update)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(50);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */
+ screen.set_size(80*8, 25*10);
+ screen.set_visarea(0, 80*8-1, 0, 25*10-1);
+ screen.set_screen_update("crtc", FUNC(mc6845_device::screen_update));
PALETTE(config, m_palette, palette_device::MONOCHROME);
config.set_default_layout(layout_tavernie);
/* sound hardware */
- MCFG_DEVICE_ADD("beeper", BEEP, 950) // guess
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.50)
+ BEEP(config, m_beep, 950).add_route(ALL_OUTPUTS, "mono", 0.50); // guess
/* Devices */
generic_keyboard_device &keyboard(GENERIC_KEYBOARD(config, "keyboard", 0));
@@ -371,12 +371,11 @@ MACHINE_CONFIG_START(tavernie_state::ivg09)
PIA6821(config, m_pia_ivg, 0);
m_pia_ivg->readpb_handler().set(FUNC(tavernie_state::pb_ivg_r));
m_pia_ivg->writepa_handler().set(FUNC(tavernie_state::pa_ivg_w));
- m_pia_ivg->cb2_handler().set("beeper", FUNC(beep_device::set_state));
+ m_pia_ivg->cb2_handler().set(m_beep, FUNC(beep_device::set_state));
FD1795(config, m_fdc, 8_MHz_XTAL / 8);
- MCFG_FLOPPY_DRIVE_ADD("fdc:0", ifd09_floppies, "525dd", floppy_image_device::default_floppy_formats)
- MCFG_FLOPPY_DRIVE_SOUND(true)
-MACHINE_CONFIG_END
+ FLOPPY_CONNECTOR(config, "fdc:0", ifd09_floppies, "525dd", floppy_image_device::default_floppy_formats).enable_sound(true);
+}
/* ROM definition */
ROM_START( cpu09 )
diff --git a/src/mame/drivers/taxidriv.cpp b/src/mame/drivers/taxidriv.cpp
index e7909ed1e83..fc3e0af0d8c 100644
--- a/src/mame/drivers/taxidriv.cpp
+++ b/src/mame/drivers/taxidriv.cpp
@@ -332,23 +332,23 @@ void taxidriv_state::taxidriv_palette(palette_device &palette) const
}
}
-MACHINE_CONFIG_START(taxidriv_state::taxidriv)
-
+void taxidriv_state::taxidriv(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80,4000000) /* 4 MHz ??? */
- MCFG_DEVICE_PROGRAM_MAP(main_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", taxidriv_state, irq0_line_hold)
+ Z80(config, m_maincpu, 4000000); /* 4 MHz ??? */
+ m_maincpu->set_addrmap(AS_PROGRAM, &taxidriv_state::main_map);
+ m_maincpu->set_vblank_int("screen", FUNC(taxidriv_state::irq0_line_hold));
- MCFG_DEVICE_ADD("sub", Z80,4000000) /* 4 MHz ??? */
- MCFG_DEVICE_PROGRAM_MAP(cpu2_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", taxidriv_state, irq0_line_hold) /* ??? */
+ z80_device &subcpu(Z80(config, "sub", 4000000)); /* 4 MHz ??? */
+ subcpu.set_addrmap(AS_PROGRAM, &taxidriv_state::cpu2_map);
+ subcpu.set_vblank_int("screen", FUNC(taxidriv_state::irq0_line_hold)); /* ??? */
- MCFG_DEVICE_ADD("audiocpu", Z80,4000000) /* 4 MHz ??? */
- MCFG_DEVICE_PROGRAM_MAP(cpu3_map)
- MCFG_DEVICE_IO_MAP(cpu3_port_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", taxidriv_state, irq0_line_hold) /* ??? */
+ z80_device &audiocpu(Z80(config, "audiocpu", 4000000)); /* 4 MHz ??? */
+ audiocpu.set_addrmap(AS_PROGRAM, &taxidriv_state::cpu3_map);
+ audiocpu.set_addrmap(AS_IO, &taxidriv_state::cpu3_port_map);
+ audiocpu.set_vblank_int("screen", FUNC(taxidriv_state::irq0_line_hold)); /* ??? */
- MCFG_QUANTUM_TIME(attotime::from_hz(6000)) /* 100 CPU slices per frame - an high value to ensure proper */
+ config.m_minimum_quantum = attotime::from_hz(6000); /* 100 CPU slices per frame - a high value to ensure proper */
/* synchronization of the CPUs */
i8255_device &ppi0(I8255A(config, "ppi8255_0"));
@@ -379,13 +379,13 @@ MACHINE_CONFIG_START(taxidriv_state::taxidriv)
ppi4.out_pc_callback().set(FUNC(taxidriv_state::p4c_w));
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(32*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 1*8, 27*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(taxidriv_state, screen_update)
- MCFG_SCREEN_PALETTE(m_palette)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(32*8, 32*8);
+ screen.set_visarea(0*8, 32*8-1, 1*8, 27*8-1);
+ screen.set_screen_update(FUNC(taxidriv_state::screen_update));
+ screen.set_palette(m_palette);
GFXDECODE(config, m_gfxdecode, m_palette, gfx_taxidriv);
PALETTE(config, m_palette, FUNC(taxidriv_state::taxidriv_palette), 16);
@@ -401,7 +401,7 @@ MACHINE_CONFIG_START(taxidriv_state::taxidriv)
ay8910_device &ay2(AY8910(config, "ay2", 1250000));
ay2.port_a_read_callback().set(FUNC(taxidriv_state::p8910_1a_r));
ay2.add_route(ALL_OUTPUTS, "mono", 0.25);
-MACHINE_CONFIG_END
+}
diff --git a/src/mame/drivers/tb303.cpp b/src/mame/drivers/tb303.cpp
index 8fb797b5e9d..88eb81972ce 100644
--- a/src/mame/drivers/tb303.cpp
+++ b/src/mame/drivers/tb303.cpp
@@ -23,8 +23,8 @@
class tb303_state : public hh_ucom4_state
{
public:
- tb303_state(const machine_config &mconfig, device_type type, const char *tag)
- : hh_ucom4_state(mconfig, type, tag)
+ tb303_state(const machine_config &mconfig, device_type type, const char *tag) :
+ hh_ucom4_state(mconfig, type, tag)
{ }
void tb303(machine_config &config);
@@ -249,8 +249,8 @@ void tb303_state::machine_start()
save_item(NAME(m_ram_we));
}
-MACHINE_CONFIG_START(tb303_state::tb303)
-
+void tb303_state::tb303(machine_config &config)
+{
/* basic machine hardware */
NEC_D650(config, m_maincpu, TP2_HZ);
m_maincpu->read_a().set(FUNC(tb303_state::input_r));
@@ -264,16 +264,18 @@ MACHINE_CONFIG_START(tb303_state::tb303)
m_maincpu->write_h().set(FUNC(tb303_state::switch_w));
m_maincpu->write_i().set(FUNC(tb303_state::strobe_w));
- MCFG_TIMER_DRIVER_ADD_PERIODIC("tp3_clock", tb303_state, tp3_clock, TP3_PERIOD)
- MCFG_TIMER_START_DELAY(TP3_PERIOD - TP3_LOW)
- MCFG_TIMER_DRIVER_ADD_PERIODIC("tp3_clear", tb303_state, tp3_clear, TP3_PERIOD)
+ timer_device &tp3_clock(TIMER(config, "tp3_clock"));
+ tp3_clock.configure_periodic(FUNC(tb303_state::tp3_clock), TP3_PERIOD);
+ tp3_clock.set_start_delay(TP3_PERIOD - TP3_LOW);
+ TIMER(config, "tp3_clear").configure_periodic(FUNC(tb303_state::tp3_clear), TP3_PERIOD);
+
+ TIMER(config, "display_decay").configure_periodic(FUNC(hh_ucom4_state::display_decay_tick), attotime::from_msec(1));
- MCFG_TIMER_DRIVER_ADD_PERIODIC("display_decay", hh_ucom4_state, display_decay_tick, attotime::from_msec(1))
config.set_default_layout(layout_tb303);
/* sound hardware */
// discrete...
-MACHINE_CONFIG_END
+}
diff --git a/src/mame/drivers/tbowl.cpp b/src/mame/drivers/tbowl.cpp
index d59a85e1c6f..9f28339519e 100644
--- a/src/mame/drivers/tbowl.cpp
+++ b/src/mame/drivers/tbowl.cpp
@@ -488,12 +488,12 @@ void tbowl_state::tbowl(machine_config &config)
/* something for the samples? */
MSM5205(config, m_msm1, 384000);
m_msm1->vck_legacy_callback().set(FUNC(tbowl_state::adpcm_int_1)); /* interrupt function */
- m_msm1->set_prescaler_selector(msm5205_device::S48_4B); /* 8KHz */
+ m_msm1->set_prescaler_selector(msm5205_device::S48_4B); /* 8KHz */
m_msm1->add_route(ALL_OUTPUTS, "mono", 0.50);
MSM5205(config, m_msm2, 384000);
m_msm2->vck_legacy_callback().set(FUNC(tbowl_state::adpcm_int_2)); /* interrupt function */
- m_msm2->set_prescaler_selector(msm5205_device::S48_4B); /* 8KHz */
+ m_msm2->set_prescaler_selector(msm5205_device::S48_4B); /* 8KHz */
m_msm2->add_route(ALL_OUTPUTS, "mono", 0.50);
}
diff --git a/src/mame/drivers/tceptor.cpp b/src/mame/drivers/tceptor.cpp
index 2318b9b015c..103e81d7186 100644
--- a/src/mame/drivers/tceptor.cpp
+++ b/src/mame/drivers/tceptor.cpp
@@ -374,7 +374,6 @@ void tceptor_state::tceptor(machine_config &config)
dac.add_route(ALL_OUTPUTS, "rspeaker", 0.4);
voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref", 0));
- vref.set_output(5.0);
vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT);
vref.add_route(0, "dac", -1.0, DAC_VREF_NEG_INPUT);
}
diff --git a/src/mame/drivers/tdv2324.cpp b/src/mame/drivers/tdv2324.cpp
index 319cae8ef5f..bb0bd3abf13 100644
--- a/src/mame/drivers/tdv2324.cpp
+++ b/src/mame/drivers/tdv2324.cpp
@@ -261,28 +261,29 @@ static void tdv2324_floppies(device_slot_interface &device)
//**************************************************************************
//-------------------------------------------------
-// MACHINE_CONFIG( tdv2324 )
+// machine_config( tdv2324 )
//-------------------------------------------------
-MACHINE_CONFIG_START(tdv2324_state::tdv2324)
+void tdv2324_state::tdv2324(machine_config &config)
+{
// basic system hardware
- MCFG_DEVICE_ADD(P8085AH_0_TAG, I8085A, 8700000/2) // ???
- MCFG_DEVICE_PROGRAM_MAP(tdv2324_mem)
- MCFG_DEVICE_IO_MAP(tdv2324_io)
+ I8085A(config, m_maincpu, 8700000/2); // ???
+ m_maincpu->set_addrmap(AS_PROGRAM, &tdv2324_state::tdv2324_mem);
+ m_maincpu->set_addrmap(AS_IO, &tdv2324_state::tdv2324_io);
- MCFG_DEVICE_ADD(P8085AH_1_TAG, I8085A, 8000000/2) // ???
- MCFG_DEVICE_PROGRAM_MAP(tdv2324_sub_mem)
- MCFG_DEVICE_IO_MAP(tdv2324_sub_io)
+ I8085A(config, m_subcpu, 8000000/2); // ???
+ m_subcpu->set_addrmap(AS_PROGRAM, &tdv2324_state::tdv2324_sub_mem);
+ m_subcpu->set_addrmap(AS_IO, &tdv2324_state::tdv2324_sub_io);
- MCFG_DEVICE_ADD(MC68B02P_TAG, M6802, 8000000/2) // ???
- MCFG_DEVICE_PROGRAM_MAP(tdv2324_fdc_mem)
+ M6802(config, m_fdccpu, 8000000/2); // ???
+ m_fdccpu->set_addrmap(AS_PROGRAM, &tdv2324_state::tdv2324_fdc_mem);
// video hardware
- MCFG_SCREEN_ADD_MONOCHROME(SCREEN_TAG, RASTER, rgb_t::green())
- MCFG_SCREEN_REFRESH_RATE(50)
- MCFG_SCREEN_UPDATE_DRIVER(tdv2324_state, screen_update)
- MCFG_SCREEN_SIZE(800, 400)
- MCFG_SCREEN_VISIBLE_AREA(0, 800-1, 0, 400-1)
+ screen_device &screen(SCREEN(config, SCREEN_TAG, SCREEN_TYPE_RASTER, rgb_t::green()));
+ screen.set_refresh_hz(50);
+ screen.set_screen_update(FUNC(tdv2324_state::screen_update));
+ screen.set_size(800, 400);
+ screen.set_visarea(0, 800-1, 0, 400-1);
PALETTE(config, "palette", palette_device::MONOCHROME);
@@ -298,15 +299,15 @@ MACHINE_CONFIG_START(tdv2324_state::tdv2324)
Z80SIO2(config, MK3887N4_TAG, 8000000/2);
FD1797(config, FD1797PL02_TAG, 8000000/4);
- MCFG_FLOPPY_DRIVE_ADD(FD1797PL02_TAG":0", tdv2324_floppies, "8dsdd", floppy_image_device::default_floppy_formats)
- MCFG_FLOPPY_DRIVE_ADD(FD1797PL02_TAG":1", tdv2324_floppies, "8dsdd", floppy_image_device::default_floppy_formats)
+ FLOPPY_CONNECTOR(config, FD1797PL02_TAG":0", tdv2324_floppies, "8dsdd", floppy_image_device::default_floppy_formats);
+ FLOPPY_CONNECTOR(config, FD1797PL02_TAG":1", tdv2324_floppies, "8dsdd", floppy_image_device::default_floppy_formats);
// internal ram
RAM(config, RAM_TAG).set_default_size("64K");
// software list
- MCFG_SOFTWARE_LIST_ADD("flop_list", "tdv2324")
-MACHINE_CONFIG_END
+ SOFTWARE_LIST(config, "flop_list").set_original("tdv2324");
+}
diff --git a/src/mame/drivers/tec1.cpp b/src/mame/drivers/tec1.cpp
index 6ebe2b360ba..7d24f438830 100644
--- a/src/mame/drivers/tec1.cpp
+++ b/src/mame/drivers/tec1.cpp
@@ -420,38 +420,39 @@ INPUT_PORTS_END
***************************************************************************/
-MACHINE_CONFIG_START(tec1_state::tec1)
+void tec1_state::tec1(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, 1000000) /* speed can be varied between 250kHz and 2MHz */
- MCFG_DEVICE_PROGRAM_MAP(tec1_map)
- MCFG_DEVICE_IO_MAP(tec1_io)
+ Z80(config, m_maincpu, 1000000); /* speed can be varied between 250kHz and 2MHz */
+ m_maincpu->set_addrmap(AS_PROGRAM, &tec1_state::tec1_map);
+ m_maincpu->set_addrmap(AS_IO, &tec1_state::tec1_io);
/* video hardware */
config.set_default_layout(layout_tec1);
/* sound hardware */
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("speaker", SPEAKER_SOUND)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.50)
-MACHINE_CONFIG_END
+ SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.50);
+}
-MACHINE_CONFIG_START(tec1_state::tecjmon)
+void tec1_state::tecjmon(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, XTAL(3'579'545) / 2)
- MCFG_DEVICE_PROGRAM_MAP(tecjmon_map)
- MCFG_DEVICE_IO_MAP(tecjmon_io)
+ Z80(config, m_maincpu, XTAL(3'579'545) / 2);
+ m_maincpu->set_addrmap(AS_PROGRAM, &tec1_state::tecjmon_map);
+ m_maincpu->set_addrmap(AS_IO, &tec1_state::tecjmon_io);
/* video hardware */
config.set_default_layout(layout_tec1);
/* sound hardware */
SPEAKER(config, "mono").front_center();
- SPEAKER_SOUND(config, "speaker").add_route(ALL_OUTPUTS, "mono", 0.50);
+ SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.50);
WAVE(config, "wave", "cassette").add_route(ALL_OUTPUTS, "mono", 0.05);
/* Devices */
- MCFG_CASSETTE_ADD( "cassette" )
-MACHINE_CONFIG_END
+ CASSETTE(config, m_cass);
+}
/***************************************************************************
diff --git a/src/mame/drivers/techno.cpp b/src/mame/drivers/techno.cpp
index b7d193944aa..46b7715023e 100644
--- a/src/mame/drivers/techno.cpp
+++ b/src/mame/drivers/techno.cpp
@@ -288,18 +288,20 @@ void techno_state::machine_reset()
m_maincpu->set_input_line(M68K_IRQ_1, CLEAR_LINE);
}
-MACHINE_CONFIG_START(techno_state::techno)
+void techno_state::techno(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M68000, XTAL(8'000'000))
- MCFG_DEVICE_PROGRAM_MAP(techno_map)
+ M68000(config, m_maincpu, XTAL(8'000'000));
+ m_maincpu->set_addrmap(AS_PROGRAM, &techno_state::techno_map);
+
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
- //MCFG_DEVICE_ADD("cpu2", TMS7000, XTAL(4'000'000))
- //MCFG_DEVICE_PROGRAM_MAP(techno_sub_map)
+ //tms7000_device &cpu2(TMS7000(config, "cpu2", XTAL(4'000'000)));
+ //cpu2.set_addrmap(AS_PROGRAM, &techno_state::techno_sub_map);
/* Video */
config.set_default_layout(layout_techno);
-MACHINE_CONFIG_END
+}
ROM_START(xforce)
ROM_REGION(0x10000, "maincpu", 0)
diff --git a/src/mame/drivers/tecmo.cpp b/src/mame/drivers/tecmo.cpp
index 1bd6b20a1ae..e22740d0f5d 100644
--- a/src/mame/drivers/tecmo.cpp
+++ b/src/mame/drivers/tecmo.cpp
@@ -1221,6 +1221,39 @@ ROM_END
ROM_START( gemini )
ROM_REGION( 0x20000, "maincpu", 0 )
+ ROM_LOAD( "4-5s", 0x00000, 0x10000, CRC(ce71e27a) SHA1(5aac0434edd39e444687d9988c7f49e0752a4900) ) /* c000-ffff is not used */
+ ROM_LOAD( "5-6s", 0x10000, 0x10000, CRC(216784a9) SHA1(ec74a3753e5b6384b875125ec0db7beea0a6aa6d) ) /* banked at f000-f7ff */
+
+ ROM_REGION( 0x10000, "soundcpu", 0 )
+ ROM_LOAD( "gw03-5h.rom", 0x0000, 0x8000, CRC(9bc79596) SHA1(61de9ddd45140e8ed88173294bd26147e2abfa21) )
+
+ ROM_REGION( 0x08000, "gfx1", 0 )
+ ROM_LOAD( "gw02-3h.rom", 0x00000, 0x08000, CRC(7acc8d35) SHA1(05056e9f077e7571b314390b508c72d56ad0f43b) ) /* characters */
+
+ ROM_REGION( 0x40000, "gfx2", 0 )
+ ROM_LOAD( "gw06-1c.rom", 0x00000, 0x10000, CRC(4ea51631) SHA1(9aee0f1ba210ac953dc193cfc739322966b6de8a) ) /* sprites */
+ ROM_LOAD( "gw07-1d.rom", 0x10000, 0x10000, CRC(da42637e) SHA1(9885c52823279f26871092c77bdbe027df08268f) ) /* sprites */
+ ROM_LOAD( "gw08-1f.rom", 0x20000, 0x10000, CRC(0b4e8d70) SHA1(55069f3df1c8db83f306d46b8262fd23585e6013) ) /* sprites */
+ ROM_LOAD( "gw09-1h.rom", 0x30000, 0x10000, CRC(b65c5e4c) SHA1(699e1a9e72b8d94edae7382ba119fe5da113514d) ) /* sprites */
+
+ ROM_REGION( 0x40000, "gfx3", 0 )
+ ROM_LOAD( "gw10-1n.rom", 0x00000, 0x10000, CRC(5e84cd4f) SHA1(e85320291027a16619c87fc2365448367bda454a) ) /* tiles #1 */
+ ROM_LOAD( "gw11-2na.rom", 0x10000, 0x10000, CRC(08b458e1) SHA1(b3426faa57dca51dc053db44fa4968425d8bf3ee) ) /* tiles #1 */
+ ROM_LOAD( "gw12-2nb.rom", 0x20000, 0x10000, CRC(229c9714) SHA1(f4f47d6b379c973c22f9ae7d7bec7041cdf3f737) ) /* tiles #1 */
+ ROM_LOAD( "gw13-3n.rom", 0x30000, 0x10000, CRC(c5dfaf47) SHA1(c3202ca8c7f3c5c7dc9acdc09c1c894e168ef9fe) ) /* tiles #1 */
+
+ ROM_REGION( 0x40000, "gfx4", 0 )
+ ROM_LOAD( "gw14-1r.rom", 0x00000, 0x10000, CRC(9c10e5b5) SHA1(a81399b85d8f3ddca26883ec3535cb9044c35ada) ) /* tiles #2 */
+ ROM_LOAD( "gw15-2ra.rom", 0x10000, 0x10000, CRC(4cd18cfa) SHA1(c197a098a7c1e5220aad039383a40702fe7c4f21) ) /* tiles #2 */
+ ROM_LOAD( "gw16-2rb.rom", 0x20000, 0x10000, CRC(f911c7be) SHA1(3f49f6c4734f2b644d93c4a54249aae6ff080e1d) ) /* tiles #2 */
+ ROM_LOAD( "gw17-3r.rom", 0x30000, 0x10000, CRC(79a9ce25) SHA1(74e3917b8e7a920ceb2135d7ef8fb2f2c5176b21) ) /* tiles #2 */
+
+ ROM_REGION( 0x8000, "adpcm", 0 ) /* ADPCM samples */
+ ROM_LOAD( "gw01-6a.rom", 0x0000, 0x8000, CRC(d78afa05) SHA1(b02a739b045f5cddf943ce59226ef234463eeebe) )
+ROM_END
+
+ROM_START( geminij )
+ ROM_REGION( 0x20000, "maincpu", 0 )
ROM_LOAD( "gw04-5s.rom", 0x00000, 0x10000, CRC(ff9de855) SHA1(34167af8456a081f68b338f10d4319ce1e703fd4) ) /* c000-ffff is not used */
ROM_LOAD( "gw05-6s.rom", 0x10000, 0x10000, CRC(5a6947a9) SHA1(18b7aeb0f0e2c396bc759118dd7c45fd6070b804) ) /* banked at f000-f7ff */
@@ -1320,8 +1353,9 @@ GAME( 1986, rygar, 0, rygar, rygar, tecmo_state, init_rygar,
GAME( 1986, rygar2, rygar, rygar, rygar, tecmo_state, init_rygar, ROT0, "Tecmo", "Rygar (US set 2)", MACHINE_SUPPORTS_SAVE )
GAME( 1986, rygar3, rygar, rygar, rygar, tecmo_state, init_rygar, ROT0, "Tecmo", "Rygar (US set 3 Old Version)", MACHINE_SUPPORTS_SAVE )
GAME( 1986, rygarj, rygar, rygar, rygar, tecmo_state, init_rygar, ROT0, "Tecmo", "Argus no Senshi (Japan)", MACHINE_SUPPORTS_SAVE )
-GAME( 1987, gemini, 0, gemini, gemini, tecmo_state, init_gemini, ROT90, "Tecmo", "Gemini Wing (Japan)", MACHINE_SUPPORTS_SAVE ) // Japan regional warning screen
-GAME( 1987, geminib, gemini, geminib, gemini, tecmo_state, init_gemini, ROT90, "bootleg", "Gemini Wing (bootleg)", MACHINE_SUPPORTS_SAVE ) // Japan regional warning screen
+GAME( 1987, gemini, 0, gemini, gemini, tecmo_state, init_gemini, ROT90, "Tecmo", "Gemini Wing (World)", MACHINE_SUPPORTS_SAVE ) // No regional "Warning, if you are playing ..." screen
+GAME( 1987, geminij, gemini, gemini, gemini, tecmo_state, init_gemini, ROT90, "Tecmo", "Gemini Wing (Japan)", MACHINE_SUPPORTS_SAVE ) // Japan regional warning screen
+GAME( 1987, geminib, gemini, geminib, gemini, tecmo_state, init_gemini, ROT90, "bootleg", "Gemini Wing (bootleg)", MACHINE_SUPPORTS_SAVE ) // regional warning screen is blanked (still get a delay)
GAME( 1988, silkworm, 0, silkworm, silkworm, tecmo_state, init_silkworm, ROT0, "Tecmo", "Silk Worm (World)", MACHINE_SUPPORTS_SAVE ) // No regional "Warning, if you are playing ..." screen
GAME( 1988, silkwormj, silkworm, silkworm, silkworm, tecmo_state, init_silkworm, ROT0, "Tecmo", "Silk Worm (Japan)", MACHINE_SUPPORTS_SAVE ) // Japan regional warning screen
GAME( 1988, silkwormp, silkworm, silkwormp, silkwormp, tecmo_state, init_silkworm, ROT0, "Tecmo", "Silk Worm (prototype)", MACHINE_SUPPORTS_SAVE ) // prototype
diff --git a/src/mame/drivers/tecmo16.cpp b/src/mame/drivers/tecmo16.cpp
index b836b3371c8..f2db7d3bb90 100644
--- a/src/mame/drivers/tecmo16.cpp
+++ b/src/mame/drivers/tecmo16.cpp
@@ -354,28 +354,28 @@ GFXDECODE_END
#define MASTER_CLOCK XTAL(24'000'000)
#define OKI_CLOCK XTAL(8'000'000)
-MACHINE_CONFIG_START(tecmo16_state::fstarfrc)
-
+void tecmo16_state::fstarfrc(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M68000,MASTER_CLOCK/2) /* 12MHz */
- MCFG_DEVICE_PROGRAM_MAP(fstarfrc_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", tecmo16_state, irq5_line_hold)
+ M68000(config, m_maincpu, MASTER_CLOCK/2); /* 12MHz */
+ m_maincpu->set_addrmap(AS_PROGRAM, &tecmo16_state::fstarfrc_map);
+ m_maincpu->set_vblank_int("screen", FUNC(tecmo16_state::irq5_line_hold));
- MCFG_DEVICE_ADD("audiocpu", Z80,MASTER_CLOCK/6) /* 4MHz */
- MCFG_DEVICE_PROGRAM_MAP(sound_map)
+ Z80(config, m_audiocpu, MASTER_CLOCK/6); /* 4MHz */
+ m_audiocpu->set_addrmap(AS_PROGRAM, &tecmo16_state::sound_map);
/* NMIs are triggered by the main CPU */
- MCFG_QUANTUM_TIME(attotime::from_hz(600))
+ config.m_minimum_quantum = attotime::from_hz(600);
/* video hardware */
BUFFERED_SPRITERAM16(config, m_spriteram);
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(32*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(tecmo16_state, screen_update)
- MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE("spriteram", buffered_spriteram16_device, vblank_copy_rising))
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_refresh_hz(60);
+ m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ m_screen->set_size(32*8, 32*8);
+ m_screen->set_visarea(0*8, 32*8-1, 2*8, 30*8-1);
+ m_screen->set_screen_update(FUNC(tecmo16_state::screen_update));
+ m_screen->screen_vblank().set(m_spriteram, FUNC(buffered_spriteram16_device::vblank_copy_rising));
GFXDECODE(config, m_gfxdecode, m_palette, gfx_tecmo16);
PALETTE(config, m_palette, palette_device::BLACK).set_format(palette_device::xBGR_444, 4096);
@@ -402,26 +402,27 @@ MACHINE_CONFIG_START(tecmo16_state::fstarfrc)
ymsnd.add_route(0, "lspeaker", 0.60);
ymsnd.add_route(1, "rspeaker", 0.60);
- MCFG_DEVICE_ADD("oki", OKIM6295, OKI_CLOCK/8, okim6295_device::PIN7_HIGH) // sample rate 1 MHz / 132
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 0.40)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 0.40)
-MACHINE_CONFIG_END
+ okim6295_device &oki(OKIM6295(config, "oki", OKI_CLOCK/8, okim6295_device::PIN7_HIGH)); // sample rate 1 MHz / 132
+ oki.add_route(ALL_OUTPUTS, "lspeaker", 0.40);
+ oki.add_route(ALL_OUTPUTS, "rspeaker", 0.40);
+}
-MACHINE_CONFIG_START(tecmo16_state::ginkun)
+void tecmo16_state::ginkun(machine_config &config)
+{
fstarfrc(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(ginkun_map)
+ m_maincpu->set_addrmap(AS_PROGRAM, &tecmo16_state::ginkun_map);
MCFG_VIDEO_START_OVERRIDE(tecmo16_state,ginkun)
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(tecmo16_state::riot)
+void tecmo16_state::riot(machine_config &config)
+{
ginkun(config);
/* basic machine hardware */
MCFG_VIDEO_START_OVERRIDE(tecmo16_state,riot)
-MACHINE_CONFIG_END
+}
/******************************************************************************/
diff --git a/src/mame/drivers/tecnbras.cpp b/src/mame/drivers/tecnbras.cpp
index 0af732566d4..a7c1dbb964b 100644
--- a/src/mame/drivers/tecnbras.cpp
+++ b/src/mame/drivers/tecnbras.cpp
@@ -119,7 +119,7 @@ void tecnbras_state::tecnbras(machine_config &config)
m_maincpu->set_addrmap(AS_IO, &tecnbras_state::i80c31_io);
m_maincpu->port_out_cb<1>().set_nop(); // buzzer ?
-/* TODO: Add an I2C RTC (Phillips PCF8583P)
+/* TODO: Add an I2C RTC (Philips PCF8583P)
pin 6 (SCL): cpu T0/P3.4 (pin 14)
pin 5 (SDA): cpu T1/P3.5 (pin 15)
*/
diff --git a/src/mame/drivers/tehkanwc.cpp b/src/mame/drivers/tehkanwc.cpp
index b6ef48f5862..84fcb199fc9 100644
--- a/src/mame/drivers/tehkanwc.cpp
+++ b/src/mame/drivers/tehkanwc.cpp
@@ -665,34 +665,34 @@ static GFXDECODE_START( gfx_tehkanwc )
GFXDECODE_END
-MACHINE_CONFIG_START(tehkanwc_state::tehkanwc)
-
+void tehkanwc_state::tehkanwc(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, 18432000/4) /* 18.432000 / 4 */
- MCFG_DEVICE_PROGRAM_MAP(main_mem)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", tehkanwc_state, irq0_line_hold)
+ Z80(config, m_maincpu, 18432000/4); /* 18.432000 / 4 */
+ m_maincpu->set_addrmap(AS_PROGRAM, &tehkanwc_state::main_mem);
+ m_maincpu->set_vblank_int("screen", FUNC(tehkanwc_state::irq0_line_hold));
- MCFG_DEVICE_ADD("sub", Z80, 18432000/4)
- MCFG_DEVICE_PROGRAM_MAP(sub_mem)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", tehkanwc_state, irq0_line_hold)
+ Z80(config, m_subcpu, 18432000/4);
+ m_subcpu->set_addrmap(AS_PROGRAM, &tehkanwc_state::sub_mem);
+ m_subcpu->set_vblank_int("screen", FUNC(tehkanwc_state::irq0_line_hold));
- MCFG_DEVICE_ADD("audiocpu", Z80, 18432000/4)
- MCFG_DEVICE_PROGRAM_MAP(sound_mem)
- MCFG_DEVICE_IO_MAP(sound_port)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", tehkanwc_state, irq0_line_hold)
+ Z80(config, m_audiocpu, 18432000/4);
+ m_audiocpu->set_addrmap(AS_PROGRAM, &tehkanwc_state::sound_mem);
+ m_audiocpu->set_addrmap(AS_IO, &tehkanwc_state::sound_port);
+ m_audiocpu->set_vblank_int("screen", FUNC(tehkanwc_state::irq0_line_hold));
- MCFG_QUANTUM_TIME(attotime::from_hz(600)) /* 10 CPU slices per frame - seems enough to keep the CPUs in sync */
+ config.m_minimum_quantum = attotime::from_hz(600); /* 10 CPU slices per frame - seems enough to keep the CPUs in sync */
WATCHDOG_TIMER(config, "watchdog");
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */)
- MCFG_SCREEN_SIZE(32*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(tehkanwc_state, screen_update)
- MCFG_SCREEN_PALETTE(m_palette)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */
+ screen.set_size(32*8, 32*8);
+ screen.set_visarea(0*8, 32*8-1, 2*8, 30*8-1);
+ screen.set_screen_update(FUNC(tehkanwc_state::screen_update));
+ screen.set_palette(m_palette);
GFXDECODE(config, m_gfxdecode, m_palette, gfx_tehkanwc);
PALETTE(config, m_palette).set_format(palette_device::xBGR_444, 768).set_endianness(ENDIANNESS_BIG);
@@ -713,11 +713,11 @@ MACHINE_CONFIG_START(tehkanwc_state::tehkanwc)
ay2.port_b_read_callback().set(FUNC(tehkanwc_state::portB_r));
ay2.add_route(ALL_OUTPUTS, "mono", 0.25);
- MCFG_DEVICE_ADD("msm", MSM5205, 384000)
- MCFG_MSM5205_VCLK_CB(WRITELINE(*this, tehkanwc_state, adpcm_int)) /* interrupt function */
- MCFG_MSM5205_PRESCALER_SELECTOR(S48_4B) /* 8KHz */
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.45)
-MACHINE_CONFIG_END
+ MSM5205(config, m_msm, 384000);
+ m_msm->vck_legacy_callback().set(FUNC(tehkanwc_state::adpcm_int)); /* interrupt function */
+ m_msm->set_prescaler_selector(msm5205_device::S48_4B); /* 8KHz */
+ m_msm->add_route(ALL_OUTPUTS, "mono", 0.45);
+}
void tehkanwc_state::tehkanwcb(machine_config &config)
{
@@ -733,7 +733,6 @@ void tehkanwc_state::tehkanwcb(machine_config &config)
ay2.add_route(ALL_OUTPUTS, "mono", 0.25);
}
-
void tehkanwc_state::init_teedoff()
{
/* Patch to avoid the game jumping in shared memory */
diff --git a/src/mame/drivers/tek405x.cpp b/src/mame/drivers/tek405x.cpp
index 162aba98841..db9a2572ac1 100644
--- a/src/mame/drivers/tek405x.cpp
+++ b/src/mame/drivers/tek405x.cpp
@@ -48,15 +48,10 @@ enum {
};
-
//**************************************************************************
// INTERRUPTS
//**************************************************************************
-//-------------------------------------------------
-// update_irq -
-//-------------------------------------------------
-
void tek4051_state::update_irq()
{
int state = m_kb_pia_irqa | m_kb_pia_irqb | m_x_pia_irqa | m_x_pia_irqb | m_gpib_pia_irqa | m_gpib_pia_irqb | m_com_pia_irqa | m_com_pia_irqb | m_acia_irq;
@@ -64,11 +59,6 @@ void tek4051_state::update_irq()
m_maincpu->set_input_line(INPUT_LINE_IRQ0, state);
}
-
-//-------------------------------------------------
-// update_nmi -
-//-------------------------------------------------
-
void tek4051_state::update_nmi()
{
int state = m_y_pia_irqa | m_y_pia_irqb | m_tape_pia_irqa | m_tape_pia_irqb;
@@ -77,39 +67,24 @@ void tek4051_state::update_nmi()
}
-
//**************************************************************************
// KEYBOARD
//**************************************************************************
-//-------------------------------------------------
-// scan_keyboard - scan keyboard
-//-------------------------------------------------
-
void tek4051_state::scan_keyboard()
{
}
-
-//-------------------------------------------------
-// TIMER_DEVICE_CALLBACK_MEMBER( keyboard_tick )
-//-------------------------------------------------
-
TIMER_DEVICE_CALLBACK_MEMBER(tek4051_state::keyboard_tick)
{
scan_keyboard();
}
-
//**************************************************************************
// MEMORY BANKING
//**************************************************************************
-//-------------------------------------------------
-// bankswitch -
-//-------------------------------------------------
-
void tek4051_state::bankswitch(uint8_t data)
{
address_space &program = m_maincpu->space(AS_PROGRAM);
@@ -136,7 +111,6 @@ void tek4051_state::bankswitch(uint8_t data)
}
}
-
WRITE8_MEMBER( tek4051_state::lbs_w )
{
/*
@@ -160,15 +134,10 @@ WRITE8_MEMBER( tek4051_state::lbs_w )
}
-
//**************************************************************************
// ADDRESS MAPS
//**************************************************************************
-//-------------------------------------------------
-// ADDRESS_MAP( tek4051_mem )
-//-------------------------------------------------
-
void tek4051_state::tek4051_mem(address_map &map)
{
map(0x0000, 0x1fff).ram();
@@ -189,25 +158,15 @@ void tek4051_state::tek4051_mem(address_map &map)
map(0xa800, 0xffff).rom().region(MC6800_TAG, 0x2800);
}
-
-//-------------------------------------------------
-// ADDRESS_MAP( tek4052_mem )
-//-------------------------------------------------
-
void tek4052_state::tek4052_mem(address_map &map)
{
}
-
//**************************************************************************
// INPUT PORTS
//**************************************************************************
-//-------------------------------------------------
-// INPUT_PORTS( tek4051 )
-//-------------------------------------------------
-
static INPUT_PORTS_START( tek4051 )
PORT_START("Y0")
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD )
@@ -377,7 +336,6 @@ static INPUT_PORTS_START( tek4051 )
INPUT_PORTS_END
-
//**************************************************************************
// VIDEO
//**************************************************************************
@@ -392,7 +350,6 @@ void tek4052_state::video_start()
}
-
//**************************************************************************
// DEVICE CONFIGURATION
//**************************************************************************
@@ -721,7 +678,6 @@ WRITE_LINE_MEMBER( tek4051_state::tape_pia_irqb_w )
update_nmi();
}
-
WRITE8_MEMBER( tek4051_state::dio_w )
{
/*
@@ -842,7 +798,6 @@ WRITE_LINE_MEMBER( tek4051_state::gpib_pia_irqb_w )
update_irq();
}
-
WRITE8_MEMBER( tek4051_state::com_pia_pa_w )
{
/*
@@ -934,7 +889,6 @@ WRITE_LINE_MEMBER( tek4051_state::com_pia_irqb_w )
update_irq();
}
-
WRITE_LINE_MEMBER( tek4051_state::acia_irq_w )
{
m_acia_irq = state;
@@ -952,10 +906,6 @@ WRITE_LINE_MEMBER( tek4051_state::write_acia_clock )
// MACHINE INITIALIZATION
//**************************************************************************
-//-------------------------------------------------
-// MACHINE_START( tek4051 )
-//-------------------------------------------------
-
void tek4051_state::machine_start()
{
m_lamps.resolve();
@@ -981,48 +931,39 @@ void tek4051_state::machine_start()
// register for state saving
}
-
-//-------------------------------------------------
-// MACHINE_START( tek4052 )
-//-------------------------------------------------
-
void tek4052_state::machine_start()
{
}
-
//**************************************************************************
// MACHINE CONFIGURATION
//**************************************************************************
-//-------------------------------------------------
-// MACHINE_CONFIG( tek4051 )
-//-------------------------------------------------
-
-MACHINE_CONFIG_START(tek4051_state::tek4051)
+void tek4051_state::tek4051(machine_config &config)
+{
// basic machine hardware
- MCFG_DEVICE_ADD(MC6800_TAG, M6800, XTAL(12'500'000)/15)
- MCFG_DEVICE_PROGRAM_MAP(tek4051_mem)
+ M6800(config, m_maincpu, XTAL(12'500'000)/15);
+ m_maincpu->set_addrmap(AS_PROGRAM, &tek4051_state::tek4051_mem);
// video hardware
- MCFG_VECTOR_ADD("vector")
- MCFG_SCREEN_ADD_MONOCHROME(SCREEN_TAG, VECTOR, rgb_t::green())
- MCFG_SCREEN_REFRESH_RATE(50)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) // not accurate
- MCFG_SCREEN_SIZE(1024, 780)
- MCFG_SCREEN_VISIBLE_AREA(0, 1024-1, 0, 780-1)
- MCFG_SCREEN_UPDATE_DEVICE("vector", vector_device, screen_update)
+ VECTOR(config, "vector", 0);
+ screen_device &screen(SCREEN(config, SCREEN_TAG, SCREEN_TYPE_VECTOR));
+ screen.set_color(rgb_t::green());
+ screen.set_refresh_hz(50);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500)); // not accurate
+ screen.set_size(1024, 780);
+ screen.set_visarea(0, 1024-1, 0, 780-1);
+ screen.set_screen_update("vector", FUNC(vector_device::screen_update));
PALETTE(config, "palette", palette_device::MONOCHROME);
// sound hardware
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("speaker", SPEAKER_SOUND)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25)
+ SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25);
// devices
- MCFG_TIMER_DRIVER_ADD_PERIODIC("keyboard", tek4051_state, keyboard_tick, attotime::from_hz(XTAL(12'500'000)/15/4))
+ TIMER(config, "keyboard").configure_periodic(FUNC(tek4051_state::keyboard_tick), attotime::from_hz(XTAL(12'500'000)/15/4));
pia6821_device &piax(PIA6821(config, MC6820_X_TAG, 0));
piax.readpa_handler().set(FUNC(tek4051_state::x_pia_pa_r));
@@ -1085,67 +1026,59 @@ MACHINE_CONFIG_START(tek4051_state::tek4051)
ACIA6850(config, m_acia, 0);
m_acia->irq_handler().set(FUNC(tek4051_state::acia_irq_w));
- MCFG_DEVICE_ADD("acia_clock", CLOCK, 38400)
- MCFG_CLOCK_SIGNAL_HANDLER(WRITELINE(*this, tek4051_state, write_acia_clock))
+ CLOCK(config, m_acia_clock, 38400);
+ m_acia_clock->signal_handler().set(FUNC(tek4051_state::write_acia_clock));
- MCFG_IEEE488_BUS_ADD()
- MCFG_IEEE488_EOI_CALLBACK(WRITELINE(MC6820_GPIB_TAG, pia6821_device, ca1_w))
- MCFG_IEEE488_SRQ_CALLBACK(WRITELINE(MC6820_GPIB_TAG, pia6821_device, cb1_w))
+ IEEE488(config, m_gpib);
+ m_gpib->eoi_callback().set(MC6820_GPIB_TAG, FUNC(pia6821_device::ca1_w));
+ m_gpib->srq_callback().set(MC6820_GPIB_TAG, FUNC(pia6821_device::cb1_w));
// internal ram
RAM(config, RAM_TAG).set_default_size("8K").set_extra_options("16K,24K,32K");
// cartridge
- MCFG_GENERIC_CARTSLOT_ADD("cartslot1", generic_plain_slot, "tek4050_cart")
- MCFG_GENERIC_CARTSLOT_ADD("cartslot2", generic_plain_slot, "tek4050_cart")
-MACHINE_CONFIG_END
-
-
-//-------------------------------------------------
-// MACHINE_CONFIG( tek4052 )
-//-------------------------------------------------
+ GENERIC_CARTSLOT(config, "cartslot1", generic_plain_slot, "tek4050_cart");
+ GENERIC_CARTSLOT(config, "cartslot2", generic_plain_slot, "tek4050_cart");
+}
-MACHINE_CONFIG_START(tek4052_state::tek4052)
+void tek4052_state::tek4052(machine_config &config)
+{
// basic machine hardware
- MCFG_DEVICE_ADD(AM2901A_TAG, M6800, 1000000) // should be 4x AM2901A + AM2911
- MCFG_DEVICE_PROGRAM_MAP(tek4052_mem)
+ m6800_cpu_device &cpu(M6800(config, AM2901A_TAG, 1000000)); // should be 4x AM2901A + AM2911
+ cpu.set_addrmap(AS_PROGRAM, &tek4052_state::tek4052_mem);
// video hardware
- MCFG_VECTOR_ADD("vector")
- MCFG_SCREEN_ADD_MONOCHROME(SCREEN_TAG, VECTOR, rgb_t::green())
- MCFG_SCREEN_REFRESH_RATE(50)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) // not accurate
- MCFG_SCREEN_SIZE(1024, 780)
- MCFG_SCREEN_VISIBLE_AREA(0, 1024-1, 0, 780-1)
- MCFG_SCREEN_UPDATE_DEVICE("vector", vector_device, screen_update)
+ VECTOR(config, "vector", 0);
+ screen_device &screen(SCREEN(config, SCREEN_TAG, SCREEN_TYPE_VECTOR));
+ screen.set_color(rgb_t::green());
+ screen.set_refresh_hz(50);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500)); // not accurate
+ screen.set_size(1024, 780);
+ screen.set_visarea(0, 1024-1, 0, 780-1);
+ screen.set_screen_update("vector", FUNC(vector_device::screen_update));
PALETTE(config, "palette", palette_device::MONOCHROME);
// sound hardware
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("speaker", SPEAKER_SOUND)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25)
+ SPEAKER_SOUND(config, "speaker").add_route(ALL_OUTPUTS, "mono", 0.25);
// internal ram
RAM(config, RAM_TAG).set_default_size("32K").set_extra_options("64K");
// cartridge
- MCFG_GENERIC_CARTSLOT_ADD("cartslot1", generic_plain_slot, "tek4050_cart")
- MCFG_GENERIC_CARTSLOT_ADD("cartslot2", generic_plain_slot, "tek4050_cart")
+ GENERIC_CARTSLOT(config, "cartslot1", generic_plain_slot, "tek4050_cart");
+ GENERIC_CARTSLOT(config, "cartslot2", generic_plain_slot, "tek4050_cart");
// software lists
- MCFG_SOFTWARE_LIST_ADD("cart_list", "tek4052_cart")
-MACHINE_CONFIG_END
-
+ SOFTWARE_LIST(config, "cart_list").set_original("tek4052_cart");
+}
-//-------------------------------------------------
-// MACHINE_CONFIG( tek4054 )
-//-------------------------------------------------
/*
-MACHINE_CONFIG_START(tek4054_state::tek4054)
- MCFG_SCREEN_SIZE(4096, 3125)
- MCFG_SCREEN_VISIBLE_AREA(0, 4096-1, 0, 3125-1)
-MACHINE_CONFIG_END
+void tek4054_state::tek4054(machine_config &config)
+{
+ // screen size: 4096, 3125
+}
*/
@@ -1154,10 +1087,6 @@ MACHINE_CONFIG_END
// ROMS
//**************************************************************************
-//-------------------------------------------------
-// ROM( tek4051 )
-//-------------------------------------------------
-
ROM_START( tek4051 )
ROM_REGION( 0x8000, MC6800_TAG, 0 )
ROM_LOAD( "156-0659-xx.u585", 0x0000, 0x0800, CRC(0017ba54) SHA1(533bfacb2e698c1df88a00acce6df6a8c536239d) ) // -01 or -02 ?
@@ -1202,11 +1131,6 @@ ROM_START( tek4051 )
*/
ROM_END
-
-//-------------------------------------------------
-// ROM( tek4052a )
-//-------------------------------------------------
-
ROM_START( tek4052a )
ROM_REGION( 0x3800, AM2901A_TAG, 0 ) // ALU 670-7705-00 microcode
ROM_LOAD( "160-1689-00.u340", 0x0000, 0x0800, CRC(97ff62d4) SHA1(e25b495fd1b3f8a5bfef5c8f20efacde8366e89c) )
diff --git a/src/mame/drivers/tek410x.cpp b/src/mame/drivers/tek410x.cpp
index 17fbbbe9dfd..c70f2a6fec4 100644
--- a/src/mame/drivers/tek410x.cpp
+++ b/src/mame/drivers/tek410x.cpp
@@ -30,15 +30,17 @@ class tek4107a_state : public driver_device
{
public:
tek4107a_state(const machine_config &mconfig, device_type type, const char *tag)
- : driver_device(mconfig, type, tag) { }
+ : driver_device(mconfig, type, tag)
+ { }
void tek4109a(machine_config &config);
void tek4107a(machine_config &config);
-private:
+protected:
virtual void machine_start() override;
-
virtual void video_start() override;
+
+private:
uint32_t screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
void tek4107a_io(address_map &map);
void tek4107a_mem(address_map &map);
@@ -95,30 +97,32 @@ void tek4107a_state::machine_start()
/* Machine Driver */
-MACHINE_CONFIG_START(tek4107a_state::tek4107a)
+void tek4107a_state::tek4107a(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD(I80188_TAG, I80188, 21000000)
- MCFG_DEVICE_PROGRAM_MAP(tek4107a_mem)
- MCFG_DEVICE_IO_MAP(tek4107a_io)
+ i80188_cpu_device &maincpu(I80188(config, I80188_TAG, 21000000));
+ maincpu.set_addrmap(AS_PROGRAM, &tek4107a_state::tek4107a_mem);
+ maincpu.set_addrmap(AS_IO, &tek4107a_state::tek4107a_io);
/* video hardware */
- MCFG_SCREEN_ADD(SCREEN_TAG, RASTER)
- MCFG_SCREEN_REFRESH_RATE(50)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */
- MCFG_SCREEN_UPDATE_DRIVER(tek4107a_state, screen_update)
- MCFG_SCREEN_SIZE(640, 480)
- MCFG_SCREEN_VISIBLE_AREA(0, 640-1, 0, 480-1)
-
- MCFG_PALETTE_ADD("palette", 64)
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_tek4107a)
-MACHINE_CONFIG_END
-
-MACHINE_CONFIG_START(tek4107a_state::tek4109a)
+ screen_device &screen(SCREEN(config, SCREEN_TAG, SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(50);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */
+ screen.set_screen_update(FUNC(tek4107a_state::screen_update));
+ screen.set_size(640, 480);
+ screen.set_visarea(0, 640-1, 0, 480-1);
+
+ PALETTE(config, "palette").set_entries(64);
+ GFXDECODE(config, "gfxdecode", "palette", gfx_tek4107a);
+}
+
+void tek4107a_state::tek4109a(machine_config &config)
+{
tek4107a(config);
+
/* video hardware */
- MCFG_DEVICE_MODIFY("palette")
- MCFG_PALETTE_ENTRIES(4096)
-MACHINE_CONFIG_END
+ subdevice<palette_device>("palette")->set_entries(4096);
+}
/* ROMs */
diff --git a/src/mame/drivers/tek440x.cpp b/src/mame/drivers/tek440x.cpp
index 82ae82e2174..3d43d6f98c3 100644
--- a/src/mame/drivers/tek440x.cpp
+++ b/src/mame/drivers/tek440x.cpp
@@ -159,7 +159,7 @@ void tek440x_state::maincpu_map(address_map &map)
map(0x780000, 0x781fff).ram(); // map registers
// 782000-783fff: video address registers
// 784000-785fff: video control registers
- map(0x788000, 0x788000).w("snsnd", FUNC(sn76496_device::command_w));
+ map(0x788000, 0x788000).w("snsnd", FUNC(sn76496_device::write));
// 78a000-78bfff: NS32081 FPU
map(0x78c000, 0x78c007).rw("aica", FUNC(mos6551_device::read), FUNC(mos6551_device::write)).umask16(0xff00);
// 7b1000-7b2fff: diagnostic registers
@@ -193,24 +193,24 @@ INPUT_PORTS_END
*
*************************************/
-MACHINE_CONFIG_START(tek440x_state::tek4404)
-
+void tek440x_state::tek4404(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M68010, 40_MHz_XTAL / 4) // MC68010L10
- MCFG_DEVICE_PROGRAM_MAP(maincpu_map)
+ M68010(config, m_maincpu, 40_MHz_XTAL / 4); // MC68010L10
+ m_maincpu->set_addrmap(AS_PROGRAM, &tek440x_state::maincpu_map);
- MCFG_DEVICE_ADD("fdccpu", M6502, 1000000)
- MCFG_DEVICE_PROGRAM_MAP(fdccpu_map)
+ M6502(config, m_fdccpu, 1000000);
+ m_fdccpu->set_addrmap(AS_PROGRAM, &tek440x_state::fdccpu_map);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_VIDEO_ATTRIBUTES(VIDEO_UPDATE_BEFORE_VBLANK)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */)
- MCFG_SCREEN_SIZE(640, 480)
- MCFG_SCREEN_VISIBLE_AREA(0, 639, 0, 479)
- MCFG_SCREEN_UPDATE_DRIVER(tek440x_state, screen_update)
- MCFG_SCREEN_PALETTE("palette")
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_video_attributes(VIDEO_UPDATE_BEFORE_VBLANK);
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500) /* not accurate */);
+ screen.set_size(640, 480);
+ screen.set_visarea(0, 639, 0, 479);
+ screen.set_screen_update(FUNC(tek440x_state::screen_update));
+ screen.set_palette("palette");
PALETTE(config, "palette", palette_device::MONOCHROME);
mos6551_device &aica(MOS6551(config, "aica", 0));
@@ -227,9 +227,8 @@ MACHINE_CONFIG_START(tek440x_state::tek4404)
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("snsnd", SN76496, VIDEO_CLOCK / 8)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.80)
-MACHINE_CONFIG_END
+ SN76496(config, "snsnd", VIDEO_CLOCK / 8).add_route(ALL_OUTPUTS, "mono", 0.80);
+}
diff --git a/src/mame/drivers/tekxp33x.cpp b/src/mame/drivers/tekxp33x.cpp
index de2e0d3aad0..ed2e4bb74f1 100644
--- a/src/mame/drivers/tekxp33x.cpp
+++ b/src/mame/drivers/tekxp33x.cpp
@@ -97,25 +97,26 @@ void tekxp330_state::machine_start()
/* Machine Driver */
-MACHINE_CONFIG_START(tekxp330_state::tekxp330)
+void tekxp330_state::tekxp330(machine_config &config)
+{
/* basic machine hardware */
r3052e_device &maincpu(R3052E(config, "maincpu", XTAL(20'000'000))); /* IDT 79R3052E, clock unknown */
maincpu.set_endianness(ENDIANNESS_BIG);
maincpu.set_addrmap(AS_PROGRAM, &tekxp330_state::cpu_map);
- MCFG_DEVICE_ADD("tms", TMS34010, XTAL(40'000'000)) /* clock unknown */
- MCFG_DEVICE_PROGRAM_MAP(tms_map)
+ tms34010_device &tms(TMS34010(config, "tms", XTAL(40'000'000))); /* clock unknown */
+ tms.set_addrmap(AS_PROGRAM, &tekxp330_state::tms_map);
/* video hardware */
- MCFG_SCREEN_ADD(SCREEN_TAG, RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */
- MCFG_SCREEN_UPDATE_DRIVER(tekxp330_state, screen_update)
- MCFG_SCREEN_SIZE(640, 480)
- MCFG_SCREEN_VISIBLE_AREA(0, 640-1, 0, 480-1)
-
- MCFG_PALETTE_ADD("palette", 64)
-MACHINE_CONFIG_END
+ screen_device &screen(SCREEN(config, SCREEN_TAG, SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */
+ screen.set_screen_update(FUNC(tekxp330_state::screen_update));
+ screen.set_size(640, 480);
+ screen.set_visarea(0, 640-1, 0, 480-1);
+
+ PALETTE(config, "palette").set_entries(64);
+}
/* ROMs */
diff --git a/src/mame/drivers/tempest.cpp b/src/mame/drivers/tempest.cpp
index fa19a262031..1f8253a8695 100644
--- a/src/mame/drivers/tempest.cpp
+++ b/src/mame/drivers/tempest.cpp
@@ -472,7 +472,7 @@ WRITE8_MEMBER(tempest_state::earom_control_w)
READ8_MEMBER(tempest_state::rom_ae1f_r)
{
// This is needed to ensure that the routine starting at ae1c passes checks and does not corrupt data;
- // MCFG_QUANTUM_PERFECT_CPU("maincpu") would be very taxing on this driver.
+ // config.m_perfect_cpu_quantum = subtag("maincpu"); would be very taxing on this driver.
machine().scheduler().boost_interleave(attotime::zero, attotime::from_usec(100));
machine().scheduler().abort_timeslice();
diff --git a/src/mame/drivers/terco.cpp b/src/mame/drivers/terco.cpp
index a169121c0f6..c4257a95d8f 100644
--- a/src/mame/drivers/terco.cpp
+++ b/src/mame/drivers/terco.cpp
@@ -295,15 +295,16 @@ void t4490_state::t4490_map(address_map &map)
static INPUT_PORTS_START( t4490 )
INPUT_PORTS_END
-MACHINE_CONFIG_START(t4490_state::t4490)
- MCFG_DEVICE_ADD("maincpu", M6800, XTAL(8'000'000)/4) // divided by a MC6875
- MCFG_DEVICE_PROGRAM_MAP(t4490_map)
+void t4490_state::t4490(machine_config &config)
+{
+ M6800(config, m_maincpu, XTAL(8'000'000)/4); // divided by a MC6875
+ m_maincpu->set_addrmap(AS_PROGRAM, &t4490_state::t4490_map);
/* devices */
- MCFG_DEVICE_ADD("pia1", PIA6821, 0)
- MCFG_DEVICE_ADD("pia2", PIA6821, 0)
- MCFG_DEVICE_ADD("acia", ACIA6850, 0)
-MACHINE_CONFIG_END
+ PIA6821(config, m_pia1, 0);
+ PIA6821(config, m_pia2, 0);
+ ACIA6850(config, "acia", 0);
+}
ROM_START( t4490 )
ROM_REGION(0x10000, "maincpu", 0)
diff --git a/src/mame/drivers/terminal.cpp b/src/mame/drivers/terminal.cpp
index 202ce67e470..3cb8670861c 100644
--- a/src/mame/drivers/terminal.cpp
+++ b/src/mame/drivers/terminal.cpp
@@ -45,10 +45,11 @@ static INPUT_PORTS_START( terminal )
INPUT_PORTS_END
-MACHINE_CONFIG_START( terminal_state::terminal )
- MCFG_DEVICE_ADD("maincpu", I8031, 12'000'000)
- MCFG_DEVICE_PROGRAM_MAP(mem_map)
-MACHINE_CONFIG_END
+void terminal_state::terminal(machine_config &config)
+{
+ I8031(config, m_maincpu, 12'000'000);
+ m_maincpu->set_addrmap(AS_PROGRAM, &terminal_state::mem_map);
+}
/* ROM definition */
diff --git a/src/mame/drivers/terracre.cpp b/src/mame/drivers/terracre.cpp
index 065d931c2c5..745c79bf475 100644
--- a/src/mame/drivers/terracre.cpp
+++ b/src/mame/drivers/terracre.cpp
@@ -454,26 +454,27 @@ static GFXDECODE_START( gfx_terracre )
GFXDECODE_END
-MACHINE_CONFIG_START(terracre_state::ym3526)
- MCFG_DEVICE_ADD("maincpu", M68000, XTAL(16'000'000)/2) // 8mhz
- MCFG_DEVICE_PROGRAM_MAP(terracre_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", terracre_state, irq1_line_hold)
-
- MCFG_DEVICE_ADD("audiocpu", Z80, XTAL(16'000'000)/4) // 4.0mhz when compared to sound recordings, should be derived from XTAL(22'000'000)? how?
- MCFG_DEVICE_PROGRAM_MAP(sound_map)
- MCFG_DEVICE_IO_MAP(sound_3526_io_map)
- MCFG_DEVICE_PERIODIC_INT_DRIVER(terracre_state, irq0_line_hold, XTAL(16'000'000)/4/512) // ?
-
- MCFG_DEVICE_ADD("spriteram", BUFFERED_SPRITERAM16)
-
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE( 60 )
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */)
- MCFG_SCREEN_SIZE(32*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(terracre_state, screen_update_amazon)
- MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE("spriteram", buffered_spriteram16_device, vblank_copy_rising))
- MCFG_SCREEN_PALETTE(m_palette)
+void terracre_state::ym3526(machine_config &config)
+{
+ M68000(config, m_maincpu, XTAL(16'000'000)/2); // 8mhz
+ m_maincpu->set_addrmap(AS_PROGRAM, &terracre_state::terracre_map);
+ m_maincpu->set_vblank_int("screen", FUNC(terracre_state::irq1_line_hold));
+
+ z80_device &audiocpu(Z80(config, "audiocpu", XTAL(16'000'000)/4)); // 4.0mhz when compared to sound recordings, should be derived from XTAL(22'000'000)? how?
+ audiocpu.set_addrmap(AS_PROGRAM, &terracre_state::sound_map);
+ audiocpu.set_addrmap(AS_IO, &terracre_state::sound_3526_io_map);
+ audiocpu.set_periodic_int(FUNC(terracre_state::irq0_line_hold), attotime::from_hz(XTAL(16'000'000)/4/512)); // ?
+
+ BUFFERED_SPRITERAM16(config, m_spriteram);
+
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500) /* not accurate */);
+ screen.set_size(32*8, 32*8);
+ screen.set_visarea(0*8, 32*8-1, 2*8, 30*8-1);
+ screen.set_screen_update(FUNC(terracre_state::screen_update_amazon));
+ screen.screen_vblank().set(m_spriteram, FUNC(buffered_spriteram16_device::vblank_copy_rising));
+ screen.set_palette(m_palette);
GFXDECODE(config, m_gfxdecode, m_palette, gfx_terracre);
PALETTE(config, m_palette, FUNC(terracre_state::terracre_palette), 1*16+16*16+16*256, 256);
@@ -482,43 +483,42 @@ MACHINE_CONFIG_START(terracre_state::ym3526)
GENERIC_LATCH_8(config, m_soundlatch);
- MCFG_DEVICE_ADD("ymsnd", YM3526, XTAL(16'000'000)/4)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 1.0)
+ YM3526(config, "ymsnd", XTAL(16'000'000)/4).add_route(ALL_OUTPUTS, "speaker", 1.0);
- MCFG_DEVICE_ADD("dac1", DAC_8BIT_R2R, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 0.5) // unknown DAC
- MCFG_DEVICE_ADD("dac2", DAC_8BIT_R2R, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 0.5) // unknown DAC
- MCFG_DEVICE_ADD("vref", VOLTAGE_REGULATOR, 0) MCFG_VOLTAGE_REGULATOR_OUTPUT(5.0)
- MCFG_SOUND_ROUTE(0, "dac1", 1.0, DAC_VREF_POS_INPUT) MCFG_SOUND_ROUTE(0, "dac1", -1.0, DAC_VREF_NEG_INPUT)
- MCFG_SOUND_ROUTE(0, "dac2", 1.0, DAC_VREF_POS_INPUT) MCFG_SOUND_ROUTE(0, "dac2", -1.0, DAC_VREF_NEG_INPUT)
-MACHINE_CONFIG_END
+ DAC_8BIT_R2R(config, "dac1", 0).add_route(ALL_OUTPUTS, "speaker", 0.5); // unknown DAC
+ DAC_8BIT_R2R(config, "dac2", 0).add_route(ALL_OUTPUTS, "speaker", 0.5); // unknown DAC
+ voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref"));
+ vref.add_route(0, "dac1", 1.0, DAC_VREF_POS_INPUT); vref.add_route(0, "dac1", -1.0, DAC_VREF_NEG_INPUT);
+ vref.add_route(0, "dac2", 1.0, DAC_VREF_POS_INPUT); vref.add_route(0, "dac2", -1.0, DAC_VREF_NEG_INPUT);
+}
-MACHINE_CONFIG_START(terracre_state::ym2203)
+void terracre_state::ym2203(machine_config &config)
+{
ym3526(config);
- MCFG_DEVICE_MODIFY("audiocpu")
- MCFG_DEVICE_IO_MAP(sound_2203_io_map)
+ subdevice<z80_device>("audiocpu")->set_addrmap(AS_IO, &terracre_state::sound_2203_io_map);
- MCFG_DEVICE_REMOVE("ymsnd")
+ config.device_remove("ymsnd");
- MCFG_DEVICE_ADD("ym1", YM2203, XTAL(16'000'000)/4)
- MCFG_SOUND_ROUTE(0, "speaker", 0.2)
- MCFG_SOUND_ROUTE(1, "speaker", 0.2)
- MCFG_SOUND_ROUTE(2, "speaker", 0.2)
- MCFG_SOUND_ROUTE(3, "speaker", 0.4)
-MACHINE_CONFIG_END
+ ym2203_device &ym1(YM2203(config, "ym1", XTAL(16'000'000)/4));
+ ym1.add_route(0, "speaker", 0.2);
+ ym1.add_route(1, "speaker", 0.2);
+ ym1.add_route(2, "speaker", 0.2);
+ ym1.add_route(3, "speaker", 0.4);
+}
-MACHINE_CONFIG_START(terracre_state::amazon_base)
+void terracre_state::amazon_base(machine_config &config)
+{
ym3526(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(amazon_base_map)
-MACHINE_CONFIG_END
+ m_maincpu->set_addrmap(AS_PROGRAM, &terracre_state::amazon_base_map);
+}
-MACHINE_CONFIG_START(amazon_state::amazon_1412m2)
+void amazon_state::amazon_1412m2(machine_config &config)
+{
amazon_base(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(amazon_1412m2_map)
+ m_maincpu->set_addrmap(AS_PROGRAM, &amazon_state::amazon_1412m2_map);
NB1412M2(config, m_prot, XTAL(16'000'000)); // divided by 4 maybe
-MACHINE_CONFIG_END
+}
/**************************************
diff --git a/src/mame/drivers/testconsole.cpp b/src/mame/drivers/testconsole.cpp
index f9e118cc6c2..43d2511eb1b 100644
--- a/src/mame/drivers/testconsole.cpp
+++ b/src/mame/drivers/testconsole.cpp
@@ -175,29 +175,30 @@ INPUT_PORTS_START(whousetc)
INPUT_PORTS_END
-MACHINE_CONFIG_START(whouse_testcons_state::whousetc)
- MCFG_DEVICE_ADD("maincpu", I8085A, 6.144_MHz_XTAL)
- MCFG_DEVICE_PROGRAM_MAP(program_map)
- MCFG_DEVICE_IO_MAP(io_map)
+void whouse_testcons_state::whousetc(machine_config &config)
+{
+ i8085a_cpu_device &maincpu(I8085A(config, "maincpu", 6.144_MHz_XTAL));
+ maincpu.set_addrmap(AS_PROGRAM, &whouse_testcons_state::program_map);
+ maincpu.set_addrmap(AS_IO, &whouse_testcons_state::io_map);
I8155(config, "i8155", 6.144_MHz_XTAL);
- MCFG_DEVICE_ADD("i8255", I8255, 0)
+ I8255(config, "i8255", 0);
- MCFG_DEVICE_ADD("dsp0", DL1416B, u32(0))
- MCFG_DL1416_UPDATE_HANDLER(WRITE16(*this, whouse_testcons_state, update_dsp<0>))
+ DL1416B(config, m_dsp[0], u32(0));
+ m_dsp[0]->update().set(FUNC(whouse_testcons_state::update_dsp<0>));
- MCFG_DEVICE_ADD("dsp1", DL1416B, u32(0))
- MCFG_DL1416_UPDATE_HANDLER(WRITE16(*this, whouse_testcons_state, update_dsp<1>))
+ DL1416B(config, m_dsp[1], u32(0));
+ m_dsp[1]->update().set(FUNC(whouse_testcons_state::update_dsp<1>));
- MCFG_DEVICE_ADD("dsp2", DL1416B, u32(0))
- MCFG_DL1416_UPDATE_HANDLER(WRITE16(*this, whouse_testcons_state, update_dsp<2>))
+ DL1416B(config, m_dsp[2], u32(0));
+ m_dsp[2]->update().set(FUNC(whouse_testcons_state::update_dsp<2>));
- MCFG_DEVICE_ADD("dsp3", DL1416B, u32(0))
- MCFG_DL1416_UPDATE_HANDLER(WRITE16(*this, whouse_testcons_state, update_dsp<3>))
+ DL1416B(config, m_dsp[3], u32(0));
+ m_dsp[3]->update().set(FUNC(whouse_testcons_state::update_dsp<3>));
config.set_default_layout(layout_whousetc);
-MACHINE_CONFIG_END
+}
ROM_START(whousetc)
diff --git a/src/mame/drivers/testpat.cpp b/src/mame/drivers/testpat.cpp
new file mode 100644
index 00000000000..6806166c15b
--- /dev/null
+++ b/src/mame/drivers/testpat.cpp
@@ -0,0 +1,150 @@
+// license:BSD-3-Clause
+// copyright-holders:Sergey Svishchev
+/***************************************************************************
+
+TV test pattern generators
+
+Radio, 1983, N5
+ http://radioway.ru/1983/05/generator_telesignalov.html
+ http://radioway.ru/1984/04/generator_telesignalov.html
+
+Radio, 1985, N6
+ http://radioway.ru/1985/06/generator_ispytatelnyh_signalov.html
+
+***************************************************************************/
+
+#include "emu.h"
+
+#include "machine/netlist.h"
+
+#include "video/fixfreq.h"
+
+#include "netlist/devices/net_lib.h"
+
+#include "machine/nl_tp1983.h"
+#include "machine/nl_tp1985.h"
+
+#include "screen.h"
+
+#include <cmath>
+
+
+namespace {
+
+#define MASTER_CLOCK (4000000)
+#define V_TOTAL_PONG 315
+#define H_TOTAL_PONG 256 // tbc
+
+class tp1983_state : public driver_device
+{
+public:
+ tp1983_state(const machine_config &mconfig, device_type type, const char *tag)
+ : driver_device(mconfig, type, tag)
+ , m_maincpu(*this, "maincpu")
+ , m_video(*this, "fixfreq")
+ {
+ }
+
+ // devices
+ required_device<netlist_mame_device> m_maincpu;
+ required_device<fixedfreq_device> m_video;
+
+ void tp1983(machine_config &config);
+
+protected:
+ // driver_device overrides
+ virtual void machine_start() override { }
+ virtual void machine_reset() override { }
+
+ virtual void video_start() override { }
+
+private:
+};
+
+
+class tp1985_state : public driver_device
+{
+public:
+ tp1985_state(const machine_config &mconfig, device_type type, const char *tag)
+ : driver_device(mconfig, type, tag)
+ , m_maincpu(*this, "maincpu")
+ , m_video(*this, "fixfreq")
+ {
+ }
+
+ // devices
+ required_device<netlist_mame_device> m_maincpu;
+ required_device<fixedfreq_device> m_video;
+
+ void tp1985(machine_config &config);
+
+protected:
+ // driver_device overrides
+ virtual void machine_start() override { }
+ virtual void machine_reset() override { }
+
+ virtual void video_start() override { }
+
+private:
+ NETDEV_ANALOG_CALLBACK_MEMBER(video_out_cb);
+};
+
+NETDEV_ANALOG_CALLBACK_MEMBER(tp1985_state::video_out_cb)
+{
+ m_video->update_composite_monochrome(4.0 - data, time);
+}
+
+
+static INPUT_PORTS_START(tp1983)
+INPUT_PORTS_END
+
+static INPUT_PORTS_START(tp1985)
+INPUT_PORTS_END
+
+
+MACHINE_CONFIG_START(tp1983_state::tp1983)
+ NETLIST_CPU(config, m_maincpu, NETLIST_CLOCK);
+ m_maincpu->set_constructor(netlist_tp1983);
+
+ MCFG_NETLIST_ANALOG_OUTPUT("maincpu", "vid0", "videomix", fixedfreq_device, update_composite_monochrome, "fixfreq")
+
+ SCREEN(config, "screen", SCREEN_TYPE_RASTER);
+ FIXFREQ(config, m_video).set_screen("screen");
+ m_video->set_monitor_clock(MASTER_CLOCK);
+ m_video->set_horz_params(H_TOTAL_PONG-64,H_TOTAL_PONG-40,H_TOTAL_PONG-8,H_TOTAL_PONG);
+ m_video->set_vert_params(V_TOTAL_PONG-19,V_TOTAL_PONG-16,V_TOTAL_PONG-12,V_TOTAL_PONG);
+ m_video->set_fieldcount(1);
+ m_video->set_threshold(1);
+ m_video->set_gain(0.36);
+MACHINE_CONFIG_END
+
+MACHINE_CONFIG_START(tp1985_state::tp1985)
+ NETLIST_CPU(config, m_maincpu, NETLIST_CLOCK);
+ m_maincpu->set_constructor(netlist_tp1985);
+
+ MCFG_NETLIST_ANALOG_OUTPUT("maincpu", "vid0", "videomix", tp1985_state, video_out_cb, "")
+
+ SCREEN(config, "screen", SCREEN_TYPE_RASTER);
+ FIXFREQ(config, m_video).set_screen("screen");
+ m_video->set_monitor_clock(MASTER_CLOCK);
+ m_video->set_horz_params(H_TOTAL_PONG-64,H_TOTAL_PONG-40,H_TOTAL_PONG-8,H_TOTAL_PONG);
+ m_video->set_vert_params(V_TOTAL_PONG-19,V_TOTAL_PONG-16,V_TOTAL_PONG-12,V_TOTAL_PONG);
+ m_video->set_fieldcount(1);
+ m_video->set_threshold(1);
+ m_video->set_gain(0.36);
+MACHINE_CONFIG_END
+
+
+ROM_START( tp1983 ) /* dummy to satisfy game entry*/
+ ROM_REGION( 0x10000, "maincpu", ROMREGION_ERASE00 )
+ROM_END
+
+ROM_START( tp1985 ) /* dummy to satisfy game entry*/
+ ROM_REGION( 0x10000, "maincpu", ROMREGION_ERASE00 )
+ROM_END
+
+} // anonymous namespace
+
+
+SYST( 1983, tp1983, 0, 0, tp1983, tp1983, tp1983_state, empty_init, "Radio", "TV Test Pattern Generator 1983", MACHINE_NOT_WORKING | MACHINE_NO_SOUND_HW)
+SYST( 1985, tp1985, 0, 0, tp1985, tp1985, tp1985_state, empty_init, "Radio", "TV Test Pattern Generator 1985", MACHINE_NO_SOUND_HW)
diff --git a/src/mame/drivers/tetrisp2.cpp b/src/mame/drivers/tetrisp2.cpp
index ec53c4c2994..5947f894901 100644
--- a/src/mame/drivers/tetrisp2.cpp
+++ b/src/mame/drivers/tetrisp2.cpp
@@ -1692,28 +1692,28 @@ void stepstag_state::init_stepstag()
}
-MACHINE_CONFIG_START(tetrisp2_state::tetrisp2)
-
+void tetrisp2_state::tetrisp2(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M68000, 12000000)
- MCFG_DEVICE_PROGRAM_MAP(tetrisp2_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", tetrisp2_state, irq2_line_hold)
+ M68000(config, m_maincpu, 12000000);
+ m_maincpu->set_addrmap(AS_PROGRAM, &tetrisp2_state::tetrisp2_map);
+ m_maincpu->set_vblank_int("screen", FUNC(tetrisp2_state::irq2_line_hold));
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
WATCHDOG_TIMER(config, "watchdog").set_vblank_count("screen", 8); /* guess */
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(0x140, 0xe0)
- MCFG_SCREEN_VISIBLE_AREA(0, 0x140-1, 0, 0xe0-1)
- MCFG_SCREEN_UPDATE_DRIVER(tetrisp2_state, screen_update_tetrisp2)
- MCFG_SCREEN_PALETTE("palette")
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(0x140, 0xe0);
+ screen.set_visarea(0, 0x140-1, 0, 0xe0-1);
+ screen.set_screen_update(FUNC(tetrisp2_state::screen_update_tetrisp2));
+ screen.set_palette(m_palette);
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_tetrisp2)
- MCFG_PALETTE_ADD("palette", 0x8000)
+ GFXDECODE(config, m_gfxdecode, m_palette, gfx_tetrisp2);
+ PALETTE(config, m_palette).set_entries(0x8000);
MCFG_VIDEO_START_OVERRIDE(tetrisp2_state,tetrisp2)
@@ -1721,67 +1721,66 @@ MACHINE_CONFIG_START(tetrisp2_state::tetrisp2)
SPEAKER(config, "lspeaker").front_left();
SPEAKER(config, "rspeaker").front_right();
- MCFG_DEVICE_ADD("ymz", YMZ280B, 16934400)
- MCFG_SOUND_ROUTE(0, "lspeaker", 1.0)
- MCFG_SOUND_ROUTE(1, "rspeaker", 1.0)
-MACHINE_CONFIG_END
-
+ ymz280b_device &ymz(YMZ280B(config, "ymz", 16934400));
+ ymz.add_route(0, "lspeaker", 1.0);
+ ymz.add_route(1, "rspeaker", 1.0);
+}
-MACHINE_CONFIG_START(tetrisp2_state::nndmseal)
+void tetrisp2_state::nndmseal(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M68000, XTAL(12'000'000))
- MCFG_DEVICE_PROGRAM_MAP(nndmseal_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", tetrisp2_state, irq2_line_hold)
+ M68000(config, m_maincpu, XTAL(12'000'000));
+ m_maincpu->set_addrmap(AS_PROGRAM, &tetrisp2_state::nndmseal_map);
+ m_maincpu->set_vblank_int("screen", FUNC(tetrisp2_state::irq2_line_hold));
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
WATCHDOG_TIMER(config, "watchdog");
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(0x180, 0xf0)
- MCFG_SCREEN_VISIBLE_AREA(0, 0x180-1, 0, 0xf0-1)
- MCFG_SCREEN_UPDATE_DRIVER(tetrisp2_state, screen_update_tetrisp2)
- MCFG_SCREEN_PALETTE("palette")
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(0x180, 0xf0);
+ screen.set_visarea(0, 0x180-1, 0, 0xf0-1);
+ screen.set_screen_update(FUNC(tetrisp2_state::screen_update_tetrisp2));
+ screen.set_palette(m_palette);
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_tetrisp2)
- MCFG_PALETTE_ADD("palette", 0x8000)
+ GFXDECODE(config, m_gfxdecode, m_palette, gfx_tetrisp2);
+ PALETTE(config, m_palette).set_entries(0x8000);
MCFG_VIDEO_START_OVERRIDE(tetrisp2_state,nndmseal) // bg layer offset
/* sound hardware */
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("oki", OKIM6295, XTAL(2'000'000), okim6295_device::PIN7_HIGH)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
-MACHINE_CONFIG_END
-
+ OKIM6295(config, "oki", XTAL(2'000'000), okim6295_device::PIN7_HIGH).add_route(ALL_OUTPUTS, "mono", 1.0);
+}
-MACHINE_CONFIG_START(tetrisp2_state::rockn)
+void tetrisp2_state::rockn(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M68000, 12000000)
- MCFG_DEVICE_PROGRAM_MAP(rockn1_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", tetrisp2_state, irq2_line_hold)
+ M68000(config, m_maincpu, 12000000);
+ m_maincpu->set_addrmap(AS_PROGRAM, &tetrisp2_state::rockn1_map);
+ m_maincpu->set_vblank_int("screen", FUNC(tetrisp2_state::irq2_line_hold));
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
WATCHDOG_TIMER(config, "watchdog");
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(0x140, 0xe0)
- MCFG_SCREEN_VISIBLE_AREA(0, 0x140-1, 0, 0xe0-1)
- MCFG_SCREEN_UPDATE_DRIVER(tetrisp2_state, screen_update_rockntread)
- MCFG_SCREEN_PALETTE("palette")
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(0x140, 0xe0);
+ screen.set_visarea(0, 0x140-1, 0, 0xe0-1);
+ screen.set_screen_update(FUNC(tetrisp2_state::screen_update_rockntread));
+ screen.set_palette(m_palette);
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_tetrisp2)
- MCFG_PALETTE_ADD("palette", 0x8000)
+ GFXDECODE(config, m_gfxdecode, m_palette, gfx_tetrisp2);
+ PALETTE(config, m_palette).set_entries(0x8000);
MCFG_VIDEO_START_OVERRIDE(tetrisp2_state,rockntread)
@@ -1789,34 +1788,34 @@ MACHINE_CONFIG_START(tetrisp2_state::rockn)
SPEAKER(config, "lspeaker").front_left();
SPEAKER(config, "rspeaker").front_right();
- MCFG_DEVICE_ADD("ymz", YMZ280B, 16934400)
- MCFG_SOUND_ROUTE(0, "lspeaker", 1.0)
- MCFG_SOUND_ROUTE(1, "rspeaker", 1.0)
-MACHINE_CONFIG_END
-
+ ymz280b_device &ymz(YMZ280B(config, "ymz", 16934400));
+ ymz.add_route(0, "lspeaker", 1.0);
+ ymz.add_route(1, "rspeaker", 1.0);
+}
-MACHINE_CONFIG_START(tetrisp2_state::rockn2)
+void tetrisp2_state::rockn2(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M68000, 12000000)
- MCFG_DEVICE_PROGRAM_MAP(rockn2_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", tetrisp2_state, irq2_line_hold)
+ M68000(config, m_maincpu, 12000000);
+ m_maincpu->set_addrmap(AS_PROGRAM, &tetrisp2_state::rockn2_map);
+ m_maincpu->set_vblank_int("screen", FUNC(tetrisp2_state::irq2_line_hold));
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
WATCHDOG_TIMER(config, "watchdog");
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(0x140, 0xe0)
- MCFG_SCREEN_VISIBLE_AREA(0, 0x140-1, 0, 0xe0-1)
- MCFG_SCREEN_UPDATE_DRIVER(tetrisp2_state, screen_update_rockntread)
- MCFG_SCREEN_PALETTE("palette")
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(0x140, 0xe0);
+ screen.set_visarea(0, 0x140-1, 0, 0xe0-1);
+ screen.set_screen_update(FUNC(tetrisp2_state::screen_update_rockntread));
+ screen.set_palette(m_palette);
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_tetrisp2)
- MCFG_PALETTE_ADD("palette", 0x8000)
+ GFXDECODE(config, m_gfxdecode, m_palette, gfx_tetrisp2);
+ PALETTE(config, m_palette).set_entries(0x8000);
MCFG_VIDEO_START_OVERRIDE(tetrisp2_state,rockntread)
@@ -1824,22 +1823,22 @@ MACHINE_CONFIG_START(tetrisp2_state::rockn2)
SPEAKER(config, "lspeaker").front_left();
SPEAKER(config, "rspeaker").front_right();
- MCFG_DEVICE_ADD("ymz", YMZ280B, 16934400)
- MCFG_SOUND_ROUTE(0, "lspeaker", 1.0)
- MCFG_SOUND_ROUTE(1, "rspeaker", 1.0)
-MACHINE_CONFIG_END
-
+ ymz280b_device &ymz(YMZ280B(config, "ymz", 16934400));
+ ymz.add_route(0, "lspeaker", 1.0);
+ ymz.add_route(1, "rspeaker", 1.0);
+}
-MACHINE_CONFIG_START(tetrisp2_state::rocknms)
+void tetrisp2_state::rocknms(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M68000, 12000000)
- MCFG_DEVICE_PROGRAM_MAP(rocknms_main_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("lscreen", tetrisp2_state, irq2_line_hold)
+ M68000(config, m_maincpu, 12000000);
+ m_maincpu->set_addrmap(AS_PROGRAM, &tetrisp2_state::rocknms_main_map);
+ m_maincpu->set_vblank_int("lscreen", FUNC(tetrisp2_state::irq2_line_hold));
- MCFG_DEVICE_ADD("sub", M68000, 12000000)
- MCFG_DEVICE_PROGRAM_MAP(rocknms_sub_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("lscreen", tetrisp2_state, irq2_line_hold)
+ M68000(config, m_subcpu, 12000000);
+ m_subcpu->set_addrmap(AS_PROGRAM, &tetrisp2_state::rocknms_sub_map);
+ m_subcpu->set_vblank_int("lscreen", FUNC(tetrisp2_state::irq2_line_hold));
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
@@ -1847,11 +1846,11 @@ MACHINE_CONFIG_START(tetrisp2_state::rocknms)
/* video hardware */
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_tetrisp2)
- MCFG_PALETTE_ADD("palette", 0x8000)
+ GFXDECODE(config, m_gfxdecode, m_palette, gfx_tetrisp2);
+ PALETTE(config, m_palette).set_entries(0x8000);
- MCFG_DEVICE_ADD("sub_gfxdecode", GFXDECODE, "sub_palette", gfx_rocknms_sub)
- MCFG_PALETTE_ADD("sub_palette", 0x8000)
+ GFXDECODE(config, m_sub_gfxdecode, m_sub_palette, gfx_rocknms_sub);
+ PALETTE(config, m_sub_palette).set_entries(0x8000);
config.set_default_layout(layout_rocknms);
@@ -1877,20 +1876,21 @@ MACHINE_CONFIG_START(tetrisp2_state::rocknms)
SPEAKER(config, "lspeaker").front_left();
SPEAKER(config, "rspeaker").front_right();
- MCFG_DEVICE_ADD("ymz", YMZ280B, 16934400)
- MCFG_SOUND_ROUTE(0, "lspeaker", 1.0)
- MCFG_SOUND_ROUTE(1, "rspeaker", 1.0)
-MACHINE_CONFIG_END
+ ymz280b_device &ymz(YMZ280B(config, "ymz", 16934400));
+ ymz.add_route(0, "lspeaker", 1.0);
+ ymz.add_route(1, "rspeaker", 1.0);
+}
-MACHINE_CONFIG_START(stepstag_state::stepstag)
- MCFG_DEVICE_ADD("maincpu", M68000, 12000000 )
- MCFG_DEVICE_PROGRAM_MAP(stepstag_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("mscreen", tetrisp2_state, irq2_line_hold) // lev 4 triggered by system timer
+void stepstag_state::stepstag(machine_config &config)
+{
+ M68000(config, m_maincpu, 12000000);
+ m_maincpu->set_addrmap(AS_PROGRAM, &stepstag_state::stepstag_map);
+ m_maincpu->set_vblank_int("mscreen", FUNC(tetrisp2_state::irq2_line_hold)); // lev 4 triggered by system timer
- MCFG_DEVICE_ADD("sub", M68000, 16000000 ) //??
- MCFG_DEVICE_PROGRAM_MAP(stepstag_sub_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("lscreen", tetrisp2_state, irq4_line_hold) // lev 6 triggered by main CPU
+ M68000(config, m_subcpu, 16000000); //??
+ m_subcpu->set_addrmap(AS_PROGRAM, &stepstag_state::stepstag_sub_map);
+ m_subcpu->set_vblank_int("lscreen", FUNC(tetrisp2_state::irq4_line_hold)); // lev 6 triggered by main CPU
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
@@ -1905,7 +1905,7 @@ MACHINE_CONFIG_START(stepstag_state::stepstag)
lscreen.set_size(0x160, 0xf0);
lscreen.set_visarea(0, 0x160-1, 0, 0xf0-1);
lscreen.set_screen_update(FUNC(stepstag_state::screen_update_stepstag_left));
-// lscreen.set_palette("lpalette"));
+// lscreen.set_palette(m_vj_palette_l));
screen_device &mscreen(SCREEN(config, "mscreen", SCREEN_TYPE_RASTER));
mscreen.set_orientation(ROT0);
@@ -1914,7 +1914,7 @@ MACHINE_CONFIG_START(stepstag_state::stepstag)
mscreen.set_size(0x160, 0xf0);
mscreen.set_visarea(0, 0x160-1, 0, 0xf0-1);
mscreen.set_screen_update(FUNC(stepstag_state::screen_update_stepstag_mid));
-// mscreen.set_palette("mpalette"));
+// mscreen.set_palette(m_vj_palette_m));
screen_device &rscreen(SCREEN(config, "rscreen", SCREEN_TYPE_RASTER));
rscreen.set_orientation(ROT270);;
@@ -1923,20 +1923,20 @@ MACHINE_CONFIG_START(stepstag_state::stepstag)
rscreen.set_size(0x160, 0xf0);
rscreen.set_visarea(0, 0x160-1, 0, 0xf0-1);
rscreen.set_screen_update(FUNC(stepstag_state::screen_update_stepstag_right));
- rscreen.set_palette("rpalette");
+ rscreen.set_palette(m_vj_palette_r);
MCFG_VIDEO_START_OVERRIDE(stepstag_state, stepstag )
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_tetrisp2)
- MCFG_PALETTE_ADD("palette", 0x8000)
+ GFXDECODE(config, m_gfxdecode, m_palette, gfx_tetrisp2);
+ PALETTE(config, m_palette).set_entries(0x8000);
- MCFG_DEVICE_ADD("gfxdecode_l", GFXDECODE, "lpalette", gfx_vj_lscreen)
- MCFG_PALETTE_ADD("lpalette", 0x8000)
+ GFXDECODE(config, m_vj_gfxdecode_l, m_vj_palette_l, gfx_vj_lscreen);
+ PALETTE(config, m_vj_palette_l).set_entries(0x8000);
- MCFG_DEVICE_ADD("gfxdecode_m", GFXDECODE, "mpalette", gfx_vj_mscreen)
- MCFG_PALETTE_ADD("mpalette", 0x8000)
+ GFXDECODE(config, m_vj_gfxdecode_m, m_vj_palette_m, gfx_vj_mscreen);
+ PALETTE(config, m_vj_palette_m).set_entries(0x8000);
- MCFG_DEVICE_ADD("gfxdecode_r", GFXDECODE, "rpalette", gfx_vj_rscreen)
- MCFG_PALETTE_ADD("rpalette", 0x8000)
+ GFXDECODE(config, m_vj_gfxdecode_r, m_vj_palette_r, gfx_vj_rscreen);
+ PALETTE(config, m_vj_palette_r).set_entries(0x8000);
config.set_default_layout(layout_stepstag);
@@ -1946,70 +1946,71 @@ MACHINE_CONFIG_START(stepstag_state::stepstag)
GENERIC_LATCH_16(config, m_soundlatch);
- MCFG_DEVICE_ADD("ymz", YMZ280B, 16934400)
- MCFG_SOUND_ROUTE(0, "lspeaker", 1.0)
- MCFG_SOUND_ROUTE(1, "rspeaker", 1.0)
-MACHINE_CONFIG_END
+ ymz280b_device &ymz(YMZ280B(config, "ymz", 16934400));
+ ymz.add_route(0, "lspeaker", 1.0);
+ ymz.add_route(1, "rspeaker", 1.0);
+}
-MACHINE_CONFIG_START(stepstag_state::vjdash) // 4 Screens
- MCFG_DEVICE_ADD("maincpu", M68000, 12000000 )
- MCFG_DEVICE_PROGRAM_MAP(vjdash_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", tetrisp2_state, irq2_line_hold) // lev 4 triggered by system timer
+void stepstag_state::vjdash(machine_config &config) // 4 Screens
+{
+ M68000(config, m_maincpu, 12000000);
+ m_maincpu->set_addrmap(AS_PROGRAM, &stepstag_state::vjdash_map);
+ m_maincpu->set_vblank_int("screen", FUNC(tetrisp2_state::irq2_line_hold)); // lev 4 triggered by system timer
- MCFG_DEVICE_ADD("sub", M68000, 16000000 ) //??
- MCFG_DEVICE_PROGRAM_MAP(stepstag_sub_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("mscreen", tetrisp2_state, irq4_line_hold) // lev 6 triggered by main CPU
+ M68000(config, m_subcpu, 16000000); //??
+ m_subcpu->set_addrmap(AS_PROGRAM, &stepstag_state::stepstag_sub_map);
+ m_subcpu->set_vblank_int("mscreen", FUNC(tetrisp2_state::irq4_line_hold)); // lev 6 triggered by main CPU
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
WATCHDOG_TIMER(config, "watchdog");
// video hardware
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(0x160, 0xf0)
- MCFG_SCREEN_VISIBLE_AREA(0, 0x140-1, 0, 0xe0-1)
- MCFG_SCREEN_UPDATE_DRIVER(stepstag_state, screen_update_stepstag_main)
-// MCFG_SCREEN_UPDATE_DRIVER(tetrisp2_state, screen_update_rockntread)
- MCFG_SCREEN_PALETTE("palette")
-
- MCFG_SCREEN_ADD("lscreen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(30)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(0x160, 0xf0)
- MCFG_SCREEN_VISIBLE_AREA(0, 0x160-1, 0, 0xf0-1)
- MCFG_SCREEN_UPDATE_DRIVER(stepstag_state, screen_update_stepstag_left)
-// MCFG_SCREEN_PALETTE("lpalette")
-
- MCFG_SCREEN_ADD("mscreen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(30)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(0x160, 0xf0)
- MCFG_SCREEN_VISIBLE_AREA(0, 0x160-1, 0, 0xf0-1)
- MCFG_SCREEN_UPDATE_DRIVER(stepstag_state, screen_update_stepstag_mid)
-// MCFG_SCREEN_PALETTE("mpalette")
-
- MCFG_SCREEN_ADD("rscreen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(30)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(0x160, 0xf0)
- MCFG_SCREEN_VISIBLE_AREA(0, 0x160-1, 0, 0xf0-1)
- MCFG_SCREEN_UPDATE_DRIVER(stepstag_state, screen_update_stepstag_right)
- MCFG_SCREEN_PALETTE("rpalette")
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(0x160, 0xf0);
+ screen.set_visarea(0, 0x140-1, 0, 0xe0-1);
+ screen.set_screen_update(FUNC(stepstag_state::screen_update_stepstag_main));
+// screen.set_screen_update(FUNC(tetrisp2_state::screen_update_rockntread));
+ screen.set_palette(m_palette);
+
+ screen_device &lscreen(SCREEN(config, "lscreen", SCREEN_TYPE_RASTER));
+ lscreen.set_refresh_hz(30);
+ lscreen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ lscreen.set_size(0x160, 0xf0);
+ lscreen.set_visarea(0, 0x160-1, 0, 0xf0-1);
+ lscreen.set_screen_update(FUNC(stepstag_state::screen_update_stepstag_left));
+// lscreen.set_palette(m_vj_palette_l);
+
+ screen_device &mscreen(SCREEN(config, "mscreen", SCREEN_TYPE_RASTER));
+ mscreen.set_refresh_hz(30);
+ mscreen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ mscreen.set_size(0x160, 0xf0);
+ mscreen.set_visarea(0, 0x160-1, 0, 0xf0-1);
+ mscreen.set_screen_update(FUNC(stepstag_state::screen_update_stepstag_mid));
+// mscreen.set_palette(m_vj_palette_m);
+
+ screen_device &rscreen(SCREEN(config, "rscreen", SCREEN_TYPE_RASTER));
+ rscreen.set_refresh_hz(30);
+ rscreen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ rscreen.set_size(0x160, 0xf0);
+ rscreen.set_visarea(0, 0x160-1, 0, 0xf0-1);
+ rscreen.set_screen_update(FUNC(stepstag_state::screen_update_stepstag_right));
+ rscreen.set_palette(m_vj_palette_r);
MCFG_VIDEO_START_OVERRIDE(stepstag_state, stepstag )
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_tetrisp2)
- MCFG_PALETTE_ADD("palette", 0x8000)
+ GFXDECODE(config, m_gfxdecode, m_palette, gfx_tetrisp2);
+ PALETTE(config, m_palette).set_entries(0x8000);
- MCFG_DEVICE_ADD("gfxdecode_l", GFXDECODE, "lpalette", gfx_vj_lscreen)
- MCFG_PALETTE_ADD("lpalette", 0x8000)
+ GFXDECODE(config, m_vj_gfxdecode_l, m_vj_palette_l, gfx_vj_lscreen);
+ PALETTE(config, m_vj_palette_l).set_entries(0x8000);
- MCFG_DEVICE_ADD("gfxdecode_m", GFXDECODE, "mpalette", gfx_vj_mscreen)
- MCFG_PALETTE_ADD("mpalette", 0x8000)
+ GFXDECODE(config, m_vj_gfxdecode_m, m_vj_palette_m, gfx_vj_mscreen);
+ PALETTE(config, m_vj_palette_m).set_entries(0x8000);
- MCFG_DEVICE_ADD("gfxdecode_r", GFXDECODE, "rpalette", gfx_vj_rscreen)
- MCFG_PALETTE_ADD("rpalette", 0x8000)
+ GFXDECODE(config, m_vj_gfxdecode_r, m_vj_palette_r, gfx_vj_rscreen);
+ PALETTE(config, m_vj_palette_r).set_entries(0x8000);
config.set_default_layout(layout_vjdash);
@@ -2019,10 +2020,10 @@ MACHINE_CONFIG_START(stepstag_state::vjdash) // 4 Screens
GENERIC_LATCH_16(config, m_soundlatch);
- MCFG_DEVICE_ADD("ymz", YMZ280B, 16934400)
- MCFG_SOUND_ROUTE(0, "lspeaker", 1.0)
- MCFG_SOUND_ROUTE(1, "rspeaker", 1.0)
-MACHINE_CONFIG_END
+ ymz280b_device &ymz(YMZ280B(config, "ymz", 16934400));
+ ymz.add_route(0, "lspeaker", 1.0);
+ ymz.add_route(1, "rspeaker", 1.0);
+}
/***************************************************************************
diff --git a/src/mame/drivers/tg100.cpp b/src/mame/drivers/tg100.cpp
index 4f047d21d19..57be0fd52b9 100644
--- a/src/mame/drivers/tg100.cpp
+++ b/src/mame/drivers/tg100.cpp
@@ -73,21 +73,21 @@ void tg100_state::ymw258_map(address_map &map)
map(0x000000, 0x1fffff).rom();
}
-MACHINE_CONFIG_START(tg100_state::tg100)
+void tg100_state::tg100(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", H83002, XTAL(20'000'000)) /* TODO: correct CPU type (H8/520) */
- MCFG_DEVICE_PROGRAM_MAP( tg100_map )
- MCFG_DEVICE_IO_MAP( tg100_io_map )
+ H83002(config, m_maincpu, XTAL(20'000'000)); /* TODO: correct CPU type (H8/520) */
+ m_maincpu->set_addrmap(AS_PROGRAM, &tg100_state::tg100_map);
+ m_maincpu->set_addrmap(AS_IO, &tg100_state::tg100_io_map);
SPEAKER(config, "lspeaker").front_left();
SPEAKER(config, "rspeaker").front_right();
- MCFG_DEVICE_ADD("ymw258", MULTIPCM, 9400000)
- MCFG_DEVICE_ADDRESS_MAP(0, ymw258_map)
- MCFG_SOUND_ROUTE(0, "lspeaker", 1.0)
- MCFG_SOUND_ROUTE(1, "rspeaker", 1.0)
-
-MACHINE_CONFIG_END
+ MULTIPCM(config, m_ymw258, 9400000);
+ m_ymw258->set_addrmap(0, &tg100_state::ymw258_map);
+ m_ymw258->add_route(0, "lspeaker", 1.0);
+ m_ymw258->add_route(1, "rspeaker", 1.0);
+}
ROM_START( tg100 )
diff --git a/src/mame/drivers/tgtpanic.cpp b/src/mame/drivers/tgtpanic.cpp
index 33d194bea99..faeffcb562e 100644
--- a/src/mame/drivers/tgtpanic.cpp
+++ b/src/mame/drivers/tgtpanic.cpp
@@ -153,22 +153,22 @@ INPUT_PORTS_END
*
*************************************/
-MACHINE_CONFIG_START(tgtpanic_state::tgtpanic)
-
+void tgtpanic_state::tgtpanic(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, XTAL(4'000'000))
- MCFG_DEVICE_PROGRAM_MAP(prg_map)
- MCFG_DEVICE_IO_MAP(io_map)
- MCFG_DEVICE_PERIODIC_INT_DRIVER(tgtpanic_state, irq0_line_hold, 20) /* Unverified */
+ Z80(config,m_maincpu, XTAL(4'000'000));
+ m_maincpu->set_addrmap(AS_PROGRAM, &tgtpanic_state::prg_map);
+ m_maincpu->set_addrmap(AS_IO, &tgtpanic_state::io_map);
+ m_maincpu->set_periodic_int(FUNC(tgtpanic_state::irq0_line_hold), attotime::from_hz(20)); /* Unverified */
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60) /* Unverified */
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* Unverified */
- MCFG_SCREEN_SIZE(256, 256)
- MCFG_SCREEN_VISIBLE_AREA(0, 192 - 1, 0, 192 - 1)
- MCFG_SCREEN_UPDATE_DRIVER(tgtpanic_state, screen_update)
-MACHINE_CONFIG_END
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_refresh_hz(60); /* Unverified */
+ m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* Unverified */
+ m_screen->set_size(256, 256);
+ m_screen->set_visarea(0, 192 - 1, 0, 192 - 1);
+ m_screen->set_screen_update(FUNC(tgtpanic_state::screen_update));
+}
/*************************************
diff --git a/src/mame/drivers/thedealr.cpp b/src/mame/drivers/thedealr.cpp
index 17c6c56ee5f..2519435c9fd 100644
--- a/src/mame/drivers/thedealr.cpp
+++ b/src/mame/drivers/thedealr.cpp
@@ -75,7 +75,7 @@ private:
uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
DECLARE_WRITE_LINE_MEMBER(screen_vblank);
- void thedealr(address_map &map);
+ void thedealr_main(address_map &map);
void thedealr_sub(address_map &map);
virtual void machine_start() override;
@@ -282,7 +282,7 @@ WRITE8_MEMBER(thedealr_state::unk_w)
// popmessage("UNK %02x", data);
}
-void thedealr_state::thedealr(address_map &map)
+void thedealr_state::thedealr_main(address_map &map)
{
map(0x0000, 0x07ff).ram().share("nvram");
@@ -540,15 +540,16 @@ TIMER_DEVICE_CALLBACK_MEMBER(thedealr_state::thedealr_interrupt)
m_maincpu->set_input_line(INPUT_LINE_IRQ0, ASSERT_LINE);
}
-MACHINE_CONFIG_START(thedealr_state::thedealr)
-
+void thedealr_state::thedealr(machine_config &config)
+{
// basic machine hardware
- MCFG_DEVICE_ADD("maincpu", R65C02, XTAL(16'000'000)/8) // 2 MHz?
- MCFG_DEVICE_PROGRAM_MAP(thedealr)
- MCFG_TIMER_DRIVER_ADD_SCANLINE("scantimer", thedealr_state, thedealr_interrupt, "screen", 0, 1)
+ R65C02(config, m_maincpu, XTAL(16'000'000)/8); // 2 MHz?
+ m_maincpu->set_addrmap(AS_PROGRAM, &thedealr_state::thedealr_main);
- MCFG_DEVICE_ADD("subcpu", R65C02, XTAL(16'000'000)/8) // 2 MHz?
- MCFG_DEVICE_PROGRAM_MAP(thedealr_sub)
+ TIMER(config, "scantimer").configure_scanline(FUNC(thedealr_state::thedealr_interrupt), "screen", 0, 1);
+
+ R65C02(config, m_subcpu, XTAL(16'000'000)/8); // 2 MHz?
+ m_subcpu->set_addrmap(AS_PROGRAM, &thedealr_state::thedealr_sub);
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
@@ -577,7 +578,7 @@ MACHINE_CONFIG_START(thedealr_state::thedealr)
aysnd.port_a_read_callback().set_ioport("DSW2");
aysnd.port_b_read_callback().set_ioport("DSW1");
aysnd.add_route(ALL_OUTPUTS, "mono", 0.50);
-MACHINE_CONFIG_END
+}
/***************************************************************************
diff --git a/src/mame/drivers/thepit.cpp b/src/mame/drivers/thepit.cpp
index 1b883cf0b78..b159ad2f1bf 100644
--- a/src/mame/drivers/thepit.cpp
+++ b/src/mame/drivers/thepit.cpp
@@ -715,17 +715,17 @@ INTERRUPT_GEN_MEMBER(thepit_state::vblank_irq)
device.execute().set_input_line(INPUT_LINE_NMI, ASSERT_LINE);
}
-MACHINE_CONFIG_START(thepit_state::thepit)
-
+void thepit_state::thepit(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, PIXEL_CLOCK/2) /* 3.072 MHz */
- MCFG_DEVICE_PROGRAM_MAP(thepit_main_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", thepit_state, vblank_irq)
+ Z80(config, m_maincpu, PIXEL_CLOCK/2); /* 3.072 MHz */
+ m_maincpu->set_addrmap(AS_PROGRAM, &thepit_state::thepit_main_map);
+ m_maincpu->set_vblank_int("screen", FUNC(thepit_state::vblank_irq));
- MCFG_DEVICE_ADD("audiocpu", Z80, SOUND_CLOCK/4) /* 2.5 MHz */
- MCFG_DEVICE_PROGRAM_MAP(audio_map)
- MCFG_DEVICE_IO_MAP(audio_io_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", thepit_state, irq0_line_hold)
+ z80_device &audiocpu(Z80(config, "audiocpu", SOUND_CLOCK/4)); /* 2.5 MHz */
+ audiocpu.set_addrmap(AS_PROGRAM, &thepit_state::audio_map);
+ audiocpu.set_addrmap(AS_IO, &thepit_state::audio_io_map);
+ audiocpu.set_vblank_int("screen", FUNC(thepit_state::irq0_line_hold));
LS259(config, m_mainlatch); // IC42
m_mainlatch->q_out_cb<0>().set(FUNC(thepit_state::nmi_mask_w));
@@ -740,10 +740,10 @@ MACHINE_CONFIG_START(thepit_state::thepit)
GFXDECODE(config, m_gfxdecode, m_palette, gfx_thepit);
PALETTE(config, m_palette, FUNC(thepit_state::thepit_palette), 32+8);
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_RAW_PARAMS(PIXEL_CLOCK, HTOTAL, HBEND, HBSTART, VTOTAL, VBEND, VBSTART)
- MCFG_SCREEN_UPDATE_DRIVER(thepit_state, screen_update)
- MCFG_SCREEN_PALETTE(m_palette)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_raw(PIXEL_CLOCK, HTOTAL, HBEND, HBSTART, VTOTAL, VBEND, VBSTART);
+ screen.set_screen_update(FUNC(thepit_state::screen_update));
+ screen.set_palette(m_palette);
/* sound hardware */
SPEAKER(config, "mono").front_center();
@@ -755,7 +755,7 @@ MACHINE_CONFIG_START(thepit_state::thepit)
ay1.add_route(ALL_OUTPUTS, "mono", 0.25);
AY8910(config, "ay2", PIXEL_CLOCK/4).add_route(ALL_OUTPUTS, "mono", 0.25);
-MACHINE_CONFIG_END
+}
void thepit_state::fitter(machine_config &config)
{
@@ -763,43 +763,41 @@ void thepit_state::fitter(machine_config &config)
m_mainlatch->q_out_cb<2>().set(FUNC(thepit_state::coin_lockout_w));
}
-MACHINE_CONFIG_START(thepit_state::desertdn)
+void thepit_state::desertdn(machine_config &config)
+{
fitter(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(desertdan_main_map)
+ m_maincpu->set_addrmap(AS_PROGRAM, &thepit_state::desertdan_main_map);
/* video hardware */
- MCFG_SCREEN_MODIFY("screen")
- MCFG_SCREEN_UPDATE_DRIVER(thepit_state, screen_update_desertdan)
+ subdevice<screen_device>("screen")->set_screen_update(FUNC(thepit_state::screen_update_desertdan));
- MCFG_GFXDECODE_MODIFY("gfxdecode", gfx_intrepid)
-MACHINE_CONFIG_END
+ m_gfxdecode->set_info(gfx_intrepid);
+}
-MACHINE_CONFIG_START(thepit_state::intrepid)
+void thepit_state::intrepid(machine_config &config)
+{
fitter(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(intrepid_main_map)
+ m_maincpu->set_addrmap(AS_PROGRAM, &thepit_state::intrepid_main_map);
m_mainlatch->q_out_cb<5>().set(FUNC(thepit_state::intrepid_graphics_bank_w));
/* video hardware */
- MCFG_GFXDECODE_MODIFY("gfxdecode", gfx_intrepid)
-MACHINE_CONFIG_END
+ m_gfxdecode->set_info(gfx_intrepid);
+}
-MACHINE_CONFIG_START(thepit_state::suprmous)
+void thepit_state::suprmous(machine_config &config)
+{
intrepid(config);
- /* basic machine hardware */
-
/* video hardware */
m_palette->set_init(FUNC(thepit_state::suprmous_palette));
- MCFG_GFXDECODE_MODIFY("gfxdecode", gfx_suprmous)
-MACHINE_CONFIG_END
+ m_gfxdecode->set_info(gfx_suprmous);
+}
diff --git a/src/mame/drivers/thomson.cpp b/src/mame/drivers/thomson.cpp
index e80dce1a3b8..a096c39acf7 100644
--- a/src/mame/drivers/thomson.cpp
+++ b/src/mame/drivers/thomson.cpp
@@ -300,7 +300,7 @@ T9000 (1980)
Early TO7 prototype.
The hardware seems to be the exactly same. Only the BIOS is different.
It has some bug that were corrected later for the TO7.
-Actually, the two computers are undistinguishable, except for the different
+Actually, the two computers are indistinguishable, except for the different
startup screen, and a couple BIOS addresses.
They can run the same software and accept the same devices and extensions.
@@ -309,7 +309,7 @@ They can run the same software and accept the same devices and extensions.
/* ------------ address maps ------------ */
-void thomson_state::to7(address_map &map)
+void thomson_state::to7_map(address_map &map)
{
map(0x0000, 0x3fff).bankr(THOM_CART_BANK).w(FUNC(thomson_state::to7_cartridge_w)); /* 4 * 16 KB */
@@ -625,65 +625,58 @@ MACHINE_CONFIG_START(thomson_state::to7_base)
MCFG_MACHINE_RESET_OVERRIDE( thomson_state, to7 )
/* cpu */
- MCFG_DEVICE_ADD("maincpu", MC6809E, 16_MHz_XTAL / 16)
- MCFG_DEVICE_PROGRAM_MAP(to7)
+ MC6809E(config, m_maincpu, 16_MHz_XTAL / 16);
+ m_maincpu->set_addrmap(AS_PROGRAM, &thomson_state::to7_map);
- MCFG_INPUT_MERGER_ANY_HIGH("mainirq")
- MCFG_INPUT_MERGER_OUTPUT_HANDLER(INPUTLINE("maincpu", M6809_IRQ_LINE))
+ INPUT_MERGER_ANY_HIGH(config, "mainirq").output_handler().set_inputline(m_maincpu, M6809_IRQ_LINE);
- MCFG_INPUT_MERGER_ANY_HIGH("mainfirq")
- MCFG_INPUT_MERGER_OUTPUT_HANDLER(INPUTLINE("maincpu", M6809_FIRQ_LINE))
+ INPUT_MERGER_ANY_HIGH(config, "mainfirq").output_handler().set_inputline(m_maincpu, M6809_FIRQ_LINE);
/* video */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE ( /*50*/ 1./0.019968 )
- MCFG_SCREEN_SIZE ( THOM_TOTAL_WIDTH * 2, THOM_TOTAL_HEIGHT )
- MCFG_SCREEN_VISIBLE_AREA ( 0, THOM_TOTAL_WIDTH * 2 - 1,
- 0, THOM_TOTAL_HEIGHT - 1 )
- MCFG_SCREEN_UPDATE_DRIVER( thomson_state, screen_update_thom )
- MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE(*this, thomson_state, thom_vblank))
- MCFG_SCREEN_PALETTE("palette")
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_refresh_hz(/*50*/ 1./0.019968);
+ m_screen->set_size(THOM_TOTAL_WIDTH * 2, THOM_TOTAL_HEIGHT);
+ m_screen->set_visarea(0, THOM_TOTAL_WIDTH * 2 - 1, 0, THOM_TOTAL_HEIGHT - 1);
+ m_screen->set_screen_update(FUNC(thomson_state::screen_update_thom));
+ m_screen->screen_vblank().set(FUNC(thomson_state::thom_vblank));
+ m_screen->set_palette("palette");
PALETTE(config, "palette", FUNC(thomson_state::thom_palette), 4097); // 12-bit color + transparency
MCFG_VIDEO_START_OVERRIDE( thomson_state, thom )
/* sound */
SPEAKER(config, "speaker").front_center();
- MCFG_DEVICE_ADD("buzzer", DAC_1BIT, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 0.5)
- MCFG_DEVICE_ADD("dac", DAC_6BIT_R2R, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 0.5) // 6-bit game extension R-2R DAC (R=10K)
- MCFG_DEVICE_ADD("vref", VOLTAGE_REGULATOR, 0) MCFG_VOLTAGE_REGULATOR_OUTPUT(5.0)
- MCFG_SOUND_ROUTE(0, "buzzer", 1.0, DAC_VREF_POS_INPUT)
- MCFG_SOUND_ROUTE(0, "dac", 1.0, DAC_VREF_POS_INPUT) MCFG_SOUND_ROUTE(0, "dac", -1.0, DAC_VREF_NEG_INPUT)
+ DAC_1BIT(config, "buzzer", 0).add_route(ALL_OUTPUTS, "speaker", 0.5);
+ DAC_6BIT_R2R(config, m_dac, 0).add_route(ALL_OUTPUTS, "speaker", 0.5); // 6-bit game extension R-2R DAC (R=10K)
+ voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref"));
+ vref.add_route(0, "buzzer", 1.0, DAC_VREF_POS_INPUT);
+ vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT);
+ vref.add_route(0, "dac", -1.0, DAC_VREF_NEG_INPUT);
/* speech synthesis */
- MCFG_DEVICE_ADD("mea8000", MEA8000, 3840000)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 1.0)
+ MEA8000(config, m_mea8000, 3840000).add_route(ALL_OUTPUTS, "speaker", 1.0);
/* cassette */
- MCFG_CASSETTE_ADD( "cassette" )
- MCFG_CASSETTE_FORMATS(to7_cassette_formats)
- MCFG_CASSETTE_DEFAULT_STATE(CASSETTE_PLAY | CASSETTE_MOTOR_DISABLED | CASSETTE_SPEAKER_ENABLED)
- MCFG_CASSETTE_INTERFACE("to_cass")
+ CASSETTE(config, m_cassette);
+ m_cassette->set_formats(to7_cassette_formats);
+ m_cassette->set_default_state(CASSETTE_PLAY | CASSETTE_MOTOR_DISABLED | CASSETTE_SPEAKER_ENABLED);
+ m_cassette->set_interface("to_cass");
/* floppy */
- MCFG_DEVICE_ADD("mc6843", MC6843, 16_MHz_XTAL / 16 / 2)
-
- MCFG_DEVICE_ADD(m_floppy_image[0], LEGACY_FLOPPY, 0)
- MCFG_LEGACY_FLOPPY_CONFIG(thomson_floppy_interface)
- MCFG_LEGACY_FLOPPY_IDX_CB(WRITELINE(*this, thomson_state, fdc_index_0_w))
- MCFG_DEVICE_ADD(m_floppy_image[1], LEGACY_FLOPPY, 0)
- MCFG_LEGACY_FLOPPY_CONFIG(thomson_floppy_interface)
- MCFG_LEGACY_FLOPPY_IDX_CB(WRITELINE(*this, thomson_state, fdc_index_1_w))
- MCFG_DEVICE_ADD(m_floppy_image[2], LEGACY_FLOPPY, 0)
- MCFG_LEGACY_FLOPPY_CONFIG(thomson_floppy_interface)
- MCFG_LEGACY_FLOPPY_IDX_CB(WRITELINE(*this, thomson_state, fdc_index_2_w))
- MCFG_DEVICE_ADD(m_floppy_image[3], LEGACY_FLOPPY, 0)
- MCFG_LEGACY_FLOPPY_CONFIG(thomson_floppy_interface)
- MCFG_LEGACY_FLOPPY_IDX_CB(WRITELINE(*this, thomson_state, fdc_index_3_w))
+ MC6843(config, m_mc6843, 16_MHz_XTAL / 16 / 2);
+
+ LEGACY_FLOPPY(config, m_floppy_image[0], 0, &thomson_floppy_interface);
+ m_floppy_image[0]->out_idx_cb().set(FUNC(thomson_state::fdc_index_0_w));
+ LEGACY_FLOPPY(config, m_floppy_image[1], 0, &thomson_floppy_interface);
+ m_floppy_image[1]->out_idx_cb().set(FUNC(thomson_state::fdc_index_1_w));
+ LEGACY_FLOPPY(config, m_floppy_image[2], 0, &thomson_floppy_interface);
+ m_floppy_image[2]->out_idx_cb().set(FUNC(thomson_state::fdc_index_2_w));
+ LEGACY_FLOPPY(config, m_floppy_image[3], 0, &thomson_floppy_interface);
+ m_floppy_image[3]->out_idx_cb().set(FUNC(thomson_state::fdc_index_3_w));
WD2793(config, m_wd2793_fdc, 16_MHz_XTAL / 16);
- MCFG_FLOPPY_DRIVE_ADD("wd2793:0", cd90_640_floppies, "dd", thomson_state::cd90_640_formats)
- MCFG_FLOPPY_DRIVE_ADD("wd2793:1", cd90_640_floppies, "dd", thomson_state::cd90_640_formats)
+ FLOPPY_CONNECTOR(config, "wd2793:0", cd90_640_floppies, "dd", thomson_state::cd90_640_formats);
+ FLOPPY_CONNECTOR(config, "wd2793:1", cd90_640_floppies, "dd", thomson_state::cd90_640_formats);
/* network */
@@ -733,9 +726,8 @@ MACHINE_CONFIG_START(thomson_state::to7_base)
m_acia->txd_handler().set(FUNC(thomson_state::to7_modem_tx_w));
m_acia->irq_handler().set(FUNC(thomson_state::to7_modem_cb));
- MCFG_DEVICE_ADD("acia_clock", CLOCK, 1200) /* 1200 bauds, might be divided by 16 */
- MCFG_CLOCK_SIGNAL_HANDLER(WRITELINE(*this, thomson_state, write_acia_clock))
-
+ clock_device &acia_clock(CLOCK(config, "acia_clock", 1200)); /* 1200 bauds, might be divided by 16 */
+ acia_clock.signal_handler().set(FUNC(thomson_state::write_acia_clock));
/* cartridge */
MCFG_GENERIC_CARTSLOT_ADD("cartslot", generic_plain_slot, "to_cart")
@@ -746,10 +738,10 @@ MACHINE_CONFIG_START(thomson_state::to7_base)
RAM(config, m_ram).set_default_size("40K").set_extra_options("24K,48K");
/* software lists */
- MCFG_SOFTWARE_LIST_ADD("to7_cart_list","to7_cart")
- MCFG_SOFTWARE_LIST_ADD("to7_cass_list","to7_cass")
- MCFG_SOFTWARE_LIST_ADD("to_flop_list","to_flop")
- MCFG_SOFTWARE_LIST_ADD("to7_qd_list","to7_qd")
+ SOFTWARE_LIST(config, "to7_cart_list").set_original("to7_cart");
+ SOFTWARE_LIST(config, "to7_cass_list").set_original("to7_cass");
+ SOFTWARE_LIST(config, "to_flop_list").set_original("to_flop");
+ SOFTWARE_LIST(config, "to7_qd_list").set_original("to7_qd");
MACHINE_CONFIG_END
void thomson_state::to7(machine_config &config)
@@ -825,7 +817,7 @@ In arabic mode, Ctrl+E / Ctrl+X to start / stop typing in-line latin.
**********************************************************************/
-void thomson_state::to770(address_map &map)
+void thomson_state::to770_map(address_map &map)
{
map(0x0000, 0x3fff).bankr(THOM_CART_BANK).w(FUNC(thomson_state::to7_cartridge_w)); /* 4 * 16 KB */
@@ -930,13 +922,13 @@ INPUT_PORTS_END
/* ------------ driver ------------ */
-MACHINE_CONFIG_START(thomson_state::to770)
+void thomson_state::to770(machine_config &config)
+{
to7(config);
MCFG_MACHINE_START_OVERRIDE( thomson_state, to770 )
MCFG_MACHINE_RESET_OVERRIDE( thomson_state, to770 )
- MCFG_DEVICE_MODIFY( "maincpu" )
- MCFG_DEVICE_PROGRAM_MAP ( to770)
+ m_maincpu->set_addrmap(AS_PROGRAM, &thomson_state::to770_map);
m_pia_sys->readpa_handler().set(FUNC(thomson_state::to770_sys_porta_in));
m_pia_sys->readpb_handler().set_constant(0);
@@ -948,16 +940,16 @@ MACHINE_CONFIG_START(thomson_state::to770)
/* internal ram */
m_ram->set_default_size("128K").set_extra_options("64K");
- MCFG_DEVICE_REMOVE("to7_cart_list")
- MCFG_SOFTWARE_LIST_ADD("t770_cart_list","to770_cart")
- MCFG_SOFTWARE_LIST_COMPATIBLE_ADD("to7_cart_list","to7_cart")
-MACHINE_CONFIG_END
+ SOFTWARE_LIST(config, "t770_cart_list").set_original("to770_cart");
+ SOFTWARE_LIST(config.replace(), "to7_cart_list").set_compatible("to7_cart");
+}
-MACHINE_CONFIG_START(thomson_state::to770a)
+void thomson_state::to770a(machine_config &config)
+{
to770(config);
- MCFG_DEVICE_REMOVE("t770_cart_list")
- MCFG_SOFTWARE_LIST_ADD("t770a_cart_list","to770a_cart")
-MACHINE_CONFIG_END
+ config.device_remove("t770_cart_list");
+ SOFTWARE_LIST(config, "t770a_cart_list").set_original("to770a_cart");
+}
COMP( 1984, to770, 0, 0, to770, to770, thomson_state, empty_init, "Thomson", "TO7/70", 0 )
@@ -1023,7 +1015,7 @@ Differences include:
**********************************************************************/
-void thomson_state::mo5(address_map &map)
+void thomson_state::mo5_map(address_map &map)
{
map(0x0000, 0x1fff).bankr(THOM_VRAM_BANK).w(FUNC(thomson_state::to770_vram_w));
@@ -1124,12 +1116,10 @@ MACHINE_CONFIG_START(thomson_state::mo5)
MCFG_MACHINE_START_OVERRIDE( thomson_state, mo5 )
MCFG_MACHINE_RESET_OVERRIDE( thomson_state, mo5 )
- MCFG_DEVICE_MODIFY( "maincpu" )
- MCFG_DEVICE_PROGRAM_MAP ( mo5)
+ m_maincpu->set_addrmap(AS_PROGRAM, &thomson_state::mo5_map);
- MCFG_CASSETTE_MODIFY( "cassette" )
- MCFG_CASSETTE_FORMATS(mo5_cassette_formats)
- MCFG_CASSETTE_INTERFACE("mo_cass")
+ m_cassette->set_formats(mo5_cassette_formats);
+ m_cassette->set_interface("mo_cass");
subdevice<palette_device>("palette")->set_init(FUNC(thomson_state::mo5_palette));
@@ -1141,28 +1131,29 @@ MACHINE_CONFIG_START(thomson_state::mo5)
m_pia_sys->cb2_handler().set_nop();
m_pia_sys->irqb_handler().set("mainirq", FUNC(input_merger_device::in_w<1>)); // WARNING: differs from TO7 !
- MCFG_DEVICE_REMOVE("cartslot")
+ config.device_remove("cartslot");
MCFG_GENERIC_CARTSLOT_ADD("cartslot", generic_plain_slot, "mo_cart")
MCFG_GENERIC_EXTENSIONS("m5,rom")
MCFG_GENERIC_LOAD(thomson_state, mo5_cartridge)
- MCFG_DEVICE_REMOVE("to7_cart_list")
- MCFG_DEVICE_REMOVE("to7_cass_list")
- MCFG_DEVICE_REMOVE("to_flop_list")
- MCFG_DEVICE_REMOVE("to7_qd_list")
+ config.device_remove("to7_cart_list");
+ config.device_remove("to7_cass_list");
+ config.device_remove("to_flop_list");
+ config.device_remove("to7_qd_list");
- MCFG_SOFTWARE_LIST_ADD("mo5_cart_list","mo5_cart")
- MCFG_SOFTWARE_LIST_ADD("mo5_cass_list","mo5_cass")
- MCFG_SOFTWARE_LIST_ADD("mo5_flop_list","mo5_flop")
- MCFG_SOFTWARE_LIST_ADD("mo5_qd_list","mo5_qd")
+ SOFTWARE_LIST(config, "mo5_cart_list").set_original("mo5_cart");
+ SOFTWARE_LIST(config, "mo5_cass_list").set_original("mo5_cass");
+ SOFTWARE_LIST(config, "mo5_flop_list").set_original("mo5_flop");
+ SOFTWARE_LIST(config, "mo5_qd_list").set_original("mo5_qd");
/* internal ram */
m_ram->set_default_size("112K");
MACHINE_CONFIG_END
-MACHINE_CONFIG_START(thomson_state::mo5e)
+void thomson_state::mo5e(machine_config &config)
+{
mo5(config);
-MACHINE_CONFIG_END
+}
COMP( 1984, mo5, 0, 0, mo5, mo5, thomson_state, empty_init, "Thomson", "MO5", 0 )
@@ -1242,7 +1233,7 @@ It was replaced quickly with the improved TO9+.
**********************************************************************/
-void thomson_state::to9(address_map &map)
+void thomson_state::to9_map(address_map &map)
{
map(0x0000, 0x3fff).bankr(THOM_CART_BANK).w(FUNC(thomson_state::to9_cartridge_w));/* 4 * 16 KB */
@@ -1477,14 +1468,14 @@ INPUT_PORTS_END
/* ------------ driver ------------ */
-MACHINE_CONFIG_START(thomson_state::to9)
+void thomson_state::to9(machine_config &config)
+{
to7(config);
MCFG_MACHINE_START_OVERRIDE( thomson_state, to9 )
MCFG_MACHINE_RESET_OVERRIDE( thomson_state, to9 )
- MCFG_DEVICE_MODIFY( "maincpu" )
- MCFG_DEVICE_PROGRAM_MAP ( to9)
+ m_maincpu->set_addrmap(AS_PROGRAM, &thomson_state::to9_map);
m_pia_sys->readpa_handler().set(FUNC(thomson_state::to9_sys_porta_in));
m_pia_sys->readpb_handler().set_constant(0);
@@ -1500,7 +1491,7 @@ MACHINE_CONFIG_START(thomson_state::to9)
/* internal ram */
m_ram->set_default_size("192K").set_extra_options("128K");
-MACHINE_CONFIG_END
+}
COMP( 1985, to9, 0, 0, to9, to9, thomson_state, empty_init, "Thomson", "TO9", MACHINE_IMPERFECT_COLORS )
@@ -1569,7 +1560,7 @@ The TO8D is simply a TO8 with an integrated 3"1/2 floppy drive.
**********************************************************************/
-void thomson_state::to8(address_map &map)
+void thomson_state::to8_map(address_map &map)
{
map(0x0000, 0x3fff).bankr(THOM_CART_BANK).w(FUNC(thomson_state::to8_cartridge_w)); /* 4 * 16 KB */
@@ -1698,15 +1689,15 @@ INPUT_PORTS_END
/* ------------ driver ------------ */
-MACHINE_CONFIG_START(thomson_state::to8)
+void thomson_state::to8(machine_config &config)
+{
to7(config);
MCFG_MACHINE_START_OVERRIDE( thomson_state, to8 )
MCFG_MACHINE_RESET_OVERRIDE( thomson_state, to8 )
- MCFG_DEVICE_MODIFY( "maincpu" )
- MCFG_DEVICE_PROGRAM_MAP ( to8)
+ m_maincpu->set_addrmap(AS_PROGRAM, &thomson_state::to8_map);
- //MCFG_DEVICE_ADD("kbdmcu", MC6804, 11_MHz_XTAL)
+ //MC6804(config, "kbdmcu", 11_MHz_XTAL);
m_pia_sys->readpa_handler().set(FUNC(thomson_state::to8_sys_porta_in));
m_pia_sys->readpb_handler().set_constant(0);
@@ -1725,18 +1716,16 @@ MACHINE_CONFIG_START(thomson_state::to8)
/* internal ram */
m_ram->set_default_size("512K").set_extra_options("256K");
- MCFG_DEVICE_REMOVE("to7_cass_list")
- MCFG_DEVICE_REMOVE("to7_qd_list")
-
- MCFG_SOFTWARE_LIST_ADD("to8_cass_list", "to8_cass")
- MCFG_SOFTWARE_LIST_ADD("to8_qd_list", "to8_qd")
- MCFG_SOFTWARE_LIST_COMPATIBLE_ADD("to7_cass_list", "to7_cass")
- MCFG_SOFTWARE_LIST_COMPATIBLE_ADD("to7_qd_list", "to7_qd")
-MACHINE_CONFIG_END
+ SOFTWARE_LIST(config, "to8_cass_list").set_original("to8_cass");
+ SOFTWARE_LIST(config, "to8_qd_list").set_original("to8_qd");
+ SOFTWARE_LIST(config.replace(), "to7_cass_list").set_compatible("to7_cass");
+ SOFTWARE_LIST(config.replace(), "to7_qd_list").set_compatible("to7_qd");
+}
-MACHINE_CONFIG_START(thomson_state::to8d)
+void thomson_state::to8d(machine_config &config)
+{
to8(config);
-MACHINE_CONFIG_END
+}
COMP( 1986, to8, 0, 0, to8, to8, thomson_state, empty_init, "Thomson", "TO8", 0 )
@@ -1781,7 +1770,7 @@ The differences with the TO8 are:
**********************************************************************/
-void thomson_state::to9p(address_map &map)
+void thomson_state::to9p_map(address_map &map)
{
map(0x0000, 0x3fff).bankr(THOM_CART_BANK).w(FUNC(thomson_state::to8_cartridge_w)); /* 4 * 16 KB */
@@ -1862,13 +1851,13 @@ INPUT_PORTS_END
/* ------------ driver ------------ */
-MACHINE_CONFIG_START(thomson_state::to9p)
+void thomson_state::to9p(machine_config &config)
+{
to7(config);
MCFG_MACHINE_START_OVERRIDE( thomson_state, to9p )
MCFG_MACHINE_RESET_OVERRIDE( thomson_state, to9p )
- MCFG_DEVICE_MODIFY( "maincpu" )
- MCFG_DEVICE_PROGRAM_MAP ( to9p)
+ m_maincpu->set_addrmap(AS_PROGRAM, &thomson_state::to9p_map);
m_pia_sys->readpa_handler().set(FUNC(thomson_state::to8_sys_porta_in));
m_pia_sys->readpb_handler().set_constant(0);
@@ -1888,14 +1877,11 @@ MACHINE_CONFIG_START(thomson_state::to9p)
/* internal ram */
m_ram->set_default_size("512K");
- MCFG_DEVICE_REMOVE("to7_cass_list")
- MCFG_DEVICE_REMOVE("to7_qd_list")
-
- MCFG_SOFTWARE_LIST_ADD("to8_cass_list", "to8_cass")
- MCFG_SOFTWARE_LIST_ADD("to8_qd_list", "to8_qd")
- MCFG_SOFTWARE_LIST_COMPATIBLE_ADD("to7_cass_list", "to7_cass")
- MCFG_SOFTWARE_LIST_COMPATIBLE_ADD("to7_qd_list", "to7_qd")
-MACHINE_CONFIG_END
+ SOFTWARE_LIST(config, "to8_cass_list").set_original("to8_cass");
+ SOFTWARE_LIST(config, "to8_qd_list").set_original("to8_qd");
+ SOFTWARE_LIST(config.replace(), "to7_cass_list").set_compatible("to7_cass");
+ SOFTWARE_LIST(config.replace(), "to7_qd_list").set_compatible("to7_qd");
+}
COMP( 1986, to9p, 0, 0, to9p, to9p, thomson_state, empty_init, "Thomson", "TO9+", 0 )
@@ -1959,7 +1945,7 @@ a PC XT.
**********************************************************************/
-void thomson_state::mo6(address_map &map)
+void thomson_state::mo6_map(address_map &map)
{
map(0x0000, 0x1fff).bankr(THOM_VRAM_BANK).w(FUNC(thomson_state::to770_vram_w));
@@ -2213,12 +2199,10 @@ MACHINE_CONFIG_START(thomson_state::mo6)
MCFG_MACHINE_START_OVERRIDE( thomson_state, mo6 )
MCFG_MACHINE_RESET_OVERRIDE( thomson_state, mo6 )
- MCFG_DEVICE_MODIFY( "maincpu" )
- MCFG_DEVICE_PROGRAM_MAP ( mo6)
+ m_maincpu->set_addrmap(AS_PROGRAM, &thomson_state::mo6_map);
- MCFG_CASSETTE_MODIFY( "cassette" )
- MCFG_CASSETTE_FORMATS(mo5_cassette_formats)
- MCFG_CASSETTE_INTERFACE("mo_cass")
+ m_cassette->set_formats(mo5_cassette_formats);
+ m_cassette->set_interface("mo_cass");
m_pia_sys->readpa_handler().set(FUNC(thomson_state::mo6_sys_porta_in));
m_pia_sys->readpb_handler().set(FUNC(thomson_state::mo6_sys_portb_in));
@@ -2234,9 +2218,10 @@ MACHINE_CONFIG_START(thomson_state::mo6)
CENTRONICS(config, m_centronics, centronics_devices, "printer");
m_centronics->busy_handler().set(FUNC(thomson_state::write_centronics_busy));
- MCFG_CENTRONICS_OUTPUT_LATCH_ADD("cent_data_out", "centronics")
+ OUTPUT_LATCH(config, m_cent_data_out);
+ m_centronics->set_output_latch(*m_cent_data_out);
- MCFG_DEVICE_REMOVE("cartslot")
+ config.device_remove("cartslot");
MCFG_GENERIC_CARTSLOT_ADD("cartslot", generic_plain_slot, "mo_cart")
MCFG_GENERIC_EXTENSIONS("m5,rom")
MCFG_GENERIC_LOAD(thomson_state, mo5_cartridge)
@@ -2244,34 +2229,35 @@ MACHINE_CONFIG_START(thomson_state::mo6)
/* internal ram */
m_ram->set_default_size("128K");
- MCFG_DEVICE_REMOVE("to7_cart_list")
- MCFG_DEVICE_REMOVE("to7_cass_list")
- MCFG_DEVICE_REMOVE("to_flop_list")
- MCFG_DEVICE_REMOVE("to7_qd_list")
+ config.device_remove("to7_cart_list");
+ config.device_remove("to7_cass_list");
+ config.device_remove("to_flop_list");
+ config.device_remove("to7_qd_list");
- MCFG_SOFTWARE_LIST_ADD("mo6_cass_list","mo6_cass")
- MCFG_SOFTWARE_LIST_ADD("mo6_flop_list","mo6_flop")
+ SOFTWARE_LIST(config, "mo6_cass_list").set_original("mo6_cass");
+ SOFTWARE_LIST(config, "mo6_flop_list").set_original("mo6_flop");
- MCFG_SOFTWARE_LIST_COMPATIBLE_ADD("mo5_cart_list","mo5_cart")
- MCFG_SOFTWARE_LIST_COMPATIBLE_ADD("mo5_cass_list","mo5_cass")
- MCFG_SOFTWARE_LIST_COMPATIBLE_ADD("mo5_flop_list","mo5_flop")
- MCFG_SOFTWARE_LIST_COMPATIBLE_ADD("mo5_qd_list","mo5_qd")
+ SOFTWARE_LIST(config, "mo5_cart_list").set_compatible("mo5_cart");
+ SOFTWARE_LIST(config, "mo5_cass_list").set_compatible("mo5_cass");
+ SOFTWARE_LIST(config, "mo5_flop_list").set_compatible("mo5_flop");
+ SOFTWARE_LIST(config, "mo5_qd_list").set_compatible("mo5_qd");
MACHINE_CONFIG_END
-MACHINE_CONFIG_START(thomson_state::pro128)
+void thomson_state::pro128(machine_config &config)
+{
mo6(config);
- MCFG_DEVICE_REMOVE("mo6_cass_list")
- MCFG_DEVICE_REMOVE("mo6_flop_list")
+ config.device_remove("mo6_cass_list");
+ config.device_remove("mo6_flop_list");
- MCFG_DEVICE_REMOVE("mo5_cart_list")
- MCFG_DEVICE_REMOVE("mo5_cass_list")
- MCFG_DEVICE_REMOVE("mo5_flop_list")
- MCFG_DEVICE_REMOVE("mo5_qd_list")
+ config.device_remove("mo5_cart_list");
+ config.device_remove("mo5_cass_list");
+ config.device_remove("mo5_flop_list");
+ config.device_remove("mo5_qd_list");
- MCFG_SOFTWARE_LIST_ADD("p128_cart_list","pro128_cart")
- MCFG_SOFTWARE_LIST_ADD("p128_cass_list","pro128_cass")
- MCFG_SOFTWARE_LIST_ADD("p128_flop_list","pro128_flop")
-MACHINE_CONFIG_END
+ SOFTWARE_LIST(config, "p128_cart_list").set_original("pro128_cart");
+ SOFTWARE_LIST(config, "p128_cass_list").set_original("pro128_cass");
+ SOFTWARE_LIST(config, "p128_flop_list").set_original("pro128_flop");
+}
COMP( 1986, mo6, 0, 0, mo6, mo6, thomson_state, empty_init, "Thomson", "MO6", 0 )
@@ -2308,7 +2294,7 @@ Here are the differences between the MO6 and MO5NR:
**********************************************************************/
-void thomson_state::mo5nr(address_map &map)
+void thomson_state::mo5nr_map(address_map &map)
{
map(0x0000, 0x1fff).bankr(THOM_VRAM_BANK).w(FUNC(thomson_state::to770_vram_w));
@@ -2478,12 +2464,10 @@ MACHINE_CONFIG_START(thomson_state::mo5nr)
MCFG_MACHINE_START_OVERRIDE( thomson_state, mo5nr )
MCFG_MACHINE_RESET_OVERRIDE( thomson_state, mo5nr )
- MCFG_DEVICE_MODIFY( "maincpu" )
- MCFG_DEVICE_PROGRAM_MAP ( mo5nr)
+ m_maincpu->set_addrmap(AS_PROGRAM, &thomson_state::mo5nr_map);
- MCFG_CASSETTE_MODIFY( "cassette" )
- MCFG_CASSETTE_FORMATS(mo5_cassette_formats)
- MCFG_CASSETTE_INTERFACE("mo_cass")
+ m_cassette->set_formats(mo5_cassette_formats);
+ m_cassette->set_interface("mo_cass");
m_pia_sys->readpa_handler().set(FUNC(thomson_state::mo6_sys_porta_in));
m_pia_sys->readpb_handler().set(FUNC(thomson_state::mo5nr_sys_portb_in));
@@ -2500,9 +2484,11 @@ MACHINE_CONFIG_START(thomson_state::mo5nr)
m_centronics->busy_handler().set(FUNC(thomson_state::write_centronics_busy));
INPUT_BUFFER(config, "cent_data_in");
- MCFG_CENTRONICS_OUTPUT_LATCH_ADD("cent_data_out", "centronics")
- MCFG_DEVICE_REMOVE("cartslot")
+ OUTPUT_LATCH(config, m_cent_data_out);
+ m_centronics->set_output_latch(*m_cent_data_out);
+
+ config.device_remove("cartslot");
MCFG_GENERIC_CARTSLOT_ADD("cartslot", generic_plain_slot, "mo_cart")
MCFG_GENERIC_EXTENSIONS("m5,rom")
MCFG_GENERIC_LOAD(thomson_state, mo5_cartridge)
@@ -2510,18 +2496,18 @@ MACHINE_CONFIG_START(thomson_state::mo5nr)
/* internal ram */
m_ram->set_default_size("128K");
- MCFG_DEVICE_REMOVE("to7_cart_list")
- MCFG_DEVICE_REMOVE("to7_cass_list")
- MCFG_DEVICE_REMOVE("to_flop_list")
- MCFG_DEVICE_REMOVE("to7_qd_list")
+ config.device_remove("to7_cart_list");
+ config.device_remove("to7_cass_list");
+ config.device_remove("to_flop_list");
+ config.device_remove("to7_qd_list");
- MCFG_SOFTWARE_LIST_ADD("mo6_cass_list","mo6_cass")
- MCFG_SOFTWARE_LIST_ADD("mo6_flop_list","mo6_flop")
+ SOFTWARE_LIST(config, "mo6_cass_list").set_original("mo6_cass");
+ SOFTWARE_LIST(config, "mo6_flop_list").set_original("mo6_flop");
- MCFG_SOFTWARE_LIST_COMPATIBLE_ADD("mo5_cart_list","mo5_cart")
- MCFG_SOFTWARE_LIST_COMPATIBLE_ADD("mo5_cass_list","mo5_cass")
- MCFG_SOFTWARE_LIST_COMPATIBLE_ADD("mo5_flop_list","mo5_flop")
- MCFG_SOFTWARE_LIST_COMPATIBLE_ADD("mo5_qd_list","mo5_qd")
+ SOFTWARE_LIST(config, "mo5_cart_list").set_compatible("mo5_cart");
+ SOFTWARE_LIST(config, "mo5_cass_list").set_compatible("mo5_cass");
+ SOFTWARE_LIST(config, "mo5_flop_list").set_compatible("mo5_flop");
+ SOFTWARE_LIST(config, "mo5_qd_list").set_compatible("mo5_qd");
MACHINE_CONFIG_END
COMP( 1986, mo5nr, 0, 0, mo5nr, mo5nr, thomson_state, empty_init, "Thomson", "MO5 NR", 0 )
diff --git a/src/mame/drivers/thoop2.cpp b/src/mame/drivers/thoop2.cpp
index 8e1c0552dea..b3f201a1ec2 100644
--- a/src/mame/drivers/thoop2.cpp
+++ b/src/mame/drivers/thoop2.cpp
@@ -263,15 +263,15 @@ static GFXDECODE_START( gfx_thoop2 )
GFXDECODE_END
-MACHINE_CONFIG_START(thoop2_state::thoop2)
-
+void thoop2_state::thoop2(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M68000,XTAL(24'000'000) / 2) // 12MHz verified
- MCFG_DEVICE_PROGRAM_MAP(thoop2_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", thoop2_state, irq6_line_hold)
+ M68000(config, m_maincpu, XTAL(24'000'000) / 2); // 12MHz verified
+ m_maincpu->set_addrmap(AS_PROGRAM, &thoop2_state::thoop2_map);
+ m_maincpu->set_vblank_int("screen", FUNC(thoop2_state::irq6_line_hold));
- MCFG_DEVICE_ADD("gaelco_ds5002fp", GAELCO_DS5002FP, XTAL(24'000'000) / 2) // 12MHz verified
- MCFG_DEVICE_ADDRESS_MAP(0, mcu_hostmem_map)
+ gaelco_ds5002fp_device &ds5002fp(GAELCO_DS5002FP(config, "gaelco_ds5002fp", XTAL(24'000'000) / 2)); // 12MHz verified
+ ds5002fp.set_addrmap(0, &thoop2_state::mcu_hostmem_map);
LS259(config, m_outlatch);
m_outlatch->q_out_cb<0>().set(FUNC(thoop2_state::coin1_lockout_w));
@@ -284,24 +284,24 @@ MACHINE_CONFIG_START(thoop2_state::thoop2)
WATCHDOG_TIMER(config, "watchdog");
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(59.24)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */)
- MCFG_SCREEN_SIZE(32*16, 32*16)
- MCFG_SCREEN_VISIBLE_AREA(0, 320-1, 16, 256-1)
- MCFG_SCREEN_UPDATE_DRIVER(thoop2_state, screen_update)
- MCFG_SCREEN_PALETTE(m_palette)
-
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_thoop2)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(59.24);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500) /* not accurate */);
+ screen.set_size(32*16, 32*16);
+ screen.set_visarea(0, 320-1, 16, 256-1);
+ screen.set_screen_update(FUNC(thoop2_state::screen_update));
+ screen.set_palette(m_palette);
+
+ GFXDECODE(config, m_gfxdecode, m_palette, gfx_thoop2);
PALETTE(config, m_palette).set_format(palette_device::xBGR_555, 1024);
/* sound hardware */
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("oki", OKIM6295, XTAL(1'000'000), okim6295_device::PIN7_HIGH) // 1MHz resonator - pin 7 not connected
- MCFG_DEVICE_ADDRESS_MAP(0, oki_map)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
-MACHINE_CONFIG_END
+ okim6295_device &oki(OKIM6295(config, "oki", XTAL(1'000'000), okim6295_device::PIN7_HIGH)); // 1MHz resonator - pin 7 not connected
+ oki.set_addrmap(0, &thoop2_state::oki_map);
+ oki.add_route(ALL_OUTPUTS, "mono", 1.0);
+}
diff --git a/src/mame/drivers/thunderj.cpp b/src/mame/drivers/thunderj.cpp
index c75c7a9afe1..53403e0eaa3 100644
--- a/src/mame/drivers/thunderj.cpp
+++ b/src/mame/drivers/thunderj.cpp
@@ -241,24 +241,24 @@ GFXDECODE_END
*
*************************************/
-MACHINE_CONFIG_START(thunderj_state::thunderj)
-
+void thunderj_state::thunderj(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M68000, ATARI_CLOCK_14MHz/2)
- MCFG_DEVICE_PROGRAM_MAP(main_map)
+ M68000(config, m_maincpu, ATARI_CLOCK_14MHz/2);
+ m_maincpu->set_addrmap(AS_PROGRAM, &thunderj_state::main_map);
- MCFG_DEVICE_ADD("extra", M68000, ATARI_CLOCK_14MHz/2)
- MCFG_DEVICE_PROGRAM_MAP(extra_map)
+ M68000(config, m_extra, ATARI_CLOCK_14MHz/2);
+ m_extra->set_addrmap(AS_PROGRAM, &thunderj_state::extra_map);
EEPROM_2816(config, "eeprom").lock_after_write(true);
WATCHDOG_TIMER(config, "watchdog");
/* perfect synchronization due to shared RAM */
- MCFG_QUANTUM_PERFECT_CPU("maincpu")
+ config.m_perfect_cpu_quantum = subtag("maincpu");
/* video hardware */
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_thunderj)
+ GFXDECODE(config, "gfxdecode", "palette", gfx_thunderj);
PALETTE(config, "palette").set_format(palette_device::IRGB_1555, 2048);
ATARI_VAD(config, m_vad, 0, m_screen);
@@ -268,13 +268,13 @@ MACHINE_CONFIG_START(thunderj_state::thunderj)
TILEMAP(config, "vad:alpha", "gfxdecode", 2, 8, 8, TILEMAP_SCAN_ROWS, 64, 32, 0).set_info_callback(DEVICE_SELF_OWNER, FUNC(thunderj_state::get_alpha_tile_info));
ATARI_MOTION_OBJECTS(config, "vad:mob", 0, m_screen, thunderj_state::s_mob_config).set_gfxdecode("gfxdecode");
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_VIDEO_ATTRIBUTES(VIDEO_UPDATE_BEFORE_VBLANK)
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_video_attributes(VIDEO_UPDATE_BEFORE_VBLANK);
/* note: these parameters are from published specs, not derived */
/* the board uses a VAD chip to generate video signals */
- MCFG_SCREEN_RAW_PARAMS(ATARI_CLOCK_14MHz/2, 456, 0, 336, 262, 0, 240)
- MCFG_SCREEN_UPDATE_DRIVER(thunderj_state, screen_update_thunderj)
- MCFG_SCREEN_PALETTE("palette")
+ m_screen->set_raw(ATARI_CLOCK_14MHz/2, 456, 0, 336, 262, 0, 240);
+ m_screen->set_screen_update(FUNC(thunderj_state::screen_update_thunderj));
+ m_screen->set_palette("palette");
/* sound hardware */
SPEAKER(config, "mono").front_center();
@@ -283,7 +283,7 @@ MACHINE_CONFIG_START(thunderj_state::thunderj)
m_jsa->main_int_cb().set_inputline(m_maincpu, M68K_IRQ_6);
m_jsa->test_read_cb().set_ioport("260012").bit(1);
m_jsa->add_route(ALL_OUTPUTS, "mono", 1.0);
-MACHINE_CONFIG_END
+}
diff --git a/src/mame/drivers/ti74.cpp b/src/mame/drivers/ti74.cpp
index 4549c705a43..ba84d7fd57d 100644
--- a/src/mame/drivers/ti74.cpp
+++ b/src/mame/drivers/ti74.cpp
@@ -280,7 +280,7 @@ void ti74_state::main_map(address_map &map)
map.unmap_value_high();
map(0x1000, 0x1001).rw("hd44780", FUNC(hd44780_device::read), FUNC(hd44780_device::write));
map(0x2000, 0x3fff).ram().share("sysram.ic3");
- //AM_RANGE(0x4000, 0xbfff) // mapped by the cartslot
+ //map(0x4000, 0xbfff) // mapped by the cartslot
map(0xc000, 0xdfff).bankr("sysbank");
}
@@ -504,7 +504,7 @@ void ti74_state::machine_start()
m_lamps.resolve();
if (m_cart->exists())
- m_maincpu->space(AS_PROGRAM).install_read_handler(0x4000, 0xbfff, read8_delegate(FUNC(generic_slot_device::read_rom),(generic_slot_device*)m_cart));
+ m_maincpu->space(AS_PROGRAM).install_read_handler(0x4000, 0xbfff, read8sm_delegate(FUNC(generic_slot_device::read_rom),(generic_slot_device*)m_cart));
membank("sysbank")->configure_entries(0, 4, memregion("system")->base(), 0x2000);
membank("sysbank")->set_entry(0);
@@ -530,27 +530,28 @@ MACHINE_CONFIG_START(ti74_state::ti74)
NVRAM(config, "sysram.ic3", nvram_device::DEFAULT_ALL_0);
/* video hardware */
- MCFG_SCREEN_ADD("screen", LCD)
- MCFG_SCREEN_REFRESH_RATE(60) // arbitrary
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500))
- MCFG_SCREEN_SIZE(6*31+1, 9*1+1+1)
- MCFG_SCREEN_VISIBLE_AREA(0, 6*31, 0, 9*1+1)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_LCD));
+ screen.set_refresh_hz(60); // arbitrary
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500));
+ screen.set_size(6*31+1, 9*1+1+1);
+ screen.set_visarea_full();
+ screen.set_screen_update("hd44780", FUNC(hd44780_device::screen_update));
+ screen.set_palette("palette");
+
config.set_default_layout(layout_ti74);
- MCFG_SCREEN_UPDATE_DEVICE("hd44780", hd44780_device, screen_update)
- MCFG_SCREEN_PALETTE("palette")
PALETTE(config, "palette", FUNC(ti74_state::ti74_palette), 3);
- MCFG_HD44780_ADD("hd44780") // 270kHz
- MCFG_HD44780_LCD_SIZE(2, 16) // 2*16 internal
- MCFG_HD44780_PIXEL_UPDATE_CB(ti74_state,ti74_pixel_update)
+ hd44780_device &hd44780(HD44780(config, "hd44780", 0)); // 270kHz
+ hd44780.set_lcd_size(2, 16); // 2*16 internal
+ hd44780.set_pixel_update_cb(FUNC(ti74_state::ti74_pixel_update), this);
/* cartridge */
MCFG_GENERIC_CARTSLOT_ADD("cartslot", generic_plain_slot, "ti74_cart")
MCFG_GENERIC_EXTENSIONS("bin,rom,256")
MCFG_GENERIC_LOAD(ti74_state, ti74_cartridge)
- MCFG_SOFTWARE_LIST_ADD("cart_list", "ti74_cart")
+ SOFTWARE_LIST(config, "cart_list").set_original("ti74_cart");
MACHINE_CONFIG_END
MACHINE_CONFIG_START(ti74_state::ti95)
@@ -565,27 +566,28 @@ MACHINE_CONFIG_START(ti74_state::ti95)
NVRAM(config, "sysram.ic3", nvram_device::DEFAULT_ALL_0);
/* video hardware */
- MCFG_SCREEN_ADD("screen", LCD)
- MCFG_SCREEN_REFRESH_RATE(60) // arbitrary
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500))
- MCFG_SCREEN_SIZE(200, 20)
- MCFG_SCREEN_VISIBLE_AREA(0, 200-1, 0, 20-1)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_LCD));
+ screen.set_refresh_hz(60); // arbitrary
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500));
+ screen.set_size(200, 20);
+ screen.set_visarea_full();
+ screen.set_screen_update("hd44780", FUNC(hd44780_device::screen_update));
+ screen.set_palette("palette");
+
config.set_default_layout(layout_ti95);
- MCFG_SCREEN_UPDATE_DEVICE("hd44780", hd44780_device, screen_update)
- MCFG_SCREEN_PALETTE("palette")
PALETTE(config, "palette", FUNC(ti74_state::ti74_palette), 3);
- MCFG_HD44780_ADD("hd44780")
- MCFG_HD44780_LCD_SIZE(2, 16)
- MCFG_HD44780_PIXEL_UPDATE_CB(ti74_state,ti95_pixel_update)
+ hd44780_device &hd44780(HD44780(config, "hd44780", 0));
+ hd44780.set_lcd_size(2, 16);
+ hd44780.set_pixel_update_cb(FUNC(ti74_state::ti95_pixel_update), this);
/* cartridge */
MCFG_GENERIC_CARTSLOT_ADD("cartslot", generic_plain_slot, "ti95_cart")
MCFG_GENERIC_EXTENSIONS("bin,rom,256")
MCFG_GENERIC_LOAD(ti74_state, ti74_cartridge)
- MCFG_SOFTWARE_LIST_ADD("cart_list", "ti95_cart")
+ SOFTWARE_LIST(config, "cart_list").set_original("ti95_cart");
MACHINE_CONFIG_END
diff --git a/src/mame/drivers/ti85.cpp b/src/mame/drivers/ti85.cpp
index 311202be357..e4a049b11a5 100644
--- a/src/mame/drivers/ti85.cpp
+++ b/src/mame/drivers/ti85.cpp
@@ -12,13 +12,13 @@ Notes:
4. Only difference between all TI-86 drivers is ROM version.
5. Video engine (with grayscale support) based on the idea found in VTI source
emulator written by Rusty Wagner.
-6. NVRAM is saved properly only when calculator is turned off before exiting MESS.
+6. NVRAM is saved properly only when calculator is turned off before exiting MAME.
7. To receive data from TI press "R" immediately after TI starts to send data.
8. To request screen dump from calculator press "S".
9. TI-81 does not have a serial link.
Needed:
-1. Info about ports 3 (bit 2 seems to be allways 0) and 4.
+1. Info about ports 3 (bit 2 seems to be always 0) and 4.
2. Any info on TI-81 hardware.
3. ROM dumps of unemulated models.
4. Artworks.
@@ -374,10 +374,10 @@ void ti85_state::ti83p_banked_mem(address_map &map)
void ti85_state::ti83p_asic_mem(address_map &map)
{
- map(0x0000, 0x3fff).rw(m_membank1, FUNC(address_map_bank_device::read8), FUNC(address_map_bank_device::write8));
- map(0x4000, 0x7fff).w(m_membank2, FUNC(address_map_bank_device::write8)).r(FUNC(ti85_state::ti83p_membank2_r));
- map(0x8000, 0xbfff).w(m_membank3, FUNC(address_map_bank_device::write8)).r(FUNC(ti85_state::ti83p_membank3_r));
- map(0xc000, 0xffff).rw(m_membank4, FUNC(address_map_bank_device::read8), FUNC(address_map_bank_device::write8));
+ map(0x0000, 0x3fff).rw(m_membank[0], FUNC(address_map_bank_device::read8), FUNC(address_map_bank_device::write8));
+ map(0x4000, 0x7fff).w(m_membank[1], FUNC(address_map_bank_device::write8)).r(FUNC(ti85_state::ti83p_membank2_r));
+ map(0x8000, 0xbfff).w(m_membank[2], FUNC(address_map_bank_device::write8)).r(FUNC(ti85_state::ti83p_membank3_r));
+ map(0xc000, 0xffff).rw(m_membank[3], FUNC(address_map_bank_device::read8), FUNC(address_map_bank_device::write8));
}
/* keyboard input */
@@ -578,184 +578,172 @@ static INPUT_PORTS_START (ti83)
INPUT_PORTS_END
/* machine definition */
-MACHINE_CONFIG_START(ti85_state::ti81)
+void ti85_state::ti81(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, 2000000) /* 2 MHz */
- MCFG_DEVICE_PROGRAM_MAP(ti81_mem)
- MCFG_DEVICE_IO_MAP(ti81_io)
+ Z80(config, m_maincpu, 2000000); /* 2 MHz */
+ m_maincpu->set_addrmap(AS_PROGRAM, &ti85_state::ti81_mem);
+ m_maincpu->set_addrmap(AS_IO, &ti85_state::ti81_io);
/* video hardware */
- MCFG_SCREEN_ADD("screen", LCD)
- MCFG_SCREEN_REFRESH_RATE(50)
- MCFG_SCREEN_VBLANK_TIME(0)
- MCFG_SCREEN_SIZE(96, 64)
- MCFG_SCREEN_VISIBLE_AREA(0, 96-1, 0, 64-1)
- MCFG_SCREEN_UPDATE_DRIVER(ti85_state, screen_update_ti85)
- MCFG_SCREEN_PALETTE("palette")
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_LCD));
+ screen.set_refresh_hz(50);
+ screen.set_vblank_time(0);
+ screen.set_size(96, 64);
+ screen.set_visarea(0, 96-1, 0, 64-1);
+ screen.set_screen_update(FUNC(ti85_state::screen_update_ti85));
+ screen.set_palette("palette");
PALETTE(config, "palette", FUNC(ti85_state::ti85_palette), 224, 224);
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(ti85_state::ti85)
+void ti85_state::ti85(machine_config &config)
+{
ti81(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_CLOCK(6000000) /* 6 MHz */
- MCFG_DEVICE_IO_MAP(ti85_io)
+ m_maincpu->set_clock(6000000); /* 6 MHz */
+ m_maincpu->set_addrmap(AS_IO, &ti85_state::ti85_io);
MCFG_MACHINE_RESET_OVERRIDE(ti85_state, ti85 )
- MCFG_SCREEN_MODIFY("screen")
- MCFG_SCREEN_SIZE(128, 64)
- MCFG_SCREEN_VISIBLE_AREA(0, 128-1, 0, 64-1)
+ subdevice<screen_device>("screen")->set_size(128, 64);
+ subdevice<screen_device>("screen")->set_visarea(0, 128-1, 0, 64-1);
- MCFG_DEVICE_ADD("linkport", TI8X_LINK_PORT, default_ti8x_link_devices, nullptr)
-MACHINE_CONFIG_END
+ TI8X_LINK_PORT(config, m_link_port, default_ti8x_link_devices, nullptr);
+}
MACHINE_CONFIG_START(ti85_state::ti85d)
ti85(config);
- MCFG_SNAPSHOT_ADD("snapshot", ti85_state, ti8x, "sav", 0)
- //MCFG_TI85SERIAL_ADD( "tiserial" )
+ MCFG_SNAPSHOT_ADD("snapshot", ti85_state, ti8x, "sav")
+ //TI85SERIAL(config, "tiserial");
MACHINE_CONFIG_END
-MACHINE_CONFIG_START(ti85_state::ti82)
+void ti85_state::ti82(machine_config &config)
+{
ti81(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_CLOCK(6000000) /* 6 MHz */
- MCFG_DEVICE_IO_MAP(ti82_io)
+ m_maincpu->set_clock(6000000); /* 6 MHz */
+ m_maincpu->set_addrmap(AS_IO, &ti85_state::ti82_io);
MCFG_MACHINE_RESET_OVERRIDE(ti85_state, ti85 )
- MCFG_SCREEN_MODIFY("screen")
- MCFG_SCREEN_UPDATE_DEVICE("t6a04", t6a04_device, screen_update)
+ subdevice<screen_device>("screen")->set_screen_update("t6a04", FUNC(t6a04_device::screen_update));
subdevice<palette_device>("palette")->set_entries(2).set_init(FUNC(ti85_state::ti82_palette));
- MCFG_DEVICE_ADD("t6a04", T6A04, 0)
- MCFG_T6A04_SIZE(96, 64)
+ T6A04(config, "t6a04", 0).set_size(96, 64);
- MCFG_DEVICE_ADD("linkport", TI8X_LINK_PORT, default_ti8x_link_devices, nullptr)
-MACHINE_CONFIG_END
+ TI8X_LINK_PORT(config, m_link_port, default_ti8x_link_devices, nullptr);
+}
-MACHINE_CONFIG_START(ti85_state::ti81v2)
+void ti85_state::ti81v2(machine_config &config)
+{
ti82(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_IO_MAP(ti81v2_io)
+ m_maincpu->set_addrmap(AS_IO, &ti85_state::ti81v2_io);
- MCFG_DEVICE_REMOVE("linkport")
-MACHINE_CONFIG_END
+ config.device_remove("linkport");
+}
-MACHINE_CONFIG_START(ti85_state::ti83)
+void ti85_state::ti83(machine_config &config)
+{
ti81(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_CLOCK(6000000) /* 6 MHz */
- MCFG_DEVICE_IO_MAP(ti83_io)
+ m_maincpu->set_clock(6000000); /* 6 MHz */
+ m_maincpu->set_addrmap(AS_IO, &ti85_state::ti83_io);
MCFG_MACHINE_RESET_OVERRIDE(ti85_state, ti85 )
- MCFG_SCREEN_MODIFY("screen")
- MCFG_SCREEN_UPDATE_DEVICE("t6a04", t6a04_device, screen_update)
+ subdevice<screen_device>("screen")->set_screen_update("t6a04", FUNC(t6a04_device::screen_update));
subdevice<palette_device>("palette")->set_entries(2).set_init(FUNC(ti85_state::ti82_palette));
- MCFG_DEVICE_ADD("t6a04", T6A04, 0)
- MCFG_T6A04_SIZE(96, 64)
-MACHINE_CONFIG_END
+ T6A04(config, "t6a04", 0).set_size(96, 64);
+}
MACHINE_CONFIG_START(ti85_state::ti86)
ti85(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(ti86_mem)
- MCFG_DEVICE_IO_MAP(ti86_io)
+ m_maincpu->set_addrmap(AS_PROGRAM, &ti85_state::ti86_mem);
+ m_maincpu->set_addrmap(AS_IO, &ti85_state::ti86_io);
MCFG_MACHINE_START_OVERRIDE(ti85_state, ti86 )
MCFG_MACHINE_RESET_OVERRIDE(ti85_state, ti85 )
- MCFG_SNAPSHOT_ADD("snapshot", ti85_state, ti8x, "sav", 0)
+ MCFG_SNAPSHOT_ADD("snapshot", ti85_state, ti8x, "sav")
MACHINE_CONFIG_END
-MACHINE_CONFIG_START(ti85_state::ti83p)
+void ti85_state::ti83p(machine_config &config)
+{
ti81(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_CLOCK(6000000) /* 8 MHz running at 6 MHz */
- MCFG_DEVICE_PROGRAM_MAP(ti83p_asic_mem)
- MCFG_DEVICE_IO_MAP(ti83p_io)
+ m_maincpu->set_clock(6000000); /* 8 MHz running at 6 MHz */
+ m_maincpu->set_addrmap(AS_PROGRAM, &ti85_state::ti83p_asic_mem);
+ m_maincpu->set_addrmap(AS_IO, &ti85_state::ti83p_io);
MCFG_MACHINE_START_OVERRIDE(ti85_state, ti83p )
MCFG_MACHINE_RESET_OVERRIDE(ti85_state, ti83p )
- MCFG_SCREEN_MODIFY("screen")
- MCFG_SCREEN_UPDATE_DEVICE("t6a04", t6a04_device, screen_update)
+ subdevice<screen_device>("screen")->set_screen_update("t6a04", FUNC(t6a04_device::screen_update));
subdevice<palette_device>("palette")->set_entries(2).set_init(FUNC(ti85_state::ti82_palette));
- ADDRESS_MAP_BANK(config, "membank1").set_map(&ti85_state::ti83p_banked_mem).set_options(ENDIANNESS_LITTLE, 8, 32, 0x4000);
- ADDRESS_MAP_BANK(config, "membank2").set_map(&ti85_state::ti83p_banked_mem).set_options(ENDIANNESS_LITTLE, 8, 32, 0x4000);
- ADDRESS_MAP_BANK(config, "membank3").set_map(&ti85_state::ti83p_banked_mem).set_options(ENDIANNESS_LITTLE, 8, 32, 0x4000);
- ADDRESS_MAP_BANK(config, "membank4").set_map(&ti85_state::ti83p_banked_mem).set_options(ENDIANNESS_LITTLE, 8, 32, 0x4000);
+ ADDRESS_MAP_BANK(config, m_membank[0]).set_map(&ti85_state::ti83p_banked_mem).set_options(ENDIANNESS_LITTLE, 8, 32, 0x4000);
+ ADDRESS_MAP_BANK(config, m_membank[1]).set_map(&ti85_state::ti83p_banked_mem).set_options(ENDIANNESS_LITTLE, 8, 32, 0x4000);
+ ADDRESS_MAP_BANK(config, m_membank[2]).set_map(&ti85_state::ti83p_banked_mem).set_options(ENDIANNESS_LITTLE, 8, 32, 0x4000);
+ ADDRESS_MAP_BANK(config, m_membank[3]).set_map(&ti85_state::ti83p_banked_mem).set_options(ENDIANNESS_LITTLE, 8, 32, 0x4000);
- MCFG_DEVICE_ADD("t6a04", T6A04, 0)
- MCFG_T6A04_SIZE(96, 64)
+ T6A04(config, "t6a04", 0).set_size(96, 64);
- MCFG_DEVICE_ADD("linkport", TI8X_LINK_PORT, default_ti8x_link_devices, nullptr)
+ TI8X_LINK_PORT(config, m_link_port, default_ti8x_link_devices, nullptr);
- AMD_29F400T(config, "flash");
-MACHINE_CONFIG_END
+ AMD_29F400T(config, m_flash);
+}
-MACHINE_CONFIG_START(ti85_state::ti83pse)
+void ti85_state::ti83pse(machine_config &config)
+{
ti83p(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_CLOCK( 15000000)
- MCFG_DEVICE_IO_MAP(ti83pse_io)
+ m_maincpu->set_clock(15000000);
+ m_maincpu->set_addrmap(AS_IO, &ti85_state::ti83pse_io);
- MCFG_DEVICE_MODIFY("membank1")
- MCFG_DEVICE_PROGRAM_MAP(ti83pse_banked_mem)
+ m_membank[0]->set_map(&ti85_state::ti83pse_banked_mem);
- MCFG_DEVICE_MODIFY("membank2")
- MCFG_DEVICE_PROGRAM_MAP(ti83pse_banked_mem)
+ m_membank[1]->set_map(&ti85_state::ti83pse_banked_mem);
- MCFG_DEVICE_MODIFY("membank3")
- MCFG_DEVICE_PROGRAM_MAP(ti83pse_banked_mem)
+ m_membank[2]->set_map(&ti85_state::ti83pse_banked_mem);
- MCFG_DEVICE_MODIFY("membank4")
- MCFG_DEVICE_PROGRAM_MAP(ti83pse_banked_mem)
+ m_membank[3]->set_map(&ti85_state::ti83pse_banked_mem);
MCFG_MACHINE_START_OVERRIDE(ti85_state, ti83pse )
- MCFG_DEVICE_REPLACE("flash", FUJITSU_29F160T, 0)
-MACHINE_CONFIG_END
+ FUJITSU_29F160T(config.replace(), m_flash, 0);
+}
-MACHINE_CONFIG_START(ti85_state::ti84p)
+void ti85_state::ti84p(machine_config &config)
+{
ti83pse(config);
- MCFG_DEVICE_MODIFY("membank1")
- MCFG_DEVICE_PROGRAM_MAP(ti84p_banked_mem)
+ m_membank[0]->set_map(&ti85_state::ti84p_banked_mem);
- MCFG_DEVICE_MODIFY("membank2")
- MCFG_DEVICE_PROGRAM_MAP(ti84p_banked_mem)
+ m_membank[1]->set_map(&ti85_state::ti84p_banked_mem);
- MCFG_DEVICE_MODIFY("membank3")
- MCFG_DEVICE_PROGRAM_MAP(ti84p_banked_mem)
+ m_membank[2]->set_map(&ti85_state::ti84p_banked_mem);
- MCFG_DEVICE_MODIFY("membank4")
- MCFG_DEVICE_PROGRAM_MAP(ti84p_banked_mem)
+ m_membank[3]->set_map(&ti85_state::ti84p_banked_mem);
MCFG_MACHINE_START_OVERRIDE(ti85_state, ti84p )
- MCFG_DEVICE_REPLACE("flash", AMD_29F800T , 0)
-MACHINE_CONFIG_END
+ AMD_29F800T(config.replace(), m_flash, 0);
+}
-MACHINE_CONFIG_START(ti85_state::ti84pse)
+void ti85_state::ti84pse(machine_config &config)
+{
ti83pse(config);
MCFG_MACHINE_START_OVERRIDE(ti85_state, ti84pse )
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(ti85_state::ti73)
+void ti85_state::ti73(machine_config &config)
+{
ti83p(config);
- MCFG_DEVICE_REMOVE("linkport")
- //MCFG_TI73SERIAL_ADD( "tiserial" )
-MACHINE_CONFIG_END
+ config.device_remove("linkport");
+ //TI73SERIAL(config, "tiserial");
+}
ROM_START (ti73)
ROM_REGION (0x80000, "flash",0)
@@ -769,21 +757,20 @@ ROM_START (ti73b)
ROM_DEFAULT_BIOS("v191")
ROM_SYSTEM_BIOS( 0, "v13004", "V 1.3004" )
ROMX_LOAD( "ti73bv13004.bin", 0x00000, 0x80000, CRC(453701d8) SHA1(371d1f74a5e26ed749e12baac104f0069f329f44), ROM_BIOS(0) )
- ROM_SYSTEM_BIOS( 1, "v140", "V 1.40" )
+ ROM_SYSTEM_BIOS( 1, "v140", "V 1.40" )
ROMX_LOAD( "ti73bv140.bin", 0x00000, 0x80000, CRC(057e85ae) SHA1(4c45c8b26190e887bb9cdc3b185fd7e703922cbc), ROM_BIOS(1) )
- ROM_SYSTEM_BIOS( 2, "v150", "V 1.50" )
+ ROM_SYSTEM_BIOS( 2, "v150", "V 1.50" )
ROMX_LOAD( "ti73bv150.bin", 0x00000, 0x80000, CRC(c0edfb53) SHA1(1049363587b6d7985356aa2467a0118e6cc6dc37), ROM_BIOS(2) )
- ROM_SYSTEM_BIOS( 3, "v160", "V 1.60" )
+ ROM_SYSTEM_BIOS( 3, "v160", "V 1.60" )
ROMX_LOAD( "ti73bv160.bin", 0x00000, 0x80000, CRC(28d07d9d) SHA1(7795720a68ca7017e682a8f2fe617b0cd758c008), ROM_BIOS(3) )
- ROM_SYSTEM_BIOS( 4, "v180", "V 1.80" )
+ ROM_SYSTEM_BIOS( 4, "v180", "V 1.80" )
ROMX_LOAD( "ti73bv180.bin", 0x00000, 0x80000, CRC(7d3b9ee6) SHA1(93bfc8d951c526e1be7c0e1bebc43dd20cd4c3b1), ROM_BIOS(4) )
- ROM_SYSTEM_BIOS( 5, "v185", "V 1.85" )
+ ROM_SYSTEM_BIOS( 5, "v185", "V 1.85" )
ROMX_LOAD( "ti73bv185.bin", 0x00000, 0x80000, CRC(4e7d68e7) SHA1(52a8b71fee7cda11935d6e89825842b4aad046dd), ROM_BIOS(5) )
- ROM_SYSTEM_BIOS( 6, "v190", "V 1.90" )
+ ROM_SYSTEM_BIOS( 6, "v190", "V 1.90" )
ROMX_LOAD( "ti73bv190.bin", 0x00000, 0x80000, CRC(8726a8db) SHA1(636551d75fd0bccbbc89ea6749bb1153e9545e26), ROM_BIOS(6) )
- ROM_SYSTEM_BIOS( 7, "v191", "V 1.91" )
+ ROM_SYSTEM_BIOS( 7, "v191", "V 1.91" )
ROMX_LOAD( "ti73bv191.bin", 0x00000, 0x80000, CRC(f3785d57) SHA1(ad73d0c61ef6a51a04902a9b30a58992a2d860c4), ROM_BIOS(7) )
-
ROM_END
ROM_START (ti81)
@@ -856,7 +843,7 @@ ROM_START (ti83p)
ROMX_LOAD( "ti83pv115.bin", 0x00000, 0x80000, CRC(9288029b) SHA1(8bd05fd47cab4028f275d1cc5383fd4f0e193474), ROM_BIOS(5) )
ROM_SYSTEM_BIOS( 6, "v116", "V 1.16" )
ROMX_LOAD( "ti83pv116.bin", 0x00000, 0x80000, CRC(0b7cd006) SHA1(290bc81159ea061d8ccb56a6f63e042f150afb32), ROM_BIOS(6) )
- //Missing 1.17, 1.18, and 1.19
+ //Missing 1.17, 1.18, and 1.19
ROM_END
ROM_START (ti83pb)
@@ -876,11 +863,11 @@ ROM_START (ti83pb)
ROMX_LOAD( "ti83pbv115.bin", 0x00000, 0x80000, CRC(a16a4bff) SHA1(a0374a5d5f25e3f9dc1c241447233cf3a23e7946), ROM_BIOS(5) )
ROM_SYSTEM_BIOS( 6, "v116", "V 1.16" )
ROMX_LOAD( "ti83pbv116.bin", 0x00000, 0x80000, CRC(b5e00ef6) SHA1(23b131263b696c03f778eb5d37411be9a86cf752), ROM_BIOS(6) )
- ROM_SYSTEM_BIOS( 7, "v118", "V 1.18" )
+ ROM_SYSTEM_BIOS( 7, "v118", "V 1.18" )
ROMX_LOAD( "ti83pbv118.bin", 0x00000, 0x80000, CRC(0915b0a0) SHA1(48c270c383c2d05058693a5bf58d462936bbb335), ROM_BIOS(7) )
- ROM_SYSTEM_BIOS( 8, "v119", "V 1.19" )
+ ROM_SYSTEM_BIOS( 8, "v119", "V 1.19" )
ROMX_LOAD( "ti83pbv119.bin", 0x00000, 0x80000, CRC(58f14c79) SHA1(1fddd44d54f3ff12bfb548fcb03ce36b5a4f295a), ROM_BIOS(8) )
- //Missing 1.17
+ //Missing 1.17
ROM_END
ROM_START (ti85)
@@ -919,34 +906,51 @@ ROM_START (ti86)
//Rom versions according to ticalc.org 1.2, 1.3, 1.4, 1.5, 1.6
ROM_END
-
ROM_START (ti83pse)
ROM_REGION (0x200000, "flash", 0)
- ROM_DEFAULT_BIOS("v116")
ROM_SYSTEM_BIOS( 0, "v116", "V 1.16" )
+ ROM_DEFAULT_BIOS("v116")
ROMX_LOAD( "ti83psev116.bin", 0x00000, 0x200000, CRC(d2570863) SHA1(d4214b3c0ebb26e10fe95294ac72a90d2ba99537), ROM_BIOS(0) )
ROM_END
+ROM_START (ti83pseb)
+ ROM_REGION (0x200000, "flash", 0)
+ ROM_DEFAULT_BIOS("v112")
+ ROM_SYSTEM_BIOS( 0, "v112", "V 1.12" )
+ ROMX_LOAD( "ti83psebv112.bin", 0x00000, 0x200000, CRC(e8cfcdb7) SHA1(322929d289c17c247da7da3674d6115f1740fa49), ROM_BIOS(0) )
+ ROM_SYSTEM_BIOS( 1, "v113", "V 1.13" )
+ ROMX_LOAD( "ti83psebv113.bin", 0x00000, 0x200000, CRC(cf90e998) SHA1(29b92a32e3ceae7d918fc404fec50a53f35b574c), ROM_BIOS(1) )
+ ROM_SYSTEM_BIOS( 2, "v114", "V 1.14" )
+ ROMX_LOAD( "ti83psebv114.bin", 0x00000, 0x200000, CRC(4842c167) SHA1(2a1938474df970f92ee2349912b7824685a4da99), ROM_BIOS(2) )
+ ROM_SYSTEM_BIOS( 3, "v115", "V 1.15" )
+ ROMX_LOAD( "ti83psebv115.bin", 0x00000, 0x200000, CRC(79a7bcbb) SHA1(1c47f2299eedde8db21b9ec469ba01a1b14533db), ROM_BIOS(3) )
+ ROM_SYSTEM_BIOS( 4, "v116", "V 1.16" )
+ ROMX_LOAD( "ti83psebv116.bin", 0x00000, 0x200000, CRC(f75b896f) SHA1(75c8356ee89f35cb197684f3581cbfa3904c2f0a), ROM_BIOS(4) )
+ ROM_SYSTEM_BIOS( 5, "v118", "V 1.18" )
+ ROMX_LOAD( "ti83psebv118.bin", 0x00000, 0x200000, CRC(0ad0a741) SHA1(cb83a6f1517fc5d34a29cdf4b1d30ea2762b2a95), ROM_BIOS(5) )
+ ROM_SYSTEM_BIOS( 6, "v119", "V 1.19" )
+ ROMX_LOAD( "ti83psebv119.bin", 0x00000, 0x200000, CRC(200dd7d0) SHA1(8177bc6d5489d575cbfa9a004d097fc08c6f8c86), ROM_BIOS(6) )
+ROM_END
+
ROM_START (ti84pse)
ROM_REGION (0x200000, "flash",0)
ROM_DEFAULT_BIOS("v255mp")
ROM_SYSTEM_BIOS( 0, "v221", "V 2.21" )
ROMX_LOAD( "ti84psev221.bin", 0x00000, 0x200000, CRC(da8b3c8e) SHA1(736fae1929089167a3af6290e04e9278b0a3d1a6), ROM_BIOS(0) )
- ROM_SYSTEM_BIOS( 1, "v222", "V 2.22" )
+ ROM_SYSTEM_BIOS( 1, "v222", "V 2.22" )
ROMX_LOAD( "ti84psev222.bin", 0x00000, 0x200000, CRC(dc2931db) SHA1(319f1ec6accdbe2309f9ffcd8d9970fa2a422c4d), ROM_BIOS(1) )
- ROM_SYSTEM_BIOS( 2, "v230", "V 2.30" )
+ ROM_SYSTEM_BIOS( 2, "v230", "V 2.30" )
ROMX_LOAD( "ti84psev230.bin", 0x00000, 0x200000, CRC(8800c73a) SHA1(cb9ad540137ede275ff22e293ae0f7cc31b6663d), ROM_BIOS(2) )
- ROM_SYSTEM_BIOS( 3, "v240", "V 2.40" )
+ ROM_SYSTEM_BIOS( 3, "v240", "V 2.40" )
ROMX_LOAD( "ti84psev240.bin", 0x00000, 0x200000, CRC(2aed41c4) SHA1(6886f4c07718f0dfa43b397ff492a6b4b06ded15), ROM_BIOS(3) )
- ROM_SYSTEM_BIOS( 4, "v241", "V 2.41" )
+ ROM_SYSTEM_BIOS( 4, "v241", "V 2.41" )
ROMX_LOAD( "ti84psev241.bin", 0x00000, 0x200000, CRC(3dcb18ba) SHA1(728834cb426c09f6b00d1fd89e81eb154488854c), ROM_BIOS(4) )
- ROM_SYSTEM_BIOS( 5, "v243", "V 2.43" )
+ ROM_SYSTEM_BIOS( 5, "v243", "V 2.43" )
ROMX_LOAD( "ti84psev243.bin", 0x00000, 0x200000, CRC(1e9707f8) SHA1(767a5238882d97fac550971adbfbe48f82f2772f), ROM_BIOS(5) )
ROM_SYSTEM_BIOS( 6, "v253mp", "V 2.53MP" )
ROMX_LOAD( "ti84psev253mp.bin", 0x00000, 0x200000, CRC(3e52683a) SHA1(80050ae2a8f128b291d3a8973ab32e879172f2b9), ROM_BIOS(6) )
ROM_SYSTEM_BIOS( 7, "v255mp", "V 2.55MP" )
ROMX_LOAD( "ti84psev255mp.bin", 0x00000, 0x200000, CRC(70439fdd) SHA1(201e585caa64836829ea57c1291c6136c778ef55), ROM_BIOS(7) )
-
ROM_END
ROM_START (ti84psev3)
@@ -1075,7 +1079,13 @@ ROM_START (ti84pcse)
ROMX_LOAD( "ti84pcsev40.bin", 0x00000, 0x400000, CRC(e0b8ec78) SHA1(a4ffdfa0d2a8fc1b1356429675efc96b4f25fbc5), ROM_BIOS(0) )
ROM_SYSTEM_BIOS( 1, "v42", "V 4.2" )
ROMX_LOAD( "ti84pcsev42.bin", 0x00000, 0x400000, CRC(57d5373d) SHA1(06acbd22c9cb31320e022791ac03ba695f058654), ROM_BIOS(1) )
+ROM_END
+ROM_START (ti84pcsev2)
+ ROM_REGION (0x400000, "flash",0)
+ ROM_DEFAULT_BIOS("v42")
+ ROM_SYSTEM_BIOS( 0, "v42", "V 4.2" )
+ ROMX_LOAD( "ti84pcsev42.bin", 0x00000, 0x400000, CRC(4b6c2342) SHA1(e2a9d0124f852af79643438c994f13abc47e07af), ROM_BIOS(0) )
ROM_END
ROM_START (ti84pce)
@@ -1083,57 +1093,89 @@ ROM_START (ti84pce)
ROM_DEFAULT_BIOS("v530")
ROM_SYSTEM_BIOS( 0, "v500", "V 5.00" )
ROMX_LOAD( "ti84pcev500.bin", 0x00000, 0x400000, CRC(e31ecdf9) SHA1(7f93a2e17b75debdeb5704e07092c48b3abfec9e), ROM_BIOS(0) )
- ROM_SYSTEM_BIOS( 1, "v510", "V 5.10" )
+ ROM_SYSTEM_BIOS( 1, "v510", "V 5.10" )
ROMX_LOAD( "ti84pcev510.bin", 0x00000, 0x400000, CRC(042f7031) SHA1(6754edc7aefc9f74247bf5ff60e7546f77cd2898), ROM_BIOS(1) )
- ROM_SYSTEM_BIOS( 2, "v515", "V 5.15" )
+ ROM_SYSTEM_BIOS( 2, "v515", "V 5.15" )
ROMX_LOAD( "ti84pcev515.bin", 0x00000, 0x400000, CRC(2a958b6a) SHA1(6302ab3b4e3fca1ee6a05a3441b086ef7a57bee8), ROM_BIOS(2) )
- ROM_SYSTEM_BIOS( 3, "v520", "V 5.20" )
+ ROM_SYSTEM_BIOS( 3, "v520", "V 5.20" )
ROMX_LOAD( "ti84pcev520.bin", 0x00000, 0x400000, CRC(a59c6633) SHA1(d02f20aa3c895254a0974db7e424dd91d075f859), ROM_BIOS(3) )
- ROM_SYSTEM_BIOS( 4, "v521", "V 5.21" )
+ ROM_SYSTEM_BIOS( 4, "v521", "V 5.21" )
ROMX_LOAD( "ti84pcev521.bin", 0x00000, 0x400000, CRC(89bc2ae1) SHA1(b0b83b2b0158e5b382fc12af95aa2a2e41f3ce6d), ROM_BIOS(4) )
- ROM_SYSTEM_BIOS( 5, "v522", "V 5.22" )
+ ROM_SYSTEM_BIOS( 5, "v522", "V 5.22" )
ROMX_LOAD( "ti84pcev522.bin", 0x00000, 0x400000, CRC(49ce1768) SHA1(f949c8f2832edd33a1b0dd4da0ab4c1f23e47b21), ROM_BIOS(5) )
- ROM_SYSTEM_BIOS( 6, "v530", "V 5.30" )
+ ROM_SYSTEM_BIOS( 6, "v530", "V 5.30" )
ROMX_LOAD( "ti84pcev530.bin", 0x00000, 0x400000, CRC(c72f36b8) SHA1(6856fb2a9d0a2e338a89b91bb7680180a69482d3), ROM_BIOS(6) )
+ ROM_SYSTEM_BIOS( 7, "v531", "V 5.31" )
+ ROMX_LOAD( "ti84pcev531.bin", 0x00000, 0x400000, CRC(6d269f68) SHA1(9f9321a0cff17c331c92be127ec67ef67317968b), ROM_BIOS(7) )
+ROM_END
+
+ROM_START (ti83pcev15)
+ ROM_REGION (0x400000, "flash",0)
+ ROM_DEFAULT_BIOS("v530") // 5.30 is the default because 5.31 disables some features
+ ROM_SYSTEM_BIOS( 0, "v515", "V 5.15" )
+ ROMX_LOAD( "ti83pcev15v515.bin", 0x00000, 0x400000, CRC(f924d8e6) SHA1(ffb100c0d0478c414e7ba4dd9d73791d026b40ca), ROM_BIOS(0) )
+ ROM_SYSTEM_BIOS( 1, "v520", "V 5.20" )
+ ROMX_LOAD( "ti83pcev15v520.bin", 0x00000, 0x400000, CRC(a403db1a) SHA1(a565d96e75bed354483c6904b9ee2b8054adc31e), ROM_BIOS(1) )
+ ROM_SYSTEM_BIOS( 2, "v521", "V 5.21" )
+ ROMX_LOAD( "ti83pcev15v521.bin", 0x00000, 0x400000, CRC(1dc2e3e3) SHA1(d8e44e1a8a6591b289766a881a81d33eca9a0ecc), ROM_BIOS(2) )
+ ROM_SYSTEM_BIOS( 3, "v522", "V 5.22" )
+ ROMX_LOAD( "ti83pcev15v522.bin", 0x00000, 0x400000, CRC(6971746d) SHA1(321c7aeda6af8b42742d080e802979188421e06a), ROM_BIOS(3) )
+ ROM_SYSTEM_BIOS( 4, "v530", "V 5.30" )
+ ROMX_LOAD( "ti83pcev15v530.bin", 0x00000, 0x400000, CRC(08ae7388) SHA1(6d9d98d090ac1b250d1f8ba8ef7c26eb448e7f8c), ROM_BIOS(4) )
+ ROM_SYSTEM_BIOS( 5, "v531", "V 5.31" )
+ ROMX_LOAD( "ti83pcev15v531.bin", 0x00000, 0x400000, CRC(6643adb3) SHA1(b380e15946c1749a56600d18fee7d9d3c658dee3), ROM_BIOS(5) )
ROM_END
ROM_START (ti84pcev15)
ROM_REGION (0x400000, "flash",0)
- ROM_DEFAULT_BIOS("v530")
- ROM_SYSTEM_BIOS( 0, "v530", "V 5.30" )
- ROMX_LOAD( "ti84pcev15v530.bin", 0x00000, 0x400000, CRC(0148cc26) SHA1(72a10379bbd9d427c6e73afa9fe316cbd502f53c), ROM_BIOS(0) )
+ ROM_DEFAULT_BIOS("v530") // 5.30 is the default because 5.31 disables some features
+ ROM_SYSTEM_BIOS( 0, "v515", "V 5.15" )
+ ROMX_LOAD( "ti84pcev15v515.bin", 0x00000, 0x400000, CRC(0318a913) SHA1(44256e23708c71b8f63660d3100e767d597c377f), ROM_BIOS(0) )
+ ROM_SYSTEM_BIOS( 1, "v520", "V 5.20" )
+ ROMX_LOAD( "ti84pcev15v520.bin", 0x00000, 0x400000, CRC(c2029323) SHA1(827c1e7ead58f4eabe5b7b942d0f24abd46f1633), ROM_BIOS(1) )
+ ROM_SYSTEM_BIOS( 2, "v521", "V 5.21" )
+ ROMX_LOAD( "ti84pcev15v521.bin", 0x00000, 0x400000, CRC(880eefc9) SHA1(3449363553c093b6bb555306d91a4dd6dac8e891), ROM_BIOS(2) )
+ ROM_SYSTEM_BIOS( 3, "v522", "V 5.22" )
+ ROMX_LOAD( "ti84pcev15v522.bin", 0x00000, 0x400000, CRC(b95fefd9) SHA1(db1515b3bd4eebeb5ee3c29597991fc7f1e8b84e), ROM_BIOS(3) )
+ ROM_SYSTEM_BIOS( 4, "v530", "V 5.30" )
+ ROMX_LOAD( "ti84pcev15v530.bin", 0x00000, 0x400000, CRC(0148cc26) SHA1(72a10379bbd9d427c6e73afa9fe316cbd502f53c), ROM_BIOS(4) )
+ ROM_SYSTEM_BIOS( 5, "v531", "V 5.31" )
+ ROMX_LOAD( "ti84pcev15v531.bin", 0x00000, 0x400000, CRC(86511ea0) SHA1(ff14ec454fd1e0a2c436b4eed1eefca0d16aabfb), ROM_BIOS(5) )
ROM_END
ROM_START (ti84pcev30)
ROM_REGION (0x400000, "flash",0)
- ROM_DEFAULT_BIOS("v530")
+ ROM_DEFAULT_BIOS("v530") // 5.30 is the default because 5.31 disables some features
ROM_SYSTEM_BIOS( 0, "v530", "V 5.30" )
ROMX_LOAD( "ti84pcev30v530.bin", 0x00000, 0x400000, CRC(cc7a7047) SHA1(0d348e60dc57276b1f8d5ff87935e47cdd27455c), ROM_BIOS(0) )
ROM_END
// YEAR NAME PARENT COMPAT MACHINE INPUT STATE INIT COMPANY FULLNAME FLAGS
+COMP( 201?, ti84pob, ti84p, 0, ti84p, ti82, ti85_state, empty_init, "Texas Instruments", "Orion TI-84 Plus (bootleg)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING )
+COMP( 201?, ti84pov2, ti84p, 0, ti84p, ti82, ti85_state, empty_init, "Texas Instruments", "Orion TI-84 Plus (Boot Code 1.02)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING )
+COMP( 201?, ti84pov3, ti84p, 0, ti84p, ti82, ti85_state, empty_init, "Texas Instruments", "Orion TI-84 Plus (Boot Code 1.03)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING )
+COMP( 1998, ti73, 0, 0, ti73, ti82, ti85_state, empty_init, "Texas Instruments", "TI-73 Explorer", MACHINE_NO_SOUND_HW )
+COMP( 20??, ti73b, ti73, 0, ti73, ti82, ti85_state, empty_init, "Texas Instruments", "TI-73 Explorer (bootleg)", MACHINE_NO_SOUND_HW | MACHINE_NOT_WORKING )
COMP( 1990, ti81, 0, 0, ti81, ti81, ti85_state, empty_init, "Texas Instruments", "TI-81", MACHINE_NO_SOUND_HW )
-COMP( 1992, ti85, 0, 0, ti85d, ti85, ti85_state, empty_init, "Texas Instruments", "TI-85", MACHINE_NO_SOUND_HW )
-COMP( 1993, ti82, 0, 0, ti82, ti82, ti85_state, empty_init, "Texas Instruments", "TI-82", MACHINE_NO_SOUND_HW )
COMP( 1994, ti81v2, ti81, 0, ti81v2, ti81, ti85_state, empty_init, "Texas Instruments", "TI-81 v2.0", MACHINE_NO_SOUND_HW )
+COMP( 1993, ti82, 0, 0, ti82, ti82, ti85_state, empty_init, "Texas Instruments", "TI-82", MACHINE_NO_SOUND_HW )
COMP( 1996, ti83, 0, 0, ti83, ti83, ti85_state, empty_init, "Texas Instruments", "TI-83", MACHINE_NO_SOUND_HW )
-COMP( 1997, ti86, 0, 0, ti86, ti85, ti85_state, empty_init, "Texas Instruments", "TI-86", MACHINE_NO_SOUND_HW )
-COMP( 1998, ti73, 0, 0, ti73, ti82, ti85_state, empty_init, "Texas Instruments", "TI-73 Explorer", MACHINE_NO_SOUND_HW )
-COMP( 20??, ti73b, ti73, 0, ti73, ti82, ti85_state, empty_init, "Texas Instruments", "TI-73 Explorer (bootleg)", MACHINE_NO_SOUND_HW | MACHINE_NOT_WORKING )
COMP( 1999, ti83p, 0, 0, ti83p, ti82, ti85_state, empty_init, "Texas Instruments", "TI-83 Plus (Boot Code 1.00)", MACHINE_NO_SOUND_HW | MACHINE_NOT_WORKING )
COMP( 20??, ti83pb, ti83p, 0, ti83p, ti82, ti85_state, empty_init, "Texas Instruments", "TI-83 Plus (bootleg)", MACHINE_NO_SOUND_HW | MACHINE_NOT_WORKING )
COMP( 2001, ti83pse, 0, 0, ti83pse, ti82, ti85_state, empty_init, "Texas Instruments", "TI-83 Plus Silver Edition (Boot Code 1.00)", MACHINE_NO_SOUND_HW | MACHINE_NOT_WORKING )
+COMP( 20??, ti83pseb, ti83pse, 0, ti83pse, ti82, ti85_state, empty_init, "Texas Instruments", "TI-83 Plus Silver Edition (bootleg)", MACHINE_NO_SOUND_HW | MACHINE_NOT_WORKING )
+COMP( 201?, ti83pcev15, ti84pse, 0, ti84pse, ti82, ti85_state, empty_init, "Texas Instruments", "TI-83 Premium CE (Boot Code 5.1.5.0014)", MACHINE_NO_SOUND_HW | MACHINE_NOT_WORKING )
COMP( 2004, ti84p, 0, 0, ti84p, ti82, ti85_state, empty_init, "Texas Instruments", "TI-84 Plus (Boot Code 1.00)", MACHINE_NO_SOUND_HW | MACHINE_NOT_WORKING )
COMP( 200?, ti84pv2, ti84p, 0, ti84p, ti82, ti85_state, empty_init, "Texas Instruments", "TI-84 Plus (Boot Code 1.02)", MACHINE_NO_SOUND_HW | MACHINE_NOT_WORKING )
COMP( 2011, ti84pv3, ti84p, 0, ti84p, ti82, ti85_state, empty_init, "Texas Instruments", "TI-84 Plus (Boot Code 1.03)", MACHINE_NO_SOUND_HW | MACHINE_NOT_WORKING )
-COMP( 201?, ti84pob, ti84p, 0, ti84p, ti82, ti85_state, empty_init, "Texas Instruments", "TI-84 Plus Orion (bootleg)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING )
-COMP( 201?, ti84pov2, ti84p, 0, ti84p, ti82, ti85_state, empty_init, "Texas Instruments", "TI-84 Plus Orion (Boot Code 1.02)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING )
-COMP( 201?, ti84pov3, ti84p, 0, ti84p, ti82, ti85_state, empty_init, "Texas Instruments", "TI-84 Plus Orion (Boot Code 1.03)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING )
COMP( 20??, ti84pb, ti84p, 0, ti84p, ti82, ti85_state, empty_init, "Texas Instruments", "TI-84 Plus (bootleg)", MACHINE_NO_SOUND_HW | MACHINE_NOT_WORKING )
+COMP( 20??, ti84pcse, ti84pse, 0, ti84pse, ti82, ti85_state, empty_init, "Texas Instruments", "TI-84 Plus C Silver Edition (Boot Code 4.0)", MACHINE_NO_SOUND_HW | MACHINE_NOT_WORKING )
+COMP( 20??, ti84pcsev2, ti84pse, 0, ti84pse, ti82, ti85_state, empty_init, "Texas Instruments", "TI-84 Plus C Silver Edition (Boot Code 4.2)", MACHINE_NO_SOUND_HW | MACHINE_NOT_WORKING )
+COMP( 2015, ti84pce, ti84pse, 0, ti84pse, ti82, ti85_state, empty_init, "Texas Instruments", "TI-84 Plus CE (Boot Code 5.0.0.0089)", MACHINE_NO_SOUND_HW | MACHINE_NOT_WORKING )
+COMP( 2016, ti84pcev15, ti84pse, 0, ti84pse, ti82, ti85_state, empty_init, "Texas Instruments", "TI-84 Plus CE (Boot Code 5.1.5.0014)", MACHINE_NO_SOUND_HW | MACHINE_NOT_WORKING )
+COMP( 2017, ti84pcev30, ti84pse, 0, ti84pse, ti82, ti85_state, empty_init, "Texas Instruments", "TI-84 Plus CE (Boot Code 5.3.0.0037)", MACHINE_NO_SOUND_HW | MACHINE_NOT_WORKING )
COMP( 2004, ti84pse, 0, 0, ti84pse, ti82, ti85_state, empty_init, "Texas Instruments", "TI-84 Plus Silver Edition (Boot Code 1.00)", MACHINE_NO_SOUND_HW | MACHINE_NOT_WORKING )
COMP( 2011, ti84psev3, ti84pse, 0, ti84pse, ti82, ti85_state, empty_init, "Texas Instruments", "TI-84 Plus Silver Edition (Boot Code 1.03)", MACHINE_NO_SOUND_HW | MACHINE_NOT_WORKING )
COMP( 20??, ti84pseb, ti84pse, 0, ti84pse, ti82, ti85_state, empty_init, "Texas Instruments", "TI-84 Plus Silver Edition (bootleg)", MACHINE_NO_SOUND_HW | MACHINE_NOT_WORKING )
-COMP( 20??, ti84pcse, ti84pse, 0, ti84pse, ti82, ti85_state, empty_init, "Texas Instruments", "TI-84 Plus Color Silver Edition (Boot Code 4.0)", MACHINE_NO_SOUND_HW | MACHINE_NOT_WORKING )
-COMP( 2015, ti84pce, ti84pse, 0, ti84pse, ti82, ti85_state, empty_init, "Texas Instruments", "TI-84 Plus Color Edition (Boot Code 5.00)", MACHINE_NO_SOUND_HW | MACHINE_NOT_WORKING )
-COMP( 2016, ti84pcev15, ti84pse, 0, ti84pse, ti82, ti85_state, empty_init, "Texas Instruments", "TI-84 Plus Color Edition (Boot Code 5.15)", MACHINE_NO_SOUND_HW | MACHINE_NOT_WORKING )
-COMP( 2017, ti84pcev30, ti84pse, 0, ti84pse, ti82, ti85_state, empty_init, "Texas Instruments", "TI-84 Plus Color Edition (Boot Code 5.30)", MACHINE_NO_SOUND_HW | MACHINE_NOT_WORKING )
+COMP( 1992, ti85, 0, 0, ti85d, ti85, ti85_state, empty_init, "Texas Instruments", "TI-85", MACHINE_NO_SOUND_HW )
+COMP( 1997, ti86, 0, 0, ti86, ti85, ti85_state, empty_init, "Texas Instruments", "TI-86", MACHINE_NO_SOUND_HW )
diff --git a/src/mame/drivers/ti89.cpp b/src/mame/drivers/ti89.cpp
index da531355256..8724747af2a 100644
--- a/src/mame/drivers/ti89.cpp
+++ b/src/mame/drivers/ti89.cpp
@@ -147,14 +147,14 @@ WRITE16_MEMBER ( ti68k_state::flash_w )
{
// verification if it is flash memory
if (m_flash_mem)
- m_flash->write(space, offset, data);
+ m_flash->write(offset, data);
}
READ16_MEMBER ( ti68k_state::flash_r )
{
if (m_flash_mem)
{
- return m_flash->read(space, offset);
+ return m_flash->read(offset);
}
else
{
@@ -519,60 +519,63 @@ void ti68k_state::ti68k_palette(palette_device &palette) const
palette.set_pen_color(1, rgb_t(92, 83, 88));
}
-MACHINE_CONFIG_START(ti68k_state::ti89)
+void ti68k_state::ti89(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M68000, XTAL(10'000'000))
- MCFG_DEVICE_PROGRAM_MAP(ti89_mem)
+ M68000(config, m_maincpu, XTAL(10'000'000));
+ m_maincpu->set_addrmap(AS_PROGRAM, &ti68k_state::ti89_mem);
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
/* video hardware */
- MCFG_SCREEN_ADD("screen", LCD)
- MCFG_SCREEN_REFRESH_RATE(50)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */
- MCFG_SCREEN_UPDATE_DRIVER(ti68k_state, screen_update)
- MCFG_SCREEN_SIZE(240, 128)
- MCFG_SCREEN_VISIBLE_AREA(0, 160-1, 0, 100-1)
- MCFG_SCREEN_PALETTE("palette")
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_LCD));
+ screen.set_refresh_hz(50);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */
+ screen.set_screen_update(FUNC(ti68k_state::screen_update));
+ screen.set_size(240, 128);
+ screen.set_visarea(0, 160-1, 0, 100-1);
+ screen.set_palette("palette");
PALETTE(config, "palette", FUNC(ti68k_state::ti68k_palette), 2);
SHARP_UNK128MBIT(config, "flash"); //should be LH28F320 for ti89t and v200 and LH28F160S3T for other models
- MCFG_TIMER_DRIVER_ADD_PERIODIC("ti68k_timer", ti68k_state, ti68k_timer_callback, attotime::from_hz(1<<14))
-MACHINE_CONFIG_END
+ TIMER(config, "ti68k_timer").configure_periodic(FUNC(ti68k_state::ti68k_timer_callback), attotime::from_hz(1<<14));
+}
-MACHINE_CONFIG_START(ti68k_state::ti92)
+void ti68k_state::ti92(machine_config &config)
+{
ti89(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(ti92_mem)
+ m_maincpu->set_addrmap(AS_PROGRAM, &ti68k_state::ti92_mem);
/* video hardware */
- MCFG_SCREEN_MODIFY("screen")
- MCFG_SCREEN_VISIBLE_AREA(0, 240-1, 0, 128-1)
-MACHINE_CONFIG_END
+ subdevice<screen_device>("screen")->set_visarea(0, 240-1, 0, 128-1);
+}
-MACHINE_CONFIG_START(ti68k_state::ti92p)
+void ti68k_state::ti92p(machine_config &config)
+{
ti92(config);
- MCFG_DEVICE_REPLACE("maincpu", M68000, XTAL(12'000'000))
- MCFG_DEVICE_PROGRAM_MAP(ti92p_mem)
-MACHINE_CONFIG_END
+ m_maincpu->set_clock(XTAL(12'000'000));
+ m_maincpu->set_addrmap(AS_PROGRAM, &ti68k_state::ti92p_mem);
+}
-MACHINE_CONFIG_START(ti68k_state::v200)
+void ti68k_state::v200(machine_config &config)
+{
ti92(config);
- MCFG_DEVICE_REPLACE("maincpu", M68000, XTAL(12'000'000))
- MCFG_DEVICE_PROGRAM_MAP(v200_mem)
-MACHINE_CONFIG_END
+ m_maincpu->set_clock(XTAL(12'000'000));
+ m_maincpu->set_addrmap(AS_PROGRAM, &ti68k_state::v200_mem);
+}
-MACHINE_CONFIG_START(ti68k_state::ti89t)
+void ti68k_state::ti89t(machine_config &config)
+{
ti89(config);
- MCFG_DEVICE_REPLACE("maincpu", M68000, XTAL(16'000'000))
- MCFG_DEVICE_PROGRAM_MAP(ti89t_mem)
-MACHINE_CONFIG_END
+ m_maincpu->set_clock(XTAL(16'000'000));
+ m_maincpu->set_addrmap(AS_PROGRAM, &ti68k_state::ti89t_mem);
+}
/* ROM definition */
diff --git a/src/mame/drivers/ti990_10.cpp b/src/mame/drivers/ti990_10.cpp
index 8ebe64d4728..baa8a791bab 100644
--- a/src/mame/drivers/ti990_10.cpp
+++ b/src/mame/drivers/ti990_10.cpp
@@ -317,7 +317,8 @@ WRITE_LINE_MEMBER(ti990_10_state::tape_interrupt)
// set_int9(state);
}
-MACHINE_CONFIG_START(ti990_10_state::ti990_10)
+void ti990_10_state::ti990_10(machine_config &config)
+{
/* basic machine hardware */
/* TI990/10 CPU @ 4.0(???) MHz */
TI990_10(config, m_maincpu, 4000000);
@@ -330,11 +331,15 @@ MACHINE_CONFIG_START(ti990_10_state::ti990_10)
m_terminal->lineint_cb().set(FUNC(ti990_10_state::line_interrupt));
// Hard disk
- TI990_HDC(config, "hdc", 0).int_cb().set(FUNC(ti990_10_state::ti990_set_int13));
+ ti990_hdc_device &hdc(TI990_HDC(config, "hdc", 0));
+ hdc.set_memory_space(m_maincpu, AS_PROGRAM);
+ hdc.int_cb().set(FUNC(ti990_10_state::ti990_set_int13));
// Tape controller
- TI990_TAPE_CTRL(config, "tpc", 0).int_cb().set(FUNC(ti990_10_state::tape_interrupt));
-MACHINE_CONFIG_END
+ tap_990_device &tpc(TI990_TAPE_CTRL(config, "tpc", 0));
+ tpc.set_memory_space(m_maincpu, AS_PROGRAM);
+ tpc.int_cb().set(FUNC(ti990_10_state::tape_interrupt));
+}
/*
diff --git a/src/mame/drivers/ti990_4.cpp b/src/mame/drivers/ti990_4.cpp
index 1592b1ab93a..22520495a9a 100644
--- a/src/mame/drivers/ti990_4.cpp
+++ b/src/mame/drivers/ti990_4.cpp
@@ -115,8 +115,8 @@ void ti990_4_state::device_timer(emu_timer &timer, device_timer_id id, int param
READ8_MEMBER( ti990_4_state::panel_read )
{
- if (offset == 1)
- return 0x48;
+ if (offset == 11 || offset == 14)
+ return 1;
return 0;
}
@@ -227,47 +227,37 @@ void ti990_4_state::memmap(address_map &map)
/*
CRU map
- 0x000-0xF7F: user devices
- 0xF80-0xF9F: CRU interrupt + expansion control
- 0xFA0-0xFAF: TILINE coupler interrupt control
- 0xFB0-0xFCF: reserved
- 0xFD0-0xFDF: memory mapping and memory protect
- 0xFE0-0xFEF: internal interrupt control
- 0xFF0-0xFFF: front panel
+ 0x0000-0x1EFF: user devices
+ 0x1F00-0x1F3F: CRU interrupt + expansion control
+ 0x1F40-0x1F5F: TILINE coupler interrupt control
+ 0x1F60-0x1F9F: reserved
+ 0x1FA0-0x1FBF: memory mapping and memory protect
+ 0x1FC0-0x1FDF: internal interrupt control
+ 0x1FF0-0x1FFF: front panel
Default user map:
- 0x000-0x00f: 733 ASR (int 6)
- 0x010-0x01f: PROM programmer (wired to int 15, unused)
- 0x020-0x02f: 804 card reader (int 4)
- 0x030-0x03f: line printer (wired to int 14, unused)
- 0x040-0x05f: FD800 floppy controller (int 7)
- 0x060-0x07f: VDT1 (int 3 - wired to int 11, unused)
- 0x080-0x09f: VDT2, or CRU expansion (int ??? - wired to int 10, unused)
- 0x0a0-0x0bf: VDT3 (int ??? - wired to int 9, unused)
+ 0x0000-0x001f: 733 ASR (int 6)
+ 0x0020-0x003f: PROM programmer (wired to int 15, unused)
+ 0x0040-0x005f: 804 card reader (int 4)
+ 0x0060-0x007f: line printer (wired to int 14, unused)
+ 0x0080-0x00bf: FD800 floppy controller (int 7)
+ 0x00c0-0x00ff: VDT1 (int 3 - wired to int 11, unused)
+ 0x0100-0x013f: VDT2, or CRU expansion (int ??? - wired to int 10, unused)
+ 0x0140-0x017f: VDT3 (int ??? - wired to int 9, unused)
*/
void ti990_4_state::crumap(address_map &map)
{
- map(0x00, 0x01).r("asr733", FUNC(asr733_device::cru_r));
- map(0x00, 0x0f).w("asr733", FUNC(asr733_device::cru_w));
-
- map(0x08, 0x0b).r(m_fd800, FUNC(fd800_legacy_device::cru_r));
- map(0x40, 0x5f).w(m_fd800, FUNC(fd800_legacy_device::cru_w));
-
- map(0x1fe, 0x1ff).r(FUNC(ti990_4_state::panel_read));
- map(0xff0, 0xfff).w(FUNC(ti990_4_state::panel_write));
+ map(0x0000, 0x001f).rw("asr733", FUNC(asr733_device::cru_r), FUNC(asr733_device::cru_w));
+ map(0x0080, 0x00bf).rw(m_fd800, FUNC(fd800_legacy_device::cru_r), FUNC(fd800_legacy_device::cru_w));
+ map(0x1fe0, 0x1fff).rw(FUNC(ti990_4_state::panel_read), FUNC(ti990_4_state::panel_write));
}
void ti990_4_state::crumap_v(address_map &map)
{
- map(0x10, 0x11).r("vdt911", FUNC(vdt911_device::cru_r));
- map(0x80, 0x8f).w("vdt911", FUNC(vdt911_device::cru_w));
-
- map(0x08, 0x0b).r(m_fd800, FUNC(fd800_legacy_device::cru_r));
- map(0x40, 0x5f).w(m_fd800, FUNC(fd800_legacy_device::cru_w));
-
- map(0x1fe, 0x1ff).r(FUNC(ti990_4_state::panel_read));
- map(0xff0, 0xfff).w(FUNC(ti990_4_state::panel_write));
+ map(0x0080, 0x00bf).rw(m_fd800, FUNC(fd800_legacy_device::cru_r), FUNC(fd800_legacy_device::cru_w));
+ map(0x0100, 0x011f).rw("vdt911", FUNC(vdt911_device::cru_r), FUNC(vdt911_device::cru_w));
+ map(0x1fe0, 0x1fff).rw(FUNC(ti990_4_state::panel_read), FUNC(ti990_4_state::panel_write));
}
@@ -291,7 +281,8 @@ void ti990_4_state::init_ti990_4()
m_nmi_timer = timer_alloc(NMI_TIMER_ID);
}
-MACHINE_CONFIG_START(ti990_4_state::ti990_4)
+void ti990_4_state::ti990_4(machine_config &config)
+{
/* basic machine hardware */
/* TMS9900 CPU @ 3.0(???) MHz */
TMS9900(config, m_maincpu, 3000000);
@@ -311,9 +302,10 @@ MACHINE_CONFIG_START(ti990_4_state::ti990_4)
TI99X_FD800(config, "fd800", 0).int_cb().set(FUNC(ti990_4_state::fd_interrupt));
// TODO: Add floppy drives
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(ti990_4_state::ti990_4v)
+void ti990_4_state::ti990_4v(machine_config &config)
+{
/* basic machine hardware */
/* TMS9900 CPU @ 3.0(???) MHz */
TMS9900(config, m_maincpu, 3000000);
@@ -331,7 +323,7 @@ MACHINE_CONFIG_START(ti990_4_state::ti990_4v)
TI99X_FD800(config, "fd800", 0).int_cb().set(FUNC(ti990_4_state::fd_interrupt));
// TODO: Add floppy drives
-MACHINE_CONFIG_END
+}
/*
ROM loading
diff --git a/src/mame/drivers/ti99_2.cpp b/src/mame/drivers/ti99_2.cpp
index d910d0327ef..85b2a79ef16 100644
--- a/src/mame/drivers/ti99_2.cpp
+++ b/src/mame/drivers/ti99_2.cpp
@@ -164,7 +164,6 @@
#include "emu.h"
#include "bus/ti99/ti99defs.h"
-#include "machine/tms9901.h"
#include "cpu/tms9900/tms9995.h"
#include "bus/ti99/internal/992board.h"
#include "machine/ram.h"
@@ -276,18 +275,13 @@ void ti99_2_state::memmap(address_map &map)
/*
CRU map - see description above
- Note that the CRU address space has only even numbers, and the
- read addresses in the emulation gather 8 bits in one go, so the address
- is the bit number times 16.
*/
void ti99_2_state::crumap(address_map &map)
{
- map(0x0000, 0x0fff).r(m_io992, FUNC(bus::ti99::internal::io992_device::cruread));
- map(0x0000, 0x7fff).w(m_io992, FUNC(bus::ti99::internal::io992_device::cruwrite));
+ map(0x0000, 0xffff).rw(m_io992, FUNC(bus::ti99::internal::io992_device::cruread), FUNC(bus::ti99::internal::io992_device::cruwrite));
// Mirror of CPU-internal flags (1ee0-1efe). Don't read. Write is OK.
- map(0x01ee, 0x01ef).nopr();
- map(0x0f70, 0x0f7f).w(FUNC(ti99_2_state::intflag_write));
+ map(0x1ee0, 0x1eff).nopr().w(FUNC(ti99_2_state::intflag_write));
}
/*
diff --git a/src/mame/drivers/ti99_4p.cpp b/src/mame/drivers/ti99_4p.cpp
index 00774139e37..7c53c585c31 100644
--- a/src/mame/drivers/ti99_4p.cpp
+++ b/src/mame/drivers/ti99_4p.cpp
@@ -165,31 +165,28 @@ private:
DECLARE_WRITE_LINE_MEMBER( ready_line );
DECLARE_WRITE_LINE_MEMBER( extint );
DECLARE_WRITE_LINE_MEMBER( notconnected );
- DECLARE_READ8_MEMBER( interrupt_level );
+ uint8_t interrupt_level();
- DECLARE_READ8_MEMBER( setoffset );
- DECLARE_READ16_MEMBER( memread );
- DECLARE_WRITE16_MEMBER( memwrite );
+ uint8_t setoffset(offs_t offset);
+ uint16_t memread(offs_t offset);
+ void memwrite(offs_t offset, uint16_t data);
DECLARE_WRITE_LINE_MEMBER( dbin_in );
- DECLARE_READ16_MEMBER( samsmem_read );
- DECLARE_WRITE16_MEMBER( samsmem_write );
-
- DECLARE_WRITE8_MEMBER(external_operation);
+ void external_operation(offs_t offset, uint8_t data);
DECLARE_WRITE_LINE_MEMBER( clock_out );
DECLARE_WRITE_LINE_MEMBER( dbin_line );
// CRU (Communication Register Unit) handling
- DECLARE_READ8_MEMBER( cruread );
- DECLARE_WRITE8_MEMBER( cruwrite );
- DECLARE_READ8_MEMBER( read_by_9901 );
+ uint8_t cruread(offs_t offset);
+ void cruwrite(offs_t offset, uint8_t data);
+ uint8_t read_by_9901(offs_t offset);
DECLARE_WRITE_LINE_MEMBER(keyC0);
DECLARE_WRITE_LINE_MEMBER(keyC1);
DECLARE_WRITE_LINE_MEMBER(keyC2);
DECLARE_WRITE_LINE_MEMBER(cs_motor);
DECLARE_WRITE_LINE_MEMBER(audio_gate);
DECLARE_WRITE_LINE_MEMBER(cassette_output);
- DECLARE_WRITE8_MEMBER(tms9901_interrupt);
+ void tms9901_interrupt(offs_t offset, uint8_t data);
DECLARE_WRITE_LINE_MEMBER(alphaW);
DECLARE_WRITE_LINE_MEMBER(video_interrupt_in);
@@ -213,8 +210,8 @@ private:
required_ioport m_alpha;
int decode_address(int address);
- DECLARE_READ16_MEMBER( debugger_read );
- DECLARE_WRITE16_MEMBER( debugger_write );
+ uint16_t debugger_read(offs_t offset);
+ void debugger_write(offs_t offset, uint16_t data);
void ready_join();
void set_keyboard_column(int number, int data);
@@ -257,9 +254,6 @@ private:
// Incoming Ready level
int m_sysready;
- // Saves a pointer to the address space
- address_space* m_spacep;
-
// Internal DSR mapped in
bool m_internal_dsr_active;
@@ -309,11 +303,8 @@ void ti99_4p_state::memmap_setoffset(address_map &map)
void ti99_4p_state::crumap(address_map &map)
{
- map(0x0000, 0x01ff).r(FUNC(ti99_4p_state::cruread));
- map(0x0000, 0x003f).r(m_tms9901, FUNC(tms9901_device::read));
-
- map(0x0000, 0x0fff).w(FUNC(ti99_4p_state::cruwrite));
- map(0x0000, 0x01ff).w(m_tms9901, FUNC(tms9901_device::write));
+ map(0x0000, 0x1fff).rw(FUNC(ti99_4p_state::cruread), FUNC(ti99_4p_state::cruwrite));
+ map(0x0000, 0x03ff).rw(m_tms9901, FUNC(tms9901_device::read), FUNC(tms9901_device::write));
}
/*
@@ -440,7 +431,7 @@ int ti99_4p_state::decode_address(int address)
Called when the memory access starts by setting the address bus. From that
point on, we suspend the CPU until all operations are done.
*/
-READ8_MEMBER( ti99_4p_state::setoffset )
+uint8_t ti99_4p_state::setoffset(offs_t offset)
{
m_addr_buf = offset;
m_waitcount = 0;
@@ -449,7 +440,6 @@ READ8_MEMBER( ti99_4p_state::setoffset )
m_decode = SGCPU_NONE;
m_muxready = true;
- m_spacep = &space;
m_decode = decode_address(m_addr_buf);
@@ -462,7 +452,7 @@ READ8_MEMBER( ti99_4p_state::setoffset )
m_waitcount = 5;
m_muxready = false;
m_peribox->memen_in(ASSERT_LINE);
- m_peribox->setaddress_dbin(space, m_addr_buf+1, m_dbin);
+ m_peribox->setaddress_dbin(m_addr_buf+1, m_dbin);
}
ready_join();
@@ -470,7 +460,7 @@ READ8_MEMBER( ti99_4p_state::setoffset )
return 0;
}
-READ16_MEMBER( ti99_4p_state::memread )
+uint16_t ti99_4p_state::memread(offs_t offset)
{
int address = 0;
uint8_t hbyte = 0;
@@ -523,10 +513,10 @@ READ16_MEMBER( ti99_4p_state::memread )
break;
case SGCPU_PEB:
- if (machine().side_effects_disabled()) return debugger_read(space, offset);
+ if (machine().side_effects_disabled()) return debugger_read(offset);
// The byte from the odd address has already been read into the latch
// Reading the even address now
- m_peribox->readz(space, m_addr_buf, &hbyte);
+ m_peribox->readz(m_addr_buf, &hbyte);
m_peribox->memen_in(CLEAR_LINE);
LOGMASKED(LOG_MEM, "Read even byte from address %04x -> %02x\n", m_addr_buf, hbyte);
value = (hbyte<<8) | m_latch;
@@ -536,7 +526,7 @@ READ16_MEMBER( ti99_4p_state::memread )
}
-WRITE16_MEMBER( ti99_4p_state::memwrite )
+void ti99_4p_state::memwrite(offs_t offset, uint16_t data)
{
int address = 0;
@@ -585,7 +575,7 @@ WRITE16_MEMBER( ti99_4p_state::memwrite )
break;
case SGCPU_PEB:
- if (machine().side_effects_disabled()) { debugger_write(space, offset, data); return; }
+ if (machine().side_effects_disabled()) { debugger_write(offset, data); return; }
// Writing the even address now (addr)
// The databus multiplexer puts the even value into the latch and outputs the odd value now.
@@ -593,7 +583,7 @@ WRITE16_MEMBER( ti99_4p_state::memwrite )
// write odd byte
LOGMASKED(LOG_MEM, "datamux: write odd byte to address %04x <- %02x\n", m_addr_buf+1, data & 0xff);
- m_peribox->write(space, m_addr_buf+1, data & 0xff);
+ m_peribox->write(m_addr_buf+1, data & 0xff);
m_peribox->memen_in(CLEAR_LINE);
}
}
@@ -601,14 +591,14 @@ WRITE16_MEMBER( ti99_4p_state::memwrite )
/*
Used when the debugger is reading values from PEB cards.
*/
-READ16_MEMBER( ti99_4p_state::debugger_read )
+uint16_t ti99_4p_state::debugger_read(offs_t offset)
{
uint8_t lval = 0;
uint8_t hval = 0;
uint16_t addrb = offset << 1;
m_peribox->memen_in(ASSERT_LINE);
- m_peribox->readz(space, addrb+1, &lval);
- m_peribox->readz(space, addrb, &hval);
+ m_peribox->readz(addrb+1, &lval);
+ m_peribox->readz(addrb, &hval);
m_peribox->memen_in(CLEAR_LINE);
return ((hval << 8)&0xff00) | (lval & 0xff);
}
@@ -616,12 +606,12 @@ READ16_MEMBER( ti99_4p_state::debugger_read )
/*
Used when the debugger is writing values to PEB cards.
*/
-WRITE16_MEMBER( ti99_4p_state::debugger_write )
+void ti99_4p_state::debugger_write(offs_t offset, uint16_t data)
{
int addrb = offset << 1;
m_peribox->memen_in(ASSERT_LINE);
- m_peribox->write(space, addrb+1, data & 0xff);
- m_peribox->write(space, addrb, (data>>8) & 0xff);
+ m_peribox->write(addrb+1, data & 0xff);
+ m_peribox->write(addrb, (data>>8) & 0xff);
m_peribox->memen_in(CLEAR_LINE);
}
@@ -662,14 +652,14 @@ WRITE_LINE_MEMBER( ti99_4p_state::datamux_clock_in )
if (m_waitcount==2)
{
// read odd byte
- m_peribox->readz(*m_spacep, m_addr_buf+1, &m_latch);
+ m_peribox->readz(m_addr_buf+1, &m_latch);
m_peribox->memen_in(CLEAR_LINE);
LOGMASKED(LOG_MEM, "datamux: read odd byte from address %04x -> %02x\n", m_addr_buf+1, m_latch);
// do the setaddress for the even address
m_peribox->memen_in(ASSERT_LINE);
- m_peribox->setaddress_dbin(*m_spacep, m_addr_buf, m_dbin);
+ m_peribox->setaddress_dbin(m_addr_buf, m_dbin);
}
}
}
@@ -689,11 +679,11 @@ WRITE_LINE_MEMBER( ti99_4p_state::datamux_clock_in )
{
// do the setaddress for the even address
m_peribox->memen_in(ASSERT_LINE);
- m_peribox->setaddress_dbin(*m_spacep, m_addr_buf, m_dbin);
+ m_peribox->setaddress_dbin(m_addr_buf, m_dbin);
// write even byte
LOGMASKED(LOG_MEM, "datamux: write even byte to address %04x <- %02x\n", m_addr_buf, m_latch);
- m_peribox->write(*m_spacep, m_addr_buf, m_latch);
+ m_peribox->write(m_addr_buf, m_latch);
m_peribox->memen_in(CLEAR_LINE);
}
}
@@ -711,7 +701,7 @@ WRITE_LINE_MEMBER( ti99_4p_state::datamux_clock_in )
/*
CRU write
*/
-WRITE8_MEMBER( ti99_4p_state::cruwrite )
+void ti99_4p_state::cruwrite(offs_t offset, uint8_t data)
{
int addroff = offset<<1;
@@ -732,13 +722,13 @@ WRITE8_MEMBER( ti99_4p_state::cruwrite )
}
// No match - pass to peribox
- m_peribox->cruwrite(space, addroff, data);
+ m_peribox->cruwrite(addroff, data);
}
-READ8_MEMBER( ti99_4p_state::cruread )
+uint8_t ti99_4p_state::cruread(offs_t offset)
{
uint8_t value = 0;
- m_peribox->crureadz(space, offset<<4, &value);
+ m_peribox->crureadz(offset<<4, &value);
return value;
}
@@ -746,7 +736,7 @@ READ8_MEMBER( ti99_4p_state::cruread )
Keyboard/tape control
****************************************************************************/
-READ8_MEMBER( ti99_4p_state::read_by_9901 )
+uint8_t ti99_4p_state::read_by_9901(offs_t offset)
{
int answer=0;
@@ -919,11 +909,12 @@ WRITE_LINE_MEMBER( ti99_4p_state::notconnected )
*/
WRITE_LINE_MEMBER( ti99_4p_state::clock_out )
{
+ m_tms9901->phi_line(state);
datamux_clock_in(state);
m_peribox->clock_in(state);
}
-WRITE8_MEMBER( ti99_4p_state::tms9901_interrupt )
+void ti99_4p_state::tms9901_interrupt(offs_t offset, uint8_t data)
{
// offset contains the interrupt level (0-15)
// However, the TI board just ignores that level and hardwires it to 1
@@ -931,14 +922,14 @@ WRITE8_MEMBER( ti99_4p_state::tms9901_interrupt )
m_cpu->set_input_line(INT_9900_INTREQ, data);
}
-READ8_MEMBER( ti99_4p_state::interrupt_level )
+uint8_t ti99_4p_state::interrupt_level()
{
// On the TI-99 systems these IC lines are not used; the input lines
// at the CPU are hardwired to level 1.
return 1;
}
-WRITE8_MEMBER( ti99_4p_state::external_operation )
+void ti99_4p_state::external_operation(offs_t offset, uint8_t data)
{
static char const *const extop[8] = { "inv1", "inv2", "IDLE", "RSET", "inv3", "CKON", "CKOF", "LREX" };
if (offset != IDLE_OP) logerror("External operation %s not implemented on the SGCPU board\n", extop[offset]);
@@ -1020,7 +1011,7 @@ void ti99_4p_state::ti99_4p_60hz(machine_config& config)
m_cpu->dbin_cb().set(FUNC(ti99_4p_state::dbin_line));
// tms9901
- TMS9901(config, m_tms9901, 3000000);
+ TMS9901(config, m_tms9901, 0);
m_tms9901->read_cb().set(FUNC(ti99_4p_state::read_by_9901));
m_tms9901->p_out_cb(2).set(FUNC(ti99_4p_state::keyC0));
m_tms9901->p_out_cb(3).set(FUNC(ti99_4p_state::keyC1));
diff --git a/src/mame/drivers/ti99_4x.cpp b/src/mame/drivers/ti99_4x.cpp
index 2e0028ee537..e7612f9f18f 100644
--- a/src/mame/drivers/ti99_4x.cpp
+++ b/src/mame/drivers/ti99_4x.cpp
@@ -121,10 +121,10 @@ public:
private:
// Processor connections with the main board
- DECLARE_READ8_MEMBER( cruread );
- DECLARE_READ8_MEMBER( interrupt_level );
- DECLARE_WRITE8_MEMBER( cruwrite );
- DECLARE_WRITE8_MEMBER( external_operation );
+ uint8_t cruread(offs_t offset);
+ uint8_t interrupt_level();
+ void cruwrite(offs_t offset, uint8_t data);
+ void external_operation(offs_t offset, uint8_t data);
DECLARE_WRITE_LINE_MEMBER( clock_out );
DECLARE_WRITE_LINE_MEMBER( dbin_line );
@@ -146,14 +146,14 @@ private:
DECLARE_WRITE_LINE_MEMBER( handset_interrupt_in );
// Connections with the system interface TMS9901
- DECLARE_READ8_MEMBER(read_by_9901);
+ uint8_t read_by_9901(offs_t offset);
DECLARE_WRITE_LINE_MEMBER(keyC0);
DECLARE_WRITE_LINE_MEMBER(keyC1);
DECLARE_WRITE_LINE_MEMBER(keyC2);
DECLARE_WRITE_LINE_MEMBER(cs1_motor);
DECLARE_WRITE_LINE_MEMBER(audio_gate);
DECLARE_WRITE_LINE_MEMBER(cassette_output);
- DECLARE_WRITE8_MEMBER(tms9901_interrupt);
+ void tms9901_interrupt(offs_t offset, uint8_t data);
DECLARE_WRITE_LINE_MEMBER(handset_ack);
DECLARE_WRITE_LINE_MEMBER(cs2_motor);
DECLARE_WRITE_LINE_MEMBER(alphaW);
@@ -249,25 +249,11 @@ void ti99_4x_state::memmap_setoffset(address_map &map)
The TMS9901 is incompletely decoded
---0 00xx xxcc ccc0
causing 16 mirrors (0000, 0040, 0080, 00c0, ... , 03c0)
-
- Reading is done by transfering 8 successive bits, so addresses refer to
- 8 bit groups; writing, however, is done using output lines. The CRU base
- address in the ti99 systems is twice the bit address:
-
- (base=0, bit=0x10) == (base=0x20,bit=0)
-
- Read: 0000 - 003f translates to base addresses 0000 - 03fe
- 0000 - 01ff is the complete CRU address space 0000 - 1ffe (for TMS9900)
-
- Write:0000 - 01ff corresponds to bit 0 of base address 0000 - 03fe
*/
void ti99_4x_state::crumap(address_map &map)
{
- map(0x0000, 0x01ff).r(FUNC(ti99_4x_state::cruread));
- map(0x0000, 0x0003).mirror(0x003c).r(m_tms9901, FUNC(tms9901_device::read));
-
- map(0x0000, 0x0fff).w(FUNC(ti99_4x_state::cruwrite));
- map(0x0000, 0x001f).mirror(0x01e0).w(m_tms9901, FUNC(tms9901_device::write));
+ map(0x0000, 0x1fff).rw(FUNC(ti99_4x_state::cruread), FUNC(ti99_4x_state::cruwrite));
+ map(0x0000, 0x003f).mirror(0x03c0).rw(m_tms9901, FUNC(tms9901_device::read), FUNC(tms9901_device::write));
}
@@ -417,30 +403,29 @@ INPUT_PORTS_END
Components
******************************************************************************/
-READ8_MEMBER( ti99_4x_state::cruread )
+uint8_t ti99_4x_state::cruread(offs_t offset)
{
- LOGMASKED(LOG_CRUREAD, "read access to CRU address %04x\n", offset << 4);
+ LOGMASKED(LOG_CRUREAD, "read access to CRU address %04x\n", offset << 1);
uint8_t value = 0;
// Let the gromport (not in the QI version) and the p-box behind the I/O port
// decide whether they want to change the value at the CRU address
- // Also, we translate the bit addresses to base addresses
- if (m_model != MODEL_4QI) m_gromport->crureadz(space, offset<<4, &value);
- m_ioport->crureadz(space, offset<<4, &value);
+ if (m_model != MODEL_4QI) m_gromport->crureadz(offset<<1, &value);
+ m_ioport->crureadz(offset<<1, &value);
return value;
}
-WRITE8_MEMBER( ti99_4x_state::cruwrite )
+void ti99_4x_state::cruwrite(offs_t offset, uint8_t data)
{
LOGMASKED(LOG_CRU, "Write access to CRU address %04x\n", offset << 1);
// The QI version does not propagate the CRU signals to the cartridge slot
- if (m_model != MODEL_4QI) m_gromport->cruwrite(space, offset<<1, data);
- m_ioport->cruwrite(space, offset<<1, data);
+ if (m_model != MODEL_4QI) m_gromport->cruwrite(offset<<1, data);
+ m_ioport->cruwrite(offset<<1, data);
}
-WRITE8_MEMBER( ti99_4x_state::external_operation )
+void ti99_4x_state::external_operation(offs_t offset, uint8_t data)
{
static char const *const extop[8] = { "inv1", "inv2", "IDLE", "RSET", "inv3", "CKON", "CKOF", "LREX" };
// Some games (e.g. Slymoids) actually use IDLE for synchronization
@@ -475,7 +460,7 @@ WRITE8_MEMBER( ti99_4x_state::external_operation )
***************************************************************************/
-READ8_MEMBER( ti99_4x_state::read_by_9901 )
+uint8_t ti99_4x_state::read_by_9901(offs_t offset)
{
int answer=0;
@@ -644,7 +629,7 @@ WRITE_LINE_MEMBER( ti99_4x_state::cassette_output )
m_cassette2->output(state==ASSERT_LINE? +1 : -1);
}
-WRITE8_MEMBER( ti99_4x_state::tms9901_interrupt )
+void ti99_4x_state::tms9901_interrupt(offs_t offset, uint8_t data)
{
// offset contains the interrupt level (0-15)
// However, the TI board just ignores that level and hardwires it to 1
@@ -652,7 +637,7 @@ WRITE8_MEMBER( ti99_4x_state::tms9901_interrupt )
m_cpu->set_input_line(INT_9900_INTREQ, data);
}
-READ8_MEMBER( ti99_4x_state::interrupt_level )
+uint8_t ti99_4x_state::interrupt_level()
{
// On the TI-99 systems these IC lines are not used; the input lines
// at the CPU are hardwired to level 1.
@@ -664,6 +649,7 @@ READ8_MEMBER( ti99_4x_state::interrupt_level )
*/
WRITE_LINE_MEMBER( ti99_4x_state::clock_out )
{
+ m_tms9901->phi_line(state);
m_datamux->clock_in(state);
m_ioport->clock_in(state);
}
@@ -867,8 +853,8 @@ void ti99_4x_state::ti99_4_common(machine_config& config)
m_cpu->clkout_cb().set(FUNC(ti99_4x_state::clock_out));
m_cpu->dbin_cb().set(FUNC(ti99_4x_state::dbin_line));
- // Main board
- TMS9901(config, m_tms9901, 3000000);
+ // Programmable system interface (driven by CLKOUT)
+ TMS9901(config, m_tms9901, 0);
m_tms9901->read_cb().set(FUNC(ti99_4x_state::read_by_9901));
m_tms9901->p_out_cb(2).set(FUNC(ti99_4x_state::keyC0));
m_tms9901->p_out_cb(3).set(FUNC(ti99_4x_state::keyC1));
diff --git a/src/mame/drivers/ti99_8.cpp b/src/mame/drivers/ti99_8.cpp
index 619d54a3931..ae374b02d42 100644
--- a/src/mame/drivers/ti99_8.cpp
+++ b/src/mame/drivers/ti99_8.cpp
@@ -247,9 +247,9 @@ private:
DECLARE_MACHINE_RESET(ti99_8);
// Processor connections with the main board
- DECLARE_READ8_MEMBER( cruread );
- DECLARE_WRITE8_MEMBER( cruwrite );
- DECLARE_WRITE8_MEMBER( external_operation );
+ uint8_t cruread(offs_t offset);
+ void cruwrite(offs_t offset, uint8_t data);
+ void external_operation(offs_t offset, uint8_t data);
DECLARE_WRITE_LINE_MEMBER( clock_out );
DECLARE_WRITE_LINE_MEMBER( dbin_line );
@@ -267,7 +267,7 @@ private:
DECLARE_WRITE_LINE_MEMBER( video_interrupt );
// Connections with the system interface TMS9901
- DECLARE_READ8_MEMBER(read_by_9901);
+ uint8_t read_by_9901(offs_t offset);
DECLARE_WRITE_LINE_MEMBER(keyC0);
DECLARE_WRITE_LINE_MEMBER(keyC1);
DECLARE_WRITE_LINE_MEMBER(keyC2);
@@ -275,7 +275,7 @@ private:
DECLARE_WRITE_LINE_MEMBER(audio_gate);
DECLARE_WRITE_LINE_MEMBER(cassette_output);
DECLARE_WRITE_LINE_MEMBER(cassette_motor);
- DECLARE_WRITE8_MEMBER(tms9901_interrupt);
+ void tms9901_interrupt(offs_t offset, uint8_t data);
void crumap(address_map &map);
void memmap(address_map &map);
@@ -327,11 +327,8 @@ void ti99_8_state::memmap_setoffset(address_map &map)
void ti99_8_state::crumap(address_map &map)
{
- map(0x0000, 0x02ff).r(FUNC(ti99_8_state::cruread));
- map(0x0000, 0x0003).r(m_tms9901, FUNC(tms9901_device::read));
-
- map(0x0000, 0x17ff).w(FUNC(ti99_8_state::cruwrite));
- map(0x0000, 0x001f).w(m_tms9901, FUNC(tms9901_device::write));
+ map(0x0000, 0x2fff).rw(FUNC(ti99_8_state::cruread), FUNC(ti99_8_state::cruwrite));
+ map(0x0000, 0x003f).rw(m_tms9901, FUNC(tms9901_device::read), FUNC(tms9901_device::write));
}
/* ti99/8 : 54-key keyboard */
@@ -437,28 +434,27 @@ static INPUT_PORTS_START(ti99_8)
INPUT_PORTS_END
-READ8_MEMBER( ti99_8_state::cruread )
+uint8_t ti99_8_state::cruread(offs_t offset)
{
- LOGMASKED(LOG_CRUREAD, "read access to CRU address %04x\n", offset << 4);
+ LOGMASKED(LOG_CRUREAD, "read access to CRU address %04x\n", offset);
uint8_t value = 0;
// Let the mapper, the gromport, and the p-box decide whether they want
// to change the value at the CRU address
- // Also, we translate the bit addresses to base addresses
- m_mainboard->crureadz(space, offset<<4, &value);
- m_gromport->crureadz(space, offset<<4, &value);
- m_ioport->crureadz(space, offset<<4, &value);
+ m_mainboard->crureadz(offset<<1, &value);
+ m_gromport->crureadz(offset<<1, &value);
+ m_ioport->crureadz(offset<<1, &value);
- LOGMASKED(LOG_CRU, "CRU %04x -> %02x\n", offset<<4, value);
+ LOGMASKED(LOG_CRU, "CRU %04x -> %x\n", offset<<1, value);
return value;
}
-WRITE8_MEMBER( ti99_8_state::cruwrite )
+void ti99_8_state::cruwrite(offs_t offset, uint8_t data)
{
LOGMASKED(LOG_CRU, "CRU %04x <- %x\n", offset<<1, data);
- m_mainboard->cruwrite(space, offset<<1, data);
- m_gromport->cruwrite(space, offset<<1, data);
- m_ioport->cruwrite(space, offset<<1, data);
+ m_mainboard->cruwrite(offset<<1, data);
+ m_gromport->cruwrite(offset<<1, data);
+ m_ioport->cruwrite(offset<<1, data);
}
/***************************************************************************
@@ -469,7 +465,7 @@ WRITE8_MEMBER( ti99_8_state::cruwrite )
keyboard column selection.)
***************************************************************************/
-READ8_MEMBER( ti99_8_state::read_by_9901 )
+uint8_t ti99_8_state::read_by_9901(offs_t offset)
{
int answer=0;
uint8_t joyst;
@@ -604,7 +600,7 @@ WRITE_LINE_MEMBER( ti99_8_state::cassette_output )
m_cassette->output(state==ASSERT_LINE? +1 : -1);
}
-WRITE8_MEMBER( ti99_8_state::tms9901_interrupt )
+void ti99_8_state::tms9901_interrupt(offs_t offset, uint8_t data)
{
m_cpu->set_input_line(INT_9995_INT1, data);
}
@@ -678,7 +674,7 @@ WRITE_LINE_MEMBER( ti99_8_state::notconnected )
LOGMASKED(LOG_INTERRUPTS, "Setting a not connected line ... ignored\n");
}
-WRITE8_MEMBER( ti99_8_state::external_operation )
+void ti99_8_state::external_operation(offs_t offset, uint8_t data)
{
static char const *const extop[8] = { "inv1", "inv2", "IDLE", "RSET", "inv3", "CKON", "CKOF", "LREX" };
if (offset == IDLE_OP) return;
@@ -691,6 +687,7 @@ WRITE8_MEMBER( ti99_8_state::external_operation )
*/
WRITE_LINE_MEMBER( ti99_8_state::clock_out )
{
+ m_tms9901->phi_line(state);
m_mainboard->clock_in(state);
}
@@ -747,7 +744,7 @@ void ti99_8_state::ti99_8(machine_config& config)
m_cpu->holda_cb().set(TI998_MAINBOARD_TAG, FUNC(mainboard8_device::holda_line));
// 9901 configuration
- TMS9901(config, m_tms9901, XTAL(10'738'635)/4.0);
+ TMS9901(config, m_tms9901, 0);
m_tms9901->read_cb().set(FUNC(ti99_8_state::read_by_9901));
m_tms9901->p_out_cb(0).set(FUNC(ti99_8_state::keyC0));
m_tms9901->p_out_cb(1).set(FUNC(ti99_8_state::keyC1));
diff --git a/src/mame/drivers/tiamc1.cpp b/src/mame/drivers/tiamc1.cpp
index 0638e152925..2c54dd55b6a 100644
--- a/src/mame/drivers/tiamc1.cpp
+++ b/src/mame/drivers/tiamc1.cpp
@@ -327,11 +327,12 @@ static GFXDECODE_START( gfx_kot )
GFXDECODE_END
-MACHINE_CONFIG_START(tiamc1_state::tiamc1)
+void tiamc1_state::tiamc1(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", I8080, CPU_CLOCK)
- MCFG_DEVICE_PROGRAM_MAP(tiamc1_map)
- MCFG_DEVICE_IO_MAP(tiamc1_io_map)
+ I8080(config, m_maincpu, CPU_CLOCK);
+ m_maincpu->set_addrmap(AS_PROGRAM, &tiamc1_state::tiamc1_map);
+ m_maincpu->set_addrmap(AS_IO, &tiamc1_state::tiamc1_io_map);
i8255_device &ppi(I8255A(config, "kr580vv55a")); /* soviet clone of i8255 */
ppi.in_pa_callback().set_ioport("IN0");
@@ -340,10 +341,10 @@ MACHINE_CONFIG_START(tiamc1_state::tiamc1)
ppi.out_pc_callback().set(FUNC(tiamc1_state::tiamc1_control_w));
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_RAW_PARAMS(PIXEL_CLOCK, 336, 0, 256, 312, 0, 256) // pixel clock and htotal comes from docs/schematics, the rest is guess (determined by undumped PROM)
- MCFG_SCREEN_UPDATE_DRIVER(tiamc1_state, screen_update_tiamc1)
- MCFG_SCREEN_PALETTE(m_palette)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_raw(PIXEL_CLOCK, 336, 0, 256, 312, 0, 256); // pixel clock and htotal comes from docs/schematics, the rest is guess (determined by undumped PROM)
+ screen.set_screen_update(FUNC(tiamc1_state::screen_update_tiamc1));
+ screen.set_palette(m_palette);
GFXDECODE(config, m_gfxdecode, m_palette, gfx_tiamc1);
PALETTE(config, m_palette, FUNC(tiamc1_state::tiamc1_palette), 32);
@@ -351,32 +352,29 @@ MACHINE_CONFIG_START(tiamc1_state::tiamc1)
/* sound hardware */
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("2x8253", TIAMC1, SND_CLOCK)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
-MACHINE_CONFIG_END
+ TIAMC1(config, "2x8253", SND_CLOCK).add_route(ALL_OUTPUTS, "mono", 1.0);
+}
-MACHINE_CONFIG_START(tiamc1_state::kot)
+void tiamc1_state::kot(machine_config &config)
+{
tiamc1(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(kotrybolov_map)
- MCFG_DEVICE_IO_MAP(kotrybolov_io_map)
+ m_maincpu->set_addrmap(AS_PROGRAM, &tiamc1_state::kotrybolov_map);
+ m_maincpu->set_addrmap(AS_IO, &tiamc1_state::kotrybolov_io_map);
- MCFG_SCREEN_MODIFY("screen")
MCFG_VIDEO_START_OVERRIDE(tiamc1_state, kot)
- MCFG_SCREEN_UPDATE_DRIVER(tiamc1_state, screen_update_kot)
+ subdevice<screen_device>("screen")->set_screen_update(FUNC(tiamc1_state::screen_update_kot));
- MCFG_GFXDECODE_MODIFY("gfxdecode", gfx_kot)
+ m_gfxdecode->set_info(gfx_kot);
- MCFG_DEVICE_REMOVE("2x8253")
- MCFG_DEVICE_ADD("speaker", SPEAKER_SOUND)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.50)
+ config.device_remove("2x8253");
+ SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.50);
pit8253_device &pit8253(PIT8253(config, "pit8253", 0));
pit8253.set_clk<0>(PIXEL_CLOCK / 4);
pit8253.set_clk<2>(SND_CLOCK); // guess
pit8253.out_handler<2>().set(FUNC(tiamc1_state::pit8253_2_w));
-MACHINE_CONFIG_END
+}
ROM_START( konek )
diff --git a/src/mame/drivers/ticalc1x.cpp b/src/mame/drivers/ticalc1x.cpp
index 11f782fcd89..92ab626b219 100644
--- a/src/mame/drivers/ticalc1x.cpp
+++ b/src/mame/drivers/ticalc1x.cpp
@@ -38,8 +38,8 @@
class ticalc1x_state : public hh_tms1k_state
{
public:
- ticalc1x_state(const machine_config &mconfig, device_type type, const char *tag)
- : hh_tms1k_state(mconfig, type, tag)
+ ticalc1x_state(const machine_config &mconfig, device_type type, const char *tag) :
+ hh_tms1k_state(mconfig, type, tag)
{ }
};
@@ -47,10 +47,12 @@ public:
/***************************************************************************
- Minidrivers (subclass, I/O, Inputs, Machine Config)
+ Minidrivers (subclass, I/O, Inputs, Machine Config, ROM Defs)
***************************************************************************/
+namespace {
+
/***************************************************************************
Canon Multi 8 (Palmtronic MD-8) / Canon Canola MD 810
@@ -63,8 +65,8 @@ public:
class cmulti8_state : public ticalc1x_state
{
public:
- cmulti8_state(const machine_config &mconfig, device_type type, const char *tag)
- : ticalc1x_state(mconfig, type, tag)
+ cmulti8_state(const machine_config &mconfig, device_type type, const char *tag) :
+ ticalc1x_state(mconfig, type, tag)
{ }
void cmulti8(machine_config &config);
@@ -111,7 +113,6 @@ READ8_MEMBER(cmulti8_state::read_k)
return read_inputs(11);
}
-
// config
static INPUT_PORTS_START( cmulti8 )
@@ -187,19 +188,31 @@ static INPUT_PORTS_START( cmulti8 )
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED )
INPUT_PORTS_END
-MACHINE_CONFIG_START(cmulti8_state::cmulti8)
-
+void cmulti8_state::cmulti8(machine_config &config)
+{
/* basic machine hardware */
TMS1070(config, m_maincpu, 250000); // approximation - RC osc. R=56K, C=68pf
m_maincpu->k().set(FUNC(cmulti8_state::read_k));
m_maincpu->o().set(FUNC(cmulti8_state::write_o));
m_maincpu->r().set(FUNC(cmulti8_state::write_r));
- MCFG_TIMER_DRIVER_ADD_PERIODIC("display_decay", hh_tms1k_state, display_decay_tick, attotime::from_msec(1))
+ TIMER(config, "display_decay").configure_periodic(FUNC(hh_tms1k_state::display_decay_tick), attotime::from_msec(1));
config.set_default_layout(layout_cmulti8);
/* no sound! */
-MACHINE_CONFIG_END
+}
+
+// roms
+
+ROM_START( cmulti8 )
+ ROM_REGION( 0x0400, "maincpu", 0 )
+ ROM_LOAD( "tmc1079nl", 0x0000, 0x0400, CRC(202c5ed8) SHA1(0143975cac20cb4a4e9f659ca0535e8a9056f5bb) )
+
+ ROM_REGION( 867, "maincpu:mpla", 0 )
+ ROM_LOAD( "tms1000_common2_micro.pla", 0, 867, CRC(d33da3cf) SHA1(13c4ebbca227818db75e6db0d45b66ba5e207776) )
+ ROM_REGION( 365, "maincpu:opla", 0 )
+ ROM_LOAD( "tms1000_cmulti8_output.pla", 0, 365, CRC(e999cece) SHA1(c5012877cd030a4dc66228f109fa23eec1867873) )
+ROM_END
@@ -220,8 +233,8 @@ MACHINE_CONFIG_END
class tisr16_state : public ticalc1x_state
{
public:
- tisr16_state(const machine_config &mconfig, device_type type, const char *tag)
- : ticalc1x_state(mconfig, type, tag)
+ tisr16_state(const machine_config &mconfig, device_type type, const char *tag) :
+ ticalc1x_state(mconfig, type, tag)
{ }
void prepare_display();
@@ -265,7 +278,6 @@ READ8_MEMBER(tisr16_state::read_k)
return read_inputs(11);
}
-
// config
static INPUT_PORTS_START( tisr16 )
@@ -404,19 +416,41 @@ static INPUT_PORTS_START( tisr16ii )
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) PORT_NAME("9")
INPUT_PORTS_END
-MACHINE_CONFIG_START(tisr16_state::tisr16)
-
+void tisr16_state::tisr16(machine_config &config)
+{
/* basic machine hardware */
TMS1000(config, m_maincpu, 300000); // approximation - RC osc. R=43K, C=68pf (note: tisr16ii MCU RC osc. is different: R=30K, C=100pf, same freq)
m_maincpu->k().set(FUNC(tisr16_state::read_k));
m_maincpu->o().set(FUNC(tisr16_state::write_o));
m_maincpu->r().set(FUNC(tisr16_state::write_r));
- MCFG_TIMER_DRIVER_ADD_PERIODIC("display_decay", hh_tms1k_state, display_decay_tick, attotime::from_msec(1))
+ TIMER(config, "display_decay").configure_periodic(FUNC(hh_tms1k_state::display_decay_tick), attotime::from_msec(1));
config.set_default_layout(layout_tisr16);
/* no sound! */
-MACHINE_CONFIG_END
+}
+
+// roms
+
+ROM_START( tisr16 )
+ ROM_REGION( 0x0400, "maincpu", 0 )
+ ROM_LOAD( "tms1001nl", 0x0000, 0x0400, CRC(b7ce3c1d) SHA1(95cdb0c6be31043f4fe06314ed41c0ca1337bc46) )
+
+ ROM_REGION( 867, "maincpu:mpla", 0 )
+ ROM_LOAD( "tms1000_sr16_micro.pla", 0, 867, CRC(5b35019c) SHA1(730d3b9041ed76d57fbedd73b009477fe432b386) )
+ ROM_REGION( 365, "maincpu:opla", 0 )
+ ROM_LOAD( "tms1000_sr16_output.pla", 0, 365, CRC(29b08739) SHA1(d55f01e40a2d493d45ea422f12e63b01bcde08fb) )
+ROM_END
+
+ROM_START( tisr16ii )
+ ROM_REGION( 0x0400, "maincpu", 0 )
+ ROM_LOAD( "tms1016nl", 0x0000, 0x0400, CRC(c07a7b27) SHA1(34ea4d3b59871e08db74f8c5bfb7ff00d1f0adc7) )
+
+ ROM_REGION( 867, "maincpu:mpla", 0 )
+ ROM_LOAD( "tms1000_sr16ii_micro.pla", 0, 867, CRC(31b43e95) SHA1(6864e4c20f3affffcd3810dcefbc9484dd781547) )
+ ROM_REGION( 365, "maincpu:opla", 0 )
+ ROM_LOAD( "tms1000_sr16ii_output.pla", 0, 365, CRC(c45dfbd0) SHA1(5d588c1abc317134b51eb08ac3953f1009d80056) )
+ROM_END
@@ -450,8 +484,8 @@ MACHINE_CONFIG_END
class ti1250_state : public ticalc1x_state
{
public:
- ti1250_state(const machine_config &mconfig, device_type type, const char *tag)
- : ticalc1x_state(mconfig, type, tag)
+ ti1250_state(const machine_config &mconfig, device_type type, const char *tag) :
+ ticalc1x_state(mconfig, type, tag)
{ }
void ti1270(machine_config &config);
@@ -487,7 +521,6 @@ READ8_MEMBER(ti1250_state::read_k)
return read_inputs(6);
}
-
// config
static INPUT_PORTS_START( ti1250 )
@@ -546,21 +579,22 @@ static INPUT_PORTS_START( ti1270 )
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_MINUS) PORT_NAME("+/-")
INPUT_PORTS_END
-MACHINE_CONFIG_START(ti1250_state::ti1250)
-
+void ti1250_state::ti1250(machine_config &config)
+{
/* basic machine hardware */
TMS0950(config, m_maincpu, 200000); // approximation - RC osc. R=68K, C=68pf
m_maincpu->k().set(FUNC(ti1250_state::read_k));
m_maincpu->o().set(FUNC(ti1250_state::write_o));
m_maincpu->r().set(FUNC(ti1250_state::write_r));
- MCFG_TIMER_DRIVER_ADD_PERIODIC("display_decay", hh_tms1k_state, display_decay_tick, attotime::from_msec(1))
+ TIMER(config, "display_decay").configure_periodic(FUNC(hh_tms1k_state::display_decay_tick), attotime::from_msec(1));
config.set_default_layout(layout_ti1250);
/* no sound! */
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(ti1250_state::ti1270)
+void ti1250_state::ti1270(machine_config &config)
+{
ti1250(config);
/* basic machine hardware */
@@ -570,7 +604,49 @@ MACHINE_CONFIG_START(ti1250_state::ti1270)
m_maincpu->r().set(FUNC(ti1250_state::write_r));
config.set_default_layout(layout_ti1270);
-MACHINE_CONFIG_END
+}
+
+// roms
+
+ROM_START( ti1250 )
+ ROM_REGION( 0x0400, "maincpu", 0 )
+ ROM_LOAD( "tmc0952nl", 0x0000, 0x0400, CRC(fc0cee65) SHA1(1480e4553181f081281d3b78457721b9ecb20173) )
+
+ ROM_REGION( 867, "maincpu:mpla", 0 )
+ ROM_LOAD( "tms1000_ti1250_micro.pla", 0, 867, CRC(cb3fd2d6) SHA1(82cf36a65dfc3ccb9dd08e48f45ac4d90f693238) )
+ ROM_REGION( 195, "maincpu:opla", 0 )
+ ROM_LOAD( "tms0950_ti1250_output.pla", 0, 195, CRC(31570eb8) SHA1(c1cb17c31367b65aa777925459515c3d5c565508) )
+ ROM_REGION( 157, "maincpu:spla", 0 )
+ ROM_LOAD( "tms0980_common2_segment.pla", 0, 157, CRC(c03cccd8) SHA1(08bc4b597686a7aa8b2c9f43b85b62747ffd455b) )
+ROM_END
+
+ROM_START( ti125076 )
+ ROM_REGION( 0x0400, "maincpu", 0 )
+ ROM_LOAD( "tms0972nl_za0348", 0x0000, 0x0400, CRC(6e3f8add) SHA1(a249209e2a92f5016e33b7ad2c6c2660df1df959) )
+
+ ROM_REGION( 782, "maincpu:ipla", 0 )
+ ROM_LOAD( "tms0970_common1_instr.pla", 0, 782, CRC(05306ef8) SHA1(60a0a3c49ce330bce0c27f15f81d61461d0432ce) )
+ ROM_REGION( 860, "maincpu:mpla", 0 )
+ ROM_LOAD( "tms0970_common1_micro.pla", 0, 860, CRC(6ff5d51d) SHA1(59d3e5de290ba57694068ddba78d21a0c1edf427) )
+ ROM_REGION( 352, "maincpu:opla", 0 )
+ ROM_LOAD( "tms0980_ti1270_output.pla", 0, 352, CRC(472f95a0) SHA1(32adb17285f2f3f93a4b027a3dd2156ec48000ec) )
+ ROM_REGION( 157, "maincpu:spla", 0 )
+ ROM_LOAD( "tms0980_common2_segment.pla", 0, 157, CRC(c03cccd8) SHA1(08bc4b597686a7aa8b2c9f43b85b62747ffd455b) )
+ROM_END
+
+ROM_START( ti1270 )
+ ROM_REGION( 0x0400, "maincpu", 0 )
+ ROM_LOAD( "tmc0974nl_za0355", 0x0000, 0x0400, CRC(48e09b4b) SHA1(17f27167164df223f9f06082ece4c3fc3900eda3) )
+
+ ROM_REGION( 782, "maincpu:ipla", 0 )
+ ROM_LOAD( "tms0970_common1_instr.pla", 0, 782, CRC(05306ef8) SHA1(60a0a3c49ce330bce0c27f15f81d61461d0432ce) )
+ ROM_REGION( 860, "maincpu:mpla", 0 )
+ ROM_LOAD( "tms0970_common1_micro.pla", 0, 860, CRC(6ff5d51d) SHA1(59d3e5de290ba57694068ddba78d21a0c1edf427) )
+ ROM_REGION( 352, "maincpu:opla", 0 )
+ ROM_LOAD( "tms0980_ti1270_output.pla", 0, 352, CRC(472f95a0) SHA1(32adb17285f2f3f93a4b027a3dd2156ec48000ec) )
+ ROM_REGION( 157, "maincpu:spla", 0 )
+ ROM_LOAD( "tms0980_common2_segment.pla", 0, 157, CRC(c03cccd8) SHA1(08bc4b597686a7aa8b2c9f43b85b62747ffd455b) )
+ROM_END
@@ -587,8 +663,8 @@ MACHINE_CONFIG_END
class ti25503_state : public ticalc1x_state
{
public:
- ti25503_state(const machine_config &mconfig, device_type type, const char *tag)
- : ticalc1x_state(mconfig, type, tag)
+ ti25503_state(const machine_config &mconfig, device_type type, const char *tag) :
+ ticalc1x_state(mconfig, type, tag)
{ }
void ti25503(machine_config &config);
@@ -629,7 +705,6 @@ READ8_MEMBER(ti25503_state::read_k)
return read_inputs(7);
}
-
// config
static INPUT_PORTS_START( ti25503 )
@@ -676,19 +751,31 @@ static INPUT_PORTS_START( ti25503 )
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_X) PORT_NAME("1/x")
INPUT_PORTS_END
-MACHINE_CONFIG_START(ti25503_state::ti25503)
-
+void ti25503_state::ti25503(machine_config &config)
+{
/* basic machine hardware */
TMS1000(config, m_maincpu, 250000); // approximation
m_maincpu->k().set(FUNC(ti25503_state::read_k));
m_maincpu->o().set(FUNC(ti25503_state::write_o));
m_maincpu->r().set(FUNC(ti25503_state::write_r));
- MCFG_TIMER_DRIVER_ADD_PERIODIC("display_decay", hh_tms1k_state, display_decay_tick, attotime::from_msec(1))
+ TIMER(config, "display_decay").configure_periodic(FUNC(hh_tms1k_state::display_decay_tick), attotime::from_msec(1));
config.set_default_layout(layout_ti25503);
/* no sound! */
-MACHINE_CONFIG_END
+}
+
+// roms
+
+ROM_START( ti25503 )
+ ROM_REGION( 0x0400, "maincpu", 0 )
+ ROM_LOAD( "tms1043nl_za0352", 0x0000, 0x0400, CRC(434c2684) SHA1(ff566f1991f63cfe057879674e6bc7ccd580a919) )
+
+ ROM_REGION( 867, "maincpu:mpla", 0 )
+ ROM_LOAD( "tms1000_ti25503_micro.pla", 0, 867, CRC(65d274ae) SHA1(33d77efe38f8b067096c643d71263bb5adde0ca9) )
+ ROM_REGION( 365, "maincpu:opla", 0 )
+ ROM_LOAD( "tms1000_ti25503_output.pla", 0, 365, CRC(ac43b768) SHA1(5eb19b493328c73edab73e44591afda0fbe4965f) )
+ROM_END
@@ -708,8 +795,8 @@ MACHINE_CONFIG_END
class ti1000_state : public ticalc1x_state
{
public:
- ti1000_state(const machine_config &mconfig, device_type type, const char *tag)
- : ticalc1x_state(mconfig, type, tag)
+ ti1000_state(const machine_config &mconfig, device_type type, const char *tag) :
+ ticalc1x_state(mconfig, type, tag)
{ }
void ti1000(machine_config &config);
@@ -743,7 +830,6 @@ READ8_MEMBER(ti1000_state::read_k)
return read_inputs(5);
}
-
// config
static INPUT_PORTS_START( ti1000 )
@@ -767,31 +853,47 @@ static INPUT_PORTS_START( ti1000 )
// note: even though power buttons are on the matrix, they are not CPU-controlled
PORT_START("IN.3") // O3 or O4?
- PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_PGDN) PORT_NAME("Off") PORT_CHANGED_MEMBER(DEVICE_SELF, hh_tms1k_state, power_button, (void *)false)
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_PGDN) PORT_NAME("Off") PORT_CHANGED_MEMBER(DEVICE_SELF, hh_tms1k_state, power_button, false)
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_MINUS) PORT_NAME("+/-")
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_SLASH) PORT_NAME("%")
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_SLASH_PAD) PORT_NAME(UTF8_DIVIDE)
PORT_START("IN.4") // O5
- PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_PGUP) PORT_CODE(KEYCODE_DEL) PORT_NAME("On/C") PORT_CHANGED_MEMBER(DEVICE_SELF, hh_tms1k_state, power_button, (void *)true)
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_PGUP) PORT_CODE(KEYCODE_DEL) PORT_NAME("On/C") PORT_CHANGED_MEMBER(DEVICE_SELF, hh_tms1k_state, power_button, true)
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_0_PAD) PORT_NAME("0")
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_STOP) PORT_CODE(KEYCODE_DEL_PAD) PORT_NAME(".")
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("=")
INPUT_PORTS_END
-MACHINE_CONFIG_START(ti1000_state::ti1000)
-
+void ti1000_state::ti1000(machine_config &config)
+{
/* basic machine hardware */
TMS1990(config, m_maincpu, 250000); // approximation
m_maincpu->k().set(FUNC(ti1000_state::read_k));
m_maincpu->o().set(FUNC(ti1000_state::write_o));
m_maincpu->r().set(FUNC(ti1000_state::write_r));
- MCFG_TIMER_DRIVER_ADD_PERIODIC("display_decay", hh_tms1k_state, display_decay_tick, attotime::from_msec(1))
+ TIMER(config, "display_decay").configure_periodic(FUNC(hh_tms1k_state::display_decay_tick), attotime::from_msec(1));
config.set_default_layout(layout_ti1270);
/* no sound! */
-MACHINE_CONFIG_END
+}
+
+// roms
+
+ROM_START( ti1000 )
+ ROM_REGION( 0x0400, "maincpu", 0 )
+ ROM_LOAD( "tmc1991nl", 0x0000, 0x0400, CRC(2da5381d) SHA1(b5dc14553db2068ed48e130e5ec9109930d8cda9) )
+
+ ROM_REGION( 782, "maincpu:ipla", 0 )
+ ROM_LOAD( "tms0970_common1_instr.pla", 0, 782, CRC(05306ef8) SHA1(60a0a3c49ce330bce0c27f15f81d61461d0432ce) )
+ ROM_REGION( 860, "maincpu:mpla", 0 )
+ ROM_LOAD( "tms0970_common2_micro.pla", 0, 860, CRC(7f50ab2e) SHA1(bff3be9af0e322986f6e545b567c97d70e135c93) )
+ ROM_REGION( 352, "maincpu:opla", 0 )
+ ROM_LOAD( "tms0980_ti1000_output.pla", 0, 352, CRC(a936631e) SHA1(1f900b12a41419d6e1ffbddd5cf72be3adaa4435) )
+ ROM_REGION( 157, "maincpu:spla", 0 )
+ ROM_LOAD( "tms0980_common3_segment.pla", 0, 157, CRC(b5b3153f) SHA1(e0145c729695a4f962970aee0571d42cee6f5a9e) )
+ROM_END
@@ -808,8 +910,8 @@ MACHINE_CONFIG_END
class wizatron_state : public ticalc1x_state
{
public:
- wizatron_state(const machine_config &mconfig, device_type type, const char *tag)
- : ticalc1x_state(mconfig, type, tag)
+ wizatron_state(const machine_config &mconfig, device_type type, const char *tag) :
+ ticalc1x_state(mconfig, type, tag)
{ }
void wizatron(machine_config &config);
@@ -852,7 +954,6 @@ READ8_MEMBER(wizatron_state::read_k)
return read_inputs(4);
}
-
// config
static INPUT_PORTS_START( wizatron )
@@ -881,19 +982,35 @@ static INPUT_PORTS_START( wizatron )
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_SLASH_PAD) PORT_NAME(UTF8_DIVIDE)
INPUT_PORTS_END
-MACHINE_CONFIG_START(wizatron_state::wizatron)
-
+void wizatron_state::wizatron(machine_config &config)
+{
/* basic machine hardware */
TMS0970(config, m_maincpu, 250000); // approximation
m_maincpu->k().set(FUNC(wizatron_state::read_k));
m_maincpu->o().set(FUNC(wizatron_state::write_o));
m_maincpu->r().set(FUNC(wizatron_state::write_r));
- MCFG_TIMER_DRIVER_ADD_PERIODIC("display_decay", hh_tms1k_state, display_decay_tick, attotime::from_msec(1))
+ TIMER(config, "display_decay").configure_periodic(FUNC(hh_tms1k_state::display_decay_tick), attotime::from_msec(1));
config.set_default_layout(layout_wizatron);
/* no sound! */
-MACHINE_CONFIG_END
+}
+
+// roms
+
+ROM_START( wizatron )
+ ROM_REGION( 0x0400, "maincpu", 0 )
+ ROM_LOAD( "tmc0907nl_za0379", 0x0000, 0x0400, CRC(5a6af094) SHA1(b1f27e1f13f4db3b052dd50fb08dbf9c4d8db26e) )
+
+ ROM_REGION( 782, "maincpu:ipla", 0 )
+ ROM_LOAD( "tms0970_common1_instr.pla", 0, 782, CRC(05306ef8) SHA1(60a0a3c49ce330bce0c27f15f81d61461d0432ce) )
+ ROM_REGION( 860, "maincpu:mpla", 0 )
+ ROM_LOAD( "tms0970_common2_micro.pla", 0, 860, CRC(7f50ab2e) SHA1(bff3be9af0e322986f6e545b567c97d70e135c93) )
+ ROM_REGION( 352, "maincpu:opla", 0 )
+ ROM_LOAD( "tms0980_wizatron_output.pla", 0, 352, CRC(c0ee5c04) SHA1(e9fadcef688309adbe6c1c0545aac6883ce4a1ac) )
+ ROM_REGION( 157, "maincpu:spla", 0 )
+ ROM_LOAD( "tms0980_common2_segment.pla", 0, 157, CRC(c03cccd8) SHA1(08bc4b597686a7aa8b2c9f43b85b62747ffd455b) )
+ROM_END
@@ -913,8 +1030,8 @@ MACHINE_CONFIG_END
class lilprof_state : public wizatron_state
{
public:
- lilprof_state(const machine_config &mconfig, device_type type, const char *tag)
- : wizatron_state(mconfig, type, tag)
+ lilprof_state(const machine_config &mconfig, device_type type, const char *tag) :
+ wizatron_state(mconfig, type, tag)
{ }
void lilprof(machine_config &config);
@@ -940,7 +1057,6 @@ READ8_MEMBER(lilprof_state::read_k)
return read_inputs(5);
}
-
// config
static INPUT_PORTS_START( lilprof )
@@ -958,19 +1074,35 @@ static INPUT_PORTS_START( lilprof )
PORT_CONFSETTING( 0x08, "4" )
INPUT_PORTS_END
-MACHINE_CONFIG_START(lilprof_state::lilprof)
-
+void lilprof_state::lilprof(machine_config &config)
+{
/* basic machine hardware */
TMS0970(config, m_maincpu, 250000); // approximation
m_maincpu->k().set(FUNC(lilprof_state::read_k));
m_maincpu->o().set(FUNC(lilprof_state::write_o));
m_maincpu->r().set(FUNC(wizatron_state::write_r));
- MCFG_TIMER_DRIVER_ADD_PERIODIC("display_decay", hh_tms1k_state, display_decay_tick, attotime::from_msec(1))
+ TIMER(config, "display_decay").configure_periodic(FUNC(hh_tms1k_state::display_decay_tick), attotime::from_msec(1));
config.set_default_layout(layout_wizatron);
/* no sound! */
-MACHINE_CONFIG_END
+}
+
+// roms
+
+ROM_START( lilprof )
+ ROM_REGION( 0x0400, "maincpu", 0 )
+ ROM_LOAD( "tms0975nl_za0356", 0x0000, 0x0400, CRC(fef9dd39) SHA1(5c9614c9c5092d55dabeee2d6e0387d50d6ad4d5) )
+
+ ROM_REGION( 782, "maincpu:ipla", 0 )
+ ROM_LOAD( "tms0970_common1_instr.pla", 0, 782, CRC(05306ef8) SHA1(60a0a3c49ce330bce0c27f15f81d61461d0432ce) )
+ ROM_REGION( 860, "maincpu:mpla", 0 )
+ ROM_LOAD( "tms0970_common1_micro.pla", 0, 860, CRC(6ff5d51d) SHA1(59d3e5de290ba57694068ddba78d21a0c1edf427) )
+ ROM_REGION( 352, "maincpu:opla", 0 )
+ ROM_LOAD( "tms0980_lilprof_output.pla", 0, 352, CRC(73f9ca93) SHA1(9d6c559e2c1886c62bcd57e3c3aa897e8829b4d2) )
+ ROM_REGION( 157, "maincpu:spla", 0 )
+ ROM_LOAD( "tms0980_common2_segment.pla", 0, 157, CRC(c03cccd8) SHA1(08bc4b597686a7aa8b2c9f43b85b62747ffd455b) )
+ROM_END
@@ -990,8 +1122,8 @@ MACHINE_CONFIG_END
class lilprof78_state : public ticalc1x_state
{
public:
- lilprof78_state(const machine_config &mconfig, device_type type, const char *tag)
- : ticalc1x_state(mconfig, type, tag)
+ lilprof78_state(const machine_config &mconfig, device_type type, const char *tag) :
+ ticalc1x_state(mconfig, type, tag)
{ }
void lilprof78(machine_config &config);
@@ -1035,7 +1167,6 @@ READ8_MEMBER(lilprof78_state::read_k)
return read_inputs(5);
}
-
// config
static INPUT_PORTS_START( lilprof78 )
@@ -1059,31 +1190,47 @@ static INPUT_PORTS_START( lilprof78 )
// note: even though power buttons are on the matrix, they are not CPU-controlled
PORT_START("IN.3") // O3 or O4?
- PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_PGDN) PORT_NAME("Off") PORT_CHANGED_MEMBER(DEVICE_SELF, hh_tms1k_state, power_button, (void *)false)
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_PGDN) PORT_NAME("Off") PORT_CHANGED_MEMBER(DEVICE_SELF, hh_tms1k_state, power_button, false)
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNUSED )
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_S) PORT_NAME("Set")
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_L) PORT_NAME("Level")
PORT_START("IN.4") // O5
- PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_PGUP) PORT_CODE(KEYCODE_DEL) PORT_NAME("On") PORT_CHANGED_MEMBER(DEVICE_SELF, hh_tms1k_state, power_button, (void *)true)
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_PGUP) PORT_CODE(KEYCODE_DEL) PORT_NAME("On") PORT_CHANGED_MEMBER(DEVICE_SELF, hh_tms1k_state, power_button, true)
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_0_PAD) PORT_NAME("0")
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("Go")
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_PLUS_PAD) PORT_NAME("+")
INPUT_PORTS_END
-MACHINE_CONFIG_START(lilprof78_state::lilprof78)
-
+void lilprof78_state::lilprof78(machine_config &config)
+{
/* basic machine hardware */
TMS1990(config, m_maincpu, 250000); // approximation
m_maincpu->k().set(FUNC(lilprof78_state::read_k));
m_maincpu->o().set(FUNC(lilprof78_state::write_o));
m_maincpu->r().set(FUNC(lilprof78_state::write_r));
- MCFG_TIMER_DRIVER_ADD_PERIODIC("display_decay", hh_tms1k_state, display_decay_tick, attotime::from_msec(1))
+ TIMER(config, "display_decay").configure_periodic(FUNC(hh_tms1k_state::display_decay_tick), attotime::from_msec(1));
config.set_default_layout(layout_wizatron);
/* no sound! */
-MACHINE_CONFIG_END
+}
+
+// roms
+
+ROM_START( lilprof78 )
+ ROM_REGION( 0x0400, "maincpu", 0 )
+ ROM_LOAD( "tmc1993nl", 0x0000, 0x0400, CRC(e941316b) SHA1(7e1542045d1e731cea81a639c9ac9e91bb233b15) )
+
+ ROM_REGION( 782, "maincpu:ipla", 0 )
+ ROM_LOAD( "tms0970_common1_instr.pla", 0, 782, CRC(05306ef8) SHA1(60a0a3c49ce330bce0c27f15f81d61461d0432ce) )
+ ROM_REGION( 860, "maincpu:mpla", 0 )
+ ROM_LOAD( "tms0970_common2_micro.pla", 0, 860, CRC(7f50ab2e) SHA1(bff3be9af0e322986f6e545b567c97d70e135c93) )
+ ROM_REGION( 352, "maincpu:opla", 0 )
+ ROM_LOAD( "tms0980_lilprof78_output.pla", 0, 352, CRC(b7416cc0) SHA1(57891ffeaf34aafe8a915086c6d2feb78f5113af) )
+ ROM_REGION( 157, "maincpu:spla", 0 )
+ ROM_LOAD( "tms0980_common3_segment.pla", 0, 157, CRC(b5b3153f) SHA1(e0145c729695a4f962970aee0571d42cee6f5a9e) )
+ROM_END
@@ -1100,8 +1247,8 @@ MACHINE_CONFIG_END
class dataman_state : public ticalc1x_state
{
public:
- dataman_state(const machine_config &mconfig, device_type type, const char *tag)
- : ticalc1x_state(mconfig, type, tag)
+ dataman_state(const machine_config &mconfig, device_type type, const char *tag) :
+ ticalc1x_state(mconfig, type, tag)
{ }
void dataman(machine_config &config);
@@ -1143,7 +1290,6 @@ READ8_MEMBER(dataman_state::read_k)
return m_inp_matrix[5]->read() | read_inputs(5);
}
-
// config
static INPUT_PORTS_START( dataman )
@@ -1179,14 +1325,14 @@ static INPUT_PORTS_START( dataman )
// note: even though power buttons are on the matrix, they are not CPU-controlled
PORT_START("IN.5") // Vss!
- PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_PGUP) PORT_CODE(KEYCODE_U) PORT_NAME("On/User Entry") PORT_CHANGED_MEMBER(DEVICE_SELF, hh_tms1k_state, power_button, (void *)true)
- PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_PGDN) PORT_NAME("Off") PORT_CHANGED_MEMBER(DEVICE_SELF, hh_tms1k_state, power_button, (void *)false)
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_PGUP) PORT_CODE(KEYCODE_U) PORT_NAME("On/User Entry") PORT_CHANGED_MEMBER(DEVICE_SELF, hh_tms1k_state, power_button, true)
+ PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_PGDN) PORT_NAME("Off") PORT_CHANGED_MEMBER(DEVICE_SELF, hh_tms1k_state, power_button, false)
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_SLASH) PORT_NAME("?")
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_E) PORT_NAME("Electro Flash")
INPUT_PORTS_END
-MACHINE_CONFIG_START(dataman_state::dataman)
-
+void dataman_state::dataman(machine_config &config)
+{
/* basic machine hardware */
TMS1980(config, m_maincpu, 300000); // patent says 300kHz
m_maincpu->k().set(FUNC(dataman_state::read_k));
@@ -1194,11 +1340,25 @@ MACHINE_CONFIG_START(dataman_state::dataman)
m_maincpu->r().set(FUNC(dataman_state::write_r));
m_maincpu->power_off().set(FUNC(hh_tms1k_state::auto_power_off));
- MCFG_TIMER_DRIVER_ADD_PERIODIC("display_decay", hh_tms1k_state, display_decay_tick, attotime::from_msec(1))
+ TIMER(config, "display_decay").configure_periodic(FUNC(hh_tms1k_state::display_decay_tick), attotime::from_msec(1));
config.set_default_layout(layout_dataman);
/* no sound! */
-MACHINE_CONFIG_END
+}
+
+// roms
+
+ROM_START( dataman )
+ ROM_REGION( 0x1000, "maincpu", 0 )
+ ROM_LOAD16_WORD( "tmc1982nl", 0x0000, 0x1000, CRC(3521f53f) SHA1(c46fe7fe20715fdf5aed65833fb867cfd3938062) ) // matches patent US4340374
+
+ ROM_REGION( 1246, "maincpu:ipla", 0 )
+ ROM_LOAD( "tms0980_common1_instr.pla", 0, 1246, CRC(42db9a38) SHA1(2d127d98028ec8ec6ea10c179c25e447b14ba4d0) )
+ ROM_REGION( 2127, "maincpu:mpla", 0 )
+ ROM_LOAD( "tms0270_common2_micro.pla", 0, 2127, CRC(86737ac1) SHA1(4aa0444f3ddf88738ea74aec404c684bf54eddba) )
+ ROM_REGION( 525, "maincpu:opla", 0 )
+ ROM_LOAD( "tms1980_dataman_output.pla", 0, 525, CRC(5fc6f451) SHA1(11475c785c34eab5b13c5dc67f413c709cd4bd4d) )
+ROM_END
@@ -1217,8 +1377,8 @@ MACHINE_CONFIG_END
class mathmarv_state : public dataman_state
{
public:
- mathmarv_state(const machine_config &mconfig, device_type type, const char *tag)
- : dataman_state(mconfig, type, tag)
+ mathmarv_state(const machine_config &mconfig, device_type type, const char *tag) :
+ dataman_state(mconfig, type, tag)
{ }
void mathmarv(machine_config &config);
@@ -1238,7 +1398,6 @@ WRITE16_MEMBER(mathmarv_state::write_r)
dataman_state::write_r(space, offset, data);
}
-
// config
static INPUT_PORTS_START( mathmarv )
@@ -1250,13 +1409,13 @@ static INPUT_PORTS_START( mathmarv )
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_R) PORT_NAME("Review")
PORT_MODIFY("IN.5") // Vss!
- PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_PGUP) PORT_CODE(KEYCODE_N) PORT_NAME("On/Numberific") PORT_CHANGED_MEMBER(DEVICE_SELF, hh_tms1k_state, power_button, (void *)true)
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_PGUP) PORT_CODE(KEYCODE_N) PORT_NAME("On/Numberific") PORT_CHANGED_MEMBER(DEVICE_SELF, hh_tms1k_state, power_button, true)
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_Z) PORT_NAME("Zap")
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_F) PORT_NAME("Flash")
INPUT_PORTS_END
-MACHINE_CONFIG_START(mathmarv_state::mathmarv)
-
+void mathmarv_state::mathmarv(machine_config &config)
+{
/* basic machine hardware */
TMS1980(config, m_maincpu, 300000); // assume same as dataman
m_maincpu->k().set(FUNC(dataman_state::read_k));
@@ -1264,14 +1423,27 @@ MACHINE_CONFIG_START(mathmarv_state::mathmarv)
m_maincpu->r().set(FUNC(mathmarv_state::write_r));
m_maincpu->power_off().set(FUNC(hh_tms1k_state::auto_power_off));
- MCFG_TIMER_DRIVER_ADD_PERIODIC("display_decay", hh_tms1k_state, display_decay_tick, attotime::from_msec(1))
+ TIMER(config, "display_decay").configure_periodic(FUNC(hh_tms1k_state::display_decay_tick), attotime::from_msec(1));
config.set_default_layout(layout_mathmarv);
/* sound hardware */
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("speaker", SPEAKER_SOUND)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25)
-MACHINE_CONFIG_END
+ SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25);
+}
+
+// roms
+
+ROM_START( mathmarv )
+ ROM_REGION( 0x1000, "maincpu", 0 )
+ ROM_LOAD16_WORD( "tmc1986anl", 0x0000, 0x1000, CRC(79fda72d) SHA1(137852b29d9136459f78e29e7810195a956a5903) )
+
+ ROM_REGION( 1246, "maincpu:ipla", 0 )
+ ROM_LOAD( "tms0980_common1_instr.pla", 0, 1246, CRC(42db9a38) SHA1(2d127d98028ec8ec6ea10c179c25e447b14ba4d0) )
+ ROM_REGION( 2127, "maincpu:mpla", 0 )
+ ROM_LOAD( "tms0270_common2_micro.pla", 0, 2127, CRC(86737ac1) SHA1(4aa0444f3ddf88738ea74aec404c684bf54eddba) )
+ ROM_REGION( 525, "maincpu:opla", 0 )
+ ROM_LOAD( "tms1980_mathmarv_output.pla", 0, 525, CRC(5fc6f451) SHA1(11475c785c34eab5b13c5dc67f413c709cd4bd4d) )
+ROM_END
@@ -1301,8 +1473,8 @@ MACHINE_CONFIG_END
class ti30_state : public ticalc1x_state
{
public:
- ti30_state(const machine_config &mconfig, device_type type, const char *tag)
- : ticalc1x_state(mconfig, type, tag)
+ ti30_state(const machine_config &mconfig, device_type type, const char *tag) :
+ ticalc1x_state(mconfig, type, tag)
{ }
void ti30(machine_config &config);
@@ -1337,7 +1509,6 @@ READ8_MEMBER(ti30_state::read_k)
return m_inp_matrix[7]->read() | read_inputs(7);
}
-
// config
static INPUT_PORTS_START( ti30 )
@@ -1392,11 +1563,11 @@ static INPUT_PORTS_START( ti30 )
// note: even though power buttons are on the matrix, they are not CPU-controlled
PORT_START("IN.7") // Vss!
- PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_PGUP) PORT_CODE(KEYCODE_DEL) PORT_NAME("On/C") PORT_CHANGED_MEMBER(DEVICE_SELF, hh_tms1k_state, power_button, (void *)true)
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_PGUP) PORT_CODE(KEYCODE_DEL) PORT_NAME("On/C") PORT_CHANGED_MEMBER(DEVICE_SELF, hh_tms1k_state, power_button, true)
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_X) PORT_NAME("1/x")
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_R) PORT_NAME(UTF8_SQUAREROOT"x")
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Q) PORT_NAME("x" UTF8_POW_2)
- PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_PGDN) PORT_NAME("Off") PORT_CHANGED_MEMBER(DEVICE_SELF, hh_tms1k_state, power_button, (void *)false)
+ PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_PGDN) PORT_NAME("Off") PORT_CHANGED_MEMBER(DEVICE_SELF, hh_tms1k_state, power_button, false)
INPUT_PORTS_END
static INPUT_PORTS_START( tiprog )
@@ -1451,11 +1622,11 @@ static INPUT_PORTS_START( tiprog )
// note: even though power buttons are on the matrix, they are not CPU-controlled
PORT_START("IN.7") // Vss!
- PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_DEL) PORT_CODE(KEYCODE_PGUP) PORT_NAME("C/ON") PORT_CHANGED_MEMBER(DEVICE_SELF, hh_tms1k_state, power_button, (void *)true)
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_DEL) PORT_CODE(KEYCODE_PGUP) PORT_NAME("C/ON") PORT_CHANGED_MEMBER(DEVICE_SELF, hh_tms1k_state, power_button, true)
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_G) PORT_NAME("DEC")
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_J) PORT_NAME("OCT")
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_H) PORT_NAME("HEX")
- PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_PGDN) PORT_NAME("Off") PORT_CHANGED_MEMBER(DEVICE_SELF, hh_tms1k_state, power_button, (void *)false)
+ PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_PGDN) PORT_NAME("Off") PORT_CHANGED_MEMBER(DEVICE_SELF, hh_tms1k_state, power_button, false)
INPUT_PORTS_END
static INPUT_PORTS_START( tibusan )
@@ -1511,15 +1682,15 @@ static INPUT_PORTS_START( tibusan )
// note: even though power buttons are on the matrix, they are not CPU-controlled
PORT_START("IN.7") // Vss!
- PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_PGUP) PORT_CODE(KEYCODE_DEL) PORT_NAME("On/C") PORT_CHANGED_MEMBER(DEVICE_SELF, hh_tms1k_state, power_button, (void *)true)
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_PGUP) PORT_CODE(KEYCODE_DEL) PORT_NAME("On/C") PORT_CHANGED_MEMBER(DEVICE_SELF, hh_tms1k_state, power_button, true)
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_LSHIFT) PORT_CODE(KEYCODE_RSHIFT) PORT_NAME("2nd")
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Q) PORT_NAME("x" UTF8_POW_2" " UTF8_SQUAREROOT"x")
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_L) PORT_NAME("ln(x) e" UTF8_POW_X)
- PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_PGDN) PORT_NAME("Off") PORT_CHANGED_MEMBER(DEVICE_SELF, hh_tms1k_state, power_button, (void *)false)
+ PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_PGDN) PORT_NAME("Off") PORT_CHANGED_MEMBER(DEVICE_SELF, hh_tms1k_state, power_button, false)
INPUT_PORTS_END
-MACHINE_CONFIG_START(ti30_state::ti30)
-
+void ti30_state::ti30(machine_config &config)
+{
/* basic machine hardware */
TMS0980(config, m_maincpu, 400000); // guessed
m_maincpu->k().set(FUNC(ti30_state::read_k));
@@ -1527,192 +1698,13 @@ MACHINE_CONFIG_START(ti30_state::ti30)
m_maincpu->r().set(FUNC(ti30_state::write_r));
m_maincpu->power_off().set(FUNC(hh_tms1k_state::auto_power_off));
- MCFG_TIMER_DRIVER_ADD_PERIODIC("display_decay", hh_tms1k_state, display_decay_tick, attotime::from_msec(1))
+ TIMER(config, "display_decay").configure_periodic(FUNC(hh_tms1k_state::display_decay_tick), attotime::from_msec(1));
config.set_default_layout(layout_ti30);
/* no sound! */
-MACHINE_CONFIG_END
-
-
-
-
-
-/***************************************************************************
-
- Game driver(s)
-
-***************************************************************************/
-
-ROM_START( cmulti8 )
- ROM_REGION( 0x0400, "maincpu", 0 )
- ROM_LOAD( "tmc1079nl", 0x0000, 0x0400, CRC(202c5ed8) SHA1(0143975cac20cb4a4e9f659ca0535e8a9056f5bb) )
-
- ROM_REGION( 867, "maincpu:mpla", 0 )
- ROM_LOAD( "tms1000_common2_micro.pla", 0, 867, CRC(d33da3cf) SHA1(13c4ebbca227818db75e6db0d45b66ba5e207776) )
- ROM_REGION( 365, "maincpu:opla", 0 )
- ROM_LOAD( "tms1000_cmulti8_output.pla", 0, 365, CRC(e999cece) SHA1(c5012877cd030a4dc66228f109fa23eec1867873) )
-ROM_END
-
-
-ROM_START( tisr16 )
- ROM_REGION( 0x0400, "maincpu", 0 )
- ROM_LOAD( "tms1001nl", 0x0000, 0x0400, CRC(b7ce3c1d) SHA1(95cdb0c6be31043f4fe06314ed41c0ca1337bc46) )
-
- ROM_REGION( 867, "maincpu:mpla", 0 )
- ROM_LOAD( "tms1000_sr16_micro.pla", 0, 867, CRC(5b35019c) SHA1(730d3b9041ed76d57fbedd73b009477fe432b386) )
- ROM_REGION( 365, "maincpu:opla", 0 )
- ROM_LOAD( "tms1000_sr16_output.pla", 0, 365, CRC(29b08739) SHA1(d55f01e40a2d493d45ea422f12e63b01bcde08fb) )
-ROM_END
-
-
-ROM_START( tisr16ii )
- ROM_REGION( 0x0400, "maincpu", 0 )
- ROM_LOAD( "tms1016nl", 0x0000, 0x0400, CRC(c07a7b27) SHA1(34ea4d3b59871e08db74f8c5bfb7ff00d1f0adc7) )
-
- ROM_REGION( 867, "maincpu:mpla", 0 )
- ROM_LOAD( "tms1000_sr16ii_micro.pla", 0, 867, CRC(31b43e95) SHA1(6864e4c20f3affffcd3810dcefbc9484dd781547) )
- ROM_REGION( 365, "maincpu:opla", 0 )
- ROM_LOAD( "tms1000_sr16ii_output.pla", 0, 365, CRC(c45dfbd0) SHA1(5d588c1abc317134b51eb08ac3953f1009d80056) )
-ROM_END
-
-
-ROM_START( ti1250 )
- ROM_REGION( 0x0400, "maincpu", 0 )
- ROM_LOAD( "tmc0952nl", 0x0000, 0x0400, CRC(fc0cee65) SHA1(1480e4553181f081281d3b78457721b9ecb20173) )
-
- ROM_REGION( 867, "maincpu:mpla", 0 )
- ROM_LOAD( "tms1000_ti1250_micro.pla", 0, 867, CRC(cb3fd2d6) SHA1(82cf36a65dfc3ccb9dd08e48f45ac4d90f693238) )
- ROM_REGION( 195, "maincpu:opla", 0 )
- ROM_LOAD( "tms0950_ti1250_output.pla", 0, 195, CRC(31570eb8) SHA1(c1cb17c31367b65aa777925459515c3d5c565508) )
- ROM_REGION( 157, "maincpu:spla", 0 )
- ROM_LOAD( "tms0980_common2_segment.pla", 0, 157, CRC(c03cccd8) SHA1(08bc4b597686a7aa8b2c9f43b85b62747ffd455b) )
-ROM_END
-
-ROM_START( ti125076 )
- ROM_REGION( 0x0400, "maincpu", 0 )
- ROM_LOAD( "tms0972nl_za0348", 0x0000, 0x0400, CRC(6e3f8add) SHA1(a249209e2a92f5016e33b7ad2c6c2660df1df959) )
-
- ROM_REGION( 782, "maincpu:ipla", 0 )
- ROM_LOAD( "tms0970_common1_instr.pla", 0, 782, CRC(05306ef8) SHA1(60a0a3c49ce330bce0c27f15f81d61461d0432ce) )
- ROM_REGION( 860, "maincpu:mpla", 0 )
- ROM_LOAD( "tms0970_common1_micro.pla", 0, 860, CRC(6ff5d51d) SHA1(59d3e5de290ba57694068ddba78d21a0c1edf427) )
- ROM_REGION( 352, "maincpu:opla", 0 )
- ROM_LOAD( "tms0980_ti1270_output.pla", 0, 352, CRC(472f95a0) SHA1(32adb17285f2f3f93a4b027a3dd2156ec48000ec) )
- ROM_REGION( 157, "maincpu:spla", 0 )
- ROM_LOAD( "tms0980_common2_segment.pla", 0, 157, CRC(c03cccd8) SHA1(08bc4b597686a7aa8b2c9f43b85b62747ffd455b) )
-ROM_END
-
-
-ROM_START( ti1270 )
- ROM_REGION( 0x0400, "maincpu", 0 )
- ROM_LOAD( "tmc0974nl_za0355", 0x0000, 0x0400, CRC(48e09b4b) SHA1(17f27167164df223f9f06082ece4c3fc3900eda3) )
-
- ROM_REGION( 782, "maincpu:ipla", 0 )
- ROM_LOAD( "tms0970_common1_instr.pla", 0, 782, CRC(05306ef8) SHA1(60a0a3c49ce330bce0c27f15f81d61461d0432ce) )
- ROM_REGION( 860, "maincpu:mpla", 0 )
- ROM_LOAD( "tms0970_common1_micro.pla", 0, 860, CRC(6ff5d51d) SHA1(59d3e5de290ba57694068ddba78d21a0c1edf427) )
- ROM_REGION( 352, "maincpu:opla", 0 )
- ROM_LOAD( "tms0980_ti1270_output.pla", 0, 352, CRC(472f95a0) SHA1(32adb17285f2f3f93a4b027a3dd2156ec48000ec) )
- ROM_REGION( 157, "maincpu:spla", 0 )
- ROM_LOAD( "tms0980_common2_segment.pla", 0, 157, CRC(c03cccd8) SHA1(08bc4b597686a7aa8b2c9f43b85b62747ffd455b) )
-ROM_END
-
-
-ROM_START( ti25503 )
- ROM_REGION( 0x0400, "maincpu", 0 )
- ROM_LOAD( "tms1043nl_za0352", 0x0000, 0x0400, CRC(434c2684) SHA1(ff566f1991f63cfe057879674e6bc7ccd580a919) )
-
- ROM_REGION( 867, "maincpu:mpla", 0 )
- ROM_LOAD( "tms1000_ti25503_micro.pla", 0, 867, CRC(65d274ae) SHA1(33d77efe38f8b067096c643d71263bb5adde0ca9) )
- ROM_REGION( 365, "maincpu:opla", 0 )
- ROM_LOAD( "tms1000_ti25503_output.pla", 0, 365, CRC(ac43b768) SHA1(5eb19b493328c73edab73e44591afda0fbe4965f) )
-ROM_END
-
-
-ROM_START( ti1000 )
- ROM_REGION( 0x0400, "maincpu", 0 )
- ROM_LOAD( "tmc1991nl", 0x0000, 0x0400, CRC(2da5381d) SHA1(b5dc14553db2068ed48e130e5ec9109930d8cda9) )
-
- ROM_REGION( 782, "maincpu:ipla", 0 )
- ROM_LOAD( "tms0970_common1_instr.pla", 0, 782, CRC(05306ef8) SHA1(60a0a3c49ce330bce0c27f15f81d61461d0432ce) )
- ROM_REGION( 860, "maincpu:mpla", 0 )
- ROM_LOAD( "tms0970_common2_micro.pla", 0, 860, CRC(7f50ab2e) SHA1(bff3be9af0e322986f6e545b567c97d70e135c93) )
- ROM_REGION( 352, "maincpu:opla", 0 )
- ROM_LOAD( "tms0980_ti1000_output.pla", 0, 352, CRC(a936631e) SHA1(1f900b12a41419d6e1ffbddd5cf72be3adaa4435) )
- ROM_REGION( 157, "maincpu:spla", 0 )
- ROM_LOAD( "tms0980_common3_segment.pla", 0, 157, CRC(b5b3153f) SHA1(e0145c729695a4f962970aee0571d42cee6f5a9e) )
-ROM_END
-
-
-ROM_START( wizatron )
- ROM_REGION( 0x0400, "maincpu", 0 )
- ROM_LOAD( "tmc0907nl_za0379", 0x0000, 0x0400, CRC(5a6af094) SHA1(b1f27e1f13f4db3b052dd50fb08dbf9c4d8db26e) )
-
- ROM_REGION( 782, "maincpu:ipla", 0 )
- ROM_LOAD( "tms0970_common1_instr.pla", 0, 782, CRC(05306ef8) SHA1(60a0a3c49ce330bce0c27f15f81d61461d0432ce) )
- ROM_REGION( 860, "maincpu:mpla", 0 )
- ROM_LOAD( "tms0970_common2_micro.pla", 0, 860, CRC(7f50ab2e) SHA1(bff3be9af0e322986f6e545b567c97d70e135c93) )
- ROM_REGION( 352, "maincpu:opla", 0 )
- ROM_LOAD( "tms0980_wizatron_output.pla", 0, 352, CRC(c0ee5c04) SHA1(e9fadcef688309adbe6c1c0545aac6883ce4a1ac) )
- ROM_REGION( 157, "maincpu:spla", 0 )
- ROM_LOAD( "tms0980_common2_segment.pla", 0, 157, CRC(c03cccd8) SHA1(08bc4b597686a7aa8b2c9f43b85b62747ffd455b) )
-ROM_END
-
-
-ROM_START( lilprof )
- ROM_REGION( 0x0400, "maincpu", 0 )
- ROM_LOAD( "tms0975nl_za0356", 0x0000, 0x0400, CRC(fef9dd39) SHA1(5c9614c9c5092d55dabeee2d6e0387d50d6ad4d5) )
-
- ROM_REGION( 782, "maincpu:ipla", 0 )
- ROM_LOAD( "tms0970_common1_instr.pla", 0, 782, CRC(05306ef8) SHA1(60a0a3c49ce330bce0c27f15f81d61461d0432ce) )
- ROM_REGION( 860, "maincpu:mpla", 0 )
- ROM_LOAD( "tms0970_common1_micro.pla", 0, 860, CRC(6ff5d51d) SHA1(59d3e5de290ba57694068ddba78d21a0c1edf427) )
- ROM_REGION( 352, "maincpu:opla", 0 )
- ROM_LOAD( "tms0980_lilprof_output.pla", 0, 352, CRC(73f9ca93) SHA1(9d6c559e2c1886c62bcd57e3c3aa897e8829b4d2) )
- ROM_REGION( 157, "maincpu:spla", 0 )
- ROM_LOAD( "tms0980_common2_segment.pla", 0, 157, CRC(c03cccd8) SHA1(08bc4b597686a7aa8b2c9f43b85b62747ffd455b) )
-ROM_END
-
-ROM_START( lilprof78 )
- ROM_REGION( 0x0400, "maincpu", 0 )
- ROM_LOAD( "tmc1993nl", 0x0000, 0x0400, CRC(e941316b) SHA1(7e1542045d1e731cea81a639c9ac9e91bb233b15) )
-
- ROM_REGION( 782, "maincpu:ipla", 0 )
- ROM_LOAD( "tms0970_common1_instr.pla", 0, 782, CRC(05306ef8) SHA1(60a0a3c49ce330bce0c27f15f81d61461d0432ce) )
- ROM_REGION( 860, "maincpu:mpla", 0 )
- ROM_LOAD( "tms0970_common2_micro.pla", 0, 860, CRC(7f50ab2e) SHA1(bff3be9af0e322986f6e545b567c97d70e135c93) )
- ROM_REGION( 352, "maincpu:opla", 0 )
- ROM_LOAD( "tms0980_lilprof78_output.pla", 0, 352, CRC(b7416cc0) SHA1(57891ffeaf34aafe8a915086c6d2feb78f5113af) )
- ROM_REGION( 157, "maincpu:spla", 0 )
- ROM_LOAD( "tms0980_common3_segment.pla", 0, 157, CRC(b5b3153f) SHA1(e0145c729695a4f962970aee0571d42cee6f5a9e) )
-ROM_END
-
-
-ROM_START( dataman )
- ROM_REGION( 0x1000, "maincpu", 0 )
- ROM_LOAD16_WORD( "tmc1982nl", 0x0000, 0x1000, CRC(3521f53f) SHA1(c46fe7fe20715fdf5aed65833fb867cfd3938062) ) // matches patent US4340374
-
- ROM_REGION( 1246, "maincpu:ipla", 0 )
- ROM_LOAD( "tms0980_common1_instr.pla", 0, 1246, CRC(42db9a38) SHA1(2d127d98028ec8ec6ea10c179c25e447b14ba4d0) )
- ROM_REGION( 2127, "maincpu:mpla", 0 )
- ROM_LOAD( "tms0270_common2_micro.pla", 0, 2127, CRC(86737ac1) SHA1(4aa0444f3ddf88738ea74aec404c684bf54eddba) )
- ROM_REGION( 525, "maincpu:opla", 0 )
- ROM_LOAD( "tms1980_dataman_output.pla", 0, 525, CRC(5fc6f451) SHA1(11475c785c34eab5b13c5dc67f413c709cd4bd4d) )
-ROM_END
-
-
-ROM_START( mathmarv )
- ROM_REGION( 0x1000, "maincpu", 0 )
- ROM_LOAD16_WORD( "tmc1986anl", 0x0000, 0x1000, CRC(79fda72d) SHA1(137852b29d9136459f78e29e7810195a956a5903) )
-
- ROM_REGION( 1246, "maincpu:ipla", 0 )
- ROM_LOAD( "tms0980_common1_instr.pla", 0, 1246, CRC(42db9a38) SHA1(2d127d98028ec8ec6ea10c179c25e447b14ba4d0) )
- ROM_REGION( 2127, "maincpu:mpla", 0 )
- ROM_LOAD( "tms0270_common2_micro.pla", 0, 2127, CRC(86737ac1) SHA1(4aa0444f3ddf88738ea74aec404c684bf54eddba) )
- ROM_REGION( 525, "maincpu:opla", 0 )
- ROM_LOAD( "tms1980_mathmarv_output.pla", 0, 525, CRC(5fc6f451) SHA1(11475c785c34eab5b13c5dc67f413c709cd4bd4d) )
-ROM_END
+}
+// roms
ROM_START( ti30 )
ROM_REGION( 0x1000, "maincpu", 0 )
@@ -1728,7 +1720,6 @@ ROM_START( ti30 )
ROM_LOAD( "tms0980_common1_segment.pla", 0, 157, CRC(399aa481) SHA1(72c56c58fde3fbb657d69647a9543b5f8fc74279) )
ROM_END
-
ROM_START( tibusan )
ROM_REGION( 0x1000, "maincpu", 0 )
ROM_LOAD16_WORD( "tmc0982nl", 0x0000, 0x1000, CRC(6954560a) SHA1(6c153a0c9239a811e3514a43d809964c06f8f88e) )
@@ -1743,7 +1734,6 @@ ROM_START( tibusan )
ROM_LOAD( "tms0980_common1_segment.pla", 0, 157, CRC(399aa481) SHA1(72c56c58fde3fbb657d69647a9543b5f8fc74279) )
ROM_END
-
ROM_START( tiprog )
ROM_REGION( 0x1000, "maincpu", 0 )
ROM_LOAD16_WORD( "za0675nl", 0x0000, 0x1000, CRC(82355854) SHA1(03fab373bce04df8ea3fe25352525e8539213626) ) // tmc0983
@@ -1760,8 +1750,16 @@ ROM_END
-// YEAR NAME PARENT CMP MACHINE INPUT CLASS INIT COMPANY FULLNAME, FLAGS
-COMP( 1977, cmulti8, 0, 0, cmulti8, cmulti8, cmulti8_state, empty_init, "Canon", "Multi 8 (Canon)", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW )
+} // anonymous namespace
+
+/***************************************************************************
+
+ Game driver(s)
+
+***************************************************************************/
+
+// YEAR NAME PARENT CMP MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS
+COMP( 1977, cmulti8, 0, 0, cmulti8, cmulti8, cmulti8_state, empty_init, "Canon", "Multi 8 (Canon)", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW )
COMP( 1974, tisr16, 0, 0, tisr16, tisr16, tisr16_state, empty_init, "Texas Instruments", "SR-16", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW )
COMP( 1975, tisr16ii, 0, 0, tisr16, tisr16ii, tisr16_state, empty_init, "Texas Instruments", "SR-16 II", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW )
diff --git a/src/mame/drivers/tickee.cpp b/src/mame/drivers/tickee.cpp
index 3329389d6a3..48698080c09 100644
--- a/src/mame/drivers/tickee.cpp
+++ b/src/mame/drivers/tickee.cpp
@@ -454,7 +454,6 @@ void tickee_state::tickee_map(address_map &map)
map(0x04200100, 0x0420011f).w("ym2", FUNC(ay8910_device::address_data_w)).umask16(0x00ff);
map(0x04400000, 0x0440007f).w(FUNC(tickee_state::tickee_control_w)).share("control");
map(0x04400040, 0x0440004f).portr("IN2");
- map(0xc0000000, 0xc00001ff).rw(m_maincpu, FUNC(tms34010_device::io_register_r), FUNC(tms34010_device::io_register_w));
map(0xc0000240, 0xc000025f).nopw(); /* seems to be a bug in their code */
map(0xff000000, 0xffffffff).rom().region("user1", 0);
}
@@ -472,7 +471,6 @@ void tickee_state::ghoshunt_map(address_map &map)
map(0x04300100, 0x0430010f).r("ym2", FUNC(ay8910_device::data_r)).umask16(0x00ff);
map(0x04300100, 0x0430011f).w("ym2", FUNC(ay8910_device::address_data_w)).umask16(0x00ff);
map(0x04500000, 0x0450007f).w(FUNC(tickee_state::tickee_control_w)).share("control");
- map(0xc0000000, 0xc00001ff).rw(m_maincpu, FUNC(tms34010_device::io_register_r), FUNC(tms34010_device::io_register_w));
map(0xc0000240, 0xc000025f).nopw(); /* seems to be a bug in their code */
map(0xff000000, 0xffffffff).rom().region("user1", 0);
}
@@ -489,7 +487,6 @@ void tickee_state::mouseatk_map(address_map &map)
map(0x04200100, 0x0420010f).rw(m_oki, FUNC(okim6295_device::read), FUNC(okim6295_device::write)).umask16(0x00ff);
map(0x04400000, 0x0440007f).w(FUNC(tickee_state::tickee_control_w)).share("control");
map(0x04400040, 0x0440004f).portr("IN2"); // ?
- map(0xc0000000, 0xc00001ff).rw(m_maincpu, FUNC(tms34010_device::io_register_r), FUNC(tms34010_device::io_register_w));
map(0xc0000240, 0xc000025f).nopw(); /* seems to be a bug in their code */
map(0xff000000, 0xffffffff).rom().region("user1", 0);
}
@@ -500,7 +497,6 @@ void tickee_state::rapidfir_map(address_map &map)
{
map(0x00000000, 0x007fffff).ram().share("vram");
map(0x02000000, 0x027fffff).rw(FUNC(tickee_state::rapidfir_transparent_r), FUNC(tickee_state::rapidfir_transparent_w));
- map(0xc0000000, 0xc00001ff).rw(m_maincpu, FUNC(tms34010_device::io_register_r), FUNC(tms34010_device::io_register_w));
map(0xfc000000, 0xfc00000f).r(FUNC(tickee_state::rapidfir_gun1_r));
map(0xfc000100, 0xfc00010f).r(FUNC(tickee_state::rapidfir_gun2_r));
map(0xfc000400, 0xfc00040f).r(FUNC(tickee_state::ffff_r));
@@ -758,8 +754,8 @@ INPUT_PORTS_END
*
*************************************/
-MACHINE_CONFIG_START(tickee_state::tickee)
-
+void tickee_state::tickee(machine_config &config)
+{
/* basic machine hardware */
TMS34010(config, m_maincpu, XTAL(40'000'000));
m_maincpu->set_addrmap(AS_PROGRAM, &tickee_state::tickee_map);
@@ -771,17 +767,17 @@ MACHINE_CONFIG_START(tickee_state::tickee)
MCFG_MACHINE_RESET_OVERRIDE(tickee_state,tickee)
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_1);
- MCFG_TICKET_DISPENSER_ADD("ticket1", attotime::from_msec(100), TICKET_MOTOR_ACTIVE_LOW, TICKET_STATUS_ACTIVE_HIGH)
- MCFG_TICKET_DISPENSER_ADD("ticket2", attotime::from_msec(100), TICKET_MOTOR_ACTIVE_LOW, TICKET_STATUS_ACTIVE_HIGH)
+ TICKET_DISPENSER(config, m_ticket[0], attotime::from_msec(100), TICKET_MOTOR_ACTIVE_LOW, TICKET_STATUS_ACTIVE_HIGH);
+ TICKET_DISPENSER(config, m_ticket[1], attotime::from_msec(100), TICKET_MOTOR_ACTIVE_LOW, TICKET_STATUS_ACTIVE_HIGH);
/* video hardware */
- MCFG_TLC34076_ADD("tlc34076", TLC34076_6_BIT)
+ TLC34076(config, m_tlc34076, tlc34076_device::TLC34076_6_BIT);
MCFG_VIDEO_START_OVERRIDE(tickee_state,tickee)
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_RAW_PARAMS(VIDEO_CLOCK/2, 444, 0, 320, 233, 0, 200)
- MCFG_SCREEN_UPDATE_DEVICE("maincpu", tms34010_device, tms340x0_rgb32)
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_raw(VIDEO_CLOCK/2, 444, 0, 320, 233, 0, 200);
+ m_screen->set_screen_update("maincpu", FUNC(tms34010_device::tms340x0_rgb32));
/* sound hardware */
SPEAKER(config, "mono").front_center();
@@ -795,20 +791,20 @@ MACHINE_CONFIG_START(tickee_state::tickee)
ym2.port_a_read_callback().set_ioport("IN0");
ym2.port_b_read_callback().set_ioport("IN2");
ym2.add_route(ALL_OUTPUTS, "mono", 0.50);
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(tickee_state::ghoshunt)
+void tickee_state::ghoshunt(machine_config &config)
+{
tickee(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(ghoshunt_map)
-MACHINE_CONFIG_END
-
+ m_maincpu->set_addrmap(AS_PROGRAM, &tickee_state::ghoshunt_map);
+}
-MACHINE_CONFIG_START(tickee_state::rapidfir)
+void tickee_state::rapidfir(machine_config &config)
+{
/* basic machine hardware */
TMS34010(config, m_maincpu, XTAL(50'000'000));
m_maincpu->set_addrmap(AS_PROGRAM, &tickee_state::rapidfir_map);
@@ -825,24 +821,23 @@ MACHINE_CONFIG_START(tickee_state::rapidfir)
WATCHDOG_TIMER(config, "watchdog");
/* video hardware */
- MCFG_TLC34076_ADD("tlc34076", TLC34076_6_BIT)
+ TLC34076(config, m_tlc34076, tlc34076_device::TLC34076_6_BIT);
MCFG_VIDEO_START_OVERRIDE(tickee_state,tickee)
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_RAW_PARAMS(VIDEO_CLOCK/2, 444, 0, 320, 233, 0, 200)
- MCFG_SCREEN_UPDATE_DEVICE("maincpu", tms34010_device, tms340x0_rgb32)
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_raw(VIDEO_CLOCK/2, 444, 0, 320, 233, 0, 200);
+ m_screen->set_screen_update("maincpu", FUNC(tms34010_device::tms340x0_rgb32));
/* sound hardware */
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("oki", OKIM6295, OKI_CLOCK, okim6295_device::PIN7_HIGH)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.00)
-MACHINE_CONFIG_END
-
+ OKIM6295(config, m_oki, OKI_CLOCK, okim6295_device::PIN7_HIGH).add_route(ALL_OUTPUTS, "mono", 1.00);
+}
-MACHINE_CONFIG_START(tickee_state::mouseatk)
+void tickee_state::mouseatk(machine_config &config)
+{
/* basic machine hardware */
TMS34010(config, m_maincpu, XTAL(40'000'000));
m_maincpu->set_addrmap(AS_PROGRAM, &tickee_state::mouseatk_map);
@@ -854,15 +849,15 @@ MACHINE_CONFIG_START(tickee_state::mouseatk)
MCFG_MACHINE_RESET_OVERRIDE(tickee_state,tickee)
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_1);
- MCFG_TICKET_DISPENSER_ADD("ticket1", attotime::from_msec(100), TICKET_MOTOR_ACTIVE_LOW, TICKET_STATUS_ACTIVE_HIGH)
- MCFG_TICKET_DISPENSER_ADD("ticket2", attotime::from_msec(100), TICKET_MOTOR_ACTIVE_LOW, TICKET_STATUS_ACTIVE_HIGH)
+ TICKET_DISPENSER(config, m_ticket[0], attotime::from_msec(100), TICKET_MOTOR_ACTIVE_LOW, TICKET_STATUS_ACTIVE_HIGH);
+ TICKET_DISPENSER(config, m_ticket[1], attotime::from_msec(100), TICKET_MOTOR_ACTIVE_LOW, TICKET_STATUS_ACTIVE_HIGH);
/* video hardware */
- MCFG_TLC34076_ADD("tlc34076", TLC34076_6_BIT)
+ TLC34076(config, m_tlc34076, tlc34076_device::TLC34076_6_BIT);
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_RAW_PARAMS(VIDEO_CLOCK/2, 444, 0, 320, 233, 0, 200)
- MCFG_SCREEN_UPDATE_DEVICE("maincpu", tms34010_device, tms340x0_rgb32)
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_raw(VIDEO_CLOCK/2, 444, 0, 320, 233, 0, 200);
+ m_screen->set_screen_update("maincpu", FUNC(tms34010_device::tms340x0_rgb32));
/* sound hardware */
SPEAKER(config, "mono").front_center();
@@ -872,9 +867,8 @@ MACHINE_CONFIG_START(tickee_state::mouseatk)
ym.port_b_read_callback().set_ioport("IN1");
ym.add_route(ALL_OUTPUTS, "mono", 0.50);
- MCFG_DEVICE_ADD("oki", OKIM6295, OKI_CLOCK, okim6295_device::PIN7_HIGH)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.00)
-MACHINE_CONFIG_END
+ OKIM6295(config, m_oki, OKI_CLOCK, okim6295_device::PIN7_HIGH).add_route(ALL_OUTPUTS, "mono", 1.00);
+}
/*************************************
diff --git a/src/mame/drivers/tiki100.cpp b/src/mame/drivers/tiki100.cpp
index ff6955d30b2..28c4802139f 100644
--- a/src/mame/drivers/tiki100.cpp
+++ b/src/mame/drivers/tiki100.cpp
@@ -36,7 +36,7 @@ READ8_MEMBER( tiki100_state::mrq_r )
{
bool mdis = 1;
- uint8_t data = m_exp->mrq_r(space, offset, 0xff, mdis);
+ uint8_t data = m_exp->mrq_r(offset, 0xff, mdis);
offs_t prom_addr = mdis << 5 | m_vire << 4 | m_rome << 3 | (offset >> 13);
uint8_t prom = m_prom->base()[prom_addr] ^ 0xff;
@@ -84,12 +84,12 @@ WRITE8_MEMBER( tiki100_state::mrq_w )
m_ram->pointer()[offset] = data;
}
- m_exp->mrq_w(space, offset, data);
+ m_exp->mrq_w(offset, data);
}
READ8_MEMBER( tiki100_state::iorq_r )
{
- uint8_t data = m_exp->iorq_r(space, offset, 0xff);
+ uint8_t data = m_exp->iorq_r(offset, 0xff);
switch ((offset & 0xff) >> 2)
{
@@ -113,7 +113,7 @@ READ8_MEMBER( tiki100_state::iorq_r )
switch (offset & 0x03)
{
case 3:
- data = m_psg->data_r(space, 0);
+ data = m_psg->data_r();
break;
}
break;
@@ -128,7 +128,7 @@ READ8_MEMBER( tiki100_state::iorq_r )
WRITE8_MEMBER( tiki100_state::iorq_w )
{
- m_exp->iorq_w(space, offset, data);
+ m_exp->iorq_w(offset, data);
switch ((offset & 0xff) >> 2)
{
@@ -160,11 +160,11 @@ WRITE8_MEMBER( tiki100_state::iorq_w )
break;
case 2:
- m_psg->address_w(space, 0, data);
+ m_psg->address_w(data);
break;
case 3:
- m_psg->data_w(space, 0, data);
+ m_psg->data_w(data);
break;
}
break;
@@ -700,7 +700,8 @@ void tiki100_state::machine_reset()
/* Machine Driver */
-MACHINE_CONFIG_START(tiki100_state::tiki100)
+void tiki100_state::tiki100(machine_config &config)
+{
/* basic machine hardware */
Z80(config, m_maincpu, 8_MHz_XTAL / 2);
m_maincpu->set_addrmap(AS_PROGRAM, &tiki100_state::tiki100_mem);
@@ -708,20 +709,20 @@ MACHINE_CONFIG_START(tiki100_state::tiki100)
m_maincpu->set_daisy_config(tiki100_daisy_chain);
/* video hardware */
- MCFG_SCREEN_ADD(SCREEN_TAG, RASTER)
- MCFG_SCREEN_RAW_PARAMS(20_MHz_XTAL, 1280, 0, 1024, 312, 0, 256)
- MCFG_SCREEN_UPDATE_DRIVER(tiki100_state, screen_update)
- MCFG_PALETTE_ADD("palette", 16)
-
- MCFG_TIKI100_BUS_ADD()
- MCFG_TIKI100_BUS_IRQ_CALLBACK(INPUTLINE(Z80_TAG, INPUT_LINE_IRQ0))
- MCFG_TIKI100_BUS_NMI_CALLBACK(INPUTLINE(Z80_TAG, INPUT_LINE_NMI))
- MCFG_TIKI100_BUS_BUSRQ_CALLBACK(WRITELINE(*this, tiki100_state, busrq_w))
- MCFG_TIKI100_BUS_IN_MREQ_CALLBACK(READ8(*this, tiki100_state, mrq_r))
- MCFG_TIKI100_BUS_OUT_MREQ_CALLBACK(WRITE8(*this, tiki100_state, mrq_w))
- MCFG_TIKI100_BUS_SLOT_ADD("slot1", "8088")
- MCFG_TIKI100_BUS_SLOT_ADD("slot2", "hdc")
- MCFG_TIKI100_BUS_SLOT_ADD("slot3", nullptr)
+ screen_device &screen(SCREEN(config, SCREEN_TAG, SCREEN_TYPE_RASTER));
+ screen.set_raw(20_MHz_XTAL, 1280, 0, 1024, 312, 0, 256);
+ screen.set_screen_update(FUNC(tiki100_state::screen_update));
+ PALETTE(config, m_palette).set_entries(16);
+
+ TIKI100_BUS(config, m_exp, 0);
+ m_exp->irq_wr_callback().set_inputline(m_maincpu, INPUT_LINE_IRQ0);
+ m_exp->nmi_wr_callback().set_inputline(m_maincpu, INPUT_LINE_NMI);
+ m_exp->busrq_wr_callback().set(FUNC(tiki100_state::busrq_w));
+ m_exp->mrq_rd_callback().set(FUNC(tiki100_state::mrq_r));
+ m_exp->mrq_wr_callback().set(FUNC(tiki100_state::mrq_w));
+ TIKI100_BUS_SLOT(config, "slot1", tiki100_cards, "8088");
+ TIKI100_BUS_SLOT(config, "slot2", tiki100_cards, "hdc");
+ TIKI100_BUS_SLOT(config, "slot3", tiki100_cards, nullptr);
/* devices */
Z80DART(config, m_dart, 8_MHz_XTAL / 4);
@@ -746,11 +747,11 @@ MACHINE_CONFIG_START(tiki100_state::tiki100)
m_ctc->zc_callback<1>().set(m_dart, FUNC(z80dart_device::rxtxcb_w));
m_ctc->zc_callback<2>().set(FUNC(tiki100_state::bar2_w));
- MCFG_TIMER_DRIVER_ADD_PERIODIC("ctc", tiki100_state, ctc_tick, attotime::from_hz(8_MHz_XTAL / 4))
+ TIMER(config, "ctc").configure_periodic(FUNC(tiki100_state::ctc_tick), attotime::from_hz(8_MHz_XTAL / 4));
FD1797(config, m_fdc, 8_MHz_XTAL / 8); // FD1767PL-02 or FD1797-PL
- MCFG_FLOPPY_DRIVE_ADD(FD1797_TAG":0", tiki100_floppies, "525qd", tiki100_state::floppy_formats)
- MCFG_FLOPPY_DRIVE_ADD(FD1797_TAG":1", tiki100_floppies, "525qd", tiki100_state::floppy_formats)
+ FLOPPY_CONNECTOR(config, FD1797_TAG":0", tiki100_floppies, "525qd", tiki100_state::floppy_formats);
+ FLOPPY_CONNECTOR(config, FD1797_TAG":1", tiki100_floppies, "525qd", tiki100_state::floppy_formats);
rs232_port_device &rs232a(RS232_PORT(config, RS232_A_TAG, default_rs232_devices, nullptr));
rs232a.rxd_handler().set(m_dart, FUNC(z80dart_device::rxa_w));
@@ -765,12 +766,14 @@ MACHINE_CONFIG_START(tiki100_state::tiki100)
m_centronics->perror_handler().set(FUNC(tiki100_state::write_centronics_perror));
INPUT_BUFFER(config, "cent_data_in");
- MCFG_CENTRONICS_OUTPUT_LATCH_ADD("cent_data_out", CENTRONICS_TAG)
- MCFG_CASSETTE_ADD(CASSETTE_TAG)
- MCFG_CASSETTE_DEFAULT_STATE(CASSETTE_STOPPED | CASSETTE_MOTOR_DISABLED | CASSETTE_SPEAKER_MUTED)
+ output_latch_device &cent_data_out(OUTPUT_LATCH(config, "cent_data_out"));
+ m_centronics->set_output_latch(cent_data_out);
+
+ CASSETTE(config, m_cassette);
+ m_cassette->set_default_state(CASSETTE_STOPPED | CASSETTE_MOTOR_DISABLED | CASSETTE_SPEAKER_MUTED);
- MCFG_TIMER_DRIVER_ADD_PERIODIC("tape", tiki100_state, tape_tick, attotime::from_hz(44100))
+ TIMER(config, "tape").configure_periodic(FUNC(tiki100_state::tape_tick), attotime::from_hz(44100));
/* sound hardware */
SPEAKER(config, "mono").front_center();
@@ -783,8 +786,8 @@ MACHINE_CONFIG_START(tiki100_state::tiki100)
RAM(config, RAM_TAG).set_default_size("64K");
// software list
- MCFG_SOFTWARE_LIST_ADD("flop_list", "tiki100")
-MACHINE_CONFIG_END
+ SOFTWARE_LIST(config, "flop_list").set_original("tiki100");
+}
/* ROMs */
diff --git a/src/mame/drivers/tim011.cpp b/src/mame/drivers/tim011.cpp
index 2891f818130..ebbaae170b2 100644
--- a/src/mame/drivers/tim011.cpp
+++ b/src/mame/drivers/tim011.cpp
@@ -132,36 +132,37 @@ static const floppy_format_type tim011_floppy_formats[] = {
nullptr
};
-MACHINE_CONFIG_START(tim011_state::tim011)
+void tim011_state::tim011(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu",Z180, XTAL(12'288'000) / 2) // location U17 HD64180
- MCFG_DEVICE_PROGRAM_MAP(tim011_mem)
- MCFG_DEVICE_IO_MAP(tim011_io)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", tim011_state, irq0_line_hold)
+ Z180(config, m_maincpu, XTAL(12'288'000) / 2); // location U17 HD64180
+ m_maincpu->set_addrmap(AS_PROGRAM, &tim011_state::tim011_mem);
+ m_maincpu->set_addrmap(AS_IO, &tim011_state::tim011_io);
+ m_maincpu->set_vblank_int("screen", FUNC(tim011_state::irq0_line_hold));
-// MCFG_DEVICE_ADD("keyboard",CDP1802, XTAL(1'750'000)) // CDP1802, unknown clock
+// CDP1802(config, "keyboard", XTAL(1'750'000)); // CDP1802, unknown clock
// FDC9266 location U43
UPD765A(config, m_fdc, XTAL(8'000'000), true, true);
m_fdc->intrq_wr_callback().set_inputline(m_maincpu, INPUT_LINE_IRQ2);
/* floppy drives */
- MCFG_FLOPPY_DRIVE_ADD(FDC9266_TAG ":0", tim011_floppies, "35dd", tim011_floppy_formats)
- MCFG_FLOPPY_DRIVE_ADD(FDC9266_TAG ":1", tim011_floppies, "35dd", tim011_floppy_formats)
- MCFG_FLOPPY_DRIVE_ADD(FDC9266_TAG ":2", tim011_floppies, "35dd", tim011_floppy_formats)
- MCFG_FLOPPY_DRIVE_ADD(FDC9266_TAG ":3", tim011_floppies, "35dd", tim011_floppy_formats)
+ FLOPPY_CONNECTOR(config, FDC9266_TAG ":0", tim011_floppies, "35dd", tim011_floppy_formats);
+ FLOPPY_CONNECTOR(config, FDC9266_TAG ":1", tim011_floppies, "35dd", tim011_floppy_formats);
+ FLOPPY_CONNECTOR(config, FDC9266_TAG ":2", tim011_floppies, "35dd", tim011_floppy_formats);
+ FLOPPY_CONNECTOR(config, FDC9266_TAG ":3", tim011_floppies, "35dd", tim011_floppy_formats);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(50)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */
- MCFG_SCREEN_SIZE(512, 256)
- MCFG_SCREEN_VISIBLE_AREA(0, 512-1, 0, 256-1)
- MCFG_SCREEN_UPDATE_DRIVER(tim011_state, screen_update_tim011)
- MCFG_SCREEN_PALETTE("palette")
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(50);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */
+ screen.set_size(512, 256);
+ screen.set_visarea(0, 512-1, 0, 256-1);
+ screen.set_screen_update(FUNC(tim011_state::screen_update_tim011));
+ screen.set_palette("palette");
PALETTE(config, "palette", palette_device::MONOCHROME);
-MACHINE_CONFIG_END
+}
/* ROM definition */
ROM_START( tim011 )
diff --git a/src/mame/drivers/tim100.cpp b/src/mame/drivers/tim100.cpp
index c58bee08df5..22717a5374f 100644
--- a/src/mame/drivers/tim100.cpp
+++ b/src/mame/drivers/tim100.cpp
@@ -161,30 +161,31 @@ WRITE_LINE_MEMBER( tim100_state::irq_w )
}
-MACHINE_CONFIG_START(tim100_state::tim100)
+void tim100_state::tim100(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu",I8085A, XTAL(4'915'200)) // divider unknown
- MCFG_DEVICE_PROGRAM_MAP(tim100_mem)
- MCFG_DEVICE_IO_MAP(tim100_io)
+ I8085A(config, m_maincpu, XTAL(4'915'200)); // divider unknown
+ m_maincpu->set_addrmap(AS_PROGRAM, &tim100_state::tim100_mem);
+ m_maincpu->set_addrmap(AS_IO, &tim100_state::tim100_io);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_UPDATE_DEVICE("crtc", i8276_device, screen_update)
- MCFG_SCREEN_REFRESH_RATE(50)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */
- MCFG_SCREEN_SIZE(600, 352)
- MCFG_SCREEN_VISIBLE_AREA(0, 40*12-1, 0, 16*16-1)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_screen_update("crtc", FUNC(i8276_device::screen_update));
+ screen.set_refresh_hz(50);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */
+ screen.set_size(600, 352);
+ screen.set_visarea(0, 40*12-1, 0, 16*16-1);
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_tim100 )
+ GFXDECODE(config, "gfxdecode", m_palette, gfx_tim100);
- MCFG_DEVICE_ADD("crtc", I8276, XTAL(4'915'200))
- MCFG_I8275_CHARACTER_WIDTH(12)
- MCFG_I8275_DRAW_CHARACTER_CALLBACK_OWNER(tim100_state, crtc_display_pixels)
- MCFG_I8275_DRQ_CALLBACK(WRITELINE(*this, tim100_state, drq_w))
- MCFG_I8275_IRQ_CALLBACK(WRITELINE(*this, tim100_state, irq_w))
- MCFG_VIDEO_SET_SCREEN("screen")
+ I8276(config, m_crtc, XTAL(4'915'200));
+ m_crtc->set_character_width(12);
+ m_crtc->set_display_callback(FUNC(tim100_state::crtc_display_pixels), this);
+ m_crtc->drq_wr_callback().set(FUNC(tim100_state::drq_w));
+ m_crtc->irq_wr_callback().set(FUNC(tim100_state::irq_w));
+ m_crtc->set_screen("screen");
- MCFG_PALETTE_ADD("palette", 3)
+ PALETTE(config, m_palette).set_entries(3);
i8251_device &uart_u17(I8251(config, "uart_u17", 0));
uart_u17.txd_handler().set("rs232", FUNC(rs232_port_device::write_txd));
@@ -213,7 +214,7 @@ MACHINE_CONFIG_START(tim100_state::tim100)
uart_clock.signal_handler().append("uart_u17", FUNC(i8251_device::write_rxc));
uart_clock.signal_handler().append("uart_u18", FUNC(i8251_device::write_txc));
uart_clock.signal_handler().append("uart_u18", FUNC(i8251_device::write_rxc));
-MACHINE_CONFIG_END
+}
/* ROM definition */
ROM_START( tim100 )
diff --git a/src/mame/drivers/timelimt.cpp b/src/mame/drivers/timelimt.cpp
index ba8b3d1e1c6..c6593f263c0 100644
--- a/src/mame/drivers/timelimt.cpp
+++ b/src/mame/drivers/timelimt.cpp
@@ -222,20 +222,20 @@ INTERRUPT_GEN_MEMBER(timelimt_state::irq)
/***************************************************************************/
-MACHINE_CONFIG_START(timelimt_state::timelimt)
-
+void timelimt_state::timelimt(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, 5000000) /* 5.000 MHz */
- MCFG_DEVICE_PROGRAM_MAP(main_map)
- MCFG_DEVICE_IO_MAP(main_io_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", timelimt_state, irq)
+ Z80(config, m_maincpu, 5000000); /* 5.000 MHz */
+ m_maincpu->set_addrmap(AS_PROGRAM, &timelimt_state::main_map);
+ m_maincpu->set_addrmap(AS_IO, &timelimt_state::main_io_map);
+ m_maincpu->set_vblank_int("screen", FUNC(timelimt_state::irq));
- MCFG_DEVICE_ADD("audiocpu", Z80,18432000/6) /* 3.072 MHz */
- MCFG_DEVICE_PROGRAM_MAP(sound_map)
- MCFG_DEVICE_IO_MAP(sound_io_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", timelimt_state, irq0_line_hold) /* ? */
+ Z80(config, m_audiocpu, 18432000/6); /* 3.072 MHz */
+ m_audiocpu->set_addrmap(AS_PROGRAM, &timelimt_state::sound_map);
+ m_audiocpu->set_addrmap(AS_IO, &timelimt_state::sound_io_map);
+ m_audiocpu->set_vblank_int("screen", FUNC(timelimt_state::irq0_line_hold)); /* ? */
- MCFG_QUANTUM_TIME(attotime::from_hz(3000))
+ config.m_minimum_quantum = attotime::from_hz(3000);
ls259_device &mainlatch(LS259(config, "mainlatch")); // IC15
mainlatch.q_out_cb<0>().set(FUNC(timelimt_state::nmi_enable_w));
@@ -247,13 +247,13 @@ MACHINE_CONFIG_START(timelimt_state::timelimt)
WATCHDOG_TIMER(config, "watchdog");
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(32*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(timelimt_state, screen_update)
- MCFG_SCREEN_PALETTE(m_palette)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(32*8, 32*8);
+ screen.set_visarea(0*8, 32*8-1, 2*8, 30*8-1);
+ screen.set_screen_update(FUNC(timelimt_state::screen_update));
+ screen.set_palette(m_palette);
GFXDECODE(config, m_gfxdecode, m_palette, gfx_timelimt);
PALETTE(config, m_palette, FUNC(timelimt_state::timelimt_palette), 64+32);
@@ -268,7 +268,7 @@ MACHINE_CONFIG_START(timelimt_state::timelimt)
ay8910_device &ay2(AY8910(config, "ay2", 18432000/12));
ay2.port_a_read_callback().set("soundlatch", FUNC(generic_latch_8_device::read));
ay2.add_route(ALL_OUTPUTS, "mono", 0.25);
-MACHINE_CONFIG_END
+}
/***************************************************************************
diff --git a/src/mame/drivers/timetrv.cpp b/src/mame/drivers/timetrv.cpp
index fcba7d7649e..dda61157b56 100644
--- a/src/mame/drivers/timetrv.cpp
+++ b/src/mame/drivers/timetrv.cpp
@@ -141,12 +141,12 @@ static INPUT_PORTS_START( timetrv )
// 0x80 eeprom read bit
INPUT_PORTS_END
-MACHINE_CONFIG_START(timetrv_state::timetrv)
-
+void timetrv_state::timetrv(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu",I80188,20000000) //???
- MCFG_DEVICE_PROGRAM_MAP(timetrv_map)
- MCFG_DEVICE_IO_MAP(timetrv_io)
+ I80188(config, m_maincpu, 20000000); //???
+ m_maincpu->set_addrmap(AS_PROGRAM, &timetrv_state::timetrv_map);
+ m_maincpu->set_addrmap(AS_IO, &timetrv_state::timetrv_io);
// interrupts are generated by internally-driven timers
EEPROM_2816(config, "eeprom");
@@ -160,20 +160,20 @@ MACHINE_CONFIG_START(timetrv_state::timetrv)
ppi2.in_pb_callback().set(FUNC(timetrv_state::in_r)); //dsw
ppi2.in_pc_callback().set(FUNC(timetrv_state::in_r)); //dsw
- MCFG_DEVICE_ADD("uart", NS16450, 1843200) // P82050 (serial interface for laserdisc)
+ NS16450(config, "uart", 1843200); // P82050 (serial interface for laserdisc)
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(512, 512)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 512-1, 0*8, 512-1)
- MCFG_SCREEN_UPDATE_DRIVER(timetrv_state, screen_update_timetrv)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(512, 512);
+ screen.set_visarea(0*8, 512-1, 0*8, 512-1);
+ screen.set_screen_update(FUNC(timetrv_state::screen_update_timetrv));
- MCFG_PALETTE_ADD("palette", 512)
+ PALETTE(config, "palette").set_entries(512);
/* sound hardware */
-MACHINE_CONFIG_END
+}
/***************************************************************************
diff --git a/src/mame/drivers/timex.cpp b/src/mame/drivers/timex.cpp
index 18386314adb..561c41193b0 100644
--- a/src/mame/drivers/timex.cpp
+++ b/src/mame/drivers/timex.cpp
@@ -583,12 +583,6 @@ void spectrum_state::tc2048_mem(address_map &map)
map(0x4000, 0xffff).bankr("bank1").bankw("bank2");
}
-void spectrum_state::init_timex()
-{
- // setup expansion slot
- m_exp->set_io_space(&m_maincpu->space(AS_IO));
-}
-
MACHINE_RESET_MEMBER(spectrum_state,tc2048)
{
uint8_t *messram = m_ram->pointer();
@@ -694,23 +688,23 @@ GFXDECODE_END
MACHINE_CONFIG_START(spectrum_state::ts2068)
spectrum_128(config);
- MCFG_DEVICE_REPLACE("maincpu", Z80, XTAL(14'112'000)/4) /* From Schematic; 3.528 MHz */
- MCFG_DEVICE_PROGRAM_MAP(ts2068_mem)
- MCFG_DEVICE_IO_MAP(ts2068_io)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", spectrum_state, spec_interrupt)
- MCFG_QUANTUM_TIME(attotime::from_hz(60))
+
+ Z80(config.replace(), m_maincpu, XTAL(14'112'000)/4); /* From Schematic; 3.528 MHz */
+ m_maincpu->set_addrmap(AS_PROGRAM, &spectrum_state::ts2068_mem);
+ m_maincpu->set_addrmap(AS_IO, &spectrum_state::ts2068_io);
+ m_maincpu->set_vblank_int("screen", FUNC(spectrum_state::spec_interrupt));
+ config.m_minimum_quantum = attotime::from_hz(60);
MCFG_MACHINE_RESET_OVERRIDE(spectrum_state, ts2068 )
/* video hardware */
- MCFG_SCREEN_MODIFY("screen")
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_SIZE(TS2068_SCREEN_WIDTH, TS2068_SCREEN_HEIGHT)
- MCFG_SCREEN_VISIBLE_AREA(0, TS2068_SCREEN_WIDTH-1, 0, TS2068_SCREEN_HEIGHT-1)
- MCFG_SCREEN_UPDATE_DRIVER(spectrum_state, screen_update_ts2068)
- MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE(*this, spectrum_state, screen_vblank_timex))
+ m_screen->set_refresh_hz(60);
+ m_screen->set_size(TS2068_SCREEN_WIDTH, TS2068_SCREEN_HEIGHT);
+ m_screen->set_visarea(0, TS2068_SCREEN_WIDTH-1, 0, TS2068_SCREEN_HEIGHT-1);
+ m_screen->set_screen_update(FUNC(spectrum_state::screen_update_ts2068));
+ m_screen->screen_vblank().set(FUNC(spectrum_state::screen_vblank_timex));
- MCFG_GFXDECODE_MODIFY("gfxdecode", gfx_ts2068)
+ subdevice<gfxdecode_device>("gfxdecode")->set_info(gfx_ts2068);
MCFG_VIDEO_START_OVERRIDE(spectrum_state, ts2068 )
@@ -723,41 +717,40 @@ MACHINE_CONFIG_START(spectrum_state::ts2068)
MCFG_GENERIC_LOAD(spectrum_state, timex_cart)
/* Software lists */
- MCFG_SOFTWARE_LIST_ADD("cart_list", "timex_dock")
+ SOFTWARE_LIST(config, "cart_list").set_original("timex_dock");
/* internal ram */
m_ram->set_default_size("48K");
MACHINE_CONFIG_END
-MACHINE_CONFIG_START(spectrum_state::uk2086)
+void spectrum_state::uk2086(machine_config &config)
+{
ts2068(config);
- MCFG_SCREEN_MODIFY("screen")
- MCFG_SCREEN_REFRESH_RATE(50)
-MACHINE_CONFIG_END
+ m_screen->set_refresh_hz(50);
+}
-MACHINE_CONFIG_START(spectrum_state::tc2048)
+void spectrum_state::tc2048(machine_config &config)
+{
spectrum(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(tc2048_mem)
- MCFG_DEVICE_IO_MAP(tc2048_io)
+ m_maincpu->set_addrmap(AS_PROGRAM, &spectrum_state::tc2048_mem);
+ m_maincpu->set_addrmap(AS_IO, &spectrum_state::tc2048_io);
MCFG_MACHINE_RESET_OVERRIDE(spectrum_state, tc2048 )
/* video hardware */
- MCFG_SCREEN_MODIFY("screen")
- MCFG_SCREEN_REFRESH_RATE(50)
- MCFG_SCREEN_SIZE(TS2068_SCREEN_WIDTH, SPEC_SCREEN_HEIGHT)
- MCFG_SCREEN_VISIBLE_AREA(0, TS2068_SCREEN_WIDTH-1, 0, SPEC_SCREEN_HEIGHT-1)
- MCFG_SCREEN_UPDATE_DRIVER(spectrum_state, screen_update_tc2048)
- MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE(*this, spectrum_state, screen_vblank_timex))
+ m_screen->set_refresh_hz(50);
+ m_screen->set_size(TS2068_SCREEN_WIDTH, SPEC_SCREEN_HEIGHT);
+ m_screen->set_visarea(0, TS2068_SCREEN_WIDTH-1, 0, SPEC_SCREEN_HEIGHT-1);
+ m_screen->set_screen_update(FUNC(spectrum_state::screen_update_tc2048));
+ m_screen->screen_vblank().set(FUNC(spectrum_state::screen_vblank_timex));
MCFG_VIDEO_START_OVERRIDE(spectrum_state, spectrum_128 )
/* internal ram */
m_ram->set_default_size("48K");
-MACHINE_CONFIG_END
+}
@@ -785,6 +778,6 @@ ROM_START(uk2086)
ROM_END
// YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS
-COMP( 1984, tc2048, spectrum, 0, tc2048, spectrum, spectrum_state, init_timex, "Timex of Portugal", "TC-2048" , 0 )
-COMP( 1983, ts2068, spectrum, 0, ts2068, spectrum, spectrum_state, init_timex, "Timex Sinclair", "TS-2068" , 0 )
-COMP( 1986, uk2086, spectrum, 0, uk2086, spectrum, spectrum_state, init_timex, "Unipolbrit", "UK-2086 ver. 1.2" , 0 )
+COMP( 1984, tc2048, spectrum, 0, tc2048, spectrum, spectrum_state, empty_init, "Timex of Portugal", "TC-2048" , 0 )
+COMP( 1983, ts2068, spectrum, 0, ts2068, spectrum, spectrum_state, empty_init, "Timex Sinclair", "TS-2068" , 0 )
+COMP( 1986, uk2086, spectrum, 0, uk2086, spectrum, spectrum_state, empty_init, "Unipolbrit", "UK-2086 ver. 1.2" , 0 )
diff --git a/src/mame/drivers/tispeak.cpp b/src/mame/drivers/tispeak.cpp
index 4ef220d27fa..ca5be1e1769 100644
--- a/src/mame/drivers/tispeak.cpp
+++ b/src/mame/drivers/tispeak.cpp
@@ -243,68 +243,70 @@ Touch & Tell modules:
Touch & Tell/Vocaid overlay reference:
tntell CD2610:
- - 04: a - Colors
- - 01: b - Objects
- - 05: c - Shapes
- - 09: d - Home Scene
+ - $04: a - Colors
+ - $01: b - Objects
+ - $05: c - Shapes
+ - $09: d - Home Scene
tntelluk CD62170, tntellfr CD62171:
- see tntell
- see numfun(not A)
- see animalfr
- - 08: ? - Clown Face
- - 0B: ? - Body Parts
+ - $08: ? - Clown Face
+ - $0B: ? - Body Parts
vocaid CD2357:
- - 1C: 1 - Leisure
- - 1E: 2 - Telephone
- - 1B: 3 - Bedside
- - 1D: 4 - Alphabet
+ - $1C: 1 - Leisure
+ - $1E: 2 - Telephone
+ - $1B: 3 - Bedside
+ - $1D: 4 - Alphabet
alphabet CD2611:
- - 0E: 1a - Alphabet A-M
- - 0D: 1b - Alphabet N-Z
- - 0C: 1c - Letter Jumble A-M
- - 0B: 1d - Letter Jumble N-Z
+ - $0E: 1a - Alphabet A-M
+ - $0D: 1b - Alphabet N-Z
+ - $0C: 1c - Letter Jumble A-M
+ - $0B: 1d - Letter Jumble N-Z
animalfr CD2355:
- - 0A: 2a - Farm Animals
- - 0F: 2b - At The Farm
- - 0E: 2c - Animal Babies
- - 0D: 2d - In The Jungle
+ - $0A: 2a - Farm Animals
+ - $0F: 2b - At The Farm
+ - $0E: 2c - Animal Babies
+ - $0D: 2d - In The Jungle
numfun CD2612:
- - 02/0A(rev.A): 3a - Numbers 1-10
- - 03/0F(rev.A): 3b - Numbers 11-30
- - 07/0D(rev.A): 3c - How Many?
- - 06/0E(rev.A): 3d - Hidden Numbers
+ - $02/$0A(rev.A): 3a - Numbers 1-10
+ - $03/$0F(rev.A): 3b - Numbers 11-30
+ - $07/$0D(rev.A): 3c - How Many?
+ - $06/$0E(rev.A): 3d - Hidden Numbers
aboutme CD2613:
- - 0E: 4a - Clown Face
- - 0B: 4b - Body Parts
- - 0D: 4c - Things to Wear
- - 0C: 4d - Just For Me
+ - $0E: 4a - Clown Face
+ - $0B: 4b - Body Parts
+ - $0D: 4c - Things to Wear
+ - $0C: 4d - Just For Me
wot CD2361:
- - 0A: 5a - On Land
- - 0B: 5b - In The Air
- - 0C: 5c - On The Water
- - 0D: 5d - In Space
- - 10: 5e - What Belongs Here?
- - 11: 5f - How It Used To Be
- - 12: 5g - Word Fun
- - 13: 5h - In the Surprise Garage
+ - $0A: 5a - On Land
+ - $0B: 5b - In The Air
+ - $0C: 5c - On The Water
+ - $0D: 5d - In Space
+ - $10: 5e - What Belongs Here?
+ - $11: 5f - How It Used To Be
+ - $12: 5g - Word Fun
+ - $13: 5h - In the Surprise Garage
lilcreat CD2362:
- - 14: 6a - In The Park
- - 15: 6b - In The Sea
- - 16: 6c - In The Woods
- - 17: 6d - Whose House?
- - 18: 6e - Hide & Seek
- - 1A: 6f - Who Is It?
- - 19: 6g - But It's Not
- - 1B: 6h - Word Fun
+ - $14: 6a - In The Park
+ - $15: 6b - In The Sea
+ - $16: 6c - In The Woods
+ - $17: 6d - Whose House?
+ - $18: 6e - Hide & Seek
+ - $1A: 6f - Who Is It?
+ - $19: 6g - But It's Not
+ - $1B: 6h - Word Fun
et CD2363:
- - 0F: 7a - The Adventure On Earth I
- - 10: 7b - The Adventure On Earth II
- - 11: 7c - Fun And Friendship I
- - 12: 7d - Fun And Friendship II
- - 13: 7e - E.T. The Star I
- - 14: 7f - E.T. The Star II
- - 15: 7g - Do You Remember? I
- - 16: 7h - Do You Remember? II
+ - $0F: 7a - The Adventure On Earth I
+ - $10: 7b - The Adventure On Earth II
+ - $11: 7c - Fun And Friendship I
+ - $12: 7d - Fun And Friendship II
+ - $13: 7e - E.T. The Star I
+ - $14: 7f - E.T. The Star II
+ - $15: 7g - Do You Remember? I
+ - $16: 7h - Do You Remember? II
+
+ $00: none inserted, and $1F is for diagnostics
Magic Wand "Speaking Reader" or "Speak & Learn":
@@ -372,7 +374,7 @@ keyboard, VFD display, and use the SC-01 speech chip. --> driver k28.cpp
- MCU: TMS1400 MP7324
- TMS51xx: TMS5110A
- VSM: 16KB CM62084
- - LCD: unknown 8*16-seg
+ - LCD: SMOS SMC1112 MCU to 8*14-seg display
K28 modules:
@@ -392,7 +394,7 @@ K28 modules:
TODO:
- why doesn't lantutor work?
- - identify and emulate k28 LCD
+ - emulate k28 LCD
- emulate other known devices
@@ -405,9 +407,9 @@ K28 modules:
#include "bus/generic/slot.h"
#include "machine/tms6100.h"
#include "sound/tms5110.h"
-
#include "softlist.h"
#include "speaker.h"
+#include "render.h"
// internal artwork
#include "k28m2.lh"
@@ -482,6 +484,7 @@ private:
DECLARE_DEVICE_IMAGE_LOAD_MEMBER(tispeak_cartridge);
+ u8 tntell_get_hexchar(const char c);
TIMER_DEVICE_CALLBACK_MEMBER(tntell_get_overlay);
void init_cartridge();
@@ -497,7 +500,7 @@ private:
// cartridge
u32 m_cart_max_size;
- u8* m_cart_base;
+ u8 *m_cart_base;
u8 m_overlay;
};
@@ -662,6 +665,7 @@ WRITE16_MEMBER(tispeak_state::snspellc_write_o)
{
// O3210: TMS5100 CTL8124
m_tms5100->ctl_w(space, 0, bitswap<4>(data,3,0,1,2));
+ m_o = data;
}
READ8_MEMBER(tispeak_state::snspellc_read_k)
@@ -685,19 +689,40 @@ READ8_MEMBER(tispeak_state::tntell_read_k)
return k8 | snspellc_read_k(space, offset);
}
+u8 tispeak_state::tntell_get_hexchar(const char c)
+{
+ if (c >= '0' && c <= '9') return c - '0';
+ if (c >= 'A' && c <= 'F') return c - 'A' + 10;
+ if (c >= 'a' && c <= 'f') return c - 'a' + 10;
+
+ return 0;
+}
+
TIMER_DEVICE_CALLBACK_MEMBER(tispeak_state::tntell_get_overlay)
{
// Each keyboard overlay insert has 5 holes, used by the game to determine
// which one is active(if any). If it matches with the internal ROM or
// external module, the game continues.
- // 00 for none, 1F for diagnostics, see comment section above for a list
- // try to get overlay code from artwork file(in decimal), otherwise pick the
- // one that was selected in machine configuration
- m_overlay = output().get_value("overlay_code") & 0x1f;
- if (m_overlay == 0)
- m_overlay = m_inp_matrix[10]->read();
+ // pick overlay code from machine config, see comment section above for reference
+ m_overlay = m_inp_matrix[10]->read();
+
+ // try to get it from (external) layout
+ if (m_overlay == 0x20)
+ {
+ // as output value, eg. with defstate (in decimal)
+ m_overlay = output().get_value("overlay_code") & 0x1f;
+
+ // and from current view name ($ + 2 hex digits)
+ render_target *target = machine().render().first_target();
+ const char *name = target->view_name(target->view());
+
+ for (int i = 0; name && i < strlen(name); i++)
+ if (name[i] == '$' && strlen(&name[i]) > 2)
+ m_overlay = (tntell_get_hexchar(name[i + 1]) << 4 | tntell_get_hexchar(name[i + 2])) & 0x1f;
+ }
+ // overlay holes
for (int i = 0; i < 5; i++)
m_ol_out[i] = BIT(m_overlay, i);
}
@@ -713,7 +738,8 @@ void tispeak_state::k28_prepare_display(u8 old, u8 data)
WRITE16_MEMBER(tispeak_state::k28_write_r)
{
// R1234: TMS5100 CTL8421
- m_tms5100->ctl_w(space, 0, bitswap<4>(data,1,2,3,4));
+ u16 r = bitswap<5>(data,0,1,2,3,4) | (data & ~0x1f);
+ m_tms5100->ctl_w(space, 0, r & 0xf);
// R0: TMS5100 PDC pin
m_tms5100->pdc_w(data & 1);
@@ -727,7 +753,7 @@ WRITE16_MEMBER(tispeak_state::k28_write_r)
// R7-R10: LCD data
k28_prepare_display(m_r >> 7 & 0xf, data >> 7 & 0xf);
- m_r = data;
+ m_r = r;
}
WRITE16_MEMBER(tispeak_state::k28_write_o)
@@ -738,8 +764,8 @@ WRITE16_MEMBER(tispeak_state::k28_write_o)
READ8_MEMBER(tispeak_state::k28_read_k)
{
- // K: TMS5100 CTL, multiplexed inputs
- return m_tms5100->ctl_r(space, 0) | read_inputs(9);
+ // K: TMS5100 CTL, multiplexed inputs (also tied to R1234)
+ return m_tms5100->ctl_r(space, 0) | read_inputs(9) | (m_r & 0xf);
}
@@ -821,7 +847,7 @@ static INPUT_PORTS_START( snspell )
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_6) PORT_NAME("Secret Code")
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_7) PORT_NAME("Letter")
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_8) PORT_NAME("Say It")
- PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_PGUP) PORT_NAME("Spell/On") PORT_CHANGED_MEMBER(DEVICE_SELF, tispeak_state, power_button, (void *)true)
+ PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_PGUP) PORT_NAME("Spell/On") PORT_CHANGED_MEMBER(DEVICE_SELF, tispeak_state, power_button, true)
INPUT_PORTS_END
static INPUT_PORTS_START( snspellfr ) // French button names
@@ -844,7 +870,7 @@ static INPUT_PORTS_START( snspellfr ) // French button names
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_6) PORT_NAME("Code Secret")
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_7) PORT_NAME("Lettre")
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_8) PORT_NAME("Dis-le")
- PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_PGUP) PORT_NAME("Epelle/Marche") PORT_CHANGED_MEMBER(DEVICE_SELF, tispeak_state, power_button, (void *)true)
+ PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_PGUP) PORT_NAME("Epelle/Marche") PORT_CHANGED_MEMBER(DEVICE_SELF, tispeak_state, power_button, true)
INPUT_PORTS_END
static INPUT_PORTS_START( snspellit ) // Italian button names
@@ -867,7 +893,7 @@ static INPUT_PORTS_START( snspellit ) // Italian button names
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_6) PORT_NAME("Codice")
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_7) PORT_NAME("Alfabeto")
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_8) PORT_NAME("Ripeti")
- PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_PGUP) PORT_NAME("Scrivi") PORT_CHANGED_MEMBER(DEVICE_SELF, tispeak_state, power_button, (void *)true)
+ PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_PGUP) PORT_NAME("Scrivi") PORT_CHANGED_MEMBER(DEVICE_SELF, tispeak_state, power_button, true)
INPUT_PORTS_END
static INPUT_PORTS_START( snspellsp ) // Spanish button names, different alphabet
@@ -928,7 +954,7 @@ static INPUT_PORTS_START( snspellsp ) // Spanish button names, different alphabe
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_6) PORT_NAME("Palabra Secreta")
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_7) PORT_NAME("Dilo")
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_PGDN) PORT_NAME("Off") // -> auto_power_off
- PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_PGUP) PORT_NAME("Deletrea/On") PORT_CHANGED_MEMBER(DEVICE_SELF, tispeak_state, power_button, (void *)true)
+ PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_PGUP) PORT_NAME("Deletrea/On") PORT_CHANGED_MEMBER(DEVICE_SELF, tispeak_state, power_button, true)
INPUT_PORTS_END
@@ -980,7 +1006,7 @@ static INPUT_PORTS_START( snmath )
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_U) PORT_NAME("Write It")
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_Y) PORT_NAME("Greater/Less")
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_T) PORT_NAME("Word Problems")
- PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_R) PORT_CODE(KEYCODE_PGUP) PORT_NAME("Solve It/On") PORT_CHANGED_MEMBER(DEVICE_SELF, tispeak_state, power_button, (void *)true)
+ PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_R) PORT_CODE(KEYCODE_PGUP) PORT_NAME("Solve It/On") PORT_CHANGED_MEMBER(DEVICE_SELF, tispeak_state, power_button, true)
PORT_START("IN.7")
PORT_BIT( 0x1f, IP_ACTIVE_HIGH, IPT_UNUSED )
@@ -1002,7 +1028,7 @@ static INPUT_PORTS_START( snread )
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_6) PORT_NAME("Picture Read")
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_7) PORT_NAME("Letter Stumper")
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_8) PORT_NAME("Hear It")
- PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_PGUP) PORT_NAME("Word Zap/On") PORT_CHANGED_MEMBER(DEVICE_SELF, tispeak_state, power_button, (void *)true)
+ PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_PGUP) PORT_NAME("Word Zap/On") PORT_CHANGED_MEMBER(DEVICE_SELF, tispeak_state, power_button, true)
INPUT_PORTS_END
@@ -1092,7 +1118,7 @@ static INPUT_PORTS_START( snspellc )
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_QUOTE) PORT_CHAR('\'')
PORT_START("IN.9") // Vss!
- PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_PGUP) PORT_NAME("Spell/On") PORT_CHANGED_MEMBER(DEVICE_SELF, tispeak_state, power_button, (void *)true)
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_PGUP) PORT_NAME("Spell/On") PORT_CHANGED_MEMBER(DEVICE_SELF, tispeak_state, power_button, true)
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNUSED )
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_CUSTOM ) // speech chip data
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_PGDN) PORT_NAME("Off") // -> auto_power_off
@@ -1102,7 +1128,7 @@ static INPUT_PORTS_START( snspellcuk )
PORT_INCLUDE( snspellc )
PORT_MODIFY("IN.9")
- PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_PGUP) PORT_NAME("Write/On") PORT_CHANGED_MEMBER(DEVICE_SELF, tispeak_state, power_button, (void *)true) // just the label changed from Spell to Write
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_PGUP) PORT_NAME("Write/On") PORT_CHANGED_MEMBER(DEVICE_SELF, tispeak_state, power_button, true) // just the label changed from Spell to Write
INPUT_PORTS_END
@@ -1163,44 +1189,45 @@ static INPUT_PORTS_START( tntell )
PORT_START("IN.9") // Vss!
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED )
- PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_STOP) PORT_CODE(KEYCODE_PGUP) PORT_NAME("Grid 6-6 (On)") PORT_CHANGED_MEMBER(DEVICE_SELF, tispeak_state, power_button, (void *)true)
+ PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_STOP) PORT_CODE(KEYCODE_PGUP) PORT_NAME("Grid 6-6 (On)") PORT_CHANGED_MEMBER(DEVICE_SELF, tispeak_state, power_button, true)
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_CUSTOM ) // speech chip data
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED )
PORT_START("IN.10")
- PORT_CONFNAME( 0x1f, 0x04, "Overlay Code" ) // only if not provided by external artwork
- PORT_CONFSETTING( 0x00, "00 (None)" )
- PORT_CONFSETTING( 0x01, "01" )
- PORT_CONFSETTING( 0x02, "02" )
- PORT_CONFSETTING( 0x03, "03" )
- PORT_CONFSETTING( 0x04, "04" )
- PORT_CONFSETTING( 0x05, "05" )
- PORT_CONFSETTING( 0x06, "06" )
- PORT_CONFSETTING( 0x07, "07" )
- PORT_CONFSETTING( 0x08, "08" )
- PORT_CONFSETTING( 0x09, "09" )
- PORT_CONFSETTING( 0x0a, "0A" )
- PORT_CONFSETTING( 0x0b, "0B" )
- PORT_CONFSETTING( 0x0c, "0C" )
- PORT_CONFSETTING( 0x0d, "0D" )
- PORT_CONFSETTING( 0x0e, "0E" )
- PORT_CONFSETTING( 0x0f, "0F" )
- PORT_CONFSETTING( 0x10, "10" )
- PORT_CONFSETTING( 0x11, "11" )
- PORT_CONFSETTING( 0x12, "12" )
- PORT_CONFSETTING( 0x13, "13" )
- PORT_CONFSETTING( 0x14, "14" )
- PORT_CONFSETTING( 0x15, "15" )
- PORT_CONFSETTING( 0x16, "16" )
- PORT_CONFSETTING( 0x17, "17" )
- PORT_CONFSETTING( 0x18, "18" )
- PORT_CONFSETTING( 0x19, "19" )
- PORT_CONFSETTING( 0x1a, "1A" )
- PORT_CONFSETTING( 0x1b, "1B" )
- PORT_CONFSETTING( 0x1c, "1C" )
- PORT_CONFSETTING( 0x1d, "1D" )
- PORT_CONFSETTING( 0x1e, "1E" )
- PORT_CONFSETTING( 0x1f, "1F (Diagnostic)" )
+ PORT_CONFNAME( 0x3f, 0x20, "Overlay Code" )
+ PORT_CONFSETTING( 0x20, "From Artwork View" )
+ PORT_CONFSETTING( 0x00, "$00 (None)" )
+ PORT_CONFSETTING( 0x01, "$01" )
+ PORT_CONFSETTING( 0x02, "$02" )
+ PORT_CONFSETTING( 0x03, "$03" )
+ PORT_CONFSETTING( 0x04, "$04" )
+ PORT_CONFSETTING( 0x05, "$05" )
+ PORT_CONFSETTING( 0x06, "$06" )
+ PORT_CONFSETTING( 0x07, "$07" )
+ PORT_CONFSETTING( 0x08, "$08" )
+ PORT_CONFSETTING( 0x09, "$09" )
+ PORT_CONFSETTING( 0x0a, "$0A" )
+ PORT_CONFSETTING( 0x0b, "$0B" )
+ PORT_CONFSETTING( 0x0c, "$0C" )
+ PORT_CONFSETTING( 0x0d, "$0D" )
+ PORT_CONFSETTING( 0x0e, "$0E" )
+ PORT_CONFSETTING( 0x0f, "$0F" )
+ PORT_CONFSETTING( 0x10, "$10" )
+ PORT_CONFSETTING( 0x11, "$11" )
+ PORT_CONFSETTING( 0x12, "$12" )
+ PORT_CONFSETTING( 0x13, "$13" )
+ PORT_CONFSETTING( 0x14, "$14" )
+ PORT_CONFSETTING( 0x15, "$15" )
+ PORT_CONFSETTING( 0x16, "$16" )
+ PORT_CONFSETTING( 0x17, "$17" )
+ PORT_CONFSETTING( 0x18, "$18" )
+ PORT_CONFSETTING( 0x19, "$19" )
+ PORT_CONFSETTING( 0x1a, "$1A" )
+ PORT_CONFSETTING( 0x1b, "$1B" )
+ PORT_CONFSETTING( 0x1c, "$1C" )
+ PORT_CONFSETTING( 0x1d, "$1D" )
+ PORT_CONFSETTING( 0x1e, "$1E" )
+ PORT_CONFSETTING( 0x1f, "$1F (Diagnostic)" )
INPUT_PORTS_END
@@ -1212,7 +1239,7 @@ static INPUT_PORTS_START( k28m2 )
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_S) PORT_CHAR('S')
PORT_START("IN.1") // O1
- PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_PGUP) PORT_NAME("On") PORT_CHANGED_MEMBER(DEVICE_SELF, tispeak_state, power_button, (void *)true)
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_PGUP) PORT_NAME("On") PORT_CHANGED_MEMBER(DEVICE_SELF, tispeak_state, power_button, true)
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_B) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_CHAR('B') PORT_NAME("B/2")
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_K) PORT_CODE(KEYCODE_PLUS_PAD) PORT_CHAR('K') PORT_NAME("K/+")
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_T) PORT_CHAR('T')
@@ -1282,14 +1309,14 @@ void tispeak_state::tms5110_route(machine_config &config)
void tispeak_state::snmath(machine_config &config)
{
/* basic machine hardware */
- tms0270_cpu_device &tms(TMS0270(config, m_maincpu, MASTER_CLOCK/2));
- tms.k().set(FUNC(tispeak_state::snspell_read_k));
- tms.o().set(FUNC(tispeak_state::snmath_write_o));
- tms.r().set(FUNC(tispeak_state::snspell_write_r));
-
- tms.read_ctl().set("tms5100", FUNC(tms5110_device::ctl_r));
- tms.write_ctl().set("tms5100", FUNC(tms5110_device::ctl_w));
- tms.write_pdc().set("tms5100", FUNC(tms5110_device::pdc_w));
+ TMS0270(config, m_maincpu, MASTER_CLOCK/2);
+ m_maincpu->k().set(FUNC(tispeak_state::snspell_read_k));
+ m_maincpu->o().set(FUNC(tispeak_state::snmath_write_o));
+ m_maincpu->r().set(FUNC(tispeak_state::snspell_write_r));
+
+ m_maincpu->read_ctl().set("tms5100", FUNC(tms5110_device::ctl_r));
+ m_maincpu->write_ctl().set("tms5100", FUNC(tms5110_device::ctl_w));
+ m_maincpu->write_pdc().set("tms5100", FUNC(tms5110_device::pdc_w));
TIMER(config, "display_decay").configure_periodic(FUNC(hh_tms1k_state::display_decay_tick), attotime::from_msec(1));
config.set_default_layout(layout_snmath);
diff --git a/src/mame/drivers/tispellb.cpp b/src/mame/drivers/tispellb.cpp
index 837a253f775..e3bb082a2bd 100644
--- a/src/mame/drivers/tispellb.cpp
+++ b/src/mame/drivers/tispellb.cpp
@@ -69,8 +69,8 @@
class tispellb_state : public hh_tms1k_state
{
public:
- tispellb_state(const machine_config &mconfig, device_type type, const char *tag)
- : hh_tms1k_state(mconfig, type, tag),
+ tispellb_state(const machine_config &mconfig, device_type type, const char *tag) :
+ hh_tms1k_state(mconfig, type, tag),
m_subcpu(*this, "subcpu"),
m_tms6100(*this, "tms6100")
{ }
@@ -82,7 +82,7 @@ public:
private:
// devices
- optional_device<cpu_device> m_subcpu;
+ optional_device<tms1k_base_device> m_subcpu;
optional_device<tms6100_device> m_tms6100;
u8 m_rev1_ctl;
@@ -317,7 +317,7 @@ static INPUT_PORTS_START( spellb )
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_3) PORT_NAME("Missing Letter")
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_4) PORT_NAME("Mystery Word")
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_5) PORT_NAME("Scramble")
- PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_PGUP) PORT_NAME("Spelling B/On") PORT_CHANGED_MEMBER(DEVICE_SELF, tispellb_state, power_button, (void *)true)
+ PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_PGUP) PORT_NAME("Spelling B/On") PORT_CHANGED_MEMBER(DEVICE_SELF, tispellb_state, power_button, true)
PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_2) PORT_NAME("Starts With")
INPUT_PORTS_END
@@ -333,7 +333,7 @@ static INPUT_PORTS_START( mrchalgr )
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_3) PORT_NAME("Crazy Letters")
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_4) PORT_NAME("Letter Guesser")
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_5) PORT_NAME("Word Challenge")
- PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_PGUP) PORT_NAME("Mystery Word/On") PORT_CHANGED_MEMBER(DEVICE_SELF, tispellb_state, power_button, (void *)true)
+ PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_PGUP) PORT_NAME("Mystery Word/On") PORT_CHANGED_MEMBER(DEVICE_SELF, tispellb_state, power_button, true)
PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_2) PORT_NAME("Replay")
INPUT_PORTS_END
@@ -345,51 +345,50 @@ INPUT_PORTS_END
***************************************************************************/
-MACHINE_CONFIG_START(tispellb_state::rev1)
-
+void tispellb_state::rev1(machine_config &config)
+{
/* basic machine hardware */
- tms0270_cpu_device &tms(TMS0270(config, m_maincpu, 350000)); // approximation
- tms.k().set(FUNC(tispellb_state::main_read_k));
- tms.o().set(FUNC(tispellb_state::main_write_o));
- tms.r().set(FUNC(tispellb_state::main_write_r));
- tms.read_ctl().set(FUNC(tispellb_state::rev1_ctl_r));
- tms.write_ctl().set(FUNC(tispellb_state::rev1_ctl_w));
+ TMS0270(config, m_maincpu, 350000); // approximation
+ m_maincpu->k().set(FUNC(tispellb_state::main_read_k));
+ m_maincpu->o().set(FUNC(tispellb_state::main_write_o));
+ m_maincpu->r().set(FUNC(tispellb_state::main_write_r));
+ m_maincpu->read_ctl().set(FUNC(tispellb_state::rev1_ctl_r));
+ m_maincpu->write_ctl().set(FUNC(tispellb_state::rev1_ctl_w));
- tms1980_cpu_device &subcpu(TMS1980(config, m_subcpu, 350000)); // approximation
- subcpu.k().set(FUNC(tispellb_state::sub_read_k));
- subcpu.o().set(FUNC(tispellb_state::sub_write_o));
- subcpu.r().set(FUNC(tispellb_state::sub_write_r));
+ TMS1980(config, m_subcpu, 350000); // approximation
+ m_subcpu->k().set(FUNC(tispellb_state::sub_read_k));
+ m_subcpu->o().set(FUNC(tispellb_state::sub_write_o));
+ m_subcpu->r().set(FUNC(tispellb_state::sub_write_r));
- MCFG_QUANTUM_PERFECT_CPU("maincpu")
+ config.m_perfect_cpu_quantum = subtag("maincpu");
- MCFG_TIMER_DRIVER_ADD_PERIODIC("display_decay", hh_tms1k_state, display_decay_tick, attotime::from_msec(1))
+ TIMER(config, "display_decay").configure_periodic(FUNC(hh_tms1k_state::display_decay_tick), attotime::from_msec(1));
config.set_default_layout(layout_spellb);
/* no sound! */
-MACHINE_CONFIG_END
-
+}
-MACHINE_CONFIG_START(tispellb_state::rev2)
+void tispellb_state::rev2(machine_config &config)
+{
/* basic machine hardware */
- tms0270_cpu_device &tms(TMS0270(config, m_maincpu, 350000)); // approximation
- tms.k().set(FUNC(tispellb_state::main_read_k));
- tms.o().set(FUNC(tispellb_state::rev2_write_o));
- tms.r().set(FUNC(tispellb_state::rev2_write_r));
- tms.read_ctl().set(m_tms6100, FUNC(tms6100_device::data_r));
- tms.write_ctl().set(m_tms6100, FUNC(tms6100_device::add_w));
+ TMS0270(config, m_maincpu, 350000); // approximation
+ m_maincpu->k().set(FUNC(tispellb_state::main_read_k));
+ m_maincpu->o().set(FUNC(tispellb_state::rev2_write_o));
+ m_maincpu->r().set(FUNC(tispellb_state::rev2_write_r));
+ m_maincpu->read_ctl().set(m_tms6100, FUNC(tms6100_device::data_r));
+ m_maincpu->write_ctl().set(m_tms6100, FUNC(tms6100_device::add_w));
TMS6100(config, m_tms6100, 350000);
m_tms6100->enable_4bit_mode(true);
- MCFG_TIMER_DRIVER_ADD_PERIODIC("display_decay", hh_tms1k_state, display_decay_tick, attotime::from_msec(1))
+ TIMER(config, "display_decay").configure_periodic(FUNC(hh_tms1k_state::display_decay_tick), attotime::from_msec(1));
config.set_default_layout(layout_spellb);
/* sound hardware */
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("speaker", SPEAKER_SOUND)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25)
-MACHINE_CONFIG_END
+ SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25);
+}
diff --git a/src/mame/drivers/titan_soc.cpp b/src/mame/drivers/titan_soc.cpp
new file mode 100644
index 00000000000..5f8852cc892
--- /dev/null
+++ b/src/mame/drivers/titan_soc.cpp
@@ -0,0 +1,121 @@
+// license:BSD-3-Clause
+// copyright-holders:David Haywood
+/************************************************************************
+
+ Titan 1.0C (System on a Chip - ARM based processor)
+
+ used by
+
+ Atari / Colecovision / Intellivision Flashback (not dumped)
+ TecToy Mega Drive 4
+
+
+ Notes:
+
+ It is possible to connect a debug terminal
+ Has a USB port for user to plug in a flash drive etc.
+ 4MB RAM
+
+ Emulators run on the ARM, games don't use some modes 100% correctly compared to original
+ hardware, only correct for the included emulator. Some games are not emulation based.
+
+*/
+
+#include "emu.h"
+#include "cpu/arm7/arm7.h"
+#include "cpu/arm7/arm7core.h"
+#include "emupal.h"
+#include "screen.h"
+
+class titan_soc_state : public driver_device
+{
+public:
+ titan_soc_state(const machine_config &mconfig, device_type type, const char *tag)
+ : driver_device(mconfig, type, tag),
+ m_mainram(*this, "mainram"),
+ m_maincpu(*this, "maincpu")
+ { }
+
+ void titan_soc(machine_config &config);
+
+ void init_titan_soc();
+
+private:
+ required_shared_ptr<uint32_t> m_mainram;
+ required_device<cpu_device> m_maincpu;
+
+ virtual void machine_reset() override;
+ virtual void video_start() override;
+ uint32_t screen_update_titan_soc(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
+ void map(address_map &map);
+};
+
+
+
+void titan_soc_state::map(address_map &map)
+{
+ map(0x00000000, 0x0007ffff).ram().share("mainram");
+}
+
+static INPUT_PORTS_START( titan_soc )
+
+INPUT_PORTS_END
+
+
+void titan_soc_state::video_start()
+{
+}
+
+uint32_t titan_soc_state::screen_update_titan_soc(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect)
+{
+ return 0;
+}
+
+void titan_soc_state::machine_reset()
+{
+}
+
+void titan_soc_state::titan_soc(machine_config &config)
+{
+ /* basic machine hardware */
+ ARM920T(config, m_maincpu, 200000000); // type + clock unknown
+ m_maincpu->set_addrmap(AS_PROGRAM, &titan_soc_state::map);
+
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500) /* not accurate */);
+ screen.set_size(320, 256);
+ screen.set_visarea(0, 320-1, 0, 256-1);
+ screen.set_screen_update(FUNC(titan_soc_state::screen_update_titan_soc));
+
+ PALETTE(config, "palette").set_entries(256);
+}
+
+
+
+ROM_START( megadri4 )
+ ROM_REGION( 0x80000, "serial", 0 ) // this was only dumped from one of the PCBS, not sure which one, might not be correct for both
+ ROM_LOAD( "25l4005a - rom de boot megadrive4.bin", 0x000000, 0x80000, CRC(1b5c3c31) SHA1(97f301ae441ca23d3c52a901319e375654920867) )
+
+ ROM_REGION( 0x08400000, "flash", 0 )
+ ROM_LOAD( "ic9 megadrive4 titan.bin", 0x000000, 0x08400000, CRC(ed92b81a) SHA1(a3d51a2febf670820d6df009660b96ff6407f475) )
+ROM_END
+
+ROM_START( megadri4a )
+ ROM_REGION( 0x80000, "serial", 0 ) // this was only dumped from one of the PCBS, not sure which one, might not be correct for both
+ ROM_LOAD( "25l4005a - rom de boot megadrive4.bin", 0x000000, 0x80000, CRC(1b5c3c31) SHA1(97f301ae441ca23d3c52a901319e375654920867) )
+
+ ROM_REGION( 0x08400000, "flash", 0 )
+ ROM_LOAD( "ic9 megadrive4 titan segunda placa.bin", 0x000000, 0x08400000, CRC(4b423898) SHA1(293127d2f6169717a7fbfcf18f13e4b1735236f7) )
+ROM_END
+
+
+
+void titan_soc_state::init_titan_soc()
+{
+ // can either run directly from serial ROM, or copies it to RAM on startup
+ memcpy(m_mainram, memregion("serial")->base(), 0x80000);
+}
+
+CONS( 2009, megadri4, 0, 0, titan_soc, titan_soc, titan_soc_state, init_titan_soc, "Tectoy (licensed from Sega)", "Mega Drive 4 / Guitar Idol (set 1)", MACHINE_IS_SKELETON )
+CONS( 2009, megadri4a, megadri4, 0, titan_soc, titan_soc, titan_soc_state, init_titan_soc, "Tectoy (licensed from Sega)", "Mega Drive 4 / Guitar Idol (set 2)", MACHINE_IS_SKELETON )
diff --git a/src/mame/drivers/tk2000.cpp b/src/mame/drivers/tk2000.cpp
index 19727c5a6d8..dd44c72a319 100644
--- a/src/mame/drivers/tk2000.cpp
+++ b/src/mame/drivers/tk2000.cpp
@@ -566,36 +566,37 @@ static INPUT_PORTS_START( tk2000 )
PORT_CONFSETTING(0x03, "Amber")
INPUT_PORTS_END
-MACHINE_CONFIG_START(tk2000_state::tk2000)
+void tk2000_state::tk2000(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD(A2_CPU_TAG, M6502, 1021800) /* close to actual CPU frequency of 1.020484 MHz */
- MCFG_DEVICE_PROGRAM_MAP(apple2_map)
- MCFG_TIMER_DRIVER_ADD_SCANLINE("scantimer", tk2000_state, apple2_interrupt, "screen", 0, 1)
- MCFG_QUANTUM_TIME(attotime::from_hz(60))
+ M6502(config, m_maincpu, 1021800); /* close to actual CPU frequency of 1.020484 MHz */
+ m_maincpu->set_addrmap(AS_PROGRAM, &tk2000_state::apple2_map);
+
+ TIMER(config, "scantimer").configure_scanline(FUNC(tk2000_state::apple2_interrupt), "screen", 0, 1);
+ config.m_minimum_quantum = attotime::from_hz(60);
APPLE2_VIDEO(config, m_video, XTAL(14'318'181));
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */
- MCFG_SCREEN_SIZE(280*2, 262)
- MCFG_SCREEN_VISIBLE_AREA(0, (280*2)-1,0,192-1)
- MCFG_SCREEN_UPDATE_DRIVER(tk2000_state, screen_update)
- MCFG_SCREEN_PALETTE(m_video)
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_refresh_hz(60);
+ m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */
+ m_screen->set_size(280*2, 262);
+ m_screen->set_visarea(0, (280*2)-1,0,192-1);
+ m_screen->set_screen_update(FUNC(tk2000_state::screen_update));
+ m_screen->set_palette(m_video);
/* sound hardware */
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD(A2_SPEAKER_TAG, SPEAKER_SOUND)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.00)
+ SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 1.00);
/* /INH banking */
ADDRESS_MAP_BANK(config, A2_UPPERBANK_TAG).set_map(&tk2000_state::inhbank_map).set_options(ENDIANNESS_LITTLE, 8, 32, 0x4000);
RAM(config, RAM_TAG).set_default_size("64K");
- MCFG_CASSETTE_ADD(A2_CASSETTE_TAG)
- MCFG_CASSETTE_DEFAULT_STATE(CASSETTE_STOPPED)
-MACHINE_CONFIG_END
+ CASSETTE(config, m_cassette);
+ m_cassette->set_default_state(CASSETTE_STOPPED);
+}
/***************************************************************************
diff --git a/src/mame/drivers/tk80bs.cpp b/src/mame/drivers/tk80bs.cpp
index a1a71076978..893dfdaf5f7 100644
--- a/src/mame/drivers/tk80bs.cpp
+++ b/src/mame/drivers/tk80bs.cpp
@@ -172,22 +172,23 @@ static GFXDECODE_START( gfx_tk80bs )
GFXDECODE_END
-MACHINE_CONFIG_START(tk80bs_state::tk80bs)
+void tk80bs_state::tk80bs(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu",I8080, XTAL(1'000'000)) //unknown clock
- MCFG_DEVICE_PROGRAM_MAP(tk80bs_mem)
+ I8080(config, m_maincpu, XTAL(1'000'000)); //unknown clock
+ m_maincpu->set_addrmap(AS_PROGRAM, &tk80bs_state::tk80bs_mem);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(50)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */
- MCFG_SCREEN_SIZE(256, 128)
- MCFG_SCREEN_VISIBLE_AREA(0, 256-1, 0, 128-1)
- MCFG_SCREEN_UPDATE_DRIVER(tk80bs_state, screen_update_tk80bs)
- MCFG_SCREEN_PALETTE(m_palette)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(50);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */
+ screen.set_size(256, 128);
+ screen.set_visarea(0, 256-1, 0, 128-1);
+ screen.set_screen_update(FUNC(tk80bs_state::screen_update_tk80bs));
+ screen.set_palette(m_palette);
PALETTE(config, m_palette, palette_device::MONOCHROME);
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_tk80bs)
+ GFXDECODE(config, m_gfxdecode, m_palette, gfx_tk80bs);
/* Devices */
I8255(config, m_ppi);
@@ -196,7 +197,7 @@ MACHINE_CONFIG_START(tk80bs_state::tk80bs)
generic_keyboard_device &keyboard(GENERIC_KEYBOARD(config, "keyboard", 0));
keyboard.set_keyboard_callback(FUNC(tk80bs_state::kbd_put));
-MACHINE_CONFIG_END
+}
ROM_START( tk80bs )
diff --git a/src/mame/drivers/tm990189.cpp b/src/mame/drivers/tm990189.cpp
index 9be9ae43432..154f456b9cb 100644
--- a/src/mame/drivers/tm990189.cpp
+++ b/src/mame/drivers/tm990189.cpp
@@ -812,16 +812,13 @@ void tm990189_state::tm990_189_v_memmap(address_map &map)
void tm990189_state::tm990_189_cru_map(address_map &map)
{
- map(0x0000, 0x003f).r(m_tms9901_usr, FUNC(tms9901_device::read)); /* user I/O tms9901 */
- map(0x0040, 0x006f).r(m_tms9901_sys, FUNC(tms9901_device::read)); /* system I/O tms9901 */
- map(0x0080, 0x00cf).r(m_tms9902, FUNC(tms9902_device::cruread)); /* optional tms9902 */
-
- map(0x0000, 0x01ff).w(m_tms9901_usr, FUNC(tms9901_device::write)); /* user I/O tms9901 */
- map(0x0200, 0x03ff).w(m_tms9901_sys, FUNC(tms9901_device::write)); /* system I/O tms9901 */
- map(0x0400, 0x05ff).w(m_tms9902, FUNC(tms9902_device::cruwrite)); /* optional tms9902 */
+ map(0x0000, 0x03ff).rw(m_tms9901_usr, FUNC(tms9901_device::read), FUNC(tms9901_device::write)); /* user I/O tms9901 */
+ map(0x0400, 0x07ff).rw(m_tms9901_sys, FUNC(tms9901_device::read), FUNC(tms9901_device::write)); /* system I/O tms9901 */
+ map(0x0800, 0x0bff).rw(m_tms9902, FUNC(tms9902_device::cruread), FUNC(tms9902_device::cruwrite)); /* optional tms9902 */
}
-MACHINE_CONFIG_START(tm990189_state::tm990_189)
+void tm990189_state::tm990_189(machine_config &config)
+{
/* basic machine hardware */
TMS9980A(config, m_tms9980a, 8_MHz_XTAL); // clock divided by 4 internally
m_tms9980a->set_addrmap(AS_PROGRAM, &tm990189_state::tm990_189_memmap);
@@ -872,13 +869,15 @@ MACHINE_CONFIG_START(tm990189_state::tm990_189)
m_tms9902->xmit_cb().set(FUNC(tm990189_state::xmit_callback)); // called when a character is transmitted
TM990_189_RS232(config, "rs232", 0, m_tms9902);
- MCFG_TIMER_DRIVER_ADD_PERIODIC("display_timer", tm990189_state, display_callback, attotime::from_hz(30))
+ timer_device &display_timer(TIMER(config, "display_timer"));
+ display_timer.configure_periodic(FUNC(tm990189_state::display_callback), attotime::from_hz(30));
// Need to delay the timer, or it will spoil the initial LOAD
// TODO: Fix this, probably inside CPU
- MCFG_TIMER_START_DELAY(attotime::from_msec(150))
-MACHINE_CONFIG_END
+ display_timer.set_start_delay(attotime::from_msec(150));
+}
-MACHINE_CONFIG_START(tm990189_state::tm990_189_v)
+void tm990189_state::tm990_189_v(machine_config &config)
+{
/* basic machine hardware */
TMS9980A(config, m_tms9980a, 8_MHz_XTAL);
m_tms9980a->set_addrmap(AS_PROGRAM, &tm990189_state::tm990_189_v_memmap);
@@ -934,9 +933,10 @@ MACHINE_CONFIG_START(tm990189_state::tm990_189_v)
m_tms9902->xmit_cb().set(FUNC(tm990189_state::xmit_callback)); // called when a character is transmitted;
TM990_189_RS232(config, "rs232", 0, m_tms9902);
- MCFG_TIMER_DRIVER_ADD_PERIODIC("display_timer", tm990189_state, display_callback, attotime::from_hz(30))
- MCFG_TIMER_START_DELAY(attotime::from_msec(150))
-MACHINE_CONFIG_END
+ timer_device &display_timer(TIMER(config, "display_timer"));
+ display_timer.configure_periodic(FUNC(tm990189_state::display_callback), attotime::from_hz(30));
+ display_timer.set_start_delay(attotime::from_msec(150));
+}
/*
diff --git a/src/mame/drivers/tmaster.cpp b/src/mame/drivers/tmaster.cpp
index fdc9a2b1ecc..1fbe7c9326b 100644
--- a/src/mame/drivers/tmaster.cpp
+++ b/src/mame/drivers/tmaster.cpp
@@ -366,45 +366,47 @@ int tmaster_compute_addr(uint16_t reg_low, uint16_t reg_mid, uint16_t reg_high)
return (reg_low & 0xff) | ((reg_mid & 0x1ff) << 8) | (reg_high << 17);
}
-MACHINE_CONFIG_START(tmaster_state::tm)
- MCFG_DEVICE_ADD("maincpu", M68000, XTAL(24'000'000) / 2) /* 12MHz */
- MCFG_DEVICE_PROGRAM_MAP(tmaster_map)
- MCFG_TIMER_DRIVER_ADD_SCANLINE("scantimer", tmaster_state, scanline_interrupt, "screen", 0, 1)
+void tmaster_state::tm(machine_config &config)
+{
+ M68000(config, m_maincpu, XTAL(24'000'000) / 2); /* 12MHz */
+ m_maincpu->set_addrmap(AS_PROGRAM, &tmaster_state::tmaster_map);
+
+ TIMER(config, "scantimer").configure_scanline(FUNC(tmaster_state::scanline_interrupt), "screen", 0, 1);
- MCFG_DEVICE_ADD( "duart68681", MC68681, XTAL(8'664'000) / 2 /*??*/)
- MCFG_MC68681_IRQ_CALLBACK(WRITELINE(*this, tmaster_state, duart_irq_handler))
- MCFG_MC68681_A_TX_CALLBACK(WRITELINE("microtouch", microtouch_device, rx))
+ MC68681(config, m_duart, XTAL(8'664'000) / 2 /*??*/);
+ m_duart->irq_cb().set(FUNC(tmaster_state::duart_irq_handler));
+ m_duart->a_tx_cb().set(m_microtouch, FUNC(microtouch_device::rx));
- MCFG_MICROTOUCH_ADD( "microtouch", 9600, WRITELINE("duart68681", mc68681_device, rx_a_w) )
+ MICROTOUCH(config, m_microtouch, 9600).stx().set(m_duart, FUNC(mc68681_device::rx_a_w));
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
// video hardware
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(400, 256)
- MCFG_SCREEN_VISIBLE_AREA(0, 400-1, 0, 256-1)
- MCFG_SCREEN_UPDATE_DRIVER(tmaster_state, screen_update)
- MCFG_SCREEN_PALETTE(m_palette)
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_refresh_hz(60);
+ m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ m_screen->set_size(400, 256);
+ m_screen->set_visarea(0, 400-1, 0, 256-1);
+ m_screen->set_screen_update(FUNC(tmaster_state::screen_update));
+ m_screen->set_palette(m_palette);
PALETTE(config, m_palette).set_format(palette_device::xBGR_555, 0x1000);
- MCFG_CESBLIT_ADD("blitter", "screen", XTAL(32'000'000))
- MCFG_CESBLIT_COMPUTE_ADDR(tmaster_compute_addr)
- MCFG_CESBLIT_IRQ_CB(WRITELINE(*this, tmaster_state, blitter_irq_callback))
+ CESBLIT(config, m_blitter, XTAL(32'000'000), m_screen);
+ m_blitter->set_compute_addr(tmaster_compute_addr);
+ m_blitter->irq_callback().set(FUNC(tmaster_state::blitter_irq_callback));
// sound hardware
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("oki", OKIM6295, XTAL(24'000'000) / 16, okim6295_device::PIN7_HIGH) /* 1.5Mhz? clock frequency & pin 7 not verified */
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
-MACHINE_CONFIG_END
+ OKIM6295(config, m_oki, XTAL(24'000'000) / 16, okim6295_device::PIN7_HIGH).add_route(ALL_OUTPUTS, "mono", 1.0); /* 1.5Mhz? clock frequency & pin 7 not verified */
+}
-MACHINE_CONFIG_START(tmaster_state::tmds1204)
+void tmaster_state::tmds1204(machine_config &config)
+{
tm(config);
- MCFG_DS1204_ADD("ds1204")
-MACHINE_CONFIG_END
+ DS1204(config, "ds1204", 0);
+}
/***************************************************************************
diff --git a/src/mame/drivers/tmc1800.cpp b/src/mame/drivers/tmc1800.cpp
index 1aec81698a0..992c0f9bf01 100644
--- a/src/mame/drivers/tmc1800.cpp
+++ b/src/mame/drivers/tmc1800.cpp
@@ -735,9 +735,9 @@ MACHINE_CONFIG_START(tmc1800_state::tmc1800)
BEEP(config, m_beeper, 0).add_route(ALL_OUTPUTS, "mono", 0.25);
// devices
- MCFG_QUICKLOAD_ADD("quickload", tmc1800_base_state, tmc1800, "bin", 0)
- MCFG_CASSETTE_ADD( "cassette" )
- MCFG_CASSETTE_DEFAULT_STATE(CASSETTE_STOPPED | CASSETTE_MOTOR_ENABLED | CASSETTE_SPEAKER_MUTED)
+ MCFG_QUICKLOAD_ADD("quickload", tmc1800_base_state, tmc1800, "bin")
+ CASSETTE(config, m_cassette);
+ m_cassette->set_default_state(CASSETTE_STOPPED | CASSETTE_MOTOR_ENABLED | CASSETTE_SPEAKER_MUTED);
// internal ram
RAM(config, RAM_TAG).set_default_size("2K").set_extra_options("4K");
@@ -763,9 +763,9 @@ MACHINE_CONFIG_START(osc1000b_state::osc1000b)
BEEP(config, m_beeper, 0).add_route(ALL_OUTPUTS, "mono", 0.25);
// devices
- MCFG_QUICKLOAD_ADD("quickload", tmc1800_base_state, tmc1800, "bin", 0)
- MCFG_CASSETTE_ADD( "cassette" )
- MCFG_CASSETTE_DEFAULT_STATE(CASSETTE_STOPPED | CASSETTE_MOTOR_ENABLED | CASSETTE_SPEAKER_MUTED)
+ MCFG_QUICKLOAD_ADD("quickload", tmc1800_base_state, tmc1800, "bin")
+ CASSETTE(config, m_cassette);
+ m_cassette->set_default_state(CASSETTE_STOPPED | CASSETTE_MOTOR_ENABLED | CASSETTE_SPEAKER_MUTED);
// internal ram
RAM(config, RAM_TAG).set_default_size("2K").set_extra_options("4K");
@@ -787,9 +787,9 @@ MACHINE_CONFIG_START(tmc2000_state::tmc2000)
tmc2000_video(config);
// devices
- MCFG_QUICKLOAD_ADD("quickload", tmc1800_base_state, tmc1800, "bin", 0)
- MCFG_CASSETTE_ADD( "cassette" )
- MCFG_CASSETTE_DEFAULT_STATE(CASSETTE_STOPPED | CASSETTE_MOTOR_ENABLED | CASSETTE_SPEAKER_MUTED)
+ MCFG_QUICKLOAD_ADD("quickload", tmc1800_base_state, tmc1800, "bin")
+ CASSETTE(config, m_cassette);
+ m_cassette->set_default_state(CASSETTE_STOPPED | CASSETTE_MOTOR_ENABLED | CASSETTE_SPEAKER_MUTED);
// internal ram
RAM(config, RAM_TAG).set_default_size("4K").set_extra_options("16K,32K");
@@ -811,9 +811,9 @@ MACHINE_CONFIG_START(nano_state::nano)
nano_video(config);
// devices
- MCFG_QUICKLOAD_ADD("quickload", tmc1800_base_state, tmc1800, "bin", 0)
- MCFG_CASSETTE_ADD( "cassette" )
- MCFG_CASSETTE_DEFAULT_STATE(CASSETTE_STOPPED | CASSETTE_MOTOR_ENABLED | CASSETTE_SPEAKER_MUTED)
+ MCFG_QUICKLOAD_ADD("quickload", tmc1800_base_state, tmc1800, "bin")
+ CASSETTE(config, m_cassette);
+ m_cassette->set_default_state(CASSETTE_STOPPED | CASSETTE_MOTOR_ENABLED | CASSETTE_SPEAKER_MUTED);
// internal ram
RAM(config, RAM_TAG).set_default_size("4K");
diff --git a/src/mame/drivers/tmc600.cpp b/src/mame/drivers/tmc600.cpp
index 3ee26702f24..a4360ece5cc 100644
--- a/src/mame/drivers/tmc600.cpp
+++ b/src/mame/drivers/tmc600.cpp
@@ -253,7 +253,8 @@ WRITE8_MEMBER( tmc600_state::sc_w )
/* Machine Drivers */
-MACHINE_CONFIG_START(tmc600_state::tmc600)
+void tmc600_state::tmc600(machine_config &config)
+{
// CPU
cdp1802_device &cpu(CDP1802(config, CDP1802_TAG, 3.57_MHz_XTAL));
cpu.set_addrmap(AS_PROGRAM, &tmc600_state::tmc600_map);
@@ -289,15 +290,15 @@ MACHINE_CONFIG_START(tmc600_state::tmc600)
m_centronics->busy_handler().set(CDP1802_TAG, FUNC(cosmac_device::ef4_w)).exor(1);
// cassette
- MCFG_CASSETTE_ADD("cassette")
- MCFG_CASSETTE_DEFAULT_STATE(CASSETTE_STOPPED | CASSETTE_MOTOR_ENABLED | CASSETTE_SPEAKER_MUTED)
+ CASSETTE(config, m_cassette);
+ m_cassette->set_default_state(CASSETTE_STOPPED | CASSETTE_MOTOR_ENABLED | CASSETTE_SPEAKER_MUTED);
// expansion bus connector
- MCFG_TMC600_EURO_BUS_SLOT_ADD(TMC600_EURO_BUS_TAG, tmc600_euro_bus_cards, nullptr)
+ TMC600_EURO_BUS_SLOT(config, m_bus, tmc600_euro_bus_cards, nullptr);
// internal RAM
RAM(config, RAM_TAG).set_default_size("8K");
-MACHINE_CONFIG_END
+}
/* ROMs */
diff --git a/src/mame/drivers/tmnt.cpp b/src/mame/drivers/tmnt.cpp
index 044c7efa14f..9666c5ee16d 100644
--- a/src/mame/drivers/tmnt.cpp
+++ b/src/mame/drivers/tmnt.cpp
@@ -1072,23 +1072,14 @@ void tmnt_state::thndrx2_audio_map(address_map &map)
}
-READ8_MEMBER(tmnt_state::k054539_ctrl_r)
-{
- return m_k054539->read(space, 0x200 + offset, 0xff);
-}
-
-WRITE8_MEMBER(tmnt_state::k054539_ctrl_w)
-{
- m_k054539->write(space, 0x200 + offset, data, 0xff);
-}
-
void tmnt_state::prmrsocr_audio_map(address_map &map)
{
map(0x0000, 0x7fff).rom();
map(0x8000, 0xbfff).bankr("bank1");
map(0xc000, 0xdfff).ram();
- map(0xe000, 0xe0ff).rw(m_k054539, FUNC(k054539_device::read), FUNC(k054539_device::write));
- map(0xe100, 0xe12f).rw(FUNC(tmnt_state::k054539_ctrl_r), FUNC(tmnt_state::k054539_ctrl_w));
+ map(0xe000, 0xe12f).lrw8("k054539_rw",
+ [this](offs_t offset) { return m_k054539->read(((offset & 0x100) << 1) | (offset & 0xff)); },
+ [this](offs_t offset, u8 data) { m_k054539->write(((offset & 0x100) << 1) | (offset & 0xff), data); });
map(0xf000, 0xf000).w("soundlatch3", FUNC(generic_latch_8_device::write));
map(0xf002, 0xf002).r("soundlatch", FUNC(generic_latch_8_device::read));
map(0xf003, 0xf003).r("soundlatch2", FUNC(generic_latch_8_device::read));
diff --git a/src/mame/drivers/tmspoker.cpp b/src/mame/drivers/tmspoker.cpp
index 8b89cc18270..61e02835333 100644
--- a/src/mame/drivers/tmspoker.cpp
+++ b/src/mame/drivers/tmspoker.cpp
@@ -355,7 +355,7 @@ READ8_MEMBER(tmspoker_state::unk_r)
void tmspoker_state::tmspoker_cru_map(address_map &map)
{
- map(0x0000, 0x07ff).r(FUNC(tmspoker_state::unk_r));
+ map(0x0000, 0x0fff).r(FUNC(tmspoker_state::unk_r));
}
/* I/O byte R/W
@@ -564,8 +564,8 @@ GFXDECODE_END
* Machine Drivers *
*************************/
-MACHINE_CONFIG_START(tmspoker_state::tmspoker)
-
+void tmspoker_state::tmspoker(machine_config &config)
+{
// CPU TMS9980A; no line connections
TMS9980A(config, m_maincpu, MASTER_CLOCK);
m_maincpu->set_addrmap(AS_PROGRAM, &tmspoker_state::tmspoker_map);
@@ -573,13 +573,13 @@ MACHINE_CONFIG_START(tmspoker_state::tmspoker)
m_maincpu->set_vblank_int("screen", FUNC(tmspoker_state::tmspoker_interrupt));
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(32*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 0*8, 32*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(tmspoker_state, screen_update_tmspoker)
- MCFG_SCREEN_PALETTE("palette")
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(32*8, 32*8);
+ screen.set_visarea(0*8, 32*8-1, 0*8, 32*8-1);
+ screen.set_screen_update(FUNC(tmspoker_state::screen_update_tmspoker));
+ screen.set_palette("palette");
GFXDECODE(config, m_gfxdecode, "palette", gfx_tmspoker);
PALETTE(config, "palette", FUNC(tmspoker_state::tmspoker_palette), 256);
@@ -588,8 +588,7 @@ MACHINE_CONFIG_START(tmspoker_state::tmspoker)
crtc.set_screen("screen");
crtc.set_show_border_area(false);
crtc.set_char_width(8);
-
-MACHINE_CONFIG_END
+}
/*************************
diff --git a/src/mame/drivers/tnzs.cpp b/src/mame/drivers/tnzs.cpp
index 7fe16ec72c8..6705f45e3ba 100644
--- a/src/mame/drivers/tnzs.cpp
+++ b/src/mame/drivers/tnzs.cpp
@@ -1701,7 +1701,6 @@ void kabukiz_state::kabukiz(machine_config &config)
DAC_8BIT_R2R(config, "dac", 0).add_route(ALL_OUTPUTS, "speaker", 0.5); // unknown DAC
voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref", 0));
- vref.set_output(5.0);
vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT);
vref.add_route(0, "dac", -1.0, DAC_VREF_NEG_INPUT);
}
@@ -2077,7 +2076,7 @@ PCB:
Seta: P0-025-A
Taito: K1100241A J1100107A
-The drtoppelj PCB has a sticker label which says "K1100269A // DR. ドツペル タンケン" (DoTuPeRu TaNKeN)
+The drtoppelj PCB has a sticker label which says "K1100269A // DR. トッペル タンケン" (To'PeRu TaNKeN)
*/
ROM_START( drtoppel )
ROM_REGION( 0x20000, "maincpu", 0 ) /* 64k + bankswitch areas for the first CPU */
diff --git a/src/mame/drivers/toaplan1.cpp b/src/mame/drivers/toaplan1.cpp
index 789cd22b033..bbba1483fd8 100644
--- a/src/mame/drivers/toaplan1.cpp
+++ b/src/mame/drivers/toaplan1.cpp
@@ -623,43 +623,43 @@ void toaplan1_rallybik_state::rallybik_main_map(address_map &map)
map(0x040000, 0x07ffff).rom();
map(0x080000, 0x083fff).ram();
map(0x0c0000, 0x0c0fff).ram().share("spriteram");
- map(0x100000, 0x100001).w(FUNC(toaplan1_rallybik_state::toaplan1_bcu_flipscreen_w));
- map(0x100002, 0x100003).rw(FUNC(toaplan1_rallybik_state::toaplan1_tileram_offs_r), FUNC(toaplan1_rallybik_state::toaplan1_tileram_offs_w));
- map(0x100004, 0x100007).rw(FUNC(toaplan1_rallybik_state::rallybik_tileram16_r), FUNC(toaplan1_rallybik_state::toaplan1_tileram16_w));
- map(0x100010, 0x10001f).rw(FUNC(toaplan1_rallybik_state::toaplan1_scroll_regs_r), FUNC(toaplan1_rallybik_state::toaplan1_scroll_regs_w));
+ map(0x100001, 0x100001).w(FUNC(toaplan1_rallybik_state::bcu_flipscreen_w));
+ map(0x100002, 0x100003).rw(FUNC(toaplan1_rallybik_state::tileram_offs_r), FUNC(toaplan1_rallybik_state::tileram_offs_w));
+ map(0x100004, 0x100007).rw(FUNC(toaplan1_rallybik_state::tileram_r), FUNC(toaplan1_rallybik_state::tileram_w));
+ map(0x100010, 0x10001f).rw(FUNC(toaplan1_rallybik_state::scroll_regs_r), FUNC(toaplan1_rallybik_state::scroll_regs_w));
map(0x140000, 0x140001).portr("VBLANK");
-// AM_RANGE(0x140000, 0x140001) AM_WRITE(?? video frame related ??)
- map(0x140002, 0x140003).w(FUNC(toaplan1_rallybik_state::toaplan1_intenable_w));
- map(0x140008, 0x14000f).w(FUNC(toaplan1_rallybik_state::toaplan1_bcu_control_w));
- map(0x144000, 0x1447ff).ram().w(FUNC(toaplan1_rallybik_state::toaplan1_bgpalette_w)).share("bgpalette");
- map(0x146000, 0x1467ff).ram().w(FUNC(toaplan1_rallybik_state::toaplan1_fgpalette_w)).share("fgpalette");
- map(0x180000, 0x180fff).rw(FUNC(toaplan1_rallybik_state::toaplan1_shared_r), FUNC(toaplan1_rallybik_state::toaplan1_shared_w));
- map(0x1c0000, 0x1c0003).w(FUNC(toaplan1_rallybik_state::toaplan1_tile_offsets_w));
- map(0x1c8000, 0x1c8001).w(FUNC(toaplan1_rallybik_state::toaplan1_reset_sound_w));
+// map(0x140000, 0x140001).w(?? video frame related ??)
+ map(0x140003, 0x140003).w(FUNC(toaplan1_rallybik_state::intenable_w));
+ map(0x140008, 0x14000f).w(FUNC(toaplan1_rallybik_state::bcu_control_w));
+ map(0x144000, 0x1447ff).ram().w(FUNC(toaplan1_rallybik_state::bgpalette_w)).share("bgpalette");
+ map(0x146000, 0x1467ff).ram().w(FUNC(toaplan1_rallybik_state::fgpalette_w)).share("fgpalette");
+ map(0x180000, 0x180fff).rw(FUNC(toaplan1_rallybik_state::shared_r), FUNC(toaplan1_rallybik_state::shared_w)).umask16(0x00ff);
+ map(0x1c0000, 0x1c0003).w(FUNC(toaplan1_rallybik_state::tile_offsets_w));
+ map(0x1c8001, 0x1c8001).w(FUNC(toaplan1_rallybik_state::reset_sound_w));
}
void toaplan1_state::truxton_main_map(address_map &map)
{
map(0x000000, 0x03ffff).rom();
map(0x080000, 0x083fff).ram();
- map(0x0c0000, 0x0c0001).r(FUNC(toaplan1_state::toaplan1_frame_done_r));
- map(0x0c0002, 0x0c0003).rw(FUNC(toaplan1_state::toaplan1_spriteram_offs_r), FUNC(toaplan1_state::toaplan1_spriteram_offs_w));
- map(0x0c0004, 0x0c0005).rw(FUNC(toaplan1_state::toaplan1_spriteram16_r), FUNC(toaplan1_state::toaplan1_spriteram16_w));
- map(0x0c0006, 0x0c0007).rw(FUNC(toaplan1_state::toaplan1_spritesizeram16_r), FUNC(toaplan1_state::toaplan1_spritesizeram16_w));
- map(0x100000, 0x100001).w(FUNC(toaplan1_state::toaplan1_bcu_flipscreen_w));
- map(0x100002, 0x100003).rw(FUNC(toaplan1_state::toaplan1_tileram_offs_r), FUNC(toaplan1_state::toaplan1_tileram_offs_w));
- map(0x100004, 0x100007).rw(FUNC(toaplan1_state::toaplan1_tileram16_r), FUNC(toaplan1_state::toaplan1_tileram16_w));
- map(0x100010, 0x10001f).rw(FUNC(toaplan1_state::toaplan1_scroll_regs_r), FUNC(toaplan1_state::toaplan1_scroll_regs_w));
+ map(0x0c0000, 0x0c0001).r(FUNC(toaplan1_state::frame_done_r));
+ map(0x0c0002, 0x0c0003).rw(FUNC(toaplan1_state::spriteram_offs_r), FUNC(toaplan1_state::spriteram_offs_w));
+ map(0x0c0004, 0x0c0005).rw(FUNC(toaplan1_state::spriteram_r), FUNC(toaplan1_state::spriteram_w));
+ map(0x0c0006, 0x0c0007).rw(FUNC(toaplan1_state::spritesizeram_r), FUNC(toaplan1_state::spritesizeram_w));
+ map(0x100001, 0x100001).w(FUNC(toaplan1_state::bcu_flipscreen_w));
+ map(0x100002, 0x100003).rw(FUNC(toaplan1_state::tileram_offs_r), FUNC(toaplan1_state::tileram_offs_w));
+ map(0x100004, 0x100007).rw(FUNC(toaplan1_state::tileram_r), FUNC(toaplan1_state::tileram_w));
+ map(0x100010, 0x10001f).rw(FUNC(toaplan1_state::scroll_regs_r), FUNC(toaplan1_state::scroll_regs_w));
map(0x140000, 0x140001).portr("VBLANK");
-// AM_RANGE(0x140000, 0x140001) AM_WRITE(?? video frame related ??)
- map(0x140002, 0x140003).w(FUNC(toaplan1_state::toaplan1_intenable_w));
- map(0x140008, 0x14000f).w(FUNC(toaplan1_state::toaplan1_bcu_control_w));
- map(0x144000, 0x1447ff).ram().w(FUNC(toaplan1_state::toaplan1_bgpalette_w)).share("bgpalette");
- map(0x146000, 0x1467ff).ram().w(FUNC(toaplan1_state::toaplan1_fgpalette_w)).share("fgpalette");
- map(0x180000, 0x180fff).rw(FUNC(toaplan1_state::toaplan1_shared_r), FUNC(toaplan1_state::toaplan1_shared_w));
- map(0x1c0000, 0x1c0003).w(FUNC(toaplan1_state::toaplan1_tile_offsets_w));
- map(0x1c0006, 0x1c0007).w(FUNC(toaplan1_state::toaplan1_fcu_flipscreen_w));
- map(0x1d0000, 0x1d0001).w(FUNC(toaplan1_state::toaplan1_reset_sound_w));
+// map(0x140000, 0x140001).w(?? video frame related ??)
+ map(0x140003, 0x140003).w(FUNC(toaplan1_state::intenable_w));
+ map(0x140008, 0x14000f).w(FUNC(toaplan1_state::bcu_control_w));
+ map(0x144000, 0x1447ff).ram().w(FUNC(toaplan1_state::bgpalette_w)).share("bgpalette");
+ map(0x146000, 0x1467ff).ram().w(FUNC(toaplan1_state::fgpalette_w)).share("fgpalette");
+ map(0x180000, 0x180fff).rw(FUNC(toaplan1_state::shared_r), FUNC(toaplan1_state::shared_w)).umask16(0x00ff);
+ map(0x1c0000, 0x1c0003).w(FUNC(toaplan1_state::tile_offsets_w));
+ map(0x1c0006, 0x1c0006).w(FUNC(toaplan1_state::fcu_flipscreen_w));
+ map(0x1d0001, 0x1d0001).w(FUNC(toaplan1_state::reset_sound_w));
}
void toaplan1_state::hellfire_main_map(address_map &map)
@@ -667,23 +667,23 @@ void toaplan1_state::hellfire_main_map(address_map &map)
map(0x000000, 0x03ffff).rom();
map(0x040000, 0x047fff).ram();
map(0x080000, 0x080001).portr("VBLANK");
-// AM_RANGE(0x080000, 0x080001) AM_WRITE(?? video frame related ??)
- map(0x080002, 0x080003).w(FUNC(toaplan1_state::toaplan1_intenable_w));
- map(0x080008, 0x08000f).w(FUNC(toaplan1_state::toaplan1_bcu_control_w));
- map(0x084000, 0x0847ff).ram().w(FUNC(toaplan1_state::toaplan1_bgpalette_w)).share("bgpalette");
- map(0x086000, 0x0867ff).ram().w(FUNC(toaplan1_state::toaplan1_fgpalette_w)).share("fgpalette");
- map(0x0c0000, 0x0c0fff).rw(FUNC(toaplan1_state::toaplan1_shared_r), FUNC(toaplan1_state::toaplan1_shared_w));
- map(0x100000, 0x100001).w(FUNC(toaplan1_state::toaplan1_bcu_flipscreen_w));
- map(0x100002, 0x100003).rw(FUNC(toaplan1_state::toaplan1_tileram_offs_r), FUNC(toaplan1_state::toaplan1_tileram_offs_w));
- map(0x100004, 0x100007).rw(FUNC(toaplan1_state::toaplan1_tileram16_r), FUNC(toaplan1_state::toaplan1_tileram16_w));
- map(0x100010, 0x10001f).rw(FUNC(toaplan1_state::toaplan1_scroll_regs_r), FUNC(toaplan1_state::toaplan1_scroll_regs_w));
- map(0x140000, 0x140001).r(FUNC(toaplan1_state::toaplan1_frame_done_r));
- map(0x140002, 0x140003).rw(FUNC(toaplan1_state::toaplan1_spriteram_offs_r), FUNC(toaplan1_state::toaplan1_spriteram_offs_w));
- map(0x140004, 0x140005).rw(FUNC(toaplan1_state::toaplan1_spriteram16_r), FUNC(toaplan1_state::toaplan1_spriteram16_w));
- map(0x140006, 0x140007).rw(FUNC(toaplan1_state::toaplan1_spritesizeram16_r), FUNC(toaplan1_state::toaplan1_spritesizeram16_w));
- map(0x180000, 0x180003).w(FUNC(toaplan1_state::toaplan1_tile_offsets_w));
- map(0x180006, 0x180007).w(FUNC(toaplan1_state::toaplan1_fcu_flipscreen_w));
- map(0x180008, 0x180009).w(FUNC(toaplan1_state::toaplan1_reset_sound_w));
+// map(0x080000, 0x080001).w(?? video frame related ??)
+ map(0x080003, 0x080003).w(FUNC(toaplan1_state::intenable_w));
+ map(0x080008, 0x08000f).w(FUNC(toaplan1_state::bcu_control_w));
+ map(0x084000, 0x0847ff).ram().w(FUNC(toaplan1_state::bgpalette_w)).share("bgpalette");
+ map(0x086000, 0x0867ff).ram().w(FUNC(toaplan1_state::fgpalette_w)).share("fgpalette");
+ map(0x0c0000, 0x0c0fff).rw(FUNC(toaplan1_state::shared_r), FUNC(toaplan1_state::shared_w)).umask16(0x00ff);
+ map(0x100001, 0x100001).w(FUNC(toaplan1_state::bcu_flipscreen_w));
+ map(0x100002, 0x100003).rw(FUNC(toaplan1_state::tileram_offs_r), FUNC(toaplan1_state::tileram_offs_w));
+ map(0x100004, 0x100007).rw(FUNC(toaplan1_state::tileram_r), FUNC(toaplan1_state::tileram_w));
+ map(0x100010, 0x10001f).rw(FUNC(toaplan1_state::scroll_regs_r), FUNC(toaplan1_state::scroll_regs_w));
+ map(0x140000, 0x140001).r(FUNC(toaplan1_state::frame_done_r));
+ map(0x140002, 0x140003).rw(FUNC(toaplan1_state::spriteram_offs_r), FUNC(toaplan1_state::spriteram_offs_w));
+ map(0x140004, 0x140005).rw(FUNC(toaplan1_state::spriteram_r), FUNC(toaplan1_state::spriteram_w));
+ map(0x140006, 0x140007).rw(FUNC(toaplan1_state::spritesizeram_r), FUNC(toaplan1_state::spritesizeram_w));
+ map(0x180000, 0x180003).w(FUNC(toaplan1_state::tile_offsets_w));
+ map(0x180006, 0x180006).w(FUNC(toaplan1_state::fcu_flipscreen_w));
+ map(0x180009, 0x180009).w(FUNC(toaplan1_state::reset_sound_w));
}
void toaplan1_state::zerowing_main_map(address_map &map)
@@ -691,156 +691,156 @@ void toaplan1_state::zerowing_main_map(address_map &map)
map(0x000000, 0x00ffff).rom();
map(0x040000, 0x07ffff).rom();
map(0x080000, 0x087fff).ram();
- map(0x0c0000, 0x0c0003).w(FUNC(toaplan1_state::toaplan1_tile_offsets_w));
- map(0x0c0006, 0x0c0007).w(FUNC(toaplan1_state::toaplan1_fcu_flipscreen_w));
+ map(0x0c0000, 0x0c0003).w(FUNC(toaplan1_state::tile_offsets_w));
+ map(0x0c0006, 0x0c0006).w(FUNC(toaplan1_state::fcu_flipscreen_w));
map(0x400000, 0x400001).portr("VBLANK");
-// AM_RANGE(0x400000, 0x400001) AM_WRITE(?? video frame related ??)
- map(0x400002, 0x400003).w(FUNC(toaplan1_state::toaplan1_intenable_w));
- map(0x400008, 0x40000f).w(FUNC(toaplan1_state::toaplan1_bcu_control_w));
- map(0x404000, 0x4047ff).ram().w(FUNC(toaplan1_state::toaplan1_bgpalette_w)).share("bgpalette");
- map(0x406000, 0x4067ff).ram().w(FUNC(toaplan1_state::toaplan1_fgpalette_w)).share("fgpalette");
- map(0x440000, 0x440fff).rw(FUNC(toaplan1_state::toaplan1_shared_r), FUNC(toaplan1_state::toaplan1_shared_w));
- map(0x480000, 0x480001).w(FUNC(toaplan1_state::toaplan1_bcu_flipscreen_w));
- map(0x480002, 0x480003).rw(FUNC(toaplan1_state::toaplan1_tileram_offs_r), FUNC(toaplan1_state::toaplan1_tileram_offs_w));
- map(0x480004, 0x480007).rw(FUNC(toaplan1_state::toaplan1_tileram16_r), FUNC(toaplan1_state::toaplan1_tileram16_w));
- map(0x480010, 0x48001f).rw(FUNC(toaplan1_state::toaplan1_scroll_regs_r), FUNC(toaplan1_state::toaplan1_scroll_regs_w));
- map(0x4c0000, 0x4c0001).r(FUNC(toaplan1_state::toaplan1_frame_done_r));
- map(0x4c0002, 0x4c0003).rw(FUNC(toaplan1_state::toaplan1_spriteram_offs_r), FUNC(toaplan1_state::toaplan1_spriteram_offs_w));
- map(0x4c0004, 0x4c0005).rw(FUNC(toaplan1_state::toaplan1_spriteram16_r), FUNC(toaplan1_state::toaplan1_spriteram16_w));
- map(0x4c0006, 0x4c0007).rw(FUNC(toaplan1_state::toaplan1_spritesizeram16_r), FUNC(toaplan1_state::toaplan1_spritesizeram16_w));
+// map(0x400000, 0x400001).w(?? video frame related ??)
+ map(0x400003, 0x400003).w(FUNC(toaplan1_state::intenable_w));
+ map(0x400008, 0x40000f).w(FUNC(toaplan1_state::bcu_control_w));
+ map(0x404000, 0x4047ff).ram().w(FUNC(toaplan1_state::bgpalette_w)).share("bgpalette");
+ map(0x406000, 0x4067ff).ram().w(FUNC(toaplan1_state::fgpalette_w)).share("fgpalette");
+ map(0x440000, 0x440fff).rw(FUNC(toaplan1_state::shared_r), FUNC(toaplan1_state::shared_w)).umask16(0x00ff);
+ map(0x480001, 0x480001).w(FUNC(toaplan1_state::bcu_flipscreen_w));
+ map(0x480002, 0x480003).rw(FUNC(toaplan1_state::tileram_offs_r), FUNC(toaplan1_state::tileram_offs_w));
+ map(0x480004, 0x480007).rw(FUNC(toaplan1_state::tileram_r), FUNC(toaplan1_state::tileram_w));
+ map(0x480010, 0x48001f).rw(FUNC(toaplan1_state::scroll_regs_r), FUNC(toaplan1_state::scroll_regs_w));
+ map(0x4c0000, 0x4c0001).r(FUNC(toaplan1_state::frame_done_r));
+ map(0x4c0002, 0x4c0003).rw(FUNC(toaplan1_state::spriteram_offs_r), FUNC(toaplan1_state::spriteram_offs_w));
+ map(0x4c0004, 0x4c0005).rw(FUNC(toaplan1_state::spriteram_r), FUNC(toaplan1_state::spriteram_w));
+ map(0x4c0006, 0x4c0007).rw(FUNC(toaplan1_state::spritesizeram_r), FUNC(toaplan1_state::spritesizeram_w));
}
-void toaplan1_state::demonwld_main_map(address_map &map)
+void toaplan1_demonwld_state::main_map(address_map &map)
{
map(0x000000, 0x03ffff).rom();
map(0x400000, 0x400001).portr("VBLANK");
-// AM_RANGE(0x400000, 0x400001) AM_WRITE(?? video frame related ??)
- map(0x400002, 0x400003).w(FUNC(toaplan1_state::toaplan1_intenable_w));
- map(0x400008, 0x40000f).w(FUNC(toaplan1_state::toaplan1_bcu_control_w));
- map(0x404000, 0x4047ff).ram().w(FUNC(toaplan1_state::toaplan1_bgpalette_w)).share("bgpalette");
- map(0x406000, 0x4067ff).ram().w(FUNC(toaplan1_state::toaplan1_fgpalette_w)).share("fgpalette");
- map(0x600000, 0x600fff).rw(FUNC(toaplan1_state::toaplan1_shared_r), FUNC(toaplan1_state::toaplan1_shared_w));
- map(0x800000, 0x800001).w(FUNC(toaplan1_state::toaplan1_bcu_flipscreen_w));
- map(0x800002, 0x800003).rw(FUNC(toaplan1_state::toaplan1_tileram_offs_r), FUNC(toaplan1_state::toaplan1_tileram_offs_w));
- map(0x800004, 0x800007).rw(FUNC(toaplan1_state::toaplan1_tileram16_r), FUNC(toaplan1_state::toaplan1_tileram16_w));
- map(0x800010, 0x80001f).rw(FUNC(toaplan1_state::toaplan1_scroll_regs_r), FUNC(toaplan1_state::toaplan1_scroll_regs_w));
- map(0xa00000, 0xa00001).r(FUNC(toaplan1_state::toaplan1_frame_done_r));
- map(0xa00002, 0xa00003).rw(FUNC(toaplan1_state::toaplan1_spriteram_offs_r), FUNC(toaplan1_state::toaplan1_spriteram_offs_w));
- map(0xa00004, 0xa00005).rw(FUNC(toaplan1_state::toaplan1_spriteram16_r), FUNC(toaplan1_state::toaplan1_spriteram16_w));
- map(0xa00006, 0xa00007).rw(FUNC(toaplan1_state::toaplan1_spritesizeram16_r), FUNC(toaplan1_state::toaplan1_spritesizeram16_w));
+// map(0x400000, 0x400001).w(?? video frame related ??)
+ map(0x400003, 0x400003).w(FUNC(toaplan1_demonwld_state::intenable_w));
+ map(0x400008, 0x40000f).w(FUNC(toaplan1_demonwld_state::bcu_control_w));
+ map(0x404000, 0x4047ff).ram().w(FUNC(toaplan1_demonwld_state::bgpalette_w)).share("bgpalette");
+ map(0x406000, 0x4067ff).ram().w(FUNC(toaplan1_demonwld_state::fgpalette_w)).share("fgpalette");
+ map(0x600000, 0x600fff).rw(FUNC(toaplan1_demonwld_state::shared_r), FUNC(toaplan1_demonwld_state::shared_w)).umask16(0x00ff);
+ map(0x800001, 0x800001).w(FUNC(toaplan1_demonwld_state::bcu_flipscreen_w));
+ map(0x800002, 0x800003).rw(FUNC(toaplan1_demonwld_state::tileram_offs_r), FUNC(toaplan1_demonwld_state::tileram_offs_w));
+ map(0x800004, 0x800007).rw(FUNC(toaplan1_demonwld_state::tileram_r), FUNC(toaplan1_demonwld_state::tileram_w));
+ map(0x800010, 0x80001f).rw(FUNC(toaplan1_demonwld_state::scroll_regs_r), FUNC(toaplan1_demonwld_state::scroll_regs_w));
+ map(0xa00000, 0xa00001).r(FUNC(toaplan1_demonwld_state::frame_done_r));
+ map(0xa00002, 0xa00003).rw(FUNC(toaplan1_demonwld_state::spriteram_offs_r), FUNC(toaplan1_demonwld_state::spriteram_offs_w));
+ map(0xa00004, 0xa00005).rw(FUNC(toaplan1_demonwld_state::spriteram_r), FUNC(toaplan1_demonwld_state::spriteram_w));
+ map(0xa00006, 0xa00007).rw(FUNC(toaplan1_demonwld_state::spritesizeram_r), FUNC(toaplan1_demonwld_state::spritesizeram_w));
map(0xc00000, 0xc03fff).ram();
- map(0xe00000, 0xe00003).w(FUNC(toaplan1_state::toaplan1_tile_offsets_w));
- map(0xe00006, 0xe00007).w(FUNC(toaplan1_state::toaplan1_fcu_flipscreen_w));
- map(0xe00008, 0xe00009).w(FUNC(toaplan1_state::toaplan1_reset_sound_w));
- map(0xe0000a, 0xe0000b).w(FUNC(toaplan1_state::demonwld_dsp_ctrl_w)); /* DSP Comms control */
+ map(0xe00000, 0xe00003).w(FUNC(toaplan1_demonwld_state::tile_offsets_w));
+ map(0xe00006, 0xe00006).w(FUNC(toaplan1_demonwld_state::fcu_flipscreen_w));
+ map(0xe00009, 0xe00009).w(FUNC(toaplan1_demonwld_state::reset_sound_w));
+ map(0xe0000b, 0xe0000b).w(FUNC(toaplan1_demonwld_state::dsp_ctrl_w)); /* DSP Comms control */
}
-void toaplan1_state::samesame_main_map(address_map &map)
+void toaplan1_samesame_state::main_map(address_map &map)
{
map(0x000000, 0x00ffff).rom();
map(0x040000, 0x07ffff).rom();
- map(0x080000, 0x080003).w(FUNC(toaplan1_state::toaplan1_tile_offsets_w));
- map(0x080006, 0x080007).w(FUNC(toaplan1_state::toaplan1_fcu_flipscreen_w));
+ map(0x080000, 0x080003).w(FUNC(toaplan1_samesame_state::tile_offsets_w));
+ map(0x080006, 0x080006).w(FUNC(toaplan1_samesame_state::fcu_flipscreen_w));
map(0x0c0000, 0x0c3fff).ram(); /* Frame done at $c1ada */
map(0x100000, 0x100001).portr("VBLANK");
-// AM_RANGE(0x100000, 0x100001) AM_WRITE(?? video frame related ??)
- map(0x100002, 0x100003).w(FUNC(toaplan1_state::toaplan1_intenable_w));
- map(0x100008, 0x10000f).w(FUNC(toaplan1_state::toaplan1_bcu_control_w));
- map(0x104000, 0x1047ff).ram().w(FUNC(toaplan1_state::toaplan1_bgpalette_w)).share("bgpalette");
- map(0x106000, 0x1067ff).ram().w(FUNC(toaplan1_state::toaplan1_fgpalette_w)).share("fgpalette");
+// map(0x100000, 0x100001).w(?? video frame related ??)
+ map(0x100003, 0x100003).w(FUNC(toaplan1_samesame_state::intenable_w));
+ map(0x100008, 0x10000f).w(FUNC(toaplan1_samesame_state::bcu_control_w));
+ map(0x104000, 0x1047ff).ram().w(FUNC(toaplan1_samesame_state::bgpalette_w)).share("bgpalette");
+ map(0x106000, 0x1067ff).ram().w(FUNC(toaplan1_samesame_state::fgpalette_w)).share("fgpalette");
map(0x140000, 0x140001).portr("P1");
map(0x140002, 0x140003).portr("P2");
map(0x140004, 0x140005).portr("DSWA");
map(0x140006, 0x140007).portr("DSWB");
map(0x140008, 0x140009).portr("SYSTEM");
- map(0x14000a, 0x14000b).r(FUNC(toaplan1_state::samesame_port_6_word_r)); /* Territory, and MCU ready */
- map(0x14000c, 0x14000d).w(FUNC(toaplan1_state::samesame_coin_w)); /* Coin counter/lockout */
- map(0x14000e, 0x14000f).w(FUNC(toaplan1_state::samesame_mcu_w)); /* Commands sent to HD647180 */
- map(0x180000, 0x180001).w(FUNC(toaplan1_state::toaplan1_bcu_flipscreen_w));
- map(0x180002, 0x180003).rw(FUNC(toaplan1_state::toaplan1_tileram_offs_r), FUNC(toaplan1_state::toaplan1_tileram_offs_w));
- map(0x180004, 0x180007).rw(FUNC(toaplan1_state::toaplan1_tileram16_r), FUNC(toaplan1_state::toaplan1_tileram16_w));
- map(0x180010, 0x18001f).rw(FUNC(toaplan1_state::toaplan1_scroll_regs_r), FUNC(toaplan1_state::toaplan1_scroll_regs_w));
- map(0x1c0000, 0x1c0001).r(FUNC(toaplan1_state::toaplan1_frame_done_r));
-// AM_RANGE(0x1c0000, 0x1c0001) AM_WRITE(?? disable sprite refresh ??)
- map(0x1c0002, 0x1c0003).rw(FUNC(toaplan1_state::toaplan1_spriteram_offs_r), FUNC(toaplan1_state::toaplan1_spriteram_offs_w));
- map(0x1c0004, 0x1c0005).rw(FUNC(toaplan1_state::toaplan1_spriteram16_r), FUNC(toaplan1_state::toaplan1_spriteram16_w));
- map(0x1c0006, 0x1c0007).rw(FUNC(toaplan1_state::toaplan1_spritesizeram16_r), FUNC(toaplan1_state::toaplan1_spritesizeram16_w));
+ map(0x14000b, 0x14000b).r(FUNC(toaplan1_samesame_state::port_6_word_r)); /* Territory, and MCU ready */
+ map(0x14000d, 0x14000d).w(FUNC(toaplan1_samesame_state::coin_w)); /* Coin counter/lockout */
+ map(0x14000f, 0x14000f).w(FUNC(toaplan1_samesame_state::mcu_w)); /* Commands sent to HD647180 */
+ map(0x180001, 0x180001).w(FUNC(toaplan1_samesame_state::bcu_flipscreen_w));
+ map(0x180002, 0x180003).rw(FUNC(toaplan1_samesame_state::tileram_offs_r), FUNC(toaplan1_samesame_state::tileram_offs_w));
+ map(0x180004, 0x180007).rw(FUNC(toaplan1_samesame_state::tileram_r), FUNC(toaplan1_samesame_state::tileram_w));
+ map(0x180010, 0x18001f).rw(FUNC(toaplan1_samesame_state::scroll_regs_r), FUNC(toaplan1_samesame_state::scroll_regs_w));
+ map(0x1c0000, 0x1c0001).r(FUNC(toaplan1_samesame_state::frame_done_r));
+// map(0x1c0000, 0x1c0001).w(?? disable sprite refresh ??)
+ map(0x1c0002, 0x1c0003).rw(FUNC(toaplan1_samesame_state::spriteram_offs_r), FUNC(toaplan1_samesame_state::spriteram_offs_w));
+ map(0x1c0004, 0x1c0005).rw(FUNC(toaplan1_samesame_state::spriteram_r), FUNC(toaplan1_samesame_state::spriteram_w));
+ map(0x1c0006, 0x1c0007).rw(FUNC(toaplan1_samesame_state::spritesizeram_r), FUNC(toaplan1_samesame_state::spritesizeram_w));
}
void toaplan1_state::outzone_main_map(address_map &map)
{
map(0x000000, 0x03ffff).rom();
- map(0x100000, 0x100001).r(FUNC(toaplan1_state::toaplan1_frame_done_r));
- map(0x100002, 0x100003).rw(FUNC(toaplan1_state::toaplan1_spriteram_offs_r), FUNC(toaplan1_state::toaplan1_spriteram_offs_w));
- map(0x100004, 0x100005).rw(FUNC(toaplan1_state::toaplan1_spriteram16_r), FUNC(toaplan1_state::toaplan1_spriteram16_w));
- map(0x100006, 0x100007).rw(FUNC(toaplan1_state::toaplan1_spritesizeram16_r), FUNC(toaplan1_state::toaplan1_spritesizeram16_w));
- map(0x140000, 0x140fff).rw(FUNC(toaplan1_state::toaplan1_shared_r), FUNC(toaplan1_state::toaplan1_shared_w));
- map(0x200000, 0x200001).w(FUNC(toaplan1_state::toaplan1_bcu_flipscreen_w));
- map(0x200002, 0x200003).rw(FUNC(toaplan1_state::toaplan1_tileram_offs_r), FUNC(toaplan1_state::toaplan1_tileram_offs_w));
- map(0x200004, 0x200007).rw(FUNC(toaplan1_state::toaplan1_tileram16_r), FUNC(toaplan1_state::toaplan1_tileram16_w));
- map(0x200010, 0x20001f).rw(FUNC(toaplan1_state::toaplan1_scroll_regs_r), FUNC(toaplan1_state::toaplan1_scroll_regs_w));
+ map(0x100000, 0x100001).r(FUNC(toaplan1_state::frame_done_r));
+ map(0x100002, 0x100003).rw(FUNC(toaplan1_state::spriteram_offs_r), FUNC(toaplan1_state::spriteram_offs_w));
+ map(0x100004, 0x100005).rw(FUNC(toaplan1_state::spriteram_r), FUNC(toaplan1_state::spriteram_w));
+ map(0x100006, 0x100007).rw(FUNC(toaplan1_state::spritesizeram_r), FUNC(toaplan1_state::spritesizeram_w));
+ map(0x140000, 0x140fff).rw(FUNC(toaplan1_state::shared_r), FUNC(toaplan1_state::shared_w)).umask16(0x00ff);
+ map(0x200001, 0x200001).w(FUNC(toaplan1_state::bcu_flipscreen_w));
+ map(0x200002, 0x200003).rw(FUNC(toaplan1_state::tileram_offs_r), FUNC(toaplan1_state::tileram_offs_w));
+ map(0x200004, 0x200007).rw(FUNC(toaplan1_state::tileram_r), FUNC(toaplan1_state::tileram_w));
+ map(0x200010, 0x20001f).rw(FUNC(toaplan1_state::scroll_regs_r), FUNC(toaplan1_state::scroll_regs_w));
map(0x240000, 0x243fff).ram();
map(0x300000, 0x300001).portr("VBLANK");
-// AM_RANGE(0x300000, 0x300001) AM_WRITE(?? video frame related ??)
- map(0x300002, 0x300003).w(FUNC(toaplan1_state::toaplan1_intenable_w));
- map(0x300008, 0x30000f).w(FUNC(toaplan1_state::toaplan1_bcu_control_w));
- map(0x304000, 0x3047ff).ram().w(FUNC(toaplan1_state::toaplan1_bgpalette_w)).share("bgpalette");
- map(0x306000, 0x3067ff).ram().w(FUNC(toaplan1_state::toaplan1_fgpalette_w)).share("fgpalette");
- map(0x340000, 0x340003).w(FUNC(toaplan1_state::toaplan1_tile_offsets_w));
- map(0x340006, 0x340007).w(FUNC(toaplan1_state::toaplan1_fcu_flipscreen_w));
+// map(0x300000, 0x300001).w(?? video frame related ??)
+ map(0x300003, 0x300003).w(FUNC(toaplan1_state::intenable_w));
+ map(0x300008, 0x30000f).w(FUNC(toaplan1_state::bcu_control_w));
+ map(0x304000, 0x3047ff).ram().w(FUNC(toaplan1_state::bgpalette_w)).share("bgpalette");
+ map(0x306000, 0x3067ff).ram().w(FUNC(toaplan1_state::fgpalette_w)).share("fgpalette");
+ map(0x340000, 0x340003).w(FUNC(toaplan1_state::tile_offsets_w));
+ map(0x340006, 0x340006).w(FUNC(toaplan1_state::fcu_flipscreen_w));
}
void toaplan1_state::outzonecv_main_map(address_map &map)
{
map(0x000000, 0x03ffff).rom();
-// AM_RANGE(0x040000, 0x07ffff) AM_ROM
+// map(0x040000, 0x07ffff).rom();
map(0x080000, 0x087fff).ram();
- map(0x0c0000, 0x0c0003).w(FUNC(toaplan1_state::toaplan1_tile_offsets_w));
- map(0x0c0006, 0x0c0007).w(FUNC(toaplan1_state::toaplan1_fcu_flipscreen_w));
+ map(0x0c0000, 0x0c0003).w(FUNC(toaplan1_state::tile_offsets_w));
+ map(0x0c0006, 0x0c0006).w(FUNC(toaplan1_state::fcu_flipscreen_w));
map(0x400000, 0x400001).portr("VBLANK");
-// AM_RANGE(0x400000, 0x400001) AM_WRITE(?? video frame related ??)
- map(0x400002, 0x400003).w(FUNC(toaplan1_state::toaplan1_intenable_w));
- map(0x400008, 0x40000f).w(FUNC(toaplan1_state::toaplan1_bcu_control_w));
- map(0x404000, 0x4047ff).ram().w(FUNC(toaplan1_state::toaplan1_bgpalette_w)).share("bgpalette");
- map(0x406000, 0x4067ff).ram().w(FUNC(toaplan1_state::toaplan1_fgpalette_w)).share("fgpalette");
- map(0x440000, 0x440fff).rw(FUNC(toaplan1_state::toaplan1_shared_r), FUNC(toaplan1_state::toaplan1_shared_w));
- map(0x480000, 0x480001).w(FUNC(toaplan1_state::toaplan1_bcu_flipscreen_w));
- map(0x480002, 0x480003).rw(FUNC(toaplan1_state::toaplan1_tileram_offs_r), FUNC(toaplan1_state::toaplan1_tileram_offs_w));
- map(0x480004, 0x480007).rw(FUNC(toaplan1_state::toaplan1_tileram16_r), FUNC(toaplan1_state::toaplan1_tileram16_w));
- map(0x480010, 0x48001f).rw(FUNC(toaplan1_state::toaplan1_scroll_regs_r), FUNC(toaplan1_state::toaplan1_scroll_regs_w));
- map(0x4c0000, 0x4c0001).r(FUNC(toaplan1_state::toaplan1_frame_done_r));
- map(0x4c0002, 0x4c0003).rw(FUNC(toaplan1_state::toaplan1_spriteram_offs_r), FUNC(toaplan1_state::toaplan1_spriteram_offs_w));
- map(0x4c0004, 0x4c0005).rw(FUNC(toaplan1_state::toaplan1_spriteram16_r), FUNC(toaplan1_state::toaplan1_spriteram16_w));
- map(0x4c0006, 0x4c0007).rw(FUNC(toaplan1_state::toaplan1_spritesizeram16_r), FUNC(toaplan1_state::toaplan1_spritesizeram16_w));
+// map(0x400000, 0x400001).w(?? video frame related ??)
+ map(0x400003, 0x400003).w(FUNC(toaplan1_state::intenable_w));
+ map(0x400008, 0x40000f).w(FUNC(toaplan1_state::bcu_control_w));
+ map(0x404000, 0x4047ff).ram().w(FUNC(toaplan1_state::bgpalette_w)).share("bgpalette");
+ map(0x406000, 0x4067ff).ram().w(FUNC(toaplan1_state::fgpalette_w)).share("fgpalette");
+ map(0x440000, 0x440fff).rw(FUNC(toaplan1_state::shared_r), FUNC(toaplan1_state::shared_w)).umask16(0x00ff);
+ map(0x480001, 0x480001).w(FUNC(toaplan1_state::bcu_flipscreen_w));
+ map(0x480002, 0x480003).rw(FUNC(toaplan1_state::tileram_offs_r), FUNC(toaplan1_state::tileram_offs_w));
+ map(0x480004, 0x480007).rw(FUNC(toaplan1_state::tileram_r), FUNC(toaplan1_state::tileram_w));
+ map(0x480010, 0x48001f).rw(FUNC(toaplan1_state::scroll_regs_r), FUNC(toaplan1_state::scroll_regs_w));
+ map(0x4c0000, 0x4c0001).r(FUNC(toaplan1_state::frame_done_r));
+ map(0x4c0002, 0x4c0003).rw(FUNC(toaplan1_state::spriteram_offs_r), FUNC(toaplan1_state::spriteram_offs_w));
+ map(0x4c0004, 0x4c0005).rw(FUNC(toaplan1_state::spriteram_r), FUNC(toaplan1_state::spriteram_w));
+ map(0x4c0006, 0x4c0007).rw(FUNC(toaplan1_state::spritesizeram_r), FUNC(toaplan1_state::spritesizeram_w));
}
void toaplan1_state::vimana_main_map(address_map &map)
{
map(0x000000, 0x03ffff).rom();
- map(0x080000, 0x080003).w(FUNC(toaplan1_state::toaplan1_tile_offsets_w));
- map(0x080006, 0x080007).w(FUNC(toaplan1_state::toaplan1_fcu_flipscreen_w));
- map(0x0c0000, 0x0c0001).r(FUNC(toaplan1_state::toaplan1_frame_done_r));
- map(0x0c0002, 0x0c0003).rw(FUNC(toaplan1_state::toaplan1_spriteram_offs_r), FUNC(toaplan1_state::toaplan1_spriteram_offs_w));
- map(0x0c0004, 0x0c0005).rw(FUNC(toaplan1_state::toaplan1_spriteram16_r), FUNC(toaplan1_state::toaplan1_spriteram16_w));
- map(0x0c0006, 0x0c0007).rw(FUNC(toaplan1_state::toaplan1_spritesizeram16_r), FUNC(toaplan1_state::toaplan1_spritesizeram16_w));
+ map(0x080000, 0x080003).w(FUNC(toaplan1_state::tile_offsets_w));
+ map(0x080006, 0x080006).w(FUNC(toaplan1_state::fcu_flipscreen_w));
+ map(0x0c0000, 0x0c0001).r(FUNC(toaplan1_state::frame_done_r));
+ map(0x0c0002, 0x0c0003).rw(FUNC(toaplan1_state::spriteram_offs_r), FUNC(toaplan1_state::spriteram_offs_w));
+ map(0x0c0004, 0x0c0005).rw(FUNC(toaplan1_state::spriteram_r), FUNC(toaplan1_state::spriteram_w));
+ map(0x0c0006, 0x0c0007).rw(FUNC(toaplan1_state::spritesizeram_r), FUNC(toaplan1_state::spritesizeram_w));
map(0x400000, 0x400001).portr("VBLANK");
-// AM_RANGE(0x400000, 0x400001) AM_WRITE(?? video frame related ??)
- map(0x400002, 0x400003).w(FUNC(toaplan1_state::toaplan1_intenable_w));
- map(0x400008, 0x40000f).w(FUNC(toaplan1_state::toaplan1_bcu_control_w));
- map(0x404000, 0x4047ff).ram().w(FUNC(toaplan1_state::toaplan1_bgpalette_w)).share("bgpalette");
- map(0x406000, 0x4067ff).ram().w(FUNC(toaplan1_state::toaplan1_fgpalette_w)).share("fgpalette");
- map(0x440000, 0x4407ff).rw(FUNC(toaplan1_state::toaplan1_shared_r), FUNC(toaplan1_state::toaplan1_shared_w)); /* inputs, coins and sound handled by 647180 MCU via this space */
+// map(0x400000, 0x400001).w(?? video frame related ??)
+ map(0x400003, 0x400003).w(FUNC(toaplan1_state::intenable_w));
+ map(0x400008, 0x40000f).w(FUNC(toaplan1_state::bcu_control_w));
+ map(0x404000, 0x4047ff).ram().w(FUNC(toaplan1_state::bgpalette_w)).share("bgpalette");
+ map(0x406000, 0x4067ff).ram().w(FUNC(toaplan1_state::fgpalette_w)).share("fgpalette");
+ map(0x440000, 0x4407ff).rw(FUNC(toaplan1_state::shared_r), FUNC(toaplan1_state::shared_w)).umask16(0x00ff); /* inputs, coins and sound handled by 647180 MCU via this space */
map(0x480000, 0x487fff).ram();
- map(0x4c0000, 0x4c0001).w(FUNC(toaplan1_state::toaplan1_bcu_flipscreen_w));
- map(0x4c0002, 0x4c0003).rw(FUNC(toaplan1_state::toaplan1_tileram_offs_r), FUNC(toaplan1_state::toaplan1_tileram_offs_w));
- map(0x4c0004, 0x4c0007).rw(FUNC(toaplan1_state::toaplan1_tileram16_r), FUNC(toaplan1_state::toaplan1_tileram16_w));
- map(0x4c0010, 0x4c001f).rw(FUNC(toaplan1_state::toaplan1_scroll_regs_r), FUNC(toaplan1_state::toaplan1_scroll_regs_w));
+ map(0x4c0001, 0x4c0001).w(FUNC(toaplan1_state::bcu_flipscreen_w));
+ map(0x4c0002, 0x4c0003).rw(FUNC(toaplan1_state::tileram_offs_r), FUNC(toaplan1_state::tileram_offs_w));
+ map(0x4c0004, 0x4c0007).rw(FUNC(toaplan1_state::tileram_r), FUNC(toaplan1_state::tileram_w));
+ map(0x4c0010, 0x4c001f).rw(FUNC(toaplan1_state::scroll_regs_r), FUNC(toaplan1_state::scroll_regs_w));
}
/***************************** Z80 Memory Map *******************************/
-void toaplan1_state::toaplan1_sound_map(address_map &map)
+void toaplan1_state::sound_map(address_map &map)
{
map(0x0000, 0x7fff).rom();
map(0x8000, 0x87ff).ram().share("sharedram");
@@ -864,7 +864,7 @@ void toaplan1_state::truxton_sound_io_map(address_map &map)
map(0x00, 0x00).portr("P1");
map(0x10, 0x10).portr("P2");
map(0x20, 0x20).portr("SYSTEM");
- map(0x30, 0x30).w(FUNC(toaplan1_state::toaplan1_coin_w)); /* Coin counter/lockout */
+ map(0x30, 0x30).w(FUNC(toaplan1_state::coin_w)); /* Coin counter/lockout */
map(0x40, 0x40).portr("DSWA");
map(0x50, 0x50).portr("DSWB");
map(0x60, 0x61).rw("ymsnd", FUNC(ym3812_device::read), FUNC(ym3812_device::write));
@@ -877,7 +877,7 @@ void toaplan1_state::hellfire_sound_io_map(address_map &map)
map(0x00, 0x00).portr("DSWA");
map(0x10, 0x10).portr("DSWB");
map(0x20, 0x20).portr("TJUMP");
- map(0x30, 0x30).w(FUNC(toaplan1_state::toaplan1_coin_w)); /* Coin counter/lockout */
+ map(0x30, 0x30).w(FUNC(toaplan1_state::coin_w)); /* Coin counter/lockout */
map(0x40, 0x40).portr("P1");
map(0x50, 0x50).portr("P2");
map(0x60, 0x60).portr("SYSTEM");
@@ -893,16 +893,16 @@ void toaplan1_state::zerowing_sound_io_map(address_map &map)
map(0x28, 0x28).portr("DSWB");
map(0x80, 0x80).portr("SYSTEM");
map(0x88, 0x88).portr("TJUMP");
- map(0xa0, 0xa0).w(FUNC(toaplan1_state::toaplan1_coin_w)); /* Coin counter/lockout */
+ map(0xa0, 0xa0).w(FUNC(toaplan1_state::coin_w)); /* Coin counter/lockout */
map(0xa8, 0xa9).rw("ymsnd", FUNC(ym3812_device::read), FUNC(ym3812_device::write));
}
-void toaplan1_state::demonwld_sound_io_map(address_map &map)
+void toaplan1_demonwld_state::sound_io_map(address_map &map)
{
map.global_mask(0xff);
map(0x00, 0x01).rw("ymsnd", FUNC(ym3812_device::read), FUNC(ym3812_device::write));
map(0x20, 0x20).portr("TJUMP");
- map(0x40, 0x40).w(FUNC(toaplan1_state::toaplan1_coin_w)); /* Coin counter/lockout */
+ map(0x40, 0x40).w(FUNC(toaplan1_demonwld_state::coin_w)); /* Coin counter/lockout */
map(0x60, 0x60).portr("SYSTEM");
map(0x80, 0x80).portr("P1");
map(0xa0, 0xa0).portr("DSWB");
@@ -914,7 +914,7 @@ void toaplan1_state::outzone_sound_io_map(address_map &map)
{
map.global_mask(0xff);
map(0x00, 0x01).rw("ymsnd", FUNC(ym3812_device::read), FUNC(ym3812_device::write));
- map(0x04, 0x04).w(FUNC(toaplan1_state::toaplan1_coin_w)); /* Coin counter/lockout */
+ map(0x04, 0x04).w(FUNC(toaplan1_state::coin_w)); /* Coin counter/lockout */
map(0x08, 0x08).portr("DSWA");
map(0x0c, 0x0c).portr("DSWB");
map(0x10, 0x10).portr("SYSTEM");
@@ -926,18 +926,18 @@ void toaplan1_state::outzone_sound_io_map(address_map &map)
/***************************** TMS32010 Memory Map **************************/
-void toaplan1_state::dsp_program_map(address_map &map)
+void toaplan1_demonwld_state::dsp_program_map(address_map &map)
{
map(0x000, 0x7ff).rom();
}
/* $000 - 08F TMS32010 Internal Data RAM in Data Address Space */
-void toaplan1_state::dsp_io_map(address_map &map)
+void toaplan1_demonwld_state::dsp_io_map(address_map &map)
{
- map(0, 0).w(FUNC(toaplan1_state::demonwld_dsp_addrsel_w));
- map(1, 1).rw(FUNC(toaplan1_state::demonwld_dsp_r), FUNC(toaplan1_state::demonwld_dsp_w));
- map(3, 3).w(FUNC(toaplan1_state::demonwld_dsp_bio_w));
+ map(0, 0).w(FUNC(toaplan1_demonwld_state::dsp_addrsel_w));
+ map(1, 1).rw(FUNC(toaplan1_demonwld_state::dsp_r), FUNC(toaplan1_demonwld_state::dsp_w));
+ map(3, 3).w(FUNC(toaplan1_demonwld_state::dsp_bio_w));
}
@@ -976,57 +976,57 @@ void toaplan1_state::vimana_hd647180_io_map(address_map &map)
map(0x81, 0x81).portr("P2");
map(0x82, 0x82).portr("DSWA");
map(0x83, 0x83).portr("SYSTEM");
- map(0x84, 0x84).w(FUNC(toaplan1_state::toaplan1_coin_w)); // Coin counter/lockout // needs verify
+ map(0x84, 0x84).w(FUNC(toaplan1_state::coin_w)); // Coin counter/lockout // needs verify
map(0x87, 0x87).rw("ymsnd", FUNC(ym3812_device::status_port_r), FUNC(ym3812_device::control_port_w));
map(0x8f, 0x8f).rw("ymsnd", FUNC(ym3812_device::read_port_r), FUNC(ym3812_device::write_port_w));
}
-READ8_MEMBER(toaplan1_state::vimana_dswb_invert_r)
+u8 toaplan1_state::vimana_dswb_invert_r()
{
- return ioport("DSWB")->read() ^ 0xFF;
+ return m_dswb_io->read() ^ 0xFF;
}
-READ8_MEMBER(toaplan1_state::vimana_tjump_invert_r)
+u8 toaplan1_state::vimana_tjump_invert_r()
{
- return (ioport("TJUMP")->read() ^ 0xFF)|0xC0; // high 2 bits of port G always read as 1
+ return (m_tjump_io->read() ^ 0xFF)|0xC0; // high 2 bits of port G always read as 1
}
-WRITE16_MEMBER(toaplan1_state::samesame_mcu_w)
+void toaplan1_samesame_state::mcu_w(u8 data)
{
m_to_mcu = data;
m_cmdavailable = 1;
};
-READ8_MEMBER(toaplan1_state::samesame_soundlatch_r)
+u8 toaplan1_samesame_state::soundlatch_r()
{
return m_to_mcu;
};
-WRITE8_MEMBER(toaplan1_state::samesame_sound_done_w)
+void toaplan1_samesame_state::sound_done_w(u8 data)
{
m_to_mcu = data;
m_cmdavailable = 0;
}
-READ8_MEMBER(toaplan1_state::samesame_cmdavailable_r)
+u8 toaplan1_samesame_state::cmdavailable_r()
{
if (m_cmdavailable) return 0xff;
else return 0x00;
};
-void toaplan1_state::samesame_hd647180_mem_map(address_map &map)
+void toaplan1_samesame_state::hd647180_mem_map(address_map &map)
{
map(0x00000, 0x03fff).rom(); /* Internal 16k byte ROM */
map(0x0fe00, 0x0ffff).ram(); /* Internal 512 byte RAM */
}
-void toaplan1_state::samesame_hd647180_io_map(address_map &map)
+void toaplan1_samesame_state::hd647180_io_map(address_map &map)
{
map.global_mask(0xff);
- map(0x63, 0x63).r(FUNC(toaplan1_state::samesame_cmdavailable_r));
- map(0xa0, 0xa0).r(FUNC(toaplan1_state::samesame_soundlatch_r));
- map(0xb0, 0xb0).w(FUNC(toaplan1_state::samesame_sound_done_w));
+ map(0x63, 0x63).r(FUNC(toaplan1_samesame_state::cmdavailable_r));
+ map(0xa0, 0xa0).r(FUNC(toaplan1_samesame_state::soundlatch_r));
+ map(0xb0, 0xb0).w(FUNC(toaplan1_samesame_state::sound_done_w));
map(0x80, 0x80).rw("ymsnd", FUNC(ym3812_device::status_port_r), FUNC(ym3812_device::control_port_w));
map(0x81, 0x81).rw("ymsnd", FUNC(ym3812_device::read_port_r), FUNC(ym3812_device::write_port_w));
@@ -1875,25 +1875,25 @@ static const gfx_layout tilelayout =
RGN_FRAC(1,2), /* 16384/32768 tiles */
4, /* 4 bits per pixel */
{ RGN_FRAC(1,2)+8, RGN_FRAC(1,2), 8, 0 },
- { 0, 1, 2, 3, 4, 5, 6, 7 },
- { 0, 1*16, 2*16, 3*16, 4*16, 5*16, 6*16, 7*16 },
+ { STEP8(0,1) },
+ { STEP8(0,8*2) },
16*8 /* every tile takes 16 consecutive bytes */
};
static GFXDECODE_START( gfx_toaplan1 )
- GFXDECODE_ENTRY( "gfx1", 0x00000, tilelayout, 0, 64 )
- GFXDECODE_ENTRY( "gfx2", 0x00000, tilelayout, 64*16, 64 )
+ GFXDECODE_ENTRY( "gfx1", 0, tilelayout, 0, 64 )
+ GFXDECODE_ENTRY( "gfx2", 0, tilelayout, 64*16, 64 )
GFXDECODE_END
static GFXDECODE_START( gfx_rallybik )
- GFXDECODE_ENTRY( "gfx1", 0x00000, tilelayout, 0, 64 )
+ GFXDECODE_ENTRY( "gfx1", 0, tilelayout, 0, 64 )
GFXDECODE_END
-#define PIXEL_CLOCK (XTAL(28'000'000)/4)
+#define PIXEL_CLOCK (XTAL(28'000'000) / 4)
-// HTOTAL and VTOTAL taken from CRTC registers (toaplan1_bcu_control_w)
+// HTOTAL and VTOTAL taken from CRTC registers (bcu_control_w)
// rallybik, demonwld and outzone program a larger VTOTAL than the other
// games, giving them a lower frame rate
@@ -1913,8 +1913,8 @@ void toaplan1_rallybik_state::rallybik(machine_config &config)
M68000(config, m_maincpu, XTAL(10'000'000));
m_maincpu->set_addrmap(AS_PROGRAM, &toaplan1_rallybik_state::rallybik_main_map);
- Z80(config, m_audiocpu, XTAL(28'000'000)/8);
- m_audiocpu->set_addrmap(AS_PROGRAM, &toaplan1_rallybik_state::toaplan1_sound_map);
+ Z80(config, m_audiocpu, XTAL(28'000'000) / 8);
+ m_audiocpu->set_addrmap(AS_PROGRAM, &toaplan1_rallybik_state::sound_map);
m_audiocpu->set_addrmap(AS_IO, &toaplan1_rallybik_state::rallybik_sound_io_map);
config.m_minimum_quantum = attotime::from_hz(600);
@@ -1925,14 +1925,12 @@ void toaplan1_rallybik_state::rallybik(machine_config &config)
coinlatch.q_out_cb<6>().set(FUNC(toaplan1_rallybik_state::coin_lockout_1_w));
coinlatch.q_out_cb<7>().set(FUNC(toaplan1_rallybik_state::coin_lockout_2_w));
- MCFG_MACHINE_RESET_OVERRIDE(toaplan1_state,toaplan1)
-
/* video hardware */
SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
m_screen->set_video_attributes(VIDEO_UPDATE_BEFORE_VBLANK);
m_screen->set_raw(PIXEL_CLOCK, HTOTAL, HBEND, HBSTART, VTOTAL55, VBEND, VBSTART);
- m_screen->set_screen_update(FUNC(toaplan1_rallybik_state::screen_update_rallybik));
- m_screen->screen_vblank().set(FUNC(toaplan1_rallybik_state::screen_vblank_rallybik));
+ m_screen->set_screen_update(FUNC(toaplan1_rallybik_state::screen_update));
+ m_screen->screen_vblank().set(FUNC(toaplan1_rallybik_state::screen_vblank));
m_screen->set_palette(m_palette);
TOAPLAN_SCU(config, m_spritegen, 0);
@@ -1942,8 +1940,6 @@ void toaplan1_rallybik_state::rallybik(machine_config &config)
GFXDECODE(config, m_gfxdecode, m_palette, gfx_rallybik);
PALETTE(config, m_palette).set_format(palette_device::xBGR_555, (64*16)+(64*16));
- MCFG_VIDEO_START_OVERRIDE(toaplan1_rallybik_state,rallybik)
-
/* sound hardware */
SPEAKER(config, "mono").front_center();
@@ -1958,31 +1954,27 @@ void toaplan1_state::truxton(machine_config &config)
M68000(config, m_maincpu, XTAL(10'000'000));
m_maincpu->set_addrmap(AS_PROGRAM, &toaplan1_state::truxton_main_map);
- Z80(config, m_audiocpu, XTAL(28'000'000)/8);
- m_audiocpu->set_addrmap(AS_PROGRAM, &toaplan1_state::toaplan1_sound_map);
+ Z80(config, m_audiocpu, XTAL(28'000'000) / 8);
+ m_audiocpu->set_addrmap(AS_PROGRAM, &toaplan1_state::sound_map);
m_audiocpu->set_addrmap(AS_IO, &toaplan1_state::truxton_sound_io_map);
config.m_minimum_quantum = attotime::from_hz(600);
- MCFG_MACHINE_RESET_OVERRIDE(toaplan1_state,toaplan1)
-
/* video hardware */
SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
m_screen->set_video_attributes(VIDEO_UPDATE_BEFORE_VBLANK);
m_screen->set_raw(PIXEL_CLOCK, HTOTAL, HBEND, HBSTART, VTOTAL, VBEND, VBSTART);
- m_screen->set_screen_update(FUNC(toaplan1_state::screen_update_toaplan1));
- m_screen->screen_vblank().set(FUNC(toaplan1_state::screen_vblank_toaplan1));
+ m_screen->set_screen_update(FUNC(toaplan1_state::screen_update));
+ m_screen->screen_vblank().set(FUNC(toaplan1_state::screen_vblank));
m_screen->set_palette(m_palette);
GFXDECODE(config, m_gfxdecode, m_palette, gfx_toaplan1);
PALETTE(config, m_palette).set_format(palette_device::xBGR_555, (64*16)+(64*16));
- MCFG_VIDEO_START_OVERRIDE(toaplan1_state,toaplan1)
-
/* sound hardware */
SPEAKER(config, "mono").front_center();
- YM3812(config, m_ymsnd, XTAL(28'000'000)/8);
+ YM3812(config, m_ymsnd, XTAL(28'000'000) / 8);
m_ymsnd->irq_handler().set_inputline(m_audiocpu, 0);
m_ymsnd->add_route(ALL_OUTPUTS, "mono", 1.0);
}
@@ -1993,31 +1985,27 @@ void toaplan1_state::hellfire(machine_config &config)
M68000(config, m_maincpu, XTAL(10'000'000));
m_maincpu->set_addrmap(AS_PROGRAM, &toaplan1_state::hellfire_main_map);
- Z80(config, m_audiocpu, XTAL(28'000'000)/8);
- m_audiocpu->set_addrmap(AS_PROGRAM, &toaplan1_state::toaplan1_sound_map);
+ Z80(config, m_audiocpu, XTAL(28'000'000) / 8);
+ m_audiocpu->set_addrmap(AS_PROGRAM, &toaplan1_state::sound_map);
m_audiocpu->set_addrmap(AS_IO, &toaplan1_state::hellfire_sound_io_map);
config.m_minimum_quantum = attotime::from_hz(600);
- MCFG_MACHINE_RESET_OVERRIDE(toaplan1_state,toaplan1)
-
/* video hardware */
SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
m_screen->set_video_attributes(VIDEO_UPDATE_BEFORE_VBLANK);
m_screen->set_raw(PIXEL_CLOCK, HTOTAL, HBEND, HBSTART, VTOTAL, VBEND+16, VBSTART+16);
- m_screen->set_screen_update(FUNC(toaplan1_state::screen_update_toaplan1));
- m_screen->screen_vblank().set(FUNC(toaplan1_state::screen_vblank_toaplan1));
+ m_screen->set_screen_update(FUNC(toaplan1_state::screen_update));
+ m_screen->screen_vblank().set(FUNC(toaplan1_state::screen_vblank));
m_screen->set_palette(m_palette);
GFXDECODE(config, m_gfxdecode, m_palette, gfx_toaplan1);
PALETTE(config, m_palette).set_format(palette_device::xBGR_555, (64*16)+(64*16));
- MCFG_VIDEO_START_OVERRIDE(toaplan1_state,toaplan1)
-
/* sound hardware */
SPEAKER(config, "mono").front_center();
- YM3812(config, m_ymsnd, XTAL(28'000'000)/8);
+ YM3812(config, m_ymsnd, XTAL(28'000'000) / 8);
m_ymsnd->irq_handler().set_inputline(m_audiocpu, 0);
m_ymsnd->add_route(ALL_OUTPUTS, "mono", 1.0);
}
@@ -2028,8 +2016,8 @@ void toaplan1_state::zerowing(machine_config &config)
M68000(config, m_maincpu, XTAL(10'000'000));
m_maincpu->set_addrmap(AS_PROGRAM, &toaplan1_state::zerowing_main_map);
- Z80(config, m_audiocpu, XTAL(28'000'000)/8);
- m_audiocpu->set_addrmap(AS_PROGRAM, &toaplan1_state::toaplan1_sound_map);
+ Z80(config, m_audiocpu, XTAL(28'000'000) / 8);
+ m_audiocpu->set_addrmap(AS_PROGRAM, &toaplan1_state::sound_map);
m_audiocpu->set_addrmap(AS_IO, &toaplan1_state::zerowing_sound_io_map);
config.m_minimum_quantum = attotime::from_hz(600);
@@ -2040,94 +2028,86 @@ void toaplan1_state::zerowing(machine_config &config)
SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
m_screen->set_video_attributes(VIDEO_UPDATE_BEFORE_VBLANK);
m_screen->set_raw(PIXEL_CLOCK, HTOTAL, HBEND, HBSTART, VTOTAL, VBEND+16, VBSTART+16);
- m_screen->set_screen_update(FUNC(toaplan1_state::screen_update_toaplan1));
- m_screen->screen_vblank().set(FUNC(toaplan1_state::screen_vblank_toaplan1));
+ m_screen->set_screen_update(FUNC(toaplan1_state::screen_update));
+ m_screen->screen_vblank().set(FUNC(toaplan1_state::screen_vblank));
m_screen->set_palette(m_palette);
GFXDECODE(config, m_gfxdecode, m_palette, gfx_toaplan1);
PALETTE(config, m_palette).set_format(palette_device::xBGR_555, (64*16)+(64*16));
- MCFG_VIDEO_START_OVERRIDE(toaplan1_state,toaplan1)
-
/* sound hardware */
SPEAKER(config, "mono").front_center();
- YM3812(config, m_ymsnd, XTAL(28'000'000)/8);
+ YM3812(config, m_ymsnd, XTAL(28'000'000) / 8);
m_ymsnd->irq_handler().set_inputline(m_audiocpu, 0);
m_ymsnd->add_route(ALL_OUTPUTS, "mono", 1.0);
}
-void toaplan1_state::demonwld(machine_config &config)
+void toaplan1_demonwld_state::demonwld(machine_config &config)
{
/* basic machine hardware */
M68000(config, m_maincpu, XTAL(10'000'000));
- m_maincpu->set_addrmap(AS_PROGRAM, &toaplan1_state::demonwld_main_map);
+ m_maincpu->set_addrmap(AS_PROGRAM, &toaplan1_demonwld_state::main_map);
- Z80(config, m_audiocpu, XTAL(28'000'000)/8);
- m_audiocpu->set_addrmap(AS_PROGRAM, &toaplan1_state::toaplan1_sound_map);
- m_audiocpu->set_addrmap(AS_IO, &toaplan1_state::demonwld_sound_io_map);
+ Z80(config, m_audiocpu, XTAL(28'000'000) / 8);
+ m_audiocpu->set_addrmap(AS_PROGRAM, &toaplan1_demonwld_state::sound_map);
+ m_audiocpu->set_addrmap(AS_IO, &toaplan1_demonwld_state::sound_io_map);
- TMS32010(config, m_dsp, XTAL(28'000'000)/2);
- m_dsp->set_addrmap(AS_PROGRAM, &toaplan1_state::dsp_program_map);
- m_dsp->set_addrmap(AS_IO, &toaplan1_state::dsp_io_map);
- m_dsp->bio().set(FUNC(toaplan1_state::demonwld_bio_r));
+ TMS32010(config, m_dsp, XTAL(28'000'000) / 2);
+ m_dsp->set_addrmap(AS_PROGRAM, &toaplan1_demonwld_state::dsp_program_map);
+ m_dsp->set_addrmap(AS_IO, &toaplan1_demonwld_state::dsp_io_map);
+ m_dsp->bio().set(FUNC(toaplan1_demonwld_state::bio_r));
config.m_minimum_quantum = attotime::from_hz(600);
- MCFG_MACHINE_RESET_OVERRIDE(toaplan1_state,demonwld)
-
/* video hardware */
SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
m_screen->set_video_attributes(VIDEO_UPDATE_BEFORE_VBLANK);
m_screen->set_raw(PIXEL_CLOCK, HTOTAL, HBEND, HBSTART, VTOTAL55, VBEND+16, VBSTART+16);
- m_screen->set_screen_update(FUNC(toaplan1_state::screen_update_toaplan1));
- m_screen->screen_vblank().set(FUNC(toaplan1_state::screen_vblank_toaplan1));
+ m_screen->set_screen_update(FUNC(toaplan1_demonwld_state::screen_update));
+ m_screen->screen_vblank().set(FUNC(toaplan1_demonwld_state::screen_vblank));
m_screen->set_palette(m_palette);
GFXDECODE(config, m_gfxdecode, m_palette, gfx_toaplan1);
PALETTE(config, m_palette).set_format(palette_device::xBGR_555, (64*16)+(64*16));
- MCFG_VIDEO_START_OVERRIDE(toaplan1_state,toaplan1)
-
/* sound hardware */
SPEAKER(config, "mono").front_center();
- YM3812(config, m_ymsnd, XTAL(28'000'000)/8);
+ YM3812(config, m_ymsnd, XTAL(28'000'000) / 8);
m_ymsnd->irq_handler().set_inputline(m_audiocpu, 0);
m_ymsnd->add_route(ALL_OUTPUTS, "mono", 1.0);
}
-void toaplan1_state::samesame(machine_config &config)
+void toaplan1_samesame_state::samesame(machine_config &config)
{
/* basic machine hardware */
M68000(config, m_maincpu, XTAL(10'000'000));
- m_maincpu->set_addrmap(AS_PROGRAM, &toaplan1_state::samesame_main_map);
+ m_maincpu->set_addrmap(AS_PROGRAM, &toaplan1_samesame_state::main_map);
- Z180(config, m_audiocpu, XTAL(28'000'000)/8); /* HD647180XOFS6 CPU */
- m_audiocpu->set_addrmap(AS_PROGRAM, &toaplan1_state::samesame_hd647180_mem_map);
- m_audiocpu->set_addrmap(AS_IO, &toaplan1_state::samesame_hd647180_io_map);
+ Z180(config, m_audiocpu, XTAL(28'000'000) / 8); /* HD647180XOFS6 CPU */
+ m_audiocpu->set_addrmap(AS_PROGRAM, &toaplan1_samesame_state::hd647180_mem_map);
+ m_audiocpu->set_addrmap(AS_IO, &toaplan1_samesame_state::hd647180_io_map);
config.m_perfect_cpu_quantum = subtag("maincpu");
- MCFG_MACHINE_RESET_OVERRIDE(toaplan1_state,zerowing)
+ MCFG_MACHINE_RESET_OVERRIDE(toaplan1_samesame_state,zerowing)
/* video hardware */
SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
m_screen->set_video_attributes(VIDEO_UPDATE_BEFORE_VBLANK);
m_screen->set_raw(PIXEL_CLOCK, HTOTAL, HBEND, HBSTART, VTOTAL, VBEND, VBSTART);
- m_screen->set_screen_update(FUNC(toaplan1_state::screen_update_toaplan1));
- m_screen->screen_vblank().set(FUNC(toaplan1_state::screen_vblank_samesame));
+ m_screen->set_screen_update(FUNC(toaplan1_samesame_state::screen_update));
+ m_screen->screen_vblank().set(FUNC(toaplan1_samesame_state::screen_vblank));
m_screen->set_palette(m_palette);
GFXDECODE(config, m_gfxdecode, m_palette, gfx_toaplan1);
PALETTE(config, m_palette).set_format(palette_device::xBGR_555, (64*16)+(64*16));
- MCFG_VIDEO_START_OVERRIDE(toaplan1_state,toaplan1)
-
/* sound hardware */
SPEAKER(config, "mono").front_center();
- YM3812(config, m_ymsnd, XTAL(28'000'000)/8);
+ YM3812(config, m_ymsnd, XTAL(28'000'000) / 8);
m_ymsnd->irq_handler().set_inputline(m_audiocpu, 0);
m_ymsnd->add_route(ALL_OUTPUTS, "mono", 1.0);
}
@@ -2138,8 +2118,8 @@ void toaplan1_state::outzone(machine_config &config)
M68000(config, m_maincpu, XTAL(10'000'000));
m_maincpu->set_addrmap(AS_PROGRAM, &toaplan1_state::outzone_main_map);
- Z80(config, m_audiocpu, XTAL(28'000'000)/8);
- m_audiocpu->set_addrmap(AS_PROGRAM, &toaplan1_state::toaplan1_sound_map);
+ Z80(config, m_audiocpu, XTAL(28'000'000) / 8);
+ m_audiocpu->set_addrmap(AS_PROGRAM, &toaplan1_state::sound_map);
m_audiocpu->set_addrmap(AS_IO, &toaplan1_state::outzone_sound_io_map);
config.m_minimum_quantum = attotime::from_hz(600);
@@ -2150,19 +2130,17 @@ void toaplan1_state::outzone(machine_config &config)
SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
m_screen->set_video_attributes(VIDEO_UPDATE_BEFORE_VBLANK);
m_screen->set_raw(PIXEL_CLOCK, HTOTAL, HBEND, HBSTART, VTOTAL55, VBEND, VBSTART);
- m_screen->set_screen_update(FUNC(toaplan1_state::screen_update_toaplan1));
- m_screen->screen_vblank().set(FUNC(toaplan1_state::screen_vblank_toaplan1));
+ m_screen->set_screen_update(FUNC(toaplan1_state::screen_update));
+ m_screen->screen_vblank().set(FUNC(toaplan1_state::screen_vblank));
m_screen->set_palette(m_palette);
GFXDECODE(config, m_gfxdecode, m_palette, gfx_toaplan1);
PALETTE(config, m_palette).set_format(palette_device::xBGR_555, (64*16)+(64*16));
- MCFG_VIDEO_START_OVERRIDE(toaplan1_state,toaplan1)
-
/* sound hardware */
SPEAKER(config, "mono").front_center();
- YM3812(config, m_ymsnd, XTAL(28'000'000)/8);
+ YM3812(config, m_ymsnd, XTAL(28'000'000) / 8);
m_ymsnd->irq_handler().set_inputline(m_audiocpu, 0);
m_ymsnd->add_route(ALL_OUTPUTS, "mono", 1.0);
}
@@ -2173,8 +2151,8 @@ void toaplan1_state::outzonecv(machine_config &config)
M68000(config, m_maincpu, XTAL(10'000'000));
m_maincpu->set_addrmap(AS_PROGRAM, &toaplan1_state::outzonecv_main_map);
- Z80(config, m_audiocpu, XTAL(28'000'000)/8);
- m_audiocpu->set_addrmap(AS_PROGRAM, &toaplan1_state::toaplan1_sound_map);
+ Z80(config, m_audiocpu, XTAL(28'000'000) / 8);
+ m_audiocpu->set_addrmap(AS_PROGRAM, &toaplan1_state::sound_map);
m_audiocpu->set_addrmap(AS_IO, &toaplan1_state::zerowing_sound_io_map);
config.m_minimum_quantum = attotime::from_hz(600);
@@ -2185,19 +2163,17 @@ void toaplan1_state::outzonecv(machine_config &config)
SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
m_screen->set_video_attributes(VIDEO_UPDATE_BEFORE_VBLANK);
m_screen->set_raw(PIXEL_CLOCK, HTOTAL, HBEND, HBSTART, VTOTAL, VBEND, VBSTART);
- m_screen->set_screen_update(FUNC(toaplan1_state::screen_update_toaplan1));
- m_screen->screen_vblank().set(FUNC(toaplan1_state::screen_vblank_toaplan1));
+ m_screen->set_screen_update(FUNC(toaplan1_state::screen_update));
+ m_screen->screen_vblank().set(FUNC(toaplan1_state::screen_vblank));
m_screen->set_palette(m_palette);
GFXDECODE(config, m_gfxdecode, m_palette, gfx_toaplan1);
PALETTE(config, m_palette).set_format(palette_device::xBGR_555, (64*16)+(64*16));
- MCFG_VIDEO_START_OVERRIDE(toaplan1_state,toaplan1)
-
/* sound hardware */
SPEAKER(config, "mono").front_center();
- YM3812(config, m_ymsnd, XTAL(28'000'000)/8);
+ YM3812(config, m_ymsnd, XTAL(28'000'000) / 8);
m_ymsnd->irq_handler().set_inputline(m_audiocpu, 0);
m_ymsnd->add_route(ALL_OUTPUTS, "mono", 1.0);
}
@@ -2205,34 +2181,32 @@ void toaplan1_state::outzonecv(machine_config &config)
void toaplan1_state::vimana(machine_config &config)
{
/* basic machine hardware */
- M68000(config, m_maincpu, XTAL(10'000'000)); /* verified on pcb */
+ M68000(config, m_maincpu, XTAL(10'000'000)); /* verified on pcb */
m_maincpu->set_addrmap(AS_PROGRAM, &toaplan1_state::vimana_main_map);
- Z180(config, m_audiocpu, XTAL(28'000'000)/8); /* HD647180XOFS6 CPU */
+ Z180(config, m_audiocpu, XTAL(28'000'000) / 8); /* HD647180XOFS6 CPU */
m_audiocpu->set_addrmap(AS_PROGRAM, &toaplan1_state::vimana_hd647180_mem_map);
m_audiocpu->set_addrmap(AS_IO, &toaplan1_state::vimana_hd647180_io_map);
config.m_minimum_quantum = attotime::from_hz(600);
- MCFG_MACHINE_RESET_OVERRIDE(toaplan1_state,vimana)
+ MCFG_MACHINE_RESET_OVERRIDE(toaplan1_state,zerowing)
/* video hardware */
SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
m_screen->set_video_attributes(VIDEO_UPDATE_BEFORE_VBLANK);
m_screen->set_raw(PIXEL_CLOCK, HTOTAL, HBEND, HBSTART, VTOTAL, VBEND, VBSTART);
- m_screen->set_screen_update(FUNC(toaplan1_state::screen_update_toaplan1));
- m_screen->screen_vblank().set(FUNC(toaplan1_state::screen_vblank_toaplan1));
+ m_screen->set_screen_update(FUNC(toaplan1_state::screen_update));
+ m_screen->screen_vblank().set(FUNC(toaplan1_state::screen_vblank));
m_screen->set_palette(m_palette);
GFXDECODE(config, m_gfxdecode, m_palette, gfx_toaplan1);
PALETTE(config, m_palette).set_format(palette_device::xBGR_555, (64*16)+(64*16));
- MCFG_VIDEO_START_OVERRIDE(toaplan1_state,toaplan1)
-
/* sound hardware */
SPEAKER(config, "mono").front_center();
- YM3812(config, m_ymsnd, XTAL(28'000'000)/8); /* verified on pcb */
+ YM3812(config, m_ymsnd, XTAL(28'000'000) / 8); /* verified on pcb */
m_ymsnd->irq_handler().set_inputline(m_audiocpu, 0);
m_ymsnd->add_route(ALL_OUTPUTS, "mono", 1.0);
}
@@ -2870,6 +2844,33 @@ ROM_START( fireshrkdh )
ROM_LOAD( "prom15.20c", 0x20, 0x20, CRC(a1e17492) SHA1(9ddec4c97f2d541f69f3c32c47aaa21fd9699ae2) ) /* ??? */
ROM_END
+ROM_START( samesamecn )
+ ROM_REGION( 0x080000, "maincpu", 0 ) /* Main 68K code */
+ ROM_LOAD16_BYTE( "o17-09-h2.8j",0x000000, 0x08000, CRC(fc8c2420) SHA1(cf8333d3749213f2007467d3a80bd36ff7b4ce92) ) /* The actual label is stamped with the letter "H" and separate "2" */
+ ROM_LOAD16_BYTE( "o17_10-h2.8l",0x000001, 0x08000, CRC(cc0ffbeb) SHA1(1cf85f68b4e368294069053ba8f5710d6c557ede) ) /* The actual label is stamped with the letter "H" and separate "2" */
+ ROM_LOAD16_BYTE( "o17-11-2.7j", 0x040000, 0x20000, CRC(6beac378) SHA1(041ba98a89a4bac32575858db8a061bdf7804594) ) /* The actual label is stamped with the number "2" */
+ ROM_LOAD16_BYTE( "o17-12-2.7l", 0x040001, 0x20000, CRC(6adb6eb5) SHA1(9b6e63aa50d271c2bb0b4cf822fc6f3684f10230) ) /* The actual label is stamped with the number "2" */
+
+ ROM_REGION( 0x8000, "audiocpu", 0 ) /* Sound HD647180 code */
+ ROM_LOAD( "hd647180.017", 0x00000, 0x08000, CRC(43523032) SHA1(1b94003a00e7bf6bdf1b1b946f42ff5d04629949) )
+
+ ROM_REGION( 0x80000, "gfx1", 0 )
+ ROM_LOAD16_BYTE( "o17_05.12j", 0x00000, 0x20000, CRC(565315f8) SHA1(6b1c5ef52359483228b329c89c2e1174e3fbf017) )
+ ROM_LOAD16_BYTE( "o17_06.13j", 0x00001, 0x20000, CRC(95262d4c) SHA1(16f3aabecb1c87ce7eadf4f0ff61b29a4c017614) )
+ ROM_LOAD16_BYTE( "o17_07.12l", 0x40000, 0x20000, CRC(4c4b735c) SHA1(812c3bf46bd7764b2bb812bd2b9eb0331ed257ae) )
+ ROM_LOAD16_BYTE( "o17_08.13l", 0x40001, 0x20000, CRC(95c6586c) SHA1(ff87901f79d80f73ad09664b0c0d892898570616) )
+
+ ROM_REGION( 0x80000, "gfx2", 0 )
+ ROM_LOAD16_BYTE( "o17_01.1d", 0x00000, 0x20000, CRC(ea12e491) SHA1(02190722b7c5383471e0af9596be7039a5367240) )
+ ROM_LOAD16_BYTE( "o17_02.3d", 0x00001, 0x20000, CRC(32a13a9f) SHA1(1446acdfd21cd41f3d97aaf30f498c0c5d890605) )
+ ROM_LOAD16_BYTE( "o17_03.5d", 0x40000, 0x20000, CRC(68723dc9) SHA1(4f1b7aa2469c955e03737b611a7d2524f1e4f61e) )
+ ROM_LOAD16_BYTE( "o17_04.7d", 0x40001, 0x20000, CRC(fe0ecb13) SHA1(634a49262b9c092c25f11b14c6757fe94ea9eddc) )
+
+ ROM_REGION( 0x40, "proms", 0 ) /* nibble bproms, lo/hi order to be determined */
+ ROM_LOAD( "prom14.25b", 0x00, 0x20, CRC(bc88cced) SHA1(5055362710c0f58823c05fb4c0e0eec638b91e3d) ) /* sprite attribute (flip/position) ?? */
+ ROM_LOAD( "prom15.20c", 0x20, 0x20, CRC(a1e17492) SHA1(9ddec4c97f2d541f69f3c32c47aaa21fd9699ae2) ) /* ??? */
+ROM_END
+
ROM_START( outzone )
ROM_REGION( 0x040000, "maincpu", 0 ) /* Main 68K code */
ROM_LOAD16_BYTE( "tp_018_07.bin", 0x000001, 0x20000, CRC(9704db16) SHA1(12b43a6961a7f63f29563eb77aaacb70d3c368dd) )
@@ -3100,56 +3101,42 @@ ROM_START( vimanaj )
ROM_END
-void toaplan1_state::init_toaplan1()
-{
- toaplan1_driver_savestate();
-}
-
-void toaplan1_state::init_demonwld()
-{
- toaplan1_driver_savestate();
- demonwld_driver_savestate();
-}
-
-
-
-
-
-GAME( 1988, rallybik, 0, rallybik, rallybik, toaplan1_rallybik_state, init_toaplan1, ROT270, "Toaplan / Taito Corporation", "Rally Bike / Dash Yarou", 0 )
+GAME( 1988, rallybik, 0, rallybik, rallybik, toaplan1_rallybik_state, empty_init, ROT270, "Toaplan / Taito Corporation", "Rally Bike / Dash Yarou", 0 )
-GAME( 1988, truxton, 0, truxton, truxton, toaplan1_state, init_toaplan1, ROT270, "Toaplan / Taito Corporation", "Truxton / Tatsujin", 0 )
+GAME( 1988, truxton, 0, truxton, truxton, toaplan1_state, empty_init, ROT270, "Toaplan / Taito Corporation", "Truxton / Tatsujin", 0 )
-GAME( 1989, hellfire, 0, hellfire, hellfire, toaplan1_state, init_toaplan1, ROT0, "Toaplan (Taito license)", "Hellfire (2P set)", 0 )
-GAME( 1989, hellfire1, hellfire, hellfire, hellfire1, toaplan1_state, init_toaplan1, ROT0, "Toaplan (Taito license)", "Hellfire (1P set)", 0 )
-GAME( 1989, hellfire2a, hellfire, hellfire, hellfire2a,toaplan1_state, init_toaplan1, ROT0, "Toaplan (Taito license)", "Hellfire (2P set, older)", 0 )
-GAME( 1989, hellfire1a, hellfire, hellfire, hellfire1a,toaplan1_state, init_toaplan1, ROT0, "Toaplan (Taito license)", "Hellfire (1P set, older)", 0 )
+GAME( 1989, hellfire, 0, hellfire, hellfire, toaplan1_state, empty_init, ROT0, "Toaplan (Taito license)", "Hellfire (2P set)", 0 )
+GAME( 1989, hellfire1, hellfire, hellfire, hellfire1, toaplan1_state, empty_init, ROT0, "Toaplan (Taito license)", "Hellfire (1P set)", 0 )
+GAME( 1989, hellfire2a, hellfire, hellfire, hellfire2a,toaplan1_state, empty_init, ROT0, "Toaplan (Taito license)", "Hellfire (2P set, older)", 0 )
+GAME( 1989, hellfire1a, hellfire, hellfire, hellfire1a,toaplan1_state, empty_init, ROT0, "Toaplan (Taito license)", "Hellfire (1P set, older)", 0 )
-GAME( 1989, zerowing, 0, zerowing, zerowing2, toaplan1_state, init_toaplan1, ROT0, "Toaplan", "Zero Wing (2P set)", 0 )
-GAME( 1989, zerowing1, zerowing, zerowing, zerowing, toaplan1_state, init_toaplan1, ROT0, "Toaplan", "Zero Wing (1P set)", 0 )
-GAME( 1989, zerowingw, zerowing, zerowing, zerowing2, toaplan1_state, init_toaplan1, ROT0, "Toaplan (Williams license)", "Zero Wing (2P set, Williams license)", 0 )
+GAME( 1989, zerowing, 0, zerowing, zerowing2, toaplan1_state, empty_init, ROT0, "Toaplan", "Zero Wing (2P set)", 0 )
+GAME( 1989, zerowing1, zerowing, zerowing, zerowing, toaplan1_state, empty_init, ROT0, "Toaplan", "Zero Wing (1P set)", 0 )
+GAME( 1989, zerowingw, zerowing, zerowing, zerowing2, toaplan1_state, empty_init, ROT0, "Toaplan (Williams license)", "Zero Wing (2P set, Williams license)", 0 )
-GAME( 1990, demonwld, 0, demonwld, demonwld, toaplan1_state, init_demonwld, ROT0, "Toaplan", "Demon's World / Horror Story (set 1)", 0 )
-GAME( 1989, demonwld1, demonwld, demonwld, demonwld, toaplan1_state, init_demonwld, ROT0, "Toaplan", "Demon's World / Horror Story (set 2)", 0 )
-GAME( 1989, demonwld2, demonwld, demonwld, demonwld1, toaplan1_state, init_demonwld, ROT0, "Toaplan", "Demon's World / Horror Story (set 3)", 0 )
-GAME( 1989, demonwld3, demonwld, demonwld, demonwld1, toaplan1_state, init_demonwld, ROT0, "Toaplan", "Demon's World / Horror Story (set 4)", 0 )
-GAME( 1989, demonwld4, demonwld, demonwld, demonwld1, toaplan1_state, init_demonwld, ROT0, "Toaplan", "Demon's World / Horror Story (set 5)", 0 )
+GAME( 1990, demonwld, 0, demonwld, demonwld, toaplan1_demonwld_state, empty_init, ROT0, "Toaplan", "Demon's World / Horror Story (set 1)", 0 )
+GAME( 1989, demonwld1, demonwld, demonwld, demonwld, toaplan1_demonwld_state, empty_init, ROT0, "Toaplan", "Demon's World / Horror Story (set 2)", 0 )
+GAME( 1989, demonwld2, demonwld, demonwld, demonwld1, toaplan1_demonwld_state, empty_init, ROT0, "Toaplan", "Demon's World / Horror Story (set 3)", 0 )
+GAME( 1989, demonwld3, demonwld, demonwld, demonwld1, toaplan1_demonwld_state, empty_init, ROT0, "Toaplan", "Demon's World / Horror Story (set 4)", 0 )
+GAME( 1989, demonwld4, demonwld, demonwld, demonwld1, toaplan1_demonwld_state, empty_init, ROT0, "Toaplan", "Demon's World / Horror Story (set 5)", 0 )
-GAME( 1990, fireshrk, 0, samesame, fireshrk, toaplan1_state, init_toaplan1, ROT270, "Toaplan", "Fire Shark", 0 )
-GAME( 1989, fireshrka, fireshrk, samesame, fireshrka, toaplan1_state, init_toaplan1, ROT270, "Toaplan", "Fire Shark (earlier)", 0 )
-GAME( 1990, fireshrkd, fireshrk, samesame, samesame2, toaplan1_state, init_toaplan1, ROT270, "Toaplan (Dooyong license)", "Fire Shark (Korea, set 1, easier)", 0 )
-GAME( 1990, fireshrkdh, fireshrk, samesame, samesame2, toaplan1_state, init_toaplan1, ROT270, "Toaplan (Dooyong license)", "Fire Shark (Korea, set 2, harder)", 0 )
-GAME( 1989, samesame, fireshrk, samesame, samesame, toaplan1_state, init_toaplan1, ROT270, "Toaplan", "Same! Same! Same! (1P set)", 0 )
-GAME( 1989, samesame2, fireshrk, samesame, samesame2, toaplan1_state, init_toaplan1, ROT270, "Toaplan", "Same! Same! Same! (2P set)", 0 )
-GAME( 2015, samesamenh, fireshrk, samesame, samesame, toaplan1_state, init_toaplan1, ROT270, "hack (trap15)", "Same! Same! Same! (1P set, NEW VER! hack)", 0 )
+GAME( 1990, fireshrk, 0, samesame, fireshrk, toaplan1_samesame_state, empty_init, ROT270, "Toaplan", "Fire Shark", 0 )
+GAME( 1989, fireshrka, fireshrk, samesame, fireshrka, toaplan1_samesame_state, empty_init, ROT270, "Toaplan", "Fire Shark (earlier)", 0 )
+GAME( 1990, fireshrkd, fireshrk, samesame, samesame2, toaplan1_samesame_state, empty_init, ROT270, "Toaplan (Dooyong license)", "Fire Shark (Korea, set 1, easier)", 0 )
+GAME( 1990, fireshrkdh, fireshrk, samesame, samesame2, toaplan1_samesame_state, empty_init, ROT270, "Toaplan (Dooyong license)", "Fire Shark (Korea, set 2, harder)", 0 )
+GAME( 1989, samesame, fireshrk, samesame, samesame, toaplan1_samesame_state, empty_init, ROT270, "Toaplan", "Same! Same! Same! (1P set)", 0 )
+GAME( 1989, samesame2, fireshrk, samesame, samesame2, toaplan1_samesame_state, empty_init, ROT270, "Toaplan", "Same! Same! Same! (2P set)", 0 )
+GAME( 1990, samesamecn, fireshrk, samesame, samesame2, toaplan1_samesame_state, empty_init, ROT270, "Toaplan (Hong Kong Honest Trading license)", "Jiao! Jiao! Jiao! (China, 2P set)", 0 )
+GAME( 2015, samesamenh, fireshrk, samesame, samesame, toaplan1_samesame_state, empty_init, ROT270, "hack (trap15)", "Same! Same! Same! (1P set, NEW VER! hack)", 0 )
-GAME( 1990, outzone, 0, outzone, outzone, toaplan1_state, init_toaplan1, ROT270, "Toaplan", "Out Zone", 0 )
-GAME( 1990, outzoneh, outzone, outzone, outzone, toaplan1_state, init_toaplan1, ROT270, "Toaplan", "Out Zone (harder)", 0 )
-GAME( 1990, outzonea, outzone, outzone, outzonea, toaplan1_state, init_toaplan1, ROT270, "Toaplan", "Out Zone (old set)", 0 )
-GAME( 1990, outzoneb, outzone, outzone, outzonea, toaplan1_state, init_toaplan1, ROT270, "Toaplan", "Out Zone (older set)", 0 )
-GAME( 1990, outzonec, outzone, outzone, outzonec, toaplan1_state, init_toaplan1, ROT270, "Toaplan", "Out Zone (oldest set)", MACHINE_IMPERFECT_SOUND ) // prototype?
-GAME( 1990, outzonecv, outzone, outzonecv,outzone, toaplan1_state, init_toaplan1, ROT270, "Toaplan", "Out Zone (Zero Wing TP-015 PCB conversion)", 0 )
+GAME( 1990, outzone, 0, outzone, outzone, toaplan1_state, empty_init, ROT270, "Toaplan", "Out Zone", 0 )
+GAME( 1990, outzoneh, outzone, outzone, outzone, toaplan1_state, empty_init, ROT270, "Toaplan", "Out Zone (harder)", 0 )
+GAME( 1990, outzonea, outzone, outzone, outzonea, toaplan1_state, empty_init, ROT270, "Toaplan", "Out Zone (old set)", 0 )
+GAME( 1990, outzoneb, outzone, outzone, outzonea, toaplan1_state, empty_init, ROT270, "Toaplan", "Out Zone (older set)", 0 )
+GAME( 1990, outzonec, outzone, outzone, outzonec, toaplan1_state, empty_init, ROT270, "Toaplan", "Out Zone (oldest set)", MACHINE_IMPERFECT_SOUND ) // prototype?
+GAME( 1990, outzonecv, outzone, outzonecv,outzone, toaplan1_state, empty_init, ROT270, "Toaplan", "Out Zone (Zero Wing TP-015 PCB conversion)", 0 )
// has various licenses / regions depending on jumpers, including Tecmo
-GAME( 1991, vimana, 0, vimana, vimana, toaplan1_state, init_toaplan1, ROT270, "Toaplan", "Vimana (World, set 1)", 0 )
-GAME( 1991, vimanan, vimana, vimana, vimanan, toaplan1_state, init_toaplan1, ROT270, "Toaplan", "Vimana (World, set 2)", 0 )
-GAME( 1991, vimanaj, vimana, vimana, vimanaj, toaplan1_state, init_toaplan1, ROT270, "Toaplan", "Vimana (Japan)", 0 )
+GAME( 1991, vimana, 0, vimana, vimana, toaplan1_state, empty_init, ROT270, "Toaplan", "Vimana (World, set 1)", 0 )
+GAME( 1991, vimanan, vimana, vimana, vimanan, toaplan1_state, empty_init, ROT270, "Toaplan", "Vimana (World, set 2)", 0 )
+GAME( 1991, vimanaj, vimana, vimana, vimanaj, toaplan1_state, empty_init, ROT270, "Toaplan", "Vimana (Japan)", 0 )
diff --git a/src/mame/drivers/toaplan2.cpp b/src/mame/drivers/toaplan2.cpp
index 88b073d29a5..e0294a4002b 100644
--- a/src/mame/drivers/toaplan2.cpp
+++ b/src/mame/drivers/toaplan2.cpp
@@ -3205,8 +3205,8 @@ static GFXDECODE_START( gfx_batrider )
GFXDECODE_END
-MACHINE_CONFIG_START(toaplan2_state::tekipaki)
-
+void toaplan2_state::tekipaki(machine_config &config)
+{
/* basic machine hardware */
M68000(config, m_maincpu, 10_MHz_XTAL); // 10MHz Oscillator
m_maincpu->set_addrmap(AS_PROGRAM, &toaplan2_state::tekipaki_68k_mem);
@@ -3215,7 +3215,7 @@ MACHINE_CONFIG_START(toaplan2_state::tekipaki)
m_audiocpu->set_addrmap(AS_PROGRAM, &toaplan2_state::hd647180_mem_map);
m_audiocpu->set_addrmap(AS_IO, &toaplan2_state::hd647180_io_map);
- MCFG_QUANTUM_TIME(attotime::from_hz(600))
+ config.m_minimum_quantum = attotime::from_hz(600);
MCFG_MACHINE_RESET_OVERRIDE(toaplan2_state,toaplan2)
@@ -3246,10 +3246,10 @@ MACHINE_CONFIG_START(toaplan2_state::tekipaki)
ym3812_device &ymsnd(YM3812(config, "ymsnd", 27_MHz_XTAL/8));
ymsnd.irq_handler().set_inputline(m_audiocpu, 0);
ymsnd.add_route(ALL_OUTPUTS, "mono", 1.0);
-MACHINE_CONFIG_END
-
-MACHINE_CONFIG_START(toaplan2_state::ghox)
+}
+void toaplan2_state::ghox(machine_config &config)
+{
/* basic machine hardware */
M68000(config, m_maincpu, 10_MHz_XTAL); /* verified on pcb */
m_maincpu->set_addrmap(AS_PROGRAM, &toaplan2_state::ghox_68k_mem);
@@ -3257,7 +3257,7 @@ MACHINE_CONFIG_START(toaplan2_state::ghox)
Z180(config, m_audiocpu, 10_MHz_XTAL); /* HD647180 CPU actually */
m_audiocpu->set_addrmap(AS_PROGRAM, &toaplan2_state::ghox_hd647180_mem_map);
- MCFG_QUANTUM_TIME(attotime::from_hz(600))
+ config.m_minimum_quantum = attotime::from_hz(600);
MCFG_MACHINE_RESET_OVERRIDE(toaplan2_state,ghox)
@@ -3284,7 +3284,7 @@ MACHINE_CONFIG_START(toaplan2_state::ghox)
SPEAKER(config, "mono").front_center();
YM2151(config, "ymsnd", 27_MHz_XTAL/8).add_route(ALL_OUTPUTS, "mono", 1.0); // verified on pcb
-MACHINE_CONFIG_END
+}
/* probably dogyuun, vfive and kbash use the same decryption table;
those 3 games have been seen with the NITRO905 chip, other alias are
@@ -3336,8 +3336,8 @@ a4849 cd
*/
-MACHINE_CONFIG_START(toaplan2_state::dogyuun)
-
+void toaplan2_state::dogyuun(machine_config &config)
+{
/* basic machine hardware */
M68000(config, m_maincpu, 25_MHz_XTAL/2); /* verified on pcb */
m_maincpu->set_addrmap(AS_PROGRAM, &toaplan2_state::dogyuun_68k_mem);
@@ -3376,11 +3376,11 @@ MACHINE_CONFIG_START(toaplan2_state::dogyuun)
OKIM6295(config, m_oki[0], 25_MHz_XTAL/24, okim6295_device::PIN7_HIGH); // verified on PCB
m_oki[0]->add_route(ALL_OUTPUTS, "mono", 0.5);
-MACHINE_CONFIG_END
-
+}
-MACHINE_CONFIG_START(toaplan2_state::kbash)
+void toaplan2_state::kbash(machine_config &config)
+{
/* basic machine hardware */
M68000(config, m_maincpu, 16_MHz_XTAL); /* 16MHz Oscillator */
m_maincpu->set_addrmap(AS_PROGRAM, &toaplan2_state::kbash_68k_mem);
@@ -3420,11 +3420,11 @@ MACHINE_CONFIG_START(toaplan2_state::kbash)
OKIM6295(config, m_oki[0], 32_MHz_XTAL/32, okim6295_device::PIN7_HIGH);
m_oki[0]->add_route(ALL_OUTPUTS, "mono", 0.5);
-MACHINE_CONFIG_END
-
+}
-MACHINE_CONFIG_START(toaplan2_state::kbash2)
+void toaplan2_state::kbash2(machine_config &config)
+{
/* basic machine hardware */
M68000(config, m_maincpu, 16_MHz_XTAL); /* 16MHz Oscillator */
m_maincpu->set_addrmap(AS_PROGRAM, &toaplan2_state::kbash2_68k_mem);
@@ -3456,11 +3456,11 @@ MACHINE_CONFIG_START(toaplan2_state::kbash2)
OKIM6295(config, m_oki[1], 16_MHz_XTAL/16, okim6295_device::PIN7_HIGH);
m_oki[1]->add_route(ALL_OUTPUTS, "mono", 1.0);
-MACHINE_CONFIG_END
-
+}
-MACHINE_CONFIG_START(toaplan2_state::truxton2)
+void toaplan2_state::truxton2(machine_config &config)
+{
/* basic machine hardware */
M68000(config, m_maincpu, 16_MHz_XTAL); /* verified on pcb */
m_maincpu->set_addrmap(AS_PROGRAM, &toaplan2_state::truxton2_68k_mem);
@@ -3500,11 +3500,11 @@ MACHINE_CONFIG_START(toaplan2_state::truxton2)
OKIM6295(config, m_oki[0], 16_MHz_XTAL/4, okim6295_device::PIN7_LOW); // verified on PCB
m_oki[0]->add_route(ALL_OUTPUTS, "mono", 1.0);
#endif
-MACHINE_CONFIG_END
-
+}
-MACHINE_CONFIG_START(toaplan2_state::pipibibs)
+void toaplan2_state::pipibibs(machine_config &config)
+{
/* basic machine hardware */
M68000(config, m_maincpu, 10_MHz_XTAL); // verified on PCB
m_maincpu->set_addrmap(AS_PROGRAM, &toaplan2_state::pipibibs_68k_mem);
@@ -3512,7 +3512,7 @@ MACHINE_CONFIG_START(toaplan2_state::pipibibs)
Z80(config, m_audiocpu, 27_MHz_XTAL/8); // verified on PCB
m_audiocpu->set_addrmap(AS_PROGRAM, &toaplan2_state::pipibibs_sound_z80_mem);
- MCFG_QUANTUM_TIME(attotime::from_hz(600))
+ config.m_minimum_quantum = attotime::from_hz(600);
MCFG_MACHINE_RESET_OVERRIDE(toaplan2_state,toaplan2)
@@ -3541,20 +3541,20 @@ MACHINE_CONFIG_START(toaplan2_state::pipibibs)
ym3812_device &ymsnd(YM3812(config, "ymsnd", 27_MHz_XTAL/8)); // verified on PCB
ymsnd.irq_handler().set_inputline(m_audiocpu, 0);
ymsnd.add_route(ALL_OUTPUTS, "mono", 1.0);
-MACHINE_CONFIG_END
-
+}
-MACHINE_CONFIG_START(toaplan2_state::pipibibsbl)
+void toaplan2_state::pipibibsbl(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M68000, 12_MHz_XTAL) // ??? (position labeled "68000-12" but 10 MHz-rated parts used)
- MCFG_DEVICE_PROGRAM_MAP(pipibibi_bootleg_68k_mem)
- MCFG_DEVICE_IRQ_ACKNOWLEDGE_DRIVER(toaplan2_state, pipibibsbl_irq_ack)
+ M68000(config, m_maincpu, 12_MHz_XTAL); // ??? (position labeled "68000-12" but 10 MHz-rated parts used)
+ m_maincpu->set_addrmap(AS_PROGRAM, &toaplan2_state::pipibibi_bootleg_68k_mem);
+ m_maincpu->set_irq_acknowledge_callback(FUNC(toaplan2_state::pipibibsbl_irq_ack));
Z80(config, m_audiocpu, 12_MHz_XTAL / 2); // GoldStar Z8400B; clock source and divider unknown
m_audiocpu->set_addrmap(AS_PROGRAM, &toaplan2_state::pipibibs_sound_z80_mem);
- MCFG_QUANTUM_TIME(attotime::from_hz(600))
+ config.m_minimum_quantum = attotime::from_hz(600);
MCFG_MACHINE_RESET_OVERRIDE(toaplan2_state,toaplan2)
@@ -3580,7 +3580,7 @@ MACHINE_CONFIG_START(toaplan2_state::pipibibsbl)
ym3812_device &ymsnd(YM3812(config, "ymsnd", 28.322_MHz_XTAL / 8)); // ???
ymsnd.irq_handler().set_inputline(m_audiocpu, 0);
ymsnd.add_route(ALL_OUTPUTS, "mono", 1.0);
-MACHINE_CONFIG_END
+}
/* x = modified to match batsugun 'unencrypted' code - '?' likewise, but not so sure about them */
/* e = opcodes used in the EEPROM service routine */
@@ -3621,8 +3621,8 @@ static const uint8_t ts001turbo_decryption_table[256] = {
};
-MACHINE_CONFIG_START(toaplan2_state::fixeight)
-
+void toaplan2_state::fixeight(machine_config &config)
+{
/* basic machine hardware */
M68000(config, m_maincpu, 16_MHz_XTAL); // verified on PCB
m_maincpu->set_addrmap(AS_PROGRAM, &toaplan2_state::fixeight_68k_mem);
@@ -3659,15 +3659,15 @@ MACHINE_CONFIG_START(toaplan2_state::fixeight)
OKIM6295(config, m_oki[0], 16_MHz_XTAL/16, okim6295_device::PIN7_HIGH); /* verified on pcb */
m_oki[0]->add_route(ALL_OUTPUTS, "mono", 0.5);
-MACHINE_CONFIG_END
-
+}
-MACHINE_CONFIG_START(toaplan2_state::fixeightbl)
+void toaplan2_state::fixeightbl(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M68000, XTAL(10'000'000)) /* 10MHz Oscillator */
- MCFG_DEVICE_PROGRAM_MAP(fixeightbl_68k_mem)
- MCFG_DEVICE_IRQ_ACKNOWLEDGE_DRIVER(toaplan2_state, fixeightbl_irq_ack)
+ M68000(config, m_maincpu, XTAL(10'000'000)); /* 10MHz Oscillator */
+ m_maincpu->set_addrmap(AS_PROGRAM, &toaplan2_state::fixeightbl_68k_mem);
+ m_maincpu->set_irq_acknowledge_callback(FUNC(toaplan2_state::fixeightbl_irq_ack));
/* video hardware */
SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
@@ -3695,11 +3695,11 @@ MACHINE_CONFIG_START(toaplan2_state::fixeightbl)
OKIM6295(config, m_oki[0], 14_MHz_XTAL/16, okim6295_device::PIN7_LOW);
m_oki[0]->add_route(ALL_OUTPUTS, "mono", 1.0);
m_oki[0]->set_addrmap(0, &toaplan2_state::fixeightbl_oki);
-MACHINE_CONFIG_END
-
+}
-MACHINE_CONFIG_START(toaplan2_state::vfive)
+void toaplan2_state::vfive(machine_config &config)
+{
/* basic machine hardware */
M68000(config, m_maincpu, 20_MHz_XTAL/2); // verified on PCB
m_maincpu->set_addrmap(AS_PROGRAM, &toaplan2_state::vfive_68k_mem);
@@ -3732,11 +3732,11 @@ MACHINE_CONFIG_START(toaplan2_state::vfive)
SPEAKER(config, "mono").front_center();
YM2151(config, "ymsnd", 27_MHz_XTAL/8).add_route(ALL_OUTPUTS, "mono", 1.0); // verified on PCB
-MACHINE_CONFIG_END
-
+}
-MACHINE_CONFIG_START(toaplan2_state::batsugun)
+void toaplan2_state::batsugun(machine_config &config)
+{
/* basic machine hardware */
M68000(config, m_maincpu, 32_MHz_XTAL/2); // 16MHz, 32MHz Oscillator
m_maincpu->set_addrmap(AS_PROGRAM, &toaplan2_state::batsugun_68k_mem);
@@ -3777,10 +3777,10 @@ MACHINE_CONFIG_START(toaplan2_state::batsugun)
OKIM6295(config, m_oki[0], 32_MHz_XTAL/8, okim6295_device::PIN7_LOW);
m_oki[0]->add_route(ALL_OUTPUTS, "mono", 0.5);
-MACHINE_CONFIG_END
-
-MACHINE_CONFIG_START(toaplan2_state::pwrkick)
+}
+void toaplan2_state::pwrkick(machine_config &config)
+{
/* basic machine hardware */
M68000(config, m_maincpu, 16_MHz_XTAL);
m_maincpu->set_addrmap(AS_PROGRAM, &toaplan2_state::pwrkick_68k_mem);
@@ -3812,9 +3812,10 @@ MACHINE_CONFIG_START(toaplan2_state::pwrkick)
// empty YM2151 socket
OKIM6295(config, m_oki[0], 27_MHz_XTAL/8, okim6295_device::PIN7_HIGH); // not confirmed
m_oki[0]->add_route(ALL_OUTPUTS, "mono", 0.5);
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(toaplan2_state::othldrby)
+void toaplan2_state::othldrby(machine_config &config)
+{
/* basic machine hardware */
M68000(config, m_maincpu, 16_MHz_XTAL);
m_maincpu->set_addrmap(AS_PROGRAM, &toaplan2_state::othldrby_68k_mem);
@@ -3844,10 +3845,11 @@ MACHINE_CONFIG_START(toaplan2_state::othldrby)
OKIM6295(config, m_oki[0], 27_MHz_XTAL/8, okim6295_device::PIN7_HIGH); // not confirmed
m_oki[0]->add_route(ALL_OUTPUTS, "mono", 0.5);
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(toaplan2_state::enmadaio)
+void toaplan2_state::enmadaio(machine_config &config)
+{
/* basic machine hardware */
M68000(config, m_maincpu, 20_MHz_XTAL/2);
m_maincpu->set_addrmap(AS_PROGRAM, &toaplan2_state::enmadaio_68k_mem);
@@ -3876,10 +3878,10 @@ MACHINE_CONFIG_START(toaplan2_state::enmadaio)
OKIM6295(config, m_oki[0], 16_MHz_XTAL/4, okim6295_device::PIN7_LOW); // pin7 not confirmed
m_oki[0]->set_addrmap(0, &toaplan2_state::enmadaio_oki);
m_oki[0]->add_route(ALL_OUTPUTS, "mono", 0.5);
-MACHINE_CONFIG_END
-
-MACHINE_CONFIG_START(toaplan2_state::snowbro2)
+}
+void toaplan2_state::snowbro2(machine_config &config)
+{
/* basic machine hardware */
M68000(config, m_maincpu, 16_MHz_XTAL);
m_maincpu->set_addrmap(AS_PROGRAM, &toaplan2_state::snowbro2_68k_mem);
@@ -3910,11 +3912,11 @@ MACHINE_CONFIG_START(toaplan2_state::snowbro2)
OKIM6295(config, m_oki[0], 27_MHz_XTAL/10, okim6295_device::PIN7_HIGH);
m_oki[0]->add_route(ALL_OUTPUTS, "mono", 1.0);
-MACHINE_CONFIG_END
-
+}
-MACHINE_CONFIG_START(toaplan2_state::mahoudai)
+void toaplan2_state::mahoudai(machine_config &config)
+{
/* basic machine hardware */
M68000(config, m_maincpu, 32_MHz_XTAL/2); // 16MHz, 32MHz Oscillator
m_maincpu->set_addrmap(AS_PROGRAM, &toaplan2_state::mahoudai_68k_mem);
@@ -3922,7 +3924,7 @@ MACHINE_CONFIG_START(toaplan2_state::mahoudai)
Z80(config, m_audiocpu, 32_MHz_XTAL/8); // 4MHz, 32MHz Oscillator
m_audiocpu->set_addrmap(AS_PROGRAM, &toaplan2_state::raizing_sound_z80_mem);
- MCFG_QUANTUM_TIME(attotime::from_hz(600))
+ config.m_minimum_quantum = attotime::from_hz(600);
MCFG_MACHINE_RESET_OVERRIDE(toaplan2_state,toaplan2)
@@ -3953,11 +3955,11 @@ MACHINE_CONFIG_START(toaplan2_state::mahoudai)
OKIM6295(config, m_oki[0], 32_MHz_XTAL/32, okim6295_device::PIN7_HIGH);
m_oki[0]->add_route(ALL_OUTPUTS, "mono", 1.0);
-MACHINE_CONFIG_END
-
+}
-MACHINE_CONFIG_START(toaplan2_state::shippumd)
+void toaplan2_state::shippumd(machine_config &config)
+{
/* basic machine hardware */
M68000(config, m_maincpu, 32_MHz_XTAL/2); // 16MHz, 32MHz Oscillator
m_maincpu->set_addrmap(AS_PROGRAM, &toaplan2_state::shippumd_68k_mem);
@@ -3965,7 +3967,7 @@ MACHINE_CONFIG_START(toaplan2_state::shippumd)
Z80(config, m_audiocpu, 32_MHz_XTAL/8); // 4MHz, 32MHz Oscillator
m_audiocpu->set_addrmap(AS_PROGRAM, &toaplan2_state::raizing_sound_z80_mem);
- MCFG_QUANTUM_TIME(attotime::from_hz(600))
+ config.m_minimum_quantum = attotime::from_hz(600);
MCFG_MACHINE_RESET_OVERRIDE(toaplan2_state,toaplan2)
@@ -3996,10 +3998,10 @@ MACHINE_CONFIG_START(toaplan2_state::shippumd)
OKIM6295(config, m_oki[0], 32_MHz_XTAL/32, okim6295_device::PIN7_HIGH);
m_oki[0]->add_route(ALL_OUTPUTS, "mono", 1.0);
-MACHINE_CONFIG_END
-
-MACHINE_CONFIG_START(toaplan2_state::bgaregga)
+}
+void toaplan2_state::bgaregga(machine_config &config)
+{
/* basic machine hardware */
M68000(config, m_maincpu, 32_MHz_XTAL/2); // 16MHz, 32MHz Oscillator
m_maincpu->set_addrmap(AS_PROGRAM, &toaplan2_state::bgaregga_68k_mem);
@@ -4007,7 +4009,7 @@ MACHINE_CONFIG_START(toaplan2_state::bgaregga)
Z80(config, m_audiocpu, 32_MHz_XTAL/8); // 4MHz, 32MHz Oscillator
m_audiocpu->set_addrmap(AS_PROGRAM, &toaplan2_state::bgaregga_sound_z80_mem);
- MCFG_QUANTUM_TIME(attotime::from_hz(6000))
+ config.m_minimum_quantum = attotime::from_hz(6000);
MCFG_MACHINE_RESET_OVERRIDE(toaplan2_state,toaplan2)
@@ -4045,18 +4047,19 @@ MACHINE_CONFIG_START(toaplan2_state::bgaregga)
NMK112(config, m_nmk112, 0);
m_nmk112->set_rom0_tag("oki1");
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(toaplan2_state::bgareggabl)
+void toaplan2_state::bgareggabl(machine_config &config)
+{
bgaregga(config);
MCFG_VIDEO_START_OVERRIDE(toaplan2_state,bgareggabl)
m_screen->set_screen_update(FUNC(toaplan2_state::screen_update_bootleg));
-MACHINE_CONFIG_END
-
-MACHINE_CONFIG_START(toaplan2_state::batrider)
+}
+void toaplan2_state::batrider(machine_config &config)
+{
/* basic machine hardware */
M68000(config, m_maincpu, 32_MHz_XTAL/2); // 16MHz, 32MHz Oscillator (verified)
m_maincpu->set_addrmap(AS_PROGRAM, &toaplan2_state::batrider_68k_mem);
@@ -4065,7 +4068,7 @@ MACHINE_CONFIG_START(toaplan2_state::batrider)
m_audiocpu->set_addrmap(AS_PROGRAM, &toaplan2_state::batrider_sound_z80_mem);
m_audiocpu->set_addrmap(AS_IO, &toaplan2_state::batrider_sound_z80_port);
- MCFG_QUANTUM_TIME(attotime::from_hz(600))
+ config.m_minimum_quantum = attotime::from_hz(600);
MCFG_MACHINE_RESET_OVERRIDE(toaplan2_state,toaplan2)
@@ -4116,21 +4119,21 @@ MACHINE_CONFIG_START(toaplan2_state::batrider)
NMK112(config, m_nmk112, 0);
m_nmk112->set_rom0_tag("oki1");
m_nmk112->set_rom1_tag("oki2");
-MACHINE_CONFIG_END
-
+}
-MACHINE_CONFIG_START(toaplan2_state::bbakraid)
+void toaplan2_state::bbakraid(machine_config &config)
+{
/* basic machine hardware */
M68000(config, m_maincpu, 32_MHz_XTAL/2); // 16MHz, 32MHz Oscillator
m_maincpu->set_addrmap(AS_PROGRAM, &toaplan2_state::bbakraid_68k_mem);
- MCFG_DEVICE_ADD("audiocpu", Z80, XTAL(32'000'000)/6) /* 5.3333MHz , 32MHz Oscillator */
- MCFG_DEVICE_PROGRAM_MAP(bbakraid_sound_z80_mem)
- MCFG_DEVICE_IO_MAP(bbakraid_sound_z80_port)
- MCFG_DEVICE_PERIODIC_INT_DRIVER(toaplan2_state, bbakraid_snd_interrupt, 448)
+ Z80(config, m_audiocpu, XTAL(32'000'000)/6); /* 5.3333MHz , 32MHz Oscillator */
+ m_audiocpu->set_addrmap(AS_PROGRAM, &toaplan2_state::bbakraid_sound_z80_mem);
+ m_audiocpu->set_addrmap(AS_IO, &toaplan2_state::bbakraid_sound_z80_port);
+ m_audiocpu->set_periodic_int(FUNC(toaplan2_state::bbakraid_snd_interrupt), attotime::from_hz(448));
- MCFG_QUANTUM_TIME(attotime::from_hz(600))
+ config.m_minimum_quantum = attotime::from_hz(600);
MCFG_MACHINE_RESET_OVERRIDE(toaplan2_state,toaplan2)
@@ -4174,7 +4177,7 @@ MACHINE_CONFIG_START(toaplan2_state::bbakraid)
YMZ280B(config, "ymz", 16.9344_MHz_XTAL).add_route(ALL_OUTPUTS, "mono", 1.0);
// IRQ not used ??? Connected to a test pin (TP082)
-MACHINE_CONFIG_END
+}
/***************************************************************************
diff --git a/src/mame/drivers/tomcat.cpp b/src/mame/drivers/tomcat.cpp
index c419a32565b..ba8f361d667 100644
--- a/src/mame/drivers/tomcat.cpp
+++ b/src/mame/drivers/tomcat.cpp
@@ -97,7 +97,7 @@ private:
WRITE8_MEMBER(tomcat_state::adcon_w)
{
- m_adc->address_w(space, 0, data & 7);
+ m_adc->address_w(data & 7);
m_adc->start_w(BIT(data, 3));
}
@@ -308,25 +308,26 @@ void tomcat_state::machine_start()
m_dsp_bio = 0;
}
-MACHINE_CONFIG_START(tomcat_state::tomcat)
- MCFG_DEVICE_ADD("maincpu", M68010, 12.096_MHz_XTAL / 2)
- MCFG_DEVICE_PROGRAM_MAP(tomcat_map)
- MCFG_DEVICE_PERIODIC_INT_DRIVER(tomcat_state, irq1_line_assert, 5*60)
- //MCFG_DEVICE_PERIODIC_INT_DRIVER(tomcat_state, irq1_line_assert, 12.096_MHz_XTAL / 16 / 16 / 16 / 12)
+void tomcat_state::tomcat(machine_config &config)
+{
+ M68010(config, m_maincpu, 12.096_MHz_XTAL / 2);
+ m_maincpu->set_addrmap(AS_PROGRAM, &tomcat_state::tomcat_map);
+ m_maincpu->set_periodic_int(FUNC(tomcat_state::irq1_line_assert), attotime::from_hz(5*60));
+ //m_maincpu->set_periodic_int(FUNC(tomcat_state::irq1_line_assert), attotime::from_hz(12.096_MHz_XTAL / 16 / 16 / 16 / 12));
TMS32010(config, m_dsp, 16_MHz_XTAL);
m_dsp->set_addrmap(AS_PROGRAM, &tomcat_state::dsp_map);
m_dsp->bio().set(FUNC(tomcat_state::dsp_bio_r));
- MCFG_DEVICE_ADD("soundcpu", M6502, 14.318181_MHz_XTAL / 8)
- MCFG_DEVICE_DISABLE()
- MCFG_DEVICE_PROGRAM_MAP( sound_map)
+ m6502_device &soundcpu(M6502(config, "soundcpu", 14.318181_MHz_XTAL / 8));
+ soundcpu.set_disable();
+ soundcpu.set_addrmap(AS_PROGRAM, &tomcat_state::sound_map);
ADC0809(config, m_adc, 12.096_MHz_XTAL / 16);
m_adc->in_callback<0>().set_ioport("STICKY");
m_adc->in_callback<1>().set_ioport("STICKX");
- MCFG_DEVICE_ADD("riot", RIOT6532, 14.318181_MHz_XTAL / 8)
+ RIOT6532(config, "riot", 14.318181_MHz_XTAL / 8);
/*
PA0 = /WS OUTPUT (TMS-5220 WRITE STROBE)
PA1 = /RS OUTPUT (TMS-5220 READ STROBE)
@@ -342,7 +343,7 @@ MACHINE_CONFIG_START(tomcat_state::tomcat)
// OUTB PB0 - PB7 OUTPUT Speech Data
// IRQ CB connected to IRQ line of 6502
- MCFG_QUANTUM_TIME(attotime::from_hz(4000))
+ config.m_minimum_quantum = attotime::from_hz(4000);
LS259(config, m_mainlatch);
m_mainlatch->q_out_cb<0>().set_output("led1").invert();
@@ -358,33 +359,31 @@ MACHINE_CONFIG_START(tomcat_state::tomcat)
WATCHDOG_TIMER(config, "watchdog");
- MCFG_DEVICE_ADD("m48t02", M48T02, 0)
+ M48T02(config, "m48t02", 0);
- MCFG_VECTOR_ADD("vector")
- MCFG_SCREEN_ADD("screen", VECTOR)
- MCFG_SCREEN_REFRESH_RATE(40)
- //MCFG_SCREEN_REFRESH_RATE((double)XTAL(12'000'000) / 16 / 16 / 16 / 12 / 5 )
- MCFG_SCREEN_SIZE(400, 300)
- MCFG_SCREEN_VISIBLE_AREA(0, 280, 0, 250)
- MCFG_SCREEN_UPDATE_DEVICE("vector", vector_device, screen_update)
+ VECTOR(config, "vector", 0);
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_VECTOR));
+ screen.set_refresh_hz(40);
+ //screen.set_refresh_hz((double)XTAL(12'000'000) / 16 / 16 / 16 / 12 / 5 );
+ screen.set_size(400, 300);
+ screen.set_visarea(0, 280, 0, 250);
+ screen.set_screen_update("vector", FUNC(vector_device::screen_update));
avg_device &avg(AVG_TOMCAT(config, "avg", 0));
avg.set_vector_tag("vector");
SPEAKER(config, "lspeaker").front_left();
SPEAKER(config, "rspeaker").front_right();
- MCFG_DEVICE_ADD("pokey1", POKEY, XTAL(14'318'181) / 8)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 0.20)
+ POKEY(config, "pokey1", XTAL(14'318'181) / 8).add_route(ALL_OUTPUTS, "lspeaker", 0.20);
- MCFG_DEVICE_ADD("pokey2", POKEY, XTAL(14'318'181) / 8)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 0.20)
+ POKEY(config, "pokey2", XTAL(14'318'181) / 8).add_route(ALL_OUTPUTS, "rspeaker", 0.20);
- MCFG_DEVICE_ADD("tms", TMS5220, 325000)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 0.50)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 0.50)
+ TMS5220(config, m_tms, 325000);
+ m_tms->add_route(ALL_OUTPUTS, "lspeaker", 0.50);
+ m_tms->add_route(ALL_OUTPUTS, "rspeaker", 0.50);
YM2151(config, "ymsnd", XTAL(14'318'181)/4).add_route(0, "lspeaker", 0.60).add_route(1, "rspeaker", 0.60);
-MACHINE_CONFIG_END
+}
ROM_START( tomcat )
ROM_REGION( 0x10000, "maincpu", 0)
diff --git a/src/mame/drivers/toobin.cpp b/src/mame/drivers/toobin.cpp
index 6387823d0c6..9d791ffcaef 100644
--- a/src/mame/drivers/toobin.cpp
+++ b/src/mame/drivers/toobin.cpp
@@ -203,30 +203,30 @@ GFXDECODE_END
*
*************************************/
-MACHINE_CONFIG_START(toobin_state::toobin)
-
+void toobin_state::toobin(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M68010, MASTER_CLOCK/4)
- MCFG_DEVICE_PROGRAM_MAP(main_map)
+ M68010(config, m_maincpu, MASTER_CLOCK/4);
+ m_maincpu->set_addrmap(AS_PROGRAM, &toobin_state::main_map);
EEPROM_2804(config, "eeprom").lock_after_write(true);
WATCHDOG_TIMER(config, "watchdog").set_vblank_count(m_screen, 8);
/* video hardware */
- MCFG_TILEMAP_ADD_STANDARD("playfield", "gfxdecode", 4, toobin_state, get_playfield_tile_info, 8,8, SCAN_ROWS, 128,64)
- MCFG_TILEMAP_ADD_STANDARD_TRANSPEN("alpha", "gfxdecode", 2, toobin_state, get_alpha_tile_info, 8,8, SCAN_ROWS, 64,48, 0)
+ TILEMAP(config, m_playfield_tilemap, m_gfxdecode, 4, 8,8, TILEMAP_SCAN_ROWS, 128,64).set_info_callback(FUNC(toobin_state::get_playfield_tile_info));
+ TILEMAP(config, m_alpha_tilemap, m_gfxdecode, 2, 8,8, TILEMAP_SCAN_ROWS, 64,48, 0).set_info_callback(FUNC(toobin_state::get_alpha_tile_info));
ATARI_MOTION_OBJECTS(config, m_mob, 0, m_screen, toobin_state::s_mob_config);
m_mob->set_gfxdecode(m_gfxdecode);
- MCFG_SCREEN_ADD(m_screen, RASTER)
- MCFG_SCREEN_VIDEO_ATTRIBUTES(VIDEO_UPDATE_BEFORE_VBLANK)
- MCFG_SCREEN_RAW_PARAMS(MASTER_CLOCK/2, 640, 0, 512, 416, 0, 384)
- MCFG_SCREEN_UPDATE_DRIVER(toobin_state, screen_update)
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_video_attributes(VIDEO_UPDATE_BEFORE_VBLANK);
+ m_screen->set_raw(MASTER_CLOCK/2, 640, 0, 512, 416, 0, 384);
+ m_screen->set_screen_update(FUNC(toobin_state::screen_update));
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_toobin)
- MCFG_PALETTE_ADD("palette", 1024)
+ GFXDECODE(config, m_gfxdecode, m_palette, gfx_toobin);
+ PALETTE(config, m_palette).set_entries(1024);
/* sound hardware */
SPEAKER(config, "lspeaker").front_left();
@@ -238,7 +238,7 @@ MACHINE_CONFIG_START(toobin_state::toobin)
m_jsa->add_route(0, "lspeaker", 1.0);
m_jsa->add_route(1, "rspeaker", 1.0);
config.device_remove("jsa:tms");
-MACHINE_CONFIG_END
+}
diff --git a/src/mame/drivers/topspeed.cpp b/src/mame/drivers/topspeed.cpp
index 4644da6a6ca..b9df8e091d9 100644
--- a/src/mame/drivers/topspeed.cpp
+++ b/src/mame/drivers/topspeed.cpp
@@ -567,23 +567,23 @@ void topspeed_state::machine_reset()
}
-MACHINE_CONFIG_START(topspeed_state::topspeed)
-
+void topspeed_state::topspeed(machine_config &config)
+{
// basic machine hardware
- MCFG_DEVICE_ADD("maincpu", M68000, XTAL(16'000'000) / 2)
- MCFG_DEVICE_PROGRAM_MAP(cpua_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", topspeed_state, irq6_line_hold)
+ M68000(config, m_maincpu, XTAL(16'000'000) / 2);
+ m_maincpu->set_addrmap(AS_PROGRAM, &topspeed_state::cpua_map);
+ m_maincpu->set_vblank_int("screen", FUNC(topspeed_state::irq6_line_hold));
- MCFG_DEVICE_ADD("subcpu", M68000, XTAL(16'000'000) / 2)
- MCFG_DEVICE_PROGRAM_MAP(cpub_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", topspeed_state, irq5_line_hold)
+ M68000(config, m_subcpu, XTAL(16'000'000) / 2);
+ m_subcpu->set_addrmap(AS_PROGRAM, &topspeed_state::cpub_map);
+ m_subcpu->set_vblank_int("screen", FUNC(topspeed_state::irq5_line_hold));
- MCFG_DEVICE_ADD("audiocpu", Z80, XTAL(16'000'000) / 4)
- MCFG_DEVICE_PROGRAM_MAP(z80_prg)
- MCFG_DEVICE_IO_MAP(z80_io)
+ Z80(config, m_audiocpu, XTAL(16'000'000) / 4);
+ m_audiocpu->set_addrmap(AS_PROGRAM, &topspeed_state::z80_prg);
+ m_audiocpu->set_addrmap(AS_IO, &topspeed_state::z80_io);
z80ctc_device& ctc(Z80CTC(config, "ctc", XTAL(16'000'000) / 4));
- ctc.intr_callback().set(FUNC(topspeed_state::z80ctc_to0));
+ ctc.zc_callback<0>().set(FUNC(topspeed_state::z80ctc_to0));
PC080SN(config, m_pc080sn[0], 0);
m_pc080sn[0]->set_gfx_region(1);
@@ -608,13 +608,13 @@ MACHINE_CONFIG_START(topspeed_state::topspeed)
m_tc0040ioc->read_7_callback().set_ioport("IN2");
// video hardware
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60.0532) // Measured on real hardware
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(40*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 40*8-1, 2*8, 32*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(topspeed_state, screen_update_topspeed)
- MCFG_SCREEN_PALETTE("palette")
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60.0532); // Measured on real hardware
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(40*8, 32*8);
+ screen.set_visarea(0*8, 40*8-1, 2*8, 32*8-1);
+ screen.set_screen_update(FUNC(topspeed_state::screen_update_topspeed));
+ screen.set_palette("palette");
GFXDECODE(config, m_gfxdecode, "palette", gfx_topspeed);
PALETTE(config, "palette").set_format(palette_device::xBGR_555, 8192);
@@ -629,14 +629,14 @@ MACHINE_CONFIG_START(topspeed_state::topspeed)
ymsnd.add_route(0, "filter1l", 1.0);
ymsnd.add_route(1, "filter1r", 1.0);
- MCFG_DEVICE_ADD("msm1", MSM5205, XTAL(384'000))
- MCFG_MSM5205_VCLK_CB(WRITELINE(*this, topspeed_state, msm5205_1_vck)) // VCK function
- MCFG_MSM5205_PRESCALER_SELECTOR(S48_4B) // 8 kHz, 4-bit
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "filter2", 1.0)
+ MSM5205(config, m_msm[0], XTAL(384'000));
+ m_msm[0]->vck_legacy_callback().set(FUNC(topspeed_state::msm5205_1_vck));
+ m_msm[0]->set_prescaler_selector(msm5205_device::S48_4B); // 8 kHz, 4-bit
+ m_msm[0]->add_route(ALL_OUTPUTS, "filter2", 1.0);
- MCFG_DEVICE_ADD("msm2", MSM5205, XTAL(384'000))
- MCFG_MSM5205_PRESCALER_SELECTOR(SEX_4B) // Slave mode, 4-bit
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "filter3", 1.0)
+ MSM5205(config, m_msm[1], XTAL(384'000));
+ m_msm[1]->set_prescaler_selector(msm5205_device::SEX_4B); // Slave mode, 4-bit
+ m_msm[1]->add_route(ALL_OUTPUTS, "filter3", 1.0);
FILTER_VOLUME(config, "filter1l").add_route(ALL_OUTPUTS, "lspeaker", 1.0);
FILTER_VOLUME(config, "filter1r").add_route(ALL_OUTPUTS, "rspeaker", 1.0);
@@ -644,7 +644,7 @@ MACHINE_CONFIG_START(topspeed_state::topspeed)
FILTER_VOLUME(config, "filter2").add_route(ALL_OUTPUTS, "lspeaker", 1.0).add_route(ALL_OUTPUTS, "rspeaker", 1.0);
FILTER_VOLUME(config, "filter3").add_route(ALL_OUTPUTS, "lspeaker", 1.0).add_route(ALL_OUTPUTS, "rspeaker", 1.0);
-MACHINE_CONFIG_END
+}
diff --git a/src/mame/drivers/tosh1000.cpp b/src/mame/drivers/tosh1000.cpp
index 6b6c5d83eeb..741f31563b8 100644
--- a/src/mame/drivers/tosh1000.cpp
+++ b/src/mame/drivers/tosh1000.cpp
@@ -49,17 +49,16 @@
#include "softlist.h"
-#define VERBOSE_DBG 1 /* general debug messages */
+//#define LOG_GENERAL (1U << 0) //defined in logmacro.h already
+#define LOG_KEYBOARD (1U << 1)
+#define LOG_DEBUG (1U << 2)
-#define DBG_LOG(N,M,A) \
- do { \
- if(VERBOSE_DBG>=N) \
- { \
- if( M ) \
- logerror("%11.6f at %s: %-10s",machine().time().as_double(),machine().describe_context(),(char*)M ); \
- logerror A; \
- } \
- } while (0)
+//#define VERBOSE (LOG_DEBUG)
+//#define LOG_OUTPUT_FUNC printf
+#include "logmacro.h"
+
+#define LOGKBD(...) LOGMASKED(LOG_KEYBOARD, __VA_ARGS__)
+#define LOGDBG(...) LOGMASKED(LOG_DEBUG, __VA_ARGS__)
class tosh1000_state : public driver_device
@@ -119,7 +118,7 @@ MACHINE_RESET_MEMBER(tosh1000_state, tosh1000)
WRITE8_MEMBER(tosh1000_state::romdos_bank_w)
{
- DBG_LOG(2,"ROM-DOS", ("<- %02x (%s, accessing bank %d)\n", data, BIT(data, 7)?"enable":"disable", data&7));
+ LOGDBG("ROM-DOS <- %02x (%s, accessing bank %d)\n", data, BIT(data, 7)?"enable":"disable", data&7);
if (BIT(data, 7))
{
@@ -133,14 +132,14 @@ WRITE8_MEMBER(tosh1000_state::romdos_bank_w)
WRITE8_MEMBER(tosh1000_state::bram_w)
{
- DBG_LOG(2, "BRAM", ("%02x <- %02x\n", 0xc0 + offset, data));
+ LOGDBG("BRAM %02x <- %02x\n", 0xc0 + offset, data);
switch (offset)
{
case 1:
if (m_bram_latch)
{
- DBG_LOG(1, "Backup RAM", ("%02x <- %02x\n", m_bram_offset % 160, data));
+ LOG("Backup RAM %02x <- %02x\n", m_bram_offset % 160, data);
m_bram->write(m_bram_offset % 160, data);
m_bram_offset++;
}
@@ -188,7 +187,7 @@ READ8_MEMBER(tosh1000_state::bram_r)
if (m_bram_state == READ_DATA)
{
data = m_bram->read(m_bram_offset % 160);
- DBG_LOG(1, "BRAM", ("@ %02x == %02x\n", m_bram_offset % 160, data));
+ LOG("BRAM @ %02x == %02x\n", m_bram_offset % 160, data);
m_bram_offset++;
}
break;
@@ -212,7 +211,7 @@ READ8_MEMBER(tosh1000_state::bram_r)
break;
}
- DBG_LOG(2, "BRAM", ("%02x == %02x\n", 0xc0 + offset, data));
+ LOGDBG("BRAM %02x == %02x\n", 0xc0 + offset, data);
return data;
}
@@ -254,38 +253,38 @@ void tosh1000_state::cfg_fdc_35(device_t *device)
dynamic_cast<device_slot_interface &>(*device->subdevice("fdc:1")).set_default_option("");
}
-MACHINE_CONFIG_START(tosh1000_state::tosh1000)
- MCFG_DEVICE_ADD("maincpu", I8088, XTAL(5'000'000))
- MCFG_DEVICE_PROGRAM_MAP(tosh1000_map)
- MCFG_DEVICE_IO_MAP(tosh1000_io)
- MCFG_DEVICE_IRQ_ACKNOWLEDGE_DEVICE("mb:pic8259", pic8259_device, inta_cb)
+void tosh1000_state::tosh1000(machine_config &config)
+{
+ I8088(config, m_maincpu, XTAL(5'000'000));
+ m_maincpu->set_addrmap(AS_PROGRAM, &tosh1000_state::tosh1000_map);
+ m_maincpu->set_addrmap(AS_IO, &tosh1000_state::tosh1000_io);
+ m_maincpu->set_irq_acknowledge_callback("mb:pic8259", FUNC(pic8259_device::inta_cb));
ADDRESS_MAP_BANK(config, "bankdev").set_map(&tosh1000_state::tosh1000_romdos).set_options(ENDIANNESS_LITTLE, 8, 20, 0x10000);
MCFG_MACHINE_RESET_OVERRIDE(tosh1000_state, tosh1000)
- MCFG_IBM5160_MOTHERBOARD_ADD("mb", "maincpu")
+ IBM5160_MOTHERBOARD(config, "mb", 0).set_cputag(m_maincpu);
TC8521(config, "rtc", XTAL(32'768));
// FIXME: determine ISA bus clock
- MCFG_DEVICE_ADD("isa1", ISA8_SLOT, 0, "mb:isa", pc_isa8_cards, "cga", false)
- MCFG_DEVICE_ADD("isa2", ISA8_SLOT, 0, "mb:isa", pc_isa8_cards, "fdc_xt", false)
- MCFG_SLOT_OPTION_MACHINE_CONFIG("fdc_xt", cfg_fdc_35)
- MCFG_DEVICE_ADD("isa3", ISA8_SLOT, 0, "mb:isa", pc_isa8_cards, "lpt", false)
- MCFG_DEVICE_ADD("isa4", ISA8_SLOT, 0, "mb:isa", pc_isa8_cards, "com", false)
- MCFG_DEVICE_ADD("isa5", ISA8_SLOT, 0, "mb:isa", pc_isa8_cards, nullptr, false)
- MCFG_DEVICE_ADD("isa6", ISA8_SLOT, 0, "mb:isa", pc_isa8_cards, nullptr, false)
+ ISA8_SLOT(config, "isa1", 0, "mb:isa", pc_isa8_cards, "cga", false);
+ ISA8_SLOT(config, "isa2", 0, "mb:isa", pc_isa8_cards, "fdc_xt", false).set_option_machine_config("fdc_xt", cfg_fdc_35);
+ ISA8_SLOT(config, "isa3", 0, "mb:isa", pc_isa8_cards, "lpt", false);
+ ISA8_SLOT(config, "isa4", 0, "mb:isa", pc_isa8_cards, "com", false);
+ ISA8_SLOT(config, "isa5", 0, "mb:isa", pc_isa8_cards, nullptr, false);
+ ISA8_SLOT(config, "isa6", 0, "mb:isa", pc_isa8_cards, nullptr, false);
-// MCFG_SOFTWARE_LIST_ADD("flop_list","tosh1000")
+// SOFTWARE_LIST(config, "flop_list").set_original("tosh1000");
// uses a 80C50 instead of 8042 for KBDC
- MCFG_PC_KBDC_SLOT_ADD("mb:pc_kbdc", "kbd", pc_xt_keyboards, STR_KBD_KEYTRONIC_PC3270)
+ PC_KBDC_SLOT(config, "kbd", pc_xt_keyboards, STR_KBD_KEYTRONIC_PC3270).set_pc_kbdc_slot(subdevice("mb:pc_kbdc"));
RAM(config, RAM_TAG).set_default_size("512K");
TOSH1000_BRAM(config, m_bram, 0);
-MACHINE_CONFIG_END
+}
ROM_START( tosh1000 )
diff --git a/src/mame/drivers/tourvis.cpp b/src/mame/drivers/tourvis.cpp
index a9cc593a87f..8409fb21bd5 100644
--- a/src/mame/drivers/tourvis.cpp
+++ b/src/mame/drivers/tourvis.cpp
@@ -401,25 +401,26 @@ MACHINE_CONFIG_START(tourvision_state::tourvision)
m_maincpu->add_route(0, "lspeaker", 1.00);
m_maincpu->add_route(1, "rspeaker", 1.00);
- MCFG_QUANTUM_TIME(attotime::from_hz(60))
+ config.m_minimum_quantum = attotime::from_hz(60);
- MCFG_DEVICE_ADD("subcpu", I8085A, 18000000/3 /*?*/)
- MCFG_DEVICE_PROGRAM_MAP(tourvision_8085_map)
+ I8085A(config, m_subcpu, 18000000/3 /*?*/);
+ m_subcpu->set_addrmap(AS_PROGRAM, &tourvision_state::tourvision_8085_map);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_RAW_PARAMS(PCE_MAIN_CLOCK, huc6260_device::WPF, 64, 64 + 1024 + 64, huc6260_device::LPF, 18, 18 + 242)
- MCFG_SCREEN_UPDATE_DRIVER( pce_common_state, screen_update )
- MCFG_SCREEN_PALETTE("huc6260")
-
- MCFG_DEVICE_ADD( "huc6260", HUC6260, PCE_MAIN_CLOCK )
- MCFG_HUC6260_NEXT_PIXEL_DATA_CB(READ16("huc6270", huc6270_device, next_pixel))
- MCFG_HUC6260_TIME_TIL_NEXT_EVENT_CB(READ16("huc6270", huc6270_device, time_until_next_event))
- MCFG_HUC6260_VSYNC_CHANGED_CB(WRITELINE("huc6270", huc6270_device, vsync_changed))
- MCFG_HUC6260_HSYNC_CHANGED_CB(WRITELINE("huc6270", huc6270_device, hsync_changed))
- MCFG_DEVICE_ADD( "huc6270", HUC6270, 0 )
- MCFG_HUC6270_VRAM_SIZE(0x10000)
- MCFG_HUC6270_IRQ_CHANGED_CB(INPUTLINE("maincpu", 0))
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_raw(PCE_MAIN_CLOCK, huc6260_device::WPF, 64, 64 + 1024 + 64, huc6260_device::LPF, 18, 18 + 242);
+ screen.set_screen_update(FUNC(pce_common_state::screen_update));
+ screen.set_palette(m_huc6260);
+
+ HUC6260(config, m_huc6260, PCE_MAIN_CLOCK);
+ m_huc6260->next_pixel_data().set("huc6270", FUNC(huc6270_device::next_pixel));
+ m_huc6260->time_til_next_event().set("huc6270", FUNC(huc6270_device::time_until_next_event));
+ m_huc6260->vsync_changed().set("huc6270", FUNC(huc6270_device::vsync_changed));
+ m_huc6260->hsync_changed().set("huc6270", FUNC(huc6270_device::hsync_changed));
+
+ huc6270_device &huc6270(HUC6270(config, "huc6270", 0));
+ huc6270.set_vram_size(0x10000);
+ huc6270.irq().set_inputline(m_maincpu, 0);
i8155_device &i8155(I8155(config, "i8155", 1000000 /*?*/));
i8155.out_pa_callback().set(FUNC(tourvision_state::tourvision_i8155_a_w));
@@ -435,9 +436,7 @@ MACHINE_CONFIG_START(tourvision_state::tourvision)
MCFG_GENERIC_LOAD(tourvision_state, tourvision_cart)
MCFG_GENERIC_MANDATORY
- MCFG_SOFTWARE_LIST_ADD("tv_list","pce_tourvision")
-
-
+ SOFTWARE_LIST(config, "tv_list").set_original("pce_tourvision");
MACHINE_CONFIG_END
#define TOURVISION_BIOS \
diff --git a/src/mame/drivers/tp84.cpp b/src/mame/drivers/tp84.cpp
index a3cc77483b4..ed82130285f 100644
--- a/src/mame/drivers/tp84.cpp
+++ b/src/mame/drivers/tp84.cpp
@@ -242,9 +242,9 @@ void tp84_state::audio_map(address_map &map)
map(0x8000, 0x8000).r(FUNC(tp84_state::tp84_sh_timer_r));
map(0xa000, 0xa1ff).w(FUNC(tp84_state::tp84_filter_w));
map(0xc000, 0xc000).nopw();
- map(0xc001, 0xc001).w("y2404_1", FUNC(y2404_device::command_w));
- map(0xc003, 0xc003).w("y2404_2", FUNC(y2404_device::command_w));
- map(0xc004, 0xc004).w("y2404_3", FUNC(y2404_device::command_w));
+ map(0xc001, 0xc001).w("y2404_1", FUNC(y2404_device::write));
+ map(0xc003, 0xc003).w("y2404_2", FUNC(y2404_device::write));
+ map(0xc004, 0xc004).w("y2404_3", FUNC(y2404_device::write));
}
@@ -329,19 +329,19 @@ static GFXDECODE_START( gfx_tp84 )
GFXDECODE_END
-MACHINE_CONFIG_START(tp84_state::tp84)
-
+void tp84_state::tp84(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("cpu1", MC6809E, XTAL(18'432'000)/12) /* verified on pcb */
- MCFG_DEVICE_PROGRAM_MAP(tp84_cpu1_map)
+ MC6809E(config, m_maincpu, XTAL(18'432'000)/12); /* verified on pcb */
+ m_maincpu->set_addrmap(AS_PROGRAM, &tp84_state::tp84_cpu1_map);
- MCFG_DEVICE_ADD("sub", MC6809E, XTAL(18'432'000)/12) /* verified on pcb */
- MCFG_DEVICE_PROGRAM_MAP(cpu2_map)
+ MC6809E(config, m_subcpu, XTAL(18'432'000)/12); /* verified on pcb */
+ m_subcpu->set_addrmap(AS_PROGRAM, &tp84_state::cpu2_map);
- MCFG_DEVICE_ADD("audiocpu", Z80,XTAL(14'318'181)/4) /* verified on pcb */
- MCFG_DEVICE_PROGRAM_MAP(audio_map)
+ Z80(config, m_audiocpu, XTAL(14'318'181)/4); /* verified on pcb */
+ m_audiocpu->set_addrmap(AS_PROGRAM, &tp84_state::audio_map);
- MCFG_QUANTUM_TIME(attotime::from_hz(6000)) /* 100 CPU slices per frame - an high value to ensure proper */
+ config.m_minimum_quantum = attotime::from_hz(6000); /* 100 CPU slices per frame - a high value to ensure proper */
/* synchronization of the CPUs */
ls259_device &mainlatch(LS259(config, "mainlatch", 0)); // 3B
@@ -354,14 +354,14 @@ MACHINE_CONFIG_START(tp84_state::tp84)
WATCHDOG_TIMER(config, "watchdog");
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(32*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(tp84_state, screen_update_tp84)
- MCFG_SCREEN_PALETTE(m_palette)
- MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE(*this, tp84_state, vblank_irq))
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_refresh_hz(60);
+ m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ m_screen->set_size(32*8, 32*8);
+ m_screen->set_visarea(0*8, 32*8-1, 2*8, 30*8-1);
+ m_screen->set_screen_update(FUNC(tp84_state::screen_update_tp84));
+ m_screen->set_palette(m_palette);
+ m_screen->screen_vblank().set(FUNC(tp84_state::vblank_irq));
GFXDECODE(config, m_gfxdecode, m_palette, gfx_tp84);
PALETTE(config, m_palette, FUNC(tp84_state::tp84_palette), 4096, 256);
@@ -371,24 +371,21 @@ MACHINE_CONFIG_START(tp84_state::tp84)
GENERIC_LATCH_8(config, "soundlatch");
- MCFG_DEVICE_ADD("y2404_1", Y2404, XTAL(14'318'181)/8) /* verified on pcb */
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "filter1", 0.75)
+ Y2404(config, "y2404_1", XTAL(14'318'181)/8).add_route(ALL_OUTPUTS, "filter1", 0.75); /* verified on pcb */
- MCFG_DEVICE_ADD("y2404_2", Y2404, XTAL(14'318'181)/8) /* verified on pcb */
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "filter2", 0.75)
+ Y2404(config, "y2404_2", XTAL(14'318'181)/8).add_route(ALL_OUTPUTS, "filter2", 0.75); /* verified on pcb */
- MCFG_DEVICE_ADD("y2404_3", Y2404, XTAL(14'318'181)/8) /* verified on pcb */
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "filter3", 0.75)
+ Y2404(config, "y2404_3", XTAL(14'318'181)/8).add_route(ALL_OUTPUTS, "filter3", 0.75); /* verified on pcb */
for (auto &filter : m_filter)
FILTER_RC(config, filter).add_route(ALL_OUTPUTS, "mono", 1.0);
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(tp84_state::tp84b)
+void tp84_state::tp84b(machine_config &config)
+{
tp84(config);
- MCFG_DEVICE_MODIFY("cpu1")
- MCFG_DEVICE_PROGRAM_MAP(tp84b_cpu1_map)
-MACHINE_CONFIG_END
+ m_maincpu->set_addrmap(AS_PROGRAM, &tp84_state::tp84b_cpu1_map);
+}
/***************************************************************************
diff --git a/src/mame/drivers/tr606.cpp b/src/mame/drivers/tr606.cpp
index 6eeb292ea30..970addc505b 100644
--- a/src/mame/drivers/tr606.cpp
+++ b/src/mame/drivers/tr606.cpp
@@ -23,8 +23,8 @@
class tr606_state : public hh_ucom4_state
{
public:
- tr606_state(const machine_config &mconfig, device_type type, const char *tag)
- : hh_ucom4_state(mconfig, type, tag)
+ tr606_state(const machine_config &mconfig, device_type type, const char *tag) :
+ hh_ucom4_state(mconfig, type, tag)
{ }
void tr606(machine_config &config);
@@ -80,21 +80,22 @@ void tr606_state::machine_start()
// register for savestates
}
-MACHINE_CONFIG_START(tr606_state::tr606)
-
+void tr606_state::tr606(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", NEC_D650, TP2_HZ)
+ NEC_D650(config, m_maincpu, TP2_HZ);
- MCFG_TIMER_DRIVER_ADD_PERIODIC("tp3_clock", tr606_state, tp3_clock, TP3_PERIOD)
- MCFG_TIMER_START_DELAY(TP3_PERIOD - TP3_LOW)
- MCFG_TIMER_DRIVER_ADD_PERIODIC("tp3_clear", tr606_state, tp3_clear, TP3_PERIOD)
+ timer_device &tp3_clock(TIMER(config, "tp3_clock"));
+ tp3_clock.configure_periodic(FUNC(tr606_state::tp3_clock), TP3_PERIOD);
+ tp3_clock.set_start_delay(TP3_PERIOD - TP3_LOW);
+ TIMER(config, "tp3_clear").configure_periodic(FUNC(tr606_state::tp3_clear), TP3_PERIOD);
- MCFG_TIMER_DRIVER_ADD_PERIODIC("display_decay", hh_ucom4_state, display_decay_tick, attotime::from_msec(1))
+ TIMER(config, "display_decay").configure_periodic(FUNC(hh_ucom4_state::display_decay_tick), attotime::from_msec(1));
config.set_default_layout(layout_tr606);
/* sound hardware */
// discrete...
-MACHINE_CONFIG_END
+}
diff --git a/src/mame/drivers/trackfld.cpp b/src/mame/drivers/trackfld.cpp
index ca74ca65707..28c5ac49af7 100644
--- a/src/mame/drivers/trackfld.cpp
+++ b/src/mame/drivers/trackfld.cpp
@@ -895,14 +895,14 @@ WRITE_LINE_MEMBER(trackfld_state::vblank_nmi)
m_maincpu->set_input_line(INPUT_LINE_NMI, ASSERT_LINE);
}
-MACHINE_CONFIG_START(trackfld_state::trackfld)
-
+void trackfld_state::trackfld(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD(m_maincpu, KONAMI1, MASTER_CLOCK/6/2) /* a guess for now */
- MCFG_DEVICE_PROGRAM_MAP(main_map)
+ KONAMI1(config, m_maincpu, MASTER_CLOCK/6/2); /* a guess for now */
+ m_maincpu->set_addrmap(AS_PROGRAM, &trackfld_state::main_map);
- MCFG_DEVICE_ADD(m_audiocpu, Z80, SOUND_CLOCK/4)
- MCFG_DEVICE_PROGRAM_MAP(sound_map)
+ Z80(config, m_audiocpu, SOUND_CLOCK/4);
+ m_audiocpu->set_addrmap(AS_PROGRAM, &trackfld_state::sound_map);
MCFG_MACHINE_START_OVERRIDE(trackfld_state,trackfld)
MCFG_MACHINE_RESET_OVERRIDE(trackfld_state,trackfld)
@@ -922,14 +922,14 @@ MACHINE_CONFIG_START(trackfld_state::trackfld)
WATCHDOG_TIMER(config, "watchdog");
/* video hardware */
- MCFG_SCREEN_ADD(m_screen, RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(32*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(trackfld_state, screen_update_trackfld)
- MCFG_SCREEN_PALETTE(m_palette)
- MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE(*this, trackfld_state, vblank_irq))
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_refresh_hz(60);
+ m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ m_screen->set_size(32*8, 32*8);
+ m_screen->set_visarea(0*8, 32*8-1, 2*8, 30*8-1);
+ m_screen->set_screen_update(FUNC(trackfld_state::screen_update_trackfld));
+ m_screen->set_palette(m_palette);
+ m_screen->screen_vblank().set(FUNC(trackfld_state::vblank_irq));
GFXDECODE(config, m_gfxdecode, m_palette, gfx_trackfld);
PALETTE(config, m_palette, FUNC(trackfld_state::trackfld_palette), 16*16+16*16, 32);
@@ -940,26 +940,27 @@ MACHINE_CONFIG_START(trackfld_state::trackfld)
GENERIC_LATCH_8(config, "soundlatch");
- MCFG_DEVICE_ADD(m_soundbrd, TRACKFLD_AUDIO, 0, m_audiocpu, m_vlm)
+ TRACKFLD_AUDIO(config, m_soundbrd, 0, m_audiocpu, m_vlm);
- MCFG_DEVICE_ADD(m_dac, DAC_8BIT_R2R, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 0.4) // ls374.8e + r34-r47(20k) + r35-r53(10k) + r54(20k) + upc324.8f
- MCFG_DEVICE_ADD("vref", VOLTAGE_REGULATOR, 0) MCFG_VOLTAGE_REGULATOR_OUTPUT(5.0)
- MCFG_SOUND_ROUTE(0, "dac", 1.0, DAC_VREF_POS_INPUT) MCFG_SOUND_ROUTE(0, "dac", -1.0, DAC_VREF_NEG_INPUT)
+ DAC_8BIT_R2R(config, m_dac, 0).add_route(ALL_OUTPUTS, "speaker", 0.4); // ls374.8e + r34-r47(20k) + r35-r53(10k) + r54(20k) + upc324.8f
+ voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref", 0));
+ vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT);
+ vref.add_route(0, "dac", -1.0, DAC_VREF_NEG_INPUT);
- MCFG_DEVICE_ADD(m_sn, SN76496, SOUND_CLOCK/8)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 1.0)
+ SN76496(config, m_sn, SOUND_CLOCK/8);
+ m_sn->add_route(ALL_OUTPUTS, "speaker", 1.0);
- MCFG_DEVICE_ADD(m_vlm, VLM5030, VLM_CLOCK)
- MCFG_DEVICE_ADDRESS_MAP(0, vlm_map)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 1.0)
-MACHINE_CONFIG_END
+ VLM5030(config, m_vlm, VLM_CLOCK);
+ m_vlm->set_addrmap(0, &trackfld_state::vlm_map);
+ m_vlm->add_route(ALL_OUTPUTS, "speaker", 1.0);
+}
-MACHINE_CONFIG_START(trackfld_state::trackfldu)
+void trackfld_state::trackfldu(machine_config &config)
+{
trackfld(config);
- MCFG_DEVICE_REPLACE("maincpu", MC6809E, MASTER_CLOCK/6/2) /* exact M6809 model unknown */
- MCFG_DEVICE_PROGRAM_MAP(main_map)
-
-MACHINE_CONFIG_END
+ MC6809E(config.replace(), m_maincpu, MASTER_CLOCK/6/2); /* exact M6809 model unknown */
+ m_maincpu->set_addrmap(AS_PROGRAM, &trackfld_state::main_map);
+}
INTERRUPT_GEN_MEMBER(trackfld_state::yieartf_timer_irq)
{
@@ -967,16 +968,16 @@ INTERRUPT_GEN_MEMBER(trackfld_state::yieartf_timer_irq)
device.execute().set_input_line(INPUT_LINE_NMI, ASSERT_LINE);
}
-MACHINE_CONFIG_START(trackfld_state::yieartf)
-
+void trackfld_state::yieartf(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD(m_maincpu, MC6809E, MASTER_CLOCK/6/2) /* a guess for now */
- MCFG_DEVICE_PROGRAM_MAP(yieartf_map)
- MCFG_DEVICE_PERIODIC_INT_DRIVER(trackfld_state, yieartf_timer_irq, 480)
+ MC6809E(config, m_maincpu, MASTER_CLOCK/6/2); /* a guess for now */
+ m_maincpu->set_addrmap(AS_PROGRAM, &trackfld_state::yieartf_map);
+ m_maincpu->set_periodic_int(FUNC(trackfld_state::yieartf_timer_irq), attotime::from_hz(480));
// z80 isn't used
-// MCFG_DEVICE_ADD("audiocpu", Z80, SOUND_CLOCK/4)
-// MCFG_DEVICE_PROGRAM_MAP(sound_map)
+// Z80(config, m_audiocpu, SOUND_CLOCK/4);
+// m_audiocpu->set_addrmap(AS_PROGRAM, &trackfld_state::sound_map);
MCFG_MACHINE_START_OVERRIDE(trackfld_state,trackfld)
MCFG_MACHINE_RESET_OVERRIDE(trackfld_state,trackfld)
@@ -996,14 +997,14 @@ MACHINE_CONFIG_START(trackfld_state::yieartf)
WATCHDOG_TIMER(config, "watchdog");
/* video hardware */
- MCFG_SCREEN_ADD(m_screen, RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(32*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(trackfld_state, screen_update_trackfld)
- MCFG_SCREEN_PALETTE(m_palette)
- MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE(*this, trackfld_state, vblank_irq))
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_refresh_hz(60);
+ m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ m_screen->set_size(32*8, 32*8);
+ m_screen->set_visarea(0*8, 32*8-1, 2*8, 30*8-1);
+ m_screen->set_screen_update(FUNC(trackfld_state::screen_update_trackfld));
+ m_screen->set_palette(m_palette);
+ m_screen->screen_vblank().set(FUNC(trackfld_state::vblank_irq));
GFXDECODE(config, m_gfxdecode, m_palette, gfx_trackfld);
PALETTE(config, m_palette, FUNC(trackfld_state::trackfld_palette), 16*16+16*16, 32);
@@ -1014,19 +1015,20 @@ MACHINE_CONFIG_START(trackfld_state::yieartf)
GENERIC_LATCH_8(config, "soundlatch");
- MCFG_DEVICE_ADD(m_soundbrd, TRACKFLD_AUDIO, 0, finder_base::DUMMY_TAG, m_vlm)
+ TRACKFLD_AUDIO(config, m_soundbrd, 0, finder_base::DUMMY_TAG, m_vlm);
- MCFG_DEVICE_ADD(m_dac, DAC_8BIT_R2R, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 0.4) // ls374.8e + r34-r47(20k) + r35-r53(10k) + r54(20k) + upc324.8f
- MCFG_DEVICE_ADD("vref", VOLTAGE_REGULATOR, 0) MCFG_VOLTAGE_REGULATOR_OUTPUT(5.0)
- MCFG_SOUND_ROUTE(0, "dac", 1.0, DAC_VREF_POS_INPUT) MCFG_SOUND_ROUTE(0, "dac", -1.0, DAC_VREF_NEG_INPUT)
+ DAC_8BIT_R2R(config, m_dac, 0).add_route(ALL_OUTPUTS, "speaker", 0.4); // ls374.8e + r34-r47(20k) + r35-r53(10k) + r54(20k) + upc324.8f
+ voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref", 0));
+ vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT);
+ vref.add_route(0, "dac", -1.0, DAC_VREF_NEG_INPUT);
- MCFG_DEVICE_ADD(m_sn, SN76496, MASTER_CLOCK/6/2)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 1.0)
+ SN76496(config, m_sn, MASTER_CLOCK/6/2);
+ m_sn->add_route(ALL_OUTPUTS, "speaker", 1.0);
- MCFG_DEVICE_ADD(m_vlm, VLM5030, VLM_CLOCK)
- MCFG_DEVICE_ADDRESS_MAP(0, vlm_map)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 1.0)
-MACHINE_CONFIG_END
+ VLM5030(config, m_vlm, VLM_CLOCK);
+ m_vlm->set_addrmap(0, &trackfld_state::vlm_map);
+ m_vlm->add_route(ALL_OUTPUTS, "speaker", 1.0);
+}
void trackfld_state::hyprolyb_adpcm_map(address_map &map)
{
@@ -1053,7 +1055,8 @@ void trackfld_state::hyprolyb_adpcm_map(address_map &map)
/* same as the original, but uses ADPCM instead of VLM5030 */
/* also different memory handlers do handle that */
-MACHINE_CONFIG_START(trackfld_state::hyprolyb)
+void trackfld_state::hyprolyb(machine_config &config)
+{
trackfld(config);
m_audiocpu->set_addrmap(AS_PROGRAM, address_map_constructor(&std::remove_pointer_t<decltype(this)>::hyprolyb_sound_map, tag(), this));
@@ -1062,59 +1065,61 @@ MACHINE_CONFIG_START(trackfld_state::hyprolyb)
MCFG_MACHINE_RESET_OVERRIDE(trackfld_state,trackfld)
/* sound hardware */
- MCFG_DEVICE_REMOVE("vlm")
- MCFG_DEVICE_ADD("adpcm", M6802, XTAL(14'318'181)/8) /* unknown clock */
- MCFG_DEVICE_PROGRAM_MAP(hyprolyb_adpcm_map)
+ config.device_remove("vlm");
+ M6802(config, "adpcm", XTAL(14'318'181)/8).set_addrmap(AS_PROGRAM, &trackfld_state::hyprolyb_adpcm_map); /* unknown clock */
GENERIC_LATCH_8(config, "soundlatch2");
- MCFG_DEVICE_ADD("hyprolyb_adpcm", HYPROLYB_ADPCM, 0)
+ HYPROLYB_ADPCM(config, "hyprolyb_adpcm", 0);
- MCFG_DEVICE_ADD("msm", MSM5205, 384000)
- MCFG_MSM5205_VCLK_CB(WRITELINE("hyprolyb_adpcm", hyprolyb_adpcm_device, vck_callback)) /* VCK function */
- MCFG_MSM5205_PRESCALER_SELECTOR(S96_4B) /* 4 kHz */
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 0.5)
-MACHINE_CONFIG_END
+ msm5205_device &msm(MSM5205(config, "msm", 384000));
+ msm.vck_legacy_callback().set("hyprolyb_adpcm", FUNC(hyprolyb_adpcm_device::vck_callback));
+ msm.set_prescaler_selector(msm5205_device::S96_4B); /* 4 kHz */
+ msm.add_route(ALL_OUTPUTS, "speaker", 0.5);
+}
-MACHINE_CONFIG_START(trackfld_state::atlantol)
+void trackfld_state::atlantol(machine_config &config)
+{
hyprolyb(config);
MCFG_VIDEO_START_OVERRIDE(trackfld_state,atlantol)
-MACHINE_CONFIG_END
-
+}
-MACHINE_CONFIG_START(trackfld_state::mastkin)
+void trackfld_state::mastkin(machine_config &config)
+{
trackfld(config);
/* basic machine hardware */
- MCFG_DEVICE_REPLACE(m_maincpu, MC6809E, MASTER_CLOCK/6/2) /* a guess for now */
- MCFG_DEVICE_PROGRAM_MAP(mastkin_map)
+ MC6809E(config.replace(), m_maincpu, MASTER_CLOCK/6/2); /* a guess for now */
+ m_maincpu->set_addrmap(AS_PROGRAM, &trackfld_state::mastkin_map);
m_mainlatch->q_out_cb<3>().set_nop(); // actually not used
m_mainlatch->q_out_cb<4>().set_nop(); // actually not used
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(trackfld_state::wizzquiz)
+void trackfld_state::wizzquiz(machine_config &config)
+{
trackfld(config);
/* basic machine hardware */
// right cpu?
- MCFG_DEVICE_REPLACE(m_maincpu, M6800, 2048000) /* 1.400 MHz ??? */
- MCFG_DEVICE_PROGRAM_MAP(wizzquiz_map)
+ M6800(config.replace(), m_maincpu, 2048000); /* 1.400 MHz ??? */
+ m_maincpu->set_addrmap(AS_PROGRAM, &trackfld_state::wizzquiz_map);
m_screen->set_screen_vblank(DEVCB_WRITELINE(*this, trackfld_state, vblank_nmi));
m_mainlatch->q_out_cb<7>().set(FUNC(trackfld_state::nmi_mask_w));
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(trackfld_state::reaktor)
+void trackfld_state::reaktor(machine_config &config)
+{
trackfld(config);
/* basic machine hardware */
- MCFG_DEVICE_REPLACE(m_maincpu, Z80, MASTER_CLOCK/6)
- MCFG_DEVICE_PROGRAM_MAP(reaktor_map)
- MCFG_DEVICE_IO_MAP(reaktor_io_map)
-MACHINE_CONFIG_END
+ Z80(config.replace(), m_maincpu, MASTER_CLOCK/6);
+ m_maincpu->set_addrmap(AS_PROGRAM, &trackfld_state::reaktor_map);
+ m_maincpu->set_addrmap(AS_IO, &trackfld_state::reaktor_io_map);
+}
/***************************************************************************
diff --git a/src/mame/drivers/travrusa.cpp b/src/mame/drivers/travrusa.cpp
index 2e45691afa2..e692ebb0f08 100644
--- a/src/mame/drivers/travrusa.cpp
+++ b/src/mame/drivers/travrusa.cpp
@@ -304,49 +304,48 @@ void travrusa_state::machine_reset()
m_scrollx[1] = 0;
}
-MACHINE_CONFIG_START(travrusa_state::travrusa)
-
+void travrusa_state::travrusa(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, 4000000) /* 4 MHz (?) */
- MCFG_DEVICE_PROGRAM_MAP(main_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", travrusa_state, irq0_line_hold)
-
+ Z80(config, m_maincpu, 4000000); /* 4 MHz (?) */
+ m_maincpu->set_addrmap(AS_PROGRAM, &travrusa_state::main_map);
+ m_maincpu->set_vblank_int("screen", FUNC(travrusa_state::irq0_line_hold));
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(56.75)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(1790) /* accurate frequency, measured on a Moon Patrol board, is 56.75Hz. */)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(56.75);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(1790) /* accurate frequency, measured on a Moon Patrol board, is 56.75Hz. */);
/* the Lode Runner manual (similar but different hardware) */
/* talks about 55Hz and 1790ms vblank duration. */
- MCFG_SCREEN_SIZE(32*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(1*8, 31*8-1, 0*8, 32*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(travrusa_state, screen_update_travrusa)
- MCFG_SCREEN_PALETTE(m_palette)
-
- MCFG_DEVICE_ADD(m_gfxdecode, GFXDECODE, m_palette, gfx_travrusa)
+ screen.set_size(32*8, 32*8);
+ screen.set_visarea(1*8, 31*8-1, 0*8, 32*8-1);
+ screen.set_screen_update(FUNC(travrusa_state::screen_update_travrusa));
+ screen.set_palette(m_palette);
+ GFXDECODE(config, m_gfxdecode, m_palette, gfx_travrusa);
PALETTE(config, m_palette, FUNC(travrusa_state::travrusa_palette), 16*8+16*8, 128+16);
/* sound hardware */
//m52_sound_c_audio(config);
- MCFG_DEVICE_ADD("irem_audio", IREM_M52_SOUNDC_AUDIO, 0)
-
-MACHINE_CONFIG_END
+ IREM_M52_SOUNDC_AUDIO(config, "irem_audio", 0);
+}
-MACHINE_CONFIG_START(travrusa_state::shtrider)
+void travrusa_state::shtrider(machine_config &config)
+{
travrusa(config);
/* video hardware */
- MCFG_GFXDECODE_MODIFY("gfxdecode", gfx_shtrider)
+ m_gfxdecode->set_info(gfx_shtrider);
m_palette->set_init(FUNC(travrusa_state::shtrider_palette));
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(travrusa_state::shtriderb)
+void travrusa_state::shtriderb(machine_config &config)
+{
travrusa(config);
/* video hardware */
- MCFG_GFXDECODE_MODIFY("gfxdecode", gfx_shtrider)
-MACHINE_CONFIG_END
+ m_gfxdecode->set_info(gfx_shtrider);
+}
/***************************************************************************
diff --git a/src/mame/drivers/triforce.cpp b/src/mame/drivers/triforce.cpp
index 1c2e7af09cf..d4a9fc8aee0 100644
--- a/src/mame/drivers/triforce.cpp
+++ b/src/mame/drivers/triforce.cpp
@@ -19,81 +19,86 @@ use with Namco ROM carts.
Games on this system include....
- Year Game Manufacturer / Developer Media Number Key Chip PIC16C621A
-+-+------+-----------------------------------------------------------------+-------------------------------------+-------|----------------+--------------|---------------|
-| | 2002 | Starfox Armada (planned, but not released) | Namco / Nintendo | Cart? | | | |
-|*| 2002 | Virtua Striker 2002 (Japan) | Sega / Amusement Vision | GDROM | GDT-0001 | 317-0337-JPN | |
-|*| 2002 | Virtua Striker 2002 (Export) | Sega / Amusement Vision | GDROM | GDT-0002 | 317-0337-EXP | |
-| | 2003 | F-Zero AX | Sega / Amusement Vision / Nintendo | GDROM | GDT-0004 | 317-0362-COM | 253-5508-0362 |
-| | 2003 | F-Zero AX (Rev A) | Sega / Amusement Vision / Nintendo | GDROM | GDT-0004A | 317-0362-COM | 253-5508-0362 |
-| | 2003 | F-Zero AX (Rev B) | Sega / Amusement Vision / Nintendo | GDROM | GDT-0004B | 317-0362-COM | 253-5508-0362 |
-|*| 2003 | F-Zero AX (Rev C) | Sega / Amusement Vision / Nintendo | GDROM | GDT-0004C | 317-0362-COM | 253-5508-0362 |
-| | 2003 | F-Zero AX (Rev D) | Sega / Amusement Vision / Nintendo | GDROM | GDT-0004D | 317-0362-COM | 253-5508-0362 |
-|*| 2003 | F-Zero AX (Rev E) | Sega / Amusement Vision / Nintendo | GDROM | GDT-0004E | 317-0362-COM | 253-5508-0362 |
-| | 2003 | The Key Of Avalon: The Wizard Master (server) | Sega / Hitmaker | GDROM | GDT-0005 | 317-0355-JPN | 253-5508-0355J|
-| | 2003 | The Key Of Avalon: The Wizard Master (server) (Rev A) | Sega / Hitmaker | GDROM | GDT-0005A | 317-0355-JPN | 253-5508-0355J|
-| | 2003 | The Key Of Avalon: The Wizard Master (server) (Rev B) | Sega / Hitmaker | GDROM | GDT-0005B | 317-0355-JPN | 253-5508-0355J|
-|*| 2003 | The Key Of Avalon: The Wizard Master (server) (Rev C) | Sega / Hitmaker | GDROM | GDT-0005C | 317-0355-JPN | 253-5508-0355J|
-| | 2003 | The Key Of Avalon: The Wizard Master (server) (Rev D) | Sega / Hitmaker | GDROM | GDT-0005D | 317-0355-JPN | 253-5508-0355J|
-|*| 2003 | The Key Of Avalon: The Wizard Master (server) (Rev E) | Sega / Hitmaker | GDROM | GDT-0005E | 317-0355-JPN | 253-5508-0355J|
-|*| 2003 | The Key Of Avalon: The Wizard Master (server) (Rev F) | Sega / Hitmaker | GDROM | GDT-0005F | 317-0355-JPN | 253-5508-0355J|
-|*| 2003 | The Key Of Avalon: The Wizard Master (server) (Rev G) | Sega / Hitmaker | GDROM | GDT-0005G | 317-0355-JPN | 253-5508-0355J|
-| | 2003 | The Key Of Avalon: The Wizard Master (client) | Sega / Hitmaker | GDROM | GDT-0006 | 317-0355-JPN | 253-5508-0355J|
-| | 2003 | The Key Of Avalon: The Wizard Master (client) (Rev A) | Sega / Hitmaker | GDROM | GDT-0006A | 317-0355-JPN | 253-5508-0355J|
-| | 2003 | The Key Of Avalon: The Wizard Master (client) (Rev B) | Sega / Hitmaker | GDROM | GDT-0006B | 317-0355-JPN | 253-5508-0355J|
-|*| 2003 | The Key Of Avalon: The Wizard Master (client) (Rev C) | Sega / Hitmaker | GDROM | GDT-0006C | 317-0355-JPN | 253-5508-0355J|
-| | 2003 | The Key Of Avalon: The Wizard Master (client) (Rev D) | Sega / Hitmaker | GDROM | GDT-0006D | 317-0355-JPN | 253-5508-0355J|
-|*| 2003 | The Key Of Avalon: The Wizard Master (client) (Rev E) | Sega / Hitmaker | GDROM | GDT-0006E | 317-0355-JPN | 253-5508-0355J|
-|*| 2003 | The Key Of Avalon: The Wizard Master (client) (Rev F) | Sega / Hitmaker | GDROM | GDT-0006F | 317-0355-JPN | 253-5508-0355J|
-|*| 2003 | The Key Of Avalon: The Wizard Master (client) (Rev G) | Sega / Hitmaker | GDROM | GDT-0006G | 317-0355-JPN | 253-5508-0355J|
-| | 2003 | Gekitou Pro Yakyuu Mizushima Shinji All Stars | Sega / Wow Entertainment | GDROM | GDT-0008 | 317-0371-JPN | |
-| | 2003 | Gekitou Pro Yakyuu Mizushima Shinji All Stars (Rev A) | Sega / Wow Entertainment | GDROM | GDT-0008A | 317-0371-JPN | |
-|*| 2003 | Gekitou Pro Yakyuu Mizushima Shinji All Stars (Rev B) | Sega / Wow Entertainment | GDROM | GDT-0008B | 317-0371-JPN | |
-|*| 2003 | Gekitou Pro Yakyuu Mizushima Shinji All Stars (Rev C) | Sega / Wow Entertainment | GDROM | GDT-0008C | 317-0371-JPN | |
-| | 2003 | The Key Of Avalon 1.10 | Sega / Hitmaker | GDROM | | 317-0355-JPN | 253-5508-0355J|
-| | 2004 | The Key Of Avalon 1.??: ??? (server) | Sega / Hitmaker | GDROM | GDT-0009 | 317-0355-JPN | 253-5508-0355J|
-|*| 2004 | The Key Of Avalon 1.20: Summon The New Monster (server) (Rev A) | Sega / Hitmaker | GDROM | GDT-0009A | 317-0355-JPN | 253-5508-0355J|
-| | 2004 | The Key Of Avalon 1.??: ??? (server) (Rev B) | Sega / Hitmaker | GDROM | GDT-0009B | 317-0355-JPN | 253-5508-0355J|
-|*| 2004 | The Key Of Avalon 1.30: Chaotic Sabbat (server) (Rev C) | Sega / Hitmaker | GDROM | GDT-0009C | 317-0355-JPN | 253-5508-0355J|
-| | 2004 | The Key Of Avalon 1.??: ??? (client) | Sega / Hitmaker | GDROM | GDT-0010 | 317-0355-JPN | 253-5508-0355J|
-|*| 2004 | The Key Of Avalon 1.20: Summon The New Monster (client) (Rev A) | Sega / Hitmaker | GDROM | GDT-0010A | 317-0355-JPN | 253-5508-0355J|
-| | 2004 | The Key Of Avalon 1.??: ??? (client) (Rev B) | Sega / Hitmaker | GDROM | GDT-0010B | 317-0355-JPN | 253-5508-0355J|
-|*| 2004 | The Key Of Avalon 1.30: Chaotic Sabbat (client) (Rev C) | Sega / Hitmaker | GDROM | GDT-0010C | 317-0355-JPN | 253-5508-0355J|
-|*| 2004 | Firmware Update | Sega | GDROM | GDT-0011 | 317-0371-JPN | |
-| | 2004 | Virtua Striker 2002 (Export) | Sega | GDROM | GDT-0012 | | |
-| | 2004 | Virtua Striker 4 (Japan) | Sega | GDROM | GDT-0013 | 317-0391-JPN | |
-| | 2004 | Virtua Striker 4 (Japan) (Rev A) | Sega | GDROM | GDT-0013A | 317-0391-JPN | |
-| | 2004 | Virtua Striker 4 (Japan) (Rev B) | Sega | GDROM | GDT-0013B | 317-0391-JPN | |
-| | 2004 | Virtua Striker 4 (Japan) (Rev C) | Sega | GDROM | GDT-0013C | 317-0391-JPN | |
-| | 2004 | Virtua Striker 4 (Japan) (Rev D) | Sega | GDROM | GDT-0013D | 317-0391-JPN | |
-|*| 2004 | Virtua Striker 4 (Japan) (Rev E) | Sega | GDROM | GDT-0013E | 317-0391-JPN | |
-|*| 2004 | Virtua Striker 4 (Export) | Sega | GDROM | GDT-0014 | 317-0392-EXP | 253-5508-0392E|
-|*| 2004 | Virtua Striker 4 (Export) | Sega | GDROM | GDT-0015 | 317-0393-EXP | |
-| | 2004 | Virtua Striker 4 (Export) | Sega | CF | MDA-G0016 | 317-0393-EXP | |
-| | 2004 | The Key Of Avalon 2: Eutaxy Commandment (server) | Sega / Hitmaker | GDROM | GDT-0016 | 317-0403-JPN | 253-5508-0403J|
-| | 2004 | The Key Of Avalon 2: Eutaxy Commandment (client) | Sega / Hitmaker | GDROM | GDT-0017 | 317-0403-JPN | 253-5508-0403J|
-| | 2004 | The Key Of Avalon 2: Eutaxy Commandment (client) (Rev A) | Sega / Hitmaker | GDROM | GDT-0017A | 317-0403-JPN | 253-5508-0403J|
-|*| 2004 | The Key Of Avalon 2: Eutaxy Commandment (client) (Rev B) | Sega / Hitmaker | GDROM | GDT-0017B | 317-0403-JPN | 253-5508-0403J|
-|*| 2003 | F-Zero AX - Monster Ride Cycraft Edition | Sega / Amusement Vision / Nintendo | Cart | 837-14343-4S1 | 317-0373-COM | 253-5508-0373 |
-|*| 2005 | Mario Kart Arcade GP (Japan, MKA1 Ver.A1) | Namco / Nintendo | Cart | 837-14343-4T1 | 317-5109-COM | 253-5509-5109 |
-| | 2005 | The Key Of Avalon 2.5: War of the Key (server) | Sega / Hitmaker | GDROM | GDT-0018 | 317-0403-JPN | 253-5508-0403J|
-|*| 2005 | The Key Of Avalon 2.5: War of the Key (server) (Rev A) | Sega / Hitmaker | GDROM | GDT-0018A | 317-0403-JPN | 253-5508-0403J|
-|*| 2005 | The Key Of Avalon 2.5: War of the Key (server) (Rev B) | Sega / Hitmaker | GDROM | GDT-0018B | 317-0403-JPN | 253-5508-0403J|
-| | 2005 | The Key Of Avalon 2.5: War of the Key (client) | Sega / Hitmaker | GDROM | GDT-0019 | 317-0403-JPN | 253-5508-0403J|
-|*| 2005 | The Key Of Avalon 2.5: War of the Key (client) (Rev A) | Sega / Hitmaker | GDROM | GDT-0019A | 317-0403-JPN | 253-5508-0403J|
-|*| 2005 | The Key Of Avalon 2.5: War of the Key (client) (Rev B) | Sega / Hitmaker | GDROM | GDT-0019B | 317-0403-JPN | 253-5508-0403J|
-| | 2006 | Virtua Striker 4 Ver.2006 (Japan) | Sega | GDROM | GDT-0020 | 317-0432-JPN | 253-5508-0432J|
-| | 2006 | Virtua Striker 4 Ver.2006 (Japan) (Rev A) | Sega | GDROM | GDT-0020A | 317-0432-JPN | 253-5508-0432J|
-|*| 2006 | Virtua Striker 4 Ver.2006 (Japan) (Rev B) | Sega | GDROM | GDT-0020B | 317-0432-JPN | 253-5508-0432J|
-| | 2006 | Virtua Striker 4 Ver.2006 (Japan) (Rev C) | Sega | GDROM | GDT-0020C | 317-0432-JPN | 253-5508-0432J|
-|*| 2006 | Virtua Striker 4 Ver.2006 (Japan) (Rev D) | Sega | GDROM | GDT-0020D | 317-0432-JPN | 253-5508-0432J|
-|*| 2006 | Virtua Striker 4 Ver.2006 (Export) | Sega | GDROM | GDT-0021 | 317-0433-EXP | 253-5508-0433E|
-| | 2006 | Virtua Striker 4 Ver.2006 (Export) | Sega | CF | MDA-G00?? | 317-0433-EXP | 253-5508-0433E|
-| | 2006 | Triforce Firmware Update for Compact Flash Box | Sega | GDROM | GDT-0022 | 317-0567-COM | |
-|*| 2006 | Triforce Firmware Update for Compact Flash Box (Rev A) | Sega | GDROM | GDT-0022A | 317-0567-COM | |
-|*| 2007 | Mario Kart Arcade GP 2 (Japan, MK21 Ver.A) | Namco / Nintendo | Cart | 837-14343-R4S0 | 317-5128-COM | 253-5509-5128 |
-|*| 2007 | Mario Kart Arcade GP 2 (Japan, MK21 Ver.A, alt dump) | Namco / Nintendo | Cart | 837-14343-R4S0 | 317-5128-COM | 253-5509-5128 |
-+-+------+-----------------------------------------------------------------+-------------------------------------+-------|----------------+--------------+---------------|
+GD build date
+ yyyymmdd Game Manufacturer / Developer Media Number Key Chip PIC16C621A
++-+----------+----------------------------------------------------------------------+-------------------------------------+-------|----------------+--------------|---------------|
+| | 2002 | Starfox Armada (planned, but not released) | Namco / Nintendo | Cart? | | | |
+|*| 20020730 | Virtua Striker 2002 (Japan) | Sega / Amusement Vision | GDROM | GDT-0001 | 317-0337-JPN | |
+|*| 20020730 | Virtua Striker 2002 (Export) | Sega / Amusement Vision | GDROM | GDT-0002 | 317-0337-EXP | |
+| | 2003 | F-Zero AX | Sega / Amusement Vision / Nintendo | GDROM | GDT-0004 | 317-0362-COM | 253-5508-0362 |
+| | 2003 | F-Zero AX (Rev A) | Sega / Amusement Vision / Nintendo | GDROM | GDT-0004A | 317-0362-COM | 253-5508-0362 |
+| | 2003 | F-Zero AX (Rev B) | Sega / Amusement Vision / Nintendo | GDROM | GDT-0004B | 317-0362-COM | 253-5508-0362 |
+|*| 20030611 | F-Zero AX (Rev C) | Sega / Amusement Vision / Nintendo | GDROM | GDT-0004C | 317-0362-COM | 253-5508-0362 |
+|*| 20030628 | F-Zero AX (Rev D) | Sega / Amusement Vision / Nintendo | GDROM | GDT-0004D | 317-0362-COM | 253-5508-0362 |
+|*| 20031203 | F-Zero AX (Rev E) | Sega / Amusement Vision / Nintendo | GDROM | GDT-0004E | 317-0362-COM | 253-5508-0362 |
+| | 2003 | The Key Of Avalon: The Wizard Master (server) | Sega / Hitmaker | GDROM | GDT-0005 | 317-0355-JPN | 253-5508-0355J|
+|*| 20030706 | The Key Of Avalon: The Wizard Master (server, Rev A) | Sega / Hitmaker | GDROM | GDT-0005A | 317-0355-JPN | 253-5508-0355J|
+| | 200307 | The Key Of Avalon: The Wizard Master (server, Rev B) | Sega / Hitmaker | GDROM | GDT-0005B | 317-0355-JPN | 253-5508-0355J|
+|*| 20030721 | The Key Of Avalon: The Wizard Master (server, Rev C) | Sega / Hitmaker | GDROM | GDT-0005C | 317-0355-JPN | 253-5508-0355J|
+| | 2003 | The Key Of Avalon: The Wizard Master (server, Rev D) | Sega / Hitmaker | GDROM | GDT-0005D | 317-0355-JPN | 253-5508-0355J|
+|*| 20030815 | The Key Of Avalon: The Wizard Master (server, Rev E) | Sega / Hitmaker | GDROM | GDT-0005E | 317-0355-JPN | 253-5508-0355J|
+|*| 20030924 | The Key Of Avalon: The Wizard Master (server, Rev F) | Sega / Hitmaker | GDROM | GDT-0005F | 317-0355-JPN | 253-5508-0355J|
+|*| 20031125 | The Key Of Avalon: The Wizard Master (server, Rev G) | Sega / Hitmaker | GDROM | GDT-0005G | 317-0355-JPN | 253-5508-0355J|
+| | 2003 | The Key Of Avalon: The Wizard Master (client) | Sega / Hitmaker | GDROM | GDT-0006 | 317-0355-JPN | 253-5508-0355J|
+|*| 20030706 | The Key Of Avalon: The Wizard Master (client, Rev A) | Sega / Hitmaker | GDROM | GDT-0006A | 317-0355-JPN | 253-5508-0355J|
+| | 200307 | The Key Of Avalon: The Wizard Master (client, Rev B) | Sega / Hitmaker | GDROM | GDT-0006B | 317-0355-JPN | 253-5508-0355J|
+|*| 20030721 | The Key Of Avalon: The Wizard Master (client, Rev C) | Sega / Hitmaker | GDROM | GDT-0006C | 317-0355-JPN | 253-5508-0355J|
+| | 2003 | The Key Of Avalon: The Wizard Master (client, Rev D) | Sega / Hitmaker | GDROM | GDT-0006D | 317-0355-JPN | 253-5508-0355J|
+|*| 20030815 | The Key Of Avalon: The Wizard Master (client, Rev E) | Sega / Hitmaker | GDROM | GDT-0006E | 317-0355-JPN | 253-5508-0355J|
+|*| 20030924 | The Key Of Avalon: The Wizard Master (client, Rev F) | Sega / Hitmaker | GDROM | GDT-0006F | 317-0355-JPN | 253-5508-0355J|
+|*| 20031125 | The Key Of Avalon: The Wizard Master (client, Rev G) | Sega / Hitmaker | GDROM | GDT-0006G | 317-0355-JPN | 253-5508-0355J|
+| | 2003 | F-Zero AX (Asia) | Sega / Amusement Vision / Nintendo | GDROM | GDT-0007 | | |
+| | 2003 | Gekitou Pro Yakyuu Mizushima Shinji All Stars vs. Pro Yakyuu | Sega / Wow Entertainment | GDROM | GDT-0008 | 317-0371-JPN | 253-5508-0371J|
+| | 2003 | Gekitou Pro Yakyuu Mizushima Shinji All Stars vs. Pro Yakyuu (Rev A) | Sega / Wow Entertainment | GDROM | GDT-0008A | 317-0371-JPN | 253-5508-0371J|
+|*| 20031010 | Gekitou Pro Yakyuu Mizushima Shinji All Stars vs. Pro Yakyuu (Rev B) | Sega / Wow Entertainment | GDROM | GDT-0008B | 317-0371-JPN | 253-5508-0371J|
+|*| 20031027 | Gekitou Pro Yakyuu Mizushima Shinji All Stars vs. Pro Yakyuu (Rev C) | Sega / Wow Entertainment | GDROM | GDT-0008C | 317-0371-JPN | 253-5508-0371J|
+| | 2003 | The Key Of Avalon 1.10 | Sega / Hitmaker | GDROM | | 317-0355-JPN | 253-5508-0355J|
+| | 2004 | The Key Of Avalon 1.??: ??? (server) | Sega / Hitmaker | GDROM | GDT-0009 | 317-0355-JPN | 253-5508-0355J|
+|*| 2004 | The Key Of Avalon 1.20: Summon The New Monster (server, Rev A) | Sega / Hitmaker | GDROM | GDT-0009A | 317-0355-JPN | 253-5508-0355J|
+| | 2004 | The Key Of Avalon 1.??: ??? (server, Rev B) | Sega / Hitmaker | GDROM | GDT-0009B | 317-0355-JPN | 253-5508-0355J|
+|*| 20040608 | The Key Of Avalon 1.30: Chaotic Sabbat (server, Rev C) | Sega / Hitmaker | GDROM | GDT-0009C | 317-0355-JPN | 253-5508-0355J|
+| | 2004 | The Key Of Avalon 1.??: ??? (client) | Sega / Hitmaker | GDROM | GDT-0010 | 317-0355-JPN | 253-5508-0355J|
+|*| 2004 | The Key Of Avalon 1.20: Summon The New Monster (client, Rev A) | Sega / Hitmaker | GDROM | GDT-0010A | 317-0355-JPN | 253-5508-0355J|
+| | 2004 | The Key Of Avalon 1.??: ??? (client, Rev B) | Sega / Hitmaker | GDROM | GDT-0010B | 317-0355-JPN | 253-5508-0355J|
+|*| 20040608 | The Key Of Avalon 1.30: Chaotic Sabbat (client, Rev C) | Sega / Hitmaker | GDROM | GDT-0010C | 317-0355-JPN | 253-5508-0355J|
+|*| 20031110 | Firmware Update | Sega | GDROM | GDT-0011 | 317-0371-JPN | |
+|*| 20040315 | Virtua Striker 2002 (Type 3) | Sega | GDROM | GDT-0012 | 317-0337-EXP | |
+| | 2004 | Virtua Striker 4 (Japan) | Sega | GDROM | GDT-0013 | 317-0391-JPN | |
+| | 2004 | Virtua Striker 4 (Japan, Rev A) | Sega | GDROM | GDT-0013A | 317-0391-JPN | |
+| | 2004 | Virtua Striker 4 (Japan, Rev B) | Sega | GDROM | GDT-0013B | 317-0391-JPN | |
+|*| 20040913 | Virtua Striker 4 (Japan, Rev C) | Sega | GDROM | GDT-0013C | 317-0391-JPN | |
+| | 2004 | Virtua Striker 4 (Japan, Rev D) | Sega | GDROM | GDT-0013D | 317-0391-JPN | |
+|*| 20050217 | Virtua Striker 4 (Japan, Rev E) | Sega | GDROM | GDT-0013E | 317-0391-JPN | |
+|*| 20041203 | Virtua Striker 4 (Asia) | Sega | GDROM | GDT-0014 | 317-0392-EXP | 253-5508-0392E|
+| | 2004 | Virtua Striker 4 (Asia, Rev A) | Sega | GDROM | GDT-0014A | 317-0392-EXP | 253-5508-0392E|
+|*| 20050523 | Virtua Striker 4 (Asia, Rev B) | Sega | GDROM | GDT-0014B | 317-0392-EXP | 253-5508-0392E|
+|*| 20041202 | Virtua Striker 4 (Export) | Sega | GDROM | GDT-0015 | 317-0393-EXP | |
+|*| 20050411 | Virtua Striker 4 (Export, Rev A) | Sega | GDROM | GDT-0015A | 317-0393-EXP | |
+| | 20041202 | Virtua Striker 4 (Export) | Sega | CF | MDA-G0016 | 317-0393-EXP | |
+| | 2004 | The Key Of Avalon 2: Eutaxy Commandment (server) | Sega / Hitmaker | GDROM | GDT-0016 | 317-0403-JPN | 253-5508-0403J|
+| | 2004 | The Key Of Avalon 2: Eutaxy Commandment (client) | Sega / Hitmaker | GDROM | GDT-0017 | 317-0403-JPN | 253-5508-0403J|
+| | 2004 | The Key Of Avalon 2: Eutaxy Commandment (client, Rev A) | Sega / Hitmaker | GDROM | GDT-0017A | 317-0403-JPN | 253-5508-0403J|
+|*| 20041102 | The Key Of Avalon 2: Eutaxy Commandment (client, Rev B) | Sega / Hitmaker | GDROM | GDT-0017B | 317-0403-JPN | 253-5508-0403J|
+|*| 2003 | F-Zero AX - Monster Ride Cycraft Edition | Sega / Amusement Vision / Nintendo | Cart | 837-14343-4S1 | 317-0373-COM | 253-5508-0373 |
+|*| 2005 | Mario Kart Arcade GP (Japan, MKA1 Ver.A1) | Namco / Nintendo | Cart | 837-14343-4T1 | 317-5109-COM | 253-5509-5109 |
+| | 2005 | The Key Of Avalon 2.5: War of the Key (server) | Sega / Hitmaker | GDROM | GDT-0018 | 317-0403-JPN | 253-5508-0403J|
+|*| 20050518 | The Key Of Avalon 2.5: War of the Key (server, Rev A) | Sega / Hitmaker | GDROM | GDT-0018A | 317-0403-JPN | 253-5508-0403J|
+|*| 20050805 | The Key Of Avalon 2.5: War of the Key (server, Rev B) | Sega / Hitmaker | GDROM | GDT-0018B | 317-0403-JPN | 253-5508-0403J|
+| | 2005 | The Key Of Avalon 2.5: War of the Key (client) | Sega / Hitmaker | GDROM | GDT-0019 | 317-0403-JPN | 253-5508-0403J|
+|*| 20050518 | The Key Of Avalon 2.5: War of the Key (client, Rev A) | Sega / Hitmaker | GDROM | GDT-0019A | 317-0403-JPN | 253-5508-0403J|
+|*| 20050805 | The Key Of Avalon 2.5: War of the Key (client, Rev B) | Sega / Hitmaker | GDROM | GDT-0019B | 317-0403-JPN | 253-5508-0403J|
+| | 2006 | Virtua Striker 4 Ver.2006 (Japan) | Sega | GDROM | GDT-0020 | 317-0432-JPN | 253-5508-0432J|
+| | 2006 | Virtua Striker 4 Ver.2006 (Japan, Rev A) | Sega | GDROM | GDT-0020A | 317-0432-JPN | 253-5508-0432J|
+|*| 20060425 | Virtua Striker 4 Ver.2006 (Japan, Rev B) | Sega | GDROM | GDT-0020B | 317-0432-JPN | 253-5508-0432J|
+| | 2006 | Virtua Striker 4 Ver.2006 (Japan, Rev C) | Sega | GDROM | GDT-0020C | 317-0432-JPN | 253-5508-0432J|
+|*| 20061019 | Virtua Striker 4 Ver.2006 (Japan, Rev D) | Sega | GDROM | GDT-0020D | 317-0432-JPN | 253-5508-0432J|
+|*| 20060131 | Virtua Striker 4 Ver.2006 (Export) | Sega | GDROM | GDT-0021 | 317-0433-EXP | 253-5508-0433E|
+| | 2006 | Virtua Striker 4 Ver.2006 (Export) | Sega | CF | MDA-G00?? | 317-0433-EXP | 253-5508-0433E|
+| | 2006 | Triforce Firmware Update for Compact Flash Box | Sega | GDROM | GDT-0022 | 317-0567-COM | |
+|*| 20090331 | Triforce Firmware Update for Compact Flash Box (Rev A) | Sega | GDROM | GDT-0022A | 317-0567-COM | |
+|*| 2007 | Mario Kart Arcade GP 2 (Japan, MK21 Ver.A) | Namco / Nintendo | Cart | 837-14343-R4S0 | 317-5128-COM | 253-5509-5128 |
+|*| 2007 | Mario Kart Arcade GP 2 (Japan, MK21 Ver.A, alt dump) | Namco / Nintendo | Cart | 837-14343-R4S0 | 317-5128-COM | 253-5509-5128 |
++-+----------+----------------------------------------------------------------------+-------------------------------------+-------|----------------+--------------+---------------|
* denotes these games are archived.
! security PIC is not dumped
@@ -243,7 +248,7 @@ ROM Board (attached to CN3 of Media Board, ONLY for use with Namco ROM cart vers
837-14343 SEGA 2002
171-8228D
-837-14343R4S0 (sticker)
+MDK332V-0
|---------------|
| FLASH.IC6 |
| *FLASH.8S |
@@ -270,7 +275,17 @@ Notes:
FLASH.IC9 - Macronix 29LV400CTTC-70G 4MBit (512k x8 / 256k x16) 3V FLASH ROM (TSOP48)
CN1S - Connector joining to Media Board (located under the PCB)
CN2 - 10-pin JTAG Connector for reprogramming the FPGA (all JTAG connectors and required support parts are not populated)
- ProASIC - Actel ProASIC Plus APA075 TQG100 75000 Gate FPGA stamped '315-6419B' (TQFP100)
+ ProASIC - Actel ProASIC Plus APA075 TQG100 75000 Gate FPGA stamped '315-xxxx' (TQFP100)
+
+
+Games known to use this PCB include....
+ NANDROMs FLASH APA075 sticker
+Game # TSOP48 IC9# IC11S# 837-14343 Notes
+--------------------------------------------------------------------------------------------------------------------------------------------------
+F-Zero AX Monster Ride 4 (1Gb) present 315-6362 -4S1 Cart: 842-06CN4000
+Mario Kart Arcade Grand Prix (Japan, MKA1 Ver.A1) 4 (1Gb) present 315-6362 -4T1 requires V257 STR PCB steering wheel board
+Mario Kart Arcade Grand Prix 2 (Japan, MK21 Ver.A) 8 (512Mb) present 315-6419B -R4S0
+Mario Kart Arcade Grand Prix 2 (Japan, MK21 Ver.A, alt dump) 8 (512Mb) present 315-6419B -R4S0
Main Board (GameCube)
@@ -571,25 +586,24 @@ void triforce_state::machine_start()
descrambler(&rom[0x100], 0x1afe00);
}
-MACHINE_CONFIG_START(triforce_state::triforce_base)
-
+void triforce_state::triforce_base(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", PPC603, 64000000) /* Correct CPU is a PowerPC 750 (what Apple called "G3") with paired-single vector instructions added */
- MCFG_DEVICE_PROGRAM_MAP(gc_map)
+ PPC603(config, m_maincpu, 64000000); /* Correct CPU is a PowerPC 750 (what Apple called "G3") with paired-single vector instructions added */
+ m_maincpu->set_addrmap(AS_PROGRAM, &triforce_state::gc_map);
- MCFG_QUANTUM_TIME(attotime::from_hz(6000))
+ config.m_minimum_quantum = attotime::from_hz(6000);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_SIZE(640, 480)
- MCFG_SCREEN_VISIBLE_AREA(0, 639, 0, 479)
- MCFG_SCREEN_UPDATE_DRIVER(triforce_state, screen_update_triforce)
-
- MCFG_PALETTE_ADD("palette", 65536)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_size(640, 480);
+ screen.set_visarea(0, 639, 0, 479);
+ screen.set_screen_update(FUNC(triforce_state::screen_update_triforce));
-MACHINE_CONFIG_END
+ PALETTE(config, "palette").set_entries(65536);
+}
void triforce_state::triforcegd(machine_config &config)
{
@@ -669,6 +683,29 @@ ROM_END
/*
Title F-ZERO AX
+Media ID A677
+Media Config GD-ROM1/1
+Regions J
+Peripheral String 0000000
+Product Number GDT-0004D
+Version V4.000
+Release Date 20030628
+
+PIC16C621A-20/P (317-0362-COM)
+Sticker: 253-5508-0362
+*/
+ROM_START( fzeroaxd )
+ TRIFORCE_BIOS
+
+ DISK_REGION( "gdrom" )
+ DISK_IMAGE_READONLY( "gdt-0004d", 0, SHA1(e98498809485d0469098792e9a77aafe37c7086c) )
+
+ ROM_REGION( 0x4000, "pic", ROMREGION_ERASE)
+ ROM_LOAD( "317-0362-com.pic", 0x000000, 0x004000, CRC(23d83347) SHA1(ca5a629e7405710fd4fa0af7c668192bdf8ca725) )
+ROM_END
+
+/*
+Title F-ZERO AX
Media ID 06BB
Media Config GD-ROM1/1
Regions J
@@ -690,6 +727,16 @@ ROM_START( fzeroaxc )
ROM_LOAD( "317-0362-com.pic", 0x000000, 0x004000, CRC(23d83347) SHA1(ca5a629e7405710fd4fa0af7c668192bdf8ca725) )
ROM_END
+ROM_START( avalonsa )
+ TRIFORCE_BIOS
+
+ DISK_REGION( "gdrom" )
+ DISK_IMAGE_READONLY( "gdt-0005a", 0, SHA1(807ecf820e8054978dd637b413053dc3279c4bf4) )
+
+ ROM_REGION( 0x50, "pic", ROMREGION_ERASE)
+ ROM_LOAD("317-0355-jpn.data", 0x00, 0x50, CRC(9b9db9d8) SHA1(60aab36fcfd7a2850b2947effea70e44a06d1f78) )
+ROM_END
+
ROM_START( avalonsc )
TRIFORCE_BIOS
@@ -730,6 +777,16 @@ ROM_START( avalons )
ROM_LOAD("317-0355-jpn.data", 0x00, 0x50, CRC(9b9db9d8) SHA1(60aab36fcfd7a2850b2947effea70e44a06d1f78) )
ROM_END
+ROM_START( avalonca )
+ TRIFORCE_BIOS
+
+ DISK_REGION( "gdrom" )
+ DISK_IMAGE_READONLY( "gdt-0006a", 0, SHA1(cef39bcc6351d597474674699a193fa115a51447) )
+
+ ROM_REGION( 0x50, "pic", ROMREGION_ERASE)
+ ROM_LOAD("317-0355-jpn.data", 0x00, 0x50, CRC(9b9db9d8) SHA1(60aab36fcfd7a2850b2947effea70e44a06d1f78) )
+ROM_END
+
ROM_START( avaloncc )
TRIFORCE_BIOS
@@ -857,6 +914,26 @@ ROM_START( tfupdate )
ROM_LOAD("317-0371-jpn.data", 0x00, 0x50, CRC(08434e5e) SHA1(2121999e851f6f62ab845e6de40849d850ac9d1c) )
ROM_END
+ROM_START( vs2002t3 )
+ TRIFORCE_BIOS
+
+ DISK_REGION( "gdrom" )
+ DISK_IMAGE_READONLY( "gdt-0012", 0, SHA1(d533b99edea5814d446e80744166f3f1630c9d98) )
+
+ ROM_REGION( 0x50, "pic", ROMREGION_ERASE)
+ ROM_LOAD("317-0337-exp.data", 0x00, 0x50, CRC(aa6be604) SHA1(fabc43ecfb7ddf1d5a87f10884852027d6f4773b) )
+ROM_END
+
+ROM_START( vs4jc )
+ TRIFORCE_BIOS
+
+ DISK_REGION( "gdrom" )
+ DISK_IMAGE_READONLY( "gdt-0013c", 0, SHA1(9010371eac31bd8d211838ab7b73fc4887ee0b1c) )
+
+ ROM_REGION( 0x50, "pic", ROMREGION_ERASE)
+ ROM_LOAD("317-0391-jpn.data", 0x00, 0x50, CRC(0f2dbb73) SHA1(7b9d66abe85303b3e26b442a3a63feca1a0edbdb) )
+ROM_END
+
/*
Title VIRTUA STRIKER 4
Media ID 7BC9
@@ -881,7 +958,7 @@ ROM_START( vs4j )
ROM_LOAD("317-0391-jpn.data", 0x00, 0x50, CRC(0f2dbb73) SHA1(7b9d66abe85303b3e26b442a3a63feca1a0edbdb) )
ROM_END
-ROM_START( vs4e )
+ROM_START( vs4eo )
TRIFORCE_BIOS
DISK_REGION( "gdrom" )
@@ -891,6 +968,16 @@ ROM_START( vs4e )
ROM_LOAD("317-0392-exp.pic", 0x00, 0x4000, CRC(c8931261) SHA1(063faea92a987a5b3dc96455494cf5fc13052428) )
ROM_END
+ROM_START( vs4e )
+ TRIFORCE_BIOS
+
+ DISK_REGION( "gdrom" )
+ DISK_IMAGE_READONLY( "gdt-0014b", 0, SHA1(5d038a76a101fafcab5a514d3911f727becd7091) )
+
+ ROM_REGION( 0x4000, "pic", ROMREGION_ERASEFF)
+ ROM_LOAD("317-0392-exp.pic", 0x00, 0x4000, CRC(c8931261) SHA1(063faea92a987a5b3dc96455494cf5fc13052428) )
+ROM_END
+
/*
Title VIRTUA STRIKER 4
Media ID 93B2
@@ -911,7 +998,7 @@ PIC
255-5508-393E
317-0393-EXP
*/
-ROM_START( vs4 )
+ROM_START( vs4o )
TRIFORCE_BIOS
DISK_REGION( "gdrom" )
@@ -921,6 +1008,16 @@ ROM_START( vs4 )
ROM_LOAD("317-0393-exp.data", 0x00, 0x50, CRC(2dcfecd7) SHA1(d805168e1564051ae5c47876ade2c9843253c6b4) )
ROM_END
+ROM_START( vs4 )
+ TRIFORCE_BIOS
+
+ DISK_REGION( "gdrom" )
+ DISK_IMAGE_READONLY( "gdt-0015a", 0, SHA1(471cdaa3a14c37249f2dd47f6a661e325dd1cf8f) )
+
+ ROM_REGION( 0x50, "pic", ROMREGION_ERASE)
+ ROM_LOAD("317-0393-exp.data", 0x00, 0x50, CRC(2dcfecd7) SHA1(d805168e1564051ae5c47876ade2c9843253c6b4) )
+ROM_END
+
/*
Title TRF GDROM TBT SATL
Media ID 1348
@@ -1150,72 +1247,75 @@ ROM_END
/*Triforce*/GAME( 2002, triforce, 0, triforce_base, triforce, triforce_state, empty_init, ROT0, "Sega", "Triforce Bios", MACHINE_IS_SKELETON|MACHINE_IS_BIOS_ROOT )
/* GDT-xxxx (Sega GD-ROM games) */
-/* 0001 */ GAME( 2002, vs2002j, triforce, triforcegd, triforce, triforce_state, empty_init, ROT0, "Sega / Amusement Vision", "Virtua Striker 2002 (GDT-0001)", MACHINE_IS_SKELETON )
-/* 0002 */ GAME( 2002, vs2002ex, triforce, triforcegd, triforce, triforce_state, empty_init, ROT0, "Sega / Amusement Vision", "Virtua Striker 2002 (GDT-0002)", MACHINE_IS_SKELETON )
+/* 0001 */ GAME( 2002, vs2002j, triforce, triforcegd, triforce, triforce_state, empty_init, ROT0, "Sega / Amusement Vision", "Virtua Striker 2002 (Japan) (GDT-0001)", MACHINE_IS_SKELETON )
+/* 0002 */ GAME( 2002, vs2002ex, triforce, triforcegd, triforce, triforce_state, empty_init, ROT0, "Sega / Amusement Vision", "Virtua Striker 2002 (Export) (GDT-0002)", MACHINE_IS_SKELETON )
// 0003
// 0004 GAME( 2003, fzeroaxo, fzeroax, triforcegd, triforce, triforce_state, empty_init, ROT0, "Sega / Amusement Vision / Nintendo", "F-Zero AX (GDT-0004)", MACHINE_IS_SKELETON )
// 0004A GAME( 2003, fzeroaxa, fzeroax, triforcegd, triforce, triforce_state, empty_init, ROT0, "Sega / Amusement Vision / Nintendo", "F-Zero AX (Rev A) (GDT-0004A)", MACHINE_IS_SKELETON )
// 0004B GAME( 2003, fzeroaxb, fzeroax, triforcegd, triforce, triforce_state, empty_init, ROT0, "Sega / Amusement Vision / Nintendo", "F-Zero AX (Rev B) (GDT-0004B)", MACHINE_IS_SKELETON )
/* 0004C */ GAME( 2003, fzeroaxc, fzeroax, triforcegd, triforce, triforce_state, empty_init, ROT0, "Sega / Amusement Vision / Nintendo", "F-Zero AX (Rev C) (GDT-0004C)", MACHINE_IS_SKELETON )
-// 0004D GAME( 2003, fzeroaxd, fzeroax, triforcegd, triforce, triforce_state, empty_init, ROT0, "Sega / Amusement Vision / Nintendo", "F-Zero AX (Rev D) (GDT-0004D)", MACHINE_IS_SKELETON )
+/* 0004D */ GAME( 2003, fzeroaxd, fzeroax, triforcegd, triforce, triforce_state, empty_init, ROT0, "Sega / Amusement Vision / Nintendo", "F-Zero AX (Rev D) (GDT-0004D)", MACHINE_IS_SKELETON )
/* 0004E */ GAME( 2003, fzeroax, triforce, triforcegd, triforce, triforce_state, empty_init, ROT0, "Sega / Amusement Vision / Nintendo", "F-Zero AX (Rev E) (GDT-0004E)", MACHINE_IS_SKELETON )
// 0005 GAME( 2003, avalonso, avalons, triforcegd, triforce, triforce_state, empty_init, ROT0, "Sega / Hitmaker", "The Key Of Avalon - The Wizard Master (server) (GDT-0005)", MACHINE_IS_SKELETON )
-// 0005A GAME( 2003, avalonsa, avalons, triforcegd, triforce, triforce_state, empty_init, ROT0, "Sega / Hitmaker", "The Key Of Avalon - The Wizard Master (server) (Rev A) (GDT-0005A)", MACHINE_IS_SKELETON )
-// 0005B GAME( 2003, avalonsb, avalons, triforcegd, triforce, triforce_state, empty_init, ROT0, "Sega / Hitmaker", "The Key Of Avalon - The Wizard Master (server) (Rev B) (GDT-0005B)", MACHINE_IS_SKELETON )
-/* 0005C */ GAME( 2003, avalonsc, avalons, triforcegd, triforce, triforce_state, empty_init, ROT0, "Sega / Hitmaker", "The Key Of Avalon - The Wizard Master (server) (Rev C) (GDT-0005C)", MACHINE_IS_SKELETON )
-// 0005D GAME( 2003, avalonsd, avalons, triforcegd, triforce, triforce_state, empty_init, ROT0, "Sega / Hitmaker", "The Key Of Avalon - The Wizard Master (server) (Rev D) (GDT-0005D)", MACHINE_IS_SKELETON )
-/* 0005E */ GAME( 2003, avalonse, avalons, triforcegd, triforce, triforce_state, empty_init, ROT0, "Sega / Hitmaker", "The Key Of Avalon - The Wizard Master (server) (Rev E) (GDT-0005E)", MACHINE_IS_SKELETON )
-/* 0005F */ GAME( 2003, avalonsf, avalons, triforcegd, triforce, triforce_state, empty_init, ROT0, "Sega / Hitmaker", "The Key Of Avalon - The Wizard Master (server) (Rev F) (GDT-0005F)", MACHINE_IS_SKELETON )
-/* 0005G */ GAME( 2003, avalons, triforce, triforcegd, triforce, triforce_state, empty_init, ROT0, "Sega / Hitmaker", "The Key Of Avalon - The Wizard Master (server) (Rev G) (GDT-0005G)", MACHINE_IS_SKELETON )
+/* 0005A */ GAME( 2003, avalonsa, avalons, triforcegd, triforce, triforce_state, empty_init, ROT0, "Sega / Hitmaker", "The Key Of Avalon - The Wizard Master (server, Rev A) (GDT-0005A)", MACHINE_IS_SKELETON )
+// 0005B GAME( 2003, avalonsb, avalons, triforcegd, triforce, triforce_state, empty_init, ROT0, "Sega / Hitmaker", "The Key Of Avalon - The Wizard Master (server, Rev B) (GDT-0005B)", MACHINE_IS_SKELETON )
+/* 0005C */ GAME( 2003, avalonsc, avalons, triforcegd, triforce, triforce_state, empty_init, ROT0, "Sega / Hitmaker", "The Key Of Avalon - The Wizard Master (server, Rev C) (GDT-0005C)", MACHINE_IS_SKELETON )
+// 0005D GAME( 2003, avalonsd, avalons, triforcegd, triforce, triforce_state, empty_init, ROT0, "Sega / Hitmaker", "The Key Of Avalon - The Wizard Master (server, Rev D) (GDT-0005D)", MACHINE_IS_SKELETON )
+/* 0005E */ GAME( 2003, avalonse, avalons, triforcegd, triforce, triforce_state, empty_init, ROT0, "Sega / Hitmaker", "The Key Of Avalon - The Wizard Master (server, Rev E) (GDT-0005E)", MACHINE_IS_SKELETON )
+/* 0005F */ GAME( 2003, avalonsf, avalons, triforcegd, triforce, triforce_state, empty_init, ROT0, "Sega / Hitmaker", "The Key Of Avalon - The Wizard Master (server, Rev F) (GDT-0005F)", MACHINE_IS_SKELETON )
+/* 0005G */ GAME( 2003, avalons, triforce, triforcegd, triforce, triforce_state, empty_init, ROT0, "Sega / Hitmaker", "The Key Of Avalon - The Wizard Master (server, Rev G) (GDT-0005G)", MACHINE_IS_SKELETON )
// 0006 GAME( 2003, avalonco, avalonc, triforcegd, triforce, triforce_state, empty_init, ROT0, "Sega / Hitmaker", "The Key Of Avalon - The Wizard Master (client) (GDT-0006)", MACHINE_IS_SKELETON )
-// 0006A GAME( 2003, avalonca, avalonc, triforcegd, triforce, triforce_state, empty_init, ROT0, "Sega / Hitmaker", "The Key Of Avalon - The Wizard Master (client) (Rev A) (GDT-0006A)", MACHINE_IS_SKELETON )
-// 0006B GAME( 2003, avaloncb, avalonc, triforcegd, triforce, triforce_state, empty_init, ROT0, "Sega / Hitmaker", "The Key Of Avalon - The Wizard Master (client) (Rev B) (GDT-0006B)", MACHINE_IS_SKELETON )
-/* 0006C */ GAME( 2003, avaloncc, avalonc, triforcegd, triforce, triforce_state, empty_init, ROT0, "Sega / Hitmaker", "The Key Of Avalon - The Wizard Master (client) (Rev C) (GDT-0006C)", MACHINE_IS_SKELETON )
-// 0006D GAME( 2003, avaloncd, avalonc, triforcegd, triforce, triforce_state, empty_init, ROT0, "Sega / Hitmaker", "The Key Of Avalon - The Wizard Master (client) (Rev D) (GDT-0006D)", MACHINE_IS_SKELETON )
-/* 0006E */ GAME( 2003, avalonce, avalonc, triforcegd, triforce, triforce_state, empty_init, ROT0, "Sega / Hitmaker", "The Key Of Avalon - The Wizard Master (client) (Rev E) (GDT-0006E)", MACHINE_IS_SKELETON )
-/* 0006F */ GAME( 2003, avaloncf, avalonc, triforcegd, triforce, triforce_state, empty_init, ROT0, "Sega / Hitmaker", "The Key Of Avalon - The Wizard Master (client) (Rev F) (GDT-0006F)", MACHINE_IS_SKELETON )
-/* 0006G */ GAME( 2003, avalonc, triforce, triforcegd, triforce, triforce_state, empty_init, ROT0, "Sega / Hitmaker", "The Key Of Avalon - The Wizard Master (client) (Rev G) (GDT-0006G)", MACHINE_IS_SKELETON )
-// 0007
+/* 0006A */ GAME( 2003, avalonca, avalonc, triforcegd, triforce, triforce_state, empty_init, ROT0, "Sega / Hitmaker", "The Key Of Avalon - The Wizard Master (client, Rev A) (GDT-0006A)", MACHINE_IS_SKELETON )
+// 0006B GAME( 2003, avaloncb, avalonc, triforcegd, triforce, triforce_state, empty_init, ROT0, "Sega / Hitmaker", "The Key Of Avalon - The Wizard Master (client, Rev B) (GDT-0006B)", MACHINE_IS_SKELETON )
+/* 0006C */ GAME( 2003, avaloncc, avalonc, triforcegd, triforce, triforce_state, empty_init, ROT0, "Sega / Hitmaker", "The Key Of Avalon - The Wizard Master (client, Rev C) (GDT-0006C)", MACHINE_IS_SKELETON )
+// 0006D GAME( 2003, avaloncd, avalonc, triforcegd, triforce, triforce_state, empty_init, ROT0, "Sega / Hitmaker", "The Key Of Avalon - The Wizard Master (client, Rev D) (GDT-0006D)", MACHINE_IS_SKELETON )
+/* 0006E */ GAME( 2003, avalonce, avalonc, triforcegd, triforce, triforce_state, empty_init, ROT0, "Sega / Hitmaker", "The Key Of Avalon - The Wizard Master (client, Rev E) (GDT-0006E)", MACHINE_IS_SKELETON )
+/* 0006F */ GAME( 2003, avaloncf, avalonc, triforcegd, triforce, triforce_state, empty_init, ROT0, "Sega / Hitmaker", "The Key Of Avalon - The Wizard Master (client, Rev F) (GDT-0006F)", MACHINE_IS_SKELETON )
+/* 0006G */ GAME( 2003, avalonc, triforce, triforcegd, triforce, triforce_state, empty_init, ROT0, "Sega / Hitmaker", "The Key Of Avalon - The Wizard Master (client, Rev G) (GDT-0006G)", MACHINE_IS_SKELETON )
+// 0007 F-Zero AX (Asia)
// 0008 GAME( 2003, gekpuryao,gekpurya, triforcegd, triforce, triforce_state, empty_init, ROT0, "Sega / Wow Entertainment", "Gekitou Pro Yakyuu Mizushima Shinji All Stars vs. Pro Yakyuu (GDT-0008)", MACHINE_IS_SKELETON )
// 0008A GAME( 2003, gekpuryaa,gekpurya, triforcegd, triforce, triforce_state, empty_init, ROT0, "Sega / Wow Entertainment", "Gekitou Pro Yakyuu Mizushima Shinji All Stars vs. Pro Yakyuu (Rev A) (GDT-0008A)", MACHINE_IS_SKELETON )
/* 0008B */ GAME( 2003, gekpuryb, gekpurya, triforcegd, triforce, triforce_state, empty_init, ROT0, "Sega / Wow Entertainment", "Gekitou Pro Yakyuu Mizushima Shinji All Stars vs. Pro Yakyuu (Rev B) (GDT-0008B)", MACHINE_IS_SKELETON )
/* 0008C */ GAME( 2003, gekpurya, triforce, triforcegd, triforce, triforce_state, empty_init, ROT0, "Sega / Wow Entertainment", "Gekitou Pro Yakyuu Mizushima Shinji All Stars vs. Pro Yakyuu (Rev C) (GDT-0008C)", MACHINE_IS_SKELETON )
// 0009 GAME( 2004, avalns11, avalns13, triforcegd, triforce, triforce_state, empty_init, ROT0, "Sega / Hitmaker", "The Key Of Avalon 1.? - ??? (server) (GDT-0009)", MACHINE_IS_SKELETON )
-/* 0009A */ GAME( 2004, avalns12, avalns13, triforcegd, triforce, triforce_state, empty_init, ROT0, "Sega / Hitmaker", "The Key Of Avalon 1.2 - Summon The New Monsters (server) (Rev A) (GDT-0009A)", MACHINE_IS_SKELETON )
-// 0009B GAME( 2004, avals13b, avalns13, triforcegd, triforce, triforce_state, empty_init, ROT0, "Sega / Hitmaker", "The Key Of Avalon 1.? - ??? (server) (Rev B) (GDT-0009B)", MACHINE_IS_SKELETON )
-/* 0009C */ GAME( 2004, avalns13, triforce, triforcegd, triforce, triforce_state, empty_init, ROT0, "Sega / Hitmaker", "The Key Of Avalon 1.3 - Chaotic Sabbat (server) (Rev C) (GDT-0009C)", MACHINE_IS_SKELETON )
+/* 0009A */ GAME( 2004, avalns12, avalns13, triforcegd, triforce, triforce_state, empty_init, ROT0, "Sega / Hitmaker", "The Key Of Avalon 1.2 - Summon The New Monsters (server, Rev A) (GDT-0009A)", MACHINE_IS_SKELETON )
+// 0009B GAME( 2004, avals13b, avalns13, triforcegd, triforce, triforce_state, empty_init, ROT0, "Sega / Hitmaker", "The Key Of Avalon 1.? - ??? (server, Rev B) (GDT-0009B)", MACHINE_IS_SKELETON )
+/* 0009C */ GAME( 2004, avalns13, triforce, triforcegd, triforce, triforce_state, empty_init, ROT0, "Sega / Hitmaker", "The Key Of Avalon 1.3 - Chaotic Sabbat (server, Rev C) (GDT-0009C)", MACHINE_IS_SKELETON )
// 0010 GAME( 2004, avalnc11, avalnc13, triforcegd, triforce, triforce_state, empty_init, ROT0, "Sega / Hitmaker", "The Key Of Avalon 1.? - ??? (client) (GDT-0010)", MACHINE_IS_SKELETON )
-/* 0010A */ GAME( 2004, avalnc12, avalnc13, triforcegd, triforce, triforce_state, empty_init, ROT0, "Sega / Hitmaker", "The Key Of Avalon 1.2 - Summon The New Monsters (client) (Rev A) (GDT-0010A)", MACHINE_IS_SKELETON )
-// 0010B GAME( 2004, avalc13b, avalnc13, triforcegd, triforce, triforce_state, empty_init, ROT0, "Sega / Hitmaker", "The Key Of Avalon 1.? - ??? (client) (Rev B) (GDT-0010B)", MACHINE_IS_SKELETON )
-/* 0010C */ GAME( 2004, avalnc13, triforce, triforcegd, triforce, triforce_state, empty_init, ROT0, "Sega / Hitmaker", "The Key Of Avalon 1.3 - Chaotic Sabbat (client) (Rev C) (GDT-0010C)", MACHINE_IS_SKELETON )
-/* 0011 */ GAME( 2004, tfupdate, triforce, triforcegd, triforce, triforce_state, empty_init, ROT0, "Sega", "Triforce DIMM Updater (3.17) (GDT-0011)", MACHINE_IS_SKELETON )
-// 0012
-// 0013 GAME( 2005, vs4jo, vs4j, triforcegd, triforce, triforce_state, empty_init, ROT0, "Sega", "Virtua Striker 4 (Japan) (GDT-0013)", MACHINE_IS_SKELETON )
-// 0013A GAME( 2005, vs4ja, vs4j, triforcegd, triforce, triforce_state, empty_init, ROT0, "Sega", "Virtua Striker 4 (Japan) (Rev A) (GDT-0013A)", MACHINE_IS_SKELETON )
-// 0013B GAME( 2005, vs4jb, vs4j, triforcegd, triforce, triforce_state, empty_init, ROT0, "Sega", "Virtua Striker 4 (Japan) (Rev B) (GDT-0013B)", MACHINE_IS_SKELETON )
-// 0013C GAME( 2005, vs4jc, vs4j, triforcegd, triforce, triforce_state, empty_init, ROT0, "Sega", "Virtua Striker 4 (Japan) (Rev C) (GDT-0013C)", MACHINE_IS_SKELETON )
-// 0013D GAME( 2005, vs4jd, vs4j, triforcegd, triforce, triforce_state, empty_init, ROT0, "Sega", "Virtua Striker 4 (Japan) (Rev D) (GDT-0013D)", MACHINE_IS_SKELETON )
-/* 0013E */ GAME( 2005, vs4j, triforce, triforcegd, triforce, triforce_state, empty_init, ROT0, "Sega", "Virtua Striker 4 (Japan) (Rev E) (GDT-0013E)", MACHINE_IS_SKELETON )
-/* 0014 */ GAME( 2004, vs4e, vs4, triforcegd, triforce, triforce_state, empty_init, ROT0, "Sega", "Virtua Striker 4 (Export) (GDT-0014)", MACHINE_IS_SKELETON )
-/* 0015 */ GAME( 2004, vs4, triforce, triforcegd, triforce, triforce_state, empty_init, ROT0, "Sega", "Virtua Striker 4 (Export) (GDT-0015)", MACHINE_IS_SKELETON )
+/* 0010A */ GAME( 2004, avalnc12, avalnc13, triforcegd, triforce, triforce_state, empty_init, ROT0, "Sega / Hitmaker", "The Key Of Avalon 1.2 - Summon The New Monsters (client, Rev A) (GDT-0010A)", MACHINE_IS_SKELETON )
+// 0010B GAME( 2004, avalc13b, avalnc13, triforcegd, triforce, triforce_state, empty_init, ROT0, "Sega / Hitmaker", "The Key Of Avalon 1.? - ??? (client, Rev B) (GDT-0010B)", MACHINE_IS_SKELETON )
+/* 0010C */ GAME( 2004, avalnc13, triforce, triforcegd, triforce, triforce_state, empty_init, ROT0, "Sega / Hitmaker", "The Key Of Avalon 1.3 - Chaotic Sabbat (client, Rev C) (GDT-0010C)", MACHINE_IS_SKELETON )
+/* 0011 */ GAME( 2003, tfupdate, triforce, triforcegd, triforce, triforce_state, empty_init, ROT0, "Sega", "Triforce DIMM Updater (3.17) (GDT-0011)", MACHINE_IS_SKELETON )
+/* 0012 */ GAME( 2004, vs2002t3, triforce, triforcegd, triforce, triforce_state, empty_init, ROT0, "Sega / Amusement Vision", "Virtua Striker 2002 (Type 3) (GDT-0012)", MACHINE_IS_SKELETON )
+// 0013 GAME( 2004, vs4jo, vs4j, triforcegd, triforce, triforce_state, empty_init, ROT0, "Sega", "Virtua Striker 4 (Japan) (GDT-0013)", MACHINE_IS_SKELETON )
+// 0013A GAME( 2004, vs4ja, vs4j, triforcegd, triforce, triforce_state, empty_init, ROT0, "Sega", "Virtua Striker 4 (Japan, Rev A) (GDT-0013A)", MACHINE_IS_SKELETON )
+// 0013B GAME( 2004, vs4jb, vs4j, triforcegd, triforce, triforce_state, empty_init, ROT0, "Sega", "Virtua Striker 4 (Japan, Rev B) (GDT-0013B)", MACHINE_IS_SKELETON )
+/* 0013C */ GAME( 2004, vs4jc, vs4j, triforcegd, triforce, triforce_state, empty_init, ROT0, "Sega", "Virtua Striker 4 (Japan, Rev C) (GDT-0013C)", MACHINE_IS_SKELETON )
+// 0013D GAME( 2004, vs4jd, vs4j, triforcegd, triforce, triforce_state, empty_init, ROT0, "Sega", "Virtua Striker 4 (Japan, Rev D) (GDT-0013D)", MACHINE_IS_SKELETON )
+/* 0013E */ GAME( 2005, vs4j, triforce, triforcegd, triforce, triforce_state, empty_init, ROT0, "Sega", "Virtua Striker 4 (Japan, Rev E) (GDT-0013E)", MACHINE_IS_SKELETON )
+/* 0014 */ GAME( 2004, vs4eo, vs4, triforcegd, triforce, triforce_state, empty_init, ROT0, "Sega", "Virtua Striker 4 (Asia) (GDT-0014)", MACHINE_IS_SKELETON )
+// 0014A GAME( 2004, vs4ea, vs4, triforcegd, triforce, triforce_state, empty_init, ROT0, "Sega", "Virtua Striker 4 (Asia, Rev A) (GDT-0014A)", MACHINE_IS_SKELETON )
+/* 0014B */ GAME( 2005, vs4e, vs4, triforcegd, triforce, triforce_state, empty_init, ROT0, "Sega", "Virtua Striker 4 (Asia, Rev B) (GDT-0014B)", MACHINE_IS_SKELETON )
+/* 0015 */ GAME( 2004, vs4o, vs4, triforcegd, triforce, triforce_state, empty_init, ROT0, "Sega", "Virtua Striker 4 (Export) (GDT-0015)", MACHINE_IS_SKELETON )
+/* 0015A */ GAME( 2005, vs4, triforce, triforcegd, triforce, triforce_state, empty_init, ROT0, "Sega", "Virtua Striker 4 (Export, Rev A) (GDT-0015A)", MACHINE_IS_SKELETON )
// 0016 GAME( 2004, avalons20,triforce, triforcegd, triforce, triforce_state, empty_init, ROT0, "Sega / Hitmaker", "The Key Of Avalon 2.0 - Eutaxy and Commandment (server) (GDT-0016)", MACHINE_IS_SKELETON )
// 0017 GAME( 2004, avalon20o,avalon20, triforcegd, triforce, triforce_state, empty_init, ROT0, "Sega / Hitmaker", "The Key Of Avalon 2.0 - Eutaxy and Commandment (client) (GDT-0017)", MACHINE_IS_SKELETON )
-// 0017A GAME( 2004, avalon20a,avalon20, triforcegd, triforce, triforce_state, empty_init, ROT0, "Sega / Hitmaker", "The Key Of Avalon 2.0 - Eutaxy and Commandment (client) (Rev A) (GDT-0017A)", MACHINE_IS_SKELETON )
-/* 0017B */ GAME( 2004, avalon20, triforce, triforcegd, triforce, triforce_state, empty_init, ROT0, "Sega / Hitmaker", "The Key Of Avalon 2.0 - Eutaxy and Commandment (client) (Rev B) (GDT-0017B)", MACHINE_IS_SKELETON )
+// 0017A GAME( 2004, avalon20a,avalon20, triforcegd, triforce, triforce_state, empty_init, ROT0, "Sega / Hitmaker", "The Key Of Avalon 2.0 - Eutaxy and Commandment (client, Rev A) (GDT-0017A)", MACHINE_IS_SKELETON )
+/* 0017B */ GAME( 2004, avalon20, triforce, triforcegd, triforce, triforce_state, empty_init, ROT0, "Sega / Hitmaker", "The Key Of Avalon 2.0 - Eutaxy and Commandment (client, Rev B) (GDT-0017B)", MACHINE_IS_SKELETON )
// 0018 GAME( 2005, avalns25o,avalns25, triforcegd, triforce, triforce_state, empty_init, ROT0, "Sega / Hitmaker", "The Key Of Avalon 2.5 - War of the Key (server) (GDT-0018)", MACHINE_IS_SKELETON )
-/* 0018A */ GAME( 2005, avalns25a,avalns25, triforcegd, triforce, triforce_state, empty_init, ROT0, "Sega / Hitmaker", "The Key Of Avalon 2.5 - War of the Key (server) (Rev A) (GDT-0018A)", MACHINE_IS_SKELETON )
-/* 0018B */ GAME( 2005, avalns25, triforce, triforcegd, triforce, triforce_state, empty_init, ROT0, "Sega / Hitmaker", "The Key Of Avalon 2.5 - War of the Key (server) (Rev B) (GDT-0018B)", MACHINE_IS_SKELETON )
+/* 0018A */ GAME( 2005, avalns25a,avalns25, triforcegd, triforce, triforce_state, empty_init, ROT0, "Sega / Hitmaker", "The Key Of Avalon 2.5 - War of the Key (server, Rev A) (GDT-0018A)", MACHINE_IS_SKELETON )
+/* 0018B */ GAME( 2005, avalns25, triforce, triforcegd, triforce, triforce_state, empty_init, ROT0, "Sega / Hitmaker", "The Key Of Avalon 2.5 - War of the Key (server, Rev B) (GDT-0018B)", MACHINE_IS_SKELETON )
// 0019 GAME( 2005, avalnc25o,avalnc25, triforcegd, triforce, triforce_state, empty_init, ROT0, "Sega / Hitmaker", "The Key Of Avalon 2.5 - War of the Key (client) (GDT-0019)", MACHINE_IS_SKELETON )
-/* 0019A */ GAME( 2005, avalnc25a,avalnc25, triforcegd, triforce, triforce_state, empty_init, ROT0, "Sega / Hitmaker", "The Key Of Avalon 2.5 - War of the Key (client) (Rev A) (GDT-0019A)", MACHINE_IS_SKELETON )
-/* 0019B */ GAME( 2005, avalnc25, triforce, triforcegd, triforce, triforce_state, empty_init, ROT0, "Sega / Hitmaker", "The Key Of Avalon 2.5 - War of the Key (client) (Rev B) (GDT-0019B)", MACHINE_IS_SKELETON )
+/* 0019A */ GAME( 2005, avalnc25a,avalnc25, triforcegd, triforce, triforce_state, empty_init, ROT0, "Sega / Hitmaker", "The Key Of Avalon 2.5 - War of the Key (client, Rev A) (GDT-0019A)", MACHINE_IS_SKELETON )
+/* 0019B */ GAME( 2005, avalnc25, triforce, triforcegd, triforce, triforce_state, empty_init, ROT0, "Sega / Hitmaker", "The Key Of Avalon 2.5 - War of the Key (client, Rev B) (GDT-0019B)", MACHINE_IS_SKELETON )
// 0020 GAME( 2006, vs42006o, vs42006, triforcegd, triforce, triforce_state, empty_init, ROT0, "Sega", "Virtua Striker 4 Ver.2006 (Japan) (GDT-0020)", MACHINE_IS_SKELETON )
-// 0020A GAME( 2006, vs42006a, vs42006, triforcegd, triforce, triforce_state, empty_init, ROT0, "Sega", "Virtua Striker 4 Ver.2006 (Japan) (Rev A) (GDT-0020A)", MACHINE_IS_SKELETON )
-/* 0020B */ GAME( 2006, vs42006b, vs42006, triforcegd, triforce, triforce_state, empty_init, ROT0, "Sega", "Virtua Striker 4 Ver.2006 (Japan) (Rev B) (GDT-0020B)", MACHINE_IS_SKELETON )
-// 0020C GAME( 2006, vs42006c, vs42006, triforcegd, triforce, triforce_state, empty_init, ROT0, "Sega", "Virtua Striker 4 Ver.2006 (Japan) (Rev C) (GDT-0020C)", MACHINE_IS_SKELETON )
-/* 0020D */ GAME( 2006, vs42006, triforce, triforcegd, triforce, triforce_state, empty_init, ROT0, "Sega", "Virtua Striker 4 Ver.2006 (Japan) (Rev D) (GDT-0020D)", MACHINE_IS_SKELETON )
+// 0020A GAME( 2006, vs42006a, vs42006, triforcegd, triforce, triforce_state, empty_init, ROT0, "Sega", "Virtua Striker 4 Ver.2006 (Japan, Rev A) (GDT-0020A)", MACHINE_IS_SKELETON )
+/* 0020B */ GAME( 2006, vs42006b, vs42006, triforcegd, triforce, triforce_state, empty_init, ROT0, "Sega", "Virtua Striker 4 Ver.2006 (Japan, Rev B) (GDT-0020B)", MACHINE_IS_SKELETON )
+// 0020C GAME( 2006, vs42006c, vs42006, triforcegd, triforce, triforce_state, empty_init, ROT0, "Sega", "Virtua Striker 4 Ver.2006 (Japan, Rev C) (GDT-0020C)", MACHINE_IS_SKELETON )
+/* 0020D */ GAME( 2006, vs42006, triforce, triforcegd, triforce, triforce_state, empty_init, ROT0, "Sega", "Virtua Striker 4 Ver.2006 (Japan, Rev D) (GDT-0020D)", MACHINE_IS_SKELETON )
/* 0021 */ GAME( 2006, vs42k6ex, triforce, triforcegd, triforce, triforce_state, empty_init, ROT0, "Sega", "Virtua Striker 4 Ver.2006 (Export) (GDT-0021)", MACHINE_IS_SKELETON )
// 0022 GAME( 2006, tcfboxo, tcfboxa, triforcegd, triforce, triforce_state, empty_init, ROT0, "Sega", "Triforce Firmware Update For Compact Flash Box (GDT-0022)", MACHINE_IS_SKELETON )
-/* 0022A */ GAME( 2006, tcfboxa, triforce, triforcegd, triforce, triforce_state, empty_init, ROT0, "Sega", "Triforce Firmware Update For Compact Flash Box (4.01) (GDT-0022A)", MACHINE_IS_SKELETON )
+/* 0022A */ GAME( 2009, tcfboxa, triforce, triforcegd, triforce, triforce_state, empty_init, ROT0, "Sega", "Triforce Firmware Update For Compact Flash Box (4.01) (GDT-0022A)", MACHINE_IS_SKELETON )
// 837-xxxxx (Sega cart games)
/* 14343-4S1 */ GAME( 2003, fzeroaxm, triforce, triforce_base, triforce, triforce_state, empty_init, ROT0, "Sega / Amusement Vision / Nintendo", "F-Zero AX Monster Ride", MACHINE_IS_SKELETON ) // 2003/09/04
diff --git a/src/mame/drivers/trkfldch.cpp b/src/mame/drivers/trkfldch.cpp
new file mode 100644
index 00000000000..cde7b9594cf
--- /dev/null
+++ b/src/mame/drivers/trkfldch.cpp
@@ -0,0 +1,196 @@
+// license:BSD-3-Clause
+// copyright-holders:David Haywood
+/*
+
+Track & Field Challenge TV Game
+https://www.youtube.com/watch?v=wjn1lLylqog
+
+Uses epoxy blobs for CPU etc.
+These have been identified as Winbond 2005 BA5962 (large glob) + Winbond 200506 BA5934 (smaller glob)
+seems to be G65816 derived with custom vectors?
+
+PCB Game
+TV0001 R1.1 My First DDR
+TV0002 R1.0 Track & Field
+
+DDR & TF PCBs look identical, all the parts are in the same place, the traces are the same, and the silkscreened part # for resistors and caps are the same.
+
+currently dies after call at
+
+00:AE85: LDA $0b
+00:AE87: TAX
+00:AE88: LDA $0d
+00:AE8A: JSL $00a044
+
+00:A044: SEP #$20
+00:A046: PHA
+00:A047: REP #$20
+00:A049: DEX
+00:A04A: PHX
+00:A04B: RTL
+
+which pushes some values onto the stack, then RTLs to them (but the values at $0b and $0d at both 00, so it jumps to 0 and dies)
+
+*/
+
+#include "emu.h"
+
+#include "cpu/g65816/g65816.h"
+
+#include "emupal.h"
+#include "screen.h"
+#include "speaker.h"
+
+class trkfldch_state : public driver_device
+{
+public:
+ trkfldch_state(const machine_config &mconfig, device_type type, const char *tag) :
+ driver_device(mconfig, type, tag),
+ m_maincpu(*this, "maincpu"),
+ m_screen(*this, "screen"),
+ m_gfxdecode(*this, "gfxdecode")
+ { }
+
+ void trkfldch(machine_config &config);
+
+protected:
+ virtual void machine_start() override;
+ virtual void machine_reset() override;
+ virtual void video_start() override;
+
+private:
+
+ required_device<cpu_device> m_maincpu;
+ required_device<screen_device> m_screen;
+ required_device<gfxdecode_device> m_gfxdecode;
+
+ uint32_t screen_update_trkfldch(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
+ void trkfldch_map(address_map &map);
+
+ DECLARE_READ8_MEMBER(unk_7804_read);
+ DECLARE_READ8_MEMBER(unk_7805_read);
+};
+
+void trkfldch_state::video_start()
+{
+}
+
+uint32_t trkfldch_state::screen_update_trkfldch(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
+{
+ return 0;
+}
+
+
+READ8_MEMBER(trkfldch_state::unk_7804_read)
+{
+ return 0xff;
+}
+
+READ8_MEMBER(trkfldch_state::unk_7805_read)
+{
+ return 0xff;
+}
+
+void trkfldch_state::trkfldch_map(address_map &map)
+{
+ map(0x000000, 0x003fff).ram();
+
+ map(0x006800, 0x006cff).ram();
+
+ map(0x007000, 0x0072ff).ram();
+
+ // 7800 - 78xx look like registers?
+ map(0x007804, 0x007804).r(FUNC(trkfldch_state::unk_7804_read));
+ map(0x007805, 0x007805).r(FUNC(trkfldch_state::unk_7805_read));
+
+ map(0x008000, 0x3fffff).rom().region("maincpu", 0x000000); // good for code mapped at 008000 and 050000 at least
+}
+
+static INPUT_PORTS_START( trkfldch )
+INPUT_PORTS_END
+
+// dummy, doesn't appear to be tile based
+static const gfx_layout tiles8x8_layout =
+{
+ 8,8,
+ RGN_FRAC(1,1),
+ 8,
+ { 0, 1, 2, 3, 4, 5, 6, 7 },
+ { 0, 8, 16, 24, 32, 40, 48, 56 },
+ { 0*64, 1*64, 2*64, 3*64, 4*64, 5*64, 6*64, 7*64 },
+ 64*8
+};
+
+static GFXDECODE_START( gfx_trkfldch )
+ GFXDECODE_ENTRY( "maincpu", 0, tiles8x8_layout, 0, 1 )
+GFXDECODE_END
+
+void trkfldch_state::machine_start()
+{
+}
+
+void trkfldch_state::machine_reset()
+{
+ uint8_t *rom = memregion("maincpu")->base();
+
+ int vector = 0xe;
+
+ /* what appears to be a table of vectors apepars at the START of ROM, maybe this gets copied to RAM, maybe used directly?
+ 0: (invalid)
+ 1: (invalid)
+ 2: 0xA2C6
+ 3: 0xA334
+ 4: 0xA300
+ 5: 0xA2E0
+ 6: 0xA2B9
+ 7: 0xA2ED // possible irq vector pointer, THIS IS NOT THE BOOT CODE!
+ 8: 0xA2D3
+ 9: 0xA327
+ a: 0xA30D
+ b: 0x6000
+ c: 0xA31A
+ d: 0xA2AC
+ e: 0xA341
+ f: (invalid)
+ */
+
+ uint16_t addr = (rom[vector * 2 + 1] << 8) | (rom[vector * 2]);
+
+ m_maincpu->set_state_int(1, addr);
+}
+
+void trkfldch_state::trkfldch(machine_config &config)
+{
+ /* basic machine hardware */
+ G65816(config, m_maincpu, 20000000);
+ //m_maincpu->set_addrmap(AS_DATA, &tv965_state::mem_map);
+ m_maincpu->set_addrmap(AS_PROGRAM, &trkfldch_state::trkfldch_map);
+
+ /* video hardware */
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_refresh_hz(60);
+ m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ m_screen->set_size(320, 240);
+ m_screen->set_visarea(0, 320-1, 0, 240-1);
+ m_screen->set_screen_update(FUNC(trkfldch_state::screen_update_trkfldch));
+ m_screen->set_palette("palette");
+
+
+ GFXDECODE(config, m_gfxdecode, "palette", gfx_trkfldch); // dummy
+ PALETTE(config, "palette").set_format(palette_device::xRGB_444, 0x100).set_endianness(ENDIANNESS_BIG); // dummy
+}
+
+ROM_START( trkfldch )
+ ROM_REGION( 0x400000, "maincpu", 0 )
+ ROM_LOAD( "trackandfield.bin", 0x000000, 0x400000, CRC(f4f1959d) SHA1(344dbfe8df1897adf77da6e5ca0435c4d47d6842) )
+ROM_END
+
+ROM_START( my1stddr )
+ ROM_REGION( 0x400000, "maincpu", 0 )
+ ROM_LOAD( "myfirstddr.bin", 0x000000, 0x400000, CRC(2ef57bfc) SHA1(9feea5adb9de8fe17e915f3a037e8ddd70e58ae7) )
+ROM_END
+
+
+CONS( 2007, trkfldch, 0, 0, trkfldch, trkfldch,trkfldch_state, empty_init, "Konami", "Track & Field Challenge", MACHINE_NOT_WORKING | MACHINE_NO_SOUND )
+CONS( 2006, my1stddr, 0, 0, trkfldch, trkfldch,trkfldch_state, empty_init, "Konami", "My First Dance Dance Revolution (US)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) // Japan version has different songs
+
diff --git a/src/mame/drivers/trs80.cpp b/src/mame/drivers/trs80.cpp
index c3362b9414e..9d1d20c9c66 100644
--- a/src/mame/drivers/trs80.cpp
+++ b/src/mame/drivers/trs80.cpp
@@ -158,6 +158,7 @@ lnw80: works
#include "emu.h"
#include "includes/trs80.h"
+#include "machine/com8116.h"
#include "sound/ay8910.h"
#include "screen.h"
#include "speaker.h"
@@ -204,7 +205,7 @@ void trs80_state::m1_io(address_map &map)
map.global_mask(0xff);
map.unmap_value_high();
map(0xe8, 0xe8).rw(FUNC(trs80_state::port_e8_r), FUNC(trs80_state::port_e8_w));
- map(0xe9, 0xe9).portr("E9").w(m_brg, FUNC(com8116_device::stt_str_w));
+ map(0xe9, 0xe9).portr("E9").w("brg", FUNC(com8116_device::stt_str_w));
map(0xea, 0xea).rw(FUNC(trs80_state::port_ea_r), FUNC(trs80_state::port_ea_w));
map(0xeb, 0xeb).rw(m_uart, FUNC(ay31015_device::receive), FUNC(ay31015_device::transmit));
map(0xff, 0xff).rw(FUNC(trs80_state::port_ff_r), FUNC(trs80_state::port_ff_w));
@@ -255,9 +256,12 @@ void trs80_state::lnw80_io(address_map &map)
{
map.global_mask(0xff);
map.unmap_value_high();
- m1_io(map);
- map(0xe9, 0xe9).nopw();
+ map(0xe8, 0xe8).rw(FUNC(trs80_state::port_e8_r), FUNC(trs80_state::port_e8_w));
+ map(0xe9, 0xe9).portr("E9");
+ map(0xea, 0xea).rw(FUNC(trs80_state::port_ea_r), FUNC(trs80_state::port_ea_w));
+ map(0xeb, 0xeb).rw(m_uart, FUNC(ay31015_device::receive), FUNC(ay31015_device::transmit));
map(0xfe, 0xfe).rw(FUNC(trs80_state::lnw80_fe_r), FUNC(trs80_state::lnw80_fe_w));
+ map(0xff, 0xff).rw(FUNC(trs80_state::port_ff_r), FUNC(trs80_state::port_ff_w));
}
void trs80_state::radionic_mem(address_map &map)
@@ -498,17 +502,18 @@ static void trs80_floppies(device_slot_interface &device)
}
-MACHINE_CONFIG_START(trs80_state::trs80) // the original model I, level I, with no extras
+void trs80_state::trs80(machine_config &config) // the original model I, level I, with no extras
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, 10.6445_MHz_XTAL / 6)
- MCFG_DEVICE_PROGRAM_MAP(trs80_mem)
- MCFG_DEVICE_IO_MAP(trs80_io)
+ Z80(config, m_maincpu, 10.6445_MHz_XTAL / 6);
+ m_maincpu->set_addrmap(AS_PROGRAM, &trs80_state::trs80_mem);
+ m_maincpu->set_addrmap(AS_IO, &trs80_state::trs80_io);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_RAW_PARAMS(10.6445_MHz_XTAL, 672, 0, 384, 264, 0, 192)
- MCFG_SCREEN_UPDATE_DRIVER(trs80_state, screen_update_trs80)
- MCFG_SCREEN_PALETTE("palette")
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_raw(10.6445_MHz_XTAL, 672, 0, 384, 264, 0, 192);
+ screen.set_screen_update(FUNC(trs80_state::screen_update_trs80));
+ screen.set_palette("palette");
GFXDECODE(config, "gfxdecode", "palette", gfx_trs80);
PALETTE(config, "palette", palette_device::MONOCHROME);
@@ -516,52 +521,47 @@ MACHINE_CONFIG_START(trs80_state::trs80) // the original model I, level I,
/* sound hardware */
SPEAKER(config, "mono").front_center();
SPEAKER_SOUND(config, "speaker").add_route(ALL_OUTPUTS, "mono", 0.50);
- WAVE(config, "wave", "cassette").add_route(ALL_OUTPUTS, "mono", 0.05);
+ WAVE(config, "wave", m_cassette).add_route(ALL_OUTPUTS, "mono", 0.05);
/* devices */
- MCFG_CASSETTE_ADD("cassette")
-MACHINE_CONFIG_END
+ CASSETTE(config, m_cassette);
+}
MACHINE_CONFIG_START(trs80_state::model1) // model I, level II
trs80(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(m1_mem)
- MCFG_DEVICE_IO_MAP(m1_io)
- MCFG_DEVICE_PERIODIC_INT_DRIVER(trs80_state, rtc_interrupt, 40)
+ m_maincpu->set_addrmap(AS_PROGRAM, &trs80_state::m1_mem);
+ m_maincpu->set_addrmap(AS_IO, &trs80_state::m1_io);
+ m_maincpu->set_periodic_int(FUNC(trs80_state::rtc_interrupt), attotime::from_hz(40));
/* devices */
- MCFG_CASSETTE_MODIFY("cassette")
- MCFG_CASSETTE_FORMATS(trs80l2_cassette_formats)
- MCFG_CASSETTE_DEFAULT_STATE(CASSETTE_PLAY)
+ m_cassette->set_formats(trs80l2_cassette_formats);
+ m_cassette->set_default_state(CASSETTE_PLAY);
- MCFG_QUICKLOAD_ADD("quickload", trs80_state, trs80_cmd, "cmd", 1.0)
+ MCFG_QUICKLOAD_ADD("quickload", trs80_state, trs80_cmd, "cmd", attotime::from_seconds(1))
FD1793(config, m_fdc, 4_MHz_XTAL / 4); // todo: should be fd1771
m_fdc->intrq_wr_callback().set(FUNC(trs80_state::intrq_w));
- MCFG_FLOPPY_DRIVE_ADD("fdc:0", trs80_floppies, "sssd", trs80_state::floppy_formats)
- MCFG_FLOPPY_DRIVE_SOUND(true)
- MCFG_FLOPPY_DRIVE_ADD("fdc:1", trs80_floppies, "sssd", trs80_state::floppy_formats)
- MCFG_FLOPPY_DRIVE_SOUND(true)
- MCFG_FLOPPY_DRIVE_ADD("fdc:2", trs80_floppies, "", trs80_state::floppy_formats)
- MCFG_FLOPPY_DRIVE_SOUND(true)
- MCFG_FLOPPY_DRIVE_ADD("fdc:3", trs80_floppies, "", trs80_state::floppy_formats)
- MCFG_FLOPPY_DRIVE_SOUND(true)
+ FLOPPY_CONNECTOR(config, "fdc:0", trs80_floppies, "sssd", trs80_state::floppy_formats).enable_sound(true);
+ FLOPPY_CONNECTOR(config, "fdc:1", trs80_floppies, "sssd", trs80_state::floppy_formats).enable_sound(true);
+ FLOPPY_CONNECTOR(config, "fdc:2", trs80_floppies, "", trs80_state::floppy_formats).enable_sound(true);
+ FLOPPY_CONNECTOR(config, "fdc:3", trs80_floppies, "", trs80_state::floppy_formats).enable_sound(true);
- MCFG_DEVICE_ADD(m_centronics, CENTRONICS, centronics_devices, "printer")
- MCFG_CENTRONICS_BUSY_HANDLER(WRITELINE("cent_status_in", input_buffer_device, write_bit7))
- MCFG_CENTRONICS_PERROR_HANDLER(WRITELINE("cent_status_in", input_buffer_device, write_bit6))
- MCFG_CENTRONICS_SELECT_HANDLER(WRITELINE("cent_status_in", input_buffer_device, write_bit5))
- MCFG_CENTRONICS_FAULT_HANDLER(WRITELINE("cent_status_in", input_buffer_device, write_bit4))
+ CENTRONICS(config, m_centronics, centronics_devices, "printer");
+ m_centronics->busy_handler().set(m_cent_status_in, FUNC(input_buffer_device::write_bit7));
+ m_centronics->perror_handler().set(m_cent_status_in, FUNC(input_buffer_device::write_bit6));
+ m_centronics->select_handler().set(m_cent_status_in, FUNC(input_buffer_device::write_bit5));
+ m_centronics->fault_handler().set(m_cent_status_in, FUNC(input_buffer_device::write_bit4));
- MCFG_DEVICE_ADD("cent_status_in", INPUT_BUFFER, 0)
+ INPUT_BUFFER(config, m_cent_status_in);
- MCFG_CENTRONICS_OUTPUT_LATCH_ADD("cent_data_out", "centronics")
+ OUTPUT_LATCH(config, m_cent_data_out);
+ m_centronics->set_output_latch(*m_cent_data_out);
- COM8116(config, m_brg, 5.0688_MHz_XTAL); // BR1941L
- m_brg->fr_handler().set(m_uart, FUNC(ay31015_device::write_rcp));
- m_brg->ft_handler().set(m_uart, FUNC(ay31015_device::write_tcp));
+ com8116_device &brg(COM8116(config, "brg", 5.0688_MHz_XTAL)); // BR1941L
+ brg.fr_handler().set(m_uart, FUNC(ay31015_device::write_rcp));
+ brg.ft_handler().set(m_uart, FUNC(ay31015_device::write_tcp));
AY31015(config, m_uart);
m_uart->read_si_callback().set("rs232", FUNC(rs232_port_device::rxd_r));
@@ -571,34 +571,44 @@ MACHINE_CONFIG_START(trs80_state::model1) // model I, level II
RS232_PORT(config, "rs232", default_rs232_devices, nullptr);
MACHINE_CONFIG_END
-MACHINE_CONFIG_START(trs80_state::sys80)
+void trs80_state::sys80(machine_config &config)
+{
model1(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_IO_MAP(sys80_io)
- MCFG_DEVICE_REMOVE("brg")
-MACHINE_CONFIG_END
+ m_maincpu->set_addrmap(AS_IO, &trs80_state::sys80_io);
+
+ config.device_remove("brg");
+ CLOCK(config, m_uart_clock, 19200 * 16);
+ m_uart_clock->signal_handler().set(m_uart, FUNC(ay31015_device::write_rcp));
+ m_uart_clock->signal_handler().append(m_uart, FUNC(ay31015_device::write_tcp));
+}
-MACHINE_CONFIG_START(trs80_state::ht1080z)
+void trs80_state::sys80p(machine_config &config)
+{
sys80(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_IO_MAP(ht1080z_io)
+ m_maincpu->set_clock(10.48_MHz_XTAL / 6);
+ subdevice<screen_device>("screen")->set_raw(10.48_MHz_XTAL, 672, 0, 384, 312, 0, 192);
+}
- MCFG_SCREEN_MODIFY("screen")
- MCFG_SCREEN_UPDATE_DRIVER(trs80_state, screen_update_ht1080z)
- MCFG_GFXDECODE_MODIFY("gfxdecode", gfx_ht1080z)
+void trs80_state::ht1080z(machine_config &config)
+{
+ sys80p(config);
+ m_maincpu->set_addrmap(AS_IO, &trs80_state::ht1080z_io);
+
+ subdevice<screen_device>("screen")->set_screen_update(FUNC(trs80_state::screen_update_ht1080z));
+ subdevice<gfxdecode_device>("gfxdecode")->set_info(gfx_ht1080z);
AY8910(config, "ay1", 1'500'000).add_route(ALL_OUTPUTS, "mono", 0.25); // guess of clock
//ay1.port_a_read_callback(FUNC(trs80_state::...); // ports are some kind of expansion slot
//ay1.port_b_read_callback(FUNC(trs80_state::...);
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(trs80_state::lnw80)
+void trs80_state::lnw80(machine_config &config)
+{
model1(config);
- MCFG_DEVICE_MODIFY("maincpu")
- //MCFG_DEVICE_CLOCK(16_MHz_XTAL / 4) // or 16MHz / 9; 4MHz or 1.77MHz operation selected by HI/LO switch
- MCFG_DEVICE_CLOCK(16_MHz_XTAL / 9) // need this so cassette can work
- MCFG_DEVICE_PROGRAM_MAP(lnw80_mem)
- MCFG_DEVICE_IO_MAP(lnw80_io)
+ //m_maincpu->set_clock(16_MHz_XTAL / 4); // or 16MHz / 9; 4MHz or 1.77MHz operation selected by HI/LO switch
+ m_maincpu->set_clock(16_MHz_XTAL / 9); // need this so cassette can work
+ m_maincpu->set_addrmap(AS_PROGRAM, &trs80_state::lnw80_mem);
+ m_maincpu->set_addrmap(AS_IO, &trs80_state::lnw80_io);
ADDRESS_MAP_BANK(config, m_lnw_bank, 0);
m_lnw_bank->set_addrmap(0, &trs80_state::lnw_banked_mem);
@@ -608,29 +618,32 @@ MACHINE_CONFIG_START(trs80_state::lnw80)
MCFG_MACHINE_RESET_OVERRIDE(trs80_state, lnw80)
- MCFG_GFXDECODE_MODIFY("gfxdecode", gfx_lnw80)
+ subdevice<gfxdecode_device>("gfxdecode")->set_info(gfx_lnw80);
subdevice<palette_device>("palette")->set_entries(8).set_init(FUNC(trs80_state::lnw80_palette));
- MCFG_SCREEN_MODIFY("screen")
- MCFG_SCREEN_RAW_PARAMS(3.579545_MHz_XTAL * 3, 682, 0, 480, 264, 0, 192) // 10.738MHz generated by tank circuit (top left of page 2 of schematics)
+ subdevice<screen_device>("screen")->set_raw(3.579545_MHz_XTAL * 3, 682, 0, 480, 264, 0, 192); // 10.738MHz generated by tank circuit (top left of page 2 of schematics)
// LNW80 Theory of Operations gives H and V periods as 15.750kHz and 59.66Hz, probably due to rounding the calculated ~15.7468kHz to 4 figures
- MCFG_SCREEN_UPDATE_DRIVER(trs80_state, screen_update_lnw80)
-MACHINE_CONFIG_END
+ subdevice<screen_device>("screen")->set_screen_update(FUNC(trs80_state::screen_update_lnw80));
-MACHINE_CONFIG_START(trs80_state::radionic)
+ config.device_remove("brg");
+ CLOCK(config, m_uart_clock, 19200 * 16);
+ m_uart_clock->signal_handler().set(m_uart, FUNC(ay31015_device::write_rcp));
+ m_uart_clock->signal_handler().append(m_uart, FUNC(ay31015_device::write_tcp));
+}
+
+void trs80_state::radionic(machine_config &config)
+{
model1(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_CLOCK(12_MHz_XTAL / 6) // or 3.579MHz / 2 (selectable?)
+ m_maincpu->set_clock(12_MHz_XTAL / 6); // or 3.579MHz / 2 (selectable?)
// Komtek I "User Friendly Manual" calls for "Z80 running at 1.97 MHz." This likely refers to an alternate NTSC version
// whose master clock was approximately 11.8005 MHz (6 times ~1.966 MHz and 750 times 15.734 kHz). Though the schematics
// provide the main XTAL frequency as 12 MHz, that they also include a 3.579 MHz XTAL suggests this possibility.
- MCFG_DEVICE_PERIODIC_INT_DRIVER(trs80_state, nmi_line_pulse, 12_MHz_XTAL / 12 / 16384)
- MCFG_DEVICE_PROGRAM_MAP(radionic_mem)
+ m_maincpu->set_periodic_int(FUNC(trs80_state::nmi_line_pulse), attotime::from_hz(12_MHz_XTAL / 12 / 16384));
+ m_maincpu->set_addrmap(AS_PROGRAM, &trs80_state::radionic_mem);
- MCFG_SCREEN_MODIFY("screen")
- MCFG_SCREEN_RAW_PARAMS(12_MHz_XTAL, 768, 0, 512, 312, 0, 256)
- MCFG_SCREEN_UPDATE_DRIVER(trs80_state, screen_update_radionic)
- MCFG_GFXDECODE_MODIFY("gfxdecode", gfx_radionic)
+ subdevice<screen_device>("screen")->set_raw(12_MHz_XTAL, 768, 0, 512, 312, 0, 256);
+ subdevice<screen_device>("screen")->set_screen_update(FUNC(trs80_state::screen_update_radionic));
+ subdevice<gfxdecode_device>("gfxdecode")->set_info(gfx_radionic);
// Interface to external circuits
I8255(config, m_ppi);
@@ -638,7 +651,7 @@ MACHINE_CONFIG_START(trs80_state::radionic)
//m_ppi->out_pa_callback().set(FUNC(pulsar_state::ppi_pa_w)); // Data for external plugin printer module
//m_ppi->out_pb_callback().set(FUNC(pulsar_state::ppi_pb_w)); // Control data to external
//m_ppi->out_pc_callback().set(FUNC(pulsar_state::ppi_pc_w)); // Printer strobe
-MACHINE_CONFIG_END
+}
/***************************************************************************
@@ -697,6 +710,8 @@ ROM_START(sys80)
ROM_LOAD("trs80m1.chr", 0x0000, 0x0400, CRC(0033f2b9) SHA1(0d2cd4197d54e2e872b515bbfdaa98efe502eda7))
ROM_END
+#define rom_sys80p rom_sys80
+
ROM_START(lnw80)
ROM_REGION(0x3800, "maincpu",0)
@@ -759,7 +774,8 @@ void trs80_state::init_trs80l2()
COMP( 1977, trs80, 0, 0, trs80, trs80, trs80_state, init_trs80, "Tandy Radio Shack", "TRS-80 Model I (Level I Basic)", 0 )
COMP( 1978, trs80l2, 0, 0, model1, trs80l2, trs80_state, init_trs80l2, "Tandy Radio Shack", "TRS-80 Model I (Level II Basic)", 0 )
COMP( 1983, radionic, trs80l2, 0, radionic, trs80l2, trs80_state, init_trs80, "Komtek", "Radionic", 0 )
-COMP( 1980, sys80, trs80l2, 0, sys80, sys80, trs80_state, init_trs80l2, "EACA Computers Ltd", "System-80", 0 )
+COMP( 1980, sys80, trs80l2, 0, sys80, sys80, trs80_state, init_trs80l2, "EACA Computers Ltd", "System-80 (60 Hz)", 0 )
+COMP( 1980, sys80p, trs80l2, 0, sys80p, sys80, trs80_state, init_trs80l2, "EACA Computers Ltd", "System-80 (50 Hz)", 0 )
COMP( 1981, lnw80, trs80l2, 0, lnw80, sys80, trs80_state, init_trs80, "LNW Research", "LNW-80", 0 )
COMP( 1983, ht1080z, trs80l2, 0, ht1080z, sys80, trs80_state, init_trs80l2, "Hiradastechnika Szovetkezet", "HT-1080Z Series I", 0 )
COMP( 1984, ht1080z2, trs80l2, 0, ht1080z, sys80, trs80_state, init_trs80l2, "Hiradastechnika Szovetkezet", "HT-1080Z Series II", 0 )
diff --git a/src/mame/drivers/trs80m2.cpp b/src/mame/drivers/trs80m2.cpp
index f65f965be68..ba499eb57e5 100644
--- a/src/mame/drivers/trs80m2.cpp
+++ b/src/mame/drivers/trs80m2.cpp
@@ -704,10 +704,11 @@ void trs80m2_state::machine_reset()
//**************************************************************************
//-------------------------------------------------
-// MACHINE_CONFIG( trs80m2 )
+// machine_config( trs80m2 )
//-------------------------------------------------
-MACHINE_CONFIG_START(trs80m2_state::trs80m2)
+void trs80m2_state::trs80m2(machine_config &config)
+{
// basic machine hardware
Z80(config, m_maincpu, 8_MHz_XTAL / 2);
m_maincpu->set_daisy_config(trs80m2_daisy_chain);
@@ -715,12 +716,12 @@ MACHINE_CONFIG_START(trs80m2_state::trs80m2)
m_maincpu->set_addrmap(AS_IO, &trs80m2_state::z80_io);
// video hardware
- MCFG_SCREEN_ADD_MONOCHROME(SCREEN_TAG, RASTER, rgb_t::green())
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_UPDATE_DRIVER(trs80m2_state, screen_update)
- MCFG_SCREEN_SIZE(640, 480)
- MCFG_SCREEN_VISIBLE_AREA(0, 639, 0, 479)
+ screen_device &screen(SCREEN(config, SCREEN_TAG, SCREEN_TYPE_RASTER, rgb_t::green()));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_screen_update(FUNC(trs80m2_state::screen_update));
+ screen.set_size(640, 480);
+ screen.set_visarea(0, 639, 0, 479);
PALETTE(config, m_palette, palette_device::MONOCHROME);
@@ -736,10 +737,10 @@ MACHINE_CONFIG_START(trs80m2_state::trs80m2)
FD1791(config, m_fdc, 8_MHz_XTAL / 4);
m_fdc->intrq_wr_callback().set(m_pio, FUNC(z80pio_device::pa_w));
m_fdc->drq_wr_callback().set(m_dmac, FUNC(z80dma_device::rdy_w));
- MCFG_FLOPPY_DRIVE_ADD(FD1791_TAG":0", trs80m2_floppies, "8dsdd", floppy_image_device::default_floppy_formats)
- MCFG_FLOPPY_DRIVE_ADD(FD1791_TAG":1", trs80m2_floppies, nullptr, floppy_image_device::default_floppy_formats)
- MCFG_FLOPPY_DRIVE_ADD(FD1791_TAG":2", trs80m2_floppies, nullptr, floppy_image_device::default_floppy_formats)
- MCFG_FLOPPY_DRIVE_ADD(FD1791_TAG":3", trs80m2_floppies, nullptr, floppy_image_device::default_floppy_formats)
+ FLOPPY_CONNECTOR(config, FD1791_TAG":0", trs80m2_floppies, "8dsdd", floppy_image_device::default_floppy_formats);
+ FLOPPY_CONNECTOR(config, FD1791_TAG":1", trs80m2_floppies, nullptr, floppy_image_device::default_floppy_formats);
+ FLOPPY_CONNECTOR(config, FD1791_TAG":2", trs80m2_floppies, nullptr, floppy_image_device::default_floppy_formats);
+ FLOPPY_CONNECTOR(config, FD1791_TAG":3", trs80m2_floppies, nullptr, floppy_image_device::default_floppy_formats);
Z80CTC(config, m_ctc, 8_MHz_XTAL / 2);
m_ctc->intr_callback().set_inputline(m_maincpu, INPUT_LINE_IRQ0);
@@ -747,7 +748,7 @@ MACHINE_CONFIG_START(trs80m2_state::trs80m2)
m_ctc->zc_callback<1>().set(Z80SIO_TAG, FUNC(z80dart_device::txca_w));
m_ctc->zc_callback<2>().set(Z80SIO_TAG, FUNC(z80dart_device::rxtxcb_w));
- MCFG_TIMER_DRIVER_ADD_PERIODIC("ctc", trs80m2_state, ctc_tick, attotime::from_hz(8_MHz_XTAL / 2 / 2))
+ TIMER(config, "ctc").configure_periodic(FUNC(trs80m2_state::ctc_tick), attotime::from_hz(8_MHz_XTAL / 2 / 2));
Z80DMA(config, m_dmac, 8_MHz_XTAL / 2);
m_dmac->out_busreq_callback().set_inputline(m_maincpu, INPUT_LINE_HALT);
@@ -767,12 +768,14 @@ MACHINE_CONFIG_START(trs80m2_state::trs80m2)
z80sio0_device& sio(Z80SIO0(config, Z80SIO_TAG, 8_MHz_XTAL / 2));
sio.out_int_callback().set_inputline(m_maincpu, INPUT_LINE_IRQ0);
- MCFG_DEVICE_ADD(m_centronics, CENTRONICS, centronics_devices, "printer")
- MCFG_CENTRONICS_ACK_HANDLER(WRITELINE(m_pio, z80pio_device, strobe_b))
- MCFG_CENTRONICS_BUSY_HANDLER(WRITELINE(*this, trs80m2_state, write_centronics_busy))
- MCFG_CENTRONICS_FAULT_HANDLER(WRITELINE(*this, trs80m2_state, write_centronics_fault))
- MCFG_CENTRONICS_PERROR_HANDLER(WRITELINE(*this, trs80m2_state, write_centronics_perror))
- MCFG_CENTRONICS_OUTPUT_LATCH_ADD("cent_data_out", CENTRONICS_TAG)
+ CENTRONICS(config, m_centronics, centronics_devices, "printer");
+ m_centronics->ack_handler().set(m_pio, FUNC(z80pio_device::strobe_b));
+ m_centronics->busy_handler().set(FUNC(trs80m2_state::write_centronics_busy));
+ m_centronics->fault_handler().set(FUNC(trs80m2_state::write_centronics_fault));
+ m_centronics->perror_handler().set(FUNC(trs80m2_state::write_centronics_perror));
+
+ output_latch_device &cent_data_out(OUTPUT_LATCH(config, "cent_data_out"));
+ m_centronics->set_output_latch(cent_data_out);
TRS80M2_KEYBOARD(config, m_kb, 0);
m_kb->clock_wr_callback().set(FUNC(trs80m2_state::kb_clock_w));
@@ -783,15 +786,16 @@ MACHINE_CONFIG_START(trs80m2_state::trs80m2)
RAM(config, RAM_TAG).set_default_size("64K").set_extra_options("32K,96K,128K,160K,192K,224K,256K,288K,320K,352K,384K,416K,448K,480K,512K");
// software list
- MCFG_SOFTWARE_LIST_ADD("flop_list", "trs80m2")
-MACHINE_CONFIG_END
+ SOFTWARE_LIST(config, "flop_list").set_original("trs80m2");
+}
//-------------------------------------------------
-// MACHINE_CONFIG( trs80m16 )
+// machine_config( trs80m16 )
//-------------------------------------------------
-MACHINE_CONFIG_START(trs80m16_state::trs80m16)
+void trs80m16_state::trs80m16(machine_config &config)
+{
// basic machine hardware
Z80(config, m_maincpu, 8_MHz_XTAL / 2);
m_maincpu->set_daisy_config(trs80m2_daisy_chain);
@@ -799,17 +803,17 @@ MACHINE_CONFIG_START(trs80m16_state::trs80m16)
m_maincpu->set_addrmap(AS_IO, &trs80m16_state::m16_z80_io);
m_maincpu->set_irq_acknowledge_callback(AM9519A_TAG, FUNC(am9519_device::iack_cb));
- MCFG_DEVICE_ADD(M68000_TAG, M68000, 24_MHz_XTAL / 4)
- MCFG_DEVICE_PROGRAM_MAP(m68000_mem)
- MCFG_DEVICE_DISABLE()
+ M68000(config, m_subcpu, 24_MHz_XTAL / 4);
+ m_subcpu->set_addrmap(AS_PROGRAM, &trs80m16_state::m68000_mem);
+ m_subcpu->set_disable();
// video hardware
- MCFG_SCREEN_ADD_MONOCHROME(SCREEN_TAG, RASTER, rgb_t::green())
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_UPDATE_DRIVER(trs80m2_state, screen_update)
- MCFG_SCREEN_SIZE(640, 480)
- MCFG_SCREEN_VISIBLE_AREA(0, 639, 0, 479)
+ screen_device &screen(SCREEN(config, SCREEN_TAG, SCREEN_TYPE_RASTER, rgb_t::green()));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_screen_update(FUNC(trs80m2_state::screen_update));
+ screen.set_size(640, 480);
+ screen.set_visarea(0, 639, 0, 479);
PALETTE(config, m_palette, palette_device::MONOCHROME);
@@ -825,10 +829,10 @@ MACHINE_CONFIG_START(trs80m16_state::trs80m16)
FD1791(config, m_fdc, 8_MHz_XTAL / 4);
m_fdc->intrq_wr_callback().set(m_pio, FUNC(z80pio_device::pa_w));
m_fdc->drq_wr_callback().set(m_dmac, FUNC(z80dma_device::rdy_w));
- MCFG_FLOPPY_DRIVE_ADD(FD1791_TAG":0", trs80m2_floppies, "8dsdd", floppy_image_device::default_floppy_formats)
- MCFG_FLOPPY_DRIVE_ADD(FD1791_TAG":1", trs80m2_floppies, nullptr, floppy_image_device::default_floppy_formats)
- MCFG_FLOPPY_DRIVE_ADD(FD1791_TAG":2", trs80m2_floppies, nullptr, floppy_image_device::default_floppy_formats)
- MCFG_FLOPPY_DRIVE_ADD(FD1791_TAG":3", trs80m2_floppies, nullptr, floppy_image_device::default_floppy_formats)
+ FLOPPY_CONNECTOR(config, FD1791_TAG":0", trs80m2_floppies, "8dsdd", floppy_image_device::default_floppy_formats);
+ FLOPPY_CONNECTOR(config, FD1791_TAG":1", trs80m2_floppies, nullptr, floppy_image_device::default_floppy_formats);
+ FLOPPY_CONNECTOR(config, FD1791_TAG":2", trs80m2_floppies, nullptr, floppy_image_device::default_floppy_formats);
+ FLOPPY_CONNECTOR(config, FD1791_TAG":3", trs80m2_floppies, nullptr, floppy_image_device::default_floppy_formats);
Z80CTC(config, m_ctc, 8_MHz_XTAL / 2);
m_ctc->intr_callback().set_inputline(m_maincpu, INPUT_LINE_IRQ0);
@@ -836,7 +840,7 @@ MACHINE_CONFIG_START(trs80m16_state::trs80m16)
m_ctc->zc_callback<1>().set(Z80SIO_TAG, FUNC(z80dart_device::txca_w));
m_ctc->zc_callback<2>().set(Z80SIO_TAG, FUNC(z80dart_device::rxtxcb_w));
- MCFG_TIMER_DRIVER_ADD_PERIODIC("ctc", trs80m2_state, ctc_tick, attotime::from_hz(8_MHz_XTAL / 2 / 2))
+ TIMER(config, "ctc").configure_periodic(FUNC(trs80m2_state::ctc_tick), attotime::from_hz(8_MHz_XTAL / 2 / 2));
Z80DMA(config, m_dmac, 8_MHz_XTAL / 2);
m_dmac->out_busreq_callback().set_inputline(m_maincpu, INPUT_LINE_HALT);
@@ -857,14 +861,16 @@ MACHINE_CONFIG_START(trs80m16_state::trs80m16)
sio.out_int_callback().set_inputline(m_maincpu, INPUT_LINE_IRQ0);
AM9519(config, m_uic, 0);
- m_uic->out_int_callback().set_inputline(M68000_TAG, M68K_IRQ_5);
+ m_uic->out_int_callback().set_inputline(m_subcpu, M68K_IRQ_5);
+
+ CENTRONICS(config, m_centronics, centronics_devices, "printer");
+ m_centronics->ack_handler().set(m_pio, FUNC(z80pio_device::strobe_b));
+ m_centronics->busy_handler().set(FUNC(trs80m2_state::write_centronics_busy));
+ m_centronics->fault_handler().set(FUNC(trs80m2_state::write_centronics_fault));
+ m_centronics->perror_handler().set(FUNC(trs80m2_state::write_centronics_perror));
- MCFG_DEVICE_ADD(m_centronics, CENTRONICS, centronics_devices, "printer")
- MCFG_CENTRONICS_ACK_HANDLER(WRITELINE(m_pio, z80pio_device, strobe_b))
- MCFG_CENTRONICS_BUSY_HANDLER(WRITELINE(*this, trs80m2_state, write_centronics_busy))
- MCFG_CENTRONICS_FAULT_HANDLER(WRITELINE(*this, trs80m2_state, write_centronics_fault))
- MCFG_CENTRONICS_PERROR_HANDLER(WRITELINE(*this, trs80m2_state, write_centronics_perror))
- MCFG_CENTRONICS_OUTPUT_LATCH_ADD("cent_data_out", CENTRONICS_TAG)
+ output_latch_device &cent_data_out(OUTPUT_LATCH(config, "cent_data_out"));
+ m_centronics->set_output_latch(cent_data_out);
TRS80M2_KEYBOARD(config, m_kb, 0);
m_kb->clock_wr_callback().set(FUNC(trs80m2_state::kb_clock_w));
@@ -875,8 +881,8 @@ MACHINE_CONFIG_START(trs80m16_state::trs80m16)
RAM(config, RAM_TAG).set_default_size("256K").set_extra_options("512K,768K,1M");
// software list
- MCFG_SOFTWARE_LIST_ADD("flop_list", "trs80m2")
-MACHINE_CONFIG_END
+ SOFTWARE_LIST(config, "flop_list").set_original("trs80m2");
+}
diff --git a/src/mame/drivers/trs80m3.cpp b/src/mame/drivers/trs80m3.cpp
index b5140197b72..953b16f98b2 100644
--- a/src/mame/drivers/trs80m3.cpp
+++ b/src/mame/drivers/trs80m3.cpp
@@ -335,16 +335,16 @@ static void trs80_floppies(device_slot_interface &device)
MACHINE_CONFIG_START(trs80m3_state::model3)
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, 20.2752_MHz_XTAL / 10) // FIXME: actual Model III XTAL is 10.1376 MHz
- MCFG_DEVICE_PROGRAM_MAP(m3_mem)
- MCFG_DEVICE_IO_MAP(m3_io)
- MCFG_DEVICE_PERIODIC_INT_DRIVER(trs80m3_state, rtc_interrupt, 20.2752_MHz_XTAL / 10 / 67584)
+ Z80(config, m_maincpu, 20.2752_MHz_XTAL / 10); // FIXME: actual Model III XTAL is 10.1376 MHz
+ m_maincpu->set_addrmap(AS_PROGRAM, &trs80m3_state::m3_mem);
+ m_maincpu->set_addrmap(AS_IO, &trs80m3_state::m3_io);
+ m_maincpu->set_periodic_int(FUNC(trs80m3_state::rtc_interrupt), attotime::from_hz(20.2752_MHz_XTAL / 10 / 67584));
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_RAW_PARAMS(12.672_MHz_XTAL, 800, 0, 640, 264, 0, 240) // FIXME: these are Model 4 80-column parameters
- MCFG_SCREEN_UPDATE_DRIVER(trs80m3_state, screen_update_trs80m3)
- MCFG_SCREEN_PALETTE("palette")
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_raw(12.672_MHz_XTAL, 800, 0, 640, 264, 0, 240); // FIXME: these are Model 4 80-column parameters
+ screen.set_screen_update(FUNC(trs80m3_state::screen_update_trs80m3));
+ screen.set_palette("palette");
GFXDECODE(config, "gfxdecode", "palette", gfx_trs80m3);
PALETTE(config, "palette", palette_device::MONOCHROME);
@@ -352,34 +352,33 @@ MACHINE_CONFIG_START(trs80m3_state::model3)
/* sound hardware */
SPEAKER(config, "mono").front_center();
SPEAKER_SOUND(config, "speaker").add_route(ALL_OUTPUTS, "mono", 0.50);
- WAVE(config, "wave", "cassette").add_route(ALL_OUTPUTS, "mono", 0.05);
+ WAVE(config, "wave", m_cassette).add_route(ALL_OUTPUTS, "mono", 0.05);
/* devices */
- MCFG_CASSETTE_ADD("cassette")
- MCFG_CASSETTE_FORMATS(trs80l2_cassette_formats)
- MCFG_CASSETTE_DEFAULT_STATE(CASSETTE_PLAY)
+ CASSETTE(config, m_cassette);
+ m_cassette->set_formats(trs80l2_cassette_formats);
+ m_cassette->set_default_state(CASSETTE_PLAY);
- MCFG_QUICKLOAD_ADD("quickload", trs80m3_state, trs80_cmd, "cmd", 1.0)
+ MCFG_QUICKLOAD_ADD("quickload", trs80m3_state, trs80_cmd, "cmd", attotime::from_seconds(1))
FD1793(config, m_fdc, 4_MHz_XTAL / 4);
m_fdc->intrq_wr_callback().set(FUNC(trs80m3_state::intrq_w));
m_fdc->drq_wr_callback().set(FUNC(trs80m3_state::drq_w));
// Internal drives
- MCFG_FLOPPY_DRIVE_ADD("fdc:0", trs80_floppies, "sssd", trs80m3_state::floppy_formats)
- MCFG_FLOPPY_DRIVE_SOUND(true)
- MCFG_FLOPPY_DRIVE_ADD("fdc:1", trs80_floppies, "sssd", trs80m3_state::floppy_formats)
- MCFG_FLOPPY_DRIVE_SOUND(true)
+ FLOPPY_CONNECTOR(config, "fdc:0", trs80_floppies, "sssd", trs80m3_state::floppy_formats).enable_sound(true);
+ FLOPPY_CONNECTOR(config, "fdc:1", trs80_floppies, "sssd", trs80m3_state::floppy_formats).enable_sound(true);
- MCFG_DEVICE_ADD(m_centronics, CENTRONICS, centronics_devices, "printer")
- MCFG_CENTRONICS_BUSY_HANDLER(WRITELINE("cent_status_in", input_buffer_device, write_bit7))
- MCFG_CENTRONICS_PERROR_HANDLER(WRITELINE("cent_status_in", input_buffer_device, write_bit6))
- MCFG_CENTRONICS_SELECT_HANDLER(WRITELINE("cent_status_in", input_buffer_device, write_bit5))
- MCFG_CENTRONICS_FAULT_HANDLER(WRITELINE("cent_status_in", input_buffer_device, write_bit4))
+ CENTRONICS(config, m_centronics, centronics_devices, "printer");
+ m_centronics->busy_handler().set(m_cent_status_in, FUNC(input_buffer_device::write_bit7));
+ m_centronics->perror_handler().set(m_cent_status_in, FUNC(input_buffer_device::write_bit6));
+ m_centronics->select_handler().set(m_cent_status_in, FUNC(input_buffer_device::write_bit5));
+ m_centronics->fault_handler().set(m_cent_status_in, FUNC(input_buffer_device::write_bit4));
- MCFG_DEVICE_ADD("cent_status_in", INPUT_BUFFER, 0)
+ INPUT_BUFFER(config, m_cent_status_in);
- MCFG_CENTRONICS_OUTPUT_LATCH_ADD("cent_data_out", "centronics")
+ OUTPUT_LATCH(config, m_cent_data_out);
+ m_centronics->set_output_latch(*m_cent_data_out);
COM8116(config, m_brg, 20.2752_MHz_XTAL / 4); // BR1943 (or BR1941L)
m_brg->fr_handler().set(m_uart, FUNC(ay31015_device::write_rcp));
@@ -393,11 +392,11 @@ MACHINE_CONFIG_START(trs80m3_state::model3)
RS232_PORT(config, "rs232", default_rs232_devices, nullptr);
MACHINE_CONFIG_END
-MACHINE_CONFIG_START(trs80m3_state::model4)
+void trs80m3_state::model4(machine_config &config)
+{
model3(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(m4_mem)
- MCFG_DEVICE_IO_MAP(m4_io)
+ m_maincpu->set_addrmap(AS_PROGRAM, &trs80m3_state::m4_mem);
+ m_maincpu->set_addrmap(AS_IO, &trs80m3_state::m4_io);
RAM(config, m_mainram, 0);
m_mainram->set_default_size("64K");
@@ -409,13 +408,13 @@ MACHINE_CONFIG_START(trs80m3_state::model4)
m_m4_bank->set_data_width(8);
m_m4_bank->set_addr_width(18);
m_m4_bank->set_stride(0x10000);
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(trs80m3_state::model4p)
+void trs80m3_state::model4p(machine_config &config)
+{
model3(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(m4p_mem)
- MCFG_DEVICE_IO_MAP(m4p_io)
+ m_maincpu->set_addrmap(AS_PROGRAM, &trs80m3_state::m4p_mem);
+ m_maincpu->set_addrmap(AS_IO, &trs80m3_state::m4p_io);
RAM(config, m_mainram, 0);
m_mainram->set_default_size("64K");
@@ -428,14 +427,14 @@ MACHINE_CONFIG_START(trs80m3_state::model4p)
m_m4p_bank->set_addr_width(19);
m_m4p_bank->set_stride(0x10000);
- MCFG_DEVICE_REMOVE("quickload")
-MACHINE_CONFIG_END
+ config.device_remove("quickload");
+}
-MACHINE_CONFIG_START(trs80m3_state::cp500)
+void trs80m3_state::cp500(machine_config &config)
+{
model3(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_IO_MAP(cp500_io)
-MACHINE_CONFIG_END
+ m_maincpu->set_addrmap(AS_IO, &trs80m3_state::cp500_io);
+}
/***************************************************************************
diff --git a/src/mame/drivers/truco.cpp b/src/mame/drivers/truco.cpp
index 4d43ed814ce..76166d70408 100644
--- a/src/mame/drivers/truco.cpp
+++ b/src/mame/drivers/truco.cpp
@@ -417,14 +417,14 @@ INTERRUPT_GEN_MEMBER(truco_state::interrupt)
* Machine Driver *
*******************************************/
-MACHINE_CONFIG_START(truco_state::truco)
-
+void truco_state::truco(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M6809, CPU_CLOCK)
- MCFG_DEVICE_PROGRAM_MAP(main_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", truco_state, interrupt)
+ M6809(config, m_maincpu, CPU_CLOCK);
+ m_maincpu->set_addrmap(AS_PROGRAM, &truco_state::main_map);
+ m_maincpu->set_vblank_int("screen", FUNC(truco_state::interrupt));
- WATCHDOG_TIMER(config, m_watchdog).set_time(attotime::from_seconds(1.6)); /* 1.6 seconds */
+ WATCHDOG_TIMER(config, m_watchdog).set_time(attotime::from_msec(1600)); /* 1.6 seconds */
pia6821_device &pia(PIA6821(config, "pia0", 0));
pia.readpa_handler().set_ioport("P1");
@@ -436,13 +436,13 @@ MACHINE_CONFIG_START(truco_state::truco)
pia.irqb_handler().set(FUNC(truco_state::pia_irqb_w));
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */)
- MCFG_SCREEN_SIZE(256, 192)
- MCFG_SCREEN_VISIBLE_AREA(0, 256-1, 0, 192-1)
- MCFG_SCREEN_UPDATE_DRIVER(truco_state, screen_update)
- MCFG_SCREEN_PALETTE("palette")
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500) /* not accurate */);
+ screen.set_size(256, 192);
+ screen.set_visarea(0, 256-1, 0, 192-1);
+ screen.set_screen_update(FUNC(truco_state::screen_update));
+ screen.set_palette("palette");
PALETTE(config, "palette", FUNC(truco_state::truco_palette), 16);
@@ -453,10 +453,10 @@ MACHINE_CONFIG_START(truco_state::truco)
/* sound hardware */
SPEAKER(config, "speaker").front_center();
- MCFG_DEVICE_ADD("dac", DAC_1BIT, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 0.4)
- MCFG_DEVICE_ADD("vref", VOLTAGE_REGULATOR, 0) MCFG_VOLTAGE_REGULATOR_OUTPUT(5.0)
- MCFG_SOUND_ROUTE(0, "dac", 1.0, DAC_VREF_POS_INPUT)
-MACHINE_CONFIG_END
+ DAC_1BIT(config, m_dac, 0).add_route(ALL_OUTPUTS, "speaker", 0.4);
+ voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref", 0));
+ vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT);
+}
/***************************************************************************
diff --git a/src/mame/drivers/trucocl.cpp b/src/mame/drivers/trucocl.cpp
index 8a3b0dcb8a3..94735cdf7f5 100644
--- a/src/mame/drivers/trucocl.cpp
+++ b/src/mame/drivers/trucocl.cpp
@@ -180,23 +180,24 @@ INTERRUPT_GEN_MEMBER(trucocl_state::trucocl_interrupt)
device.execute().set_input_line(0, HOLD_LINE);
}
-MACHINE_CONFIG_START(trucocl_state::trucocl)
+void trucocl_state::trucocl(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, 18432000/6)
- MCFG_DEVICE_PROGRAM_MAP(main_map)
- MCFG_DEVICE_IO_MAP(main_io)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", trucocl_state, trucocl_interrupt)
+ Z80(config, m_maincpu, 18432000/6);
+ m_maincpu->set_addrmap(AS_PROGRAM, &trucocl_state::main_map);
+ m_maincpu->set_addrmap(AS_IO, &trucocl_state::main_io);
+ m_maincpu->set_vblank_int("screen", FUNC(trucocl_state::trucocl_interrupt));
WATCHDOG_TIMER(config, "watchdog");
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(32*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 0*8, 32*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(trucocl_state, screen_update_trucocl)
- MCFG_SCREEN_PALETTE("palette")
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(32*8, 32*8);
+ screen.set_visarea(0*8, 32*8-1, 0*8, 32*8-1);
+ screen.set_screen_update(FUNC(trucocl_state::screen_update_trucocl));
+ screen.set_palette("palette");
GFXDECODE(config, m_gfxdecode, "palette", gfx_trucocl);
PALETTE(config, "palette", FUNC(trucocl_state::trucocl_palette), 32);
@@ -204,10 +205,11 @@ MACHINE_CONFIG_START(trucocl_state::trucocl)
/* sound hardware */
SPEAKER(config, "speaker").front_center();
- MCFG_DEVICE_ADD("dac", DAC_8BIT_R2R, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 0.5) // unknown DAC
- MCFG_DEVICE_ADD("vref", VOLTAGE_REGULATOR, 0) MCFG_VOLTAGE_REGULATOR_OUTPUT(5.0)
- MCFG_SOUND_ROUTE(0, "dac", 1.0, DAC_VREF_POS_INPUT) MCFG_SOUND_ROUTE(0, "dac", -1.0, DAC_VREF_NEG_INPUT)
-MACHINE_CONFIG_END
+ DAC_8BIT_R2R(config, "dac", 0).add_route(ALL_OUTPUTS, "speaker", 0.5); // unknown DAC
+ voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref"));
+ vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT);
+ vref.add_route(0, "dac", -1.0, DAC_VREF_NEG_INPUT);
+}
/***************************************************************************
diff --git a/src/mame/drivers/trvmadns.cpp b/src/mame/drivers/trvmadns.cpp
index 6be42577be8..93e34381e1d 100644
--- a/src/mame/drivers/trvmadns.cpp
+++ b/src/mame/drivers/trvmadns.cpp
@@ -387,31 +387,30 @@ void trvmadns_state::machine_reset()
m_old_data = -1;
}
-MACHINE_CONFIG_START(trvmadns_state::trvmadns)
- MCFG_DEVICE_ADD("maincpu", Z80, XTAL(10'000'000)/4) // Most likely 2.5MHz (less likely 5MHz (10MHz/2))
- MCFG_DEVICE_PROGRAM_MAP(cpu_map)
- MCFG_DEVICE_IO_MAP(io_map)
-
+void trvmadns_state::trvmadns(machine_config &config)
+{
+ Z80(config, m_maincpu, XTAL(10'000'000)/4); // Most likely 2.5MHz (less likely 5MHz (10MHz/2))
+ m_maincpu->set_addrmap(AS_PROGRAM, &trvmadns_state::cpu_map);
+ m_maincpu->set_addrmap(AS_IO, &trvmadns_state::io_map);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(256, 256)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 31*8-1, 0*8, 30*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(trvmadns_state, screen_update_trvmadns)
- MCFG_SCREEN_PALETTE("palette")
- MCFG_SCREEN_VBLANK_CALLBACK(INPUTLINE("maincpu", INPUT_LINE_NMI))
-
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_trvmadns)
- MCFG_PALETTE_ADD("palette", 16)
-
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(256, 256);
+ screen.set_visarea(0*8, 31*8-1, 0*8, 30*8-1);
+ screen.set_screen_update(FUNC(trvmadns_state::screen_update_trvmadns));
+ screen.set_palette(m_palette);
+ screen.screen_vblank().set_inputline(m_maincpu, INPUT_LINE_NMI);
+
+ GFXDECODE(config, m_gfxdecode, m_palette, gfx_trvmadns);
+ PALETTE(config, m_palette).set_entries(16);
/* sound hardware */
SPEAKER(config, "mono").front_center();
AY8910(config, "aysnd", XTAL(10'000'000)/2/4).add_route(ALL_OUTPUTS, "mono", 1.0); //?
-MACHINE_CONFIG_END
+}
ROM_START( trvmadns )
diff --git a/src/mame/drivers/tryout.cpp b/src/mame/drivers/tryout.cpp
index 1839f9dfb1b..5a30afd1faf 100644
--- a/src/mame/drivers/tryout.cpp
+++ b/src/mame/drivers/tryout.cpp
@@ -191,25 +191,26 @@ static GFXDECODE_START( gfx_tryout )
GFXDECODE_ENTRY( nullptr, 0, vramlayout, 0, 4 )
GFXDECODE_END
-MACHINE_CONFIG_START(tryout_state::tryout)
+void tryout_state::tryout(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M6502, 2000000) /* ? */
- MCFG_DEVICE_PROGRAM_MAP(main_cpu)
+ M6502(config, m_maincpu, 2000000); /* ? */
+ m_maincpu->set_addrmap(AS_PROGRAM, &tryout_state::main_cpu);
- MCFG_DEVICE_ADD("audiocpu", M6502, 1500000) /* ? */
- MCFG_DEVICE_PROGRAM_MAP(sound_cpu)
- MCFG_DEVICE_PERIODIC_INT_DRIVER(tryout_state, nmi_line_pulse, 1000) /* controls BGM tempo, 1000 is an hand-tuned value to match a side-by-side video */
+ M6502(config, m_audiocpu, 1500000); /* ? */
+ m_audiocpu->set_addrmap(AS_PROGRAM, &tryout_state::sound_cpu);
+ m_audiocpu->set_periodic_int(FUNC(tryout_state::nmi_line_pulse), attotime::from_hz(1000)); /* controls BGM tempo, 1000 is an hand-tuned value to match a side-by-side video */
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */)
- MCFG_SCREEN_SIZE(256, 256)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 1*8, 31*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(tryout_state, screen_update)
- MCFG_SCREEN_PALETTE(m_palette)
-
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, m_palette, gfx_tryout)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500) /* not accurate */);
+ screen.set_size(256, 256);
+ screen.set_visarea(0*8, 32*8-1, 1*8, 31*8-1);
+ screen.set_screen_update(FUNC(tryout_state::screen_update));
+ screen.set_palette(m_palette);
+
+ GFXDECODE(config, m_gfxdecode, m_palette, gfx_tryout);
PALETTE(config, m_palette, FUNC(tryout_state::tryout_palette), 0x20);
/* sound hardware */
@@ -217,9 +218,8 @@ MACHINE_CONFIG_START(tryout_state::tryout)
GENERIC_LATCH_8(config, m_soundlatch);
- MCFG_DEVICE_ADD("ymsnd", YM2203, 1500000)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.50)
-MACHINE_CONFIG_END
+ YM2203(config, "ymsnd", 1500000).add_route(ALL_OUTPUTS, "mono", 0.50);
+}
ROM_START( tryout )
ROM_REGION( 0x14000, "maincpu", 0 )
diff --git a/src/mame/drivers/ts3000.cpp b/src/mame/drivers/ts3000.cpp
index 148be14f9a4..65fdb5d6312 100644
--- a/src/mame/drivers/ts3000.cpp
+++ b/src/mame/drivers/ts3000.cpp
@@ -43,11 +43,12 @@ void ts3000_state::io_map(address_map &map)
static INPUT_PORTS_START( ts3000 )
INPUT_PORTS_END
-MACHINE_CONFIG_START(ts3000_state::ts3000)
- MCFG_DEVICE_ADD("maincpu", I8088, XTAL(14'318'181)/3) // no idea of clock
- MCFG_DEVICE_PROGRAM_MAP(mem_map)
- MCFG_DEVICE_IO_MAP(io_map)
-MACHINE_CONFIG_END
+void ts3000_state::ts3000(machine_config &config)
+{
+ i8088_cpu_device &maincpu(I8088(config, "maincpu", XTAL(14'318'181)/3)); // no idea of clock
+ maincpu.set_addrmap(AS_PROGRAM, &ts3000_state::mem_map);
+ maincpu.set_addrmap(AS_IO, &ts3000_state::io_map);
+}
ROM_START( ts3000 )
ROM_REGION( 0x4000, "roms", 0 )
diff --git a/src/mame/drivers/ts803.cpp b/src/mame/drivers/ts803.cpp
index cdc949add4a..af40eda32b6 100644
--- a/src/mame/drivers/ts803.cpp
+++ b/src/mame/drivers/ts803.cpp
@@ -422,18 +422,19 @@ static const z80_daisy_config daisy_chain[] =
{ nullptr }
};
-MACHINE_CONFIG_START(ts803_state::ts803)
+void ts803_state::ts803(machine_config &config)
+{
Z80(config, m_maincpu, 16_MHz_XTAL / 4);
m_maincpu->set_addrmap(AS_PROGRAM, &ts803_state::ts803_mem);
m_maincpu->set_addrmap(AS_IO, &ts803_state::ts803_io);
m_maincpu->set_daisy_config(daisy_chain);
/* video hardware */
- MCFG_SCREEN_ADD_MONOCHROME("screen", RASTER, rgb_t::green())
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_SIZE(640,240)
- MCFG_SCREEN_VISIBLE_AREA(0, 640-1, 0, 240-1)
- MCFG_SCREEN_UPDATE_DEVICE("crtc", sy6545_1_device, screen_update)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER, rgb_t::green()));
+ screen.set_refresh_hz(60);
+ screen.set_size(640,240);
+ screen.set_visarea(0, 640-1, 0, 240-1);
+ screen.set_screen_update("crtc", FUNC(sy6545_1_device::screen_update));
PALETTE(config, m_palette, palette_device::MONOCHROME);
/* crtc */
@@ -466,11 +467,9 @@ MACHINE_CONFIG_START(ts803_state::ts803)
/* floppy disk */
FD1793(config, m_fdc, 1_MHz_XTAL);
m_fdc->intrq_wr_callback().set("sti", FUNC(z80sti_device::i7_w));
- MCFG_FLOPPY_DRIVE_ADD("fdc:0", ts803_floppies, "525dd", floppy_image_device::default_floppy_formats)
- MCFG_FLOPPY_DRIVE_SOUND(true)
- MCFG_FLOPPY_DRIVE_ADD("fdc:1", ts803_floppies, "525dd", floppy_image_device::default_floppy_formats)
- MCFG_FLOPPY_DRIVE_SOUND(true)
-MACHINE_CONFIG_END
+ FLOPPY_CONNECTOR(config, "fdc:0", ts803_floppies, "525dd", floppy_image_device::default_floppy_formats).enable_sound(true);
+ FLOPPY_CONNECTOR(config, "fdc:1", ts803_floppies, "525dd", floppy_image_device::default_floppy_formats).enable_sound(true);
+}
/* ROM definition */
ROM_START( ts803h )
diff --git a/src/mame/drivers/tsamurai.cpp b/src/mame/drivers/tsamurai.cpp
index bdbae8cbf5e..11816fbd3b6 100644
--- a/src/mame/drivers/tsamurai.cpp
+++ b/src/mame/drivers/tsamurai.cpp
@@ -717,18 +717,18 @@ GFXDECODE_END
/*******************************************************************************/
-MACHINE_CONFIG_START(tsamurai_state::tsamurai)
-
+void tsamurai_state::tsamurai(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, XTAL(24'000'000)/8)
- MCFG_DEVICE_PROGRAM_MAP(main_map)
- MCFG_DEVICE_IO_MAP(z80_io_map)
+ Z80(config, m_maincpu, XTAL(24'000'000)/8);
+ m_maincpu->set_addrmap(AS_PROGRAM, &tsamurai_state::main_map);
+ m_maincpu->set_addrmap(AS_IO, &tsamurai_state::z80_io_map);
- MCFG_DEVICE_ADD("audiocpu", Z80, XTAL(24'000'000)/8)
- MCFG_DEVICE_PROGRAM_MAP(sound1_map)
+ Z80(config, m_audiocpu, XTAL(24'000'000)/8);
+ m_audiocpu->set_addrmap(AS_PROGRAM, &tsamurai_state::sound1_map);
- MCFG_DEVICE_ADD("audio2", Z80, XTAL(24'000'000)/8)
- MCFG_DEVICE_PROGRAM_MAP(sound2_map)
+ Z80(config, m_audio2, XTAL(24'000'000)/8);
+ m_audio2->set_addrmap(AS_PROGRAM, &tsamurai_state::sound2_map);
MCFG_MACHINE_START_OVERRIDE(tsamurai_state,tsamurai)
@@ -740,16 +740,16 @@ MACHINE_CONFIG_START(tsamurai_state::tsamurai)
mainlatch.q_out_cb<4>().set(FUNC(tsamurai_state::coin2_counter_w));
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */)
- MCFG_SCREEN_SIZE(32*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0, 255, 16, 255-16)
- MCFG_SCREEN_UPDATE_DRIVER(tsamurai_state, screen_update)
- MCFG_SCREEN_PALETTE(m_palette)
- MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE(*this, tsamurai_state, vblank_irq))
-
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_tsamurai)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500) /* not accurate */);
+ screen.set_size(32*8, 32*8);
+ screen.set_visarea(0, 255, 16, 255-16);
+ screen.set_screen_update(FUNC(tsamurai_state::screen_update));
+ screen.set_palette(m_palette);
+ screen.screen_vblank().set(FUNC(tsamurai_state::vblank_irq));
+
+ GFXDECODE(config, m_gfxdecode, m_palette, gfx_tsamurai);
PALETTE(config, m_palette, palette_device::RGB_444_PROMS, "proms", 256);
MCFG_VIDEO_START_OVERRIDE(tsamurai_state,tsamurai)
@@ -758,24 +758,24 @@ MACHINE_CONFIG_START(tsamurai_state::tsamurai)
AY8910(config,"aysnd", XTAL(24'000'000)/8).add_route(ALL_OUTPUTS, "speaker", 0.1);
- MCFG_DEVICE_ADD("dac1", DAC_8BIT_R2R, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 0.1) // unknown DAC
- MCFG_DEVICE_ADD("dac2", DAC_8BIT_R2R, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 0.1) // unknown DAC
- MCFG_DEVICE_ADD("vref", VOLTAGE_REGULATOR, 0) MCFG_VOLTAGE_REGULATOR_OUTPUT(5.0)
- MCFG_SOUND_ROUTE(0, "dac1", 1.0, DAC_VREF_POS_INPUT) MCFG_SOUND_ROUTE(0, "dac1", -1.0, DAC_VREF_NEG_INPUT)
- MCFG_SOUND_ROUTE(0, "dac2", 1.0, DAC_VREF_POS_INPUT) MCFG_SOUND_ROUTE(0, "dac2", -1.0, DAC_VREF_NEG_INPUT)
-MACHINE_CONFIG_END
-
+ DAC_8BIT_R2R(config, "dac1", 0).add_route(ALL_OUTPUTS, "speaker", 0.1); // unknown DAC
+ DAC_8BIT_R2R(config, "dac2", 0).add_route(ALL_OUTPUTS, "speaker", 0.1); // unknown DAC
+ voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref"));
+ vref.add_route(0, "dac1", 1.0, DAC_VREF_POS_INPUT); vref.add_route(0, "dac1", -1.0, DAC_VREF_NEG_INPUT);
+ vref.add_route(0, "dac2", 1.0, DAC_VREF_POS_INPUT); vref.add_route(0, "dac2", -1.0, DAC_VREF_NEG_INPUT);
+}
-MACHINE_CONFIG_START(tsamurai_state::vsgongf)
+void tsamurai_state::vsgongf(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, XTAL(24'000'000)/8)
- MCFG_DEVICE_PROGRAM_MAP(vsgongf_map)
+ Z80(config, m_maincpu, XTAL(24'000'000)/8);
+ m_maincpu->set_addrmap(AS_PROGRAM, &tsamurai_state::vsgongf_map);
- MCFG_DEVICE_ADD("audiocpu", Z80, XTAL(24'000'000)/8)
- MCFG_DEVICE_PROGRAM_MAP(sound_vsgongf_map)
- MCFG_DEVICE_IO_MAP(vsgongf_audio_io_map)
- MCFG_DEVICE_PERIODIC_INT_DRIVER(tsamurai_state, vsgongf_sound_interrupt, 3*60)
+ Z80(config, m_audiocpu, XTAL(24'000'000)/8);
+ m_audiocpu->set_addrmap(AS_PROGRAM, &tsamurai_state::sound_vsgongf_map);
+ m_audiocpu->set_addrmap(AS_IO, &tsamurai_state::vsgongf_audio_io_map);
+ m_audiocpu->set_periodic_int(FUNC(tsamurai_state::vsgongf_sound_interrupt), attotime::from_hz(3*60));
MCFG_MACHINE_START_OVERRIDE(tsamurai_state,vsgongf)
@@ -787,16 +787,16 @@ MACHINE_CONFIG_START(tsamurai_state::vsgongf)
mainlatch.q_out_cb<4>().set(FUNC(tsamurai_state::textbank1_w));
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */)
- MCFG_SCREEN_SIZE(32*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0, 255, 16, 255-16)
- MCFG_SCREEN_UPDATE_DRIVER(tsamurai_state, screen_update_vsgongf)
- MCFG_SCREEN_PALETTE(m_palette)
- MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE(*this, tsamurai_state, vblank_irq))
-
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_tsamurai)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500) /* not accurate */);
+ screen.set_size(32*8, 32*8);
+ screen.set_visarea(0, 255, 16, 255-16);
+ screen.set_screen_update(FUNC(tsamurai_state::screen_update_vsgongf));
+ screen.set_palette(m_palette);
+ screen.screen_vblank().set(FUNC(tsamurai_state::vblank_irq));
+
+ GFXDECODE(config, m_gfxdecode, m_palette, gfx_tsamurai);
PALETTE(config, m_palette, palette_device::RGB_444_PROMS, "proms", 256);
MCFG_VIDEO_START_OVERRIDE(tsamurai_state,vsgongf)
@@ -807,28 +807,29 @@ MACHINE_CONFIG_START(tsamurai_state::vsgongf)
AY8910(config,"aysnd", XTAL(24'000'000)/8).add_route(ALL_OUTPUTS, "speaker", 0.1);
- MCFG_DEVICE_ADD("dac", DAC_8BIT_R2R, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 0.1) // unknown DAC
- MCFG_DEVICE_ADD("vref", VOLTAGE_REGULATOR, 0) MCFG_VOLTAGE_REGULATOR_OUTPUT(5.0)
- MCFG_SOUND_ROUTE(0, "dac", 1.0, DAC_VREF_POS_INPUT) MCFG_SOUND_ROUTE(0, "dac", -1.0, DAC_VREF_NEG_INPUT)
-MACHINE_CONFIG_END
-
+ DAC_8BIT_R2R(config, "dac", 0).add_route(ALL_OUTPUTS, "speaker", 0.1); // unknown DAC
+ voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref"));
+ vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT);
+ vref.add_route(0, "dac", -1.0, DAC_VREF_NEG_INPUT);
+}
-MACHINE_CONFIG_START(tsamurai_state::m660)
+void tsamurai_state::m660(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, XTAL(24'000'000)/8)
- MCFG_DEVICE_PROGRAM_MAP(m660_map)
- MCFG_DEVICE_IO_MAP(z80_m660_io_map)
+ Z80(config, m_maincpu, XTAL(24'000'000)/8);
+ m_maincpu->set_addrmap(AS_PROGRAM, &tsamurai_state::m660_map);
+ m_maincpu->set_addrmap(AS_IO, &tsamurai_state::z80_m660_io_map);
- MCFG_DEVICE_ADD("audiocpu", Z80, XTAL(24'000'000)/8)
- MCFG_DEVICE_PROGRAM_MAP(sound1_m660_map)
+ Z80(config, m_audiocpu, XTAL(24'000'000)/8);
+ m_audiocpu->set_addrmap(AS_PROGRAM, &tsamurai_state::sound1_m660_map);
- MCFG_DEVICE_ADD("audio2", Z80, XTAL(24'000'000)/8)
- MCFG_DEVICE_PROGRAM_MAP(sound2_m660_map)
+ Z80(config, m_audio2, XTAL(24'000'000)/8);
+ m_audio2->set_addrmap(AS_PROGRAM, &tsamurai_state::sound2_m660_map);
- MCFG_DEVICE_ADD("audio3", Z80, XTAL(24'000'000)/8)
- MCFG_DEVICE_PROGRAM_MAP(sound3_m660_map)
- MCFG_DEVICE_IO_MAP(sound3_m660_io_map)
+ Z80(config, m_audio3, XTAL(24'000'000)/8);
+ m_audio3->set_addrmap(AS_PROGRAM, &tsamurai_state::sound3_m660_map);
+ m_audio3->set_addrmap(AS_IO, &tsamurai_state::sound3_m660_io_map);
MCFG_MACHINE_START_OVERRIDE(tsamurai_state,m660)
@@ -851,7 +852,7 @@ MACHINE_CONFIG_START(tsamurai_state::m660)
screen.screen_vblank().set(FUNC(tsamurai_state::vblank_irq));
screen.screen_vblank().append_inputline(m_audio3, INPUT_LINE_NMI);
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_tsamurai)
+ GFXDECODE(config, m_gfxdecode, m_palette, gfx_tsamurai);
PALETTE(config, m_palette, palette_device::RGB_444_PROMS, "proms", 256);
MCFG_VIDEO_START_OVERRIDE(tsamurai_state,m660)
@@ -860,12 +861,12 @@ MACHINE_CONFIG_START(tsamurai_state::m660)
AY8910(config,"aysnd", XTAL(24'000'000)/8).add_route(ALL_OUTPUTS, "speaker", 0.1);
- MCFG_DEVICE_ADD("dac1", DAC_8BIT_R2R, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 0.1) // unknown DAC
- MCFG_DEVICE_ADD("dac2", DAC_8BIT_R2R, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 0.1) // unknown DAC
- MCFG_DEVICE_ADD("vref", VOLTAGE_REGULATOR, 0) MCFG_VOLTAGE_REGULATOR_OUTPUT(5.0)
- MCFG_SOUND_ROUTE(0, "dac1", 1.0, DAC_VREF_POS_INPUT) MCFG_SOUND_ROUTE(0, "dac1", -1.0, DAC_VREF_NEG_INPUT)
- MCFG_SOUND_ROUTE(0, "dac2", 1.0, DAC_VREF_POS_INPUT) MCFG_SOUND_ROUTE(0, "dac2", -1.0, DAC_VREF_NEG_INPUT)
-MACHINE_CONFIG_END
+ DAC_8BIT_R2R(config, "dac1", 0).add_route(ALL_OUTPUTS, "speaker", 0.1); // unknown DAC
+ DAC_8BIT_R2R(config, "dac2", 0).add_route(ALL_OUTPUTS, "speaker", 0.1); // unknown DAC
+ voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref"));
+ vref.add_route(0, "dac1", 1.0, DAC_VREF_POS_INPUT); vref.add_route(0, "dac1", -1.0, DAC_VREF_NEG_INPUT);
+ vref.add_route(0, "dac2", 1.0, DAC_VREF_POS_INPUT); vref.add_route(0, "dac2", -1.0, DAC_VREF_NEG_INPUT);
+}
/*******************************************************************************/
diff --git a/src/mame/drivers/tsispch.cpp b/src/mame/drivers/tsispch.cpp
index 106e6782950..59641e44c6f 100644
--- a/src/mame/drivers/tsispch.cpp
+++ b/src/mame/drivers/tsispch.cpp
@@ -369,7 +369,8 @@ INPUT_PORTS_END
/******************************************************************************
Machine Drivers
******************************************************************************/
-MACHINE_CONFIG_START(tsispch_state::prose2k)
+void tsispch_state::prose2k(machine_config &config)
+{
/* basic machine hardware */
/* There are two crystals on the board: a 24MHz xtal at Y2 and a 16MHz xtal at Y1 */
I8086(config, m_maincpu, 8000000); /* VERIFIED clock, unknown divider */
@@ -405,15 +406,16 @@ MACHINE_CONFIG_START(tsispch_state::prose2k)
/* sound hardware */
SPEAKER(config, "speaker").front_center();
- MCFG_DEVICE_ADD("dac", DAC_12BIT_R2R, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 1.0) // unknown DAC (TODO: correctly figure out how the DAC works; apparently it is connected to the serial output of the upd7720, which will be "fun" to connect up)
- MCFG_DEVICE_ADD("vref", VOLTAGE_REGULATOR, 0) MCFG_VOLTAGE_REGULATOR_OUTPUT(5.0)
- MCFG_SOUND_ROUTE(0, "dac", 1.0, DAC_VREF_POS_INPUT) MCFG_SOUND_ROUTE(0, "dac", -1.0, DAC_VREF_NEG_INPUT)
+ DAC_12BIT_R2R(config, "dac", 0).add_route(ALL_OUTPUTS, "speaker", 1.0); // unknown DAC (TODO: correctly figure out how the DAC works; apparently it is connected to the serial output of the upd7720, which will be "fun" to connect up)
+ voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref"));
+ vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT);
+ vref.add_route(0, "dac", -1.0, DAC_VREF_NEG_INPUT);
rs232_port_device &rs232(RS232_PORT(config, "rs232", default_rs232_devices, "terminal"));
rs232.rxd_handler().set("i8251a_u15", FUNC(i8251_device::write_rxd));
rs232.dsr_handler().set("i8251a_u15", FUNC(i8251_device::write_dsr));
rs232.cts_handler().set("i8251a_u15", FUNC(i8251_device::write_cts));
-MACHINE_CONFIG_END
+}
/******************************************************************************
ROM Definitions
diff --git a/src/mame/drivers/ttchamp.cpp b/src/mame/drivers/ttchamp.cpp
index 45cbb0df0bf..270f1984a0e 100644
--- a/src/mame/drivers/ttchamp.cpp
+++ b/src/mame/drivers/ttchamp.cpp
@@ -645,32 +645,30 @@ INTERRUPT_GEN_MEMBER(ttchamp_state::irq)/* right? */
device.execute().pulse_input_line(INPUT_LINE_NMI, attotime::zero);
}
-MACHINE_CONFIG_START(ttchamp_state::ttchamp)
+void ttchamp_state::ttchamp(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", V30, 8000000)
- MCFG_DEVICE_PROGRAM_MAP(ttchamp_map)
- MCFG_DEVICE_IO_MAP(ttchamp_io)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", ttchamp_state, irq)
+ V30(config, m_maincpu, 8000000);
+ m_maincpu->set_addrmap(AS_PROGRAM, &ttchamp_state::ttchamp_map);
+ m_maincpu->set_addrmap(AS_IO, &ttchamp_state::ttchamp_io);
+ m_maincpu->set_vblank_int("screen", FUNC(ttchamp_state::irq));
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(1024,1024)
- MCFG_SCREEN_VISIBLE_AREA(0, 320-1, 0, 200-1)
- MCFG_SCREEN_UPDATE_DRIVER(ttchamp_state, screen_update)
- MCFG_SCREEN_PALETTE("palette")
-
- MCFG_PALETTE_ADD("palette", 0x400)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(1024,1024);
+ screen.set_visarea(0, 320-1, 0, 200-1);
+ screen.set_screen_update(FUNC(ttchamp_state::screen_update));
+ screen.set_palette(m_palette);
+ PALETTE(config, m_palette).set_entries(0x400);
NVRAM(config, "backram", nvram_device::DEFAULT_ALL_0);
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("oki", OKIM6295, 8000000/8, okim6295_device::PIN7_HIGH)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
-
-MACHINE_CONFIG_END
+ OKIM6295(config, "oki", 8000000/8, okim6295_device::PIN7_HIGH).add_route(ALL_OUTPUTS, "mono", 1.0);
+}
ROM_START( ttchamp )
ROM_REGION16_LE( 0x200000, "maincpu", 0 )
diff --git a/src/mame/drivers/tti.cpp b/src/mame/drivers/tti.cpp
index 97ad14dacdb..0e0c3642858 100644
--- a/src/mame/drivers/tti.cpp
+++ b/src/mame/drivers/tti.cpp
@@ -21,6 +21,9 @@ Other: LED, 20MHz crystal. Next to the MC68901P is another chip just as large (4
#include "machine/74259.h"
#include "machine/eepromser.h"
#include "machine/mc68901.h"
+#include "machine/ncr5390.h"
+#include "machine/nscsi_cd.h"
+#include "machine/nscsi_hd.h"
class tti_state : public driver_device
{
@@ -29,19 +32,40 @@ public:
: driver_device(mconfig, type, tag)
, m_maincpu(*this, "maincpu")
, m_mfp(*this, "mfp")
+ , m_asc(*this, "scsibus:7:asc")
+ , m_dma_address(0)
{ }
void tti(machine_config &config);
+protected:
+ virtual void machine_start() override;
+
private:
+ u8 asc_r(offs_t offset);
+ void asc_w(offs_t offset, u8 data);
+ void dma_address_w(offs_t offset, u8 data);
+ u8 io_status_r();
+ void channel_w(u8 data);
+
+ void asc_config(device_t *device);
+
IRQ_CALLBACK_MEMBER(intack);
void prg_map(address_map &map);
required_device<cpu_device> m_maincpu;
required_device<mc68901_device> m_mfp;
+ required_device<ncr53c90a_device> m_asc;
+
+ u32 m_dma_address;
};
+void tti_state::machine_start()
+{
+ save_item(NAME(m_dma_address));
+}
+
IRQ_CALLBACK_MEMBER(tti_state::intack)
{
return m_mfp->get_vector();
@@ -50,12 +74,74 @@ IRQ_CALLBACK_MEMBER(tti_state::intack)
static INPUT_PORTS_START( tti )
INPUT_PORTS_END
+u8 tti_state::asc_r(offs_t offset)
+{
+ return m_asc->read(offset ^ 1);
+}
+
+void tti_state::asc_w(offs_t offset, u8 data)
+{
+ m_asc->write(offset ^ 1, data);
+}
+
+void tti_state::dma_address_w(offs_t offset, u8 data)
+{
+ m_dma_address &= ~(0xff000000 >> (offset * 8));
+ m_dma_address |= u32(data) << (24 - offset * 8);
+}
+
+u8 tti_state::io_status_r()
+{
+ return 0;
+}
+
+void tti_state::channel_w(u8 data)
+{
+ switch (data & 0x03)
+ {
+ case 0:
+ m_mfp->i4_w(0);
+ break;
+
+ case 1:
+ m_mfp->i3_w(0);
+ break;
+
+ case 3:
+ m_mfp->i5_w(0);
+ break;
+ }
+}
+
void tti_state::prg_map(address_map &map)
{
map(0x00000, 0x07fff).rom().region("maincpu", 0);
map(0x7e000, 0x7ffff).ram();
map(0x80000, 0x80017).rw(m_mfp, FUNC(mc68901_device::read), FUNC(mc68901_device::write));
+ map(0x80018, 0x8001f).ram();
+ map(0x80020, 0x8002b).rw(FUNC(tti_state::asc_r), FUNC(tti_state::asc_w));
map(0x80070, 0x80077).w("bitlatch", FUNC(ls259_device::write_d0));
+ map(0x80078, 0x8007b).w(FUNC(tti_state::dma_address_w));
+ map(0x8007c, 0x8007c).r(FUNC(tti_state::io_status_r));
+ map(0x8007d, 0x8007d).w(FUNC(tti_state::channel_w));
+}
+
+static void tti_scsi_devices(device_slot_interface &device)
+{
+ // FIXME: these device options are placeholders
+ device.option_add("cdrom", NSCSI_CDROM);
+ device.option_add("harddisk", NSCSI_HARDDISK);
+ device.option_add_internal("asc", NCR53C90A);
+}
+
+void tti_state::asc_config(device_t *device)
+{
+ ncr53c90a_device &adapter = downcast<ncr53c90a_device &>(*device);
+
+ adapter.set_clock(20_MHz_XTAL);
+
+ adapter.irq_handler_cb().set(m_mfp, FUNC(mc68901_device::i7_w)).invert();
+ //adapter.drq_handler_cb().set(?);
}
void tti_state::tti(machine_config &config)
@@ -71,6 +157,16 @@ void tti_state::tti(machine_config &config)
m_mfp->out_so_cb().set("rs232", FUNC(rs232_port_device::write_txd));
m_mfp->out_irq_cb().set_inputline("maincpu", M68K_IRQ_5);
+ NSCSI_BUS(config, "scsibus");
+ NSCSI_CONNECTOR(config, "scsibus:0", tti_scsi_devices, nullptr);
+ NSCSI_CONNECTOR(config, "scsibus:1", tti_scsi_devices, nullptr);
+ NSCSI_CONNECTOR(config, "scsibus:2", tti_scsi_devices, nullptr);
+ NSCSI_CONNECTOR(config, "scsibus:3", tti_scsi_devices, nullptr);
+ NSCSI_CONNECTOR(config, "scsibus:4", tti_scsi_devices, nullptr);
+ NSCSI_CONNECTOR(config, "scsibus:5", tti_scsi_devices, nullptr);
+ NSCSI_CONNECTOR(config, "scsibus:6", tti_scsi_devices, nullptr);
+ NSCSI_CONNECTOR(config, "scsibus:7", tti_scsi_devices, "asc", true).set_option_machine_config("asc", [this] (device_t *device) { asc_config(device); });
+
rs232_port_device &rs232(RS232_PORT(config, "rs232", default_rs232_devices, "terminal"));
rs232.rxd_handler().set(m_mfp, FUNC(mc68901_device::write_rx));
diff --git a/src/mame/drivers/tubep.cpp b/src/mame/drivers/tubep.cpp
index c2ace202c4a..f0fd25ade8a 100644
--- a/src/mame/drivers/tubep.cpp
+++ b/src/mame/drivers/tubep.cpp
@@ -820,25 +820,25 @@ INPUT_PORTS_END
*
*************************************/
-MACHINE_CONFIG_START(tubep_state::tubep)
-
+void tubep_state::tubep(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu",Z80,16000000 / 4) /* 4 MHz */
- MCFG_DEVICE_PROGRAM_MAP(tubep_main_map)
- MCFG_DEVICE_IO_MAP(tubep_main_portmap)
+ Z80(config, m_maincpu, 16000000 / 4); /* 4 MHz */
+ m_maincpu->set_addrmap(AS_PROGRAM, &tubep_state::tubep_main_map);
+ m_maincpu->set_addrmap(AS_IO, &tubep_state::tubep_main_portmap);
- MCFG_DEVICE_ADD("slave",Z80,16000000 / 4) /* 4 MHz */
- MCFG_DEVICE_PROGRAM_MAP(tubep_second_map)
- MCFG_DEVICE_IO_MAP(tubep_second_portmap)
+ Z80(config, m_slave, 16000000 / 4); /* 4 MHz */
+ m_slave->set_addrmap(AS_PROGRAM, &tubep_state::tubep_second_map);
+ m_slave->set_addrmap(AS_IO, &tubep_state::tubep_second_portmap);
- MCFG_DEVICE_ADD("soundcpu",Z80,19968000 / 8) /* X2 19968000 Hz divided by LS669 (on Qc output) (signal RH0) */
- MCFG_DEVICE_PROGRAM_MAP(tubep_sound_map)
- MCFG_DEVICE_IO_MAP(tubep_sound_portmap)
+ Z80(config, m_soundcpu, 19968000 / 8); /* X2 19968000 Hz divided by LS669 (on Qc output) (signal RH0) */
+ m_soundcpu->set_addrmap(AS_PROGRAM, &tubep_state::tubep_sound_map);
+ m_soundcpu->set_addrmap(AS_IO, &tubep_state::tubep_sound_portmap);
- MCFG_DEVICE_ADD("mcu",NSC8105,6000000) /* 6 MHz Xtal - divided internally ??? */
- MCFG_DEVICE_PROGRAM_MAP(nsc_map)
+ NSC8105(config, m_mcu, 6000000); /* 6 MHz Xtal - divided internally ??? */
+ m_mcu->set_addrmap(AS_PROGRAM, &tubep_state::nsc_map);
- MCFG_QUANTUM_TIME(attotime::from_hz(6000))
+ config.m_minimum_quantum = attotime::from_hz(6000);
ls259_device &mainlatch(LS259(config, "mainlatch"));
mainlatch.q_out_cb<0>().set(FUNC(tubep_state::coin1_counter_w));
@@ -852,12 +852,12 @@ MACHINE_CONFIG_START(tubep_state::tubep)
MCFG_MACHINE_RESET_OVERRIDE(tubep_state,tubep)
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_SIZE(256, 264)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(tubep_state, screen_update_tubep)
- MCFG_SCREEN_PALETTE("palette")
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_refresh_hz(60);
+ m_screen->set_size(256, 264);
+ m_screen->set_visarea(0*8, 32*8-1, 2*8, 30*8-1);
+ m_screen->set_screen_update(FUNC(tubep_state::screen_update_tubep));
+ m_screen->set_palette("palette");
PALETTE(config, "palette", FUNC(tubep_state::tubep_palette), 32 + 256*64);
@@ -878,39 +878,37 @@ MACHINE_CONFIG_START(tubep_state::tubep)
ay3.port_a_write_callback().set(FUNC(tubep_state::ay8910_portA_2_w));
ay3.port_b_write_callback().set(FUNC(tubep_state::ay8910_portB_2_w));
ay3.add_route(ALL_OUTPUTS, "mono", 0.10);
-MACHINE_CONFIG_END
-
+}
-MACHINE_CONFIG_START(tubep_state::tubepb)
+void tubep_state::tubepb(machine_config &config)
+{
tubep(config);
- MCFG_DEVICE_REPLACE("mcu", M6802,6000000) /* ? MHz Xtal */
- MCFG_DEVICE_PROGRAM_MAP(nsc_map)
-
- //MCFG_SCREEN_MODIFY("screen")
- //MCFG_SCREEN_VBLANK_CALLBACK(INPUTLINE("mcu", INPUT_LINE_NMI))
-MACHINE_CONFIG_END
+ M6802(config.replace(), m_mcu, 6000000); /* ? MHz Xtal */
+ m_mcu->set_addrmap(AS_PROGRAM, &tubep_state::nsc_map);
+ //m_screen->screen_vblank().set_inputline(m_mcu, INPUT_LINE_NMI);
+}
-MACHINE_CONFIG_START(tubep_state::rjammer)
-
+void tubep_state::rjammer(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu",Z80,16000000 / 4) /* 4 MHz */
- MCFG_DEVICE_PROGRAM_MAP(rjammer_main_map)
- MCFG_DEVICE_IO_MAP(rjammer_main_portmap)
+ Z80(config, m_maincpu, 16000000 / 4); /* 4 MHz */
+ m_maincpu->set_addrmap(AS_PROGRAM, &tubep_state::rjammer_main_map);
+ m_maincpu->set_addrmap(AS_IO, &tubep_state::rjammer_main_portmap);
- MCFG_DEVICE_ADD("slave",Z80,16000000 / 4) /* 4 MHz */
- MCFG_DEVICE_PROGRAM_MAP(rjammer_second_map)
- MCFG_DEVICE_IO_MAP(rjammer_second_portmap)
+ Z80(config, m_slave, 16000000 / 4); /* 4 MHz */
+ m_slave->set_addrmap(AS_PROGRAM, &tubep_state::rjammer_second_map);
+ m_slave->set_addrmap(AS_IO, &tubep_state::rjammer_second_portmap);
- MCFG_DEVICE_ADD("soundcpu",Z80,19968000 / 8) /* X2 19968000 Hz divided by LS669 (on Qc output) (signal RH0) */
- MCFG_DEVICE_PROGRAM_MAP(rjammer_sound_map)
- MCFG_DEVICE_IO_MAP(rjammer_sound_portmap)
+ Z80(config, m_soundcpu, 19968000 / 8); /* X2 19968000 Hz divided by LS669 (on Qc output) (signal RH0) */
+ m_soundcpu->set_addrmap(AS_PROGRAM, &tubep_state::rjammer_sound_map);
+ m_soundcpu->set_addrmap(AS_IO, &tubep_state::rjammer_sound_portmap);
GENERIC_LATCH_8(config, "soundlatch").data_pending_callback().set_inputline(m_soundcpu, INPUT_LINE_NMI);
- MCFG_DEVICE_ADD("mcu",NSC8105,6000000) /* 6 MHz Xtal - divided internally ??? */
- MCFG_DEVICE_PROGRAM_MAP(nsc_map)
+ NSC8105(config, m_mcu, 6000000); /* 6 MHz Xtal - divided internally ??? */
+ m_mcu->set_addrmap(AS_PROGRAM, &tubep_state::nsc_map);
ls259_device &mainlatch(LS259(config, "mainlatch")); // 3A
mainlatch.q_out_cb<0>().set(FUNC(tubep_state::coin1_counter_w));
@@ -920,14 +918,13 @@ MACHINE_CONFIG_START(tubep_state::rjammer)
MCFG_MACHINE_START_OVERRIDE(tubep_state,rjammer)
MCFG_MACHINE_RESET_OVERRIDE(tubep_state,rjammer)
-
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_SIZE(256, 264)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(tubep_state, screen_update_rjammer)
- MCFG_SCREEN_PALETTE("palette")
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_refresh_hz(60);
+ m_screen->set_size(256, 264);
+ m_screen->set_visarea(0*8, 32*8-1, 2*8, 30*8-1);
+ m_screen->set_screen_update(FUNC(tubep_state::screen_update_rjammer));
+ m_screen->set_palette("palette");
PALETTE(config, "palette", FUNC(tubep_state::rjammer_palette), 64);
@@ -949,12 +946,11 @@ MACHINE_CONFIG_START(tubep_state::rjammer)
ay3.port_b_write_callback().set(FUNC(tubep_state::ay8910_portB_2_w));
ay3.add_route(ALL_OUTPUTS, "mono", 0.10);
- MCFG_DEVICE_ADD("msm", MSM5205, 384000)
- MCFG_MSM5205_VCLK_CB(WRITELINE(*this, tubep_state, rjammer_adpcm_vck)) /* VCK function */
- MCFG_MSM5205_PRESCALER_SELECTOR(S48_4B) /* 8 KHz (changes at run time) */
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
-
-MACHINE_CONFIG_END
+ MSM5205(config, m_msm, 384000);
+ m_msm->vck_legacy_callback().set(FUNC(tubep_state::rjammer_adpcm_vck)); /* VCK function */
+ m_msm->set_prescaler_selector(msm5205_device::S48_4B); /* 8 KHz (changes at run time) */
+ m_msm->add_route(ALL_OUTPUTS, "mono", 1.0);
+}
diff --git a/src/mame/drivers/tugboat.cpp b/src/mame/drivers/tugboat.cpp
index 55e3d72b31c..93e6e1863d6 100644
--- a/src/mame/drivers/tugboat.cpp
+++ b/src/mame/drivers/tugboat.cpp
@@ -359,9 +359,10 @@ static GFXDECODE_START( gfx_tugboat )
GFXDECODE_END
-MACHINE_CONFIG_START(tugboat_state::tugboat)
- MCFG_DEVICE_ADD("maincpu", M6502, 2000000) /* 2 MHz ???? */
- MCFG_DEVICE_PROGRAM_MAP(main_map)
+void tugboat_state::tugboat(machine_config &config)
+{
+ M6502(config, m_maincpu, 2000000); /* 2 MHz ???? */
+ m_maincpu->set_addrmap(AS_PROGRAM, &tugboat_state::main_map);
pia6821_device &pia0(PIA6821(config, "pia0", 0));
pia0.readpa_handler().set(FUNC(tugboat_state::input_r));
@@ -370,13 +371,13 @@ MACHINE_CONFIG_START(tugboat_state::tugboat)
pia1.readpa_handler().set_ioport("DSW");
pia1.writepb_handler().set(FUNC(tugboat_state::ctrl_w));
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_SIZE(32*8,32*8)
- MCFG_SCREEN_VISIBLE_AREA(1*8,31*8-1,2*8,30*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(tugboat_state, screen_update)
- MCFG_SCREEN_PALETTE(m_palette)
- MCFG_SCREEN_VBLANK_CALLBACK(INPUTLINE("maincpu", INPUT_LINE_NMI))
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_refresh_hz(60);
+ m_screen->set_size(32*8,32*8);
+ m_screen->set_visarea(1*8,31*8-1,2*8,30*8-1);
+ m_screen->set_screen_update(FUNC(tugboat_state::screen_update));
+ m_screen->set_palette(m_palette);
+ m_screen->screen_vblank().set_inputline(m_maincpu, INPUT_LINE_NMI);
GFXDECODE(config, m_gfxdecode, m_palette, gfx_tugboat);
PALETTE(config, m_palette, FUNC(tugboat_state::tugboat_palette), 256);
@@ -385,7 +386,7 @@ MACHINE_CONFIG_START(tugboat_state::tugboat)
SPEAKER(config, "mono").front_center();
AY8912(config, "aysnd", XTAL(10'000'000)/8).add_route(ALL_OUTPUTS, "mono", 0.35);
-MACHINE_CONFIG_END
+}
ROM_START( tugboat )
diff --git a/src/mame/drivers/tumbleb.cpp b/src/mame/drivers/tumbleb.cpp
index a1bc8f73e50..0b91a31aacf 100644
--- a/src/mame/drivers/tumbleb.cpp
+++ b/src/mame/drivers/tumbleb.cpp
@@ -321,12 +321,12 @@ WRITE16_MEMBER(tumbleb_state::tumblepb_oki_w)
{
if (mem_mask == 0xffff)
{
- m_oki->write(space, 0, data & 0xff);
+ m_oki->write(data & 0xff);
//printf("tumbleb_oki_w %04x %04x\n", data, mem_mask);
}
else
{
- m_oki->write(space, 0, (data >> 8) & 0xff);
+ m_oki->write((data >> 8) & 0xff);
//printf("tumbleb_oki_w %04x %04x\n", data, mem_mask);
}
/* STUFF IN OTHER BYTE TOO..*/
@@ -428,14 +428,14 @@ command 1 - stop?
void tumbleb_state::tumbleb2_playmusic(okim6295_device *oki)
{
- int status = oki->read_status();
+ int status = oki->read();
if (m_music_is_playing)
{
if (!BIT(status, 3))
{
- oki->write_command(0x80 | m_music_command);
- oki->write_command(0x00 | 0x82);
+ oki->write(0x80 | m_music_command);
+ oki->write(0x00 | 0x82);
}
}
}
@@ -476,22 +476,22 @@ void tumbleb_state::tumbleb2_set_music_bank( int bank )
void tumbleb_state::tumbleb2_play_sound( okim6295_device *oki, int data )
{
- int status = oki->read_status();
+ int status = oki->read();
if (!BIT(status, 0))
{
- oki->write_command(0x80 | data);
- oki->write_command(0x00 | 0x12);
+ oki->write(0x80 | data);
+ oki->write(0x00 | 0x12);
}
else if (!BIT(status, 1))
{
- oki->write_command(0x80 | data);
- oki->write_command(0x00 | 0x22);
+ oki->write(0x80 | data);
+ oki->write(0x00 | 0x22);
}
else if (!BIT(status, 2))
{
- oki->write_command(0x80 | data);
- oki->write_command(0x00 | 0x42);
+ oki->write(0x80 | data);
+ oki->write(0x00 | 0x42);
}
}
@@ -509,13 +509,13 @@ void tumbleb_state::tumbleb2_play_sound( okim6295_device *oki, int data )
void tumbleb_state::process_tumbleb2_music_command( okim6295_device *oki, int data )
{
- int status = oki->read_status();
+ int status = oki->read();
if (data == 1) // stop?
{
if (BIT(status, 3))
{
- oki->write_command(0x40); /* Stop playing music */
+ oki->write(0x40); /* Stop playing music */
m_music_is_playing = 0;
}
}
@@ -524,7 +524,7 @@ void tumbleb_state::process_tumbleb2_music_command( okim6295_device *oki, int da
if (m_music_is_playing != data)
{
m_music_is_playing = data;
- oki->write_command(0x40); // stop the current music
+ oki->write(0x40); // stop the current music
switch (data)
{
case 0x04: // map screen
@@ -2065,31 +2065,31 @@ MACHINE_RESET_MEMBER(tumbleb_state,tumbleb)
memset(m_control_0, 0, sizeof(m_control_0));
}
-MACHINE_CONFIG_START(tumbleb_state::tumblepb)
-
+void tumbleb_state::tumblepb(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M68000, 14000000)
- MCFG_DEVICE_PROGRAM_MAP(tumblepopb_main_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", tumbleb_state, irq6_line_hold)
+ M68000(config, m_maincpu, 14000000);
+ m_maincpu->set_addrmap(AS_PROGRAM, &tumbleb_state::tumblepopb_main_map);
+ m_maincpu->set_vblank_int("screen", FUNC(tumbleb_state::irq6_line_hold));
MCFG_MACHINE_START_OVERRIDE(tumbleb_state,tumbleb)
MCFG_MACHINE_RESET_OVERRIDE(tumbleb_state,tumbleb)
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(58)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(529))
- MCFG_SCREEN_SIZE(40*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 40*8-1, 1*8, 31*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(tumbleb_state, screen_update_tumblepb)
- MCFG_SCREEN_PALETTE(m_palette)
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_refresh_hz(58);
+ m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(529));
+ m_screen->set_size(40*8, 32*8);
+ m_screen->set_visarea(0*8, 40*8-1, 1*8, 31*8-1);
+ m_screen->set_screen_update(FUNC(tumbleb_state::screen_update_tumblepb));
+ m_screen->set_palette(m_palette);
DECO_SPRITE(config, m_sprgen, 0);
m_sprgen->set_gfx_region(3);
m_sprgen->set_is_bootleg(true);
m_sprgen->set_gfxdecode_tag(m_gfxdecode);
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, m_palette, gfx_tumbleb)
+ GFXDECODE(config, m_gfxdecode, m_palette, gfx_tumbleb);
PALETTE(config, m_palette).set_format(palette_device::xBGR_444, 1024);
MCFG_VIDEO_START_OVERRIDE(tumbleb_state,tumblepb)
@@ -2097,41 +2097,40 @@ MACHINE_CONFIG_START(tumbleb_state::tumblepb)
/* sound hardware */
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("oki", OKIM6295, 8000000/10, okim6295_device::PIN7_HIGH)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.70)
-MACHINE_CONFIG_END
+ OKIM6295(config, m_oki, 8000000/10, okim6295_device::PIN7_HIGH).add_route(ALL_OUTPUTS, "mono", 0.70);
+}
-MACHINE_CONFIG_START(tumbleb_state::tumblepba)
+void tumbleb_state::tumblepba(machine_config &config)
+{
tumblepb(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(tumblepopba_main_map)
-MACHINE_CONFIG_END
-
-MACHINE_CONFIG_START(tumbleb_state::tumbleb2)
+ m_maincpu->set_addrmap(AS_PROGRAM, &tumbleb_state::tumblepopba_main_map);
+}
+void tumbleb_state::tumbleb2(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD(m_maincpu, M68000, 14000000)
- MCFG_DEVICE_PROGRAM_MAP(tumblepopb_main_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", tumbleb_state, tumbleb2_interrupt)
+ M68000(config, m_maincpu, 14000000);
+ m_maincpu->set_addrmap(AS_PROGRAM, &tumbleb_state::tumblepopb_main_map);
+ m_maincpu->set_vblank_int("screen", FUNC(tumbleb_state::tumbleb2_interrupt));
MCFG_MACHINE_START_OVERRIDE(tumbleb_state,tumbleb)
MCFG_MACHINE_RESET_OVERRIDE(tumbleb_state,tumbleb)
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(58)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(529))
- MCFG_SCREEN_SIZE(40*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 40*8-1, 1*8, 31*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(tumbleb_state, screen_update_tumblepb)
- MCFG_SCREEN_PALETTE(m_palette)
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_refresh_hz(58);
+ m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(529));
+ m_screen->set_size(40*8, 32*8);
+ m_screen->set_visarea(0*8, 40*8-1, 1*8, 31*8-1);
+ m_screen->set_screen_update(FUNC(tumbleb_state::screen_update_tumblepb));
+ m_screen->set_palette(m_palette);
DECO_SPRITE(config, m_sprgen, 0);
m_sprgen->set_gfx_region(3);
m_sprgen->set_is_bootleg(true);
m_sprgen->set_gfxdecode_tag(m_gfxdecode);
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, m_palette, gfx_tumbleb)
+ GFXDECODE(config, m_gfxdecode, m_palette, gfx_tumbleb);
PALETTE(config, m_palette).set_format(palette_device::xBGR_444, 1024);
MCFG_VIDEO_START_OVERRIDE(tumbleb_state,tumblepb)
@@ -2139,9 +2138,8 @@ MACHINE_CONFIG_START(tumbleb_state::tumbleb2)
/* sound hardware */
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("oki", OKIM6295, 8000000/10, okim6295_device::PIN7_HIGH)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.70)
-MACHINE_CONFIG_END
+ OKIM6295(config, m_oki, 8000000/10, okim6295_device::PIN7_HIGH).add_route(ALL_OUTPUTS, "mono", 0.70);
+}
void tumbleb_state::funkyjetb(machine_config &config)
{
@@ -2151,35 +2149,35 @@ void tumbleb_state::funkyjetb(machine_config &config)
m_maincpu->set_vblank_int("screen", FUNC(tumbleb_state::irq6_line_hold));
}
-MACHINE_CONFIG_START(tumbleb_state::jumpkids)
-
+void tumbleb_state::jumpkids(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M68000, 12000000)
- MCFG_DEVICE_PROGRAM_MAP(jumpkids_main_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", tumbleb_state, irq6_line_hold)
+ M68000(config, m_maincpu, 12000000);
+ m_maincpu->set_addrmap(AS_PROGRAM, &tumbleb_state::jumpkids_main_map);
+ m_maincpu->set_vblank_int("screen", FUNC(tumbleb_state::irq6_line_hold));
/* z80? */
- MCFG_DEVICE_ADD("audiocpu", Z80, 8000000/2)
- MCFG_DEVICE_PROGRAM_MAP(jumpkids_sound_map)
+ Z80(config, m_audiocpu, 8000000/2);
+ m_audiocpu->set_addrmap(AS_PROGRAM, &tumbleb_state::jumpkids_sound_map);
MCFG_MACHINE_START_OVERRIDE(tumbleb_state,tumbleb)
MCFG_MACHINE_RESET_OVERRIDE(tumbleb_state,tumbleb)
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(529))
- MCFG_SCREEN_SIZE(40*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 40*8-1, 1*8, 31*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(tumbleb_state, screen_update_jumpkids)
- MCFG_SCREEN_PALETTE(m_palette)
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_refresh_hz(60);
+ m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(529));
+ m_screen->set_size(40*8, 32*8);
+ m_screen->set_visarea(0*8, 40*8-1, 1*8, 31*8-1);
+ m_screen->set_screen_update(FUNC(tumbleb_state::screen_update_jumpkids));
+ m_screen->set_palette(m_palette);
DECO_SPRITE(config, m_sprgen, 0);
m_sprgen->set_gfx_region(3);
m_sprgen->set_is_bootleg(true);
m_sprgen->set_gfxdecode_tag(m_gfxdecode);
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, m_palette, gfx_tumbleb)
+ GFXDECODE(config, m_gfxdecode, m_palette, gfx_tumbleb);
PALETTE(config, m_palette).set_format(palette_device::xBGR_444, 1024);
MCFG_VIDEO_START_OVERRIDE(tumbleb_state,tumblepb)
@@ -2189,28 +2187,27 @@ MACHINE_CONFIG_START(tumbleb_state::jumpkids)
GENERIC_LATCH_8(config, m_soundlatch);
- MCFG_DEVICE_ADD("oki", OKIM6295, 8000000/8, okim6295_device::PIN7_HIGH)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.70)
-MACHINE_CONFIG_END
-
-MACHINE_CONFIG_START(tumbleb_state::fncywld)
+ OKIM6295(config, m_oki, 8000000/8, okim6295_device::PIN7_HIGH).add_route(ALL_OUTPUTS, "mono", 0.70);
+}
+void tumbleb_state::fncywld(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M68000, 12000000)
- MCFG_DEVICE_PROGRAM_MAP(fncywld_main_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", tumbleb_state, irq6_line_hold)
+ M68000(config, m_maincpu, 12000000);
+ m_maincpu->set_addrmap(AS_PROGRAM, &tumbleb_state::fncywld_main_map);
+ m_maincpu->set_vblank_int("screen", FUNC(tumbleb_state::irq6_line_hold));
MCFG_MACHINE_START_OVERRIDE(tumbleb_state,tumbleb)
MCFG_MACHINE_RESET_OVERRIDE(tumbleb_state,tumbleb)
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(529))
- MCFG_SCREEN_SIZE(40*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 40*8-1, 1*8, 31*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(tumbleb_state, screen_update_fncywld)
- MCFG_SCREEN_PALETTE(m_palette)
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_refresh_hz(60);
+ m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(529));
+ m_screen->set_size(40*8, 32*8);
+ m_screen->set_visarea(0*8, 40*8-1, 1*8, 31*8-1);
+ m_screen->set_screen_update(FUNC(tumbleb_state::screen_update_fncywld));
+ m_screen->set_palette(m_palette);
DECO_SPRITE(config, m_sprgen, 0);
m_sprgen->set_gfx_region(3);
@@ -2218,7 +2215,7 @@ MACHINE_CONFIG_START(tumbleb_state::fncywld)
m_sprgen->set_transpen(15);
m_sprgen->set_gfxdecode_tag(m_gfxdecode);
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, m_palette, gfx_fncywld)
+ GFXDECODE(config, m_gfxdecode, m_palette, gfx_fncywld);
PALETTE(config, m_palette).set_format(palette_device::xRGB_444, 0x800);
MCFG_VIDEO_START_OVERRIDE(tumbleb_state,fncywld)
@@ -2228,29 +2225,28 @@ MACHINE_CONFIG_START(tumbleb_state::fncywld)
YM2151(config, "ymsnd", 32220000/9).add_route(ALL_OUTPUTS, "mono", 0.10);
- MCFG_DEVICE_ADD("oki", OKIM6295, 1023924, okim6295_device::PIN7_HIGH) // clock frequency & pin 7 not verified
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
-MACHINE_CONFIG_END
+ OKIM6295(config, m_oki, 1023924, okim6295_device::PIN7_HIGH).add_route(ALL_OUTPUTS, "mono", 1.0); // clock frequency & pin 7 not verified
+}
/// OSCs: 12MHz, 4MHz, 28.63636MHz, not the same PCB as fncywld
-MACHINE_CONFIG_START(tumbleb_state::magipur)
-
+void tumbleb_state::magipur(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M68000, XTAL(12'000'000))
- MCFG_DEVICE_PROGRAM_MAP(magipur_main_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", tumbleb_state, irq6_line_hold)
+ M68000(config, m_maincpu, XTAL(12'000'000));
+ m_maincpu->set_addrmap(AS_PROGRAM, &tumbleb_state::magipur_main_map);
+ m_maincpu->set_vblank_int("screen", FUNC(tumbleb_state::irq6_line_hold));
MCFG_MACHINE_START_OVERRIDE(tumbleb_state,tumbleb)
MCFG_MACHINE_RESET_OVERRIDE(tumbleb_state,tumbleb)
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60) // refresh rate not verified
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(529))
- MCFG_SCREEN_SIZE(40*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 40*8-1, 1*8, 31*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(tumbleb_state, screen_update_fncywld)
- MCFG_SCREEN_PALETTE(m_palette)
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_refresh_hz(60); // refresh rate not verified
+ m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(529));
+ m_screen->set_size(40*8, 32*8);
+ m_screen->set_visarea(0*8, 40*8-1, 1*8, 31*8-1);
+ m_screen->set_screen_update(FUNC(tumbleb_state::screen_update_fncywld));
+ m_screen->set_palette(m_palette);
DECO_SPRITE(config, m_sprgen, 0);
m_sprgen->set_gfx_region(3);
@@ -2268,9 +2264,8 @@ MACHINE_CONFIG_START(tumbleb_state::magipur)
YM2151(config, "ymsnd", XTAL(4'000'000)).add_route(ALL_OUTPUTS, "mono", 0.10);
- MCFG_DEVICE_ADD("oki", OKIM6295, XTAL(4'000'000)/4, okim6295_device::PIN7_HIGH) // clock frequency & pin 7 not verified
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
-MACHINE_CONFIG_END
+ OKIM6295(config, m_oki, XTAL(4'000'000)/4, okim6295_device::PIN7_HIGH).add_route(ALL_OUTPUTS, "mono", 1.0); // clock frequency & pin 7 not verified
+}
MACHINE_RESET_MEMBER(tumbleb_state,htchctch)
diff --git a/src/mame/drivers/turbo.cpp b/src/mame/drivers/turbo.cpp
index 37d450bdf08..80e6d144308 100644
--- a/src/mame/drivers/turbo.cpp
+++ b/src/mame/drivers/turbo.cpp
@@ -843,12 +843,12 @@ GFXDECODE_END
*
*************************************/
-MACHINE_CONFIG_START(turbo_state::turbo)
-
+void turbo_state::turbo(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, MASTER_CLOCK/4)
- MCFG_DEVICE_PROGRAM_MAP(turbo_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", turbo_state, irq0_line_hold)
+ Z80(config, m_maincpu, MASTER_CLOCK/4);
+ m_maincpu->set_addrmap(AS_PROGRAM, &turbo_state::turbo_map);
+ m_maincpu->set_vblank_int("screen", FUNC(turbo_state::irq0_line_hold));
I8255(config, m_i8255_0);
m_i8255_0->out_pa_callback().set(FUNC(turbo_state::turbo_ppi0a_w));
@@ -884,25 +884,25 @@ MACHINE_CONFIG_START(turbo_state::turbo)
GFXDECODE(config, m_gfxdecode, "palette", gfx_turbo);
PALETTE(config, "palette", FUNC(turbo_state::turbo_palette), 256);
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_VIDEO_ATTRIBUTES(VIDEO_ALWAYS_UPDATE)
- MCFG_SCREEN_RAW_PARAMS(PIXEL_CLOCK, HTOTAL, HBEND, HBSTART, VTOTAL, VBEND, VBSTART)
- MCFG_SCREEN_UPDATE_DRIVER(turbo_state, screen_update_turbo)
- MCFG_SCREEN_PALETTE("palette")
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_video_attributes(VIDEO_ALWAYS_UPDATE);
+ m_screen->set_raw(PIXEL_CLOCK, HTOTAL, HBEND, HBSTART, VTOTAL, VBEND, VBSTART);
+ m_screen->set_screen_update(FUNC(turbo_state::screen_update_turbo));
+ m_screen->set_palette("palette");
MCFG_VIDEO_START_OVERRIDE(turbo_state,turbo)
/* sound hardware */
turbo_samples(config);
-MACHINE_CONFIG_END
-
+}
-MACHINE_CONFIG_START(turbo_state::subroc3d)
+void turbo_state::subroc3d(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, MASTER_CLOCK/4)
- MCFG_DEVICE_PROGRAM_MAP(subroc3d_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", turbo_state, irq0_line_hold)
+ Z80(config, m_maincpu, MASTER_CLOCK/4);
+ m_maincpu->set_addrmap(AS_PROGRAM, &turbo_state::subroc3d_map);
+ m_maincpu->set_vblank_int("screen", FUNC(turbo_state::irq0_line_hold));
I8255(config, m_i8255_0);
m_i8255_0->out_pa_callback().set(FUNC(turbo_state::subroc3d_ppi0a_w));
@@ -923,32 +923,32 @@ MACHINE_CONFIG_START(turbo_state::subroc3d)
GFXDECODE(config, m_gfxdecode, "palette", gfx_turbo);
PALETTE(config, "palette", FUNC(turbo_state::subroc3d_palette), 256);
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_VIDEO_ATTRIBUTES(VIDEO_ALWAYS_UPDATE)
- MCFG_SCREEN_RAW_PARAMS(PIXEL_CLOCK, HTOTAL, HBEND, HBSTART, VTOTAL, VBEND, VBSTART)
- MCFG_SCREEN_UPDATE_DRIVER(turbo_state, screen_update_subroc3d)
- MCFG_SCREEN_PALETTE("palette")
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_video_attributes(VIDEO_ALWAYS_UPDATE);
+ m_screen->set_raw(PIXEL_CLOCK, HTOTAL, HBEND, HBSTART, VTOTAL, VBEND, VBSTART);
+ m_screen->set_screen_update(FUNC(turbo_state::screen_update_subroc3d));
+ m_screen->set_palette("palette");
MCFG_VIDEO_START_OVERRIDE(turbo_state,turbo)
/* sound hardware */
subroc3d_samples(config);
-MACHINE_CONFIG_END
-
+}
-MACHINE_CONFIG_START(turbo_state::buckrog)
+void turbo_state::buckrog(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, MASTER_CLOCK/4)
- MCFG_DEVICE_PROGRAM_MAP(buckrog_map)
- MCFG_DEVICE_OPCODES_MAP(decrypted_opcodes_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", turbo_state, irq0_line_hold)
+ Z80(config, m_maincpu, MASTER_CLOCK/4);
+ m_maincpu->set_addrmap(AS_PROGRAM, &turbo_state::buckrog_map);
+ m_maincpu->set_addrmap(AS_OPCODES, &turbo_state::decrypted_opcodes_map);
+ m_maincpu->set_vblank_int("screen", FUNC(turbo_state::irq0_line_hold));
- MCFG_DEVICE_ADD("subcpu", Z80, MASTER_CLOCK/4)
- MCFG_DEVICE_PROGRAM_MAP(buckrog_cpu2_map)
- MCFG_DEVICE_IO_MAP(buckrog_cpu2_portmap)
+ Z80(config, m_subcpu, MASTER_CLOCK/4);
+ m_subcpu->set_addrmap(AS_PROGRAM, &turbo_state::buckrog_cpu2_map);
+ m_subcpu->set_addrmap(AS_IO, &turbo_state::buckrog_cpu2_portmap);
- MCFG_QUANTUM_TIME(attotime::from_hz(600))
+ config.m_minimum_quantum = attotime::from_hz(600);
MCFG_MACHINE_RESET_OVERRIDE(turbo_state,buckrog)
I8255(config, m_i8255_0);
@@ -970,23 +970,25 @@ MACHINE_CONFIG_START(turbo_state::buckrog)
GFXDECODE(config, m_gfxdecode, "palette", gfx_turbo);
PALETTE(config, "palette", FUNC(turbo_state::buckrog_palette), 1024);
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_VIDEO_ATTRIBUTES(VIDEO_ALWAYS_UPDATE)
- MCFG_SCREEN_RAW_PARAMS(PIXEL_CLOCK, HTOTAL, HBEND, HBSTART, VTOTAL, VBEND, VBSTART)
- MCFG_SCREEN_UPDATE_DRIVER(turbo_state, screen_update_buckrog)
- MCFG_SCREEN_PALETTE("palette")
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_video_attributes(VIDEO_ALWAYS_UPDATE);
+ m_screen->set_raw(PIXEL_CLOCK, HTOTAL, HBEND, HBSTART, VTOTAL, VBEND, VBSTART);
+ m_screen->set_screen_update(FUNC(turbo_state::screen_update_buckrog));
+ m_screen->set_palette("palette");
MCFG_VIDEO_START_OVERRIDE(turbo_state,buckrog)
/* sound hardware */
buckrog_samples(config);
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(turbo_state::buckrogu)
+void turbo_state::buckrogu(machine_config &config)
+{
buckrog(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_REMOVE_ADDRESS_MAP(AS_OPCODES)
-MACHINE_CONFIG_END
+ Z80(config.replace(), m_maincpu, MASTER_CLOCK/4);
+ m_maincpu->set_addrmap(AS_PROGRAM, &turbo_state::buckrog_map);
+ m_maincpu->set_vblank_int("screen", FUNC(turbo_state::irq0_line_hold));
+}
void turbo_state::buckroge(machine_config &config)
diff --git a/src/mame/drivers/turrett.cpp b/src/mame/drivers/turrett.cpp
index de69211ca0e..a6a8e3d4ddd 100644
--- a/src/mame/drivers/turrett.cpp
+++ b/src/mame/drivers/turrett.cpp
@@ -80,7 +80,7 @@ void turrett_state::machine_reset()
void turrett_state::cpu_map(address_map &map)
{
- map(0x00000000, 0x0007ffff).ram();
+ map(0x00000000, 0x0007ffff).ram().mirror(0x40000000);
map(0x02000010, 0x02000013).ram();
map(0x02000040, 0x02000043).ram();
map(0x02000050, 0x02000053).ram();
@@ -345,8 +345,8 @@ void turrett_devices(device_slot_interface &device)
*
*************************************/
-MACHINE_CONFIG_START(turrett_state::turrett)
-
+void turrett_state::turrett(machine_config &config)
+{
/* basic machine hardware */
R3041(config, m_maincpu, R3041_CLOCK);
m_maincpu->set_endianness(ENDIANNESS_BIG);
@@ -359,12 +359,12 @@ MACHINE_CONFIG_START(turrett_state::turrett)
ATA_INTERFACE(config, m_ata).options(turrett_devices, "hdd", nullptr, true);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
// TODO: Likely not correct. Refresh rate empirically determined
// to ensure in-sync streaming sound
- MCFG_SCREEN_RAW_PARAMS(4000000, 512, 0, 336, 259, 0, 244)
- MCFG_SCREEN_UPDATE_DRIVER(turrett_state, screen_update)
- MCFG_SCREEN_PALETTE("palette")
+ m_screen->set_raw(4000000, 512, 0, 336, 259, 0, 244);
+ m_screen->set_screen_update(FUNC(turrett_state::screen_update));
+ m_screen->set_palette("palette");
PALETTE(config, "palette", palette_device::RGB_555);
@@ -372,11 +372,11 @@ MACHINE_CONFIG_START(turrett_state::turrett)
SPEAKER(config, "lspeaker").front_left();
SPEAKER(config, "rspeaker").front_right();
- MCFG_DEVICE_ADD("ttsound", TURRETT, R3041_CLOCK) // ?
- MCFG_DEVICE_ADDRESS_MAP(0, turrett_sound_map)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 1.0)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 1.0)
-MACHINE_CONFIG_END
+ turrett_device &ttsound(TURRETT(config, "ttsound", R3041_CLOCK)); // ?
+ ttsound.set_addrmap(0, &turrett_state::turrett_sound_map);
+ ttsound.add_route(ALL_OUTPUTS, "lspeaker", 1.0);
+ ttsound.add_route(ALL_OUTPUTS, "rspeaker", 1.0);
+}
diff --git a/src/mame/drivers/tutankhm.cpp b/src/mame/drivers/tutankhm.cpp
index 99acaf88b9d..7e07de74dc9 100644
--- a/src/mame/drivers/tutankhm.cpp
+++ b/src/mame/drivers/tutankhm.cpp
@@ -226,11 +226,11 @@ void tutankhm_state::machine_reset()
m_irq_toggle = 0;
}
-MACHINE_CONFIG_START(tutankhm_state::tutankhm)
-
+void tutankhm_state::tutankhm(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", MC6809E, XTAL(18'432'000)/12) /* 1.5 MHz ??? */
- MCFG_DEVICE_PROGRAM_MAP(main_map)
+ MC6809E(config, m_maincpu, XTAL(18'432'000)/12); /* 1.5 MHz ??? */
+ m_maincpu->set_addrmap(AS_PROGRAM, &tutankhm_state::main_map);
ls259_device &mainlatch(LS259(config, "mainlatch")); // C3
mainlatch.q_out_cb<0>().set(FUNC(tutankhm_state::irq_enable_w));
@@ -245,19 +245,19 @@ MACHINE_CONFIG_START(tutankhm_state::tutankhm)
WATCHDOG_TIMER(config, "watchdog");
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(32*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1) /* not sure about the visible area */
- MCFG_SCREEN_UPDATE_DRIVER(tutankhm_state, screen_update_tutankhm)
- MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE(*this, tutankhm_state, vblank_irq))
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(32*8, 32*8);
+ screen.set_visarea(0*8, 32*8-1, 2*8, 30*8-1); /* not sure about the visible area */
+ screen.set_screen_update(FUNC(tutankhm_state::screen_update_tutankhm));
+ screen.screen_vblank().set(FUNC(tutankhm_state::vblank_irq));
PALETTE(config, m_palette).set_format(palette_device::BGR_233, 16);
/* sound hardware */
TIMEPLT_AUDIO(config, "timeplt_audio");
-MACHINE_CONFIG_END
+}
/*************************************
diff --git a/src/mame/drivers/tutor.cpp b/src/mame/drivers/tutor.cpp
index ab718403dbf..9fed2d71e4c 100644
--- a/src/mame/drivers/tutor.cpp
+++ b/src/mame/drivers/tutor.cpp
@@ -296,17 +296,17 @@ READ8_MEMBER( tutor_state::key_r )
char port[12];
uint8_t value;
- snprintf(port, ARRAY_LENGTH(port), "LINE%d", offset);
+ snprintf(port, ARRAY_LENGTH(port), "LINE%d", (offset & 0x007e) >> 3);
value = ioport(port)->read();
/* hack for ports overlapping with joystick */
- if (offset == 4 || offset == 5)
+ if (offset >= 32 && offset < 48)
{
- snprintf(port, ARRAY_LENGTH(port), "LINE%d_alt", offset);
+ snprintf(port, ARRAY_LENGTH(port), "LINE%d_alt", (offset & 0x007e) >> 3);
value |= ioport(port)->read();
}
- return value;
+ return BIT(value, offset & 7);
}
@@ -559,10 +559,10 @@ void tutor_state::tutor_memmap(address_map &map)
map(0x8000, 0xbfff).bankr("bank2").nopw();
map(0xc000, 0xdfff).noprw(); /*free for expansion, or cartridge ROM?*/
- map(0xe000, 0xe000).rw("tms9928a", FUNC(tms9928a_device::vram_r), FUNC(tms9928a_device::vram_w)); /*VDP data*/
- map(0xe002, 0xe002).rw("tms9928a", FUNC(tms9928a_device::register_r), FUNC(tms9928a_device::register_w));/*VDP status*/
+ map(0xe000, 0xe000).rw("tms9928a", FUNC(tms9928a_device::vram_read), FUNC(tms9928a_device::vram_write)); /*VDP data*/
+ map(0xe002, 0xe002).rw("tms9928a", FUNC(tms9928a_device::register_read), FUNC(tms9928a_device::register_write));/*VDP status*/
map(0xe100, 0xe1ff).rw(FUNC(tutor_state::tutor_mapper_r), FUNC(tutor_state::tutor_mapper_w)); /*cartridge mapper*/
- map(0xe200, 0xe200).w("sn76489a", FUNC(sn76489a_device::command_w)); /*sound chip*/
+ map(0xe200, 0xe200).w("sn76489a", FUNC(sn76489a_device::write)); /*sound chip*/
map(0xe800, 0xe8ff).rw(FUNC(tutor_state::tutor_printer_r), FUNC(tutor_state::tutor_printer_w)); /*printer*/
map(0xee00, 0xeeff).nopr().w(FUNC(tutor_state::tutor_cassette_w)); /*cassette interface*/
@@ -576,10 +576,10 @@ void tutor_state::pyuutajr_mem(address_map &map)
map(0x8000, 0xbfff).bankr("bank2").nopw();
map(0xc000, 0xdfff).noprw(); /*free for expansion, or cartridge ROM?*/
- map(0xe000, 0xe000).rw("tms9928a", FUNC(tms9928a_device::vram_r), FUNC(tms9928a_device::vram_w)); /*VDP data*/
- map(0xe002, 0xe002).rw("tms9928a", FUNC(tms9928a_device::register_r), FUNC(tms9928a_device::register_w));/*VDP status*/
+ map(0xe000, 0xe000).rw("tms9928a", FUNC(tms9928a_device::vram_read), FUNC(tms9928a_device::vram_write)); /*VDP data*/
+ map(0xe002, 0xe002).rw("tms9928a", FUNC(tms9928a_device::register_read), FUNC(tms9928a_device::register_write));/*VDP status*/
map(0xe100, 0xe1ff).rw(FUNC(tutor_state::tutor_mapper_r), FUNC(tutor_state::tutor_mapper_w)); /*cartridge mapper*/
- map(0xe200, 0xe200).w("sn76489a", FUNC(sn76489a_device::command_w)); /*sound chip*/
+ map(0xe200, 0xe200).w("sn76489a", FUNC(sn76489a_device::write)); /*sound chip*/
map(0xe800, 0xe800).portr("LINE0");
map(0xea00, 0xea00).portr("LINE1");
map(0xec00, 0xec00).portr("LINE2");
@@ -600,8 +600,8 @@ void tutor_state::pyuutajr_mem(address_map &map)
void tutor_state::tutor_io(address_map &map)
{
- map(0xec0, 0xec7).r(FUNC(tutor_state::key_r)); /*keyboard interface*/
- map(0xed0, 0xed0).r(FUNC(tutor_state::tutor_cassette_r)); /*cassette interface*/
+ map(0xec00, 0xec7f).r(FUNC(tutor_state::key_r)); /*keyboard interface*/
+ map(0xed00, 0xed01).r(FUNC(tutor_state::tutor_cassette_r)); /*cassette interface*/
}
/* tutor keyboard: 56 keys
@@ -743,7 +743,8 @@ static INPUT_PORTS_START(pyuutajr)
PORT_BIT(0xff, IP_ACTIVE_HIGH, IPT_UNUSED)
INPUT_PORTS_END
-MACHINE_CONFIG_START(tutor_state::tutor)
+void tutor_state::tutor(machine_config &config)
+{
// basic machine hardware
// TMS9995 CPU @ 10.7 MHz
// No lines connected yet
@@ -763,7 +764,8 @@ MACHINE_CONFIG_START(tutor_state::tutor)
CENTRONICS(config, m_centronics, centronics_devices, "printer").busy_handler().set(FUNC(tutor_state::write_centronics_busy));
- MCFG_CENTRONICS_OUTPUT_LATCH_ADD("cent_data_out", "centronics")
+ OUTPUT_LATCH(config, m_cent_data_out);
+ m_centronics->set_output_latch(*m_cent_data_out);
// Cassette
SPEAKER(config, "cass_out").front_center();
@@ -775,15 +777,15 @@ MACHINE_CONFIG_START(tutor_state::tutor)
// software lists
SOFTWARE_LIST(config, "cart_list").set_type("tutor", SOFTWARE_LIST_ORIGINAL_SYSTEM);
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(tutor_state::pyuutajr)
+void tutor_state::pyuutajr(machine_config &config)
+{
tutor(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(pyuutajr_mem)
- //MCFG_DEVICE_REMOVE("centronics")
- //MCFG_DEVICE_REMOVE("cassette")
-MACHINE_CONFIG_END
+ m_maincpu->set_addrmap(AS_PROGRAM, &tutor_state::pyuutajr_mem);
+ //config.device_remove("centronics");
+ //config.device_remove("cassette");
+}
/*
ROM loading
diff --git a/src/mame/drivers/tv910.cpp b/src/mame/drivers/tv910.cpp
index 0cc5422dca5..fbf245f8e86 100644
--- a/src/mame/drivers/tv910.cpp
+++ b/src/mame/drivers/tv910.cpp
@@ -68,13 +68,13 @@ private:
MC6845_UPDATE_ROW(crtc_update_row);
MC6845_ON_UPDATE_ADDR_CHANGED(crtc_update_addr);
- DECLARE_READ8_MEMBER(charset_r);
- DECLARE_READ8_MEMBER(kbd_ascii_r);
- DECLARE_READ8_MEMBER(kbd_flags_r);
+ uint8_t charset_r();
+ uint8_t kbd_ascii_r();
+ uint8_t kbd_flags_r();
- DECLARE_WRITE8_MEMBER(vbl_ack_w);
- DECLARE_WRITE8_MEMBER(nmi_ack_w);
- DECLARE_WRITE8_MEMBER(control_w);
+ void vbl_ack_w(uint8_t data);
+ void nmi_ack_w(uint8_t data);
+ void control_w(uint8_t data);
DECLARE_WRITE_LINE_MEMBER(vbl_w);
@@ -124,7 +124,7 @@ void tv910_state::tv910_mem(address_map &map)
map(0xf000, 0xffff).rom().region("maincpu", 0);
}
-WRITE8_MEMBER(tv910_state::control_w)
+void tv910_state::control_w(uint8_t data)
{
m_control = data;
#if 0
@@ -140,23 +140,23 @@ WRITE8_MEMBER(tv910_state::control_w)
m_beep->set_state(BIT(data, 0));
}
-READ8_MEMBER(tv910_state::charset_r)
+uint8_t tv910_state::charset_r()
{
return m_charset->read();
}
-WRITE8_MEMBER(tv910_state::nmi_ack_w)
+void tv910_state::nmi_ack_w(uint8_t data)
{
m_maincpu->set_input_line(M6502_NMI_LINE, CLEAR_LINE);
m_strobe = 0;
}
-READ8_MEMBER(tv910_state::kbd_ascii_r)
+uint8_t tv910_state::kbd_ascii_r()
{
return m_transchar;
}
-READ8_MEMBER(tv910_state::kbd_flags_r)
+uint8_t tv910_state::kbd_flags_r()
{
uint8_t rv = 0;
ioport_value kbspecial = m_kbspecial->read();
@@ -444,7 +444,7 @@ void tv910_state::machine_start()
void tv910_state::machine_reset()
{
- control_w(machine().dummy_space(), 0, 0);
+ control_w(0);
}
MC6845_ON_UPDATE_ADDR_CHANGED( tv910_state::crtc_update_addr )
@@ -458,7 +458,7 @@ WRITE_LINE_MEMBER(tv910_state::vbl_w)
m_mainirq->in_w<0>(1);
}
-WRITE8_MEMBER(tv910_state::vbl_ack_w)
+void tv910_state::vbl_ack_w(uint8_t data)
{
m_mainirq->in_w<0>(0);
}
@@ -509,17 +509,17 @@ MC6845_UPDATE_ROW( tv910_state::crtc_update_row )
}
}
-MACHINE_CONFIG_START(tv910_state::tv910)
+void tv910_state::tv910(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M6502, MASTER_CLOCK/8)
- MCFG_DEVICE_PROGRAM_MAP(tv910_mem)
+ M6502(config, m_maincpu, MASTER_CLOCK/8);
+ m_maincpu->set_addrmap(AS_PROGRAM, &tv910_state::tv910_mem);
- MCFG_INPUT_MERGER_ANY_HIGH("mainirq")
- MCFG_INPUT_MERGER_OUTPUT_HANDLER(INPUTLINE("maincpu", M6502_IRQ_LINE))
+ INPUT_MERGER_ANY_HIGH(config, "mainirq").output_handler().set_inputline(m_maincpu, M6502_IRQ_LINE);
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_RAW_PARAMS(MASTER_CLOCK, 840, 0, 640, 270, 0, 240)
- MCFG_SCREEN_UPDATE_DEVICE( CRTC_TAG, r6545_1_device, screen_update )
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_raw(MASTER_CLOCK, 840, 0, 640, 270, 0, 240);
+ screen.set_screen_update(CRTC_TAG, FUNC(r6545_1_device::screen_update));
R6545_1(config, m_crtc, MASTER_CLOCK/8);
m_crtc->set_screen("screen");
@@ -556,9 +556,9 @@ MACHINE_CONFIG_START(tv910_state::tv910)
rs232.cts_handler().set(ACIA_TAG, FUNC(mos6551_device::write_cts));
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("bell", BEEP, MASTER_CLOCK / 8400) // 1620 Hz (Row 10 signal)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.50)
-MACHINE_CONFIG_END
+ BEEP(config, m_beep, MASTER_CLOCK / 8400); // 1620 Hz (Row 10 signal)
+ m_beep->add_route(ALL_OUTPUTS, "mono", 0.50);
+}
/* ROM definition */
ROM_START( tv910 )
diff --git a/src/mame/drivers/tv955.cpp b/src/mame/drivers/tv955.cpp
index 722d0d167ea..dfc6f9f67c7 100644
--- a/src/mame/drivers/tv955.cpp
+++ b/src/mame/drivers/tv955.cpp
@@ -104,7 +104,13 @@ void tv955_state::control_latch_w(u8 data)
WRITE_LINE_MEMBER(tv955_state::system_reset_w)
{
- // TODO
+ m_maincpu->set_input_line(INPUT_LINE_RESET, state ? CLEAR_LINE : ASSERT_LINE);
+ if (!state)
+ {
+ m_keybuart->reset();
+ m_printuart->reset();
+ m_hostuart->reset();
+ }
}
void tv955_state::mem_map(address_map &map)
@@ -213,4 +219,4 @@ ROM_START( tv955 )
ROM_LOAD( "t180002-26b.u45", 0x0000, 0x1000, CRC(69c9ebc7) SHA1(32282c816ec597a7c45e939acb7a4155d35ea584) )
ROM_END
-COMP( 1985, tv955, 0, 0, tv955, tv955, tv955_state, empty_init, "TeleVideo Systems", "TeleVideo 955", MACHINE_IS_SKELETON )
+COMP( 1985, tv955, 0, 0, tv955, tv955, tv955_state, empty_init, "TeleVideo Systems", "TeleVideo 955", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS )
diff --git a/src/mame/drivers/tvc.cpp b/src/mame/drivers/tvc.cpp
index d089d76a57d..87ceb62c42f 100644
--- a/src/mame/drivers/tvc.cpp
+++ b/src/mame/drivers/tvc.cpp
@@ -768,17 +768,17 @@ void tvc_exp(device_slot_interface &device)
MACHINE_CONFIG_START(tvc_state::tvc)
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu",Z80, 3125000)
- MCFG_DEVICE_PROGRAM_MAP(tvc_mem)
- MCFG_DEVICE_IO_MAP(tvc_io)
+ Z80(config, m_maincpu, 3125000);
+ m_maincpu->set_addrmap(AS_PROGRAM, &tvc_state::tvc_mem);
+ m_maincpu->set_addrmap(AS_IO, &tvc_state::tvc_io);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(50)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */
- MCFG_SCREEN_SIZE(512, 240)
- MCFG_SCREEN_VISIBLE_AREA(0, 512 - 1, 0, 240 - 1)
- MCFG_SCREEN_UPDATE_DEVICE("crtc", mc6845_device, screen_update)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(50);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */
+ screen.set_size(512, 240);
+ screen.set_visarea(0, 512 - 1, 0, 240 - 1);
+ screen.set_screen_update("crtc", FUNC(mc6845_device::screen_update));
PALETTE(config, m_palette, FUNC(tvc_state::tvc_palette), 16);
@@ -798,46 +798,42 @@ MACHINE_CONFIG_START(tvc_state::tvc)
m_sound->sndint_wr_callback().set(FUNC(tvc_state::int_ff_set));
m_sound->add_route(ALL_OUTPUTS, "mono", 0.75);
- MCFG_DEVICE_ADD(m_centronics, CENTRONICS, centronics_devices, "printer")
- MCFG_CENTRONICS_ACK_HANDLER(WRITELINE(*this, tvc_state, centronics_ack))
+ CENTRONICS(config, m_centronics, centronics_devices, "printer");
+ m_centronics->ack_handler().set(FUNC(tvc_state::centronics_ack));
- MCFG_CENTRONICS_OUTPUT_LATCH_ADD("cent_data_out", "centronics")
+ output_latch_device &cent_data_out(OUTPUT_LATCH(config, "cent_data_out"));
+ m_centronics->set_output_latch(cent_data_out);
/* cartridge */
- MCFG_GENERIC_CARTSLOT_ADD("cartslot", generic_plain_slot, "tvc_cart")
- MCFG_GENERIC_EXTENSIONS("bin,rom,crt")
+ GENERIC_CARTSLOT(config, m_cart, generic_plain_slot, "tvc_cart", "bin,rom,crt");
/* expansion interface */
- MCFG_DEVICE_ADD("exp1", TVCEXP_SLOT, 0)
- MCFG_DEVICE_SLOT_INTERFACE(tvc_exp , nullptr, false)
- MCFG_TVCEXP_SLOT_OUT_IRQ_CB(INPUTLINE("maincpu", 0))
- MCFG_TVCEXP_SLOT_OUT_NMI_CB(INPUTLINE("maincpu", INPUT_LINE_NMI))
- MCFG_DEVICE_ADD("exp2", TVCEXP_SLOT, 0)
- MCFG_DEVICE_SLOT_INTERFACE(tvc_exp , nullptr, false)
- MCFG_TVCEXP_SLOT_OUT_IRQ_CB(INPUTLINE("maincpu", 0))
- MCFG_TVCEXP_SLOT_OUT_NMI_CB(INPUTLINE("maincpu", INPUT_LINE_NMI))
- MCFG_DEVICE_ADD("exp3", TVCEXP_SLOT, 0)
- MCFG_DEVICE_SLOT_INTERFACE(tvc_exp , nullptr, false)
- MCFG_TVCEXP_SLOT_OUT_IRQ_CB(INPUTLINE("maincpu", 0))
- MCFG_TVCEXP_SLOT_OUT_NMI_CB(INPUTLINE("maincpu", INPUT_LINE_NMI))
- MCFG_DEVICE_ADD("exp4", TVCEXP_SLOT, 0)
- MCFG_DEVICE_SLOT_INTERFACE(tvc_exp , nullptr, false)
- MCFG_TVCEXP_SLOT_OUT_IRQ_CB(INPUTLINE("maincpu", 0))
- MCFG_TVCEXP_SLOT_OUT_NMI_CB(INPUTLINE("maincpu", INPUT_LINE_NMI))
+ TVCEXP_SLOT(config, m_expansions[0], tvc_exp , nullptr);
+ m_expansions[0]->out_irq_callback().set_inputline(m_maincpu, 0);
+ m_expansions[0]->out_nmi_callback().set_inputline(m_maincpu, INPUT_LINE_NMI);
+ TVCEXP_SLOT(config, m_expansions[1], tvc_exp , nullptr);
+ m_expansions[1]->out_irq_callback().set_inputline(m_maincpu, 0);
+ m_expansions[1]->out_nmi_callback().set_inputline(m_maincpu, INPUT_LINE_NMI);
+ TVCEXP_SLOT(config, m_expansions[2], tvc_exp , nullptr);
+ m_expansions[2]->out_irq_callback().set_inputline(m_maincpu, 0);
+ m_expansions[2]->out_nmi_callback().set_inputline(m_maincpu, INPUT_LINE_NMI);
+ TVCEXP_SLOT(config, m_expansions[3], tvc_exp , nullptr);
+ m_expansions[3]->out_irq_callback().set_inputline(m_maincpu, 0);
+ m_expansions[3]->out_nmi_callback().set_inputline(m_maincpu, INPUT_LINE_NMI);
/* cassette */
- MCFG_CASSETTE_ADD( "cassette" )
- MCFG_CASSETTE_FORMATS(tvc64_cassette_formats)
- MCFG_CASSETTE_DEFAULT_STATE(CASSETTE_PLAY | CASSETTE_MOTOR_DISABLED)
- MCFG_CASSETTE_INTERFACE("tvc_cass")
+ CASSETTE(config, m_cassette);
+ m_cassette->set_formats(tvc64_cassette_formats);
+ m_cassette->set_default_state(CASSETTE_PLAY | CASSETTE_MOTOR_DISABLED);
+ m_cassette->set_interface("tvc_cass");
/* quickload */
- MCFG_QUICKLOAD_ADD("quickload", tvc_state, tvc64, "cas", 6)
+ MCFG_QUICKLOAD_ADD("quickload", tvc_state, tvc64, "cas", attotime::from_seconds(6))
/* Software lists */
- MCFG_SOFTWARE_LIST_ADD("cart_list", "tvc_cart")
- MCFG_SOFTWARE_LIST_ADD("cass_list", "tvc_cass")
- MCFG_SOFTWARE_LIST_ADD("flop_list", "tvc_flop")
+ SOFTWARE_LIST(config, "cart_list").set_original("tvc_cart");
+ SOFTWARE_LIST(config, "cass_list").set_original("tvc_cass");
+ SOFTWARE_LIST(config, "flop_list").set_original("tvc_flop");
MACHINE_CONFIG_END
/* ROM definition */
diff --git a/src/mame/drivers/tvcapcom.cpp b/src/mame/drivers/tvcapcom.cpp
index cb66f0074ce..d4254f72348 100644
--- a/src/mame/drivers/tvcapcom.cpp
+++ b/src/mame/drivers/tvcapcom.cpp
@@ -55,26 +55,25 @@ uint32_t tvcapcom_state::screen_update_tvcapcom(screen_device &screen, bitmap_rg
static INPUT_PORTS_START( tvcapcom )
INPUT_PORTS_END
-MACHINE_CONFIG_START(tvcapcom_state::tvcapcom)
-
+void tvcapcom_state::tvcapcom(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", PPC603, 72900000) // IBM PowerPC Broadway CPU @ 729 MHz ?
- MCFG_DEVICE_PROGRAM_MAP(gc_map)
- MCFG_DEVICE_DISABLE()
+ PPC603(config, m_maincpu, 72900000); // IBM PowerPC Broadway CPU @ 729 MHz ?
+ m_maincpu->set_addrmap(AS_PROGRAM, &tvcapcom_state::gc_map);
+ m_maincpu->set_disable();
- MCFG_QUANTUM_TIME(attotime::from_hz(6000))
+ config.m_minimum_quantum = attotime::from_hz(6000);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_SIZE(640, 480)
- MCFG_SCREEN_VISIBLE_AREA(0, 639, 0, 479)
- MCFG_SCREEN_UPDATE_DRIVER(tvcapcom_state, screen_update_tvcapcom)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_size(640, 480);
+ screen.set_visarea(0, 639, 0, 479);
+ screen.set_screen_update(FUNC(tvcapcom_state::screen_update_tvcapcom));
- MCFG_PALETTE_ADD("palette", 65536)
-
-MACHINE_CONFIG_END
+ PALETTE(config, "palette").set_entries(65536);
+}
ROM_START( tvcapcom )
// Bios??
diff --git a/src/mame/drivers/tvgame.cpp b/src/mame/drivers/tvgame.cpp
index 24f911a9a3c..f99e0445b00 100644
--- a/src/mame/drivers/tvgame.cpp
+++ b/src/mame/drivers/tvgame.cpp
@@ -101,32 +101,32 @@ uint32_t tvgame_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap
return 0;
}
-MACHINE_CONFIG_START(tvgame_state::tvgame)
+void tvgame_state::tvgame(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, XTAL(4'000'000))
- MCFG_DEVICE_PROGRAM_MAP(mem_map)
- MCFG_DEVICE_IO_MAP(io_map)
+ Z80(config, m_maincpu, XTAL(4'000'000));
+ m_maincpu->set_addrmap(AS_PROGRAM, &tvgame_state::mem_map);
+ m_maincpu->set_addrmap(AS_IO, &tvgame_state::io_map);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(50)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */
- MCFG_SCREEN_UPDATE_DRIVER(tvgame_state, screen_update)
- MCFG_SCREEN_SIZE(216, 213)
- MCFG_SCREEN_VISIBLE_AREA(0, 215, 0, 212)
- MCFG_SCREEN_PALETTE("palette")
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(50);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */
+ screen.set_screen_update(FUNC(tvgame_state::screen_update));
+ screen.set_size(216, 213);
+ screen.set_visarea(0, 215, 0, 212);
+ screen.set_palette("palette");
PALETTE(config, "palette", palette_device::MONOCHROME);
/* sound hardware */
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("speaker", SPEAKER_SOUND)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.50)
+ SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.50);
// Devices
i8255_device &ppi(I8255(config, "ppi"));
ppi.in_pa_callback().set_ioport("LINE0");
ppi.out_pc_callback().set(FUNC(tvgame_state::speaker_w));
-MACHINE_CONFIG_END
+}
/* ROM definition */
ROM_START( tvgame )
diff --git a/src/mame/drivers/twincobr.cpp b/src/mame/drivers/twincobr.cpp
index 4b4aba58248..13260ae4e60 100644
--- a/src/mame/drivers/twincobr.cpp
+++ b/src/mame/drivers/twincobr.cpp
@@ -413,7 +413,7 @@ void twincobr_state::main_program_map(address_map &map)
map(0x078008, 0x078009).portr("VBLANK"); /* V-Blank & FShark Coin/Start */
map(0x07800b, 0x07800b).w(m_coinlatch, FUNC(ls259_device::write_nibble_d0)); /* Flying Shark DSP Comms & coin stuff */
map(0x07800d, 0x07800d).w(m_mainlatch, FUNC(ls259_device::write_nibble_d0)); /* Twin Cobra DSP Comms & system control */
- map(0x07a000, 0x07afff).rw(FUNC(twincobr_state::twincobr_sharedram_r), FUNC(twincobr_state::twincobr_sharedram_w)); /* 16-bit on 68000 side, 8-bit on Z80 side */
+ map(0x07a000, 0x07afff).rw(FUNC(twincobr_state::twincobr_sharedram_r), FUNC(twincobr_state::twincobr_sharedram_w)).umask16(0x00ff); /* 16-bit on 68000 side, 8-bit on Z80 side */
map(0x07e000, 0x07e001).rw(FUNC(twincobr_state::twincobr_txram_r), FUNC(twincobr_state::twincobr_txram_w)); /* data for text video RAM */
map(0x07e002, 0x07e003).rw(FUNC(twincobr_state::twincobr_bgram_r), FUNC(twincobr_state::twincobr_bgram_w)); /* data for bg video RAM */
map(0x07e004, 0x07e005).rw(FUNC(twincobr_state::twincobr_fgram_r), FUNC(twincobr_state::twincobr_fgram_w)); /* data for fg video RAM */
@@ -626,8 +626,8 @@ static const gfx_layout charlayout =
RGN_FRAC(1,3), /* 2048 characters */
3, /* 3 bits per pixel */
{ RGN_FRAC(0,3), RGN_FRAC(1,3), RGN_FRAC(2,3) },
- { 0, 1, 2, 3, 4, 5, 6, 7 },
- { 0*8, 1*8, 2*8, 3*8, 4*8, 5*8, 6*8, 7*8 },
+ { STEP8(0,1) },
+ { STEP8(0,8) },
8*8 /* every char takes 8 consecutive bytes */
};
@@ -637,8 +637,8 @@ static const gfx_layout tilelayout =
RGN_FRAC(1,4), /* 4096/8192 tiles */
4, /* 4 bits per pixel */
{ RGN_FRAC(0,4), RGN_FRAC(1,4), RGN_FRAC(2,4), RGN_FRAC(3,4) },
- { 0, 1, 2, 3, 4, 5, 6, 7 },
- { 0*8, 1*8, 2*8, 3*8, 4*8, 5*8, 6*8, 7*8 },
+ { STEP8(0,1) },
+ { STEP8(0,8) },
8*8 /* every tile takes 8 consecutive bytes */
};
@@ -652,10 +652,10 @@ GFXDECODE_END
void twincobr_state::twincobr(machine_config &config)
{
/* basic machine hardware */
- M68000(config, m_maincpu, XTAL(28'000'000) / 4); /* 7MHz - Main board Crystal is 28MHz */
+ M68000(config, m_maincpu, XTAL(28'000'000) / 4); /* 7MHz - Main board Crystal is 28MHz */
m_maincpu->set_addrmap(AS_PROGRAM, &twincobr_state::main_program_map);
- z80_device &audiocpu(Z80(config, "audiocpu", XTAL(28'000'000)/8)); /* 3.5MHz */
+ z80_device &audiocpu(Z80(config, "audiocpu", XTAL(28'000'000)/8)); /* 3.5MHz */
audiocpu.set_addrmap(AS_PROGRAM, &twincobr_state::sound_program_map);
audiocpu.set_addrmap(AS_IO, &twincobr_state::sound_io_map);
@@ -667,8 +667,6 @@ void twincobr_state::twincobr(machine_config &config)
config.m_minimum_quantum = attotime::from_hz(6000);
- MCFG_MACHINE_RESET_OVERRIDE(twincobr_state,twincobr)
-
LS259(config, m_mainlatch);
m_mainlatch->q_out_cb<2>().set(FUNC(twincobr_state::int_enable_w));
m_mainlatch->q_out_cb<3>().set(FUNC(twincobr_state::flipscreen_w));
@@ -698,7 +696,7 @@ void twincobr_state::twincobr(machine_config &config)
SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
m_screen->set_video_attributes(VIDEO_UPDATE_BEFORE_VBLANK);
m_screen->set_raw(28_MHz_XTAL/4, 446, 0, 320, 286, 0, 240);
- m_screen->set_screen_update(FUNC(twincobr_state::screen_update_toaplan0));
+ m_screen->set_screen_update(FUNC(twincobr_state::screen_update));
m_screen->screen_vblank().set(m_spriteram16, FUNC(buffered_spriteram16_device::vblank_copy_rising));
m_screen->screen_vblank().append(FUNC(twincobr_state::twincobr_vblank_irq));
m_screen->set_palette(m_palette);
@@ -1296,7 +1294,7 @@ ROM_END
void twincobr_state::init_twincobr()
{
- twincobr_driver_savestate();
+ driver_savestate();
}
diff --git a/src/mame/drivers/twins.cpp b/src/mame/drivers/twins.cpp
index f20681103de..f4c148b2ac4 100644
--- a/src/mame/drivers/twins.cpp
+++ b/src/mame/drivers/twins.cpp
@@ -418,22 +418,23 @@ static INPUT_PORTS_START(twins)
INPUT_PORTS_END
-MACHINE_CONFIG_START(twins_state::twinsed1)
+void twins_state::twinsed1(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", V30, 8000000)
- MCFG_DEVICE_PROGRAM_MAP(twins_map)
- MCFG_DEVICE_IO_MAP(twinsed1_io)
+ V30(config, m_maincpu, 8000000);
+ m_maincpu->set_addrmap(AS_PROGRAM, &twins_state::twins_map);
+ m_maincpu->set_addrmap(AS_IO, &twins_state::twinsed1_io);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_RAW_PARAMS(8000000, 512, 0, 320, 312, 0, 200) // 15.625 kHz horizontal???
- MCFG_SCREEN_UPDATE_DRIVER(twins_state, screen_update_twins)
- MCFG_SCREEN_PALETTE("palette")
- MCFG_SCREEN_VBLANK_CALLBACK(INPUTLINE("maincpu", INPUT_LINE_NMI))
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_raw(8000000, 512, 0, 320, 312, 0, 200); // 15.625 kHz horizontal???
+ screen.set_screen_update(FUNC(twins_state::screen_update_twins));
+ screen.set_palette(m_palette);
+ screen.screen_vblank().set_inputline(m_maincpu, INPUT_LINE_NMI);
- MCFG_24C02_ADD("i2cmem")
+ I2C_24C02(config, m_i2cmem);
- MCFG_PALETTE_ADD("palette", 0x100)
+ PALETTE(config, m_palette).set_entries(0x100);
/* sound hardware */
SPEAKER(config, "mono").front_center();
@@ -442,7 +443,7 @@ MACHINE_CONFIG_START(twins_state::twinsed1)
aysnd.port_a_read_callback().set_ioport("P1");
aysnd.port_b_read_callback().set_ioport("P2");
aysnd.add_route(ALL_OUTPUTS, "mono", 1.0);
-MACHINE_CONFIG_END
+}
/* The Ecogames set and the Electronic Devices second set has different palette hardware
@@ -465,25 +466,26 @@ void twins_state::ramdac_map(address_map &map)
}
-MACHINE_CONFIG_START(twins_state::twins)
+void twins_state::twins(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", V30, XTAL(16'000'000)/2) /* verified on pcb */
- MCFG_DEVICE_PROGRAM_MAP(twins_map)
- MCFG_DEVICE_IO_MAP(twins_io)
+ V30(config, m_maincpu, XTAL(16'000'000)/2); /* verified on pcb */
+ m_maincpu->set_addrmap(AS_PROGRAM, &twins_state::twins_map);
+ m_maincpu->set_addrmap(AS_IO, &twins_state::twins_io);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_RAW_PARAMS(8000000, 512, 0, 320, 312, 0, 200) // 15.625 kHz horizontal???
- MCFG_SCREEN_UPDATE_DRIVER(twins_state, screen_update_twins)
- MCFG_SCREEN_PALETTE("palette")
- MCFG_SCREEN_VBLANK_CALLBACK(INPUTLINE("maincpu", INPUT_LINE_NMI))
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_raw(8000000, 512, 0, 320, 312, 0, 200); // 15.625 kHz horizontal???
+ screen.set_screen_update(FUNC(twins_state::screen_update_twins));
+ screen.set_palette(m_palette);
+ screen.screen_vblank().set_inputline(m_maincpu, INPUT_LINE_NMI);
- MCFG_PALETTE_ADD("palette", 256)
+ PALETTE(config, m_palette).set_entries(256);
ramdac_device &ramdac(RAMDAC(config, "ramdac", 0, m_palette));
ramdac.set_addrmap(0, &twins_state::ramdac_map);
ramdac.set_split_read(0);
- MCFG_24C02_ADD("i2cmem")
+ I2C_24C02(config, m_i2cmem);
/* sound hardware */
SPEAKER(config, "mono").front_center();
@@ -492,7 +494,7 @@ MACHINE_CONFIG_START(twins_state::twins)
aysnd.port_a_read_callback().set_ioport("P1");
aysnd.port_b_read_callback().set_ioport("P2");
aysnd.add_route(ALL_OUTPUTS, "mono", 1.0);
-MACHINE_CONFIG_END
+}
WRITE16_MEMBER(twins_state::spider_pal_w)
{
@@ -590,22 +592,23 @@ void twins_state::spider_io(address_map &map)
}
-MACHINE_CONFIG_START(twins_state::spider)
+void twins_state::spider(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", V30, 8000000)
- MCFG_DEVICE_PROGRAM_MAP(twins_map)
- MCFG_DEVICE_IO_MAP(spider_io)
+ V30(config, m_maincpu, 8000000);
+ m_maincpu->set_addrmap(AS_PROGRAM, &twins_state::twins_map);
+ m_maincpu->set_addrmap(AS_IO, &twins_state::spider_io);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_RAW_PARAMS(8000000, 512, 0, 320, 312, 0, 200) // 15.625 kHz horizontal???
- MCFG_SCREEN_UPDATE_DRIVER(twins_state, screen_update_spider)
- MCFG_SCREEN_PALETTE("palette")
- MCFG_SCREEN_VBLANK_CALLBACK(INPUTLINE("maincpu", INPUT_LINE_NMI))
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_raw(8000000, 512, 0, 320, 312, 0, 200); // 15.625 kHz horizontal???
+ screen.set_screen_update(FUNC(twins_state::screen_update_spider));
+ screen.set_palette(m_palette);
+ screen.screen_vblank().set_inputline(m_maincpu, INPUT_LINE_NMI);
- MCFG_PALETTE_ADD("palette", 0x100)
+ PALETTE(config, m_palette).set_entries(0x100);
- MCFG_24C02_ADD("i2cmem")
+ I2C_24C02(config, m_i2cmem);
/* sound hardware */
SPEAKER(config, "mono").front_center();
@@ -614,7 +617,7 @@ MACHINE_CONFIG_START(twins_state::spider)
aysnd.port_a_read_callback().set_ioport("P1");
aysnd.port_b_read_callback().set_ioport("P2");
aysnd.add_route(ALL_OUTPUTS, "mono", 1.0);
-MACHINE_CONFIG_END
+}
/* ECOGAMES Twins */
diff --git a/src/mame/drivers/tx0.cpp b/src/mame/drivers/tx0.cpp
index 0a905600d53..8cd353f7202 100644
--- a/src/mame/drivers/tx0.cpp
+++ b/src/mame/drivers/tx0.cpp
@@ -1537,7 +1537,8 @@ INTERRUPT_GEN_MEMBER(tx0_state::tx0_interrupt)
}
}
-MACHINE_CONFIG_START(tx0_state::tx0_64kw)
+void tx0_state::tx0_64kw(machine_config &config)
+{
/* basic machine hardware */
/* TX0 CPU @ approx. 167 kHz (no master clock, but the memory cycle time is approximately 6usec) */
TX0_64KW(config, m_maincpu, 166667);
@@ -1556,14 +1557,14 @@ MACHINE_CONFIG_START(tx0_state::tx0_64kw)
m_maincpu->set_vblank_int("screen", FUNC(tx0_state::tx0_interrupt));
/* video hardware (includes the control panel and typewriter output) */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(refresh_rate)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */
- MCFG_SCREEN_SIZE(virtual_width, virtual_height)
- MCFG_SCREEN_VISIBLE_AREA(0, virtual_width-1, 0, virtual_height-1)
- MCFG_SCREEN_UPDATE_DRIVER(tx0_state, screen_update_tx0)
- MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE(*this, tx0_state, screen_vblank_tx0))
- MCFG_SCREEN_PALETTE(m_palette)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(refresh_rate);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */
+ screen.set_size(virtual_width, virtual_height);
+ screen.set_visarea(0, virtual_width-1, 0, virtual_height-1);
+ screen.set_screen_update(FUNC(tx0_state::screen_update_tx0));
+ screen.screen_vblank().set(FUNC(tx0_state::screen_vblank_tx0));
+ screen.set_palette(m_palette);
CRT(config, m_crt, 0);
m_crt->set_num_levels(pen_crt_num_levels);
@@ -1577,18 +1578,17 @@ MACHINE_CONFIG_START(tx0_state::tx0_64kw)
GFXDECODE(config, m_gfxdecode, m_palette, gfx_tx0);
PALETTE(config, m_palette, FUNC(tx0_state::tx0_palette), total_colors_needed + sizeof(tx0_pens), total_colors_needed);
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(tx0_state::tx0_8kw)
+void tx0_state::tx0_8kw(machine_config &config)
+{
tx0_64kw(config);
/* basic machine hardware */
/* TX0 CPU @ approx. 167 kHz (no master clock, but the memory cycle time is
approximately 6usec) */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(tx0_8kw_map)
- /*MCFG_CPU_PORTS(readport, writeport)*/
-MACHINE_CONFIG_END
+ m_maincpu->set_addrmap(AS_PROGRAM, &tx0_state::tx0_8kw_map);
+}
ROM_START(tx0_64kw)
/*CPU memory space*/
diff --git a/src/mame/drivers/tx1.cpp b/src/mame/drivers/tx1.cpp
index a9fde4d80b8..6bbba6c424c 100644
--- a/src/mame/drivers/tx1.cpp
+++ b/src/mame/drivers/tx1.cpp
@@ -167,15 +167,15 @@ void tx1_state::buggyboy_math(address_map &map)
*
*************************************/
-MACHINE_CONFIG_START(tx1_state::tx1)
- MCFG_DEVICE_ADD("main_cpu", I8086, CPU_MASTER_CLOCK / 3)
- MCFG_DEVICE_PROGRAM_MAP(tx1_main)
+void tx1_state::tx1(machine_config &config)
+{
+ I8086(config, m_maincpu, CPU_MASTER_CLOCK / 3);
+ m_maincpu->set_addrmap(AS_PROGRAM, &tx1_state::tx1_main);
- WATCHDOG_TIMER(config, "watchdog");
-// MCFG_WATCHDOG_TIME_INIT(5)
+ WATCHDOG_TIMER(config, "watchdog");//.set_time(5);
- MCFG_DEVICE_ADD("math_cpu", I8086, CPU_MASTER_CLOCK / 3)
- MCFG_DEVICE_PROGRAM_MAP(tx1_math)
+ I8086(config, m_mathcpu, CPU_MASTER_CLOCK / 3);
+ m_mathcpu->set_addrmap(AS_PROGRAM, &tx1_state::tx1_math);
MCFG_MACHINE_RESET_OVERRIDE(tx1_state,tx1)
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
@@ -184,97 +184,96 @@ MACHINE_CONFIG_START(tx1_state::tx1)
config.set_default_layout(layout_triphsxs);
- MCFG_SCREEN_ADD("lscreen", RASTER)
- MCFG_SCREEN_RAW_PARAMS(TX1_PIXEL_CLOCK, TX1_HTOTAL, TX1_HBEND, TX1_HBSTART, TX1_VTOTAL, TX1_VBEND, TX1_VBSTART)
- MCFG_SCREEN_UPDATE_DRIVER(tx1_state, screen_update_tx1_left)
- MCFG_SCREEN_PALETTE("palette")
+ screen_device &lscreen(SCREEN(config, "lscreen", SCREEN_TYPE_RASTER));
+ lscreen.set_raw(TX1_PIXEL_CLOCK, TX1_HTOTAL, TX1_HBEND, TX1_HBSTART, TX1_VTOTAL, TX1_VBEND, TX1_VBSTART);
+ lscreen.set_screen_update(FUNC(tx1_state::screen_update_tx1_left));
+ lscreen.set_palette("palette");
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_RAW_PARAMS(TX1_PIXEL_CLOCK, TX1_HTOTAL, TX1_HBEND, TX1_HBSTART, TX1_VTOTAL, TX1_VBEND, TX1_VBSTART)
- MCFG_SCREEN_UPDATE_DRIVER(tx1_state, screen_update_tx1_middle)
- MCFG_SCREEN_PALETTE("palette")
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_raw(TX1_PIXEL_CLOCK, TX1_HTOTAL, TX1_HBEND, TX1_HBSTART, TX1_VTOTAL, TX1_VBEND, TX1_VBSTART);
+ m_screen->set_screen_update(FUNC(tx1_state::screen_update_tx1_middle));
+ m_screen->set_palette("palette");
- MCFG_SCREEN_ADD("rscreen", RASTER)
- MCFG_SCREEN_RAW_PARAMS(TX1_PIXEL_CLOCK, TX1_HTOTAL, TX1_HBEND, TX1_HBSTART, TX1_VTOTAL, TX1_VBEND, TX1_VBSTART)
- MCFG_SCREEN_UPDATE_DRIVER(tx1_state, screen_update_tx1_right)
- MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE(*this, tx1_state, screen_vblank_tx1))
- MCFG_SCREEN_PALETTE("palette")
+ screen_device &rscreen(SCREEN(config, "rscreen", SCREEN_TYPE_RASTER));
+ rscreen.set_raw(TX1_PIXEL_CLOCK, TX1_HTOTAL, TX1_HBEND, TX1_HBSTART, TX1_VTOTAL, TX1_VBEND, TX1_VBSTART);
+ rscreen.set_screen_update(FUNC(tx1_state::screen_update_tx1_right));
+ rscreen.screen_vblank().set(FUNC(tx1_state::screen_vblank_tx1));
+ rscreen.set_palette("palette");
MCFG_VIDEO_START_OVERRIDE(tx1_state,tx1)
- MCFG_DEVICE_ADD("soundbrd", TX1_SOUND, TX1_PIXEL_CLOCK)
-MACHINE_CONFIG_END
+ TX1_SOUND(config, m_sound, TX1_PIXEL_CLOCK);
+}
-MACHINE_CONFIG_START(tx1_state::tx1j)
+void tx1_state::tx1j(machine_config &config)
+{
tx1(config);
- MCFG_DEVICE_REMOVE("soundbrd")
-
- MCFG_DEVICE_ADD("soundbrd", TX1J_SOUND, TX1_PIXEL_CLOCK)
-MACHINE_CONFIG_END
+ TX1J_SOUND(config.replace(), m_sound, TX1_PIXEL_CLOCK);
+}
-MACHINE_CONFIG_START(tx1_state::buggyboy)
- MCFG_DEVICE_ADD("main_cpu", I8086, CPU_MASTER_CLOCK / 3)
- MCFG_DEVICE_PROGRAM_MAP(buggyboy_main)
+void tx1_state::buggyboy(machine_config &config)
+{
+ I8086(config, m_maincpu, CPU_MASTER_CLOCK / 3);
+ m_maincpu->set_addrmap(AS_PROGRAM, &tx1_state::buggyboy_main);
- WATCHDOG_TIMER(config, "watchdog");
-// MCFG_WATCHDOG_TIME_INIT(5)
+ WATCHDOG_TIMER(config, "watchdog");//.set_time(5);
- MCFG_DEVICE_ADD("math_cpu", I8086, CPU_MASTER_CLOCK / 3)
- MCFG_DEVICE_PROGRAM_MAP(buggyboy_math)
+ I8086(config, m_mathcpu, CPU_MASTER_CLOCK / 3);
+ m_mathcpu->set_addrmap(AS_PROGRAM, &tx1_state::buggyboy_math);
MCFG_MACHINE_RESET_OVERRIDE(tx1_state,buggyboy)
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
config.set_default_layout(layout_triphsxs);
- MCFG_SCREEN_ADD("lscreen", RASTER)
- MCFG_SCREEN_RAW_PARAMS(BB_PIXEL_CLOCK, BB_HTOTAL, BB_HBEND, BB_HBSTART, BB_VTOTAL, BB_VBEND, BB_VBSTART)
- MCFG_SCREEN_UPDATE_DRIVER(tx1_state, screen_update_buggyboy_left)
- MCFG_SCREEN_PALETTE("palette")
+ screen_device &lscreen(SCREEN(config, "lscreen", SCREEN_TYPE_RASTER));
+ lscreen.set_raw(BB_PIXEL_CLOCK, BB_HTOTAL, BB_HBEND, BB_HBSTART, BB_VTOTAL, BB_VBEND, BB_VBSTART);
+ lscreen.set_screen_update(FUNC(tx1_state::screen_update_buggyboy_left));
+ lscreen.set_palette("palette");
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_RAW_PARAMS(BB_PIXEL_CLOCK, BB_HTOTAL, BB_HBEND, BB_HBSTART, BB_VTOTAL, BB_VBEND, BB_VBSTART)
- MCFG_SCREEN_UPDATE_DRIVER(tx1_state, screen_update_buggyboy_middle)
- MCFG_SCREEN_PALETTE("palette")
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_raw(BB_PIXEL_CLOCK, BB_HTOTAL, BB_HBEND, BB_HBSTART, BB_VTOTAL, BB_VBEND, BB_VBSTART);
+ m_screen->set_screen_update(FUNC(tx1_state::screen_update_buggyboy_middle));
+ m_screen->set_palette("palette");
- MCFG_SCREEN_ADD("rscreen", RASTER)
- MCFG_SCREEN_RAW_PARAMS(BB_PIXEL_CLOCK, BB_HTOTAL, BB_HBEND, BB_HBSTART, BB_VTOTAL, BB_VBEND, BB_VBSTART)
- MCFG_SCREEN_UPDATE_DRIVER(tx1_state, screen_update_buggyboy_right)
- MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE(*this, tx1_state, screen_vblank_buggyboy))
- MCFG_SCREEN_PALETTE("palette")
+ screen_device &rscreen(SCREEN(config, "rscreen", SCREEN_TYPE_RASTER));
+ rscreen.set_raw(BB_PIXEL_CLOCK, BB_HTOTAL, BB_HBEND, BB_HBSTART, BB_VTOTAL, BB_VBEND, BB_VBSTART);
+ rscreen.set_screen_update(FUNC(tx1_state::screen_update_buggyboy_right));
+ rscreen.screen_vblank().set(FUNC(tx1_state::screen_vblank_buggyboy));
+ rscreen.set_palette("palette");
PALETTE(config, "palette", FUNC(tx1_state::buggyboy_palette), 256);
MCFG_VIDEO_START_OVERRIDE(tx1_state,buggyboy)
- MCFG_DEVICE_ADD("soundbrd", BUGGYBOY_SOUND, BUGGYBOY_ZCLK)
-MACHINE_CONFIG_END
+ BUGGYBOY_SOUND(config, m_sound, BUGGYBOY_ZCLK);
+}
-MACHINE_CONFIG_START(tx1_state::buggybjr)
- MCFG_DEVICE_ADD("main_cpu", I8086, CPU_MASTER_CLOCK / 3)
- MCFG_DEVICE_PROGRAM_MAP(buggybjr_main)
+void tx1_state::buggybjr(machine_config &config)
+{
+ I8086(config, m_maincpu, CPU_MASTER_CLOCK / 3);
+ m_maincpu->set_addrmap(AS_PROGRAM, &tx1_state::buggybjr_main);
- WATCHDOG_TIMER(config, "watchdog");
-// MCFG_WATCHDOG_TIME_INIT(5)
+ WATCHDOG_TIMER(config, "watchdog");//.set_time(5);
- MCFG_DEVICE_ADD("math_cpu", I8086, CPU_MASTER_CLOCK / 3)
- MCFG_DEVICE_PROGRAM_MAP(buggyboy_math)
+ I8086(config, m_mathcpu, CPU_MASTER_CLOCK / 3);
+ m_mathcpu->set_addrmap(AS_PROGRAM, &tx1_state::buggyboy_math);
MCFG_MACHINE_RESET_OVERRIDE(tx1_state,buggyboy)
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_RAW_PARAMS(BB_PIXEL_CLOCK, BB_HTOTAL, BB_HBEND, BB_HBSTART, BB_VTOTAL, BB_VBEND, BB_VBSTART)
- MCFG_SCREEN_UPDATE_DRIVER(tx1_state, screen_update_buggybjr)
- MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE(*this, tx1_state, screen_vblank_buggyboy))
- MCFG_SCREEN_PALETTE("palette")
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_raw(BB_PIXEL_CLOCK, BB_HTOTAL, BB_HBEND, BB_HBSTART, BB_VTOTAL, BB_VBEND, BB_VBSTART);
+ m_screen->set_screen_update(FUNC(tx1_state::screen_update_buggybjr));
+ m_screen->screen_vblank().set(FUNC(tx1_state::screen_vblank_buggyboy));
+ m_screen->set_palette("palette");
PALETTE(config, "palette", FUNC(tx1_state::buggyboy_palette), 256);
MCFG_VIDEO_START_OVERRIDE(tx1_state,buggybjr)
- MCFG_DEVICE_ADD("soundbrd", BUGGYBOYJR_SOUND, BUGGYBOY_ZCLK)
-MACHINE_CONFIG_END
+ BUGGYBOYJR_SOUND(config, m_sound, BUGGYBOY_ZCLK);
+}
/*************************************
diff --git a/src/mame/drivers/uapce.cpp b/src/mame/drivers/uapce.cpp
index dc732bf6709..7c400fd56d2 100644
--- a/src/mame/drivers/uapce.cpp
+++ b/src/mame/drivers/uapce.cpp
@@ -33,6 +33,24 @@
-x1 Victory Run standardd Hucard
-x1 Plexiglass control panel overlay (used)
+In the August 1989 issue of Vending Times magazine:
+https://archive.org/details/VendingTimesVOL29NO10August1989Clearscan/page/n69
+https://archive.org/details/VendingTimesVOL29NO10August1989Clearscan/page/n99
+there was a list of all of the available UA produced HU-Cards about to be released.
+- Legendary Axe
+- Victory Run
+- Keith Courage in the Alpha Zones
+- World Class Baseball
+- Power Golf
+- Blazing Lazers
+- Dungeon Explorer
+- Alien Crush
+- China Warrior
+- Military Madness
+- JJ and Jeff
+and said that six to ten more new game cards would be available by the end of the year.
+It also shows game marquees for Victory Run and Power League.
+
In the February 1990 issue of Video Games & Computer Entertainment magazine, there was a list of
all of the available UA produced Hu-Cards (at the current time of the article was published).
The article mentions that the UA Hu-Cards were not compatible with the TG-16 gaming console.
@@ -303,7 +321,8 @@ void uapce_state::pce_io(address_map &map)
}
-MACHINE_CONFIG_START(uapce_state::uapce)
+void uapce_state::uapce(machine_config &config)
+{
/* basic machine hardware */
H6280(config, m_maincpu, PCE_MAIN_CLOCK/3);
m_maincpu->set_addrmap(AS_PROGRAM, &uapce_state::pce_mem);
@@ -313,32 +332,32 @@ MACHINE_CONFIG_START(uapce_state::uapce)
m_maincpu->add_route(0, "lspeaker", 0.5);
m_maincpu->add_route(1, "rspeaker", 0.5);
- MCFG_DEVICE_ADD("sub", Z80, 1400000)
- MCFG_DEVICE_PROGRAM_MAP(z80_map)
+ z80_device &sub(Z80(config, "sub", 1400000));
+ sub.set_addrmap(AS_PROGRAM, &uapce_state::z80_map);
- MCFG_QUANTUM_TIME(attotime::from_hz(60))
+ config.m_minimum_quantum = attotime::from_hz(60);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_RAW_PARAMS(PCE_MAIN_CLOCK, huc6260_device::WPF, 64, 64 + 1024 + 64, huc6260_device::LPF, 18, 18 + 242)
- MCFG_SCREEN_UPDATE_DRIVER( pce_common_state, screen_update )
- MCFG_SCREEN_PALETTE("huc6260")
-
- MCFG_DEVICE_ADD( "huc6260", HUC6260, PCE_MAIN_CLOCK )
- MCFG_HUC6260_NEXT_PIXEL_DATA_CB(READ16("huc6270", huc6270_device, next_pixel))
- MCFG_HUC6260_TIME_TIL_NEXT_EVENT_CB(READ16("huc6270", huc6270_device, time_until_next_event))
- MCFG_HUC6260_VSYNC_CHANGED_CB(WRITELINE("huc6270", huc6270_device, vsync_changed))
- MCFG_HUC6260_HSYNC_CHANGED_CB(WRITELINE("huc6270", huc6270_device, hsync_changed))
- MCFG_DEVICE_ADD( "huc6270", HUC6270, 0 )
- MCFG_HUC6270_VRAM_SIZE(0x10000)
- MCFG_HUC6270_IRQ_CHANGED_CB(INPUTLINE("maincpu", 0))
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_raw(PCE_MAIN_CLOCK, huc6260_device::WPF, 64, 64 + 1024 + 64, huc6260_device::LPF, 18, 18 + 242);
+ screen.set_screen_update(FUNC(pce_common_state::screen_update));
+ screen.set_palette("huc6260");
+
+ HUC6260(config, m_huc6260, PCE_MAIN_CLOCK);
+ m_huc6260->next_pixel_data().set("huc6270", FUNC(huc6270_device::next_pixel));
+ m_huc6260->time_til_next_event().set("huc6270", FUNC(huc6270_device::time_until_next_event));
+ m_huc6260->vsync_changed().set("huc6270", FUNC(huc6270_device::vsync_changed));
+ m_huc6260->hsync_changed().set("huc6270", FUNC(huc6270_device::hsync_changed));
+
+ huc6270_device &huc6270(HUC6270(config, "huc6270", 0));
+ huc6270.set_vram_size(0x10000);
+ huc6270.irq().set_inputline(m_maincpu, 0);
SPEAKER(config, "lspeaker").front_left();
SPEAKER(config, "rspeaker").front_right();
- MCFG_DEVICE_ADD("discrete", DISCRETE, uapce_discrete)
- MCFG_SOUND_ROUTE(0, "rspeaker", 1.00)
-MACHINE_CONFIG_END
+ DISCRETE(config, m_discrete, uapce_discrete).add_route(0, "rspeaker", 1.00);
+}
ROM_START(blazlaz)
ROM_REGION( 0x0a0000, "maincpu", 0 )
diff --git a/src/mame/drivers/ultraman.cpp b/src/mame/drivers/ultraman.cpp
index 3f6dce57925..a459ca3d2ea 100644
--- a/src/mame/drivers/ultraman.cpp
+++ b/src/mame/drivers/ultraman.cpp
@@ -173,32 +173,31 @@ void ultraman_state::machine_reset()
m_soundnmi->in_w<0>(0);
}
-MACHINE_CONFIG_START(ultraman_state::ultraman)
-
+void ultraman_state::ultraman(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M68000,24000000/2) /* 12 MHz? */
- MCFG_DEVICE_PROGRAM_MAP(main_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", ultraman_state, irq4_line_hold)
+ M68000(config, m_maincpu, 24000000/2); /* 12 MHz? */
+ m_maincpu->set_addrmap(AS_PROGRAM, &ultraman_state::main_map);
+ m_maincpu->set_vblank_int("screen", FUNC(ultraman_state::irq4_line_hold));
- MCFG_DEVICE_ADD("audiocpu", Z80,24000000/6) /* 4 MHz? */
- MCFG_DEVICE_PROGRAM_MAP(sound_map)
- MCFG_DEVICE_IO_MAP(sound_io_map)
+ Z80(config, m_audiocpu, 24000000/6); /* 4 MHz? */
+ m_audiocpu->set_addrmap(AS_PROGRAM, &ultraman_state::sound_map);
+ m_audiocpu->set_addrmap(AS_IO, &ultraman_state::sound_io_map);
- MCFG_INPUT_MERGER_ALL_HIGH("soundnmi")
- MCFG_INPUT_MERGER_OUTPUT_HANDLER(INPUTLINE("audiocpu", INPUT_LINE_NMI))
+ INPUT_MERGER_ALL_HIGH(config, "soundnmi").output_handler().set_inputline(m_audiocpu, INPUT_LINE_NMI);
- MCFG_QUANTUM_TIME(attotime::from_hz(600))
+ config.m_minimum_quantum = attotime::from_hz(600);
WATCHDOG_TIMER(config, "watchdog");
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */)
- MCFG_SCREEN_SIZE(64*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(14*8, (64-14)*8-1, 2*8, 30*8-1 )
- MCFG_SCREEN_UPDATE_DRIVER(ultraman_state, screen_update_ultraman)
- MCFG_SCREEN_PALETTE("palette")
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500) /* not accurate */);
+ screen.set_size(64*8, 32*8);
+ screen.set_visarea(14*8, (64-14)*8-1, 2*8, 30*8-1 );
+ screen.set_screen_update(FUNC(ultraman_state::screen_update_ultraman));
+ screen.set_palette("palette");
auto &palette(PALETTE(config, "palette"));
palette.set_format(palette_device::xRGB_555, 8192);
@@ -232,10 +231,10 @@ MACHINE_CONFIG_START(ultraman_state::ultraman)
YM2151(config, "ymsnd", 24000000/6).add_route(0, "lspeaker", 1.0).add_route(1, "rspeaker", 1.0);
- MCFG_DEVICE_ADD("oki", OKIM6295, 1056000, okim6295_device::PIN7_HIGH) // clock frequency & pin 7 not verified
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 0.50)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 0.50)
-MACHINE_CONFIG_END
+ okim6295_device &oki(OKIM6295(config, "oki", 1056000, okim6295_device::PIN7_HIGH)); // clock frequency & pin 7 not verified
+ oki.add_route(ALL_OUTPUTS, "lspeaker", 0.50);
+ oki.add_route(ALL_OUTPUTS, "rspeaker", 0.50);
+}
diff --git a/src/mame/drivers/ultratnk.cpp b/src/mame/drivers/ultratnk.cpp
index e3a6499bf28..6c5d28b1798 100644
--- a/src/mame/drivers/ultratnk.cpp
+++ b/src/mame/drivers/ultratnk.cpp
@@ -290,38 +290,36 @@ static GFXDECODE_START( gfx_ultratnk )
GFXDECODE_END
-MACHINE_CONFIG_START(ultratnk_state::ultratnk)
-
+void ultratnk_state::ultratnk(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M6502, PIXEL_CLOCK / 8)
- MCFG_DEVICE_PROGRAM_MAP(ultratnk_cpu_map)
+ M6502(config, m_maincpu, PIXEL_CLOCK / 8);
+ m_maincpu->set_addrmap(AS_PROGRAM, &ultratnk_state::ultratnk_cpu_map);
f9334_device &latch(F9334(config, "latch")); // E11
latch.q_out_cb<3>().set(FUNC(ultratnk_state::lockout_w));
latch.q_out_cb<4>().set_output("led0"); // LED1 (left player start)
latch.q_out_cb<5>().set_output("led1"); // LED2 (right player start)
- latch.q_out_cb<6>().set("discrete", FUNC(discrete_device::write_line<ULTRATNK_FIRE_EN_2>));
- latch.q_out_cb<7>().set("discrete", FUNC(discrete_device::write_line<ULTRATNK_FIRE_EN_1>));
+ latch.q_out_cb<6>().set(m_discrete, FUNC(discrete_device::write_line<ULTRATNK_FIRE_EN_2>));
+ latch.q_out_cb<7>().set(m_discrete, FUNC(discrete_device::write_line<ULTRATNK_FIRE_EN_1>));
WATCHDOG_TIMER(config, m_watchdog).set_vblank_count(m_screen, 8);
/* video hardware */
- MCFG_SCREEN_ADD(m_screen, RASTER)
- MCFG_SCREEN_RAW_PARAMS(PIXEL_CLOCK, HTOTAL, 0, 256, VTOTAL, 0, 224)
- MCFG_SCREEN_UPDATE_DRIVER(ultratnk_state, screen_update)
- MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE(*this, ultratnk_state, screen_vblank))
- MCFG_SCREEN_PALETTE(m_palette)
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_raw(PIXEL_CLOCK, HTOTAL, 0, 256, VTOTAL, 0, 224);
+ m_screen->set_screen_update(FUNC(ultratnk_state::screen_update));
+ m_screen->screen_vblank().set(FUNC(ultratnk_state::screen_vblank));
+ m_screen->set_palette(m_palette);
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, m_palette, gfx_ultratnk)
+ GFXDECODE(config, m_gfxdecode, m_palette, gfx_ultratnk);
PALETTE(config, m_palette, FUNC(ultratnk_state::ultratnk_palette), 10, 4);
/* sound hardware */
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("discrete", DISCRETE, ultratnk_discrete)
- MCFG_SOUND_ROUTE(0, "mono", 1.0)
-
-MACHINE_CONFIG_END
+ DISCRETE(config, m_discrete, ultratnk_discrete).add_route(0, "mono", 1.0);
+}
ROM_START( ultratnk )
diff --git a/src/mame/drivers/undrfire.cpp b/src/mame/drivers/undrfire.cpp
index 3f168d90b3c..7a6c21937fb 100644
--- a/src/mame/drivers/undrfire.cpp
+++ b/src/mame/drivers/undrfire.cpp
@@ -564,12 +564,12 @@ INTERRUPT_GEN_MEMBER(undrfire_state::undrfire_interrupt)
device.execute().set_input_line(4, HOLD_LINE);
}
-MACHINE_CONFIG_START(undrfire_state::undrfire)
-
+void undrfire_state::undrfire(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M68EC020, XTAL(40'000'000)/2) /* 20 MHz - NOT verified */
- MCFG_DEVICE_PROGRAM_MAP(undrfire_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", undrfire_state, undrfire_interrupt)
+ M68EC020(config, m_maincpu, XTAL(40'000'000)/2); /* 20 MHz - NOT verified */
+ m_maincpu->set_addrmap(AS_PROGRAM, &undrfire_state::undrfire_map);
+ m_maincpu->set_vblank_int("screen", FUNC(undrfire_state::undrfire_interrupt));
EEPROM_93C46_16BIT(config, "eeprom");
@@ -586,13 +586,13 @@ MACHINE_CONFIG_START(undrfire_state::undrfire)
tc0510nio.read_7_callback().set_ioport("SYSTEM");
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(40*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0, 40*8-1, 3*8, 32*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(undrfire_state, screen_update_undrfire)
- MCFG_SCREEN_PALETTE(m_palette)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(40*8, 32*8);
+ screen.set_visarea(0, 40*8-1, 3*8, 32*8-1);
+ screen.set_screen_update(FUNC(undrfire_state::screen_update_undrfire));
+ screen.set_palette(m_palette);
GFXDECODE(config, m_gfxdecode, m_palette, gfx_undrfire);
PALETTE(config, m_palette).set_format(palette_device::xRGB_888, 16384);
@@ -613,21 +613,21 @@ MACHINE_CONFIG_START(undrfire_state::undrfire)
/* sound hardware */
TAITO_EN(config, "taito_en", 0);
-MACHINE_CONFIG_END
-
+}
-MACHINE_CONFIG_START(undrfire_state::cbombers)
+void undrfire_state::cbombers(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M68EC020, XTAL(40'000'000)/2) /* 20 MHz - NOT verified */
- MCFG_DEVICE_PROGRAM_MAP(cbombers_cpua_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", undrfire_state, irq4_line_hold)
+ M68EC020(config, m_maincpu, XTAL(40'000'000)/2); /* 20 MHz - NOT verified */
+ m_maincpu->set_addrmap(AS_PROGRAM, &undrfire_state::cbombers_cpua_map);
+ m_maincpu->set_vblank_int("screen", FUNC(undrfire_state::irq4_line_hold));
- MCFG_DEVICE_ADD("sub", M68000, XTAL(32'000'000)/2) /* 16 MHz */
- MCFG_DEVICE_PROGRAM_MAP(cbombers_cpub_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", undrfire_state, irq4_line_hold)
+ M68000(config, m_subcpu, XTAL(32'000'000)/2); /* 16 MHz */
+ m_subcpu->set_addrmap(AS_PROGRAM, &undrfire_state::cbombers_cpub_map);
+ m_subcpu->set_vblank_int("screen", FUNC(undrfire_state::irq4_line_hold));
- MCFG_QUANTUM_TIME(attotime::from_hz(480)) /* CPU slices - Need to interleave Cpu's 1 & 3 */
+ config.m_minimum_quantum = attotime::from_hz(480); /* CPU slices - Need to interleave Cpu's 1 & 3 */
EEPROM_93C46_16BIT(config, "eeprom");
@@ -648,13 +648,13 @@ MACHINE_CONFIG_START(undrfire_state::cbombers)
tc0510nio.read_7_callback().set_ioport("SYSTEM");
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(40*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0, 40*8-1, 3*8, 32*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(undrfire_state, screen_update_cbombers)
- MCFG_SCREEN_PALETTE(m_palette)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(40*8, 32*8);
+ screen.set_visarea(0, 40*8-1, 3*8, 32*8-1);
+ screen.set_screen_update(FUNC(undrfire_state::screen_update_cbombers));
+ screen.set_palette(m_palette);
GFXDECODE(config, m_gfxdecode, m_palette, gfx_cbombers);
PALETTE(config, m_palette).set_format(palette_device::xRGB_888, 16384);
@@ -676,7 +676,7 @@ MACHINE_CONFIG_START(undrfire_state::cbombers)
/* sound hardware */
TAITO_EN(config, "taito_en", 0);
-MACHINE_CONFIG_END
+}
/***************************************************************************
diff --git a/src/mame/drivers/unianapc.cpp b/src/mame/drivers/unianapc.cpp
index fcbbd2f470b..9acef774a55 100644
--- a/src/mame/drivers/unianapc.cpp
+++ b/src/mame/drivers/unianapc.cpp
@@ -72,20 +72,20 @@ void unianapc_state::machine_reset()
{
}
-MACHINE_CONFIG_START(unianapc_state::unianapc)
-
+void unianapc_state::unianapc(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", PENTIUM3, 100000000) // actually a Celeron at 1.70 GHz
- MCFG_DEVICE_PROGRAM_MAP(unianapc_map)
+ PENTIUM3(config, m_maincpu, 100000000); // actually a Celeron at 1.70 GHz
+ m_maincpu->set_addrmap(AS_PROGRAM, &unianapc_state::unianapc_map);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(640, 480)
- MCFG_SCREEN_VISIBLE_AREA(0, 640-1, 0, 480-1)
- MCFG_SCREEN_UPDATE_DRIVER(unianapc_state, screen_update)
-MACHINE_CONFIG_END
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(640, 480);
+ screen.set_visarea(0, 640-1, 0, 480-1);
+ screen.set_screen_update(FUNC(unianapc_state::screen_update));
+}
/***************************************************************************
diff --git a/src/mame/drivers/unichamp.cpp b/src/mame/drivers/unichamp.cpp
index ba5d15766f6..4058047ce9a 100644
--- a/src/mame/drivers/unichamp.cpp
+++ b/src/mame/drivers/unichamp.cpp
@@ -186,7 +186,7 @@ void unichamp_state::machine_start()
ptr[i+1] = TEMP;
}
m_maincpu->space(AS_PROGRAM).install_read_handler(0x1000, 0x17ff,
- read16_delegate(FUNC(generic_slot_device::read16_rom),(generic_slot_device*)m_cart));
+ read16s_delegate(FUNC(generic_slot_device::read16_rom),(generic_slot_device*)m_cart));
} else
m_maincpu->space(AS_PROGRAM).install_read_handler(0x1000, 0x17ff,
read16_delegate(FUNC(unichamp_state::read_ff), this));
diff --git a/src/mame/drivers/unico.cpp b/src/mame/drivers/unico.cpp
index f8606d34925..133a6909ed3 100644
--- a/src/mame/drivers/unico.cpp
+++ b/src/mame/drivers/unico.cpp
@@ -562,21 +562,21 @@ void unico_state::machine_start()
Burglar X
***************************************************************************/
-MACHINE_CONFIG_START(unico_state::burglarx)
-
+void unico_state::burglarx(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M68000, 32_MHz_XTAL/2) /* 16MHz */
- MCFG_DEVICE_PROGRAM_MAP(burglarx_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", unico_state, irq2_line_hold)
+ M68000(config, m_maincpu, 32_MHz_XTAL/2); /* 16MHz */
+ m_maincpu->set_addrmap(AS_PROGRAM, &unico_state::burglarx_map);
+ m_maincpu->set_vblank_int("screen", FUNC(unico_state::irq2_line_hold));
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(384, 224)
- MCFG_SCREEN_VISIBLE_AREA(0, 384-1, 0, 224-1)
- MCFG_SCREEN_UPDATE_DRIVER(unico_state, screen_update)
- MCFG_SCREEN_PALETTE(m_palette)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(384, 224);
+ screen.set_visarea(0, 384-1, 0, 224-1);
+ screen.set_screen_update(FUNC(unico_state::screen_update));
+ screen.set_palette(m_palette);
GFXDECODE(config, m_gfxdecode, m_palette, gfx_unico);
PALETTE(config, m_palette).set_format(4, &unico_state::unico_R6G6B6X, 8192);
@@ -585,14 +585,14 @@ MACHINE_CONFIG_START(unico_state::burglarx)
SPEAKER(config, "lspeaker").front_left();
SPEAKER(config, "rspeaker").front_right();
- MCFG_DEVICE_ADD("ymsnd", YM3812, XTAL(14'318'181)/4) /* 3.579545 MHz */
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 0.40)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 0.40)
+ ym3812_device &ymsnd(YM3812(config, "ymsnd", XTAL(14'318'181)/4)); /* 3.579545 MHz */
+ ymsnd.add_route(ALL_OUTPUTS, "lspeaker", 0.40);
+ ymsnd.add_route(ALL_OUTPUTS, "rspeaker", 0.40);
- MCFG_DEVICE_ADD("oki", OKIM6295, 32_MHz_XTAL/32, okim6295_device::PIN7_HIGH) // clock frequency & pin 7 not verified
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 0.80)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 0.80)
-MACHINE_CONFIG_END
+ OKIM6295(config, m_oki, 32_MHz_XTAL/32, okim6295_device::PIN7_HIGH); // clock frequency & pin 7 not verified
+ m_oki->add_route(ALL_OUTPUTS, "lspeaker", 0.80);
+ m_oki->add_route(ALL_OUTPUTS, "rspeaker", 0.80);
+}
@@ -606,21 +606,21 @@ void zeropnt_state::machine_start()
m_okibank->configure_entries(0, 4, memregion("oki")->base() + 0x20000, 0x20000);
}
-MACHINE_CONFIG_START(zeropnt_state::zeropnt)
-
+void zeropnt_state::zeropnt(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M68000, 32_MHz_XTAL/2) /* 16MHz */
- MCFG_DEVICE_PROGRAM_MAP(zeropnt_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", unico_state, irq2_line_hold)
+ M68000(config, m_maincpu, 32_MHz_XTAL/2); /* 16MHz */
+ m_maincpu->set_addrmap(AS_PROGRAM, &zeropnt_state::zeropnt_map);
+ m_maincpu->set_vblank_int("screen", FUNC(zeropnt_state::irq2_line_hold));
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(384, 224)
- MCFG_SCREEN_VISIBLE_AREA(0, 384-1, 0, 224-1)
- MCFG_SCREEN_UPDATE_DRIVER(zeropnt_state, screen_update)
- MCFG_SCREEN_PALETTE(m_palette)
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_refresh_hz(60);
+ m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ m_screen->set_size(384, 224);
+ m_screen->set_visarea(0, 384-1, 0, 224-1);
+ m_screen->set_screen_update(FUNC(zeropnt_state::screen_update));
+ m_screen->set_palette(m_palette);
GFXDECODE(config, m_gfxdecode, m_palette, gfx_unico);
PALETTE(config, m_palette).set_format(4, &zeropnt_state::unico_R6G6B6X, 8192);
@@ -629,15 +629,15 @@ MACHINE_CONFIG_START(zeropnt_state::zeropnt)
SPEAKER(config, "lspeaker").front_left();
SPEAKER(config, "rspeaker").front_right();
- MCFG_DEVICE_ADD("ymsnd", YM3812, XTAL(14'318'181)/4) /* 3.579545 MHz */
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 0.40)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 0.40)
+ ym3812_device &ymsnd(YM3812(config, "ymsnd", XTAL(14'318'181)/4)); /* 3.579545 MHz */
+ ymsnd.add_route(ALL_OUTPUTS, "lspeaker", 0.40);
+ ymsnd.add_route(ALL_OUTPUTS, "rspeaker", 0.40);
- MCFG_DEVICE_ADD("oki", OKIM6295, 32_MHz_XTAL/32, okim6295_device::PIN7_HIGH) // clock frequency & pin 7 not verified
- MCFG_DEVICE_ADDRESS_MAP(0, zeropnt_oki_map)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 0.80)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 0.80)
-MACHINE_CONFIG_END
+ OKIM6295(config, m_oki, 32_MHz_XTAL/32, okim6295_device::PIN7_HIGH); // clock frequency & pin 7 not verified
+ m_oki->set_addrmap(0, &zeropnt_state::zeropnt_oki_map);
+ m_oki->add_route(ALL_OUTPUTS, "lspeaker", 0.80);
+ m_oki->add_route(ALL_OUTPUTS, "rspeaker", 0.80);
+}
@@ -651,23 +651,23 @@ void zeropnt2_state::machine_start()
m_okibank->configure_entries(0, 4, memregion("oki1")->base() + 0x20000, 0x20000);
}
-MACHINE_CONFIG_START(zeropnt2_state::zeropnt2)
-
+void zeropnt2_state::zeropnt2(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M68EC020, 32_MHz_XTAL/2) /* 16MHz */
- MCFG_DEVICE_PROGRAM_MAP(zeropnt2_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", unico_state, irq2_line_hold)
+ M68EC020(config, m_maincpu, 32_MHz_XTAL/2); /* 16MHz */
+ m_maincpu->set_addrmap(AS_PROGRAM, &zeropnt2_state::zeropnt2_map);
+ m_maincpu->set_vblank_int("screen", FUNC(zeropnt2_state::irq2_line_hold));
EEPROM_93C46_8BIT(config, "eeprom");
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(384, 224)
- MCFG_SCREEN_VISIBLE_AREA(0, 384-1, 0, 224-1)
- MCFG_SCREEN_UPDATE_DRIVER(zeropnt2_state, screen_update)
- MCFG_SCREEN_PALETTE(m_palette)
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_refresh_hz(60);
+ m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ m_screen->set_size(384, 224);
+ m_screen->set_visarea(0, 384-1, 0, 224-1);
+ m_screen->set_screen_update(FUNC(zeropnt2_state::screen_update));
+ m_screen->set_palette(m_palette);
GFXDECODE(config, m_gfxdecode, m_palette, gfx_unico);
PALETTE(config, m_palette).set_format(4, &zeropnt2_state::unico_R6G6B6X, 8192);
@@ -678,15 +678,15 @@ MACHINE_CONFIG_START(zeropnt2_state::zeropnt2)
YM2151(config, "ymsnd", XTAL(14'318'181)/4).add_route(0, "lspeaker", 0.70).add_route(1, "rspeaker", 0.70); /* 3.579545 MHz */
- MCFG_DEVICE_ADD("oki1", OKIM6295, 32_MHz_XTAL/32, okim6295_device::PIN7_HIGH) // clock frequency & pin 7 not verified
- MCFG_DEVICE_ADDRESS_MAP(0, zeropnt_oki_map)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 0.40)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 0.40)
+ okim6295_device &oki1(OKIM6295(config, "oki1", 32_MHz_XTAL/32, okim6295_device::PIN7_HIGH)); // clock frequency & pin 7 not verified
+ oki1.set_addrmap(0, &zeropnt2_state::zeropnt_oki_map);
+ oki1.add_route(ALL_OUTPUTS, "lspeaker", 0.40);
+ oki1.add_route(ALL_OUTPUTS, "rspeaker", 0.40);
- MCFG_DEVICE_ADD("oki2", OKIM6295, XTAL(14'318'181)/4, okim6295_device::PIN7_HIGH) // clock frequency & pin 7 not verified
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 0.20)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 0.20)
-MACHINE_CONFIG_END
+ okim6295_device &oki2(OKIM6295(config, "oki2", XTAL(14'318'181)/4, okim6295_device::PIN7_HIGH)); // clock frequency & pin 7 not verified
+ oki2.add_route(ALL_OUTPUTS, "lspeaker", 0.20);
+ oki2.add_route(ALL_OUTPUTS, "rspeaker", 0.20);
+}
/***************************************************************************
diff --git a/src/mame/drivers/unior.cpp b/src/mame/drivers/unior.cpp
index acf837a0149..e177e1ffdc4 100644
--- a/src/mame/drivers/unior.cpp
+++ b/src/mame/drivers/unior.cpp
@@ -377,19 +377,20 @@ void unior_state::machine_reset()
m_maincpu->set_state_int(i8080_cpu_device::I8085_PC, 0xF800);
}
-MACHINE_CONFIG_START(unior_state::unior)
+void unior_state::unior(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu",I8080, XTAL(20'000'000) / 9)
- MCFG_DEVICE_PROGRAM_MAP(unior_mem)
- MCFG_DEVICE_IO_MAP(unior_io)
+ I8080(config, m_maincpu, XTAL(20'000'000) / 9);
+ m_maincpu->set_addrmap(AS_PROGRAM, &unior_state::unior_mem);
+ m_maincpu->set_addrmap(AS_IO, &unior_state::unior_io);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(50)
- MCFG_SCREEN_SIZE(640, 200)
- MCFG_SCREEN_VISIBLE_AREA(0, 640-1, 0, 200-1)
- MCFG_SCREEN_UPDATE_DEVICE("crtc", i8275_device, screen_update)
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, m_palette, gfx_unior)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(50);
+ screen.set_size(640, 200);
+ screen.set_visarea(0, 640-1, 0, 200-1);
+ screen.set_screen_update("crtc", FUNC(i8275_device::screen_update));
+ GFXDECODE(config, "gfxdecode", m_palette, gfx_unior);
PALETTE(config, m_palette, FUNC(unior_state::unior_palette), 3);
/* sound hardware */
@@ -426,12 +427,12 @@ MACHINE_CONFIG_START(unior_state::unior)
m_dma->in_memr_cb().set(FUNC(unior_state::dma_r));
m_dma->out_iow_cb<2>().set("crtc", FUNC(i8275_device::dack_w));
- MCFG_DEVICE_ADD("crtc", I8275, XTAL(20'000'000) / 12)
- MCFG_I8275_CHARACTER_WIDTH(6)
- MCFG_I8275_DRAW_CHARACTER_CALLBACK_OWNER(unior_state, display_pixels)
- MCFG_I8275_DRQ_CALLBACK(WRITELINE("dma",i8257_device, dreq2_w))
- MCFG_VIDEO_SET_SCREEN("screen")
-MACHINE_CONFIG_END
+ i8275_device &crtc(I8275(config, "crtc", XTAL(20'000'000) / 12));
+ crtc.set_character_width(6);
+ crtc.set_display_callback(FUNC(unior_state::display_pixels), this);
+ crtc.drq_wr_callback().set(m_dma, FUNC(i8257_device::dreq2_w));
+ crtc.set_screen("screen");
+}
/* ROM definition */
ROM_START( unior )
diff --git a/src/mame/drivers/univac.cpp b/src/mame/drivers/univac.cpp
index f7845584db5..a0b33aabd68 100644
--- a/src/mame/drivers/univac.cpp
+++ b/src/mame/drivers/univac.cpp
@@ -94,13 +94,16 @@ After entering the characters, press FCTN and CTRL PAGE keys again to save the s
****************************************************************************/
#include "emu.h"
+#include "bus/rs232/rs232.h"
+#include "bus/uts_kbd/uts_kbd.h"
#include "cpu/z80/z80.h"
+#include "machine/74259.h"
#include "machine/z80daisy.h"
#include "machine/clock.h"
#include "machine/nvram.h"
#include "machine/z80ctc.h"
#include "machine/z80sio.h"
-#include "sound/beep.h"
+#include "sound/spkrdev.h"
#include "video/dp8350.h"
#include "emupal.h"
#include "screen.h"
@@ -108,11 +111,13 @@ After entering the characters, press FCTN and CTRL PAGE keys again to save the s
#define LOG_GENERAL (1U << 0)
#define LOG_PARITY (1U << 1)
+#define LOG_NVRAM (1U << 2)
-//#define VERBOSE (LOG_GENERAL | LOG_PARITY)
+//#define VERBOSE (LOG_GENERAL | LOG_PARITY | LOG_NVRAM)
#include "logmacro.h"
#define LOGPARITY(...) LOGMASKED(LOG_PARITY, __VA_ARGS__)
+#define LOGNVRAM(...) LOGMASKED(LOG_NVRAM, __VA_ARGS__)
class univac_state : public driver_device
@@ -123,60 +128,105 @@ public:
, m_maincpu(*this, "maincpu")
, m_nvram(*this, "nvram")
, m_ctc(*this, "ctc")
- , m_uart(*this, "uart")
- , m_beep(*this, "beeper")
+ , m_keybclk(*this, "keybclk")
+ , m_sio(*this, "sio")
+ , m_alarm(*this, "alarm")
+ , m_screen(*this, "screen")
+ , m_keyboard(*this, "keyboard")
+ , m_printer(*this, "printer")
, m_p_chargen(*this, "chargen")
, m_p_videoram(*this, "videoram")
, m_p_nvram(*this, "nvram")
, m_bank_mask(0)
- , m_parity_check(0)
- , m_parity_poison(0)
+ , m_parity_poison(false)
+ , m_display_enable(false)
, m_framecnt(0)
+ , m_nvram_protect(false)
+ , m_alarm_enable(false)
+ , m_alarm_toggle(false)
+ , m_loopback_control(false)
+ , m_comm_rxd(true)
+ , m_sio_txda(true)
+ , m_aux_rxd(true)
+ , m_sio_txdb(true)
+ , m_sio_rtsb(true)
+ , m_aux_dsr(true)
+ , m_sio_wrdyb(true)
{ }
void uts10(machine_config &config);
void uts20(machine_config &config);
private:
- DECLARE_READ8_MEMBER(ram_r);
- DECLARE_READ8_MEMBER(bank_r);
- DECLARE_WRITE8_MEMBER(ram_w);
- DECLARE_WRITE8_MEMBER(bank_w);
- DECLARE_WRITE8_MEMBER(nvram_w);
-
- DECLARE_WRITE8_MEMBER(port43_w);
- DECLARE_WRITE8_MEMBER(portc4_w);
- DECLARE_WRITE8_MEMBER(porte6_w);
+ u8 ram_r(offs_t offset);
+ u8 bank_r(offs_t offset);
+ void ram_w(offs_t offset, u8 data);
+ void bank_w(offs_t offset, u8 data);
+ void nvram_w(offs_t offset, u8 data);
+
+ DECLARE_WRITE_LINE_MEMBER(nvram_protect_w);
+ DECLARE_WRITE_LINE_MEMBER(select_disp_w);
+ DECLARE_WRITE_LINE_MEMBER(ram_control_w);
+ DECLARE_WRITE_LINE_MEMBER(parity_poison_w);
+ DECLARE_WRITE_LINE_MEMBER(display_enable_w);
+ DECLARE_WRITE_LINE_MEMBER(alarm_enable_w);
+ DECLARE_WRITE_LINE_MEMBER(sio_loopback_w);
+ DECLARE_WRITE_LINE_MEMBER(sio_txda_w);
+ DECLARE_WRITE_LINE_MEMBER(sio_txdb_w);
+ DECLARE_WRITE_LINE_MEMBER(aux_rxd_w);
+ DECLARE_WRITE_LINE_MEMBER(sio_rtsb_w);
+ DECLARE_WRITE_LINE_MEMBER(sio_wrdyb_w);
+ DECLARE_WRITE_LINE_MEMBER(aux_dsr_w);
+ DECLARE_WRITE_LINE_MEMBER(loopback_rxcb_w);
+ DECLARE_WRITE_LINE_MEMBER(porte6_w);
u32 screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
void io_map(address_map &map);
void mem_map(address_map &map);
+ void uts10_io_map(address_map &map);
void uts10_map(address_map &map);
virtual void machine_start() override;
- virtual void machine_reset() override;
- virtual void device_post_load() override;
required_device<z80_device> m_maincpu;
required_device<nvram_device> m_nvram;
required_device<z80ctc_device> m_ctc;
- required_device<z80sio_device> m_uart;
- required_device<beep_device> m_beep;
+ optional_device<clock_device> m_keybclk;
+ required_device<z80sio_device> m_sio;
+ required_device<speaker_sound_device> m_alarm;
+ required_device<screen_device> m_screen;
+
+ required_device<uts_keyboard_port_device> m_keyboard;
+ required_device<rs232_port_device> m_printer;
required_region_ptr<u8> m_p_chargen;
required_shared_ptr<u8> m_p_videoram;
required_shared_ptr<u8> m_p_nvram;
std::unique_ptr<u8 []> m_p_parity;
+ u16 m_disp_mask;
u16 m_bank_mask;
- u8 m_parity_check;
- u8 m_parity_poison;
+ bool m_parity_poison;
+ bool m_display_enable;
u8 m_framecnt;
+ bool m_nvram_protect;
+
+ bool m_alarm_enable;
+ bool m_alarm_toggle;
+
+ bool m_loopback_control;
+ bool m_comm_rxd;
+ bool m_sio_txda;
+ bool m_aux_rxd;
+ bool m_sio_txdb;
+ bool m_sio_rtsb;
+ bool m_aux_dsr;
+ bool m_sio_wrdyb;
};
-READ8_MEMBER( univac_state::ram_r )
+u8 univac_state::ram_r(offs_t offset)
{
if (BIT(m_p_parity[offset >> 3], offset & 0x07) && !machine().side_effects_disabled())
{
@@ -186,12 +236,12 @@ READ8_MEMBER( univac_state::ram_r )
return m_p_videoram[offset];
}
-READ8_MEMBER( univac_state::bank_r )
+u8 univac_state::bank_r(offs_t offset)
{
- return space.read_byte((0xc000 | offset) ^ m_bank_mask);
+ return ram_r(offset ^ m_bank_mask);
}
-WRITE8_MEMBER( univac_state::ram_w )
+void univac_state::ram_w(offs_t offset, u8 data)
{
if (m_parity_poison)
{
@@ -205,48 +255,163 @@ WRITE8_MEMBER( univac_state::ram_w )
m_p_videoram[offset] = data;
}
-WRITE8_MEMBER( univac_state::bank_w )
+void univac_state::bank_w(offs_t offset, u8 data)
{
- space.write_byte((0xc000 | offset) ^ m_bank_mask, data);
+ ram_w(offset ^ m_bank_mask, data);
}
-WRITE8_MEMBER( univac_state::nvram_w )
+void univac_state::nvram_w(offs_t offset, u8 data)
{
// NVRAM is four bits wide, accessed in the low nybble
// It's simplest to hack it when writing to make the upper bits read back high on the open bus
- m_p_nvram[offset] = data | 0xf0;
+ // (But is it all open bus? Bit 4 is specifically tested in a few places...)
+ if (m_nvram_protect)
+ LOGNVRAM("%s: NVRAM write suppressed (address %02X, data %02X)\n", machine().describe_context(), offset + 0x80, data);
+ else
+ m_p_nvram[offset] = data | 0xf0;
+}
+
+WRITE_LINE_MEMBER(univac_state::nvram_protect_w)
+{
+ // There seems to be some timing-based write protection related to the CTC's TRG0 input.
+ // The present implementation is a crude approximation of a wild guess.
+ if (state)
+ {
+ m_nvram_protect = m_screen->vpos() < 10;
+
+ if (m_alarm_enable)
+ {
+ m_alarm_toggle = !m_alarm_toggle;
+ m_alarm->level_w(m_alarm_toggle);
+ }
+ }
}
-WRITE8_MEMBER( univac_state::port43_w )
+WRITE_LINE_MEMBER(univac_state::select_disp_w)
{
- m_bank_mask = BIT(data, 0) ? 0x2000 : 0x0000;
+ m_disp_mask = state ? 0x2000 : 0x0000;
}
-WRITE8_MEMBER( univac_state::portc4_w )
+WRITE_LINE_MEMBER(univac_state::ram_control_w)
{
- m_parity_poison = BIT(data, 0);
- u8 const check = BIT(data, 1);
- if (check != m_parity_check)
+ m_bank_mask = state ? 0x2000 : 0x0000;
+}
+
+WRITE_LINE_MEMBER(univac_state::parity_poison_w)
+{
+ m_parity_poison = state;
+}
+
+WRITE_LINE_MEMBER(univac_state::display_enable_w)
+{
+ m_display_enable = state;
+}
+
+WRITE_LINE_MEMBER(univac_state::alarm_enable_w)
+{
+ m_alarm_enable = state;
+ if (!state)
{
- m_parity_check = check;
- address_space &space(m_maincpu->space(AS_PROGRAM));
- space.unmap_read(0xc000, 0xffff);
- if (check)
- {
- LOGPARITY("parity check enabled\n");
- space.install_read_handler(0xc000, 0xffff, read8_delegate(FUNC(univac_state::ram_r), this));
- }
- else
- {
- LOGPARITY("parity check disabled\n");
- space.install_rom(0xc000, 0xffff, &m_p_videoram[0]);
- }
+ m_alarm_toggle = false;
+ m_alarm->level_w(0);
+ }
+}
+
+WRITE_LINE_MEMBER(univac_state::sio_loopback_w)
+{
+ if (state)
+ {
+ m_sio->rxa_w(m_sio_txda);
+ m_sio->rxb_w(m_sio_txdb);
+ m_sio->dcdb_w(m_sio_wrdyb);
+ m_sio->ctsb_w(m_sio_wrdyb);
+ m_sio->syncb_w(!m_sio_rtsb);
+ m_printer->write_txd(1);
+ m_printer->write_rts(1);
+ m_keyboard->ready_w(0);
+ if (m_keybclk.found())
+ m_keybclk->set_clock_scale(0.0);
}
+ else
+ {
+ m_sio->rxa_w(m_comm_rxd);
+ m_sio->rxb_w(m_aux_rxd);
+ m_sio->dcdb_w(m_aux_dsr);
+ m_sio->ctsb_w(m_aux_dsr); // likely ignored
+ m_sio->syncb_w(1);
+ m_printer->write_txd(m_sio_txdb);
+ m_printer->write_rts(m_sio_rtsb);
+ m_keyboard->ready_w(m_sio_wrdyb);
+ if (m_keybclk.found())
+ m_keybclk->set_clock_scale(1.0);
+ }
+
+ m_loopback_control = state;
+}
+
+WRITE_LINE_MEMBER(univac_state::sio_txda_w)
+{
+ m_sio_txda = state;
+ if (m_loopback_control)
+ m_sio->rxa_w(state);
}
-WRITE8_MEMBER( univac_state::porte6_w )
+WRITE_LINE_MEMBER(univac_state::sio_txdb_w)
{
- //m_beep->set_state(BIT(data, 0)); // not sure what belongs here, but it isn't the beeper
+ m_sio_txdb = state;
+ if (m_loopback_control)
+ m_sio->rxb_w(state);
+ else
+ m_printer->write_txd(state);
+}
+
+WRITE_LINE_MEMBER(univac_state::aux_rxd_w)
+{
+ m_aux_rxd = state;
+ if (!m_loopback_control)
+ m_sio->rxb_w(state);
+}
+
+WRITE_LINE_MEMBER(univac_state::sio_rtsb_w)
+{
+ m_sio_rtsb = state;
+ if (m_loopback_control)
+ m_sio->syncb_w(!state);
+ else
+ m_printer->write_rts(state);
+}
+
+WRITE_LINE_MEMBER(univac_state::sio_wrdyb_w)
+{
+ m_sio_wrdyb = state;
+ if (m_loopback_control)
+ {
+ m_sio->dcdb_w(state);
+ m_sio->ctsb_w(state);
+ }
+ else
+ m_keyboard->ready_w(state);
+}
+
+WRITE_LINE_MEMBER(univac_state::aux_dsr_w)
+{
+ m_aux_dsr = state;
+ if (!m_loopback_control)
+ {
+ m_sio->dcdb_w(state);
+ m_sio->ctsb_w(state);
+ }
+}
+
+WRITE_LINE_MEMBER(univac_state::loopback_rxcb_w)
+{
+ if (m_loopback_control)
+ m_sio->rxcb_w(state);
+}
+
+WRITE_LINE_MEMBER(univac_state::porte6_w)
+{
+ //m_beep->set_state(state); // not sure what belongs here, but it isn't the beeper
}
@@ -255,7 +420,7 @@ void univac_state::mem_map(address_map &map)
map.unmap_value_high();
map(0x0000, 0x4fff).rom().region("roms", 0);
map(0x8000, 0xbfff).rw(FUNC(univac_state::bank_r), FUNC(univac_state::bank_w));
- map(0xc000, 0xffff).ram().w(FUNC(univac_state::ram_w)).share("videoram");
+ map(0xc000, 0xffff).rw(FUNC(univac_state::ram_r), FUNC(univac_state::ram_w)).share("videoram");
}
void univac_state::uts10_map(address_map &map)
@@ -263,19 +428,26 @@ void univac_state::uts10_map(address_map &map)
map.unmap_value_high();
map(0x0000, 0x4fff).rom().region("roms", 0);
map(0x8000, 0x9fff).mirror(0x2000).rw(FUNC(univac_state::bank_r), FUNC(univac_state::bank_w));
- map(0xc000, 0xffff).ram().w(FUNC(univac_state::ram_w)).share("videoram");
+ map(0xc000, 0xffff).rw(FUNC(univac_state::ram_r), FUNC(univac_state::ram_w)).share("videoram");
}
-void univac_state::io_map(address_map &map)
+void univac_state::uts10_io_map(address_map &map)
{
map.global_mask(0xff);
map.unmap_value_high();
- map(0x00, 0x03).rw(m_uart, FUNC(z80sio_device::cd_ba_r), FUNC(z80sio_device::cd_ba_w));
+ map(0x00, 0x03).rw(m_sio, FUNC(z80sio_device::cd_ba_r), FUNC(z80sio_device::cd_ba_w));
map(0x20, 0x23).rw(m_ctc, FUNC(z80ctc_device::read), FUNC(z80ctc_device::write));
- map(0x43, 0x43).w(FUNC(univac_state::port43_w));
+ map(0x60, 0x60).nopw(); // values written here may or may not matter
map(0x80, 0xbf).ram().w(FUNC(univac_state::nvram_w)).share("nvram");
- map(0xc4, 0xc4).w(FUNC(univac_state::portc4_w));
- map(0xe6, 0xe6).w(FUNC(univac_state::porte6_w));
+ map(0xc0, 0xc7).w("latch_c0", FUNC(ls259_device::write_d0));
+ map(0xe0, 0xe7).w("latch_e0", FUNC(ls259_device::write_d0));
+}
+
+void univac_state::io_map(address_map &map)
+{
+ uts10_io_map(map);
+ map(0x40, 0x40).nopr(); // read only once, during self-test; result is discarded
+ map(0x40, 0x47).w("latch_40", FUNC(ls259_device::write_d0));
}
/* Input ports */
@@ -293,34 +465,32 @@ void univac_state::machine_start()
save_pointer(NAME(m_p_parity), parity_bytes);
save_item(NAME(m_bank_mask));
- save_item(NAME(m_parity_check));
save_item(NAME(m_parity_poison));
+ save_item(NAME(m_display_enable));
save_item(NAME(m_framecnt));
+ save_item(NAME(m_nvram_protect));
+ save_item(NAME(m_alarm_enable));
+ save_item(NAME(m_alarm_toggle));
+ save_item(NAME(m_loopback_control));
+ save_item(NAME(m_comm_rxd));
+ save_item(NAME(m_sio_txda));
+ save_item(NAME(m_aux_rxd));
+ save_item(NAME(m_sio_txdb));
+ save_item(NAME(m_sio_rtsb));
+ save_item(NAME(m_aux_dsr));
+ save_item(NAME(m_sio_wrdyb));
}
-void univac_state::machine_reset()
-{
- m_beep->set_state(0);
-
- m_bank_mask = 0x0000;
- m_parity_check = 0;
- m_parity_poison = 0;
-}
-
-void univac_state::device_post_load()
+uint32_t univac_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{
- if (m_parity_check)
+ if (!m_display_enable)
{
- address_space &space(m_maincpu->space(AS_PROGRAM));
- space.unmap_read(0xc000, 0xffff);
- space.install_read_handler(0xc000, 0xffff, read8_delegate(FUNC(univac_state::ram_r), this));
+ bitmap.fill(0, cliprect);
+ return 0;
}
-}
-uint32_t univac_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
-{
- uint8_t y,ra,chr;
- uint16_t sy=0,x,ma=0,gfx; //m_bank_mask; (it isn't port43 that selects the screen)
+ u8 y,ra,chr;
+ uint16_t sy=0,x,ma=0,gfx;
m_framecnt++;
@@ -332,7 +502,7 @@ uint32_t univac_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap
for (x = ma; x < ma + 80; x++)
{
- chr = m_p_videoram[x]; // bit 7 = rv attribute (or dim, depending on control-page setting)
+ chr = ram_r(x ^ m_disp_mask); // bit 7 = rv attribute (or dim, depending on control-page setting)
gfx = m_p_chargen[((chr & 0x7f)<<4) | ra];
@@ -386,23 +556,39 @@ GFXDECODE_END
static const z80_daisy_config daisy_chain[] =
{
- { "uart" },
+ { "sio" },
{ "ctc" },
{ nullptr }
};
// All frequencies confirmed
-MACHINE_CONFIG_START(univac_state::uts20)
+void univac_state::uts20(machine_config &config)
+{
/* basic machine hardware */
Z80(config, m_maincpu, 18.432_MHz_XTAL / 6); // 3.072 MHz
m_maincpu->set_addrmap(AS_PROGRAM, &univac_state::mem_map);
m_maincpu->set_addrmap(AS_IO, &univac_state::io_map);
m_maincpu->set_daisy_config(daisy_chain);
+ ls259_device &latch_40(LS259(config, "latch_40")); // actual type and location unknown
+ latch_40.q_out_cb<1>().set(FUNC(univac_state::select_disp_w));
+ latch_40.q_out_cb<3>().set(FUNC(univac_state::ram_control_w));
+
+ ls259_device &latch_c0(LS259(config, "latch_c0")); // actual type and location unknown
+ latch_c0.q_out_cb<0>().set(FUNC(univac_state::alarm_enable_w));
+ latch_c0.q_out_cb<3>().set(FUNC(univac_state::display_enable_w));
+ latch_c0.q_out_cb<4>().set(FUNC(univac_state::parity_poison_w));
+ latch_c0.q_out_cb<6>().set(FUNC(univac_state::sio_loopback_w));
+
+ ls259_device &latch_e0(LS259(config, "latch_e0")); // actual type and location unknown
+ //latch_e0.q_out_cb<2>().set(FUNC(univac_state::reverse_video_w));
+ latch_e0.q_out_cb<5>().set("crtc", FUNC(dp835x_device::refresh_control)).invert();
+ latch_e0.q_out_cb<6>().set(FUNC(univac_state::porte6_w));
+
/* video hardware */
- MCFG_SCREEN_ADD_MONOCHROME("screen", RASTER, rgb_t::green())
- MCFG_SCREEN_UPDATE_DRIVER(univac_state, screen_update)
- MCFG_SCREEN_PALETTE("palette")
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER, rgb_t::green());
+ m_screen->set_screen_update(FUNC(univac_state::screen_update));
+ m_screen->set_palette("palette");
PALETTE(config, "palette", palette_device::MONOCHROME);
GFXDECODE(config, "gfxdecode", "palette", gfx_uts);
@@ -417,28 +603,49 @@ MACHINE_CONFIG_START(univac_state::uts20)
m_ctc->intr_callback().set_inputline(m_maincpu, INPUT_LINE_IRQ0);
m_ctc->set_clk<1>(18.432_MHz_XTAL / 12);
m_ctc->set_clk<2>(18.432_MHz_XTAL / 12);
- m_ctc->zc_callback<1>().set(m_uart, FUNC(z80sio_device::txca_w));
- m_ctc->zc_callback<1>().append(m_uart, FUNC(z80sio_device::rxca_w));
- m_ctc->zc_callback<2>().set(m_uart, FUNC(z80sio_device::rxtxcb_w));
-
- Z80SIO(config, m_uart, 18.432_MHz_XTAL / 6);
- m_uart->out_int_callback().set_inputline(m_maincpu, INPUT_LINE_IRQ0);
- m_uart->out_txda_callback().set(m_uart, FUNC(z80sio_device::rxa_w)); // FIXME: hacked in permanent loopback to pass test
- m_uart->out_txdb_callback().set(m_uart, FUNC(z80sio_device::rxb_w)); // FIXME: hacked in permanent loopback to pass test
- m_uart->out_wrdyb_callback().set(m_uart, FUNC(z80sio_device::dcdb_w)); // FIXME: hacked in permanent loopback to pass test
- m_uart->out_wrdyb_callback().append(m_uart, FUNC(z80sio_device::ctsb_w)); // FIXME: hacked in permanent loopback to pass test
+ m_ctc->zc_callback<0>().set(FUNC(univac_state::nvram_protect_w));
+ m_ctc->zc_callback<1>().set(m_sio, FUNC(z80sio_device::txca_w));
+ m_ctc->zc_callback<1>().append(m_sio, FUNC(z80sio_device::rxca_w));
+ m_ctc->zc_callback<2>().set(m_sio, FUNC(z80sio_device::txcb_w));
+ m_ctc->zc_callback<2>().append(FUNC(univac_state::loopback_rxcb_w));
+
+ CLOCK(config, m_keybclk, 18.432_MHz_XTAL / 60);
+ m_keybclk->signal_handler().set(m_sio, FUNC(z80sio_device::rxcb_w));
+
+ Z80SIO(config, m_sio, 18.432_MHz_XTAL / 6);
+ m_sio->out_int_callback().set_inputline(m_maincpu, INPUT_LINE_IRQ0);
+ m_sio->out_txda_callback().set(FUNC(univac_state::sio_txda_w));
+ m_sio->out_txdb_callback().set(FUNC(univac_state::sio_txdb_w));
+ m_sio->out_rtsb_callback().set(FUNC(univac_state::sio_rtsb_w));
+ m_sio->out_wrdyb_callback().set(FUNC(univac_state::sio_wrdyb_w));
/* Sound */
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("beeper", BEEP, 950) // guess
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.05)
-MACHINE_CONFIG_END
+ SPEAKER_SOUND(config, m_alarm).add_route(ALL_OUTPUTS, "mono", 0.05);
+
+ UTS_KEYBOARD(config, m_keyboard, uts20_keyboards, "extw");
+ m_keyboard->rxd_callback().set(FUNC(univac_state::aux_rxd_w));
+
+ RS232_PORT(config, m_printer, default_rs232_devices, nullptr);
+ m_printer->dcd_handler().set(FUNC(univac_state::aux_dsr_w));
+}
-MACHINE_CONFIG_START(univac_state::uts10)
+void univac_state::uts10(machine_config &config)
+{
uts20(config);
- MCFG_DEVICE_MODIFY( "maincpu" )
- MCFG_DEVICE_PROGRAM_MAP(uts10_map)
-MACHINE_CONFIG_END
+ m_maincpu->set_addrmap(AS_PROGRAM, &univac_state::uts10_map);
+ m_maincpu->set_addrmap(AS_IO, &univac_state::uts10_io_map);
+
+ config.device_remove("keybclk");
+ m_ctc->zc_callback<2>().set(m_sio, FUNC(z80sio_device::rxtxcb_w));
+
+ config.device_remove("latch_40");
+ subdevice<ls259_device>("latch_c0")->q_out_cb<6>().set_nop();
+ subdevice<ls259_device>("latch_e0")->q_out_cb<7>().set(FUNC(univac_state::sio_loopback_w)).invert();
+
+ UTS_KEYBOARD(config.replace(), m_keyboard, uts10_keyboards, "extw");
+ m_keyboard->rxd_callback().set(FUNC(univac_state::aux_rxd_w));
+}
/* ROM definition */
@@ -453,9 +660,6 @@ ROM_START( uts10 )
ROM_REGION( 0x0800, "chargen", 0 ) // possibly some bitrot, see h,m,n in F4 displayer
ROM_LOAD( "chr_5565.bin", 0x0000, 0x0800, CRC(7d99744f) SHA1(2db330ca94a91f7b2ac2ac088ae9255f5bb0a7b4) )
-
- ROM_REGION( 0x0800, "keyboard", 0 )
- ROM_LOAD( "2716264.bin", 0x0000, 0x0800, CRC(75e188aa) SHA1(a6486576525f7eec617fd7f9db469063f8c357fc) )
ROM_END
ROM_START( uts20 )
@@ -469,14 +673,10 @@ ROM_START( uts20 )
// character generator not dumped, using the one from 'UTS10' for now
ROM_REGION( 0x0800, "chargen", 0 )
ROM_LOAD( "chr_5565.bin", 0x0000, 0x0800, BAD_DUMP CRC(7d99744f) SHA1(2db330ca94a91f7b2ac2ac088ae9255f5bb0a7b4) )
-
- // keyboard not dumped, using the one from 'UTS10' for now. The keyboard looks the same, and is most likely identical.
- ROM_REGION( 0x0800, "keyboard", 0 )
- ROM_LOAD( "2716264.bin", 0x0000, 0x0800, BAD_DUMP CRC(75e188aa) SHA1(a6486576525f7eec617fd7f9db469063f8c357fc) )
ROM_END
/* Driver */
// YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS
-COMP( 1979?, uts10, uts20, 0, uts10, uts20, univac_state, empty_init, "Sperry Univac", "UTS-10", MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE )
+COMP( 1981, uts10, uts20, 0, uts10, uts20, univac_state, empty_init, "Sperry Univac", "UTS-10", MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE )
COMP( 1980, uts20, 0, 0, uts20, uts20, univac_state, empty_init, "Sperry Univac", "UTS-20", MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE )
diff --git a/src/mame/drivers/unixpc.cpp b/src/mame/drivers/unixpc.cpp
index 56bad603b5d..a85c694d87a 100644
--- a/src/mame/drivers/unixpc.cpp
+++ b/src/mame/drivers/unixpc.cpp
@@ -20,13 +20,15 @@
#include "bus/centronics/ctronics.h"
#include "bus/rs232/rs232.h"
#include "imagedev/floppy.h"
+#include "imagedev/harddriv.h"
#include "machine/6850acia.h"
#include "machine/74259.h"
#include "machine/bankdev.h"
+#include "machine/input_merger.h"
#include "machine/output_latch.h"
#include "machine/ram.h"
//#include "machine/tc8250.h"
-//#include "machine/wd1010.h"
+#include "machine/wd1010.h"
#include "machine/wd_fdc.h"
#include "machine/z80sio.h"
#include "emupal.h"
@@ -47,9 +49,12 @@ public:
m_maincpu(*this, "maincpu"),
m_gcr(*this, "gcr"),
m_tcr(*this, "tcr"),
+ m_int02(*this, "int02"),
m_ram(*this, RAM_TAG),
m_wd2797(*this, "wd2797"),
m_floppy(*this, "wd2797:0:525dd"),
+ m_hdc(*this, "hdc"),
+ m_hdr0(*this, "hdc:0"),
m_ramrombank(*this, "ramrombank"),
m_mapram(*this, "mapram"),
m_videoram(*this, "videoram")
@@ -84,6 +89,8 @@ private:
DECLARE_WRITE_LINE_MEMBER(wd2797_intrq_w);
DECLARE_WRITE_LINE_MEMBER(wd2797_drq_w);
+ DECLARE_WRITE_LINE_MEMBER(wd1010_intrq_w);
+
void ramrombank_map(address_map &map);
void unixpc_mem(address_map &map);
@@ -91,9 +98,12 @@ private:
required_device<cpu_device> m_maincpu;
required_device<ls259_device> m_gcr;
required_device<ls259_device> m_tcr;
+ required_device<input_merger_device> m_int02;
required_device<ram_device> m_ram;
required_device<wd2797_device> m_wd2797;
required_device<floppy_image_device> m_floppy;
+ required_device<wd1010_device> m_hdc;
+ required_device<harddisk_image_device> m_hdr0;
required_device<address_map_bank_device> m_ramrombank;
required_shared_ptr<uint16_t> m_mapram;
@@ -104,6 +114,7 @@ private:
uint16_t m_diskdmasize;
uint32_t m_diskdmaptr;
bool m_fdc_intrq;
+ bool m_hdc_intrq;
};
@@ -205,7 +216,7 @@ READ16_MEMBER(unixpc_state::line_printer_r)
data |= 1; // no dial tone detected
data |= 1 << 1; // no parity error
- data |= 0 << 2; // hdc intrq
+ data |= m_hdc_intrq ? 1<<2 : 0<<2;
data |= m_fdc_intrq ? 1<<3 : 0<<3;
//logerror("line_printer_r: %04x\n", data);
@@ -253,6 +264,13 @@ WRITE16_MEMBER(unixpc_state::disk_control_w)
{
logerror("disk_control_w: %04x\n", data);
+ // TODO: bits 0-2 = head select
+
+ m_hdc->drdy_w(BIT(data, 3) && m_hdr0->exists());
+
+ if (!BIT(data, 4))
+ m_hdc->reset();
+
m_floppy->mon_w(!BIT(data, 5));
// bit 6 = floppy selected / not selected
@@ -266,6 +284,7 @@ WRITE_LINE_MEMBER(unixpc_state::wd2797_intrq_w)
{
logerror("wd2797_intrq_w: %d\n", state);
m_fdc_intrq = state;
+ m_int02->in_w<1>(state);
}
WRITE_LINE_MEMBER(unixpc_state::wd2797_drq_w)
@@ -273,6 +292,15 @@ WRITE_LINE_MEMBER(unixpc_state::wd2797_drq_w)
logerror("wd2797_drq_w: %d\n", state);
}
+/***************************************************************************
+ HARD DISK
+***************************************************************************/
+
+WRITE_LINE_MEMBER(unixpc_state::wd1010_intrq_w)
+{
+ m_hdc_intrq = state;
+ m_int02->in_w<0>(state);
+}
/***************************************************************************
VIDEO
@@ -308,7 +336,7 @@ void unixpc_state::unixpc_mem(address_map &map)
map(0x4d0000, 0x4d7fff).w(FUNC(unixpc_state::diskdma_ptr_w));
map(0x4e0000, 0x4e0001).w(FUNC(unixpc_state::disk_control_w));
map(0x4f0001, 0x4f0001).w("printlatch", FUNC(output_latch_device::bus_w));
- //map(0xe00000, 0xe0000f).rw("hdc", FUNC(wd1010_device::read), FUNC(wd1010_device::write)).umask16(0x00ff);
+ map(0xe00000, 0xe0000f).rw(m_hdc, FUNC(wd1010_device::read), FUNC(wd1010_device::write)).umask16(0x00ff);
map(0xe10000, 0xe10007).rw(m_wd2797, FUNC(wd_fdc_device_base::read), FUNC(wd_fdc_device_base::write)).umask16(0x00ff);
map(0xe30000, 0xe30001).r(FUNC(unixpc_state::rtc_r));
map(0xe40000, 0xe40001).select(0x7000).w(FUNC(unixpc_state::gcr_w));
@@ -340,10 +368,11 @@ static void unixpc_floppies(device_slot_interface &device)
device.option_add("525dd", FLOPPY_525_DD);
}
-MACHINE_CONFIG_START(unixpc_state::unixpc)
+void unixpc_state::unixpc(machine_config &config)
+{
// basic machine hardware
- MCFG_DEVICE_ADD("maincpu", M68010, 40_MHz_XTAL / 4)
- MCFG_DEVICE_PROGRAM_MAP(unixpc_mem)
+ M68010(config, m_maincpu, 40_MHz_XTAL / 4);
+ m_maincpu->set_addrmap(AS_PROGRAM, &unixpc_state::unixpc_mem);
LS259(config, m_gcr); // 7K
m_gcr->q_out_cb<0>().set(FUNC(unixpc_state::error_enable_w));
@@ -353,6 +382,9 @@ MACHINE_CONFIG_START(unixpc_state::unixpc)
LS259(config, m_tcr); // 10K
+ INPUT_MERGER_ANY_HIGH(config, m_int02); // 26H pins 3-6
+ m_int02->output_handler().set_inputline(m_maincpu, M68K_IRQ_2);
+
output_latch_device &mreg(OUTPUT_LATCH(config, "mreg"));
mreg.bit_handler<0>().set_output("led_0").invert();
mreg.bit_handler<1>().set_output("led_1").invert();
@@ -364,10 +396,10 @@ MACHINE_CONFIG_START(unixpc_state::unixpc)
// bit 7 (D15) = VBL ack (must go high-low-high to ack)
// video hardware
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_UPDATE_DRIVER(unixpc_state, screen_update)
- MCFG_SCREEN_RAW_PARAMS(40_MHz_XTAL / 2, 896, 0, 720, 367, 0, 348)
- MCFG_SCREEN_PALETTE("palette")
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_screen_update(FUNC(unixpc_state::screen_update));
+ screen.set_raw(40_MHz_XTAL / 2, 896, 0, 720, 367, 0, 348);
+ screen.set_palette("palette");
// vsync should actually last 17264 pixels
config.set_default_layout(layout_unixpc);
@@ -384,29 +416,33 @@ MACHINE_CONFIG_START(unixpc_state::unixpc)
WD2797(config, m_wd2797, 40_MHz_XTAL / 40); // 1PCK (CPU clock) divided by custom DMA chip
m_wd2797->intrq_wr_callback().set(FUNC(unixpc_state::wd2797_intrq_w));
m_wd2797->drq_wr_callback().set(FUNC(unixpc_state::wd2797_drq_w));
- MCFG_FLOPPY_DRIVE_ADD("wd2797:0", unixpc_floppies, "525dd", floppy_image_device::default_floppy_formats)
+ FLOPPY_CONNECTOR(config, "wd2797:0", unixpc_floppies, "525dd", floppy_image_device::default_floppy_formats);
- upd7201_new_device& mpsc(UPD7201_NEW(config, "mpsc", 19.6608_MHz_XTAL / 8));
+ WD1010(config, m_hdc, 40_MHz_XTAL / 8);
+ m_hdc->out_intrq_callback().set(FUNC(unixpc_state::wd1010_intrq_w));
+ HARDDISK(config, m_hdr0, 0);
+
+ upd7201_new_device &mpsc(UPD7201_NEW(config, "mpsc", 19.6608_MHz_XTAL / 8));
mpsc.out_txda_callback().set("rs232", FUNC(rs232_port_device::write_txd));
mpsc.out_dtra_callback().set("rs232", FUNC(rs232_port_device::write_dtr));
mpsc.out_rtsa_callback().set("rs232", FUNC(rs232_port_device::write_rts));
+ mpsc.out_int_callback().set_inputline(m_maincpu, M68K_IRQ_4);
- MCFG_DEVICE_ADD("kbc", ACIA6850, 0)
-
- // TODO: HDC
- //MCFG_DEVICE_ADD("hdc", WD1010, 40_MHz_XTAL / 8)
+ acia6850_device &kbc(ACIA6850(config, "kbc", 0));
+ kbc.irq_handler().set_inputline(m_maincpu, M68K_IRQ_3);
// TODO: RTC
- //MCFG_DEVICE_ADD("rtc", TC8250, 32.768_kHz_XTAL)
+ //TC8250(config, "rtc", 32.768_kHz_XTAL);
rs232_port_device &rs232(RS232_PORT(config, "rs232", default_rs232_devices, nullptr));
rs232.rxd_handler().set("mpsc", FUNC(upd7201_new_device::rxa_w));
rs232.dsr_handler().set("mpsc", FUNC(upd7201_new_device::dcda_w));
rs232.cts_handler().set("mpsc", FUNC(upd7201_new_device::ctsa_w));
- MCFG_DEVICE_ADD("printer", CENTRONICS, centronics_devices, nullptr)
- MCFG_CENTRONICS_OUTPUT_LATCH_ADD("printlatch", "printer")
-MACHINE_CONFIG_END
+ centronics_device &printer(CENTRONICS(config, "printer", centronics_devices, nullptr));
+ output_latch_device &printlatch(OUTPUT_LATCH(config, "printlatch"));
+ printer.set_output_latch(printlatch);
+}
/***************************************************************************
diff --git a/src/mame/drivers/unkhorse.cpp b/src/mame/drivers/unkhorse.cpp
index cb7067d6d73..ff964588507 100644
--- a/src/mame/drivers/unkhorse.cpp
+++ b/src/mame/drivers/unkhorse.cpp
@@ -192,12 +192,12 @@ INPUT_PORTS_END
***************************************************************************/
-MACHINE_CONFIG_START(horse_state::horse)
-
+void horse_state::horse(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", I8085A, XTAL(12'000'000) / 2)
- MCFG_DEVICE_PROGRAM_MAP(horse_map)
- MCFG_DEVICE_IO_MAP(horse_io_map)
+ I8085A(config, m_maincpu, XTAL(12'000'000) / 2);
+ m_maincpu->set_addrmap(AS_PROGRAM, &horse_state::horse_map);
+ m_maincpu->set_addrmap(AS_IO, &horse_state::horse_io_map);
i8155_device &i8155(I8155(config, "i8155", XTAL(12'000'000) / 4)); // port A input, B output, C output but unused
i8155.in_pa_callback().set(FUNC(horse_state::input_r));
@@ -205,21 +205,20 @@ MACHINE_CONFIG_START(horse_state::horse)
i8155.out_to_callback().set("speaker", FUNC(speaker_sound_device::level_w));
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(32*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 1*8, 31*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(horse_state, screen_update)
- MCFG_SCREEN_VBLANK_CALLBACK(INPUTLINE("maincpu", I8085_RST75_LINE))
- MCFG_SCREEN_PALETTE("palette")
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(32*8, 32*8);
+ screen.set_visarea(0*8, 32*8-1, 1*8, 31*8-1);
+ screen.set_screen_update(FUNC(horse_state::screen_update));
+ screen.screen_vblank().set_inputline(m_maincpu, I8085_RST75_LINE);
+ screen.set_palette("palette");
PALETTE(config, "palette", palette_device::BGR_3BIT);
/* sound hardware */
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("speaker", SPEAKER_SOUND)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25)
-MACHINE_CONFIG_END
+ SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25);
+}
diff --git a/src/mame/drivers/unkpoker.cpp b/src/mame/drivers/unkpoker.cpp
new file mode 100644
index 00000000000..c5b3462dc42
--- /dev/null
+++ b/src/mame/drivers/unkpoker.cpp
@@ -0,0 +1,173 @@
+// license:BSD-3-Clause
+// copyright-holders:
+/****************************************************************************************
+
+Unknown Color Poker Game
+------------------------------
+
+8080A CPU
+
+Four 2716 eproms
+
+Six 2102 Rams
+
+Two 2112 Rams
+
+Two 5101 Rams (Low Power Versions, one connected to Battery)
+
+Four position DIP Switch - DIP 1 changes on screen text from
+normal to high lighted as seen pics. Other DIPS unknown.
+
+Sound?
+
+Date of manufacture unknown. Latest date codes on logic chips is 1980.
+
+Chaneman 3/20/2019
+
+
+TODO: everything
+
+*******************************************************************************************/
+
+#include "emu.h"
+#include "cpu/i8085/i8085.h"
+#include "machine/nvram.h"
+
+#include "screen.h"
+#include "emupal.h"
+#include "speaker.h"
+
+class unkpoker_state : public driver_device
+{
+public:
+ unkpoker_state(const machine_config &mconfig, device_type type, const char *tag)
+ : driver_device(mconfig, type, tag),
+ m_maincpu(*this,"maincpu"),
+ m_videoram(*this, "videoram"),
+ m_chargen(*this, "gfx1")
+ { }
+
+ void unkpoker(machine_config &config);
+
+private:
+ uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
+
+ void mem_map(address_map &map);
+ void io_map(address_map &map);
+
+ required_device<cpu_device> m_maincpu;
+ required_shared_ptr<uint8_t> m_videoram;
+ required_region_ptr<u8> m_chargen;
+};
+
+
+uint32_t unkpoker_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) // taken from video21.cpp
+{
+ uint16_t sy = 0, ma = 0;
+
+ for (uint8_t y = 0; y < 28; y++)
+ {
+ for (uint8_t ra = 0; ra < 8; ra++)
+ {
+ uint16_t *p = &bitmap.pix16(sy++);
+
+ for (uint16_t x = 0; x < 32; x++)
+ {
+ uint8_t chr = m_videoram[x + ma] & 0x7f;
+ uint8_t gfx = m_chargen[(chr << 3) | ra];
+
+ /* Display a scanline of a character */
+ *p++ = BIT(gfx, 7);
+ *p++ = BIT(gfx, 6);
+ *p++ = BIT(gfx, 5);
+ *p++ = BIT(gfx, 4);
+ *p++ = BIT(gfx, 3);
+ *p++ = BIT(gfx, 2);
+ *p++ = BIT(gfx, 1);
+ *p++ = BIT(gfx, 0);
+ }
+ }
+ ma += 32;
+ }
+ return 0;
+}
+
+
+void unkpoker_state::mem_map(address_map &map) {
+ map(0x0000,0x0fff).rom();
+ map(0x1000,0x1fff).ram();
+ map(0x8000,0x83ff).ram().share("videoram");
+}
+
+void unkpoker_state::io_map(address_map &map) {
+ map(0x01,0x01).portr("IN");
+ map(0x02,0x02).portr("DSW");
+}
+
+
+static INPUT_PORTS_START( unkpoker )
+ PORT_START("IN")
+ PORT_BIT( 0xff, IP_ACTIVE_LOW, IPT_UNKNOWN )
+
+ PORT_START("DSW")
+ PORT_DIPUNKNOWN_DIPLOC(0x01, 0x01, "DSW:1")
+ PORT_DIPUNKNOWN_DIPLOC(0x02, 0x02, "DSW:2")
+ PORT_DIPUNKNOWN_DIPLOC(0x04, 0x04, "DSW:3")
+ PORT_DIPUNKNOWN_DIPLOC(0x08, 0x08, "DSW:4")
+INPUT_PORTS_END
+
+
+static const gfx_layout tiles8x8_layout =
+{
+ 8,8,
+ RGN_FRAC(1,1),
+ 1,
+ { 0 },
+ { 0, 1, 2, 3, 4, 5, 6, 7 },
+ { 0*8, 1*8, 2*8, 3*8, 4*8, 5*8, 6*8, 7*8 },
+ 8*8
+};
+
+
+static GFXDECODE_START( gfx_unkpoker )
+ GFXDECODE_ENTRY( "gfx1", 0, tiles8x8_layout, 0, 1 )
+GFXDECODE_END
+
+
+void unkpoker_state::unkpoker(machine_config &config)
+{
+ /* basic machine hardware */
+ I8080A(config, m_maincpu, 2000000); // guessed
+ m_maincpu->set_addrmap(AS_PROGRAM, &unkpoker_state::mem_map);
+ m_maincpu->set_addrmap(AS_IO, &unkpoker_state::io_map);
+
+ //NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
+
+ /* video hardware */
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(256, 256);
+ screen.set_visarea(0, 255, 0, 255);
+ screen.set_screen_update(FUNC(unkpoker_state::screen_update));
+ screen.set_palette("palette");
+
+ GFXDECODE(config, "gfxdecode", "palette", gfx_unkpoker);
+ PALETTE(config, "palette", palette_device::RGB_3BIT);
+
+ /* sound hardware */
+ SPEAKER(config, "mono").front_center();
+}
+
+
+ROM_START( unkpoker )
+ ROM_REGION( 0x1000, "maincpu", 0 )
+ ROM_LOAD( "cdpat.13b", 0x0000, 0x0800, CRC(c3f3040f) SHA1(ed1916bcd9e1e80502fcff5ddd599c101a226e7c) )
+ ROM_LOAD( "cdpat.11b", 0x0800, 0x0800, CRC(16a97398) SHA1(737192dd0e1b3083f1facd327a83d98a0b7f4d66) )
+
+ ROM_REGION( 0x1000, "gfx1", 0 )
+ ROM_LOAD( "cd.3b", 0x0000, 0x0800, CRC(e3997d7d) SHA1(6c595c70afedc7aef024215d153fe31b418adc25) )
+ ROM_LOAD( "cd.3c", 0x0800, 0x0800, CRC(b61adb76) SHA1(9805593fc6d9b01e4a63bfc35e5442c4c547c103) )
+ROM_END
+
+GAME(1980?, unkpoker, 0, unkpoker, unkpoker, unkpoker_state, empty_init, ROT0, "<unknown>", "unknown 1980 poker game", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_SUPPORTS_SAVE)
diff --git a/src/mame/drivers/upscope.cpp b/src/mame/drivers/upscope.cpp
index 0553e1cb805..d12d9d1eb09 100644
--- a/src/mame/drivers/upscope.cpp
+++ b/src/mame/drivers/upscope.cpp
@@ -265,11 +265,11 @@ INPUT_PORTS_END
*
*************************************/
-MACHINE_CONFIG_START(upscope_state::upscope)
-
+void upscope_state::upscope(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M68000, amiga_state::CLK_7M_NTSC)
- MCFG_DEVICE_PROGRAM_MAP(main_map)
+ M68000(config, m_maincpu, amiga_state::CLK_7M_NTSC);
+ m_maincpu->set_addrmap(AS_PROGRAM, &upscope_state::main_map);
ADDRESS_MAP_BANK(config, "overlay").set_map(&amiga_state::overlay_512kb_map).set_options(ENDIANNESS_BIG, 16, 22, 0x200000);
@@ -295,15 +295,16 @@ MACHINE_CONFIG_START(upscope_state::upscope)
paula.int_cb().set(FUNC(amiga_state::paula_int_w));
/* cia */
- MCFG_DEVICE_ADD("cia_0", MOS8520, amiga_state::CLK_E_NTSC)
- MCFG_MOS6526_IRQ_CALLBACK(WRITELINE(*this, amiga_state, cia_0_irq))
- MCFG_MOS6526_PA_OUTPUT_CALLBACK(WRITE8(*this, amiga_state, cia_0_port_a_write))
- MCFG_MOS6526_PB_INPUT_CALLBACK(READ8(*this, upscope_state, upscope_cia_0_portb_r))
- MCFG_MOS6526_PB_OUTPUT_CALLBACK(WRITE8(*this, upscope_state, upscope_cia_0_portb_w))
- MCFG_DEVICE_ADD("cia_1", MOS8520, amiga_state::CLK_E_NTSC)
- MCFG_MOS6526_IRQ_CALLBACK(WRITELINE(*this, amiga_state, cia_1_irq))
- MCFG_MOS6526_PA_INPUT_CALLBACK(READ8(*this, upscope_state, upscope_cia_1_porta_r))
- MCFG_MOS6526_PA_OUTPUT_CALLBACK(WRITE8(*this, upscope_state, upscope_cia_1_porta_w))
+ MOS8520(config, m_cia_0, amiga_state::CLK_E_NTSC);
+ m_cia_0->irq_wr_callback().set(FUNC(amiga_state::cia_0_irq));
+ m_cia_0->pa_wr_callback().set(FUNC(amiga_state::cia_0_port_a_write));
+ m_cia_0->pb_rd_callback().set(FUNC(upscope_state::upscope_cia_0_portb_r));
+ m_cia_0->pb_wr_callback().set(FUNC(upscope_state::upscope_cia_0_portb_w));
+
+ MOS8520(config, m_cia_1, amiga_state::CLK_E_NTSC);
+ m_cia_1->irq_wr_callback().set(FUNC(amiga_state::cia_1_irq));
+ m_cia_1->pa_rd_callback().set(FUNC(upscope_state::upscope_cia_1_porta_r));
+ m_cia_1->pa_wr_callback().set(FUNC(upscope_state::upscope_cia_1_porta_w));
/* fdc */
AMIGA_FDC(config, m_fdc, amiga_state::CLK_7M_NTSC);
@@ -318,7 +319,7 @@ MACHINE_CONFIG_START(upscope_state::upscope)
m_ppi->in_pa_callback().set_ioport("IO0");
m_ppi->out_pb_callback().set(FUNC(upscope_state::lamps_w));
m_ppi->out_pc_callback().set(FUNC(upscope_state::coin_counter_w));
-MACHINE_CONFIG_END
+}
diff --git a/src/mame/drivers/usbilliards.cpp b/src/mame/drivers/usbilliards.cpp
index e77e5423ad5..059953d747a 100644
--- a/src/mame/drivers/usbilliards.cpp
+++ b/src/mame/drivers/usbilliards.cpp
@@ -89,20 +89,21 @@ void usbilliards_state::video_start()
{
}
-MACHINE_CONFIG_START(usbilliards_state::usbilliards)
-
+void usbilliards_state::usbilliards(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", NETLIST_CPU, NETLIST_CLOCK)
- MCFG_NETLIST_SETUP(usbilliards)
+ NETLIST_CPU(config, m_maincpu, NETLIST_CLOCK);
+ m_maincpu->set_constructor(netlist_usbilliards);
/* video hardware */
- MCFG_FIXFREQ_ADD("fixfreq", "screen")
- MCFG_FIXFREQ_MONITOR_CLOCK(MASTER_CLOCK)
- MCFG_FIXFREQ_HORZ_PARAMS(H_TOTAL-67,H_TOTAL-40,H_TOTAL-8,H_TOTAL)
- MCFG_FIXFREQ_VERT_PARAMS(V_TOTAL-22,V_TOTAL-19,V_TOTAL-12,V_TOTAL)
- MCFG_FIXFREQ_FIELDCOUNT(1)
- MCFG_FIXFREQ_SYNC_THRESHOLD(0.30)
-MACHINE_CONFIG_END
+ SCREEN(config, "screen", SCREEN_TYPE_RASTER);
+ FIXFREQ(config, m_video).set_screen("screen");
+ m_video->set_monitor_clock(MASTER_CLOCK);
+ m_video->set_horz_params(H_TOTAL-67,H_TOTAL-40,H_TOTAL-8,H_TOTAL);
+ m_video->set_vert_params(V_TOTAL-22,V_TOTAL-19,V_TOTAL-12,V_TOTAL);
+ m_video->set_fieldcount(1);
+ m_video->set_threshold(0.30);
+}
/***************************************************************************
diff --git a/src/mame/drivers/usgames.cpp b/src/mame/drivers/usgames.cpp
index 3e2e6645fd1..b5474d0938f 100644
--- a/src/mame/drivers/usgames.cpp
+++ b/src/mame/drivers/usgames.cpp
@@ -218,23 +218,23 @@ static GFXDECODE_START( gfx_usgames )
GFXDECODE_END
-MACHINE_CONFIG_START(usgames_state::usg32)
-
+void usgames_state::usg32(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", MC6809, 18_MHz_XTAL / 3) // 68B09P (divider not verified)
- MCFG_DEVICE_PROGRAM_MAP(usgames_map)
- MCFG_DEVICE_PERIODIC_INT_DRIVER(usgames_state, irq0_line_hold, 5*60) /* ?? */
+ MC6809(config, m_maincpu, 18_MHz_XTAL / 3); // 68B09P (divider not verified)
+ m_maincpu->set_addrmap(AS_PROGRAM, &usgames_state::usgames_map);
+ m_maincpu->set_periodic_int(FUNC(usgames_state::irq0_line_hold), attotime::from_hz(5*60)); /* ?? */
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */)
- MCFG_SCREEN_SIZE(64*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(7*8, 57*8-1, 0*8, 31*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(usgames_state, screen_update)
- MCFG_SCREEN_PALETTE("palette")
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500) /* not accurate */);
+ screen.set_size(64*8, 32*8);
+ screen.set_visarea(7*8, 57*8-1, 0*8, 31*8-1);
+ screen.set_screen_update(FUNC(usgames_state::screen_update));
+ screen.set_palette("palette");
GFXDECODE(config, m_gfxdecode, "palette", gfx_usgames);
PALETTE(config, "palette", FUNC(usgames_state::usgames_palette), 2*256);
@@ -248,13 +248,13 @@ MACHINE_CONFIG_START(usgames_state::usg32)
SPEAKER(config, "mono").front_center();
AY8912(config, "aysnd", 2000000).add_route(ALL_OUTPUTS, "mono", 0.30);
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(usgames_state::usg185)
+void usgames_state::usg185(machine_config &config)
+{
usg32(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(usg185_map)
-MACHINE_CONFIG_END
+ m_maincpu->set_addrmap(AS_PROGRAM, &usgames_state::usg185_map);
+}
ROM_START( usg32 )
diff --git a/src/mame/drivers/ut88.cpp b/src/mame/drivers/ut88.cpp
index 3e03cdf4a33..125ceb65ca6 100644
--- a/src/mame/drivers/ut88.cpp
+++ b/src/mame/drivers/ut88.cpp
@@ -187,33 +187,35 @@ static INPUT_PORTS_START( ut88mini )
INPUT_PORTS_END
/* Machine driver */
-MACHINE_CONFIG_START(ut88_state::ut88)
+void ut88_state::ut88(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", I8080, 2000000)
- MCFG_DEVICE_PROGRAM_MAP(ut88_mem)
- MCFG_DEVICE_IO_MAP(ut88_io)
+ I8080(config, m_maincpu, 2000000);
+ m_maincpu->set_addrmap(AS_PROGRAM, &ut88_state::ut88_mem);
+ m_maincpu->set_addrmap(AS_IO, &ut88_state::ut88_io);
MCFG_MACHINE_RESET_OVERRIDE(ut88_state, ut88 )
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(50)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */
- MCFG_SCREEN_SIZE(64*8, 28*8)
- MCFG_SCREEN_VISIBLE_AREA(0, 64*8-1, 0, 28*8-1)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(50);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */
+ screen.set_size(64*8, 28*8);
+ screen.set_visarea(0, 64*8-1, 0, 28*8-1);
+ screen.set_screen_update(FUNC(ut88_state::screen_update_ut88));
+ screen.set_palette(m_palette);
+
MCFG_VIDEO_START_OVERRIDE(ut88_state,ut88)
- MCFG_SCREEN_UPDATE_DRIVER(ut88_state, screen_update_ut88)
- MCFG_SCREEN_PALETTE(m_palette)
PALETTE(config, m_palette, palette_device::MONOCHROME);
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_ut88)
+ GFXDECODE(config, m_gfxdecode, m_palette, gfx_ut88);
/* audio hardware */
SPEAKER(config, "speaker").front_center();
DAC_1BIT(config, "dac", 0).add_route(ALL_OUTPUTS, "speaker", 0.25);
- MCFG_DEVICE_ADD("vref", VOLTAGE_REGULATOR, 0) MCFG_VOLTAGE_REGULATOR_OUTPUT(5.0)
- MCFG_SOUND_ROUTE(0, "dac", 1.0, DAC_VREF_POS_INPUT)
+ voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref", 0));
+ vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT);
- WAVE(config, "wave", "cassette").add_route(ALL_OUTPUTS, "speaker", 0.25);
+ WAVE(config, "wave", m_cassette).add_route(ALL_OUTPUTS, "speaker", 0.25);
/* Devices */
I8255A(config, m_ppi);
@@ -221,19 +223,20 @@ MACHINE_CONFIG_START(ut88_state::ut88)
m_ppi->in_pb_callback().set(FUNC(ut88_state::ut88_8255_portb_r));
m_ppi->in_pc_callback().set(FUNC(ut88_state::ut88_8255_portc_r));
- MCFG_CASSETTE_ADD( "cassette" )
- MCFG_CASSETTE_FORMATS(rku_cassette_formats)
- MCFG_CASSETTE_DEFAULT_STATE(CASSETTE_STOPPED | CASSETTE_SPEAKER_ENABLED | CASSETTE_MOTOR_ENABLED)
- MCFG_CASSETTE_INTERFACE("ut88_cass")
+ CASSETTE(config, m_cassette);
+ m_cassette->set_formats(rku_cassette_formats);
+ m_cassette->set_default_state(CASSETTE_STOPPED | CASSETTE_SPEAKER_ENABLED | CASSETTE_MOTOR_ENABLED);
+ m_cassette->set_interface("ut88_cass");
- MCFG_SOFTWARE_LIST_ADD("cass_list","ut88")
-MACHINE_CONFIG_END
+ SOFTWARE_LIST(config, "cass_list").set_original("ut88");
+}
-MACHINE_CONFIG_START(ut88_state::ut88mini)
+void ut88_state::ut88mini(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", I8080, 2000000)
- MCFG_DEVICE_PROGRAM_MAP(ut88mini_mem)
- MCFG_DEVICE_IO_MAP(ut88mini_io)
+ I8080(config, m_maincpu, 2000000);
+ m_maincpu->set_addrmap(AS_PROGRAM, &ut88_state::ut88mini_mem);
+ m_maincpu->set_addrmap(AS_IO, &ut88_state::ut88mini_io);
MCFG_MACHINE_START_OVERRIDE(ut88_state,ut88mini)
MCFG_MACHINE_RESET_OVERRIDE(ut88_state, ut88mini )
@@ -242,15 +245,15 @@ MACHINE_CONFIG_START(ut88_state::ut88mini)
/* Cassette */
SPEAKER(config, "speaker").front_center();
- WAVE(config, "wave", "cassette").add_route(ALL_OUTPUTS, "speaker", 0.25);
+ WAVE(config, "wave", m_cassette).add_route(ALL_OUTPUTS, "speaker", 0.25);
- MCFG_CASSETTE_ADD( "cassette" )
- MCFG_CASSETTE_FORMATS(rku_cassette_formats)
- MCFG_CASSETTE_DEFAULT_STATE(CASSETTE_STOPPED | CASSETTE_SPEAKER_ENABLED | CASSETTE_MOTOR_ENABLED)
- MCFG_CASSETTE_INTERFACE("ut88_cass")
+ CASSETTE(config, m_cassette);
+ m_cassette->set_formats(rku_cassette_formats);
+ m_cassette->set_default_state(CASSETTE_STOPPED | CASSETTE_SPEAKER_ENABLED | CASSETTE_MOTOR_ENABLED);
+ m_cassette->set_interface("ut88_cass");
- MCFG_SOFTWARE_LIST_ADD("cass_list","ut88")
-MACHINE_CONFIG_END
+ SOFTWARE_LIST(config, "cass_list").set_original("ut88");
+}
/* ROM definition */
ROM_START( ut88 )
diff --git a/src/mame/drivers/uzebox.cpp b/src/mame/drivers/uzebox.cpp
index be6dd2152c2..806c1a92e70 100644
--- a/src/mame/drivers/uzebox.cpp
+++ b/src/mame/drivers/uzebox.cpp
@@ -87,7 +87,7 @@ void uzebox_state::machine_start()
m_screen->register_screen_bitmap(m_bitmap);
if (m_cart->exists())
- m_maincpu->space(AS_PROGRAM).install_read_handler(0x0000, 0xffff, read8_delegate(FUNC(generic_slot_device::read_rom),(generic_slot_device*)m_cart));
+ m_maincpu->space(AS_PROGRAM).install_read_handler(0x0000, 0xffff, read8sm_delegate(FUNC(generic_slot_device::read_rom),(generic_slot_device*)m_cart));
}
void uzebox_state::machine_reset()
diff --git a/src/mame/drivers/v100.cpp b/src/mame/drivers/v100.cpp
index b2942051599..6a58c9d1a09 100644
--- a/src/mame/drivers/v100.cpp
+++ b/src/mame/drivers/v100.cpp
@@ -12,12 +12,14 @@
***********************************************************************************************************************************/
#include "emu.h"
+#include "bus/rs232/rs232.h"
#include "cpu/z80/z80.h"
#include "machine/com8116.h"
#include "machine/er1400.h"
#include "machine/i8214.h"
#include "machine/i8251.h"
#include "machine/i8255.h"
+#include "machine/input_merger.h"
#include "video/tms9927.h"
#include "screen.h"
@@ -35,6 +37,7 @@ public:
, m_usart(*this, "usart%u", 1)
, m_earom(*this, "earom")
, m_picu(*this, "picu")
+ , m_modem(*this, "modem")
, m_p_chargen(*this, "chargen")
, m_videoram(*this, "videoram")
, m_key_row(*this, "ROW%u", 0)
@@ -43,7 +46,7 @@ public:
void v100(machine_config &config);
private:
- DECLARE_READ8_MEMBER(earom_r);
+ u8 status_r();
DECLARE_WRITE8_MEMBER(port30_w);
DECLARE_READ8_MEMBER(keyboard_r);
DECLARE_WRITE8_MEMBER(key_row_w);
@@ -51,7 +54,7 @@ private:
DECLARE_WRITE8_MEMBER(picu_w);
template<int N> DECLARE_WRITE_LINE_MEMBER(picu_r_w);
IRQ_CALLBACK_MEMBER(irq_ack);
- DECLARE_WRITE8_MEMBER(ppi_porta_w);
+ void ppi_porta_w(u8 data);
u32 screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
@@ -66,16 +69,18 @@ private:
required_device_array<i8251_device, 2> m_usart;
required_device<er1400_device> m_earom;
required_device<i8214_device> m_picu;
+ required_device<rs232_port_device> m_modem;
required_region_ptr<u8> m_p_chargen;
required_shared_ptr<u8> m_videoram;
optional_ioport_array<16> m_key_row;
u8 m_active_row;
+ bool m_video_enable;
};
u32 v100_state::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect)
{
- if (m_vtac->screen_reset())
+ if (m_vtac->screen_reset() || !m_video_enable)
{
bitmap.fill(rgb_t::black(), cliprect);
return 0;
@@ -145,17 +150,22 @@ void v100_state::machine_start()
{
m_picu->inte_w(1);
m_picu->etlg_w(1);
-
- m_usart[0]->write_cts(0);
m_usart[1]->write_cts(0);
m_active_row = 0;
+ m_video_enable = false;
save_item(NAME(m_active_row));
+ save_item(NAME(m_video_enable));
}
-READ8_MEMBER(v100_state::earom_r)
+u8 v100_state::status_r()
{
- return m_earom->data_r();
+ u8 status = 0xc0;
+ status |= m_earom->data_r();
+ status |= m_modem->dcd_r() << 1;
+ status |= m_modem->si_r() << 2; // SCCD (pin 12)
+ status |= m_modem->ri_r() << 3;
+ return status;
}
WRITE8_MEMBER(v100_state::port30_w)
@@ -198,11 +208,13 @@ IRQ_CALLBACK_MEMBER(v100_state::irq_ack)
return (m_picu->a_r() << 1) | 0xf0;
}
-WRITE8_MEMBER(v100_state::ppi_porta_w)
+void v100_state::ppi_porta_w(u8 data)
{
m_vtac->set_clock_scale(BIT(data, 5) ? 0.5 : 1.0);
m_screen->set_clock_scale(BIT(data, 5) ? 0.5 : 1.0);
+ m_video_enable = !BIT(data, 7);
+
//logerror("Writing %02X to PPI port A\n", data);
}
@@ -221,7 +233,7 @@ void v100_state::io_map(address_map &map)
map(0x12, 0x13).rw("usart1", FUNC(i8251_device::read), FUNC(i8251_device::write));
map(0x14, 0x15).rw("usart2", FUNC(i8251_device::read), FUNC(i8251_device::write));
map(0x16, 0x16).w("brg2", FUNC(com8116_device::stt_str_w));
- map(0x20, 0x20).r(FUNC(v100_state::earom_r));
+ map(0x20, 0x20).r(FUNC(v100_state::status_r));
map(0x30, 0x30).w(FUNC(v100_state::port30_w));
map(0x40, 0x40).rw(FUNC(v100_state::keyboard_r), FUNC(v100_state::key_row_w));
map(0x48, 0x48).w(FUNC(v100_state::port48_w));
@@ -343,36 +355,47 @@ static INPUT_PORTS_START( v100 )
INPUT_PORTS_END
-MACHINE_CONFIG_START(v100_state::v100)
- MCFG_DEVICE_ADD("maincpu", Z80, XTAL(47'736'000) / 12) // divider not verified
- MCFG_DEVICE_PROGRAM_MAP(mem_map)
- MCFG_DEVICE_IO_MAP(io_map)
- MCFG_DEVICE_IRQ_ACKNOWLEDGE_DRIVER(v100_state, irq_ack)
+void v100_state::v100(machine_config &config)
+{
+ Z80(config, m_maincpu, 47.736_MHz_XTAL / 20); // 2.387 MHz PCLOCK
+ m_maincpu->set_addrmap(AS_PROGRAM, &v100_state::mem_map);
+ m_maincpu->set_addrmap(AS_IO, &v100_state::io_map);
+ m_maincpu->set_irq_acknowledge_callback(FUNC(v100_state::irq_ack));
+
+ I8251(config, m_usart[0], 47.736_MHz_XTAL / 20);
+ m_usart[0]->txd_handler().set(m_modem, FUNC(rs232_port_device::write_txd));
+ m_usart[0]->dtr_handler().set(m_modem, FUNC(rs232_port_device::write_dtr));
+ m_usart[0]->rts_handler().set(m_modem, FUNC(rs232_port_device::write_rts));
+ //m_usart[0]->rxrdy_handler().set(FUNC(v100_state::picu_r_w<4>)).invert();
- I8251(config, m_usart[0], XTAL(47'736'000) / 12); // divider not verified
+ input_merger_device &acts(INPUT_MERGER_ALL_HIGH(config, "acts"));
+ acts.output_handler().set(m_usart[0], FUNC(i8251_device::write_cts));
- com8116_device &brg1(COM8116(config, "brg1", 5068800)); // TODO: clock and divisors for this customized variant
+ com8116_device &brg1(COM8116_020(config, "brg1", 1.8432_MHz_XTAL));
brg1.fr_handler().set(m_usart[0], FUNC(i8251_device::write_rxc));
brg1.ft_handler().set(m_usart[0], FUNC(i8251_device::write_txc));
- I8251(config, m_usart[1], XTAL(47'736'000) / 12);
+ I8251(config, m_usart[1], 47.736_MHz_XTAL / 20);
+ m_usart[1]->txd_handler().set("aux", FUNC(rs232_port_device::write_txd));
+ m_usart[1]->dtr_handler().set("aux", FUNC(rs232_port_device::write_dtr));
+ //m_usart[1]->txrdy_handler().set(FUNC(v100_state::picu_r_w<2>)).invert();
- com8116_device &brg2(COM8116(config, "brg2", 5068800));
+ com8116_device &brg2(COM8116_020(config, "brg2", 1.8432_MHz_XTAL));
brg2.fr_handler().set(m_usart[1], FUNC(i8251_device::write_rxc));
brg2.ft_handler().set(m_usart[1], FUNC(i8251_device::write_txc));
- MCFG_SCREEN_ADD("screen", RASTER)
- //MCFG_SCREEN_RAW_PARAMS(XTAL(47'736'000) / 2, 102 * V100_CH_WIDTH, 0, 80 * V100_CH_WIDTH, 260, 0, 240)
- MCFG_SCREEN_RAW_PARAMS(XTAL(47'736'000), 170 * V100_CH_WIDTH, 0, 132 * V100_CH_WIDTH, 312, 0, 240)
- MCFG_SCREEN_UPDATE_DRIVER(v100_state, screen_update)
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ //m_screen->set_raw(47.736_MHz_XTAL / 2, 102 * V100_CH_WIDTH, 0, 80 * V100_CH_WIDTH, 260, 0, 240);
+ m_screen->set_raw(47.736_MHz_XTAL, 170 * V100_CH_WIDTH, 0, 132 * V100_CH_WIDTH, 312, 0, 240);
+ m_screen->set_screen_update(FUNC(v100_state::screen_update));
- CRT5037(config, m_vtac, XTAL(47'736'000) / V100_CH_WIDTH);
+ CRT5037(config, m_vtac, 47.736_MHz_XTAL / V100_CH_WIDTH);
m_vtac->set_char_width(V100_CH_WIDTH);
m_vtac->set_screen("screen");
m_vtac->hsyn_callback().set(FUNC(v100_state::picu_r_w<7>)).invert();
m_vtac->vsyn_callback().set(FUNC(v100_state::picu_r_w<6>)).invert();
- I8214(config, m_picu, XTAL(47'736'000) / 12);
+ I8214(config, m_picu, 47.736_MHz_XTAL / 20);
m_picu->int_wr_callback().set_inputline(m_maincpu, 0, ASSERT_LINE);
i8255_device &ppi(I8255(config, "ppi", 0));
@@ -382,9 +405,20 @@ MACHINE_CONFIG_START(v100_state::v100)
ppi.out_pb_callback().append(m_earom, FUNC(er1400_device::c1_w)).bit(4).invert();
ppi.out_pc_callback().set(m_earom, FUNC(er1400_device::data_w)).bit(6).invert();
ppi.out_pc_callback().append(m_earom, FUNC(er1400_device::clock_w)).bit(0).invert();
+ ppi.out_pc_callback().append(m_modem, FUNC(rs232_port_device::write_spds)).bit(4);
+ ppi.out_pc_callback().append("acts", FUNC(input_merger_device::in_w<1>)).bit(7);
ER1400(config, m_earom);
-MACHINE_CONFIG_END
+
+ RS232_PORT(config, m_modem, default_rs232_devices, "loopback"); // EIA port
+ m_modem->rxd_handler().set(m_usart[0], FUNC(i8251_device::write_rxd));
+ m_modem->cts_handler().set("acts", FUNC(input_merger_device::in_w<0>));
+ m_modem->dcd_handler().set(m_usart[0], FUNC(i8251_device::write_dsr));
+
+ rs232_port_device &aux(RS232_PORT(config, "aux", default_rs232_devices, nullptr)); // optional printer port
+ aux.rxd_handler().set(m_usart[1], FUNC(i8251_device::write_rxd));
+ aux.dcd_handler().set(m_usart[1], FUNC(i8251_device::write_dsr)); // printer busy
+}
diff --git a/src/mame/drivers/v102.cpp b/src/mame/drivers/v102.cpp
index 30680ae44ca..0a8071c354a 100644
--- a/src/mame/drivers/v102.cpp
+++ b/src/mame/drivers/v102.cpp
@@ -1,5 +1,5 @@
// license:BSD-3-Clause
-// copyright-holders:
+// copyright-holders:AJR
/***********************************************************************************************************************************
Skeleton driver for Visual 102 display terminal.
@@ -7,8 +7,8 @@ Skeleton driver for Visual 102 display terminal.
************************************************************************************************************************************/
#include "emu.h"
+#include "bus/rs232/rs232.h"
#include "cpu/z80/z80.h"
-#include "cpu/mcs48/mcs48.h"
#include "machine/eeprompar.h"
#include "machine/input_merger.h"
#include "machine/i8251.h"
@@ -20,26 +20,37 @@ Skeleton driver for Visual 102 display terminal.
//#include "video/crt9021.h"
#include "screen.h"
+#include "machine/v102_kbd.h"
+
class v102_state : public driver_device
{
public:
v102_state(const machine_config &mconfig, device_type type, const char *tag)
: driver_device(mconfig, type, tag)
, m_maincpu(*this, "maincpu")
- , m_p_chargen(*this, "chargen")
+ , m_mpsc(*this, "mpsc")
+ , m_chargen(*this, "chargen")
{ }
void v102(machine_config &config);
+protected:
+ virtual void machine_start() override;
+
private:
u32 screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
+ DECLARE_WRITE_LINE_MEMBER(hs_w);
+
void io_map(address_map &map);
- void kbd_map(address_map &map);
void mem_map(address_map &map);
required_device<cpu_device> m_maincpu;
- required_region_ptr<u8> m_p_chargen;
+ required_device<upd7201_new_device> m_mpsc;
+ required_region_ptr<u8> m_chargen;
+
+ bool m_hs_state;
+ bool m_kb_clock;
};
@@ -48,6 +59,18 @@ u32 v102_state::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const
return 0;
}
+WRITE_LINE_MEMBER(v102_state::hs_w)
+{
+ if (state && !m_hs_state)
+ {
+ m_kb_clock = !m_kb_clock;
+ m_mpsc->txca_w(m_kb_clock);
+ m_mpsc->rxca_w(m_kb_clock);
+ }
+
+ m_hs_state = bool(state);
+}
+
void v102_state::mem_map(address_map &map)
{
@@ -68,9 +91,16 @@ void v102_state::io_map(address_map &map)
map(0xa0, 0xa3).rw("ppi", FUNC(i8255_device::read), FUNC(i8255_device::write));
}
-void v102_state::kbd_map(address_map &map)
+void v102_state::machine_start()
{
- map(0x000, 0x7ff).rom().region("keyboard", 0);
+ m_hs_state = false;
+ m_kb_clock = false;
+
+ m_mpsc->ctsa_w(0);
+ m_mpsc->ctsb_w(0);
+
+ save_item(NAME(m_hs_state));
+ save_item(NAME(m_kb_clock));
}
static INPUT_PORTS_START(v102)
@@ -90,23 +120,48 @@ void v102_state::v102(machine_config &config)
crt9007_device &vpac(CRT9007(config, "vpac", 18.575_MHz_XTAL / 10));
vpac.set_character_width(10); // 6 in 132-column mode
vpac.int_callback().set("mainirq", FUNC(input_merger_device::in_w<2>));
+ vpac.hs_callback().set(FUNC(v102_state::hs_w));
+ vpac.set_screen("screen");
EEPROM_2804(config, "eeprom");
- upd7201_new_device &mpsc(UPD7201_NEW(config, "mpsc", 18.575_MHz_XTAL / 5)); // divider not verified
- mpsc.out_int_callback().set("mainirq", FUNC(input_merger_device::in_w<0>));
+ UPD7201_NEW(config, m_mpsc, 18.575_MHz_XTAL / 5); // divider not verified
+ m_mpsc->out_int_callback().set("mainirq", FUNC(input_merger_device::in_w<0>));
+ m_mpsc->out_txda_callback().set("keyboard", FUNC(v102_keyboard_device::write_rxd));
+ m_mpsc->out_txdb_callback().set("aux", FUNC(rs232_port_device::write_txd));
+ m_mpsc->out_dtrb_callback().set("aux", FUNC(rs232_port_device::write_dtr));
+ m_mpsc->out_rtsb_callback().set("aux", FUNC(rs232_port_device::write_rts));
i8251_device &usart(I8251(config, "usart", 18.575_MHz_XTAL / 5)); // divider not verified
usart.rxrdy_handler().set("mainirq", FUNC(input_merger_device::in_w<1>));
+ usart.txd_handler().set("modem", FUNC(rs232_port_device::write_txd));
+ usart.dtr_handler().set("modem", FUNC(rs232_port_device::write_dtr));
+ usart.rts_handler().set("modem", FUNC(rs232_port_device::write_rts));
INPUT_MERGER_ANY_HIGH(config, "mainirq").output_handler().set_inputline(m_maincpu, INPUT_LINE_IRQ0);
- PIT8253(config, "pit", 0);
+ pit8253_device &pit(PIT8253(config, "pit", 0));
+ pit.set_clk<0>(18.575_MHz_XTAL / 6);
+ pit.set_clk<1>(18.575_MHz_XTAL / 6);
+ pit.set_clk<2>(18.575_MHz_XTAL / 6);
+ pit.out_handler<0>().set("usart", FUNC(i8251_device::write_txc));
+ pit.out_handler<1>().set("usart", FUNC(i8251_device::write_rxc));
+ pit.out_handler<2>().set(m_mpsc, FUNC(upd7201_new_device::txcb_w));
+ pit.out_handler<2>().append(m_mpsc, FUNC(upd7201_new_device::rxcb_w));
I8255(config, "ppi");
- mcs48_cpu_device &kbdcpu(I8039(config, "kbdcpu", 4.608_MHz_XTAL)); // oscillator marked "4608 - 300 107 - KSS4D"
- kbdcpu.set_addrmap(AS_PROGRAM, &v102_state::kbd_map);
+ v102_keyboard_device &keyboard(V102_KEYBOARD(config, "keyboard"));
+ keyboard.txd_callback().set(m_mpsc, FUNC(upd7201_new_device::rxa_w));
+
+ rs232_port_device &modem(RS232_PORT(config, "modem", default_rs232_devices, nullptr));
+ modem.rxd_handler().set("usart", FUNC(i8251_device::write_rxd));
+ modem.cts_handler().set("usart", FUNC(i8251_device::write_cts));
+ modem.dcd_handler().set("usart", FUNC(i8251_device::write_dsr));
+
+ rs232_port_device &aux(RS232_PORT(config, "aux", default_rs232_devices, nullptr));
+ aux.rxd_handler().set(m_mpsc, FUNC(upd7201_new_device::rxb_w));
+ aux.dcd_handler().set(m_mpsc, FUNC(upd7201_new_device::dcdb_w)); // DTR (printer busy)
}
@@ -125,9 +180,6 @@ ROM_START( v102 )
ROM_REGION(0x1000, "chargen", 0)
ROM_LOAD( "260-001.u50", 0x0000, 0x1000, CRC(732f5b99) SHA1(d105bf9f3ed41109d7181bcf0223bb280afe3f0a) )
-
- ROM_REGION(0x0800, "keyboard", 0)
- ROM_LOAD( "150.kbd", 0x0000, 0x0800, CRC(afe55cff) SHA1(b26ebdde63ec0e94c08780285def39a282e128b3) )
ROM_END
COMP( 1984, v102, 0, 0, v102, v102, v102_state, empty_init, "Visual Technology", "Visual 102", MACHINE_IS_SKELETON )
diff --git a/src/mame/drivers/v1050.cpp b/src/mame/drivers/v1050.cpp
index fb66d34e6f7..b88992449c0 100644
--- a/src/mame/drivers/v1050.cpp
+++ b/src/mame/drivers/v1050.cpp
@@ -1022,21 +1022,22 @@ void v1050_state::machine_reset()
// Machine Driver
-MACHINE_CONFIG_START(v1050_state::v1050)
+void v1050_state::v1050(machine_config &config)
+{
// basic machine hardware
- MCFG_DEVICE_ADD(Z80_TAG, Z80, 16_MHz_XTAL/4)
- MCFG_DEVICE_PROGRAM_MAP(v1050_mem)
- MCFG_DEVICE_IO_MAP(v1050_io)
- MCFG_DEVICE_IRQ_ACKNOWLEDGE_DRIVER(v1050_state,v1050_int_ack)
+ Z80(config, m_maincpu, 16_MHz_XTAL/4);
+ m_maincpu->set_addrmap(AS_PROGRAM, &v1050_state::v1050_mem);
+ m_maincpu->set_addrmap(AS_IO, &v1050_state::v1050_io);
+ m_maincpu->set_irq_acknowledge_callback(FUNC(v1050_state::v1050_int_ack));
- MCFG_QUANTUM_PERFECT_CPU(Z80_TAG)
+ config.m_perfect_cpu_quantum = subtag(Z80_TAG);
- MCFG_DEVICE_ADD(M6502_TAG, M6502, 15.36_MHz_XTAL/16)
- MCFG_DEVICE_PROGRAM_MAP(v1050_crt_mem)
- MCFG_QUANTUM_PERFECT_CPU(M6502_TAG)
+ M6502(config, m_subcpu, 15.36_MHz_XTAL/16);
+ m_subcpu->set_addrmap(AS_PROGRAM, &v1050_state::v1050_crt_mem);
+ config.m_perfect_cpu_quantum = subtag(M6502_TAG);
// keyboard HACK
- MCFG_TIMER_DRIVER_ADD_PERIODIC("keyboard", v1050_state, v1050_keyboard_tick, attotime::from_hz(60))
+ TIMER(config, "keyboard").configure_periodic(FUNC(v1050_state::v1050_keyboard_tick), attotime::from_hz(60));
// video hardware
v1050_video(config);
@@ -1045,12 +1046,12 @@ MACHINE_CONFIG_START(v1050_state::v1050)
I8214(config, m_pic, 16_MHz_XTAL/4);
m_pic->int_wr_callback().set(FUNC(v1050_state::pic_int_w));
- MCFG_DEVICE_ADD(MSM58321RS_TAG, MSM58321, 32.768_kHz_XTAL)
- MCFG_MSM58321_D0_HANDLER(WRITELINE(*this, v1050_state, rtc_ppi_pa_0_w))
- MCFG_MSM58321_D1_HANDLER(WRITELINE(*this, v1050_state, rtc_ppi_pa_1_w))
- MCFG_MSM58321_D2_HANDLER(WRITELINE(*this, v1050_state, rtc_ppi_pa_2_w))
- MCFG_MSM58321_D3_HANDLER(WRITELINE(*this, v1050_state, rtc_ppi_pa_3_w))
- MCFG_MSM58321_BUSY_HANDLER(WRITELINE(*this, v1050_state, rtc_ppi_pc_3_w))
+ MSM58321(config, m_rtc, 32.768_kHz_XTAL);
+ m_rtc->d0_handler().set(FUNC(v1050_state::rtc_ppi_pa_0_w));
+ m_rtc->d1_handler().set(FUNC(v1050_state::rtc_ppi_pa_1_w));
+ m_rtc->d2_handler().set(FUNC(v1050_state::rtc_ppi_pa_2_w));
+ m_rtc->d3_handler().set(FUNC(v1050_state::rtc_ppi_pa_3_w));
+ m_rtc->busy_handler().set(FUNC(v1050_state::rtc_ppi_pc_3_w));
I8255A(config, m_ppi_disp);
m_ppi_disp->in_pa_callback().set(I8255A_M6502_TAG, FUNC(i8255_device::pb_r));
@@ -1077,8 +1078,8 @@ MACHINE_CONFIG_START(v1050_state::v1050)
m_uart_kb->txd_handler().set(V1050_KEYBOARD_TAG, FUNC(v1050_keyboard_device::si_w));
m_uart_kb->rxrdy_handler().set(FUNC(v1050_state::kb_rxrdy_w));
- MCFG_DEVICE_ADD(CLOCK_KB_TAG, CLOCK, 16_MHz_XTAL/4/13/8)
- MCFG_CLOCK_SIGNAL_HANDLER(WRITELINE(*this, v1050_state, write_keyboard_clock))
+ clock_device &clock_kb(CLOCK(config, CLOCK_KB_TAG, 16_MHz_XTAL/4/13/8));
+ clock_kb.signal_handler().set(FUNC(v1050_state::write_keyboard_clock));
// keyboard
v1050_keyboard_device &keyboard(V1050_KEYBOARD(config, V1050_KEYBOARD_TAG, 0));
@@ -1095,48 +1096,50 @@ MACHINE_CONFIG_START(v1050_state::v1050)
rs232.rxd_handler().set(m_uart_sio, FUNC(i8251_device::write_rxd));
rs232.dsr_handler().set(m_uart_sio, FUNC(i8251_device::write_dsr));
- MCFG_DEVICE_ADD(CLOCK_SIO_TAG, CLOCK, 16_MHz_XTAL/4)
- MCFG_CLOCK_SIGNAL_HANDLER(WRITELINE(*this, v1050_state, write_sio_clock))
+ CLOCK(config, m_clock_sio, 16_MHz_XTAL/4);
+ m_clock_sio->signal_handler().set(FUNC(v1050_state::write_sio_clock));
MB8877(config, m_fdc, 16_MHz_XTAL/16);
m_fdc->intrq_wr_callback().set(FUNC(v1050_state::fdc_intrq_w));
m_fdc->drq_wr_callback().set(FUNC(v1050_state::fdc_drq_w));
- MCFG_FLOPPY_DRIVE_ADD(MB8877_TAG":0", v1050_floppies, "525qd", floppy_image_device::default_floppy_formats)
- MCFG_FLOPPY_DRIVE_ADD(MB8877_TAG":1", v1050_floppies, "525qd", floppy_image_device::default_floppy_formats)
- MCFG_FLOPPY_DRIVE_ADD(MB8877_TAG":2", v1050_floppies, nullptr, floppy_image_device::default_floppy_formats)
- MCFG_FLOPPY_DRIVE_ADD(MB8877_TAG":3", v1050_floppies, nullptr, floppy_image_device::default_floppy_formats)
+ FLOPPY_CONNECTOR(config, MB8877_TAG":0", v1050_floppies, "525qd", floppy_image_device::default_floppy_formats);
+ FLOPPY_CONNECTOR(config, MB8877_TAG":1", v1050_floppies, "525qd", floppy_image_device::default_floppy_formats);
+ FLOPPY_CONNECTOR(config, MB8877_TAG":2", v1050_floppies, nullptr, floppy_image_device::default_floppy_formats);
+ FLOPPY_CONNECTOR(config, MB8877_TAG":3", v1050_floppies, nullptr, floppy_image_device::default_floppy_formats);
// SASI bus
SCSI_PORT(config, m_sasibus, 0);
- m_sasibus->set_data_input_buffer("scsi_data_in");
- m_sasibus->req_handler().set("scsi_ctrl_in", FUNC(input_buffer_device::write_bit0)).exor(1);
- m_sasibus->bsy_handler().set("scsi_ctrl_in", FUNC(input_buffer_device::write_bit1));
- m_sasibus->msg_handler().set("scsi_ctrl_in", FUNC(input_buffer_device::write_bit2));
- m_sasibus->cd_handler().set("scsi_ctrl_in", FUNC(input_buffer_device::write_bit3));
+ m_sasibus->set_data_input_buffer(m_sasi_data_in);
+ m_sasibus->req_handler().set(m_sasi_ctrl_in, FUNC(input_buffer_device::write_bit0)).exor(1);
+ m_sasibus->bsy_handler().set(m_sasi_ctrl_in, FUNC(input_buffer_device::write_bit1));
+ m_sasibus->msg_handler().set(m_sasi_ctrl_in, FUNC(input_buffer_device::write_bit2));
+ m_sasibus->cd_handler().set(m_sasi_ctrl_in, FUNC(input_buffer_device::write_bit3));
m_sasibus->io_handler().set(FUNC(v1050_state::write_sasi_io)).exor(1); // bit4
- MCFG_SCSIDEV_ADD(SASIBUS_TAG ":" SCSI_PORT_DEVICE1, "harddisk", S1410, SCSI_ID_0)
+ m_sasibus->set_slot_device(1, "harddisk", S1410, DEVICE_INPUT_DEFAULTS_NAME(SCSI_ID_0));
- MCFG_SCSI_OUTPUT_LATCH_ADD("scsi_data_out", SASIBUS_TAG)
- MCFG_DEVICE_ADD("scsi_data_in", INPUT_BUFFER, 0)
- MCFG_DEVICE_ADD("scsi_ctrl_in", INPUT_BUFFER, 0)
+ OUTPUT_LATCH(config, m_sasi_data_out);
+ m_sasibus->set_output_latch(*m_sasi_data_out);
+ INPUT_BUFFER(config, m_sasi_data_in);
+ INPUT_BUFFER(config, m_sasi_ctrl_in);
- MCFG_TIMER_DRIVER_ADD(TIMER_ACK_TAG, v1050_state, sasi_ack_tick)
- MCFG_TIMER_DRIVER_ADD(TIMER_RST_TAG, v1050_state, sasi_rst_tick)
+ TIMER(config, m_timer_ack).configure_generic(FUNC(v1050_state::sasi_ack_tick));
+ TIMER(config, m_timer_rst).configure_generic(FUNC(v1050_state::sasi_rst_tick));
// software lists
- MCFG_SOFTWARE_LIST_ADD("flop_list", "v1050_flop")
- MCFG_SOFTWARE_LIST_ADD("hdd_list", "v1050_hdd")
+ SOFTWARE_LIST(config, "flop_list").set_original("v1050_flop");
+ SOFTWARE_LIST(config, "hdd_list").set_original("v1050_hdd");
// printer
- MCFG_DEVICE_ADD(m_centronics, CENTRONICS, centronics_devices, "printer")
- MCFG_CENTRONICS_BUSY_HANDLER(WRITELINE(*this, v1050_state, write_centronics_busy))
- MCFG_CENTRONICS_PERROR_HANDLER(WRITELINE(*this, v1050_state, write_centronics_perror))
+ CENTRONICS(config, m_centronics, centronics_devices, "printer");
+ m_centronics->busy_handler().set(FUNC(v1050_state::write_centronics_busy));
+ m_centronics->perror_handler().set(FUNC(v1050_state::write_centronics_perror));
- MCFG_CENTRONICS_OUTPUT_LATCH_ADD("cent_data_out", "centronics")
+ output_latch_device &cent_data_out(OUTPUT_LATCH(config, "cent_data_out"));
+ m_centronics->set_output_latch(cent_data_out);
// internal ram
RAM(config, RAM_TAG).set_default_size("128K");
-MACHINE_CONFIG_END
+}
// ROMs
diff --git a/src/mame/drivers/v550.cpp b/src/mame/drivers/v550.cpp
index c8b9f504978..404724bacb1 100644
--- a/src/mame/drivers/v550.cpp
+++ b/src/mame/drivers/v550.cpp
@@ -127,11 +127,11 @@ void v550_state::v550(machine_config &config)
INPUT_MERGER_ANY_HIGH(config, "mainint").output_handler().set_inputline(m_maincpu, INPUT_LINE_IRQ0);
- com8116_device &brg1(COM8116(config, "brg1", 5068800)); // actually SMC COM8116T-020 (unknown clock)
+ com8116_device &brg1(COM8116_020(config, "brg1", 1.8432_MHz_XTAL)); // SMC COM8116T-020
brg1.ft_handler().set("mpsc", FUNC(upd7201_new_device::txca_w));
brg1.fr_handler().set("mpsc", FUNC(upd7201_new_device::rxca_w));
- com8116_device &brg2(COM8116(config, "brg2", 5068800)); // actually SMC COM8116T-020
+ com8116_device &brg2(COM8116_020(config, "brg2", 1.8432_MHz_XTAL)); // SMC COM8116T-020
brg2.ft_handler().set("mpsc", FUNC(upd7201_new_device::txcb_w));
brg2.ft_handler().append("mpsc", FUNC(upd7201_new_device::rxcb_w));
brg2.fr_handler().set("usart", FUNC(i8251_device::write_txc));
diff --git a/src/mame/drivers/v6809.cpp b/src/mame/drivers/v6809.cpp
index 07ae3ed8a78..5095945e919 100644
--- a/src/mame/drivers/v6809.cpp
+++ b/src/mame/drivers/v6809.cpp
@@ -203,7 +203,7 @@ WRITE8_MEMBER( v6809_state::videoram_w )
WRITE8_MEMBER( v6809_state::v6809_address_w )
{
- m_crtc->address_w( space, 0, data );
+ m_crtc->address_w(data);
m_video_index = data & 0x1f;
@@ -215,7 +215,7 @@ WRITE8_MEMBER( v6809_state::v6809_register_w )
{
uint16_t temp = m_video_address;
- m_crtc->register_w( space, 0, data );
+ m_crtc->register_w(data);
// Get transparent address
if (m_video_index == 18)
@@ -282,26 +282,26 @@ static void v6809_floppies(device_slot_interface &device)
// *** Machine ****
-MACHINE_CONFIG_START(v6809_state::v6809)
+void v6809_state::v6809(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", MC6809, 16_MHz_XTAL / 4) // divided by 4 again internally
- MCFG_DEVICE_PROGRAM_MAP(v6809_mem)
+ MC6809(config, m_maincpu, 16_MHz_XTAL / 4); // divided by 4 again internally
+ m_maincpu->set_addrmap(AS_PROGRAM, &v6809_state::v6809_mem);
MCFG_MACHINE_RESET_OVERRIDE(v6809_state, v6809)
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(50)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */
- MCFG_SCREEN_SIZE(640, 480)
- MCFG_SCREEN_VISIBLE_AREA(0, 640-1, 0, 480-1)
- MCFG_SCREEN_UPDATE_DEVICE("crtc", sy6545_1_device, screen_update)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(50);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */
+ screen.set_size(640, 480);
+ screen.set_visarea(0, 640-1, 0, 480-1);
+ screen.set_screen_update("crtc", FUNC(sy6545_1_device::screen_update));
PALETTE(config, m_palette, palette_device::MONOCHROME);
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_v6809)
+ GFXDECODE(config, "gfxdecode", m_palette, gfx_v6809);
/* sound hardware */
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("speaker", SPEAKER_SOUND)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.50)
+ SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.50);
/* devices */
SY6545_1(config, m_crtc, 16_MHz_XTAL / 8);
@@ -343,15 +343,14 @@ MACHINE_CONFIG_START(v6809_state::v6809)
acia_clock.signal_handler().append("acia1", FUNC(acia6850_device::write_txc));
acia_clock.signal_handler().append("acia1", FUNC(acia6850_device::write_rxc));
- MCFG_DEVICE_ADD("rtc", MM58274C, 0)
+ mm58274c_device &rtc(MM58274C(config, "rtc", 0));
// this is all guess
- MCFG_MM58274C_MODE24(0) // 12 hour
- MCFG_MM58274C_DAY1(1) // monday
+ rtc.set_mode24(0); // 12 hour
+ rtc.set_day1(1); // monday
MB8876(config, m_fdc, 16_MHz_XTAL / 16);
- MCFG_FLOPPY_DRIVE_ADD("fdc:0", v6809_floppies, "525dd", floppy_image_device::default_floppy_formats)
- MCFG_FLOPPY_DRIVE_SOUND(true)
-MACHINE_CONFIG_END
+ FLOPPY_CONNECTOR(config, "fdc:0", v6809_floppies, "525dd", floppy_image_device::default_floppy_formats).enable_sound(true);
+}
/* ROM definition */
ROM_START( v6809 )
diff --git a/src/mame/drivers/vaportra.cpp b/src/mame/drivers/vaportra.cpp
index c1ad77f601c..4f7015df8a4 100644
--- a/src/mame/drivers/vaportra.cpp
+++ b/src/mame/drivers/vaportra.cpp
@@ -207,30 +207,30 @@ void vaportra_state::machine_reset()
m_priority[1] = 0;
}
-MACHINE_CONFIG_START(vaportra_state::vaportra)
-
+void vaportra_state::vaportra(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD(m_maincpu, M68000,XTAL(24'000'000)/2) /* Custom chip 59 */
- MCFG_DEVICE_PROGRAM_MAP(main_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", vaportra_state, irq6_line_assert)
+ M68000(config, m_maincpu, XTAL(24'000'000)/2); /* Custom chip 59 */
+ m_maincpu->set_addrmap(AS_PROGRAM, &vaportra_state::main_map);
+ m_maincpu->set_vblank_int("screen", FUNC(vaportra_state::irq6_line_assert));
H6280(config, m_audiocpu, XTAL(24'000'000)/4); /* Custom chip 45; Audio section crystal is 32.220 MHz but CPU clock is confirmed as coming from the 24MHz crystal (6Mhz exactly on the CPU) */
m_audiocpu->set_addrmap(AS_PROGRAM, &vaportra_state::sound_map);
m_audiocpu->add_route(ALL_OUTPUTS, "mono", 0); // internal sound unused
/* video hardware */
- MCFG_DEVICE_ADD(m_spriteram, BUFFERED_SPRITERAM16)
+ BUFFERED_SPRITERAM16(config, m_spriteram);
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(58)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(529))
- MCFG_SCREEN_SIZE(32*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 1*8, 31*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(vaportra_state, screen_update)
- MCFG_SCREEN_PALETTE("colors")
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(58);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(529));
+ screen.set_size(32*8, 32*8);
+ screen.set_visarea(0*8, 32*8-1, 1*8, 31*8-1);
+ screen.set_screen_update(FUNC(vaportra_state::screen_update));
+ screen.set_palette(m_palette);
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, m_palette, gfx_vaportra)
- MCFG_PALETTE_ADD(m_palette, 1280)
+ GFXDECODE(config, "gfxdecode", m_palette, gfx_vaportra);
+ PALETTE(config, m_palette).set_entries(1280);
DECO16IC(config, m_deco_tilegen[0], 0);
m_deco_tilegen[0]->set_split(0);
@@ -274,20 +274,17 @@ MACHINE_CONFIG_START(vaportra_state::vaportra)
GENERIC_LATCH_8(config, m_soundlatch);
m_soundlatch->data_pending_callback().set_inputline(m_audiocpu, 0);
- MCFG_DEVICE_ADD("ym1", YM2203, XTAL(32'220'000)/8)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.60)
+ YM2203(config, "ym1", XTAL(32'220'000)/8).add_route(ALL_OUTPUTS, "mono", 0.60);
ym2151_device &ym2(YM2151(config, "ym2", XTAL(32'220'000)/9)); // uses a preset LS163 to force the odd speed
ym2.irq_handler().set_inputline(m_audiocpu, 1); /* IRQ2 */
ym2.add_route(0, "mono", 0.60);
ym2.add_route(1, "mono", 0.60);
- MCFG_DEVICE_ADD("oki1", OKIM6295, XTAL(32'220'000)/32, okim6295_device::PIN7_HIGH)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.75)
+ OKIM6295(config, "oki1", XTAL(32'220'000)/32, okim6295_device::PIN7_HIGH).add_route(ALL_OUTPUTS, "mono", 0.75);
- MCFG_DEVICE_ADD("oki2", OKIM6295, XTAL(32'220'000)/16, okim6295_device::PIN7_HIGH)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.60)
-MACHINE_CONFIG_END
+ OKIM6295(config, "oki2", XTAL(32'220'000)/16, okim6295_device::PIN7_HIGH).add_route(ALL_OUTPUTS, "mono", 0.60);
+}
/******************************************************************************/
diff --git a/src/mame/drivers/vax11.cpp b/src/mame/drivers/vax11.cpp
index 9a799f4e54e..c07cfe1798a 100644
--- a/src/mame/drivers/vax11.cpp
+++ b/src/mame/drivers/vax11.cpp
@@ -97,7 +97,7 @@ private:
WRITE16_MEMBER(vax11_state::term_w)
{
- m_terminal->write(space, 0, data);
+ m_terminal->write(data);
}
READ16_MEMBER(vax11_state::term_r)
diff --git a/src/mame/drivers/vball.cpp b/src/mame/drivers/vball.cpp
index 263e7f746a8..d625035ecd2 100644
--- a/src/mame/drivers/vball.cpp
+++ b/src/mame/drivers/vball.cpp
@@ -396,26 +396,25 @@ static GFXDECODE_START( gfx_vb )
GFXDECODE_END
-MACHINE_CONFIG_START(vball_state::vball)
-
+void vball_state::vball(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M6502, CPU_CLOCK) /* 2 MHz - measured by guru but it makes the game far far too slow ?! */
- MCFG_DEVICE_PROGRAM_MAP(main_map)
- MCFG_TIMER_DRIVER_ADD_SCANLINE("scantimer", vball_state, vball_scanline, "screen", 0, 1)
+ M6502(config, m_maincpu, CPU_CLOCK); /* 2 MHz - measured by guru but it makes the game far far too slow ?! */
+ m_maincpu->set_addrmap(AS_PROGRAM, &vball_state::main_map);
+ TIMER(config, "scantimer").configure_scanline(FUNC(vball_state::vball_scanline), "screen", 0, 1);
- MCFG_DEVICE_ADD("audiocpu", Z80, 3579545) /* 3.579545 MHz */
- MCFG_DEVICE_PROGRAM_MAP(sound_map)
+ Z80(config, m_audiocpu, 3579545); /* 3.579545 MHz */
+ m_audiocpu->set_addrmap(AS_PROGRAM, &vball_state::sound_map);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_SIZE(32*8, 32*8)
- MCFG_SCREEN_RAW_PARAMS(PIXEL_CLOCK, 384, 0, 256, 272, 8, 248) /* based on ddragon driver */
- MCFG_SCREEN_UPDATE_DRIVER(vball_state, screen_update)
- MCFG_SCREEN_PALETTE("palette")
-
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_vb)
- MCFG_PALETTE_ADD("palette", 256)
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_size(32*8, 32*8);
+ m_screen->set_raw(PIXEL_CLOCK, 384, 0, 256, 272, 8, 248); /* based on ddragon driver */
+ m_screen->set_screen_update(FUNC(vball_state::screen_update));
+ m_screen->set_palette(m_palette);
+ GFXDECODE(config, m_gfxdecode, m_palette, gfx_vb);
+ PALETTE(config, m_palette).set_entries(256);
/* sound hardware */
SPEAKER(config, "lspeaker").front_left();
@@ -430,10 +429,10 @@ MACHINE_CONFIG_START(vball_state::vball)
ymsnd.add_route(0, "lspeaker", 0.60);
ymsnd.add_route(1, "rspeaker", 0.60);
- MCFG_DEVICE_ADD("oki", OKIM6295, 1056000, okim6295_device::PIN7_HIGH)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 1.0)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 1.0)
-MACHINE_CONFIG_END
+ okim6295_device &oki(OKIM6295(config, "oki", 1056000, okim6295_device::PIN7_HIGH));
+ oki.add_route(ALL_OUTPUTS, "lspeaker", 1.0);
+ oki.add_route(ALL_OUTPUTS, "rspeaker", 1.0);
+}
/***************************************************************************
diff --git a/src/mame/drivers/vboy.cpp b/src/mame/drivers/vboy.cpp
index 76d8d9df2b7..e023e25dcb5 100644
--- a/src/mame/drivers/vboy.cpp
+++ b/src/mame/drivers/vboy.cpp
@@ -1305,50 +1305,50 @@ static void vboy_cart(device_slot_interface &device)
device.option_add_internal("vb_eeprom", VBOY_ROM_EEPROM);
}
-MACHINE_CONFIG_START(vboy_state::vboy)
-
+void vboy_state::vboy(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD( "maincpu", V810, XTAL(20'000'000) )
- MCFG_DEVICE_PROGRAM_MAP(vboy_mem)
- MCFG_DEVICE_IO_MAP(vboy_io)
- MCFG_TIMER_DRIVER_ADD_SCANLINE("scantimer_l", vboy_state, vboy_scanlineL, "3dleft", 0, 1)
- //MCFG_TIMER_DRIVER_ADD_SCANLINE("scantimer_r", vboy_state, vboy_scanlineR, "3dright", 0, 1)
+ V810(config, m_maincpu, XTAL(20'000'000));
+ m_maincpu->set_addrmap(AS_PROGRAM, &vboy_state::vboy_mem);
+ m_maincpu->set_addrmap(AS_IO, &vboy_state::vboy_io);
+ TIMER(config, "scantimer_l").configure_scanline(FUNC(vboy_state::vboy_scanlineL), "3dleft", 0, 1);
+ //TIMER(config, "scantimer_r").configure_scanline(FUNC(vboy_state::vboy_scanlineR), "3dright", 0, 1);
// programmable timer
- MCFG_TIMER_DRIVER_ADD("timer_main", vboy_state, timer_main_tick)
+ TIMER(config, m_maintimer).configure_generic(FUNC(vboy_state::timer_main_tick));
// pad ready, which should be once per VBL
- MCFG_TIMER_DRIVER_ADD_PERIODIC("timer_pad", vboy_state, timer_pad_tick, attotime::from_hz(50.038029f))
+ TIMER(config, "timer_pad").configure_periodic(FUNC(vboy_state::timer_pad_tick), attotime::from_hz(50.038029f));
/* video hardware */
config.set_default_layout(layout_vboy);
PALETTE(config, m_palette, FUNC(vboy_state::vboy_palette), 4);
/* Left screen */
- MCFG_SCREEN_ADD("3dleft", RASTER)
- MCFG_SCREEN_RAW_PARAMS(XTAL(20'000'000)/2,757,0,384,264,0,224)
- MCFG_SCREEN_UPDATE_DRIVER(vboy_state, screen_update_vboy_left)
- MCFG_SCREEN_PALETTE(m_palette)
+ screen_device &lscreen(SCREEN(config, "3dleft", SCREEN_TYPE_RASTER));
+ lscreen.set_raw(XTAL(20'000'000)/2,757,0,384,264,0,224);
+ lscreen.set_screen_update(FUNC(vboy_state::screen_update_vboy_left));
+ lscreen.set_palette(m_palette);
/* Right screen */
- MCFG_SCREEN_ADD("3dright", RASTER)
- MCFG_SCREEN_RAW_PARAMS(XTAL(20'000'000)/2,757,0,384,264,0,224)
- MCFG_SCREEN_UPDATE_DRIVER(vboy_state, screen_update_vboy_right)
- MCFG_SCREEN_PALETTE(m_palette)
+ screen_device &rscreen(SCREEN(config, "3dright", SCREEN_TYPE_RASTER));
+ rscreen.set_raw(XTAL(20'000'000)/2,757,0,384,264,0,224);
+ rscreen.set_screen_update(FUNC(vboy_state::screen_update_vboy_right));
+ rscreen.set_palette(m_palette);
/* cartridge */
- MCFG_VBOY_CARTRIDGE_ADD("cartslot", vboy_cart, nullptr)
+ VBOY_CART_SLOT(config, m_cart, vboy_cart, nullptr);
/* software lists */
- MCFG_SOFTWARE_LIST_ADD("cart_list","vboy")
+ SOFTWARE_LIST(config, "cart_list").set_original("vboy");
/* sound hardware */
SPEAKER(config, "lspeaker").front_left();
SPEAKER(config, "rspeaker").front_right();
- MCFG_DEVICE_ADD("vbsnd", VBOYSND)
- MCFG_SOUND_ROUTE(0, "lspeaker", 1.0)
- MCFG_SOUND_ROUTE(1, "rspeaker", 1.0)
-MACHINE_CONFIG_END
+ vboysnd_device &vbsnd(VBOYSND(config, "vbsnd"));
+ vbsnd.add_route(0, "lspeaker", 1.0);
+ vbsnd.add_route(1, "rspeaker", 1.0);
+}
/* ROM definition */
ROM_START( vboy )
diff --git a/src/mame/drivers/vc4000.cpp b/src/mame/drivers/vc4000.cpp
index 21a3bf17294..07a31603836 100644
--- a/src/mame/drivers/vc4000.cpp
+++ b/src/mame/drivers/vc4000.cpp
@@ -370,23 +370,23 @@ void vc4000_state::machine_start()
switch (m_cart->get_type())
{
case VC4000_STD:
- m_maincpu->space(AS_PROGRAM).install_read_handler(0x0000, 0x07ff, read8_delegate(FUNC(vc4000_cart_slot_device::read_rom),(vc4000_cart_slot_device*)m_cart));
+ m_maincpu->space(AS_PROGRAM).install_read_handler(0x0000, 0x07ff, read8sm_delegate(FUNC(vc4000_cart_slot_device::read_rom),(vc4000_cart_slot_device*)m_cart));
break;
case VC4000_ROM4K:
- m_maincpu->space(AS_PROGRAM).install_read_handler(0x0000, 0x0fff, read8_delegate(FUNC(vc4000_cart_slot_device::read_rom),(vc4000_cart_slot_device*)m_cart));
+ m_maincpu->space(AS_PROGRAM).install_read_handler(0x0000, 0x0fff, read8sm_delegate(FUNC(vc4000_cart_slot_device::read_rom),(vc4000_cart_slot_device*)m_cart));
break;
case VC4000_RAM1K:
- m_maincpu->space(AS_PROGRAM).install_read_handler(0x0000, 0x0fff, read8_delegate(FUNC(vc4000_cart_slot_device::read_rom),(vc4000_cart_slot_device*)m_cart));
- m_maincpu->space(AS_PROGRAM).install_readwrite_handler(0x1000, 0x15ff, read8_delegate(FUNC(vc4000_cart_slot_device::read_ram),(vc4000_cart_slot_device*)m_cart), write8_delegate(FUNC(vc4000_cart_slot_device::write_ram),(vc4000_cart_slot_device*)m_cart));
+ m_maincpu->space(AS_PROGRAM).install_read_handler(0x0000, 0x0fff, read8sm_delegate(FUNC(vc4000_cart_slot_device::read_rom),(vc4000_cart_slot_device*)m_cart));
+ m_maincpu->space(AS_PROGRAM).install_readwrite_handler(0x1000, 0x15ff, read8sm_delegate(FUNC(vc4000_cart_slot_device::read_ram),(vc4000_cart_slot_device*)m_cart), write8sm_delegate(FUNC(vc4000_cart_slot_device::write_ram),(vc4000_cart_slot_device*)m_cart));
break;
case VC4000_CHESS2:
- m_maincpu->space(AS_PROGRAM).install_read_handler(0x0000, 0x15ff, read8_delegate(FUNC(vc4000_cart_slot_device::read_rom),(vc4000_cart_slot_device*)m_cart));
- m_maincpu->space(AS_PROGRAM).install_readwrite_handler(0x1800, 0x1bff, read8_delegate(FUNC(vc4000_cart_slot_device::read_ram),(vc4000_cart_slot_device*)m_cart), write8_delegate(FUNC(vc4000_cart_slot_device::write_ram),(vc4000_cart_slot_device*)m_cart));
+ m_maincpu->space(AS_PROGRAM).install_read_handler(0x0000, 0x15ff, read8sm_delegate(FUNC(vc4000_cart_slot_device::read_rom),(vc4000_cart_slot_device*)m_cart));
+ m_maincpu->space(AS_PROGRAM).install_readwrite_handler(0x1800, 0x1bff, read8sm_delegate(FUNC(vc4000_cart_slot_device::read_ram),(vc4000_cart_slot_device*)m_cart), write8sm_delegate(FUNC(vc4000_cart_slot_device::write_ram),(vc4000_cart_slot_device*)m_cart));
break;
// undumped Radofin Hobby Module
// case VC4000_HOBBY:
-// m_maincpu->space(AS_PROGRAM).install_read_handler(0x0000, 0x07ff, read8_delegate(FUNC(vc4000_cart_slot_device::read_rom),(vc4000_cart_slot_device*)m_cart));
-// m_maincpu->space(AS_PROGRAM).install_readwrite_handler(0x0800, 0x0fff, read8_delegate(FUNC(vc4000_cart_slot_device::read_ram),(vc4000_cart_slot_device*)m_cart), write8_delegate(FUNC(vc4000_cart_slot_device::write_ram),(vc4000_cart_slot_device*)m_cart));
+// m_maincpu->space(AS_PROGRAM).install_read_handler(0x0000, 0x07ff, read8sm_delegate(FUNC(vc4000_cart_slot_device::read_rom),(vc4000_cart_slot_device*)m_cart));
+// m_maincpu->space(AS_PROGRAM).install_readwrite_handler(0x0800, 0x0fff, read8sm_delegate(FUNC(vc4000_cart_slot_device::read_ram),(vc4000_cart_slot_device*)m_cart), write8sm_delegate(FUNC(vc4000_cart_slot_device::write_ram),(vc4000_cart_slot_device*)m_cart));
// break;
}
@@ -550,8 +550,8 @@ void vc4000_state::vc4000(machine_config &config)
VC4000_SND(config, m_custom, 0).add_route(ALL_OUTPUTS, "mono", 0.50);
/* quickload */
- quickload_image_device &quickload(QUICKLOAD(config, "quickload", 0));
- quickload.set_handler(snapquick_load_delegate(&QUICKLOAD_LOAD_NAME(vc4000_state, vc4000), this), "pgm,tvc", 0);
+ quickload_image_device &quickload(QUICKLOAD(config, "quickload"));
+ quickload.set_handler(snapquick_load_delegate(&QUICKLOAD_LOAD_NAME(vc4000_state, vc4000), this), "pgm,tvc");
/* cartridge */
VC4000_CART_SLOT(config, "cartslot", vc4000_cart, nullptr);
diff --git a/src/mame/drivers/vcombat.cpp b/src/mame/drivers/vcombat.cpp
index 8bea4d4a40e..a647059e88e 100644
--- a/src/mame/drivers/vcombat.cpp
+++ b/src/mame/drivers/vcombat.cpp
@@ -348,9 +348,9 @@ WRITE16_MEMBER(vcombat_state::crtc_w)
return;
if (m_crtc_select == 0)
- m_crtc->address_w(space, 0, data >> 8);
+ m_crtc->address_w(data >> 8);
else
- m_crtc->register_w(space, 0, data >> 8);
+ m_crtc->register_w(data >> 8);
m_crtc_select ^= 1;
}
@@ -560,72 +560,75 @@ WRITE_LINE_MEMBER(vcombat_state::sound_update)
m_soundcpu->set_input_line(M68K_IRQ_1, state ? ASSERT_LINE : CLEAR_LINE);
}
-MACHINE_CONFIG_START(vcombat_state::vcombat)
- MCFG_DEVICE_ADD("maincpu", M68000, XTAL(12'000'000))
- MCFG_DEVICE_PROGRAM_MAP(main_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", vcombat_state, irq1_line_assert)
+void vcombat_state::vcombat(machine_config &config)
+{
+ M68000(config, m_maincpu, XTAL(12'000'000));
+ m_maincpu->set_addrmap(AS_PROGRAM, &vcombat_state::main_map);
+ m_maincpu->set_vblank_int("screen", FUNC(vcombat_state::irq1_line_assert));
/* The middle board i860 */
- MCFG_DEVICE_ADD("vid_0", I860, XTAL(20'000'000))
- MCFG_DEVICE_PROGRAM_MAP(vid_0_map)
+ I860(config, m_vid_0, XTAL(20'000'000));
+ m_vid_0->set_addrmap(AS_PROGRAM, &vcombat_state::vid_0_map);
/* The top board i860 */
- MCFG_DEVICE_ADD("vid_1", I860, XTAL(20'000'000))
- MCFG_DEVICE_PROGRAM_MAP(vid_1_map)
+ I860(config, m_vid_1, XTAL(20'000'000));
+ m_vid_1->set_addrmap(AS_PROGRAM, &vcombat_state::vid_1_map);
/* Sound CPU */
- MCFG_DEVICE_ADD("soundcpu", M68000, XTAL(12'000'000))
- MCFG_DEVICE_PROGRAM_MAP(sound_map)
- MCFG_DEVICE_PERIODIC_INT_DRIVER(vcombat_state, irq1_line_hold, 15000) /* Remove this if MC6845 is enabled */
+ M68000(config, m_soundcpu, XTAL(12'000'000));
+ m_soundcpu->set_addrmap(AS_PROGRAM, &vcombat_state::sound_map);
+ m_soundcpu->set_periodic_int(FUNC(vcombat_state::irq1_line_hold), attotime::from_hz(15000)); /* Remove this if MC6845 is enabled */
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
MCFG_MACHINE_RESET_OVERRIDE(vcombat_state,vcombat)
/* Temporary hack for experimenting with timing. */
#if 0
- //MCFG_QUANTUM_TIME(attotime::from_hz(1200))
- MCFG_QUANTUM_PERFECT_CPU("maincpu")
+ //config.m_minimum_quantum = attotime::from_hz(1200);
+ config.m_perfect_cpu_quantum = subtag("maincpu");
#endif
- MCFG_TLC34076_ADD("tlc34076", TLC34076_6_BIT)
+ TLC34076(config, m_tlc34076, tlc34076_device::TLC34076_6_BIT);
/* Disabled for now as it can't handle multiple screens */
// MC6845(config, m_crtc, 6000000 / 16);
// m_crtc->set_screen("screen");
config.set_default_layout(layout_dualhsxs);
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_RAW_PARAMS(XTAL(12'000'000) / 2, 400, 0, 256, 291, 0, 208)
- MCFG_SCREEN_UPDATE_DRIVER(vcombat_state, screen_update_vcombat_main)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_raw(XTAL(12'000'000) / 2, 400, 0, 256, 291, 0, 208);
+ screen.set_screen_update(FUNC(vcombat_state::screen_update_vcombat_main));
- MCFG_SCREEN_ADD("aux", RASTER)
- MCFG_SCREEN_RAW_PARAMS(XTAL(12'000'000) / 2, 400, 0, 256, 291, 0, 208)
- MCFG_SCREEN_UPDATE_DRIVER(vcombat_state, screen_update_vcombat_aux)
+ screen_device &aux(SCREEN(config, "aux", SCREEN_TYPE_RASTER));
+ aux.set_raw(XTAL(12'000'000) / 2, 400, 0, 256, 291, 0, 208);
+ aux.set_screen_update(FUNC(vcombat_state::screen_update_vcombat_aux));
SPEAKER(config, "speaker").front_center();
- MCFG_DEVICE_ADD("dac", DAC_10BIT_R2R, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 1.0) // unknown DAC
- MCFG_DEVICE_ADD("vref", VOLTAGE_REGULATOR, 0) MCFG_VOLTAGE_REGULATOR_OUTPUT(5.0)
- MCFG_SOUND_ROUTE(0, "dac", 1.0, DAC_VREF_POS_INPUT) MCFG_SOUND_ROUTE(0, "dac", -1.0, DAC_VREF_NEG_INPUT)
-MACHINE_CONFIG_END
+ DAC_10BIT_R2R(config, m_dac, 0).add_route(ALL_OUTPUTS, "speaker", 1.0); // unknown DAC
+ voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref"));
+ vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT);
+ vref.add_route(0, "dac", -1.0, DAC_VREF_NEG_INPUT);
+}
-MACHINE_CONFIG_START(vcombat_state::shadfgtr)
- MCFG_DEVICE_ADD("maincpu", M68000, XTAL(12'000'000))
- MCFG_DEVICE_PROGRAM_MAP(main_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", vcombat_state, irq1_line_assert)
+void vcombat_state::shadfgtr(machine_config &config)
+{
+ M68000(config, m_maincpu, XTAL(12'000'000));
+ m_maincpu->set_addrmap(AS_PROGRAM, &vcombat_state::main_map);
+ m_maincpu->set_vblank_int("screen", FUNC(vcombat_state::irq1_line_assert));
/* The middle board i860 */
- MCFG_DEVICE_ADD("vid_0", I860, XTAL(20'000'000))
- MCFG_DEVICE_PROGRAM_MAP(vid_0_map)
+ I860(config, m_vid_0, XTAL(20'000'000));
+ m_vid_0->set_addrmap(AS_PROGRAM, &vcombat_state::vid_0_map);
/* Sound CPU */
- MCFG_DEVICE_ADD("soundcpu", M68000, XTAL(12'000'000))
- MCFG_DEVICE_PROGRAM_MAP(sound_map)
+ M68000(config, m_soundcpu, XTAL(12'000'000));
+ m_soundcpu->set_addrmap(AS_PROGRAM, &vcombat_state::sound_map);
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
MCFG_MACHINE_RESET_OVERRIDE(vcombat_state,shadfgtr)
- MCFG_TLC34076_ADD("tlc34076", TLC34076_6_BIT)
+ TLC34076(config, m_tlc34076, tlc34076_device::TLC34076_6_BIT);
MC6845(config, m_crtc, XTAL(20'000'000) / 4 / 16);
m_crtc->set_screen("screen");
@@ -633,15 +636,16 @@ MACHINE_CONFIG_START(vcombat_state::shadfgtr)
m_crtc->set_char_width(16);
m_crtc->out_hsync_callback().set(FUNC(vcombat_state::sound_update));
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_RAW_PARAMS(XTAL(20'000'000) / 4, 320, 0, 256, 277, 0, 224)
- MCFG_SCREEN_UPDATE_DRIVER(vcombat_state, screen_update_vcombat_main)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_raw(XTAL(20'000'000) / 4, 320, 0, 256, 277, 0, 224);
+ screen.set_screen_update(FUNC(vcombat_state::screen_update_vcombat_main));
SPEAKER(config, "speaker").front_center();
- MCFG_DEVICE_ADD("dac", DAC_10BIT_R2R, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 1.0) // unknown DAC
- MCFG_DEVICE_ADD("vref", VOLTAGE_REGULATOR, 0) MCFG_VOLTAGE_REGULATOR_OUTPUT(5.0)
- MCFG_SOUND_ROUTE(0, "dac", 1.0, DAC_VREF_POS_INPUT) MCFG_SOUND_ROUTE(0, "dac", -1.0, DAC_VREF_NEG_INPUT)
-MACHINE_CONFIG_END
+ DAC_10BIT_R2R(config, m_dac, 0).add_route(ALL_OUTPUTS, "speaker", 1.0); // unknown DAC
+ voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref"));
+ vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT);
+ vref.add_route(0, "dac", -1.0, DAC_VREF_NEG_INPUT);
+}
ROM_START( vcombat )
diff --git a/src/mame/drivers/vcs80.cpp b/src/mame/drivers/vcs80.cpp
index 638560b9d28..c1e7dc5d051 100644
--- a/src/mame/drivers/vcs80.cpp
+++ b/src/mame/drivers/vcs80.cpp
@@ -213,7 +213,8 @@ void vcs80_state::machine_start()
/* Machine Driver */
-MACHINE_CONFIG_START(vcs80_state::vcs80)
+void vcs80_state::vcs80(machine_config &config)
+{
/* basic machine hardware */
Z80(config, m_maincpu, XTAL(5'000'000)/2); /* U880D */
m_maincpu->set_addrmap(AS_PROGRAM, &vcs80_state::vcs80_mem);
@@ -221,7 +222,7 @@ MACHINE_CONFIG_START(vcs80_state::vcs80)
m_maincpu->set_daisy_config(vcs80_daisy_chain);
/* keyboard timer */
- MCFG_TIMER_DRIVER_ADD_PERIODIC("keyboard", vcs80_state, vcs80_keyboard_tick, attotime::from_hz(1000))
+ TIMER(config, "keyboard").configure_periodic(FUNC(vcs80_state::vcs80_keyboard_tick), attotime::from_hz(1000));
/* video hardware */
config.set_default_layout(layout_vcs80);
@@ -237,7 +238,7 @@ MACHINE_CONFIG_START(vcs80_state::vcs80)
/* bankdev */
ADDRESS_MAP_BANK(config, "bdmem").set_map(&vcs80_state::vcs80_bd_mem).set_options(ENDIANNESS_BIG, 8, 32, 0x10000);
-MACHINE_CONFIG_END
+}
/* ROMs */
diff --git a/src/mame/drivers/vd.cpp b/src/mame/drivers/vd.cpp
index 2d56a9afaa8..e06b9053ff7 100644
--- a/src/mame/drivers/vd.cpp
+++ b/src/mame/drivers/vd.cpp
@@ -186,12 +186,13 @@ void vd_state::machine_reset()
m_t_c = 0;
}
-MACHINE_CONFIG_START(vd_state::vd)
+void vd_state::vd(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, 4000000)
- MCFG_DEVICE_PROGRAM_MAP(vd_map)
- MCFG_DEVICE_IO_MAP(vd_io)
- MCFG_TIMER_DRIVER_ADD_PERIODIC("irq", vd_state, irq, attotime::from_hz(484))
+ Z80(config, m_maincpu, 4000000);
+ m_maincpu->set_addrmap(AS_PROGRAM, &vd_state::vd_map);
+ m_maincpu->set_addrmap(AS_IO, &vd_state::vd_io);
+ TIMER(config, "irq").configure_periodic(FUNC(vd_state::irq), attotime::from_hz(484));
/* Sound */
genpin_audio(config);
@@ -207,7 +208,7 @@ MACHINE_CONFIG_START(vd_state::vd)
/* Video */
config.set_default_layout(layout_vd);
-MACHINE_CONFIG_END
+}
/*-------------------------------------------------------------------
/ Break '86 (1986)
diff --git a/src/mame/drivers/vectrex.cpp b/src/mame/drivers/vectrex.cpp
index 158ce9e9208..79bb72a91f0 100644
--- a/src/mame/drivers/vectrex.cpp
+++ b/src/mame/drivers/vectrex.cpp
@@ -113,7 +113,6 @@ void vectrex_base_state::vectrex_base(machine_config &config)
SPEAKER(config, "speaker").front_center();
MC1408(config, m_dac, 0).add_route(ALL_OUTPUTS, "speaker", 0.25); // mc1408.ic301 (also used for vector generation)
voltage_regulator_device &vreg(VOLTAGE_REGULATOR(config, "vref", 0));
- vreg.set_output(5.0);
vreg.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT);
vreg.add_route(0, "dac", -1.0, DAC_VREF_NEG_INPUT);
diff --git a/src/mame/drivers/vectrix.cpp b/src/mame/drivers/vectrix.cpp
index 477fbb07386..d114ba42119 100644
--- a/src/mame/drivers/vectrix.cpp
+++ b/src/mame/drivers/vectrix.cpp
@@ -50,13 +50,14 @@ void vectrix_state::io_map(address_map &map)
static INPUT_PORTS_START( vectrix )
INPUT_PORTS_END
-MACHINE_CONFIG_START(vectrix_state::vectrix)
- MCFG_DEVICE_ADD("maincpu", I8088, XTAL(14'318'181)/3) // no idea of clock
- MCFG_DEVICE_PROGRAM_MAP(mem_map)
- MCFG_DEVICE_IO_MAP(io_map)
+void vectrix_state::vectrix(machine_config &config)
+{
+ i8088_cpu_device &maincpu(I8088(config, "maincpu", XTAL(14'318'181)/3)); // no idea of clock
+ maincpu.set_addrmap(AS_PROGRAM, &vectrix_state::mem_map);
+ maincpu.set_addrmap(AS_IO, &vectrix_state::io_map);
- MCFG_DEVICE_ADD("uart1", I8251, 0)
-MACHINE_CONFIG_END
+ I8251(config, "uart1", 0);
+}
ROM_START( vectrix )
ROM_REGION( 0x4000, "roms", 0 )
diff --git a/src/mame/drivers/vega.cpp b/src/mame/drivers/vega.cpp
index e4ad27d5dd4..f4046254162 100644
--- a/src/mame/drivers/vega.cpp
+++ b/src/mame/drivers/vega.cpp
@@ -139,7 +139,6 @@ private:
int m_tmp;
int m_t1;
- uint8_t m_ins8154_ram[0x80];
uint8_t m_txt_ram[0x400];
vega_obj m_obj[NUM_OBJ];
@@ -194,7 +193,7 @@ WRITE8_MEMBER(vega_state::extern_w)
case 1: /* 04-07 */
{
/* AY 3-8910 */
- m_ay8910->address_w(space, 0, offset);
+ m_ay8910->address_w(offset);
}
break;
@@ -204,12 +203,12 @@ WRITE8_MEMBER(vega_state::extern_w)
if(m_p2_data&0x40) /* P26 connected to M/IO pin */
{
- m_ins8154_ram[offset&0x7f]=data;
+ m_ins8154->write_ram(offset, data);
}
else
{
//register w ?
- m_ins8154->ins8154_w(space,offset&0x7f,data);
+ m_ins8154->write_io(offset & 0x7f, data);
}
}
break;
@@ -322,7 +321,7 @@ READ8_MEMBER(vega_state::extern_r)
case 1: /* 04-07 */
{
/* AY 3-8910 */
- m_ay8910->data_w(space, 0, offset);
+ m_ay8910->data_w(offset);
return 0xff;//mame_rand(machine);
}
@@ -332,12 +331,12 @@ READ8_MEMBER(vega_state::extern_r)
if(m_p2_data&0x40) /* P26 connected to M/IO pin */
{
- return m_ins8154_ram[offset&0x7f];
+ return m_ins8154->read_ram(offset);
}
else
{
//register r ?
- return m_ins8154->ins8154_r(space,offset&0x7f);
+ return m_ins8154->read_io(offset & 0x7f);
}
}
#if 0
diff --git a/src/mame/drivers/vegaeo.cpp b/src/mame/drivers/vegaeo.cpp
index 13bcacd1e07..6783050ab0b 100644
--- a/src/mame/drivers/vegaeo.cpp
+++ b/src/mame/drivers/vegaeo.cpp
@@ -291,7 +291,7 @@ ROM_END
void vegaeo_state::init_vegaeo()
{
// Set up the QS1000 program ROM banking, taking care not to overlap the internal RAM
- m_qs1000->subdevice<i8052_device>("cpu")->space(AS_IO).install_read_bank(0x0100, 0xffff, "bank");
+ m_qs1000->cpu().space(AS_IO).install_read_bank(0x0100, 0xffff, "bank");
membank("qs1000:bank")->configure_entries(0, 8, memregion("qs1000:cpu")->base()+0x100, 0x10000);
init_speedup();
diff --git a/src/mame/drivers/vegas.cpp b/src/mame/drivers/vegas.cpp
index 1729869a06b..24055d8d194 100644
--- a/src/mame/drivers/vegas.cpp
+++ b/src/mame/drivers/vegas.cpp
@@ -570,13 +570,13 @@ WRITE32_MEMBER( vegas_state::timekeeper_w )
if (m_cmos_unlocked)
{
if (ACCESSING_BITS_0_7)
- m_timekeeper->write(space, offset * 4 + 0, data >> 0, 0xff);
+ m_timekeeper->write(offset * 4 + 0, data >> 0);
if (ACCESSING_BITS_8_15)
- m_timekeeper->write(space, offset * 4 + 1, data >> 8, 0xff);
+ m_timekeeper->write(offset * 4 + 1, data >> 8);
if (ACCESSING_BITS_16_23)
- m_timekeeper->write(space, offset * 4 + 2, data >> 16, 0xff);
+ m_timekeeper->write(offset * 4 + 2, data >> 16);
if (ACCESSING_BITS_24_31)
- m_timekeeper->write(space, offset * 4 + 3, data >> 24, 0xff);
+ m_timekeeper->write(offset * 4 + 3, data >> 24);
if (offset*4 >= 0x7ff0)
if (LOG_TIMEKEEPER) logerror("%s timekeeper_w(%04X & %08X) = %08X\n", machine().describe_context(), offset*4, mem_mask, data);
m_cmos_unlocked = 0;
@@ -590,13 +590,13 @@ READ32_MEMBER( vegas_state::timekeeper_r )
{
uint32_t result = 0xffffffff;
if (ACCESSING_BITS_0_7)
- result = (result & ~0x000000ff) | (m_timekeeper->read(space, offset * 4 + 0, 0xff) << 0);
+ result = (result & ~0x000000ff) | (m_timekeeper->read(offset * 4 + 0) << 0);
if (ACCESSING_BITS_8_15)
- result = (result & ~0x0000ff00) | (m_timekeeper->read(space, offset * 4 + 1, 0xff) << 8);
+ result = (result & ~0x0000ff00) | (m_timekeeper->read(offset * 4 + 1) << 8);
if (ACCESSING_BITS_16_23)
- result = (result & ~0x00ff0000) | (m_timekeeper->read(space, offset * 4 + 2, 0xff) << 16);
+ result = (result & ~0x00ff0000) | (m_timekeeper->read(offset * 4 + 2) << 16);
if (ACCESSING_BITS_24_31)
- result = (result & ~0xff000000) | (m_timekeeper->read(space, offset * 4 + 3, 0xff) << 24);
+ result = (result & ~0xff000000) | (m_timekeeper->read(offset * 4 + 3) << 24);
if (offset * 4 >= 0x7ff0) {
// Initial RTC check expects reads to the RTC to take some time
m_maincpu->eat_cycles(30);
@@ -822,7 +822,7 @@ WRITE8_MEMBER(vegas_state::sio_w)
break;
case 7:
// Watchdog
- m_timekeeper->watchdog_write(space, offset, data);
+ m_timekeeper->watchdog_write();
if (0 && LOG_SIO)
logerror("sio_w: Watchdog: %08x index: %d data: %02X\n", offset, index, data);
//m_maincpu->eat_cycles(100);
@@ -1739,7 +1739,8 @@ void vegas_state::vegas_cs8_map(address_map &map)
*
*************************************/
-MACHINE_CONFIG_START(vegas_state::vegascore)
+void vegas_state::vegascore(machine_config &config)
+{
/* basic machine hardware */
R5000LE(config, m_maincpu, vegas_state::SYSTEM_CLOCK * 2);
m_maincpu->set_icache_size(16384);
@@ -1782,35 +1783,40 @@ MACHINE_CONFIG_START(vegas_state::vegascore)
screen.set_size(640, 480);
screen.set_visarea(0, 640 - 1, 0, 480 - 1);
screen.set_screen_update(PCI_ID_VIDEO, FUNC(voodoo_pci_device::screen_update));
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(vegas_state::vegas)
+void vegas_state::vegas(machine_config &config)
+{
vegascore(config);
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(vegas_state::vegas250)
+void vegas_state::vegas250(machine_config &config)
+{
vegascore(config);
m_maincpu->set_clock(vegas_state::SYSTEM_CLOCK*2.5);
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(vegas_state::vegas32m)
+void vegas_state::vegas32m(machine_config &config)
+{
vegas250(config);
m_nile->set_sdram_size(0, 0x02000000);
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(vegas_state::vegasban)
+void vegas_state::vegasban(machine_config &config)
+{
vegas32m(config);
voodoo_banshee_pci_device &voodoo(VOODOO_BANSHEE_PCI(config.replace(), PCI_ID_VIDEO, 0, m_maincpu, "screen"));
voodoo.set_fbmem(16);
subdevice<voodoo_device>(PCI_ID_VIDEO":voodoo")->vblank_callback().set(FUNC(vegas_state::vblank_assert));
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(vegas_state::vegasv3)
+void vegas_state::vegasv3(machine_config &config)
+{
vegas32m(config);
RM7000LE(config.replace(), m_maincpu, vegas_state::SYSTEM_CLOCK * 2.5);
m_maincpu->set_icache_size(16384);
@@ -1820,10 +1826,11 @@ MACHINE_CONFIG_START(vegas_state::vegasv3)
voodoo_3_pci_device &voodoo(VOODOO_3_PCI(config.replace(), PCI_ID_VIDEO, 0, m_maincpu, "screen"));
voodoo.set_fbmem(16);
subdevice<voodoo_device>(PCI_ID_VIDEO":voodoo")->vblank_callback().set(FUNC(vegas_state::vblank_assert));
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(vegas_state::denver)
+void vegas_state::denver(machine_config &config)
+{
vegascore(config);
RM7000LE(config.replace(), m_maincpu, vegas_state::SYSTEM_CLOCK * 2.5);
@@ -1864,11 +1871,12 @@ MACHINE_CONFIG_START(vegas_state::denver)
ttys02.ri_handler().set(m_uart2, FUNC(ins8250_uart_device::ri_w));
ttys02.cts_handler().set(m_uart2, FUNC(ins8250_uart_device::cts_w));
-MACHINE_CONFIG_END
+}
// Per driver configs
-MACHINE_CONFIG_START(vegas_state::gauntleg)
+void vegas_state::gauntleg(machine_config &config)
+{
vegas(config);
dcs2_audio_2104_device &dcs(DCS2_AUDIO_2104(config, "dcs", 0));
dcs.set_dram_in_mb(4);
@@ -1880,9 +1888,10 @@ MACHINE_CONFIG_START(vegas_state::gauntleg)
m_ioasic->set_yearoffs(80);
m_ioasic->irq_handler().set(FUNC(vegas_state::ioasic_irq));
m_ioasic->set_auto_ack(1);
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(vegas_state::gauntdl)
+void vegas_state::gauntdl(machine_config &config)
+{
vegas(config);
dcs2_audio_2104_device &dcs(DCS2_AUDIO_2104(config, "dcs", 0));
dcs.set_dram_in_mb(4);
@@ -1894,9 +1903,10 @@ MACHINE_CONFIG_START(vegas_state::gauntdl)
m_ioasic->set_yearoffs(80);
m_ioasic->irq_handler().set(FUNC(vegas_state::ioasic_irq));
m_ioasic->set_auto_ack(1);
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(vegas_state::warfa)
+void vegas_state::warfa(machine_config &config)
+{
vegas250(config);
dcs2_audio_2104_device &dcs(DCS2_AUDIO_2104(config, "dcs", 0));
dcs.set_dram_in_mb(4);
@@ -1908,9 +1918,10 @@ MACHINE_CONFIG_START(vegas_state::warfa)
m_ioasic->set_yearoffs(80);
m_ioasic->irq_handler().set(FUNC(vegas_state::ioasic_irq));
m_ioasic->set_auto_ack(1);
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(vegas_state::tenthdeg)
+void vegas_state::tenthdeg(machine_config &config)
+{
vegas(config);
dcs2_audio_2115_device &dcs(DCS2_AUDIO_2115(config, "dcs", 0));
dcs.set_dram_in_mb(4);
@@ -1922,9 +1933,10 @@ MACHINE_CONFIG_START(vegas_state::tenthdeg)
m_ioasic->set_yearoffs(80);
m_ioasic->irq_handler().set(FUNC(vegas_state::ioasic_irq));
m_ioasic->set_auto_ack(1);
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(vegas_state::roadburn)
+void vegas_state::roadburn(machine_config &config)
+{
vegas32m(config);
dcs2_audio_dsio_device &dcs(DCS2_AUDIO_DSIO(config, "dcs", 0));
dcs.set_dram_in_mb(4);
@@ -1936,9 +1948,10 @@ MACHINE_CONFIG_START(vegas_state::roadburn)
m_ioasic->set_yearoffs(80);
m_ioasic->irq_handler().set(FUNC(vegas_state::ioasic_irq));
m_ioasic->set_auto_ack(1);
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(vegas_state::nbashowt)
+void vegas_state::nbashowt(machine_config &config)
+{
vegasban(config);
dcs2_audio_2104_device &dcs(DCS2_AUDIO_2104(config, "dcs", 0));
dcs.set_dram_in_mb(4);
@@ -1952,9 +1965,10 @@ MACHINE_CONFIG_START(vegas_state::nbashowt)
m_ioasic->irq_handler().set(FUNC(vegas_state::ioasic_irq));
//m_ioasic->set_auto_ack(1)
m_ioasic->aux_output_handler().set(FUNC(vegas_state::i40_w));
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(vegas_state::nbanfl)
+void vegas_state::nbanfl(machine_config &config)
+{
vegasban(config);
dcs2_audio_2104_device &dcs(DCS2_AUDIO_2104(config, "dcs", 0));
dcs.set_dram_in_mb(4);
@@ -1967,9 +1981,10 @@ MACHINE_CONFIG_START(vegas_state::nbanfl)
m_ioasic->irq_handler().set(FUNC(vegas_state::ioasic_irq));
//m_ioasic->set_auto_ack(1)
m_ioasic->aux_output_handler().set(FUNC(vegas_state::i40_w));
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(vegas_state::nbagold)
+void vegas_state::nbagold(machine_config &config)
+{
vegasban(config);
QED5271LE(config.replace(), m_maincpu, vegas_state::SYSTEM_CLOCK * 2.5);
m_maincpu->set_icache_size(32768);
@@ -1987,9 +2002,10 @@ MACHINE_CONFIG_START(vegas_state::nbagold)
m_ioasic->irq_handler().set(FUNC(vegas_state::ioasic_irq));
//m_ioasic->set_auto_ack(1)
m_ioasic->aux_output_handler().set(FUNC(vegas_state::i40_w));
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(vegas_state::sf2049)
+void vegas_state::sf2049(machine_config &config)
+{
denver(config);
dcs2_audio_denver_5ch_device &dcs(DCS2_AUDIO_DENVER_5CH(config, "dcs", 0));
dcs.set_dram_in_mb(8);
@@ -2002,9 +2018,10 @@ MACHINE_CONFIG_START(vegas_state::sf2049)
m_ioasic->irq_handler().set(FUNC(vegas_state::ioasic_irq));
m_ioasic->set_auto_ack(1);
m_ioasic->aux_output_handler().set(FUNC(vegas_state::wheel_board_w));
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(vegas_state::sf2049se)
+void vegas_state::sf2049se(machine_config &config)
+{
denver(config);
dcs2_audio_denver_5ch_device &dcs(DCS2_AUDIO_DENVER_5CH(config, "dcs", 0));
dcs.set_dram_in_mb(8);
@@ -2017,9 +2034,10 @@ MACHINE_CONFIG_START(vegas_state::sf2049se)
m_ioasic->irq_handler().set(FUNC(vegas_state::ioasic_irq));
m_ioasic->set_auto_ack(1);
m_ioasic->aux_output_handler().set(FUNC(vegas_state::wheel_board_w));
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(vegas_state::sf2049te)
+void vegas_state::sf2049te(machine_config &config)
+{
denver(config);
dcs2_audio_denver_5ch_device &dcs(DCS2_AUDIO_DENVER_5CH(config, "dcs", 0));
dcs.set_dram_in_mb(8);
@@ -2032,9 +2050,10 @@ MACHINE_CONFIG_START(vegas_state::sf2049te)
m_ioasic->irq_handler().set(FUNC(vegas_state::ioasic_irq));
m_ioasic->set_auto_ack(1);
m_ioasic->aux_output_handler().set(FUNC(vegas_state::wheel_board_w));
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(vegas_state::cartfury)
+void vegas_state::cartfury(machine_config &config)
+{
vegasv3(config);
dcs2_audio_2104_device &dcs(DCS2_AUDIO_2104(config, "dcs", 0));
dcs.set_dram_in_mb(4);
@@ -2047,7 +2066,7 @@ MACHINE_CONFIG_START(vegas_state::cartfury)
m_ioasic->set_yearoffs(80);
m_ioasic->irq_handler().set(FUNC(vegas_state::ioasic_irq));
//m_ioasic->set_auto_ack(1)
-MACHINE_CONFIG_END
+}
/*************************************
diff --git a/src/mame/drivers/vertigo.cpp b/src/mame/drivers/vertigo.cpp
index 1dd61368b7a..e71ff96f89c 100644
--- a/src/mame/drivers/vertigo.cpp
+++ b/src/mame/drivers/vertigo.cpp
@@ -106,12 +106,12 @@ INPUT_PORTS_END
*
*************************************/
-MACHINE_CONFIG_START(vertigo_state::vertigo)
-
+void vertigo_state::vertigo(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M68000, 24_MHz_XTAL / 3)
- MCFG_DEVICE_PROGRAM_MAP(vertigo_map)
- MCFG_DEVICE_PERIODIC_INT_DRIVER(vertigo_state, vertigo_interrupt, 60)
+ M68000(config, m_maincpu, 24_MHz_XTAL / 3);
+ m_maincpu->set_addrmap(AS_PROGRAM, &vertigo_state::vertigo_map);
+ m_maincpu->set_periodic_int(FUNC(vertigo_state::vertigo_interrupt), attotime::from_hz(60));
ADC0808(config, m_adc, 24_MHz_XTAL / 30); // E clock from 68000
m_adc->eoc_ff_callback().set(FUNC(vertigo_state::adc_eoc_w));
@@ -123,9 +123,9 @@ MACHINE_CONFIG_START(vertigo_state::vertigo)
SPEAKER(config, "lspeaker").front_left();
SPEAKER(config, "rspeaker").front_right();
- MCFG_DEVICE_ADD("440audio", EXIDY440, EXIDY440_MC3418_CLOCK)
- MCFG_SOUND_ROUTE(0, "lspeaker", 1.0)
- MCFG_SOUND_ROUTE(1, "rspeaker", 1.0)
+ EXIDY440(config, m_custom, EXIDY440_MC3418_CLOCK);
+ m_custom->add_route(0, "lspeaker", 1.0);
+ m_custom->add_route(1, "rspeaker", 1.0);
pit8254_device &pit(PIT8254(config, "pit", 0));
pit.set_clk<0>(24_MHz_XTAL / 100);
@@ -143,13 +143,13 @@ MACHINE_CONFIG_START(vertigo_state::vertigo)
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
/* video hardware */
- MCFG_VECTOR_ADD("vector")
- MCFG_SCREEN_ADD("screen", VECTOR)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_SIZE(400, 300)
- MCFG_SCREEN_VISIBLE_AREA(0, 510, 0, 400)
- MCFG_SCREEN_UPDATE_DEVICE("vector", vector_device, screen_update)
-MACHINE_CONFIG_END
+ VECTOR(config, m_vector, 0);
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_VECTOR));
+ screen.set_refresh_hz(60);
+ screen.set_size(400, 300);
+ screen.set_visarea(0, 510, 0, 400);
+ screen.set_screen_update("vector", FUNC(vector_device::screen_update));
+}
/*************************************
diff --git a/src/mame/drivers/vg5k.cpp b/src/mame/drivers/vg5k.cpp
index 8f3067b28e5..b6a45e97834 100644
--- a/src/mame/drivers/vg5k.cpp
+++ b/src/mame/drivers/vg5k.cpp
@@ -131,13 +131,13 @@ WRITE8_MEMBER ( vg5k_state::ef9345_offset_w )
READ8_MEMBER ( vg5k_state::ef9345_io_r )
{
- return m_ef9345->data_r(space, m_ef9345_offset, 0xff);
+ return m_ef9345->data_r(m_ef9345_offset);
}
WRITE8_MEMBER ( vg5k_state::ef9345_io_w )
{
- m_ef9345->data_w(space, m_ef9345_offset, data, 0xff);
+ m_ef9345->data_w(m_ef9345_offset, data);
}
@@ -366,54 +366,54 @@ void vg5k_state::init_vg5k()
}
-MACHINE_CONFIG_START(vg5k_state::vg5k)
-
+void vg5k_state::vg5k(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu",Z80, XTAL(4'000'000))
- MCFG_DEVICE_PROGRAM_MAP(vg5k_mem)
- MCFG_DEVICE_IO_MAP(vg5k_io)
+ Z80(config, m_maincpu, XTAL(4'000'000));
+ m_maincpu->set_addrmap(AS_PROGRAM, &vg5k_state::vg5k_mem);
+ m_maincpu->set_addrmap(AS_IO, &vg5k_state::vg5k_io);
- MCFG_TIMER_DRIVER_ADD_SCANLINE("vg5k_scanline", vg5k_state, vg5k_scanline, "screen", 0, 10)
+ TIMER(config, "vg5k_scanline").configure_scanline(FUNC(vg5k_state::vg5k_scanline), "screen", 0, 10);
- MCFG_TIMER_DRIVER_ADD_PERIODIC("irq_timer", vg5k_state, z80_irq, attotime::from_msec(20))
+ TIMER(config, "irq_timer").configure_periodic(FUNC(vg5k_state::z80_irq), attotime::from_msec(20));
- MCFG_DEVICE_ADD("ef9345", EF9345, 0)
- MCFG_EF9345_PALETTE("palette")
+ EF9345(config, m_ef9345, 0);
+ m_ef9345->set_palette_tag("palette");
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(50)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */
- MCFG_SCREEN_UPDATE_DEVICE("ef9345", ef9345_device, screen_update)
- MCFG_SCREEN_SIZE(336, 300)
- MCFG_SCREEN_VISIBLE_AREA(00, 336-1, 00, 270-1)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(50);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */
+ screen.set_screen_update("ef9345", FUNC(ef9345_device::screen_update));
+ screen.set_size(336, 300);
+ screen.set_visarea(00, 336-1, 00, 270-1);
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_vg5k)
- MCFG_PALETTE_ADD("palette", 8)
+ GFXDECODE(config, "gfxdecode", "palette", gfx_vg5k);
+ PALETTE(config, "palette").set_entries(8);
/* sound hardware */
SPEAKER(config, "speaker").front_center();
DAC_1BIT(config, "dac", 0).add_route(ALL_OUTPUTS, "speaker", 0.125);
- MCFG_DEVICE_ADD("vref", VOLTAGE_REGULATOR, 0) MCFG_VOLTAGE_REGULATOR_OUTPUT(5.0)
- MCFG_SOUND_ROUTE(0, "dac", 1.0, DAC_VREF_POS_INPUT)
+ voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref", 0));
+ vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT);
/* cassette */
- WAVE(config, "wave", "cassette").add_route(0, "speaker", 0.25);
+ WAVE(config, "wave", m_cassette).add_route(0, "speaker", 0.25);
- MCFG_CASSETTE_ADD( "cassette" )
- MCFG_CASSETTE_FORMATS(vg5k_cassette_formats)
- MCFG_CASSETTE_DEFAULT_STATE(CASSETTE_STOPPED | CASSETTE_MASK_SPEAKER)
- MCFG_CASSETTE_INTERFACE("vg5k_cass")
+ CASSETTE(config, m_cassette);
+ m_cassette->set_formats(vg5k_cassette_formats);
+ m_cassette->set_default_state(CASSETTE_STOPPED | CASSETTE_MASK_SPEAKER);
+ m_cassette->set_interface("vg5k_cass");
/* printer */
- MCFG_DEVICE_ADD("printer", PRINTER, 0)
+ PRINTER(config, m_printer, 0);
/* internal ram */
RAM(config, RAM_TAG).set_default_size("16K").set_extra_options("32K,48K");
/* Software lists */
- MCFG_SOFTWARE_LIST_ADD("cass_list", "vg5k")
-MACHINE_CONFIG_END
+ SOFTWARE_LIST(config, "cass_list").set_original("vg5k");
+}
/* ROM definition */
ROM_START( vg5k )
diff --git a/src/mame/drivers/vgmplay.cpp b/src/mame/drivers/vgmplay.cpp
index e115040bc53..442c2ee33e7 100644
--- a/src/mame/drivers/vgmplay.cpp
+++ b/src/mame/drivers/vgmplay.cpp
@@ -3087,22 +3087,22 @@ WRITE8_MEMBER(vgmplay_state::scc_w)
switch (offset >> 1)
{
case 0x00:
- m_k051649[Index]->k051649_waveform_w(space, m_scc_reg[Index], data);
+ m_k051649[Index]->k051649_waveform_w(m_scc_reg[Index], data);
break;
case 0x01:
- m_k051649[Index]->k051649_frequency_w(space, m_scc_reg[Index], data);
+ m_k051649[Index]->k051649_frequency_w(m_scc_reg[Index], data);
break;
case 0x02:
- m_k051649[Index]->k051649_volume_w(space, m_scc_reg[Index], data);
+ m_k051649[Index]->k051649_volume_w(m_scc_reg[Index], data);
break;
case 0x03:
- m_k051649[Index]->k051649_keyonoff_w(space, m_scc_reg[Index], data);
+ m_k051649[Index]->k051649_keyonoff_w(data);
break;
case 0x04:
- m_k051649[Index]->k052539_waveform_w(space, m_scc_reg[Index], data);
+ m_k051649[Index]->k052539_waveform_w(m_scc_reg[Index], data);
break;
case 0x05:
- m_k051649[Index]->k051649_test_w(space, m_scc_reg[Index], data);
+ m_k051649[Index]->k051649_test_w(data);
break;
}
break;
@@ -3152,9 +3152,9 @@ void vgmplay_state::file_map(address_map &map)
void vgmplay_state::soundchips_map(address_map &map)
{
map(vgmplay_device::REG_SIZE, vgmplay_device::REG_SIZE + 3).r(FUNC(vgmplay_state::file_size_r));
- map(vgmplay_device::A_SN76489_0 + 0, vgmplay_device::A_SN76489_0 + 0).w(m_sn76489[0], FUNC(sn76489_device::command_w));
+ map(vgmplay_device::A_SN76489_0 + 0, vgmplay_device::A_SN76489_0 + 0).w(m_sn76489[0], FUNC(sn76489_device::write));
//map(vgmplay_device::A_SN76489_0 + 1, vgmplay_device::A_SN76489_0 + 1).w(m_sn76489[0], FUNC(sn76489_device::stereo_w)); // TODO: GG stereo
- map(vgmplay_device::A_SN76489_1 + 0, vgmplay_device::A_SN76489_1 + 0).w(m_sn76489[1], FUNC(sn76489_device::command_w));
+ map(vgmplay_device::A_SN76489_1 + 0, vgmplay_device::A_SN76489_1 + 0).w(m_sn76489[1], FUNC(sn76489_device::write));
//map(vgmplay_device::A_SN76489_1 + 1, vgmplay_device::A_SN76489_1 + 1).w(m_sn76489[1], FUNC(sn76489_device::stereo_w)); // TODO: GG stereo
map(vgmplay_device::A_YM2413_0, vgmplay_device::A_YM2413_0 + 1).w(m_ym2413[0], FUNC(ym2413_device::write));
map(vgmplay_device::A_YM2413_1, vgmplay_device::A_YM2413_1 + 1).w(m_ym2413[1], FUNC(ym2413_device::write));
@@ -3435,10 +3435,10 @@ MACHINE_CONFIG_START(vgmplay_state::vgmplay)
m_vgmplay->set_addrmap(AS_IO, &vgmplay_state::soundchips_map);
m_vgmplay->set_addrmap(AS_IO16, &vgmplay_state::soundchips16_map);
- MCFG_QUICKLOAD_ADD("quickload", vgmplay_state, load_file, "vgm,vgz", 0)
+ MCFG_QUICKLOAD_ADD("quickload", vgmplay_state, load_file, "vgm,vgz")
MCFG_QUICKLOAD_INTERFACE("vgm_quik")
- MCFG_SOFTWARE_LIST_ADD("vgm_list", "vgmplay")
+ SOFTWARE_LIST(config, "vgm_list").set_original("vgmplay");
config.set_default_layout(layout_vgmplay);
diff --git a/src/mame/drivers/vic10.cpp b/src/mame/drivers/vic10.cpp
index cc3a96c2c7e..68f8d95a13e 100644
--- a/src/mame/drivers/vic10.cpp
+++ b/src/mame/drivers/vic10.cpp
@@ -72,21 +72,21 @@ private:
virtual void machine_start() override;
virtual void machine_reset() override;
- DECLARE_READ8_MEMBER( read );
- DECLARE_WRITE8_MEMBER( write );
+ uint8_t read(offs_t offset);
+ void write(offs_t offset, uint8_t data);
- DECLARE_READ8_MEMBER( vic_videoram_r );
- DECLARE_READ8_MEMBER( vic_colorram_r );
+ uint8_t vic_videoram_r(offs_t offset);
+ uint8_t vic_colorram_r(offs_t offset);
- DECLARE_READ8_MEMBER( sid_potx_r );
- DECLARE_READ8_MEMBER( sid_poty_r );
+ uint8_t sid_potx_r();
+ uint8_t sid_poty_r();
- DECLARE_READ8_MEMBER( cia_pa_r );
- DECLARE_READ8_MEMBER( cia_pb_r );
- DECLARE_WRITE8_MEMBER( cia_pb_w );
+ uint8_t cia_pa_r();
+ uint8_t cia_pb_r();
+ void cia_pb_w(uint8_t data);
- DECLARE_READ8_MEMBER( cpu_r );
- DECLARE_WRITE8_MEMBER( cpu_w );
+ uint8_t cpu_r();
+ void cpu_w(uint8_t data);
DECLARE_WRITE_LINE_MEMBER( exp_reset_w );
@@ -104,7 +104,7 @@ private:
// read -
//-------------------------------------------------
-READ8_MEMBER( vic10_state::read )
+uint8_t vic10_state::read(offs_t offset)
{
// TODO this is really handled by the PLA
@@ -125,11 +125,11 @@ READ8_MEMBER( vic10_state::read )
}
else if (offset >= 0xd000 && offset < 0xd400)
{
- data = m_vic->read(space, offset & 0x3f);
+ data = m_vic->read(offset & 0x3f);
}
else if (offset >= 0xd400 && offset < 0xd800)
{
- data = m_sid->read(space, offset & 0x1f);
+ data = m_sid->read(offset & 0x1f);
}
else if (offset >= 0xd800 && offset < 0xdc00)
{
@@ -137,14 +137,14 @@ READ8_MEMBER( vic10_state::read )
}
else if (offset >= 0xdc00 && offset < 0xe000)
{
- data = m_cia->read(space, offset & 0x0f);
+ data = m_cia->read(offset & 0x0f);
}
else if (offset >= 0xe000)
{
uprom = 0;
}
- return m_exp->cd_r(space, offset, data, lorom, uprom, exram);
+ return m_exp->cd_r(offset, data, lorom, uprom, exram);
}
@@ -152,7 +152,7 @@ READ8_MEMBER( vic10_state::read )
// write -
//-------------------------------------------------
-WRITE8_MEMBER( vic10_state::write )
+void vic10_state::write(offs_t offset, uint8_t data)
{
// TODO this is really handled by the PLA
@@ -168,11 +168,11 @@ WRITE8_MEMBER( vic10_state::write )
}
else if (offset >= 0xd000 && offset < 0xd400)
{
- m_vic->write(space, offset & 0x3f, data);
+ m_vic->write(offset & 0x3f, data);
}
else if (offset >= 0xd400 && offset < 0xd800)
{
- m_sid->write(space, offset & 0x1f, data);
+ m_sid->write(offset & 0x1f, data);
}
else if (offset >= 0xd800 && offset < 0xdc00)
{
@@ -180,10 +180,10 @@ WRITE8_MEMBER( vic10_state::write )
}
else if (offset >= 0xdc00 && offset < 0xe000)
{
- m_cia->write(space, offset & 0x0f, data);
+ m_cia->write(offset & 0x0f, data);
}
- m_exp->cd_w(space, offset, data, lorom, uprom, exram);
+ m_exp->cd_w(offset, data, lorom, uprom, exram);
}
@@ -191,7 +191,7 @@ WRITE8_MEMBER( vic10_state::write )
// vic_videoram_r -
//-------------------------------------------------
-READ8_MEMBER( vic10_state::vic_videoram_r )
+uint8_t vic10_state::vic_videoram_r(offs_t offset)
{
address_space &program = m_maincpu->space(AS_PROGRAM);
@@ -206,7 +206,7 @@ READ8_MEMBER( vic10_state::vic_videoram_r )
// vic_colorram_r -
//-------------------------------------------------
-READ8_MEMBER( vic10_state::vic_colorram_r )
+uint8_t vic10_state::vic_colorram_r(offs_t offset)
{
return m_color_ram[offset];
}
@@ -355,11 +355,11 @@ INPUT_PORTS_END
// sid6581_interface sid_intf
//-------------------------------------------------
-READ8_MEMBER( vic10_state::sid_potx_r )
+uint8_t vic10_state::sid_potx_r()
{
uint8_t data = 0xff;
- switch (m_cia->read_pa() >> 6)
+ switch (m_cia->pa_r() >> 6)
{
case 1: data = m_joy1->read_pot_x(); break;
case 2: data = m_joy2->read_pot_x(); break;
@@ -382,11 +382,11 @@ READ8_MEMBER( vic10_state::sid_potx_r )
return data;
}
-READ8_MEMBER( vic10_state::sid_poty_r )
+uint8_t vic10_state::sid_poty_r()
{
uint8_t data = 0xff;
- switch (m_cia->read_pa() >> 6)
+ switch (m_cia->pa_r() >> 6)
{
case 1: data = m_joy1->read_pot_y(); break;
case 2: data = m_joy2->read_pot_y(); break;
@@ -414,7 +414,7 @@ READ8_MEMBER( vic10_state::sid_poty_r )
// MOS6526_INTERFACE( cia_intf )
//-------------------------------------------------
-READ8_MEMBER( vic10_state::cia_pa_r )
+uint8_t vic10_state::cia_pa_r()
{
/*
@@ -440,7 +440,7 @@ READ8_MEMBER( vic10_state::cia_pa_r )
data &= ~(!BIT(joy_b, 5) << 4);
// keyboard
- uint8_t cia_pb = m_cia->read_pb();
+ uint8_t cia_pb = m_cia->pb_r();
uint32_t row[8] = { m_row[0]->read(), m_row[1]->read() & m_lock->read(), m_row[2]->read(), m_row[3]->read(),
m_row[4]->read(), m_row[5]->read(), m_row[6]->read(), m_row[7]->read() };
@@ -462,7 +462,7 @@ READ8_MEMBER( vic10_state::cia_pa_r )
return data;
}
-READ8_MEMBER( vic10_state::cia_pb_r )
+uint8_t vic10_state::cia_pb_r()
{
/*
@@ -488,7 +488,7 @@ READ8_MEMBER( vic10_state::cia_pb_r )
data &= ~(!BIT(joy_a, 5) << 4);
// keyboard
- uint8_t cia_pa = m_cia->read_pa();
+ uint8_t cia_pa = m_cia->pa_r();
if (!BIT(cia_pa, 7)) data &= m_row[7]->read();
if (!BIT(cia_pa, 6)) data &= m_row[6]->read();
@@ -502,7 +502,7 @@ READ8_MEMBER( vic10_state::cia_pb_r )
return data;
}
-WRITE8_MEMBER( vic10_state::cia_pb_w )
+void vic10_state::cia_pb_w(uint8_t data)
{
/*
@@ -527,7 +527,7 @@ WRITE8_MEMBER( vic10_state::cia_pb_w )
// M6510_INTERFACE( cpu_intf )
//-------------------------------------------------
-READ8_MEMBER( vic10_state::cpu_r )
+uint8_t vic10_state::cpu_r()
{
/*
@@ -553,7 +553,7 @@ READ8_MEMBER( vic10_state::cpu_r )
return data;
}
-WRITE8_MEMBER( vic10_state::cpu_w )
+void vic10_state::cpu_w(uint8_t data)
{
/*
@@ -568,7 +568,7 @@ WRITE8_MEMBER( vic10_state::cpu_w )
*/
- if (BIT(offset, 0))
+ if (0 /*BIT(offset, 0)*/) // what offset?
{
m_exp->p0_w(BIT(data, 0));
}
@@ -637,7 +637,7 @@ void vic10_state::machine_reset()
//**************************************************************************
//-------------------------------------------------
-// MACHINE_CONFIG( vic10 )
+// machine_config( vic10 )
//-------------------------------------------------
void vic10_state::vic10(machine_config &config)
diff --git a/src/mame/drivers/vic20.cpp b/src/mame/drivers/vic20.cpp
index 7565b03e80d..003cab1cb09 100644
--- a/src/mame/drivers/vic20.cpp
+++ b/src/mame/drivers/vic20.cpp
@@ -248,7 +248,7 @@ READ8_MEMBER( vic20_state::read )
break;
}
- return m_exp->cd_r(space, offset & 0x1fff, data, ram1, ram2, ram3, blk1, blk2, blk3, blk5, io2, io3);
+ return m_exp->cd_r(offset & 0x1fff, data, ram1, ram2, ram3, blk1, blk2, blk3, blk5, io2, io3);
}
@@ -315,7 +315,7 @@ WRITE8_MEMBER( vic20_state::write )
case BLK5: blk5 = 0; break;
}
- m_exp->cd_w(space, offset & 0x1fff, data, ram1, ram2, ram3, blk1, blk2, blk3, blk5, io2, io3);
+ m_exp->cd_w(offset & 0x1fff, data, ram1, ram2, ram3, blk1, blk2, blk3, blk5, io2, io3);
}
@@ -353,7 +353,7 @@ READ8_MEMBER( vic20_state::vic_videoram_r )
data = m_charom[offset & 0xfff];
}
- return m_exp->cd_r(space, offset & 0x1fff, data, ram1, ram2, ram3, blk1, blk2, blk3, blk5, io2, io3);
+ return m_exp->cd_r(offset & 0x1fff, data, ram1, ram2, ram3, blk1, blk2, blk3, blk5, io2, io3);
}
@@ -844,8 +844,8 @@ void vic20_state::vic20(machine_config &config, const char* softlist_filter)
m_user->pl_handler().set(m_via1, FUNC(via6522_device::write_pb7));
m_user->pm_handler().set(m_via1, FUNC(via6522_device::write_cb2));
- quickload_image_device &quickload(QUICKLOAD(config, "quickload", 0));
- quickload.set_handler(snapquick_load_delegate(&QUICKLOAD_LOAD_NAME(vic20_state, cbm_vc20), this), "p00,prg", CBM_QUICKLOAD_DELAY_SECONDS);
+ quickload_image_device &quickload(QUICKLOAD(config, "quickload"));
+ quickload.set_handler(snapquick_load_delegate(&QUICKLOAD_LOAD_NAME(vic20_state, cbm_vc20), this), "p00,prg", CBM_QUICKLOAD_DELAY);
SOFTWARE_LIST(config, "cart_list").set_type("vic1001_cart", SOFTWARE_LIST_ORIGINAL_SYSTEM).set_filter(softlist_filter);
SOFTWARE_LIST(config, "cass_list").set_type("vic1001_cass", SOFTWARE_LIST_ORIGINAL_SYSTEM).set_filter(softlist_filter);
diff --git a/src/mame/drivers/vicdual.cpp b/src/mame/drivers/vicdual.cpp
index d639d393048..2336bbf6057 100644
--- a/src/mame/drivers/vicdual.cpp
+++ b/src/mame/drivers/vicdual.cpp
@@ -267,17 +267,17 @@ void vicdual_state::machine_start()
}
-MACHINE_CONFIG_START(vicdual_state::vicdual_root)
-
+void vicdual_state::vicdual_root(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, VICDUAL_MAIN_CPU_CLOCK)
+ Z80(config, m_maincpu, VICDUAL_MAIN_CPU_CLOCK);
- MCFG_TIMER_DRIVER_ADD("coinstate", vicdual_state, clear_coin_status)
+ TIMER(config, m_coinstate_timer).configure_generic(FUNC(vicdual_state::clear_coin_status));
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_RAW_PARAMS(VICDUAL_PIXEL_CLOCK, VICDUAL_HTOTAL, VICDUAL_HBEND, VICDUAL_HBSTART, VICDUAL_VTOTAL, VICDUAL_VBEND, VICDUAL_VBSTART)
-MACHINE_CONFIG_END
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_raw(VICDUAL_PIXEL_CLOCK, VICDUAL_HTOTAL, VICDUAL_HBEND, VICDUAL_HBSTART, VICDUAL_VTOTAL, VICDUAL_VBEND, VICDUAL_VBSTART);
+}
@@ -346,22 +346,22 @@ static INPUT_PORTS_START( depthch )
INPUT_PORTS_END
-MACHINE_CONFIG_START(vicdual_state::depthch)
+void vicdual_state::depthch(machine_config &config)
+{
vicdual_root(config);
/* basic machine hardware */
- MCFG_DEVICE_REPLACE("maincpu", I8080, VICDUAL_MAIN_CPU_CLOCK)
- MCFG_DEVICE_PROGRAM_MAP(depthch_map)
- MCFG_DEVICE_IO_MAP(depthch_io_map)
+ I8080(config.replace(), m_maincpu, VICDUAL_MAIN_CPU_CLOCK);
+ m_maincpu->set_addrmap(AS_PROGRAM, &vicdual_state::depthch_map);
+ m_maincpu->set_addrmap(AS_IO, &vicdual_state::depthch_io_map);
/* video hardware */
- MCFG_SCREEN_MODIFY("screen")
- MCFG_SCREEN_UPDATE_DRIVER(vicdual_state, screen_update_bw)
+ m_screen->set_screen_update(FUNC(vicdual_state::screen_update_bw));
/* audio hardware */
SPEAKER(config, "mono").front_center();
depthch_audio(config);
-MACHINE_CONFIG_END
+}
@@ -436,18 +436,17 @@ static INPUT_PORTS_START( safari )
INPUT_PORTS_END
-MACHINE_CONFIG_START(vicdual_state::safari)
+void vicdual_state::safari(machine_config &config)
+{
vicdual_root(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(safari_map)
- MCFG_DEVICE_IO_MAP(safari_io_map)
+ m_maincpu->set_addrmap(AS_PROGRAM, &vicdual_state::safari_map);
+ m_maincpu->set_addrmap(AS_IO, &vicdual_state::safari_io_map);
/* video hardware */
- MCFG_SCREEN_MODIFY("screen")
- MCFG_SCREEN_UPDATE_DRIVER(vicdual_state, screen_update_bw)
-MACHINE_CONFIG_END
+ m_screen->set_screen_update(FUNC(vicdual_state::screen_update_bw));
+}
@@ -543,24 +542,23 @@ static INPUT_PORTS_START( frogs )
INPUT_PORTS_END
-MACHINE_CONFIG_START(vicdual_state::frogs)
+void vicdual_state::frogs(machine_config &config)
+{
vicdual_root(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(frogs_map)
- MCFG_DEVICE_IO_MAP(frogs_io_map)
+ m_maincpu->set_addrmap(AS_PROGRAM, &vicdual_state::frogs_map);
+ m_maincpu->set_addrmap(AS_IO, &vicdual_state::frogs_io_map);
MCFG_MACHINE_START_OVERRIDE(vicdual_state,frogs_audio)
/* video hardware */
- MCFG_SCREEN_MODIFY("screen")
- MCFG_SCREEN_UPDATE_DRIVER(vicdual_state, screen_update_bw)
+ m_screen->set_screen_update(FUNC(vicdual_state::screen_update_bw));
/* audio hardware */
SPEAKER(config, "mono").front_center();
frogs_audio(config);
-MACHINE_CONFIG_END
+}
@@ -815,44 +813,42 @@ static INPUT_PORTS_START( sspaceat )
INPUT_PORTS_END
-MACHINE_CONFIG_START(vicdual_state::headon)
+void vicdual_state::headon(machine_config &config)
+{
vicdual_root(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(headon_map)
- MCFG_DEVICE_IO_MAP(headon_io_map)
+ m_maincpu->set_addrmap(AS_PROGRAM, &vicdual_state::headon_map);
+ m_maincpu->set_addrmap(AS_IO, &vicdual_state::headon_io_map);
/* video hardware */
- MCFG_SCREEN_MODIFY("screen")
- MCFG_SCREEN_UPDATE_DRIVER(vicdual_state, screen_update_bw_or_color)
+ m_screen->set_screen_update(FUNC(vicdual_state::screen_update_bw_or_color));
/* audio hardware */
SPEAKER(config, "mono").front_center();
headon_audio(config);
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(vicdual_state::headons)
+void vicdual_state::headons(machine_config &config)
+{
headon(config);
/* video hardware */
- MCFG_SCREEN_MODIFY("screen")
- MCFG_SCREEN_UPDATE_DRIVER(vicdual_state, screen_update_bw)
-MACHINE_CONFIG_END
+ m_screen->set_screen_update(FUNC(vicdual_state::screen_update_bw));
+}
-MACHINE_CONFIG_START(vicdual_state::sspaceat)
+void vicdual_state::sspaceat(machine_config &config)
+{
vicdual_root(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(headon_map)
- MCFG_DEVICE_IO_MAP(sspaceat_io_map)
+ m_maincpu->set_addrmap(AS_PROGRAM, &vicdual_state::headon_map);
+ m_maincpu->set_addrmap(AS_IO, &vicdual_state::sspaceat_io_map);
/* video hardware */
- MCFG_SCREEN_MODIFY("screen")
- MCFG_SCREEN_UPDATE_DRIVER(vicdual_state, screen_update_bw_or_color)
-MACHINE_CONFIG_END
+ m_screen->set_screen_update(FUNC(vicdual_state::screen_update_bw_or_color));
+}
@@ -1046,47 +1042,44 @@ MACHINE_RESET_MEMBER( vicdual_state, headon2 )
}
-MACHINE_CONFIG_START(vicdual_state::headon2)
+void vicdual_state::headon2(machine_config &config)
+{
vicdual_root(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(headon2_map)
- MCFG_DEVICE_IO_MAP(headon2_io_map)
+ m_maincpu->set_addrmap(AS_PROGRAM, &vicdual_state::headon2_map);
+ m_maincpu->set_addrmap(AS_IO, &vicdual_state::headon2_io_map);
MCFG_MACHINE_RESET_OVERRIDE(vicdual_state, headon2)
/* video hardware */
- MCFG_SCREEN_MODIFY("screen")
- MCFG_SCREEN_UPDATE_DRIVER(vicdual_state, screen_update_color)
+ m_screen->set_screen_update(FUNC(vicdual_state::screen_update_color));
/* audio hardware */
SPEAKER(config, "mono").front_center();
headon_audio(config);
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(vicdual_state::headon2bw)
+void vicdual_state::headon2bw(machine_config &config)
+{
headon2(config);
- /* basic machine hardware */
/* video hardware */
- MCFG_SCREEN_MODIFY("screen")
- MCFG_SCREEN_UPDATE_DRIVER(vicdual_state, screen_update_bw)
-MACHINE_CONFIG_END
+ m_screen->set_screen_update(FUNC(vicdual_state::screen_update_bw));
+}
-MACHINE_CONFIG_START(vicdual_state::digger)
+void vicdual_state::digger(machine_config &config)
+{
vicdual_root(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(headon2_map)
- MCFG_DEVICE_IO_MAP(digger_io_map)
+ m_maincpu->set_addrmap(AS_PROGRAM, &vicdual_state::headon2_map);
+ m_maincpu->set_addrmap(AS_IO, &vicdual_state::digger_io_map);
/* video hardware */
- MCFG_SCREEN_MODIFY("screen")
- MCFG_SCREEN_UPDATE_DRIVER(vicdual_state, screen_update_color)
-MACHINE_CONFIG_END
+ m_screen->set_screen_update(FUNC(vicdual_state::screen_update_color));
+}
@@ -2121,170 +2114,169 @@ static INPUT_PORTS_START( headonn )
INPUT_PORTS_END
-MACHINE_CONFIG_START(vicdual_state::vicdual_dualgame_root)
+void vicdual_state::vicdual_dualgame_root(machine_config &config)
+{
vicdual_root(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(vicdual_dualgame_map)
+ m_maincpu->set_addrmap(AS_PROGRAM, &vicdual_state::vicdual_dualgame_map);
/* video hardware */
- MCFG_SCREEN_MODIFY("screen")
- MCFG_SCREEN_UPDATE_DRIVER(vicdual_state, screen_update_color)
-MACHINE_CONFIG_END
+ m_screen->set_screen_update(FUNC(vicdual_state::screen_update_color));
+}
-MACHINE_CONFIG_START(vicdual_state::invho2)
+void vicdual_state::invho2(machine_config &config)
+{
vicdual_dualgame_root(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_IO_MAP(invho2_io_map)
+ m_maincpu->set_addrmap(AS_IO, &vicdual_state::invho2_io_map);
/* audio hardware */
SPEAKER(config, "mono").front_center();
invinco_audio(config);
headon_audio(config);
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(vicdual_state::invds)
+void vicdual_state::invds(machine_config &config)
+{
vicdual_dualgame_root(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_IO_MAP(invds_io_map)
+ m_maincpu->set_addrmap(AS_IO, &vicdual_state::invds_io_map);
/* audio hardware */
SPEAKER(config, "mono").front_center();
invinco_audio(config);
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(vicdual_state::carhntds)
+void vicdual_state::carhntds(machine_config &config)
+{
vicdual_dualgame_root(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(carhntds_dualgame_map)
- MCFG_DEVICE_IO_MAP(carhntds_io_map)
-MACHINE_CONFIG_END
+ m_maincpu->set_addrmap(AS_PROGRAM, &vicdual_state::carhntds_dualgame_map);
+ m_maincpu->set_addrmap(AS_IO, &vicdual_state::carhntds_io_map);
+}
-MACHINE_CONFIG_START(vicdual_state::sspacaho)
+void vicdual_state::sspacaho(machine_config &config)
+{
vicdual_dualgame_root(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_IO_MAP(sspacaho_io_map)
+ m_maincpu->set_addrmap(AS_IO, &vicdual_state::sspacaho_io_map);
/* audio hardware */
SPEAKER(config, "mono").front_center();
headon_audio(config);
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(vicdual_state::spacetrk)
+void vicdual_state::spacetrk(machine_config &config)
+{
vicdual_dualgame_root(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_IO_MAP(spacetrk_io_map)
-MACHINE_CONFIG_END
+ m_maincpu->set_addrmap(AS_IO, &vicdual_state::spacetrk_io_map);
+}
-MACHINE_CONFIG_START(vicdual_state::carnival)
+void vicdual_state::carnival(machine_config &config)
+{
vicdual_dualgame_root(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_IO_MAP(carnival_io_map)
+ m_maincpu->set_addrmap(AS_IO, &vicdual_state::carnival_io_map);
- MCFG_QUANTUM_PERFECT_CPU("maincpu")
+ config.m_perfect_cpu_quantum = subtag("maincpu");
/* audio hardware */
SPEAKER(config, "mono").front_center();
carnival_audio(config);
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(vicdual_state::carnivalh)
+void vicdual_state::carnivalh(machine_config &config)
+{
carnival(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_IO_MAP(headon_io_map)
-MACHINE_CONFIG_END
+ m_maincpu->set_addrmap(AS_IO, &vicdual_state::headon_io_map);
+}
-MACHINE_CONFIG_START(vicdual_state::tranqgun)
+void vicdual_state::tranqgun(machine_config &config)
+{
vicdual_dualgame_root(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_IO_MAP(tranqgun_io_map)
+ m_maincpu->set_addrmap(AS_IO, &vicdual_state::tranqgun_io_map);
/* audio hardware */
SPEAKER(config, "mono").front_center();
tranqgun_audio(config);
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(vicdual_state::brdrline)
+void vicdual_state::brdrline(machine_config &config)
+{
vicdual_dualgame_root(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_IO_MAP(brdrline_io_map)
+ m_maincpu->set_addrmap(AS_IO, &vicdual_state::brdrline_io_map);
/* audio hardware */
SPEAKER(config, "mono").front_center();
brdrline_audio(config);
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(vicdual_state::pulsar)
+void vicdual_state::pulsar(machine_config &config)
+{
vicdual_dualgame_root(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_IO_MAP(pulsar_io_map)
+ m_maincpu->set_addrmap(AS_IO, &vicdual_state::pulsar_io_map);
/* audio hardware */
SPEAKER(config, "mono").front_center();
pulsar_audio(config);
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(vicdual_state::heiankyo)
+void vicdual_state::heiankyo(machine_config &config)
+{
vicdual_dualgame_root(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_IO_MAP(heiankyo_io_map)
-MACHINE_CONFIG_END
+ m_maincpu->set_addrmap(AS_IO, &vicdual_state::heiankyo_io_map);
+}
-MACHINE_CONFIG_START(vicdual_state::alphaho)
+void vicdual_state::alphaho(machine_config &config)
+{
vicdual_dualgame_root(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_IO_MAP(alphaho_io_map)
-MACHINE_CONFIG_END
+ m_maincpu->set_addrmap(AS_IO, &vicdual_state::alphaho_io_map);
+}
-MACHINE_CONFIG_START(vicdual_state::headonn)
+void vicdual_state::headonn(machine_config &config)
+{
vicdual_dualgame_root(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_IO_MAP(headonn_io_map)
+ m_maincpu->set_addrmap(AS_IO, &vicdual_state::headonn_io_map);
/* audio hardware */
SPEAKER(config, "mono").front_center();
headon_audio(config);
-MACHINE_CONFIG_END
+}
/*************************************
@@ -2405,20 +2397,19 @@ MACHINE_START_MEMBER(vicdual_state,samurai)
machine_start();
}
-MACHINE_CONFIG_START(vicdual_state::samurai)
+void vicdual_state::samurai(machine_config &config)
+{
vicdual_root(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(samurai_map)
- MCFG_DEVICE_IO_MAP(samurai_io_map)
+ m_maincpu->set_addrmap(AS_PROGRAM, &vicdual_state::samurai_map);
+ m_maincpu->set_addrmap(AS_IO, &vicdual_state::samurai_io_map);
MCFG_MACHINE_START_OVERRIDE(vicdual_state,samurai)
/* video hardware */
- MCFG_SCREEN_MODIFY("screen")
- MCFG_SCREEN_UPDATE_DRIVER(vicdual_state, screen_update_color)
-MACHINE_CONFIG_END
+ m_screen->set_screen_update(FUNC(vicdual_state::screen_update_color));
+}
@@ -2593,28 +2584,29 @@ MACHINE_RESET_MEMBER(nsub_state, nsub)
machine_reset();
}
-MACHINE_CONFIG_START(nsub_state::nsub)
+void nsub_state::nsub(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, VICDUAL_MAIN_CPU_CLOCK)
- MCFG_DEVICE_PROGRAM_MAP(nsub_map)
- MCFG_DEVICE_IO_MAP(nsub_io_map)
+ Z80(config, m_maincpu, VICDUAL_MAIN_CPU_CLOCK);
+ m_maincpu->set_addrmap(AS_PROGRAM, &nsub_state::nsub_map);
+ m_maincpu->set_addrmap(AS_IO, &nsub_state::nsub_io_map);
- MCFG_TIMER_DRIVER_ADD("coinstate", nsub_state, clear_coin_status)
- MCFG_TIMER_DRIVER_ADD("nsub_coin", nsub_state, nsub_coin_pulse)
+ TIMER(config, m_coinstate_timer).configure_generic(FUNC(nsub_state::clear_coin_status));
+ TIMER(config, m_nsub_coinage_timer).configure_generic(FUNC(nsub_state::nsub_coin_pulse));
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_RAW_PARAMS(VICDUAL_PIXEL_CLOCK, VICDUAL_HTOTAL, VICDUAL_HBEND, VICDUAL_HBSTART, VICDUAL_VTOTAL, VICDUAL_VBEND, VICDUAL_VBSTART)
- MCFG_SCREEN_UPDATE_DRIVER(nsub_state, screen_update_color)
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_raw(VICDUAL_PIXEL_CLOCK, VICDUAL_HTOTAL, VICDUAL_HBEND, VICDUAL_HBSTART, VICDUAL_VTOTAL, VICDUAL_VBEND, VICDUAL_VBSTART);
+ m_screen->set_screen_update(FUNC(nsub_state::screen_update_color));
- MCFG_DEVICE_ADD("s97269pb", S97269PB, 0)
+ S97269PB(config, m_s97269pb, 0);
MCFG_MACHINE_START_OVERRIDE(nsub_state, nsub)
MCFG_MACHINE_RESET_OVERRIDE(nsub_state, nsub)
/* audio hardware */
S97271P(config, m_s97271p, 0);
-MACHINE_CONFIG_END
+}
@@ -2704,22 +2696,21 @@ static INPUT_PORTS_START( invinco )
INPUT_PORTS_END
-MACHINE_CONFIG_START(vicdual_state::invinco)
+void vicdual_state::invinco(machine_config &config)
+{
vicdual_root(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(invinco_map)
- MCFG_DEVICE_IO_MAP(invinco_io_map)
+ m_maincpu->set_addrmap(AS_PROGRAM, &vicdual_state::invinco_map);
+ m_maincpu->set_addrmap(AS_IO, &vicdual_state::invinco_io_map);
/* video hardware */
- MCFG_SCREEN_MODIFY("screen")
- MCFG_SCREEN_UPDATE_DRIVER(vicdual_state, screen_update_color)
+ m_screen->set_screen_update(FUNC(vicdual_state::screen_update_color));
/* audio hardware */
SPEAKER(config, "mono").front_center();
invinco_audio(config);
-MACHINE_CONFIG_END
+}
diff --git a/src/mame/drivers/victor9k.cpp b/src/mame/drivers/victor9k.cpp
index 596d018e23f..e2dd7547922 100644
--- a/src/mame/drivers/victor9k.cpp
+++ b/src/mame/drivers/victor9k.cpp
@@ -676,7 +676,7 @@ void victor9k_state::machine_reset()
//**************************************************************************
//-------------------------------------------------
-// MACHINE_CONFIG( victor9k )
+// machine_config( victor9k )
//-------------------------------------------------
void victor9k_state::victor9k(machine_config &config)
diff --git a/src/mame/drivers/victory.cpp b/src/mame/drivers/victory.cpp
index 55feaf98659..ed44226b932 100644
--- a/src/mame/drivers/victory.cpp
+++ b/src/mame/drivers/victory.cpp
@@ -210,13 +210,13 @@ INPUT_PORTS_END
*
*************************************/
-MACHINE_CONFIG_START(victory_state::victory)
-
+void victory_state::victory(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, VICTORY_MAIN_CPU_CLOCK)
- MCFG_DEVICE_PROGRAM_MAP(main_map)
- MCFG_DEVICE_IO_MAP(main_io_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", victory_state, vblank_interrupt)
+ Z80(config, m_maincpu, VICTORY_MAIN_CPU_CLOCK);
+ m_maincpu->set_addrmap(AS_PROGRAM, &victory_state::main_map);
+ m_maincpu->set_addrmap(AS_IO, &victory_state::main_io_map);
+ m_maincpu->set_vblank_int("screen", FUNC(victory_state::vblank_interrupt));
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
@@ -230,19 +230,18 @@ MACHINE_CONFIG_START(victory_state::victory)
pio2.in_pb_callback().set_ioport("UNUSED");
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_VIDEO_ATTRIBUTES(VIDEO_UPDATE_BEFORE_VBLANK | VIDEO_ALWAYS_UPDATE)
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_video_attributes(VIDEO_UPDATE_BEFORE_VBLANK | VIDEO_ALWAYS_UPDATE);
/* using the standard Exidy video parameters for now, needs to be confirmed */
- MCFG_SCREEN_RAW_PARAMS(VICTORY_PIXEL_CLOCK, VICTORY_HTOTAL, VICTORY_HBEND, VICTORY_HBSTART, VICTORY_VTOTAL, VICTORY_VBEND, VICTORY_VBSTART)
- MCFG_SCREEN_UPDATE_DRIVER(victory_state, screen_update)
- MCFG_SCREEN_PALETTE("palette")
-
- MCFG_PALETTE_ADD("palette", 64)
+ m_screen->set_raw(VICTORY_PIXEL_CLOCK, VICTORY_HTOTAL, VICTORY_HBEND, VICTORY_HBSTART, VICTORY_VTOTAL, VICTORY_VBEND, VICTORY_VBSTART);
+ m_screen->set_screen_update(FUNC(victory_state::screen_update));
+ m_screen->set_palette(m_palette);
+ PALETTE(config, m_palette).set_entries(64);
/* audio hardware */
EXIDY_VICTORY(config, "soundbd", 0);
-MACHINE_CONFIG_END
+}
diff --git a/src/mame/drivers/vidbrain.cpp b/src/mame/drivers/vidbrain.cpp
index c01f6bb696a..6f81b404f3c 100644
--- a/src/mame/drivers/vidbrain.cpp
+++ b/src/mame/drivers/vidbrain.cpp
@@ -392,22 +392,23 @@ void vidbrain_state::machine_reset()
//**************************************************************************
//-------------------------------------------------
-// MACHINE_CONFIG( vidbrain )
+// machine_config( vidbrain )
//-------------------------------------------------
-MACHINE_CONFIG_START(vidbrain_state::vidbrain)
+void vidbrain_state::vidbrain(machine_config &config)
+{
// basic machine hardware
- MCFG_DEVICE_ADD(F3850_TAG, F8, XTAL(4'000'000)/2)
- MCFG_DEVICE_PROGRAM_MAP(vidbrain_mem)
- MCFG_DEVICE_IO_MAP(vidbrain_io)
- MCFG_DEVICE_IRQ_ACKNOWLEDGE_DEVICE(F3853_TAG, f3853_device, int_acknowledge)
+ F8(config, m_maincpu, XTAL(4'000'000)/2);
+ m_maincpu->set_addrmap(AS_PROGRAM, &vidbrain_state::vidbrain_mem);
+ m_maincpu->set_addrmap(AS_IO, &vidbrain_state::vidbrain_io);
+ m_maincpu->set_irq_acknowledge_callback(F3853_TAG, FUNC(f3853_device::int_acknowledge));
// video hardware
config.set_default_layout(layout_vidbrain);
- MCFG_SCREEN_ADD(SCREEN_TAG, RASTER)
- MCFG_SCREEN_UPDATE_DEVICE(UV201_TAG, uv201_device, screen_update)
- MCFG_SCREEN_RAW_PARAMS(3636363, 232, 18, 232, 262, 21, 262)
+ screen_device &screen(SCREEN(config, SCREEN_TAG, SCREEN_TYPE_RASTER));
+ screen.set_screen_update(UV201_TAG, FUNC(uv201_device::screen_update));
+ screen.set_raw(3636363, 232, 18, 232, 262, 21, 262);
UV201(config, m_uv, 3636363);
m_uv->set_screen(SCREEN_TAG);
m_uv->ext_int_wr_callback().set(FUNC(vidbrain_state::ext_int_w));
@@ -416,23 +417,24 @@ MACHINE_CONFIG_START(vidbrain_state::vidbrain)
// sound hardware
SPEAKER(config, "speaker").front_center();
- MCFG_DEVICE_ADD("dac", DAC_2BIT_R2R, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 0.167) // 74ls74.u16 + 120k + 56k
- MCFG_DEVICE_ADD("vref", VOLTAGE_REGULATOR, 0) MCFG_VOLTAGE_REGULATOR_OUTPUT(5.0)
- MCFG_SOUND_ROUTE(0, "dac", 1.0, DAC_VREF_POS_INPUT) MCFG_SOUND_ROUTE(0, "dac", -1.0, DAC_VREF_NEG_INPUT)
+ DAC_2BIT_R2R(config, m_dac, 0).add_route(ALL_OUTPUTS, "speaker", 0.167); // 74ls74.u16 + 120k + 56k
+ voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref"));
+ vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT);
+ vref.add_route(0, "dac", -1.0, DAC_VREF_NEG_INPUT);
// devices
F3853(config, m_smi, XTAL(4'000'000)/2);
- m_smi->int_req_callback().set_inputline(F3850_TAG, F8_INPUT_LINE_INT_REQ);
+ m_smi->int_req_callback().set_inputline(m_maincpu, F8_INPUT_LINE_INT_REQ);
// cartridge
- MCFG_VIDEOBRAIN_EXPANSION_SLOT_ADD(VIDEOBRAIN_EXPANSION_SLOT_TAG, vidbrain_expansion_cards, nullptr)
+ VIDEOBRAIN_EXPANSION_SLOT(config, VIDEOBRAIN_EXPANSION_SLOT_TAG, vidbrain_expansion_cards, nullptr);
// software lists
- MCFG_SOFTWARE_LIST_ADD("cart_list", "vidbrain")
+ SOFTWARE_LIST(config, "cart_list").set_original("vidbrain");
// internal ram
RAM(config, RAM_TAG).set_default_size("1K");
-MACHINE_CONFIG_END
+}
diff --git a/src/mame/drivers/video21.cpp b/src/mame/drivers/video21.cpp
index 1c9481d5ed6..3ef2c9a66b7 100644
--- a/src/mame/drivers/video21.cpp
+++ b/src/mame/drivers/video21.cpp
@@ -67,7 +67,7 @@ private:
required_device<cpu_device> m_maincpu;
required_shared_ptr<u8> m_p_videoram;
required_region_ptr<u8> m_p_chargen;
- optional_device<beep_device> m_beeper;
+ required_device<beep_device> m_beeper;
output_finder<6> m_lamps;
};
diff --git a/src/mame/drivers/videopin.cpp b/src/mame/drivers/videopin.cpp
index 6655bf110ef..e93c6154ac8 100644
--- a/src/mame/drivers/videopin.cpp
+++ b/src/mame/drivers/videopin.cpp
@@ -97,8 +97,8 @@ void videopin_state::machine_reset()
/* both output latches are cleared on reset */
- out1_w(machine().dummy_space(), 0, 0);
- out2_w(machine().dummy_space(), 0, 0);
+ out1_w(0);
+ out2_w(0);
}
@@ -108,7 +108,7 @@ double videopin_state::calc_plunger_pos()
}
-READ8_MEMBER(videopin_state::misc_r)
+uint8_t videopin_state::misc_r()
{
double plunger = calc_plunger_pos();
@@ -136,7 +136,7 @@ READ8_MEMBER(videopin_state::misc_r)
}
-WRITE8_MEMBER(videopin_state::led_w)
+void videopin_state::led_w(uint8_t data)
{
// LED matrix as seen in Video Pinball manual, fig. 4-14
// output to "LEDxx" where xx = 01 to 32, videopin START = LED30
@@ -162,7 +162,7 @@ WRITE8_MEMBER(videopin_state::led_w)
}
-WRITE8_MEMBER(videopin_state::out1_w)
+void videopin_state::out1_w(uint8_t data)
{
/* D0 => OCTAVE0 */
/* D1 => OCTACE1 */
@@ -185,7 +185,7 @@ WRITE8_MEMBER(videopin_state::out1_w)
}
-WRITE8_MEMBER(videopin_state::out2_w)
+void videopin_state::out2_w(uint8_t data)
{
/* D0 => VOL0 */
/* D1 => VOL1 */
@@ -205,7 +205,7 @@ WRITE8_MEMBER(videopin_state::out2_w)
}
-WRITE8_MEMBER(videopin_state::note_dvsr_w)
+void videopin_state::note_dvsr_w(uint8_t data)
{
/* note data */
m_discrete->write(VIDEOPIN_NOTE_DATA, ~data &0xff);
@@ -359,11 +359,11 @@ GFXDECODE_END
*
*************************************/
-MACHINE_CONFIG_START(videopin_state::videopin)
-
+void videopin_state::videopin(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M6502, 12096000 / 16)
- MCFG_DEVICE_PROGRAM_MAP(main_map)
+ M6502(config, m_maincpu, 12096000 / 16);
+ m_maincpu->set_addrmap(AS_PROGRAM, &videopin_state::main_map);
WATCHDOG_TIMER(config, "watchdog");
@@ -375,7 +375,7 @@ MACHINE_CONFIG_START(videopin_state::videopin)
m_screen->set_screen_update(FUNC(videopin_state::screen_update));
m_screen->set_palette(m_palette);
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_videopin)
+ GFXDECODE(config, m_gfxdecode, m_palette, gfx_videopin);
PALETTE(config, m_palette, palette_device::MONOCHROME);
@@ -383,7 +383,7 @@ MACHINE_CONFIG_START(videopin_state::videopin)
SPEAKER(config, "mono").front_center();
DISCRETE(config, m_discrete, videopin_discrete).add_route(ALL_OUTPUTS, "mono", 1.0);
-MACHINE_CONFIG_END
+}
diff --git a/src/mame/drivers/videopkr.cpp b/src/mame/drivers/videopkr.cpp
index 6b5730338b9..06083641f7a 100644
--- a/src/mame/drivers/videopkr.cpp
+++ b/src/mame/drivers/videopkr.cpp
@@ -911,11 +911,11 @@ WRITE8_MEMBER(videopkr_state::baby_sound_p3_w)
case 0x00: break;
case 0x01: break;
case 0x02: break;
- case 0x03: m_aysnd->data_w(space, 1, m_sbp0); break;
+ case 0x03: m_aysnd->data_w(m_sbp0); break;
case 0x04: break;
- case 0x05: m_sbp0 = m_aysnd->data_r(space, m_sbp0); break;
+ case 0x05: m_sbp0 = m_aysnd->data_r(); break;
case 0x06: break;
- case 0x07: m_aysnd->address_w(space, 0, m_sbp0); break;
+ case 0x07: m_aysnd->address_w(m_sbp0); break;
}
}
@@ -1220,8 +1220,8 @@ void videopkr_state::machine_start()
* Machine Drivers *
************************/
-MACHINE_CONFIG_START(videopkr_state::videopkr)
-
+void videopkr_state::videopkr(machine_config &config)
+{
/* basic machine hardware */
i8039_device &maincpu(I8039(config, m_maincpu, CPU_CLOCK));
maincpu.set_addrmap(AS_PROGRAM, &videopkr_state::i8039_map);
@@ -1243,57 +1243,61 @@ MACHINE_CONFIG_START(videopkr_state::videopkr)
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
- MCFG_TIMER_DRIVER_ADD_PERIODIC("t1_timer", videopkr_state, sound_t1_callback, attotime::from_hz(50))
+ TIMER(config, "t1_timer").configure_periodic(FUNC(videopkr_state::sound_t1_callback), attotime::from_hz(50));
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_SIZE(32*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(5*8, 31*8-1, 3*8, 29*8-1)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(2080)
- MCFG_SCREEN_UPDATE_DRIVER(videopkr_state, screen_update_videopkr)
- MCFG_SCREEN_PALETTE("palette")
-
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_videopkr)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_size(32*8, 32*8);
+ screen.set_visarea(5*8, 31*8-1, 3*8, 29*8-1);
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(2080);
+ screen.set_screen_update(FUNC(videopkr_state::screen_update_videopkr));
+ screen.set_palette("palette");
+
+ GFXDECODE(config, m_gfxdecode, "palette", gfx_videopkr);
PALETTE(config, "palette", FUNC(videopkr_state::videopkr_palette), 256);
/* sound hardware */
SPEAKER(config, "speaker").front_center();
- MCFG_DEVICE_ADD("dac", MC1408, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 0.275)
- MCFG_DEVICE_ADD("vref", VOLTAGE_REGULATOR, 0) MCFG_VOLTAGE_REGULATOR_OUTPUT(5.0)
- MCFG_SOUND_ROUTE(0, "dac", 1.0, DAC_VREF_POS_INPUT) MCFG_SOUND_ROUTE(0, "dac", -1.0, DAC_VREF_NEG_INPUT)
-MACHINE_CONFIG_END
+ MC1408(config, "dac", 0).add_route(ALL_OUTPUTS, "speaker", 0.275);
+ voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref"));
+ vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT);
+ vref.add_route(0, "dac", -1.0, DAC_VREF_NEG_INPUT);
+}
-MACHINE_CONFIG_START(videopkr_state::blckjack)
+void videopkr_state::blckjack(machine_config &config)
+{
videopkr(config);
/* basic machine hardware */
/* video hardware */
- MCFG_SCREEN_MODIFY("screen")
- MCFG_SCREEN_SIZE(32*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(4*8, 31*8-1, 2*8, 30*8-1)
-MACHINE_CONFIG_END
+ screen_device &screen(*subdevice<screen_device>("screen"));
+ screen.set_size(32*8, 32*8);
+ screen.set_visarea(4*8, 31*8-1, 2*8, 30*8-1);
+}
-MACHINE_CONFIG_START(videopkr_state::videodad)
+void videopkr_state::videodad(machine_config &config)
+{
videopkr(config);
/* basic machine hardware */
m_maincpu->set_clock(CPU_CLOCK_ALT);
/* video hardware */
- MCFG_SCREEN_MODIFY("screen")
- MCFG_SCREEN_SIZE(32*16, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(4*16, 31*16-1, 2*8, 30*8-1)
+ screen_device &screen(*subdevice<screen_device>("screen"));
+ screen.set_size(32*16, 32*8);
+ screen.set_visarea(4*16, 31*16-1, 2*8, 30*8-1);
- MCFG_GFXDECODE_MODIFY("gfxdecode", gfx_videodad)
+ m_gfxdecode->set_info(gfx_videodad);
MCFG_VIDEO_START_OVERRIDE(videopkr_state,vidadcba)
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(videopkr_state::babypkr)
+void videopkr_state::babypkr(machine_config &config)
+{
videopkr(config);
/* basic machine hardware */
@@ -1310,27 +1314,29 @@ MACHINE_CONFIG_START(videopkr_state::babypkr)
soundcpu.port_out_cb<3>().set(FUNC(videopkr_state::baby_sound_p3_w));
/* video hardware */
- MCFG_SCREEN_MODIFY("screen")
- MCFG_SCREEN_SIZE(32*16, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(5*16, 31*16-1, 3*8, 29*8-1)
+ screen_device &screen(*subdevice<screen_device>("screen"));
+ screen.set_size(32*16, 32*8);
+ screen.set_visarea(5*16, 31*16-1, 3*8, 29*8-1);
subdevice<palette_device>("palette")->set_init(FUNC(videopkr_state::babypkr_palette));
- MCFG_GFXDECODE_MODIFY("gfxdecode", gfx_videodad)
+ m_gfxdecode->set_info(gfx_videodad);
MCFG_VIDEO_START_OVERRIDE(videopkr_state,vidadcba)
AY8910(config, m_aysnd, CPU_CLOCK / 6).add_route(ALL_OUTPUTS, "speaker", 0.3); /* no ports used */
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(videopkr_state::fortune1)
+void videopkr_state::fortune1(machine_config &config)
+{
videopkr(config);
/* basic machine hardware */
m_maincpu->set_clock(CPU_CLOCK_ALT);
subdevice<palette_device>("palette")->set_init(FUNC(videopkr_state::fortune1_palette));
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(videopkr_state::bpoker)
+void videopkr_state::bpoker(machine_config &config)
+{
babypkr(config);
i8751_device &maincpu(I8751(config.replace(), m_maincpu, XTAL(6'000'000)));
maincpu.set_addrmap(AS_PROGRAM, &videopkr_state::i8751_map);
@@ -1344,7 +1350,7 @@ MACHINE_CONFIG_START(videopkr_state::bpoker)
//ppi.in_pb_callback()
//ppi.out_pc_callback()
//ppi.in_pc_callback()
-MACHINE_CONFIG_END
+}
/*************************
diff --git a/src/mame/drivers/vigilant.cpp b/src/mame/drivers/vigilant.cpp
index 9b966e38e5e..6d40069b725 100644
--- a/src/mame/drivers/vigilant.cpp
+++ b/src/mame/drivers/vigilant.cpp
@@ -528,7 +528,6 @@ void vigilant_state::vigilant(machine_config &config)
dac.add_route(ALL_OUTPUTS, "lspeaker", 1.0);
dac.add_route(ALL_OUTPUTS, "rspeaker", 1.0);
voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref", 0));
- vref.set_output(5.0);
vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT);
vref.add_route(0, "dac", -1.0, DAC_VREF_NEG_INPUT);
}
@@ -541,7 +540,7 @@ void vigilant_state::buccanrs(machine_config &config)
m_maincpu->set_addrmap(AS_IO, &vigilant_state::vigilant_io_map);
m_maincpu->set_vblank_int("screen", FUNC(vigilant_state::irq0_line_hold));
- z80_device &soundcpu(Z80(config, "soundcpu", 18432000/6)); /* 3.072000 MHz */
+ z80_device &soundcpu(Z80(config, "soundcpu", 18432000/6)); /* 3.072000 MHz */
soundcpu.set_addrmap(AS_PROGRAM, &vigilant_state::sound_map);
soundcpu.set_addrmap(AS_IO, &vigilant_state::buccanrs_sound_io_map);
soundcpu.set_periodic_int(FUNC(vigilant_state::nmi_line_pulse), attotime::from_hz(128*55)); /* clocked by V1 */
@@ -597,7 +596,6 @@ void vigilant_state::buccanrs(machine_config &config)
dac.add_route(ALL_OUTPUTS, "lspeaker", 0.35);
dac.add_route(ALL_OUTPUTS, "rspeaker", 0.35);
voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref", 0));
- vref.set_output(5.0);
vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT);
vref.add_route(0, "dac", -1.0, DAC_VREF_NEG_INPUT);
}
@@ -650,7 +648,6 @@ void vigilant_state::kikcubic(machine_config &config)
dac.add_route(ALL_OUTPUTS, "lspeaker", 1.0);
dac.add_route(ALL_OUTPUTS, "rspeaker", 1.0);
voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref", 0));
- vref.set_output(5.0);
vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT);
vref.add_route(0, "dac", -1.0, DAC_VREF_NEG_INPUT);
}
diff --git a/src/mame/drivers/vii.cpp b/src/mame/drivers/vii.cpp
index 21c557153a2..761347e3aea 100644
--- a/src/mame/drivers/vii.cpp
+++ b/src/mame/drivers/vii.cpp
@@ -6,6 +6,71 @@
Systems which run on the SPG243 SoC
+ die markings show
+ "SunPlus QL8041" ( also known as Sunplus SPG240 & PAC300 )
+
+ (all GameKeyReady units?)
+ Disney Princess (GKR)
+ Wheel of Fortune (GKR)
+ JAKKS WWE (GKR)
+ Fantastic 4 (GKR)
+ Justice League (GKR)
+ Dora the Explorer Nursery Rhyme (GKR)
+ Dora the Explorer Play Park (GKR)
+ Spiderman 5-in-1 (GKR)
+ etc.
+
+ (other non GKR JAKKS games)
+ X-Men (Wolverine pad)
+ Avatar: The Last Airbender
+
+ (other games)
+ Mattel Classic Sports
+
+ "SunPlus QL8041C" ( known as Sunplus SPG2??, seems to be compatible with above, so probably just a chip revision )
+
+ Clickstart ( see clickstart.cpp instead)
+ Wheel of Fortune 2nd Edition
+ Spider-man - Villain Roundup
+
+ "SunPlus QU7074-P69A"
+
+ The Batman
+
+ ---
+
+ It is unknown if the following are close to this architecture or not (no dumps yet)
+
+ "SunPlus QU7073-P69A"
+
+ Mortal Kombat
+
+ "Sunplus PU7799-P680?" (difficult to read)
+
+ Mission Paintball
+
+ "Sunplus QL8167"
+
+ Disney Princess Magical Adventure
+ Go Diego Go
+ Shrek - Over the Hedge (this unit shows a 'GameKey Unlock More Games' on startup, but has no port, not even on the internal PCB)
+ Marvel Heroes (Spider-man)
+ Spiderman 3 (Movie - black)
+
+ ---
+
+ These are definitely different
+
+ "SunPlus PA7801" ( known as Sunplus SPG110? ) see spg110.cpp instead
+
+ Classic Arcade Pinball
+ EA Sports (NHL95 + Madden 95)
+ Spiderman 5-in-1 (original release)
+
+ "GCM394" (this is clearly newer, has extra opcodes, different internal map etc.)
+
+ Smart Fit Park
+
Status:
Mostly working
@@ -19,19 +84,36 @@
All systems:
Various inaccuracies in samples/envelopes.
- walle:
+ jak_wall, jak_sdoo:
Game seems unhappy with NVRAM, clears contents on each boot.
- rad_skat:
- Palette issues on the High Score screen.
+ jak_pooh:
+ In the 'Light Tag' minigame (select the rock) you can't move left with the DRC (ok with -nodrc)
+ and the game usually softlocks when you find a friend (with or without DRC)
+ jak_disf:
+ shows corrupt logo on first boot with no valid nvram (possibly hardware does too, or layer disable?)
+ jak_nick:
+ channel chasers (first game) title screen background should be blue, not the current pattern (possible layer disable?)
+
vii:
When loading a cart from file manager, sometimes MAME will crash.
The "MOTOR" option in the diagnostic menu does nothing when selected.
The "SPEECH IC" option in the diagnostic menu does nothing when selected.
On 'vii_vc1' & 'vii_vc2' cart, the left-right keys are transposed with the up-down keys.
- This is not a bug per se, as the games are played with the controller physically rotated 90 degrees.
- When entering a game in Basketball, MAME fatalerrors when starting the game due to jumping to invalid code.
- zone60/wirels60:
- When entering a game in Basketball, MAME fatalerrors when starting the game due to jumping to invalid code.
+
+ Note:
+ Cricket, Skateboarder, Skannerz and Football 2 list a 32-bit checksum at the start of ROM.
+ This is the byte sum of the file, excluding the first 16 byte (where the checksum is stored)
+
+ Test Modes:
+ Justice League : press UP, DOWN, LEFT, BT3 on the JAKKS logo in that order, quickly, to get test menu
+ WWE : press UP, BT1, BT2 together during startup logos
+
+ Disney Friends, MS Pacman, WallE, Batman (and some other HotGen GameKKeys) for test mode, hold UP,
+ press A, press DOWN during startup
+
+ TODO:
+ Work out how to access the hidden TEST menus for all games (most JAKKS games should have one at least)
*******************************************************************************/
@@ -44,6 +126,7 @@
#include "bus/generic/slot.h"
#include "bus/generic/carts.h"
+#include "bus/jakks_gamekey/slot.h"
#include "screen.h"
#include "softlist.h"
@@ -68,14 +151,21 @@ public:
void spg2xx_base(machine_config &config);
void spg2xx_basep(machine_config &config);
void jakks(machine_config &config);
+ void jakks_i2c(machine_config &config);
void walle(machine_config &config);
void wireless60(machine_config &config);
void rad_skat(machine_config &config);
void rad_skatp(machine_config &config);
+ void rad_sktv(machine_config &config);
void rad_crik(machine_config &config);
void non_spg_base(machine_config &config);
+ void lexizeus(machine_config &config);
- void init_rad_crik();
+ void init_crc();
+ void init_zeus();
+ void init_zone40();
+
+ DECLARE_CUSTOM_INPUT_MEMBER(i2c_r);
protected:
virtual void machine_start() override;
@@ -91,7 +181,14 @@ protected:
DECLARE_WRITE16_MEMBER(wireless60_portb_w);
DECLARE_READ16_MEMBER(wireless60_porta_r);
- required_device<cpu_device> m_maincpu;
+ DECLARE_READ16_MEMBER(rad_porta_r);
+ DECLARE_READ16_MEMBER(rad_portb_r);
+ DECLARE_READ16_MEMBER(rad_portc_r);
+
+ DECLARE_WRITE16_MEMBER(jakks_porta_w);
+ DECLARE_WRITE16_MEMBER(jakks_portb_w);
+
+ required_device<unsp_device> m_maincpu;
required_device<screen_device> m_screen;
required_device<spg2xx_device> m_spg;
optional_memory_bank m_bank;
@@ -99,7 +196,9 @@ protected:
DECLARE_READ16_MEMBER(walle_portc_r);
DECLARE_WRITE16_MEMBER(walle_portc_w);
- virtual void mem_map(address_map &map);
+ virtual void mem_map_4m(address_map &map);
+ virtual void mem_map_2m(address_map &map);
+ virtual void mem_map_1m(address_map &map);
uint32_t m_current_bank;
@@ -114,9 +213,47 @@ protected:
optional_ioport m_io_p3;
optional_device<i2cmem_device> m_i2cmem;
optional_device<nvram_device> m_nvram;
+};
- // temp hack
- DECLARE_READ16_MEMBER(rad_crik_hack_r);
+class jakks_gkr_state : public spg2xx_game_state
+{
+public:
+ jakks_gkr_state(const machine_config &mconfig, device_type type, const char *tag)
+ : spg2xx_game_state(mconfig, type, tag)
+ , m_porta_key_mode(false)
+ , m_cart(*this, "cartslot")
+ , m_cart_region(nullptr)
+ { }
+
+ void jakks_gkr(machine_config &config);
+ void jakks_gkr_i2c(machine_config &config);
+ void jakks_gkr_1m_i2c(machine_config &config);
+ void jakks_gkr_2m_i2c(machine_config &config);
+ void jakks_gkr_nk(machine_config &config);
+ void jakks_gkr_nk_i2c(machine_config &config);
+ void jakks_gkr_dy(machine_config &config);
+ void jakks_gkr_dy_i2c(machine_config &config);
+ void jakks_gkr_dp_i2c(machine_config &config);
+ void jakks_gkr_sw_i2c(machine_config &config);
+ void jakks_gkr_nm_i2c(machine_config &config);
+ void jakks_gkr_wf_i2c(machine_config &config);
+ void jakks_gkr_mv_i2c(machine_config &config);
+ void jakks_gkr_wp(machine_config &config);
+
+ DECLARE_CUSTOM_INPUT_MEMBER(i2c_gkr_r);
+
+private:
+ virtual void machine_start() override;
+
+ DECLARE_WRITE16_MEMBER(gkr_portc_w);
+ DECLARE_WRITE16_MEMBER(jakks_porta_key_io_w);
+ DECLARE_READ16_MEMBER(jakks_porta_key_io_r);
+ bool m_porta_key_mode;
+
+ DECLARE_DEVICE_IMAGE_LOAD_MEMBER(gamekey_cart);
+
+ required_device<jakks_gamekey_slot_device> m_cart;
+ memory_region *m_cart_region;
};
class vii_state : public spg2xx_game_state
@@ -157,6 +294,60 @@ private:
uint8_t m_controller_input[8];
};
+class icanguit_state : public spg2xx_game_state
+{
+public:
+ icanguit_state(const machine_config &mconfig, device_type type, const char *tag)
+ : spg2xx_game_state(mconfig, type, tag)
+ , m_cart(*this, "cartslot")
+ , m_cart_region(nullptr)
+ , m_porta_in(*this, "P1_%u", 0U)
+ , m_portc_in(*this, "P3_%u", 0U)
+ { }
+
+ void icanguit(machine_config &config);
+ void icanpian(machine_config &config);
+
+private:
+ virtual void machine_start() override;
+ virtual void machine_reset() override;
+
+ DECLARE_DEVICE_IMAGE_LOAD_MEMBER(icanguit_cart);
+
+ DECLARE_READ16_MEMBER(porta_r);
+ DECLARE_READ16_MEMBER(portb_r);
+ DECLARE_READ16_MEMBER(portc_r);
+ DECLARE_WRITE16_MEMBER(porta_w);
+ DECLARE_WRITE16_MEMBER(portb_w);
+ DECLARE_WRITE16_MEMBER(portc_w);
+
+ DECLARE_WRITE16_MEMBER(guit_porta_w);
+
+ required_device<generic_slot_device> m_cart;
+ memory_region *m_cart_region;
+
+ uint16_t m_inlatch_a;
+ uint16_t m_inlatch_c;
+ optional_ioport_array<6> m_porta_in;
+ optional_ioport_array<6> m_portc_in;
+
+};
+
+class dreamlif_state : public spg2xx_game_state
+{
+public:
+ dreamlif_state(const machine_config &mconfig, device_type type, const char *tag)
+ : spg2xx_game_state(mconfig, type, tag)
+ { }
+
+ void dreamlif(machine_config &config);
+
+ DECLARE_READ16_MEMBER(portb_r);
+ DECLARE_WRITE16_MEMBER(portb_w);
+};
+
+
+
/*************************
* Machine Hardware *
*************************/
@@ -167,6 +358,7 @@ void spg2xx_game_state::switch_bank(uint32_t bank)
{
m_current_bank = bank;
m_bank->set_entry(bank);
+ m_maincpu->invalidate_cache();
}
}
@@ -228,15 +420,27 @@ void vii_state::device_timer(emu_timer &timer, device_timer_id id, int param, vo
WRITE16_MEMBER(vii_state::vii_portb_w)
{
- if (data == 0x7c) machine().debug_break();
switch_bank(((data & 0x80) >> 7) | ((data & 0x20) >> 4));
}
-READ16_MEMBER(spg2xx_game_state::walle_portc_r)
+
+CUSTOM_INPUT_MEMBER(spg2xx_game_state::i2c_r)
{
return m_i2cmem->read_sda();
}
+CUSTOM_INPUT_MEMBER(jakks_gkr_state::i2c_gkr_r)
+{
+ if (m_cart && m_cart->exists())
+ {
+ return m_cart->read_cart_seeprom();
+ }
+ else
+ {
+ return m_i2cmem->read_sda();
+ }
+}
+
WRITE16_MEMBER(spg2xx_game_state::walle_portc_w)
{
m_walle_portc_data = data & mem_mask;
@@ -246,27 +450,111 @@ WRITE16_MEMBER(spg2xx_game_state::walle_portc_w)
m_i2cmem->write_sda(BIT(data, 0));
}
+WRITE16_MEMBER(jakks_gkr_state::gkr_portc_w)
+{
+ m_walle_portc_data = data & mem_mask;
+
+ if (m_cart && m_cart->exists())
+ {
+ m_cart->write_cart_seeprom(space,offset,data,mem_mask);
+ }
+ else
+ {
+ if (m_i2cmem)
+ {
+ if (BIT(mem_mask, 1))
+ m_i2cmem->write_scl(BIT(data, 1));
+ if (BIT(mem_mask, 0))
+ m_i2cmem->write_sda(BIT(data, 0));
+ }
+ }
+}
+
READ16_MEMBER(spg2xx_game_state::jakks_porta_r)
{
- const uint16_t temp = m_io_p1->read();
- uint16_t value = 0;
- value |= (temp & 0x0001) ? 0x8000 : 0;
- value |= (temp & 0x0002) ? 0x4000 : 0;
- value |= (temp & 0x0004) ? 0x2000 : 0;
- value |= (temp & 0x0008) ? 0x1000 : 0;
- value |= (temp & 0x0010) ? 0x0800 : 0;
- value |= (temp & 0x0020) ? 0x0400 : 0;
- value |= (temp & 0x0040) ? 0x0200 : 0;
- value |= (temp & 0x0080) ? 0x0100 : 0;
- return value;
+ //logerror("%s: jakks_porta_r\n", machine().describe_context());
+ return m_io_p1->read();
+}
+
+WRITE16_MEMBER(spg2xx_game_state::jakks_porta_w)
+{
+ //logerror("%s: jakks_porta_w %04x\n", machine().describe_context(), data);
+}
+
+WRITE16_MEMBER(spg2xx_game_state::jakks_portb_w)
+{
+ //logerror("%s: jakks_portb_w %04x\n", machine().describe_context(), data);
+}
+
+READ16_MEMBER(jakks_gkr_state::jakks_porta_key_io_r)
+{
+ //logerror("%s: jakks_porta_key_io_r\n", machine().describe_context());
+ if (m_porta_key_mode == false)
+ {
+ return m_io_p1->read();
+ }
+ else
+ {
+ /* masks with 0xf, inverts, and combines it with a previous read (when data written to jakks_porta_key_io_w was 0x0000) and expects result to be 0x0000
+ could just expect data written to be returned, but that would be a strange check.
+ all systems seem to respond to the same result, so how is the per-system lock implemented? */
+ return (m_io_p1->read() & 0xfff0) | 0x000f;
+ }
}
-void spg2xx_game_state::mem_map(address_map &map)
+WRITE16_MEMBER(jakks_gkr_state::jakks_porta_key_io_w)
+{
+ logerror("%s: jakks_porta_key_io_w %04x\n", machine().describe_context(), data);
+ // only seen 0xffff and 0x0000 written here.. writes 0xffff before the 2nd part of the port a gamekey check read.
+ if (data == 0xffff)
+ {
+ m_porta_key_mode = true;
+ }
+ else
+ {
+ m_porta_key_mode = false;
+ }
+}
+
+READ16_MEMBER(spg2xx_game_state::rad_porta_r)
+{
+ uint16_t data = m_io_p1->read();
+ logerror("Port A Read: %04x\n", data);
+ return data;
+}
+
+READ16_MEMBER(spg2xx_game_state::rad_portb_r)
+{
+ uint16_t data = m_io_p2->read();
+ logerror("Port B Read: %04x\n", data);
+ return data;
+}
+
+READ16_MEMBER(spg2xx_game_state::rad_portc_r)
+{
+ uint16_t data = m_io_p3->read();
+ logerror("Port C Read: %04x\n", data);
+ return data;
+}
+
+void spg2xx_game_state::mem_map_4m(address_map &map)
{
map(0x000000, 0x3fffff).bankr("cartbank");
map(0x000000, 0x003fff).m(m_spg, FUNC(spg2xx_device::map));
}
+void spg2xx_game_state::mem_map_2m(address_map &map)
+{
+ map(0x000000, 0x1fffff).mirror(0x200000).bankr("cartbank");
+ map(0x000000, 0x003fff).m(m_spg, FUNC(spg2xx_device::map));
+}
+
+void spg2xx_game_state::mem_map_1m(address_map &map)
+{
+ map(0x000000, 0x0fffff).mirror(0x300000).bankr("cartbank");
+ map(0x000000, 0x003fff).m(m_spg, FUNC(spg2xx_device::map));
+}
+
static INPUT_PORTS_START( vii )
PORT_START("P1")
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_PLAYER(1) PORT_NAME("Joypad Up")
@@ -290,26 +578,270 @@ INPUT_PORTS_END
static INPUT_PORTS_START( batman )
PORT_START("P1")
- PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_PLAYER(1) PORT_NAME("Joypad Up")
- PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_PLAYER(1) PORT_NAME("Joypad Down")
- PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_PLAYER(1) PORT_NAME("Joypad Left")
- PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_PLAYER(1) PORT_NAME("Joypad Right")
- PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_PLAYER(1) PORT_NAME("A Button")
- PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_PLAYER(1) PORT_NAME("Menu")
- PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_PLAYER(1) PORT_NAME("B Button")
- PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_PLAYER(1) PORT_NAME("X Button")
+ PORT_BIT( 0x8000, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_PLAYER(1) PORT_NAME("Joypad Up")
+ PORT_BIT( 0x4000, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_PLAYER(1) PORT_NAME("Joypad Down")
+ PORT_BIT( 0x2000, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_PLAYER(1) PORT_NAME("Joypad Left")
+ PORT_BIT( 0x1000, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_PLAYER(1) PORT_NAME("Joypad Right")
+ PORT_BIT( 0x0800, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_PLAYER(1) PORT_NAME("A Button")
+ PORT_BIT( 0x0400, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_PLAYER(1) PORT_NAME("Menu")
+ PORT_BIT( 0x0200, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_PLAYER(1) PORT_NAME("B Button")
+ PORT_BIT( 0x0100, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_PLAYER(1) PORT_NAME("X Button")
INPUT_PORTS_END
static INPUT_PORTS_START( walle )
PORT_START("P1")
- PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_PLAYER(1) PORT_NAME("Joypad Up")
- PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_PLAYER(1) PORT_NAME("Joypad Down")
- PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_PLAYER(1) PORT_NAME("Joypad Left")
- PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_PLAYER(1) PORT_NAME("Joypad Right")
- PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_PLAYER(1) PORT_NAME("A Button")
- PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_PLAYER(1) PORT_NAME("B Button")
+ PORT_BIT( 0x8000, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_PLAYER(1) PORT_NAME("Joypad Up")
+ PORT_BIT( 0x4000, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_PLAYER(1) PORT_NAME("Joypad Down")
+ PORT_BIT( 0x2000, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_PLAYER(1) PORT_NAME("Joypad Left")
+ PORT_BIT( 0x1000, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_PLAYER(1) PORT_NAME("Joypad Right")
+ PORT_BIT( 0x0800, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_PLAYER(1) PORT_NAME("A Button")
+ PORT_BIT( 0x0400, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_PLAYER(1) PORT_NAME("B Button")
+
+ PORT_START("P3")
+ PORT_BIT( 0x0001, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_CUSTOM_MEMBER(DEVICE_SELF, spg2xx_game_state,i2c_r, nullptr)
+ PORT_BIT( 0xfff6, IP_ACTIVE_HIGH, IPT_UNUSED )
+ PORT_BIT( 0x0008, IP_ACTIVE_LOW, IPT_UNKNOWN ) // PAL/NTSC flag, set to NTSC (unverified here)
+INPUT_PORTS_END
+
+static INPUT_PORTS_START( jak_sith_i2c )
+ PORT_START("P1")
+ PORT_BIT( 0x0800, IP_ACTIVE_HIGH, IPT_BUTTON2 )
+ PORT_BIT( 0x0400, IP_ACTIVE_HIGH, IPT_BUTTON1 )
+ PORT_BIT( 0x0020, IP_ACTIVE_HIGH, IPT_BUTTON3 )
+ PORT_BIT( 0xf3df, IP_ACTIVE_HIGH, IPT_UNUSED )
+
+ PORT_START("P3")
+ PORT_BIT( 0x0001, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_CUSTOM_MEMBER(DEVICE_SELF, jakks_gkr_state,i2c_gkr_r, nullptr)
+ PORT_BIT( 0x0008, IP_ACTIVE_LOW, IPT_UNKNOWN ) // PAL/NTSC flag, set to NTSC (unverified here)
+ PORT_BIT( 0xfff6, IP_ACTIVE_HIGH, IPT_UNUSED )
+
+ PORT_START("JOYX")
+ PORT_BIT(0x0fff, 0x0000, IPT_AD_STICK_X) PORT_SENSITIVITY(100) PORT_KEYDELTA(100) PORT_MINMAX(0x00,0x0fff)
+
+ PORT_START("JOYY")
+ PORT_BIT(0x0fff, 0x0000, IPT_AD_STICK_Y) PORT_SENSITIVITY(100) PORT_KEYDELTA(100) PORT_MINMAX(0x00,0x0fff)
INPUT_PORTS_END
+static INPUT_PORTS_START( jak_pooh )
+ PORT_START("P1")
+ PORT_BIT( 0x0800, IP_ACTIVE_HIGH, IPT_BUTTON1 )
+ PORT_BIT( 0x0020, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("Menu / Pause")
+ PORT_BIT( 0xf7df, IP_ACTIVE_HIGH, IPT_UNUSED )
+
+ PORT_START("P3")
+ PORT_BIT( 0xfff7, IP_ACTIVE_HIGH, IPT_UNUSED )
+ PORT_BIT( 0x0008, IP_ACTIVE_LOW, IPT_UNKNOWN ) // PAL/NTSC flag, set to NTSC (unverified here)
+
+ PORT_START("JOYX")
+ PORT_BIT(0x0fff, 0x0000, IPT_AD_STICK_X) PORT_SENSITIVITY(100) PORT_KEYDELTA(100) PORT_MINMAX(0x00,0x0fff)
+
+ PORT_START("JOYY")
+ PORT_BIT(0x0fff, 0x0000, IPT_AD_STICK_Y) PORT_SENSITIVITY(100) PORT_KEYDELTA(100) PORT_MINMAX(0x00,0x0fff)
+INPUT_PORTS_END
+
+static INPUT_PORTS_START( jak_nm_i2c )
+ PORT_START("P1")
+ PORT_BIT( 0x8000, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_PLAYER(1)
+ PORT_BIT( 0x4000, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_PLAYER(1)
+ PORT_BIT( 0x2000, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_PLAYER(1)
+ PORT_BIT( 0x1000, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_PLAYER(1)
+ PORT_BIT( 0x0800, IP_ACTIVE_HIGH, IPT_BUTTON2 )
+ PORT_BIT( 0x0400, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_NAME("Menu")
+ PORT_BIT( 0x0200, IP_ACTIVE_HIGH, IPT_BUTTON1 )
+
+ PORT_START("P3")
+ PORT_BIT( 0x0001, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_CUSTOM_MEMBER(DEVICE_SELF, jakks_gkr_state,i2c_gkr_r, nullptr)
+ PORT_BIT( 0x0002, IP_ACTIVE_HIGH, IPT_UNUSED )
+ PORT_BIT( 0x0004, IP_ACTIVE_HIGH, IPT_UNUSED )
+ PORT_BIT( 0x0008, IP_ACTIVE_LOW, IPT_UNKNOWN ) // PAL/NTSC flag, set to NTSC
+ PORT_BIT( 0xfff0, IP_ACTIVE_HIGH, IPT_UNUSED )
+
+
+ PORT_START("DIALX") // for Pole Position, joystick can be twisted like a dial/wheel (limited?) (check range)
+ PORT_BIT(0x0fff, 0x0000, IPT_AD_STICK_X ) PORT_SENSITIVITY(100) PORT_KEYDELTA(100) PORT_MINMAX(0x00,0x0fff)
+INPUT_PORTS_END
+
+static INPUT_PORTS_START( jak_wf_i2c )
+ PORT_START("P1")
+ PORT_BIT( 0x8000, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_PLAYER(1)
+ PORT_BIT( 0x4000, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_PLAYER(1)
+ PORT_BIT( 0x2000, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_PLAYER(1)
+ PORT_BIT( 0x1000, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_PLAYER(1)
+ PORT_BIT( 0x0800, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("A")
+ PORT_BIT( 0x0400, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("B")
+ PORT_BIT( 0x0200, IP_ACTIVE_HIGH, IPT_UNUSED )
+ PORT_BIT( 0x01c0, IP_ACTIVE_HIGH, IPT_UNUSED )
+ PORT_BIT( 0x0020, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_NAME("Menu")
+ PORT_BIT( 0x001f, IP_ACTIVE_HIGH, IPT_UNUSED )
+
+ PORT_START("P3")
+ PORT_BIT( 0x0001, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_CUSTOM_MEMBER(DEVICE_SELF, jakks_gkr_state,i2c_gkr_r, nullptr)
+ PORT_BIT( 0xfff6, IP_ACTIVE_HIGH, IPT_UNUSED )
+ PORT_BIT( 0x0008, IP_ACTIVE_LOW, IPT_UNKNOWN ) // PAL/NTSC flag, set to NTSC
+
+ /* on real unit you can spin the wheel (and must make sure it completes a full circle, or you lose your turn) instead of pressing 'B' for a random spin but where does it map? (it can be tested in secret test mode)
+ PORT_START("DIALX")
+ PORT_BIT(0x0fff, 0x0000, IPT_AD_STICK_X ) PORT_SENSITIVITY(100) PORT_KEYDELTA(100) PORT_MINMAX(0x00,0x0fff)
+
+ PORT_START("DIALY")
+ PORT_BIT(0x0fff, 0x0000, IPT_AD_STICK_Y ) PORT_SENSITIVITY(100) PORT_KEYDELTA(100) PORT_MINMAX(0x00,0x0fff)
+ */
+INPUT_PORTS_END
+
+static INPUT_PORTS_START( jak_gkr )
+ PORT_START("P1")
+ PORT_BIT( 0x8000, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_PLAYER(1) PORT_NAME("Joypad Up")
+ PORT_BIT( 0x4000, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_PLAYER(1) PORT_NAME("Joypad Down")
+ PORT_BIT( 0x2000, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_PLAYER(1) PORT_NAME("Joypad Left")
+ PORT_BIT( 0x1000, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_PLAYER(1) PORT_NAME("Joypad Right")
+ PORT_BIT( 0x0800, IP_ACTIVE_HIGH, IPT_BUTTON1 )
+ PORT_BIT( 0x0400, IP_ACTIVE_HIGH, IPT_BUTTON2 )
+ PORT_BIT( 0x0200, IP_ACTIVE_HIGH, IPT_BUTTON3 )
+ PORT_BIT( 0x0100, IP_ACTIVE_HIGH, IPT_BUTTON4 )
+ PORT_BIT( 0x00c0, IP_ACTIVE_HIGH, IPT_UNUSED )
+ PORT_BIT( 0x0020, IP_ACTIVE_HIGH, IPT_BUTTON5 ) PORT_NAME("Menu / Pause")
+ PORT_BIT( 0x001f, IP_ACTIVE_HIGH, IPT_UNUSED )
+
+ PORT_START("P3")
+ PORT_DIPNAME( 0x0001, 0x0001, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0001, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0002, 0x0002, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0002, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0004, 0x0004, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0004, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_BIT( 0x0008, IP_ACTIVE_LOW, IPT_UNKNOWN ) // PAL/NTSC flag, set to NTSC (not verified for all games, state can be seen in secret test menu of many tho)
+ PORT_DIPNAME( 0x0010, 0x0010, DEF_STR( Unknown ) ) // this causes WWE to think the unit is a '2nd Controller' and tells you to plug the 1st one in.
+ PORT_DIPSETTING( 0x0010, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0020, 0x0020, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0020, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0040, 0x0040, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0040, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0080, 0x0080, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0080, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0100, 0x0100, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0100, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0200, 0x0200, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0200, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0400, 0x0400, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0400, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0800, 0x0800, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0800, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x1000, 0x1000, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x1000, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x2000, 0x2000, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x2000, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x4000, 0x4000, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x4000, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x8000, 0x8000, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x8000, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+INPUT_PORTS_END
+
+static INPUT_PORTS_START( jak_sdoo_i2c ) // GameKeyReady units had 2 main buttons, later releases reduced that to 1 button (as the internal games don't require 2 and no GameKeys were released)
+ PORT_START("P1")
+ PORT_BIT( 0x8000, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_PLAYER(1)
+ PORT_BIT( 0x4000, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_PLAYER(1)
+ PORT_BIT( 0x2000, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_PLAYER(1)
+ PORT_BIT( 0x1000, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_PLAYER(1)
+ PORT_BIT( 0x0800, IP_ACTIVE_HIGH, IPT_BUTTON1 )
+ PORT_BIT( 0x0400, IP_ACTIVE_HIGH, IPT_BUTTON2 )
+ PORT_BIT( 0x0200, IP_ACTIVE_HIGH, IPT_UNUSED ) // debug input, skips levels!
+ PORT_BIT( 0x0100, IP_ACTIVE_HIGH, IPT_UNUSED )
+ PORT_BIT( 0x00c0, IP_ACTIVE_HIGH, IPT_UNUSED ) // must be low or other inputs don't work?
+ PORT_BIT( 0x0020, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_NAME("Menu / Pause")
+ PORT_BIT( 0x001f, IP_ACTIVE_HIGH, IPT_UNUSED )
+
+ PORT_START("P3")
+ PORT_BIT( 0x0001, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_CUSTOM_MEMBER(DEVICE_SELF, jakks_gkr_state,i2c_gkr_r, nullptr) // is this correct? doesn't seem to work
+ PORT_DIPNAME( 0x0002, 0x0002, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0002, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0004, 0x0004, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0004, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_BIT( 0x0008, IP_ACTIVE_LOW, IPT_UNKNOWN ) // PAL/NTSC flag, set to NTSC (unverified here)
+ PORT_DIPNAME( 0x0010, 0x0010, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0010, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0020, 0x0020, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0020, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0040, 0x0040, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0040, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0080, 0x0080, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0080, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0100, 0x0100, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0100, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0200, 0x0200, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0200, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0400, 0x0400, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0400, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0800, 0x0800, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0800, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x1000, 0x1000, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x1000, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x2000, 0x2000, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x2000, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x4000, 0x4000, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x4000, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x8000, 0x8000, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x8000, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+INPUT_PORTS_END
+
+
+static INPUT_PORTS_START( jak_gkr_i2c )
+ PORT_INCLUDE(jak_gkr)
+
+ PORT_MODIFY("P3")
+ PORT_BIT( 0x0001, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_CUSTOM_MEMBER(DEVICE_SELF, jakks_gkr_state,i2c_gkr_r, nullptr)
+INPUT_PORTS_END
+
+static INPUT_PORTS_START( jak_disp_i2c )
+ PORT_START("P1")
+ PORT_BIT( 0x8000, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_PLAYER(1)
+ PORT_BIT( 0x4000, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_PLAYER(1)
+ PORT_BIT( 0x2000, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_PLAYER(1)
+ PORT_BIT( 0x1000, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_PLAYER(1)
+ PORT_BIT( 0x0800, IP_ACTIVE_HIGH, IPT_UNUSED )
+ PORT_BIT( 0x0400, IP_ACTIVE_HIGH, IPT_UNUSED )
+ PORT_BIT( 0x0200, IP_ACTIVE_HIGH, IPT_BUTTON1 )
+ PORT_BIT( 0x0100, IP_ACTIVE_HIGH, IPT_BUTTON2 )
+ PORT_BIT( 0x00c0, IP_ACTIVE_HIGH, IPT_UNUSED )
+ PORT_BIT( 0x0020, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_NAME("Start / Menu / Pause")
+ PORT_BIT( 0x001f, IP_ACTIVE_HIGH, IPT_UNUSED )
+
+ PORT_START("P3")
+ PORT_BIT( 0x0001, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_CUSTOM_MEMBER(DEVICE_SELF, jakks_gkr_state,i2c_gkr_r, nullptr)
+ PORT_BIT( 0x0008, IP_ACTIVE_LOW, IPT_UNKNOWN ) // PAL/NTSC flag, set to NTSC (unverified here)
+ PORT_BIT( 0xfff6, IP_ACTIVE_HIGH, IPT_UNUSED )
+INPUT_PORTS_END
+
+
+
static INPUT_PORTS_START( wirels60 )
PORT_START("P1")
PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_PLAYER(1) PORT_NAME("Joypad Up")
@@ -456,6 +988,37 @@ static INPUT_PORTS_START( rad_sktv )
PORT_DIPNAME( 0x8000, 0x8000, DEF_STR( Unknown ) )
PORT_DIPSETTING( 0x8000, DEF_STR( Off ) )
PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+
+ PORT_START("P3")
+ PORT_BIT( 0xffff, IP_ACTIVE_HIGH, IPT_UNUSED )
+INPUT_PORTS_END
+
+static INPUT_PORTS_START( mattelcs ) // there is a 'secret test mode' that previously got activated before inputs were mapped, might need unused inputs to active?
+ PORT_START("P1")
+ PORT_BIT( 0x0007, IP_ACTIVE_LOW, IPT_UNUSED ) // must be IP_ACTIVE_LOW or you can't switch to Football properly?
+ PORT_DIPNAME( 0x0018, 0x0000, "Game Select Slider" ) // technically not a dipswitch, a 3 position slider, but how best map it?
+ PORT_DIPSETTING( 0x0008, "Baseball (Left)" )
+ PORT_DIPSETTING( 0x0010, "Basketball (Middle)" )
+ PORT_DIPSETTING( 0x0000, "Football (Right)" )
+ // no 4th position possible
+ PORT_DIPNAME( 0x0040, 0x0040, DEF_STR( Difficulty ) )
+ PORT_DIPSETTING( 0x0040, DEF_STR( Hard ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( Normal ) )
+ PORT_BIT( 0xffa0, IP_ACTIVE_HIGH, IPT_UNUSED )
+
+ PORT_START("P2")
+ PORT_BIT( 0x0001, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_NAME("Joypad Up")
+ PORT_BIT( 0x0002, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_NAME("Joypad Down")
+ PORT_BIT( 0x0004, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_NAME("Joypad Left")
+ PORT_BIT( 0x0008, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_NAME("Joypad Right")
+ PORT_BIT( 0x0010, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("Sound") // toggles between sound+music, sound only, and no sound
+ PORT_BIT( 0x0020, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("Hike / Pitch")
+ PORT_BIT( 0x0040, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_NAME("Shoot / Run")
+ PORT_BIT( 0x0080, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_NAME("Kick / Hit")
+ PORT_BIT( 0xff00, IP_ACTIVE_HIGH, IPT_UNUSED )
+
+ PORT_START("P3")
+ PORT_BIT( 0xffff, IP_ACTIVE_HIGH, IPT_UNUSED )
INPUT_PORTS_END
/* hold 'Console Down' while powering up to get the test menu, including input tests
@@ -477,6 +1040,542 @@ static INPUT_PORTS_START( rad_crik )
PORT_BIT( 0xffff, IP_ACTIVE_LOW, IPT_UNKNOWN )
INPUT_PORTS_END
+static INPUT_PORTS_START( dreamlif )
+ PORT_START("P1")
+ PORT_BIT( 0x0001, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT )
+ PORT_BIT( 0x0002, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT )
+ PORT_BIT( 0x0004, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP )
+ PORT_BIT( 0x0008, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN )
+ PORT_BIT( 0x0010, IP_ACTIVE_HIGH, IPT_BUTTON1 )
+ PORT_BIT( 0x0020, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("A")
+ PORT_BIT( 0x0040, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_NAME("B")
+ PORT_BIT( 0x0080, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_NAME("C")
+ PORT_BIT( 0x0100, IP_ACTIVE_HIGH, IPT_BUTTON5 ) PORT_NAME("Yes")
+ PORT_BIT( 0x0200, IP_ACTIVE_HIGH, IPT_BUTTON6 ) PORT_NAME("No")
+ PORT_BIT( 0x0400, IP_ACTIVE_HIGH, IPT_UNKNOWN ) // must be low or the Tiger logo gets skipped, also must be low for service mode (hold pause while booting) to work
+ PORT_BIT( 0x0800, IP_ACTIVE_HIGH, IPT_BUTTON7 ) PORT_NAME("Pause")
+ PORT_BIT( 0xf000, IP_ACTIVE_HIGH, IPT_UNUSED )
+INPUT_PORTS_END
+
+
+// there is a speaker volume for the 'guitar' mode, but it's presumably an analog feature, not read by the game.
+static INPUT_PORTS_START( icanguit )
+ PORT_START("P1")
+ // uses multiplexed ports instead, see below
+
+ PORT_START("P1_0")
+ PORT_BIT( 0x0001, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Q) PORT_NAME("Fret 1, Row 1")
+ PORT_BIT( 0x0002, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_A) PORT_NAME("Fret 2, Row 1")
+ PORT_BIT( 0x0004, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_BACKSLASH2) PORT_NAME("Fret 3, Row 1")
+ PORT_BIT( 0x0008, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_U) PORT_NAME("Fret 4, Row 1")
+ PORT_BIT( 0x0010, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_J) PORT_NAME("Fret 5, Row 1")
+ PORT_BIT( 0x0020, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_N) PORT_NAME("Fret 6, Row 1") // Frets 6-12 only have 2 rows (1 and 6)
+ PORT_BIT( 0x0040, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_1) PORT_NAME("Fret 9, Row 1")
+ PORT_BIT( 0x0080, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_2) PORT_NAME("Fret 10, Row 1")
+ PORT_BIT( 0x0100, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_3) PORT_NAME("Fret 11, Row 1")
+ PORT_BIT( 0x0200, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_4) PORT_NAME("Fret 12, Row 1")
+ PORT_BIT( 0xfc00, IP_ACTIVE_HIGH, IPT_UNKNOWN )
+
+ PORT_START("P1_1")
+ PORT_BIT( 0x0001, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_W) PORT_NAME("Fret 1, Row 2")
+ PORT_BIT( 0x0002, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_S) PORT_NAME("Fret 2, Row 2")
+ PORT_BIT( 0x0004, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Z) PORT_NAME("Fret 3, Row 2")
+ PORT_BIT( 0x0008, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_I) PORT_NAME("Fret 4, Row 2")
+ PORT_BIT( 0x0010, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_K) PORT_NAME("Fret 5, Row 2")
+ PORT_BIT( 0x0020, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_M) PORT_NAME("Fret 7, Row 1")
+ PORT_BIT( 0xffc0, IP_ACTIVE_HIGH, IPT_UNKNOWN )
+
+ PORT_START("P1_2")
+ PORT_BIT( 0x0001, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_E) PORT_NAME("Fret 1, Row 3")
+ PORT_BIT( 0x0002, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_D) PORT_NAME("Fret 2, Row 3")
+ PORT_BIT( 0x0004, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_X) PORT_NAME("Fret 3, Row 3")
+ PORT_BIT( 0x0008, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_O) PORT_NAME("Fret 4, Row 3")
+ PORT_BIT( 0x0010, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_L) PORT_NAME("Fret 5, Row 3")
+ PORT_BIT( 0x0020, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_COMMA) PORT_NAME("Fret 8, Row 1")
+ PORT_BIT( 0xffc0, IP_ACTIVE_HIGH, IPT_UNKNOWN )
+
+ PORT_START("P1_3")
+ PORT_BIT( 0x0001, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_R) PORT_NAME("Fret 1, Row 4")
+ PORT_BIT( 0x0002, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F) PORT_NAME("Fret 2, Row 4")
+ PORT_BIT( 0x0004, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_C) PORT_NAME("Fret 3, Row 4")
+ PORT_BIT( 0x0008, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_P) PORT_NAME("Fret 4, Row 4")
+ PORT_BIT( 0x0010, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_COLON) PORT_NAME("Fret 5, Row 4")
+ PORT_BIT( 0x0020, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_STOP) PORT_NAME("Fret 8, Row 6")
+ PORT_BIT( 0xffc0, IP_ACTIVE_HIGH, IPT_UNKNOWN )
+
+ PORT_START("P1_4")
+ PORT_BIT( 0x0001, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_T) PORT_NAME("Fret 1, Row 5")
+ PORT_BIT( 0x0002, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_G) PORT_NAME("Fret 2, Row 5")
+ PORT_BIT( 0x0004, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_V) PORT_NAME("Fret 3, Row 5")
+ PORT_BIT( 0x0008, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_OPENBRACE) PORT_NAME("Fret 4, Row 5")
+ PORT_BIT( 0x0010, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_QUOTE) PORT_NAME("Fret 5, Row 5")
+ PORT_BIT( 0x0020, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_SLASH) PORT_NAME("Fret 7, Row 6")
+ PORT_BIT( 0xffc0, IP_ACTIVE_HIGH, IPT_UNKNOWN )
+
+ PORT_START("P1_5")
+ PORT_BIT( 0x0001, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Y) PORT_NAME("Fret 1, Row 6")
+ PORT_BIT( 0x0002, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_H) PORT_NAME("Fret 2, Row 6")
+ PORT_BIT( 0x0004, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_B) PORT_NAME("Fret 3, Row 6")
+ PORT_BIT( 0x0008, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_CLOSEBRACE) PORT_NAME("Fret 4, Row 6")
+ PORT_BIT( 0x0010, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_BACKSLASH) PORT_NAME("Fret 5, Row 6")
+ PORT_BIT( 0x0020, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_RSHIFT) PORT_NAME("Fret 6, Row 6") // Frets 6-12 only have 2 rows (1 and 6)
+ PORT_BIT( 0x0040, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_5) PORT_NAME("Fret 9, Row 6")
+ PORT_BIT( 0x0080, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_6) PORT_NAME("Fret 10, Row 6")
+ PORT_BIT( 0x0100, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_7) PORT_NAME("Fret 11, Row 6")
+ PORT_BIT( 0x0200, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_8) PORT_NAME("Fret 12, Row 6")
+ PORT_BIT( 0xfc00, IP_ACTIVE_HIGH, IPT_UNKNOWN )
+
+ PORT_START("P2")
+ PORT_BIT( 0xffff, IP_ACTIVE_HIGH, IPT_UNKNOWN ) // might be some kind of seeprom in here?
+
+ PORT_START("P3")
+ // uses multiplexed ports instead, see below
+
+ PORT_START("P3_0")
+ PORT_BIT( 0x0007, IP_ACTIVE_HIGH, IPT_UNKNOWN )
+ PORT_BIT( 0x0008, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("String 1") // these seem to respond on release, but are definitely active high based on visual indicators
+ PORT_BIT( 0x0010, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("String 2")
+ PORT_BIT( 0x0020, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("String 3")
+ PORT_BIT( 0x0040, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("String 4")
+ PORT_BIT( 0x0080, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("String 5")
+ PORT_BIT( 0x0100, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("String 6")
+ PORT_BIT( 0x0200, IP_ACTIVE_HIGH, IPT_UNKNOWN )
+ PORT_DIPNAME( 0x0400, 0x0000, "TV or Guitar Mode" )
+ PORT_DIPSETTING( 0x0000, "TV Mode" )
+ PORT_DIPSETTING( 0x0400, "Guitar Mode" )
+ PORT_BIT( 0xf800, IP_ACTIVE_HIGH, IPT_UNKNOWN )
+
+ PORT_START("P3_1")
+ PORT_BIT( 0x0001, IP_ACTIVE_HIGH, IPT_UNKNOWN )
+ PORT_BIT( 0x0002, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN )
+ PORT_BIT( 0xfffc, IP_ACTIVE_HIGH, IPT_UNKNOWN )
+
+ PORT_START("P3_2")
+ PORT_BIT( 0x0001, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("Home")
+ PORT_BIT( 0x0002, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("Enter")
+ PORT_BIT( 0xfffc, IP_ACTIVE_HIGH, IPT_UNKNOWN )
+
+ PORT_START("P3_3")
+ PORT_BIT( 0x0001, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_NAME("Pause")
+ PORT_BIT( 0x0002, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP )
+ PORT_BIT( 0xfffc, IP_ACTIVE_HIGH, IPT_UNKNOWN )
+
+ PORT_START("P3_4")
+ PORT_BIT( 0x0001, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) // doesn't highlight during menus, but changes sound in 'Guitar Mode' and switches between levels after selecting song
+ PORT_BIT( 0x0002, IP_ACTIVE_HIGH, IPT_UNKNOWN )
+ PORT_BIT( 0x0004, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) // doesn't highlight during menus, but changes sound in 'Guitar Mode' and switches between levels after selecting song
+ PORT_BIT( 0xfff8, IP_ACTIVE_LOW, IPT_UNKNOWN )
+
+ PORT_START("P3_5")
+ PORT_BIT( 0x0001, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_PLUS_PAD) PORT_NAME("Whammy Up")
+ PORT_BIT( 0x0002, IP_ACTIVE_HIGH, IPT_UNKNOWN )
+ PORT_BIT( 0x0004, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_MINUS_PAD) PORT_NAME("Whammy Down")
+ PORT_BIT( 0xfff8, IP_ACTIVE_HIGH, IPT_UNKNOWN )
+INPUT_PORTS_END
+
+// this has an entire piano keyboard + extras
+// there is a volume dial for the internal speakers when used in non-TV mode, but presumably it is not CPU visible
+// there should be a metronome key, but nothing seems to have that effect, maybe due to incomplete sound emulation?
+static INPUT_PORTS_START( icanpian )
+ PORT_START("P1")
+ // uses multiplexed ports instead, see below
+
+ PORT_START("P1_0")
+ PORT_BIT( 0x0001, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_BACKSLASH2)PORT_NAME("Octave 0 F (Green)")
+ PORT_BIT( 0x0002, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_A) PORT_NAME("Octave 0 F# (Purple)")
+ PORT_BIT( 0x0004, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Z) PORT_NAME("Octave 0 G (Yellow)")
+ PORT_BIT( 0x0008, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_S) PORT_NAME("Octave 0 G# (Dark Blue)")
+ PORT_BIT( 0x0010, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_X) PORT_NAME("Octave 0 A (Flesh)")
+ PORT_BIT( 0x0020, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_D) PORT_NAME("Octave 0 A# (Dark Green)")
+ PORT_BIT( 0x0040, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_C) PORT_NAME("Octave 0 B (Pink)")
+ PORT_BIT( 0x0080, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_V) PORT_NAME("Octave 0 C (White)")
+ PORT_BIT( 0x0100, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_G) PORT_NAME("Octave 0 C# (Black)")
+ PORT_BIT( 0x0200, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_B) PORT_NAME("Octave 0 D (Blue)")
+ PORT_BIT( 0x0400, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_H) PORT_NAME("Octave 0 D# (Red)")
+ PORT_BIT( 0x0800, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_N) PORT_NAME("Octave 0 E (Orange)")
+ PORT_BIT( 0xf000, IP_ACTIVE_HIGH, IPT_UNKNOWN )
+
+ PORT_START("P1_1")
+ PORT_BIT( 0x0001, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_M) PORT_NAME("Octave 1 F (Green)")
+ PORT_BIT( 0x0002, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_K) PORT_NAME("Octave 1 F# (Purple)")
+ PORT_BIT( 0x0004, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_COMMA) PORT_NAME("Octave 1 G (Yellow)")
+ PORT_BIT( 0x0008, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_L) PORT_NAME("Octave 1 G# (Dark Blue)")
+ PORT_BIT( 0x0010, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_STOP) PORT_NAME("Octave 1 A (Flesh)")
+ PORT_BIT( 0x0020, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_COLON) PORT_NAME("Octave 1 A# (Dark Green)")
+ PORT_BIT( 0x0040, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Q) PORT_NAME("Octave 1 B (Pink)")
+ PORT_BIT( 0x0080, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_W) PORT_NAME("Octave 1 C (White)")
+ PORT_BIT( 0x0100, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_3) PORT_NAME("Octave 1 C# (Black)")
+ PORT_BIT( 0x0200, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_E) PORT_NAME("Octave 1 D (Blue)")
+ PORT_BIT( 0x0400, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_4) PORT_NAME("Octave 1 D# (Red)")
+ PORT_BIT( 0x0800, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_R) PORT_NAME("Octave 1 E (Orange)")
+ PORT_BIT( 0xf000, IP_ACTIVE_HIGH, IPT_UNKNOWN )
+
+ PORT_START("P1_2")
+ PORT_BIT( 0x0001, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_T) PORT_NAME("Octave 2 F (Green)")
+ PORT_BIT( 0x0002, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_6) PORT_NAME("Octave 2 F# (Purple)")
+ PORT_BIT( 0x0004, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Y) PORT_NAME("Octave 2 G (Yellow)")
+ PORT_BIT( 0x0008, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_7) PORT_NAME("Octave 2 G# (Dark Blue)")
+ PORT_BIT( 0x0010, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_U) PORT_NAME("Octave 2 A (Flesh)")
+ PORT_BIT( 0x0020, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_8) PORT_NAME("Octave 2 A# (Dark Green)")
+ PORT_BIT( 0x0040, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_I) PORT_NAME("Octave 2 B (Pink)")
+ PORT_BIT( 0x0080, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_O) PORT_NAME("Octave 2 C (White)")
+ PORT_BIT( 0x0100, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_0) PORT_NAME("Octave 2 C# (Black)")
+ PORT_BIT( 0x0200, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_P) PORT_NAME("Octave 2 D (Blue)")
+ PORT_BIT( 0x0400, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_MINUS) PORT_NAME("Octave 2 D# (Red)")
+ PORT_BIT( 0x0800, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_OPENBRACE) PORT_NAME("Octave 2 E (Orange)")
+ PORT_BIT( 0xf000, IP_ACTIVE_HIGH, IPT_UNKNOWN )
+
+ PORT_START("P2")
+ PORT_BIT( 0xffff, IP_ACTIVE_HIGH, IPT_UNKNOWN ) // might be some kind of seeprom in here? (or not? only I Can Play Guitar seems to offer a 'resume', something does get accessed on startup tho? and the machine tells you 'high scores')
+
+ PORT_START("P3")
+ // uses multiplexed ports instead, see below
+
+ PORT_START("P3_0")
+ PORT_BIT( 0x0001, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("Change Instrument")
+ PORT_BIT( 0x0002, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("Cycle Hands")
+ PORT_BIT( 0x0004, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("Display Mode 1")
+ PORT_BIT( 0x0008, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("Display Mode 2")
+ PORT_BIT( 0x0010, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("Display Mode 3")
+ PORT_BIT( 0x0020, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("Display Mode 4")
+ PORT_BIT( 0x07c0, IP_ACTIVE_HIGH, IPT_UNKNOWN ) // unused?
+ PORT_BIT( 0x0800, IP_ACTIVE_HIGH, IPT_POWER_OFF ) PORT_NAME("Power Switch") // presumably power / low battery, kils the game
+ PORT_BIT( 0xf000, IP_ACTIVE_HIGH, IPT_UNKNOWN )
+
+ PORT_START("P3_1")
+ PORT_BIT( 0x0001, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_PLUS_PAD) PORT_NAME("Tempo Up")
+ PORT_BIT( 0x0002, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_ASTERISK) PORT_NAME("Tempo Default")
+ PORT_BIT( 0x0004, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_MINUS_PAD) PORT_NAME("Tempo Down")
+ PORT_BIT( 0x0008, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("Pause")
+ PORT_BIT( 0x0010, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("Metronome")
+ PORT_BIT( 0x0020, IP_ACTIVE_HIGH, IPT_UNUSED ) // will skip intro scenes etc. like other buttons but no more physical buttons on KB to map here
+ PORT_BIT( 0xffc0, IP_ACTIVE_HIGH, IPT_UNKNOWN )
+
+ PORT_START("P3_2") // the system ALWAYS requires a cartridge, but has 2 modes of operation depending on a switch. The only way to use it as a normal keyboard is by flipping this switch.
+ PORT_DIPNAME( 0x0001, 0x0000, "System Mode" ) // or implement this as a toggle key? (it's a slider switch)
+ PORT_DIPSETTING( 0x0001, "Keyboard Mode (no TV output)" )
+ PORT_DIPSETTING( 0x0000, "TV Mode" )
+ PORT_BIT( 0x0002, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_NAME("Scroll Up")
+ PORT_BIT( 0x0004, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_NAME("Scroll Down")
+ PORT_BIT( 0x0008, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("Enter")
+ PORT_BIT( 0x0010, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("Home")
+ PORT_BIT( 0x0020, IP_ACTIVE_HIGH, IPT_UNUSED ) // will skip intro scenes etc. like other buttons but no more physical buttons on KB to map here
+ PORT_BIT( 0xffc0, IP_ACTIVE_HIGH, IPT_UNKNOWN )
+INPUT_PORTS_END
+
+
+static INPUT_PORTS_START( rad_fb2 ) // controls must be multiplexed somehow, as there's no room for P2 controls otherwise (unless P2 controls were never finished and it was only sold in a single mat version, Radica left useless P2 menu options in the mini Genesis consoles)
+ PORT_START("P1")
+ PORT_BIT( 0x0001, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_PLAYER(1) // 'left'
+ PORT_BIT( 0x0002, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(1) // 'up'
+ PORT_BIT( 0x0004, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_PLAYER(1) // 'right'
+ PORT_BIT( 0x0008, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(1) // acts a 'motion ball' in menu (this is an analog input from the ball tho? at least in rad_fb in xavix.cpp so this might just be a debug input here)
+ PORT_BIT( 0x0010, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_PLAYER(2) // 'p2 right'
+ // none of the remaining inputs seem to do anything
+ PORT_BIT( 0xffe0, IP_ACTIVE_LOW, IPT_UNKNOWN )
+
+ PORT_START("P2")
+ PORT_BIT( 0xffff, IP_ACTIVE_LOW, IPT_UNKNOWN )
+
+ PORT_START("P3")
+ PORT_BIT( 0xffff, IP_ACTIVE_LOW, IPT_CUSTOM ) // NTSC (1) / PAL (0) flag
+INPUT_PORTS_END
+
+
+static INPUT_PORTS_START( lexizeus ) // how many buttons does this have? I accidentally entered a secret test mode before that seemed to indicate 6, but can't get there again
+ PORT_START("P1")
+ PORT_DIPNAME( 0x0001, 0x0001, "P1" )
+ PORT_DIPSETTING( 0x0001, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0002, 0x0002, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0002, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0004, 0x0004, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0004, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0008, 0x0008, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0008, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0010, 0x0010, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0010, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0020, 0x0020, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0020, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0040, 0x0040, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0040, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0080, 0x0080, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0080, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_BIT( 0x0100, IP_ACTIVE_LOW, IPT_JOYSTICK_UP )
+ PORT_DIPNAME( 0x0200, 0x0200, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0200, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0400, 0x0400, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0400, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_BIT( 0x0800, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT )
+ PORT_DIPNAME( 0x1000, 0x1000, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x1000, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x2000, 0x2000, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x2000, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_BIT( 0x4000, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_NAME("Button 1") // shoot in Tiger Rescue & Deep
+ PORT_BIT( 0x8000, IP_ACTIVE_LOW, IPT_BUTTON5 ) PORT_NAME("Pause")
+
+ PORT_START("P2")
+ PORT_DIPNAME( 0x0001, 0x0001, "P2" )
+ PORT_DIPSETTING( 0x0001, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0002, 0x0002, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0002, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0004, 0x0004, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0004, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0008, 0x0008, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0008, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0010, 0x0010, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0010, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0020, 0x0020, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0020, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0040, 0x0040, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0040, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0080, 0x0080, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0080, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0100, 0x0100, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0100, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0200, 0x0200, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0200, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0400, 0x0400, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0400, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0800, 0x0800, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0800, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x1000, 0x1000, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x1000, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x2000, 0x2000, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x2000, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x4000, 0x4000, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x4000, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x8000, 0x8000, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x8000, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+
+ PORT_START("P3")
+ PORT_BIT( 0x0001, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_NAME("Button 1 Rapid") // same function as button 1 but with rapid toggle on/off
+ PORT_BIT( 0x0002, IP_ACTIVE_LOW, IPT_BUTTON4 ) PORT_NAME("Button 2 Rapid") // same function as button 2 but with rapid toggle on/off
+ PORT_DIPNAME( 0x0004, 0x0004, "P3" )
+ PORT_DIPSETTING( 0x0004, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_BIT( 0x0008, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_NAME("Button 2") // toggles ball / number view in pool
+ PORT_DIPNAME( 0x0010, 0x0010, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0010, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0020, 0x0020, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0020, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0040, 0x0040, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0040, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0080, 0x0080, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0080, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0100, 0x0100, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0100, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_BIT( 0x0200, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN )
+ PORT_BIT( 0x0400, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT )
+ PORT_DIPNAME( 0x0800, 0x0800, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0800, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x1000, 0x1000, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x1000, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x2000, 0x2000, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x2000, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x4000, 0x4000, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x4000, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x8000, 0x8000, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x8000, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+INPUT_PORTS_END
+
+
+READ16_MEMBER(dreamlif_state::portb_r)
+{
+ // some kind of EEPROM device?
+ logerror("%s: portb_r\n", machine().describe_context());
+ return 0x0000;
+}
+
+WRITE16_MEMBER(dreamlif_state::portb_w)
+{
+ // some kind of EEPROM device?
+ logerror("%s: portb_w (%04x)\n", machine().describe_context(), data);
+}
+
+
+
+READ16_MEMBER(icanguit_state::porta_r)
+{
+ //logerror("%s: porta_r\n", machine().describe_context());
+ return m_inlatch_a;
+}
+
+
+READ16_MEMBER(icanguit_state::portc_r)
+{
+ //logerror("%s: portc_r\n", machine().describe_context());
+ return m_inlatch_c;
+}
+
+WRITE16_MEMBER(icanguit_state::porta_w)
+{
+ if (data == 0x0000)
+ {
+ m_inlatch_a = m_inlatch_c = 0x0000;
+ }
+ else if (data == 0x1000)
+ {
+ m_inlatch_a = m_porta_in[2]->read();
+ m_inlatch_c = m_portc_in[2]->read();
+ }
+ else if (data == 0x2000)
+ {
+ m_inlatch_a = m_porta_in[1]->read();
+ m_inlatch_c = m_portc_in[1]->read();
+ }
+ else if (data == 0x4000)
+ {
+ m_inlatch_a = m_porta_in[0]->read();
+ m_inlatch_c = m_portc_in[0]->read();
+ }
+ else
+ {
+ logerror("%s: unknown porta_w (%04x)\n", machine().describe_context(), data);
+ }
+}
+
+WRITE16_MEMBER(icanguit_state::portc_w)
+{
+ //logerror("%s: portc_w (%04x)\n", machine().describe_context(), data);
+}
+
+
+// portb is used on startup, something serial?
+READ16_MEMBER(icanguit_state::portb_r)
+{
+ //logerror("%s: portb_r\n", machine().describe_context());
+ return m_io_p2->read();
+}
+
+WRITE16_MEMBER(icanguit_state::portb_w)
+{
+ //logerror("%s: portb_w (%04x)\n", machine().describe_context(), data);
+}
+
+WRITE16_MEMBER(icanguit_state::guit_porta_w)
+{
+ //logerror("%s: porta_w (%04x)\n", machine().describe_context(), data);
+
+ if (data == 0x0000)
+ {
+ m_inlatch_a = m_inlatch_c = 0x0000;
+ }
+ else if (data == 0x0400)
+ {
+ m_inlatch_a = m_porta_in[5]->read();
+ m_inlatch_c = m_portc_in[5]->read();
+ }
+ else if (data == 0x0800)
+ {
+ m_inlatch_a = m_porta_in[4]->read();
+ m_inlatch_c = m_portc_in[4]->read();
+ }
+ else if (data == 0x1000)
+ {
+ m_inlatch_a = m_porta_in[3]->read();
+ m_inlatch_c = m_portc_in[3]->read();
+ }
+ else if (data == 0x2000)
+ {
+ m_inlatch_a = m_porta_in[2]->read();
+ m_inlatch_c = m_portc_in[2]->read();
+ }
+ else if (data == 0x4000)
+ {
+ m_inlatch_a = m_porta_in[1]->read();
+ m_inlatch_c = m_portc_in[1]->read();
+ }
+ else if (data == 0x8000)
+ {
+ m_inlatch_a = m_porta_in[0]->read();
+ m_inlatch_c = m_portc_in[0]->read();
+ }
+ else
+ {
+ logerror("%s: unknown porta_w (%04x)\n", machine().describe_context(), data);
+ }
+}
+
+
+
+void icanguit_state::machine_start()
+{
+ spg2xx_game_state::machine_start();
+
+ // if there's a cart, override the standard banking
+ if (m_cart && m_cart->exists())
+ {
+ std::string region_tag;
+ m_cart_region = memregion(region_tag.assign(m_cart->tag()).append(GENERIC_ROM_REGION_TAG).c_str());
+ m_bank->configure_entries(0, (m_cart_region->bytes() + 0x7fffff) / 0x800000, m_cart_region->base(), 0x800000);
+ m_bank->set_entry(0);
+ }
+}
+
+void icanguit_state::machine_reset()
+{
+ spg2xx_game_state::machine_reset();
+ m_inlatch_a = 0x0000;
+ m_inlatch_c = 0x0000;
+}
+
+
+DEVICE_IMAGE_LOAD_MEMBER(icanguit_state, icanguit_cart)
+{
+ uint32_t size = m_cart->common_get_size("rom");
+
+ if (size < 0x800000)
+ {
+ image.seterror(IMAGE_ERROR_UNSPECIFIED, "Unsupported cartridge size");
+ return image_init_result::FAIL;
+ }
+
+ m_cart->rom_alloc(size, GENERIC_ROM16_WIDTH, ENDIANNESS_LITTLE);
+ m_cart->common_load_rom(m_cart->get_rom_base(), size, "rom");
+
+ return image_init_result::PASS;
+}
+
+
+
void vii_state::machine_start()
{
spg2xx_game_state::machine_start();
@@ -492,6 +1591,8 @@ void vii_state::machine_start()
m_ctrl_poll_timer = timer_alloc(TIMER_CTRL_POLL);
m_ctrl_poll_timer->adjust(attotime::never);
+
+ save_item(NAME(m_controller_input));
}
void vii_state::machine_reset()
@@ -514,6 +1615,11 @@ void spg2xx_game_state::machine_start()
m_serial_eeprom = std::make_unique<uint8_t[]>(0x400);
if (m_nvram)
m_nvram->set_base(&m_serial_eeprom[0], 0x400);
+
+ save_item(NAME(m_current_bank));
+ save_item(NAME(m_w60_controller_input));
+ save_item(NAME(m_w60_porta_data));
+ save_item(NAME(m_walle_portc_data));
}
void spg2xx_game_state::machine_reset()
@@ -571,7 +1677,7 @@ DEVICE_IMAGE_LOAD_MEMBER(vii_state, vii_cart)
void spg2xx_game_state::spg2xx_base(machine_config &config)
{
UNSP(config, m_maincpu, XTAL(27'000'000));
- m_maincpu->set_addrmap(AS_PROGRAM, &spg2xx_game_state::mem_map);
+ m_maincpu->set_addrmap(AS_PROGRAM, &spg2xx_game_state::mem_map_4m);
SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
m_screen->set_refresh_hz(60);
@@ -620,6 +1726,50 @@ void vii_state::vii(machine_config &config)
SOFTWARE_LIST(config, "vii_cart").set_original("vii");
}
+void icanguit_state::icanguit(machine_config &config)
+{
+ SPG24X(config, m_spg, XTAL(27'000'000), m_maincpu, m_screen);
+
+ spg2xx_base(config);
+
+ m_spg->porta_in().set(FUNC(icanguit_state::porta_r));
+ m_spg->portb_in().set(FUNC(icanguit_state::portb_r));
+ m_spg->portc_in().set(FUNC(icanguit_state::portc_r));
+ m_spg->porta_out().set(FUNC(icanguit_state::guit_porta_w));
+ m_spg->portb_out().set(FUNC(icanguit_state::portb_w));
+ m_spg->portc_out().set(FUNC(icanguit_state::portc_w));
+
+
+ GENERIC_CARTSLOT(config, m_cart, generic_plain_slot, "icanguit_cart");
+ m_cart->set_width(GENERIC_ROM16_WIDTH);
+ m_cart->set_device_load(device_image_load_delegate(&icanguit_state::device_image_load_icanguit_cart, this));
+ m_cart->set_must_be_loaded(true);
+
+ SOFTWARE_LIST(config, "icanguit_cart").set_original("icanguit");
+}
+
+void icanguit_state::icanpian(machine_config &config)
+{
+ SPG24X(config, m_spg, XTAL(27'000'000), m_maincpu, m_screen);
+
+ spg2xx_base(config);
+
+ m_spg->porta_in().set(FUNC(icanguit_state::porta_r));
+ m_spg->portb_in().set(FUNC(icanguit_state::portb_r));
+ m_spg->portc_in().set(FUNC(icanguit_state::portc_r));
+ m_spg->porta_out().set(FUNC(icanguit_state::porta_w));
+ m_spg->portb_out().set(FUNC(icanguit_state::portb_w));
+ m_spg->portc_out().set(FUNC(icanguit_state::portc_w));
+
+ GENERIC_CARTSLOT(config, m_cart, generic_plain_slot, "icanpian_cart");
+ m_cart->set_width(GENERIC_ROM16_WIDTH);
+ m_cart->set_device_load(device_image_load_delegate(&icanguit_state::device_image_load_icanguit_cart, this));
+ m_cart->set_must_be_loaded(true);
+
+ SOFTWARE_LIST(config, "icanpian_cart").set_original("icanpian");
+}
+
+
void spg2xx_game_state::wireless60(machine_config &config)
{
SPG24X(config, m_spg, XTAL(27'000'000), m_maincpu, m_screen);
@@ -636,15 +1786,161 @@ void spg2xx_game_state::jakks(machine_config &config)
spg2xx_base(config);
m_spg->porta_in().set(FUNC(spg2xx_game_state::jakks_porta_r));
+ m_spg->porta_out().set(FUNC(spg2xx_game_state::jakks_porta_w));
+ m_spg->portb_out().set(FUNC(spg2xx_game_state::jakks_portb_w));
+}
+void spg2xx_game_state::jakks_i2c(machine_config &config)
+{
+ jakks(config);
I2CMEM(config, m_i2cmem, 0).set_data_size(0x200);
}
-void spg2xx_game_state::walle(machine_config &config)
+void jakks_gkr_state::machine_start()
+{
+ spg2xx_game_state::machine_start();
+
+ // if there's a cart, override the standard banking
+ if (m_cart && m_cart->exists())
+ {
+ std::string region_tag;
+ m_cart_region = memregion(region_tag.assign(m_cart->tag()).append(JAKKSSLOT_ROM_REGION_TAG).c_str());
+ m_bank->configure_entries(0, (m_cart_region->bytes() + 0x7fffff) / 0x800000, m_cart_region->base(), 0x800000);
+ m_bank->set_entry(0);
+ }
+}
+
+DEVICE_IMAGE_LOAD_MEMBER(jakks_gkr_state, gamekey_cart)
+{
+ return m_cart->call_load();
+}
+
+void jakks_gkr_state::jakks_gkr(machine_config &config)
{
jakks(config);
- m_spg->portc_in().set(FUNC(spg2xx_game_state::walle_portc_r));
+ m_spg->porta_in().set(FUNC(jakks_gkr_state::jakks_porta_key_io_r));
+ m_spg->porta_out().set(FUNC(jakks_gkr_state::jakks_porta_key_io_w));
+ m_spg->portc_in().set_ioport("P3");
+ m_spg->portc_out().set(FUNC(jakks_gkr_state::gkr_portc_w));
+
+ m_spg->set_rowscroll_offset(0);
+
+ JAKKS_GAMEKEY_SLOT(config, m_cart, 0, jakks_gamekey, nullptr);
+}
+
+void jakks_gkr_state::jakks_gkr_i2c(machine_config &config)
+{
+ jakks_gkr(config);
+ I2CMEM(config, m_i2cmem, 0).set_data_size(0x200);
+}
+
+
+void jakks_gkr_state::jakks_gkr_1m_i2c(machine_config &config)
+{
+ jakks_gkr_i2c(config);
+ m_maincpu->set_addrmap(AS_PROGRAM, &jakks_gkr_state::mem_map_1m);
+}
+
+void jakks_gkr_state::jakks_gkr_2m_i2c(machine_config &config)
+{
+ jakks_gkr_i2c(config);
+ m_maincpu->set_addrmap(AS_PROGRAM, &jakks_gkr_state::mem_map_2m);
+}
+
+void jakks_gkr_state::jakks_gkr_nk(machine_config &config)
+{
+ jakks_gkr(config);
+ m_maincpu->set_addrmap(AS_PROGRAM, &jakks_gkr_state::mem_map_1m);
+ SOFTWARE_LIST(config, "jakks_gamekey_nk").set_original("jakks_gamekey_nk");
+}
+
+void jakks_gkr_state::jakks_gkr_nk_i2c(machine_config &config)
+{
+ jakks_gkr_i2c(config);
+ m_maincpu->set_addrmap(AS_PROGRAM, &jakks_gkr_state::mem_map_1m);
+ SOFTWARE_LIST(config, "jakks_gamekey_nk").set_original("jakks_gamekey_nk");
+}
+
+void jakks_gkr_state::jakks_gkr_dy(machine_config &config)
+{
+ jakks_gkr(config);
+ m_maincpu->set_addrmap(AS_PROGRAM, &jakks_gkr_state::mem_map_1m);
+ SOFTWARE_LIST(config, "jakks_gamekey_dy").set_original("jakks_gamekey_dy");
+}
+
+void jakks_gkr_state::jakks_gkr_dy_i2c(machine_config &config)
+{
+ jakks_gkr_i2c(config);
+ m_maincpu->set_addrmap(AS_PROGRAM, &jakks_gkr_state::mem_map_1m);
+ SOFTWARE_LIST(config, "jakks_gamekey_dy").set_original("jakks_gamekey_dy");
+}
+
+void jakks_gkr_state::jakks_gkr_mv_i2c(machine_config &config)
+{
+ jakks_gkr_i2c(config);
+ m_maincpu->set_addrmap(AS_PROGRAM, &jakks_gkr_state::mem_map_1m);
+ SOFTWARE_LIST(config, "jakks_gamekey_mv").set_original("jakks_gamekey_mv");
+}
+
+
+void jakks_gkr_state::jakks_gkr_dp_i2c(machine_config &config)
+{
+ jakks_gkr_i2c(config);
+ m_maincpu->set_addrmap(AS_PROGRAM, &jakks_gkr_state::mem_map_1m);
+ SOFTWARE_LIST(config, "jakks_gamekey_dp").set_original("jakks_gamekey_dp");
+}
+
+void jakks_gkr_state::jakks_gkr_sw_i2c(machine_config &config)
+{
+ jakks_gkr_i2c(config);
+ m_maincpu->set_addrmap(AS_PROGRAM, &jakks_gkr_state::mem_map_1m);
+ m_spg->adc_in<0>().set_ioport("JOYX");
+ m_spg->adc_in<1>().set_ioport("JOYY");
+ SOFTWARE_LIST(config, "jakks_gamekey_sw").set_original("jakks_gamekey_sw");
+}
+
+void jakks_gkr_state::jakks_gkr_wp(machine_config &config)
+{
+ jakks_gkr(config);
+ m_maincpu->set_addrmap(AS_PROGRAM, &jakks_gkr_state::mem_map_1m);
+ m_spg->adc_in<0>().set_ioport("JOYX");
+ m_spg->adc_in<1>().set_ioport("JOYY");
+ //SOFTWARE_LIST(config, "jakks_gamekey_wp").set_original("jakks_gamekey_wp"); // NO KEYS RELEASED
+}
+
+void jakks_gkr_state::jakks_gkr_nm_i2c(machine_config &config)
+{
+ jakks_gkr_i2c(config);
+ m_maincpu->set_addrmap(AS_PROGRAM, &jakks_gkr_state::mem_map_1m);
+ m_spg->adc_in<0>().set_ioport("DIALX");
+ SOFTWARE_LIST(config, "jakks_gamekey_nm").set_original("jakks_gamekey_nm");
+}
+
+void jakks_gkr_state::jakks_gkr_wf_i2c(machine_config &config)
+{
+ jakks_gkr_i2c(config);
+ m_maincpu->set_addrmap(AS_PROGRAM, &jakks_gkr_state::mem_map_1m);
+ //m_spg->adc_in<0>().set_ioport("DIALX"); // wheel does not seem to map here
+ //m_spg->adc_in<1>().set_ioport("DIALY");
+ //SOFTWARE_LIST(config, "jakks_gamekey_wf").set_original("jakks_gamekey_wf"); // no game keys were released
+}
+
+
+void spg2xx_game_state::lexizeus(machine_config &config)
+{
+ non_spg_base(config);
+ m_maincpu->set_addrmap(AS_PROGRAM, &spg2xx_game_state::mem_map_4m);
+ m_spg->porta_in().set_ioport("P1");
+ m_spg->portb_in().set_ioport("P2");
+ m_spg->portc_in().set_ioport("P3");
+}
+
+void spg2xx_game_state::walle(machine_config &config)
+{
+ jakks_i2c(config);
+ m_maincpu->set_addrmap(AS_PROGRAM, &spg2xx_game_state::mem_map_2m);
+ m_spg->portc_in().set_ioport("P3");
m_spg->portc_out().set(FUNC(spg2xx_game_state::walle_portc_w));
}
@@ -662,12 +1958,37 @@ void spg2xx_game_state::rad_skat(machine_config &config)
NVRAM(config, m_nvram, nvram_device::DEFAULT_ALL_1);
}
+void dreamlif_state::dreamlif(machine_config &config)
+{
+ SPG24X(config, m_spg, XTAL(27'000'000), m_maincpu, m_screen);
+ spg2xx_base(config);
+
+ m_spg->porta_in().set_ioport("P1");
+ m_spg->portb_in().set(FUNC(dreamlif_state::portb_r));
+ m_spg->portb_out().set(FUNC(dreamlif_state::portb_w));
+
+}
+
void spg2xx_game_state::rad_skatp(machine_config &config)
{
rad_skat(config);
m_spg->set_pal(true);
}
+void spg2xx_game_state::rad_sktv(machine_config &config)
+{
+ SPG24X(config, m_spg, XTAL(27'000'000), m_maincpu, m_screen);
+ spg2xx_base(config);
+
+ m_spg->porta_in().set(FUNC(spg2xx_game_state::rad_porta_r));
+ m_spg->portb_in().set(FUNC(spg2xx_game_state::rad_portb_r));
+ m_spg->portc_in().set(FUNC(spg2xx_game_state::rad_portc_r));
+ m_spg->eeprom_w().set(FUNC(spg2xx_game_state::eeprom_w));
+ m_spg->eeprom_r().set(FUNC(spg2xx_game_state::eeprom_r));
+
+ NVRAM(config, m_nvram, nvram_device::DEFAULT_ALL_1);
+}
+
void spg2xx_game_state::rad_crik(machine_config &config)
{
SPG28X(config, m_spg, XTAL(27'000'000), m_maincpu, m_screen);
@@ -682,65 +2003,143 @@ void spg2xx_game_state::rad_crik(machine_config &config)
NVRAM(config, m_nvram, nvram_device::DEFAULT_ALL_1);
}
-READ16_MEMBER(spg2xx_game_state::rad_crik_hack_r)
-{
- int pc = m_maincpu->state_int(UNSP_PC);
- if (pc == 0xf851)
- return 0xf859;
- else
- return 0xf854;
-}
-
-void spg2xx_game_state::init_rad_crik()
-{
- // not 100% sure what this is waiting on, could be eeprom as it seems to end up here frequently during the eeprom test, patch running code, not ROM, so that checksum can still pass
- m_maincpu->space(AS_PROGRAM).install_read_handler(0xf851, 0xf851, read16_delegate(FUNC(spg2xx_game_state::rad_crik_hack_r),this));
-}
-
ROM_START( vii )
- ROM_REGION( 0x2000000, "maincpu", ROMREGION_ERASEFF )
+ ROM_REGION( 0x2000000, "maincpu", ROMREGION_ERASE00 )
ROM_LOAD16_WORD_SWAP( "vii.bin", 0x0000, 0x2000000, CRC(04627639) SHA1(f883a92d31b53c9a5b0cdb112d07cd793c95fc43))
ROM_END
-ROM_START( batmantv )
- ROM_REGION( 0x800000, "maincpu", ROMREGION_ERASEFF )
+ROM_START( jak_batm )
+ ROM_REGION( 0x800000, "maincpu", ROMREGION_ERASE00 )
ROM_LOAD16_WORD_SWAP( "batman.bin", 0x000000, 0x400000, CRC(46f848e5) SHA1(5875d57bb3fe0cac5d20e626e4f82a0e5f9bb94c) )
ROM_END
-ROM_START( walle )
- ROM_REGION( 0x800000, "maincpu", ROMREGION_ERASEFF )
+ROM_START( jak_wall )
+ ROM_REGION( 0x800000, "maincpu", ROMREGION_ERASE00 )
ROM_LOAD16_WORD_SWAP( "walle.bin", 0x000000, 0x400000, BAD_DUMP CRC(bd554cba) SHA1(6cd06a036ab12e7b0e1fd8003db873b0bb783868) )
- // Alternate dump, we need to decide which one is correct.
- //ROM_LOAD16_WORD_SWAP( "walle.bin", 0x000000, 0x400000, CRC(6bc90b16) SHA1(184d72de059057aae7800da510fcf05ed1da9ec9))
+ // both of these dumps are bad, but in slightly different ways, note the random green pixels around the text (bad data is reported in secret test mode)
+ //ROM_LOAD16_WORD_SWAP( "walle.bin", 0x000000, 0x400000, BAD_DUMP CRC(6bc90b16) SHA1(184d72de059057aae7800da510fcf05ed1da9ec9))
+ROM_END
+
+ROM_START( jak_wwe )
+ ROM_REGION( 0x800000, "maincpu", ROMREGION_ERASE00 )
+ ROM_LOAD16_WORD_SWAP( "jakkswwegkr.bin", 0x000000, 0x200000, CRC(b078a812) SHA1(7d97c0e2171b3fd91b280480c9ffd5651828195a) )
+ROM_END
+
+ROM_START( jak_fan4 )
+ ROM_REGION( 0x800000, "maincpu", ROMREGION_ERASE00 )
+ ROM_LOAD16_WORD_SWAP( "jakksffgkr.bin", 0x000000, 0x200000, CRC(8755a1f7) SHA1(7214da15fe61881da27b81575fbdb54cc0f1d6aa) )
+ROM_END
+
+ROM_START( jak_just )
+ ROM_REGION( 0x800000, "maincpu", ROMREGION_ERASE00 )
+ ROM_LOAD16_WORD_SWAP( "jakksjlagkr.bin", 0x000000, 0x200000, CRC(182989f0) SHA1(799229c537d6fe629ba9e1e4051d1bb9ca445d44) )
+ROM_END
+
+ROM_START( jak_dora )
+ ROM_REGION( 0x800000, "maincpu", ROMREGION_ERASE00 )
+ ROM_LOAD16_WORD_SWAP( "jakksdoragkr.bin", 0x000000, 0x200000, CRC(bcaa132d) SHA1(3894b980fbc4144731b2a7a94acebb29e30de67c) )
+ROM_END
+
+ROM_START( jak_nick )
+ ROM_REGION( 0x800000, "maincpu", ROMREGION_ERASE00 )
+ ROM_LOAD16_WORD_SWAP( "jakksnicktoonsgkr.bin", 0x000000, 0x200000, CRC(4dec1656) SHA1(b3002ab15e75068102f4955a3f0c52fb6d5cda56) )
+ROM_END
+
+ROM_START( jak_sbfc )
+ ROM_REGION( 0x800000, "maincpu", ROMREGION_ERASE00 )
+ ROM_LOAD16_WORD_SWAP( "jakksspongebobgkr.bin", 0x000000, 0x200000, CRC(9871303c) SHA1(78bc2687e1514094db8bb875e1117df3fcb3d201) )
+ROM_END
+
+ROM_START( jak_dorr )
+ ROM_REGION( 0x800000, "maincpu", ROMREGION_ERASE00 )
+ ROM_LOAD16_WORD_SWAP( "jakksdora2gkr.bin", 0x000000, 0x200000, CRC(6c09bcd9) SHA1(4bcad79658832f319d16b4f63257e127f6862d79) )
+ROM_END
+
+
+ROM_START( jak_spdm )
+ ROM_REGION( 0x800000, "maincpu", ROMREGION_ERASE00 )
+ ROM_LOAD16_WORD_SWAP( "jakksspidermangkr.bin", 0x000000, 0x200000, CRC(1b2ee700) SHA1(30ea69c489e1238b004f473f972b682e35573138) )
+ROM_END
+
+ROM_START( jak_pooh )
+ ROM_REGION( 0x800000, "maincpu", ROMREGION_ERASE00 )
+ ROM_LOAD16_WORD_SWAP( "jakkspoohgkr.bin", 0x000000, 0x200000, CRC(0d97df55) SHA1(f108621a83c7b2263dd1531d82311627c3a02002) )
+ROM_END
+
+
+ROM_START( jak_wof )
+ ROM_REGION( 0x800000, "maincpu", ROMREGION_ERASE00 )
+ ROM_LOAD16_WORD_SWAP( "jakkswheeloffortunegkr.bin", 0x000000, 0x200000, CRC(6a879620) SHA1(95478764a61741569041c2299528f6464651d593) )
+ROM_END
+
+ROM_START( jak_disn )
+ ROM_REGION( 0x800000, "maincpu", ROMREGION_ERASE00 )
+ ROM_LOAD16_WORD_SWAP( "disneygkr.bin", 0x000000, 0x100000, CRC(7a5ebcd7) SHA1(9add8c2a6e3f0409c8957a2ba2d054fd2c4c39c1) )
+ROM_END
+
+ROM_START( jak_disf )
+ ROM_REGION( 0x800000, "maincpu", ROMREGION_ERASE00 )
+ ROM_LOAD16_WORD_SWAP( "disneyfriendsgkr.bin", 0x000000, 0x200000, CRC(77bca50b) SHA1(6e0f4fd229ee11eac721b5dbe79cf9002d3dbd64) )
+ROM_END
+
+ROM_START( jak_disp )
+ ROM_REGION( 0x800000, "maincpu", ROMREGION_ERASE00 )
+ ROM_LOAD16_WORD_SWAP( "jakksdisneyprincessgkr.bin", 0x000000, 0x200000, CRC(e26003ce) SHA1(ee15243281df6f09b96185c34582d7091604c954) )
+ROM_END
+
+ROM_START( jak_mpac )
+ ROM_REGION( 0x800000, "maincpu", ROMREGION_ERASE00 )
+ ROM_LOAD16_WORD_SWAP( "jakksmspacmangkr.bin", 0x000000, 0x100000, CRC(cab40f77) SHA1(30731acc461150d96aafa7a0451cfb1a25264678) )
+ROM_END
+
+ROM_START( jak_sdoo )
+ ROM_REGION( 0x800000, "maincpu", ROMREGION_ERASE00 )
+ ROM_LOAD16_WORD_SWAP( "jakksscoobydoogkr.bin", 0x000000, 0x400000, CRC(61062ce5) SHA1(9d21767fd855385ef83e4209c429ecd4bf7e5384) )
+ROM_END
+
+ROM_START( jak_dbz )
+ ROM_REGION( 0x800000, "maincpu", ROMREGION_ERASE00 )
+ ROM_LOAD16_WORD_SWAP( "jakksdragonballzgkr.bin", 0x000000, 0x200000, CRC(d52c3b20) SHA1(fd5ce41c143cad9bca3372054f4ff98b52c33874) )
+ROM_END
+
+ROM_START( jak_sith )
+ ROM_REGION( 0x800000, "maincpu", ROMREGION_ERASE00 )
+ ROM_LOAD16_WORD_SWAP( "jakksstarwarsgkr.bin", 0x000000, 0x200000, CRC(932cde19) SHA1(b88b748c235e9eeeda574e4d5b4077ae9da6fbd0) )
+ROM_END
+
+
+ROM_START( lexizeus )
+ ROM_REGION( 0x800000, "maincpu", ROMREGION_ERASE00 )
+ ROM_LOAD16_WORD_SWAP( "lexibook1g900us.bin", 0x0000, 0x800000, CRC(c2370806) SHA1(cbb599c29c09b62b6a9951c724cd9fc496309cf9))
ROM_END
ROM_START( zone40 )
- ROM_REGION( 0x4000000, "maincpu", ROMREGION_ERASEFF )
+ ROM_REGION( 0x4000000, "maincpu", ROMREGION_ERASE00 )
ROM_LOAD16_WORD_SWAP( "zone40.bin", 0x0000, 0x4000000, CRC(4ba1444f) SHA1(de83046ab93421486668a247972ad6d3cda19440) )
ROM_END
ROM_START( zone60 )
- ROM_REGION( 0x4000000, "maincpu", ROMREGION_ERASEFF )
+ ROM_REGION( 0x4000000, "maincpu", ROMREGION_ERASE00 )
ROM_LOAD16_WORD_SWAP( "zone60.bin", 0x0000, 0x4000000, CRC(4cb637d1) SHA1(1f97cbdb4299ac0fbafc2a3aa592066cb0727066))
ROM_END
ROM_START( wirels60 )
- ROM_REGION( 0x4000000, "maincpu", ROMREGION_ERASEFF )
+ ROM_REGION( 0x4000000, "maincpu", ROMREGION_ERASE00 )
ROM_LOAD16_WORD_SWAP( "wirels60.bin", 0x0000, 0x4000000, CRC(b4df8b28) SHA1(00e3da542e4bc14baf4724ad436f66d4c0f65c84))
ROM_END
ROM_START( rad_skat )
- ROM_REGION( 0x800000, "maincpu", ROMREGION_ERASEFF )
+ ROM_REGION( 0x800000, "maincpu", ROMREGION_ERASE00 )
ROM_LOAD16_WORD_SWAP( "skateboarder.bin", 0x000000, 0x400000, CRC(08b9ab91) SHA1(6665edc4740804956136c68065890925a144626b) )
ROM_END
ROM_START( rad_skatp ) // rom was dumped from the NTSC version, but region comes from an io port, so ROM is probably the same
- ROM_REGION( 0x800000, "maincpu", ROMREGION_ERASEFF )
+ ROM_REGION( 0x800000, "maincpu", ROMREGION_ERASE00 )
ROM_LOAD16_WORD_SWAP( "skateboarder.bin", 0x000000, 0x400000, CRC(08b9ab91) SHA1(6665edc4740804956136c68065890925a144626b) )
ROM_END
ROM_START( rad_sktv )
- ROM_REGION( 0x800000, "maincpu", ROMREGION_ERASEFF )
+ ROM_REGION( 0x800000, "maincpu", ROMREGION_ERASE00 )
ROM_LOAD16_WORD_SWAP( "skannerztv.bin", 0x000000, 0x200000, CRC(e92278e3) SHA1(eb6bee5e661128d83784960dfff50379c36bfaeb) )
/* The external scanner MCU is a Winbond from 2000: SA5641
@@ -750,11 +2149,44 @@ ROM_START( rad_sktv )
TODO: find details on MCU so that we know capacity etc. */
ROM_END
+ROM_START( rad_fb2 )
+ ROM_REGION( 0x800000, "maincpu", ROMREGION_ERASE00 )
+ ROM_LOAD16_WORD_SWAP( "football2.bin", 0x000000, 0x400000, CRC(96b4f0d2) SHA1(e91f2ac679fb0c026ffe216eb4ab58802f361a17) )
+ROM_END
+
ROM_START( rad_crik ) // only released in EU?
- ROM_REGION( 0x800000, "maincpu", ROMREGION_ERASEFF )
+ ROM_REGION( 0x800000, "maincpu", ROMREGION_ERASE00 )
ROM_LOAD16_WORD_SWAP( "cricket.bin", 0x000000, 0x200000, CRC(6fa0aaa9) SHA1(210d2d4f542181f59127ce2f516d0408dc6de7a8) )
ROM_END
+
+ROM_START( mattelcs )
+ ROM_REGION( 0x800000, "maincpu", ROMREGION_ERASE00 )
+ ROM_LOAD16_WORD_SWAP( "mattelclassicsports.bin", 0x000000, 0x100000, CRC(e633e7ad) SHA1(bf3e325a930cf645a7e32195939f3c79c6d35dac) )
+ROM_END
+
+ROM_START( dreamlif )
+ ROM_REGION( 0x800000, "maincpu", ROMREGION_ERASE00 )
+ ROM_LOAD16_WORD_SWAP( "dreamlife.bin", 0x000000, 0x800000, CRC(632e0237) SHA1(a8586e8a626d75cf7782f13cfd9f1b938af23d56) )
+ROM_END
+
+ROM_START( smartfp )
+ ROM_REGION( 0x800000, "maincpu", ROMREGION_ERASE00 )
+ ROM_LOAD16_WORD_SWAP( "smartfitpark.bin", 0x000000, 0x800000, CRC(ada84507) SHA1(a3a80bf71fae62ebcbf939166a51d29c24504428) )
+ROM_END
+
+
+
+ROM_START( icanguit )
+ ROM_REGION( 0x800000, "maincpu", ROMREGION_ERASE00 )
+ // no internal ROM, requires a cartridge
+ROM_END
+
+ROM_START( icanpian )
+ ROM_REGION( 0x800000, "maincpu", ROMREGION_ERASE00 )
+ // no internal ROM, requires a cartridge
+ROM_END
+
/*
Wireless Air 60
(info provided with dump)
@@ -779,7 +2211,7 @@ http://www.lcis.com.tw/paper_store/paper_store/GPL162004A-507A_162005A-707AV10_c
*/
ROM_START( wlsair60 )
- ROM_REGION( 0x8400000, "maincpu", ROMREGION_ERASEFF )
+ ROM_REGION( 0x8400000, "maincpu", ROMREGION_ERASE00 )
ROM_LOAD16_WORD_SWAP( "wlsair60.nand", 0x0000, 0x8400000, CRC(eec23b97) SHA1(1bb88290cf54579a5bb51c08a02d793cd4d79f7a) )
ROM_END
@@ -860,10 +2292,67 @@ which is also found in the Wireless Air 60 ROM.
*/
ROM_START( wrlshunt )
- ROM_REGION( 0x8000000, "maincpu", ROMREGION_ERASEFF )
+ ROM_REGION( 0x8000000, "maincpu", ROMREGION_ERASE00 )
ROM_LOAD16_WORD_SWAP( "wireless.bin", 0x0000, 0x8000000, CRC(a6ecc20e) SHA1(3645f23ba2bb218e92d4560a8ae29dddbaabf796) )
ROM_END
+
+void spg2xx_game_state::init_crc()
+{
+ // several games have a byte sum checksum listed at the start of ROM, this little helper function logs what it should match.
+ const int length = memregion("maincpu")->bytes();
+ const uint8_t* rom = memregion("maincpu")->base();
+
+ uint32_t checksum = 0x00000000;
+ // the first 0x10 bytes are where the "chksum:xxxxxxxx " string is listed, so skip over them
+ for (int i = 0x10; i < length; i++)
+ {
+ checksum += rom[i];
+ }
+
+ logerror("Calculated Byte Sum of bytes from 0x10 to 0x%08x is %08x)\n", length - 1, checksum);
+}
+
+void spg2xx_game_state::init_zeus()
+{
+ uint16_t *ROM = (uint16_t*)memregion("maincpu")->base();
+ int size = memregion("maincpu")->bytes();
+
+ for (int i = 0x8000 / 2; i < size / 2; i++)
+ {
+ // global 16-bit xor
+ ROM[i] = ROM[i] ^ 0x8a1d;
+
+ // 4 single bit conditional xors
+ if (ROM[i] & 0x0020)
+ ROM[i] ^= 0x0100;
+
+ if (ROM[i] & 0x0040)
+ ROM[i] ^= 0x1000;
+
+ if (ROM[i] & 0x4000)
+ ROM[i] ^= 0x0001;
+
+ if (ROM[i] & 0x0080)
+ ROM[i] ^= 0x0004;
+
+ // global 16-bit bitswap
+ ROM[i] = bitswap<16>(ROM[i], 7, 12, 9, 14, 4, 6, 0, 10, 15, 1, 3, 2, 5, 13, 8, 11);
+ }
+}
+
+void spg2xx_game_state::init_zone40()
+{
+ uint16_t *ROM = (uint16_t*)memregion("maincpu")->base();
+ int size = memregion("maincpu")->bytes();
+
+ for (int i = 0; i < size/2; i++)
+ {
+ ROM[i] = ROM[i] ^ 0xbb88;
+ }
+ //there is also bitswapping as above, and some kind of address scramble as the vectors are not exactly where expected
+}
+
// year, name, parent, compat, machine, input, class, init, company, fullname, flags
// Jungle Soft TV games
@@ -872,18 +2361,69 @@ CONS( 2010, zone60, 0, 0, wireless60, wirels60, spg2xx_game_state, empty_init,
CONS( 2010, wirels60, 0, 0, wireless60, wirels60, spg2xx_game_state, empty_init, "Jungle Soft / Kids Station Toys Inc", "Wireless 60", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS )
// JAKKS Pacific Inc TV games
-CONS( 2004, batmantv, 0, 0, jakks, batman, spg2xx_game_state, empty_init, "JAKKS Pacific Inc / HotGen Ltd", "The Batman", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS )
-CONS( 2008, walle, 0, 0, walle, walle, spg2xx_game_state, empty_init, "JAKKS Pacific Inc", "Wall-E", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS )
+CONS( 2004, jak_batm, 0, 0, jakks, batman, spg2xx_game_state, empty_init, "JAKKS Pacific Inc / HotGen Ltd", "The Batman (JAKKS Pacific TV Game)", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS )
+CONS( 2008, jak_wall, 0, 0, walle, walle, spg2xx_game_state, empty_init, "JAKKS Pacific Inc / HotGen Ltd", "Wall-E (JAKKS Pacific TV Game)", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS )
+
+// 'Game-Key Ready' JAKKS games (these can also take per-game specific expansion cartridges, although not all games had them released)
+// Some of these were available in versions without Game-Key ports, it is unconfirmed if code was the same unless otherwise stated
+// For units released AFTER the GameKey promotion was cancelled it appears the code is the same as the PCB inside is the same, just the external port closed off, earlier units might be different hardware in some cases.
+// units released BEFORE the GameKey support were sometimes different hardware, eg. the Spider-Man and Disney units were SPG110 based
+CONS( 2005, jak_wwe, 0, 0, jakks_gkr_1m_i2c, jak_gkr_i2c, jakks_gkr_state, empty_init, "JAKKS Pacific Inc / HotGen Ltd", "WWE (JAKKS Pacific TV Game, Game-Key Ready)", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS ) // WW (no game-keys released)
+CONS( 2005, jak_fan4, 0, 0, jakks_gkr_1m_i2c, jak_gkr_i2c, jakks_gkr_state, empty_init, "JAKKS Pacific Inc / Digital Eclipse", "Fantastic Four (JAKKS Pacific TV Game, Game-Key Ready)", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS ) // F4 (no game-keys released)
+CONS( 2005, jak_just, 0, 0, jakks_gkr_1m_i2c, jak_gkr_i2c, jakks_gkr_state, empty_init, "JAKKS Pacific Inc / Taniko", "Justice League (JAKKS Pacific TV Game, Game-Key Ready)", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS ) // DC (no game-keys released)
+CONS( 2005, jak_dora, 0, 0, jakks_gkr_nk, jak_gkr, jakks_gkr_state, empty_init, "JAKKS Pacific Inc / Handheld Games", "Dora the Explorer - Nursery Rhyme Adventure (JAKKS Pacific TV Game, Game-Key Ready)", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS ) // uses NK keys (same as Nicktoons & Spongebob) (3 released) - The upper part of this one is pink/purple.
+CONS( 2005, jak_dorr, 0, 0, jakks_gkr_nk_i2c, jak_gkr_i2c, jakks_gkr_state, empty_init, "JAKKS Pacific Inc / Handheld Games", "Dora the Explorer - Race to Play Park (JAKKS Pacific TV Game, Game-Key Ready)", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS ) // uses NK keys (same as Nicktoons & Spongebob) (3 released) - The upper part of this one is blue
+CONS( 2004, jak_nick, 0, 0, jakks_gkr_nk_i2c, jak_gkr_i2c, jakks_gkr_state, empty_init, "JAKKS Pacific Inc / Handheld Games", "Nicktoons (JAKKS Pacific TV Game, Game-Key Ready)", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS ) // uses NK keys
+CONS( 2005, jak_sbfc, 0, 0, jakks_gkr_nk_i2c, jak_gkr_i2c, jakks_gkr_state, empty_init, "JAKKS Pacific Inc / HotGen Ltd", "SpongeBob SquarePants - The Fry Cook Games (JAKKS Pacific TV Game, Game-Key Ready) (AUG 18 2005 21:31:56)", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS ) // uses NK keys
+CONS( 2005, jak_sdoo, 0, 0, jakks_gkr_2m_i2c, jak_sdoo_i2c, jakks_gkr_state, empty_init, "JAKKS Pacific Inc / Jolliford Management", "Scooby-Doo! and the Mystery of the Castle (JAKKS Pacific TV Game, Game-Key Ready)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS ) // SD (no game-keys released) (was dumped from a later unit with GameKey port missing, but internal PCB still supported it, code likely the same)
+CONS( 2005, jak_disn, 0, 0, jakks_gkr_dy, jak_gkr, jakks_gkr_state, empty_init, "JAKKS Pacific Inc / HotGen Ltd", "Disney (JAKKS Pacific TV Game, Game-Key Ready) (08 FEB 2005 A)", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS ) // uses DY keys (3 released)
+CONS( 2005, jak_disf, 0, 0, jakks_gkr_dy_i2c, jak_gkr_i2c, jakks_gkr_state, empty_init, "JAKKS Pacific Inc / HotGen Ltd", "Disney Friends (JAKKS Pacific TV Game, Game-Key Ready) (17 MAY 2005 A)", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS ) // uses DY keys (3 released)
+CONS( 2005, jak_disp, 0, 0, jakks_gkr_dp_i2c, jak_disp_i2c, jakks_gkr_state, empty_init, "JAKKS Pacific Inc / 5000ft, Inc", "Disney Princess (JAKKS Pacific TV Game, Game-Key Ready)", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS ) // uses DP keys (1 key released)
+// There seems to be a second game called 'Disney Princesses' with a 'board game' style front end as well as the minigames, also GKR, see https://www.youtube.com/watch?v=w9p5TI029bQ The one we have is https://www.youtube.com/watch?v=9ppPKVbpoMs the physical package seems identical.
+CONS( 2005, jak_sith, 0, 0, jakks_gkr_sw_i2c, jak_sith_i2c, jakks_gkr_state, empty_init, "JAKKS Pacific Inc / Griptonite Games", "Star Wars - Revenge of the Sith (JAKKS Pacific TV Game, Game-Key Ready)", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS ) // uses SW keys (1 released)
+CONS( 2005, jak_dbz, 0, 0, jakks_gkr_1m_i2c, jak_gkr_i2c, jakks_gkr_state, empty_init, "JAKKS Pacific Inc / Handheld Games", "Dragon Ball Z (JAKKS Pacific TV Game, Game-Key Ready)", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS ) // DB (no game-keys released, 1 in development but cancelled)
+CONS( 2005, jak_mpac, 0, 0, jakks_gkr_nm_i2c, jak_nm_i2c, jakks_gkr_state, empty_init, "JAKKS Pacific Inc / Namco / HotGen Ltd", "Ms. Pac-Man 5-in-1 (Ms. Pac-Man, Pole Position, Galaga, Xevious, Mappy) (JAKKS Pacific TV Game, Game-Key Ready) (07 FEB 2005 A SKU F)", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS ) // uses NM (3 keys available [Dig Dug, New Rally-X], [Rally-X, Pac-Man, Bosconian], [Pac-Man, Bosconian])
+CONS( 2005, jak_wof, 0, 0, jakks_gkr_wf_i2c, jak_wf_i2c, jakks_gkr_state, empty_init, "JAKKS Pacific Inc / HotGen Ltd", "Wheel of Fortune (JAKKS Pacific TV Game, Game-Key Ready) (Jul 11 2005 ORIG)", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS ) // uses WF keys (no game-keys released) analog wheel not emulated
+// There is a 'Second Edition' version of Wheel of Fortune with a Gold case, GameKey port removed, and a '2' over the usual Game Key Ready logo, internals are different too, not Game-Key Ready
+CONS( 2004, jak_spdm, 0, 0, jakks_gkr_mv_i2c, jak_gkr_i2c, jakks_gkr_state, empty_init, "JAKKS Pacific Inc / Digital Eclipse", "Spider-Man (JAKKS Pacific TV Game, Game-Key Ready)", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS ) // MV (1 key available)
+CONS( 2005, jak_pooh, 0, 0, jakks_gkr_wp, jak_pooh, jakks_gkr_state, empty_init, "JAKKS Pacific Inc / Backbone Entertainment", "Winnie the Pooh - Piglet's Special Day (JAKKS Pacific TV Game, Game-Key Ready)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS ) // WP (no game-keys released)
+
+// no keys released for the following, some were in development but cancelled
+// Capcom 3-in-1 CC (no game-keys released)
+// Care Bears CB (no game-keys released)
+
+// Some versions of the Shrek - Over the Hedge unit show the GameKey logo on startup (others don't) there is no evidence to suggest it was ever released with a GameKey port tho, and the internal PCB has no place for one on the versions we've seen (which show the logo)
// Radica TV games
-CONS( 2006, rad_skat, 0, 0, rad_skat, rad_skat, spg2xx_game_state, empty_init, "Radica", "Play TV Skateboarder (NTSC)", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS )
-CONS( 2006, rad_skatp, rad_skat, 0, rad_skatp, rad_skatp, spg2xx_game_state, empty_init, "Radica", "Connectv Skateboarder (PAL)", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS )
-CONS( 2006, rad_crik, 0, 0, rad_crik, rad_crik, spg2xx_game_state, empty_init, "Radica", "Connectv Cricket (PAL)", MACHINE_IMPERFECT_SOUND | MACHINE_NOT_WORKING ) // Version 3.00 20/03/06 is listed in INTERNAL TEST
-CONS( 2007, rad_sktv, 0, 0, rad_skat, rad_sktv, spg2xx_game_state, empty_init, "Radica", "Skannerz TV", MACHINE_IMPERFECT_SOUND | MACHINE_NOT_WORKING )
+CONS( 2006, rad_skat, 0, 0, rad_skat, rad_skat, spg2xx_game_state, init_crc, "Radica", "Play TV Skateboarder (NTSC)", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS )
+CONS( 2006, rad_skatp, rad_skat, 0, rad_skatp,rad_skatp, spg2xx_game_state, init_crc, "Radica", "Connectv Skateboarder (PAL)", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS )
+CONS( 2006, rad_crik, 0, 0, rad_crik, rad_crik, spg2xx_game_state, init_crc, "Radica", "Connectv Cricket (PAL)", MACHINE_IMPERFECT_SOUND | MACHINE_NOT_WORKING ) // Version 3.00 20/03/06 is listed in INTERNAL TEST
+CONS( 2007, rad_sktv, 0, 0, rad_sktv, rad_sktv, spg2xx_game_state, init_crc, "Radica", "Skannerz TV", MACHINE_IMPERFECT_SOUND | MACHINE_NOT_WORKING )
+CONS( 2007, rad_fb2, 0, 0, rad_skat, rad_fb2, spg2xx_game_state, init_crc, "Radica", "Play TV Football 2", MACHINE_IMPERFECT_SOUND | MACHINE_NOT_WORKING )
+
+// Mattel games
+CONS( 2005, mattelcs, 0, 0, rad_skat, mattelcs, spg2xx_game_state, empty_init, "Mattel", "Mattel Classic Sports", MACHINE_IMPERFECT_SOUND )
+
+// Hasbro games
+CONS( 2005, dreamlif, 0, 0, dreamlif, dreamlif, dreamlif_state, empty_init, "Hasbro", "Dream Life (Version 1.0, Feb 07 2005)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND )
+
+// Fisher-Price games
+CONS( 2007, icanguit, 0, 0, icanguit, icanguit, icanguit_state, empty_init, "Fisher-Price", "I Can Play Guitar", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND )
+CONS( 2006, icanpian, 0, 0, icanpian, icanpian, icanguit_state, empty_init, "Fisher-Price", "I Can Play Piano", MACHINE_IMPERFECT_SOUND ) // 2006 date from Manual
// might not fit here. First 0x8000 bytes are blank (not too uncommon for these) then rest of rom looks like it's probably encrypted at least
-CONS( 2009, zone40, 0, 0, non_spg_base, wirels60, spg2xx_game_state, empty_init, "Jungle Soft / Ultimate Products (HK) Ltd", "Zone 40", MACHINE_NO_SOUND | MACHINE_NOT_WORKING )
+// could be later model VT based instead? even after decrypting (simple word xor) the vectors have a different format and are at a different location to the SunPlus titles
+CONS( 2009, zone40, 0, 0, non_spg_base, wirels60, spg2xx_game_state, init_zone40, "Jungle Soft / Ultimate Products (HK) Ltd", "Zone 40", MACHINE_NO_SOUND | MACHINE_NOT_WORKING )
-// NAND dumps w/ internal bootstrap. Almost certainly do not fit in this driver, as the SPG2xx can only address up to 4Mwords.
-CONS( 2010, wlsair60, 0, 0, non_spg_base, wirels60, spg2xx_game_state, empty_init, "Jungle Soft / Kids Station Toys Inc", "Wireless Air 60", MACHINE_NO_SOUND | MACHINE_NOT_WORKING )
+// Similar, SPG260?, scrambled
+CONS( 200?, lexizeus, 0, 0, lexizeus, lexizeus, spg2xx_game_state, init_zeus, "Lexibook", "Zeus IG900 20-in-1 (US?)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING )
+
+
+// valid looking code, but extended periperhal area (twice the size?) makes use of unemulated opcode 0xfe00 ?
CONS( 2011, wrlshunt, 0, 0, non_spg_base, wirels60, spg2xx_game_state, empty_init, "Hamy / Kids Station Toys Inc", "Wireless Hunting Video Game System", MACHINE_NO_SOUND | MACHINE_NOT_WORKING )
+// extended opcodes different internal map?
+CONS( 2009, smartfp, 0, 0, non_spg_base, wirels60, spg2xx_game_state, empty_init, "Fisher-Price", "Fun 2 Learn Smart Fit Park", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND )
+// Fun 2 Learn 3-in-1 SMART SPORTS ?
+
+// NAND dumps w/ internal bootstrap. Almost certainly do not fit in this driver, as the SPG2xx can only address up to 4Mwords. These are 'GeneralPlus' instead?
+CONS( 2010, wlsair60, 0, 0, non_spg_base, wirels60, spg2xx_game_state, empty_init, "Jungle Soft / Kids Station Toys Inc", "Wireless Air 60", MACHINE_NO_SOUND | MACHINE_NOT_WORKING )
diff --git a/src/mame/drivers/vindictr.cpp b/src/mame/drivers/vindictr.cpp
index 8c8ba0775cf..e533eb1011f 100644
--- a/src/mame/drivers/vindictr.cpp
+++ b/src/mame/drivers/vindictr.cpp
@@ -182,33 +182,33 @@ GFXDECODE_END
*
*************************************/
-MACHINE_CONFIG_START(vindictr_state::vindictr)
-
+void vindictr_state::vindictr(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M68010, ATARI_CLOCK_14MHz/2)
- MCFG_DEVICE_PROGRAM_MAP(main_map)
+ M68010(config, m_maincpu, ATARI_CLOCK_14MHz/2);
+ m_maincpu->set_addrmap(AS_PROGRAM, &vindictr_state::main_map);
EEPROM_2804(config, "eeprom").lock_after_write(true);
WATCHDOG_TIMER(config, "watchdog");
/* video hardware */
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_vindictr)
- MCFG_PALETTE_ADD("palette", 2048*8)
+ GFXDECODE(config, m_gfxdecode, m_palette, gfx_vindictr);
+ PALETTE(config, m_palette).set_entries(2048*8);
- MCFG_TILEMAP_ADD_STANDARD("playfield", "gfxdecode", 2, vindictr_state, get_playfield_tile_info, 8,8, SCAN_COLS, 64,64)
- MCFG_TILEMAP_ADD_STANDARD_TRANSPEN("alpha", "gfxdecode", 2, vindictr_state, get_alpha_tile_info, 8,8, SCAN_ROWS, 64,32, 0)
+ TILEMAP(config, m_playfield_tilemap, m_gfxdecode, 2, 8,8, TILEMAP_SCAN_COLS, 64,64).set_info_callback(FUNC(vindictr_state::get_playfield_tile_info));
+ TILEMAP(config, m_alpha_tilemap, m_gfxdecode, 2, 8,8, TILEMAP_SCAN_ROWS, 64,32, 0).set_info_callback(FUNC(vindictr_state::get_alpha_tile_info));
ATARI_MOTION_OBJECTS(config, m_mob, 0, m_screen, vindictr_state::s_mob_config);
m_mob->set_gfxdecode(m_gfxdecode);
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_VIDEO_ATTRIBUTES(VIDEO_UPDATE_BEFORE_VBLANK)
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_video_attributes(VIDEO_UPDATE_BEFORE_VBLANK);
/* note: these parameters are from published specs, not derived */
/* the board uses a SYNGEN chip to generate video signals */
- MCFG_SCREEN_RAW_PARAMS(ATARI_CLOCK_14MHz/2, 456, 0, 336, 262, 0, 240)
- MCFG_SCREEN_UPDATE_DRIVER(vindictr_state, screen_update_vindictr)
- MCFG_SCREEN_PALETTE("palette")
+ m_screen->set_raw(ATARI_CLOCK_14MHz/2, 456, 0, 336, 262, 0, 240);
+ m_screen->set_screen_update(FUNC(vindictr_state::screen_update_vindictr));
+ m_screen->set_palette(m_palette);
/* sound hardware */
SPEAKER(config, "lspeaker").front_left();
@@ -220,7 +220,7 @@ MACHINE_CONFIG_START(vindictr_state::vindictr)
m_jsa->add_route(0, "lspeaker", 1.0);
m_jsa->add_route(1, "rspeaker", 1.0);
config.device_remove("jsa:tms");
-MACHINE_CONFIG_END
+}
diff --git a/src/mame/drivers/vip.cpp b/src/mame/drivers/vip.cpp
index 909c6b0cdee..bd77b9031fb 100644
--- a/src/mame/drivers/vip.cpp
+++ b/src/mame/drivers/vip.cpp
@@ -270,7 +270,7 @@ READ8_MEMBER(vip_state::read)
int cdef = !((offset >= 0xc00) && (offset < 0x1000));
int minh = 0;
- uint8_t data = m_exp->program_r(space, offset, cs, cdef, &minh);
+ uint8_t data = m_exp->program_r(offset, cs, cdef, &minh);
if (cs)
{
@@ -295,7 +295,7 @@ WRITE8_MEMBER(vip_state::write)
int cdef = !((offset >= 0xc00) && (offset < 0x1000));
int minh = 0;
- m_exp->program_w(space, offset, data, cdef, &minh);
+ m_exp->program_w(offset, data, cdef, &minh);
if (!cs && !minh)
{
@@ -310,7 +310,7 @@ WRITE8_MEMBER(vip_state::write)
READ8_MEMBER(vip_state::io_r)
{
- uint8_t data = m_exp->io_r(space, offset);
+ uint8_t data = m_exp->io_r(offset);
switch (offset)
{
@@ -339,7 +339,7 @@ READ8_MEMBER(vip_state::io_r)
WRITE8_MEMBER(vip_state::io_w)
{
- m_exp->io_w(space, offset, data);
+ m_exp->io_w(offset, data);
switch (offset)
{
@@ -695,7 +695,7 @@ QUICKLOAD_LOAD_MEMBER( vip_state, vip )
//**************************************************************************
//-------------------------------------------------
-// MACHINE_CONFIG( vip )
+// machine_config( vip )
//-------------------------------------------------
MACHINE_CONFIG_START(vip_state::vip)
@@ -728,23 +728,24 @@ MACHINE_CONFIG_START(vip_state::vip)
// sound hardware
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD(DISCRETE_TAG, DISCRETE, vip_discrete)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.80)
+ DISCRETE(config, m_beeper, vip_discrete);
+ m_beeper->add_route(ALL_OUTPUTS, "mono", 0.80);
- MCFG_VIP_BYTEIO_PORT_ADD(VIP_BYTEIO_PORT_TAG, vip_byteio_cards, nullptr, WRITELINE(*this, vip_state, byteio_inst_w))
- MCFG_VIP_EXPANSION_SLOT_ADD(VIP_EXPANSION_SLOT_TAG, 3.52128_MHz_XTAL / 2, vip_expansion_cards, nullptr)
- MCFG_VIP_EXPANSION_SLOT_INT_CALLBACK(WRITELINE(*this, vip_state, exp_int_w))
- MCFG_VIP_EXPANSION_SLOT_DMA_OUT_CALLBACK(WRITELINE(*this, vip_state, exp_dma_out_w))
- MCFG_VIP_EXPANSION_SLOT_DMA_IN_CALLBACK(WRITELINE(*this, vip_state, exp_dma_in_w))
+ VIP_BYTEIO_PORT(config, m_byteio, vip_byteio_cards, nullptr);
+ m_byteio->inst_callback().set(FUNC(vip_state::byteio_inst_w));
+ VIP_EXPANSION_SLOT(config, m_exp, 3.52128_MHz_XTAL / 2, vip_expansion_cards, nullptr);
+ m_exp->int_wr_callback().set(FUNC(vip_state::exp_int_w));
+ m_exp->dma_out_wr_callback().set(FUNC(vip_state::exp_dma_out_w));
+ m_exp->dma_in_wr_callback().set(FUNC(vip_state::exp_dma_in_w));
// devices
- MCFG_QUICKLOAD_ADD("quickload", vip_state, vip, "bin,c8,c8x", 0)
- MCFG_CASSETTE_ADD("cassette")
- MCFG_CASSETTE_DEFAULT_STATE(CASSETTE_STOPPED | CASSETTE_MOTOR_ENABLED | CASSETTE_SPEAKER_MUTED)
- MCFG_CASSETTE_INTERFACE("vip_cass")
+ MCFG_QUICKLOAD_ADD("quickload", vip_state, vip, "bin,c8,c8x")
+ CASSETTE(config, m_cassette);
+ m_cassette->set_default_state(CASSETTE_STOPPED | CASSETTE_MOTOR_ENABLED | CASSETTE_SPEAKER_MUTED);
+ m_cassette->set_interface("vip_cass");
// software lists
- MCFG_SOFTWARE_LIST_ADD("cass_list", "vip")
+ SOFTWARE_LIST(config, "cass_list").set_original("vip");
// internal ram
RAM(config, m_ram).set_default_size("2K").set_extra_options("4K");
@@ -752,7 +753,7 @@ MACHINE_CONFIG_END
//-------------------------------------------------
-// MACHINE_CONFIG( vp111 )
+// machine_config( vp111 )
//-------------------------------------------------
void vip_state::vp111(machine_config &config)
diff --git a/src/mame/drivers/viper.cpp b/src/mame/drivers/viper.cpp
index a7449ea872d..4b230f339d4 100644
--- a/src/mame/drivers/viper.cpp
+++ b/src/mame/drivers/viper.cpp
@@ -2425,7 +2425,7 @@ MACHINE_CONFIG_START(viper_state::viper)
PALETTE(config, "palette").set_entries(65536);
TIMER(config, "ds2430_timer2", 0);
- //MCFG_TIMER_ADD_NONE("ds2430_timer2")
+ //TIMER(config, "ds2430_timer2").configure_generic(timer_device::expired_delegate());
/* sound hardware */
SPEAKER(config, "lspeaker").front_left();
diff --git a/src/mame/drivers/vis.cpp b/src/mame/drivers/vis.cpp
index e34e3824e69..c0bb8750c58 100644
--- a/src/mame/drivers/vis.cpp
+++ b/src/mame/drivers/vis.cpp
@@ -57,7 +57,7 @@ void vis_audio_device::device_start()
set_isa_device();
m_isa->set_dma_channel(7, this, false);
m_isa->install_device(0x0220, 0x022f, read8_delegate(FUNC(vis_audio_device::pcm_r), this), write8_delegate(FUNC(vis_audio_device::pcm_w), this));
- m_isa->install_device(0x0388, 0x038b, read8_delegate(FUNC(ymf262_device::read), subdevice<ymf262_device>("ymf262")), write8_delegate(FUNC(ymf262_device::write), subdevice<ymf262_device>("ymf262")));
+ m_isa->install_device(0x0388, 0x038b, read8sm_delegate(FUNC(ymf262_device::read), subdevice<ymf262_device>("ymf262")), write8sm_delegate(FUNC(ymf262_device::write), subdevice<ymf262_device>("ymf262")));
m_pcm = timer_alloc();
m_pcm->adjust(attotime::never);
}
@@ -143,7 +143,6 @@ void vis_audio_device::device_add_mconfig(machine_config &config)
m_rdac->add_route(ALL_OUTPUTS, "rspeaker", 1.0); // sanyo lc7883k
voltage_regulator_device &vreg(VOLTAGE_REGULATOR(config, "vref"));
- vreg.set_output(5.0);
vreg.add_route(0, "ldac", 1.0, DAC_VREF_POS_INPUT);
vreg.add_route(0, "rdac", 1.0, DAC_VREF_POS_INPUT);
vreg.add_route(0, "ldac", -1.0, DAC_VREF_NEG_INPUT);
diff --git a/src/mame/drivers/vixen.cpp b/src/mame/drivers/vixen.cpp
index 91ac5b72c39..8ef4f63ca30 100644
--- a/src/mame/drivers/vixen.cpp
+++ b/src/mame/drivers/vixen.cpp
@@ -65,10 +65,6 @@ Notes:
// INTERRUPTS
//**************************************************************************
-//-------------------------------------------------
-// update_interrupt -
-//-------------------------------------------------
-
void vixen_state::update_interrupt()
{
int state = (m_cmd_d1 && m_fdint) || m_vsync;// || (!m_enb_srq_int && !m_srq) || (!m_enb_atn_int && !m_atn) || (!m_enb_xmt_int && m_txrdy) || (!m_enb_rcv_int && m_rxrdy);
@@ -91,10 +87,6 @@ READ8_MEMBER( vixen_state::oprom_r )
return m_rom[offset];
}
-//-------------------------------------------------
-// status_r - status read
-//-------------------------------------------------
-
READ8_MEMBER( vixen_state::status_r )
{
/*
@@ -126,11 +118,6 @@ READ8_MEMBER( vixen_state::status_r )
return data;
}
-
-//-------------------------------------------------
-// cmd_w - command write
-//-------------------------------------------------
-
WRITE8_MEMBER( vixen_state::cmd_w )
{
/*
@@ -165,11 +152,6 @@ WRITE8_MEMBER( vixen_state::cmd_w )
update_interrupt();
}
-
-//-------------------------------------------------
-// ieee488_r - IEEE488 bus read
-//-------------------------------------------------
-
READ8_MEMBER( vixen_state::ieee488_r )
{
/*
@@ -255,10 +237,6 @@ READ8_MEMBER( vixen_state::port3_r )
// ADDRESS MAPS
//**************************************************************************
-//-------------------------------------------------
-// ADDRESS_MAP( vixen_mem )
-//-------------------------------------------------
-
// when M1 is inactive: read and write of data
void vixen_state::vixen_mem(address_map &map)
{
@@ -275,23 +253,18 @@ void vixen_state::bios_mem(address_map &map)
map(0xf000, 0xffff).r(FUNC(vixen_state::oprom_r));
}
-
-//-------------------------------------------------
-// ADDRESS_MAP( vixen_io )
-//-------------------------------------------------
-
void vixen_state::vixen_io(address_map &map)
{
map.unmap_value_high();
map.global_mask(0xff);
map(0x00, 0x03).rw(m_fdc, FUNC(fd1797_device::read), FUNC(fd1797_device::write));
map(0x04, 0x04).mirror(0x03).rw(FUNC(vixen_state::status_r), FUNC(vixen_state::cmd_w));
- map(0x08, 0x08).mirror(0x01).rw(P8155H_TAG, FUNC(i8155_device::read), FUNC(i8155_device::write));
+ map(0x08, 0x08).mirror(0x01).rw(P8155H_TAG, FUNC(i8155_device::data_r), FUNC(i8155_device::data_w));
map(0x0c, 0x0d).w(P8155H_TAG, FUNC(i8155_device::ale_w));
map(0x10, 0x10).mirror(0x07).r(m_ieee488, FUNC(ieee488_device::dio_r));
map(0x18, 0x18).mirror(0x07).r(FUNC(vixen_state::ieee488_r));
map(0x20, 0x21).mirror(0x04).w(m_io_i8155, FUNC(i8155_device::ale_w));
- map(0x28, 0x28).mirror(0x05).rw(m_io_i8155, FUNC(i8155_device::read), FUNC(i8155_device::write));
+ map(0x28, 0x28).mirror(0x05).rw(m_io_i8155, FUNC(i8155_device::data_r), FUNC(i8155_device::data_w));
map(0x30, 0x31).mirror(0x06).rw(m_usart, FUNC(i8251_device::read), FUNC(i8251_device::write));
map(0x38, 0x38).mirror(0x07).r(FUNC(vixen_state::port3_r));
// AM_RANGE(0xf0, 0xff) Hard Disk?
@@ -303,10 +276,6 @@ void vixen_state::vixen_io(address_map &map)
// INPUT PORTS
//**************************************************************************
-//-------------------------------------------------
-// INPUT_PORTS( vixen )
-//-------------------------------------------------
-
INPUT_PORTS_START( vixen )
PORT_START("KEY.0")
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("ESC") PORT_CODE(KEYCODE_ESC) PORT_CHAR(0x1B)
@@ -395,10 +364,6 @@ INPUT_PORTS_END
// VIDEO
//**************************************************************************
-//-------------------------------------------------
-// TIMER_DEVICE_CALLBACK_MEMBER( vsync_tick )
-//-------------------------------------------------
-
TIMER_DEVICE_CALLBACK_MEMBER(vixen_state::vsync_tick)
{
if (m_cmd_d0)
@@ -408,7 +373,6 @@ TIMER_DEVICE_CALLBACK_MEMBER(vixen_state::vsync_tick)
}
}
-
void vixen_state::video_start()
{
// register for state saving
@@ -417,11 +381,6 @@ void vixen_state::video_start()
save_item(NAME(m_vsync));
}
-
-//-------------------------------------------------
-// SCREEN_UPDATE( vixen )
-//-------------------------------------------------
-
uint32_t vixen_state::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect)
{
const pen_t *pen = m_palette->pens();
@@ -481,10 +440,6 @@ uint32_t vixen_state::screen_update(screen_device &screen, bitmap_rgb32 &bitmap,
// SOUND
//**************************************************************************
-//-------------------------------------------------
-// DISCRETE_SOUND( vixen )
-//-------------------------------------------------
-
static DISCRETE_SOUND_START( vixen_discrete )
DISCRETE_INPUT_LOGIC(NODE_01)
DISCRETE_SQUAREWAVE(NODE_02, NODE_01, (23.9616_MHz_XTAL / 15360).dvalue(), 100, 50, 0, 90)
@@ -651,7 +606,7 @@ WRITE_LINE_MEMBER( vixen_state::txrdy_w )
}
//-------------------------------------------------
-// IEEE488_INTERFACE( ieee488_intf )
+// IEEE488 interface
//-------------------------------------------------
WRITE_LINE_MEMBER( vixen_state::srq_w )
@@ -683,21 +638,12 @@ WRITE_LINE_MEMBER( vixen_state::fdc_intrq_w )
// MACHINE INITIALIZATION
//**************************************************************************
-//-------------------------------------------------
-// IRQ_CALLBACK_MEMBER( vixen_int_ack )
-//-------------------------------------------------
-
IRQ_CALLBACK_MEMBER(vixen_state::vixen_int_ack)
{
// D0 is pulled low
return 0xfe;
}
-
-//-------------------------------------------------
-// MACHINE_START( vixen )
-//-------------------------------------------------
-
void vixen_state::machine_start()
{
// configure memory banking
@@ -714,7 +660,6 @@ void vixen_state::machine_start()
save_item(NAME(m_fdint));
}
-
void vixen_state::machine_reset()
{
membank("bank3")->set_entry(1);
@@ -736,31 +681,28 @@ void vixen_state::machine_reset()
// MACHINE CONFIGURATION
//**************************************************************************
-//-------------------------------------------------
-// MACHINE_CONFIG( vixen )
-//-------------------------------------------------
-
-MACHINE_CONFIG_START(vixen_state::vixen)
+void vixen_state::vixen(machine_config &config)
+{
// basic machine hardware
- MCFG_DEVICE_ADD(m_maincpu, Z80, 23.9616_MHz_XTAL / 6)
- MCFG_DEVICE_PROGRAM_MAP(vixen_mem)
- MCFG_DEVICE_OPCODES_MAP(bios_mem)
- MCFG_DEVICE_IO_MAP(vixen_io)
- MCFG_DEVICE_IRQ_ACKNOWLEDGE_DRIVER(vixen_state,vixen_int_ack)
+ Z80(config, m_maincpu, 23.9616_MHz_XTAL / 6);
+ m_maincpu->set_addrmap(AS_PROGRAM, &vixen_state::vixen_mem);
+ m_maincpu->set_addrmap(AS_OPCODES, &vixen_state::bios_mem);
+ m_maincpu->set_addrmap(AS_IO, &vixen_state::vixen_io);
+ m_maincpu->set_irq_acknowledge_callback(FUNC(vixen_state::vixen_int_ack));
// video hardware
- MCFG_SCREEN_ADD_MONOCHROME(SCREEN_TAG, RASTER, rgb_t::amber())
- MCFG_SCREEN_UPDATE_DRIVER(vixen_state, screen_update)
- MCFG_SCREEN_RAW_PARAMS(23.9616_MHz_XTAL / 2, 96*8, 0*8, 81*8, 27*10, 0*10, 26*10)
+ screen_device &screen(SCREEN(config, SCREEN_TAG, SCREEN_TYPE_RASTER));
+ screen.set_color(rgb_t::amber());
+ screen.set_screen_update(FUNC(vixen_state::screen_update));
+ screen.set_raw(23.9616_MHz_XTAL / 2, 96*8, 0*8, 81*8, 27*10, 0*10, 26*10);
- MCFG_TIMER_DRIVER_ADD_SCANLINE("vsync", vixen_state, vsync_tick, SCREEN_TAG, 26*10, 27*10)
+ TIMER(config, "vsync").configure_scanline(FUNC(vixen_state::vsync_tick), SCREEN_TAG, 26*10, 27*10);
PALETTE(config, m_palette, palette_device::MONOCHROME);
// sound hardware
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD(DISCRETE_TAG, DISCRETE, vixen_discrete)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.20)
+ DISCRETE(config, DISCRETE_TAG, vixen_discrete).add_route(ALL_OUTPUTS, "mono", 0.20);
// devices
i8155_device &i8155(I8155(config, P8155H_TAG, 23.9616_MHz_XTAL / 6));
@@ -787,20 +729,18 @@ MACHINE_CONFIG_START(vixen_state::vixen)
FD1797(config, m_fdc, 23.9616_MHz_XTAL / 24);
m_fdc->intrq_wr_callback().set(FUNC(vixen_state::fdc_intrq_w));
- MCFG_FLOPPY_DRIVE_ADD(FDC1797_TAG":0", vixen_floppies, "525dd", floppy_image_device::default_floppy_formats)
- MCFG_FLOPPY_DRIVE_SOUND(true)
- MCFG_FLOPPY_DRIVE_ADD(FDC1797_TAG":1", vixen_floppies, "525dd", floppy_image_device::default_floppy_formats)
- MCFG_FLOPPY_DRIVE_SOUND(true)
- MCFG_IEEE488_BUS_ADD()
- MCFG_IEEE488_SRQ_CALLBACK(WRITELINE(*this, vixen_state, srq_w))
- MCFG_IEEE488_ATN_CALLBACK(WRITELINE(*this, vixen_state, atn_w))
+ FLOPPY_CONNECTOR(config, FDC1797_TAG":0", vixen_floppies, "525dd", floppy_image_device::default_floppy_formats).enable_sound(true);
+ FLOPPY_CONNECTOR(config, FDC1797_TAG":1", vixen_floppies, "525dd", floppy_image_device::default_floppy_formats).enable_sound(true);
+ IEEE488(config, m_ieee488);
+ m_ieee488->srq_callback().set(FUNC(vixen_state::srq_w));
+ m_ieee488->atn_callback().set(FUNC(vixen_state::atn_w));
/* software lists */
- MCFG_SOFTWARE_LIST_ADD("disk_list", "vixen")
+ SOFTWARE_LIST(config, "disk_list").set_original("vixen");
// internal ram
RAM(config, RAM_TAG).set_default_size("64K");
-MACHINE_CONFIG_END
+}
@@ -808,10 +748,6 @@ MACHINE_CONFIG_END
// ROMS
//**************************************************************************
-//-------------------------------------------------
-// ROM( vixen )
-//-------------------------------------------------
-
ROM_START( vixen )
ROM_REGION( 0x1000, Z8400A_TAG, 0 )
ROM_LOAD( "osborne 4 mon rom v1.04 3p40082-03 a0a9.4c", 0x0000, 0x1000, CRC(5f1038ce) SHA1(e6809fac23650bbb4689e58edc768d917d80a2df) ) // OSBORNE 4 MON ROM / V1.04 3P40082-03 / A0A9 (c) OCC 1985
@@ -829,11 +765,6 @@ ROM_END
// DRIVER INITIALIZATION
//**************************************************************************
-//-------------------------------------------------
-// DRIVER_INIT( vixen )
-//-------------------------------------------------
-
-
void vixen_state::init_vixen()
{
m_program = &m_maincpu->space(AS_PROGRAM);
diff --git a/src/mame/drivers/vk100.cpp b/src/mame/drivers/vk100.cpp
index 2d307adb9fa..5af83801dc8 100644
--- a/src/mame/drivers/vk100.cpp
+++ b/src/mame/drivers/vk100.cpp
@@ -1031,16 +1031,17 @@ MC6845_UPDATE_ROW( vk100_state::crtc_update_row )
}
-MACHINE_CONFIG_START(vk100_state::vk100)
+void vk100_state::vk100(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", I8085A, XTAL(5'068'800))
- MCFG_DEVICE_PROGRAM_MAP(vk100_mem)
- MCFG_DEVICE_IO_MAP(vk100_io)
+ I8085A(config, m_maincpu, XTAL(5'068'800));
+ m_maincpu->set_addrmap(AS_PROGRAM, &vk100_state::vk100_mem);
+ m_maincpu->set_addrmap(AS_IO, &vk100_state::vk100_io);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_RAW_PARAMS(XTAL(45'619'200)/3, 882, 0, 720, 370, 0, 350 ) // fake screen timings for startup until 6845 sets real ones
- MCFG_SCREEN_UPDATE_DEVICE( "crtc", mc6845_device, screen_update )
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_raw(XTAL(45'619'200)/3, 882, 0, 720, 370, 0, 350 ); // fake screen timings for startup until 6845 sets real ones
+ screen.set_screen_update("crtc", FUNC(mc6845_device::screen_update));
H46505(config, m_crtc, 45.6192_MHz_XTAL/3/12);
m_crtc->set_screen("screen");
@@ -1069,7 +1070,7 @@ MACHINE_CONFIG_START(vk100_state::vk100)
SPEAKER(config, "mono").front_center();
BEEP(config, m_speaker, 116).add_route(ALL_OUTPUTS, "mono", 0.25); // 116 hz (page 172 of TM), but duty cycle is wrong here!
-MACHINE_CONFIG_END
+}
/* ROM definition */
/* according to http://www.computer.museum.uq.edu.au/pdf/EK-VK100-TM-001%20VK100%20Technical%20Manual.pdf
diff --git a/src/mame/drivers/vlc.cpp b/src/mame/drivers/vlc.cpp
index ef8934c87b0..5fca550d1de 100644
--- a/src/mame/drivers/vlc.cpp
+++ b/src/mame/drivers/vlc.cpp
@@ -1,6 +1,6 @@
// license:BSD-3-Clause
// copyright-holders:Yves
-/* vlc.c
+/* vlc.cpp
Multi-games from VLC Nevada 1995
CGA monitor 15Khz 60hz
// CPU CLOCK use Crystal 16.000MHZ
@@ -49,7 +49,7 @@ Boot Section is locate in NVRAM. Interrupts Pointers are changed on the fly.
seem to check hardware WDT ,Power Failure , interrupt system,etc.. before game start.
INT7 seem to control POWER FAILURE ,WDT.
-INT7 initialisation is needed to boot the game.
+INT7 initialization is needed to boot the game.
******************************************************
******************************************************
@@ -570,10 +570,11 @@ MACHINE_START_MEMBER(nevada_state, nevada)
* Machine Driver *
*************************/
-MACHINE_CONFIG_START(nevada_state::nevada)
+void nevada_state::nevada(machine_config &config)
+{
// basic machine hardware
- MCFG_DEVICE_ADD("maincpu", M68000, MASTER_CPU)
- MCFG_DEVICE_PROGRAM_MAP(nevada_map)
+ M68000(config, m_maincpu, MASTER_CPU);
+ m_maincpu->set_addrmap(AS_PROGRAM, &nevada_state::nevada_map);
WATCHDOG_TIMER(config, "watchdog").set_time(attotime::from_msec(150)); /* 150ms Ds1232 TD to Ground */
@@ -582,13 +583,13 @@ MACHINE_CONFIG_START(nevada_state::nevada)
NVRAM(config, "nvram").set_custom_handler(FUNC(nevada_state::nvram_init));
// video hardware
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE((42+1)*8, (32+1)*8) /* From MC6845 init, registers 00 & 04 (programmed with value-1). */
- MCFG_SCREEN_VISIBLE_AREA(0*8, 31*8-1, 0*8, 31*8-1) /* From MC6845 init, registers 01 & 06. */
- MCFG_SCREEN_UPDATE_DRIVER(nevada_state, screen_update_nevada)
- MCFG_SCREEN_PALETTE("palette")
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size((42+1)*8, (32+1)*8); /* From MC6845 init, registers 00 & 04 (programmed with value-1). */
+ screen.set_visarea(0*8, 31*8-1, 0*8, 31*8-1); /* From MC6845 init, registers 01 & 06. */
+ screen.set_screen_update(FUNC(nevada_state::screen_update_nevada));
+ screen.set_palette("palette");
GFXDECODE(config, m_gfxdecode, "palette", gfx_nevada);
PALETTE(config, "palette", FUNC(nevada_state::nevada_palette), 256);
@@ -603,26 +604,25 @@ MACHINE_CONFIG_START(nevada_state::nevada)
AY8912(config, "aysnd", SOUND_CLOCK).add_route(ALL_OUTPUTS, "mono", 0.75);
- MCFG_DEVICE_ADD("duart18", MC68681, XTAL(3'686'400)) // UARTA = Modem 1200Baud
- MCFG_MC68681_IRQ_CALLBACK(INPUTLINE("maincpu", M68K_IRQ_4))
- MCFG_MC68681_INPORT_CALLBACK(IOPORT("DSW1"))
+ MC68681(config, m_duart[0], XTAL(3'686'400)); // UARTA = Modem 1200Baud
+ m_duart[0]->irq_cb().set_inputline(m_maincpu, M68K_IRQ_4);
+ m_duart[0]->inport_cb().set_ioport("DSW1");
- MCFG_DEVICE_ADD("duart39", MC68681, XTAL(3'686'400)) // UARTA = Printer
- MCFG_MC68681_IRQ_CALLBACK(INPUTLINE("maincpu", M68K_IRQ_3))
- MCFG_MC68681_INPORT_CALLBACK(IOPORT("DSW2"))
+ MC68681(config, m_duart[1], XTAL(3'686'400)); // UARTA = Printer
+ m_duart[1]->irq_cb().set_inputline(m_maincpu, M68K_IRQ_3);
+ m_duart[1]->inport_cb().set_ioport("DSW2");
- MCFG_DEVICE_ADD("duart40", MC68681, XTAL(3'686'400)) // UARTA = Touch , UARTB = Bill Acceptor
- MCFG_MC68681_IRQ_CALLBACK(INPUTLINE("maincpu", M68K_IRQ_5))
- MCFG_MC68681_A_TX_CALLBACK(WRITELINE("microtouch", microtouch_device, rx))
- MCFG_MC68681_INPORT_CALLBACK(IOPORT("DSW3"))
+ MC68681(config, m_duart[2], XTAL(3'686'400)); // UARTA = Touch , UARTB = Bill Acceptor
+ m_duart[2]->irq_cb().set_inputline(m_maincpu, M68K_IRQ_5);
+ m_duart[2]->a_tx_cb().set(m_microtouch, FUNC(microtouch_device::rx));
+ m_duart[2]->inport_cb().set_ioport("DSW3");
- MCFG_MICROTOUCH_ADD( "microtouch", 9600, WRITELINE("duart40", mc68681_device, rx_a_w) )
+ MICROTOUCH(config, m_microtouch, 9600).stx().set(m_duart[1], FUNC(mc68681_device::rx_a_w));
/* devices */
- MCFG_DEVICE_ADD("rtc", MSM6242, XTAL(32'768))
- MCFG_MSM6242_OUT_INT_HANDLER(INPUTLINE("maincpu", M68K_IRQ_1)) // rtc interrupt on INT1
-
-MACHINE_CONFIG_END
+ MSM6242(config, m_rtc, XTAL(32'768));
+ m_rtc->out_int_handler().set_inputline(m_maincpu, M68K_IRQ_1); // rtc interrupt on INT1
+}
/***************************************************************************/
ROM_START( nevada )
diff --git a/src/mame/drivers/volfied.cpp b/src/mame/drivers/volfied.cpp
index 47b4f066e11..6d104517897 100644
--- a/src/mame/drivers/volfied.cpp
+++ b/src/mame/drivers/volfied.cpp
@@ -239,15 +239,15 @@ TIMER_DEVICE_CALLBACK_MEMBER(volfied_state::cchip_irq_clear_cb)
}
-MACHINE_CONFIG_START(volfied_state::volfied)
-
+void volfied_state::volfied(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M68000, CPU_CLOCK) /* 8MHz */
- MCFG_DEVICE_PROGRAM_MAP(main_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", volfied_state, interrupt)
+ M68000(config, m_maincpu, CPU_CLOCK); /* 8MHz */
+ m_maincpu->set_addrmap(AS_PROGRAM, &volfied_state::main_map);
+ m_maincpu->set_vblank_int("screen", FUNC(volfied_state::interrupt));
- MCFG_DEVICE_ADD("audiocpu", Z80, SOUND_CPU_CLOCK) /* 4MHz sound CPU, required to run the game */
- MCFG_DEVICE_PROGRAM_MAP(z80_map)
+ Z80(config, m_audiocpu, SOUND_CPU_CLOCK); /* 4MHz sound CPU, required to run the game */
+ m_audiocpu->set_addrmap(AS_PROGRAM, &volfied_state::z80_map);
TAITO_CCHIP(config, m_cchip, 20_MHz_XTAL/2); // 20MHz OSC next to C-Chip
m_cchip->in_pa_callback().set_ioport("F00007");
@@ -256,18 +256,18 @@ MACHINE_CONFIG_START(volfied_state::volfied)
m_cchip->in_ad_callback().set_ioport("F0000D");
m_cchip->out_pb_callback().set(FUNC(volfied_state::counters_w));
- MCFG_QUANTUM_TIME(attotime::from_hz(1200))
+ config.m_minimum_quantum = attotime::from_hz(1200);
- MCFG_TIMER_DRIVER_ADD("cchip_irq_clear", volfied_state, cchip_irq_clear_cb)
+ TIMER(config, m_cchip_irq_clear).configure_generic(FUNC(volfied_state::cchip_irq_clear_cb));
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(320, 256)
- MCFG_SCREEN_VISIBLE_AREA(0, 319, 8, 247)
- MCFG_SCREEN_UPDATE_DRIVER(volfied_state, screen_update)
- MCFG_SCREEN_PALETTE("palette")
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_refresh_hz(60);
+ m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ m_screen->set_size(320, 256);
+ m_screen->set_visarea(0, 319, 8, 247);
+ m_screen->set_screen_update(FUNC(volfied_state::screen_update));
+ m_screen->set_palette("palette");
GFXDECODE(config, "gfxdecode", "palette", gfx_volfied);
PALETTE(config, "palette").set_format(palette_device::xBGR_555, 8192);
@@ -291,7 +291,7 @@ MACHINE_CONFIG_START(volfied_state::volfied)
pc060ha_device &ciu(PC060HA(config, "ciu", 0));
ciu.set_master_tag(m_maincpu);
ciu.set_slave_tag(m_audiocpu);
-MACHINE_CONFIG_END
+}
/***************************************************************************
diff --git a/src/mame/drivers/votrpss.cpp b/src/mame/drivers/votrpss.cpp
index 756d567936b..309e2315836 100644
--- a/src/mame/drivers/votrpss.cpp
+++ b/src/mame/drivers/votrpss.cpp
@@ -224,7 +224,7 @@ WRITE8_MEMBER( votrpss_state::ppi_pa_w )
WRITE8_MEMBER( votrpss_state::ppi_pb_w )
{
m_portb = data;
- m_terminal->write(space, offset, data&0x7f);
+ m_terminal->write(data&0x7f);
}
WRITE8_MEMBER( votrpss_state::ppi_pc_w )
@@ -242,12 +242,13 @@ void votrpss_state::kbd_put(u8 data)
Machine Drivers
******************************************************************************/
-MACHINE_CONFIG_START(votrpss_state::votrpss)
+void votrpss_state::votrpss(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, XTAL(8'000'000)/2) /* 4.000 MHz, verified */
- MCFG_DEVICE_PROGRAM_MAP(votrpss_mem)
- MCFG_DEVICE_IO_MAP(votrpss_io)
- MCFG_DEVICE_IRQ_ACKNOWLEDGE_DRIVER(votrpss_state,irq_ack)
+ Z80(config, m_maincpu, XTAL(8'000'000)/2); /* 4.000 MHz, verified */
+ m_maincpu->set_addrmap(AS_PROGRAM, &votrpss_state::votrpss_mem);
+ m_maincpu->set_addrmap(AS_IO, &votrpss_state::votrpss_io);
+ m_maincpu->set_irq_acknowledge_callback(FUNC(votrpss_state::irq_ack));
/* video hardware */
//config.set_default_layout(layout_votrpss);
@@ -258,8 +259,7 @@ MACHINE_CONFIG_START(votrpss_state::votrpss)
ay.port_b_read_callback().set_ioport("DSW1");
ay.port_a_write_callback().set("votrax", FUNC(votrax_sc01_device::write));
ay.add_route(ALL_OUTPUTS, "mono", 0.25);
- MCFG_DEVICE_ADD("votrax", VOTRAX_SC01, 720000) /* 720 kHz? needs verify */
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.00)
+ VOTRAX_SC01(config, "votrax", 720000).add_route(ALL_OUTPUTS, "mono", 1.00); /* 720 kHz? needs verify */
/* Devices */
GENERIC_TERMINAL(config, m_terminal, 0);
@@ -291,8 +291,8 @@ MACHINE_CONFIG_START(votrpss_state::votrpss)
m_ppi->out_pb_callback().set(FUNC(votrpss_state::ppi_pb_w));
m_ppi->out_pc_callback().set(FUNC(votrpss_state::ppi_pc_w));
- MCFG_TIMER_DRIVER_ADD_PERIODIC("irq_timer", votrpss_state, irq_timer, attotime::from_msec(10))
-MACHINE_CONFIG_END
+ TIMER(config, "irq_timer").configure_periodic(FUNC(votrpss_state::irq_timer), attotime::from_msec(10));
+}
diff --git a/src/mame/drivers/voyager.cpp b/src/mame/drivers/voyager.cpp
index 7b3ceb1a561..b441bdbcd0c 100644
--- a/src/mame/drivers/voyager.cpp
+++ b/src/mame/drivers/voyager.cpp
@@ -503,10 +503,10 @@ void voyager_state::machine_reset()
}
MACHINE_CONFIG_START(voyager_state::voyager)
- MCFG_DEVICE_ADD("maincpu", PENTIUM3, 133000000) // actually AMD Duron CPU of unknown clock
- MCFG_DEVICE_PROGRAM_MAP(voyager_map)
- MCFG_DEVICE_IO_MAP(voyager_io)
- MCFG_DEVICE_IRQ_ACKNOWLEDGE_DEVICE("pic8259_1", pic8259_device, inta_cb)
+ PENTIUM3(config, m_maincpu, 133000000); // actually AMD Duron CPU of unknown clock
+ m_maincpu->set_addrmap(AS_PROGRAM, &voyager_state::voyager_map);
+ m_maincpu->set_addrmap(AS_IO, &voyager_state::voyager_io);
+ m_maincpu->set_irq_acknowledge_callback("pic8259_1", FUNC(pic8259_device::inta_cb));
pcat_common(config);
diff --git a/src/mame/drivers/vpoker.cpp b/src/mame/drivers/vpoker.cpp
index 5f5e6cc83ec..eafe391270f 100644
--- a/src/mame/drivers/vpoker.cpp
+++ b/src/mame/drivers/vpoker.cpp
@@ -634,24 +634,24 @@ WRITE_LINE_MEMBER(vpoker_state::ptm_irq)
m_maincpu->set_input_line(M6809_IRQ_LINE, state ? ASSERT_LINE : CLEAR_LINE);
}
-MACHINE_CONFIG_START(vpoker_state::vpoker)
-
+void vpoker_state::vpoker(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", MC6809, XTAL(4'000'000))
- MCFG_DEVICE_PROGRAM_MAP(main_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", vpoker_state, irq0_line_hold) //irq0 valid too
+ MC6809(config, m_maincpu, XTAL(4'000'000));
+ m_maincpu->set_addrmap(AS_PROGRAM, &vpoker_state::main_map);
+ m_maincpu->set_vblank_int("screen", FUNC(vpoker_state::irq0_line_hold));
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) // not accurate
- MCFG_SCREEN_SIZE(512, 256)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 480-1, 0*8, 240-1)
-// MCFG_SCREEN_VISIBLE_AREA(0*8, 512-1, 0*8, 256-1)
- MCFG_SCREEN_UPDATE_DRIVER(vpoker_state, screen_update_vpoker)
- MCFG_SCREEN_PALETTE(m_palette)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500)); // not accurate
+ screen.set_size(512, 256);
+ screen.set_visarea(0*8, 480-1, 0*8, 240-1);
+// screen.set_visarea(0*8, 512-1, 0*8, 256-1);
+ screen.set_screen_update(FUNC(vpoker_state::screen_update_vpoker));
+ screen.set_palette(m_palette);
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_vpoker)
+ GFXDECODE(config, m_gfxdecode, m_palette, gfx_vpoker);
PALETTE(config, m_palette, palette_device::GBR_3BIT);
@@ -663,7 +663,7 @@ MACHINE_CONFIG_START(vpoker_state::vpoker)
/* sound hardware */
SPEAKER(config, "mono").front_center();
// AY8910(config, "aysnd", 8000000/4 /* guess */).add_route(ALL_OUTPUTS, "mono", 0.30);
-MACHINE_CONFIG_END
+}
/***************************************************************************
diff --git a/src/mame/drivers/vroulet.cpp b/src/mame/drivers/vroulet.cpp
index 900de567c43..b9f4a448bfc 100644
--- a/src/mame/drivers/vroulet.cpp
+++ b/src/mame/drivers/vroulet.cpp
@@ -279,12 +279,13 @@ WRITE8_MEMBER(vroulet_state::ppi8255_c_w){}
/* Machine Driver */
-MACHINE_CONFIG_START(vroulet_state::vroulet)
+void vroulet_state::vroulet(machine_config &config)
+{
// basic machine hardware
- MCFG_DEVICE_ADD("maincpu", Z80, 4000000) //???
- MCFG_DEVICE_PROGRAM_MAP(vroulet_map)
- MCFG_DEVICE_IO_MAP(vroulet_io_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", vroulet_state, irq0_line_hold)
+ Z80(config, m_maincpu, 4000000); //???
+ m_maincpu->set_addrmap(AS_PROGRAM, &vroulet_state::vroulet_map);
+ m_maincpu->set_addrmap(AS_IO, &vroulet_state::vroulet_io_map);
+ m_maincpu->set_vblank_int("screen", FUNC(vroulet_state::irq0_line_hold));
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_1);
@@ -299,16 +300,16 @@ MACHINE_CONFIG_START(vroulet_state::vroulet)
ppi1.out_pc_callback().set(FUNC(vroulet_state::ppi8255_c_w));
// video hardware
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(32*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(vroulet_state, screen_update)
- MCFG_SCREEN_PALETTE("palette")
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(32*8, 32*8);
+ screen.set_visarea(0*8, 32*8-1, 2*8, 30*8-1);
+ screen.set_screen_update(FUNC(vroulet_state::screen_update));
+ screen.set_palette(m_palette);
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_vroulet)
- MCFG_PALETTE_ADD("palette", 128*4)
+ GFXDECODE(config, m_gfxdecode, m_palette, gfx_vroulet);
+ PALETTE(config, m_palette).set_entries(128*4);
// sound hardware
SPEAKER(config, "mono").front_center();
@@ -317,8 +318,7 @@ MACHINE_CONFIG_START(vroulet_state::vroulet)
aysnd.port_a_read_callback().set_ioport("DSWA");
aysnd.port_b_read_callback().set_ioport("DSWB");
aysnd.add_route(ALL_OUTPUTS, "mono", 0.25);
-
-MACHINE_CONFIG_END
+}
/* ROMs */
diff --git a/src/mame/drivers/vsmile.cpp b/src/mame/drivers/vsmile.cpp
index 69da8f95d67..d498fe82653 100644
--- a/src/mame/drivers/vsmile.cpp
+++ b/src/mame/drivers/vsmile.cpp
@@ -2,259 +2,154 @@
// copyright-holders:Ryan Holtz
/******************************************************************************
- V-Tech V.Smile console emulat
-
- Status:
-
- Most games boot but lack controls
-
- To-Do:
-
- Proper UART support (SPG2xx) for controller
-
- Similar Systems: ( from http://en.wkikpedia.org/wiki/V.Smile )
-
- V.Smile by VTech, a system designed for children under the age of 10
- V.Smile Pocket (2 versions)
- V.Smile Cyber Pocket
- V.Smile PC Pal
- V-Motion Active Learning System
- Leapster
- V.Smile Baby Infant Development System
- V.Flash
+ V-Tech V.Smile console emulation
*******************************************************************************/
#include "emu.h"
-#include "bus/generic/slot.h"
-#include "bus/generic/carts.h"
+#include "includes/vsmile.h"
-#include "cpu/unsp/unsp.h"
-
-#include "machine/bankdev.h"
-#include "machine/spg2xx.h"
-
-#include "screen.h"
#include "softlist.h"
#include "speaker.h"
-class vsmile_state : public driver_device
+/************************************
+ *
+ * Common
+ *
+ ************************************/
+
+void vsmile_base_state::machine_start()
{
-public:
- vsmile_state(const machine_config &mconfig, device_type type, const char *tag)
- : driver_device(mconfig, type, tag)
- , m_maincpu(*this, "maincpu")
- , m_screen(*this, "screen")
- , m_spg(*this, "spg")
- , m_cart(*this, "cartslot")
- , m_bankdev(*this, "bank")
- , m_system_region(*this, "maincpu")
- , m_io_p1(*this, "P1")
- , m_io_p2(*this, "P2")
- , m_cart_region(nullptr)
- , m_pad_timer(nullptr)
- , m_pad_counter(0)
- , m_portb_data(0)
- , m_portc_data(0)
- { }
-
- void vsmile(machine_config &config);
- void vsmilep(machine_config &config);
-
-private:
- virtual void machine_start() override;
- virtual void machine_reset() override;
- virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override;
-
- static const device_timer_id TIMER_UART_TX = 0;
- static const device_timer_id TIMER_PAD = 1;
-
- void mem_map(address_map &map);
- void banked_map(address_map &map);
-
- DECLARE_DEVICE_IMAGE_LOAD_MEMBER(cart);
-
- DECLARE_READ16_MEMBER(portb_r);
- DECLARE_READ16_MEMBER(portc_r);
- DECLARE_WRITE16_MEMBER(portb_w);
- DECLARE_WRITE16_MEMBER(portc_w);
-
- DECLARE_WRITE8_MEMBER(chip_sel_w);
-
- DECLARE_WRITE8_MEMBER(uart_tx);
-
- DECLARE_READ16_MEMBER(bank0_r);
- DECLARE_READ16_MEMBER(bank1_r);
- DECLARE_READ16_MEMBER(bank2_r);
- DECLARE_READ16_MEMBER(bank3_r);
-
- enum
- {
- VSMILE_PORTB_CS1 = 0x01,
- VSMILE_PORTB_CS2 = 0x02,
- VSMILE_PORTB_CART = 0x04,
- VSMILE_PORTB_RESET = 0x08,
- VSMILE_PORTB_FRONT24 = 0x10,
- VSMILE_PORTB_OFF = 0x20,
- VSMILE_PORTB_OFF_SW = 0x40,
- VSMILE_PORTB_ON_SW = 0x80,
-
- VSMILE_PORTC_VER = 0x0f,
- VSMILE_PORTC_LOGO = 0x10,
- VSMILE_PORTC_TEST = 0x20,
- VSMILE_PORTC_AMP = 0x40,
- VSMILE_PORTC_SYSRESET = 0x80
- };
-
- required_device<cpu_device> m_maincpu;
- required_device<screen_device> m_screen;
- required_device<spg2xx_device> m_spg;
- required_device<generic_slot_device> m_cart;
- required_device<address_map_bank_device> m_bankdev;
- required_memory_region m_system_region;
- required_ioport m_io_p1;
- required_ioport m_io_p2;
- memory_region *m_cart_region;
-
- emu_timer *m_pad_timer;
- uint8_t m_pad_counter;
-
- uint16_t m_portb_data;
- uint16_t m_portc_data;
-};
-
-void vsmile_state::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr)
+ const int bank = m_cart && m_cart->exists() ? 4 : 0;
+
+ m_bankdev->set_bank(bank);
+}
+
+WRITE8_MEMBER(vsmile_base_state::chip_sel_w)
{
- switch (id)
+ const uint16_t cart_offset = m_cart && m_cart->exists() ? 4 : 0;
+ switch (data)
{
- case TIMER_UART_TX:
- break;
- case TIMER_PAD:
- m_pad_counter++;
- if (m_pad_counter >= 100)
- {
- m_pad_counter = 0;
- //m_spg->uart_rx(0x55);
- }
- break;
- default:
- logerror("Unknown timer ID: %d\n", id);
- break;
+ case 0:
+ m_bankdev->set_bank(cart_offset);
+ break;
+ case 1:
+ m_bankdev->set_bank(1 + cart_offset);
+ break;
+ case 2:
+ case 3:
+ m_bankdev->set_bank(2 + cart_offset);
+ break;
}
+ m_maincpu->invalidate_cache();
}
-READ16_MEMBER(vsmile_state::bank0_r)
+READ16_MEMBER(vsmile_base_state::bank3_r)
{
- return ((uint16_t*)m_cart_region->base())[offset];
+ return ((uint16_t*)m_system_region->base())[offset];
}
-READ16_MEMBER(vsmile_state::bank1_r)
+void vsmile_state::machine_start()
{
- return ((uint16_t*)m_cart_region->base())[offset + 0x100000];
+ vsmile_base_state::machine_start();
+
+ save_item(NAME(m_ctrl_rts));
+ save_item(NAME(m_ctrl_select));
}
-READ16_MEMBER(vsmile_state::bank2_r)
+void vsmile_state::machine_reset()
{
- return ((uint16_t*)m_cart_region->base())[offset + 0x200000];
+ std::fill(std::begin(m_ctrl_rts), std::end(m_ctrl_rts), false);
+ std::fill(std::begin(m_ctrl_select), std::end(m_ctrl_select), false);
}
-READ16_MEMBER(vsmile_state::bank3_r)
+WRITE8_MEMBER(vsmile_state::ctrl_tx_w)
{
- return ((uint16_t*)m_system_region->base())[offset];
+ //printf("Ctrl Tx: %02x\n", data);
+ m_spg->uart_rx(data);
}
-READ16_MEMBER(vsmile_state::portb_r)
+template <int Which> WRITE_LINE_MEMBER(vsmile_state::ctrl_rts_w)
{
- //const uint8_t inputs = m_io_p2->read();
- //const uint16_t input_bits = BIT(inputs, 0) ? VSMILE_PORTB_ON_SW : 0;
- //const uint16_t data = VSMILE_PORTB_ON_SW | VSMILE_PORTB_OFF_SW | (m_cart && m_cart->exists() ? VSMILE_PORTB_CART : 0);
- //logerror("V.Smile Port B read %04x, mask %04x\n", data, mem_mask);
- //printf("V.Smile Port B read %04x, mask %04x\n", data, mem_mask);
- return m_portb_data;// | data;
+ //printf("Ctrl%d RTS: %d\n", Which, state);
+ m_ctrl_rts[Which] = state;
+ m_spg->extint_w(Which, state);
}
-READ16_MEMBER(vsmile_state::portc_r)
+WRITE8_MEMBER(vsmile_state::uart_rx)
{
- uint16_t data = 0x0004;
- if (m_portc_data & 0x0100)
- data |= 0x0400;
- if (m_portc_data & 0x0200)
- data |= 0x1000;
- //logerror("V.Smile Port C read %04x, mask %04x\n", data, mem_mask);
- return (m_portc_data & ~0x000f) | data;
+ //printf("Ctrl Rx: %02x\n", data);
+ m_ctrl[0]->data_w(data);
+ m_ctrl[1]->data_w(data);
}
-WRITE16_MEMBER(vsmile_state::portb_w)
+READ16_MEMBER(vsmile_state::portb_r)
{
- m_portb_data = data;//(m_portb_data &~ mem_mask) | (data & mem_mask);
- //logerror("V.Smile Port B write %04x, mask %04x\n", m_portb_data, mem_mask);
- //printf("V.Smile Port B write %04x, mask %04x\n", m_portb_data, mem_mask);
+ return VSMILE_PORTB_OFF_SW | VSMILE_PORTB_ON_SW | VSMILE_PORTB_RESET;
}
-WRITE16_MEMBER(vsmile_state::portc_w)
+WRITE16_MEMBER(vsmile_state::portb_w)
{
- m_portc_data = data;//(m_portc_data &~ mem_mask) | (data & mem_mask);
- //logerror("V.Smile Port C write %04x, mask %04x\n", m_portc_data, mem_mask);
- //printf("V.Smile Port C write %04x, mask %04x\n", m_portc_data, mem_mask);
- //printf("%02x ", data >> 8);
+ if (BIT(mem_mask, 4))
+ m_cart->set_cs2(BIT(data, 4));
}
-WRITE8_MEMBER(vsmile_state::uart_tx)
+READ16_MEMBER(vsmile_state::portc_r)
{
- logerror("UART Tx: %02x\n", data);
+ uint16_t data = m_dsw_region->read();
+ data |= m_ctrl_rts[0] ? 0 : 0x0400;
+ data |= m_ctrl_rts[1] ? 0 : 0x1000;
+ data |= 0x0020;
+ data |= (m_ctrl_rts[0] && m_ctrl_rts[1]) ? 0x0000 : 0x2000;
+ //data = machine().rand() & 0xffff;
+ return data;
}
-WRITE8_MEMBER(vsmile_state::chip_sel_w)
+WRITE16_MEMBER(vsmile_state::portc_w)
{
- const uint16_t cart_offset = m_cart && m_cart->exists() ? 4 : 0;
- switch (data)
+ if (BIT(mem_mask, 8))
{
- case 0:
- m_bankdev->set_bank(cart_offset);
- break;
- case 1:
- m_bankdev->set_bank(1 + cart_offset);
- break;
- case 2:
- case 3:
- m_bankdev->set_bank(2 + cart_offset);
- break;
+ //printf("Ctrl0 SEL: %d\n", BIT(data, 8));
+ m_ctrl_select[0] = BIT(data, 8);
+ m_ctrl[0]->select_w(m_ctrl_select[0]);
}
-}
-
-void vsmile_state::machine_start()
-{
- // if there's a cart, override the standard banking
- if (m_cart && m_cart->exists())
+ if (BIT(mem_mask, 9))
{
- std::string region_tag;
- m_cart_region = memregion(region_tag.assign(m_cart->tag()).append(GENERIC_ROM_REGION_TAG).c_str());
+ //printf("Ctrl1 SEL: %d\n", BIT(data, 9));
+ m_ctrl_select[1] = BIT(data, 9);
+ m_ctrl[1]->select_w(m_ctrl_select[1]);
}
-
- m_bankdev->set_bank(m_cart && m_cart->exists() ? 4 : 0);
-
- m_pad_timer = timer_alloc(TIMER_PAD);
- m_pad_timer->adjust(attotime::never);
}
-void vsmile_state::machine_reset()
-{
- m_portb_data = 0;
- m_portc_data = 0;
+/************************************
+ *
+ * V.Smile Motion-specific
+ *
+ ************************************/
- m_pad_timer->adjust(attotime::from_hz(100), 0, attotime::from_hz(100));
- m_pad_counter = 0;
+WRITE16_MEMBER(vsmilem_state::porta_w)
+{
+ //printf("Port A write: %04x & %04x\n", data, mem_mask);
}
-DEVICE_IMAGE_LOAD_MEMBER(vsmile_state, cart)
+READ16_MEMBER(vsmilem_state::porta_r)
{
- uint32_t size = m_cart->common_get_size("rom");
+ const uint16_t data = 0xc000;
+ //printf("Port A read: %04x & %04x\n", data, mem_mask);
+ return data;
+}
- m_cart->rom_alloc(size, GENERIC_ROM16_WIDTH, ENDIANNESS_LITTLE);
- m_cart->common_load_rom(m_cart->get_rom_base(), size, "rom");
+/************************************
+ *
+ * Address Maps
+ *
+ ************************************/
- return image_init_result::PASS;
+void vsmile_base_state::mem_map(address_map &map)
+{
+ map(0x000000, 0x3fffff).rw(m_bankdev, FUNC(address_map_bank_device::read16), FUNC(address_map_bank_device::write16));
+ map(0x000000, 0x003fff).m(m_spg, FUNC(spg2xx_device::map));
}
void vsmile_state::banked_map(address_map &map)
@@ -274,47 +169,56 @@ void vsmile_state::banked_map(address_map &map)
map(0x0a00000, 0x0afffff).rom().region("maincpu", 0);
map(0x0b00000, 0x0bfffff).rom().region("maincpu", 0);
- map(0x1000000, 0x13fffff).r(FUNC(vsmile_state::bank0_r));
+ map(0x1000000, 0x13fffff).rw(m_cart, FUNC(vsmile_cart_slot_device::bank0_r), FUNC(vsmile_cart_slot_device::bank0_w));
- map(0x1400000, 0x15fffff).r(FUNC(vsmile_state::bank0_r));
- map(0x1600000, 0x17fffff).r(FUNC(vsmile_state::bank1_r));
+ map(0x1400000, 0x15fffff).rw(m_cart, FUNC(vsmile_cart_slot_device::bank0_r), FUNC(vsmile_cart_slot_device::bank0_w));
+ map(0x1600000, 0x17fffff).rw(m_cart, FUNC(vsmile_cart_slot_device::bank2_r), FUNC(vsmile_cart_slot_device::bank2_w));
- map(0x1800000, 0x18fffff).r(FUNC(vsmile_state::bank0_r));
- map(0x1900000, 0x19fffff).r(FUNC(vsmile_state::bank1_r));
- map(0x1a00000, 0x1afffff).nopr();
+ map(0x1800000, 0x18fffff).rw(m_cart, FUNC(vsmile_cart_slot_device::bank0_r), FUNC(vsmile_cart_slot_device::bank0_w));
+ map(0x1900000, 0x19fffff).rw(m_cart, FUNC(vsmile_cart_slot_device::bank1_r), FUNC(vsmile_cart_slot_device::bank1_w));
+ map(0x1a00000, 0x1afffff).rw(m_cart, FUNC(vsmile_cart_slot_device::bank2_r), FUNC(vsmile_cart_slot_device::bank2_w));
map(0x1b00000, 0x1bfffff).r(FUNC(vsmile_state::bank3_r));
}
-void vsmile_state::mem_map(address_map &map)
-{
- map(0x000000, 0x3fffff).r(m_bankdev, FUNC(address_map_bank_device::read16));
- map(0x000000, 0x003fff).m(m_spg, FUNC(spg2xx_device::map));
-}
+/************************************
+ *
+ * Inputs
+ *
+ ************************************/
static INPUT_PORTS_START( vsmile )
- PORT_START("P1")
- PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_PLAYER(1) PORT_NAME("Joypad Up")
- PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_PLAYER(1) PORT_NAME("Joypad Down")
- PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_PLAYER(1) PORT_NAME("Joypad Left")
- PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_PLAYER(1) PORT_NAME("Joypad Right")
- PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_PLAYER(1) PORT_NAME("A Button")
- PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_PLAYER(1) PORT_NAME("Menu")
- PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_PLAYER(1) PORT_NAME("B Button")
- PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_PLAYER(1) PORT_NAME("X Button")
-
- PORT_START("P2")
- PORT_DIPNAME( 0x0001, 0x0001, "POWER ON" )
- PORT_DIPSETTING( 0x0001, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0002, 0x0002, "POWER OFF" )
- PORT_DIPSETTING( 0x0002, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_START("REGION")
+ PORT_DIPNAME( 0x0f, 0x04, "BIOS Region" )
+ PORT_DIPSETTING( 0x04, "UK/US" )
+ PORT_DIPSETTING( 0x07, "China" )
+ PORT_DIPSETTING( 0x08, "Mexico" )
+ PORT_DIPSETTING( 0x0a, "Italy" )
+ PORT_DIPSETTING( 0x0b, "Germany" )
+ PORT_DIPSETTING( 0x0c, "Spain" )
+ PORT_DIPSETTING( 0x0d, "France" )
+ PORT_DIPNAME( 0x10, 0x10, "VTech Intro" )
+ PORT_DIPSETTING( 0x00, "Off" )
+ PORT_DIPSETTING( 0x10, "On" )
+ PORT_BIT( 0xe0, 0x00, IPT_UNUSED )
INPUT_PORTS_END
-void vsmile_state::vsmile(machine_config &config)
+/************************************
+ *
+ * Machine Configs
+ *
+ ************************************/
+
+static void vsmile_cart(device_slot_interface &device)
+{
+ device.option_add_internal("vsmile_rom", VSMILE_ROM_STD);
+ device.option_add_internal("vsmile_nvram", VSMILE_ROM_NVRAM);
+}
+
+void vsmile_base_state::vsmile_base(machine_config &config)
{
UNSP(config, m_maincpu, XTAL(27'000'000));
- m_maincpu->set_addrmap(AS_PROGRAM, &vsmile_state::mem_map);
+ m_maincpu->set_addrmap(AS_PROGRAM, &vsmile_base_state::mem_map);
+ m_maincpu->set_force_no_drc(true);
SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
m_screen->set_refresh_hz(60);
@@ -327,27 +231,40 @@ void vsmile_state::vsmile(machine_config &config)
SPEAKER(config, "rspeaker").front_right();
SPG24X(config, m_spg, XTAL(27'000'000), m_maincpu, m_screen);
- m_spg->portb_in().set(FUNC(vsmile_state::portb_r));
- m_spg->portc_in().set(FUNC(vsmile_state::portc_r));
- m_spg->portb_out().set(FUNC(vsmile_state::portb_w));
- m_spg->portc_out().set(FUNC(vsmile_state::portc_w));
- m_spg->chip_select().set(FUNC(vsmile_state::chip_sel_w));
- m_spg->uart_tx().set(FUNC(vsmile_state::uart_tx));
+ m_spg->chip_select().set(FUNC(vsmile_base_state::chip_sel_w));
m_spg->add_route(ALL_OUTPUTS, "lspeaker", 0.5);
m_spg->add_route(ALL_OUTPUTS, "rspeaker", 0.5);
ADDRESS_MAP_BANK(config, m_bankdev);
- m_bankdev->set_addrmap(AS_PROGRAM, &vsmile_state::banked_map);
m_bankdev->set_endianness(ENDIANNESS_LITTLE);
m_bankdev->set_data_width(16);
m_bankdev->set_shift(-1);
m_bankdev->set_stride(0x400000);
- GENERIC_CARTSLOT(config, m_cart, generic_plain_slot, "vsmile_cart");
- m_cart->set_width(GENERIC_ROM16_WIDTH);
- m_cart->set_device_load(device_image_load_delegate(&vsmile_state::device_image_load_cart, this));
+ VSMILE_CART_SLOT(config, m_cart, vsmile_cart, nullptr);
+}
+
+void vsmile_state::vsmile(machine_config &config)
+{
+ vsmile_base(config);
+
+ m_bankdev->set_addrmap(AS_PROGRAM, &vsmile_state::banked_map);
+
+ m_spg->portb_in().set(FUNC(vsmile_state::portb_r));
+ m_spg->portc_in().set(FUNC(vsmile_state::portc_r));
+ m_spg->portc_out().set(FUNC(vsmile_state::portc_w));
+ m_spg->uart_tx().set(FUNC(vsmile_state::uart_rx));
+
+ VSMILE_CTRL_PORT(config, m_ctrl[0], vsmile_controllers, "joy");
+ m_ctrl[0]->rts_cb().set(FUNC(vsmile_state::ctrl_rts_w<0>));
+ m_ctrl[0]->data_cb().set(FUNC(vsmile_state::ctrl_tx_w));
+
+ VSMILE_CTRL_PORT(config, m_ctrl[1], vsmile_controllers, nullptr);
+ m_ctrl[1]->rts_cb().set(FUNC(vsmile_state::ctrl_rts_w<1>));
+ m_ctrl[1]->data_cb().set(FUNC(vsmile_state::ctrl_tx_w));
SOFTWARE_LIST(config, "cart_list").set_original("vsmile_cart");
+ SOFTWARE_LIST(config, "cart_list2").set_original("vsmilem_cart");
}
void vsmile_state::vsmilep(machine_config &config)
@@ -356,6 +273,20 @@ void vsmile_state::vsmilep(machine_config &config)
m_spg->set_pal(true);
}
+void vsmilem_state::vsmilem(machine_config &config)
+{
+ vsmile(config);
+ m_spg->porta_out().set(FUNC(vsmilem_state::porta_w));
+ m_spg->porta_in().set(FUNC(vsmilem_state::porta_r));
+}
+
+/************************************
+ *
+ * ROM Loading
+ *
+ ************************************/
+
+// TODO: decide on a dump endian, these likely differ in endianess due to different dumping technqiues
ROM_START( vsmile )
ROM_REGION( 0x800000, "maincpu", ROMREGION_ERASEFF )
ROM_LOAD( "vsmilebios.bin", 0x000000, 0x200000, CRC(11f1b416) SHA1(11f77c4973d29c962567390e41879c86a759c93b) )
@@ -371,13 +302,13 @@ ROM_START( vsmilef )
ROM_LOAD16_WORD_SWAP( "sysrom_france", 0x000000, 0x200000, CRC(0cd0bdf5) SHA1(5c8d1eada1b6b545555b8d2b09325d7127681af8) )
ROM_END
-ROM_START( vsmileb )
+ROM_START( vsmilem )
ROM_REGION( 0x800000, "maincpu", ROMREGION_ERASEFF )
- ROM_LOAD( "vbabybios.bin", 0x000000, 0x800000, CRC(ddc7f845) SHA1(2c17d0f54200070176d03d44a40c7923636e596a) )
+ ROM_LOAD( "vsmilebios.bin", 0x000000, 0x200000, BAD_DUMP CRC(11f1b416) SHA1(11f77c4973d29c962567390e41879c86a759c93b) )
ROM_END
-// year, name, parent, compat, machine, input, class, init, company, fullname, flags
-CONS( 2005, vsmile, 0, 0, vsmile, vsmile, vsmile_state, empty_init, "VTech", "V.Smile (US)", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS | MACHINE_NOT_WORKING )
-CONS( 2005, vsmileg, vsmile, 0, vsmilep, vsmile, vsmile_state, empty_init, "VTech", "V.Smile (Germany)", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS | MACHINE_NOT_WORKING )
-CONS( 2005, vsmilef, vsmile, 0, vsmilep, vsmile, vsmile_state, empty_init, "VTech", "V.Smile (France)", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS | MACHINE_NOT_WORKING )
-CONS( 2005, vsmileb, 0, 0, vsmile, vsmile, vsmile_state, empty_init, "VTech", "V.Smile Baby (US)", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS | MACHINE_NOT_WORKING )
+// year, name, parent, compat, machine, input, class, init, company, fullname, flags
+CONS( 2005, vsmile, 0, 0, vsmile, vsmile, vsmile_state, empty_init, "VTech", "V.Smile (US)", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS )
+CONS( 2005, vsmileg, vsmile, 0, vsmilep, vsmile, vsmile_state, empty_init, "VTech", "V.Smile (Germany)", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS )
+CONS( 2005, vsmilef, vsmile, 0, vsmilep, vsmile, vsmile_state, empty_init, "VTech", "V.Smile (France)", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS )
+CONS( 2008, vsmilem, vsmile, 0, vsmilem, vsmile, vsmilem_state, empty_init, "VTech", "V.Smile Motion (US)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS )
diff --git a/src/mame/drivers/vsmileb.cpp b/src/mame/drivers/vsmileb.cpp
new file mode 100644
index 00000000000..782c88f3054
--- /dev/null
+++ b/src/mame/drivers/vsmileb.cpp
@@ -0,0 +1,164 @@
+// license:BSD-3-Clause
+// copyright-holders:Ryan Holtz
+/******************************************************************************
+
+ V-Tech V.Smile Baby console emulation
+
+*******************************************************************************/
+
+#include "emu.h"
+
+#include "includes/vsmile.h"
+
+#include "softlist.h"
+#include "speaker.h"
+
+
+/************************************
+ *
+ * V.Smile Baby
+ *
+ ************************************/
+
+void vsmileb_state::machine_start()
+{
+ vsmile_base_state::machine_start();
+
+ save_item(NAME(m_mode));
+}
+
+void vsmileb_state::machine_reset()
+{
+ m_mode = 0x0400;
+}
+
+READ16_MEMBER(vsmileb_state::porta_r)
+{
+ return 0x0302 | (m_io_logo->read() ? 0x0080 : 0x0000);
+}
+
+READ16_MEMBER(vsmileb_state::portb_r)
+{
+ return 0x0080;
+}
+
+INPUT_CHANGED_MEMBER(vsmileb_state::pad_button_changed)
+{
+ uint16_t value = m_mode;
+ if (newval == 0)
+ {
+ value |= 0x0080;
+ }
+ else
+ {
+ value |= (uint16_t)(uintptr_t)param;
+ }
+ m_spg->uart_rx((uint8_t)(value >> 8));
+ m_spg->uart_rx((uint8_t)value);
+}
+
+template <uint16_t V> INPUT_CHANGED_MEMBER(vsmileb_state::sw_mode)
+{
+ if (!newval && oldval)
+ {
+ m_mode = V;
+ const uint16_t value = m_mode | 0x0080;
+ m_spg->uart_rx((uint8_t)(value >> 8));
+ m_spg->uart_rx((uint8_t)value);
+ }
+}
+
+void vsmileb_state::banked_map(address_map &map)
+{
+ map(0x0000000, 0x03fffff).rom().region("maincpu", 0);
+ map(0x0400000, 0x07fffff).rom().region("maincpu", 0);
+ map(0x0800000, 0x0bfffff).rom().region("maincpu", 0);
+
+ map(0x1000000, 0x13fffff).rw(m_cart, FUNC(vsmile_cart_slot_device::bank0_r), FUNC(vsmile_cart_slot_device::bank0_w));
+
+ map(0x1400000, 0x15fffff).rw(m_cart, FUNC(vsmile_cart_slot_device::bank0_r), FUNC(vsmile_cart_slot_device::bank0_w));
+ map(0x1600000, 0x17fffff).rw(m_cart, FUNC(vsmile_cart_slot_device::bank2_r), FUNC(vsmile_cart_slot_device::bank2_w));
+
+ map(0x1800000, 0x18fffff).rw(m_cart, FUNC(vsmile_cart_slot_device::bank0_r), FUNC(vsmile_cart_slot_device::bank0_w));
+ map(0x1900000, 0x19fffff).rw(m_cart, FUNC(vsmile_cart_slot_device::bank1_r), FUNC(vsmile_cart_slot_device::bank1_w));
+ map(0x1a00000, 0x1afffff).rw(m_cart, FUNC(vsmile_cart_slot_device::bank2_r), FUNC(vsmile_cart_slot_device::bank2_w));
+ map(0x1b00000, 0x1bfffff).r(FUNC(vsmileb_state::bank3_r));
+}
+
+/************************************
+ *
+ * Inputs
+ *
+ ************************************/
+
+static INPUT_PORTS_START( vsmileb )
+ PORT_START("BUTTONS")
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_MEMBER(DEVICE_SELF, vsmileb_state, pad_button_changed, vsmileb_state::BUTTON_YELLOW) PORT_NAME("Yellow")
+ PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_CHANGED_MEMBER(DEVICE_SELF, vsmileb_state, pad_button_changed, vsmileb_state::BUTTON_BLUE) PORT_NAME("Blue")
+ PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_CHANGED_MEMBER(DEVICE_SELF, vsmileb_state, pad_button_changed, vsmileb_state::BUTTON_ORANGE) PORT_NAME("Orange")
+ PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_CHANGED_MEMBER(DEVICE_SELF, vsmileb_state, pad_button_changed, vsmileb_state::BUTTON_GREEN) PORT_NAME("Green")
+ PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_BUTTON5 ) PORT_CHANGED_MEMBER(DEVICE_SELF, vsmileb_state, pad_button_changed, vsmileb_state::BUTTON_RED) PORT_NAME("Red")
+ PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_BUTTON6 ) PORT_CHANGED_MEMBER(DEVICE_SELF, vsmileb_state, pad_button_changed, vsmileb_state::BUTTON_CLOUD) PORT_NAME("Cloud")
+ PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_BUTTON7 ) PORT_CHANGED_MEMBER(DEVICE_SELF, vsmileb_state, pad_button_changed, vsmileb_state::BUTTON_BALL) PORT_NAME("Ball")
+ PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_BUTTON8 ) PORT_CHANGED_MEMBER(DEVICE_SELF, vsmileb_state, pad_button_changed, vsmileb_state::BUTTON_EXIT) PORT_NAME("Exit")
+
+ PORT_START("MODE")
+ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("Play Time") PORT_CHANGED_MEMBER(DEVICE_SELF, vsmileb_state, sw_mode<0x0400>, nullptr) // three-position function switch
+ PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("Watch & Learn") PORT_CHANGED_MEMBER(DEVICE_SELF, vsmileb_state, sw_mode<0x0800>, nullptr)
+ PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("Learn & Explore") PORT_CHANGED_MEMBER(DEVICE_SELF, vsmileb_state, sw_mode<0x0c00>, nullptr)
+
+ PORT_START("LOGO")
+ PORT_DIPNAME( 0x10, 0x10, "VTech Intro" )
+ PORT_DIPSETTING( 0x00, DEF_STR(Off) )
+ PORT_DIPSETTING( 0x10, DEF_STR(On) )
+ PORT_BIT( 0xef, 0x00, IPT_UNUSED )
+INPUT_PORTS_END
+
+/************************************
+ *
+ * Machine Configs
+ *
+ ************************************/
+
+void vsmileb_state::vsmileb(machine_config &config)
+{
+ vsmile_base(config);
+
+ m_bankdev->set_addrmap(AS_PROGRAM, &vsmileb_state::banked_map);
+
+ SPG28X(config.replace(), m_spg, XTAL(27'000'000), m_maincpu, m_screen);
+ m_spg->chip_select().set(FUNC(vsmileb_state::chip_sel_w));
+ m_spg->add_route(ALL_OUTPUTS, "lspeaker", 0.5);
+ m_spg->add_route(ALL_OUTPUTS, "rspeaker", 0.5);
+ m_spg->porta_in().set(FUNC(vsmileb_state::porta_r));
+ m_spg->portb_in().set(FUNC(vsmileb_state::portb_r));
+
+ SOFTWARE_LIST(config, "cart_list").set_original("vsmileb_cart");
+}
+
+void vsmileb_state::vsmilebp(machine_config &config)
+{
+ vsmileb(config);
+ m_spg->set_pal(true);
+}
+
+/************************************
+ *
+ * ROM Loading
+ *
+ ************************************/
+
+// TODO: decide on a dump endian, these likely differ in endianess due to different dumping technqiues
+ROM_START( vsmileb )
+ ROM_REGION( 0x800000, "maincpu", ROMREGION_ERASEFF )
+ ROM_LOAD( "vbabybios.bin", 0x000000, 0x800000, CRC(ddc7f845) SHA1(2c17d0f54200070176d03d44a40c7923636e596a) )
+ROM_END
+
+ROM_START( vsmilebsw )
+ ROM_REGION( 0x800000, "maincpu", ROMREGION_ERASEFF )
+ ROM_LOAD16_WORD_SWAP( "vsmileswedenbios.bin", 0x000000, 0x800000, CRC(8b464b19) SHA1(cea304ba886c39e86906aad3dce17d5fff7cfcbe) )
+ROM_END
+
+// year, name, parent, compat, machine, input, class, init, company, fullname, flags
+CONS( 2005, vsmileb, 0, 0, vsmileb, vsmileb, vsmileb_state, empty_init, "VTech", "V.Smile Baby (US)", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS )
+CONS( 2005, vsmilebsw ,vsmileb, 0, vsmilebp,vsmileb, vsmileb_state, empty_init, "VTech", "V.Smile Baby (Sweden)", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS )
diff --git a/src/mame/drivers/vsmilepro.cpp b/src/mame/drivers/vsmilepro.cpp
index 60e2f628cfb..bf3d844dde7 100644
--- a/src/mame/drivers/vsmilepro.cpp
+++ b/src/mame/drivers/vsmilepro.cpp
@@ -52,16 +52,16 @@ void vsmilpro_state::vsmilpro_map(address_map &map)
static INPUT_PORTS_START( vsmilpro )
INPUT_PORTS_END
-MACHINE_CONFIG_START(vsmilpro_state::vsmilpro)
+void vsmilpro_state::vsmilpro(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", ARM9, 150000000)
- MCFG_DEVICE_PROGRAM_MAP(vsmilpro_map)
+ ARM9(config, m_maincpu, 150000000);
+ m_maincpu->set_addrmap(AS_PROGRAM, &vsmilpro_state::vsmilpro_map);
- MCFG_CDROM_ADD("cdrom")
- MCFG_CDROM_INTERFACE("vsmile_vdisk")
+ CDROM(config, "cdrom").set_interface("vsmile_vdisk");
- MCFG_SOFTWARE_LIST_ADD("cd_list","vsmile_cd")
-MACHINE_CONFIG_END
+ SOFTWARE_LIST(config, "cd_list").set_original("vsmile_cd");
+}
/* ROM definition */
ROM_START( vsmilpro )
diff --git a/src/mame/drivers/vsnes.cpp b/src/mame/drivers/vsnes.cpp
index d935b964e59..618e9df385a 100644
--- a/src/mame/drivers/vsnes.cpp
+++ b/src/mame/drivers/vsnes.cpp
@@ -276,9 +276,9 @@ void vsnes_state::vsnes_bootleg_z80_map(address_map &map)
map(0x6001, 0x6001).r(FUNC(vsnes_state::vsnes_bootleg_z80_address_r)); // ^
- map(0x60FA, 0x60FA).w("sn1", FUNC(sn76489_device::command_w));
- map(0x60F9, 0x60F9).w("sn2", FUNC(sn76489_device::command_w));
- map(0x60FF, 0x60FF).w("sn3", FUNC(sn76489_device::command_w));
+ map(0x60FA, 0x60FA).w("sn1", FUNC(sn76489_device::write));
+ map(0x60F9, 0x60F9).w("sn2", FUNC(sn76489_device::write));
+ map(0x60FF, 0x60FF).w("sn3", FUNC(sn76489_device::write));
}
diff --git a/src/mame/drivers/vt100.cpp b/src/mame/drivers/vt100.cpp
index 11ee97e72ff..3d3549a77db 100644
--- a/src/mame/drivers/vt100.cpp
+++ b/src/mame/drivers/vt100.cpp
@@ -89,18 +89,19 @@ private:
required_device<rst_pos_buffer_device> m_rstbuf;
required_device<rs232_port_device> m_rs232;
optional_device<ins8250_device> m_printer_uart;
- DECLARE_READ8_MEMBER(flags_r);
- DECLARE_WRITE8_MEMBER(baud_rate_w);
- DECLARE_READ8_MEMBER(modem_r);
- DECLARE_WRITE8_MEMBER(nvr_latch_w);
- DECLARE_READ8_MEMBER(printer_r);
- DECLARE_WRITE8_MEMBER(printer_w);
- DECLARE_READ8_MEMBER(video_ram_r);
- DECLARE_WRITE8_MEMBER(uart_clock_w);
- required_shared_ptr<uint8_t> m_p_ram;
+ required_shared_ptr<u8> m_p_ram;
+
+ u8 flags_r();
+ u8 modem_r();
+ void nvr_latch_w(u8 data);
+ u8 printer_r(offs_t offset);
+ void printer_w(offs_t offset, u8 data);
+ u8 video_ram_r(offs_t offset);
+ void uart_clock_w(u8 data);
+
virtual void machine_start() override;
virtual void machine_reset() override;
- uint32_t screen_update_vt100(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
+ u32 screen_update_vt100(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
IRQ_CALLBACK_MEMBER(vt102_irq_callback);
void vt100_mem(address_map &map);
void vt100_io(address_map &map);
@@ -148,9 +149,9 @@ void vt100_state::vt180_io(address_map &map)
// 5 - NVR data H
// 6 - LBA 7 H
// 7 - Keyboard TBMT H
-READ8_MEMBER(vt100_state::flags_r)
+u8 vt100_state::flags_r()
{
- uint8_t ret = 0;
+ u8 ret = 0;
ret |= m_pusart->txrdy_r();
ret |= !m_nvr->data_r() << 5;
@@ -159,9 +160,9 @@ READ8_MEMBER(vt100_state::flags_r)
return ret;
}
-READ8_MEMBER(vt100_state::modem_r)
+u8 vt100_state::modem_r()
{
- uint8_t ret = 0x0f;
+ u8 ret = 0x0f;
ret |= m_rs232->cts_r() << 7;
ret |= m_rs232->si_r() << 6;
@@ -171,7 +172,7 @@ READ8_MEMBER(vt100_state::modem_r)
return ret;
}
-WRITE8_MEMBER(vt100_state::nvr_latch_w)
+void vt100_state::nvr_latch_w(u8 data)
{
// data inverted due to negative logic
m_nvr->c3_w(!BIT(data, 3));
@@ -211,14 +212,14 @@ void vt100_state::vt100_io(address_map &map)
// map (0xe2, 0xe2)
}
-READ8_MEMBER(vt100_state::printer_r)
+u8 vt100_state::printer_r(offs_t offset)
{
- return m_printer_uart->ins8250_r(space, offset >> 2);
+ return m_printer_uart->ins8250_r(machine().dummy_space(), offset >> 2);
}
-WRITE8_MEMBER(vt100_state::printer_w)
+void vt100_state::printer_w(offs_t offset, u8 data)
{
- m_printer_uart->ins8250_w(space, offset >> 2, data);
+ m_printer_uart->ins8250_w(machine().dummy_space(), offset >> 2, data);
}
void vt100_state::vt102_io(address_map &map)
@@ -232,7 +233,7 @@ void vt100_state::vt102_io(address_map &map)
static INPUT_PORTS_START( vt100 )
INPUT_PORTS_END
-uint32_t vt100_state::screen_update_vt100(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
+u32 vt100_state::screen_update_vt100(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{
m_crtc->video_update(bitmap, cliprect);
return 0;
@@ -274,15 +275,15 @@ void vt100_state::machine_start()
void vt100_state::machine_reset()
{
- nvr_latch_w(machine().dummy_space(), 0, 0);
+ nvr_latch_w(0);
}
-READ8_MEMBER(vt100_state::video_ram_r)
+u8 vt100_state::video_ram_r(offs_t offset)
{
return m_p_ram[offset];
}
-WRITE8_MEMBER(vt100_state::uart_clock_w)
+void vt100_state::uart_clock_w(u8 data)
{
m_kbduart->write_tcp(BIT(data, 1));
m_kbduart->write_rcp(BIT(data, 1));
@@ -311,22 +312,23 @@ static GFXDECODE_START( gfx_vt100 )
GFXDECODE_ENTRY( "chargen", 0x0000, vt100_charlayout, 0, 1 )
GFXDECODE_END
-MACHINE_CONFIG_START(vt100_state::vt100)
+void vt100_state::vt100(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", I8080, XTAL(24'883'200) / 9)
- MCFG_DEVICE_PROGRAM_MAP(vt100_mem)
- MCFG_DEVICE_IO_MAP(vt100_io)
- MCFG_DEVICE_IRQ_ACKNOWLEDGE_DEVICE("rstbuf", rst_pos_buffer_device, inta_cb)
+ I8080(config, m_maincpu, XTAL(24'883'200) / 9);
+ m_maincpu->set_addrmap(AS_PROGRAM, &vt100_state::vt100_mem);
+ m_maincpu->set_addrmap(AS_IO, &vt100_state::vt100_io);
+ m_maincpu->set_irq_acknowledge_callback("rstbuf", FUNC(rst_pos_buffer_device::inta_cb));
/* video hardware */
- MCFG_SCREEN_ADD_MONOCHROME("screen", RASTER, rgb_t::green())
- MCFG_SCREEN_RAW_PARAMS(XTAL(24'073'400)*2/3, 102*10, 0, 80*10, 262, 0, 25*10)
- //MCFG_SCREEN_RAW_PARAMS(XTAL(24'073'400), 170*9, 0, 132*9, 262, 0, 25*10)
- MCFG_SCREEN_UPDATE_DRIVER(vt100_state, screen_update_vt100)
- MCFG_SCREEN_PALETTE("vt100_video:palette")
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER, rgb_t::green()));
+ screen.set_raw(XTAL(24'073'400)*2/3, 102*10, 0, 80*10, 262, 0, 25*10);
+ //screen.set_raw(XTAL(24'073'400), 170*9, 0, 132*9, 262, 0, 25*10);
+ screen.set_screen_update(FUNC(vt100_state::screen_update_vt100));
+ screen.set_palette("vt100_video:palette");
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "vt100_video:palette", gfx_vt100)
-// MCFG_PALETTE_ADD_MONOCHROME("palette")
+ GFXDECODE(config, "gfxdecode", "vt100_video:palette", gfx_vt100);
+// PALETTE(config, "palette", palette_device::MONOCHROME);
config.set_default_layout(layout_vt100);
@@ -361,7 +363,7 @@ MACHINE_CONFIG_START(vt100_state::vt100)
m_kbduart->set_auto_rdav(true);
RST_POS_BUFFER(config, m_rstbuf, 0).int_callback().set_inputline(m_maincpu, 0);
-MACHINE_CONFIG_END
+}
void vt100_state::stp_mem(address_map &map)
{
@@ -422,13 +424,14 @@ void vt100_state::vt180(machine_config &config)
z80cpu.set_io_map(&vt100_state::vt180_io);
}
-MACHINE_CONFIG_START(vt100_state::vt101)
+void vt100_state::vt101(machine_config &config)
+{
vt100(config);
- MCFG_DEVICE_REPLACE(m_maincpu, I8085A, XTAL(24'073'400) / 4)
- MCFG_DEVICE_PROGRAM_MAP(vt100_mem)
- MCFG_DEVICE_IO_MAP(vt100_io)
- MCFG_DEVICE_IRQ_ACKNOWLEDGE_DRIVER(vt100_state, vt102_irq_callback)
+ I8085A(config.replace(), m_maincpu, XTAL(24'073'400) / 4);
+ m_maincpu->set_addrmap(AS_PROGRAM, &vt100_state::vt100_mem);
+ m_maincpu->set_addrmap(AS_IO, &vt100_state::vt100_io);
+ m_maincpu->set_irq_acknowledge_callback(FUNC(vt100_state::vt102_irq_callback));
m_pusart->set_clock(XTAL(24'073'400) / 8);
m_pusart->txrdy_handler().set_inputline(m_maincpu, I8085_RST55_LINE); // 8085 pin 9, mislabeled RST 7.5 on schematics
@@ -438,13 +441,13 @@ MACHINE_CONFIG_START(vt100_state::vt101)
dbrg.ft_handler().set(m_pusart, FUNC(i8251_device::write_txc));
m_kbduart->write_tbmt_callback().set_inputline(m_maincpu, I8085_RST65_LINE);
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(vt100_state::vt102)
+void vt100_state::vt102(machine_config &config)
+{
vt101(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_IO_MAP(vt102_io)
+ m_maincpu->set_addrmap(AS_IO, &vt100_state::vt102_io);
ins8250_device &printuart(INS8250(config, "printuart", XTAL(24'073'400) / 16));
printuart.out_tx_callback().set("printer", FUNC(rs232_port_device::write_txd));
@@ -453,7 +456,7 @@ MACHINE_CONFIG_START(vt100_state::vt102)
rs232_port_device &printer(RS232_PORT(config, "printer", default_rs232_devices, nullptr));
printer.rxd_handler().set("printuart", FUNC(ins8250_device::rx_w));
printer.dsr_handler().set("printuart", FUNC(ins8250_device::dsr_w));
-MACHINE_CONFIG_END
+}
/* VT1xx models:
* VT100 - 1978 base model. the 'later' ROM is from 1979 or 1980.
diff --git a/src/mame/drivers/vt220.cpp b/src/mame/drivers/vt220.cpp
index 60a8766d649..107f832e41c 100644
--- a/src/mame/drivers/vt220.cpp
+++ b/src/mame/drivers/vt220.cpp
@@ -134,12 +134,12 @@ void vt220_state::vt220(machine_config &config)
RAM(config, RAM_TAG).set_default_size("16K");
}
-MACHINE_CONFIG_START(vt220_state::vt220a)
+void vt220_state::vt220a(machine_config &config)
+{
vt220(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(vt220a_mem)
- MCFG_DEVICE_IO_MAP(vt220a_io)
-MACHINE_CONFIG_END
+ m_maincpu->set_addrmap(AS_PROGRAM, &vt220_state::vt220a_mem);
+ m_maincpu->set_addrmap(AS_IO, &vt220_state::vt220a_io);
+}
/* ROM definitions */
ROM_START(vt220)
diff --git a/src/mame/drivers/vt240.cpp b/src/mame/drivers/vt240.cpp
index acb5a0b7141..c2d9295884b 100644
--- a/src/mame/drivers/vt240.cpp
+++ b/src/mame/drivers/vt240.cpp
@@ -23,17 +23,6 @@
#include "screen.h"
-#define VERBOSE_DBG 0 /* general debug messages */
-
-#define DBG_LOG(N,M,A) \
- do { \
- if(VERBOSE_DBG>=N) \
- { \
- logerror("%11.6f at %s: ",machine().time().as_double(),machine().describe_context()); \
- logerror A; \
- } \
- } while (0)
-
class vt240_state : public driver_device
{
public:
@@ -106,8 +95,8 @@ private:
DECLARE_WRITE8_MEMBER(lu_w);
DECLARE_WRITE8_MEMBER(hbscrl_w);
DECLARE_WRITE8_MEMBER(lbscrl_w);
- DECLARE_READ16_MEMBER(mem_r);
- DECLARE_WRITE16_MEMBER(mem_w);
+ uint16_t mem_r(offs_t offset, uint16_t mem_mask);
+ void mem_w(offs_t offset, uint16_t data, uint16_t mem_mask);
void init_vt240();
virtual void machine_reset() override;
@@ -321,23 +310,23 @@ WRITE8_MEMBER(vt240_state::mem_map_sel_w)
m_mem_map_sel = data & 1;
}
-READ16_MEMBER(vt240_state::mem_r)
+uint16_t vt240_state::mem_r(offs_t offset, uint16_t mem_mask)
{
if(m_mem_map_sel)
{
m_bank->set_bank(m_mem_map[(offset >> 11) & 0xf]);
- return m_bank->read16(space, offset & 0x7ff, mem_mask);
+ return m_bank->read16(offset & 0x7ff, mem_mask);
}
else
return m_rom[offset];
}
-WRITE16_MEMBER(vt240_state::mem_w)
+void vt240_state::mem_w(offs_t offset, uint16_t data, uint16_t mem_mask)
{
if(m_mem_map_sel)
{
m_bank->set_bank(m_mem_map[(offset >> 11) & 0xf]);
- m_bank->write16(space, offset & 0x7ff, data, mem_mask);
+ m_bank->write16(offset & 0x7ff, data, mem_mask);
}
}
@@ -678,7 +667,7 @@ void vt240_state::vt240(machine_config &config)
UPD7220(config, m_hgdc, XTAL(16'097'280) / 16); // actually /8?
m_hgdc->set_addrmap(0, &vt240_state::upd7220_map);
- m_hgdc->set_display_pixels_callback(FUNC(vt240_state::hgdc_draw), this);
+ m_hgdc->set_display_pixels(FUNC(vt240_state::hgdc_draw));
m_hgdc->vsync_wr_callback().set_inputline(m_i8085, I8085_RST75_LINE);
m_hgdc->blank_wr_callback().set_inputline(m_i8085, I8085_RST55_LINE);
m_hgdc->set_screen("screen");
diff --git a/src/mame/drivers/vt320.cpp b/src/mame/drivers/vt320.cpp
index c4edac1793b..0a9443ae540 100644
--- a/src/mame/drivers/vt320.cpp
+++ b/src/mame/drivers/vt320.cpp
@@ -92,27 +92,27 @@ uint32_t vt320_state::screen_update_vt320(screen_device &screen, bitmap_ind16 &b
}
-MACHINE_CONFIG_START(vt320_state::vt320)
+void vt320_state::vt320(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", I8051, XTAL(16'000'000))
- MCFG_DEVICE_PROGRAM_MAP(vt320_mem)
- MCFG_DEVICE_IO_MAP(vt320_io)
-
+ I8051(config, m_maincpu, XTAL(16'000'000));
+ m_maincpu->set_addrmap(AS_PROGRAM, &vt320_state::vt320_mem);
+ m_maincpu->set_addrmap(AS_IO, &vt320_state::vt320_io);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(50)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */
- MCFG_SCREEN_SIZE(640, 480)
- MCFG_SCREEN_VISIBLE_AREA(0, 640-1, 0, 480-1)
- MCFG_SCREEN_UPDATE_DRIVER(vt320_state, screen_update_vt320)
- MCFG_SCREEN_PALETTE("palette")
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(50);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */
+ screen.set_size(640, 480);
+ screen.set_visarea(0, 640-1, 0, 480-1);
+ screen.set_screen_update(FUNC(vt320_state::screen_update_vt320));
+ screen.set_palette("palette");
PALETTE(config, "palette", palette_device::MONOCHROME);
/* internal ram */
RAM(config, RAM_TAG).set_default_size("16K");
-MACHINE_CONFIG_END
+}
/* ROM definition */
ROM_START( vt320 )
diff --git a/src/mame/drivers/vt520.cpp b/src/mame/drivers/vt520.cpp
index ff8e6d3df22..5d0d853938e 100644
--- a/src/mame/drivers/vt520.cpp
+++ b/src/mame/drivers/vt520.cpp
@@ -85,38 +85,40 @@ uint32_t vt520_state::screen_update_vt520(screen_device &screen, bitmap_ind16 &b
return 0;
}
-MACHINE_CONFIG_START(vt520_state::vt420)
+void vt520_state::vt420(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", I80C31, XTAL(43'320'000) / 3) // SCN8031HCFN40 (divider not verified)
- MCFG_DEVICE_PROGRAM_MAP(vt520_mem)
- MCFG_DEVICE_IO_MAP(vt520_io)
+ I80C31(config, m_maincpu, XTAL(43'320'000) / 3); // SCN8031HCFN40 (divider not verified)
+ m_maincpu->set_addrmap(AS_PROGRAM, &vt520_state::vt520_mem);
+ m_maincpu->set_addrmap(AS_IO, &vt520_state::vt520_io);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(50)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */
- MCFG_SCREEN_SIZE(802, 480)
- MCFG_SCREEN_VISIBLE_AREA(0, 802-1, 0, 480-1)
- MCFG_SCREEN_UPDATE_DRIVER(vt520_state, screen_update_vt520)
- MCFG_SCREEN_PALETTE("palette")
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(50);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */
+ screen.set_size(802, 480);
+ screen.set_visarea(0, 802-1, 0, 480-1);
+ screen.set_screen_update(FUNC(vt520_state::screen_update_vt520));
+ screen.set_palette("palette");
PALETTE(config, "palette", palette_device::MONOCHROME);
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(vt520_state::vt520)
+void vt520_state::vt520(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", I80C32, XTAL(20'000'000)) // Philips P80C32IBPN
- MCFG_DEVICE_PROGRAM_MAP(vt520_mem)
- MCFG_DEVICE_IO_MAP(vt520_io)
+ I80C32(config, m_maincpu, XTAL(20'000'000)); // Philips P80C32IBPN
+ m_maincpu->set_addrmap(AS_PROGRAM, &vt520_state::vt520_mem);
+ m_maincpu->set_addrmap(AS_IO, &vt520_state::vt520_io);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(50)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */
- MCFG_SCREEN_SIZE(802, 480)
- MCFG_SCREEN_VISIBLE_AREA(0, 802-1, 0, 480-1)
- MCFG_SCREEN_UPDATE_DRIVER(vt520_state, screen_update_vt520)
- MCFG_SCREEN_PALETTE("palette")
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(50);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */
+ screen.set_size(802, 480);
+ screen.set_visarea(0, 802-1, 0, 480-1);
+ screen.set_screen_update(FUNC(vt520_state::screen_update_vt520));
+ screen.set_palette("palette");
PALETTE(config, "palette", palette_device::MONOCHROME);
@@ -124,7 +126,7 @@ MACHINE_CONFIG_START(vt520_state::vt520)
// Which are DRAM 256K x 4bit
/* internal ram */
RAM(config, RAM_TAG).set_default_size("256K");
-MACHINE_CONFIG_END
+}
/**************************************************************************************************************
diff --git a/src/mame/drivers/vta2000.cpp b/src/mame/drivers/vta2000.cpp
index 1dc60d4816e..a243bbaa29d 100644
--- a/src/mame/drivers/vta2000.cpp
+++ b/src/mame/drivers/vta2000.cpp
@@ -188,12 +188,13 @@ void vta2000_state::vta2000_palette(palette_device &palette) const
palette.set_pen_color(2, 0x00, 0xff, 0x00); // highlight
}
-MACHINE_CONFIG_START(vta2000_state::vta2000)
+void vta2000_state::vta2000(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD(m_maincpu, I8080, XTAL(4'000'000) / 4)
- MCFG_DEVICE_PROGRAM_MAP(mem_map)
- MCFG_DEVICE_IO_MAP(io_map)
- MCFG_DEVICE_IRQ_ACKNOWLEDGE_DEVICE("pic", pic8259_device, inta_cb)
+ I8080(config, m_maincpu, XTAL(4'000'000) / 4);
+ m_maincpu->set_addrmap(AS_PROGRAM, &vta2000_state::mem_map);
+ m_maincpu->set_addrmap(AS_IO, &vta2000_state::io_map);
+ m_maincpu->set_irq_acknowledge_callback("pic", FUNC(pic8259_device::inta_cb));
PIT8253(config, m_mainpit, 0);
m_mainpit->set_clk<0>(500'000);
@@ -213,20 +214,20 @@ MACHINE_CONFIG_START(vta2000_state::vta2000)
brgpit.out_handler<1>().set("usart", FUNC(i8251_device::write_txc)); // or vice versa?
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(50)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */
- MCFG_SCREEN_SIZE(80*8, 25*12)
- MCFG_SCREEN_VISIBLE_AREA(0, 80*8-1, 0, 25*12-1)
- MCFG_SCREEN_UPDATE_DRIVER(vta2000_state, screen_update_vta2000)
- MCFG_SCREEN_PALETTE("palette")
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(50);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */
+ screen.set_size(80*8, 25*12);
+ screen.set_visarea(0, 80*8-1, 0, 25*12-1);
+ screen.set_screen_update(FUNC(vta2000_state::screen_update_vta2000));
+ screen.set_palette("palette");
PALETTE(config, "palette", FUNC(vta2000_state::vta2000_palette), 3);
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_vta2000)
+ GFXDECODE(config, "gfxdecode", "palette", gfx_vta2000);
SPEAKER(config, "mono").front_center();
SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.5);
-MACHINE_CONFIG_END
+}
/* ROM definition */
diff --git a/src/mame/drivers/vtech1.cpp b/src/mame/drivers/vtech1.cpp
index 24ffbd671da..05b3252abc6 100644
--- a/src/mame/drivers/vtech1.cpp
+++ b/src/mame/drivers/vtech1.cpp
@@ -83,7 +83,6 @@ public:
void laser110(machine_config &config);
void laser210(machine_config &config);
- void init_vtech1();
void init_vtech1h();
private:
@@ -280,18 +279,8 @@ READ8_MEMBER( vtech1_state::mc6847_videoram_r )
DRIVER INIT
***************************************************************************/
-void vtech1_state::init_vtech1()
-{
- // setup expansion slots
- m_ioexp->set_io_space(&m_maincpu->space(AS_IO));
- m_memexp->set_program_space(&m_maincpu->space(AS_PROGRAM));
- m_memexp->set_io_space(&m_maincpu->space(AS_IO));
-}
-
void vtech1_state::init_vtech1h()
{
- init_vtech1();
-
// the SHRG mod replaces the standard videoram chip with an 8k chip
m_videoram.allocate(0x2000);
@@ -445,14 +434,16 @@ void vtech1_state::laser110(machine_config &config)
// video hardware
MC6847_PAL(config, m_mc6847, XTAL(4'433'619));
+ m_mc6847->set_screen("screen");
m_mc6847->fsync_wr_callback().set_inputline(m_maincpu, 0).invert();
m_mc6847->input_callback().set(FUNC(vtech1_state::mc6847_videoram_r));
m_mc6847->set_black_and_white(true);
m_mc6847->set_get_fixed_mode(mc6847_pal_device::MODE_GM1);
- mc6847_base_device::add_pal_screen(config, "screen", "mc6847");
// GM2 = GND, GM0 = GND, INTEXT = GND
// other lines not connected
+ SCREEN(config, "screen", SCREEN_TYPE_RASTER);
+
// sound hardware
SPEAKER(config, "mono").front_center();
WAVE(config, "wave", m_cassette).add_route(ALL_OUTPUTS, "mono", 0.25);
@@ -461,11 +452,14 @@ void vtech1_state::laser110(machine_config &config)
// peripheral and memory expansion slots
VTECH_IOEXP_SLOT(config, m_ioexp);
+ m_ioexp->set_io_space(m_maincpu, AS_IO);
VTECH_MEMEXP_SLOT(config, m_memexp);
+ m_memexp->set_program_space(m_maincpu, AS_PROGRAM);
+ m_memexp->set_io_space(m_maincpu, AS_IO);
// snapshot
snapshot_image_device &snapshot(SNAPSHOT(config, "snapshot", 0));
- snapshot.set_handler(snapquick_load_delegate(&SNAPSHOT_LOAD_NAME(vtech1_state, vtech1), this), "vz", 1.5);
+ snapshot.set_handler(snapquick_load_delegate(&SNAPSHOT_LOAD_NAME(vtech1_state, vtech1), this), "vz", attotime::from_double(1.5));
CASSETTE(config, m_cassette);
m_cassette->set_formats(vtech1_cassette_formats);
@@ -479,6 +473,7 @@ void vtech1_state::laser200(machine_config &config)
{
laser110(config);
MC6847_PAL(config.replace(), m_mc6847, XTAL(4'433'619));
+ m_mc6847->set_screen("screen");
m_mc6847->fsync_wr_callback().set_inputline(m_maincpu, 0).invert();
m_mc6847->input_callback().set(FUNC(vtech1_state::mc6847_videoram_r));
m_mc6847->set_get_fixed_mode(mc6847_pal_device::MODE_GM1);
@@ -506,6 +501,7 @@ void vtech1_state::laser310h(machine_config &config)
m_maincpu->set_addrmap(AS_IO, &vtech1_state::vtech1_shrg_io);
MC6847_PAL(config.replace(), m_mc6847, XTAL(4'433'619));
+ m_mc6847->set_screen("screen");
m_mc6847->fsync_wr_callback().set_inputline(m_maincpu, 0).invert();
m_mc6847->input_callback().set(FUNC(vtech1_state::mc6847_videoram_r));
m_mc6847->set_get_fixed_mode(mc6847_pal_device::MODE_GM1);
@@ -570,13 +566,13 @@ ROM_END
***************************************************************************/
// YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS
-COMP( 1983, laser110, 0, 0, laser110, vtech1, vtech1_state, init_vtech1, "Video Technology", "Laser 110", 0 )
-COMP( 1983, laser200, 0, 0, laser200, vtech1, vtech1_state, init_vtech1, "Video Technology", "Laser 200", 0 )
-COMP( 1983, vz200de, laser200, 0, laser200, vtech1, vtech1_state, init_vtech1, "Video Technology", "VZ-200 (Germany & Netherlands)", MACHINE_NOT_WORKING )
-COMP( 1983, fellow, laser200, 0, laser200, vtech1, vtech1_state, init_vtech1, "Salora", "Fellow (Finland)", 0 )
-COMP( 1983, tx8000, laser200, 0, laser200, vtech1, vtech1_state, init_vtech1, "Texet", "TX-8000 (UK)", 0 )
-COMP( 1984, laser210, 0, 0, laser210, vtech1, vtech1_state, init_vtech1, "Video Technology", "Laser 210", 0 )
-COMP( 1984, vz200, laser210, 0, laser210, vtech1, vtech1_state, init_vtech1, "Dick Smith Electronics", "VZ-200 (Oceania)", 0 )
-COMP( 1984, laser310, 0, 0, laser310, vtech1, vtech1_state, init_vtech1, "Video Technology", "Laser 310", 0 )
-COMP( 1984, vz300, laser310, 0, laser310, vtech1, vtech1_state, init_vtech1, "Dick Smith Electronics", "VZ-300 (Oceania)", 0 )
+COMP( 1983, laser110, 0, 0, laser110, vtech1, vtech1_state, empty_init, "Video Technology", "Laser 110", 0 )
+COMP( 1983, laser200, 0, 0, laser200, vtech1, vtech1_state, empty_init, "Video Technology", "Laser 200", 0 )
+COMP( 1983, vz200de, laser200, 0, laser200, vtech1, vtech1_state, empty_init, "Video Technology", "VZ-200 (Germany & Netherlands)", MACHINE_NOT_WORKING )
+COMP( 1983, fellow, laser200, 0, laser200, vtech1, vtech1_state, empty_init, "Salora", "Fellow (Finland)", 0 )
+COMP( 1983, tx8000, laser200, 0, laser200, vtech1, vtech1_state, empty_init, "Texet", "TX-8000 (UK)", 0 )
+COMP( 1984, laser210, 0, 0, laser210, vtech1, vtech1_state, empty_init, "Video Technology", "Laser 210", 0 )
+COMP( 1984, vz200, laser210, 0, laser210, vtech1, vtech1_state, empty_init, "Dick Smith Electronics", "VZ-200 (Oceania)", 0 )
+COMP( 1984, laser310, 0, 0, laser310, vtech1, vtech1_state, empty_init, "Video Technology", "Laser 310", 0 )
+COMP( 1984, vz300, laser310, 0, laser310, vtech1, vtech1_state, empty_init, "Dick Smith Electronics", "VZ-300 (Oceania)", 0 )
COMP( 1984, laser310h, laser310, 0, laser310h, vtech1, vtech1_state, init_vtech1h, "Video Technology", "Laser 310 (SHRG)", MACHINE_UNOFFICIAL )
diff --git a/src/mame/drivers/vtech2.cpp b/src/mame/drivers/vtech2.cpp
index 4c27fdaa769..6f724b3f2f4 100644
--- a/src/mame/drivers/vtech2.cpp
+++ b/src/mame/drivers/vtech2.cpp
@@ -486,11 +486,11 @@ static const floppy_interface vtech2_floppy_interface =
MACHINE_CONFIG_START(vtech2_state::laser350)
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, 3694700) /* 3.694700 MHz */
- MCFG_DEVICE_PROGRAM_MAP(mem_map)
- MCFG_DEVICE_IO_MAP(io_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", vtech2_state, vtech2_interrupt)
- MCFG_QUANTUM_TIME(attotime::from_hz(60))
+ Z80(config, m_maincpu, 3694700); /* 3.694700 MHz */
+ m_maincpu->set_addrmap(AS_PROGRAM, &vtech2_state::mem_map);
+ m_maincpu->set_addrmap(AS_IO, &vtech2_state::io_map);
+ m_maincpu->set_vblank_int("screen", FUNC(vtech2_state::vtech2_interrupt));
+ config.m_minimum_quantum = attotime::from_hz(60);
ADDRESS_MAP_BANK(config, "banka").set_map(&vtech2_state::m_map350).set_options(ENDIANNESS_LITTLE, 8, 18, 0x4000);
ADDRESS_MAP_BANK(config, "bankb").set_map(&vtech2_state::m_map350).set_options(ENDIANNESS_LITTLE, 8, 18, 0x4000);
@@ -498,27 +498,27 @@ MACHINE_CONFIG_START(vtech2_state::laser350)
ADDRESS_MAP_BANK(config, "bankd").set_map(&vtech2_state::m_map350).set_options(ENDIANNESS_LITTLE, 8, 18, 0x4000);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(50)
- MCFG_SCREEN_VBLANK_TIME(0)
- MCFG_SCREEN_SIZE(88*8, 24*8+32)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 88*8-1, 0*8, 24*8+32-1)
- MCFG_SCREEN_UPDATE_DRIVER(vtech2_state, screen_update_laser)
- MCFG_SCREEN_PALETTE(m_palette)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(50);
+ screen.set_vblank_time(0);
+ screen.set_size(88*8, 24*8+32);
+ screen.set_visarea(0*8, 88*8-1, 0*8, 24*8+32-1);
+ screen.set_screen_update(FUNC(vtech2_state::screen_update_laser));
+ screen.set_palette(m_palette);
GFXDECODE(config, m_gfxdecode, m_palette, gfx_vtech2);
PALETTE(config, m_palette, FUNC(vtech2_state::vtech2_palette), 512 + 16, 16);
/* sound hardware */
SPEAKER(config, "mono").front_center();
- WAVE(config, "wave", "cassette").add_route(ALL_OUTPUTS, "mono", 0.25);
+ WAVE(config, "wave", m_cassette).add_route(ALL_OUTPUTS, "mono", 0.25);
SPEAKER_SOUND(config, "speaker").add_route(ALL_OUTPUTS, "mono", 0.75);
- MCFG_CASSETTE_ADD( "cassette" )
- MCFG_CASSETTE_FORMATS(vtech2_cassette_formats)
- MCFG_CASSETTE_DEFAULT_STATE(CASSETTE_PLAY)
+ CASSETTE(config, m_cassette);
+ m_cassette->set_formats(vtech2_cassette_formats);
+ m_cassette->set_default_state(CASSETTE_PLAY);
- VTECH_IOEXP_SLOT(config, "io");
+ VTECH_IOEXP_SLOT(config, "io").set_io_space(m_maincpu, AS_IO);
/* cartridge */
MCFG_GENERIC_CARTSLOT_ADD("cartslot", generic_plain_slot, "vtech_cart")
@@ -526,7 +526,7 @@ MACHINE_CONFIG_START(vtech2_state::laser350)
MCFG_GENERIC_LOAD(vtech2_state, cart_load)
/* 5.25" Floppy drive */
- MCFG_LEGACY_FLOPPY_DRIVE_ADD( FLOPPY_0, vtech2_floppy_interface )
+ LEGACY_FLOPPY(config, FLOPPY_0, 0, &vtech2_floppy_interface);
MACHINE_CONFIG_END
@@ -541,7 +541,8 @@ void vtech2_state::laser500(machine_config &config)
}
-MACHINE_CONFIG_START(vtech2_state::laser700)
+void vtech2_state::laser700(machine_config &config)
+{
laser350(config);
ADDRESS_MAP_BANK(config.replace(), "banka").set_map(&vtech2_state::m_map700).set_options(ENDIANNESS_LITTLE, 8, 18, 0x4000);
@@ -550,8 +551,8 @@ MACHINE_CONFIG_START(vtech2_state::laser700)
ADDRESS_MAP_BANK(config.replace(), "bankd").set_map(&vtech2_state::m_map700).set_options(ENDIANNESS_LITTLE, 8, 18, 0x4000);
/* Second 5.25" floppy drive */
- MCFG_LEGACY_FLOPPY_DRIVE_ADD( FLOPPY_1, vtech2_floppy_interface )
-MACHINE_CONFIG_END
+ LEGACY_FLOPPY(config, FLOPPY_1, 0, &vtech2_floppy_interface);
+ }
ROM_START(laser350)
diff --git a/src/mame/drivers/vtech_eu3a12.cpp b/src/mame/drivers/vtech_eu3a12.cpp
index d398bb6747a..e2a8a59240c 100644
--- a/src/mame/drivers/vtech_eu3a12.cpp
+++ b/src/mame/drivers/vtech_eu3a12.cpp
@@ -27,18 +27,18 @@ uint32_t vreadere_state::screen_update(screen_device &screen, bitmap_rgb32 &bitm
static INPUT_PORTS_START( vreadere )
INPUT_PORTS_END
-MACHINE_CONFIG_START(vreadere_state::vreadere)
- /* basic machine hardware */
- // MCFG_DEVICE_ADD("maincpu", unknown, unknown) // CPU type is unknown, epoxy blob
+void vreadere_state::vreadere(machine_config &config)
+{
+ // UNKNOWN(config, "maincpu", unknown); // CPU type is unknown, epoxy blob
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(50)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */
- MCFG_SCREEN_SIZE(512, 256)
- MCFG_SCREEN_VISIBLE_AREA(0, 512-1, 0, 256-1)
- MCFG_SCREEN_UPDATE_DRIVER( vreadere_state, screen_update )
-MACHINE_CONFIG_END
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(50);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */
+ screen.set_size(512, 256);
+ screen.set_visarea(0, 512-1, 0, 256-1);
+ screen.set_screen_update(FUNC(vreadere_state::screen_update));
+}
ROM_START( vreadere )
ROM_REGION(0x400000, "maincpu", 0)
diff --git a/src/mame/drivers/vtech_unk1.cpp b/src/mame/drivers/vtech_unk1.cpp
index 3e317da3cd5..8f6310fb762 100644
--- a/src/mame/drivers/vtech_unk1.cpp
+++ b/src/mame/drivers/vtech_unk1.cpp
@@ -66,18 +66,19 @@ uint32_t gl8008cx_state::screen_update(screen_device &screen, bitmap_rgb32 &bitm
static INPUT_PORTS_START( gl8008cx )
INPUT_PORTS_END
-MACHINE_CONFIG_START(gl8008cx_state::gl8008cx)
+void gl8008cx_state::gl8008cx(machine_config &config)
+{
/* basic machine hardware */
- // MCFG_DEVICE_ADD("maincpu", unknown, unknown) // CPU type is unknown, epoxy blob
+ // UNKNOWN(config, "maincpu", unknown); // CPU type is unknown, epoxy blob
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(50)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */
- MCFG_SCREEN_SIZE(512, 256)
- MCFG_SCREEN_VISIBLE_AREA(0, 512-1, 0, 256-1)
- MCFG_SCREEN_UPDATE_DRIVER( gl8008cx_state, screen_update )
-MACHINE_CONFIG_END
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(50);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */
+ screen.set_size(512, 256);
+ screen.set_visarea(0, 512-1, 0, 256-1);
+ screen.set_screen_update(FUNC(gl8008cx_state::screen_update));
+}
ROM_START( gl8008cx )
ROM_REGION(0x200000, "maincpu", 0)
diff --git a/src/mame/drivers/vtech_unk2.cpp b/src/mame/drivers/vtech_unk2.cpp
index 8178e02b5cb..bd8ebe47add 100644
--- a/src/mame/drivers/vtech_unk2.cpp
+++ b/src/mame/drivers/vtech_unk2.cpp
@@ -27,18 +27,19 @@ uint32_t glmmc_state::screen_update(screen_device &screen, bitmap_rgb32 &bitmap,
static INPUT_PORTS_START( glmmc )
INPUT_PORTS_END
-MACHINE_CONFIG_START(glmmc_state::glmmc)
+void glmmc_state::glmmc(machine_config &config)
+{
/* basic machine hardware */
- // MCFG_DEVICE_ADD("maincpu", unknown, unknown) // CPU type is unknown, epoxy blob
+ // UNKNOWN(config, "maincpu", unknown); // CPU type is unknown, epoxy blob
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(50)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */
- MCFG_SCREEN_SIZE(512, 256)
- MCFG_SCREEN_VISIBLE_AREA(0, 512-1, 0, 256-1)
- MCFG_SCREEN_UPDATE_DRIVER( glmmc_state, screen_update )
-MACHINE_CONFIG_END
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(50);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */
+ screen.set_size(512, 256);
+ screen.set_visarea(0, 512-1, 0, 256-1);
+ screen.set_screen_update(FUNC(glmmc_state::screen_update));
+}
ROM_START( glmmc )
ROM_REGION(0x200000, "maincpu", 0)
diff --git a/src/mame/drivers/vulgus.cpp b/src/mame/drivers/vulgus.cpp
index eca7adde124..b0ca52d0c8d 100644
--- a/src/mame/drivers/vulgus.cpp
+++ b/src/mame/drivers/vulgus.cpp
@@ -216,27 +216,27 @@ GFXDECODE_END
-MACHINE_CONFIG_START(vulgus_state::vulgus)
-
+void vulgus_state::vulgus(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, XTAL(12'000'000)/4) /* 3 MHz */
- MCFG_DEVICE_PROGRAM_MAP(main_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", vulgus_state, vblank_irq)
+ Z80(config, m_maincpu, XTAL(12'000'000)/4); /* 3 MHz */
+ m_maincpu->set_addrmap(AS_PROGRAM, &vulgus_state::main_map);
+ m_maincpu->set_vblank_int("screen", FUNC(vulgus_state::vblank_irq));
- MCFG_DEVICE_ADD("audiocpu", Z80, XTAL(12'000'000)/4) /* 3 MHz */
- MCFG_DEVICE_PROGRAM_MAP(sound_map)
- MCFG_DEVICE_PERIODIC_INT_DRIVER(vulgus_state, irq0_line_hold, 8*60)
+ Z80(config, m_audiocpu, XTAL(12'000'000)/4); /* 3 MHz */
+ m_audiocpu->set_addrmap(AS_PROGRAM, &vulgus_state::sound_map);
+ m_audiocpu->set_periodic_int(FUNC(vulgus_state::irq0_line_hold), attotime::from_hz(8*60));
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(59.59)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(32*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(vulgus_state, screen_update)
- MCFG_SCREEN_PALETTE(m_palette)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(59.59);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(32*8, 32*8);
+ screen.set_visarea(0*8, 32*8-1, 2*8, 30*8-1);
+ screen.set_screen_update(FUNC(vulgus_state::screen_update));
+ screen.set_palette(m_palette);
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, m_palette, gfx_vulgus)
+ GFXDECODE(config, m_gfxdecode, m_palette, gfx_vulgus);
PALETTE(config, m_palette, FUNC(vulgus_state::vulgus_palette), 64*4+16*16+4*32*8, 256);
@@ -248,7 +248,7 @@ MACHINE_CONFIG_START(vulgus_state::vulgus)
AY8910(config, "ay1", XTAL(12'000'000)/8).add_route(ALL_OUTPUTS, "mono", 0.25); /* 1.5 MHz */
AY8910(config, "ay2", XTAL(12'000'000)/8).add_route(ALL_OUTPUTS, "mono", 0.25); /* 1.5 MHz */
-MACHINE_CONFIG_END
+}
diff --git a/src/mame/drivers/wacky_gator.cpp b/src/mame/drivers/wacky_gator.cpp
index 9b5939616f9..4859b884b5e 100644
--- a/src/mame/drivers/wacky_gator.cpp
+++ b/src/mame/drivers/wacky_gator.cpp
@@ -281,26 +281,26 @@ void wackygtr_state::program_map(address_map &map)
map(0x8000, 0xffff).rom();
}
-MACHINE_CONFIG_START(wackygtr_state::wackygtr)
-
- MCFG_DEVICE_ADD("maincpu", MC6809, XTAL(3'579'545)) // HD68B09P
- MCFG_DEVICE_PROGRAM_MAP(program_map)
- MCFG_DEVICE_PERIODIC_INT_DRIVER(wackygtr_state, irq0_line_assert, 50) // FIXME
+void wackygtr_state::wackygtr(machine_config &config)
+{
+ MC6809(config, m_maincpu, XTAL(3'579'545)); // HD68B09P
+ m_maincpu->set_addrmap(AS_PROGRAM, &wackygtr_state::program_map);
+ m_maincpu->set_periodic_int(FUNC(wackygtr_state::irq0_line_assert), attotime::from_hz(50)); // FIXME
- MCFG_TIMER_DRIVER_ADD_PERIODIC("nmi_timer", wackygtr_state, nmi_timer, attotime::from_hz(100)) // FIXME
+ TIMER(config, "nmi_timer").configure_periodic(FUNC(wackygtr_state::nmi_timer), attotime::from_hz(100)); // FIXME
/* Video */
config.set_default_layout(layout_wackygtr);
/* Sound */
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("msm", MSM5205, XTAL(384'000) )
- MCFG_MSM5205_VCLK_CB(WRITELINE(*this, wackygtr_state, adpcm_int)) /* IRQ handler */
- MCFG_MSM5205_PRESCALER_SELECTOR(S48_4B) /* 8 KHz, 4 Bits */
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
+ MSM5205(config, m_msm, XTAL(384'000));
+ m_msm->vck_legacy_callback().set(FUNC(wackygtr_state::adpcm_int)); /* IRQ handler */
+ m_msm->set_prescaler_selector(msm5205_device::S48_4B); /* 8 KHz, 4 Bits */
+ m_msm->add_route(ALL_OUTPUTS, "mono", 1.0);
- MCFG_DEVICE_ADD("ymsnd", YM2413, XTAL(3'579'545) )
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
+ ym2413_device &ymsnd(YM2413(config, "ymsnd", XTAL(3'579'545)));
+ ymsnd.add_route(ALL_OUTPUTS, "mono", 1.0);
i8255_device &ppi0(I8255(config, "i8255_0"));
ppi0.out_pa_callback().set(FUNC(wackygtr_state::status_lamps_w));
@@ -333,8 +333,8 @@ MACHINE_CONFIG_START(wackygtr_state::wackygtr)
m_pit8253[1]->set_clk<2>(XTAL(3'579'545)/16); // this is a guess
m_pit8253[1]->out_handler<2>().set(FUNC(wackygtr_state::alligator_ck<4>));
- MCFG_TICKET_DISPENSER_ADD("ticket", attotime::from_msec(200), TICKET_MOTOR_ACTIVE_HIGH, TICKET_STATUS_ACTIVE_HIGH)
-MACHINE_CONFIG_END
+ TICKET_DISPENSER(config, "ticket", attotime::from_msec(200), TICKET_MOTOR_ACTIVE_HIGH, TICKET_STATUS_ACTIVE_HIGH);
+}
ROM_START( wackygtr )
diff --git a/src/mame/drivers/wallc.cpp b/src/mame/drivers/wallc.cpp
index 50ae92b81cb..942902e8211 100644
--- a/src/mame/drivers/wallc.cpp
+++ b/src/mame/drivers/wallc.cpp
@@ -157,18 +157,18 @@ void wallc_state::wallc_palette(palette_device &palette) const
// red component
bit0 = BIT(color_prom[i], 5);
bit1 = BIT(color_prom[i], 6);
- int const r = combine_2_weights(weights_r, bit1, bit0);
+ int const r = combine_weights(weights_r, bit1, bit0);
// green component
bit0 = BIT(color_prom[i], 2);
bit1 = BIT(color_prom[i], 3);
- int const g = combine_2_weights(weights_g, bit1, bit0);
+ int const g = combine_weights(weights_g, bit1, bit0);
// blue component
bit0 = BIT(color_prom[i], 0);
bit1 = BIT(color_prom[i], 1);
bit7 = BIT(color_prom[i], 7);
- int const b = combine_3_weights(weights_b, bit7, bit1, bit0);
+ int const b = combine_weights(weights_b, bit7, bit1, bit0);
palette.set_pen_color(i, rgb_t(r, g, b));
}
@@ -195,18 +195,18 @@ void wallc_state::unkitpkr_palette(palette_device &palette) const
// red component
bit0 = BIT(color_prom[i], 5);
bit1 = BIT(color_prom[i], 6);
- int const r = combine_2_weights(weights_r, bit1, bit0);
+ int const r = combine_weights(weights_r, bit1, bit0);
// green component
bit0 = BIT(color_prom[i], 2);
bit1 = BIT(color_prom[i], 3);
- int const g = combine_2_weights(weights_g, bit1, bit0);
+ int const g = combine_weights(weights_g, bit1, bit0);
// blue component
bit0 = BIT(color_prom[i], 0);
bit1 = BIT(color_prom[i], 1);
bit7 = BIT(color_prom[i], 7);
- int const b = combine_3_weights(weights_b, bit7, bit1, bit0);
+ int const b = combine_weights(weights_b, bit7, bit1, bit0);
palette.set_pen_color(i, rgb_t(r, g, b));
}
@@ -514,20 +514,21 @@ void wallc_state::init_wallca()
}
-MACHINE_CONFIG_START(wallc_state::wallc)
+void wallc_state::wallc(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, 12.288_MHz_XTAL / 4) /* 3.072 MHz ? */
- MCFG_DEVICE_PROGRAM_MAP(wallc_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", wallc_state, irq0_line_hold)
+ Z80(config, m_maincpu, 12.288_MHz_XTAL / 4); /* 3.072 MHz ? */
+ m_maincpu->set_addrmap(AS_PROGRAM, &wallc_state::wallc_map);
+ m_maincpu->set_vblank_int("screen", FUNC(wallc_state::irq0_line_hold));
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */)
- MCFG_SCREEN_SIZE(32*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 0*8, 32*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(wallc_state, screen_update)
- MCFG_SCREEN_PALETTE("palette")
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500) /* not accurate */);
+ screen.set_size(32*8, 32*8);
+ screen.set_visarea(0*8, 32*8-1, 0*8, 32*8-1);
+ screen.set_screen_update(FUNC(wallc_state::screen_update));
+ screen.set_palette("palette");
GFXDECODE(config, m_gfxdecode, "palette", gfx_wallc);
PALETTE(config, "palette", FUNC(wallc_state::wallc_palette), 32);
@@ -535,19 +536,19 @@ MACHINE_CONFIG_START(wallc_state::wallc)
/* sound hardware */
SPEAKER(config, "mono").front_center();
AY8912(config, "aysnd", 12288000 / 8).add_route(ALL_OUTPUTS, "mono", 0.30);
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(wallc_state::wallca)
+void wallc_state::wallca(machine_config &config)
+{
wallc(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_CLOCK(12_MHz_XTAL / 4)
-MACHINE_CONFIG_END
+ m_maincpu->set_clock(12_MHz_XTAL / 4);
+}
-MACHINE_CONFIG_START(wallc_state::unkitpkr)
+void wallc_state::unkitpkr(machine_config &config)
+{
wallc(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(unkitpkr_map)
+ m_maincpu->set_addrmap(AS_PROGRAM, &wallc_state::unkitpkr_map);
MCFG_VIDEO_START_OVERRIDE(wallc_state, unkitpkr)
subdevice<palette_device>("palette")->set_init(FUNC(wallc_state::unkitpkr_palette));
@@ -556,13 +557,14 @@ MACHINE_CONFIG_START(wallc_state::unkitpkr)
subdevice<ay8912_device>("aysnd")->port_a_read_callback().set_ioport("DSW2");
subdevice<ay8912_device>("aysnd")->reset_routes();
subdevice<ay8912_device>("aysnd")->add_route(ALL_OUTPUTS, "mono", 0.50);
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(wallc_state::sidampkr)
+void wallc_state::sidampkr(machine_config &config)
+{
unkitpkr(config);
MCFG_VIDEO_START_OVERRIDE(wallc_state, sidampkr)
-MACHINE_CONFIG_END
+}
/***************************************************************************
diff --git a/src/mame/drivers/wangpc.cpp b/src/mame/drivers/wangpc.cpp
index 4b0c4da1326..9c448093a7d 100644
--- a/src/mame/drivers/wangpc.cpp
+++ b/src/mame/drivers/wangpc.cpp
@@ -876,7 +876,7 @@ WRITE8_MEMBER( wangpc_state::memw_w )
READ8_MEMBER( wangpc_state::ior2_r )
{
if (m_disable_dreq2)
- return m_bus->dack_r(space, 2);
+ return m_bus->dack_r(2);
else
return m_fdc->dma_r();
}
@@ -884,7 +884,7 @@ READ8_MEMBER( wangpc_state::ior2_r )
WRITE8_MEMBER( wangpc_state::iow2_w )
{
if (m_disable_dreq2)
- m_bus->dack_w(space, 2, data);
+ m_bus->dack_w(2, data);
else
m_fdc->dma_w(data);
}
@@ -1272,15 +1272,16 @@ void wangpc_state::on_disk1_unload(floppy_image_device *image)
//**************************************************************************
//-------------------------------------------------
-// MACHINE_CONFIG( wangpc )
+// machine_config( wangpc )
//-------------------------------------------------
-MACHINE_CONFIG_START(wangpc_state::wangpc)
- MCFG_DEVICE_ADD(I8086_TAG, I8086, 8000000)
- MCFG_DEVICE_PROGRAM_MAP(wangpc_mem)
- MCFG_DEVICE_IO_MAP(wangpc_io)
- MCFG_DEVICE_IRQ_ACKNOWLEDGE_DEVICE(I8259A_TAG, pic8259_device, inta_cb)
- //MCFG_QUANTUM_PERFECT_CPU(I8086_TAG)
+void wangpc_state::wangpc(machine_config &config)
+{
+ I8086(config, m_maincpu, 8000000);
+ m_maincpu->set_addrmap(AS_PROGRAM, &wangpc_state::wangpc_mem);
+ m_maincpu->set_addrmap(AS_IO, &wangpc_state::wangpc_io);
+ m_maincpu->set_irq_acknowledge_callback(I8259A_TAG, FUNC(pic8259_device::inta_cb));
+ //config.m_perfect_cpu_quantum = subtag(I8086_TAG);
// devices
AM9517A(config, m_dmac, 4000000);
@@ -1330,10 +1331,10 @@ MACHINE_CONFIG_START(wangpc_state::wangpc)
UPD765A(config, m_fdc, 8'000'000, false, false);
m_fdc->intrq_wr_callback().set(FUNC(wangpc_state::fdc_irq));
m_fdc->drq_wr_callback().set(FUNC(wangpc_state::fdc_drq));
- MCFG_FLOPPY_DRIVE_ADD(UPD765_TAG ":0", wangpc_floppies, "525dd", wangpc_state::floppy_formats)
- MCFG_FLOPPY_DRIVE_ADD(UPD765_TAG ":1", wangpc_floppies, "525dd", wangpc_state::floppy_formats)
+ FLOPPY_CONNECTOR(config, UPD765_TAG ":0", wangpc_floppies, "525dd", wangpc_state::floppy_formats);
+ FLOPPY_CONNECTOR(config, UPD765_TAG ":1", wangpc_floppies, "525dd", wangpc_state::floppy_formats);
- MCFG_DEVICE_ADD(m_centronics, CENTRONICS, centronics_devices, "printer");
+ CENTRONICS(config, m_centronics, centronics_devices, "printer");
m_centronics->set_data_input_buffer(m_cent_data_in);
m_centronics->ack_handler().set(FUNC(wangpc_state::write_centronics_ack));
m_centronics->busy_handler().set(FUNC(wangpc_state::write_centronics_busy));
@@ -1341,7 +1342,9 @@ MACHINE_CONFIG_START(wangpc_state::wangpc)
m_centronics->perror_handler().set(FUNC(wangpc_state::write_centronics_perror));
INPUT_BUFFER(config, m_cent_data_in);
- MCFG_CENTRONICS_OUTPUT_LATCH_ADD("cent_data_out", CENTRONICS_TAG)
+
+ OUTPUT_LATCH(config, m_cent_data_out);
+ m_centronics->set_output_latch(*m_cent_data_out);
rs232_port_device &rs232(RS232_PORT(config, RS232_TAG, default_rs232_devices, nullptr));
rs232.rxd_handler().set(m_epci, FUNC(mc2661_device::rx_w));
@@ -1349,29 +1352,29 @@ MACHINE_CONFIG_START(wangpc_state::wangpc)
WANGPC_KEYBOARD(config, "wangpckb").txd_handler().set(m_uart, FUNC(im6402_device::write_rri));
// bus
- MCFG_WANGPC_BUS_ADD()
- MCFG_WANGPC_BUS_IRQ2_CALLBACK(WRITELINE(*this, wangpc_state, bus_irq2_w))
- MCFG_WANGPC_BUS_IRQ3_CALLBACK(WRITELINE(I8259A_TAG, pic8259_device, ir3_w))
- MCFG_WANGPC_BUS_IRQ4_CALLBACK(WRITELINE(I8259A_TAG, pic8259_device, ir4_w))
- MCFG_WANGPC_BUS_IRQ5_CALLBACK(WRITELINE(I8259A_TAG, pic8259_device, ir5_w))
- MCFG_WANGPC_BUS_IRQ6_CALLBACK(WRITELINE(I8259A_TAG, pic8259_device, ir6_w))
- MCFG_WANGPC_BUS_IRQ7_CALLBACK(WRITELINE(I8259A_TAG, pic8259_device, ir7_w))
- MCFG_WANGPC_BUS_DRQ1_CALLBACK(WRITELINE(AM9517A_TAG, am9517a_device, dreq1_w))
- MCFG_WANGPC_BUS_DRQ2_CALLBACK(WRITELINE(AM9517A_TAG, am9517a_device, dreq2_w))
- MCFG_WANGPC_BUS_DRQ3_CALLBACK(WRITELINE(AM9517A_TAG, am9517a_device, dreq3_w))
- MCFG_WANGPC_BUS_IOERROR_CALLBACK(INPUTLINE(I8086_TAG, INPUT_LINE_NMI))
- MCFG_WANGPC_BUS_SLOT_ADD("slot1", 1, wangpc_cards, nullptr)
- MCFG_WANGPC_BUS_SLOT_ADD("slot2", 2, wangpc_cards, "mvc")
- MCFG_WANGPC_BUS_SLOT_ADD("slot3", 3, wangpc_cards, nullptr)
- MCFG_WANGPC_BUS_SLOT_ADD("slot4", 4, wangpc_cards, nullptr)
- MCFG_WANGPC_BUS_SLOT_ADD("slot5", 5, wangpc_cards, nullptr)
+ WANGPC_BUS(config, m_bus, 0);
+ m_bus->irq2_wr_callback().set(FUNC(wangpc_state::bus_irq2_w));
+ m_bus->irq3_wr_callback().set(m_pic, FUNC(pic8259_device::ir3_w));
+ m_bus->irq4_wr_callback().set(m_pic, FUNC(pic8259_device::ir4_w));
+ m_bus->irq5_wr_callback().set(m_pic, FUNC(pic8259_device::ir5_w));
+ m_bus->irq6_wr_callback().set(m_pic, FUNC(pic8259_device::ir6_w));
+ m_bus->irq7_wr_callback().set(m_pic, FUNC(pic8259_device::ir7_w));
+ m_bus->drq1_wr_callback().set(m_dmac, FUNC(am9517a_device::dreq1_w));
+ m_bus->drq2_wr_callback().set(m_dmac, FUNC(am9517a_device::dreq2_w));
+ m_bus->drq3_wr_callback().set(m_dmac, FUNC(am9517a_device::dreq3_w));
+ m_bus->ioerror_wr_callback().set_inputline(m_maincpu, INPUT_LINE_NMI);
+ WANGPC_BUS_SLOT(config, "slot1", wangpc_cards, nullptr, 1);
+ WANGPC_BUS_SLOT(config, "slot2", wangpc_cards, "mvc", 2);
+ WANGPC_BUS_SLOT(config, "slot3", wangpc_cards, nullptr, 3);
+ WANGPC_BUS_SLOT(config, "slot4", wangpc_cards, nullptr, 4);
+ WANGPC_BUS_SLOT(config, "slot5", wangpc_cards, nullptr, 5);
// internal ram
RAM(config, RAM_TAG).set_default_size("128K");
// software list
- MCFG_SOFTWARE_LIST_ADD("flop_list", "wangpc")
-MACHINE_CONFIG_END
+ SOFTWARE_LIST(config, "flop_list").set_original("wangpc");
+}
diff --git a/src/mame/drivers/wardner.cpp b/src/mame/drivers/wardner.cpp
index 3969300db3a..9665ae01fa9 100644
--- a/src/mame/drivers/wardner.cpp
+++ b/src/mame/drivers/wardner.cpp
@@ -181,14 +181,14 @@ void wardner_state::main_program_map(address_map &map)
{
map(0x0000, 0x6fff).rom();
map(0x7000, 0x7fff).ram();
- map(0x8000, 0x8fff).w(FUNC(wardner_state::wardner_sprite_w)); // AM_SHARE("spriteram8")
- map(0xa000, 0xafff).w(m_palette, FUNC(palette_device::write8)); // AM_SHARE("palette")
+ map(0x8000, 0x8fff).w(FUNC(wardner_state::wardner_sprite_w)); // .share("spriteram8")
+ map(0xa000, 0xafff).w(m_palette, FUNC(palette_device::write8)); // .share("palette")
map(0xc000, 0xc7ff).writeonly().share("sharedram");
map(0x8000, 0xffff).r(m_membank, FUNC(address_map_bank_device::read8));
}
// Overlapped RAM/Banked ROM
-// Can't use AM_RANGE(0x00000, 0x3ffff) for ROM because the shared pointers get messed up somehow
+// Can't use map(0x00000, 0x3ffff) for ROM because the shared pointers get messed up somehow
void wardner_state::main_bank_map(address_map &map)
{
map(0x00000, 0x00fff).r(FUNC(wardner_state::wardner_sprite_r)).share("spriteram8");
@@ -338,24 +338,24 @@ INPUT_PORTS_END
static const gfx_layout charlayout =
{
- 8,8, /* 8*8 characters */
- 2048, /* 2048 characters */
- 3, /* 3 bits per pixel */
- { 0*2048*8*8, 1*2048*8*8, 2*2048*8*8 }, /* the bitplanes are separated */
- { 0, 1, 2, 3, 4, 5, 6, 7 },
- { 0*8, 1*8, 2*8, 3*8, 4*8, 5*8, 6*8, 7*8 },
- 8*8 /* every char takes 8 consecutive bytes */
+ 8,8, /* 8*8 characters */
+ RGN_FRAC(1,3), /* 2048 characters */
+ 3, /* 3 bits per pixel */
+ { RGN_FRAC(0,3), RGN_FRAC(1,3), RGN_FRAC(2,3) }, /* the bitplanes are separated */
+ { STEP8(0,1) },
+ { STEP8(0,8) },
+ 8*8 /* every char takes 8 consecutive bytes */
};
static const gfx_layout tilelayout =
{
- 8,8, /* 8*8 tiles */
- 4096, /* 4096 tiles */
- 4, /* 4 bits per pixel */
- { 0*4096*8*8, 1*4096*8*8, 2*4096*8*8, 3*4096*8*8 }, /* the bitplanes are separated */
- { 0, 1, 2, 3, 4, 5, 6, 7 },
- { 0*8, 1*8, 2*8, 3*8, 4*8, 5*8, 6*8, 7*8 },
- 8*8 /* every tile takes 8 consecutive bytes */
+ 8,8, /* 8*8 tiles */
+ RGN_FRAC(1,4), /* 4096 tiles */
+ 4, /* 4 bits per pixel */
+ { RGN_FRAC(0,4), RGN_FRAC(1,4), RGN_FRAC(2,4), RGN_FRAC(3,4) }, /* the bitplanes are separated */
+ { STEP8(0,1) },
+ { STEP8(0,8) },
+ 8*8 /* every tile takes 8 consecutive bytes */
};
@@ -369,12 +369,12 @@ GFXDECODE_END
void wardner_state::driver_start()
{
/* Save-State stuff in src/machine/twincobr.cpp */
- twincobr_driver_savestate();
+ driver_savestate();
}
void wardner_state::machine_reset()
{
- MACHINE_RESET_CALL_MEMBER(twincobr);
+ twincobr_state::machine_reset();
m_membank->set_bank(0);
}
@@ -382,13 +382,13 @@ void wardner_state::machine_reset()
void wardner_state::wardner(machine_config &config)
{
/* basic machine hardware */
- Z80(config, m_maincpu, XTAL(24'000'000) / 4); /* 6MHz */
+ Z80(config, m_maincpu, XTAL(24'000'000) / 4); /* 6MHz */
m_maincpu->set_addrmap(AS_PROGRAM, &wardner_state::main_program_map);
m_maincpu->set_addrmap(AS_IO, &wardner_state::main_io_map);
ADDRESS_MAP_BANK(config, "membank").set_map(&wardner_state::main_bank_map).set_options(ENDIANNESS_LITTLE, 8, 18, 0x8000);
- z80_device &audiocpu(Z80(config, "audiocpu", XTAL(14'000'000) / 4)); /* 3.5MHz */
+ z80_device &audiocpu(Z80(config, "audiocpu", XTAL(14'000'000) / 4)); /* 3.5MHz */
audiocpu.set_addrmap(AS_PROGRAM, &wardner_state::sound_program_map);
audiocpu.set_addrmap(AS_IO, &wardner_state::sound_io_map);
@@ -398,7 +398,7 @@ void wardner_state::wardner(machine_config &config)
m_dsp->set_addrmap(AS_IO, &wardner_state::dsp_io_map);
m_dsp->bio().set(FUNC(wardner_state::twincobr_bio_r));
- config.m_minimum_quantum = attotime::from_hz(6000); /* 100 CPU slices per frame */
+ config.m_minimum_quantum = attotime::from_hz(6000); /* 100 CPU slices per frame */
ls259_device &mainlatch(LS259(config, "mainlatch"));
mainlatch.q_out_cb<2>().set(FUNC(wardner_state::int_enable_w));
@@ -429,7 +429,7 @@ void wardner_state::wardner(machine_config &config)
SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
m_screen->set_video_attributes(VIDEO_UPDATE_BEFORE_VBLANK);
m_screen->set_raw(14_MHz_XTAL/2, 446, 0, 320, 286, 0, 240);
- m_screen->set_screen_update(FUNC(wardner_state::screen_update_toaplan0));
+ m_screen->set_screen_update(FUNC(wardner_state::screen_update));
m_screen->screen_vblank().set(m_spriteram8, FUNC(buffered_spriteram8_device::vblank_copy_rising));
m_screen->screen_vblank().append(FUNC(wardner_state::wardner_vblank_irq));
m_screen->set_palette(m_palette);
diff --git a/src/mame/drivers/warpsped.cpp b/src/mame/drivers/warpsped.cpp
index 410bfe1f5eb..65b6c21651f 100644
--- a/src/mame/drivers/warpsped.cpp
+++ b/src/mame/drivers/warpsped.cpp
@@ -322,26 +322,26 @@ void warpspeed_state::warpsped_palette(palette_device &palette) const
palette.set_pen_color(2 + i, 0xff * BIT(i, 0), 0xff * BIT(i, 1), 0xff * BIT(i, 2));
}
-MACHINE_CONFIG_START(warpspeed_state::warpspeed)
-
+void warpspeed_state::warpspeed(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, XTAL(5'000'000)/2)
- MCFG_DEVICE_PROGRAM_MAP(warpspeed_map)
- MCFG_DEVICE_IO_MAP(warpspeed_io_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", warpspeed_state, irq0_line_hold)
+ Z80(config, m_maincpu, XTAL(5'000'000)/2);
+ m_maincpu->set_addrmap(AS_PROGRAM, &warpspeed_state::warpspeed_map);
+ m_maincpu->set_addrmap(AS_IO, &warpspeed_state::warpspeed_io_map);
+ m_maincpu->set_vblank_int("screen", FUNC(warpspeed_state::irq0_line_hold));
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500))
- MCFG_SCREEN_SIZE((32)*8, (32)*8)
- MCFG_SCREEN_VISIBLE_AREA(4*8, 32*8-1, 8*8, 32*8-1)
- MCFG_SCREEN_PALETTE("palette")
- MCFG_SCREEN_UPDATE_DRIVER(warpspeed_state, screen_update)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500));
+ screen.set_size((32)*8, (32)*8);
+ screen.set_visarea(4*8, 32*8-1, 8*8, 32*8-1);
+ screen.set_palette("palette");
+ screen.set_screen_update(FUNC(warpspeed_state::screen_update));
GFXDECODE(config, m_gfxdecode, "palette", gfx_warpspeed);
PALETTE(config, "palette", FUNC(warpspeed_state::warpsped_palette), 2 + 8);
-MACHINE_CONFIG_END
+}
ROM_START( warpsped )
ROM_REGION(0x1000, "maincpu", 0)
diff --git a/src/mame/drivers/warpwarp.cpp b/src/mame/drivers/warpwarp.cpp
index 3434f94315b..3685b396f53 100644
--- a/src/mame/drivers/warpwarp.cpp
+++ b/src/mame/drivers/warpwarp.cpp
@@ -712,12 +712,12 @@ GFXDECODE_END
-MACHINE_CONFIG_START(warpwarp_state::geebee)
-
+void warpwarp_state::geebee(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", I8080, MASTER_CLOCK/9) /* verified on pcb */
- MCFG_DEVICE_PROGRAM_MAP(geebee_map)
- MCFG_DEVICE_IO_MAP(geebee_port_map)
+ I8080(config, m_maincpu, MASTER_CLOCK/9); /* verified on pcb */
+ m_maincpu->set_addrmap(AS_PROGRAM, &warpwarp_state::geebee_map);
+ m_maincpu->set_addrmap(AS_IO, &warpwarp_state::geebee_port_map);
LS259(config, m_latch); // 5N
m_latch->q_out_cb<0>().set_output("led0"); // LAMP 1
@@ -730,11 +730,11 @@ MACHINE_CONFIG_START(warpwarp_state::geebee)
m_latch->q_out_cb<7>().set(FUNC(warpwarp_state::inv_w));
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_RAW_PARAMS(MASTER_CLOCK/3, 384, 0, 272, 264, 0, 224)
- MCFG_SCREEN_UPDATE_DRIVER(warpwarp_state, screen_update)
- MCFG_SCREEN_PALETTE(m_palette)
- MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE(*this, warpwarp_state, vblank_irq))
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_raw(MASTER_CLOCK/3, 384, 0, 272, 264, 0, 224);
+ screen.set_screen_update(FUNC(warpwarp_state::screen_update));
+ screen.set_palette(m_palette);
+ screen.screen_vblank().set(FUNC(warpwarp_state::vblank_irq));
GFXDECODE(config, m_gfxdecode, m_palette, gfx_1k);
PALETTE(config, m_palette, FUNC(warpwarp_state::geebee_palette), 4*2);
@@ -744,9 +744,8 @@ MACHINE_CONFIG_START(warpwarp_state::geebee)
/* sound hardware */
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("geebee_custom", GEEBEE_SOUND, MASTER_CLOCK)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
-MACHINE_CONFIG_END
+ GEEBEE_SOUND(config, m_geebee_sound, MASTER_CLOCK).add_route(ALL_OUTPUTS, "mono", 1.0);
+}
void warpwarp_state::geebeeb(machine_config &config)
{
@@ -754,33 +753,35 @@ void warpwarp_state::geebeeb(machine_config &config)
m_latch->q_out_cb<4>().set_nop(); // remove coin lockout
}
-MACHINE_CONFIG_START(warpwarp_state::navarone)
+void warpwarp_state::navarone(machine_config &config)
+{
geebee(config);
/* basic machine hardware */
- MCFG_GFXDECODE_MODIFY("gfxdecode", gfx_2k)
+ m_gfxdecode->set_info(gfx_2k);
m_palette->set_entries(2*2);
m_palette->set_init(FUNC(warpwarp_state::navarone_palette));
MCFG_VIDEO_START_OVERRIDE(warpwarp_state,navarone)
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(warpwarp_state::kaitei)
+void warpwarp_state::kaitei(machine_config &config)
+{
geebee(config);
/* basic machine hardware */
- MCFG_GFXDECODE_MODIFY("gfxdecode", gfx_1k)
+ m_gfxdecode->set_info(gfx_1k);
m_palette->set_entries(4*2+1);
MCFG_MACHINE_RESET_OVERRIDE(warpwarp_state,kaitei)
-MACHINE_CONFIG_END
-
+}
-MACHINE_CONFIG_START(warpwarp_state::bombbee)
+void warpwarp_state::bombbee(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", I8080, MASTER_CLOCK/9)
- MCFG_DEVICE_PROGRAM_MAP(bombbee_map)
+ I8080(config, m_maincpu, MASTER_CLOCK/9);
+ m_maincpu->set_addrmap(AS_PROGRAM, &warpwarp_state::bombbee_map);
LS259(config, m_latch); // 6L on Warp Warp
m_latch->q_out_cb<0>().set_output("led0"); // LAMP 1
@@ -795,11 +796,11 @@ MACHINE_CONFIG_START(warpwarp_state::bombbee)
WATCHDOG_TIMER(config, m_watchdog);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_RAW_PARAMS(MASTER_CLOCK/3, 384, 0, 272, 264, 0, 224)
- MCFG_SCREEN_UPDATE_DRIVER(warpwarp_state, screen_update)
- MCFG_SCREEN_PALETTE(m_palette)
- MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE(*this, warpwarp_state, vblank_irq))
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_raw(MASTER_CLOCK/3, 384, 0, 272, 264, 0, 224);
+ screen.set_screen_update(FUNC(warpwarp_state::screen_update));
+ screen.set_palette(m_palette);
+ screen.screen_vblank().set(FUNC(warpwarp_state::vblank_irq));
GFXDECODE(config, m_gfxdecode, m_palette, gfx_color);
@@ -809,17 +810,16 @@ MACHINE_CONFIG_START(warpwarp_state::bombbee)
/* sound hardware */
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("warpwarp_custom", WARPWARP_SOUND, MASTER_CLOCK)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
-MACHINE_CONFIG_END
+ WARPWARP_SOUND(config, m_warpwarp_sound, MASTER_CLOCK).add_route(ALL_OUTPUTS, "mono", 1.0);
+}
-MACHINE_CONFIG_START(warpwarp_state::warpwarp)
+void warpwarp_state::warpwarp(machine_config &config)
+{
bombbee(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(warpwarp_map)
-MACHINE_CONFIG_END
+ m_maincpu->set_addrmap(AS_PROGRAM, &warpwarp_state::warpwarp_map);
+}
/***************************************************************************
diff --git a/src/mame/drivers/warriorb.cpp b/src/mame/drivers/warriorb.cpp
index 229a88aa340..5f51f2633cb 100644
--- a/src/mame/drivers/warriorb.cpp
+++ b/src/mame/drivers/warriorb.cpp
@@ -438,11 +438,11 @@ void warriorb_state::machine_reset()
void warriorb_state::darius2d(machine_config &config)
{
/* basic machine hardware */
- M68000(config, m_maincpu, 12000000); /* 12 MHz ??? (Might well be 16!) */
+ M68000(config, m_maincpu, 12000000); /* 12 MHz ??? (Might well be 16!) */
m_maincpu->set_addrmap(AS_PROGRAM, &warriorb_state::darius2d_map);
m_maincpu->set_vblank_int("lscreen", FUNC(warriorb_state::irq4_line_hold));
- z80_device &audiocpu(Z80(config, "audiocpu", 16000000/4)); /* 4 MHz ? */
+ z80_device &audiocpu(Z80(config, "audiocpu", 16000000/4)); /* 4 MHz ? */
audiocpu.set_addrmap(AS_PROGRAM, &warriorb_state::z80_sound_map);
TC0220IOC(config, m_tc0220ioc, 0);
@@ -521,11 +521,11 @@ void warriorb_state::darius2d(machine_config &config)
void warriorb_state::warriorb(machine_config &config)
{
/* basic machine hardware */
- M68000(config, m_maincpu, 16000000); /* 16 MHz ? */
+ M68000(config, m_maincpu, 16000000); /* 16 MHz ? */
m_maincpu->set_addrmap(AS_PROGRAM, &warriorb_state::warriorb_map);
m_maincpu->set_vblank_int("lscreen", FUNC(warriorb_state::irq4_line_hold));
- z80_device &audiocpu(Z80(config, "audiocpu", 16000000/4)); /* 4 MHz ? */
+ z80_device &audiocpu(Z80(config, "audiocpu", 16000000/4)); /* 4 MHz ? */
audiocpu.set_addrmap(AS_PROGRAM, &warriorb_state::z80_sound_map);
TC0510NIO(config, m_tc0510nio, 0);
@@ -775,8 +775,8 @@ ROM_START( warriorb )
ROM_REGION( 0x01000, "user1", 0 ) /* unknown roms */
ROM_LOAD( "d24-13.37", 0x00000, 0x400, CRC(3ca18eb3) SHA1(54560f02c2be67993940831222130e90cd171991) ) /* AM27S33A or compatible like N82HS137A */
ROM_LOAD( "d24-14.38", 0x00000, 0x400, CRC(baf2a193) SHA1(b7f103b5f5aab0702dd21fd7e3a82261ae1760e9) ) /* AM27S33A or compatible like N82HS137A */
-// ROM_LOAD( "d24-15.78", 0x00000, 0xa??, NO_DUMP ) /* 20L8B Pal */
-// ROM_LOAD( "d24-16.79", 0x00000, 0xa??, NO_DUMP ) /* 20L8B Pal */
+ ROM_LOAD( "d24-15.78", 0x00000, 0x144, CRC(04992a7d) SHA1(82ce7ab7e3e7045776b660c32dac4abc28cabfa5) ) // PAL20L8BCNS
+ ROM_LOAD( "d24-16.79", 0x00000, 0x144, CRC(92c59a8d) SHA1(a83eb70cdc47af688a33505f60e5cb9960f8ba9f) ) // PAL20L8BCNS
ROM_END
diff --git a/src/mame/drivers/wc90b.cpp b/src/mame/drivers/wc90b.cpp
index 13fefc3fd6e..8a92726da2d 100644
--- a/src/mame/drivers/wc90b.cpp
+++ b/src/mame/drivers/wc90b.cpp
@@ -353,29 +353,29 @@ void wc90b_state::machine_start()
}
-MACHINE_CONFIG_START(wc90b_state::wc90b)
-
+void wc90b_state::wc90b(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, MASTER_CLOCK)
- MCFG_DEVICE_PROGRAM_MAP(wc90b_map1)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", wc90b_state, irq0_line_assert)
+ Z80(config, m_maincpu, MASTER_CLOCK);
+ m_maincpu->set_addrmap(AS_PROGRAM, &wc90b_state::wc90b_map1);
+ m_maincpu->set_vblank_int("screen", FUNC(wc90b_state::irq0_line_assert));
- MCFG_DEVICE_ADD("sub", Z80, MASTER_CLOCK)
- MCFG_DEVICE_PROGRAM_MAP(wc90b_map2)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", wc90b_state, irq0_line_assert)
+ Z80(config, m_subcpu, MASTER_CLOCK);
+ m_subcpu->set_addrmap(AS_PROGRAM, &wc90b_state::wc90b_map2);
+ m_subcpu->set_vblank_int("screen", FUNC(wc90b_state::irq0_line_assert));
- MCFG_DEVICE_ADD("audiocpu", Z80, SOUND_CLOCK)
- MCFG_DEVICE_PROGRAM_MAP(sound_cpu)
+ Z80(config, m_audiocpu, SOUND_CLOCK);
+ m_audiocpu->set_addrmap(AS_PROGRAM, &wc90b_state::sound_cpu);
/* IRQs are triggered by the main CPU */
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(32*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(wc90b_state, screen_update)
- MCFG_SCREEN_PALETTE(m_palette)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(32*8, 32*8);
+ screen.set_visarea(0*8, 32*8-1, 2*8, 30*8-1);
+ screen.set_screen_update(FUNC(wc90b_state::screen_update));
+ screen.set_palette(m_palette);
GFXDECODE(config, m_gfxdecode, m_palette, gfx_wc90b);
PALETTE(config, m_palette).set_format(palette_device::xBGR_444, 1024).set_endianness(ENDIANNESS_BIG);
@@ -385,17 +385,14 @@ MACHINE_CONFIG_START(wc90b_state::wc90b)
GENERIC_LATCH_8(config, m_soundlatch);
- MCFG_DEVICE_ADD("ymsnd1", YM2203, YM2203_CLOCK)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.40)
+ YM2203(config, "ymsnd1", YM2203_CLOCK).add_route(ALL_OUTPUTS, "mono", 0.40);
+ YM2203(config, "ymsnd2", YM2203_CLOCK).add_route(ALL_OUTPUTS, "mono", 0.40);
- MCFG_DEVICE_ADD("ymsnd2", YM2203, YM2203_CLOCK)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.40)
-
- MCFG_DEVICE_ADD("msm", MSM5205, MSM5205_CLOCK)
- MCFG_MSM5205_VCLK_CB(WRITELINE(*this, wc90b_state, adpcm_int)) /* interrupt function */
- MCFG_MSM5205_PRESCALER_SELECTOR(S96_4B) /* 4KHz 4-bit */
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.20)
-MACHINE_CONFIG_END
+ MSM5205(config, m_msm, MSM5205_CLOCK);
+ m_msm->vck_legacy_callback().set(FUNC(wc90b_state::adpcm_int)); /* interrupt function */
+ m_msm->set_prescaler_selector(msm5205_device::S96_4B); /* 4KHz 4-bit */
+ m_msm->add_route(ALL_OUTPUTS, "mono", 0.20);
+}
ROM_START( twcup90b1 )
ROM_REGION( 0x20000, "maincpu", 0 )
diff --git a/src/mame/drivers/welltris.cpp b/src/mame/drivers/welltris.cpp
index 1238c57ac26..b62ff069796 100644
--- a/src/mame/drivers/welltris.cpp
+++ b/src/mame/drivers/welltris.cpp
@@ -674,11 +674,11 @@ void welltris_state::machine_start()
void welltris_state::welltris(machine_config &config)
{
/* basic machine hardware */
- M68000(config, m_maincpu, 20000000/2); /* 10 MHz */
+ M68000(config, m_maincpu, 20000000/2); /* 10 MHz */
m_maincpu->set_addrmap(AS_PROGRAM, &welltris_state::main_map);
m_maincpu->set_vblank_int("screen", FUNC(welltris_state::irq1_line_hold));
- Z80(config, m_audiocpu, 8000000/2); /* 4 MHz ??? */
+ Z80(config, m_audiocpu, 8000000/2); /* 4 MHz ??? */
m_audiocpu->set_addrmap(AS_PROGRAM, &welltris_state::sound_map);
m_audiocpu->set_addrmap(AS_IO, &welltris_state::sound_port_map); /* IRQs are triggered by the YM2610 */
diff --git a/src/mame/drivers/wgp.cpp b/src/mame/drivers/wgp.cpp
index b1dd4cc61fd..f8e49803b0b 100644
--- a/src/mame/drivers/wgp.cpp
+++ b/src/mame/drivers/wgp.cpp
@@ -915,14 +915,14 @@ void wgp_state::machine_start()
void wgp_state::wgp(machine_config &config)
{
/* basic machine hardware */
- M68000(config, m_maincpu, 12000000); /* 12 MHz ??? */
+ M68000(config, m_maincpu, 12000000); /* 12 MHz ??? */
m_maincpu->set_addrmap(AS_PROGRAM, &wgp_state::main_map);
m_maincpu->set_vblank_int("screen", FUNC(wgp_state::irq4_line_hold));
- Z80(config, m_audiocpu, 16000000/4); /* 4 MHz ??? */
+ Z80(config, m_audiocpu, 16000000/4); /* 4 MHz ??? */
m_audiocpu->set_addrmap(AS_PROGRAM, &wgp_state::z80_sound_map);
- M68000(config, m_subcpu, 12000000); /* 12 MHz ??? */
+ M68000(config, m_subcpu, 12000000); /* 12 MHz ??? */
m_subcpu->set_addrmap(AS_PROGRAM, &wgp_state::cpu2_map);
m_subcpu->set_vblank_int("screen", FUNC(wgp_state::cpub_interrupt));
diff --git a/src/mame/drivers/wheelfir.cpp b/src/mame/drivers/wheelfir.cpp
index f669e0027a9..8dfe7f1f130 100644
--- a/src/mame/drivers/wheelfir.cpp
+++ b/src/mame/drivers/wheelfir.cpp
@@ -732,15 +732,15 @@ void wheelfir_state::ramdac_map(address_map &map)
map(0x000, 0x3ff).rw("ramdac", FUNC(ramdac_device::ramdac_pal_r), FUNC(ramdac_device::ramdac_rgb888_w));
}
-MACHINE_CONFIG_START(wheelfir_state::wheelfir)
-
- MCFG_DEVICE_ADD("maincpu", M68000, 32000000/2)
- MCFG_DEVICE_PROGRAM_MAP(wheelfir_main)
+void wheelfir_state::wheelfir(machine_config &config)
+{
+ M68000(config, m_maincpu, 32000000/2);
+ m_maincpu->set_addrmap(AS_PROGRAM, &wheelfir_state::wheelfir_main);
- MCFG_DEVICE_ADD("subcpu", M68000, 32000000/2)
- MCFG_DEVICE_PROGRAM_MAP(wheelfir_sub)
+ M68000(config, m_subcpu, 32000000/2);
+ m_subcpu->set_addrmap(AS_PROGRAM, &wheelfir_state::wheelfir_sub);
- //MCFG_QUANTUM_TIME(attotime::from_hz(12000))
+ //config.m_minimum_quantum = attotime::from_hz(12000);
adc0808_device &adc(ADC0808(config, "adc", 500000)); // unknown clock
adc.eoc_ff_callback().set(FUNC(wheelfir_state::adc_eoc_w));
@@ -748,17 +748,17 @@ MACHINE_CONFIG_START(wheelfir_state::wheelfir)
adc.in_callback<1>().set_ioport("ACCELERATOR");
adc.in_callback<2>().set_ioport("BRAKE");
- MCFG_TIMER_DRIVER_ADD_SCANLINE("scan_timer", wheelfir_state, scanline_timer_callback, "screen", 0, 1)
+ TIMER(config, "scan_timer").configure_scanline(FUNC(wheelfir_state::scanline_timer_callback), "screen", 0, 1);
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_SIZE(336, NUM_SCANLINES+NUM_VBLANK_LINES)
- MCFG_SCREEN_VISIBLE_AREA(0,335, 0, NUM_SCANLINES-1)
- MCFG_SCREEN_UPDATE_DRIVER(wheelfir_state, screen_update_wheelfir)
- MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE(*this, wheelfir_state, screen_vblank_wheelfir))
- MCFG_SCREEN_PALETTE("palette")
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_refresh_hz(60);
+ m_screen->set_size(336, NUM_SCANLINES+NUM_VBLANK_LINES);
+ m_screen->set_visarea(0,335, 0, NUM_SCANLINES-1);
+ m_screen->set_screen_update(FUNC(wheelfir_state::screen_update_wheelfir));
+ m_screen->screen_vblank().set(FUNC(wheelfir_state::screen_vblank_wheelfir));
+ m_screen->set_palette(m_palette);
- MCFG_PALETTE_ADD("palette", NUM_COLORS)
+ PALETTE(config, m_palette).set_entries(NUM_COLORS);
ramdac_device &ramdac(RAMDAC(config, "ramdac", 0, m_palette));
ramdac.set_addrmap(0, &wheelfir_state::ramdac_map);
@@ -769,12 +769,12 @@ MACHINE_CONFIG_START(wheelfir_state::wheelfir)
/* sound hardware */
SPEAKER(config, "lspeaker").front_left();
SPEAKER(config, "rspeaker").front_right();
- MCFG_DEVICE_ADD("ldac", DAC_10BIT_R2R, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 1.0) // unknown DAC
- MCFG_DEVICE_ADD("rdac", DAC_10BIT_R2R, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 1.0) // unknown DAC
- MCFG_DEVICE_ADD("vref", VOLTAGE_REGULATOR, 0) MCFG_VOLTAGE_REGULATOR_OUTPUT(5.0)
- MCFG_SOUND_ROUTE(0, "ldac", 1.0, DAC_VREF_POS_INPUT) MCFG_SOUND_ROUTE(0, "ldac", -1.0, DAC_VREF_NEG_INPUT)
- MCFG_SOUND_ROUTE(0, "rdac", 1.0, DAC_VREF_POS_INPUT) MCFG_SOUND_ROUTE(0, "rdac", -1.0, DAC_VREF_NEG_INPUT)
-MACHINE_CONFIG_END
+ DAC_10BIT_R2R(config, "ldac", 0).add_route(ALL_OUTPUTS, "lspeaker", 1.0); // unknown DAC
+ DAC_10BIT_R2R(config, "rdac", 0).add_route(ALL_OUTPUTS, "rspeaker", 1.0); // unknown DAC
+ voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref"));
+ vref.add_route(0, "ldac", 1.0, DAC_VREF_POS_INPUT); vref.add_route(0, "ldac", -1.0, DAC_VREF_NEG_INPUT);
+ vref.add_route(0, "rdac", 1.0, DAC_VREF_POS_INPUT); vref.add_route(0, "rdac", -1.0, DAC_VREF_NEG_INPUT);
+}
ROM_START( wheelfir )
diff --git a/src/mame/drivers/white_mod.cpp b/src/mame/drivers/white_mod.cpp
index a25b063b680..d62eb26764e 100644
--- a/src/mame/drivers/white_mod.cpp
+++ b/src/mame/drivers/white_mod.cpp
@@ -47,11 +47,12 @@ void whitestar_mod_state::init_whitestar_mod()
{
}
-MACHINE_CONFIG_START(whitestar_mod_state::whitestar_mod)
+void whitestar_mod_state::whitestar_mod(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", MC6809E, 2000000)
- MCFG_DEVICE_PROGRAM_MAP(whitestar_mod_map)
-MACHINE_CONFIG_END
+ MC6809E(config, m_maincpu, 2000000);
+ m_maincpu->set_addrmap(AS_PROGRAM, &whitestar_mod_state::whitestar_mod_map);
+}
/*-------------------------------------------------------------------
/ Elvis
diff --git a/src/mame/drivers/wicat.cpp b/src/mame/drivers/wicat.cpp
index 54faa6c0cd1..6265293fa9a 100644
--- a/src/mame/drivers/wicat.cpp
+++ b/src/mame/drivers/wicat.cpp
@@ -202,8 +202,8 @@ void wicat_state::video_io(address_map &map)
void wicat_state::wd1000_mem(address_map &map)
{
- map(0x0000, 0x17ff).rom().region("wd3", 0x0000);
- map(0x1800, 0x1fff).noprw();
+ map(0x0000, 0x0bff).rom().region("wd3", 0x0000);
+ map(0x0c00, 0x0fff).noprw();
}
void wicat_state::wd1000_io(address_map &map)
@@ -584,13 +584,13 @@ WRITE8_MEMBER( wicat_state::vram_w )
READ8_MEMBER(wicat_state::video_dma_r)
{
- return m_videodma->read(space,offset/2);
+ return m_videodma->read(offset/2);
}
WRITE8_MEMBER(wicat_state::video_dma_w)
{
if(!(offset & 0x01))
- m_videodma->write(space,offset/2,data);
+ m_videodma->write(offset/2,data);
}
READ8_MEMBER(wicat_state::video_uart0_r)
diff --git a/src/mame/drivers/wico.cpp b/src/mame/drivers/wico.cpp
index 2e7e76b078e..1ed154b7c08 100644
--- a/src/mame/drivers/wico.cpp
+++ b/src/mame/drivers/wico.cpp
@@ -102,7 +102,7 @@ void wico_state::hcpu_map(address_map &map)
map(0x1fe2, 0x1fe2).w(FUNC(wico_state::muxen_w));
//AM_RANGE(0x1fe3, 0x1fe3) AM_WRITE(csols_w)
map(0x1fe4, 0x1fe4).noprw();
- map(0x1fe5, 0x1fe5).w("sn76494", FUNC(sn76494_device::command_w));
+ map(0x1fe5, 0x1fe5).w("sn76494", FUNC(sn76494_device::write));
map(0x1fe6, 0x1fe6).w(FUNC(wico_state::wdogcl_w));
map(0x1fe7, 0x1fe7).w(FUNC(wico_state::zcres_w));
map(0x1fe8, 0x1fe8).w(FUNC(wico_state::dled0_w));
@@ -125,7 +125,7 @@ void wico_state::ccpu_map(address_map &map)
map(0x1fe2, 0x1fe2).w(FUNC(wico_state::muxen_w)); // digit to display on diagnostic LED; d0=L will disable main displays
map(0x1fe3, 0x1fe3).w(FUNC(wico_state::csols_w)); // solenoid column
map(0x1fe4, 0x1fe4).w(FUNC(wico_state::msols_w)); // solenoid row
- map(0x1fe5, 0x1fe5).w("sn76494", FUNC(sn76494_device::command_w));
+ map(0x1fe5, 0x1fe5).w("sn76494", FUNC(sn76494_device::write));
map(0x1fe6, 0x1fe6).w(FUNC(wico_state::wdogcl_w)); // watchdog clear
map(0x1fe7, 0x1fe7).w(FUNC(wico_state::zcres_w)); // enable IRQ on hcpu
map(0x1fe8, 0x1fe8).w(FUNC(wico_state::dled0_w)); // turn off diagnostic LED
@@ -440,14 +440,17 @@ void wico_state::machine_reset()
}
-MACHINE_CONFIG_START(wico_state::wico)
+void wico_state::wico(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("ccpu", MC6809E, XTAL(10'000'000) / 8) // MC68A09EP @ U51
- MCFG_DEVICE_PROGRAM_MAP(ccpu_map)
- MCFG_DEVICE_ADD("hcpu", MC6809E, XTAL(10'000'000) / 8) // MC68A09EP @ U24
- MCFG_DEVICE_PROGRAM_MAP(hcpu_map)
- MCFG_TIMER_DRIVER_ADD_PERIODIC("irq", wico_state, irq_housekeeping, attotime::from_hz(120)) // zero crossing
- MCFG_TIMER_DRIVER_ADD_PERIODIC("firq", wico_state, firq_housekeeping, attotime::from_hz(750)) // time generator
+ MC6809E(config, m_ccpu, XTAL(10'000'000) / 8); // MC68A09EP @ U51
+ m_ccpu->set_addrmap(AS_PROGRAM, &wico_state::ccpu_map);
+
+ MC6809E(config, m_hcpu, XTAL(10'000'000) / 8); // MC68A09EP @ U24
+ m_hcpu->set_addrmap(AS_PROGRAM, &wico_state::hcpu_map);
+
+ TIMER(config, "irq").configure_periodic(FUNC(wico_state::irq_housekeeping), attotime::from_hz(120)); // zero crossing
+ TIMER(config, "firq").configure_periodic(FUNC(wico_state::firq_housekeeping), attotime::from_hz(750)); // time generator
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
/* Video */
@@ -456,9 +459,8 @@ MACHINE_CONFIG_START(wico_state::wico)
/* Sound */
genpin_audio(config);
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("sn76494", SN76494, XTAL(10'000'000) / 64)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.75)
-MACHINE_CONFIG_END
+ SN76494(config, "sn76494", XTAL(10'000'000) / 64).add_route(ALL_OUTPUTS, "mono", 0.75);
+}
/*-------------------------------------------------------------------
/ Af-Tor (1984)
diff --git a/src/mame/drivers/wildpkr.cpp b/src/mame/drivers/wildpkr.cpp
index ae85b9f34b2..e83cb7a1d6e 100644
--- a/src/mame/drivers/wildpkr.cpp
+++ b/src/mame/drivers/wildpkr.cpp
@@ -465,24 +465,24 @@ IRQ_CALLBACK_MEMBER(wildpkr_state::tabpkr_irq_ack)
* Machine Drivers *
*************************/
-MACHINE_CONFIG_START(wildpkr_state::wildpkr)
-
+void wildpkr_state::wildpkr(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M68000, MAIN_CLOCK)
- MCFG_DEVICE_PROGRAM_MAP(wildpkr_map)
- //MCFG_DEVICE_VBLANK_INT_DRIVER("screen", wildpkr_state, irq2_line_hold) // guess
+ M68000(config, m_maincpu, MAIN_CLOCK);
+ m_maincpu->set_addrmap(AS_PROGRAM, &wildpkr_state::wildpkr_map);
+ //m_maincpu->set_vblank_int("screen", FUNC(wildpkr_state::irq2_line_hold)); // guess
- MCFG_DEVICE_ADD("duart", MC68681, SEC_CLOCK)
+ MC68681(config, m_duart, SEC_CLOCK);
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500))
- MCFG_SCREEN_SIZE(384, 280)
- MCFG_SCREEN_VISIBLE_AREA(0, 384-1, 0, 280-1)
- MCFG_SCREEN_UPDATE_DEVICE("acrtc", hd63484_device, update_screen)
- MCFG_SCREEN_PALETTE("palette")
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500));
+ screen.set_size(384, 280);
+ screen.set_visarea(0, 384-1, 0, 280-1);
+ screen.set_screen_update("acrtc", FUNC(hd63484_device::update_screen));
+ screen.set_palette("palette");
- MCFG_HD63484_ADD("acrtc", 0, hd63484_map)
+ HD63484(config, "acrtc", 0).set_addrmap(0, &wildpkr_state::hd63484_map);
ramdac_device &ramdac(RAMDAC(config, "ramdac", 0, "palette"));
ramdac.set_addrmap(0, &wildpkr_state::ramdac_map);
@@ -492,37 +492,37 @@ MACHINE_CONFIG_START(wildpkr_state::wildpkr)
/* sound hardware */
SPEAKER(config, "mono").front_center();
AY8930(config, "aysnd", AY_CLOCK).add_route(ALL_OUTPUTS, "mono", 0.50);
-MACHINE_CONFIG_END
-
+}
-MACHINE_CONFIG_START(wildpkr_state::tabpkr)
+void wildpkr_state::tabpkr(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M68000, XTAL(24'000'000) / 2)
- MCFG_DEVICE_PROGRAM_MAP(tabpkr_map)
- MCFG_DEVICE_PERIODIC_INT_DRIVER(wildpkr_state, irq3_line_assert, 60*256)
- MCFG_DEVICE_IRQ_ACKNOWLEDGE_DRIVER(wildpkr_state, tabpkr_irq_ack)
+ M68000(config, m_maincpu, XTAL(24'000'000) / 2);
+ m_maincpu->set_addrmap(AS_PROGRAM, &wildpkr_state::tabpkr_map);
+ m_maincpu->set_periodic_int(FUNC(wildpkr_state::irq3_line_assert), attotime::from_hz(60*256));
+ m_maincpu->set_irq_acknowledge_callback(FUNC(wildpkr_state::tabpkr_irq_ack));
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_1); // DS1220Y
- MCFG_DEVICE_ADD("duart", MC68681, 3686400)
- MCFG_MC68681_IRQ_CALLBACK(ASSERTLINE("maincpu", M68K_IRQ_2))
+ MC68681(config, m_duart, 3686400);
+ m_duart->irq_cb().set_inputline(m_maincpu, M68K_IRQ_2, ASSERT_LINE);
- MCFG_DEVICE_ADD("id", DS2401, 0)
+ DS2401(config, m_id, 0);
- MCFG_DEVICE_ADD("dacclock", CLOCK, 1500000) // base rate derived from program code
- MCFG_CLOCK_SIGNAL_HANDLER(ASSERTLINE("maincpu", M68K_IRQ_5))
+ CLOCK(config, m_dac_clock, 1500000); // base rate derived from program code
+ m_dac_clock->signal_handler().set_inputline(m_maincpu, M68K_IRQ_5, ASSERT_LINE);
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500))
- MCFG_SCREEN_SIZE(384, 280)
- MCFG_SCREEN_VISIBLE_AREA(0, 384-1, 0, 280-1)
- MCFG_SCREEN_UPDATE_DEVICE("acrtc", hd63484_device, update_screen)
- MCFG_SCREEN_PALETTE("palette")
- MCFG_SCREEN_VBLANK_CALLBACK(ASSERTLINE("maincpu", M68K_IRQ_4))
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500));
+ screen.set_size(384, 280);
+ screen.set_visarea(0, 384-1, 0, 280-1);
+ screen.set_screen_update("acrtc", FUNC(hd63484_device::update_screen));
+ screen.set_palette("palette");
+ screen.screen_vblank().set_inputline(m_maincpu, M68K_IRQ_4, ASSERT_LINE);
- MCFG_HD63484_ADD("acrtc", 0, hd63484_map)
+ HD63484(config, "acrtc", 0).set_addrmap(0, &wildpkr_state::hd63484_map);
ramdac_device &ramdac(RAMDAC(config, "ramdac", 0, "palette"));
ramdac.set_addrmap(0, &wildpkr_state::ramdac_map);
@@ -531,11 +531,11 @@ MACHINE_CONFIG_START(wildpkr_state::tabpkr)
/* sound hardware */
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("dac", AD557, 0)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.50)
- MCFG_DEVICE_ADD("vref", VOLTAGE_REGULATOR, 0) MCFG_VOLTAGE_REGULATOR_OUTPUT(5.0)
- MCFG_SOUND_ROUTE(0, "dac", 1.0, DAC_VREF_POS_INPUT) MCFG_SOUND_ROUTE(0, "dac", -1.0, DAC_VREF_NEG_INPUT)
-MACHINE_CONFIG_END
+ AD557(config, m_dac, 0).add_route(ALL_OUTPUTS, "mono", 0.50);
+ voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref"));
+ vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT);
+ vref.add_route(0, "dac", -1.0, DAC_VREF_NEG_INPUT);
+}
/*************************
diff --git a/src/mame/drivers/williams.cpp b/src/mame/drivers/williams.cpp
index 15cbc10d243..29ef3c62400 100644
--- a/src/mame/drivers/williams.cpp
+++ b/src/mame/drivers/williams.cpp
@@ -1482,31 +1482,31 @@ GFXDECODE_END
*
*************************************/
-MACHINE_CONFIG_START(williams_state::williams)
-
+void williams_state::williams(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", MC6809E, MASTER_CLOCK/3/4)
- MCFG_DEVICE_PROGRAM_MAP(williams_map)
+ MC6809E(config, m_maincpu, MASTER_CLOCK/3/4);
+ m_maincpu->set_addrmap(AS_PROGRAM, &williams_state::williams_map);
- MCFG_DEVICE_ADD("soundcpu", M6808, SOUND_CLOCK) // internal clock divider of 4, effective frequency is 894.886kHz
- MCFG_DEVICE_PROGRAM_MAP(sound_map)
+ M6808(config, m_soundcpu, SOUND_CLOCK); // internal clock divider of 4, effective frequency is 894.886kHz
+ m_soundcpu->set_addrmap(AS_PROGRAM, &williams_state::sound_map);
MCFG_MACHINE_START_OVERRIDE(williams_state,williams)
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0); // 5101 (Defender), 5114 or 6514 (later games) + battery
// set a timer to go off every 32 scanlines, to toggle the VA11 line and update the screen
- MCFG_TIMER_DRIVER_ADD_SCANLINE("scan_timer", williams_state, williams_va11_callback, "screen", 0, 32)
+ TIMER(config, "scan_timer").configure_scanline(FUNC(williams_state::williams_va11_callback), "screen", 0, 32);
// also set a timer to go off on scanline 240
- MCFG_TIMER_DRIVER_ADD_SCANLINE("240_timer", williams_state, williams_count240_callback, "screen", 0, 240)
+ TIMER(config, "240_timer").configure_scanline(FUNC(williams_state::williams_count240_callback), "screen", 0, 240);
WATCHDOG_TIMER(config, m_watchdog);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_VIDEO_ATTRIBUTES(VIDEO_UPDATE_SCANLINE | VIDEO_ALWAYS_UPDATE)
- MCFG_SCREEN_RAW_PARAMS(MASTER_CLOCK*2/3, 512, 6, 298, 260, 7, 247)
- MCFG_SCREEN_UPDATE_DRIVER(williams_state, screen_update_williams)
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_video_attributes(VIDEO_UPDATE_SCANLINE | VIDEO_ALWAYS_UPDATE);
+ m_screen->set_raw(MASTER_CLOCK*2/3, 512, 6, 298, 260, 7, 247);
+ m_screen->set_screen_update(FUNC(williams_state::screen_update_williams));
MCFG_VIDEO_START_OVERRIDE(williams_state,williams)
@@ -1514,16 +1514,15 @@ MACHINE_CONFIG_START(williams_state::williams)
/* sound hardware */
SPEAKER(config, "speaker").front_center();
- MCFG_DEVICE_ADD("dac", MC1408, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 0.25) // mc1408.ic6
- MCFG_DEVICE_ADD("vref", VOLTAGE_REGULATOR, 0) MCFG_VOLTAGE_REGULATOR_OUTPUT(5.0)
- MCFG_SOUND_ROUTE(0, "dac", 1.0, DAC_VREF_POS_INPUT) MCFG_SOUND_ROUTE(0, "dac", -1.0, DAC_VREF_NEG_INPUT)
+ MC1408(config, "dac", 0).add_route(ALL_OUTPUTS, "speaker", 0.25); // mc1408.ic6
+ voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref"));
+ vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT);
+ vref.add_route(0, "dac", -1.0, DAC_VREF_NEG_INPUT);
/* pia */
- MCFG_INPUT_MERGER_ANY_HIGH("mainirq")
- MCFG_INPUT_MERGER_OUTPUT_HANDLER(INPUTLINE("maincpu", M6809_IRQ_LINE))
+ INPUT_MERGER_ANY_HIGH(config, "mainirq").output_handler().set_inputline(m_maincpu, M6809_IRQ_LINE);
- MCFG_INPUT_MERGER_ANY_HIGH("soundirq")
- MCFG_INPUT_MERGER_OUTPUT_HANDLER(INPUTLINE("soundcpu", M6808_IRQ_LINE))
+ INPUT_MERGER_ANY_HIGH(config, "soundirq").output_handler().set_inputline(m_soundcpu, M6808_IRQ_LINE);
PIA6821(config, m_pia[0], 0);
m_pia[0]->readpa_handler().set_ioport("IN0");
@@ -1539,39 +1538,38 @@ MACHINE_CONFIG_START(williams_state::williams)
m_pia[2]->writepa_handler().set("dac", FUNC(dac_byte_interface::data_w));
m_pia[2]->irqa_handler().set("soundirq", FUNC(input_merger_any_high_device::in_w<0>));
m_pia[2]->irqb_handler().set("soundirq", FUNC(input_merger_any_high_device::in_w<1>));
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(williams_state::defender)
+void williams_state::defender(machine_config &config)
+{
williams(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(defender_map)
+ m_maincpu->set_addrmap(AS_PROGRAM, &williams_state::defender_map);
- MCFG_DEVICE_MODIFY("soundcpu")
- MCFG_DEVICE_PROGRAM_MAP(defender_sound_map)
+ m_soundcpu->set_addrmap(AS_PROGRAM, &williams_state::defender_sound_map);
ADDRESS_MAP_BANK(config, "bankc000").set_map(&williams_state::defender_bankc000_map).set_options(ENDIANNESS_BIG, 8, 16, 0x1000);
MCFG_MACHINE_START_OVERRIDE(williams_state,defender)
MCFG_MACHINE_RESET_OVERRIDE(williams_state,defender)
- MCFG_SCREEN_MODIFY("screen")
- MCFG_SCREEN_VISIBLE_AREA(12, 304-1, 7, 247-1)
-MACHINE_CONFIG_END
+ m_screen->set_visarea(12, 304-1, 7, 247-1);
+}
-MACHINE_CONFIG_START(williams_state::jin) // needs a different screen size or the credit text is clipped
+void williams_state::jin(machine_config &config) // needs a different screen size or the credit text is clipped
+{
defender(config);
/* basic machine hardware */
- MCFG_SCREEN_MODIFY("screen")
- MCFG_SCREEN_VISIBLE_AREA(0, 315, 7, 247-1)
-MACHINE_CONFIG_END
+ m_screen->set_visarea(0, 315, 7, 247-1);
+}
-MACHINE_CONFIG_START(williams_state::williams_muxed)
+void williams_state::williams_muxed(machine_config &config)
+{
williams(config);
/* basic machine hardware */
@@ -1592,24 +1590,25 @@ MACHINE_CONFIG_START(williams_state::williams_muxed)
LS157(config, m_mux1, 0); // IC4 on interface board (actually LS257 with OC tied low)
m_mux1->a_in_callback().set_ioport("INP2A");
m_mux1->b_in_callback().set_ioport("INP1A");
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(spdball_state::spdball)
+void spdball_state::spdball(machine_config &config)
+{
williams(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(spdball_map)
+ m_maincpu->set_addrmap(AS_PROGRAM, &spdball_state::spdball_map);
/* pia */
PIA6821(config, m_pia[3], 0);
m_pia[3]->readpa_handler().set_ioport("IN3");
m_pia[3]->readpb_handler().set_ioport("IN4");
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(williams_state::lottofun)
+void williams_state::lottofun(machine_config &config)
+{
williams(config);
/* basic machine hardware */
@@ -1618,63 +1617,60 @@ MACHINE_CONFIG_START(williams_state::lottofun)
m_pia[0]->writepa_handler().set("ticket", FUNC(ticket_dispenser_device::motor_w)).bit(7);
m_pia[0]->ca2_handler().set(FUNC(williams_state::lottofun_coin_lock_w));
- MCFG_TICKET_DISPENSER_ADD("ticket", attotime::from_msec(70), TICKET_MOTOR_ACTIVE_LOW, TICKET_STATUS_ACTIVE_HIGH)
-MACHINE_CONFIG_END
+ TICKET_DISPENSER(config, "ticket", attotime::from_msec(70), TICKET_MOTOR_ACTIVE_LOW, TICKET_STATUS_ACTIVE_HIGH);
+}
-MACHINE_CONFIG_START(williams_state::sinistar)
+void williams_state::sinistar(machine_config &config)
+{
williams(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(sinistar_map)
+ m_maincpu->set_addrmap(AS_PROGRAM, &williams_state::sinistar_map);
/* sound hardware */
- MCFG_DEVICE_ADD("cvsd", HC55516, 0)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 0.8)
+ HC55516(config, "cvsd", 0).add_route(ALL_OUTPUTS, "speaker", 0.8);
/* pia */
m_pia[0]->readpa_handler().set(FUNC(williams_state::williams_49way_port_0_r));
m_pia[2]->ca2_handler().set("cvsd", FUNC(hc55516_device::digit_w));
m_pia[2]->cb2_handler().set("cvsd", FUNC(hc55516_device::clock_w));
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(williams_state::playball)
+void williams_state::playball(machine_config &config)
+{
williams(config);
/* basic machine hardware */
/* video hardware */
- MCFG_SCREEN_MODIFY("screen")
- MCFG_SCREEN_VISIBLE_AREA(6, 298-1, 8, 240-1)
+ m_screen->set_visarea(6, 298-1, 8, 240-1);
/* sound hardware */
- MCFG_DEVICE_ADD("cvsd", HC55516, 0)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 0.8)
+ HC55516(config, "cvsd", 0).add_route(ALL_OUTPUTS, "speaker", 0.8);
/* pia */
m_pia[1]->writepb_handler().set(FUNC(williams_state::playball_snd_cmd_w));
m_pia[2]->ca2_handler().set("cvsd", FUNC(hc55516_device::digit_w));
m_pia[2]->cb2_handler().set("cvsd", FUNC(hc55516_device::clock_w));
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(blaster_state::blastkit)
+void blaster_state::blastkit(machine_config &config)
+{
williams(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(blaster_map)
+ m_maincpu->set_addrmap(AS_PROGRAM, &blaster_state::blaster_map);
MCFG_MACHINE_START_OVERRIDE(blaster_state,blaster)
/* video hardware */
MCFG_VIDEO_START_OVERRIDE(blaster_state,blaster)
- MCFG_SCREEN_MODIFY("screen")
- MCFG_SCREEN_UPDATE_DRIVER(blaster_state, screen_update_blaster)
+ m_screen->set_screen_update(FUNC(blaster_state::screen_update_blaster));
/* pia */
m_pia[0]->readpa_handler().set("mux_a", FUNC(ls157_x2_device::output_r));
@@ -1685,15 +1681,16 @@ MACHINE_CONFIG_START(blaster_state::blastkit)
LS157_X2(config, m_muxa, 0);
m_muxa->a_in_callback().set_ioport("IN3");
m_muxa->b_in_callback().set(FUNC(williams_state::williams_49way_port_0_r));
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(blaster_state::blaster)
+void blaster_state::blaster(machine_config &config)
+{
blastkit(config);
/* basic machine hardware */
- MCFG_DEVICE_ADD("soundcpu_b", M6808, SOUND_CLOCK) // internal clock divider of 4, effective frequency is 894.886kHz
- MCFG_DEVICE_PROGRAM_MAP(sound_map_b)
+ M6808(config, m_soundcpu_b, SOUND_CLOCK); // internal clock divider of 4, effective frequency is 894.886kHz
+ m_soundcpu_b->set_addrmap(AS_PROGRAM, &blaster_state::sound_map_b);
/* pia */
m_pia[0]->readpb_handler().set("mux_b", FUNC(ls157_device::output_r)).mask(0x0f);
@@ -1709,8 +1706,7 @@ MACHINE_CONFIG_START(blaster_state::blaster)
m_muxb->a_in_callback().set_ioport("INP1");
m_muxb->b_in_callback().set_ioport("INP2");
- MCFG_INPUT_MERGER_ANY_HIGH("soundirq_b")
- MCFG_INPUT_MERGER_OUTPUT_HANDLER(INPUTLINE("soundcpu_b", M6808_IRQ_LINE))
+ INPUT_MERGER_ANY_HIGH(config, "soundirq_b").output_handler().set_inputline(m_soundcpu_b, M6808_IRQ_LINE);
m_pia[1]->writepb_handler().set(FUNC(blaster_state::blaster_snd_cmd_w));
@@ -1722,28 +1718,28 @@ MACHINE_CONFIG_START(blaster_state::blaster)
m_pia[3]->irqb_handler().set("soundirq_b", FUNC(input_merger_any_high_device::in_w<1>));
/* sound hardware */
- MCFG_DEVICE_REMOVE("speaker")
- MCFG_DEVICE_REMOVE("dac")
- MCFG_DEVICE_REMOVE("vref")
+ config.device_remove("speaker");
+ config.device_remove("dac");
+ config.device_remove("vref");
SPEAKER(config, "lspeaker").front_left();
SPEAKER(config, "rspeaker").front_right();
- MCFG_DEVICE_ADD("ldac", MC1408, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 0.25) // unknown DAC
- MCFG_DEVICE_ADD("rdac", MC1408, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 0.25) // unknown DAC
- MCFG_DEVICE_ADD("vref", VOLTAGE_REGULATOR, 0) MCFG_VOLTAGE_REGULATOR_OUTPUT(5.0)
- MCFG_SOUND_ROUTE(0, "ldac", 1.0, DAC_VREF_POS_INPUT) MCFG_SOUND_ROUTE(0, "ldac", -1.0, DAC_VREF_NEG_INPUT)
- MCFG_SOUND_ROUTE(0, "rdac", 1.0, DAC_VREF_POS_INPUT) MCFG_SOUND_ROUTE(0, "rdac", -1.0, DAC_VREF_NEG_INPUT)
-MACHINE_CONFIG_END
-
+ MC1408(config, "ldac", 0).add_route(ALL_OUTPUTS, "lspeaker", 0.25); // unknown DAC
+ MC1408(config, "rdac", 0).add_route(ALL_OUTPUTS, "rspeaker", 0.25); // unknown DAC
+ voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref"));
+ vref.add_route(0, "ldac", 1.0, DAC_VREF_POS_INPUT); vref.add_route(0, "ldac", -1.0, DAC_VREF_NEG_INPUT);
+ vref.add_route(0, "rdac", 1.0, DAC_VREF_POS_INPUT); vref.add_route(0, "rdac", -1.0, DAC_VREF_NEG_INPUT);
+}
-MACHINE_CONFIG_START(williams2_state::williams2)
+void williams2_state::williams2(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", MC6809E, MASTER_CLOCK/3/4)
- MCFG_DEVICE_PROGRAM_MAP(williams2_d000_ram_map)
+ MC6809E(config, m_maincpu, MASTER_CLOCK/3/4);
+ m_maincpu->set_addrmap(AS_PROGRAM, &williams2_state::williams2_d000_ram_map);
- MCFG_DEVICE_ADD("soundcpu", M6808, MASTER_CLOCK/3) /* yes, this is different from the older games */
- MCFG_DEVICE_PROGRAM_MAP(williams2_sound_map)
+ M6808(config, m_soundcpu, MASTER_CLOCK/3); /* yes, this is different from the older games */
+ m_soundcpu->set_addrmap(AS_PROGRAM, &williams2_state::williams2_sound_map);
ADDRESS_MAP_BANK(config, "bank8000").set_map(&williams2_state::williams2_bank8000_map).set_options(ENDIANNESS_BIG, 8, 12, 0x800);
@@ -1752,10 +1748,10 @@ MACHINE_CONFIG_START(williams2_state::williams2)
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0); // 5114 + battery
// set a timer to go off every 32 scanlines, to toggle the VA11 line and update the screen
- MCFG_TIMER_DRIVER_ADD_SCANLINE("scan_timer", williams2_state, williams2_va11_callback, "screen", 0, 32)
+ TIMER(config, "scan_timer").configure_scanline(FUNC(williams2_state::williams2_va11_callback), "screen", 0, 32);
// also set a timer to go off on scanline 254
- MCFG_TIMER_DRIVER_ADD_SCANLINE("254_timer", williams2_state, williams2_endscreen_callback, "screen", 8, 246)
+ TIMER(config, "254_timer").configure_scanline(FUNC(williams2_state::williams2_endscreen_callback), "screen", 8, 246);
WATCHDOG_TIMER(config, m_watchdog);
@@ -1763,25 +1759,24 @@ MACHINE_CONFIG_START(williams2_state::williams2)
PALETTE(config, m_palette).set_entries(1024);
GFXDECODE(config, m_gfxdecode, m_palette, gfx_williams2);
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_VIDEO_ATTRIBUTES(VIDEO_UPDATE_SCANLINE | VIDEO_ALWAYS_UPDATE)
- MCFG_SCREEN_RAW_PARAMS(MASTER_CLOCK*2/3, 512, 8, 284, 260, 8, 248)
- MCFG_SCREEN_UPDATE_DRIVER(williams2_state, screen_update_williams2)
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_video_attributes(VIDEO_UPDATE_SCANLINE | VIDEO_ALWAYS_UPDATE);
+ m_screen->set_raw(MASTER_CLOCK*2/3, 512, 8, 284, 260, 8, 248);
+ m_screen->set_screen_update(FUNC(williams2_state::screen_update_williams2));
MCFG_VIDEO_START_OVERRIDE(williams2_state,williams2)
/* sound hardware */
SPEAKER(config, "speaker").front_center();
- MCFG_DEVICE_ADD("dac", MC1408, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 0.5) // unknown DAC
- MCFG_DEVICE_ADD("vref", VOLTAGE_REGULATOR, 0) MCFG_VOLTAGE_REGULATOR_OUTPUT(5.0)
- MCFG_SOUND_ROUTE(0, "dac", 1.0, DAC_VREF_POS_INPUT) MCFG_SOUND_ROUTE(0, "dac", -1.0, DAC_VREF_NEG_INPUT)
+ MC1408(config, "dac", 0).add_route(ALL_OUTPUTS, "speaker", 0.5); // unknown DAC
+ voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref"));
+ vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT);
+ vref.add_route(0, "dac", -1.0, DAC_VREF_NEG_INPUT);
/* pia */
- MCFG_INPUT_MERGER_ANY_HIGH("mainirq")
- MCFG_INPUT_MERGER_OUTPUT_HANDLER(INPUTLINE("maincpu", M6809_IRQ_LINE))
+ INPUT_MERGER_ANY_HIGH(config, "mainirq").output_handler().set_inputline(m_maincpu, M6809_IRQ_LINE);
- MCFG_INPUT_MERGER_ANY_HIGH("soundirq")
- MCFG_INPUT_MERGER_OUTPUT_HANDLER(INPUTLINE("soundcpu", M6808_IRQ_LINE))
+ INPUT_MERGER_ANY_HIGH(config, "soundirq").output_handler().set_inputline(m_soundcpu, M6808_IRQ_LINE);
PIA6821(config, m_pia[0], 0);
m_pia[0]->readpa_handler().set_ioport("IN0");
@@ -1800,10 +1795,11 @@ MACHINE_CONFIG_START(williams2_state::williams2)
m_pia[2]->ca2_handler().set(m_pia[1], FUNC(pia6821_device::cb1_w));
m_pia[2]->irqa_handler().set("soundirq", FUNC(input_merger_any_high_device::in_w<0>));
m_pia[2]->irqb_handler().set("soundirq", FUNC(input_merger_any_high_device::in_w<1>));
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(williams2_state::inferno)
+void williams2_state::inferno(machine_config &config)
+{
williams2(config);
m_pia[0]->readpa_handler().set("mux", FUNC(ls157_x2_device::output_r));
m_pia[0]->ca2_handler().set("mux", FUNC(ls157_x2_device::select_w));
@@ -1811,10 +1807,11 @@ MACHINE_CONFIG_START(williams2_state::inferno)
LS157_X2(config, m_mux, 0); // IC45 (for PA4-PA7) + IC46 (for PA0-PA3) on CPU board
m_mux->a_in_callback().set_ioport("INP1");
m_mux->b_in_callback().set_ioport("INP2");
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(williams2_state::mysticm)
+void williams2_state::mysticm(machine_config &config)
+{
williams2(config);
/* basic machine hardware */
@@ -1825,15 +1822,15 @@ MACHINE_CONFIG_START(williams2_state::mysticm)
m_pia[1]->irqa_handler().set("mainirq", FUNC(input_merger_any_high_device::in_w<1>));
m_pia[1]->irqb_handler().set("mainirq", FUNC(input_merger_any_high_device::in_w<2>));
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(tshoot_state::tshoot)
+void tshoot_state::tshoot(machine_config &config)
+{
williams2(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(williams2_d000_rom_map)
+ m_maincpu->set_addrmap(AS_PROGRAM, &tshoot_state::williams2_d000_rom_map);
MCFG_MACHINE_START_OVERRIDE(tshoot_state,tshoot)
@@ -1847,24 +1844,22 @@ MACHINE_CONFIG_START(tshoot_state::tshoot)
m_pia[1]->irqa_handler().set("mainirq", FUNC(input_merger_any_high_device::in_w<2>));
m_pia[1]->irqb_handler().set("mainirq", FUNC(input_merger_any_high_device::in_w<3>));
- MCFG_DEVICE_MODIFY("pia_2")
m_pia[2]->cb2_handler().set(FUNC(tshoot_state::maxvol_w));
LS157_X2(config, m_mux, 0); // U2 + U3 on interface board
m_mux->a_in_callback().set_ioport("INP1");
m_mux->b_in_callback().set_ioport("INP2");
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(joust2_state::joust2)
+void joust2_state::joust2(machine_config &config)
+{
williams2(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(williams2_d000_rom_map)
+ m_maincpu->set_addrmap(AS_PROGRAM, &joust2_state::williams2_d000_rom_map);
- MCFG_DEVICE_ADD("cvsd", WILLIAMS_CVSD_SOUND)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 1.0)
+ WILLIAMS_CVSD_SOUND(config, m_cvsd_sound).add_route(ALL_OUTPUTS, "speaker", 1.0);
MCFG_MACHINE_START_OVERRIDE(joust2_state,joust2)
MCFG_MACHINE_RESET_OVERRIDE(joust2_state,joust2)
@@ -1884,7 +1879,7 @@ MACHINE_CONFIG_START(joust2_state::joust2)
LS157(config, m_mux, 0);
m_mux->a_in_callback().set_ioport("INP1");
m_mux->b_in_callback().set_ioport("INP2");
-MACHINE_CONFIG_END
+}
diff --git a/src/mame/drivers/wink.cpp b/src/mame/drivers/wink.cpp
index 91ada6938e2..440e5e652db 100644
--- a/src/mame/drivers/wink.cpp
+++ b/src/mame/drivers/wink.cpp
@@ -383,11 +383,12 @@ void wink_state::machine_reset()
m_sound_flag = 0;
}
-MACHINE_CONFIG_START(wink_state::wink)
+void wink_state::wink(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, 12000000 / 4)
- MCFG_DEVICE_PROGRAM_MAP(wink_map)
- MCFG_DEVICE_IO_MAP(wink_io)
+ Z80(config, m_maincpu, 12000000 / 4);
+ m_maincpu->set_addrmap(AS_PROGRAM, &wink_state::wink_map);
+ m_maincpu->set_addrmap(AS_IO, &wink_state::wink_io);
ls259_device &mainlatch(LS259(config, "mainlatch"));
mainlatch.q_out_cb<0>().set(FUNC(wink_state::nmi_enable_w));
@@ -399,22 +400,22 @@ MACHINE_CONFIG_START(wink_state::wink)
mainlatch.q_out_cb<6>().set(FUNC(wink_state::coin_counter_w<1>));
mainlatch.q_out_cb<7>().set(FUNC(wink_state::coin_counter_w<2>));
- MCFG_DEVICE_ADD("audiocpu", Z80, 12000000 / 8)
- MCFG_DEVICE_PROGRAM_MAP(wink_sound_map)
- MCFG_DEVICE_IO_MAP(wink_sound_io)
- MCFG_DEVICE_PERIODIC_INT_DRIVER(wink_state, wink_sound, 15625)
+ Z80(config, m_audiocpu, 12000000 / 8);
+ m_audiocpu->set_addrmap(AS_PROGRAM, &wink_state::wink_sound_map);
+ m_audiocpu->set_addrmap(AS_IO, &wink_state::wink_sound_io);
+ m_audiocpu->set_periodic_int(FUNC(wink_state::wink_sound), attotime::from_hz(15625));
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_1);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(32*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 0*8, 32*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(wink_state, screen_update_wink)
- MCFG_SCREEN_PALETTE("palette")
- MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE(*this, wink_state, nmi_clock_w))
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(32*8, 32*8);
+ screen.set_visarea(0*8, 32*8-1, 0*8, 32*8-1);
+ screen.set_screen_update(FUNC(wink_state::screen_update_wink));
+ screen.set_palette("palette");
+ screen.screen_vblank().set(FUNC(wink_state::nmi_clock_w));
GFXDECODE(config, m_gfxdecode, "palette", gfx_wink);
PALETTE(config, "palette").set_format(palette_device::xBRG_444, 16);
@@ -427,7 +428,7 @@ MACHINE_CONFIG_START(wink_state::wink)
ay8912_device &aysnd(AY8912(config, "aysnd", 12000000 / 8));
aysnd.port_a_read_callback().set(FUNC(wink_state::sound_r));
aysnd.add_route(ALL_OUTPUTS, "mono", 1.0);
-MACHINE_CONFIG_END
+}
/***************************************************************************
diff --git a/src/mame/drivers/wiping.cpp b/src/mame/drivers/wiping.cpp
index 819f68261ba..a5bdb311fda 100644
--- a/src/mame/drivers/wiping.cpp
+++ b/src/mame/drivers/wiping.cpp
@@ -285,16 +285,16 @@ INTERRUPT_GEN_MEMBER(wiping_state::sound_timer_irq)
-MACHINE_CONFIG_START(wiping_state::wiping)
-
+void wiping_state::wiping(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80,18432000/6) /* 3.072 MHz */
- MCFG_DEVICE_PROGRAM_MAP(main_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", wiping_state, vblank_irq)
+ Z80(config, m_maincpu, 18432000/6); /* 3.072 MHz */
+ m_maincpu->set_addrmap(AS_PROGRAM, &wiping_state::main_map);
+ m_maincpu->set_vblank_int("screen", FUNC(wiping_state::vblank_irq));
- MCFG_DEVICE_ADD("audiocpu", Z80,18432000/6) /* 3.072 MHz */
- MCFG_DEVICE_PROGRAM_MAP(sound_map)
- MCFG_DEVICE_PERIODIC_INT_DRIVER(wiping_state, sound_timer_irq, 120) /* periodic interrupt, don't know about the frequency */
+ Z80(config, m_audiocpu, 18432000/6); /* 3.072 MHz */
+ m_audiocpu->set_addrmap(AS_PROGRAM, &wiping_state::sound_map);
+ m_audiocpu->set_periodic_int(FUNC(wiping_state::sound_timer_irq), attotime::from_hz(120)); /* periodic interrupt, don't know about the frequency */
ls259_device &mainlatch(LS259(config, "mainlatch")); // 5A
mainlatch.q_out_cb<0>().set(FUNC(wiping_state::main_irq_mask_w)); // INT1
@@ -305,13 +305,13 @@ MACHINE_CONFIG_START(wiping_state::wiping)
WATCHDOG_TIMER(config, "watchdog");
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(36*8, 28*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 36*8-1, 0*8, 28*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(wiping_state, screen_update)
- MCFG_SCREEN_PALETTE(m_palette)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(36*8, 28*8);
+ screen.set_visarea(0*8, 36*8-1, 0*8, 28*8-1);
+ screen.set_screen_update(FUNC(wiping_state::screen_update));
+ screen.set_palette(m_palette);
GFXDECODE(config, m_gfxdecode, m_palette, gfx_wiping);
PALETTE(config, m_palette, FUNC(wiping_state::wiping_palette), 64*4+64*4, 32);
@@ -320,7 +320,7 @@ MACHINE_CONFIG_START(wiping_state::wiping)
SPEAKER(config, "mono").front_center();
WIPING_CUSTOM(config, "wiping", 96000).add_route(ALL_OUTPUTS, "mono", 1.0);
-MACHINE_CONFIG_END
+}
diff --git a/src/mame/drivers/witch.cpp b/src/mame/drivers/witch.cpp
index a7031a689f2..79b6dad6827 100644
--- a/src/mame/drivers/witch.cpp
+++ b/src/mame/drivers/witch.cpp
@@ -224,40 +224,19 @@ TODO :
#include "includes/witch.h"
-TILE_GET_INFO_MEMBER(witch_state::get_gfx0b_tile_info)
+TILE_GET_INFO_MEMBER(witch_state::get_gfx0_tile_info)
{
int code = m_gfx0_vram[tile_index];
int color = m_gfx0_cram[tile_index];
code=code | ((color & 0xe0) << 3);
- if(color&0x10)
- {
- code=0;
- }
-
SET_TILE_INFO_MEMBER(1,
code, //tiles beyond 0x7ff only for sprites?
color & 0x0f,
0);
-}
-
-TILE_GET_INFO_MEMBER(witch_state::get_gfx0a_tile_info)
-{
- int code = m_gfx0_vram[tile_index];
- int color = m_gfx0_cram[tile_index];
-
- code=code | ((color & 0xe0) << 3);
- if((color&0x10)==0)
- {
- code=0;
- }
-
- SET_TILE_INFO_MEMBER(1,
- code,//tiles beyond 0x7ff only for sprites?
- color & 0x0f,
- 0);
+ tileinfo.category = (color & 0x10) >> 4;
}
TILE_GET_INFO_MEMBER(witch_state::get_gfx1_tile_info)
@@ -284,11 +263,9 @@ TILE_GET_INFO_MEMBER(keirinou_state::get_keirinou_gfx1_tile_info)
void witch_state::video_common_init()
{
- m_gfx0a_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(witch_state::get_gfx0a_tile_info),this),TILEMAP_SCAN_ROWS,8,8,32,32);
- m_gfx0b_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(witch_state::get_gfx0b_tile_info),this),TILEMAP_SCAN_ROWS,8,8,32,32);
+ m_gfx0_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(witch_state::get_gfx0_tile_info),this),TILEMAP_SCAN_ROWS,8,8,32,32);
- m_gfx0a_tilemap->set_transparent_pen(0);
- m_gfx0b_tilemap->set_transparent_pen(0);
+ m_gfx0_tilemap->set_transparent_pen(0);
save_item(NAME(m_scrollx));
save_item(NAME(m_scrolly));
@@ -301,8 +278,7 @@ void witch_state::video_start()
video_common_init();
m_gfx1_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(witch_state::get_gfx1_tile_info),this),TILEMAP_SCAN_ROWS,8,8,32,32);
- m_gfx0a_tilemap->set_palette_offset(0x100);
- m_gfx0b_tilemap->set_palette_offset(0x100);
+ m_gfx0_tilemap->set_palette_offset(0x100);
m_gfx1_tilemap->set_palette_offset(0x200);
has_spr_rom_bank = false;
@@ -314,8 +290,7 @@ void keirinou_state::video_start()
video_common_init();
m_gfx1_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(keirinou_state::get_keirinou_gfx1_tile_info),this),TILEMAP_SCAN_ROWS,8,8,32,32);
- m_gfx0a_tilemap->set_palette_offset(0x000);
- m_gfx0b_tilemap->set_palette_offset(0x000);
+ m_gfx0_tilemap->set_palette_offset(0x000);
m_gfx1_tilemap->set_palette_offset(0x100);
save_item(NAME(m_spr_bank));
@@ -370,30 +345,28 @@ void witch_state::draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect)
}
}
-uint32_t witch_state::screen_update_witch(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
+uint32_t witch_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{
m_gfx1_tilemap->set_scrollx(0, m_scrollx-7 ); //offset to have it aligned with the sprites
m_gfx1_tilemap->set_scrolly(0, m_scrolly+8 );
m_gfx1_tilemap->draw(screen, bitmap, cliprect, 0,0);
- m_gfx0a_tilemap->draw(screen, bitmap, cliprect, 0,0);
+ m_gfx0_tilemap->draw(screen, bitmap, cliprect, 1,0);
draw_sprites(bitmap, cliprect);
- m_gfx0b_tilemap->draw(screen, bitmap, cliprect, 0,0);
+ m_gfx0_tilemap->draw(screen, bitmap, cliprect, 0,0);
return 0;
}
WRITE8_MEMBER(witch_state::gfx0_vram_w)
{
m_gfx0_vram[offset] = data;
- m_gfx0a_tilemap->mark_tile_dirty(offset);
- m_gfx0b_tilemap->mark_tile_dirty(offset);
+ m_gfx0_tilemap->mark_tile_dirty(offset);
}
WRITE8_MEMBER(witch_state::gfx0_cram_w)
{
m_gfx0_cram[offset] = data;
- m_gfx0a_tilemap->mark_tile_dirty(offset);
- m_gfx0b_tilemap->mark_tile_dirty(offset);
+ m_gfx0_tilemap->mark_tile_dirty(offset);
}
#define FIX_OFFSET() do { \
@@ -954,22 +927,23 @@ void witch_state::machine_reset()
m_motor_active = (ioport("YM_PortB")->read() & 0x08) ? 0 : 1;
}
-MACHINE_CONFIG_START(witch_state::witch)
+void witch_state::witch(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, CPU_CLOCK) /* 3 MHz */
- MCFG_DEVICE_PROGRAM_MAP(witch_main_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", witch_state, irq0_line_assert)
+ Z80(config, m_maincpu, CPU_CLOCK); /* 3 MHz */
+ m_maincpu->set_addrmap(AS_PROGRAM, &witch_state::witch_main_map);
+ m_maincpu->set_vblank_int("screen", FUNC(witch_state::irq0_line_assert));
/* 2nd z80 */
- MCFG_DEVICE_ADD("sub", Z80, CPU_CLOCK) /* 3 MHz */
- MCFG_DEVICE_PROGRAM_MAP(witch_sub_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", witch_state, irq0_line_assert)
+ Z80(config, m_subcpu, CPU_CLOCK); /* 3 MHz */
+ m_subcpu->set_addrmap(AS_PROGRAM, &witch_state::witch_sub_map);
+ m_subcpu->set_vblank_int("screen", FUNC(witch_state::irq0_line_assert));
- MCFG_QUANTUM_TIME(attotime::from_hz(6000))
+ config.m_minimum_quantum = attotime::from_hz(6000);
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
- MCFG_TICKET_DISPENSER_ADD("hopper", attotime::from_msec(HOPPER_PULSE), TICKET_MOTOR_ACTIVE_HIGH, TICKET_STATUS_ACTIVE_HIGH)
+ TICKET_DISPENSER(config, m_hopper, attotime::from_msec(HOPPER_PULSE), TICKET_MOTOR_ACTIVE_HIGH, TICKET_STATUS_ACTIVE_HIGH);
// 82C255 (actual chip on PCB) is equivalent to two 8255s
I8255(config, m_ppi[0]);
@@ -983,15 +957,15 @@ MACHINE_CONFIG_START(witch_state::witch)
m_ppi[1]->out_pc_callback().set(FUNC(witch_state::write_a006));
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(256, 256)
- MCFG_SCREEN_VISIBLE_AREA(8, 256-1-8, 8*4, 256-8*4-1)
- MCFG_SCREEN_UPDATE_DRIVER(witch_state, screen_update_witch)
- MCFG_SCREEN_PALETTE(m_palette)
-
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, m_palette, gfx_witch)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(256, 256);
+ screen.set_visarea(8, 256-1-8, 8*4, 256-8*4-1);
+ screen.set_screen_update(FUNC(witch_state::screen_update));
+ screen.set_palette(m_palette);
+
+ GFXDECODE(config, m_gfxdecode, m_palette, gfx_witch);
PALETTE(config, m_palette).set_format(palette_device::xBGR_555, 0x800);
/* sound hardware */
@@ -1015,19 +989,18 @@ MACHINE_CONFIG_START(witch_state::witch)
ym2.port_a_write_callback().set(FUNC(witch_state::xscroll_w));
ym2.port_b_write_callback().set(FUNC(witch_state::yscroll_w));
ym2.add_route(ALL_OUTPUTS, "mono", 0.5);
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(keirinou_state::keirinou)
+void keirinou_state::keirinou(machine_config &config)
+{
witch(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(keirinou_main_map)
+ m_maincpu->set_addrmap(AS_PROGRAM, &keirinou_state::keirinou_main_map);
- MCFG_DEVICE_MODIFY("sub")
- MCFG_DEVICE_PROGRAM_MAP(keirinou_sub_map)
+ m_subcpu->set_addrmap(AS_PROGRAM, &keirinou_state::keirinou_sub_map);
PALETTE(config.replace(), m_palette).set_entries(0x200+0x80);
- MCFG_GFXDECODE_MODIFY("gfxdecode", gfx_keirinou)
+ m_gfxdecode->set_info(gfx_keirinou);
// MCFG_PALETTE_FORMAT(IIBBGGRR)
@@ -1044,16 +1017,15 @@ MACHINE_CONFIG_START(keirinou_state::keirinou)
ay2.port_b_write_callback().set(FUNC(witch_state::yscroll_w));
ay2.add_route(ALL_OUTPUTS, "mono", 0.5);
- MCFG_DEVICE_REMOVE("essnd")
- MCFG_DEVICE_REMOVE("msm")
- MCFG_DEVICE_REMOVE("ym1")
- MCFG_DEVICE_REMOVE("ym2")
-MACHINE_CONFIG_END
+ config.device_remove("essnd");
+ config.device_remove("msm");
+ config.device_remove("ym1");
+ config.device_remove("ym2");
+}
ROM_START( witch )
- ROM_REGION( 0x30000, "maincpu", 0 )
- ROM_LOAD( "u_5b.u5", 0x10000, 0x20000, CRC(5c9f685a) SHA1(b75950048009ffb8c3b356592b1c69f905a1a2bd) )
- ROM_COPY( "maincpu" , 0x10000, 0x0000, 0x8000 )
+ ROM_REGION( 0x20000, "maincpu", 0 )
+ ROM_LOAD( "u_5b.u5", 0x00000, 0x20000, CRC(5c9f685a) SHA1(b75950048009ffb8c3b356592b1c69f905a1a2bd) )
ROM_REGION( 0x10000, "sub", 0 )
ROM_LOAD( "6.s6", 0x00000, 0x08000, CRC(82460b82) SHA1(d85a9d77edaa67dfab8ff6ac4cb6273f0904b3c0) )
@@ -1074,9 +1046,8 @@ ROM_END
/* Witch (With ranking) */
ROM_START( witchb )
- ROM_REGION( 0x30000, "maincpu", 0 )
- ROM_LOAD( "x.u5", 0x10000, 0x20000, CRC(d0818777) SHA1(a6232fef84bec3cfb4a6122a48e96e7b7950e013) )
- ROM_COPY( "maincpu" , 0x10000, 0x0000, 0x8000 )
+ ROM_REGION( 0x20000, "maincpu", 0 )
+ ROM_LOAD( "x.u5", 0x00000, 0x20000, CRC(d0818777) SHA1(a6232fef84bec3cfb4a6122a48e96e7b7950e013) )
ROM_REGION( 0x10000, "sub", 0 )
ROM_LOAD( "6.s6", 0x00000, 0x08000, CRC(82460b82) SHA1(d85a9d77edaa67dfab8ff6ac4cb6273f0904b3c0) )
@@ -1096,9 +1067,8 @@ ROM_END
ROM_START( witchs ) /* this set has (c)1992 Sega / Vic Tokai in the roms */
- ROM_REGION( 0x30000, "maincpu", 0 )
- ROM_LOAD( "rom.u5", 0x10000, 0x20000, CRC(348fccb8) SHA1(947defd86c4a597fbfb9327eec4903aa779b3788) )
- ROM_COPY( "maincpu" , 0x10000, 0x0000, 0x8000 )
+ ROM_REGION( 0x20000, "maincpu", 0 )
+ ROM_LOAD( "rom.u5", 0x00000, 0x20000, CRC(348fccb8) SHA1(947defd86c4a597fbfb9327eec4903aa779b3788) )
ROM_REGION( 0x10000, "sub", 0 )
ROM_LOAD( "6.s6", 0x00000, 0x08000, CRC(82460b82) SHA1(d85a9d77edaa67dfab8ff6ac4cb6273f0904b3c0) ) /* Same data as the Witch set */
@@ -1118,9 +1088,8 @@ ROM_END
ROM_START( pbchmp95 ) /* Licensed for Germany? */
- ROM_REGION( 0x30000, "maincpu", 0 )
- ROM_LOAD( "3.bin", 0x10000, 0x20000, CRC(e881aa05) SHA1(10d259396cac4b9a1b72c262c11ffa5efbdac433) )
- ROM_COPY( "maincpu" , 0x10000, 0x0000, 0x8000 )
+ ROM_REGION( 0x20000, "maincpu", 0 )
+ ROM_LOAD( "3.bin", 0x00000, 0x20000, CRC(e881aa05) SHA1(10d259396cac4b9a1b72c262c11ffa5efbdac433) )
ROM_REGION( 0x10000, "sub", 0 )
ROM_LOAD( "4.bin", 0x00000, 0x08000, CRC(82460b82) SHA1(d85a9d77edaa67dfab8ff6ac4cb6273f0904b3c0) ) /* Same data as the Witch set */
@@ -1164,7 +1133,7 @@ ROM_END
void witch_state::init_witch()
{
- m_mainbank->configure_entries(0, 4, memregion("maincpu")->base() + 0x10000 + UNBANKED_SIZE, 0x8000);
+ m_mainbank->configure_entries(0, 4, memregion("maincpu")->base() + UNBANKED_SIZE, 0x8000);
m_mainbank->set_entry(0);
m_subcpu->space(AS_PROGRAM).install_read_handler(0x7000, 0x700f, read8_delegate(FUNC(witch_state::prot_read_700x), this));
diff --git a/src/mame/drivers/wiz.cpp b/src/mame/drivers/wiz.cpp
index c5f5df16ded..fa0228a83bb 100644
--- a/src/mame/drivers/wiz.cpp
+++ b/src/mame/drivers/wiz.cpp
@@ -790,25 +790,25 @@ INTERRUPT_GEN_MEMBER(wiz_state::wiz_sound_interrupt)
device.execute().pulse_input_line(INPUT_LINE_NMI, attotime::zero);
}
-MACHINE_CONFIG_START(wiz_state::kungfut)
-
+void wiz_state::kungfut(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, 18432000/6) /* 3.072 MHz ??? */
- MCFG_DEVICE_PROGRAM_MAP(kungfut_main_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", wiz_state, wiz_vblank_interrupt)
+ Z80(config, m_maincpu, 18432000/6); /* 3.072 MHz ??? */
+ m_maincpu->set_addrmap(AS_PROGRAM, &wiz_state::kungfut_main_map);
+ m_maincpu->set_vblank_int("screen", FUNC(wiz_state::wiz_vblank_interrupt));
- MCFG_DEVICE_ADD("audiocpu", Z80, 18432000/6) /* 3.072 MHz ??? */
- MCFG_DEVICE_PROGRAM_MAP(kungfut_sound_map)
- MCFG_DEVICE_PERIODIC_INT_DRIVER(wiz_state, wiz_sound_interrupt, 4*60) /* ??? */
+ Z80(config, m_audiocpu, 18432000/6); /* 3.072 MHz ??? */
+ m_audiocpu->set_addrmap(AS_PROGRAM, &wiz_state::kungfut_sound_map);
+ m_audiocpu->set_periodic_int(FUNC(wiz_state::wiz_sound_interrupt), attotime::from_hz(4*60)); /* ??? */
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */ )
- MCFG_SCREEN_SIZE(32*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(wiz_state, screen_update_kungfut)
- MCFG_SCREEN_PALETTE(m_palette)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500) /* not accurate */ );
+ screen.set_size(32*8, 32*8);
+ screen.set_visarea(0*8, 32*8-1, 2*8, 30*8-1);
+ screen.set_screen_update(FUNC(wiz_state::screen_update_kungfut));
+ screen.set_palette(m_palette);
GFXDECODE(config, m_gfxdecode, m_palette, gfx_stinger);
PALETTE(config, m_palette, FUNC(wiz_state::wiz_palette), 256);
@@ -823,57 +823,54 @@ MACHINE_CONFIG_START(wiz_state::kungfut)
AY8910(config, "8910.2", 18432000/12).add_route(ALL_OUTPUTS, "mono", 0.10);
AY8910(config, "8910.3", 18432000/12).add_route(ALL_OUTPUTS, "mono", 0.10);
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(wiz_state::wiz)
+void wiz_state::wiz(machine_config &config)
+{
kungfut(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(wiz_main_map)
+ m_maincpu->set_addrmap(AS_PROGRAM, &wiz_state::wiz_main_map);
/* video hardware */
- MCFG_GFXDECODE_MODIFY("gfxdecode", gfx_wiz)
- MCFG_SCREEN_MODIFY("screen")
- MCFG_SCREEN_UPDATE_DRIVER(wiz_state, screen_update_wiz)
-MACHINE_CONFIG_END
+ m_gfxdecode->set_info(gfx_wiz);
+ subdevice<screen_device>("screen")->set_screen_update(FUNC(wiz_state::screen_update_wiz));
+}
-MACHINE_CONFIG_START(wiz_state::stinger)
+void wiz_state::stinger(machine_config &config)
+{
kungfut(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(stinger_main_map)
- MCFG_DEVICE_OPCODES_MAP(decrypted_opcodes_map)
+ m_maincpu->set_addrmap(AS_PROGRAM, &wiz_state::stinger_main_map);
+ m_maincpu->set_addrmap(AS_OPCODES, &wiz_state::decrypted_opcodes_map);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("audiocpu")
- MCFG_DEVICE_PROGRAM_MAP(stinger_sound_map)
+ m_audiocpu->set_addrmap(AS_PROGRAM, &wiz_state::stinger_sound_map);
WATCHDOG_TIMER(config, "watchdog");
/* video hardware */
- MCFG_SCREEN_MODIFY("screen")
- MCFG_SCREEN_UPDATE_DRIVER(wiz_state, screen_update_stinger)
+ subdevice<screen_device>("screen")->set_screen_update(FUNC(wiz_state::screen_update_stinger));
/* sound hardware */
- MCFG_DEVICE_REMOVE("8910.3")
+ config.device_remove("8910.3");
- MCFG_DEVICE_ADD("discrete", DISCRETE, stinger_discrete)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.5)
-MACHINE_CONFIG_END
+ DISCRETE(config, m_discrete, stinger_discrete).add_route(ALL_OUTPUTS, "mono", 0.5);
+}
-MACHINE_CONFIG_START(wiz_state::scion)
+void wiz_state::scion(machine_config &config)
+{
stinger(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_REMOVE_ADDRESS_MAP(AS_OPCODES)
+ Z80(config.replace(), m_maincpu, 18432000/6); /* 3.072 MHz ??? */
+ m_maincpu->set_addrmap(AS_PROGRAM, &wiz_state::stinger_main_map);
+ m_maincpu->set_vblank_int("screen", FUNC(wiz_state::wiz_vblank_interrupt));
/* video hardware */
- MCFG_SCREEN_MODIFY("screen")
- MCFG_SCREEN_VISIBLE_AREA(2*8, 32*8-1, 2*8, 30*8-1)
-MACHINE_CONFIG_END
+ subdevice<screen_device>("screen")->set_visarea(2*8, 32*8-1, 2*8, 30*8-1);
+}
diff --git a/src/mame/drivers/wmg.cpp b/src/mame/drivers/wmg.cpp
index e0476dd4ad3..b0b521ee4d4 100644
--- a/src/mame/drivers/wmg.cpp
+++ b/src/mame/drivers/wmg.cpp
@@ -488,7 +488,7 @@ READ8_MEMBER( wmg_state::wmg_pia_0_r )
Since there is no code in rom to handle this, it must be a hardware feature
which probably just resets the cpu. */
- uint8_t data = m_pia[0]->read(space, offset);
+ uint8_t data = m_pia[0]->read(offset);
if ((m_wmg_c400) && (offset == 0) && ((data & 0x30) == 0x30)) // P1 and P2 pressed
{
@@ -515,32 +515,32 @@ void wmg_state::init_wmg()
* Machine Driver
*
*************************************/
-MACHINE_CONFIG_START(wmg_state::wmg)
-
+void wmg_state::wmg(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", MC6809E, MASTER_CLOCK/3/4)
- MCFG_DEVICE_PROGRAM_MAP(wmg_cpu1)
+ MC6809E(config, m_maincpu, MASTER_CLOCK/3/4);
+ m_maincpu->set_addrmap(AS_PROGRAM, &wmg_state::wmg_cpu1);
- MCFG_DEVICE_ADD("soundcpu", M6808, SOUND_CLOCK)
- MCFG_DEVICE_PROGRAM_MAP(wmg_cpu2)
+ M6808(config, m_soundcpu, SOUND_CLOCK);
+ m_soundcpu->set_addrmap(AS_PROGRAM, &wmg_state::wmg_cpu2);
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
ADDRESS_MAP_BANK(config, "bankc000").set_map(&wmg_state::wmg_banked_map).set_options(ENDIANNESS_BIG, 8, 16, 0x1000);
// set a timer to go off every 32 scanlines, to toggle the VA11 line and update the screen
- MCFG_TIMER_DRIVER_ADD_SCANLINE("scan_timer", williams_state, williams_va11_callback, "screen", 0, 32)
+ TIMER(config, "scan_timer").configure_scanline(FUNC(williams_state::williams_va11_callback), "screen", 0, 32);
// also set a timer to go off on scanline 240
- MCFG_TIMER_DRIVER_ADD_SCANLINE("240_timer", williams_state, williams_count240_callback, "screen", 0, 240)
+ TIMER(config, "240_timer").configure_scanline(FUNC(williams_state::williams_count240_callback), "screen", 0, 240);
WATCHDOG_TIMER(config, "watchdog");
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_VIDEO_ATTRIBUTES(VIDEO_UPDATE_SCANLINE | VIDEO_ALWAYS_UPDATE)
- MCFG_SCREEN_RAW_PARAMS(MASTER_CLOCK*2/3, 512, 6, 298, 260, 7, 247)
- MCFG_SCREEN_UPDATE_DRIVER(williams_state, screen_update_williams)
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_video_attributes(VIDEO_UPDATE_SCANLINE | VIDEO_ALWAYS_UPDATE);
+ m_screen->set_raw(MASTER_CLOCK*2/3, 512, 6, 298, 260, 7, 247);
+ m_screen->set_screen_update(FUNC(williams_state::screen_update_williams));
MCFG_VIDEO_START_OVERRIDE(williams_state,williams)
@@ -549,16 +549,15 @@ MACHINE_CONFIG_START(wmg_state::wmg)
/* sound hardware */
SPEAKER(config, "speaker").front_center();
- MCFG_DEVICE_ADD("dac", MC1408, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 0.25) // unknown DAC
- MCFG_DEVICE_ADD("vref", VOLTAGE_REGULATOR, 0) MCFG_VOLTAGE_REGULATOR_OUTPUT(5.0)
- MCFG_SOUND_ROUTE(0, "dac", 1.0, DAC_VREF_POS_INPUT) MCFG_SOUND_ROUTE(0, "dac", -1.0, DAC_VREF_NEG_INPUT)
+ MC1408(config, "dac", 0).add_route(ALL_OUTPUTS, "speaker", 0.25); // unknown DAC
+ voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref"));
+ vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT);
+ vref.add_route(0, "dac", -1.0, DAC_VREF_NEG_INPUT);
/* pia */
- MCFG_INPUT_MERGER_ANY_HIGH("mainirq")
- MCFG_INPUT_MERGER_OUTPUT_HANDLER(INPUTLINE("maincpu", M6809_IRQ_LINE))
+ INPUT_MERGER_ANY_HIGH(config, "mainirq").output_handler().set_inputline(m_maincpu, M6809_IRQ_LINE);
- MCFG_INPUT_MERGER_ANY_HIGH("soundirq")
- MCFG_INPUT_MERGER_OUTPUT_HANDLER(INPUTLINE("soundcpu", M6808_IRQ_LINE))
+ INPUT_MERGER_ANY_HIGH(config, "soundirq").output_handler().set_inputline(m_soundcpu, M6808_IRQ_LINE);
pia6821_device &pia0(PIA6821(config, "pia_0", 0));
pia0.readpa_handler().set_ioport("IN0");
@@ -575,7 +574,7 @@ MACHINE_CONFIG_START(wmg_state::wmg)
pia2.writepa_handler().set("dac", FUNC(dac_byte_interface::data_w));
pia2.irqa_handler().set("soundirq", FUNC(input_merger_any_high_device::in_w<0>));
pia2.irqb_handler().set("soundirq", FUNC(input_merger_any_high_device::in_w<1>));
-MACHINE_CONFIG_END
+}
/*************************************
*
diff --git a/src/mame/drivers/wms.cpp b/src/mame/drivers/wms.cpp
index 6cd6df6855a..b06a92ef97b 100644
--- a/src/mame/drivers/wms.cpp
+++ b/src/mame/drivers/wms.cpp
@@ -178,28 +178,29 @@ static GFXDECODE_START( gfx_wms )
GFXDECODE_END
-MACHINE_CONFIG_START(wms_state::wms)
+void wms_state::wms(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", I80188, MAIN_CLOCK ) // AMD N80C188-20, ( 40 MHz. internally divided by 2)
- MCFG_DEVICE_PROGRAM_MAP(wms_map)
- MCFG_DEVICE_IO_MAP(wms_io)
-
- MCFG_DEVICE_ADD("adsp", ADSP2105, MAIN_CLOCK / 2) // ADSP-2105 could run either at 13.824 or 20 MHz...
- MCFG_DEVICE_DISABLE()
- MCFG_DEVICE_PROGRAM_MAP(adsp_program_map)
- MCFG_DEVICE_DATA_MAP(adsp_data_map)
-
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(32*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(wms_state, screen_update_wms)
- MCFG_SCREEN_PALETTE("palette")
-
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_wms)
- MCFG_PALETTE_ADD("palette", 0x100)
-MACHINE_CONFIG_END
+ I80188(config, m_maincpu, MAIN_CLOCK); // AMD N80C188-20, ( 40 MHz. internally divided by 2)
+ m_maincpu->set_addrmap(AS_PROGRAM, &wms_state::wms_map);
+ m_maincpu->set_addrmap(AS_IO, &wms_state::wms_io);
+
+ adsp2105_device &adsp(ADSP2105(config, "adsp", MAIN_CLOCK / 2)); // ADSP-2105 could run either at 13.824 or 20 MHz...
+ adsp.set_disable();
+ adsp.set_addrmap(AS_PROGRAM, &wms_state::adsp_program_map);
+ adsp.set_addrmap(AS_DATA, &wms_state::adsp_data_map);
+
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(32*8, 32*8);
+ screen.set_visarea(0*8, 32*8-1, 2*8, 30*8-1);
+ screen.set_screen_update(FUNC(wms_state::screen_update_wms));
+ screen.set_palette("palette");
+
+ GFXDECODE(config, "gfxdecode", "palette", gfx_wms);
+ PALETTE(config, "palette").set_entries(0x100);
+}
/*********************************************
diff --git a/src/mame/drivers/wolfpack.cpp b/src/mame/drivers/wolfpack.cpp
index da7cb3e1449..611f453464f 100644
--- a/src/mame/drivers/wolfpack.cpp
+++ b/src/mame/drivers/wolfpack.cpp
@@ -306,31 +306,31 @@ static GFXDECODE_START( gfx_wolfpack )
GFXDECODE_END
-MACHINE_CONFIG_START(wolfpack_state::wolfpack)
-
+void wolfpack_state::wolfpack(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M6502, 12096000 / 16)
- MCFG_DEVICE_PROGRAM_MAP(main_map)
+ M6502(config, m_maincpu, 12096000 / 16);
+ m_maincpu->set_addrmap(AS_PROGRAM, &wolfpack_state::main_map);
WATCHDOG_TIMER(config, "watchdog");
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_SIZE(512, 262)
- MCFG_SCREEN_VISIBLE_AREA(0, 511, 16, 239)
- MCFG_SCREEN_UPDATE_DRIVER(wolfpack_state, screen_update)
- MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE(*this, wolfpack_state, screen_vblank))
- MCFG_SCREEN_PALETTE(m_palette)
-
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, m_palette, gfx_wolfpack)
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_refresh_hz(60);
+ m_screen->set_size(512, 262);
+ m_screen->set_visarea(0, 511, 16, 239);
+ m_screen->set_screen_update(FUNC(wolfpack_state::screen_update));
+ m_screen->screen_vblank().set(FUNC(wolfpack_state::screen_vblank));
+ m_screen->set_palette(m_palette);
+
+ GFXDECODE(config, m_gfxdecode, m_palette, gfx_wolfpack);
PALETTE(config, m_palette, FUNC(wolfpack_state::wolfpack_palette), 12, 8);
/* sound hardware */
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("speech", S14001A, 20000) /* RC Clock (C=100pf, R=470K-670K ohms, adjustable) ranging from 14925.37313hz to 21276.59574hz, likely factory set to 20000hz since anything below 19500 is too slow */
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.00)
-MACHINE_CONFIG_END
+ S14001A(config, m_s14001a, 20000); /* RC Clock (C=100pf, R=470K-670K ohms, adjustable) ranging from 14925.37313hz to 21276.59574hz, likely factory set to 20000hz since anything below 19500 is too slow */
+ m_s14001a->add_route(ALL_OUTPUTS, "mono", 1.00);
+}
ROM_START( wolfpack )
diff --git a/src/mame/drivers/wpc_95.cpp b/src/mame/drivers/wpc_95.cpp
index 42312011bc5..d3d26e0d27f 100644
--- a/src/mame/drivers/wpc_95.cpp
+++ b/src/mame/drivers/wpc_95.cpp
@@ -2249,22 +2249,24 @@ static INPUT_PORTS_START( ttt )
PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("UL Flipper Button")
INPUT_PORTS_END
-MACHINE_CONFIG_START(wpc_95_state::wpc_95)
+void wpc_95_state::wpc_95(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", MC6809E, XTAL(8'000'000)/4) // 68B09E
- MCFG_DEVICE_PROGRAM_MAP(wpc_95_map)
- MCFG_DEVICE_PERIODIC_INT_DRIVER(wpc_95_state, irq0_line_assert, XTAL(8'000'000)/8192.0)
- MCFG_TIMER_DRIVER_ADD_PERIODIC("zero_crossing", wpc_95_state, zc_timer, attotime::from_hz(120)) // Mains power zero crossing
-
- MCFG_DEVICE_ADD("pic", WPC_PIC, 0)
- MCFG_DEVICE_ADD("lamp", WPC_LAMP, 0)
- MCFG_DEVICE_ADD("out", WPC_OUT, 0, 3)
- MCFG_DEVICE_ADD("shift", WPC_SHIFT, 0)
+ MC6809E(config, maincpu, XTAL(8'000'000)/4); // 68B09E
+ maincpu->set_addrmap(AS_PROGRAM, &wpc_95_state::wpc_95_map);
+ maincpu->set_periodic_int(FUNC(wpc_95_state::irq0_line_assert), attotime::from_hz(XTAL(8'000'000)/8192.0));
+
+ TIMER(config, "zero_crossing").configure_periodic(FUNC(wpc_95_state::zc_timer), attotime::from_hz(120)); // Mains power zero crossing
+
+ WPC_PIC(config, pic, 0);
+ WPC_LAMP(config, lamp, 0);
+ WPC_OUT(config, out, 0, 3);
+ WPC_SHIFT(config, "shift", 0);
WPC_DMD(config, "dmd", 0).scanline_callback().set(FUNC(wpc_95_state::scanline_irq));
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
DCS_AUDIO_WPC(config, dcs, 0);
-MACHINE_CONFIG_END
+}
/*-----------------
/ Attack From Mars #50041
diff --git a/src/mame/drivers/wpc_dcs.cpp b/src/mame/drivers/wpc_dcs.cpp
index a1b988f0bba..3c14a1f7fe4 100644
--- a/src/mame/drivers/wpc_dcs.cpp
+++ b/src/mame/drivers/wpc_dcs.cpp
@@ -424,22 +424,23 @@ static INPUT_PORTS_START( wpc_dcs )
INPUT_PORTS_END
-MACHINE_CONFIG_START(wpc_dcs_state::wpc_dcs)
+void wpc_dcs_state::wpc_dcs(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M6809, XTAL(8'000'000)/4)
- MCFG_DEVICE_PROGRAM_MAP(wpc_dcs_map)
+ M6809(config, maincpu, XTAL(8'000'000)/4);
+ maincpu->set_addrmap(AS_PROGRAM, &wpc_dcs_state::wpc_dcs_map);
+ maincpu->set_periodic_int(FUNC(wpc_dcs_state::irq0_line_assert), attotime::from_hz(XTAL(8'000'000)/8192.0));
- MCFG_DEVICE_PERIODIC_INT_DRIVER(wpc_dcs_state, irq0_line_assert, XTAL(8'000'000)/8192.0)
- MCFG_TIMER_DRIVER_ADD_PERIODIC("zero_crossing", wpc_dcs_state, zc_timer, attotime::from_hz(120)) // Mains power zero crossing
+ TIMER(config, "zero_crossing").configure_periodic(FUNC(wpc_dcs_state::zc_timer), attotime::from_hz(120)); // Mains power zero crossing
- MCFG_DEVICE_ADD("lamp", WPC_LAMP, 0)
- MCFG_DEVICE_ADD("out", WPC_OUT, 0, 3)
- MCFG_DEVICE_ADD("shift", WPC_SHIFT, 0)
+ WPC_LAMP(config, lamp, 0);
+ WPC_OUT(config, out, 0, 3);
+ WPC_SHIFT(config, "shift", 0);
WPC_DMD(config, "dmd", 0).scanline_callback().set(FUNC(wpc_dcs_state::scanline_irq));
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
DCS_AUDIO_8K(config, dcs, 0);
-MACHINE_CONFIG_END
+}
/*-------------
/ Demolition Man #50028
@@ -859,6 +860,19 @@ ROM_START(sttng_l3)
ROM_LOAD16_BYTE("ng_u8_s.l1", 0xc00000, 0x080000, CRC(c9fb065e) SHA1(c148178ee0ea787acc88078db01d17073e75fdc7))
ROM_END
+ROM_START(sttng_l5)
+ ROM_REGION(0x80000, "maincpu", 0)
+ ROM_LOAD("trek_lx5.rom", 0x00000, 0x80000, CRC(e004f3a7) SHA1(c724641106115e3f14bbe3998771823d0ac12d69))
+ ROM_REGION16_LE(0x1000000, "dcs",0)
+ ROM_LOAD16_BYTE("ng_u2_s.l1", 0x000000, 0x080000, CRC(c3bd7bf5) SHA1(2476ff90232a52d667a407fac81ee4db028b94e5))
+ ROM_LOAD16_BYTE("ng_u3_s.l1", 0x200000, 0x080000, CRC(9456cac7) SHA1(83e415e0f21bb5418f3677dbc13433e056c523ab))
+ ROM_LOAD16_BYTE("ng_u4_s.l1", 0x400000, 0x080000, CRC(179d22a4) SHA1(456b7189e23d4e2bd7e2a6249fa2a73bf0e12194))
+ ROM_LOAD16_BYTE("ng_u5_s.l1", 0x600000, 0x080000, CRC(231a3e72) SHA1(081b1a042e62ccb723788059d6c1e00b9b32c778))
+ ROM_LOAD16_BYTE("ng_u6_s.l1", 0x800000, 0x080000, CRC(bb21377d) SHA1(229fb42a1f8b22727a809e5d63f26f045a2adda5))
+ ROM_LOAD16_BYTE("ng_u7_s.l1", 0xa00000, 0x080000, CRC(d81b39f0) SHA1(3443e7327c755b85a5b390f7fcd0e9923890425a))
+ ROM_LOAD16_BYTE("ng_u8_s.l1", 0xc00000, 0x080000, CRC(c9fb065e) SHA1(c148178ee0ea787acc88078db01d17073e75fdc7))
+ROM_END
+
/*-------------
/ Addams Family Values (Coin Dropper)
@@ -892,6 +906,7 @@ GAME(1994, pop_lx5, 0, wpc_dcs, wpc_dcs, wpc_dcs_state, init_pop
GAME(1994, pop_la4, pop_lx5, wpc_dcs, wpc_dcs, wpc_dcs_state, init_pop, ROT0, "Bally", "Popeye Saves The Earth (LA-4)", MACHINE_MECHANICAL)
GAME(1994, pop_pa3, pop_lx5, wpc_dcs, wpc_dcs, wpc_dcs_state, init_pop, ROT0, "Bally", "Popeye Saves The Earth (PA-3)", MACHINE_MECHANICAL)
GAME(1994, sttng_l7, 0, wpc_dcs, wpc_dcs, wpc_dcs_state, init_sttng, ROT0, "Williams", "Star Trek: The Next Generation (LX-7)", MACHINE_MECHANICAL)
+GAME(1994, sttng_l5, sttng_l7, wpc_dcs, wpc_dcs, wpc_dcs_state, init_sttng, ROT0, "Williams", "Star Trek: The Next Generation (LX-5)", MACHINE_MECHANICAL)
GAME(1994, sttng_x7, sttng_l7, wpc_dcs, wpc_dcs, wpc_dcs_state, init_sttng, ROT0, "Williams", "Star Trek: The Next Generation (LX-7 Special)", MACHINE_MECHANICAL)
GAME(1993, sttng_p8, sttng_l7, wpc_dcs, wpc_dcs, wpc_dcs_state, init_sttng, ROT0, "Williams", "Star Trek: The Next Generation (P-8)", MACHINE_MECHANICAL)
GAME(1993, sttng_p5, sttng_l7, wpc_dcs, wpc_dcs, wpc_dcs_state, init_sttng, ROT0, "Williams", "Star Trek: The Next Generation (P-5)", MACHINE_MECHANICAL)
diff --git a/src/mame/drivers/wpc_s.cpp b/src/mame/drivers/wpc_s.cpp
index be54001da58..d6d5e09e2c5 100644
--- a/src/mame/drivers/wpc_s.cpp
+++ b/src/mame/drivers/wpc_s.cpp
@@ -1971,22 +1971,24 @@ static INPUT_PORTS_START( tfs )
PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("UL Flipper Button")
INPUT_PORTS_END
-MACHINE_CONFIG_START(wpc_s_state::wpc_s)
+void wpc_s_state::wpc_s(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", MC6809E, XTAL(8'000'000)/4)
- MCFG_DEVICE_PROGRAM_MAP(wpc_s_map)
- MCFG_DEVICE_PERIODIC_INT_DRIVER(wpc_s_state, irq0_line_assert, XTAL(8'000'000)/8192.0)
- MCFG_TIMER_DRIVER_ADD_PERIODIC("zero_crossing", wpc_s_state, zc_timer, attotime::from_hz(120)) // Mains power zero crossing
-
- MCFG_DEVICE_ADD("shift", WPC_SHIFT, 0)
- MCFG_DEVICE_ADD("pic", WPC_PIC, 0)
- MCFG_DEVICE_ADD("lamp", WPC_LAMP, 0)
- MCFG_DEVICE_ADD("out", WPC_OUT, 0, 5)
+ MC6809E(config, maincpu, XTAL(8'000'000)/4);
+ maincpu->set_addrmap(AS_PROGRAM, &wpc_s_state::wpc_s_map);
+ maincpu->set_periodic_int(FUNC(wpc_s_state::irq0_line_assert), attotime::from_hz(XTAL(8'000'000)/8192.0));
+
+ TIMER(config, "zero_crossing").configure_periodic(FUNC(wpc_s_state::zc_timer), attotime::from_hz(120)); // Mains power zero crossing
+
+ WPC_SHIFT(config, "shift", 0);
+ WPC_PIC(config, pic, 0);
+ WPC_LAMP(config, lamp, 0);
+ WPC_OUT(config, out, 0, 5);
WPC_DMD(config, "dmd", 0).scanline_callback().set(FUNC(wpc_s_state::scanline_irq));
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
DCS_AUDIO_8K(config, dcs, 0);
-MACHINE_CONFIG_END
+}
/*-----------------
/ Corvette #50036
diff --git a/src/mame/drivers/wrally.cpp b/src/mame/drivers/wrally.cpp
index e186e6a9936..55995779471 100644
--- a/src/mame/drivers/wrally.cpp
+++ b/src/mame/drivers/wrally.cpp
@@ -264,25 +264,26 @@ static GFXDECODE_START( gfx_wrally )
GFXDECODE_END
-MACHINE_CONFIG_START(wrally_state::wrally)
+void wrally_state::wrally(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M68000,XTAL(24'000'000)/2) /* verified on pcb */
- MCFG_DEVICE_PROGRAM_MAP(wrally_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", wrally_state, irq6_line_hold)
+ M68000(config, m_maincpu, XTAL(24'000'000)/2); /* verified on pcb */
+ m_maincpu->set_addrmap(AS_PROGRAM, &wrally_state::wrally_map);
+ m_maincpu->set_vblank_int("screen", FUNC(wrally_state::irq6_line_hold));
- MCFG_DEVICE_ADD("gaelco_ds5002fp", GAELCO_DS5002FP, XTAL(24'000'000) / 2) /* verified on pcb */
- MCFG_DEVICE_ADDRESS_MAP(0, mcu_hostmem_map)
+ gaelco_ds5002fp_device &ds5002(GAELCO_DS5002FP(config, "gaelco_ds5002fp", XTAL(24'000'000) / 2)); /* verified on pcb */
+ ds5002.set_addrmap(0, &wrally_state::mcu_hostmem_map);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */
- MCFG_SCREEN_SIZE(64*16, 32*16)
- MCFG_SCREEN_VISIBLE_AREA(8, 24*16-8-1, 16, 16*16-8-1)
- MCFG_SCREEN_UPDATE_DRIVER(wrally_state, screen_update)
- MCFG_SCREEN_PALETTE(m_palette)
-
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, m_palette, gfx_wrally)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */
+ screen.set_size(64*16, 32*16);
+ screen.set_visarea(8, 24*16-8-1, 16, 16*16-8-1);
+ screen.set_screen_update(FUNC(wrally_state::screen_update));
+ screen.set_palette(m_palette);
+
+ GFXDECODE(config, m_gfxdecode, m_palette, gfx_wrally);
PALETTE(config, m_palette).set_format(palette_device::xBRG_444, 1024*8);
GAELCO_WRALLY_SPRITES(config, m_sprites, 0);
@@ -302,10 +303,10 @@ MACHINE_CONFIG_START(wrally_state::wrally)
/* sound hardware */
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("oki", OKIM6295, XTAL(1'000'000), okim6295_device::PIN7_HIGH) /* verified on pcb */
- MCFG_DEVICE_ADDRESS_MAP(0, oki_map)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
-MACHINE_CONFIG_END
+ okim6295_device &oki(OKIM6295(config, "oki", XTAL(1'000'000), okim6295_device::PIN7_HIGH)); /* verified on pcb */
+ oki.set_addrmap(0, &wrally_state::oki_map);
+ oki.add_route(ALL_OUTPUTS, "mono", 1.0);
+}
ROM_START( wrally )
diff --git a/src/mame/drivers/wrlshunt.cpp b/src/mame/drivers/wrlshunt.cpp
new file mode 100644
index 00000000000..e2c129169c6
--- /dev/null
+++ b/src/mame/drivers/wrlshunt.cpp
@@ -0,0 +1,179 @@
+// license:BSD-3-Clause
+// copyright-holders:Ryan Holtz
+/******************************************************************************
+
+ Wireless Hunting Video Game System skeleton driver
+
+ System: Wireless Hunting Video Game System
+ Publisher: Hamy / Kids Station Toys Inc
+ Year: 2011
+ ROM: FDI MSP55LV100G
+ RAM: Micron Technology 48LC8M16A2
+
+ Games:
+ Secret Mission
+ Predator
+ Delta Force
+ Toy Land
+ Dream Forest
+ Trophy Season
+ Freedom Force
+ Be Careful
+ Net Power
+ Open Training
+ Super Archer
+ Ultimate Frisbee
+ UFO Shooting
+ Happy Darts
+ Balloon Shoot
+ Avatair
+ Angry Pirate
+ Penguin War
+ Ghost Shooter
+ Duck Hunt
+
+
+ ROM Board:
+ Package: SO44
+ Spacing: 1.27 mm
+ Width: 16.14 mm
+ Length: 27.78 mm
+ Voltage: 3V
+ Pinout:
+
+ A25 A24
+ | |
+ +--------------------------+
+ A21 --|== # # `.__.' ==|-- A20
+ A18 --|== ==|-- A19
+ A17 --|== ==|-- A8
+ A7 --|== ==|-- A9
+ A6 --|== o ==|-- A10
+ A5 --|== +----------------+ ==|-- A11
+ A4 --|== | | ==|-- A12
+ A3 --|== | MSP55LV100G | ==|-- A13
+ A2 --|== | 0834 M02H | ==|-- A14
+ A1 --|== | JAPAN | ==|-- A15
+ A0 --|== | | ==|-- A16
+ #CE --|== | | ==|-- A23
+ GND --|== | | ==|-- A22
+ #OE --|== | | ==|-- Q15
+ Q0 --|== | | ==|-- Q7
+ Q8 --|== | | ==|-- Q14
+ Q1 --|== +----------------+ ==|-- Q6
+ Q9 --|== ==|-- Q13
+ Q2 --|== M55L100G ==|-- Q5
+ Q10 --|== ==|-- Q12
+ Q3 --|== ==|-- Q4
+ Q11 --|== ==|-- VCC
+ +--------------------------+
+
+ The only interesting string in this ROM is SPF2ALP,
+ which is also found in the Wireless Air 60 ROM.
+
+*******************************************************************************/
+
+#include "emu.h"
+
+#include "cpu/unsp/unsp.h"
+#include "machine/spg2xx.h"
+
+#include "screen.h"
+#include "speaker.h"
+
+class wrlshunt_state : public driver_device
+{
+public:
+ wrlshunt_state(const machine_config &mconfig, device_type type, const char *tag)
+ : driver_device(mconfig, type, tag)
+ , m_maincpu(*this, "maincpu")
+ , m_screen(*this, "screen")
+ , m_spg(*this, "spg")
+ { }
+
+ void wrlshunt(machine_config &config);
+
+protected:
+ virtual void machine_start() override;
+ virtual void machine_reset() override;
+
+ void mem_map(address_map &map);
+
+ required_device<unsp12_device> m_maincpu;
+ required_device<screen_device> m_screen;
+ required_device<spg2xx_device> m_spg;
+};
+
+
+/************************************
+ *
+ * Machine Hardware
+ *
+ ************************************/
+
+void wrlshunt_state::machine_start()
+{
+}
+
+void wrlshunt_state::machine_reset()
+{
+}
+
+void wrlshunt_state::mem_map(address_map &map)
+{
+ map(0x008000, 0x00ffff).rom().region("maincpu", 0x10000);
+ map(0x000000, 0x007fff).m(m_spg, FUNC(spg_wh_device::map));
+ map(0x040000, 0x07ffff).rom().region("maincpu", 0x106f000);
+}
+
+
+/************************************
+ *
+ * Inputs
+ *
+ ************************************/
+
+static INPUT_PORTS_START( wrlshunt )
+INPUT_PORTS_END
+
+
+/************************************
+ *
+ * Machine Configs
+ *
+ ************************************/
+
+void wrlshunt_state::wrlshunt(machine_config &config)
+{
+ UNSP12(config, m_maincpu, XTAL(27'000'000));
+ m_maincpu->set_addrmap(AS_PROGRAM, &wrlshunt_state::mem_map);
+
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_refresh_hz(60);
+ m_screen->set_size(320, 262);
+ m_screen->set_visarea(0, 320-1, 0, 240-1);
+ m_screen->set_screen_update("spg", FUNC(spg_wh_device::screen_update));
+ m_screen->screen_vblank().set(m_spg, FUNC(spg_wh_device::vblank));
+
+ SPG_WH(config, m_spg, XTAL(27'000'000), m_maincpu, m_screen);
+
+ SPEAKER(config, "lspeaker").front_left();
+ SPEAKER(config, "rspeaker").front_right();
+ m_spg->add_route(ALL_OUTPUTS, "lspeaker", 0.5);
+ m_spg->add_route(ALL_OUTPUTS, "rspeaker", 0.5);
+}
+
+
+/************************************
+ *
+ * ROM Loading
+ *
+ ************************************/
+
+ROM_START( wrlshunt )
+ ROM_REGION( 0x8000000, "maincpu", ROMREGION_ERASE00 )
+ ROM_LOAD16_WORD_SWAP( "wireless.bin", 0x0000, 0x8000000, CRC(a6ecc20e) SHA1(3645f23ba2bb218e92d4560a8ae29dddbaabf796) )
+ROM_END
+
+// valid looking code, but extended periperhal area (twice the size?)
+CONS( 2011, wrlshunt, 0, 0, wrlshunt, wrlshunt, wrlshunt_state, empty_init, "Hamy / Kids Station Toys Inc", "Wireless Hunting Video Game System", MACHINE_NO_SOUND | MACHINE_NOT_WORKING )
diff --git a/src/mame/drivers/wswan.cpp b/src/mame/drivers/wswan.cpp
index 424afbf473f..9ac840b7b82 100644
--- a/src/mame/drivers/wswan.cpp
+++ b/src/mame/drivers/wswan.cpp
@@ -117,58 +117,59 @@ static void wswan_cart(device_slot_interface &device)
device.option_add_internal("ws_eeprom", WS_ROM_EEPROM);
}
-MACHINE_CONFIG_START(wswan_state::wswan)
+void wswan_state::wswan(machine_config &config)
+{
/* Basic machine hardware */
- MCFG_DEVICE_ADD(m_maincpu, V30MZ, 3.072_MHz_XTAL)
- MCFG_DEVICE_PROGRAM_MAP(wswan_mem)
- MCFG_DEVICE_IO_MAP(wswan_io)
+ V30MZ(config, m_maincpu, 3.072_MHz_XTAL);
+ m_maincpu->set_addrmap(AS_PROGRAM, &wswan_state::wswan_mem);
+ m_maincpu->set_addrmap(AS_IO, &wswan_state::wswan_io);
WSWAN_VIDEO(config, m_vdp, 0);
m_vdp->set_vdp_type(VDP_TYPE_WSWAN);
m_vdp->set_irq_callback(FUNC(wswan_state::set_irq_line), this);
m_vdp->set_dmasnd_callback(FUNC(wswan_state::dma_sound_cb), this);
- MCFG_SCREEN_ADD("screen", LCD)
-// MCFG_SCREEN_REFRESH_RATE(75)
-// MCFG_SCREEN_VBLANK_TIME(0)
- MCFG_SCREEN_UPDATE_DEVICE("vdp", wswan_video_device, screen_update)
-// MCFG_SCREEN_SIZE(WSWAN_X_PIXELS, WSWAN_Y_PIXELS)
-// MCFG_SCREEN_VISIBLE_AREA(0*8, WSWAN_X_PIXELS - 1, 0, WSWAN_Y_PIXELS - 1)
- MCFG_SCREEN_RAW_PARAMS(3.072_MHz_XTAL, 256, 0, WSWAN_X_PIXELS, 159, 0, WSWAN_Y_PIXELS)
- MCFG_SCREEN_PALETTE("palette")
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_LCD));
+// screen.set_refresh_rate(75);
+// screen.set_vblank_time(0);
+ screen.set_screen_update("vdp", FUNC(wswan_video_device::screen_update));
+// screen.set_size(WSWAN_X_PIXELS, WSWAN_Y_PIXELS);
+// screen.set_visarea(0*8, WSWAN_X_PIXELS - 1, 0, WSWAN_Y_PIXELS - 1);
+ screen.set_raw(3.072_MHz_XTAL, 256, 0, WSWAN_X_PIXELS, 159, 0, WSWAN_Y_PIXELS);
+ screen.set_palette("palette");
config.set_default_layout(layout_wswan);
- MCFG_QUANTUM_TIME(attotime::from_hz(60))
+ config.m_minimum_quantum = attotime::from_hz(60);
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_1);
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_wswan)
+ GFXDECODE(config, "gfxdecode", "palette", gfx_wswan);
PALETTE(config, "palette", FUNC(wswan_state::wswan_palette), 16);
/* sound hardware */
SPEAKER(config, "lspeaker").front_left();
SPEAKER(config, "rspeaker").front_right();
- MCFG_DEVICE_ADD(m_sound, WSWAN_SND, 3.072_MHz_XTAL)
- MCFG_DEVICE_ADDRESS_MAP(0, wswan_snd)
- MCFG_SOUND_ROUTE(0, "lspeaker", 0.50)
- MCFG_SOUND_ROUTE(1, "rspeaker", 0.50)
+ WSWAN_SND(config, m_sound, 3.072_MHz_XTAL);
+ m_sound->set_addrmap(0, &wswan_state::wswan_snd);
+ m_sound->add_route(0, "lspeaker", 0.50);
+ m_sound->add_route(1, "rspeaker", 0.50);
/* cartridge */
- MCFG_DEVICE_ADD(m_cart, WS_CART_SLOT, 3.072_MHz_XTAL / 8, wswan_cart, nullptr)
+ WS_CART_SLOT(config, m_cart, 3.072_MHz_XTAL / 8, wswan_cart, nullptr);
/* software lists */
- MCFG_SOFTWARE_LIST_ADD("cart_list","wswan")
- MCFG_SOFTWARE_LIST_COMPATIBLE_ADD("wsc_list","wscolor")
+ SOFTWARE_LIST(config, "cart_list").set_original("wswan");
+ SOFTWARE_LIST(config, "wsc_list").set_compatible("wscolor");
- MCFG_SOFTWARE_LIST_COMPATIBLE_ADD("pc2_list","pockchalv2")
-MACHINE_CONFIG_END
+ SOFTWARE_LIST(config, "pc2_list").set_compatible("pockchalv2");
+}
-MACHINE_CONFIG_START(wscolor_state::wscolor)
+void wscolor_state::wscolor(machine_config &config)
+{
wswan(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(wscolor_mem)
+ m_maincpu->set_addrmap(AS_PROGRAM, &wscolor_state::wscolor_mem);
m_vdp->set_vdp_type(VDP_TYPE_WSC);
@@ -177,11 +178,10 @@ MACHINE_CONFIG_START(wscolor_state::wscolor)
palette.set_init(FUNC(wscolor_state::wscolor_palette));
/* software lists */
- MCFG_DEVICE_REMOVE("cart_list")
- MCFG_DEVICE_REMOVE("wsc_list")
- MCFG_SOFTWARE_LIST_ADD("cart_list","wscolor")
- MCFG_SOFTWARE_LIST_COMPATIBLE_ADD("ws_list","wswan")
-MACHINE_CONFIG_END
+ config.device_remove("wsc_list");
+ SOFTWARE_LIST(config.replace(), "cart_list").set_original("wscolor");
+ SOFTWARE_LIST(config, "ws_list").set_compatible("wswan");
+}
/***************************************************************************
diff --git a/src/mame/drivers/wwfsstar.cpp b/src/mame/drivers/wwfsstar.cpp
index 4402d630f96..c7349d1c848 100644
--- a/src/mame/drivers/wwfsstar.cpp
+++ b/src/mame/drivers/wwfsstar.cpp
@@ -413,21 +413,22 @@ GFXDECODE_END
Machine Driver(s)
*******************************************************************************/
-MACHINE_CONFIG_START(wwfsstar_state::wwfsstar)
-
+void wwfsstar_state::wwfsstar(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M68000, CPU_CLOCK)
- MCFG_DEVICE_PROGRAM_MAP(main_map)
- MCFG_TIMER_DRIVER_ADD_SCANLINE("scantimer", wwfsstar_state, scanline, "screen", 0, 1)
+ M68000(config, m_maincpu, CPU_CLOCK);
+ m_maincpu->set_addrmap(AS_PROGRAM, &wwfsstar_state::main_map);
- MCFG_DEVICE_ADD("audiocpu", Z80, XTAL(3'579'545))
- MCFG_DEVICE_PROGRAM_MAP(sound_map)
+ TIMER(config, "scantimer").configure_scanline(FUNC(wwfsstar_state::scanline), "screen", 0, 1);
+
+ Z80(config, m_audiocpu, XTAL(3'579'545));
+ m_audiocpu->set_addrmap(AS_PROGRAM, &wwfsstar_state::sound_map);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_RAW_PARAMS(PIXEL_CLOCK, 320, 0, 256, 272, 8, 248) /* HTOTAL and VTOTAL are guessed */
- MCFG_SCREEN_UPDATE_DRIVER(wwfsstar_state, screen_update)
- MCFG_SCREEN_PALETTE(m_palette)
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_raw(PIXEL_CLOCK, 320, 0, 256, 272, 8, 248); /* HTOTAL and VTOTAL are guessed */
+ m_screen->set_screen_update(FUNC(wwfsstar_state::screen_update));
+ m_screen->set_palette(m_palette);
GFXDECODE(config, m_gfxdecode, m_palette, gfx_wwfsstar);
PALETTE(config, m_palette).set_format(palette_device::xBGR_444, 384);
@@ -444,10 +445,10 @@ MACHINE_CONFIG_START(wwfsstar_state::wwfsstar)
ymsnd.add_route(0, "lspeaker", 0.45);
ymsnd.add_route(1, "rspeaker", 0.45);
- MCFG_DEVICE_ADD("oki", OKIM6295, 1.056_MHz_XTAL, okim6295_device::PIN7_HIGH)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 0.47)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 0.47)
-MACHINE_CONFIG_END
+ okim6295_device &oki(OKIM6295(config, "oki", 1.056_MHz_XTAL, okim6295_device::PIN7_HIGH));
+ oki.add_route(ALL_OUTPUTS, "lspeaker", 0.47);
+ oki.add_route(ALL_OUTPUTS, "rspeaker", 0.47);
+}
/*******************************************************************************
Rom Loaders / Game Drivers
diff --git a/src/mame/drivers/wy150.cpp b/src/mame/drivers/wy150.cpp
new file mode 100644
index 00000000000..fca77aa8f85
--- /dev/null
+++ b/src/mame/drivers/wy150.cpp
@@ -0,0 +1,122 @@
+// license:BSD-3-Clause
+// copyright-holders:AJR
+/***********************************************************************************************************************************
+
+ Skeleton driver for Wyse WY-150 and related terminals.
+
+ The WY-150, originally introduced in Nov. 1988, was the first of the "terminals of the future" that Wyse sold well into the
+ 1990s. The WY-160 is a graphical terminal that runs on different but clearly related hardware.
+
+ All video functions in these terminals are integrated into ASICs (e.g. 211009-01, 211009-02). The 8032 generates all active
+ signals for both the main serial port and the serial keyboard. Three 8Kx8 SRAMs are used to store characters, attributes and
+ font data; the second is also battery-backed.
+
+************************************************************************************************************************************/
+
+#include "emu.h"
+#include "cpu/mcs51/mcs51.h"
+#include "machine/nvram.h"
+#include "screen.h"
+
+class wy150_state : public driver_device
+{
+public:
+ wy150_state(const machine_config &mconfig, device_type type, const char *tag)
+ : driver_device(mconfig, type, tag)
+ , m_screen(*this, "screen")
+ {
+ }
+
+ void wy150(machine_config &config);
+
+protected:
+ virtual void machine_start() override;
+ virtual void driver_start() override;
+
+private:
+ u32 screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
+
+ void prog_map(address_map &map);
+ void ext_map(address_map &map);
+
+ required_device<screen_device> m_screen;
+};
+
+
+void wy150_state::machine_start()
+{
+}
+
+u32 wy150_state::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect)
+{
+ return 0;
+}
+
+void wy150_state::prog_map(address_map &map)
+{
+ map(0x0000, 0xffff).rom().region("program", 0);
+}
+
+void wy150_state::ext_map(address_map &map)
+{
+ map(0x0000, 0x1fff).ram().share("nvram");
+ map(0x2000, 0x3fff).ram();
+ map(0x4000, 0x5fff).ram();
+}
+
+
+static INPUT_PORTS_START(wy150)
+INPUT_PORTS_END
+
+
+void wy150_state::wy150(machine_config &config)
+{
+ i80c32_device &maincpu(I80C32(config, "maincpu", 11_MHz_XTAL)); // Philips P80C32SBPN (e.g.)
+ maincpu.set_addrmap(AS_PROGRAM, &wy150_state::prog_map);
+ maincpu.set_addrmap(AS_IO, &wy150_state::ext_map);
+
+ NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0); // 8464 or 5564 or similar (e.g. Winbond W2465-70LL) + battery
+
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_raw(48_MHz_XTAL, 1530, 0, 1200, 523, 0, 416); // 31.372 kHz horizontal
+ //m_screen->set_raw(48_MHz_XTAL, 1530, 0, 1188, 402, 0, 338);
+ // TBD: WY-160 should have different parameters (has 76 Hz refresh rate rather than 78 Hz)
+ m_screen->set_screen_update(FUNC(wy150_state::screen_update));
+}
+
+
+ROM_START(wy150)
+ ROM_REGION(0x10000, "program", 0)
+ ROM_LOAD("251167-01.bin", 0x00000, 0x10000, CRC(4f425b11) SHA1(e44f54aa98d9f9c668a6ad674ec07e47879fc2a0))
+
+ ROM_REGION(0x20000, "link", 0)
+ ROM_LOAD("link_mc3.bin", 0x00000, 0x10000, CRC(9e1d37d9) SHA1(d74c0faf6cf1eb06243607931967cf35a633ac8e))
+ ROM_LOAD("link_mc5_xerox-wy30.bin", 0x10000, 0x10000, CRC(1aa00cb4) SHA1(6a7267132fe35c8e07deccd67c0fb4fe5a240c99))
+ROM_END
+
+ROM_START(wy120) // b&w
+ ROM_REGION(0x10000, "program", 0)
+ ROM_LOAD("wy120_ver1.4.bin", 0x00000, 0x10000, CRC(6de23624) SHA1(ad90087237347662b5ae4fcc8a05d66d76c46a26))
+ROM_END
+
+ROM_START(wy160)
+ ROM_REGION(0x10000, "program", 0)
+ ROM_LOAD("251167-06.bin", 0x00000, 0x10000, CRC(36e920df) SHA1(8fb7f51b4f47ef63b21d421227d6fef98001e4e9))
+ROM_END
+
+void wy150_state::driver_start()
+{
+ uint8_t *rom = memregion("program")->base();
+ for (offs_t base = 0x00000; base < 0x10000; base += 0x4000)
+ {
+ std::vector<uint8_t> orig(&rom[base], &rom[base + 0x4000]);
+
+ // Line swap is provided by schematic in WY-120 Maintenance Manual
+ for (offs_t offset = 0; offset < 0x4000; offset++)
+ rom[base | offset] = bitswap<8>(orig[bitswap<14>(offset, 7, 8, 6, 5, 4, 3, 9, 10, 11, 12, 13, 2, 1, 0)], 3, 4, 2, 5, 1, 6, 0, 7);
+ }
+}
+
+COMP(1991, wy150, 0, 0, wy150, wy150, wy150_state, empty_init, "Wyse Technology", "WY-150 (v1.0)", MACHINE_IS_SKELETON)
+COMP(1992, wy120, 0, 0, wy150, wy150, wy150_state, empty_init, "Wyse Technology", "WY-120 (v1.4)", MACHINE_IS_SKELETON)
+COMP(1994, wy160, 0, 0, wy150, wy150, wy150_state, empty_init, "Wyse Technology", "WY-160 (v1.7)", MACHINE_IS_SKELETON)
diff --git a/src/mame/drivers/wy30p.cpp b/src/mame/drivers/wy30p.cpp
new file mode 100644
index 00000000000..3f4fe049978
--- /dev/null
+++ b/src/mame/drivers/wy30p.cpp
@@ -0,0 +1,128 @@
+// license:BSD-3-Clause
+// copyright-holders:AJR
+/*******************************************************************************
+
+ Skeleton driver for Wyse WY-30+ terminal.
+
+ This low-end video terminal is the successor to the WY-30, whose control
+ board features an entirely different hardware configuration.
+
+*******************************************************************************/
+
+#include "emu.h"
+#include "cpu/mcs51/mcs51.h"
+#include "machine/eepromser.h"
+#include "screen.h"
+
+class wy30p_state : public driver_device
+{
+public:
+ wy30p_state(const machine_config &mconfig, device_type type, const char *tag)
+ : driver_device(mconfig, type, tag)
+ , m_eeprom(*this, "eeprom")
+ , m_screen(*this, "screen")
+ {
+ }
+
+ void wy30p(machine_config &config);
+
+protected:
+ virtual void machine_start() override;
+ virtual void driver_start() override;
+
+private:
+ u32 screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
+
+ u8 p3_r();
+ u8 de00_r();
+
+ void prog_map(address_map &map);
+ void ext_map(address_map &map);
+
+ required_device<eeprom_serial_er5911_device> m_eeprom;
+ required_device<screen_device> m_screen;
+};
+
+
+void wy30p_state::machine_start()
+{
+}
+
+u32 wy30p_state::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect)
+{
+ return 0;
+}
+
+u8 wy30p_state::p3_r()
+{
+ return 0xdf | (m_eeprom->do_read() << 5);
+}
+
+u8 wy30p_state::de00_r()
+{
+ return m_screen->vblank() << 7; // probably not correct
+}
+
+void wy30p_state::prog_map(address_map &map)
+{
+ map(0x0000, 0x3fff).mirror(0xc000).rom().region("program", 0);
+}
+
+void wy30p_state::ext_map(address_map &map)
+{
+ map(0x0000, 0x1fff).ram();
+ map(0xa000, 0xa7ff).ram();
+ map(0xde00, 0xde00).mirror(0xff).r(FUNC(wy30p_state::de00_r));
+}
+
+
+static INPUT_PORTS_START(wy30p)
+INPUT_PORTS_END
+
+
+void wy30p_state::wy30p(machine_config &config)
+{
+ i8031_device &maincpu(I8031(config, "maincpu", 7.3728_MHz_XTAL));
+ maincpu.set_addrmap(AS_PROGRAM, &wy30p_state::prog_map);
+ maincpu.set_addrmap(AS_IO, &wy30p_state::ext_map);
+ maincpu.port_in_cb<3>().set(FUNC(wy30p_state::p3_r));
+ maincpu.port_out_cb<3>().set(m_eeprom, FUNC(eeprom_serial_er5911_device::cs_write)).bit(3);
+ maincpu.port_out_cb<3>().append(m_eeprom, FUNC(eeprom_serial_er5911_device::clk_write)).bit(4);
+ maincpu.port_out_cb<3>().append(m_eeprom, FUNC(eeprom_serial_er5911_device::di_write)).bit(5);
+
+ EEPROM_ER5911_8BIT(config, m_eeprom);
+
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_raw(31.2795_MHz_XTAL * 2 / 3, 1050, 0, 800, 331, 0, 312); // divider and dimensions guessed
+ m_screen->set_screen_update(FUNC(wy30p_state::screen_update));
+}
+
+
+// PCB: "© 1989 990710-01 REV.B1"
+// CPU: Intel P8031AH
+// Program EPROM: 250971-02 (M27128MFI) "© WYSE TECH 92' REV.A"
+// Nonvolatile memory: CSI CAT59C11P
+// RAM: TC5565APL-12, HY6116AP-15
+// QFP gate array: 211019-02 (Oki M76V020) "© WYSE,1989"
+// Jumper near gate array: "FONT SIZE" = "8Kx8" or "2Kx8" (J3)
+// XTALs: 31.2795 (dot clock?), 7.3728 (for CPU)
+// DB-25 connectors: "MDM" & "AUX"
+ROM_START(wy30p)
+ ROM_REGION(0x4000, "program", 0)
+ ROM_LOAD("250971-02.u4", 0x0000, 0x4000, CRC(3666549c) SHA1(23c432da2083df4b355daf566dd6514d1f9a7690))
+ROM_END
+
+void wy30p_state::driver_start()
+{
+ uint8_t *rom = memregion("program")->base();
+ for (offs_t base = 0x0000; base < 0x4000; base += 0x2000)
+ {
+ std::vector<uint8_t> orig(&rom[base], &rom[base + 0x2000]);
+
+ // Line swaps can be confusing...
+ for (offs_t offset = 0; offset < 0x2000; offset++)
+ rom[base | offset] = bitswap<8>(orig[bitswap<13>(offset, 8, 5, 0, 4, 3, 9, 7, 10, 11, 12, 2, 6, 1)], 3, 4, 5, 6, 7, 2, 1, 0);
+ }
+}
+
+COMP(1992, wy30p, 0, 0, wy30p, wy30p, wy30p_state, empty_init, "Wyse Technology", "WY-30+ (v1.8)", MACHINE_IS_SKELETON)
diff --git a/src/mame/drivers/wy50.cpp b/src/mame/drivers/wy50.cpp
index 97ea61d0a19..437307966cf 100644
--- a/src/mame/drivers/wy50.cpp
+++ b/src/mame/drivers/wy50.cpp
@@ -2,7 +2,7 @@
// copyright-holders:AJR
/*******************************************************************************
- Skeleton driver for Wyse WY-50 and similar display terminals.
+ Preliminary driver for Wyse WY-50 and similar display terminals.
Wyse Technology introduced the WY-50 green screen terminal in the fall of
1983. It was soon followed by the WY-75 ANSI X3.64-compatible terminal and
@@ -25,9 +25,11 @@
*******************************************************************************/
#include "emu.h"
+#include "bus/rs232/rs232.h"
#include "cpu/mcs51/mcs51.h"
#include "machine/er1400.h"
#include "machine/mc2661.h"
+#include "machine/wy50kb.h"
#include "video/scn2674.h"
#include "screen.h"
@@ -37,10 +39,12 @@ public:
wy50_state(const machine_config &mconfig, device_type type, const char *tag)
: driver_device(mconfig, type, tag)
, m_maincpu(*this, "maincpu")
+ , m_keyboard(*this, "keyboard")
, m_earom(*this, "earom")
, m_pvtc(*this, "pvtc")
, m_sio(*this, "sio")
, m_chargen(*this, "chargen")
+ , m_videoram(*this, "videoram%u", 0U)
{
}
@@ -51,7 +55,9 @@ protected:
virtual void machine_reset() override;
private:
+ u8 pvtc_videoram_r(offs_t offset);
SCN2672_DRAW_CHARACTER_MEMBER(draw_character);
+ DECLARE_WRITE_LINE_MEMBER(mbc_attr_clock_w);
u8 pvtc_r(offs_t offset);
void pvtc_w(offs_t offset, u8 data);
@@ -65,17 +71,40 @@ private:
void prg_map(address_map &map);
void io_map(address_map &map);
+ void row_buffer_map(address_map &map);
required_device<mcs51_cpu_device> m_maincpu;
+ required_device<wy50_keyboard_device> m_keyboard;
required_device<er1400_device> m_earom;
required_device<scn2672_device> m_pvtc;
required_device<mc2661_device> m_sio;
required_region_ptr<u8> m_chargen;
+ required_shared_ptr_array<u8, 2> m_videoram;
+
+ u8 m_cur_attr;
+ u8 m_last_row_attr;
+ u8 m_row_buffer_char;
+ bool m_font2;
+ bool m_rev_prot;
+ bool m_is_132;
};
void wy50_state::machine_start()
{
+ m_cur_attr = 0;
+ m_last_row_attr = 0;
+ m_row_buffer_char = 0;
+ m_font2 = false;
+ m_rev_prot = false;
+ m_is_132 = false;
+
+ save_item(NAME(m_cur_attr));
+ save_item(NAME(m_last_row_attr));
+ save_item(NAME(m_row_buffer_char));
+ save_item(NAME(m_font2));
+ save_item(NAME(m_rev_prot));
+ save_item(NAME(m_is_132));
}
void wy50_state::machine_reset()
@@ -84,8 +113,62 @@ void wy50_state::machine_reset()
earom_w(0);
}
+u8 wy50_state::pvtc_videoram_r(offs_t offset)
+{
+ m_row_buffer_char = m_videoram[BIT(offset, 13)][offset & 0x07ff];
+ return m_row_buffer_char;
+}
+
SCN2672_DRAW_CHARACTER_MEMBER(wy50_state::draw_character)
{
+ // Attribute bit 0 = Dim
+ // Attribute bit 1 = Blink
+ // Attribute bit 2 = Blank
+ // Attribute bit 3 = Underline
+ // Attribute bit 4 = Reverse video
+
+ const bool attr = (charcode & 0xe0) == 0x80;
+ const bool prot = (charcode & 0xe0) > 0x80 && !m_font2;
+ if (attr)
+ m_cur_attr = charcode & 0x1f;
+ else if (x == 0)
+ m_cur_attr = m_last_row_attr;
+
+ u16 dots = 0;
+ if (!attr)
+ {
+ // Blinking suppresses underline but blank attribute doesn't
+ if (!BIT(m_cur_attr, 1) || !blink)
+ {
+ // Shift register load inhibited by blanking conditions or underline
+ if (BIT(m_cur_attr, 3) && ul)
+ dots = 0x3ff;
+ else if (!BIT(m_cur_attr, 2))
+ dots = m_chargen[(charcode & (m_font2 ? 0xff : 0x7f)) << 4 | linecount] << 2;
+ }
+
+ // Reverse video for non-attribute characters (XOR of two conditions)
+ if (BIT(m_cur_attr, 4) != (prot && m_rev_prot))
+ dots = ~dots;
+ }
+ if (cursor)
+ dots = ~dots;
+
+ // Apply dimming conditions
+ const rgb_t fg = BIT(m_cur_attr, 0) || (prot && !m_rev_prot) ? rgb_t(0xc0, 0xc0, 0xc0) : rgb_t::white();
+ for (int i = 0; i < 9; i++)
+ {
+ bitmap.pix32(y, x++) = BIT(dots, 9) ? fg : rgb_t::black();
+ dots <<= 1;
+ }
+ if (!m_is_132)
+ bitmap.pix32(y, x++) = BIT(dots, 9) ? fg : rgb_t::black();
+}
+
+WRITE_LINE_MEMBER(wy50_state::mbc_attr_clock_w)
+{
+ if (state)
+ m_last_row_attr = m_cur_attr;
}
u8 wy50_state::pvtc_r(offs_t offset)
@@ -111,29 +194,44 @@ void wy50_state::sio_w(offs_t offset, u8 data)
u8 wy50_state::rbreg_r()
{
// LS374 row buffer diagnostic register
- return 0;
+ return m_row_buffer_char;
}
void wy50_state::keyboard_w(u8 data)
{
+ // Bit 0 = J3-6
+ // Bit 1 = J3-5
+ // Bit 2 = J3-4
+ // Bit 3 = J3-7
+ // Bit 4 = J3-10
+ // Bit 5 = J3-9
+ // Bit 6 = J3-8
+ // Bit 7 = /HSYNC CLAMP
+ m_keyboard->scan_w(data & 0x7f);
}
void wy50_state::earom_w(u8 data)
{
+ // Bit 0 = EAROM D
+ // Bit 1 = EAROM CLK
+ // Bit 2 = EAROM C3
+ // Bit 3 = EAROM C2
+ // Bit 4 = EAROM C1
+ // Bit 5 = UPCHAR/NORM
m_earom->clock_w(BIT(data, 1));
m_earom->c3_w(BIT(data, 2));
m_earom->c2_w(BIT(data, 3));
m_earom->c1_w(BIT(data, 4));
m_earom->data_w(BIT(data, 3) ? BIT(data, 0) : 0);
- // Bit 5 = UPCHAR/NORM
+ m_font2 = BIT(data, 5);
}
u8 wy50_state::p1_r()
{
// P1.0 = AUX RDY
// P1.1 = NVD OUT
- // P1.4 = KEY (inverted)
- return 0xfd | (m_earom->data_r() << 1);
+ // P1.4 = KEY (inverted, active high)
+ return 0xed | (m_earom->data_r() << 1) | (m_keyboard->sense_r() ? 0x00 : 0x10);
}
void wy50_state::p1_w(u8 data)
@@ -143,6 +241,15 @@ void wy50_state::p1_w(u8 data)
// P1.5 = BEEPER
// P1.6 = REV/DIM PROT
// P1.7 (inverted) = 80/132
+
+ m_rev_prot = BIT(data, 6);
+
+ if (m_is_132 != BIT(data, 7))
+ {
+ m_is_132 = BIT(data, 7);
+ m_pvtc->set_character_width(m_is_132 ? 9 : 10);
+ m_pvtc->set_unscaled_clock(68.85_MHz_XTAL / (m_is_132 ? 18 : 30));
+ }
}
void wy50_state::prg_map(address_map &map)
@@ -152,15 +259,22 @@ void wy50_state::prg_map(address_map &map)
void wy50_state::io_map(address_map &map)
{
- map(0x0000, 0x07ff).mirror(0x1800).ram();
- map(0x2000, 0x27ff).mirror(0x1800).ram();
+ map(0x0000, 0x07ff).mirror(0x1800).ram().share("videoram0");
+ map(0x2000, 0x27ff).mirror(0x1800).ram().share("videoram1");
map(0x4000, 0x47ff).mirror(0x1800).rw(FUNC(wy50_state::pvtc_r), FUNC(wy50_state::pvtc_w));
- map(0x6000, 0x63ff).mirror(0x1c00).rw(FUNC(wy50_state::sio_r), FUNC(wy50_state::sio_w));
+ map(0x6000, 0x63ff).mirror(0x0c00).r(FUNC(wy50_state::sio_r));
+ map(0x7000, 0x73ff).mirror(0x0c00).w(FUNC(wy50_state::sio_w));
map(0x8000, 0x8000).mirror(0x1fff).r(FUNC(wy50_state::rbreg_r));
map(0xa000, 0xa000).mirror(0x1fff).w(FUNC(wy50_state::keyboard_w));
map(0xc000, 0xc000).mirror(0x1fff).w(FUNC(wy50_state::earom_w));
}
+void wy50_state::row_buffer_map(address_map &map)
+{
+ map.global_mask(0x0ff);
+ map(0x000, 0x0ff).ram();
+}
+
static INPUT_PORTS_START(wy50)
INPUT_PORTS_END
@@ -172,6 +286,8 @@ void wy50_state::wy50(machine_config &config)
m_maincpu->port_in_cb<1>().set(FUNC(wy50_state::p1_r));
m_maincpu->port_out_cb<1>().set(FUNC(wy50_state::p1_w));
+ WY50_KEYBOARD(config, m_keyboard);
+
ER1400(config, m_earom);
screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
@@ -183,12 +299,23 @@ void wy50_state::wy50(machine_config &config)
SCN2672(config, m_pvtc, 68.85_MHz_XTAL / 30); // SCN2672A or SCN2672B
m_pvtc->set_screen("screen");
m_pvtc->set_character_width(10); // 9 in 132-column mode
+ m_pvtc->set_addrmap(0, &wy50_state::row_buffer_map);
m_pvtc->set_display_callback(FUNC(wy50_state::draw_character));
m_pvtc->intr_callback().set_inputline(m_maincpu, MCS51_T0_LINE);
m_pvtc->breq_callback().set_inputline(m_maincpu, MCS51_INT0_LINE);
+ m_pvtc->mbc_callback().set(FUNC(wy50_state::mbc_attr_clock_w));
+ m_pvtc->mbc_char_callback().set(FUNC(wy50_state::pvtc_videoram_r));
MC2661(config, m_sio, 4.9152_MHz_XTAL); // SCN2661B
- m_sio->txrdy_handler().set_inputline(m_maincpu, MCS51_INT1_LINE);
+ m_sio->rxrdy_handler().set_inputline(m_maincpu, MCS51_INT1_LINE);
+ m_sio->txd_handler().set("modem", FUNC(rs232_port_device::write_txd));
+ m_sio->dtr_handler().set("modem", FUNC(rs232_port_device::write_dtr));
+ m_sio->rts_handler().set("modem", FUNC(rs232_port_device::write_rts));
+
+ rs232_port_device &modem(RS232_PORT(config, "modem", default_rs232_devices, "loopback"));
+ modem.rxd_handler().set(m_sio, FUNC(mc2661_device::rx_w));
+ modem.cts_handler().set(m_sio, FUNC(mc2661_device::cts_w));
+ modem.dcd_handler().set(m_sio, FUNC(mc2661_device::dcd_w));
}
ROM_START(wy50)
diff --git a/src/mame/drivers/wy55.cpp b/src/mame/drivers/wy55.cpp
new file mode 100644
index 00000000000..5625b5f7cd5
--- /dev/null
+++ b/src/mame/drivers/wy55.cpp
@@ -0,0 +1,111 @@
+// license:BSD-3-Clause
+// copyright-holders:AJR
+/***********************************************************************************************************************************
+
+ Skeleton driver for Wyse WY-55 and related terminals.
+
+ The WY-55's custom video gate array is numbered 211019-05. The WY-185 is believed to run on similar hardware, though with
+ 85 Hz and 60 Hz vertical refresh rates rather than 80 Hz and 70 Hz.
+
+***********************************************************************************************************************************/
+
+#include "emu.h"
+#include "cpu/mcs51/mcs51.h"
+//#include "machine/ins8250.h"
+#include "machine/nvram.h"
+#include "screen.h"
+
+class wy55_state : public driver_device
+{
+public:
+ wy55_state(const machine_config &mconfig, device_type type, const char *tag)
+ : driver_device(mconfig, type, tag)
+ , m_maincpu(*this, "maincpu")
+ , m_screen(*this, "screen")
+ , m_progbank(*this, "progbank")
+ {
+ }
+
+ void wy55(machine_config &config);
+
+protected:
+ virtual void machine_start() override;
+ virtual void driver_start() override;
+
+private:
+ u32 screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
+
+ void prog_map(address_map &map);
+ void ext_map(address_map &map);
+
+ required_device<mcs51_cpu_device> m_maincpu;
+ required_device<screen_device> m_screen;
+ required_memory_bank m_progbank;
+};
+
+
+void wy55_state::machine_start()
+{
+ m_progbank->configure_entries(0, 2, memregion("program")->base(), 0x10000);
+ m_progbank->set_entry(0);
+}
+
+u32 wy55_state::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect)
+{
+ return 0;
+}
+
+void wy55_state::prog_map(address_map &map)
+{
+ map(0x0000, 0xffff).bankr("progbank");
+}
+
+void wy55_state::ext_map(address_map &map)
+{
+ map(0x0000, 0x1fff).ram().share("nvram0");
+ map(0x8000, 0x9fff).ram().share("nvram1");
+ map(0xa000, 0xbfff).ram().share("fontram");
+ //map(0xf028, 0xf037).rw("uart", FUNC(pc16552_device::read), FUNC(pc16552_device::write));
+}
+
+
+static INPUT_PORTS_START(wy55)
+INPUT_PORTS_END
+
+void wy55_state::wy55(machine_config &config)
+{
+ I8032(config, m_maincpu, 14.7456_MHz_XTAL);
+ m_maincpu->set_addrmap(AS_PROGRAM, &wy55_state::prog_map);
+ m_maincpu->set_addrmap(AS_IO, &wy55_state::ext_map);
+ m_maincpu->port_out_cb<1>().set_membank("progbank").bit(2);
+
+ NVRAM(config, "nvram0", nvram_device::DEFAULT_ALL_0); // 8K SRAM + battery
+ NVRAM(config, "nvram1", nvram_device::DEFAULT_ALL_0); // 8K SRAM + battery
+
+ //PC16552D(config, "uart", 14.7456_MHz_XTAL / 2); // 16C452 (divider not verified)
+
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_raw(49.4235_MHz_XTAL, 1575, 0, 1188, 448, 0, 416);
+ //m_screen->set_raw(49.4235_MHz_XTAL * 2 / 3, 1050, 0, 800, 392, 0, 338);
+ m_screen->set_screen_update(FUNC(wy55_state::screen_update));
+}
+
+
+ROM_START(wy55)
+ ROM_REGION(0x20000, "program", 0)
+ ROM_LOAD("251352-12.bin", 0x0000, 0x20000, CRC(efe41862) SHA1(52ee76d636b166fa10a37356aef81011a9b079cc)) // v2.1
+ROM_END
+
+void wy55_state::driver_start()
+{
+ uint8_t *rom = memregion("program")->base();
+ for (offs_t base = 0x00000; base < 0x20000; base += 0x4000)
+ {
+ std::vector<uint8_t> orig(&rom[base], &rom[base + 0x4000]);
+
+ for (offs_t offset = 0; offset < 0x4000; offset++)
+ rom[base | offset] = bitswap<8>(orig[bitswap<14>(offset, 3, 8, 2, 0, 7, 4, 9, 10, 11, 12, 13, 5, 1, 6)], 3, 4, 5, 2, 6, 1, 7, 0);
+ }
+}
+
+COMP(1993, wy55, 0, 0, wy55, wy55, wy55_state, empty_init, "Wyse Technology", "WY-55 (v2.1)", MACHINE_IS_SKELETON)
diff --git a/src/mame/drivers/wy60.cpp b/src/mame/drivers/wy60.cpp
new file mode 100644
index 00000000000..ef05208733c
--- /dev/null
+++ b/src/mame/drivers/wy60.cpp
@@ -0,0 +1,168 @@
+// license:BSD-3-Clause
+// copyright-holders:AJR
+/***********************************************************************************************************************************
+
+ Skeleton driver for Wyse WY-60 terminal.
+
+***********************************************************************************************************************************/
+
+#include "emu.h"
+#include "cpu/mcs51/mcs51.h"
+//#include "machine/i2cmem.h"
+#include "machine/mc2661.h"
+#include "video/scn2674.h"
+#include "screen.h"
+
+class wy60_state : public driver_device
+{
+public:
+ wy60_state(const machine_config &mconfig, device_type type, const char *tag)
+ : driver_device(mconfig, type, tag)
+ , m_pvtc(*this, "pvtc")
+ , m_sio(*this, "sio")
+ {
+ }
+
+ void wy60(machine_config &config);
+
+protected:
+ virtual void machine_start() override;
+ virtual void driver_start() override;
+
+private:
+ SCN2672_DRAW_CHARACTER_MEMBER(draw_character);
+
+ u8 pvtc_r(offs_t offset);
+ void pvtc_w(offs_t offset, u8 data);
+ u8 sio_r(offs_t offset);
+ void sio_w(offs_t offset, u8 data);
+
+ void prog_map(address_map &map);
+ void ext_map(address_map &map);
+ void row_buffer_map(address_map &map);
+
+ required_device<scn2672_device> m_pvtc;
+ required_device<mc2661_device> m_sio;
+};
+
+
+void wy60_state::machine_start()
+{
+}
+
+SCN2672_DRAW_CHARACTER_MEMBER(wy60_state::draw_character)
+{
+}
+
+u8 wy60_state::pvtc_r(offs_t offset)
+{
+ return m_pvtc->read(offset >> 8);
+}
+
+void wy60_state::pvtc_w(offs_t offset, u8 data)
+{
+ m_pvtc->write(offset >> 8, data);
+}
+
+u8 wy60_state::sio_r(offs_t offset)
+{
+ return m_sio->read(offset >> 8);
+}
+
+void wy60_state::sio_w(offs_t offset, u8 data)
+{
+ m_sio->write(offset >> 8, data);
+}
+
+void wy60_state::prog_map(address_map &map)
+{
+ // TODO: EA banking?
+ map(0x0000, 0xffff).rom().region("coderom", 0);
+}
+
+void wy60_state::ext_map(address_map &map)
+{
+ map(0x0000, 0x1fff).ram().share("charram");
+ map(0x2000, 0x3fff).ram().share("attrram");
+ map(0xa000, 0xa7ff).mirror(0x1800).rw(FUNC(wy60_state::pvtc_r), FUNC(wy60_state::pvtc_w));
+ map(0xc000, 0xc3ff).mirror(0xc00).r(FUNC(wy60_state::sio_r));
+ map(0xd000, 0xd3ff).mirror(0xc00).w(FUNC(wy60_state::sio_w));
+}
+
+void wy60_state::row_buffer_map(address_map &map)
+{
+ map.global_mask(0x0ff);
+ map(0x000, 0x0ff).ram();
+}
+
+
+static INPUT_PORTS_START(wy60)
+INPUT_PORTS_END
+
+void wy60_state::wy60(machine_config &config)
+{
+ i8051_device &maincpu(I8051(config, "maincpu", 11_MHz_XTAL)); // P8051AN-40196
+ maincpu.set_addrmap(AS_PROGRAM, &wy60_state::prog_map);
+ maincpu.set_addrmap(AS_IO, &wy60_state::ext_map);
+
+ //X2404(config, m_eeprom);
+
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_raw(26.58_MHz_XTAL, 1000, 0, 800, 443, 0, 416); // 26.580 kHz horizontal
+ //screen.set_raw(39.71_MHz_XTAL, 1494, 0, 1188, 443, 0, 416);
+ screen.set_screen_update("pvtc", FUNC(scn2672_device::screen_update));
+
+ SCN2672(config, m_pvtc, 26.58_MHz_XTAL / 10); // custom-marked as Motorola SC67336P (205001-02)
+ m_pvtc->set_screen("screen");
+ m_pvtc->set_character_width(10); // 9 in 132-column mode
+ m_pvtc->set_addrmap(0, &wy60_state::row_buffer_map);
+ m_pvtc->set_addrmap(1, &wy60_state::row_buffer_map);
+ m_pvtc->set_display_callback(FUNC(wy60_state::draw_character));
+ //m_pvtc->intr_callback().set_inputline("maincpu", MCS51_T0_LINE);
+ //m_pvtc->breq_callback().set_inputline("maincpu", MCS51_INT0_LINE);
+
+ MC2661(config, m_sio, 4.9152_MHz_XTAL); // SCN2661B
+ //m_sio->rxrdy_handler().set_inputline("maincpu", MCS51_INT1_LINE);
+}
+
+// CPU: 8051(202008-03)
+// EPROM: 27512(193003-01)
+// Video: 211003-02/205001-02
+// RAM: 2064 (2064/2016/2016/2064)
+// NVRAM: X2404
+// UART: 2661
+// XTALs: 39.710, 26.580, 11.000, 4.9152
+
+ROM_START(wy60)
+ ROM_REGION(0x1000, "maincpu", 0)
+ ROM_LOAD("202008-03.bin", 0x0000, 0x1000, NO_DUMP)
+
+ ROM_REGION(0x10000, "coderom", 0)
+ ROM_LOAD("193003-01.u9", 0x00000, 0x10000, CRC(26de0ea4) SHA1(91409f98a3990b514fbcb7de2eb45944bf5b95bc))
+ROM_END
+
+ROM_START(wy60a)
+ ROM_REGION(0x1000, "maincpu", 0)
+ ROM_LOAD("202008-03.bin", 0x0000, 0x1000, NO_DUMP)
+
+ ROM_REGION(0x10000, "coderom", 0)
+ ROM_LOAD("wy-60_4k.u6", 0x00000, 0x10000, CRC(6daf2824) SHA1(23cd039ec7ae71b0742e8eebf75be8cd5992e3fd))
+ROM_END
+
+void wy60_state::driver_start()
+{
+ uint8_t *rom = memregion("coderom")->base();
+ for (offs_t base = 0x00000; base < 0x10000; base += 0x2000)
+ {
+ std::vector<uint8_t> orig(&rom[base], &rom[base + 0x2000]);
+
+ for (offs_t offset = 0; offset < 0x2000; offset++)
+ rom[base | offset] = bitswap<8>(orig[bitswap<13>(offset, 0, 6, 9, 4, 2, 1, 3, 5, 7, 8, 10, 11, 12)], 6, 0, 5, 1, 4, 2, 3, 7);
+ }
+
+ // FIXME: remove once internal ROM is dumped
+ std::copy_n(rom, 0x1000, memregion("maincpu")->base());
+}
+
+COMP(1986, wy60, 0, 0, wy60, wy60, wy60_state, empty_init, "Wyse Technology", "WY-60 (set 1)", MACHINE_IS_SKELETON)
+COMP(1986, wy60a, wy60, 0, wy60, wy60, wy60_state, empty_init, "Wyse Technology", "WY-60 (set 2)", MACHINE_IS_SKELETON)
diff --git a/src/mame/drivers/wyse.cpp b/src/mame/drivers/wyse.cpp
deleted file mode 100644
index 7e4cdf90eaf..00000000000
--- a/src/mame/drivers/wyse.cpp
+++ /dev/null
@@ -1,103 +0,0 @@
-// license:BSD-3-Clause
-// copyright-holders:
-/***********************************************************************************************************************************
-
-2017-10-27 Skeleton
-
-Wyse terminals.
-
-WY-30+: P8031AH, OKI M76V020, TC5565APL-12, HY6116AP-15, Beeper, 31.2795, 7.3728 (for CPU)
-
-WY-60: SC67336P, P8051AN-40196, SCN2661B, 7219-0629, 4.9152, 11.000, 39.710, 26.580, Beeper
-
-WY-150: Philips P80C32SBPN, Toshiba 211009-02, Winbond ??, unknown crystal
-
- CPU EPROM VIDEO RAM Row Buffer Font RAM NVRAM Serial Dot Clk CPU Clk Ser Clk
-WY-30+ 8031 27128(250971-02) 211019-02 5565 6116 CAT59C11 31.2795 7.3728
-WY-55 8032 (251352-12) 211019-05 8k (8kx2) battery 16C452 49.423 14.7456
-WY-60 8051(202008-03) 27512(193003-01) 211003-02/205001-02 2064 ( 2064/2016/2016/2064) X24C04 2661 39.710/26.580 11.000 4.9152
-WY-120 8032 27256(250412-01) SLA7490(211009-01) 6264/5564 6264 battery - 48.000 11.000
-WY-150 8032 27512(251167-06) 211009-02 6264 (2x6264) battery - 48.000 11.000
-
-
-************************************************************************************************************************************/
-
-#include "emu.h"
-#include "cpu/mcs51/mcs51.h"
-
-class wyse_state : public driver_device
-{
-public:
- wyse_state(const machine_config &mconfig, device_type type, const char *tag)
- : driver_device(mconfig, type, tag)
- // , m_maincpu(*this, "maincpu")
- { }
-
- void wyse(machine_config &config);
-
-private:
- void io_map(address_map &map);
- void mem_map(address_map &map);
-
- // required_device<cpu_device> m_maincpu;
-};
-
-void wyse_state::mem_map(address_map &map)
-{
- map(0x0000, 0x3fff).rom();
-}
-
-void wyse_state::io_map(address_map &map)
-{
-}
-
-static INPUT_PORTS_START( wyse )
-INPUT_PORTS_END
-
-MACHINE_CONFIG_START(wyse_state::wyse)
- MCFG_DEVICE_ADD("maincpu", I8031, 11'000'000)
- MCFG_DEVICE_PROGRAM_MAP(mem_map)
- MCFG_DEVICE_IO_MAP(io_map)
-MACHINE_CONFIG_END
-
-ROM_START( wy30p )
- ROM_REGION( 0x10000, "maincpu", 0 )
- ROM_LOAD( "250971-02.u4", 0x0000, 0x4000, CRC(3666549c) SHA1(23c432da2083df4b355daf566dd6514d1f9a7690) )
-ROM_END
-
-ROM_START( wy55 )
- ROM_REGION( 0x20000, "maincpu", 0 )
- ROM_LOAD( "251352-12.bin", 0x0000, 0x20000, CRC(efe41862) SHA1(52ee76d636b166fa10a37356aef81011a9b079cc) ) // v2.1
-ROM_END
-
-ROM_START( wy60 )
- ROM_REGION( 0x10000, "maincpu", 0 )
- ROM_LOAD( "193003-01.u9", 0x0000, 0x10000, CRC(26de0ea4) SHA1(91409f98a3990b514fbcb7de2eb45944bf5b95bc) )
- ROM_REGION( 0x10000, "user1", 0 )
- ROM_LOAD( "wy-60_4k.u6", 0x0000, 0x10000, CRC(6daf2824) SHA1(23cd039ec7ae71b0742e8eebf75be8cd5992e3fd) )
-ROM_END
-
-ROM_START( wy120 ) // b&w
- ROM_REGION( 0x10000, "maincpu", 0 )
- ROM_LOAD( "wy120_ver1.4.bin", 0x000000, 0x010000, CRC(6de23624) SHA1(ad90087237347662b5ae4fcc8a05d66d76c46a26) )
-ROM_END
-
-ROM_START( wy150 )
- ROM_REGION( 0x10000, "maincpu", 0 )
- ROM_LOAD( "251167-01.bin", 0x00000, 0x10000, CRC(4f425b11) SHA1(e44f54aa98d9f9c668a6ad674ec07e47879fc2a0) )
- ROM_REGION( 0x20000, "link", 0 )
- ROM_LOAD( "link_mc3.bin", 0x00000, 0x10000, CRC(9e1d37d9) SHA1(d74c0faf6cf1eb06243607931967cf35a633ac8e) )
- ROM_LOAD( "link_mc5_xerox-wy30.bin", 0x10000, 0x10000, CRC(1aa00cb4) SHA1(6a7267132fe35c8e07deccd67c0fb4fe5a240c99) )
-ROM_END
-
-ROM_START( wy160 )
- ROM_REGION( 0x10000, "maincpu", 0 )
- ROM_LOAD( "251167-06.bin", 0x00000, 0x10000, CRC(36e920df) SHA1(8fb7f51b4f47ef63b21d421227d6fef98001e4e9) )
-ROM_END
-
-COMP( 1986, wy60, 0, 0, wyse, wyse, wyse_state, empty_init, "Wyse Technology", "WY-60", MACHINE_IS_SKELETON )
-COMP( 1987, wy120, 0, 0, wyse, wyse, wyse_state, empty_init, "Wyse Technology", "WY-120", MACHINE_IS_SKELETON )
-COMP( 1988, wy150, 0, 0, wyse, wyse, wyse_state, empty_init, "Wyse Technology", "WY-150", MACHINE_IS_SKELETON )
-COMP( 1990, wy160, 0, 0, wyse, wyse, wyse_state, empty_init, "Wyse Technology", "WY-160", MACHINE_IS_SKELETON )
-COMP( 1991, wy30p, 0, 0, wyse, wyse, wyse_state, empty_init, "Wyse Technology", "WY-30+", MACHINE_IS_SKELETON )
-COMP( 1993, wy55, 0, 0, wyse, wyse, wyse_state, empty_init, "Wyse Technology", "WY-55", MACHINE_IS_SKELETON )
diff --git a/src/mame/drivers/wyvernf0.cpp b/src/mame/drivers/wyvernf0.cpp
index 0f6c71f2dd2..932feb70810 100644
--- a/src/mame/drivers/wyvernf0.cpp
+++ b/src/mame/drivers/wyvernf0.cpp
@@ -659,9 +659,9 @@ void wyvernf0_state::wyvernf0(machine_config &config)
m_audiocpu->set_addrmap(AS_PROGRAM, &wyvernf0_state::sound_map);
m_audiocpu->set_periodic_int(FUNC(wyvernf0_state::irq0_line_hold), attotime::from_hz(60*2)); // IRQ generated by ??? (drives music tempo), NMI by main cpu
-// MCFG_DEVICE_ADD("mcu", M68705P5, 4000000) // ?
+// M68705P5(config, "mcu", 4000000); // ?
-// MCFG_QUANTUM_TIME(attotime::from_hz(6000)) // 100 CPU slices per second to synchronize between the MCU and the main CPU
+// config.m_minimum_quantum = attotime::from_hz(6000); // 100 CPU slices per second to synchronize between the MCU and the main CPU
// video hardware
screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
@@ -704,7 +704,6 @@ void wyvernf0_state::wyvernf0(machine_config &config)
DAC_8BIT_R2R(config, "dac", 0).add_route(ALL_OUTPUTS, "mono", 0.25); // unknown DAC
voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref", 0));
- vref.set_output(5.0);
vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT);
vref.add_route(0, "dac", -1.0, DAC_VREF_NEG_INPUT);
}
diff --git a/src/mame/drivers/x07.cpp b/src/mame/drivers/x07.cpp
index cab05b9f357..a6af4c9e50a 100644
--- a/src/mame/drivers/x07.cpp
+++ b/src/mame/drivers/x07.cpp
@@ -1437,9 +1437,9 @@ void x07_state::machine_start()
{
// 0x4000 - 0x4fff 4KB RAM
// 0x6000 - 0x7fff 8KB ROM
- program.install_read_handler(ram_size, ram_size + 0xfff, read8_delegate(FUNC(generic_slot_device::read_ram),(generic_slot_device*)m_card));
- program.install_write_handler(ram_size, ram_size + 0xfff, write8_delegate(FUNC(generic_slot_device::write_ram),(generic_slot_device*)m_card));
- program.install_read_handler(0x6000, 0x7fff, read8_delegate(FUNC(generic_slot_device::read_rom),(generic_slot_device*)m_card));
+ program.install_read_handler(ram_size, ram_size + 0xfff, read8sm_delegate(FUNC(generic_slot_device::read_ram),(generic_slot_device*)m_card));
+ program.install_write_handler(ram_size, ram_size + 0xfff, write8sm_delegate(FUNC(generic_slot_device::write_ram),(generic_slot_device*)m_card));
+ program.install_read_handler(0x6000, 0x7fff, read8sm_delegate(FUNC(generic_slot_device::read_rom),(generic_slot_device*)m_card));
m_card->save_ram();
}
@@ -1482,18 +1482,18 @@ void x07_state::machine_reset()
MACHINE_CONFIG_START(x07_state::x07)
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", NSC800, 15.36_MHz_XTAL / 4)
- MCFG_DEVICE_PROGRAM_MAP(x07_mem)
- MCFG_DEVICE_IO_MAP(x07_io)
+ NSC800(config, m_maincpu, 15.36_MHz_XTAL / 4);
+ m_maincpu->set_addrmap(AS_PROGRAM, &x07_state::x07_mem);
+ m_maincpu->set_addrmap(AS_IO, &x07_state::x07_io);
/* video hardware */
- MCFG_SCREEN_ADD("lcd", LCD)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */
- MCFG_SCREEN_UPDATE_DRIVER(x07_state, screen_update)
- MCFG_SCREEN_SIZE(120, 32)
- MCFG_SCREEN_VISIBLE_AREA(0, 120-1, 0, 32-1)
- MCFG_SCREEN_PALETTE("palette")
+ screen_device &lcd(SCREEN(config, "lcd", SCREEN_TYPE_LCD));
+ lcd.set_refresh_hz(60);
+ lcd.set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */
+ lcd.set_screen_update(FUNC(x07_state::screen_update));
+ lcd.set_size(120, 32);
+ lcd.set_visarea(0, 120-1, 0, 32-1);
+ lcd.set_palette("palette");
PALETTE(config, "palette", FUNC(x07_state::x07_palette), 2);
GFXDECODE(config, "gfxdecode", "palette", gfx_x07);
@@ -1501,12 +1501,12 @@ MACHINE_CONFIG_START(x07_state::x07)
/* sound hardware */
SPEAKER(config, "mono").front_center();
BEEP(config, "beeper", 0).add_route(ALL_OUTPUTS, "mono", 0.50);
- WAVE(config, "wave", "cassette").add_route(ALL_OUTPUTS, "mono", 0.25);
+ WAVE(config, "wave", m_cassette).add_route(ALL_OUTPUTS, "mono", 0.25);
/* printer */
- MCFG_DEVICE_ADD("printer", PRINTER, 0)
+ PRINTER(config, m_printer, 0);
- MCFG_TIMER_DRIVER_ADD_PERIODIC("blink_timer", x07_state, blink_timer, attotime::from_msec(300))
+ TIMER(config, "blink_timer").configure_periodic(FUNC(x07_state::blink_timer), attotime::from_msec(300));
NVRAM(config, "nvram1").set_custom_handler(FUNC(x07_state::nvram_init)); // t6834 RAM
NVRAM(config, "nvram2", nvram_device::DEFAULT_ALL_0); // RAM banks
@@ -1525,14 +1525,14 @@ MACHINE_CONFIG_START(x07_state::x07)
MCFG_GENERIC_LOAD(x07_state, x07_card)
/* cassette */
- MCFG_CASSETTE_ADD("cassette")
- MCFG_CASSETTE_FORMATS(x07_cassette_formats)
- MCFG_CASSETTE_DEFAULT_STATE(CASSETTE_PLAY | CASSETTE_MOTOR_DISABLED | CASSETTE_SPEAKER_ENABLED)
- MCFG_CASSETTE_INTERFACE("x07_cass")
+ CASSETTE(config, m_cassette);
+ m_cassette->set_formats(x07_cassette_formats);
+ m_cassette->set_default_state(CASSETTE_PLAY | CASSETTE_MOTOR_DISABLED | CASSETTE_SPEAKER_ENABLED);
+ m_cassette->set_interface("x07_cass");
/* Software lists */
- MCFG_SOFTWARE_LIST_ADD("card_list", "x07_card")
- MCFG_SOFTWARE_LIST_ADD("cass_list", "x07_cass")
+ SOFTWARE_LIST(config, "card_list").set_original("x07_card");
+ SOFTWARE_LIST(config, "cass_list").set_original("x07_cass");
MACHINE_CONFIG_END
/* ROM definition */
diff --git a/src/mame/drivers/x1.cpp b/src/mame/drivers/x1.cpp
index 0a41b7f62e3..be1d3390a14 100644
--- a/src/mame/drivers/x1.cpp
+++ b/src/mame/drivers/x1.cpp
@@ -700,7 +700,7 @@ READ8_MEMBER( x1_state::x1_rom_r )
{
// logerror("%06x\n",m_rom_index[0]<<16|m_rom_index[1]<<8|m_rom_index[2]<<0);
if (m_cart->exists())
- return m_cart->read_rom(space, (m_rom_index[0] << 16) | (m_rom_index[1] << 8) | (m_rom_index[2] << 0));
+ return m_cart->read_rom((m_rom_index[0] << 16) | (m_rom_index[1] << 8) | (m_rom_index[2] << 0));
else
return 0;
}
@@ -1009,7 +1009,7 @@ READ8_MEMBER( x1_state::x1_ex_gfxram_r )
if (!machine().side_effects_disabled())
{
m_iobank->set_bank(0); // any read disables the extended mode
- return m_iobank->read8(space, offset);
+ return m_iobank->read8(offset);
}
else
{
@@ -1069,12 +1069,12 @@ WRITE8_MEMBER( x1_state::x1_6845_w )
if(offset == 0)
{
m_crtc_index = data & 31;
- m_crtc->address_w(space, offset, data);
+ m_crtc->address_w(data);
}
else
{
m_crtc_vreg[m_crtc_index] = data;
- m_crtc->register_w(space, offset, data);
+ m_crtc->register_w(data);
}
}
@@ -1547,7 +1547,7 @@ WRITE8_MEMBER(x1_state::io_write_byte)
READ8_MEMBER(x1_state::ym_r)
{
- uint8_t result = m_ym->read(space, offset);
+ uint8_t result = m_ym->read(offset);
if (!BIT(offset, 0))
result = (result & 0x7f) | (m_sound_sw->read() & 0x80);
return result;
@@ -2191,14 +2191,15 @@ static void x1_floppies(device_slot_interface &device)
device.option_add("dd", FLOPPY_525_DD);
}
-MACHINE_CONFIG_START(x1_state::x1)
+void x1_state::x1(machine_config &config)
+{
/* basic machine hardware */
Z80(config, m_maincpu, MAIN_CLOCK/4);
m_maincpu->set_addrmap(AS_PROGRAM, &x1_state::x1_mem);
m_maincpu->set_addrmap(AS_IO, &x1_state::x1_io);
m_maincpu->set_daisy_config(x1_daisy);
- ADDRESS_MAP_BANK(config, "iobank").set_map(&x1_state::x1_io_banks).set_options(ENDIANNESS_LITTLE, 8, 17, 0x10000);
+ ADDRESS_MAP_BANK(config, m_iobank).set_map(&x1_state::x1_io_banks).set_options(ENDIANNESS_LITTLE, 8, 17, 0x10000);
z80ctc_device& ctc(Z80CTC(config, "ctc", MAIN_CLOCK/4));
ctc.intr_callback().set_inputline(m_maincpu, INPUT_LINE_IRQ0);
@@ -2206,7 +2207,7 @@ MACHINE_CONFIG_START(x1_state::x1)
ctc.zc_callback<1>().set("ctc", FUNC(z80ctc_device::trg1));
ctc.zc_callback<2>().set("ctc", FUNC(z80ctc_device::trg2));
- MCFG_DEVICE_ADD("x1kb", X1_KEYBOARD, 0)
+ X1_KEYBOARD(config, "x1kb", 0);
i8255_device &ppi(I8255A(config, "ppi8255_0"));
ppi.in_pa_callback().set(FUNC(x1_state::x1_porta_r));
@@ -2220,12 +2221,12 @@ MACHINE_CONFIG_START(x1_state::x1)
MCFG_MACHINE_RESET_OVERRIDE(x1_state,x1)
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */
- MCFG_SCREEN_SIZE(640, 480)
- MCFG_SCREEN_VISIBLE_AREA(0, 640-1, 0, 480-1)
- MCFG_SCREEN_UPDATE_DRIVER(x1_state, screen_update_x1)
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_refresh_hz(60);
+ m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */
+ m_screen->set_size(640, 480);
+ m_screen->set_visarea(0, 640-1, 0, 480-1);
+ m_screen->set_screen_update(FUNC(x1_state::screen_update_x1));
H46505(config, m_crtc, (VDP_CLOCK/48)); //unknown divider
m_crtc->set_screen(m_screen);
@@ -2242,15 +2243,14 @@ MACHINE_CONFIG_START(x1_state::x1)
// TODO: guesswork, try to implicitly start the motor
m_fdc->hld_wr_callback().set(FUNC(x1_state::hdl_w));
- MCFG_FLOPPY_DRIVE_ADD("fdc:0", x1_floppies, "dd", x1_state::floppy_formats)
- MCFG_FLOPPY_DRIVE_ADD("fdc:1", x1_floppies, "dd", x1_state::floppy_formats)
- MCFG_FLOPPY_DRIVE_ADD("fdc:2", x1_floppies, "dd", x1_state::floppy_formats)
- MCFG_FLOPPY_DRIVE_ADD("fdc:3", x1_floppies, "dd", x1_state::floppy_formats)
+ FLOPPY_CONNECTOR(config, "fdc:0", x1_floppies, "dd", x1_state::floppy_formats);
+ FLOPPY_CONNECTOR(config, "fdc:1", x1_floppies, "dd", x1_state::floppy_formats);
+ FLOPPY_CONNECTOR(config, "fdc:2", x1_floppies, "dd", x1_state::floppy_formats);
+ FLOPPY_CONNECTOR(config, "fdc:3", x1_floppies, "dd", x1_state::floppy_formats);
- MCFG_SOFTWARE_LIST_ADD("flop_list","x1_flop")
+ SOFTWARE_LIST(config, "flop_list").set_original("x1_flop");
- MCFG_GENERIC_CARTSLOT_ADD("cartslot", generic_plain_slot, "x1_cart")
- MCFG_GENERIC_EXTENSIONS("bin,rom")
+ GENERIC_CARTSLOT(config, m_cart, generic_plain_slot, "x1_cart", "bin,rom");
SPEAKER(config, "lspeaker").front_left();
SPEAKER(config, "rspeaker").front_right();
@@ -2263,20 +2263,21 @@ MACHINE_CONFIG_START(x1_state::x1)
ay.add_route(0, "rspeaker", 0.25);
ay.add_route(1, "lspeaker", 0.5);
ay.add_route(2, "rspeaker", 0.5);
- WAVE(config, "wave", "cassette").add_route(ALL_OUTPUTS, "lspeaker", 0.25).add_route(ALL_OUTPUTS, "rspeaker", 0.10);
+ WAVE(config, "wave", m_cassette).add_route(ALL_OUTPUTS, "lspeaker", 0.25).add_route(ALL_OUTPUTS, "rspeaker", 0.10);
- MCFG_CASSETTE_ADD("cassette")
- MCFG_CASSETTE_FORMATS(x1_cassette_formats)
- MCFG_CASSETTE_DEFAULT_STATE(CASSETTE_STOPPED | CASSETTE_MOTOR_DISABLED | CASSETTE_SPEAKER_ENABLED)
- MCFG_CASSETTE_INTERFACE("x1_cass")
+ CASSETTE(config, m_cassette);
+ m_cassette->set_formats(x1_cassette_formats);
+ m_cassette->set_default_state(CASSETTE_STOPPED | CASSETTE_MOTOR_DISABLED | CASSETTE_SPEAKER_ENABLED);
+ m_cassette->set_interface("x1_cass");
- MCFG_SOFTWARE_LIST_ADD("cass_list","x1_cass")
+ SOFTWARE_LIST(config, "cass_list").set_original("x1_cass");
- MCFG_TIMER_DRIVER_ADD_PERIODIC("keyboard_timer", x1_state, x1_keyboard_callback, attotime::from_hz(250))
- MCFG_TIMER_DRIVER_ADD_PERIODIC("cmt_wind_timer", x1_state, x1_cmt_wind_timer, attotime::from_hz(16))
-MACHINE_CONFIG_END
+ TIMER(config, "keyboard_timer").configure_periodic(FUNC(x1_state::x1_keyboard_callback), attotime::from_hz(250));
+ TIMER(config, "cmt_wind_timer").configure_periodic(FUNC(x1_state::x1_cmt_wind_timer), attotime::from_hz(16));
+}
-MACHINE_CONFIG_START(x1_state::x1turbo)
+void x1_state::x1turbo(machine_config &config)
+{
x1(config);
m_maincpu->set_addrmap(AS_PROGRAM, &x1_state::x1turbo_mem);
@@ -2284,8 +2285,7 @@ MACHINE_CONFIG_START(x1_state::x1turbo)
MCFG_MACHINE_RESET_OVERRIDE(x1_state,x1turbo)
- MCFG_DEVICE_MODIFY("iobank")
- MCFG_DEVICE_PROGRAM_MAP(x1turbo_io_banks)
+ m_iobank->set_map(&x1_state::x1turbo_io_banks);
z80sio0_device& sio(Z80SIO0(config, "sio", MAIN_CLOCK/4));
sio.out_int_callback().set_inputline(m_maincpu, INPUT_LINE_IRQ0);
@@ -2303,7 +2303,7 @@ MACHINE_CONFIG_START(x1_state::x1turbo)
YM2151(config, m_ym, MAIN_CLOCK/8); //option board
m_ym->add_route(0, "lspeaker", 0.50);
m_ym->add_route(1, "rspeaker", 0.50);
-MACHINE_CONFIG_END
+}
/*************************************
*
diff --git a/src/mame/drivers/x1twin.cpp b/src/mame/drivers/x1twin.cpp
index a12b96eb0a6..698f5059488 100644
--- a/src/mame/drivers/x1twin.cpp
+++ b/src/mame/drivers/x1twin.cpp
@@ -410,7 +410,8 @@ static void x1_floppies(device_slot_interface &device)
device.option_add("dd", FLOPPY_525_DD);
}
-MACHINE_CONFIG_START(x1twin_state::x1twin)
+void x1twin_state::x1twin(machine_config &config)
+{
/* basic machine hardware */
Z80(config, m_maincpu, X1_MAIN_CLOCK/4);
m_maincpu->set_addrmap(AS_PROGRAM, &x1twin_state::x1_mem);
@@ -425,7 +426,7 @@ MACHINE_CONFIG_START(x1twin_state::x1twin)
ctc.zc_callback<1>().set("ctc", FUNC(z80ctc_device::trg1));
ctc.zc_callback<2>().set("ctc", FUNC(z80ctc_device::trg2));
- MCFG_DEVICE_ADD("x1kb", X1_KEYBOARD, 0)
+ X1_KEYBOARD(config, "x1kb", 0);
i8255_device &ppi(I8255A(config, "ppi8255_0"));
ppi.in_pa_callback().set(FUNC(x1_state::x1_porta_r));
@@ -447,23 +448,23 @@ MACHINE_CONFIG_START(x1twin_state::x1twin)
m_maincpu->add_route(0, "pce_l", 0.5);
m_maincpu->add_route(1, "pce_r", 0.5);
- MCFG_TIMER_ADD_SCANLINE("scantimer", pce_interrupt, "pce_screen", 0, 1)
+ TIMER(config, "scantimer").configure_scanline(FUNC(x1twin_state::pce_interrupt), "pce_screen", 0, 1);
#endif
config.set_default_layout(layout_dualhsxs);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */
- MCFG_SCREEN_SIZE(640, 480)
- MCFG_SCREEN_VISIBLE_AREA(0, 640-1, 0, 480-1)
- MCFG_SCREEN_UPDATE_DRIVER(x1twin_state, screen_update_x1)
-
- MCFG_SCREEN_ADD("pce_screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */
- MCFG_SCREEN_RAW_PARAMS(PCE_MAIN_CLOCK/2, huc6260_device::WPF, 70, 70 + 512 + 32, huc6260_device::LPF, 14, 14+242)
- MCFG_SCREEN_UPDATE_DRIVER(x1twin_state, screen_update_x1pce)
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_refresh_hz(60);
+ m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */
+ m_screen->set_size(640, 480);
+ m_screen->set_visarea(0, 640-1, 0, 480-1);
+ m_screen->set_screen_update(FUNC(x1twin_state::screen_update_x1));
+
+ screen_device &pce_screen(SCREEN(config, "pce_screen", SCREEN_TYPE_RASTER));
+ pce_screen.set_refresh_hz(60);
+ pce_screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */
+ pce_screen.set_raw(PCE_MAIN_CLOCK/2, huc6260_device::WPF, 70, 70 + 512 + 32, huc6260_device::LPF, 14, 14+242);
+ pce_screen.set_screen_update(FUNC(x1twin_state::screen_update_x1pce));
H46505(config, m_crtc, (VDP_CLOCK/48)); //unknown divider
m_crtc->set_screen(m_screen);
@@ -480,15 +481,14 @@ MACHINE_CONFIG_START(x1twin_state::x1twin)
// TODO: guesswork, try to implicitly start the motor
m_fdc->hld_wr_callback().set(FUNC(x1_state::hdl_w));
- MCFG_FLOPPY_DRIVE_ADD("fdc:0", x1_floppies, "dd", x1_state::floppy_formats)
- MCFG_FLOPPY_DRIVE_ADD("fdc:1", x1_floppies, "dd", x1_state::floppy_formats)
- MCFG_FLOPPY_DRIVE_ADD("fdc:2", x1_floppies, "dd", x1_state::floppy_formats)
- MCFG_FLOPPY_DRIVE_ADD("fdc:3", x1_floppies, "dd", x1_state::floppy_formats)
+ FLOPPY_CONNECTOR(config, "fdc:0", x1_floppies, "dd", x1_state::floppy_formats);
+ FLOPPY_CONNECTOR(config, "fdc:1", x1_floppies, "dd", x1_state::floppy_formats);
+ FLOPPY_CONNECTOR(config, "fdc:2", x1_floppies, "dd", x1_state::floppy_formats);
+ FLOPPY_CONNECTOR(config, "fdc:3", x1_floppies, "dd", x1_state::floppy_formats);
- MCFG_SOFTWARE_LIST_ADD("flop_list","x1_flop")
+ SOFTWARE_LIST(config, "flop_list").set_original("x1_flop");
- MCFG_GENERIC_CARTSLOT_ADD("cartslot", generic_plain_slot, "x1_cart")
- MCFG_GENERIC_EXTENSIONS("bin,rom")
+ GENERIC_CARTSLOT(config, m_cart, generic_plain_slot, "x1_cart", "bin,rom");
SPEAKER(config, "x1_l").front_left();
SPEAKER(config, "x1_r").front_right();
@@ -506,18 +506,18 @@ MACHINE_CONFIG_START(x1twin_state::x1twin)
ay.add_route(0, "x1_r", 0.25);
ay.add_route(1, "x1_l", 0.5);
ay.add_route(2, "x1_r", 0.5);
- WAVE(config, "wave", "cassette").add_route(ALL_OUTPUTS, "x1_l", 0.25).add_route(ALL_OUTPUTS, "x1_r", 0.10);
+ WAVE(config, "wave", m_cassette).add_route(ALL_OUTPUTS, "x1_l", 0.25).add_route(ALL_OUTPUTS, "x1_r", 0.10);
- MCFG_CASSETTE_ADD("cassette")
- MCFG_CASSETTE_FORMATS(x1_cassette_formats)
- MCFG_CASSETTE_DEFAULT_STATE(CASSETTE_STOPPED | CASSETTE_MOTOR_DISABLED | CASSETTE_SPEAKER_ENABLED)
- MCFG_CASSETTE_INTERFACE("x1_cass")
+ CASSETTE(config, m_cassette);
+ m_cassette->set_formats(x1_cassette_formats);
+ m_cassette->set_default_state(CASSETTE_STOPPED | CASSETTE_MOTOR_DISABLED | CASSETTE_SPEAKER_ENABLED);
+ m_cassette->set_interface("x1_cass");
- MCFG_SOFTWARE_LIST_ADD("cass_list","x1_cass")
+ SOFTWARE_LIST(config, "cass_list").set_original("x1_cass");
- MCFG_TIMER_DRIVER_ADD_PERIODIC("keyboard_timer", x1twin_state, x1_keyboard_callback, attotime::from_hz(250))
- MCFG_TIMER_DRIVER_ADD_PERIODIC("cmt_wind_timer", x1twin_state, x1_cmt_wind_timer, attotime::from_hz(16))
-MACHINE_CONFIG_END
+ TIMER(config, "keyboard_timer").configure_periodic(FUNC(x1twin_state::x1_keyboard_callback), attotime::from_hz(250));
+ TIMER(config, "cmt_wind_timer").configure_periodic(FUNC(x1twin_state::x1_cmt_wind_timer), attotime::from_hz(16));
+}
ROM_START( x1twin )
ROM_REGION( 0x10000, "x1_cpu", ROMREGION_ERASEFF )
diff --git a/src/mame/drivers/x68k.cpp b/src/mame/drivers/x68k.cpp
index d083d5dce10..bed11f4ea77 100644
--- a/src/mame/drivers/x68k.cpp
+++ b/src/mame/drivers/x68k.cpp
@@ -1045,12 +1045,12 @@ WRITE8_MEMBER(x68k_state::adpcm_w)
{
switch(offset)
{
- case 0x00:
- m_okim6258->ctrl_w(space,0,data);
- break;
- case 0x01:
- m_okim6258->data_w(space,0,data);
- break;
+ case 0x00:
+ m_okim6258->ctrl_w(data);
+ break;
+ case 0x01:
+ m_okim6258->data_w(data);
+ break;
}
}
@@ -1551,8 +1551,9 @@ static void keyboard_devices(device_slot_interface &device)
device.option_add("x68k", X68K_KEYBOARD);
}
-MACHINE_CONFIG_START(x68k_state::x68000_base)
- MCFG_QUANTUM_TIME(attotime::from_hz(60))
+void x68k_state::x68000_base(machine_config &config)
+{
+ config.m_minimum_quantum = attotime::from_hz(60);
/* device hardware */
MC68901(config, m_mfpdev, 16_MHz_XTAL / 4);
@@ -1577,8 +1578,8 @@ MACHINE_CONFIG_START(x68k_state::x68000_base)
m_hd63450->set_burst_clocks(attotime::from_usec(2), attotime::from_nsec(450), attotime::from_nsec(50), attotime::from_nsec(50));
m_hd63450->dma_end().set(FUNC(x68k_state::dma_end));
m_hd63450->dma_error().set(FUNC(x68k_state::dma_error));
- m_hd63450->dma_read<0>().set("upd72065", FUNC(upd72065_device::mdma_r));
- m_hd63450->dma_write<0>().set("upd72065", FUNC(upd72065_device::mdma_w));
+ m_hd63450->dma_read<0>().set("upd72065", FUNC(upd72065_device::dma_r));
+ m_hd63450->dma_write<0>().set("upd72065", FUNC(upd72065_device::dma_w));
SCC8530(config, m_scc, 40_MHz_XTAL / 8);
@@ -1626,17 +1627,17 @@ MACHINE_CONFIG_START(x68k_state::x68000_base)
SOFTWARE_LIST(config, "flop_list").set_original("x68k_flop");
- MCFG_DEVICE_ADD("exp", X68K_EXPANSION_SLOT, 0)
- MCFG_DEVICE_SLOT_INTERFACE(x68000_exp_cards, nullptr, false)
- MCFG_X68K_EXPANSION_SLOT_OUT_IRQ2_CB(WRITELINE(*this, x68k_state, irq2_line))
- MCFG_X68K_EXPANSION_SLOT_OUT_IRQ4_CB(WRITELINE(*this, x68k_state, irq4_line))
- MCFG_X68K_EXPANSION_SLOT_OUT_NMI_CB(INPUTLINE("maincpu", M68K_IRQ_7))
+ X68K_EXPANSION_SLOT(config, m_expansion, x68000_exp_cards, nullptr);
+ m_expansion->set_space(m_maincpu, AS_PROGRAM);
+ m_expansion->out_irq2_callback().set(FUNC(x68k_state::irq2_line));
+ m_expansion->out_irq4_callback().set(FUNC(x68k_state::irq4_line));
+ m_expansion->out_nmi_callback().set_inputline(m_maincpu, M68K_IRQ_7);
/* internal ram */
RAM(config, m_ram).set_default_size("4M").set_extra_options("1M,2M,3M,5M,6M,7M,8M,9M,10M,11M,12M");
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
-MACHINE_CONFIG_END
+}
void x68k_state::x68000(machine_config &config)
{
diff --git a/src/mame/drivers/xain.cpp b/src/mame/drivers/xain.cpp
index 6d97b221b56..f1e7ba5aa94 100644
--- a/src/mame/drivers/xain.cpp
+++ b/src/mame/drivers/xain.cpp
@@ -471,28 +471,29 @@ void xain_state::machine_start()
save_item(NAME(m_vblank));
}
-MACHINE_CONFIG_START(xain_state::xsleena)
-
+void xain_state::xsleena(machine_config &config)
+{
// basic machine hardware
- MCFG_DEVICE_ADD(m_maincpu, MC6809E, CPU_CLOCK) // 68B09E
- MCFG_DEVICE_PROGRAM_MAP(main_map)
- MCFG_TIMER_DRIVER_ADD_SCANLINE("scantimer", xain_state, scanline, "screen", 0, 1)
+ MC6809E(config, m_maincpu, CPU_CLOCK); // 68B09E
+ m_maincpu->set_addrmap(AS_PROGRAM, &xain_state::main_map);
+
+ TIMER(config, "scantimer").configure_scanline(FUNC(xain_state::scanline), "screen", 0, 1);
- MCFG_DEVICE_ADD(m_subcpu, MC6809E, CPU_CLOCK) // 68B09E
- MCFG_DEVICE_PROGRAM_MAP(cpu_map_B)
+ MC6809E(config, m_subcpu, CPU_CLOCK); // 68B09E
+ m_subcpu->set_addrmap(AS_PROGRAM, &xain_state::cpu_map_B);
- MCFG_DEVICE_ADD(m_audiocpu, MC6809, PIXEL_CLOCK) // 68A09
- MCFG_DEVICE_PROGRAM_MAP(sound_map)
+ MC6809(config, m_audiocpu, PIXEL_CLOCK); // 68A09
+ m_audiocpu->set_addrmap(AS_PROGRAM, &xain_state::sound_map);
TAITO68705_MCU(config, m_mcu, MCU_CLOCK);
- MCFG_QUANTUM_PERFECT_CPU("maincpu")
+ config.m_perfect_cpu_quantum = subtag("maincpu");
// video hardware
- MCFG_SCREEN_ADD(m_screen, RASTER)
- MCFG_SCREEN_RAW_PARAMS(PIXEL_CLOCK, 384, 0, 256, 272, 8, 248) // based on ddragon driver
- MCFG_SCREEN_UPDATE_DRIVER(xain_state, screen_update)
- MCFG_SCREEN_PALETTE(m_palette)
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_raw(PIXEL_CLOCK, 384, 0, 256, 272, 8, 248); // based on ddragon driver
+ m_screen->set_screen_update(FUNC(xain_state::screen_update));
+ m_screen->set_palette(m_palette);
GFXDECODE(config, m_gfxdecode, m_palette, gfx_xain);
PALETTE(config, m_palette).set_format(palette_device::xBGR_444, 512);
@@ -514,17 +515,17 @@ MACHINE_CONFIG_START(xain_state::xsleena)
ym2.add_route(1, "mono", 0.50);
ym2.add_route(2, "mono", 0.50);
ym2.add_route(3, "mono", 0.40);
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(xain_state::xsleenab)
+void xain_state::xsleenab(machine_config &config)
+{
xsleena(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(bootleg_map)
+ m_maincpu->set_addrmap(AS_PROGRAM, &xain_state::bootleg_map);
- MCFG_DEVICE_REMOVE("mcu")
-MACHINE_CONFIG_END
+ config.device_remove("mcu");
+}
/***************************************************************************
diff --git a/src/mame/drivers/xavix.cpp b/src/mame/drivers/xavix.cpp
index ff1c7fc7f1d..f0f9f8b4570 100644
--- a/src/mame/drivers/xavix.cpp
+++ b/src/mame/drivers/xavix.cpp
@@ -63,9 +63,9 @@
11 Tomas Plarail /TOMY/Japan - - - - - - -
12 Thomas TV Personal Computer /EPOCH/Japan - - - - - - -
13 STAR WARS Light Saber Battle /TOMY/Japan - - - - - - -
- 14 Jala Jaland /atlus/Japan - - - - - - -
+ 14 Jala Jaland /atlus/Japan - - - - - - - (is this the arcade release of Jara-Ja Land /TAKARA/Japan below?, Atlas are an arcade distributor and arcade version is confirmed)
15 Star Wars Lightsaber Battle Game /Hasbro/USA SWSA x8 48 8M 24C02 SSD 2000 NEC 85605-621 dumped
- 16 Gururin World /EPOCH/Japan - - - - - - -
+ 16 Gururin World /EPOCH/Japan - x8 - - - SSD 98 PL7351-181 dumped
17 Toinohgi Onmyo-daisenki /BANDAI/Japan - - - - - - -
2004 1 Accessory cartridge for Super TV computer "Double mouse party"/EPOCH/Japan - - - - - - -
2 Printer for TV computer /EPOCH/Japan - - - - - - -
@@ -73,12 +73,12 @@
4 Accessory cartridge for Super TV computer "Doraemon"/EPOCH/Japan - - - - - - -
5 Accessory cartridge for Super TV computer "Hamutaro"/EPOCH/Japan - - - - - - -
6 Super TV computer /EPOCH/Japan - - - - - - -
- 7 Super Dash ball /EPOCH/Japan - - - - - - -
+ 7 Super Dash ball /EPOCH/Japan - x8 - - - SSD 2000 NEC 85605-621 dumped
8 Exciting sports Tennis X Fitness /EPOCH/Japan - - - - - - -
9 Accessory memory mascot for TV mail Pc mail cot 2 characters (Putchi, Petchi) /EPOCH/Japan - - - - - - -
10 Accessory memory mascot for TV mail Pc mail cot 2 characters (Charuru, Kurau) /EPOCH/Japan - - - - - - -
11 The Lord of the Rings Warrior of Middle Earth /Hasbro/USA LORA x8 48 8M 24C02 SSD 2000 NEC 85605-621 dumped
- 12 Beyblade Arcade Challenge 5-in-1 /Hasbro/USA - - - - - - -
+ 12 Beyblade Arcade Challenge 5-in-1 /Hasbro/USA - - - - - - have
13 All star Festival Quize /EPOCH/Japan - - - - - - -
14 e-kara mix /TAKARA/Japan - - - - - - -
15 Jumping Popira /TAKARA/Japan - - - - - - -
@@ -86,7 +86,7 @@
17 TV mail PC "Mercot /EPOCH/Japan - - - - - - -
18 Play TV Monster Truck /RADICA/USA 74026 x8 48 4M none SSD 98 PL7351-181 dumped
19 Play TV Madden Football /RADICA/USA 74021 x8 48 4M none SSD 98 PL7351-181 dumped
- 20 Play TV SSX Snowboarder (and Snowboarder white?) /RADICA/USA 74023 none have
+ 20 Play TV SSX Snowboarder (and Snowboarder white?) /RADICA/USA 74023 none dumped
21 Disney Princess "Kira-Kira magical lesson" /TOMY/Japan - - - - - - -
22 Mermaid Melody "pichi-pichi Pitch" e-pitch microcomputer pure starter set /TAKARA/Japan - - - - - - -
23 Hello Kitty TV computer /EPOCH/Japan - - - - - - -
@@ -98,15 +98,15 @@
5 Exciting stadium DX, Hansin Tigers version /EPOCH/Japan - - - - - - -
6 Dragon Quest /SQUARE ENIX/Japan - - - 8M - SSD 2000? dumped
7 Croquette! Win a medal! /EPOCH/Japan - - - - - - -
- 8 Taiko Popira /TAKARA/Japan - - - - - - -
+ 8 Taiko Popira /TAKARA/Japan - - - - - - dumped
9 Together Minimoni, Dancing' Stage! plus /EPOCH/Japan - - - - - - -
10 Evio /TOMY/Japan - - - - - - -
11 Together Minimoni,Jumping Party! /EPOCH/Japan - - - - - - -
12 Hamutaro TV computer /EPOCH/Japan - - - - - - -
- 13 Jara-Ja Land /TAKARA/Japan - - - - - - -
+ 13 Jara-Ja Land /TAKARA/Japan - - - - - - - (is this the home release of Jala Jaland /atlus/Japan above?)
14 Tomika, Draiving by Car navigation system /TOMY/Japan - - - - - - -
15 PLAY TV Rescue Heroes /RADICA/USA 73036 x8 48 2M none SSD 98 PL7351-181 dumped
- 16 PLAY TV Huntin' 2 /RADICA/USA 73030 x8 none none SSD 98 PL7351-181 have
+ 16 PLAY TV Huntin' 2 /RADICA/USA 73030 x8 none none SSD 98 PL7351-181 dumped
17 Let's play Ping-pong. Exciting pingpong2 /EPOCH/Japan - - - - - - -
18 Cartridge for Slot machine TV "King of wild animal" /TAKARA/Japan - - - - - - -
19 ChyoroQ "Burning up Racer /TAKARA/Japan - - - - - - -
@@ -120,7 +120,7 @@
2002 1 Accessory cartridge for Slot machine "Gin-gin maru TV" /TAKARA/Japan - - - - - - -
2 Wildest computer robot "Daigander" (Korean version) /TAKARA/Korea - - - - - - -
3 Hamutaro's circus /EPOCH/Japan - - - - - - -
- 4 Doraemon ,computer megaphone /EPOCH/Japan - - - - - - -
+ 4 Doraemon Wakuwaku Kuukihou /EPOCH/Japan - x8 - - - - dumped
5 Strike! Exciting bowling /EPOCH/Japan - - - - - - -
6 e-kara /Hasbro/Spain - - - - - - -
7 Starter set for e-kara H.S," Morning sisters" /TAKARA/Japan - - - - - - -
@@ -137,11 +137,11 @@
18 Starter set for e-kara N "Morning sisters" /TAKARA/Japan - - - - - - -
19 e-kara /Hasbro/England - - - - - - dumped? (if same as one of the 'US' sets?)
20 e-kara /Takara USA/USA - - - - - - dumped? (or #10 below, this might be ekaraa set with improved text)
- 21 e-kara PLAY TV Soccer /RADICA/USA 76088500 x8 none none SSD 98 PA7351-107 (aka Radica PlayTV Soccer? if so, have)
+ 21 PLAY TV Soccer /RADICA/USA 76088500 x8 none none SSD 98 PA7351-107 have
22 PLAY TV Jr. Construction /RADICA/USA - - - - - - -
23 PLAY TV Boxing /RADICA/Japan 72039 x8 48 2M none SSD 98 PA7351-107 dumped
24 PLAY TV Baseball 2 /RADICA/USA 72042 x8 48 2M none SSD 98 PL7351-181 dumped
- 25 Barbie Dance Party /RADICA/USA,EU - - - - - - -
+ 25 Barbie Dance Party /RADICA/USA,EU - x8 none - - - dumped
26 Compete! Exciting stadium DX /EPOCH/Japan - - - - - - -
27 e-kara N /EPOCH/Japan - - - - - - -
28 Who's the ace? Excite Tennis /EPOCH/Japan - - - - - - -
@@ -180,16 +180,17 @@
2000 1 Popira /TAKARA/Japan - - - - - - dumped
2 e-kara Duet microphone /TAKARA/Japan - - - - - - -
3 e-kara /TAKARA/Japan - - - - - - dumped
- 4 Let's play ping-pong. Exciting ping-pong /EPOCH/Japan - - - - - - -
- 5 PLAY TV Huntin' Buckmasters /RADICA/USA 8074 x8 none none SSD 98 PA7351-107 have
+ 4 Let's play ping-pong. Exciting ping-pong /EPOCH/Japan - - - - - - dumped
+ 5 PLAY TV Huntin' Buckmasters /RADICA/USA 8074 x8 none none SSD 98 PA7351-107 dumped
6 PLAY TV Ping Pong /RADICA/USA,HK,EU 8028 x8 48 1M none SSD 97 PA7270-107 dumped
- 7 PLAY TV OPUS /RADICA/USA,EU - - - - - - -
+ 7 PLAY TV OPUS /RADICA/USA,EU - - - - - - dumped (US version, PAL version appears to use different ROM)
8 PLAY TV Baseball 2 /EPOCH/Japan, HK - - - - - - -
- 9 Let's hit a homerun! Exciting baseball /RADICA/USA,EU 8017 x8 none none SSD 98 PA7351-107 (aka Radica PlayTV Baseball, if so, have)
+ 9 Let's hit a homerun! Exciting baseball /EPOCH/Japan - - - - - -
+ Play TV Baseball /RADICA/USA,EU 8017 x8 none none SSD 98 PA7351-107 dumped
1999 1 ABC Jungle Fun Hippo /Vteck/HK, USA, France - - - - - - -
Unknown 1 PLAY TV Football /RADICA/USA 74021 x8 48 4M none SSD 98 PL7351-181 dumped
XaviXTennis SGM6446 x16 48 8M 24C08 SSD 2002 NEC 85054-611 dumped
- XaviXBowling SGM644C x16 48 not dumped
+ XaviXBowling SGM644C x16 48 dumped
TODO: put into above table (XaviXPORT cartridges)
@@ -201,6 +202,32 @@
Fitness Dance has an Atmel H93864C (maybe SEEPROM?) a Microchip DSPIC 33FJ12GP202 and two JRC 2740 dual op amps.
Music and Circuit has a 24CS64, two UTC324 quad op amps, a 74HC14, a 74HCT04, and an 8-pin SOIC labeled 61545, which is likely an M61545 dual electronic volume control.
+ It looks like the sensors (cameras) are from ETOMS
+ They are all 32x32 arrays except Fitness Play, which is 64x64. Most of the PCBs are marked CIS.
+ Bowling and Boxing look identical.
+ LOTR and SW look identical
+ DQ looks similar to LOTR
+ Real Swing Golf (different driver) and Fitness Play look different from all the others.
+
+ The sensor dies for Bowling, Boxing, Star Wars and DQ are labeled CU5501A.
+ LOTR is CU5501
+ Real Swing Golf is CU5502
+ Fitness Play is S-5300A SLH2039H and does not have ETOMS on it.
+ The Fitness Play main PCB has an extra glob next to the ribbon cable to the camera.
+ Most of the camera PCBs connect to the main PCB with an 18-20 wire ribbon cable.
+
+ Real Swing Golf just has 6 wires, Its camera PCB is the only one with a ceramic resonator
+ Maybe the CU5502 chip offloads some processing from the CPU?
+
+
+
+ NOTES:
+
+ Play TV Monster Truck runs off an entirely different codebase to everything else, presumably coded by the developer from scratch rather than using code supplied by SSD Company LTD
+ Play TV Rescue Heroes fails to display any kind of XaviX logo or SSD Copyright, it is the only XaviX based game so far to not show these details anywhere in the game.
+
+
+
***************************************************************************/
#include "emu.h"
@@ -243,6 +270,9 @@ void xavix_state::xavix_map(address_map &map)
{
map(0x000000, 0x7fffff).r(FUNC(xavix_state::opcodes_000000_r));
map(0x800000, 0xffffff).r(FUNC(xavix_state::opcodes_800000_r));
+
+ map(0x000000, 0x003fff).w(FUNC(xavix_state::debug_mem_w));
+
}
// this is used by data reads / writes after some processing in the core to decide if data reads can see lowbus, zeropage, stack, bank registers etc. and only falls through to here on a true external bus access
@@ -308,20 +338,15 @@ void xavix_state::xavix_lowbus_map(address_map &map)
map(0x75f0, 0x75f1).rw(FUNC(xavix_state::sound_startstop_r), FUNC(xavix_state::sound_startstop_w)); // r/w tested read/written 8 times in a row
map(0x75f2, 0x75f3).rw(FUNC(xavix_state::sound_updateenv_r), FUNC(xavix_state::sound_updateenv_w));
map(0x75f4, 0x75f5).r(FUNC(xavix_state::sound_sta16_r)); // related to 75f0 / 75f1 (read after writing there - rad_mtrk)
- // taitons1 after 75f7/75f8
map(0x75f6, 0x75f6).rw(FUNC(xavix_state::sound_volume_r), FUNC(xavix_state::sound_volume_w)); // r/w tested
- // taitons1 written as a pair
map(0x75f7, 0x75f7).w(FUNC(xavix_state::sound_regbase_w));
map(0x75f8, 0x75f8).rw(FUNC(xavix_state::sound_75f8_r), FUNC(xavix_state::sound_75f8_w)); // r/w tested
- // taitons1 written after 75f6, then read
map(0x75f9, 0x75f9).rw(FUNC(xavix_state::sound_75f9_r), FUNC(xavix_state::sound_75f9_w));
- // at another time
map(0x75fa, 0x75fa).rw(FUNC(xavix_state::sound_timer0_r), FUNC(xavix_state::sound_timer0_w)); // r/w tested
map(0x75fb, 0x75fb).rw(FUNC(xavix_state::sound_timer1_r), FUNC(xavix_state::sound_timer1_w)); // r/w tested
map(0x75fc, 0x75fc).rw(FUNC(xavix_state::sound_timer2_r), FUNC(xavix_state::sound_timer2_w)); // r/w tested
map(0x75fd, 0x75fd).rw(FUNC(xavix_state::sound_timer3_r), FUNC(xavix_state::sound_timer3_w)); // r/w tested
map(0x75fe, 0x75fe).rw(FUNC(xavix_state::sound_irqstatus_r), FUNC(xavix_state::sound_irqstatus_w));
- // taitons1 written other 75xx operations
map(0x75ff, 0x75ff).w(FUNC(xavix_state::sound_75ff_w));
// Slot Registers
@@ -346,15 +371,18 @@ void xavix_state::xavix_lowbus_map(address_map &map)
map(0x7a80, 0x7a80).rw(FUNC(xavix_state::ioevent_enable_r), FUNC(xavix_state::ioevent_enable_w));
map(0x7a81, 0x7a81).rw(FUNC(xavix_state::ioevent_irqstate_r), FUNC(xavix_state::ioevent_irqack_w));
- // Mouse?
- map(0x7b00, 0x7b00).w(FUNC(xavix_state::adc_7b00_w)); // rad_snow (not often, why?)
+ // Mouse / Trackball?
+ map(0x7b00, 0x7b00).rw("anport", FUNC(xavix_anport_device::mouse_7b00_r), FUNC(xavix_anport_device::mouse_7b00_w));
+ map(0x7b01, 0x7b01).rw("anport", FUNC(xavix_anport_device::mouse_7b01_r), FUNC(xavix_anport_device::mouse_7b01_w));
+ map(0x7b10, 0x7b10).rw("anport", FUNC(xavix_anport_device::mouse_7b10_r), FUNC(xavix_anport_device::mouse_7b10_w));
+ map(0x7b11, 0x7b11).rw("anport", FUNC(xavix_anport_device::mouse_7b11_r), FUNC(xavix_anport_device::mouse_7b11_w));
// Lightgun / pen 2 control
//map(0x7b18, 0x7b1b)
// ADC registers
- map(0x7b80, 0x7b80).rw(FUNC(xavix_state::adc_7b80_r), FUNC(xavix_state::adc_7b80_w)); // rad_snow (not often)
- map(0x7b81, 0x7b81).rw(FUNC(xavix_state::adc_7b81_r), FUNC(xavix_state::adc_7b81_w)); // written (often, m_trck, analog related?)
+ map(0x7b80, 0x7b80).rw("adc", FUNC(xavix_adc_device::adc_7b80_r), FUNC(xavix_adc_device::adc_7b80_w)); // rad_snow (not often)
+ map(0x7b81, 0x7b81).rw("adc", FUNC(xavix_adc_device::adc_7b81_r), FUNC(xavix_adc_device::adc_7b81_w)); // written (often, m_trck, analog related?)
// Sleep control
//map(0x7b82, 0x7b83)
@@ -366,11 +394,11 @@ void xavix_state::xavix_lowbus_map(address_map &map)
map(0x7c03, 0x7c03).r(FUNC(xavix_state::timer_curval_r));
// Barrel Shifter registers
- // map(0x7ff0, 0x7ff1)
+ map(0x7ff0, 0x7ff1).rw("math", FUNC(xavix_math_device::barrel_r), FUNC(xavix_math_device::barrel_w));
// Multiply / Divide registers
- map(0x7ff2, 0x7ff4).rw(FUNC(xavix_state::mult_param_r), FUNC(xavix_state::mult_param_w));
- map(0x7ff5, 0x7ff6).rw(FUNC(xavix_state::mult_r), FUNC(xavix_state::mult_w));
+ map(0x7ff2, 0x7ff4).rw("math", FUNC(xavix_math_device::mult_param_r), FUNC(xavix_math_device::mult_param_w));
+ map(0x7ff5, 0x7ff6).rw("math", FUNC(xavix_math_device::mult_r), FUNC(xavix_math_device::mult_w));
// CPU Vector registers
map(0x7ff9, 0x7ff9).w(FUNC(xavix_state::vector_enable_w)); // enables / disables the custom vectors
@@ -390,9 +418,22 @@ void xavix_state::superxavix_lowbus_map(address_map &map)
map(0x6c00, 0x6cff).ram().w(FUNC(xavix_state::bmp_palram_sh_w)).share("bmp_palram_sh");
map(0x6d00, 0x6dff).ram().w(FUNC(xavix_state::bmp_palram_l_w)).share("bmp_palram_l");
+ // extended external bus stuff (possible banking control?)
+ map(0x7909, 0x7909).w(FUNC(xavix_state::extended_extbus_reg0_w));
+ map(0x790b, 0x790b).w(FUNC(xavix_state::extended_extbus_reg1_w));
+ map(0x790d, 0x790d).w(FUNC(xavix_state::extended_extbus_reg2_w));
+
+ map(0x7a10, 0x7a12).rw("xavix2002io", FUNC(xavix2002_io_device::pio_dir_r), FUNC(xavix2002_io_device::pio_dir_w));
+ map(0x7a20, 0x7a22).rw("xavix2002io", FUNC(xavix2002_io_device::pio_out_r), FUNC(xavix2002_io_device::pio_out_w));
+ map(0x7a30, 0x7a32).r("xavix2002io", FUNC(xavix2002_io_device::pio_in_r));
+
map(0x6fb0, 0x6fc7).ram().share("bmp_base");
+
+ map(0x7ffd, 0x7ffd).nopw(); // looks like a watchdog?
}
+
+
static INPUT_PORTS_START( xavix )
PORT_START("IN0")
PORT_DIPNAME( 0x01, 0x00, "IN0" )
@@ -463,12 +504,21 @@ static INPUT_PORTS_START( xavix )
PORT_START("AN7")
PORT_BIT( 0xff, IP_ACTIVE_HIGH, IPT_UNUSED )
+ PORT_START("MOUSE0X")
+ PORT_BIT( 0xff, IP_ACTIVE_HIGH, IPT_UNUSED )
+ PORT_START("MOUSE0Y")
+ PORT_BIT( 0xff, IP_ACTIVE_HIGH, IPT_UNUSED )
+ PORT_START("MOUSE1X")
+ PORT_BIT( 0xff, IP_ACTIVE_HIGH, IPT_UNUSED )
+ PORT_START("MOUSE1Y")
+ PORT_BIT( 0xff, IP_ACTIVE_HIGH, IPT_UNUSED )
+
PORT_START("REGION") // PAL/NTSC flag
PORT_BIT( 0xff, IP_ACTIVE_HIGH, IPT_CUSTOM )
INPUT_PORTS_END
static INPUT_PORTS_START( xavix_an )
- PORT_INCLUDE(xavix)
+ PORT_INCLUDE(xavix)
// test inputs, not real!
PORT_MODIFY("AN0") // 00
@@ -489,10 +539,74 @@ static INPUT_PORTS_START( xavix_an )
PORT_BIT( 0xff, 0x00, IPT_PEDAL2 ) PORT_SENSITIVITY(100) PORT_KEYDELTA(20)
INPUT_PORTS_END
+static INPUT_PORTS_START( xavix_i2c )
+ PORT_INCLUDE(xavix)
+
+ PORT_MODIFY("IN1")
+ PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_CUSTOM_MEMBER(DEVICE_SELF, xavix_i2c_state,i2c_r, nullptr)
+INPUT_PORTS_END
+
+static INPUT_PORTS_START( ttv_lotr )
+ PORT_INCLUDE(xavix)
+
+ PORT_MODIFY("IN1")
+ PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_CUSTOM_MEMBER(DEVICE_SELF, xavix_i2c_lotr_state,camera_r, nullptr)
+ PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_CUSTOM_MEMBER(DEVICE_SELF, xavix_i2c_lotr_state,camera_r, nullptr)
+ PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_CUSTOM_MEMBER(DEVICE_SELF, xavix_i2c_state,i2c_r, nullptr)
+INPUT_PORTS_END
+
+static INPUT_PORTS_START( xavix_bowl )
+ PORT_INCLUDE(xavix)
+
+ PORT_MODIFY("IN1")
+ PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_CUSTOM_MEMBER(DEVICE_SELF, xavix_i2c_bowl_state,camera_r, nullptr)
+ PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_CUSTOM_MEMBER(DEVICE_SELF, xavix_i2c_bowl_state,camera_r, nullptr)
+ PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_CUSTOM_MEMBER(DEVICE_SELF, xavix_i2c_state,i2c_r, nullptr)
+INPUT_PORTS_END
+
+static INPUT_PORTS_START( epo_sdb )
+ PORT_INCLUDE(xavix)
+
+ PORT_MODIFY("MOUSE0X")
+ PORT_BIT( 0xff, 0x00, IPT_AD_STICK_X ) PORT_SENSITIVITY(25) PORT_KEYDELTA(32) PORT_REVERSE PORT_PLAYER(1)
+ PORT_MODIFY("MOUSE0Y")
+ PORT_BIT( 0xff, 0x00, IPT_AD_STICK_Y ) PORT_SENSITIVITY(25) PORT_KEYDELTA(32) PORT_PLAYER(1)
+ PORT_MODIFY("MOUSE1X")
+ PORT_BIT( 0xff, 0x00, IPT_AD_STICK_X ) PORT_SENSITIVITY(25) PORT_KEYDELTA(32) PORT_REVERSE PORT_PLAYER(2)
+ PORT_MODIFY("MOUSE1Y")
+ PORT_BIT( 0xff, 0x00, IPT_AD_STICK_Y ) PORT_SENSITIVITY(25) PORT_KEYDELTA(32) PORT_PLAYER(2)
+
+ PORT_MODIFY("IN0")
+ PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_PLAYER(2)
+
+ PORT_MODIFY("IN1")
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_PLAYER(1)
+INPUT_PORTS_END
+
+static INPUT_PORTS_START( ltv_tam )
+ PORT_INCLUDE(xavix_i2c)
+
+ PORT_MODIFY("MOUSE0X")
+ PORT_BIT( 0xff, 0x00, IPT_AD_STICK_X ) PORT_SENSITIVITY(25) PORT_KEYDELTA(32) PORT_REVERSE PORT_PLAYER(1)
+ PORT_MODIFY("MOUSE0Y")
+ PORT_BIT( 0xff, 0x00, IPT_AD_STICK_Y ) PORT_SENSITIVITY(25) PORT_KEYDELTA(32) PORT_PLAYER(1)
+ PORT_MODIFY("MOUSE1X")
+ PORT_BIT( 0xff, 0x00, IPT_AD_STICK_X ) PORT_SENSITIVITY(25) PORT_KEYDELTA(32) PORT_REVERSE PORT_PLAYER(2)
+ PORT_MODIFY("MOUSE1Y")
+ PORT_BIT( 0xff, 0x00, IPT_AD_STICK_Y ) PORT_SENSITIVITY(25) PORT_KEYDELTA(32) PORT_PLAYER(2)
+
+ PORT_MODIFY("IN0")
+ PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_PLAYER(2)
+
+ PORT_MODIFY("IN1")
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_PLAYER(1)
+INPUT_PORTS_END
+
+
// left + right drums together = select / forward (needed on initial screen). left drum = left in menus right drum = right in menus
// analog reading depends heavily on timers, they're too fast right now so drum hits are too hard and register multiple times
-static INPUT_PORTS_START( taikodp )
- PORT_INCLUDE(xavix_an)
+static INPUT_PORTS_START( taikodp )
+ PORT_INCLUDE(xavix_an)
PORT_MODIFY("AN0") // 00 (read by one type of function, handled in timer interrupt at 0x1d92 in RAM)
PORT_BIT( 0xff, 0x00, IPT_PEDAL ) PORT_SENSITIVITY(100) PORT_KEYDELTA(20)
@@ -502,7 +616,7 @@ static INPUT_PORTS_START( taikodp )
PORT_MODIFY("AN5") // 11 (read by different function, handled in timer interrupt at 0x1de8) (battery status related?)
PORT_BIT( 0xff, IP_ACTIVE_HIGH, IPT_UNUSED )
-
+
PORT_MODIFY("AN7") // 13 (read by identical function to 11 but with different addresses, handled in timer interrupt at 0x1e09 in RAM) (battery status related?)
PORT_BIT( 0xff, IP_ACTIVE_HIGH, IPT_UNUSED )
@@ -515,16 +629,34 @@ static INPUT_PORTS_START( taikodp )
PORT_BIT( 0xff, IP_ACTIVE_HIGH, IPT_UNUSED )
PORT_MODIFY("AN6") // 12
PORT_BIT( 0xff, IP_ACTIVE_HIGH, IPT_UNUSED )
+
+ PORT_MODIFY("IN1")
+ PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_CUSTOM_MEMBER(DEVICE_SELF, xavix_i2c_cart_state,i2c_r, nullptr)
INPUT_PORTS_END
-/*
+static INPUT_PORTS_START( jpopira )
+ PORT_INCLUDE(xavix)
+
+ PORT_MODIFY("IN0")
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("Pad 1")
+ PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("Pad 2")
+ PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_NAME("Pad 3")
+ PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_NAME("Pad 4")
+
+ PORT_MODIFY("IN1")
+ PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_CUSTOM_MEMBER(DEVICE_SELF, xavix_i2c_cart_state,i2c_r, nullptr)
+ PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_POWER_OFF ) PORT_NAME("Power Switch") // pressing this will turn the game off.
+INPUT_PORTS_END
+
+
+
static INPUT_PORTS_START( xavixp )
- PORT_INCLUDE(xavix)
+ PORT_INCLUDE(xavix)
- PORT_MODIFY("REGION") // PAL/NTSC flag
- PORT_BIT( 0xff, IP_ACTIVE_LOW, IPT_CUSTOM )
+ PORT_MODIFY("REGION") // PAL/NTSC flag
+ PORT_BIT( 0xff, IP_ACTIVE_LOW, IPT_CUSTOM )
INPUT_PORTS_END
-*/
+
/* Test mode lists the following
@@ -582,6 +714,25 @@ static INPUT_PORTS_START( rad_opus )
PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_START1 ) PORT_NAME("Start / Bomb") // PI07
INPUT_PORTS_END
+static INPUT_PORTS_START( rad_hnt )
+ PORT_INCLUDE(xavix)
+
+ PORT_MODIFY("IN0")
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("Menu Next")
+ PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("Menu Previous")
+ PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_NAME("Menu Select")
+ PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_NAME("Pause / Menu")
+ PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP )
+ PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN )
+ PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT )
+ PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT )
+
+ PORT_MODIFY("IN1")
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON5 ) PORT_NAME("Fire Gun")
+ PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON6 ) PORT_NAME("Safety") PORT_TOGGLE
+
+ PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_POWER_OFF ) PORT_NAME("Power Switch") // pressing this will turn the game off.
+INPUT_PORTS_END
static INPUT_PORTS_START( rad_crdn )
PORT_INCLUDE(xavix)
@@ -652,8 +803,8 @@ static INPUT_PORTS_START( ekara )
PORT_INCLUDE(xavix)
PORT_MODIFY("IN1")
- PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_CUSTOM ) // multiplexed input
- PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_CUSTOM ) // multiplexed input
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_CUSTOM_MEMBER(DEVICE_SELF, xavix_ekara_state,ekara_multi0_r, nullptr)
+ PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_CUSTOM_MEMBER(DEVICE_SELF, xavix_ekara_state,ekara_multi1_r, nullptr)
PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_POWER_OFF ) PORT_NAME("Power Switch") // pressing this will turn the game off.
@@ -718,6 +869,35 @@ static INPUT_PORTS_START( popira )
PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_UNUSED )
INPUT_PORTS_END
+static INPUT_PORTS_START( popira2 ) // player 2 buttons have heavy latency, probably due to incorrect timer emulation, hence NOT WORKING flag right now
+ PORT_INCLUDE(xavix)
+
+ PORT_MODIFY("IN0")
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("P1 Pad 1") PORT_PLAYER(1)
+ PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("P1 Pad 2") PORT_PLAYER(1)
+ PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_NAME("P1 Pad 3") PORT_PLAYER(1)
+ PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_NAME("P1 Pad 4") PORT_PLAYER(1)
+ PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_UNUSED )
+ PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_BUTTON6 ) PORT_NAME("Select Previous") PORT_PLAYER(1)
+ PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_BUTTON5 ) PORT_NAME("Select Next") PORT_PLAYER(1)
+ PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_START1 ) PORT_NAME("Start") PORT_PLAYER(1)
+
+ PORT_MODIFY("IN1")
+ PORT_BIT( 0x07, IP_ACTIVE_HIGH, IPT_UNUSED )
+ PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_CUSTOM_MEMBER(DEVICE_SELF, xavix_popira2_cart_state,i2c_r, nullptr)
+ PORT_BIT( 0x30, IP_ACTIVE_HIGH, IPT_UNUSED )
+ PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_POWER_OFF ) PORT_NAME("Power Switch") // pressing this will turn the game off.
+ PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_UNUSED )
+
+ // main input processing code is at 028059, which ends with setting a timer (028079) to read analog ports and get these buttons that way. main timer handler is at 00eb77, which reads ports via the ADC. $c3 where ports are stored is also checked at 00e6f4
+ PORT_START("P2")
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("P2 Pad 1") PORT_PLAYER(2)
+ PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("P2 Pad 2") PORT_PLAYER(2)
+ PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_NAME("P2 Pad 3") PORT_PLAYER(2)
+ PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_NAME("P2 Pad 4") PORT_PLAYER(2)
+INPUT_PORTS_END
+
+
static INPUT_PORTS_START( rad_bassp )
PORT_INCLUDE(rad_bass)
@@ -731,11 +911,13 @@ static INPUT_PORTS_START( rad_snow )
PORT_INCLUDE(xavix)
PORT_MODIFY("IN0")
- PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("Go") // is this a button, or 'up' ?
-
- PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN )
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_NAME("Foward / Go")
+ PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_NAME("Enter / Select")
PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT )
PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT )
+
+ PORT_MODIFY("IN1")
+ PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_POWER_OFF ) PORT_NAME("Power Switch") // pressing this will turn the game off.
INPUT_PORTS_END
static INPUT_PORTS_START( rad_snowp )
@@ -745,6 +927,19 @@ static INPUT_PORTS_START( rad_snowp )
PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_CUSTOM )
INPUT_PORTS_END
+static INPUT_PORTS_START( rad_bdp )
+ PORT_INCLUDE(xavix)
+
+ PORT_MODIFY("IN0")
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("Purple / Up")
+ PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("Red / Down")
+ PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_NAME("Blue / Back")
+ PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_NAME("Pink / Select")
+
+ PORT_MODIFY("IN1")
+ PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_POWER_OFF ) PORT_NAME("Power Switch") // pressing this will turn the game off.
+INPUT_PORTS_END
+
static INPUT_PORTS_START( rad_ping )
PORT_INCLUDE(xavix)
@@ -771,9 +966,9 @@ static INPUT_PORTS_START( rad_pingp )
INPUT_PORTS_END
static INPUT_PORTS_START( nostalgia )
- PORT_INCLUDE(xavix)
+ PORT_INCLUDE(xavix_i2c)
- PORT_MODIFY("IN0") // mappings based on Dragon Buster button list, inputs don't seem to work properly in some games, probably because bad EEPROM support means all buttons are mapped to the same thing?
+ PORT_MODIFY("IN0") // mappings based on Dragon Buster button list
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON4 ) // Fire4
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON3 ) // Fire3
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNKNOWN ) // not a button? (but can be used to pass prompts?)
@@ -789,6 +984,44 @@ static INPUT_PORTS_START( nostalgia )
INPUT_PORTS_END
+static INPUT_PORTS_START( tak_geig )
+ PORT_INCLUDE(xavix)
+
+ PORT_MODIFY("IN0")
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_PLAYER(1)
+ PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_PLAYER(1)
+ PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_PLAYER(1)
+ PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_PLAYER(1)
+ PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_PLAYER(1)
+ PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_PLAYER(1)
+ PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_PLAYER(1) // pause
+
+ PORT_MODIFY("IN1")
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_PLAYER(2)
+ PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_PLAYER(2)
+ PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_PLAYER(2)
+ PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_PLAYER(2)
+ PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_PLAYER(2)
+ PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_PLAYER(2)
+ PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_PLAYER(2) // pause
+
+INPUT_PORTS_END
+
+
+static INPUT_PORTS_START( rad_bb )
+ PORT_INCLUDE(xavix)
+
+ PORT_MODIFY("IN0")
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("Menu Select")
+ PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON5 ) PORT_NAME("Reset?") // might not be a real button
+ PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_NAME("Pause")
+ PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("Menu Previous")
+ PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_NAME("Menu Next")
+
+ PORT_MODIFY("IN1")
+ PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_POWER_OFF ) PORT_NAME("Power Switch") // pressing this will turn the game off.
+INPUT_PORTS_END
+
// to access hidden test mode reset while holding Button1 and Button2 (works every other reset)
// to cycle through modes use Button 1 until you get to the input test
static INPUT_PORTS_START( rad_bb2 )
@@ -807,13 +1040,17 @@ static INPUT_PORTS_START( rad_bb2 )
INPUT_PORTS_END
static INPUT_PORTS_START( ttv_mx )
- PORT_INCLUDE(xavix)
+ PORT_INCLUDE(xavix_i2c)
PORT_MODIFY("IN0")
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) // Accel
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) // Brake
- PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT )
- PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT )
+ PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_NAME("Pause")
+ PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED )
+ PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_NAME("Motion Up") // you tilt the device, but actual inputs are digital
+ PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_NAME("Motion Down")
+ PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_NAME("Motion Left")
+ PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_NAME("Motion Right")
INPUT_PORTS_END
@@ -850,10 +1087,64 @@ static INPUT_PORTS_START( rad_rh )
PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_POWER_OFF ) PORT_NAME("Power Switch") // pressing this will turn the game off.
INPUT_PORTS_END
-static INPUT_PORTS_START( epo_efdx )
+static INPUT_PORTS_START( epo_epp )
+ PORT_INCLUDE(xavix)
+
+ PORT_MODIFY("IN0")
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) // select
+ PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) // back
+ // 04/08 not used for buttons?
+ PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP )
+ PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN )
+ PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT )
+ PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT )
+INPUT_PORTS_END
+
+// there is also a rumble output, likely mapped to one of the port bits
+static INPUT_PORTS_START( epo_guru )
PORT_INCLUDE(xavix)
PORT_MODIFY("IN0")
+ PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON1 )
+
+ PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) // used in the 'from behind' game at least
+ PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT )
+
+ PORT_MODIFY("MOUSE1X")
+// PORT_BIT( 0xff, 0x80, IPT_AD_STICK_X ) PORT_SENSITIVITY(6) PORT_KEYDELTA(16) PORT_PLAYER(1) PORT_MINMAX(0x44,0xbc)
+ PORT_BIT( 0x1f, 0x10, IPT_AD_STICK_X ) PORT_SENSITIVITY(6) PORT_KEYDELTA(16) PORT_PLAYER(1) // PORT_MINMAX(0x44,0xbc)
+
+ /*
+ (0x20 is subtracted from value returned in read handler)
+
+ main game
+ 00 still
+ 01 - 3c right
+ 3d - 78 left - 78 is a nice slow left but invalid for the sub game
+ 79 - 7f right
+ 80 - 87 left
+ 88 - c3 right
+ c4 - ff left
+
+ sub game (break-out)
+ 00 still
+ 01 - 3f right
+ 40 - 7f left
+ 80 still
+ 81 - bf right
+ c0 - ff left
+
+ so valid range seems to be c4-ff (left), 00 (still), 01-3c (right) even if this means the slowest speed going left is faster than the slowest speed going right
+ maybe actual range is 5 bits either way?
+ 4 bits either way seems to work best in practice
+
+ */
+INPUT_PORTS_END
+
+static INPUT_PORTS_START( epo_efdx )
+ PORT_INCLUDE(xavix_i2c)
+
+ PORT_MODIFY("IN0")
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) // select
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) // back
// 04/08 not used for buttons?
@@ -863,6 +1154,26 @@ static INPUT_PORTS_START( epo_efdx )
PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT )
INPUT_PORTS_END
+static INPUT_PORTS_START( has_wamg )
+ PORT_INCLUDE(xavix)
+
+ PORT_MODIFY("IN1")
+ PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNKNOWN ) // waits for this after fading out title, what is it?
+INPUT_PORTS_END
+
+static INPUT_PORTS_START( evio )
+ PORT_INCLUDE(xavix)
+
+ PORT_MODIFY("IN0")
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN )
+ PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP )
+ PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON1 )
+ PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON2 )
+
+ PORT_MODIFY("IN1")
+ PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_POWER_OFF ) PORT_NAME("Power Switch") // pressing this will turn the game off.
+INPUT_PORTS_END
+
/* correct, 4bpp gfxs */
static const gfx_layout charlayout =
{
@@ -931,6 +1242,24 @@ void xavix_state::xavix(machine_config &config)
ADDRESS_MAP_BANK(config, "lowbus").set_map(&xavix_state::xavix_lowbus_map).set_options(ENDIANNESS_LITTLE, 8, 24, 0x8000);
+ XAVIX_ADC(config, m_adc, 0);
+ m_adc->read_0_callback().set(FUNC(xavix_state::adc0_r));
+ m_adc->read_1_callback().set(FUNC(xavix_state::adc1_r));
+ m_adc->read_2_callback().set(FUNC(xavix_state::adc2_r));
+ m_adc->read_3_callback().set(FUNC(xavix_state::adc3_r));
+ m_adc->read_4_callback().set(FUNC(xavix_state::adc4_r));
+ m_adc->read_5_callback().set(FUNC(xavix_state::adc5_r));
+ m_adc->read_6_callback().set(FUNC(xavix_state::adc6_r));
+ m_adc->read_7_callback().set(FUNC(xavix_state::adc7_r));
+
+ XAVIX_ANPORT(config, m_anport, 0);
+ m_anport->read_0_callback().set(FUNC(xavix_state::anport0_r));
+ m_anport->read_1_callback().set(FUNC(xavix_state::anport1_r));
+ m_anport->read_2_callback().set(FUNC(xavix_state::anport2_r));
+ m_anport->read_3_callback().set(FUNC(xavix_state::anport3_r));
+
+ XAVIX_MATH(config, m_math, 0);
+
/* video hardware */
SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
m_screen->set_refresh_hz(60);
@@ -959,14 +1288,27 @@ void xavix_state::xavix(machine_config &config)
m_sound->add_route(1, "rspeaker", 1.0);
}
+void xavix_guru_state::xavix_guru(machine_config &config)
+{
+ xavix_nv(config);
+
+ m_anport->read_2_callback().set(FUNC(xavix_guru_state::guru_anport2_r));
+}
+
void xavix_i2c_state::xavix_i2c_24lc02(machine_config &config)
{
xavix(config);
- I2CMEM(config, "i2cmem", 0)/*.set_page_size(16)*/.set_data_size(0x100); // 24LC02 (taiko)
+ I2CMEM(config, "i2cmem", 0).set_page_size(16).set_data_size(0x100); // 24LC02 (taiko)
}
+void xavix_i2c_state::xavix_i2c_24c02(machine_config &config)
+{
+ xavix(config);
+
+ I2CMEM(config, "i2cmem", 0).set_page_size(16).set_data_size(0x100); // 24C02
+}
void xavix_i2c_state::xavix_i2c_24lc04(machine_config &config)
{
@@ -974,14 +1316,24 @@ void xavix_i2c_state::xavix_i2c_24lc04(machine_config &config)
// according to http://ww1.microchip.com/downloads/en/devicedoc/21708k.pdf 'the master transmits up to 16 data bytes' however this breaks the Nostalgia games
// of note Galplus Phalanx on Namco Nostalgia 2, which will hang between stages unable to properly access the device, but with no page support it doesn't hang and scores save
- I2CMEM(config, "i2cmem", 0)/*.set_page_size(16)*/.set_data_size(0x200); // 24LC04 on Nostalgia games, 24C04 on others
+ I2CMEM(config, "i2cmem", 0).set_page_size(16).set_data_size(0x200); // 24LC04 on Nostalgia games, 24C04 on others
+}
+
+void xavix_i2c_ltv_tam_state::xavix_i2c_24lc04_tam(machine_config &config)
+{
+ xavix_i2c_24lc04(config);
+
+ m_anport->read_0_callback().set(FUNC(xavix_i2c_ltv_tam_state::tam_anport0_r));
+ m_anport->read_1_callback().set(FUNC(xavix_i2c_ltv_tam_state::tam_anport1_r));
+ m_anport->read_2_callback().set(FUNC(xavix_i2c_ltv_tam_state::tam_anport2_r));
+ m_anport->read_3_callback().set(FUNC(xavix_i2c_ltv_tam_state::tam_anport3_r));
}
void xavix_i2c_state::xavix_i2c_24c08(machine_config &config)
{
xavix(config);
- I2CMEM(config, "i2cmem", 0)/*.set_page_size(16)*/.set_data_size(0x400); // 24C08 (Excite Fishing DX)
+ I2CMEM(config, "i2cmem", 0).set_page_size(16).set_data_size(0x400); // 24C08 (Excite Fishing DX)
}
void xavix_state::xavixp(machine_config &config)
@@ -998,19 +1350,76 @@ void xavix_state::xavix_nv(machine_config &config)
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_1);
}
+void xavix_state::xavixp_nv(machine_config &config)
+{
+ xavixp(config);
+ NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_1);
+}
+
void xavix_state::xavix2000(machine_config &config)
{
xavix(config);
XAVIX2000(config.replace(), m_maincpu, MAIN_CLOCK);
m_maincpu->set_addrmap(AS_PROGRAM, &xavix_state::xavix_map);
- m_maincpu->set_addrmap(5, &xavix_state::superxavix_lowbus_map);
+ m_maincpu->set_addrmap(5, &xavix_state::xavix_lowbus_map);
+ m_maincpu->set_addrmap(6, &xavix_state::xavix_extbus_map);
+ m_maincpu->disable_cache();
+ m_maincpu->set_vblank_int("screen", FUNC(xavix_state::interrupt));
+ m_maincpu->set_vector_callback(FUNC(xavix_state::get_vectors));
+
+ m_palette->set_entries(512);
+}
+
+void xavix_state::xavix2002(machine_config &config)
+{
+ xavix(config);
+
+ XAVIX2002(config.replace(), m_maincpu, MAIN_CLOCK);
+ m_maincpu->set_addrmap(AS_PROGRAM, &xavix_state::xavix_map);
+ m_maincpu->set_addrmap(5, &xavix_state::superxavix_lowbus_map); // has extra video, io etc.
m_maincpu->set_addrmap(6, &xavix_state::xavix_extbus_map);
m_maincpu->disable_cache();
m_maincpu->set_vblank_int("screen", FUNC(xavix_state::interrupt));
m_maincpu->set_vector_callback(FUNC(xavix_state::get_vectors));
m_palette->set_entries(512);
+
+ XAVIX2002IO(config, m_xavix2002io, 0);
+}
+
+
+
+void xavix_i2c_jmat_state::xavix2002_i2c_jmat(machine_config &config)
+{
+ xavix2002(config);
+
+ I2CMEM(config, "i2cmem", 0).set_page_size(16).set_data_size(0x200); // ?
+
+ m_xavix2002io->read_0_callback().set(FUNC(xavix_i2c_jmat_state::read_extended_io0));
+ m_xavix2002io->write_0_callback().set(FUNC(xavix_i2c_jmat_state::write_extended_io0));
+ m_xavix2002io->read_1_callback().set(FUNC(xavix_i2c_jmat_state::read_extended_io1));
+ m_xavix2002io->write_1_callback().set(FUNC(xavix_i2c_jmat_state::write_extended_io1));
+ m_xavix2002io->read_2_callback().set(FUNC(xavix_i2c_jmat_state::read_extended_io2));
+ m_xavix2002io->write_2_callback().set(FUNC(xavix_i2c_jmat_state::write_extended_io2));
+}
+
+
+void xavix_state::xavix2000_nv(machine_config &config)
+{
+ xavix2000(config);
+
+ NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_1);
+}
+
+void xavix_2000_nv_sdb_state::xavix2000_nv_sdb(machine_config &config)
+{
+ xavix2000_nv(config);
+
+ m_anport->read_0_callback().set(FUNC(xavix_2000_nv_sdb_state::sdb_anport0_r));
+ m_anport->read_1_callback().set(FUNC(xavix_2000_nv_sdb_state::sdb_anport1_r));
+ m_anport->read_2_callback().set(FUNC(xavix_2000_nv_sdb_state::sdb_anport2_r));
+ m_anport->read_3_callback().set(FUNC(xavix_2000_nv_sdb_state::sdb_anport3_r));
}
void xavix_i2c_state::xavix2000_i2c_24c04(machine_config &config)
@@ -1062,12 +1471,22 @@ void xavix_i2c_cart_state::xavix_i2c_taiko(machine_config &config)
{
xavix_cart(config);
- I2CMEM(config, "i2cmem", 0)/*.set_page_size(16)*/.set_data_size(0x100); // 24LC02
+ I2CMEM(config, "i2cmem", 0).set_page_size(16).set_data_size(0x100); // 24LC02
SOFTWARE_LIST(config, "cart_list_japan_d").set_original("ekara_japan_d");
SOFTWARE_LIST(config, "cart_list_japan_sp").set_original("ekara_japan_sp");
+}
+
+void xavix_i2c_cart_state::xavix_i2c_jpopira(machine_config &config)
+{
+ xavix_cart(config);
- // do any of the later G/P series carts with SEEPROM work with this too? check
+ NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
+
+ I2CMEM(config, "i2cmem", 0).set_page_size(16).set_data_size(0x100); // 24LC02
+
+ SOFTWARE_LIST(config, "cart_list_jpopira_jp").set_original("jpopira_jp"); // NOTE, these are for Jumping Popira only, they don't work with the karaoke or regular popira units
+ SOFTWARE_LIST(config, "cart_list_japan_sp").set_original("ekara_japan_sp");
}
void xavix_cart_state::xavix_cart_ekara(machine_config &config)
@@ -1086,6 +1505,9 @@ void xavix_cart_state::xavix_cart_ekara(machine_config &config)
SOFTWARE_LIST(config, "cart_list_japan_en").set_original("ekara_japan_en");
SOFTWARE_LIST(config, "cart_list_japan_sp").set_original("ekara_japan_sp");
SOFTWARE_LIST(config, "cart_list_japan_web").set_original("ekara_japan_web");
+ SOFTWARE_LIST(config, "cart_list_japan_a").set_original("ekara_japan_a");
+ SOFTWARE_LIST(config, "cart_list_japan_gk").set_original("ekara_japan_gk");
+ SOFTWARE_LIST(config, "cart_list_japan_bh").set_original("ekara_japan_bh");
}
void xavix_cart_state::xavix_cart_popira(machine_config &config)
@@ -1093,7 +1515,7 @@ void xavix_cart_state::xavix_cart_popira(machine_config &config)
xavix_cart(config);
// is a battery / power source required to store NVRAM in the CPU? Popira definitely needs NVRAM storing on power-of
- // XaviX Tennis won't boot if you do (but that could be an unrelated SEEPROM issue?) & DDR Family Mat gets stuck in 2 Player mode with no obvious way of changing back
+ // XaviX Tennis won't boot if you do (but that could be an unrelated SEEPROM issue?) & DDR Family Mat gets stuck in 2 Player mode with no obvious way of changing back
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_1);
/* software lists */
@@ -1103,6 +1525,43 @@ void xavix_cart_state::xavix_cart_popira(machine_config &config)
SOFTWARE_LIST(config, "cart_list_japan_sp").set_original("ekara_japan_sp");
}
+// see code at 028060, using table from 00eb6d for conversion
+READ8_MEMBER(xavix_popira2_cart_state::popira2_adc0_r)
+{
+ uint8_t p2 = m_p2->read() & 0x03;
+ switch (p2)
+ {
+ case 0x00: return 0xa0;
+ case 0x01: return 0x60;
+ case 0x02: return 0x10;
+ case 0x03: return 0x00;
+ }
+
+ return 0x00;
+}
+
+READ8_MEMBER(xavix_popira2_cart_state::popira2_adc1_r)
+{
+ uint8_t p2 = (m_p2->read() >> 2) & 0x03;
+ switch (p2)
+ {
+ case 0x00: return 0xa0;
+ case 0x01: return 0x60;
+ case 0x02: return 0x10;
+ case 0x03: return 0x00;
+ }
+
+ return 0x00;
+}
+
+void xavix_popira2_cart_state::xavix_cart_popira2(machine_config &config)
+{
+ xavix_cart_popira(config);
+
+ m_adc->read_0_callback().set(FUNC(xavix_popira2_cart_state::popira2_adc0_r));
+ m_adc->read_1_callback().set(FUNC(xavix_popira2_cart_state::popira2_adc1_r));
+}
+
void xavix_cart_state::xavix_cart_ddrfammt(machine_config &config)
{
xavix_cart(config);
@@ -1112,6 +1571,14 @@ void xavix_cart_state::xavix_cart_ddrfammt(machine_config &config)
//SOFTWARE_LIST(config, "cart_list_japan_sp").set_original("ekara_japan_sp"); // not for this system, but unlike other carts, actually tells you this if inserted rather than crashing the system
}
+
+void xavix_i2c_state::xavix2002_i2c_24c04(machine_config &config)
+{
+ xavix2002(config);
+
+ I2CMEM(config, "i2cmem", 0).set_page_size(16).set_data_size(0x200); // 24C04
+}
+
void xavix_state::init_xavix()
{
m_rgnlen = memregion("bios")->bytes();
@@ -1169,6 +1636,17 @@ ROM_START( rad_opus )
ROM_LOAD("opus.bin", 0x000000, 0x100000, CRC(509df402) SHA1(c5b863670eac8498ddda9dfde91387634cf7aa9f) )
ROM_END
+ROM_START( rad_hnt )
+ ROM_REGION(0x100000, "bios", ROMREGION_ERASE00)
+ ROM_LOAD("huntin1.bin", 0x000000, 0x100000, CRC(e51e250f) SHA1(d72199096d466cd344bb243ef1228e0df9501d00) )
+ROM_END
+
+ROM_START( rad_hnt2 )
+ ROM_REGION(0x200000, "bios", ROMREGION_ERASE00)
+ ROM_LOAD("huntin2.bin", 0x000000, 0x200000, CRC(fb6846df) SHA1(267632790ed42eba7ef1517b86b024799a78839d) )
+ROM_END
+
+
ROM_START( rad_snow )
ROM_REGION(0x100000, "bios", ROMREGION_ERASE00)
ROM_LOAD("snoblu.bin", 0x000000, 0x100000, CRC(593e40b3) SHA1(03483ac39eddd7746470fb60018e704382b0da59) )
@@ -1200,6 +1678,11 @@ ROM_START( rad_crdnp )
ROM_LOAD( "cardnight.bin", 0x000000, 0x100000, CRC(d19eba08) SHA1(cedb9fe785f2a559f518a1d8ecf80d500ddc63c7) )
ROM_END
+ROM_START( rad_bb )
+ ROM_REGION( 0x100000, "bios", ROMREGION_ERASE00 )
+ ROM_LOAD( "radicabaseball.bin", 0x000000, 0x100000, CRC(3fa6f490) SHA1(0772156a67a22d06f5ffd6d1a77f6dc867d0a6d2) )
+ROM_END
+
ROM_START( rad_bb2 )
ROM_REGION( 0x200000, "bios", ROMREGION_ERASE00 )
ROM_LOAD( "baseball2.bin", 0x000000, 0x200000, CRC(bdbf6202) SHA1(18d5cc2d77cbb734629a7a5b6e0f419d21beedbd) )
@@ -1215,6 +1698,25 @@ ROM_START( rad_mtrkp ) // rom was dumped from NTSC unit, assuming to be the same
ROM_LOAD( "monstertruck.bin", 0x000000, 0x400000, CRC(dccda0a7) SHA1(7953cf29643672f8367639555b797c20bb533eab) )
ROM_END
+ROM_START( rad_ssx )
+ ROM_REGION(0x400000, "bios", ROMREGION_ERASE00)
+ ROM_LOAD("snowssx.bin", 0x000000, 0x400000, CRC(108e19a6) SHA1(3dfb18efb6331b96a53138a5ba29dae9cd966e90) )
+ROM_END
+
+ROM_START( rad_ssxp )
+ ROM_REGION(0x400000, "bios", ROMREGION_ERASE00)
+ ROM_LOAD("snowssx.bin", 0x000000, 0x400000, CRC(108e19a6) SHA1(3dfb18efb6331b96a53138a5ba29dae9cd966e90) )
+ROM_END
+
+ROM_START( rad_sbw )
+ ROM_REGION(0x400000, "bios", ROMREGION_ERASE00)
+ ROM_LOAD("snowbwhite.bin", 0x000000, 0x400000, CRC(640c1473) SHA1(d37d1484a5b14735b35afbca305dad7d178b08a2) )
+ROM_END
+
+ROM_START( rad_bdp )
+ ROM_REGION(0x800000, "bios", ROMREGION_ERASE00)
+ ROM_LOAD("barbiepad.bin", 0x000000, 0x200000, CRC(48731512) SHA1(377d4e1c98cafcd9d5e1ee27943289d250a6e7a9) )
+ROM_END
ROM_START( rad_madf )
ROM_REGION(0x400000, "bios", ROMREGION_ERASE00)
@@ -1231,6 +1733,32 @@ ROM_START( epo_efdx )
ROM_LOAD("excitefishing.bin", 0x000000, 0x400000, CRC(9c85b261) SHA1(6a363faed2ec89c5176e46554a98ca1e20132579) )
ROM_END
+ROM_START( epo_epp )
+ ROM_REGION(0x100000, "bios", ROMREGION_ERASE00)
+ ROM_LOAD("excitepingpong.bin", 0x000000, 0x100000, CRC(1fdb9cbd) SHA1(8ed0c1f6d2708ab6e79f0b9553e587c6446e8338) )
+ROM_END
+
+ROM_START( epo_epp3 )
+ ROM_REGION(0x200000, "bios", ROMREGION_ERASE00)
+ ROM_LOAD("excitepingpong3.bin", 0x000000, 0x200000, CRC(a2ee8bff) SHA1(6e16dbaac9680e1f311c08e3f573d0cf8708b446))
+ROM_END
+
+ROM_START( rad_socr )
+ ROM_REGION(0x800000, "bios", ROMREGION_ERASE00)
+ ROM_LOAD("soccer.u5", 0x000000, 0x100000, CRC(0564a766) SHA1(bded4f2e0d059731164c35de7df62ef411402901) )
+ ROM_LOAD("soccer.u4", 0x400000, 0x200000, CRC(e0e2c488) SHA1(907511d945dec51782af268a94b372dfeb7517c5) )
+ROM_END
+
+ROM_START( epo_guru )
+ ROM_REGION(0x400000, "bios", ROMREGION_ERASE00)
+ ROM_LOAD("gururinworld.bin", 0x000000, 0x400000, CRC(e5ae4523) SHA1(0e39ef8f94203d34e49422081667805f50a339a1) )
+ROM_END
+
+ROM_START( epo_dmon ) // Doraemon has a phototransistor, microphone and 24LC02, PCB says XaviX 2002
+ ROM_REGION(0x400000, "bios", ROMREGION_ERASE00)
+ ROM_LOAD("doraemon.bin", 0x000000, 0x400000, CRC(d8f5412f) SHA1(11a4c017ed400f7aa585be744d9693efe734c192) )
+ROM_END
+
ROM_START( rad_rh )
ROM_REGION(0x200000, "bios", ROMREGION_ERASE00)
ROM_LOAD("rescueheroes.bin", 0x000000, 0x200000, CRC(38c391a7) SHA1(120334d4ce89d98438c2a35bf7e53af5096cc878) )
@@ -1241,6 +1769,17 @@ ROM_START( has_wamg )
ROM_LOAD( "minigolf.bin", 0x000000, 0x400000, CRC(35cee2ad) SHA1(c7344e8ba336bc329638485ea571cd731ebf7649) )
ROM_END
+ROM_START( ltv_tam )
+ ROM_REGION( 0x400000, "bios", ROMREGION_ERASE00)
+ ROM_LOAD("letstvtamagotchi.bin", 0x000000, 0x400000, CRC(e3723272) SHA1(e72e128a7a24afb96baafe5f13e13a0d74db4033) )
+ROM_END
+
+
+ROM_START( tak_geig )
+ ROM_REGION(0x400000, "bios", ROMREGION_ERASE00)
+ ROM_LOAD("geigeki.bin", 0x000000, 0x400000, CRC(bd0c3576) SHA1(06f614dbec0225ce4ed866b98450912986d72faf) )
+ROM_END
+
/*
The e-kara cartridges require the BIOS rom to map into 2nd external bus space as they fetch palette data from
it etc.
@@ -1264,6 +1803,32 @@ ROM_START( ekaraj )
ROM_RELOAD(0x000000, 0x100000)
ROM_END
+ROM_START( ekaraphs )
+ ROM_REGION( 0x800000, "bios", ROMREGION_ERASE00 )
+ ROM_LOAD( "ekaraheadset.bin", 0x600000, 0x200000, CRC(dd9b3cd7) SHA1(baaf35d56fa45b6f995b8466331bb30f0035f734) )
+ ROM_RELOAD(0x000000, 0x200000)
+ROM_END
+
+ROM_START( ekarag )
+ ROM_REGION( 0x800000, "bios", ROMREGION_ERASE00 )
+ ROM_LOAD( "ekaragermany.bin", 0x600000, 0x200000, CRC(644f06b0) SHA1(433e65a6ea029b67ee62b4b3de52ff3504cfdf16) )
+ ROM_RELOAD(0x000000, 0x200000)
+ROM_END
+
+
+ROM_START( epitch )
+ ROM_REGION( 0x800000, "bios", ROMREGION_ERASE00 )
+ ROM_LOAD( "ekarajapan.bin", 0x600000, 0x100000, CRC(e459e43b) SHA1(58b7f36a81571a2df5e812c118fdf68812a05abc) )
+ ROM_RELOAD(0x000000, 0x100000)
+ROM_END
+
+ROM_START( ekaramix )
+ ROM_REGION( 0x800000, "bios", ROMREGION_ERASE00 )
+ // also has a MX87L100C 28-pin chip in the unit, possibly the USB controller. Part of the ROM contains a FAT filesystem that could possibly appear as a USB drive on the PC?
+ ROM_LOAD( "ekaramix.bin", 0x600000, 0x200000, CRC(ee71576e) SHA1(26f8c9edcbbed77e86a1cb5a0b91c92a16fef433) )
+ ROM_RELOAD(0x000000, 0x200000)
+ROM_END
+
ROM_START( ddrfammt )
ROM_REGION( 0x800000, "bios", ROMREGION_ERASE00 )
ROM_LOAD( "ekara_ddr_ha010_81947.bin", 0x600000, 0x200000, CRC(737d5d1a) SHA1(a1043047056dd27bca69767ee2044461ec549465) )
@@ -1276,14 +1841,47 @@ ROM_START( popira )
ROM_RELOAD(0x000000, 0x100000)
ROM_END
+ROM_START( popira2 )
+ ROM_REGION( 0x800000, "bios", ROMREGION_ERASE00 )
+ ROM_LOAD( "popira2.bin", 0x600000, 0x200000, CRC(6acd8be0) SHA1(8b6c812d37e2dc2f2531b0e47d84ad8485729dc5) )
+ ROM_RELOAD(0x000000, 0x200000)
+ROM_END
+
ROM_START( taikodp )
ROM_REGION( 0x800000, "bios", ROMREGION_ERASE00 )
ROM_LOAD( "taikodepopira.bin", 0x600000, 0x200000, CRC(037a8472) SHA1(03cae465965935fc084fb906f8f5de7679f42dd1) )
ROM_RELOAD(0x000000, 0x200000)
ROM_END
+ROM_START( jpopira )
+ ROM_REGION( 0x800000, "bios", ROMREGION_ERASE00 )
+ ROM_LOAD( "jumpingpopira.bin", 0x600000, 0x200000, CRC(a7bedbd2) SHA1(d62d4ca660c8df14891217fb7b7a2b4a931ff35f) )
+ ROM_RELOAD(0x000000, 0x200000)
+
+ ROM_REGION( 0x100, "i2cmem", ROMREGION_ERASE00 ) // maybe we can remove this eventually, but for now it won't init without a reset between
+ ROM_LOAD( "i2cmem.bin", 0x000, 0x100, CRC(70a05af1) SHA1(e8f4ab51445777fe459f9ff09333f548c4e3507c) )
+ROM_END
+
+ROM_START( evio )
+ ROM_REGION( 0x800000, "bios", ROMREGION_ERASE00 )
+ ROM_LOAD( "evio.bin", 0x600000, 0x200000, CRC(ee22c764) SHA1(f2b7e213eb78065a63ef484a619bcfc61299e30e))
+ ROM_RELOAD(0x000000, 0x200000)
+ROM_END
+
+
+
-/* XaviX hardware titles */
+/* XaviX hardware titles (1st Generation)
+
+ These use
+ SSD 98 PL7351-181
+ SSD 98 PA7351-107
+ SSD 97 PA7270-107
+ type CPUS
+
+ only new opcodes are callf and retf?
+
+*/
CONS( 2006, taitons1, 0, 0, xavix_i2c_24lc04, nostalgia,xavix_i2c_state, init_xavix, "Bandai / SSD Company LTD / Taito", "Let's! TV Play Classic - Taito Nostalgia 1 (Japan)", MACHINE_IMPERFECT_SOUND )
@@ -1299,6 +1897,10 @@ CONS( 2000, rad_pingp, rad_ping, 0, xavixp, rad_pingp,xavix_state,
CONS( 2000, rad_opus, 0, 0, xavix_nv, rad_opus, xavix_state, init_xavix, "Radica / SSD Company LTD", "Play TV Opus (NTSC)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND ) // there is a missing 'TV Static' noise effect when menus appear (box shows 'Play TV' ingame just shows 'Radica:Plug & Play')
// ConnecTV Opus is a different ROM in this case? Game doesn't read from PAL/NTSC flag? (verify it isn't detecting PAL in some other way) ( https://www.youtube.com/watch?v=Ub9tstLEj_0 )
+CONS( 2000, rad_hnt, 0, 0, xavix_nv, rad_hnt, xavix_state, init_xavix, "Radica / SSD Company LTD", "Play TV Buckmasters Huntin' (NTSC)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND ) // need to map gun (box shows 'Play TV' ingame just shows 'Plug & Play')
+
+CONS( 2003, rad_hnt2, 0, 0, xavix_nv, rad_hnt, xavix_state, init_xavix, "Radica / SSD Company LTD", "Play TV Buckmasters Huntin' 2 (NTSC)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND ) // need to map gun, crashes on pause
+
CONS( 2003, rad_mtrk, 0, 0, xavix_mtrk, rad_mtrk, xavix_mtrk_state, init_xavix, "Radica / SSD Company LTD", "Play TV Monster Truck (NTSC)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND )
CONS( 2003, rad_mtrkp, rad_mtrk, 0, xavix_mtrkp, rad_mtrkp,xavix_mtrk_state, init_xavix, "Radica / SSD Company LTD", "ConnecTV Monster Truck (PAL)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND )
@@ -1308,25 +1910,48 @@ CONS( 200?, rad_boxp, rad_box, 0, xavixp, rad_boxp, xavix_state,
CONS( 200?, rad_crdn, 0, 0, xavix, rad_crdn, xavix_state, init_xavix, "Radica / SSD Company LTD", "Play TV Card Night (NTSC)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND )
CONS( 200?, rad_crdnp, rad_crdn, 0, xavixp, rad_crdnp,xavix_state, init_xavix, "Radica / SSD Company LTD", "ConnecTV Card Night (PAL)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND )
+CONS( 2000, rad_bb, 0, 0, xavix, rad_bb, xavix_state, init_xavix, "Radica / SSD Company LTD", "Play TV Baseball (NTSC)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND ) // Play TV branding used on box, not ingame
+
CONS( 2002, rad_bb2, 0, 0, xavix, rad_bb2, xavix_state, init_xavix, "Radica / SSD Company LTD", "Play TV Baseball 2 (NTSC)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND ) // contains string "Radica RBB2 V1.0"
CONS( 2001, rad_bass, 0, 0, xavix, rad_bass, xavix_state, init_xavix, "Radica / SSD Company LTD", "Play TV Bass Fishin' (NTSC)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND )
CONS( 2001, rad_bassp, rad_bass, 0, xavixp, rad_bassp,xavix_state, init_xavix, "Radica / SSD Company LTD", "ConnecTV Bass Fishin' (PAL)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND )
// there is another 'Snowboarder' with a white coloured board, it appears to be a newer game closer to 'SSX Snowboarder' but without the SSX license.
-CONS( 2001, rad_snow, 0, 0, xavix, rad_snow, xavix_state, init_xavix, "Radica / SSD Company LTD", "Play TV Snowboarder (Blue) (NTSC)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND )
-CONS( 2001, rad_snowp, rad_snow, 0, xavixp, rad_snowp,xavix_state, init_xavix, "Radica / SSD Company LTD", "ConnecTV Snowboarder (Blue) (PAL)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND )
+CONS( 2001, rad_snow, 0, 0, xavix_nv, rad_snow, xavix_state, init_xavix, "Radica / SSD Company LTD", "Play TV Snowboarder (Blue) (NTSC)", MACHINE_IMPERFECT_SOUND )
+CONS( 2001, rad_snowp, rad_snow, 0, xavixp_nv, rad_snowp,xavix_state, init_xavix, "Radica / SSD Company LTD", "ConnecTV Snowboarder (Blue) (PAL)", MACHINE_IMPERFECT_SOUND )
-CONS( 2003, rad_madf, 0, 0, xavix_madfb, rad_fb, xavix_madfb_state, init_xavix, "Radica / SSD Company LTD", "EA Sports Madden Football (NTSC)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND ) // no Play TV branding, USA only release?
+CONS( 2003, rad_madf, 0, 0, xavix_madfb, rad_fb, xavix_madfb_state, init_xavix, "Radica / Electronics Arts / SSD Company LTD", "EA Sports Madden Football (NTSC)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND ) // no Play TV branding, USA only release?
CONS( 200?, rad_fb, 0, 0, xavix_madfb, rad_fb, xavix_madfb_state, init_xavix, "Radica / SSD Company LTD", "Play TV Football (NTSC)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND ) // USA only release? doesn't change logo for PAL.
-CONS( 200?, rad_rh, 0, 0, xavix, rad_rh, xavix_state, init_xavix, "Radioa / Fisher-Price / SSD Company LTD", "Play TV Rescue Heroes (NTSC)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND )
+CONS( 200?, rad_rh, 0, 0, xavix, rad_rh, xavix_state, init_xavix, "Radica / Fisher-Price / SSD Company LTD", "Play TV Rescue Heroes (NTSC)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND )
+
+CONS( 2004, rad_ssx, 0, 0, xavix, rad_snow, xavix_state, init_xavix, "Radica / Electronics Arts / SSD Company LTD", "Play TV SSX Snowboarder (NTSC)", MACHINE_IMPERFECT_SOUND )
+CONS( 2004, rad_ssxp, rad_ssx, 0, xavixp, rad_snowp,xavix_state, init_xavix, "Radica / Electronics Arts / SSD Company LTD", "ConnecTV SSX Snowboarder (PAL)", MACHINE_IMPERFECT_SOUND )
+
+// basically a reissue of SSX but without the license
+CONS( 2006, rad_sbw, 0, 0, xavix, rad_snow, xavix_state, init_xavix, "Radica / SSD Company LTD", "Play TV Snowboarder (White) (NTSC)", MACHINE_IMPERFECT_SOUND )
+// doesn't exist with ConnecTV branding?
+
+CONS( 2002, rad_bdp, 0, 0, xavix, rad_bdp, xavix_state, init_xavix, "Radica / Mattel / SSD Company LTD", "Barbie Dance Party", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND )
+
+CONS( 2002, rad_socr, 0, 0, xavix, epo_epp, xavix_state, init_xavix, "Radica / Epoch / SSD Company LTD", "Play TV Soccer", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND )
+
+CONS( 2000, epo_epp, 0, 0, xavix, epo_epp, xavix_state, init_xavix, "Epoch / SSD Company LTD", "Excite Ping Pong (Japan)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND )
+// Excite Ping Pong 2 is from 2003, and there's a 3rd game from 2006 also
+
+CONS( 2006, epo_epp3, 0, 0, xavix, epo_epp, xavix_state, init_xavix, "Epoch / SSD Company LTD", "Challenge Ai-chan! Excite Ping Pong (Japan)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND )
CONS( 200?, epo_efdx, 0, 0, xavix_i2c_24c08, epo_efdx, xavix_i2c_state, init_epo_efdx, "Epoch / SSD Company LTD", "Excite Fishing DX (Japan)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND )
-CONS( 200?, has_wamg, 0, 0, xavix, xavix, xavix_state, init_xavix, "Hasbro / Milton Bradley / SSD Company LTD", "TV Wild Adventure Mini Golf (NTSC)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND )
+CONS( 2005, epo_guru, 0, 0, xavix_guru, epo_guru, xavix_guru_state, init_xavix, "Epoch / SSD Company LTD", "Gururin World (Japan)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND )
+
+CONS( 2002, epo_dmon, 0, 0, xavix_i2c_24c02, xavix_i2c,xavix_i2c_state, init_xavix, "Epoch / SSD Company LTD", "Doraemon Wakuwaku Kuukihou (Japan)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND ) // full / proper title?
+
+CONS( 200?, has_wamg, 0, 0, xavix, has_wamg, xavix_state, init_xavix, "Hasbro / Milton Bradley / SSD Company LTD", "TV Wild Adventure Mini Golf (NTSC)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND )
+CONS( 2002, tak_geig, 0, 0, xavix_nv, tak_geig, xavix_state, init_xavix, "Takara / SSD Company LTD", "Geigeki Go Go Shooting (Japan)", MACHINE_IMPERFECT_SOUND )
/* Music titles: Emulation note:
SEEPROM write appears to work (save NVRAM file looks valid) but game fails to read it back properly, fails backup data checksum, and blanks it again.
@@ -1335,18 +1960,55 @@ CONS( 200?, has_wamg, 0, 0, xavix, xavix, xavix_state,
CONS( 2000, ekara, 0, 0, xavix_cart_ekara, ekara, xavix_ekara_state, init_xavix, "Takara / SSD Company LTD / Hasbro", "e-kara (US?, NTSC, set 1)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND /*| MACHINE_IS_BIOS_ROOT*/ ) // shows "Please insert a cartridge before turn it on" without cart
CONS( 2000, ekaraa, ekara, 0, xavix_cart_ekara, ekara, xavix_ekara_state, init_xavix, "Takara / SSD Company LTD / Hasbro", "e-kara (US?, NTSC, set 2)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND /*| MACHINE_IS_BIOS_ROOT*/ ) // shows "Please insert a cartridge before turning on e-kara" without cart
CONS( 2000, ekaraj, ekara, 0, xavix_cart_ekara, ekara, xavix_ekara_state, init_xavix, "Takara / SSD Company LTD", "e-kara (Japan)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND /*| MACHINE_IS_BIOS_ROOT*/ ) // shows Japanese message without cart
-// there appear to be later e-kara releases for each region with 3 built in songs too
+CONS( 2002, ekarag, ekara, 0, xavix_cart_ekara, ekara, xavix_ekara_state, init_xavix, "Takara / SSD Company LTD", "e-kara (Germany?, includes 3 songs)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND /*| MACHINE_IS_BIOS_ROOT*/ ) // found in Germany, could just be a Europe-wide model tho?, NOT a headset model, but still has 3 songs.
+// the 'e-kara pro headset' has 3 songs built in for the US release. The Japanese release of this appears to be called 'e-kara H.S.' and it is unclear if it also has built in songs. The Canadian box says 'cartridge contains' instead of 'songs included' but is likely a printing error.
+CONS( 2002, ekaraphs, ekara, 0, xavix_cart_ekara, ekara, xavix_ekara_state, init_xavix, "Takara / SSD Company LTD", "e-kara Pro Headset (US, includes 3 songs)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND /*| MACHINE_IS_BIOS_ROOT*/ )
+
+// epitch (at least the pichi pichi pitch mermaid starter pack) uses the same internal rom as the Japanese ekara, but has less buttons, so some features aren't available (some games also seem to expect to read it with a different layout eg 'a7' cart, but 'a5' cart doesn't, so must be a way to enable that mode, or bug in code?)
+CONS( 2003, epitch, 0, 0, xavix_cart_ekara, ekara, xavix_ekara_state, init_xavix, "Takara / SSD Company LTD", "e-pitch (Japan)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND /*| MACHINE_IS_BIOS_ROOT*/ ) // shows Japanese message without cart
+
+// e-kara mix was another unit that allowed you to connect to a PC, unlike e-kara web it also functions as a regular device
+CONS( 200?, ekaramix, 0, 0, xavix_cart_ekara, ekara, xavix_ekara_state, init_xavix, "Takara / SSD Company LTD", "e-kara Mix (Japan)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND /*| MACHINE_IS_BIOS_ROOT*/ )
+
CONS( 2001, ddrfammt, 0, 0, xavix_cart_ddrfammt,ddrfammt, xavix_cart_state, init_xavix, "Takara / Konami / SSD Company LTD", "Dance Dance Revolution Family Mat (Japan)", MACHINE_IMPERFECT_SOUND/*|MACHINE_IS_BIOS_ROOT*/ )
CONS( 2000, popira, 0, 0, xavix_cart_popira,popira, xavix_cart_state, init_xavix, "Takara / SSD Company LTD", "Popira (Japan)", MACHINE_IMPERFECT_SOUND/*|MACHINE_IS_BIOS_ROOT*/ ) // The original Popira is a single yellow unit
-// Popira 2 is a Green unit and a Blue Unit linked together
+CONS( 2002, popira2, 0, 0, xavix_cart_popira2,popira2, xavix_popira2_cart_state, init_xavix, "Takara / SSD Company LTD", "Popira 2 (Japan)", MACHINE_IMPERFECT_SOUND/*|MACHINE_IS_BIOS_ROOT*/ ) // Popira 2 is a set of 2 blue & green linked units (2nd unit is just a controller, no CPU or TV out)
CONS( 2003, taikodp, 0, 0, xavix_i2c_taiko, taikodp, xavix_i2c_cart_state, init_xavix, "Takara / SSD Company LTD", "Taiko De Popira (Japan)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND /*|MACHINE_IS_BIOS_ROOT*/ ) // inputs? are the drums analog?
+CONS( 2004, jpopira, 0, 0, xavix_i2c_jpopira,jpopira, xavix_i2c_cart_state, init_xavix, "Takara / SSD Company LTD", "Jumping Popira (Japan)", MACHINE_IMPERFECT_SOUND /*|MACHINE_IS_BIOS_ROOT*/ )
+
+
+CONS( 2003, evio, 0, 0, xavix_nv, evio, xavix_state, init_xavix, "Tomy / SSD Company LTD", "Evio (Japan)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND /*|MACHINE_IS_BIOS_ROOT*/ ) // inputs? it's a violin controller
+
+
+// Let’s!TVプレイ 超にんきスポット!ころがしほーだい たまごっちりぞーと (Let's! TV Play Chou Ninki Spot! Korogashi-Houdai Tamagotchi Resort) (only on the Japanese list? http://test.shinsedai.co.jp/english/products/Applied/list.html ) This also allows you to use an IR reciever to import a Tamagotchi from compatible games
+CONS( 2006, ltv_tam, 0, 0, xavix_i2c_24lc04_tam, ltv_tam,xavix_i2c_ltv_tam_state, init_xavix, "Bandai / SSD Company LTD", "Let's! TV Play Chou Ninki Spot! Korogashi-Houdai Tamagotchi Resort (Japan)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND )
+
+
+/* SuperXaviX(?) (XaviX 2000 type CPU) hardware titles (2nd XaviX generation?)
+
+ these use the SSD 2000 NEC 85605-621 type CPU
+
+ XavixPort Golf is "SSD 2003 SuperXaviX MXIC 2003 3009" (not dumped yet, but actually marked as SuperXaviX unlike the others!)
+
+ This CPU type adds extra opcodes that don't appear to be present in the 97/98 types
+ It does not appear to support the bitmap modes or 16-bit ROMs found in the 2002 type
+*/
+
+ROM_START( epo_sdb )
+ ROM_REGION(0x400000, "bios", ROMREGION_ERASE00)
+ ROM_LOAD("superdashball.bin", 0x000000, 0x400000, CRC(a004a764) SHA1(47a96822d4d7d6a0f6be5cd729c3747dbab65979) )
+ROM_END
+
+ROM_START( epo_ebox )
+ ROM_REGION(0x400000, "bios", ROMREGION_ERASE00)
+ ROM_LOAD("exciteboxing.bin", 0x000000, 0x400000, CRC(e25ae4f5) SHA1(7f7b613f0ab8f43f5cad0d13de538921e77cae9c) )
+ROM_END
-/* SuperXaviX hardware titles */
ROM_START( ttv_sw )
ROM_REGION( 0x800000, "bios", ROMREGION_ERASE00 )
@@ -1368,18 +2030,136 @@ ROM_START( drgqst )
ROM_LOAD( "dragonquest.bin", 0x000000, 0x800000, CRC(3d24413f) SHA1(1677e81cedcf349de7bf091a232dc82c6424efba) )
ROM_END
-CONS( 2005, ttv_sw, 0, 0, xavix2000_i2c_24c02, xavix, xavix_i2c_lotr_state, init_xavix, "Tiger / SSD Company LTD", "Star Wars Saga Edition - Lightsaber Battle Game", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND )
-CONS( 2005, ttv_lotr, 0, 0, xavix2000_i2c_24c02, xavix, xavix_i2c_lotr_state, init_xavix, "Tiger / SSD Company LTD", "Lord Of The Rings - Warrior of Middle-Earth", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND )
-CONS( 2005, ttv_mx, 0, 0, xavix2000_i2c_24c04, ttv_mx, xavix_i2c_state, init_xavix, "Tiger / SSD Company LTD", "MX Dirt Rebel", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND )
-CONS( 2003, drgqst, 0, 0, xavix2000_i2c_24c02, xavix, xavix_i2c_lotr_state, init_xavix, "Square Enix / SSD Company LTD", "Kenshin Dragon Quest: Yomigaerishi Densetsu no Ken", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND )
+ROM_START( ban_onep )
+ ROM_REGION( 0x800000, "bios", ROMREGION_ERASE00)
+ ROM_LOAD("onepiece.bin", 0x000000, 0x800000, CRC(c5cb5a5f) SHA1(db85f6cc48d77c5a4967b9b8e2999167e3dfc8c8) )
+ROM_END
+
+CONS( 2002, epo_ebox, 0, 0, xavix2000_nv, epo_epp, xavix_state, init_xavix, "Epoch / SSD Company LTD", "Excite Boxing (Japan)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND ) // doesn't use XaviX2000 extra opcodes, but had that type of CPU
+CONS( 2004, epo_sdb, 0, 0, xavix2000_nv_sdb, epo_sdb, xavix_2000_nv_sdb_state, init_xavix, "Epoch / SSD Company LTD", "Super Dash Ball (Japan)", MACHINE_IMPERFECT_SOUND )
+
+CONS( 2005, ttv_sw, 0, 0, xavix2000_i2c_24c02, ttv_lotr, xavix_i2c_lotr_state, init_xavix, "Tiger / SSD Company LTD", "Star Wars Saga Edition - Lightsaber Battle Game", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND )
+CONS( 2005, ttv_lotr, 0, 0, xavix2000_i2c_24c02, ttv_lotr, xavix_i2c_lotr_state, init_xavix, "Tiger / SSD Company LTD", "Lord Of The Rings - Warrior of Middle-Earth", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND )
+CONS( 2005, ttv_mx, 0, 0, xavix2000_i2c_24c04, ttv_mx, xavix_i2c_state, init_xavix, "Tiger / SSD Company LTD", "MX Dirt Rebel", MACHINE_IMPERFECT_SOUND )
+CONS( 2003, drgqst, 0, 0, xavix2000_i2c_24c02, ttv_lotr, xavix_i2c_lotr_state, init_xavix, "Square Enix / SSD Company LTD", "Kenshin Dragon Quest: Yomigaerishi Densetsu no Ken", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND )
+
+// hangs after starting a game, or after quite a long time in attract mode (first problem could be bad save data read with the eeprom code, 2nd problem might just be how it is, ends up in a dead loop, not executing invalid code)
+CONS( 2004, ban_onep, 0, 0, xavix2000_i2c_24c04, ttv_lotr, xavix_i2c_lotr_state, init_xavix, "Bandai / SSD Company LTD", "One Piece Punch Battle (Japan)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND )
+
+/* SuperXaviX (XaviX 2002 type CPU) hardware titles (3rd XaviX generation?)
+
+ these use the SSD 2002 NEC 85054-611 type CPU
+ differences include support for 16-bit ROMs, various bitmap modes, interlace screen modes etc.
+ possibly higher horizontal resolution for bitmap layers with others scaled to fit?
+
+*/
/* The 'XaviXPORT' isn't a real console, more of a TV adapter, all the actual hardware (CPU including video hw, sound hw) is in the cartridges and controllers
and can vary between games, see notes at top of driver.
+
+ The 'Domyos Interactive System (DiS)' released in France by Decathlon appears to be identical to XaviXPORT (but for PAL regions, and with an entirely different software range)
*/
+ROM_START( tmy_thom )
+ ROM_REGION( 0x800000, "bios", ROMREGION_ERASE00 )
+ ROM_LOAD( "thomastank.bin", 0x000000, 0x800000, CRC(a52a23be) SHA1(e5b3500239d9e56eb5405f7585982959e5a162da) )
+ROM_END
+
+// XaviXPORT
ROM_START( xavtenni )
ROM_REGION( 0x800000, "bios", ROMREGION_ERASE00 )
ROM_LOAD( "xavixtennis.bin", 0x000000, 0x800000, CRC(23a1d918) SHA1(2241c59e8ea8328013e55952ebf9060ea0a4675b) )
ROM_END
-CONS( 2004, xavtenni, 0, 0, xavix2000_i2c_24c04, xavix, xavix_i2c_state, init_xavix, "SSD Company LTD", "XaviX Tennis (XaviXPORT)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND )
+ROM_START( xavbaseb )
+ ROM_REGION( 0x800000, "bios", ROMREGION_ERASE00 )
+ ROM_LOAD( "xpbaseball.bin", 0x000000, 0x800000, CRC(e9ed692d) SHA1(537e390e972156dc7da66ee127ae4c8052038ee5) )
+ROM_END
+
+ROM_START( xavbowl )
+ ROM_REGION( 0x800000, "bios", ROMREGION_ERASE00 )
+ ROM_LOAD( "xpbowling.bin", 0x000000, 0x800000, CRC(2873460b) SHA1(ea8e2392f5a12961a23eb66dca8e07dec81ce8c8) )
+ROM_END
+
+ROM_START( xavbassf )
+ ROM_REGION( 0x800000, "bios", ROMREGION_ERASE00 )
+ ROM_LOAD( "xpbassfishing.bin", 0x000000, 0x800000, CRC(09ab2f29) SHA1(616254176315d0947002e9ae5a6371a3ffa2e8eb) )
+
+ // code for the nRF24E1s, stored in SEEPROMs. One in the cartridge, one in the rod/reel
+ ROM_REGION( 0x1001, "reel_io", ROMREGION_ERASE00 )
+ ROM_LOAD( "xpbassfishingnrf24e1reel.bin", 0x0000, 0x1001, CRC(cfbb19ae) SHA1(32464e4e4be33fdbc7768311f93ce437a316c616) )
+
+ ROM_REGION( 0x800000, "base_io", ROMREGION_ERASE00 )
+ ROM_LOAD( "xpbassfishingnrf24e1cart.bin", 0x0000, 0x1001, CRC(62f6303e) SHA1(126b2663e252fb80948f53153e4046e63dd8be32) )
+ROM_END
+
+ROM_START( xavbox )
+ ROM_REGION( 0x800000, "bios", ROMREGION_ERASE00 )
+ ROM_LOAD( "xpboxing.bin", 0x000000, 0x800000, CRC(b61e7717) SHA1(162b9c53ac8c9d7b6972db44f7bc1cb0a7837b70) )
+ROM_END
+
+
+ROM_START( xavjmat )
+ ROM_REGION( 0x1000000, "bios", ROMREGION_ERASE00 )
+ ROM_LOAD( "xpjmat.bin", 0x000000, 0x1000000, CRC(71a51eef) SHA1(41fd2c3013d1c86756046ec9174e94400f8fa06d) )
+ROM_END
+
+// currently copies the wrong code into RAM to execute (due to extended ROM size, and possible banking)
+// [:] ':maincpu' (00E074): rom_dmatrg_w (do DMA?) 01
+// [:] (possible DMA op SRC 00ebe2d3 DST 358a LEN 0398)
+// needs to come from 006be2d3 (so still from lower 8MB, not upper 8MB)
+
+ROM_START( xavmusic )
+ ROM_REGION( 0x1000000, "bios", ROMREGION_ERASE00 )
+ ROM_LOAD( "xpmusicandcircuit.bin", 0x000000, 0x1000000, CRC(e06129d2) SHA1(d074d0dd85ce870f435da3c066a7f52b50999665) )
+ROM_END
+
+
+// Domyos DiS (XaviX 2002 based titles)
+ROM_START( domfitex )
+ ROM_REGION( 0x1000000, "bios", ROMREGION_ERASE00 )
+ ROM_LOAD( "xpfitnessexercise.bin", 0x000000, 0x1000000, CRC(f1089229) SHA1(803df8ba0a05cb004a4238c6c71ea1ffa4428990) )
+ROM_END
+
+ROM_START( domfitch )
+ ROM_REGION( 0x1000000, "bios", ROMREGION_ERASE00 )
+ ROM_LOAD( "xpfitnesschallenge.bin", 0x000000, 0x1000000, CRC(e0a4093d) SHA1(2692ac03f8be4f86a4777ad0c365cbab7b469e3b) )
+ROM_END
+
+ROM_START( domdance )
+ ROM_REGION( 0x1000000, "bios", ROMREGION_ERASE00 )
+ ROM_LOAD( "xpfitnessdance.bin", 0x000000, 0x1000000, CRC(3170dd41) SHA1(9c9b4f1d8e7c5097271bb8712463ad93c8d55d97) )
+ROM_END
+
+// TODO: does it have an SEEPROM? why does it hang? full title?
+CONS( 2005, tmy_thom, 0, 0, xavix2002_i2c_24c04, xavix_i2c, xavix_i2c_state, init_xavix, "Tomy / SSD Company LTD", "Thomas and Friends (Tomy)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND )
+
+CONS( 2004, xavtenni, 0, 0, xavix2002_i2c_24c04, xavix_i2c, xavix_i2c_state, init_xavix, "SSD Company LTD", "XaviX Tennis (XaviXPORT)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND )
+CONS( 2004, xavbaseb, 0, 0, xavix2002_i2c_24c04, xavix_i2c, xavix_i2c_state, init_xavix, "SSD Company LTD", "XaviX Baseball (XaviXPORT)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND )
+CONS( 2004, xavbowl, 0, 0, xavix2002_i2c_24c04, xavix_bowl, xavix_i2c_bowl_state, init_xavix, "SSD Company LTD", "XaviX Bowling (XaviXPORT)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND ) // has IR 'Camera'
+CONS( 2004, xavbox, 0, 0, xavix2002_i2c_jmat, xavix, xavix_i2c_jmat_state, init_xavix, "SSD Company LTD", "XaviX Boxing (XaviXPORT)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND ) // has IR 'Camera'
+// Bass Fishing PCB is just like Tennis except with an RF daughterboard.
+CONS( 2004, xavbassf, 0, 0, xavix2002_i2c_24c04, xavix_i2c, xavix_i2c_state, init_xavix, "SSD Company LTD", "XaviX Bass Fishing (XaviXPORT)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND )
+
+// TODO: check SEEPROM type and hookup, banking!
+CONS( 2005, xavjmat, 0, 0, xavix2002_i2c_jmat, xavix, xavix_i2c_jmat_state, init_xavix, "SSD Company LTD", "Jackie Chan J-Mat Fitness (XaviXPORT)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND )
+CONS( 2007, xavmusic, 0, 0, xavix2002_i2c_jmat, xavix, xavix_i2c_jmat_state, init_xavix, "SSD Company LTD", "XaviX Music & Circuit (XaviXPORT)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND )
+
+// https://arnaudmeyer.wordpress.com/domyos-interactive-system/
+// Domyos Fitness Adventure
+// Domyos Fitness Challenge
+// Domyos Fitness Exercises
+// Domyos Fit Race
+// Domyos Soft Fitness
+// Domyos Fitness Dance
+// Domyos Fitness Play
+// Domyos Fitness Training
+
+// Domyos Bike Concept (not listed on site above)
+
+// Has SEEPROM and an RTC. Exercise has some leftover PC buffer stuff. (TODO, check SEEPROM type, RTC type, banking) (both Exercises and Challenge are identical PCBs)
+CONS( 2008, domfitex, 0, 0, xavix2002_i2c_jmat, xavixp, xavix_i2c_jmat_state, init_xavix, "Decathlon / SSD Company LTD", "Domyos Fitness Exercises (Domyos Interactive System)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND )
+CONS( 2008, domfitch, 0, 0, xavix2002_i2c_jmat, xavixp, xavix_i2c_jmat_state, init_xavix, "Decathlon / SSD Company LTD", "Domyos Fitness Challenge (Domyos Interactive System)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND )
+CONS( 2007, domdance, 0, 0, xavix2002_i2c_jmat, xavixp, xavix_i2c_jmat_state, init_xavix, "Decathlon / SSD Company LTD", "Domyos Fitness Dance (Domyos Interactive System)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND )
+
+// some DIS games run on XaviX 2 instead, see xavix2.cpp for Domyos Fitness Adventure and Domyos Bike Concept
diff --git a/src/mame/drivers/xavix2.cpp b/src/mame/drivers/xavix2.cpp
new file mode 100644
index 00000000000..635be1be875
--- /dev/null
+++ b/src/mame/drivers/xavix2.cpp
@@ -0,0 +1,161 @@
+// license:BSD-3-Clause
+// copyright-holders:David Haywood
+/******************************************************************************
+
+ XaviX 2
+
+ unknown architecture, does not appear to be 6502 derived like XaviX / SuperXaviX
+
+ die is marked "SSD 2002-2004 NEC 800208-51"
+
+*******************************************************************************/
+
+#include "emu.h"
+
+#include "screen.h"
+#include "emupal.h"
+#include "softlist.h"
+#include "speaker.h"
+
+class xavix2_state : public driver_device
+{
+public:
+ xavix2_state(const machine_config &mconfig, device_type type, const char *tag)
+ : driver_device(mconfig, type, tag)
+ , m_screen(*this, "screen")
+ , m_palette(*this, "palette")
+ , m_gfxdecode(*this, "gfxdecode")
+ { }
+
+ void xavix2(machine_config &config);
+
+private:
+ virtual void machine_start() override;
+ virtual void machine_reset() override;
+
+ uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
+
+ required_device<screen_device> m_screen;
+ required_device<palette_device> m_palette;
+ required_device<gfxdecode_device> m_gfxdecode;
+};
+
+uint32_t xavix2_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
+{
+ return 0;
+}
+
+void xavix2_state::machine_start()
+{
+}
+
+void xavix2_state::machine_reset()
+{
+}
+
+static INPUT_PORTS_START( xavix2 )
+INPUT_PORTS_END
+
+static const gfx_layout charlayout =
+{
+ 8,8,
+ RGN_FRAC(1,1),
+ 4,
+ { STEP4(0,1) },
+ { 1*4,0*4,3*4,2*4,5*4,4*4,7*4,6*4 },
+ { STEP8(0,4*8) },
+ 8*8*4
+};
+
+static const gfx_layout char16layout =
+{
+ 16,16,
+ RGN_FRAC(1,1),
+ 4,
+ { STEP4(0,1) },
+ { 1*4,0*4,3*4,2*4,5*4,4*4,7*4,6*4, 9*4,8*4,11*4,10*4,13*4,12*4,15*4,14*4 },
+ { STEP16(0,4*16) },
+ 16*16*4
+};
+
+static const gfx_layout charlayout8bpp =
+{
+ 8,8,
+ RGN_FRAC(1,1),
+ 8,
+ { STEP8(0,1) },
+ { STEP8(0,8) },
+ { STEP8(0,8*8) },
+ 8*8*8
+};
+
+static const gfx_layout char16layout8bpp =
+{
+ 16,16,
+ RGN_FRAC(1,1),
+ 8,
+ { STEP8(0,1) },
+ { STEP16(0,8) },
+ { STEP16(0,16*8) },
+ 16*16*8
+};
+
+static GFXDECODE_START( gfx_xavix )
+ GFXDECODE_ENTRY( "maincpu", 0, charlayout, 0, 16 )
+ GFXDECODE_ENTRY( "maincpu", 0, char16layout, 0, 16 )
+ GFXDECODE_ENTRY( "maincpu", 0, charlayout8bpp, 0, 1 )
+ GFXDECODE_ENTRY( "maincpu", 0, char16layout8bpp, 0, 1 )
+GFXDECODE_END
+
+
+void xavix2_state::xavix2(machine_config &config)
+{
+ // unknown CPU 'SSD 2002-2004 NEC 800208-51'
+
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_refresh_hz(60);
+ m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(2500));
+ m_screen->set_screen_update(FUNC(xavix2_state::screen_update));
+ m_screen->set_size(32*8, 32*8);
+ m_screen->set_visarea(0*8, 32*8-1, 2*8, 30*8-1);
+ m_screen->set_palette(m_palette);
+
+ GFXDECODE(config, m_gfxdecode, m_palette, gfx_xavix);
+
+ PALETTE(config, m_palette).set_format(palette_device::xRGB_555, 256);
+
+ /* sound hardware */
+ SPEAKER(config, "lspeaker").front_left();
+ SPEAKER(config, "rspeaker").front_right();
+
+ // unknown sound hardware
+}
+
+
+ROM_START( ltv_naru )
+ ROM_REGION( 0x800000, "maincpu", ROMREGION_ERASE00 )
+ ROM_LOAD( "naruto.bin", 0x000000, 0x800000, CRC(e3465ad2) SHA1(13e3d2de5d5a084635cab158f3639a1ea73265dc) )
+ROM_END
+
+ROM_START( domfitad )
+ ROM_REGION( 0x1000000, "maincpu", ROMREGION_ERASE00 )
+ ROM_LOAD( "xpfitnessadventure.bin", 0x000000, 0x1000000, CRC(a7917081) SHA1(95ae5dc6e64a78ae060cb0e61d8b0af34a93c4ce) )
+ROM_END
+
+ROM_START( dombikec )
+ ROM_REGION( 0x1000000, "maincpu", ROMREGION_ERASE00 )
+ ROM_LOAD( "xpbikeconcept.bin", 0x000000, 0x1000000, CRC(3447fce5) SHA1(c7e9e9cd789a17ac886ecf253f67753213cf8d21) )
+ROM_END
+
+
+CONS( 2006, ltv_naru, 0, 0, xavix2, xavix2, xavix2_state, empty_init, "Bandai / SSD Company LTD", "Let's TV Play Naruto", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND )
+
+// These are for the 'Domyos Interactive System' other Domyos Interactive System games can be found in xavix.cpp (the SoC is inside the cartridge, base acts as a 'TV adapter' only)
+
+// Has SEEPROM and an RTC. Adventure has the string DOMYSSDCOLTD a couple of times.
+CONS( 2008, domfitad, 0, 0, xavix2, xavix2, xavix2_state, empty_init, "Decathlon / SSD Company LTD", "Domyos Fitness Adventure (Domyos Interactive System)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND )
+CONS( 2008, dombikec, 0, 0, xavix2, xavix2, xavix2_state, empty_init, "Decathlon / SSD Company LTD", "Domyos Bike Concept (Domyos Interactive System)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND )
+
+
+
+
diff --git a/src/mame/drivers/xbox.cpp b/src/mame/drivers/xbox.cpp
index 14e34df1b0c..d711932aa4f 100644
--- a/src/mame/drivers/xbox.cpp
+++ b/src/mame/drivers/xbox.cpp
@@ -17,7 +17,6 @@
#include "cpu/i386/i386.h"
#include "machine/atapicdr.h"
#include "machine/idehd.h"
-#include "machine/pit8253.h"
#include "debug/debugcmd.h"
#include "debug/debugcon.h"
@@ -34,7 +33,7 @@ class xbox_state : public xbox_base_state
public:
xbox_state(const machine_config &mconfig, device_type type, const char *tag)
: xbox_base_state(mconfig, type, tag)
- , m_ide(*this, "ide")
+ , m_ide(*this, "pci:09.0:ide")
, m_devh(*this, "pci:09.0:ide:0:hdd")
, m_devc(*this, "pci:09.0:ide:1:cdrom")
{ }
@@ -171,27 +170,24 @@ void xbox_ata_devices(device_slot_interface &device)
device.option_add("cdrom", ATAPI_CDROM);
}
-MACHINE_CONFIG_START(xbox_state::xbox)
+void xbox_state::xbox(machine_config &config)
+{
xbox_base(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(xbox_map)
- MCFG_DEVICE_IO_MAP(xbox_map_io)
+ m_maincpu->set_addrmap(AS_PROGRAM, &xbox_state::xbox_map);
+ m_maincpu->set_addrmap(AS_IO, &xbox_state::xbox_map_io);
- MCFG_DEVICE_MODIFY(":pci:09.0:ide:0")
- MCFG_DEVICE_SLOT_INTERFACE(xbox_ata_devices, "hdd", true)
- MCFG_DEVICE_MODIFY(":pci:09.0:ide:1")
- MCFG_DEVICE_SLOT_INTERFACE(xbox_ata_devices, "cdrom", true)
+ subdevice<ide_controller_32_device>(":pci:09.0:ide")->options(xbox_ata_devices, "hdd", "cdrom", true);
OHCI_USB_CONNECTOR(config, ":pci:02.0:port1", usb_xbox, nullptr, false);
OHCI_USB_CONNECTOR(config, ":pci:02.0:port2", usb_xbox, nullptr, false);
OHCI_USB_CONNECTOR(config, ":pci:02.0:port3", usb_xbox, "xbox_controller", false);
OHCI_USB_CONNECTOR(config, ":pci:02.0:port4", usb_xbox, nullptr, false);
-/* sound hardware */
+ /* sound hardware */
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("ohci_gamepad", OHCI_GAME_CONTROLLER, 0)
-MACHINE_CONFIG_END
+ OHCI_GAME_CONTROLLER(config, "ohci_gamepad", 0);
+}
/***************************************************************************
diff --git a/src/mame/drivers/xerox820.cpp b/src/mame/drivers/xerox820.cpp
index 5e8703bacf0..5aef2816bc6 100644
--- a/src/mame/drivers/xerox820.cpp
+++ b/src/mame/drivers/xerox820.cpp
@@ -609,11 +609,11 @@ MACHINE_CONFIG_START(xerox820_state::xerox820)
m_maincpu->set_daisy_config(xerox820_daisy_chain);
/* video hardware */
- MCFG_SCREEN_ADD(SCREEN_TAG, RASTER)
- MCFG_SCREEN_UPDATE_DRIVER(xerox820_state, screen_update)
- MCFG_SCREEN_RAW_PARAMS(10.69425_MHz_XTAL, 700, 0, 560, 260, 0, 240)
+ screen_device &screen(SCREEN(config, SCREEN_TAG, SCREEN_TYPE_RASTER));
+ screen.set_screen_update(FUNC(xerox820_state::screen_update));
+ screen.set_raw(10.69425_MHz_XTAL, 700, 0, 560, 260, 0, 240);
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_xerox820)
+ GFXDECODE(config, "gfxdecode", m_palette, gfx_xerox820);
PALETTE(config, m_palette, palette_device::MONOCHROME);
/* devices */
@@ -630,13 +630,13 @@ MACHINE_CONFIG_START(xerox820_state::xerox820)
m_ctc->intr_callback().set_inputline(m_maincpu, INPUT_LINE_IRQ0);
m_ctc->zc_callback<0>().set(m_ctc, FUNC(z80ctc_device::trg1));
m_ctc->zc_callback<2>().set(m_ctc, FUNC(z80ctc_device::trg3));
- //MCFG_TIMER_DRIVER_ADD_PERIODIC("ctc", xerox820_state, ctc_tick, attotime::from_hz(20_MHz_XTAL / 8))
+ //TIMER(config, "ctc").configure_periodic(FUNC(xerox820_state::ctc_tick), attotime::from_hz(20_MHz_XTAL / 8));
FD1771(config, m_fdc, 20_MHz_XTAL / 20);
m_fdc->intrq_wr_callback().set(FUNC(xerox820_state::fdc_intrq_w));
m_fdc->drq_wr_callback().set(FUNC(xerox820_state::fdc_drq_w));
- MCFG_FLOPPY_DRIVE_ADD(FD1771_TAG":0", xerox820_floppies, "sa400l", floppy_image_device::default_floppy_formats)
- MCFG_FLOPPY_DRIVE_ADD(FD1771_TAG":1", xerox820_floppies, "sa400l", floppy_image_device::default_floppy_formats)
+ FLOPPY_CONNECTOR(config, FD1771_TAG":0", xerox820_floppies, "sa400l", floppy_image_device::default_floppy_formats);
+ FLOPPY_CONNECTOR(config, FD1771_TAG":1", xerox820_floppies, "sa400l", floppy_image_device::default_floppy_formats);
Z80SIO0(config, m_sio, 20_MHz_XTAL / 8);
m_sio->out_txda_callback().set(RS232_A_TAG, FUNC(rs232_port_device::write_txd));
@@ -665,17 +665,17 @@ MACHINE_CONFIG_START(xerox820_state::xerox820)
RAM(config, m_ram).set_default_size("64K");
// software lists
- MCFG_SOFTWARE_LIST_ADD("flop_list", "xerox820")
- MCFG_QUICKLOAD_ADD("quickload", xerox820_state, xerox820, "com,cpm", 3)
+ SOFTWARE_LIST(config, "flop_list").set_original("xerox820");
+ MCFG_QUICKLOAD_ADD("quickload", xerox820_state, xerox820, "com,cpm", attotime::from_seconds(3))
MACHINE_CONFIG_END
-MACHINE_CONFIG_START(bigboard_state::bigboard)
+void bigboard_state::bigboard(machine_config &config)
+{
xerox820(config);
/* sound hardware */
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("beeper", BEEP, 950)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.00) /* bigboard only */
-MACHINE_CONFIG_END
+ BEEP(config, m_beeper, 950).add_route(ALL_OUTPUTS, "mono", 1.00); /* bigboard only */
+}
MACHINE_CONFIG_START(xerox820ii_state::xerox820ii)
/* basic machine hardware */
@@ -685,17 +685,16 @@ MACHINE_CONFIG_START(xerox820ii_state::xerox820ii)
m_maincpu->set_daisy_config(xerox820_daisy_chain);
/* video hardware */
- MCFG_SCREEN_ADD(SCREEN_TAG, RASTER)
- MCFG_SCREEN_UPDATE_DRIVER(xerox820ii_state, screen_update)
- MCFG_SCREEN_RAW_PARAMS(10.69425_MHz_XTAL, 700, 0, 560, 260, 0, 240)
+ screen_device &screen(SCREEN(config, SCREEN_TAG, SCREEN_TYPE_RASTER));
+ screen.set_screen_update(FUNC(xerox820ii_state::screen_update));
+ screen.set_raw(10.69425_MHz_XTAL, 700, 0, 560, 260, 0, 240);
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_xerox820ii)
+ GFXDECODE(config, "gfxdecode", m_palette, gfx_xerox820ii);
PALETTE(config, m_palette, palette_device::MONOCHROME);
/* sound hardware */
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("speaker", SPEAKER_SOUND)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.50)
+ SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.50);
/* devices */
Z80PIO(config, m_kbpio, 16_MHz_XTAL / 4);
@@ -719,13 +718,13 @@ MACHINE_CONFIG_START(xerox820ii_state::xerox820ii)
m_ctc->intr_callback().set_inputline(m_maincpu, INPUT_LINE_IRQ0);
m_ctc->zc_callback<0>().set(m_ctc, FUNC(z80ctc_device::trg1));
m_ctc->zc_callback<2>().set(m_ctc, FUNC(z80ctc_device::trg3));
- //MCFG_TIMER_DRIVER_ADD_PERIODIC("ctc", xerox820_state, ctc_tick, attotime::from_hz(16_MHz_XTAL / 4))
+ //TIMER(config, "ctc").configure_periodic(FUNC(xerox820_state::ctc_tick), attotime::from_hz(16_MHz_XTAL / 4));
FD1797(config, m_fdc, 16_MHz_XTAL / 8);
m_fdc->intrq_wr_callback().set(FUNC(xerox820_state::fdc_intrq_w));
m_fdc->drq_wr_callback().set(FUNC(xerox820_state::fdc_drq_w));
- MCFG_FLOPPY_DRIVE_ADD(FD1797_TAG":0", xerox820_floppies, "sa450", floppy_image_device::default_floppy_formats)
- MCFG_FLOPPY_DRIVE_ADD(FD1797_TAG":1", xerox820_floppies, "sa450", floppy_image_device::default_floppy_formats)
+ FLOPPY_CONNECTOR(config, FD1797_TAG":0", xerox820_floppies, "sa450", floppy_image_device::default_floppy_formats);
+ FLOPPY_CONNECTOR(config, FD1797_TAG":1", xerox820_floppies, "sa450", floppy_image_device::default_floppy_formats);
Z80SIO0(config, m_sio, 16_MHz_XTAL / 4);
m_sio->out_txda_callback().set(RS232_A_TAG, FUNC(rs232_port_device::write_txd));
@@ -758,29 +757,30 @@ MACHINE_CONFIG_START(xerox820ii_state::xerox820ii)
m_sasibus->cd_handler().set("sasi_ctrl_in", FUNC(input_buffer_device::write_bit2)).exor(1);
m_sasibus->req_handler().set("sasi_ctrl_in", FUNC(input_buffer_device::write_bit3)).exor(1);
m_sasibus->io_handler().set("sasi_ctrl_in", FUNC(input_buffer_device::write_bit4)).exor(1);
+ m_sasibus->set_slot_device(1, "harddisk", SA1403D, DEVICE_INPUT_DEFAULTS_NAME(SCSI_ID_0));
- MCFG_SCSIDEV_ADD(SASIBUS_TAG ":" SCSI_PORT_DEVICE1, "harddisk", SA1403D, SCSI_ID_0)
-
- MCFG_SCSI_OUTPUT_LATCH_ADD("sasi_data_out", SASIBUS_TAG)
- MCFG_DEVICE_ADD("sasi_data_in", INPUT_BUFFER, 0)
- MCFG_DEVICE_ADD("sasi_ctrl_in", INPUT_BUFFER, 0)
+ output_latch_device &sasi_data_out(OUTPUT_LATCH(config, "sasi_data_out"));
+ m_sasibus->set_output_latch(sasi_data_out);
+ INPUT_BUFFER(config, "sasi_data_in");
+ INPUT_BUFFER(config, "sasi_ctrl_in");
/* internal ram */
RAM(config, m_ram).set_default_size("64K");
// software lists
- MCFG_SOFTWARE_LIST_ADD("flop_list", "xerox820ii")
- MCFG_QUICKLOAD_ADD("quickload", xerox820_state, xerox820, "com,cpm", 3)
+ SOFTWARE_LIST(config, "flop_list").set_original("xerox820ii");
+ MCFG_QUICKLOAD_ADD("quickload", xerox820_state, xerox820, "com,cpm", attotime::from_seconds(3))
MACHINE_CONFIG_END
-MACHINE_CONFIG_START(xerox820ii_state::xerox168)
+void xerox820ii_state::xerox168(machine_config &config)
+{
xerox820ii(config);
- MCFG_DEVICE_ADD(I8086_TAG, I8086, 4770000)
- MCFG_DEVICE_PROGRAM_MAP(xerox168_mem)
+ i8086_cpu_device &i8086(I8086(config, I8086_TAG, 4770000));
+ i8086.set_addrmap(AS_PROGRAM, &xerox820ii_state::xerox168_mem);
/* internal ram */
m_ram->set_default_size("192K").set_extra_options("320K");
-MACHINE_CONFIG_END
+}
void xerox820_state::mk83(machine_config & config)
{
diff --git a/src/mame/drivers/xmen.cpp b/src/mame/drivers/xmen.cpp
index 53008a8cc55..bfb8954538f 100644
--- a/src/mame/drivers/xmen.cpp
+++ b/src/mame/drivers/xmen.cpp
@@ -298,28 +298,29 @@ TIMER_DEVICE_CALLBACK_MEMBER(xmen_state::xmen_scanline)
}
-MACHINE_CONFIG_START(xmen_state::xmen)
-
+void xmen_state::xmen(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M68000, XTAL(16'000'000)) /* verified on pcb */
- MCFG_DEVICE_PROGRAM_MAP(main_map)
- MCFG_TIMER_DRIVER_ADD_SCANLINE("scantimer", xmen_state, xmen_scanline, "screen", 0, 1)
+ M68000(config, m_maincpu, XTAL(16'000'000)); /* verified on pcb */
+ m_maincpu->set_addrmap(AS_PROGRAM, &xmen_state::main_map);
- MCFG_DEVICE_ADD("audiocpu", Z80, XTAL(16'000'000)/2) /* verified on pcb */
- MCFG_DEVICE_PROGRAM_MAP(sound_map)
+ TIMER(config, "scantimer").configure_scanline(FUNC(xmen_state::xmen_scanline), "screen", 0, 1);
+
+ Z80(config, m_audiocpu, XTAL(16'000'000)/2); /* verified on pcb */
+ m_audiocpu->set_addrmap(AS_PROGRAM, &xmen_state::sound_map);
EEPROM_ER5911_8BIT(config, "eeprom");
WATCHDOG_TIMER(config, "watchdog");
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(59.17) /* verified on pcb */
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(64*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(13*8, (64-13)*8-1, 2*8, 30*8-1 ) /* correct, same issue of TMNT2 */
- MCFG_SCREEN_UPDATE_DRIVER(xmen_state, screen_update_xmen)
- MCFG_SCREEN_PALETTE("palette")
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_refresh_hz(59.17); /* verified on pcb */
+ m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ m_screen->set_size(64*8, 32*8);
+ m_screen->set_visarea(13*8, (64-13)*8-1, 2*8, 30*8-1 ); /* correct, same issue of tmnt2 */
+ m_screen->set_screen_update(FUNC(xmen_state::screen_update_xmen));
+ m_screen->set_palette("palette");
PALETTE(config, "palette").set_format(palette_device::xBGR_555, 2048).enable_shadows();
@@ -342,20 +343,21 @@ MACHINE_CONFIG_START(xmen_state::xmen)
YM2151(config, "ymsnd", XTAL(16'000'000)/4).add_route(0, "lspeaker", 0.20).add_route(1, "rspeaker", 0.20); /* verified on pcb */
- MCFG_DEVICE_ADD("k054539", K054539, XTAL(18'432'000))
- MCFG_SOUND_ROUTE(0, "rspeaker", 1.00)
- MCFG_SOUND_ROUTE(1, "lspeaker", 1.00)
-MACHINE_CONFIG_END
-
-MACHINE_CONFIG_START(xmen_state::xmen6p)
+ K054539(config, m_k054539, XTAL(18'432'000));
+ m_k054539->add_route(0, "rspeaker", 1.00);
+ m_k054539->add_route(1, "lspeaker", 1.00);
+}
+void xmen_state::xmen6p(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M68000, XTAL(16'000'000))
- MCFG_DEVICE_PROGRAM_MAP(_6p_main_map)
- MCFG_TIMER_DRIVER_ADD_SCANLINE("scantimer", xmen_state, xmen_scanline, "screen", 0, 1)
+ M68000(config, m_maincpu, XTAL(16'000'000));
+ m_maincpu->set_addrmap(AS_PROGRAM, &xmen_state::_6p_main_map);
- MCFG_DEVICE_ADD("audiocpu", Z80, XTAL(16'000'000)/2)
- MCFG_DEVICE_PROGRAM_MAP(sound_map)
+ TIMER(config, "scantimer").configure_scanline(FUNC(xmen_state::xmen_scanline), "screen", 0, 1);
+
+ Z80(config, m_audiocpu, XTAL(16'000'000)/2);
+ m_audiocpu->set_addrmap(AS_PROGRAM, &xmen_state::sound_map);
EEPROM_ER5911_8BIT(config, "eeprom");
@@ -365,22 +367,22 @@ MACHINE_CONFIG_START(xmen_state::xmen6p)
PALETTE(config, "palette").set_format(palette_device::xBGR_555, 2048).enable_shadows();
config.set_default_layout(layout_dualhsxs);
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(64*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(12*8, 48*8-1, 2*8, 30*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(xmen_state, screen_update_xmen6p_left)
- MCFG_SCREEN_PALETTE("palette")
-
- MCFG_SCREEN_ADD("screen2", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(64*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(16*8, 52*8-1, 2*8, 30*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(xmen_state, screen_update_xmen6p_right)
- MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE(*this, xmen_state, screen_vblank_xmen6p))
- MCFG_SCREEN_PALETTE("palette")
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_refresh_hz(60);
+ m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ m_screen->set_size(64*8, 32*8);
+ m_screen->set_visarea(12*8, 48*8-1, 2*8, 30*8-1);
+ m_screen->set_screen_update(FUNC(xmen_state::screen_update_xmen6p_left));
+ m_screen->set_palette("palette");
+
+ screen_device &screen2(SCREEN(config, "screen2", SCREEN_TYPE_RASTER));
+ screen2.set_refresh_hz(60);
+ screen2.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen2.set_size(64*8, 32*8);
+ screen2.set_visarea(16*8, 52*8-1, 2*8, 30*8-1);
+ screen2.set_screen_update(FUNC(xmen_state::screen_update_xmen6p_right));
+ screen2.screen_vblank().set(FUNC(xmen_state::screen_vblank_xmen6p));
+ screen2.set_palette("palette");
MCFG_VIDEO_START_OVERRIDE(xmen_state,xmen6p)
@@ -404,10 +406,10 @@ MACHINE_CONFIG_START(xmen_state::xmen6p)
YM2151(config, "ymsnd", XTAL(16'000'000)/4).add_route(0, "lspeaker", 0.20).add_route(1, "rspeaker", 0.20);
- MCFG_DEVICE_ADD("k054539", K054539, XTAL(18'432'000))
- MCFG_SOUND_ROUTE(0, "rspeaker", 1.00)
- MCFG_SOUND_ROUTE(1, "lspeaker", 1.00)
-MACHINE_CONFIG_END
+ K054539(config, m_k054539, XTAL(18'432'000));
+ m_k054539->add_route(0, "rspeaker", 1.00);
+ m_k054539->add_route(1, "lspeaker", 1.00);
+}
/***************************************************************************
@@ -520,6 +522,33 @@ ROM_START( xmenj )
ROM_LOAD( "xmen_jba.nv", 0x0000, 0x0080, CRC(7439cea7) SHA1(d34b8ed0549b0457362159098e5c86b1356e35d0) )
ROM_END
+ROM_START( xmenja )
+ ROM_REGION( 0x100000, "maincpu", 0 )
+ ROM_LOAD16_BYTE( "065-jea04.10d", 0x00000, 0x20000, CRC(655a61d6) SHA1(30a50b0a13205252d1cec6b6a6300e25c2f376c6) ) /* Japan 4 Player version */
+ ROM_LOAD16_BYTE( "065-jea05.10f", 0x00001, 0x20000, CRC(7ea9fc84) SHA1(767f957c0c2f6a2d938d9e37388a17a6bce01dd8) )
+ ROM_LOAD16_BYTE( "065-a02.9d", 0x80000, 0x40000, CRC(b31dc44c) SHA1(4bdac05826b4d6d4fe46686ede5190e2f73eefc5) )
+ ROM_LOAD16_BYTE( "065-a03.9f", 0x80001, 0x40000, CRC(13842fe6) SHA1(b61f094eb94336edb8708d3437ead9b853b2d6e6) )
+
+ ROM_REGION( 0x20000, "audiocpu", 0 )
+ ROM_LOAD( "065-a01.6f", 0x00000, 0x20000, CRC(147d3a4d) SHA1(a14409fe991e803b9e7812303e3a9ebd857d8b01) )
+
+ ROM_REGION( 0x200000, "k052109", 0 ) /* tiles */
+ ROM_LOAD32_WORD( "065-a08.15l", 0x000000, 0x100000, CRC(6b649aca) SHA1(2595f314517738e8614facf578cc951a6c36a180) )
+ ROM_LOAD32_WORD( "065-a07.16l", 0x000002, 0x100000, CRC(c5dc8fc4) SHA1(9887cb002c8b72be7ce933cb397f00cdc5506c8c) )
+
+ ROM_REGION( 0x400000, "gfx2", 0 ) /* graphics (addressable by the main CPU) */
+ ROM_LOAD64_WORD( "065-a09.2h", 0x000000, 0x100000, CRC(ea05d52f) SHA1(7f2c14f907355856fb94e3a67b73aa1919776835) ) /* sprites */
+ ROM_LOAD64_WORD( "065-a10.2l", 0x000002, 0x100000, CRC(96b91802) SHA1(641943557b59b91f0edd49ec8a73cef7d9268b32) )
+ ROM_LOAD64_WORD( "065-a12.1h", 0x000004, 0x100000, CRC(321ed07a) SHA1(5b00ed676daeea974bdce6701667cfe573099dad) )
+ ROM_LOAD64_WORD( "065-a11.1l", 0x000006, 0x100000, CRC(46da948e) SHA1(168ac9178ee5bad5931557fb549e1237971d7839) )
+
+ ROM_REGION( 0x200000, "k054539", 0 ) /* samples for the 054539 */
+ ROM_LOAD( "065-a06.1f", 0x000000, 0x200000, CRC(5adbcee0) SHA1(435feda697193bc51db80eba46be474cbbc1de4b) )
+
+ ROM_REGION( 0x80, "eeprom", 0 )
+ ROM_LOAD( "xmen_jea.nv", 0x0000, 0x0080, CRC(df5b6bc6) SHA1(42fff0793bb1488bcdd69c39a8c5f58cdf39e1ff) )
+ROM_END
+
ROM_START( xmene )
ROM_REGION( 0x100000, "maincpu", 0 )
ROM_LOAD16_BYTE( "065-eba04.10d", 0x00000, 0x20000, CRC(3588c5ec) SHA1(7966e7259038468845dafd19e5f7fc576c2901fa) ) /* Europe 4 Player version */
@@ -821,9 +850,11 @@ ROM_END
GAME( 1992, xmen, 0, xmen, xmen, xmen_state, empty_init, ROT0, "Konami", "X-Men (4 Players ver UBB)", MACHINE_SUPPORTS_SAVE )
GAME( 1992, xmenj, xmen, xmen, xmen, xmen_state, empty_init, ROT0, "Konami", "X-Men (4 Players ver JBA)", MACHINE_SUPPORTS_SAVE )
+GAME( 1992, xmenja, xmen, xmen, xmen, xmen_state, empty_init, ROT0, "Konami", "X-Men (4 Players ver JEA)", MACHINE_SUPPORTS_SAVE )
GAME( 1992, xmene, xmen, xmen, xmen, xmen_state, empty_init, ROT0, "Konami", "X-Men (4 Players ver EBA)", MACHINE_SUPPORTS_SAVE )
GAME( 1992, xmena, xmen, xmen, xmen, xmen_state, empty_init, ROT0, "Konami", "X-Men (4 Players ver AEA)", MACHINE_SUPPORTS_SAVE )
GAME( 1992, xmenaa, xmen, xmen, xmen, xmen_state, empty_init, ROT0, "Konami", "X-Men (4 Players ver ADA)", MACHINE_SUPPORTS_SAVE )
+
GAME( 1992, xmen2pe, xmen, xmen, xmen2p, xmen_state, empty_init, ROT0, "Konami", "X-Men (2 Players ver EAA)", MACHINE_SUPPORTS_SAVE )
GAME( 1992, xmen2pu, xmen, xmen, xmen2p, xmen_state, empty_init, ROT0, "Konami", "X-Men (2 Players ver UAB)", MACHINE_SUPPORTS_SAVE )
GAME( 1992, xmen2pa, xmen, xmen, xmen2p, xmen_state, empty_init, ROT0, "Konami", "X-Men (2 Players ver AAA)", MACHINE_SUPPORTS_SAVE )
diff --git a/src/mame/drivers/xor100.cpp b/src/mame/drivers/xor100.cpp
index 01927f5577b..5392e0a0e2a 100644
--- a/src/mame/drivers/xor100.cpp
+++ b/src/mame/drivers/xor100.cpp
@@ -477,11 +477,12 @@ void xor100_state::post_load()
/* Machine Driver */
-MACHINE_CONFIG_START(xor100_state::xor100)
+void xor100_state::xor100(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD(Z80_TAG, Z80, 8_MHz_XTAL / 2)
- MCFG_DEVICE_PROGRAM_MAP(xor100_mem)
- MCFG_DEVICE_IO_MAP(xor100_io)
+ Z80(config, m_maincpu, 8_MHz_XTAL / 2);
+ m_maincpu->set_addrmap(AS_PROGRAM, &xor100_state::xor100_mem);
+ m_maincpu->set_addrmap(AS_IO, &xor100_state::xor100_io);
/* devices */
I8251(config, m_uart_a, 0/*8_MHz_XTAL / 2,*/);
@@ -521,35 +522,36 @@ MACHINE_CONFIG_START(xor100_state::xor100)
m_ctc->zc_callback<2>().set(FUNC(xor100_state::ctc_z2_w));
FD1795(config, m_fdc, 8_MHz_XTAL / 4);
- MCFG_FLOPPY_DRIVE_ADD(WD1795_TAG":0", xor100_floppies, "8ssdd", floppy_image_device::default_floppy_formats)
- MCFG_FLOPPY_DRIVE_ADD(WD1795_TAG":1", xor100_floppies, "8ssdd", floppy_image_device::default_floppy_formats)
- MCFG_FLOPPY_DRIVE_ADD(WD1795_TAG":2", xor100_floppies, nullptr, floppy_image_device::default_floppy_formats)
- MCFG_FLOPPY_DRIVE_ADD(WD1795_TAG":3", xor100_floppies, nullptr, floppy_image_device::default_floppy_formats)
+ FLOPPY_CONNECTOR(config, WD1795_TAG":0", xor100_floppies, "8ssdd", floppy_image_device::default_floppy_formats);
+ FLOPPY_CONNECTOR(config, WD1795_TAG":1", xor100_floppies, "8ssdd", floppy_image_device::default_floppy_formats);
+ FLOPPY_CONNECTOR(config, WD1795_TAG":2", xor100_floppies, nullptr, floppy_image_device::default_floppy_formats);
+ FLOPPY_CONNECTOR(config, WD1795_TAG":3", xor100_floppies, nullptr, floppy_image_device::default_floppy_formats);
- MCFG_DEVICE_ADD(m_centronics, CENTRONICS, centronics_devices, "printer")
- MCFG_CENTRONICS_ACK_HANDLER(WRITELINE(I8255A_TAG, i8255_device, pc4_w))
- MCFG_CENTRONICS_BUSY_HANDLER(WRITELINE(*this, xor100_state, write_centronics_busy))
- MCFG_CENTRONICS_SELECT_HANDLER(WRITELINE(*this, xor100_state, write_centronics_select))
+ CENTRONICS(config, m_centronics, centronics_devices, "printer");
+ m_centronics->ack_handler().set(I8255A_TAG, FUNC(i8255_device::pc4_w));
+ m_centronics->busy_handler().set(FUNC(xor100_state::write_centronics_busy));
+ m_centronics->select_handler().set(FUNC(xor100_state::write_centronics_select));
- MCFG_CENTRONICS_OUTPUT_LATCH_ADD("cent_data_out", "centronics")
+ output_latch_device &cent_data_out(OUTPUT_LATCH(config, "cent_data_out"));
+ m_centronics->set_output_latch(cent_data_out);
// S-100
- MCFG_DEVICE_ADD(S100_TAG, S100_BUS, 8_MHz_XTAL / 4)
- MCFG_S100_RDY_CALLBACK(INPUTLINE(Z80_TAG, Z80_INPUT_LINE_BOGUSWAIT))
- MCFG_S100_SLOT_ADD(S100_TAG ":1", xor100_s100_cards, nullptr)
- MCFG_S100_SLOT_ADD(S100_TAG ":2", xor100_s100_cards, nullptr)
- MCFG_S100_SLOT_ADD(S100_TAG ":3", xor100_s100_cards, nullptr)
- MCFG_S100_SLOT_ADD(S100_TAG ":4", xor100_s100_cards, nullptr)
- MCFG_S100_SLOT_ADD(S100_TAG ":5", xor100_s100_cards, nullptr)
- MCFG_S100_SLOT_ADD(S100_TAG ":6", xor100_s100_cards, nullptr)
- MCFG_S100_SLOT_ADD(S100_TAG ":7", xor100_s100_cards, nullptr)
- MCFG_S100_SLOT_ADD(S100_TAG ":8", xor100_s100_cards, nullptr)
- MCFG_S100_SLOT_ADD(S100_TAG ":9", xor100_s100_cards, nullptr)
- MCFG_S100_SLOT_ADD(S100_TAG ":10", xor100_s100_cards, nullptr)
+ S100_BUS(config, m_s100, 8_MHz_XTAL / 4);
+ m_s100->rdy().set_inputline(m_maincpu, Z80_INPUT_LINE_BOGUSWAIT);
+ S100_SLOT(config, S100_TAG ":1", xor100_s100_cards, nullptr);
+ S100_SLOT(config, S100_TAG ":2", xor100_s100_cards, nullptr);
+ S100_SLOT(config, S100_TAG ":3", xor100_s100_cards, nullptr);
+ S100_SLOT(config, S100_TAG ":4", xor100_s100_cards, nullptr);
+ S100_SLOT(config, S100_TAG ":5", xor100_s100_cards, nullptr);
+ S100_SLOT(config, S100_TAG ":6", xor100_s100_cards, nullptr);
+ S100_SLOT(config, S100_TAG ":7", xor100_s100_cards, nullptr);
+ S100_SLOT(config, S100_TAG ":8", xor100_s100_cards, nullptr);
+ S100_SLOT(config, S100_TAG ":9", xor100_s100_cards, nullptr);
+ S100_SLOT(config, S100_TAG ":10", xor100_s100_cards, nullptr);
/* internal ram */
RAM(config, RAM_TAG).set_default_size("64K").set_extra_options("128K,192K,256K,320K,384K,448K,512K");
-MACHINE_CONFIG_END
+}
/* ROMs */
diff --git a/src/mame/drivers/xtheball.cpp b/src/mame/drivers/xtheball.cpp
index 736da7a8b7d..b71c5971e79 100644
--- a/src/mame/drivers/xtheball.cpp
+++ b/src/mame/drivers/xtheball.cpp
@@ -208,7 +208,6 @@ void xtheball_state::main_map(address_map &map)
map(0x03040180, 0x0304018f).r(FUNC(xtheball_state::analogy_watchdog_r)).nopw();
map(0x03060000, 0x0306000f).w("dac", FUNC(dac_byte_interface::data_w)).umask16(0xff00);
map(0x04000000, 0x057fffff).rom().region("user2", 0);
- map(0xc0000000, 0xc00001ff).rw(m_maincpu, FUNC(tms34010_device::io_register_r), FUNC(tms34010_device::io_register_w));
map(0xfff80000, 0xffffffff).rom().region("user1", 0);
}
@@ -292,8 +291,8 @@ INPUT_PORTS_END
*
*************************************/
-MACHINE_CONFIG_START(xtheball_state::xtheball)
-
+void xtheball_state::xtheball(machine_config &config)
+{
TMS34010(config, m_maincpu, 40000000);
m_maincpu->set_addrmap(AS_PROGRAM, &xtheball_state::main_map);
m_maincpu->set_halt_on_reset(false);
@@ -318,24 +317,25 @@ MACHINE_CONFIG_START(xtheball_state::xtheball)
latch3.q_out_cb<3>().set(FUNC(xtheball_state::foreground_mode_w));
// Q3 = video foreground control?
- MCFG_TICKET_DISPENSER_ADD("ticket", attotime::from_msec(100), TICKET_MOTOR_ACTIVE_HIGH, TICKET_STATUS_ACTIVE_HIGH)
+ TICKET_DISPENSER(config, m_ticket, attotime::from_msec(100), TICKET_MOTOR_ACTIVE_HIGH, TICKET_STATUS_ACTIVE_HIGH);
WATCHDOG_TIMER(config, m_watchdog);
/* video hardware */
- MCFG_TLC34076_ADD("tlc34076", TLC34076_6_BIT)
+ TLC34076(config, m_tlc34076, tlc34076_device::TLC34076_6_BIT);
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_RAW_PARAMS(10000000, 640, 114, 626, 257, 24, 248)
- MCFG_SCREEN_UPDATE_DEVICE("maincpu", tms34010_device, tms340x0_rgb32)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_raw(10000000, 640, 114, 626, 257, 24, 248);
+ screen.set_screen_update("maincpu", FUNC(tms34010_device::tms340x0_rgb32));
/* sound hardware */
SPEAKER(config, "speaker").front_center();
- MCFG_DEVICE_ADD("dac", ZN428E, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 0.5)
- MCFG_DEVICE_ADD("vref", VOLTAGE_REGULATOR, 0) MCFG_VOLTAGE_REGULATOR_OUTPUT(5.0)
- MCFG_SOUND_ROUTE(0, "dac", 1.0, DAC_VREF_POS_INPUT) MCFG_SOUND_ROUTE(0, "dac", -1.0, DAC_VREF_NEG_INPUT)
-MACHINE_CONFIG_END
+ ZN428E(config, "dac", 0).add_route(ALL_OUTPUTS, "speaker", 0.5);
+ voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref"));
+ vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT);
+ vref.add_route(0, "dac", -1.0, DAC_VREF_NEG_INPUT);
+}
diff --git a/src/mame/drivers/xtom3d.cpp b/src/mame/drivers/xtom3d.cpp
index 3a7253bdfdd..34137b1c654 100644
--- a/src/mame/drivers/xtom3d.cpp
+++ b/src/mame/drivers/xtom3d.cpp
@@ -408,10 +408,10 @@ void xtom3d_state::machine_reset()
}
MACHINE_CONFIG_START(xtom3d_state::xtom3d)
- MCFG_DEVICE_ADD("maincpu", PENTIUM2, 450000000/16) // actually Pentium II 450
- MCFG_DEVICE_PROGRAM_MAP(xtom3d_map)
- MCFG_DEVICE_IO_MAP(xtom3d_io)
- MCFG_DEVICE_IRQ_ACKNOWLEDGE_DEVICE("pic8259_1", pic8259_device, inta_cb)
+ PENTIUM2(config, m_maincpu, 450000000/16); // actually Pentium II 450
+ m_maincpu->set_addrmap(AS_PROGRAM, &xtom3d_state::xtom3d_map);
+ m_maincpu->set_addrmap(AS_IO, &xtom3d_state::xtom3d_io);
+ m_maincpu->set_irq_acknowledge_callback("pic8259_1", FUNC(pic8259_device::inta_cb));
pcat_common(config);
diff --git a/src/mame/drivers/xxmissio.cpp b/src/mame/drivers/xxmissio.cpp
index c28818b9322..f6333035a5f 100644
--- a/src/mame/drivers/xxmissio.cpp
+++ b/src/mame/drivers/xxmissio.cpp
@@ -265,27 +265,27 @@ GFXDECODE_END
/****************************************************************************/
-MACHINE_CONFIG_START(xxmissio_state::xxmissio)
-
+void xxmissio_state::xxmissio(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80,12000000/4) /* 3.0MHz */
- MCFG_DEVICE_PROGRAM_MAP(map1)
+ Z80(config, m_maincpu, 12000000/4); /* 3.0MHz */
+ m_maincpu->set_addrmap(AS_PROGRAM, &xxmissio_state::map1);
- MCFG_DEVICE_ADD("sub", Z80,12000000/4) /* 3.0MHz */
- MCFG_DEVICE_PROGRAM_MAP(map2)
- MCFG_DEVICE_PERIODIC_INT_DRIVER(xxmissio_state, interrupt_s, 2*60)
+ Z80(config, m_subcpu, 12000000/4); /* 3.0MHz */
+ m_subcpu->set_addrmap(AS_PROGRAM, &xxmissio_state::map2);
+ m_subcpu->set_periodic_int(FUNC(xxmissio_state::interrupt_s), attotime::from_hz(2*60));
- MCFG_QUANTUM_TIME(attotime::from_hz(6000))
+ config.m_minimum_quantum = attotime::from_hz(6000);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */)
- MCFG_SCREEN_SIZE(64*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 64*8-1, 4*8, 28*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(xxmissio_state, screen_update)
- MCFG_SCREEN_PALETTE(m_palette)
- MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE(*this, xxmissio_state, interrupt_m))
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500) /* not accurate */);
+ screen.set_size(64*8, 32*8);
+ screen.set_visarea(0*8, 64*8-1, 4*8, 28*8-1);
+ screen.set_screen_update(FUNC(xxmissio_state::screen_update));
+ screen.set_palette(m_palette);
+ screen.screen_vblank().set(FUNC(xxmissio_state::interrupt_m));
GFXDECODE(config, m_gfxdecode, m_palette, gfx_xxmissio);
PALETTE(config, m_palette).set_format(1, &xxmissio_state::BBGGRRII, 768);
@@ -308,7 +308,7 @@ MACHINE_CONFIG_START(xxmissio_state::xxmissio)
ym2.add_route(1, "mono", 0.15);
ym2.add_route(2, "mono", 0.15);
ym2.add_route(3, "mono", 0.40);
-MACHINE_CONFIG_END
+}
/****************************************************************************/
diff --git a/src/mame/drivers/xybots.cpp b/src/mame/drivers/xybots.cpp
index 51dbc9cecff..96dc31fb701 100644
--- a/src/mame/drivers/xybots.cpp
+++ b/src/mame/drivers/xybots.cpp
@@ -175,11 +175,11 @@ GFXDECODE_END
*
*************************************/
-MACHINE_CONFIG_START(xybots_state::xybots)
-
+void xybots_state::xybots(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M68000, ATARI_CLOCK_14MHz/2)
- MCFG_DEVICE_PROGRAM_MAP(main_map)
+ M68000(config, m_maincpu, ATARI_CLOCK_14MHz/2);
+ m_maincpu->set_addrmap(AS_PROGRAM, &xybots_state::main_map);
SLAPSTIC(config, "slapstic", 107, true);
@@ -191,20 +191,20 @@ MACHINE_CONFIG_START(xybots_state::xybots)
GFXDECODE(config, "gfxdecode", "palette", gfx_xybots);
PALETTE(config, "palette").set_format(palette_device::IRGB_4444, 1024);
- MCFG_TILEMAP_ADD_STANDARD("playfield", "gfxdecode", 2, xybots_state, get_playfield_tile_info, 8,8, SCAN_ROWS, 64,32)
- MCFG_TILEMAP_ADD_STANDARD_TRANSPEN("alpha", "gfxdecode", 2, xybots_state, get_alpha_tile_info, 8,8, SCAN_ROWS, 64,32, 0)
+ TILEMAP(config, m_playfield_tilemap, "gfxdecode", 2, 8, 8, TILEMAP_SCAN_ROWS, 64, 32).set_info_callback(FUNC(xybots_state::get_playfield_tile_info));
+ TILEMAP(config, m_alpha_tilemap, "gfxdecode", 2, 8, 8, TILEMAP_SCAN_ROWS, 64, 32, 0).set_info_callback(FUNC(xybots_state::get_alpha_tile_info));
ATARI_MOTION_OBJECTS(config, m_mob, 0, m_screen, xybots_state::s_mob_config);
m_mob->set_gfxdecode(m_gfxdecode);
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_VIDEO_ATTRIBUTES(VIDEO_UPDATE_BEFORE_VBLANK)
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_video_attributes(VIDEO_UPDATE_BEFORE_VBLANK);
/* note: these parameters are from published specs, not derived */
/* the board uses a SYNGEN chip to generate video signals */
- MCFG_SCREEN_RAW_PARAMS(ATARI_CLOCK_14MHz/2, 456, 0, 336, 262, 0, 240)
- MCFG_SCREEN_UPDATE_DRIVER(xybots_state, screen_update_xybots)
- MCFG_SCREEN_PALETTE("palette")
- MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE(*this, xybots_state, video_int_write_line))
+ m_screen->set_raw(ATARI_CLOCK_14MHz/2, 456, 0, 336, 262, 0, 240);
+ m_screen->set_screen_update(FUNC(xybots_state::screen_update_xybots));
+ m_screen->set_palette("palette");
+ m_screen->screen_vblank().set(FUNC(xybots_state::video_int_write_line));
/* sound hardware */
SPEAKER(config, "lspeaker").front_left();
@@ -217,7 +217,7 @@ MACHINE_CONFIG_START(xybots_state::xybots)
m_jsa->add_route(1, "lspeaker", 1.0);
config.device_remove("jsa:pokey");
config.device_remove("jsa:tms");
-MACHINE_CONFIG_END
+}
diff --git a/src/mame/drivers/xyonix.cpp b/src/mame/drivers/xyonix.cpp
index e7d5beac560..01d513f4e3c 100644
--- a/src/mame/drivers/xyonix.cpp
+++ b/src/mame/drivers/xyonix.cpp
@@ -173,8 +173,8 @@ void xyonix_state::main_map(address_map &map)
void xyonix_state::port_map(address_map &map)
{
map.global_mask(0xff);
- map(0x20, 0x20).nopr().w("sn1", FUNC(sn76496_device::command_w)); /* SN76496 ready signal */
- map(0x21, 0x21).nopr().w("sn2", FUNC(sn76496_device::command_w));
+ map(0x20, 0x20).nopr().w("sn1", FUNC(sn76496_device::write)); /* SN76496 ready signal */
+ map(0x21, 0x21).nopr().w("sn2", FUNC(sn76496_device::write));
map(0x40, 0x40).w(FUNC(xyonix_state::nmiack_w));
map(0x50, 0x50).w(FUNC(xyonix_state::irqack_w));
map(0x60, 0x61).nopw(); /* mc6845 */
@@ -246,23 +246,23 @@ GFXDECODE_END
/* MACHINE driver *************************************************************/
-MACHINE_CONFIG_START(xyonix_state::xyonix)
-
+void xyonix_state::xyonix(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80,16000000 / 4) /* 4 MHz ? */
- MCFG_DEVICE_PROGRAM_MAP(main_map)
- MCFG_DEVICE_IO_MAP(port_map)
- MCFG_DEVICE_PERIODIC_INT_DRIVER(xyonix_state, irq0_line_assert, 4*60) /* ?? controls music tempo */
+ Z80(config, m_maincpu, 16000000 / 4); /* 4 MHz ? */
+ m_maincpu->set_addrmap(AS_PROGRAM, &xyonix_state::main_map);
+ m_maincpu->set_addrmap(AS_IO, &xyonix_state::port_map);
+ m_maincpu->set_periodic_int(FUNC(xyonix_state::irq0_line_assert), attotime::from_hz(4*60)); /* ?? controls music tempo */
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(80*4, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0, 80*4-1, 0, 28*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(xyonix_state, screen_update)
- MCFG_SCREEN_PALETTE("palette")
- MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE(*this, xyonix_state, nmiclk_w))
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(80*4, 32*8);
+ screen.set_visarea(0, 80*4-1, 0, 28*8-1);
+ screen.set_screen_update(FUNC(xyonix_state::screen_update));
+ screen.set_palette("palette");
+ screen.screen_vblank().set(FUNC(xyonix_state::nmiclk_w));
GFXDECODE(config, m_gfxdecode, "palette", gfx_xyonix);
PALETTE(config, "palette", FUNC(xyonix_state::xyonix_palette), 256);
@@ -272,7 +272,7 @@ MACHINE_CONFIG_START(xyonix_state::xyonix)
SN76496(config, "sn1", 16000000/4).add_route(ALL_OUTPUTS, "mono", 1.0);
SN76496(config, "sn2", 16000000/4).add_route(ALL_OUTPUTS, "mono", 1.0);
-MACHINE_CONFIG_END
+}
/* ROM Loading ***************************************************************/
diff --git a/src/mame/drivers/y2.cpp b/src/mame/drivers/y2.cpp
index 4050d8b4684..2f36fa1227b 100644
--- a/src/mame/drivers/y2.cpp
+++ b/src/mame/drivers/y2.cpp
@@ -53,7 +53,8 @@ static INPUT_PORTS_START( system_board_y2 )
INPUT_PORTS_END
-MACHINE_CONFIG_START(system_board_y2_state::system_board_y2)
+void system_board_y2_state::system_board_y2(machine_config &config)
+{
/*
SH4LE(config, m_maincpu, 266666666);
m_maincpu->set_md(0, 1);
@@ -68,18 +69,18 @@ MACHINE_CONFIG_START(system_board_y2_state::system_board_y2)
m_maincpu->set_sh4_clock(CPU_CLOCK);
*/
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(640, 480)
- MCFG_SCREEN_VISIBLE_AREA(0, 640-1, 0, 480-1)
- MCFG_SCREEN_UPDATE_DRIVER(system_board_y2_state, screen_update_system_board_y2)
- MCFG_SCREEN_PALETTE("palette")
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(640, 480);
+ screen.set_visarea(0, 640-1, 0, 480-1);
+ screen.set_screen_update(FUNC(system_board_y2_state::screen_update_system_board_y2));
+ screen.set_palette("palette");
- MCFG_PALETTE_ADD("palette", 0x1000)
+ PALETTE(config, "palette").set_entries(0x1000);
SPEAKER(config, "mono").front_center();
-MACHINE_CONFIG_END
+}
ROM_START( kof2002um ) // The King of Fighters 复仇之路/Fùchóu zhī lù/Road to Revenge
ROM_REGION( 0x8000000, "boot", 0 ) // sound program only? or boot too?
diff --git a/src/mame/drivers/yiear.cpp b/src/mame/drivers/yiear.cpp
index 60d5df7e323..effbeaffaa4 100644
--- a/src/mame/drivers/yiear.cpp
+++ b/src/mame/drivers/yiear.cpp
@@ -278,24 +278,24 @@ void yiear_state::machine_reset()
m_yiear_nmi_enable = 0;
}
-MACHINE_CONFIG_START(yiear_state::yiear)
-
+void yiear_state::yiear(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD(m_maincpu, MC6809E, XTAL(18'432'000)/12) /* verified on pcb */
- MCFG_DEVICE_PROGRAM_MAP(main_map)
- MCFG_DEVICE_PERIODIC_INT_DRIVER(yiear_state, yiear_nmi_interrupt, 480) /* music tempo (correct frequency unknown) */
+ MC6809E(config, m_maincpu, XTAL(18'432'000)/12); /* verified on pcb */
+ m_maincpu->set_addrmap(AS_PROGRAM, &yiear_state::main_map);
+ m_maincpu->set_periodic_int(FUNC(yiear_state::yiear_nmi_interrupt), attotime::from_hz(480)); /* music tempo (correct frequency unknown) */
WATCHDOG_TIMER(config, "watchdog");
/* video hardware */
- MCFG_SCREEN_ADD(m_screen, RASTER)
- MCFG_SCREEN_REFRESH_RATE(60.58) /* verified on pcb */
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(32*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(yiear_state, screen_update_yiear)
- MCFG_SCREEN_PALETTE(m_palette)
- MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE(*this, yiear_state, vblank_irq))
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_refresh_hz(60.58); /* verified on pcb */
+ m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ m_screen->set_size(32*8, 32*8);
+ m_screen->set_visarea(0*8, 32*8-1, 2*8, 30*8-1);
+ m_screen->set_screen_update(FUNC(yiear_state::screen_update_yiear));
+ m_screen->set_palette(m_palette);
+ m_screen->screen_vblank().set(FUNC(yiear_state::vblank_irq));
GFXDECODE(config, m_gfxdecode, m_palette, gfx_yiear);
PALETTE(config, m_palette, FUNC(yiear_state::yiear_palette), 32);
@@ -303,15 +303,14 @@ MACHINE_CONFIG_START(yiear_state::yiear)
/* sound hardware */
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD(m_audio, TRACKFLD_AUDIO, 0, finder_base::DUMMY_TAG, m_vlm)
+ TRACKFLD_AUDIO(config, m_audio, 0, finder_base::DUMMY_TAG, m_vlm);
- MCFG_DEVICE_ADD(m_sn, SN76489A, XTAL(18'432'000)/12) /* verified on pcb */
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
+ SN76489A(config, m_sn, XTAL(18'432'000)/12).add_route(ALL_OUTPUTS, "mono", 1.0); /* verified on pcb */
- MCFG_DEVICE_ADD(m_vlm, VLM5030, XTAL(3'579'545)) /* verified on pcb */
- MCFG_DEVICE_ADDRESS_MAP(0, vlm_map)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
-MACHINE_CONFIG_END
+ VLM5030(config, m_vlm, XTAL(3'579'545)); /* verified on pcb */
+ m_vlm->set_addrmap(0, &yiear_state::vlm_map);
+ m_vlm->add_route(ALL_OUTPUTS, "mono", 1.0);
+}
/***************************************************************************
diff --git a/src/mame/drivers/ymmu100.cpp b/src/mame/drivers/ymmu100.cpp
index a45442ae3a6..86a2de6af84 100644
--- a/src/mame/drivers/ymmu100.cpp
+++ b/src/mame/drivers/ymmu100.cpp
@@ -2,16 +2,19 @@
// copyright-holders:R. Belmont, Olivier Galibert
/*************************************************************************************
- Yamaha MU-100 : 32-voice polyphonic/multitimbral General MIDI/GS/XG tone module
+ Yamaha MU-80 and MU-100 : 32-voice polyphonic/multitimbral General MIDI/GS/XG tone modules
Preliminary driver by R. Belmont and O. Galibert
- CPU: Hitachi H8S/2655 (HD6432655F), strapped for mode 4 (24-bit address, 16-bit data, no internal ROM)
+ MU100 CPU: Hitachi H8S/2655 (HD6432655F), strapped for mode 4 (24-bit address, 16-bit data, no internal ROM)
Sound ASIC: Yamaha XS725A0/SWP30
RAM: 1 MSM51008 (1 meg * 1 bit = 128KBytes)
+ MU80 CPU: Hitachi H8/3002 (HD6413D02F16), strapped for mode 4, with a 12 MHz oscillator
+ Sound ASICs: 2x Yamaha YMM275-F/SWP20 + 2x YMM279-F/SWD wave decoders + HD62908 "MEG" effects processor
+
I/O ports from service manual:
- Port 1:
+ Port 1 (MU100) / Port B (MU80)
0 - LCD data, SW data, LED 1
1 - LCD data, SW data, LED 2
2 - LCD data, SW data, LED 3
@@ -47,11 +50,21 @@
6 - NC
7 - (in) Plug detection for A/D input
- Port A:
+ Port A (MU100):
5 - (in) Off Line Detection
6 - (out) Signal for rotary encoder (REB)
7 - (out) Signal for rotary encoder (REA)
+ Port A (MU80):
+ 0 -
+ 1 - LCD control RS
+ 2 -
+ 3 - (same as sws on MU100) LED,SW Strobe data latch
+ 4 - (same as swd on MU100) SW data read control
+ 5 - LCD control E
+ 6 - LCD control RW
+ 7 -
+
Port F:
0 - (out) (sws) LED,SW Strobe data latch
1 - (out) (swd) SW data read control
@@ -118,9 +131,12 @@
#include "bus/midi/midiinport.h"
#include "bus/midi/midioutport.h"
+#include "cpu/h8/h83002.h"
+#include "cpu/h8/h83003.h"
#include "cpu/h8/h8s2655.h"
#include "video/hd44780.h"
#include "sound/swp30.h"
+#include "sound/meg.h"
#include "debugger.h"
#include "screen.h"
@@ -149,18 +165,53 @@ static INPUT_PORTS_START( mu100 )
PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_UNUSED)
INPUT_PORTS_END
+static INPUT_PORTS_START( vl70 )
+ PORT_START("B0")
+ PORT_BIT(0x83, IP_ACTIVE_LOW, IPT_UNUSED)
+ PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("Play") PORT_CODE(KEYCODE_A)
+ PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("Effect") PORT_CODE(KEYCODE_F)
+ PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("Midi/WX") PORT_CODE(KEYCODE_X)
+ PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("Enter") PORT_CODE(KEYCODE_ENTER)
+ PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("Exit") PORT_CODE(KEYCODE_BACKSPACE)
+
+ PORT_START("B1")
+ PORT_BIT(0x83, IP_ACTIVE_LOW, IPT_UNUSED)
+ PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("Edit") PORT_CODE(KEYCODE_E)
+ PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("Mode") PORT_CODE(KEYCODE_M)
+ PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("Part -") PORT_CODE(KEYCODE_OPENBRACE)
+ PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("Select <") PORT_CODE(KEYCODE_COMMA)
+ PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("Part +") PORT_CODE(KEYCODE_CLOSEBRACE)
+
+ PORT_START("B2")
+ PORT_BIT(0x83, IP_ACTIVE_LOW, IPT_UNUSED)
+ PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("Util") PORT_CODE(KEYCODE_U)
+ PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("Breath") PORT_CODE(KEYCODE_B)
+ PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("Value -") PORT_CODE(KEYCODE_MINUS)
+ PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("Select >") PORT_CODE(KEYCODE_STOP)
+ PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("Value +") PORT_CODE(KEYCODE_EQUALS)
+INPUT_PORTS_END
+
class mu100_state : public driver_device
{
public:
mu100_state(const machine_config &mconfig, device_type type, const char *tag)
: driver_device(mconfig, type, tag)
, m_maincpu(*this, "maincpu")
+ , m_mu80cpu(*this, "mu80cpu")
+ , m_vl70cpu(*this, "vl70cpu")
, m_swp30(*this, "swp30")
+ , m_meg(*this, "meg")
, m_lcd(*this, "lcd")
, m_ioport_p7(*this, "P7")
, m_ioport_p8(*this, "P8")
+ , m_ioport_b0(*this, "B0")
+ , m_ioport_b1(*this, "B1")
+ , m_ioport_b2(*this, "B2")
{ }
+ void vl70(machine_config &config);
+ void mu50(machine_config &config);
+ void mu80(machine_config &config);
void mu100(machine_config &config);
void regs_s1_write_tap(offs_t address, u16 data, u16 mem_mask);
@@ -243,7 +294,7 @@ public:
}
protected:
- virtual u16 adc7_r();
+ virtual u16 adc_type_r();
private:
enum {
@@ -252,20 +303,40 @@ private:
P2_LCD_ENABLE = 0x04
};
- required_device<h8s2655_device> m_maincpu;
- required_device<swp30_device> m_swp30;
- required_device<hd44780_device> m_lcd;
- required_ioport m_ioport_p7;
- required_ioport m_ioport_p8;
+ enum {
+ P6_LCD_RS = 0x04,
+ P6_LCD_RW = 0x02,
+ P6_LCD_ENABLE = 0x01
+ };
+
+ enum {
+ PA_LCD_RS = 0x02,
+ PA_LCD_ENABLE = 0x20,
+ PA_LCD_RW = 0x40
+ };
- u8 cur_p1, cur_p2, cur_p3, cur_p5, cur_p6, cur_pa, cur_pf, cur_pg;
- u8 cur_ic32;
+ optional_device<h8s2655_device> m_maincpu;
+ optional_device<h83002_device> m_mu80cpu;
+ optional_device<h83003_device> m_vl70cpu;
+ optional_device<swp30_device> m_swp30;
+ optional_device<meg_device> m_meg;
+ required_device<hd44780_device> m_lcd;
+ optional_ioport m_ioport_p7;
+ optional_ioport m_ioport_p8;
+ optional_ioport m_ioport_b0;
+ optional_ioport m_ioport_b1;
+ optional_ioport m_ioport_b2;
+
+ u8 cur_p1, cur_p2, cur_p3, cur_p5, cur_p6, cur_pa, cur_pb, cur_pc, cur_pf, cur_pg;
+ u8 cur_ic32, cur_leds;
float contrast;
- u16 adc0_r();
- u16 adc2_r();
- u16 adc4_r();
- u16 adc6_r();
+ u16 adc_zero_r();
+ u16 adc_ar_r();
+ u16 adc_al_r();
+ u16 adc_midisw_r();
+ u16 adc_battery_r();
+ u16 adc_breath_r();
void p1_w(u16 data);
u16 p1_r();
@@ -276,14 +347,40 @@ private:
u16 p6_r();
void pa_w(u16 data);
u16 pa_r();
+ void pb_w(u16 data);
+ u16 pb_r();
+ void p6_w_mu80(u16 data);
+ u16 p6_r_mu80();
+ void pa_w_mu80(u16 data);
+ u16 pa_r_mu80();
+ void pb_w_mu80(u16 data);
+ u16 pb_r_mu80();
+ void p6_w_vl70(u16 data);
+ u16 p6_r_vl70();
+ void pa_w_vl70(u16 data);
+ u16 pa_r_vl70();
+ void pb_w_vl70(u16 data);
+ void pc_w_vl70(u16 data);
+ u16 pc_r_vl70();
void pf_w(u16 data);
void pg_w(u16 data);
+ void p6_w_mu50(u16 data);
+ u16 p6_r_mu50();
+ void pa_w_mu50(u16 data);
+ u16 pa_r_mu50();
+ u16 pb_r_mu50();
+ void pb_w_mu50(u16 data);
float lightlevel(const u8 *src, const u8 *render);
u32 screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
virtual void machine_start() override;
void mu100_iomap(address_map &map);
void mu100_map(address_map &map);
+ void mu80_iomap(address_map &map);
+ void mu80_map(address_map &map);
+ void mu50_iomap(address_map &map);
+ void vl70_iomap(address_map &map);
+ void vl70_map(address_map &map);
void swp30_map(address_map &map);
};
@@ -294,7 +391,7 @@ public:
{ }
private:
- virtual u16 adc7_r() override;
+ virtual u16 adc_type_r() override;
};
void mu100_state::prg_write_tap(offs_t address, u16 data, u16 mem_mask)
@@ -457,7 +554,8 @@ void mu100_state::chan_write_tap(offs_t address, u16 data, u16 mem_mask)
void mu100_state::machine_start()
{
- cur_p1 = cur_p2 = cur_p3 = cur_p5 = cur_p6 = cur_pa = cur_pf = cur_pg = cur_ic32 = 0xff;
+ cur_p1 = cur_p2 = cur_p3 = cur_p5 = cur_p6 = cur_pa = cur_pc = cur_pf = cur_pg = cur_ic32 = 0xff;
+ cur_leds = 0x00;
contrast = 1.0;
}
@@ -495,7 +593,7 @@ u32 mu100_state::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, cons
}
for(int i=0; i<6; i++)
- if(cur_ic32 & (1 << (i == 5 ? 7 : i))) {
+ if(cur_leds & (1 << i)) {
int x = 830 + 40*(i & 1);
int y = 55 + 65*(i >> 1);
for(int yy=-9; yy <= 9; yy++) {
@@ -508,6 +606,20 @@ u32 mu100_state::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, cons
return 0;
}
+void mu100_state::mu80_map(address_map &map)
+{
+ map(0x000000, 0x07ffff).rom().region("mu80cpu", 0);
+ map(0x200000, 0x20ffff).ram(); // 64K work RAM
+ map(0x440000, 0x44001f).m(m_meg, FUNC(meg_device::map));
+}
+
+void mu100_state::vl70_map(address_map &map)
+{
+ map(0x000000, 0x1fffff).rom().region("vl70cpu", 0);
+ map(0x200000, 0x20ffff).ram(); // 64K work RAM
+ map(0x600000, 0x60001f).m(m_meg, FUNC(meg_device::map));
+}
+
void mu100_state::mu100_map(address_map &map)
{
map(0x000000, 0x1fffff).rom().region("maincpu", 0);
@@ -515,38 +627,49 @@ void mu100_state::mu100_map(address_map &map)
map(0x400000, 0x401fff).m(m_swp30, FUNC(swp30_device::map));
}
-u16 mu100_state::adc0_r()
+// Grounded adc input
+u16 mu100_state::adc_zero_r()
+{
+ return 0;
+}
+
+// Analog input right (also sent to the swp)
+u16 mu100_state::adc_ar_r()
{
- // logerror("adc0_r\n");
return 0;
}
-u16 mu100_state::adc2_r()
+// Analog input left (also sent to the swp)
+u16 mu100_state::adc_al_r()
{
- logerror("adc2_r\n");
return 0;
}
// Put the host switch to pure midi
-u16 mu100_state::adc4_r()
+u16 mu100_state::adc_midisw_r()
{
return 0;
}
// Battery level
-u16 mu100_state::adc6_r()
+u16 mu100_state::adc_battery_r()
{
- logerror("adc6_r\n");
- return 0x3ff;
+ return 0x200;
+}
+
+// Breath controller
+u16 mu100_state::adc_breath_r()
+{
+ return 0x000;
}
// model detect. pulled to GND (0) on MU100, to 0.5Vcc on the card version, to Vcc on MU100R
-u16 mu100_state::adc7_r()
+u16 mu100_state::adc_type_r()
{
return 0;
}
-u16 mu100r_state::adc7_r()
+u16 mu100r_state::adc_type_r()
{
return 0x3ff;
}
@@ -633,8 +756,10 @@ u16 mu100_state::pa_r()
void mu100_state::pf_w(u16 data)
{
- if(!(cur_pf & 0x01) && (data & 0x01))
+ if(!(cur_pf & 0x01) && (data & 0x01)) {
cur_ic32 = cur_p1;
+ cur_leds = (cur_p1 & 0x1f) | ((cur_p1 & 0x80) >> 2);
+ }
cur_pf = data;
}
@@ -644,6 +769,234 @@ void mu100_state::pg_w(u16 data)
logerror("pbsel3 %d\n", data & 1);
}
+void mu100_state::pb_w_mu80(u16 data)
+{
+ cur_pb = data;
+}
+
+u16 mu100_state::pb_r_mu80()
+{
+ if((cur_pa & PA_LCD_ENABLE)) {
+ if(cur_pa & PA_LCD_RW)
+ {
+ if(cur_pa & PA_LCD_RS)
+ return m_lcd->data_read();
+ else
+ return m_lcd->control_read();
+ } else
+ {
+ if(!(cur_pa & 0x10)) {
+ u8 val = 0xff;
+ if(!(cur_ic32 & 0x20))
+ val &= m_ioport_p7->read();
+ if(!(cur_ic32 & 0x40))
+ val &= m_ioport_p8->read();
+ return val;
+ }
+
+ return 0x00;
+ }
+ }
+
+ return cur_pb;
+}
+
+void mu100_state::p6_w_mu80(u16 data)
+{
+ cur_p6 = data;
+}
+
+u16 mu100_state::p6_r_mu80()
+{
+ return cur_p6;
+}
+
+void mu100_state::pa_w_mu80(u16 data)
+{
+ data ^= PA_LCD_ENABLE;
+ if(!(cur_pa & PA_LCD_ENABLE) && (data & PA_LCD_ENABLE)) {
+ if(!(cur_pa & PA_LCD_RW)) {
+ if(cur_pa & PA_LCD_RS)
+ m_lcd->data_write(cur_pb);
+ else
+ m_lcd->control_write(cur_pb);
+ }
+ }
+
+ if(!(cur_pa & 0x08) && (data & 0x08))
+ {
+ cur_ic32 = cur_pb;
+ }
+
+ cur_pa = data;
+}
+
+u16 mu100_state::pa_r_mu80()
+{
+ return cur_pa;
+}
+
+void mu100_state::p6_w_vl70(u16 data)
+{
+ if(!(cur_p6 & P6_LCD_ENABLE) && (data & P6_LCD_ENABLE)) {
+ if(!(cur_p6 & P6_LCD_RW)) {
+ if(cur_p6 & P6_LCD_RS)
+ m_lcd->data_write(cur_pa);
+ else
+ m_lcd->control_write(cur_pa);
+ }
+ }
+
+ cur_p6 = data;
+}
+
+void mu100_state::pb_w_vl70(u16 data)
+{
+ cur_leds = bitswap<6>((data >> 2) ^ 0x3f, 5, 3, 1, 4, 2, 0);
+}
+
+void mu100_state::pc_w_vl70(u16 data)
+{
+ cur_pc = data;
+}
+
+u16 mu100_state::pc_r_vl70()
+{
+ u8 r = 0xff;
+ if(!(cur_pc & 0x01))
+ r &= m_ioport_b0->read();
+ if(!(cur_pc & 0x02))
+ r &= m_ioport_b1->read();
+ if(!(cur_pc & 0x80))
+ r &= m_ioport_b2->read();
+ return r;
+}
+
+u16 mu100_state::p6_r_vl70()
+{
+ return cur_p6;
+}
+
+void mu100_state::pa_w_vl70(u16 data)
+{
+ cur_pa = data;
+}
+
+u16 mu100_state::pa_r_vl70()
+{
+ if((cur_p6 & P6_LCD_ENABLE)) {
+ if(cur_p6 & P6_LCD_RW)
+ {
+ if(cur_p6 & P6_LCD_RS)
+ return m_lcd->data_read();
+ else
+ return m_lcd->control_read();
+ } else
+ return 0x00;
+ }
+
+ return cur_pa;
+}
+
+void mu100_state::p6_w_mu50(u16 data)
+{
+ data ^= P6_LCD_ENABLE;
+ if(!(cur_p6 & P6_LCD_ENABLE) && (data & P6_LCD_ENABLE)) {
+ if(!(cur_p6 & P6_LCD_RW)) {
+ if(cur_p6 & P6_LCD_RS)
+ m_lcd->data_write(cur_pa);
+ else
+ m_lcd->control_write(cur_pa);
+ }
+ }
+
+// if(!(cur_pa9 & 0x08) && (data & 0x08))
+// cur_ic32 = cur_pa;
+
+ cur_p6 = data;
+}
+
+u16 mu100_state::p6_r_mu50()
+{
+ return cur_p6;
+}
+
+u16 mu100_state::pb_r_mu50()
+{
+ return cur_pb;
+}
+
+void mu100_state::pb_w_mu50(u16 data)
+{
+ cur_pb = data;
+}
+
+void mu100_state::pa_w_mu50(u16 data)
+{
+ cur_pa = data;
+}
+
+u16 mu100_state::pa_r_mu50()
+{
+ if((cur_p6 & P6_LCD_ENABLE)) {
+ if(cur_p6 & P6_LCD_RW)
+ {
+ if(cur_p6 & P6_LCD_RS)
+ return m_lcd->data_read();
+ else
+ return m_lcd->control_read();
+ } else
+ return 0x00;
+ }
+ return cur_pa;
+}
+
+void mu100_state::mu80_iomap(address_map &map)
+{
+ map(h8_device::PORT_6, h8_device::PORT_6).rw(FUNC(mu100_state::p6_r_mu80), FUNC(mu100_state::p6_w_mu80));
+ map(h8_device::PORT_A, h8_device::PORT_A).rw(FUNC(mu100_state::pa_r_mu80), FUNC(mu100_state::pa_w_mu80));
+ map(h8_device::PORT_B, h8_device::PORT_B).rw(FUNC(mu100_state::pb_r_mu80), FUNC(mu100_state::pb_w_mu80));
+ map(h8_device::ADC_0, h8_device::ADC_0).r(FUNC(mu100_state::adc_ar_r));
+ map(h8_device::ADC_1, h8_device::ADC_1).r(FUNC(mu100_state::adc_zero_r));
+ map(h8_device::ADC_2, h8_device::ADC_2).r(FUNC(mu100_state::adc_al_r));
+ map(h8_device::ADC_3, h8_device::ADC_3).r(FUNC(mu100_state::adc_zero_r));
+ map(h8_device::ADC_4, h8_device::ADC_4).r(FUNC(mu100_state::adc_midisw_r));
+ map(h8_device::ADC_5, h8_device::ADC_6).r(FUNC(mu100_state::adc_zero_r));
+ map(h8_device::ADC_6, h8_device::ADC_6).r(FUNC(mu100_state::adc_battery_r));
+ map(h8_device::ADC_7, h8_device::ADC_7).r(FUNC(mu100_state::adc_zero_r)); // inputmod from the gate array
+}
+
+void mu100_state::mu50_iomap(address_map &map)
+{
+ map(h8_device::PORT_6, h8_device::PORT_6).rw(FUNC(mu100_state::p6_r_mu50), FUNC(mu100_state::p6_w_mu50));
+ map(h8_device::PORT_A, h8_device::PORT_A).rw(FUNC(mu100_state::pa_r_mu50), FUNC(mu100_state::pa_w_mu50));
+ map(h8_device::PORT_B, h8_device::PORT_B).rw(FUNC(mu100_state::pb_r_mu50), FUNC(mu100_state::pb_w_mu50));
+ map(h8_device::ADC_0, h8_device::ADC_0).r(FUNC(mu100_state::adc_ar_r));
+ map(h8_device::ADC_1, h8_device::ADC_1).r(FUNC(mu100_state::adc_zero_r));
+ map(h8_device::ADC_2, h8_device::ADC_2).r(FUNC(mu100_state::adc_al_r));
+ map(h8_device::ADC_3, h8_device::ADC_3).r(FUNC(mu100_state::adc_zero_r));
+ map(h8_device::ADC_4, h8_device::ADC_4).r(FUNC(mu100_state::adc_midisw_r));
+ map(h8_device::ADC_5, h8_device::ADC_6).r(FUNC(mu100_state::adc_zero_r));
+ map(h8_device::ADC_6, h8_device::ADC_6).r(FUNC(mu100_state::adc_battery_r));
+ map(h8_device::ADC_7, h8_device::ADC_7).r(FUNC(mu100_state::adc_zero_r)); // inputmod from the gate array
+}
+
+void mu100_state::vl70_iomap(address_map &map)
+{
+ map(h8_device::PORT_6, h8_device::PORT_6).rw(FUNC(mu100_state::p6_r_vl70), FUNC(mu100_state::p6_w_vl70));
+ map(h8_device::PORT_A, h8_device::PORT_A).rw(FUNC(mu100_state::pa_r_vl70), FUNC(mu100_state::pa_w_vl70));
+ map(h8_device::PORT_B, h8_device::PORT_B).w(FUNC(mu100_state::pb_w_vl70));
+ map(h8_device::PORT_C, h8_device::PORT_C).rw(FUNC(mu100_state::pc_r_vl70), FUNC(mu100_state::pc_w_vl70));
+ map(h8_device::ADC_0, h8_device::ADC_0).r(FUNC(mu100_state::adc_breath_r));
+ map(h8_device::ADC_1, h8_device::ADC_6).r(FUNC(mu100_state::adc_zero_r));
+ map(h8_device::ADC_2, h8_device::ADC_2).r(FUNC(mu100_state::adc_midisw_r));
+ map(h8_device::ADC_3, h8_device::ADC_6).r(FUNC(mu100_state::adc_zero_r));
+ map(h8_device::ADC_4, h8_device::ADC_4).r(FUNC(mu100_state::adc_battery_r));
+ map(h8_device::ADC_5, h8_device::ADC_6).r(FUNC(mu100_state::adc_zero_r));
+ map(h8_device::ADC_6, h8_device::ADC_6).r(FUNC(mu100_state::adc_zero_r));
+ map(h8_device::ADC_7, h8_device::ADC_7).r(FUNC(mu100_state::adc_zero_r));
+}
+
void mu100_state::mu100_iomap(address_map &map)
{
map(h8_device::PORT_1, h8_device::PORT_1).rw(FUNC(mu100_state::p1_r), FUNC(mu100_state::p1_w));
@@ -654,11 +1007,14 @@ void mu100_state::mu100_iomap(address_map &map)
map(h8_device::PORT_A, h8_device::PORT_A).rw(FUNC(mu100_state::pa_r), FUNC(mu100_state::pa_w));
map(h8_device::PORT_F, h8_device::PORT_F).w(FUNC(mu100_state::pf_w));
map(h8_device::PORT_G, h8_device::PORT_G).w(FUNC(mu100_state::pg_w));
- map(h8_device::ADC_0, h8_device::ADC_0).r(FUNC(mu100_state::adc0_r));
- map(h8_device::ADC_2, h8_device::ADC_2).r(FUNC(mu100_state::adc2_r));
- map(h8_device::ADC_4, h8_device::ADC_4).r(FUNC(mu100_state::adc4_r));
- map(h8_device::ADC_6, h8_device::ADC_6).r(FUNC(mu100_state::adc6_r));
- map(h8_device::ADC_7, h8_device::ADC_7).r(FUNC(mu100_state::adc7_r));
+ map(h8_device::ADC_0, h8_device::ADC_0).r(FUNC(mu100_state::adc_ar_r));
+ map(h8_device::ADC_1, h8_device::ADC_1).r(FUNC(mu100_state::adc_zero_r));
+ map(h8_device::ADC_2, h8_device::ADC_2).r(FUNC(mu100_state::adc_al_r));
+ map(h8_device::ADC_1, h8_device::ADC_3).r(FUNC(mu100_state::adc_zero_r));
+ map(h8_device::ADC_4, h8_device::ADC_4).r(FUNC(mu100_state::adc_midisw_r));
+ map(h8_device::ADC_5, h8_device::ADC_5).r(FUNC(mu100_state::adc_zero_r));
+ map(h8_device::ADC_6, h8_device::ADC_6).r(FUNC(mu100_state::adc_battery_r));
+ map(h8_device::ADC_7, h8_device::ADC_7).r(FUNC(mu100_state::adc_type_r));
}
void mu100_state::swp30_map(address_map &map)
@@ -705,6 +1061,120 @@ void mu100_state::mu100(machine_config &config)
m_maincpu->subdevice<h8_sci_device>("sci0")->tx_handler().set(mdout, FUNC(midi_port_device::write_txd));
}
+void mu100_state::mu80(machine_config &config)
+{
+ H83002(config, m_mu80cpu, 12_MHz_XTAL);
+ m_mu80cpu->set_addrmap(AS_PROGRAM, &mu100_state::mu80_map);
+ m_mu80cpu->set_addrmap(AS_IO, &mu100_state::mu80_iomap);
+
+ HD44780(config, m_lcd);
+ m_lcd->set_lcd_size(4, 20);
+
+ auto &screen = SCREEN(config, "screen", SCREEN_TYPE_LCD);
+ screen.set_refresh_hz(50);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate, asynchronous updating anyway */
+ screen.set_screen_update(FUNC(mu100_state::screen_update));
+ screen.set_size(900, 241);
+ screen.set_visarea(0, 899, 0, 240);
+
+ SPEAKER(config, "lspeaker").front_left();
+ SPEAKER(config, "rspeaker").front_right();
+
+ // In truth, dual swp-20
+ SWP30(config, m_swp30);
+ m_swp30->set_addrmap(0, &mu100_state::swp30_map);
+ m_swp30->add_route(0, "lspeaker", 1.0);
+ m_swp30->add_route(1, "rspeaker", 1.0);
+
+ MEG(config, m_meg);
+
+ auto &mdin_a(MIDI_PORT(config, "mdin_a"));
+ midiin_slot(mdin_a);
+ mdin_a.rxd_handler().set("mu80cpu:sci1", FUNC(h8_sci_device::rx_w));
+
+ auto &mdin_b(MIDI_PORT(config, "mdin_b"));
+ midiin_slot(mdin_b);
+ mdin_b.rxd_handler().set("mu80cpu:sci0", FUNC(h8_sci_device::rx_w));
+
+ auto &mdout(MIDI_PORT(config, "mdout"));
+ midiout_slot(mdout);
+ m_mu80cpu->subdevice<h8_sci_device>("sci0")->tx_handler().set(mdout, FUNC(midi_port_device::write_txd));
+}
+
+void mu100_state::mu50(machine_config &config)
+{
+ H83002(config, m_mu80cpu, 16_MHz_XTAL);
+ m_mu80cpu->set_addrmap(AS_PROGRAM, &mu100_state::mu80_map);
+ m_mu80cpu->set_addrmap(AS_IO, &mu100_state::mu50_iomap);
+
+ HD44780(config, m_lcd);
+ m_lcd->set_lcd_size(4, 20);
+
+ auto &screen = SCREEN(config, "screen", SCREEN_TYPE_LCD);
+ screen.set_refresh_hz(50);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate, asynchronous updating anyway */
+ screen.set_screen_update(FUNC(mu100_state::screen_update));
+ screen.set_size(900, 241);
+ screen.set_visarea(0, 899, 0, 240);
+
+ SPEAKER(config, "lspeaker").front_left();
+ SPEAKER(config, "rspeaker").front_right();
+
+ // In truth, dual swp-20
+ SWP30(config, m_swp30);
+ m_swp30->set_addrmap(0, &mu100_state::swp30_map);
+ m_swp30->add_route(0, "lspeaker", 1.0);
+ m_swp30->add_route(1, "rspeaker", 1.0);
+
+ MEG(config, m_meg);
+
+ auto &mdin_a(MIDI_PORT(config, "mdin_a"));
+ midiin_slot(mdin_a);
+ mdin_a.rxd_handler().set("mu80cpu:sci1", FUNC(h8_sci_device::rx_w));
+
+ auto &mdin_b(MIDI_PORT(config, "mdin_b"));
+ midiin_slot(mdin_b);
+ mdin_b.rxd_handler().set("mu80cpu:sci0", FUNC(h8_sci_device::rx_w));
+
+ auto &mdout(MIDI_PORT(config, "mdout"));
+ midiout_slot(mdout);
+ m_mu80cpu->subdevice<h8_sci_device>("sci0")->tx_handler().set(mdout, FUNC(midi_port_device::write_txd));
+}
+
+void mu100_state::vl70(machine_config &config)
+{
+ H83003(config, m_vl70cpu, 10_MHz_XTAL);
+ m_vl70cpu->set_addrmap(AS_PROGRAM, &mu100_state::vl70_map);
+ m_vl70cpu->set_addrmap(AS_IO, &mu100_state::vl70_iomap);
+
+ HD44780(config, m_lcd);
+ m_lcd->set_lcd_size(4, 20);
+
+ auto &screen = SCREEN(config, "screen", SCREEN_TYPE_LCD);
+ screen.set_refresh_hz(50);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate, asynchronous updating anyway */
+ screen.set_screen_update(FUNC(mu100_state::screen_update));
+ screen.set_size(900, 241);
+ screen.set_visarea(0, 899, 0, 240);
+
+ SPEAKER(config, "lspeaker").front_left();
+ SPEAKER(config, "rspeaker").front_right();
+
+ MEG(config, m_meg);
+
+ auto &mdin_a(MIDI_PORT(config, "mdin_a"));
+ midiin_slot(mdin_a);
+ mdin_a.rxd_handler().set("vl70cpu:sci1", FUNC(h8_sci_device::rx_w));
+
+ auto &mdin_b(MIDI_PORT(config, "mdin_b"));
+ midiin_slot(mdin_b);
+ mdin_b.rxd_handler().set("vl70cpu:sci0", FUNC(h8_sci_device::rx_w));
+
+ auto &mdout(MIDI_PORT(config, "mdout"));
+ midiout_slot(mdout);
+ m_vl70cpu->subdevice<h8_sci_device>("sci0")->tx_handler().set(mdout, FUNC(midi_port_device::write_txd));
+}
+
#define ROM_LOAD16_WORD_SWAP_BIOS(bios,name,offset,length,hash) \
ROMX_LOAD(name, offset, length, hash, ROM_GROUPWORD | ROM_REVERSE | ROM_BIOS(bios))
@@ -749,5 +1219,39 @@ ROM_START( mu100r )
ROM_LOAD( "mu100-font.bin", 0x0000, 0x1000, BAD_DUMP CRC(a7d6c1d6) SHA1(9f0398d678bdf607cb34d83ee535f3b7fcc97c41) )
ROM_END
+ROM_START( mu80 )
+ ROM_REGION( 0x80000, "mu80cpu", 0 )
+ ROM_LOAD16_WORD_SWAP( "yamaha_mu80.bin", 0x000000, 0x080000, CRC(c31074c0) SHA1(a11bd4523cd8ff1e1744078c3b4c18112b73c61e) )
+
+ ROM_REGION( 0x1800000, "swp30", ROMREGION_ERASE00 )
+
+ ROM_REGION( 0x1000, "lcd", 0)
+ // Hand made, 3 characters unused
+ ROM_LOAD( "mu100-font.bin", 0x0000, 0x1000, BAD_DUMP CRC(a7d6c1d6) SHA1(9f0398d678bdf607cb34d83ee535f3b7fcc97c41) )
+ROM_END
+
+ROM_START( mu50 )
+ ROM_REGION( 0x80000, "mu80cpu", 0 )
+ ROM_LOAD16_WORD_SWAP( "yamaha_mu50.bin", 0x000000, 0x080000, CRC(507168ad) SHA1(58c41f10d292cac35ef0e8f93029fbc4685df586) )
+
+ ROM_REGION( 0x1800000, "swp30", ROMREGION_ERASE00 )
+
+ ROM_REGION( 0x1000, "lcd", 0)
+ // Hand made, 3 characters unused
+ ROM_LOAD( "mu100-font.bin", 0x0000, 0x1000, BAD_DUMP CRC(a7d6c1d6) SHA1(9f0398d678bdf607cb34d83ee535f3b7fcc97c41) )
+ROM_END
+
+ROM_START( vl70 )
+ ROM_REGION( 0x200000, "vl70cpu", 0 )
+ ROM_LOAD16_WORD_SWAP( "vl70m_v111_27c160.bin", 0x000000, 0x200000, CRC(efdba9f0) SHA1(cfa9fb7d2a991e4752393c9677e4ddcbe10866c7) )
+
+ ROM_REGION( 0x1000, "lcd", 0)
+ // Hand made, 3 characters unused
+ ROM_LOAD( "mu100-font.bin", 0x0000, 0x1000, BAD_DUMP CRC(a7d6c1d6) SHA1(9f0398d678bdf607cb34d83ee535f3b7fcc97c41) )
+ROM_END
+
CONS( 1997, mu100, 0, 0, mu100, mu100, mu100_state, empty_init, "Yamaha", "MU100", MACHINE_NOT_WORKING )
CONS( 1997, mu100r, mu100, 0, mu100, mu100, mu100r_state, empty_init, "Yamaha", "MU100 Rackable version", MACHINE_NOT_WORKING )
+CONS( 1994, mu80, mu100, 0, mu80, mu100, mu100_state, empty_init, "Yamaha", "MU80", MACHINE_NOT_WORKING )
+CONS( 1996, vl70, mu100, 0, vl70, vl70, mu100_state, empty_init, "Yamaha", "VL70-m", MACHINE_NOT_WORKING )
+CONS( 1995, mu50, mu100, 0, mu50, mu100, mu100_state, empty_init, "Yamaha", "MU50", MACHINE_NOT_WORKING )
diff --git a/src/mame/drivers/yunsung8.cpp b/src/mame/drivers/yunsung8.cpp
index a3f5b764f5c..8dff608fb5a 100644
--- a/src/mame/drivers/yunsung8.cpp
+++ b/src/mame/drivers/yunsung8.cpp
@@ -341,26 +341,25 @@ void yunsung8_state::machine_reset()
}
-MACHINE_CONFIG_START(yunsung8_state::yunsung8)
-
+void yunsung8_state::yunsung8(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, XTAL(16'000'000)/2) /* Z80B @ 8MHz? */
- MCFG_DEVICE_PROGRAM_MAP(main_map)
- MCFG_DEVICE_IO_MAP(port_map)
- MCFG_DEVICE_VBLANK_INT_DRIVER("screen", yunsung8_state, irq0_line_assert) /* No nmi routine */
+ Z80(config, m_maincpu, XTAL(16'000'000)/2); /* Z80B @ 8MHz? */
+ m_maincpu->set_addrmap(AS_PROGRAM, &yunsung8_state::main_map);
+ m_maincpu->set_addrmap(AS_IO, &yunsung8_state::port_map);
+ m_maincpu->set_vblank_int("screen", FUNC(yunsung8_state::irq0_line_assert)); /* No nmi routine */
- MCFG_DEVICE_ADD("audiocpu", Z80, XTAL(16'000'000)/4) /* ? */
- MCFG_DEVICE_PROGRAM_MAP(sound_map)
+ Z80(config, m_audiocpu, XTAL(16'000'000)/4); /* ? */
+ m_audiocpu->set_addrmap(AS_PROGRAM, &yunsung8_state::sound_map);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_RAW_PARAMS(XTAL(16'000'000)/2, 512, 64, 512-64, 262, 8, 256-8) /* TODO: completely inaccurate */
- MCFG_SCREEN_UPDATE_DRIVER(yunsung8_state, screen_update)
- MCFG_SCREEN_PALETTE("palette")
-
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_yunsung8)
- MCFG_PALETTE_ADD("palette", 2048)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_raw(XTAL(16'000'000)/2, 512, 64, 512-64, 262, 8, 256-8); /* TODO: completely inaccurate */
+ screen.set_screen_update(FUNC(yunsung8_state::screen_update));
+ screen.set_palette(m_palette);
+ GFXDECODE(config, m_gfxdecode, m_palette, gfx_yunsung8);
+ PALETTE(config, m_palette).set_entries(2048);
/* sound hardware */
SPEAKER(config, "lspeaker").front_left();
@@ -368,19 +367,19 @@ MACHINE_CONFIG_START(yunsung8_state::yunsung8)
GENERIC_LATCH_8(config, "soundlatch").data_pending_callback().set_inputline(m_audiocpu, 0);
- MCFG_DEVICE_ADD("ymsnd", YM3812, XTAL(16'000'000)/4)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 1.0)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 1.0)
+ ym3812_device &ymsnd(YM3812(config, "ymsnd", XTAL(16'000'000)/4));
+ ymsnd.add_route(ALL_OUTPUTS, "lspeaker", 1.0);
+ ymsnd.add_route(ALL_OUTPUTS, "rspeaker", 1.0);
LS157(config, m_adpcm_select, 0);
m_adpcm_select->out_callback().set("msm", FUNC(msm5205_device::data_w));
- MCFG_DEVICE_ADD("msm", MSM5205, XTAL(400'000)) /* verified on pcb */
- MCFG_MSM5205_VCLK_CB(WRITELINE(*this, yunsung8_state, adpcm_int)) /* interrupt function */
- MCFG_MSM5205_PRESCALER_SELECTOR(S96_4B) /* 4KHz, 4 Bits */
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 0.80)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 0.80)
-MACHINE_CONFIG_END
+ MSM5205(config, m_msm, XTAL(400'000)); /* verified on pcb */
+ m_msm->vck_legacy_callback().set(FUNC(yunsung8_state::adpcm_int)); /* interrupt function */
+ m_msm->set_prescaler_selector(msm5205_device::S96_4B); /* 4KHz, 4 Bits */
+ m_msm->add_route(ALL_OUTPUTS, "lspeaker", 0.80);
+ m_msm->add_route(ALL_OUTPUTS, "rspeaker", 0.80);
+}
/***************************************************************************
diff --git a/src/mame/drivers/z100.cpp b/src/mame/drivers/z100.cpp
index 8acc8bb13f4..ff837376bb8 100644
--- a/src/mame/drivers/z100.cpp
+++ b/src/mame/drivers/z100.cpp
@@ -145,9 +145,12 @@ ZDIPSW EQU 0FFH ; Configuration dip switches
#include "emu.h"
#include "cpu/i86/i86.h"
+//#include "bus/rs232/rs232.h"
//#include "bus/s100/s100.h"
#include "imagedev/floppy.h"
#include "machine/6821pia.h"
+#include "machine/input_merger.h"
+#include "machine/mc2661.h"
#include "machine/pic8259.h"
#include "machine/wd_fdc.h"
#include "video/mc6845.h"
@@ -160,15 +163,12 @@ public:
z100_state(const machine_config &mconfig, device_type type, const char *tag)
: driver_device(mconfig, type, tag),
m_maincpu(*this, "maincpu"),
- m_pia0(*this, "pia0"),
- m_pia1(*this, "pia1"),
+ m_pia(*this, "pia%u", 0U),
m_picm(*this, "pic8259_master"),
m_pics(*this, "pic8259_slave"),
m_fdc(*this, "z207_fdc"),
- m_floppy0(*this, "z207_fdc:0"),
- m_floppy1(*this, "z207_fdc:1"),
- m_floppy2(*this, "z207_fdc:2"),
- m_floppy3(*this, "z207_fdc:3"),
+ m_floppies(*this, "z207_fdc:%u", 0U),
+ m_epci(*this, "epci%u", 0U),
m_crtc(*this, "crtc"),
m_palette(*this, "palette"),
m_floppy(nullptr)
@@ -205,15 +205,12 @@ private:
void z100_mem(address_map &map);
required_device<cpu_device> m_maincpu;
- required_device<pia6821_device> m_pia0;
- required_device<pia6821_device> m_pia1;
+ required_device_array<pia6821_device, 2> m_pia;
required_device<pic8259_device> m_picm;
required_device<pic8259_device> m_pics;
required_device<fd1797_device> m_fdc;
- required_device<floppy_connector> m_floppy0;
- required_device<floppy_connector> m_floppy1;
- required_device<floppy_connector> m_floppy2;
- required_device<floppy_connector> m_floppy3;
+ required_device_array<floppy_connector, 4> m_floppies;
+ required_device_array<mc2661_device, 2> m_epci;
required_device<mc6845_device> m_crtc;
required_device<palette_device> m_palette;
@@ -363,27 +360,20 @@ WRITE8_MEMBER( z100_state::z100_6845_address_w )
{
data &= 0x1f;
m_crtc_index = data;
- m_crtc->address_w( space, offset, data );
+ m_crtc->address_w(data);
}
WRITE8_MEMBER( z100_state::z100_6845_data_w )
{
m_crtc_vreg[m_crtc_index] = data;
- m_crtc->register_w(space, offset, data);
+ m_crtc->register_w(data);
}
// todo: side select?
WRITE8_MEMBER( z100_state::floppy_select_w )
{
- switch (data & 0x03)
- {
- case 0: m_floppy = m_floppy0->get_device(); break;
- case 1: m_floppy = m_floppy1->get_device(); break;
- case 2: m_floppy = m_floppy2->get_device(); break;
- case 3: m_floppy = m_floppy3->get_device(); break;
- }
-
+ m_floppy = m_floppies[data & 0x03]->get_device();
m_fdc->set_floppy(m_floppy);
}
@@ -412,14 +402,14 @@ void z100_state::z100_io(address_map &map)
// z-207 secondary disk controller (wd1797)
// AM_RANGE (0xcd, 0xce) ET-100 CRT Controller
// AM_RANGE (0xd4, 0xd7) ET-100 Trainer Parallel I/O
- map(0xd8, 0xdb).rw(m_pia0, FUNC(pia6821_device::read), FUNC(pia6821_device::write)); //video board
+ map(0xd8, 0xdb).rw(m_pia[0], FUNC(pia6821_device::read), FUNC(pia6821_device::write)); //video board
map(0xdc, 0xdc).w(FUNC(z100_state::z100_6845_address_w));
map(0xdd, 0xdd).w(FUNC(z100_state::z100_6845_data_w));
// AM_RANGE (0xde, 0xde) light pen
- map(0xe0, 0xe3).rw(m_pia1, FUNC(pia6821_device::read), FUNC(pia6821_device::write)); //main board
+ map(0xe0, 0xe3).rw(m_pia[1], FUNC(pia6821_device::read), FUNC(pia6821_device::write)); //main board
// AM_RANGE (0xe4, 0xe7) 8253 PIT
-// AM_RANGE (0xe8, 0xeb) First 2661-2 serial port (printer)
-// AM_RANGE (0xec, 0xef) Second 2661-2 serial port (modem)
+ map(0xe8, 0xeb).rw(m_epci[0], FUNC(mc2661_device::read), FUNC(mc2661_device::write));
+ map(0xec, 0xef).rw(m_epci[1], FUNC(mc2661_device::read), FUNC(mc2661_device::write));
map(0xf0, 0xf1).rw(m_pics, FUNC(pic8259_device::read), FUNC(pic8259_device::write));
map(0xf2, 0xf3).rw(m_picm, FUNC(pic8259_device::read), FUNC(pic8259_device::write));
map(0xf4, 0xf4).r(FUNC(z100_state::keyb_data_r)); // -> 8041 MCU
@@ -674,7 +664,8 @@ static void z100_floppies(device_slot_interface &device)
device.option_add("dd", FLOPPY_525_DD);
}
-MACHINE_CONFIG_START(z100_state::z100)
+void z100_state::z100(machine_config &config)
+{
/* basic machine hardware */
I8088(config, m_maincpu, 14.318181_MHz_XTAL / 3);
m_maincpu->set_addrmap(AS_PROGRAM, &z100_state::z100_mem);
@@ -682,15 +673,15 @@ MACHINE_CONFIG_START(z100_state::z100)
m_maincpu->set_irq_acknowledge_callback("pic8259_master", FUNC(pic8259_device::inta_cb));
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(50)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */
- MCFG_SCREEN_SIZE(640, 480)
- MCFG_SCREEN_VISIBLE_AREA(0, 640-1, 0, 480-1)
- MCFG_SCREEN_UPDATE_DRIVER(z100_state, screen_update)
- MCFG_SCREEN_PALETTE("palette")
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(50);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */
+ screen.set_size(640, 480);
+ screen.set_visarea(0, 640-1, 0, 480-1);
+ screen.set_screen_update(FUNC(z100_state::screen_update));
+ screen.set_palette(m_palette);
- MCFG_PALETTE_ADD("palette", 8)
+ PALETTE(config, m_palette).set_entries(8);
/* devices */
MC6845(config, m_crtc, 14.318181_MHz_XTAL / 8); /* unknown clock, hand tuned to get ~50/~60 fps */
@@ -707,21 +698,35 @@ MACHINE_CONFIG_START(z100_state::z100)
m_pics->out_int_callback().set(m_picm, FUNC(pic8259_device::ir3_w));
m_pics->in_sp_callback().set_constant(0);
- PIA6821(config, m_pia0, 0);
- m_pia0->writepa_handler().set(FUNC(z100_state::video_pia_A_w));
- m_pia0->writepb_handler().set(FUNC(z100_state::video_pia_B_w));
- m_pia0->ca2_handler().set(FUNC(z100_state::video_pia_CA2_w));
- m_pia0->cb2_handler().set(FUNC(z100_state::video_pia_CB2_w));
+ PIA6821(config, m_pia[0], 0);
+ m_pia[0]->writepa_handler().set(FUNC(z100_state::video_pia_A_w));
+ m_pia[0]->writepb_handler().set(FUNC(z100_state::video_pia_B_w));
+ m_pia[0]->ca2_handler().set(FUNC(z100_state::video_pia_CA2_w));
+ m_pia[0]->cb2_handler().set(FUNC(z100_state::video_pia_CB2_w));
- PIA6821(config, m_pia1, 0);
+ PIA6821(config, m_pia[1], 0);
FD1797(config, m_fdc, 1_MHz_XTAL);
- MCFG_FLOPPY_DRIVE_ADD("z207_fdc:0", z100_floppies, "dd", floppy_image_device::default_floppy_formats)
- MCFG_FLOPPY_DRIVE_ADD("z207_fdc:1", z100_floppies, "dd", floppy_image_device::default_floppy_formats)
- MCFG_FLOPPY_DRIVE_ADD("z207_fdc:2", z100_floppies, "", floppy_image_device::default_floppy_formats)
- MCFG_FLOPPY_DRIVE_ADD("z207_fdc:3", z100_floppies, "", floppy_image_device::default_floppy_formats)
-MACHINE_CONFIG_END
+ FLOPPY_CONNECTOR(config, m_floppies[0], z100_floppies, "dd", floppy_image_device::default_floppy_formats);
+ FLOPPY_CONNECTOR(config, m_floppies[1], z100_floppies, "dd", floppy_image_device::default_floppy_formats);
+ FLOPPY_CONNECTOR(config, m_floppies[2], z100_floppies, "", floppy_image_device::default_floppy_formats);
+ FLOPPY_CONNECTOR(config, m_floppies[3], z100_floppies, "", floppy_image_device::default_floppy_formats);
+
+ MC2661(config, m_epci[0], 4.9152_MHz_XTAL); // First 2661-2 serial port (printer)
+ m_epci[0]->txrdy_handler().set("epci0int", FUNC(input_merger_device::in_w<0>));
+ m_epci[0]->rxrdy_handler().set("epci0int", FUNC(input_merger_device::in_w<1>));
+
+ MC2661(config, m_epci[1], 4.9152_MHz_XTAL); // Second 2661-2 serial port (modem)
+ m_epci[1]->txrdy_handler().set("epci1int", FUNC(input_merger_device::in_w<0>));
+ m_epci[1]->rxrdy_handler().set("epci1int", FUNC(input_merger_device::in_w<1>));
+
+ input_merger_device &epci0int(INPUT_MERGER_ANY_HIGH(config, "epci0int"));
+ epci0int.output_handler().set(m_picm, FUNC(pic8259_device::ir4_w));
+
+ input_merger_device &epci1int(INPUT_MERGER_ANY_HIGH(config, "epci1int"));
+ epci1int.output_handler().set(m_picm, FUNC(pic8259_device::ir5_w));
+}
/* ROM definition */
ROM_START( z100 )
diff --git a/src/mame/drivers/z1013.cpp b/src/mame/drivers/z1013.cpp
index 919497e9f72..cd8e157d5b9 100644
--- a/src/mame/drivers/z1013.cpp
+++ b/src/mame/drivers/z1013.cpp
@@ -373,20 +373,20 @@ GFXDECODE_END
/* Machine driver */
MACHINE_CONFIG_START(z1013_state::z1013)
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, XTAL(1'000'000) )
- MCFG_DEVICE_PROGRAM_MAP(z1013_mem)
- MCFG_DEVICE_IO_MAP(z1013_io)
+ Z80(config, m_maincpu, XTAL(1'000'000));
+ m_maincpu->set_addrmap(AS_PROGRAM, &z1013_state::z1013_mem);
+ m_maincpu->set_addrmap(AS_IO, &z1013_state::z1013_io);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(50)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */
- MCFG_SCREEN_SIZE(32*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0, 32*8-1, 0, 32*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(z1013_state, screen_update_z1013)
- MCFG_SCREEN_PALETTE("palette")
-
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_z1013)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(50);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */
+ screen.set_size(32*8, 32*8);
+ screen.set_visarea(0, 32*8-1, 0, 32*8-1);
+ screen.set_screen_update(FUNC(z1013_state::screen_update_z1013));
+ screen.set_palette("palette");
+
+ GFXDECODE(config, "gfxdecode", "palette", gfx_z1013);
PALETTE(config, "palette", palette_device::MONOCHROME);
/* sound hardware */
@@ -398,19 +398,20 @@ MACHINE_CONFIG_START(z1013_state::z1013)
pio.in_pb_callback().set(FUNC(z1013_state::port_b_r));
pio.out_pb_callback().set(FUNC(z1013_state::port_b_w));
- MCFG_CASSETTE_ADD( "cassette" )
- MCFG_CASSETTE_DEFAULT_STATE(CASSETTE_STOPPED | CASSETTE_MOTOR_ENABLED | CASSETTE_SPEAKER_ENABLED)
+ CASSETTE(config, m_cass);
+ m_cass->set_default_state(CASSETTE_STOPPED | CASSETTE_MOTOR_ENABLED | CASSETTE_SPEAKER_ENABLED);
- MCFG_SNAPSHOT_ADD("snapshot", z1013_state, z1013, "z80", 0)
+ MCFG_SNAPSHOT_ADD("snapshot", z1013_state, z1013, "z80")
MACHINE_CONFIG_END
-MACHINE_CONFIG_START(z1013_state::z1013k76)
+void z1013_state::z1013k76(machine_config &config)
+{
z1013(config);
z80pio_device &pio(*subdevice<z80pio_device>("z80pio"));
pio.in_pb_callback().set(FUNC(z1013_state::k7659_port_b_r));
pio.out_pb_callback().set_nop();
-MACHINE_CONFIG_END
+}
/* ROM definition */
ROM_START( z1013 )
diff --git a/src/mame/drivers/z80dev.cpp b/src/mame/drivers/z80dev.cpp
index 1df8b699238..2f64375d8d0 100644
--- a/src/mame/drivers/z80dev.cpp
+++ b/src/mame/drivers/z80dev.cpp
@@ -123,15 +123,16 @@ INPUT_PORTS_START( z80dev )
PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("LD") PORT_CODE(KEYCODE_L)
INPUT_PORTS_END
-MACHINE_CONFIG_START(z80dev_state::z80dev)
+void z80dev_state::z80dev(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, 4_MHz_XTAL)
- MCFG_DEVICE_PROGRAM_MAP(mem_map)
- MCFG_DEVICE_IO_MAP(io_map)
+ Z80(config, m_maincpu, 4_MHz_XTAL);
+ m_maincpu->set_addrmap(AS_PROGRAM, &z80dev_state::mem_map);
+ m_maincpu->set_addrmap(AS_IO, &z80dev_state::io_map);
/* video hardware */
config.set_default_layout(layout_z80dev);
-MACHINE_CONFIG_END
+}
/* ROM definition */
ROM_START( z80dev )
diff --git a/src/mame/drivers/z80ne.cpp b/src/mame/drivers/z80ne.cpp
index ab64774f038..1b08433a9d3 100644
--- a/src/mame/drivers/z80ne.cpp
+++ b/src/mame/drivers/z80ne.cpp
@@ -414,26 +414,29 @@ static void z80ne_floppies(device_slot_interface &device)
device.option_add("sssd", FLOPPY_525_SSSD);
}
-MACHINE_CONFIG_START(z80ne_state::z80ne)
+void z80ne_state::z80ne(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("z80ne", Z80, Z80NE_CPU_SPEED_HZ)
- MCFG_DEVICE_PROGRAM_MAP(z80ne_mem)
- MCFG_DEVICE_IO_MAP(z80ne_io)
+ Z80(config, m_maincpu, Z80NE_CPU_SPEED_HZ);
+ m_maincpu->set_addrmap(AS_PROGRAM, &z80ne_state::z80ne_mem);
+ m_maincpu->set_addrmap(AS_IO, &z80ne_state::z80ne_io);
MCFG_MACHINE_START_OVERRIDE(z80ne_state,z80ne)
MCFG_MACHINE_RESET_OVERRIDE(z80ne_state,z80ne)
AY31015(config, m_uart);
- m_uart->set_tx_clock(4800.0);
- m_uart->set_rx_clock(4800.0);
- MCFG_CASSETTE_ADD( "cassette" )
- MCFG_CASSETTE_DEFAULT_STATE(CASSETTE_STOPPED | CASSETTE_MOTOR_ENABLED | CASSETTE_SPEAKER_ENABLED)
- MCFG_CASSETTE_INTERFACE("z80ne_cass")
+ CLOCK(config, m_uart_clock, 4800);
+ m_uart_clock->signal_handler().set(FUNC(z80ne_state::lx385_uart_tx_clock_w));
+ m_uart_clock->signal_handler().append(m_uart, FUNC(ay31015_device::write_rcp));
+
+ CASSETTE(config, m_cassette1);
+ m_cassette1->set_default_state(CASSETTE_STOPPED | CASSETTE_MOTOR_ENABLED | CASSETTE_SPEAKER_ENABLED);
+ m_cassette1->set_interface("z80ne_cass");
- MCFG_CASSETTE_ADD( "cassette2" )
- MCFG_CASSETTE_DEFAULT_STATE(CASSETTE_STOPPED | CASSETTE_MOTOR_ENABLED | CASSETTE_SPEAKER_ENABLED)
- MCFG_CASSETTE_INTERFACE("z80ne_cass")
+ CASSETTE(config, m_cassette2);
+ m_cassette2->set_default_state(CASSETTE_STOPPED | CASSETTE_MOTOR_ENABLED | CASSETTE_SPEAKER_ENABLED);
+ m_cassette2->set_interface("z80ne_cass");
config.set_default_layout(layout_z80ne);
@@ -441,15 +444,15 @@ MACHINE_CONFIG_START(z80ne_state::z80ne)
RAM(config, m_ram).set_default_size("32K");
// all known tapes require LX.388 expansion
- //MCFG_SOFTWARE_LIST_ADD("cass_list","z80ne_cass")
-MACHINE_CONFIG_END
+ //SOFTWARE_LIST(config, "cass_list").set_original("z80ne_cass");
+}
-MACHINE_CONFIG_START(z80ne_state::z80net)
+void z80ne_state::z80net(machine_config &config)
+{
z80ne(config);
- MCFG_DEVICE_MODIFY("z80ne")
- MCFG_DEVICE_PROGRAM_MAP(z80net_mem)
- MCFG_DEVICE_IO_MAP(z80net_io)
+ m_maincpu->set_addrmap(AS_PROGRAM, &z80ne_state::z80net_mem);
+ m_maincpu->set_addrmap(AS_IO, &z80ne_state::z80net_io);
MCFG_MACHINE_START_OVERRIDE(z80ne_state, z80net )
MCFG_MACHINE_RESET_OVERRIDE(z80ne_state, z80net )
@@ -467,10 +470,11 @@ MACHINE_CONFIG_START(z80ne_state::z80net)
m_lx387_kr2376->control().set(FUNC(z80ne_state::lx387_control_r));
/* video hardware */
- MCFG_SCREEN_MC6847_PAL_ADD("lx388", "mc6847")
+ SCREEN(config, "lx388", SCREEN_TYPE_RASTER);
- MCFG_DEVICE_ADD("mc6847", MC6847_PAL, 4.433619_MHz_XTAL)
- MCFG_MC6847_INPUT_CALLBACK(READ8(*this, z80ne_state, lx388_mc6847_videoram_r))
+ MC6847_PAL(config, m_vdg, 4.433619_MHz_XTAL);
+ m_vdg->set_screen("lx388");
+ m_vdg->input_callback().set(FUNC(z80ne_state::lx388_mc6847_videoram_r));
// AG = GND, GM2 = GND, GM1 = GND, GM0 = GND, CSS = GND
// other lines not connected
@@ -479,29 +483,32 @@ MACHINE_CONFIG_START(z80ne_state::z80net)
/* internal ram */
m_ram->set_default_size("32K").set_extra_options("1K");
- MCFG_SOFTWARE_LIST_ADD("cass_list","z80ne_cass")
-MACHINE_CONFIG_END
+ SOFTWARE_LIST(config, "cass_list").set_original("z80ne_cass");
+}
-MACHINE_CONFIG_START(z80ne_state::z80netb)
+void z80ne_state::z80netb(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("z80ne", Z80, Z80NE_CPU_SPEED_HZ)
- MCFG_DEVICE_PROGRAM_MAP(z80netb_mem)
- MCFG_DEVICE_IO_MAP(z80net_io)
+ Z80(config, m_maincpu, Z80NE_CPU_SPEED_HZ);
+ m_maincpu->set_addrmap(AS_PROGRAM, &z80ne_state::z80netb_mem);
+ m_maincpu->set_addrmap(AS_IO, &z80ne_state::z80net_io);
MCFG_MACHINE_START_OVERRIDE(z80ne_state,z80netb)
MCFG_MACHINE_RESET_OVERRIDE(z80ne_state,z80netb)
AY31015(config, m_uart);
- m_uart->set_tx_clock(4800.0);
- m_uart->set_rx_clock(4800.0);
- MCFG_CASSETTE_ADD( "cassette" )
- MCFG_CASSETTE_DEFAULT_STATE(CASSETTE_STOPPED | CASSETTE_MOTOR_ENABLED | CASSETTE_SPEAKER_ENABLED)
- MCFG_CASSETTE_INTERFACE("z80ne_cass")
+ CLOCK(config, m_uart_clock, 4800);
+ m_uart_clock->signal_handler().set(FUNC(z80ne_state::lx385_uart_tx_clock_w));
+ m_uart_clock->signal_handler().append(m_uart, FUNC(ay31015_device::write_rcp));
- MCFG_CASSETTE_ADD( "cassette2" )
- MCFG_CASSETTE_DEFAULT_STATE(CASSETTE_STOPPED | CASSETTE_MOTOR_ENABLED | CASSETTE_SPEAKER_ENABLED)
- MCFG_CASSETTE_INTERFACE("z80ne_cass")
+ CASSETTE(config, m_cassette1);
+ m_cassette1->set_default_state(CASSETTE_STOPPED | CASSETTE_MOTOR_ENABLED | CASSETTE_SPEAKER_ENABLED);
+ m_cassette1->set_interface("z80ne_cass");
+
+ CASSETTE(config, m_cassette2);
+ m_cassette2->set_default_state(CASSETTE_STOPPED | CASSETTE_MOTOR_ENABLED | CASSETTE_SPEAKER_ENABLED);
+ m_cassette2->set_interface("z80ne_cass");
KR2376_ST(config, m_lx387_kr2376, 50000);
m_lx387_kr2376->x<0>().set_ioport("X0");
@@ -516,10 +523,11 @@ MACHINE_CONFIG_START(z80ne_state::z80netb)
m_lx387_kr2376->control().set(FUNC(z80ne_state::lx387_control_r));
/* video hardware */
- MCFG_SCREEN_MC6847_PAL_ADD("lx388", "mc6847")
+ SCREEN(config, "lx388", SCREEN_TYPE_RASTER);
- MCFG_DEVICE_ADD("mc6847", MC6847_PAL, 4.433619_MHz_XTAL)
- MCFG_MC6847_INPUT_CALLBACK(READ8(*this, z80ne_state, lx388_mc6847_videoram_r))
+ MC6847_PAL(config, m_vdg, 4.433619_MHz_XTAL);
+ m_vdg->set_screen("lx388");
+ m_vdg->input_callback().set(FUNC(z80ne_state::lx388_mc6847_videoram_r));
// AG = GND, GM2 = GND, GM1 = GND, GM0 = GND, CSS = GND
// other lines not connected
@@ -528,54 +536,58 @@ MACHINE_CONFIG_START(z80ne_state::z80netb)
/* internal ram */
RAM(config, m_ram).set_default_size("32K").set_extra_options("1K");
- MCFG_SOFTWARE_LIST_ADD("cass_list","z80ne_cass")
-MACHINE_CONFIG_END
+ SOFTWARE_LIST(config, "cass_list").set_original("z80ne_cass");
+}
-MACHINE_CONFIG_START(z80netf_state::z80netf)
+void z80netf_state::z80netf(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("z80ne", Z80, Z80NE_CPU_SPEED_HZ)
- MCFG_DEVICE_PROGRAM_MAP(z80netf_mem)
- MCFG_DEVICE_IO_MAP(z80netf_io)
+ Z80(config, m_maincpu, Z80NE_CPU_SPEED_HZ);
+ m_maincpu->set_addrmap(AS_PROGRAM, &z80netf_state::z80netf_mem);
+ m_maincpu->set_addrmap(AS_IO, &z80netf_state::z80netf_io);
MCFG_MACHINE_START_OVERRIDE(z80netf_state,z80netf)
MCFG_MACHINE_RESET_OVERRIDE(z80netf_state,z80netf)
AY31015(config, m_uart);
- m_uart->set_tx_clock(4800.0);
- m_uart->set_rx_clock(4800.0);
- MCFG_CASSETTE_ADD( "cassette" )
- MCFG_CASSETTE_DEFAULT_STATE(CASSETTE_STOPPED | CASSETTE_MOTOR_ENABLED | CASSETTE_SPEAKER_ENABLED)
- MCFG_CASSETTE_INTERFACE("z80ne_cass")
+ CLOCK(config, m_uart_clock, 4800);
+ m_uart_clock->signal_handler().set(FUNC(z80netf_state::lx385_uart_tx_clock_w));
+ m_uart_clock->signal_handler().append(m_uart, FUNC(ay31015_device::write_rcp));
- MCFG_CASSETTE_ADD( "cassette2" )
- MCFG_CASSETTE_DEFAULT_STATE(CASSETTE_STOPPED | CASSETTE_MOTOR_ENABLED | CASSETTE_SPEAKER_ENABLED)
- MCFG_CASSETTE_INTERFACE("z80ne_cass")
+ CASSETTE(config, m_cassette1);
+ m_cassette1->set_default_state(CASSETTE_STOPPED | CASSETTE_MOTOR_ENABLED | CASSETTE_SPEAKER_ENABLED);
+ m_cassette1->set_interface("z80ne_cass");
+
+ CASSETTE(config, m_cassette2);
+ m_cassette2->set_default_state(CASSETTE_STOPPED | CASSETTE_MOTOR_ENABLED | CASSETTE_SPEAKER_ENABLED);
+ m_cassette2->set_interface("z80ne_cass");
KR2376_ST(config, m_lx387_kr2376, 50000);
/* video hardware */
- MCFG_SCREEN_MC6847_PAL_ADD("lx388", "mc6847")
+ SCREEN(config, "lx388", SCREEN_TYPE_RASTER);
- MCFG_DEVICE_ADD("mc6847", MC6847_PAL, 4.433619_MHz_XTAL)
- MCFG_MC6847_INPUT_CALLBACK(READ8(*this, z80ne_state, lx388_mc6847_videoram_r))
+ MC6847_PAL(config, m_vdg, 4.433619_MHz_XTAL);
+ m_vdg->set_screen("lx388");
+ m_vdg->input_callback().set(FUNC(z80ne_state::lx388_mc6847_videoram_r));
// AG = GND, GM2 = GND, GM1 = GND, GM0 = GND, CSS = GND
// other lines not connected
FD1771(config, m_wd1771, 2_MHz_XTAL / 2);
- MCFG_FLOPPY_DRIVE_ADD("wd1771:0", z80ne_floppies, "sssd", z80ne_state::floppy_formats)
- MCFG_FLOPPY_DRIVE_ADD("wd1771:1", z80ne_floppies, "sssd", z80ne_state::floppy_formats)
- MCFG_FLOPPY_DRIVE_ADD("wd1771:2", z80ne_floppies, nullptr, z80ne_state::floppy_formats)
- MCFG_FLOPPY_DRIVE_ADD("wd1771:3", z80ne_floppies, nullptr, z80ne_state::floppy_formats)
+ FLOPPY_CONNECTOR(config, "wd1771:0", z80ne_floppies, "sssd", z80ne_state::floppy_formats);
+ FLOPPY_CONNECTOR(config, "wd1771:1", z80ne_floppies, "sssd", z80ne_state::floppy_formats);
+ FLOPPY_CONNECTOR(config, "wd1771:2", z80ne_floppies, nullptr, z80ne_state::floppy_formats);
+ FLOPPY_CONNECTOR(config, "wd1771:3", z80ne_floppies, nullptr, z80ne_state::floppy_formats);
config.set_default_layout(layout_z80netf);
/* internal ram */
RAM(config, m_ram).set_default_size("56K");
- MCFG_SOFTWARE_LIST_ADD("cass_list","z80ne_cass")
- MCFG_SOFTWARE_LIST_ADD("flop_list","z80ne_flop")
-MACHINE_CONFIG_END
+ SOFTWARE_LIST(config, "cass_list").set_original("z80ne_cass");
+ SOFTWARE_LIST(config, "flop_list").set_original("z80ne_flop");
+}
/******************************************************************************
ROM Definitions
diff --git a/src/mame/drivers/z88.cpp b/src/mame/drivers/z88.cpp
index 41178d32491..7b44e8fd29e 100644
--- a/src/mame/drivers/z88.cpp
+++ b/src/mame/drivers/z88.cpp
@@ -596,7 +596,8 @@ static void z88_cart(device_slot_interface &device)
device.option_add("1024kflash", Z88_1024K_FLASH); // 1024KB Flash cart
}
-MACHINE_CONFIG_START(z88_state::z88)
+void z88_state::z88(machine_config &config)
+{
/* basic machine hardware */
Z80(config, m_maincpu, XTAL(9'830'400)/3); // divided by 3 through the uPD65031
m_maincpu->set_addrmap(AS_PROGRAM, &z88_state::z88_mem);
@@ -629,21 +630,18 @@ MACHINE_CONFIG_START(z88_state::z88)
RAM(config, RAM_TAG).set_default_size("128K").set_extra_options("32K,64K,256K,512K");
/* cartridges */
- device = &Z88CART_SLOT(config, m_carts[1]);
- MCFG_DEVICE_SLOT_INTERFACE(z88_cart, nullptr, false)
- MCFG_Z88CART_SLOT_OUT_FLP_CB(WRITELINE("blink", upd65031_device, flp_w))
+ Z88CART_SLOT(config, m_carts[1], z88_cart, nullptr);
+ m_carts[1]->out_flp_callback().set(m_blink, FUNC(upd65031_device::flp_w));
- device = &Z88CART_SLOT(config, m_carts[2]);
- MCFG_DEVICE_SLOT_INTERFACE(z88_cart, nullptr, false)
- MCFG_Z88CART_SLOT_OUT_FLP_CB(WRITELINE("blink", upd65031_device, flp_w))
+ Z88CART_SLOT(config, m_carts[2], z88_cart, nullptr);
+ m_carts[2]->out_flp_callback().set(m_blink, FUNC(upd65031_device::flp_w));
- device = &Z88CART_SLOT(config, m_carts[3]);
- MCFG_DEVICE_SLOT_INTERFACE(z88_cart, nullptr, false)
- MCFG_Z88CART_SLOT_OUT_FLP_CB(WRITELINE("blink", upd65031_device, flp_w))
+ Z88CART_SLOT(config, m_carts[3], z88_cart, nullptr);
+ m_carts[3]->out_flp_callback().set(m_blink, FUNC(upd65031_device::flp_w));
/* software lists */
- MCFG_SOFTWARE_LIST_ADD("cart_list", "z88_cart")
-MACHINE_CONFIG_END
+ SOFTWARE_LIST(config, "cart_list").set_original("z88_cart");
+}
/***************************************************************************
diff --git a/src/mame/drivers/z9001.cpp b/src/mame/drivers/z9001.cpp
index e29df35bee0..f6950922c38 100644
--- a/src/mame/drivers/z9001.cpp
+++ b/src/mame/drivers/z9001.cpp
@@ -206,7 +206,8 @@ static GFXDECODE_START( gfx_z9001 )
GFXDECODE_END
-MACHINE_CONFIG_START(z9001_state::z9001)
+void z9001_state::z9001(machine_config &config)
+{
/* basic machine hardware */
Z80(config, m_maincpu, XTAL(9'830'400) / 4);
m_maincpu->set_addrmap(AS_PROGRAM, &z9001_state::z9001_mem);
@@ -214,16 +215,16 @@ MACHINE_CONFIG_START(z9001_state::z9001)
m_maincpu->set_daisy_config(z9001_daisy_chain);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(50)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */
- MCFG_SCREEN_SIZE(40*8, 24*8)
- MCFG_SCREEN_VISIBLE_AREA(0, 40*8-1, 0, 24*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(z9001_state, screen_update_z9001)
- MCFG_SCREEN_PALETTE("palette")
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(50);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */
+ screen.set_size(40*8, 24*8);
+ screen.set_visarea(0, 40*8-1, 0, 24*8-1);
+ screen.set_screen_update(FUNC(z9001_state::screen_update_z9001));
+ screen.set_palette("palette");
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_z9001)
- MCFG_PALETTE_ADD("palette", 16)
+ GFXDECODE(config, "gfxdecode", "palette", gfx_z9001);
+ PALETTE(config, "palette").set_entries(16);
/* Sound */
SPEAKER(config, "mono").front_center();
@@ -233,7 +234,7 @@ MACHINE_CONFIG_START(z9001_state::z9001)
/* Devices */
generic_keyboard_device &keyboard(GENERIC_KEYBOARD(config, "keyboard", 0));
keyboard.set_keyboard_callback(FUNC(z9001_state::kbd_put));
- MCFG_TIMER_DRIVER_ADD_PERIODIC("z9001_timer", z9001_state, timer_callback, attotime::from_msec(10))
+ TIMER(config, "z9001_timer").configure_periodic(FUNC(z9001_state::timer_callback), attotime::from_msec(10));
z80pio_device& pio1(Z80PIO(config, "z80pio1", XTAL(9'830'400) / 4));
pio1.out_int_callback().set_inputline(m_maincpu, INPUT_LINE_IRQ0);
@@ -247,8 +248,8 @@ MACHINE_CONFIG_START(z9001_state::z9001)
ctc.zc_callback<0>().set(FUNC(z9001_state::cass_w));
ctc.zc_callback<2>().set("z80ctc", FUNC(z80ctc_device::trg3));
- MCFG_CASSETTE_ADD( "cassette" )
-MACHINE_CONFIG_END
+ CASSETTE(config, m_cass);
+}
/* ROM definition */
ROM_START( z9001 )
diff --git a/src/mame/drivers/zac_proto.cpp b/src/mame/drivers/zac_proto.cpp
index 1eabe100a8d..0ecdfb56f7a 100644
--- a/src/mame/drivers/zac_proto.cpp
+++ b/src/mame/drivers/zac_proto.cpp
@@ -241,10 +241,12 @@ void zac_proto_state::machine_reset()
m_digits[10] = 0x3f; // units shows zero all the time
}
-MACHINE_CONFIG_START(zac_proto_state::zac_proto)
+void zac_proto_state::zac_proto(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", INS8060, XTAL(4'000'000) / 2) // Using SC/MP II chip which has an internal /2 circuit.
- MCFG_DEVICE_PROGRAM_MAP(zac_proto_map)
+ INS8060(config, m_maincpu, XTAL(4'000'000) / 2); // Using SC/MP II chip which has an internal /2 circuit.
+ m_maincpu->set_addrmap(AS_PROGRAM, &zac_proto_state::zac_proto_map);
+
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
/* Video */
@@ -252,7 +254,7 @@ MACHINE_CONFIG_START(zac_proto_state::zac_proto)
/* Sound */
genpin_audio(config);
-MACHINE_CONFIG_END
+}
/*--------------------------------
/ Strike
diff --git a/src/mame/drivers/zaccaria.cpp b/src/mame/drivers/zaccaria.cpp
index c37fb7fb608..d3827682f13 100644
--- a/src/mame/drivers/zaccaria.cpp
+++ b/src/mame/drivers/zaccaria.cpp
@@ -331,13 +331,13 @@ WRITE_LINE_MEMBER(zaccaria_state::vblank_irq)
}
-MACHINE_CONFIG_START(zaccaria_state::zaccaria)
-
+void zaccaria_state::zaccaria(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80,XTAL(18'432'000)/6) /* verified on pcb */
- MCFG_DEVICE_PROGRAM_MAP(main_map)
+ Z80(config, m_maincpu, XTAL(18'432'000)/6); /* verified on pcb */
+ m_maincpu->set_addrmap(AS_PROGRAM, &zaccaria_state::main_map);
-// MCFG_QUANTUM_TIME(attotime::from_hz(1000000))
+// config.m_minimum_quantum = attotime::from_hz(1000000);
WATCHDOG_TIMER(config, "watchdog");
@@ -355,14 +355,14 @@ MACHINE_CONFIG_START(zaccaria_state::zaccaria)
ppi.out_pc_callback().set(FUNC(zaccaria_state::dsw_sel_w));
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60.57) /* verified on pcb */
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(32*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(zaccaria_state, screen_update)
- MCFG_SCREEN_PALETTE(m_palette)
- MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE(*this, zaccaria_state, vblank_irq))
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60.57); /* verified on pcb */
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(32*8, 32*8);
+ screen.set_visarea(0*8, 32*8-1, 2*8, 30*8-1);
+ screen.set_screen_update(FUNC(zaccaria_state::screen_update));
+ screen.set_palette(m_palette);
+ screen.screen_vblank().set(FUNC(zaccaria_state::vblank_irq));
GFXDECODE(config, m_gfxdecode, m_palette, gfx_zaccaria);
PALETTE(config, m_palette, FUNC(zaccaria_state::zaccaria_palette), 32*8 + 32*8, 512);
@@ -370,7 +370,7 @@ MACHINE_CONFIG_START(zaccaria_state::zaccaria)
/* sound hardware */
SPEAKER(config, "speaker").front_center();
ZACCARIA_1B11142(config, "audiopcb").add_route(ALL_OUTPUTS, "speaker", 1.0);
-MACHINE_CONFIG_END
+}
diff --git a/src/mame/drivers/zapcomputer.cpp b/src/mame/drivers/zapcomputer.cpp
index 1f43a87eb85..e718367412d 100644
--- a/src/mame/drivers/zapcomputer.cpp
+++ b/src/mame/drivers/zapcomputer.cpp
@@ -155,15 +155,16 @@ void zapcomp_state::machine_start()
m_digits.resolve();
}
-MACHINE_CONFIG_START(zapcomp_state::zapcomp)
+void zapcomp_state::zapcomp(machine_config &config)
+{
// basic machine hardware
- MCFG_DEVICE_ADD("maincpu", Z80, XTAL(2'000'000))
- MCFG_DEVICE_PROGRAM_MAP(zapcomp_mem)
- MCFG_DEVICE_IO_MAP(zapcomp_io)
+ Z80(config, m_maincpu, XTAL(2'000'000));
+ m_maincpu->set_addrmap(AS_PROGRAM, &zapcomp_state::zapcomp_mem);
+ m_maincpu->set_addrmap(AS_IO, &zapcomp_state::zapcomp_io);
/* video hardware */
config.set_default_layout(layout_zapcomputer);
-MACHINE_CONFIG_END
+}
ROM_START( zapcomp )
ROM_REGION( 0x10000, "roms", 0 )
diff --git a/src/mame/drivers/zaurus.cpp b/src/mame/drivers/zaurus.cpp
index 1479def5177..7e3d7416e22 100644
--- a/src/mame/drivers/zaurus.cpp
+++ b/src/mame/drivers/zaurus.cpp
@@ -1519,30 +1519,30 @@ TIMER_DEVICE_CALLBACK_MEMBER(zaurus_state::rtc_irq_callback)
}
// TODO: main CPU differs greatly between versions!
-MACHINE_CONFIG_START(zaurus_state::zaurus)
-
+void zaurus_state::zaurus(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD(m_maincpu,PXA255,MAIN_CLOCK)
- MCFG_DEVICE_PROGRAM_MAP(zaurus_map)
+ PXA255(config, m_maincpu, MAIN_CLOCK);
+ m_maincpu->set_addrmap(AS_PROGRAM, &zaurus_state::zaurus_map);
- MCFG_TIMER_DRIVER_ADD_PERIODIC("rtc_timer", zaurus_state, rtc_irq_callback, attotime::from_hz(XTAL(32'768)))
+ TIMER(config, "rtc_timer").configure_periodic(FUNC(zaurus_state::rtc_irq_callback), attotime::from_hz(XTAL(32'768)));
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500))
- MCFG_SCREEN_UPDATE_DRIVER(zaurus_state, screen_update)
- MCFG_SCREEN_SIZE(32*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 0*8, 32*8-1)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500));
+ screen.set_screen_update(FUNC(zaurus_state::screen_update));
+ screen.set_size(32*8, 32*8);
+ screen.set_visarea(0*8, 32*8-1, 0*8, 32*8-1);
- MCFG_PALETTE_ADD("palette", 8)
+ PALETTE(config, "palette").set_entries(8);
/* sound hardware */
SPEAKER(config, "mono").front_center();
// AY8910(config, "aysnd", MAIN_CLOCK/4).add_route(ALL_OUTPUTS, "mono", 0.30);
PXA255_PERIPHERALS(config, m_pxa_periphs, MAIN_CLOCK, m_maincpu);
-MACHINE_CONFIG_END
+}
/***************************************************************************
diff --git a/src/mame/drivers/zaxxon.cpp b/src/mame/drivers/zaxxon.cpp
index 7fa9581d499..6a09d9e57c9 100644
--- a/src/mame/drivers/zaxxon.cpp
+++ b/src/mame/drivers/zaxxon.cpp
@@ -500,9 +500,9 @@ void zaxxon_state::congo_sound_map(address_map &map)
{
map(0x0000, 0x1fff).rom();
map(0x4000, 0x47ff).mirror(0x1800).ram();
- map(0x6000, 0x6000).mirror(0x1fff).w("sn1", FUNC(sn76489a_device::command_w));
+ map(0x6000, 0x6000).mirror(0x1fff).w("sn1", FUNC(sn76489a_device::write));
map(0x8000, 0x8003).mirror(0x1ffc).rw("ppi8255", FUNC(i8255_device::read), FUNC(i8255_device::write));
- map(0xa000, 0xa000).mirror(0x1fff).w("sn2", FUNC(sn76489a_device::command_w));
+ map(0xa000, 0xa000).mirror(0x1fff).w("sn2", FUNC(sn76489a_device::write));
}
@@ -915,11 +915,11 @@ GFXDECODE_END
*
*************************************/
-MACHINE_CONFIG_START(zaxxon_state::root)
-
+void zaxxon_state::root(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, MASTER_CLOCK/16)
- MCFG_DEVICE_PROGRAM_MAP(zaxxon_map)
+ Z80(config, m_maincpu, MASTER_CLOCK/16);
+ m_maincpu->set_addrmap(AS_PROGRAM, &zaxxon_state::zaxxon_map);
I8255A(config, m_ppi);
m_ppi->out_pa_callback().set(FUNC(zaxxon_state::zaxxon_sound_a_w));
@@ -944,29 +944,29 @@ MACHINE_CONFIG_START(zaxxon_state::root)
GFXDECODE(config, m_gfxdecode, m_palette, gfx_zaxxon);
PALETTE(config, m_palette, FUNC(zaxxon_state::zaxxon_palette), 256);
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_RAW_PARAMS(PIXEL_CLOCK, HTOTAL, HBEND, HBSTART, VTOTAL, VBEND, VBSTART)
- MCFG_SCREEN_UPDATE_DRIVER(zaxxon_state, screen_update_zaxxon)
- MCFG_SCREEN_PALETTE("palette")
- MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE(*this, zaxxon_state, vblank_int))
-MACHINE_CONFIG_END
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_raw(PIXEL_CLOCK, HTOTAL, HBEND, HBSTART, VTOTAL, VBEND, VBSTART);
+ screen.set_screen_update(FUNC(zaxxon_state::screen_update_zaxxon));
+ screen.set_palette(m_palette);
+ screen.screen_vblank().set(FUNC(zaxxon_state::vblank_int));
+}
-MACHINE_CONFIG_START(zaxxon_state::zaxxon)
+void zaxxon_state::zaxxon(machine_config &config)
+{
root(config);
/* sound hardware */
SPEAKER(config, "speaker").front_center();
zaxxon_samples(config);
-MACHINE_CONFIG_END
-
+}
-MACHINE_CONFIG_START(zaxxon_state::szaxxon)
+void zaxxon_state::szaxxon(machine_config &config)
+{
zaxxon(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_OPCODES_MAP(decrypted_opcodes_map)
-MACHINE_CONFIG_END
+ m_maincpu->set_addrmap(AS_OPCODES, &zaxxon_state::decrypted_opcodes_map);
+}
void zaxxon_state::szaxxone(machine_config &config)
@@ -980,8 +980,8 @@ void zaxxon_state::szaxxone(machine_config &config)
}
-
-MACHINE_CONFIG_START(zaxxon_state::futspye)
+void zaxxon_state::futspye(machine_config &config)
+{
root(config);
sega_315_5061_device &maincpu(SEGA_315_5061(config.replace(), m_maincpu, MASTER_CLOCK/16));
maincpu.set_addrmap(AS_PROGRAM, &zaxxon_state::zaxxon_map);
@@ -991,19 +991,16 @@ MACHINE_CONFIG_START(zaxxon_state::futspye)
/* video hardware */
- MCFG_SCREEN_MODIFY("screen")
- MCFG_SCREEN_UPDATE_DRIVER(zaxxon_state, screen_update_futspy)
+ subdevice<screen_device>("screen")->set_screen_update(FUNC(zaxxon_state::screen_update_futspy));
/* sound hardware */
SPEAKER(config, "speaker").front_center();
zaxxon_samples(config);
-
-MACHINE_CONFIG_END
-
-
+}
-MACHINE_CONFIG_START(zaxxon_state::razmataze)
+void zaxxon_state::razmataze(machine_config &config)
+{
root(config);
sega_315_5098_device &maincpu(SEGA_315_5098(config.replace(), m_maincpu, MASTER_CLOCK/16));
maincpu.set_addrmap(AS_PROGRAM, &zaxxon_state::ixion_map);
@@ -1015,13 +1012,13 @@ MACHINE_CONFIG_START(zaxxon_state::razmataze)
/* video hardware */
MCFG_VIDEO_START_OVERRIDE(zaxxon_state,razmataz)
- MCFG_SCREEN_MODIFY("screen")
- MCFG_SCREEN_UPDATE_DRIVER(zaxxon_state, screen_update_razmataz)
+ subdevice<screen_device>("screen")->set_screen_update(FUNC(zaxxon_state::screen_update_razmataz));
/* sound hardware */
SPEAKER(config, "speaker").front_center();
SEGAUSBROM(config, "usbsnd", 0, m_maincpu).add_route(ALL_OUTPUTS, "speaker", 1.0);
-MACHINE_CONFIG_END
+}
+
void zaxxon_state::ixion(machine_config &config)
{
@@ -1035,11 +1032,12 @@ void zaxxon_state::ixion(machine_config &config)
m_mainlatch[0]->q_out_cb<6>().set_nop(); // flip screen not used
}
-MACHINE_CONFIG_START(zaxxon_state::congo)
+
+void zaxxon_state::congo(machine_config &config)
+{
root(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(congo_map)
+ m_maincpu->set_addrmap(AS_PROGRAM, &zaxxon_state::congo_map);
m_ppi->in_pa_callback().set("soundlatch", FUNC(generic_latch_8_device::read));
m_ppi->out_pa_callback().set_nop();
@@ -1056,31 +1054,27 @@ MACHINE_CONFIG_START(zaxxon_state::congo)
m_mainlatch[1]->q_out_cb<6>().set(FUNC(zaxxon_state::congo_fg_bank_w)); // BS
m_mainlatch[1]->q_out_cb<7>().set(FUNC(zaxxon_state::congo_color_bank_w)); // CBS
- MCFG_DEVICE_ADD("audiocpu", Z80, SOUND_CLOCK)
- MCFG_DEVICE_PROGRAM_MAP(congo_sound_map)
- MCFG_DEVICE_PERIODIC_INT_DRIVER(zaxxon_state, irq0_line_hold, SOUND_CLOCK/16/16/16/4)
+ z80_device &audiocpu(Z80(config, "audiocpu", SOUND_CLOCK));
+ audiocpu.set_addrmap(AS_PROGRAM, &zaxxon_state::congo_sound_map);
+ audiocpu.set_periodic_int(FUNC(zaxxon_state::irq0_line_hold), attotime::from_hz(SOUND_CLOCK/16/16/16/4));
/* video hardware */
m_palette->set_entries(512).set_init(FUNC(zaxxon_state::zaxxon_palette));
MCFG_VIDEO_START_OVERRIDE(zaxxon_state,congo)
- MCFG_SCREEN_MODIFY("screen")
- MCFG_SCREEN_UPDATE_DRIVER(zaxxon_state, screen_update_congo)
+ subdevice<screen_device>("screen")->set_screen_update(FUNC(zaxxon_state::screen_update_congo));
/* sound hardware */
SPEAKER(config, "speaker").front_center();
GENERIC_LATCH_8(config, "soundlatch");
- MCFG_DEVICE_ADD("sn1", SN76489A, SOUND_CLOCK) // schematic shows sn76489A
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 1.0)
+ SN76489A(config, "sn1", SOUND_CLOCK).add_route(ALL_OUTPUTS, "speaker", 1.0); // schematic shows sn76489A
- MCFG_DEVICE_ADD("sn2", SN76489A, SOUND_CLOCK/4) // schematic shows sn76489A
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 1.0)
+ SN76489A(config, "sn2", SOUND_CLOCK/4).add_route(ALL_OUTPUTS, "speaker", 1.0); // schematic shows sn76489A
congo_samples(config);
-MACHINE_CONFIG_END
-
+}
/*************************************
diff --git a/src/mame/drivers/zexall.cpp b/src/mame/drivers/zexall.cpp
index b6c9b60defc..5c09a93d38c 100644
--- a/src/mame/drivers/zexall.cpp
+++ b/src/mame/drivers/zexall.cpp
@@ -99,7 +99,7 @@ READ8_MEMBER( zexall_state::output_ack_r )
// spit out the byte in out_byte if out_req is not equal to out_req_last
if (m_out_req != m_out_req_last)
{
- m_terminal->write(space, 0, m_out_data);
+ m_terminal->write(m_out_data);
m_out_req_last = m_out_req;
m_out_ack++;
}
diff --git a/src/mame/drivers/zms8085.cpp b/src/mame/drivers/zms8085.cpp
index a867f448ce9..e0a4b07a621 100644
--- a/src/mame/drivers/zms8085.cpp
+++ b/src/mame/drivers/zms8085.cpp
@@ -17,6 +17,7 @@ hardware, since no schematics or manuals have been found.
#include "cpu/i8085/i8085.h"
#include "bus/rs232/rs232.h"
#include "machine/ay31015.h"
+#include "machine/clock.h"
#include "screen.h"
class zms8085_state : public driver_device
@@ -26,6 +27,7 @@ public:
: driver_device(mconfig, type, tag)
, m_maincpu(*this, "maincpu")
, m_uart(*this, "uart")
+ , m_uart_clock(*this, "uart_clock")
, m_rs232(*this, "rs232")
, m_screen(*this, "screen")
, m_mainram(*this, "mainram")
@@ -51,6 +53,7 @@ private:
required_device<cpu_device> m_maincpu;
required_device<ay51013_device> m_uart;
+ required_device<clock_device> m_uart_clock;
required_device<rs232_port_device> m_rs232;
required_device<screen_device> m_screen;
required_shared_ptr<u8> m_mainram;
@@ -335,13 +338,15 @@ void zms8085_state::zephyr(machine_config &config)
screen.screen_vblank().set_inputline(m_maincpu, I8085_RST55_LINE, ASSERT_LINE);
AY51013(config, m_uart); // SMC COM2017
- m_uart->set_tx_clock(153600); // should actually be configurable somehow
- m_uart->set_rx_clock(153600);
m_uart->read_si_callback().set("rs232", FUNC(rs232_port_device::rxd_r));
m_uart->write_so_callback().set("rs232", FUNC(rs232_port_device::write_txd));
m_uart->write_dav_callback().set_inputline("maincpu", I8085_RST65_LINE);
m_uart->set_auto_rdav(true);
+ CLOCK(config, m_uart_clock, 153600); // should actually be configurable somehow
+ m_uart_clock->signal_handler().set(m_uart, FUNC(ay51013_device::write_tcp));
+ m_uart_clock->signal_handler().append(m_uart, FUNC(ay51013_device::write_rcp));
+
RS232_PORT(config, "rs232", default_rs232_devices, nullptr);
}
diff --git a/src/mame/drivers/zn.cpp b/src/mame/drivers/zn.cpp
index 02f2690a71e..c7441f90f4b 100644
--- a/src/mame/drivers/zn.cpp
+++ b/src/mame/drivers/zn.cpp
@@ -4202,6 +4202,14 @@ ROM_START( cbaj )
ROM_REGION( 0x8, "cat702_2", 0 )
ROM_LOAD( "mg03", 0x000000, 0x000008, CRC(8be79633) SHA1(f38f881b6139eb8368e593904cb50b6e68bdf2e9) )
+
+ ROM_REGION( 0xc00, "misc", 0 )
+ ROM_LOAD( "gal16v8d-15lp.sop-rom1.uo117", 0x000, 0x117, CRC(cf8ebc23) SHA1(0662f8ba418eb9187fb7a86cc8c0d86220dcdbf0) )
+ ROM_LOAD( "gal16v8d-15lp.sop-rom2b.uo4138", 0x200, 0x117, CRC(098662c1) SHA1(5fcf66b16f840129aa61e9cf2b2951c37a5cbabf) )
+ ROM_LOAD( "gal16v8d-15lp.sop-rom3.uo3125", 0x400, 0x117, CRC(f9c92db7) SHA1(1c2818f0fceedca914a0cbb74c2237a8c3798906) )
+ ROM_LOAD( "gal16v8d-15lp.sop-rom4c.uo4131", 0x600, 0x117, CRC(e87179ef) SHA1(9942ff71d39924d938aa5e7c3d0c1aa9a38c5e77) )
+ ROM_LOAD( "gal16v8d-15lp.sop-rom5b.uo4128", 0x800, 0x117, CRC(f32a1803) SHA1(8251bad3fe5a0ebf6cba4c1a67aa09e391289c65) )
+ ROM_LOAD( "gal16v8d-15lp.sop-rom6a.uo4134", 0xa00, 0x117, CRC(40e1f6f2) SHA1(e7703e6db5d4f23c34c633ec147a88d2b0f681d5) )
ROM_END
ROM_START( shngmtkb )
diff --git a/src/mame/drivers/zorba.cpp b/src/mame/drivers/zorba.cpp
index c3bbb6e7a3f..2103ab3ac06 100644
--- a/src/mame/drivers/zorba.cpp
+++ b/src/mame/drivers/zorba.cpp
@@ -132,29 +132,28 @@ GFXDECODE_END
} // anonymous namespace
-MACHINE_CONFIG_START(zorba_state::zorba)
+void zorba_state::zorba(machine_config &config)
+{
// basic machine hardware
Z80(config, m_maincpu, 24_MHz_XTAL / 6);
m_maincpu->set_addrmap(AS_PROGRAM, &zorba_state::zorba_mem);
m_maincpu->set_addrmap(AS_IO, &zorba_state::zorba_io);
/* video hardware */
- MCFG_SCREEN_ADD_MONOCHROME("screen", RASTER, rgb_t::green())
- MCFG_SCREEN_REFRESH_RATE(50)
- MCFG_SCREEN_UPDATE_DEVICE("crtc", i8275_device, screen_update)
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, m_palette, gfx_zorba)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_color(rgb_t::green());
+ screen.set_refresh_hz(50);
+ screen.set_screen_update("crtc", FUNC(i8275_device::screen_update));
+ GFXDECODE(config, "gfxdecode", m_palette, gfx_zorba);
PALETTE(config, m_palette, palette_device::MONOCHROME_HIGHLIGHT);
/* sound hardware */
SPEAKER(config, "mono").front_center();
BEEP(config, m_beep, 800).add_route(ALL_OUTPUTS, "mono", 1.00); // should be horizontal frequency / 16, so depends on CRTC parameters
- MCFG_INPUT_MERGER_ANY_HIGH("irq0")
- MCFG_INPUT_MERGER_OUTPUT_HANDLER(WRITELINE(*this, zorba_state, irq_w<0>))
- MCFG_INPUT_MERGER_ANY_HIGH("irq1")
- MCFG_INPUT_MERGER_OUTPUT_HANDLER(WRITELINE(*this, zorba_state, irq_w<1>))
- MCFG_INPUT_MERGER_ANY_HIGH("irq2")
- MCFG_INPUT_MERGER_OUTPUT_HANDLER(WRITELINE(*this, zorba_state, irq_w<2>))
+ INPUT_MERGER_ANY_HIGH(config, "irq0").output_handler().set(FUNC(zorba_state::irq_w<0>));
+ INPUT_MERGER_ANY_HIGH(config, "irq1").output_handler().set(FUNC(zorba_state::irq_w<1>));
+ INPUT_MERGER_ANY_HIGH(config, "irq2").output_handler().set(FUNC(zorba_state::irq_w<2>));
/* devices */
Z80DMA(config, m_dma, 24_MHz_XTAL / 6);
@@ -215,25 +214,23 @@ MACHINE_CONFIG_START(zorba_state::zorba)
pit.out_handler<2>().append(m_uart2, FUNC(i8251_device::write_rxc));
// CRTC
- MCFG_DEVICE_ADD(m_crtc, I8275, 14.318'181_MHz_XTAL / 7)
- MCFG_I8275_CHARACTER_WIDTH(8)
- MCFG_I8275_DRAW_CHARACTER_CALLBACK_OWNER(zorba_state, zorba_update_chr)
- MCFG_I8275_DRQ_CALLBACK(WRITELINE(m_dma, z80dma_device, rdy_w))
- MCFG_I8275_IRQ_CALLBACK(WRITELINE("irq0", input_merger_device, in_w<1>))
- MCFG_VIDEO_SET_SCREEN("screen")
+ I8275(config, m_crtc, 14.318'181_MHz_XTAL / 7);
+ m_crtc->set_character_width(8);
+ m_crtc->set_display_callback(FUNC(zorba_state::zorba_update_chr), this);
+ m_crtc->drq_wr_callback().set(m_dma, FUNC(z80dma_device::rdy_w));
+ m_crtc->irq_wr_callback().set("irq0", FUNC(input_merger_device::in_w<1>));
+ m_crtc->set_screen("screen");
// Floppies
FD1793(config, m_fdc, 24_MHz_XTAL / 24);
m_fdc->intrq_wr_callback().set("irq2", FUNC(input_merger_device::in_w<0>));
m_fdc->drq_wr_callback().set("irq2", FUNC(input_merger_device::in_w<1>));
- MCFG_FLOPPY_DRIVE_ADD(m_floppy0, zorba_floppies, "525dd", floppy_image_device::default_floppy_formats)
- MCFG_FLOPPY_DRIVE_SOUND(true)
- MCFG_FLOPPY_DRIVE_ADD(m_floppy1, zorba_floppies, "525dd", floppy_image_device::default_floppy_formats)
- MCFG_FLOPPY_DRIVE_SOUND(true)
+ FLOPPY_CONNECTOR(config, m_floppy0, zorba_floppies, "525dd", floppy_image_device::default_floppy_formats).enable_sound(true);
+ FLOPPY_CONNECTOR(config, m_floppy1, zorba_floppies, "525dd", floppy_image_device::default_floppy_formats).enable_sound(true);
// J1 IEEE-488
- MCFG_IEEE488_BUS_ADD()
- MCFG_IEEE488_SRQ_CALLBACK(WRITELINE(m_pia1, pia6821_device, ca2_w)) // TODO: gated with PB1 from PIA
+ IEEE488(config, m_ieee);
+ m_ieee->srq_callback().set(m_pia1, FUNC(pia6821_device::ca2_w)); // TODO: gated with PB1 from PIA
// J2 EIA RS232/internal modem
// TODO: this has additional lines compared to a regular RS232 port (TxC in, RxC in, RxC out, speaker in, power)
@@ -243,13 +240,15 @@ MACHINE_CONFIG_START(zorba_state::zorba)
rs232.dsr_handler().set(m_uart0, FUNC(i8251_device::write_dsr));
// J3 Parallel printer
- MCFG_CENTRONICS_OUTPUT_LATCH_ADD("parprndata", "parprn")
centronics_device &parprn(CENTRONICS(config, "parprn", centronics_devices, "printer"));
parprn.busy_handler().set(m_uart1, FUNC(i8251_device::write_cts));
parprn.busy_handler().append(m_uart1, FUNC(i8251_device::write_dsr)); // TODO: shared with serial CTS
parprn.fault_handler().set(FUNC(zorba_state::printer_fault_w));
parprn.select_handler().set(FUNC(zorba_state::printer_select_w));
+ output_latch_device &parprndata(OUTPUT_LATCH(config, "parprndata"));
+ parprn.set_output_latch(parprndata);
+
// J3 Serial printer
rs232_port_device &serprn(RS232_PORT(config, "serprn", default_rs232_devices, nullptr));
serprn.rxd_handler().set(m_uart1, FUNC(i8251_device::write_rxd)); // TODO: this line has a LED attached
@@ -258,7 +257,7 @@ MACHINE_CONFIG_START(zorba_state::zorba)
ZORBA_KEYBOARD(config, "keyboard").rxd_cb().set(m_uart2, FUNC(i8251_device::write_rxd));
SOFTWARE_LIST(config, "flop_list").set_original("zorba");
-MACHINE_CONFIG_END
+}
//-------------------------------------------------
diff --git a/src/mame/drivers/zr107.cpp b/src/mame/drivers/zr107.cpp
index 93d2492e745..14ebfa5ec1e 100644
--- a/src/mame/drivers/zr107.cpp
+++ b/src/mame/drivers/zr107.cpp
@@ -253,7 +253,6 @@ protected:
WRITE_LINE_MEMBER(k054539_irq_gen);
double adc0838_callback(uint8_t input);
- void k054539_map(address_map &map);
void sharc_memmap(address_map &map);
void sound_memmap(address_map &map);
@@ -570,11 +569,6 @@ void zr107_state::sound_memmap(address_map &map)
map(0x580000, 0x580001).nopw(); // 'NRES' - D2: K056602 /RESET
}
-void zr107_state::k054539_map(address_map &map)
-{
- map(0x000000, 0x5fffff).rom().region("k054539", 0);
-}
-
/*****************************************************************************/
@@ -827,13 +821,13 @@ void zr107_state::zr107(machine_config &config)
SPEAKER(config, "rspeaker").front_right();
k054539_device &k054539_1(K054539(config, "k054539_1", XTAL(18'432'000)));
- k054539_1.set_addrmap(0, &zr107_state::k054539_map);
+ k054539_1.set_device_rom_tag("k054539");
k054539_1.timer_handler().set(FUNC(zr107_state::k054539_irq_gen));
k054539_1.add_route(0, "lspeaker", 0.75);
k054539_1.add_route(1, "rspeaker", 0.75);
k054539_device &k054539_2(K054539(config, "k054539_2", XTAL(18'432'000)));
- k054539_2.set_addrmap(0, &zr107_state::k054539_map);
+ k054539_2.set_device_rom_tag("k054539");
k054539_2.add_route(0, "lspeaker", 0.75);
k054539_2.add_route(1, "rspeaker", 0.75);
diff --git a/src/mame/drivers/zwackery.cpp b/src/mame/drivers/zwackery.cpp
index 3f3a2923cd7..d186fae1ba3 100644
--- a/src/mame/drivers/zwackery.cpp
+++ b/src/mame/drivers/zwackery.cpp
@@ -414,7 +414,7 @@ GFXDECODE_END
WRITE8_MEMBER( zwackery_state::pia1_porta_w )
{
- m_cheap_squeak_deluxe->sr_w(space, 0, data >> 4);
+ m_cheap_squeak_deluxe->sr_w(data >> 4);
}
@@ -479,7 +479,7 @@ READ8_MEMBER( zwackery_state::pia2_porta_r )
READ8_MEMBER( zwackery_state::ptm_r )
{
m_maincpu->adjust_icount(-14);
- return m_ptm->read(space, offset);
+ return m_ptm->read(offset);
}
void zwackery_state::machine_start()
diff --git a/src/mame/etc/korgm1.cpp b/src/mame/etc/korgm1.cpp
index fcc047054dd..6a5df1cd84c 100644
--- a/src/mame/etc/korgm1.cpp
+++ b/src/mame/etc/korgm1.cpp
@@ -167,32 +167,32 @@ PALETTE_INIT_MEMBER(korgm1_state, korgm1)
{
}
-MACHINE_CONFIG_START(korgm1_state::korgm1)
-
+void korgm1_state::korgm1(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu",V30,MAIN_CLOCK) // V50 actually
- MCFG_DEVICE_PROGRAM_MAP(korgm1_map)
- MCFG_DEVICE_IO_MAP(korgm1_io)
+ V30(config, m_maincpu, MAIN_CLOCK); // V50 actually
+ m_maincpu->set_addrmap(AS_PROGRAM, &korgm1_state::korgm1_map);
+ m_maincpu->set_addrmap(AS_IO, &korgm1_state::korgm1_io);
- MCFG_DEVICE_ADD("pio", CXD1095, 0)
+ CXD1095(config, "pio", 0);
/* video hardware */
/* TODO: LCD actually */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500))
- MCFG_SCREEN_UPDATE_DRIVER(korgm1_state, screen_update)
- MCFG_SCREEN_SIZE(32*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 0*8, 32*8-1)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500));
+ screen.set_screen_update(FUNC(korgm1_state::screen_update));
+ screen.set_size(32*8, 32*8);
+ screen.set_visarea(0*8, 32*8-1, 0*8, 32*8-1);
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_korgm1)
+ GFXDECODE(config, "gfxdecode", "palette", gfx_korgm1);
- MCFG_PALETTE_ADD("palette", 8)
+ PALETTE(config, "palette").set_entries(8);
/* sound hardware */
SPEAKER(config, "mono").front_center();
// AY8910(config, "aysnd", MAIN_CLOCK/4).add_route(ALL_OUTPUTS, "mono", 0.30);
-MACHINE_CONFIG_END
+}
/***************************************************************************
diff --git a/src/mame/etc/template_device.cpp b/src/mame/etc/template_device.cpp
index d1adea3448b..21226b79b1b 100644
--- a/src/mame/etc/template_device.cpp
+++ b/src/mame/etc/template_device.cpp
@@ -40,9 +40,10 @@ xxx_device::xxx_device(const machine_config &mconfig, const char *tag, device_t
// configuration addiitons
//-------------------------------------------------
-MACHINE_CONFIG_START(xxx_device::device_add_mconfig)
- //MCFG_DEVICE_ADD(...)
-MACHINE_CONFIG_END
+void xxx_device::device_add_mconfig(machine_config &config)
+{
+ //DEVICE(config, ...);
+}
//-------------------------------------------------
diff --git a/src/mame/etc/unkfr.cpp b/src/mame/etc/unkfr.cpp
index dd16171c298..4e7c2e7f566 100644
--- a/src/mame/etc/unkfr.cpp
+++ b/src/mame/etc/unkfr.cpp
@@ -60,8 +60,9 @@ static INPUT_PORTS_START( unkfr )
PORT_DIPSETTING( 0x80, DEF_STR( On ) )
INPUT_PORTS_END
-MACHINE_CONFIG_START( unkfr_state::unkfr )
-MACHINE_CONFIG_END
+void unkfr_state::unkfr(machine_config &config)
+{
+}
ROM_START( unkfr )
ROM_REGION( 0x800000, "unkroms", 0 )
diff --git a/src/mame/includes/8080bw.h b/src/mame/includes/8080bw.h
index ae5afda1711..62d1cc17340 100644
--- a/src/mame/includes/8080bw.h
+++ b/src/mame/includes/8080bw.h
@@ -78,6 +78,7 @@ public:
void init_attackfc();
DECLARE_CUSTOM_INPUT_MEMBER(sflush_80_r);
+ uint8_t sflush_in0_r();
DECLARE_INPUT_CHANGED_MEMBER(claybust_gun_trigger);
DECLARE_CUSTOM_INPUT_MEMBER(claybust_gun_on_r);
@@ -121,6 +122,7 @@ private:
DECLARE_READ8_MEMBER(darthvdr_01_r);
DECLARE_WRITE8_MEMBER(darthvdr_00_w);
DECLARE_WRITE8_MEMBER(darthvdr_08_w);
+ IRQ_CALLBACK_MEMBER(darthvdr_interrupt_vector);
DECLARE_WRITE8_MEMBER(ballbomb_01_w);
DECLARE_WRITE8_MEMBER(ballbomb_sh_port_1_w);
DECLARE_WRITE8_MEMBER(ballbomb_sh_port_2_w);
@@ -193,7 +195,7 @@ private:
uint32_t screen_update_shuttlei(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
uint32_t screen_update_spacecom(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
- INTERRUPT_GEN_MEMBER(polaris_interrupt);
+ DECLARE_WRITE_LINE_MEMBER(polaris_60hz_w);
TIMER_DEVICE_CALLBACK_MEMBER(claybust_gun_callback);
TIMER_DEVICE_CALLBACK_MEMBER(schaser_effect_555_cb);
DECLARE_WRITE8_MEMBER(indianbt_sh_port_3_w);
diff --git a/src/mame/includes/adam.h b/src/mame/includes/adam.h
index b1beee0caea..641f62705ea 100644
--- a/src/mame/includes/adam.h
+++ b/src/mame/includes/adam.h
@@ -7,8 +7,8 @@
#include "bus/adam/exp.h"
#include "bus/adamnet/adamnet.h"
-#include "bus/coleco/ctrl.h"
-#include "bus/coleco/exp.h"
+#include "bus/coleco/controller/ctrl.h"
+#include "bus/coleco/cartridge/exp.h"
#include "cpu/z80/z80.h"
#include "cpu/m6800/m6801.h"
#include "machine/coleco.h"
diff --git a/src/mame/includes/apollo.h b/src/mame/includes/apollo.h
index a0be6cfa14a..de0ff49865e 100644
--- a/src/mame/includes/apollo.h
+++ b/src/mame/includes/apollo.h
@@ -90,11 +90,6 @@ uint8_t apollo_get_ram_config_byte(void);
//apollo_get_node_id - get the node id
uint32_t apollo_get_node_id(void);
-#if 0
- // should be called by the CPU core before executing each instruction
-int apollo_instruction_hook(m68000_base_device *device, offs_t curpc);
-#endif
-
void apollo_set_cache_status_register(device_t *device,uint8_t mask, uint8_t data);
/*----------- machine/apollo.cpp -----------*/
@@ -265,7 +260,6 @@ public:
void select_dma_channel(int channel, bool state);
DECLARE_WRITE_LINE_MEMBER(apollo_reset_instr_callback);
- DECLARE_READ32_MEMBER(apollo_instruction_hook);
void common(machine_config &config);
void apollo(machine_config &config);
@@ -687,14 +681,14 @@ public:
private:
// device-level overrides
- virtual void device_start();
- virtual void device_reset();
- virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr);
+ virtual void device_start() override;
+ virtual void device_reset() override;
+ virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override;
// serial overrides
- virtual void rcv_complete(); // Rx completed receiving byte
- virtual void tra_complete(); // Tx completed sending byte
- virtual void tra_callback(); // Tx send bit
+ virtual void rcv_complete() override; // Rx completed receiving byte
+ virtual void tra_complete() override; // Tx completed sending byte
+ virtual void tra_callback() override; // Tx send bit
TIMER_CALLBACK_MEMBER( poll_timer );
void xmit_char(uint8_t data);
diff --git a/src/mame/includes/apple3.h b/src/mame/includes/apple3.h
index ef32b981503..58b86f1ee3b 100644
--- a/src/mame/includes/apple3.h
+++ b/src/mame/includes/apple3.h
@@ -88,21 +88,21 @@ public:
required_device<floppy_connector> floppy2;
required_device<floppy_connector> floppy3;
- DECLARE_READ8_MEMBER(apple3_memory_r);
- DECLARE_WRITE8_MEMBER(apple3_memory_w);
+ uint8_t apple3_memory_r(offs_t offset);
+ void apple3_memory_w(offs_t offset, uint8_t data);
DECLARE_WRITE_LINE_MEMBER(apple3_sync_w);
- DECLARE_READ8_MEMBER(apple3_c0xx_r);
- DECLARE_WRITE8_MEMBER(apple3_c0xx_w);
+ uint8_t apple3_c0xx_r(offs_t offset);
+ void apple3_c0xx_w(offs_t offset, uint8_t data);
void init_apple3();
virtual void machine_reset() override;
virtual void video_start() override;
uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
TIMER_CALLBACK_MEMBER(scanstart_cb);
TIMER_CALLBACK_MEMBER(scanend_cb);
- DECLARE_WRITE8_MEMBER(apple3_via_0_out_a);
- DECLARE_WRITE8_MEMBER(apple3_via_0_out_b);
- DECLARE_WRITE8_MEMBER(apple3_via_1_out_a);
- DECLARE_WRITE8_MEMBER(apple3_via_1_out_b);
+ void apple3_via_0_out_a(uint8_t data);
+ void apple3_via_0_out_b(uint8_t data);
+ void apple3_via_1_out_a(uint8_t data);
+ void apple3_via_1_out_b(uint8_t data);
void apple3_write_charmem();
void text40(bitmap_ind16 &bitmap, const rectangle &cliprect);
void text80(bitmap_ind16 &bitmap, const rectangle &cliprect);
diff --git a/src/mame/includes/ashnojoe.h b/src/mame/includes/ashnojoe.h
index 7f41d273276..458bc126c00 100644
--- a/src/mame/includes/ashnojoe.h
+++ b/src/mame/includes/ashnojoe.h
@@ -56,6 +56,7 @@ public:
/* sound-related */
uint8_t m_adpcm_byte;
+ int m_msm5205_vclk_toggle;
/* devices */
required_device<cpu_device> m_maincpu;
diff --git a/src/mame/includes/astrocde.h b/src/mame/includes/astrocde.h
index 9d5d437d627..9b1301b3897 100644
--- a/src/mame/includes/astrocde.h
+++ b/src/mame/includes/astrocde.h
@@ -129,6 +129,7 @@ public:
DECLARE_READ8_MEMBER(profpac_videoram_r);
DECLARE_WRITE8_MEMBER(profpac_videoram_w);
DECLARE_INPUT_CHANGED_MEMBER(spacezap_monitor);
+ DECLARE_WRITE_LINE_MEMBER(lightpen_trigger_w);
void init_profpac();
void init_spacezap();
void init_robby();
diff --git a/src/mame/includes/battlera.h b/src/mame/includes/battlera.h
index 66d577fe2ef..cbaae364261 100644
--- a/src/mame/includes/battlera.h
+++ b/src/mame/includes/battlera.h
@@ -32,6 +32,7 @@ public:
int m_control_port_select;
int m_msm5205next;
+ int m_toggle;
DECLARE_WRITE8_MEMBER(control_data_w);
DECLARE_READ8_MEMBER(control_data_r);
diff --git a/src/mame/includes/bbc.h b/src/mame/includes/bbc.h
index a912a651cde..3c733c2c291 100644
--- a/src/mame/includes/bbc.h
+++ b/src/mame/includes/bbc.h
@@ -38,6 +38,7 @@
#include "bus/rs232/rs232.h"
#include "bus/centronics/ctronics.h"
#include "bus/econet/econet.h"
+#include "bus/bbc/rom/slot.h"
#include "bus/bbc/fdc/fdc.h"
#include "bus/bbc/analogue/analogue.h"
#include "bus/bbc/1mhzbus/1mhzbus.h"
@@ -186,34 +187,6 @@ public:
void insert_device_rom(memory_region *rom);
void setup_device_roms();
- image_init_result load_rom16(device_image_interface &image, generic_slot_device *slot);
- DECLARE_DEVICE_IMAGE_LOAD_MEMBER(rom0) { return load_rom16(image, m_rom[0]); }
- DECLARE_DEVICE_IMAGE_LOAD_MEMBER(rom1) { return load_rom16(image, m_rom[1]); }
- DECLARE_DEVICE_IMAGE_LOAD_MEMBER(rom2) { return load_rom16(image, m_rom[2]); }
- DECLARE_DEVICE_IMAGE_LOAD_MEMBER(rom3) { return load_rom16(image, m_rom[3]); }
- DECLARE_DEVICE_IMAGE_LOAD_MEMBER(rom4) { return load_rom16(image, m_rom[4]); }
- DECLARE_DEVICE_IMAGE_LOAD_MEMBER(rom5) { return load_rom16(image, m_rom[5]); }
- DECLARE_DEVICE_IMAGE_LOAD_MEMBER(rom6) { return load_rom16(image, m_rom[6]); }
- DECLARE_DEVICE_IMAGE_LOAD_MEMBER(rom7) { return load_rom16(image, m_rom[7]); }
- DECLARE_DEVICE_IMAGE_LOAD_MEMBER(rom8) { return load_rom16(image, m_rom[8]); }
- DECLARE_DEVICE_IMAGE_LOAD_MEMBER(rom9) { return load_rom16(image, m_rom[9]); }
- DECLARE_DEVICE_IMAGE_LOAD_MEMBER(roma) { return load_rom16(image, m_rom[10]); }
- DECLARE_DEVICE_IMAGE_LOAD_MEMBER(romb) { return load_rom16(image, m_rom[11]); }
- DECLARE_DEVICE_IMAGE_LOAD_MEMBER(romc) { return load_rom16(image, m_rom[12]); }
- DECLARE_DEVICE_IMAGE_LOAD_MEMBER(romd) { return load_rom16(image, m_rom[13]); }
- DECLARE_DEVICE_IMAGE_LOAD_MEMBER(rome) { return load_rom16(image, m_rom[14]); }
- DECLARE_DEVICE_IMAGE_LOAD_MEMBER(romf) { return load_rom16(image, m_rom[15]); }
-
- image_init_result load_rom32(device_image_interface &image, generic_slot_device *slot);
- DECLARE_DEVICE_IMAGE_LOAD_MEMBER(rom01) { return load_rom32(image, m_rom[0]); }
- DECLARE_DEVICE_IMAGE_LOAD_MEMBER(rom23) { return load_rom32(image, m_rom[2]); }
- DECLARE_DEVICE_IMAGE_LOAD_MEMBER(rom45) { return load_rom32(image, m_rom[4]); }
- DECLARE_DEVICE_IMAGE_LOAD_MEMBER(rom67) { return load_rom32(image, m_rom[6]); }
- DECLARE_DEVICE_IMAGE_LOAD_MEMBER(rom89) { return load_rom32(image, m_rom[8]); }
- DECLARE_DEVICE_IMAGE_LOAD_MEMBER(romab) { return load_rom32(image, m_rom[10]); }
- DECLARE_DEVICE_IMAGE_LOAD_MEMBER(romcd) { return load_rom32(image, m_rom[12]); }
- DECLARE_DEVICE_IMAGE_LOAD_MEMBER(romef) { return load_rom32(image, m_rom[14]); }
-
image_init_result load_cart(device_image_interface &image, generic_slot_device *slot);
DECLARE_DEVICE_IMAGE_LOAD_MEMBER(cart1) { return load_cart(image, m_cart[0]); }
DECLARE_DEVICE_IMAGE_LOAD_MEMBER(cart2) { return load_cart(image, m_cart[1]); }
@@ -279,7 +252,7 @@ protected:
optional_device<i8271_device> m_i8271;
optional_device<wd1770_device> m_wd1770;
optional_device<wd1772_device> m_wd1772;
- optional_device_array<generic_slot_device, 16> m_rom;
+ optional_device_array<bbc_romslot_device, 16> m_rom;
optional_device_array<generic_slot_device, 2> m_cart;
required_memory_region m_region_mos;
@@ -327,7 +300,7 @@ protected:
int m_acccon_e;
int m_acccon_d;
- void mc146818_set(address_space &space);
+ void mc146818_set();
int m_mc146818_as; // 6522 port b bit 7
int m_mc146818_ce; // 6522 port b bit 6
diff --git a/src/mame/includes/btoads.h b/src/mame/includes/btoads.h
index 7dec9ad59f2..bfbe88dd255 100644
--- a/src/mame/includes/btoads.h
+++ b/src/mame/includes/btoads.h
@@ -21,9 +21,6 @@ class btoads_state : public driver_device
public:
btoads_state(const machine_config &mconfig, device_type type, const char *tag)
: driver_device(mconfig, type, tag),
- m_audiocpu(*this, "audiocpu"),
- m_bsmt(*this, "bsmt"),
- m_tlc34076(*this, "tlc34076"),
m_vram_fg0(*this, "vram_fg0", 16),
m_vram_fg1(*this, "vram_fg1", 16),
m_vram_fg_data(*this, "vram_fg_data"),
@@ -32,45 +29,16 @@ public:
m_sprite_scale(*this, "sprite_scale"),
m_sprite_control(*this, "sprite_control"),
m_maincpu(*this, "maincpu"),
+ m_audiocpu(*this, "audiocpu"),
+ m_bsmt(*this, "bsmt"),
+ m_tlc34076(*this, "tlc34076"),
m_screen(*this, "screen") { }
- // in drivers/btoads
- DECLARE_WRITE16_MEMBER( main_sound_w );
- DECLARE_READ16_MEMBER( main_sound_r );
DECLARE_CUSTOM_INPUT_MEMBER( main_to_sound_r );
DECLARE_CUSTOM_INPUT_MEMBER( sound_to_main_r );
- DECLARE_WRITE8_MEMBER( sound_data_w );
- DECLARE_READ8_MEMBER( sound_data_r );
- DECLARE_READ8_MEMBER( sound_ready_to_send_r );
- DECLARE_READ8_MEMBER( sound_data_ready_r );
- DECLARE_WRITE8_MEMBER( sound_int_state_w );
- DECLARE_READ8_MEMBER( bsmt_ready_r );
- DECLARE_WRITE8_MEMBER( bsmt2000_port_w );
-
- // in video/btoads
- DECLARE_WRITE16_MEMBER( misc_control_w );
- DECLARE_WRITE16_MEMBER( display_control_w );
- DECLARE_WRITE16_MEMBER( scroll0_w );
- DECLARE_WRITE16_MEMBER( scroll1_w );
- DECLARE_WRITE16_MEMBER( paletteram_w );
- DECLARE_READ16_MEMBER( paletteram_r );
- DECLARE_WRITE16_MEMBER( vram_bg0_w );
- DECLARE_WRITE16_MEMBER( vram_bg1_w );
- DECLARE_READ16_MEMBER( vram_bg0_r );
- DECLARE_READ16_MEMBER( vram_bg1_r );
- DECLARE_WRITE16_MEMBER( vram_fg_display_w );
- DECLARE_WRITE16_MEMBER( vram_fg_draw_w );
- DECLARE_READ16_MEMBER( vram_fg_display_r );
- DECLARE_READ16_MEMBER( vram_fg_draw_r );
- void render_sprite_row(uint16_t *sprite_source, uint32_t address);
- TMS340X0_TO_SHIFTREG_CB_MEMBER(to_shiftreg);
- TMS340X0_FROM_SHIFTREG_CB_MEMBER(from_shiftreg);
- TMS340X0_SCANLINE_RGB32_CB_MEMBER(scanline_update);
void btoads(machine_config &config);
- void main_map(address_map &map);
- void sound_io_map(address_map &map);
- void sound_map(address_map &map);
+
protected:
// device overrides
virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override;
@@ -79,6 +47,7 @@ protected:
virtual void machine_start() override;
virtual void video_start() override;
+private:
// timer IDs
enum
{
@@ -86,11 +55,6 @@ protected:
TIMER_ID_DELAYED_SOUND
};
- // devices
- required_device<z80_device> m_audiocpu;
- required_device<bsmt2000_device> m_bsmt;
- required_device<tlc34076_device> m_tlc34076;
-
// shared pointers
required_shared_ptr<uint8_t> m_vram_fg0;
required_shared_ptr<uint8_t> m_vram_fg1;
@@ -118,6 +82,46 @@ protected:
uint16_t m_sprite_dest_offs;
uint16_t m_misc_control;
int m_xcount;
+
+ // in drivers/btoads
+ DECLARE_WRITE16_MEMBER( main_sound_w );
+ DECLARE_READ16_MEMBER( main_sound_r );
+ DECLARE_WRITE8_MEMBER( sound_data_w );
+ DECLARE_READ8_MEMBER( sound_data_r );
+ DECLARE_READ8_MEMBER( sound_ready_to_send_r );
+ DECLARE_READ8_MEMBER( sound_data_ready_r );
+ DECLARE_WRITE8_MEMBER( sound_int_state_w );
+ DECLARE_READ8_MEMBER( bsmt_ready_r );
+ DECLARE_WRITE8_MEMBER( bsmt2000_port_w );
+
+ // in video/btoads
+ DECLARE_WRITE16_MEMBER( misc_control_w );
+ DECLARE_WRITE16_MEMBER( display_control_w );
+ DECLARE_WRITE16_MEMBER( scroll0_w );
+ DECLARE_WRITE16_MEMBER( scroll1_w );
+ DECLARE_WRITE16_MEMBER( paletteram_w );
+ DECLARE_READ16_MEMBER( paletteram_r );
+ DECLARE_WRITE16_MEMBER( vram_bg0_w );
+ DECLARE_WRITE16_MEMBER( vram_bg1_w );
+ DECLARE_READ16_MEMBER( vram_bg0_r );
+ DECLARE_READ16_MEMBER( vram_bg1_r );
+ DECLARE_WRITE16_MEMBER( vram_fg_display_w );
+ DECLARE_WRITE16_MEMBER( vram_fg_draw_w );
+ DECLARE_READ16_MEMBER( vram_fg_display_r );
+ DECLARE_READ16_MEMBER( vram_fg_draw_r );
+ void render_sprite_row(uint16_t *sprite_source, uint32_t address);
+ TMS340X0_TO_SHIFTREG_CB_MEMBER(to_shiftreg);
+ TMS340X0_FROM_SHIFTREG_CB_MEMBER(from_shiftreg);
+ TMS340X0_SCANLINE_RGB32_CB_MEMBER(scanline_update);
+
+ // devices
required_device<tms34020_device> m_maincpu;
+ required_device<z80_device> m_audiocpu;
+ required_device<bsmt2000_device> m_bsmt;
+ required_device<tlc34076_device> m_tlc34076;
required_device<screen_device> m_screen;
+
+ void main_map(address_map &map);
+ void sound_io_map(address_map &map);
+ void sound_map(address_map &map);
};
diff --git a/src/mame/includes/canyon.h b/src/mame/includes/canyon.h
index 09553046039..8fc9ce9f167 100644
--- a/src/mame/includes/canyon.h
+++ b/src/mame/includes/canyon.h
@@ -63,7 +63,7 @@ private:
required_shared_ptr<uint8_t> m_videoram;
required_device<f9334_device> m_outlatch;
- required_device<discrete_device> m_discrete;
+ required_device<discrete_sound_device> m_discrete;
/* video-related */
tilemap_t *m_bg_tilemap;
diff --git a/src/mame/includes/champbas.h b/src/mame/includes/champbas.h
index cec1f2fa6a9..341e3feb601 100644
--- a/src/mame/includes/champbas.h
+++ b/src/mame/includes/champbas.h
@@ -70,7 +70,6 @@ protected:
virtual void machine_start() override;
virtual void video_start() override;
- virtual void machine_reset() override;
void champbas_map(address_map &map);
void champbasj_map(address_map &map);
diff --git a/src/mame/includes/chessbase.h b/src/mame/includes/chessbase.h
new file mode 100644
index 00000000000..b02c0c04bd3
--- /dev/null
+++ b/src/mame/includes/chessbase.h
@@ -0,0 +1,70 @@
+// license:BSD-3-Clause
+// copyright-holders:hap
+/******************************************************************************
+*
+* Generic chess computers base driver
+* implementation is in machine/chessbase.cpp
+*
+******************************************************************************/
+
+#ifndef MAME_INCLUDES_CHESSBASE_H
+#define MAME_INCLUDES_CHESSBASE_H
+
+#pragma once
+
+#include "machine/timer.h"
+
+class chessbase_state : public driver_device
+{
+public:
+ chessbase_state(const machine_config &mconfig, device_type type, const char *tag) :
+ driver_device(mconfig, type, tag),
+ m_inp_matrix(*this, "IN.%u", 0),
+ m_out_x(*this, "%u.%u", 0U, 0U),
+ m_out_a(*this, "%u.a", 0U),
+ m_out_digit(*this, "digit%u", 0U),
+ m_display_wait(33),
+ m_display_maxy(1),
+ m_display_maxx(0)
+ { }
+
+protected:
+ // devices/pointers
+ optional_ioport_array<16> m_inp_matrix; // max 16
+ output_finder<0x20, 0x20> m_out_x;
+ output_finder<0x20> m_out_a;
+ output_finder<0x20> m_out_digit;
+
+ // misc common
+ u16 m_inp_mux; // multiplexed keypad/leds mask
+ u16 m_led_select;
+ u16 m_led_data;
+ u16 m_led_latch;
+ u32 m_7seg_data; // data for seg leds
+
+ u16 read_inputs(int columns);
+
+ // display common
+ int m_display_wait; // led/lamp off-delay in milliseconds (default 33ms)
+ int m_display_maxy; // display matrix number of rows
+ int m_display_maxx; // display matrix number of columns (max 31 for now)
+
+ u32 m_display_state[0x20]; // display matrix rows data (last bit is used for always-on)
+ u16 m_display_segmask[0x20]; // if not 0, display matrix row is a digit, mask indicates connected segments
+ u8 m_display_decay[0x20][0x20]; // (internal use)
+
+ TIMER_DEVICE_CALLBACK_MEMBER(display_decay_tick);
+ void display_update();
+ void set_display_size(int maxx, int maxy);
+ void set_display_segmask(u32 digits, u32 mask);
+ void display_matrix(int maxx, int maxy, u32 setx, u32 sety, bool update = true);
+
+ virtual void machine_start() override;
+ virtual void machine_reset() override;
+};
+
+
+INPUT_PORTS_EXTERN( generic_cb_buttons );
+INPUT_PORTS_EXTERN( generic_cb_magnets );
+
+#endif // MAME_INCLUDES_CHESSBASE_H
diff --git a/src/mame/includes/ckingbase.h b/src/mame/includes/ckingbase.h
new file mode 100644
index 00000000000..62ddaf60400
--- /dev/null
+++ b/src/mame/includes/ckingbase.h
@@ -0,0 +1,73 @@
+// license:BSD-3-Clause
+// copyright-holders:hap
+/******************************************************************************
+*
+* Chess King chess computer driver base class
+*
+******************************************************************************/
+
+#pragma once
+
+#ifndef MAME_INCLUDES_CKINGBASE_H
+#define MAME_INCLUDES_CKINGBASE_H
+
+#include "machine/timer.h"
+
+class ckingbase_state : public driver_device
+{
+public:
+ ckingbase_state(const machine_config &mconfig, device_type type, const char *tag) :
+ driver_device(mconfig, type, tag),
+ m_maincpu(*this, "maincpu"),
+ m_irq_on(*this, "irq_on"),
+ m_inp_matrix(*this, "IN.%u", 0),
+ m_out_x(*this, "%u.%u", 0U, 0U),
+ m_out_a(*this, "%u.a", 0U),
+ m_out_digit(*this, "digit%u", 0U),
+ m_display_wait(33),
+ m_display_maxy(1),
+ m_display_maxx(0)
+ { }
+
+ // devices/pointers
+ required_device<cpu_device> m_maincpu;
+ optional_device<timer_device> m_irq_on;
+ optional_ioport_array<10> m_inp_matrix; // max 10
+ output_finder<0x20, 0x20> m_out_x;
+ output_finder<0x20> m_out_a;
+ output_finder<0x20> m_out_digit;
+
+ // misc common
+ u16 m_inp_mux; // multiplexed keypad mask
+ u16 m_led_select;
+ u16 m_led_data;
+
+ u16 read_inputs(int columns);
+
+ // periodic interrupts
+ template<int Line> TIMER_DEVICE_CALLBACK_MEMBER(irq_on) { m_maincpu->set_input_line(Line, ASSERT_LINE); }
+ template<int Line> TIMER_DEVICE_CALLBACK_MEMBER(irq_off) { m_maincpu->set_input_line(Line, CLEAR_LINE); }
+
+ // display common
+ int m_display_wait; // led/lamp off-delay in milliseconds (default 33ms)
+ int m_display_maxy; // display matrix number of rows
+ int m_display_maxx; // display matrix number of columns (max 31 for now)
+
+ u32 m_display_state[0x20]; // display matrix rows data (last bit is used for always-on)
+ u16 m_display_segmask[0x20]; // if not 0, display matrix row is a digit, mask indicates connected segments
+ u8 m_display_decay[0x20][0x20]; // (internal use)
+
+ TIMER_DEVICE_CALLBACK_MEMBER(display_decay_tick);
+ void display_update();
+ void set_display_size(int maxx, int maxy);
+ void display_matrix(int maxx, int maxy, u32 setx, u32 sety, bool update = true);
+
+protected:
+ virtual void machine_start() override;
+ virtual void machine_reset() override;
+};
+
+
+INPUT_PORTS_EXTERN( cking_cb_buttons );
+
+#endif // MAME_INCLUDES_CKINGBASE_H
diff --git a/src/mame/includes/coco12.h b/src/mame/includes/coco12.h
index dcfe82c895b..267c5c5807a 100644
--- a/src/mame/includes/coco12.h
+++ b/src/mame/includes/coco12.h
@@ -72,6 +72,7 @@ protected:
private:
void configure_sam(void);
+protected:
required_device<mc6847_base_device> m_vdg;
};
diff --git a/src/mame/includes/coleco.h b/src/mame/includes/coleco.h
index 742f7a387dd..3367bd3ac38 100644
--- a/src/mame/includes/coleco.h
+++ b/src/mame/includes/coleco.h
@@ -11,7 +11,7 @@
#include "sound/sn76496.h"
#include "video/tms9928a.h"
#include "machine/coleco.h"
-#include "bus/coleco/exp.h"
+#include "bus/coleco/cartridge/exp.h"
class coleco_state : public driver_device
{
diff --git a/src/mame/includes/concept.h b/src/mame/includes/concept.h
index e9f90eeba2c..8471f0c7eb6 100644
--- a/src/mame/includes/concept.h
+++ b/src/mame/includes/concept.h
@@ -41,6 +41,9 @@ public:
m_videoram(*this,"videoram")
{ }
+ void concept(machine_config &config);
+
+private:
required_device<cpu_device> m_maincpu;
required_device<mos6551_device> m_acia0;
required_device<mos6551_device> m_acia1;
@@ -54,8 +57,8 @@ public:
uint8_t m_pending_interrupts;
bool m_clock_enable;
uint8_t m_clock_address;
- DECLARE_READ16_MEMBER(concept_io_r);
- DECLARE_WRITE16_MEMBER(concept_io_w);
+ DECLARE_READ8_MEMBER(io_r);
+ DECLARE_WRITE8_MEMBER(io_w);
virtual void machine_start() override;
virtual void machine_reset() override;
virtual void video_start() override;
@@ -67,8 +70,9 @@ public:
DECLARE_WRITE8_MEMBER(via_out_b);
DECLARE_WRITE_LINE_MEMBER(via_out_cb2);
DECLARE_WRITE_LINE_MEMBER(via_irq_func);
+ DECLARE_WRITE_LINE_MEMBER(ioc_interrupt);
void concept_set_interrupt(int level, int state);
- void concept(machine_config &config);
+
void concept_memmap(address_map &map);
};
diff --git a/src/mame/includes/cosmic.h b/src/mame/includes/cosmic.h
index 9f19c85b4c7..7d4c6edddf1 100644
--- a/src/mame/includes/cosmic.h
+++ b/src/mame/includes/cosmic.h
@@ -75,6 +75,7 @@ public:
DECLARE_WRITE8_MEMBER(dac_w);
DECLARE_READ8_MEMBER(cosmica_pixel_clock_r);
DECLARE_READ8_MEMBER(cosmicg_port_0_r);
+ DECLARE_READ8_MEMBER(cosmicg_port_1_r);
DECLARE_READ8_MEMBER(magspot_coinage_dip_r);
DECLARE_READ8_MEMBER(nomnlnd_port_0_1_r);
DECLARE_WRITE8_MEMBER(flip_screen_w);
diff --git a/src/mame/includes/cps1.h b/src/mame/includes/cps1.h
index 8134893c5e4..2edf51d21d3 100644
--- a/src/mame/includes/cps1.h
+++ b/src/mame/includes/cps1.h
@@ -236,6 +236,7 @@ public:
DECLARE_WRITE16_MEMBER(punipic_layer_w);
DECLARE_WRITE16_MEMBER(sf2mdt_layer_w);
DECLARE_WRITE16_MEMBER(sf2mdta_layer_w);
+ DECLARE_WRITE16_MEMBER(sf2b_layer_w);
DECLARE_WRITE16_MEMBER(slampic_layer_w);
DECLARE_WRITE16_MEMBER(fcrash_soundlatch_w);
DECLARE_WRITE8_MEMBER(fcrash_snd_bankswitch_w);
diff --git a/src/mame/includes/cps3.h b/src/mame/includes/cps3.h
index 694117a4946..bd7064c18a7 100644
--- a/src/mame/includes/cps3.h
+++ b/src/mame/includes/cps3.h
@@ -1,5 +1,10 @@
// license:BSD-3-Clause
// copyright-holders:David Haywood, Andreas Naive, Tomasz Slanina, ElSemi
+#ifndef MAME_INCLUDES_CPS3_H
+#define MAME_INCLUDES_CPS3_H
+
+#pragma once
+
/***************************************************************************
Capcom CPS-3 Hardware
@@ -44,6 +49,33 @@ public:
{
}
+ void init_sfiii3();
+ void init_sfiii();
+ void init_redearth();
+ void init_jojo();
+ void init_jojoba();
+ void init_sfiii2();
+ void init_cps3boot();
+
+ void cps3(machine_config &config);
+ void jojo(machine_config &config);
+ void redearth(machine_config &config);
+ void sfiii2(machine_config &config);
+ void sfiii3(machine_config &config);
+ void sfiii(machine_config &config);
+ void jojoba(machine_config &config);
+ void simm1_64mbit(machine_config &config);
+ void simm2_64mbit(machine_config &config);
+ void simm3_128mbit(machine_config &config);
+ void simm4_128mbit(machine_config &config);
+ void simm5_128mbit(machine_config &config);
+ void simm5_32mbit(machine_config &config);
+ void simm6_128mbit(machine_config &config);
+
+protected:
+ virtual void device_post_load() override;
+ void copy_from_nvram();
+ uint32_t m_current_table_address;
required_device<sh2_device> m_maincpu;
required_device<gfxdecode_device> m_gfxdecode;
required_device<palette_device> m_palette;
@@ -65,6 +97,7 @@ public:
optional_memory_region m_user4_region;
optional_memory_region m_user5_region;
+private:
uint32_t m_cram_gfxflash_bank;
std::unique_ptr<uint32_t[]> m_char_ram;
std::unique_ptr<uint32_t[]> m_eeprom;
@@ -90,7 +123,6 @@ public:
uint32_t m_paldma_length;
uint32_t m_chardma_source;
uint32_t m_chardma_other;
- uint32_t m_current_table_address;
int m_rle_length;
int m_last_normal_byte;
unsigned short m_lastb;
@@ -125,14 +157,8 @@ public:
DECLARE_WRITE32_MEMBER(cps3_unk_vidregs_w);
DECLARE_READ32_MEMBER(cps3_colourram_r);
DECLARE_WRITE32_MEMBER(cps3_colourram_w);
- void init_sfiii3();
- void init_sfiii();
- void init_redearth();
- void init_jojo();
- void init_jojoba();
- void init_sfiii2();
- void init_cps3boot();
SH2_DMA_KLUDGE_CB(dma_callback);
+ virtual void machine_start() override;
virtual void machine_reset() override;
virtual void video_start() override;
void draw_fg_layer(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
@@ -143,7 +169,6 @@ public:
uint16_t rotxor(uint16_t val, uint16_t xorval);
uint32_t cps3_mask(uint32_t address, uint32_t key1, uint32_t key2);
void cps3_decrypt_bios();
- void init_common(void);
void init_crypt(uint32_t key1, uint32_t key2, int altEncryption);
void cps3_set_mame_colours(int colournum, uint16_t data, uint32_t fadeval);
void cps3_draw_tilemapsprite_line(int tmnum, int drawline, bitmap_rgb32 &bitmap, const rectangle &cliprect );
@@ -154,25 +179,12 @@ public:
uint32_t ProcessByte8(uint8_t b,uint32_t dst_offset);
void cps3_do_alt_char_dma( uint32_t src, uint32_t real_dest, uint32_t real_length );
void cps3_process_character_dma(uint32_t address);
- void copy_from_nvram();
inline void cps3_drawgfxzoom(bitmap_rgb32 &dest_bmp, const rectangle &clip, gfx_element *gfx,
unsigned int code, unsigned int color, int flipx, int flipy, int sx, int sy,
int transparency, int transparent_color,
int scalex, int scaley, bitmap_ind8 *pri_buffer, uint32_t pri_mask);
- void cps3(machine_config &config);
- void jojo(machine_config &config);
- void redearth(machine_config &config);
- void sfiii2(machine_config &config);
- void sfiii3(machine_config &config);
- void sfiii(machine_config &config);
- void jojoba(machine_config &config);
- void simm1_64mbit(machine_config &config);
- void simm2_64mbit(machine_config &config);
- void simm3_128mbit(machine_config &config);
- void simm4_128mbit(machine_config &config);
- void simm5_128mbit(machine_config &config);
- void simm5_32mbit(machine_config &config);
- void simm6_128mbit(machine_config &config);
void cps3_map(address_map &map);
void decrypted_opcodes_map(address_map &map);
};
+
+#endif // MAME_INCLUDES_CPS3_H
diff --git a/src/mame/includes/crospang.h b/src/mame/includes/crospang.h
index 45fe72ef674..c470eeaaab7 100644
--- a/src/mame/includes/crospang.h
+++ b/src/mame/includes/crospang.h
@@ -27,16 +27,27 @@ public:
, m_soundlatch(*this, "soundlatch")
{ }
+ void crospang(machine_config &config);
+ void bestri(machine_config &config);
+ void bestria(machine_config &config);
+ void pitapat(machine_config &config);
+
+protected:
+ virtual void machine_start() override;
+ virtual void machine_reset() override;
+ virtual void video_start() override;
+
+private:
/* memory pointers */
- required_shared_ptr<uint16_t> m_fg_videoram;
- required_shared_ptr<uint16_t> m_bg_videoram;
- required_shared_ptr<uint16_t> m_spriteram;
+ required_shared_ptr<u16> m_fg_videoram;
+ required_shared_ptr<u16> m_bg_videoram;
+ required_shared_ptr<u16> m_spriteram;
/* video-related */
tilemap_t *m_bg_layer;
tilemap_t *m_fg_layer;
- uint8_t m_bestri_tilebank[4];
- uint8_t m_bestri_tilebankselect;
+ u8 m_tilebank[4];
+ u8 m_tilebankselect;
/* devices */
required_device<cpu_device> m_maincpu;
@@ -44,37 +55,28 @@ public:
required_device<gfxdecode_device> m_gfxdecode;
required_device<generic_latch_8_device> m_soundlatch;
- DECLARE_WRITE16_MEMBER(bestri_tilebank_data_w);
- DECLARE_WRITE16_MEMBER(bestri_tilebank_select_w);
- DECLARE_WRITE16_MEMBER(bestri_bg_scrolly_w);
- DECLARE_WRITE16_MEMBER(bestri_fg_scrolly_w);
- DECLARE_WRITE16_MEMBER(bestri_fg_scrollx_w);
- DECLARE_WRITE16_MEMBER(bestri_bg_scrollx_w);
- DECLARE_WRITE16_MEMBER(crospang_fg_scrolly_w);
- DECLARE_WRITE16_MEMBER(crospang_bg_scrolly_w);
- DECLARE_WRITE16_MEMBER(crospang_fg_scrollx_w);
- DECLARE_WRITE16_MEMBER(crospang_bg_scrollx_w);
- DECLARE_WRITE16_MEMBER(crospang_fg_videoram_w);
- DECLARE_WRITE16_MEMBER(crospang_bg_videoram_w);
- void init_crospang();
+ void tilebank_data_w(u16 data);
+ void tilebank_select_w(u16 data);
+ void bestri_bg_scrolly_w(u16 data);
+ void bestri_fg_scrolly_w(u16 data);
+ void bestri_fg_scrollx_w(u16 data);
+ void bestri_bg_scrollx_w(u16 data);
+ void fg_scrolly_w(u16 data);
+ void bg_scrolly_w(u16 data);
+ void fg_scrollx_w(u16 data);
+ void bg_scrollx_w(u16 data);
+ void fg_videoram_w(offs_t offset, u16 data, u16 mem_mask = ~0);
+ void bg_videoram_w(offs_t offset, u16 data, u16 mem_mask = ~0);
TILE_GET_INFO_MEMBER(get_bg_tile_info);
TILE_GET_INFO_MEMBER(get_fg_tile_info);
- virtual void machine_start() override;
- virtual void machine_reset() override;
- virtual void video_start() override;
- uint32_t screen_update_crospang(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
- void tumblepb_gfx1_rearrange();
- void crospang(machine_config &config);
- void bestri(machine_config &config);
- void bestria(machine_config &config);
- void pitapat(machine_config &config);
+ u32 screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
+ void base_map(address_map &map);
void bestri_map(address_map &map);
void bestria_map(address_map &map);
- void pitapat_map(address_map &map);
- void crospang_base_map(address_map &map);
void crospang_map(address_map &map);
- void crospang_sound_io_map(address_map &map);
- void crospang_sound_map(address_map &map);
+ void pitapat_map(address_map &map);
+ void sound_io_map(address_map &map);
+ void sound_map(address_map &map);
};
#endif // MAME_INCLUDES_CROSPANG_H
diff --git a/src/mame/includes/cxgbase.h b/src/mame/includes/cxgbase.h
new file mode 100644
index 00000000000..d543d1b7d28
--- /dev/null
+++ b/src/mame/includes/cxgbase.h
@@ -0,0 +1,76 @@
+// license:BSD-3-Clause
+// copyright-holders:hap
+/******************************************************************************
+*
+* CXG chess computer driver base class
+*
+******************************************************************************/
+
+#pragma once
+
+#ifndef MAME_INCLUDES_CXGBASE_H
+#define MAME_INCLUDES_CXGBASE_H
+
+#include "machine/timer.h"
+#include "sound/dac.h"
+
+class cxgbase_state : public driver_device
+{
+public:
+ cxgbase_state(const machine_config &mconfig, device_type type, const char *tag) :
+ driver_device(mconfig, type, tag),
+ m_maincpu(*this, "maincpu"),
+ m_irq_on(*this, "irq_on"),
+ m_dac(*this, "dac"),
+ m_inp_matrix(*this, "IN.%u", 0),
+ m_out_x(*this, "%u.%u", 0U, 0U),
+ m_out_a(*this, "%u.a", 0U),
+ m_out_digit(*this, "digit%u", 0U),
+ m_display_wait(33),
+ m_display_maxy(1),
+ m_display_maxx(0)
+ { }
+
+ // devices/pointers
+ required_device<cpu_device> m_maincpu;
+ optional_device<timer_device> m_irq_on;
+ optional_device<dac_bit_interface> m_dac;
+ optional_ioport_array<10> m_inp_matrix; // max 10
+ output_finder<0x20, 0x20> m_out_x;
+ output_finder<0x20> m_out_a;
+ output_finder<0x20> m_out_digit;
+
+ // misc common
+ u16 m_inp_mux; // multiplexed keypad mask
+ u16 m_led_select;
+ u16 m_led_data;
+
+ u16 read_inputs(int columns);
+
+ // periodic interrupts
+ template<int Line> TIMER_DEVICE_CALLBACK_MEMBER(irq_on) { m_maincpu->set_input_line(Line, ASSERT_LINE); }
+ template<int Line> TIMER_DEVICE_CALLBACK_MEMBER(irq_off) { m_maincpu->set_input_line(Line, CLEAR_LINE); }
+
+ // display common
+ int m_display_wait; // led/lamp off-delay in milliseconds (default 33ms)
+ int m_display_maxy; // display matrix number of rows
+ int m_display_maxx; // display matrix number of columns (max 31 for now)
+
+ u32 m_display_state[0x20]; // display matrix rows data (last bit is used for always-on)
+ u16 m_display_segmask[0x20]; // if not 0, display matrix row is a digit, mask indicates connected segments
+ u8 m_display_decay[0x20][0x20]; // (internal use)
+
+ TIMER_DEVICE_CALLBACK_MEMBER(display_decay_tick);
+ void display_update();
+ void set_display_size(int maxx, int maxy);
+ void display_matrix(int maxx, int maxy, u32 setx, u32 sety, bool update = true);
+
+protected:
+ virtual void machine_start() override;
+ virtual void machine_reset() override;
+};
+
+
+INPUT_PORTS_EXTERN( cxg_cb_magnets );
+
+#endif // MAME_INCLUDES_CXGBASE_H
diff --git a/src/mame/includes/dccons.h b/src/mame/includes/dccons.h
index 127c46d558d..fb2573ed057 100644
--- a/src/mame/includes/dccons.h
+++ b/src/mame/includes/dccons.h
@@ -28,6 +28,7 @@ public:
void init_dc();
void init_dcus();
void init_dcjp();
+ void init_tream();
DECLARE_READ64_MEMBER(dcus_idle_skip_r);
DECLARE_READ64_MEMBER(dcjp_idle_skip_r);
diff --git a/src/mame/includes/dcheese.h b/src/mame/includes/dcheese.h
index 14db4da22a0..be29fe707ac 100644
--- a/src/mame/includes/dcheese.h
+++ b/src/mame/includes/dcheese.h
@@ -23,6 +23,9 @@ public:
driver_device(mconfig, type, tag),
m_palrom(*this, "palrom"),
m_gfxrom(*this, "gfx"),
+ m_eepromout_io(*this, "EEPROMOUT"),
+ m_2a0002_io(*this, "2a0002"),
+ m_2a000e_io(*this, "2a000e"),
m_maincpu(*this, "maincpu"),
m_audiocpu(*this, "audiocpu"),
m_screen(*this, "screen"),
@@ -48,23 +51,26 @@ protected:
virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override;
private:
- required_region_ptr<uint16_t> m_palrom;
- required_region_ptr<uint8_t> m_gfxrom;
+ required_region_ptr<u16> m_palrom;
+ required_region_ptr<u8> m_gfxrom;
+ required_ioport m_eepromout_io;
+ required_ioport m_2a0002_io;
+ required_ioport m_2a000e_io;
/* video-related */
- uint16_t m_blitter_color[2];
- uint16_t m_blitter_xparam[16];
- uint16_t m_blitter_yparam[16];
- uint16_t m_blitter_vidparam[32];
+ u16 m_blitter_color[2];
+ u16 m_blitter_xparam[16];
+ u16 m_blitter_yparam[16];
+ u16 m_blitter_vidparam[32];
std::unique_ptr<bitmap_ind16> m_dstbitmap;
emu_timer *m_blitter_timer;
emu_timer *m_signal_irq_timer;
/* misc */
- uint8_t m_irq_state[5];
- uint8_t m_sound_control;
- uint8_t m_sound_msb_latch;
+ u8 m_irq_state[5];
+ u8 m_sound_control;
+ u8 m_sound_msb_latch;
/* devices */
required_device<cpu_device> m_maincpu;
@@ -84,9 +90,9 @@ private:
DECLARE_WRITE16_MEMBER(blitter_unknown_w);
DECLARE_READ16_MEMBER(blitter_vidparam_r);
void dcheese_palette(palette_device &palette) const;
- uint32_t screen_update_dcheese(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
- INTERRUPT_GEN_MEMBER(dcheese_vblank);
- void dcheese_signal_irq(int which);
+ u32 screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
+ INTERRUPT_GEN_MEMBER(vblank);
+ void signal_irq(u8 which);
void update_irq_state();
IRQ_CALLBACK_MEMBER(irq_callback);
void update_scanline_irq();
diff --git a/src/mame/includes/dec0.h b/src/mame/includes/dec0.h
index b56afa57d41..d3ccfe67c48 100644
--- a/src/mame/includes/dec0.h
+++ b/src/mame/includes/dec0.h
@@ -5,7 +5,6 @@
#pragma once
-#include "machine/74157.h"
#include "cpu/h6280/h6280.h"
#include "cpu/mcs51/mcs51.h"
#include "machine/74157.h"
@@ -51,6 +50,7 @@ public:
void midresbj(machine_config &config);
void slyspy(machine_config &config);
void hbarrel(machine_config &config);
+ void bandit(machine_config &config);
void midresb(machine_config &config);
void ffantasybl(machine_config &config);
void drgninjab(machine_config &config);
@@ -141,6 +141,7 @@ private:
DECLARE_VIDEO_START(dec0);
uint32_t screen_update_hbarrel(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
+ uint32_t screen_update_bandit(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
uint32_t screen_update_baddudes(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
uint32_t screen_update_birdtry(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
uint32_t screen_update_robocop(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
@@ -154,6 +155,7 @@ private:
void dec0_i8751_reset();
void h6280_decrypt(const char *cputag);
void dec0_map(address_map &map);
+ void dec0_tb_map(address_map &map);
void dec0_s_map(address_map &map);
void hippodrm_map(address_map &map);
void hippodrm_sub_map(address_map &map);
diff --git a/src/mame/includes/dragrace.h b/src/mame/includes/dragrace.h
index 459d36ad141..5ee3b611cfb 100644
--- a/src/mame/includes/dragrace.h
+++ b/src/mame/includes/dragrace.h
@@ -77,7 +77,7 @@ private:
int m_gear[2];
/* devices */
- required_device<discrete_device> m_discrete;
+ required_device<discrete_sound_device> m_discrete;
required_device<cpu_device> m_maincpu;
required_device<watchdog_timer_device> m_watchdog;
required_device<gfxdecode_device> m_gfxdecode;
diff --git a/src/mame/includes/esd16.h b/src/mame/includes/esd16.h
index 126880dcda9..21d84172f45 100644
--- a/src/mame/includes/esd16.h
+++ b/src/mame/includes/esd16.h
@@ -19,14 +19,14 @@ class esd16_state : public driver_device
public:
esd16_state(const machine_config &mconfig, device_type type, const char *tag) :
driver_device(mconfig, type, tag),
- m_vram_0(*this, "vram_0"),
- m_vram_1(*this, "vram_1"),
- m_scroll_0(*this, "scroll_0"),
- m_scroll_1(*this, "scroll_1"),
+ m_vram(*this, "vram_%u", 0U),
+ m_scroll(*this, "scroll_%u", 0U),
m_spriteram(*this, "spriteram"),
m_head_layersize(*this, "head_layersize"),
m_headpanic_platform_x(*this, "platform_x"),
m_headpanic_platform_y(*this, "platform_y"),
+ m_audiobank(*this, "audiobank"),
+ m_io_eepromout(*this, "EEPROMOUT"),
m_maincpu(*this, "maincpu"),
m_audiocpu(*this, "audiocpu"),
m_gfxdecode(*this, "gfxdecode"),
@@ -49,22 +49,20 @@ protected:
private:
/* memory pointers */
- required_shared_ptr<uint16_t> m_vram_0;
- required_shared_ptr<uint16_t> m_vram_1;
- required_shared_ptr<uint16_t> m_scroll_0;
- required_shared_ptr<uint16_t> m_scroll_1;
- required_shared_ptr<uint16_t> m_spriteram;
- required_shared_ptr<uint16_t> m_head_layersize;
- required_shared_ptr<uint16_t> m_headpanic_platform_x;
- required_shared_ptr<uint16_t> m_headpanic_platform_y;
+ required_shared_ptr_array<u16, 2> m_vram;
+ required_shared_ptr_array<u16, 2> m_scroll;
+ required_shared_ptr<u16> m_spriteram;
+ required_shared_ptr<u16> m_head_layersize;
+ required_shared_ptr<u16> m_headpanic_platform_x;
+ required_shared_ptr<u16> m_headpanic_platform_y;
+
+ optional_memory_bank m_audiobank;
+ optional_ioport m_io_eepromout;
/* video-related */
- tilemap_t *m_tilemap_0_16x16;
- tilemap_t *m_tilemap_1_16x16;
- tilemap_t *m_tilemap_0;
- tilemap_t *m_tilemap_1;
- int m_tilemap0_color;
- int m_tilemap1_color;
+ tilemap_t *m_tilemap_16x16[2];
+ tilemap_t *m_tilemap[2];
+ int m_tilemap_color[2];
/* devices */
required_device<cpu_device> m_maincpu;
@@ -74,36 +72,32 @@ private:
optional_device<eeprom_serial_93cxx_device> m_eeprom;
required_device<generic_latch_8_device> m_soundlatch;
- DECLARE_WRITE16_MEMBER(esd16_sound_command_w);
- DECLARE_WRITE16_MEMBER(hedpanic_platform_w);
- DECLARE_READ16_MEMBER(esd_eeprom_r);
- DECLARE_WRITE16_MEMBER(esd_eeprom_w);
- DECLARE_WRITE8_MEMBER(esd16_sound_rombank_w);
- DECLARE_READ8_MEMBER(esd16_sound_command_r);
- DECLARE_WRITE16_MEMBER(esd16_vram_0_w);
- DECLARE_WRITE16_MEMBER(esd16_vram_1_w);
- DECLARE_WRITE16_MEMBER(esd16_tilemap0_color_w);
- DECLARE_WRITE16_MEMBER(esd16_tilemap0_color_jumppop_w);
- TILE_GET_INFO_MEMBER(get_tile_info_0);
- TILE_GET_INFO_MEMBER(get_tile_info_0_16x16);
- TILE_GET_INFO_MEMBER(get_tile_info_1);
- TILE_GET_INFO_MEMBER(get_tile_info_1_16x16);
- uint32_t screen_update_hedpanic(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
- DECOSPR_PRIORITY_CB_MEMBER(hedpanic_pri_callback);
+ DECLARE_WRITE8_MEMBER(sound_command_w);
+ void hedpanic_platform_w(u16 data);
+ u8 eeprom_r();
+ void eeprom_w(u8 data);
+ void sound_rombank_w(u8 data);
+ template<unsigned Layer> void vram_w(offs_t offset, u16 data, u16 mem_mask = ~0);
+ void tilemap0_color_w(u16 data);
+ void tilemap0_color_jumppop_w(u16 data);
+ template<unsigned Layer> TILE_GET_INFO_MEMBER(get_tile_info);
+ template<unsigned Layer> TILE_GET_INFO_MEMBER(get_tile_info_16x16);
+ u32 screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
+ DECOSPR_PRIORITY_CB_MEMBER(pri_callback);
void hedpanic_map(address_map &map);
void jumppop_map(address_map &map);
void mchampdx_map(address_map &map);
void multchmp_map(address_map &map);
- void multchmp_sound_io_map(address_map &map);
- void multchmp_sound_map(address_map &map);
+ void sound_io_map(address_map &map);
+ void sound_map(address_map &map);
void tangtang_map(address_map &map);
- void esd16_io_area_dsw(address_map &map, u32 base);
- void esd16_io_area_eeprom(address_map &map, u32 base);
- void esd16_vid_attr_area(address_map &map, u32 base);
- void esd16_palette_area(address_map &map, u32 base);
- void esd16_sprite_area(address_map &map, u32 base);
- void esd16_vram_area(address_map &map, u32 base);
+ void io_area_dsw(address_map &map, u32 base);
+ void io_area_eeprom(address_map &map, u32 base);
+ void palette_area(address_map &map, u32 base);
+ void sprite_area(address_map &map, u32 base);
+ void vid_attr_area(address_map &map, u32 base);
+ void vram_area(address_map &map, u32 base);
};
#endif // MAME_INCLUDES_ESD16_H
diff --git a/src/mame/includes/fidelbase.h b/src/mame/includes/fidelbase.h
index ea803d63ccf..1a232d9bab5 100644
--- a/src/mame/includes/fidelbase.h
+++ b/src/mame/includes/fidelbase.h
@@ -2,16 +2,19 @@
// copyright-holders:hap
/******************************************************************************
*
-* Fidelity Electronics chess machines base class
-* main driver is fidelz80.cpp
+* Fidelity Electronics chess computers base driver
+* implementation is in machine/fidelbase.cpp
*
******************************************************************************/
-#pragma once
-
#ifndef MAME_INCLUDES_FIDELBASE_H
#define MAME_INCLUDES_FIDELBASE_H
+#pragma once
+
+#include "includes/chessbase.h"
+
+#include "machine/bankdev.h"
#include "machine/timer.h"
#include "sound/dac.h"
#include "sound/s14001a.h"
@@ -19,70 +22,63 @@
#include "bus/generic/carts.h"
#include "softlist.h"
-class fidelbase_state : public driver_device
+class fidelbase_state : public chessbase_state
{
public:
- fidelbase_state(const machine_config &mconfig, device_type type, const char *tag)
- : driver_device(mconfig, type, tag),
+ fidelbase_state(const machine_config &mconfig, device_type type, const char *tag) :
+ chessbase_state(mconfig, type, tag),
m_maincpu(*this, "maincpu"),
- m_inp_matrix(*this, "IN.%u", 0),
- m_out_x(*this, "%u.%u", 0U, 0U),
- m_out_a(*this, "%u.a", 0U),
- m_out_digit(*this, "digit%u", 0U),
+ m_irq_on(*this, "irq_on"),
+ m_rombank(*this, "rombank"),
+ m_mainmap(*this, "mainmap"),
+ m_div_config(*this, "div_config"),
m_speech(*this, "speech"),
m_speech_rom(*this, "speech"),
+ m_language(*this, "language"),
m_dac(*this, "dac"),
- m_cart(*this, "cartslot"),
- m_display_wait(33),
- m_display_maxy(1),
- m_display_maxx(0)
+ m_cart(*this, "cartslot")
{ }
+ // in case reset button is directly tied to maincpu reset pin
+ virtual DECLARE_INPUT_CHANGED_MEMBER(reset_button) { m_maincpu->set_input_line(INPUT_LINE_RESET, newval ? ASSERT_LINE : CLEAR_LINE); }
+
+protected:
// devices/pointers
required_device<cpu_device> m_maincpu;
- optional_ioport_array<11> m_inp_matrix; // max 11
- output_finder<0x20, 0x20> m_out_x;
- output_finder<0x20> m_out_a;
- output_finder<0x20> m_out_digit;
+ optional_device<timer_device> m_irq_on;
+ optional_memory_bank m_rombank;
+ optional_device<address_map_bank_device> m_mainmap;
+ optional_ioport m_div_config;
optional_device<s14001a_device> m_speech;
optional_region_ptr<u8> m_speech_rom;
+ optional_region_ptr<u8> m_language;
optional_device<dac_bit_interface> m_dac;
optional_device<generic_slot_device> m_cart;
- // misc common
- u16 m_inp_mux; // multiplexed keypad/leds mask
- u16 m_led_select;
- u32 m_7seg_data; // data for seg leds
- u16 m_led_data;
u8 m_speech_data;
- u8 m_speech_bank; // speech rom higher address bits
+ u8 m_speech_bank; // speech rom higher address bits
- u16 read_inputs(int columns);
+ // cross-compatible cartridges(opening book modules)
DECLARE_DEVICE_IMAGE_LOAD_MEMBER(scc_cartridge);
virtual DECLARE_READ8_MEMBER(cartridge_r);
- // display common
- int m_display_wait; // led/lamp off-delay in milliseconds (default 33ms)
- int m_display_maxy; // display matrix number of rows
- int m_display_maxx; // display matrix number of columns (max 31 for now)
+ // periodic interrupts
+ template<int Line> TIMER_DEVICE_CALLBACK_MEMBER(irq_on) { m_maincpu->set_input_line(Line, ASSERT_LINE); }
+ template<int Line> TIMER_DEVICE_CALLBACK_MEMBER(irq_off) { m_maincpu->set_input_line(Line, CLEAR_LINE); }
- u32 m_display_state[0x20]; // display matrix rows data (last bit is used for always-on)
- u16 m_display_segmask[0x20]; // if not 0, display matrix row is a digit, mask indicates connected segments
- u8 m_display_decay[0x20][0x20]; // (internal use)
+ // dynamic cpu divider
+ void div_trampoline_w(offs_t offset, u8 data);
+ u8 div_trampoline_r(offs_t offset);
+ void div_set_cpu_freq(offs_t offset);
+ void div_trampoline(address_map &map);
+ u16 m_div_status;
- TIMER_DEVICE_CALLBACK_MEMBER(display_decay_tick);
- void display_update();
- void set_display_size(int maxx, int maxy);
- void set_display_segmask(u32 digits, u32 mask);
- void display_matrix(int maxx, int maxy, u32 setx, u32 sety, bool update = true);
-
-protected:
virtual void machine_start() override;
virtual void machine_reset() override;
};
-INPUT_PORTS_EXTERN( fidel_cb_buttons );
-INPUT_PORTS_EXTERN( fidel_cb_magnets );
+INPUT_PORTS_EXTERN( fidel_cpu_div_2 );
+INPUT_PORTS_EXTERN( fidel_cpu_div_4 );
#endif // MAME_INCLUDES_FIDELBASE_H
diff --git a/src/mame/includes/funworld.h b/src/mame/includes/funworld.h
index d2e631f97e1..34859d8d5e8 100644
--- a/src/mame/includes/funworld.h
+++ b/src/mame/includes/funworld.h
@@ -12,10 +12,10 @@ class funworld_state : public driver_device
public:
funworld_state(const machine_config &mconfig, device_type type, const char *tag) :
driver_device(mconfig, type, tag),
+ m_maincpu(*this, "maincpu"),
m_gfxdecode(*this, "gfxdecode"),
m_videoram(*this, "videoram"),
m_colorram(*this, "colorram"),
- m_maincpu(*this, "maincpu"),
m_palette(*this, "palette"),
m_lamps(*this, "lamp%u", 0U)
{ }
@@ -33,6 +33,8 @@ public:
void fw_brick_2(machine_config &config);
void init_saloon();
+ void init_royalcdc();
+ void init_multiwin();
void init_mongolnw();
void init_soccernw();
void init_tabblue();
@@ -53,6 +55,7 @@ protected:
void magicrd2_map(address_map &map);
+ required_device<cpu_device> m_maincpu;
required_device<gfxdecode_device> m_gfxdecode;
tilemap_t *m_bg_tilemap = nullptr;
@@ -73,7 +76,6 @@ private:
required_shared_ptr<uint8_t> m_videoram;
required_shared_ptr<uint8_t> m_colorram;
- required_device<cpu_device> m_maincpu;
required_device<palette_device> m_palette;
output_finder<8> m_lamps;
};
diff --git a/src/mame/includes/gaelco2.h b/src/mame/includes/gaelco2.h
index f7d4f336e5b..ccacfef6737 100644
--- a/src/mame/includes/gaelco2.h
+++ b/src/mame/includes/gaelco2.h
@@ -10,17 +10,18 @@
class gaelco2_state : public driver_device
{
public:
- gaelco2_state(const machine_config &mconfig, device_type type, const char *tag)
- : driver_device(mconfig, type, tag),
- m_maincpu(*this,"maincpu"),
+ gaelco2_state(const machine_config &mconfig, device_type type, const char *tag) :
+ driver_device(mconfig, type, tag),
+ m_maincpu(*this, "maincpu"),
m_mainlatch(*this, "mainlatch"),
- m_spriteram(*this,"spriteram"),
+ m_spriteram(*this, "spriteram"),
m_eeprom(*this, "eeprom"),
m_gfxdecode(*this, "gfxdecode"),
m_palette(*this, "palette"),
+ m_global_spritexoff(0),
m_vregs(*this, "vregs"),
m_snowboar_protection(*this, "snowboar_prot"),
- m_generic_paletteram_16(*this, "paletteram"),
+ m_paletteram(*this, "paletteram"),
m_shareram(*this, "shareram")
{ }
@@ -37,8 +38,10 @@ public:
void init_touchgo();
void init_snowboar();
+ void init_snowboara();
void init_alighunt();
void init_wrally2();
+ void init_play2000();
DECLARE_WRITE_LINE_MEMBER(coin1_counter_w);
DECLARE_WRITE_LINE_MEMBER(coin2_counter_w);
@@ -46,9 +49,9 @@ public:
DECLARE_VIDEO_START(gaelco2);
DECLARE_VIDEO_START(gaelco2_dual);
- uint32_t screen_update_gaelco2(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
- uint32_t screen_update_gaelco2_left(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
- uint32_t screen_update_gaelco2_right(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
+ u32 screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
+ u32 screen_update_left(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
+ u32 screen_update_right(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
protected:
required_device<m68000_device> m_maincpu;
@@ -58,30 +61,27 @@ protected:
required_device<gfxdecode_device> m_gfxdecode;
required_device<palette_device> m_palette;
- DECLARE_WRITE16_MEMBER(gaelco2_vram_w);
- DECLARE_WRITE16_MEMBER(gaelco2_palette_w);
+ void vram_w(offs_t offset, u16 data, u16 mem_mask = ~0);
+ void vregs_w(offs_t offset, u16 data, u16 mem_mask = ~0);
+ void palette_w(offs_t offset, u16 data, u16 mem_mask = ~0);
- DECLARE_WRITE16_MEMBER(wrally2_latch_w);
+ void wrally2_latch_w(offs_t offset, u16 data);
void mcu_hostmem_map(address_map &map);
private:
- DECLARE_WRITE8_MEMBER(shareram_w);
- DECLARE_READ8_MEMBER(shareram_r);
- DECLARE_WRITE16_MEMBER(alighunt_coin_w);
+ void shareram_w(offs_t offset, u8 data);
+ u8 shareram_r(offs_t offset);
+ void alighunt_coin_w(u16 data);
DECLARE_WRITE_LINE_MEMBER(coin3_counter_w);
DECLARE_WRITE_LINE_MEMBER(coin4_counter_w);
- DECLARE_READ16_MEMBER(snowboar_protection_r);
- DECLARE_WRITE16_MEMBER(snowboar_protection_w);
- DECLARE_READ16_MEMBER(play2000_shareram_68k_r);
- DECLARE_WRITE16_MEMBER(play2000_shareram_68k_w);
- TILE_GET_INFO_MEMBER(get_tile_info_gaelco2_screen0);
- TILE_GET_INFO_MEMBER(get_tile_info_gaelco2_screen1);
- TILE_GET_INFO_MEMBER(get_tile_info_gaelco2_screen0_dual);
- TILE_GET_INFO_MEMBER(get_tile_info_gaelco2_screen1_dual);
- void draw_sprites(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, int mask, int xoffs);
- uint32_t dual_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, int index);
- void gaelco2_ROM16_split_gfx(const char *src_reg, const char *dst_reg, int start, int length, int dest1, int dest2);
+ u16 snowboar_protection_r();
+ void snowboar_protection_w(offs_t offset, u16 data, u16 mem_mask = ~0);
+ template<unsigned Layer> TILE_GET_INFO_MEMBER(get_tile_info);
+ template<unsigned Layer> TILE_GET_INFO_MEMBER(get_tile_info_dual);
+ void draw_sprites(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, int mask);
+ u32 dual_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, int index);
+ void ROM16_split_gfx(const char *src_reg, const char *dst_reg, int start, int length, int dest1, int dest2);
void alighunt_map(address_map &map);
void maniacsq_map(address_map &map);
@@ -90,16 +90,17 @@ private:
void touchgo_map(address_map &map);
void saltcrdi_map(address_map &map);
- uint32_t snowboard_latch;
+ u32 m_snowboard_latch;
- uint16_t *m_videoram;
+ u16 *m_videoram;
tilemap_t *m_pant[2];
int m_dual_monitor;
+ int m_global_spritexoff;
- required_shared_ptr<uint16_t> m_vregs;
- optional_shared_ptr<uint16_t> m_snowboar_protection;
- required_shared_ptr<uint16_t> m_generic_paletteram_16;
- optional_shared_ptr<uint16_t> m_shareram;
+ required_shared_ptr<u16> m_vregs;
+ optional_shared_ptr<u16> m_snowboar_protection;
+ required_shared_ptr<u16> m_paletteram;
+ optional_shared_ptr<u16> m_shareram;
};
@@ -126,11 +127,11 @@ private:
int m_clr_gun_int;
- DECLARE_READ16_MEMBER(p1_gun_x);
- DECLARE_READ16_MEMBER(p1_gun_y);
- DECLARE_READ16_MEMBER(p2_gun_x);
- DECLARE_READ16_MEMBER(p2_gun_y);
- DECLARE_WRITE16_MEMBER(bang_clr_gun_int_w);
+ u16 p1_gun_x();
+ u16 p1_gun_y();
+ u16 p2_gun_x();
+ u16 p2_gun_y();
+ void bang_clr_gun_int_w(u16 data);
TIMER_DEVICE_CALLBACK_MEMBER(bang_irq);
void bang_map(address_map &map);
};
diff --git a/src/mame/includes/galastrm.h b/src/mame/includes/galastrm.h
index b17966c18b1..024f59c2593 100644
--- a/src/mame/includes/galastrm.h
+++ b/src/mame/includes/galastrm.h
@@ -9,6 +9,7 @@
#include "video/poly.h"
#include "video/tc0100scn.h"
+#include "video/tc0110pcr.h"
#include "video/tc0480scp.h"
#include "emupal.h"
@@ -44,11 +45,12 @@ class galastrm_state : public driver_device
public:
galastrm_state(const machine_config &mconfig, device_type type, const char *tag) :
driver_device(mconfig, type, tag),
- m_ram(*this,"ram"),
- m_spriteram(*this,"spriteram") ,
+ m_spriteram(*this,"spriteram"),
+ m_spritemap_rom(*this, "sprmaprom"),
m_maincpu(*this, "maincpu"),
m_eeprom(*this, "eeprom"),
m_tc0100scn(*this, "tc0100scn"),
+ m_tc0110pcr(*this, "tc0110pcr"),
m_tc0480scp(*this, "tc0480scp"),
m_gfxdecode(*this, "gfxdecode"),
m_screen(*this, "screen"),
@@ -62,12 +64,14 @@ protected:
virtual void video_start() override;
private:
- required_shared_ptr<uint32_t> m_ram;
required_shared_ptr<uint32_t> m_spriteram;
+ required_region_ptr<uint16_t> m_spritemap_rom;
+
required_device<cpu_device> m_maincpu;
required_device<eeprom_serial_93cxx_device> m_eeprom;
required_device<tc0100scn_device> m_tc0100scn;
+ required_device<tc0110pcr_device> m_tc0110pcr;
required_device<tc0480scp_device> m_tc0480scp;
required_device<gfxdecode_device> m_gfxdecode;
required_device<screen_device> m_screen;
@@ -84,9 +88,7 @@ private:
};
uint16_t m_frame_counter;
- int m_tc0110pcr_addr;
- int m_tc0610_0_addr;
- int m_tc0610_1_addr;
+ int m_tc0610_addr[2];
int16_t m_tc0610_ctrl_reg[2][8];
std::unique_ptr<gs_tempsprite[]> m_spritelist;
struct gs_tempsprite *m_sprite_ptr_pre;
@@ -98,9 +100,7 @@ private:
int m_rsxoffs;
int m_rsyoffs;
- DECLARE_WRITE32_MEMBER(palette_w);
- DECLARE_WRITE32_MEMBER(tc0610_0_w);
- DECLARE_WRITE32_MEMBER(tc0610_1_w);
+ template<int Chip> DECLARE_WRITE16_MEMBER(tc0610_w);
DECLARE_WRITE8_MEMBER(coin_word_w);
uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
INTERRUPT_GEN_MEMBER(interrupt);
diff --git a/src/mame/includes/galaxian.h b/src/mame/includes/galaxian.h
index 95f75b9d29a..a6b7bdef871 100644
--- a/src/mame/includes/galaxian.h
+++ b/src/mame/includes/galaxian.h
@@ -235,10 +235,11 @@ public:
TILE_GET_INFO_MEMBER(bg_get_tile_info);
void galaxian_palette(palette_device &palette);
void moonwar_palette(palette_device &palette);
+ void eagle_palette(palette_device &palette);
void tenspot_set_game_bank(int bank, int from_game);
uint32_t screen_update_galaxian(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
DECLARE_WRITE_LINE_MEMBER(vblank_interrupt_w);
- DECLARE_WRITE_LINE_MEMBER(tenspot_interrupt_w);
+ DECLARE_INPUT_CHANGED_MEMBER(tenspot_fake);
TIMER_DEVICE_CALLBACK_MEMBER(checkmaj_irq0_gen);
TIMER_DEVICE_CALLBACK_MEMBER(scramble_stars_blink_timer);
TIMER_DEVICE_CALLBACK_MEMBER(timefgtr_scanline);
@@ -334,6 +335,7 @@ public:
void takeoff(machine_config &config);
void sfx(machine_config &config);
void mooncrst(machine_config &config);
+ void eagle(machine_config &config);
void scorpion(machine_config &config);
void frogf(machine_config &config);
void amigo2(machine_config &config);
@@ -424,7 +426,7 @@ protected:
required_device<screen_device> m_screen;
required_device<palette_device> m_palette;
optional_device<generic_latch_8_device> m_soundlatch;
- optional_device<discrete_device> m_discrete;
+ optional_device<discrete_sound_device> m_discrete;
optional_ioport m_fake_select;
optional_ioport_array<10> m_tenspot_game_dsw;
diff --git a/src/mame/includes/galaxold.h b/src/mame/includes/galaxold.h
index 33ff44e778d..71c91132daf 100644
--- a/src/mame/includes/galaxold.h
+++ b/src/mame/includes/galaxold.h
@@ -300,7 +300,7 @@ public:
void mooncrst_audio(machine_config &config);
void _4in1_map(address_map &map);
void bagmanmc_map(address_map &map);
- void bongo(address_map &map);
+ void bongo_map(address_map &map);
void bongo_io(address_map &map);
void bullsdrtg_data_map(address_map &map);
void ckongg_map(address_map &map);
@@ -313,7 +313,7 @@ public:
void guttang_map(address_map &map);
void hexpoola_data(address_map &map);
void hexpoola_io(address_map &map);
- void hunchbkg(address_map &map);
+ void hunchbkg_map(address_map &map);
void hunchbkg_data(address_map &map);
void hustlerb3_map(address_map &map);
void mooncrst_map(address_map &map);
@@ -327,8 +327,8 @@ public:
void scramb3_map(address_map &map);
void scramblb_map(address_map &map);
void scrambler_map(address_map &map);
- void spcwarp(address_map &map);
- void tazzmang(address_map &map);
+ void spcwarp_map(address_map &map);
+ void tazzmang_map(address_map &map);
protected:
virtual void machine_start() override { m_leds.resolve(); }
diff --git a/src/mame/includes/galivan.h b/src/mame/includes/galivan.h
index 6d25df2de94..cb694f624a2 100644
--- a/src/mame/includes/galivan.h
+++ b/src/mame/includes/galivan.h
@@ -21,9 +21,9 @@ class galivan_state : public driver_device
public:
galivan_state(const machine_config &mconfig, device_type type, const char *tag) :
driver_device(mconfig, type, tag),
+ m_maincpu(*this, "maincpu"),
m_videoram(*this, "videoram"),
m_spriteram(*this, "spriteram"),
- m_maincpu(*this, "maincpu"),
m_nb1414m4(*this, "nb1414m4"),
m_gfxdecode(*this, "gfxdecode"),
m_palette(*this, "palette"),
@@ -39,6 +39,8 @@ public:
protected:
void io_map(address_map &map);
+ required_device<cpu_device> m_maincpu;
+
private:
/* memory pointers */
required_shared_ptr<uint8_t> m_videoram;
@@ -84,7 +86,7 @@ private:
uint32_t screen_update_galivan(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
uint32_t screen_update_ninjemak(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
void draw_sprites( bitmap_ind16 &bitmap, const rectangle &cliprect );
- required_device<cpu_device> m_maincpu;
+
optional_device<nb1414m4_device> m_nb1414m4;
required_device<gfxdecode_device> m_gfxdecode;
required_device<palette_device> m_palette;
diff --git a/src/mame/includes/gyruss.h b/src/mame/includes/gyruss.h
index 1857fdd6576..e3ffb3c164e 100644
--- a/src/mame/includes/gyruss.h
+++ b/src/mame/includes/gyruss.h
@@ -43,7 +43,7 @@ private:
required_device<cpu_device> m_subcpu;
required_device<cpu_device> m_audiocpu;
required_device<i8039_device> m_audiocpu_2;
- required_device<discrete_device> m_discrete;
+ required_device<discrete_sound_device> m_discrete;
required_shared_ptr<uint8_t> m_colorram;
required_shared_ptr<uint8_t> m_videoram;
required_shared_ptr<uint8_t> m_spriteram;
diff --git a/src/mame/includes/harddriv.h b/src/mame/includes/harddriv.h
index aab3b1897b6..1952d022f5b 100644
--- a/src/mame/includes/harddriv.h
+++ b/src/mame/includes/harddriv.h
@@ -134,7 +134,7 @@ protected:
DECLARE_READ16_MEMBER( hd68k_zram_r );
DECLARE_WRITE16_MEMBER( hd68k_zram_w );
- DECLARE_WRITE16_MEMBER( hdgsp_io_w );
+ void hdgsp_io_w(offs_t offset, u16 data, u16 mem_mask = ~u16(0));
DECLARE_WRITE16_MEMBER( hdgsp_protection_w );
diff --git a/src/mame/includes/hec2hrp.h b/src/mame/includes/hec2hrp.h
index b96590ef949..6fb37b2ba14 100644
--- a/src/mame/includes/hec2hrp.h
+++ b/src/mame/includes/hec2hrp.h
@@ -84,19 +84,19 @@ public:
hec2hrp_state(const machine_config &mconfig, device_type type, const char *tag)
: driver_device(mconfig, type, tag),
m_maincpu(*this, "maincpu"),
- m_disc2cpu(*this, "disc2cpu"),
m_cassette(*this, "cassette"),
+ m_printer(*this, "printer"),
+ m_palette(*this, "palette"),
+ m_disc2cpu(*this, "disc2cpu"),
m_discrete(*this, "discrete"),
m_sn(*this, "sn76477"),
- m_palette(*this, "palette"),
m_videoram(*this,"videoram"),
m_hector_videoram(*this,"hector_videoram") ,
m_keyboard(*this, "KEY.%u", 0),
m_minidisc_fdc(*this, "wd179x"),
m_floppy0(*this, "wd179x:0"),
m_upd_fdc(*this, "upd765"),
- m_upd_connector(*this, "upd765:%u", 0U),
- m_printer(*this, "printer")
+ m_upd_connector(*this, "upd765:%u", 0U)
{}
void hec2mx80(machine_config &config);
@@ -123,6 +123,11 @@ protected:
DECLARE_WRITE8_MEMBER(color_a_w);
DECLARE_WRITE8_MEMBER(color_b_w);
+ required_device<cpu_device> m_maincpu;
+ required_device<cassette_image_device> m_cassette;
+ optional_device<printer_image_device> m_printer;
+ required_device<palette_device> m_palette;
+
private:
DECLARE_WRITE8_MEMBER(minidisc_control_w);
@@ -146,12 +151,9 @@ private:
DECLARE_FLOPPY_FORMATS(minidisc_formats);
- required_device<cpu_device> m_maincpu;
optional_device<cpu_device> m_disc2cpu;
- required_device<cassette_image_device> m_cassette;
required_device<discrete_device> m_discrete;
required_device<sn76477_device> m_sn;
- required_device<palette_device> m_palette;
optional_shared_ptr<uint8_t> m_videoram;
optional_shared_ptr<uint8_t> m_hector_videoram;
required_ioport_array<9> m_keyboard;
@@ -162,8 +164,6 @@ private:
optional_device<upd765a_device> m_upd_fdc;
optional_device_array<floppy_connector, 2> m_upd_connector;
- optional_device<printer_image_device> m_printer;
-
uint8_t m_hector_flag_hr;
uint8_t m_hector_flag_80c;
uint8_t m_hector_color[4];
diff --git a/src/mame/includes/hh_sm510.h b/src/mame/includes/hh_sm510.h
index f9b7a67f0e5..23cf7cd0242 100644
--- a/src/mame/includes/hh_sm510.h
+++ b/src/mame/includes/hh_sm510.h
@@ -17,8 +17,8 @@
class hh_sm510_state : public driver_device
{
public:
- hh_sm510_state(const machine_config &mconfig, device_type type, const char *tag)
- : driver_device(mconfig, type, tag),
+ hh_sm510_state(const machine_config &mconfig, device_type type, const char *tag) :
+ driver_device(mconfig, type, tag),
m_maincpu(*this, "maincpu"),
m_inp_matrix(*this, "IN.%u", 0),
m_out_x(*this, "%u.%u.%u", 0U, 0U, 0U),
@@ -30,7 +30,7 @@ public:
// devices
required_device<sm510_base_device> m_maincpu;
- optional_ioport_array<8> m_inp_matrix; // max 8
+ optional_ioport_array<8+1> m_inp_matrix; // max 8
output_finder<16, 16, 4> m_out_x;
optional_device<speaker_sound_device> m_speaker;
@@ -42,6 +42,7 @@ public:
u8 m_s; // MCU S output pins
u8 m_r; // MCU R output pins
+ void inp_fixed_last() { m_inp_fixed = -2; } // last input line to GND
u8 read_inputs(int columns, int fixed = -1);
virtual void update_k_line();
diff --git a/src/mame/includes/hh_tms1k.h b/src/mame/includes/hh_tms1k.h
index 8e6dc3826a0..c595772468b 100644
--- a/src/mame/includes/hh_tms1k.h
+++ b/src/mame/includes/hh_tms1k.h
@@ -19,6 +19,7 @@
#include "cpu/tms1000/tms0980.h"
#include "cpu/tms1000/tms0270.h"
#include "cpu/tms1000/tp0320.h"
+
#include "machine/timer.h"
#include "sound/spkrdev.h"
@@ -26,8 +27,8 @@
class hh_tms1k_state : public driver_device
{
public:
- hh_tms1k_state(const machine_config &mconfig, device_type type, const char *tag)
- : driver_device(mconfig, type, tag),
+ hh_tms1k_state(const machine_config &mconfig, device_type type, const char *tag) :
+ driver_device(mconfig, type, tag),
m_maincpu(*this, "maincpu"),
m_inp_matrix(*this, "IN.%u", 0),
m_out_x(*this, "%u.%u", 0U, 0U),
@@ -56,10 +57,15 @@ public:
u8 read_inputs(int columns);
u8 read_rotated_inputs(int columns, u8 rowmask = 0xf);
+ virtual DECLARE_INPUT_CHANGED_MEMBER(reset_button);
virtual DECLARE_INPUT_CHANGED_MEMBER(power_button);
virtual DECLARE_WRITE_LINE_MEMBER(auto_power_off);
virtual void power_off();
+ void switch_change(int sel, u32 mask, bool next);
+ template<int Sel> DECLARE_INPUT_CHANGED_MEMBER(switch_next) { if (newval) switch_change(Sel, (u32)(uintptr_t)param, true); }
+ template<int Sel> DECLARE_INPUT_CHANGED_MEMBER(switch_prev) { if (newval) switch_change(Sel, (u32)(uintptr_t)param, false); }
+
// display common
int m_display_wait; // led/lamp off-delay in milliseconds (default 33ms)
int m_display_maxy; // display matrix number of rows
@@ -84,17 +90,4 @@ protected:
};
-// LED segments
-enum
-{
- lA = 0x01,
- lB = 0x02,
- lC = 0x04,
- lD = 0x08,
- lE = 0x10,
- lF = 0x20,
- lG = 0x40,
- lDP = 0x80
-};
-
#endif // MAME_INCLUDES_HH_TMS1K_H
diff --git a/src/mame/includes/hh_ucom4.h b/src/mame/includes/hh_ucom4.h
index efc32cf54a0..0c11889a8fd 100644
--- a/src/mame/includes/hh_ucom4.h
+++ b/src/mame/includes/hh_ucom4.h
@@ -17,8 +17,8 @@
class hh_ucom4_state : public driver_device
{
public:
- hh_ucom4_state(const machine_config &mconfig, device_type type, const char *tag)
- : driver_device(mconfig, type, tag),
+ hh_ucom4_state(const machine_config &mconfig, device_type type, const char *tag) :
+ driver_device(mconfig, type, tag),
m_maincpu(*this, "maincpu"),
m_inp_matrix(*this, "IN.%u", 0),
m_out_x(*this, "%u.%u", 0U, 0U),
diff --git a/src/mame/includes/homedata.h b/src/mame/includes/homedata.h
index 14c53106dec..886b1341ff0 100644
--- a/src/mame/includes/homedata.h
+++ b/src/mame/includes/homedata.h
@@ -5,6 +5,7 @@
#pragma once
+#include "machine/bankdev.h"
#include "machine/gen_latch.h"
#include "sound/sn76496.h"
#include "sound/2203intf.h"
@@ -17,13 +18,18 @@ public:
driver_device(mconfig, type, tag),
m_vreg(*this, "vreg"),
m_videoram(*this, "videoram"),
+ m_blit_rom(*this, "blit_rom"),
+ m_mainbank(*this, "mainbank"),
+ m_audiobank(*this, "audiobank"),
m_maincpu(*this, "maincpu"),
m_audiocpu(*this, "audiocpu"),
m_ymsnd(*this, "ymsnd"),
m_gfxdecode(*this, "gfxdecode"),
m_palette(*this, "palette"),
m_soundlatch(*this, "soundlatch"),
- m_sn(*this, "snsnd")
+ m_mainlatch(*this, "mainlatch"),
+ m_sn(*this, "snsnd"),
+ m_mrokumei_soundbank(*this, "mrokumei_soundbank")
{
}
@@ -31,12 +37,12 @@ public:
void mrokumei(machine_config &config);
void mirderby(machine_config &config);
void pteacher(machine_config &config);
+ void jogakuen(machine_config &config);
void lemnangl(machine_config &config);
+ void mjikaga(machine_config &config);
void mjkinjas(machine_config &config);
void init_reikaids();
- void init_mjikaga();
- void init_jogakuen();
void init_battlcry();
void init_mirderby();
@@ -45,6 +51,11 @@ private:
optional_shared_ptr<uint8_t> m_vreg;
required_shared_ptr<uint8_t> m_videoram;
+ optional_region_ptr<uint8_t> m_blit_rom;
+
+ optional_memory_bank m_mainbank;
+ optional_memory_bank m_audiobank;
+
/* video-related */
tilemap_t *m_bg_tilemap[2][4];
int m_visible_page;
@@ -59,13 +70,9 @@ private:
/* misc */
int m_vblank;
- int m_sndbank;
int m_keyb;
- int m_snd_command;
int m_upd7807_porta;
int m_upd7807_portc;
- int m_to_cpu;
- int m_from_cpu;
/* device */
required_device<cpu_device> m_maincpu;
@@ -73,34 +80,30 @@ private:
optional_device<ym2203_device> m_ymsnd;
required_device<gfxdecode_device> m_gfxdecode;
required_device<palette_device> m_palette;
- optional_device<generic_latch_8_device> m_soundlatch; // mrokumei
+ optional_device<generic_latch_8_device> m_soundlatch;
+ optional_device<generic_latch_8_device> m_mainlatch; // pteacher
optional_device<sn76489a_device> m_sn; // mrokumei and pteacher
+ optional_device<address_map_bank_device> m_mrokumei_soundbank; // mrokumei
uint8_t m_prot_data;
DECLARE_READ8_MEMBER(mrokumei_keyboard_r);
DECLARE_WRITE8_MEMBER(mrokumei_keyboard_select_w);
- DECLARE_READ8_MEMBER(mrokumei_sound_io_r);
DECLARE_WRITE8_MEMBER(mrokumei_sound_bank_w);
DECLARE_WRITE8_MEMBER(mrokumei_sound_cmd_w);
DECLARE_READ8_MEMBER(reikaids_upd7807_porta_r);
DECLARE_WRITE8_MEMBER(reikaids_upd7807_porta_w);
DECLARE_WRITE8_MEMBER(reikaids_upd7807_portc_w);
DECLARE_READ8_MEMBER(reikaids_io_r);
- DECLARE_READ8_MEMBER(reikaids_snd_command_r);
- DECLARE_WRITE8_MEMBER(reikaids_snd_command_w);
- DECLARE_WRITE8_MEMBER(pteacher_snd_command_w);
- DECLARE_READ8_MEMBER(pteacher_snd_r);
DECLARE_READ8_MEMBER(pteacher_io_r);
DECLARE_READ8_MEMBER(pteacher_keyboard_r);
DECLARE_READ8_MEMBER(pteacher_upd7807_porta_r);
- DECLARE_WRITE8_MEMBER(pteacher_snd_answer_w);
DECLARE_WRITE8_MEMBER(pteacher_upd7807_porta_w);
DECLARE_WRITE8_MEMBER(pteacher_upd7807_portc_w);
DECLARE_WRITE8_MEMBER(bankswitch_w);
DECLARE_READ8_MEMBER(mirderby_prot_r);
DECLARE_WRITE8_MEMBER(mirderby_prot_w);
- DECLARE_WRITE8_MEMBER(mrokumei_videoram_w);
- DECLARE_WRITE8_MEMBER(reikaids_videoram_w);
+ void mrokumei_videoram_w(offs_t offset, u8 data);
+ void reikaids_videoram_w(offs_t offset, u8 data);
DECLARE_WRITE8_MEMBER(reikaids_gfx_bank_w);
DECLARE_WRITE8_MEMBER(pteacher_gfx_bank_w);
DECLARE_WRITE8_MEMBER(homedata_blitter_param_w);
@@ -136,6 +139,7 @@ private:
TILE_GET_INFO_MEMBER(mirderby_get_info1_1);
DECLARE_MACHINE_START(homedata);
DECLARE_MACHINE_RESET(homedata);
+ DECLARE_MACHINE_RESET(mrokumei);
DECLARE_VIDEO_START(mrokumei);
void mrokumei_palette(palette_device &palette) const;
DECLARE_MACHINE_START(reikaids);
@@ -153,11 +157,11 @@ private:
uint32_t screen_update_reikaids(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
uint32_t screen_update_pteacher(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
uint32_t screen_update_mirderby(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
- DECLARE_WRITE_LINE_MEMBER(screen_vblank_homedata);
+ DECLARE_WRITE_LINE_MEMBER(screen_vblank);
INTERRUPT_GEN_MEMBER(homedata_irq);
- void mrokumei_handleblit( address_space &space, int rom_base );
- void reikaids_handleblit( address_space &space, int rom_base );
- void pteacher_handleblit( address_space &space, int rom_base );
+ void mrokumei_handleblit( int rom_base );
+ void reikaids_handleblit( int rom_base );
+ void pteacher_handleblit( int rom_base );
inline void mrokumei_info0( tile_data &tileinfo, int tile_index, int page, int gfxbank );
inline void mrokumei_info1( tile_data &tileinfo, int tile_index, int page, int gfxbank );
inline void reikaids_info( tile_data &tileinfo, int tile_index, int page, int layer, int gfxbank );
@@ -168,9 +172,14 @@ private:
void cpu0_map(address_map &map);
void cpu1_map(address_map &map);
void cpu2_map(address_map &map);
+ void jogakuen_map(address_map &map);
+ void mjikaga_map(address_map &map);
+ void mjikaga_upd7807_map(address_map &map);
void mrokumei_map(address_map &map);
+ void mrokumei_sound_banked_map(address_map &map);
void mrokumei_sound_io_map(address_map &map);
void mrokumei_sound_map(address_map &map);
+ void pteacher_base_map(address_map &map);
void pteacher_map(address_map &map);
void pteacher_upd7807_map(address_map &map);
void reikaids_map(address_map &map);
diff --git a/src/mame/includes/homerun.h b/src/mame/includes/homerun.h
index 9df6781da45..4bddc7a73bc 100644
--- a/src/mame/includes/homerun.h
+++ b/src/mame/includes/homerun.h
@@ -14,62 +14,65 @@
class homerun_state : public driver_device
{
public:
- homerun_state(const machine_config &mconfig, device_type type, const char *tag)
- : driver_device(mconfig, type, tag),
+ homerun_state(const machine_config &mconfig, device_type type, const char *tag) :
+ driver_device(mconfig, type, tag),
m_maincpu(*this, "maincpu"),
m_videoram(*this, "videoram"),
m_spriteram(*this, "spriteram"),
- m_colorram(*this, "colorram"),
m_d7756(*this, "d7756"),
m_samples(*this, "samples"),
m_gfxdecode(*this, "gfxdecode"),
m_screen(*this, "screen"),
- m_palette(*this, "palette")
+ m_palette(*this, "palette"),
+ m_mainbank(*this, "mainbank")
{ }
void ganjaja(machine_config &config);
void dynashot(machine_config &config);
void homerun(machine_config &config);
- DECLARE_CUSTOM_INPUT_MEMBER(homerun_sprite0_r);
+ DECLARE_CUSTOM_INPUT_MEMBER(sprite0_r);
DECLARE_CUSTOM_INPUT_MEMBER(homerun_d7756_busy_r);
DECLARE_CUSTOM_INPUT_MEMBER(ganjaja_d7756_busy_r);
DECLARE_CUSTOM_INPUT_MEMBER(ganjaja_hopper_status_r);
+protected:
+ virtual void machine_start() override;
+ virtual void machine_reset() override;
+ virtual void video_start() override;
+
private:
required_device<cpu_device> m_maincpu;
- required_shared_ptr<uint8_t> m_videoram;
- required_shared_ptr<uint8_t> m_spriteram;
- required_shared_ptr<uint8_t> m_colorram;
+ required_shared_ptr<u8> m_videoram;
+ required_shared_ptr<u8> m_spriteram;
optional_device<upd7756_device> m_d7756;
optional_device<samples_device> m_samples;
required_device<gfxdecode_device> m_gfxdecode;
required_device<screen_device> m_screen;
required_device<palette_device> m_palette;
- uint8_t m_control;
- uint8_t m_sample;
+ required_memory_bank m_mainbank;
+
+ u8 m_control;
+ u8 m_sample;
tilemap_t *m_tilemap;
int m_gfx_ctrl;
int m_scrollx;
int m_scrolly;
- DECLARE_WRITE8_MEMBER(homerun_control_w);
- DECLARE_WRITE8_MEMBER(homerun_d7756_sample_w);
- DECLARE_WRITE8_MEMBER(homerun_videoram_w);
- DECLARE_WRITE8_MEMBER(homerun_color_w);
- DECLARE_WRITE8_MEMBER(homerun_scrollhi_w);
- DECLARE_WRITE8_MEMBER(homerun_scrolly_w);
- DECLARE_WRITE8_MEMBER(homerun_scrollx_w);
+ void control_w(u8 data);
+ void d7756_sample_w(u8 data);
+ DECLARE_WRITE8_MEMBER(videoram_w);
+ DECLARE_WRITE8_MEMBER(scrollhi_w);
+ DECLARE_WRITE8_MEMBER(scrolly_w);
+ DECLARE_WRITE8_MEMBER(scrollx_w);
- TILE_GET_INFO_MEMBER(get_homerun_tile_info);
- virtual void machine_start() override;
- virtual void machine_reset() override;
- virtual void video_start() override;
- uint32_t screen_update_homerun(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
- DECLARE_WRITE8_MEMBER(homerun_banking_w);
- void draw_sprites( bitmap_ind16 &bitmap, const rectangle &cliprect );
- void homerun_iomap(address_map &map);
- void homerun_memmap(address_map &map);
+ static rgb_t homerun_RGB332(u32 raw);
+ TILE_GET_INFO_MEMBER(get_tile_info);
+ u32 screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
+ void banking_w(u8 data);
+ void draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect);
+ void io_map(address_map &map);
+ void mem_map(address_map &map);
};
diff --git a/src/mame/includes/itech8.h b/src/mame/includes/itech8.h
index ed8dd446dd9..32b889bfe10 100644
--- a/src/mame/includes/itech8.h
+++ b/src/mame/includes/itech8.h
@@ -165,7 +165,7 @@ protected:
inline void consume_raw(int count);
inline uint8_t fetch_next_rle();
inline void consume_rle(int count);
- void perform_blit(address_space &space);
+ void perform_blit();
void update_interrupts(int periodic, int tms34061, int blitter);
/*----------- defined in machine/itech8.cpp -----------*/
diff --git a/src/mame/includes/jazz.h b/src/mame/includes/jazz.h
index d666b81a45a..a3274d07526 100644
--- a/src/mame/includes/jazz.h
+++ b/src/mame/includes/jazz.h
@@ -6,7 +6,7 @@
#pragma once
-#include "cpu/mips/mips3.h"
+#include "cpu/mips/r4000.h"
// memory
#include "machine/ram.h"
@@ -17,14 +17,21 @@
#include "machine/jazz_mct_adr.h"
#include "machine/dp83932c.h"
#include "machine/mc146818.h"
+#include "machine/ins8250.h"
#include "machine/ncr5390.h"
#include "machine/upd765.h"
#include "machine/at_keybc.h"
+#include "machine/pc_lpt.h"
+#include "machine/i82357.h"
// video
#include "screen.h"
#include "video/ims_cvc.h"
+// audio
+#include "sound/spkrdev.h"
+#include "speaker.h"
+
// busses and connectors
#include "machine/nscsi_bus.h"
#include "machine/nscsi_cd.h"
@@ -33,23 +40,32 @@
#include "bus/pc_kbd/pc_kbdc.h"
#include "bus/pc_kbd/keyboards.h"
+#include "imagedev/floppy.h"
+#include "formats/pc_dsk.h"
+
class jazz_state : public driver_device
{
public:
jazz_state(const machine_config &mconfig, device_type type, const char *tag)
: driver_device(mconfig, type, tag)
- , m_maincpu(*this, "cpu")
+ , m_cpu(*this, "cpu")
, m_ram(*this, "ram")
+ , m_vram(*this, "vram")
, m_mct_adr(*this, "mct_adr")
, m_scsibus(*this, "scsi")
- , m_scsi(*this, "scsi:7:host")
+ , m_scsi(*this, "scsi:7:ncr53c94")
, m_fdc(*this, "fdc")
, m_rtc(*this, "rtc")
, m_nvram(*this, "nvram")
, m_flash(*this, "flash")
, m_kbdc(*this, "kbdc")
, m_network(*this, "net")
+ , m_screen(*this, "screen")
, m_ramdac(*this, "g364")
+ , m_ace(*this, "ace%u", 0)
+ , m_lpt(*this, "lpt")
+ , m_isp(*this, "isp")
+ , m_buzzer(*this, "buzzer")
{
}
@@ -63,31 +79,35 @@ protected:
// machine config
void jazz(machine_config &config);
+
public:
void mmr4000be(machine_config &config);
void mmr4000le(machine_config &config);
void init_common();
+ DECLARE_FLOPPY_FORMATS(floppy_formats);
+
protected:
// devices
- required_device<mips3_device> m_maincpu;
+ required_device<r4000_device> m_cpu;
required_device<ram_device> m_ram;
+ required_device<ram_device> m_vram;
required_device<jazz_mct_adr_device> m_mct_adr;
required_device<nscsi_bus_device> m_scsibus;
- required_device<ncr5390_device> m_scsi;
+ required_device<ncr53c94_device> m_scsi;
required_device<n82077aa_device> m_fdc;
required_device<mc146818_device> m_rtc;
required_device<nvram_device> m_nvram;
required_device<amd_28f020_device> m_flash;
- required_device<at_keyboard_controller_device> m_kbdc;
+ required_device<ps2_keyboard_controller_device> m_kbdc;
required_device<dp83932c_device> m_network;
- //required_device<screen_device> m_screen;
+ required_device<screen_device> m_screen;
required_device<g364_device> m_ramdac;
-
- // helpers
- u8 led_r() { return m_led; }
- void led_w(const u8 data) { logerror("led 0x%02x\n", data); m_led = data; }
+ required_device_array<ns16550_device, 2> m_ace;
+ required_device<pc_lpt_device> m_lpt;
+ required_device<i82357_device> m_isp;
+ required_device<speaker_sound_device> m_buzzer;
private:
// machine state
diff --git a/src/mame/includes/jensen.h b/src/mame/includes/jensen.h
new file mode 100644
index 00000000000..bb253c49353
--- /dev/null
+++ b/src/mame/includes/jensen.h
@@ -0,0 +1,72 @@
+// license:BSD-3-Clause
+// copyright-holders:Patrick Mackinlay
+
+#ifndef MAME_INCLUDES_JENSEN_H
+#define MAME_INCLUDES_JENSEN_H
+
+#pragma once
+
+#include "cpu/alpha/alpha.h"
+
+// memory
+#include "machine/ram.h"
+#include "machine/xc1700e.h"
+#include "machine/intelfsh.h"
+
+// various hardware
+#include "machine/i82357.h"
+
+// busses and connectors
+#include "bus/rs232/rs232.h"
+#include "bus/pc_kbd/pc_kbdc.h"
+#include "bus/pc_kbd/keyboards.h"
+
+class jensen_state : public driver_device
+{
+public:
+ jensen_state(const machine_config &mconfig, device_type type, const char *tag)
+ : driver_device(mconfig, type, tag)
+ , m_cpu(*this, "cpu")
+ , m_ram(*this, "ram")
+ , m_srom(*this, "srom")
+ , m_feprom(*this, "feprom%u", 0)
+ , m_isp(*this, "isp")
+ {
+ }
+
+ // machine config
+ void jensen(machine_config &config);
+
+ void d2k300axp(machine_config &config);
+ void d2k500axp(machine_config &config);
+ void dpcaxp150(machine_config &config);
+
+ void init_common();
+
+protected:
+ // driver_device overrides
+ virtual void machine_start() override;
+ virtual void machine_reset() override;
+
+ // address maps
+ void local_memory(address_map &map);
+ void local_io(address_map &map);
+ void eisa_memory(address_map &map);
+ void eisa_io(address_map &map);
+
+private:
+ // devices
+ required_device<alpha_device> m_cpu;
+ required_device<ram_device> m_ram;
+ required_device<xc1765e_device> m_srom;
+ required_device_array<intel_e28f008sa_device, 2> m_feprom;
+
+ required_device<i82357_device> m_isp;
+
+ // machine state
+ u8 m_hae;
+ u8 m_sysctl;
+ u8 m_spare;
+};
+
+#endif // MAME_INCLUDES_JENSEN_H
diff --git a/src/mame/includes/jpmsys5.h b/src/mame/includes/jpmsys5.h
index e354a1a62c4..e94cbcce9c1 100644
--- a/src/mame/includes/jpmsys5.h
+++ b/src/mame/includes/jpmsys5.h
@@ -59,6 +59,7 @@ protected:
required_device<cpu_device> m_maincpu;
required_device_array<acia6850_device, 3> m_acia6850;
optional_device<s16lf01_device> m_vfd;
+ required_device<upd7759_device> m_upd7759;
void jpm_sys5_common_map(address_map &map);
@@ -76,7 +77,6 @@ private:
void m68000_awp_map(address_map &map);
void m68000_awp_map_saa(address_map &map);
- required_device<upd7759_device> m_upd7759;
required_ioport m_direct_port;
optional_device<meters_device> m_meters; //jpmsys5v doesn't use this
output_finder<16 * 16> m_lamps;
diff --git a/src/mame/includes/kchamp.h b/src/mame/includes/kchamp.h
index 7a24855a08f..3b3a0d1db45 100644
--- a/src/mame/includes/kchamp.h
+++ b/src/mame/includes/kchamp.h
@@ -77,7 +77,7 @@ private:
DECLARE_WRITE8_MEMBER(kchamp_videoram_w);
DECLARE_WRITE8_MEMBER(kchamp_colorram_w);
DECLARE_WRITE_LINE_MEMBER(flipscreen_w);
- DECLARE_WRITE8_MEMBER(sound_control_w);
+ void sound_control_w(u8 data);
TILE_GET_INFO_MEMBER(get_bg_tile_info);
virtual void machine_reset() override;
virtual void video_start() override;
diff --git a/src/mame/includes/kingobox.h b/src/mame/includes/kingobox.h
index 123ef8da5ab..ccd6c86e15f 100644
--- a/src/mame/includes/kingobox.h
+++ b/src/mame/includes/kingobox.h
@@ -58,15 +58,15 @@ private:
/* devices */
required_device<cpu_device> m_video_cpu;
required_device<cpu_device> m_sprite_cpu;
- DECLARE_WRITE8_MEMBER(video_interrupt_w);
- DECLARE_WRITE8_MEMBER(sprite_interrupt_w);
- DECLARE_WRITE8_MEMBER(scroll_interrupt_w);
- DECLARE_WRITE8_MEMBER(sound_command_w);
- DECLARE_WRITE8_MEMBER(kingofb_videoram_w);
- DECLARE_WRITE8_MEMBER(kingofb_colorram_w);
- DECLARE_WRITE8_MEMBER(kingofb_videoram2_w);
- DECLARE_WRITE8_MEMBER(kingofb_colorram2_w);
- DECLARE_WRITE8_MEMBER(kingofb_f800_w);
+ void video_interrupt_w(uint8_t data);
+ void sprite_interrupt_w(uint8_t data);
+ void scroll_interrupt_w(uint8_t data);
+ void sound_command_w(uint8_t data);
+ void kingofb_videoram_w(offs_t offset, uint8_t data);
+ void kingofb_colorram_w(offs_t offset, uint8_t data);
+ void kingofb_videoram2_w(offs_t offset, uint8_t data);
+ void kingofb_colorram2_w(offs_t offset, uint8_t data);
+ void kingofb_f800_w(uint8_t data);
TILE_GET_INFO_MEMBER(get_bg_tile_info);
TILE_GET_INFO_MEMBER(get_fg_tile_info);
TILE_GET_INFO_MEMBER(ringking_get_bg_tile_info);
diff --git a/src/mame/includes/kyocera.h b/src/mame/includes/kyocera.h
index 2098f70da08..b3fa4afa3bc 100644
--- a/src/mame/includes/kyocera.h
+++ b/src/mame/includes/kyocera.h
@@ -34,16 +34,6 @@
#define UPD1990A_TAG "m18"
#define IM6402_TAG "m22"
#define MC14412_TAG "m31"
-#define HD44102_0_TAG "m1"
-#define HD44102_1_TAG "m2"
-#define HD44102_2_TAG "m3"
-#define HD44102_3_TAG "m4"
-#define HD44102_4_TAG "m5"
-#define HD44102_5_TAG "m6"
-#define HD44102_6_TAG "m7"
-#define HD44102_7_TAG "m8"
-#define HD44102_8_TAG "m9"
-#define HD44102_9_TAG "m10"
#define CENTRONICS_TAG "centronics"
#define RS232_TAG "rs232"
@@ -63,16 +53,7 @@ public:
m_maincpu(*this, I8085_TAG),
m_rtc(*this, UPD1990A_TAG),
m_uart(*this, IM6402_TAG),
- m_lcdc0(*this, HD44102_0_TAG),
- m_lcdc1(*this, HD44102_1_TAG),
- m_lcdc2(*this, HD44102_2_TAG),
- m_lcdc3(*this, HD44102_3_TAG),
- m_lcdc4(*this, HD44102_4_TAG),
- m_lcdc5(*this, HD44102_5_TAG),
- m_lcdc6(*this, HD44102_6_TAG),
- m_lcdc7(*this, HD44102_7_TAG),
- m_lcdc8(*this, HD44102_8_TAG),
- m_lcdc9(*this, HD44102_9_TAG),
+ m_lcdc(*this, "m%u", 0U),
m_centronics(*this, CENTRONICS_TAG),
m_speaker(*this, "speaker"),
m_cassette(*this, "cassette"),
@@ -102,16 +83,7 @@ protected:
required_device<i8085a_cpu_device> m_maincpu;
required_device<upd1990a_device> m_rtc;
optional_device<im6402_device> m_uart;
- required_device<hd44102_device> m_lcdc0;
- required_device<hd44102_device> m_lcdc1;
- required_device<hd44102_device> m_lcdc2;
- required_device<hd44102_device> m_lcdc3;
- required_device<hd44102_device> m_lcdc4;
- required_device<hd44102_device> m_lcdc5;
- required_device<hd44102_device> m_lcdc6;
- required_device<hd44102_device> m_lcdc7;
- required_device<hd44102_device> m_lcdc8;
- required_device<hd44102_device> m_lcdc9;
+ required_device_array<hd44102_device, 10> m_lcdc;
required_device<centronics_device> m_centronics;
required_device<speaker_sound_device> m_speaker;
required_device<cassette_image_device> m_cassette;
diff --git a/src/mame/includes/ladybug.h b/src/mame/includes/ladybug.h
index 964a994252c..d9924f51948 100644
--- a/src/mame/includes/ladybug.h
+++ b/src/mame/includes/ladybug.h
@@ -53,8 +53,9 @@ protected:
void ladybug_map(address_map &map);
-private:
required_device<cpu_device> m_maincpu;
+
+private:
required_device<ladybug_video_device> m_video;
required_ioport m_port_dsw0;
diff --git a/src/mame/includes/lisa.h b/src/mame/includes/lisa.h
index 00ace4b7069..28bc79b2507 100644
--- a/src/mame/includes/lisa.h
+++ b/src/mame/includes/lisa.h
@@ -24,10 +24,6 @@
#include "emupal.h"
#include "screen.h"
-#define COP421_TAG "u9f"
-#define KB_COP421_TAG "kbcop"
-#define SCREEN_TAG "screen"
-
/* lisa MMU segment regs */
struct real_mmu_entry
{
@@ -129,7 +125,7 @@ public:
m_io_mouse_x(*this, "MOUSE_X"),
m_io_mouse_y(*this, "MOUSE_Y"),
m_palette(*this, "palette"),
- m_screen(*this, SCREEN_TAG)
+ m_screen(*this, "screen")
{ }
void lisa(machine_config &config);
diff --git a/src/mame/includes/lvcards.h b/src/mame/includes/lvcards.h
index 8bb4cc71061..bf9d07580a1 100644
--- a/src/mame/includes/lvcards.h
+++ b/src/mame/includes/lvcards.h
@@ -12,9 +12,9 @@ class lvcards_state : public driver_device
public:
lvcards_state(const machine_config &mconfig, device_type type, const char *tag) :
driver_device(mconfig, type, tag),
+ m_maincpu(*this, "maincpu"),
m_videoram(*this, "videoram"),
m_colorram(*this, "colorram"),
- m_maincpu(*this, "maincpu"),
m_gfxdecode(*this, "gfxdecode")
{ }
@@ -26,6 +26,8 @@ protected:
DECLARE_WRITE8_MEMBER(videoram_w);
DECLARE_WRITE8_MEMBER(colorram_w);
+ required_device<cpu_device> m_maincpu;
+
private:
required_shared_ptr<uint8_t> m_videoram;
required_shared_ptr<uint8_t> m_colorram;
@@ -33,7 +35,6 @@ private:
TILE_GET_INFO_MEMBER(get_bg_tile_info);
void lvcards_palette(palette_device &palette) const;
uint32_t screen_update_lvcards(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
- required_device<cpu_device> m_maincpu;
required_device<gfxdecode_device> m_gfxdecode;
void lvcards_io_map(address_map &map);
void lvcards_map(address_map &map);
diff --git a/src/mame/includes/lwings.h b/src/mame/includes/lwings.h
index aad34ed2d31..192ff10f07d 100644
--- a/src/mame/includes/lwings.h
+++ b/src/mame/includes/lwings.h
@@ -11,12 +11,13 @@ class lwings_state : public driver_device
public:
lwings_state(const machine_config &mconfig, device_type type, const char *tag)
: driver_device(mconfig, type, tag),
- m_spriteram(*this, "spriteram") ,
+ m_spriteram(*this, "spriteram"),
m_fgvideoram(*this, "fgvideoram"),
m_bg1videoram(*this, "bg1videoram"),
m_soundlatch2(*this, "soundlatch_2"),
m_nmi_mask(0),
m_maincpu(*this, "maincpu"),
+ m_soundcpu(*this, "soundcpu"),
m_msm(*this, "5205"),
m_gfxdecode(*this, "gfxdecode"),
m_palette(*this, "palette"),
@@ -91,6 +92,7 @@ private:
void trojan_draw_sprites( bitmap_ind16 &bitmap, const rectangle &cliprect );
int avengers_fetch_paldata( );
required_device<cpu_device> m_maincpu;
+ required_device<cpu_device> m_soundcpu;
optional_device<msm5205_device> m_msm;
required_device<gfxdecode_device> m_gfxdecode;
required_device<palette_device> m_palette;
diff --git a/src/mame/includes/m52.h b/src/mame/includes/m52.h
index 5a5eccd6f5d..8d11a75d229 100644
--- a/src/mame/includes/m52.h
+++ b/src/mame/includes/m52.h
@@ -13,14 +13,14 @@ class m52_state : public driver_device
public:
m52_state(const machine_config &mconfig, device_type type, const char *tag) :
driver_device(mconfig, type, tag),
+ m_maincpu(*this, "maincpu"),
+ m_screen(*this, "screen"),
m_videoram(*this, "videoram"),
m_colorram(*this, "colorram"),
m_spriteram(*this, "spriteram"),
- m_maincpu(*this, "maincpu"),
m_sp_gfxdecode(*this, "sp_gfxdecode"),
m_tx_gfxdecode(*this, "tx_gfxdecode"),
m_bg_gfxdecode(*this, "bg_gfxdecode"),
- m_screen(*this, "screen"),
m_sp_palette(*this, "sp_palette"),
m_tx_palette(*this, "tx_palette"),
m_bg_palette(*this, "bg_palette")
@@ -43,6 +43,9 @@ protected:
tilemap_t* m_tx_tilemap;
+ required_device<cpu_device> m_maincpu;
+ required_device<screen_device> m_screen;
+
private:
/* memory pointers */
required_shared_ptr<uint8_t> m_videoram;
@@ -56,11 +59,9 @@ private:
uint8_t m_bg2ypos;
uint8_t m_bgcontrol;
- required_device<cpu_device> m_maincpu;
required_device<gfxdecode_device> m_sp_gfxdecode;
required_device<gfxdecode_device> m_tx_gfxdecode;
required_device<gfxdecode_device> m_bg_gfxdecode;
- required_device<screen_device> m_screen;
required_device<palette_device> m_sp_palette;
required_device<palette_device> m_tx_palette;
required_device<palette_device> m_bg_palette;
@@ -73,7 +74,8 @@ private:
DECLARE_WRITE8_MEMBER(m52_flipscreen_w);
TILE_GET_INFO_MEMBER(get_tile_info);
void init_palette();
- void init_sprite_palette(const int *resistances_3, const int *resistances_2, double *weights_r, double *weights_g, double *weights_b, double scale);
+ template <size_t N, size_t O, size_t P>
+ void init_sprite_palette(const int *resistances_3, const int *resistances_2, double (&weights_r)[N], double (&weights_g)[O], double (&weights_b)[P], double scale);
uint32_t screen_update_m52(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
void draw_background(bitmap_rgb32 &bitmap, const rectangle &cliprect, int xpos, int ypos, int image);
void draw_sprites(bitmap_rgb32 &bitmap, const rectangle &cliprect, int initoffs);
diff --git a/src/mame/includes/madalien.h b/src/mame/includes/madalien.h
index edeb06a7111..473a9f2dc0b 100644
--- a/src/mame/includes/madalien.h
+++ b/src/mame/includes/madalien.h
@@ -49,6 +49,9 @@ public:
DECLARE_INPUT_CHANGED_MEMBER(coin_inserted);
+protected:
+ virtual void video_start() override;
+
private:
required_shared_ptr<uint8_t> m_videoram;
required_shared_ptr<uint8_t> m_charram;
@@ -79,7 +82,6 @@ private:
TILE_GET_INFO_MEMBER(get_tile_info_BG_1);
TILE_GET_INFO_MEMBER(get_tile_info_BG_2);
TILE_GET_INFO_MEMBER(get_tile_info_FG);
- DECLARE_VIDEO_START(madalien);
void madalien_palette(palette_device &palette) const;
uint32_t screen_update_madalien(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
inline int scan_helper(int col, int row, int section);
diff --git a/src/mame/includes/mbc55x.h b/src/mame/includes/mbc55x.h
index 78faa224c0b..77fd7e28caf 100644
--- a/src/mame/includes/mbc55x.h
+++ b/src/mame/includes/mbc55x.h
@@ -57,20 +57,6 @@
#define RED_PLANE_TAG "red"
#define BLUE_PLANE_TAG "blue"
-// Keyboard
-
-#define MBC55X_KEYROWS 7
-#define KEYBOARD_QUEUE_SIZE 32
-
-#define KB_BITMASK 0x1000
-#define KB_SHIFTS 12
-
-#define KEY_SPECIAL_TAG "KEY_SPECIAL"
-#define KEY_BIT_LSHIFT 0x01
-#define KEY_BIT_RSHIFT 0x02
-#define KEY_BIT_CTRL 0x04
-#define KEY_BIT_GRAPH 0x08
-
#define PPI8255_TAG "ppi8255"
#define PIC8259_TAG "pic8259"
#define PIT8253_TAG "pit8253"
@@ -80,14 +66,6 @@
#define FDC_TAG "wd1793"
-struct keyboard_t
-{
- uint8_t keyrows[MBC55X_KEYROWS];
- emu_timer *keyscan_timer;
-
- uint8_t key_special;
-};
-
class mbc55x_state : public driver_device
{
@@ -112,11 +90,8 @@ public:
void mbc55x(machine_config &config);
- void init_mbc55x();
-
required_device<i8086_cpu_device> m_maincpu;
required_device<address_map_bank_device> m_iodecode;
- uint32_t m_debug_machine;
protected:
virtual void machine_start() override;
@@ -127,17 +102,16 @@ protected:
private:
DECLARE_FLOPPY_FORMATS(floppy_formats);
- DECLARE_READ8_MEMBER(iodecode_r);
- DECLARE_WRITE8_MEMBER(iodecode_w);
-
- DECLARE_READ8_MEMBER(mbc55x_kb_usart_r);
- DECLARE_READ8_MEMBER(vram_page_r);
- DECLARE_WRITE8_MEMBER(vram_page_w);
- DECLARE_READ8_MEMBER(game_io_r);
- DECLARE_WRITE8_MEMBER(game_io_w);
- DECLARE_READ8_MEMBER(printer_status_r);
- DECLARE_WRITE8_MEMBER(printer_data_w);
- DECLARE_WRITE8_MEMBER(disk_select_w);
+ uint8_t iodecode_r(offs_t offset);
+ void iodecode_w(offs_t offset, uint8_t data);
+
+ uint8_t vram_page_r();
+ void vram_page_w(uint8_t data);
+ uint8_t game_io_r();
+ void game_io_w(uint8_t data);
+ uint8_t printer_status_r();
+ void printer_data_w(uint8_t data);
+ void disk_select_w(uint8_t data);
DECLARE_WRITE_LINE_MEMBER(printer_busy_w);
DECLARE_WRITE_LINE_MEMBER(printer_paper_end_w);
DECLARE_WRITE_LINE_MEMBER(printer_select_w);
@@ -147,14 +121,11 @@ private:
MC6845_UPDATE_ROW(crtc_update_row);
void mbc55x_palette(palette_device &palette) const;
- TIMER_CALLBACK_MEMBER(keyscan_callback);
void mbc55x_io(address_map &map);
void mbc55x_mem(address_map &map);
void mbc55x_iodecode(address_map &map);
- void keyboard_reset();
- void scan_keyboard();
void set_ram_size();
required_device<mc6845_device> m_crtc;
@@ -174,9 +145,6 @@ private:
uint8_t m_vram_page;
uint8_t m_printer_status;
- keyboard_t m_keyboard;
-
- void debug_command(int ref, const std::vector<std::string> &params);
void video_debug(int ref, const std::vector<std::string> &params);
};
diff --git a/src/mame/includes/mcr3.h b/src/mame/includes/mcr3.h
index f98c59d90ed..3224846502e 100644
--- a/src/mame/includes/mcr3.h
+++ b/src/mame/includes/mcr3.h
@@ -10,6 +10,8 @@
#pragma once
+#include "includes/mcr.h"
+
#include "machine/74259.h"
#include "machine/adc0844.h"
#include "screen.h"
diff --git a/src/mame/includes/megadriv.h b/src/mame/includes/megadriv.h
index f1950f2113a..c208c0a1af0 100644
--- a/src/mame/includes/megadriv.h
+++ b/src/mame/includes/megadriv.h
@@ -1,5 +1,9 @@
// license:BSD-3-Clause
// copyright-holders:David Haywood
+#ifndef MAME_INCLUDES_MEGADRIV_H
+#define MAME_INCLUDES_MEGADRIV_H
+
+#pragma once
#include "coreutil.h"
#include "cpu/m68000/m68000.h"
@@ -40,8 +44,8 @@ struct genesis_z80_vars
class md_base_state : public driver_device
{
public:
- md_base_state(const machine_config &mconfig, device_type type, const char *tag)
- : driver_device(mconfig, type, tag),
+ md_base_state(const machine_config &mconfig, device_type type, const char *tag) :
+ driver_device(mconfig, type, tag),
m_maincpu(*this,"maincpu"),
m_z80snd(*this,"genesis_snd_z80"),
m_ymsnd(*this,"ymsnd"),
@@ -50,6 +54,7 @@ public:
m_megadrive_ram(*this,"megadrive_ram"),
m_io_reset(*this, "RESET")
{ }
+
required_device<m68000_base_device> m_maincpu;
optional_device<cpu_device> m_z80snd;
optional_device<ym2612_device> m_ymsnd;
@@ -57,7 +62,6 @@ public:
required_device<sega315_5313_device> m_vdp;
optional_shared_ptr<uint16_t> m_megadrive_ram;
-
optional_ioport m_io_reset;
ioport_port *m_io_pad_3b[4];
ioport_port *m_io_pad_6b[4];
@@ -145,12 +149,12 @@ public:
class md_cons_state : public md_base_state
{
public:
- md_cons_state(const machine_config &mconfig, device_type type, const char *tag)
- : md_base_state(mconfig, type, tag),
- m_32x(*this,"sega32x"),
- m_segacd(*this,"segacd"),
- m_cart(*this, "mdslot"),
- m_tmss(*this, "tmss")
+ md_cons_state(const machine_config &mconfig, device_type type, const char *tag) :
+ md_base_state(mconfig, type, tag),
+ m_32x(*this,"sega32x"),
+ m_segacd(*this,"segacd"),
+ m_cart(*this, "mdslot"),
+ m_tmss(*this, "tmss")
{ }
ioport_port *m_io_ctrlr;
@@ -202,3 +206,5 @@ public:
void genesis_scd(machine_config &config);
void genesis_tmss(machine_config &config);
};
+
+#endif // MAME_INCLUDES_MEGADRIV_H
diff --git a/src/mame/includes/megadriv_acbl.h b/src/mame/includes/megadriv_acbl.h
index 4c75a84c240..0692714fe18 100644
--- a/src/mame/includes/megadriv_acbl.h
+++ b/src/mame/includes/megadriv_acbl.h
@@ -25,12 +25,17 @@ public:
void init_puckpkmn();
void init_hshavoc();
void init_barek3();
+ void init_sonic2mb();
+ void init_twinktmb();
+ void init_jparkmb();
private:
DECLARE_WRITE16_MEMBER(bl_710000_w);
DECLARE_READ16_MEMBER(bl_710000_r);
DECLARE_WRITE16_MEMBER(aladmdb_w);
DECLARE_READ16_MEMBER(aladmdb_r);
+ DECLARE_READ16_MEMBER(jparkmb_r);
+ DECLARE_READ16_MEMBER(twinktmb_r);
DECLARE_READ16_MEMBER(mk3mdb_dsw_r);
DECLARE_READ16_MEMBER(ssf2mdb_dsw_r);
DECLARE_READ16_MEMBER(srmdb_dsw_r);
diff --git a/src/mame/includes/megasys1.h b/src/mame/includes/megasys1.h
index e37c8e402fa..284d4f41bb2 100644
--- a/src/mame/includes/megasys1.h
+++ b/src/mame/includes/megasys1.h
@@ -30,16 +30,14 @@ public:
m_ram(*this, "ram"),
m_maincpu(*this, "maincpu"),
m_audiocpu(*this, "audiocpu"),
- m_oki1(*this, "oki1"),
- m_oki2(*this, "oki2"),
+ m_oki(*this, "oki%u", 1U),
m_gfxdecode(*this, "gfxdecode"),
m_palette(*this, "palette"),
m_screen(*this, "screen"),
- m_soundlatch(*this, "soundlatch"),
- m_soundlatch2(*this, "soundlatch2"),
- m_soundlatch_z(*this, "soundlatch_z"),
+ m_soundlatch(*this, "soundlatch%u", 1U),
m_scantimer(*this, "scantimer"),
m_rom_maincpu(*this, "maincpu"),
+ m_okibank(*this, "okibank"),
m_io_system(*this, "SYSTEM"),
m_io_p1(*this, "P1"),
m_io_p2(*this, "P2"),
@@ -57,6 +55,7 @@ public:
void system_C(machine_config &config);
void system_Bbl(machine_config &config);
void system_A(machine_config &config);
+ void system_A_jitsupro(machine_config &config);
void system_B(machine_config &config);
void system_B_hayaosi1(machine_config &config);
void system_Z(machine_config &config);
@@ -88,21 +87,19 @@ public:
void init_systemz();
private:
- required_shared_ptr<uint16_t> m_objectram;
+ required_shared_ptr<u16> m_objectram;
optional_device_array<megasys1_tilemap_device, 3> m_tmap;
- required_shared_ptr<uint16_t> m_ram;
+ required_shared_ptr<u16> m_ram;
required_device<cpu_device> m_maincpu;
optional_device<cpu_device> m_audiocpu;
- optional_device<okim6295_device> m_oki1;
- optional_device<okim6295_device> m_oki2;
+ optional_device_array<okim6295_device, 2> m_oki;
required_device<gfxdecode_device> m_gfxdecode;
required_device<palette_device> m_palette;
required_device<screen_device> m_screen;
- optional_device<generic_latch_16_device> m_soundlatch;
- optional_device<generic_latch_16_device> m_soundlatch2;
- optional_device<generic_latch_8_device> m_soundlatch_z;
+ optional_device_array<generic_latch_16_device, 2> m_soundlatch;
optional_device<timer_device> m_scantimer;
- required_region_ptr<uint16_t> m_rom_maincpu;
+ required_region_ptr<u16> m_rom_maincpu;
+ optional_memory_bank m_okibank;
required_ioport m_io_system;
required_ioport m_io_p1;
required_ioport m_io_p2;
@@ -111,38 +108,38 @@ private:
optional_ioport m_io_dsw2;
// configuration
- uint16_t m_ip_select_values[7]; // System B and C
+ u16 m_ip_select_values[7]; // System B and C
int m_hardware_type_z; // System Z
int m_layers_order[16];
- uint8_t m_ignore_oki_status;
+ u8 m_ignore_oki_status;
// all
bitmap_ind16 m_sprite_buffer_bitmap;
- uint16_t m_screen_flag;
- std::unique_ptr<uint16_t[]> m_buffer_objectram;
- std::unique_ptr<uint16_t[]> m_buffer2_objectram;
- std::unique_ptr<uint16_t[]> m_buffer_spriteram16;
- std::unique_ptr<uint16_t[]> m_buffer2_spriteram16;
+ u16 m_screen_flag;
+ std::unique_ptr<u16[]> m_buffer_objectram;
+ std::unique_ptr<u16[]> m_buffer2_objectram;
+ std::unique_ptr<u16[]> m_buffer_spriteram16;
+ std::unique_ptr<u16[]> m_buffer2_spriteram16;
// all but System Z
- uint16_t m_active_layers;
- uint16_t m_sprite_flag;
+ u16 m_active_layers;
+ u16 m_sprite_flag;
// System B and C
- uint16_t m_ip_latched;
+ u16 m_ip_latched;
// System C
- uint16_t m_sprite_bank;
+ u16 m_sprite_bank;
// System A only
int m_mcu_hs;
- uint16_t m_mcu_hs_ram[0x10];
+ u16 m_mcu_hs_ram[0x10];
// peekaboo
- uint16_t m_protection_val;
+ u16 m_protection_val;
// soldam
- uint16_t *m_spriteram;
+ u16 *m_spriteram;
DECLARE_WRITE_LINE_MEMBER(sound_irq);
DECLARE_READ16_MEMBER(ip_select_r);
@@ -168,19 +165,16 @@ private:
DECLARE_WRITE16_MEMBER(monkelf_scroll0_w);
DECLARE_WRITE16_MEMBER(monkelf_scroll1_w);
void megasys1_set_vreg_flag(int which, int data);
- DECLARE_READ8_MEMBER(oki_status_1_r);
- DECLARE_READ8_MEMBER(oki_status_2_r);
- DECLARE_WRITE16_MEMBER(okim6295_both_1_w);
- DECLARE_WRITE16_MEMBER(okim6295_both_2_w);
+ template<int Chip> DECLARE_READ8_MEMBER(oki_status_r);
DECLARE_WRITE16_MEMBER(ram_w);
-
DECLARE_MACHINE_RESET(megasys1);
DECLARE_VIDEO_START(megasys1);
+ DECLARE_VIDEO_START(megasys1_z);
void megasys1_palette(palette_device &palette);
DECLARE_MACHINE_RESET(megasys1_hachoo);
- uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
+ u32 screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
DECLARE_WRITE_LINE_MEMBER(screen_vblank);
INTERRUPT_GEN_MEMBER(megasys1D_irq);
TIMER_DEVICE_CALLBACK_MEMBER(megasys1A_scanline);
@@ -189,15 +183,16 @@ private:
void priority_create();
void mix_sprite_bitmap(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
- void partial_clear_sprite_bitmap(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, uint8_t param);
+ void partial_clear_sprite_bitmap(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, u8 param);
void draw_sprites(screen_device &screen, bitmap_ind16 &bitmap,const rectangle &cliprect);
- inline void draw_16x16_priority_sprite(screen_device &screen, bitmap_ind16 &bitmap,const rectangle &cliprect, int32_t code, int32_t color, int32_t sx, int32_t sy, int32_t flipx, int32_t flipy, uint8_t mosaic, uint8_t mosaicsol, int32_t priority);
+ inline void draw_16x16_priority_sprite(screen_device &screen, bitmap_ind16 &bitmap,const rectangle &cliprect, s32 code, s32 color, s32 sx, s32 sy, s32 flipx, s32 flipy, u8 mosaic, u8 mosaicsol, s32 priority);
void rodland_gfx_unmangle(const char *region);
void jitsupro_gfx_unmangle(const char *region);
void stdragona_gfx_unmangle(const char *region);
void kickoffb_sound_map(address_map &map);
void megasys1A_map(address_map &map);
void megasys1A_sound_map(address_map &map);
+ void megasys1A_jitsupro_sound_map(address_map &map);
void megasys1B_edfbl_map(address_map &map);
void megasys1B_map(address_map &map);
void megasys1B_monkelf_map(address_map &map);
diff --git a/src/mame/includes/midyunit.h b/src/mame/includes/midyunit.h
index 3ab84160c23..9ac1c12b539 100644
--- a/src/mame/includes/midyunit.h
+++ b/src/mame/includes/midyunit.h
@@ -6,6 +6,10 @@
Williams/Midway Y/Z-unit system
**************************************************************************/
+#ifndef MAME_INCLUDES_MIDYUNIT_H
+#define MAME_INCLUDES_MIDYUNIT_H
+
+#pragma once
#include "audio/williams.h"
@@ -16,25 +20,6 @@
#include "sound/okim6295.h"
#include "emupal.h"
-/* protection data types */
-struct protection_data
-{
- uint16_t reset_sequence[3];
- uint16_t data_sequence[100];
-};
-
-struct dma_state_t
-{
- uint32_t offset; /* source offset, in bits */
- int32_t rowbytes; /* source bytes to skip each row */
- int32_t xpos; /* x position, clipped */
- int32_t ypos; /* y position, clipped */
- int32_t width; /* horizontal pixel count */
- int32_t height; /* vertical pixel count */
- uint16_t palette; /* palette base */
- uint16_t color; /* current foreground color with palette */
-};
-
class midyunit_state : public driver_device
{
@@ -88,6 +73,25 @@ public:
DECLARE_CUSTOM_INPUT_MEMBER(adpcm_irq_state_r);
private:
+ /* protection data types */
+ struct protection_data
+ {
+ uint16_t reset_sequence[3];
+ uint16_t data_sequence[100];
+ };
+
+ struct dma_state_t
+ {
+ uint32_t offset; // source offset, in bits
+ int32_t rowbytes; // source bytes to skip each row
+ int32_t xpos; // x position, clipped
+ int32_t ypos; // y position, clipped
+ int32_t width; // horizontal pixel count
+ int32_t height; // vertical pixel count
+ uint16_t palette; // palette base
+ uint16_t color; // current foreground color with palette
+ };
+
enum
{
TIMER_DMA,
@@ -172,3 +176,5 @@ private:
void init_generic(int bpp, int sound, int prot_start, int prot_end);
void term2_init_common(write16_delegate hack_w);
};
+
+#endif // MAME_INCLUDES_MIDYUNIT_H
diff --git a/src/mame/includes/mips.h b/src/mame/includes/mips.h
index 9a042988c36..aff93ac1e94 100644
--- a/src/mame/includes/mips.h
+++ b/src/mame/includes/mips.h
@@ -53,6 +53,7 @@ public:
, m_cpu(*this, "cpu")
, m_iop(*this, "iop")
, m_ram(*this, "ram")
+ , m_rom(*this, "rx2030")
, m_rtc(*this, "rtc")
, m_fio(*this, "fio")
, m_kbdc(*this, "kbdc")
@@ -112,6 +113,7 @@ private:
required_device<r2000a_device> m_cpu;
required_device<v50_device> m_iop;
required_device<ram_device> m_ram;
+ required_region_ptr<u16> m_rom;
// i/o devices
required_device<mc146818_device> m_rtc;
diff --git a/src/mame/includes/model1.h b/src/mame/includes/model1.h
index 44a5b3c2504..9f33cf94790 100644
--- a/src/mame/includes/model1.h
+++ b/src/mame/includes/model1.h
@@ -512,6 +512,7 @@ private:
DECLARE_WRITE8_MEMBER(wingwar_outputs_w);
DECLARE_WRITE8_MEMBER(wingwar360_outputs_w);
DECLARE_WRITE8_MEMBER(netmerc_outputs_w);
+ DECLARE_WRITE8_MEMBER(drive_board_w);
};
diff --git a/src/mame/includes/ms32.h b/src/mame/includes/ms32.h
index 1a1f54a80db..2a11409fedb 100644
--- a/src/mame/includes/ms32.h
+++ b/src/mame/includes/ms32.h
@@ -1,5 +1,9 @@
// license:BSD-3-Clause
// copyright-holders:David Haywood,Paul Priest
+#ifndef MAME_INCLUDES_MS32_H
+#define MAME_INCLUDES_MS32_H
+
+#pragma once
#include "machine/gen_latch.h"
#include "machine/timer.h"
@@ -9,13 +13,13 @@
class ms32_state : public driver_device
{
public:
- ms32_state(const machine_config &mconfig, device_type type, const char *tag)
- : driver_device(mconfig, type, tag),
+ ms32_state(const machine_config &mconfig, device_type type, const char *tag) :
+ driver_device(mconfig, type, tag),
m_palette(*this, "palette"),
m_gfxdecode(*this, "gfxdecode"),
+ m_maincpu(*this, "maincpu"),
m_audiocpu(*this, "audiocpu"),
m_soundlatch(*this, "soundlatch"),
- m_maincpu(*this, "maincpu"),
m_screen(*this, "screen"),
m_mainram(*this, "mainram"),
m_roz_ctrl(*this, "roz_ctrl"),
@@ -30,7 +34,8 @@ public:
m_txram(*this, "txram", 32),
m_bgram(*this, "bgram", 32),
m_f1superb_extraram(*this, "f1sb_extraram", 32),
- m_z80bank(*this, "z80bank%u", 1) { }
+ m_z80bank(*this, "z80bank%u", 1)
+ { }
void ms32(machine_config &config);
void f1superb(machine_config &config);
@@ -66,12 +71,12 @@ protected:
int m_reverse_sprite_order;
int m_flipscreen;
+ required_device<cpu_device> m_maincpu;
required_device<cpu_device> m_audiocpu;
optional_device<generic_latch_8_device> m_soundlatch;
private:
- required_device<cpu_device> m_maincpu;
optional_device<screen_device> m_screen;
optional_shared_ptr<uint32_t> m_mainram;
optional_shared_ptr<uint32_t> m_roz_ctrl;
@@ -148,3 +153,5 @@ private:
void ms32_map(address_map &map);
void ms32_sound_map(address_map &map);
};
+
+#endif // MAME_INCLUDES_MS32_H
diff --git a/src/mame/includes/msx.h b/src/mame/includes/msx.h
index 021042f801b..41115a3d9e3 100644
--- a/src/mame/includes/msx.h
+++ b/src/mame/includes/msx.h
@@ -13,6 +13,7 @@
#include "machine/i8255.h"
#include "machine/rp5c01.h"
#include "machine/buffer.h"
+#include "machine/input_merger.h"
#include "bus/centronics/ctronics.h"
#include "sound/ay8910.h"
#include "sound/dac.h"
@@ -42,73 +43,6 @@
#define TC8521_TAG "rtc"
-#define MCFG_MSX_LAYOUT_ROM(_tag, _prim, _sec, _page, _numpages, _region, _offset) \
- MCFG_MSX_SLOT_ROM_ADD(_tag, _page, _numpages, _region, _offset) \
- install_slot_pages(_prim, _sec, _page, _numpages, device);
-
-#define MCFG_MSX_LAYOUT_RAM(_tag, _prim, _sec, _page, _numpages) \
- MCFG_MSX_SLOT_RAM_ADD(_tag, _page, _numpages) \
- install_slot_pages(_prim, _sec, _page, _numpages, device);
-
-#define MCFG_MSX_LAYOUT_CARTRIDGE(_tag, _prim, _sec) \
- MCFG_MSX_SLOT_CARTRIDGE_ADD(_tag, WRITELINE("mainirq", input_merger_device, in_w<1>)) \
- install_slot_pages(_prim, _sec, 0, 4, device);
-
-#define MCFG_MSX_LAYOUT_YAMAHA_EXPANSION(_tag, _prim, _sec, _default) \
- MCFG_MSX_SLOT_YAMAHA_EXPANSION_ADD(_tag, WRITELINE("mainirq", input_merger_device, in_w<2>), _default) \
- install_slot_pages(_prim, _sec, 0, 4, device);
-
-#define MCFG_MSX_LAYOUT_RAM_MM(_tag, _prim, _sec, _total_size) \
- MCFG_MSX_SLOT_RAM_MM_ADD(_tag, _total_size) \
- install_slot_pages(_prim, _sec, 0, 4, device);
-
-#define MCFG_MSX_RAMIO_SET_BITS(_ramio_set_bits) \
- MCFG_MSX_SLOT_RAMM_SET_RAMIO_BITS(_ramio_set_bits)
-
-#define MCFG_MSX_LAYOUT_DISK1(_tag, _prim, _sec, _page, _numpages, _region, _offset) \
- MCFG_MSX_SLOT_DISK1_ADD(_tag, _page, _numpages, _region, _offset, "fdc", "fdc:0", "fdc:1") \
- install_slot_pages(_prim, _sec, _page, _numpages + 1, device); /* Memory mapped FDC registers are also accessible through page 2 */
-
-#define MCFG_MSX_LAYOUT_DISK2(_tag, _prim, _sec, _page, _numpages, _region, _offset) \
- MCFG_MSX_SLOT_DISK2_ADD(_tag, _page, _numpages, _region, _offset, "fdc", "fdc:0", "fdc:1") \
- install_slot_pages(_prim, _sec, _page, _numpages + 1, device); /* Memory mapped FDC registers are also accessible through page 2 */
-
-#define MCFG_MSX_LAYOUT_DISK3(_tag, _prim, _sec, _page, _numpages, _region, _offset) \
- MCFG_MSX_SLOT_DISK3_ADD(_tag, _page, _numpages, _region, _offset, "fdc", "fdc:0", "fdc:1") \
- install_slot_pages(_prim, _sec, _page, _numpages, device);
-
-#define MCFG_MSX_LAYOUT_DISK4(_tag, _prim, _sec, _page, _numpages, _region, _offset) \
- MCFG_MSX_SLOT_DISK4_ADD(_tag, _page, _numpages, _region, _offset, "fdc", "fdc:0", "fdc:1") \
- install_slot_pages(_prim, _sec, _page, _numpages, device);
-
-#define MCFG_MSX_LAYOUT_DISK5(_tag, _prim, _sec, _page, _numpages, _region, _offset) \
- MCFG_MSX_SLOT_DISK5_ADD(_tag, _page, _numpages, _region, _offset, "fdc", "fdc:0", "fdc:1", "fdc:2", "fdc:3") \
- install_slot_pages(_prim, _sec, _page, _numpages, device);
-
-#define MCFG_MSX_LAYOUT_DISK6(_tag, _prim, _sec, _page, _numpages, _region, _offset) \
- MCFG_MSX_SLOT_DISK6_ADD(_tag, _page, _numpages, _region, _offset, "fdc", "fdc:0", "fdc:1") \
- install_slot_pages(_prim, _sec, _page, _numpages, device);
-
-#define MCFG_MSX_LAYOUT_MUSIC(_tag, _prim, _sec, _page, _numpages, _region, _offset) \
- MCFG_MSX_SLOT_MUSIC_ADD(_tag, _page, _numpages, _region, _offset, "ym2413" ) \
- install_slot_pages(_prim, _sec, _page, _numpages, device);
-
-#define MCFG_MSX_LAYOUT_BUNSETSU(_tag, _prim, _sec, _page, _numpages, _region, _offset, _bunsetsu_tag) \
- MCFG_MSX_SLOT_BUNSETSU_ADD(_tag, _page, _numpages, _region, _offset, _bunsetsu_tag) \
- install_slot_pages(_prim, _sec, _page, _numpages, device);
-
-#define MCFG_MSX_LAYOUT_FS4600(_tag, _prim, _sec, _page, _numpages, _region, _offset) \
- MCFG_MSX_SLOT_FS4600_ADD(_tag, _page, _numpages, _region, _offset) \
- install_slot_pages(_prim, _sec, _page, _numpages, device);
-
-#define MCFG_MSX_LAYOUT_PANASONIC08(_tag, _prim, _sec, _page, _numpages, _region, _offset) \
- MCFG_MSX_SLOT_PANASONIC08_ADD(_tag, _page, _numpages, _region, _offset) \
- install_slot_pages(_prim, _sec, _page, _numpages, device);
-
-#define MCFG_MSX_LAYOUT_SONY08(_tag, _prim, _sec, _page, _numpages, _region, _offset) \
- MCFG_MSX_SLOT_SONY08_ADD(_tag, _page, _numpages, _region, _offset) \
- install_slot_pages(_prim, _sec, _page, _numpages, device);
-
class msx_state : public driver_device
{
@@ -128,6 +62,7 @@ public:
, m_leds(*this, "led%u", 1U)
, m_psg_b(0)
, m_kanji_latch(0)
+ , m_empty_slot(mconfig, *this)
, m_primary_slot(0)
, m_port_c_old(0)
, m_keylatch(0)
@@ -146,6 +81,8 @@ public:
}
m_mouse[0] = m_mouse[1] = 0;
m_mouse_stat[0] = m_mouse_stat[1] = 0;
+ m_empty_slot.set_memory_space(m_maincpu, AS_PROGRAM);
+ m_empty_slot.set_io_space(m_maincpu, AS_IO);
}
void hc6(machine_config &config);
@@ -295,7 +232,57 @@ protected:
void msx_2_35_dd_drive(machine_config &config);
// static configuration helpers
- void install_slot_pages(uint8_t prim, uint8_t sec, uint8_t page, uint8_t numpages, device_t *device);
+ void install_slot_pages(uint8_t prim, uint8_t sec, uint8_t page, uint8_t numpages, msx_internal_slot_interface &device);
+ template <typename T, typename U>
+ auto &add_internal_slot(machine_config &config, T &&type, U &&tag, uint8_t prim, uint8_t sec, uint8_t page, uint8_t numpages)
+ {
+ auto &device(std::forward<T>(type)(config, std::forward<U>(tag), 0U));
+ device.set_memory_space(m_maincpu, AS_PROGRAM);
+ device.set_io_space(m_maincpu, AS_IO);
+ device.set_start_address(page * 0x4000);
+ device.set_size(numpages * 0x4000);
+ install_slot_pages(prim, sec, page, numpages, device);
+ return device;
+ }
+ template <typename T, typename U>
+ auto &add_internal_slot(machine_config &config, T &&type, U &&tag, uint8_t prim, uint8_t sec, uint8_t page, uint8_t numpages, const char *region, uint32_t offset)
+ {
+ auto &device(std::forward<T>(type)(config, std::forward<U>(tag), 0U));
+ device.set_memory_space(m_maincpu, AS_PROGRAM);
+ device.set_io_space(m_maincpu, AS_IO);
+ device.set_start_address(page * 0x4000);
+ device.set_size(numpages * 0x4000);
+ device.set_rom_start(region, offset);
+ install_slot_pages(prim, sec, page, numpages, device);
+ return device;
+ }
+ template <typename T, typename U>
+ auto &add_internal_slot_mirrored(machine_config &config, T &&type, U &&tag, uint8_t prim, uint8_t sec, uint8_t page, uint8_t numpages, const char *region, uint32_t offset)
+ {
+ // Memory mapped FDC registers are also accessible through page 2
+ auto &device(type(config, std::forward<U>(tag), 0U));
+ device.set_memory_space(m_maincpu, AS_PROGRAM);
+ device.set_io_space(m_maincpu, AS_IO);
+ device.set_start_address(page * 0x4000);
+ device.set_size(0x4000);
+ device.set_rom_start(region, offset);
+ install_slot_pages(prim, sec, page, numpages, device);
+ return device;
+ }
+ template <int N, typename T, typename U, typename V>
+ auto &add_cartridge_slot(machine_config &config, T &&type, U &&tag, uint8_t prim, uint8_t sec, V &&intf, const char *deft)
+ {
+ auto &device(type(config, std::forward<U>(tag), 0U));
+ device.set_memory_space(m_maincpu, AS_PROGRAM);
+ device.set_io_space(m_maincpu, AS_IO);
+ device.option_reset();
+ intf(device);
+ device.set_default_option(deft);
+ device.set_fixed(false);
+ device.irq_handler().set("mainirq", FUNC(input_merger_device::in_w<N>));
+ install_slot_pages(prim, sec, 0, 4, device);
+ return device;
+ }
virtual void driver_start() override;
virtual void machine_start() override;
diff --git a/src/mame/includes/mtx.h b/src/mame/includes/mtx.h
index 959780228f3..111ac5931f3 100644
--- a/src/mame/includes/mtx.h
+++ b/src/mame/includes/mtx.h
@@ -14,35 +14,29 @@
#include "bus/centronics/ctronics.h"
#include "bus/generic/slot.h"
#include "bus/generic/carts.h"
+#include "bus/mtx/exp.h"
#include "cpu/z80/z80.h"
+#include "machine/z80daisy.h"
#include "machine/z80dart.h"
#include "machine/z80ctc.h"
#include "sound/sn76496.h"
#include "machine/ram.h"
#include "machine/timer.h"
-#define Z80_TAG "z80"
-#define Z80CTC_TAG "z80ctc"
-#define Z80DART_TAG "z80dart"
-#define FD1793_TAG "fd1793" // SDX
-#define FD1791_TAG "fd1791" // FDX
-#define SN76489A_TAG "sn76489a"
-#define MC6845_TAG "mc6845"
-#define SCREEN_TAG "screen"
-#define CENTRONICS_TAG "centronics"
class mtx_state : public driver_device
{
public:
mtx_state(const machine_config &mconfig, device_type type, const char *tag)
: driver_device(mconfig, type, tag)
- , m_maincpu(*this, Z80_TAG)
- , m_sn(*this, SN76489A_TAG)
- , m_z80ctc(*this, Z80CTC_TAG)
- , m_z80dart(*this, Z80DART_TAG)
+ , m_maincpu(*this, "z80")
+ , m_sn(*this, "sn76489a")
+ , m_z80ctc(*this, "z80ctc")
+ , m_z80dart(*this, "z80dart")
, m_cassette(*this, "cassette")
- , m_centronics(*this, CENTRONICS_TAG)
+ , m_centronics(*this, "centronics")
, m_ram(*this, RAM_TAG)
+ , m_exp(*this, "exp")
, m_extrom(*this, "extrom")
, m_rompak(*this, "rompak")
{ }
@@ -51,6 +45,10 @@ public:
void mtx500(machine_config &config);
void mtx512(machine_config &config);
+protected:
+ virtual void machine_start() override;
+ virtual void machine_reset() override;
+
private:
required_device<z80_device> m_maincpu;
required_device<sn76489a_device> m_sn;
@@ -59,6 +57,7 @@ private:
required_device<cassette_image_device> m_cassette;
required_device<centronics_device> m_centronics;
required_device<ram_device> m_ram;
+ required_device<mtx_exp_slot_device> m_exp;
required_device<generic_slot_device> m_extrom;
required_device<generic_slot_device> m_rompak;
@@ -91,8 +90,6 @@ private:
DECLARE_WRITE8_MEMBER(hrx_data_w);
DECLARE_READ8_MEMBER(hrx_attr_r);
DECLARE_WRITE8_MEMBER(hrx_attr_w);
- DECLARE_MACHINE_START(mtx512);
- DECLARE_MACHINE_RESET(mtx512);
TIMER_DEVICE_CALLBACK_MEMBER(ctc_tick);
TIMER_DEVICE_CALLBACK_MEMBER(cassette_tick);
DECLARE_WRITE_LINE_MEMBER(ctc_trg1_w);
@@ -110,7 +107,9 @@ private:
void bankswitch(uint8_t data);
DECLARE_DEVICE_IMAGE_LOAD_MEMBER(extrom_load);
DECLARE_DEVICE_IMAGE_LOAD_MEMBER(rompak_load);
+ DECLARE_QUICKLOAD_LOAD_MEMBER(mtx);
DECLARE_SNAPSHOT_LOAD_MEMBER(mtx);
+
void mtx_io(address_map &map);
void mtx_mem(address_map &map);
void rs128_io(address_map &map);
diff --git a/src/mame/includes/multfish.h b/src/mame/includes/multfish.h
index 72059e43003..1f0b5e28303 100644
--- a/src/mame/includes/multfish.h
+++ b/src/mame/includes/multfish.h
@@ -53,6 +53,10 @@ public:
void init_crzmon2();
void init_crzmon2lot();
void init_crzmon2ent();
+ void init_islandent();
+ void init_pirateent();
+ void init_sweetlent();
+ void init_rollfruit();
private:
DECLARE_WRITE8_MEMBER(igrosoft_gamble_vid_w);
diff --git a/src/mame/includes/mw8080bw.h b/src/mame/includes/mw8080bw.h
index 46eb37a4df3..e14515510a5 100644
--- a/src/mame/includes/mw8080bw.h
+++ b/src/mame/includes/mw8080bw.h
@@ -127,6 +127,8 @@ public:
DECLARE_MACHINE_START(mw8080bw);
DECLARE_MACHINE_RESET(mw8080bw);
+ IRQ_CALLBACK_MEMBER(interrupt_vector);
+
protected:
/* device/memory pointers */
@@ -230,7 +232,7 @@ private:
uint32_t screen_update_phantom2(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
DECLARE_WRITE_LINE_MEMBER(screen_vblank_phantom2);
TIMER_CALLBACK_MEMBER(maze_tone_timing_timer_callback);
- TIMER_CALLBACK_MEMBER(mw8080bw_interrupt_callback);
+ TIMER_CALLBACK_MEMBER(interrupt_trigger);
TIMER_DEVICE_CALLBACK_MEMBER(spcenctr_strobe_timer_callback);
DECLARE_WRITE8_MEMBER(midway_tone_generator_lo_w);
DECLARE_WRITE8_MEMBER(midway_tone_generator_hi_w);
diff --git a/src/mame/includes/mystston.h b/src/mame/includes/mystston.h
index 512dd04a9ac..47fc6636e5e 100644
--- a/src/mame/includes/mystston.h
+++ b/src/mame/includes/mystston.h
@@ -39,6 +39,10 @@ public:
DECLARE_INPUT_CHANGED_MEMBER(coin_inserted);
+protected:
+ virtual void video_start() override;
+ virtual void video_reset() override;
+
private:
/* machine state */
@@ -61,8 +65,6 @@ private:
DECLARE_WRITE8_MEMBER(mystston_video_control_w);
TILE_GET_INFO_MEMBER(get_bg_tile_info);
TILE_GET_INFO_MEMBER(get_fg_tile_info);
- DECLARE_VIDEO_START(mystston);
- DECLARE_VIDEO_RESET(mystston);
uint32_t screen_update_mystston(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
TIMER_CALLBACK_MEMBER(interrupt_callback);
void set_palette();
diff --git a/src/mame/includes/mystwarr.h b/src/mame/includes/mystwarr.h
index e4fcd8b5f11..7a07c077fcd 100644
--- a/src/mame/includes/mystwarr.h
+++ b/src/mame/includes/mystwarr.h
@@ -110,7 +110,6 @@ private:
void martchmp_map(address_map &map);
void martchmp_sound_map(address_map &map);
void metamrph_map(address_map &map);
- void mystwarr_k054539_map(address_map &map);
void mystwarr_map(address_map &map);
void mystwarr_sound_map(address_map &map);
void viostorm_map(address_map &map);
diff --git a/src/mame/includes/namcona1.h b/src/mame/includes/namcona1.h
index 264c91c1fde..9f514d31ac2 100644
--- a/src/mame/includes/namcona1.h
+++ b/src/mame/includes/namcona1.h
@@ -83,8 +83,6 @@ protected:
DECLARE_WRITE16_MEMBER(paletteram_w);
DECLARE_READ16_MEMBER(gfxram_r);
DECLARE_WRITE16_MEMBER(gfxram_w);
- DECLARE_READ16_MEMBER(snd_r);
- DECLARE_WRITE16_MEMBER(snd_w);
virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override;
uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
diff --git a/src/mame/includes/namcos1.h b/src/mame/includes/namcos1.h
index 13be3197c3e..3b8f0604e29 100644
--- a/src/mame/includes/namcos1.h
+++ b/src/mame/includes/namcos1.h
@@ -33,6 +33,9 @@ public:
m_rom(*this, "user1"),
m_soundbank(*this, "soundbank"),
m_mcubank(*this, "mcubank"),
+ m_io_in(*this, "IN%u", 0U),
+ m_io_control(*this, "CONTROL%u", 0U),
+ m_io_paddle(*this, "PADDLE%u", 0U),
m_io_dipsw(*this, "DIPSW"),
m_dsw_sel(*this, "dsw_sel")
{ }
@@ -63,6 +66,12 @@ public:
void init_dspirit();
void init_pistoldm();
+protected:
+ virtual void machine_start() override;
+ virtual void machine_reset() override;
+ virtual void video_start() override;
+ void driver_init() override;
+
private:
required_device<mc6809e_device> m_maincpu;
required_device<mc6809e_device> m_subcpu;
@@ -74,13 +83,16 @@ private:
required_device_array<dac_8bit_r2r_device, 2> m_dac;
required_device<gfxdecode_device> m_gfxdecode;
- required_shared_ptr<uint8_t> m_spriteram;
- required_shared_ptr<uint8_t> m_triram;
- required_region_ptr<uint8_t> m_rom;
+ required_shared_ptr<u8> m_spriteram;
+ required_shared_ptr<u8> m_triram;
+ required_region_ptr<u8> m_rom;
required_memory_bank m_soundbank;
required_memory_bank m_mcubank;
+ optional_ioport_array<4> m_io_in;
+ optional_ioport_array<2> m_io_control;
+ optional_ioport_array<2> m_io_paddle;
required_ioport m_io_dipsw;
required_device<ls157_device> m_dsw_sel;
@@ -91,51 +103,50 @@ private:
int m_key_swap4;
int m_key_bottom4;
int m_key_top4;
- unsigned int m_key_quotient;
- unsigned int m_key_reminder;
- unsigned int m_key_numerator_high_word;
- uint8_t m_key[8];
+ u32 m_key_quotient;
+ u32 m_key_reminder;
+ u32 m_key_numerator_high_word;
+ u8 m_key[8];
int m_mcu_patch_data;
int m_reset;
int m_input_count;
int m_strobe;
int m_strobe_count;
int m_stored_input[2];
- int m_copy_sprites;
- uint8_t m_drawmode_table[16];
+ bool m_copy_sprites;
+ u8 m_drawmode_table[16];
DECLARE_WRITE_LINE_MEMBER(subres_w);
- DECLARE_WRITE8_MEMBER(audiocpu_irq_ack_w);
- DECLARE_WRITE8_MEMBER(mcu_irq_ack_w);
+ void audiocpu_irq_ack_w(u8 data);
+ void mcu_irq_ack_w(u8 data);
DECLARE_READ8_MEMBER(dsw_r);
- DECLARE_WRITE8_MEMBER(coin_w);
- DECLARE_WRITE8_MEMBER(dac_gain_w);
- DECLARE_WRITE8_MEMBER(sound_bankswitch_w);
- DECLARE_WRITE8_MEMBER(mcu_bankswitch_w);
- DECLARE_WRITE8_MEMBER(mcu_patch_w);
- DECLARE_READ8_MEMBER(quester_paddle_r);
- DECLARE_READ8_MEMBER(berabohm_buttons_r);
- DECLARE_READ8_MEMBER(faceoff_inputs_r);
- DECLARE_WRITE8_MEMBER(spriteram_w);
- DECLARE_WRITE8_MEMBER(_3dcs_w);
- DECLARE_READ8_MEMBER(no_key_r);
- DECLARE_WRITE8_MEMBER(no_key_w);
- DECLARE_READ8_MEMBER(key_type1_r);
- DECLARE_WRITE8_MEMBER(key_type1_w);
- DECLARE_READ8_MEMBER(key_type2_r);
- DECLARE_WRITE8_MEMBER(key_type2_w);
- DECLARE_READ8_MEMBER(key_type3_r);
- DECLARE_WRITE8_MEMBER(key_type3_w);
-
- virtual void machine_start() override;
- virtual void machine_reset() override;
- virtual void video_start() override;
- void driver_init() override;
-
- void TilemapCB(uint16_t code, int *tile, int *mask);
+ void coin_w(u8 data);
+ void dac_gain_w(u8 data);
+ void sound_bankswitch_w(u8 data);
+ void mcu_bankswitch_w(u8 data);
+ void mcu_patch_w(u8 data);
+ u8 quester_paddle_r(offs_t offset);
+ u8 berabohm_buttons_r(offs_t offset);
+ u8 faceoff_inputs_r(offs_t offset);
+ void spriteram_w(offs_t offset, u8 data);
+ void _3dcs_w(offs_t offset, u8 data);
+ u8 no_key_r(offs_t offset);
+ void no_key_w(offs_t offset, u8 data);
+ u8 key_type1_r(offs_t offset);
+ void key_type1_w(offs_t offset, u8 data);
+ u8 key_type2_r(offs_t offset);
+ void key_type2_w(offs_t offset, u8 data);
+ u8 key_type3_r(offs_t offset);
+ void key_type3_w(offs_t offset, u8 data);
+
+ void key_type_1_init(int key_id);
+ void key_type_2_init(int key_id);
+ void key_type_3_init(int key_id, int reg, int rng, int swap4_arg, int swap4, int bottom4, int top4);
+
+ void TilemapCB(u16 code, int *tile, int *mask);
void draw_sprites(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
- uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
+ u32 screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
DECLARE_WRITE_LINE_MEMBER(screen_vblank);
void main_map(address_map &map);
diff --git a/src/mame/includes/nforcepc.h b/src/mame/includes/nforcepc.h
index 03e0d72e247..cdc2802ac7a 100644
--- a/src/mame/includes/nforcepc.h
+++ b/src/mame/includes/nforcepc.h
@@ -44,4 +44,94 @@ private:
DECLARE_DEVICE_TYPE(CRUSH11, crush11_host_device)
+// device connected to SMBus
+
+class smbus_logger_device : public device_t, public smbus_interface
+{
+public:
+ smbus_logger_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+ virtual int execute_command(int command, int rw, int data) override;
+ uint8_t *get_buffer() { return buffer; }
+
+protected:
+ virtual void device_start() override;
+ virtual void device_reset() override;
+
+private:
+ uint8_t buffer[0xff];
+};
+
+DECLARE_DEVICE_TYPE(SMBUS_LOGGER, smbus_logger_device)
+
+// Simple smbus rom used as a placeholder for the serial presence detect chip in a ddr dimm
+
+class smbus_rom_device : public device_t, public smbus_interface
+{
+public:
+ smbus_rom_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock, const uint8_t *data, int size);
+ smbus_rom_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+ virtual int execute_command(int command, int rw, int data) override;
+
+protected:
+ virtual void device_start() override;
+ virtual void device_reset() override;
+
+private:
+ const uint8_t *buffer;
+ int buffer_size;
+};
+
+DECLARE_DEVICE_TYPE(SMBUS_ROM, smbus_rom_device)
+
+// Asus AS99127F chip
+// It answerst to three smbus addresses, by default 0x2d 0x48 0x49
+
+class as99127f_device : public device_t, public smbus_interface
+{
+public:
+ as99127f_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+ virtual int execute_command(int command, int rw, int data) override;
+ uint8_t *get_buffer() { return buffer; }
+
+protected:
+ virtual void device_start() override;
+
+private:
+ uint8_t buffer[0xff];
+};
+
+DECLARE_DEVICE_TYPE(AS99127F, as99127f_device)
+
+class as99127f_sensor2_device : public device_t, public smbus_interface
+{
+public:
+ as99127f_sensor2_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+ virtual int execute_command(int command, int rw, int data) override;
+ uint8_t *get_buffer() { return buffer; }
+
+protected:
+ virtual void device_start() override;
+
+private:
+ uint8_t buffer[0xff];
+};
+
+DECLARE_DEVICE_TYPE(AS99127F_SENSOR2, as99127f_sensor2_device)
+
+class as99127f_sensor3_device : public device_t, public smbus_interface
+{
+public:
+ as99127f_sensor3_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+ virtual int execute_command(int command, int rw, int data) override;
+ uint8_t *get_buffer() { return buffer; }
+
+protected:
+ virtual void device_start() override;
+
+private:
+ uint8_t buffer[0xff];
+};
+
+DECLARE_DEVICE_TYPE(AS99127F_SENSOR3, as99127f_sensor3_device)
+
#endif
diff --git a/src/mame/includes/niyanpai.h b/src/mame/includes/niyanpai.h
index edf272a87ef..3f3a73be2ba 100644
--- a/src/mame/includes/niyanpai.h
+++ b/src/mame/includes/niyanpai.h
@@ -15,7 +15,6 @@ public:
niyanpai_state(const machine_config &mconfig, device_type type, const char *tag)
: driver_device(mconfig, type, tag) ,
m_maincpu(*this, "maincpu"),
- m_tmp68301(*this, "tmp68301"),
m_screen(*this, "screen"),
m_palette(*this, "palette") { }
@@ -34,8 +33,7 @@ private:
TIMER_BLITTER
};
- required_device<cpu_device> m_maincpu;
- required_device<tmp68301_device> m_tmp68301;
+ required_device<tmp68301_device> m_maincpu;
required_device<screen_device> m_screen;
required_device<palette_device> m_palette;
diff --git a/src/mame/includes/nmk16.h b/src/mame/includes/nmk16.h
index 852762fe337..0b4b92ea079 100644
--- a/src/mame/includes/nmk16.h
+++ b/src/mame/includes/nmk16.h
@@ -87,6 +87,7 @@ public:
void init_bubl2000();
void init_banked_audiocpu();
void init_grdnstrm();
+ void init_grdnstrmau();
void init_spec2k();
void init_redfoxwp2a();
void init_grdnstrmg();
diff --git a/src/mame/includes/nova2001.h b/src/mame/includes/nova2001.h
index c1d105e78d1..e63b8116496 100644
--- a/src/mame/includes/nova2001.h
+++ b/src/mame/includes/nova2001.h
@@ -5,6 +5,7 @@
#pragma once
+#include "cpu/z80/z80.h"
#include "emupal.h"
class nova2001_state : public driver_device
@@ -31,33 +32,33 @@ public:
DECLARE_CUSTOM_INPUT_MEMBER(ninjakun_io_A002_ctrl_r);
private:
- required_device<cpu_device> m_maincpu;
+ required_device<z80_device> m_maincpu;
required_device<gfxdecode_device> m_gfxdecode;
required_device<palette_device> m_palette;
- optional_shared_ptr<uint8_t> m_fg_videoram;
- required_shared_ptr<uint8_t> m_bg_videoram;
- optional_shared_ptr<uint8_t> m_spriteram;
+ optional_shared_ptr<u8> m_fg_videoram;
+ required_shared_ptr<u8> m_bg_videoram;
+ optional_shared_ptr<u8> m_spriteram;
- uint8_t m_ninjakun_io_a002_ctrl;
+ u8 m_ninjakun_io_a002_ctrl;
tilemap_t *m_bg_tilemap;
tilemap_t *m_fg_tilemap;
DECLARE_WRITE8_MEMBER(ninjakun_cpu1_io_A002_w);
DECLARE_WRITE8_MEMBER(ninjakun_cpu2_io_A002_w);
- DECLARE_WRITE8_MEMBER(ninjakun_paletteram_w);
- DECLARE_WRITE8_MEMBER(nova2001_fg_videoram_w);
+ DECLARE_WRITE8_MEMBER(paletteram_w);
+ DECLARE_WRITE8_MEMBER(fg_videoram_w);
DECLARE_WRITE8_MEMBER(nova2001_bg_videoram_w);
DECLARE_WRITE8_MEMBER(ninjakun_bg_videoram_w);
DECLARE_READ8_MEMBER(ninjakun_bg_videoram_r);
- DECLARE_WRITE8_MEMBER(nova2001_scroll_x_w);
- DECLARE_WRITE8_MEMBER(nova2001_scroll_y_w);
+ DECLARE_WRITE8_MEMBER(scroll_x_w);
+ DECLARE_WRITE8_MEMBER(scroll_y_w);
DECLARE_WRITE8_MEMBER(nova2001_flipscreen_w);
DECLARE_WRITE8_MEMBER(pkunwar_flipscreen_w);
DECLARE_VIDEO_START(nova2001);
void nova2001_palette(palette_device &palette) const;
- static rgb_t BBGGRRII(uint32_t raw);
+ static rgb_t BBGGRRII(u32 raw);
DECLARE_MACHINE_START(ninjakun);
DECLARE_VIDEO_START(ninjakun);
DECLARE_VIDEO_START(pkunwar);
@@ -71,15 +72,16 @@ private:
TILE_GET_INFO_MEMBER(raiders5_get_bg_tile_info);
TILE_GET_INFO_MEMBER(raiders5_get_fg_tile_info);
- uint32_t screen_update_nova2001(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
- uint32_t screen_update_ninjakun(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
- uint32_t screen_update_pkunwar(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
- uint32_t screen_update_raiders5(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
+ u32 screen_update_nova2001(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
+ u32 screen_update_ninjakun(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
+ u32 screen_update_pkunwar(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
+ u32 screen_update_raiders5(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
void nova2001_draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect );
void pkunwar_draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect );
void lineswap_gfx_roms(const char *region, const int bit);
void ninjakun_cpu1_map(address_map &map);
void ninjakun_cpu2_map(address_map &map);
+ void ninjakun_shared_map(address_map &map);
void nova2001_map(address_map &map);
void pkunwar_io(address_map &map);
void pkunwar_map(address_map &map);
diff --git a/src/mame/includes/novagbase.h b/src/mame/includes/novagbase.h
index 8957c6fafd9..b2fae6a4558 100644
--- a/src/mame/includes/novagbase.h
+++ b/src/mame/includes/novagbase.h
@@ -2,82 +2,62 @@
// copyright-holders:hap
/******************************************************************************
*
-* Novag chess machines base class
-* main driver is novag6502.cpp
+* Novag chess computers base driver
+* implementation is in machine/novagbase.cpp
*
******************************************************************************/
+
#ifndef MAME_INCLUDES_NOVAGBASE_H
#define MAME_INCLUDES_NOVAGBASE_H
#pragma once
+#include "includes/chessbase.h"
+
#include "machine/timer.h"
#include "sound/dac.h"
#include "sound/beep.h"
#include "video/hd44780.h"
#include "emupal.h"
-class novagbase_state : public driver_device
+class novagbase_state : public chessbase_state
{
public:
novagbase_state(const machine_config &mconfig, device_type type, const char *tag) :
- driver_device(mconfig, type, tag),
- m_beeper(*this, "beeper"),
+ chessbase_state(mconfig, type, tag),
m_maincpu(*this, "maincpu"),
+ m_irq_on(*this, "irq_on"),
+ m_rombank(*this, "rombank"),
+ m_beeper(*this, "beeper"),
m_dac(*this, "dac"),
- m_lcd(*this, "hd44780"),
- m_inp_matrix(*this, "IN.%u", 0),
- m_out_x(*this, "%u.%u", 0U, 0U),
- m_out_a(*this, "%u.a", 0U),
- m_out_digit(*this, "digit%u", 0U),
- m_display_wait(33),
- m_display_maxy(1),
- m_display_maxx(0)
+ m_lcd(*this, "hd44780")
{ }
-protected:
- virtual void machine_start() override;
- virtual void machine_reset() override;
+ // in case reset button is directly tied to maincpu reset pin
+ virtual DECLARE_INPUT_CHANGED_MEMBER(reset_button) { m_maincpu->set_input_line(INPUT_LINE_RESET, newval ? ASSERT_LINE : CLEAR_LINE); }
+protected:
// devices/pointers
- optional_device<beep_device> m_beeper;
required_device<cpu_device> m_maincpu;
+ optional_device<timer_device> m_irq_on;
+ optional_memory_bank m_rombank;
+ optional_device<beep_device> m_beeper;
optional_device<dac_bit_interface> m_dac;
optional_device<hd44780_device> m_lcd;
- optional_ioport_array<9> m_inp_matrix; // max 9
- output_finder<0x20, 0x20> m_out_x;
- output_finder<0x20> m_out_a;
- output_finder<0x20> m_out_digit;
- // misc common
- u16 m_inp_mux; // multiplexed keypad mask
- u16 m_led_select;
- u16 m_led_data;
+ // periodic interrupts
+ template<int Line> TIMER_DEVICE_CALLBACK_MEMBER(irq_on) { m_maincpu->set_input_line(Line, ASSERT_LINE); }
+ template<int Line> TIMER_DEVICE_CALLBACK_MEMBER(irq_off) { m_maincpu->set_input_line(Line, CLEAR_LINE); }
+
+ // lcd common
+ HD44780_PIXEL_UPDATE(novag_lcd_pixel_update);
+ void novag_lcd_palette(palette_device &palette) const;
u8 m_lcd_control;
u8 m_lcd_data;
- u16 read_inputs(int columns);
-
- // display common
- int m_display_wait; // led/lamp off-delay in milliseconds (default 33ms)
- int m_display_maxy; // display matrix number of rows
- int m_display_maxx; // display matrix number of columns (max 31 for now)
-
- u32 m_display_state[0x20]; // display matrix rows data (last bit is used for always-on)
- u16 m_display_segmask[0x20]; // if not 0, display matrix row is a digit, mask indicates connected segments
- u8 m_display_decay[0x20][0x20]; // (internal use)
-
- void novag_lcd_palette(palette_device &palette) const;
- TIMER_DEVICE_CALLBACK_MEMBER(display_decay_tick);
- HD44780_PIXEL_UPDATE(novag_lcd_pixel_update);
- void display_update();
- void set_display_size(int maxx, int maxy);
- void set_display_segmask(u32 digits, u32 mask);
- void display_matrix(int maxx, int maxy, u32 setx, u32 sety, bool update = true);
+ virtual void machine_start() override;
+ virtual void machine_reset() override;
};
-INPUT_PORTS_EXTERN( novag_cb_buttons );
-INPUT_PORTS_EXTERN( novag_cb_magnets );
-
#endif // MAME_INCLUDES_NOVAGBASE_H
diff --git a/src/mame/includes/oneshot.h b/src/mame/includes/oneshot.h
index aaa3fd9dcff..b38e88fbbbd 100644
--- a/src/mame/includes/oneshot.h
+++ b/src/mame/includes/oneshot.h
@@ -13,11 +13,14 @@ class oneshot_state : public driver_device
public:
oneshot_state(const machine_config &mconfig, device_type type, const char *tag) :
driver_device(mconfig, type, tag),
- m_sprites(*this, "sprites"),
+ m_spriteram(*this, "spriteram"),
m_bg_videoram(*this, "bg_videoram"),
m_mid_videoram(*this, "mid_videoram"),
m_fg_videoram(*this, "fg_videoram"),
m_scroll(*this, "scroll"),
+ m_io_dsw1(*this, "DSW1"),
+ m_io_lightgun_x(*this, "LIGHT%u_X", 0U),
+ m_io_lightgun_y(*this, "LIGHT%u_Y", 0U),
m_maincpu(*this, "maincpu"),
m_oki(*this, "oki"),
m_gfxdecode(*this, "gfxdecode"),
@@ -25,6 +28,7 @@ public:
{ }
void maddonna(machine_config &config);
+ void komocomo(machine_config &config);
void oneshot(machine_config &config);
protected:
@@ -34,11 +38,15 @@ protected:
private:
/* memory pointers */
- required_shared_ptr<uint16_t> m_sprites;
- required_shared_ptr<uint16_t> m_bg_videoram;
- required_shared_ptr<uint16_t> m_mid_videoram;
- required_shared_ptr<uint16_t> m_fg_videoram;
- required_shared_ptr<uint16_t> m_scroll;
+ required_shared_ptr<u16> m_spriteram;
+ required_shared_ptr<u16> m_bg_videoram;
+ required_shared_ptr<u16> m_mid_videoram;
+ required_shared_ptr<u16> m_fg_videoram;
+ required_shared_ptr<u16> m_scroll;
+
+ optional_ioport m_io_dsw1;
+ optional_ioport_array<2> m_io_lightgun_x;
+ optional_ioport_array<2> m_io_lightgun_y;
/* video-related */
tilemap_t *m_bg_tilemap;
@@ -60,24 +68,25 @@ private:
required_device<gfxdecode_device> m_gfxdecode;
required_device<palette_device> m_palette;
- DECLARE_READ16_MEMBER(oneshot_in0_word_r);
- DECLARE_READ16_MEMBER(oneshot_gun_x_p1_r);
- DECLARE_READ16_MEMBER(oneshot_gun_y_p1_r);
- DECLARE_READ16_MEMBER(oneshot_gun_x_p2_r);
- DECLARE_READ16_MEMBER(oneshot_gun_y_p2_r);
- DECLARE_WRITE16_MEMBER(oneshot_bg_videoram_w);
- DECLARE_WRITE16_MEMBER(oneshot_mid_videoram_w);
- DECLARE_WRITE16_MEMBER(oneshot_fg_videoram_w);
- DECLARE_WRITE16_MEMBER(soundbank_w);
- TILE_GET_INFO_MEMBER(get_oneshot_bg_tile_info);
- TILE_GET_INFO_MEMBER(get_oneshot_mid_tile_info);
- TILE_GET_INFO_MEMBER(get_oneshot_fg_tile_info);
- uint32_t screen_update_oneshot(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
- uint32_t screen_update_maddonna(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
- void draw_crosshairs( bitmap_ind16 &bitmap, const rectangle &cliprect );
- void draw_sprites( bitmap_ind16 &bitmap, const rectangle &cliprect );
- void oneshot_map(address_map &map);
- void oneshot_sound_map(address_map &map);
+ u16 oneshot_in0_word_r();
+ u16 oneshot_gun_x_p1_r();
+ u16 oneshot_gun_y_p1_r();
+ u16 oneshot_gun_x_p2_r();
+ u16 oneshot_gun_y_p2_r();
+ void bg_videoram_w(offs_t offset, u16 data, u16 mem_mask = ~0);
+ void mid_videoram_w(offs_t offset, u16 data, u16 mem_mask = ~0);
+ void fg_videoram_w(offs_t offset, u16 data, u16 mem_mask = ~0);
+ void soundbank_w(u8 data);
+ TILE_GET_INFO_MEMBER(get_bg_tile_info);
+ TILE_GET_INFO_MEMBER(get_mid_tile_info);
+ TILE_GET_INFO_MEMBER(get_fg_tile_info);
+ u32 screen_update_oneshot(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
+ u32 screen_update_maddonna(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
+ u32 screen_update_komocomo(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
+ void draw_crosshairs();
+ void draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect);
+ void mem_map(address_map &map);
+ void sound_map(address_map &map);
};
#endif // MAME_INCLUDES_ONESHOT_H
diff --git a/src/mame/includes/orbit.h b/src/mame/includes/orbit.h
index 6f48ad78feb..2f25989efa5 100644
--- a/src/mame/includes/orbit.h
+++ b/src/mame/includes/orbit.h
@@ -71,7 +71,7 @@ private:
required_shared_ptr<uint8_t> m_playfield_ram;
required_shared_ptr<uint8_t> m_sprite_ram;
- required_device<discrete_device> m_discrete;
+ required_device<discrete_sound_device> m_discrete;
/* video-related */
tilemap_t *m_bg_tilemap;
diff --git a/src/mame/includes/psikyo.h b/src/mame/includes/psikyo.h
index 8c00c43e865..a46f8897df7 100644
--- a/src/mame/includes/psikyo.h
+++ b/src/mame/includes/psikyo.h
@@ -11,6 +11,7 @@
#pragma once
#include "machine/gen_latch.h"
+#include "video/bufsprite.h"
#include "sound/okim6295.h"
#include "emupal.h"
#include "screen.h"
@@ -22,7 +23,6 @@ class psikyo_state : public driver_device
public:
psikyo_state(const machine_config &mconfig, device_type type, const char *tag)
: driver_device(mconfig, type, tag)
- , m_spriteram(*this, "spriteram")
, m_vram(*this, "vram_%u", 0)
, m_vregs(*this, "vregs")
, m_bootleg_spritebuffer(*this, "boot_spritebuf")
@@ -39,12 +39,13 @@ public:
, m_gfxdecode(*this, "gfxdecode")
, m_screen(*this, "screen")
, m_palette(*this, "palette")
+ , m_spriteram(*this, "spriteram")
{
- std::fill(std::begin(m_old_linescroll), std::end(m_old_linescroll), 0);
+ std::fill(std::begin(m_old_linescroll), std::end(m_old_linescroll), ~u32(0));
}
void sngkace(machine_config &config);
- void s1945jn(machine_config &config);
+ void s1945n(machine_config &config);
void gunbird(machine_config &config);
void s1945(machine_config &config);
void s1945bl(machine_config &config);
@@ -62,11 +63,9 @@ public:
private:
/* memory pointers */
- required_shared_ptr<uint32_t> m_spriteram;
- required_shared_ptr_array<uint32_t, 2> m_vram;
- required_shared_ptr<uint32_t> m_vregs;
- optional_shared_ptr<uint32_t> m_bootleg_spritebuffer;
- std::unique_ptr<uint32_t[]> m_spritebuf[2];
+ required_shared_ptr_array<u32, 2> m_vram;
+ required_shared_ptr<u32> m_vregs;
+ optional_shared_ptr<u32> m_bootleg_spritebuffer;
required_memory_region m_spritelut;
optional_memory_bank m_audiobank;
@@ -76,32 +75,44 @@ private:
optional_ioport m_in_coin;
/* video-related */
- tilemap_t *m_tilemap[2][4];
- int m_tilemap_bank[2];
- int m_ka302c_banking;
- int m_old_linescroll[2];
+ struct sprite_t
+ {
+ u8 gfx;
+ u32 code,color;
+ bool flipx,flipy;
+ s32 x,y;
+ u32 zoomx,zoomy;
+ u32 primask;
+ };
+
+ tilemap_t *m_tilemap[2][4];
+ u8 m_tilemap_bank[2];
+ bool m_ka302c_banking;
+ u32 m_old_linescroll[2];
+ std::unique_ptr<sprite_t[]> m_spritelist;
+ struct sprite_t *m_sprite_ptr_pre;
+ u16 m_sprite_ctrl;
/* game-specific */
// 1945 MCU
- int m_mcu_status;
- uint8_t m_s1945_mcu_direction;
- uint8_t m_s1945_mcu_latch1;
- uint8_t m_s1945_mcu_latch2;
- uint8_t m_s1945_mcu_inlatch;
- uint8_t m_s1945_mcu_index;
- uint8_t m_s1945_mcu_latching;
- uint8_t m_s1945_mcu_mode;
- uint8_t m_s1945_mcu_control;
- uint8_t m_s1945_mcu_bctrl;
- const uint8_t *m_s1945_mcu_table;
+ int m_mcu_status;
+ u8 m_s1945_mcu_direction;
+ u8 m_s1945_mcu_latch1;
+ u8 m_s1945_mcu_latch2;
+ u8 m_s1945_mcu_inlatch;
+ u8 m_s1945_mcu_index;
+ u8 m_s1945_mcu_latching;
+ u8 m_s1945_mcu_mode;
+ u8 m_s1945_mcu_control;
+ u8 m_s1945_mcu_bctrl;
+ const u8 *m_s1945_mcu_table;
DECLARE_READ32_MEMBER(sngkace_input_r);
DECLARE_READ32_MEMBER(gunbird_input_r);
DECLARE_WRITE32_MEMBER(s1945_mcu_w);
DECLARE_READ32_MEMBER(s1945_mcu_r);
DECLARE_READ32_MEMBER(s1945_input_r);
- DECLARE_READ32_MEMBER(s1945bl_oki_r);
- DECLARE_WRITE32_MEMBER(s1945bl_oki_w);
+ DECLARE_WRITE8_MEMBER(s1945bl_okibank_w);
template<int Shift> DECLARE_WRITE8_MEMBER(sound_bankswitch_w);
template<int Layer> DECLARE_WRITE32_MEMBER(vram_w);
@@ -110,14 +121,16 @@ private:
virtual void machine_reset() override;
DECLARE_VIDEO_START(sngkace);
DECLARE_VIDEO_START(psikyo);
- uint32_t screen_update_psikyo(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
- uint32_t screen_update_psikyo_bootleg(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
- DECLARE_WRITE_LINE_MEMBER(screen_vblank_psikyo);
- void psikyo_switch_banks( int tmap, int bank );
- void draw_sprites( screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, int trans_pen );
- void draw_sprites_bootleg( screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, int trans_pen );
- int tilemap_width( int size );
- void s1945_mcu_init( );
+ u32 screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
+ u32 screen_update_bootleg(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
+ DECLARE_WRITE_LINE_MEMBER(screen_vblank);
+ DECLARE_WRITE_LINE_MEMBER(screen_vblank_bootleg);
+ void switch_bgbanks(u8 tmap, u8 bank);
+ void draw_sprites(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
+ void get_sprites();
+ void get_sprites_bootleg();
+ u16 tilemap_width(u8 size);
+ void s1945_mcu_init();
/* devices */
required_device<cpu_device> m_maincpu;
@@ -127,6 +140,7 @@ private:
required_device<gfxdecode_device> m_gfxdecode;
required_device<screen_device> m_screen;
required_device<palette_device> m_palette;
+ required_device<buffered_spriteram32_device> m_spriteram;
void gunbird_map(address_map &map);
void gunbird_sound_io_map(address_map &map);
@@ -136,7 +150,7 @@ private:
void s1945_map(address_map &map);
void s1945_sound_io_map(address_map &map);
void s1945bl_oki_map(address_map &map);
- void s1945jn_map(address_map &map);
+ void s1945n_map(address_map &map);
void sngkace_map(address_map &map);
void sngkace_sound_io_map(address_map &map);
void sngkace_sound_map(address_map &map);
diff --git a/src/mame/includes/realbrk.h b/src/mame/includes/realbrk.h
index 14a548366eb..179674e17a0 100644
--- a/src/mame/includes/realbrk.h
+++ b/src/mame/includes/realbrk.h
@@ -15,7 +15,6 @@ public:
realbrk_state(const machine_config &mconfig, device_type type, const char *tag) :
driver_device(mconfig, type, tag),
m_maincpu(*this, "maincpu"),
- m_tmp68301(*this, "tmp68301"),
m_gfxdecode(*this, "gfxdecode"),
m_screen(*this, "screen"),
m_palette(*this, "palette"),
@@ -37,8 +36,7 @@ public:
void pkgnshdx(machine_config &config);
private:
- required_device<cpu_device> m_maincpu;
- required_device<tmp68301_device> m_tmp68301;
+ required_device<tmp68301_device> m_maincpu;
required_device<gfxdecode_device> m_gfxdecode;
required_device<screen_device> m_screen;
required_device<palette_device> m_palette;
diff --git a/src/mame/includes/redclash.h b/src/mame/includes/redclash.h
index 5abdfb6dd07..3238f9485c1 100644
--- a/src/mame/includes/redclash.h
+++ b/src/mame/includes/redclash.h
@@ -42,19 +42,19 @@ protected:
virtual void video_start() override;
private:
- DECLARE_WRITE_LINE_MEMBER(screen_vblank_redclash);
- DECLARE_WRITE8_MEMBER(redclash_videoram_w);
- DECLARE_WRITE8_MEMBER(redclash_gfxbank_w);
- DECLARE_WRITE8_MEMBER(redclash_flipscreen_w);
+ DECLARE_WRITE_LINE_MEMBER(screen_vblank);
+ DECLARE_WRITE8_MEMBER(videoram_w);
+ DECLARE_WRITE8_MEMBER(gfxbank_w);
+ DECLARE_WRITE8_MEMBER(flipscreen_w);
DECLARE_WRITE8_MEMBER(irqack_w);
- DECLARE_WRITE8_MEMBER(redclash_star_reset_w);
- template <unsigned B> DECLARE_WRITE8_MEMBER(redclash_star_w);
- void redclash_palette(palette_device &palette) const;
+ DECLARE_WRITE8_MEMBER(star_reset_w);
+ template <unsigned B> DECLARE_WRITE8_MEMBER(star_w);
+ void palette(palette_device &palette) const;
TILE_GET_INFO_MEMBER(get_fg_tile_info);
- uint32_t screen_update_redclash(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
- void redclash_draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect);
- void redclash_draw_bullets(bitmap_ind16 &bitmap, const rectangle &cliprect);
+ uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
+ void draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect);
+ void draw_bullets(bitmap_ind16 &bitmap, const rectangle &cliprect);
void redclash_map(address_map &map);
void zerohour_map(address_map &map);
diff --git a/src/mame/includes/rungun.h b/src/mame/includes/rungun.h
index 6b32dbc65dc..8b811b3a494 100644
--- a/src/mame/includes/rungun.h
+++ b/src/mame/includes/rungun.h
@@ -120,7 +120,6 @@ private:
INTERRUPT_GEN_MEMBER(rng_interrupt);
- void k054539_map(address_map &map);
void rungun_map(address_map &map);
void rungun_sound_map(address_map &map);
};
diff --git a/src/mame/includes/segag80r.h b/src/mame/includes/segag80r.h
index c5aab8b90f0..ad0d0bd4ea5 100644
--- a/src/mame/includes/segag80r.h
+++ b/src/mame/includes/segag80r.h
@@ -25,8 +25,8 @@ class sega005_sound_device;
class segag80r_state : public segag80snd_common
{
public:
- segag80r_state(const machine_config &mconfig, device_type type, const char *tag)
- : segag80snd_common(mconfig, type, tag),
+ segag80r_state(const machine_config &mconfig, device_type type, const char *tag) :
+ segag80snd_common(mconfig, type, tag),
m_mainram(*this, "mainram"),
m_videoram(*this, "videoram"),
m_sn1(*this, "sn1"),
@@ -41,7 +41,8 @@ public:
m_gfxdecode(*this, "gfxdecode"),
m_screen(*this, "screen"),
m_palette(*this, "palette"),
- m_decrypted_opcodes(*this, "decrypted_opcodes") { }
+ m_decrypted_opcodes(*this, "decrypted_opcodes")
+ { }
void g80r_base(machine_config &config);
void monsterb(machine_config &config);
diff --git a/src/mame/includes/segaybd.h b/src/mame/includes/segaybd.h
index 6e08a4f6561..d344e610c10 100644
--- a/src/mame/includes/segaybd.h
+++ b/src/mame/includes/segaybd.h
@@ -42,7 +42,6 @@ public:
, m_timer_irq_state(0)
, m_vblank_irq_state(0)
, m_misc_io_data(0)
- , m_tmp_bitmap(512, 512)
{
}
@@ -140,7 +139,6 @@ private:
uint8_t m_timer_irq_state;
uint8_t m_vblank_irq_state;
uint8_t m_misc_io_data;
- bitmap_ind16 m_tmp_bitmap;
};
#endif // MAME_INCLUDES_SEGAYBD_H
diff --git a/src/mame/includes/seta.h b/src/mame/includes/seta.h
index 40e19a32162..387f4591674 100644
--- a/src/mame/includes/seta.h
+++ b/src/mame/includes/seta.h
@@ -80,6 +80,7 @@ public:
void blandiap(machine_config &config);
void wits(machine_config &config);
void msgundam(machine_config &config);
+ void msgundamb(machine_config &config);
void extdwnhl(machine_config &config);
void pairlove(machine_config &config);
void zingzip(machine_config &config);
@@ -297,6 +298,7 @@ protected:
void magspeed_map(address_map &map);
void metafox_sub_map(address_map &map);
void msgundam_map(address_map &map);
+ void msgundamb_map(address_map &map);
void oisipuzl_map(address_map &map);
void orbs_map(address_map &map);
void pairlove_map(address_map &map);
@@ -362,7 +364,7 @@ class kiwame_state : public seta_state
public:
kiwame_state(const machine_config &mconfig, device_type type, const char *tag) :
seta_state(mconfig, type, tag),
- m_tmp68301(*this, "tmp68301"),
+ m_maincpu(*this, "maincpu"),
m_key(*this, "KEY%u", 0U)
{ }
@@ -375,7 +377,7 @@ private:
void kiwame_map(address_map &map);
- required_device<tmp68301_device> m_tmp68301;
+ required_device<tmp68301_device> m_maincpu;
required_ioport_array<5> m_key;
uint16_t m_kiwame_row_select;
diff --git a/src/mame/includes/seta2.h b/src/mame/includes/seta2.h
index a40e22c4cbc..61fc336788e 100644
--- a/src/mame/includes/seta2.h
+++ b/src/mame/includes/seta2.h
@@ -28,7 +28,6 @@ public:
m_screen(*this, "screen"),
m_palette(*this, "palette"),
- m_tmp68301(*this, "tmp68301"),
m_oki(*this, "oki"),
m_eeprom(*this, "eeprom"),
m_flash(*this, "flash"),
@@ -119,7 +118,6 @@ protected:
required_device<screen_device> m_screen;
required_device<palette_device> m_palette;
- optional_device<tmp68301_device> m_tmp68301;
optional_device<okim9810_device> m_oki;
optional_device<eeprom_serial_93cxx_device> m_eeprom;
optional_device<intelfsh16_device> m_flash;
diff --git a/src/mame/includes/sms.h b/src/mame/includes/sms.h
index 4a89dd91ad8..65ddc9d3c9f 100644
--- a/src/mame/includes/sms.h
+++ b/src/mame/includes/sms.h
@@ -26,7 +26,6 @@
#include "bus/sg1000_exp/sg1000exp.h"
#include "bus/sms_ctrl/smsctrl.h"
#include "bus/sms_exp/smsexp.h"
-#include "sound/sn76496.h"
#include "sound/ym2413.h"
#include "video/315_5124.h"
@@ -41,8 +40,6 @@ public:
m_maincpu(*this, "maincpu"),
m_vdp(*this, "sms_vdp"),
m_main_scr(*this, "screen"),
- m_psg_sms(*this, "segapsg"),
- m_psg_gg(*this, "gamegear"),
m_ym(*this, "ym2413"),
m_port_ctrl1(*this, CONTROL1_TAG),
m_port_ctrl2(*this, CONTROL2_TAG),
@@ -63,14 +60,16 @@ public:
m_is_gamegear(false),
m_is_smsj(false),
m_is_mark_iii(false),
- m_is_sdisp(false),
m_ioctrl_region_is_japan(false),
m_has_bios_0400(false),
m_has_bios_2000(false),
m_has_bios_full(false),
m_has_jpn_sms_cart_slot(false),
m_has_pwr_led(false),
- m_store_cart_selection_data(false)
+ m_slot(*this, "slot"),
+ m_cardslot(*this, "mycard"),
+ m_smsexpslot(*this, "smsexp"),
+ m_sgexpslot(*this, "sgexp")
{ }
void sms_base(machine_config &config);
@@ -98,9 +97,6 @@ public:
uint32_t screen_update_sms(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
protected:
- void store_post_load();
- void store_select_cart(uint8_t data);
-
DECLARE_READ8_MEMBER(read_0000);
DECLARE_READ8_MEMBER(read_4000);
DECLARE_READ8_MEMBER(read_8000);
@@ -121,8 +117,6 @@ protected:
DECLARE_READ8_MEMBER(gg_sio_r);
DECLARE_WRITE8_MEMBER(gg_sio_w);
DECLARE_WRITE8_MEMBER(gg_psg_stereo_w);
- DECLARE_WRITE8_MEMBER(gg_psg_w);
- DECLARE_WRITE8_MEMBER(sms_psg_w);
DECLARE_READ8_MEMBER(smsj_audio_control_r);
DECLARE_WRITE8_MEMBER(smsj_audio_control_w);
DECLARE_WRITE8_MEMBER(smsj_ym2413_register_port_w);
@@ -170,8 +164,6 @@ protected:
required_device<cpu_device> m_maincpu;
required_device<sega315_5124_device> m_vdp;
required_device<screen_device> m_main_scr;
- optional_device<segapsg_device> m_psg_sms;
- optional_device<gamegear_device> m_psg_gg;
optional_device<ym2413_device> m_ym;
optional_device<sms_control_port_device> m_port_ctrl1;
optional_device<sms_control_port_device> m_port_ctrl2;
@@ -213,7 +205,6 @@ protected:
bool m_is_gamegear;
bool m_is_smsj;
bool m_is_mark_iii;
- bool m_is_sdisp;
bool m_ioctrl_region_is_japan;
bool m_has_bios_0400;
bool m_has_bios_2000;
@@ -256,15 +247,10 @@ protected:
// slot devices
sega8_cart_slot_device *m_cartslot;
- sega8_card_slot_device *m_cardslot;
- sms_expansion_slot_device *m_smsexpslot;
- sg1000_expansion_slot_device *m_sgexpslot;
-
- // these are only used by the Store Display unit, but we keep them here temporarily to avoid the need of separate start/reset
- sega8_cart_slot_device *m_slots[16];
- sega8_card_slot_device *m_cards[16];
- uint8_t m_store_control;
- uint8_t m_store_cart_selection_data;
+ optional_device<sega8_cart_slot_device> m_slot;
+ optional_device<sega8_card_slot_device> m_cardslot;
+ optional_device<sms_expansion_slot_device> m_smsexpslot;
+ optional_device<sg1000_expansion_slot_device> m_sgexpslot;
};
class smssdisp_state : public sms_state
@@ -272,21 +258,36 @@ class smssdisp_state : public sms_state
public:
smssdisp_state(const machine_config &mconfig, device_type type, const char *tag) :
sms_state(mconfig, type, tag),
- m_control_cpu(*this, "control")
+ m_control_cpu(*this, "control"),
+ m_slots(*this, {"slot", "slot2", "slot3", "slot4", "slot5", "slot6", "slot7", "slot8", "slot9", "slot10", "slot11", "slot12", "slot13", "slot14", "slot15", "slot16"}),
+ m_cards(*this, "slot%u", 17U),
+ m_store_cart_selection_data(0)
{ }
- required_device<cpu_device> m_control_cpu;
+ void sms_sdisp(machine_config &config);
+
+protected:
+ virtual void machine_start() override;
+ virtual void machine_reset() override;
+ virtual void device_post_load() override;
+private:
DECLARE_READ8_MEMBER(sms_store_cart_select_r);
DECLARE_WRITE8_MEMBER(sms_store_cart_select_w);
+ void store_select_cart(uint8_t data);
DECLARE_WRITE8_MEMBER(sms_store_control_w);
- void init_smssdisp();
DECLARE_READ8_MEMBER(store_cart_peek);
DECLARE_WRITE_LINE_MEMBER(sms_store_int_callback);
- void sms_sdisp(machine_config &config);
void sms_store_mem(address_map &map);
+
+ required_device<cpu_device> m_control_cpu;
+ required_device_array<sega8_cart_slot_device, 16> m_slots;
+ required_device_array<sega8_card_slot_device, 16> m_cards;
+
+ uint8_t m_store_control;
+ uint8_t m_store_cart_selection_data;
};
diff --git a/src/mame/includes/snes.h b/src/mame/includes/snes.h
index 287a519c21e..cfaaefc4e4c 100644
--- a/src/mame/includes/snes.h
+++ b/src/mame/includes/snes.h
@@ -421,7 +421,6 @@ protected:
DECLARE_WRITE8_MEMBER(snes_w_bank1);
DECLARE_WRITE8_MEMBER(snes_w_bank2);
uint8_t snes_open_bus_r();
- DECLARE_READ8_MEMBER(snes_open_bus_r);
TIMER_CALLBACK_MEMBER(snes_nmi_tick);
TIMER_CALLBACK_MEMBER(snes_hirq_tick_callback);
TIMER_CALLBACK_MEMBER(snes_reset_oam_address);
diff --git a/src/mame/includes/sorcerer.h b/src/mame/includes/sorcerer.h
index 72e55d03b85..87a9fe95b3d 100644
--- a/src/mame/includes/sorcerer.h
+++ b/src/mame/includes/sorcerer.h
@@ -13,6 +13,7 @@
#include "cpu/z80/z80.h"
#include "sound/wave.h"
#include "machine/ay31015.h"
+#include "machine/clock.h"
#include "bus/centronics/ctronics.h"
#include "bus/rs232/rs232.h"
#include "machine/ram.h"
@@ -54,6 +55,7 @@ public:
, m_wave1(*this, "wave")
, m_wave2(*this, "wave2")
, m_uart(*this, "uart")
+ , m_uart_clock(*this, "uart_clock")
, m_rs232(*this, "rs232")
, m_centronics(*this, "centronics")
, m_cart(*this, "cartslot")
@@ -122,6 +124,7 @@ private:
required_device<wave_device> m_wave1;
required_device<wave_device> m_wave2;
required_device<ay31015_device> m_uart;
+ required_device<clock_device> m_uart_clock;
required_device<rs232_port_device> m_rs232;
required_device<centronics_device> m_centronics;
required_device<generic_slot_device> m_cart;
diff --git a/src/mame/includes/spectrum.h b/src/mame/includes/spectrum.h
index 9ace2a689fc..a239808c7e9 100644
--- a/src/mame/includes/spectrum.h
+++ b/src/mame/includes/spectrum.h
@@ -107,8 +107,6 @@ public:
void spectrum_128(machine_config &config);
void init_spectrum();
- void init_spec128();
- void init_timex();
void init_plus2();
void init_plus3();
@@ -153,12 +151,14 @@ protected:
uint8_t *m_ram_0000;
uint8_t m_ram_disabled_by_beta;
+ DECLARE_READ8_MEMBER(opcode_fetch_r);
DECLARE_WRITE8_MEMBER(spectrum_rom_w);
DECLARE_READ8_MEMBER(spectrum_rom_r);
DECLARE_WRITE8_MEMBER(spectrum_port_fe_w);
DECLARE_READ8_MEMBER(spectrum_port_fe_r);
DECLARE_READ8_MEMBER(spectrum_port_ula_r);
+ DECLARE_READ8_MEMBER(spectrum_128_opcode_fetch_r);
DECLARE_WRITE8_MEMBER(spectrum_128_bank1_w);
DECLARE_READ8_MEMBER(spectrum_128_bank1_r);
DECLARE_WRITE8_MEMBER(spectrum_128_port_7ffd_w);
@@ -217,8 +217,10 @@ protected:
void spectrum_128_io(address_map &map);
void spectrum_128_mem(address_map &map);
+ void spectrum_128_fetch(address_map &map);
void spectrum_io(address_map &map);
void spectrum_mem(address_map &map);
+ void spectrum_fetch(address_map &map);
void spectrum_plus3_io(address_map &map);
void spectrum_plus3_mem(address_map &map);
void tc2048_io(address_map &map);
diff --git a/src/mame/includes/sprint2.h b/src/mame/includes/sprint2.h
index 00a0927fccb..4cb35258f75 100644
--- a/src/mame/includes/sprint2.h
+++ b/src/mame/includes/sprint2.h
@@ -96,7 +96,7 @@ private:
required_device<cpu_device> m_maincpu;
required_device<watchdog_timer_device> m_watchdog;
required_device<f9334_device> m_outlatch;
- required_device<discrete_device> m_discrete;
+ required_device<discrete_sound_device> m_discrete;
required_device<gfxdecode_device> m_gfxdecode;
required_device<screen_device> m_screen;
required_device<palette_device> m_palette;
diff --git a/src/mame/includes/sprint4.h b/src/mame/includes/sprint4.h
index 77e124f38c7..d51a4a5030b 100644
--- a/src/mame/includes/sprint4.h
+++ b/src/mame/includes/sprint4.h
@@ -67,7 +67,7 @@ private:
required_device<cpu_device> m_maincpu;
required_device<watchdog_timer_device> m_watchdog;
- required_device<discrete_device> m_discrete;
+ required_device<discrete_sound_device> m_discrete;
required_device<gfxdecode_device> m_gfxdecode;
required_device<screen_device> m_screen;
required_device<palette_device> m_palette;
diff --git a/src/mame/includes/sprint8.h b/src/mame/includes/sprint8.h
index 1439e0747e3..9392b32d06d 100644
--- a/src/mame/includes/sprint8.h
+++ b/src/mame/includes/sprint8.h
@@ -59,7 +59,7 @@ private:
required_device<gfxdecode_device> m_gfxdecode;
required_device<screen_device> m_screen;
required_device<palette_device> m_palette;
- required_device<discrete_device> m_discrete;
+ required_device<discrete_sound_device> m_discrete;
required_shared_ptr<uint8_t> m_video_ram;
required_shared_ptr<uint8_t> m_pos_h_ram;
diff --git a/src/mame/includes/taitosj.h b/src/mame/includes/taitosj.h
index e1fea20a1c5..4736857f79d 100644
--- a/src/mame/includes/taitosj.h
+++ b/src/mame/includes/taitosj.h
@@ -82,7 +82,7 @@ private:
required_device<input_merger_device> m_soundnmi;
required_device<input_merger_device> m_soundnmi2;
required_device<dac_8bit_r2r_device> m_dac;
- required_device<discrete_device> m_dacvol;
+ required_device<discrete_sound_device> m_dacvol;
required_device<ay8910_device> m_ay1;
required_device<ay8910_device> m_ay2;
required_device<ay8910_device> m_ay3;
diff --git a/src/mame/includes/tandy2k.h b/src/mame/includes/tandy2k.h
index 3029976842c..9515335bf06 100644
--- a/src/mame/includes/tandy2k.h
+++ b/src/mame/includes/tandy2k.h
@@ -19,6 +19,7 @@
#include "machine/tandy2kb.h"
#include "machine/timer.h"
#include "machine/upd765.h"
+#include "machine/bankdev.h"
#include "sound/spkrdev.h"
#include "video/crt9007.h"
#include "video/crt9021.h"
@@ -58,7 +59,8 @@ public:
m_drb0(*this, CRT9212_0_TAG),
m_drb1(*this, CRT9212_1_TAG),
m_vac(*this, CRT9021B_TAG),
- m_palette(*this, "palette"),
+ m_colpal(*this, "colpal"),
+ m_vrambank(*this, "vrambank"),
m_timer_vidldsh(*this, "vidldsh"),
m_centronics(*this, CENTRONICS_TAG),
m_speaker(*this, "speaker"),
@@ -98,7 +100,10 @@ public:
m_centronics_fault(0),
m_centronics_select(0),
m_centronics_perror(0),
- m_centronics_busy(0)
+ m_centronics_busy(0),
+ m_buttons(*this, "MOUSEBTN"),
+ m_x_axis(*this, "MOUSEX"),
+ m_y_axis(*this, "MOUSEY")
{
for (auto & elem : m_busdmarq)
{
@@ -108,6 +113,7 @@ public:
void tandy2k_hd(machine_config &config);
void tandy2k(machine_config &config);
+ DECLARE_INPUT_CHANGED_MEMBER(input_changed);
private:
required_device<i80186_cpu_device> m_maincpu;
@@ -121,7 +127,8 @@ private:
required_device<crt9212_device> m_drb0;
required_device<crt9212_device> m_drb1;
required_device<crt9021_device> m_vac;
- required_device<palette_device> m_palette;
+ required_device<palette_device> m_colpal;
+ required_device<address_map_bank_device> m_vrambank;
required_device<timer_device> m_timer_vidldsh;
required_device<centronics_device> m_centronics;
required_device<speaker_sound_device> m_speaker;
@@ -135,7 +142,9 @@ private:
required_device<pc_keyboard_device> m_pc_keyboard; // temporary until the tandy keyboard has a rom dump
virtual void machine_start() override;
+ virtual void machine_reset() override;
virtual void device_reset_after_children() override;
+ virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override;
uint32_t screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
@@ -150,8 +159,6 @@ private:
DECLARE_WRITE8_MEMBER( enable_w );
DECLARE_WRITE8_MEMBER( dma_mux_w );
DECLARE_READ8_MEMBER( kbint_clr_r );
- DECLARE_READ16_MEMBER( vpac_r );
- DECLARE_WRITE16_MEMBER( vpac_w );
DECLARE_READ8_MEMBER( fldtc_r );
DECLARE_WRITE8_MEMBER( fldtc_w );
DECLARE_WRITE8_MEMBER( addr_ctrl_w );
@@ -168,10 +175,15 @@ private:
DECLARE_WRITE_LINE_MEMBER( vpac_cblank_w );
DECLARE_WRITE_LINE_MEMBER( vpac_slg_w );
DECLARE_WRITE_LINE_MEMBER( vpac_sld_w );
+ DECLARE_READ8_MEMBER( hires_status_r );
+ DECLARE_WRITE8_MEMBER( hires_plane_w );
+ DECLARE_WRITE8_MEMBER( hires_palette_w );
DECLARE_WRITE8_MEMBER( vidla_w );
DECLARE_WRITE8_MEMBER( drb_attr_w );
DECLARE_WRITE_LINE_MEMBER( kbdclk_w );
DECLARE_WRITE_LINE_MEMBER( kbddat_w );
+ DECLARE_READ8_MEMBER( clkmouse_r );
+ DECLARE_WRITE8_MEMBER( clkmouse_w );
DECLARE_READ8_MEMBER( irq_callback );
DECLARE_WRITE_LINE_MEMBER( fdc_drq_w );
DECLARE_WRITE_LINE_MEMBER( fdc_hdl_w );
@@ -183,6 +195,7 @@ private:
CRT9021_DRAW_CHARACTER_MEMBER( vac_draw_character );
TIMER_DEVICE_CALLBACK_MEMBER( vidldsh_tick );
DECLARE_FLOPPY_FORMATS( floppy_formats );
+ static rgb_t IRGB(uint32_t raw);
enum
{
@@ -223,6 +236,7 @@ private:
int m_sld;
uint8_t m_cgra;
uint8_t m_vidla;
+ uint8_t m_hires_en;
/* sound state */
int m_outspkr;
@@ -234,10 +248,32 @@ private:
int m_centronics_perror;
int m_centronics_busy;
+ enum
+ {
+ MO_IRQ = 1,
+ BT_IRQ = 2
+ };
+
+ enum
+ {
+ MOUS_TIMER,
+ MCU_DELAY
+ };
+
+ uint8_t m_clkmouse_cmd[8];
+ int m_clkmouse_cnt;
+ uint8_t m_clkmouse_irq;
+ uint16_t m_mouse_x, m_mouse_y;
+ emu_timer *m_mouse_timer;
+ emu_timer *m_mcu_delay;
+
void tandy2k_hd_io(address_map &map);
void tandy2k_io(address_map &map);
void tandy2k_mem(address_map &map);
void vpac_mem(address_map &map);
+ void vrambank_mem(address_map &map);
+
+ required_ioport m_buttons, m_x_axis, m_y_axis;
};
#endif // MAME_INCLUDES_TANDY2K_H
diff --git a/src/mame/includes/terracre.h b/src/mame/includes/terracre.h
index d6f2b35806d..9eedc5773f6 100644
--- a/src/mame/includes/terracre.h
+++ b/src/mame/includes/terracre.h
@@ -31,8 +31,9 @@ public:
protected:
void amazon_base_map(address_map &map);
-private:
required_device<cpu_device> m_maincpu;
+
+private:
required_device<gfxdecode_device> m_gfxdecode;
required_device<palette_device> m_palette;
required_device<buffered_spriteram16_device> m_spriteram;
diff --git a/src/mame/includes/thomson.h b/src/mame/includes/thomson.h
index 5a7ec3760d9..b0d1dc13c88 100644
--- a/src/mame/includes/thomson.h
+++ b/src/mame/includes/thomson.h
@@ -181,6 +181,7 @@ public:
void overlay_scandraw_16( uint8_t* vram, uint16_t* dst, uint16_t* pal, int org, int len );
void overlayhalf_scandraw_16( uint8_t* vram, uint16_t* dst, uint16_t* pal, int org, int len );
void overlay3_scandraw_16( uint8_t* vram, uint16_t* dst, uint16_t* pal, int org, int len );
+ void bitmap16alt_scandraw_16( uint8_t* vram, uint16_t* dst, uint16_t* pal, int org, int len );
void to770_scandraw_8( uint8_t* vram, uint16_t* dst, uint16_t* pal, int org, int len );
void mo5_scandraw_8( uint8_t* vram, uint16_t* dst, uint16_t* pal, int org, int len );
void mo5alt_scandraw_8( uint8_t* vram, uint16_t* dst, uint16_t* pal, int org, int len );
@@ -196,6 +197,7 @@ public:
void overlay_scandraw_8( uint8_t* vram, uint16_t* dst, uint16_t* pal, int org, int len );
void overlayhalf_scandraw_8( uint8_t* vram, uint16_t* dst, uint16_t* pal, int org, int len );
void overlay3_scandraw_8( uint8_t* vram, uint16_t* dst, uint16_t* pal, int org, int len );
+ void bitmap16alt_scandraw_8( uint8_t* vram, uint16_t* dst, uint16_t* pal, int org, int len );
private:
DECLARE_FLOPPY_FORMATS(cd90_640_formats);
@@ -377,14 +379,14 @@ private:
void to7_network_got_frame(uint8_t *data, int length);
- void mo5(address_map &map);
- void mo5nr(address_map &map);
- void mo6(address_map &map);
- void to7(address_map &map);
- void to770(address_map &map);
- void to8(address_map &map);
- void to9(address_map &map);
- void to9p(address_map &map);
+ void mo5_map(address_map &map);
+ void mo5nr_map(address_map &map);
+ void mo6_map(address_map &map);
+ void to7_map(address_map &map);
+ void to770_map(address_map &map);
+ void to8_map(address_map &map);
+ void to9_map(address_map &map);
+ void to9p_map(address_map &map);
required_device<cpu_device> m_maincpu;
required_device<cassette_image_device> m_cassette;
@@ -690,7 +692,8 @@ private:
#define THOM_VMODE_BITMAP4_ALT_HALF 12
#define THOM_VMODE_MO5_ALT 13
#define THOM_VMODE_OVERLAY_HALF 14
-#define THOM_VMODE_NB 15
+#define THOM_VMODE_BITMAP16_ALT 15
+#define THOM_VMODE_NB 16
class to7_io_line_device : public device_t
diff --git a/src/mame/includes/ti85.h b/src/mame/includes/ti85.h
index 66a28ba9377..ff2cdf841ce 100644
--- a/src/mame/includes/ti85.h
+++ b/src/mame/includes/ti85.h
@@ -62,10 +62,7 @@ public:
, m_link_port(*this, "linkport")
, m_nvram(*this, "nvram")
, m_flash(*this, "flash")
- , m_membank1(*this, "membank1")
- , m_membank2(*this, "membank2")
- , m_membank3(*this, "membank3")
- , m_membank4(*this, "membank4")
+ , m_membank(*this, "membank%u", 0U)
{
}
@@ -87,10 +84,7 @@ private:
optional_device<ti8x_link_port_device> m_link_port;
optional_shared_ptr<uint8_t> m_nvram;
optional_device<intelfsh8_device> m_flash;
- optional_device<address_map_bank_device> m_membank1;
- optional_device<address_map_bank_device> m_membank2;
- optional_device<address_map_bank_device> m_membank3;
- optional_device<address_map_bank_device> m_membank4;
+ optional_device_array<address_map_bank_device, 4> m_membank;
ti85_model m_model;
@@ -226,8 +220,8 @@ private:
DECLARE_WRITE8_MEMBER(ti83pse_ctimer3_loop_w);
DECLARE_READ8_MEMBER(ti83pse_ctimer3_count_r);
DECLARE_WRITE8_MEMBER(ti83pse_ctimer3_count_w);
- DECLARE_READ8_MEMBER(ti83p_membank2_r);
- DECLARE_READ8_MEMBER(ti83p_membank3_r);
+ uint8_t ti83p_membank2_r(offs_t offset);
+ uint8_t ti83p_membank3_r(offs_t offset);
void ti8x_update_bank(address_space &space, uint8_t bank, uint8_t *base, uint8_t page, bool is_ram);
void update_ti85_memory();
diff --git a/src/mame/includes/timelimt.h b/src/mame/includes/timelimt.h
index e600d5ab864..175d6e3ea22 100644
--- a/src/mame/includes/timelimt.h
+++ b/src/mame/includes/timelimt.h
@@ -27,7 +27,6 @@ protected:
virtual void machine_start() override;
virtual void video_start() override;
-private:
required_device<cpu_device> m_maincpu;
required_device<cpu_device> m_audiocpu;
required_device<gfxdecode_device> m_gfxdecode;
diff --git a/src/mame/includes/tmnt.h b/src/mame/includes/tmnt.h
index 817ec7f8a35..4714b66055e 100644
--- a/src/mame/includes/tmnt.h
+++ b/src/mame/includes/tmnt.h
@@ -147,8 +147,6 @@ private:
DECLARE_WRITE16_MEMBER(ssriders_soundkludge_w);
DECLARE_WRITE16_MEMBER(k053251_glfgreat_w);
DECLARE_WRITE16_MEMBER(tmnt2_1c0800_w);
- DECLARE_READ8_MEMBER(k054539_ctrl_r);
- DECLARE_WRITE8_MEMBER(k054539_ctrl_w);
DECLARE_WRITE16_MEMBER(tmnt_0a0000_w);
DECLARE_WRITE16_MEMBER(punkshot_0a0020_w);
DECLARE_WRITE16_MEMBER(lgtnfght_0a0018_w);
diff --git a/src/mame/includes/toaplan1.h b/src/mame/includes/toaplan1.h
index b687bd71173..b884f1ca4f4 100644
--- a/src/mame/includes/toaplan1.h
+++ b/src/mame/includes/toaplan1.h
@@ -24,18 +24,17 @@ public:
m_bgpaletteram(*this, "bgpalette"),
m_fgpaletteram(*this, "fgpalette"),
m_sharedram(*this, "sharedram"),
+ m_dswb_io(*this, "DSWB"),
+ m_tjump_io(*this, "TJUMP"),
m_spriteram(*this, "spriteram"),
m_maincpu(*this, "maincpu"),
m_audiocpu(*this, "audiocpu"),
m_ymsnd(*this, "ymsnd"),
- m_dsp(*this, "dsp"),
m_gfxdecode(*this, "gfxdecode"),
m_screen(*this, "screen"),
m_palette(*this, "palette")
{ }
- void demonwld(machine_config &config);
- void samesame(machine_config &config);
void truxton(machine_config &config);
void outzone(machine_config &config);
void vimana(machine_config &config);
@@ -43,161 +42,112 @@ public:
void hellfire(machine_config &config);
void zerowing(machine_config &config);
- void init_toaplan1();
- void init_demonwld();
+protected:
+ virtual void machine_start() override;
+ virtual void machine_reset() override;
+ virtual void video_start() override;
- DECLARE_MACHINE_RESET(toaplan1);
+ required_shared_ptr<u16> m_bgpaletteram;
+ required_shared_ptr<u16> m_fgpaletteram;
-protected:
- required_shared_ptr<uint16_t> m_bgpaletteram;
- required_shared_ptr<uint16_t> m_fgpaletteram;
+ optional_shared_ptr<u8> m_sharedram;
- optional_shared_ptr<uint8_t> m_sharedram;
+ optional_ioport m_dswb_io;
+ optional_ioport m_tjump_io;
int m_intenable;
- /* Demon world */
- int m_dsp_on;
- int m_dsp_bio;
- int m_dsp_execute;
- uint32_t m_dsp_addr_w;
- uint32_t m_main_ram_seg;
-
- std::unique_ptr<uint16_t[]> m_pf4_tilevram16; /* || Drawn in this order */
- std::unique_ptr<uint16_t[]> m_pf3_tilevram16; /* || */
- std::unique_ptr<uint16_t[]> m_pf2_tilevram16; /* \||/ */
- std::unique_ptr<uint16_t[]> m_pf1_tilevram16; /* \/ */
-
- optional_shared_ptr<uint16_t> m_spriteram;
- std::unique_ptr<uint16_t[]> m_buffered_spriteram;
- std::unique_ptr<uint16_t[]> m_spritesizeram16;
- std::unique_ptr<uint16_t[]> m_buffered_spritesizeram16;
-
- int32_t m_bcu_flipscreen; /* Tile controller flip flag */
- int32_t m_fcu_flipscreen; /* Sprite controller flip flag */
-
- int32_t m_pf_voffs;
- int32_t m_spriteram_offs;
-
- int32_t m_pf1_scrollx;
- int32_t m_pf1_scrolly;
- int32_t m_pf2_scrollx;
- int32_t m_pf2_scrolly;
- int32_t m_pf3_scrollx;
- int32_t m_pf3_scrolly;
- int32_t m_pf4_scrollx;
- int32_t m_pf4_scrolly;
+ std::unique_ptr<u16[]> m_tilevram[4];
+ /*
+ std::unique_ptr<u16[]> m_tilevram[3]; // || Drawn in this order
+ std::unique_ptr<u16[]> m_tilevram[2]; // ||
+ std::unique_ptr<u16[]> m_tilevram[1]; // \||/
+ std::unique_ptr<u16[]> m_tilevram[0]; // \/
+ */
+
+ optional_shared_ptr<u16> m_spriteram;
+ std::unique_ptr<u16[]> m_buffered_spriteram;
+ std::unique_ptr<u16[]> m_spritesizeram;
+ std::unique_ptr<u16[]> m_buffered_spritesizeram;
+
+ s32 m_bcu_flipscreen; /* Tile controller flip flag */
+ s32 m_fcu_flipscreen; /* Sprite controller flip flag */
+
+ s32 m_pf_voffs;
+ s32 m_spriteram_offs;
+
+ s32 m_scrollx[4];
+ s32 m_scrolly[4];
#ifdef MAME_DEBUG
- int m_display_pf1;
- int m_display_pf2;
- int m_display_pf3;
- int m_display_pf4;
+ int m_display_pf[4];
int m_displog;
#endif
- int32_t m_tiles_offsetx;
- int32_t m_tiles_offsety;
-
- tilemap_t *m_pf1_tilemap;
- tilemap_t *m_pf2_tilemap;
- tilemap_t *m_pf3_tilemap;
- tilemap_t *m_pf4_tilemap;
-
- DECLARE_WRITE16_MEMBER(toaplan1_intenable_w);
- DECLARE_WRITE16_MEMBER(demonwld_dsp_addrsel_w);
- DECLARE_READ16_MEMBER(demonwld_dsp_r);
- DECLARE_WRITE16_MEMBER(demonwld_dsp_w);
- DECLARE_WRITE16_MEMBER(demonwld_dsp_bio_w);
- DECLARE_READ_LINE_MEMBER(demonwld_bio_r);
- DECLARE_WRITE16_MEMBER(demonwld_dsp_ctrl_w);
- DECLARE_READ16_MEMBER(samesame_port_6_word_r);
- DECLARE_READ16_MEMBER(toaplan1_shared_r);
- DECLARE_WRITE16_MEMBER(toaplan1_shared_w);
- DECLARE_WRITE16_MEMBER(toaplan1_reset_sound_w);
- DECLARE_WRITE8_MEMBER(toaplan1_coin_w);
- DECLARE_WRITE16_MEMBER(samesame_coin_w);
-
- DECLARE_READ16_MEMBER(toaplan1_frame_done_r);
- DECLARE_WRITE16_MEMBER(toaplan1_tile_offsets_w);
- DECLARE_WRITE16_MEMBER(toaplan1_bcu_flipscreen_w);
- DECLARE_WRITE16_MEMBER(toaplan1_fcu_flipscreen_w);
- DECLARE_READ16_MEMBER(toaplan1_spriteram_offs_r);
- DECLARE_WRITE16_MEMBER(toaplan1_spriteram_offs_w);
- DECLARE_WRITE16_MEMBER(toaplan1_bgpalette_w);
- DECLARE_WRITE16_MEMBER(toaplan1_fgpalette_w);
- DECLARE_READ16_MEMBER(toaplan1_spriteram16_r);
- DECLARE_WRITE16_MEMBER(toaplan1_spriteram16_w);
- DECLARE_READ16_MEMBER(toaplan1_spritesizeram16_r);
- DECLARE_WRITE16_MEMBER(toaplan1_spritesizeram16_w);
- DECLARE_WRITE16_MEMBER(toaplan1_bcu_control_w);
- DECLARE_READ16_MEMBER(toaplan1_tileram_offs_r);
- DECLARE_WRITE16_MEMBER(toaplan1_tileram_offs_w);
- DECLARE_READ16_MEMBER(toaplan1_tileram16_r);
- DECLARE_WRITE16_MEMBER(toaplan1_tileram16_w);
- DECLARE_READ16_MEMBER(toaplan1_scroll_regs_r);
- DECLARE_WRITE16_MEMBER(toaplan1_scroll_regs_w);
+ s32 m_tiles_offsetx;
+ s32 m_tiles_offsety;
+
+ tilemap_t *m_tilemap[4];
+
+ void intenable_w(u8 data);
+ u8 shared_r(offs_t offset);
+ void shared_w(offs_t offset, u8 data);
+ void reset_sound_w(u8 data);
+ void coin_w(u8 data);
+
+ u16 frame_done_r();
+ DECLARE_WRITE16_MEMBER(tile_offsets_w);
+ void bcu_flipscreen_w(u8 data);
+ void fcu_flipscreen_w(u8 data);
+ u16 spriteram_offs_r();
+ void spriteram_offs_w(offs_t offset, u16 data, u16 mem_mask = ~0);
+ void bgpalette_w(offs_t offset, u16 data, u16 mem_mask = ~0);
+ void fgpalette_w(offs_t offset, u16 data, u16 mem_mask = ~0);
+ u16 spriteram_r();
+ void spriteram_w(offs_t offset, u16 data, u16 mem_mask = ~0);
+ u16 spritesizeram_r();
+ void spritesizeram_w(offs_t offset, u16 data, u16 mem_mask = ~0);
+ void bcu_control_w(offs_t offset, u16 data);
+ u16 tileram_offs_r();
+ void tileram_offs_w(offs_t offset, u16 data, u16 mem_mask = ~0);
+ u16 tileram_r(offs_t offset);
+ void tileram_w(offs_t offset, u16 data, u16 mem_mask = ~0);
+ u16 scroll_regs_r(offs_t offset);
+ void scroll_regs_w(offs_t offset, u16 data, u16 mem_mask = ~0);
+
+ u8 vimana_dswb_invert_r();
+ u8 vimana_tjump_invert_r();
+
+ template<unsigned Layer> TILE_GET_INFO_MEMBER(get_tile_info);
- // Fire Shark sound
- uint8_t m_to_mcu;
- uint8_t m_cmdavailable;
-
- DECLARE_READ8_MEMBER(vimana_dswb_invert_r);
- DECLARE_READ8_MEMBER(vimana_tjump_invert_r);
- DECLARE_WRITE16_MEMBER(samesame_mcu_w);
- DECLARE_READ8_MEMBER(samesame_soundlatch_r);
- DECLARE_WRITE8_MEMBER(samesame_sound_done_w);
- DECLARE_READ8_MEMBER(samesame_cmdavailable_r);
-
- TILE_GET_INFO_MEMBER(get_pf1_tile_info);
- TILE_GET_INFO_MEMBER(get_pf2_tile_info);
- TILE_GET_INFO_MEMBER(get_pf3_tile_info);
- TILE_GET_INFO_MEMBER(get_pf4_tile_info);
-
- DECLARE_VIDEO_START(toaplan1);
DECLARE_MACHINE_RESET(zerowing);
- DECLARE_MACHINE_RESET(demonwld);
- DECLARE_MACHINE_RESET(vimana);
- uint32_t screen_update_toaplan1(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
-
- DECLARE_WRITE_LINE_MEMBER(screen_vblank_toaplan1);
- DECLARE_WRITE_LINE_MEMBER(screen_vblank_samesame);
- void toaplan1_interrupt();
-
- void demonwld_restore_dsp();
- void toaplan1_create_tilemaps();
- void toaplan1_vram_alloc();
- void toaplan1_spritevram_alloc();
- void toaplan1_set_scrolls();
+ u32 screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
+
+ DECLARE_WRITE_LINE_MEMBER(screen_vblank);
+ void interrupt();
+
+ void create_tilemaps();
+ void vram_alloc();
+ void spritevram_alloc();
+ void set_scrolls();
void register_common();
- void toaplan1_log_vram();
+ void log_vram();
void draw_sprites(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect );
- void demonwld_dsp(int enable);
- void toaplan1_reset_sound();
- void toaplan1_driver_savestate();
- void demonwld_driver_savestate();
- DECLARE_WRITE_LINE_MEMBER(toaplan1_reset_callback);
+ void reset_sound();
+ DECLARE_WRITE_LINE_MEMBER(reset_callback);
required_device<m68000_device> m_maincpu;
required_device<cpu_device> m_audiocpu;
required_device<ym3812_device> m_ymsnd;
- optional_device<tms32010_device> m_dsp;
required_device<gfxdecode_device> m_gfxdecode;
required_device<screen_device> m_screen;
required_device<palette_device> m_palette;
- void dsp_io_map(address_map &map);
- void dsp_program_map(address_map &map);
- void demonwld_main_map(address_map &map);
- void demonwld_sound_io_map(address_map &map);
void hellfire_main_map(address_map &map);
void hellfire_sound_io_map(address_map &map);
void outzone_main_map(address_map &map);
void outzone_sound_io_map(address_map &map);
void outzonecv_main_map(address_map &map);
- void samesame_hd647180_io_map(address_map &map);
- void samesame_hd647180_mem_map(address_map &map);
- void samesame_main_map(address_map &map);
- void toaplan1_sound_map(address_map &map);
+ void sound_map(address_map &map);
void truxton_main_map(address_map &map);
void truxton_sound_io_map(address_map &map);
void vimana_hd647180_io_map(address_map &map);
@@ -218,19 +168,91 @@ public:
void rallybik(machine_config &config);
+protected:
+ virtual void video_start() override;
+
private:
DECLARE_WRITE_LINE_MEMBER(coin_counter_1_w);
DECLARE_WRITE_LINE_MEMBER(coin_counter_2_w);
DECLARE_WRITE_LINE_MEMBER(coin_lockout_1_w);
DECLARE_WRITE_LINE_MEMBER(coin_lockout_2_w);
- DECLARE_READ16_MEMBER(rallybik_tileram16_r);
- DECLARE_VIDEO_START(rallybik);
- uint32_t screen_update_rallybik(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
- DECLARE_WRITE_LINE_MEMBER(screen_vblank_rallybik);
+ u16 tileram_r(offs_t offset);
+ u32 screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
+ DECLARE_WRITE_LINE_MEMBER(screen_vblank);
required_device<toaplan_scu_device> m_spritegen;
void rallybik_main_map(address_map &map);
void rallybik_sound_io_map(address_map &map);
};
+class toaplan1_demonwld_state : public toaplan1_state
+{
+public:
+ toaplan1_demonwld_state(const machine_config &mconfig, device_type type, const char *tag) :
+ toaplan1_state(mconfig, type, tag),
+ m_dsp(*this, "dsp")
+ {
+ }
+
+ void demonwld(machine_config &config);
+
+protected:
+ virtual void device_post_load() override;
+ virtual void machine_start() override;
+ virtual void machine_reset() override;
+
+private:
+ /* Demon world */
+ int m_dsp_on;
+ int m_dsp_bio;
+ int m_dsp_execute;
+ u32 m_dsp_addr_w;
+ u32 m_main_ram_seg;
+
+ void dsp_addrsel_w(u16 data);
+ u16 dsp_r();
+ void dsp_w(u16 data);
+ void dsp_bio_w(u16 data);
+ DECLARE_READ_LINE_MEMBER(bio_r);
+ void dsp_ctrl_w(u8 data);
+ void dsp_int_w(int enable);
+
+ required_device<tms32010_device> m_dsp;
+ void dsp_io_map(address_map &map);
+ void dsp_program_map(address_map &map);
+ void main_map(address_map &map);
+ void sound_io_map(address_map &map);
+};
+
+class toaplan1_samesame_state : public toaplan1_state
+{
+public:
+ toaplan1_samesame_state(const machine_config &mconfig, device_type type, const char *tag) :
+ toaplan1_state(mconfig, type, tag)
+ {
+ }
+
+ void samesame(machine_config &config);
+
+protected:
+ virtual void machine_start() override;
+
+private:
+ // Fire Shark sound
+ u8 m_to_mcu;
+ u8 m_cmdavailable;
+
+ void mcu_w(u8 data);
+ u8 soundlatch_r();
+ void sound_done_w(u8 data);
+ u8 cmdavailable_r();
+ u8 port_6_word_r();
+
+ DECLARE_WRITE_LINE_MEMBER(screen_vblank);
+
+ void hd647180_io_map(address_map &map);
+ void hd647180_mem_map(address_map &map);
+ void main_map(address_map &map);
+};
+
#endif // MAME_INCLUDES_TOAPLAN1_H
diff --git a/src/mame/includes/trs80.h b/src/mame/includes/trs80.h
index 6a4ee33673d..d3576b45f36 100644
--- a/src/mame/includes/trs80.h
+++ b/src/mame/includes/trs80.h
@@ -14,7 +14,7 @@
#include "imagedev/floppy.h"
#include "imagedev/snapquik.h"
#include "machine/ay31015.h"
-#include "machine/com8116.h"
+#include "machine/clock.h"
#include "machine/i8255.h"
#include "bus/rs232/rs232.h"
#include "machine/buffer.h"
@@ -41,8 +41,8 @@ public:
, m_cent_data_out(*this, "cent_data_out")
, m_cent_status_in(*this, "cent_status_in")
, m_uart(*this, "uart")
+ , m_uart_clock(*this, "uart_clock")
, m_ppi(*this, "ppi") // Radionic only
- , m_brg(*this, "brg")
, m_fdc(*this, "fdc")
, m_floppy0(*this, "fdc:0")
, m_floppy1(*this, "fdc:1")
@@ -56,6 +56,7 @@ public:
{ }
void sys80(machine_config &config);
+ void sys80p(machine_config &config);
void trs80(machine_config &config);
void lnw80(machine_config &config);
void radionic(machine_config &config);
@@ -135,8 +136,8 @@ private:
optional_device<output_latch_device> m_cent_data_out;
optional_device<input_buffer_device> m_cent_status_in;
optional_device<ay31015_device> m_uart;
+ optional_device<clock_device> m_uart_clock;
optional_device<i8255_device> m_ppi;
- optional_device<com8116_device> m_brg;
optional_device<fd1793_device> m_fdc;
optional_device<floppy_connector> m_floppy0;
optional_device<floppy_connector> m_floppy1;
diff --git a/src/mame/includes/twincobr.h b/src/mame/includes/twincobr.h
index 5bcda60c5bc..e212a0fe71c 100644
--- a/src/mame/includes/twincobr.h
+++ b/src/mame/includes/twincobr.h
@@ -43,50 +43,52 @@ public:
void init_twincobr();
protected:
+ virtual void device_post_load() override;
+ virtual void machine_reset() override;
virtual void video_start() override;
- optional_shared_ptr<uint8_t> m_sharedram;
+ optional_shared_ptr<u8> m_sharedram;
optional_device<buffered_spriteram8_device> m_spriteram8;
optional_device<buffered_spriteram16_device> m_spriteram16;
- int32_t m_fg_rom_bank;
- int32_t m_bg_ram_bank;
+ u32 m_fg_rom_bank;
+ u32 m_bg_ram_bank;
int m_intenable;
int m_dsp_on;
int m_dsp_bio;
int m_fsharkbt_8741;
int m_dsp_execute;
- uint32_t m_dsp_addr_w;
- uint32_t m_main_ram_seg;
- std::unique_ptr<uint16_t[]> m_bgvideoram16;
- std::unique_ptr<uint16_t[]> m_fgvideoram16;
- std::unique_ptr<uint16_t[]> m_txvideoram16;
+ u32 m_dsp_addr_w;
+ u32 m_main_ram_seg;
+ std::unique_ptr<u16[]> m_bgvideoram16;
+ std::unique_ptr<u16[]> m_fgvideoram16;
+ std::unique_ptr<u16[]> m_txvideoram16;
size_t m_bgvideoram_size;
size_t m_fgvideoram_size;
size_t m_txvideoram_size;
- int32_t m_txscrollx;
- int32_t m_txscrolly;
- int32_t m_fgscrollx;
- int32_t m_fgscrolly;
- int32_t m_bgscrollx;
- int32_t m_bgscrolly;
- int32_t m_txoffs;
- int32_t m_fgoffs;
- int32_t m_bgoffs;
- int32_t m_display_on;
+ s32 m_txscrollx;
+ s32 m_txscrolly;
+ s32 m_fgscrollx;
+ s32 m_fgscrolly;
+ s32 m_bgscrollx;
+ s32 m_bgscrolly;
+ s32 m_txoffs;
+ s32 m_fgoffs;
+ s32 m_bgoffs;
+ s32 m_display_on;
tilemap_t *m_bg_tilemap;
tilemap_t *m_fg_tilemap;
tilemap_t *m_tx_tilemap;
- DECLARE_WRITE16_MEMBER(twincobr_dsp_addrsel_w);
- DECLARE_READ16_MEMBER(twincobr_dsp_r);
- DECLARE_WRITE16_MEMBER(twincobr_dsp_w);
- DECLARE_WRITE16_MEMBER(wardner_dsp_addrsel_w);
- DECLARE_READ16_MEMBER(wardner_dsp_r);
- DECLARE_WRITE16_MEMBER(wardner_dsp_w);
- DECLARE_WRITE16_MEMBER(twincobr_dsp_bio_w);
- DECLARE_READ16_MEMBER(fsharkbt_dsp_r);
- DECLARE_WRITE16_MEMBER(fsharkbt_dsp_w);
+ void twincobr_dsp_addrsel_w(u16 data);
+ u16 twincobr_dsp_r();
+ void twincobr_dsp_w(u16 data);
+ void wardner_dsp_addrsel_w(u16 data);
+ u16 wardner_dsp_r();
+ void wardner_dsp_w(u16 data);
+ void twincobr_dsp_bio_w(u16 data);
+ u16 fsharkbt_dsp_r();
+ void fsharkbt_dsp_w(u16 data);
DECLARE_READ_LINE_MEMBER(twincobr_bio_r);
DECLARE_WRITE_LINE_MEMBER(int_enable_w);
DECLARE_WRITE_LINE_MEMBER(dsp_int_w);
@@ -94,47 +96,45 @@ protected:
DECLARE_WRITE_LINE_MEMBER(coin_counter_2_w);
DECLARE_WRITE_LINE_MEMBER(coin_lockout_1_w);
DECLARE_WRITE_LINE_MEMBER(coin_lockout_2_w);
- DECLARE_READ16_MEMBER(twincobr_sharedram_r);
- DECLARE_WRITE16_MEMBER(twincobr_sharedram_w);
- DECLARE_WRITE16_MEMBER(twincobr_txoffs_w);
- DECLARE_READ16_MEMBER(twincobr_txram_r);
- DECLARE_WRITE16_MEMBER(twincobr_txram_w);
- DECLARE_WRITE16_MEMBER(twincobr_bgoffs_w);
- DECLARE_READ16_MEMBER(twincobr_bgram_r);
- DECLARE_WRITE16_MEMBER(twincobr_bgram_w);
- DECLARE_WRITE16_MEMBER(twincobr_fgoffs_w);
- DECLARE_READ16_MEMBER(twincobr_fgram_r);
- DECLARE_WRITE16_MEMBER(twincobr_fgram_w);
- DECLARE_WRITE16_MEMBER(twincobr_txscroll_w);
- DECLARE_WRITE16_MEMBER(twincobr_bgscroll_w);
- DECLARE_WRITE16_MEMBER(twincobr_fgscroll_w);
- DECLARE_WRITE16_MEMBER(twincobr_exscroll_w);
- DECLARE_WRITE8_MEMBER(wardner_txlayer_w);
- DECLARE_WRITE8_MEMBER(wardner_bglayer_w);
- DECLARE_WRITE8_MEMBER(wardner_fglayer_w);
- DECLARE_WRITE8_MEMBER(wardner_txscroll_w);
- DECLARE_WRITE8_MEMBER(wardner_bgscroll_w);
- DECLARE_WRITE8_MEMBER(wardner_fgscroll_w);
- DECLARE_WRITE8_MEMBER(wardner_exscroll_w);
- DECLARE_READ8_MEMBER(wardner_videoram_r);
- DECLARE_WRITE8_MEMBER(wardner_videoram_w);
- DECLARE_READ8_MEMBER(wardner_sprite_r);
- DECLARE_WRITE8_MEMBER(wardner_sprite_w);
+ u8 twincobr_sharedram_r(offs_t offset);
+ void twincobr_sharedram_w(offs_t offset, u8 data);
+ void twincobr_txoffs_w(offs_t offset, u16 data, u16 mem_mask = ~0);
+ u16 twincobr_txram_r();
+ void twincobr_txram_w(offs_t offset, u16 data, u16 mem_mask = ~0);
+ void twincobr_bgoffs_w(offs_t offset, u16 data, u16 mem_mask = ~0);
+ u16 twincobr_bgram_r();
+ void twincobr_bgram_w(offs_t offset, u16 data, u16 mem_mask = ~0);
+ void twincobr_fgoffs_w(offs_t offset, u16 data, u16 mem_mask = ~0);
+ u16 twincobr_fgram_r();
+ void twincobr_fgram_w(offs_t offset, u16 data, u16 mem_mask = ~0);
+ void twincobr_txscroll_w(offs_t offset, u16 data, u16 mem_mask = ~0);
+ void twincobr_bgscroll_w(offs_t offset, u16 data, u16 mem_mask = ~0);
+ void twincobr_fgscroll_w(offs_t offset, u16 data, u16 mem_mask = ~0);
+ void twincobr_exscroll_w(offs_t offset, u16 data);
+ void wardner_txlayer_w(offs_t offset, u8 data);
+ void wardner_bglayer_w(offs_t offset, u8 data);
+ void wardner_fglayer_w(offs_t offset, u8 data);
+ void wardner_txscroll_w(offs_t offset, u8 data);
+ void wardner_bgscroll_w(offs_t offset, u8 data);
+ void wardner_fgscroll_w(offs_t offset, u8 data);
+ void wardner_exscroll_w(offs_t offset, u8 data);
+ u8 wardner_videoram_r(offs_t offset);
+ void wardner_videoram_w(offs_t offset, u8 data);
+ u8 wardner_sprite_r(offs_t offset);
+ void wardner_sprite_w(offs_t offset, u8 data);
TILE_GET_INFO_MEMBER(get_bg_tile_info);
TILE_GET_INFO_MEMBER(get_fg_tile_info);
TILE_GET_INFO_MEMBER(get_tx_tile_info);
- DECLARE_MACHINE_RESET(twincobr);
- uint32_t screen_update_toaplan0(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
+ u32 screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
DECLARE_WRITE_LINE_MEMBER(twincobr_vblank_irq);
DECLARE_WRITE_LINE_MEMBER(wardner_vblank_irq);
- void twincobr_restore_dsp();
void twincobr_create_tilemaps();
DECLARE_WRITE_LINE_MEMBER(display_on_w);
DECLARE_WRITE_LINE_MEMBER(flipscreen_w);
DECLARE_WRITE_LINE_MEMBER(bg_ram_bank_w);
DECLARE_WRITE_LINE_MEMBER(fg_rom_bank_w);
- void twincobr_log_vram();
- void twincobr_driver_savestate();
+ void log_vram();
+ void driver_savestate();
required_device<cpu_device> m_maincpu;
required_device<tms32010_device> m_dsp;
required_device<toaplan_scu_device> m_spritegen;
diff --git a/src/mame/includes/unico.h b/src/mame/includes/unico.h
index 2fc0a5ee9f4..8cf16f5bccd 100644
--- a/src/mame/includes/unico.h
+++ b/src/mame/includes/unico.h
@@ -15,14 +15,14 @@ class unico_state : public driver_device
public:
unico_state(const machine_config &mconfig, device_type type, const char *tag) :
driver_device(mconfig, type, tag),
+ m_maincpu(*this, "maincpu"),
m_palette(*this, "palette"),
m_gfxdecode(*this, "gfxdecode"),
+ m_oki(*this, "oki"),
m_leds(*this, "led%u", 0U),
m_vram(*this, "vram", 0),
m_scroll(*this, "scroll", 0),
- m_spriteram(*this, "spriteram", 0),
- m_maincpu(*this, "maincpu"),
- m_oki(*this, "oki")
+ m_spriteram(*this, "spriteram", 0)
{ }
void burglarx(machine_config &config);
@@ -45,8 +45,10 @@ protected:
void burglarx_map(address_map &map);
+ required_device<cpu_device> m_maincpu;
required_device<palette_device> m_palette;
required_device<gfxdecode_device> m_gfxdecode;
+ optional_device<okim6295_device> m_oki;
output_finder<2> m_leds;
private:
@@ -56,9 +58,6 @@ private:
int m_sprites_scrolldx;
int m_sprites_scrolldy;
required_shared_ptr<uint16_t> m_spriteram;
-
- required_device<cpu_device> m_maincpu;
- optional_device<okim6295_device> m_oki;
};
class zeropnt_state : public unico_state
@@ -84,13 +83,14 @@ protected:
required_memory_bank m_okibank;
+ required_device<screen_device> m_screen;
+
void zeropnt_map(address_map &map);
void zeropnt_oki_map(address_map &map);
private:
enum { Y0, X0, Y1, X1 }; // gun axis indices
- required_device<screen_device> m_screen;
required_ioport_array<4> m_gun_axes;
};
diff --git a/src/mame/includes/vcs80.h b/src/mame/includes/vcs80.h
index 1e91a8c7794..51646edecb1 100644
--- a/src/mame/includes/vcs80.h
+++ b/src/mame/includes/vcs80.h
@@ -49,16 +49,16 @@ private:
DECLARE_READ8_MEMBER( pio_pa_r );
DECLARE_WRITE8_MEMBER( pio_pb_w );
- DECLARE_READ8_MEMBER( mem_r )
+ uint8_t mem_r(offs_t offset)
{
m_pio->port_b_write((!BIT(offset, 0)) << 7);
- return m_bdmem->read8(space, offset);
+ return m_bdmem->read8(offset);
}
- DECLARE_WRITE8_MEMBER( mem_w )
+ void mem_w(offs_t offset, uint8_t data)
{
m_pio->port_b_write((!BIT(offset, 0)) << 7);
- m_bdmem->write8(space, offset, data);
+ m_bdmem->write8(offset, data);
}
DECLARE_READ8_MEMBER( io_r )
diff --git a/src/mame/includes/videopin.h b/src/mame/includes/videopin.h
index 8bea498b233..17002b6f535 100644
--- a/src/mame/includes/videopin.h
+++ b/src/mame/includes/videopin.h
@@ -45,13 +45,13 @@ private:
TIMER_INTERRUPT
};
- DECLARE_READ8_MEMBER(misc_r);
- DECLARE_WRITE8_MEMBER(led_w);
- DECLARE_WRITE8_MEMBER(ball_w);
- DECLARE_WRITE8_MEMBER(video_ram_w);
- DECLARE_WRITE8_MEMBER(out1_w);
- DECLARE_WRITE8_MEMBER(out2_w);
- DECLARE_WRITE8_MEMBER(note_dvsr_w);
+ uint8_t misc_r();
+ void led_w(uint8_t data);
+ void ball_w(uint8_t data);
+ void video_ram_w(offs_t offset, uint8_t data);
+ void out1_w(uint8_t data);
+ void out2_w(uint8_t data);
+ void note_dvsr_w(uint8_t data);
TILEMAP_MAPPER_MEMBER(get_memory_offset);
TILE_GET_INFO_MEMBER(get_tile_info);
diff --git a/src/mame/includes/vsmile.h b/src/mame/includes/vsmile.h
new file mode 100644
index 00000000000..0069803295f
--- /dev/null
+++ b/src/mame/includes/vsmile.h
@@ -0,0 +1,175 @@
+// license:BSD-3-Clause
+// copyright-holders:Ryan Holtz
+/******************************************************************************
+
+ V-Tech V.Smile console emulation
+ V-Tech V.Smile Baby console emulation
+
+ Similar Systems:
+
+ V.Smile Pocket
+ V.Smile Cyber Pocket
+ V.Smile PC Pal
+ V-Motion Active Learning System
+ V.Flash
+ V.Baby
+ Leapfrog Leapster
+
+*******************************************************************************/
+
+#ifndef MAME_INCLUDES_VSMILE_H
+#define MAME_INCLUDES_VSMILE_H
+
+#include "bus/vsmile/vsmile_ctrl.h"
+#include "bus/vsmile/vsmile_slot.h"
+#include "bus/vsmile/rom.h"
+
+#include "cpu/unsp/unsp.h"
+
+#include "machine/bankdev.h"
+#include "machine/spg2xx.h"
+
+#include "screen.h"
+
+class vsmile_base_state : public driver_device
+{
+public:
+ vsmile_base_state(const machine_config &mconfig, device_type type, const char *tag)
+ : driver_device(mconfig, type, tag)
+ , m_spg(*this, "spg")
+ , m_maincpu(*this, "maincpu")
+ , m_screen(*this, "screen")
+ , m_bankdev(*this, "bank")
+ , m_cart(*this, "cartslot")
+ , m_system_region(*this, "maincpu")
+ { }
+
+ void vsmile_base(machine_config &config);
+
+protected:
+ virtual void machine_start() override;
+
+ void mem_map(address_map &map);
+
+ DECLARE_WRITE8_MEMBER(chip_sel_w);
+
+ DECLARE_READ16_MEMBER(bank3_r);
+
+ required_device<spg2xx_device> m_spg;
+ required_device<unsp_device> m_maincpu;
+ required_device<screen_device> m_screen;
+ required_device<address_map_bank_device> m_bankdev;
+ required_device<vsmile_cart_slot_device> m_cart;
+ required_memory_region m_system_region;
+};
+
+class vsmile_state : public vsmile_base_state
+{
+public:
+ vsmile_state(const machine_config &mconfig, device_type type, const char *tag)
+ : vsmile_base_state(mconfig, type, tag)
+ , m_ctrl(*this, "ctrl%u", 1U)
+ , m_dsw_region(*this, "REGION")
+ { }
+
+ void vsmile(machine_config &config);
+ void vsmilep(machine_config &config);
+
+private:
+ virtual void machine_start() override;
+ virtual void machine_reset() override;
+
+ void banked_map(address_map &map);
+
+ DECLARE_WRITE8_MEMBER(ctrl_tx_w);
+ template <int Which> DECLARE_WRITE_LINE_MEMBER(ctrl_rts_w);
+
+ DECLARE_READ16_MEMBER(portb_r);
+ DECLARE_WRITE16_MEMBER(portb_w);
+ DECLARE_READ16_MEMBER(portc_r);
+ DECLARE_WRITE16_MEMBER(portc_w);
+
+ DECLARE_WRITE8_MEMBER(uart_rx);
+
+ enum
+ {
+ VSMILE_PORTB_CS1 = 0x01,
+ VSMILE_PORTB_CS2 = 0x02,
+ VSMILE_PORTB_CART = 0x04,
+ VSMILE_PORTB_RESET = 0x08,
+ VSMILE_PORTB_FRONT24 = 0x10,
+ VSMILE_PORTB_OFF = 0x20,
+ VSMILE_PORTB_OFF_SW = 0x40,
+ VSMILE_PORTB_ON_SW = 0x80,
+
+ VSMILE_PORTC_VER = 0x0f,
+ VSMILE_PORTC_LOGO = 0x10,
+ VSMILE_PORTC_TEST = 0x20,
+ VSMILE_PORTC_AMP = 0x40,
+ VSMILE_PORTC_SYSRESET = 0x80,
+ };
+
+ required_device_array<vsmile_ctrl_port_device, 2> m_ctrl;
+ required_ioport m_dsw_region;
+
+ bool m_ctrl_rts[2];
+ bool m_ctrl_select[2];
+};
+
+class vsmilem_state : public vsmile_state
+{
+public:
+ vsmilem_state(const machine_config &mconfig, device_type type, const char *tag)
+ : vsmile_state(mconfig, type, tag)
+ { }
+
+ void vsmilem(machine_config &config);
+
+protected:
+ DECLARE_WRITE16_MEMBER(porta_w);
+ DECLARE_READ16_MEMBER(porta_r);
+};
+
+class vsmileb_state : public vsmile_base_state
+{
+public:
+ vsmileb_state(const machine_config &mconfig, device_type type, const char *tag)
+ : vsmile_base_state(mconfig, type, tag)
+ , m_io_logo(*this, "LOGO")
+ { }
+
+ void vsmileb(machine_config &config);
+ void vsmilebp(machine_config &config);
+
+ enum : uint16_t
+ {
+ BUTTON_YELLOW = 0x01fe,
+ BUTTON_BLUE = 0x03ee,
+ BUTTON_ORANGE = 0x03de,
+ BUTTON_GREEN = 0x03be,
+ BUTTON_RED = 0x02fe,
+ BUTTON_CLOUD = 0x03f6,
+ BUTTON_BALL = 0x03fa,
+ BUTTON_EXIT = 0x03fc
+ };
+
+ DECLARE_INPUT_CHANGED_MEMBER(pad_button_changed);
+
+ // make slide switches usable on a keyboard
+ template <uint16_t V> DECLARE_INPUT_CHANGED_MEMBER(sw_mode);
+
+private:
+ virtual void machine_start() override;
+ virtual void machine_reset() override;
+
+ void banked_map(address_map &map);
+
+ DECLARE_READ16_MEMBER(porta_r);
+ DECLARE_READ16_MEMBER(portb_r);
+
+ required_ioport m_io_logo;
+
+ uint16_t m_mode;
+};
+
+#endif // MAME_INCLUDES_VSMILE_H
diff --git a/src/mame/includes/witch.h b/src/mame/includes/witch.h
index 1615aa853f7..f63f953b063 100644
--- a/src/mame/includes/witch.h
+++ b/src/mame/includes/witch.h
@@ -9,6 +9,7 @@ Witch / Pinball Champ '95 / Keirin Ou
#ifndef MAME_INCLUDES_WITCH_H
#define MAME_INCLUDES_WITCH_H
+#pragma once
#include "cpu/z80/z80.h"
#include "machine/i8255.h"
@@ -72,8 +73,7 @@ public:
protected:
void common_map(address_map &map);
- tilemap_t *m_gfx0a_tilemap;
- tilemap_t *m_gfx0b_tilemap;
+ tilemap_t *m_gfx0_tilemap;
tilemap_t *m_gfx1_tilemap;
required_device<cpu_device> m_maincpu;
@@ -97,11 +97,10 @@ protected:
uint8_t m_reg_a002;
uint8_t m_motor_active;
- TILE_GET_INFO_MEMBER(get_gfx0b_tile_info);
- TILE_GET_INFO_MEMBER(get_gfx0a_tile_info);
+ TILE_GET_INFO_MEMBER(get_gfx0_tile_info);
TILE_GET_INFO_MEMBER(get_gfx1_tile_info);
virtual void video_start() override;
- uint32_t screen_update_witch(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
+ uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
void draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect);
virtual void machine_reset() override;
diff --git a/src/mame/includes/wswan.h b/src/mame/includes/wswan.h
index 5ca95fce472..2657e33e3c3 100644
--- a/src/mame/includes/wswan.h
+++ b/src/mame/includes/wswan.h
@@ -85,9 +85,9 @@ protected:
required_ioport m_cursy;
required_ioport m_buttons;
- DECLARE_READ8_MEMBER(bios_r);
- DECLARE_READ8_MEMBER(port_r);
- DECLARE_WRITE8_MEMBER(port_w);
+ uint8_t bios_r(offs_t offset);
+ uint8_t port_r(offs_t offset);
+ void port_w(offs_t offset, uint8_t data);
void set_irq_line(int irq);
void dma_sound_cb();
diff --git a/src/mame/includes/xavix.h b/src/mame/includes/xavix.h
index 11646e1c113..3f60c7ce8b7 100644
--- a/src/mame/includes/xavix.h
+++ b/src/mame/includes/xavix.h
@@ -18,7 +18,11 @@
#include "machine/xavix_mtrk_wheel.h"
#include "machine/xavix_madfb_ball.h"
-
+#include "machine/xavix2002_io.h"
+#include "machine/xavix_io.h"
+#include "machine/xavix_adc.h"
+#include "machine/xavix_anport.h"
+#include "machine/xavix_math.h"
class xavix_sound_device : public device_t, public device_sound_interface
{
@@ -71,6 +75,10 @@ public:
m_in0(*this, "IN0"),
m_in1(*this, "IN1"),
m_an_in(*this, "AN%u", 0U),
+ m_mouse0x(*this, "MOUSE0X"),
+ m_mouse0y(*this, "MOUSE0Y"),
+ m_mouse1x(*this, "MOUSE1X"),
+ m_mouse1y(*this, "MOUSE1Y"),
m_maincpu(*this, "maincpu"),
m_nvram(*this, "nvram"),
m_screen(*this, "screen"),
@@ -95,13 +103,23 @@ public:
m_palette(*this, "palette"),
m_region(*this, "REGION"),
m_gfxdecode(*this, "gfxdecode"),
- m_sound(*this, "xavix_sound")
+ m_sound(*this, "xavix_sound"),
+ m_adc(*this, "adc"),
+ m_anport(*this, "anport"),
+ m_math(*this, "math"),
+ m_xavix2002io(*this, "xavix2002io")
{ }
void xavix(machine_config &config);
+ void xavix_nv(machine_config &config);
+
void xavixp(machine_config &config);
+ void xavixp_nv(machine_config &config);
+
void xavix2000(machine_config &config);
- void xavix_nv(machine_config &config);
+ void xavix2000_nv(machine_config &config);
+
+ void xavix2002(machine_config &config);
void init_xavix();
@@ -110,7 +128,6 @@ public:
DECLARE_WRITE_LINE_MEMBER(ioevent_trg04);
DECLARE_WRITE_LINE_MEMBER(ioevent_trg08);
-
int m_rgnlen;
uint8_t* m_rgn;
@@ -169,12 +186,15 @@ protected:
required_ioport m_in0;
required_ioport m_in1;
required_ioport_array<8> m_an_in;
+ optional_ioport m_mouse0x;
+ optional_ioport m_mouse0y;
+ optional_ioport m_mouse1x;
+ optional_ioport m_mouse1y;
required_device<xavix_device> m_maincpu;
optional_device<nvram_device> m_nvram;
required_device<screen_device> m_screen;
required_device<address_map_bank_device> m_lowbus;
address_space* m_cpuspace;
- uint8_t m_extbusctrl[3];
private:
@@ -196,7 +216,12 @@ private:
virtual void video_start() override;
- virtual DECLARE_READ8_MEMBER(opcodes_000000_r)
+ DECLARE_WRITE8_MEMBER(debug_mem_w)
+ {
+ m_mainram[offset] = data;
+ };
+
+ virtual uint8_t opcodes_000000_r(offs_t offset)
{
if (offset & 0x8000)
{
@@ -204,24 +229,24 @@ private:
}
else
{
- return m_lowbus->read8(space, offset & 0x7fff);
+ return m_lowbus->read8(offset & 0x7fff);
}
}
- virtual DECLARE_READ8_MEMBER(opcodes_800000_r)
+ virtual uint8_t opcodes_800000_r(offs_t offset)
{
// rad_fb, rad_madf confirm that for >0x800000 the CPU only sees ROM when executing opcodes
return m_rgn[(offset) & (m_rgnlen - 1)];
}
- virtual DECLARE_READ8_MEMBER(extbus_r) { return m_rgn[(offset) & (m_rgnlen - 1)]; }
- virtual DECLARE_WRITE8_MEMBER(extbus_w)
+ virtual uint8_t extbus_r(offs_t offset) { return m_rgn[(offset) & (m_rgnlen - 1)]; }
+ virtual void extbus_w(offs_t offset, uint8_t data)
{
- logerror("%s: write to external bus %06x %02x\n", machine().describe_context(), offset, data);
+ logerror("%s: write to external bus %06x %02x\n", machine().describe_context(), offset, data);
}
- DECLARE_READ8_MEMBER(sample_read)
+ uint8_t sample_read(offs_t offset)
{
return read_full_data_sp_bypass(offset);
};
@@ -247,8 +272,6 @@ private:
}
}
- DECLARE_READ8_MEMBER(extintrf_790x_r);
- DECLARE_WRITE8_MEMBER(extintrf_790x_w);
DECLARE_READ8_MEMBER(ioevent_enable_r);
DECLARE_WRITE8_MEMBER(ioevent_enable_w);
@@ -258,15 +281,6 @@ private:
uint8_t m_ioevent_active;
void process_ioevent(uint8_t bits);
- DECLARE_WRITE8_MEMBER(adc_7b00_w);
- DECLARE_READ8_MEMBER(adc_7b80_r);
- DECLARE_WRITE8_MEMBER(adc_7b80_w);
- DECLARE_READ8_MEMBER(adc_7b81_r);
- DECLARE_WRITE8_MEMBER(adc_7b81_w);
- TIMER_CALLBACK_MEMBER(adc_timer_done);
- emu_timer *m_adc_timer;
- uint8_t m_adc_control;
-
DECLARE_WRITE8_MEMBER(slotreg_7810_w);
DECLARE_WRITE8_MEMBER(rom_dmatrg_w);
@@ -297,8 +311,6 @@ private:
uint8_t m_io0_direction;
uint8_t m_io1_direction;
- uint8_t m_adc_inlatch;
-
DECLARE_READ8_MEMBER(nmi_vector_lo_r);
DECLARE_READ8_MEMBER(nmi_vector_hi_r);
DECLARE_READ8_MEMBER(irq_vector_lo_r);
@@ -440,10 +452,20 @@ private:
return 0xff;
}
- DECLARE_READ8_MEMBER(mult_r);
- DECLARE_WRITE8_MEMBER(mult_w);
- DECLARE_READ8_MEMBER(mult_param_r);
- DECLARE_WRITE8_MEMBER(mult_param_w);
+
+ DECLARE_READ8_MEMBER(adc0_r) { return m_an_in[0]->read(); };
+ DECLARE_READ8_MEMBER(adc1_r) { return m_an_in[1]->read(); };
+ DECLARE_READ8_MEMBER(adc2_r) { return m_an_in[2]->read(); };
+ DECLARE_READ8_MEMBER(adc3_r) { return m_an_in[3]->read(); };
+ DECLARE_READ8_MEMBER(adc4_r) { return m_an_in[4]->read(); };
+ DECLARE_READ8_MEMBER(adc5_r) { return m_an_in[5]->read(); };
+ DECLARE_READ8_MEMBER(adc6_r) { return m_an_in[6]->read(); };
+ DECLARE_READ8_MEMBER(adc7_r) { return m_an_in[7]->read(); };
+
+ DECLARE_READ8_MEMBER(anport0_r) { logerror("%s: unhandled anport0_r\n", machine().describe_context()); return 0xff; };
+ DECLARE_READ8_MEMBER(anport1_r) { logerror("%s: unhandled anport1_r\n", machine().describe_context()); return 0xff; };
+ DECLARE_READ8_MEMBER(anport2_r) { logerror("%s: unhandled anport2_r\n", machine().describe_context()); return 0xff; };
+ DECLARE_READ8_MEMBER(anport3_r) { logerror("%s: unhandled anport3_r\n", machine().describe_context()); return 0xff; };
void update_irqs();
uint8_t m_irqsource;
@@ -454,9 +476,6 @@ private:
uint8_t m_irq_vector_lo_data;
uint8_t m_irq_vector_hi_data;
- uint8_t m_multparams[3];
- uint8_t m_multresults[2];
-
uint8_t m_spritefragment_dmaparam1[2];
uint8_t m_spritefragment_dmaparam2[2];
@@ -515,7 +534,6 @@ private:
required_device<gfxdecode_device> m_gfxdecode;
void update_pen(int pen, uint8_t shval, uint8_t lval);
- double hue2rgb(double p, double q, double t);
void draw_tile_line(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, int tile, int bpp, int xpos, int ypos, int drawheight, int drawwidth, int flipx, int flipy, int pal, int zval, int line);
void draw_tilemap(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, int which);
void draw_tilemap_line(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, int which, int line);
@@ -539,9 +557,65 @@ private:
int get_current_address_byte();
required_device<xavix_sound_device> m_sound;
+
+
DECLARE_READ8_MEMBER(sound_regram_read_cb);
+
+protected:
+ required_device<xavix_adc_device> m_adc;
+ required_device<xavix_anport_device> m_anport;
+ required_device<xavix_math_device> m_math;
+ optional_device<xavix2002_io_device> m_xavix2002io;
+
+ uint8_t m_extbusctrl[3];
+
+ virtual DECLARE_READ8_MEMBER(extintrf_790x_r);
+ virtual DECLARE_WRITE8_MEMBER(extintrf_790x_w);
+
+ // additional SuperXaviX / XaviX2002 stuff
+ uint8_t m_sx_extended_extbus[3];
+
+ DECLARE_WRITE8_MEMBER(extended_extbus_reg0_w);
+ DECLARE_WRITE8_MEMBER(extended_extbus_reg1_w);
+ DECLARE_WRITE8_MEMBER(extended_extbus_reg2_w);
+};
+
+class xavix_guru_state : public xavix_state
+{
+public:
+ xavix_guru_state(const machine_config &mconfig, device_type type, const char *tag)
+ : xavix_state(mconfig, type, tag)
+ { }
+
+ void xavix_guru(machine_config &config);
+
+protected:
+
+private:
+ DECLARE_READ8_MEMBER(guru_anport2_r) { uint8_t ret = m_mouse1x->read()-0x10; return ret; }
};
+
+class xavix_2000_nv_sdb_state : public xavix_state
+{
+public:
+ xavix_2000_nv_sdb_state(const machine_config &mconfig, device_type type, const char *tag)
+ : xavix_state(mconfig, type, tag)
+ { }
+
+ void xavix2000_nv_sdb(machine_config &config);
+
+protected:
+
+private:
+ DECLARE_READ8_MEMBER(sdb_anport0_r) { return m_mouse0x->read()^0x7f; }
+ DECLARE_READ8_MEMBER(sdb_anport1_r) { return m_mouse0y->read()^0x7f; }
+ DECLARE_READ8_MEMBER(sdb_anport2_r) { return m_mouse1x->read()^0x7f; }
+ DECLARE_READ8_MEMBER(sdb_anport3_r) { return m_mouse1y->read()^0x7f; }
+
+};
+
+
class xavix_i2c_state : public xavix_state
{
public:
@@ -554,19 +628,24 @@ public:
void xavix_i2c_24lc02(machine_config &config);
void xavix_i2c_24lc04(machine_config &config);
+ void xavix_i2c_24c02(machine_config &config);
void xavix_i2c_24c08(machine_config &config);
void xavix2000_i2c_24c04(machine_config &config);
void xavix2000_i2c_24c02(machine_config &config);
+ void xavix2002_i2c_24c04(machine_config &config);
+
void init_epo_efdx()
{
init_xavix();
hackaddress1 = 0x958a;
hackaddress2 = 0x8524;
}
+
+ DECLARE_CUSTOM_INPUT_MEMBER(i2c_r);
+
protected:
- virtual uint8_t read_io1(uint8_t direction) override;
virtual void write_io1(uint8_t data, uint8_t direction) override;
required_device<i2cmem_device> m_i2cmem;
@@ -576,6 +655,45 @@ private:
int hackaddress2;
};
+class xavix_i2c_ltv_tam_state : public xavix_i2c_state
+{
+public:
+ xavix_i2c_ltv_tam_state(const machine_config &mconfig, device_type type, const char *tag)
+ : xavix_i2c_state(mconfig, type, tag)
+ { }
+
+ void xavix_i2c_24lc04_tam(machine_config &config);
+
+private:
+ virtual void write_io1(uint8_t data, uint8_t direction) override;
+
+private:
+ DECLARE_READ8_MEMBER(tam_anport0_r) { return m_mouse0x->read()^0x7f; }
+ DECLARE_READ8_MEMBER(tam_anport1_r) { return m_mouse0y->read()^0x7f; }
+ DECLARE_READ8_MEMBER(tam_anport2_r) { return m_mouse1x->read()^0x7f; }
+ DECLARE_READ8_MEMBER(tam_anport3_r) { return m_mouse1y->read()^0x7f; }
+};
+
+
+class xavix_i2c_jmat_state : public xavix_i2c_state
+{
+public:
+ xavix_i2c_jmat_state(const machine_config &mconfig, device_type type, const char *tag)
+ : xavix_i2c_state(mconfig, type, tag)
+ { }
+
+ void xavix2002_i2c_jmat(machine_config &config);
+
+private:
+ READ8_MEMBER(read_extended_io0);
+ READ8_MEMBER(read_extended_io1);
+ READ8_MEMBER(read_extended_io2);
+ WRITE8_MEMBER(write_extended_io0);
+ WRITE8_MEMBER(write_extended_io1);
+ WRITE8_MEMBER(write_extended_io2);
+};
+
+
class xavix_i2c_lotr_state : public xavix_i2c_state
{
public:
@@ -583,11 +701,22 @@ public:
: xavix_i2c_state(mconfig, type, tag)
{ }
+ DECLARE_CUSTOM_INPUT_MEMBER(camera_r);
+
protected:
- virtual uint8_t read_io1(uint8_t direction) override;
//virtual void write_io1(uint8_t data, uint8_t direction) override;
};
+class xavix_i2c_bowl_state : public xavix_i2c_state
+{
+public:
+ xavix_i2c_bowl_state(const machine_config &mconfig, device_type type, const char *tag)
+ : xavix_i2c_state(mconfig, type, tag)
+ { }
+
+ DECLARE_CUSTOM_INPUT_MEMBER(camera_r);
+};
+
class xavix_mtrk_state : public xavix_state
@@ -639,7 +768,7 @@ protected:
// for Cart cases this memory bypass becomes more complex
- virtual DECLARE_READ8_MEMBER(opcodes_000000_r) override
+ virtual uint8_t opcodes_000000_r(offs_t offset) override
{
if (offset & 0x8000)
{
@@ -661,11 +790,11 @@ protected:
}
else
{
- return m_lowbus->read8(space, offset & 0x7fff);
+ return m_lowbus->read8(offset & 0x7fff);
}
}
- virtual DECLARE_READ8_MEMBER(opcodes_800000_r) override
+ virtual uint8_t opcodes_800000_r(offs_t offset) override
{
if (offset & 0x400000)
{
@@ -684,9 +813,26 @@ protected:
}
}
- virtual DECLARE_READ8_MEMBER(extbus_r) override
+ // TODO, use callbacks?
+ virtual DECLARE_READ8_MEMBER(extintrf_790x_r) override
+ {
+ return xavix_state::extintrf_790x_r(space,offset,mem_mask);
+ }
+
+ virtual DECLARE_WRITE8_MEMBER(extintrf_790x_w) override
+ {
+ xavix_state::extintrf_790x_w(space,offset,data, mem_mask);
+
+ if (offset < 3)
+ {
+ if (m_cartslot->has_cart())
+ m_cartslot->write_bus_control(space,offset,data,mem_mask);
+ }
+ };
+
+ virtual uint8_t extbus_r(offs_t offset) override
{
- if (m_extbusctrl[1] & 0x08)
+ if (m_cartslot->has_cart() && m_cartslot->is_read_access_not_rom())
{
logerror("%s: read from external bus %06x (SEEPROM READ?)\n", machine().describe_context(), offset);
return m_cartslot->read_extra(*m_cpuspace, offset);
@@ -710,9 +856,9 @@ protected:
}
}
}
- virtual DECLARE_WRITE8_MEMBER(extbus_w) override
+ virtual void extbus_w(offs_t offset, uint8_t data) override
{
- if (m_extbusctrl[0] & 0x08)
+ if (m_cartslot->has_cart() && m_cartslot->is_write_access_not_rom())
{
logerror("%s: write to external bus %06x %02x (SEEPROM WRITE?)\n", machine().describe_context(), offset, data);
return m_cartslot->write_extra(*m_cpuspace, offset, data);
@@ -791,14 +937,38 @@ public:
{ }
void xavix_i2c_taiko(machine_config &config);
+ void xavix_i2c_jpopira(machine_config &config);
+
+ DECLARE_CUSTOM_INPUT_MEMBER(i2c_r);
protected:
- virtual uint8_t read_io1(uint8_t direction) override;
virtual void write_io1(uint8_t data, uint8_t direction) override;
required_device<i2cmem_device> m_i2cmem;
};
+class xavix_popira2_cart_state : public xavix_cart_state
+{
+public:
+ xavix_popira2_cart_state(const machine_config &mconfig, device_type type, const char *tag)
+ : xavix_cart_state(mconfig,type,tag),
+ m_p2(*this, "P2")
+ { }
+
+ void xavix_cart_popira2(machine_config &config);
+
+ DECLARE_CUSTOM_INPUT_MEMBER(i2c_r);
+
+protected:
+ virtual void write_io1(uint8_t data, uint8_t direction) override;
+
+private:
+ DECLARE_READ8_MEMBER(popira2_adc0_r);
+ DECLARE_READ8_MEMBER(popira2_adc1_r);
+
+ required_ioport m_p2;
+};
+
class xavix_ekara_state : public xavix_cart_state
{
@@ -811,14 +981,16 @@ public:
m_extraiowrite(0)
{ }
-// void xavix_ekara(machine_config &config);
+ DECLARE_CUSTOM_INPUT_MEMBER(ekara_multi0_r);
+ DECLARE_CUSTOM_INPUT_MEMBER(ekara_multi1_r);
+
+// void xavix_ekara(machine_config &config);
protected:
required_ioport m_extra0;
required_ioport m_extra1;
- virtual uint8_t read_io1(uint8_t direction) override;
virtual void write_io0(uint8_t data, uint8_t direction) override;
virtual void write_io1(uint8_t data, uint8_t direction) override;
diff --git a/src/mame/includes/xbox.h b/src/mame/includes/xbox.h
index 47910468c2e..9b48eb72455 100644
--- a/src/mame/includes/xbox.h
+++ b/src/mame/includes/xbox.h
@@ -84,6 +84,8 @@ public:
debug_irq_active(false),
debug_irq_number(0),
m_maincpu(*this, "maincpu"),
+ mcpxlpc(*this, ":pci:01.0"),
+ ide(*this, ":pci:09.0:ide"),
debugc_bios(nullptr) { }
void xbox_base(machine_config &config);
@@ -105,20 +107,13 @@ protected:
uint32_t screen_update_callback(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
virtual void machine_start() override;
- DECLARE_WRITE_LINE_MEMBER(xbox_pic8259_1_set_int_line);
- DECLARE_READ8_MEMBER(get_slave_ack);
- DECLARE_WRITE_LINE_MEMBER(xbox_pit8254_out0_changed);
- DECLARE_WRITE_LINE_MEMBER(xbox_pit8254_out2_changed);
- DECLARE_WRITE_LINE_MEMBER(xbox_ohci_usb_interrupt_changed);
- DECLARE_WRITE_LINE_MEMBER(xbox_smbus_interrupt_changed);
- DECLARE_WRITE_LINE_MEMBER(xbox_nv2a_interrupt_changed);
+ DECLARE_WRITE_LINE_MEMBER(maincpu_interrupt);
+ DECLARE_WRITE_LINE_MEMBER(ohci_usb_interrupt_changed);
+ DECLARE_WRITE_LINE_MEMBER(smbus_interrupt_changed);
+ DECLARE_WRITE_LINE_MEMBER(ide_interrupt_changed);
+ DECLARE_WRITE_LINE_MEMBER(nv2a_interrupt_changed);
IRQ_CALLBACK_MEMBER(irq_callback);
- struct xbox_devices {
- pic8259_device *pic8259_1;
- pic8259_device *pic8259_2;
- bus_master_ide_controller_device *ide;
- } xbox_base_devs;
struct superio_state
{
bool configuration_mode;
@@ -130,6 +125,8 @@ protected:
bool debug_irq_active;
int debug_irq_number;
required_device<cpu_device> m_maincpu;
+ required_device<mcpx_isalpc_device> mcpxlpc;
+ required_device<bus_master_ide_controller_device> ide;
static const struct debugger_constants
{
uint32_t id;
diff --git a/src/mame/includes/xbox_pci.h b/src/mame/includes/xbox_pci.h
index 3d4e455e0ed..c098d9148fb 100644
--- a/src/mame/includes/xbox_pci.h
+++ b/src/mame/includes/xbox_pci.h
@@ -5,6 +5,7 @@
#pragma once
+#include "machine/pit8253.h"
#include "xbox_nv2a.h"
#include "xbox_usb.h"
@@ -57,22 +58,51 @@ DECLARE_DEVICE_TYPE(NV2A_RAM, nv2a_ram_device)
* LPC Bus
*/
-class mcpx_lpc_device : public pci_device {
+class mcpx_isalpc_device : public pci_device {
public:
- mcpx_lpc_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+ mcpx_isalpc_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock, uint32_t subsystem_id);
+ mcpx_isalpc_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- DECLARE_READ32_MEMBER(lpc_r);
- DECLARE_WRITE32_MEMBER(lpc_w);
+ auto interrupt_output() { return m_interrupt_output.bind(); }
+ auto boot_state_hook() { return m_boot_state_hook.bind(); }
+
+ uint32_t acknowledge();
+ void debug_generate_irq(int irq, int state);
+
+ DECLARE_READ32_MEMBER(acpi_r);
+ DECLARE_WRITE32_MEMBER(acpi_w);
+ DECLARE_WRITE8_MEMBER(boot_state_w);
+
+ DECLARE_WRITE_LINE_MEMBER(irq1);
+ DECLARE_WRITE_LINE_MEMBER(irq3);
+ DECLARE_WRITE_LINE_MEMBER(irq11);
+ DECLARE_WRITE_LINE_MEMBER(irq10);
+ DECLARE_WRITE_LINE_MEMBER(irq14);
protected:
virtual void device_start() override;
virtual void device_reset() override;
+ virtual void device_add_mconfig(machine_config &config) override;
+ virtual void map_extra(uint64_t memory_window_start, uint64_t memory_window_end, uint64_t memory_offset, address_space *memory_space,
+ uint64_t io_window_start, uint64_t io_window_end, uint64_t io_offset, address_space *io_space) override;
+
+ DECLARE_WRITE_LINE_MEMBER(interrupt_ouptut_changed);
+ DECLARE_READ8_MEMBER(get_slave_ack);
+ DECLARE_WRITE_LINE_MEMBER(pit8254_out0_changed);
+ DECLARE_WRITE_LINE_MEMBER(pit8254_out2_changed);
private:
+ void internal_io_map(address_map &map);
void lpc_io(address_map &map);
+
+ devcb_write_line m_interrupt_output;
+ devcb_write8 m_boot_state_hook;
+ required_device<pic8259_device> pic8259_1;
+ required_device<pic8259_device> pic8259_2;
+ required_device<pit8254_device> pit8254;
};
-DECLARE_DEVICE_TYPE(MCPX_LPC, mcpx_lpc_device)
+DECLARE_DEVICE_TYPE(MCPX_ISALPC, mcpx_isalpc_device)
/*
* SMBus
@@ -89,8 +119,10 @@ public:
auto interrupt_handler() { return m_interrupt_handler.bind(); }
- DECLARE_READ32_MEMBER(smbus_r);
- DECLARE_WRITE32_MEMBER(smbus_w);
+ DECLARE_READ32_MEMBER(smbus0_r);
+ DECLARE_WRITE32_MEMBER(smbus0_w);
+ DECLARE_READ32_MEMBER(smbus1_r);
+ DECLARE_WRITE32_MEMBER(smbus1_w);
protected:
virtual void device_start() override;
@@ -107,10 +139,12 @@ private:
int rw;
smbus_interface *devices[128];
uint32_t words[256 / 4];
- } smbusst;
+ } smbusst[2];
void smbus_io0(address_map &map);
void smbus_io1(address_map &map);
void smbus_io2(address_map &map);
+ uint32_t smbus_read(int bus, offs_t offset, uint32_t mem_mask);
+ void smbus_write(int bus, offs_t offset, uint32_t data, uint32_t mem_mask);
};
DECLARE_DEVICE_TYPE(MCPX_SMBUS, mcpx_smbus_device)
diff --git a/src/mame/includes/z80ne.h b/src/mame/includes/z80ne.h
index 5e77718158a..418fda1b6c5 100644
--- a/src/mame/includes/z80ne.h
+++ b/src/mame/includes/z80ne.h
@@ -19,6 +19,7 @@
#include "imagedev/cassette.h"
#include "imagedev/floppy.h"
#include "machine/ay31015.h"
+#include "machine/clock.h"
#include "machine/kr2376.h"
#include "machine/ram.h"
#include "machine/wd_fdc.h"
@@ -69,6 +70,7 @@ public:
m_vdg(*this, "mc6847"),
m_videoram(*this, "videoram"),
m_uart(*this, "uart"),
+ m_uart_clock(*this, "uart_clock"),
m_lx387_kr2376(*this, "lx387_kr2376"),
m_maincpu(*this, "z80ne"),
m_cassette1(*this, "cassette"),
@@ -109,6 +111,7 @@ protected:
optional_device<mc6847_base_device> m_vdg;
optional_shared_ptr<uint8_t> m_videoram;
required_device<ay31015_device> m_uart;
+ required_device<clock_device> m_uart_clock;
optional_device<kr2376_device> m_lx387_kr2376;
uint8_t m_lx383_scan_counter;
uint8_t m_lx383_key[LX383_KEYS];
@@ -121,6 +124,7 @@ protected:
DECLARE_WRITE8_MEMBER(lx383_w);
DECLARE_READ8_MEMBER(lx385_ctrl_r);
DECLARE_WRITE8_MEMBER(lx385_ctrl_w);
+ DECLARE_WRITE_LINE_MEMBER(lx385_uart_tx_clock_w);
DECLARE_READ_LINE_MEMBER(lx387_shift_r);
DECLARE_READ_LINE_MEMBER(lx387_control_r);
DECLARE_READ8_MEMBER(lx387_data_r);
diff --git a/src/mame/layout/aci_boris.lay b/src/mame/layout/aci_boris.lay
new file mode 100644
index 00000000000..d96e325c0b9
--- /dev/null
+++ b/src/mame/layout/aci_boris.lay
@@ -0,0 +1,172 @@
+<?xml version="1.0"?>
+<mamelayout version="2">
+
+<!-- define elements -->
+
+ <element name="black"><rect><color red="0.16" green="0.16" blue="0.16" /></rect></element>
+ <element name="disk_white"><disk><color red="0.8" green="0.8" blue="0.8" /></disk></element>
+ <element name="disk_white2"><disk><color red="0.73" green="0.73" blue="0.73" /></disk></element>
+
+ <element name="button" defstate="0">
+ <rect state="0"><color red="0.55" green="0.55" blue="0.55" /></rect>
+ <rect state="1"><color red="0.4" green="0.4" blue="0.4" /></rect>
+ </element>
+
+ <element name="reset" defstate="0">
+ <text string=" ">
+ <bounds x="0.0" y="0.0" width="1.8" height="3.7" />
+ <color red="0.0" green="0.0" blue="0.0" />
+ </text>
+ <disk state="0">
+ <bounds x="0.0" y="1.9" width="1.8" height="1.8" />
+ <color red="0.55" green="0.55" blue="0.55" />
+ </disk>
+ <disk state="1">
+ <bounds x="0.0" y="0.0" width="1.8" height="1.8" />
+ <color red="0.55" green="0.55" blue="0.55" />
+ </disk>
+ </element>
+
+ <element name="digit" defstate="0"><led16seg><color red="1.0" green="0.1" blue="0.15" /></led16seg></element>
+
+ <element name="digitp" defstate="36912"><led16seg><color red="0.8" green="0.35" blue="0.05" /></led16seg></element>
+ <element name="digitn" defstate="12984"><led16seg><color red="0.8" green="0.35" blue="0.05" /></led16seg></element>
+ <element name="digitb" defstate="57596"><led16seg><color red="0.8" green="0.35" blue="0.05" /></led16seg></element>
+ <element name="digitr" defstate="2044"> <led16seg><color red="0.8" green="0.35" blue="0.05" /></led16seg></element>
+ <element name="digitq" defstate="28536"><led16seg><color red="0.8" green="0.35" blue="0.05" /></led16seg></element>
+ <element name="digitk" defstate="28668"><led16seg><color red="0.8" green="0.35" blue="0.05" /></led16seg></element>
+
+ <element name="text_u1"><text string="from" align="1"><color red="0.72" green="0.72" blue="0.72" /></text></element>
+ <element name="text_u2"><text string="to" align="1"><color red="0.72" green="0.72" blue="0.72" /></text></element>
+ <element name="text_u3"><text string="hrs" align="1"><color red="0.72" green="0.72" blue="0.72" /></text></element>
+ <element name="text_u4"><text string="min" align="1"><color red="0.72" green="0.72" blue="0.72" /></text></element>
+ <element name="text_u5"><text string="sec" align="1"><color red="0.72" green="0.72" blue="0.72" /></text></element>
+
+ <element name="text_l01a"><text string="G" align="1"><color red="0.8" green="0.8" blue="0.8" /></text></element>
+ <element name="text_l01b"><text string="7" align="2"><color red="0.8" green="0.8" blue="0.8" /></text></element>
+ <element name="text_l02a"><text string="H" align="1"><color red="0.8" green="0.8" blue="0.8" /></text></element>
+ <element name="text_l02b"><text string="8" align="2"><color red="0.8" green="0.8" blue="0.8" /></text></element>
+ <element name="text_l05a"><text string="D" align="1"><color red="0.8" green="0.8" blue="0.8" /></text></element>
+ <element name="text_l05b"><text string="4" align="2"><color red="0.8" green="0.8" blue="0.8" /></text></element>
+ <element name="text_l06a"><text string="E" align="1"><color red="0.8" green="0.8" blue="0.8" /></text></element>
+ <element name="text_l06b"><text string="5" align="2"><color red="0.8" green="0.8" blue="0.8" /></text></element>
+ <element name="text_l07a"><text string="F" align="1"><color red="0.8" green="0.8" blue="0.8" /></text></element>
+ <element name="text_l07b"><text string="6" align="2"><color red="0.8" green="0.8" blue="0.8" /></text></element>
+ <element name="text_l09a"><text string="A" align="1"><color red="0.8" green="0.8" blue="0.8" /></text></element>
+ <element name="text_l09b"><text string="1" align="2"><color red="0.8" green="0.8" blue="0.8" /></text></element>
+ <element name="text_l10a"><text string="B" align="1"><color red="0.8" green="0.8" blue="0.8" /></text></element>
+ <element name="text_l10b"><text string="2" align="2"><color red="0.8" green="0.8" blue="0.8" /></text></element>
+ <element name="text_l11a"><text string="C" align="1"><color red="0.8" green="0.8" blue="0.8" /></text></element>
+ <element name="text_l11b"><text string="3" align="2"><color red="0.8" green="0.8" blue="0.8" /></text></element>
+
+ <element name="text_l03"><text string="SET / 9"><color red="0.8" green="0.8" blue="0.8" /></text></element>
+ <element name="text_l04"><text string="CE"><color red="0.8" green="0.8" blue="0.8" /></text></element>
+ <element name="text_l08"><text string="TIME"><color red="0.8" green="0.8" blue="0.8" /></text></element>
+ <element name="text_l12"><text string="RANK"><color red="0.8" green="0.8" blue="0.8" /></text></element>
+ <element name="text_l13"><text string="0"><color red="0.8" green="0.8" blue="0.8" /></text></element>
+ <element name="text_l14"><text string="-"><color red="0.8" green="0.8" blue="0.8" /></text></element>
+ <element name="text_l15"><text string="B/W"><color red="0.8" green="0.8" blue="0.8" /></text></element>
+ <element name="text_l16"><text string="ENTER"><color red="0.8" green="0.8" blue="0.8" /></text></element>
+ <element name="text_r1"><text string="RESET"><color red="0.8" green="0.8" blue="0.8" /></text></element>
+ <element name="text_r2"><text string="ON"><color red="0.8" green="0.8" blue="0.8" /></text></element>
+
+
+<!-- build screen -->
+
+ <view name="Internal Layout">
+ <bounds left="-1.5" right="29" top="15.4" bottom="53.5" />
+
+ <!-- display -->
+
+ <bezel element="black"><bounds x="-1.5" y="27" width="30.5" height="0.6" /></bezel>
+
+ <bezel name="digit7" element="digit"><bounds x="0.00" y="18.3" width="2.75" height="4.125" /></bezel>
+ <bezel name="digit6" element="digit"><bounds x="2.75" y="18.3" width="2.75" height="4.125" /></bezel>
+ <bezel name="digit5" element="digit"><bounds x="5.50" y="18.3" width="2.75" height="4.125" /></bezel>
+ <bezel name="digit4" element="digit"><bounds x="8.25" y="18.3" width="2.75" height="4.125" /></bezel>
+ <bezel name="digit3" element="digit"><bounds x="11.00" y="18.3" width="2.75" height="4.125" /></bezel>
+ <bezel name="digit2" element="digit"><bounds x="13.75" y="18.3" width="2.75" height="4.125" /></bezel>
+ <bezel name="digit1" element="digit"><bounds x="16.50" y="18.3" width="2.75" height="4.125" /></bezel>
+ <bezel name="digit0" element="digit"><bounds x="19.25" y="18.3" width="2.75" height="4.125" /></bezel>
+
+ <bezel element="disk_white2"><bounds x="1.125" y="23" width="0.5" height="0.5" /></bezel>
+ <bezel element="disk_white2"><bounds x="3.875" y="23" width="0.5" height="0.5" /></bezel>
+ <bezel element="disk_white2"><bounds x="6.625" y="23" width="0.5" height="0.5" /></bezel>
+ <bezel element="disk_white2"><bounds x="9.375" y="23" width="0.5" height="0.5" /></bezel>
+ <bezel element="disk_white2"><bounds x="12.125" y="23" width="0.5" height="0.5" /></bezel>
+ <bezel element="disk_white2"><bounds x="14.875" y="23" width="0.5" height="0.5" /></bezel>
+ <bezel element="disk_white2"><bounds x="17.625" y="23" width="0.5" height="0.5" /></bezel>
+ <bezel element="disk_white2"><bounds x="20.375" y="23" width="0.5" height="0.5" /></bezel>
+
+ <bezel element="text_u1"><bounds x="1.125" y="15.8" width="6" height="1.8" /></bezel>
+ <bezel element="text_u2"><bounds x="9.375" y="15.8" width="6" height="1.8" /></bezel>
+ <bezel element="text_u3"><bounds x="1.125" y="23.8" width="6" height="1.8" /></bezel>
+ <bezel element="text_u4"><bounds x="9.375" y="23.8" width="6" height="1.8" /></bezel>
+ <bezel element="text_u5"><bounds x="17.625" y="23.8" width="6" height="1.8" /></bezel>
+
+ <!-- buttons -->
+
+ <bezel element="black"><bounds x="25.5" y="30" width="1" height="2.5" /></bezel>
+ <bezel element="text_r1"><bounds x="23" y="28" width="6" height="1.8" /></bezel>
+ <bezel element="text_r2"><bounds x="23" y="32.6" width="6" height="1.8" /></bezel>
+ <bezel element="reset" inputtag="RESET" inputmask="0x01"><bounds x="25.345" y="29.9" width="1.31" height="2.7" /></bezel>
+
+ <bezel element="disk_white"><bounds x="1.75" y="33.3" width="0.5" height="0.5" /></bezel>
+ <bezel element="disk_white"><bounds x="7.75" y="33.3" width="0.5" height="0.5" /></bezel>
+ <bezel name="digitr" element="digitr"><bounds x="1.25" y="38.6" width="1.5" height="1.8" /></bezel>
+ <bezel name="digitq" element="digitq"><bounds x="7.25" y="38.6" width="1.5" height="1.8" /></bezel>
+ <bezel name="digitk" element="digitk"><bounds x="13.25" y="38.6" width="1.5" height="1.8" /></bezel>
+ <bezel name="digitp" element="digitp"><bounds x="1.25" y="43.5" width="1.5" height="2.6" /></bezel>
+ <bezel name="digitn" element="digitn"><bounds x="7.25" y="44.6" width="1.5" height="1.8" /></bezel>
+ <bezel name="digitb" element="digitb"><bounds x="13.25" y="44.6" width="1.5" height="1.8" /></bezel>
+
+ <bezel element="button" inputtag="IN.0" inputmask="0x01"><bounds x="0" y="30" width="4" height="2.5" /></bezel>
+ <bezel element="button" inputtag="IN.0" inputmask="0x02"><bounds x="6" y="30" width="4" height="2.5" /></bezel>
+ <bezel element="button" inputtag="IN.0" inputmask="0x04"><bounds x="12" y="30" width="4" height="2.5" /></bezel>
+ <bezel element="button" inputtag="IN.0" inputmask="0x08"><bounds x="18" y="30" width="4" height="2.5" /></bezel>
+
+ <bezel element="button" inputtag="IN.1" inputmask="0x01"><bounds x="0" y="36" width="4" height="2.5" /></bezel>
+ <bezel element="button" inputtag="IN.1" inputmask="0x02"><bounds x="6" y="36" width="4" height="2.5" /></bezel>
+ <bezel element="button" inputtag="IN.1" inputmask="0x04"><bounds x="12" y="36" width="4" height="2.5" /></bezel>
+ <bezel element="button" inputtag="IN.1" inputmask="0x08"><bounds x="18" y="36" width="4" height="2.5" /></bezel>
+
+ <bezel element="button" inputtag="IN.2" inputmask="0x01"><bounds x="0" y="42" width="4" height="2.5" /></bezel>
+ <bezel element="button" inputtag="IN.2" inputmask="0x02"><bounds x="6" y="42" width="4" height="2.5" /></bezel>
+ <bezel element="button" inputtag="IN.2" inputmask="0x04"><bounds x="12" y="42" width="4" height="2.5" /></bezel>
+ <bezel element="button" inputtag="IN.2" inputmask="0x08"><bounds x="18" y="42" width="4" height="2.5" /></bezel>
+
+ <bezel element="button" inputtag="IN.3" inputmask="0x01"><bounds x="0" y="48" width="4" height="2.5" /></bezel>
+ <bezel element="button" inputtag="IN.3" inputmask="0x02"><bounds x="6" y="48" width="4" height="2.5" /></bezel>
+ <bezel element="button" inputtag="IN.3" inputmask="0x04"><bounds x="12" y="48" width="4" height="2.5" /></bezel>
+ <bezel element="button" inputtag="IN.3" inputmask="0x08"><bounds x="18" y="48" width="4" height="2.5" /></bezel>
+
+ <bezel element="text_l01a"><bounds x="0" y="32.6" width="4" height="1.8" /></bezel>
+ <bezel element="text_l01b"><bounds x="0" y="32.6" width="4" height="1.8" /></bezel>
+ <bezel element="text_l02a"><bounds x="6" y="32.6" width="4" height="1.8" /></bezel>
+ <bezel element="text_l02b"><bounds x="6" y="32.6" width="4" height="1.8" /></bezel>
+ <bezel element="text_l03"><bounds x="11.3" y="32.6" width="6" height="1.8" /></bezel>
+ <bezel element="text_l04"><bounds x="17" y="32.6" width="6" height="1.8" /></bezel>
+
+ <bezel element="text_l05a"><bounds x="0" y="38.6" width="4" height="1.8" /></bezel>
+ <bezel element="text_l05b"><bounds x="0" y="38.6" width="4" height="1.8" /></bezel>
+ <bezel element="text_l06a"><bounds x="6" y="38.6" width="4" height="1.8" /></bezel>
+ <bezel element="text_l06b"><bounds x="6" y="38.6" width="4" height="1.8" /></bezel>
+ <bezel element="text_l07a"><bounds x="12" y="38.6" width="4" height="1.8" /></bezel>
+ <bezel element="text_l07b"><bounds x="12" y="38.6" width="4" height="1.8" /></bezel>
+ <bezel element="text_l08"><bounds x="17" y="38.6" width="6" height="1.8" /></bezel>
+
+ <bezel element="text_l09a"><bounds x="0" y="44.6" width="4" height="1.8" /></bezel>
+ <bezel element="text_l09b"><bounds x="0" y="44.6" width="4" height="1.8" /></bezel>
+ <bezel element="text_l10a"><bounds x="6" y="44.6" width="4" height="1.8" /></bezel>
+ <bezel element="text_l10b"><bounds x="6" y="44.6" width="4" height="1.8" /></bezel>
+ <bezel element="text_l11a"><bounds x="12" y="44.6" width="4" height="1.8" /></bezel>
+ <bezel element="text_l11b"><bounds x="12" y="44.6" width="4" height="1.8" /></bezel>
+ <bezel element="text_l12"><bounds x="17" y="44.6" width="6" height="1.8" /></bezel>
+
+ <bezel element="text_l13"><bounds x="-1" y="50.6" width="6" height="1.8" /></bezel>
+ <bezel element="text_l14"><bounds x="5" y="50.3" width="6" height="2.2" /></bezel>
+ <bezel element="text_l15"><bounds x="11" y="50.6" width="6" height="1.8" /></bezel>
+ <bezel element="text_l16"><bounds x="17.1" y="50.6" width="6" height="1.8" /></bezel>
+
+ </view>
+</mamelayout>
diff --git a/src/mame/layout/aci_borisdpl.lay b/src/mame/layout/aci_borisdpl.lay
new file mode 100644
index 00000000000..afe0bbd64c0
--- /dev/null
+++ b/src/mame/layout/aci_borisdpl.lay
@@ -0,0 +1,318 @@
+<?xml version="1.0"?>
+<mamelayout version="2">
+
+<!-- define elements -->
+
+ <element name="black"><rect><color red="0.17" green="0.15" blue="0.15" /></rect></element>
+ <element name="white"><rect><color red="0.81" green="0.8" blue="0.79" /></rect></element>
+ <element name="disk_black"><disk><color red="0.17" green="0.15" blue="0.15" /></disk></element>
+ <element name="disk_white"><disk><color red="0.81" green="0.8" blue="0.79" /></disk></element>
+
+ <element name="digit" defstate="0">
+ <led7seg><color red="1.0" green="0.1" blue="0.15" /></led7seg>
+ </element>
+
+ <element name="hl" defstate="0">
+ <text string=" ">
+ <bounds x="0.0" y="0.0" width="1.0" height="1.0" />
+ <color red="0.0" green="0.0" blue="0.0" />
+ </text>
+ <disk state="1">
+ <bounds x="0.12" y="0.12" width="0.76" height="0.76" />
+ <color red="1.0" green="1.0" blue="1.0" />
+ </disk>
+ </element>
+
+ <!-- chess symbols are in 7seg style -->
+ <element name="piece_1">
+ <text string=" ">
+ <bounds x="0" y="0" width="5" height="6" />
+ <color red="0" green="0" blue="0" />
+ </text>
+ <rect>
+ <bounds x="0" y="2.5" width="1" height="2.5" />
+ <color red="0.7" green="0.6" blue="0.4" />
+ </rect>
+ <rect>
+ <bounds x="4" y="2.5" width="1" height="2.5" />
+ <color red="0.7" green="0.6" blue="0.4" />
+ </rect>
+ <rect>
+ <bounds x="0" y="5" width="5" height="1" />
+ <color red="0.7" green="0.6" blue="0.4" />
+ </rect>
+ </element>
+ <element name="piece_2">
+ <text string=" ">
+ <bounds x="0" y="0" width="5" height="6" />
+ <color red="0" green="0" blue="0" />
+ </text>
+ <rect>
+ <bounds x="0" y="0" width="1" height="3" />
+ <color red="0.7" green="0.6" blue="0.4" />
+ </rect>
+ <rect>
+ <bounds x="4" y="2" width="1" height="3" />
+ <color red="0.7" green="0.6" blue="0.4" />
+ </rect>
+ <rect>
+ <bounds x="0" y="2" width="5" height="1" />
+ <color red="0.7" green="0.6" blue="0.4" />
+ </rect>
+ <rect>
+ <bounds x="0" y="5" width="5" height="1" />
+ <color red="0.7" green="0.6" blue="0.4" />
+ </rect>
+ </element>
+ <element name="piece_3">
+ <text string=" ">
+ <bounds x="0" y="0" width="5" height="6" />
+ <color red="0" green="0" blue="0" />
+ </text>
+ <rect>
+ <bounds x="0" y="0" width="1" height="6" />
+ <color red="0.7" green="0.6" blue="0.4" />
+ </rect>
+ <rect>
+ <bounds x="4" y="2.5" width="1" height="2.5" />
+ <color red="0.7" green="0.6" blue="0.4" />
+ </rect>
+ <rect>
+ <bounds x="0" y="5" width="5" height="1" />
+ <color red="0.7" green="0.6" blue="0.4" />
+ </rect>
+ </element>
+ <element name="piece_4">
+ <text string=" ">
+ <bounds x="0" y="0" width="5" height="6" />
+ <color red="0" green="0" blue="0" />
+ </text>
+ <rect>
+ <bounds x="0" y="2" width="1" height="3" />
+ <color red="0.7" green="0.6" blue="0.4" />
+ </rect>
+ <rect>
+ <bounds x="4" y="2" width="1" height="3" />
+ <color red="0.7" green="0.6" blue="0.4" />
+ </rect>
+ <rect>
+ <bounds x="0" y="2" width="5" height="1" />
+ <color red="0.7" green="0.6" blue="0.4" />
+ </rect>
+ <rect>
+ <bounds x="0" y="5" width="5" height="1" />
+ <color red="0.7" green="0.6" blue="0.4" />
+ </rect>
+ </element>
+ <element name="piece_5">
+ <text string=" ">
+ <bounds x="0" y="0" width="5" height="6" />
+ <color red="0" green="0" blue="0" />
+ </text>
+ <rect>
+ <bounds x="0" y="0" width="1" height="6" />
+ <color red="0.7" green="0.6" blue="0.4" />
+ </rect>
+ <rect>
+ <bounds x="4" y="0" width="1" height="6" />
+ <color red="0.7" green="0.6" blue="0.4" />
+ </rect>
+ <rect>
+ <bounds x="0" y="5" width="5" height="1" />
+ <color red="0.7" green="0.6" blue="0.4" />
+ </rect>
+ </element>
+ <element name="piece_6">
+ <text string=" ">
+ <bounds x="0" y="0" width="5" height="6" />
+ <color red="0" green="0" blue="0" />
+ </text>
+ <rect>
+ <bounds x="0" y="0" width="1" height="6" />
+ <color red="0.7" green="0.6" blue="0.4" />
+ </rect>
+ <rect>
+ <bounds x="4" y="0" width="1" height="6" />
+ <color red="0.7" green="0.6" blue="0.4" />
+ </rect>
+ <rect>
+ <bounds x="0" y="2" width="5" height="1" />
+ <color red="0.7" green="0.6" blue="0.4" />
+ </rect>
+ <rect>
+ <bounds x="0" y="5" width="5" height="1" />
+ <color red="0.7" green="0.6" blue="0.4" />
+ </rect>
+ </element>
+
+ <element name="text_0">
+ <rect><color red="0.17" green="0.15" blue="0.15" /></rect>
+ <text string="0"><color red="0.81" green="0.8" blue="0.79" /></text>
+ </element>
+ <element name="text_1">
+ <rect><color red="0.81" green="0.8" blue="0.79" /></rect>
+ <text string="A 1"><color red="0.17" green="0.15" blue="0.15" /></text>
+ </element>
+ <element name="text_2">
+ <rect><color red="0.17" green="0.15" blue="0.15" /></rect>
+ <text string="B 2"><color red="0.81" green="0.8" blue="0.79" /></text>
+ </element>
+ <element name="text_3">
+ <rect><color red="0.81" green="0.8" blue="0.79" /></rect>
+ <text string="C 3"><color red="0.17" green="0.15" blue="0.15" /></text>
+ </element>
+ <element name="text_4">
+ <rect><color red="0.17" green="0.15" blue="0.15" /></rect>
+ <text string="D 4"><color red="0.81" green="0.8" blue="0.79" /></text>
+ </element>
+ <element name="text_5">
+ <rect><color red="0.81" green="0.8" blue="0.79" /></rect>
+ <text string="E 5"><color red="0.17" green="0.15" blue="0.15" /></text>
+ </element>
+ <element name="text_6">
+ <rect><color red="0.17" green="0.15" blue="0.15" /></rect>
+ <text string="F 6"><color red="0.81" green="0.8" blue="0.79" /></text>
+ </element>
+ <element name="text_7">
+ <rect><color red="0.81" green="0.8" blue="0.79" /></rect>
+ <text string="G 7"><color red="0.17" green="0.15" blue="0.15" /></text>
+ </element>
+ <element name="text_8">
+ <rect><color red="0.17" green="0.15" blue="0.15" /></rect>
+ <text string="H 8"><color red="0.81" green="0.8" blue="0.79" /></text>
+ </element>
+ <element name="text_9a">
+ <rect><color red="0.81" green="0.8" blue="0.79" /></rect>
+ <text string="9" align="1"><color red="0.17" green="0.15" blue="0.15" /></text>
+ </element>
+ <element name="text_9b">
+ <rect><color red="0.81" green="0.8" blue="0.79" /></rect>
+ <text string="SET" align="2"><color red="0.17" green="0.15" blue="0.15" /></text>
+ </element>
+
+ <element name="text_ti">
+ <rect><color red="0.81" green="0.8" blue="0.79" /></rect>
+ <text string="TIME"><color red="0.17" green="0.15" blue="0.15" /></text>
+ </element>
+ <element name="text_bw">
+ <rect><color red="0.81" green="0.8" blue="0.79" /></rect>
+ <text string="B/W"><color red="0.17" green="0.15" blue="0.15" /></text>
+ </element>
+ <element name="text_ra">
+ <rect><color red="0.81" green="0.8" blue="0.79" /></rect>
+ <text string="RANK"><color red="0.17" green="0.15" blue="0.15" /></text>
+ </element>
+ <element name="text_re">
+ <rect><color red="0.81" green="0.8" blue="0.79" /></rect>
+ <text string="RESET"><color red="0.17" green="0.15" blue="0.15" /></text>
+ </element>
+ <element name="text_ce">
+ <rect><color red="0.81" green="0.8" blue="0.79" /></rect>
+ <text string="CE"><color red="0.17" green="0.15" blue="0.15" /></text>
+ </element>
+ <element name="text_en">
+ <rect><color red="0.81" green="0.8" blue="0.79" /></rect>
+ <text string="ENTER"><color red="0.17" green="0.15" blue="0.15" /></text>
+ </element>
+
+
+<!-- build screen -->
+
+ <view name="Internal Layout">
+ <bounds left="6" right="94" top="2" bottom="64" />
+
+ <bezel name="digit0" element="digit"><bounds x="10" y="4" width="10" height="15" /></bezel>
+ <bezel name="digit1" element="digit"><bounds x="20" y="4" width="10" height="15" /></bezel>
+ <bezel name="digit2" element="digit"><bounds x="30" y="4" width="10" height="15" /></bezel>
+ <bezel name="digit3" element="digit"><bounds x="40" y="4" width="10" height="15" /></bezel>
+ <bezel name="digit4" element="digit"><bounds x="50" y="4" width="10" height="15" /></bezel>
+ <bezel name="digit5" element="digit"><bounds x="60" y="4" width="10" height="15" /></bezel>
+ <bezel name="digit6" element="digit"><bounds x="70" y="4" width="10" height="15" /></bezel>
+ <bezel name="digit7" element="digit"><bounds x="80" y="4" width="10" height="15" /></bezel>
+
+ <bezel element="disk_white"><bounds x="14" y="21" width="2" height="2" /></bezel>
+ <bezel element="disk_white"><bounds x="24" y="21" width="2" height="2" /></bezel>
+ <bezel element="disk_white"><bounds x="34" y="21" width="2" height="2" /></bezel>
+ <bezel element="disk_white"><bounds x="44" y="21" width="2" height="2" /></bezel>
+ <bezel element="disk_white"><bounds x="54" y="21" width="2" height="2" /></bezel>
+ <bezel element="disk_white"><bounds x="64" y="21" width="2" height="2" /></bezel>
+ <bezel element="disk_white"><bounds x="74" y="21" width="2" height="2" /></bezel>
+ <bezel element="disk_white"><bounds x="84" y="21" width="2" height="2" /></bezel>
+
+ <bezel element="black"><bounds x="6" y="25" width="88" height="1" /></bezel>
+
+ <!-- button panel -->
+
+ <bezel element="white"><bounds x="8" y="28" width="84" height="34" /></bezel>
+ <bezel element="black"><bounds x="10" y="30" width="10" height="10" /></bezel>
+ <bezel element="black"><bounds x="30" y="30" width="10" height="10" /></bezel>
+ <bezel element="black"><bounds x="50" y="30" width="10" height="10" /></bezel>
+ <bezel element="black"><bounds x="70" y="30" width="10" height="10" /></bezel>
+ <bezel element="black"><bounds x="20" y="40" width="10" height="10" /></bezel>
+ <bezel element="black"><bounds x="40" y="40" width="10" height="10" /></bezel>
+ <bezel element="black"><bounds x="60" y="40" width="10" height="10" /></bezel>
+ <bezel element="black"><bounds x="80" y="40" width="10" height="10" /></bezel>
+ <bezel element="black"><bounds x="10" y="50" width="10" height="10" /></bezel>
+ <bezel element="black"><bounds x="30" y="50" width="10" height="10" /></bezel>
+ <bezel element="black"><bounds x="50" y="50" width="10" height="10" /></bezel>
+ <bezel element="black"><bounds x="70" y="50" width="10" height="10" /></bezel>
+
+ <bezel element="text_9a"><bounds x="41.5" y="30.5" width="5" height="4" /></bezel>
+ <bezel element="text_9b"><bounds x="41.5" y="35.5" width="7.5" height="3.5" /></bezel>
+ <bezel element="text_0"><bounds x="50.5" y="31.4" width="9" height="7" /></bezel>
+ <bezel element="white"><bounds x="63.5" y="44.7" width="3" height="0.6" /></bezel>
+
+ <bezel element="text_ti"><bounds x="10.5" y="43.5" width="9" height="3" /></bezel>
+ <bezel element="text_bw"><bounds x="60.5" y="33.5" width="9" height="3" /></bezel>
+ <bezel element="text_re"><bounds x="80.5" y="33.5" width="9" height="3" /></bezel>
+ <bezel element="text_ce"><bounds x="70.5" y="43.5" width="9" height="3" /></bezel>
+ <bezel element="text_ra"><bounds x="60.5" y="53.5" width="9" height="3" /></bezel>
+ <bezel element="text_en"><bounds x="80.5" y="53.5" width="9" height="3" /></bezel>
+
+ <bezel element="text_7"><bounds x="20.5" y="30.5" width="9" height="4" /></bezel>
+ <bezel element="text_8"><bounds x="30.5" y="30.5" width="9" height="4" /></bezel>
+ <bezel element="text_4"><bounds x="20.5" y="40.5" width="9" height="4" /></bezel>
+ <bezel element="text_5"><bounds x="30.5" y="40.5" width="9" height="4" /></bezel>
+ <bezel element="text_6"><bounds x="40.5" y="40.5" width="9" height="4" /></bezel>
+ <bezel element="text_1"><bounds x="20.5" y="50.5" width="9" height="4" /></bezel>
+ <bezel element="text_2"><bounds x="30.5" y="50.5" width="9" height="4" /></bezel>
+ <bezel element="text_3"><bounds x="40.5" y="50.5" width="9" height="4" /></bezel>
+
+ <bezel element="piece_1"><bounds x="23.3" y="55.5" width="3.4" height="4" /></bezel>
+ <bezel element="piece_2"><bounds x="33.3" y="55.5" width="3.4" height="4" /></bezel>
+ <bezel element="piece_3"><bounds x="43.3" y="55.5" width="3.4" height="4" /></bezel>
+ <bezel element="piece_4"><bounds x="23.3" y="45.5" width="3.4" height="4" /></bezel>
+ <bezel element="piece_5"><bounds x="33.3" y="45.5" width="3.4" height="4" /></bezel>
+ <bezel element="piece_6"><bounds x="43.3" y="45.5" width="3.4" height="4" /></bezel>
+
+ <bezel element="disk_black"><bounds x="24.5" y="34.5" width="1" height="1" /></bezel>
+ <bezel element="disk_white"><bounds x="34.5" y="34.5" width="1" height="1" /></bezel>
+ <bezel element="disk_white"><bounds x="24.5" y="44.5" width="1" height="1" /></bezel>
+ <bezel element="disk_black"><bounds x="34.5" y="44.5" width="1" height="1" /></bezel>
+ <bezel element="disk_white"><bounds x="44.5" y="44.5" width="1" height="1" /></bezel>
+ <bezel element="disk_black"><bounds x="24.5" y="54.5" width="1" height="1" /></bezel>
+ <bezel element="disk_white"><bounds x="34.5" y="54.5" width="1" height="1" /></bezel>
+ <bezel element="disk_black"><bounds x="44.5" y="54.5" width="1" height="1" /></bezel>
+
+ <bezel element="hl" inputtag="LINE4" inputmask="0x01"><bounds x="20" y="30" width="10" height="10" /><color alpha="0.4" /></bezel>
+ <bezel element="hl" inputtag="LINE4" inputmask="0x02"><bounds x="30" y="30" width="10" height="10" /><color alpha="0.2" /></bezel>
+ <bezel element="hl" inputtag="LINE4" inputmask="0x04"><bounds x="40" y="30" width="10" height="10" /><color alpha="0.4" /></bezel>
+ <bezel element="hl" inputtag="LINE1" inputmask="0x01"><bounds x="50" y="30" width="10" height="10" /><color alpha="0.2" /></bezel>
+ <bezel element="hl" inputtag="LINE1" inputmask="0x04"><bounds x="60" y="30" width="10" height="10" /><color alpha="0.4" /></bezel>
+ <bezel element="hl" inputtag="RESET" inputmask="0x01"><bounds x="80" y="30" width="10" height="10" /><color alpha="0.4" /></bezel>
+
+ <bezel element="hl" inputtag="LINE3" inputmask="0x08"><bounds x="10" y="40" width="10" height="10" /><color alpha="0.4" /></bezel>
+ <bezel element="hl" inputtag="LINE3" inputmask="0x01"><bounds x="20" y="40" width="10" height="10" /><color alpha="0.2" /></bezel>
+ <bezel element="hl" inputtag="LINE3" inputmask="0x02"><bounds x="30" y="40" width="10" height="10" /><color alpha="0.4" /></bezel>
+ <bezel element="hl" inputtag="LINE3" inputmask="0x04"><bounds x="40" y="40" width="10" height="10" /><color alpha="0.2" /></bezel>
+ <bezel element="hl" inputtag="LINE1" inputmask="0x02"><bounds x="60" y="40" width="10" height="10" /><color alpha="0.2" /></bezel>
+ <bezel element="hl" inputtag="LINE4" inputmask="0x08"><bounds x="70" y="40" width="10" height="10" /><color alpha="0.4" /></bezel>
+
+ <bezel element="hl" inputtag="LINE2" inputmask="0x01"><bounds x="20" y="50" width="10" height="10" /><color alpha="0.4" /></bezel>
+ <bezel element="hl" inputtag="LINE2" inputmask="0x02"><bounds x="30" y="50" width="10" height="10" /><color alpha="0.2" /></bezel>
+ <bezel element="hl" inputtag="LINE2" inputmask="0x04"><bounds x="40" y="50" width="10" height="10" /><color alpha="0.4" /></bezel>
+ <bezel element="hl" inputtag="LINE2" inputmask="0x08"><bounds x="60" y="50" width="10" height="10" /><color alpha="0.4" /></bezel>
+ <bezel element="hl" inputtag="LINE1" inputmask="0x08"><bounds x="80" y="50" width="10" height="10" /><color alpha="0.4" /></bezel>
+
+ </view>
+</mamelayout>
diff --git a/src/mame/layout/alphie.lay b/src/mame/layout/alphie.lay
index 259af608f92..6d417825279 100644
--- a/src/mame/layout/alphie.lay
+++ b/src/mame/layout/alphie.lay
@@ -10,19 +10,34 @@
<disk state="1"><color red="1.0" green="0.2" blue="0.23" /></disk>
</element>
+ <element name="nothing" defstate="0">
+ <text string=" "><color red="0" green="0" blue="0" /></text>
+ </element>
+
+ <element name="switch_qa" defstate="0">
+ <text string=" "><color red="0" green="0" blue="0" /></text>
+ <text state="0x01" string="1"><color red="0.95" green="0.95" blue="0.95" /></text>
+ <text state="0x02" string="2"><color red="0.95" green="0.95" blue="0.95" /></text>
+ <text state="0x04" string="3"><color red="0.95" green="0.95" blue="0.95" /></text>
+ <text state="0x08" string="4"><color red="0.95" green="0.95" blue="0.95" /></text>
+ <text state="0x10" string="5"><color red="0.95" green="0.95" blue="0.95" /></text>
+ </element>
+ <element name="switch_act" defstate="0">
+ <text string=" "><color red="0" green="0" blue="0" /></text>
+ <text state="0x01" string="S"><color red="0.95" green="0.95" blue="0.95" /></text>
+ <text state="0x02" string="*"><color red="0.95" green="0.95" blue="0.95" /></text>
+ <text state="0x04" string="X"><color red="0.95" green="0.95" blue="0.95" /></text>
+ <text state="0x08" string="&#x266a;"><color red="0.95" green="0.95" blue="0.95" /></text> <!-- music note -->
+ </element>
+
<element name="text_1"><text string="1"><color red="0.75" green="0.75" blue="0.75" /></text></element>
<element name="text_2"><text string="2"><color red="0.75" green="0.75" blue="0.75" /></text></element>
<element name="text_3"><text string="3"><color red="0.75" green="0.75" blue="0.75" /></text></element>
<element name="text_4"><text string="4"><color red="0.75" green="0.75" blue="0.75" /></text></element>
<element name="text_5"><text string="5"><color red="0.75" green="0.75" blue="0.75" /></text></element>
<element name="text_q"><text string="Question:" align="1"><color red="0.75" green="0.75" blue="0.75" /></text></element>
- <element name="text_a"><text string="Answer:" align="1"><color red="0.75" green="0.75" blue="0.75" /></text></element>
-
- <element name="counter" defstate="1">
- <simplecounter maxstate="9" digits="1">
- <color red="0.95" green="0.95" blue="0.95" />
- </simplecounter>
- </element>
+ <element name="text_ans"><text string="Answer:" align="1"><color red="0.75" green="0.75" blue="0.75" /></text></element>
+ <element name="text_act"><text string="Activity:" align="1"><color red="0.75" green="0.75" blue="0.75" /></text></element>
<!-- build screen -->
@@ -45,9 +60,12 @@
<bezel element="static_gray"><bounds x="6" y="0.5" width="0.2" height="13" /></bezel>
<bezel element="text_q"><bounds x="8" y="0" width="10" height="2" /></bezel>
- <bezel element="text_a"><bounds x="8" y="3" width="10" height="2" /></bezel>
- <bezel name="q_pos" element="counter"><bounds x="15" y="0" width="2" height="2" /></bezel>
- <bezel name="a_pos" element="counter"><bounds x="15" y="3" width="2" height="2" /></bezel>
+ <bezel element="text_ans"><bounds x="8" y="3" width="10" height="2" /></bezel>
+ <bezel element="text_act"><bounds x="8" y="6" width="10" height="2" /></bezel>
+ <bezel element="nothing" inputtag="DUMMY" inputmask="0x01"><bounds x="14" y="-1" width="4" height="10" /></bezel>
+ <bezel element="switch_qa" inputtag="IN.1" inputmask="0x1f" inputraw="1"><bounds x="15" y="0" width="2" height="2" /></bezel>
+ <bezel element="switch_qa" inputtag="IN.2" inputmask="0x1f" inputraw="1"><bounds x="15" y="3" width="2" height="2" /></bezel>
+ <bezel element="switch_act" inputtag="IN.3" inputmask="0x0f" inputraw="1"><bounds x="15" y="6" width="2" height="2" /></bezel>
</view>
</mamelayout>
diff --git a/src/mame/layout/arrball.lay b/src/mame/layout/arrball.lay
index 547fe808612..f0cc2e2a87d 100644
--- a/src/mame/layout/arrball.lay
+++ b/src/mame/layout/arrball.lay
@@ -69,291 +69,17 @@
<bezel element="static_orange"><bounds x="6.3" y="16.3" width="5.4" height="5.4" /></bezel>
<bezel element="static_black"><bounds x="6.7" y="16.7" width="4.6" height="4.6" /></bezel>
- <!-- stupid diagonal \ -->
-
- <bezel element="disk_orange"><bounds x="2.0" y="12.0" width="0.4" height="0.4" /></bezel>
- <bezel element="disk_orange"><bounds x="2.1" y="12.1" width="0.4" height="0.4" /></bezel>
- <bezel element="disk_orange"><bounds x="2.2" y="12.2" width="0.4" height="0.4" /></bezel>
- <bezel element="disk_orange"><bounds x="2.3" y="12.3" width="0.4" height="0.4" /></bezel>
- <bezel element="disk_orange"><bounds x="2.4" y="12.4" width="0.4" height="0.4" /></bezel>
- <bezel element="disk_orange"><bounds x="2.5" y="12.5" width="0.4" height="0.4" /></bezel>
- <bezel element="disk_orange"><bounds x="2.6" y="12.6" width="0.4" height="0.4" /></bezel>
- <bezel element="disk_orange"><bounds x="2.7" y="12.7" width="0.4" height="0.4" /></bezel>
- <bezel element="disk_orange"><bounds x="2.8" y="12.8" width="0.4" height="0.4" /></bezel>
- <bezel element="disk_orange"><bounds x="2.9" y="12.9" width="0.4" height="0.4" /></bezel>
- <bezel element="disk_orange"><bounds x="3.0" y="13.0" width="0.4" height="0.4" /></bezel>
- <bezel element="disk_orange"><bounds x="3.1" y="13.1" width="0.4" height="0.4" /></bezel>
- <bezel element="disk_orange"><bounds x="3.2" y="13.2" width="0.4" height="0.4" /></bezel>
- <bezel element="disk_orange"><bounds x="3.3" y="13.3" width="0.4" height="0.4" /></bezel>
- <bezel element="disk_orange"><bounds x="3.4" y="13.4" width="0.4" height="0.4" /></bezel>
- <bezel element="disk_orange"><bounds x="3.5" y="13.5" width="0.4" height="0.4" /></bezel>
- <bezel element="disk_orange"><bounds x="3.6" y="13.6" width="0.4" height="0.4" /></bezel>
- <bezel element="disk_orange"><bounds x="3.7" y="13.7" width="0.4" height="0.4" /></bezel>
- <bezel element="disk_orange"><bounds x="3.8" y="13.8" width="0.4" height="0.4" /></bezel>
- <bezel element="disk_orange"><bounds x="3.9" y="13.9" width="0.4" height="0.4" /></bezel>
- <bezel element="disk_orange"><bounds x="4.0" y="14.0" width="0.4" height="0.4" /></bezel>
- <bezel element="disk_orange"><bounds x="4.1" y="14.1" width="0.4" height="0.4" /></bezel>
- <bezel element="disk_orange"><bounds x="4.2" y="14.2" width="0.4" height="0.4" /></bezel>
- <bezel element="disk_orange"><bounds x="4.3" y="14.3" width="0.4" height="0.4" /></bezel>
- <bezel element="disk_orange"><bounds x="4.4" y="14.4" width="0.4" height="0.4" /></bezel>
- <bezel element="disk_orange"><bounds x="4.5" y="14.5" width="0.4" height="0.4" /></bezel>
- <bezel element="disk_orange"><bounds x="4.6" y="14.6" width="0.4" height="0.4" /></bezel>
- <bezel element="disk_orange"><bounds x="4.7" y="14.7" width="0.4" height="0.4" /></bezel>
- <bezel element="disk_orange"><bounds x="4.8" y="14.8" width="0.4" height="0.4" /></bezel>
- <bezel element="disk_orange"><bounds x="4.9" y="14.9" width="0.4" height="0.4" /></bezel>
- <bezel element="disk_orange"><bounds x="5.0" y="15.0" width="0.4" height="0.4" /></bezel>
- <bezel element="disk_orange"><bounds x="5.1" y="15.1" width="0.4" height="0.4" /></bezel>
- <bezel element="disk_orange"><bounds x="5.2" y="15.2" width="0.4" height="0.4" /></bezel>
- <bezel element="disk_orange"><bounds x="5.3" y="15.3" width="0.4" height="0.4" /></bezel>
- <bezel element="disk_orange"><bounds x="5.4" y="15.4" width="0.4" height="0.4" /></bezel>
- <bezel element="disk_orange"><bounds x="5.5" y="15.5" width="0.4" height="0.4" /></bezel>
- <bezel element="disk_orange"><bounds x="5.6" y="15.6" width="0.4" height="0.4" /></bezel>
- <bezel element="disk_orange"><bounds x="5.7" y="15.7" width="0.4" height="0.4" /></bezel>
- <bezel element="disk_orange"><bounds x="5.8" y="15.8" width="0.4" height="0.4" /></bezel>
- <bezel element="disk_orange"><bounds x="5.9" y="15.9" width="0.4" height="0.4" /></bezel>
- <bezel element="disk_orange"><bounds x="6.0" y="16.0" width="0.4" height="0.4" /></bezel>
- <bezel element="disk_orange"><bounds x="6.1" y="16.1" width="0.4" height="0.4" /></bezel>
- <bezel element="disk_orange"><bounds x="6.2" y="16.2" width="0.4" height="0.4" /></bezel>
- <bezel element="disk_orange"><bounds x="6.3" y="16.3" width="0.4" height="0.4" /></bezel>
- <bezel element="disk_orange"><bounds x="6.4" y="16.4" width="0.4" height="0.4" /></bezel>
- <bezel element="disk_orange"><bounds x="6.5" y="16.5" width="0.4" height="0.4" /></bezel>
- <bezel element="disk_orange"><bounds x="6.6" y="16.6" width="0.4" height="0.4" /></bezel>
- <bezel element="disk_orange"><bounds x="6.7" y="16.7" width="0.4" height="0.4" /></bezel>
- <bezel element="disk_orange"><bounds x="6.8" y="16.8" width="0.4" height="0.4" /></bezel>
- <bezel element="disk_orange"><bounds x="6.9" y="16.9" width="0.4" height="0.4" /></bezel>
- <bezel element="disk_orange"><bounds x="7.0" y="17.0" width="0.4" height="0.4" /></bezel>
- <bezel element="disk_orange"><bounds x="7.1" y="17.1" width="0.4" height="0.4" /></bezel>
- <bezel element="disk_orange"><bounds x="7.2" y="17.2" width="0.4" height="0.4" /></bezel>
- <bezel element="disk_orange"><bounds x="7.3" y="17.3" width="0.4" height="0.4" /></bezel>
- <bezel element="disk_orange"><bounds x="7.4" y="17.4" width="0.4" height="0.4" /></bezel>
- <bezel element="disk_orange"><bounds x="7.5" y="17.5" width="0.4" height="0.4" /></bezel>
- <bezel element="disk_orange"><bounds x="7.6" y="17.6" width="0.4" height="0.4" /></bezel>
- <bezel element="disk_orange"><bounds x="7.7" y="17.7" width="0.4" height="0.4" /></bezel>
- <bezel element="disk_orange"><bounds x="7.8" y="17.8" width="0.4" height="0.4" /></bezel>
- <bezel element="disk_orange"><bounds x="7.9" y="17.9" width="0.4" height="0.4" /></bezel>
- <bezel element="disk_orange"><bounds x="8.0" y="18.0" width="0.4" height="0.4" /></bezel>
- <bezel element="disk_orange"><bounds x="8.1" y="18.1" width="0.4" height="0.4" /></bezel>
- <bezel element="disk_orange"><bounds x="8.2" y="18.2" width="0.4" height="0.4" /></bezel>
- <bezel element="disk_orange"><bounds x="8.3" y="18.3" width="0.4" height="0.4" /></bezel>
- <bezel element="disk_orange"><bounds x="8.4" y="18.4" width="0.4" height="0.4" /></bezel>
- <bezel element="disk_orange"><bounds x="8.5" y="18.5" width="0.4" height="0.4" /></bezel>
- <bezel element="disk_orange"><bounds x="8.6" y="18.6" width="0.4" height="0.4" /></bezel>
- <bezel element="disk_orange"><bounds x="8.7" y="18.7" width="0.4" height="0.4" /></bezel>
- <bezel element="disk_orange"><bounds x="8.8" y="18.8" width="0.4" height="0.4" /></bezel>
- <bezel element="disk_orange"><bounds x="8.9" y="18.9" width="0.4" height="0.4" /></bezel>
- <bezel element="disk_orange"><bounds x="9.0" y="19.0" width="0.4" height="0.4" /></bezel>
- <bezel element="disk_orange"><bounds x="9.1" y="19.1" width="0.4" height="0.4" /></bezel>
- <bezel element="disk_orange"><bounds x="9.2" y="19.2" width="0.4" height="0.4" /></bezel>
- <bezel element="disk_orange"><bounds x="9.3" y="19.3" width="0.4" height="0.4" /></bezel>
- <bezel element="disk_orange"><bounds x="9.4" y="19.4" width="0.4" height="0.4" /></bezel>
- <bezel element="disk_orange"><bounds x="9.5" y="19.5" width="0.4" height="0.4" /></bezel>
- <bezel element="disk_orange"><bounds x="9.6" y="19.6" width="0.4" height="0.4" /></bezel>
- <bezel element="disk_orange"><bounds x="9.7" y="19.7" width="0.4" height="0.4" /></bezel>
- <bezel element="disk_orange"><bounds x="9.8" y="19.8" width="0.4" height="0.4" /></bezel>
- <bezel element="disk_orange"><bounds x="9.9" y="19.9" width="0.4" height="0.4" /></bezel>
- <bezel element="disk_orange"><bounds x="10.0" y="20.0" width="0.4" height="0.4" /></bezel>
- <bezel element="disk_orange"><bounds x="10.1" y="20.1" width="0.4" height="0.4" /></bezel>
- <bezel element="disk_orange"><bounds x="10.2" y="20.2" width="0.4" height="0.4" /></bezel>
- <bezel element="disk_orange"><bounds x="10.3" y="20.3" width="0.4" height="0.4" /></bezel>
- <bezel element="disk_orange"><bounds x="10.4" y="20.4" width="0.4" height="0.4" /></bezel>
- <bezel element="disk_orange"><bounds x="10.5" y="20.5" width="0.4" height="0.4" /></bezel>
- <bezel element="disk_orange"><bounds x="10.6" y="20.6" width="0.4" height="0.4" /></bezel>
- <bezel element="disk_orange"><bounds x="10.7" y="20.7" width="0.4" height="0.4" /></bezel>
- <bezel element="disk_orange"><bounds x="10.8" y="20.8" width="0.4" height="0.4" /></bezel>
- <bezel element="disk_orange"><bounds x="10.9" y="20.9" width="0.4" height="0.4" /></bezel>
- <bezel element="disk_orange"><bounds x="11.0" y="21.0" width="0.4" height="0.4" /></bezel>
- <bezel element="disk_orange"><bounds x="11.1" y="21.1" width="0.4" height="0.4" /></bezel>
- <bezel element="disk_orange"><bounds x="11.2" y="21.2" width="0.4" height="0.4" /></bezel>
- <bezel element="disk_orange"><bounds x="11.3" y="21.3" width="0.4" height="0.4" /></bezel>
- <bezel element="disk_orange"><bounds x="11.4" y="21.4" width="0.4" height="0.4" /></bezel>
- <bezel element="disk_orange"><bounds x="11.5" y="21.5" width="0.4" height="0.4" /></bezel>
- <bezel element="disk_orange"><bounds x="11.6" y="21.6" width="0.4" height="0.4" /></bezel>
- <bezel element="disk_orange"><bounds x="11.7" y="21.7" width="0.4" height="0.4" /></bezel>
- <bezel element="disk_orange"><bounds x="11.8" y="21.8" width="0.4" height="0.4" /></bezel>
- <bezel element="disk_orange"><bounds x="11.9" y="21.9" width="0.4" height="0.4" /></bezel>
- <bezel element="disk_orange"><bounds x="12.0" y="22.0" width="0.4" height="0.4" /></bezel>
- <bezel element="disk_orange"><bounds x="12.1" y="22.1" width="0.4" height="0.4" /></bezel>
- <bezel element="disk_orange"><bounds x="12.2" y="22.2" width="0.4" height="0.4" /></bezel>
- <bezel element="disk_orange"><bounds x="12.3" y="22.3" width="0.4" height="0.4" /></bezel>
- <bezel element="disk_orange"><bounds x="12.4" y="22.4" width="0.4" height="0.4" /></bezel>
- <bezel element="disk_orange"><bounds x="12.5" y="22.5" width="0.4" height="0.4" /></bezel>
- <bezel element="disk_orange"><bounds x="12.6" y="22.6" width="0.4" height="0.4" /></bezel>
- <bezel element="disk_orange"><bounds x="12.7" y="22.7" width="0.4" height="0.4" /></bezel>
- <bezel element="disk_orange"><bounds x="12.8" y="22.8" width="0.4" height="0.4" /></bezel>
- <bezel element="disk_orange"><bounds x="12.9" y="22.9" width="0.4" height="0.4" /></bezel>
- <bezel element="disk_orange"><bounds x="13.0" y="23.0" width="0.4" height="0.4" /></bezel>
- <bezel element="disk_orange"><bounds x="13.1" y="23.1" width="0.4" height="0.4" /></bezel>
- <bezel element="disk_orange"><bounds x="13.2" y="23.2" width="0.4" height="0.4" /></bezel>
- <bezel element="disk_orange"><bounds x="13.3" y="23.3" width="0.4" height="0.4" /></bezel>
- <bezel element="disk_orange"><bounds x="13.4" y="23.4" width="0.4" height="0.4" /></bezel>
- <bezel element="disk_orange"><bounds x="13.5" y="23.5" width="0.4" height="0.4" /></bezel>
- <bezel element="disk_orange"><bounds x="13.6" y="23.6" width="0.4" height="0.4" /></bezel>
- <bezel element="disk_orange"><bounds x="13.7" y="23.7" width="0.4" height="0.4" /></bezel>
- <bezel element="disk_orange"><bounds x="13.8" y="23.8" width="0.4" height="0.4" /></bezel>
- <bezel element="disk_orange"><bounds x="13.9" y="23.9" width="0.4" height="0.4" /></bezel>
- <bezel element="disk_orange"><bounds x="14.0" y="24.0" width="0.4" height="0.4" /></bezel>
- <bezel element="disk_orange"><bounds x="14.1" y="24.1" width="0.4" height="0.4" /></bezel>
- <bezel element="disk_orange"><bounds x="14.2" y="24.2" width="0.4" height="0.4" /></bezel>
- <bezel element="disk_orange"><bounds x="14.3" y="24.3" width="0.4" height="0.4" /></bezel>
- <bezel element="disk_orange"><bounds x="14.4" y="24.4" width="0.4" height="0.4" /></bezel>
- <bezel element="disk_orange"><bounds x="14.5" y="24.5" width="0.4" height="0.4" /></bezel>
- <bezel element="disk_orange"><bounds x="14.6" y="24.6" width="0.4" height="0.4" /></bezel>
- <bezel element="disk_orange"><bounds x="14.7" y="24.7" width="0.4" height="0.4" /></bezel>
- <bezel element="disk_orange"><bounds x="14.8" y="24.8" width="0.4" height="0.4" /></bezel>
- <bezel element="disk_orange"><bounds x="14.9" y="24.9" width="0.4" height="0.4" /></bezel>
- <bezel element="disk_orange"><bounds x="15.0" y="25.0" width="0.4" height="0.4" /></bezel>
- <bezel element="disk_orange"><bounds x="15.1" y="25.1" width="0.4" height="0.4" /></bezel>
- <bezel element="disk_orange"><bounds x="15.2" y="25.2" width="0.4" height="0.4" /></bezel>
- <bezel element="disk_orange"><bounds x="15.3" y="25.3" width="0.4" height="0.4" /></bezel>
- <bezel element="disk_orange"><bounds x="15.4" y="25.4" width="0.4" height="0.4" /></bezel>
- <bezel element="disk_orange"><bounds x="15.5" y="25.5" width="0.4" height="0.4" /></bezel>
- <bezel element="disk_orange"><bounds x="15.6" y="25.6" width="0.4" height="0.4" /></bezel>
- <bezel element="disk_orange"><bounds x="15.7" y="25.7" width="0.4" height="0.4" /></bezel>
- <bezel element="disk_orange"><bounds x="15.8" y="25.8" width="0.4" height="0.4" /></bezel>
- <bezel element="disk_orange"><bounds x="15.9" y="25.9" width="0.4" height="0.4" /></bezel>
-
- <!-- stupid diagonal / -->
-
- <bezel element="disk_orange"><bounds x="15.9" y="12.0" width="0.4" height="0.4" /></bezel>
- <bezel element="disk_orange"><bounds x="15.8" y="12.1" width="0.4" height="0.4" /></bezel>
- <bezel element="disk_orange"><bounds x="15.7" y="12.2" width="0.4" height="0.4" /></bezel>
- <bezel element="disk_orange"><bounds x="15.6" y="12.3" width="0.4" height="0.4" /></bezel>
- <bezel element="disk_orange"><bounds x="15.5" y="12.4" width="0.4" height="0.4" /></bezel>
- <bezel element="disk_orange"><bounds x="15.4" y="12.5" width="0.4" height="0.4" /></bezel>
- <bezel element="disk_orange"><bounds x="15.3" y="12.6" width="0.4" height="0.4" /></bezel>
- <bezel element="disk_orange"><bounds x="15.2" y="12.7" width="0.4" height="0.4" /></bezel>
- <bezel element="disk_orange"><bounds x="15.1" y="12.8" width="0.4" height="0.4" /></bezel>
- <bezel element="disk_orange"><bounds x="15.0" y="12.9" width="0.4" height="0.4" /></bezel>
- <bezel element="disk_orange"><bounds x="14.9" y="13.0" width="0.4" height="0.4" /></bezel>
- <bezel element="disk_orange"><bounds x="14.8" y="13.1" width="0.4" height="0.4" /></bezel>
- <bezel element="disk_orange"><bounds x="14.7" y="13.2" width="0.4" height="0.4" /></bezel>
- <bezel element="disk_orange"><bounds x="14.6" y="13.3" width="0.4" height="0.4" /></bezel>
- <bezel element="disk_orange"><bounds x="14.5" y="13.4" width="0.4" height="0.4" /></bezel>
- <bezel element="disk_orange"><bounds x="14.4" y="13.5" width="0.4" height="0.4" /></bezel>
- <bezel element="disk_orange"><bounds x="14.3" y="13.6" width="0.4" height="0.4" /></bezel>
- <bezel element="disk_orange"><bounds x="14.2" y="13.7" width="0.4" height="0.4" /></bezel>
- <bezel element="disk_orange"><bounds x="14.1" y="13.8" width="0.4" height="0.4" /></bezel>
- <bezel element="disk_orange"><bounds x="14.0" y="13.9" width="0.4" height="0.4" /></bezel>
- <bezel element="disk_orange"><bounds x="13.9" y="14.0" width="0.4" height="0.4" /></bezel>
- <bezel element="disk_orange"><bounds x="13.8" y="14.1" width="0.4" height="0.4" /></bezel>
- <bezel element="disk_orange"><bounds x="13.7" y="14.2" width="0.4" height="0.4" /></bezel>
- <bezel element="disk_orange"><bounds x="13.6" y="14.3" width="0.4" height="0.4" /></bezel>
- <bezel element="disk_orange"><bounds x="13.5" y="14.4" width="0.4" height="0.4" /></bezel>
- <bezel element="disk_orange"><bounds x="13.4" y="14.5" width="0.4" height="0.4" /></bezel>
- <bezel element="disk_orange"><bounds x="13.3" y="14.6" width="0.4" height="0.4" /></bezel>
- <bezel element="disk_orange"><bounds x="13.2" y="14.7" width="0.4" height="0.4" /></bezel>
- <bezel element="disk_orange"><bounds x="13.1" y="14.8" width="0.4" height="0.4" /></bezel>
- <bezel element="disk_orange"><bounds x="13.0" y="14.9" width="0.4" height="0.4" /></bezel>
- <bezel element="disk_orange"><bounds x="12.9" y="15.0" width="0.4" height="0.4" /></bezel>
- <bezel element="disk_orange"><bounds x="12.8" y="15.1" width="0.4" height="0.4" /></bezel>
- <bezel element="disk_orange"><bounds x="12.7" y="15.2" width="0.4" height="0.4" /></bezel>
- <bezel element="disk_orange"><bounds x="12.6" y="15.3" width="0.4" height="0.4" /></bezel>
- <bezel element="disk_orange"><bounds x="12.5" y="15.4" width="0.4" height="0.4" /></bezel>
- <bezel element="disk_orange"><bounds x="12.4" y="15.5" width="0.4" height="0.4" /></bezel>
- <bezel element="disk_orange"><bounds x="12.3" y="15.6" width="0.4" height="0.4" /></bezel>
- <bezel element="disk_orange"><bounds x="12.2" y="15.7" width="0.4" height="0.4" /></bezel>
- <bezel element="disk_orange"><bounds x="12.1" y="15.8" width="0.4" height="0.4" /></bezel>
- <bezel element="disk_orange"><bounds x="12.0" y="15.9" width="0.4" height="0.4" /></bezel>
- <bezel element="disk_orange"><bounds x="11.9" y="16.0" width="0.4" height="0.4" /></bezel>
- <bezel element="disk_orange"><bounds x="11.8" y="16.1" width="0.4" height="0.4" /></bezel>
- <bezel element="disk_orange"><bounds x="11.7" y="16.2" width="0.4" height="0.4" /></bezel>
- <bezel element="disk_orange"><bounds x="11.6" y="16.3" width="0.4" height="0.4" /></bezel>
- <bezel element="disk_orange"><bounds x="11.5" y="16.4" width="0.4" height="0.4" /></bezel>
- <bezel element="disk_orange"><bounds x="11.4" y="16.5" width="0.4" height="0.4" /></bezel>
- <bezel element="disk_orange"><bounds x="11.3" y="16.6" width="0.4" height="0.4" /></bezel>
- <bezel element="disk_orange"><bounds x="11.2" y="16.7" width="0.4" height="0.4" /></bezel>
- <bezel element="disk_orange"><bounds x="11.1" y="16.8" width="0.4" height="0.4" /></bezel>
- <bezel element="disk_orange"><bounds x="11.0" y="16.9" width="0.4" height="0.4" /></bezel>
- <bezel element="disk_orange"><bounds x="10.9" y="17.0" width="0.4" height="0.4" /></bezel>
- <bezel element="disk_orange"><bounds x="10.8" y="17.1" width="0.4" height="0.4" /></bezel>
- <bezel element="disk_orange"><bounds x="10.7" y="17.2" width="0.4" height="0.4" /></bezel>
- <bezel element="disk_orange"><bounds x="10.6" y="17.3" width="0.4" height="0.4" /></bezel>
- <bezel element="disk_orange"><bounds x="10.5" y="17.4" width="0.4" height="0.4" /></bezel>
- <bezel element="disk_orange"><bounds x="10.4" y="17.5" width="0.4" height="0.4" /></bezel>
- <bezel element="disk_orange"><bounds x="10.3" y="17.6" width="0.4" height="0.4" /></bezel>
- <bezel element="disk_orange"><bounds x="10.2" y="17.7" width="0.4" height="0.4" /></bezel>
- <bezel element="disk_orange"><bounds x="10.1" y="17.8" width="0.4" height="0.4" /></bezel>
- <bezel element="disk_orange"><bounds x="10.0" y="17.9" width="0.4" height="0.4" /></bezel>
- <bezel element="disk_orange"><bounds x="9.9" y="18.0" width="0.4" height="0.4" /></bezel>
- <bezel element="disk_orange"><bounds x="9.8" y="18.1" width="0.4" height="0.4" /></bezel>
- <bezel element="disk_orange"><bounds x="9.7" y="18.2" width="0.4" height="0.4" /></bezel>
- <bezel element="disk_orange"><bounds x="9.6" y="18.3" width="0.4" height="0.4" /></bezel>
- <bezel element="disk_orange"><bounds x="9.5" y="18.4" width="0.4" height="0.4" /></bezel>
- <bezel element="disk_orange"><bounds x="9.4" y="18.5" width="0.4" height="0.4" /></bezel>
- <bezel element="disk_orange"><bounds x="9.3" y="18.6" width="0.4" height="0.4" /></bezel>
- <bezel element="disk_orange"><bounds x="9.2" y="18.7" width="0.4" height="0.4" /></bezel>
- <bezel element="disk_orange"><bounds x="9.1" y="18.8" width="0.4" height="0.4" /></bezel>
- <bezel element="disk_orange"><bounds x="9.0" y="18.9" width="0.4" height="0.4" /></bezel>
- <bezel element="disk_orange"><bounds x="8.9" y="19.0" width="0.4" height="0.4" /></bezel>
- <bezel element="disk_orange"><bounds x="8.8" y="19.1" width="0.4" height="0.4" /></bezel>
- <bezel element="disk_orange"><bounds x="8.7" y="19.2" width="0.4" height="0.4" /></bezel>
- <bezel element="disk_orange"><bounds x="8.6" y="19.3" width="0.4" height="0.4" /></bezel>
- <bezel element="disk_orange"><bounds x="8.5" y="19.4" width="0.4" height="0.4" /></bezel>
- <bezel element="disk_orange"><bounds x="8.4" y="19.5" width="0.4" height="0.4" /></bezel>
- <bezel element="disk_orange"><bounds x="8.3" y="19.6" width="0.4" height="0.4" /></bezel>
- <bezel element="disk_orange"><bounds x="8.2" y="19.7" width="0.4" height="0.4" /></bezel>
- <bezel element="disk_orange"><bounds x="8.1" y="19.8" width="0.4" height="0.4" /></bezel>
- <bezel element="disk_orange"><bounds x="8.0" y="19.9" width="0.4" height="0.4" /></bezel>
- <bezel element="disk_orange"><bounds x="7.9" y="20.0" width="0.4" height="0.4" /></bezel>
- <bezel element="disk_orange"><bounds x="7.8" y="20.1" width="0.4" height="0.4" /></bezel>
- <bezel element="disk_orange"><bounds x="7.7" y="20.2" width="0.4" height="0.4" /></bezel>
- <bezel element="disk_orange"><bounds x="7.6" y="20.3" width="0.4" height="0.4" /></bezel>
- <bezel element="disk_orange"><bounds x="7.5" y="20.4" width="0.4" height="0.4" /></bezel>
- <bezel element="disk_orange"><bounds x="7.4" y="20.5" width="0.4" height="0.4" /></bezel>
- <bezel element="disk_orange"><bounds x="7.3" y="20.6" width="0.4" height="0.4" /></bezel>
- <bezel element="disk_orange"><bounds x="7.2" y="20.7" width="0.4" height="0.4" /></bezel>
- <bezel element="disk_orange"><bounds x="7.1" y="20.8" width="0.4" height="0.4" /></bezel>
- <bezel element="disk_orange"><bounds x="7.0" y="20.9" width="0.4" height="0.4" /></bezel>
- <bezel element="disk_orange"><bounds x="6.9" y="21.0" width="0.4" height="0.4" /></bezel>
- <bezel element="disk_orange"><bounds x="6.8" y="21.1" width="0.4" height="0.4" /></bezel>
- <bezel element="disk_orange"><bounds x="6.7" y="21.2" width="0.4" height="0.4" /></bezel>
- <bezel element="disk_orange"><bounds x="6.6" y="21.3" width="0.4" height="0.4" /></bezel>
- <bezel element="disk_orange"><bounds x="6.5" y="21.4" width="0.4" height="0.4" /></bezel>
- <bezel element="disk_orange"><bounds x="6.4" y="21.5" width="0.4" height="0.4" /></bezel>
- <bezel element="disk_orange"><bounds x="6.3" y="21.6" width="0.4" height="0.4" /></bezel>
- <bezel element="disk_orange"><bounds x="6.2" y="21.7" width="0.4" height="0.4" /></bezel>
- <bezel element="disk_orange"><bounds x="6.1" y="21.8" width="0.4" height="0.4" /></bezel>
- <bezel element="disk_orange"><bounds x="6.0" y="21.9" width="0.4" height="0.4" /></bezel>
- <bezel element="disk_orange"><bounds x="5.9" y="22.0" width="0.4" height="0.4" /></bezel>
- <bezel element="disk_orange"><bounds x="5.8" y="22.1" width="0.4" height="0.4" /></bezel>
- <bezel element="disk_orange"><bounds x="5.7" y="22.2" width="0.4" height="0.4" /></bezel>
- <bezel element="disk_orange"><bounds x="5.6" y="22.3" width="0.4" height="0.4" /></bezel>
- <bezel element="disk_orange"><bounds x="5.5" y="22.4" width="0.4" height="0.4" /></bezel>
- <bezel element="disk_orange"><bounds x="5.4" y="22.5" width="0.4" height="0.4" /></bezel>
- <bezel element="disk_orange"><bounds x="5.3" y="22.6" width="0.4" height="0.4" /></bezel>
- <bezel element="disk_orange"><bounds x="5.2" y="22.7" width="0.4" height="0.4" /></bezel>
- <bezel element="disk_orange"><bounds x="5.1" y="22.8" width="0.4" height="0.4" /></bezel>
- <bezel element="disk_orange"><bounds x="5.0" y="22.9" width="0.4" height="0.4" /></bezel>
- <bezel element="disk_orange"><bounds x="4.9" y="23.0" width="0.4" height="0.4" /></bezel>
- <bezel element="disk_orange"><bounds x="4.8" y="23.1" width="0.4" height="0.4" /></bezel>
- <bezel element="disk_orange"><bounds x="4.7" y="23.2" width="0.4" height="0.4" /></bezel>
- <bezel element="disk_orange"><bounds x="4.6" y="23.3" width="0.4" height="0.4" /></bezel>
- <bezel element="disk_orange"><bounds x="4.5" y="23.4" width="0.4" height="0.4" /></bezel>
- <bezel element="disk_orange"><bounds x="4.4" y="23.5" width="0.4" height="0.4" /></bezel>
- <bezel element="disk_orange"><bounds x="4.3" y="23.6" width="0.4" height="0.4" /></bezel>
- <bezel element="disk_orange"><bounds x="4.2" y="23.7" width="0.4" height="0.4" /></bezel>
- <bezel element="disk_orange"><bounds x="4.1" y="23.8" width="0.4" height="0.4" /></bezel>
- <bezel element="disk_orange"><bounds x="4.0" y="23.9" width="0.4" height="0.4" /></bezel>
- <bezel element="disk_orange"><bounds x="3.9" y="24.0" width="0.4" height="0.4" /></bezel>
- <bezel element="disk_orange"><bounds x="3.8" y="24.1" width="0.4" height="0.4" /></bezel>
- <bezel element="disk_orange"><bounds x="3.7" y="24.2" width="0.4" height="0.4" /></bezel>
- <bezel element="disk_orange"><bounds x="3.6" y="24.3" width="0.4" height="0.4" /></bezel>
- <bezel element="disk_orange"><bounds x="3.5" y="24.4" width="0.4" height="0.4" /></bezel>
- <bezel element="disk_orange"><bounds x="3.4" y="24.5" width="0.4" height="0.4" /></bezel>
- <bezel element="disk_orange"><bounds x="3.3" y="24.6" width="0.4" height="0.4" /></bezel>
- <bezel element="disk_orange"><bounds x="3.2" y="24.7" width="0.4" height="0.4" /></bezel>
- <bezel element="disk_orange"><bounds x="3.1" y="24.8" width="0.4" height="0.4" /></bezel>
- <bezel element="disk_orange"><bounds x="3.0" y="24.9" width="0.4" height="0.4" /></bezel>
- <bezel element="disk_orange"><bounds x="2.9" y="25.0" width="0.4" height="0.4" /></bezel>
- <bezel element="disk_orange"><bounds x="2.8" y="25.1" width="0.4" height="0.4" /></bezel>
- <bezel element="disk_orange"><bounds x="2.7" y="25.2" width="0.4" height="0.4" /></bezel>
- <bezel element="disk_orange"><bounds x="2.6" y="25.3" width="0.4" height="0.4" /></bezel>
- <bezel element="disk_orange"><bounds x="2.5" y="25.4" width="0.4" height="0.4" /></bezel>
- <bezel element="disk_orange"><bounds x="2.4" y="25.5" width="0.4" height="0.4" /></bezel>
- <bezel element="disk_orange"><bounds x="2.3" y="25.6" width="0.4" height="0.4" /></bezel>
- <bezel element="disk_orange"><bounds x="2.2" y="25.7" width="0.4" height="0.4" /></bezel>
- <bezel element="disk_orange"><bounds x="2.1" y="25.8" width="0.4" height="0.4" /></bezel>
- <bezel element="disk_orange"><bounds x="2.0" y="25.9" width="0.4" height="0.4" /></bezel>
+ <repeat count="140">
+ <param name="x" start="2.0" increment="0.1" />
+ <param name="y" start="12.0" increment="0.1" />
+ <bezel element="disk_orange"><bounds x="~x~" y="~y~" width="0.4" height="0.4" /></bezel>
+ </repeat>
+
+ <repeat count="140">
+ <param name="x" start="15.9" increment="-0.1" />
+ <param name="y" start="12.0" increment="0.1" />
+ <bezel element="disk_orange"><bounds x="~x~" y="~y~" width="0.4" height="0.4" /></bezel>
+ </repeat>
<bezel element="disk_white"><bounds x="0" y="10" width="3" height="3" /></bezel>
<bezel element="disk_white"><bounds x="5" y="10" width="3" height="3" /></bezel>
diff --git a/src/mame/layout/ave_arb.lay b/src/mame/layout/ave_arb.lay
new file mode 100644
index 00000000000..99c5e158b96
--- /dev/null
+++ b/src/mame/layout/ave_arb.lay
@@ -0,0 +1,437 @@
+<?xml version="1.0"?>
+<mamelayout version="2">
+
+<!-- define elements -->
+
+ <element name="led" defstate="0">
+ <disk state="1"><color red="1.0" green="0.1" blue="0.15" /></disk>
+ <disk state="0"><color red="0.1" green="0.01" blue="0.015" /></disk>
+ </element>
+
+ <element name="led2" defstate="0">
+ <disk state="1"><color red="1.0" green="0.1" blue="0.15" /></disk>
+ <disk state="0"><color red="0.14" green="0.014" blue="0.02" /></disk>
+ </element>
+ <element name="led2y" defstate="0">
+ <disk state="1"><color red="1.0" green="0.85" blue="0.15" /></disk>
+ <disk state="0"><color red="0.14" green="0.12" blue="0.02" /></disk>
+ </element>
+ <element name="led2g" defstate="0">
+ <disk state="1"><color red="0.20" green="0.85" blue="0.15" /></disk>
+ <disk state="0"><color red="0.03" green="0.14" blue="0.02" /></disk>
+ </element>
+
+ <element name="bt" defstate="0">
+ <disk state="0"><color red="0.17" green="0.15" blue="0.15" /></disk>
+ <disk state="1"><color red="0.34" green="0.3" blue="0.3" /></disk>
+ </element>
+
+ <element name="hl" defstate="0">
+ <text string=" ">
+ <bounds x="0.0" y="0.0" width="1.0" height="1.0" />
+ <color red="0.0" green="0.0" blue="0.0" />
+ </text>
+ <disk state="1">
+ <bounds x="0.12" y="0.12" width="0.76" height="0.76" />
+ <color red="1.0" green="1.0" blue="1.0" />
+ </disk>
+ </element>
+
+ <element name="black"><rect><color red="0.17" green="0.15" blue="0.15" /></rect></element>
+ <element name="white"><rect><color red="0.81" green="0.8" blue="0.79" /></rect></element>
+ <element name="disk_black"><disk><color red="0.17" green="0.15" blue="0.15" /></disk></element>
+
+ <element name="text_1">
+ <rect><color red="0.81" green="0.8" blue="0.79" /></rect>
+ <text string="1"><color red="0.01" green="0.01" blue="0.01" /></text>
+ </element>
+ <element name="text_2">
+ <rect><color red="0.81" green="0.8" blue="0.79" /></rect>
+ <text string="2"><color red="0.01" green="0.01" blue="0.01" /></text>
+ </element>
+ <element name="text_3">
+ <rect><color red="0.81" green="0.8" blue="0.79" /></rect>
+ <text string="3"><color red="0.01" green="0.01" blue="0.01" /></text>
+ </element>
+ <element name="text_4">
+ <rect><color red="0.81" green="0.8" blue="0.79" /></rect>
+ <text string="4"><color red="0.01" green="0.01" blue="0.01" /></text>
+ </element>
+ <element name="text_5">
+ <rect><color red="0.81" green="0.8" blue="0.79" /></rect>
+ <text string="5"><color red="0.01" green="0.01" blue="0.01" /></text>
+ </element>
+ <element name="text_6">
+ <rect><color red="0.81" green="0.8" blue="0.79" /></rect>
+ <text string="6"><color red="0.01" green="0.01" blue="0.01" /></text>
+ </element>
+ <element name="text_7">
+ <rect><color red="0.81" green="0.8" blue="0.79" /></rect>
+ <text string="7"><color red="0.01" green="0.01" blue="0.01" /></text>
+ </element>
+ <element name="text_8">
+ <rect><color red="0.81" green="0.8" blue="0.79" /></rect>
+ <text string="8"><color red="0.01" green="0.01" blue="0.01" /></text>
+ </element>
+
+ <element name="text_a">
+ <rect><color red="0.81" green="0.8" blue="0.79" /></rect>
+ <text string="A"><color red="0.01" green="0.01" blue="0.01" /></text>
+ </element>
+ <element name="text_b">
+ <rect><color red="0.81" green="0.8" blue="0.79" /></rect>
+ <text string="B"><color red="0.01" green="0.01" blue="0.01" /></text>
+ </element>
+ <element name="text_c">
+ <rect><color red="0.81" green="0.8" blue="0.79" /></rect>
+ <text string="C"><color red="0.01" green="0.01" blue="0.01" /></text>
+ </element>
+ <element name="text_d">
+ <rect><color red="0.81" green="0.8" blue="0.79" /></rect>
+ <text string="D"><color red="0.01" green="0.01" blue="0.01" /></text>
+ </element>
+ <element name="text_e">
+ <rect><color red="0.81" green="0.8" blue="0.79" /></rect>
+ <text string="E"><color red="0.01" green="0.01" blue="0.01" /></text>
+ </element>
+ <element name="text_f">
+ <rect><color red="0.81" green="0.8" blue="0.79" /></rect>
+ <text string="F"><color red="0.01" green="0.01" blue="0.01" /></text>
+ </element>
+ <element name="text_g">
+ <rect><color red="0.81" green="0.8" blue="0.79" /></rect>
+ <text string="G"><color red="0.01" green="0.01" blue="0.01" /></text>
+ </element>
+ <element name="text_h">
+ <rect><color red="0.81" green="0.8" blue="0.79" /></rect>
+ <text string="H"><color red="0.01" green="0.01" blue="0.01" /></text>
+ </element>
+
+ <element name="text_l0"><text string="0"><color red="0.81" green="0.8" blue="0.79" /></text></element>
+ <element name="text_l1"><text string="1"><color red="0.81" green="0.8" blue="0.79" /></text></element>
+ <element name="text_l2"><text string="2"><color red="0.81" green="0.8" blue="0.79" /></text></element>
+ <element name="text_l3"><text string="3"><color red="0.81" green="0.8" blue="0.79" /></text></element>
+ <element name="text_l4"><text string="4"><color red="0.81" green="0.8" blue="0.79" /></text></element>
+ <element name="text_l5"><text string="5"><color red="0.81" green="0.8" blue="0.79" /></text></element>
+ <element name="text_l6"><text string="6"><color red="0.81" green="0.8" blue="0.79" /></text></element>
+
+ <element name="text_s1"><text string="OPTIONS" align="1"><color red="0.55" green="0.55" blue="0.55" /></text></element>
+ <element name="text_s2"><text string="Verify" align="1"><color red="0.55" green="0.55" blue="0.55" /></text></element>
+ <element name="text_s3"><text string="Take Back" align="1"><color red="0.55" green="0.55" blue="0.55" /></text></element>
+ <element name="text_s4"><text string="Clear" align="1"><color red="0.55" green="0.55" blue="0.55" /></text></element>
+
+ <element name="text_r11"><text string="[P]"><color red="0.81" green="0.8" blue="0.79" /></text></element>
+ <element name="text_r21"><text string="[N]"><color red="0.81" green="0.8" blue="0.79" /></text></element>
+ <element name="text_r31"><text string="[B]"><color red="0.81" green="0.8" blue="0.79" /></text></element>
+ <element name="text_r41"><text string="[R]"><color red="0.81" green="0.8" blue="0.79" /></text></element>
+ <element name="text_r51"><text string="[Q]"><color red="0.81" green="0.8" blue="0.79" /></text></element>
+ <element name="text_r61"><text string="[K]"><color red="0.81" green="0.8" blue="0.79" /></text></element>
+ <element name="text_r71"><text string="W"><color red="0.81" green="0.8" blue="0.79" /></text></element> <!-- White -->
+ <element name="text_r81"><text string="B"><color red="0.81" green="0.8" blue="0.79" /></text></element> <!-- Black -->
+
+ <element name="text_r12"><text string="RESET" align="2"><color red="0.81" green="0.8" blue="0.79" /></text></element>
+ <element name="text_r22"><text string="HALT" align="2"><color red="0.81" green="0.8" blue="0.79" /></text></element>
+ <element name="text_r32"><text string="New Game" align="1"><color red="0.81" green="0.8" blue="0.79" /></text></element>
+ <element name="text_r42"><text string="Change Level" align="1"><color red="0.81" green="0.8" blue="0.79" /></text></element>
+ <element name="text_r52"><text string="Change Color" align="1"><color red="0.81" green="0.8" blue="0.79" /></text></element>
+ <element name="text_r62"><text string="Change Board" align="1"><color red="0.81" green="0.8" blue="0.79" /></text></element>
+ <element name="text_r72"><text string="Self Play" align="1"><color red="0.81" green="0.8" blue="0.79" /></text></element>
+ <element name="text_r82"><text string="Monitor" align="1"><color red="0.81" green="0.8" blue="0.79" /></text></element>
+ <element name="text_r92"><text string="Variable" align="1"><color red="0.81" green="0.8" blue="0.79" /></text></element>
+ <element name="text_ra2"><text string="Hint" align="1"><color red="0.81" green="0.8" blue="0.79" /></text></element>
+
+ <element name="text_r13"><text string="Your Move" align="1"><color red="0.81" green="0.8" blue="0.79" /></text></element>
+ <element name="text_r23"><text string="Sargon's Move" align="1"><color red="0.81" green="0.8" blue="0.79" /></text></element>
+ <element name="text_r33"><text string="Check" align="1"><color red="0.81" green="0.8" blue="0.79" /></text></element>
+ <element name="text_r43"><text string="Change Board" align="1"><color red="0.81" green="0.8" blue="0.79" /></text></element>
+
+
+<!-- build screen -->
+
+ <view name="Internal Layout">
+ <bounds left="-2" right="106.5" top="-2" bottom="88" />
+
+ <bezel element="white"><bounds x="-2.5" y="-2.5" width="90.5" height="91" /></bezel>
+
+ <!-- chessboard coords -->
+
+ <bezel element="text_8"><bounds x="-0.8" y="7" width="2" height="2" /></bezel>
+ <bezel element="text_7"><bounds x="-0.8" y="17" width="2" height="2" /></bezel>
+ <bezel element="text_6"><bounds x="-0.8" y="27" width="2" height="2" /></bezel>
+ <bezel element="text_5"><bounds x="-0.8" y="37" width="2" height="2" /></bezel>
+ <bezel element="text_4"><bounds x="-0.8" y="47" width="2" height="2" /></bezel>
+ <bezel element="text_3"><bounds x="-0.8" y="57" width="2" height="2" /></bezel>
+ <bezel element="text_2"><bounds x="-0.8" y="67" width="2" height="2" /></bezel>
+ <bezel element="text_1"><bounds x="-0.8" y="77" width="2" height="2" /></bezel>
+
+ <bezel element="text_a"><bounds x="7" y="85" width="2" height="2" /></bezel>
+ <bezel element="text_b"><bounds x="17" y="85" width="2" height="2" /></bezel>
+ <bezel element="text_c"><bounds x="27" y="85" width="2" height="2" /></bezel>
+ <bezel element="text_d"><bounds x="37" y="85" width="2" height="2" /></bezel>
+ <bezel element="text_e"><bounds x="47" y="85" width="2" height="2" /></bezel>
+ <bezel element="text_f"><bounds x="57" y="85" width="2" height="2" /></bezel>
+ <bezel element="text_g"><bounds x="67" y="85" width="2" height="2" /></bezel>
+ <bezel element="text_h"><bounds x="77" y="85" width="2" height="2" /></bezel>
+
+ <!-- chessboard bezel -->
+
+ <bezel element="black"><bounds x="2" y="2" width="82" height="82" /></bezel>
+ <bezel element="white"><bounds x="3" y="3" width="80" height="80" /></bezel>
+
+ <bezel element="black"><bounds x="13" y="2.5" width="10" height="10.5" /></bezel>
+ <bezel element="black"><bounds x="33" y="2.5" width="10" height="10.5" /></bezel>
+ <bezel element="black"><bounds x="53" y="2.5" width="10" height="10.5" /></bezel>
+ <bezel element="black"><bounds x="73" y="2.5" width="10.5" height="10.5" /></bezel>
+
+ <bezel element="black"><bounds x="2.5" y="13" width="10.5" height="10" /></bezel>
+ <bezel element="black"><bounds x="23" y="13" width="10" height="10" /></bezel>
+ <bezel element="black"><bounds x="43" y="13" width="10" height="10" /></bezel>
+ <bezel element="black"><bounds x="63" y="13" width="10" height="10" /></bezel>
+
+ <bezel element="black"><bounds x="13" y="23" width="10" height="10" /></bezel>
+ <bezel element="black"><bounds x="33" y="23" width="10" height="10" /></bezel>
+ <bezel element="black"><bounds x="53" y="23" width="10" height="10" /></bezel>
+ <bezel element="black"><bounds x="73" y="23" width="10.5" height="10" /></bezel>
+
+ <bezel element="black"><bounds x="2.5" y="33" width="10.5" height="10" /></bezel>
+ <bezel element="black"><bounds x="23" y="33" width="10" height="10" /></bezel>
+ <bezel element="black"><bounds x="43" y="33" width="10" height="10" /></bezel>
+ <bezel element="black"><bounds x="63" y="33" width="10" height="10" /></bezel>
+
+ <bezel element="black"><bounds x="13" y="43" width="10" height="10" /></bezel>
+ <bezel element="black"><bounds x="33" y="43" width="10" height="10" /></bezel>
+ <bezel element="black"><bounds x="53" y="43" width="10" height="10" /></bezel>
+ <bezel element="black"><bounds x="73" y="43" width="10.5" height="10" /></bezel>
+
+ <bezel element="black"><bounds x="2.5" y="53" width="10.5" height="10" /></bezel>
+ <bezel element="black"><bounds x="23" y="53" width="10" height="10" /></bezel>
+ <bezel element="black"><bounds x="43" y="53" width="10" height="10" /></bezel>
+ <bezel element="black"><bounds x="63" y="53" width="10" height="10" /></bezel>
+
+ <bezel element="black"><bounds x="13" y="63" width="10" height="10" /></bezel>
+ <bezel element="black"><bounds x="33" y="63" width="10" height="10" /></bezel>
+ <bezel element="black"><bounds x="53" y="63" width="10" height="10" /></bezel>
+ <bezel element="black"><bounds x="73" y="63" width="10.5" height="10" /></bezel>
+
+ <bezel element="black"><bounds x="2.5" y="73" width="10.5" height="10.5" /></bezel>
+ <bezel element="black"><bounds x="23" y="73" width="10" height="10.5" /></bezel>
+ <bezel element="black"><bounds x="43" y="73" width="10" height="10.5" /></bezel>
+ <bezel element="black"><bounds x="63" y="73" width="10" height="10.5" /></bezel>
+
+ <!-- chessboard leds -->
+
+ <bezel name="0.7" element="led"><bounds x="11.3" y="11.3" width="1.5" height="1.5" /></bezel>
+ <bezel name="1.7" element="led"><bounds x="21.3" y="11.3" width="1.5" height="1.5" /></bezel>
+ <bezel name="2.7" element="led"><bounds x="31.3" y="11.3" width="1.5" height="1.5" /></bezel>
+ <bezel name="3.7" element="led"><bounds x="41.3" y="11.3" width="1.5" height="1.5" /></bezel>
+ <bezel name="4.7" element="led"><bounds x="51.3" y="11.3" width="1.5" height="1.5" /></bezel>
+ <bezel name="5.7" element="led"><bounds x="61.3" y="11.3" width="1.5" height="1.5" /></bezel>
+ <bezel name="6.7" element="led"><bounds x="71.3" y="11.3" width="1.5" height="1.5" /></bezel>
+ <bezel name="7.7" element="led"><bounds x="81.3" y="11.3" width="1.5" height="1.5" /></bezel>
+
+ <bezel name="0.6" element="led"><bounds x="11.3" y="21.3" width="1.5" height="1.5" /></bezel>
+ <bezel name="1.6" element="led"><bounds x="21.3" y="21.3" width="1.5" height="1.5" /></bezel>
+ <bezel name="2.6" element="led"><bounds x="31.3" y="21.3" width="1.5" height="1.5" /></bezel>
+ <bezel name="3.6" element="led"><bounds x="41.3" y="21.3" width="1.5" height="1.5" /></bezel>
+ <bezel name="4.6" element="led"><bounds x="51.3" y="21.3" width="1.5" height="1.5" /></bezel>
+ <bezel name="5.6" element="led"><bounds x="61.3" y="21.3" width="1.5" height="1.5" /></bezel>
+ <bezel name="6.6" element="led"><bounds x="71.3" y="21.3" width="1.5" height="1.5" /></bezel>
+ <bezel name="7.6" element="led"><bounds x="81.3" y="21.3" width="1.5" height="1.5" /></bezel>
+
+ <bezel name="0.5" element="led"><bounds x="11.3" y="31.3" width="1.5" height="1.5" /></bezel>
+ <bezel name="1.5" element="led"><bounds x="21.3" y="31.3" width="1.5" height="1.5" /></bezel>
+ <bezel name="2.5" element="led"><bounds x="31.3" y="31.3" width="1.5" height="1.5" /></bezel>
+ <bezel name="3.5" element="led"><bounds x="41.3" y="31.3" width="1.5" height="1.5" /></bezel>
+ <bezel name="4.5" element="led"><bounds x="51.3" y="31.3" width="1.5" height="1.5" /></bezel>
+ <bezel name="5.5" element="led"><bounds x="61.3" y="31.3" width="1.5" height="1.5" /></bezel>
+ <bezel name="6.5" element="led"><bounds x="71.3" y="31.3" width="1.5" height="1.5" /></bezel>
+ <bezel name="7.5" element="led"><bounds x="81.3" y="31.3" width="1.5" height="1.5" /></bezel>
+
+ <bezel name="0.4" element="led"><bounds x="11.3" y="41.3" width="1.5" height="1.5" /></bezel>
+ <bezel name="1.4" element="led"><bounds x="21.3" y="41.3" width="1.5" height="1.5" /></bezel>
+ <bezel name="2.4" element="led"><bounds x="31.3" y="41.3" width="1.5" height="1.5" /></bezel>
+ <bezel name="3.4" element="led"><bounds x="41.3" y="41.3" width="1.5" height="1.5" /></bezel>
+ <bezel name="4.4" element="led"><bounds x="51.3" y="41.3" width="1.5" height="1.5" /></bezel>
+ <bezel name="5.4" element="led"><bounds x="61.3" y="41.3" width="1.5" height="1.5" /></bezel>
+ <bezel name="6.4" element="led"><bounds x="71.3" y="41.3" width="1.5" height="1.5" /></bezel>
+ <bezel name="7.4" element="led"><bounds x="81.3" y="41.3" width="1.5" height="1.5" /></bezel>
+
+ <bezel name="0.3" element="led"><bounds x="11.3" y="51.3" width="1.5" height="1.5" /></bezel>
+ <bezel name="1.3" element="led"><bounds x="21.3" y="51.3" width="1.5" height="1.5" /></bezel>
+ <bezel name="2.3" element="led"><bounds x="31.3" y="51.3" width="1.5" height="1.5" /></bezel>
+ <bezel name="3.3" element="led"><bounds x="41.3" y="51.3" width="1.5" height="1.5" /></bezel>
+ <bezel name="4.3" element="led"><bounds x="51.3" y="51.3" width="1.5" height="1.5" /></bezel>
+ <bezel name="5.3" element="led"><bounds x="61.3" y="51.3" width="1.5" height="1.5" /></bezel>
+ <bezel name="6.3" element="led"><bounds x="71.3" y="51.3" width="1.5" height="1.5" /></bezel>
+ <bezel name="7.3" element="led"><bounds x="81.3" y="51.3" width="1.5" height="1.5" /></bezel>
+
+ <bezel name="0.2" element="led"><bounds x="11.3" y="61.3" width="1.5" height="1.5" /></bezel>
+ <bezel name="1.2" element="led"><bounds x="21.3" y="61.3" width="1.5" height="1.5" /></bezel>
+ <bezel name="2.2" element="led"><bounds x="31.3" y="61.3" width="1.5" height="1.5" /></bezel>
+ <bezel name="3.2" element="led"><bounds x="41.3" y="61.3" width="1.5" height="1.5" /></bezel>
+ <bezel name="4.2" element="led"><bounds x="51.3" y="61.3" width="1.5" height="1.5" /></bezel>
+ <bezel name="5.2" element="led"><bounds x="61.3" y="61.3" width="1.5" height="1.5" /></bezel>
+ <bezel name="6.2" element="led"><bounds x="71.3" y="61.3" width="1.5" height="1.5" /></bezel>
+ <bezel name="7.2" element="led"><bounds x="81.3" y="61.3" width="1.5" height="1.5" /></bezel>
+
+ <bezel name="0.1" element="led"><bounds x="11.3" y="71.3" width="1.5" height="1.5" /></bezel>
+ <bezel name="1.1" element="led"><bounds x="21.3" y="71.3" width="1.5" height="1.5" /></bezel>
+ <bezel name="2.1" element="led"><bounds x="31.3" y="71.3" width="1.5" height="1.5" /></bezel>
+ <bezel name="3.1" element="led"><bounds x="41.3" y="71.3" width="1.5" height="1.5" /></bezel>
+ <bezel name="4.1" element="led"><bounds x="51.3" y="71.3" width="1.5" height="1.5" /></bezel>
+ <bezel name="5.1" element="led"><bounds x="61.3" y="71.3" width="1.5" height="1.5" /></bezel>
+ <bezel name="6.1" element="led"><bounds x="71.3" y="71.3" width="1.5" height="1.5" /></bezel>
+ <bezel name="7.1" element="led"><bounds x="81.3" y="71.3" width="1.5" height="1.5" /></bezel>
+
+ <bezel name="0.0" element="led"><bounds x="11.3" y="81.3" width="1.5" height="1.5" /></bezel>
+ <bezel name="1.0" element="led"><bounds x="21.3" y="81.3" width="1.5" height="1.5" /></bezel>
+ <bezel name="2.0" element="led"><bounds x="31.3" y="81.3" width="1.5" height="1.5" /></bezel>
+ <bezel name="3.0" element="led"><bounds x="41.3" y="81.3" width="1.5" height="1.5" /></bezel>
+ <bezel name="4.0" element="led"><bounds x="51.3" y="81.3" width="1.5" height="1.5" /></bezel>
+ <bezel name="5.0" element="led"><bounds x="61.3" y="81.3" width="1.5" height="1.5" /></bezel>
+ <bezel name="6.0" element="led"><bounds x="71.3" y="81.3" width="1.5" height="1.5" /></bezel>
+ <bezel name="7.0" element="led"><bounds x="81.3" y="81.3" width="1.5" height="1.5" /></bezel>
+
+ <!-- chessboard sensors -->
+
+ <bezel element="hl" inputtag="IN.0" inputmask="0x80"><bounds x="3" y="3" width="10" height="10" /><color alpha="0.4" /></bezel>
+ <bezel element="hl" inputtag="IN.1" inputmask="0x80"><bounds x="13" y="3" width="10" height="10" /><color alpha="0.2" /></bezel>
+ <bezel element="hl" inputtag="IN.2" inputmask="0x80"><bounds x="23" y="3" width="10" height="10" /><color alpha="0.4" /></bezel>
+ <bezel element="hl" inputtag="IN.3" inputmask="0x80"><bounds x="33" y="3" width="10" height="10" /><color alpha="0.2" /></bezel>
+ <bezel element="hl" inputtag="IN.4" inputmask="0x80"><bounds x="43" y="3" width="10" height="10" /><color alpha="0.4" /></bezel>
+ <bezel element="hl" inputtag="IN.5" inputmask="0x80"><bounds x="53" y="3" width="10" height="10" /><color alpha="0.2" /></bezel>
+ <bezel element="hl" inputtag="IN.6" inputmask="0x80"><bounds x="63" y="3" width="10" height="10" /><color alpha="0.4" /></bezel>
+ <bezel element="hl" inputtag="IN.7" inputmask="0x80"><bounds x="73" y="3" width="10" height="10" /><color alpha="0.2" /></bezel>
+
+ <bezel element="hl" inputtag="IN.0" inputmask="0x40"><bounds x="3" y="13" width="10" height="10" /><color alpha="0.2" /></bezel>
+ <bezel element="hl" inputtag="IN.1" inputmask="0x40"><bounds x="13" y="13" width="10" height="10" /><color alpha="0.4" /></bezel>
+ <bezel element="hl" inputtag="IN.2" inputmask="0x40"><bounds x="23" y="13" width="10" height="10" /><color alpha="0.2" /></bezel>
+ <bezel element="hl" inputtag="IN.3" inputmask="0x40"><bounds x="33" y="13" width="10" height="10" /><color alpha="0.4" /></bezel>
+ <bezel element="hl" inputtag="IN.4" inputmask="0x40"><bounds x="43" y="13" width="10" height="10" /><color alpha="0.2" /></bezel>
+ <bezel element="hl" inputtag="IN.5" inputmask="0x40"><bounds x="53" y="13" width="10" height="10" /><color alpha="0.4" /></bezel>
+ <bezel element="hl" inputtag="IN.6" inputmask="0x40"><bounds x="63" y="13" width="10" height="10" /><color alpha="0.2" /></bezel>
+ <bezel element="hl" inputtag="IN.7" inputmask="0x40"><bounds x="73" y="13" width="10" height="10" /><color alpha="0.4" /></bezel>
+
+ <bezel element="hl" inputtag="IN.0" inputmask="0x20"><bounds x="3" y="23" width="10" height="10" /><color alpha="0.4" /></bezel>
+ <bezel element="hl" inputtag="IN.1" inputmask="0x20"><bounds x="13" y="23" width="10" height="10" /><color alpha="0.2" /></bezel>
+ <bezel element="hl" inputtag="IN.2" inputmask="0x20"><bounds x="23" y="23" width="10" height="10" /><color alpha="0.4" /></bezel>
+ <bezel element="hl" inputtag="IN.3" inputmask="0x20"><bounds x="33" y="23" width="10" height="10" /><color alpha="0.2" /></bezel>
+ <bezel element="hl" inputtag="IN.4" inputmask="0x20"><bounds x="43" y="23" width="10" height="10" /><color alpha="0.4" /></bezel>
+ <bezel element="hl" inputtag="IN.5" inputmask="0x20"><bounds x="53" y="23" width="10" height="10" /><color alpha="0.2" /></bezel>
+ <bezel element="hl" inputtag="IN.6" inputmask="0x20"><bounds x="63" y="23" width="10" height="10" /><color alpha="0.4" /></bezel>
+ <bezel element="hl" inputtag="IN.7" inputmask="0x20"><bounds x="73" y="23" width="10" height="10" /><color alpha="0.2" /></bezel>
+
+ <bezel element="hl" inputtag="IN.0" inputmask="0x10"><bounds x="3" y="33" width="10" height="10" /><color alpha="0.2" /></bezel>
+ <bezel element="hl" inputtag="IN.1" inputmask="0x10"><bounds x="13" y="33" width="10" height="10" /><color alpha="0.4" /></bezel>
+ <bezel element="hl" inputtag="IN.2" inputmask="0x10"><bounds x="23" y="33" width="10" height="10" /><color alpha="0.2" /></bezel>
+ <bezel element="hl" inputtag="IN.3" inputmask="0x10"><bounds x="33" y="33" width="10" height="10" /><color alpha="0.4" /></bezel>
+ <bezel element="hl" inputtag="IN.4" inputmask="0x10"><bounds x="43" y="33" width="10" height="10" /><color alpha="0.2" /></bezel>
+ <bezel element="hl" inputtag="IN.5" inputmask="0x10"><bounds x="53" y="33" width="10" height="10" /><color alpha="0.4" /></bezel>
+ <bezel element="hl" inputtag="IN.6" inputmask="0x10"><bounds x="63" y="33" width="10" height="10" /><color alpha="0.2" /></bezel>
+ <bezel element="hl" inputtag="IN.7" inputmask="0x10"><bounds x="73" y="33" width="10" height="10" /><color alpha="0.4" /></bezel>
+
+ <bezel element="hl" inputtag="IN.0" inputmask="0x08"><bounds x="3" y="43" width="10" height="10" /><color alpha="0.4" /></bezel>
+ <bezel element="hl" inputtag="IN.1" inputmask="0x08"><bounds x="13" y="43" width="10" height="10" /><color alpha="0.2" /></bezel>
+ <bezel element="hl" inputtag="IN.2" inputmask="0x08"><bounds x="23" y="43" width="10" height="10" /><color alpha="0.4" /></bezel>
+ <bezel element="hl" inputtag="IN.3" inputmask="0x08"><bounds x="33" y="43" width="10" height="10" /><color alpha="0.2" /></bezel>
+ <bezel element="hl" inputtag="IN.4" inputmask="0x08"><bounds x="43" y="43" width="10" height="10" /><color alpha="0.4" /></bezel>
+ <bezel element="hl" inputtag="IN.5" inputmask="0x08"><bounds x="53" y="43" width="10" height="10" /><color alpha="0.2" /></bezel>
+ <bezel element="hl" inputtag="IN.6" inputmask="0x08"><bounds x="63" y="43" width="10" height="10" /><color alpha="0.4" /></bezel>
+ <bezel element="hl" inputtag="IN.7" inputmask="0x08"><bounds x="73" y="43" width="10" height="10" /><color alpha="0.2" /></bezel>
+
+ <bezel element="hl" inputtag="IN.0" inputmask="0x04"><bounds x="3" y="53" width="10" height="10" /><color alpha="0.2" /></bezel>
+ <bezel element="hl" inputtag="IN.1" inputmask="0x04"><bounds x="13" y="53" width="10" height="10" /><color alpha="0.4" /></bezel>
+ <bezel element="hl" inputtag="IN.2" inputmask="0x04"><bounds x="23" y="53" width="10" height="10" /><color alpha="0.2" /></bezel>
+ <bezel element="hl" inputtag="IN.3" inputmask="0x04"><bounds x="33" y="53" width="10" height="10" /><color alpha="0.4" /></bezel>
+ <bezel element="hl" inputtag="IN.4" inputmask="0x04"><bounds x="43" y="53" width="10" height="10" /><color alpha="0.2" /></bezel>
+ <bezel element="hl" inputtag="IN.5" inputmask="0x04"><bounds x="53" y="53" width="10" height="10" /><color alpha="0.4" /></bezel>
+ <bezel element="hl" inputtag="IN.6" inputmask="0x04"><bounds x="63" y="53" width="10" height="10" /><color alpha="0.2" /></bezel>
+ <bezel element="hl" inputtag="IN.7" inputmask="0x04"><bounds x="73" y="53" width="10" height="10" /><color alpha="0.4" /></bezel>
+
+ <bezel element="hl" inputtag="IN.0" inputmask="0x02"><bounds x="3" y="63" width="10" height="10" /><color alpha="0.4" /></bezel>
+ <bezel element="hl" inputtag="IN.1" inputmask="0x02"><bounds x="13" y="63" width="10" height="10" /><color alpha="0.2" /></bezel>
+ <bezel element="hl" inputtag="IN.2" inputmask="0x02"><bounds x="23" y="63" width="10" height="10" /><color alpha="0.4" /></bezel>
+ <bezel element="hl" inputtag="IN.3" inputmask="0x02"><bounds x="33" y="63" width="10" height="10" /><color alpha="0.2" /></bezel>
+ <bezel element="hl" inputtag="IN.4" inputmask="0x02"><bounds x="43" y="63" width="10" height="10" /><color alpha="0.4" /></bezel>
+ <bezel element="hl" inputtag="IN.5" inputmask="0x02"><bounds x="53" y="63" width="10" height="10" /><color alpha="0.2" /></bezel>
+ <bezel element="hl" inputtag="IN.6" inputmask="0x02"><bounds x="63" y="63" width="10" height="10" /><color alpha="0.4" /></bezel>
+ <bezel element="hl" inputtag="IN.7" inputmask="0x02"><bounds x="73" y="63" width="10" height="10" /><color alpha="0.2" /></bezel>
+
+ <bezel element="hl" inputtag="IN.0" inputmask="0x01"><bounds x="3" y="73" width="10" height="10" /><color alpha="0.2" /></bezel>
+ <bezel element="hl" inputtag="IN.1" inputmask="0x01"><bounds x="13" y="73" width="10" height="10" /><color alpha="0.4" /></bezel>
+ <bezel element="hl" inputtag="IN.2" inputmask="0x01"><bounds x="23" y="73" width="10" height="10" /><color alpha="0.2" /></bezel>
+ <bezel element="hl" inputtag="IN.3" inputmask="0x01"><bounds x="33" y="73" width="10" height="10" /><color alpha="0.4" /></bezel>
+ <bezel element="hl" inputtag="IN.4" inputmask="0x01"><bounds x="43" y="73" width="10" height="10" /><color alpha="0.2" /></bezel>
+ <bezel element="hl" inputtag="IN.5" inputmask="0x01"><bounds x="53" y="73" width="10" height="10" /><color alpha="0.4" /></bezel>
+ <bezel element="hl" inputtag="IN.6" inputmask="0x01"><bounds x="63" y="73" width="10" height="10" /><color alpha="0.2" /></bezel>
+ <bezel element="hl" inputtag="IN.7" inputmask="0x01"><bounds x="73" y="73" width="10" height="10" /><color alpha="0.4" /></bezel>
+
+ <!-- right side -->
+
+ <bezel element="text_l0"><bounds x="88.6" y="22.65" width="2.5" height="1.5" /></bezel>
+ <bezel element="text_l1"><bounds x="88.6" y="25.65" width="2.5" height="1.5" /></bezel>
+ <bezel element="text_l2"><bounds x="88.6" y="28.65" width="2.5" height="1.5" /></bezel>
+ <bezel element="text_l3"><bounds x="88.6" y="31.65" width="2.5" height="1.5" /></bezel>
+ <bezel element="text_l4"><bounds x="88.6" y="34.65" width="2.5" height="1.5" /></bezel>
+ <bezel element="text_l5"><bounds x="88.6" y="37.65" width="2.5" height="1.5" /></bezel>
+ <bezel element="text_l6"><bounds x="88.6" y="43.15" width="2.5" height="1.5" /></bezel>
+
+ <bezel element="text_r11"><bounds x="92.25" y="22.65" width="3.5" height="1.5" /></bezel>
+ <bezel element="text_r21"><bounds x="92.25" y="25.65" width="3.5" height="1.5" /></bezel>
+ <bezel element="text_r31"><bounds x="92.25" y="28.65" width="3.5" height="1.5" /></bezel>
+ <bezel element="text_r41"><bounds x="92.25" y="31.65" width="3.5" height="1.5" /></bezel>
+ <bezel element="text_r51"><bounds x="92.25" y="34.65" width="3.5" height="1.5" /></bezel>
+ <bezel element="text_r61"><bounds x="92.25" y="37.65" width="3.5" height="1.5" /></bezel>
+ <bezel element="text_r71"><bounds x="92.5" y="43.15" width="3" height="1.5" /></bezel>
+ <bezel element="text_r81"><bounds x="92.5" y="46.15" width="3" height="1.5" /></bezel>
+
+ <bezel element="text_s1"><bounds x="97.8" y="21.15" width="10" height="1.5" /></bezel>
+ <bezel element="text_s2"><bounds x="97.8" y="33.15" width="10" height="1.5" /></bezel>
+ <bezel element="text_s3"><bounds x="97.8" y="36.15" width="10" height="1.5" /></bezel>
+ <bezel element="text_s4"><bounds x="97.8" y="41.65" width="10" height="1.5" /></bezel>
+
+ <bezel element="text_r12"><bounds x="87.5" y="13.15" width="7" height="1.5" /></bezel>
+ <bezel element="text_r22"><bounds x="87.5" y="17.15" width="7" height="1.5" /></bezel>
+
+ <bezel element="text_r32"><bounds x="97.8" y="22.65" width="10" height="1.5" /></bezel>
+ <bezel element="text_r42"><bounds x="97.8" y="25.65" width="10" height="1.5" /></bezel>
+ <bezel element="text_r52"><bounds x="97.8" y="28.65" width="10" height="1.5" /></bezel>
+ <bezel element="text_r62"><bounds x="97.8" y="31.65" width="10" height="1.5" /></bezel>
+ <bezel element="text_r72"><bounds x="97.8" y="34.65" width="10" height="1.5" /></bezel>
+ <bezel element="text_r82"><bounds x="97.8" y="37.65" width="10" height="1.5" /></bezel>
+ <bezel element="text_r92"><bounds x="97.8" y="43.15" width="10" height="1.5" /></bezel>
+ <bezel element="text_ra2"><bounds x="97.8" y="46.15" width="10" height="1.5" /></bezel>
+
+ <bezel element="text_r13"><bounds x="93.5" y="51.65" width="10" height="1.5" /></bezel>
+ <bezel element="text_r23"><bounds x="93.5" y="54.65" width="10" height="1.5" /></bezel>
+ <bezel element="text_r33"><bounds x="93.5" y="60.15" width="10" height="1.5" /></bezel>
+ <bezel element="text_r43"><bounds x="93.5" y="63.15" width="10" height="1.5" /></bezel>
+
+ <bezel name="8.7" element="led2"><bounds x="91" y="22.75" width="1.5" height="1.5" /></bezel>
+ <bezel name="8.6" element="led2"><bounds x="91" y="25.75" width="1.5" height="1.5" /></bezel>
+ <bezel name="8.5" element="led2"><bounds x="91" y="28.75" width="1.5" height="1.5" /></bezel>
+ <bezel name="8.4" element="led2"><bounds x="91" y="31.75" width="1.5" height="1.5" /></bezel>
+ <bezel name="8.3" element="led2"><bounds x="91" y="34.75" width="1.5" height="1.5" /></bezel>
+ <bezel name="8.2" element="led2"><bounds x="91" y="37.75" width="1.5" height="1.5" /></bezel>
+ <bezel name="8.1" element="led2"><bounds x="91" y="43.25" width="1.5" height="1.5" /></bezel>
+ <bezel name="8.0" element="led2"><bounds x="91" y="46.25" width="1.5" height="1.5" /></bezel>
+
+ <bezel name="9.11" element="led2g"><bounds x="91" y="51.75" width="1.5" height="1.5" /></bezel>
+ <bezel name="9.10" element="led2y"><bounds x="91" y="54.75" width="1.5" height="1.5" /></bezel>
+ <bezel name="9.9" element="led2"><bounds x="91" y="60.25" width="1.5" height="1.5" /></bezel>
+ <bezel name="9.8" element="led2"><bounds x="91" y="63.25" width="1.5" height="1.5" /></bezel>
+
+ <bezel element="bt" inputtag="IN.9" inputmask="0x01"><bounds x="95" y="13" width="2" height="2" /></bezel>
+ <bezel element="bt" inputtag="IN.9" inputmask="0x02"><bounds x="95" y="17" width="2" height="2" /></bezel>
+
+ <bezel element="bt" inputtag="IN.8" inputmask="0x80"><bounds x="95" y="22.5" width="2" height="2" /></bezel>
+ <bezel element="bt" inputtag="IN.8" inputmask="0x40"><bounds x="95" y="25.5" width="2" height="2" /></bezel>
+ <bezel element="bt" inputtag="IN.8" inputmask="0x20"><bounds x="95" y="28.5" width="2" height="2" /></bezel>
+ <bezel element="bt" inputtag="IN.8" inputmask="0x10"><bounds x="95" y="31.5" width="2" height="2" /></bezel>
+ <bezel element="bt" inputtag="IN.8" inputmask="0x08"><bounds x="95" y="34.5" width="2" height="2" /></bezel>
+ <bezel element="bt" inputtag="IN.8" inputmask="0x04"><bounds x="95" y="37.5" width="2" height="2" /></bezel>
+ <bezel element="bt" inputtag="IN.8" inputmask="0x02"><bounds x="95" y="43" width="2" height="2" /></bezel>
+ <bezel element="bt" inputtag="IN.8" inputmask="0x01"><bounds x="95" y="46" width="2" height="2" /></bezel>
+
+ </view>
+</mamelayout>
diff --git a/src/mame/layout/baddog.lay b/src/mame/layout/baddog.lay
index 304376161e2..e48b936224f 100644
--- a/src/mame/layout/baddog.lay
+++ b/src/mame/layout/baddog.lay
@@ -52,13 +52,17 @@
</text>
</element>
- <element name="unused3">
+ <element name="BLACK">
<rect state="0">
<color red="1.0" green="1.0" blue="1.0" />
</rect>
<rect state="1">
<color red="0.5" green="0.5" blue="0.5" />
</rect>
+ <text string="BLACK">
+ <color red="0.0" green="0.0" blue="0.0" />
+ <bounds x="0" y="0.1" width="1" height="0.8" />
+ </text>
</element>
<element name="DRAW">
@@ -68,7 +72,7 @@
<rect state="1">
<color red="0.5" green="0.5" blue="0.5" />
</rect>
- <text string="DRAW / BLACK">
+ <text string="DRAW">
<color red="0.0" green="0.0" blue="0.0" />
<bounds x="0" y="0.1" width="1" height="0.8" />
</text>
@@ -321,7 +325,7 @@
<bezel name="lamp4" element="TAKE_WIN" inputtag="P1" inputmask="0x10">
<bounds x="1.51" y="3.28" width="0.31" height="0.24" />
</bezel>
- <bezel name="lamp3" element="unused3" inputtag="P1" inputmask="0x08">
+ <bezel name="lamp3" element="BLACK" inputtag="P1" inputmask="0x08">
<bounds x="1.91" y="3.28" width="0.31" height="0.24" />
</bezel>
<bezel name="lamp2" element="DRAW" inputtag="P1" inputmask="0x04">
@@ -386,7 +390,7 @@
<bezel name="lamp4" element="TAKE_WIN" inputtag="P1" inputmask="0x10">
<bounds x="1.51" y="3.28" width="0.31" height="0.24" />
</bezel>
- <bezel name="lamp3" element="unused3" inputtag="P1" inputmask="0x08">
+ <bezel name="lamp3" element="BLACK" inputtag="P1" inputmask="0x08">
<bounds x="1.91" y="3.28" width="0.31" height="0.24" />
</bezel>
<bezel name="lamp2" element="DRAW" inputtag="P1" inputmask="0x04">
@@ -451,7 +455,7 @@
<bezel name="lamp4" element="TAKE_WIN" inputtag="P1" inputmask="0x10">
<bounds x="1.51" y="3.28" width="0.31" height="0.24" />
</bezel>
- <bezel name="lamp3" element="unused3" inputtag="P1" inputmask="0x08">
+ <bezel name="lamp3" element="BLACK" inputtag="P1" inputmask="0x08">
<bounds x="1.91" y="3.28" width="0.31" height="0.24" />
</bezel>
<bezel name="lamp2" element="DRAW" inputtag="P1" inputmask="0x04">
diff --git a/src/mame/layout/bambball.lay b/src/mame/layout/bambball.lay
new file mode 100644
index 00000000000..2532200e437
--- /dev/null
+++ b/src/mame/layout/bambball.lay
@@ -0,0 +1,67 @@
+<?xml version="1.0"?>
+<mamelayout version="2">
+
+<!-- define elements -->
+
+ <element name="white"><rect><color red="0.85" green="0.85" blue="0.85" /></rect></element>
+ <element name="disk_white"><disk><color red="0.85" green="0.85" blue="0.85" /></disk></element>
+ <element name="disk_black"><disk><color red="0" green="0" blue="0" /></disk></element>
+
+ <element name="text_1"><text string="1"><color red="0.8" green="0.8" blue="0.8" /></text></element>
+ <element name="text_2"><text string="2"><color red="0.8" green="0.8" blue="0.8" /></text></element>
+ <element name="text_3"><text string="3"><color red="0.8" green="0.8" blue="0.8" /></text></element>
+ <element name="text_4"><text string="4"><color red="0.8" green="0.8" blue="0.8" /></text></element>
+ <element name="text_5"><text string="5"><color red="0.8" green="0.8" blue="0.8" /></text></element>
+ <element name="text_6"><text string="6"><color red="0.8" green="0.8" blue="0.8" /></text></element>
+ <element name="text_7"><text string="7"><color red="0.8" green="0.8" blue="0.8" /></text></element>
+ <element name="text_8"><text string="8"><color red="0.8" green="0.8" blue="0.8" /></text></element>
+ <element name="text_9"><text string="9"><color red="0.8" green="0.8" blue="0.8" /></text></element>
+ <element name="text_h"><text string="H"><color red="0.8" green="0.8" blue="0.8" /></text></element>
+ <element name="text_v"><text string="V"><color red="0.8" green="0.8" blue="0.8" /></text></element>
+
+
+<!-- build screen -->
+
+ <view name="Internal Layout">
+ <bounds left="8.3" right="107.6" top="5.8" bottom="37.9" />
+ <screen index="0"><bounds x="10" y="10" width="96" height="23.9" /></screen>
+
+ <!-- baskets (simplified) -->
+
+ <backdrop element="disk_white"><bounds x="9.3" y="13.7" width="5" height="3" /></backdrop>
+ <backdrop element="disk_black"><bounds x="9.6" y="14.0" width="4.4" height="2.4" /></backdrop>
+ <backdrop element="white"><bounds x="8.3" y="14.65" width="1.3" height="0.3" /></backdrop>
+ <backdrop element="white"><bounds x="8.3" y="15.35" width="1.3" height="0.3" /></backdrop>
+
+ <backdrop element="disk_white"><bounds x="101.6" y="13.65" width="5" height="3" /></backdrop>
+ <backdrop element="disk_black"><bounds x="101.9" y="13.95" width="4.4" height="2.4" /></backdrop>
+ <backdrop element="white"><bounds x="106.3" y="14.65" width="1.3" height="0.3" /></backdrop>
+ <backdrop element="white"><bounds x="106.3" y="15.35" width="1.3" height="0.3" /></backdrop>
+
+ <!-- labels -->
+
+ <bezel element="text_1"><bounds x="11.1" y="6.2" width="5" height="3" /></bezel>
+ <bezel element="text_2"><bounds x="22.2" y="6.2" width="5" height="3" /></bezel>
+ <bezel element="text_3"><bounds x="33.3" y="6.2" width="5" height="3" /></bezel>
+ <bezel element="text_4"><bounds x="44.4" y="6.2" width="5" height="3" /></bezel>
+ <bezel element="text_5"><bounds x="55.5" y="6.2" width="5" height="3" /></bezel>
+ <bezel element="text_6"><bounds x="66.6" y="6.2" width="5" height="3" /></bezel>
+ <bezel element="text_7"><bounds x="77.7" y="6.2" width="5" height="3" /></bezel>
+ <bezel element="text_8"><bounds x="88.8" y="6.2" width="5" height="3" /></bezel>
+ <bezel element="text_9"><bounds x="99.9" y="6.2" width="5" height="3" /></bezel>
+
+ <bezel element="text_1"><bounds x="11.1" y="34.5" width="5" height="3" /></bezel>
+ <bezel element="text_2"><bounds x="22.2" y="34.5" width="5" height="3" /></bezel>
+ <bezel element="text_3"><bounds x="33.3" y="34.5" width="5" height="3" /></bezel>
+ <bezel element="text_4"><bounds x="44.4" y="34.5" width="5" height="3" /></bezel>
+ <bezel element="text_5"><bounds x="55.5" y="34.5" width="5" height="3" /></bezel>
+ <bezel element="text_6"><bounds x="66.6" y="34.5" width="5" height="3" /></bezel>
+ <bezel element="text_7"><bounds x="77.7" y="34.5" width="5" height="3" /></bezel>
+ <bezel element="text_8"><bounds x="88.8" y="34.5" width="5" height="3" /></bezel>
+ <bezel element="text_9"><bounds x="99.9" y="34.5" width="5" height="3" /></bezel>
+
+ <bezel element="text_h"><bounds x="7.8" y="6.2" width="5" height="3" /></bezel>
+ <bezel element="text_v"><bounds x="103.1" y="34.5" width="5" height="3" /></bezel>
+
+ </view>
+</mamelayout>
diff --git a/src/mame/layout/borisdpl.lay b/src/mame/layout/borisdpl.lay
deleted file mode 100644
index 2ca7ceae315..00000000000
--- a/src/mame/layout/borisdpl.lay
+++ /dev/null
@@ -1,35 +0,0 @@
-<?xml version="1.0"?>
-<mamelayout version="2">
- <element name="digit" defstate="0">
- <led7seg>
- <color red="0.75" green="0.0" blue="0.0" />
- </led7seg>
- </element>
-
- <view name="Default Layout">
- <bezel name="digit0" element="digit">
- <bounds x="0" y="1" width="25" height="35" />
- </bezel>
- <bezel name="digit1" element="digit">
- <bounds x="37" y="0" width="25" height="35" />
- </bezel>
- <bezel name="digit2" element="digit">
- <bounds x="74" y="0" width="25" height="35" />
- </bezel>
- <bezel name="digit3" element="digit">
- <bounds x="111" y="0" width="25" height="35" />
- </bezel>
- <bezel name="digit4" element="digit">
- <bounds x="148" y="1" width="25" height="35" />
- </bezel>
- <bezel name="digit5" element="digit">
- <bounds x="185" y="0" width="25" height="35" />
- </bezel>
- <bezel name="digit6" element="digit">
- <bounds x="222" y="0" width="25" height="35" />
- </bezel>
- <bezel name="digit7" element="digit">
- <bounds x="259" y="0" width="25" height="35" />
- </bezel>
- </view>
-</mamelayout>
diff --git a/src/mame/layout/cc40.lay b/src/mame/layout/cc40.lay
index 2f97e22b6de..266029af2de 100644
--- a/src/mame/layout/cc40.lay
+++ b/src/mame/layout/cc40.lay
@@ -9,20 +9,20 @@
<element name="ind_left" defstate="0">
<rect><color red="0.5412" green="0.57255" blue="0.5804" /></rect>
- <text string="&#x25c0;" align="1" state="0">
+ <text string="&#x25c4;" align="1" state="0">
<color red="0.515" green="0.537" blue="0.548" />
</text>
- <text string="&#x25c0;" align="1" state="1">
+ <text string="&#x25c4;" align="1" state="1">
<color red="0.361" green="0.326" blue="0.346" />
</text>
</element>
<element name="ind_right" defstate="0">
<rect><color red="0.5412" green="0.57255" blue="0.5804" /></rect>
- <text string="&#x25b6;" align="2" state="0">
+ <text string="&#x25ba;" align="2" state="0">
<color red="0.515" green="0.537" blue="0.548" />
</text>
- <text string="&#x25b6;" align="2" state="1">
+ <text string="&#x25ba;" align="2" state="1">
<color red="0.361" green="0.326" blue="0.346" />
</text>
</element>
@@ -162,11 +162,11 @@
<!-- draw top row of lcd indicators -->
<bezel name="lamp10" element="ind_left">
- <bounds x="1.5" y="2" width="20" height="7" />
+ <bounds x="1.5" y="2.5" width="20" height="5.5" />
</bezel>
<bezel name="lamp4" element="ind_right">
- <bounds x="167.5" y="2" width="20" height="7" />
+ <bounds x="167.5" y="2.5" width="20" height="5.5" />
</bezel>
<bezel name="lamp11" element="ind_shift">
diff --git a/src/mame/layout/chessmst.lay b/src/mame/layout/chessmst.lay
index 6fb7883b80b..77c04215faa 100644
--- a/src/mame/layout/chessmst.lay
+++ b/src/mame/layout/chessmst.lay
@@ -194,12 +194,12 @@
<element name="text_hint"> <rect><color red="1.00" green="0.88" blue="0.55" /></rect> <text string="HINT" align="0"><color red="0.17" green="0.15" blue="0.15" /></text> </element>
<element name="text_white"> <rect><color red="1.00" green="0.88" blue="0.55" /></rect> <text string="WHITE" align="2"><color red="0.17" green="0.15" blue="0.15" /></text> </element>
<element name="text_black"> <rect><color red="1.00" green="0.88" blue="0.55" /></rect> <text string="BLACK" align="2"><color red="0.17" green="0.15" blue="0.15" /></text> </element>
- <element name="text_king" > <rect><color red="1.00" green="0.88" blue="0.55" /></rect> <text string="&#x2654;" align="2"><color red="0.17" green="0.15" blue="0.15" /></text> </element>
- <element name="text_queen" > <rect><color red="1.00" green="0.88" blue="0.55" /></rect> <text string="&#x2655;" align="2"><color red="0.17" green="0.15" blue="0.15" /></text> </element>
- <element name="text_rook" > <rect><color red="1.00" green="0.88" blue="0.55" /></rect> <text string="&#x2656;" align="2"><color red="0.17" green="0.15" blue="0.15" /></text> </element>
- <element name="text_bishop" > <rect><color red="1.00" green="0.88" blue="0.55" /></rect> <text string="&#x2657;" align="2"><color red="0.17" green="0.15" blue="0.15" /></text> </element>
- <element name="text_knight" > <rect><color red="1.00" green="0.88" blue="0.55" /></rect> <text string="&#x2658;" align="2"><color red="0.17" green="0.15" blue="0.15" /></text> </element>
- <element name="text_pawn" > <rect><color red="1.00" green="0.88" blue="0.55" /></rect> <text string="&#x2659;" align="2"><color red="0.17" green="0.15" blue="0.15" /></text> </element>
+ <element name="text_king" > <rect><color red="1.00" green="0.88" blue="0.55" /></rect> <text string="[K]" align="2"><color red="0.17" green="0.15" blue="0.15" /></text> </element>
+ <element name="text_queen" > <rect><color red="1.00" green="0.88" blue="0.55" /></rect> <text string="[Q]" align="2"><color red="0.17" green="0.15" blue="0.15" /></text> </element>
+ <element name="text_rook" > <rect><color red="1.00" green="0.88" blue="0.55" /></rect> <text string="[R]" align="2"><color red="0.17" green="0.15" blue="0.15" /></text> </element>
+ <element name="text_bishop" > <rect><color red="1.00" green="0.88" blue="0.55" /></rect> <text string="[B]" align="2"><color red="0.17" green="0.15" blue="0.15" /></text> </element>
+ <element name="text_knight" > <rect><color red="1.00" green="0.88" blue="0.55" /></rect> <text string="[N]" align="2"><color red="0.17" green="0.15" blue="0.15" /></text> </element>
+ <element name="text_pawn" > <rect><color red="1.00" green="0.88" blue="0.55" /></rect> <text string="[P]" align="2"><color red="0.17" green="0.15" blue="0.15" /></text> </element>
<element name="text_change"> <rect><color red="1.00" green="0.88" blue="0.55" /></rect> <text string="CHANGE" align="1"><color red="0.17" green="0.15" blue="0.15" /></text> </element>
<element name="text_halt"> <rect><color red="1.00" green="0.88" blue="0.55" /></rect> <text string="HALT" align="0"><color red="0.17" green="0.15" blue="0.15" /></text> </element>
<element name="text_reset"> <rect><color red="1.00" green="0.88" blue="0.55" /></rect> <text string="RESET" align="0"><color red="0.17" green="0.15" blue="0.15" /></text> </element>
@@ -208,19 +208,19 @@
<element name="text_cms"> <rect><color red="1.00" green="0.88" blue="0.55" /></rect> <text string="CM'S" align="0"><color red="0.17" green="0.15" blue="0.15" /></text> </element>
<element name="piece" defstate="0">
- <text string="&#x265a;" state="1"><color red="0.27" green="0.25" blue="0.25" /></text>
- <text string="&#x265b;" state="2"><color red="0.27" green="0.25" blue="0.25" /></text>
- <text string="&#x265c;" state="3"><color red="0.27" green="0.25" blue="0.25" /></text>
- <text string="&#x265d;" state="4"><color red="0.27" green="0.25" blue="0.25" /></text>
- <text string="&#x265e;" state="5"><color red="0.27" green="0.25" blue="0.25" /></text>
- <text string="&#x265f;" state="6"><color red="0.27" green="0.25" blue="0.25" /></text>
-
- <text string="&#x265a;" state="7"><color red="0.71" green="0.7" blue="0.69" /></text>
- <text string="&#x265b;" state="8"><color red="0.71" green="0.7" blue="0.69" /></text>
- <text string="&#x265c;" state="9"><color red="0.71" green="0.7" blue="0.69" /></text>
- <text string="&#x265d;" state="10"><color red="0.71" green="0.7" blue="0.69" /></text>
- <text string="&#x265e;" state="11"><color red="0.71" green="0.7" blue="0.69" /></text>
- <text string="&#x265f;" state="12"><color red="0.71" green="0.7" blue="0.69" /></text>
+ <text string="[K]" state="1"><color red="0.27" green="0.25" blue="0.25" /></text>
+ <text string="[Q]" state="2"><color red="0.27" green="0.25" blue="0.25" /></text>
+ <text string="[R]" state="3"><color red="0.27" green="0.25" blue="0.25" /></text>
+ <text string="[B]" state="4"><color red="0.27" green="0.25" blue="0.25" /></text>
+ <text string="[N]" state="5"><color red="0.27" green="0.25" blue="0.25" /></text>
+ <text string="[P]" state="6"><color red="0.27" green="0.25" blue="0.25" /></text>
+
+ <text string="[K]" state="7"><color red="0.71" green="0.7" blue="0.69" /></text>
+ <text string="[Q]" state="8"><color red="0.71" green="0.7" blue="0.69" /></text>
+ <text string="[R]" state="9"><color red="0.71" green="0.7" blue="0.69" /></text>
+ <text string="[B]" state="10"><color red="0.71" green="0.7" blue="0.69" /></text>
+ <text string="[N]" state="11"><color red="0.71" green="0.7" blue="0.69" /></text>
+ <text string="[P]" state="12"><color red="0.71" green="0.7" blue="0.69" /></text>
<!-- selected pieces -->
<disk state="17"> <color red="1.00" green="0.25" blue="1.00" /> </disk>
@@ -236,19 +236,19 @@
<disk state="27"> <color red="1.00" green="0.25" blue="1.00" /> </disk>
<disk state="28"> <color red="1.00" green="0.25" blue="1.00" /> </disk>
- <text string="&#x265a;" state="17"><color red="0.27" green="0.25" blue="0.25" /></text>
- <text string="&#x265b;" state="18"><color red="0.27" green="0.25" blue="0.25" /></text>
- <text string="&#x265c;" state="19"><color red="0.27" green="0.25" blue="0.25" /></text>
- <text string="&#x265d;" state="20"><color red="0.27" green="0.25" blue="0.25" /></text>
- <text string="&#x265e;" state="21"><color red="0.27" green="0.25" blue="0.25" /></text>
- <text string="&#x265f;" state="22"><color red="0.27" green="0.25" blue="0.25" /></text>
-
- <text string="&#x265a;" state="23"><color red="0.71" green="0.7" blue="0.69" /></text>
- <text string="&#x265b;" state="24"><color red="0.71" green="0.7" blue="0.69" /></text>
- <text string="&#x265c;" state="25"><color red="0.71" green="0.7" blue="0.69" /></text>
- <text string="&#x265d;" state="26"><color red="0.71" green="0.7" blue="0.69" /></text>
- <text string="&#x265e;" state="27"><color red="0.71" green="0.7" blue="0.69" /></text>
- <text string="&#x265f;" state="28"><color red="0.71" green="0.7" blue="0.69" /></text>
+ <text string="[K]" state="17"><color red="0.27" green="0.25" blue="0.25" /></text>
+ <text string="[Q]" state="18"><color red="0.27" green="0.25" blue="0.25" /></text>
+ <text string="[R]" state="19"><color red="0.27" green="0.25" blue="0.25" /></text>
+ <text string="[B]" state="20"><color red="0.27" green="0.25" blue="0.25" /></text>
+ <text string="[N]" state="21"><color red="0.27" green="0.25" blue="0.25" /></text>
+ <text string="[P]" state="22"><color red="0.27" green="0.25" blue="0.25" /></text>
+
+ <text string="[K]" state="23"><color red="0.71" green="0.7" blue="0.69" /></text>
+ <text string="[Q]" state="24"><color red="0.71" green="0.7" blue="0.69" /></text>
+ <text string="[R]" state="25"><color red="0.71" green="0.7" blue="0.69" /></text>
+ <text string="[B]" state="26"><color red="0.71" green="0.7" blue="0.69" /></text>
+ <text string="[N]" state="27"><color red="0.71" green="0.7" blue="0.69" /></text>
+ <text string="[P]" state="28"><color red="0.71" green="0.7" blue="0.69" /></text>
</element>
<!-- build screen -->
@@ -558,12 +558,12 @@
<bezel element="text_reset"> <bounds x="92.5" y="82" width="10" height="2" /></bezel>
<bezel element="text_halt"> <bounds x="107.5" y="82" width="8" height="2" /></bezel>
- <bezel element="text_pawn"> <bounds x="95" y="18" width="4" height="4" /></bezel>
- <bezel element="text_knight"> <bounds x="95" y="25" width="4" height="4" /></bezel>
- <bezel element="text_bishop"> <bounds x="95" y="32" width="4" height="4" /></bezel>
- <bezel element="text_rook"> <bounds x="95" y="39" width="4" height="4" /></bezel>
- <bezel element="text_queen"> <bounds x="95" y="46" width="4" height="4" /></bezel>
- <bezel element="text_king"> <bounds x="95" y="53" width="4" height="4" /></bezel>
+ <bezel element="text_pawn"> <bounds x="95" y="18.5" width="4" height="2.6" /></bezel>
+ <bezel element="text_knight"> <bounds x="95" y="25.5" width="4" height="2.6" /></bezel>
+ <bezel element="text_bishop"> <bounds x="95" y="32.5" width="4" height="2.6" /></bezel>
+ <bezel element="text_rook"> <bounds x="95" y="39.5" width="4" height="2.6" /></bezel>
+ <bezel element="text_queen"> <bounds x="95" y="46.5" width="4" height="2.6" /></bezel>
+ <bezel element="text_king"> <bounds x="95" y="53.5" width="4" height="2.6" /></bezel>
<bezel element="text_white"> <bounds x="90" y="61" width="9" height="1.8" /></bezel>
<bezel element="text_black"> <bounds x="90" y="68" width="9" height="1.8" /></bezel>
diff --git a/src/mame/layout/chessmstdm.lay b/src/mame/layout/chessmstdm.lay
index 82ea39b96e5..1a8bb373c8a 100644
--- a/src/mame/layout/chessmstdm.lay
+++ b/src/mame/layout/chessmstdm.lay
@@ -205,19 +205,19 @@
<element name="text_move_back"> <rect><color red="1.00" green="0.88" blue="0.55" /></rect> <text string="MOVE BACK" align="0"><color red="0.17" green="0.15" blue="0.15" /></text> </element>
<element name="piece" defstate="0">
- <text string="&#x265a;" state="1"><color red="0.27" green="0.25" blue="0.25" /></text>
- <text string="&#x265b;" state="2"><color red="0.27" green="0.25" blue="0.25" /></text>
- <text string="&#x265c;" state="3"><color red="0.27" green="0.25" blue="0.25" /></text>
- <text string="&#x265d;" state="4"><color red="0.27" green="0.25" blue="0.25" /></text>
- <text string="&#x265e;" state="5"><color red="0.27" green="0.25" blue="0.25" /></text>
- <text string="&#x265f;" state="6"><color red="0.27" green="0.25" blue="0.25" /></text>
-
- <text string="&#x265a;" state="7"><color red="0.71" green="0.7" blue="0.69" /></text>
- <text string="&#x265b;" state="8"><color red="0.71" green="0.7" blue="0.69" /></text>
- <text string="&#x265c;" state="9"><color red="0.71" green="0.7" blue="0.69" /></text>
- <text string="&#x265d;" state="10"><color red="0.71" green="0.7" blue="0.69" /></text>
- <text string="&#x265e;" state="11"><color red="0.71" green="0.7" blue="0.69" /></text>
- <text string="&#x265f;" state="12"><color red="0.71" green="0.7" blue="0.69" /></text>
+ <text string="[K]" state="1"><color red="0.27" green="0.25" blue="0.25" /></text>
+ <text string="[Q]" state="2"><color red="0.27" green="0.25" blue="0.25" /></text>
+ <text string="[R]" state="3"><color red="0.27" green="0.25" blue="0.25" /></text>
+ <text string="[B]" state="4"><color red="0.27" green="0.25" blue="0.25" /></text>
+ <text string="[N]" state="5"><color red="0.27" green="0.25" blue="0.25" /></text>
+ <text string="[P]" state="6"><color red="0.27" green="0.25" blue="0.25" /></text>
+
+ <text string="[K]" state="7"><color red="0.71" green="0.7" blue="0.69" /></text>
+ <text string="[Q]" state="8"><color red="0.71" green="0.7" blue="0.69" /></text>
+ <text string="[R]" state="9"><color red="0.71" green="0.7" blue="0.69" /></text>
+ <text string="[B]" state="10"><color red="0.71" green="0.7" blue="0.69" /></text>
+ <text string="[N]" state="11"><color red="0.71" green="0.7" blue="0.69" /></text>
+ <text string="[P]" state="12"><color red="0.71" green="0.7" blue="0.69" /></text>
<!-- selected pieces -->
<disk state="17"> <color red="1.00" green="0.25" blue="1.00" /> </disk>
@@ -233,19 +233,19 @@
<disk state="27"> <color red="1.00" green="0.25" blue="1.00" /> </disk>
<disk state="28"> <color red="1.00" green="0.25" blue="1.00" /> </disk>
- <text string="&#x265a;" state="17"><color red="0.27" green="0.25" blue="0.25" /></text>
- <text string="&#x265b;" state="18"><color red="0.27" green="0.25" blue="0.25" /></text>
- <text string="&#x265c;" state="19"><color red="0.27" green="0.25" blue="0.25" /></text>
- <text string="&#x265d;" state="20"><color red="0.27" green="0.25" blue="0.25" /></text>
- <text string="&#x265e;" state="21"><color red="0.27" green="0.25" blue="0.25" /></text>
- <text string="&#x265f;" state="22"><color red="0.27" green="0.25" blue="0.25" /></text>
-
- <text string="&#x265a;" state="23"><color red="0.71" green="0.7" blue="0.69" /></text>
- <text string="&#x265b;" state="24"><color red="0.71" green="0.7" blue="0.69" /></text>
- <text string="&#x265c;" state="25"><color red="0.71" green="0.7" blue="0.69" /></text>
- <text string="&#x265d;" state="26"><color red="0.71" green="0.7" blue="0.69" /></text>
- <text string="&#x265e;" state="27"><color red="0.71" green="0.7" blue="0.69" /></text>
- <text string="&#x265f;" state="28"><color red="0.71" green="0.7" blue="0.69" /></text>
+ <text string="[K]" state="17"><color red="0.27" green="0.25" blue="0.25" /></text>
+ <text string="[Q]" state="18"><color red="0.27" green="0.25" blue="0.25" /></text>
+ <text string="[R]" state="19"><color red="0.27" green="0.25" blue="0.25" /></text>
+ <text string="[B]" state="20"><color red="0.27" green="0.25" blue="0.25" /></text>
+ <text string="[N]" state="21"><color red="0.27" green="0.25" blue="0.25" /></text>
+ <text string="[P]" state="22"><color red="0.27" green="0.25" blue="0.25" /></text>
+
+ <text string="[K]" state="23"><color red="0.71" green="0.7" blue="0.69" /></text>
+ <text string="[Q]" state="24"><color red="0.71" green="0.7" blue="0.69" /></text>
+ <text string="[R]" state="25"><color red="0.71" green="0.7" blue="0.69" /></text>
+ <text string="[B]" state="26"><color red="0.71" green="0.7" blue="0.69" /></text>
+ <text string="[N]" state="27"><color red="0.71" green="0.7" blue="0.69" /></text>
+ <text string="[P]" state="28"><color red="0.71" green="0.7" blue="0.69" /></text>
</element>
<!-- build screen -->
diff --git a/src/mame/layout/chesstrv.lay b/src/mame/layout/chesstrv.lay
index 34e9509d990..2e09672a0a4 100644
--- a/src/mame/layout/chesstrv.lay
+++ b/src/mame/layout/chesstrv.lay
@@ -1,23 +1,117 @@
<?xml version="1.0"?>
<mamelayout version="2">
+
+<!-- define elements -->
+
+ <element name="black"><rect><color red="0.2" green="0.2" blue="0.2" /></rect></element>
+ <element name="white"><rect><color red="0.8" green="0.8" blue="0.8" /></rect></element>
+
+ <element name="button" defstate="0">
+ <rect state="0"><color red="0.8" green="0.8" blue="0.8" /></rect>
+ <rect state="1"><color red="0.6" green="0.6" blue="0.6" /></rect>
+ </element>
+
<element name="digit" defstate="0">
- <led7seg>
- <color red="0.75" green="0.0" blue="0.0" />
- </led7seg>
+ <led7seg><color red="1.0" green="0.1" blue="0.15" /></led7seg>
</element>
- <view name="Default Layout">
- <bezel name="digit0" element="digit">
- <bounds x="0" y="1" width="25" height="35" />
- </bezel>
- <bezel name="digit1" element="digit">
- <bounds x="37" y="0" width="25" height="35" />
- </bezel>
- <bezel name="digit2" element="digit">
- <bounds x="74" y="0" width="25" height="35" />
- </bezel>
- <bezel name="digit3" element="digit">
- <bounds x="111" y="0" width="25" height="35" />
- </bezel>
+ <element name="text_l01a"><text string="A" align="1"><color red="0.8" green="0.8" blue="0.8" /></text></element>
+ <element name="text_l01b"><text string="1" align="2"><color red="0.8" green="0.8" blue="0.8" /></text></element>
+ <element name="text_l01c"><text string="[P]"><color red="0.8" green="0.8" blue="0.8" /></text></element>
+ <element name="text_l02a"><text string="B" align="1"><color red="0.8" green="0.8" blue="0.8" /></text></element>
+ <element name="text_l02b"><text string="2" align="2"><color red="0.8" green="0.8" blue="0.8" /></text></element>
+ <element name="text_l02c"><text string="[N]"><color red="0.8" green="0.8" blue="0.8" /></text></element>
+ <element name="text_l03a"><text string="C" align="1"><color red="0.8" green="0.8" blue="0.8" /></text></element>
+ <element name="text_l03b"><text string="3" align="2"><color red="0.8" green="0.8" blue="0.8" /></text></element>
+ <element name="text_l03c"><text string="[B]"><color red="0.8" green="0.8" blue="0.8" /></text></element>
+ <element name="text_l04a"><text string="D" align="1"><color red="0.8" green="0.8" blue="0.8" /></text></element>
+ <element name="text_l04b"><text string="4" align="2"><color red="0.8" green="0.8" blue="0.8" /></text></element>
+ <element name="text_l04c"><text string="[R]"><color red="0.8" green="0.8" blue="0.8" /></text></element>
+ <element name="text_l05a"><text string="E" align="1"><color red="0.8" green="0.8" blue="0.8" /></text></element>
+ <element name="text_l05b"><text string="5" align="2"><color red="0.8" green="0.8" blue="0.8" /></text></element>
+ <element name="text_l05c"><text string="[Q]"><color red="0.8" green="0.8" blue="0.8" /></text></element>
+ <element name="text_l06a"><text string="F" align="1"><color red="0.8" green="0.8" blue="0.8" /></text></element>
+ <element name="text_l06b"><text string="6" align="2"><color red="0.8" green="0.8" blue="0.8" /></text></element>
+ <element name="text_l06c"><text string="[K]"><color red="0.8" green="0.8" blue="0.8" /></text></element>
+ <element name="text_l07a"><text string="G" align="1"><color red="0.8" green="0.8" blue="0.8" /></text></element>
+ <element name="text_l07b"><text string="7" align="2"><color red="0.8" green="0.8" blue="0.8" /></text></element>
+ <element name="text_l08a"><text string="H" align="1"><color red="0.8" green="0.8" blue="0.8" /></text></element>
+ <element name="text_l08b"><text string="8" align="2"><color red="0.8" green="0.8" blue="0.8" /></text></element>
+
+ <element name="text_l09"><text string="LV / CS"><color red="0.8" green="0.8" blue="0.8" /></text></element>
+ <element name="text_l10"><text string="FP"><color red="0.8" green="0.8" blue="0.8" /></text></element>
+ <element name="text_l11"><text string="EP"><color red="0.8" green="0.8" blue="0.8" /></text></element>
+ <element name="text_l12"><text string="MM"><color red="0.8" green="0.8" blue="0.8" /></text></element>
+ <element name="text_l13"><text string="CB"><color red="0.8" green="0.8" blue="0.8" /></text></element>
+ <element name="text_l14"><text string="CE"><color red="0.8" green="0.8" blue="0.8" /></text></element>
+ <element name="text_l15"><text string="ENTER"><color red="0.8" green="0.8" blue="0.8" /></text></element>
+
+
+<!-- build screen -->
+
+ <view name="Internal Layout">
+ <bounds left="-1" right="32" top="20" bottom="39.3" />
+
+ <bezel name="digit0" element="digit"><bounds x="8" y="21" width="3.4" height="5.1" /></bezel>
+ <bezel name="digit1" element="digit"><bounds x="11.4" y="21" width="3.4" height="5.1" /></bezel>
+ <bezel name="digit2" element="digit"><bounds x="16.2" y="21" width="3.4" height="5.1" /></bezel>
+ <bezel name="digit3" element="digit"><bounds x="19.6" y="21" width="3.4" height="5.1" /></bezel>
+
+ <bezel element="black"><bounds x="-1" y="27.2" width="33" height="0.5" /></bezel>
+
+ <!-- button panel -->
+
+ <bezel element="button" inputtag="LINE1" inputmask="0x01"><bounds x="0" y="30" width="3" height="2.2" /></bezel>
+ <bezel element="button" inputtag="LINE1" inputmask="0x02"><bounds x="4" y="30" width="3" height="2.2" /></bezel>
+ <bezel element="button" inputtag="LINE1" inputmask="0x04"><bounds x="8" y="30" width="3" height="2.2" /></bezel>
+ <bezel element="button" inputtag="LINE1" inputmask="0x08"><bounds x="12" y="30" width="3" height="2.2" /></bezel>
+ <bezel element="button" inputtag="LINE2" inputmask="0x01"><bounds x="16" y="30" width="3" height="2.2" /></bezel>
+ <bezel element="button" inputtag="LINE2" inputmask="0x02"><bounds x="20" y="30" width="3" height="2.2" /></bezel>
+ <bezel element="button" inputtag="LINE2" inputmask="0x04"><bounds x="24" y="30" width="3" height="2.2" /></bezel>
+ <bezel element="button" inputtag="LINE2" inputmask="0x08"><bounds x="28" y="30" width="3" height="2.2" /></bezel>
+
+ <bezel element="button" inputtag="LINE3" inputmask="0x01"><bounds x="0" y="35" width="3" height="2.2" /></bezel>
+ <bezel element="button" inputtag="LINE3" inputmask="0x02"><bounds x="4" y="35" width="3" height="2.2" /></bezel>
+ <bezel element="button" inputtag="LINE3" inputmask="0x04"><bounds x="8" y="35" width="3" height="2.2" /></bezel>
+ <bezel element="button" inputtag="LINE4" inputmask="0x04"><bounds x="12" y="35" width="3" height="2.2" /></bezel>
+ <bezel element="button" inputtag="LINE3" inputmask="0x08"><bounds x="16" y="35" width="3" height="2.2" /></bezel>
+ <bezel element="button" inputtag="LINE4" inputmask="0x01"><bounds x="20" y="35" width="3" height="2.2" /></bezel>
+ <bezel element="button" inputtag="LINE4" inputmask="0x02"><bounds x="26" y="35" width="3" height="2.2" /></bezel>
+
+ <bezel element="text_l01a"><bounds x="0.3" y="28.5" width="2.4" height="1.3" /></bezel>
+ <bezel element="text_l01b"><bounds x="0.3" y="28.5" width="2.4" height="1.3" /></bezel>
+ <bezel element="text_l02a"><bounds x="4.3" y="28.5" width="2.4" height="1.3" /></bezel>
+ <bezel element="text_l02b"><bounds x="4.3" y="28.5" width="2.4" height="1.3" /></bezel>
+ <bezel element="text_l03a"><bounds x="8.3" y="28.5" width="2.4" height="1.3" /></bezel>
+ <bezel element="text_l03b"><bounds x="8.3" y="28.5" width="2.4" height="1.3" /></bezel>
+ <bezel element="text_l04a"><bounds x="12.3" y="28.5" width="2.4" height="1.3" /></bezel>
+ <bezel element="text_l04b"><bounds x="12.3" y="28.5" width="2.4" height="1.3" /></bezel>
+ <bezel element="text_l05a"><bounds x="16.3" y="28.5" width="2.4" height="1.3" /></bezel>
+ <bezel element="text_l05b"><bounds x="16.3" y="28.5" width="2.4" height="1.3" /></bezel>
+ <bezel element="text_l06a"><bounds x="20.3" y="28.5" width="2.4" height="1.3" /></bezel>
+ <bezel element="text_l06b"><bounds x="20.3" y="28.5" width="2.4" height="1.3" /></bezel>
+ <bezel element="text_l07a"><bounds x="24.3" y="28.5" width="2.4" height="1.3" /></bezel>
+ <bezel element="text_l07b"><bounds x="24.3" y="28.5" width="2.4" height="1.3" /></bezel>
+ <bezel element="text_l08a"><bounds x="28.3" y="28.5" width="2.4" height="1.3" /></bezel>
+ <bezel element="text_l08b"><bounds x="28.3" y="28.5" width="2.4" height="1.3" /></bezel>
+
+ <bezel element="text_l01c"><bounds x="0" y="32.3" width="3" height="1.3" /></bezel>
+ <bezel element="text_l02c"><bounds x="4" y="32.3" width="3" height="1.3" /></bezel>
+ <bezel element="text_l03c"><bounds x="8" y="32.3" width="3" height="1.3" /></bezel>
+ <bezel element="text_l04c"><bounds x="12" y="32.3" width="3" height="1.3" /></bezel>
+ <bezel element="text_l05c"><bounds x="16" y="32.3" width="3" height="1.3" /></bezel>
+ <bezel element="text_l06c"><bounds x="20" y="32.3" width="3" height="1.3" /></bezel>
+
+ <bezel element="white"><bounds x="25" y="32.55" width="1" height="1" /></bezel>
+ <bezel element="black"><bounds x="29" y="32.55" width="1" height="1" /></bezel>
+
+ <bezel element="text_l09"><bounds x="-1" y="37.3" width="5" height="1.3" /></bezel>
+ <bezel element="text_l10"><bounds x="3" y="37.3" width="5" height="1.3" /></bezel>
+ <bezel element="text_l11"><bounds x="7" y="37.3" width="5" height="1.3" /></bezel>
+ <bezel element="text_l12"><bounds x="11" y="37.3" width="5" height="1.3" /></bezel>
+ <bezel element="text_l13"><bounds x="15" y="37.3" width="5" height="1.3" /></bezel>
+ <bezel element="text_l14"><bounds x="19" y="37.3" width="5" height="1.3" /></bezel>
+ <bezel element="text_l15"><bounds x="25" y="37.3" width="5" height="1.3" /></bezel>
+
</view>
</mamelayout>
diff --git a/src/mame/layout/ck_master.lay b/src/mame/layout/ck_master.lay
index 1b16de82f8a..0801c5a1f9b 100644
--- a/src/mame/layout/ck_master.lay
+++ b/src/mame/layout/ck_master.lay
@@ -67,27 +67,27 @@
<element name="text_king">
<rect><color red="0.81" green="0.8" blue="0.79" /></rect>
- <text string="&#x2654;"><color red="0.17" green="0.15" blue="0.15" /></text>
+ <text string="[K]"><color red="0.17" green="0.15" blue="0.15" /></text>
</element>
<element name="text_queen">
<rect><color red="0.81" green="0.8" blue="0.79" /></rect>
- <text string="&#x2655;"><color red="0.17" green="0.15" blue="0.15" /></text>
+ <text string="[Q]"><color red="0.17" green="0.15" blue="0.15" /></text>
</element>
<element name="text_rook">
<rect><color red="0.81" green="0.8" blue="0.79" /></rect>
- <text string="&#x2656;"><color red="0.17" green="0.15" blue="0.15" /></text>
+ <text string="[R]"><color red="0.17" green="0.15" blue="0.15" /></text>
</element>
<element name="text_bishop">
<rect><color red="0.81" green="0.8" blue="0.79" /></rect>
- <text string="&#x2657;"><color red="0.17" green="0.15" blue="0.15" /></text>
+ <text string="[B]"><color red="0.17" green="0.15" blue="0.15" /></text>
</element>
<element name="text_knight">
<rect><color red="0.81" green="0.8" blue="0.79" /></rect>
- <text string="&#x2658;"><color red="0.17" green="0.15" blue="0.15" /></text>
+ <text string="[N]"><color red="0.17" green="0.15" blue="0.15" /></text>
</element>
<element name="text_pawn">
<rect><color red="0.81" green="0.8" blue="0.79" /></rect>
- <text string="&#x2659;"><color red="0.17" green="0.15" blue="0.15" /></text>
+ <text string="[P]"><color red="0.17" green="0.15" blue="0.15" /></text>
</element>
@@ -284,12 +284,12 @@
<bezel element="text_l14"><bounds x="91.4" y="74.250" width="12.5" height="1.5" /></bezel>
<bezel element="text_l15"><bounds x="91.4" y="79.583" width="12.5" height="1.5" /></bezel>
- <bezel element="text_king"><bounds x="91.4" y="24.500" width="12.5" height="5" /></bezel>
- <bezel element="text_queen"><bounds x="91.4" y="29.833" width="12.5" height="5" /></bezel>
- <bezel element="text_rook"><bounds x="91.4" y="35.166" width="12.5" height="5" /></bezel>
- <bezel element="text_bishop"><bounds x="91.4" y="40.500" width="12.5" height="5" /></bezel>
- <bezel element="text_knight"><bounds x="91.4" y="45.833" width="12.5" height="5" /></bezel>
- <bezel element="text_pawn"><bounds x="91.4" y="51.166" width="12.5" height="5" /></bezel>
+ <bezel element="text_king"><bounds x="91.4" y="25.200" width="12.5" height="3" /></bezel>
+ <bezel element="text_queen"><bounds x="91.4" y="30.533" width="12.5" height="3" /></bezel>
+ <bezel element="text_rook"><bounds x="91.4" y="35.866" width="12.5" height="3" /></bezel>
+ <bezel element="text_bishop"><bounds x="91.4" y="41.200" width="12.5" height="3" /></bezel>
+ <bezel element="text_knight"><bounds x="91.4" y="46.533" width="12.5" height="3" /></bezel>
+ <bezel element="text_pawn"><bounds x="91.4" y="51.866" width="12.5" height="3" /></bezel>
<bezel element="black"><bounds x="96.25" y="57.75" width="2.5" height="2.5" /></bezel>
<bezel element="white"><bounds x="96.5" y="58" width="2.0" height="2.0" /></bezel>
diff --git a/src/mame/layout/cmpchess.lay b/src/mame/layout/cmpchess.lay
new file mode 100644
index 00000000000..3cd4abb44ec
--- /dev/null
+++ b/src/mame/layout/cmpchess.lay
@@ -0,0 +1,265 @@
+<?xml version="1.0"?>
+<mamelayout version="2">
+
+<!-- define elements -->
+
+ <element name="black"><rect><color red="0.12" green="0.12" blue="0.12" /></rect></element>
+ <element name="black2"><rect><color red="0.16" green="0.16" blue="0.16" /></rect></element>
+ <element name="white1"><rect><color red="0.8" green="0.8" blue="0.8" /></rect></element>
+ <element name="white2"><rect><color red="0.82" green="0.82" blue="0.62" /></rect></element>
+
+ <element name="digit" defstate="0">
+ <led7seg><color red="1.0" green="0.1" blue="0.15" /></led7seg>
+ </element>
+
+ <element name="hl" defstate="0">
+ <text string=" ">
+ <bounds x="0.0" y="0.0" width="1.0" height="1.0" />
+ <color red="0.0" green="0.0" blue="0.0" />
+ </text>
+ <rect state="1">
+ <bounds x="0.0" y="0.0" width="1.0" height="1.0" />
+ <color red="0.0" green="0.0" blue="0.0" />
+ </rect>
+ </element>
+
+ <element name="reset" defstate="0">
+ <text string=" ">
+ <bounds x="0.0" y="0.0" width="1.8" height="3.7" />
+ <color red="0.0" green="0.0" blue="0.0" />
+ </text>
+ <disk state="0">
+ <bounds x="0.0" y="0.0" width="1.8" height="1.8" />
+ <color red="0.4" green="0.4" blue="0.4" />
+ </disk>
+ <disk state="1">
+ <bounds x="0.0" y="1.9" width="1.8" height="1.8" />
+ <color red="0.4" green="0.4" blue="0.4" />
+ </disk>
+ </element>
+
+ <element name="text_r1"><text string="RUN"><color red="0.3" green="0.3" blue="0.3" /></text></element>
+ <element name="text_r2"><text string="RESET"><color red="0.3" green="0.3" blue="0.3" /></text></element>
+
+ <element name="text_b01a">
+ <rect><color red="0.8" green="0.8" blue="0.8" /></rect>
+ <text string="A"><color red="0.1" green="0.1" blue="0.1" /></text>
+ </element>
+ <element name="text_b01b">
+ <rect><color red="0.8" green="0.8" blue="0.8" /></rect>
+ <text string="wk"><color red="0.1" green="0.1" blue="0.1" /></text>
+ </element>
+ <element name="text_b02a">
+ <rect><color red="0.8" green="0.8" blue="0.8" /></rect>
+ <text string="B"><color red="0.1" green="0.1" blue="0.1" /></text>
+ </element>
+ <element name="text_b02b">
+ <rect><color red="0.8" green="0.8" blue="0.8" /></rect>
+ <text string="wq"><color red="0.1" green="0.1" blue="0.1" /></text>
+ </element>
+ <element name="text_b03a">
+ <rect><color red="0.8" green="0.8" blue="0.8" /></rect>
+ <text string="C"><color red="0.1" green="0.1" blue="0.1" /></text>
+ </element>
+ <element name="text_b03b">
+ <rect><color red="0.8" green="0.8" blue="0.8" /></rect>
+ <text string="wb"><color red="0.1" green="0.1" blue="0.1" /></text>
+ </element>
+ <element name="text_b05a">
+ <rect><color red="0.8" green="0.8" blue="0.8" /></rect>
+ <text string="E"><color red="0.1" green="0.1" blue="0.1" /></text>
+ </element>
+ <element name="text_b05b">
+ <rect><color red="0.8" green="0.8" blue="0.8" /></rect>
+ <text string="wn"><color red="0.1" green="0.1" blue="0.1" /></text>
+ </element>
+ <element name="text_b06a">
+ <rect><color red="0.8" green="0.8" blue="0.8" /></rect>
+ <text string="F"><color red="0.1" green="0.1" blue="0.1" /></text>
+ </element>
+ <element name="text_b06b">
+ <rect><color red="0.8" green="0.8" blue="0.8" /></rect>
+ <text string="wr"><color red="0.1" green="0.1" blue="0.1" /></text>
+ </element>
+ <element name="text_b07a">
+ <rect><color red="0.8" green="0.8" blue="0.8" /></rect>
+ <text string="G"><color red="0.1" green="0.1" blue="0.1" /></text>
+ </element>
+ <element name="text_b07b">
+ <rect><color red="0.8" green="0.8" blue="0.8" /></rect>
+ <text string="wp"><color red="0.1" green="0.1" blue="0.1" /></text>
+ </element>
+ <element name="text_b09a">
+ <rect><color red="0.8" green="0.8" blue="0.8" /></rect>
+ <text string="1"><color red="0.1" green="0.1" blue="0.1" /></text>
+ </element>
+ <element name="text_b09b">
+ <rect><color red="0.8" green="0.8" blue="0.8" /></rect>
+ <text string="bk"><color red="0.1" green="0.1" blue="0.1" /></text>
+ </element>
+ <element name="text_b10a">
+ <rect><color red="0.8" green="0.8" blue="0.8" /></rect>
+ <text string="2"><color red="0.1" green="0.1" blue="0.1" /></text>
+ </element>
+ <element name="text_b10b">
+ <rect><color red="0.8" green="0.8" blue="0.8" /></rect>
+ <text string="bq"><color red="0.1" green="0.1" blue="0.1" /></text>
+ </element>
+ <element name="text_b11a">
+ <rect><color red="0.8" green="0.8" blue="0.8" /></rect>
+ <text string="3"><color red="0.1" green="0.1" blue="0.1" /></text>
+ </element>
+ <element name="text_b11b">
+ <rect><color red="0.8" green="0.8" blue="0.8" /></rect>
+ <text string="bb"><color red="0.1" green="0.1" blue="0.1" /></text>
+ </element>
+ <element name="text_b13a">
+ <rect><color red="0.8" green="0.8" blue="0.8" /></rect>
+ <text string="5"><color red="0.1" green="0.1" blue="0.1" /></text>
+ </element>
+ <element name="text_b13b">
+ <rect><color red="0.8" green="0.8" blue="0.8" /></rect>
+ <text string="bn"><color red="0.1" green="0.1" blue="0.1" /></text>
+ </element>
+ <element name="text_b14a">
+ <rect><color red="0.8" green="0.8" blue="0.8" /></rect>
+ <text string="6"><color red="0.1" green="0.1" blue="0.1" /></text>
+ </element>
+ <element name="text_b14b">
+ <rect><color red="0.8" green="0.8" blue="0.8" /></rect>
+ <text string="br"><color red="0.1" green="0.1" blue="0.1" /></text>
+ </element>
+ <element name="text_b15a">
+ <rect><color red="0.8" green="0.8" blue="0.8" /></rect>
+ <text string="7"><color red="0.1" green="0.1" blue="0.1" /></text>
+ </element>
+ <element name="text_b15b">
+ <rect><color red="0.8" green="0.8" blue="0.8" /></rect>
+ <text string="bp"><color red="0.1" green="0.1" blue="0.1" /></text>
+ </element>
+
+ <element name="text_b04a">
+ <rect><color red="0.82" green="0.82" blue="0.62" /></rect>
+ <text string="D"><color red="0.1" green="0.1" blue="0.1" /></text>
+ </element>
+ <element name="text_b04b">
+ <rect><color red="0.82" green="0.82" blue="0.62" /></rect>
+ <text string="play"><color red="0.1" green="0.1" blue="0.1" /></text>
+ </element>
+ <element name="text_b08a">
+ <rect><color red="0.82" green="0.82" blue="0.62" /></rect>
+ <text string="H"><color red="0.1" green="0.1" blue="0.1" /></text>
+ </element>
+ <element name="text_b08b">
+ <rect><color red="0.82" green="0.82" blue="0.62" /></rect>
+ <text string="md"><color red="0.1" green="0.1" blue="0.1" /></text>
+ </element>
+ <element name="text_b12a">
+ <rect><color red="0.82" green="0.82" blue="0.62" /></rect>
+ <text string="4"><color red="0.1" green="0.1" blue="0.1" /></text>
+ </element>
+ <element name="text_b12b">
+ <rect><color red="0.82" green="0.82" blue="0.62" /></rect>
+ <text string="fp"><color red="0.1" green="0.1" blue="0.1" /></text>
+ </element>
+ <element name="text_b16a">
+ <rect><color red="0.82" green="0.82" blue="0.62" /></rect>
+ <text string="8"><color red="0.1" green="0.1" blue="0.1" /></text>
+ </element>
+ <element name="text_b16b">
+ <rect><color red="0.82" green="0.82" blue="0.62" /></rect>
+ <text string="ep"><color red="0.1" green="0.1" blue="0.1" /></text>
+ </element>
+
+
+<!-- build screen -->
+
+ <view name="Internal Layout">
+ <bounds left="8.5" right="56.5" top="11.5" bottom="76.5" />
+
+ <bezel element="black2"><bounds x="8.5" y="26" width="48" height="1" /></bezel>
+
+ <bezel name="digit0" element="digit"><bounds x="19" y="13" width="6.75" height="10.125" /></bezel>
+ <bezel name="digit1" element="digit"><bounds x="25.75" y="13" width="6.75" height="10.125" /></bezel>
+ <bezel name="digit2" element="digit"><bounds x="32.5" y="13" width="6.75" height="10.125" /></bezel>
+ <bezel name="digit3" element="digit"><bounds x="39.25" y="13" width="6.75" height="10.125" /></bezel>
+
+ <bezel element="black"><bounds x="12.5" y="16.5" width="1.4" height="3.5" /></bezel>
+ <bezel element="text_r1"><bounds x="10.5" y="14" width="5.4" height="2" /></bezel>
+ <bezel element="text_r2"><bounds x="10.5" y="20.5" width="5.4" height="2" /></bezel>
+ <bezel element="reset" inputtag="RESET" inputmask="0x01"><bounds x="12.3" y="16.4" width="1.8" height="3.7" /></bezel>
+
+ <!-- button panel -->
+
+ <bezel element="white1"><bounds x="10" y="30" width="9" height="9" /></bezel>
+ <bezel element="white1"><bounds x="22" y="30" width="9" height="9" /></bezel>
+ <bezel element="white1"><bounds x="34" y="30" width="9" height="9" /></bezel>
+ <bezel element="white2"><bounds x="46" y="30" width="9" height="9" /></bezel>
+ <bezel element="white1"><bounds x="10" y="42" width="9" height="9" /></bezel>
+ <bezel element="white1"><bounds x="22" y="42" width="9" height="9" /></bezel>
+ <bezel element="white1"><bounds x="34" y="42" width="9" height="9" /></bezel>
+ <bezel element="white2"><bounds x="46" y="42" width="9" height="9" /></bezel>
+ <bezel element="white1"><bounds x="10" y="54" width="9" height="9" /></bezel>
+ <bezel element="white1"><bounds x="22" y="54" width="9" height="9" /></bezel>
+ <bezel element="white1"><bounds x="34" y="54" width="9" height="9" /></bezel>
+ <bezel element="white2"><bounds x="46" y="54" width="9" height="9" /></bezel>
+ <bezel element="white1"><bounds x="10" y="66" width="9" height="9" /></bezel>
+ <bezel element="white1"><bounds x="22" y="66" width="9" height="9" /></bezel>
+ <bezel element="white1"><bounds x="34" y="66" width="9" height="9" /></bezel>
+ <bezel element="white2"><bounds x="46" y="66" width="9" height="9" /></bezel>
+
+ <bezel element="text_b01a"><bounds x="10.1" y="30.5" width="8.8" height="5" /></bezel>
+ <bezel element="text_b01b"><bounds x="10.1" y="35.3" width="8.8" height="3" /></bezel>
+ <bezel element="text_b02a"><bounds x="22.1" y="30.5" width="8.8" height="5" /></bezel>
+ <bezel element="text_b02b"><bounds x="22.1" y="35.3" width="8.8" height="3" /></bezel>
+ <bezel element="text_b03a"><bounds x="34.1" y="30.5" width="8.8" height="5" /></bezel>
+ <bezel element="text_b03b"><bounds x="34.1" y="35.3" width="8.8" height="3" /></bezel>
+ <bezel element="text_b04a"><bounds x="46.1" y="30.5" width="8.8" height="5" /></bezel>
+ <bezel element="text_b04b"><bounds x="46.1" y="35.3" width="8.8" height="3" /></bezel>
+
+ <bezel element="text_b05a"><bounds x="10.1" y="42.5" width="8.8" height="5" /></bezel>
+ <bezel element="text_b05b"><bounds x="10.1" y="47.3" width="8.8" height="3" /></bezel>
+ <bezel element="text_b06a"><bounds x="22.1" y="42.5" width="8.8" height="5" /></bezel>
+ <bezel element="text_b06b"><bounds x="22.1" y="47.3" width="8.8" height="3" /></bezel>
+ <bezel element="text_b07a"><bounds x="34.1" y="42.5" width="8.8" height="5" /></bezel>
+ <bezel element="text_b07b"><bounds x="34.1" y="47.3" width="8.8" height="3" /></bezel>
+ <bezel element="text_b08a"><bounds x="46.1" y="42.5" width="8.8" height="5" /></bezel>
+ <bezel element="text_b08b"><bounds x="46.1" y="47.3" width="8.8" height="3" /></bezel>
+
+ <bezel element="text_b09a"><bounds x="10.1" y="54.5" width="8.8" height="5" /></bezel>
+ <bezel element="text_b09b"><bounds x="10.1" y="59.3" width="8.8" height="3" /></bezel>
+ <bezel element="text_b10a"><bounds x="22.1" y="54.5" width="8.8" height="5" /></bezel>
+ <bezel element="text_b10b"><bounds x="22.1" y="59.3" width="8.8" height="3" /></bezel>
+ <bezel element="text_b11a"><bounds x="34.1" y="54.5" width="8.8" height="5" /></bezel>
+ <bezel element="text_b11b"><bounds x="34.1" y="59.3" width="8.8" height="3" /></bezel>
+ <bezel element="text_b12a"><bounds x="46.1" y="54.5" width="8.8" height="5" /></bezel>
+ <bezel element="text_b12b"><bounds x="46.1" y="59.3" width="8.8" height="3" /></bezel>
+
+ <bezel element="text_b13a"><bounds x="10.1" y="66.5" width="8.8" height="5" /></bezel>
+ <bezel element="text_b13b"><bounds x="10.1" y="71.3" width="8.8" height="3" /></bezel>
+ <bezel element="text_b14a"><bounds x="22.1" y="66.5" width="8.8" height="5" /></bezel>
+ <bezel element="text_b14b"><bounds x="22.1" y="71.3" width="8.8" height="3" /></bezel>
+ <bezel element="text_b15a"><bounds x="34.1" y="66.5" width="8.8" height="5" /></bezel>
+ <bezel element="text_b15b"><bounds x="34.1" y="71.3" width="8.8" height="3" /></bezel>
+ <bezel element="text_b16a"><bounds x="46.1" y="66.5" width="8.8" height="5" /></bezel>
+ <bezel element="text_b16b"><bounds x="46.1" y="71.3" width="8.8" height="3" /></bezel>
+
+ <bezel element="hl" inputtag="LINE1" inputmask="0x80"><bounds x="10" y="30" width="9" height="9" /><color alpha="0.2" /></bezel>
+ <bezel element="hl" inputtag="LINE1" inputmask="0x40"><bounds x="22" y="30" width="9" height="9" /><color alpha="0.2" /></bezel>
+ <bezel element="hl" inputtag="LINE1" inputmask="0x20"><bounds x="34" y="30" width="9" height="9" /><color alpha="0.2" /></bezel>
+ <bezel element="hl" inputtag="LINE1" inputmask="0x10"><bounds x="46" y="30" width="9" height="9" /><color alpha="0.2" /></bezel>
+ <bezel element="hl" inputtag="LINE2" inputmask="0x80"><bounds x="10" y="42" width="9" height="9" /><color alpha="0.2" /></bezel>
+ <bezel element="hl" inputtag="LINE2" inputmask="0x40"><bounds x="22" y="42" width="9" height="9" /><color alpha="0.2" /></bezel>
+ <bezel element="hl" inputtag="LINE2" inputmask="0x20"><bounds x="34" y="42" width="9" height="9" /><color alpha="0.2" /></bezel>
+ <bezel element="hl" inputtag="LINE2" inputmask="0x10"><bounds x="46" y="42" width="9" height="9" /><color alpha="0.2" /></bezel>
+ <bezel element="hl" inputtag="LINE3" inputmask="0x80"><bounds x="10" y="54" width="9" height="9" /><color alpha="0.2" /></bezel>
+ <bezel element="hl" inputtag="LINE3" inputmask="0x40"><bounds x="22" y="54" width="9" height="9" /><color alpha="0.2" /></bezel>
+ <bezel element="hl" inputtag="LINE3" inputmask="0x20"><bounds x="34" y="54" width="9" height="9" /><color alpha="0.2" /></bezel>
+ <bezel element="hl" inputtag="LINE3" inputmask="0x10"><bounds x="46" y="54" width="9" height="9" /><color alpha="0.2" /></bezel>
+ <bezel element="hl" inputtag="LINE4" inputmask="0x80"><bounds x="10" y="66" width="9" height="9" /><color alpha="0.2" /></bezel>
+ <bezel element="hl" inputtag="LINE4" inputmask="0x40"><bounds x="22" y="66" width="9" height="9" /><color alpha="0.2" /></bezel>
+ <bezel element="hl" inputtag="LINE4" inputmask="0x20"><bounds x="34" y="66" width="9" height="9" /><color alpha="0.2" /></bezel>
+ <bezel element="hl" inputtag="LINE4" inputmask="0x10"><bounds x="46" y="66" width="9" height="9" /><color alpha="0.2" /></bezel>
+
+ </view>
+</mamelayout>
diff --git a/src/mame/layout/ctstein.lay b/src/mame/layout/ctstein.lay
index d86f5caa719..a38d1f9bcfe 100644
--- a/src/mame/layout/ctstein.lay
+++ b/src/mame/layout/ctstein.lay
@@ -3,6 +3,7 @@
<!-- define elements -->
+ <element name="static_black"><rect><color red="0" green="0" blue="0" /></rect></element>
<element name="static_white"><rect><color red="0.75" green="0.73" blue="0.7" /></rect></element>
<element name="static_white2"><rect><color red="0.6" green="0.59" blue="0.57" /></rect></element>
@@ -22,6 +23,43 @@
<rect><color red="0.6" green="0.59" blue="0.57" /></rect>
<text string="GAME"><color red="0.0" green="0.0" blue="0.0" /></text>
</element>
+ <element name="text_dif">
+ <rect><color red="0.6" green="0.59" blue="0.57" /></rect>
+ <text string="DIFFICULTY"><color red="0.0" green="0.0" blue="0.0" /></text>
+ </element>
+ <element name="text_1">
+ <rect><color red="0.6" green="0.59" blue="0.57" /></rect>
+ <text string="1"><color red="0.0" green="0.0" blue="0.0" /></text>
+ </element>
+ <element name="text_2">
+ <rect><color red="0.6" green="0.59" blue="0.57" /></rect>
+ <text string="2"><color red="0.0" green="0.0" blue="0.0" /></text>
+ </element>
+ <element name="text_3">
+ <rect><color red="0.6" green="0.59" blue="0.57" /></rect>
+ <text string="3"><color red="0.0" green="0.0" blue="0.0" /></text>
+ </element>
+ <element name="text_4">
+ <rect><color red="0.6" green="0.59" blue="0.57" /></rect>
+ <text string="4"><color red="0.0" green="0.0" blue="0.0" /></text>
+ </element>
+
+ <element name="switch1" defstate="0">
+ <text string=" "><color red="0" green="0" blue="0" /></text>
+ <disk state="0x0e"><color red="0.4" green="0.4" blue="0.4" /></disk>
+ </element>
+ <element name="switch2" defstate="0">
+ <text string=" "><color red="0" green="0" blue="0" /></text>
+ <disk state="0x0d"><color red="0.4" green="0.4" blue="0.4" /></disk>
+ </element>
+ <element name="switch3" defstate="0">
+ <text string=" "><color red="0" green="0" blue="0" /></text>
+ <disk state="0x0b"><color red="0.4" green="0.4" blue="0.4" /></disk>
+ </element>
+ <element name="switch4" defstate="0">
+ <text string=" "><color red="0" green="0" blue="0" /></text>
+ <disk state="0x07"><color red="0.4" green="0.4" blue="0.4" /></disk>
+ </element>
<element name="lamp_r" defstate="0">
<rect state="0"><color red="0.5" green="0.15" blue="0.1" /></rect>
@@ -95,5 +133,16 @@
<bezel element="text_game"><bounds x="25.8" y="18.5" width="3" height="0.75" /></bezel>
<bezel element="button_r" inputtag="IN.1" inputmask="0x01"><bounds x="24" y="18" width="2" height="2" /></bezel>
+ <bezel element="text_dif"><bounds x="21.2" y="6.6" width="7.6" height="0.75" /></bezel>
+ <bezel element="static_black"><bounds x="23.5" y="7.5" width="3.0" height="0.7" /></bezel>
+ <bezel element="switch1" inputtag="IN.0" inputmask="0x0f" inputraw="1"><bounds x="23.4" y="7.4" width="0.9" height="0.9" /></bezel>
+ <bezel element="switch2" inputtag="IN.0" inputmask="0x0f" inputraw="1"><bounds x="24.166" y="7.4" width="0.9" height="0.9" /></bezel>
+ <bezel element="switch3" inputtag="IN.0" inputmask="0x0f" inputraw="1"><bounds x="24.933" y="7.4" width="0.9" height="0.9" /></bezel>
+ <bezel element="switch4" inputtag="IN.0" inputmask="0x0f" inputraw="1"><bounds x="25.7" y="7.4" width="0.9" height="0.9" /></bezel>
+ <bezel element="text_1"><bounds x="23.4" y="8.3" width="0.9" height="0.75" /></bezel>
+ <bezel element="text_2"><bounds x="24.166" y="8.3" width="0.9" height="0.75" /></bezel>
+ <bezel element="text_3"><bounds x="24.933" y="8.3" width="0.9" height="0.75" /></bezel>
+ <bezel element="text_4"><bounds x="25.7" y="8.3" width="0.9" height="0.75" /></bezel>
+
</view>
</mamelayout>
diff --git a/src/mame/layout/cxg_ch2001.lay b/src/mame/layout/cxg_ch2001.lay
index d2bdb0dcb52..d1767a91f7a 100644
--- a/src/mame/layout/cxg_ch2001.lay
+++ b/src/mame/layout/cxg_ch2001.lay
@@ -115,27 +115,27 @@
<element name="text_p1">
<rect><color red="0.81" green="0.8" blue="0.79" /></rect>
- <text string="&#x265a;"><color red="0.01" green="0.01" blue="0.01" /></text>
+ <text string="[K]"><color red="0.01" green="0.01" blue="0.01" /></text>
</element>
<element name="text_p2">
<rect><color red="0.81" green="0.8" blue="0.79" /></rect>
- <text string="&#x265b;"><color red="0.01" green="0.01" blue="0.01" /></text>
+ <text string="[Q]"><color red="0.01" green="0.01" blue="0.01" /></text>
</element>
<element name="text_p3">
<rect><color red="0.81" green="0.8" blue="0.79" /></rect>
- <text string="&#x265c;"><color red="0.01" green="0.01" blue="0.01" /></text>
+ <text string="[R]"><color red="0.01" green="0.01" blue="0.01" /></text>
</element>
<element name="text_p4">
<rect><color red="0.81" green="0.8" blue="0.79" /></rect>
- <text string="&#x265d;"><color red="0.01" green="0.01" blue="0.01" /></text>
+ <text string="[B]"><color red="0.01" green="0.01" blue="0.01" /></text>
</element>
<element name="text_p5">
<rect><color red="0.81" green="0.8" blue="0.79" /></rect>
- <text string="&#x265e;"><color red="0.01" green="0.01" blue="0.01" /></text>
+ <text string="[N]"><color red="0.01" green="0.01" blue="0.01" /></text>
</element>
<element name="text_p6">
<rect><color red="0.81" green="0.8" blue="0.79" /></rect>
- <text string="&#x265f;"><color red="0.01" green="0.01" blue="0.01" /></text>
+ <text string="[P]"><color red="0.01" green="0.01" blue="0.01" /></text>
</element>
<element name="text_b1"><text string="Set up"><color red="0.81" green="0.8" blue="0.79" /></text></element>
@@ -379,37 +379,43 @@
<bezel element="white"><bounds x="20.2" y="89.2" width="7.6" height="9" /></bezel>
<bezel element="static_black"><bounds x="20.5" y="89.5" width="7" height="8.4" /></bezel>
<bezel name="8.1" element="led2"><bounds x="23.25" y="90" width="1.5" height="1.5" /></bezel>
- <bezel element="text_p1"><bounds x="21" y="91.8" width="6" height="2" /></bezel>
+ <bezel element="white"><bounds x="21" y="91.8" width="6" height="2" /></bezel>
+ <bezel element="text_p1"><bounds x="21" y="91.9" width="6" height="1.5" /></bezel>
<bezel element="butr" inputtag="IN.8" inputmask="0x02"><bounds x="21" y="94.3" width="6" height="2" /></bezel>
<bezel element="white"><bounds x="28.2" y="89.2" width="7.6" height="9" /></bezel>
<bezel element="static_black"><bounds x="28.5" y="89.5" width="7" height="8.4" /></bezel>
<bezel name="8.2" element="led2"><bounds x="31.25" y="90" width="1.5" height="1.5" /></bezel>
- <bezel element="text_p2"><bounds x="29" y="91.8" width="6" height="2" /></bezel>
+ <bezel element="white"><bounds x="29" y="91.8" width="6" height="2" /></bezel>
+ <bezel element="text_p2"><bounds x="29" y="91.9" width="6" height="1.5" /></bezel>
<bezel element="butr" inputtag="IN.8" inputmask="0x04"><bounds x="29" y="94.3" width="6" height="2" /></bezel>
<bezel element="white"><bounds x="36.2" y="89.2" width="7.6" height="9" /></bezel>
<bezel element="static_black"><bounds x="36.5" y="89.5" width="7" height="8.4" /></bezel>
<bezel name="8.3" element="led2"><bounds x="39.25" y="90" width="1.5" height="1.5" /></bezel>
- <bezel element="text_p3"><bounds x="37" y="91.8" width="6" height="2" /></bezel>
+ <bezel element="white"><bounds x="37" y="91.8" width="6" height="2" /></bezel>
+ <bezel element="text_p3"><bounds x="37" y="91.9" width="6" height="1.5" /></bezel>
<bezel element="butr" inputtag="IN.8" inputmask="0x08"><bounds x="37" y="94.3" width="6" height="2" /></bezel>
<bezel element="white"><bounds x="20.2" y="98.7" width="7.6" height="9" /></bezel>
<bezel element="static_black"><bounds x="20.5" y="99" width="7" height="8.4" /></bezel>
<bezel name="8.4" element="led2"><bounds x="23.25" y="99.5" width="1.5" height="1.5" /></bezel>
- <bezel element="text_p4"><bounds x="21" y="101.3" width="6" height="2" /></bezel>
+ <bezel element="white"><bounds x="21" y="101.3" width="6" height="2" /></bezel>
+ <bezel element="text_p4"><bounds x="21" y="101.4" width="6" height="1.5" /></bezel>
<bezel element="butr" inputtag="IN.8" inputmask="0x10"><bounds x="21" y="103.8" width="6" height="2" /></bezel>
<bezel element="white"><bounds x="28.2" y="98.7" width="7.6" height="9" /></bezel>
<bezel element="static_black"><bounds x="28.5" y="99" width="7" height="8.4" /></bezel>
<bezel name="8.5" element="led2"><bounds x="31.25" y="99.5" width="1.5" height="1.5" /></bezel>
- <bezel element="text_p5"><bounds x="29" y="101.3" width="6" height="2" /></bezel>
+ <bezel element="white"><bounds x="29" y="101.3" width="6" height="2" /></bezel>
+ <bezel element="text_p5"><bounds x="29" y="101.4" width="6" height="1.5" /></bezel>
<bezel element="butr" inputtag="IN.8" inputmask="0x20"><bounds x="29" y="103.8" width="6" height="2" /></bezel>
<bezel element="white"><bounds x="36.2" y="98.7" width="7.6" height="9" /></bezel>
<bezel element="static_black"><bounds x="36.5" y="99" width="7" height="8.4" /></bezel>
<bezel name="8.6" element="led2"><bounds x="39.25" y="99.5" width="1.5" height="1.5" /></bezel>
- <bezel element="text_p6"><bounds x="37" y="101.3" width="6" height="2" /></bezel>
+ <bezel element="white"><bounds x="37" y="101.3" width="6" height="2" /></bezel>
+ <bezel element="text_p6"><bounds x="37" y="101.4" width="6" height="1.5" /></bezel>
<bezel element="butr" inputtag="IN.8" inputmask="0x40"><bounds x="37" y="103.8" width="6" height="2" /></bezel>
<bezel element="white"><bounds x="46.5" y="89.2" width="7" height="9" /></bezel>
diff --git a/src/mame/layout/f2pbball.lay b/src/mame/layout/f2pbball.lay
index e62927601e1..6328b8a4129 100644
--- a/src/mame/layout/f2pbball.lay
+++ b/src/mame/layout/f2pbball.lay
@@ -200,103 +200,29 @@
<!-- diamond city -->
- <bezel element="disk_white"><bounds x="5.9" y="17.9" width="0.2" height="0.2" /></bezel>
- <bezel element="disk_white"><bounds x="6.4" y="17.4" width="0.2" height="0.2" /></bezel>
- <bezel element="disk_white"><bounds x="6.9" y="16.9" width="0.2" height="0.2" /></bezel>
- <bezel element="disk_white"><bounds x="7.4" y="16.4" width="0.2" height="0.2" /></bezel>
- <bezel element="disk_white"><bounds x="7.9" y="15.9" width="0.2" height="0.2" /></bezel>
- <bezel element="disk_white"><bounds x="8.4" y="15.4" width="0.2" height="0.2" /></bezel>
- <bezel element="disk_white"><bounds x="8.9" y="14.9" width="0.2" height="0.2" /></bezel>
- <bezel element="disk_white"><bounds x="9.4" y="14.4" width="0.2" height="0.2" /></bezel>
- <bezel element="disk_white"><bounds x="9.9" y="13.9" width="0.2" height="0.2" /></bezel>
- <bezel element="disk_white"><bounds x="10.4" y="13.4" width="0.2" height="0.2" /></bezel>
- <bezel element="disk_white"><bounds x="10.9" y="12.9" width="0.2" height="0.2" /></bezel>
- <bezel element="disk_white"><bounds x="11.4" y="12.4" width="0.2" height="0.2" /></bezel>
- <bezel element="disk_white"><bounds x="11.9" y="11.9" width="0.2" height="0.2" /></bezel>
- <bezel element="disk_white"><bounds x="12.4" y="11.4" width="0.2" height="0.2" /></bezel>
- <bezel element="disk_white"><bounds x="12.9" y="10.9" width="0.2" height="0.2" /></bezel>
- <bezel element="disk_white"><bounds x="13.4" y="10.4" width="0.2" height="0.2" /></bezel>
- <bezel element="disk_white"><bounds x="13.9" y="9.9" width="0.2" height="0.2" /></bezel>
- <bezel element="disk_white"><bounds x="14.4" y="9.4" width="0.2" height="0.2" /></bezel>
- <bezel element="disk_white"><bounds x="14.9" y="8.9" width="0.2" height="0.2" /></bezel>
- <bezel element="disk_white"><bounds x="15.4" y="8.4" width="0.2" height="0.2" /></bezel>
-
- <bezel element="disk_white"><bounds x="15.9" y="8.9" width="0.2" height="0.2" /></bezel>
- <bezel element="disk_white"><bounds x="16.4" y="9.4" width="0.2" height="0.2" /></bezel>
- <bezel element="disk_white"><bounds x="16.9" y="9.9" width="0.2" height="0.2" /></bezel>
- <bezel element="disk_white"><bounds x="17.4" y="10.4" width="0.2" height="0.2" /></bezel>
- <bezel element="disk_white"><bounds x="17.9" y="10.9" width="0.2" height="0.2" /></bezel>
- <bezel element="disk_white"><bounds x="18.4" y="11.4" width="0.2" height="0.2" /></bezel>
- <bezel element="disk_white"><bounds x="18.9" y="11.9" width="0.2" height="0.2" /></bezel>
- <bezel element="disk_white"><bounds x="19.4" y="12.4" width="0.2" height="0.2" /></bezel>
- <bezel element="disk_white"><bounds x="19.9" y="12.9" width="0.2" height="0.2" /></bezel>
- <bezel element="disk_white"><bounds x="20.4" y="13.4" width="0.2" height="0.2" /></bezel>
- <bezel element="disk_white"><bounds x="20.9" y="13.9" width="0.2" height="0.2" /></bezel>
- <bezel element="disk_white"><bounds x="21.4" y="14.4" width="0.2" height="0.2" /></bezel>
- <bezel element="disk_white"><bounds x="21.9" y="14.9" width="0.2" height="0.2" /></bezel>
- <bezel element="disk_white"><bounds x="22.4" y="15.4" width="0.2" height="0.2" /></bezel>
- <bezel element="disk_white"><bounds x="22.9" y="15.9" width="0.2" height="0.2" /></bezel>
- <bezel element="disk_white"><bounds x="23.4" y="16.4" width="0.2" height="0.2" /></bezel>
- <bezel element="disk_white"><bounds x="23.9" y="16.9" width="0.2" height="0.2" /></bezel>
- <bezel element="disk_white"><bounds x="24.4" y="17.4" width="0.2" height="0.2" /></bezel>
- <bezel element="disk_white"><bounds x="24.9" y="17.9" width="0.2" height="0.2" /></bezel>
- <bezel element="disk_white"><bounds x="25.4" y="18.4" width="0.2" height="0.2" /></bezel>
-
- <bezel element="disk_white"><bounds x="24.9" y="18.9" width="0.2" height="0.2" /></bezel>
- <bezel element="disk_white"><bounds x="24.4" y="19.4" width="0.2" height="0.2" /></bezel>
- <bezel element="disk_white"><bounds x="23.9" y="19.9" width="0.2" height="0.2" /></bezel>
- <bezel element="disk_white"><bounds x="23.4" y="20.4" width="0.2" height="0.2" /></bezel>
- <bezel element="disk_white"><bounds x="22.9" y="20.9" width="0.2" height="0.2" /></bezel>
- <bezel element="disk_white"><bounds x="22.4" y="21.4" width="0.2" height="0.2" /></bezel>
- <bezel element="disk_white"><bounds x="21.9" y="21.9" width="0.2" height="0.2" /></bezel>
- <bezel element="disk_white"><bounds x="21.4" y="22.4" width="0.2" height="0.2" /></bezel>
- <bezel element="disk_white"><bounds x="20.9" y="22.9" width="0.2" height="0.2" /></bezel>
- <bezel element="disk_white"><bounds x="20.4" y="23.4" width="0.2" height="0.2" /></bezel>
- <bezel element="disk_white"><bounds x="19.9" y="23.9" width="0.2" height="0.2" /></bezel>
- <bezel element="disk_white"><bounds x="19.4" y="24.4" width="0.2" height="0.2" /></bezel>
- <bezel element="disk_white"><bounds x="18.9" y="24.9" width="0.2" height="0.2" /></bezel>
- <bezel element="disk_white"><bounds x="18.4" y="25.4" width="0.2" height="0.2" /></bezel>
- <bezel element="disk_white"><bounds x="17.9" y="25.9" width="0.2" height="0.2" /></bezel>
- <bezel element="disk_white"><bounds x="17.4" y="26.4" width="0.2" height="0.2" /></bezel>
- <bezel element="disk_white"><bounds x="16.9" y="26.9" width="0.2" height="0.2" /></bezel>
- <bezel element="disk_white"><bounds x="16.4" y="27.4" width="0.2" height="0.2" /></bezel>
- <bezel element="disk_white"><bounds x="15.9" y="27.9" width="0.2" height="0.2" /></bezel>
- <bezel element="disk_white"><bounds x="15.4" y="28.4" width="0.2" height="0.2" /></bezel>
-
- <bezel element="disk_white"><bounds x="14.9" y="27.9" width="0.2" height="0.2" /></bezel>
- <bezel element="disk_white"><bounds x="14.4" y="27.4" width="0.2" height="0.2" /></bezel>
- <bezel element="disk_white"><bounds x="13.9" y="26.9" width="0.2" height="0.2" /></bezel>
- <bezel element="disk_white"><bounds x="13.4" y="26.4" width="0.2" height="0.2" /></bezel>
- <bezel element="disk_white"><bounds x="12.9" y="25.9" width="0.2" height="0.2" /></bezel>
- <bezel element="disk_white"><bounds x="12.4" y="25.4" width="0.2" height="0.2" /></bezel>
- <bezel element="disk_white"><bounds x="11.9" y="24.9" width="0.2" height="0.2" /></bezel>
- <bezel element="disk_white"><bounds x="11.4" y="24.4" width="0.2" height="0.2" /></bezel>
- <bezel element="disk_white"><bounds x="10.9" y="23.9" width="0.2" height="0.2" /></bezel>
- <bezel element="disk_white"><bounds x="10.4" y="23.4" width="0.2" height="0.2" /></bezel>
- <bezel element="disk_white"><bounds x="9.9" y="22.9" width="0.2" height="0.2" /></bezel>
- <bezel element="disk_white"><bounds x="9.4" y="22.4" width="0.2" height="0.2" /></bezel>
- <bezel element="disk_white"><bounds x="8.9" y="21.9" width="0.2" height="0.2" /></bezel>
- <bezel element="disk_white"><bounds x="8.4" y="21.4" width="0.2" height="0.2" /></bezel>
- <bezel element="disk_white"><bounds x="7.9" y="20.9" width="0.2" height="0.2" /></bezel>
- <bezel element="disk_white"><bounds x="7.4" y="20.4" width="0.2" height="0.2" /></bezel>
- <bezel element="disk_white"><bounds x="6.9" y="19.9" width="0.2" height="0.2" /></bezel>
- <bezel element="disk_white"><bounds x="6.4" y="19.4" width="0.2" height="0.2" /></bezel>
- <bezel element="disk_white"><bounds x="5.9" y="18.9" width="0.2" height="0.2" /></bezel>
- <bezel element="disk_white"><bounds x="5.4" y="18.4" width="0.2" height="0.2" /></bezel>
-
- <bezel element="disk_white"><bounds x="4.9" y="17.9" width="0.2" height="0.2" /></bezel>
- <bezel element="disk_white"><bounds x="4.4" y="17.4" width="0.2" height="0.2" /></bezel>
- <bezel element="disk_white"><bounds x="3.9" y="16.9" width="0.2" height="0.2" /></bezel>
- <bezel element="disk_white"><bounds x="3.4" y="16.4" width="0.2" height="0.2" /></bezel>
- <bezel element="disk_white"><bounds x="2.9" y="15.9" width="0.2" height="0.2" /></bezel>
- <bezel element="disk_white"><bounds x="2.4" y="15.4" width="0.2" height="0.2" /></bezel>
-
- <bezel element="disk_white"><bounds x="28.4" y="15.4" width="0.2" height="0.2" /></bezel>
- <bezel element="disk_white"><bounds x="27.9" y="15.9" width="0.2" height="0.2" /></bezel>
- <bezel element="disk_white"><bounds x="27.4" y="16.4" width="0.2" height="0.2" /></bezel>
- <bezel element="disk_white"><bounds x="26.9" y="16.9" width="0.2" height="0.2" /></bezel>
- <bezel element="disk_white"><bounds x="26.4" y="17.4" width="0.2" height="0.2" /></bezel>
- <bezel element="disk_white"><bounds x="25.9" y="17.9" width="0.2" height="0.2" /></bezel>
+ <repeat count="20">
+ <param name="x" start="15.4" increment="0.5" />
+ <param name="y" start="8.4" increment="0.5" />
+ <bezel element="disk_white"><bounds x="~x~" y="~y~" width="0.2" height="0.2" /></bezel>
+ </repeat>
+
+ <repeat count="20">
+ <param name="x" start="15.4" increment="-0.5" />
+ <param name="y" start="8.4" increment="0.5" />
+ <bezel element="disk_white"><bounds x="~x~" y="~y~" width="0.2" height="0.2" /></bezel>
+ </repeat>
+
+ <repeat count="26">
+ <param name="x" start="15.4" increment="0.5" />
+ <param name="y" start="28.4" increment="-0.5" />
+ <bezel element="disk_white"><bounds x="~x~" y="~y~" width="0.2" height="0.2" /></bezel>
+ </repeat>
+
+ <repeat count="26">
+ <param name="x" start="15.4" increment="-0.5" />
+ <param name="y" start="28.4" increment="-0.5" />
+ <bezel element="disk_white"><bounds x="~x~" y="~y~" width="0.2" height="0.2" /></bezel>
+ </repeat>
<!-- field leds -->
diff --git a/src/mame/layout/fidel_acr.lay b/src/mame/layout/fidel_acr.lay
new file mode 100644
index 00000000000..9deb9b09222
--- /dev/null
+++ b/src/mame/layout/fidel_acr.lay
@@ -0,0 +1,173 @@
+<?xml version="1.0"?>
+<mamelayout version="2">
+
+<!-- define elements -->
+
+ <element name="static_gray"><rect><color red="0.6" green="0.6" blue="0.6" /></rect></element>
+
+ <element name="digit" defstate="0">
+ <led7seg><color red="1.0" green="0.1" blue="0.15" /></led7seg>
+ </element>
+
+ <element name="led" defstate="0">
+ <disk state="1"><color red="1.0" green="0.1" blue="0.15" /></disk>
+ <disk state="0"><color red="0.1" green="0.01" blue="0.015" /></disk>
+ </element>
+
+ <element name="hl" defstate="0">
+ <text string=" ">
+ <bounds x="0.0" y="0.0" width="1.0" height="1.0" />
+ <color red="0.0" green="0.0" blue="0.0" />
+ </text>
+ <rect state="1">
+ <bounds x="0.0" y="0.0" width="1.0" height="1.0" />
+ <color red="0.0" green="0.0" blue="0.0" />
+ </rect>
+ </element>
+
+ <element name="text_win"><text string="I WIN"><color red="0.6" green="0.6" blue="0.6" /></text></element>
+ <element name="text_lose"><text string="I LOSE"><color red="0.6" green="0.6" blue="0.6" /></text></element>
+ <element name="text_from"><text string="FROM"><color red="0.6" green="0.6" blue="0.6" /></text></element>
+ <element name="text_to"><text string="TO"><color red="0.6" green="0.6" blue="0.6" /></text></element>
+
+ <element name="text_b1">
+ <rect><color red="0.6" green="0.6" blue="0.6" /></rect>
+ <text string="RE"><color red="0.04" green="0.04" blue="0.04" /></text>
+ </element>
+ <element name="text_b2">
+ <rect><color red="0.6" green="0.6" blue="0.6" /></rect>
+ <text string="CL"><color red="0.04" green="0.04" blue="0.04" /></text>
+ </element>
+ <element name="text_b3">
+ <rect><color red="0.6" green="0.6" blue="0.6" /></rect>
+ <text string="TO"><color red="0.04" green="0.04" blue="0.04" /></text>
+ </element>
+ <element name="text_b4">
+ <rect><color red="0.6" green="0.6" blue="0.6" /></rect>
+ <text string="EN"><color red="0.04" green="0.04" blue="0.04" /></text>
+ </element>
+ <element name="text_b5">
+ <rect><color red="0.6" green="0.6" blue="0.6" /></rect>
+ <text string="LV"><color red="0.04" green="0.04" blue="0.04" /></text>
+ </element>
+ <element name="text_b6">
+ <rect><color red="0.6" green="0.6" blue="0.6" /></rect>
+ <text string="7"><color red="0.04" green="0.04" blue="0.04" /></text>
+ </element>
+ <element name="text_b7">
+ <rect><color red="0.6" green="0.6" blue="0.6" /></rect>
+ <text string="8"><color red="0.04" green="0.04" blue="0.04" /></text>
+ </element>
+ <element name="text_b8">
+ <rect><color red="0.6" green="0.6" blue="0.6" /></rect>
+ <text string="9"><color red="0.04" green="0.04" blue="0.04" /></text>
+ </element>
+ <element name="text_b9">
+ <rect><color red="0.6" green="0.6" blue="0.6" /></rect>
+ <text string="PV"><color red="0.04" green="0.04" blue="0.04" /></text>
+ </element>
+ <element name="text_b10">
+ <rect><color red="0.6" green="0.6" blue="0.6" /></rect>
+ <text string="4"><color red="0.04" green="0.04" blue="0.04" /></text>
+ </element>
+ <element name="text_b11">
+ <rect><color red="0.6" green="0.6" blue="0.6" /></rect>
+ <text string="5"><color red="0.04" green="0.04" blue="0.04" /></text>
+ </element>
+ <element name="text_b12">
+ <rect><color red="0.6" green="0.6" blue="0.6" /></rect>
+ <text string="6"><color red="0.04" green="0.04" blue="0.04" /></text>
+ </element>
+ <element name="text_b13">
+ <rect><color red="0.6" green="0.6" blue="0.6" /></rect>
+ <text string="0"><color red="0.04" green="0.04" blue="0.04" /></text>
+ </element>
+ <element name="text_b14">
+ <rect><color red="0.6" green="0.6" blue="0.6" /></rect>
+ <text string="1"><color red="0.04" green="0.04" blue="0.04" /></text>
+ </element>
+ <element name="text_b15">
+ <rect><color red="0.6" green="0.6" blue="0.6" /></rect>
+ <text string="2"><color red="0.04" green="0.04" blue="0.04" /></text>
+ </element>
+ <element name="text_b16">
+ <rect><color red="0.6" green="0.6" blue="0.6" /></rect>
+ <text string="3"><color red="0.04" green="0.04" blue="0.04" /></text>
+ </element>
+
+
+<!-- build screen -->
+
+ <view name="Internal Layout">
+ <bounds left="-0.5" right="18" top="7.7" bottom="36" />
+
+ <!-- 7segs/leds -->
+
+ <bezel element="text_win"><bounds x="0.7" y="8.2" width="8" height="2" /></bezel>
+ <bezel element="text_lose"><bounds x="10.5" y="8.2" width="8" height="2" /></bezel>
+ <bezel name="4.a" element="led"><bounds x="0" y="8.5" width="1.5" height="1.5" /></bezel>
+ <bezel name="5.a" element="led"><bounds x="9.5" y="8.5" width="1.5" height="1.5" /></bezel>
+
+ <bezel element="text_from"><bounds x="0" y="17.2" width="8" height="2" /></bezel>
+ <bezel element="text_to"><bounds x="9.5" y="17.2" width="8" height="2" /></bezel>
+
+ <bezel name="digit0" element="digit"><bounds x="0" y="11" width="4" height="6" /></bezel>
+ <bezel name="digit1" element="digit"><bounds x="4" y="11" width="4" height="6" /></bezel>
+ <bezel name="digit2" element="digit"><bounds x="9.5" y="11" width="4" height="6" /></bezel>
+ <bezel name="digit3" element="digit"><bounds x="13.5" y="11" width="4" height="6" /></bezel>
+
+ <!-- button panel -->
+
+ <bezel element="static_gray"><bounds x="0" y="20" width="4" height="3.5" /></bezel>
+ <bezel element="static_gray"><bounds x="4.5" y="20" width="4" height="3.5" /></bezel>
+ <bezel element="static_gray"><bounds x="9" y="20" width="4" height="3.5" /></bezel>
+ <bezel element="static_gray"><bounds x="13.5" y="20" width="4" height="3.5" /></bezel>
+ <bezel element="static_gray"><bounds x="0" y="24" width="4" height="3.5" /></bezel>
+ <bezel element="static_gray"><bounds x="4.5" y="24" width="4" height="3.5" /></bezel>
+ <bezel element="static_gray"><bounds x="9" y="24" width="4" height="3.5" /></bezel>
+ <bezel element="static_gray"><bounds x="13.5" y="24" width="4" height="3.5" /></bezel>
+ <bezel element="static_gray"><bounds x="0" y="28" width="4" height="3.5" /></bezel>
+ <bezel element="static_gray"><bounds x="4.5" y="28" width="4" height="3.5" /></bezel>
+ <bezel element="static_gray"><bounds x="9" y="28" width="4" height="3.5" /></bezel>
+ <bezel element="static_gray"><bounds x="13.5" y="28" width="4" height="3.5" /></bezel>
+ <bezel element="static_gray"><bounds x="0" y="32" width="4" height="3.5" /></bezel>
+ <bezel element="static_gray"><bounds x="4.5" y="32" width="4" height="3.5" /></bezel>
+ <bezel element="static_gray"><bounds x="9" y="32" width="4" height="3.5" /></bezel>
+ <bezel element="static_gray"><bounds x="13.5" y="32" width="4" height="3.5" /></bezel>
+
+ <bezel element="text_b1"><bounds x="0.1" y="20.75" width="3.8" height="2" /></bezel>
+ <bezel element="text_b2"><bounds x="4.6" y="20.75" width="3.8" height="2" /></bezel>
+ <bezel element="text_b3"><bounds x="9.1" y="20.75" width="3.8" height="2" /></bezel>
+ <bezel element="text_b4"><bounds x="13.6" y="20.75" width="3.8" height="2" /></bezel>
+ <bezel element="text_b5"><bounds x="0.1" y="24.75" width="3.8" height="2" /></bezel>
+ <bezel element="text_b6"><bounds x="4.6" y="24.75" width="3.8" height="2" /></bezel>
+ <bezel element="text_b7"><bounds x="9.1" y="24.75" width="3.8" height="2" /></bezel>
+ <bezel element="text_b8"><bounds x="13.6" y="24.75" width="3.8" height="2" /></bezel>
+ <bezel element="text_b9"><bounds x="0.1" y="28.75" width="3.8" height="2" /></bezel>
+ <bezel element="text_b10"><bounds x="4.6" y="28.75" width="3.8" height="2" /></bezel>
+ <bezel element="text_b11"><bounds x="9.1" y="28.75" width="3.8" height="2" /></bezel>
+ <bezel element="text_b12"><bounds x="13.6" y="28.75" width="3.8" height="2" /></bezel>
+ <bezel element="text_b13"><bounds x="0.1" y="32.75" width="3.8" height="2" /></bezel>
+ <bezel element="text_b14"><bounds x="4.6" y="32.75" width="3.8" height="2" /></bezel>
+ <bezel element="text_b15"><bounds x="9.1" y="32.75" width="3.8" height="2" /></bezel>
+ <bezel element="text_b16"><bounds x="13.6" y="32.75" width="3.8" height="2" /></bezel>
+
+ <bezel element="hl" inputtag="RESET" inputmask="0x01"><bounds x="0" y="20" width="4" height="3.5" /><color alpha="0.2" /></bezel>
+ <bezel element="hl" inputtag="IN.1" inputmask="0x01"><bounds x="4.5" y="20" width="4" height="3.5" /><color alpha="0.2" /></bezel>
+ <bezel element="hl" inputtag="IN.2" inputmask="0x01"><bounds x="9" y="20" width="4" height="3.5" /><color alpha="0.2" /></bezel>
+ <bezel element="hl" inputtag="IN.3" inputmask="0x01"><bounds x="13.5" y="20" width="4" height="3.5" /><color alpha="0.2" /></bezel>
+ <bezel element="hl" inputtag="IN.0" inputmask="0x02"><bounds x="0" y="24" width="4" height="3.5" /><color alpha="0.2" /></bezel>
+ <bezel element="hl" inputtag="IN.1" inputmask="0x02"><bounds x="4.5" y="24" width="4" height="3.5" /><color alpha="0.2" /></bezel>
+ <bezel element="hl" inputtag="IN.2" inputmask="0x02"><bounds x="9" y="24" width="4" height="3.5" /><color alpha="0.2" /></bezel>
+ <bezel element="hl" inputtag="IN.3" inputmask="0x02"><bounds x="13.5" y="24" width="4" height="3.5" /><color alpha="0.2" /></bezel>
+ <bezel element="hl" inputtag="IN.0" inputmask="0x04"><bounds x="0" y="28" width="4" height="3.5" /><color alpha="0.2" /></bezel>
+ <bezel element="hl" inputtag="IN.1" inputmask="0x04"><bounds x="4.5" y="28" width="4" height="3.5" /><color alpha="0.2" /></bezel>
+ <bezel element="hl" inputtag="IN.2" inputmask="0x04"><bounds x="9" y="28" width="4" height="3.5" /><color alpha="0.2" /></bezel>
+ <bezel element="hl" inputtag="IN.3" inputmask="0x04"><bounds x="13.5" y="28" width="4" height="3.5" /><color alpha="0.2" /></bezel>
+ <bezel element="hl" inputtag="IN.0" inputmask="0x08"><bounds x="0" y="32" width="4" height="3.5" /><color alpha="0.2" /></bezel>
+ <bezel element="hl" inputtag="IN.1" inputmask="0x08"><bounds x="4.5" y="32" width="4" height="3.5" /><color alpha="0.2" /></bezel>
+ <bezel element="hl" inputtag="IN.2" inputmask="0x08"><bounds x="9" y="32" width="4" height="3.5" /><color alpha="0.2" /></bezel>
+ <bezel element="hl" inputtag="IN.3" inputmask="0x08"><bounds x="13.5" y="32" width="4" height="3.5" /><color alpha="0.2" /></bezel>
+
+ </view>
+</mamelayout>
diff --git a/src/mame/layout/fidel_as12.lay b/src/mame/layout/fidel_as12.lay
index 4dc77023405..09bb2259205 100644
--- a/src/mame/layout/fidel_as12.lay
+++ b/src/mame/layout/fidel_as12.lay
@@ -96,12 +96,12 @@
<text string="H"><color red="0.01" green="0.01" blue="0.01" /></text>
</element>
- <element name="text_l3"><text string="&#x265a;"><color red="0.81" green="0.8" blue="0.79" /></text></element>
- <element name="text_l4"><text string="&#x265b;"><color red="0.81" green="0.8" blue="0.79" /></text></element>
- <element name="text_l5"><text string="&#x265c;"><color red="0.81" green="0.8" blue="0.79" /></text></element>
- <element name="text_l6"><text string="&#x265d;"><color red="0.81" green="0.8" blue="0.79" /></text></element>
- <element name="text_l7"><text string="&#x265e;"><color red="0.81" green="0.8" blue="0.79" /></text></element>
- <element name="text_l8"><text string="&#x265f;"><color red="0.81" green="0.8" blue="0.79" /></text></element>
+ <element name="text_l3"><text string="[K]"><color red="0.81" green="0.8" blue="0.79" /></text></element>
+ <element name="text_l4"><text string="[Q]"><color red="0.81" green="0.8" blue="0.79" /></text></element>
+ <element name="text_l5"><text string="[R]"><color red="0.81" green="0.8" blue="0.79" /></text></element>
+ <element name="text_l6"><text string="[B]"><color red="0.81" green="0.8" blue="0.79" /></text></element>
+ <element name="text_l7"><text string="[N]"><color red="0.81" green="0.8" blue="0.79" /></text></element>
+ <element name="text_l8"><text string="[P]"><color red="0.81" green="0.8" blue="0.79" /></text></element>
<element name="text_r1"><text string="RE"><color red="0.81" green="0.8" blue="0.79" /></text></element>
<element name="text_r2"><text string="CL"><color red="0.81" green="0.8" blue="0.79" /></text></element>
@@ -339,12 +339,12 @@
<!-- right side -->
- <bezel element="text_l3"><bounds x="90.8" y="31.25" width="4" height="4" /></bezel>
- <bezel element="text_l4"><bounds x="90.8" y="37.75" width="4" height="4" /></bezel>
- <bezel element="text_l5"><bounds x="90.8" y="44.25" width="4" height="4" /></bezel>
- <bezel element="text_l6"><bounds x="90.8" y="50.75" width="4" height="4" /></bezel>
- <bezel element="text_l7"><bounds x="90.8" y="57.25" width="4" height="4" /></bezel>
- <bezel element="text_l8"><bounds x="90.8" y="63.75" width="4" height="4" /></bezel>
+ <bezel element="text_l3"><bounds x="90.6" y="32.4" width="4" height="2" /></bezel>
+ <bezel element="text_l4"><bounds x="90.6" y="38.9" width="4" height="2" /></bezel>
+ <bezel element="text_l5"><bounds x="90.6" y="45.4" width="4" height="2" /></bezel>
+ <bezel element="text_l6"><bounds x="90.6" y="51.9" width="4" height="2" /></bezel>
+ <bezel element="text_l7"><bounds x="90.6" y="58.4" width="4" height="2" /></bezel>
+ <bezel element="text_l8"><bounds x="90.6" y="64.9" width="4" height="2" /></bezel>
<bezel element="text_r1"><bounds x="93.25" y="19.0" width="4" height="2" /></bezel>
<bezel element="text_r2"><bounds x="93.25" y="25.5" width="4" height="2" /></bezel>
diff --git a/src/mame/layout/fidel_bkc.lay b/src/mame/layout/fidel_bkc.lay
new file mode 100644
index 00000000000..f9646b853eb
--- /dev/null
+++ b/src/mame/layout/fidel_bkc.lay
@@ -0,0 +1,178 @@
+<?xml version="1.0"?>
+<mamelayout version="2">
+
+<!-- define elements -->
+
+ <element name="static_gray"><rect><color red="0.6" green="0.6" blue="0.6" /></rect></element>
+
+ <element name="digit" defstate="0">
+ <led7seg><color red="1.0" green="0.1" blue="0.15" /></led7seg>
+ </element>
+
+ <element name="led" defstate="0">
+ <disk state="1"><color red="1.0" green="0.1" blue="0.15" /></disk>
+ <disk state="0"><color red="0.1" green="0.01" blue="0.015" /></disk>
+ </element>
+
+ <element name="hl" defstate="0">
+ <text string=" ">
+ <bounds x="0.0" y="0.0" width="1.0" height="1.0" />
+ <color red="0.0" green="0.0" blue="0.0" />
+ </text>
+ <rect state="1">
+ <bounds x="0.0" y="0.0" width="1.0" height="1.0" />
+ <color red="0.0" green="0.0" blue="0.0" />
+ </rect>
+ </element>
+
+ <element name="text_win"><text string="I WIN"><color red="0.6" green="0.6" blue="0.6" /></text></element>
+ <element name="text_lose"><text string="I LOSE"><color red="0.6" green="0.6" blue="0.6" /></text></element>
+ <element name="text_from"><text string="FROM"><color red="0.6" green="0.6" blue="0.6" /></text></element>
+ <element name="text_dbl"><text string="DBL"><color red="0.6" green="0.6" blue="0.6" /></text></element>
+ <element name="text_to"><text string="TO"><color red="0.6" green="0.6" blue="0.6" /></text></element>
+
+ <element name="text_b1">
+ <rect><color red="0.6" green="0.6" blue="0.6" /></rect>
+ <text string="RE"><color red="0.04" green="0.04" blue="0.04" /></text>
+ </element>
+ <element name="text_b2">
+ <rect><color red="0.6" green="0.6" blue="0.6" /></rect>
+ <text string="GM"><color red="0.04" green="0.04" blue="0.04" /></text>
+ </element>
+ <element name="text_b3">
+ <rect><color red="0.6" green="0.6" blue="0.6" /></rect>
+ <text string="CL"><color red="0.04" green="0.04" blue="0.04" /></text>
+ </element>
+ <element name="text_b4">
+ <rect><color red="0.6" green="0.6" blue="0.6" /></rect>
+ <text string="EN"><color red="0.04" green="0.04" blue="0.04" /></text>
+ </element>
+ <element name="text_b5">
+ <rect><color red="0.6" green="0.6" blue="0.6" /></rect>
+ <text string="PB"><color red="0.04" green="0.04" blue="0.04" /></text>
+ </element>
+ <element name="text_b6">
+ <rect><color red="0.6" green="0.6" blue="0.6" /></rect>
+ <text string="7"><color red="0.04" green="0.04" blue="0.04" /></text>
+ </element>
+ <element name="text_b7">
+ <rect><color red="0.6" green="0.6" blue="0.6" /></rect>
+ <text string="8"><color red="0.04" green="0.04" blue="0.04" /></text>
+ </element>
+ <element name="text_b8">
+ <rect><color red="0.6" green="0.6" blue="0.6" /></rect>
+ <text string="9"><color red="0.04" green="0.04" blue="0.04" /></text>
+ </element>
+ <element name="text_b9">
+ <rect><color red="0.6" green="0.6" blue="0.6" /></rect>
+ <text string="PV"><color red="0.04" green="0.04" blue="0.04" /></text>
+ </element>
+ <element name="text_b10">
+ <rect><color red="0.6" green="0.6" blue="0.6" /></rect>
+ <text string="4"><color red="0.04" green="0.04" blue="0.04" /></text>
+ </element>
+ <element name="text_b11">
+ <rect><color red="0.6" green="0.6" blue="0.6" /></rect>
+ <text string="5"><color red="0.04" green="0.04" blue="0.04" /></text>
+ </element>
+ <element name="text_b12">
+ <rect><color red="0.6" green="0.6" blue="0.6" /></rect>
+ <text string="6"><color red="0.04" green="0.04" blue="0.04" /></text>
+ </element>
+ <element name="text_b13">
+ <rect><color red="0.6" green="0.6" blue="0.6" /></rect>
+ <text string="0"><color red="0.04" green="0.04" blue="0.04" /></text>
+ </element>
+ <element name="text_b14">
+ <rect><color red="0.6" green="0.6" blue="0.6" /></rect>
+ <text string="1"><color red="0.04" green="0.04" blue="0.04" /></text>
+ </element>
+ <element name="text_b15">
+ <rect><color red="0.6" green="0.6" blue="0.6" /></rect>
+ <text string="2"><color red="0.04" green="0.04" blue="0.04" /></text>
+ </element>
+ <element name="text_b16">
+ <rect><color red="0.6" green="0.6" blue="0.6" /></rect>
+ <text string="3"><color red="0.04" green="0.04" blue="0.04" /></text>
+ </element>
+
+
+<!-- build screen -->
+
+ <view name="Internal Layout">
+ <bounds left="-0.5" right="18" top="7.7" bottom="36" />
+
+ <!-- 7segs/leds -->
+
+ <bezel element="text_win"><bounds x="0.7" y="8.2" width="8" height="2" /></bezel>
+ <bezel element="text_lose"><bounds x="10.5" y="8.2" width="8" height="2" /></bezel>
+ <bezel name="4.a" element="led"><bounds x="0" y="8.5" width="1.5" height="1.5" /></bezel>
+ <bezel name="5.a" element="led"><bounds x="9.5" y="8.5" width="1.5" height="1.5" /></bezel>
+
+ <bezel element="text_from"><bounds x="0" y="17.2" width="8" height="2" /></bezel>
+ <bezel element="text_dbl"><bounds x="5.2" y="17.2" width="8" height="2" /></bezel>
+ <bezel element="text_to"><bounds x="9.5" y="17.2" width="8" height="2" /></bezel>
+
+ <bezel name="digit0" element="digit"><bounds x="0" y="11" width="4" height="6" /></bezel>
+ <bezel name="digit1" element="digit"><bounds x="4" y="11" width="4" height="6" /></bezel>
+ <bezel name="digit2" element="digit"><bounds x="9.5" y="11" width="4" height="6" /></bezel>
+ <bezel name="digit3" element="digit"><bounds x="13.5" y="11" width="4" height="6" /></bezel>
+
+ <bezel name="1.7" element="led"><bounds x="8.65" y="11.8" width="0.6" height="0.6" /></bezel>
+ <bezel name="0.7" element="led"><bounds x="8.35" y="15.7" width="0.6" height="0.6" /></bezel>
+
+ <!-- button panel -->
+
+ <bezel element="static_gray"><bounds x="0" y="20" width="4" height="3" /></bezel>
+ <bezel element="static_gray"><bounds x="4.5" y="20" width="4" height="3" /></bezel>
+ <bezel element="static_gray"><bounds x="9" y="20" width="4" height="3" /></bezel>
+ <bezel element="static_gray"><bounds x="13.5" y="20" width="4" height="3" /></bezel>
+ <bezel element="static_gray"><bounds x="0" y="24" width="4" height="3" /></bezel>
+ <bezel element="static_gray"><bounds x="4.5" y="24" width="4" height="3" /></bezel>
+ <bezel element="static_gray"><bounds x="9" y="24" width="4" height="3" /></bezel>
+ <bezel element="static_gray"><bounds x="13.5" y="24" width="4" height="3" /></bezel>
+ <bezel element="static_gray"><bounds x="0" y="28" width="4" height="3" /></bezel>
+ <bezel element="static_gray"><bounds x="4.5" y="28" width="4" height="3" /></bezel>
+ <bezel element="static_gray"><bounds x="9" y="28" width="4" height="3" /></bezel>
+ <bezel element="static_gray"><bounds x="13.5" y="28" width="4" height="3" /></bezel>
+ <bezel element="static_gray"><bounds x="0" y="32" width="4" height="3" /></bezel>
+ <bezel element="static_gray"><bounds x="4.5" y="32" width="4" height="3" /></bezel>
+ <bezel element="static_gray"><bounds x="9" y="32" width="4" height="3" /></bezel>
+ <bezel element="static_gray"><bounds x="13.5" y="32" width="4" height="3" /></bezel>
+
+ <bezel element="text_b1"><bounds x="0.1" y="20.5" width="3.8" height="2" /></bezel>
+ <bezel element="text_b2"><bounds x="4.6" y="20.5" width="3.8" height="2" /></bezel>
+ <bezel element="text_b3"><bounds x="9.1" y="20.5" width="3.8" height="2" /></bezel>
+ <bezel element="text_b4"><bounds x="13.6" y="20.5" width="3.8" height="2" /></bezel>
+ <bezel element="text_b5"><bounds x="0.1" y="24.5" width="3.8" height="2" /></bezel>
+ <bezel element="text_b6"><bounds x="4.6" y="24.5" width="3.8" height="2" /></bezel>
+ <bezel element="text_b7"><bounds x="9.1" y="24.5" width="3.8" height="2" /></bezel>
+ <bezel element="text_b8"><bounds x="13.6" y="24.5" width="3.8" height="2" /></bezel>
+ <bezel element="text_b9"><bounds x="0.1" y="28.5" width="3.8" height="2" /></bezel>
+ <bezel element="text_b10"><bounds x="4.6" y="28.5" width="3.8" height="2" /></bezel>
+ <bezel element="text_b11"><bounds x="9.1" y="28.5" width="3.8" height="2" /></bezel>
+ <bezel element="text_b12"><bounds x="13.6" y="28.5" width="3.8" height="2" /></bezel>
+ <bezel element="text_b13"><bounds x="0.1" y="32.5" width="3.8" height="2" /></bezel>
+ <bezel element="text_b14"><bounds x="4.6" y="32.5" width="3.8" height="2" /></bezel>
+ <bezel element="text_b15"><bounds x="9.1" y="32.5" width="3.8" height="2" /></bezel>
+ <bezel element="text_b16"><bounds x="13.6" y="32.5" width="3.8" height="2" /></bezel>
+
+ <bezel element="hl" inputtag="IN.3" inputmask="0x01"><bounds x="0" y="20" width="4" height="3" /><color alpha="0.2" /></bezel>
+ <bezel element="hl" inputtag="IN.2" inputmask="0x01"><bounds x="4.5" y="20" width="4" height="3" /><color alpha="0.2" /></bezel>
+ <bezel element="hl" inputtag="IN.1" inputmask="0x01"><bounds x="9" y="20" width="4" height="3" /><color alpha="0.2" /></bezel>
+ <bezel element="hl" inputtag="IN.0" inputmask="0x01"><bounds x="13.5" y="20" width="4" height="3" /><color alpha="0.2" /></bezel>
+ <bezel element="hl" inputtag="IN.3" inputmask="0x02"><bounds x="0" y="24" width="4" height="3" /><color alpha="0.2" /></bezel>
+ <bezel element="hl" inputtag="IN.2" inputmask="0x02"><bounds x="4.5" y="24" width="4" height="3" /><color alpha="0.2" /></bezel>
+ <bezel element="hl" inputtag="IN.1" inputmask="0x02"><bounds x="9" y="24" width="4" height="3" /><color alpha="0.2" /></bezel>
+ <bezel element="hl" inputtag="IN.0" inputmask="0x02"><bounds x="13.5" y="24" width="4" height="3" /><color alpha="0.2" /></bezel>
+ <bezel element="hl" inputtag="IN.3" inputmask="0x04"><bounds x="0" y="28" width="4" height="3" /><color alpha="0.2" /></bezel>
+ <bezel element="hl" inputtag="IN.2" inputmask="0x04"><bounds x="4.5" y="28" width="4" height="3" /><color alpha="0.2" /></bezel>
+ <bezel element="hl" inputtag="IN.1" inputmask="0x04"><bounds x="9" y="28" width="4" height="3" /><color alpha="0.2" /></bezel>
+ <bezel element="hl" inputtag="IN.0" inputmask="0x04"><bounds x="13.5" y="28" width="4" height="3" /><color alpha="0.2" /></bezel>
+ <bezel element="hl" inputtag="IN.3" inputmask="0x08"><bounds x="0" y="32" width="4" height="3" /><color alpha="0.2" /></bezel>
+ <bezel element="hl" inputtag="IN.2" inputmask="0x08"><bounds x="4.5" y="32" width="4" height="3" /><color alpha="0.2" /></bezel>
+ <bezel element="hl" inputtag="IN.1" inputmask="0x08"><bounds x="9" y="32" width="4" height="3" /><color alpha="0.2" /></bezel>
+ <bezel element="hl" inputtag="IN.0" inputmask="0x08"><bounds x="13.5" y="32" width="4" height="3" /><color alpha="0.2" /></bezel>
+
+ </view>
+</mamelayout>
diff --git a/src/mame/layout/fidel_brc.lay b/src/mame/layout/fidel_brc.lay
new file mode 100644
index 00000000000..4e7cfe12572
--- /dev/null
+++ b/src/mame/layout/fidel_brc.lay
@@ -0,0 +1,495 @@
+<?xml version="1.0"?>
+<mamelayout version="2">
+
+<!-- define elements -->
+
+ <element name="button" defstate="0">
+ <rect state="0"><color red="0.8" green="0.8" blue="0.7" /></rect>
+ <rect state="1"><color red="0.6" green="0.6" blue="0.5" /></rect>
+ </element>
+
+ <element name="digit" defstate="0">
+ <led14seg><color red="0.2" green="1.0" blue="0.85" /></led14seg>
+ </element>
+
+ <element name="led" defstate="0">
+ <disk state="1"><color red="1.0" green="0.1" blue="0.15" /></disk>
+ <disk state="0"><color red="0.1" green="0.01" blue="0.015" /></disk>
+ </element>
+
+ <element name="text_l1"><text string="N"><color red="0.7" green="0.7" blue="0.7" /></text></element>
+ <element name="text_l2"><text string="E"><color red="0.7" green="0.7" blue="0.7" /></text></element>
+ <element name="text_l3"><text string="S"><color red="0.7" green="0.7" blue="0.7" /></text></element>
+ <element name="text_l4"><text string="W"><color red="0.7" green="0.7" blue="0.7" /></text></element>
+ <element name="text_l5"><text string="&#x2195;V"><color red="0.7" green="0.7" blue="0.7" /></text></element>
+ <element name="text_l6"><text string="&#x2194;V"><color red="0.7" green="0.7" blue="0.7" /></text></element>
+ <element name="text_l7"><text string="DB"><color red="0.7" green="0.7" blue="0.7" /></text></element>
+ <element name="text_l8"><text string="RD"><color red="0.7" green="0.7" blue="0.7" /></text></element>
+
+ <element name="text_b1"><text string="RE"><color red="0.7" green="0.7" blue="0.7" /></text></element>
+ <element name="text_b2"><text string="spk"><color red="0.7" green="0.7" blue="0.7" /></text></element>
+ <element name="text_b3"><text string="CL"><color red="0.7" green="0.7" blue="0.7" /></text></element>
+ <element name="text_b4"><text string="EN"><color red="0.7" green="0.7" blue="0.7" /></text></element>
+ <element name="text_b5"><text string="BR"><color red="0.7" green="0.7" blue="0.7" /></text></element>
+ <element name="text_b6"><text string="PB"><color red="0.7" green="0.7" blue="0.7" /></text></element>
+ <element name="text_b7"><text string="DB"><color red="0.7" green="0.7" blue="0.7" /></text></element>
+ <element name="text_b8"><text string="SC"><color red="0.7" green="0.7" blue="0.7" /></text></element>
+ <element name="text_b9"><text string="DL"><color red="0.7" green="0.7" blue="0.7" /></text></element>
+ <element name="text_b10"><text string="CV"><color red="0.7" green="0.7" blue="0.7" /></text></element>
+ <element name="text_b11"><text string="VL"><color red="0.7" green="0.7" blue="0.7" /></text></element>
+ <element name="text_b12"><text string="PL"><color red="0.7" green="0.7" blue="0.7" /></text></element>
+ <element name="text_b13"><text string="&#x2663;"><color red="0.7" green="0.7" blue="0.7" /></text></element>
+ <element name="text_b14"><text string="&#x2666;"><color red="0.7" green="0.7" blue="0.7" /></text></element>
+ <element name="text_b15"><text string="&#x2665;"><color red="0.7" green="0.7" blue="0.7" /></text></element>
+ <element name="text_b16"><text string="&#x2660;"><color red="0.7" green="0.7" blue="0.7" /></text></element>
+ <element name="text_b17"><text string="J"><color red="0.7" green="0.7" blue="0.7" /></text></element>
+ <element name="text_b18"><text string="Q"><color red="0.7" green="0.7" blue="0.7" /></text></element>
+ <element name="text_b19"><text string="K"><color red="0.7" green="0.7" blue="0.7" /></text></element>
+ <element name="text_b20"><text string="A"><color red="0.7" green="0.7" blue="0.7" /></text></element>
+ <element name="text_b21"><text string="7"><color red="0.7" green="0.7" blue="0.7" /></text></element>
+ <element name="text_b22"><text string="8"><color red="0.7" green="0.7" blue="0.7" /></text></element>
+ <element name="text_b23"><text string="9"><color red="0.7" green="0.7" blue="0.7" /></text></element>
+ <element name="text_b24"><text string="10"><color red="0.7" green="0.7" blue="0.7" /></text></element>
+ <element name="text_b25"><text string="3"><color red="0.7" green="0.7" blue="0.7" /></text></element>
+ <element name="text_b26"><text string="4"><color red="0.7" green="0.7" blue="0.7" /></text></element>
+ <element name="text_b27"><text string="5"><color red="0.7" green="0.7" blue="0.7" /></text></element>
+ <element name="text_b28"><text string="6"><color red="0.7" green="0.7" blue="0.7" /></text></element>
+ <element name="text_b29"><text string="NT"><color red="0.7" green="0.7" blue="0.7" /></text></element>
+ <element name="text_b30"><text string="P"><color red="0.7" green="0.7" blue="0.7" /></text></element>
+ <element name="text_b31"><text string="1"><color red="0.7" green="0.7" blue="0.7" /></text></element>
+ <element name="text_b32"><text string="2"><color red="0.7" green="0.7" blue="0.7" /></text></element>
+
+ <element name="white"><rect><color red="0.9" green="0.9" blue="0.9" /></rect></element>
+ <element name="edge1"><rect><color red="0.15" green="0.15" blue="0.15" /></rect></element>
+ <element name="edge2"><rect><color red="0.35" green="0.35" blue="0.35" /></rect></element>
+ <element name="gray"><rect><color red="0.4" green="0.4" blue="0.4" /></rect></element>
+ <element name="blackb"><rect><color red="0" green="0" blue="0" /></rect></element>
+
+ <element name="text_scan">
+ <rect><color red="0.0" green="0.0" blue="0.0" /></rect>
+ <text string="card scanner"><color red="0.4" green="0.4" blue="0.4" /></text>
+ </element>
+
+ <element name="nothing" defstate="0">
+ <text string=" "><color red="0.0" green="0.0" blue="0.0" /></text>
+ </element>
+
+ <element name="cba">
+ <rect><color red="0.9" green="0.9" blue="0.9" /></rect>
+ <text string="A" align="1"><color red="0.1" green="0.1" blue="0.1" /></text>
+ </element>
+ <element name="cb2">
+ <rect><color red="0.9" green="0.9" blue="0.9" /></rect>
+ <text string="2" align="1"><color red="0.1" green="0.1" blue="0.1" /></text>
+ </element>
+ <element name="cb3">
+ <rect><color red="0.9" green="0.9" blue="0.9" /></rect>
+ <text string="3" align="1"><color red="0.1" green="0.1" blue="0.1" /></text>
+ </element>
+ <element name="cb4">
+ <rect><color red="0.9" green="0.9" blue="0.9" /></rect>
+ <text string="4" align="1"><color red="0.1" green="0.1" blue="0.1" /></text>
+ </element>
+ <element name="cb5">
+ <rect><color red="0.9" green="0.9" blue="0.9" /></rect>
+ <text string="5" align="1"><color red="0.1" green="0.1" blue="0.1" /></text>
+ </element>
+ <element name="cb6">
+ <rect><color red="0.9" green="0.9" blue="0.9" /></rect>
+ <text string="6" align="1"><color red="0.1" green="0.1" blue="0.1" /></text>
+ </element>
+ <element name="cb7">
+ <rect><color red="0.9" green="0.9" blue="0.9" /></rect>
+ <text string="7" align="1"><color red="0.1" green="0.1" blue="0.1" /></text>
+ </element>
+ <element name="cb8">
+ <rect><color red="0.9" green="0.9" blue="0.9" /></rect>
+ <text string="8" align="1"><color red="0.1" green="0.1" blue="0.1" /></text>
+ </element>
+ <element name="cb9">
+ <rect><color red="0.9" green="0.9" blue="0.9" /></rect>
+ <text string="9" align="1"><color red="0.1" green="0.1" blue="0.1" /></text>
+ </element>
+ <element name="cb0">
+ <rect><color red="0.9" green="0.9" blue="0.9" /></rect>
+ <text string="10" align="1"><color red="0.1" green="0.1" blue="0.1" /></text>
+ </element>
+ <element name="cbj">
+ <rect><color red="0.9" green="0.9" blue="0.9" /></rect>
+ <text string="J" align="1"><color red="0.1" green="0.1" blue="0.1" /></text>
+ </element>
+ <element name="cbq">
+ <rect><color red="0.9" green="0.9" blue="0.9" /></rect>
+ <text string="Q" align="1"><color red="0.1" green="0.1" blue="0.1" /></text>
+ </element>
+ <element name="cbk">
+ <rect><color red="0.9" green="0.9" blue="0.9" /></rect>
+ <text string="K" align="1"><color red="0.1" green="0.1" blue="0.1" /></text>
+ </element>
+
+ <element name="cra">
+ <rect><color red="0.9" green="0.9" blue="0.9" /></rect>
+ <text string="A" align="1"><color red="0.8" green="0.1" blue="0.1" /></text>
+ </element>
+ <element name="cr2">
+ <rect><color red="0.9" green="0.9" blue="0.9" /></rect>
+ <text string="2" align="1"><color red="0.8" green="0.1" blue="0.1" /></text>
+ </element>
+ <element name="cr3">
+ <rect><color red="0.9" green="0.9" blue="0.9" /></rect>
+ <text string="3" align="1"><color red="0.8" green="0.1" blue="0.1" /></text>
+ </element>
+ <element name="cr4">
+ <rect><color red="0.9" green="0.9" blue="0.9" /></rect>
+ <text string="4" align="1"><color red="0.8" green="0.1" blue="0.1" /></text>
+ </element>
+ <element name="cr5">
+ <rect><color red="0.9" green="0.9" blue="0.9" /></rect>
+ <text string="5" align="1"><color red="0.8" green="0.1" blue="0.1" /></text>
+ </element>
+ <element name="cr6">
+ <rect><color red="0.9" green="0.9" blue="0.9" /></rect>
+ <text string="6" align="1"><color red="0.8" green="0.1" blue="0.1" /></text>
+ </element>
+ <element name="cr7">
+ <rect><color red="0.9" green="0.9" blue="0.9" /></rect>
+ <text string="7" align="1"><color red="0.8" green="0.1" blue="0.1" /></text>
+ </element>
+ <element name="cr8">
+ <rect><color red="0.9" green="0.9" blue="0.9" /></rect>
+ <text string="8" align="1"><color red="0.8" green="0.1" blue="0.1" /></text>
+ </element>
+ <element name="cr9">
+ <rect><color red="0.9" green="0.9" blue="0.9" /></rect>
+ <text string="9" align="1"><color red="0.8" green="0.1" blue="0.1" /></text>
+ </element>
+ <element name="cr0">
+ <rect><color red="0.9" green="0.9" blue="0.9" /></rect>
+ <text string="10" align="1"><color red="0.8" green="0.1" blue="0.1" /></text>
+ </element>
+ <element name="crj">
+ <rect><color red="0.9" green="0.9" blue="0.9" /></rect>
+ <text string="J" align="1"><color red="0.8" green="0.1" blue="0.1" /></text>
+ </element>
+ <element name="crq">
+ <rect><color red="0.9" green="0.9" blue="0.9" /></rect>
+ <text string="Q" align="1"><color red="0.8" green="0.1" blue="0.1" /></text>
+ </element>
+ <element name="crk">
+ <rect><color red="0.9" green="0.9" blue="0.9" /></rect>
+ <text string="K" align="1"><color red="0.8" green="0.1" blue="0.1" /></text>
+ </element>
+
+ <element name="csh">
+ <rect><color red="0.9" green="0.9" blue="0.9" /></rect>
+ <text align="2" string="&#x2665;"><color red="0.8" green="0.1" blue="0.1" /></text>
+ </element>
+ <element name="csd">
+ <rect><color red="0.9" green="0.9" blue="0.9" /></rect>
+ <text align="2" string="&#x2666;"><color red="0.8" green="0.1" blue="0.1" /></text>
+ </element>
+ <element name="csc">
+ <rect><color red="0.9" green="0.9" blue="0.9" /></rect>
+ <text align="2" string="&#x2663;"><color red="0.1" green="0.1" blue="0.1" /></text>
+ </element>
+ <element name="css">
+ <rect><color red="0.9" green="0.9" blue="0.9" /></rect>
+ <text align="2" string="&#x2660;"><color red="0.1" green="0.1" blue="0.1" /></text>
+ </element>
+
+ <element name="cbjk">
+ <rect><color red="0.9" green="0.9" blue="0.9" /></rect>
+ <text string="&#x263a;"><color red="0.1" green="0.1" blue="0.1" /></text>
+ </element>
+ <element name="crjk">
+ <rect><color red="0.9" green="0.9" blue="0.9" /></rect>
+ <text string="&#x263a;"><color red="0.8" green="0.1" blue="0.1" /></text>
+ </element>
+
+
+<!-- build screen -->
+
+ <view name="Internal Layout">
+ <bounds left="-1" right="53" top="6" bottom="54" />
+
+ <!-- leds -->
+
+ <bezel name="7.15" element="led"><bounds x="1.25" y="8.5" width="1.5" height="1.5" /></bezel>
+ <bezel name="6.15" element="led"><bounds x="8.11" y="8.5" width="1.5" height="1.5" /></bezel>
+ <bezel name="5.15" element="led"><bounds x="14.96" y="8.5" width="1.5" height="1.5" /></bezel>
+ <bezel name="4.15" element="led"><bounds x="21.82" y="8.5" width="1.5" height="1.5" /></bezel>
+ <bezel name="3.15" element="led"><bounds x="28.68" y="8.5" width="1.5" height="1.5" /></bezel>
+ <bezel name="2.15" element="led"><bounds x="35.54" y="8.5" width="1.5" height="1.5" /></bezel>
+ <bezel name="1.15" element="led"><bounds x="42.39" y="8.5" width="1.5" height="1.5" /></bezel>
+ <bezel name="0.15" element="led"><bounds x="49.25" y="8.5" width="1.5" height="1.5" /></bezel>
+
+ <bezel element="text_l1"><bounds x="-0.75" y="7" width="5.5" height="1.4" /></bezel>
+ <bezel element="text_l2"><bounds x="6.11" y="7" width="5.5" height="1.4" /></bezel>
+ <bezel element="text_l3"><bounds x="12.96" y="7" width="5.5" height="1.4" /></bezel>
+ <bezel element="text_l4"><bounds x="19.82" y="7" width="5.5" height="1.4" /></bezel>
+ <bezel element="text_l5"><bounds x="26.68" y="7" width="5.5" height="1.4" /></bezel>
+ <bezel element="text_l6"><bounds x="33.54" y="7" width="5.5" height="1.4" /></bezel>
+ <bezel element="text_l7"><bounds x="40.39" y="7" width="5.5" height="1.4" /></bezel>
+ <bezel element="text_l8"><bounds x="47.25" y="7" width="5.5" height="1.4" /></bezel>
+
+ <!-- vfd -->
+
+ <bezel name="digit0" element="digit"><bounds x="0" y="12" width="2.75" height="4.125" /></bezel>
+ <bezel name="digit1" element="digit"><bounds x="2.75" y="12" width="2.75" height="4.125" /></bezel>
+ <bezel name="digit2" element="digit"><bounds x="5.50" y="12" width="2.75" height="4.125" /></bezel>
+ <bezel name="digit3" element="digit"><bounds x="8.25" y="12" width="2.75" height="4.125" /></bezel>
+ <bezel name="digit4" element="digit"><bounds x="11.00" y="12" width="2.75" height="4.125" /></bezel>
+ <bezel name="digit5" element="digit"><bounds x="13.75" y="12" width="2.75" height="4.125" /></bezel>
+ <bezel name="digit6" element="digit"><bounds x="16.50" y="12" width="2.75" height="4.125" /></bezel>
+ <bezel name="digit7" element="digit"><bounds x="19.25" y="12" width="2.75" height="4.125" /></bezel>
+
+ <!-- button panel -->
+
+ <bezel element="button" inputtag="RESET" inputmask="0x01"><bounds x="0" y="20" width="4" height="3" /></bezel>
+ <bezel element="button" inputtag="IN.6" inputmask="0x01"><bounds x="6" y="20" width="4" height="3" /></bezel>
+ <bezel element="button" inputtag="IN.5" inputmask="0x01"><bounds x="12" y="20" width="4" height="3" /></bezel>
+ <bezel element="button" inputtag="IN.4" inputmask="0x01"><bounds x="18" y="20" width="4" height="3" /></bezel>
+
+ <bezel element="button" inputtag="IN.7" inputmask="0x02"><bounds x="0" y="25" width="4" height="3" /></bezel>
+ <bezel element="button" inputtag="IN.6" inputmask="0x02"><bounds x="6" y="25" width="4" height="3" /></bezel>
+ <bezel element="button" inputtag="IN.5" inputmask="0x02"><bounds x="12" y="25" width="4" height="3" /></bezel>
+ <bezel element="button" inputtag="IN.4" inputmask="0x02"><bounds x="18" y="25" width="4" height="3" /></bezel>
+
+ <bezel element="button" inputtag="IN.7" inputmask="0x04"><bounds x="0" y="30" width="4" height="3" /></bezel>
+ <bezel element="button" inputtag="IN.6" inputmask="0x04"><bounds x="6" y="30" width="4" height="3" /></bezel>
+ <bezel element="button" inputtag="IN.5" inputmask="0x04"><bounds x="12" y="30" width="4" height="3" /></bezel>
+ <bezel element="button" inputtag="IN.4" inputmask="0x04"><bounds x="18" y="30" width="4" height="3" /></bezel>
+
+ <bezel element="button" inputtag="IN.7" inputmask="0x08"><bounds x="0" y="35" width="4" height="3" /></bezel>
+ <bezel element="button" inputtag="IN.6" inputmask="0x08"><bounds x="6" y="35" width="4" height="3" /></bezel>
+ <bezel element="button" inputtag="IN.5" inputmask="0x08"><bounds x="12" y="35" width="4" height="3" /></bezel>
+ <bezel element="button" inputtag="IN.4" inputmask="0x08"><bounds x="18" y="35" width="4" height="3" /></bezel>
+
+ <bezel element="text_b1"><bounds x="-2" y="18.45" width="8" height="1.4" /></bezel>
+ <bezel element="text_b2"><bounds x="4" y="18.45" width="8" height="1.4" /></bezel>
+ <bezel element="text_b3"><bounds x="10" y="18.45" width="8" height="1.4" /></bezel>
+ <bezel element="text_b4"><bounds x="16" y="18.45" width="8" height="1.4" /></bezel>
+
+ <bezel element="text_b5"><bounds x="-2" y="23.45" width="8" height="1.4" /></bezel>
+ <bezel element="text_b6"><bounds x="4" y="23.45" width="8" height="1.4" /></bezel>
+ <bezel element="text_b7"><bounds x="10" y="23.45" width="8" height="1.4" /></bezel>
+ <bezel element="text_b8"><bounds x="16" y="23.45" width="8" height="1.4" /></bezel>
+
+ <bezel element="text_b9"><bounds x="-2" y="28.45" width="8" height="1.4" /></bezel>
+ <bezel element="text_b10"><bounds x="4" y="28.45" width="8" height="1.4" /></bezel>
+ <bezel element="text_b11"><bounds x="10" y="28.45" width="8" height="1.4" /></bezel>
+ <bezel element="text_b12"><bounds x="16" y="28.45" width="8" height="1.4" /></bezel>
+
+ <bezel element="text_b13"><bounds x="-2" y="33.3" width="8" height="1.6" /></bezel>
+ <bezel element="text_b14"><bounds x="4" y="33.3" width="8" height="1.6" /></bezel>
+ <bezel element="text_b15"><bounds x="10" y="33.3" width="8" height="1.6" /></bezel>
+ <bezel element="text_b16"><bounds x="16" y="33.3" width="8" height="1.6" /></bezel>
+
+ <bezel element="button" inputtag="IN.3" inputmask="0x01"><bounds x="30" y="20" width="4" height="3" /></bezel>
+ <bezel element="button" inputtag="IN.2" inputmask="0x01"><bounds x="36" y="20" width="4" height="3" /></bezel>
+ <bezel element="button" inputtag="IN.1" inputmask="0x01"><bounds x="42" y="20" width="4" height="3" /></bezel>
+ <bezel element="button" inputtag="IN.0" inputmask="0x01"><bounds x="48" y="20" width="4" height="3" /></bezel>
+
+ <bezel element="button" inputtag="IN.3" inputmask="0x02"><bounds x="30" y="25" width="4" height="3" /></bezel>
+ <bezel element="button" inputtag="IN.2" inputmask="0x02"><bounds x="36" y="25" width="4" height="3" /></bezel>
+ <bezel element="button" inputtag="IN.1" inputmask="0x02"><bounds x="42" y="25" width="4" height="3" /></bezel>
+ <bezel element="button" inputtag="IN.0" inputmask="0x02"><bounds x="48" y="25" width="4" height="3" /></bezel>
+
+ <bezel element="button" inputtag="IN.3" inputmask="0x04"><bounds x="30" y="30" width="4" height="3" /></bezel>
+ <bezel element="button" inputtag="IN.2" inputmask="0x04"><bounds x="36" y="30" width="4" height="3" /></bezel>
+ <bezel element="button" inputtag="IN.1" inputmask="0x04"><bounds x="42" y="30" width="4" height="3" /></bezel>
+ <bezel element="button" inputtag="IN.0" inputmask="0x04"><bounds x="48" y="30" width="4" height="3" /></bezel>
+
+ <bezel element="button" inputtag="IN.3" inputmask="0x08"><bounds x="30" y="35" width="4" height="3" /></bezel>
+ <bezel element="button" inputtag="IN.2" inputmask="0x08"><bounds x="36" y="35" width="4" height="3" /></bezel>
+ <bezel element="button" inputtag="IN.1" inputmask="0x08"><bounds x="42" y="35" width="4" height="3" /></bezel>
+ <bezel element="button" inputtag="IN.0" inputmask="0x08"><bounds x="48" y="35" width="4" height="3" /></bezel>
+
+ <bezel element="text_b17"><bounds x="28" y="18.45" width="8" height="1.4" /></bezel>
+ <bezel element="text_b18"><bounds x="34" y="18.45" width="8" height="1.4" /></bezel>
+ <bezel element="text_b19"><bounds x="40" y="18.45" width="8" height="1.4" /></bezel>
+ <bezel element="text_b20"><bounds x="46" y="18.45" width="8" height="1.4" /></bezel>
+
+ <bezel element="text_b21"><bounds x="28" y="23.45" width="8" height="1.4" /></bezel>
+ <bezel element="text_b22"><bounds x="34" y="23.45" width="8" height="1.4" /></bezel>
+ <bezel element="text_b23"><bounds x="40" y="23.45" width="8" height="1.4" /></bezel>
+ <bezel element="text_b24"><bounds x="46" y="23.45" width="8" height="1.4" /></bezel>
+
+ <bezel element="text_b25"><bounds x="28" y="28.45" width="8" height="1.4" /></bezel>
+ <bezel element="text_b26"><bounds x="34" y="28.45" width="8" height="1.4" /></bezel>
+ <bezel element="text_b27"><bounds x="40" y="28.45" width="8" height="1.4" /></bezel>
+ <bezel element="text_b28"><bounds x="46" y="28.45" width="8" height="1.4" /></bezel>
+
+ <bezel element="text_b29"><bounds x="28" y="33.45" width="8" height="1.4" /></bezel>
+ <bezel element="text_b30"><bounds x="34" y="33.45" width="8" height="1.4" /></bezel>
+ <bezel element="text_b31"><bounds x="40" y="33.45" width="8" height="1.4" /></bezel>
+ <bezel element="text_b32"><bounds x="46" y="33.45" width="8" height="1.4" /></bezel>
+
+ <!-- cards (common ordering, even though in in bridge the ace is the highest) -->
+
+ <bezel element="gray"><bounds x="-0.5" y="39.7" width="18" height="0.2" /></bezel>
+ <bezel element="text_scan"><bounds x="4" y="39" width="8" height="1.4" /></bezel>
+
+ <bezel element="white"><bounds x="0" y="41" width="14" height="15" /></bezel>
+ <bezel element="white"><bounds x="15" y="41" width="2" height="15" /></bezel>
+
+ <bezel element="cba"><bounds x="0.15" y="41.5" width="1.8" height="1.3" /></bezel>
+ <bezel element="cb2"><bounds x="1.15" y="41.5" width="1.8" height="1.3" /></bezel>
+ <bezel element="cb3"><bounds x="2.15" y="41.5" width="1.8" height="1.3" /></bezel>
+ <bezel element="cb4"><bounds x="3.15" y="41.5" width="1.8" height="1.3" /></bezel>
+ <bezel element="cb5"><bounds x="4.08" y="41.5" width="1.8" height="1.3" /></bezel>
+ <bezel element="cb6"><bounds x="5.15" y="41.5" width="1.8" height="1.3" /></bezel>
+ <bezel element="cb7"><bounds x="6.15" y="41.5" width="1.8" height="1.3" /></bezel>
+ <bezel element="cb8"><bounds x="7.15" y="41.5" width="1.8" height="1.3" /></bezel>
+ <bezel element="cb9"><bounds x="8.15" y="41.5" width="1.8" height="1.3" /></bezel>
+ <bezel element="cb0"><bounds x="9.15" y="41.5" width="1.8" height="1.3" /></bezel>
+ <bezel element="white"><bounds x="10" y="41.5" width="2" height="2" /></bezel>
+ <bezel element="cbj"><bounds x="10.15" y="41.5" width="1.8" height="1.3" /></bezel>
+ <bezel element="cbq"><bounds x="11.15" y="41.5" width="1.8" height="1.3" /></bezel>
+ <bezel element="cbk"><bounds x="12.15" y="41.5" width="1.8" height="1.3" /></bezel>
+ <bezel element="css"><bounds x="12.05" y="42.81" width="1.8" height="1.5" /></bezel>
+
+ <bezel element="cra"><bounds x="0.15" y="44.5" width="1.8" height="1.3" /></bezel>
+ <bezel element="cr2"><bounds x="1.15" y="44.5" width="1.8" height="1.3" /></bezel>
+ <bezel element="cr3"><bounds x="2.15" y="44.5" width="1.8" height="1.3" /></bezel>
+ <bezel element="cr4"><bounds x="3.15" y="44.5" width="1.8" height="1.3" /></bezel>
+ <bezel element="cr5"><bounds x="4.08" y="44.5" width="1.8" height="1.3" /></bezel>
+ <bezel element="cr6"><bounds x="5.15" y="44.5" width="1.8" height="1.3" /></bezel>
+ <bezel element="cr7"><bounds x="6.15" y="44.5" width="1.8" height="1.3" /></bezel>
+ <bezel element="cr8"><bounds x="7.15" y="44.5" width="1.8" height="1.3" /></bezel>
+ <bezel element="cr9"><bounds x="8.15" y="44.5" width="1.8" height="1.3" /></bezel>
+ <bezel element="cr0"><bounds x="9.15" y="44.5" width="1.8" height="1.3" /></bezel>
+ <bezel element="white"><bounds x="10" y="44.5" width="2" height="2" /></bezel>
+ <bezel element="crj"><bounds x="10.15" y="44.5" width="1.8" height="1.3" /></bezel>
+ <bezel element="crq"><bounds x="11.15" y="44.5" width="1.8" height="1.3" /></bezel>
+ <bezel element="crk"><bounds x="12.15" y="44.5" width="1.8" height="1.3" /></bezel>
+ <bezel element="csh"><bounds x="12.05" y="45.81" width="1.8" height="1.5" /></bezel>
+
+ <bezel element="cba"><bounds x="0.15" y="47.5" width="1.8" height="1.3" /></bezel>
+ <bezel element="cb2"><bounds x="1.15" y="47.5" width="1.8" height="1.3" /></bezel>
+ <bezel element="cb3"><bounds x="2.15" y="47.5" width="1.8" height="1.3" /></bezel>
+ <bezel element="cb4"><bounds x="3.15" y="47.5" width="1.8" height="1.3" /></bezel>
+ <bezel element="cb5"><bounds x="4.08" y="47.5" width="1.8" height="1.3" /></bezel>
+ <bezel element="cb6"><bounds x="5.15" y="47.5" width="1.8" height="1.3" /></bezel>
+ <bezel element="cb7"><bounds x="6.15" y="47.5" width="1.8" height="1.3" /></bezel>
+ <bezel element="cb8"><bounds x="7.15" y="47.5" width="1.8" height="1.3" /></bezel>
+ <bezel element="cb9"><bounds x="8.15" y="47.5" width="1.8" height="1.3" /></bezel>
+ <bezel element="cb0"><bounds x="9.15" y="47.5" width="1.8" height="1.3" /></bezel>
+ <bezel element="white"><bounds x="10" y="47.5" width="2" height="2" /></bezel>
+ <bezel element="cbj"><bounds x="10.15" y="47.5" width="1.8" height="1.3" /></bezel>
+ <bezel element="cbq"><bounds x="11.15" y="47.5" width="1.8" height="1.3" /></bezel>
+ <bezel element="cbk"><bounds x="12.15" y="47.5" width="1.8" height="1.3" /></bezel>
+ <bezel element="csc"><bounds x="12.05" y="48.81" width="1.8" height="1.5" /></bezel>
+
+ <bezel element="cra"><bounds x="0.15" y="50.5" width="1.8" height="1.3" /></bezel>
+ <bezel element="cr2"><bounds x="1.15" y="50.5" width="1.8" height="1.3" /></bezel>
+ <bezel element="cr3"><bounds x="2.15" y="50.5" width="1.8" height="1.3" /></bezel>
+ <bezel element="cr4"><bounds x="3.15" y="50.5" width="1.8" height="1.3" /></bezel>
+ <bezel element="cr5"><bounds x="4.08" y="50.5" width="1.8" height="1.3" /></bezel>
+ <bezel element="cr6"><bounds x="5.15" y="50.5" width="1.8" height="1.3" /></bezel>
+ <bezel element="cr7"><bounds x="6.15" y="50.5" width="1.8" height="1.3" /></bezel>
+ <bezel element="cr8"><bounds x="7.15" y="50.5" width="1.8" height="1.3" /></bezel>
+ <bezel element="cr9"><bounds x="8.15" y="50.5" width="1.8" height="1.3" /></bezel>
+ <bezel element="cr0"><bounds x="9.15" y="50.5" width="1.8" height="1.3" /></bezel>
+ <bezel element="white"><bounds x="10" y="50.5" width="2" height="2" /></bezel>
+ <bezel element="crj"><bounds x="10.15" y="50.5" width="1.8" height="1.3" /></bezel>
+ <bezel element="crq"><bounds x="11.15" y="50.5" width="1.8" height="1.3" /></bezel>
+ <bezel element="crk"><bounds x="12.15" y="50.5" width="1.8" height="1.3" /></bezel>
+ <bezel element="csd"><bounds x="12.05" y="51.81" width="1.8" height="1.5" /></bezel>
+
+ <bezel element="cbjk"><bounds x="15.1" y="42" width="1.8" height="1.5" /></bezel>
+ <bezel element="crjk"><bounds x="15.1" y="45" width="1.8" height="1.5" /></bezel>
+
+ <bezel element="edge1"><bounds x="0.95" y="41" width="0.08" height="15" /></bezel>
+ <bezel element="edge2"><bounds x="1.00" y="41" width="0.06" height="15" /></bezel>
+ <bezel element="edge1"><bounds x="1.95" y="41" width="0.08" height="15" /></bezel>
+ <bezel element="edge2"><bounds x="2.00" y="41" width="0.06" height="15" /></bezel>
+ <bezel element="edge1"><bounds x="2.95" y="41" width="0.08" height="15" /></bezel>
+ <bezel element="edge2"><bounds x="3.00" y="41" width="0.06" height="15" /></bezel>
+ <bezel element="edge1"><bounds x="3.95" y="41" width="0.08" height="15" /></bezel>
+ <bezel element="edge2"><bounds x="4.00" y="41" width="0.06" height="15" /></bezel>
+ <bezel element="edge1"><bounds x="4.95" y="41" width="0.08" height="15" /></bezel>
+ <bezel element="edge2"><bounds x="5.00" y="41" width="0.06" height="15" /></bezel>
+ <bezel element="edge1"><bounds x="5.95" y="41" width="0.08" height="15" /></bezel>
+ <bezel element="edge2"><bounds x="6.00" y="41" width="0.06" height="15" /></bezel>
+ <bezel element="edge1"><bounds x="6.95" y="41" width="0.08" height="15" /></bezel>
+ <bezel element="edge2"><bounds x="7.00" y="41" width="0.06" height="15" /></bezel>
+ <bezel element="edge1"><bounds x="7.95" y="41" width="0.08" height="15" /></bezel>
+ <bezel element="edge2"><bounds x="8.00" y="41" width="0.06" height="15" /></bezel>
+ <bezel element="edge1"><bounds x="8.95" y="41" width="0.08" height="15" /></bezel>
+ <bezel element="edge2"><bounds x="9.00" y="41" width="0.06" height="15" /></bezel>
+ <bezel element="edge1"><bounds x="9.95" y="41" width="0.08" height="15" /></bezel>
+ <bezel element="edge2"><bounds x="10.00" y="41" width="0.06" height="15" /></bezel>
+ <bezel element="edge1"><bounds x="10.95" y="41" width="0.08" height="15" /></bezel>
+ <bezel element="edge2"><bounds x="11.00" y="41" width="0.06" height="15" /></bezel>
+ <bezel element="edge1"><bounds x="11.95" y="41" width="0.08" height="15" /></bezel>
+ <bezel element="edge2"><bounds x="12.00" y="41" width="0.06" height="15" /></bezel>
+
+ <bezel element="nothing" inputtag="CARDS.0" inputmask="0x0001"><bounds x="0" y="41.5" width="1" height="2.7" /></bezel>
+ <bezel element="nothing" inputtag="CARDS.0" inputmask="0x0002"><bounds x="1" y="41.5" width="1" height="2.7" /></bezel>
+ <bezel element="nothing" inputtag="CARDS.0" inputmask="0x0004"><bounds x="2" y="41.5" width="1" height="2.7" /></bezel>
+ <bezel element="nothing" inputtag="CARDS.0" inputmask="0x0008"><bounds x="3" y="41.5" width="1" height="2.7" /></bezel>
+ <bezel element="nothing" inputtag="CARDS.0" inputmask="0x0010"><bounds x="4" y="41.5" width="1" height="2.7" /></bezel>
+ <bezel element="nothing" inputtag="CARDS.0" inputmask="0x0020"><bounds x="5" y="41.5" width="1" height="2.7" /></bezel>
+ <bezel element="nothing" inputtag="CARDS.0" inputmask="0x0040"><bounds x="6" y="41.5" width="1" height="2.7" /></bezel>
+ <bezel element="nothing" inputtag="CARDS.0" inputmask="0x0080"><bounds x="7" y="41.5" width="1" height="2.7" /></bezel>
+ <bezel element="nothing" inputtag="CARDS.0" inputmask="0x0100"><bounds x="8" y="41.5" width="1" height="2.7" /></bezel>
+ <bezel element="nothing" inputtag="CARDS.0" inputmask="0x0200"><bounds x="9" y="41.5" width="1" height="2.7" /></bezel>
+ <bezel element="nothing" inputtag="CARDS.0" inputmask="0x0400"><bounds x="10" y="41.5" width="1" height="2.7" /></bezel>
+ <bezel element="nothing" inputtag="CARDS.0" inputmask="0x0800"><bounds x="11" y="41.5" width="1" height="2.7" /></bezel>
+ <bezel element="nothing" inputtag="CARDS.0" inputmask="0x1000"><bounds x="12" y="41.5" width="2" height="2.7" /></bezel>
+
+ <bezel element="nothing" inputtag="CARDS.1" inputmask="0x0001"><bounds x="0" y="44.5" width="1" height="2.7" /></bezel>
+ <bezel element="nothing" inputtag="CARDS.1" inputmask="0x0002"><bounds x="1" y="44.5" width="1" height="2.7" /></bezel>
+ <bezel element="nothing" inputtag="CARDS.1" inputmask="0x0004"><bounds x="2" y="44.5" width="1" height="2.7" /></bezel>
+ <bezel element="nothing" inputtag="CARDS.1" inputmask="0x0008"><bounds x="3" y="44.5" width="1" height="2.7" /></bezel>
+ <bezel element="nothing" inputtag="CARDS.1" inputmask="0x0010"><bounds x="4" y="44.5" width="1" height="2.7" /></bezel>
+ <bezel element="nothing" inputtag="CARDS.1" inputmask="0x0020"><bounds x="5" y="44.5" width="1" height="2.7" /></bezel>
+ <bezel element="nothing" inputtag="CARDS.1" inputmask="0x0040"><bounds x="6" y="44.5" width="1" height="2.7" /></bezel>
+ <bezel element="nothing" inputtag="CARDS.1" inputmask="0x0080"><bounds x="7" y="44.5" width="1" height="2.7" /></bezel>
+ <bezel element="nothing" inputtag="CARDS.1" inputmask="0x0100"><bounds x="8" y="44.5" width="1" height="2.7" /></bezel>
+ <bezel element="nothing" inputtag="CARDS.1" inputmask="0x0200"><bounds x="9" y="44.5" width="1" height="2.7" /></bezel>
+ <bezel element="nothing" inputtag="CARDS.1" inputmask="0x0400"><bounds x="10" y="44.5" width="1" height="2.7" /></bezel>
+ <bezel element="nothing" inputtag="CARDS.1" inputmask="0x0800"><bounds x="11" y="44.5" width="1" height="2.7" /></bezel>
+ <bezel element="nothing" inputtag="CARDS.1" inputmask="0x1000"><bounds x="12" y="44.5" width="2" height="2.7" /></bezel>
+
+ <bezel element="nothing" inputtag="CARDS.2" inputmask="0x0001"><bounds x="0" y="47.5" width="1" height="2.7" /></bezel>
+ <bezel element="nothing" inputtag="CARDS.2" inputmask="0x0002"><bounds x="1" y="47.5" width="1" height="2.7" /></bezel>
+ <bezel element="nothing" inputtag="CARDS.2" inputmask="0x0004"><bounds x="2" y="47.5" width="1" height="2.7" /></bezel>
+ <bezel element="nothing" inputtag="CARDS.2" inputmask="0x0008"><bounds x="3" y="47.5" width="1" height="2.7" /></bezel>
+ <bezel element="nothing" inputtag="CARDS.2" inputmask="0x0010"><bounds x="4" y="47.5" width="1" height="2.7" /></bezel>
+ <bezel element="nothing" inputtag="CARDS.2" inputmask="0x0020"><bounds x="5" y="47.5" width="1" height="2.7" /></bezel>
+ <bezel element="nothing" inputtag="CARDS.2" inputmask="0x0040"><bounds x="6" y="47.5" width="1" height="2.7" /></bezel>
+ <bezel element="nothing" inputtag="CARDS.2" inputmask="0x0080"><bounds x="7" y="47.5" width="1" height="2.7" /></bezel>
+ <bezel element="nothing" inputtag="CARDS.2" inputmask="0x0100"><bounds x="8" y="47.5" width="1" height="2.7" /></bezel>
+ <bezel element="nothing" inputtag="CARDS.2" inputmask="0x0200"><bounds x="9" y="47.5" width="1" height="2.7" /></bezel>
+ <bezel element="nothing" inputtag="CARDS.2" inputmask="0x0400"><bounds x="10" y="47.5" width="1" height="2.7" /></bezel>
+ <bezel element="nothing" inputtag="CARDS.2" inputmask="0x0800"><bounds x="11" y="47.5" width="1" height="2.7" /></bezel>
+ <bezel element="nothing" inputtag="CARDS.2" inputmask="0x1000"><bounds x="12" y="47.5" width="2" height="2.7" /></bezel>
+
+ <bezel element="nothing" inputtag="CARDS.3" inputmask="0x0001"><bounds x="0" y="50.5" width="1" height="2.7" /></bezel>
+ <bezel element="nothing" inputtag="CARDS.3" inputmask="0x0002"><bounds x="1" y="50.5" width="1" height="2.7" /></bezel>
+ <bezel element="nothing" inputtag="CARDS.3" inputmask="0x0004"><bounds x="2" y="50.5" width="1" height="2.7" /></bezel>
+ <bezel element="nothing" inputtag="CARDS.3" inputmask="0x0008"><bounds x="3" y="50.5" width="1" height="2.7" /></bezel>
+ <bezel element="nothing" inputtag="CARDS.3" inputmask="0x0010"><bounds x="4" y="50.5" width="1" height="2.7" /></bezel>
+ <bezel element="nothing" inputtag="CARDS.3" inputmask="0x0020"><bounds x="5" y="50.5" width="1" height="2.7" /></bezel>
+ <bezel element="nothing" inputtag="CARDS.3" inputmask="0x0040"><bounds x="6" y="50.5" width="1" height="2.7" /></bezel>
+ <bezel element="nothing" inputtag="CARDS.3" inputmask="0x0080"><bounds x="7" y="50.5" width="1" height="2.7" /></bezel>
+ <bezel element="nothing" inputtag="CARDS.3" inputmask="0x0100"><bounds x="8" y="50.5" width="1" height="2.7" /></bezel>
+ <bezel element="nothing" inputtag="CARDS.3" inputmask="0x0200"><bounds x="9" y="50.5" width="1" height="2.7" /></bezel>
+ <bezel element="nothing" inputtag="CARDS.3" inputmask="0x0400"><bounds x="10" y="50.5" width="1" height="2.7" /></bezel>
+ <bezel element="nothing" inputtag="CARDS.3" inputmask="0x0800"><bounds x="11" y="50.5" width="1" height="2.7" /></bezel>
+ <bezel element="nothing" inputtag="CARDS.3" inputmask="0x1000"><bounds x="12" y="50.5" width="2" height="2.7" /></bezel>
+
+ <bezel element="nothing" inputtag="CARDS.0" inputmask="0x2000"><bounds x="15" y="41.5" width="2" height="2.7" /></bezel>
+ <bezel element="nothing" inputtag="CARDS.0" inputmask="0x4000"><bounds x="15" y="44.5" width="2" height="2.7" /></bezel>
+
+ <bezel element="blackb"><bounds x="0" y="40.5" width="50" height="1" /></bezel>
+ <bezel element="blackb"><bounds x="0" y="44.2" width="50" height="0.3" /></bezel>
+ <bezel element="blackb"><bounds x="0" y="47.2" width="50" height="0.3" /></bezel>
+ <bezel element="blackb"><bounds x="14.9" y="47.3" width="50" height="15" /></bezel>
+ <bezel element="blackb"><bounds x="0" y="50.2" width="50" height="0.3" /></bezel>
+ <bezel element="blackb"><bounds x="0" y="53.2" width="50" height="15" /></bezel>
+
+ </view>
+</mamelayout>
diff --git a/src/mame/layout/fidel_bv3.lay b/src/mame/layout/fidel_bv3.lay
new file mode 100644
index 00000000000..6897b90fe09
--- /dev/null
+++ b/src/mame/layout/fidel_bv3.lay
@@ -0,0 +1,461 @@
+<?xml version="1.0"?>
+<mamelayout version="2">
+
+<!-- define elements -->
+
+ <element name="button" defstate="0">
+ <rect state="0"><color red="0.8" green="0.8" blue="0.7" /></rect>
+ <rect state="1"><color red="0.6" green="0.6" blue="0.5" /></rect>
+ </element>
+
+ <element name="digit" defstate="0">
+ <led14seg><color red="0.2" green="1.0" blue="0.85" /></led14seg>
+ </element>
+
+ <element name="text_b1"><text string="RESET"><color red="0.7" green="0.7" blue="0.7" /></text></element>
+ <element name="text_b2"><text string="spk"><color red="0.7" green="0.7" blue="0.7" /></text></element>
+ <element name="text_b3"><text string="CLEAR"><color red="0.7" green="0.7" blue="0.7" /></text></element>
+ <element name="text_b4"><text string="YES/ENTER"><color red="0.7" green="0.7" blue="0.7" /></text></element>
+ <element name="text_b5"><text string="REVIEW"><color red="0.7" green="0.7" blue="0.7" /></text></element>
+ <element name="text_b6"><text string="AUTO"><color red="0.7" green="0.7" blue="0.7" /></text></element>
+ <element name="text_b7"><text string="DOUBLE"><color red="0.7" green="0.7" blue="0.7" /></text></element>
+ <element name="text_b8"><text string="NO/PASS"><color red="0.7" green="0.7" blue="0.7" /></text></element>
+ <element name="text_b9"><text string="DEALER"><color red="0.7" green="0.7" blue="0.7" /></text></element>
+ <element name="text_b10"><text string="CONV"><color red="0.7" green="0.7" blue="0.7" /></text></element>
+ <element name="text_b11"><text string="SCORE"><color red="0.7" green="0.7" blue="0.7" /></text></element>
+ <element name="text_b12"><text string="PLAYER"><color red="0.7" green="0.7" blue="0.7" /></text></element>
+ <element name="text_b13"><text string="&#x2663;"><color red="0.7" green="0.7" blue="0.7" /></text></element>
+ <element name="text_b14"><text string="&#x2666;"><color red="0.7" green="0.7" blue="0.7" /></text></element>
+ <element name="text_b15"><text string="&#x2665;"><color red="0.7" green="0.7" blue="0.7" /></text></element>
+ <element name="text_b16"><text string="&#x2660;"><color red="0.7" green="0.7" blue="0.7" /></text></element>
+ <element name="text_b17"><text string="JACK"><color red="0.7" green="0.7" blue="0.7" /></text></element>
+ <element name="text_b18"><text string="QUEEN"><color red="0.7" green="0.7" blue="0.7" /></text></element>
+ <element name="text_b19"><text string="KING"><color red="0.7" green="0.7" blue="0.7" /></text></element>
+ <element name="text_b20"><text string="ACE"><color red="0.7" green="0.7" blue="0.7" /></text></element>
+ <element name="text_b21"><text string="7"><color red="0.7" green="0.7" blue="0.7" /></text></element>
+ <element name="text_b22"><text string="8"><color red="0.7" green="0.7" blue="0.7" /></text></element>
+ <element name="text_b23"><text string="9"><color red="0.7" green="0.7" blue="0.7" /></text></element>
+ <element name="text_b24"><text string="10"><color red="0.7" green="0.7" blue="0.7" /></text></element>
+ <element name="text_b25"><text string="3"><color red="0.7" green="0.7" blue="0.7" /></text></element>
+ <element name="text_b26"><text string="4"><color red="0.7" green="0.7" blue="0.7" /></text></element>
+ <element name="text_b27"><text string="5"><color red="0.7" green="0.7" blue="0.7" /></text></element>
+ <element name="text_b28"><text string="6"><color red="0.7" green="0.7" blue="0.7" /></text></element>
+ <element name="text_b29"><text string="NOTRUMP"><color red="0.7" green="0.7" blue="0.7" /></text></element>
+ <element name="text_b30"><text string="QUIT"><color red="0.7" green="0.7" blue="0.7" /></text></element>
+ <element name="text_b31"><text string="1"><color red="0.7" green="0.7" blue="0.7" /></text></element>
+ <element name="text_b32"><text string="2"><color red="0.7" green="0.7" blue="0.7" /></text></element>
+
+ <element name="white"><rect><color red="0.9" green="0.9" blue="0.9" /></rect></element>
+ <element name="edge1"><rect><color red="0.15" green="0.15" blue="0.15" /></rect></element>
+ <element name="edge2"><rect><color red="0.35" green="0.35" blue="0.35" /></rect></element>
+ <element name="gray"><rect><color red="0.4" green="0.4" blue="0.4" /></rect></element>
+ <element name="blackb"><rect><color red="0" green="0" blue="0" /></rect></element>
+
+ <element name="text_scan">
+ <rect><color red="0.0" green="0.0" blue="0.0" /></rect>
+ <text string="card scanner"><color red="0.4" green="0.4" blue="0.4" /></text>
+ </element>
+
+ <element name="nothing" defstate="0">
+ <text string=" "><color red="0.0" green="0.0" blue="0.0" /></text>
+ </element>
+
+ <element name="cba">
+ <rect><color red="0.9" green="0.9" blue="0.9" /></rect>
+ <text string="A" align="1"><color red="0.1" green="0.1" blue="0.1" /></text>
+ </element>
+ <element name="cb2">
+ <rect><color red="0.9" green="0.9" blue="0.9" /></rect>
+ <text string="2" align="1"><color red="0.1" green="0.1" blue="0.1" /></text>
+ </element>
+ <element name="cb3">
+ <rect><color red="0.9" green="0.9" blue="0.9" /></rect>
+ <text string="3" align="1"><color red="0.1" green="0.1" blue="0.1" /></text>
+ </element>
+ <element name="cb4">
+ <rect><color red="0.9" green="0.9" blue="0.9" /></rect>
+ <text string="4" align="1"><color red="0.1" green="0.1" blue="0.1" /></text>
+ </element>
+ <element name="cb5">
+ <rect><color red="0.9" green="0.9" blue="0.9" /></rect>
+ <text string="5" align="1"><color red="0.1" green="0.1" blue="0.1" /></text>
+ </element>
+ <element name="cb6">
+ <rect><color red="0.9" green="0.9" blue="0.9" /></rect>
+ <text string="6" align="1"><color red="0.1" green="0.1" blue="0.1" /></text>
+ </element>
+ <element name="cb7">
+ <rect><color red="0.9" green="0.9" blue="0.9" /></rect>
+ <text string="7" align="1"><color red="0.1" green="0.1" blue="0.1" /></text>
+ </element>
+ <element name="cb8">
+ <rect><color red="0.9" green="0.9" blue="0.9" /></rect>
+ <text string="8" align="1"><color red="0.1" green="0.1" blue="0.1" /></text>
+ </element>
+ <element name="cb9">
+ <rect><color red="0.9" green="0.9" blue="0.9" /></rect>
+ <text string="9" align="1"><color red="0.1" green="0.1" blue="0.1" /></text>
+ </element>
+ <element name="cb0">
+ <rect><color red="0.9" green="0.9" blue="0.9" /></rect>
+ <text string="10" align="1"><color red="0.1" green="0.1" blue="0.1" /></text>
+ </element>
+ <element name="cbj">
+ <rect><color red="0.9" green="0.9" blue="0.9" /></rect>
+ <text string="J" align="1"><color red="0.1" green="0.1" blue="0.1" /></text>
+ </element>
+ <element name="cbq">
+ <rect><color red="0.9" green="0.9" blue="0.9" /></rect>
+ <text string="Q" align="1"><color red="0.1" green="0.1" blue="0.1" /></text>
+ </element>
+ <element name="cbk">
+ <rect><color red="0.9" green="0.9" blue="0.9" /></rect>
+ <text string="K" align="1"><color red="0.1" green="0.1" blue="0.1" /></text>
+ </element>
+
+ <element name="cra">
+ <rect><color red="0.9" green="0.9" blue="0.9" /></rect>
+ <text string="A" align="1"><color red="0.8" green="0.1" blue="0.1" /></text>
+ </element>
+ <element name="cr2">
+ <rect><color red="0.9" green="0.9" blue="0.9" /></rect>
+ <text string="2" align="1"><color red="0.8" green="0.1" blue="0.1" /></text>
+ </element>
+ <element name="cr3">
+ <rect><color red="0.9" green="0.9" blue="0.9" /></rect>
+ <text string="3" align="1"><color red="0.8" green="0.1" blue="0.1" /></text>
+ </element>
+ <element name="cr4">
+ <rect><color red="0.9" green="0.9" blue="0.9" /></rect>
+ <text string="4" align="1"><color red="0.8" green="0.1" blue="0.1" /></text>
+ </element>
+ <element name="cr5">
+ <rect><color red="0.9" green="0.9" blue="0.9" /></rect>
+ <text string="5" align="1"><color red="0.8" green="0.1" blue="0.1" /></text>
+ </element>
+ <element name="cr6">
+ <rect><color red="0.9" green="0.9" blue="0.9" /></rect>
+ <text string="6" align="1"><color red="0.8" green="0.1" blue="0.1" /></text>
+ </element>
+ <element name="cr7">
+ <rect><color red="0.9" green="0.9" blue="0.9" /></rect>
+ <text string="7" align="1"><color red="0.8" green="0.1" blue="0.1" /></text>
+ </element>
+ <element name="cr8">
+ <rect><color red="0.9" green="0.9" blue="0.9" /></rect>
+ <text string="8" align="1"><color red="0.8" green="0.1" blue="0.1" /></text>
+ </element>
+ <element name="cr9">
+ <rect><color red="0.9" green="0.9" blue="0.9" /></rect>
+ <text string="9" align="1"><color red="0.8" green="0.1" blue="0.1" /></text>
+ </element>
+ <element name="cr0">
+ <rect><color red="0.9" green="0.9" blue="0.9" /></rect>
+ <text string="10" align="1"><color red="0.8" green="0.1" blue="0.1" /></text>
+ </element>
+ <element name="crj">
+ <rect><color red="0.9" green="0.9" blue="0.9" /></rect>
+ <text string="J" align="1"><color red="0.8" green="0.1" blue="0.1" /></text>
+ </element>
+ <element name="crq">
+ <rect><color red="0.9" green="0.9" blue="0.9" /></rect>
+ <text string="Q" align="1"><color red="0.8" green="0.1" blue="0.1" /></text>
+ </element>
+ <element name="crk">
+ <rect><color red="0.9" green="0.9" blue="0.9" /></rect>
+ <text string="K" align="1"><color red="0.8" green="0.1" blue="0.1" /></text>
+ </element>
+
+ <element name="csh">
+ <rect><color red="0.9" green="0.9" blue="0.9" /></rect>
+ <text align="2" string="&#x2665;"><color red="0.8" green="0.1" blue="0.1" /></text>
+ </element>
+ <element name="csd">
+ <rect><color red="0.9" green="0.9" blue="0.9" /></rect>
+ <text align="2" string="&#x2666;"><color red="0.8" green="0.1" blue="0.1" /></text>
+ </element>
+ <element name="csc">
+ <rect><color red="0.9" green="0.9" blue="0.9" /></rect>
+ <text align="2" string="&#x2663;"><color red="0.1" green="0.1" blue="0.1" /></text>
+ </element>
+ <element name="css">
+ <rect><color red="0.9" green="0.9" blue="0.9" /></rect>
+ <text align="2" string="&#x2660;"><color red="0.1" green="0.1" blue="0.1" /></text>
+ </element>
+
+ <element name="cbjk">
+ <rect><color red="0.9" green="0.9" blue="0.9" /></rect>
+ <text string="&#x263a;"><color red="0.1" green="0.1" blue="0.1" /></text>
+ </element>
+ <element name="crjk">
+ <rect><color red="0.9" green="0.9" blue="0.9" /></rect>
+ <text string="&#x263a;"><color red="0.8" green="0.1" blue="0.1" /></text>
+ </element>
+
+
+<!-- build screen -->
+
+ <view name="Internal Layout">
+ <bounds left="-1" right="53" top="11" bottom="54" />
+
+ <!-- vfd -->
+
+ <bezel name="digit0" element="digit"><bounds x="0" y="12" width="2.75" height="4.125" /></bezel>
+ <bezel name="digit1" element="digit"><bounds x="2.75" y="12" width="2.75" height="4.125" /></bezel>
+ <bezel name="digit2" element="digit"><bounds x="5.50" y="12" width="2.75" height="4.125" /></bezel>
+ <bezel name="digit3" element="digit"><bounds x="8.25" y="12" width="2.75" height="4.125" /></bezel>
+ <bezel name="digit4" element="digit"><bounds x="11.00" y="12" width="2.75" height="4.125" /></bezel>
+ <bezel name="digit5" element="digit"><bounds x="13.75" y="12" width="2.75" height="4.125" /></bezel>
+ <bezel name="digit6" element="digit"><bounds x="16.50" y="12" width="2.75" height="4.125" /></bezel>
+ <bezel name="digit7" element="digit"><bounds x="19.25" y="12" width="2.75" height="4.125" /></bezel>
+
+ <!-- button panel -->
+
+ <bezel element="button" inputtag="RESET" inputmask="0x01"><bounds x="0" y="20" width="4" height="3" /></bezel>
+ <bezel element="button" inputtag="IN.6" inputmask="0x01"><bounds x="6" y="20" width="4" height="3" /></bezel>
+ <bezel element="button" inputtag="IN.5" inputmask="0x01"><bounds x="12" y="20" width="4" height="3" /></bezel>
+ <bezel element="button" inputtag="IN.4" inputmask="0x01"><bounds x="18" y="20" width="4" height="3" /></bezel>
+
+ <bezel element="button" inputtag="IN.7" inputmask="0x02"><bounds x="0" y="25" width="4" height="3" /></bezel>
+ <bezel element="button" inputtag="IN.6" inputmask="0x02"><bounds x="6" y="25" width="4" height="3" /></bezel>
+ <bezel element="button" inputtag="IN.5" inputmask="0x02"><bounds x="12" y="25" width="4" height="3" /></bezel>
+ <bezel element="button" inputtag="IN.4" inputmask="0x02"><bounds x="18" y="25" width="4" height="3" /></bezel>
+
+ <bezel element="button" inputtag="IN.7" inputmask="0x04"><bounds x="0" y="30" width="4" height="3" /></bezel>
+ <bezel element="button" inputtag="IN.6" inputmask="0x04"><bounds x="6" y="30" width="4" height="3" /></bezel>
+ <bezel element="button" inputtag="IN.5" inputmask="0x04"><bounds x="12" y="30" width="4" height="3" /></bezel>
+ <bezel element="button" inputtag="IN.4" inputmask="0x04"><bounds x="18" y="30" width="4" height="3" /></bezel>
+
+ <bezel element="button" inputtag="IN.7" inputmask="0x08"><bounds x="0" y="35" width="4" height="3" /></bezel>
+ <bezel element="button" inputtag="IN.6" inputmask="0x08"><bounds x="6" y="35" width="4" height="3" /></bezel>
+ <bezel element="button" inputtag="IN.5" inputmask="0x08"><bounds x="12" y="35" width="4" height="3" /></bezel>
+ <bezel element="button" inputtag="IN.4" inputmask="0x08"><bounds x="18" y="35" width="4" height="3" /></bezel>
+
+ <bezel element="text_b1"><bounds x="-2" y="18.45" width="8" height="1.4" /></bezel>
+ <bezel element="text_b2"><bounds x="4" y="18.45" width="8" height="1.4" /></bezel>
+ <bezel element="text_b3"><bounds x="10" y="18.45" width="8" height="1.4" /></bezel>
+ <bezel element="text_b4"><bounds x="16" y="18.45" width="8" height="1.4" /></bezel>
+
+ <bezel element="text_b5"><bounds x="-2" y="23.45" width="8" height="1.4" /></bezel>
+ <bezel element="text_b6"><bounds x="4" y="23.45" width="8" height="1.4" /></bezel>
+ <bezel element="text_b7"><bounds x="10" y="23.45" width="8" height="1.4" /></bezel>
+ <bezel element="text_b8"><bounds x="16" y="23.45" width="8" height="1.4" /></bezel>
+
+ <bezel element="text_b9"><bounds x="-2" y="28.45" width="8" height="1.4" /></bezel>
+ <bezel element="text_b10"><bounds x="4" y="28.45" width="8" height="1.4" /></bezel>
+ <bezel element="text_b11"><bounds x="10" y="28.45" width="8" height="1.4" /></bezel>
+ <bezel element="text_b12"><bounds x="16" y="28.45" width="8" height="1.4" /></bezel>
+
+ <bezel element="text_b13"><bounds x="-2" y="33.3" width="8" height="1.6" /></bezel>
+ <bezel element="text_b14"><bounds x="4" y="33.3" width="8" height="1.6" /></bezel>
+ <bezel element="text_b15"><bounds x="10" y="33.3" width="8" height="1.6" /></bezel>
+ <bezel element="text_b16"><bounds x="16" y="33.3" width="8" height="1.6" /></bezel>
+
+ <bezel element="button" inputtag="IN.3" inputmask="0x01"><bounds x="30" y="20" width="4" height="3" /></bezel>
+ <bezel element="button" inputtag="IN.2" inputmask="0x01"><bounds x="36" y="20" width="4" height="3" /></bezel>
+ <bezel element="button" inputtag="IN.1" inputmask="0x01"><bounds x="42" y="20" width="4" height="3" /></bezel>
+ <bezel element="button" inputtag="IN.0" inputmask="0x01"><bounds x="48" y="20" width="4" height="3" /></bezel>
+
+ <bezel element="button" inputtag="IN.3" inputmask="0x02"><bounds x="30" y="25" width="4" height="3" /></bezel>
+ <bezel element="button" inputtag="IN.2" inputmask="0x02"><bounds x="36" y="25" width="4" height="3" /></bezel>
+ <bezel element="button" inputtag="IN.1" inputmask="0x02"><bounds x="42" y="25" width="4" height="3" /></bezel>
+ <bezel element="button" inputtag="IN.0" inputmask="0x02"><bounds x="48" y="25" width="4" height="3" /></bezel>
+
+ <bezel element="button" inputtag="IN.3" inputmask="0x04"><bounds x="30" y="30" width="4" height="3" /></bezel>
+ <bezel element="button" inputtag="IN.2" inputmask="0x04"><bounds x="36" y="30" width="4" height="3" /></bezel>
+ <bezel element="button" inputtag="IN.1" inputmask="0x04"><bounds x="42" y="30" width="4" height="3" /></bezel>
+ <bezel element="button" inputtag="IN.0" inputmask="0x04"><bounds x="48" y="30" width="4" height="3" /></bezel>
+
+ <bezel element="button" inputtag="IN.3" inputmask="0x08"><bounds x="30" y="35" width="4" height="3" /></bezel>
+ <bezel element="button" inputtag="IN.2" inputmask="0x08"><bounds x="36" y="35" width="4" height="3" /></bezel>
+ <bezel element="button" inputtag="IN.1" inputmask="0x08"><bounds x="42" y="35" width="4" height="3" /></bezel>
+ <bezel element="button" inputtag="IN.0" inputmask="0x08"><bounds x="48" y="35" width="4" height="3" /></bezel>
+
+ <bezel element="text_b17"><bounds x="28" y="18.45" width="8" height="1.4" /></bezel>
+ <bezel element="text_b18"><bounds x="34" y="18.45" width="8" height="1.4" /></bezel>
+ <bezel element="text_b19"><bounds x="40" y="18.45" width="8" height="1.4" /></bezel>
+ <bezel element="text_b20"><bounds x="46" y="18.45" width="8" height="1.4" /></bezel>
+
+ <bezel element="text_b21"><bounds x="28" y="23.45" width="8" height="1.4" /></bezel>
+ <bezel element="text_b22"><bounds x="34" y="23.45" width="8" height="1.4" /></bezel>
+ <bezel element="text_b23"><bounds x="40" y="23.45" width="8" height="1.4" /></bezel>
+ <bezel element="text_b24"><bounds x="46" y="23.45" width="8" height="1.4" /></bezel>
+
+ <bezel element="text_b25"><bounds x="28" y="28.45" width="8" height="1.4" /></bezel>
+ <bezel element="text_b26"><bounds x="34" y="28.45" width="8" height="1.4" /></bezel>
+ <bezel element="text_b27"><bounds x="40" y="28.45" width="8" height="1.4" /></bezel>
+ <bezel element="text_b28"><bounds x="46" y="28.45" width="8" height="1.4" /></bezel>
+
+ <bezel element="text_b29"><bounds x="28" y="33.45" width="8" height="1.4" /></bezel>
+ <bezel element="text_b30"><bounds x="34" y="33.45" width="8" height="1.4" /></bezel>
+ <bezel element="text_b31"><bounds x="40" y="33.45" width="8" height="1.4" /></bezel>
+ <bezel element="text_b32"><bounds x="46" y="33.45" width="8" height="1.4" /></bezel>
+
+ <!-- cards (common ordering, even though in in bridge the ace is the highest) -->
+
+ <bezel element="gray"><bounds x="-0.5" y="39.7" width="18" height="0.2" /></bezel>
+ <bezel element="text_scan"><bounds x="4" y="39" width="8" height="1.4" /></bezel>
+
+ <bezel element="white"><bounds x="0" y="41" width="14" height="15" /></bezel>
+ <bezel element="white"><bounds x="15" y="41" width="2" height="15" /></bezel>
+
+ <bezel element="cba"><bounds x="0.15" y="41.5" width="1.8" height="1.3" /></bezel>
+ <bezel element="cb2"><bounds x="1.15" y="41.5" width="1.8" height="1.3" /></bezel>
+ <bezel element="cb3"><bounds x="2.15" y="41.5" width="1.8" height="1.3" /></bezel>
+ <bezel element="cb4"><bounds x="3.15" y="41.5" width="1.8" height="1.3" /></bezel>
+ <bezel element="cb5"><bounds x="4.08" y="41.5" width="1.8" height="1.3" /></bezel>
+ <bezel element="cb6"><bounds x="5.15" y="41.5" width="1.8" height="1.3" /></bezel>
+ <bezel element="cb7"><bounds x="6.15" y="41.5" width="1.8" height="1.3" /></bezel>
+ <bezel element="cb8"><bounds x="7.15" y="41.5" width="1.8" height="1.3" /></bezel>
+ <bezel element="cb9"><bounds x="8.15" y="41.5" width="1.8" height="1.3" /></bezel>
+ <bezel element="cb0"><bounds x="9.15" y="41.5" width="1.8" height="1.3" /></bezel>
+ <bezel element="white"><bounds x="10" y="41.5" width="2" height="2" /></bezel>
+ <bezel element="cbj"><bounds x="10.15" y="41.5" width="1.8" height="1.3" /></bezel>
+ <bezel element="cbq"><bounds x="11.15" y="41.5" width="1.8" height="1.3" /></bezel>
+ <bezel element="cbk"><bounds x="12.15" y="41.5" width="1.8" height="1.3" /></bezel>
+ <bezel element="css"><bounds x="12.05" y="42.81" width="1.8" height="1.5" /></bezel>
+
+ <bezel element="cra"><bounds x="0.15" y="44.5" width="1.8" height="1.3" /></bezel>
+ <bezel element="cr2"><bounds x="1.15" y="44.5" width="1.8" height="1.3" /></bezel>
+ <bezel element="cr3"><bounds x="2.15" y="44.5" width="1.8" height="1.3" /></bezel>
+ <bezel element="cr4"><bounds x="3.15" y="44.5" width="1.8" height="1.3" /></bezel>
+ <bezel element="cr5"><bounds x="4.08" y="44.5" width="1.8" height="1.3" /></bezel>
+ <bezel element="cr6"><bounds x="5.15" y="44.5" width="1.8" height="1.3" /></bezel>
+ <bezel element="cr7"><bounds x="6.15" y="44.5" width="1.8" height="1.3" /></bezel>
+ <bezel element="cr8"><bounds x="7.15" y="44.5" width="1.8" height="1.3" /></bezel>
+ <bezel element="cr9"><bounds x="8.15" y="44.5" width="1.8" height="1.3" /></bezel>
+ <bezel element="cr0"><bounds x="9.15" y="44.5" width="1.8" height="1.3" /></bezel>
+ <bezel element="white"><bounds x="10" y="44.5" width="2" height="2" /></bezel>
+ <bezel element="crj"><bounds x="10.15" y="44.5" width="1.8" height="1.3" /></bezel>
+ <bezel element="crq"><bounds x="11.15" y="44.5" width="1.8" height="1.3" /></bezel>
+ <bezel element="crk"><bounds x="12.15" y="44.5" width="1.8" height="1.3" /></bezel>
+ <bezel element="csh"><bounds x="12.05" y="45.81" width="1.8" height="1.5" /></bezel>
+
+ <bezel element="cba"><bounds x="0.15" y="47.5" width="1.8" height="1.3" /></bezel>
+ <bezel element="cb2"><bounds x="1.15" y="47.5" width="1.8" height="1.3" /></bezel>
+ <bezel element="cb3"><bounds x="2.15" y="47.5" width="1.8" height="1.3" /></bezel>
+ <bezel element="cb4"><bounds x="3.15" y="47.5" width="1.8" height="1.3" /></bezel>
+ <bezel element="cb5"><bounds x="4.08" y="47.5" width="1.8" height="1.3" /></bezel>
+ <bezel element="cb6"><bounds x="5.15" y="47.5" width="1.8" height="1.3" /></bezel>
+ <bezel element="cb7"><bounds x="6.15" y="47.5" width="1.8" height="1.3" /></bezel>
+ <bezel element="cb8"><bounds x="7.15" y="47.5" width="1.8" height="1.3" /></bezel>
+ <bezel element="cb9"><bounds x="8.15" y="47.5" width="1.8" height="1.3" /></bezel>
+ <bezel element="cb0"><bounds x="9.15" y="47.5" width="1.8" height="1.3" /></bezel>
+ <bezel element="white"><bounds x="10" y="47.5" width="2" height="2" /></bezel>
+ <bezel element="cbj"><bounds x="10.15" y="47.5" width="1.8" height="1.3" /></bezel>
+ <bezel element="cbq"><bounds x="11.15" y="47.5" width="1.8" height="1.3" /></bezel>
+ <bezel element="cbk"><bounds x="12.15" y="47.5" width="1.8" height="1.3" /></bezel>
+ <bezel element="csc"><bounds x="12.05" y="48.81" width="1.8" height="1.5" /></bezel>
+
+ <bezel element="cra"><bounds x="0.15" y="50.5" width="1.8" height="1.3" /></bezel>
+ <bezel element="cr2"><bounds x="1.15" y="50.5" width="1.8" height="1.3" /></bezel>
+ <bezel element="cr3"><bounds x="2.15" y="50.5" width="1.8" height="1.3" /></bezel>
+ <bezel element="cr4"><bounds x="3.15" y="50.5" width="1.8" height="1.3" /></bezel>
+ <bezel element="cr5"><bounds x="4.08" y="50.5" width="1.8" height="1.3" /></bezel>
+ <bezel element="cr6"><bounds x="5.15" y="50.5" width="1.8" height="1.3" /></bezel>
+ <bezel element="cr7"><bounds x="6.15" y="50.5" width="1.8" height="1.3" /></bezel>
+ <bezel element="cr8"><bounds x="7.15" y="50.5" width="1.8" height="1.3" /></bezel>
+ <bezel element="cr9"><bounds x="8.15" y="50.5" width="1.8" height="1.3" /></bezel>
+ <bezel element="cr0"><bounds x="9.15" y="50.5" width="1.8" height="1.3" /></bezel>
+ <bezel element="white"><bounds x="10" y="50.5" width="2" height="2" /></bezel>
+ <bezel element="crj"><bounds x="10.15" y="50.5" width="1.8" height="1.3" /></bezel>
+ <bezel element="crq"><bounds x="11.15" y="50.5" width="1.8" height="1.3" /></bezel>
+ <bezel element="crk"><bounds x="12.15" y="50.5" width="1.8" height="1.3" /></bezel>
+ <bezel element="csd"><bounds x="12.05" y="51.81" width="1.8" height="1.5" /></bezel>
+
+ <bezel element="cbjk"><bounds x="15.1" y="42" width="1.8" height="1.5" /></bezel>
+ <bezel element="crjk"><bounds x="15.1" y="45" width="1.8" height="1.5" /></bezel>
+
+ <bezel element="edge1"><bounds x="0.95" y="41" width="0.08" height="15" /></bezel>
+ <bezel element="edge2"><bounds x="1.00" y="41" width="0.06" height="15" /></bezel>
+ <bezel element="edge1"><bounds x="1.95" y="41" width="0.08" height="15" /></bezel>
+ <bezel element="edge2"><bounds x="2.00" y="41" width="0.06" height="15" /></bezel>
+ <bezel element="edge1"><bounds x="2.95" y="41" width="0.08" height="15" /></bezel>
+ <bezel element="edge2"><bounds x="3.00" y="41" width="0.06" height="15" /></bezel>
+ <bezel element="edge1"><bounds x="3.95" y="41" width="0.08" height="15" /></bezel>
+ <bezel element="edge2"><bounds x="4.00" y="41" width="0.06" height="15" /></bezel>
+ <bezel element="edge1"><bounds x="4.95" y="41" width="0.08" height="15" /></bezel>
+ <bezel element="edge2"><bounds x="5.00" y="41" width="0.06" height="15" /></bezel>
+ <bezel element="edge1"><bounds x="5.95" y="41" width="0.08" height="15" /></bezel>
+ <bezel element="edge2"><bounds x="6.00" y="41" width="0.06" height="15" /></bezel>
+ <bezel element="edge1"><bounds x="6.95" y="41" width="0.08" height="15" /></bezel>
+ <bezel element="edge2"><bounds x="7.00" y="41" width="0.06" height="15" /></bezel>
+ <bezel element="edge1"><bounds x="7.95" y="41" width="0.08" height="15" /></bezel>
+ <bezel element="edge2"><bounds x="8.00" y="41" width="0.06" height="15" /></bezel>
+ <bezel element="edge1"><bounds x="8.95" y="41" width="0.08" height="15" /></bezel>
+ <bezel element="edge2"><bounds x="9.00" y="41" width="0.06" height="15" /></bezel>
+ <bezel element="edge1"><bounds x="9.95" y="41" width="0.08" height="15" /></bezel>
+ <bezel element="edge2"><bounds x="10.00" y="41" width="0.06" height="15" /></bezel>
+ <bezel element="edge1"><bounds x="10.95" y="41" width="0.08" height="15" /></bezel>
+ <bezel element="edge2"><bounds x="11.00" y="41" width="0.06" height="15" /></bezel>
+ <bezel element="edge1"><bounds x="11.95" y="41" width="0.08" height="15" /></bezel>
+ <bezel element="edge2"><bounds x="12.00" y="41" width="0.06" height="15" /></bezel>
+
+ <bezel element="nothing" inputtag="CARDS.0" inputmask="0x0001"><bounds x="0" y="41.5" width="1" height="2.7" /></bezel>
+ <bezel element="nothing" inputtag="CARDS.0" inputmask="0x0002"><bounds x="1" y="41.5" width="1" height="2.7" /></bezel>
+ <bezel element="nothing" inputtag="CARDS.0" inputmask="0x0004"><bounds x="2" y="41.5" width="1" height="2.7" /></bezel>
+ <bezel element="nothing" inputtag="CARDS.0" inputmask="0x0008"><bounds x="3" y="41.5" width="1" height="2.7" /></bezel>
+ <bezel element="nothing" inputtag="CARDS.0" inputmask="0x0010"><bounds x="4" y="41.5" width="1" height="2.7" /></bezel>
+ <bezel element="nothing" inputtag="CARDS.0" inputmask="0x0020"><bounds x="5" y="41.5" width="1" height="2.7" /></bezel>
+ <bezel element="nothing" inputtag="CARDS.0" inputmask="0x0040"><bounds x="6" y="41.5" width="1" height="2.7" /></bezel>
+ <bezel element="nothing" inputtag="CARDS.0" inputmask="0x0080"><bounds x="7" y="41.5" width="1" height="2.7" /></bezel>
+ <bezel element="nothing" inputtag="CARDS.0" inputmask="0x0100"><bounds x="8" y="41.5" width="1" height="2.7" /></bezel>
+ <bezel element="nothing" inputtag="CARDS.0" inputmask="0x0200"><bounds x="9" y="41.5" width="1" height="2.7" /></bezel>
+ <bezel element="nothing" inputtag="CARDS.0" inputmask="0x0400"><bounds x="10" y="41.5" width="1" height="2.7" /></bezel>
+ <bezel element="nothing" inputtag="CARDS.0" inputmask="0x0800"><bounds x="11" y="41.5" width="1" height="2.7" /></bezel>
+ <bezel element="nothing" inputtag="CARDS.0" inputmask="0x1000"><bounds x="12" y="41.5" width="2" height="2.7" /></bezel>
+
+ <bezel element="nothing" inputtag="CARDS.1" inputmask="0x0001"><bounds x="0" y="44.5" width="1" height="2.7" /></bezel>
+ <bezel element="nothing" inputtag="CARDS.1" inputmask="0x0002"><bounds x="1" y="44.5" width="1" height="2.7" /></bezel>
+ <bezel element="nothing" inputtag="CARDS.1" inputmask="0x0004"><bounds x="2" y="44.5" width="1" height="2.7" /></bezel>
+ <bezel element="nothing" inputtag="CARDS.1" inputmask="0x0008"><bounds x="3" y="44.5" width="1" height="2.7" /></bezel>
+ <bezel element="nothing" inputtag="CARDS.1" inputmask="0x0010"><bounds x="4" y="44.5" width="1" height="2.7" /></bezel>
+ <bezel element="nothing" inputtag="CARDS.1" inputmask="0x0020"><bounds x="5" y="44.5" width="1" height="2.7" /></bezel>
+ <bezel element="nothing" inputtag="CARDS.1" inputmask="0x0040"><bounds x="6" y="44.5" width="1" height="2.7" /></bezel>
+ <bezel element="nothing" inputtag="CARDS.1" inputmask="0x0080"><bounds x="7" y="44.5" width="1" height="2.7" /></bezel>
+ <bezel element="nothing" inputtag="CARDS.1" inputmask="0x0100"><bounds x="8" y="44.5" width="1" height="2.7" /></bezel>
+ <bezel element="nothing" inputtag="CARDS.1" inputmask="0x0200"><bounds x="9" y="44.5" width="1" height="2.7" /></bezel>
+ <bezel element="nothing" inputtag="CARDS.1" inputmask="0x0400"><bounds x="10" y="44.5" width="1" height="2.7" /></bezel>
+ <bezel element="nothing" inputtag="CARDS.1" inputmask="0x0800"><bounds x="11" y="44.5" width="1" height="2.7" /></bezel>
+ <bezel element="nothing" inputtag="CARDS.1" inputmask="0x1000"><bounds x="12" y="44.5" width="2" height="2.7" /></bezel>
+
+ <bezel element="nothing" inputtag="CARDS.2" inputmask="0x0001"><bounds x="0" y="47.5" width="1" height="2.7" /></bezel>
+ <bezel element="nothing" inputtag="CARDS.2" inputmask="0x0002"><bounds x="1" y="47.5" width="1" height="2.7" /></bezel>
+ <bezel element="nothing" inputtag="CARDS.2" inputmask="0x0004"><bounds x="2" y="47.5" width="1" height="2.7" /></bezel>
+ <bezel element="nothing" inputtag="CARDS.2" inputmask="0x0008"><bounds x="3" y="47.5" width="1" height="2.7" /></bezel>
+ <bezel element="nothing" inputtag="CARDS.2" inputmask="0x0010"><bounds x="4" y="47.5" width="1" height="2.7" /></bezel>
+ <bezel element="nothing" inputtag="CARDS.2" inputmask="0x0020"><bounds x="5" y="47.5" width="1" height="2.7" /></bezel>
+ <bezel element="nothing" inputtag="CARDS.2" inputmask="0x0040"><bounds x="6" y="47.5" width="1" height="2.7" /></bezel>
+ <bezel element="nothing" inputtag="CARDS.2" inputmask="0x0080"><bounds x="7" y="47.5" width="1" height="2.7" /></bezel>
+ <bezel element="nothing" inputtag="CARDS.2" inputmask="0x0100"><bounds x="8" y="47.5" width="1" height="2.7" /></bezel>
+ <bezel element="nothing" inputtag="CARDS.2" inputmask="0x0200"><bounds x="9" y="47.5" width="1" height="2.7" /></bezel>
+ <bezel element="nothing" inputtag="CARDS.2" inputmask="0x0400"><bounds x="10" y="47.5" width="1" height="2.7" /></bezel>
+ <bezel element="nothing" inputtag="CARDS.2" inputmask="0x0800"><bounds x="11" y="47.5" width="1" height="2.7" /></bezel>
+ <bezel element="nothing" inputtag="CARDS.2" inputmask="0x1000"><bounds x="12" y="47.5" width="2" height="2.7" /></bezel>
+
+ <bezel element="nothing" inputtag="CARDS.3" inputmask="0x0001"><bounds x="0" y="50.5" width="1" height="2.7" /></bezel>
+ <bezel element="nothing" inputtag="CARDS.3" inputmask="0x0002"><bounds x="1" y="50.5" width="1" height="2.7" /></bezel>
+ <bezel element="nothing" inputtag="CARDS.3" inputmask="0x0004"><bounds x="2" y="50.5" width="1" height="2.7" /></bezel>
+ <bezel element="nothing" inputtag="CARDS.3" inputmask="0x0008"><bounds x="3" y="50.5" width="1" height="2.7" /></bezel>
+ <bezel element="nothing" inputtag="CARDS.3" inputmask="0x0010"><bounds x="4" y="50.5" width="1" height="2.7" /></bezel>
+ <bezel element="nothing" inputtag="CARDS.3" inputmask="0x0020"><bounds x="5" y="50.5" width="1" height="2.7" /></bezel>
+ <bezel element="nothing" inputtag="CARDS.3" inputmask="0x0040"><bounds x="6" y="50.5" width="1" height="2.7" /></bezel>
+ <bezel element="nothing" inputtag="CARDS.3" inputmask="0x0080"><bounds x="7" y="50.5" width="1" height="2.7" /></bezel>
+ <bezel element="nothing" inputtag="CARDS.3" inputmask="0x0100"><bounds x="8" y="50.5" width="1" height="2.7" /></bezel>
+ <bezel element="nothing" inputtag="CARDS.3" inputmask="0x0200"><bounds x="9" y="50.5" width="1" height="2.7" /></bezel>
+ <bezel element="nothing" inputtag="CARDS.3" inputmask="0x0400"><bounds x="10" y="50.5" width="1" height="2.7" /></bezel>
+ <bezel element="nothing" inputtag="CARDS.3" inputmask="0x0800"><bounds x="11" y="50.5" width="1" height="2.7" /></bezel>
+ <bezel element="nothing" inputtag="CARDS.3" inputmask="0x1000"><bounds x="12" y="50.5" width="2" height="2.7" /></bezel>
+
+ <bezel element="nothing" inputtag="CARDS.0" inputmask="0x2000"><bounds x="15" y="41.5" width="2" height="2.7" /></bezel>
+ <bezel element="nothing" inputtag="CARDS.0" inputmask="0x4000"><bounds x="15" y="44.5" width="2" height="2.7" /></bezel>
+
+ <bezel element="blackb"><bounds x="0" y="40.5" width="50" height="1" /></bezel>
+ <bezel element="blackb"><bounds x="0" y="44.2" width="50" height="0.3" /></bezel>
+ <bezel element="blackb"><bounds x="0" y="47.2" width="50" height="0.3" /></bezel>
+ <bezel element="blackb"><bounds x="14.9" y="47.3" width="50" height="15" /></bezel>
+ <bezel element="blackb"><bounds x="0" y="50.2" width="50" height="0.3" /></bezel>
+ <bezel element="blackb"><bounds x="0" y="53.2" width="50" height="15" /></bezel>
+
+ </view>
+</mamelayout>
diff --git a/src/mame/layout/fidel_cc1.lay b/src/mame/layout/fidel_cc1.lay
new file mode 100644
index 00000000000..718cbd3da8a
--- /dev/null
+++ b/src/mame/layout/fidel_cc1.lay
@@ -0,0 +1,145 @@
+<?xml version="1.0"?>
+<mamelayout version="2">
+
+<!-- define elements -->
+
+ <element name="static_gray"><rect><color red="0.6" green="0.6" blue="0.6" /></rect></element>
+
+ <element name="digit" defstate="0">
+ <led7seg><color red="1.0" green="0.1" blue="0.15" /></led7seg>
+ </element>
+
+ <element name="led" defstate="0">
+ <disk state="1"><color red="1.0" green="0.1" blue="0.15" /></disk>
+ <disk state="0"><color red="0.1" green="0.01" blue="0.015" /></disk>
+ </element>
+
+ <element name="hl" defstate="0">
+ <text string=" ">
+ <bounds x="0.0" y="0.0" width="1.0" height="1.0" />
+ <color red="0.0" green="0.0" blue="0.0" />
+ </text>
+ <rect state="1">
+ <bounds x="0.0" y="0.0" width="1.0" height="1.0" />
+ <color red="0.0" green="0.0" blue="0.0" />
+ </rect>
+ </element>
+
+ <element name="text_check"><text string="CHECK"><color red="0.6" green="0.6" blue="0.6" /></text></element>
+ <element name="text_lose"><text string="I LOSE"><color red="0.6" green="0.6" blue="0.6" /></text></element>
+ <element name="text_from"><text string="FROM"><color red="0.6" green="0.6" blue="0.6" /></text></element>
+ <element name="text_to"><text string="TO"><color red="0.6" green="0.6" blue="0.6" /></text></element>
+
+ <element name="text_b1">
+ <rect><color red="0.6" green="0.6" blue="0.6" /></rect>
+ <text string="RE"><color red="0.04" green="0.04" blue="0.04" /></text>
+ </element>
+ <element name="text_b2">
+ <rect><color red="0.6" green="0.6" blue="0.6" /></rect>
+ <text string="DM"><color red="0.04" green="0.04" blue="0.04" /></text>
+ </element>
+ <element name="text_b3">
+ <rect><color red="0.6" green="0.6" blue="0.6" /></rect>
+ <text string="CL"><color red="0.04" green="0.04" blue="0.04" /></text>
+ </element>
+ <element name="text_b4">
+ <rect><color red="0.6" green="0.6" blue="0.6" /></rect>
+ <text string="EN"><color red="0.04" green="0.04" blue="0.04" /></text>
+ </element>
+ <element name="text_b5">
+ <rect><color red="0.6" green="0.6" blue="0.6" /></rect>
+ <text string="1A"><color red="0.04" green="0.04" blue="0.04" /></text>
+ </element>
+ <element name="text_b6">
+ <rect><color red="0.6" green="0.6" blue="0.6" /></rect>
+ <text string="2b"><color red="0.04" green="0.04" blue="0.04" /></text>
+ </element>
+ <element name="text_b7">
+ <rect><color red="0.6" green="0.6" blue="0.6" /></rect>
+ <text string="3C"><color red="0.04" green="0.04" blue="0.04" /></text>
+ </element>
+ <element name="text_b8">
+ <rect><color red="0.6" green="0.6" blue="0.6" /></rect>
+ <text string="4d"><color red="0.04" green="0.04" blue="0.04" /></text>
+ </element>
+ <element name="text_b9">
+ <rect><color red="0.6" green="0.6" blue="0.6" /></rect>
+ <text string="5E"><color red="0.04" green="0.04" blue="0.04" /></text>
+ </element>
+ <element name="text_b10">
+ <rect><color red="0.6" green="0.6" blue="0.6" /></rect>
+ <text string="6F"><color red="0.04" green="0.04" blue="0.04" /></text>
+ </element>
+ <element name="text_b11">
+ <rect><color red="0.6" green="0.6" blue="0.6" /></rect>
+ <text string="7g"><color red="0.04" green="0.04" blue="0.04" /></text>
+ </element>
+ <element name="text_b12">
+ <rect><color red="0.6" green="0.6" blue="0.6" /></rect>
+ <text string="8H"><color red="0.04" green="0.04" blue="0.04" /></text>
+ </element>
+
+
+<!-- build screen -->
+
+ <view name="Internal Layout">
+ <bounds left="-0.5" right="18" top="7.7" bottom="32" />
+
+ <!-- 7segs/leds -->
+
+ <bezel element="text_check"><bounds x="1" y="8.2" width="8" height="2" /></bezel>
+ <bezel element="text_lose"><bounds x="10.5" y="8.2" width="8" height="2" /></bezel>
+ <bezel name="4.a" element="led"><bounds x="0" y="8.5" width="1.5" height="1.5" /></bezel>
+ <bezel name="5.a" element="led"><bounds x="9.5" y="8.5" width="1.5" height="1.5" /></bezel>
+
+ <bezel element="text_from"><bounds x="0" y="17.2" width="8" height="2" /></bezel>
+ <bezel element="text_to"><bounds x="9.5" y="17.2" width="8" height="2" /></bezel>
+
+ <bezel name="digit0" element="digit"><bounds x="0" y="11" width="4" height="6" /></bezel>
+ <bezel name="digit1" element="digit"><bounds x="4" y="11" width="4" height="6" /></bezel>
+ <bezel name="digit2" element="digit"><bounds x="9.5" y="11" width="4" height="6" /></bezel>
+ <bezel name="digit3" element="digit"><bounds x="13.5" y="11" width="4" height="6" /></bezel>
+
+ <!-- button panel -->
+
+ <bezel element="static_gray"><bounds x="0" y="20" width="4" height="3.5" /></bezel>
+ <bezel element="static_gray"><bounds x="4.5" y="20" width="4" height="3.5" /></bezel>
+ <bezel element="static_gray"><bounds x="9" y="20" width="4" height="3.5" /></bezel>
+ <bezel element="static_gray"><bounds x="13.5" y="20" width="4" height="3.5" /></bezel>
+ <bezel element="static_gray"><bounds x="0" y="24" width="4" height="3.5" /></bezel>
+ <bezel element="static_gray"><bounds x="4.5" y="24" width="4" height="3.5" /></bezel>
+ <bezel element="static_gray"><bounds x="9" y="24" width="4" height="3.5" /></bezel>
+ <bezel element="static_gray"><bounds x="13.5" y="24" width="4" height="3.5" /></bezel>
+ <bezel element="static_gray"><bounds x="0" y="28" width="4" height="3.5" /></bezel>
+ <bezel element="static_gray"><bounds x="4.5" y="28" width="4" height="3.5" /></bezel>
+ <bezel element="static_gray"><bounds x="9" y="28" width="4" height="3.5" /></bezel>
+ <bezel element="static_gray"><bounds x="13.5" y="28" width="4" height="3.5" /></bezel>
+
+ <bezel element="text_b1"><bounds x="0.1" y="20.75" width="3.8" height="2" /></bezel>
+ <bezel element="text_b2"><bounds x="4.6" y="20.75" width="3.8" height="2" /></bezel>
+ <bezel element="text_b3"><bounds x="9.1" y="20.75" width="3.8" height="2" /></bezel>
+ <bezel element="text_b4"><bounds x="13.6" y="20.75" width="3.8" height="2" /></bezel>
+ <bezel element="text_b5"><bounds x="0.1" y="24.75" width="3.8" height="2" /></bezel>
+ <bezel element="text_b6"><bounds x="4.6" y="24.75" width="3.8" height="2" /></bezel>
+ <bezel element="text_b7"><bounds x="9.1" y="24.75" width="3.8" height="2" /></bezel>
+ <bezel element="text_b8"><bounds x="13.6" y="24.75" width="3.8" height="2" /></bezel>
+ <bezel element="text_b9"><bounds x="0.1" y="28.75" width="3.8" height="2" /></bezel>
+ <bezel element="text_b10"><bounds x="4.6" y="28.75" width="3.8" height="2" /></bezel>
+ <bezel element="text_b11"><bounds x="9.1" y="28.75" width="3.8" height="2" /></bezel>
+ <bezel element="text_b12"><bounds x="13.6" y="28.75" width="3.8" height="2" /></bezel>
+
+ <bezel element="hl" inputtag="RESET" inputmask="0x01"><bounds x="0" y="20" width="4" height="3.5" /><color alpha="0.2" /></bezel>
+ <bezel element="hl" inputtag="IN.1" inputmask="0x01"><bounds x="4.5" y="20" width="4" height="3.5" /><color alpha="0.2" /></bezel>
+ <bezel element="hl" inputtag="IN.1" inputmask="0x02"><bounds x="9" y="20" width="4" height="3.5" /><color alpha="0.2" /></bezel>
+ <bezel element="hl" inputtag="IN.1" inputmask="0x04"><bounds x="13.5" y="20" width="4" height="3.5" /><color alpha="0.2" /></bezel>
+ <bezel element="hl" inputtag="IN.0" inputmask="0x01"><bounds x="0" y="24" width="4" height="3.5" /><color alpha="0.2" /></bezel>
+ <bezel element="hl" inputtag="IN.0" inputmask="0x02"><bounds x="4.5" y="24" width="4" height="3.5" /><color alpha="0.2" /></bezel>
+ <bezel element="hl" inputtag="IN.0" inputmask="0x04"><bounds x="9" y="24" width="4" height="3.5" /><color alpha="0.2" /></bezel>
+ <bezel element="hl" inputtag="IN.0" inputmask="0x08"><bounds x="13.5" y="24" width="4" height="3.5" /><color alpha="0.2" /></bezel>
+ <bezel element="hl" inputtag="IN.0" inputmask="0x10"><bounds x="0" y="28" width="4" height="3.5" /><color alpha="0.2" /></bezel>
+ <bezel element="hl" inputtag="IN.0" inputmask="0x20"><bounds x="4.5" y="28" width="4" height="3.5" /><color alpha="0.2" /></bezel>
+ <bezel element="hl" inputtag="IN.0" inputmask="0x40"><bounds x="9" y="28" width="4" height="3.5" /><color alpha="0.2" /></bezel>
+ <bezel element="hl" inputtag="IN.0" inputmask="0x80"><bounds x="13.5" y="28" width="4" height="3.5" /><color alpha="0.2" /></bezel>
+
+ </view>
+</mamelayout>
diff --git a/src/mame/layout/fidel_cc.lay b/src/mame/layout/fidel_cc10.lay
index b887a90162c..2d5c459780d 100644
--- a/src/mame/layout/fidel_cc.lay
+++ b/src/mame/layout/fidel_cc10.lay
@@ -105,8 +105,8 @@
<bezel element="text_check"><bounds x="1" y="8.2" width="8" height="2" /></bezel>
<bezel element="text_lose"><bounds x="10.5" y="8.2" width="8" height="2" /></bezel>
- <bezel name="1.7" element="led"><bounds x="0" y="8.5" width="1.5" height="1.5" /></bezel>
- <bezel name="0.7" element="led"><bounds x="9.5" y="8.5" width="1.5" height="1.5" /></bezel>
+ <bezel name="4.a" element="led"><bounds x="0" y="8.5" width="1.5" height="1.5" /></bezel>
+ <bezel name="5.a" element="led"><bounds x="9.5" y="8.5" width="1.5" height="1.5" /></bezel>
<bezel element="text_from"><bounds x="0" y="17.2" width="8" height="2" /></bezel>
<bezel element="text_to"><bounds x="9.5" y="17.2" width="8" height="2" /></bezel>
diff --git a/src/mame/layout/fidel_chesster.lay b/src/mame/layout/fidel_chesster.lay
index 1927d9d7e6a..28489afddd9 100644
--- a/src/mame/layout/fidel_chesster.lay
+++ b/src/mame/layout/fidel_chesster.lay
@@ -179,36 +179,36 @@
<element name="text_king">
<rect><color red="0.81" green="0.8" blue="0.79" /></rect>
- <text string="&#x265a;"><color red="0.17" green="0.15" blue="0.15" /></text>
+ <text string="[K]"><color red="0.17" green="0.15" blue="0.15" /></text>
</element>
<element name="text_queen">
<rect><color red="0.81" green="0.8" blue="0.79" /></rect>
- <text string="&#x265b;"><color red="0.17" green="0.15" blue="0.15" /></text>
+ <text string="[Q]"><color red="0.17" green="0.15" blue="0.15" /></text>
</element>
<element name="text_rook">
<rect><color red="0.81" green="0.8" blue="0.79" /></rect>
- <text string="&#x265c;"><color red="0.17" green="0.15" blue="0.15" /></text>
+ <text string="[R]"><color red="0.17" green="0.15" blue="0.15" /></text>
</element>
<element name="text_bishop">
<rect><color red="0.81" green="0.8" blue="0.79" /></rect>
- <text string="&#x265d;"><color red="0.17" green="0.15" blue="0.15" /></text>
+ <text string="[B]"><color red="0.17" green="0.15" blue="0.15" /></text>
</element>
<element name="text_knight">
<rect><color red="0.81" green="0.8" blue="0.79" /></rect>
- <text string="&#x265e;"><color red="0.17" green="0.15" blue="0.15" /></text>
+ <text string="[N]"><color red="0.17" green="0.15" blue="0.15" /></text>
</element>
<element name="text_pawn">
<rect><color red="0.81" green="0.8" blue="0.79" /></rect>
- <text string="&#x265f;"><color red="0.17" green="0.15" blue="0.15" /></text>
+ <text string="[P]"><color red="0.17" green="0.15" blue="0.15" /></text>
</element>
<!-- build screen -->
<view name="Internal Layout">
- <bounds left="-7" right="93" top="-2" bottom="103" />
+ <bounds left="-7" right="93" top="-2" bottom="102.5" />
- <bezel element="white"><bounds x="-7.5" y="-2.5" width="101" height="106" /></bezel>
+ <bezel element="white"><bounds x="-7.5" y="-2.5" width="101" height="105.5" /></bezel>
<!-- chessboard coords -->
@@ -388,12 +388,12 @@
<bezel element="text_u5"><bounds x="64" y="96.3" width="10" height="1.8" /></bezel>
<bezel element="text_u6"><bounds x="73" y="96.3" width="10" height="1.8" /></bezel>
- <bezel element="text_king"><bounds x="3" y="98" width="10" height="4" /></bezel>
- <bezel element="text_queen"><bounds x="12" y="98" width="10" height="4" /></bezel>
- <bezel element="text_rook"><bounds x="21" y="98" width="10" height="4" /></bezel>
- <bezel element="text_bishop"><bounds x="55" y="98" width="10" height="4" /></bezel>
- <bezel element="text_knight"><bounds x="64" y="98" width="10" height="4" /></bezel>
- <bezel element="text_pawn"><bounds x="73" y="98" width="10" height="4" /></bezel>
+ <bezel element="text_king"><bounds x="3" y="98.5" width="10" height="2.65" /></bezel>
+ <bezel element="text_queen"><bounds x="12" y="98.5" width="10" height="2.65" /></bezel>
+ <bezel element="text_rook"><bounds x="21" y="98.5" width="10" height="2.65" /></bezel>
+ <bezel element="text_bishop"><bounds x="55" y="98.5" width="10" height="2.65" /></bezel>
+ <bezel element="text_knight"><bounds x="64" y="98.5" width="10" height="2.65" /></bezel>
+ <bezel element="text_pawn"><bounds x="73" y="98.5" width="10" height="2.65" /></bezel>
<bezel element="disk_black"><bounds x="6" y="92" width="4" height="4" /></bezel>
<bezel element="disk_black"><bounds x="15" y="92" width="4" height="4" /></bezel>
diff --git a/src/mame/layout/fidel_csc.lay b/src/mame/layout/fidel_csc.lay
index a35a459e1b4..31fa291eaa4 100644
--- a/src/mame/layout/fidel_csc.lay
+++ b/src/mame/layout/fidel_csc.lay
@@ -1,87 +1,6 @@
<?xml version="1.0"?>
<mamelayout version="2">
-<!-- luascript -->
-
- <script>
- local layout = {}
- local board
- local first_sq
- local curr_sq = {x = 0, y = 0}
-
- local port_tags = { ":IN.0", ":IN.1", ":IN.2", ":IN.3", ":IN.4", ":IN.5", ":IN.6", ":IN.7" }
- local ports
-
- local function move_piece(from, to)
- if board[from.y][from.x] == 0 then
- return false
- end
- board[to.y][to.x] = board[from.y][from.x]
- board[from.y][from.x] = 0
- machine:outputs():set_indexed_value("pos", (to.y * 10) + to.x, board[to.y][to.x])
- machine:outputs():set_indexed_value("pos", (from.y * 10) + from.x, 0)
- return true
- end
-
- function layout.reset()
- board =
- {{ 3, 5, 4, 2, 1, 4, 5, 3},
- { 6, 6, 6, 6, 6, 6, 6, 6},
- { 0, 0, 0, 0, 0, 0, 0, 0},
- { 0, 0, 0, 0, 0, 0, 0, 0},
- { 0, 0, 0, 0, 0, 0, 0, 0},
- { 0, 0, 0, 0, 0, 0, 0, 0},
- {12,12,12,12,12,12,12,12},
- { 9,11,10, 8, 7,10,11, 9}}
-
- for y, row in ipairs(board) do
- for x, cell in ipairs(row) do
- machine:outputs():set_indexed_value("pos", (y * 10) + x, board[y][x])
- end
- end
- ports = machine:ioport().ports
- end
-
- function layout.frame()
- local value = ports[":IN.8"]:read()
- if value &amp; 0x80 ~= 0 then
- layout.reset()
- return
- end
-
- for x, tag in ipairs(port_tags) do
- local port = ports[tag]
- if port then
- local newvalue = port:read()
- if newvalue ~= 0 then
- for y = 8, 1, -1 do
- if newvalue &amp; 1 == 1 then
- if (curr_sq.y == y) and (curr_sq.x == x) then
- return
- end
- if not first_sq then
- first_sq = {x = x, y = y}
- else
- if move_piece(first_sq, {x = x, y = y}) then
- first_sq = nil
- else
- first_sq = {x = x, y = y}
- end
- end
- curr_sq = {x = x, y = y}
- return
- end
- newvalue = newvalue >> 1
- end
- end
- end
- end
- end
-
- return layout, "fidel_csc"
- </script>
-
-
<!-- other than panel button mappings, layout is identical to vsc -->
<!-- define elements -->
@@ -207,27 +126,27 @@
</element>
<element name="text_king">
<disk><color red="0.81" green="0.8" blue="0.79" /></disk>
- <text string="&#x265a;"><color red="0.17" green="0.15" blue="0.15" /></text>
+ <text string="[K]"><color red="0.17" green="0.15" blue="0.15" /></text>
</element>
<element name="text_queen">
<disk><color red="0.81" green="0.8" blue="0.79" /></disk>
- <text string="&#x265b;"><color red="0.17" green="0.15" blue="0.15" /></text>
+ <text string="[Q]"><color red="0.17" green="0.15" blue="0.15" /></text>
</element>
<element name="text_rook">
<disk><color red="0.81" green="0.8" blue="0.79" /></disk>
- <text string="&#x265c;"><color red="0.17" green="0.15" blue="0.15" /></text>
+ <text string="[R]"><color red="0.17" green="0.15" blue="0.15" /></text>
</element>
<element name="text_bishop">
<disk><color red="0.81" green="0.8" blue="0.79" /></disk>
- <text string="&#x265d;"><color red="0.17" green="0.15" blue="0.15" /></text>
+ <text string="[B]"><color red="0.17" green="0.15" blue="0.15" /></text>
</element>
<element name="text_knight">
<disk><color red="0.81" green="0.8" blue="0.79" /></disk>
- <text string="&#x265e;"><color red="0.17" green="0.15" blue="0.15" /></text>
+ <text string="[N]"><color red="0.17" green="0.15" blue="0.15" /></text>
</element>
<element name="text_pawn">
<disk><color red="0.81" green="0.8" blue="0.79" /></disk>
- <text string="&#x265f;"><color red="0.17" green="0.15" blue="0.15" /></text>
+ <text string="[P]"><color red="0.17" green="0.15" blue="0.15" /></text>
</element>
<element name="text_tm">
@@ -255,22 +174,6 @@
<text string="LV"><color red="0.81" green="0.8" blue="0.79" /></text>
</element>
- <element name="piece" defstate="0">
- <text string="&#x265a;" state="1"><color red="0.27" green="0.25" blue="0.25" /></text>
- <text string="&#x265b;" state="2"><color red="0.27" green="0.25" blue="0.25" /></text>
- <text string="&#x265c;" state="3"><color red="0.27" green="0.25" blue="0.25" /></text>
- <text string="&#x265d;" state="4"><color red="0.27" green="0.25" blue="0.25" /></text>
- <text string="&#x265e;" state="5"><color red="0.27" green="0.25" blue="0.25" /></text>
- <text string="&#x265f;" state="6"><color red="0.27" green="0.25" blue="0.25" /></text>
-
- <text string="&#x265a;" state="7"><color red="0.71" green="0.7" blue="0.69" /></text>
- <text string="&#x265b;" state="8"><color red="0.71" green="0.7" blue="0.69" /></text>
- <text string="&#x265c;" state="9"><color red="0.71" green="0.7" blue="0.69" /></text>
- <text string="&#x265d;" state="10"><color red="0.71" green="0.7" blue="0.69" /></text>
- <text string="&#x265e;" state="11"><color red="0.71" green="0.7" blue="0.69" /></text>
- <text string="&#x265f;" state="12"><color red="0.71" green="0.7" blue="0.69" /></text>
- </element>
-
<!-- build screen -->
@@ -344,79 +247,6 @@
<bezel element="black"><bounds x="43" y="73" width="10" height="10.5" /></bezel>
<bezel element="black"><bounds x="63" y="73" width="10" height="10.5" /></bezel>
-
- <bezel name="pos11" element="piece"><bounds x="3" y="3" width="10" height="10" /></bezel>
- <bezel name="pos12" element="piece"><bounds x="13" y="3" width="10" height="10" /></bezel>
- <bezel name="pos13" element="piece"><bounds x="23" y="3" width="10" height="10" /></bezel>
- <bezel name="pos14" element="piece"><bounds x="33" y="3" width="10" height="10" /></bezel>
- <bezel name="pos15" element="piece"><bounds x="43" y="3" width="10" height="10" /></bezel>
- <bezel name="pos16" element="piece"><bounds x="53" y="3" width="10" height="10" /></bezel>
- <bezel name="pos17" element="piece"><bounds x="63" y="3" width="10" height="10" /></bezel>
- <bezel name="pos18" element="piece"><bounds x="73" y="3" width="10" height="10" /></bezel>
-
- <bezel name="pos21" element="piece"><bounds x="3" y="13" width="10" height="10" /></bezel>
- <bezel name="pos22" element="piece"><bounds x="13" y="13" width="10" height="10" /></bezel>
- <bezel name="pos23" element="piece"><bounds x="23" y="13" width="10" height="10" /></bezel>
- <bezel name="pos24" element="piece"><bounds x="33" y="13" width="10" height="10" /></bezel>
- <bezel name="pos25" element="piece"><bounds x="43" y="13" width="10" height="10" /></bezel>
- <bezel name="pos26" element="piece"><bounds x="53" y="13" width="10" height="10" /></bezel>
- <bezel name="pos27" element="piece"><bounds x="63" y="13" width="10" height="10" /></bezel>
- <bezel name="pos28" element="piece"><bounds x="73" y="13" width="10" height="10" /></bezel>
-
- <bezel name="pos31" element="piece"><bounds x="3" y="23" width="10" height="10" /></bezel>
- <bezel name="pos32" element="piece"><bounds x="13" y="23" width="10" height="10" /></bezel>
- <bezel name="pos33" element="piece"><bounds x="23" y="23" width="10" height="10" /></bezel>
- <bezel name="pos34" element="piece"><bounds x="33" y="23" width="10" height="10" /></bezel>
- <bezel name="pos35" element="piece"><bounds x="43" y="23" width="10" height="10" /></bezel>
- <bezel name="pos36" element="piece"><bounds x="53" y="23" width="10" height="10" /></bezel>
- <bezel name="pos37" element="piece"><bounds x="63" y="23" width="10" height="10" /></bezel>
- <bezel name="pos38" element="piece"><bounds x="73" y="23" width="10" height="10" /></bezel>
-
- <bezel name="pos41" element="piece"><bounds x="3" y="33" width="10" height="10" /></bezel>
- <bezel name="pos42" element="piece"><bounds x="13" y="33" width="10" height="10" /></bezel>
- <bezel name="pos43" element="piece"><bounds x="23" y="33" width="10" height="10" /></bezel>
- <bezel name="pos44" element="piece"><bounds x="33" y="33" width="10" height="10" /></bezel>
- <bezel name="pos45" element="piece"><bounds x="43" y="33" width="10" height="10" /></bezel>
- <bezel name="pos46" element="piece"><bounds x="53" y="33" width="10" height="10" /></bezel>
- <bezel name="pos47" element="piece"><bounds x="63" y="33" width="10" height="10" /></bezel>
- <bezel name="pos48" element="piece"><bounds x="73" y="33" width="10" height="10" /></bezel>
-
- <bezel name="pos51" element="piece"><bounds x="3" y="43" width="10" height="10" /></bezel>
- <bezel name="pos52" element="piece"><bounds x="13" y="43" width="10" height="10" /></bezel>
- <bezel name="pos53" element="piece"><bounds x="23" y="43" width="10" height="10" /></bezel>
- <bezel name="pos54" element="piece"><bounds x="33" y="43" width="10" height="10" /></bezel>
- <bezel name="pos55" element="piece"><bounds x="43" y="43" width="10" height="10" /></bezel>
- <bezel name="pos56" element="piece"><bounds x="53" y="43" width="10" height="10" /></bezel>
- <bezel name="pos57" element="piece"><bounds x="63" y="43" width="10" height="10" /></bezel>
- <bezel name="pos58" element="piece"><bounds x="73" y="43" width="10" height="10" /></bezel>
-
- <bezel name="pos61" element="piece"><bounds x="3" y="53" width="10" height="10" /></bezel>
- <bezel name="pos62" element="piece"><bounds x="13" y="53" width="10" height="10" /></bezel>
- <bezel name="pos63" element="piece"><bounds x="23" y="53" width="10" height="10" /></bezel>
- <bezel name="pos64" element="piece"><bounds x="33" y="53" width="10" height="10" /></bezel>
- <bezel name="pos65" element="piece"><bounds x="43" y="53" width="10" height="10" /></bezel>
- <bezel name="pos66" element="piece"><bounds x="53" y="53" width="10" height="10" /></bezel>
- <bezel name="pos67" element="piece"><bounds x="63" y="53" width="10" height="10" /></bezel>
- <bezel name="pos68" element="piece"><bounds x="73" y="53" width="10" height="10" /></bezel>
-
- <bezel name="pos71" element="piece"><bounds x="3" y="63" width="10" height="10" /></bezel>
- <bezel name="pos72" element="piece"><bounds x="13" y="63" width="10" height="10" /></bezel>
- <bezel name="pos73" element="piece"><bounds x="23" y="63" width="10" height="10" /></bezel>
- <bezel name="pos74" element="piece"><bounds x="33" y="63" width="10" height="10" /></bezel>
- <bezel name="pos75" element="piece"><bounds x="43" y="63" width="10" height="10" /></bezel>
- <bezel name="pos76" element="piece"><bounds x="53" y="63" width="10" height="10" /></bezel>
- <bezel name="pos77" element="piece"><bounds x="63" y="63" width="10" height="10" /></bezel>
- <bezel name="pos78" element="piece"><bounds x="73" y="63" width="10" height="10" /></bezel>
-
- <bezel name="pos81" element="piece"><bounds x="3" y="73" width="10" height="10" /></bezel>
- <bezel name="pos82" element="piece"><bounds x="13" y="73" width="10" height="10" /></bezel>
- <bezel name="pos83" element="piece"><bounds x="23" y="73" width="10" height="10" /></bezel>
- <bezel name="pos84" element="piece"><bounds x="33" y="73" width="10" height="10" /></bezel>
- <bezel name="pos85" element="piece"><bounds x="43" y="73" width="10" height="10" /></bezel>
- <bezel name="pos86" element="piece"><bounds x="53" y="73" width="10" height="10" /></bezel>
- <bezel name="pos87" element="piece"><bounds x="63" y="73" width="10" height="10" /></bezel>
- <bezel name="pos88" element="piece"><bounds x="73" y="73" width="10" height="10" /></bezel>
-
<!-- chessboard leds -->
<bezel name="0.15" element="led"><bounds x="3.2" y="11.3" width="1.5" height="1.5" /></bezel>
@@ -589,12 +419,12 @@
<bezel element="text_re"><bounds x="88.2" y="15.2" width="5" height="3" /></bezel>
<bezel element="text_cl"><bounds x="88.2" y="24" width="5" height="3" /></bezel>
- <bezel element="text_king"><bounds x="88.2" y="32.1" width="5" height="4" /></bezel>
- <bezel element="text_queen"><bounds x="88.2" y="40.9" width="5" height="4" /></bezel>
- <bezel element="text_bishop"><bounds x="88.2" y="49.7" width="5" height="4" /></bezel>
- <bezel element="text_knight"><bounds x="88.2" y="58.5" width="5" height="4" /></bezel>
- <bezel element="text_rook"><bounds x="88.2" y="67.3" width="5" height="4" /></bezel>
- <bezel element="text_pawn"><bounds x="88.2" y="76.1" width="5" height="4" /></bezel>
+ <bezel element="text_king"><bounds x="88.2" y="32.8" width="5" height="3" /></bezel>
+ <bezel element="text_queen"><bounds x="88.2" y="41.6" width="5" height="3" /></bezel>
+ <bezel element="text_bishop"><bounds x="88.2" y="50.4" width="5" height="3" /></bezel>
+ <bezel element="text_knight"><bounds x="88.2" y="59.2" width="5" height="3" /></bezel>
+ <bezel element="text_rook"><bounds x="88.2" y="68" width="5" height="3" /></bezel>
+ <bezel element="text_pawn"><bounds x="88.2" y="76.8" width="5" height="3" /></bezel>
<bezel element="hlb" inputtag="IN.8" inputmask="0x80"><bounds x="87" y="13" width="7.4" height="7.4" /><color alpha="0.3" /></bezel>
<bezel element="hlb" inputtag="IN.8" inputmask="0x40"><bounds x="87" y="21.8" width="7.4" height="7.4" /><color alpha="0.3" /></bezel>
diff --git a/src/mame/layout/fidel_des.lay b/src/mame/layout/fidel_des.lay
index 238b0b5562d..1fbe3d751d2 100644
--- a/src/mame/layout/fidel_des.lay
+++ b/src/mame/layout/fidel_des.lay
@@ -189,27 +189,27 @@
<element name="text_tl7">
<rect><color red="0.81" green="0.8" blue="0.79" /></rect>
- <text string="&#x265a;"><color red="0.17" green="0.15" blue="0.15" /></text>
+ <text string="[K]"><color red="0.17" green="0.15" blue="0.15" /></text>
</element>
<element name="text_tl6">
<rect><color red="0.81" green="0.8" blue="0.79" /></rect>
- <text string="&#x265b;"><color red="0.17" green="0.15" blue="0.15" /></text>
+ <text string="[Q]"><color red="0.17" green="0.15" blue="0.15" /></text>
</element>
<element name="text_tl5">
<rect><color red="0.81" green="0.8" blue="0.79" /></rect>
- <text string="&#x265c;"><color red="0.17" green="0.15" blue="0.15" /></text>
+ <text string="[R]"><color red="0.17" green="0.15" blue="0.15" /></text>
</element>
<element name="text_tl4">
<rect><color red="0.81" green="0.8" blue="0.79" /></rect>
- <text string="&#x265d;"><color red="0.17" green="0.15" blue="0.15" /></text>
+ <text string="[B]"><color red="0.17" green="0.15" blue="0.15" /></text>
</element>
<element name="text_tl3">
<rect><color red="0.81" green="0.8" blue="0.79" /></rect>
- <text string="&#x265e;"><color red="0.17" green="0.15" blue="0.15" /></text>
+ <text string="[N]"><color red="0.17" green="0.15" blue="0.15" /></text>
</element>
<element name="text_tl2">
<rect><color red="0.81" green="0.8" blue="0.79" /></rect>
- <text string="&#x265f;"><color red="0.17" green="0.15" blue="0.15" /></text>
+ <text string="[P]"><color red="0.17" green="0.15" blue="0.15" /></text>
</element>
@@ -407,12 +407,12 @@
<bezel element="white"><bounds x="87.3" y="64.3" width="7.4" height="3.4" /></bezel>
<bezel element="white"><bounds x="87.3" y="73.3" width="7.4" height="3.4" /></bezel>
- <bezel element="text_tl7"><bounds x="87" y="11.6" width="6" height="3.5" /></bezel>
- <bezel element="text_tl6"><bounds x="87" y="21.6" width="6" height="3.5" /></bezel>
- <bezel element="text_tl5"><bounds x="87" y="31.6" width="6" height="3.5" /></bezel>
- <bezel element="text_tl4"><bounds x="87" y="41.6" width="6" height="3.5" /></bezel>
- <bezel element="text_tl3"><bounds x="87" y="51.6" width="6" height="3.5" /></bezel>
- <bezel element="text_tl2"><bounds x="87" y="61.6" width="6" height="3.5" /></bezel>
+ <bezel element="text_tl7"><bounds x="87" y="12" width="6" height="2.5" /></bezel>
+ <bezel element="text_tl6"><bounds x="87" y="22" width="6" height="2.5" /></bezel>
+ <bezel element="text_tl5"><bounds x="87" y="32" width="6" height="2.5" /></bezel>
+ <bezel element="text_tl4"><bounds x="87" y="42" width="6" height="2.5" /></bezel>
+ <bezel element="text_tl3"><bounds x="87" y="52" width="6" height="2.5" /></bezel>
+ <bezel element="text_tl2"><bounds x="87" y="62" width="6" height="2.5" /></bezel>
<bezel element="disk_black"><bounds x="87" y="5" width="6" height="6" /></bezel>
<bezel element="disk_black"><bounds x="87" y="15" width="6" height="6" /></bezel>
diff --git a/src/mame/layout/fidel_desdis.lay b/src/mame/layout/fidel_desdis.lay
index 84b93b034fc..3ebeaaea932 100644
--- a/src/mame/layout/fidel_desdis.lay
+++ b/src/mame/layout/fidel_desdis.lay
@@ -191,36 +191,36 @@
<element name="text_king">
<rect><color red="0.81" green="0.8" blue="0.79" /></rect>
- <text string="&#x265a;"><color red="0.17" green="0.15" blue="0.15" /></text>
+ <text string="[K]"><color red="0.17" green="0.15" blue="0.15" /></text>
</element>
<element name="text_queen">
<rect><color red="0.81" green="0.8" blue="0.79" /></rect>
- <text string="&#x265b;"><color red="0.17" green="0.15" blue="0.15" /></text>
+ <text string="[Q]"><color red="0.17" green="0.15" blue="0.15" /></text>
</element>
<element name="text_rook">
<rect><color red="0.81" green="0.8" blue="0.79" /></rect>
- <text string="&#x265c;"><color red="0.17" green="0.15" blue="0.15" /></text>
+ <text string="[R]"><color red="0.17" green="0.15" blue="0.15" /></text>
</element>
<element name="text_bishop">
<rect><color red="0.81" green="0.8" blue="0.79" /></rect>
- <text string="&#x265d;"><color red="0.17" green="0.15" blue="0.15" /></text>
+ <text string="[B]"><color red="0.17" green="0.15" blue="0.15" /></text>
</element>
<element name="text_knight">
<rect><color red="0.81" green="0.8" blue="0.79" /></rect>
- <text string="&#x265e;"><color red="0.17" green="0.15" blue="0.15" /></text>
+ <text string="[N]"><color red="0.17" green="0.15" blue="0.15" /></text>
</element>
<element name="text_pawn">
<rect><color red="0.81" green="0.8" blue="0.79" /></rect>
- <text string="&#x265f;"><color red="0.17" green="0.15" blue="0.15" /></text>
+ <text string="[P]"><color red="0.17" green="0.15" blue="0.15" /></text>
</element>
<!-- build screen -->
<view name="Internal Layout">
- <bounds left="-7" right="93" top="-2" bottom="103" />
+ <bounds left="-7" right="93" top="-2" bottom="102.5" />
- <bezel element="white"><bounds x="-7.5" y="-2.5" width="101" height="106" /></bezel>
+ <bezel element="white"><bounds x="-7.5" y="-2.5" width="101" height="105.5" /></bezel>
<!-- chessboard coords -->
@@ -400,12 +400,12 @@
<bezel element="text_u5"><bounds x="64" y="96.3" width="10" height="1.8" /></bezel>
<bezel element="text_u6"><bounds x="73" y="96.3" width="10" height="1.8" /></bezel>
- <bezel element="text_king"><bounds x="3" y="98" width="10" height="4" /></bezel>
- <bezel element="text_queen"><bounds x="12" y="98" width="10" height="4" /></bezel>
- <bezel element="text_rook"><bounds x="21" y="98" width="10" height="4" /></bezel>
- <bezel element="text_bishop"><bounds x="55" y="98" width="10" height="4" /></bezel>
- <bezel element="text_knight"><bounds x="64" y="98" width="10" height="4" /></bezel>
- <bezel element="text_pawn"><bounds x="73" y="98" width="10" height="4" /></bezel>
+ <bezel element="text_king"><bounds x="3" y="98.5" width="10" height="2.65" /></bezel>
+ <bezel element="text_queen"><bounds x="12" y="98.5" width="10" height="2.65" /></bezel>
+ <bezel element="text_rook"><bounds x="21" y="98.5" width="10" height="2.65" /></bezel>
+ <bezel element="text_bishop"><bounds x="55" y="98.5" width="10" height="2.65" /></bezel>
+ <bezel element="text_knight"><bounds x="64" y="98.5" width="10" height="2.65" /></bezel>
+ <bezel element="text_pawn"><bounds x="73" y="98.5" width="10" height="2.65" /></bezel>
<bezel element="disk_black"><bounds x="6" y="92" width="4" height="4" /></bezel>
<bezel element="disk_black"><bounds x="15" y="92" width="4" height="4" /></bezel>
diff --git a/src/mame/layout/fidel_desdis_68kg.lay b/src/mame/layout/fidel_desdis_68kg.lay
index e3f2d8cdc9b..8929b48c261 100644
--- a/src/mame/layout/fidel_desdis_68kg.lay
+++ b/src/mame/layout/fidel_desdis_68kg.lay
@@ -195,36 +195,36 @@
<element name="text_king">
<rect><color red="0.81" green="0.8" blue="0.79" /></rect>
- <text string="&#x265a;"><color red="0.17" green="0.15" blue="0.15" /></text>
+ <text string="[K]"><color red="0.17" green="0.15" blue="0.15" /></text>
</element>
<element name="text_queen">
<rect><color red="0.81" green="0.8" blue="0.79" /></rect>
- <text string="&#x265b;"><color red="0.17" green="0.15" blue="0.15" /></text>
+ <text string="[Q]"><color red="0.17" green="0.15" blue="0.15" /></text>
</element>
<element name="text_rook">
<rect><color red="0.81" green="0.8" blue="0.79" /></rect>
- <text string="&#x265c;"><color red="0.17" green="0.15" blue="0.15" /></text>
+ <text string="[R]"><color red="0.17" green="0.15" blue="0.15" /></text>
</element>
<element name="text_bishop">
<rect><color red="0.81" green="0.8" blue="0.79" /></rect>
- <text string="&#x265d;"><color red="0.17" green="0.15" blue="0.15" /></text>
+ <text string="[B]"><color red="0.17" green="0.15" blue="0.15" /></text>
</element>
<element name="text_knight">
<rect><color red="0.81" green="0.8" blue="0.79" /></rect>
- <text string="&#x265e;"><color red="0.17" green="0.15" blue="0.15" /></text>
+ <text string="[N]"><color red="0.17" green="0.15" blue="0.15" /></text>
</element>
<element name="text_pawn">
<rect><color red="0.81" green="0.8" blue="0.79" /></rect>
- <text string="&#x265f;"><color red="0.17" green="0.15" blue="0.15" /></text>
+ <text string="[P]"><color red="0.17" green="0.15" blue="0.15" /></text>
</element>
<!-- build screen -->
<view name="Internal Layout">
- <bounds left="-7" right="93" top="-2" bottom="103" />
+ <bounds left="-7" right="93" top="-2" bottom="102.5" />
- <bezel element="white"><bounds x="-7.5" y="-2.5" width="101" height="106" /></bezel>
+ <bezel element="white"><bounds x="-7.5" y="-2.5" width="101" height="105.5" /></bezel>
<!-- chessboard coords -->
@@ -404,12 +404,12 @@
<bezel element="text_u5"><bounds x="64" y="96.3" width="10" height="1.8" /></bezel>
<bezel element="text_u6"><bounds x="73" y="96.3" width="10" height="1.8" /></bezel>
- <bezel element="text_king"><bounds x="3" y="98" width="10" height="4" /></bezel>
- <bezel element="text_queen"><bounds x="12" y="98" width="10" height="4" /></bezel>
- <bezel element="text_rook"><bounds x="21" y="98" width="10" height="4" /></bezel>
- <bezel element="text_bishop"><bounds x="55" y="98" width="10" height="4" /></bezel>
- <bezel element="text_knight"><bounds x="64" y="98" width="10" height="4" /></bezel>
- <bezel element="text_pawn"><bounds x="73" y="98" width="10" height="4" /></bezel>
+ <bezel element="text_king"><bounds x="3" y="98.5" width="10" height="2.65" /></bezel>
+ <bezel element="text_queen"><bounds x="12" y="98.5" width="10" height="2.65" /></bezel>
+ <bezel element="text_rook"><bounds x="21" y="98.5" width="10" height="2.65" /></bezel>
+ <bezel element="text_bishop"><bounds x="55" y="98.5" width="10" height="2.65" /></bezel>
+ <bezel element="text_knight"><bounds x="64" y="98.5" width="10" height="2.65" /></bezel>
+ <bezel element="text_pawn"><bounds x="73" y="98.5" width="10" height="2.65" /></bezel>
<bezel element="disk_black"><bounds x="6" y="92" width="4" height="4" /></bezel>
<bezel element="disk_black"><bounds x="15" y="92" width="4" height="4" /></bezel>
diff --git a/src/mame/layout/fidel_desdis_68kr.lay b/src/mame/layout/fidel_desdis_68kr.lay
index d07f864435a..7d1a93d8b0e 100644
--- a/src/mame/layout/fidel_desdis_68kr.lay
+++ b/src/mame/layout/fidel_desdis_68kr.lay
@@ -190,36 +190,36 @@
<element name="text_king">
<rect><color red="0.81" green="0.8" blue="0.79" /></rect>
- <text string="&#x265a;"><color red="0.17" green="0.15" blue="0.15" /></text>
+ <text string="[K]"><color red="0.17" green="0.15" blue="0.15" /></text>
</element>
<element name="text_queen">
<rect><color red="0.81" green="0.8" blue="0.79" /></rect>
- <text string="&#x265b;"><color red="0.17" green="0.15" blue="0.15" /></text>
+ <text string="[Q]"><color red="0.17" green="0.15" blue="0.15" /></text>
</element>
<element name="text_rook">
<rect><color red="0.81" green="0.8" blue="0.79" /></rect>
- <text string="&#x265c;"><color red="0.17" green="0.15" blue="0.15" /></text>
+ <text string="[R]"><color red="0.17" green="0.15" blue="0.15" /></text>
</element>
<element name="text_bishop">
<rect><color red="0.81" green="0.8" blue="0.79" /></rect>
- <text string="&#x265d;"><color red="0.17" green="0.15" blue="0.15" /></text>
+ <text string="[B]"><color red="0.17" green="0.15" blue="0.15" /></text>
</element>
<element name="text_knight">
<rect><color red="0.81" green="0.8" blue="0.79" /></rect>
- <text string="&#x265e;"><color red="0.17" green="0.15" blue="0.15" /></text>
+ <text string="[N]"><color red="0.17" green="0.15" blue="0.15" /></text>
</element>
<element name="text_pawn">
<rect><color red="0.81" green="0.8" blue="0.79" /></rect>
- <text string="&#x265f;"><color red="0.17" green="0.15" blue="0.15" /></text>
+ <text string="[P]"><color red="0.17" green="0.15" blue="0.15" /></text>
</element>
<!-- build screen -->
<view name="Internal Layout">
- <bounds left="-7" right="93" top="-2" bottom="103" />
+ <bounds left="-7" right="93" top="-2" bottom="102.5" />
- <bezel element="white"><bounds x="-7.5" y="-2.5" width="101" height="106" /></bezel>
+ <bezel element="white"><bounds x="-7.5" y="-2.5" width="101" height="105.5" /></bezel>
<!-- chessboard coords -->
@@ -399,12 +399,12 @@
<bezel element="text_u5"><bounds x="64" y="96.3" width="10" height="1.8" /></bezel>
<bezel element="text_u6"><bounds x="73" y="96.3" width="10" height="1.8" /></bezel>
- <bezel element="text_king"><bounds x="3" y="98" width="10" height="4" /></bezel>
- <bezel element="text_queen"><bounds x="12" y="98" width="10" height="4" /></bezel>
- <bezel element="text_rook"><bounds x="21" y="98" width="10" height="4" /></bezel>
- <bezel element="text_bishop"><bounds x="55" y="98" width="10" height="4" /></bezel>
- <bezel element="text_knight"><bounds x="64" y="98" width="10" height="4" /></bezel>
- <bezel element="text_pawn"><bounds x="73" y="98" width="10" height="4" /></bezel>
+ <bezel element="text_king"><bounds x="3" y="98.5" width="10" height="2.65" /></bezel>
+ <bezel element="text_queen"><bounds x="12" y="98.5" width="10" height="2.65" /></bezel>
+ <bezel element="text_rook"><bounds x="21" y="98.5" width="10" height="2.65" /></bezel>
+ <bezel element="text_bishop"><bounds x="55" y="98.5" width="10" height="2.65" /></bezel>
+ <bezel element="text_knight"><bounds x="64" y="98.5" width="10" height="2.65" /></bezel>
+ <bezel element="text_pawn"><bounds x="73" y="98.5" width="10" height="2.65" /></bezel>
<bezel element="disk_black"><bounds x="6" y="92" width="4" height="4" /></bezel>
<bezel element="disk_black"><bounds x="15" y="92" width="4" height="4" /></bezel>
diff --git a/src/mame/layout/fidel_dsc.lay b/src/mame/layout/fidel_dsc.lay
index 1f4ac23da0d..33237310fad 100644
--- a/src/mame/layout/fidel_dsc.lay
+++ b/src/mame/layout/fidel_dsc.lay
@@ -259,14 +259,6 @@
<disk><color red="0.81" green="0.8" blue="0.79" /></disk>
<text string="LV"><color red="0.17" green="0.15" blue="0.15" /></text>
</element>
- <element name="text_k1">
- <disk><color red="0.81" green="0.8" blue="0.79" /></disk>
- <text string="&#x2654;"><color red="0.17" green="0.15" blue="0.15" /></text>
- </element>
- <element name="text_k2">
- <disk><color red="0.17" green="0.15" blue="0.15" /></disk>
- <text string="&#x265a;"><color red="0.81" green="0.8" blue="0.79" /></text>
- </element>
<!-- build screen -->
@@ -477,10 +469,10 @@
<bounds x="104" y="-11.5" width="5.66" height="8.5" />
</bezel>
- <bezel name="x.x" element="led">
+ <bezel name="1.7" element="led">
<bounds x="96.76" y="-10" width="0.85" height="0.85" />
</bezel>
- <bezel name="x.x" element="led">
+ <bezel name="0.7" element="led">
<bounds x="96.31" y="-5.35" width="0.85" height="0.85" />
</bezel>
@@ -514,8 +506,24 @@
<bezel element="text_lv"><bounds x="108" y="36.5" width="5" height="3" /></bezel>
<bezel element="text_cl"><bounds x="108" y="46.5" width="5" height="3" /></bezel>
<bezel element="text_rv"><bounds x="108" y="56.5" width="5" height="3" /></bezel>
- <bezel element="text_k1"><bounds x="108.5" y="75.5" width="4.5" height="4.5" /></bezel>
- <bezel element="text_k2"><bounds x="108.5" y="95.5" width="4.5" height="4.5" /></bezel>
+
+ <bezel element="black"><bounds x="109" y="76.5" width="3" height="0.3" /></bezel>
+ <bezel element="black"><bounds x="109" y="77.5" width="3" height="0.3" /></bezel>
+ <bezel element="black"><bounds x="109" y="78.1" width="3" height="0.3" /></bezel>
+ <bezel element="black"><bounds x="109" y="79.1" width="3" height="0.3" /></bezel>
+ <bezel element="black"><bounds x="109" y="76.6" width="0.3" height="1.1" /></bezel>
+ <bezel element="black"><bounds x="109" y="78.2" width="0.3" height="1.1" /></bezel>
+ <bezel element="black"><bounds x="111.7" y="76.6" width="0.3" height="1.1" /></bezel>
+ <bezel element="black"><bounds x="111.7" y="78.2" width="0.3" height="1.1" /></bezel>
+
+ <bezel element="white"><bounds x="109" y="96.5" width="3" height="0.3" /></bezel>
+ <bezel element="white"><bounds x="109" y="97.5" width="3" height="0.3" /></bezel>
+ <bezel element="white"><bounds x="109" y="98.1" width="3" height="0.3" /></bezel>
+ <bezel element="white"><bounds x="109" y="99.1" width="3" height="0.3" /></bezel>
+ <bezel element="white"><bounds x="109" y="96.6" width="0.3" height="1.1" /></bezel>
+ <bezel element="white"><bounds x="109" y="98.2" width="0.3" height="1.1" /></bezel>
+ <bezel element="white"><bounds x="111.7" y="96.6" width="0.3" height="1.1" /></bezel>
+ <bezel element="white"><bounds x="111.7" y="98.2" width="0.3" height="1.1" /></bezel>
<bezel element="hlb" inputtag="IN.7" inputmask="0x10"><bounds x="107" y="14.5" width="7" height="7" /><color alpha="0.3" /></bezel>
<bezel element="hlb" inputtag="IN.7" inputmask="0x20"><bounds x="107" y="24.5" width="7" height="7" /><color alpha="0.3" /></bezel>
diff --git a/src/mame/layout/fidel_eag.lay b/src/mame/layout/fidel_eag.lay
index 1ed8c3879c8..7583ea36c32 100644
--- a/src/mame/layout/fidel_eag.lay
+++ b/src/mame/layout/fidel_eag.lay
@@ -111,12 +111,12 @@
<text string="H"><color red="0.01" green="0.01" blue="0.01" /></text>
</element>
- <element name="text_r11"><text string="&#x265a;"><color red="0.81" green="0.8" blue="0.79" /></text></element>
- <element name="text_r21"><text string="&#x265b;"><color red="0.81" green="0.8" blue="0.79" /></text></element>
- <element name="text_r31"><text string="&#x265c;"><color red="0.81" green="0.8" blue="0.79" /></text></element>
- <element name="text_r41"><text string="&#x265d;"><color red="0.81" green="0.8" blue="0.79" /></text></element>
- <element name="text_r51"><text string="&#x265e;"><color red="0.81" green="0.8" blue="0.79" /></text></element>
- <element name="text_r61"><text string="&#x265f;"><color red="0.81" green="0.8" blue="0.79" /></text></element>
+ <element name="text_r11"><text string="[K]"><color red="0.81" green="0.8" blue="0.79" /></text></element>
+ <element name="text_r21"><text string="[Q]"><color red="0.81" green="0.8" blue="0.79" /></text></element>
+ <element name="text_r31"><text string="[R]"><color red="0.81" green="0.8" blue="0.79" /></text></element>
+ <element name="text_r41"><text string="[B]"><color red="0.81" green="0.8" blue="0.79" /></text></element>
+ <element name="text_r51"><text string="[N]"><color red="0.81" green="0.8" blue="0.79" /></text></element>
+ <element name="text_r61"><text string="[P]"><color red="0.81" green="0.8" blue="0.79" /></text></element>
<element name="text_r12"><text string="PB" align="1"><color red="0.81" green="0.8" blue="0.79" /></text></element>
<element name="text_r22"><text string="PV" align="1"><color red="0.81" green="0.8" blue="0.79" /></text></element>
@@ -375,21 +375,21 @@
<!-- right side -->
- <bezel element="text_r11"><bounds x="91.5" y="29.3" width="2.5" height="2" /></bezel>
- <bezel element="text_r21"><bounds x="91.5" y="31.8" width="2.5" height="2" /></bezel>
- <bezel element="text_r31"><bounds x="91.5" y="34.3" width="2.5" height="2" /></bezel>
- <bezel element="text_r41"><bounds x="91.5" y="36.8" width="2.5" height="2" /></bezel>
- <bezel element="text_r51"><bounds x="91.5" y="39.3" width="2.5" height="2" /></bezel>
- <bezel element="text_r61"><bounds x="91.5" y="41.8" width="2.5" height="2" /></bezel>
-
- <bezel element="text_r12"><bounds x="96.8" y="29.75" width="10" height="1.5" /></bezel>
- <bezel element="text_r22"><bounds x="96.8" y="32.25" width="10" height="1.5" /></bezel>
- <bezel element="text_r32"><bounds x="96.8" y="34.75" width="10" height="1.5" /></bezel>
- <bezel element="text_r42"><bounds x="96.8" y="37.25" width="10" height="1.5" /></bezel>
- <bezel element="text_r52"><bounds x="96.8" y="39.75" width="10" height="1.5" /></bezel>
- <bezel element="text_r62"><bounds x="96.8" y="42.25" width="10" height="1.5" /></bezel>
- <bezel element="text_r72"><bounds x="96.8" y="44.75" width="10" height="1.5" /></bezel>
- <bezel element="text_r82"><bounds x="96.8" y="47.25" width="10" height="1.5" /></bezel>
+ <bezel element="text_r11"><bounds x="91.6" y="29.65" width="2.5" height="1.5" /></bezel>
+ <bezel element="text_r21"><bounds x="91.6" y="32.15" width="2.5" height="1.5" /></bezel>
+ <bezel element="text_r31"><bounds x="91.6" y="34.65" width="2.5" height="1.5" /></bezel>
+ <bezel element="text_r41"><bounds x="91.6" y="37.15" width="2.5" height="1.5" /></bezel>
+ <bezel element="text_r51"><bounds x="91.6" y="39.65" width="2.5" height="1.5" /></bezel>
+ <bezel element="text_r61"><bounds x="91.6" y="42.15" width="2.5" height="1.5" /></bezel>
+
+ <bezel element="text_r12"><bounds x="96.8" y="29.65" width="10" height="1.5" /></bezel>
+ <bezel element="text_r22"><bounds x="96.8" y="32.15" width="10" height="1.5" /></bezel>
+ <bezel element="text_r32"><bounds x="96.8" y="34.65" width="10" height="1.5" /></bezel>
+ <bezel element="text_r42"><bounds x="96.8" y="37.15" width="10" height="1.5" /></bezel>
+ <bezel element="text_r52"><bounds x="96.8" y="39.65" width="10" height="1.5" /></bezel>
+ <bezel element="text_r62"><bounds x="96.8" y="42.15" width="10" height="1.5" /></bezel>
+ <bezel element="text_r72"><bounds x="96.8" y="44.65" width="10" height="1.5" /></bezel>
+ <bezel element="text_r82"><bounds x="96.8" y="47.15" width="10" height="1.5" /></bezel>
<bezel element="text_r92"><bounds x="96.8" y="49.5" width="10" height="1.5" /></bezel>
<bezel element="text_r93"><bounds x="96.8" y="51" width="10" height="1.5" /></bezel>
@@ -411,8 +411,8 @@
<bezel element="bt" inputtag="IN.8" inputmask="0x01"><bounds x="94" y="47" width="2" height="2" /></bezel>
<bezel element="bt" inputtag="IN.2" inputmask="0x100"><bounds x="94" y="49.5" width="2" height="2" /></bezel>
- <bezel element="text_rx2"><bounds x="96.8" y="79.75" width="10" height="1.5" /></bezel>
- <bezel element="text_ry2"><bounds x="96.8" y="82.25" width="10" height="1.5" /></bezel>
+ <bezel element="text_rx2"><bounds x="96.8" y="79.65" width="10" height="1.5" /></bezel>
+ <bezel element="text_ry2"><bounds x="96.8" y="82.15" width="10" height="1.5" /></bezel>
<bezel element="text_rx1"><bounds x="88" y="78.75" width="6" height="1" /></bezel>
<bezel element="text_ry1"><bounds x="88" y="81.25" width="5.5" height="1" /></bezel>
diff --git a/src/mame/layout/fidel_eag_68k.lay b/src/mame/layout/fidel_eag_68k.lay
index 938daaa40f4..6e3555b4e1a 100644
--- a/src/mame/layout/fidel_eag_68k.lay
+++ b/src/mame/layout/fidel_eag_68k.lay
@@ -111,12 +111,12 @@
<text string="H"><color red="0.01" green="0.01" blue="0.01" /></text>
</element>
- <element name="text_r11"><text string="&#x265a;"><color red="0.81" green="0.8" blue="0.79" /></text></element>
- <element name="text_r21"><text string="&#x265b;"><color red="0.81" green="0.8" blue="0.79" /></text></element>
- <element name="text_r31"><text string="&#x265c;"><color red="0.81" green="0.8" blue="0.79" /></text></element>
- <element name="text_r41"><text string="&#x265d;"><color red="0.81" green="0.8" blue="0.79" /></text></element>
- <element name="text_r51"><text string="&#x265e;"><color red="0.81" green="0.8" blue="0.79" /></text></element>
- <element name="text_r61"><text string="&#x265f;"><color red="0.81" green="0.8" blue="0.79" /></text></element>
+ <element name="text_r11"><text string="[K]"><color red="0.81" green="0.8" blue="0.79" /></text></element>
+ <element name="text_r21"><text string="[Q]"><color red="0.81" green="0.8" blue="0.79" /></text></element>
+ <element name="text_r31"><text string="[R]"><color red="0.81" green="0.8" blue="0.79" /></text></element>
+ <element name="text_r41"><text string="[B]"><color red="0.81" green="0.8" blue="0.79" /></text></element>
+ <element name="text_r51"><text string="[N]"><color red="0.81" green="0.8" blue="0.79" /></text></element>
+ <element name="text_r61"><text string="[P]"><color red="0.81" green="0.8" blue="0.79" /></text></element>
<element name="text_r12"><text string="PB" align="1"><color red="0.81" green="0.8" blue="0.79" /></text></element>
<element name="text_r22"><text string="PV" align="1"><color red="0.81" green="0.8" blue="0.79" /></text></element>
@@ -375,21 +375,21 @@
<!-- right side -->
- <bezel element="text_r11"><bounds x="91.5" y="29.3" width="2.5" height="2" /></bezel>
- <bezel element="text_r21"><bounds x="91.5" y="31.8" width="2.5" height="2" /></bezel>
- <bezel element="text_r31"><bounds x="91.5" y="34.3" width="2.5" height="2" /></bezel>
- <bezel element="text_r41"><bounds x="91.5" y="36.8" width="2.5" height="2" /></bezel>
- <bezel element="text_r51"><bounds x="91.5" y="39.3" width="2.5" height="2" /></bezel>
- <bezel element="text_r61"><bounds x="91.5" y="41.8" width="2.5" height="2" /></bezel>
-
- <bezel element="text_r12"><bounds x="96.8" y="29.75" width="10" height="1.5" /></bezel>
- <bezel element="text_r22"><bounds x="96.8" y="32.25" width="10" height="1.5" /></bezel>
- <bezel element="text_r32"><bounds x="96.8" y="34.75" width="10" height="1.5" /></bezel>
- <bezel element="text_r42"><bounds x="96.8" y="37.25" width="10" height="1.5" /></bezel>
- <bezel element="text_r52"><bounds x="96.8" y="39.75" width="10" height="1.5" /></bezel>
- <bezel element="text_r62"><bounds x="96.8" y="42.25" width="10" height="1.5" /></bezel>
- <bezel element="text_r72"><bounds x="96.8" y="44.75" width="10" height="1.5" /></bezel>
- <bezel element="text_r82"><bounds x="96.8" y="47.25" width="10" height="1.5" /></bezel>
+ <bezel element="text_r11"><bounds x="91.6" y="29.65" width="2.5" height="1.5" /></bezel>
+ <bezel element="text_r21"><bounds x="91.6" y="32.15" width="2.5" height="1.5" /></bezel>
+ <bezel element="text_r31"><bounds x="91.6" y="34.65" width="2.5" height="1.5" /></bezel>
+ <bezel element="text_r41"><bounds x="91.6" y="37.15" width="2.5" height="1.5" /></bezel>
+ <bezel element="text_r51"><bounds x="91.6" y="39.65" width="2.5" height="1.5" /></bezel>
+ <bezel element="text_r61"><bounds x="91.6" y="42.15" width="2.5" height="1.5" /></bezel>
+
+ <bezel element="text_r12"><bounds x="96.8" y="29.65" width="10" height="1.5" /></bezel>
+ <bezel element="text_r22"><bounds x="96.8" y="32.15" width="10" height="1.5" /></bezel>
+ <bezel element="text_r32"><bounds x="96.8" y="34.65" width="10" height="1.5" /></bezel>
+ <bezel element="text_r42"><bounds x="96.8" y="37.15" width="10" height="1.5" /></bezel>
+ <bezel element="text_r52"><bounds x="96.8" y="39.65" width="10" height="1.5" /></bezel>
+ <bezel element="text_r62"><bounds x="96.8" y="42.15" width="10" height="1.5" /></bezel>
+ <bezel element="text_r72"><bounds x="96.8" y="44.65" width="10" height="1.5" /></bezel>
+ <bezel element="text_r82"><bounds x="96.8" y="47.15" width="10" height="1.5" /></bezel>
<bezel element="text_r92"><bounds x="96.8" y="49.5" width="10" height="1.5" /></bezel>
<bezel element="text_r93"><bounds x="96.8" y="51" width="10" height="1.5" /></bezel>
@@ -411,8 +411,8 @@
<bezel element="bt" inputtag="IN.8" inputmask="0x80"><bounds x="94" y="47" width="2" height="2" /></bezel>
<bezel element="bt" inputtag="IN.2" inputmask="0x100"><bounds x="94" y="49.5" width="2" height="2" /></bezel>
- <bezel element="text_rx2"><bounds x="96.8" y="79.75" width="10" height="1.5" /></bezel>
- <bezel element="text_ry2"><bounds x="96.8" y="82.25" width="10" height="1.5" /></bezel>
+ <bezel element="text_rx2"><bounds x="96.8" y="79.65" width="10" height="1.5" /></bezel>
+ <bezel element="text_ry2"><bounds x="96.8" y="82.15" width="10" height="1.5" /></bezel>
<bezel element="text_rx1"><bounds x="88" y="78.75" width="6" height="1" /></bezel>
<bezel element="text_ry1"><bounds x="88" y="81.25" width="5.5" height="1" /></bezel>
diff --git a/src/mame/layout/fidel_eas.lay b/src/mame/layout/fidel_eas.lay
index 57bc6dc6f89..ed98c3a7675 100644
--- a/src/mame/layout/fidel_eas.lay
+++ b/src/mame/layout/fidel_eas.lay
@@ -102,12 +102,12 @@
<text string="H"><color red="0.01" green="0.01" blue="0.01" /></text>
</element>
- <element name="text_p1"><text string="&#x265a;"><color red="0.81" green="0.8" blue="0.79" /></text></element>
- <element name="text_p2"><text string="&#x265b;"><color red="0.81" green="0.8" blue="0.79" /></text></element>
- <element name="text_p3"><text string="&#x265c;"><color red="0.81" green="0.8" blue="0.79" /></text></element>
- <element name="text_p4"><text string="&#x265d;"><color red="0.81" green="0.8" blue="0.79" /></text></element>
- <element name="text_p5"><text string="&#x265e;"><color red="0.81" green="0.8" blue="0.79" /></text></element>
- <element name="text_p6"><text string="&#x265f;"><color red="0.81" green="0.8" blue="0.79" /></text></element>
+ <element name="text_p1"><text string="[K]"><color red="0.81" green="0.8" blue="0.79" /></text></element>
+ <element name="text_p2"><text string="[Q]"><color red="0.81" green="0.8" blue="0.79" /></text></element>
+ <element name="text_p3"><text string="[R]"><color red="0.81" green="0.8" blue="0.79" /></text></element>
+ <element name="text_p4"><text string="[B]"><color red="0.81" green="0.8" blue="0.79" /></text></element>
+ <element name="text_p5"><text string="[N]"><color red="0.81" green="0.8" blue="0.79" /></text></element>
+ <element name="text_p6"><text string="[P]"><color red="0.81" green="0.8" blue="0.79" /></text></element>
<element name="text_b1"><text string="GAME"><color red="0.81" green="0.8" blue="0.79" /></text></element>
<element name="text_b1a"><text string="CONTROL"><color red="0.81" green="0.8" blue="0.79" /></text></element>
@@ -373,12 +373,12 @@
<bezel element="but" inputtag="IN.1" inputmask="0x100"><bounds x="65.1" y="94" width="1.5" height="1.5" /></bezel>
<bezel element="but" inputtag="IN.2" inputmask="0x100"><bounds x="68.1" y="94" width="1.5" height="1.5" /></bezel>
- <bezel element="text_p1"><bounds x="41" y="91.3" width="3.5" height="2.6" /></bezel>
- <bezel element="text_p2"><bounds x="44" y="91.3" width="3.5" height="2.6" /></bezel>
- <bezel element="text_p3"><bounds x="47" y="91.3" width="3.5" height="2.6" /></bezel>
- <bezel element="text_p4"><bounds x="50" y="91.3" width="3.5" height="2.6" /></bezel>
- <bezel element="text_p5"><bounds x="53" y="91.3" width="3.5" height="2.6" /></bezel>
- <bezel element="text_p6"><bounds x="56" y="91.3" width="3.5" height="2.6" /></bezel>
+ <bezel element="text_p1"><bounds x="41" y="92.1" width="3.5" height="1.5" /></bezel>
+ <bezel element="text_p2"><bounds x="44" y="92.1" width="3.5" height="1.5" /></bezel>
+ <bezel element="text_p3"><bounds x="47" y="92.1" width="3.5" height="1.5" /></bezel>
+ <bezel element="text_p4"><bounds x="50" y="92.1" width="3.5" height="1.5" /></bezel>
+ <bezel element="text_p5"><bounds x="53" y="92.1" width="3.5" height="1.5" /></bezel>
+ <bezel element="text_p6"><bounds x="56" y="92.1" width="3.5" height="1.5" /></bezel>
<bezel element="text_b1"><bounds x="30.9" y="95.8" width="7.5" height="1.5" /></bezel>
<bezel element="text_b1a"><bounds x="30.9" y="97.3" width="7.5" height="1.5" /></bezel>
diff --git a/src/mame/layout/fidel_eas_priv.lay b/src/mame/layout/fidel_eas_priv.lay
new file mode 100644
index 00000000000..7d67442371f
--- /dev/null
+++ b/src/mame/layout/fidel_eas_priv.lay
@@ -0,0 +1,438 @@
+<?xml version="1.0"?>
+<mamelayout version="2">
+
+<!-- define elements -->
+
+ <element name="digit" defstate="0">
+ <led7seg><color red="1.0" green="0.1" blue="0.15" /></led7seg>
+ </element>
+
+ <element name="led" defstate="0">
+ <disk state="1"><color red="1.0" green="0.1" blue="0.15" /></disk>
+ <disk state="0"><color red="0.1" green="0.01" blue="0.015" /></disk>
+ </element>
+ <element name="led2" defstate="0">
+ <disk state="1"><color red="1.0" green="0.1" blue="0.15" /></disk>
+ <disk state="0"><color red="0.14" green="0.014" blue="0.02" /></disk>
+ </element>
+
+ <element name="hl" defstate="0">
+ <text string=" ">
+ <bounds x="0.0" y="0.0" width="1.0" height="1.0" />
+ <color red="0.0" green="0.0" blue="0.0" />
+ </text>
+ <disk state="1">
+ <bounds x="0.12" y="0.12" width="0.76" height="0.76" />
+ <color red="1.0" green="1.0" blue="1.0" />
+ </disk>
+ </element>
+ <element name="but" defstate="0">
+ <disk state="0"><color red="0.17" green="0.15" blue="0.15" /></disk>
+ <disk state="1"><color red="0.34" green="0.3" blue="0.3" /></disk>
+ </element>
+
+ <element name="blackb"><rect><color red="0" green="0" blue="0" /></rect></element>
+ <element name="black"><rect><color red="0.17" green="0.15" blue="0.15" /></rect></element>
+ <element name="white"><rect><color red="0.81" green="0.8" blue="0.79" /></rect></element>
+ <element name="disk_black"><disk><color red="0.17" green="0.15" blue="0.15" /></disk></element>
+ <element name="disk_white"><disk><color red="0.81" green="0.8" blue="0.79" /></disk></element>
+
+ <element name="text_1"><text string="1"><color red="0.81" green="0.8" blue="0.79" /></text></element>
+ <element name="text_2"><text string="2"><color red="0.81" green="0.8" blue="0.79" /></text></element>
+ <element name="text_3"><text string="3"><color red="0.81" green="0.8" blue="0.79" /></text></element>
+ <element name="text_4"><text string="4"><color red="0.81" green="0.8" blue="0.79" /></text></element>
+ <element name="text_5"><text string="5"><color red="0.81" green="0.8" blue="0.79" /></text></element>
+ <element name="text_6"><text string="6"><color red="0.81" green="0.8" blue="0.79" /></text></element>
+ <element name="text_7"><text string="7"><color red="0.81" green="0.8" blue="0.79" /></text></element>
+ <element name="text_8"><text string="8"><color red="0.81" green="0.8" blue="0.79" /></text></element>
+
+ <element name="text_a"><text string="A"><color red="0.81" green="0.8" blue="0.79" /></text></element>
+ <element name="text_b"><text string="B"><color red="0.81" green="0.8" blue="0.79" /></text></element>
+ <element name="text_c"><text string="C"><color red="0.81" green="0.8" blue="0.79" /></text></element>
+ <element name="text_d"><text string="D"><color red="0.81" green="0.8" blue="0.79" /></text></element>
+ <element name="text_e"><text string="E"><color red="0.81" green="0.8" blue="0.79" /></text></element>
+ <element name="text_f"><text string="F"><color red="0.81" green="0.8" blue="0.79" /></text></element>
+ <element name="text_g"><text string="G"><color red="0.81" green="0.8" blue="0.79" /></text></element>
+ <element name="text_h"><text string="H"><color red="0.81" green="0.8" blue="0.79" /></text></element>
+
+ <element name="text_p1"><text string="[K]"><color red="0.81" green="0.8" blue="0.79" /></text></element>
+ <element name="text_p2"><text string="[Q]"><color red="0.81" green="0.8" blue="0.79" /></text></element>
+ <element name="text_p3"><text string="[R]"><color red="0.81" green="0.8" blue="0.79" /></text></element>
+ <element name="text_p4"><text string="[B]"><color red="0.81" green="0.8" blue="0.79" /></text></element>
+ <element name="text_p5"><text string="[N]"><color red="0.81" green="0.8" blue="0.79" /></text></element>
+ <element name="text_p6"><text string="[P]"><color red="0.81" green="0.8" blue="0.79" /></text></element>
+
+ <element name="text_b1"><text string="GAME"><color red="0.81" green="0.8" blue="0.79" /></text></element>
+ <element name="text_b1a"><text string="CONTROL"><color red="0.81" green="0.8" blue="0.79" /></text></element>
+ <element name="text_b2"><text string="spk"><color red="0.81" green="0.8" blue="0.79" /></text></element>
+ <element name="text_b3"><text string="PB"><color red="0.81" green="0.8" blue="0.79" /></text></element>
+ <element name="text_b4"><text string="PV"><color red="0.81" green="0.8" blue="0.79" /></text></element>
+ <element name="text_b5"><text string="TM"><color red="0.81" green="0.8" blue="0.79" /></text></element>
+ <element name="text_b6"><text string="ST"><color red="0.81" green="0.8" blue="0.79" /></text></element>
+ <element name="text_b7"><text string="TB"><color red="0.81" green="0.8" blue="0.79" /></text></element>
+ <element name="text_b8"><text string="LV"><color red="0.81" green="0.8" blue="0.79" /></text></element>
+ <element name="text_b9"><text string="DM"><color red="0.81" green="0.8" blue="0.79" /></text></element>
+ <element name="text_b10"><text string="CL"><color red="0.81" green="0.8" blue="0.79" /></text></element>
+ <element name="text_b11"><text string="RV"><color red="0.81" green="0.8" blue="0.79" /></text></element>
+
+ <element name="text_r1"><text string="YOUR MOVE" align="1"><color red="0.81" green="0.8" blue="0.79" /></text></element>
+ <element name="text_r2"><text string="CHECK" align="1"><color red="0.81" green="0.8" blue="0.79" /></text></element>
+
+
+<!-- build screen -->
+
+ <view name="Internal Layout">
+ <bounds left="0" right="138" top="0" bottom="86" />
+
+ <!-- chessboard 1 bezel -->
+
+ <bezel element="black"><bounds x="2" y="2" width="82" height="82" /></bezel>
+ <bezel element="white"><bounds x="3" y="3" width="80" height="80" /></bezel>
+
+ <bezel element="black"><bounds x="13" y="2.5" width="10" height="10.5" /></bezel>
+ <bezel element="black"><bounds x="33" y="2.5" width="10" height="10.5" /></bezel>
+ <bezel element="black"><bounds x="53" y="2.5" width="10" height="10.5" /></bezel>
+ <bezel element="black"><bounds x="73" y="2.5" width="10.5" height="10.5" /></bezel>
+
+ <bezel element="black"><bounds x="2.5" y="13" width="10.5" height="10" /></bezel>
+ <bezel element="black"><bounds x="23" y="13" width="10" height="10" /></bezel>
+ <bezel element="black"><bounds x="43" y="13" width="10" height="10" /></bezel>
+ <bezel element="black"><bounds x="63" y="13" width="10" height="10" /></bezel>
+
+ <bezel element="black"><bounds x="13" y="23" width="10" height="10" /></bezel>
+ <bezel element="black"><bounds x="33" y="23" width="10" height="10" /></bezel>
+ <bezel element="black"><bounds x="53" y="23" width="10" height="10" /></bezel>
+ <bezel element="black"><bounds x="73" y="23" width="10.5" height="10" /></bezel>
+
+ <bezel element="black"><bounds x="2.5" y="33" width="10.5" height="10" /></bezel>
+ <bezel element="black"><bounds x="23" y="33" width="10" height="10" /></bezel>
+ <bezel element="black"><bounds x="43" y="33" width="10" height="10" /></bezel>
+ <bezel element="black"><bounds x="63" y="33" width="10" height="10" /></bezel>
+
+ <bezel element="black"><bounds x="13" y="43" width="10" height="10" /></bezel>
+ <bezel element="black"><bounds x="33" y="43" width="10" height="10" /></bezel>
+ <bezel element="black"><bounds x="53" y="43" width="10" height="10" /></bezel>
+ <bezel element="black"><bounds x="73" y="43" width="10.5" height="10" /></bezel>
+
+ <bezel element="black"><bounds x="2.5" y="53" width="10.5" height="10" /></bezel>
+ <bezel element="black"><bounds x="23" y="53" width="10" height="10" /></bezel>
+ <bezel element="black"><bounds x="43" y="53" width="10" height="10" /></bezel>
+ <bezel element="black"><bounds x="63" y="53" width="10" height="10" /></bezel>
+
+ <bezel element="black"><bounds x="13" y="63" width="10" height="10" /></bezel>
+ <bezel element="black"><bounds x="33" y="63" width="10" height="10" /></bezel>
+ <bezel element="black"><bounds x="53" y="63" width="10" height="10" /></bezel>
+ <bezel element="black"><bounds x="73" y="63" width="10.5" height="10" /></bezel>
+
+ <bezel element="black"><bounds x="2.5" y="73" width="10.5" height="10.5" /></bezel>
+ <bezel element="black"><bounds x="23" y="73" width="10" height="10.5" /></bezel>
+ <bezel element="black"><bounds x="43" y="73" width="10" height="10.5" /></bezel>
+ <bezel element="black"><bounds x="63" y="73" width="10" height="10.5" /></bezel>
+
+ <!-- chessboard 1 sensors -->
+
+ <bezel element="hl" inputtag="IN.0" inputmask="0x01"><bounds x="3" y="3" width="10" height="10" /><color alpha="0.4" /></bezel>
+ <bezel element="hl" inputtag="IN.1" inputmask="0x01"><bounds x="13" y="3" width="10" height="10" /><color alpha="0.2" /></bezel>
+ <bezel element="hl" inputtag="IN.2" inputmask="0x01"><bounds x="23" y="3" width="10" height="10" /><color alpha="0.4" /></bezel>
+ <bezel element="hl" inputtag="IN.3" inputmask="0x01"><bounds x="33" y="3" width="10" height="10" /><color alpha="0.2" /></bezel>
+ <bezel element="hl" inputtag="IN.4" inputmask="0x01"><bounds x="43" y="3" width="10" height="10" /><color alpha="0.4" /></bezel>
+ <bezel element="hl" inputtag="IN.5" inputmask="0x01"><bounds x="53" y="3" width="10" height="10" /><color alpha="0.2" /></bezel>
+ <bezel element="hl" inputtag="IN.6" inputmask="0x01"><bounds x="63" y="3" width="10" height="10" /><color alpha="0.4" /></bezel>
+ <bezel element="hl" inputtag="IN.7" inputmask="0x01"><bounds x="73" y="3" width="10" height="10" /><color alpha="0.2" /></bezel>
+
+ <bezel element="hl" inputtag="IN.0" inputmask="0x02"><bounds x="3" y="13" width="10" height="10" /><color alpha="0.2" /></bezel>
+ <bezel element="hl" inputtag="IN.1" inputmask="0x02"><bounds x="13" y="13" width="10" height="10" /><color alpha="0.4" /></bezel>
+ <bezel element="hl" inputtag="IN.2" inputmask="0x02"><bounds x="23" y="13" width="10" height="10" /><color alpha="0.2" /></bezel>
+ <bezel element="hl" inputtag="IN.3" inputmask="0x02"><bounds x="33" y="13" width="10" height="10" /><color alpha="0.4" /></bezel>
+ <bezel element="hl" inputtag="IN.4" inputmask="0x02"><bounds x="43" y="13" width="10" height="10" /><color alpha="0.2" /></bezel>
+ <bezel element="hl" inputtag="IN.5" inputmask="0x02"><bounds x="53" y="13" width="10" height="10" /><color alpha="0.4" /></bezel>
+ <bezel element="hl" inputtag="IN.6" inputmask="0x02"><bounds x="63" y="13" width="10" height="10" /><color alpha="0.2" /></bezel>
+ <bezel element="hl" inputtag="IN.7" inputmask="0x02"><bounds x="73" y="13" width="10" height="10" /><color alpha="0.4" /></bezel>
+
+ <bezel element="hl" inputtag="IN.0" inputmask="0x04"><bounds x="3" y="23" width="10" height="10" /><color alpha="0.4" /></bezel>
+ <bezel element="hl" inputtag="IN.1" inputmask="0x04"><bounds x="13" y="23" width="10" height="10" /><color alpha="0.2" /></bezel>
+ <bezel element="hl" inputtag="IN.2" inputmask="0x04"><bounds x="23" y="23" width="10" height="10" /><color alpha="0.4" /></bezel>
+ <bezel element="hl" inputtag="IN.3" inputmask="0x04"><bounds x="33" y="23" width="10" height="10" /><color alpha="0.2" /></bezel>
+ <bezel element="hl" inputtag="IN.4" inputmask="0x04"><bounds x="43" y="23" width="10" height="10" /><color alpha="0.4" /></bezel>
+ <bezel element="hl" inputtag="IN.5" inputmask="0x04"><bounds x="53" y="23" width="10" height="10" /><color alpha="0.2" /></bezel>
+ <bezel element="hl" inputtag="IN.6" inputmask="0x04"><bounds x="63" y="23" width="10" height="10" /><color alpha="0.4" /></bezel>
+ <bezel element="hl" inputtag="IN.7" inputmask="0x04"><bounds x="73" y="23" width="10" height="10" /><color alpha="0.2" /></bezel>
+
+ <bezel element="hl" inputtag="IN.0" inputmask="0x08"><bounds x="3" y="33" width="10" height="10" /><color alpha="0.2" /></bezel>
+ <bezel element="hl" inputtag="IN.1" inputmask="0x08"><bounds x="13" y="33" width="10" height="10" /><color alpha="0.4" /></bezel>
+ <bezel element="hl" inputtag="IN.2" inputmask="0x08"><bounds x="23" y="33" width="10" height="10" /><color alpha="0.2" /></bezel>
+ <bezel element="hl" inputtag="IN.3" inputmask="0x08"><bounds x="33" y="33" width="10" height="10" /><color alpha="0.4" /></bezel>
+ <bezel element="hl" inputtag="IN.4" inputmask="0x08"><bounds x="43" y="33" width="10" height="10" /><color alpha="0.2" /></bezel>
+ <bezel element="hl" inputtag="IN.5" inputmask="0x08"><bounds x="53" y="33" width="10" height="10" /><color alpha="0.4" /></bezel>
+ <bezel element="hl" inputtag="IN.6" inputmask="0x08"><bounds x="63" y="33" width="10" height="10" /><color alpha="0.2" /></bezel>
+ <bezel element="hl" inputtag="IN.7" inputmask="0x08"><bounds x="73" y="33" width="10" height="10" /><color alpha="0.4" /></bezel>
+
+ <bezel element="hl" inputtag="IN.0" inputmask="0x10"><bounds x="3" y="43" width="10" height="10" /><color alpha="0.4" /></bezel>
+ <bezel element="hl" inputtag="IN.1" inputmask="0x10"><bounds x="13" y="43" width="10" height="10" /><color alpha="0.2" /></bezel>
+ <bezel element="hl" inputtag="IN.2" inputmask="0x10"><bounds x="23" y="43" width="10" height="10" /><color alpha="0.4" /></bezel>
+ <bezel element="hl" inputtag="IN.3" inputmask="0x10"><bounds x="33" y="43" width="10" height="10" /><color alpha="0.2" /></bezel>
+ <bezel element="hl" inputtag="IN.4" inputmask="0x10"><bounds x="43" y="43" width="10" height="10" /><color alpha="0.4" /></bezel>
+ <bezel element="hl" inputtag="IN.5" inputmask="0x10"><bounds x="53" y="43" width="10" height="10" /><color alpha="0.2" /></bezel>
+ <bezel element="hl" inputtag="IN.6" inputmask="0x10"><bounds x="63" y="43" width="10" height="10" /><color alpha="0.4" /></bezel>
+ <bezel element="hl" inputtag="IN.7" inputmask="0x10"><bounds x="73" y="43" width="10" height="10" /><color alpha="0.2" /></bezel>
+
+ <bezel element="hl" inputtag="IN.0" inputmask="0x20"><bounds x="3" y="53" width="10" height="10" /><color alpha="0.2" /></bezel>
+ <bezel element="hl" inputtag="IN.1" inputmask="0x20"><bounds x="13" y="53" width="10" height="10" /><color alpha="0.4" /></bezel>
+ <bezel element="hl" inputtag="IN.2" inputmask="0x20"><bounds x="23" y="53" width="10" height="10" /><color alpha="0.2" /></bezel>
+ <bezel element="hl" inputtag="IN.3" inputmask="0x20"><bounds x="33" y="53" width="10" height="10" /><color alpha="0.4" /></bezel>
+ <bezel element="hl" inputtag="IN.4" inputmask="0x20"><bounds x="43" y="53" width="10" height="10" /><color alpha="0.2" /></bezel>
+ <bezel element="hl" inputtag="IN.5" inputmask="0x20"><bounds x="53" y="53" width="10" height="10" /><color alpha="0.4" /></bezel>
+ <bezel element="hl" inputtag="IN.6" inputmask="0x20"><bounds x="63" y="53" width="10" height="10" /><color alpha="0.2" /></bezel>
+ <bezel element="hl" inputtag="IN.7" inputmask="0x20"><bounds x="73" y="53" width="10" height="10" /><color alpha="0.4" /></bezel>
+
+ <bezel element="hl" inputtag="IN.0" inputmask="0x40"><bounds x="3" y="63" width="10" height="10" /><color alpha="0.4" /></bezel>
+ <bezel element="hl" inputtag="IN.1" inputmask="0x40"><bounds x="13" y="63" width="10" height="10" /><color alpha="0.2" /></bezel>
+ <bezel element="hl" inputtag="IN.2" inputmask="0x40"><bounds x="23" y="63" width="10" height="10" /><color alpha="0.4" /></bezel>
+ <bezel element="hl" inputtag="IN.3" inputmask="0x40"><bounds x="33" y="63" width="10" height="10" /><color alpha="0.2" /></bezel>
+ <bezel element="hl" inputtag="IN.4" inputmask="0x40"><bounds x="43" y="63" width="10" height="10" /><color alpha="0.4" /></bezel>
+ <bezel element="hl" inputtag="IN.5" inputmask="0x40"><bounds x="53" y="63" width="10" height="10" /><color alpha="0.2" /></bezel>
+ <bezel element="hl" inputtag="IN.6" inputmask="0x40"><bounds x="63" y="63" width="10" height="10" /><color alpha="0.4" /></bezel>
+ <bezel element="hl" inputtag="IN.7" inputmask="0x40"><bounds x="73" y="63" width="10" height="10" /><color alpha="0.2" /></bezel>
+
+ <bezel element="hl" inputtag="IN.0" inputmask="0x80"><bounds x="3" y="73" width="10" height="10" /><color alpha="0.2" /></bezel>
+ <bezel element="hl" inputtag="IN.1" inputmask="0x80"><bounds x="13" y="73" width="10" height="10" /><color alpha="0.4" /></bezel>
+ <bezel element="hl" inputtag="IN.2" inputmask="0x80"><bounds x="23" y="73" width="10" height="10" /><color alpha="0.2" /></bezel>
+ <bezel element="hl" inputtag="IN.3" inputmask="0x80"><bounds x="33" y="73" width="10" height="10" /><color alpha="0.4" /></bezel>
+ <bezel element="hl" inputtag="IN.4" inputmask="0x80"><bounds x="43" y="73" width="10" height="10" /><color alpha="0.2" /></bezel>
+ <bezel element="hl" inputtag="IN.5" inputmask="0x80"><bounds x="53" y="73" width="10" height="10" /><color alpha="0.4" /></bezel>
+ <bezel element="hl" inputtag="IN.6" inputmask="0x80"><bounds x="63" y="73" width="10" height="10" /><color alpha="0.2" /></bezel>
+ <bezel element="hl" inputtag="IN.7" inputmask="0x80"><bounds x="73" y="73" width="10" height="10" /><color alpha="0.4" /></bezel>
+
+ <!-- chessboard 2 bezel -->
+
+ <bezel element="black"><bounds x="88" y="9" width="48" height="75" /></bezel>
+ <bezel element="blackb"><bounds x="88.5" y="9.5" width="48" height="75" /></bezel>
+
+ <bezel element="black"><bounds x="93" y="15" width="41" height="41" /></bezel>
+ <bezel element="white"><bounds x="93.5" y="15.5" width="40" height="40" /></bezel>
+
+ <bezel element="black"><bounds x="98.5" y="15.25" width="5" height="5.25" /></bezel>
+ <bezel element="black"><bounds x="108.5" y="15.25" width="5" height="5.25" /></bezel>
+ <bezel element="black"><bounds x="118.5" y="15.25" width="5" height="5.25" /></bezel>
+ <bezel element="black"><bounds x="128.5" y="15.25" width="5.25" height="5.25" /></bezel>
+
+ <bezel element="black"><bounds x="93.25" y="20.5" width="5.25" height="5" /></bezel>
+ <bezel element="black"><bounds x="103.5" y="20.5" width="5" height="5" /></bezel>
+ <bezel element="black"><bounds x="113.5" y="20.5" width="5" height="5" /></bezel>
+ <bezel element="black"><bounds x="123.5" y="20.5" width="5" height="5" /></bezel>
+
+ <bezel element="black"><bounds x="98.5" y="25.5" width="5" height="5" /></bezel>
+ <bezel element="black"><bounds x="108.5" y="25.5" width="5" height="5" /></bezel>
+ <bezel element="black"><bounds x="118.5" y="25.5" width="5" height="5" /></bezel>
+ <bezel element="black"><bounds x="128.5" y="25.5" width="5.25" height="5" /></bezel>
+
+ <bezel element="black"><bounds x="93.25" y="30.5" width="5.25" height="5" /></bezel>
+ <bezel element="black"><bounds x="103.5" y="30.5" width="5" height="5" /></bezel>
+ <bezel element="black"><bounds x="113.5" y="30.5" width="5" height="5" /></bezel>
+ <bezel element="black"><bounds x="123.5" y="30.5" width="5" height="5" /></bezel>
+
+ <bezel element="black"><bounds x="98.5" y="35.5" width="5" height="5" /></bezel>
+ <bezel element="black"><bounds x="108.5" y="35.5" width="5" height="5" /></bezel>
+ <bezel element="black"><bounds x="118.5" y="35.5" width="5" height="5" /></bezel>
+ <bezel element="black"><bounds x="128.5" y="35.5" width="5.25" height="5" /></bezel>
+
+ <bezel element="black"><bounds x="93.25" y="40.5" width="5.25" height="5" /></bezel>
+ <bezel element="black"><bounds x="103.5" y="40.5" width="5" height="5" /></bezel>
+ <bezel element="black"><bounds x="113.5" y="40.5" width="5" height="5" /></bezel>
+ <bezel element="black"><bounds x="123.5" y="40.5" width="5" height="5" /></bezel>
+
+ <bezel element="black"><bounds x="98.5" y="45.5" width="5" height="5" /></bezel>
+ <bezel element="black"><bounds x="108.5" y="45.5" width="5" height="5" /></bezel>
+ <bezel element="black"><bounds x="118.5" y="45.5" width="5" height="5" /></bezel>
+ <bezel element="black"><bounds x="128.5" y="45.5" width="5.25" height="5" /></bezel>
+
+ <bezel element="black"><bounds x="93.25" y="50.5" width="5.25" height="5.25" /></bezel>
+ <bezel element="black"><bounds x="103.5" y="50.5" width="5" height="5.25" /></bezel>
+ <bezel element="black"><bounds x="113.5" y="50.5" width="5" height="5.25" /></bezel>
+ <bezel element="black"><bounds x="123.5" y="50.5" width="5" height="5.25" /></bezel>
+
+ <!-- chessboard 2 coords -->
+
+ <bezel element="text_8"><bounds x="91" y="17.1" width="2" height="1.5" /></bezel>
+ <bezel element="text_7"><bounds x="91" y="22.1" width="2" height="1.5" /></bezel>
+ <bezel element="text_6"><bounds x="91" y="27.1" width="2" height="1.5" /></bezel>
+ <bezel element="text_5"><bounds x="91" y="32.1" width="2" height="1.5" /></bezel>
+ <bezel element="text_4"><bounds x="91" y="37.1" width="2" height="1.5" /></bezel>
+ <bezel element="text_3"><bounds x="91" y="42.1" width="2" height="1.5" /></bezel>
+ <bezel element="text_2"><bounds x="91" y="47.1" width="2" height="1.5" /></bezel>
+ <bezel element="text_1"><bounds x="91" y="52.1" width="2" height="1.5" /></bezel>
+
+ <bezel element="text_8"><bounds x="134" y="17.1" width="2" height="1.5" /></bezel>
+ <bezel element="text_7"><bounds x="134" y="22.1" width="2" height="1.5" /></bezel>
+ <bezel element="text_6"><bounds x="134" y="27.1" width="2" height="1.5" /></bezel>
+ <bezel element="text_5"><bounds x="134" y="32.1" width="2" height="1.5" /></bezel>
+ <bezel element="text_4"><bounds x="134" y="37.1" width="2" height="1.5" /></bezel>
+ <bezel element="text_3"><bounds x="134" y="42.1" width="2" height="1.5" /></bezel>
+ <bezel element="text_2"><bounds x="134" y="47.1" width="2" height="1.5" /></bezel>
+ <bezel element="text_1"><bounds x="134" y="52.1" width="2" height="1.5" /></bezel>
+
+ <bezel element="text_a"><bounds x="95" y="13" width="2" height="1.5" /></bezel>
+ <bezel element="text_b"><bounds x="100" y="13" width="2" height="1.5" /></bezel>
+ <bezel element="text_c"><bounds x="105" y="13" width="2" height="1.5" /></bezel>
+ <bezel element="text_d"><bounds x="110" y="13" width="2" height="1.5" /></bezel>
+ <bezel element="text_e"><bounds x="115" y="13" width="2" height="1.5" /></bezel>
+ <bezel element="text_f"><bounds x="120" y="13" width="2" height="1.5" /></bezel>
+ <bezel element="text_g"><bounds x="125" y="13" width="2" height="1.5" /></bezel>
+ <bezel element="text_h"><bounds x="130" y="13" width="2" height="1.5" /></bezel>
+
+ <bezel element="text_a"><bounds x="95" y="56.5" width="2" height="1.5" /></bezel>
+ <bezel element="text_b"><bounds x="100" y="56.5" width="2" height="1.5" /></bezel>
+ <bezel element="text_c"><bounds x="105" y="56.5" width="2" height="1.5" /></bezel>
+ <bezel element="text_d"><bounds x="110" y="56.5" width="2" height="1.5" /></bezel>
+ <bezel element="text_e"><bounds x="115" y="56.5" width="2" height="1.5" /></bezel>
+ <bezel element="text_f"><bounds x="120" y="56.5" width="2" height="1.5" /></bezel>
+ <bezel element="text_g"><bounds x="125" y="56.5" width="2" height="1.5" /></bezel>
+ <bezel element="text_h"><bounds x="130" y="56.5" width="2" height="1.5" /></bezel>
+
+ <!-- chessboard 2 leds -->
+
+ <bezel name="0.8" element="led"><bounds x="95.25" y="17.25" width="1.5" height="1.5" /></bezel>
+ <bezel name="1.8" element="led"><bounds x="100.25" y="17.25" width="1.5" height="1.5" /></bezel>
+ <bezel name="2.8" element="led"><bounds x="105.25" y="17.25" width="1.5" height="1.5" /></bezel>
+ <bezel name="3.8" element="led"><bounds x="110.25" y="17.25" width="1.5" height="1.5" /></bezel>
+ <bezel name="4.8" element="led"><bounds x="115.25" y="17.25" width="1.5" height="1.5" /></bezel>
+ <bezel name="5.8" element="led"><bounds x="120.25" y="17.25" width="1.5" height="1.5" /></bezel>
+ <bezel name="6.8" element="led"><bounds x="125.25" y="17.25" width="1.5" height="1.5" /></bezel>
+ <bezel name="7.8" element="led"><bounds x="130.25" y="17.25" width="1.5" height="1.5" /></bezel>
+
+ <bezel name="0.9" element="led"><bounds x="95.25" y="22.25" width="1.5" height="1.5" /></bezel>
+ <bezel name="1.9" element="led"><bounds x="100.25" y="22.25" width="1.5" height="1.5" /></bezel>
+ <bezel name="2.9" element="led"><bounds x="105.25" y="22.25" width="1.5" height="1.5" /></bezel>
+ <bezel name="3.9" element="led"><bounds x="110.25" y="22.25" width="1.5" height="1.5" /></bezel>
+ <bezel name="4.9" element="led"><bounds x="115.25" y="22.25" width="1.5" height="1.5" /></bezel>
+ <bezel name="5.9" element="led"><bounds x="120.25" y="22.25" width="1.5" height="1.5" /></bezel>
+ <bezel name="6.9" element="led"><bounds x="125.25" y="22.25" width="1.5" height="1.5" /></bezel>
+ <bezel name="7.9" element="led"><bounds x="130.25" y="22.25" width="1.5" height="1.5" /></bezel>
+
+ <bezel name="0.10" element="led"><bounds x="95.25" y="27.25" width="1.5" height="1.5" /></bezel>
+ <bezel name="1.10" element="led"><bounds x="100.25" y="27.25" width="1.5" height="1.5" /></bezel>
+ <bezel name="2.10" element="led"><bounds x="105.25" y="27.25" width="1.5" height="1.5" /></bezel>
+ <bezel name="3.10" element="led"><bounds x="110.25" y="27.25" width="1.5" height="1.5" /></bezel>
+ <bezel name="4.10" element="led"><bounds x="115.25" y="27.25" width="1.5" height="1.5" /></bezel>
+ <bezel name="5.10" element="led"><bounds x="120.25" y="27.25" width="1.5" height="1.5" /></bezel>
+ <bezel name="6.10" element="led"><bounds x="125.25" y="27.25" width="1.5" height="1.5" /></bezel>
+ <bezel name="7.10" element="led"><bounds x="130.25" y="27.25" width="1.5" height="1.5" /></bezel>
+
+ <bezel name="0.11" element="led"><bounds x="95.25" y="32.25" width="1.5" height="1.5" /></bezel>
+ <bezel name="1.11" element="led"><bounds x="100.25" y="32.25" width="1.5" height="1.5" /></bezel>
+ <bezel name="2.11" element="led"><bounds x="105.25" y="32.25" width="1.5" height="1.5" /></bezel>
+ <bezel name="3.11" element="led"><bounds x="110.25" y="32.25" width="1.5" height="1.5" /></bezel>
+ <bezel name="4.11" element="led"><bounds x="115.25" y="32.25" width="1.5" height="1.5" /></bezel>
+ <bezel name="5.11" element="led"><bounds x="120.25" y="32.25" width="1.5" height="1.5" /></bezel>
+ <bezel name="6.11" element="led"><bounds x="125.25" y="32.25" width="1.5" height="1.5" /></bezel>
+ <bezel name="7.11" element="led"><bounds x="130.25" y="32.25" width="1.5" height="1.5" /></bezel>
+
+ <bezel name="0.12" element="led"><bounds x="95.25" y="37.25" width="1.5" height="1.5" /></bezel>
+ <bezel name="1.12" element="led"><bounds x="100.25" y="37.25" width="1.5" height="1.5" /></bezel>
+ <bezel name="2.12" element="led"><bounds x="105.25" y="37.25" width="1.5" height="1.5" /></bezel>
+ <bezel name="3.12" element="led"><bounds x="110.25" y="37.25" width="1.5" height="1.5" /></bezel>
+ <bezel name="4.12" element="led"><bounds x="115.25" y="37.25" width="1.5" height="1.5" /></bezel>
+ <bezel name="5.12" element="led"><bounds x="120.25" y="37.25" width="1.5" height="1.5" /></bezel>
+ <bezel name="6.12" element="led"><bounds x="125.25" y="37.25" width="1.5" height="1.5" /></bezel>
+ <bezel name="7.12" element="led"><bounds x="130.25" y="37.25" width="1.5" height="1.5" /></bezel>
+
+ <bezel name="0.13" element="led"><bounds x="95.25" y="42.25" width="1.5" height="1.5" /></bezel>
+ <bezel name="1.13" element="led"><bounds x="100.25" y="42.25" width="1.5" height="1.5" /></bezel>
+ <bezel name="2.13" element="led"><bounds x="105.25" y="42.25" width="1.5" height="1.5" /></bezel>
+ <bezel name="3.13" element="led"><bounds x="110.25" y="42.25" width="1.5" height="1.5" /></bezel>
+ <bezel name="4.13" element="led"><bounds x="115.25" y="42.25" width="1.5" height="1.5" /></bezel>
+ <bezel name="5.13" element="led"><bounds x="120.25" y="42.25" width="1.5" height="1.5" /></bezel>
+ <bezel name="6.13" element="led"><bounds x="125.25" y="42.25" width="1.5" height="1.5" /></bezel>
+ <bezel name="7.13" element="led"><bounds x="130.25" y="42.25" width="1.5" height="1.5" /></bezel>
+
+ <bezel name="0.14" element="led"><bounds x="95.25" y="47.25" width="1.5" height="1.5" /></bezel>
+ <bezel name="1.14" element="led"><bounds x="100.25" y="47.25" width="1.5" height="1.5" /></bezel>
+ <bezel name="2.14" element="led"><bounds x="105.25" y="47.25" width="1.5" height="1.5" /></bezel>
+ <bezel name="3.14" element="led"><bounds x="110.25" y="47.25" width="1.5" height="1.5" /></bezel>
+ <bezel name="4.14" element="led"><bounds x="115.25" y="47.25" width="1.5" height="1.5" /></bezel>
+ <bezel name="5.14" element="led"><bounds x="120.25" y="47.25" width="1.5" height="1.5" /></bezel>
+ <bezel name="6.14" element="led"><bounds x="125.25" y="47.25" width="1.5" height="1.5" /></bezel>
+ <bezel name="7.14" element="led"><bounds x="130.25" y="47.25" width="1.5" height="1.5" /></bezel>
+
+ <bezel name="0.15" element="led"><bounds x="95.25" y="52.25" width="1.5" height="1.5" /></bezel>
+ <bezel name="1.15" element="led"><bounds x="100.25" y="52.25" width="1.5" height="1.5" /></bezel>
+ <bezel name="2.15" element="led"><bounds x="105.25" y="52.25" width="1.5" height="1.5" /></bezel>
+ <bezel name="3.15" element="led"><bounds x="110.25" y="52.25" width="1.5" height="1.5" /></bezel>
+ <bezel name="4.15" element="led"><bounds x="115.25" y="52.25" width="1.5" height="1.5" /></bezel>
+ <bezel name="5.15" element="led"><bounds x="120.25" y="52.25" width="1.5" height="1.5" /></bezel>
+ <bezel name="6.15" element="led"><bounds x="125.25" y="52.25" width="1.5" height="1.5" /></bezel>
+ <bezel name="7.15" element="led"><bounds x="130.25" y="52.25" width="1.5" height="1.5" /></bezel>
+
+ <!-- bottom side -->
+
+ <bezel name="8.8" element="led2"><bounds x="101.1" y="62.7" width="1.5" height="1.5" /></bezel>
+ <bezel name="8.9" element="led2"><bounds x="104.1" y="62.7" width="1.5" height="1.5" /></bezel>
+ <bezel name="8.10" element="led2"><bounds x="107.1" y="62.7" width="1.5" height="1.5" /></bezel>
+ <bezel name="8.11" element="led2"><bounds x="110.1" y="62.7" width="1.5" height="1.5" /></bezel>
+ <bezel name="8.12" element="led2"><bounds x="113.1" y="62.7" width="1.5" height="1.5" /></bezel>
+ <bezel name="8.13" element="led2"><bounds x="116.1" y="62.7" width="1.5" height="1.5" /></bezel>
+
+ <bezel name="8.14" element="led2"><bounds x="128.1" y="62.7" width="1.5" height="1.5" /></bezel>
+ <bezel name="8.15" element="led2"><bounds x="128.1" y="66.7" width="1.5" height="1.5" /></bezel>
+
+ <bezel element="but" inputtag="IN.8" inputmask="0x01"><bounds x="93" y="66.7" width="1.5" height="1.5" /></bezel>
+ <bezel element="but" inputtag="IN.8" inputmask="0x02"><bounds x="96" y="66.7" width="1.5" height="1.5" /></bezel>
+
+ <bezel element="but" inputtag="IN.8" inputmask="0x04"><bounds x="101.1" y="66.7" width="1.5" height="1.5" /></bezel>
+ <bezel element="but" inputtag="IN.8" inputmask="0x08"><bounds x="104.1" y="66.7" width="1.5" height="1.5" /></bezel>
+ <bezel element="but" inputtag="IN.8" inputmask="0x10"><bounds x="107.1" y="66.7" width="1.5" height="1.5" /></bezel>
+ <bezel element="but" inputtag="IN.8" inputmask="0x20"><bounds x="110.1" y="66.7" width="1.5" height="1.5" /></bezel>
+ <bezel element="but" inputtag="IN.8" inputmask="0x40"><bounds x="113.1" y="66.7" width="1.5" height="1.5" /></bezel>
+ <bezel element="but" inputtag="IN.8" inputmask="0x80"><bounds x="116.1" y="66.7" width="1.5" height="1.5" /></bezel>
+ <bezel element="but" inputtag="IN.0" inputmask="0x100"><bounds x="119.1" y="66.7" width="1.5" height="1.5" /></bezel>
+ <bezel element="but" inputtag="IN.1" inputmask="0x100"><bounds x="122.1" y="66.7" width="1.5" height="1.5" /></bezel>
+ <bezel element="but" inputtag="IN.2" inputmask="0x100"><bounds x="125.1" y="66.7" width="1.5" height="1.5" /></bezel>
+
+ <bezel element="text_p1"><bounds x="100.1" y="64.5" width="3.5" height="1.5" /></bezel>
+ <bezel element="text_p2"><bounds x="103.1" y="64.5" width="3.5" height="1.5" /></bezel>
+ <bezel element="text_p3"><bounds x="106.1" y="64.5" width="3.5" height="1.5" /></bezel>
+ <bezel element="text_p4"><bounds x="109.1" y="64.5" width="3.5" height="1.5" /></bezel>
+ <bezel element="text_p5"><bounds x="112.1" y="64.5" width="3.5" height="1.5" /></bezel>
+ <bezel element="text_p6"><bounds x="115.1" y="64.5" width="3.5" height="1.5" /></bezel>
+
+ <bezel element="text_b1"><bounds x="90" y="68.5" width="7.5" height="1.5" /></bezel>
+ <bezel element="text_b1a"><bounds x="90" y="70" width="7.5" height="1.5" /></bezel>
+ <bezel element="text_b2"><bounds x="93" y="64.6" width="7.5" height="1.5" /></bezel>
+
+ <bezel element="text_b3"><bounds x="100.1" y="68.5" width="3.5" height="1.5" /></bezel>
+ <bezel element="text_b4"><bounds x="103.1" y="68.5" width="3.5" height="1.5" /></bezel>
+ <bezel element="text_b5"><bounds x="106.1" y="68.5" width="3.5" height="1.5" /></bezel>
+ <bezel element="text_b6"><bounds x="109.1" y="68.5" width="3.5" height="1.5" /></bezel>
+ <bezel element="text_b7"><bounds x="112.1" y="68.5" width="3.5" height="1.5" /></bezel>
+ <bezel element="text_b8"><bounds x="115.1" y="68.5" width="3.5" height="1.5" /></bezel>
+ <bezel element="text_b9"><bounds x="118.1" y="68.5" width="3.5" height="1.5" /></bezel>
+ <bezel element="text_b10"><bounds x="121.1" y="68.5" width="3.5" height="1.5" /></bezel>
+ <bezel element="text_b11"><bounds x="124.1" y="68.5" width="3.5" height="1.5" /></bezel>
+
+ <bezel element="text_r1"><bounds x="130.5" y="62.7" width="10" height="1.5" /></bezel>
+ <bezel element="text_r2"><bounds x="130.5" y="66.7" width="10" height="1.5" /></bezel>
+
+ <!-- panel 7seg leds -->
+
+ <bezel name="digit1" element="digit">
+ <bounds x="93" y="75.5" width="5.66" height="8.5" />
+ </bezel>
+ <bezel name="digit0" element="digit">
+ <bounds x="98.66" y="75.5" width="5.66" height="8.5" />
+ </bezel>
+ <bezel name="digit2" element="digit">
+ <bounds x="107.16" y="75.5" width="5.66" height="8.5" />
+ </bezel>
+ <bezel name="digit3" element="digit">
+ <bounds x="112.82" y="75.5" width="5.66" height="8.5" />
+ </bezel>
+
+ <bezel name="0.7" element="led">
+ <bounds x="105.58" y="77" width="0.85" height="0.85" />
+ </bezel>
+ <bezel name="1.7" element="led">
+ <bounds x="105.13" y="81.65" width="0.85" height="0.85" />
+ </bezel>
+
+ </view>
+</mamelayout>
diff --git a/src/mame/layout/fidel_ex.lay b/src/mame/layout/fidel_ex.lay
index db62eda88ba..53ed6b53cee 100644
--- a/src/mame/layout/fidel_ex.lay
+++ b/src/mame/layout/fidel_ex.lay
@@ -192,27 +192,27 @@
<element name="text_tl7">
<rect><color red="0.17" green="0.15" blue="0.15" /></rect>
- <text string="&#x265a;"><color red="0.65" green="0.15" blue="0.14" /></text>
+ <text string="[K]"><color red="0.65" green="0.15" blue="0.14" /></text>
</element>
<element name="text_tl6">
<rect><color red="0.17" green="0.15" blue="0.15" /></rect>
- <text string="&#x265b;"><color red="0.65" green="0.15" blue="0.14" /></text>
+ <text string="[Q]"><color red="0.65" green="0.15" blue="0.14" /></text>
</element>
<element name="text_tl5">
<rect><color red="0.17" green="0.15" blue="0.15" /></rect>
- <text string="&#x265c;"><color red="0.65" green="0.15" blue="0.14" /></text>
+ <text string="[R]"><color red="0.65" green="0.15" blue="0.14" /></text>
</element>
<element name="text_tl4">
<rect><color red="0.17" green="0.15" blue="0.15" /></rect>
- <text string="&#x265d;"><color red="0.65" green="0.15" blue="0.14" /></text>
+ <text string="[B]"><color red="0.65" green="0.15" blue="0.14" /></text>
</element>
<element name="text_tl3">
<rect><color red="0.17" green="0.15" blue="0.15" /></rect>
- <text string="&#x265e;"><color red="0.65" green="0.15" blue="0.14" /></text>
+ <text string="[N]"><color red="0.65" green="0.15" blue="0.14" /></text>
</element>
<element name="text_tl2">
<rect><color red="0.17" green="0.15" blue="0.15" /></rect>
- <text string="&#x265f;"><color red="0.65" green="0.15" blue="0.14" /></text>
+ <text string="[P]"><color red="0.65" green="0.15" blue="0.14" /></text>
</element>
@@ -403,12 +403,12 @@
<bezel element="black"><bounds x="86" y="2" width="10" height="82" /></bezel>
- <bezel element="text_tl7"><bounds x="87" y="16" width="8" height="3" /></bezel>
- <bezel element="text_tl6"><bounds x="87" y="25" width="8" height="3" /></bezel>
- <bezel element="text_tl5"><bounds x="87" y="34" width="8" height="3" /></bezel>
- <bezel element="text_tl4"><bounds x="87" y="43" width="8" height="3" /></bezel>
- <bezel element="text_tl3"><bounds x="87" y="52" width="8" height="3" /></bezel>
- <bezel element="text_tl2"><bounds x="87" y="61" width="8" height="3" /></bezel>
+ <bezel element="text_tl7"><bounds x="87" y="16.2" width="8" height="2.5" /></bezel>
+ <bezel element="text_tl6"><bounds x="87" y="25.2" width="8" height="2.5" /></bezel>
+ <bezel element="text_tl5"><bounds x="87" y="34.2" width="8" height="2.5" /></bezel>
+ <bezel element="text_tl4"><bounds x="87" y="43.2" width="8" height="2.5" /></bezel>
+ <bezel element="text_tl3"><bounds x="87" y="52.2" width="8" height="2.5" /></bezel>
+ <bezel element="text_tl2"><bounds x="87" y="61.2" width="8" height="2.5" /></bezel>
<bezel element="redb"><bounds x="87" y="9" width="8" height="4" /></bezel>
<bezel element="redb"><bounds x="87" y="19" width="8" height="4" /></bezel>
diff --git a/src/mame/layout/fidel_ex_68k.lay b/src/mame/layout/fidel_ex_68k.lay
index 5429357f828..741ee8e6912 100644
--- a/src/mame/layout/fidel_ex_68k.lay
+++ b/src/mame/layout/fidel_ex_68k.lay
@@ -192,27 +192,27 @@
<element name="text_tl7">
<rect><color red="0.17" green="0.15" blue="0.15" /></rect>
- <text string="&#x265a;"><color red="0.65" green="0.15" blue="0.14" /></text>
+ <text string="[K]"><color red="0.65" green="0.15" blue="0.14" /></text>
</element>
<element name="text_tl6">
<rect><color red="0.17" green="0.15" blue="0.15" /></rect>
- <text string="&#x265b;"><color red="0.65" green="0.15" blue="0.14" /></text>
+ <text string="[Q]"><color red="0.65" green="0.15" blue="0.14" /></text>
</element>
<element name="text_tl5">
<rect><color red="0.17" green="0.15" blue="0.15" /></rect>
- <text string="&#x265c;"><color red="0.65" green="0.15" blue="0.14" /></text>
+ <text string="[R]"><color red="0.65" green="0.15" blue="0.14" /></text>
</element>
<element name="text_tl4">
<rect><color red="0.17" green="0.15" blue="0.15" /></rect>
- <text string="&#x265d;"><color red="0.65" green="0.15" blue="0.14" /></text>
+ <text string="[B]"><color red="0.65" green="0.15" blue="0.14" /></text>
</element>
<element name="text_tl3">
<rect><color red="0.17" green="0.15" blue="0.15" /></rect>
- <text string="&#x265e;"><color red="0.65" green="0.15" blue="0.14" /></text>
+ <text string="[N]"><color red="0.65" green="0.15" blue="0.14" /></text>
</element>
<element name="text_tl2">
<rect><color red="0.17" green="0.15" blue="0.15" /></rect>
- <text string="&#x265f;"><color red="0.65" green="0.15" blue="0.14" /></text>
+ <text string="[P]"><color red="0.65" green="0.15" blue="0.14" /></text>
</element>
@@ -479,12 +479,12 @@
<bezel element="black"><bounds x="86" y="2" width="10" height="82" /></bezel>
- <bezel element="text_tl7"><bounds x="87" y="16" width="8" height="3" /></bezel>
- <bezel element="text_tl6"><bounds x="87" y="25" width="8" height="3" /></bezel>
- <bezel element="text_tl5"><bounds x="87" y="34" width="8" height="3" /></bezel>
- <bezel element="text_tl4"><bounds x="87" y="43" width="8" height="3" /></bezel>
- <bezel element="text_tl3"><bounds x="87" y="52" width="8" height="3" /></bezel>
- <bezel element="text_tl2"><bounds x="87" y="61" width="8" height="3" /></bezel>
+ <bezel element="text_tl7"><bounds x="87" y="16.2" width="8" height="2.5" /></bezel>
+ <bezel element="text_tl6"><bounds x="87" y="25.2" width="8" height="2.5" /></bezel>
+ <bezel element="text_tl5"><bounds x="87" y="34.2" width="8" height="2.5" /></bezel>
+ <bezel element="text_tl4"><bounds x="87" y="43.2" width="8" height="2.5" /></bezel>
+ <bezel element="text_tl3"><bounds x="87" y="52.2" width="8" height="2.5" /></bezel>
+ <bezel element="text_tl2"><bounds x="87" y="61.2" width="8" height="2.5" /></bezel>
<bezel element="redb"><bounds x="87" y="9" width="8" height="4" /></bezel>
<bezel element="redb"><bounds x="87" y="19" width="8" height="4" /></bezel>
diff --git a/src/mame/layout/fidel_exd.lay b/src/mame/layout/fidel_exd.lay
index e72cf5b9490..88b7dede003 100644
--- a/src/mame/layout/fidel_exd.lay
+++ b/src/mame/layout/fidel_exd.lay
@@ -196,27 +196,27 @@
<element name="text_tl7">
<rect><color red="0.17" green="0.15" blue="0.15" /></rect>
- <text string="&#x265a;"><color red="0.65" green="0.15" blue="0.14" /></text>
+ <text string="[K]"><color red="0.65" green="0.15" blue="0.14" /></text>
</element>
<element name="text_tl6">
<rect><color red="0.17" green="0.15" blue="0.15" /></rect>
- <text string="&#x265b;"><color red="0.65" green="0.15" blue="0.14" /></text>
+ <text string="[Q]"><color red="0.65" green="0.15" blue="0.14" /></text>
</element>
<element name="text_tl5">
<rect><color red="0.17" green="0.15" blue="0.15" /></rect>
- <text string="&#x265c;"><color red="0.65" green="0.15" blue="0.14" /></text>
+ <text string="[R]"><color red="0.65" green="0.15" blue="0.14" /></text>
</element>
<element name="text_tl4">
<rect><color red="0.17" green="0.15" blue="0.15" /></rect>
- <text string="&#x265d;"><color red="0.65" green="0.15" blue="0.14" /></text>
+ <text string="[B]"><color red="0.65" green="0.15" blue="0.14" /></text>
</element>
<element name="text_tl3">
<rect><color red="0.17" green="0.15" blue="0.15" /></rect>
- <text string="&#x265e;"><color red="0.65" green="0.15" blue="0.14" /></text>
+ <text string="[N]"><color red="0.65" green="0.15" blue="0.14" /></text>
</element>
<element name="text_tl2">
<rect><color red="0.17" green="0.15" blue="0.15" /></rect>
- <text string="&#x265f;"><color red="0.65" green="0.15" blue="0.14" /></text>
+ <text string="[P]"><color red="0.65" green="0.15" blue="0.14" /></text>
</element>
@@ -429,12 +429,12 @@
<bezel element="black"><bounds x="86" y="2" width="10" height="82" /></bezel>
- <bezel element="text_tl7"><bounds x="87" y="16" width="8" height="3" /></bezel>
- <bezel element="text_tl6"><bounds x="87" y="25" width="8" height="3" /></bezel>
- <bezel element="text_tl5"><bounds x="87" y="34" width="8" height="3" /></bezel>
- <bezel element="text_tl4"><bounds x="87" y="43" width="8" height="3" /></bezel>
- <bezel element="text_tl3"><bounds x="87" y="52" width="8" height="3" /></bezel>
- <bezel element="text_tl2"><bounds x="87" y="61" width="8" height="3" /></bezel>
+ <bezel element="text_tl7"><bounds x="87" y="16.2" width="8" height="2.5" /></bezel>
+ <bezel element="text_tl6"><bounds x="87" y="25.2" width="8" height="2.5" /></bezel>
+ <bezel element="text_tl5"><bounds x="87" y="34.2" width="8" height="2.5" /></bezel>
+ <bezel element="text_tl4"><bounds x="87" y="43.2" width="8" height="2.5" /></bezel>
+ <bezel element="text_tl3"><bounds x="87" y="52.2" width="8" height="2.5" /></bezel>
+ <bezel element="text_tl2"><bounds x="87" y="61.2" width="8" height="2.5" /></bezel>
<bezel element="redb"><bounds x="87" y="9" width="8" height="4" /></bezel>
<bezel element="redb"><bounds x="87" y="19" width="8" height="4" /></bezel>
diff --git a/src/mame/layout/fidel_gin.lay b/src/mame/layout/fidel_gin.lay
new file mode 100644
index 00000000000..5a4f44cefd7
--- /dev/null
+++ b/src/mame/layout/fidel_gin.lay
@@ -0,0 +1,465 @@
+<?xml version="1.0"?>
+<mamelayout version="2">
+
+<!-- define elements -->
+
+ <element name="button" defstate="0">
+ <rect state="0"><color red="0.8" green="0.8" blue="0.7" /></rect>
+ <rect state="1"><color red="0.6" green="0.6" blue="0.5" /></rect>
+ </element>
+
+ <element name="digit" defstate="0">
+ <led14seg><color red="0.2" green="1.0" blue="0.85" /></led14seg>
+ </element>
+
+ <element name="text_b1"><text string="RESET"><color red="0.7" green="0.7" blue="0.7" /></text></element>
+ <element name="text_b2"><text string="spk"><color red="0.7" green="0.7" blue="0.7" /></text></element>
+ <element name="text_b3"><text string="CLEAR"><color red="0.7" green="0.7" blue="0.7" /></text></element>
+ <element name="text_b4"><text string="YES/GO"><color red="0.7" green="0.7" blue="0.7" /></text></element>
+ <element name="text_b5"><text string="KNOCK"><color red="0.7" green="0.7" blue="0.7" /></text></element>
+ <element name="text_b6"><text string="QUIT"><color red="0.7" green="0.7" blue="0.7" /></text></element>
+ <element name="text_b7"><text string="SCORE"><color red="0.7" green="0.7" blue="0.7" /></text></element>
+ <element name="text_b8"><text string="NO"><color red="0.7" green="0.7" blue="0.7" /></text></element>
+ <element name="text_b9"><text string="DEALER"><color red="0.7" green="0.7" blue="0.7" /></text></element>
+ <element name="text_b10"><text string="LANGUAGE"><color red="0.7" green="0.7" blue="0.7" /></text></element>
+ <element name="text_b11"><text string="CONV"><color red="0.7" green="0.7" blue="0.7" /></text></element>
+ <element name="text_b12"><text string="HAND"><color red="0.7" green="0.7" blue="0.7" /></text></element>
+ <element name="text_b13"><text string="&#x2663;"><color red="0.7" green="0.7" blue="0.7" /></text></element>
+ <element name="text_b14"><text string="&#x2666;"><color red="0.7" green="0.7" blue="0.7" /></text></element>
+ <element name="text_b15"><text string="&#x2665;"><color red="0.7" green="0.7" blue="0.7" /></text></element>
+ <element name="text_b16"><text string="&#x2660;"><color red="0.7" green="0.7" blue="0.7" /></text></element>
+ <element name="text_b17"><text string="JACK"><color red="0.7" green="0.7" blue="0.7" /></text></element>
+ <element name="text_b18"><text string="QUEEN"><color red="0.7" green="0.7" blue="0.7" /></text></element>
+ <element name="text_b19"><text string="KING"><color red="0.7" green="0.7" blue="0.7" /></text></element>
+ <element name="text_b20"><text string="ACE"><color red="0.7" green="0.7" blue="0.7" /></text></element>
+ <element name="text_b21"><text string="7"><color red="0.7" green="0.7" blue="0.7" /></text></element>
+ <element name="text_b22"><text string="8"><color red="0.7" green="0.7" blue="0.7" /></text></element>
+ <element name="text_b23"><text string="9"><color red="0.7" green="0.7" blue="0.7" /></text></element>
+ <element name="text_b24"><text string="10"><color red="0.7" green="0.7" blue="0.7" /></text></element>
+ <element name="text_b25"><text string="3"><color red="0.7" green="0.7" blue="0.7" /></text></element>
+ <element name="text_b26"><text string="4"><color red="0.7" green="0.7" blue="0.7" /></text></element>
+ <element name="text_b27"><text string="5"><color red="0.7" green="0.7" blue="0.7" /></text></element>
+ <element name="text_b28"><text string="6"><color red="0.7" green="0.7" blue="0.7" /></text></element>
+ <element name="text_b29"><text string="COMPUTER"><color red="0.7" green="0.7" blue="0.7" /></text></element>
+ <element name="text_b30"><text string="HUMAN"><color red="0.7" green="0.7" blue="0.7" /></text></element>
+ <element name="text_b31"><text string="1"><color red="0.7" green="0.7" blue="0.7" /></text></element>
+ <element name="text_b32"><text string="2"><color red="0.7" green="0.7" blue="0.7" /></text></element>
+
+ <element name="white"><rect><color red="0.9" green="0.9" blue="0.9" /></rect></element>
+ <element name="edge1"><rect><color red="0.15" green="0.15" blue="0.15" /></rect></element>
+ <element name="edge2"><rect><color red="0.35" green="0.35" blue="0.35" /></rect></element>
+ <element name="gray"><rect><color red="0.4" green="0.4" blue="0.4" /></rect></element>
+ <element name="blackb"><rect><color red="0" green="0" blue="0" /></rect></element>
+
+ <element name="text_scan">
+ <rect><color red="0.0" green="0.0" blue="0.0" /></rect>
+ <text string="card scanner"><color red="0.4" green="0.4" blue="0.4" /></text>
+ </element>
+
+ <element name="nothing" defstate="0">
+ <text string=" "><color red="0.0" green="0.0" blue="0.0" /></text>
+ </element>
+
+ <element name="cba">
+ <rect><color red="0.9" green="0.9" blue="0.9" /></rect>
+ <text string="A" align="1"><color red="0.1" green="0.1" blue="0.1" /></text>
+ </element>
+ <element name="cb2">
+ <rect><color red="0.9" green="0.9" blue="0.9" /></rect>
+ <text string="2" align="1"><color red="0.1" green="0.1" blue="0.1" /></text>
+ </element>
+ <element name="cb3">
+ <rect><color red="0.9" green="0.9" blue="0.9" /></rect>
+ <text string="3" align="1"><color red="0.1" green="0.1" blue="0.1" /></text>
+ </element>
+ <element name="cb4">
+ <rect><color red="0.9" green="0.9" blue="0.9" /></rect>
+ <text string="4" align="1"><color red="0.1" green="0.1" blue="0.1" /></text>
+ </element>
+ <element name="cb5">
+ <rect><color red="0.9" green="0.9" blue="0.9" /></rect>
+ <text string="5" align="1"><color red="0.1" green="0.1" blue="0.1" /></text>
+ </element>
+ <element name="cb6">
+ <rect><color red="0.9" green="0.9" blue="0.9" /></rect>
+ <text string="6" align="1"><color red="0.1" green="0.1" blue="0.1" /></text>
+ </element>
+ <element name="cb7">
+ <rect><color red="0.9" green="0.9" blue="0.9" /></rect>
+ <text string="7" align="1"><color red="0.1" green="0.1" blue="0.1" /></text>
+ </element>
+ <element name="cb8">
+ <rect><color red="0.9" green="0.9" blue="0.9" /></rect>
+ <text string="8" align="1"><color red="0.1" green="0.1" blue="0.1" /></text>
+ </element>
+ <element name="cb9">
+ <rect><color red="0.9" green="0.9" blue="0.9" /></rect>
+ <text string="9" align="1"><color red="0.1" green="0.1" blue="0.1" /></text>
+ </element>
+ <element name="cb0">
+ <rect><color red="0.9" green="0.9" blue="0.9" /></rect>
+ <text string="10" align="1"><color red="0.1" green="0.1" blue="0.1" /></text>
+ </element>
+ <element name="cbj">
+ <rect><color red="0.9" green="0.9" blue="0.9" /></rect>
+ <text string="J" align="1"><color red="0.1" green="0.1" blue="0.1" /></text>
+ </element>
+ <element name="cbq">
+ <rect><color red="0.9" green="0.9" blue="0.9" /></rect>
+ <text string="Q" align="1"><color red="0.1" green="0.1" blue="0.1" /></text>
+ </element>
+ <element name="cbk">
+ <rect><color red="0.9" green="0.9" blue="0.9" /></rect>
+ <text string="K" align="1"><color red="0.1" green="0.1" blue="0.1" /></text>
+ </element>
+
+ <element name="cra">
+ <rect><color red="0.9" green="0.9" blue="0.9" /></rect>
+ <text string="A" align="1"><color red="0.8" green="0.1" blue="0.1" /></text>
+ </element>
+ <element name="cr2">
+ <rect><color red="0.9" green="0.9" blue="0.9" /></rect>
+ <text string="2" align="1"><color red="0.8" green="0.1" blue="0.1" /></text>
+ </element>
+ <element name="cr3">
+ <rect><color red="0.9" green="0.9" blue="0.9" /></rect>
+ <text string="3" align="1"><color red="0.8" green="0.1" blue="0.1" /></text>
+ </element>
+ <element name="cr4">
+ <rect><color red="0.9" green="0.9" blue="0.9" /></rect>
+ <text string="4" align="1"><color red="0.8" green="0.1" blue="0.1" /></text>
+ </element>
+ <element name="cr5">
+ <rect><color red="0.9" green="0.9" blue="0.9" /></rect>
+ <text string="5" align="1"><color red="0.8" green="0.1" blue="0.1" /></text>
+ </element>
+ <element name="cr6">
+ <rect><color red="0.9" green="0.9" blue="0.9" /></rect>
+ <text string="6" align="1"><color red="0.8" green="0.1" blue="0.1" /></text>
+ </element>
+ <element name="cr7">
+ <rect><color red="0.9" green="0.9" blue="0.9" /></rect>
+ <text string="7" align="1"><color red="0.8" green="0.1" blue="0.1" /></text>
+ </element>
+ <element name="cr8">
+ <rect><color red="0.9" green="0.9" blue="0.9" /></rect>
+ <text string="8" align="1"><color red="0.8" green="0.1" blue="0.1" /></text>
+ </element>
+ <element name="cr9">
+ <rect><color red="0.9" green="0.9" blue="0.9" /></rect>
+ <text string="9" align="1"><color red="0.8" green="0.1" blue="0.1" /></text>
+ </element>
+ <element name="cr0">
+ <rect><color red="0.9" green="0.9" blue="0.9" /></rect>
+ <text string="10" align="1"><color red="0.8" green="0.1" blue="0.1" /></text>
+ </element>
+ <element name="crj">
+ <rect><color red="0.9" green="0.9" blue="0.9" /></rect>
+ <text string="J" align="1"><color red="0.8" green="0.1" blue="0.1" /></text>
+ </element>
+ <element name="crq">
+ <rect><color red="0.9" green="0.9" blue="0.9" /></rect>
+ <text string="Q" align="1"><color red="0.8" green="0.1" blue="0.1" /></text>
+ </element>
+ <element name="crk">
+ <rect><color red="0.9" green="0.9" blue="0.9" /></rect>
+ <text string="K" align="1"><color red="0.8" green="0.1" blue="0.1" /></text>
+ </element>
+
+ <element name="csh">
+ <rect><color red="0.9" green="0.9" blue="0.9" /></rect>
+ <text align="2" string="&#x2665;"><color red="0.8" green="0.1" blue="0.1" /></text>
+ </element>
+ <element name="csd">
+ <rect><color red="0.9" green="0.9" blue="0.9" /></rect>
+ <text align="2" string="&#x2666;"><color red="0.8" green="0.1" blue="0.1" /></text>
+ </element>
+ <element name="csc">
+ <rect><color red="0.9" green="0.9" blue="0.9" /></rect>
+ <text align="2" string="&#x2663;"><color red="0.1" green="0.1" blue="0.1" /></text>
+ </element>
+ <element name="css">
+ <rect><color red="0.9" green="0.9" blue="0.9" /></rect>
+ <text align="2" string="&#x2660;"><color red="0.1" green="0.1" blue="0.1" /></text>
+ </element>
+
+ <element name="cbjk">
+ <rect><color red="0.9" green="0.9" blue="0.9" /></rect>
+ <text string="&#x263a;"><color red="0.1" green="0.1" blue="0.1" /></text>
+ </element>
+ <element name="crjk">
+ <rect><color red="0.9" green="0.9" blue="0.9" /></rect>
+ <text string="&#x263a;"><color red="0.8" green="0.1" blue="0.1" /></text>
+ </element>
+
+
+<!-- build screen -->
+
+ <view name="Internal Layout">
+ <bounds left="-1" right="53" top="11" bottom="54" />
+
+ <!-- gin rummy game only uses the buttons within this box -->
+ <bezel element="gray"><bounds x="-1" y="18.1" width="24" height="10.3" /></bezel>
+ <bezel element="blackb"><bounds x="-0.9" y="18.2" width="23.8" height="10.1" /></bezel>
+
+ <!-- vfd -->
+
+ <bezel name="digit0" element="digit"><bounds x="0" y="12" width="2.75" height="4.125" /></bezel>
+ <bezel name="digit1" element="digit"><bounds x="2.75" y="12" width="2.75" height="4.125" /></bezel>
+ <bezel name="digit2" element="digit"><bounds x="5.50" y="12" width="2.75" height="4.125" /></bezel>
+ <bezel name="digit3" element="digit"><bounds x="8.25" y="12" width="2.75" height="4.125" /></bezel>
+ <bezel name="digit4" element="digit"><bounds x="11.00" y="12" width="2.75" height="4.125" /></bezel>
+ <bezel name="digit5" element="digit"><bounds x="13.75" y="12" width="2.75" height="4.125" /></bezel>
+ <bezel name="digit6" element="digit"><bounds x="16.50" y="12" width="2.75" height="4.125" /></bezel>
+ <bezel name="digit7" element="digit"><bounds x="19.25" y="12" width="2.75" height="4.125" /></bezel>
+
+ <!-- button panel -->
+
+ <bezel element="button" inputtag="RESET" inputmask="0x01"><bounds x="0" y="20" width="4" height="3" /></bezel>
+ <bezel element="button" inputtag="IN.6" inputmask="0x01"><bounds x="6" y="20" width="4" height="3" /></bezel>
+ <bezel element="button" inputtag="IN.5" inputmask="0x01"><bounds x="12" y="20" width="4" height="3" /></bezel>
+ <bezel element="button" inputtag="IN.4" inputmask="0x01"><bounds x="18" y="20" width="4" height="3" /></bezel>
+
+ <bezel element="button" inputtag="IN.7" inputmask="0x02"><bounds x="0" y="25" width="4" height="3" /></bezel>
+ <bezel element="button" inputtag="IN.6" inputmask="0x02"><bounds x="6" y="25" width="4" height="3" /></bezel>
+ <bezel element="button" inputtag="IN.5" inputmask="0x02"><bounds x="12" y="25" width="4" height="3" /></bezel>
+ <bezel element="button" inputtag="IN.4" inputmask="0x02"><bounds x="18" y="25" width="4" height="3" /></bezel>
+
+ <bezel element="button" inputtag="IN.7" inputmask="0x04"><bounds x="0" y="30" width="4" height="3" /></bezel>
+ <bezel element="button" inputtag="IN.6" inputmask="0x04"><bounds x="6" y="30" width="4" height="3" /></bezel>
+ <bezel element="button" inputtag="IN.5" inputmask="0x04"><bounds x="12" y="30" width="4" height="3" /></bezel>
+ <bezel element="button" inputtag="IN.4" inputmask="0x04"><bounds x="18" y="30" width="4" height="3" /></bezel>
+
+ <bezel element="button" inputtag="IN.7" inputmask="0x08"><bounds x="0" y="35" width="4" height="3" /></bezel>
+ <bezel element="button" inputtag="IN.6" inputmask="0x08"><bounds x="6" y="35" width="4" height="3" /></bezel>
+ <bezel element="button" inputtag="IN.5" inputmask="0x08"><bounds x="12" y="35" width="4" height="3" /></bezel>
+ <bezel element="button" inputtag="IN.4" inputmask="0x08"><bounds x="18" y="35" width="4" height="3" /></bezel>
+
+ <bezel element="text_b1"><bounds x="-2" y="18.45" width="8" height="1.4" /></bezel>
+ <bezel element="text_b2"><bounds x="4" y="18.45" width="8" height="1.4" /></bezel>
+ <bezel element="text_b3"><bounds x="10" y="18.45" width="8" height="1.4" /></bezel>
+ <bezel element="text_b4"><bounds x="16" y="18.45" width="8" height="1.4" /></bezel>
+
+ <bezel element="text_b5"><bounds x="-2" y="23.45" width="8" height="1.4" /></bezel>
+ <bezel element="text_b6"><bounds x="4" y="23.45" width="8" height="1.4" /></bezel>
+ <bezel element="text_b7"><bounds x="10" y="23.45" width="8" height="1.4" /></bezel>
+ <bezel element="text_b8"><bounds x="16" y="23.45" width="8" height="1.4" /></bezel>
+
+ <bezel element="text_b9"><bounds x="-2" y="28.45" width="8" height="1.4" /></bezel>
+ <bezel element="text_b10"><bounds x="4" y="28.45" width="8" height="1.4" /></bezel>
+ <bezel element="text_b11"><bounds x="10" y="28.45" width="8" height="1.4" /></bezel>
+ <bezel element="text_b12"><bounds x="16" y="28.45" width="8" height="1.4" /></bezel>
+
+ <bezel element="text_b13"><bounds x="-2" y="33.3" width="8" height="1.6" /></bezel>
+ <bezel element="text_b14"><bounds x="4" y="33.3" width="8" height="1.6" /></bezel>
+ <bezel element="text_b15"><bounds x="10" y="33.3" width="8" height="1.6" /></bezel>
+ <bezel element="text_b16"><bounds x="16" y="33.3" width="8" height="1.6" /></bezel>
+
+ <bezel element="button" inputtag="IN.3" inputmask="0x01"><bounds x="30" y="20" width="4" height="3" /></bezel>
+ <bezel element="button" inputtag="IN.2" inputmask="0x01"><bounds x="36" y="20" width="4" height="3" /></bezel>
+ <bezel element="button" inputtag="IN.1" inputmask="0x01"><bounds x="42" y="20" width="4" height="3" /></bezel>
+ <bezel element="button" inputtag="IN.0" inputmask="0x01"><bounds x="48" y="20" width="4" height="3" /></bezel>
+
+ <bezel element="button" inputtag="IN.3" inputmask="0x02"><bounds x="30" y="25" width="4" height="3" /></bezel>
+ <bezel element="button" inputtag="IN.2" inputmask="0x02"><bounds x="36" y="25" width="4" height="3" /></bezel>
+ <bezel element="button" inputtag="IN.1" inputmask="0x02"><bounds x="42" y="25" width="4" height="3" /></bezel>
+ <bezel element="button" inputtag="IN.0" inputmask="0x02"><bounds x="48" y="25" width="4" height="3" /></bezel>
+
+ <bezel element="button" inputtag="IN.3" inputmask="0x04"><bounds x="30" y="30" width="4" height="3" /></bezel>
+ <bezel element="button" inputtag="IN.2" inputmask="0x04"><bounds x="36" y="30" width="4" height="3" /></bezel>
+ <bezel element="button" inputtag="IN.1" inputmask="0x04"><bounds x="42" y="30" width="4" height="3" /></bezel>
+ <bezel element="button" inputtag="IN.0" inputmask="0x04"><bounds x="48" y="30" width="4" height="3" /></bezel>
+
+ <bezel element="button" inputtag="IN.3" inputmask="0x08"><bounds x="30" y="35" width="4" height="3" /></bezel>
+ <bezel element="button" inputtag="IN.2" inputmask="0x08"><bounds x="36" y="35" width="4" height="3" /></bezel>
+ <bezel element="button" inputtag="IN.1" inputmask="0x08"><bounds x="42" y="35" width="4" height="3" /></bezel>
+ <bezel element="button" inputtag="IN.0" inputmask="0x08"><bounds x="48" y="35" width="4" height="3" /></bezel>
+
+ <bezel element="text_b17"><bounds x="28" y="18.45" width="8" height="1.4" /></bezel>
+ <bezel element="text_b18"><bounds x="34" y="18.45" width="8" height="1.4" /></bezel>
+ <bezel element="text_b19"><bounds x="40" y="18.45" width="8" height="1.4" /></bezel>
+ <bezel element="text_b20"><bounds x="46" y="18.45" width="8" height="1.4" /></bezel>
+
+ <bezel element="text_b21"><bounds x="28" y="23.45" width="8" height="1.4" /></bezel>
+ <bezel element="text_b22"><bounds x="34" y="23.45" width="8" height="1.4" /></bezel>
+ <bezel element="text_b23"><bounds x="40" y="23.45" width="8" height="1.4" /></bezel>
+ <bezel element="text_b24"><bounds x="46" y="23.45" width="8" height="1.4" /></bezel>
+
+ <bezel element="text_b25"><bounds x="28" y="28.45" width="8" height="1.4" /></bezel>
+ <bezel element="text_b26"><bounds x="34" y="28.45" width="8" height="1.4" /></bezel>
+ <bezel element="text_b27"><bounds x="40" y="28.45" width="8" height="1.4" /></bezel>
+ <bezel element="text_b28"><bounds x="46" y="28.45" width="8" height="1.4" /></bezel>
+
+ <bezel element="text_b29"><bounds x="28" y="33.45" width="8" height="1.4" /></bezel>
+ <bezel element="text_b30"><bounds x="34" y="33.45" width="8" height="1.4" /></bezel>
+ <bezel element="text_b31"><bounds x="40" y="33.45" width="8" height="1.4" /></bezel>
+ <bezel element="text_b32"><bounds x="46" y="33.45" width="8" height="1.4" /></bezel>
+
+ <!-- cards -->
+
+ <bezel element="gray"><bounds x="-0.5" y="39.7" width="18" height="0.2" /></bezel>
+ <bezel element="text_scan"><bounds x="4" y="39" width="8" height="1.4" /></bezel>
+
+ <bezel element="white"><bounds x="0" y="41" width="14" height="15" /></bezel>
+ <bezel element="white"><bounds x="15" y="41" width="2" height="15" /></bezel>
+
+ <bezel element="cba"><bounds x="0.15" y="41.5" width="1.8" height="1.3" /></bezel>
+ <bezel element="cb2"><bounds x="1.15" y="41.5" width="1.8" height="1.3" /></bezel>
+ <bezel element="cb3"><bounds x="2.15" y="41.5" width="1.8" height="1.3" /></bezel>
+ <bezel element="cb4"><bounds x="3.15" y="41.5" width="1.8" height="1.3" /></bezel>
+ <bezel element="cb5"><bounds x="4.08" y="41.5" width="1.8" height="1.3" /></bezel>
+ <bezel element="cb6"><bounds x="5.15" y="41.5" width="1.8" height="1.3" /></bezel>
+ <bezel element="cb7"><bounds x="6.15" y="41.5" width="1.8" height="1.3" /></bezel>
+ <bezel element="cb8"><bounds x="7.15" y="41.5" width="1.8" height="1.3" /></bezel>
+ <bezel element="cb9"><bounds x="8.15" y="41.5" width="1.8" height="1.3" /></bezel>
+ <bezel element="cb0"><bounds x="9.15" y="41.5" width="1.8" height="1.3" /></bezel>
+ <bezel element="white"><bounds x="10" y="41.5" width="2" height="2" /></bezel>
+ <bezel element="cbj"><bounds x="10.15" y="41.5" width="1.8" height="1.3" /></bezel>
+ <bezel element="cbq"><bounds x="11.15" y="41.5" width="1.8" height="1.3" /></bezel>
+ <bezel element="cbk"><bounds x="12.15" y="41.5" width="1.8" height="1.3" /></bezel>
+ <bezel element="css"><bounds x="12.05" y="42.81" width="1.8" height="1.5" /></bezel>
+
+ <bezel element="cra"><bounds x="0.15" y="44.5" width="1.8" height="1.3" /></bezel>
+ <bezel element="cr2"><bounds x="1.15" y="44.5" width="1.8" height="1.3" /></bezel>
+ <bezel element="cr3"><bounds x="2.15" y="44.5" width="1.8" height="1.3" /></bezel>
+ <bezel element="cr4"><bounds x="3.15" y="44.5" width="1.8" height="1.3" /></bezel>
+ <bezel element="cr5"><bounds x="4.08" y="44.5" width="1.8" height="1.3" /></bezel>
+ <bezel element="cr6"><bounds x="5.15" y="44.5" width="1.8" height="1.3" /></bezel>
+ <bezel element="cr7"><bounds x="6.15" y="44.5" width="1.8" height="1.3" /></bezel>
+ <bezel element="cr8"><bounds x="7.15" y="44.5" width="1.8" height="1.3" /></bezel>
+ <bezel element="cr9"><bounds x="8.15" y="44.5" width="1.8" height="1.3" /></bezel>
+ <bezel element="cr0"><bounds x="9.15" y="44.5" width="1.8" height="1.3" /></bezel>
+ <bezel element="white"><bounds x="10" y="44.5" width="2" height="2" /></bezel>
+ <bezel element="crj"><bounds x="10.15" y="44.5" width="1.8" height="1.3" /></bezel>
+ <bezel element="crq"><bounds x="11.15" y="44.5" width="1.8" height="1.3" /></bezel>
+ <bezel element="crk"><bounds x="12.15" y="44.5" width="1.8" height="1.3" /></bezel>
+ <bezel element="csh"><bounds x="12.05" y="45.81" width="1.8" height="1.5" /></bezel>
+
+ <bezel element="cba"><bounds x="0.15" y="47.5" width="1.8" height="1.3" /></bezel>
+ <bezel element="cb2"><bounds x="1.15" y="47.5" width="1.8" height="1.3" /></bezel>
+ <bezel element="cb3"><bounds x="2.15" y="47.5" width="1.8" height="1.3" /></bezel>
+ <bezel element="cb4"><bounds x="3.15" y="47.5" width="1.8" height="1.3" /></bezel>
+ <bezel element="cb5"><bounds x="4.08" y="47.5" width="1.8" height="1.3" /></bezel>
+ <bezel element="cb6"><bounds x="5.15" y="47.5" width="1.8" height="1.3" /></bezel>
+ <bezel element="cb7"><bounds x="6.15" y="47.5" width="1.8" height="1.3" /></bezel>
+ <bezel element="cb8"><bounds x="7.15" y="47.5" width="1.8" height="1.3" /></bezel>
+ <bezel element="cb9"><bounds x="8.15" y="47.5" width="1.8" height="1.3" /></bezel>
+ <bezel element="cb0"><bounds x="9.15" y="47.5" width="1.8" height="1.3" /></bezel>
+ <bezel element="white"><bounds x="10" y="47.5" width="2" height="2" /></bezel>
+ <bezel element="cbj"><bounds x="10.15" y="47.5" width="1.8" height="1.3" /></bezel>
+ <bezel element="cbq"><bounds x="11.15" y="47.5" width="1.8" height="1.3" /></bezel>
+ <bezel element="cbk"><bounds x="12.15" y="47.5" width="1.8" height="1.3" /></bezel>
+ <bezel element="csc"><bounds x="12.05" y="48.81" width="1.8" height="1.5" /></bezel>
+
+ <bezel element="cra"><bounds x="0.15" y="50.5" width="1.8" height="1.3" /></bezel>
+ <bezel element="cr2"><bounds x="1.15" y="50.5" width="1.8" height="1.3" /></bezel>
+ <bezel element="cr3"><bounds x="2.15" y="50.5" width="1.8" height="1.3" /></bezel>
+ <bezel element="cr4"><bounds x="3.15" y="50.5" width="1.8" height="1.3" /></bezel>
+ <bezel element="cr5"><bounds x="4.08" y="50.5" width="1.8" height="1.3" /></bezel>
+ <bezel element="cr6"><bounds x="5.15" y="50.5" width="1.8" height="1.3" /></bezel>
+ <bezel element="cr7"><bounds x="6.15" y="50.5" width="1.8" height="1.3" /></bezel>
+ <bezel element="cr8"><bounds x="7.15" y="50.5" width="1.8" height="1.3" /></bezel>
+ <bezel element="cr9"><bounds x="8.15" y="50.5" width="1.8" height="1.3" /></bezel>
+ <bezel element="cr0"><bounds x="9.15" y="50.5" width="1.8" height="1.3" /></bezel>
+ <bezel element="white"><bounds x="10" y="50.5" width="2" height="2" /></bezel>
+ <bezel element="crj"><bounds x="10.15" y="50.5" width="1.8" height="1.3" /></bezel>
+ <bezel element="crq"><bounds x="11.15" y="50.5" width="1.8" height="1.3" /></bezel>
+ <bezel element="crk"><bounds x="12.15" y="50.5" width="1.8" height="1.3" /></bezel>
+ <bezel element="csd"><bounds x="12.05" y="51.81" width="1.8" height="1.5" /></bezel>
+
+ <bezel element="cbjk"><bounds x="15.1" y="42" width="1.8" height="1.5" /></bezel>
+ <bezel element="crjk"><bounds x="15.1" y="45" width="1.8" height="1.5" /></bezel>
+
+ <bezel element="edge1"><bounds x="0.95" y="41" width="0.08" height="15" /></bezel>
+ <bezel element="edge2"><bounds x="1.00" y="41" width="0.06" height="15" /></bezel>
+ <bezel element="edge1"><bounds x="1.95" y="41" width="0.08" height="15" /></bezel>
+ <bezel element="edge2"><bounds x="2.00" y="41" width="0.06" height="15" /></bezel>
+ <bezel element="edge1"><bounds x="2.95" y="41" width="0.08" height="15" /></bezel>
+ <bezel element="edge2"><bounds x="3.00" y="41" width="0.06" height="15" /></bezel>
+ <bezel element="edge1"><bounds x="3.95" y="41" width="0.08" height="15" /></bezel>
+ <bezel element="edge2"><bounds x="4.00" y="41" width="0.06" height="15" /></bezel>
+ <bezel element="edge1"><bounds x="4.95" y="41" width="0.08" height="15" /></bezel>
+ <bezel element="edge2"><bounds x="5.00" y="41" width="0.06" height="15" /></bezel>
+ <bezel element="edge1"><bounds x="5.95" y="41" width="0.08" height="15" /></bezel>
+ <bezel element="edge2"><bounds x="6.00" y="41" width="0.06" height="15" /></bezel>
+ <bezel element="edge1"><bounds x="6.95" y="41" width="0.08" height="15" /></bezel>
+ <bezel element="edge2"><bounds x="7.00" y="41" width="0.06" height="15" /></bezel>
+ <bezel element="edge1"><bounds x="7.95" y="41" width="0.08" height="15" /></bezel>
+ <bezel element="edge2"><bounds x="8.00" y="41" width="0.06" height="15" /></bezel>
+ <bezel element="edge1"><bounds x="8.95" y="41" width="0.08" height="15" /></bezel>
+ <bezel element="edge2"><bounds x="9.00" y="41" width="0.06" height="15" /></bezel>
+ <bezel element="edge1"><bounds x="9.95" y="41" width="0.08" height="15" /></bezel>
+ <bezel element="edge2"><bounds x="10.00" y="41" width="0.06" height="15" /></bezel>
+ <bezel element="edge1"><bounds x="10.95" y="41" width="0.08" height="15" /></bezel>
+ <bezel element="edge2"><bounds x="11.00" y="41" width="0.06" height="15" /></bezel>
+ <bezel element="edge1"><bounds x="11.95" y="41" width="0.08" height="15" /></bezel>
+ <bezel element="edge2"><bounds x="12.00" y="41" width="0.06" height="15" /></bezel>
+
+ <bezel element="nothing" inputtag="CARDS.0" inputmask="0x0001"><bounds x="0" y="41.5" width="1" height="2.7" /></bezel>
+ <bezel element="nothing" inputtag="CARDS.0" inputmask="0x0002"><bounds x="1" y="41.5" width="1" height="2.7" /></bezel>
+ <bezel element="nothing" inputtag="CARDS.0" inputmask="0x0004"><bounds x="2" y="41.5" width="1" height="2.7" /></bezel>
+ <bezel element="nothing" inputtag="CARDS.0" inputmask="0x0008"><bounds x="3" y="41.5" width="1" height="2.7" /></bezel>
+ <bezel element="nothing" inputtag="CARDS.0" inputmask="0x0010"><bounds x="4" y="41.5" width="1" height="2.7" /></bezel>
+ <bezel element="nothing" inputtag="CARDS.0" inputmask="0x0020"><bounds x="5" y="41.5" width="1" height="2.7" /></bezel>
+ <bezel element="nothing" inputtag="CARDS.0" inputmask="0x0040"><bounds x="6" y="41.5" width="1" height="2.7" /></bezel>
+ <bezel element="nothing" inputtag="CARDS.0" inputmask="0x0080"><bounds x="7" y="41.5" width="1" height="2.7" /></bezel>
+ <bezel element="nothing" inputtag="CARDS.0" inputmask="0x0100"><bounds x="8" y="41.5" width="1" height="2.7" /></bezel>
+ <bezel element="nothing" inputtag="CARDS.0" inputmask="0x0200"><bounds x="9" y="41.5" width="1" height="2.7" /></bezel>
+ <bezel element="nothing" inputtag="CARDS.0" inputmask="0x0400"><bounds x="10" y="41.5" width="1" height="2.7" /></bezel>
+ <bezel element="nothing" inputtag="CARDS.0" inputmask="0x0800"><bounds x="11" y="41.5" width="1" height="2.7" /></bezel>
+ <bezel element="nothing" inputtag="CARDS.0" inputmask="0x1000"><bounds x="12" y="41.5" width="2" height="2.7" /></bezel>
+
+ <bezel element="nothing" inputtag="CARDS.1" inputmask="0x0001"><bounds x="0" y="44.5" width="1" height="2.7" /></bezel>
+ <bezel element="nothing" inputtag="CARDS.1" inputmask="0x0002"><bounds x="1" y="44.5" width="1" height="2.7" /></bezel>
+ <bezel element="nothing" inputtag="CARDS.1" inputmask="0x0004"><bounds x="2" y="44.5" width="1" height="2.7" /></bezel>
+ <bezel element="nothing" inputtag="CARDS.1" inputmask="0x0008"><bounds x="3" y="44.5" width="1" height="2.7" /></bezel>
+ <bezel element="nothing" inputtag="CARDS.1" inputmask="0x0010"><bounds x="4" y="44.5" width="1" height="2.7" /></bezel>
+ <bezel element="nothing" inputtag="CARDS.1" inputmask="0x0020"><bounds x="5" y="44.5" width="1" height="2.7" /></bezel>
+ <bezel element="nothing" inputtag="CARDS.1" inputmask="0x0040"><bounds x="6" y="44.5" width="1" height="2.7" /></bezel>
+ <bezel element="nothing" inputtag="CARDS.1" inputmask="0x0080"><bounds x="7" y="44.5" width="1" height="2.7" /></bezel>
+ <bezel element="nothing" inputtag="CARDS.1" inputmask="0x0100"><bounds x="8" y="44.5" width="1" height="2.7" /></bezel>
+ <bezel element="nothing" inputtag="CARDS.1" inputmask="0x0200"><bounds x="9" y="44.5" width="1" height="2.7" /></bezel>
+ <bezel element="nothing" inputtag="CARDS.1" inputmask="0x0400"><bounds x="10" y="44.5" width="1" height="2.7" /></bezel>
+ <bezel element="nothing" inputtag="CARDS.1" inputmask="0x0800"><bounds x="11" y="44.5" width="1" height="2.7" /></bezel>
+ <bezel element="nothing" inputtag="CARDS.1" inputmask="0x1000"><bounds x="12" y="44.5" width="2" height="2.7" /></bezel>
+
+ <bezel element="nothing" inputtag="CARDS.2" inputmask="0x0001"><bounds x="0" y="47.5" width="1" height="2.7" /></bezel>
+ <bezel element="nothing" inputtag="CARDS.2" inputmask="0x0002"><bounds x="1" y="47.5" width="1" height="2.7" /></bezel>
+ <bezel element="nothing" inputtag="CARDS.2" inputmask="0x0004"><bounds x="2" y="47.5" width="1" height="2.7" /></bezel>
+ <bezel element="nothing" inputtag="CARDS.2" inputmask="0x0008"><bounds x="3" y="47.5" width="1" height="2.7" /></bezel>
+ <bezel element="nothing" inputtag="CARDS.2" inputmask="0x0010"><bounds x="4" y="47.5" width="1" height="2.7" /></bezel>
+ <bezel element="nothing" inputtag="CARDS.2" inputmask="0x0020"><bounds x="5" y="47.5" width="1" height="2.7" /></bezel>
+ <bezel element="nothing" inputtag="CARDS.2" inputmask="0x0040"><bounds x="6" y="47.5" width="1" height="2.7" /></bezel>
+ <bezel element="nothing" inputtag="CARDS.2" inputmask="0x0080"><bounds x="7" y="47.5" width="1" height="2.7" /></bezel>
+ <bezel element="nothing" inputtag="CARDS.2" inputmask="0x0100"><bounds x="8" y="47.5" width="1" height="2.7" /></bezel>
+ <bezel element="nothing" inputtag="CARDS.2" inputmask="0x0200"><bounds x="9" y="47.5" width="1" height="2.7" /></bezel>
+ <bezel element="nothing" inputtag="CARDS.2" inputmask="0x0400"><bounds x="10" y="47.5" width="1" height="2.7" /></bezel>
+ <bezel element="nothing" inputtag="CARDS.2" inputmask="0x0800"><bounds x="11" y="47.5" width="1" height="2.7" /></bezel>
+ <bezel element="nothing" inputtag="CARDS.2" inputmask="0x1000"><bounds x="12" y="47.5" width="2" height="2.7" /></bezel>
+
+ <bezel element="nothing" inputtag="CARDS.3" inputmask="0x0001"><bounds x="0" y="50.5" width="1" height="2.7" /></bezel>
+ <bezel element="nothing" inputtag="CARDS.3" inputmask="0x0002"><bounds x="1" y="50.5" width="1" height="2.7" /></bezel>
+ <bezel element="nothing" inputtag="CARDS.3" inputmask="0x0004"><bounds x="2" y="50.5" width="1" height="2.7" /></bezel>
+ <bezel element="nothing" inputtag="CARDS.3" inputmask="0x0008"><bounds x="3" y="50.5" width="1" height="2.7" /></bezel>
+ <bezel element="nothing" inputtag="CARDS.3" inputmask="0x0010"><bounds x="4" y="50.5" width="1" height="2.7" /></bezel>
+ <bezel element="nothing" inputtag="CARDS.3" inputmask="0x0020"><bounds x="5" y="50.5" width="1" height="2.7" /></bezel>
+ <bezel element="nothing" inputtag="CARDS.3" inputmask="0x0040"><bounds x="6" y="50.5" width="1" height="2.7" /></bezel>
+ <bezel element="nothing" inputtag="CARDS.3" inputmask="0x0080"><bounds x="7" y="50.5" width="1" height="2.7" /></bezel>
+ <bezel element="nothing" inputtag="CARDS.3" inputmask="0x0100"><bounds x="8" y="50.5" width="1" height="2.7" /></bezel>
+ <bezel element="nothing" inputtag="CARDS.3" inputmask="0x0200"><bounds x="9" y="50.5" width="1" height="2.7" /></bezel>
+ <bezel element="nothing" inputtag="CARDS.3" inputmask="0x0400"><bounds x="10" y="50.5" width="1" height="2.7" /></bezel>
+ <bezel element="nothing" inputtag="CARDS.3" inputmask="0x0800"><bounds x="11" y="50.5" width="1" height="2.7" /></bezel>
+ <bezel element="nothing" inputtag="CARDS.3" inputmask="0x1000"><bounds x="12" y="50.5" width="2" height="2.7" /></bezel>
+
+ <bezel element="nothing" inputtag="CARDS.0" inputmask="0x2000"><bounds x="15" y="41.5" width="2" height="2.7" /></bezel>
+ <bezel element="nothing" inputtag="CARDS.0" inputmask="0x4000"><bounds x="15" y="44.5" width="2" height="2.7" /></bezel>
+
+ <bezel element="blackb"><bounds x="0" y="40.5" width="50" height="1" /></bezel>
+ <bezel element="blackb"><bounds x="0" y="44.2" width="50" height="0.3" /></bezel>
+ <bezel element="blackb"><bounds x="0" y="47.2" width="50" height="0.3" /></bezel>
+ <bezel element="blackb"><bounds x="14.9" y="47.3" width="50" height="15" /></bezel>
+ <bezel element="blackb"><bounds x="0" y="50.2" width="50" height="0.3" /></bezel>
+ <bezel element="blackb"><bounds x="0" y="53.2" width="50" height="15" /></bezel>
+
+ </view>
+</mamelayout>
diff --git a/src/mame/layout/fidel_pc.lay b/src/mame/layout/fidel_pc.lay
index 9531446bc56..aab54f67632 100644
--- a/src/mame/layout/fidel_pc.lay
+++ b/src/mame/layout/fidel_pc.lay
@@ -107,12 +107,12 @@
<text string="H"><color red="0.01" green="0.01" blue="0.01" /></text>
</element>
- <element name="text_r11"><text string="&#x265a;"><color red="0.81" green="0.8" blue="0.79" /></text></element>
- <element name="text_r21"><text string="&#x265b;"><color red="0.81" green="0.8" blue="0.79" /></text></element>
- <element name="text_r31"><text string="&#x265c;"><color red="0.81" green="0.8" blue="0.79" /></text></element>
- <element name="text_r41"><text string="&#x265d;"><color red="0.81" green="0.8" blue="0.79" /></text></element>
- <element name="text_r51"><text string="&#x265e;"><color red="0.81" green="0.8" blue="0.79" /></text></element>
- <element name="text_r61"><text string="&#x265f;"><color red="0.81" green="0.8" blue="0.79" /></text></element>
+ <element name="text_r11"><text string="[K]"><color red="0.81" green="0.8" blue="0.79" /></text></element>
+ <element name="text_r21"><text string="[Q]"><color red="0.81" green="0.8" blue="0.79" /></text></element>
+ <element name="text_r31"><text string="[R]"><color red="0.81" green="0.8" blue="0.79" /></text></element>
+ <element name="text_r41"><text string="[B]"><color red="0.81" green="0.8" blue="0.79" /></text></element>
+ <element name="text_r51"><text string="[N]"><color red="0.81" green="0.8" blue="0.79" /></text></element>
+ <element name="text_r61"><text string="[P]"><color red="0.81" green="0.8" blue="0.79" /></text></element>
<element name="text_r12"><text string="RESET" align="1"><color red="0.81" green="0.8" blue="0.79" /></text></element>
<element name="text_r22"><text string="spk" align="1"><color red="0.81" green="0.8" blue="0.79" /></text></element>
@@ -362,27 +362,27 @@
<!-- right side -->
- <bezel element="text_r11"><bounds x="91.5" y="15.9" width="2.5" height="2" /></bezel>
- <bezel element="text_r21"><bounds x="91.5" y="18.9" width="2.5" height="2" /></bezel>
- <bezel element="text_r31"><bounds x="91.5" y="21.9" width="2.5" height="2" /></bezel>
- <bezel element="text_r41"><bounds x="91.5" y="24.9" width="2.5" height="2" /></bezel>
- <bezel element="text_r51"><bounds x="91.5" y="27.9" width="2.5" height="2" /></bezel>
- <bezel element="text_r61"><bounds x="91.5" y="30.9" width="2.5" height="2" /></bezel>
-
- <bezel element="text_r12"><bounds x="96.8" y="8.25" width="10" height="1.5" /></bezel>
- <bezel element="text_r22"><bounds x="96.8" y="11.25" width="10" height="1.5" /></bezel>
- <bezel element="text_r32"><bounds x="96.8" y="16.25" width="10" height="1.5" /></bezel>
- <bezel element="text_r42"><bounds x="96.8" y="19.25" width="10" height="1.5" /></bezel>
- <bezel element="text_r52"><bounds x="96.8" y="22.25" width="10" height="1.5" /></bezel>
- <bezel element="text_r62"><bounds x="96.8" y="25.25" width="10" height="1.5" /></bezel>
- <bezel element="text_r72"><bounds x="96.8" y="28.25" width="10" height="1.5" /></bezel>
- <bezel element="text_r82"><bounds x="96.8" y="31.25" width="10" height="1.5" /></bezel>
- <bezel element="text_r92"><bounds x="96.8" y="36.25" width="10" height="1.5" /></bezel>
- <bezel element="text_ra2"><bounds x="96.8" y="39.25" width="10" height="1.5" /></bezel>
- <bezel element="text_rb2"><bounds x="96.8" y="42.25" width="10" height="1.5" /></bezel>
-
- <bezel element="text_r13"><bounds x="92.5" y="47.25" width="10" height="1.5" /></bezel>
- <bezel element="text_r23"><bounds x="92.5" y="50.25" width="10" height="1.5" /></bezel>
+ <bezel element="text_r11"><bounds x="91.5" y="16.15" width="3" height="1.5" /></bezel>
+ <bezel element="text_r21"><bounds x="91.5" y="19.15" width="3" height="1.5" /></bezel>
+ <bezel element="text_r31"><bounds x="91.5" y="22.15" width="3" height="1.5" /></bezel>
+ <bezel element="text_r41"><bounds x="91.5" y="25.15" width="3" height="1.5" /></bezel>
+ <bezel element="text_r51"><bounds x="91.5" y="28.15" width="3" height="1.5" /></bezel>
+ <bezel element="text_r61"><bounds x="91.5" y="31.15" width="3" height="1.5" /></bezel>
+
+ <bezel element="text_r12"><bounds x="96.8" y="8.15" width="10" height="1.5" /></bezel>
+ <bezel element="text_r22"><bounds x="96.8" y="11.15" width="10" height="1.5" /></bezel>
+ <bezel element="text_r32"><bounds x="96.8" y="16.15" width="10" height="1.5" /></bezel>
+ <bezel element="text_r42"><bounds x="96.8" y="19.15" width="10" height="1.5" /></bezel>
+ <bezel element="text_r52"><bounds x="96.8" y="22.15" width="10" height="1.5" /></bezel>
+ <bezel element="text_r62"><bounds x="96.8" y="25.15" width="10" height="1.5" /></bezel>
+ <bezel element="text_r72"><bounds x="96.8" y="28.15" width="10" height="1.5" /></bezel>
+ <bezel element="text_r82"><bounds x="96.8" y="31.15" width="10" height="1.5" /></bezel>
+ <bezel element="text_r92"><bounds x="96.8" y="36.15" width="10" height="1.5" /></bezel>
+ <bezel element="text_ra2"><bounds x="96.8" y="39.15" width="10" height="1.5" /></bezel>
+ <bezel element="text_rb2"><bounds x="96.8" y="42.15" width="10" height="1.5" /></bezel>
+
+ <bezel element="text_r13"><bounds x="92.5" y="47.15" width="10" height="1.5" /></bezel>
+ <bezel element="text_r23"><bounds x="92.5" y="50.15" width="10" height="1.5" /></bezel>
<bezel name="8.8" element="led2"><bounds x="90" y="16.25" width="1.5" height="1.5" /></bezel>
<bezel name="8.9" element="led2"><bounds x="90" y="19.25" width="1.5" height="1.5" /></bezel>
diff --git a/src/mame/layout/fidel_playmatic.lay b/src/mame/layout/fidel_playmatic.lay
index 9834870d937..907a4dbab03 100644
--- a/src/mame/layout/fidel_playmatic.lay
+++ b/src/mame/layout/fidel_playmatic.lay
@@ -96,12 +96,12 @@
<text string="H"><color red="0.01" green="0.01" blue="0.01" /></text>
</element>
- <element name="text_l3"><text string="&#x2654;"><color red="0.81" green="0.8" blue="0.79" /></text></element>
- <element name="text_l4"><text string="&#x2655;"><color red="0.81" green="0.8" blue="0.79" /></text></element>
- <element name="text_l5"><text string="&#x2656;"><color red="0.81" green="0.8" blue="0.79" /></text></element>
- <element name="text_l6"><text string="&#x2657;"><color red="0.81" green="0.8" blue="0.79" /></text></element>
- <element name="text_l7"><text string="&#x2658;"><color red="0.81" green="0.8" blue="0.79" /></text></element>
- <element name="text_l8"><text string="&#x2659;"><color red="0.81" green="0.8" blue="0.79" /></text></element>
+ <element name="text_l3"><text string="[K]"><color red="0.81" green="0.8" blue="0.79" /></text></element>
+ <element name="text_l4"><text string="[Q]"><color red="0.81" green="0.8" blue="0.79" /></text></element>
+ <element name="text_l5"><text string="[R]"><color red="0.81" green="0.8" blue="0.79" /></text></element>
+ <element name="text_l6"><text string="[B]"><color red="0.81" green="0.8" blue="0.79" /></text></element>
+ <element name="text_l7"><text string="[N]"><color red="0.81" green="0.8" blue="0.79" /></text></element>
+ <element name="text_l8"><text string="[P]"><color red="0.81" green="0.8" blue="0.79" /></text></element>
<element name="text_r1"><text string="RE"><color red="0.81" green="0.8" blue="0.79" /></text></element>
<element name="text_r2"><text string="CL"><color red="0.81" green="0.8" blue="0.79" /></text></element>
@@ -337,12 +337,12 @@
<!-- not included here: 2 on/off switches for power and module enable, each with green led when on -->
- <bezel element="text_l3"><bounds x="88.25" y="39.75" width="4" height="4" /></bezel>
- <bezel element="text_l4"><bounds x="88.25" y="43.75" width="4" height="4" /></bezel>
- <bezel element="text_l5"><bounds x="88.25" y="47.75" width="4" height="4" /></bezel>
- <bezel element="text_l6"><bounds x="88.25" y="51.75" width="4" height="4" /></bezel>
- <bezel element="text_l7"><bounds x="88.25" y="55.75" width="4" height="4" /></bezel>
- <bezel element="text_l8"><bounds x="88.25" y="59.75" width="4" height="4" /></bezel>
+ <bezel element="text_l3"><bounds x="88" y="41" width="4" height="2" /></bezel>
+ <bezel element="text_l4"><bounds x="88" y="45" width="4" height="2" /></bezel>
+ <bezel element="text_l5"><bounds x="88" y="49" width="4" height="2" /></bezel>
+ <bezel element="text_l6"><bounds x="88" y="53" width="4" height="2" /></bezel>
+ <bezel element="text_l7"><bounds x="88" y="57" width="4" height="2" /></bezel>
+ <bezel element="text_l8"><bounds x="88" y="61" width="4" height="2" /></bezel>
<bezel element="text_r1"><bounds x="93.25" y="33" width="4" height="2" /></bezel>
<bezel element="text_r2"><bounds x="93.25" y="37" width="4" height="2" /></bezel>
diff --git a/src/mame/layout/fidel_sc12.lay b/src/mame/layout/fidel_sc12.lay
index 69fc90284a5..80631d7d880 100644
--- a/src/mame/layout/fidel_sc12.lay
+++ b/src/mame/layout/fidel_sc12.lay
@@ -233,27 +233,27 @@
<element name="text_king">
<disk><color red="0.81" green="0.8" blue="0.79" /></disk>
- <text string="&#x2654;"><color red="0.17" green="0.15" blue="0.15" /></text>
+ <text string="[K]"><color red="0.17" green="0.15" blue="0.15" /></text>
</element>
<element name="text_queen">
<disk><color red="0.81" green="0.8" blue="0.79" /></disk>
- <text string="&#x2655;"><color red="0.17" green="0.15" blue="0.15" /></text>
+ <text string="[Q]"><color red="0.17" green="0.15" blue="0.15" /></text>
</element>
<element name="text_rook">
<disk><color red="0.81" green="0.8" blue="0.79" /></disk>
- <text string="&#x2656;"><color red="0.17" green="0.15" blue="0.15" /></text>
+ <text string="[R]"><color red="0.17" green="0.15" blue="0.15" /></text>
</element>
<element name="text_bishop">
<disk><color red="0.81" green="0.8" blue="0.79" /></disk>
- <text string="&#x2657;"><color red="0.17" green="0.15" blue="0.15" /></text>
+ <text string="[B]"><color red="0.17" green="0.15" blue="0.15" /></text>
</element>
<element name="text_knight">
<disk><color red="0.81" green="0.8" blue="0.79" /></disk>
- <text string="&#x2658;"><color red="0.17" green="0.15" blue="0.15" /></text>
+ <text string="[N]"><color red="0.17" green="0.15" blue="0.15" /></text>
</element>
<element name="text_pawn">
<disk><color red="0.81" green="0.8" blue="0.79" /></disk>
- <text string="&#x2659;"><color red="0.17" green="0.15" blue="0.15" /></text>
+ <text string="[P]"><color red="0.17" green="0.15" blue="0.15" /></text>
</element>
@@ -479,12 +479,12 @@
<!-- right side -->
- <bezel element="text_king"><bounds x="87.7" y="20.6" width="4.6" height="4" /></bezel>
- <bezel element="text_queen"><bounds x="87.7" y="29.9" width="4.6" height="4" /></bezel>
- <bezel element="text_rook"><bounds x="87.7" y="39.2" width="4.6" height="4" /></bezel>
- <bezel element="text_bishop"><bounds x="87.7" y="48.5" width="4.6" height="4" /></bezel>
- <bezel element="text_knight"><bounds x="87.7" y="57.8" width="4.6" height="4" /></bezel>
- <bezel element="text_pawn"><bounds x="87.7" y="67.1" width="4.6" height="4" /></bezel>
+ <bezel element="text_king"><bounds x="87.7" y="21.4" width="4.6" height="2.5" /></bezel>
+ <bezel element="text_queen"><bounds x="87.7" y="30.7" width="4.6" height="2.5" /></bezel>
+ <bezel element="text_rook"><bounds x="87.7" y="40.0" width="4.6" height="2.5" /></bezel>
+ <bezel element="text_bishop"><bounds x="87.7" y="49.3" width="4.6" height="2.5" /></bezel>
+ <bezel element="text_knight"><bounds x="87.7" y="58.6" width="4.6" height="2.5" /></bezel>
+ <bezel element="text_pawn"><bounds x="87.7" y="67.9" width="4.6" height="2.5" /></bezel>
<bezel element="disk_black"><bounds x="87" y="3.1" width="6" height="6" /></bezel>
<bezel element="disk_black"><bounds x="87" y="12.4" width="6" height="6" /></bezel>
diff --git a/src/mame/layout/fidel_sc6.lay b/src/mame/layout/fidel_sc6.lay
index f3cbcd49389..d64dce25d7c 100644
--- a/src/mame/layout/fidel_sc6.lay
+++ b/src/mame/layout/fidel_sc6.lay
@@ -134,27 +134,27 @@
<element name="text_king">
<disk><color red="0.81" green="0.8" blue="0.79" /></disk>
- <text string="&#x2654;"><color red="0.17" green="0.15" blue="0.15" /></text>
+ <text string="[K]"><color red="0.17" green="0.15" blue="0.15" /></text>
</element>
<element name="text_queen">
<disk><color red="0.81" green="0.8" blue="0.79" /></disk>
- <text string="&#x2655;"><color red="0.17" green="0.15" blue="0.15" /></text>
+ <text string="[Q]"><color red="0.17" green="0.15" blue="0.15" /></text>
</element>
<element name="text_rook">
<disk><color red="0.81" green="0.8" blue="0.79" /></disk>
- <text string="&#x2656;"><color red="0.17" green="0.15" blue="0.15" /></text>
+ <text string="[R]"><color red="0.17" green="0.15" blue="0.15" /></text>
</element>
<element name="text_bishop">
<disk><color red="0.81" green="0.8" blue="0.79" /></disk>
- <text string="&#x2657;"><color red="0.17" green="0.15" blue="0.15" /></text>
+ <text string="[B]"><color red="0.17" green="0.15" blue="0.15" /></text>
</element>
<element name="text_knight">
<disk><color red="0.81" green="0.8" blue="0.79" /></disk>
- <text string="&#x2658;"><color red="0.17" green="0.15" blue="0.15" /></text>
+ <text string="[N]"><color red="0.17" green="0.15" blue="0.15" /></text>
</element>
<element name="text_pawn">
<disk><color red="0.81" green="0.8" blue="0.79" /></disk>
- <text string="&#x2659;"><color red="0.17" green="0.15" blue="0.15" /></text>
+ <text string="[P]"><color red="0.17" green="0.15" blue="0.15" /></text>
</element>
@@ -306,12 +306,12 @@
<!-- right side -->
- <bezel element="text_king"><bounds x="84.01" y="31.1" width="6" height="6" /></bezel>
- <bezel element="text_queen"><bounds x="84.01" y="39.9" width="6" height="6" /></bezel>
- <bezel element="text_rook"><bounds x="84.01" y="48.7" width="6" height="6" /></bezel>
- <bezel element="text_bishop"><bounds x="84.01" y="57.5" width="6" height="6" /></bezel>
- <bezel element="text_knight"><bounds x="84.01" y="66.3" width="6" height="6" /></bezel>
- <bezel element="text_pawn"><bounds x="84.01" y="75.1" width="6" height="6" /></bezel>
+ <bezel element="text_king"><bounds x="84.01" y="32.8" width="5.5" height="3" /></bezel>
+ <bezel element="text_queen"><bounds x="84.01" y="41.6" width="5.5" height="3" /></bezel>
+ <bezel element="text_rook"><bounds x="84.01" y="50.4" width="5.5" height="3" /></bezel>
+ <bezel element="text_bishop"><bounds x="84.01" y="59.2" width="5.5" height="3" /></bezel>
+ <bezel element="text_knight"><bounds x="84.01" y="68" width="5.5" height="3" /></bezel>
+ <bezel element="text_pawn"><bounds x="84.01" y="76.8" width="5.5" height="3" /></bezel>
<bezel element="disk_black"><bounds x="89" y="13" width="7.4" height="7.4" /></bezel>
<bezel element="disk_black"><bounds x="89" y="21.8" width="7.4" height="7.4" /></bezel>
diff --git a/src/mame/layout/fidel_sc8.lay b/src/mame/layout/fidel_sc8.lay
index bb624815da6..a7ba743dbc4 100644
--- a/src/mame/layout/fidel_sc8.lay
+++ b/src/mame/layout/fidel_sc8.lay
@@ -110,27 +110,27 @@
</element>
<element name="text_king">
<disk><color red="0.81" green="0.8" blue="0.79" /></disk>
- <text string="&#x265a;"><color red="0.17" green="0.15" blue="0.15" /></text>
+ <text string="[K]"><color red="0.17" green="0.15" blue="0.15" /></text>
</element>
<element name="text_queen">
<disk><color red="0.81" green="0.8" blue="0.79" /></disk>
- <text string="&#x265b;"><color red="0.17" green="0.15" blue="0.15" /></text>
+ <text string="[Q]"><color red="0.17" green="0.15" blue="0.15" /></text>
</element>
<element name="text_rook">
<disk><color red="0.81" green="0.8" blue="0.79" /></disk>
- <text string="&#x265c;"><color red="0.17" green="0.15" blue="0.15" /></text>
+ <text string="[R]"><color red="0.17" green="0.15" blue="0.15" /></text>
</element>
<element name="text_bishop">
<disk><color red="0.81" green="0.8" blue="0.79" /></disk>
- <text string="&#x265d;"><color red="0.17" green="0.15" blue="0.15" /></text>
+ <text string="[B]"><color red="0.17" green="0.15" blue="0.15" /></text>
</element>
<element name="text_knight">
<disk><color red="0.81" green="0.8" blue="0.79" /></disk>
- <text string="&#x265e;"><color red="0.17" green="0.15" blue="0.15" /></text>
+ <text string="[N]"><color red="0.17" green="0.15" blue="0.15" /></text>
</element>
<element name="text_pawn">
<disk><color red="0.81" green="0.8" blue="0.79" /></disk>
- <text string="&#x265f;"><color red="0.17" green="0.15" blue="0.15" /></text>
+ <text string="[P]"><color red="0.17" green="0.15" blue="0.15" /></text>
</element>
@@ -378,12 +378,12 @@
<bezel element="text_re"><bounds x="88.2" y="15.2" width="5" height="3" /></bezel>
<bezel element="text_cl"><bounds x="88.2" y="24" width="5" height="3" /></bezel>
- <bezel element="text_king"><bounds x="88.2" y="32.1" width="5" height="4" /></bezel>
- <bezel element="text_queen"><bounds x="88.2" y="40.9" width="5" height="4" /></bezel>
- <bezel element="text_bishop"><bounds x="88.2" y="49.7" width="5" height="4" /></bezel>
- <bezel element="text_knight"><bounds x="88.2" y="58.5" width="5" height="4" /></bezel>
- <bezel element="text_rook"><bounds x="88.2" y="67.3" width="5" height="4" /></bezel>
- <bezel element="text_pawn"><bounds x="88.2" y="76.1" width="5" height="4" /></bezel>
+ <bezel element="text_king"><bounds x="88.2" y="32.8" width="5" height="3" /></bezel>
+ <bezel element="text_queen"><bounds x="88.2" y="41.6" width="5" height="3" /></bezel>
+ <bezel element="text_bishop"><bounds x="88.2" y="50.4" width="5" height="3" /></bezel>
+ <bezel element="text_knight"><bounds x="88.2" y="59.2" width="5" height="3" /></bezel>
+ <bezel element="text_rook"><bounds x="88.2" y="68" width="5" height="3" /></bezel>
+ <bezel element="text_pawn"><bounds x="88.2" y="76.8" width="5" height="3" /></bezel>
<bezel element="hlb" inputtag="IN.8" inputmask="0x80"><bounds x="87" y="13" width="7.4" height="7.4" /><color alpha="0.3" /></bezel>
<bezel element="hlb" inputtag="IN.8" inputmask="0x40"><bounds x="87" y="21.8" width="7.4" height="7.4" /><color alpha="0.3" /></bezel>
diff --git a/src/mame/layout/fidel_sc9.lay b/src/mame/layout/fidel_sc9.lay
index b3685ea7e91..fef85f4013c 100644
--- a/src/mame/layout/fidel_sc9.lay
+++ b/src/mame/layout/fidel_sc9.lay
@@ -137,27 +137,27 @@
<element name="text_king">
<disk><color red="0.81" green="0.8" blue="0.79" /></disk>
- <text string="&#x2654;"><color red="0.17" green="0.15" blue="0.15" /></text>
+ <text string="[K]"><color red="0.17" green="0.15" blue="0.15" /></text>
</element>
<element name="text_queen">
<disk><color red="0.81" green="0.8" blue="0.79" /></disk>
- <text string="&#x2655;"><color red="0.17" green="0.15" blue="0.15" /></text>
+ <text string="[Q]"><color red="0.17" green="0.15" blue="0.15" /></text>
</element>
<element name="text_rook">
<disk><color red="0.81" green="0.8" blue="0.79" /></disk>
- <text string="&#x2656;"><color red="0.17" green="0.15" blue="0.15" /></text>
+ <text string="[R]"><color red="0.17" green="0.15" blue="0.15" /></text>
</element>
<element name="text_bishop">
<disk><color red="0.81" green="0.8" blue="0.79" /></disk>
- <text string="&#x2657;"><color red="0.17" green="0.15" blue="0.15" /></text>
+ <text string="[B]"><color red="0.17" green="0.15" blue="0.15" /></text>
</element>
<element name="text_knight">
<disk><color red="0.81" green="0.8" blue="0.79" /></disk>
- <text string="&#x2658;"><color red="0.17" green="0.15" blue="0.15" /></text>
+ <text string="[N]"><color red="0.17" green="0.15" blue="0.15" /></text>
</element>
<element name="text_pawn">
<disk><color red="0.81" green="0.8" blue="0.79" /></disk>
- <text string="&#x2659;"><color red="0.17" green="0.15" blue="0.15" /></text>
+ <text string="[P]"><color red="0.17" green="0.15" blue="0.15" /></text>
</element>
@@ -385,12 +385,12 @@
<bezel name="8.7" element="led"><bounds x="91.95" y="7.25" width="1.5" height="1.5" /></bezel>
- <bezel element="text_king"><bounds x="84.01" y="31.1" width="6" height="6" /></bezel>
- <bezel element="text_queen"><bounds x="84.01" y="39.9" width="6" height="6" /></bezel>
- <bezel element="text_rook"><bounds x="84.01" y="48.7" width="6" height="6" /></bezel>
- <bezel element="text_bishop"><bounds x="84.01" y="57.5" width="6" height="6" /></bezel>
- <bezel element="text_knight"><bounds x="84.01" y="66.3" width="6" height="6" /></bezel>
- <bezel element="text_pawn"><bounds x="84.01" y="75.1" width="6" height="6" /></bezel>
+ <bezel element="text_king"><bounds x="84.01" y="32.8" width="5.7" height="3" /></bezel>
+ <bezel element="text_queen"><bounds x="84.01" y="41.6" width="5.7" height="3" /></bezel>
+ <bezel element="text_rook"><bounds x="84.01" y="50.4" width="5.7" height="3" /></bezel>
+ <bezel element="text_bishop"><bounds x="84.01" y="59.2" width="5.7" height="3" /></bezel>
+ <bezel element="text_knight"><bounds x="84.01" y="68" width="5.7" height="3" /></bezel>
+ <bezel element="text_pawn"><bounds x="84.01" y="76.8" width="5.7" height="3" /></bezel>
<bezel element="disk_black"><bounds x="89" y="13" width="7.4" height="7.4" /></bezel>
<bezel element="disk_black"><bounds x="89" y="21.8" width="7.4" height="7.4" /></bezel>
diff --git a/src/mame/layout/fidel_su9.lay b/src/mame/layout/fidel_su9.lay
index 043cdf1f704..e722afc8d17 100644
--- a/src/mame/layout/fidel_su9.lay
+++ b/src/mame/layout/fidel_su9.lay
@@ -151,27 +151,27 @@
<element name="text_king">
<disk><color red="0.81" green="0.8" blue="0.79" /></disk>
- <text string="&#x2654;"><color red="0.17" green="0.15" blue="0.15" /></text>
+ <text string="[K]"><color red="0.17" green="0.15" blue="0.15" /></text>
</element>
<element name="text_queen">
<disk><color red="0.81" green="0.8" blue="0.79" /></disk>
- <text string="&#x2655;"><color red="0.17" green="0.15" blue="0.15" /></text>
+ <text string="[Q]"><color red="0.17" green="0.15" blue="0.15" /></text>
</element>
<element name="text_rook">
<disk><color red="0.81" green="0.8" blue="0.79" /></disk>
- <text string="&#x2656;"><color red="0.17" green="0.15" blue="0.15" /></text>
+ <text string="[R]"><color red="0.17" green="0.15" blue="0.15" /></text>
</element>
<element name="text_bishop">
<disk><color red="0.81" green="0.8" blue="0.79" /></disk>
- <text string="&#x2657;"><color red="0.17" green="0.15" blue="0.15" /></text>
+ <text string="[B]"><color red="0.17" green="0.15" blue="0.15" /></text>
</element>
<element name="text_knight">
<disk><color red="0.81" green="0.8" blue="0.79" /></disk>
- <text string="&#x2658;"><color red="0.17" green="0.15" blue="0.15" /></text>
+ <text string="[N]"><color red="0.17" green="0.15" blue="0.15" /></text>
</element>
<element name="text_pawn">
<disk><color red="0.81" green="0.8" blue="0.79" /></disk>
- <text string="&#x2659;"><color red="0.17" green="0.15" blue="0.15" /></text>
+ <text string="[P]"><color red="0.17" green="0.15" blue="0.15" /></text>
</element>
<element name="text_tmp">
@@ -424,12 +424,12 @@
<bezel name="0.7" element="led"><bounds x="91.95" y="7.25" width="1.5" height="1.5" /></bezel>
- <bezel element="text_king"><bounds x="84.01" y="31.1" width="6" height="6" /></bezel>
- <bezel element="text_queen"><bounds x="84.01" y="39.9" width="6" height="6" /></bezel>
- <bezel element="text_rook"><bounds x="84.01" y="48.7" width="6" height="6" /></bezel>
- <bezel element="text_bishop"><bounds x="84.01" y="57.5" width="6" height="6" /></bezel>
- <bezel element="text_knight"><bounds x="84.01" y="66.3" width="6" height="6" /></bezel>
- <bezel element="text_pawn"><bounds x="84.01" y="75.1" width="6" height="6" /></bezel>
+ <bezel element="text_king"><bounds x="84.01" y="32.8" width="5.7" height="3" /></bezel>
+ <bezel element="text_queen"><bounds x="84.01" y="41.6" width="5.7" height="3" /></bezel>
+ <bezel element="text_rook"><bounds x="84.01" y="50.4" width="5.7" height="3" /></bezel>
+ <bezel element="text_bishop"><bounds x="84.01" y="59.2" width="5.7" height="3" /></bezel>
+ <bezel element="text_knight"><bounds x="84.01" y="68" width="5.7" height="3" /></bezel>
+ <bezel element="text_pawn"><bounds x="84.01" y="76.8" width="5.7" height="3" /></bezel>
<bezel element="disk_black"><bounds x="89" y="13" width="7.4" height="7.4" /></bezel>
<bezel element="disk_black"><bounds x="89" y="21.8" width="7.4" height="7.4" /></bezel>
diff --git a/src/mame/layout/fidel_vbrc.lay b/src/mame/layout/fidel_vbrc.lay
deleted file mode 100644
index d28248fb36b..00000000000
--- a/src/mame/layout/fidel_vbrc.lay
+++ /dev/null
@@ -1,114 +0,0 @@
-<?xml version="1.0"?>
-<mamelayout version="2">
-
- <element name="digit" defstate="0">
- <led14seg><color red="0.2" green="1.0" blue="0.85" /></led14seg>
- </element>
-
- <element name="led" defstate="0">
- <rect state="0">
- <color red="0.2" green="0.0" blue="0.0" />
- </rect>
- <rect state="1">
- <color red="0.9" green="0.0" blue="0.0" />
- </rect>
- </element>
-
- <element name="str_n"> <text string="N"/> </element>
- <element name="str_e"> <text string="E"/> </element>
- <element name="str_s"> <text string="S"/> </element>
- <element name="str_w"> <text string="W"/> </element>
- <element name="str_v1"> <text string="^V"/> </element>
- <element name="str_v2"> <text string="&lt;&gt;V"/> </element>
- <element name="str_db"> <text string="DB"/> </element>
- <element name="str_rd"> <text string="RD"/> </element>
-
- <element name="background">
- <rect>
- <bounds left="0" top="0" right="1" bottom="1" />
- <color red="0.0" green="0.0" blue="0.0" />
- </rect>
- </element>
-
- <view name="Internal Layout">
- <!-- Black background -->
- <bezel element="background">
- <bounds left="00" top="00" right="430" bottom="90" />
- </bezel>
-
- <bezel name="digit0" element="digit">
- <bounds x="10" y="20" width="50" height="80" />
- </bezel>
- <bezel name="digit1" element="digit">
- <bounds x="70" y="20" width="50" height="80" />
- </bezel>
- <bezel name="digit2" element="digit">
- <bounds x="130" y="20" width="50" height="80" />
- </bezel>
- <bezel name="digit3" element="digit">
- <bounds x="190" y="20" width="50" height="80" />
- </bezel>
- <bezel name="digit4" element="digit">
- <bounds x="250" y="20" width="50" height="80" />
- </bezel>
- <bezel name="digit5" element="digit">
- <bounds x="310" y="20" width="50" height="80" />
- </bezel>
- <bezel name="digit6" element="digit">
- <bounds x="370" y="20" width="50" height="80" />
- </bezel>
- <bezel name="digit7" element="digit">
- <bounds x="430" y="20" width="50" height="80" />
- </bezel>
-
- <bezel name="7.15" element="led">
- <bounds x="35" y="5" width="10" height="10" />
- </bezel>
- <bezel name="6.15" element="led">
- <bounds x="95" y="5" width="10" height="10" />
- </bezel>
- <bezel name="5.15" element="led">
- <bounds x="155" y="5" width="10" height="10" />
- </bezel>
- <bezel name="4.15" element="led">
- <bounds x="215" y="5" width="10" height="10" />
- </bezel>
- <bezel name="3.15" element="led">
- <bounds x="275" y="5" width="10" height="10" />
- </bezel>
- <bezel name="2.15" element="led">
- <bounds x="335" y="5" width="10" height="10" />
- </bezel>
- <bezel name="1.15" element="led">
- <bounds x="395" y="5" width="10" height="10" />
- </bezel>
- <bezel name="0.15" element="led">
- <bounds x="455" y="5" width="10" height="10" />
- </bezel>
-
- <bezel name="led1_label" element="str_n">
- <bounds x="35" y="5" width="10" height="10" />
- </bezel>
- <bezel name="led2_label" element="str_e">
- <bounds x="95" y="5" width="10" height="10" />
- </bezel>
- <bezel name="led3_label" element="str_s">
- <bounds x="155" y="5" width="10" height="10" />
- </bezel>
- <bezel name="led4_label" element="str_w">
- <bounds x="215" y="5" width="10" height="10" />
- </bezel>
- <bezel name="led5_label" element="str_v1">
- <bounds x="275" y="5" width="10" height="10" />
- </bezel>
- <bezel name="led6_label" element="str_v2">
- <bounds x="335" y="5" width="10" height="10" />
- </bezel>
- <bezel name="led7_label" element="str_db">
- <bounds x="395" y="5" width="10" height="10" />
- </bezel>
- <bezel name="led8_label" element="str_rd">
- <bounds x="455" y="5" width="10" height="10" />
- </bezel>
- </view>
-</mamelayout>
diff --git a/src/mame/layout/fidel_vsc.lay b/src/mame/layout/fidel_vsc.lay
index cc112db62f3..24ad2352d88 100644
--- a/src/mame/layout/fidel_vsc.lay
+++ b/src/mame/layout/fidel_vsc.lay
@@ -124,27 +124,27 @@
</element>
<element name="text_king">
<disk><color red="0.81" green="0.8" blue="0.79" /></disk>
- <text string="&#x265a;"><color red="0.17" green="0.15" blue="0.15" /></text>
+ <text string="[K]"><color red="0.17" green="0.15" blue="0.15" /></text>
</element>
<element name="text_queen">
<disk><color red="0.81" green="0.8" blue="0.79" /></disk>
- <text string="&#x265b;"><color red="0.17" green="0.15" blue="0.15" /></text>
+ <text string="[Q]"><color red="0.17" green="0.15" blue="0.15" /></text>
</element>
<element name="text_rook">
<disk><color red="0.81" green="0.8" blue="0.79" /></disk>
- <text string="&#x265c;"><color red="0.17" green="0.15" blue="0.15" /></text>
+ <text string="[R]"><color red="0.17" green="0.15" blue="0.15" /></text>
</element>
<element name="text_bishop">
<disk><color red="0.81" green="0.8" blue="0.79" /></disk>
- <text string="&#x265d;"><color red="0.17" green="0.15" blue="0.15" /></text>
+ <text string="[B]"><color red="0.17" green="0.15" blue="0.15" /></text>
</element>
<element name="text_knight">
<disk><color red="0.81" green="0.8" blue="0.79" /></disk>
- <text string="&#x265e;"><color red="0.17" green="0.15" blue="0.15" /></text>
+ <text string="[N]"><color red="0.17" green="0.15" blue="0.15" /></text>
</element>
<element name="text_pawn">
<disk><color red="0.81" green="0.8" blue="0.79" /></disk>
- <text string="&#x265f;"><color red="0.17" green="0.15" blue="0.15" /></text>
+ <text string="[P]"><color red="0.17" green="0.15" blue="0.15" /></text>
</element>
<element name="text_tm">
@@ -417,12 +417,12 @@
<bezel element="text_re"><bounds x="88.2" y="15.2" width="5" height="3" /></bezel>
<bezel element="text_cl"><bounds x="88.2" y="24" width="5" height="3" /></bezel>
- <bezel element="text_king"><bounds x="88.2" y="32.1" width="5" height="4" /></bezel>
- <bezel element="text_queen"><bounds x="88.2" y="40.9" width="5" height="4" /></bezel>
- <bezel element="text_bishop"><bounds x="88.2" y="49.7" width="5" height="4" /></bezel>
- <bezel element="text_knight"><bounds x="88.2" y="58.5" width="5" height="4" /></bezel>
- <bezel element="text_rook"><bounds x="88.2" y="67.3" width="5" height="4" /></bezel>
- <bezel element="text_pawn"><bounds x="88.2" y="76.1" width="5" height="4" /></bezel>
+ <bezel element="text_king"><bounds x="88.2" y="32.8" width="5" height="3" /></bezel>
+ <bezel element="text_queen"><bounds x="88.2" y="41.6" width="5" height="3" /></bezel>
+ <bezel element="text_bishop"><bounds x="88.2" y="50.4" width="5" height="3" /></bezel>
+ <bezel element="text_knight"><bounds x="88.2" y="59.2" width="5" height="3" /></bezel>
+ <bezel element="text_rook"><bounds x="88.2" y="68" width="5" height="3" /></bezel>
+ <bezel element="text_pawn"><bounds x="88.2" y="76.8" width="5" height="3" /></bezel>
<bezel element="hlb" inputtag="IN.8" inputmask="0x80"><bounds x="87" y="13" width="7.4" height="7.4" /><color alpha="0.3" /></bezel>
<bezel element="hlb" inputtag="IN.8" inputmask="0x40"><bounds x="87" y="21.8" width="7.4" height="7.4" /><color alpha="0.3" /></bezel>
diff --git a/src/mame/layout/gckong.lay b/src/mame/layout/gckong.lay
new file mode 100644
index 00000000000..a1c7229dcc2
--- /dev/null
+++ b/src/mame/layout/gckong.lay
@@ -0,0 +1,43 @@
+<?xml version="1.0"?>
+<mamelayout version="2">
+
+<!-- define elements -->
+
+ <element name="white"><rect><color red="0.85" green="0.85" blue="0.85" /></rect></element>
+
+ <element name="ladder">
+ <rect>
+ <bounds x="0" y="0" width="1" height="10" />
+ <color red="1" green="1" blue="1" />
+ </rect>
+ <rect>
+ <bounds x="5" y="0" width="1" height="10" />
+ <color red="1" green="1" blue="1" />
+ </rect>
+ <rect>
+ <bounds x="0.5" y="0.5" width="5" height="0.5" />
+ <color red="1" green="1" blue="1" />
+ </rect>
+ <rect>
+ <bounds x="0.5" y="4.75" width="5" height="0.5" />
+ <color red="1" green="1" blue="1" />
+ </rect>
+ <rect>
+ <bounds x="0.5" y="9" width="5" height="0.5" />
+ <color red="1" green="1" blue="1" />
+ </rect>
+ </element>
+
+
+<!-- build screen -->
+
+ <view name="Internal Layout">
+ <screen index="0"><bounds left="0" top="0" right="479" bottom="1080" /></screen>
+
+ <bezel element="ladder"><bounds x="0" y="290" width="55" height="213" /><color alpha="0.85" /></bezel>
+ <bezel element="ladder"><bounds x="424" y="484" width="55" height="213" /><color alpha="0.85" /></bezel>
+ <bezel element="ladder"><bounds x="0" y="680" width="55" height="213" /><color alpha="0.85" /></bezel>
+ <bezel element="ladder"><bounds x="424" y="874" width="55" height="213" /><color alpha="0.85" /></bezel>
+
+ </view>
+</mamelayout>
diff --git a/src/mame/layout/h2hbaskb.lay b/src/mame/layout/h2hbaskb.lay
new file mode 100644
index 00000000000..ecbd51579a2
--- /dev/null
+++ b/src/mame/layout/h2hbaskb.lay
@@ -0,0 +1,163 @@
+<?xml version="1.0"?>
+<mamelayout version="2">
+
+<!-- define elements -->
+
+ <element name="static_yellow"><rect><color red="0.75" green="0.7" blue="0.2" /></rect></element>
+ <element name="static_black"><rect><color red="0.0" green="0.0" blue="0.0" /></rect></element>
+ <element name="static_white"><rect><color red="0.85" green="0.85" blue="0.85" /></rect></element>
+ <element name="disk_white"><disk><color red="0.85" green="0.85" blue="0.85" /></disk></element>
+ <element name="disk_black"><disk><color red="0.0" green="0.0" blue="0.0" /></disk></element>
+
+ <element name="digit" defstate="0">
+ <led7seg><color red="1.0" green="0.20" blue="0.22" /></led7seg>
+ </element>
+
+ <element name="led" defstate="0">
+ <disk state="0"><color red="0.14" green="0.02" blue="0.03" /></disk>
+ <disk state="1"><color red="1.0" green="0.20" blue="0.22" /></disk>
+ </element>
+
+ <element name="text_home"><text string="HOME"><color red="0.85" green="0.85" blue="0.85" /></text></element>
+ <element name="text_away"><text string="AWAY"><color red="0.85" green="0.85" blue="0.85" /></text></element>
+
+
+<!-- build screen -->
+
+ <view name="Internal Layout">
+ <bounds left="26" right="124" top="5" bottom="85.5" />
+
+ <!-- field, goal -->
+
+ <bezel element="static_yellow"><bounds x="25" y="4" width="100" height="22.1" /></bezel>
+ <bezel element="static_white"><bounds x="33" y="14" width="18" height="12.1" /></bezel>
+ <bezel element="static_black"><bounds x="34" y="15" width="16" height="12.1" /></bezel>
+
+ <bezel name="digit7" element="digit"><bounds x="36" y="16" width="6" height="9" /></bezel>
+ <bezel name="digit6" element="digit"><bounds x="42" y="16" width="6" height="9" /></bezel>
+
+ <bezel element="static_white"><bounds x="25" y="26" width="100" height="1" /></bezel>
+ <bezel element="disk_white"><bounds x="60" y="40" width="30" height="30" /></bezel>
+ <bezel element="disk_black"><bounds x="61" y="41" width="28" height="28" /></bezel>
+ <bezel element="static_white"><bounds x="60" y="5" width="30" height="50" /></bezel>
+ <bezel element="static_black"><bounds x="61" y="5" width="28" height="50.1" /></bezel>
+ <bezel element="static_white"><bounds x="57.5" y="4.9" width="35" height="1.1" /></bezel>
+ <bezel element="static_white"><bounds x="60.5" y="51" width="29" height="1" /></bezel>
+
+ <bezel element="static_black"><bounds x="59.99" y="10.5" width="30.02" height="0.9" /></bezel>
+ <bezel element="static_black"><bounds x="59.99" y="17.0" width="30.02" height="0.9" /></bezel>
+ <bezel element="static_black"><bounds x="59.99" y="23.5" width="30.02" height="0.9" /></bezel>
+ <bezel element="static_black"><bounds x="59.5" y="30.0" width="31" height="0.9" /></bezel>
+ <bezel element="static_black"><bounds x="59.5" y="36.5" width="31" height="0.9" /></bezel>
+ <bezel element="static_black"><bounds x="59.5" y="43.0" width="31" height="0.9" /></bezel>
+ <bezel element="static_black"><bounds x="59.5" y="49.5" width="31" height="0.9" /></bezel>
+
+ <bezel element="disk_white"><bounds x="70" y="8" width="10" height="10" /></bezel>
+ <bezel element="static_white"><bounds x="72" y="5.5" width="1" height="6" /></bezel>
+ <bezel element="static_white"><bounds x="77" y="5.5" width="1" height="6" /></bezel>
+
+ <bezel element="disk_black"><bounds x="71" y="9" width="8" height="8" /></bezel>
+ <bezel name="5.0" element="led"><bounds x="73" y="11" width="4" height="4" /></bezel>
+
+ <bezel name="9.0" element="led"><bounds x="62" y="21" width="4" height="4" /></bezel>
+ <bezel name="9.1" element="led"><bounds x="67" y="25" width="4" height="4" /></bezel>
+ <bezel name="9.2" element="led"><bounds x="73" y="26" width="4" height="4" /></bezel>
+ <bezel name="9.3" element="led"><bounds x="79" y="25" width="4" height="4" /></bezel>
+ <bezel name="9.4" element="led"><bounds x="84" y="21" width="4" height="4" /></bezel>
+
+ <!-- men -->
+
+ <bezel element="disk_white"><bounds x="72" y="54" width="6" height="6" /></bezel>
+ <bezel name="0.0" element="led"><bounds x="73" y="55" width="4" height="4" /></bezel>
+
+ <bezel element="disk_white"><bounds x="35" y="47" width="6" height="6" /></bezel>
+ <bezel name="11.0" element="led"><bounds x="36" y="48" width="4" height="4" /></bezel>
+
+ <bezel element="disk_white"><bounds x="109" y="47" width="6" height="6" /></bezel>
+ <bezel name="1.0" element="led"><bounds x="110" y="48" width="4" height="4" /></bezel>
+
+ <bezel element="disk_white"><bounds x="55" y="74" width="6" height="6" /></bezel>
+ <bezel name="10.0" element="led"><bounds x="56" y="75" width="4" height="4" /></bezel>
+ <bezel element="text_home"><bounds x="52" y="80.5" width="12" height="3" /></bezel>
+
+ <bezel element="disk_white"><bounds x="89" y="74" width="6" height="6" /></bezel>
+ <bezel name="2.0" element="led"><bounds x="90" y="75" width="4" height="4" /></bezel>
+ <bezel element="text_away"><bounds x="86" y="80.5" width="12" height="3" /></bezel>
+
+ <!-- defense leds -->
+
+ <repeat count="41">
+ <param name="x" start="45.1" increment="0.05" />
+ <param name="y" start="39.6" increment="0.048" />
+ <bezel name="8.0" element="led"><bounds x="~x~" y="~y~" width="1" height="1" /></bezel>
+ </repeat>
+
+ <repeat count="41">
+ <param name="x" start="103.7" increment="-0.05" />
+ <param name="y" start="39.6" increment="0.048" />
+ <bezel name="8.4" element="led"><bounds x="~x~" y="~y~" width="1" height="1" /></bezel>
+ </repeat>
+
+ <repeat count="60">
+ <param name="x" start="73" increment="0.05" />
+ <param name="y" start="46.5" increment="0.0" />
+ <bezel name="8.2" element="led"><bounds x="~x~" y="~y~" width="1" height="1" /></bezel>
+ </repeat>
+
+ <repeat count="56">
+ <param name="x" start="55.8" increment="-0.011" />
+ <param name="y" start="51.7" increment="0.05" />
+ <bezel name="8.1" element="led"><bounds x="~x~" y="~y~" width="1" height="1" /></bezel>
+ </repeat>
+
+ <repeat count="56">
+ <param name="x" start="93.3" increment="0.011" />
+ <param name="y" start="51.7" increment="0.05" />
+ <bezel name="8.3" element="led"><bounds x="~x~" y="~y~" width="1" height="1" /></bezel>
+ </repeat>
+
+ <!-- small leds -->
+
+ <!-- the leds marked "x", sometimes seen unpopulated, maybe cutting costs in some of the production batches -->
+ <bezel name="3.1" element="led"><bounds x="57.1" y="29.1" width="1" height="1" /></bezel>
+ <bezel name="3.2" element="led"><bounds x="52.7" y="33.7" width="1" height="1" /></bezel>
+ <bezel name="3.3" element="led"><bounds x="48.3" y="38.3" width="1" height="1" /></bezel> <!-- x -->
+ <bezel name="3.4" element="led"><bounds x="43.9" y="42.9" width="1" height="1" /></bezel>
+
+ <bezel name="4.1" element="led"><bounds x="74.5" y="34" width="1" height="1" /></bezel>
+ <bezel name="4.2" element="led"><bounds x="74.5" y="39" width="1" height="1" /></bezel>
+ <bezel name="4.3" element="led"><bounds x="74.5" y="44" width="1" height="1" /></bezel> <!-- x -->
+ <bezel name="4.4" element="led"><bounds x="74.5" y="49" width="1" height="1" /></bezel>
+
+ <bezel name="5.1" element="led"><bounds x="91.9" y="29.1" width="1" height="1" /></bezel>
+ <bezel name="5.2" element="led"><bounds x="96.3" y="33.7" width="1" height="1" /></bezel>
+ <bezel name="5.3" element="led"><bounds x="100.7" y="38.3" width="1" height="1" /></bezel> <!-- x -->
+ <bezel name="5.4" element="led"><bounds x="105.1" y="42.9" width="1" height="1" /></bezel>
+
+ <bezel name="11.1" element="led"><bounds x="45.6" y="50.9" width="1" height="1" /></bezel>
+ <bezel name="11.2" element="led"><bounds x="52.2" y="52.3" width="1" height="1" /></bezel>
+ <bezel name="11.3" element="led"><bounds x="58.8" y="53.7" width="1" height="1" /></bezel> <!-- x -->
+ <bezel name="11.4" element="led"><bounds x="65.4" y="55.1" width="1" height="1" /></bezel>
+
+ <bezel name="0.4" element="led"><bounds x="103.4" y="50.9" width="1" height="1" /></bezel>
+ <bezel name="0.3" element="led"><bounds x="96.8" y="52.3" width="1" height="1" /></bezel>
+ <bezel name="0.2" element="led"><bounds x="90.2" y="53.7" width="1" height="1" /></bezel> <!-- x -->
+ <bezel name="0.1" element="led"><bounds x="83.6" y="55.1" width="1" height="1" /></bezel>
+
+ <bezel name="10.4" element="led"><bounds x="42.7" y="56.1" width="1" height="1" /></bezel>
+ <bezel name="10.3" element="led"><bounds x="45.9" y="60.7" width="1" height="1" /></bezel>
+ <bezel name="10.2" element="led"><bounds x="49.1" y="65.3" width="1" height="1" /></bezel> <!-- x -->
+ <bezel name="10.1" element="led"><bounds x="52.3" y="69.9" width="1" height="1" /></bezel>
+
+ <bezel name="2.4" element="led"><bounds x="65.5" y="76.5" width="1" height="1" /></bezel>
+ <bezel name="2.3" element="led"><bounds x="71.5" y="76.5" width="1" height="1" /></bezel>
+ <bezel name="2.2" element="led"><bounds x="77.5" y="76.5" width="1" height="1" /></bezel>
+ <bezel name="2.1" element="led"><bounds x="83.5" y="76.5" width="1" height="1" /></bezel>
+
+ <bezel name="1.1" element="led"><bounds x="107.3" y="56.1" width="1" height="1" /></bezel>
+ <bezel name="1.2" element="led"><bounds x="104.1" y="60.7" width="1" height="1" /></bezel>
+ <bezel name="1.3" element="led"><bounds x="100.9" y="65.3" width="1" height="1" /></bezel> <!-- x -->
+ <bezel name="1.4" element="led"><bounds x="97.7" y="69.9" width="1" height="1" /></bezel>
+
+ </view>
+</mamelayout>
diff --git a/src/mame/layout/h2hbaskbc.lay b/src/mame/layout/h2hbaskbc.lay
index a4d2c9e019c..6be40424189 100644
--- a/src/mame/layout/h2hbaskbc.lay
+++ b/src/mame/layout/h2hbaskbc.lay
@@ -17,10 +17,6 @@
<disk state="0"><color red="0.14" green="0.02" blue="0.03" /></disk>
<disk state="1"><color red="1.0" green="0.20" blue="0.22" /></disk>
</element>
- <element name="ledr" defstate="0">
- <rect state="0"><color red="0.14" green="0.02" blue="0.03" /></rect>
- <rect state="1"><color red="1.0" green="0.20" blue="0.22" /></rect>
- </element>
<element name="text_home"><text string="HOME"><color red="0.85" green="0.85" blue="0.85" /></text></element>
<element name="text_away"><text string="AWAY"><color red="0.85" green="0.85" blue="0.85" /></text></element>
@@ -88,41 +84,69 @@
<bezel name="10.0" element="led"><bounds x="90" y="75" width="4" height="4" /></bezel>
<bezel element="text_away"><bounds x="86" y="80.5" width="12" height="3" /></bezel>
+ <!-- defense leds -->
+
+ <repeat count="41">
+ <param name="x" start="45.1" increment="0.05" />
+ <param name="y" start="39.6" increment="0.048" />
+ <bezel name="2.0" element="led"><bounds x="~x~" y="~y~" width="1" height="1" /></bezel>
+ </repeat>
+
+ <repeat count="41">
+ <param name="x" start="103.7" increment="-0.05" />
+ <param name="y" start="39.6" increment="0.048" />
+ <bezel name="2.4" element="led"><bounds x="~x~" y="~y~" width="1" height="1" /></bezel>
+ </repeat>
+
+ <repeat count="60">
+ <param name="x" start="73" increment="0.05" />
+ <param name="y" start="46.5" increment="0.0" />
+ <bezel name="2.2" element="led"><bounds x="~x~" y="~y~" width="1" height="1" /></bezel>
+ </repeat>
+
+ <repeat count="56">
+ <param name="x" start="55.8" increment="-0.011" />
+ <param name="y" start="51.7" increment="0.05" />
+ <bezel name="2.1" element="led"><bounds x="~x~" y="~y~" width="1" height="1" /></bezel>
+ </repeat>
+
+ <repeat count="56">
+ <param name="x" start="93.3" increment="0.011" />
+ <param name="y" start="51.7" increment="0.05" />
+ <bezel name="2.3" element="led"><bounds x="~x~" y="~y~" width="1" height="1" /></bezel>
+ </repeat>
+
<!-- small leds -->
+ <!-- the leds marked "x", sometimes seen unpopulated, maybe cutting costs in some of the production batches -->
<bezel name="11.1" element="led"><bounds x="57.1" y="29.1" width="1" height="1" /></bezel>
<bezel name="11.2" element="led"><bounds x="52.7" y="33.7" width="1" height="1" /></bezel>
- <bezel name="11.3" element="led"><bounds x="48.3" y="38.3" width="1" height="1" /></bezel> <!-- unpopulated, but is used -->
- <bezel name="2.0" element="ledr"><bounds x="44.6" y="40.6" width="4" height="1" /></bezel>
+ <bezel name="11.3" element="led"><bounds x="48.3" y="38.3" width="1" height="1" /></bezel> <!-- x -->
<bezel name="11.4" element="led"><bounds x="43.9" y="42.9" width="1" height="1" /></bezel>
<bezel name="12.1" element="led"><bounds x="74.5" y="34" width="1" height="1" /></bezel>
<bezel name="12.2" element="led"><bounds x="74.5" y="39" width="1" height="1" /></bezel>
- <bezel name="12.3" element="led"><bounds x="74.5" y="44" width="1" height="1" /></bezel> <!-- unpopulated, but is used -->
- <bezel name="2.2" element="ledr"><bounds x="73" y="46.5" width="4" height="1" /></bezel>
+ <bezel name="12.3" element="led"><bounds x="74.5" y="44" width="1" height="1" /></bezel> <!-- x -->
<bezel name="12.4" element="led"><bounds x="74.5" y="49" width="1" height="1" /></bezel>
<bezel name="13.1" element="led"><bounds x="91.9" y="29.1" width="1" height="1" /></bezel>
<bezel name="13.2" element="led"><bounds x="96.3" y="33.7" width="1" height="1" /></bezel>
- <bezel name="13.3" element="led"><bounds x="100.7" y="38.3" width="1" height="1" /></bezel> <!-- unpopulated, but is used -->
- <bezel name="2.4" element="ledr"><bounds x="101.4" y="40.6" width="4" height="1" /></bezel>
+ <bezel name="13.3" element="led"><bounds x="100.7" y="38.3" width="1" height="1" /></bezel> <!-- x -->
<bezel name="13.4" element="led"><bounds x="105.1" y="42.9" width="1" height="1" /></bezel>
<bezel name="5.1" element="led"><bounds x="45.6" y="50.9" width="1" height="1" /></bezel>
<bezel name="5.2" element="led"><bounds x="52.2" y="52.3" width="1" height="1" /></bezel>
- <bezel name="2.1" element="ledr"><bounds x="55.5" y="51.5" width="1" height="4" /></bezel>
- <bezel name="5.3" element="led"><bounds x="58.8" y="53.7" width="1" height="1" /></bezel> <!-- unpopulated, but is used -->
+ <bezel name="5.3" element="led"><bounds x="58.8" y="53.7" width="1" height="1" /></bezel> <!-- x -->
<bezel name="5.4" element="led"><bounds x="65.4" y="55.1" width="1" height="1" /></bezel>
<bezel name="8.4" element="led"><bounds x="103.4" y="50.9" width="1" height="1" /></bezel>
<bezel name="8.3" element="led"><bounds x="96.8" y="52.3" width="1" height="1" /></bezel>
- <bezel name="2.3" element="ledr"><bounds x="93.5" y="51.5" width="1" height="4" /></bezel>
- <bezel name="8.2" element="led"><bounds x="90.2" y="53.7" width="1" height="1" /></bezel> <!-- unpopulated, but is used -->
+ <bezel name="8.2" element="led"><bounds x="90.2" y="53.7" width="1" height="1" /></bezel> <!-- x -->
<bezel name="8.1" element="led"><bounds x="83.6" y="55.1" width="1" height="1" /></bezel>
<bezel name="4.4" element="led"><bounds x="42.7" y="56.1" width="1" height="1" /></bezel>
<bezel name="4.3" element="led"><bounds x="45.9" y="60.7" width="1" height="1" /></bezel>
- <bezel name="4.2" element="led"><bounds x="49.1" y="65.3" width="1" height="1" /></bezel>
+ <bezel name="4.2" element="led"><bounds x="49.1" y="65.3" width="1" height="1" /></bezel> <!-- x -->
<bezel name="4.1" element="led"><bounds x="52.3" y="69.9" width="1" height="1" /></bezel>
<bezel name="10.4" element="led"><bounds x="65.5" y="76.5" width="1" height="1" /></bezel>
@@ -132,7 +156,7 @@
<bezel name="9.1" element="led"><bounds x="107.3" y="56.1" width="1" height="1" /></bezel>
<bezel name="9.2" element="led"><bounds x="104.1" y="60.7" width="1" height="1" /></bezel>
- <bezel name="9.3" element="led"><bounds x="100.9" y="65.3" width="1" height="1" /></bezel>
+ <bezel name="9.3" element="led"><bounds x="100.9" y="65.3" width="1" height="1" /></bezel> <!-- x -->
<bezel name="9.4" element="led"><bounds x="97.7" y="69.9" width="1" height="1" /></bezel>
</view>
diff --git a/src/mame/layout/h2hhockey.lay b/src/mame/layout/h2hhockey.lay
index ac67e33f840..fb96bcca50b 100644
--- a/src/mame/layout/h2hhockey.lay
+++ b/src/mame/layout/h2hhockey.lay
@@ -17,10 +17,6 @@
<disk state="0"><color red="0.14" green="0.02" blue="0.03" /></disk>
<disk state="1"><color red="1.0" green="0.20" blue="0.22" /></disk>
</element>
- <element name="ledr" defstate="0">
- <rect state="0"><color red="0.14" green="0.02" blue="0.03" /></rect>
- <rect state="1"><color red="1.0" green="0.20" blue="0.22" /></rect>
- </element>
<element name="text_score1"><text string="S C"><color red="0.85" green="0.85" blue="0.85" /></text></element>
<element name="text_score2"><text string="R E"><color red="0.85" green="0.85" blue="0.85" /></text></element>
@@ -78,41 +74,69 @@
<bezel name="2.0" element="led"><bounds x="90" y="75" width="4" height="4" /></bezel>
<bezel element="text_away"><bounds x="86" y="80.5" width="12" height="3" /></bezel>
+ <!-- defense leds -->
+
+ <repeat count="41">
+ <param name="x" start="45.1" increment="0.05" />
+ <param name="y" start="39.6" increment="0.048" />
+ <bezel name="8.0" element="led"><bounds x="~x~" y="~y~" width="1" height="1" /></bezel>
+ </repeat>
+
+ <repeat count="41">
+ <param name="x" start="103.7" increment="-0.05" />
+ <param name="y" start="39.6" increment="0.048" />
+ <bezel name="8.4" element="led"><bounds x="~x~" y="~y~" width="1" height="1" /></bezel>
+ </repeat>
+
+ <repeat count="60">
+ <param name="x" start="73" increment="0.05" />
+ <param name="y" start="46.5" increment="0.0" />
+ <bezel name="8.2" element="led"><bounds x="~x~" y="~y~" width="1" height="1" /></bezel>
+ </repeat>
+
+ <repeat count="56">
+ <param name="x" start="55.8" increment="-0.011" />
+ <param name="y" start="51.7" increment="0.05" />
+ <bezel name="8.1" element="led"><bounds x="~x~" y="~y~" width="1" height="1" /></bezel>
+ </repeat>
+
+ <repeat count="56">
+ <param name="x" start="93.3" increment="0.011" />
+ <param name="y" start="51.7" increment="0.05" />
+ <bezel name="8.3" element="led"><bounds x="~x~" y="~y~" width="1" height="1" /></bezel>
+ </repeat>
+
<!-- small leds -->
+ <!-- the leds marked "x", sometimes seen unpopulated, maybe cutting costs in some of the production batches -->
<bezel name="3.1" element="led"><bounds x="57.1" y="29.1" width="1" height="1" /></bezel>
<bezel name="3.2" element="led"><bounds x="52.7" y="33.7" width="1" height="1" /></bezel>
- <bezel name="3.3" element="led"><bounds x="48.3" y="38.3" width="1" height="1" /></bezel>
- <bezel name="8.0" element="ledr"><bounds x="44.6" y="40.6" width="4" height="1" /></bezel>
+ <bezel name="3.3" element="led"><bounds x="48.3" y="38.3" width="1" height="1" /></bezel> <!-- x -->
<bezel name="3.4" element="led"><bounds x="43.9" y="42.9" width="1" height="1" /></bezel>
<bezel name="4.1" element="led"><bounds x="74.5" y="34" width="1" height="1" /></bezel>
<bezel name="4.2" element="led"><bounds x="74.5" y="39" width="1" height="1" /></bezel>
- <bezel name="4.3" element="led"><bounds x="74.5" y="44" width="1" height="1" /></bezel>
- <bezel name="8.2" element="ledr"><bounds x="73" y="46.5" width="4" height="1" /></bezel>
+ <bezel name="4.3" element="led"><bounds x="74.5" y="44" width="1" height="1" /></bezel> <!-- x -->
<bezel name="4.4" element="led"><bounds x="74.5" y="49" width="1" height="1" /></bezel>
<bezel name="5.1" element="led"><bounds x="91.9" y="29.1" width="1" height="1" /></bezel>
<bezel name="5.2" element="led"><bounds x="96.3" y="33.7" width="1" height="1" /></bezel>
- <bezel name="5.3" element="led"><bounds x="100.7" y="38.3" width="1" height="1" /></bezel>
- <bezel name="8.4" element="ledr"><bounds x="101.4" y="40.6" width="4" height="1" /></bezel>
+ <bezel name="5.3" element="led"><bounds x="100.7" y="38.3" width="1" height="1" /></bezel> <!-- x -->
<bezel name="5.4" element="led"><bounds x="105.1" y="42.9" width="1" height="1" /></bezel>
<bezel name="11.1" element="led"><bounds x="45.6" y="50.9" width="1" height="1" /></bezel>
<bezel name="11.2" element="led"><bounds x="52.2" y="52.3" width="1" height="1" /></bezel>
- <bezel name="8.1" element="ledr"><bounds x="55.5" y="51.5" width="1" height="4" /></bezel>
- <bezel name="11.3" element="led"><bounds x="58.8" y="53.7" width="1" height="1" /></bezel>
+ <bezel name="11.3" element="led"><bounds x="58.8" y="53.7" width="1" height="1" /></bezel> <!-- x -->
<bezel name="11.4" element="led"><bounds x="65.4" y="55.1" width="1" height="1" /></bezel>
<bezel name="0.4" element="led"><bounds x="103.4" y="50.9" width="1" height="1" /></bezel>
<bezel name="0.3" element="led"><bounds x="96.8" y="52.3" width="1" height="1" /></bezel>
- <bezel name="8.3" element="ledr"><bounds x="93.5" y="51.5" width="1" height="4" /></bezel>
- <bezel name="0.2" element="led"><bounds x="90.2" y="53.7" width="1" height="1" /></bezel>
+ <bezel name="0.2" element="led"><bounds x="90.2" y="53.7" width="1" height="1" /></bezel> <!-- x -->
<bezel name="0.1" element="led"><bounds x="83.6" y="55.1" width="1" height="1" /></bezel>
<bezel name="10.4" element="led"><bounds x="42.7" y="56.1" width="1" height="1" /></bezel>
<bezel name="10.3" element="led"><bounds x="45.9" y="60.7" width="1" height="1" /></bezel>
- <bezel name="10.2" element="led"><bounds x="49.1" y="65.3" width="1" height="1" /></bezel>
+ <bezel name="10.2" element="led"><bounds x="49.1" y="65.3" width="1" height="1" /></bezel> <!-- x -->
<bezel name="10.1" element="led"><bounds x="52.3" y="69.9" width="1" height="1" /></bezel>
<bezel name="2.4" element="led"><bounds x="65.5" y="76.5" width="1" height="1" /></bezel>
@@ -122,7 +146,7 @@
<bezel name="1.1" element="led"><bounds x="107.3" y="56.1" width="1" height="1" /></bezel>
<bezel name="1.2" element="led"><bounds x="104.1" y="60.7" width="1" height="1" /></bezel>
- <bezel name="1.3" element="led"><bounds x="100.9" y="65.3" width="1" height="1" /></bezel>
+ <bezel name="1.3" element="led"><bounds x="100.9" y="65.3" width="1" height="1" /></bezel> <!-- x -->
<bezel name="1.4" element="led"><bounds x="97.7" y="69.9" width="1" height="1" /></bezel>
</view>
diff --git a/src/mame/layout/h2hhockeyc.lay b/src/mame/layout/h2hhockeyc.lay
index ab54c6e4cf2..f9121fd0979 100644
--- a/src/mame/layout/h2hhockeyc.lay
+++ b/src/mame/layout/h2hhockeyc.lay
@@ -17,10 +17,6 @@
<disk state="0"><color red="0.14" green="0.02" blue="0.03" /></disk>
<disk state="1"><color red="1.0" green="0.20" blue="0.22" /></disk>
</element>
- <element name="ledr" defstate="0">
- <rect state="0"><color red="0.14" green="0.02" blue="0.03" /></rect>
- <rect state="1"><color red="1.0" green="0.20" blue="0.22" /></rect>
- </element>
<element name="text_score1"><text string="S C"><color red="0.85" green="0.85" blue="0.85" /></text></element>
<element name="text_score2"><text string="R E"><color red="0.85" green="0.85" blue="0.85" /></text></element>
@@ -78,41 +74,69 @@
<bezel name="10.0" element="led"><bounds x="90" y="75" width="4" height="4" /></bezel>
<bezel element="text_away"><bounds x="86" y="80.5" width="12" height="3" /></bezel>
+ <!-- defense leds -->
+
+ <repeat count="41">
+ <param name="x" start="45.1" increment="0.05" />
+ <param name="y" start="39.6" increment="0.048" />
+ <bezel name="2.0" element="led"><bounds x="~x~" y="~y~" width="1" height="1" /></bezel>
+ </repeat>
+
+ <repeat count="41">
+ <param name="x" start="103.7" increment="-0.05" />
+ <param name="y" start="39.6" increment="0.048" />
+ <bezel name="2.4" element="led"><bounds x="~x~" y="~y~" width="1" height="1" /></bezel>
+ </repeat>
+
+ <repeat count="60">
+ <param name="x" start="73" increment="0.05" />
+ <param name="y" start="46.5" increment="0.0" />
+ <bezel name="2.2" element="led"><bounds x="~x~" y="~y~" width="1" height="1" /></bezel>
+ </repeat>
+
+ <repeat count="56">
+ <param name="x" start="55.8" increment="-0.011" />
+ <param name="y" start="51.7" increment="0.05" />
+ <bezel name="2.1" element="led"><bounds x="~x~" y="~y~" width="1" height="1" /></bezel>
+ </repeat>
+
+ <repeat count="56">
+ <param name="x" start="93.3" increment="0.011" />
+ <param name="y" start="51.7" increment="0.05" />
+ <bezel name="2.3" element="led"><bounds x="~x~" y="~y~" width="1" height="1" /></bezel>
+ </repeat>
+
<!-- small leds -->
+ <!-- the leds marked "x", sometimes seen unpopulated, maybe cutting costs in some of the production batches -->
<bezel name="11.1" element="led"><bounds x="57.1" y="29.1" width="1" height="1" /></bezel>
<bezel name="11.2" element="led"><bounds x="52.7" y="33.7" width="1" height="1" /></bezel>
- <bezel name="11.3" element="led"><bounds x="48.3" y="38.3" width="1" height="1" /></bezel> <!-- unpopulated, but is used -->
- <bezel name="2.0" element="ledr"><bounds x="44.6" y="40.6" width="4" height="1" /></bezel>
+ <bezel name="11.3" element="led"><bounds x="48.3" y="38.3" width="1" height="1" /></bezel> <!-- x -->
<bezel name="11.4" element="led"><bounds x="43.9" y="42.9" width="1" height="1" /></bezel>
<bezel name="12.1" element="led"><bounds x="74.5" y="34" width="1" height="1" /></bezel>
<bezel name="12.2" element="led"><bounds x="74.5" y="39" width="1" height="1" /></bezel>
- <bezel name="12.3" element="led"><bounds x="74.5" y="44" width="1" height="1" /></bezel> <!-- unpopulated, but is used -->
- <bezel name="2.2" element="ledr"><bounds x="73" y="46.5" width="4" height="1" /></bezel>
+ <bezel name="12.3" element="led"><bounds x="74.5" y="44" width="1" height="1" /></bezel> <!-- x -->
<bezel name="12.4" element="led"><bounds x="74.5" y="49" width="1" height="1" /></bezel>
<bezel name="13.1" element="led"><bounds x="91.9" y="29.1" width="1" height="1" /></bezel>
<bezel name="13.2" element="led"><bounds x="96.3" y="33.7" width="1" height="1" /></bezel>
- <bezel name="13.3" element="led"><bounds x="100.7" y="38.3" width="1" height="1" /></bezel> <!-- unpopulated, but is used -->
- <bezel name="2.4" element="ledr"><bounds x="101.4" y="40.6" width="4" height="1" /></bezel>
+ <bezel name="13.3" element="led"><bounds x="100.7" y="38.3" width="1" height="1" /></bezel> <!-- x -->
<bezel name="13.4" element="led"><bounds x="105.1" y="42.9" width="1" height="1" /></bezel>
<bezel name="5.1" element="led"><bounds x="45.6" y="50.9" width="1" height="1" /></bezel>
<bezel name="5.2" element="led"><bounds x="52.2" y="52.3" width="1" height="1" /></bezel>
- <bezel name="2.1" element="ledr"><bounds x="55.5" y="51.5" width="1" height="4" /></bezel>
- <bezel name="5.3" element="led"><bounds x="58.8" y="53.7" width="1" height="1" /></bezel> <!-- unpopulated, but is used -->
+ <bezel name="5.3" element="led"><bounds x="58.8" y="53.7" width="1" height="1" /></bezel> <!-- x -->
<bezel name="5.4" element="led"><bounds x="65.4" y="55.1" width="1" height="1" /></bezel>
<bezel name="8.4" element="led"><bounds x="103.4" y="50.9" width="1" height="1" /></bezel>
<bezel name="8.3" element="led"><bounds x="96.8" y="52.3" width="1" height="1" /></bezel>
- <bezel name="2.3" element="ledr"><bounds x="93.5" y="51.5" width="1" height="4" /></bezel>
- <bezel name="8.2" element="led"><bounds x="90.2" y="53.7" width="1" height="1" /></bezel> <!-- unpopulated, but is used -->
+ <bezel name="8.2" element="led"><bounds x="90.2" y="53.7" width="1" height="1" /></bezel> <!-- x -->
<bezel name="8.1" element="led"><bounds x="83.6" y="55.1" width="1" height="1" /></bezel>
<bezel name="4.4" element="led"><bounds x="42.7" y="56.1" width="1" height="1" /></bezel>
<bezel name="4.3" element="led"><bounds x="45.9" y="60.7" width="1" height="1" /></bezel>
- <bezel name="4.2" element="led"><bounds x="49.1" y="65.3" width="1" height="1" /></bezel>
+ <bezel name="4.2" element="led"><bounds x="49.1" y="65.3" width="1" height="1" /></bezel> <!-- x -->
<bezel name="4.1" element="led"><bounds x="52.3" y="69.9" width="1" height="1" /></bezel>
<bezel name="10.4" element="led"><bounds x="65.5" y="76.5" width="1" height="1" /></bezel>
@@ -122,7 +146,7 @@
<bezel name="9.1" element="led"><bounds x="107.3" y="56.1" width="1" height="1" /></bezel>
<bezel name="9.2" element="led"><bounds x="104.1" y="60.7" width="1" height="1" /></bezel>
- <bezel name="9.3" element="led"><bounds x="100.9" y="65.3" width="1" height="1" /></bezel>
+ <bezel name="9.3" element="led"><bounds x="100.9" y="65.3" width="1" height="1" /></bezel> <!-- x -->
<bezel name="9.4" element="led"><bounds x="97.7" y="69.9" width="1" height="1" /></bezel>
</view>
diff --git a/src/mame/layout/h2hsoccerc.lay b/src/mame/layout/h2hsoccerc.lay
index 569eb129d59..30cd9394ca5 100644
--- a/src/mame/layout/h2hsoccerc.lay
+++ b/src/mame/layout/h2hsoccerc.lay
@@ -17,10 +17,6 @@
<disk state="0"><color red="0.14" green="0.02" blue="0.03" /></disk>
<disk state="1"><color red="1.0" green="0.20" blue="0.22" /></disk>
</element>
- <element name="ledr" defstate="0">
- <rect state="0"><color red="0.14" green="0.02" blue="0.03" /></rect>
- <rect state="1"><color red="1.0" green="0.20" blue="0.22" /></rect>
- </element>
<element name="text_score1"><text string="S C"><color red="0.85" green="0.85" blue="0.85" /></text></element>
<element name="text_score2"><text string="R E"><color red="0.85" green="0.85" blue="0.85" /></text></element>
@@ -82,41 +78,69 @@
<bezel name="10.0" element="led"><bounds x="90" y="75" width="4" height="4" /></bezel>
<bezel element="text_away"><bounds x="86" y="80.5" width="12" height="3" /></bezel>
+ <!-- defense leds -->
+
+ <repeat count="41">
+ <param name="x" start="45.1" increment="0.05" />
+ <param name="y" start="39.6" increment="0.048" />
+ <bezel name="2.0" element="led"><bounds x="~x~" y="~y~" width="1" height="1" /></bezel>
+ </repeat>
+
+ <repeat count="41">
+ <param name="x" start="103.7" increment="-0.05" />
+ <param name="y" start="39.6" increment="0.048" />
+ <bezel name="2.4" element="led"><bounds x="~x~" y="~y~" width="1" height="1" /></bezel>
+ </repeat>
+
+ <repeat count="60">
+ <param name="x" start="73" increment="0.05" />
+ <param name="y" start="46.5" increment="0.0" />
+ <bezel name="2.2" element="led"><bounds x="~x~" y="~y~" width="1" height="1" /></bezel>
+ </repeat>
+
+ <repeat count="56">
+ <param name="x" start="55.8" increment="-0.011" />
+ <param name="y" start="51.7" increment="0.05" />
+ <bezel name="2.1" element="led"><bounds x="~x~" y="~y~" width="1" height="1" /></bezel>
+ </repeat>
+
+ <repeat count="56">
+ <param name="x" start="93.3" increment="0.011" />
+ <param name="y" start="51.7" increment="0.05" />
+ <bezel name="2.3" element="led"><bounds x="~x~" y="~y~" width="1" height="1" /></bezel>
+ </repeat>
+
<!-- small leds -->
+ <!-- the leds marked "x", sometimes seen unpopulated, maybe cutting costs in some of the production batches -->
<bezel name="11.1" element="led"><bounds x="57.1" y="29.1" width="1" height="1" /></bezel>
<bezel name="11.2" element="led"><bounds x="52.7" y="33.7" width="1" height="1" /></bezel>
- <bezel name="11.3" element="led"><bounds x="48.3" y="38.3" width="1" height="1" /></bezel> <!-- unpopulated, but is used -->
- <bezel name="2.0" element="ledr"><bounds x="44.6" y="40.6" width="4" height="1" /></bezel>
+ <bezel name="11.3" element="led"><bounds x="48.3" y="38.3" width="1" height="1" /></bezel> <!-- x -->
<bezel name="11.4" element="led"><bounds x="43.9" y="42.9" width="1" height="1" /></bezel>
<bezel name="12.1" element="led"><bounds x="74.5" y="34" width="1" height="1" /></bezel>
<bezel name="12.2" element="led"><bounds x="74.5" y="39" width="1" height="1" /></bezel>
- <bezel name="12.3" element="led"><bounds x="74.5" y="44" width="1" height="1" /></bezel> <!-- unpopulated, but is used -->
- <bezel name="2.2" element="ledr"><bounds x="73" y="46.5" width="4" height="1" /></bezel>
+ <bezel name="12.3" element="led"><bounds x="74.5" y="44" width="1" height="1" /></bezel> <!-- x -->
<bezel name="12.4" element="led"><bounds x="74.5" y="49" width="1" height="1" /></bezel>
<bezel name="13.1" element="led"><bounds x="91.9" y="29.1" width="1" height="1" /></bezel>
<bezel name="13.2" element="led"><bounds x="96.3" y="33.7" width="1" height="1" /></bezel>
- <bezel name="13.3" element="led"><bounds x="100.7" y="38.3" width="1" height="1" /></bezel> <!-- unpopulated, but is used -->
- <bezel name="2.4" element="ledr"><bounds x="101.4" y="40.6" width="4" height="1" /></bezel>
+ <bezel name="13.3" element="led"><bounds x="100.7" y="38.3" width="1" height="1" /></bezel> <!-- x -->
<bezel name="13.4" element="led"><bounds x="105.1" y="42.9" width="1" height="1" /></bezel>
<bezel name="5.1" element="led"><bounds x="45.6" y="50.9" width="1" height="1" /></bezel>
<bezel name="5.2" element="led"><bounds x="52.2" y="52.3" width="1" height="1" /></bezel>
- <bezel name="2.1" element="ledr"><bounds x="55.5" y="51.5" width="1" height="4" /></bezel>
- <bezel name="5.3" element="led"><bounds x="58.8" y="53.7" width="1" height="1" /></bezel> <!-- unpopulated, but is used -->
+ <bezel name="5.3" element="led"><bounds x="58.8" y="53.7" width="1" height="1" /></bezel> <!-- x -->
<bezel name="5.4" element="led"><bounds x="65.4" y="55.1" width="1" height="1" /></bezel>
<bezel name="8.4" element="led"><bounds x="103.4" y="50.9" width="1" height="1" /></bezel>
<bezel name="8.3" element="led"><bounds x="96.8" y="52.3" width="1" height="1" /></bezel>
- <bezel name="2.3" element="ledr"><bounds x="93.5" y="51.5" width="1" height="4" /></bezel>
- <bezel name="8.2" element="led"><bounds x="90.2" y="53.7" width="1" height="1" /></bezel> <!-- unpopulated, but is used -->
+ <bezel name="8.2" element="led"><bounds x="90.2" y="53.7" width="1" height="1" /></bezel> <!-- x -->
<bezel name="8.1" element="led"><bounds x="83.6" y="55.1" width="1" height="1" /></bezel>
<bezel name="4.4" element="led"><bounds x="42.7" y="56.1" width="1" height="1" /></bezel>
<bezel name="4.3" element="led"><bounds x="45.9" y="60.7" width="1" height="1" /></bezel>
- <bezel name="4.2" element="led"><bounds x="49.1" y="65.3" width="1" height="1" /></bezel>
+ <bezel name="4.2" element="led"><bounds x="49.1" y="65.3" width="1" height="1" /></bezel> <!-- x -->
<bezel name="4.1" element="led"><bounds x="52.3" y="69.9" width="1" height="1" /></bezel>
<bezel name="10.4" element="led"><bounds x="65.5" y="76.5" width="1" height="1" /></bezel>
@@ -126,7 +150,7 @@
<bezel name="9.1" element="led"><bounds x="107.3" y="56.1" width="1" height="1" /></bezel>
<bezel name="9.2" element="led"><bounds x="104.1" y="60.7" width="1" height="1" /></bezel>
- <bezel name="9.3" element="led"><bounds x="100.9" y="65.3" width="1" height="1" /></bezel>
+ <bezel name="9.3" element="led"><bounds x="100.9" y="65.3" width="1" height="1" /></bezel> <!-- x -->
<bezel name="9.4" element="led"><bounds x="97.7" y="69.9" width="1" height="1" /></bezel>
</view>
diff --git a/src/mame/layout/hh_amis2k_test.lay b/src/mame/layout/hh_amis2k_test.lay
new file mode 100644
index 00000000000..675ea6960c9
--- /dev/null
+++ b/src/mame/layout/hh_amis2k_test.lay
@@ -0,0 +1,34 @@
+<?xml version="1.0"?>
+<mamelayout version="2">
+
+<!-- define elements -->
+
+ <element name="static_black"><rect><color red="0.0" green="0.0" blue="0.0" /></rect></element>
+
+ <element name="led" defstate="0">
+ <disk state="0"><color red="0.0" green="0.0" blue="0.0" /></disk>
+ <disk state="1"><color red="1.0" green="0.2" blue="0.23" /></disk>
+ </element>
+
+
+<!-- build screen -->
+
+ <view name="Test Layout">
+ <bounds left="0" right="32" top="0" bottom="16" />
+ <bezel element="static_black">
+ <bounds left="0" right="32" top="0" bottom="16" />
+ </bezel>
+
+ <!-- max 16*32 matrix -->
+
+ <repeat count="16">
+ <param name="y" start="0" increment="1" />
+
+ <repeat count="32">
+ <param name="x" start="0" increment="1" />
+ <bezel name="~y~.~x~" element="led"><bounds x="~x~" y="~y~" width="0.5" height="0.5" /></bezel>
+ </repeat>
+ </repeat>
+
+ </view>
+</mamelayout>
diff --git a/src/mame/layout/hh_cop400_test.lay b/src/mame/layout/hh_cop400_test.lay
index faca1bc722e..675ea6960c9 100644
--- a/src/mame/layout/hh_cop400_test.lay
+++ b/src/mame/layout/hh_cop400_test.lay
@@ -14,540 +14,21 @@
<!-- build screen -->
<view name="Test Layout">
- <bounds left="0" right="64" top="0" bottom="64" />
+ <bounds left="0" right="32" top="0" bottom="16" />
<bezel element="static_black">
- <bounds left="0" right="64" top="0" bottom="64" />
+ <bounds left="0" right="32" top="0" bottom="16" />
</bezel>
<!-- max 16*32 matrix -->
- <bezel name="0.0" element="led"><bounds x="0" y="0" width="1" height="1" /></bezel>
- <bezel name="0.1" element="led"><bounds x="0" y="2" width="1" height="1" /></bezel>
- <bezel name="0.2" element="led"><bounds x="0" y="4" width="1" height="1" /></bezel>
- <bezel name="0.3" element="led"><bounds x="0" y="6" width="1" height="1" /></bezel>
- <bezel name="0.4" element="led"><bounds x="0" y="8" width="1" height="1" /></bezel>
- <bezel name="0.5" element="led"><bounds x="0" y="10" width="1" height="1" /></bezel>
- <bezel name="0.6" element="led"><bounds x="0" y="12" width="1" height="1" /></bezel>
- <bezel name="0.7" element="led"><bounds x="0" y="14" width="1" height="1" /></bezel>
- <bezel name="0.8" element="led"><bounds x="0" y="16" width="1" height="1" /></bezel>
- <bezel name="0.9" element="led"><bounds x="0" y="18" width="1" height="1" /></bezel>
- <bezel name="0.10" element="led"><bounds x="0" y="20" width="1" height="1" /></bezel>
- <bezel name="0.11" element="led"><bounds x="0" y="22" width="1" height="1" /></bezel>
- <bezel name="0.12" element="led"><bounds x="0" y="24" width="1" height="1" /></bezel>
- <bezel name="0.13" element="led"><bounds x="0" y="26" width="1" height="1" /></bezel>
- <bezel name="0.14" element="led"><bounds x="0" y="28" width="1" height="1" /></bezel>
- <bezel name="0.15" element="led"><bounds x="0" y="30" width="1" height="1" /></bezel>
- <bezel name="0.16" element="led"><bounds x="0" y="32" width="1" height="1" /></bezel>
- <bezel name="0.17" element="led"><bounds x="0" y="34" width="1" height="1" /></bezel>
- <bezel name="0.18" element="led"><bounds x="0" y="36" width="1" height="1" /></bezel>
- <bezel name="0.19" element="led"><bounds x="0" y="38" width="1" height="1" /></bezel>
- <bezel name="0.20" element="led"><bounds x="0" y="40" width="1" height="1" /></bezel>
- <bezel name="0.21" element="led"><bounds x="0" y="42" width="1" height="1" /></bezel>
- <bezel name="0.22" element="led"><bounds x="0" y="44" width="1" height="1" /></bezel>
- <bezel name="0.23" element="led"><bounds x="0" y="46" width="1" height="1" /></bezel>
- <bezel name="0.24" element="led"><bounds x="0" y="48" width="1" height="1" /></bezel>
- <bezel name="0.25" element="led"><bounds x="0" y="50" width="1" height="1" /></bezel>
- <bezel name="0.26" element="led"><bounds x="0" y="52" width="1" height="1" /></bezel>
- <bezel name="0.27" element="led"><bounds x="0" y="54" width="1" height="1" /></bezel>
- <bezel name="0.28" element="led"><bounds x="0" y="56" width="1" height="1" /></bezel>
- <bezel name="0.29" element="led"><bounds x="0" y="58" width="1" height="1" /></bezel>
- <bezel name="0.30" element="led"><bounds x="0" y="60" width="1" height="1" /></bezel>
- <bezel name="0.31" element="led"><bounds x="0" y="62" width="1" height="1" /></bezel>
+ <repeat count="16">
+ <param name="y" start="0" increment="1" />
- <bezel name="1.0" element="led"><bounds x="2" y="0" width="1" height="1" /></bezel>
- <bezel name="1.1" element="led"><bounds x="2" y="2" width="1" height="1" /></bezel>
- <bezel name="1.2" element="led"><bounds x="2" y="4" width="1" height="1" /></bezel>
- <bezel name="1.3" element="led"><bounds x="2" y="6" width="1" height="1" /></bezel>
- <bezel name="1.4" element="led"><bounds x="2" y="8" width="1" height="1" /></bezel>
- <bezel name="1.5" element="led"><bounds x="2" y="10" width="1" height="1" /></bezel>
- <bezel name="1.6" element="led"><bounds x="2" y="12" width="1" height="1" /></bezel>
- <bezel name="1.7" element="led"><bounds x="2" y="14" width="1" height="1" /></bezel>
- <bezel name="1.8" element="led"><bounds x="2" y="16" width="1" height="1" /></bezel>
- <bezel name="1.9" element="led"><bounds x="2" y="18" width="1" height="1" /></bezel>
- <bezel name="1.10" element="led"><bounds x="2" y="20" width="1" height="1" /></bezel>
- <bezel name="1.11" element="led"><bounds x="2" y="22" width="1" height="1" /></bezel>
- <bezel name="1.12" element="led"><bounds x="2" y="24" width="1" height="1" /></bezel>
- <bezel name="1.13" element="led"><bounds x="2" y="26" width="1" height="1" /></bezel>
- <bezel name="1.14" element="led"><bounds x="2" y="28" width="1" height="1" /></bezel>
- <bezel name="1.15" element="led"><bounds x="2" y="30" width="1" height="1" /></bezel>
- <bezel name="1.16" element="led"><bounds x="2" y="32" width="1" height="1" /></bezel>
- <bezel name="1.17" element="led"><bounds x="2" y="34" width="1" height="1" /></bezel>
- <bezel name="1.18" element="led"><bounds x="2" y="36" width="1" height="1" /></bezel>
- <bezel name="1.19" element="led"><bounds x="2" y="38" width="1" height="1" /></bezel>
- <bezel name="1.20" element="led"><bounds x="2" y="40" width="1" height="1" /></bezel>
- <bezel name="1.21" element="led"><bounds x="2" y="42" width="1" height="1" /></bezel>
- <bezel name="1.22" element="led"><bounds x="2" y="44" width="1" height="1" /></bezel>
- <bezel name="1.23" element="led"><bounds x="2" y="46" width="1" height="1" /></bezel>
- <bezel name="1.24" element="led"><bounds x="2" y="48" width="1" height="1" /></bezel>
- <bezel name="1.25" element="led"><bounds x="2" y="50" width="1" height="1" /></bezel>
- <bezel name="1.26" element="led"><bounds x="2" y="52" width="1" height="1" /></bezel>
- <bezel name="1.27" element="led"><bounds x="2" y="54" width="1" height="1" /></bezel>
- <bezel name="1.28" element="led"><bounds x="2" y="56" width="1" height="1" /></bezel>
- <bezel name="1.29" element="led"><bounds x="2" y="58" width="1" height="1" /></bezel>
- <bezel name="1.30" element="led"><bounds x="2" y="60" width="1" height="1" /></bezel>
- <bezel name="1.31" element="led"><bounds x="2" y="62" width="1" height="1" /></bezel>
-
- <bezel name="2.0" element="led"><bounds x="4" y="0" width="1" height="1" /></bezel>
- <bezel name="2.1" element="led"><bounds x="4" y="2" width="1" height="1" /></bezel>
- <bezel name="2.2" element="led"><bounds x="4" y="4" width="1" height="1" /></bezel>
- <bezel name="2.3" element="led"><bounds x="4" y="6" width="1" height="1" /></bezel>
- <bezel name="2.4" element="led"><bounds x="4" y="8" width="1" height="1" /></bezel>
- <bezel name="2.5" element="led"><bounds x="4" y="10" width="1" height="1" /></bezel>
- <bezel name="2.6" element="led"><bounds x="4" y="12" width="1" height="1" /></bezel>
- <bezel name="2.7" element="led"><bounds x="4" y="14" width="1" height="1" /></bezel>
- <bezel name="2.8" element="led"><bounds x="4" y="16" width="1" height="1" /></bezel>
- <bezel name="2.9" element="led"><bounds x="4" y="18" width="1" height="1" /></bezel>
- <bezel name="2.10" element="led"><bounds x="4" y="20" width="1" height="1" /></bezel>
- <bezel name="2.11" element="led"><bounds x="4" y="22" width="1" height="1" /></bezel>
- <bezel name="2.12" element="led"><bounds x="4" y="24" width="1" height="1" /></bezel>
- <bezel name="2.13" element="led"><bounds x="4" y="26" width="1" height="1" /></bezel>
- <bezel name="2.14" element="led"><bounds x="4" y="28" width="1" height="1" /></bezel>
- <bezel name="2.15" element="led"><bounds x="4" y="30" width="1" height="1" /></bezel>
- <bezel name="2.16" element="led"><bounds x="4" y="32" width="1" height="1" /></bezel>
- <bezel name="2.17" element="led"><bounds x="4" y="34" width="1" height="1" /></bezel>
- <bezel name="2.18" element="led"><bounds x="4" y="36" width="1" height="1" /></bezel>
- <bezel name="2.19" element="led"><bounds x="4" y="38" width="1" height="1" /></bezel>
- <bezel name="2.20" element="led"><bounds x="4" y="40" width="1" height="1" /></bezel>
- <bezel name="2.21" element="led"><bounds x="4" y="42" width="1" height="1" /></bezel>
- <bezel name="2.22" element="led"><bounds x="4" y="44" width="1" height="1" /></bezel>
- <bezel name="2.23" element="led"><bounds x="4" y="46" width="1" height="1" /></bezel>
- <bezel name="2.24" element="led"><bounds x="4" y="48" width="1" height="1" /></bezel>
- <bezel name="2.25" element="led"><bounds x="4" y="50" width="1" height="1" /></bezel>
- <bezel name="2.26" element="led"><bounds x="4" y="52" width="1" height="1" /></bezel>
- <bezel name="2.27" element="led"><bounds x="4" y="54" width="1" height="1" /></bezel>
- <bezel name="2.28" element="led"><bounds x="4" y="56" width="1" height="1" /></bezel>
- <bezel name="2.29" element="led"><bounds x="4" y="58" width="1" height="1" /></bezel>
- <bezel name="2.30" element="led"><bounds x="4" y="60" width="1" height="1" /></bezel>
- <bezel name="2.31" element="led"><bounds x="4" y="62" width="1" height="1" /></bezel>
-
- <bezel name="3.0" element="led"><bounds x="6" y="0" width="1" height="1" /></bezel>
- <bezel name="3.1" element="led"><bounds x="6" y="2" width="1" height="1" /></bezel>
- <bezel name="3.2" element="led"><bounds x="6" y="4" width="1" height="1" /></bezel>
- <bezel name="3.3" element="led"><bounds x="6" y="6" width="1" height="1" /></bezel>
- <bezel name="3.4" element="led"><bounds x="6" y="8" width="1" height="1" /></bezel>
- <bezel name="3.5" element="led"><bounds x="6" y="10" width="1" height="1" /></bezel>
- <bezel name="3.6" element="led"><bounds x="6" y="12" width="1" height="1" /></bezel>
- <bezel name="3.7" element="led"><bounds x="6" y="14" width="1" height="1" /></bezel>
- <bezel name="3.8" element="led"><bounds x="6" y="16" width="1" height="1" /></bezel>
- <bezel name="3.9" element="led"><bounds x="6" y="18" width="1" height="1" /></bezel>
- <bezel name="3.10" element="led"><bounds x="6" y="20" width="1" height="1" /></bezel>
- <bezel name="3.11" element="led"><bounds x="6" y="22" width="1" height="1" /></bezel>
- <bezel name="3.12" element="led"><bounds x="6" y="24" width="1" height="1" /></bezel>
- <bezel name="3.13" element="led"><bounds x="6" y="26" width="1" height="1" /></bezel>
- <bezel name="3.14" element="led"><bounds x="6" y="28" width="1" height="1" /></bezel>
- <bezel name="3.15" element="led"><bounds x="6" y="30" width="1" height="1" /></bezel>
- <bezel name="3.16" element="led"><bounds x="6" y="32" width="1" height="1" /></bezel>
- <bezel name="3.17" element="led"><bounds x="6" y="34" width="1" height="1" /></bezel>
- <bezel name="3.18" element="led"><bounds x="6" y="36" width="1" height="1" /></bezel>
- <bezel name="3.19" element="led"><bounds x="6" y="38" width="1" height="1" /></bezel>
- <bezel name="3.20" element="led"><bounds x="6" y="40" width="1" height="1" /></bezel>
- <bezel name="3.21" element="led"><bounds x="6" y="42" width="1" height="1" /></bezel>
- <bezel name="3.22" element="led"><bounds x="6" y="44" width="1" height="1" /></bezel>
- <bezel name="3.23" element="led"><bounds x="6" y="46" width="1" height="1" /></bezel>
- <bezel name="3.24" element="led"><bounds x="6" y="48" width="1" height="1" /></bezel>
- <bezel name="3.25" element="led"><bounds x="6" y="50" width="1" height="1" /></bezel>
- <bezel name="3.26" element="led"><bounds x="6" y="52" width="1" height="1" /></bezel>
- <bezel name="3.27" element="led"><bounds x="6" y="54" width="1" height="1" /></bezel>
- <bezel name="3.28" element="led"><bounds x="6" y="56" width="1" height="1" /></bezel>
- <bezel name="3.29" element="led"><bounds x="6" y="58" width="1" height="1" /></bezel>
- <bezel name="3.30" element="led"><bounds x="6" y="60" width="1" height="1" /></bezel>
- <bezel name="3.31" element="led"><bounds x="6" y="62" width="1" height="1" /></bezel>
-
- <bezel name="4.0" element="led"><bounds x="8" y="0" width="1" height="1" /></bezel>
- <bezel name="4.1" element="led"><bounds x="8" y="2" width="1" height="1" /></bezel>
- <bezel name="4.2" element="led"><bounds x="8" y="4" width="1" height="1" /></bezel>
- <bezel name="4.3" element="led"><bounds x="8" y="6" width="1" height="1" /></bezel>
- <bezel name="4.4" element="led"><bounds x="8" y="8" width="1" height="1" /></bezel>
- <bezel name="4.5" element="led"><bounds x="8" y="10" width="1" height="1" /></bezel>
- <bezel name="4.6" element="led"><bounds x="8" y="12" width="1" height="1" /></bezel>
- <bezel name="4.7" element="led"><bounds x="8" y="14" width="1" height="1" /></bezel>
- <bezel name="4.8" element="led"><bounds x="8" y="16" width="1" height="1" /></bezel>
- <bezel name="4.9" element="led"><bounds x="8" y="18" width="1" height="1" /></bezel>
- <bezel name="4.10" element="led"><bounds x="8" y="20" width="1" height="1" /></bezel>
- <bezel name="4.11" element="led"><bounds x="8" y="22" width="1" height="1" /></bezel>
- <bezel name="4.12" element="led"><bounds x="8" y="24" width="1" height="1" /></bezel>
- <bezel name="4.13" element="led"><bounds x="8" y="26" width="1" height="1" /></bezel>
- <bezel name="4.14" element="led"><bounds x="8" y="28" width="1" height="1" /></bezel>
- <bezel name="4.15" element="led"><bounds x="8" y="30" width="1" height="1" /></bezel>
- <bezel name="4.16" element="led"><bounds x="8" y="32" width="1" height="1" /></bezel>
- <bezel name="4.17" element="led"><bounds x="8" y="34" width="1" height="1" /></bezel>
- <bezel name="4.18" element="led"><bounds x="8" y="36" width="1" height="1" /></bezel>
- <bezel name="4.19" element="led"><bounds x="8" y="38" width="1" height="1" /></bezel>
- <bezel name="4.20" element="led"><bounds x="8" y="40" width="1" height="1" /></bezel>
- <bezel name="4.21" element="led"><bounds x="8" y="42" width="1" height="1" /></bezel>
- <bezel name="4.22" element="led"><bounds x="8" y="44" width="1" height="1" /></bezel>
- <bezel name="4.23" element="led"><bounds x="8" y="46" width="1" height="1" /></bezel>
- <bezel name="4.24" element="led"><bounds x="8" y="48" width="1" height="1" /></bezel>
- <bezel name="4.25" element="led"><bounds x="8" y="50" width="1" height="1" /></bezel>
- <bezel name="4.26" element="led"><bounds x="8" y="52" width="1" height="1" /></bezel>
- <bezel name="4.27" element="led"><bounds x="8" y="54" width="1" height="1" /></bezel>
- <bezel name="4.28" element="led"><bounds x="8" y="56" width="1" height="1" /></bezel>
- <bezel name="4.29" element="led"><bounds x="8" y="58" width="1" height="1" /></bezel>
- <bezel name="4.30" element="led"><bounds x="8" y="60" width="1" height="1" /></bezel>
- <bezel name="4.31" element="led"><bounds x="8" y="62" width="1" height="1" /></bezel>
-
- <bezel name="5.0" element="led"><bounds x="10" y="0" width="1" height="1" /></bezel>
- <bezel name="5.1" element="led"><bounds x="10" y="2" width="1" height="1" /></bezel>
- <bezel name="5.2" element="led"><bounds x="10" y="4" width="1" height="1" /></bezel>
- <bezel name="5.3" element="led"><bounds x="10" y="6" width="1" height="1" /></bezel>
- <bezel name="5.4" element="led"><bounds x="10" y="8" width="1" height="1" /></bezel>
- <bezel name="5.5" element="led"><bounds x="10" y="10" width="1" height="1" /></bezel>
- <bezel name="5.6" element="led"><bounds x="10" y="12" width="1" height="1" /></bezel>
- <bezel name="5.7" element="led"><bounds x="10" y="14" width="1" height="1" /></bezel>
- <bezel name="5.8" element="led"><bounds x="10" y="16" width="1" height="1" /></bezel>
- <bezel name="5.9" element="led"><bounds x="10" y="18" width="1" height="1" /></bezel>
- <bezel name="5.10" element="led"><bounds x="10" y="20" width="1" height="1" /></bezel>
- <bezel name="5.11" element="led"><bounds x="10" y="22" width="1" height="1" /></bezel>
- <bezel name="5.12" element="led"><bounds x="10" y="24" width="1" height="1" /></bezel>
- <bezel name="5.13" element="led"><bounds x="10" y="26" width="1" height="1" /></bezel>
- <bezel name="5.14" element="led"><bounds x="10" y="28" width="1" height="1" /></bezel>
- <bezel name="5.15" element="led"><bounds x="10" y="30" width="1" height="1" /></bezel>
- <bezel name="5.16" element="led"><bounds x="10" y="32" width="1" height="1" /></bezel>
- <bezel name="5.17" element="led"><bounds x="10" y="34" width="1" height="1" /></bezel>
- <bezel name="5.18" element="led"><bounds x="10" y="36" width="1" height="1" /></bezel>
- <bezel name="5.19" element="led"><bounds x="10" y="38" width="1" height="1" /></bezel>
- <bezel name="5.20" element="led"><bounds x="10" y="40" width="1" height="1" /></bezel>
- <bezel name="5.21" element="led"><bounds x="10" y="42" width="1" height="1" /></bezel>
- <bezel name="5.22" element="led"><bounds x="10" y="44" width="1" height="1" /></bezel>
- <bezel name="5.23" element="led"><bounds x="10" y="46" width="1" height="1" /></bezel>
- <bezel name="5.24" element="led"><bounds x="10" y="48" width="1" height="1" /></bezel>
- <bezel name="5.25" element="led"><bounds x="10" y="50" width="1" height="1" /></bezel>
- <bezel name="5.26" element="led"><bounds x="10" y="52" width="1" height="1" /></bezel>
- <bezel name="5.27" element="led"><bounds x="10" y="54" width="1" height="1" /></bezel>
- <bezel name="5.28" element="led"><bounds x="10" y="56" width="1" height="1" /></bezel>
- <bezel name="5.29" element="led"><bounds x="10" y="58" width="1" height="1" /></bezel>
- <bezel name="5.30" element="led"><bounds x="10" y="60" width="1" height="1" /></bezel>
- <bezel name="5.31" element="led"><bounds x="10" y="62" width="1" height="1" /></bezel>
-
- <bezel name="6.0" element="led"><bounds x="12" y="0" width="1" height="1" /></bezel>
- <bezel name="6.1" element="led"><bounds x="12" y="2" width="1" height="1" /></bezel>
- <bezel name="6.2" element="led"><bounds x="12" y="4" width="1" height="1" /></bezel>
- <bezel name="6.3" element="led"><bounds x="12" y="6" width="1" height="1" /></bezel>
- <bezel name="6.4" element="led"><bounds x="12" y="8" width="1" height="1" /></bezel>
- <bezel name="6.5" element="led"><bounds x="12" y="10" width="1" height="1" /></bezel>
- <bezel name="6.6" element="led"><bounds x="12" y="12" width="1" height="1" /></bezel>
- <bezel name="6.7" element="led"><bounds x="12" y="14" width="1" height="1" /></bezel>
- <bezel name="6.8" element="led"><bounds x="12" y="16" width="1" height="1" /></bezel>
- <bezel name="6.9" element="led"><bounds x="12" y="18" width="1" height="1" /></bezel>
- <bezel name="6.10" element="led"><bounds x="12" y="20" width="1" height="1" /></bezel>
- <bezel name="6.11" element="led"><bounds x="12" y="22" width="1" height="1" /></bezel>
- <bezel name="6.12" element="led"><bounds x="12" y="24" width="1" height="1" /></bezel>
- <bezel name="6.13" element="led"><bounds x="12" y="26" width="1" height="1" /></bezel>
- <bezel name="6.14" element="led"><bounds x="12" y="28" width="1" height="1" /></bezel>
- <bezel name="6.15" element="led"><bounds x="12" y="30" width="1" height="1" /></bezel>
- <bezel name="6.16" element="led"><bounds x="12" y="32" width="1" height="1" /></bezel>
- <bezel name="6.17" element="led"><bounds x="12" y="34" width="1" height="1" /></bezel>
- <bezel name="6.18" element="led"><bounds x="12" y="36" width="1" height="1" /></bezel>
- <bezel name="6.19" element="led"><bounds x="12" y="38" width="1" height="1" /></bezel>
- <bezel name="6.20" element="led"><bounds x="12" y="40" width="1" height="1" /></bezel>
- <bezel name="6.21" element="led"><bounds x="12" y="42" width="1" height="1" /></bezel>
- <bezel name="6.22" element="led"><bounds x="12" y="44" width="1" height="1" /></bezel>
- <bezel name="6.23" element="led"><bounds x="12" y="46" width="1" height="1" /></bezel>
- <bezel name="6.24" element="led"><bounds x="12" y="48" width="1" height="1" /></bezel>
- <bezel name="6.25" element="led"><bounds x="12" y="50" width="1" height="1" /></bezel>
- <bezel name="6.26" element="led"><bounds x="12" y="52" width="1" height="1" /></bezel>
- <bezel name="6.27" element="led"><bounds x="12" y="54" width="1" height="1" /></bezel>
- <bezel name="6.28" element="led"><bounds x="12" y="56" width="1" height="1" /></bezel>
- <bezel name="6.29" element="led"><bounds x="12" y="58" width="1" height="1" /></bezel>
- <bezel name="6.30" element="led"><bounds x="12" y="60" width="1" height="1" /></bezel>
- <bezel name="6.31" element="led"><bounds x="12" y="62" width="1" height="1" /></bezel>
-
- <bezel name="7.0" element="led"><bounds x="14" y="0" width="1" height="1" /></bezel>
- <bezel name="7.1" element="led"><bounds x="14" y="2" width="1" height="1" /></bezel>
- <bezel name="7.2" element="led"><bounds x="14" y="4" width="1" height="1" /></bezel>
- <bezel name="7.3" element="led"><bounds x="14" y="6" width="1" height="1" /></bezel>
- <bezel name="7.4" element="led"><bounds x="14" y="8" width="1" height="1" /></bezel>
- <bezel name="7.5" element="led"><bounds x="14" y="10" width="1" height="1" /></bezel>
- <bezel name="7.6" element="led"><bounds x="14" y="12" width="1" height="1" /></bezel>
- <bezel name="7.7" element="led"><bounds x="14" y="14" width="1" height="1" /></bezel>
- <bezel name="7.8" element="led"><bounds x="14" y="16" width="1" height="1" /></bezel>
- <bezel name="7.9" element="led"><bounds x="14" y="18" width="1" height="1" /></bezel>
- <bezel name="7.10" element="led"><bounds x="14" y="20" width="1" height="1" /></bezel>
- <bezel name="7.11" element="led"><bounds x="14" y="22" width="1" height="1" /></bezel>
- <bezel name="7.12" element="led"><bounds x="14" y="24" width="1" height="1" /></bezel>
- <bezel name="7.13" element="led"><bounds x="14" y="26" width="1" height="1" /></bezel>
- <bezel name="7.14" element="led"><bounds x="14" y="28" width="1" height="1" /></bezel>
- <bezel name="7.15" element="led"><bounds x="14" y="30" width="1" height="1" /></bezel>
- <bezel name="7.16" element="led"><bounds x="14" y="32" width="1" height="1" /></bezel>
- <bezel name="7.17" element="led"><bounds x="14" y="34" width="1" height="1" /></bezel>
- <bezel name="7.18" element="led"><bounds x="14" y="36" width="1" height="1" /></bezel>
- <bezel name="7.19" element="led"><bounds x="14" y="38" width="1" height="1" /></bezel>
- <bezel name="7.20" element="led"><bounds x="14" y="40" width="1" height="1" /></bezel>
- <bezel name="7.21" element="led"><bounds x="14" y="42" width="1" height="1" /></bezel>
- <bezel name="7.22" element="led"><bounds x="14" y="44" width="1" height="1" /></bezel>
- <bezel name="7.23" element="led"><bounds x="14" y="46" width="1" height="1" /></bezel>
- <bezel name="7.24" element="led"><bounds x="14" y="48" width="1" height="1" /></bezel>
- <bezel name="7.25" element="led"><bounds x="14" y="50" width="1" height="1" /></bezel>
- <bezel name="7.26" element="led"><bounds x="14" y="52" width="1" height="1" /></bezel>
- <bezel name="7.27" element="led"><bounds x="14" y="54" width="1" height="1" /></bezel>
- <bezel name="7.28" element="led"><bounds x="14" y="56" width="1" height="1" /></bezel>
- <bezel name="7.29" element="led"><bounds x="14" y="58" width="1" height="1" /></bezel>
- <bezel name="7.30" element="led"><bounds x="14" y="60" width="1" height="1" /></bezel>
- <bezel name="7.31" element="led"><bounds x="14" y="62" width="1" height="1" /></bezel>
-
- <bezel name="8.0" element="led"><bounds x="16" y="0" width="1" height="1" /></bezel>
- <bezel name="8.1" element="led"><bounds x="16" y="2" width="1" height="1" /></bezel>
- <bezel name="8.2" element="led"><bounds x="16" y="4" width="1" height="1" /></bezel>
- <bezel name="8.3" element="led"><bounds x="16" y="6" width="1" height="1" /></bezel>
- <bezel name="8.4" element="led"><bounds x="16" y="8" width="1" height="1" /></bezel>
- <bezel name="8.5" element="led"><bounds x="16" y="10" width="1" height="1" /></bezel>
- <bezel name="8.6" element="led"><bounds x="16" y="12" width="1" height="1" /></bezel>
- <bezel name="8.7" element="led"><bounds x="16" y="14" width="1" height="1" /></bezel>
- <bezel name="8.8" element="led"><bounds x="16" y="16" width="1" height="1" /></bezel>
- <bezel name="8.9" element="led"><bounds x="16" y="18" width="1" height="1" /></bezel>
- <bezel name="8.10" element="led"><bounds x="16" y="20" width="1" height="1" /></bezel>
- <bezel name="8.11" element="led"><bounds x="16" y="22" width="1" height="1" /></bezel>
- <bezel name="8.12" element="led"><bounds x="16" y="24" width="1" height="1" /></bezel>
- <bezel name="8.13" element="led"><bounds x="16" y="26" width="1" height="1" /></bezel>
- <bezel name="8.14" element="led"><bounds x="16" y="28" width="1" height="1" /></bezel>
- <bezel name="8.15" element="led"><bounds x="16" y="30" width="1" height="1" /></bezel>
- <bezel name="8.16" element="led"><bounds x="16" y="32" width="1" height="1" /></bezel>
- <bezel name="8.17" element="led"><bounds x="16" y="34" width="1" height="1" /></bezel>
- <bezel name="8.18" element="led"><bounds x="16" y="36" width="1" height="1" /></bezel>
- <bezel name="8.19" element="led"><bounds x="16" y="38" width="1" height="1" /></bezel>
- <bezel name="8.20" element="led"><bounds x="16" y="40" width="1" height="1" /></bezel>
- <bezel name="8.21" element="led"><bounds x="16" y="42" width="1" height="1" /></bezel>
- <bezel name="8.22" element="led"><bounds x="16" y="44" width="1" height="1" /></bezel>
- <bezel name="8.23" element="led"><bounds x="16" y="46" width="1" height="1" /></bezel>
- <bezel name="8.24" element="led"><bounds x="16" y="48" width="1" height="1" /></bezel>
- <bezel name="8.25" element="led"><bounds x="16" y="50" width="1" height="1" /></bezel>
- <bezel name="8.26" element="led"><bounds x="16" y="52" width="1" height="1" /></bezel>
- <bezel name="8.27" element="led"><bounds x="16" y="54" width="1" height="1" /></bezel>
- <bezel name="8.28" element="led"><bounds x="16" y="56" width="1" height="1" /></bezel>
- <bezel name="8.29" element="led"><bounds x="16" y="58" width="1" height="1" /></bezel>
- <bezel name="8.30" element="led"><bounds x="16" y="60" width="1" height="1" /></bezel>
- <bezel name="8.31" element="led"><bounds x="16" y="62" width="1" height="1" /></bezel>
-
- <bezel name="9.0" element="led"><bounds x="18" y="0" width="1" height="1" /></bezel>
- <bezel name="9.1" element="led"><bounds x="18" y="2" width="1" height="1" /></bezel>
- <bezel name="9.2" element="led"><bounds x="18" y="4" width="1" height="1" /></bezel>
- <bezel name="9.3" element="led"><bounds x="18" y="6" width="1" height="1" /></bezel>
- <bezel name="9.4" element="led"><bounds x="18" y="8" width="1" height="1" /></bezel>
- <bezel name="9.5" element="led"><bounds x="18" y="10" width="1" height="1" /></bezel>
- <bezel name="9.6" element="led"><bounds x="18" y="12" width="1" height="1" /></bezel>
- <bezel name="9.7" element="led"><bounds x="18" y="14" width="1" height="1" /></bezel>
- <bezel name="9.8" element="led"><bounds x="18" y="16" width="1" height="1" /></bezel>
- <bezel name="9.9" element="led"><bounds x="18" y="18" width="1" height="1" /></bezel>
- <bezel name="9.10" element="led"><bounds x="18" y="20" width="1" height="1" /></bezel>
- <bezel name="9.11" element="led"><bounds x="18" y="22" width="1" height="1" /></bezel>
- <bezel name="9.12" element="led"><bounds x="18" y="24" width="1" height="1" /></bezel>
- <bezel name="9.13" element="led"><bounds x="18" y="26" width="1" height="1" /></bezel>
- <bezel name="9.14" element="led"><bounds x="18" y="28" width="1" height="1" /></bezel>
- <bezel name="9.15" element="led"><bounds x="18" y="30" width="1" height="1" /></bezel>
- <bezel name="9.16" element="led"><bounds x="18" y="32" width="1" height="1" /></bezel>
- <bezel name="9.17" element="led"><bounds x="18" y="34" width="1" height="1" /></bezel>
- <bezel name="9.18" element="led"><bounds x="18" y="36" width="1" height="1" /></bezel>
- <bezel name="9.19" element="led"><bounds x="18" y="38" width="1" height="1" /></bezel>
- <bezel name="9.20" element="led"><bounds x="18" y="40" width="1" height="1" /></bezel>
- <bezel name="9.21" element="led"><bounds x="18" y="42" width="1" height="1" /></bezel>
- <bezel name="9.22" element="led"><bounds x="18" y="44" width="1" height="1" /></bezel>
- <bezel name="9.23" element="led"><bounds x="18" y="46" width="1" height="1" /></bezel>
- <bezel name="9.24" element="led"><bounds x="18" y="48" width="1" height="1" /></bezel>
- <bezel name="9.25" element="led"><bounds x="18" y="50" width="1" height="1" /></bezel>
- <bezel name="9.26" element="led"><bounds x="18" y="52" width="1" height="1" /></bezel>
- <bezel name="9.27" element="led"><bounds x="18" y="54" width="1" height="1" /></bezel>
- <bezel name="9.28" element="led"><bounds x="18" y="56" width="1" height="1" /></bezel>
- <bezel name="9.29" element="led"><bounds x="18" y="58" width="1" height="1" /></bezel>
- <bezel name="9.30" element="led"><bounds x="18" y="60" width="1" height="1" /></bezel>
- <bezel name="9.31" element="led"><bounds x="18" y="62" width="1" height="1" /></bezel>
-
- <bezel name="10.0" element="led"><bounds x="20" y="0" width="1" height="1" /></bezel>
- <bezel name="10.1" element="led"><bounds x="20" y="2" width="1" height="1" /></bezel>
- <bezel name="10.2" element="led"><bounds x="20" y="4" width="1" height="1" /></bezel>
- <bezel name="10.3" element="led"><bounds x="20" y="6" width="1" height="1" /></bezel>
- <bezel name="10.4" element="led"><bounds x="20" y="8" width="1" height="1" /></bezel>
- <bezel name="10.5" element="led"><bounds x="20" y="10" width="1" height="1" /></bezel>
- <bezel name="10.6" element="led"><bounds x="20" y="12" width="1" height="1" /></bezel>
- <bezel name="10.7" element="led"><bounds x="20" y="14" width="1" height="1" /></bezel>
- <bezel name="10.8" element="led"><bounds x="20" y="16" width="1" height="1" /></bezel>
- <bezel name="10.9" element="led"><bounds x="20" y="18" width="1" height="1" /></bezel>
- <bezel name="10.10" element="led"><bounds x="20" y="20" width="1" height="1" /></bezel>
- <bezel name="10.11" element="led"><bounds x="20" y="22" width="1" height="1" /></bezel>
- <bezel name="10.12" element="led"><bounds x="20" y="24" width="1" height="1" /></bezel>
- <bezel name="10.13" element="led"><bounds x="20" y="26" width="1" height="1" /></bezel>
- <bezel name="10.14" element="led"><bounds x="20" y="28" width="1" height="1" /></bezel>
- <bezel name="10.15" element="led"><bounds x="20" y="30" width="1" height="1" /></bezel>
- <bezel name="10.16" element="led"><bounds x="20" y="32" width="1" height="1" /></bezel>
- <bezel name="10.17" element="led"><bounds x="20" y="34" width="1" height="1" /></bezel>
- <bezel name="10.18" element="led"><bounds x="20" y="36" width="1" height="1" /></bezel>
- <bezel name="10.19" element="led"><bounds x="20" y="38" width="1" height="1" /></bezel>
- <bezel name="10.20" element="led"><bounds x="20" y="40" width="1" height="1" /></bezel>
- <bezel name="10.21" element="led"><bounds x="20" y="42" width="1" height="1" /></bezel>
- <bezel name="10.22" element="led"><bounds x="20" y="44" width="1" height="1" /></bezel>
- <bezel name="10.23" element="led"><bounds x="20" y="46" width="1" height="1" /></bezel>
- <bezel name="10.24" element="led"><bounds x="20" y="48" width="1" height="1" /></bezel>
- <bezel name="10.25" element="led"><bounds x="20" y="50" width="1" height="1" /></bezel>
- <bezel name="10.26" element="led"><bounds x="20" y="52" width="1" height="1" /></bezel>
- <bezel name="10.27" element="led"><bounds x="20" y="54" width="1" height="1" /></bezel>
- <bezel name="10.28" element="led"><bounds x="20" y="56" width="1" height="1" /></bezel>
- <bezel name="10.29" element="led"><bounds x="20" y="58" width="1" height="1" /></bezel>
- <bezel name="10.30" element="led"><bounds x="20" y="60" width="1" height="1" /></bezel>
- <bezel name="10.31" element="led"><bounds x="20" y="62" width="1" height="1" /></bezel>
-
- <bezel name="11.0" element="led"><bounds x="22" y="0" width="1" height="1" /></bezel>
- <bezel name="11.1" element="led"><bounds x="22" y="2" width="1" height="1" /></bezel>
- <bezel name="11.2" element="led"><bounds x="22" y="4" width="1" height="1" /></bezel>
- <bezel name="11.3" element="led"><bounds x="22" y="6" width="1" height="1" /></bezel>
- <bezel name="11.4" element="led"><bounds x="22" y="8" width="1" height="1" /></bezel>
- <bezel name="11.5" element="led"><bounds x="22" y="10" width="1" height="1" /></bezel>
- <bezel name="11.6" element="led"><bounds x="22" y="12" width="1" height="1" /></bezel>
- <bezel name="11.7" element="led"><bounds x="22" y="14" width="1" height="1" /></bezel>
- <bezel name="11.8" element="led"><bounds x="22" y="16" width="1" height="1" /></bezel>
- <bezel name="11.9" element="led"><bounds x="22" y="18" width="1" height="1" /></bezel>
- <bezel name="11.10" element="led"><bounds x="22" y="20" width="1" height="1" /></bezel>
- <bezel name="11.11" element="led"><bounds x="22" y="22" width="1" height="1" /></bezel>
- <bezel name="11.12" element="led"><bounds x="22" y="24" width="1" height="1" /></bezel>
- <bezel name="11.13" element="led"><bounds x="22" y="26" width="1" height="1" /></bezel>
- <bezel name="11.14" element="led"><bounds x="22" y="28" width="1" height="1" /></bezel>
- <bezel name="11.15" element="led"><bounds x="22" y="30" width="1" height="1" /></bezel>
- <bezel name="11.16" element="led"><bounds x="22" y="32" width="1" height="1" /></bezel>
- <bezel name="11.17" element="led"><bounds x="22" y="34" width="1" height="1" /></bezel>
- <bezel name="11.18" element="led"><bounds x="22" y="36" width="1" height="1" /></bezel>
- <bezel name="11.19" element="led"><bounds x="22" y="38" width="1" height="1" /></bezel>
- <bezel name="11.20" element="led"><bounds x="22" y="40" width="1" height="1" /></bezel>
- <bezel name="11.21" element="led"><bounds x="22" y="42" width="1" height="1" /></bezel>
- <bezel name="11.22" element="led"><bounds x="22" y="44" width="1" height="1" /></bezel>
- <bezel name="11.23" element="led"><bounds x="22" y="46" width="1" height="1" /></bezel>
- <bezel name="11.24" element="led"><bounds x="22" y="48" width="1" height="1" /></bezel>
- <bezel name="11.25" element="led"><bounds x="22" y="50" width="1" height="1" /></bezel>
- <bezel name="11.26" element="led"><bounds x="22" y="52" width="1" height="1" /></bezel>
- <bezel name="11.27" element="led"><bounds x="22" y="54" width="1" height="1" /></bezel>
- <bezel name="11.28" element="led"><bounds x="22" y="56" width="1" height="1" /></bezel>
- <bezel name="11.29" element="led"><bounds x="22" y="58" width="1" height="1" /></bezel>
- <bezel name="11.30" element="led"><bounds x="22" y="60" width="1" height="1" /></bezel>
- <bezel name="11.31" element="led"><bounds x="22" y="62" width="1" height="1" /></bezel>
-
- <bezel name="12.0" element="led"><bounds x="24" y="0" width="1" height="1" /></bezel>
- <bezel name="12.1" element="led"><bounds x="24" y="2" width="1" height="1" /></bezel>
- <bezel name="12.2" element="led"><bounds x="24" y="4" width="1" height="1" /></bezel>
- <bezel name="12.3" element="led"><bounds x="24" y="6" width="1" height="1" /></bezel>
- <bezel name="12.4" element="led"><bounds x="24" y="8" width="1" height="1" /></bezel>
- <bezel name="12.5" element="led"><bounds x="24" y="10" width="1" height="1" /></bezel>
- <bezel name="12.6" element="led"><bounds x="24" y="12" width="1" height="1" /></bezel>
- <bezel name="12.7" element="led"><bounds x="24" y="14" width="1" height="1" /></bezel>
- <bezel name="12.8" element="led"><bounds x="24" y="16" width="1" height="1" /></bezel>
- <bezel name="12.9" element="led"><bounds x="24" y="18" width="1" height="1" /></bezel>
- <bezel name="12.10" element="led"><bounds x="24" y="20" width="1" height="1" /></bezel>
- <bezel name="12.11" element="led"><bounds x="24" y="22" width="1" height="1" /></bezel>
- <bezel name="12.12" element="led"><bounds x="24" y="24" width="1" height="1" /></bezel>
- <bezel name="12.13" element="led"><bounds x="24" y="26" width="1" height="1" /></bezel>
- <bezel name="12.14" element="led"><bounds x="24" y="28" width="1" height="1" /></bezel>
- <bezel name="12.15" element="led"><bounds x="24" y="30" width="1" height="1" /></bezel>
- <bezel name="12.16" element="led"><bounds x="24" y="32" width="1" height="1" /></bezel>
- <bezel name="12.17" element="led"><bounds x="24" y="34" width="1" height="1" /></bezel>
- <bezel name="12.18" element="led"><bounds x="24" y="36" width="1" height="1" /></bezel>
- <bezel name="12.19" element="led"><bounds x="24" y="38" width="1" height="1" /></bezel>
- <bezel name="12.20" element="led"><bounds x="24" y="40" width="1" height="1" /></bezel>
- <bezel name="12.21" element="led"><bounds x="24" y="42" width="1" height="1" /></bezel>
- <bezel name="12.22" element="led"><bounds x="24" y="44" width="1" height="1" /></bezel>
- <bezel name="12.23" element="led"><bounds x="24" y="46" width="1" height="1" /></bezel>
- <bezel name="12.24" element="led"><bounds x="24" y="48" width="1" height="1" /></bezel>
- <bezel name="12.25" element="led"><bounds x="24" y="50" width="1" height="1" /></bezel>
- <bezel name="12.26" element="led"><bounds x="24" y="52" width="1" height="1" /></bezel>
- <bezel name="12.27" element="led"><bounds x="24" y="54" width="1" height="1" /></bezel>
- <bezel name="12.28" element="led"><bounds x="24" y="56" width="1" height="1" /></bezel>
- <bezel name="12.29" element="led"><bounds x="24" y="58" width="1" height="1" /></bezel>
- <bezel name="12.30" element="led"><bounds x="24" y="60" width="1" height="1" /></bezel>
- <bezel name="12.31" element="led"><bounds x="24" y="62" width="1" height="1" /></bezel>
-
- <bezel name="13.0" element="led"><bounds x="26" y="0" width="1" height="1" /></bezel>
- <bezel name="13.1" element="led"><bounds x="26" y="2" width="1" height="1" /></bezel>
- <bezel name="13.2" element="led"><bounds x="26" y="4" width="1" height="1" /></bezel>
- <bezel name="13.3" element="led"><bounds x="26" y="6" width="1" height="1" /></bezel>
- <bezel name="13.4" element="led"><bounds x="26" y="8" width="1" height="1" /></bezel>
- <bezel name="13.5" element="led"><bounds x="26" y="10" width="1" height="1" /></bezel>
- <bezel name="13.6" element="led"><bounds x="26" y="12" width="1" height="1" /></bezel>
- <bezel name="13.7" element="led"><bounds x="26" y="14" width="1" height="1" /></bezel>
- <bezel name="13.8" element="led"><bounds x="26" y="16" width="1" height="1" /></bezel>
- <bezel name="13.9" element="led"><bounds x="26" y="18" width="1" height="1" /></bezel>
- <bezel name="13.10" element="led"><bounds x="26" y="20" width="1" height="1" /></bezel>
- <bezel name="13.11" element="led"><bounds x="26" y="22" width="1" height="1" /></bezel>
- <bezel name="13.12" element="led"><bounds x="26" y="24" width="1" height="1" /></bezel>
- <bezel name="13.13" element="led"><bounds x="26" y="26" width="1" height="1" /></bezel>
- <bezel name="13.14" element="led"><bounds x="26" y="28" width="1" height="1" /></bezel>
- <bezel name="13.15" element="led"><bounds x="26" y="30" width="1" height="1" /></bezel>
- <bezel name="13.16" element="led"><bounds x="26" y="32" width="1" height="1" /></bezel>
- <bezel name="13.17" element="led"><bounds x="26" y="34" width="1" height="1" /></bezel>
- <bezel name="13.18" element="led"><bounds x="26" y="36" width="1" height="1" /></bezel>
- <bezel name="13.19" element="led"><bounds x="26" y="38" width="1" height="1" /></bezel>
- <bezel name="13.20" element="led"><bounds x="26" y="40" width="1" height="1" /></bezel>
- <bezel name="13.21" element="led"><bounds x="26" y="42" width="1" height="1" /></bezel>
- <bezel name="13.22" element="led"><bounds x="26" y="44" width="1" height="1" /></bezel>
- <bezel name="13.23" element="led"><bounds x="26" y="46" width="1" height="1" /></bezel>
- <bezel name="13.24" element="led"><bounds x="26" y="48" width="1" height="1" /></bezel>
- <bezel name="13.25" element="led"><bounds x="26" y="50" width="1" height="1" /></bezel>
- <bezel name="13.26" element="led"><bounds x="26" y="52" width="1" height="1" /></bezel>
- <bezel name="13.27" element="led"><bounds x="26" y="54" width="1" height="1" /></bezel>
- <bezel name="13.28" element="led"><bounds x="26" y="56" width="1" height="1" /></bezel>
- <bezel name="13.29" element="led"><bounds x="26" y="58" width="1" height="1" /></bezel>
- <bezel name="13.30" element="led"><bounds x="26" y="60" width="1" height="1" /></bezel>
- <bezel name="13.31" element="led"><bounds x="26" y="62" width="1" height="1" /></bezel>
-
- <bezel name="14.0" element="led"><bounds x="28" y="0" width="1" height="1" /></bezel>
- <bezel name="14.1" element="led"><bounds x="28" y="2" width="1" height="1" /></bezel>
- <bezel name="14.2" element="led"><bounds x="28" y="4" width="1" height="1" /></bezel>
- <bezel name="14.3" element="led"><bounds x="28" y="6" width="1" height="1" /></bezel>
- <bezel name="14.4" element="led"><bounds x="28" y="8" width="1" height="1" /></bezel>
- <bezel name="14.5" element="led"><bounds x="28" y="10" width="1" height="1" /></bezel>
- <bezel name="14.6" element="led"><bounds x="28" y="12" width="1" height="1" /></bezel>
- <bezel name="14.7" element="led"><bounds x="28" y="14" width="1" height="1" /></bezel>
- <bezel name="14.8" element="led"><bounds x="28" y="16" width="1" height="1" /></bezel>
- <bezel name="14.9" element="led"><bounds x="28" y="18" width="1" height="1" /></bezel>
- <bezel name="14.10" element="led"><bounds x="28" y="20" width="1" height="1" /></bezel>
- <bezel name="14.11" element="led"><bounds x="28" y="22" width="1" height="1" /></bezel>
- <bezel name="14.12" element="led"><bounds x="28" y="24" width="1" height="1" /></bezel>
- <bezel name="14.13" element="led"><bounds x="28" y="26" width="1" height="1" /></bezel>
- <bezel name="14.14" element="led"><bounds x="28" y="28" width="1" height="1" /></bezel>
- <bezel name="14.15" element="led"><bounds x="28" y="30" width="1" height="1" /></bezel>
- <bezel name="14.16" element="led"><bounds x="28" y="32" width="1" height="1" /></bezel>
- <bezel name="14.17" element="led"><bounds x="28" y="34" width="1" height="1" /></bezel>
- <bezel name="14.18" element="led"><bounds x="28" y="36" width="1" height="1" /></bezel>
- <bezel name="14.19" element="led"><bounds x="28" y="38" width="1" height="1" /></bezel>
- <bezel name="14.20" element="led"><bounds x="28" y="40" width="1" height="1" /></bezel>
- <bezel name="14.21" element="led"><bounds x="28" y="42" width="1" height="1" /></bezel>
- <bezel name="14.22" element="led"><bounds x="28" y="44" width="1" height="1" /></bezel>
- <bezel name="14.23" element="led"><bounds x="28" y="46" width="1" height="1" /></bezel>
- <bezel name="14.24" element="led"><bounds x="28" y="48" width="1" height="1" /></bezel>
- <bezel name="14.25" element="led"><bounds x="28" y="50" width="1" height="1" /></bezel>
- <bezel name="14.26" element="led"><bounds x="28" y="52" width="1" height="1" /></bezel>
- <bezel name="14.27" element="led"><bounds x="28" y="54" width="1" height="1" /></bezel>
- <bezel name="14.28" element="led"><bounds x="28" y="56" width="1" height="1" /></bezel>
- <bezel name="14.29" element="led"><bounds x="28" y="58" width="1" height="1" /></bezel>
- <bezel name="14.30" element="led"><bounds x="28" y="60" width="1" height="1" /></bezel>
- <bezel name="14.31" element="led"><bounds x="28" y="62" width="1" height="1" /></bezel>
-
- <bezel name="15.0" element="led"><bounds x="30" y="0" width="1" height="1" /></bezel>
- <bezel name="15.1" element="led"><bounds x="30" y="2" width="1" height="1" /></bezel>
- <bezel name="15.2" element="led"><bounds x="30" y="4" width="1" height="1" /></bezel>
- <bezel name="15.3" element="led"><bounds x="30" y="6" width="1" height="1" /></bezel>
- <bezel name="15.4" element="led"><bounds x="30" y="8" width="1" height="1" /></bezel>
- <bezel name="15.5" element="led"><bounds x="30" y="10" width="1" height="1" /></bezel>
- <bezel name="15.6" element="led"><bounds x="30" y="12" width="1" height="1" /></bezel>
- <bezel name="15.7" element="led"><bounds x="30" y="14" width="1" height="1" /></bezel>
- <bezel name="15.8" element="led"><bounds x="30" y="16" width="1" height="1" /></bezel>
- <bezel name="15.9" element="led"><bounds x="30" y="18" width="1" height="1" /></bezel>
- <bezel name="15.10" element="led"><bounds x="30" y="20" width="1" height="1" /></bezel>
- <bezel name="15.11" element="led"><bounds x="30" y="22" width="1" height="1" /></bezel>
- <bezel name="15.12" element="led"><bounds x="30" y="24" width="1" height="1" /></bezel>
- <bezel name="15.13" element="led"><bounds x="30" y="26" width="1" height="1" /></bezel>
- <bezel name="15.14" element="led"><bounds x="30" y="28" width="1" height="1" /></bezel>
- <bezel name="15.15" element="led"><bounds x="30" y="30" width="1" height="1" /></bezel>
- <bezel name="15.16" element="led"><bounds x="30" y="32" width="1" height="1" /></bezel>
- <bezel name="15.17" element="led"><bounds x="30" y="34" width="1" height="1" /></bezel>
- <bezel name="15.18" element="led"><bounds x="30" y="36" width="1" height="1" /></bezel>
- <bezel name="15.19" element="led"><bounds x="30" y="38" width="1" height="1" /></bezel>
- <bezel name="15.20" element="led"><bounds x="30" y="40" width="1" height="1" /></bezel>
- <bezel name="15.21" element="led"><bounds x="30" y="42" width="1" height="1" /></bezel>
- <bezel name="15.22" element="led"><bounds x="30" y="44" width="1" height="1" /></bezel>
- <bezel name="15.23" element="led"><bounds x="30" y="46" width="1" height="1" /></bezel>
- <bezel name="15.24" element="led"><bounds x="30" y="48" width="1" height="1" /></bezel>
- <bezel name="15.25" element="led"><bounds x="30" y="50" width="1" height="1" /></bezel>
- <bezel name="15.26" element="led"><bounds x="30" y="52" width="1" height="1" /></bezel>
- <bezel name="15.27" element="led"><bounds x="30" y="54" width="1" height="1" /></bezel>
- <bezel name="15.28" element="led"><bounds x="30" y="56" width="1" height="1" /></bezel>
- <bezel name="15.29" element="led"><bounds x="30" y="58" width="1" height="1" /></bezel>
- <bezel name="15.30" element="led"><bounds x="30" y="60" width="1" height="1" /></bezel>
- <bezel name="15.31" element="led"><bounds x="30" y="62" width="1" height="1" /></bezel>
+ <repeat count="32">
+ <param name="x" start="0" increment="1" />
+ <bezel name="~y~.~x~" element="led"><bounds x="~x~" y="~y~" width="0.5" height="0.5" /></bezel>
+ </repeat>
+ </repeat>
</view>
</mamelayout>
diff --git a/src/mame/layout/hh_hmcs40_test.lay b/src/mame/layout/hh_hmcs40_test.lay
index 17c5582a501..270ad36fff9 100644
--- a/src/mame/layout/hh_hmcs40_test.lay
+++ b/src/mame/layout/hh_hmcs40_test.lay
@@ -14,668 +14,21 @@
<!-- build screen -->
<view name="Test Layout">
- <bounds left="0" right="64" top="0" bottom="80" />
+ <bounds left="0" right="40" top="0" bottom="16" />
<bezel element="static_black">
- <bounds left="0" right="64" top="0" bottom="80" />
+ <bounds left="0" right="40" top="0" bottom="16" />
</bezel>
<!-- max 16*40 matrix -->
- <bezel name="0.0" element="led"><bounds x="0" y="0" width="1" height="1" /></bezel>
- <bezel name="0.1" element="led"><bounds x="0" y="2" width="1" height="1" /></bezel>
- <bezel name="0.2" element="led"><bounds x="0" y="4" width="1" height="1" /></bezel>
- <bezel name="0.3" element="led"><bounds x="0" y="6" width="1" height="1" /></bezel>
- <bezel name="0.4" element="led"><bounds x="0" y="8" width="1" height="1" /></bezel>
- <bezel name="0.5" element="led"><bounds x="0" y="10" width="1" height="1" /></bezel>
- <bezel name="0.6" element="led"><bounds x="0" y="12" width="1" height="1" /></bezel>
- <bezel name="0.7" element="led"><bounds x="0" y="14" width="1" height="1" /></bezel>
- <bezel name="0.8" element="led"><bounds x="0" y="16" width="1" height="1" /></bezel>
- <bezel name="0.9" element="led"><bounds x="0" y="18" width="1" height="1" /></bezel>
- <bezel name="0.10" element="led"><bounds x="0" y="20" width="1" height="1" /></bezel>
- <bezel name="0.11" element="led"><bounds x="0" y="22" width="1" height="1" /></bezel>
- <bezel name="0.12" element="led"><bounds x="0" y="24" width="1" height="1" /></bezel>
- <bezel name="0.13" element="led"><bounds x="0" y="26" width="1" height="1" /></bezel>
- <bezel name="0.14" element="led"><bounds x="0" y="28" width="1" height="1" /></bezel>
- <bezel name="0.15" element="led"><bounds x="0" y="30" width="1" height="1" /></bezel>
- <bezel name="0.16" element="led"><bounds x="0" y="32" width="1" height="1" /></bezel>
- <bezel name="0.17" element="led"><bounds x="0" y="34" width="1" height="1" /></bezel>
- <bezel name="0.18" element="led"><bounds x="0" y="36" width="1" height="1" /></bezel>
- <bezel name="0.19" element="led"><bounds x="0" y="38" width="1" height="1" /></bezel>
- <bezel name="0.20" element="led"><bounds x="0" y="40" width="1" height="1" /></bezel>
- <bezel name="0.21" element="led"><bounds x="0" y="42" width="1" height="1" /></bezel>
- <bezel name="0.22" element="led"><bounds x="0" y="44" width="1" height="1" /></bezel>
- <bezel name="0.23" element="led"><bounds x="0" y="46" width="1" height="1" /></bezel>
- <bezel name="0.24" element="led"><bounds x="0" y="48" width="1" height="1" /></bezel>
- <bezel name="0.25" element="led"><bounds x="0" y="50" width="1" height="1" /></bezel>
- <bezel name="0.26" element="led"><bounds x="0" y="52" width="1" height="1" /></bezel>
- <bezel name="0.27" element="led"><bounds x="0" y="54" width="1" height="1" /></bezel>
- <bezel name="0.28" element="led"><bounds x="0" y="56" width="1" height="1" /></bezel>
- <bezel name="0.29" element="led"><bounds x="0" y="58" width="1" height="1" /></bezel>
- <bezel name="0.30" element="led"><bounds x="0" y="60" width="1" height="1" /></bezel>
- <bezel name="0.31" element="led"><bounds x="0" y="62" width="1" height="1" /></bezel>
- <bezel name="0.32" element="led"><bounds x="0" y="64" width="1" height="1" /></bezel>
- <bezel name="0.33" element="led"><bounds x="0" y="66" width="1" height="1" /></bezel>
- <bezel name="0.34" element="led"><bounds x="0" y="68" width="1" height="1" /></bezel>
- <bezel name="0.35" element="led"><bounds x="0" y="70" width="1" height="1" /></bezel>
- <bezel name="0.36" element="led"><bounds x="0" y="72" width="1" height="1" /></bezel>
- <bezel name="0.37" element="led"><bounds x="0" y="74" width="1" height="1" /></bezel>
- <bezel name="0.38" element="led"><bounds x="0" y="76" width="1" height="1" /></bezel>
- <bezel name="0.39" element="led"><bounds x="0" y="78" width="1" height="1" /></bezel>
+ <repeat count="16">
+ <param name="y" start="0" increment="1" />
- <bezel name="1.0" element="led"><bounds x="2" y="0" width="1" height="1" /></bezel>
- <bezel name="1.1" element="led"><bounds x="2" y="2" width="1" height="1" /></bezel>
- <bezel name="1.2" element="led"><bounds x="2" y="4" width="1" height="1" /></bezel>
- <bezel name="1.3" element="led"><bounds x="2" y="6" width="1" height="1" /></bezel>
- <bezel name="1.4" element="led"><bounds x="2" y="8" width="1" height="1" /></bezel>
- <bezel name="1.5" element="led"><bounds x="2" y="10" width="1" height="1" /></bezel>
- <bezel name="1.6" element="led"><bounds x="2" y="12" width="1" height="1" /></bezel>
- <bezel name="1.7" element="led"><bounds x="2" y="14" width="1" height="1" /></bezel>
- <bezel name="1.8" element="led"><bounds x="2" y="16" width="1" height="1" /></bezel>
- <bezel name="1.9" element="led"><bounds x="2" y="18" width="1" height="1" /></bezel>
- <bezel name="1.10" element="led"><bounds x="2" y="20" width="1" height="1" /></bezel>
- <bezel name="1.11" element="led"><bounds x="2" y="22" width="1" height="1" /></bezel>
- <bezel name="1.12" element="led"><bounds x="2" y="24" width="1" height="1" /></bezel>
- <bezel name="1.13" element="led"><bounds x="2" y="26" width="1" height="1" /></bezel>
- <bezel name="1.14" element="led"><bounds x="2" y="28" width="1" height="1" /></bezel>
- <bezel name="1.15" element="led"><bounds x="2" y="30" width="1" height="1" /></bezel>
- <bezel name="1.16" element="led"><bounds x="2" y="32" width="1" height="1" /></bezel>
- <bezel name="1.17" element="led"><bounds x="2" y="34" width="1" height="1" /></bezel>
- <bezel name="1.18" element="led"><bounds x="2" y="36" width="1" height="1" /></bezel>
- <bezel name="1.19" element="led"><bounds x="2" y="38" width="1" height="1" /></bezel>
- <bezel name="1.20" element="led"><bounds x="2" y="40" width="1" height="1" /></bezel>
- <bezel name="1.21" element="led"><bounds x="2" y="42" width="1" height="1" /></bezel>
- <bezel name="1.22" element="led"><bounds x="2" y="44" width="1" height="1" /></bezel>
- <bezel name="1.23" element="led"><bounds x="2" y="46" width="1" height="1" /></bezel>
- <bezel name="1.24" element="led"><bounds x="2" y="48" width="1" height="1" /></bezel>
- <bezel name="1.25" element="led"><bounds x="2" y="50" width="1" height="1" /></bezel>
- <bezel name="1.26" element="led"><bounds x="2" y="52" width="1" height="1" /></bezel>
- <bezel name="1.27" element="led"><bounds x="2" y="54" width="1" height="1" /></bezel>
- <bezel name="1.28" element="led"><bounds x="2" y="56" width="1" height="1" /></bezel>
- <bezel name="1.29" element="led"><bounds x="2" y="58" width="1" height="1" /></bezel>
- <bezel name="1.30" element="led"><bounds x="2" y="60" width="1" height="1" /></bezel>
- <bezel name="1.31" element="led"><bounds x="2" y="62" width="1" height="1" /></bezel>
- <bezel name="1.32" element="led"><bounds x="2" y="64" width="1" height="1" /></bezel>
- <bezel name="1.33" element="led"><bounds x="2" y="66" width="1" height="1" /></bezel>
- <bezel name="1.34" element="led"><bounds x="2" y="68" width="1" height="1" /></bezel>
- <bezel name="1.35" element="led"><bounds x="2" y="70" width="1" height="1" /></bezel>
- <bezel name="1.36" element="led"><bounds x="2" y="72" width="1" height="1" /></bezel>
- <bezel name="1.37" element="led"><bounds x="2" y="74" width="1" height="1" /></bezel>
- <bezel name="1.38" element="led"><bounds x="2" y="76" width="1" height="1" /></bezel>
- <bezel name="1.39" element="led"><bounds x="2" y="78" width="1" height="1" /></bezel>
-
- <bezel name="2.0" element="led"><bounds x="4" y="0" width="1" height="1" /></bezel>
- <bezel name="2.1" element="led"><bounds x="4" y="2" width="1" height="1" /></bezel>
- <bezel name="2.2" element="led"><bounds x="4" y="4" width="1" height="1" /></bezel>
- <bezel name="2.3" element="led"><bounds x="4" y="6" width="1" height="1" /></bezel>
- <bezel name="2.4" element="led"><bounds x="4" y="8" width="1" height="1" /></bezel>
- <bezel name="2.5" element="led"><bounds x="4" y="10" width="1" height="1" /></bezel>
- <bezel name="2.6" element="led"><bounds x="4" y="12" width="1" height="1" /></bezel>
- <bezel name="2.7" element="led"><bounds x="4" y="14" width="1" height="1" /></bezel>
- <bezel name="2.8" element="led"><bounds x="4" y="16" width="1" height="1" /></bezel>
- <bezel name="2.9" element="led"><bounds x="4" y="18" width="1" height="1" /></bezel>
- <bezel name="2.10" element="led"><bounds x="4" y="20" width="1" height="1" /></bezel>
- <bezel name="2.11" element="led"><bounds x="4" y="22" width="1" height="1" /></bezel>
- <bezel name="2.12" element="led"><bounds x="4" y="24" width="1" height="1" /></bezel>
- <bezel name="2.13" element="led"><bounds x="4" y="26" width="1" height="1" /></bezel>
- <bezel name="2.14" element="led"><bounds x="4" y="28" width="1" height="1" /></bezel>
- <bezel name="2.15" element="led"><bounds x="4" y="30" width="1" height="1" /></bezel>
- <bezel name="2.16" element="led"><bounds x="4" y="32" width="1" height="1" /></bezel>
- <bezel name="2.17" element="led"><bounds x="4" y="34" width="1" height="1" /></bezel>
- <bezel name="2.18" element="led"><bounds x="4" y="36" width="1" height="1" /></bezel>
- <bezel name="2.19" element="led"><bounds x="4" y="38" width="1" height="1" /></bezel>
- <bezel name="2.20" element="led"><bounds x="4" y="40" width="1" height="1" /></bezel>
- <bezel name="2.21" element="led"><bounds x="4" y="42" width="1" height="1" /></bezel>
- <bezel name="2.22" element="led"><bounds x="4" y="44" width="1" height="1" /></bezel>
- <bezel name="2.23" element="led"><bounds x="4" y="46" width="1" height="1" /></bezel>
- <bezel name="2.24" element="led"><bounds x="4" y="48" width="1" height="1" /></bezel>
- <bezel name="2.25" element="led"><bounds x="4" y="50" width="1" height="1" /></bezel>
- <bezel name="2.26" element="led"><bounds x="4" y="52" width="1" height="1" /></bezel>
- <bezel name="2.27" element="led"><bounds x="4" y="54" width="1" height="1" /></bezel>
- <bezel name="2.28" element="led"><bounds x="4" y="56" width="1" height="1" /></bezel>
- <bezel name="2.29" element="led"><bounds x="4" y="58" width="1" height="1" /></bezel>
- <bezel name="2.30" element="led"><bounds x="4" y="60" width="1" height="1" /></bezel>
- <bezel name="2.31" element="led"><bounds x="4" y="62" width="1" height="1" /></bezel>
- <bezel name="2.32" element="led"><bounds x="4" y="64" width="1" height="1" /></bezel>
- <bezel name="2.33" element="led"><bounds x="4" y="66" width="1" height="1" /></bezel>
- <bezel name="2.34" element="led"><bounds x="4" y="68" width="1" height="1" /></bezel>
- <bezel name="2.35" element="led"><bounds x="4" y="70" width="1" height="1" /></bezel>
- <bezel name="2.36" element="led"><bounds x="4" y="72" width="1" height="1" /></bezel>
- <bezel name="2.37" element="led"><bounds x="4" y="74" width="1" height="1" /></bezel>
- <bezel name="2.38" element="led"><bounds x="4" y="76" width="1" height="1" /></bezel>
- <bezel name="2.39" element="led"><bounds x="4" y="78" width="1" height="1" /></bezel>
-
- <bezel name="3.0" element="led"><bounds x="6" y="0" width="1" height="1" /></bezel>
- <bezel name="3.1" element="led"><bounds x="6" y="2" width="1" height="1" /></bezel>
- <bezel name="3.2" element="led"><bounds x="6" y="4" width="1" height="1" /></bezel>
- <bezel name="3.3" element="led"><bounds x="6" y="6" width="1" height="1" /></bezel>
- <bezel name="3.4" element="led"><bounds x="6" y="8" width="1" height="1" /></bezel>
- <bezel name="3.5" element="led"><bounds x="6" y="10" width="1" height="1" /></bezel>
- <bezel name="3.6" element="led"><bounds x="6" y="12" width="1" height="1" /></bezel>
- <bezel name="3.7" element="led"><bounds x="6" y="14" width="1" height="1" /></bezel>
- <bezel name="3.8" element="led"><bounds x="6" y="16" width="1" height="1" /></bezel>
- <bezel name="3.9" element="led"><bounds x="6" y="18" width="1" height="1" /></bezel>
- <bezel name="3.10" element="led"><bounds x="6" y="20" width="1" height="1" /></bezel>
- <bezel name="3.11" element="led"><bounds x="6" y="22" width="1" height="1" /></bezel>
- <bezel name="3.12" element="led"><bounds x="6" y="24" width="1" height="1" /></bezel>
- <bezel name="3.13" element="led"><bounds x="6" y="26" width="1" height="1" /></bezel>
- <bezel name="3.14" element="led"><bounds x="6" y="28" width="1" height="1" /></bezel>
- <bezel name="3.15" element="led"><bounds x="6" y="30" width="1" height="1" /></bezel>
- <bezel name="3.16" element="led"><bounds x="6" y="32" width="1" height="1" /></bezel>
- <bezel name="3.17" element="led"><bounds x="6" y="34" width="1" height="1" /></bezel>
- <bezel name="3.18" element="led"><bounds x="6" y="36" width="1" height="1" /></bezel>
- <bezel name="3.19" element="led"><bounds x="6" y="38" width="1" height="1" /></bezel>
- <bezel name="3.20" element="led"><bounds x="6" y="40" width="1" height="1" /></bezel>
- <bezel name="3.21" element="led"><bounds x="6" y="42" width="1" height="1" /></bezel>
- <bezel name="3.22" element="led"><bounds x="6" y="44" width="1" height="1" /></bezel>
- <bezel name="3.23" element="led"><bounds x="6" y="46" width="1" height="1" /></bezel>
- <bezel name="3.24" element="led"><bounds x="6" y="48" width="1" height="1" /></bezel>
- <bezel name="3.25" element="led"><bounds x="6" y="50" width="1" height="1" /></bezel>
- <bezel name="3.26" element="led"><bounds x="6" y="52" width="1" height="1" /></bezel>
- <bezel name="3.27" element="led"><bounds x="6" y="54" width="1" height="1" /></bezel>
- <bezel name="3.28" element="led"><bounds x="6" y="56" width="1" height="1" /></bezel>
- <bezel name="3.29" element="led"><bounds x="6" y="58" width="1" height="1" /></bezel>
- <bezel name="3.30" element="led"><bounds x="6" y="60" width="1" height="1" /></bezel>
- <bezel name="3.31" element="led"><bounds x="6" y="62" width="1" height="1" /></bezel>
- <bezel name="3.32" element="led"><bounds x="6" y="64" width="1" height="1" /></bezel>
- <bezel name="3.33" element="led"><bounds x="6" y="66" width="1" height="1" /></bezel>
- <bezel name="3.34" element="led"><bounds x="6" y="68" width="1" height="1" /></bezel>
- <bezel name="3.35" element="led"><bounds x="6" y="70" width="1" height="1" /></bezel>
- <bezel name="3.36" element="led"><bounds x="6" y="72" width="1" height="1" /></bezel>
- <bezel name="3.37" element="led"><bounds x="6" y="74" width="1" height="1" /></bezel>
- <bezel name="3.38" element="led"><bounds x="6" y="76" width="1" height="1" /></bezel>
- <bezel name="3.39" element="led"><bounds x="6" y="78" width="1" height="1" /></bezel>
-
- <bezel name="4.0" element="led"><bounds x="8" y="0" width="1" height="1" /></bezel>
- <bezel name="4.1" element="led"><bounds x="8" y="2" width="1" height="1" /></bezel>
- <bezel name="4.2" element="led"><bounds x="8" y="4" width="1" height="1" /></bezel>
- <bezel name="4.3" element="led"><bounds x="8" y="6" width="1" height="1" /></bezel>
- <bezel name="4.4" element="led"><bounds x="8" y="8" width="1" height="1" /></bezel>
- <bezel name="4.5" element="led"><bounds x="8" y="10" width="1" height="1" /></bezel>
- <bezel name="4.6" element="led"><bounds x="8" y="12" width="1" height="1" /></bezel>
- <bezel name="4.7" element="led"><bounds x="8" y="14" width="1" height="1" /></bezel>
- <bezel name="4.8" element="led"><bounds x="8" y="16" width="1" height="1" /></bezel>
- <bezel name="4.9" element="led"><bounds x="8" y="18" width="1" height="1" /></bezel>
- <bezel name="4.10" element="led"><bounds x="8" y="20" width="1" height="1" /></bezel>
- <bezel name="4.11" element="led"><bounds x="8" y="22" width="1" height="1" /></bezel>
- <bezel name="4.12" element="led"><bounds x="8" y="24" width="1" height="1" /></bezel>
- <bezel name="4.13" element="led"><bounds x="8" y="26" width="1" height="1" /></bezel>
- <bezel name="4.14" element="led"><bounds x="8" y="28" width="1" height="1" /></bezel>
- <bezel name="4.15" element="led"><bounds x="8" y="30" width="1" height="1" /></bezel>
- <bezel name="4.16" element="led"><bounds x="8" y="32" width="1" height="1" /></bezel>
- <bezel name="4.17" element="led"><bounds x="8" y="34" width="1" height="1" /></bezel>
- <bezel name="4.18" element="led"><bounds x="8" y="36" width="1" height="1" /></bezel>
- <bezel name="4.19" element="led"><bounds x="8" y="38" width="1" height="1" /></bezel>
- <bezel name="4.20" element="led"><bounds x="8" y="40" width="1" height="1" /></bezel>
- <bezel name="4.21" element="led"><bounds x="8" y="42" width="1" height="1" /></bezel>
- <bezel name="4.22" element="led"><bounds x="8" y="44" width="1" height="1" /></bezel>
- <bezel name="4.23" element="led"><bounds x="8" y="46" width="1" height="1" /></bezel>
- <bezel name="4.24" element="led"><bounds x="8" y="48" width="1" height="1" /></bezel>
- <bezel name="4.25" element="led"><bounds x="8" y="50" width="1" height="1" /></bezel>
- <bezel name="4.26" element="led"><bounds x="8" y="52" width="1" height="1" /></bezel>
- <bezel name="4.27" element="led"><bounds x="8" y="54" width="1" height="1" /></bezel>
- <bezel name="4.28" element="led"><bounds x="8" y="56" width="1" height="1" /></bezel>
- <bezel name="4.29" element="led"><bounds x="8" y="58" width="1" height="1" /></bezel>
- <bezel name="4.30" element="led"><bounds x="8" y="60" width="1" height="1" /></bezel>
- <bezel name="4.31" element="led"><bounds x="8" y="62" width="1" height="1" /></bezel>
- <bezel name="4.32" element="led"><bounds x="8" y="64" width="1" height="1" /></bezel>
- <bezel name="4.33" element="led"><bounds x="8" y="66" width="1" height="1" /></bezel>
- <bezel name="4.34" element="led"><bounds x="8" y="68" width="1" height="1" /></bezel>
- <bezel name="4.35" element="led"><bounds x="8" y="70" width="1" height="1" /></bezel>
- <bezel name="4.36" element="led"><bounds x="8" y="72" width="1" height="1" /></bezel>
- <bezel name="4.37" element="led"><bounds x="8" y="74" width="1" height="1" /></bezel>
- <bezel name="4.38" element="led"><bounds x="8" y="76" width="1" height="1" /></bezel>
- <bezel name="4.39" element="led"><bounds x="8" y="78" width="1" height="1" /></bezel>
-
- <bezel name="5.0" element="led"><bounds x="10" y="0" width="1" height="1" /></bezel>
- <bezel name="5.1" element="led"><bounds x="10" y="2" width="1" height="1" /></bezel>
- <bezel name="5.2" element="led"><bounds x="10" y="4" width="1" height="1" /></bezel>
- <bezel name="5.3" element="led"><bounds x="10" y="6" width="1" height="1" /></bezel>
- <bezel name="5.4" element="led"><bounds x="10" y="8" width="1" height="1" /></bezel>
- <bezel name="5.5" element="led"><bounds x="10" y="10" width="1" height="1" /></bezel>
- <bezel name="5.6" element="led"><bounds x="10" y="12" width="1" height="1" /></bezel>
- <bezel name="5.7" element="led"><bounds x="10" y="14" width="1" height="1" /></bezel>
- <bezel name="5.8" element="led"><bounds x="10" y="16" width="1" height="1" /></bezel>
- <bezel name="5.9" element="led"><bounds x="10" y="18" width="1" height="1" /></bezel>
- <bezel name="5.10" element="led"><bounds x="10" y="20" width="1" height="1" /></bezel>
- <bezel name="5.11" element="led"><bounds x="10" y="22" width="1" height="1" /></bezel>
- <bezel name="5.12" element="led"><bounds x="10" y="24" width="1" height="1" /></bezel>
- <bezel name="5.13" element="led"><bounds x="10" y="26" width="1" height="1" /></bezel>
- <bezel name="5.14" element="led"><bounds x="10" y="28" width="1" height="1" /></bezel>
- <bezel name="5.15" element="led"><bounds x="10" y="30" width="1" height="1" /></bezel>
- <bezel name="5.16" element="led"><bounds x="10" y="32" width="1" height="1" /></bezel>
- <bezel name="5.17" element="led"><bounds x="10" y="34" width="1" height="1" /></bezel>
- <bezel name="5.18" element="led"><bounds x="10" y="36" width="1" height="1" /></bezel>
- <bezel name="5.19" element="led"><bounds x="10" y="38" width="1" height="1" /></bezel>
- <bezel name="5.20" element="led"><bounds x="10" y="40" width="1" height="1" /></bezel>
- <bezel name="5.21" element="led"><bounds x="10" y="42" width="1" height="1" /></bezel>
- <bezel name="5.22" element="led"><bounds x="10" y="44" width="1" height="1" /></bezel>
- <bezel name="5.23" element="led"><bounds x="10" y="46" width="1" height="1" /></bezel>
- <bezel name="5.24" element="led"><bounds x="10" y="48" width="1" height="1" /></bezel>
- <bezel name="5.25" element="led"><bounds x="10" y="50" width="1" height="1" /></bezel>
- <bezel name="5.26" element="led"><bounds x="10" y="52" width="1" height="1" /></bezel>
- <bezel name="5.27" element="led"><bounds x="10" y="54" width="1" height="1" /></bezel>
- <bezel name="5.28" element="led"><bounds x="10" y="56" width="1" height="1" /></bezel>
- <bezel name="5.29" element="led"><bounds x="10" y="58" width="1" height="1" /></bezel>
- <bezel name="5.30" element="led"><bounds x="10" y="60" width="1" height="1" /></bezel>
- <bezel name="5.31" element="led"><bounds x="10" y="62" width="1" height="1" /></bezel>
- <bezel name="5.32" element="led"><bounds x="10" y="64" width="1" height="1" /></bezel>
- <bezel name="5.33" element="led"><bounds x="10" y="66" width="1" height="1" /></bezel>
- <bezel name="5.34" element="led"><bounds x="10" y="68" width="1" height="1" /></bezel>
- <bezel name="5.35" element="led"><bounds x="10" y="70" width="1" height="1" /></bezel>
- <bezel name="5.36" element="led"><bounds x="10" y="72" width="1" height="1" /></bezel>
- <bezel name="5.37" element="led"><bounds x="10" y="74" width="1" height="1" /></bezel>
- <bezel name="5.38" element="led"><bounds x="10" y="76" width="1" height="1" /></bezel>
- <bezel name="5.39" element="led"><bounds x="10" y="78" width="1" height="1" /></bezel>
-
- <bezel name="6.0" element="led"><bounds x="12" y="0" width="1" height="1" /></bezel>
- <bezel name="6.1" element="led"><bounds x="12" y="2" width="1" height="1" /></bezel>
- <bezel name="6.2" element="led"><bounds x="12" y="4" width="1" height="1" /></bezel>
- <bezel name="6.3" element="led"><bounds x="12" y="6" width="1" height="1" /></bezel>
- <bezel name="6.4" element="led"><bounds x="12" y="8" width="1" height="1" /></bezel>
- <bezel name="6.5" element="led"><bounds x="12" y="10" width="1" height="1" /></bezel>
- <bezel name="6.6" element="led"><bounds x="12" y="12" width="1" height="1" /></bezel>
- <bezel name="6.7" element="led"><bounds x="12" y="14" width="1" height="1" /></bezel>
- <bezel name="6.8" element="led"><bounds x="12" y="16" width="1" height="1" /></bezel>
- <bezel name="6.9" element="led"><bounds x="12" y="18" width="1" height="1" /></bezel>
- <bezel name="6.10" element="led"><bounds x="12" y="20" width="1" height="1" /></bezel>
- <bezel name="6.11" element="led"><bounds x="12" y="22" width="1" height="1" /></bezel>
- <bezel name="6.12" element="led"><bounds x="12" y="24" width="1" height="1" /></bezel>
- <bezel name="6.13" element="led"><bounds x="12" y="26" width="1" height="1" /></bezel>
- <bezel name="6.14" element="led"><bounds x="12" y="28" width="1" height="1" /></bezel>
- <bezel name="6.15" element="led"><bounds x="12" y="30" width="1" height="1" /></bezel>
- <bezel name="6.16" element="led"><bounds x="12" y="32" width="1" height="1" /></bezel>
- <bezel name="6.17" element="led"><bounds x="12" y="34" width="1" height="1" /></bezel>
- <bezel name="6.18" element="led"><bounds x="12" y="36" width="1" height="1" /></bezel>
- <bezel name="6.19" element="led"><bounds x="12" y="38" width="1" height="1" /></bezel>
- <bezel name="6.20" element="led"><bounds x="12" y="40" width="1" height="1" /></bezel>
- <bezel name="6.21" element="led"><bounds x="12" y="42" width="1" height="1" /></bezel>
- <bezel name="6.22" element="led"><bounds x="12" y="44" width="1" height="1" /></bezel>
- <bezel name="6.23" element="led"><bounds x="12" y="46" width="1" height="1" /></bezel>
- <bezel name="6.24" element="led"><bounds x="12" y="48" width="1" height="1" /></bezel>
- <bezel name="6.25" element="led"><bounds x="12" y="50" width="1" height="1" /></bezel>
- <bezel name="6.26" element="led"><bounds x="12" y="52" width="1" height="1" /></bezel>
- <bezel name="6.27" element="led"><bounds x="12" y="54" width="1" height="1" /></bezel>
- <bezel name="6.28" element="led"><bounds x="12" y="56" width="1" height="1" /></bezel>
- <bezel name="6.29" element="led"><bounds x="12" y="58" width="1" height="1" /></bezel>
- <bezel name="6.30" element="led"><bounds x="12" y="60" width="1" height="1" /></bezel>
- <bezel name="6.31" element="led"><bounds x="12" y="62" width="1" height="1" /></bezel>
- <bezel name="6.32" element="led"><bounds x="12" y="64" width="1" height="1" /></bezel>
- <bezel name="6.33" element="led"><bounds x="12" y="66" width="1" height="1" /></bezel>
- <bezel name="6.34" element="led"><bounds x="12" y="68" width="1" height="1" /></bezel>
- <bezel name="6.35" element="led"><bounds x="12" y="70" width="1" height="1" /></bezel>
- <bezel name="6.36" element="led"><bounds x="12" y="72" width="1" height="1" /></bezel>
- <bezel name="6.37" element="led"><bounds x="12" y="74" width="1" height="1" /></bezel>
- <bezel name="6.38" element="led"><bounds x="12" y="76" width="1" height="1" /></bezel>
- <bezel name="6.39" element="led"><bounds x="12" y="78" width="1" height="1" /></bezel>
-
- <bezel name="7.0" element="led"><bounds x="14" y="0" width="1" height="1" /></bezel>
- <bezel name="7.1" element="led"><bounds x="14" y="2" width="1" height="1" /></bezel>
- <bezel name="7.2" element="led"><bounds x="14" y="4" width="1" height="1" /></bezel>
- <bezel name="7.3" element="led"><bounds x="14" y="6" width="1" height="1" /></bezel>
- <bezel name="7.4" element="led"><bounds x="14" y="8" width="1" height="1" /></bezel>
- <bezel name="7.5" element="led"><bounds x="14" y="10" width="1" height="1" /></bezel>
- <bezel name="7.6" element="led"><bounds x="14" y="12" width="1" height="1" /></bezel>
- <bezel name="7.7" element="led"><bounds x="14" y="14" width="1" height="1" /></bezel>
- <bezel name="7.8" element="led"><bounds x="14" y="16" width="1" height="1" /></bezel>
- <bezel name="7.9" element="led"><bounds x="14" y="18" width="1" height="1" /></bezel>
- <bezel name="7.10" element="led"><bounds x="14" y="20" width="1" height="1" /></bezel>
- <bezel name="7.11" element="led"><bounds x="14" y="22" width="1" height="1" /></bezel>
- <bezel name="7.12" element="led"><bounds x="14" y="24" width="1" height="1" /></bezel>
- <bezel name="7.13" element="led"><bounds x="14" y="26" width="1" height="1" /></bezel>
- <bezel name="7.14" element="led"><bounds x="14" y="28" width="1" height="1" /></bezel>
- <bezel name="7.15" element="led"><bounds x="14" y="30" width="1" height="1" /></bezel>
- <bezel name="7.16" element="led"><bounds x="14" y="32" width="1" height="1" /></bezel>
- <bezel name="7.17" element="led"><bounds x="14" y="34" width="1" height="1" /></bezel>
- <bezel name="7.18" element="led"><bounds x="14" y="36" width="1" height="1" /></bezel>
- <bezel name="7.19" element="led"><bounds x="14" y="38" width="1" height="1" /></bezel>
- <bezel name="7.20" element="led"><bounds x="14" y="40" width="1" height="1" /></bezel>
- <bezel name="7.21" element="led"><bounds x="14" y="42" width="1" height="1" /></bezel>
- <bezel name="7.22" element="led"><bounds x="14" y="44" width="1" height="1" /></bezel>
- <bezel name="7.23" element="led"><bounds x="14" y="46" width="1" height="1" /></bezel>
- <bezel name="7.24" element="led"><bounds x="14" y="48" width="1" height="1" /></bezel>
- <bezel name="7.25" element="led"><bounds x="14" y="50" width="1" height="1" /></bezel>
- <bezel name="7.26" element="led"><bounds x="14" y="52" width="1" height="1" /></bezel>
- <bezel name="7.27" element="led"><bounds x="14" y="54" width="1" height="1" /></bezel>
- <bezel name="7.28" element="led"><bounds x="14" y="56" width="1" height="1" /></bezel>
- <bezel name="7.29" element="led"><bounds x="14" y="58" width="1" height="1" /></bezel>
- <bezel name="7.30" element="led"><bounds x="14" y="60" width="1" height="1" /></bezel>
- <bezel name="7.31" element="led"><bounds x="14" y="62" width="1" height="1" /></bezel>
- <bezel name="7.32" element="led"><bounds x="14" y="64" width="1" height="1" /></bezel>
- <bezel name="7.33" element="led"><bounds x="14" y="66" width="1" height="1" /></bezel>
- <bezel name="7.34" element="led"><bounds x="14" y="68" width="1" height="1" /></bezel>
- <bezel name="7.35" element="led"><bounds x="14" y="70" width="1" height="1" /></bezel>
- <bezel name="7.36" element="led"><bounds x="14" y="72" width="1" height="1" /></bezel>
- <bezel name="7.37" element="led"><bounds x="14" y="74" width="1" height="1" /></bezel>
- <bezel name="7.38" element="led"><bounds x="14" y="76" width="1" height="1" /></bezel>
- <bezel name="7.39" element="led"><bounds x="14" y="78" width="1" height="1" /></bezel>
-
- <bezel name="8.0" element="led"><bounds x="16" y="0" width="1" height="1" /></bezel>
- <bezel name="8.1" element="led"><bounds x="16" y="2" width="1" height="1" /></bezel>
- <bezel name="8.2" element="led"><bounds x="16" y="4" width="1" height="1" /></bezel>
- <bezel name="8.3" element="led"><bounds x="16" y="6" width="1" height="1" /></bezel>
- <bezel name="8.4" element="led"><bounds x="16" y="8" width="1" height="1" /></bezel>
- <bezel name="8.5" element="led"><bounds x="16" y="10" width="1" height="1" /></bezel>
- <bezel name="8.6" element="led"><bounds x="16" y="12" width="1" height="1" /></bezel>
- <bezel name="8.7" element="led"><bounds x="16" y="14" width="1" height="1" /></bezel>
- <bezel name="8.8" element="led"><bounds x="16" y="16" width="1" height="1" /></bezel>
- <bezel name="8.9" element="led"><bounds x="16" y="18" width="1" height="1" /></bezel>
- <bezel name="8.10" element="led"><bounds x="16" y="20" width="1" height="1" /></bezel>
- <bezel name="8.11" element="led"><bounds x="16" y="22" width="1" height="1" /></bezel>
- <bezel name="8.12" element="led"><bounds x="16" y="24" width="1" height="1" /></bezel>
- <bezel name="8.13" element="led"><bounds x="16" y="26" width="1" height="1" /></bezel>
- <bezel name="8.14" element="led"><bounds x="16" y="28" width="1" height="1" /></bezel>
- <bezel name="8.15" element="led"><bounds x="16" y="30" width="1" height="1" /></bezel>
- <bezel name="8.16" element="led"><bounds x="16" y="32" width="1" height="1" /></bezel>
- <bezel name="8.17" element="led"><bounds x="16" y="34" width="1" height="1" /></bezel>
- <bezel name="8.18" element="led"><bounds x="16" y="36" width="1" height="1" /></bezel>
- <bezel name="8.19" element="led"><bounds x="16" y="38" width="1" height="1" /></bezel>
- <bezel name="8.20" element="led"><bounds x="16" y="40" width="1" height="1" /></bezel>
- <bezel name="8.21" element="led"><bounds x="16" y="42" width="1" height="1" /></bezel>
- <bezel name="8.22" element="led"><bounds x="16" y="44" width="1" height="1" /></bezel>
- <bezel name="8.23" element="led"><bounds x="16" y="46" width="1" height="1" /></bezel>
- <bezel name="8.24" element="led"><bounds x="16" y="48" width="1" height="1" /></bezel>
- <bezel name="8.25" element="led"><bounds x="16" y="50" width="1" height="1" /></bezel>
- <bezel name="8.26" element="led"><bounds x="16" y="52" width="1" height="1" /></bezel>
- <bezel name="8.27" element="led"><bounds x="16" y="54" width="1" height="1" /></bezel>
- <bezel name="8.28" element="led"><bounds x="16" y="56" width="1" height="1" /></bezel>
- <bezel name="8.29" element="led"><bounds x="16" y="58" width="1" height="1" /></bezel>
- <bezel name="8.30" element="led"><bounds x="16" y="60" width="1" height="1" /></bezel>
- <bezel name="8.31" element="led"><bounds x="16" y="62" width="1" height="1" /></bezel>
- <bezel name="8.32" element="led"><bounds x="16" y="64" width="1" height="1" /></bezel>
- <bezel name="8.33" element="led"><bounds x="16" y="66" width="1" height="1" /></bezel>
- <bezel name="8.34" element="led"><bounds x="16" y="68" width="1" height="1" /></bezel>
- <bezel name="8.35" element="led"><bounds x="16" y="70" width="1" height="1" /></bezel>
- <bezel name="8.36" element="led"><bounds x="16" y="72" width="1" height="1" /></bezel>
- <bezel name="8.37" element="led"><bounds x="16" y="74" width="1" height="1" /></bezel>
- <bezel name="8.38" element="led"><bounds x="16" y="76" width="1" height="1" /></bezel>
- <bezel name="8.39" element="led"><bounds x="16" y="78" width="1" height="1" /></bezel>
-
- <bezel name="9.0" element="led"><bounds x="18" y="0" width="1" height="1" /></bezel>
- <bezel name="9.1" element="led"><bounds x="18" y="2" width="1" height="1" /></bezel>
- <bezel name="9.2" element="led"><bounds x="18" y="4" width="1" height="1" /></bezel>
- <bezel name="9.3" element="led"><bounds x="18" y="6" width="1" height="1" /></bezel>
- <bezel name="9.4" element="led"><bounds x="18" y="8" width="1" height="1" /></bezel>
- <bezel name="9.5" element="led"><bounds x="18" y="10" width="1" height="1" /></bezel>
- <bezel name="9.6" element="led"><bounds x="18" y="12" width="1" height="1" /></bezel>
- <bezel name="9.7" element="led"><bounds x="18" y="14" width="1" height="1" /></bezel>
- <bezel name="9.8" element="led"><bounds x="18" y="16" width="1" height="1" /></bezel>
- <bezel name="9.9" element="led"><bounds x="18" y="18" width="1" height="1" /></bezel>
- <bezel name="9.10" element="led"><bounds x="18" y="20" width="1" height="1" /></bezel>
- <bezel name="9.11" element="led"><bounds x="18" y="22" width="1" height="1" /></bezel>
- <bezel name="9.12" element="led"><bounds x="18" y="24" width="1" height="1" /></bezel>
- <bezel name="9.13" element="led"><bounds x="18" y="26" width="1" height="1" /></bezel>
- <bezel name="9.14" element="led"><bounds x="18" y="28" width="1" height="1" /></bezel>
- <bezel name="9.15" element="led"><bounds x="18" y="30" width="1" height="1" /></bezel>
- <bezel name="9.16" element="led"><bounds x="18" y="32" width="1" height="1" /></bezel>
- <bezel name="9.17" element="led"><bounds x="18" y="34" width="1" height="1" /></bezel>
- <bezel name="9.18" element="led"><bounds x="18" y="36" width="1" height="1" /></bezel>
- <bezel name="9.19" element="led"><bounds x="18" y="38" width="1" height="1" /></bezel>
- <bezel name="9.20" element="led"><bounds x="18" y="40" width="1" height="1" /></bezel>
- <bezel name="9.21" element="led"><bounds x="18" y="42" width="1" height="1" /></bezel>
- <bezel name="9.22" element="led"><bounds x="18" y="44" width="1" height="1" /></bezel>
- <bezel name="9.23" element="led"><bounds x="18" y="46" width="1" height="1" /></bezel>
- <bezel name="9.24" element="led"><bounds x="18" y="48" width="1" height="1" /></bezel>
- <bezel name="9.25" element="led"><bounds x="18" y="50" width="1" height="1" /></bezel>
- <bezel name="9.26" element="led"><bounds x="18" y="52" width="1" height="1" /></bezel>
- <bezel name="9.27" element="led"><bounds x="18" y="54" width="1" height="1" /></bezel>
- <bezel name="9.28" element="led"><bounds x="18" y="56" width="1" height="1" /></bezel>
- <bezel name="9.29" element="led"><bounds x="18" y="58" width="1" height="1" /></bezel>
- <bezel name="9.30" element="led"><bounds x="18" y="60" width="1" height="1" /></bezel>
- <bezel name="9.31" element="led"><bounds x="18" y="62" width="1" height="1" /></bezel>
- <bezel name="9.32" element="led"><bounds x="18" y="64" width="1" height="1" /></bezel>
- <bezel name="9.33" element="led"><bounds x="18" y="66" width="1" height="1" /></bezel>
- <bezel name="9.34" element="led"><bounds x="18" y="68" width="1" height="1" /></bezel>
- <bezel name="9.35" element="led"><bounds x="18" y="70" width="1" height="1" /></bezel>
- <bezel name="9.36" element="led"><bounds x="18" y="72" width="1" height="1" /></bezel>
- <bezel name="9.37" element="led"><bounds x="18" y="74" width="1" height="1" /></bezel>
- <bezel name="9.38" element="led"><bounds x="18" y="76" width="1" height="1" /></bezel>
- <bezel name="9.39" element="led"><bounds x="18" y="78" width="1" height="1" /></bezel>
-
- <bezel name="10.0" element="led"><bounds x="20" y="0" width="1" height="1" /></bezel>
- <bezel name="10.1" element="led"><bounds x="20" y="2" width="1" height="1" /></bezel>
- <bezel name="10.2" element="led"><bounds x="20" y="4" width="1" height="1" /></bezel>
- <bezel name="10.3" element="led"><bounds x="20" y="6" width="1" height="1" /></bezel>
- <bezel name="10.4" element="led"><bounds x="20" y="8" width="1" height="1" /></bezel>
- <bezel name="10.5" element="led"><bounds x="20" y="10" width="1" height="1" /></bezel>
- <bezel name="10.6" element="led"><bounds x="20" y="12" width="1" height="1" /></bezel>
- <bezel name="10.7" element="led"><bounds x="20" y="14" width="1" height="1" /></bezel>
- <bezel name="10.8" element="led"><bounds x="20" y="16" width="1" height="1" /></bezel>
- <bezel name="10.9" element="led"><bounds x="20" y="18" width="1" height="1" /></bezel>
- <bezel name="10.10" element="led"><bounds x="20" y="20" width="1" height="1" /></bezel>
- <bezel name="10.11" element="led"><bounds x="20" y="22" width="1" height="1" /></bezel>
- <bezel name="10.12" element="led"><bounds x="20" y="24" width="1" height="1" /></bezel>
- <bezel name="10.13" element="led"><bounds x="20" y="26" width="1" height="1" /></bezel>
- <bezel name="10.14" element="led"><bounds x="20" y="28" width="1" height="1" /></bezel>
- <bezel name="10.15" element="led"><bounds x="20" y="30" width="1" height="1" /></bezel>
- <bezel name="10.16" element="led"><bounds x="20" y="32" width="1" height="1" /></bezel>
- <bezel name="10.17" element="led"><bounds x="20" y="34" width="1" height="1" /></bezel>
- <bezel name="10.18" element="led"><bounds x="20" y="36" width="1" height="1" /></bezel>
- <bezel name="10.19" element="led"><bounds x="20" y="38" width="1" height="1" /></bezel>
- <bezel name="10.20" element="led"><bounds x="20" y="40" width="1" height="1" /></bezel>
- <bezel name="10.21" element="led"><bounds x="20" y="42" width="1" height="1" /></bezel>
- <bezel name="10.22" element="led"><bounds x="20" y="44" width="1" height="1" /></bezel>
- <bezel name="10.23" element="led"><bounds x="20" y="46" width="1" height="1" /></bezel>
- <bezel name="10.24" element="led"><bounds x="20" y="48" width="1" height="1" /></bezel>
- <bezel name="10.25" element="led"><bounds x="20" y="50" width="1" height="1" /></bezel>
- <bezel name="10.26" element="led"><bounds x="20" y="52" width="1" height="1" /></bezel>
- <bezel name="10.27" element="led"><bounds x="20" y="54" width="1" height="1" /></bezel>
- <bezel name="10.28" element="led"><bounds x="20" y="56" width="1" height="1" /></bezel>
- <bezel name="10.29" element="led"><bounds x="20" y="58" width="1" height="1" /></bezel>
- <bezel name="10.30" element="led"><bounds x="20" y="60" width="1" height="1" /></bezel>
- <bezel name="10.31" element="led"><bounds x="20" y="62" width="1" height="1" /></bezel>
- <bezel name="10.32" element="led"><bounds x="20" y="64" width="1" height="1" /></bezel>
- <bezel name="10.33" element="led"><bounds x="20" y="66" width="1" height="1" /></bezel>
- <bezel name="10.34" element="led"><bounds x="20" y="68" width="1" height="1" /></bezel>
- <bezel name="10.35" element="led"><bounds x="20" y="70" width="1" height="1" /></bezel>
- <bezel name="10.36" element="led"><bounds x="20" y="72" width="1" height="1" /></bezel>
- <bezel name="10.37" element="led"><bounds x="20" y="74" width="1" height="1" /></bezel>
- <bezel name="10.38" element="led"><bounds x="20" y="76" width="1" height="1" /></bezel>
- <bezel name="10.39" element="led"><bounds x="20" y="78" width="1" height="1" /></bezel>
-
- <bezel name="11.0" element="led"><bounds x="22" y="0" width="1" height="1" /></bezel>
- <bezel name="11.1" element="led"><bounds x="22" y="2" width="1" height="1" /></bezel>
- <bezel name="11.2" element="led"><bounds x="22" y="4" width="1" height="1" /></bezel>
- <bezel name="11.3" element="led"><bounds x="22" y="6" width="1" height="1" /></bezel>
- <bezel name="11.4" element="led"><bounds x="22" y="8" width="1" height="1" /></bezel>
- <bezel name="11.5" element="led"><bounds x="22" y="10" width="1" height="1" /></bezel>
- <bezel name="11.6" element="led"><bounds x="22" y="12" width="1" height="1" /></bezel>
- <bezel name="11.7" element="led"><bounds x="22" y="14" width="1" height="1" /></bezel>
- <bezel name="11.8" element="led"><bounds x="22" y="16" width="1" height="1" /></bezel>
- <bezel name="11.9" element="led"><bounds x="22" y="18" width="1" height="1" /></bezel>
- <bezel name="11.10" element="led"><bounds x="22" y="20" width="1" height="1" /></bezel>
- <bezel name="11.11" element="led"><bounds x="22" y="22" width="1" height="1" /></bezel>
- <bezel name="11.12" element="led"><bounds x="22" y="24" width="1" height="1" /></bezel>
- <bezel name="11.13" element="led"><bounds x="22" y="26" width="1" height="1" /></bezel>
- <bezel name="11.14" element="led"><bounds x="22" y="28" width="1" height="1" /></bezel>
- <bezel name="11.15" element="led"><bounds x="22" y="30" width="1" height="1" /></bezel>
- <bezel name="11.16" element="led"><bounds x="22" y="32" width="1" height="1" /></bezel>
- <bezel name="11.17" element="led"><bounds x="22" y="34" width="1" height="1" /></bezel>
- <bezel name="11.18" element="led"><bounds x="22" y="36" width="1" height="1" /></bezel>
- <bezel name="11.19" element="led"><bounds x="22" y="38" width="1" height="1" /></bezel>
- <bezel name="11.20" element="led"><bounds x="22" y="40" width="1" height="1" /></bezel>
- <bezel name="11.21" element="led"><bounds x="22" y="42" width="1" height="1" /></bezel>
- <bezel name="11.22" element="led"><bounds x="22" y="44" width="1" height="1" /></bezel>
- <bezel name="11.23" element="led"><bounds x="22" y="46" width="1" height="1" /></bezel>
- <bezel name="11.24" element="led"><bounds x="22" y="48" width="1" height="1" /></bezel>
- <bezel name="11.25" element="led"><bounds x="22" y="50" width="1" height="1" /></bezel>
- <bezel name="11.26" element="led"><bounds x="22" y="52" width="1" height="1" /></bezel>
- <bezel name="11.27" element="led"><bounds x="22" y="54" width="1" height="1" /></bezel>
- <bezel name="11.28" element="led"><bounds x="22" y="56" width="1" height="1" /></bezel>
- <bezel name="11.29" element="led"><bounds x="22" y="58" width="1" height="1" /></bezel>
- <bezel name="11.30" element="led"><bounds x="22" y="60" width="1" height="1" /></bezel>
- <bezel name="11.31" element="led"><bounds x="22" y="62" width="1" height="1" /></bezel>
- <bezel name="11.32" element="led"><bounds x="22" y="64" width="1" height="1" /></bezel>
- <bezel name="11.33" element="led"><bounds x="22" y="66" width="1" height="1" /></bezel>
- <bezel name="11.34" element="led"><bounds x="22" y="68" width="1" height="1" /></bezel>
- <bezel name="11.35" element="led"><bounds x="22" y="70" width="1" height="1" /></bezel>
- <bezel name="11.36" element="led"><bounds x="22" y="72" width="1" height="1" /></bezel>
- <bezel name="11.37" element="led"><bounds x="22" y="74" width="1" height="1" /></bezel>
- <bezel name="11.38" element="led"><bounds x="22" y="76" width="1" height="1" /></bezel>
- <bezel name="11.39" element="led"><bounds x="22" y="78" width="1" height="1" /></bezel>
-
- <bezel name="12.0" element="led"><bounds x="24" y="0" width="1" height="1" /></bezel>
- <bezel name="12.1" element="led"><bounds x="24" y="2" width="1" height="1" /></bezel>
- <bezel name="12.2" element="led"><bounds x="24" y="4" width="1" height="1" /></bezel>
- <bezel name="12.3" element="led"><bounds x="24" y="6" width="1" height="1" /></bezel>
- <bezel name="12.4" element="led"><bounds x="24" y="8" width="1" height="1" /></bezel>
- <bezel name="12.5" element="led"><bounds x="24" y="10" width="1" height="1" /></bezel>
- <bezel name="12.6" element="led"><bounds x="24" y="12" width="1" height="1" /></bezel>
- <bezel name="12.7" element="led"><bounds x="24" y="14" width="1" height="1" /></bezel>
- <bezel name="12.8" element="led"><bounds x="24" y="16" width="1" height="1" /></bezel>
- <bezel name="12.9" element="led"><bounds x="24" y="18" width="1" height="1" /></bezel>
- <bezel name="12.10" element="led"><bounds x="24" y="20" width="1" height="1" /></bezel>
- <bezel name="12.11" element="led"><bounds x="24" y="22" width="1" height="1" /></bezel>
- <bezel name="12.12" element="led"><bounds x="24" y="24" width="1" height="1" /></bezel>
- <bezel name="12.13" element="led"><bounds x="24" y="26" width="1" height="1" /></bezel>
- <bezel name="12.14" element="led"><bounds x="24" y="28" width="1" height="1" /></bezel>
- <bezel name="12.15" element="led"><bounds x="24" y="30" width="1" height="1" /></bezel>
- <bezel name="12.16" element="led"><bounds x="24" y="32" width="1" height="1" /></bezel>
- <bezel name="12.17" element="led"><bounds x="24" y="34" width="1" height="1" /></bezel>
- <bezel name="12.18" element="led"><bounds x="24" y="36" width="1" height="1" /></bezel>
- <bezel name="12.19" element="led"><bounds x="24" y="38" width="1" height="1" /></bezel>
- <bezel name="12.20" element="led"><bounds x="24" y="40" width="1" height="1" /></bezel>
- <bezel name="12.21" element="led"><bounds x="24" y="42" width="1" height="1" /></bezel>
- <bezel name="12.22" element="led"><bounds x="24" y="44" width="1" height="1" /></bezel>
- <bezel name="12.23" element="led"><bounds x="24" y="46" width="1" height="1" /></bezel>
- <bezel name="12.24" element="led"><bounds x="24" y="48" width="1" height="1" /></bezel>
- <bezel name="12.25" element="led"><bounds x="24" y="50" width="1" height="1" /></bezel>
- <bezel name="12.26" element="led"><bounds x="24" y="52" width="1" height="1" /></bezel>
- <bezel name="12.27" element="led"><bounds x="24" y="54" width="1" height="1" /></bezel>
- <bezel name="12.28" element="led"><bounds x="24" y="56" width="1" height="1" /></bezel>
- <bezel name="12.29" element="led"><bounds x="24" y="58" width="1" height="1" /></bezel>
- <bezel name="12.30" element="led"><bounds x="24" y="60" width="1" height="1" /></bezel>
- <bezel name="12.31" element="led"><bounds x="24" y="62" width="1" height="1" /></bezel>
- <bezel name="12.32" element="led"><bounds x="24" y="64" width="1" height="1" /></bezel>
- <bezel name="12.33" element="led"><bounds x="24" y="66" width="1" height="1" /></bezel>
- <bezel name="12.34" element="led"><bounds x="24" y="68" width="1" height="1" /></bezel>
- <bezel name="12.35" element="led"><bounds x="24" y="70" width="1" height="1" /></bezel>
- <bezel name="12.36" element="led"><bounds x="24" y="72" width="1" height="1" /></bezel>
- <bezel name="12.37" element="led"><bounds x="24" y="74" width="1" height="1" /></bezel>
- <bezel name="12.38" element="led"><bounds x="24" y="76" width="1" height="1" /></bezel>
- <bezel name="12.39" element="led"><bounds x="24" y="78" width="1" height="1" /></bezel>
-
- <bezel name="13.0" element="led"><bounds x="26" y="0" width="1" height="1" /></bezel>
- <bezel name="13.1" element="led"><bounds x="26" y="2" width="1" height="1" /></bezel>
- <bezel name="13.2" element="led"><bounds x="26" y="4" width="1" height="1" /></bezel>
- <bezel name="13.3" element="led"><bounds x="26" y="6" width="1" height="1" /></bezel>
- <bezel name="13.4" element="led"><bounds x="26" y="8" width="1" height="1" /></bezel>
- <bezel name="13.5" element="led"><bounds x="26" y="10" width="1" height="1" /></bezel>
- <bezel name="13.6" element="led"><bounds x="26" y="12" width="1" height="1" /></bezel>
- <bezel name="13.7" element="led"><bounds x="26" y="14" width="1" height="1" /></bezel>
- <bezel name="13.8" element="led"><bounds x="26" y="16" width="1" height="1" /></bezel>
- <bezel name="13.9" element="led"><bounds x="26" y="18" width="1" height="1" /></bezel>
- <bezel name="13.10" element="led"><bounds x="26" y="20" width="1" height="1" /></bezel>
- <bezel name="13.11" element="led"><bounds x="26" y="22" width="1" height="1" /></bezel>
- <bezel name="13.12" element="led"><bounds x="26" y="24" width="1" height="1" /></bezel>
- <bezel name="13.13" element="led"><bounds x="26" y="26" width="1" height="1" /></bezel>
- <bezel name="13.14" element="led"><bounds x="26" y="28" width="1" height="1" /></bezel>
- <bezel name="13.15" element="led"><bounds x="26" y="30" width="1" height="1" /></bezel>
- <bezel name="13.16" element="led"><bounds x="26" y="32" width="1" height="1" /></bezel>
- <bezel name="13.17" element="led"><bounds x="26" y="34" width="1" height="1" /></bezel>
- <bezel name="13.18" element="led"><bounds x="26" y="36" width="1" height="1" /></bezel>
- <bezel name="13.19" element="led"><bounds x="26" y="38" width="1" height="1" /></bezel>
- <bezel name="13.20" element="led"><bounds x="26" y="40" width="1" height="1" /></bezel>
- <bezel name="13.21" element="led"><bounds x="26" y="42" width="1" height="1" /></bezel>
- <bezel name="13.22" element="led"><bounds x="26" y="44" width="1" height="1" /></bezel>
- <bezel name="13.23" element="led"><bounds x="26" y="46" width="1" height="1" /></bezel>
- <bezel name="13.24" element="led"><bounds x="26" y="48" width="1" height="1" /></bezel>
- <bezel name="13.25" element="led"><bounds x="26" y="50" width="1" height="1" /></bezel>
- <bezel name="13.26" element="led"><bounds x="26" y="52" width="1" height="1" /></bezel>
- <bezel name="13.27" element="led"><bounds x="26" y="54" width="1" height="1" /></bezel>
- <bezel name="13.28" element="led"><bounds x="26" y="56" width="1" height="1" /></bezel>
- <bezel name="13.29" element="led"><bounds x="26" y="58" width="1" height="1" /></bezel>
- <bezel name="13.30" element="led"><bounds x="26" y="60" width="1" height="1" /></bezel>
- <bezel name="13.31" element="led"><bounds x="26" y="62" width="1" height="1" /></bezel>
- <bezel name="13.32" element="led"><bounds x="26" y="64" width="1" height="1" /></bezel>
- <bezel name="13.33" element="led"><bounds x="26" y="66" width="1" height="1" /></bezel>
- <bezel name="13.34" element="led"><bounds x="26" y="68" width="1" height="1" /></bezel>
- <bezel name="13.35" element="led"><bounds x="26" y="70" width="1" height="1" /></bezel>
- <bezel name="13.36" element="led"><bounds x="26" y="72" width="1" height="1" /></bezel>
- <bezel name="13.37" element="led"><bounds x="26" y="74" width="1" height="1" /></bezel>
- <bezel name="13.38" element="led"><bounds x="26" y="76" width="1" height="1" /></bezel>
- <bezel name="13.39" element="led"><bounds x="26" y="78" width="1" height="1" /></bezel>
-
- <bezel name="14.0" element="led"><bounds x="28" y="0" width="1" height="1" /></bezel>
- <bezel name="14.1" element="led"><bounds x="28" y="2" width="1" height="1" /></bezel>
- <bezel name="14.2" element="led"><bounds x="28" y="4" width="1" height="1" /></bezel>
- <bezel name="14.3" element="led"><bounds x="28" y="6" width="1" height="1" /></bezel>
- <bezel name="14.4" element="led"><bounds x="28" y="8" width="1" height="1" /></bezel>
- <bezel name="14.5" element="led"><bounds x="28" y="10" width="1" height="1" /></bezel>
- <bezel name="14.6" element="led"><bounds x="28" y="12" width="1" height="1" /></bezel>
- <bezel name="14.7" element="led"><bounds x="28" y="14" width="1" height="1" /></bezel>
- <bezel name="14.8" element="led"><bounds x="28" y="16" width="1" height="1" /></bezel>
- <bezel name="14.9" element="led"><bounds x="28" y="18" width="1" height="1" /></bezel>
- <bezel name="14.10" element="led"><bounds x="28" y="20" width="1" height="1" /></bezel>
- <bezel name="14.11" element="led"><bounds x="28" y="22" width="1" height="1" /></bezel>
- <bezel name="14.12" element="led"><bounds x="28" y="24" width="1" height="1" /></bezel>
- <bezel name="14.13" element="led"><bounds x="28" y="26" width="1" height="1" /></bezel>
- <bezel name="14.14" element="led"><bounds x="28" y="28" width="1" height="1" /></bezel>
- <bezel name="14.15" element="led"><bounds x="28" y="30" width="1" height="1" /></bezel>
- <bezel name="14.16" element="led"><bounds x="28" y="32" width="1" height="1" /></bezel>
- <bezel name="14.17" element="led"><bounds x="28" y="34" width="1" height="1" /></bezel>
- <bezel name="14.18" element="led"><bounds x="28" y="36" width="1" height="1" /></bezel>
- <bezel name="14.19" element="led"><bounds x="28" y="38" width="1" height="1" /></bezel>
- <bezel name="14.20" element="led"><bounds x="28" y="40" width="1" height="1" /></bezel>
- <bezel name="14.21" element="led"><bounds x="28" y="42" width="1" height="1" /></bezel>
- <bezel name="14.22" element="led"><bounds x="28" y="44" width="1" height="1" /></bezel>
- <bezel name="14.23" element="led"><bounds x="28" y="46" width="1" height="1" /></bezel>
- <bezel name="14.24" element="led"><bounds x="28" y="48" width="1" height="1" /></bezel>
- <bezel name="14.25" element="led"><bounds x="28" y="50" width="1" height="1" /></bezel>
- <bezel name="14.26" element="led"><bounds x="28" y="52" width="1" height="1" /></bezel>
- <bezel name="14.27" element="led"><bounds x="28" y="54" width="1" height="1" /></bezel>
- <bezel name="14.28" element="led"><bounds x="28" y="56" width="1" height="1" /></bezel>
- <bezel name="14.29" element="led"><bounds x="28" y="58" width="1" height="1" /></bezel>
- <bezel name="14.30" element="led"><bounds x="28" y="60" width="1" height="1" /></bezel>
- <bezel name="14.31" element="led"><bounds x="28" y="62" width="1" height="1" /></bezel>
- <bezel name="14.32" element="led"><bounds x="28" y="64" width="1" height="1" /></bezel>
- <bezel name="14.33" element="led"><bounds x="28" y="66" width="1" height="1" /></bezel>
- <bezel name="14.34" element="led"><bounds x="28" y="68" width="1" height="1" /></bezel>
- <bezel name="14.35" element="led"><bounds x="28" y="70" width="1" height="1" /></bezel>
- <bezel name="14.36" element="led"><bounds x="28" y="72" width="1" height="1" /></bezel>
- <bezel name="14.37" element="led"><bounds x="28" y="74" width="1" height="1" /></bezel>
- <bezel name="14.38" element="led"><bounds x="28" y="76" width="1" height="1" /></bezel>
- <bezel name="14.39" element="led"><bounds x="28" y="78" width="1" height="1" /></bezel>
-
- <bezel name="15.0" element="led"><bounds x="30" y="0" width="1" height="1" /></bezel>
- <bezel name="15.1" element="led"><bounds x="30" y="2" width="1" height="1" /></bezel>
- <bezel name="15.2" element="led"><bounds x="30" y="4" width="1" height="1" /></bezel>
- <bezel name="15.3" element="led"><bounds x="30" y="6" width="1" height="1" /></bezel>
- <bezel name="15.4" element="led"><bounds x="30" y="8" width="1" height="1" /></bezel>
- <bezel name="15.5" element="led"><bounds x="30" y="10" width="1" height="1" /></bezel>
- <bezel name="15.6" element="led"><bounds x="30" y="12" width="1" height="1" /></bezel>
- <bezel name="15.7" element="led"><bounds x="30" y="14" width="1" height="1" /></bezel>
- <bezel name="15.8" element="led"><bounds x="30" y="16" width="1" height="1" /></bezel>
- <bezel name="15.9" element="led"><bounds x="30" y="18" width="1" height="1" /></bezel>
- <bezel name="15.10" element="led"><bounds x="30" y="20" width="1" height="1" /></bezel>
- <bezel name="15.11" element="led"><bounds x="30" y="22" width="1" height="1" /></bezel>
- <bezel name="15.12" element="led"><bounds x="30" y="24" width="1" height="1" /></bezel>
- <bezel name="15.13" element="led"><bounds x="30" y="26" width="1" height="1" /></bezel>
- <bezel name="15.14" element="led"><bounds x="30" y="28" width="1" height="1" /></bezel>
- <bezel name="15.15" element="led"><bounds x="30" y="30" width="1" height="1" /></bezel>
- <bezel name="15.16" element="led"><bounds x="30" y="32" width="1" height="1" /></bezel>
- <bezel name="15.17" element="led"><bounds x="30" y="34" width="1" height="1" /></bezel>
- <bezel name="15.18" element="led"><bounds x="30" y="36" width="1" height="1" /></bezel>
- <bezel name="15.19" element="led"><bounds x="30" y="38" width="1" height="1" /></bezel>
- <bezel name="15.20" element="led"><bounds x="30" y="40" width="1" height="1" /></bezel>
- <bezel name="15.21" element="led"><bounds x="30" y="42" width="1" height="1" /></bezel>
- <bezel name="15.22" element="led"><bounds x="30" y="44" width="1" height="1" /></bezel>
- <bezel name="15.23" element="led"><bounds x="30" y="46" width="1" height="1" /></bezel>
- <bezel name="15.24" element="led"><bounds x="30" y="48" width="1" height="1" /></bezel>
- <bezel name="15.25" element="led"><bounds x="30" y="50" width="1" height="1" /></bezel>
- <bezel name="15.26" element="led"><bounds x="30" y="52" width="1" height="1" /></bezel>
- <bezel name="15.27" element="led"><bounds x="30" y="54" width="1" height="1" /></bezel>
- <bezel name="15.28" element="led"><bounds x="30" y="56" width="1" height="1" /></bezel>
- <bezel name="15.29" element="led"><bounds x="30" y="58" width="1" height="1" /></bezel>
- <bezel name="15.30" element="led"><bounds x="30" y="60" width="1" height="1" /></bezel>
- <bezel name="15.31" element="led"><bounds x="30" y="62" width="1" height="1" /></bezel>
- <bezel name="15.32" element="led"><bounds x="30" y="64" width="1" height="1" /></bezel>
- <bezel name="15.33" element="led"><bounds x="30" y="66" width="1" height="1" /></bezel>
- <bezel name="15.34" element="led"><bounds x="30" y="68" width="1" height="1" /></bezel>
- <bezel name="15.35" element="led"><bounds x="30" y="70" width="1" height="1" /></bezel>
- <bezel name="15.36" element="led"><bounds x="30" y="72" width="1" height="1" /></bezel>
- <bezel name="15.37" element="led"><bounds x="30" y="74" width="1" height="1" /></bezel>
- <bezel name="15.38" element="led"><bounds x="30" y="76" width="1" height="1" /></bezel>
- <bezel name="15.39" element="led"><bounds x="30" y="78" width="1" height="1" /></bezel>
+ <repeat count="40">
+ <param name="x" start="0" increment="1" />
+ <bezel name="~y~.~x~" element="led"><bounds x="~x~" y="~y~" width="0.5" height="0.5" /></bezel>
+ </repeat>
+ </repeat>
</view>
</mamelayout>
diff --git a/src/mame/layout/hh_melps4_test.lay b/src/mame/layout/hh_melps4_test.lay
index e073b4989bb..e23cebf24f7 100644
--- a/src/mame/layout/hh_melps4_test.lay
+++ b/src/mame/layout/hh_melps4_test.lay
@@ -14,540 +14,21 @@
<!-- build screen -->
<view name="Test Layout">
- <bounds left="0" right="64" top="0" bottom="64" />
+ <bounds left="0" right="32" top="0" bottom="16" />
<bezel element="static_black">
- <bounds left="0" right="64" top="0" bottom="64" />
+ <bounds left="0" right="32" top="0" bottom="16" />
</bezel>
<!-- max 16*32 matrix -->
- <bezel name="0.0" element="led"><bounds x="0" y="0" width="1" height="1" /></bezel>
- <bezel name="0.1" element="led"><bounds x="0" y="2" width="1" height="1" /></bezel>
- <bezel name="0.2" element="led"><bounds x="0" y="4" width="1" height="1" /></bezel>
- <bezel name="0.3" element="led"><bounds x="0" y="6" width="1" height="1" /></bezel>
- <bezel name="0.4" element="led"><bounds x="0" y="8" width="1" height="1" /></bezel>
- <bezel name="0.5" element="led"><bounds x="0" y="10" width="1" height="1" /></bezel>
- <bezel name="0.6" element="led"><bounds x="0" y="12" width="1" height="1" /></bezel>
- <bezel name="0.7" element="led"><bounds x="0" y="14" width="1" height="1" /></bezel>
- <bezel name="0.8" element="led"><bounds x="0" y="16" width="1" height="1" /></bezel>
- <bezel name="0.9" element="led"><bounds x="0" y="18" width="1" height="1" /></bezel>
- <bezel name="0.10" element="led"><bounds x="0" y="20" width="1" height="1" /></bezel>
- <bezel name="0.11" element="led"><bounds x="0" y="22" width="1" height="1" /></bezel>
- <bezel name="0.12" element="led"><bounds x="0" y="24" width="1" height="1" /></bezel>
- <bezel name="0.13" element="led"><bounds x="0" y="26" width="1" height="1" /></bezel>
- <bezel name="0.14" element="led"><bounds x="0" y="28" width="1" height="1" /></bezel>
- <bezel name="0.15" element="led"><bounds x="0" y="30" width="1" height="1" /></bezel>
- <bezel name="0.16" element="led"><bounds x="0" y="32" width="1" height="1" /></bezel>
- <bezel name="0.17" element="led"><bounds x="0" y="34" width="1" height="1" /></bezel>
- <bezel name="0.18" element="led"><bounds x="0" y="36" width="1" height="1" /></bezel>
- <bezel name="0.19" element="led"><bounds x="0" y="38" width="1" height="1" /></bezel>
- <bezel name="0.20" element="led"><bounds x="0" y="40" width="1" height="1" /></bezel>
- <bezel name="0.21" element="led"><bounds x="0" y="42" width="1" height="1" /></bezel>
- <bezel name="0.22" element="led"><bounds x="0" y="44" width="1" height="1" /></bezel>
- <bezel name="0.23" element="led"><bounds x="0" y="46" width="1" height="1" /></bezel>
- <bezel name="0.24" element="led"><bounds x="0" y="48" width="1" height="1" /></bezel>
- <bezel name="0.25" element="led"><bounds x="0" y="50" width="1" height="1" /></bezel>
- <bezel name="0.26" element="led"><bounds x="0" y="52" width="1" height="1" /></bezel>
- <bezel name="0.27" element="led"><bounds x="0" y="54" width="1" height="1" /></bezel>
- <bezel name="0.28" element="led"><bounds x="0" y="56" width="1" height="1" /></bezel>
- <bezel name="0.29" element="led"><bounds x="0" y="58" width="1" height="1" /></bezel>
- <bezel name="0.30" element="led"><bounds x="0" y="60" width="1" height="1" /></bezel>
- <bezel name="0.31" element="led"><bounds x="0" y="62" width="1" height="1" /></bezel>
+ <repeat count="16">
+ <param name="y" start="0" increment="1" />
- <bezel name="1.0" element="led"><bounds x="2" y="0" width="1" height="1" /></bezel>
- <bezel name="1.1" element="led"><bounds x="2" y="2" width="1" height="1" /></bezel>
- <bezel name="1.2" element="led"><bounds x="2" y="4" width="1" height="1" /></bezel>
- <bezel name="1.3" element="led"><bounds x="2" y="6" width="1" height="1" /></bezel>
- <bezel name="1.4" element="led"><bounds x="2" y="8" width="1" height="1" /></bezel>
- <bezel name="1.5" element="led"><bounds x="2" y="10" width="1" height="1" /></bezel>
- <bezel name="1.6" element="led"><bounds x="2" y="12" width="1" height="1" /></bezel>
- <bezel name="1.7" element="led"><bounds x="2" y="14" width="1" height="1" /></bezel>
- <bezel name="1.8" element="led"><bounds x="2" y="16" width="1" height="1" /></bezel>
- <bezel name="1.9" element="led"><bounds x="2" y="18" width="1" height="1" /></bezel>
- <bezel name="1.10" element="led"><bounds x="2" y="20" width="1" height="1" /></bezel>
- <bezel name="1.11" element="led"><bounds x="2" y="22" width="1" height="1" /></bezel>
- <bezel name="1.12" element="led"><bounds x="2" y="24" width="1" height="1" /></bezel>
- <bezel name="1.13" element="led"><bounds x="2" y="26" width="1" height="1" /></bezel>
- <bezel name="1.14" element="led"><bounds x="2" y="28" width="1" height="1" /></bezel>
- <bezel name="1.15" element="led"><bounds x="2" y="30" width="1" height="1" /></bezel>
- <bezel name="1.16" element="led"><bounds x="2" y="32" width="1" height="1" /></bezel>
- <bezel name="1.17" element="led"><bounds x="2" y="34" width="1" height="1" /></bezel>
- <bezel name="1.18" element="led"><bounds x="2" y="36" width="1" height="1" /></bezel>
- <bezel name="1.19" element="led"><bounds x="2" y="38" width="1" height="1" /></bezel>
- <bezel name="1.20" element="led"><bounds x="2" y="40" width="1" height="1" /></bezel>
- <bezel name="1.21" element="led"><bounds x="2" y="42" width="1" height="1" /></bezel>
- <bezel name="1.22" element="led"><bounds x="2" y="44" width="1" height="1" /></bezel>
- <bezel name="1.23" element="led"><bounds x="2" y="46" width="1" height="1" /></bezel>
- <bezel name="1.24" element="led"><bounds x="2" y="48" width="1" height="1" /></bezel>
- <bezel name="1.25" element="led"><bounds x="2" y="50" width="1" height="1" /></bezel>
- <bezel name="1.26" element="led"><bounds x="2" y="52" width="1" height="1" /></bezel>
- <bezel name="1.27" element="led"><bounds x="2" y="54" width="1" height="1" /></bezel>
- <bezel name="1.28" element="led"><bounds x="2" y="56" width="1" height="1" /></bezel>
- <bezel name="1.29" element="led"><bounds x="2" y="58" width="1" height="1" /></bezel>
- <bezel name="1.30" element="led"><bounds x="2" y="60" width="1" height="1" /></bezel>
- <bezel name="1.31" element="led"><bounds x="2" y="62" width="1" height="1" /></bezel>
-
- <bezel name="2.0" element="led"><bounds x="4" y="0" width="1" height="1" /></bezel>
- <bezel name="2.1" element="led"><bounds x="4" y="2" width="1" height="1" /></bezel>
- <bezel name="2.2" element="led"><bounds x="4" y="4" width="1" height="1" /></bezel>
- <bezel name="2.3" element="led"><bounds x="4" y="6" width="1" height="1" /></bezel>
- <bezel name="2.4" element="led"><bounds x="4" y="8" width="1" height="1" /></bezel>
- <bezel name="2.5" element="led"><bounds x="4" y="10" width="1" height="1" /></bezel>
- <bezel name="2.6" element="led"><bounds x="4" y="12" width="1" height="1" /></bezel>
- <bezel name="2.7" element="led"><bounds x="4" y="14" width="1" height="1" /></bezel>
- <bezel name="2.8" element="led"><bounds x="4" y="16" width="1" height="1" /></bezel>
- <bezel name="2.9" element="led"><bounds x="4" y="18" width="1" height="1" /></bezel>
- <bezel name="2.10" element="led"><bounds x="4" y="20" width="1" height="1" /></bezel>
- <bezel name="2.11" element="led"><bounds x="4" y="22" width="1" height="1" /></bezel>
- <bezel name="2.12" element="led"><bounds x="4" y="24" width="1" height="1" /></bezel>
- <bezel name="2.13" element="led"><bounds x="4" y="26" width="1" height="1" /></bezel>
- <bezel name="2.14" element="led"><bounds x="4" y="28" width="1" height="1" /></bezel>
- <bezel name="2.15" element="led"><bounds x="4" y="30" width="1" height="1" /></bezel>
- <bezel name="2.16" element="led"><bounds x="4" y="32" width="1" height="1" /></bezel>
- <bezel name="2.17" element="led"><bounds x="4" y="34" width="1" height="1" /></bezel>
- <bezel name="2.18" element="led"><bounds x="4" y="36" width="1" height="1" /></bezel>
- <bezel name="2.19" element="led"><bounds x="4" y="38" width="1" height="1" /></bezel>
- <bezel name="2.20" element="led"><bounds x="4" y="40" width="1" height="1" /></bezel>
- <bezel name="2.21" element="led"><bounds x="4" y="42" width="1" height="1" /></bezel>
- <bezel name="2.22" element="led"><bounds x="4" y="44" width="1" height="1" /></bezel>
- <bezel name="2.23" element="led"><bounds x="4" y="46" width="1" height="1" /></bezel>
- <bezel name="2.24" element="led"><bounds x="4" y="48" width="1" height="1" /></bezel>
- <bezel name="2.25" element="led"><bounds x="4" y="50" width="1" height="1" /></bezel>
- <bezel name="2.26" element="led"><bounds x="4" y="52" width="1" height="1" /></bezel>
- <bezel name="2.27" element="led"><bounds x="4" y="54" width="1" height="1" /></bezel>
- <bezel name="2.28" element="led"><bounds x="4" y="56" width="1" height="1" /></bezel>
- <bezel name="2.29" element="led"><bounds x="4" y="58" width="1" height="1" /></bezel>
- <bezel name="2.30" element="led"><bounds x="4" y="60" width="1" height="1" /></bezel>
- <bezel name="2.31" element="led"><bounds x="4" y="62" width="1" height="1" /></bezel>
-
- <bezel name="3.0" element="led"><bounds x="6" y="0" width="1" height="1" /></bezel>
- <bezel name="3.1" element="led"><bounds x="6" y="2" width="1" height="1" /></bezel>
- <bezel name="3.2" element="led"><bounds x="6" y="4" width="1" height="1" /></bezel>
- <bezel name="3.3" element="led"><bounds x="6" y="6" width="1" height="1" /></bezel>
- <bezel name="3.4" element="led"><bounds x="6" y="8" width="1" height="1" /></bezel>
- <bezel name="3.5" element="led"><bounds x="6" y="10" width="1" height="1" /></bezel>
- <bezel name="3.6" element="led"><bounds x="6" y="12" width="1" height="1" /></bezel>
- <bezel name="3.7" element="led"><bounds x="6" y="14" width="1" height="1" /></bezel>
- <bezel name="3.8" element="led"><bounds x="6" y="16" width="1" height="1" /></bezel>
- <bezel name="3.9" element="led"><bounds x="6" y="18" width="1" height="1" /></bezel>
- <bezel name="3.10" element="led"><bounds x="6" y="20" width="1" height="1" /></bezel>
- <bezel name="3.11" element="led"><bounds x="6" y="22" width="1" height="1" /></bezel>
- <bezel name="3.12" element="led"><bounds x="6" y="24" width="1" height="1" /></bezel>
- <bezel name="3.13" element="led"><bounds x="6" y="26" width="1" height="1" /></bezel>
- <bezel name="3.14" element="led"><bounds x="6" y="28" width="1" height="1" /></bezel>
- <bezel name="3.15" element="led"><bounds x="6" y="30" width="1" height="1" /></bezel>
- <bezel name="3.16" element="led"><bounds x="6" y="32" width="1" height="1" /></bezel>
- <bezel name="3.17" element="led"><bounds x="6" y="34" width="1" height="1" /></bezel>
- <bezel name="3.18" element="led"><bounds x="6" y="36" width="1" height="1" /></bezel>
- <bezel name="3.19" element="led"><bounds x="6" y="38" width="1" height="1" /></bezel>
- <bezel name="3.20" element="led"><bounds x="6" y="40" width="1" height="1" /></bezel>
- <bezel name="3.21" element="led"><bounds x="6" y="42" width="1" height="1" /></bezel>
- <bezel name="3.22" element="led"><bounds x="6" y="44" width="1" height="1" /></bezel>
- <bezel name="3.23" element="led"><bounds x="6" y="46" width="1" height="1" /></bezel>
- <bezel name="3.24" element="led"><bounds x="6" y="48" width="1" height="1" /></bezel>
- <bezel name="3.25" element="led"><bounds x="6" y="50" width="1" height="1" /></bezel>
- <bezel name="3.26" element="led"><bounds x="6" y="52" width="1" height="1" /></bezel>
- <bezel name="3.27" element="led"><bounds x="6" y="54" width="1" height="1" /></bezel>
- <bezel name="3.28" element="led"><bounds x="6" y="56" width="1" height="1" /></bezel>
- <bezel name="3.29" element="led"><bounds x="6" y="58" width="1" height="1" /></bezel>
- <bezel name="3.30" element="led"><bounds x="6" y="60" width="1" height="1" /></bezel>
- <bezel name="3.31" element="led"><bounds x="6" y="62" width="1" height="1" /></bezel>
-
- <bezel name="4.0" element="led"><bounds x="8" y="0" width="1" height="1" /></bezel>
- <bezel name="4.1" element="led"><bounds x="8" y="2" width="1" height="1" /></bezel>
- <bezel name="4.2" element="led"><bounds x="8" y="4" width="1" height="1" /></bezel>
- <bezel name="4.3" element="led"><bounds x="8" y="6" width="1" height="1" /></bezel>
- <bezel name="4.4" element="led"><bounds x="8" y="8" width="1" height="1" /></bezel>
- <bezel name="4.5" element="led"><bounds x="8" y="10" width="1" height="1" /></bezel>
- <bezel name="4.6" element="led"><bounds x="8" y="12" width="1" height="1" /></bezel>
- <bezel name="4.7" element="led"><bounds x="8" y="14" width="1" height="1" /></bezel>
- <bezel name="4.8" element="led"><bounds x="8" y="16" width="1" height="1" /></bezel>
- <bezel name="4.9" element="led"><bounds x="8" y="18" width="1" height="1" /></bezel>
- <bezel name="4.10" element="led"><bounds x="8" y="20" width="1" height="1" /></bezel>
- <bezel name="4.11" element="led"><bounds x="8" y="22" width="1" height="1" /></bezel>
- <bezel name="4.12" element="led"><bounds x="8" y="24" width="1" height="1" /></bezel>
- <bezel name="4.13" element="led"><bounds x="8" y="26" width="1" height="1" /></bezel>
- <bezel name="4.14" element="led"><bounds x="8" y="28" width="1" height="1" /></bezel>
- <bezel name="4.15" element="led"><bounds x="8" y="30" width="1" height="1" /></bezel>
- <bezel name="4.16" element="led"><bounds x="8" y="32" width="1" height="1" /></bezel>
- <bezel name="4.17" element="led"><bounds x="8" y="34" width="1" height="1" /></bezel>
- <bezel name="4.18" element="led"><bounds x="8" y="36" width="1" height="1" /></bezel>
- <bezel name="4.19" element="led"><bounds x="8" y="38" width="1" height="1" /></bezel>
- <bezel name="4.20" element="led"><bounds x="8" y="40" width="1" height="1" /></bezel>
- <bezel name="4.21" element="led"><bounds x="8" y="42" width="1" height="1" /></bezel>
- <bezel name="4.22" element="led"><bounds x="8" y="44" width="1" height="1" /></bezel>
- <bezel name="4.23" element="led"><bounds x="8" y="46" width="1" height="1" /></bezel>
- <bezel name="4.24" element="led"><bounds x="8" y="48" width="1" height="1" /></bezel>
- <bezel name="4.25" element="led"><bounds x="8" y="50" width="1" height="1" /></bezel>
- <bezel name="4.26" element="led"><bounds x="8" y="52" width="1" height="1" /></bezel>
- <bezel name="4.27" element="led"><bounds x="8" y="54" width="1" height="1" /></bezel>
- <bezel name="4.28" element="led"><bounds x="8" y="56" width="1" height="1" /></bezel>
- <bezel name="4.29" element="led"><bounds x="8" y="58" width="1" height="1" /></bezel>
- <bezel name="4.30" element="led"><bounds x="8" y="60" width="1" height="1" /></bezel>
- <bezel name="4.31" element="led"><bounds x="8" y="62" width="1" height="1" /></bezel>
-
- <bezel name="5.0" element="led"><bounds x="10" y="0" width="1" height="1" /></bezel>
- <bezel name="5.1" element="led"><bounds x="10" y="2" width="1" height="1" /></bezel>
- <bezel name="5.2" element="led"><bounds x="10" y="4" width="1" height="1" /></bezel>
- <bezel name="5.3" element="led"><bounds x="10" y="6" width="1" height="1" /></bezel>
- <bezel name="5.4" element="led"><bounds x="10" y="8" width="1" height="1" /></bezel>
- <bezel name="5.5" element="led"><bounds x="10" y="10" width="1" height="1" /></bezel>
- <bezel name="5.6" element="led"><bounds x="10" y="12" width="1" height="1" /></bezel>
- <bezel name="5.7" element="led"><bounds x="10" y="14" width="1" height="1" /></bezel>
- <bezel name="5.8" element="led"><bounds x="10" y="16" width="1" height="1" /></bezel>
- <bezel name="5.9" element="led"><bounds x="10" y="18" width="1" height="1" /></bezel>
- <bezel name="5.10" element="led"><bounds x="10" y="20" width="1" height="1" /></bezel>
- <bezel name="5.11" element="led"><bounds x="10" y="22" width="1" height="1" /></bezel>
- <bezel name="5.12" element="led"><bounds x="10" y="24" width="1" height="1" /></bezel>
- <bezel name="5.13" element="led"><bounds x="10" y="26" width="1" height="1" /></bezel>
- <bezel name="5.14" element="led"><bounds x="10" y="28" width="1" height="1" /></bezel>
- <bezel name="5.15" element="led"><bounds x="10" y="30" width="1" height="1" /></bezel>
- <bezel name="5.16" element="led"><bounds x="10" y="32" width="1" height="1" /></bezel>
- <bezel name="5.17" element="led"><bounds x="10" y="34" width="1" height="1" /></bezel>
- <bezel name="5.18" element="led"><bounds x="10" y="36" width="1" height="1" /></bezel>
- <bezel name="5.19" element="led"><bounds x="10" y="38" width="1" height="1" /></bezel>
- <bezel name="5.20" element="led"><bounds x="10" y="40" width="1" height="1" /></bezel>
- <bezel name="5.21" element="led"><bounds x="10" y="42" width="1" height="1" /></bezel>
- <bezel name="5.22" element="led"><bounds x="10" y="44" width="1" height="1" /></bezel>
- <bezel name="5.23" element="led"><bounds x="10" y="46" width="1" height="1" /></bezel>
- <bezel name="5.24" element="led"><bounds x="10" y="48" width="1" height="1" /></bezel>
- <bezel name="5.25" element="led"><bounds x="10" y="50" width="1" height="1" /></bezel>
- <bezel name="5.26" element="led"><bounds x="10" y="52" width="1" height="1" /></bezel>
- <bezel name="5.27" element="led"><bounds x="10" y="54" width="1" height="1" /></bezel>
- <bezel name="5.28" element="led"><bounds x="10" y="56" width="1" height="1" /></bezel>
- <bezel name="5.29" element="led"><bounds x="10" y="58" width="1" height="1" /></bezel>
- <bezel name="5.30" element="led"><bounds x="10" y="60" width="1" height="1" /></bezel>
- <bezel name="5.31" element="led"><bounds x="10" y="62" width="1" height="1" /></bezel>
-
- <bezel name="6.0" element="led"><bounds x="12" y="0" width="1" height="1" /></bezel>
- <bezel name="6.1" element="led"><bounds x="12" y="2" width="1" height="1" /></bezel>
- <bezel name="6.2" element="led"><bounds x="12" y="4" width="1" height="1" /></bezel>
- <bezel name="6.3" element="led"><bounds x="12" y="6" width="1" height="1" /></bezel>
- <bezel name="6.4" element="led"><bounds x="12" y="8" width="1" height="1" /></bezel>
- <bezel name="6.5" element="led"><bounds x="12" y="10" width="1" height="1" /></bezel>
- <bezel name="6.6" element="led"><bounds x="12" y="12" width="1" height="1" /></bezel>
- <bezel name="6.7" element="led"><bounds x="12" y="14" width="1" height="1" /></bezel>
- <bezel name="6.8" element="led"><bounds x="12" y="16" width="1" height="1" /></bezel>
- <bezel name="6.9" element="led"><bounds x="12" y="18" width="1" height="1" /></bezel>
- <bezel name="6.10" element="led"><bounds x="12" y="20" width="1" height="1" /></bezel>
- <bezel name="6.11" element="led"><bounds x="12" y="22" width="1" height="1" /></bezel>
- <bezel name="6.12" element="led"><bounds x="12" y="24" width="1" height="1" /></bezel>
- <bezel name="6.13" element="led"><bounds x="12" y="26" width="1" height="1" /></bezel>
- <bezel name="6.14" element="led"><bounds x="12" y="28" width="1" height="1" /></bezel>
- <bezel name="6.15" element="led"><bounds x="12" y="30" width="1" height="1" /></bezel>
- <bezel name="6.16" element="led"><bounds x="12" y="32" width="1" height="1" /></bezel>
- <bezel name="6.17" element="led"><bounds x="12" y="34" width="1" height="1" /></bezel>
- <bezel name="6.18" element="led"><bounds x="12" y="36" width="1" height="1" /></bezel>
- <bezel name="6.19" element="led"><bounds x="12" y="38" width="1" height="1" /></bezel>
- <bezel name="6.20" element="led"><bounds x="12" y="40" width="1" height="1" /></bezel>
- <bezel name="6.21" element="led"><bounds x="12" y="42" width="1" height="1" /></bezel>
- <bezel name="6.22" element="led"><bounds x="12" y="44" width="1" height="1" /></bezel>
- <bezel name="6.23" element="led"><bounds x="12" y="46" width="1" height="1" /></bezel>
- <bezel name="6.24" element="led"><bounds x="12" y="48" width="1" height="1" /></bezel>
- <bezel name="6.25" element="led"><bounds x="12" y="50" width="1" height="1" /></bezel>
- <bezel name="6.26" element="led"><bounds x="12" y="52" width="1" height="1" /></bezel>
- <bezel name="6.27" element="led"><bounds x="12" y="54" width="1" height="1" /></bezel>
- <bezel name="6.28" element="led"><bounds x="12" y="56" width="1" height="1" /></bezel>
- <bezel name="6.29" element="led"><bounds x="12" y="58" width="1" height="1" /></bezel>
- <bezel name="6.30" element="led"><bounds x="12" y="60" width="1" height="1" /></bezel>
- <bezel name="6.31" element="led"><bounds x="12" y="62" width="1" height="1" /></bezel>
-
- <bezel name="7.0" element="led"><bounds x="14" y="0" width="1" height="1" /></bezel>
- <bezel name="7.1" element="led"><bounds x="14" y="2" width="1" height="1" /></bezel>
- <bezel name="7.2" element="led"><bounds x="14" y="4" width="1" height="1" /></bezel>
- <bezel name="7.3" element="led"><bounds x="14" y="6" width="1" height="1" /></bezel>
- <bezel name="7.4" element="led"><bounds x="14" y="8" width="1" height="1" /></bezel>
- <bezel name="7.5" element="led"><bounds x="14" y="10" width="1" height="1" /></bezel>
- <bezel name="7.6" element="led"><bounds x="14" y="12" width="1" height="1" /></bezel>
- <bezel name="7.7" element="led"><bounds x="14" y="14" width="1" height="1" /></bezel>
- <bezel name="7.8" element="led"><bounds x="14" y="16" width="1" height="1" /></bezel>
- <bezel name="7.9" element="led"><bounds x="14" y="18" width="1" height="1" /></bezel>
- <bezel name="7.10" element="led"><bounds x="14" y="20" width="1" height="1" /></bezel>
- <bezel name="7.11" element="led"><bounds x="14" y="22" width="1" height="1" /></bezel>
- <bezel name="7.12" element="led"><bounds x="14" y="24" width="1" height="1" /></bezel>
- <bezel name="7.13" element="led"><bounds x="14" y="26" width="1" height="1" /></bezel>
- <bezel name="7.14" element="led"><bounds x="14" y="28" width="1" height="1" /></bezel>
- <bezel name="7.15" element="led"><bounds x="14" y="30" width="1" height="1" /></bezel>
- <bezel name="7.16" element="led"><bounds x="14" y="32" width="1" height="1" /></bezel>
- <bezel name="7.17" element="led"><bounds x="14" y="34" width="1" height="1" /></bezel>
- <bezel name="7.18" element="led"><bounds x="14" y="36" width="1" height="1" /></bezel>
- <bezel name="7.19" element="led"><bounds x="14" y="38" width="1" height="1" /></bezel>
- <bezel name="7.20" element="led"><bounds x="14" y="40" width="1" height="1" /></bezel>
- <bezel name="7.21" element="led"><bounds x="14" y="42" width="1" height="1" /></bezel>
- <bezel name="7.22" element="led"><bounds x="14" y="44" width="1" height="1" /></bezel>
- <bezel name="7.23" element="led"><bounds x="14" y="46" width="1" height="1" /></bezel>
- <bezel name="7.24" element="led"><bounds x="14" y="48" width="1" height="1" /></bezel>
- <bezel name="7.25" element="led"><bounds x="14" y="50" width="1" height="1" /></bezel>
- <bezel name="7.26" element="led"><bounds x="14" y="52" width="1" height="1" /></bezel>
- <bezel name="7.27" element="led"><bounds x="14" y="54" width="1" height="1" /></bezel>
- <bezel name="7.28" element="led"><bounds x="14" y="56" width="1" height="1" /></bezel>
- <bezel name="7.29" element="led"><bounds x="14" y="58" width="1" height="1" /></bezel>
- <bezel name="7.30" element="led"><bounds x="14" y="60" width="1" height="1" /></bezel>
- <bezel name="7.31" element="led"><bounds x="14" y="62" width="1" height="1" /></bezel>
-
- <bezel name="8.0" element="led"><bounds x="16" y="0" width="1" height="1" /></bezel>
- <bezel name="8.1" element="led"><bounds x="16" y="2" width="1" height="1" /></bezel>
- <bezel name="8.2" element="led"><bounds x="16" y="4" width="1" height="1" /></bezel>
- <bezel name="8.3" element="led"><bounds x="16" y="6" width="1" height="1" /></bezel>
- <bezel name="8.4" element="led"><bounds x="16" y="8" width="1" height="1" /></bezel>
- <bezel name="8.5" element="led"><bounds x="16" y="10" width="1" height="1" /></bezel>
- <bezel name="8.6" element="led"><bounds x="16" y="12" width="1" height="1" /></bezel>
- <bezel name="8.7" element="led"><bounds x="16" y="14" width="1" height="1" /></bezel>
- <bezel name="8.8" element="led"><bounds x="16" y="16" width="1" height="1" /></bezel>
- <bezel name="8.9" element="led"><bounds x="16" y="18" width="1" height="1" /></bezel>
- <bezel name="8.10" element="led"><bounds x="16" y="20" width="1" height="1" /></bezel>
- <bezel name="8.11" element="led"><bounds x="16" y="22" width="1" height="1" /></bezel>
- <bezel name="8.12" element="led"><bounds x="16" y="24" width="1" height="1" /></bezel>
- <bezel name="8.13" element="led"><bounds x="16" y="26" width="1" height="1" /></bezel>
- <bezel name="8.14" element="led"><bounds x="16" y="28" width="1" height="1" /></bezel>
- <bezel name="8.15" element="led"><bounds x="16" y="30" width="1" height="1" /></bezel>
- <bezel name="8.16" element="led"><bounds x="16" y="32" width="1" height="1" /></bezel>
- <bezel name="8.17" element="led"><bounds x="16" y="34" width="1" height="1" /></bezel>
- <bezel name="8.18" element="led"><bounds x="16" y="36" width="1" height="1" /></bezel>
- <bezel name="8.19" element="led"><bounds x="16" y="38" width="1" height="1" /></bezel>
- <bezel name="8.20" element="led"><bounds x="16" y="40" width="1" height="1" /></bezel>
- <bezel name="8.21" element="led"><bounds x="16" y="42" width="1" height="1" /></bezel>
- <bezel name="8.22" element="led"><bounds x="16" y="44" width="1" height="1" /></bezel>
- <bezel name="8.23" element="led"><bounds x="16" y="46" width="1" height="1" /></bezel>
- <bezel name="8.24" element="led"><bounds x="16" y="48" width="1" height="1" /></bezel>
- <bezel name="8.25" element="led"><bounds x="16" y="50" width="1" height="1" /></bezel>
- <bezel name="8.26" element="led"><bounds x="16" y="52" width="1" height="1" /></bezel>
- <bezel name="8.27" element="led"><bounds x="16" y="54" width="1" height="1" /></bezel>
- <bezel name="8.28" element="led"><bounds x="16" y="56" width="1" height="1" /></bezel>
- <bezel name="8.29" element="led"><bounds x="16" y="58" width="1" height="1" /></bezel>
- <bezel name="8.30" element="led"><bounds x="16" y="60" width="1" height="1" /></bezel>
- <bezel name="8.31" element="led"><bounds x="16" y="62" width="1" height="1" /></bezel>
-
- <bezel name="9.0" element="led"><bounds x="18" y="0" width="1" height="1" /></bezel>
- <bezel name="9.1" element="led"><bounds x="18" y="2" width="1" height="1" /></bezel>
- <bezel name="9.2" element="led"><bounds x="18" y="4" width="1" height="1" /></bezel>
- <bezel name="9.3" element="led"><bounds x="18" y="6" width="1" height="1" /></bezel>
- <bezel name="9.4" element="led"><bounds x="18" y="8" width="1" height="1" /></bezel>
- <bezel name="9.5" element="led"><bounds x="18" y="10" width="1" height="1" /></bezel>
- <bezel name="9.6" element="led"><bounds x="18" y="12" width="1" height="1" /></bezel>
- <bezel name="9.7" element="led"><bounds x="18" y="14" width="1" height="1" /></bezel>
- <bezel name="9.8" element="led"><bounds x="18" y="16" width="1" height="1" /></bezel>
- <bezel name="9.9" element="led"><bounds x="18" y="18" width="1" height="1" /></bezel>
- <bezel name="9.10" element="led"><bounds x="18" y="20" width="1" height="1" /></bezel>
- <bezel name="9.11" element="led"><bounds x="18" y="22" width="1" height="1" /></bezel>
- <bezel name="9.12" element="led"><bounds x="18" y="24" width="1" height="1" /></bezel>
- <bezel name="9.13" element="led"><bounds x="18" y="26" width="1" height="1" /></bezel>
- <bezel name="9.14" element="led"><bounds x="18" y="28" width="1" height="1" /></bezel>
- <bezel name="9.15" element="led"><bounds x="18" y="30" width="1" height="1" /></bezel>
- <bezel name="9.16" element="led"><bounds x="18" y="32" width="1" height="1" /></bezel>
- <bezel name="9.17" element="led"><bounds x="18" y="34" width="1" height="1" /></bezel>
- <bezel name="9.18" element="led"><bounds x="18" y="36" width="1" height="1" /></bezel>
- <bezel name="9.19" element="led"><bounds x="18" y="38" width="1" height="1" /></bezel>
- <bezel name="9.20" element="led"><bounds x="18" y="40" width="1" height="1" /></bezel>
- <bezel name="9.21" element="led"><bounds x="18" y="42" width="1" height="1" /></bezel>
- <bezel name="9.22" element="led"><bounds x="18" y="44" width="1" height="1" /></bezel>
- <bezel name="9.23" element="led"><bounds x="18" y="46" width="1" height="1" /></bezel>
- <bezel name="9.24" element="led"><bounds x="18" y="48" width="1" height="1" /></bezel>
- <bezel name="9.25" element="led"><bounds x="18" y="50" width="1" height="1" /></bezel>
- <bezel name="9.26" element="led"><bounds x="18" y="52" width="1" height="1" /></bezel>
- <bezel name="9.27" element="led"><bounds x="18" y="54" width="1" height="1" /></bezel>
- <bezel name="9.28" element="led"><bounds x="18" y="56" width="1" height="1" /></bezel>
- <bezel name="9.29" element="led"><bounds x="18" y="58" width="1" height="1" /></bezel>
- <bezel name="9.30" element="led"><bounds x="18" y="60" width="1" height="1" /></bezel>
- <bezel name="9.31" element="led"><bounds x="18" y="62" width="1" height="1" /></bezel>
-
- <bezel name="10.0" element="led"><bounds x="20" y="0" width="1" height="1" /></bezel>
- <bezel name="10.1" element="led"><bounds x="20" y="2" width="1" height="1" /></bezel>
- <bezel name="10.2" element="led"><bounds x="20" y="4" width="1" height="1" /></bezel>
- <bezel name="10.3" element="led"><bounds x="20" y="6" width="1" height="1" /></bezel>
- <bezel name="10.4" element="led"><bounds x="20" y="8" width="1" height="1" /></bezel>
- <bezel name="10.5" element="led"><bounds x="20" y="10" width="1" height="1" /></bezel>
- <bezel name="10.6" element="led"><bounds x="20" y="12" width="1" height="1" /></bezel>
- <bezel name="10.7" element="led"><bounds x="20" y="14" width="1" height="1" /></bezel>
- <bezel name="10.8" element="led"><bounds x="20" y="16" width="1" height="1" /></bezel>
- <bezel name="10.9" element="led"><bounds x="20" y="18" width="1" height="1" /></bezel>
- <bezel name="10.10" element="led"><bounds x="20" y="20" width="1" height="1" /></bezel>
- <bezel name="10.11" element="led"><bounds x="20" y="22" width="1" height="1" /></bezel>
- <bezel name="10.12" element="led"><bounds x="20" y="24" width="1" height="1" /></bezel>
- <bezel name="10.13" element="led"><bounds x="20" y="26" width="1" height="1" /></bezel>
- <bezel name="10.14" element="led"><bounds x="20" y="28" width="1" height="1" /></bezel>
- <bezel name="10.15" element="led"><bounds x="20" y="30" width="1" height="1" /></bezel>
- <bezel name="10.16" element="led"><bounds x="20" y="32" width="1" height="1" /></bezel>
- <bezel name="10.17" element="led"><bounds x="20" y="34" width="1" height="1" /></bezel>
- <bezel name="10.18" element="led"><bounds x="20" y="36" width="1" height="1" /></bezel>
- <bezel name="10.19" element="led"><bounds x="20" y="38" width="1" height="1" /></bezel>
- <bezel name="10.20" element="led"><bounds x="20" y="40" width="1" height="1" /></bezel>
- <bezel name="10.21" element="led"><bounds x="20" y="42" width="1" height="1" /></bezel>
- <bezel name="10.22" element="led"><bounds x="20" y="44" width="1" height="1" /></bezel>
- <bezel name="10.23" element="led"><bounds x="20" y="46" width="1" height="1" /></bezel>
- <bezel name="10.24" element="led"><bounds x="20" y="48" width="1" height="1" /></bezel>
- <bezel name="10.25" element="led"><bounds x="20" y="50" width="1" height="1" /></bezel>
- <bezel name="10.26" element="led"><bounds x="20" y="52" width="1" height="1" /></bezel>
- <bezel name="10.27" element="led"><bounds x="20" y="54" width="1" height="1" /></bezel>
- <bezel name="10.28" element="led"><bounds x="20" y="56" width="1" height="1" /></bezel>
- <bezel name="10.29" element="led"><bounds x="20" y="58" width="1" height="1" /></bezel>
- <bezel name="10.30" element="led"><bounds x="20" y="60" width="1" height="1" /></bezel>
- <bezel name="10.31" element="led"><bounds x="20" y="62" width="1" height="1" /></bezel>
-
- <bezel name="11.0" element="led"><bounds x="22" y="0" width="1" height="1" /></bezel>
- <bezel name="11.1" element="led"><bounds x="22" y="2" width="1" height="1" /></bezel>
- <bezel name="11.2" element="led"><bounds x="22" y="4" width="1" height="1" /></bezel>
- <bezel name="11.3" element="led"><bounds x="22" y="6" width="1" height="1" /></bezel>
- <bezel name="11.4" element="led"><bounds x="22" y="8" width="1" height="1" /></bezel>
- <bezel name="11.5" element="led"><bounds x="22" y="10" width="1" height="1" /></bezel>
- <bezel name="11.6" element="led"><bounds x="22" y="12" width="1" height="1" /></bezel>
- <bezel name="11.7" element="led"><bounds x="22" y="14" width="1" height="1" /></bezel>
- <bezel name="11.8" element="led"><bounds x="22" y="16" width="1" height="1" /></bezel>
- <bezel name="11.9" element="led"><bounds x="22" y="18" width="1" height="1" /></bezel>
- <bezel name="11.10" element="led"><bounds x="22" y="20" width="1" height="1" /></bezel>
- <bezel name="11.11" element="led"><bounds x="22" y="22" width="1" height="1" /></bezel>
- <bezel name="11.12" element="led"><bounds x="22" y="24" width="1" height="1" /></bezel>
- <bezel name="11.13" element="led"><bounds x="22" y="26" width="1" height="1" /></bezel>
- <bezel name="11.14" element="led"><bounds x="22" y="28" width="1" height="1" /></bezel>
- <bezel name="11.15" element="led"><bounds x="22" y="30" width="1" height="1" /></bezel>
- <bezel name="11.16" element="led"><bounds x="22" y="32" width="1" height="1" /></bezel>
- <bezel name="11.17" element="led"><bounds x="22" y="34" width="1" height="1" /></bezel>
- <bezel name="11.18" element="led"><bounds x="22" y="36" width="1" height="1" /></bezel>
- <bezel name="11.19" element="led"><bounds x="22" y="38" width="1" height="1" /></bezel>
- <bezel name="11.20" element="led"><bounds x="22" y="40" width="1" height="1" /></bezel>
- <bezel name="11.21" element="led"><bounds x="22" y="42" width="1" height="1" /></bezel>
- <bezel name="11.22" element="led"><bounds x="22" y="44" width="1" height="1" /></bezel>
- <bezel name="11.23" element="led"><bounds x="22" y="46" width="1" height="1" /></bezel>
- <bezel name="11.24" element="led"><bounds x="22" y="48" width="1" height="1" /></bezel>
- <bezel name="11.25" element="led"><bounds x="22" y="50" width="1" height="1" /></bezel>
- <bezel name="11.26" element="led"><bounds x="22" y="52" width="1" height="1" /></bezel>
- <bezel name="11.27" element="led"><bounds x="22" y="54" width="1" height="1" /></bezel>
- <bezel name="11.28" element="led"><bounds x="22" y="56" width="1" height="1" /></bezel>
- <bezel name="11.29" element="led"><bounds x="22" y="58" width="1" height="1" /></bezel>
- <bezel name="11.30" element="led"><bounds x="22" y="60" width="1" height="1" /></bezel>
- <bezel name="11.31" element="led"><bounds x="22" y="62" width="1" height="1" /></bezel>
-
- <bezel name="12.0" element="led"><bounds x="24" y="0" width="1" height="1" /></bezel>
- <bezel name="12.1" element="led"><bounds x="24" y="2" width="1" height="1" /></bezel>
- <bezel name="12.2" element="led"><bounds x="24" y="4" width="1" height="1" /></bezel>
- <bezel name="12.3" element="led"><bounds x="24" y="6" width="1" height="1" /></bezel>
- <bezel name="12.4" element="led"><bounds x="24" y="8" width="1" height="1" /></bezel>
- <bezel name="12.5" element="led"><bounds x="24" y="10" width="1" height="1" /></bezel>
- <bezel name="12.6" element="led"><bounds x="24" y="12" width="1" height="1" /></bezel>
- <bezel name="12.7" element="led"><bounds x="24" y="14" width="1" height="1" /></bezel>
- <bezel name="12.8" element="led"><bounds x="24" y="16" width="1" height="1" /></bezel>
- <bezel name="12.9" element="led"><bounds x="24" y="18" width="1" height="1" /></bezel>
- <bezel name="12.10" element="led"><bounds x="24" y="20" width="1" height="1" /></bezel>
- <bezel name="12.11" element="led"><bounds x="24" y="22" width="1" height="1" /></bezel>
- <bezel name="12.12" element="led"><bounds x="24" y="24" width="1" height="1" /></bezel>
- <bezel name="12.13" element="led"><bounds x="24" y="26" width="1" height="1" /></bezel>
- <bezel name="12.14" element="led"><bounds x="24" y="28" width="1" height="1" /></bezel>
- <bezel name="12.15" element="led"><bounds x="24" y="30" width="1" height="1" /></bezel>
- <bezel name="12.16" element="led"><bounds x="24" y="32" width="1" height="1" /></bezel>
- <bezel name="12.17" element="led"><bounds x="24" y="34" width="1" height="1" /></bezel>
- <bezel name="12.18" element="led"><bounds x="24" y="36" width="1" height="1" /></bezel>
- <bezel name="12.19" element="led"><bounds x="24" y="38" width="1" height="1" /></bezel>
- <bezel name="12.20" element="led"><bounds x="24" y="40" width="1" height="1" /></bezel>
- <bezel name="12.21" element="led"><bounds x="24" y="42" width="1" height="1" /></bezel>
- <bezel name="12.22" element="led"><bounds x="24" y="44" width="1" height="1" /></bezel>
- <bezel name="12.23" element="led"><bounds x="24" y="46" width="1" height="1" /></bezel>
- <bezel name="12.24" element="led"><bounds x="24" y="48" width="1" height="1" /></bezel>
- <bezel name="12.25" element="led"><bounds x="24" y="50" width="1" height="1" /></bezel>
- <bezel name="12.26" element="led"><bounds x="24" y="52" width="1" height="1" /></bezel>
- <bezel name="12.27" element="led"><bounds x="24" y="54" width="1" height="1" /></bezel>
- <bezel name="12.28" element="led"><bounds x="24" y="56" width="1" height="1" /></bezel>
- <bezel name="12.29" element="led"><bounds x="24" y="58" width="1" height="1" /></bezel>
- <bezel name="12.30" element="led"><bounds x="24" y="60" width="1" height="1" /></bezel>
- <bezel name="12.31" element="led"><bounds x="24" y="62" width="1" height="1" /></bezel>
-
- <bezel name="13.0" element="led"><bounds x="26" y="0" width="1" height="1" /></bezel>
- <bezel name="13.1" element="led"><bounds x="26" y="2" width="1" height="1" /></bezel>
- <bezel name="13.2" element="led"><bounds x="26" y="4" width="1" height="1" /></bezel>
- <bezel name="13.3" element="led"><bounds x="26" y="6" width="1" height="1" /></bezel>
- <bezel name="13.4" element="led"><bounds x="26" y="8" width="1" height="1" /></bezel>
- <bezel name="13.5" element="led"><bounds x="26" y="10" width="1" height="1" /></bezel>
- <bezel name="13.6" element="led"><bounds x="26" y="12" width="1" height="1" /></bezel>
- <bezel name="13.7" element="led"><bounds x="26" y="14" width="1" height="1" /></bezel>
- <bezel name="13.8" element="led"><bounds x="26" y="16" width="1" height="1" /></bezel>
- <bezel name="13.9" element="led"><bounds x="26" y="18" width="1" height="1" /></bezel>
- <bezel name="13.10" element="led"><bounds x="26" y="20" width="1" height="1" /></bezel>
- <bezel name="13.11" element="led"><bounds x="26" y="22" width="1" height="1" /></bezel>
- <bezel name="13.12" element="led"><bounds x="26" y="24" width="1" height="1" /></bezel>
- <bezel name="13.13" element="led"><bounds x="26" y="26" width="1" height="1" /></bezel>
- <bezel name="13.14" element="led"><bounds x="26" y="28" width="1" height="1" /></bezel>
- <bezel name="13.15" element="led"><bounds x="26" y="30" width="1" height="1" /></bezel>
- <bezel name="13.16" element="led"><bounds x="26" y="32" width="1" height="1" /></bezel>
- <bezel name="13.17" element="led"><bounds x="26" y="34" width="1" height="1" /></bezel>
- <bezel name="13.18" element="led"><bounds x="26" y="36" width="1" height="1" /></bezel>
- <bezel name="13.19" element="led"><bounds x="26" y="38" width="1" height="1" /></bezel>
- <bezel name="13.20" element="led"><bounds x="26" y="40" width="1" height="1" /></bezel>
- <bezel name="13.21" element="led"><bounds x="26" y="42" width="1" height="1" /></bezel>
- <bezel name="13.22" element="led"><bounds x="26" y="44" width="1" height="1" /></bezel>
- <bezel name="13.23" element="led"><bounds x="26" y="46" width="1" height="1" /></bezel>
- <bezel name="13.24" element="led"><bounds x="26" y="48" width="1" height="1" /></bezel>
- <bezel name="13.25" element="led"><bounds x="26" y="50" width="1" height="1" /></bezel>
- <bezel name="13.26" element="led"><bounds x="26" y="52" width="1" height="1" /></bezel>
- <bezel name="13.27" element="led"><bounds x="26" y="54" width="1" height="1" /></bezel>
- <bezel name="13.28" element="led"><bounds x="26" y="56" width="1" height="1" /></bezel>
- <bezel name="13.29" element="led"><bounds x="26" y="58" width="1" height="1" /></bezel>
- <bezel name="13.30" element="led"><bounds x="26" y="60" width="1" height="1" /></bezel>
- <bezel name="13.31" element="led"><bounds x="26" y="62" width="1" height="1" /></bezel>
-
- <bezel name="14.0" element="led"><bounds x="28" y="0" width="1" height="1" /></bezel>
- <bezel name="14.1" element="led"><bounds x="28" y="2" width="1" height="1" /></bezel>
- <bezel name="14.2" element="led"><bounds x="28" y="4" width="1" height="1" /></bezel>
- <bezel name="14.3" element="led"><bounds x="28" y="6" width="1" height="1" /></bezel>
- <bezel name="14.4" element="led"><bounds x="28" y="8" width="1" height="1" /></bezel>
- <bezel name="14.5" element="led"><bounds x="28" y="10" width="1" height="1" /></bezel>
- <bezel name="14.6" element="led"><bounds x="28" y="12" width="1" height="1" /></bezel>
- <bezel name="14.7" element="led"><bounds x="28" y="14" width="1" height="1" /></bezel>
- <bezel name="14.8" element="led"><bounds x="28" y="16" width="1" height="1" /></bezel>
- <bezel name="14.9" element="led"><bounds x="28" y="18" width="1" height="1" /></bezel>
- <bezel name="14.10" element="led"><bounds x="28" y="20" width="1" height="1" /></bezel>
- <bezel name="14.11" element="led"><bounds x="28" y="22" width="1" height="1" /></bezel>
- <bezel name="14.12" element="led"><bounds x="28" y="24" width="1" height="1" /></bezel>
- <bezel name="14.13" element="led"><bounds x="28" y="26" width="1" height="1" /></bezel>
- <bezel name="14.14" element="led"><bounds x="28" y="28" width="1" height="1" /></bezel>
- <bezel name="14.15" element="led"><bounds x="28" y="30" width="1" height="1" /></bezel>
- <bezel name="14.16" element="led"><bounds x="28" y="32" width="1" height="1" /></bezel>
- <bezel name="14.17" element="led"><bounds x="28" y="34" width="1" height="1" /></bezel>
- <bezel name="14.18" element="led"><bounds x="28" y="36" width="1" height="1" /></bezel>
- <bezel name="14.19" element="led"><bounds x="28" y="38" width="1" height="1" /></bezel>
- <bezel name="14.20" element="led"><bounds x="28" y="40" width="1" height="1" /></bezel>
- <bezel name="14.21" element="led"><bounds x="28" y="42" width="1" height="1" /></bezel>
- <bezel name="14.22" element="led"><bounds x="28" y="44" width="1" height="1" /></bezel>
- <bezel name="14.23" element="led"><bounds x="28" y="46" width="1" height="1" /></bezel>
- <bezel name="14.24" element="led"><bounds x="28" y="48" width="1" height="1" /></bezel>
- <bezel name="14.25" element="led"><bounds x="28" y="50" width="1" height="1" /></bezel>
- <bezel name="14.26" element="led"><bounds x="28" y="52" width="1" height="1" /></bezel>
- <bezel name="14.27" element="led"><bounds x="28" y="54" width="1" height="1" /></bezel>
- <bezel name="14.28" element="led"><bounds x="28" y="56" width="1" height="1" /></bezel>
- <bezel name="14.29" element="led"><bounds x="28" y="58" width="1" height="1" /></bezel>
- <bezel name="14.30" element="led"><bounds x="28" y="60" width="1" height="1" /></bezel>
- <bezel name="14.31" element="led"><bounds x="28" y="62" width="1" height="1" /></bezel>
-
- <bezel name="15.0" element="led"><bounds x="30" y="0" width="1" height="1" /></bezel>
- <bezel name="15.1" element="led"><bounds x="30" y="2" width="1" height="1" /></bezel>
- <bezel name="15.2" element="led"><bounds x="30" y="4" width="1" height="1" /></bezel>
- <bezel name="15.3" element="led"><bounds x="30" y="6" width="1" height="1" /></bezel>
- <bezel name="15.4" element="led"><bounds x="30" y="8" width="1" height="1" /></bezel>
- <bezel name="15.5" element="led"><bounds x="30" y="10" width="1" height="1" /></bezel>
- <bezel name="15.6" element="led"><bounds x="30" y="12" width="1" height="1" /></bezel>
- <bezel name="15.7" element="led"><bounds x="30" y="14" width="1" height="1" /></bezel>
- <bezel name="15.8" element="led"><bounds x="30" y="16" width="1" height="1" /></bezel>
- <bezel name="15.9" element="led"><bounds x="30" y="18" width="1" height="1" /></bezel>
- <bezel name="15.10" element="led"><bounds x="30" y="20" width="1" height="1" /></bezel>
- <bezel name="15.11" element="led"><bounds x="30" y="22" width="1" height="1" /></bezel>
- <bezel name="15.12" element="led"><bounds x="30" y="24" width="1" height="1" /></bezel>
- <bezel name="15.13" element="led"><bounds x="30" y="26" width="1" height="1" /></bezel>
- <bezel name="15.14" element="led"><bounds x="30" y="28" width="1" height="1" /></bezel>
- <bezel name="15.15" element="led"><bounds x="30" y="30" width="1" height="1" /></bezel>
- <bezel name="15.16" element="led"><bounds x="30" y="32" width="1" height="1" /></bezel>
- <bezel name="15.17" element="led"><bounds x="30" y="34" width="1" height="1" /></bezel>
- <bezel name="15.18" element="led"><bounds x="30" y="36" width="1" height="1" /></bezel>
- <bezel name="15.19" element="led"><bounds x="30" y="38" width="1" height="1" /></bezel>
- <bezel name="15.20" element="led"><bounds x="30" y="40" width="1" height="1" /></bezel>
- <bezel name="15.21" element="led"><bounds x="30" y="42" width="1" height="1" /></bezel>
- <bezel name="15.22" element="led"><bounds x="30" y="44" width="1" height="1" /></bezel>
- <bezel name="15.23" element="led"><bounds x="30" y="46" width="1" height="1" /></bezel>
- <bezel name="15.24" element="led"><bounds x="30" y="48" width="1" height="1" /></bezel>
- <bezel name="15.25" element="led"><bounds x="30" y="50" width="1" height="1" /></bezel>
- <bezel name="15.26" element="led"><bounds x="30" y="52" width="1" height="1" /></bezel>
- <bezel name="15.27" element="led"><bounds x="30" y="54" width="1" height="1" /></bezel>
- <bezel name="15.28" element="led"><bounds x="30" y="56" width="1" height="1" /></bezel>
- <bezel name="15.29" element="led"><bounds x="30" y="58" width="1" height="1" /></bezel>
- <bezel name="15.30" element="led"><bounds x="30" y="60" width="1" height="1" /></bezel>
- <bezel name="15.31" element="led"><bounds x="30" y="62" width="1" height="1" /></bezel>
+ <repeat count="32">
+ <param name="x" start="0" increment="1" />
+ <bezel name="~y~.~x~" element="led"><bounds x="~x~" y="~y~" width="0.5" height="0.5" /></bezel>
+ </repeat>
+ </repeat>
</view>
</mamelayout>
diff --git a/src/mame/layout/hh_pic16_test.lay b/src/mame/layout/hh_pic16_test.lay
index faca1bc722e..675ea6960c9 100644
--- a/src/mame/layout/hh_pic16_test.lay
+++ b/src/mame/layout/hh_pic16_test.lay
@@ -14,540 +14,21 @@
<!-- build screen -->
<view name="Test Layout">
- <bounds left="0" right="64" top="0" bottom="64" />
+ <bounds left="0" right="32" top="0" bottom="16" />
<bezel element="static_black">
- <bounds left="0" right="64" top="0" bottom="64" />
+ <bounds left="0" right="32" top="0" bottom="16" />
</bezel>
<!-- max 16*32 matrix -->
- <bezel name="0.0" element="led"><bounds x="0" y="0" width="1" height="1" /></bezel>
- <bezel name="0.1" element="led"><bounds x="0" y="2" width="1" height="1" /></bezel>
- <bezel name="0.2" element="led"><bounds x="0" y="4" width="1" height="1" /></bezel>
- <bezel name="0.3" element="led"><bounds x="0" y="6" width="1" height="1" /></bezel>
- <bezel name="0.4" element="led"><bounds x="0" y="8" width="1" height="1" /></bezel>
- <bezel name="0.5" element="led"><bounds x="0" y="10" width="1" height="1" /></bezel>
- <bezel name="0.6" element="led"><bounds x="0" y="12" width="1" height="1" /></bezel>
- <bezel name="0.7" element="led"><bounds x="0" y="14" width="1" height="1" /></bezel>
- <bezel name="0.8" element="led"><bounds x="0" y="16" width="1" height="1" /></bezel>
- <bezel name="0.9" element="led"><bounds x="0" y="18" width="1" height="1" /></bezel>
- <bezel name="0.10" element="led"><bounds x="0" y="20" width="1" height="1" /></bezel>
- <bezel name="0.11" element="led"><bounds x="0" y="22" width="1" height="1" /></bezel>
- <bezel name="0.12" element="led"><bounds x="0" y="24" width="1" height="1" /></bezel>
- <bezel name="0.13" element="led"><bounds x="0" y="26" width="1" height="1" /></bezel>
- <bezel name="0.14" element="led"><bounds x="0" y="28" width="1" height="1" /></bezel>
- <bezel name="0.15" element="led"><bounds x="0" y="30" width="1" height="1" /></bezel>
- <bezel name="0.16" element="led"><bounds x="0" y="32" width="1" height="1" /></bezel>
- <bezel name="0.17" element="led"><bounds x="0" y="34" width="1" height="1" /></bezel>
- <bezel name="0.18" element="led"><bounds x="0" y="36" width="1" height="1" /></bezel>
- <bezel name="0.19" element="led"><bounds x="0" y="38" width="1" height="1" /></bezel>
- <bezel name="0.20" element="led"><bounds x="0" y="40" width="1" height="1" /></bezel>
- <bezel name="0.21" element="led"><bounds x="0" y="42" width="1" height="1" /></bezel>
- <bezel name="0.22" element="led"><bounds x="0" y="44" width="1" height="1" /></bezel>
- <bezel name="0.23" element="led"><bounds x="0" y="46" width="1" height="1" /></bezel>
- <bezel name="0.24" element="led"><bounds x="0" y="48" width="1" height="1" /></bezel>
- <bezel name="0.25" element="led"><bounds x="0" y="50" width="1" height="1" /></bezel>
- <bezel name="0.26" element="led"><bounds x="0" y="52" width="1" height="1" /></bezel>
- <bezel name="0.27" element="led"><bounds x="0" y="54" width="1" height="1" /></bezel>
- <bezel name="0.28" element="led"><bounds x="0" y="56" width="1" height="1" /></bezel>
- <bezel name="0.29" element="led"><bounds x="0" y="58" width="1" height="1" /></bezel>
- <bezel name="0.30" element="led"><bounds x="0" y="60" width="1" height="1" /></bezel>
- <bezel name="0.31" element="led"><bounds x="0" y="62" width="1" height="1" /></bezel>
+ <repeat count="16">
+ <param name="y" start="0" increment="1" />
- <bezel name="1.0" element="led"><bounds x="2" y="0" width="1" height="1" /></bezel>
- <bezel name="1.1" element="led"><bounds x="2" y="2" width="1" height="1" /></bezel>
- <bezel name="1.2" element="led"><bounds x="2" y="4" width="1" height="1" /></bezel>
- <bezel name="1.3" element="led"><bounds x="2" y="6" width="1" height="1" /></bezel>
- <bezel name="1.4" element="led"><bounds x="2" y="8" width="1" height="1" /></bezel>
- <bezel name="1.5" element="led"><bounds x="2" y="10" width="1" height="1" /></bezel>
- <bezel name="1.6" element="led"><bounds x="2" y="12" width="1" height="1" /></bezel>
- <bezel name="1.7" element="led"><bounds x="2" y="14" width="1" height="1" /></bezel>
- <bezel name="1.8" element="led"><bounds x="2" y="16" width="1" height="1" /></bezel>
- <bezel name="1.9" element="led"><bounds x="2" y="18" width="1" height="1" /></bezel>
- <bezel name="1.10" element="led"><bounds x="2" y="20" width="1" height="1" /></bezel>
- <bezel name="1.11" element="led"><bounds x="2" y="22" width="1" height="1" /></bezel>
- <bezel name="1.12" element="led"><bounds x="2" y="24" width="1" height="1" /></bezel>
- <bezel name="1.13" element="led"><bounds x="2" y="26" width="1" height="1" /></bezel>
- <bezel name="1.14" element="led"><bounds x="2" y="28" width="1" height="1" /></bezel>
- <bezel name="1.15" element="led"><bounds x="2" y="30" width="1" height="1" /></bezel>
- <bezel name="1.16" element="led"><bounds x="2" y="32" width="1" height="1" /></bezel>
- <bezel name="1.17" element="led"><bounds x="2" y="34" width="1" height="1" /></bezel>
- <bezel name="1.18" element="led"><bounds x="2" y="36" width="1" height="1" /></bezel>
- <bezel name="1.19" element="led"><bounds x="2" y="38" width="1" height="1" /></bezel>
- <bezel name="1.20" element="led"><bounds x="2" y="40" width="1" height="1" /></bezel>
- <bezel name="1.21" element="led"><bounds x="2" y="42" width="1" height="1" /></bezel>
- <bezel name="1.22" element="led"><bounds x="2" y="44" width="1" height="1" /></bezel>
- <bezel name="1.23" element="led"><bounds x="2" y="46" width="1" height="1" /></bezel>
- <bezel name="1.24" element="led"><bounds x="2" y="48" width="1" height="1" /></bezel>
- <bezel name="1.25" element="led"><bounds x="2" y="50" width="1" height="1" /></bezel>
- <bezel name="1.26" element="led"><bounds x="2" y="52" width="1" height="1" /></bezel>
- <bezel name="1.27" element="led"><bounds x="2" y="54" width="1" height="1" /></bezel>
- <bezel name="1.28" element="led"><bounds x="2" y="56" width="1" height="1" /></bezel>
- <bezel name="1.29" element="led"><bounds x="2" y="58" width="1" height="1" /></bezel>
- <bezel name="1.30" element="led"><bounds x="2" y="60" width="1" height="1" /></bezel>
- <bezel name="1.31" element="led"><bounds x="2" y="62" width="1" height="1" /></bezel>
-
- <bezel name="2.0" element="led"><bounds x="4" y="0" width="1" height="1" /></bezel>
- <bezel name="2.1" element="led"><bounds x="4" y="2" width="1" height="1" /></bezel>
- <bezel name="2.2" element="led"><bounds x="4" y="4" width="1" height="1" /></bezel>
- <bezel name="2.3" element="led"><bounds x="4" y="6" width="1" height="1" /></bezel>
- <bezel name="2.4" element="led"><bounds x="4" y="8" width="1" height="1" /></bezel>
- <bezel name="2.5" element="led"><bounds x="4" y="10" width="1" height="1" /></bezel>
- <bezel name="2.6" element="led"><bounds x="4" y="12" width="1" height="1" /></bezel>
- <bezel name="2.7" element="led"><bounds x="4" y="14" width="1" height="1" /></bezel>
- <bezel name="2.8" element="led"><bounds x="4" y="16" width="1" height="1" /></bezel>
- <bezel name="2.9" element="led"><bounds x="4" y="18" width="1" height="1" /></bezel>
- <bezel name="2.10" element="led"><bounds x="4" y="20" width="1" height="1" /></bezel>
- <bezel name="2.11" element="led"><bounds x="4" y="22" width="1" height="1" /></bezel>
- <bezel name="2.12" element="led"><bounds x="4" y="24" width="1" height="1" /></bezel>
- <bezel name="2.13" element="led"><bounds x="4" y="26" width="1" height="1" /></bezel>
- <bezel name="2.14" element="led"><bounds x="4" y="28" width="1" height="1" /></bezel>
- <bezel name="2.15" element="led"><bounds x="4" y="30" width="1" height="1" /></bezel>
- <bezel name="2.16" element="led"><bounds x="4" y="32" width="1" height="1" /></bezel>
- <bezel name="2.17" element="led"><bounds x="4" y="34" width="1" height="1" /></bezel>
- <bezel name="2.18" element="led"><bounds x="4" y="36" width="1" height="1" /></bezel>
- <bezel name="2.19" element="led"><bounds x="4" y="38" width="1" height="1" /></bezel>
- <bezel name="2.20" element="led"><bounds x="4" y="40" width="1" height="1" /></bezel>
- <bezel name="2.21" element="led"><bounds x="4" y="42" width="1" height="1" /></bezel>
- <bezel name="2.22" element="led"><bounds x="4" y="44" width="1" height="1" /></bezel>
- <bezel name="2.23" element="led"><bounds x="4" y="46" width="1" height="1" /></bezel>
- <bezel name="2.24" element="led"><bounds x="4" y="48" width="1" height="1" /></bezel>
- <bezel name="2.25" element="led"><bounds x="4" y="50" width="1" height="1" /></bezel>
- <bezel name="2.26" element="led"><bounds x="4" y="52" width="1" height="1" /></bezel>
- <bezel name="2.27" element="led"><bounds x="4" y="54" width="1" height="1" /></bezel>
- <bezel name="2.28" element="led"><bounds x="4" y="56" width="1" height="1" /></bezel>
- <bezel name="2.29" element="led"><bounds x="4" y="58" width="1" height="1" /></bezel>
- <bezel name="2.30" element="led"><bounds x="4" y="60" width="1" height="1" /></bezel>
- <bezel name="2.31" element="led"><bounds x="4" y="62" width="1" height="1" /></bezel>
-
- <bezel name="3.0" element="led"><bounds x="6" y="0" width="1" height="1" /></bezel>
- <bezel name="3.1" element="led"><bounds x="6" y="2" width="1" height="1" /></bezel>
- <bezel name="3.2" element="led"><bounds x="6" y="4" width="1" height="1" /></bezel>
- <bezel name="3.3" element="led"><bounds x="6" y="6" width="1" height="1" /></bezel>
- <bezel name="3.4" element="led"><bounds x="6" y="8" width="1" height="1" /></bezel>
- <bezel name="3.5" element="led"><bounds x="6" y="10" width="1" height="1" /></bezel>
- <bezel name="3.6" element="led"><bounds x="6" y="12" width="1" height="1" /></bezel>
- <bezel name="3.7" element="led"><bounds x="6" y="14" width="1" height="1" /></bezel>
- <bezel name="3.8" element="led"><bounds x="6" y="16" width="1" height="1" /></bezel>
- <bezel name="3.9" element="led"><bounds x="6" y="18" width="1" height="1" /></bezel>
- <bezel name="3.10" element="led"><bounds x="6" y="20" width="1" height="1" /></bezel>
- <bezel name="3.11" element="led"><bounds x="6" y="22" width="1" height="1" /></bezel>
- <bezel name="3.12" element="led"><bounds x="6" y="24" width="1" height="1" /></bezel>
- <bezel name="3.13" element="led"><bounds x="6" y="26" width="1" height="1" /></bezel>
- <bezel name="3.14" element="led"><bounds x="6" y="28" width="1" height="1" /></bezel>
- <bezel name="3.15" element="led"><bounds x="6" y="30" width="1" height="1" /></bezel>
- <bezel name="3.16" element="led"><bounds x="6" y="32" width="1" height="1" /></bezel>
- <bezel name="3.17" element="led"><bounds x="6" y="34" width="1" height="1" /></bezel>
- <bezel name="3.18" element="led"><bounds x="6" y="36" width="1" height="1" /></bezel>
- <bezel name="3.19" element="led"><bounds x="6" y="38" width="1" height="1" /></bezel>
- <bezel name="3.20" element="led"><bounds x="6" y="40" width="1" height="1" /></bezel>
- <bezel name="3.21" element="led"><bounds x="6" y="42" width="1" height="1" /></bezel>
- <bezel name="3.22" element="led"><bounds x="6" y="44" width="1" height="1" /></bezel>
- <bezel name="3.23" element="led"><bounds x="6" y="46" width="1" height="1" /></bezel>
- <bezel name="3.24" element="led"><bounds x="6" y="48" width="1" height="1" /></bezel>
- <bezel name="3.25" element="led"><bounds x="6" y="50" width="1" height="1" /></bezel>
- <bezel name="3.26" element="led"><bounds x="6" y="52" width="1" height="1" /></bezel>
- <bezel name="3.27" element="led"><bounds x="6" y="54" width="1" height="1" /></bezel>
- <bezel name="3.28" element="led"><bounds x="6" y="56" width="1" height="1" /></bezel>
- <bezel name="3.29" element="led"><bounds x="6" y="58" width="1" height="1" /></bezel>
- <bezel name="3.30" element="led"><bounds x="6" y="60" width="1" height="1" /></bezel>
- <bezel name="3.31" element="led"><bounds x="6" y="62" width="1" height="1" /></bezel>
-
- <bezel name="4.0" element="led"><bounds x="8" y="0" width="1" height="1" /></bezel>
- <bezel name="4.1" element="led"><bounds x="8" y="2" width="1" height="1" /></bezel>
- <bezel name="4.2" element="led"><bounds x="8" y="4" width="1" height="1" /></bezel>
- <bezel name="4.3" element="led"><bounds x="8" y="6" width="1" height="1" /></bezel>
- <bezel name="4.4" element="led"><bounds x="8" y="8" width="1" height="1" /></bezel>
- <bezel name="4.5" element="led"><bounds x="8" y="10" width="1" height="1" /></bezel>
- <bezel name="4.6" element="led"><bounds x="8" y="12" width="1" height="1" /></bezel>
- <bezel name="4.7" element="led"><bounds x="8" y="14" width="1" height="1" /></bezel>
- <bezel name="4.8" element="led"><bounds x="8" y="16" width="1" height="1" /></bezel>
- <bezel name="4.9" element="led"><bounds x="8" y="18" width="1" height="1" /></bezel>
- <bezel name="4.10" element="led"><bounds x="8" y="20" width="1" height="1" /></bezel>
- <bezel name="4.11" element="led"><bounds x="8" y="22" width="1" height="1" /></bezel>
- <bezel name="4.12" element="led"><bounds x="8" y="24" width="1" height="1" /></bezel>
- <bezel name="4.13" element="led"><bounds x="8" y="26" width="1" height="1" /></bezel>
- <bezel name="4.14" element="led"><bounds x="8" y="28" width="1" height="1" /></bezel>
- <bezel name="4.15" element="led"><bounds x="8" y="30" width="1" height="1" /></bezel>
- <bezel name="4.16" element="led"><bounds x="8" y="32" width="1" height="1" /></bezel>
- <bezel name="4.17" element="led"><bounds x="8" y="34" width="1" height="1" /></bezel>
- <bezel name="4.18" element="led"><bounds x="8" y="36" width="1" height="1" /></bezel>
- <bezel name="4.19" element="led"><bounds x="8" y="38" width="1" height="1" /></bezel>
- <bezel name="4.20" element="led"><bounds x="8" y="40" width="1" height="1" /></bezel>
- <bezel name="4.21" element="led"><bounds x="8" y="42" width="1" height="1" /></bezel>
- <bezel name="4.22" element="led"><bounds x="8" y="44" width="1" height="1" /></bezel>
- <bezel name="4.23" element="led"><bounds x="8" y="46" width="1" height="1" /></bezel>
- <bezel name="4.24" element="led"><bounds x="8" y="48" width="1" height="1" /></bezel>
- <bezel name="4.25" element="led"><bounds x="8" y="50" width="1" height="1" /></bezel>
- <bezel name="4.26" element="led"><bounds x="8" y="52" width="1" height="1" /></bezel>
- <bezel name="4.27" element="led"><bounds x="8" y="54" width="1" height="1" /></bezel>
- <bezel name="4.28" element="led"><bounds x="8" y="56" width="1" height="1" /></bezel>
- <bezel name="4.29" element="led"><bounds x="8" y="58" width="1" height="1" /></bezel>
- <bezel name="4.30" element="led"><bounds x="8" y="60" width="1" height="1" /></bezel>
- <bezel name="4.31" element="led"><bounds x="8" y="62" width="1" height="1" /></bezel>
-
- <bezel name="5.0" element="led"><bounds x="10" y="0" width="1" height="1" /></bezel>
- <bezel name="5.1" element="led"><bounds x="10" y="2" width="1" height="1" /></bezel>
- <bezel name="5.2" element="led"><bounds x="10" y="4" width="1" height="1" /></bezel>
- <bezel name="5.3" element="led"><bounds x="10" y="6" width="1" height="1" /></bezel>
- <bezel name="5.4" element="led"><bounds x="10" y="8" width="1" height="1" /></bezel>
- <bezel name="5.5" element="led"><bounds x="10" y="10" width="1" height="1" /></bezel>
- <bezel name="5.6" element="led"><bounds x="10" y="12" width="1" height="1" /></bezel>
- <bezel name="5.7" element="led"><bounds x="10" y="14" width="1" height="1" /></bezel>
- <bezel name="5.8" element="led"><bounds x="10" y="16" width="1" height="1" /></bezel>
- <bezel name="5.9" element="led"><bounds x="10" y="18" width="1" height="1" /></bezel>
- <bezel name="5.10" element="led"><bounds x="10" y="20" width="1" height="1" /></bezel>
- <bezel name="5.11" element="led"><bounds x="10" y="22" width="1" height="1" /></bezel>
- <bezel name="5.12" element="led"><bounds x="10" y="24" width="1" height="1" /></bezel>
- <bezel name="5.13" element="led"><bounds x="10" y="26" width="1" height="1" /></bezel>
- <bezel name="5.14" element="led"><bounds x="10" y="28" width="1" height="1" /></bezel>
- <bezel name="5.15" element="led"><bounds x="10" y="30" width="1" height="1" /></bezel>
- <bezel name="5.16" element="led"><bounds x="10" y="32" width="1" height="1" /></bezel>
- <bezel name="5.17" element="led"><bounds x="10" y="34" width="1" height="1" /></bezel>
- <bezel name="5.18" element="led"><bounds x="10" y="36" width="1" height="1" /></bezel>
- <bezel name="5.19" element="led"><bounds x="10" y="38" width="1" height="1" /></bezel>
- <bezel name="5.20" element="led"><bounds x="10" y="40" width="1" height="1" /></bezel>
- <bezel name="5.21" element="led"><bounds x="10" y="42" width="1" height="1" /></bezel>
- <bezel name="5.22" element="led"><bounds x="10" y="44" width="1" height="1" /></bezel>
- <bezel name="5.23" element="led"><bounds x="10" y="46" width="1" height="1" /></bezel>
- <bezel name="5.24" element="led"><bounds x="10" y="48" width="1" height="1" /></bezel>
- <bezel name="5.25" element="led"><bounds x="10" y="50" width="1" height="1" /></bezel>
- <bezel name="5.26" element="led"><bounds x="10" y="52" width="1" height="1" /></bezel>
- <bezel name="5.27" element="led"><bounds x="10" y="54" width="1" height="1" /></bezel>
- <bezel name="5.28" element="led"><bounds x="10" y="56" width="1" height="1" /></bezel>
- <bezel name="5.29" element="led"><bounds x="10" y="58" width="1" height="1" /></bezel>
- <bezel name="5.30" element="led"><bounds x="10" y="60" width="1" height="1" /></bezel>
- <bezel name="5.31" element="led"><bounds x="10" y="62" width="1" height="1" /></bezel>
-
- <bezel name="6.0" element="led"><bounds x="12" y="0" width="1" height="1" /></bezel>
- <bezel name="6.1" element="led"><bounds x="12" y="2" width="1" height="1" /></bezel>
- <bezel name="6.2" element="led"><bounds x="12" y="4" width="1" height="1" /></bezel>
- <bezel name="6.3" element="led"><bounds x="12" y="6" width="1" height="1" /></bezel>
- <bezel name="6.4" element="led"><bounds x="12" y="8" width="1" height="1" /></bezel>
- <bezel name="6.5" element="led"><bounds x="12" y="10" width="1" height="1" /></bezel>
- <bezel name="6.6" element="led"><bounds x="12" y="12" width="1" height="1" /></bezel>
- <bezel name="6.7" element="led"><bounds x="12" y="14" width="1" height="1" /></bezel>
- <bezel name="6.8" element="led"><bounds x="12" y="16" width="1" height="1" /></bezel>
- <bezel name="6.9" element="led"><bounds x="12" y="18" width="1" height="1" /></bezel>
- <bezel name="6.10" element="led"><bounds x="12" y="20" width="1" height="1" /></bezel>
- <bezel name="6.11" element="led"><bounds x="12" y="22" width="1" height="1" /></bezel>
- <bezel name="6.12" element="led"><bounds x="12" y="24" width="1" height="1" /></bezel>
- <bezel name="6.13" element="led"><bounds x="12" y="26" width="1" height="1" /></bezel>
- <bezel name="6.14" element="led"><bounds x="12" y="28" width="1" height="1" /></bezel>
- <bezel name="6.15" element="led"><bounds x="12" y="30" width="1" height="1" /></bezel>
- <bezel name="6.16" element="led"><bounds x="12" y="32" width="1" height="1" /></bezel>
- <bezel name="6.17" element="led"><bounds x="12" y="34" width="1" height="1" /></bezel>
- <bezel name="6.18" element="led"><bounds x="12" y="36" width="1" height="1" /></bezel>
- <bezel name="6.19" element="led"><bounds x="12" y="38" width="1" height="1" /></bezel>
- <bezel name="6.20" element="led"><bounds x="12" y="40" width="1" height="1" /></bezel>
- <bezel name="6.21" element="led"><bounds x="12" y="42" width="1" height="1" /></bezel>
- <bezel name="6.22" element="led"><bounds x="12" y="44" width="1" height="1" /></bezel>
- <bezel name="6.23" element="led"><bounds x="12" y="46" width="1" height="1" /></bezel>
- <bezel name="6.24" element="led"><bounds x="12" y="48" width="1" height="1" /></bezel>
- <bezel name="6.25" element="led"><bounds x="12" y="50" width="1" height="1" /></bezel>
- <bezel name="6.26" element="led"><bounds x="12" y="52" width="1" height="1" /></bezel>
- <bezel name="6.27" element="led"><bounds x="12" y="54" width="1" height="1" /></bezel>
- <bezel name="6.28" element="led"><bounds x="12" y="56" width="1" height="1" /></bezel>
- <bezel name="6.29" element="led"><bounds x="12" y="58" width="1" height="1" /></bezel>
- <bezel name="6.30" element="led"><bounds x="12" y="60" width="1" height="1" /></bezel>
- <bezel name="6.31" element="led"><bounds x="12" y="62" width="1" height="1" /></bezel>
-
- <bezel name="7.0" element="led"><bounds x="14" y="0" width="1" height="1" /></bezel>
- <bezel name="7.1" element="led"><bounds x="14" y="2" width="1" height="1" /></bezel>
- <bezel name="7.2" element="led"><bounds x="14" y="4" width="1" height="1" /></bezel>
- <bezel name="7.3" element="led"><bounds x="14" y="6" width="1" height="1" /></bezel>
- <bezel name="7.4" element="led"><bounds x="14" y="8" width="1" height="1" /></bezel>
- <bezel name="7.5" element="led"><bounds x="14" y="10" width="1" height="1" /></bezel>
- <bezel name="7.6" element="led"><bounds x="14" y="12" width="1" height="1" /></bezel>
- <bezel name="7.7" element="led"><bounds x="14" y="14" width="1" height="1" /></bezel>
- <bezel name="7.8" element="led"><bounds x="14" y="16" width="1" height="1" /></bezel>
- <bezel name="7.9" element="led"><bounds x="14" y="18" width="1" height="1" /></bezel>
- <bezel name="7.10" element="led"><bounds x="14" y="20" width="1" height="1" /></bezel>
- <bezel name="7.11" element="led"><bounds x="14" y="22" width="1" height="1" /></bezel>
- <bezel name="7.12" element="led"><bounds x="14" y="24" width="1" height="1" /></bezel>
- <bezel name="7.13" element="led"><bounds x="14" y="26" width="1" height="1" /></bezel>
- <bezel name="7.14" element="led"><bounds x="14" y="28" width="1" height="1" /></bezel>
- <bezel name="7.15" element="led"><bounds x="14" y="30" width="1" height="1" /></bezel>
- <bezel name="7.16" element="led"><bounds x="14" y="32" width="1" height="1" /></bezel>
- <bezel name="7.17" element="led"><bounds x="14" y="34" width="1" height="1" /></bezel>
- <bezel name="7.18" element="led"><bounds x="14" y="36" width="1" height="1" /></bezel>
- <bezel name="7.19" element="led"><bounds x="14" y="38" width="1" height="1" /></bezel>
- <bezel name="7.20" element="led"><bounds x="14" y="40" width="1" height="1" /></bezel>
- <bezel name="7.21" element="led"><bounds x="14" y="42" width="1" height="1" /></bezel>
- <bezel name="7.22" element="led"><bounds x="14" y="44" width="1" height="1" /></bezel>
- <bezel name="7.23" element="led"><bounds x="14" y="46" width="1" height="1" /></bezel>
- <bezel name="7.24" element="led"><bounds x="14" y="48" width="1" height="1" /></bezel>
- <bezel name="7.25" element="led"><bounds x="14" y="50" width="1" height="1" /></bezel>
- <bezel name="7.26" element="led"><bounds x="14" y="52" width="1" height="1" /></bezel>
- <bezel name="7.27" element="led"><bounds x="14" y="54" width="1" height="1" /></bezel>
- <bezel name="7.28" element="led"><bounds x="14" y="56" width="1" height="1" /></bezel>
- <bezel name="7.29" element="led"><bounds x="14" y="58" width="1" height="1" /></bezel>
- <bezel name="7.30" element="led"><bounds x="14" y="60" width="1" height="1" /></bezel>
- <bezel name="7.31" element="led"><bounds x="14" y="62" width="1" height="1" /></bezel>
-
- <bezel name="8.0" element="led"><bounds x="16" y="0" width="1" height="1" /></bezel>
- <bezel name="8.1" element="led"><bounds x="16" y="2" width="1" height="1" /></bezel>
- <bezel name="8.2" element="led"><bounds x="16" y="4" width="1" height="1" /></bezel>
- <bezel name="8.3" element="led"><bounds x="16" y="6" width="1" height="1" /></bezel>
- <bezel name="8.4" element="led"><bounds x="16" y="8" width="1" height="1" /></bezel>
- <bezel name="8.5" element="led"><bounds x="16" y="10" width="1" height="1" /></bezel>
- <bezel name="8.6" element="led"><bounds x="16" y="12" width="1" height="1" /></bezel>
- <bezel name="8.7" element="led"><bounds x="16" y="14" width="1" height="1" /></bezel>
- <bezel name="8.8" element="led"><bounds x="16" y="16" width="1" height="1" /></bezel>
- <bezel name="8.9" element="led"><bounds x="16" y="18" width="1" height="1" /></bezel>
- <bezel name="8.10" element="led"><bounds x="16" y="20" width="1" height="1" /></bezel>
- <bezel name="8.11" element="led"><bounds x="16" y="22" width="1" height="1" /></bezel>
- <bezel name="8.12" element="led"><bounds x="16" y="24" width="1" height="1" /></bezel>
- <bezel name="8.13" element="led"><bounds x="16" y="26" width="1" height="1" /></bezel>
- <bezel name="8.14" element="led"><bounds x="16" y="28" width="1" height="1" /></bezel>
- <bezel name="8.15" element="led"><bounds x="16" y="30" width="1" height="1" /></bezel>
- <bezel name="8.16" element="led"><bounds x="16" y="32" width="1" height="1" /></bezel>
- <bezel name="8.17" element="led"><bounds x="16" y="34" width="1" height="1" /></bezel>
- <bezel name="8.18" element="led"><bounds x="16" y="36" width="1" height="1" /></bezel>
- <bezel name="8.19" element="led"><bounds x="16" y="38" width="1" height="1" /></bezel>
- <bezel name="8.20" element="led"><bounds x="16" y="40" width="1" height="1" /></bezel>
- <bezel name="8.21" element="led"><bounds x="16" y="42" width="1" height="1" /></bezel>
- <bezel name="8.22" element="led"><bounds x="16" y="44" width="1" height="1" /></bezel>
- <bezel name="8.23" element="led"><bounds x="16" y="46" width="1" height="1" /></bezel>
- <bezel name="8.24" element="led"><bounds x="16" y="48" width="1" height="1" /></bezel>
- <bezel name="8.25" element="led"><bounds x="16" y="50" width="1" height="1" /></bezel>
- <bezel name="8.26" element="led"><bounds x="16" y="52" width="1" height="1" /></bezel>
- <bezel name="8.27" element="led"><bounds x="16" y="54" width="1" height="1" /></bezel>
- <bezel name="8.28" element="led"><bounds x="16" y="56" width="1" height="1" /></bezel>
- <bezel name="8.29" element="led"><bounds x="16" y="58" width="1" height="1" /></bezel>
- <bezel name="8.30" element="led"><bounds x="16" y="60" width="1" height="1" /></bezel>
- <bezel name="8.31" element="led"><bounds x="16" y="62" width="1" height="1" /></bezel>
-
- <bezel name="9.0" element="led"><bounds x="18" y="0" width="1" height="1" /></bezel>
- <bezel name="9.1" element="led"><bounds x="18" y="2" width="1" height="1" /></bezel>
- <bezel name="9.2" element="led"><bounds x="18" y="4" width="1" height="1" /></bezel>
- <bezel name="9.3" element="led"><bounds x="18" y="6" width="1" height="1" /></bezel>
- <bezel name="9.4" element="led"><bounds x="18" y="8" width="1" height="1" /></bezel>
- <bezel name="9.5" element="led"><bounds x="18" y="10" width="1" height="1" /></bezel>
- <bezel name="9.6" element="led"><bounds x="18" y="12" width="1" height="1" /></bezel>
- <bezel name="9.7" element="led"><bounds x="18" y="14" width="1" height="1" /></bezel>
- <bezel name="9.8" element="led"><bounds x="18" y="16" width="1" height="1" /></bezel>
- <bezel name="9.9" element="led"><bounds x="18" y="18" width="1" height="1" /></bezel>
- <bezel name="9.10" element="led"><bounds x="18" y="20" width="1" height="1" /></bezel>
- <bezel name="9.11" element="led"><bounds x="18" y="22" width="1" height="1" /></bezel>
- <bezel name="9.12" element="led"><bounds x="18" y="24" width="1" height="1" /></bezel>
- <bezel name="9.13" element="led"><bounds x="18" y="26" width="1" height="1" /></bezel>
- <bezel name="9.14" element="led"><bounds x="18" y="28" width="1" height="1" /></bezel>
- <bezel name="9.15" element="led"><bounds x="18" y="30" width="1" height="1" /></bezel>
- <bezel name="9.16" element="led"><bounds x="18" y="32" width="1" height="1" /></bezel>
- <bezel name="9.17" element="led"><bounds x="18" y="34" width="1" height="1" /></bezel>
- <bezel name="9.18" element="led"><bounds x="18" y="36" width="1" height="1" /></bezel>
- <bezel name="9.19" element="led"><bounds x="18" y="38" width="1" height="1" /></bezel>
- <bezel name="9.20" element="led"><bounds x="18" y="40" width="1" height="1" /></bezel>
- <bezel name="9.21" element="led"><bounds x="18" y="42" width="1" height="1" /></bezel>
- <bezel name="9.22" element="led"><bounds x="18" y="44" width="1" height="1" /></bezel>
- <bezel name="9.23" element="led"><bounds x="18" y="46" width="1" height="1" /></bezel>
- <bezel name="9.24" element="led"><bounds x="18" y="48" width="1" height="1" /></bezel>
- <bezel name="9.25" element="led"><bounds x="18" y="50" width="1" height="1" /></bezel>
- <bezel name="9.26" element="led"><bounds x="18" y="52" width="1" height="1" /></bezel>
- <bezel name="9.27" element="led"><bounds x="18" y="54" width="1" height="1" /></bezel>
- <bezel name="9.28" element="led"><bounds x="18" y="56" width="1" height="1" /></bezel>
- <bezel name="9.29" element="led"><bounds x="18" y="58" width="1" height="1" /></bezel>
- <bezel name="9.30" element="led"><bounds x="18" y="60" width="1" height="1" /></bezel>
- <bezel name="9.31" element="led"><bounds x="18" y="62" width="1" height="1" /></bezel>
-
- <bezel name="10.0" element="led"><bounds x="20" y="0" width="1" height="1" /></bezel>
- <bezel name="10.1" element="led"><bounds x="20" y="2" width="1" height="1" /></bezel>
- <bezel name="10.2" element="led"><bounds x="20" y="4" width="1" height="1" /></bezel>
- <bezel name="10.3" element="led"><bounds x="20" y="6" width="1" height="1" /></bezel>
- <bezel name="10.4" element="led"><bounds x="20" y="8" width="1" height="1" /></bezel>
- <bezel name="10.5" element="led"><bounds x="20" y="10" width="1" height="1" /></bezel>
- <bezel name="10.6" element="led"><bounds x="20" y="12" width="1" height="1" /></bezel>
- <bezel name="10.7" element="led"><bounds x="20" y="14" width="1" height="1" /></bezel>
- <bezel name="10.8" element="led"><bounds x="20" y="16" width="1" height="1" /></bezel>
- <bezel name="10.9" element="led"><bounds x="20" y="18" width="1" height="1" /></bezel>
- <bezel name="10.10" element="led"><bounds x="20" y="20" width="1" height="1" /></bezel>
- <bezel name="10.11" element="led"><bounds x="20" y="22" width="1" height="1" /></bezel>
- <bezel name="10.12" element="led"><bounds x="20" y="24" width="1" height="1" /></bezel>
- <bezel name="10.13" element="led"><bounds x="20" y="26" width="1" height="1" /></bezel>
- <bezel name="10.14" element="led"><bounds x="20" y="28" width="1" height="1" /></bezel>
- <bezel name="10.15" element="led"><bounds x="20" y="30" width="1" height="1" /></bezel>
- <bezel name="10.16" element="led"><bounds x="20" y="32" width="1" height="1" /></bezel>
- <bezel name="10.17" element="led"><bounds x="20" y="34" width="1" height="1" /></bezel>
- <bezel name="10.18" element="led"><bounds x="20" y="36" width="1" height="1" /></bezel>
- <bezel name="10.19" element="led"><bounds x="20" y="38" width="1" height="1" /></bezel>
- <bezel name="10.20" element="led"><bounds x="20" y="40" width="1" height="1" /></bezel>
- <bezel name="10.21" element="led"><bounds x="20" y="42" width="1" height="1" /></bezel>
- <bezel name="10.22" element="led"><bounds x="20" y="44" width="1" height="1" /></bezel>
- <bezel name="10.23" element="led"><bounds x="20" y="46" width="1" height="1" /></bezel>
- <bezel name="10.24" element="led"><bounds x="20" y="48" width="1" height="1" /></bezel>
- <bezel name="10.25" element="led"><bounds x="20" y="50" width="1" height="1" /></bezel>
- <bezel name="10.26" element="led"><bounds x="20" y="52" width="1" height="1" /></bezel>
- <bezel name="10.27" element="led"><bounds x="20" y="54" width="1" height="1" /></bezel>
- <bezel name="10.28" element="led"><bounds x="20" y="56" width="1" height="1" /></bezel>
- <bezel name="10.29" element="led"><bounds x="20" y="58" width="1" height="1" /></bezel>
- <bezel name="10.30" element="led"><bounds x="20" y="60" width="1" height="1" /></bezel>
- <bezel name="10.31" element="led"><bounds x="20" y="62" width="1" height="1" /></bezel>
-
- <bezel name="11.0" element="led"><bounds x="22" y="0" width="1" height="1" /></bezel>
- <bezel name="11.1" element="led"><bounds x="22" y="2" width="1" height="1" /></bezel>
- <bezel name="11.2" element="led"><bounds x="22" y="4" width="1" height="1" /></bezel>
- <bezel name="11.3" element="led"><bounds x="22" y="6" width="1" height="1" /></bezel>
- <bezel name="11.4" element="led"><bounds x="22" y="8" width="1" height="1" /></bezel>
- <bezel name="11.5" element="led"><bounds x="22" y="10" width="1" height="1" /></bezel>
- <bezel name="11.6" element="led"><bounds x="22" y="12" width="1" height="1" /></bezel>
- <bezel name="11.7" element="led"><bounds x="22" y="14" width="1" height="1" /></bezel>
- <bezel name="11.8" element="led"><bounds x="22" y="16" width="1" height="1" /></bezel>
- <bezel name="11.9" element="led"><bounds x="22" y="18" width="1" height="1" /></bezel>
- <bezel name="11.10" element="led"><bounds x="22" y="20" width="1" height="1" /></bezel>
- <bezel name="11.11" element="led"><bounds x="22" y="22" width="1" height="1" /></bezel>
- <bezel name="11.12" element="led"><bounds x="22" y="24" width="1" height="1" /></bezel>
- <bezel name="11.13" element="led"><bounds x="22" y="26" width="1" height="1" /></bezel>
- <bezel name="11.14" element="led"><bounds x="22" y="28" width="1" height="1" /></bezel>
- <bezel name="11.15" element="led"><bounds x="22" y="30" width="1" height="1" /></bezel>
- <bezel name="11.16" element="led"><bounds x="22" y="32" width="1" height="1" /></bezel>
- <bezel name="11.17" element="led"><bounds x="22" y="34" width="1" height="1" /></bezel>
- <bezel name="11.18" element="led"><bounds x="22" y="36" width="1" height="1" /></bezel>
- <bezel name="11.19" element="led"><bounds x="22" y="38" width="1" height="1" /></bezel>
- <bezel name="11.20" element="led"><bounds x="22" y="40" width="1" height="1" /></bezel>
- <bezel name="11.21" element="led"><bounds x="22" y="42" width="1" height="1" /></bezel>
- <bezel name="11.22" element="led"><bounds x="22" y="44" width="1" height="1" /></bezel>
- <bezel name="11.23" element="led"><bounds x="22" y="46" width="1" height="1" /></bezel>
- <bezel name="11.24" element="led"><bounds x="22" y="48" width="1" height="1" /></bezel>
- <bezel name="11.25" element="led"><bounds x="22" y="50" width="1" height="1" /></bezel>
- <bezel name="11.26" element="led"><bounds x="22" y="52" width="1" height="1" /></bezel>
- <bezel name="11.27" element="led"><bounds x="22" y="54" width="1" height="1" /></bezel>
- <bezel name="11.28" element="led"><bounds x="22" y="56" width="1" height="1" /></bezel>
- <bezel name="11.29" element="led"><bounds x="22" y="58" width="1" height="1" /></bezel>
- <bezel name="11.30" element="led"><bounds x="22" y="60" width="1" height="1" /></bezel>
- <bezel name="11.31" element="led"><bounds x="22" y="62" width="1" height="1" /></bezel>
-
- <bezel name="12.0" element="led"><bounds x="24" y="0" width="1" height="1" /></bezel>
- <bezel name="12.1" element="led"><bounds x="24" y="2" width="1" height="1" /></bezel>
- <bezel name="12.2" element="led"><bounds x="24" y="4" width="1" height="1" /></bezel>
- <bezel name="12.3" element="led"><bounds x="24" y="6" width="1" height="1" /></bezel>
- <bezel name="12.4" element="led"><bounds x="24" y="8" width="1" height="1" /></bezel>
- <bezel name="12.5" element="led"><bounds x="24" y="10" width="1" height="1" /></bezel>
- <bezel name="12.6" element="led"><bounds x="24" y="12" width="1" height="1" /></bezel>
- <bezel name="12.7" element="led"><bounds x="24" y="14" width="1" height="1" /></bezel>
- <bezel name="12.8" element="led"><bounds x="24" y="16" width="1" height="1" /></bezel>
- <bezel name="12.9" element="led"><bounds x="24" y="18" width="1" height="1" /></bezel>
- <bezel name="12.10" element="led"><bounds x="24" y="20" width="1" height="1" /></bezel>
- <bezel name="12.11" element="led"><bounds x="24" y="22" width="1" height="1" /></bezel>
- <bezel name="12.12" element="led"><bounds x="24" y="24" width="1" height="1" /></bezel>
- <bezel name="12.13" element="led"><bounds x="24" y="26" width="1" height="1" /></bezel>
- <bezel name="12.14" element="led"><bounds x="24" y="28" width="1" height="1" /></bezel>
- <bezel name="12.15" element="led"><bounds x="24" y="30" width="1" height="1" /></bezel>
- <bezel name="12.16" element="led"><bounds x="24" y="32" width="1" height="1" /></bezel>
- <bezel name="12.17" element="led"><bounds x="24" y="34" width="1" height="1" /></bezel>
- <bezel name="12.18" element="led"><bounds x="24" y="36" width="1" height="1" /></bezel>
- <bezel name="12.19" element="led"><bounds x="24" y="38" width="1" height="1" /></bezel>
- <bezel name="12.20" element="led"><bounds x="24" y="40" width="1" height="1" /></bezel>
- <bezel name="12.21" element="led"><bounds x="24" y="42" width="1" height="1" /></bezel>
- <bezel name="12.22" element="led"><bounds x="24" y="44" width="1" height="1" /></bezel>
- <bezel name="12.23" element="led"><bounds x="24" y="46" width="1" height="1" /></bezel>
- <bezel name="12.24" element="led"><bounds x="24" y="48" width="1" height="1" /></bezel>
- <bezel name="12.25" element="led"><bounds x="24" y="50" width="1" height="1" /></bezel>
- <bezel name="12.26" element="led"><bounds x="24" y="52" width="1" height="1" /></bezel>
- <bezel name="12.27" element="led"><bounds x="24" y="54" width="1" height="1" /></bezel>
- <bezel name="12.28" element="led"><bounds x="24" y="56" width="1" height="1" /></bezel>
- <bezel name="12.29" element="led"><bounds x="24" y="58" width="1" height="1" /></bezel>
- <bezel name="12.30" element="led"><bounds x="24" y="60" width="1" height="1" /></bezel>
- <bezel name="12.31" element="led"><bounds x="24" y="62" width="1" height="1" /></bezel>
-
- <bezel name="13.0" element="led"><bounds x="26" y="0" width="1" height="1" /></bezel>
- <bezel name="13.1" element="led"><bounds x="26" y="2" width="1" height="1" /></bezel>
- <bezel name="13.2" element="led"><bounds x="26" y="4" width="1" height="1" /></bezel>
- <bezel name="13.3" element="led"><bounds x="26" y="6" width="1" height="1" /></bezel>
- <bezel name="13.4" element="led"><bounds x="26" y="8" width="1" height="1" /></bezel>
- <bezel name="13.5" element="led"><bounds x="26" y="10" width="1" height="1" /></bezel>
- <bezel name="13.6" element="led"><bounds x="26" y="12" width="1" height="1" /></bezel>
- <bezel name="13.7" element="led"><bounds x="26" y="14" width="1" height="1" /></bezel>
- <bezel name="13.8" element="led"><bounds x="26" y="16" width="1" height="1" /></bezel>
- <bezel name="13.9" element="led"><bounds x="26" y="18" width="1" height="1" /></bezel>
- <bezel name="13.10" element="led"><bounds x="26" y="20" width="1" height="1" /></bezel>
- <bezel name="13.11" element="led"><bounds x="26" y="22" width="1" height="1" /></bezel>
- <bezel name="13.12" element="led"><bounds x="26" y="24" width="1" height="1" /></bezel>
- <bezel name="13.13" element="led"><bounds x="26" y="26" width="1" height="1" /></bezel>
- <bezel name="13.14" element="led"><bounds x="26" y="28" width="1" height="1" /></bezel>
- <bezel name="13.15" element="led"><bounds x="26" y="30" width="1" height="1" /></bezel>
- <bezel name="13.16" element="led"><bounds x="26" y="32" width="1" height="1" /></bezel>
- <bezel name="13.17" element="led"><bounds x="26" y="34" width="1" height="1" /></bezel>
- <bezel name="13.18" element="led"><bounds x="26" y="36" width="1" height="1" /></bezel>
- <bezel name="13.19" element="led"><bounds x="26" y="38" width="1" height="1" /></bezel>
- <bezel name="13.20" element="led"><bounds x="26" y="40" width="1" height="1" /></bezel>
- <bezel name="13.21" element="led"><bounds x="26" y="42" width="1" height="1" /></bezel>
- <bezel name="13.22" element="led"><bounds x="26" y="44" width="1" height="1" /></bezel>
- <bezel name="13.23" element="led"><bounds x="26" y="46" width="1" height="1" /></bezel>
- <bezel name="13.24" element="led"><bounds x="26" y="48" width="1" height="1" /></bezel>
- <bezel name="13.25" element="led"><bounds x="26" y="50" width="1" height="1" /></bezel>
- <bezel name="13.26" element="led"><bounds x="26" y="52" width="1" height="1" /></bezel>
- <bezel name="13.27" element="led"><bounds x="26" y="54" width="1" height="1" /></bezel>
- <bezel name="13.28" element="led"><bounds x="26" y="56" width="1" height="1" /></bezel>
- <bezel name="13.29" element="led"><bounds x="26" y="58" width="1" height="1" /></bezel>
- <bezel name="13.30" element="led"><bounds x="26" y="60" width="1" height="1" /></bezel>
- <bezel name="13.31" element="led"><bounds x="26" y="62" width="1" height="1" /></bezel>
-
- <bezel name="14.0" element="led"><bounds x="28" y="0" width="1" height="1" /></bezel>
- <bezel name="14.1" element="led"><bounds x="28" y="2" width="1" height="1" /></bezel>
- <bezel name="14.2" element="led"><bounds x="28" y="4" width="1" height="1" /></bezel>
- <bezel name="14.3" element="led"><bounds x="28" y="6" width="1" height="1" /></bezel>
- <bezel name="14.4" element="led"><bounds x="28" y="8" width="1" height="1" /></bezel>
- <bezel name="14.5" element="led"><bounds x="28" y="10" width="1" height="1" /></bezel>
- <bezel name="14.6" element="led"><bounds x="28" y="12" width="1" height="1" /></bezel>
- <bezel name="14.7" element="led"><bounds x="28" y="14" width="1" height="1" /></bezel>
- <bezel name="14.8" element="led"><bounds x="28" y="16" width="1" height="1" /></bezel>
- <bezel name="14.9" element="led"><bounds x="28" y="18" width="1" height="1" /></bezel>
- <bezel name="14.10" element="led"><bounds x="28" y="20" width="1" height="1" /></bezel>
- <bezel name="14.11" element="led"><bounds x="28" y="22" width="1" height="1" /></bezel>
- <bezel name="14.12" element="led"><bounds x="28" y="24" width="1" height="1" /></bezel>
- <bezel name="14.13" element="led"><bounds x="28" y="26" width="1" height="1" /></bezel>
- <bezel name="14.14" element="led"><bounds x="28" y="28" width="1" height="1" /></bezel>
- <bezel name="14.15" element="led"><bounds x="28" y="30" width="1" height="1" /></bezel>
- <bezel name="14.16" element="led"><bounds x="28" y="32" width="1" height="1" /></bezel>
- <bezel name="14.17" element="led"><bounds x="28" y="34" width="1" height="1" /></bezel>
- <bezel name="14.18" element="led"><bounds x="28" y="36" width="1" height="1" /></bezel>
- <bezel name="14.19" element="led"><bounds x="28" y="38" width="1" height="1" /></bezel>
- <bezel name="14.20" element="led"><bounds x="28" y="40" width="1" height="1" /></bezel>
- <bezel name="14.21" element="led"><bounds x="28" y="42" width="1" height="1" /></bezel>
- <bezel name="14.22" element="led"><bounds x="28" y="44" width="1" height="1" /></bezel>
- <bezel name="14.23" element="led"><bounds x="28" y="46" width="1" height="1" /></bezel>
- <bezel name="14.24" element="led"><bounds x="28" y="48" width="1" height="1" /></bezel>
- <bezel name="14.25" element="led"><bounds x="28" y="50" width="1" height="1" /></bezel>
- <bezel name="14.26" element="led"><bounds x="28" y="52" width="1" height="1" /></bezel>
- <bezel name="14.27" element="led"><bounds x="28" y="54" width="1" height="1" /></bezel>
- <bezel name="14.28" element="led"><bounds x="28" y="56" width="1" height="1" /></bezel>
- <bezel name="14.29" element="led"><bounds x="28" y="58" width="1" height="1" /></bezel>
- <bezel name="14.30" element="led"><bounds x="28" y="60" width="1" height="1" /></bezel>
- <bezel name="14.31" element="led"><bounds x="28" y="62" width="1" height="1" /></bezel>
-
- <bezel name="15.0" element="led"><bounds x="30" y="0" width="1" height="1" /></bezel>
- <bezel name="15.1" element="led"><bounds x="30" y="2" width="1" height="1" /></bezel>
- <bezel name="15.2" element="led"><bounds x="30" y="4" width="1" height="1" /></bezel>
- <bezel name="15.3" element="led"><bounds x="30" y="6" width="1" height="1" /></bezel>
- <bezel name="15.4" element="led"><bounds x="30" y="8" width="1" height="1" /></bezel>
- <bezel name="15.5" element="led"><bounds x="30" y="10" width="1" height="1" /></bezel>
- <bezel name="15.6" element="led"><bounds x="30" y="12" width="1" height="1" /></bezel>
- <bezel name="15.7" element="led"><bounds x="30" y="14" width="1" height="1" /></bezel>
- <bezel name="15.8" element="led"><bounds x="30" y="16" width="1" height="1" /></bezel>
- <bezel name="15.9" element="led"><bounds x="30" y="18" width="1" height="1" /></bezel>
- <bezel name="15.10" element="led"><bounds x="30" y="20" width="1" height="1" /></bezel>
- <bezel name="15.11" element="led"><bounds x="30" y="22" width="1" height="1" /></bezel>
- <bezel name="15.12" element="led"><bounds x="30" y="24" width="1" height="1" /></bezel>
- <bezel name="15.13" element="led"><bounds x="30" y="26" width="1" height="1" /></bezel>
- <bezel name="15.14" element="led"><bounds x="30" y="28" width="1" height="1" /></bezel>
- <bezel name="15.15" element="led"><bounds x="30" y="30" width="1" height="1" /></bezel>
- <bezel name="15.16" element="led"><bounds x="30" y="32" width="1" height="1" /></bezel>
- <bezel name="15.17" element="led"><bounds x="30" y="34" width="1" height="1" /></bezel>
- <bezel name="15.18" element="led"><bounds x="30" y="36" width="1" height="1" /></bezel>
- <bezel name="15.19" element="led"><bounds x="30" y="38" width="1" height="1" /></bezel>
- <bezel name="15.20" element="led"><bounds x="30" y="40" width="1" height="1" /></bezel>
- <bezel name="15.21" element="led"><bounds x="30" y="42" width="1" height="1" /></bezel>
- <bezel name="15.22" element="led"><bounds x="30" y="44" width="1" height="1" /></bezel>
- <bezel name="15.23" element="led"><bounds x="30" y="46" width="1" height="1" /></bezel>
- <bezel name="15.24" element="led"><bounds x="30" y="48" width="1" height="1" /></bezel>
- <bezel name="15.25" element="led"><bounds x="30" y="50" width="1" height="1" /></bezel>
- <bezel name="15.26" element="led"><bounds x="30" y="52" width="1" height="1" /></bezel>
- <bezel name="15.27" element="led"><bounds x="30" y="54" width="1" height="1" /></bezel>
- <bezel name="15.28" element="led"><bounds x="30" y="56" width="1" height="1" /></bezel>
- <bezel name="15.29" element="led"><bounds x="30" y="58" width="1" height="1" /></bezel>
- <bezel name="15.30" element="led"><bounds x="30" y="60" width="1" height="1" /></bezel>
- <bezel name="15.31" element="led"><bounds x="30" y="62" width="1" height="1" /></bezel>
+ <repeat count="32">
+ <param name="x" start="0" increment="1" />
+ <bezel name="~y~.~x~" element="led"><bounds x="~x~" y="~y~" width="0.5" height="0.5" /></bezel>
+ </repeat>
+ </repeat>
</view>
</mamelayout>
diff --git a/src/mame/layout/hh_sm500_test.lay b/src/mame/layout/hh_sm500_test.lay
index 4ad1c920600..2c6a0ccd988 100644
--- a/src/mame/layout/hh_sm500_test.lay
+++ b/src/mame/layout/hh_sm500_test.lay
@@ -15,96 +15,30 @@
<!-- build screen -->
<view name="Test Layout">
- <bounds left="0" right="64" top="0" bottom="64" />
+ <bounds left="0" right="10" top="0" bottom="10" />
<bezel element="static_black">
- <bounds left="0" right="64" top="0" bottom="64" />
+ <bounds left="0" right="10" top="0" bottom="10" />
</bezel>
<!-- max 9*4*2 matrix -->
- <!-- h1 -->
-
- <bezel name="0.0.0" element="led"><bounds x="0" y="0" width="1" height="1" /></bezel>
- <bezel name="1.0.0" element="led"><bounds x="0" y="2" width="1" height="1" /></bezel>
- <bezel name="2.0.0" element="led"><bounds x="0" y="4" width="1" height="1" /></bezel>
- <bezel name="3.0.0" element="led"><bounds x="0" y="6" width="1" height="1" /></bezel>
- <bezel name="4.0.0" element="led"><bounds x="0" y="8" width="1" height="1" /></bezel>
- <bezel name="5.0.0" element="led"><bounds x="0" y="10" width="1" height="1" /></bezel>
- <bezel name="6.0.0" element="led"><bounds x="0" y="12" width="1" height="1" /></bezel>
- <bezel name="7.0.0" element="led"><bounds x="0" y="14" width="1" height="1" /></bezel>
- <bezel name="8.0.0" element="led"><bounds x="0" y="16" width="1" height="1" /></bezel>
-
- <bezel name="0.1.0" element="led"><bounds x="2" y="0" width="1" height="1" /></bezel>
- <bezel name="1.1.0" element="led"><bounds x="2" y="2" width="1" height="1" /></bezel>
- <bezel name="2.1.0" element="led"><bounds x="2" y="4" width="1" height="1" /></bezel>
- <bezel name="3.1.0" element="led"><bounds x="2" y="6" width="1" height="1" /></bezel>
- <bezel name="4.1.0" element="led"><bounds x="2" y="8" width="1" height="1" /></bezel>
- <bezel name="5.1.0" element="led"><bounds x="2" y="10" width="1" height="1" /></bezel>
- <bezel name="6.1.0" element="led"><bounds x="2" y="12" width="1" height="1" /></bezel>
- <bezel name="7.1.0" element="led"><bounds x="2" y="14" width="1" height="1" /></bezel>
- <bezel name="8.1.0" element="led"><bounds x="2" y="16" width="1" height="1" /></bezel>
-
- <bezel name="0.2.0" element="led"><bounds x="4" y="0" width="1" height="1" /></bezel>
- <bezel name="1.2.0" element="led"><bounds x="4" y="2" width="1" height="1" /></bezel>
- <bezel name="2.2.0" element="led"><bounds x="4" y="4" width="1" height="1" /></bezel>
- <bezel name="3.2.0" element="led"><bounds x="4" y="6" width="1" height="1" /></bezel>
- <bezel name="4.2.0" element="led"><bounds x="4" y="8" width="1" height="1" /></bezel>
- <bezel name="5.2.0" element="led"><bounds x="4" y="10" width="1" height="1" /></bezel>
- <bezel name="6.2.0" element="led"><bounds x="4" y="12" width="1" height="1" /></bezel>
- <bezel name="7.2.0" element="led"><bounds x="4" y="14" width="1" height="1" /></bezel>
- <bezel name="8.2.0" element="led"><bounds x="4" y="16" width="1" height="1" /></bezel>
-
- <bezel name="0.3.0" element="led"><bounds x="6" y="0" width="1" height="1" /></bezel>
- <bezel name="1.3.0" element="led"><bounds x="6" y="2" width="1" height="1" /></bezel>
- <bezel name="2.3.0" element="led"><bounds x="6" y="4" width="1" height="1" /></bezel>
- <bezel name="3.3.0" element="led"><bounds x="6" y="6" width="1" height="1" /></bezel>
- <bezel name="4.3.0" element="led"><bounds x="6" y="8" width="1" height="1" /></bezel>
- <bezel name="5.3.0" element="led"><bounds x="6" y="10" width="1" height="1" /></bezel>
- <bezel name="6.3.0" element="led"><bounds x="6" y="12" width="1" height="1" /></bezel>
- <bezel name="7.3.0" element="led"><bounds x="6" y="14" width="1" height="1" /></bezel>
- <bezel name="8.3.0" element="led"><bounds x="6" y="16" width="1" height="1" /></bezel>
-
- <!-- h2 -->
-
- <bezel name="0.0.1" element="led"><bounds x="10" y="0" width="1" height="1" /></bezel>
- <bezel name="1.0.1" element="led"><bounds x="10" y="2" width="1" height="1" /></bezel>
- <bezel name="2.0.1" element="led"><bounds x="10" y="4" width="1" height="1" /></bezel>
- <bezel name="3.0.1" element="led"><bounds x="10" y="6" width="1" height="1" /></bezel>
- <bezel name="4.0.1" element="led"><bounds x="10" y="8" width="1" height="1" /></bezel>
- <bezel name="5.0.1" element="led"><bounds x="10" y="10" width="1" height="1" /></bezel>
- <bezel name="6.0.1" element="led"><bounds x="10" y="12" width="1" height="1" /></bezel>
- <bezel name="7.0.1" element="led"><bounds x="10" y="14" width="1" height="1" /></bezel>
- <bezel name="8.0.1" element="led"><bounds x="10" y="16" width="1" height="1" /></bezel>
-
- <bezel name="0.1.1" element="led"><bounds x="12" y="0" width="1" height="1" /></bezel>
- <bezel name="1.1.1" element="led"><bounds x="12" y="2" width="1" height="1" /></bezel>
- <bezel name="2.1.1" element="led"><bounds x="12" y="4" width="1" height="1" /></bezel>
- <bezel name="3.1.1" element="led"><bounds x="12" y="6" width="1" height="1" /></bezel>
- <bezel name="4.1.1" element="led"><bounds x="12" y="8" width="1" height="1" /></bezel>
- <bezel name="5.1.1" element="led"><bounds x="12" y="10" width="1" height="1" /></bezel>
- <bezel name="6.1.1" element="led"><bounds x="12" y="12" width="1" height="1" /></bezel>
- <bezel name="7.1.1" element="led"><bounds x="12" y="14" width="1" height="1" /></bezel>
- <bezel name="8.1.1" element="led"><bounds x="12" y="16" width="1" height="1" /></bezel>
-
- <bezel name="0.2.1" element="led"><bounds x="14" y="0" width="1" height="1" /></bezel>
- <bezel name="1.2.1" element="led"><bounds x="14" y="2" width="1" height="1" /></bezel>
- <bezel name="2.2.1" element="led"><bounds x="14" y="4" width="1" height="1" /></bezel>
- <bezel name="3.2.1" element="led"><bounds x="14" y="6" width="1" height="1" /></bezel>
- <bezel name="4.2.1" element="led"><bounds x="14" y="8" width="1" height="1" /></bezel>
- <bezel name="5.2.1" element="led"><bounds x="14" y="10" width="1" height="1" /></bezel>
- <bezel name="6.2.1" element="led"><bounds x="14" y="12" width="1" height="1" /></bezel>
- <bezel name="7.2.1" element="led"><bounds x="14" y="14" width="1" height="1" /></bezel>
- <bezel name="8.2.1" element="led"><bounds x="14" y="16" width="1" height="1" /></bezel>
-
- <bezel name="0.3.1" element="led"><bounds x="16" y="0" width="1" height="1" /></bezel>
- <bezel name="1.3.1" element="led"><bounds x="16" y="2" width="1" height="1" /></bezel>
- <bezel name="2.3.1" element="led"><bounds x="16" y="4" width="1" height="1" /></bezel>
- <bezel name="3.3.1" element="led"><bounds x="16" y="6" width="1" height="1" /></bezel>
- <bezel name="4.3.1" element="led"><bounds x="16" y="8" width="1" height="1" /></bezel>
- <bezel name="5.3.1" element="led"><bounds x="16" y="10" width="1" height="1" /></bezel>
- <bezel name="6.3.1" element="led"><bounds x="16" y="12" width="1" height="1" /></bezel>
- <bezel name="7.3.1" element="led"><bounds x="16" y="14" width="1" height="1" /></bezel>
- <bezel name="8.3.1" element="led"><bounds x="16" y="16" width="1" height="1" /></bezel>
+ <repeat count="9">
+ <param name="y" start="0" increment="1" />
+
+ <!-- h1 -->
+ <repeat count="4">
+ <param name="x" start="0" increment="1" />
+ <param name="p" start="0" increment="1" />
+ <bezel name="~y~.~x~.0" element="led"><bounds x="~p~" y="~y~" width="0.5" height="0.5" /></bezel>
+ </repeat>
+
+ <!-- h2 -->
+ <repeat count="4">
+ <param name="x" start="0" increment="1" />
+ <param name="p" start="5" increment="1" />
+ <bezel name="~y~.~x~.1" element="led"><bounds x="~p~" y="~y~" width="0.5" height="0.5" /></bezel>
+ </repeat>
+ </repeat>
</view>
</mamelayout>
diff --git a/src/mame/layout/hh_sm510_test.lay b/src/mame/layout/hh_sm510_test.lay
index 48a3c7a282a..3fdf9bdb40a 100644
--- a/src/mame/layout/hh_sm510_test.lay
+++ b/src/mame/layout/hh_sm510_test.lay
@@ -15,292 +15,44 @@
<!-- build screen -->
<view name="Test Layout">
- <bounds left="0" right="64" top="0" bottom="64" />
+ <bounds left="0" right="20" top="0" bottom="16" />
<bezel element="static_black">
- <bounds left="0" right="64" top="0" bottom="64" />
+ <bounds left="0" right="20" top="0" bottom="16" />
</bezel>
<!-- max 4*16*4 matrix -->
- <!-- a -->
-
- <bezel name="0.0.0" element="led"><bounds x="0" y="0" width="1" height="1" /></bezel>
- <bezel name="0.1.0" element="led"><bounds x="0" y="2" width="1" height="1" /></bezel>
- <bezel name="0.2.0" element="led"><bounds x="0" y="4" width="1" height="1" /></bezel>
- <bezel name="0.3.0" element="led"><bounds x="0" y="6" width="1" height="1" /></bezel>
- <bezel name="0.4.0" element="led"><bounds x="0" y="8" width="1" height="1" /></bezel>
- <bezel name="0.5.0" element="led"><bounds x="0" y="10" width="1" height="1" /></bezel>
- <bezel name="0.6.0" element="led"><bounds x="0" y="12" width="1" height="1" /></bezel>
- <bezel name="0.7.0" element="led"><bounds x="0" y="14" width="1" height="1" /></bezel>
- <bezel name="0.8.0" element="led"><bounds x="0" y="16" width="1" height="1" /></bezel>
- <bezel name="0.9.0" element="led"><bounds x="0" y="18" width="1" height="1" /></bezel>
- <bezel name="0.10.0" element="led"><bounds x="0" y="20" width="1" height="1" /></bezel>
- <bezel name="0.11.0" element="led"><bounds x="0" y="22" width="1" height="1" /></bezel>
- <bezel name="0.12.0" element="led"><bounds x="0" y="24" width="1" height="1" /></bezel>
- <bezel name="0.13.0" element="led"><bounds x="0" y="26" width="1" height="1" /></bezel>
- <bezel name="0.14.0" element="led"><bounds x="0" y="28" width="1" height="1" /></bezel>
- <bezel name="0.15.0" element="led"><bounds x="0" y="30" width="1" height="1" /></bezel>
-
- <bezel name="0.0.1" element="led"><bounds x="2" y="0" width="1" height="1" /></bezel>
- <bezel name="0.1.1" element="led"><bounds x="2" y="2" width="1" height="1" /></bezel>
- <bezel name="0.2.1" element="led"><bounds x="2" y="4" width="1" height="1" /></bezel>
- <bezel name="0.3.1" element="led"><bounds x="2" y="6" width="1" height="1" /></bezel>
- <bezel name="0.4.1" element="led"><bounds x="2" y="8" width="1" height="1" /></bezel>
- <bezel name="0.5.1" element="led"><bounds x="2" y="10" width="1" height="1" /></bezel>
- <bezel name="0.6.1" element="led"><bounds x="2" y="12" width="1" height="1" /></bezel>
- <bezel name="0.7.1" element="led"><bounds x="2" y="14" width="1" height="1" /></bezel>
- <bezel name="0.8.1" element="led"><bounds x="2" y="16" width="1" height="1" /></bezel>
- <bezel name="0.9.1" element="led"><bounds x="2" y="18" width="1" height="1" /></bezel>
- <bezel name="0.10.1" element="led"><bounds x="2" y="20" width="1" height="1" /></bezel>
- <bezel name="0.11.1" element="led"><bounds x="2" y="22" width="1" height="1" /></bezel>
- <bezel name="0.12.1" element="led"><bounds x="2" y="24" width="1" height="1" /></bezel>
- <bezel name="0.13.1" element="led"><bounds x="2" y="26" width="1" height="1" /></bezel>
- <bezel name="0.14.1" element="led"><bounds x="2" y="28" width="1" height="1" /></bezel>
- <bezel name="0.15.1" element="led"><bounds x="2" y="30" width="1" height="1" /></bezel>
-
- <bezel name="0.0.2" element="led"><bounds x="4" y="0" width="1" height="1" /></bezel>
- <bezel name="0.1.2" element="led"><bounds x="4" y="2" width="1" height="1" /></bezel>
- <bezel name="0.2.2" element="led"><bounds x="4" y="4" width="1" height="1" /></bezel>
- <bezel name="0.3.2" element="led"><bounds x="4" y="6" width="1" height="1" /></bezel>
- <bezel name="0.4.2" element="led"><bounds x="4" y="8" width="1" height="1" /></bezel>
- <bezel name="0.5.2" element="led"><bounds x="4" y="10" width="1" height="1" /></bezel>
- <bezel name="0.6.2" element="led"><bounds x="4" y="12" width="1" height="1" /></bezel>
- <bezel name="0.7.2" element="led"><bounds x="4" y="14" width="1" height="1" /></bezel>
- <bezel name="0.8.2" element="led"><bounds x="4" y="16" width="1" height="1" /></bezel>
- <bezel name="0.9.2" element="led"><bounds x="4" y="18" width="1" height="1" /></bezel>
- <bezel name="0.10.2" element="led"><bounds x="4" y="20" width="1" height="1" /></bezel>
- <bezel name="0.11.2" element="led"><bounds x="4" y="22" width="1" height="1" /></bezel>
- <bezel name="0.12.2" element="led"><bounds x="4" y="24" width="1" height="1" /></bezel>
- <bezel name="0.13.2" element="led"><bounds x="4" y="26" width="1" height="1" /></bezel>
- <bezel name="0.14.2" element="led"><bounds x="4" y="28" width="1" height="1" /></bezel>
- <bezel name="0.15.2" element="led"><bounds x="4" y="30" width="1" height="1" /></bezel>
-
- <bezel name="0.0.3" element="led"><bounds x="6" y="0" width="1" height="1" /></bezel>
- <bezel name="0.1.3" element="led"><bounds x="6" y="2" width="1" height="1" /></bezel>
- <bezel name="0.2.3" element="led"><bounds x="6" y="4" width="1" height="1" /></bezel>
- <bezel name="0.3.3" element="led"><bounds x="6" y="6" width="1" height="1" /></bezel>
- <bezel name="0.4.3" element="led"><bounds x="6" y="8" width="1" height="1" /></bezel>
- <bezel name="0.5.3" element="led"><bounds x="6" y="10" width="1" height="1" /></bezel>
- <bezel name="0.6.3" element="led"><bounds x="6" y="12" width="1" height="1" /></bezel>
- <bezel name="0.7.3" element="led"><bounds x="6" y="14" width="1" height="1" /></bezel>
- <bezel name="0.8.3" element="led"><bounds x="6" y="16" width="1" height="1" /></bezel>
- <bezel name="0.9.3" element="led"><bounds x="6" y="18" width="1" height="1" /></bezel>
- <bezel name="0.10.3" element="led"><bounds x="6" y="20" width="1" height="1" /></bezel>
- <bezel name="0.11.3" element="led"><bounds x="6" y="22" width="1" height="1" /></bezel>
- <bezel name="0.12.3" element="led"><bounds x="6" y="24" width="1" height="1" /></bezel>
- <bezel name="0.13.3" element="led"><bounds x="6" y="26" width="1" height="1" /></bezel>
- <bezel name="0.14.3" element="led"><bounds x="6" y="28" width="1" height="1" /></bezel>
- <bezel name="0.15.3" element="led"><bounds x="6" y="30" width="1" height="1" /></bezel>
-
- <!-- b -->
-
- <bezel name="1.0.0" element="led"><bounds x="10" y="0" width="1" height="1" /></bezel>
- <bezel name="1.1.0" element="led"><bounds x="10" y="2" width="1" height="1" /></bezel>
- <bezel name="1.2.0" element="led"><bounds x="10" y="4" width="1" height="1" /></bezel>
- <bezel name="1.3.0" element="led"><bounds x="10" y="6" width="1" height="1" /></bezel>
- <bezel name="1.4.0" element="led"><bounds x="10" y="8" width="1" height="1" /></bezel>
- <bezel name="1.5.0" element="led"><bounds x="10" y="10" width="1" height="1" /></bezel>
- <bezel name="1.6.0" element="led"><bounds x="10" y="12" width="1" height="1" /></bezel>
- <bezel name="1.7.0" element="led"><bounds x="10" y="14" width="1" height="1" /></bezel>
- <bezel name="1.8.0" element="led"><bounds x="10" y="16" width="1" height="1" /></bezel>
- <bezel name="1.9.0" element="led"><bounds x="10" y="18" width="1" height="1" /></bezel>
- <bezel name="1.10.0" element="led"><bounds x="10" y="20" width="1" height="1" /></bezel>
- <bezel name="1.11.0" element="led"><bounds x="10" y="22" width="1" height="1" /></bezel>
- <bezel name="1.12.0" element="led"><bounds x="10" y="24" width="1" height="1" /></bezel>
- <bezel name="1.13.0" element="led"><bounds x="10" y="26" width="1" height="1" /></bezel>
- <bezel name="1.14.0" element="led"><bounds x="10" y="28" width="1" height="1" /></bezel>
- <bezel name="1.15.0" element="led"><bounds x="10" y="30" width="1" height="1" /></bezel>
-
- <bezel name="1.0.1" element="led"><bounds x="12" y="0" width="1" height="1" /></bezel>
- <bezel name="1.1.1" element="led"><bounds x="12" y="2" width="1" height="1" /></bezel>
- <bezel name="1.2.1" element="led"><bounds x="12" y="4" width="1" height="1" /></bezel>
- <bezel name="1.3.1" element="led"><bounds x="12" y="6" width="1" height="1" /></bezel>
- <bezel name="1.4.1" element="led"><bounds x="12" y="8" width="1" height="1" /></bezel>
- <bezel name="1.5.1" element="led"><bounds x="12" y="10" width="1" height="1" /></bezel>
- <bezel name="1.6.1" element="led"><bounds x="12" y="12" width="1" height="1" /></bezel>
- <bezel name="1.7.1" element="led"><bounds x="12" y="14" width="1" height="1" /></bezel>
- <bezel name="1.8.1" element="led"><bounds x="12" y="16" width="1" height="1" /></bezel>
- <bezel name="1.9.1" element="led"><bounds x="12" y="18" width="1" height="1" /></bezel>
- <bezel name="1.10.1" element="led"><bounds x="12" y="20" width="1" height="1" /></bezel>
- <bezel name="1.11.1" element="led"><bounds x="12" y="22" width="1" height="1" /></bezel>
- <bezel name="1.12.1" element="led"><bounds x="12" y="24" width="1" height="1" /></bezel>
- <bezel name="1.13.1" element="led"><bounds x="12" y="26" width="1" height="1" /></bezel>
- <bezel name="1.14.1" element="led"><bounds x="12" y="28" width="1" height="1" /></bezel>
- <bezel name="1.15.1" element="led"><bounds x="12" y="30" width="1" height="1" /></bezel>
-
- <bezel name="1.0.2" element="led"><bounds x="14" y="0" width="1" height="1" /></bezel>
- <bezel name="1.1.2" element="led"><bounds x="14" y="2" width="1" height="1" /></bezel>
- <bezel name="1.2.2" element="led"><bounds x="14" y="4" width="1" height="1" /></bezel>
- <bezel name="1.3.2" element="led"><bounds x="14" y="6" width="1" height="1" /></bezel>
- <bezel name="1.4.2" element="led"><bounds x="14" y="8" width="1" height="1" /></bezel>
- <bezel name="1.5.2" element="led"><bounds x="14" y="10" width="1" height="1" /></bezel>
- <bezel name="1.6.2" element="led"><bounds x="14" y="12" width="1" height="1" /></bezel>
- <bezel name="1.7.2" element="led"><bounds x="14" y="14" width="1" height="1" /></bezel>
- <bezel name="1.8.2" element="led"><bounds x="14" y="16" width="1" height="1" /></bezel>
- <bezel name="1.9.2" element="led"><bounds x="14" y="18" width="1" height="1" /></bezel>
- <bezel name="1.10.2" element="led"><bounds x="14" y="20" width="1" height="1" /></bezel>
- <bezel name="1.11.2" element="led"><bounds x="14" y="22" width="1" height="1" /></bezel>
- <bezel name="1.12.2" element="led"><bounds x="14" y="24" width="1" height="1" /></bezel>
- <bezel name="1.13.2" element="led"><bounds x="14" y="26" width="1" height="1" /></bezel>
- <bezel name="1.14.2" element="led"><bounds x="14" y="28" width="1" height="1" /></bezel>
- <bezel name="1.15.2" element="led"><bounds x="14" y="30" width="1" height="1" /></bezel>
-
- <bezel name="1.0.3" element="led"><bounds x="16" y="0" width="1" height="1" /></bezel>
- <bezel name="1.1.3" element="led"><bounds x="16" y="2" width="1" height="1" /></bezel>
- <bezel name="1.2.3" element="led"><bounds x="16" y="4" width="1" height="1" /></bezel>
- <bezel name="1.3.3" element="led"><bounds x="16" y="6" width="1" height="1" /></bezel>
- <bezel name="1.4.3" element="led"><bounds x="16" y="8" width="1" height="1" /></bezel>
- <bezel name="1.5.3" element="led"><bounds x="16" y="10" width="1" height="1" /></bezel>
- <bezel name="1.6.3" element="led"><bounds x="16" y="12" width="1" height="1" /></bezel>
- <bezel name="1.7.3" element="led"><bounds x="16" y="14" width="1" height="1" /></bezel>
- <bezel name="1.8.3" element="led"><bounds x="16" y="16" width="1" height="1" /></bezel>
- <bezel name="1.9.3" element="led"><bounds x="16" y="18" width="1" height="1" /></bezel>
- <bezel name="1.10.3" element="led"><bounds x="16" y="20" width="1" height="1" /></bezel>
- <bezel name="1.11.3" element="led"><bounds x="16" y="22" width="1" height="1" /></bezel>
- <bezel name="1.12.3" element="led"><bounds x="16" y="24" width="1" height="1" /></bezel>
- <bezel name="1.13.3" element="led"><bounds x="16" y="26" width="1" height="1" /></bezel>
- <bezel name="1.14.3" element="led"><bounds x="16" y="28" width="1" height="1" /></bezel>
- <bezel name="1.15.3" element="led"><bounds x="16" y="30" width="1" height="1" /></bezel>
-
- <!-- bs -->
-
- <bezel name="2.0.0" element="led"><bounds x="20" y="0" width="1" height="1" /></bezel>
- <bezel name="2.1.0" element="led"><bounds x="20" y="2" width="1" height="1" /></bezel>
- <bezel name="2.2.0" element="led"><bounds x="20" y="4" width="1" height="1" /></bezel>
- <bezel name="2.3.0" element="led"><bounds x="20" y="6" width="1" height="1" /></bezel>
- <bezel name="2.4.0" element="led"><bounds x="20" y="8" width="1" height="1" /></bezel>
- <bezel name="2.5.0" element="led"><bounds x="20" y="10" width="1" height="1" /></bezel>
- <bezel name="2.6.0" element="led"><bounds x="20" y="12" width="1" height="1" /></bezel>
- <bezel name="2.7.0" element="led"><bounds x="20" y="14" width="1" height="1" /></bezel>
- <bezel name="2.8.0" element="led"><bounds x="20" y="16" width="1" height="1" /></bezel>
- <bezel name="2.9.0" element="led"><bounds x="20" y="18" width="1" height="1" /></bezel>
- <bezel name="2.10.0" element="led"><bounds x="20" y="20" width="1" height="1" /></bezel>
- <bezel name="2.11.0" element="led"><bounds x="20" y="22" width="1" height="1" /></bezel>
- <bezel name="2.12.0" element="led"><bounds x="20" y="24" width="1" height="1" /></bezel>
- <bezel name="2.13.0" element="led"><bounds x="20" y="26" width="1" height="1" /></bezel>
- <bezel name="2.14.0" element="led"><bounds x="20" y="28" width="1" height="1" /></bezel>
- <bezel name="2.15.0" element="led"><bounds x="20" y="30" width="1" height="1" /></bezel>
-
- <bezel name="2.0.1" element="led"><bounds x="22" y="0" width="1" height="1" /></bezel>
- <bezel name="2.1.1" element="led"><bounds x="22" y="2" width="1" height="1" /></bezel>
- <bezel name="2.2.1" element="led"><bounds x="22" y="4" width="1" height="1" /></bezel>
- <bezel name="2.3.1" element="led"><bounds x="22" y="6" width="1" height="1" /></bezel>
- <bezel name="2.4.1" element="led"><bounds x="22" y="8" width="1" height="1" /></bezel>
- <bezel name="2.5.1" element="led"><bounds x="22" y="10" width="1" height="1" /></bezel>
- <bezel name="2.6.1" element="led"><bounds x="22" y="12" width="1" height="1" /></bezel>
- <bezel name="2.7.1" element="led"><bounds x="22" y="14" width="1" height="1" /></bezel>
- <bezel name="2.8.1" element="led"><bounds x="22" y="16" width="1" height="1" /></bezel>
- <bezel name="2.9.1" element="led"><bounds x="22" y="18" width="1" height="1" /></bezel>
- <bezel name="2.10.1" element="led"><bounds x="22" y="20" width="1" height="1" /></bezel>
- <bezel name="2.11.1" element="led"><bounds x="22" y="22" width="1" height="1" /></bezel>
- <bezel name="2.12.1" element="led"><bounds x="22" y="24" width="1" height="1" /></bezel>
- <bezel name="2.13.1" element="led"><bounds x="22" y="26" width="1" height="1" /></bezel>
- <bezel name="2.14.1" element="led"><bounds x="22" y="28" width="1" height="1" /></bezel>
- <bezel name="2.15.1" element="led"><bounds x="22" y="30" width="1" height="1" /></bezel>
-
- <bezel name="2.0.2" element="led"><bounds x="24" y="0" width="1" height="1" /></bezel>
- <bezel name="2.1.2" element="led"><bounds x="24" y="2" width="1" height="1" /></bezel>
- <bezel name="2.2.2" element="led"><bounds x="24" y="4" width="1" height="1" /></bezel>
- <bezel name="2.3.2" element="led"><bounds x="24" y="6" width="1" height="1" /></bezel>
- <bezel name="2.4.2" element="led"><bounds x="24" y="8" width="1" height="1" /></bezel>
- <bezel name="2.5.2" element="led"><bounds x="24" y="10" width="1" height="1" /></bezel>
- <bezel name="2.6.2" element="led"><bounds x="24" y="12" width="1" height="1" /></bezel>
- <bezel name="2.7.2" element="led"><bounds x="24" y="14" width="1" height="1" /></bezel>
- <bezel name="2.8.2" element="led"><bounds x="24" y="16" width="1" height="1" /></bezel>
- <bezel name="2.9.2" element="led"><bounds x="24" y="18" width="1" height="1" /></bezel>
- <bezel name="2.10.2" element="led"><bounds x="24" y="20" width="1" height="1" /></bezel>
- <bezel name="2.11.2" element="led"><bounds x="24" y="22" width="1" height="1" /></bezel>
- <bezel name="2.12.2" element="led"><bounds x="24" y="24" width="1" height="1" /></bezel>
- <bezel name="2.13.2" element="led"><bounds x="24" y="26" width="1" height="1" /></bezel>
- <bezel name="2.14.2" element="led"><bounds x="24" y="28" width="1" height="1" /></bezel>
- <bezel name="2.15.2" element="led"><bounds x="24" y="30" width="1" height="1" /></bezel>
-
- <bezel name="2.0.3" element="led"><bounds x="26" y="0" width="1" height="1" /></bezel>
- <bezel name="2.1.3" element="led"><bounds x="26" y="2" width="1" height="1" /></bezel>
- <bezel name="2.2.3" element="led"><bounds x="26" y="4" width="1" height="1" /></bezel>
- <bezel name="2.3.3" element="led"><bounds x="26" y="6" width="1" height="1" /></bezel>
- <bezel name="2.4.3" element="led"><bounds x="26" y="8" width="1" height="1" /></bezel>
- <bezel name="2.5.3" element="led"><bounds x="26" y="10" width="1" height="1" /></bezel>
- <bezel name="2.6.3" element="led"><bounds x="26" y="12" width="1" height="1" /></bezel>
- <bezel name="2.7.3" element="led"><bounds x="26" y="14" width="1" height="1" /></bezel>
- <bezel name="2.8.3" element="led"><bounds x="26" y="16" width="1" height="1" /></bezel>
- <bezel name="2.9.3" element="led"><bounds x="26" y="18" width="1" height="1" /></bezel>
- <bezel name="2.10.3" element="led"><bounds x="26" y="20" width="1" height="1" /></bezel>
- <bezel name="2.11.3" element="led"><bounds x="26" y="22" width="1" height="1" /></bezel>
- <bezel name="2.12.3" element="led"><bounds x="26" y="24" width="1" height="1" /></bezel>
- <bezel name="2.13.3" element="led"><bounds x="26" y="26" width="1" height="1" /></bezel>
- <bezel name="2.14.3" element="led"><bounds x="26" y="28" width="1" height="1" /></bezel>
- <bezel name="2.15.3" element="led"><bounds x="26" y="30" width="1" height="1" /></bezel>
-
- <!-- c -->
-
- <bezel name="3.0.0" element="led"><bounds x="30" y="0" width="1" height="1" /></bezel>
- <bezel name="3.1.0" element="led"><bounds x="30" y="2" width="1" height="1" /></bezel>
- <bezel name="3.2.0" element="led"><bounds x="30" y="4" width="1" height="1" /></bezel>
- <bezel name="3.3.0" element="led"><bounds x="30" y="6" width="1" height="1" /></bezel>
- <bezel name="3.4.0" element="led"><bounds x="30" y="8" width="1" height="1" /></bezel>
- <bezel name="3.5.0" element="led"><bounds x="30" y="10" width="1" height="1" /></bezel>
- <bezel name="3.6.0" element="led"><bounds x="30" y="12" width="1" height="1" /></bezel>
- <bezel name="3.7.0" element="led"><bounds x="30" y="14" width="1" height="1" /></bezel>
- <bezel name="3.8.0" element="led"><bounds x="30" y="16" width="1" height="1" /></bezel>
- <bezel name="3.9.0" element="led"><bounds x="30" y="18" width="1" height="1" /></bezel>
- <bezel name="3.10.0" element="led"><bounds x="30" y="20" width="1" height="1" /></bezel>
- <bezel name="3.11.0" element="led"><bounds x="30" y="22" width="1" height="1" /></bezel>
- <bezel name="3.12.0" element="led"><bounds x="30" y="24" width="1" height="1" /></bezel>
- <bezel name="3.13.0" element="led"><bounds x="30" y="26" width="1" height="1" /></bezel>
- <bezel name="3.14.0" element="led"><bounds x="30" y="28" width="1" height="1" /></bezel>
- <bezel name="3.15.0" element="led"><bounds x="30" y="30" width="1" height="1" /></bezel>
-
- <bezel name="3.0.1" element="led"><bounds x="32" y="0" width="1" height="1" /></bezel>
- <bezel name="3.1.1" element="led"><bounds x="32" y="2" width="1" height="1" /></bezel>
- <bezel name="3.2.1" element="led"><bounds x="32" y="4" width="1" height="1" /></bezel>
- <bezel name="3.3.1" element="led"><bounds x="32" y="6" width="1" height="1" /></bezel>
- <bezel name="3.4.1" element="led"><bounds x="32" y="8" width="1" height="1" /></bezel>
- <bezel name="3.5.1" element="led"><bounds x="32" y="10" width="1" height="1" /></bezel>
- <bezel name="3.6.1" element="led"><bounds x="32" y="12" width="1" height="1" /></bezel>
- <bezel name="3.7.1" element="led"><bounds x="32" y="14" width="1" height="1" /></bezel>
- <bezel name="3.8.1" element="led"><bounds x="32" y="16" width="1" height="1" /></bezel>
- <bezel name="3.9.1" element="led"><bounds x="32" y="18" width="1" height="1" /></bezel>
- <bezel name="3.10.1" element="led"><bounds x="32" y="20" width="1" height="1" /></bezel>
- <bezel name="3.11.1" element="led"><bounds x="32" y="22" width="1" height="1" /></bezel>
- <bezel name="3.12.1" element="led"><bounds x="32" y="24" width="1" height="1" /></bezel>
- <bezel name="3.13.1" element="led"><bounds x="32" y="26" width="1" height="1" /></bezel>
- <bezel name="3.14.1" element="led"><bounds x="32" y="28" width="1" height="1" /></bezel>
- <bezel name="3.15.1" element="led"><bounds x="32" y="30" width="1" height="1" /></bezel>
-
- <bezel name="3.0.2" element="led"><bounds x="34" y="0" width="1" height="1" /></bezel>
- <bezel name="3.1.2" element="led"><bounds x="34" y="2" width="1" height="1" /></bezel>
- <bezel name="3.2.2" element="led"><bounds x="34" y="4" width="1" height="1" /></bezel>
- <bezel name="3.3.2" element="led"><bounds x="34" y="6" width="1" height="1" /></bezel>
- <bezel name="3.4.2" element="led"><bounds x="34" y="8" width="1" height="1" /></bezel>
- <bezel name="3.5.2" element="led"><bounds x="34" y="10" width="1" height="1" /></bezel>
- <bezel name="3.6.2" element="led"><bounds x="34" y="12" width="1" height="1" /></bezel>
- <bezel name="3.7.2" element="led"><bounds x="34" y="14" width="1" height="1" /></bezel>
- <bezel name="3.8.2" element="led"><bounds x="34" y="16" width="1" height="1" /></bezel>
- <bezel name="3.9.2" element="led"><bounds x="34" y="18" width="1" height="1" /></bezel>
- <bezel name="3.10.2" element="led"><bounds x="34" y="20" width="1" height="1" /></bezel>
- <bezel name="3.11.2" element="led"><bounds x="34" y="22" width="1" height="1" /></bezel>
- <bezel name="3.12.2" element="led"><bounds x="34" y="24" width="1" height="1" /></bezel>
- <bezel name="3.13.2" element="led"><bounds x="34" y="26" width="1" height="1" /></bezel>
- <bezel name="3.14.2" element="led"><bounds x="34" y="28" width="1" height="1" /></bezel>
- <bezel name="3.15.2" element="led"><bounds x="34" y="30" width="1" height="1" /></bezel>
-
- <bezel name="3.0.3" element="led"><bounds x="36" y="0" width="1" height="1" /></bezel>
- <bezel name="3.1.3" element="led"><bounds x="36" y="2" width="1" height="1" /></bezel>
- <bezel name="3.2.3" element="led"><bounds x="36" y="4" width="1" height="1" /></bezel>
- <bezel name="3.3.3" element="led"><bounds x="36" y="6" width="1" height="1" /></bezel>
- <bezel name="3.4.3" element="led"><bounds x="36" y="8" width="1" height="1" /></bezel>
- <bezel name="3.5.3" element="led"><bounds x="36" y="10" width="1" height="1" /></bezel>
- <bezel name="3.6.3" element="led"><bounds x="36" y="12" width="1" height="1" /></bezel>
- <bezel name="3.7.3" element="led"><bounds x="36" y="14" width="1" height="1" /></bezel>
- <bezel name="3.8.3" element="led"><bounds x="36" y="16" width="1" height="1" /></bezel>
- <bezel name="3.9.3" element="led"><bounds x="36" y="18" width="1" height="1" /></bezel>
- <bezel name="3.10.3" element="led"><bounds x="36" y="20" width="1" height="1" /></bezel>
- <bezel name="3.11.3" element="led"><bounds x="36" y="22" width="1" height="1" /></bezel>
- <bezel name="3.12.3" element="led"><bounds x="36" y="24" width="1" height="1" /></bezel>
- <bezel name="3.13.3" element="led"><bounds x="36" y="26" width="1" height="1" /></bezel>
- <bezel name="3.14.3" element="led"><bounds x="36" y="28" width="1" height="1" /></bezel>
- <bezel name="3.15.3" element="led"><bounds x="36" y="30" width="1" height="1" /></bezel>
+ <repeat count="16">
+ <param name="y" start="0" increment="1" />
+
+ <!-- a -->
+ <repeat count="4">
+ <param name="x" start="0" increment="1" />
+ <param name="p" start="0" increment="1" />
+ <bezel name="0.~y~.~x~" element="led"><bounds x="~p~" y="~y~" width="0.5" height="0.5" /></bezel>
+ </repeat>
+
+ <!-- b -->
+ <repeat count="4">
+ <param name="x" start="0" increment="1" />
+ <param name="p" start="5" increment="1" />
+ <bezel name="1.~y~.~x~" element="led"><bounds x="~p~" y="~y~" width="0.5" height="0.5" /></bezel>
+ </repeat>
+
+ <!-- bs -->
+ <repeat count="4">
+ <param name="x" start="0" increment="1" />
+ <param name="p" start="10" increment="1" />
+ <bezel name="2.~y~.~x~" element="led"><bounds x="~p~" y="~y~" width="0.5" height="0.5" /></bezel>
+ </repeat>
+
+ <!-- c -->
+ <repeat count="4">
+ <param name="x" start="0" increment="1" />
+ <param name="p" start="15" increment="1" />
+ <bezel name="3.~y~.~x~" element="led"><bounds x="~p~" y="~y~" width="0.5" height="0.5" /></bezel>
+ </repeat>
+ </repeat>
</view>
</mamelayout>
diff --git a/src/mame/layout/hh_tms1k_test.lay b/src/mame/layout/hh_tms1k_test.lay
index faca1bc722e..675ea6960c9 100644
--- a/src/mame/layout/hh_tms1k_test.lay
+++ b/src/mame/layout/hh_tms1k_test.lay
@@ -14,540 +14,21 @@
<!-- build screen -->
<view name="Test Layout">
- <bounds left="0" right="64" top="0" bottom="64" />
+ <bounds left="0" right="32" top="0" bottom="16" />
<bezel element="static_black">
- <bounds left="0" right="64" top="0" bottom="64" />
+ <bounds left="0" right="32" top="0" bottom="16" />
</bezel>
<!-- max 16*32 matrix -->
- <bezel name="0.0" element="led"><bounds x="0" y="0" width="1" height="1" /></bezel>
- <bezel name="0.1" element="led"><bounds x="0" y="2" width="1" height="1" /></bezel>
- <bezel name="0.2" element="led"><bounds x="0" y="4" width="1" height="1" /></bezel>
- <bezel name="0.3" element="led"><bounds x="0" y="6" width="1" height="1" /></bezel>
- <bezel name="0.4" element="led"><bounds x="0" y="8" width="1" height="1" /></bezel>
- <bezel name="0.5" element="led"><bounds x="0" y="10" width="1" height="1" /></bezel>
- <bezel name="0.6" element="led"><bounds x="0" y="12" width="1" height="1" /></bezel>
- <bezel name="0.7" element="led"><bounds x="0" y="14" width="1" height="1" /></bezel>
- <bezel name="0.8" element="led"><bounds x="0" y="16" width="1" height="1" /></bezel>
- <bezel name="0.9" element="led"><bounds x="0" y="18" width="1" height="1" /></bezel>
- <bezel name="0.10" element="led"><bounds x="0" y="20" width="1" height="1" /></bezel>
- <bezel name="0.11" element="led"><bounds x="0" y="22" width="1" height="1" /></bezel>
- <bezel name="0.12" element="led"><bounds x="0" y="24" width="1" height="1" /></bezel>
- <bezel name="0.13" element="led"><bounds x="0" y="26" width="1" height="1" /></bezel>
- <bezel name="0.14" element="led"><bounds x="0" y="28" width="1" height="1" /></bezel>
- <bezel name="0.15" element="led"><bounds x="0" y="30" width="1" height="1" /></bezel>
- <bezel name="0.16" element="led"><bounds x="0" y="32" width="1" height="1" /></bezel>
- <bezel name="0.17" element="led"><bounds x="0" y="34" width="1" height="1" /></bezel>
- <bezel name="0.18" element="led"><bounds x="0" y="36" width="1" height="1" /></bezel>
- <bezel name="0.19" element="led"><bounds x="0" y="38" width="1" height="1" /></bezel>
- <bezel name="0.20" element="led"><bounds x="0" y="40" width="1" height="1" /></bezel>
- <bezel name="0.21" element="led"><bounds x="0" y="42" width="1" height="1" /></bezel>
- <bezel name="0.22" element="led"><bounds x="0" y="44" width="1" height="1" /></bezel>
- <bezel name="0.23" element="led"><bounds x="0" y="46" width="1" height="1" /></bezel>
- <bezel name="0.24" element="led"><bounds x="0" y="48" width="1" height="1" /></bezel>
- <bezel name="0.25" element="led"><bounds x="0" y="50" width="1" height="1" /></bezel>
- <bezel name="0.26" element="led"><bounds x="0" y="52" width="1" height="1" /></bezel>
- <bezel name="0.27" element="led"><bounds x="0" y="54" width="1" height="1" /></bezel>
- <bezel name="0.28" element="led"><bounds x="0" y="56" width="1" height="1" /></bezel>
- <bezel name="0.29" element="led"><bounds x="0" y="58" width="1" height="1" /></bezel>
- <bezel name="0.30" element="led"><bounds x="0" y="60" width="1" height="1" /></bezel>
- <bezel name="0.31" element="led"><bounds x="0" y="62" width="1" height="1" /></bezel>
+ <repeat count="16">
+ <param name="y" start="0" increment="1" />
- <bezel name="1.0" element="led"><bounds x="2" y="0" width="1" height="1" /></bezel>
- <bezel name="1.1" element="led"><bounds x="2" y="2" width="1" height="1" /></bezel>
- <bezel name="1.2" element="led"><bounds x="2" y="4" width="1" height="1" /></bezel>
- <bezel name="1.3" element="led"><bounds x="2" y="6" width="1" height="1" /></bezel>
- <bezel name="1.4" element="led"><bounds x="2" y="8" width="1" height="1" /></bezel>
- <bezel name="1.5" element="led"><bounds x="2" y="10" width="1" height="1" /></bezel>
- <bezel name="1.6" element="led"><bounds x="2" y="12" width="1" height="1" /></bezel>
- <bezel name="1.7" element="led"><bounds x="2" y="14" width="1" height="1" /></bezel>
- <bezel name="1.8" element="led"><bounds x="2" y="16" width="1" height="1" /></bezel>
- <bezel name="1.9" element="led"><bounds x="2" y="18" width="1" height="1" /></bezel>
- <bezel name="1.10" element="led"><bounds x="2" y="20" width="1" height="1" /></bezel>
- <bezel name="1.11" element="led"><bounds x="2" y="22" width="1" height="1" /></bezel>
- <bezel name="1.12" element="led"><bounds x="2" y="24" width="1" height="1" /></bezel>
- <bezel name="1.13" element="led"><bounds x="2" y="26" width="1" height="1" /></bezel>
- <bezel name="1.14" element="led"><bounds x="2" y="28" width="1" height="1" /></bezel>
- <bezel name="1.15" element="led"><bounds x="2" y="30" width="1" height="1" /></bezel>
- <bezel name="1.16" element="led"><bounds x="2" y="32" width="1" height="1" /></bezel>
- <bezel name="1.17" element="led"><bounds x="2" y="34" width="1" height="1" /></bezel>
- <bezel name="1.18" element="led"><bounds x="2" y="36" width="1" height="1" /></bezel>
- <bezel name="1.19" element="led"><bounds x="2" y="38" width="1" height="1" /></bezel>
- <bezel name="1.20" element="led"><bounds x="2" y="40" width="1" height="1" /></bezel>
- <bezel name="1.21" element="led"><bounds x="2" y="42" width="1" height="1" /></bezel>
- <bezel name="1.22" element="led"><bounds x="2" y="44" width="1" height="1" /></bezel>
- <bezel name="1.23" element="led"><bounds x="2" y="46" width="1" height="1" /></bezel>
- <bezel name="1.24" element="led"><bounds x="2" y="48" width="1" height="1" /></bezel>
- <bezel name="1.25" element="led"><bounds x="2" y="50" width="1" height="1" /></bezel>
- <bezel name="1.26" element="led"><bounds x="2" y="52" width="1" height="1" /></bezel>
- <bezel name="1.27" element="led"><bounds x="2" y="54" width="1" height="1" /></bezel>
- <bezel name="1.28" element="led"><bounds x="2" y="56" width="1" height="1" /></bezel>
- <bezel name="1.29" element="led"><bounds x="2" y="58" width="1" height="1" /></bezel>
- <bezel name="1.30" element="led"><bounds x="2" y="60" width="1" height="1" /></bezel>
- <bezel name="1.31" element="led"><bounds x="2" y="62" width="1" height="1" /></bezel>
-
- <bezel name="2.0" element="led"><bounds x="4" y="0" width="1" height="1" /></bezel>
- <bezel name="2.1" element="led"><bounds x="4" y="2" width="1" height="1" /></bezel>
- <bezel name="2.2" element="led"><bounds x="4" y="4" width="1" height="1" /></bezel>
- <bezel name="2.3" element="led"><bounds x="4" y="6" width="1" height="1" /></bezel>
- <bezel name="2.4" element="led"><bounds x="4" y="8" width="1" height="1" /></bezel>
- <bezel name="2.5" element="led"><bounds x="4" y="10" width="1" height="1" /></bezel>
- <bezel name="2.6" element="led"><bounds x="4" y="12" width="1" height="1" /></bezel>
- <bezel name="2.7" element="led"><bounds x="4" y="14" width="1" height="1" /></bezel>
- <bezel name="2.8" element="led"><bounds x="4" y="16" width="1" height="1" /></bezel>
- <bezel name="2.9" element="led"><bounds x="4" y="18" width="1" height="1" /></bezel>
- <bezel name="2.10" element="led"><bounds x="4" y="20" width="1" height="1" /></bezel>
- <bezel name="2.11" element="led"><bounds x="4" y="22" width="1" height="1" /></bezel>
- <bezel name="2.12" element="led"><bounds x="4" y="24" width="1" height="1" /></bezel>
- <bezel name="2.13" element="led"><bounds x="4" y="26" width="1" height="1" /></bezel>
- <bezel name="2.14" element="led"><bounds x="4" y="28" width="1" height="1" /></bezel>
- <bezel name="2.15" element="led"><bounds x="4" y="30" width="1" height="1" /></bezel>
- <bezel name="2.16" element="led"><bounds x="4" y="32" width="1" height="1" /></bezel>
- <bezel name="2.17" element="led"><bounds x="4" y="34" width="1" height="1" /></bezel>
- <bezel name="2.18" element="led"><bounds x="4" y="36" width="1" height="1" /></bezel>
- <bezel name="2.19" element="led"><bounds x="4" y="38" width="1" height="1" /></bezel>
- <bezel name="2.20" element="led"><bounds x="4" y="40" width="1" height="1" /></bezel>
- <bezel name="2.21" element="led"><bounds x="4" y="42" width="1" height="1" /></bezel>
- <bezel name="2.22" element="led"><bounds x="4" y="44" width="1" height="1" /></bezel>
- <bezel name="2.23" element="led"><bounds x="4" y="46" width="1" height="1" /></bezel>
- <bezel name="2.24" element="led"><bounds x="4" y="48" width="1" height="1" /></bezel>
- <bezel name="2.25" element="led"><bounds x="4" y="50" width="1" height="1" /></bezel>
- <bezel name="2.26" element="led"><bounds x="4" y="52" width="1" height="1" /></bezel>
- <bezel name="2.27" element="led"><bounds x="4" y="54" width="1" height="1" /></bezel>
- <bezel name="2.28" element="led"><bounds x="4" y="56" width="1" height="1" /></bezel>
- <bezel name="2.29" element="led"><bounds x="4" y="58" width="1" height="1" /></bezel>
- <bezel name="2.30" element="led"><bounds x="4" y="60" width="1" height="1" /></bezel>
- <bezel name="2.31" element="led"><bounds x="4" y="62" width="1" height="1" /></bezel>
-
- <bezel name="3.0" element="led"><bounds x="6" y="0" width="1" height="1" /></bezel>
- <bezel name="3.1" element="led"><bounds x="6" y="2" width="1" height="1" /></bezel>
- <bezel name="3.2" element="led"><bounds x="6" y="4" width="1" height="1" /></bezel>
- <bezel name="3.3" element="led"><bounds x="6" y="6" width="1" height="1" /></bezel>
- <bezel name="3.4" element="led"><bounds x="6" y="8" width="1" height="1" /></bezel>
- <bezel name="3.5" element="led"><bounds x="6" y="10" width="1" height="1" /></bezel>
- <bezel name="3.6" element="led"><bounds x="6" y="12" width="1" height="1" /></bezel>
- <bezel name="3.7" element="led"><bounds x="6" y="14" width="1" height="1" /></bezel>
- <bezel name="3.8" element="led"><bounds x="6" y="16" width="1" height="1" /></bezel>
- <bezel name="3.9" element="led"><bounds x="6" y="18" width="1" height="1" /></bezel>
- <bezel name="3.10" element="led"><bounds x="6" y="20" width="1" height="1" /></bezel>
- <bezel name="3.11" element="led"><bounds x="6" y="22" width="1" height="1" /></bezel>
- <bezel name="3.12" element="led"><bounds x="6" y="24" width="1" height="1" /></bezel>
- <bezel name="3.13" element="led"><bounds x="6" y="26" width="1" height="1" /></bezel>
- <bezel name="3.14" element="led"><bounds x="6" y="28" width="1" height="1" /></bezel>
- <bezel name="3.15" element="led"><bounds x="6" y="30" width="1" height="1" /></bezel>
- <bezel name="3.16" element="led"><bounds x="6" y="32" width="1" height="1" /></bezel>
- <bezel name="3.17" element="led"><bounds x="6" y="34" width="1" height="1" /></bezel>
- <bezel name="3.18" element="led"><bounds x="6" y="36" width="1" height="1" /></bezel>
- <bezel name="3.19" element="led"><bounds x="6" y="38" width="1" height="1" /></bezel>
- <bezel name="3.20" element="led"><bounds x="6" y="40" width="1" height="1" /></bezel>
- <bezel name="3.21" element="led"><bounds x="6" y="42" width="1" height="1" /></bezel>
- <bezel name="3.22" element="led"><bounds x="6" y="44" width="1" height="1" /></bezel>
- <bezel name="3.23" element="led"><bounds x="6" y="46" width="1" height="1" /></bezel>
- <bezel name="3.24" element="led"><bounds x="6" y="48" width="1" height="1" /></bezel>
- <bezel name="3.25" element="led"><bounds x="6" y="50" width="1" height="1" /></bezel>
- <bezel name="3.26" element="led"><bounds x="6" y="52" width="1" height="1" /></bezel>
- <bezel name="3.27" element="led"><bounds x="6" y="54" width="1" height="1" /></bezel>
- <bezel name="3.28" element="led"><bounds x="6" y="56" width="1" height="1" /></bezel>
- <bezel name="3.29" element="led"><bounds x="6" y="58" width="1" height="1" /></bezel>
- <bezel name="3.30" element="led"><bounds x="6" y="60" width="1" height="1" /></bezel>
- <bezel name="3.31" element="led"><bounds x="6" y="62" width="1" height="1" /></bezel>
-
- <bezel name="4.0" element="led"><bounds x="8" y="0" width="1" height="1" /></bezel>
- <bezel name="4.1" element="led"><bounds x="8" y="2" width="1" height="1" /></bezel>
- <bezel name="4.2" element="led"><bounds x="8" y="4" width="1" height="1" /></bezel>
- <bezel name="4.3" element="led"><bounds x="8" y="6" width="1" height="1" /></bezel>
- <bezel name="4.4" element="led"><bounds x="8" y="8" width="1" height="1" /></bezel>
- <bezel name="4.5" element="led"><bounds x="8" y="10" width="1" height="1" /></bezel>
- <bezel name="4.6" element="led"><bounds x="8" y="12" width="1" height="1" /></bezel>
- <bezel name="4.7" element="led"><bounds x="8" y="14" width="1" height="1" /></bezel>
- <bezel name="4.8" element="led"><bounds x="8" y="16" width="1" height="1" /></bezel>
- <bezel name="4.9" element="led"><bounds x="8" y="18" width="1" height="1" /></bezel>
- <bezel name="4.10" element="led"><bounds x="8" y="20" width="1" height="1" /></bezel>
- <bezel name="4.11" element="led"><bounds x="8" y="22" width="1" height="1" /></bezel>
- <bezel name="4.12" element="led"><bounds x="8" y="24" width="1" height="1" /></bezel>
- <bezel name="4.13" element="led"><bounds x="8" y="26" width="1" height="1" /></bezel>
- <bezel name="4.14" element="led"><bounds x="8" y="28" width="1" height="1" /></bezel>
- <bezel name="4.15" element="led"><bounds x="8" y="30" width="1" height="1" /></bezel>
- <bezel name="4.16" element="led"><bounds x="8" y="32" width="1" height="1" /></bezel>
- <bezel name="4.17" element="led"><bounds x="8" y="34" width="1" height="1" /></bezel>
- <bezel name="4.18" element="led"><bounds x="8" y="36" width="1" height="1" /></bezel>
- <bezel name="4.19" element="led"><bounds x="8" y="38" width="1" height="1" /></bezel>
- <bezel name="4.20" element="led"><bounds x="8" y="40" width="1" height="1" /></bezel>
- <bezel name="4.21" element="led"><bounds x="8" y="42" width="1" height="1" /></bezel>
- <bezel name="4.22" element="led"><bounds x="8" y="44" width="1" height="1" /></bezel>
- <bezel name="4.23" element="led"><bounds x="8" y="46" width="1" height="1" /></bezel>
- <bezel name="4.24" element="led"><bounds x="8" y="48" width="1" height="1" /></bezel>
- <bezel name="4.25" element="led"><bounds x="8" y="50" width="1" height="1" /></bezel>
- <bezel name="4.26" element="led"><bounds x="8" y="52" width="1" height="1" /></bezel>
- <bezel name="4.27" element="led"><bounds x="8" y="54" width="1" height="1" /></bezel>
- <bezel name="4.28" element="led"><bounds x="8" y="56" width="1" height="1" /></bezel>
- <bezel name="4.29" element="led"><bounds x="8" y="58" width="1" height="1" /></bezel>
- <bezel name="4.30" element="led"><bounds x="8" y="60" width="1" height="1" /></bezel>
- <bezel name="4.31" element="led"><bounds x="8" y="62" width="1" height="1" /></bezel>
-
- <bezel name="5.0" element="led"><bounds x="10" y="0" width="1" height="1" /></bezel>
- <bezel name="5.1" element="led"><bounds x="10" y="2" width="1" height="1" /></bezel>
- <bezel name="5.2" element="led"><bounds x="10" y="4" width="1" height="1" /></bezel>
- <bezel name="5.3" element="led"><bounds x="10" y="6" width="1" height="1" /></bezel>
- <bezel name="5.4" element="led"><bounds x="10" y="8" width="1" height="1" /></bezel>
- <bezel name="5.5" element="led"><bounds x="10" y="10" width="1" height="1" /></bezel>
- <bezel name="5.6" element="led"><bounds x="10" y="12" width="1" height="1" /></bezel>
- <bezel name="5.7" element="led"><bounds x="10" y="14" width="1" height="1" /></bezel>
- <bezel name="5.8" element="led"><bounds x="10" y="16" width="1" height="1" /></bezel>
- <bezel name="5.9" element="led"><bounds x="10" y="18" width="1" height="1" /></bezel>
- <bezel name="5.10" element="led"><bounds x="10" y="20" width="1" height="1" /></bezel>
- <bezel name="5.11" element="led"><bounds x="10" y="22" width="1" height="1" /></bezel>
- <bezel name="5.12" element="led"><bounds x="10" y="24" width="1" height="1" /></bezel>
- <bezel name="5.13" element="led"><bounds x="10" y="26" width="1" height="1" /></bezel>
- <bezel name="5.14" element="led"><bounds x="10" y="28" width="1" height="1" /></bezel>
- <bezel name="5.15" element="led"><bounds x="10" y="30" width="1" height="1" /></bezel>
- <bezel name="5.16" element="led"><bounds x="10" y="32" width="1" height="1" /></bezel>
- <bezel name="5.17" element="led"><bounds x="10" y="34" width="1" height="1" /></bezel>
- <bezel name="5.18" element="led"><bounds x="10" y="36" width="1" height="1" /></bezel>
- <bezel name="5.19" element="led"><bounds x="10" y="38" width="1" height="1" /></bezel>
- <bezel name="5.20" element="led"><bounds x="10" y="40" width="1" height="1" /></bezel>
- <bezel name="5.21" element="led"><bounds x="10" y="42" width="1" height="1" /></bezel>
- <bezel name="5.22" element="led"><bounds x="10" y="44" width="1" height="1" /></bezel>
- <bezel name="5.23" element="led"><bounds x="10" y="46" width="1" height="1" /></bezel>
- <bezel name="5.24" element="led"><bounds x="10" y="48" width="1" height="1" /></bezel>
- <bezel name="5.25" element="led"><bounds x="10" y="50" width="1" height="1" /></bezel>
- <bezel name="5.26" element="led"><bounds x="10" y="52" width="1" height="1" /></bezel>
- <bezel name="5.27" element="led"><bounds x="10" y="54" width="1" height="1" /></bezel>
- <bezel name="5.28" element="led"><bounds x="10" y="56" width="1" height="1" /></bezel>
- <bezel name="5.29" element="led"><bounds x="10" y="58" width="1" height="1" /></bezel>
- <bezel name="5.30" element="led"><bounds x="10" y="60" width="1" height="1" /></bezel>
- <bezel name="5.31" element="led"><bounds x="10" y="62" width="1" height="1" /></bezel>
-
- <bezel name="6.0" element="led"><bounds x="12" y="0" width="1" height="1" /></bezel>
- <bezel name="6.1" element="led"><bounds x="12" y="2" width="1" height="1" /></bezel>
- <bezel name="6.2" element="led"><bounds x="12" y="4" width="1" height="1" /></bezel>
- <bezel name="6.3" element="led"><bounds x="12" y="6" width="1" height="1" /></bezel>
- <bezel name="6.4" element="led"><bounds x="12" y="8" width="1" height="1" /></bezel>
- <bezel name="6.5" element="led"><bounds x="12" y="10" width="1" height="1" /></bezel>
- <bezel name="6.6" element="led"><bounds x="12" y="12" width="1" height="1" /></bezel>
- <bezel name="6.7" element="led"><bounds x="12" y="14" width="1" height="1" /></bezel>
- <bezel name="6.8" element="led"><bounds x="12" y="16" width="1" height="1" /></bezel>
- <bezel name="6.9" element="led"><bounds x="12" y="18" width="1" height="1" /></bezel>
- <bezel name="6.10" element="led"><bounds x="12" y="20" width="1" height="1" /></bezel>
- <bezel name="6.11" element="led"><bounds x="12" y="22" width="1" height="1" /></bezel>
- <bezel name="6.12" element="led"><bounds x="12" y="24" width="1" height="1" /></bezel>
- <bezel name="6.13" element="led"><bounds x="12" y="26" width="1" height="1" /></bezel>
- <bezel name="6.14" element="led"><bounds x="12" y="28" width="1" height="1" /></bezel>
- <bezel name="6.15" element="led"><bounds x="12" y="30" width="1" height="1" /></bezel>
- <bezel name="6.16" element="led"><bounds x="12" y="32" width="1" height="1" /></bezel>
- <bezel name="6.17" element="led"><bounds x="12" y="34" width="1" height="1" /></bezel>
- <bezel name="6.18" element="led"><bounds x="12" y="36" width="1" height="1" /></bezel>
- <bezel name="6.19" element="led"><bounds x="12" y="38" width="1" height="1" /></bezel>
- <bezel name="6.20" element="led"><bounds x="12" y="40" width="1" height="1" /></bezel>
- <bezel name="6.21" element="led"><bounds x="12" y="42" width="1" height="1" /></bezel>
- <bezel name="6.22" element="led"><bounds x="12" y="44" width="1" height="1" /></bezel>
- <bezel name="6.23" element="led"><bounds x="12" y="46" width="1" height="1" /></bezel>
- <bezel name="6.24" element="led"><bounds x="12" y="48" width="1" height="1" /></bezel>
- <bezel name="6.25" element="led"><bounds x="12" y="50" width="1" height="1" /></bezel>
- <bezel name="6.26" element="led"><bounds x="12" y="52" width="1" height="1" /></bezel>
- <bezel name="6.27" element="led"><bounds x="12" y="54" width="1" height="1" /></bezel>
- <bezel name="6.28" element="led"><bounds x="12" y="56" width="1" height="1" /></bezel>
- <bezel name="6.29" element="led"><bounds x="12" y="58" width="1" height="1" /></bezel>
- <bezel name="6.30" element="led"><bounds x="12" y="60" width="1" height="1" /></bezel>
- <bezel name="6.31" element="led"><bounds x="12" y="62" width="1" height="1" /></bezel>
-
- <bezel name="7.0" element="led"><bounds x="14" y="0" width="1" height="1" /></bezel>
- <bezel name="7.1" element="led"><bounds x="14" y="2" width="1" height="1" /></bezel>
- <bezel name="7.2" element="led"><bounds x="14" y="4" width="1" height="1" /></bezel>
- <bezel name="7.3" element="led"><bounds x="14" y="6" width="1" height="1" /></bezel>
- <bezel name="7.4" element="led"><bounds x="14" y="8" width="1" height="1" /></bezel>
- <bezel name="7.5" element="led"><bounds x="14" y="10" width="1" height="1" /></bezel>
- <bezel name="7.6" element="led"><bounds x="14" y="12" width="1" height="1" /></bezel>
- <bezel name="7.7" element="led"><bounds x="14" y="14" width="1" height="1" /></bezel>
- <bezel name="7.8" element="led"><bounds x="14" y="16" width="1" height="1" /></bezel>
- <bezel name="7.9" element="led"><bounds x="14" y="18" width="1" height="1" /></bezel>
- <bezel name="7.10" element="led"><bounds x="14" y="20" width="1" height="1" /></bezel>
- <bezel name="7.11" element="led"><bounds x="14" y="22" width="1" height="1" /></bezel>
- <bezel name="7.12" element="led"><bounds x="14" y="24" width="1" height="1" /></bezel>
- <bezel name="7.13" element="led"><bounds x="14" y="26" width="1" height="1" /></bezel>
- <bezel name="7.14" element="led"><bounds x="14" y="28" width="1" height="1" /></bezel>
- <bezel name="7.15" element="led"><bounds x="14" y="30" width="1" height="1" /></bezel>
- <bezel name="7.16" element="led"><bounds x="14" y="32" width="1" height="1" /></bezel>
- <bezel name="7.17" element="led"><bounds x="14" y="34" width="1" height="1" /></bezel>
- <bezel name="7.18" element="led"><bounds x="14" y="36" width="1" height="1" /></bezel>
- <bezel name="7.19" element="led"><bounds x="14" y="38" width="1" height="1" /></bezel>
- <bezel name="7.20" element="led"><bounds x="14" y="40" width="1" height="1" /></bezel>
- <bezel name="7.21" element="led"><bounds x="14" y="42" width="1" height="1" /></bezel>
- <bezel name="7.22" element="led"><bounds x="14" y="44" width="1" height="1" /></bezel>
- <bezel name="7.23" element="led"><bounds x="14" y="46" width="1" height="1" /></bezel>
- <bezel name="7.24" element="led"><bounds x="14" y="48" width="1" height="1" /></bezel>
- <bezel name="7.25" element="led"><bounds x="14" y="50" width="1" height="1" /></bezel>
- <bezel name="7.26" element="led"><bounds x="14" y="52" width="1" height="1" /></bezel>
- <bezel name="7.27" element="led"><bounds x="14" y="54" width="1" height="1" /></bezel>
- <bezel name="7.28" element="led"><bounds x="14" y="56" width="1" height="1" /></bezel>
- <bezel name="7.29" element="led"><bounds x="14" y="58" width="1" height="1" /></bezel>
- <bezel name="7.30" element="led"><bounds x="14" y="60" width="1" height="1" /></bezel>
- <bezel name="7.31" element="led"><bounds x="14" y="62" width="1" height="1" /></bezel>
-
- <bezel name="8.0" element="led"><bounds x="16" y="0" width="1" height="1" /></bezel>
- <bezel name="8.1" element="led"><bounds x="16" y="2" width="1" height="1" /></bezel>
- <bezel name="8.2" element="led"><bounds x="16" y="4" width="1" height="1" /></bezel>
- <bezel name="8.3" element="led"><bounds x="16" y="6" width="1" height="1" /></bezel>
- <bezel name="8.4" element="led"><bounds x="16" y="8" width="1" height="1" /></bezel>
- <bezel name="8.5" element="led"><bounds x="16" y="10" width="1" height="1" /></bezel>
- <bezel name="8.6" element="led"><bounds x="16" y="12" width="1" height="1" /></bezel>
- <bezel name="8.7" element="led"><bounds x="16" y="14" width="1" height="1" /></bezel>
- <bezel name="8.8" element="led"><bounds x="16" y="16" width="1" height="1" /></bezel>
- <bezel name="8.9" element="led"><bounds x="16" y="18" width="1" height="1" /></bezel>
- <bezel name="8.10" element="led"><bounds x="16" y="20" width="1" height="1" /></bezel>
- <bezel name="8.11" element="led"><bounds x="16" y="22" width="1" height="1" /></bezel>
- <bezel name="8.12" element="led"><bounds x="16" y="24" width="1" height="1" /></bezel>
- <bezel name="8.13" element="led"><bounds x="16" y="26" width="1" height="1" /></bezel>
- <bezel name="8.14" element="led"><bounds x="16" y="28" width="1" height="1" /></bezel>
- <bezel name="8.15" element="led"><bounds x="16" y="30" width="1" height="1" /></bezel>
- <bezel name="8.16" element="led"><bounds x="16" y="32" width="1" height="1" /></bezel>
- <bezel name="8.17" element="led"><bounds x="16" y="34" width="1" height="1" /></bezel>
- <bezel name="8.18" element="led"><bounds x="16" y="36" width="1" height="1" /></bezel>
- <bezel name="8.19" element="led"><bounds x="16" y="38" width="1" height="1" /></bezel>
- <bezel name="8.20" element="led"><bounds x="16" y="40" width="1" height="1" /></bezel>
- <bezel name="8.21" element="led"><bounds x="16" y="42" width="1" height="1" /></bezel>
- <bezel name="8.22" element="led"><bounds x="16" y="44" width="1" height="1" /></bezel>
- <bezel name="8.23" element="led"><bounds x="16" y="46" width="1" height="1" /></bezel>
- <bezel name="8.24" element="led"><bounds x="16" y="48" width="1" height="1" /></bezel>
- <bezel name="8.25" element="led"><bounds x="16" y="50" width="1" height="1" /></bezel>
- <bezel name="8.26" element="led"><bounds x="16" y="52" width="1" height="1" /></bezel>
- <bezel name="8.27" element="led"><bounds x="16" y="54" width="1" height="1" /></bezel>
- <bezel name="8.28" element="led"><bounds x="16" y="56" width="1" height="1" /></bezel>
- <bezel name="8.29" element="led"><bounds x="16" y="58" width="1" height="1" /></bezel>
- <bezel name="8.30" element="led"><bounds x="16" y="60" width="1" height="1" /></bezel>
- <bezel name="8.31" element="led"><bounds x="16" y="62" width="1" height="1" /></bezel>
-
- <bezel name="9.0" element="led"><bounds x="18" y="0" width="1" height="1" /></bezel>
- <bezel name="9.1" element="led"><bounds x="18" y="2" width="1" height="1" /></bezel>
- <bezel name="9.2" element="led"><bounds x="18" y="4" width="1" height="1" /></bezel>
- <bezel name="9.3" element="led"><bounds x="18" y="6" width="1" height="1" /></bezel>
- <bezel name="9.4" element="led"><bounds x="18" y="8" width="1" height="1" /></bezel>
- <bezel name="9.5" element="led"><bounds x="18" y="10" width="1" height="1" /></bezel>
- <bezel name="9.6" element="led"><bounds x="18" y="12" width="1" height="1" /></bezel>
- <bezel name="9.7" element="led"><bounds x="18" y="14" width="1" height="1" /></bezel>
- <bezel name="9.8" element="led"><bounds x="18" y="16" width="1" height="1" /></bezel>
- <bezel name="9.9" element="led"><bounds x="18" y="18" width="1" height="1" /></bezel>
- <bezel name="9.10" element="led"><bounds x="18" y="20" width="1" height="1" /></bezel>
- <bezel name="9.11" element="led"><bounds x="18" y="22" width="1" height="1" /></bezel>
- <bezel name="9.12" element="led"><bounds x="18" y="24" width="1" height="1" /></bezel>
- <bezel name="9.13" element="led"><bounds x="18" y="26" width="1" height="1" /></bezel>
- <bezel name="9.14" element="led"><bounds x="18" y="28" width="1" height="1" /></bezel>
- <bezel name="9.15" element="led"><bounds x="18" y="30" width="1" height="1" /></bezel>
- <bezel name="9.16" element="led"><bounds x="18" y="32" width="1" height="1" /></bezel>
- <bezel name="9.17" element="led"><bounds x="18" y="34" width="1" height="1" /></bezel>
- <bezel name="9.18" element="led"><bounds x="18" y="36" width="1" height="1" /></bezel>
- <bezel name="9.19" element="led"><bounds x="18" y="38" width="1" height="1" /></bezel>
- <bezel name="9.20" element="led"><bounds x="18" y="40" width="1" height="1" /></bezel>
- <bezel name="9.21" element="led"><bounds x="18" y="42" width="1" height="1" /></bezel>
- <bezel name="9.22" element="led"><bounds x="18" y="44" width="1" height="1" /></bezel>
- <bezel name="9.23" element="led"><bounds x="18" y="46" width="1" height="1" /></bezel>
- <bezel name="9.24" element="led"><bounds x="18" y="48" width="1" height="1" /></bezel>
- <bezel name="9.25" element="led"><bounds x="18" y="50" width="1" height="1" /></bezel>
- <bezel name="9.26" element="led"><bounds x="18" y="52" width="1" height="1" /></bezel>
- <bezel name="9.27" element="led"><bounds x="18" y="54" width="1" height="1" /></bezel>
- <bezel name="9.28" element="led"><bounds x="18" y="56" width="1" height="1" /></bezel>
- <bezel name="9.29" element="led"><bounds x="18" y="58" width="1" height="1" /></bezel>
- <bezel name="9.30" element="led"><bounds x="18" y="60" width="1" height="1" /></bezel>
- <bezel name="9.31" element="led"><bounds x="18" y="62" width="1" height="1" /></bezel>
-
- <bezel name="10.0" element="led"><bounds x="20" y="0" width="1" height="1" /></bezel>
- <bezel name="10.1" element="led"><bounds x="20" y="2" width="1" height="1" /></bezel>
- <bezel name="10.2" element="led"><bounds x="20" y="4" width="1" height="1" /></bezel>
- <bezel name="10.3" element="led"><bounds x="20" y="6" width="1" height="1" /></bezel>
- <bezel name="10.4" element="led"><bounds x="20" y="8" width="1" height="1" /></bezel>
- <bezel name="10.5" element="led"><bounds x="20" y="10" width="1" height="1" /></bezel>
- <bezel name="10.6" element="led"><bounds x="20" y="12" width="1" height="1" /></bezel>
- <bezel name="10.7" element="led"><bounds x="20" y="14" width="1" height="1" /></bezel>
- <bezel name="10.8" element="led"><bounds x="20" y="16" width="1" height="1" /></bezel>
- <bezel name="10.9" element="led"><bounds x="20" y="18" width="1" height="1" /></bezel>
- <bezel name="10.10" element="led"><bounds x="20" y="20" width="1" height="1" /></bezel>
- <bezel name="10.11" element="led"><bounds x="20" y="22" width="1" height="1" /></bezel>
- <bezel name="10.12" element="led"><bounds x="20" y="24" width="1" height="1" /></bezel>
- <bezel name="10.13" element="led"><bounds x="20" y="26" width="1" height="1" /></bezel>
- <bezel name="10.14" element="led"><bounds x="20" y="28" width="1" height="1" /></bezel>
- <bezel name="10.15" element="led"><bounds x="20" y="30" width="1" height="1" /></bezel>
- <bezel name="10.16" element="led"><bounds x="20" y="32" width="1" height="1" /></bezel>
- <bezel name="10.17" element="led"><bounds x="20" y="34" width="1" height="1" /></bezel>
- <bezel name="10.18" element="led"><bounds x="20" y="36" width="1" height="1" /></bezel>
- <bezel name="10.19" element="led"><bounds x="20" y="38" width="1" height="1" /></bezel>
- <bezel name="10.20" element="led"><bounds x="20" y="40" width="1" height="1" /></bezel>
- <bezel name="10.21" element="led"><bounds x="20" y="42" width="1" height="1" /></bezel>
- <bezel name="10.22" element="led"><bounds x="20" y="44" width="1" height="1" /></bezel>
- <bezel name="10.23" element="led"><bounds x="20" y="46" width="1" height="1" /></bezel>
- <bezel name="10.24" element="led"><bounds x="20" y="48" width="1" height="1" /></bezel>
- <bezel name="10.25" element="led"><bounds x="20" y="50" width="1" height="1" /></bezel>
- <bezel name="10.26" element="led"><bounds x="20" y="52" width="1" height="1" /></bezel>
- <bezel name="10.27" element="led"><bounds x="20" y="54" width="1" height="1" /></bezel>
- <bezel name="10.28" element="led"><bounds x="20" y="56" width="1" height="1" /></bezel>
- <bezel name="10.29" element="led"><bounds x="20" y="58" width="1" height="1" /></bezel>
- <bezel name="10.30" element="led"><bounds x="20" y="60" width="1" height="1" /></bezel>
- <bezel name="10.31" element="led"><bounds x="20" y="62" width="1" height="1" /></bezel>
-
- <bezel name="11.0" element="led"><bounds x="22" y="0" width="1" height="1" /></bezel>
- <bezel name="11.1" element="led"><bounds x="22" y="2" width="1" height="1" /></bezel>
- <bezel name="11.2" element="led"><bounds x="22" y="4" width="1" height="1" /></bezel>
- <bezel name="11.3" element="led"><bounds x="22" y="6" width="1" height="1" /></bezel>
- <bezel name="11.4" element="led"><bounds x="22" y="8" width="1" height="1" /></bezel>
- <bezel name="11.5" element="led"><bounds x="22" y="10" width="1" height="1" /></bezel>
- <bezel name="11.6" element="led"><bounds x="22" y="12" width="1" height="1" /></bezel>
- <bezel name="11.7" element="led"><bounds x="22" y="14" width="1" height="1" /></bezel>
- <bezel name="11.8" element="led"><bounds x="22" y="16" width="1" height="1" /></bezel>
- <bezel name="11.9" element="led"><bounds x="22" y="18" width="1" height="1" /></bezel>
- <bezel name="11.10" element="led"><bounds x="22" y="20" width="1" height="1" /></bezel>
- <bezel name="11.11" element="led"><bounds x="22" y="22" width="1" height="1" /></bezel>
- <bezel name="11.12" element="led"><bounds x="22" y="24" width="1" height="1" /></bezel>
- <bezel name="11.13" element="led"><bounds x="22" y="26" width="1" height="1" /></bezel>
- <bezel name="11.14" element="led"><bounds x="22" y="28" width="1" height="1" /></bezel>
- <bezel name="11.15" element="led"><bounds x="22" y="30" width="1" height="1" /></bezel>
- <bezel name="11.16" element="led"><bounds x="22" y="32" width="1" height="1" /></bezel>
- <bezel name="11.17" element="led"><bounds x="22" y="34" width="1" height="1" /></bezel>
- <bezel name="11.18" element="led"><bounds x="22" y="36" width="1" height="1" /></bezel>
- <bezel name="11.19" element="led"><bounds x="22" y="38" width="1" height="1" /></bezel>
- <bezel name="11.20" element="led"><bounds x="22" y="40" width="1" height="1" /></bezel>
- <bezel name="11.21" element="led"><bounds x="22" y="42" width="1" height="1" /></bezel>
- <bezel name="11.22" element="led"><bounds x="22" y="44" width="1" height="1" /></bezel>
- <bezel name="11.23" element="led"><bounds x="22" y="46" width="1" height="1" /></bezel>
- <bezel name="11.24" element="led"><bounds x="22" y="48" width="1" height="1" /></bezel>
- <bezel name="11.25" element="led"><bounds x="22" y="50" width="1" height="1" /></bezel>
- <bezel name="11.26" element="led"><bounds x="22" y="52" width="1" height="1" /></bezel>
- <bezel name="11.27" element="led"><bounds x="22" y="54" width="1" height="1" /></bezel>
- <bezel name="11.28" element="led"><bounds x="22" y="56" width="1" height="1" /></bezel>
- <bezel name="11.29" element="led"><bounds x="22" y="58" width="1" height="1" /></bezel>
- <bezel name="11.30" element="led"><bounds x="22" y="60" width="1" height="1" /></bezel>
- <bezel name="11.31" element="led"><bounds x="22" y="62" width="1" height="1" /></bezel>
-
- <bezel name="12.0" element="led"><bounds x="24" y="0" width="1" height="1" /></bezel>
- <bezel name="12.1" element="led"><bounds x="24" y="2" width="1" height="1" /></bezel>
- <bezel name="12.2" element="led"><bounds x="24" y="4" width="1" height="1" /></bezel>
- <bezel name="12.3" element="led"><bounds x="24" y="6" width="1" height="1" /></bezel>
- <bezel name="12.4" element="led"><bounds x="24" y="8" width="1" height="1" /></bezel>
- <bezel name="12.5" element="led"><bounds x="24" y="10" width="1" height="1" /></bezel>
- <bezel name="12.6" element="led"><bounds x="24" y="12" width="1" height="1" /></bezel>
- <bezel name="12.7" element="led"><bounds x="24" y="14" width="1" height="1" /></bezel>
- <bezel name="12.8" element="led"><bounds x="24" y="16" width="1" height="1" /></bezel>
- <bezel name="12.9" element="led"><bounds x="24" y="18" width="1" height="1" /></bezel>
- <bezel name="12.10" element="led"><bounds x="24" y="20" width="1" height="1" /></bezel>
- <bezel name="12.11" element="led"><bounds x="24" y="22" width="1" height="1" /></bezel>
- <bezel name="12.12" element="led"><bounds x="24" y="24" width="1" height="1" /></bezel>
- <bezel name="12.13" element="led"><bounds x="24" y="26" width="1" height="1" /></bezel>
- <bezel name="12.14" element="led"><bounds x="24" y="28" width="1" height="1" /></bezel>
- <bezel name="12.15" element="led"><bounds x="24" y="30" width="1" height="1" /></bezel>
- <bezel name="12.16" element="led"><bounds x="24" y="32" width="1" height="1" /></bezel>
- <bezel name="12.17" element="led"><bounds x="24" y="34" width="1" height="1" /></bezel>
- <bezel name="12.18" element="led"><bounds x="24" y="36" width="1" height="1" /></bezel>
- <bezel name="12.19" element="led"><bounds x="24" y="38" width="1" height="1" /></bezel>
- <bezel name="12.20" element="led"><bounds x="24" y="40" width="1" height="1" /></bezel>
- <bezel name="12.21" element="led"><bounds x="24" y="42" width="1" height="1" /></bezel>
- <bezel name="12.22" element="led"><bounds x="24" y="44" width="1" height="1" /></bezel>
- <bezel name="12.23" element="led"><bounds x="24" y="46" width="1" height="1" /></bezel>
- <bezel name="12.24" element="led"><bounds x="24" y="48" width="1" height="1" /></bezel>
- <bezel name="12.25" element="led"><bounds x="24" y="50" width="1" height="1" /></bezel>
- <bezel name="12.26" element="led"><bounds x="24" y="52" width="1" height="1" /></bezel>
- <bezel name="12.27" element="led"><bounds x="24" y="54" width="1" height="1" /></bezel>
- <bezel name="12.28" element="led"><bounds x="24" y="56" width="1" height="1" /></bezel>
- <bezel name="12.29" element="led"><bounds x="24" y="58" width="1" height="1" /></bezel>
- <bezel name="12.30" element="led"><bounds x="24" y="60" width="1" height="1" /></bezel>
- <bezel name="12.31" element="led"><bounds x="24" y="62" width="1" height="1" /></bezel>
-
- <bezel name="13.0" element="led"><bounds x="26" y="0" width="1" height="1" /></bezel>
- <bezel name="13.1" element="led"><bounds x="26" y="2" width="1" height="1" /></bezel>
- <bezel name="13.2" element="led"><bounds x="26" y="4" width="1" height="1" /></bezel>
- <bezel name="13.3" element="led"><bounds x="26" y="6" width="1" height="1" /></bezel>
- <bezel name="13.4" element="led"><bounds x="26" y="8" width="1" height="1" /></bezel>
- <bezel name="13.5" element="led"><bounds x="26" y="10" width="1" height="1" /></bezel>
- <bezel name="13.6" element="led"><bounds x="26" y="12" width="1" height="1" /></bezel>
- <bezel name="13.7" element="led"><bounds x="26" y="14" width="1" height="1" /></bezel>
- <bezel name="13.8" element="led"><bounds x="26" y="16" width="1" height="1" /></bezel>
- <bezel name="13.9" element="led"><bounds x="26" y="18" width="1" height="1" /></bezel>
- <bezel name="13.10" element="led"><bounds x="26" y="20" width="1" height="1" /></bezel>
- <bezel name="13.11" element="led"><bounds x="26" y="22" width="1" height="1" /></bezel>
- <bezel name="13.12" element="led"><bounds x="26" y="24" width="1" height="1" /></bezel>
- <bezel name="13.13" element="led"><bounds x="26" y="26" width="1" height="1" /></bezel>
- <bezel name="13.14" element="led"><bounds x="26" y="28" width="1" height="1" /></bezel>
- <bezel name="13.15" element="led"><bounds x="26" y="30" width="1" height="1" /></bezel>
- <bezel name="13.16" element="led"><bounds x="26" y="32" width="1" height="1" /></bezel>
- <bezel name="13.17" element="led"><bounds x="26" y="34" width="1" height="1" /></bezel>
- <bezel name="13.18" element="led"><bounds x="26" y="36" width="1" height="1" /></bezel>
- <bezel name="13.19" element="led"><bounds x="26" y="38" width="1" height="1" /></bezel>
- <bezel name="13.20" element="led"><bounds x="26" y="40" width="1" height="1" /></bezel>
- <bezel name="13.21" element="led"><bounds x="26" y="42" width="1" height="1" /></bezel>
- <bezel name="13.22" element="led"><bounds x="26" y="44" width="1" height="1" /></bezel>
- <bezel name="13.23" element="led"><bounds x="26" y="46" width="1" height="1" /></bezel>
- <bezel name="13.24" element="led"><bounds x="26" y="48" width="1" height="1" /></bezel>
- <bezel name="13.25" element="led"><bounds x="26" y="50" width="1" height="1" /></bezel>
- <bezel name="13.26" element="led"><bounds x="26" y="52" width="1" height="1" /></bezel>
- <bezel name="13.27" element="led"><bounds x="26" y="54" width="1" height="1" /></bezel>
- <bezel name="13.28" element="led"><bounds x="26" y="56" width="1" height="1" /></bezel>
- <bezel name="13.29" element="led"><bounds x="26" y="58" width="1" height="1" /></bezel>
- <bezel name="13.30" element="led"><bounds x="26" y="60" width="1" height="1" /></bezel>
- <bezel name="13.31" element="led"><bounds x="26" y="62" width="1" height="1" /></bezel>
-
- <bezel name="14.0" element="led"><bounds x="28" y="0" width="1" height="1" /></bezel>
- <bezel name="14.1" element="led"><bounds x="28" y="2" width="1" height="1" /></bezel>
- <bezel name="14.2" element="led"><bounds x="28" y="4" width="1" height="1" /></bezel>
- <bezel name="14.3" element="led"><bounds x="28" y="6" width="1" height="1" /></bezel>
- <bezel name="14.4" element="led"><bounds x="28" y="8" width="1" height="1" /></bezel>
- <bezel name="14.5" element="led"><bounds x="28" y="10" width="1" height="1" /></bezel>
- <bezel name="14.6" element="led"><bounds x="28" y="12" width="1" height="1" /></bezel>
- <bezel name="14.7" element="led"><bounds x="28" y="14" width="1" height="1" /></bezel>
- <bezel name="14.8" element="led"><bounds x="28" y="16" width="1" height="1" /></bezel>
- <bezel name="14.9" element="led"><bounds x="28" y="18" width="1" height="1" /></bezel>
- <bezel name="14.10" element="led"><bounds x="28" y="20" width="1" height="1" /></bezel>
- <bezel name="14.11" element="led"><bounds x="28" y="22" width="1" height="1" /></bezel>
- <bezel name="14.12" element="led"><bounds x="28" y="24" width="1" height="1" /></bezel>
- <bezel name="14.13" element="led"><bounds x="28" y="26" width="1" height="1" /></bezel>
- <bezel name="14.14" element="led"><bounds x="28" y="28" width="1" height="1" /></bezel>
- <bezel name="14.15" element="led"><bounds x="28" y="30" width="1" height="1" /></bezel>
- <bezel name="14.16" element="led"><bounds x="28" y="32" width="1" height="1" /></bezel>
- <bezel name="14.17" element="led"><bounds x="28" y="34" width="1" height="1" /></bezel>
- <bezel name="14.18" element="led"><bounds x="28" y="36" width="1" height="1" /></bezel>
- <bezel name="14.19" element="led"><bounds x="28" y="38" width="1" height="1" /></bezel>
- <bezel name="14.20" element="led"><bounds x="28" y="40" width="1" height="1" /></bezel>
- <bezel name="14.21" element="led"><bounds x="28" y="42" width="1" height="1" /></bezel>
- <bezel name="14.22" element="led"><bounds x="28" y="44" width="1" height="1" /></bezel>
- <bezel name="14.23" element="led"><bounds x="28" y="46" width="1" height="1" /></bezel>
- <bezel name="14.24" element="led"><bounds x="28" y="48" width="1" height="1" /></bezel>
- <bezel name="14.25" element="led"><bounds x="28" y="50" width="1" height="1" /></bezel>
- <bezel name="14.26" element="led"><bounds x="28" y="52" width="1" height="1" /></bezel>
- <bezel name="14.27" element="led"><bounds x="28" y="54" width="1" height="1" /></bezel>
- <bezel name="14.28" element="led"><bounds x="28" y="56" width="1" height="1" /></bezel>
- <bezel name="14.29" element="led"><bounds x="28" y="58" width="1" height="1" /></bezel>
- <bezel name="14.30" element="led"><bounds x="28" y="60" width="1" height="1" /></bezel>
- <bezel name="14.31" element="led"><bounds x="28" y="62" width="1" height="1" /></bezel>
-
- <bezel name="15.0" element="led"><bounds x="30" y="0" width="1" height="1" /></bezel>
- <bezel name="15.1" element="led"><bounds x="30" y="2" width="1" height="1" /></bezel>
- <bezel name="15.2" element="led"><bounds x="30" y="4" width="1" height="1" /></bezel>
- <bezel name="15.3" element="led"><bounds x="30" y="6" width="1" height="1" /></bezel>
- <bezel name="15.4" element="led"><bounds x="30" y="8" width="1" height="1" /></bezel>
- <bezel name="15.5" element="led"><bounds x="30" y="10" width="1" height="1" /></bezel>
- <bezel name="15.6" element="led"><bounds x="30" y="12" width="1" height="1" /></bezel>
- <bezel name="15.7" element="led"><bounds x="30" y="14" width="1" height="1" /></bezel>
- <bezel name="15.8" element="led"><bounds x="30" y="16" width="1" height="1" /></bezel>
- <bezel name="15.9" element="led"><bounds x="30" y="18" width="1" height="1" /></bezel>
- <bezel name="15.10" element="led"><bounds x="30" y="20" width="1" height="1" /></bezel>
- <bezel name="15.11" element="led"><bounds x="30" y="22" width="1" height="1" /></bezel>
- <bezel name="15.12" element="led"><bounds x="30" y="24" width="1" height="1" /></bezel>
- <bezel name="15.13" element="led"><bounds x="30" y="26" width="1" height="1" /></bezel>
- <bezel name="15.14" element="led"><bounds x="30" y="28" width="1" height="1" /></bezel>
- <bezel name="15.15" element="led"><bounds x="30" y="30" width="1" height="1" /></bezel>
- <bezel name="15.16" element="led"><bounds x="30" y="32" width="1" height="1" /></bezel>
- <bezel name="15.17" element="led"><bounds x="30" y="34" width="1" height="1" /></bezel>
- <bezel name="15.18" element="led"><bounds x="30" y="36" width="1" height="1" /></bezel>
- <bezel name="15.19" element="led"><bounds x="30" y="38" width="1" height="1" /></bezel>
- <bezel name="15.20" element="led"><bounds x="30" y="40" width="1" height="1" /></bezel>
- <bezel name="15.21" element="led"><bounds x="30" y="42" width="1" height="1" /></bezel>
- <bezel name="15.22" element="led"><bounds x="30" y="44" width="1" height="1" /></bezel>
- <bezel name="15.23" element="led"><bounds x="30" y="46" width="1" height="1" /></bezel>
- <bezel name="15.24" element="led"><bounds x="30" y="48" width="1" height="1" /></bezel>
- <bezel name="15.25" element="led"><bounds x="30" y="50" width="1" height="1" /></bezel>
- <bezel name="15.26" element="led"><bounds x="30" y="52" width="1" height="1" /></bezel>
- <bezel name="15.27" element="led"><bounds x="30" y="54" width="1" height="1" /></bezel>
- <bezel name="15.28" element="led"><bounds x="30" y="56" width="1" height="1" /></bezel>
- <bezel name="15.29" element="led"><bounds x="30" y="58" width="1" height="1" /></bezel>
- <bezel name="15.30" element="led"><bounds x="30" y="60" width="1" height="1" /></bezel>
- <bezel name="15.31" element="led"><bounds x="30" y="62" width="1" height="1" /></bezel>
+ <repeat count="32">
+ <param name="x" start="0" increment="1" />
+ <bezel name="~y~.~x~" element="led"><bounds x="~x~" y="~y~" width="0.5" height="0.5" /></bezel>
+ </repeat>
+ </repeat>
</view>
</mamelayout>
diff --git a/src/mame/layout/hh_ucom4_test.lay b/src/mame/layout/hh_ucom4_test.lay
index 19f0c66309f..63f5e0ce70c 100644
--- a/src/mame/layout/hh_ucom4_test.lay
+++ b/src/mame/layout/hh_ucom4_test.lay
@@ -14,540 +14,21 @@
<!-- build screen -->
<view name="Test Layout">
- <bounds left="0" right="64" top="0" bottom="64" />
+ <bounds left="0" right="32" top="0" bottom="16" />
<bezel element="static_black">
- <bounds left="0" right="64" top="0" bottom="64" />
+ <bounds left="0" right="32" top="0" bottom="16" />
</bezel>
<!-- max 16*32 matrix -->
- <bezel name="0.0" element="led"><bounds x="0" y="0" width="1" height="1" /></bezel>
- <bezel name="0.1" element="led"><bounds x="0" y="2" width="1" height="1" /></bezel>
- <bezel name="0.2" element="led"><bounds x="0" y="4" width="1" height="1" /></bezel>
- <bezel name="0.3" element="led"><bounds x="0" y="6" width="1" height="1" /></bezel>
- <bezel name="0.4" element="led"><bounds x="0" y="8" width="1" height="1" /></bezel>
- <bezel name="0.5" element="led"><bounds x="0" y="10" width="1" height="1" /></bezel>
- <bezel name="0.6" element="led"><bounds x="0" y="12" width="1" height="1" /></bezel>
- <bezel name="0.7" element="led"><bounds x="0" y="14" width="1" height="1" /></bezel>
- <bezel name="0.8" element="led"><bounds x="0" y="16" width="1" height="1" /></bezel>
- <bezel name="0.9" element="led"><bounds x="0" y="18" width="1" height="1" /></bezel>
- <bezel name="0.10" element="led"><bounds x="0" y="20" width="1" height="1" /></bezel>
- <bezel name="0.11" element="led"><bounds x="0" y="22" width="1" height="1" /></bezel>
- <bezel name="0.12" element="led"><bounds x="0" y="24" width="1" height="1" /></bezel>
- <bezel name="0.13" element="led"><bounds x="0" y="26" width="1" height="1" /></bezel>
- <bezel name="0.14" element="led"><bounds x="0" y="28" width="1" height="1" /></bezel>
- <bezel name="0.15" element="led"><bounds x="0" y="30" width="1" height="1" /></bezel>
- <bezel name="0.16" element="led"><bounds x="0" y="32" width="1" height="1" /></bezel>
- <bezel name="0.17" element="led"><bounds x="0" y="34" width="1" height="1" /></bezel>
- <bezel name="0.18" element="led"><bounds x="0" y="36" width="1" height="1" /></bezel>
- <bezel name="0.19" element="led"><bounds x="0" y="38" width="1" height="1" /></bezel>
- <bezel name="0.20" element="led"><bounds x="0" y="40" width="1" height="1" /></bezel>
- <bezel name="0.21" element="led"><bounds x="0" y="42" width="1" height="1" /></bezel>
- <bezel name="0.22" element="led"><bounds x="0" y="44" width="1" height="1" /></bezel>
- <bezel name="0.23" element="led"><bounds x="0" y="46" width="1" height="1" /></bezel>
- <bezel name="0.24" element="led"><bounds x="0" y="48" width="1" height="1" /></bezel>
- <bezel name="0.25" element="led"><bounds x="0" y="50" width="1" height="1" /></bezel>
- <bezel name="0.26" element="led"><bounds x="0" y="52" width="1" height="1" /></bezel>
- <bezel name="0.27" element="led"><bounds x="0" y="54" width="1" height="1" /></bezel>
- <bezel name="0.28" element="led"><bounds x="0" y="56" width="1" height="1" /></bezel>
- <bezel name="0.29" element="led"><bounds x="0" y="58" width="1" height="1" /></bezel>
- <bezel name="0.30" element="led"><bounds x="0" y="60" width="1" height="1" /></bezel>
- <bezel name="0.31" element="led"><bounds x="0" y="62" width="1" height="1" /></bezel>
+ <repeat count="16">
+ <param name="y" start="0" increment="1" />
- <bezel name="1.0" element="led"><bounds x="2" y="0" width="1" height="1" /></bezel>
- <bezel name="1.1" element="led"><bounds x="2" y="2" width="1" height="1" /></bezel>
- <bezel name="1.2" element="led"><bounds x="2" y="4" width="1" height="1" /></bezel>
- <bezel name="1.3" element="led"><bounds x="2" y="6" width="1" height="1" /></bezel>
- <bezel name="1.4" element="led"><bounds x="2" y="8" width="1" height="1" /></bezel>
- <bezel name="1.5" element="led"><bounds x="2" y="10" width="1" height="1" /></bezel>
- <bezel name="1.6" element="led"><bounds x="2" y="12" width="1" height="1" /></bezel>
- <bezel name="1.7" element="led"><bounds x="2" y="14" width="1" height="1" /></bezel>
- <bezel name="1.8" element="led"><bounds x="2" y="16" width="1" height="1" /></bezel>
- <bezel name="1.9" element="led"><bounds x="2" y="18" width="1" height="1" /></bezel>
- <bezel name="1.10" element="led"><bounds x="2" y="20" width="1" height="1" /></bezel>
- <bezel name="1.11" element="led"><bounds x="2" y="22" width="1" height="1" /></bezel>
- <bezel name="1.12" element="led"><bounds x="2" y="24" width="1" height="1" /></bezel>
- <bezel name="1.13" element="led"><bounds x="2" y="26" width="1" height="1" /></bezel>
- <bezel name="1.14" element="led"><bounds x="2" y="28" width="1" height="1" /></bezel>
- <bezel name="1.15" element="led"><bounds x="2" y="30" width="1" height="1" /></bezel>
- <bezel name="1.16" element="led"><bounds x="2" y="32" width="1" height="1" /></bezel>
- <bezel name="1.17" element="led"><bounds x="2" y="34" width="1" height="1" /></bezel>
- <bezel name="1.18" element="led"><bounds x="2" y="36" width="1" height="1" /></bezel>
- <bezel name="1.19" element="led"><bounds x="2" y="38" width="1" height="1" /></bezel>
- <bezel name="1.20" element="led"><bounds x="2" y="40" width="1" height="1" /></bezel>
- <bezel name="1.21" element="led"><bounds x="2" y="42" width="1" height="1" /></bezel>
- <bezel name="1.22" element="led"><bounds x="2" y="44" width="1" height="1" /></bezel>
- <bezel name="1.23" element="led"><bounds x="2" y="46" width="1" height="1" /></bezel>
- <bezel name="1.24" element="led"><bounds x="2" y="48" width="1" height="1" /></bezel>
- <bezel name="1.25" element="led"><bounds x="2" y="50" width="1" height="1" /></bezel>
- <bezel name="1.26" element="led"><bounds x="2" y="52" width="1" height="1" /></bezel>
- <bezel name="1.27" element="led"><bounds x="2" y="54" width="1" height="1" /></bezel>
- <bezel name="1.28" element="led"><bounds x="2" y="56" width="1" height="1" /></bezel>
- <bezel name="1.29" element="led"><bounds x="2" y="58" width="1" height="1" /></bezel>
- <bezel name="1.30" element="led"><bounds x="2" y="60" width="1" height="1" /></bezel>
- <bezel name="1.31" element="led"><bounds x="2" y="62" width="1" height="1" /></bezel>
-
- <bezel name="2.0" element="led"><bounds x="4" y="0" width="1" height="1" /></bezel>
- <bezel name="2.1" element="led"><bounds x="4" y="2" width="1" height="1" /></bezel>
- <bezel name="2.2" element="led"><bounds x="4" y="4" width="1" height="1" /></bezel>
- <bezel name="2.3" element="led"><bounds x="4" y="6" width="1" height="1" /></bezel>
- <bezel name="2.4" element="led"><bounds x="4" y="8" width="1" height="1" /></bezel>
- <bezel name="2.5" element="led"><bounds x="4" y="10" width="1" height="1" /></bezel>
- <bezel name="2.6" element="led"><bounds x="4" y="12" width="1" height="1" /></bezel>
- <bezel name="2.7" element="led"><bounds x="4" y="14" width="1" height="1" /></bezel>
- <bezel name="2.8" element="led"><bounds x="4" y="16" width="1" height="1" /></bezel>
- <bezel name="2.9" element="led"><bounds x="4" y="18" width="1" height="1" /></bezel>
- <bezel name="2.10" element="led"><bounds x="4" y="20" width="1" height="1" /></bezel>
- <bezel name="2.11" element="led"><bounds x="4" y="22" width="1" height="1" /></bezel>
- <bezel name="2.12" element="led"><bounds x="4" y="24" width="1" height="1" /></bezel>
- <bezel name="2.13" element="led"><bounds x="4" y="26" width="1" height="1" /></bezel>
- <bezel name="2.14" element="led"><bounds x="4" y="28" width="1" height="1" /></bezel>
- <bezel name="2.15" element="led"><bounds x="4" y="30" width="1" height="1" /></bezel>
- <bezel name="2.16" element="led"><bounds x="4" y="32" width="1" height="1" /></bezel>
- <bezel name="2.17" element="led"><bounds x="4" y="34" width="1" height="1" /></bezel>
- <bezel name="2.18" element="led"><bounds x="4" y="36" width="1" height="1" /></bezel>
- <bezel name="2.19" element="led"><bounds x="4" y="38" width="1" height="1" /></bezel>
- <bezel name="2.20" element="led"><bounds x="4" y="40" width="1" height="1" /></bezel>
- <bezel name="2.21" element="led"><bounds x="4" y="42" width="1" height="1" /></bezel>
- <bezel name="2.22" element="led"><bounds x="4" y="44" width="1" height="1" /></bezel>
- <bezel name="2.23" element="led"><bounds x="4" y="46" width="1" height="1" /></bezel>
- <bezel name="2.24" element="led"><bounds x="4" y="48" width="1" height="1" /></bezel>
- <bezel name="2.25" element="led"><bounds x="4" y="50" width="1" height="1" /></bezel>
- <bezel name="2.26" element="led"><bounds x="4" y="52" width="1" height="1" /></bezel>
- <bezel name="2.27" element="led"><bounds x="4" y="54" width="1" height="1" /></bezel>
- <bezel name="2.28" element="led"><bounds x="4" y="56" width="1" height="1" /></bezel>
- <bezel name="2.29" element="led"><bounds x="4" y="58" width="1" height="1" /></bezel>
- <bezel name="2.30" element="led"><bounds x="4" y="60" width="1" height="1" /></bezel>
- <bezel name="2.31" element="led"><bounds x="4" y="62" width="1" height="1" /></bezel>
-
- <bezel name="3.0" element="led"><bounds x="6" y="0" width="1" height="1" /></bezel>
- <bezel name="3.1" element="led"><bounds x="6" y="2" width="1" height="1" /></bezel>
- <bezel name="3.2" element="led"><bounds x="6" y="4" width="1" height="1" /></bezel>
- <bezel name="3.3" element="led"><bounds x="6" y="6" width="1" height="1" /></bezel>
- <bezel name="3.4" element="led"><bounds x="6" y="8" width="1" height="1" /></bezel>
- <bezel name="3.5" element="led"><bounds x="6" y="10" width="1" height="1" /></bezel>
- <bezel name="3.6" element="led"><bounds x="6" y="12" width="1" height="1" /></bezel>
- <bezel name="3.7" element="led"><bounds x="6" y="14" width="1" height="1" /></bezel>
- <bezel name="3.8" element="led"><bounds x="6" y="16" width="1" height="1" /></bezel>
- <bezel name="3.9" element="led"><bounds x="6" y="18" width="1" height="1" /></bezel>
- <bezel name="3.10" element="led"><bounds x="6" y="20" width="1" height="1" /></bezel>
- <bezel name="3.11" element="led"><bounds x="6" y="22" width="1" height="1" /></bezel>
- <bezel name="3.12" element="led"><bounds x="6" y="24" width="1" height="1" /></bezel>
- <bezel name="3.13" element="led"><bounds x="6" y="26" width="1" height="1" /></bezel>
- <bezel name="3.14" element="led"><bounds x="6" y="28" width="1" height="1" /></bezel>
- <bezel name="3.15" element="led"><bounds x="6" y="30" width="1" height="1" /></bezel>
- <bezel name="3.16" element="led"><bounds x="6" y="32" width="1" height="1" /></bezel>
- <bezel name="3.17" element="led"><bounds x="6" y="34" width="1" height="1" /></bezel>
- <bezel name="3.18" element="led"><bounds x="6" y="36" width="1" height="1" /></bezel>
- <bezel name="3.19" element="led"><bounds x="6" y="38" width="1" height="1" /></bezel>
- <bezel name="3.20" element="led"><bounds x="6" y="40" width="1" height="1" /></bezel>
- <bezel name="3.21" element="led"><bounds x="6" y="42" width="1" height="1" /></bezel>
- <bezel name="3.22" element="led"><bounds x="6" y="44" width="1" height="1" /></bezel>
- <bezel name="3.23" element="led"><bounds x="6" y="46" width="1" height="1" /></bezel>
- <bezel name="3.24" element="led"><bounds x="6" y="48" width="1" height="1" /></bezel>
- <bezel name="3.25" element="led"><bounds x="6" y="50" width="1" height="1" /></bezel>
- <bezel name="3.26" element="led"><bounds x="6" y="52" width="1" height="1" /></bezel>
- <bezel name="3.27" element="led"><bounds x="6" y="54" width="1" height="1" /></bezel>
- <bezel name="3.28" element="led"><bounds x="6" y="56" width="1" height="1" /></bezel>
- <bezel name="3.29" element="led"><bounds x="6" y="58" width="1" height="1" /></bezel>
- <bezel name="3.30" element="led"><bounds x="6" y="60" width="1" height="1" /></bezel>
- <bezel name="3.31" element="led"><bounds x="6" y="62" width="1" height="1" /></bezel>
-
- <bezel name="4.0" element="led"><bounds x="8" y="0" width="1" height="1" /></bezel>
- <bezel name="4.1" element="led"><bounds x="8" y="2" width="1" height="1" /></bezel>
- <bezel name="4.2" element="led"><bounds x="8" y="4" width="1" height="1" /></bezel>
- <bezel name="4.3" element="led"><bounds x="8" y="6" width="1" height="1" /></bezel>
- <bezel name="4.4" element="led"><bounds x="8" y="8" width="1" height="1" /></bezel>
- <bezel name="4.5" element="led"><bounds x="8" y="10" width="1" height="1" /></bezel>
- <bezel name="4.6" element="led"><bounds x="8" y="12" width="1" height="1" /></bezel>
- <bezel name="4.7" element="led"><bounds x="8" y="14" width="1" height="1" /></bezel>
- <bezel name="4.8" element="led"><bounds x="8" y="16" width="1" height="1" /></bezel>
- <bezel name="4.9" element="led"><bounds x="8" y="18" width="1" height="1" /></bezel>
- <bezel name="4.10" element="led"><bounds x="8" y="20" width="1" height="1" /></bezel>
- <bezel name="4.11" element="led"><bounds x="8" y="22" width="1" height="1" /></bezel>
- <bezel name="4.12" element="led"><bounds x="8" y="24" width="1" height="1" /></bezel>
- <bezel name="4.13" element="led"><bounds x="8" y="26" width="1" height="1" /></bezel>
- <bezel name="4.14" element="led"><bounds x="8" y="28" width="1" height="1" /></bezel>
- <bezel name="4.15" element="led"><bounds x="8" y="30" width="1" height="1" /></bezel>
- <bezel name="4.16" element="led"><bounds x="8" y="32" width="1" height="1" /></bezel>
- <bezel name="4.17" element="led"><bounds x="8" y="34" width="1" height="1" /></bezel>
- <bezel name="4.18" element="led"><bounds x="8" y="36" width="1" height="1" /></bezel>
- <bezel name="4.19" element="led"><bounds x="8" y="38" width="1" height="1" /></bezel>
- <bezel name="4.20" element="led"><bounds x="8" y="40" width="1" height="1" /></bezel>
- <bezel name="4.21" element="led"><bounds x="8" y="42" width="1" height="1" /></bezel>
- <bezel name="4.22" element="led"><bounds x="8" y="44" width="1" height="1" /></bezel>
- <bezel name="4.23" element="led"><bounds x="8" y="46" width="1" height="1" /></bezel>
- <bezel name="4.24" element="led"><bounds x="8" y="48" width="1" height="1" /></bezel>
- <bezel name="4.25" element="led"><bounds x="8" y="50" width="1" height="1" /></bezel>
- <bezel name="4.26" element="led"><bounds x="8" y="52" width="1" height="1" /></bezel>
- <bezel name="4.27" element="led"><bounds x="8" y="54" width="1" height="1" /></bezel>
- <bezel name="4.28" element="led"><bounds x="8" y="56" width="1" height="1" /></bezel>
- <bezel name="4.29" element="led"><bounds x="8" y="58" width="1" height="1" /></bezel>
- <bezel name="4.30" element="led"><bounds x="8" y="60" width="1" height="1" /></bezel>
- <bezel name="4.31" element="led"><bounds x="8" y="62" width="1" height="1" /></bezel>
-
- <bezel name="5.0" element="led"><bounds x="10" y="0" width="1" height="1" /></bezel>
- <bezel name="5.1" element="led"><bounds x="10" y="2" width="1" height="1" /></bezel>
- <bezel name="5.2" element="led"><bounds x="10" y="4" width="1" height="1" /></bezel>
- <bezel name="5.3" element="led"><bounds x="10" y="6" width="1" height="1" /></bezel>
- <bezel name="5.4" element="led"><bounds x="10" y="8" width="1" height="1" /></bezel>
- <bezel name="5.5" element="led"><bounds x="10" y="10" width="1" height="1" /></bezel>
- <bezel name="5.6" element="led"><bounds x="10" y="12" width="1" height="1" /></bezel>
- <bezel name="5.7" element="led"><bounds x="10" y="14" width="1" height="1" /></bezel>
- <bezel name="5.8" element="led"><bounds x="10" y="16" width="1" height="1" /></bezel>
- <bezel name="5.9" element="led"><bounds x="10" y="18" width="1" height="1" /></bezel>
- <bezel name="5.10" element="led"><bounds x="10" y="20" width="1" height="1" /></bezel>
- <bezel name="5.11" element="led"><bounds x="10" y="22" width="1" height="1" /></bezel>
- <bezel name="5.12" element="led"><bounds x="10" y="24" width="1" height="1" /></bezel>
- <bezel name="5.13" element="led"><bounds x="10" y="26" width="1" height="1" /></bezel>
- <bezel name="5.14" element="led"><bounds x="10" y="28" width="1" height="1" /></bezel>
- <bezel name="5.15" element="led"><bounds x="10" y="30" width="1" height="1" /></bezel>
- <bezel name="5.16" element="led"><bounds x="10" y="32" width="1" height="1" /></bezel>
- <bezel name="5.17" element="led"><bounds x="10" y="34" width="1" height="1" /></bezel>
- <bezel name="5.18" element="led"><bounds x="10" y="36" width="1" height="1" /></bezel>
- <bezel name="5.19" element="led"><bounds x="10" y="38" width="1" height="1" /></bezel>
- <bezel name="5.20" element="led"><bounds x="10" y="40" width="1" height="1" /></bezel>
- <bezel name="5.21" element="led"><bounds x="10" y="42" width="1" height="1" /></bezel>
- <bezel name="5.22" element="led"><bounds x="10" y="44" width="1" height="1" /></bezel>
- <bezel name="5.23" element="led"><bounds x="10" y="46" width="1" height="1" /></bezel>
- <bezel name="5.24" element="led"><bounds x="10" y="48" width="1" height="1" /></bezel>
- <bezel name="5.25" element="led"><bounds x="10" y="50" width="1" height="1" /></bezel>
- <bezel name="5.26" element="led"><bounds x="10" y="52" width="1" height="1" /></bezel>
- <bezel name="5.27" element="led"><bounds x="10" y="54" width="1" height="1" /></bezel>
- <bezel name="5.28" element="led"><bounds x="10" y="56" width="1" height="1" /></bezel>
- <bezel name="5.29" element="led"><bounds x="10" y="58" width="1" height="1" /></bezel>
- <bezel name="5.30" element="led"><bounds x="10" y="60" width="1" height="1" /></bezel>
- <bezel name="5.31" element="led"><bounds x="10" y="62" width="1" height="1" /></bezel>
-
- <bezel name="6.0" element="led"><bounds x="12" y="0" width="1" height="1" /></bezel>
- <bezel name="6.1" element="led"><bounds x="12" y="2" width="1" height="1" /></bezel>
- <bezel name="6.2" element="led"><bounds x="12" y="4" width="1" height="1" /></bezel>
- <bezel name="6.3" element="led"><bounds x="12" y="6" width="1" height="1" /></bezel>
- <bezel name="6.4" element="led"><bounds x="12" y="8" width="1" height="1" /></bezel>
- <bezel name="6.5" element="led"><bounds x="12" y="10" width="1" height="1" /></bezel>
- <bezel name="6.6" element="led"><bounds x="12" y="12" width="1" height="1" /></bezel>
- <bezel name="6.7" element="led"><bounds x="12" y="14" width="1" height="1" /></bezel>
- <bezel name="6.8" element="led"><bounds x="12" y="16" width="1" height="1" /></bezel>
- <bezel name="6.9" element="led"><bounds x="12" y="18" width="1" height="1" /></bezel>
- <bezel name="6.10" element="led"><bounds x="12" y="20" width="1" height="1" /></bezel>
- <bezel name="6.11" element="led"><bounds x="12" y="22" width="1" height="1" /></bezel>
- <bezel name="6.12" element="led"><bounds x="12" y="24" width="1" height="1" /></bezel>
- <bezel name="6.13" element="led"><bounds x="12" y="26" width="1" height="1" /></bezel>
- <bezel name="6.14" element="led"><bounds x="12" y="28" width="1" height="1" /></bezel>
- <bezel name="6.15" element="led"><bounds x="12" y="30" width="1" height="1" /></bezel>
- <bezel name="6.16" element="led"><bounds x="12" y="32" width="1" height="1" /></bezel>
- <bezel name="6.17" element="led"><bounds x="12" y="34" width="1" height="1" /></bezel>
- <bezel name="6.18" element="led"><bounds x="12" y="36" width="1" height="1" /></bezel>
- <bezel name="6.19" element="led"><bounds x="12" y="38" width="1" height="1" /></bezel>
- <bezel name="6.20" element="led"><bounds x="12" y="40" width="1" height="1" /></bezel>
- <bezel name="6.21" element="led"><bounds x="12" y="42" width="1" height="1" /></bezel>
- <bezel name="6.22" element="led"><bounds x="12" y="44" width="1" height="1" /></bezel>
- <bezel name="6.23" element="led"><bounds x="12" y="46" width="1" height="1" /></bezel>
- <bezel name="6.24" element="led"><bounds x="12" y="48" width="1" height="1" /></bezel>
- <bezel name="6.25" element="led"><bounds x="12" y="50" width="1" height="1" /></bezel>
- <bezel name="6.26" element="led"><bounds x="12" y="52" width="1" height="1" /></bezel>
- <bezel name="6.27" element="led"><bounds x="12" y="54" width="1" height="1" /></bezel>
- <bezel name="6.28" element="led"><bounds x="12" y="56" width="1" height="1" /></bezel>
- <bezel name="6.29" element="led"><bounds x="12" y="58" width="1" height="1" /></bezel>
- <bezel name="6.30" element="led"><bounds x="12" y="60" width="1" height="1" /></bezel>
- <bezel name="6.31" element="led"><bounds x="12" y="62" width="1" height="1" /></bezel>
-
- <bezel name="7.0" element="led"><bounds x="14" y="0" width="1" height="1" /></bezel>
- <bezel name="7.1" element="led"><bounds x="14" y="2" width="1" height="1" /></bezel>
- <bezel name="7.2" element="led"><bounds x="14" y="4" width="1" height="1" /></bezel>
- <bezel name="7.3" element="led"><bounds x="14" y="6" width="1" height="1" /></bezel>
- <bezel name="7.4" element="led"><bounds x="14" y="8" width="1" height="1" /></bezel>
- <bezel name="7.5" element="led"><bounds x="14" y="10" width="1" height="1" /></bezel>
- <bezel name="7.6" element="led"><bounds x="14" y="12" width="1" height="1" /></bezel>
- <bezel name="7.7" element="led"><bounds x="14" y="14" width="1" height="1" /></bezel>
- <bezel name="7.8" element="led"><bounds x="14" y="16" width="1" height="1" /></bezel>
- <bezel name="7.9" element="led"><bounds x="14" y="18" width="1" height="1" /></bezel>
- <bezel name="7.10" element="led"><bounds x="14" y="20" width="1" height="1" /></bezel>
- <bezel name="7.11" element="led"><bounds x="14" y="22" width="1" height="1" /></bezel>
- <bezel name="7.12" element="led"><bounds x="14" y="24" width="1" height="1" /></bezel>
- <bezel name="7.13" element="led"><bounds x="14" y="26" width="1" height="1" /></bezel>
- <bezel name="7.14" element="led"><bounds x="14" y="28" width="1" height="1" /></bezel>
- <bezel name="7.15" element="led"><bounds x="14" y="30" width="1" height="1" /></bezel>
- <bezel name="7.16" element="led"><bounds x="14" y="32" width="1" height="1" /></bezel>
- <bezel name="7.17" element="led"><bounds x="14" y="34" width="1" height="1" /></bezel>
- <bezel name="7.18" element="led"><bounds x="14" y="36" width="1" height="1" /></bezel>
- <bezel name="7.19" element="led"><bounds x="14" y="38" width="1" height="1" /></bezel>
- <bezel name="7.20" element="led"><bounds x="14" y="40" width="1" height="1" /></bezel>
- <bezel name="7.21" element="led"><bounds x="14" y="42" width="1" height="1" /></bezel>
- <bezel name="7.22" element="led"><bounds x="14" y="44" width="1" height="1" /></bezel>
- <bezel name="7.23" element="led"><bounds x="14" y="46" width="1" height="1" /></bezel>
- <bezel name="7.24" element="led"><bounds x="14" y="48" width="1" height="1" /></bezel>
- <bezel name="7.25" element="led"><bounds x="14" y="50" width="1" height="1" /></bezel>
- <bezel name="7.26" element="led"><bounds x="14" y="52" width="1" height="1" /></bezel>
- <bezel name="7.27" element="led"><bounds x="14" y="54" width="1" height="1" /></bezel>
- <bezel name="7.28" element="led"><bounds x="14" y="56" width="1" height="1" /></bezel>
- <bezel name="7.29" element="led"><bounds x="14" y="58" width="1" height="1" /></bezel>
- <bezel name="7.30" element="led"><bounds x="14" y="60" width="1" height="1" /></bezel>
- <bezel name="7.31" element="led"><bounds x="14" y="62" width="1" height="1" /></bezel>
-
- <bezel name="8.0" element="led"><bounds x="16" y="0" width="1" height="1" /></bezel>
- <bezel name="8.1" element="led"><bounds x="16" y="2" width="1" height="1" /></bezel>
- <bezel name="8.2" element="led"><bounds x="16" y="4" width="1" height="1" /></bezel>
- <bezel name="8.3" element="led"><bounds x="16" y="6" width="1" height="1" /></bezel>
- <bezel name="8.4" element="led"><bounds x="16" y="8" width="1" height="1" /></bezel>
- <bezel name="8.5" element="led"><bounds x="16" y="10" width="1" height="1" /></bezel>
- <bezel name="8.6" element="led"><bounds x="16" y="12" width="1" height="1" /></bezel>
- <bezel name="8.7" element="led"><bounds x="16" y="14" width="1" height="1" /></bezel>
- <bezel name="8.8" element="led"><bounds x="16" y="16" width="1" height="1" /></bezel>
- <bezel name="8.9" element="led"><bounds x="16" y="18" width="1" height="1" /></bezel>
- <bezel name="8.10" element="led"><bounds x="16" y="20" width="1" height="1" /></bezel>
- <bezel name="8.11" element="led"><bounds x="16" y="22" width="1" height="1" /></bezel>
- <bezel name="8.12" element="led"><bounds x="16" y="24" width="1" height="1" /></bezel>
- <bezel name="8.13" element="led"><bounds x="16" y="26" width="1" height="1" /></bezel>
- <bezel name="8.14" element="led"><bounds x="16" y="28" width="1" height="1" /></bezel>
- <bezel name="8.15" element="led"><bounds x="16" y="30" width="1" height="1" /></bezel>
- <bezel name="8.16" element="led"><bounds x="16" y="32" width="1" height="1" /></bezel>
- <bezel name="8.17" element="led"><bounds x="16" y="34" width="1" height="1" /></bezel>
- <bezel name="8.18" element="led"><bounds x="16" y="36" width="1" height="1" /></bezel>
- <bezel name="8.19" element="led"><bounds x="16" y="38" width="1" height="1" /></bezel>
- <bezel name="8.20" element="led"><bounds x="16" y="40" width="1" height="1" /></bezel>
- <bezel name="8.21" element="led"><bounds x="16" y="42" width="1" height="1" /></bezel>
- <bezel name="8.22" element="led"><bounds x="16" y="44" width="1" height="1" /></bezel>
- <bezel name="8.23" element="led"><bounds x="16" y="46" width="1" height="1" /></bezel>
- <bezel name="8.24" element="led"><bounds x="16" y="48" width="1" height="1" /></bezel>
- <bezel name="8.25" element="led"><bounds x="16" y="50" width="1" height="1" /></bezel>
- <bezel name="8.26" element="led"><bounds x="16" y="52" width="1" height="1" /></bezel>
- <bezel name="8.27" element="led"><bounds x="16" y="54" width="1" height="1" /></bezel>
- <bezel name="8.28" element="led"><bounds x="16" y="56" width="1" height="1" /></bezel>
- <bezel name="8.29" element="led"><bounds x="16" y="58" width="1" height="1" /></bezel>
- <bezel name="8.30" element="led"><bounds x="16" y="60" width="1" height="1" /></bezel>
- <bezel name="8.31" element="led"><bounds x="16" y="62" width="1" height="1" /></bezel>
-
- <bezel name="9.0" element="led"><bounds x="18" y="0" width="1" height="1" /></bezel>
- <bezel name="9.1" element="led"><bounds x="18" y="2" width="1" height="1" /></bezel>
- <bezel name="9.2" element="led"><bounds x="18" y="4" width="1" height="1" /></bezel>
- <bezel name="9.3" element="led"><bounds x="18" y="6" width="1" height="1" /></bezel>
- <bezel name="9.4" element="led"><bounds x="18" y="8" width="1" height="1" /></bezel>
- <bezel name="9.5" element="led"><bounds x="18" y="10" width="1" height="1" /></bezel>
- <bezel name="9.6" element="led"><bounds x="18" y="12" width="1" height="1" /></bezel>
- <bezel name="9.7" element="led"><bounds x="18" y="14" width="1" height="1" /></bezel>
- <bezel name="9.8" element="led"><bounds x="18" y="16" width="1" height="1" /></bezel>
- <bezel name="9.9" element="led"><bounds x="18" y="18" width="1" height="1" /></bezel>
- <bezel name="9.10" element="led"><bounds x="18" y="20" width="1" height="1" /></bezel>
- <bezel name="9.11" element="led"><bounds x="18" y="22" width="1" height="1" /></bezel>
- <bezel name="9.12" element="led"><bounds x="18" y="24" width="1" height="1" /></bezel>
- <bezel name="9.13" element="led"><bounds x="18" y="26" width="1" height="1" /></bezel>
- <bezel name="9.14" element="led"><bounds x="18" y="28" width="1" height="1" /></bezel>
- <bezel name="9.15" element="led"><bounds x="18" y="30" width="1" height="1" /></bezel>
- <bezel name="9.16" element="led"><bounds x="18" y="32" width="1" height="1" /></bezel>
- <bezel name="9.17" element="led"><bounds x="18" y="34" width="1" height="1" /></bezel>
- <bezel name="9.18" element="led"><bounds x="18" y="36" width="1" height="1" /></bezel>
- <bezel name="9.19" element="led"><bounds x="18" y="38" width="1" height="1" /></bezel>
- <bezel name="9.20" element="led"><bounds x="18" y="40" width="1" height="1" /></bezel>
- <bezel name="9.21" element="led"><bounds x="18" y="42" width="1" height="1" /></bezel>
- <bezel name="9.22" element="led"><bounds x="18" y="44" width="1" height="1" /></bezel>
- <bezel name="9.23" element="led"><bounds x="18" y="46" width="1" height="1" /></bezel>
- <bezel name="9.24" element="led"><bounds x="18" y="48" width="1" height="1" /></bezel>
- <bezel name="9.25" element="led"><bounds x="18" y="50" width="1" height="1" /></bezel>
- <bezel name="9.26" element="led"><bounds x="18" y="52" width="1" height="1" /></bezel>
- <bezel name="9.27" element="led"><bounds x="18" y="54" width="1" height="1" /></bezel>
- <bezel name="9.28" element="led"><bounds x="18" y="56" width="1" height="1" /></bezel>
- <bezel name="9.29" element="led"><bounds x="18" y="58" width="1" height="1" /></bezel>
- <bezel name="9.30" element="led"><bounds x="18" y="60" width="1" height="1" /></bezel>
- <bezel name="9.31" element="led"><bounds x="18" y="62" width="1" height="1" /></bezel>
-
- <bezel name="10.0" element="led"><bounds x="20" y="0" width="1" height="1" /></bezel>
- <bezel name="10.1" element="led"><bounds x="20" y="2" width="1" height="1" /></bezel>
- <bezel name="10.2" element="led"><bounds x="20" y="4" width="1" height="1" /></bezel>
- <bezel name="10.3" element="led"><bounds x="20" y="6" width="1" height="1" /></bezel>
- <bezel name="10.4" element="led"><bounds x="20" y="8" width="1" height="1" /></bezel>
- <bezel name="10.5" element="led"><bounds x="20" y="10" width="1" height="1" /></bezel>
- <bezel name="10.6" element="led"><bounds x="20" y="12" width="1" height="1" /></bezel>
- <bezel name="10.7" element="led"><bounds x="20" y="14" width="1" height="1" /></bezel>
- <bezel name="10.8" element="led"><bounds x="20" y="16" width="1" height="1" /></bezel>
- <bezel name="10.9" element="led"><bounds x="20" y="18" width="1" height="1" /></bezel>
- <bezel name="10.10" element="led"><bounds x="20" y="20" width="1" height="1" /></bezel>
- <bezel name="10.11" element="led"><bounds x="20" y="22" width="1" height="1" /></bezel>
- <bezel name="10.12" element="led"><bounds x="20" y="24" width="1" height="1" /></bezel>
- <bezel name="10.13" element="led"><bounds x="20" y="26" width="1" height="1" /></bezel>
- <bezel name="10.14" element="led"><bounds x="20" y="28" width="1" height="1" /></bezel>
- <bezel name="10.15" element="led"><bounds x="20" y="30" width="1" height="1" /></bezel>
- <bezel name="10.16" element="led"><bounds x="20" y="32" width="1" height="1" /></bezel>
- <bezel name="10.17" element="led"><bounds x="20" y="34" width="1" height="1" /></bezel>
- <bezel name="10.18" element="led"><bounds x="20" y="36" width="1" height="1" /></bezel>
- <bezel name="10.19" element="led"><bounds x="20" y="38" width="1" height="1" /></bezel>
- <bezel name="10.20" element="led"><bounds x="20" y="40" width="1" height="1" /></bezel>
- <bezel name="10.21" element="led"><bounds x="20" y="42" width="1" height="1" /></bezel>
- <bezel name="10.22" element="led"><bounds x="20" y="44" width="1" height="1" /></bezel>
- <bezel name="10.23" element="led"><bounds x="20" y="46" width="1" height="1" /></bezel>
- <bezel name="10.24" element="led"><bounds x="20" y="48" width="1" height="1" /></bezel>
- <bezel name="10.25" element="led"><bounds x="20" y="50" width="1" height="1" /></bezel>
- <bezel name="10.26" element="led"><bounds x="20" y="52" width="1" height="1" /></bezel>
- <bezel name="10.27" element="led"><bounds x="20" y="54" width="1" height="1" /></bezel>
- <bezel name="10.28" element="led"><bounds x="20" y="56" width="1" height="1" /></bezel>
- <bezel name="10.29" element="led"><bounds x="20" y="58" width="1" height="1" /></bezel>
- <bezel name="10.30" element="led"><bounds x="20" y="60" width="1" height="1" /></bezel>
- <bezel name="10.31" element="led"><bounds x="20" y="62" width="1" height="1" /></bezel>
-
- <bezel name="11.0" element="led"><bounds x="22" y="0" width="1" height="1" /></bezel>
- <bezel name="11.1" element="led"><bounds x="22" y="2" width="1" height="1" /></bezel>
- <bezel name="11.2" element="led"><bounds x="22" y="4" width="1" height="1" /></bezel>
- <bezel name="11.3" element="led"><bounds x="22" y="6" width="1" height="1" /></bezel>
- <bezel name="11.4" element="led"><bounds x="22" y="8" width="1" height="1" /></bezel>
- <bezel name="11.5" element="led"><bounds x="22" y="10" width="1" height="1" /></bezel>
- <bezel name="11.6" element="led"><bounds x="22" y="12" width="1" height="1" /></bezel>
- <bezel name="11.7" element="led"><bounds x="22" y="14" width="1" height="1" /></bezel>
- <bezel name="11.8" element="led"><bounds x="22" y="16" width="1" height="1" /></bezel>
- <bezel name="11.9" element="led"><bounds x="22" y="18" width="1" height="1" /></bezel>
- <bezel name="11.10" element="led"><bounds x="22" y="20" width="1" height="1" /></bezel>
- <bezel name="11.11" element="led"><bounds x="22" y="22" width="1" height="1" /></bezel>
- <bezel name="11.12" element="led"><bounds x="22" y="24" width="1" height="1" /></bezel>
- <bezel name="11.13" element="led"><bounds x="22" y="26" width="1" height="1" /></bezel>
- <bezel name="11.14" element="led"><bounds x="22" y="28" width="1" height="1" /></bezel>
- <bezel name="11.15" element="led"><bounds x="22" y="30" width="1" height="1" /></bezel>
- <bezel name="11.16" element="led"><bounds x="22" y="32" width="1" height="1" /></bezel>
- <bezel name="11.17" element="led"><bounds x="22" y="34" width="1" height="1" /></bezel>
- <bezel name="11.18" element="led"><bounds x="22" y="36" width="1" height="1" /></bezel>
- <bezel name="11.19" element="led"><bounds x="22" y="38" width="1" height="1" /></bezel>
- <bezel name="11.20" element="led"><bounds x="22" y="40" width="1" height="1" /></bezel>
- <bezel name="11.21" element="led"><bounds x="22" y="42" width="1" height="1" /></bezel>
- <bezel name="11.22" element="led"><bounds x="22" y="44" width="1" height="1" /></bezel>
- <bezel name="11.23" element="led"><bounds x="22" y="46" width="1" height="1" /></bezel>
- <bezel name="11.24" element="led"><bounds x="22" y="48" width="1" height="1" /></bezel>
- <bezel name="11.25" element="led"><bounds x="22" y="50" width="1" height="1" /></bezel>
- <bezel name="11.26" element="led"><bounds x="22" y="52" width="1" height="1" /></bezel>
- <bezel name="11.27" element="led"><bounds x="22" y="54" width="1" height="1" /></bezel>
- <bezel name="11.28" element="led"><bounds x="22" y="56" width="1" height="1" /></bezel>
- <bezel name="11.29" element="led"><bounds x="22" y="58" width="1" height="1" /></bezel>
- <bezel name="11.30" element="led"><bounds x="22" y="60" width="1" height="1" /></bezel>
- <bezel name="11.31" element="led"><bounds x="22" y="62" width="1" height="1" /></bezel>
-
- <bezel name="12.0" element="led"><bounds x="24" y="0" width="1" height="1" /></bezel>
- <bezel name="12.1" element="led"><bounds x="24" y="2" width="1" height="1" /></bezel>
- <bezel name="12.2" element="led"><bounds x="24" y="4" width="1" height="1" /></bezel>
- <bezel name="12.3" element="led"><bounds x="24" y="6" width="1" height="1" /></bezel>
- <bezel name="12.4" element="led"><bounds x="24" y="8" width="1" height="1" /></bezel>
- <bezel name="12.5" element="led"><bounds x="24" y="10" width="1" height="1" /></bezel>
- <bezel name="12.6" element="led"><bounds x="24" y="12" width="1" height="1" /></bezel>
- <bezel name="12.7" element="led"><bounds x="24" y="14" width="1" height="1" /></bezel>
- <bezel name="12.8" element="led"><bounds x="24" y="16" width="1" height="1" /></bezel>
- <bezel name="12.9" element="led"><bounds x="24" y="18" width="1" height="1" /></bezel>
- <bezel name="12.10" element="led"><bounds x="24" y="20" width="1" height="1" /></bezel>
- <bezel name="12.11" element="led"><bounds x="24" y="22" width="1" height="1" /></bezel>
- <bezel name="12.12" element="led"><bounds x="24" y="24" width="1" height="1" /></bezel>
- <bezel name="12.13" element="led"><bounds x="24" y="26" width="1" height="1" /></bezel>
- <bezel name="12.14" element="led"><bounds x="24" y="28" width="1" height="1" /></bezel>
- <bezel name="12.15" element="led"><bounds x="24" y="30" width="1" height="1" /></bezel>
- <bezel name="12.16" element="led"><bounds x="24" y="32" width="1" height="1" /></bezel>
- <bezel name="12.17" element="led"><bounds x="24" y="34" width="1" height="1" /></bezel>
- <bezel name="12.18" element="led"><bounds x="24" y="36" width="1" height="1" /></bezel>
- <bezel name="12.19" element="led"><bounds x="24" y="38" width="1" height="1" /></bezel>
- <bezel name="12.20" element="led"><bounds x="24" y="40" width="1" height="1" /></bezel>
- <bezel name="12.21" element="led"><bounds x="24" y="42" width="1" height="1" /></bezel>
- <bezel name="12.22" element="led"><bounds x="24" y="44" width="1" height="1" /></bezel>
- <bezel name="12.23" element="led"><bounds x="24" y="46" width="1" height="1" /></bezel>
- <bezel name="12.24" element="led"><bounds x="24" y="48" width="1" height="1" /></bezel>
- <bezel name="12.25" element="led"><bounds x="24" y="50" width="1" height="1" /></bezel>
- <bezel name="12.26" element="led"><bounds x="24" y="52" width="1" height="1" /></bezel>
- <bezel name="12.27" element="led"><bounds x="24" y="54" width="1" height="1" /></bezel>
- <bezel name="12.28" element="led"><bounds x="24" y="56" width="1" height="1" /></bezel>
- <bezel name="12.29" element="led"><bounds x="24" y="58" width="1" height="1" /></bezel>
- <bezel name="12.30" element="led"><bounds x="24" y="60" width="1" height="1" /></bezel>
- <bezel name="12.31" element="led"><bounds x="24" y="62" width="1" height="1" /></bezel>
-
- <bezel name="13.0" element="led"><bounds x="26" y="0" width="1" height="1" /></bezel>
- <bezel name="13.1" element="led"><bounds x="26" y="2" width="1" height="1" /></bezel>
- <bezel name="13.2" element="led"><bounds x="26" y="4" width="1" height="1" /></bezel>
- <bezel name="13.3" element="led"><bounds x="26" y="6" width="1" height="1" /></bezel>
- <bezel name="13.4" element="led"><bounds x="26" y="8" width="1" height="1" /></bezel>
- <bezel name="13.5" element="led"><bounds x="26" y="10" width="1" height="1" /></bezel>
- <bezel name="13.6" element="led"><bounds x="26" y="12" width="1" height="1" /></bezel>
- <bezel name="13.7" element="led"><bounds x="26" y="14" width="1" height="1" /></bezel>
- <bezel name="13.8" element="led"><bounds x="26" y="16" width="1" height="1" /></bezel>
- <bezel name="13.9" element="led"><bounds x="26" y="18" width="1" height="1" /></bezel>
- <bezel name="13.10" element="led"><bounds x="26" y="20" width="1" height="1" /></bezel>
- <bezel name="13.11" element="led"><bounds x="26" y="22" width="1" height="1" /></bezel>
- <bezel name="13.12" element="led"><bounds x="26" y="24" width="1" height="1" /></bezel>
- <bezel name="13.13" element="led"><bounds x="26" y="26" width="1" height="1" /></bezel>
- <bezel name="13.14" element="led"><bounds x="26" y="28" width="1" height="1" /></bezel>
- <bezel name="13.15" element="led"><bounds x="26" y="30" width="1" height="1" /></bezel>
- <bezel name="13.16" element="led"><bounds x="26" y="32" width="1" height="1" /></bezel>
- <bezel name="13.17" element="led"><bounds x="26" y="34" width="1" height="1" /></bezel>
- <bezel name="13.18" element="led"><bounds x="26" y="36" width="1" height="1" /></bezel>
- <bezel name="13.19" element="led"><bounds x="26" y="38" width="1" height="1" /></bezel>
- <bezel name="13.20" element="led"><bounds x="26" y="40" width="1" height="1" /></bezel>
- <bezel name="13.21" element="led"><bounds x="26" y="42" width="1" height="1" /></bezel>
- <bezel name="13.22" element="led"><bounds x="26" y="44" width="1" height="1" /></bezel>
- <bezel name="13.23" element="led"><bounds x="26" y="46" width="1" height="1" /></bezel>
- <bezel name="13.24" element="led"><bounds x="26" y="48" width="1" height="1" /></bezel>
- <bezel name="13.25" element="led"><bounds x="26" y="50" width="1" height="1" /></bezel>
- <bezel name="13.26" element="led"><bounds x="26" y="52" width="1" height="1" /></bezel>
- <bezel name="13.27" element="led"><bounds x="26" y="54" width="1" height="1" /></bezel>
- <bezel name="13.28" element="led"><bounds x="26" y="56" width="1" height="1" /></bezel>
- <bezel name="13.29" element="led"><bounds x="26" y="58" width="1" height="1" /></bezel>
- <bezel name="13.30" element="led"><bounds x="26" y="60" width="1" height="1" /></bezel>
- <bezel name="13.31" element="led"><bounds x="26" y="62" width="1" height="1" /></bezel>
-
- <bezel name="14.0" element="led"><bounds x="28" y="0" width="1" height="1" /></bezel>
- <bezel name="14.1" element="led"><bounds x="28" y="2" width="1" height="1" /></bezel>
- <bezel name="14.2" element="led"><bounds x="28" y="4" width="1" height="1" /></bezel>
- <bezel name="14.3" element="led"><bounds x="28" y="6" width="1" height="1" /></bezel>
- <bezel name="14.4" element="led"><bounds x="28" y="8" width="1" height="1" /></bezel>
- <bezel name="14.5" element="led"><bounds x="28" y="10" width="1" height="1" /></bezel>
- <bezel name="14.6" element="led"><bounds x="28" y="12" width="1" height="1" /></bezel>
- <bezel name="14.7" element="led"><bounds x="28" y="14" width="1" height="1" /></bezel>
- <bezel name="14.8" element="led"><bounds x="28" y="16" width="1" height="1" /></bezel>
- <bezel name="14.9" element="led"><bounds x="28" y="18" width="1" height="1" /></bezel>
- <bezel name="14.10" element="led"><bounds x="28" y="20" width="1" height="1" /></bezel>
- <bezel name="14.11" element="led"><bounds x="28" y="22" width="1" height="1" /></bezel>
- <bezel name="14.12" element="led"><bounds x="28" y="24" width="1" height="1" /></bezel>
- <bezel name="14.13" element="led"><bounds x="28" y="26" width="1" height="1" /></bezel>
- <bezel name="14.14" element="led"><bounds x="28" y="28" width="1" height="1" /></bezel>
- <bezel name="14.15" element="led"><bounds x="28" y="30" width="1" height="1" /></bezel>
- <bezel name="14.16" element="led"><bounds x="28" y="32" width="1" height="1" /></bezel>
- <bezel name="14.17" element="led"><bounds x="28" y="34" width="1" height="1" /></bezel>
- <bezel name="14.18" element="led"><bounds x="28" y="36" width="1" height="1" /></bezel>
- <bezel name="14.19" element="led"><bounds x="28" y="38" width="1" height="1" /></bezel>
- <bezel name="14.20" element="led"><bounds x="28" y="40" width="1" height="1" /></bezel>
- <bezel name="14.21" element="led"><bounds x="28" y="42" width="1" height="1" /></bezel>
- <bezel name="14.22" element="led"><bounds x="28" y="44" width="1" height="1" /></bezel>
- <bezel name="14.23" element="led"><bounds x="28" y="46" width="1" height="1" /></bezel>
- <bezel name="14.24" element="led"><bounds x="28" y="48" width="1" height="1" /></bezel>
- <bezel name="14.25" element="led"><bounds x="28" y="50" width="1" height="1" /></bezel>
- <bezel name="14.26" element="led"><bounds x="28" y="52" width="1" height="1" /></bezel>
- <bezel name="14.27" element="led"><bounds x="28" y="54" width="1" height="1" /></bezel>
- <bezel name="14.28" element="led"><bounds x="28" y="56" width="1" height="1" /></bezel>
- <bezel name="14.29" element="led"><bounds x="28" y="58" width="1" height="1" /></bezel>
- <bezel name="14.30" element="led"><bounds x="28" y="60" width="1" height="1" /></bezel>
- <bezel name="14.31" element="led"><bounds x="28" y="62" width="1" height="1" /></bezel>
-
- <bezel name="15.0" element="led"><bounds x="30" y="0" width="1" height="1" /></bezel>
- <bezel name="15.1" element="led"><bounds x="30" y="2" width="1" height="1" /></bezel>
- <bezel name="15.2" element="led"><bounds x="30" y="4" width="1" height="1" /></bezel>
- <bezel name="15.3" element="led"><bounds x="30" y="6" width="1" height="1" /></bezel>
- <bezel name="15.4" element="led"><bounds x="30" y="8" width="1" height="1" /></bezel>
- <bezel name="15.5" element="led"><bounds x="30" y="10" width="1" height="1" /></bezel>
- <bezel name="15.6" element="led"><bounds x="30" y="12" width="1" height="1" /></bezel>
- <bezel name="15.7" element="led"><bounds x="30" y="14" width="1" height="1" /></bezel>
- <bezel name="15.8" element="led"><bounds x="30" y="16" width="1" height="1" /></bezel>
- <bezel name="15.9" element="led"><bounds x="30" y="18" width="1" height="1" /></bezel>
- <bezel name="15.10" element="led"><bounds x="30" y="20" width="1" height="1" /></bezel>
- <bezel name="15.11" element="led"><bounds x="30" y="22" width="1" height="1" /></bezel>
- <bezel name="15.12" element="led"><bounds x="30" y="24" width="1" height="1" /></bezel>
- <bezel name="15.13" element="led"><bounds x="30" y="26" width="1" height="1" /></bezel>
- <bezel name="15.14" element="led"><bounds x="30" y="28" width="1" height="1" /></bezel>
- <bezel name="15.15" element="led"><bounds x="30" y="30" width="1" height="1" /></bezel>
- <bezel name="15.16" element="led"><bounds x="30" y="32" width="1" height="1" /></bezel>
- <bezel name="15.17" element="led"><bounds x="30" y="34" width="1" height="1" /></bezel>
- <bezel name="15.18" element="led"><bounds x="30" y="36" width="1" height="1" /></bezel>
- <bezel name="15.19" element="led"><bounds x="30" y="38" width="1" height="1" /></bezel>
- <bezel name="15.20" element="led"><bounds x="30" y="40" width="1" height="1" /></bezel>
- <bezel name="15.21" element="led"><bounds x="30" y="42" width="1" height="1" /></bezel>
- <bezel name="15.22" element="led"><bounds x="30" y="44" width="1" height="1" /></bezel>
- <bezel name="15.23" element="led"><bounds x="30" y="46" width="1" height="1" /></bezel>
- <bezel name="15.24" element="led"><bounds x="30" y="48" width="1" height="1" /></bezel>
- <bezel name="15.25" element="led"><bounds x="30" y="50" width="1" height="1" /></bezel>
- <bezel name="15.26" element="led"><bounds x="30" y="52" width="1" height="1" /></bezel>
- <bezel name="15.27" element="led"><bounds x="30" y="54" width="1" height="1" /></bezel>
- <bezel name="15.28" element="led"><bounds x="30" y="56" width="1" height="1" /></bezel>
- <bezel name="15.29" element="led"><bounds x="30" y="58" width="1" height="1" /></bezel>
- <bezel name="15.30" element="led"><bounds x="30" y="60" width="1" height="1" /></bezel>
- <bezel name="15.31" element="led"><bounds x="30" y="62" width="1" height="1" /></bezel>
+ <repeat count="32">
+ <param name="x" start="0" increment="1" />
+ <bezel name="~y~.~x~" element="led"><bounds x="~x~" y="~y~" width="0.5" height="0.5" /></bezel>
+ </repeat>
+ </repeat>
</view>
</mamelayout>
diff --git a/src/mame/layout/intellect02.lay b/src/mame/layout/intellect02.lay
new file mode 100644
index 00000000000..da413b27e97
--- /dev/null
+++ b/src/mame/layout/intellect02.lay
@@ -0,0 +1,106 @@
+<?xml version="1.0"?>
+<mamelayout version="2">
+
+<!-- define elements -->
+
+ <element name="static_black"><rect><color red="0.0" green="0.0" blue="0.0" /></rect></element>
+ <element name="static_black2"><rect><color red="0.15" green="0.15" blue="0.15" /></rect></element>
+
+ <element name="button" defstate="0">
+ <rect state="0"><color red="0.3" green="0.3" blue="0.3" /></rect>
+ <rect state="1"><color red="0.45" green="0.45" blue="0.45" /></rect>
+ </element>
+
+ <element name="digit" defstate="0">
+ <led7seg><color red="0.15" green="1.0" blue="0.05" /></led7seg>
+ </element>
+
+ <element name="led" defstate="0">
+ <disk state="1"><color red="1.0" green="0.1" blue="0.15" /></disk>
+ <disk state="0"><color red="0.1" green="0.01" blue="0.015" /></disk>
+ </element>
+
+ <element name="text_l1"><text string="PROGRESS INDICATOR" align="1"><color red="0.2" green="0.2" blue="0.2" /></text></element>
+ <element name="text_l2"><text string="YOU WIN" align="1"><color red="0.8" green="0.8" blue="0.8" /></text></element>
+ <element name="text_l3"><text string="YOU LOSE" align="1"><color red="0.8" green="0.8" blue="0.8" /></text></element>
+
+ <element name="text_b1"><text string="RESET"><color red="0.8" green="0.8" blue="0.8" /></text></element>
+ <element name="text_b2"><text string="SELECT"><color red="0.8" green="0.8" blue="0.8" /></text></element>
+ <element name="text_b3"><text string="POS."><color red="0.8" green="0.8" blue="0.8" /></text></element>
+ <element name="text_b4"><text string="A1"><color red="0.8" green="0.8" blue="0.8" /></text></element>
+ <element name="text_b5"><text string="B2"><color red="0.8" green="0.8" blue="0.8" /></text></element>
+ <element name="text_b6"><text string="C3"><color red="0.8" green="0.8" blue="0.8" /></text></element>
+ <element name="text_b7"><text string="D4"><color red="0.8" green="0.8" blue="0.8" /></text></element>
+ <element name="text_b8"><text string="E5"><color red="0.8" green="0.8" blue="0.8" /></text></element>
+ <element name="text_b9"><text string="INPUT"><color red="0.8" green="0.8" blue="0.8" /></text></element>
+ <element name="text_b10"><text string="ERASE"><color red="0.8" green="0.8" blue="0.8" /></text></element>
+ <element name="text_b11"><text string="LEVEL"><color red="0.8" green="0.8" blue="0.8" /></text></element>
+ <element name="text_b12"><text string="F6"><color red="0.8" green="0.8" blue="0.8" /></text></element>
+ <element name="text_b13"><text string="G7"><color red="0.8" green="0.8" blue="0.8" /></text></element>
+ <element name="text_b14"><text string="H8"><color red="0.8" green="0.8" blue="0.8" /></text></element>
+ <element name="text_b15"><text string="9"><color red="0.8" green="0.8" blue="0.8" /></text></element>
+ <element name="text_b16"><text string="0"><color red="0.8" green="0.8" blue="0.8" /></text></element>
+
+
+<!-- build screen -->
+
+ <view name="Internal Layout">
+ <bounds left="7.5" right="43" top="7" bottom="30.2" />
+
+ <!-- display -->
+
+ <bezel element="static_black2"><bounds x="8.5" y="8" width="33.5" height="11.5" /></bezel>
+ <bezel element="static_black"><bounds x="8.1" y="7.6" width="33.5" height="11.5" /></bezel>
+
+ <bezel element="text_l1"><bounds x="21" y="7.9" width="20" height="1.5" /></bezel>
+ <bezel element="text_l2"><bounds x="8.5" y="7.9" width="8" height="1.5" /></bezel>
+ <bezel element="text_l3"><bounds x="8.5" y="16.4" width="8" height="1.5" /></bezel>
+
+ <bezel name="led1" element="led"><bounds x="16" y="8" width="1.5" height="1.5" /></bezel>
+ <bezel name="led0" element="led"><bounds x="16" y="16.5" width="1.5" height="1.5" /></bezel>
+
+ <bezel name="digit0" element="digit"><bounds x="20" y="10" width="4" height="6" /></bezel>
+ <bezel name="digit1" element="digit"><bounds x="24" y="10" width="4" height="6" /></bezel>
+ <bezel name="digit2" element="digit"><bounds x="32" y="10" width="4" height="6" /></bezel>
+ <bezel name="digit3" element="digit"><bounds x="36" y="10" width="4" height="6" /></bezel>
+
+ <!-- buttons -->
+
+ <bezel element="text_b1"><bounds x="7.5" y="20.7" width="5" height="1.2" /></bezel>
+ <bezel element="text_b2"><bounds x="11.86" y="20.7" width="5" height="1.2" /></bezel>
+ <bezel element="text_b3"><bounds x="16.21" y="20.7" width="5" height="1.2" /></bezel>
+ <bezel element="text_b4"><bounds x="20.57" y="20.7" width="5" height="1.2" /></bezel>
+ <bezel element="text_b5"><bounds x="24.93" y="20.7" width="5" height="1.2" /></bezel>
+ <bezel element="text_b6"><bounds x="29.27" y="20.7" width="5" height="1.2" /></bezel>
+ <bezel element="text_b7"><bounds x="33.64" y="20.7" width="5" height="1.2" /></bezel>
+ <bezel element="text_b8"><bounds x="38" y="20.7" width="5" height="1.2" /></bezel>
+
+ <bezel element="text_b9"><bounds x="7.5" y="25.4" width="5" height="1.2" /></bezel>
+ <bezel element="text_b10"><bounds x="11.86" y="25.4" width="5" height="1.2" /></bezel>
+ <bezel element="text_b11"><bounds x="16.21" y="25.4" width="5" height="1.2" /></bezel>
+ <bezel element="text_b12"><bounds x="20.57" y="25.4" width="5" height="1.2" /></bezel>
+ <bezel element="text_b13"><bounds x="24.93" y="25.4" width="5" height="1.2" /></bezel>
+ <bezel element="text_b14"><bounds x="29.27" y="25.4" width="5" height="1.2" /></bezel>
+ <bezel element="text_b15"><bounds x="33.64" y="25.4" width="5" height="1.2" /></bezel>
+ <bezel element="text_b16"><bounds x="38" y="25.4" width="5" height="1.2" /></bezel>
+
+ <bezel element="button" inputtag="RESET" inputmask="0x01"><bounds x="8.5" y="22" width="3" height="2.5" /></bezel>
+ <bezel element="button" inputtag="IN.1" inputmask="0x04"><bounds x="12.86" y="22" width="3" height="2.5" /></bezel>
+ <bezel element="button" inputtag="IN.x" inputmask="0x01"><bounds x="17.21" y="22" width="3" height="2.5" /></bezel>
+ <bezel element="button" inputtag="IN.0" inputmask="0x2000"><bounds x="21.57" y="22" width="3" height="2.5" /></bezel>
+ <bezel element="button" inputtag="IN.0" inputmask="0x1000"><bounds x="25.93" y="22" width="3" height="2.5" /></bezel>
+ <bezel element="button" inputtag="IN.0" inputmask="0x0800"><bounds x="30.27" y="22" width="3" height="2.5" /></bezel>
+ <bezel element="button" inputtag="IN.0" inputmask="0x0400"><bounds x="34.64" y="22" width="3" height="2.5" /></bezel>
+ <bezel element="button" inputtag="IN.0" inputmask="0x0200"><bounds x="39" y="22" width="3" height="2.5" /></bezel>
+
+ <bezel element="button" inputtag="IN.1" inputmask="0x02"><bounds x="8.5" y="26.7" width="3" height="2.5" /></bezel>
+ <bezel element="button" inputtag="IN.1" inputmask="0x08"><bounds x="12.86" y="26.7" width="3" height="2.5" /></bezel>
+ <bezel element="button" inputtag="IN.x" inputmask="0x01"><bounds x="17.21" y="26.7" width="3" height="2.5" /></bezel>
+ <bezel element="button" inputtag="IN.0" inputmask="0x0100"><bounds x="21.57" y="26.7" width="3" height="2.5" /></bezel>
+ <bezel element="button" inputtag="IN.0" inputmask="0x0080"><bounds x="25.93" y="26.7" width="3" height="2.5" /></bezel>
+ <bezel element="button" inputtag="IN.0" inputmask="0x0040"><bounds x="30.27" y="26.7" width="3" height="2.5" /></bezel>
+ <bezel element="button" inputtag="IN.x" inputmask="0x01"><bounds x="34.64" y="26.7" width="3" height="2.5" /></bezel>
+ <bezel element="button" inputtag="IN.x" inputmask="0x01"><bounds x="39" y="26.7" width="3" height="2.5" /></bezel>
+
+ </view>
+</mamelayout>
diff --git a/src/mame/layout/k28.lay b/src/mame/layout/k28.lay
index 60898d8fde0..dd314e6f11e 100644
--- a/src/mame/layout/k28.lay
+++ b/src/mame/layout/k28.lay
@@ -27,41 +27,41 @@
<!-- 9 digits -->
- <bezel name="digit8" element="digit"><bounds x="0" y="0" width="10" height="15" /></bezel>
- <bezel name="8.14" element="lamp_dp"><bounds x="-1.5" y="11" width="1.5" height="1.5" /></bezel>
- <bezel name="8.15" element="lamp_ct"><bounds x="-0.8" y="13.5" width="0.75" height="1.5" /></bezel>
+ <bezel name="digit0" element="digit"><bounds x="0" y="0" width="10" height="15" /></bezel>
+ <bezel name="0.14" element="lamp_dp"><bounds x="-1.5" y="11" width="1.5" height="1.5" /></bezel>
+ <bezel name="0.15" element="lamp_ct"><bounds x="-0.8" y="13.5" width="0.75" height="1.5" /></bezel>
- <bezel name="digit7" element="digit"><bounds x="11" y="0" width="10" height="15" /></bezel>
- <bezel name="7.14" element="lamp_dp"><bounds x="9.5" y="11" width="1.5" height="1.5" /></bezel>
- <bezel name="7.15" element="lamp_ct"><bounds x="10.2" y="13.5" width="0.75" height="1.5" /></bezel>
+ <bezel name="digit1" element="digit"><bounds x="11" y="0" width="10" height="15" /></bezel>
+ <bezel name="1.14" element="lamp_dp"><bounds x="9.5" y="11" width="1.5" height="1.5" /></bezel>
+ <bezel name="1.15" element="lamp_ct"><bounds x="10.2" y="13.5" width="0.75" height="1.5" /></bezel>
- <bezel name="digit6" element="digit"><bounds x="22" y="0" width="10" height="15" /></bezel>
- <bezel name="6.14" element="lamp_dp"><bounds x="20.5" y="11" width="1.5" height="1.5" /></bezel>
- <bezel name="6.15" element="lamp_ct"><bounds x="21.2" y="13.5" width="0.75" height="1.5" /></bezel>
+ <bezel name="digit2" element="digit"><bounds x="22" y="0" width="10" height="15" /></bezel>
+ <bezel name="2.14" element="lamp_dp"><bounds x="20.5" y="11" width="1.5" height="1.5" /></bezel>
+ <bezel name="2.15" element="lamp_ct"><bounds x="21.2" y="13.5" width="0.75" height="1.5" /></bezel>
- <bezel name="digit5" element="digit"><bounds x="33" y="0" width="10" height="15" /></bezel>
- <bezel name="5.14" element="lamp_dp"><bounds x="31.5" y="11" width="1.5" height="1.5" /></bezel>
- <bezel name="5.15" element="lamp_ct"><bounds x="32.2" y="13.5" width="0.75" height="1.5" /></bezel>
+ <bezel name="digit3" element="digit"><bounds x="33" y="0" width="10" height="15" /></bezel>
+ <bezel name="3.14" element="lamp_dp"><bounds x="31.5" y="11" width="1.5" height="1.5" /></bezel>
+ <bezel name="3.15" element="lamp_ct"><bounds x="32.2" y="13.5" width="0.75" height="1.5" /></bezel>
<bezel name="digit4" element="digit"><bounds x="44" y="0" width="10" height="15" /></bezel>
<bezel name="4.14" element="lamp_dp"><bounds x="42.5" y="11" width="1.5" height="1.5" /></bezel>
<bezel name="4.15" element="lamp_ct"><bounds x="43.2" y="13.5" width="0.75" height="1.5" /></bezel>
- <bezel name="digit3" element="digit"><bounds x="55" y="0" width="10" height="15" /></bezel>
- <bezel name="3.14" element="lamp_dp"><bounds x="53.5" y="11" width="1.5" height="1.5" /></bezel>
- <bezel name="3.15" element="lamp_ct"><bounds x="54.2" y="13.5" width="0.75" height="1.5" /></bezel>
+ <bezel name="digit5" element="digit"><bounds x="55" y="0" width="10" height="15" /></bezel>
+ <bezel name="5.14" element="lamp_dp"><bounds x="53.5" y="11" width="1.5" height="1.5" /></bezel>
+ <bezel name="5.15" element="lamp_ct"><bounds x="54.2" y="13.5" width="0.75" height="1.5" /></bezel>
- <bezel name="digit2" element="digit"><bounds x="66" y="0" width="10" height="15" /></bezel>
- <bezel name="2.14" element="lamp_dp"><bounds x="64.5" y="11" width="1.5" height="1.5" /></bezel>
- <bezel name="2.15" element="lamp_ct"><bounds x="65.2" y="13.5" width="0.75" height="1.5" /></bezel>
+ <bezel name="digit6" element="digit"><bounds x="66" y="0" width="10" height="15" /></bezel>
+ <bezel name="6.14" element="lamp_dp"><bounds x="64.5" y="11" width="1.5" height="1.5" /></bezel>
+ <bezel name="6.15" element="lamp_ct"><bounds x="65.2" y="13.5" width="0.75" height="1.5" /></bezel>
- <bezel name="digit1" element="digit"><bounds x="77" y="0" width="10" height="15" /></bezel>
- <bezel name="1.14" element="lamp_dp"><bounds x="75.5" y="11" width="1.5" height="1.5" /></bezel>
- <bezel name="1.15" element="lamp_ct"><bounds x="76.2" y="13.5" width="0.75" height="1.5" /></bezel>
+ <bezel name="digit7" element="digit"><bounds x="77" y="0" width="10" height="15" /></bezel>
+ <bezel name="7.14" element="lamp_dp"><bounds x="75.5" y="11" width="1.5" height="1.5" /></bezel>
+ <bezel name="7.15" element="lamp_ct"><bounds x="76.2" y="13.5" width="0.75" height="1.5" /></bezel>
- <bezel name="digit0" element="digit"><bounds x="88" y="0" width="10" height="15" /></bezel>
- <bezel name="0.14" element="lamp_dp"><bounds x="86.5" y="11" width="1.5" height="1.5" /></bezel>
- <bezel name="0.15" element="lamp_ct"><bounds x="87.2" y="13.5" width="0.75" height="1.5" /></bezel>
+ <bezel name="digit8" element="digit"><bounds x="88" y="0" width="10" height="15" /></bezel>
+ <bezel name="8.14" element="lamp_dp"><bounds x="86.5" y="11" width="1.5" height="1.5" /></bezel>
+ <bezel name="8.15" element="lamp_ct"><bounds x="87.2" y="13.5" width="0.75" height="1.5" /></bezel>
</view>
</mamelayout>
diff --git a/src/mame/layout/matchme.lay b/src/mame/layout/matchme.lay
index e420abefe7e..b36d624e647 100644
--- a/src/mame/layout/matchme.lay
+++ b/src/mame/layout/matchme.lay
@@ -29,50 +29,103 @@
</disk>
</element>
+ <element name="switch_music" defstate="0">
+ <rect><color red="0.6" green="0.6" blue="0.6" /></rect>
+ <text state="0x01" string="MAN" align="1"><color red="0.02" green="0.02" blue="0.02" /></text>
+ <text state="0x00" string="AUTO" align="1"><color red="0.02" green="0.02" blue="0.02" /></text>
+ </element>
+ <element name="switch_speed" defstate="0">
+ <rect><color red="0.6" green="0.6" blue="0.6" /></rect>
+ <text state="0x00" string="LO" align="1"><color red="0.02" green="0.02" blue="0.02" /></text>
+ <text state="0x01" string="HI" align="1"><color red="0.02" green="0.02" blue="0.02" /></text>
+ </element>
+ <element name="switch_skill" defstate="0">
+ <rect><color red="0.6" green="0.6" blue="0.6" /></rect>
+ <text state="0x01" string="AM" align="1"><color red="0.02" green="0.02" blue="0.02" /></text>
+ <text state="0x00" string="PRO" align="1"><color red="0.02" green="0.02" blue="0.02" /></text>
+ </element>
+ <element name="switch_game" defstate="0">
+ <rect><color red="0.6" green="0.6" blue="0.6" /></rect>
+ <text state="0x07" string="1" align="1"><color red="0.02" green="0.02" blue="0.02" /></text>
+ <text state="0x06" string="2" align="1"><color red="0.02" green="0.02" blue="0.02" /></text>
+ <text state="0x05" string="3" align="1"><color red="0.02" green="0.02" blue="0.02" /></text>
+ <text state="0x03" string="4" align="1"><color red="0.02" green="0.02" blue="0.02" /></text>
+ </element>
+
+ <element name="text_yb">
+ <disk><color red="0.0" green="0.0" blue="0.0" /></disk>
+ <text string="&#x25ba;">
+ <color red="0.8" green="0.77" blue="0.1" />
+ </text>
+ </element>
+ <element name="text_ob">
+ <disk><color red="0.0" green="0.0" blue="0.0" /></disk>
+ <text string="&#x25ba;">
+ <color red="0.8" green="0.5" blue="0.1" />
+ </text>
+ </element>
+
+ <element name="text_music">
+ <rect><color red="0.6" green="0.6" blue="0.6" /></rect>
+ <text string="MUSIC:" align="1"><color red="0.02" green="0.02" blue="0.02" /></text>
+ </element>
+ <element name="text_speed">
+ <rect><color red="0.6" green="0.6" blue="0.6" /></rect>
+ <text string="SPEED:" align="1"><color red="0.02" green="0.02" blue="0.02" /></text>
+ </element>
+ <element name="text_skill">
+ <rect><color red="0.6" green="0.6" blue="0.6" /></rect>
+ <text string="SKILL:" align="1"><color red="0.02" green="0.02" blue="0.02" /></text>
+ </element>
+ <element name="text_game">
+ <rect><color red="0.6" green="0.6" blue="0.6" /></rect>
+ <text string="GAME:" align="1"><color red="0.02" green="0.02" blue="0.02" /></text>
+ </element>
+
<element name="text_last">
<rect><color red="0.6" green="0.6" blue="0.6" /></rect>
- <text string="LAST"><color red="0.1" green="0.1" blue="0.1" /></text>
+ <text string="LAST"><color red="0.02" green="0.02" blue="0.02" /></text>
</element>
<element name="text_start">
<rect><color red="0.6" green="0.6" blue="0.6" /></rect>
- <text string="START"><color red="0.1" green="0.1" blue="0.1" /></text>
+ <text string="START"><color red="0.02" green="0.02" blue="0.02" /></text>
</element>
<element name="text_long">
<rect><color red="0.6" green="0.6" blue="0.6" /></rect>
- <text string="LONG"><color red="0.1" green="0.1" blue="0.1" /></text>
+ <text string="LONG"><color red="0.02" green="0.02" blue="0.02" /></text>
</element>
<element name="text_1">
<disk><color red="0.6" green="0.6" blue="0.6" /></disk>
- <text string="1"><color red="0.01" green="0.01" blue="0.01" /></text>
+ <text string="1"><color red="0.02" green="0.02" blue="0.02" /></text>
</element>
<element name="text_2">
<disk><color red="0.6" green="0.6" blue="0.6" /></disk>
- <text string="2"><color red="0.01" green="0.01" blue="0.01" /></text>
+ <text string="2"><color red="0.02" green="0.02" blue="0.02" /></text>
</element>
<element name="text_3">
<disk><color red="0.6" green="0.6" blue="0.6" /></disk>
- <text string="3"><color red="0.01" green="0.01" blue="0.01" /></text>
+ <text string="3"><color red="0.02" green="0.02" blue="0.02" /></text>
</element>
<element name="text_4">
<disk><color red="0.6" green="0.6" blue="0.6" /></disk>
- <text string="4"><color red="0.01" green="0.01" blue="0.01" /></text>
+ <text string="4"><color red="0.02" green="0.02" blue="0.02" /></text>
</element>
<element name="text_5">
<disk><color red="0.6" green="0.6" blue="0.6" /></disk>
- <text string="5"><color red="0.01" green="0.01" blue="0.01" /></text>
+ <text string="5"><color red="0.02" green="0.02" blue="0.02" /></text>
</element>
<element name="text_6">
<disk><color red="0.6" green="0.6" blue="0.6" /></disk>
- <text string="6"><color red="0.01" green="0.01" blue="0.01" /></text>
+ <text string="6"><color red="0.02" green="0.02" blue="0.02" /></text>
</element>
<element name="text_7">
<disk><color red="0.6" green="0.6" blue="0.6" /></disk>
- <text string="7"><color red="0.01" green="0.01" blue="0.01" /></text>
+ <text string="7"><color red="0.02" green="0.02" blue="0.02" /></text>
</element>
<element name="text_8">
<disk><color red="0.6" green="0.6" blue="0.6" /></disk>
- <text string="8"><color red="0.01" green="0.01" blue="0.01" /></text>
+ <text string="8"><color red="0.02" green="0.02" blue="0.02" /></text>
</element>
@@ -94,6 +147,26 @@
<bezel element="text_7"><bounds x="12.3369" y="10.8215" width="0.5" height="0.5" /></bezel>
<bezel element="text_8"><bounds x="10.8215" y="12.3369" width="0.5" height="0.5" /></bezel>
+ <bezel element="text_music"><bounds x="9" y="8.8" width="2" height="0.29" /></bezel>
+ <bezel element="text_speed"><bounds x="9" y="9.2" width="2" height="0.29" /></bezel>
+ <bezel element="text_skill"><bounds x="9" y="9.6" width="2" height="0.29" /></bezel>
+ <bezel element="text_game"><bounds x="9" y="10.0" width="2" height="0.29" /></bezel>
+
+ <bezel element="text_yb"><bounds x="9.825" y="8.77" width="0.35" height="0.35" /></bezel>
+ <bezel element="text_yb"><bounds x="9.825" y="9.17" width="0.35" height="0.35" /></bezel>
+ <bezel element="text_ob"><bounds x="9.825" y="9.57" width="0.35" height="0.35" /></bezel>
+ <bezel element="text_ob"><bounds x="9.825" y="9.97" width="0.35" height="0.35" /></bezel>
+ <bezel element="dummy" inputtag="FAKE" inputmask="0x02" inputraw="1"><bounds x="9.805" y="8.75" width="0.39" height="0.39" /></bezel>
+ <bezel element="dummy" inputtag="IN.4" inputmask="0x01" inputraw="1"><bounds x="9.805" y="9.15" width="0.39" height="0.39" /></bezel>
+ <bezel element="dummy" inputtag="IN.3" inputmask="0x08" inputraw="1"><bounds x="9.805" y="9.55" width="0.39" height="0.39" /></bezel>
+ <bezel element="dummy" inputtag="IN.3" inputmask="0x07" inputraw="1"><bounds x="9.805" y="9.95" width="0.39" height="0.39" /></bezel>
+
+ <bezel element="dummy" inputtag="DUMMY" inputmask="0x01"><bounds x="10.2" y="8.7" width="1.1" height="1.8" /></bezel>
+ <bezel element="switch_music" inputtag="FAKE" inputmask="0x02" inputraw="1"><bounds x="10.25" y="8.8" width="1" height="0.29" /></bezel>
+ <bezel element="switch_speed" inputtag="IN.4" inputmask="0x01" inputraw="1"><bounds x="10.25" y="9.2" width="1" height="0.29" /></bezel>
+ <bezel element="switch_skill" inputtag="IN.3" inputmask="0x08" inputraw="1"><bounds x="10.25" y="9.6" width="1" height="0.29" /></bezel>
+ <bezel element="switch_game" inputtag="IN.3" inputmask="0x07" inputraw="1"><bounds x="10.25" y="10.0" width="1" height="0.29" /></bezel>
+
<bezel element="button" inputtag="FAKE" inputmask="0x01"><bounds x="8.0" y="11" width="0.5" height="0.5" /></bezel>
<bezel element="button" inputtag="IN.2" inputmask="0x01"><bounds x="9.75" y="11.9" width="0.5" height="0.5" /></bezel>
<bezel element="button" inputtag="IN.2" inputmask="0x04"><bounds x="11.5" y="11" width="0.5" height="0.5" /></bezel>
@@ -122,14 +195,14 @@
<bezel element="dummy" inputtag="IN.1" inputmask="0x04"><bounds x="13.3694" y="10.6634" width="2.5" height="2.5" /></bezel>
<bezel element="dummy" inputtag="IN.1" inputmask="0x08"><bounds x="10.6634" y="13.3694" width="2.5" height="2.5" /></bezel>
- <bezel name="0.0" element="mask"><bounds x="6.8366" y="13.3694" width="2.5" height="2.5" /><color alpha="0.4" /></bezel>
- <bezel name="0.1" element="mask"><bounds x="4.1306" y="10.6634" width="2.5" height="2.5" /><color alpha="0.4" /></bezel>
- <bezel name="0.2" element="mask"><bounds x="4.1306" y="6.8366" width="2.5" height="2.5" /><color alpha="0.4" /></bezel>
- <bezel name="0.3" element="mask"><bounds x="6.8366" y="4.1306" width="2.5" height="2.5" /><color alpha="0.4" /></bezel>
- <bezel name="0.4" element="mask"><bounds x="10.6634" y="4.1306" width="2.5" height="2.5" /><color alpha="0.4" /></bezel>
- <bezel name="0.5" element="mask"><bounds x="13.3694" y="6.8366" width="2.5" height="2.5" /><color alpha="0.4" /></bezel>
- <bezel name="0.6" element="mask"><bounds x="13.3694" y="10.6634" width="2.5" height="2.5" /><color alpha="0.4" /></bezel>
- <bezel name="0.7" element="mask"><bounds x="10.6634" y="13.3694" width="2.5" height="2.5" /><color alpha="0.4" /></bezel>
+ <bezel name="0.0" element="mask"><bounds x="6.8366" y="13.3694" width="2.5" height="2.5" /><color alpha="0.5" /></bezel>
+ <bezel name="0.1" element="mask"><bounds x="4.1306" y="10.6634" width="2.5" height="2.5" /><color alpha="0.5" /></bezel>
+ <bezel name="0.2" element="mask"><bounds x="4.1306" y="6.8366" width="2.5" height="2.5" /><color alpha="0.5" /></bezel>
+ <bezel name="0.3" element="mask"><bounds x="6.8366" y="4.1306" width="2.5" height="2.5" /><color alpha="0.5" /></bezel>
+ <bezel name="0.4" element="mask"><bounds x="10.6634" y="4.1306" width="2.5" height="2.5" /><color alpha="0.5" /></bezel>
+ <bezel name="0.5" element="mask"><bounds x="13.3694" y="6.8366" width="2.5" height="2.5" /><color alpha="0.5" /></bezel>
+ <bezel name="0.6" element="mask"><bounds x="13.3694" y="10.6634" width="2.5" height="2.5" /><color alpha="0.5" /></bezel>
+ <bezel name="0.7" element="mask"><bounds x="10.6634" y="13.3694" width="2.5" height="2.5" /><color alpha="0.5" /></bezel>
</view>
</mamelayout>
diff --git a/src/mame/layout/md6802.lay b/src/mame/layout/md6802.lay
index acfdf1db0e2..14d95bbfdf5 100755..100644
--- a/src/mame/layout/md6802.lay
+++ b/src/mame/layout/md6802.lay
@@ -1,167 +1,380 @@
<?xml version="1.0"?>
+<!--
+license:CC0
+copyright-holders:Joakim Larsson Edstrom
+Didact MD6802 layout
+-->
<mamelayout version="2">
<element name="redled" defstate="0">
- <disk state="1">
- <color red="1.0" green="0.0" blue="0.0" />
- </disk>
+ <disk state="0"><color red="0.2" green="0.0" blue="0.0" /></disk>
+ <disk state="1"><color red="1.0" green="0.0" blue="0.0" /></disk>
</element>
<element name="button" defstate="1">
- <disk state="0">
- <color red="1.0" green="1.0" blue="1.0" />
- </disk>
+ <disk state="0"><color red="1.0" green="1.0" blue="1.0" /></disk>
+ <disk state="1"><color red="0.75" green="0.75" blue="0.75" /></disk>
</element>
<element name="digit" defstate="1">
- <led7seg>
- <color red="0.75" green="0.0" blue="0.0" />
- </led7seg>
+ <led7seg><color red="0.75" green="0.0" blue="0.0" /></led7seg>
</element>
-
- <element name="text_shift"><text string="SHIFT"><color red="0.7" green="0.7" blue="0.7" /></text></element>
- <element name="text_reset"><text string="RESET"><color red="0.7" green="0.7" blue="0.7" /></text></element>
- <element name="text_0"><text string="0 ADR"><color red="0.7" green="0.7" blue="0.7" /></text></element>
- <element name="text_1"><text string="1 STA"><color red="0.7" green="0.7" blue="0.7" /></text></element>
- <element name="text_2"><text string="2 EXF"><color red="0.7" green="0.7" blue="0.7" /></text></element>
- <element name="text_3"><text string="3 CLR"><color red="0.7" green="0.7" blue="0.7" /></text></element>
- <element name="text_4"><text string="4 RUN"><color red="0.7" green="0.7" blue="0.7" /></text></element>
- <element name="text_5"><text string="5 BPS"><color red="0.7" green="0.7" blue="0.7" /></text></element>
- <element name="text_6"><text string="6 EXB"><color red="0.7" green="0.7" blue="0.7" /></text></element>
- <element name="text_7"><text string="7 SP"><color red="0.7" green="0.7" blue="0.7" /></text></element>
- <element name="text_8"><text string="8 SST"><color red="0.7" green="0.7" blue="0.7" /></text></element>
- <element name="text_9"><text string="9 USERV"><color red="0.7" green="0.7" blue="0.7" /></text></element>
- <element name="text_A"><text string="A MOV"><color red="0.7" green="0.7" blue="0.7" /></text></element>
- <element name="text_B"><text string="B USERJ"><color red="0.7" green="0.7" blue="0.7" /></text></element>
- <element name="text_C"><text string="C CON"><color red="0.7" green="0.7" blue="0.7" /></text></element>
- <element name="text_D"><text string="D"><color red="0.7" green="0.7" blue="0.7" /></text></element>
- <element name="text_E"><text string="E LOAD"><color red="0.7" green="0.7" blue="0.7" /></text></element>
- <element name="text_F"><text string="F FLAG"><color red="0.7" green="0.7" blue="0.7" /></text></element>
+ <element name="text_shift"><text string="SHIFT" align="1"><color red="0.7" green="0.7" blue="0.7" /></text></element>
+ <element name="text_reset"><text string="RESET" align="1"><color red="0.7" green="0.7" blue="0.7" /></text></element>
+ <element name="text_0"><text string="0 ADR " align="1"><color red="0.7" green="0.7" blue="0.7" /></text></element>
+ <element name="text_1"><text string="1 STA " align="1"><color red="0.7" green="0.7" blue="0.7" /></text></element>
+ <element name="text_2"><text string="2 EXF " align="1"><color red="0.7" green="0.7" blue="0.7" /></text></element>
+ <element name="text_3"><text string="3 CLR " align="1"><color red="0.7" green="0.7" blue="0.7" /></text></element>
+ <element name="text_4"><text string="4 RUN " align="1"><color red="0.7" green="0.7" blue="0.7" /></text></element>
+ <element name="text_5"><text string="5 BPS " align="1"><color red="0.7" green="0.7" blue="0.7" /></text></element>
+ <element name="text_6"><text string="6 EXB " align="1"><color red="0.7" green="0.7" blue="0.7" /></text></element>
+ <element name="text_7"><text string="7 SP " align="1"><color red="0.7" green="0.7" blue="0.7" /></text></element>
+ <element name="text_8"><text string="8 SST " align="1"><color red="0.7" green="0.7" blue="0.7" /></text></element>
+ <element name="text_9"><text string="9 USERV" align="1"><color red="0.7" green="0.7" blue="0.7" /></text></element>
+ <element name="text_10"><text string="A MOV " align="1"><color red="0.7" green="0.7" blue="0.7" /></text></element>
+ <element name="text_11"><text string="B USERJ" align="1"><color red="0.7" green="0.7" blue="0.7" /></text></element>
+ <element name="text_12"><text string="C CON " align="1"><color red="0.7" green="0.7" blue="0.7" /></text></element>
+ <element name="text_13"><text string="D " align="1"><color red="0.7" green="0.7" blue="0.7" /></text></element>
+ <element name="text_14"><text string="E LOAD " align="1"><color red="0.7" green="0.7" blue="0.7" /></text></element>
+ <element name="text_15"><text string="F FLAG " align="1"><color red="0.7" green="0.7" blue="0.7" /></text></element>
+ <element name="text_md6802_kb"><text string="Mikrodator 6802 (TB) Tangentbord"><color red="0.7" green="0.7" blue="0.7" /></text></element>
+ <element name="text_md6802_cpu"><text string="Mikrodator 6802 (CPU)"><color red="0.7" green="0.7" blue="0.7" /></text></element>
+ <element name="text_122"><text string="SN74LS122N"><color red="0.7" green="0.7" blue="0.7" /></text></element>
+ <element name="text_132"><text string="SN74LS132N"><color red="0.7" green="0.7" blue="0.7" /></text></element>
+ <element name="text_138"><text string="SN74LS138N"><color red="0.7" green="0.7" blue="0.7" /></text></element>
+ <element name="text_145"><text string="SN74145N"><color red="0.7" green="0.7" blue="0.7" /></text></element>
+ <element name="text_244"><text string="SN74LS244N"><color red="0.7" green="0.7" blue="0.7" /></text></element>
+ <element name="text_6802"><text string="CPU MC6802P"><color red="0.7" green="0.7" blue="0.7" /></text></element>
+ <element name="text_2716"><text string="M5L2716K"><color red="0.7" green="0.7" blue="0.7" /></text></element>
+ <element name="text_6116"><text string="HM6116P"><color red="0.7" green="0.7" blue="0.7" /></text></element>
+ <element name="text_6821"><text string="MC6821P"><color red="0.7" green="0.7" blue="0.7" /></text></element>
+ <element name="pcb_color"> <rect><color red="0.22" green="0.26" blue="0.24" /></rect></element>
+ <element name="bb_color"> <rect><color red="0.71" green="0.63" blue="0.46" /></rect></element>
+ <element name="white"> <rect><color red="1.0" green="1.0" blue="1.0" /></rect></element>
+ <element name="gray"> <rect><color red="0.5" green="0.5" blue="0.5" /></rect></element>
+ <element name="black"> <rect><color red="0.0" green="0.0" blue="0.0" /></rect></element>
+ <element name="silver"> <rect><color red="0.75" green="0.75" blue="0.75" /></rect></element>
+ <element name="brown"> <rect><color red="0.18" green="0.08" blue="0.03" /></rect></element>
<element name="text_terminal"><text string="Terminal"><color red="0.7" green="0.7" blue="0.7" /></text></element>
- <element name="text_md6802"><text string="Mikrodator 6802"><color red="0.7" green="0.7" blue="0.7" /></text></element>
- <view name="Full Artwork">
- <bounds left="0" top="0" right="800" bottom="869"/>
+ <element name="mount">
+ <disk><bounds x="0" y="0" width="100" height="100" /><color red="0.0" green="0.0" blue="0.0" /></disk>
+ <disk><bounds x="22" y="22" width="56" height="56" /><color red="0.43" green="0.47" blue="0.45" /></disk>
+ </element>
- <bezel element="text_md6802"><bounds x="150" y="200" width="150" height="20" /></bezel>
+ <element name="screwhead">
+ <disk><bounds x="0" y="0" width="100" height="100" /><color red="0" green="0" blue="0" /></disk>
+ <disk><bounds x="2" y="2" width="96" height="96" /> <color red="0.1" green="0.1" blue="0.1" /></disk>
+ <disk><bounds x="5" y="5" width="90" height="90" /> <color red="0.2" green="0.2" blue="0.2" /></disk>
+ </element>
- <bezel name="led1" element="redled">
- <bounds x="290" y="668" width="15" height="15"/>
- </bezel>
+ <element name="hole">
+ <disk><bounds x="0" y="0" width="100" height="100" /><color red="0" green="0" blue="0" /></disk>
+ </element>
- <bezel name="digit0" element="digit">
- <bounds x="170" y="410" width="78" height="85" />
- </bezel>
- <bezel name="digit1" element="digit">
- <bounds x="250" y="410" width="78" height="85" />
- </bezel>
- <bezel name="digit2" element="digit">
- <bounds x="330" y="410" width="78" height="85" />
- </bezel>
- <bezel name="digit3" element="digit">
- <bounds x="410" y="410" width="78" height="85" />
+ <group name="screw">
+ <bezel element="screwhead"><bounds x="0" y="0" width="100" height="100" /></bezel>
+ <repeat count="~c~">
+ <param name="xl" start="~x~" increment="~xi~" />
+ <param name="yl" start="~y~" increment="~yi~" />
+ <bezel element="hole"><bounds x="~xl~" y="~yl~" width="8" height="8" /></bezel>
+ </repeat>
+ </group>
+
+ <group name="pinpair">
+ <bezel element="silver"><bounds x="29" y="0" width="50" height="100" /></bezel>
+ <bezel element="black"> <bounds x="0" y="10" width="108" height="80" /></bezel>
+ </group>
+
+ <group name="dip7">
+ <repeat count="7">
+ <param name="x" start="0" increment="100" />
+ <group ref="pinpair"><bounds x="~x~" y="0" width="108" height="100" /></group>
+ </repeat>
+ </group>
+
+ <group name="dip8">
+ <repeat count="8">
+ <param name="x" start="0" increment="100" />
+ <group ref="pinpair"><bounds x="~x~" y="0" width="108" height="100" /></group>
+ </repeat>
+ </group>
+
+ <group name="dip10">
+ <repeat count="10">
+ <param name="x" start="0" increment="100" />
+ <group ref="pinpair"><bounds x="~x~" y="0" width="108" height="100" /></group>
+ </repeat>
+ </group>
+
+ <group name="dip12">
+ <repeat count="12">
+ <param name="x" start="0" increment="100" />
+ <group ref="pinpair"><bounds x="~x~" y="0" width="108" height="100" /></group>
+ </repeat>
+ </group>
+
+ <group name="dip20">
+ <repeat count="20">
+ <param name="x" start="0" increment="100" />
+ <group ref="pinpair"><bounds x="~x~" y="0" width="108" height="100" /></group>
+ </repeat>
+ </group>
+
+ <group name="dip">
+ <repeat count="~pp~">
+ <param name="x" start="0" increment="100" />
+ <param name="xp" start="28" increment="100" />
+ <bezel element="silver"><bounds x="~xp~" y="0" width="50" height="100" /></bezel>
+ <bezel element="black"> <bounds x="~x~" y="10" width="106" height="80" /></bezel>
+ </repeat>
+ </group>
+
+ <group name="vdip">
+ <group ref="dip"><orientation rotate="90" /></group>
+ </group>
+
+ <group name="hdip">
+ <group ref="dip" />
+ </group>
+
+ <group name="digit">
+ <bezel name="digit~dno~" element="digit">
+ <bounds x="~x~" y="~y~" width="188" height="276" />
</bezel>
- <bezel name="digit4" element="digit">
- <bounds x="490" y="410" width="78" height="85" />
+ </group>
+
+ <element name="keycap">
+ <disk><bounds x="0" y="0" width="100" height="100" /><color red="0.0" green="0.0" blue="0.0" /></disk>
+ <disk><bounds x="3" y="3" width="94" height="94" /><color red="0.2" green="0.2" blue="0.2" /></disk>
+ <disk state="0"><bounds x="10" y="10" width="80" height="80" /><color red="0.1" green="0.1" blue="0.1" /></disk>
+ <disk state="1"><bounds x="10" y="10" width="80" height="80" /><color red="0.2" green="0.2" blue="0.2" /></disk>
+ </element>
+
+ <group name="key">
+ <bezel element="keycap" inputtag="LINE~line~" inputmask="~mask~">
+ <bounds x="~x~" y="~y~" width="22" height="22" />
</bezel>
- <bezel name="digit5" element="digit">
- <bounds x="570" y="410" width="78" height="85" />
+ <bezel element="text_~bname~">
+ <bounds x="~xt~" y="~yt~" width="28" height="7" />
</bezel>
+ </group>
- <!-- Buttons -->
- <!-- Row 0 : C D E F -->
- <bezel element="button" inputtag="LINE3" inputmask="0x01">
- <bounds x="345" y="555" width="70" height="60" />
- </bezel>
- <bezel element="text_C"><bounds x="355" y="535" width="50" height="20" /></bezel>
+ <group name="eurofem">
+ <bezel element="white"><bounds x="0" y="0" width="9400" height="1060" /></bezel>
+ <bezel element="black"><bounds x="420" y="60" width="8560" height="660" /></bezel>
+ <bezel element="black"><bounds x="520" y="720" width="8360" height="240" /></bezel>
+ <bezel element="white"><bounds x="440" y="80" width="8520" height="620" /></bezel>
+ <bezel element="white"><bounds x="540" y="700" width="8320" height="240" /></bezel>
+ <repeat count="3">
+ <param name="y" start="220" increment="254" />
+ <param name="yh" start="200" increment="254" />
+ <repeat count="32">
+ <param name="x" start="740" increment="254" />
+ <param name="xh" start="702" increment="254" />
+ <bezel element="gray"><bounds x="~xh~" y="~yh~" width="125" height="90" /></bezel>
+ <bezel element="black"><bounds x="~x~" y="~y~" width="60" height="50" /></bezel>
+ </repeat>
+ </repeat>
+ <bezel element="mount"><bounds x="60" y="380" width="300" height="300" /></bezel>
+ <bezel element="mount"><bounds x="9040" y="380" width="300" height="300" /></bezel>
+ </group>
- <bezel element="button" inputtag="LINE3" inputmask="0x02">
- <bounds x="425" y="555" width="70" height="60" />
- </bezel>
- <bezel element="text_D"><bounds x="435" y="535" width="50" height="20" /></bezel>
+ <group name="keyboard">
+ <backdrop element="pcb_color"><bounds left="0" top="0" right="289" bottom="327"/></backdrop>
+ <bezel element="text_md6802_kb"><bounds x="20" y="10" width="112" height="8" /></bezel>
+ <bezel element="text_terminal"><bounds x="10" y="208" width="26" height="6" /></bezel>
- <bezel element="button" inputtag="LINE3" inputmask="0x04">
- <bounds x="505" y="555" width="70" height="60" />
- </bezel>
- <bezel element="text_E"><bounds x="515" y="535" width="50" height="20" /></bezel>
+ <group ref="eurofem"><bounds x="23" y="32" width="228" height="24"/></group>
- <bezel element="button" inputtag="LINE3" inputmask="0x08">
- <bounds x="585" y="555" width="70" height="60" />
- </bezel>
- <bezel element="text_F"><bounds x="595" y="535" width="50" height="20" /></bezel>
+ <!-- BCD 7seg display -->
+ <!-- AAAADD -->
+ <repeat count="6">
+ <param name="dno" start="0" increment="1" />
+ <param name="x" start="30" increment="38" />
+ <param name="xi" start="32" increment="38" />
+ <param name="xd" start="33" increment="38" />
+ <bezel element="white"><bounds x="~x~" y="112" width="39" height="44" /></bezel>
+ <bezel element="pcb_color"><bounds x="~xi~" y="114" width="36" height="40" /></bezel>
+ <bezel element="black"><bounds x="~xd~" y="116" width="34" height="38" /></bezel>
+ <bezel name="digit~dno~" element="digit"><bounds x="~xd~" y="117" width="31" height="36" /></bezel>
+ </repeat>
- <!-- Buttons -->
- <!-- Row 1 : 8 9 A B -->
- <bezel element="button" inputtag="LINE2" inputmask="0x01">
- <bounds x="345" y="635" width="70" height="60" />
- </bezel>
- <bezel element="text_8"><bounds x="355" y="615" width="50" height="20" /></bezel>
+ <!-- Key pad -->
+ <repeat count="4">
+ <param name="bname" start="0" increment="4" />
+ <param name="line" start="0" increment="1" />
+ <param name="y" start="295" increment="-30" />
+ <param name="yt" start="287" increment="-30" />
+ <repeat count="4">
+ <param name="bname" start="~bname~" increment="1" />
+ <param name="mask" start="1" lshift="1" />
+ <param name="x" start="115" increment="30" />
+ <param name="xt" start="120" increment="30" />
+ <group ref="key"/>
+ </repeat>
+ </repeat>
- <bezel element="button" inputtag="LINE2" inputmask="0x02">
- <bounds x="425" y="635" width="70" height="60" />
- </bezel>
- <bezel element="text_9"><bounds x="435" y="615" width="50" height="20" /></bezel>
+ <!-- RESET button -->
+ <param name="line" value="4" />
+ <param name="mask" value="0x04" />
+ <param name="y" value="295" />
+ <param name="yt" value="287" />
+ <param name="x" value="85" />
+ <param name="xt" value="90" />
+ <param name="line" value="4" />
+ <param name="bname" value="reset" />
+ <group ref="key" />
- <bezel element="button" inputtag="LINE2" inputmask="0x04">
- <bounds x="505" y="635" width="70" height="60" />
- </bezel>
- <bezel element="text_A"><bounds x="515" y="615" width="50" height="20" /></bezel>
+ <!-- SHIFT key led -->
+ <bezel name="led1" element="redled"><bounds x="92" y="245" width="10" height="10"/></bezel>
- <bezel element="button" inputtag="LINE2" inputmask="0x08">
- <bounds x="585" y="635" width="70" height="60" />
- </bezel>
- <bezel element="text_B"><bounds x="595" y="615" width="50" height="20" /></bezel>
+ <!-- SHIFT button -->
+ <param name="mask" value="0x08" />
+ <param name="y" value="265" />
+ <param name="yt" value="257" />
+ <param name="x" value="85" />
+ <param name="xt" value="90" />
+ <param name="line" value="4" />
+ <param name="bname" value="shift" />
+ <group ref="key" />
- <!-- Buttons -->
- <!-- Row 2 : SHIFT 4 5 6 7 -->
- <bezel element="button" inputtag="LINE4" inputmask="0x08">
- <bounds x="265" y="715" width="70" height="60" />
- </bezel>
- <bezel element="text_shift"><bounds x="275" y="695" width="50" height="20" /></bezel>
+ <!-- screws -->
+ <param name="x" value="15" />
+ <param name="xi" value="1" />
+ <param name="y" value="15" />
+ <param name="yi" value="1" />
+ <param name="c" value="60" />
+ <group ref="screw"><bounds x="4" y="4" width="16" height="16" /></group>
+ <param name="x" value="75" />
+ <param name="xi" value="-1" />
+ <group ref="screw"><bounds x="270" y="4" width="16" height="16" /></group>
+ <param name="c" value="90" />
+ <param name="y" value="2" />
+ <param name="x" value="45" />
+ <param name="xi" value="0" />
+ <group ref="screw"><bounds x="270" y="290" width="16" height="16" /></group>
+ <param name="y" value="45" />
+ <param name="x" value="2" />
+ <param name="xi" value="1" />
+ <param name="yi" value="0" />
+ <group ref="screw"><bounds x="4" y="290" width="16" height="16" /></group>
- <bezel element="button" inputtag="LINE1" inputmask="0x01">
- <bounds x="345" y="715" width="70" height="60" />
- </bezel>
- <bezel element="text_4"><bounds x="355" y="695" width="50" height="20" /></bezel>
+ <!-- scattered ICs -->
+ <group ref="dip7"> <bounds x="45" y="70" width="44" height="20" /></group>
+ <bezel element="text_122"> <bounds x="51" y="74" width="25" height="7" /></bezel>
- <bezel element="button" inputtag="LINE1" inputmask="0x02">
- <bounds x="425" y="715" width="70" height="60" />
- </bezel>
- <bezel element="text_5"><bounds x="435" y="695" width="50" height="20" /></bezel>
+ <group ref="dip8"> <bounds x="44" y="176" width="20" height="50" /><orientation rotate="90" /></group>
+ <bezel element="text_145"> <bounds x="50" y="180" width="7" height="25" /><orientation rotate="90" /></bezel>
- <bezel element="button" inputtag="LINE1" inputmask="0x04">
- <bounds x="505" y="715" width="70" height="60" />
- </bezel>
- <bezel element="text_6"><bounds x="515" y="695" width="50" height="20" /></bezel>
+ <group ref="dip10"> <bounds x="97" y="59" width="65" height="20" /></group>
+ <bezel element="text_145"> <bounds x="103" y="63" width="25" height="7" /></bezel>
- <bezel element="button" inputtag="LINE1" inputmask="0x08">
- <bounds x="585" y="715" width="70" height="60" />
- </bezel>
- <bezel element="text_7"><bounds x="595" y="695" width="50" height="20" /></bezel>
+ </group>
- <!-- Buttons -->
- <!-- Row 3 : RESET 0 1 2 3 -->
- <bezel element="button" inputtag="LINE4" inputmask="0x04">
- <bounds x="265" y="795" width="70" height="60" />
- </bezel>
- <bezel element="text_reset"><bounds x="275" y="775" width="50" height="20" /></bezel>
+ <group name="cpuboard">
+ <backdrop element="pcb_color"><bounds left="0" top="0" right="390" bottom="242"/></backdrop>
+ <bezel element="text_md6802_cpu"><bounds x="25" y="22" width="8" height="75" /><orientation rotate="90" /></bezel>
- <bezel element="button" inputtag="LINE0" inputmask="0x01">
- <bounds x="345" y="795" width="70" height="60" />
- </bezel>
- <bezel element="text_0"><bounds x="355" y="775" width="50" height="20" /></bezel>
+ <group ref="eurofem"><bounds x="267" y="12" height="228" width="24" /><orientation rotate="90" /></group>
- <bezel element="button" inputtag="LINE0" inputmask="0x02">
- <bounds x="425" y="795" width="70" height="60" />
- </bezel>
- <bezel element="text_1"><bounds x="435" y="775" width="50" height="20" /></bezel>
+ <!-- screws -->
+ <param name="x" value="15" />
+ <param name="xi" value="1" />
+ <param name="y" value="15" />
+ <param name="yi" value="1" />
+ <param name="c" value="60" />
+ <group ref="screw"><bounds x="4" y="4" width="16" height="16" /></group>
+ <param name="x" value="75" />
+ <param name="xi" value="-1" />
+ <group ref="screw"><bounds x="369" y="4" width="16" height="16" /></group>
+ <param name="c" value="90" />
+ <param name="y" value="2" />
+ <param name="x" value="45" />
+ <param name="xi" value="0" />
+ <group ref="screw"><bounds x="369" y="222" width="16" height="16" /></group>
+ <param name="y" value="45" />
+ <param name="x" value="2" />
+ <param name="xi" value="1" />
+ <param name="yi" value="0" />
+ <group ref="screw"><bounds x="4" y="222" width="16" height="16" /></group>
- <bezel element="button" inputtag="LINE0" inputmask="0x04">
- <bounds x="505" y="795" width="70" height="60" />
- </bezel>
- <bezel element="text_2"><bounds x="515" y="775" width="50" height="20" /></bezel>
+ <!-- scattered ICs -->
+ <group ref="dip7"> <bounds x="37" y="193" width="44" height="20" /></group>
+ <bezel element="text_132"> <bounds x="43" y="197" width="25" height="7" /></bezel>
- <bezel element="button" inputtag="LINE0" inputmask="0x08">
- <bounds x="585" y="795" width="70" height="60" />
- </bezel>
- <bezel element="text_3"><bounds x="595" y="775" width="50" height="20" /></bezel>
+ <group ref="dip8"> <bounds x="167" y="20" width="50" height="20" /></group>
+ <bezel element="text_138"> <bounds x="173" y="24" width="25" height="7" /></bezel>
+
+ <!-- CPU -->
+ <group ref="dip20"> <bounds x="39" y="47" width="40" height="125" /><orientation rotate="90" /></group>
+ <bezel element="text_6802"><bounds x="50" y="53" width="15" height="52" /><orientation rotate="90" /></bezel>
+ <!-- PIAs -->
+ <group ref="dip20"> <bounds x="218" y="84" width="40" height="125" /><orientation rotate="90" /></group>
+ <bezel element="text_6821"><bounds x="229" y="90" width="15" height="48" /><orientation rotate="90" /></bezel>
+ <group ref="dip20"> <bounds x="312" y="84" width="40" height="125" /><orientation rotate="90" /></group>
+ <bezel element="text_6821"><bounds x="323" y="90" width="15" height="48" /><orientation rotate="90" /></bezel>
+ <!-- ROM -->
+ <group ref="dip12"><bounds x="104" y="69" width="40" height="77" /><orientation rotate="90" /></group>
+ <bezel element="text_2716"><bounds x="115" y="75" width="17" height="35" /><orientation rotate="90" /></bezel>
+ <!-- RAM -->
+ <group ref="dip12"><bounds x="158" y="69" width="40" height="77" /><orientation rotate="90" /></group>
+ <bezel element="text_6116"><bounds x="169" y="75" width="17" height="35" /><orientation rotate="90" /></bezel>
+ </group>
+
+ <group name="breadboard">
+ <backdrop element="bb_color"><bounds left="0" top="0" right="1300" bottom="3720"/></backdrop>
+ <repeat count="47">
+ <param name="y" start="400" increment="62" />
+ <param name="yh" start="405" increment="62" />
+ <repeat count="5">
+ <param name="x" start="330" increment="62" />
+ <param name="xh" start="335" increment="62" />
+ <bezel element="gray"><bounds x="~x~" y="~y~" width="40" height="40" /></bezel>
+ <bezel element="black"><bounds x="~xh~" y="~yh~" width="30" height="30" /></bezel>
+ </repeat>
+ <repeat count="5">
+ <param name="x" start="740" increment="62" />
+ <param name="xh" start="745" increment="62" />
+ <bezel element="gray"><bounds x="~x~" y="~y~" width="40" height="40" /></bezel>
+ <bezel element="black"><bounds x="~xh~" y="~yh~" width="30" height="30" /></bezel>
+ </repeat>
+ </repeat>
+ <repeat count="8">
+ <param name="y" start="400" increment="372" />
+ <param name="yh" start="405" increment="372" />
+ <repeat count="5">
+ <param name="y" start="~y~" increment="62" />
+ <param name="yh" start="~yh~" increment="62" />
+ <bezel element="gray"><bounds x="180" y="~y~" width="40" height="40" /></bezel>
+ <bezel element="black"><bounds x="185" y="~yh~" width="30" height="30" /></bezel>
+ <bezel element="gray"><bounds x="1100" y="~y~" width="40" height="40" /></bezel>
+ <bezel element="black"><bounds x="1105" y="~yh~" width="30" height="30" /></bezel>
+ </repeat>
+ </repeat>
+ <!-- screws -->
+ <param name="x" value="15" />
+ <param name="xi" value="1" />
+ <param name="y" value="15" />
+ <param name="yi" value="1" />
+ <param name="c" value="60" />
+ <group ref="screw"><bounds x="180" y="130" width="160" height="160" /></group>
+ <param name="x" value="75" />
+ <param name="xi" value="-1" />
+ <group ref="screw"><bounds x="990" y="130" width="160" height="160" /></group>
+ <param name="c" value="90" />
+ <param name="y" value="2" />
+ <param name="x" value="45" />
+ <param name="xi" value="0" />
+ <group ref="screw"><bounds x="990" y="3420" width="160" height="160" /></group>
+ <param name="y" value="45" />
+ <param name="x" value="2" />
+ <param name="xi" value="1" />
+ <param name="yi" value="0" />
+ <group ref="screw"><bounds x="180" y="3420" width="160" height="160" /></group>
+ </group>
+ <view name="Base Artwork">
+ <backdrop element="black"><bounds left="0" top="0" right="1211" bottom="551"/></backdrop>
+ <group ref="keyboard"><bounds x="0" y="31" width="400" height="450" /></group>
+ <group ref="cpuboard"><bounds x="405" y="92" width="540" height="338" /></group>
+ <group ref="breadboard"><bounds x="951" y="0" width="191" height="551" /></group>
</view>
</mamelayout>
diff --git a/src/mame/layout/mdndclab.lay b/src/mame/layout/mdndclab.lay
index c9b3e033b7b..20c5439d54a 100644
--- a/src/mame/layout/mdndclab.lay
+++ b/src/mame/layout/mdndclab.lay
@@ -1,7 +1,10 @@
<?xml version="1.0"?>
<mamelayout version="2">
- <script>
+<!-- luascript (demo for plugin -layout) -->
+<!-- this adds support for placing wall pieces by clicking between buttons -->
+
+<script>
local layout = {}
local walls = { { 7.5, {0, 10, 20, 30, 40, 50, 60, 70}},
{17.5, {0, 10, 20, 30, 40, 50, 60, 70}},
@@ -87,7 +90,8 @@
end
end
return layout, "mdndclab"
- </script>
+</script>
+
<!-- define elements -->
@@ -214,6 +218,7 @@
<rect state="1"><color red="0.55" green="0.1" blue="0.05" /></rect>
</element>
+
<!-- build screen -->
<view name="Internal Layout">
@@ -296,6 +301,8 @@
<bezel element="hlr" inputtag="IN.6" inputmask="0x08"><bounds x="60" y="70" width="7.5" height="7.5" /></bezel>
<bezel element="hlr" inputtag="IN.7" inputmask="0x08"><bounds x="70" y="70" width="7.5" height="7.5" /></bezel>
+ <!-- wall pieces -->
+
<bezel name="colwall11" element="wall"><bounds x= "7.5" y= "0" width="2.5" height="7.5" /></bezel>
<bezel name="colwall12" element="wall"><bounds x= "7.5" y="10" width="2.5" height="7.5" /></bezel>
<bezel name="colwall13" element="wall"><bounds x= "7.5" y="20" width="2.5" height="7.5" /></bezel>
@@ -410,7 +417,7 @@
<bezel name="rowwall77" element="wall"><bounds x="60" y="67.5" width="7.5" height="2.5" /></bezel>
<bezel name="rowwall78" element="wall"><bounds x="70" y="67.5" width="7.5" height="2.5" /></bezel>
- <!-- left side -->
+ <!-- left side -->
<bezel element="static_red"><bounds x="-12.5" y="0" width="7.5" height="7.5" /></bezel>
<bezel element="static_red"><bounds x="-12.5" y="10" width="7.5" height="7.5" /></bezel>
diff --git a/src/mame/layout/mephisto_academy.lay b/src/mame/layout/mephisto_academy.lay
index 917dcb459a0..c67fe49c0ae 100644
--- a/src/mame/layout/mephisto_academy.lay
+++ b/src/mame/layout/mephisto_academy.lay
@@ -61,12 +61,12 @@
<element name="text_ent"> <rect><color red="0.59" green="0.39" blue="0.20" /></rect> <text string="ENT"> <color red="1" green="1" blue="1" /></text> </element>
<element name="text_cl"> <rect><color red="0.59" green="0.39" blue="0.20" /></rect> <text string="CL"> <color red="1" green="1" blue="1" /></text> </element>
<element name="text_newgame"> <rect><color red="0.59" green="0.39" blue="0.20" /></rect> <text string="NEW GAME"> <color red="1" green="1" blue="1" /></text> </element>
- <element name="text_p1"> <rect><color red="0.59" green="0.39" blue="0.20" /></rect> <text string="&#x265a;"> <color red="1" green="1" blue="1" /></text> </element>
- <element name="text_p2"> <rect><color red="0.59" green="0.39" blue="0.20" /></rect> <text string="&#x265b;"> <color red="1" green="1" blue="1" /></text> </element>
- <element name="text_p3"> <rect><color red="0.59" green="0.39" blue="0.20" /></rect> <text string="&#x265c;"> <color red="1" green="1" blue="1" /></text> </element>
- <element name="text_p4"> <rect><color red="0.59" green="0.39" blue="0.20" /></rect> <text string="&#x265d;"> <color red="1" green="1" blue="1" /></text> </element>
- <element name="text_p5"> <rect><color red="0.59" green="0.39" blue="0.20" /></rect> <text string="&#x265e;"> <color red="1" green="1" blue="1" /></text> </element>
- <element name="text_p6"> <rect><color red="0.59" green="0.39" blue="0.20" /></rect> <text string="&#x265f;"> <color red="1" green="1" blue="1" /></text> </element>
+ <element name="text_p1"> <rect><color red="0.59" green="0.39" blue="0.20" /></rect> <text string="[K]"> <color red="1" green="1" blue="1" /></text> </element>
+ <element name="text_p2"> <rect><color red="0.59" green="0.39" blue="0.20" /></rect> <text string="[Q]"> <color red="1" green="1" blue="1" /></text> </element>
+ <element name="text_p3"> <rect><color red="0.59" green="0.39" blue="0.20" /></rect> <text string="[R]"> <color red="1" green="1" blue="1" /></text> </element>
+ <element name="text_p4"> <rect><color red="0.59" green="0.39" blue="0.20" /></rect> <text string="[B]"> <color red="1" green="1" blue="1" /></text> </element>
+ <element name="text_p5"> <rect><color red="0.59" green="0.39" blue="0.20" /></rect> <text string="[N]"> <color red="1" green="1" blue="1" /></text> </element>
+ <element name="text_p6"> <rect><color red="0.59" green="0.39" blue="0.20" /></rect> <text string="[P]"> <color red="1" green="1" blue="1" /></text> </element>
<element name="text_lcd"> <rect><color red="0.59" green="0.39" blue="0.20" /></rect> <text string="MULTI INFO LCD"><color red="1" green="1" blue="1" /></text> </element>
<!-- build screen -->
@@ -96,12 +96,12 @@
<bezel element="text_ent"> <bounds x="64.25" y="2" width="5" height="1.5" /> </bezel>
<bezel element="text_cl"> <bounds x="71.25" y="2" width="3" height="1.5" /> </bezel>
- <bezel element="text_p6"> <bounds x="27.25" y="6.5" width="5" height="2" /> </bezel>
- <bezel element="text_p5"> <bounds x="33.25" y="6.5" width="5" height="2" /> </bezel>
- <bezel element="text_p4"> <bounds x="39.25" y="6.5" width="5" height="2" /> </bezel>
- <bezel element="text_p3"> <bounds x="45.25" y="6.5" width="5" height="2" /> </bezel>
- <bezel element="text_p2"> <bounds x="52.25" y="6.5" width="5" height="2" /> </bezel>
- <bezel element="text_p1"> <bounds x="58.25" y="6.5" width="5" height="2" /> </bezel>
+ <bezel element="text_p6"> <bounds x="27.25" y="6.5" width="5" height="1.5" /> </bezel>
+ <bezel element="text_p5"> <bounds x="33.25" y="6.5" width="5" height="1.5" /> </bezel>
+ <bezel element="text_p4"> <bounds x="39.25" y="6.5" width="5" height="1.5" /> </bezel>
+ <bezel element="text_p3"> <bounds x="45.25" y="6.5" width="5" height="1.5" /> </bezel>
+ <bezel element="text_p2"> <bounds x="52.25" y="6.5" width="5" height="1.5" /> </bezel>
+ <bezel element="text_p1"> <bounds x="58.25" y="6.5" width="5" height="1.5" /> </bezel>
<bezel element="text_newgame"> <bounds x="65.25" y="6.70" width="9" height="1.5" /> </bezel>
<bezel element="text_black"> <bounds x="64" y="0" width="2" height="1.3" /> </bezel>
<bezel element="text_white"> <bounds x="70" y="0" width="2" height="1.3" /> </bezel>
diff --git a/src/mame/layout/mephisto_lcd.lay b/src/mame/layout/mephisto_lcd.lay
index b8e2a0ec110..0aee33c571f 100644
--- a/src/mame/layout/mephisto_lcd.lay
+++ b/src/mame/layout/mephisto_lcd.lay
@@ -58,12 +58,12 @@
<element name="text_fct"> <rect><color red="0" green="0" blue="0" /></rect> <text string="FCT"> <color red="0.76" green="0.74" blue="0.41" /></text> </element>
<element name="text_ent"> <rect><color red="0" green="0" blue="0" /></rect> <text string="ENT"> <color red="0.76" green="0.74" blue="0.41" /></text> </element>
<element name="text_cl"> <rect><color red="0" green="0" blue="0" /></rect> <text string="CL"> <color red="0.76" green="0.74" blue="0.41" /></text> </element>
- <element name="text_p1"> <rect><color red="0" green="0" blue="0" /></rect> <text string="&#x265a;"> <color red="0.76" green="0.74" blue="0.41" /></text> </element>
- <element name="text_p2"> <rect><color red="0" green="0" blue="0" /></rect> <text string="&#x265b;"> <color red="0.76" green="0.74" blue="0.41" /></text> </element>
- <element name="text_p3"> <rect><color red="0" green="0" blue="0" /></rect> <text string="&#x265c;"> <color red="0.76" green="0.74" blue="0.41" /></text> </element>
- <element name="text_p4"> <rect><color red="0" green="0" blue="0" /></rect> <text string="&#x265d;"> <color red="0.76" green="0.74" blue="0.41" /></text> </element>
- <element name="text_p5"> <rect><color red="0" green="0" blue="0" /></rect> <text string="&#x265e;"> <color red="0.76" green="0.74" blue="0.41" /></text> </element>
- <element name="text_p6"> <rect><color red="0" green="0" blue="0" /></rect> <text string="&#x265f;"> <color red="0.76" green="0.74" blue="0.41" /></text> </element>
+ <element name="text_p1"> <rect><color red="0" green="0" blue="0" /></rect> <text string="[K]"> <color red="0.76" green="0.74" blue="0.41" /></text> </element>
+ <element name="text_p2"> <rect><color red="0" green="0" blue="0" /></rect> <text string="[Q]"> <color red="0.76" green="0.74" blue="0.41" /></text> </element>
+ <element name="text_p3"> <rect><color red="0" green="0" blue="0" /></rect> <text string="[R]"> <color red="0.76" green="0.74" blue="0.41" /></text> </element>
+ <element name="text_p4"> <rect><color red="0" green="0" blue="0" /></rect> <text string="[B]"> <color red="0.76" green="0.74" blue="0.41" /></text> </element>
+ <element name="text_p5"> <rect><color red="0" green="0" blue="0" /></rect> <text string="[N]"> <color red="0.76" green="0.74" blue="0.41" /></text> </element>
+ <element name="text_p6"> <rect><color red="0" green="0" blue="0" /></rect> <text string="[P]"> <color red="0.76" green="0.74" blue="0.41" /></text> </element>
<element name="text_lcd"> <rect><color red="0" green="0" blue="0" /></rect> <text string="16/32 BIT DISPLAY MODUL"><color red="0.76" green="0.74" blue="0.41" /></text> </element>
<!-- build screen -->
@@ -87,12 +87,12 @@
<bezel element="text_ent"> <bounds x="47.5" y="7" width="3.5" height="1.2" /> </bezel>
<bezel element="text_cl"> <bounds x="52.5" y="7" width="3.5" height="1.3" /> </bezel>
- <bezel element="text_p6"> <bounds x="27.5" y="4.5" width="3.5" height="2" /> </bezel>
- <bezel element="text_p5"> <bounds x="32.5" y="4.5" width="3.5" height="2" /> </bezel>
- <bezel element="text_p4"> <bounds x="37.5" y="4.5" width="3.5" height="2" /> </bezel>
- <bezel element="text_p3"> <bounds x="42.5" y="4.5" width="3.5" height="2" /> </bezel>
- <bezel element="text_p2"> <bounds x="47.5" y="4.5" width="3.5" height="2" /> </bezel>
- <bezel element="text_p1"> <bounds x="52.5" y="4.5" width="3.5" height="2" /> </bezel>
+ <bezel element="text_p6"> <bounds x="27.5" y="4.5" width="4" height="1.7" /></bezel>
+ <bezel element="text_p5"> <bounds x="32.5" y="4.5" width="4" height="1.7" /></bezel>
+ <bezel element="text_p4"> <bounds x="37.5" y="4.5" width="4" height="1.7" /></bezel>
+ <bezel element="text_p3"> <bounds x="42.5" y="4.5" width="4" height="1.7" /></bezel>
+ <bezel element="text_p2"> <bounds x="47.5" y="4.5" width="4" height="1.7" /></bezel>
+ <bezel element="text_p1"> <bounds x="52.5" y="4.5" width="4" height="1.7" /></bezel>
<bezel element="hlb" inputtag="KEY" inputmask="0x01"> <bounds x="27.5" y="2" width="3.5" height="2.5" /> </bezel>
<bezel element="hlb" inputtag="KEY" inputmask="0x02"> <bounds x="32.5" y="2" width="3.5" height="2.5" /> </bezel>
diff --git a/src/mame/layout/mephisto_megaiv.lay b/src/mame/layout/mephisto_megaiv.lay
index de70b364aee..b90656a2fc9 100644
--- a/src/mame/layout/mephisto_megaiv.lay
+++ b/src/mame/layout/mephisto_megaiv.lay
@@ -65,14 +65,14 @@
<element name="text_lev"> <rect><color red="0.90" green="0.91" blue="0.89" /></rect> <text string="LEV"> <color red="0" green="0" blue="0" /></text> </element>
<element name="text_black"> <rect><color red="0.90" green="0.91" blue="0.89" /></rect> <text string="&#x25a0;"> <color red="0" green="0" blue="0" /></text> </element>
<element name="text_white"> <rect><color red="0.90" green="0.91" blue="0.89" /></rect> <text string="&#x25a1;"> <color red="0" green="0" blue="0" /></text> </element>
- <element name="text_b1"> <rect><color red="0.90" green="0.91" blue="0.89" /></rect> <text string="&#x265f; 1"> <color red="0" green="0" blue="0" /></text> </element>
- <element name="text_b2"> <rect><color red="0.90" green="0.91" blue="0.89" /></rect> <text string="&#x265e; 2"> <color red="0" green="0" blue="0" /></text> </element>
- <element name="text_b3"> <rect><color red="0.90" green="0.91" blue="0.89" /></rect> <text string="&#x265d; 3"> <color red="0" green="0" blue="0" /></text> </element>
- <element name="text_b4"> <rect><color red="0.90" green="0.91" blue="0.89" /></rect> <text string="&#x265c; 4"> <color red="0" green="0" blue="0" /></text> </element>
- <element name="text_b5"> <rect><color red="0.90" green="0.91" blue="0.89" /></rect> <text string="&#x265b; 5"> <color red="0" green="0" blue="0" /></text> </element>
- <element name="text_b6"> <rect><color red="0.90" green="0.91" blue="0.89" /></rect> <text string="&#x265a; 6"> <color red="0" green="0" blue="0" /></text> </element>
- <element name="text_b7"> <rect><color red="0.90" green="0.91" blue="0.89" /></rect> <text string="&#x25a0; 7 &#x25c0;"> <color red="0" green="0" blue="0" /></text> </element>
- <element name="text_b8"> <rect><color red="0.90" green="0.91" blue="0.89" /></rect> <text string="&#x25a1; 8 &#x25b6;"> <color red="0" green="0" blue="0" /></text> </element>
+ <element name="text_b1"> <rect><color red="0.90" green="0.91" blue="0.89" /></rect> <text string="[P] 1"> <color red="0" green="0" blue="0" /></text> </element>
+ <element name="text_b2"> <rect><color red="0.90" green="0.91" blue="0.89" /></rect> <text string="[N] 2"> <color red="0" green="0" blue="0" /></text> </element>
+ <element name="text_b3"> <rect><color red="0.90" green="0.91" blue="0.89" /></rect> <text string="[B] 3"> <color red="0" green="0" blue="0" /></text> </element>
+ <element name="text_b4"> <rect><color red="0.90" green="0.91" blue="0.89" /></rect> <text string="[R] 4"> <color red="0" green="0" blue="0" /></text> </element>
+ <element name="text_b5"> <rect><color red="0.90" green="0.91" blue="0.89" /></rect> <text string="[Q] 5"> <color red="0" green="0" blue="0" /></text> </element>
+ <element name="text_b6"> <rect><color red="0.90" green="0.91" blue="0.89" /></rect> <text string="[K] 6"> <color red="0" green="0" blue="0" /></text> </element>
+ <element name="text_b7"> <rect><color red="0.90" green="0.91" blue="0.89" /></rect> <text string="&#x25a0; 7 &#x25c4;"> <color red="0" green="0" blue="0" /></text> </element>
+ <element name="text_b8"> <rect><color red="0.90" green="0.91" blue="0.89" /></rect> <text string="&#x25a1; 8 &#x25ba;"> <color red="0" green="0" blue="0" /></text> </element>
<element name="text_book9"> <rect><color red="0.90" green="0.91" blue="0.89" /></rect> <text string="BOOK 9"> <color red="0" green="0" blue="0" /></text> </element>
<element name="text_pos0"> <rect><color red="0.90" green="0.91" blue="0.89" /></rect> <text string="POS 0"> <color red="0" green="0" blue="0" /></text> </element>
<element name="text_cl"> <rect><color red="0.90" green="0.91" blue="0.89" /></rect> <text string="CL"> <color red="0" green="0" blue="0" /></text> </element>
diff --git a/src/mame/layout/mephisto_milano.lay b/src/mame/layout/mephisto_milano.lay
index 2f1f14c3bd6..080dcb47fef 100644
--- a/src/mame/layout/mephisto_milano.lay
+++ b/src/mame/layout/mephisto_milano.lay
@@ -59,12 +59,12 @@
<element name="text_enter"> <rect><color red="0" green="0" blue="0" /></rect> <text string="ENTER"> <color red="1" green="1" blue="1" /></text> </element>
<element name="text_clear"> <rect><color red="0" green="0" blue="0" /></rect> <text string="CLEAR"> <color red="1" green="1" blue="1" /></text> </element>
<element name="text_newgame"> <rect><color red="0" green="0" blue="0" /></rect> <text string="NEW GAME"> <color red="1" green="1" blue="1" /></text> </element>
- <element name="text_p1"> <rect><color red="0" green="0" blue="0" /></rect> <text string="&#x265a;"> <color red="1" green="1" blue="1" /></text> </element>
- <element name="text_p2"> <rect><color red="0" green="0" blue="0" /></rect> <text string="&#x265b;"> <color red="1" green="1" blue="1" /></text> </element>
- <element name="text_p3"> <rect><color red="0" green="0" blue="0" /></rect> <text string="&#x265c;"> <color red="1" green="1" blue="1" /></text> </element>
- <element name="text_p4"> <rect><color red="0" green="0" blue="0" /></rect> <text string="&#x265d;"> <color red="1" green="1" blue="1" /></text> </element>
- <element name="text_p5"> <rect><color red="0" green="0" blue="0" /></rect> <text string="&#x265e;"> <color red="1" green="1" blue="1" /></text> </element>
- <element name="text_p6"> <rect><color red="0" green="0" blue="0" /></rect> <text string="&#x265f;"> <color red="1" green="1" blue="1" /></text> </element>
+ <element name="text_p1"> <rect><color red="0" green="0" blue="0" /></rect> <text string="[K]"> <color red="1" green="1" blue="1" /></text> </element>
+ <element name="text_p2"> <rect><color red="0" green="0" blue="0" /></rect> <text string="[Q]"> <color red="1" green="1" blue="1" /></text> </element>
+ <element name="text_p3"> <rect><color red="0" green="0" blue="0" /></rect> <text string="[R]"> <color red="1" green="1" blue="1" /></text> </element>
+ <element name="text_p4"> <rect><color red="0" green="0" blue="0" /></rect> <text string="[B]"> <color red="1" green="1" blue="1" /></text> </element>
+ <element name="text_p5"> <rect><color red="0" green="0" blue="0" /></rect> <text string="[N]"> <color red="1" green="1" blue="1" /></text> </element>
+ <element name="text_p6"> <rect><color red="0" green="0" blue="0" /></rect> <text string="[P]"> <color red="1" green="1" blue="1" /></text> </element>
<!-- build screen -->
@@ -88,12 +88,12 @@
<bezel element="text_function"> <bounds x="6.5" y="18" width="5" height="1.2" /> </bezel>
<bezel element="text_enter"> <bounds x="12.5" y="18" width="5" height="1.2" /> </bezel>
<bezel element="text_clear"> <bounds x="18.5" y="18" width="5" height="1.2" /> </bezel>
- <bezel element="text_p6"> <bounds x="0.5" y="12" width="5" height="2.5" /> </bezel>
- <bezel element="text_p5"> <bounds x="6.5" y="12" width="5" height="2.5" /> </bezel>
- <bezel element="text_p4"> <bounds x="12.5" y="12" width="5" height="2.5" /> </bezel>
- <bezel element="text_p3"> <bounds x="18.5" y="12" width="5" height="2.5" /> </bezel>
- <bezel element="text_p2"> <bounds x="0.5" y="21" width="5" height="2.5" /> </bezel>
- <bezel element="text_p1"> <bounds x="6.5" y="21" width="5" height="2.5" /> </bezel>
+ <bezel element="text_p6"> <bounds x="0.5" y="12" width="5" height="1.7" /> </bezel>
+ <bezel element="text_p5"> <bounds x="6.5" y="12" width="5" height="1.7" /> </bezel>
+ <bezel element="text_p4"> <bounds x="12.5" y="12" width="5" height="1.7" /> </bezel>
+ <bezel element="text_p3"> <bounds x="18.5" y="12" width="5" height="1.7" /> </bezel>
+ <bezel element="text_p2"> <bounds x="0.5" y="21" width="5" height="1.7" /> </bezel>
+ <bezel element="text_p1"> <bounds x="6.5" y="21" width="5" height="1.7" /> </bezel>
<bezel element="text_newgame"> <bounds x="12.5" y="22" width="11" height="1.4" /> </bezel>
<bezel name="led100" element="led"> <bounds x="2.5" y="7" width="1.2" height="1.2" /> </bezel>
diff --git a/src/mame/layout/mephisto_modena.lay b/src/mame/layout/mephisto_modena.lay
index 0b238c55ddd..2908d489b04 100644
--- a/src/mame/layout/mephisto_modena.lay
+++ b/src/mame/layout/mephisto_modena.lay
@@ -64,12 +64,12 @@
<element name="text_enter"> <rect><color red="0" green="0" blue="0" /></rect> <text string="ENTER"> <color red="1" green="1" blue="1" /></text> </element>
<element name="text_clear"> <rect><color red="0" green="0" blue="0" /></rect> <text string="CLEAR"> <color red="1" green="1" blue="1" /></text> </element>
<element name="text_newgame"> <rect><color red="0" green="0" blue="0" /></rect> <text string="NEW GAME"> <color red="1" green="1" blue="1" /></text> </element>
- <element name="text_p1"> <rect><color red="0" green="0" blue="0" /></rect> <text string="&#x265a;"> <color red="1" green="1" blue="1" /></text> </element>
- <element name="text_p2"> <rect><color red="0" green="0" blue="0" /></rect> <text string="&#x265b;"> <color red="1" green="1" blue="1" /></text> </element>
- <element name="text_p3"> <rect><color red="0" green="0" blue="0" /></rect> <text string="&#x265c;"> <color red="1" green="1" blue="1" /></text> </element>
- <element name="text_p4"> <rect><color red="0" green="0" blue="0" /></rect> <text string="&#x265d;"> <color red="1" green="1" blue="1" /></text> </element>
- <element name="text_p5"> <rect><color red="0" green="0" blue="0" /></rect> <text string="&#x265e;"> <color red="1" green="1" blue="1" /></text> </element>
- <element name="text_p6"> <rect><color red="0" green="0" blue="0" /></rect> <text string="&#x265f;"> <color red="1" green="1" blue="1" /></text> </element>
+ <element name="text_p1"> <rect><color red="0" green="0" blue="0" /></rect> <text string="[K]"> <color red="1" green="1" blue="1" /></text> </element>
+ <element name="text_p2"> <rect><color red="0" green="0" blue="0" /></rect> <text string="[Q]"> <color red="1" green="1" blue="1" /></text> </element>
+ <element name="text_p3"> <rect><color red="0" green="0" blue="0" /></rect> <text string="[R]"> <color red="1" green="1" blue="1" /></text> </element>
+ <element name="text_p4"> <rect><color red="0" green="0" blue="0" /></rect> <text string="[B]"> <color red="1" green="1" blue="1" /></text> </element>
+ <element name="text_p5"> <rect><color red="0" green="0" blue="0" /></rect> <text string="[N]"> <color red="1" green="1" blue="1" /></text> </element>
+ <element name="text_p6"> <rect><color red="0" green="0" blue="0" /></rect> <text string="[P]"> <color red="1" green="1" blue="1" /></text> </element>
<!-- build screen -->
<group name="panel">
@@ -96,12 +96,12 @@
<bezel element="text_enter"> <bounds x="12" y="18" width="5" height="1.2" /> </bezel>
<bezel element="text_clear"> <bounds x="18" y="18" width="5" height="1.2" /> </bezel>
- <bezel element="text_p6"> <bounds x="0" y="12" width="5" height="2.5" /> </bezel>
- <bezel element="text_p5"> <bounds x="6" y="12" width="5" height="2.5" /> </bezel>
- <bezel element="text_p4"> <bounds x="12" y="12" width="5" height="2.5" /> </bezel>
- <bezel element="text_p3"> <bounds x="18" y="12" width="5" height="2.5" /> </bezel>
- <bezel element="text_p2"> <bounds x="0" y="21" width="5" height="2.5" /> </bezel>
- <bezel element="text_p1"> <bounds x="6" y="21" width="5" height="2.5" /> </bezel>
+ <bezel element="text_p6"> <bounds x="0" y="12" width="5" height="1.7" /> </bezel>
+ <bezel element="text_p5"> <bounds x="6" y="12" width="5" height="1.7" /> </bezel>
+ <bezel element="text_p4"> <bounds x="12" y="12" width="5" height="1.7" /> </bezel>
+ <bezel element="text_p3"> <bounds x="18" y="12" width="5" height="1.7" /> </bezel>
+ <bezel element="text_p2"> <bounds x="0" y="21" width="5" height="1.7" /> </bezel>
+ <bezel element="text_p1"> <bounds x="6" y="21" width="5" height="1.7" /> </bezel>
<bezel element="text_newgame"> <bounds x="12" y="22" width="11" height="1.4" /> </bezel>
<bezel name="led100" element="led"> <bounds x="1.75" y="7" width="1.2" height="1.2" /> </bezel>
diff --git a/src/mame/layout/mephisto_mondial2.lay b/src/mame/layout/mephisto_mondial2.lay
index acdf037fca2..0122999b804 100644
--- a/src/mame/layout/mephisto_mondial2.lay
+++ b/src/mame/layout/mephisto_mondial2.lay
@@ -68,12 +68,12 @@
<element name="text_plus"> <rect><color red="0" green="0" blue="0" /></rect> <text align="1" string="+"> <color red="0.90" green="0.91" blue="0.89" /></text> </element>
<element name="text_black"> <rect><color red="0" green="0" blue="0" /></rect> <text align="1" string="&#x25a1;"> <color red="0.90" green="0.91" blue="0.89" /></text> </element>
<element name="text_white"> <rect><color red="0" green="0" blue="0" /></rect> <text align="1" string="&#x25a0;"> <color red="0.90" green="0.91" blue="0.89" /></text> </element>
- <element name="text_b1"> <rect><color red="0" green="0" blue="0" /></rect> <text align="1" string="&#x265f; 1"> <color red="0.90" green="0.91" blue="0.89" /></text> </element>
- <element name="text_b2"> <rect><color red="0" green="0" blue="0" /></rect> <text align="1" string="&#x265e; 2"> <color red="0.90" green="0.91" blue="0.89" /></text> </element>
- <element name="text_b3"> <rect><color red="0" green="0" blue="0" /></rect> <text align="1" string="&#x265d; 3"> <color red="0.90" green="0.91" blue="0.89" /></text> </element>
- <element name="text_b4"> <rect><color red="0" green="0" blue="0" /></rect> <text align="1" string="&#x265c; 4"> <color red="0.90" green="0.91" blue="0.89" /></text> </element>
- <element name="text_b5"> <rect><color red="0" green="0" blue="0" /></rect> <text align="1" string="&#x265b; 5"> <color red="0.90" green="0.91" blue="0.89" /></text> </element>
- <element name="text_b6"> <rect><color red="0" green="0" blue="0" /></rect> <text align="1" string="&#x265a; 6"> <color red="0.90" green="0.91" blue="0.89" /></text> </element>
+ <element name="text_b1"> <rect><color red="0" green="0" blue="0" /></rect> <text align="1" string="[P] 1"> <color red="0.90" green="0.91" blue="0.89" /></text> </element>
+ <element name="text_b2"> <rect><color red="0" green="0" blue="0" /></rect> <text align="1" string="[N] 2"> <color red="0.90" green="0.91" blue="0.89" /></text> </element>
+ <element name="text_b3"> <rect><color red="0" green="0" blue="0" /></rect> <text align="1" string="[B] 3"> <color red="0.90" green="0.91" blue="0.89" /></text> </element>
+ <element name="text_b4"> <rect><color red="0" green="0" blue="0" /></rect> <text align="1" string="[R] 4"> <color red="0.90" green="0.91" blue="0.89" /></text> </element>
+ <element name="text_b5"> <rect><color red="0" green="0" blue="0" /></rect> <text align="1" string="[Q] 5"> <color red="0.90" green="0.91" blue="0.89" /></text> </element>
+ <element name="text_b6"> <rect><color red="0" green="0" blue="0" /></rect> <text align="1" string="[K] 6"> <color red="0.90" green="0.91" blue="0.89" /></text> </element>
<element name="text_b7"> <rect><color red="0" green="0" blue="0" /></rect> <text align="1" string="&#x25a1; 7"> <color red="0.90" green="0.91" blue="0.89" /></text> </element>
<element name="text_b8"> <rect><color red="0" green="0" blue="0" /></rect> <text align="1" string="&#x25a0; 8"> <color red="0.90" green="0.91" blue="0.89" /></text> </element>
<element name="text_play"> <rect><color red="0" green="0" blue="0" /></rect> <text align="1" string="PLAY"> <color red="0.90" green="0.91" blue="0.89" /></text> </element>
diff --git a/src/mame/layout/mephisto_montec.lay b/src/mame/layout/mephisto_montec.lay
index f2afb906c98..5e6aa5c2cf8 100644
--- a/src/mame/layout/mephisto_montec.lay
+++ b/src/mame/layout/mephisto_montec.lay
@@ -65,14 +65,14 @@
<element name="text_lev"> <rect><color red="0.59" green="0.39" blue="0.20" /></rect> <text string="LEV"> <color red="1" green="1" blue="1" /></text> </element>
<element name="text_black"> <rect><color red="0.59" green="0.39" blue="0.20" /></rect> <text string="&#x25a1;"> <color red="1" green="1" blue="1" /></text> </element>
<element name="text_white"> <rect><color red="0.59" green="0.39" blue="0.20" /></rect> <text string="&#x25a0;"> <color red="1" green="1" blue="1" /></text> </element>
- <element name="text_b1"> <rect><color red="0.59" green="0.39" blue="0.20" /></rect> <text string="&#x265f; 1"> <color red="1" green="1" blue="1" /></text> </element>
- <element name="text_b2"> <rect><color red="0.59" green="0.39" blue="0.20" /></rect> <text string="&#x265e; 2"> <color red="1" green="1" blue="1" /></text> </element>
- <element name="text_b3"> <rect><color red="0.59" green="0.39" blue="0.20" /></rect> <text string="&#x265d; 3"> <color red="1" green="1" blue="1" /></text> </element>
- <element name="text_b4"> <rect><color red="0.59" green="0.39" blue="0.20" /></rect> <text string="&#x265c; 4"> <color red="1" green="1" blue="1" /></text> </element>
- <element name="text_b5"> <rect><color red="0.59" green="0.39" blue="0.20" /></rect> <text string="&#x265b; 5"> <color red="1" green="1" blue="1" /></text> </element>
- <element name="text_b6"> <rect><color red="0.59" green="0.39" blue="0.20" /></rect> <text string="&#x265a; 6"> <color red="1" green="1" blue="1" /></text> </element>
- <element name="text_b7"> <rect><color red="0.59" green="0.39" blue="0.20" /></rect> <text string="&#x25a1; 7 &#x25c0;"> <color red="1" green="1" blue="1" /></text> </element>
- <element name="text_b8"> <rect><color red="0.59" green="0.39" blue="0.20" /></rect> <text string="&#x25a0; 8 &#x25b6;"> <color red="1" green="1" blue="1" /></text> </element>
+ <element name="text_b1"> <rect><color red="0.59" green="0.39" blue="0.20" /></rect> <text string="[P] 1"> <color red="1" green="1" blue="1" /></text> </element>
+ <element name="text_b2"> <rect><color red="0.59" green="0.39" blue="0.20" /></rect> <text string="[N] 2"> <color red="1" green="1" blue="1" /></text> </element>
+ <element name="text_b3"> <rect><color red="0.59" green="0.39" blue="0.20" /></rect> <text string="[B] 3"> <color red="1" green="1" blue="1" /></text> </element>
+ <element name="text_b4"> <rect><color red="0.59" green="0.39" blue="0.20" /></rect> <text string="[R] 4"> <color red="1" green="1" blue="1" /></text> </element>
+ <element name="text_b5"> <rect><color red="0.59" green="0.39" blue="0.20" /></rect> <text string="[Q] 5"> <color red="1" green="1" blue="1" /></text> </element>
+ <element name="text_b6"> <rect><color red="0.59" green="0.39" blue="0.20" /></rect> <text string="[K] 6"> <color red="1" green="1" blue="1" /></text> </element>
+ <element name="text_b7"> <rect><color red="0.59" green="0.39" blue="0.20" /></rect> <text string="&#x25a1; 7 &#x25c4;"> <color red="1" green="1" blue="1" /></text> </element>
+ <element name="text_b8"> <rect><color red="0.59" green="0.39" blue="0.20" /></rect> <text string="&#x25a0; 8 &#x25ba;"> <color red="1" green="1" blue="1" /></text> </element>
<element name="text_book9"> <rect><color red="0.59" green="0.39" blue="0.20" /></rect> <text string="BOOK 9"> <color red="1" green="1" blue="1" /></text> </element>
<element name="text_pos0"> <rect><color red="0.59" green="0.39" blue="0.20" /></rect> <text string="POS 0"> <color red="1" green="1" blue="1" /></text> </element>
<element name="text_cl"> <rect><color red="0.59" green="0.39" blue="0.20" /></rect> <text string="CL"> <color red="1" green="1" blue="1" /></text> </element>
diff --git a/src/mame/layout/mephisto_smondial2.lay b/src/mame/layout/mephisto_smondial2.lay
index 025cd47614a..1294e648ca4 100644
--- a/src/mame/layout/mephisto_smondial2.lay
+++ b/src/mame/layout/mephisto_smondial2.lay
@@ -68,14 +68,14 @@
<element name="text_pos"> <rect><color red="0" green="0" blue="0" /></rect> <text string="POS"> <color red="1" green="1" blue="1" /></text> </element>
<element name="text_mem"> <rect><color red="0" green="0" blue="0" /></rect> <text string="MEM"> <color red="1" green="1" blue="1" /></text> </element>
<element name="text_lev"> <rect><color red="0" green="0" blue="0" /></rect> <text string="LEV"> <color red="1" green="1" blue="1" /></text> </element>
- <element name="text_b1"> <rect><color red="0" green="0" blue="0" /></rect> <text string="&#x265f; 1"> <color red="1" green="1" blue="1" /></text> </element>
- <element name="text_b2"> <rect><color red="0" green="0" blue="0" /></rect> <text string="&#x265e; 2"> <color red="1" green="1" blue="1" /></text> </element>
- <element name="text_b3"> <rect><color red="0" green="0" blue="0" /></rect> <text string="&#x265d; 3"> <color red="1" green="1" blue="1" /></text> </element>
- <element name="text_b4"> <rect><color red="0" green="0" blue="0" /></rect> <text string="&#x265c; 4"> <color red="1" green="1" blue="1" /></text> </element>
- <element name="text_b5"> <rect><color red="0" green="0" blue="0" /></rect> <text string="&#x265b; 5"> <color red="1" green="1" blue="1" /></text> </element>
- <element name="text_b6"> <rect><color red="0" green="0" blue="0" /></rect> <text string="&#x265a; 6"> <color red="1" green="1" blue="1" /></text> </element>
- <element name="text_b7"> <rect><color red="0" green="0" blue="0" /></rect> <text string="&#x25a1; 7 &#x25c0;"> <color red="1" green="1" blue="1" /></text> </element>
- <element name="text_b8"> <rect><color red="0" green="0" blue="0" /></rect> <text string="&#x25a0; 8 &#x25b6;"> <color red="1" green="1" blue="1" /></text> </element>
+ <element name="text_b1"> <rect><color red="0" green="0" blue="0" /></rect> <text string="[P] 1"> <color red="1" green="1" blue="1" /></text> </element>
+ <element name="text_b2"> <rect><color red="0" green="0" blue="0" /></rect> <text string="[N] 2"> <color red="1" green="1" blue="1" /></text> </element>
+ <element name="text_b3"> <rect><color red="0" green="0" blue="0" /></rect> <text string="[B] 3"> <color red="1" green="1" blue="1" /></text> </element>
+ <element name="text_b4"> <rect><color red="0" green="0" blue="0" /></rect> <text string="[R] 4"> <color red="1" green="1" blue="1" /></text> </element>
+ <element name="text_b5"> <rect><color red="0" green="0" blue="0" /></rect> <text string="[Q] 5"> <color red="1" green="1" blue="1" /></text> </element>
+ <element name="text_b6"> <rect><color red="0" green="0" blue="0" /></rect> <text string="[K] 6"> <color red="1" green="1" blue="1" /></text> </element>
+ <element name="text_b7"> <rect><color red="0" green="0" blue="0" /></rect> <text string="&#x25a1; 7 &#x25c4;"> <color red="1" green="1" blue="1" /></text> </element>
+ <element name="text_b8"> <rect><color red="0" green="0" blue="0" /></rect> <text string="&#x25a0; 8 &#x25ba;"> <color red="1" green="1" blue="1" /></text> </element>
<element name="text_help9"> <rect><color red="0.8" green="0" blue="0" /></rect> <text string="HELP 9"> <color red="1" green="1" blue="1" /></text> </element>
<element name="text_info0"> <rect><color red="0" green="0" blue="0" /></rect> <text string="INFO 0"> <color red="1" green="1" blue="1" /></text> </element>
<element name="text_cl"> <rect><color red="0" green="0" blue="0" /></rect> <text string="CL"> <color red="1" green="1" blue="1" /></text> </element>
diff --git a/src/mame/layout/mk1.lay b/src/mame/layout/mk1.lay
index 532bd44a27b..301f9cde1e3 100644
--- a/src/mame/layout/mk1.lay
+++ b/src/mame/layout/mk1.lay
@@ -1,42 +1,268 @@
<?xml version="1.0"?>
<mamelayout version="2">
+
+<!-- define elements -->
+
+ <element name="black"><rect><color red="0.12" green="0.12" blue="0.12" /></rect></element>
+ <element name="black2"><rect><color red="0.16" green="0.16" blue="0.16" /></rect></element>
+ <element name="blackb"><rect><color red="0" green="0" blue="0" /></rect></element>
+ <element name="red"><rect><color red="0.8" green="0.2" blue="0.25" /></rect></element>
+
<element name="digit" defstate="0">
- <led7seg>
- <color red="0.75" green="0.0" blue="0.0" />
- </led7seg>
+ <led7seg><color red="1.0" green="0.1" blue="0.15" /></led7seg>
</element>
- <element name="led" defstate="0">
+ <element name="hl" defstate="0">
+ <text string=" ">
+ <bounds x="0.0" y="0.0" width="1.0" height="1.0" />
+ <color red="0.0" green="0.0" blue="0.0" />
+ </text>
+ <rect state="1">
+ <bounds x="0.0" y="0.0" width="1.0" height="1.0" />
+ <color red="0.0" green="0.0" blue="0.0" />
+ </rect>
+ </element>
+
+ <element name="reset" defstate="0">
+ <text string=" ">
+ <bounds x="0.0" y="0.0" width="3.7" height="1.8" />
+ <color red="0.0" green="0.0" blue="0.0" />
+ </text>
+ <disk state="0">
+ <bounds x="0.0" y="0.0" width="1.8" height="1.8" />
+ <color red="0.4" green="0.4" blue="0.4" />
+ </disk>
<disk state="1">
- <color red="0.75" green="0.0" blue="0.0" />
+ <bounds x="1.9" y="0.0" width="1.8" height="1.8" />
+ <color red="0.4" green="0.4" blue="0.4" />
</disk>
</element>
- <view name="Default Layout">
- <bezel name="digit0" element="digit">
- <bounds x="0" y="1" width="26" height="35" />
- </bezel>
- <bezel name="digit1" element="digit">
- <bounds x="37" y="0" width="26" height="35" />
- </bezel>
- <bezel name="digit2" element="digit">
- <bounds x="75" y="0" width="26" height="35" />
- </bezel>
- <bezel name="digit3" element="digit">
- <bounds x="111" y="0" width="26" height="35" />
- </bezel>
-
- <bezel name="led0" element="led">
- <bounds x="24" y="33" width="4" height="3" />
- </bezel>
- <bezel name="led1" element="led">
- <bounds x="61" y="32" width="4" height="3" />
- </bezel>
- <bezel name="led2" element="led">
- <bounds x="99" y="32" width="4" height="3" />
- </bezel>
- <bezel name="led3" element="led">
- <bounds x="135" y="32" width="4" height="3" />
- </bezel>
+ <element name="text_r1"><text string="L" align="1"><color red="0.3" green="0.3" blue="0.3" /></text></element>
+ <element name="text_r2"><text string="S" align="1"><color red="0.3" green="0.3" blue="0.3" /></text></element>
+
+ <element name="text_b01a">
+ <rect><color red="0.8" green="0.2" blue="0.25" /></rect>
+ <text string="A" align="2"><color red="0.86" green="0.86" blue="0.86" /></text>
+ </element>
+ <element name="text_b01b">
+ <rect><color red="0.8" green="0.2" blue="0.25" /></rect>
+ <text string="[K]" align="1"><color red="0.86" green="0.86" blue="0.86" /></text>
+ </element>
+ <element name="text_b02a">
+ <rect><color red="0.8" green="0.2" blue="0.25" /></rect>
+ <text string="B" align="2"><color red="0.86" green="0.86" blue="0.86" /></text>
+ </element>
+ <element name="text_b02b">
+ <rect><color red="0.8" green="0.2" blue="0.25" /></rect>
+ <text string="[Q]" align="1"><color red="0.86" green="0.86" blue="0.86" /></text>
+ </element>
+ <element name="text_b03a">
+ <rect><color red="0.8" green="0.2" blue="0.25" /></rect>
+ <text string="C" align="2"><color red="0.86" green="0.86" blue="0.86" /></text>
+ </element>
+ <element name="text_b03b">
+ <rect><color red="0.8" green="0.2" blue="0.25" /></rect>
+ <text string="[B]" align="1"><color red="0.86" green="0.86" blue="0.86" /></text>
+ </element>
+ <element name="text_b04a">
+ <rect><color red="0.8" green="0.2" blue="0.25" /></rect>
+ <text string="D" align="2"><color red="0.86" green="0.86" blue="0.86" /></text>
+ </element>
+ <element name="text_b04b">
+ <rect><color red="0.8" green="0.2" blue="0.25" /></rect>
+ <text string="PLAY"><color red="0.86" green="0.86" blue="0.86" /></text>
+ </element>
+ <element name="text_b05a">
+ <rect><color red="0.8" green="0.2" blue="0.25" /></rect>
+ <text string="E" align="2"><color red="0.86" green="0.86" blue="0.86" /></text>
+ </element>
+ <element name="text_b05b">
+ <rect><color red="0.8" green="0.2" blue="0.25" /></rect>
+ <text string="[N]" align="1"><color red="0.86" green="0.86" blue="0.86" /></text>
+ </element>
+ <element name="text_b06a">
+ <rect><color red="0.8" green="0.2" blue="0.25" /></rect>
+ <text string="F" align="2"><color red="0.86" green="0.86" blue="0.86" /></text>
+ </element>
+ <element name="text_b06b">
+ <rect><color red="0.8" green="0.2" blue="0.25" /></rect>
+ <text string="[R]" align="1"><color red="0.86" green="0.86" blue="0.86" /></text>
+ </element>
+ <element name="text_b07a">
+ <rect><color red="0.8" green="0.2" blue="0.25" /></rect>
+ <text string="G" align="2"><color red="0.86" green="0.86" blue="0.86" /></text>
+ </element>
+ <element name="text_b07b">
+ <rect><color red="0.8" green="0.2" blue="0.25" /></rect>
+ <text string="[P]" align="1"><color red="0.86" green="0.86" blue="0.86" /></text>
+ </element>
+ <element name="text_b08a">
+ <rect><color red="0.8" green="0.2" blue="0.25" /></rect>
+ <text string="H" align="2"><color red="0.86" green="0.86" blue="0.86" /></text>
+ </element>
+ <element name="text_b08b">
+ <rect><color red="0.8" green="0.2" blue="0.25" /></rect>
+ <text string="md"><color red="0.86" green="0.86" blue="0.86" /></text>
+ </element>
+
+ <element name="text_b09a">
+ <rect><color red="0.8" green="0.2" blue="0.25" /></rect>
+ <text string="1" align="2"><color red="0.03" green="0.03" blue="0.03" /></text>
+ </element>
+ <element name="text_b09b">
+ <rect><color red="0.8" green="0.2" blue="0.25" /></rect>
+ <text string="[K]" align="1"><color red="0.03" green="0.03" blue="0.03" /></text>
+ </element>
+ <element name="text_b10a">
+ <rect><color red="0.8" green="0.2" blue="0.25" /></rect>
+ <text string="2" align="2"><color red="0.03" green="0.03" blue="0.03" /></text>
+ </element>
+ <element name="text_b10b">
+ <rect><color red="0.8" green="0.2" blue="0.25" /></rect>
+ <text string="[Q]" align="1"><color red="0.03" green="0.03" blue="0.03" /></text>
+ </element>
+ <element name="text_b11a">
+ <rect><color red="0.8" green="0.2" blue="0.25" /></rect>
+ <text string="3" align="2"><color red="0.03" green="0.03" blue="0.03" /></text>
+ </element>
+ <element name="text_b11b">
+ <rect><color red="0.8" green="0.2" blue="0.25" /></rect>
+ <text string="[B]" align="1"><color red="0.03" green="0.03" blue="0.03" /></text>
+ </element>
+ <element name="text_b12a">
+ <rect><color red="0.8" green="0.2" blue="0.25" /></rect>
+ <text string="4" align="2"><color red="0.03" green="0.03" blue="0.03" /></text>
+ </element>
+ <element name="text_b12b">
+ <rect><color red="0.8" green="0.2" blue="0.25" /></rect>
+ <text string="fp"><color red="0.03" green="0.03" blue="0.03" /></text>
+ </element>
+ <element name="text_b13a">
+ <rect><color red="0.8" green="0.2" blue="0.25" /></rect>
+ <text string="5" align="2"><color red="0.03" green="0.03" blue="0.03" /></text>
+ </element>
+ <element name="text_b13b">
+ <rect><color red="0.8" green="0.2" blue="0.25" /></rect>
+ <text string="[N]" align="1"><color red="0.03" green="0.03" blue="0.03" /></text>
+ </element>
+ <element name="text_b14a">
+ <rect><color red="0.8" green="0.2" blue="0.25" /></rect>
+ <text string="6" align="2"><color red="0.03" green="0.03" blue="0.03" /></text>
+ </element>
+ <element name="text_b14b">
+ <rect><color red="0.8" green="0.2" blue="0.25" /></rect>
+ <text string="[R]" align="1"><color red="0.03" green="0.03" blue="0.03" /></text>
+ </element>
+ <element name="text_b15a">
+ <rect><color red="0.8" green="0.2" blue="0.25" /></rect>
+ <text string="7" align="2"><color red="0.03" green="0.03" blue="0.03" /></text>
+ </element>
+ <element name="text_b15b">
+ <rect><color red="0.8" green="0.2" blue="0.25" /></rect>
+ <text string="[P]" align="1"><color red="0.03" green="0.03" blue="0.03" /></text>
+ </element>
+ <element name="text_b16a">
+ <rect><color red="0.8" green="0.2" blue="0.25" /></rect>
+ <text string="8" align="2"><color red="0.03" green="0.03" blue="0.03" /></text>
+ </element>
+ <element name="text_b16b">
+ <rect><color red="0.8" green="0.2" blue="0.25" /></rect>
+ <text string="ep"><color red="0.03" green="0.03" blue="0.03" /></text>
+ </element>
+
+
+<!-- build screen -->
+
+ <view name="Internal Layout">
+ <bounds left="5.5" right="56.5" top="8.5" bottom="76.5" />
+
+ <bezel element="black2"><bounds left="7" right="55" top="10" bottom="75" /></bezel>
+ <bezel element="blackb"><bounds x="8.5" y="28.5" width="100" height="100" /></bezel>
+ <bezel element="blackb"><bounds x="0" y="0" width="53.5" height="27" /></bezel>
+
+ <!-- digit panel is actually on the left, but that would leave a large empty space in this internal layout -->
+ <bezel name="digit0" element="digit"><bounds x="15" y="10" width="8" height="12" /></bezel>
+ <bezel name="digit1" element="digit"><bounds x="23" y="10" width="8" height="12" /></bezel>
+ <bezel name="digit2" element="digit"><bounds x="31" y="10" width="8" height="12" /></bezel>
+ <bezel name="digit3" element="digit"><bounds x="39" y="10" width="8" height="12" /></bezel>
+
+ <bezel element="black"><bounds x="17" y="23.8" width="3.5" height="1.4" /></bezel>
+ <bezel element="text_r1"><bounds x="15" y="23.5" width="5" height="2" /></bezel>
+ <bezel element="text_r2"><bounds x="21.5" y="23.5" width="5.4" height="2" /></bezel>
+ <bezel element="reset" inputtag="RESET" inputmask="0x01"><bounds x="16.9" y="23.6" width="3.7" height="1.8" /></bezel>
+
+ <!-- button panel -->
+
+ <bezel element="red"><bounds x="10" y="30" width="9" height="9" /></bezel>
+ <bezel element="red"><bounds x="22" y="30" width="9" height="9" /></bezel>
+ <bezel element="red"><bounds x="34" y="30" width="9" height="9" /></bezel>
+ <bezel element="red"><bounds x="46" y="30" width="9" height="9" /></bezel>
+ <bezel element="red"><bounds x="10" y="42" width="9" height="9" /></bezel>
+ <bezel element="red"><bounds x="22" y="42" width="9" height="9" /></bezel>
+ <bezel element="red"><bounds x="34" y="42" width="9" height="9" /></bezel>
+ <bezel element="red"><bounds x="46" y="42" width="9" height="9" /></bezel>
+ <bezel element="red"><bounds x="10" y="54" width="9" height="9" /></bezel>
+ <bezel element="red"><bounds x="22" y="54" width="9" height="9" /></bezel>
+ <bezel element="red"><bounds x="34" y="54" width="9" height="9" /></bezel>
+ <bezel element="red"><bounds x="46" y="54" width="9" height="9" /></bezel>
+ <bezel element="red"><bounds x="10" y="66" width="9" height="9" /></bezel>
+ <bezel element="red"><bounds x="22" y="66" width="9" height="9" /></bezel>
+ <bezel element="red"><bounds x="34" y="66" width="9" height="9" /></bezel>
+ <bezel element="red"><bounds x="46" y="66" width="9" height="9" /></bezel>
+
+ <bezel element="text_b01b"><bounds x="10.6" y="30.1" width="8.0" height="4" /></bezel>
+ <bezel element="text_b01a"><bounds x="14.5" y="34.5" width="3.5" height="4" /></bezel>
+ <bezel element="text_b02b"><bounds x="22.6" y="30.1" width="8.0" height="4" /></bezel>
+ <bezel element="text_b02a"><bounds x="26.5" y="34.5" width="3.5" height="4" /></bezel>
+ <bezel element="text_b03b"><bounds x="34.6" y="30.1" width="8.0" height="4" /></bezel>
+ <bezel element="text_b03a"><bounds x="38.5" y="34.5" width="3.5" height="4" /></bezel>
+ <bezel element="text_b04b"><bounds x="46.1" y="30.5" width="7" height="3" /></bezel>
+ <bezel element="text_b04a"><bounds x="50.5" y="34.5" width="3.5" height="4" /></bezel>
+
+ <bezel element="text_b05b"><bounds x="10.6" y="42.1" width="8.0" height="4" /></bezel>
+ <bezel element="text_b05a"><bounds x="14.5" y="46.5" width="3.5" height="4" /></bezel>
+ <bezel element="text_b06b"><bounds x="22.6" y="42.1" width="8.0" height="4" /></bezel>
+ <bezel element="text_b06a"><bounds x="26.5" y="46.5" width="3.5" height="4" /></bezel>
+ <bezel element="text_b07b"><bounds x="34.6" y="42.1" width="8.0" height="4" /></bezel>
+ <bezel element="text_b07a"><bounds x="38.5" y="46.5" width="3.5" height="4" /></bezel>
+ <bezel element="text_b08b"><bounds x="46.1" y="42.5" width="5.5" height="3" /></bezel>
+ <bezel element="text_b08a"><bounds x="50.5" y="46.5" width="3.5" height="4" /></bezel>
+
+ <bezel element="text_b09b"><bounds x="10.6" y="54.1" width="8.0" height="4" /></bezel>
+ <bezel element="text_b09a"><bounds x="14.5" y="58.5" width="3.5" height="4" /></bezel>
+ <bezel element="text_b10b"><bounds x="22.6" y="54.1" width="8.0" height="4" /></bezel>
+ <bezel element="text_b10a"><bounds x="26.5" y="58.5" width="3.5" height="4" /></bezel>
+ <bezel element="text_b11b"><bounds x="34.6" y="54.1" width="8.0" height="4" /></bezel>
+ <bezel element="text_b11a"><bounds x="38.5" y="58.5" width="3.5" height="4" /></bezel>
+ <bezel element="text_b12b"><bounds x="46.1" y="54.5" width="5" height="3" /></bezel>
+ <bezel element="text_b12a"><bounds x="50.5" y="58.5" width="3.5" height="4" /></bezel>
+
+ <bezel element="text_b13b"><bounds x="10.6" y="66.1" width="8.0" height="4" /></bezel>
+ <bezel element="text_b13a"><bounds x="14.5" y="70.5" width="3.5" height="4" /></bezel>
+ <bezel element="text_b14b"><bounds x="22.6" y="66.1" width="8.0" height="4" /></bezel>
+ <bezel element="text_b14a"><bounds x="26.5" y="70.5" width="3.5" height="4" /></bezel>
+ <bezel element="text_b15b"><bounds x="34.6" y="66.1" width="8.0" height="4" /></bezel>
+ <bezel element="text_b15a"><bounds x="38.5" y="70.5" width="3.5" height="4" /></bezel>
+ <bezel element="text_b16b"><bounds x="46.1" y="66.5" width="5.5" height="3" /></bezel>
+ <bezel element="text_b16a"><bounds x="50.5" y="70.5" width="3.5" height="4" /></bezel>
+
+ <bezel element="hl" inputtag="LINE1" inputmask="0x80"><bounds x="10" y="30" width="9" height="9" /><color alpha="0.25" /></bezel>
+ <bezel element="hl" inputtag="LINE1" inputmask="0x40"><bounds x="22" y="30" width="9" height="9" /><color alpha="0.25" /></bezel>
+ <bezel element="hl" inputtag="LINE1" inputmask="0x20"><bounds x="34" y="30" width="9" height="9" /><color alpha="0.25" /></bezel>
+ <bezel element="hl" inputtag="LINE1" inputmask="0x10"><bounds x="46" y="30" width="9" height="9" /><color alpha="0.25" /></bezel>
+ <bezel element="hl" inputtag="LINE2" inputmask="0x80"><bounds x="10" y="42" width="9" height="9" /><color alpha="0.25" /></bezel>
+ <bezel element="hl" inputtag="LINE2" inputmask="0x40"><bounds x="22" y="42" width="9" height="9" /><color alpha="0.25" /></bezel>
+ <bezel element="hl" inputtag="LINE2" inputmask="0x20"><bounds x="34" y="42" width="9" height="9" /><color alpha="0.25" /></bezel>
+ <bezel element="hl" inputtag="LINE2" inputmask="0x10"><bounds x="46" y="42" width="9" height="9" /><color alpha="0.25" /></bezel>
+ <bezel element="hl" inputtag="LINE3" inputmask="0x80"><bounds x="10" y="54" width="9" height="9" /><color alpha="0.25" /></bezel>
+ <bezel element="hl" inputtag="LINE3" inputmask="0x40"><bounds x="22" y="54" width="9" height="9" /><color alpha="0.25" /></bezel>
+ <bezel element="hl" inputtag="LINE3" inputmask="0x20"><bounds x="34" y="54" width="9" height="9" /><color alpha="0.25" /></bezel>
+ <bezel element="hl" inputtag="LINE3" inputmask="0x10"><bounds x="46" y="54" width="9" height="9" /><color alpha="0.25" /></bezel>
+ <bezel element="hl" inputtag="LINE4" inputmask="0x80"><bounds x="10" y="66" width="9" height="9" /><color alpha="0.25" /></bezel>
+ <bezel element="hl" inputtag="LINE4" inputmask="0x40"><bounds x="22" y="66" width="9" height="9" /><color alpha="0.25" /></bezel>
+ <bezel element="hl" inputtag="LINE4" inputmask="0x20"><bounds x="34" y="66" width="9" height="9" /><color alpha="0.25" /></bezel>
+ <bezel element="hl" inputtag="LINE4" inputmask="0x10"><bounds x="46" y="66" width="9" height="9" /><color alpha="0.25" /></bezel>
+
</view>
</mamelayout>
diff --git a/src/mame/layout/modulab.lay b/src/mame/layout/modulab.lay
new file mode 100644
index 00000000000..b2bcac75167
--- /dev/null
+++ b/src/mame/layout/modulab.lay
@@ -0,0 +1,429 @@
+<?xml version="1.0"?>
+<!--
+license:CC0
+copyright-holders:Joakim Larsson Edstrom
+Esselte Studium Modulab layout
+-->
+<mamelayout version="2">
+ <element name="text_0"><text string="0"><color red="0.7" green="0.7" blue="0.7" /></text></element>
+ <element name="text_1"><text string="1"><color red="0.7" green="0.7" blue="0.7" /></text></element>
+ <element name="text_2"><text string="2"><color red="0.7" green="0.7" blue="0.7" /></text></element>
+ <element name="text_3"><text string="3"><color red="0.7" green="0.7" blue="0.7" /></text></element>
+ <element name="text_4"><text string="4"><color red="0.7" green="0.7" blue="0.7" /></text></element>
+ <element name="text_5"><text string="5"><color red="0.7" green="0.7" blue="0.7" /></text></element>
+ <element name="text_6"><text string="6"><color red="0.7" green="0.7" blue="0.7" /></text></element>
+ <element name="text_7"><text string="7"><color red="0.7" green="0.7" blue="0.7" /></text></element>
+ <element name="text_8"><text string="8"><color red="0.7" green="0.7" blue="0.7" /></text></element>
+ <element name="text_9"><text string="9"><color red="0.7" green="0.7" blue="0.7" /></text></element>
+ <element name="text_10"><text string="A"><color red="0.7" green="0.7" blue="0.7" /></text></element>
+ <element name="text_11"><text string="B"><color red="0.7" green="0.7" blue="0.7" /></text></element>
+ <element name="text_12"><text string="C"><color red="0.7" green="0.7" blue="0.7" /></text></element>
+ <element name="text_13"><text string="D"><color red="0.7" green="0.7" blue="0.7" /></text></element>
+ <element name="text_14"><text string="E"><color red="0.7" green="0.7" blue="0.7" /></text></element>
+ <element name="text_15"><text string="F"><color red="0.7" green="0.7" blue="0.7" /></text></element>
+ <element name="text_run"><text string="RUN"><color red="0.7" green="0.7" blue="0.7" /></text></element>
+ <element name="text_ads"><text string="ADS"><color red="0.7" green="0.7" blue="0.7" /></text></element>
+ <element name="text_fwd"><text string="FWD"><color red="0.7" green="0.7" blue="0.7" /></text></element>
+ <element name="text_cb"><text string="C/B"><color red="0.7" green="0.7" blue="0.7" /></text></element>
+ <element name="text_rst"><text string="RST"><color red="0.7" green="0.7" blue="0.7" /></text></element>
+ <element name="text_esselte"><text string="ESSELTE"><color red="0.7" green="0.7" blue="0.7" /></text></element>
+ <element name="text_studium"><text string="STUDIUM"><color red="0.7" green="0.7" blue="0.7" /></text></element>
+ <element name="text_adress"><text string="ADRESS"><color red="0.7" green="0.7" blue="0.7" /></text></element>
+ <element name="text_data"><text string="DATA"><color red="0.7" green="0.7" blue="0.7" /></text></element>
+ <element name="pcb_blue"> <rect><color red="0.0" green="0.0" blue="0.49" /></rect></element>
+ <element name="silver"> <rect><color red="0.75" green="0.75" blue="0.75" /></rect></element>
+ <element name="black"> <rect><color red="0.0" green="0.0" blue="0.0" /></rect></element>
+ <element name="brown"> <rect><color red="0.18" green="0.08" blue="0.03" /></rect></element>
+ <element name="text_164"><text string="'164"><color red="0.7" green="0.7" blue="0.7" /></text></element>
+ <element name="text_ls14"><text string="'14"><color red="0.7" green="0.7" blue="0.7" /></text></element>
+ <element name="text_138"><text string="'138"><color red="0.7" green="0.7" blue="0.7" /></text></element>
+ <element name="text_123"><text string="'123"><color red="0.7" green="0.7" blue="0.7" /></text></element>
+ <element name="text_367"><text string="'367"><color red="0.7" green="0.7" blue="0.7" /></text></element>
+ <element name="text_923"><text string="C923"><color red="0.7" green="0.7" blue="0.7" /></text></element>
+ <element name="text_6116"><text string="RAM HM6116P"><color red="0.7" green="0.7" blue="0.7" /></text></element>
+ <element name="text_2764"><text string="ROM M2764AFI"><color red="0.7" green="0.7" blue="0.7" /></text></element>
+ <element name="text_6802"><text string="CPU MC6802P"><color red="0.7" green="0.7" blue="0.7" /></text></element>
+ <element name="text_8154"><text string="PIO INS8154N"><color red="0.7" green="0.7" blue="0.7" /></text></element>
+ <element name="text_4mhz"><text string="4.000"><color red="0.6" green="0.6" blue="0.6" /></text></element>
+ <element name="text_sunny"><text string="SUNNY"><color red="0.6" green="0.6" blue="0.6" /></text></element>
+ <element name="text_irq"><text string="IRQ"><color red="0.6" green="0.6" blue="0.6" /></text></element>
+ <element name="text_porta"><text string="PORT A"><color red="0.6" green="0.6" blue="0.6" /></text></element>
+ <element name="text_portb"><text string="PORT B"><color red="0.6" green="0.6" blue="0.6" /></text></element>
+ <element name="text_vcc"><text string="VCC"><color red="0.6" green="0.6" blue="0.6" /></text></element>
+ <element name="text_gnd"><text string="GND"><color red="0.6" green="0.6" blue="0.6" /></text></element>
+ <element name="text_r"><text string="R"><color red="0.6" green="0.6" blue="0.6" /></text></element>
+
+ <element name="brownkey">
+ <rect><bounds x="0" y="0" width="10" height="10" /> <color red="0.43" green="0.33" blue="0.23" /></rect>
+ <disk><bounds x="0.5" y="0.5" width="9" height="9" /><color red="0.23" green="0.13" blue="0.03" /></disk>
+ <disk><bounds x="1" y="1" width="8" height="8" /> <color red="0.33" green="0.23" blue="0.13" /></disk>
+ <rect><bounds x="2" y="0.5" width="6" height="1.5" /><color red="0.23" green="0.13" blue="0.03" /></rect>
+ <rect><bounds x="1" y="0.5" width="8" height="1.0" /><color red="0.43" green="0.33" blue="0.23" /></rect>
+ <!-- Rounded corners -->
+ <rect><bounds x="0" y="0" width="1" height="1" /><color red="0" green="0" blue="0" /></rect>
+ <disk><bounds x="0" y="0" width="2" height="2" /><color red="0.43" green="0.33" blue="0.23" /></disk>
+ <rect><bounds x="9" y="0" width="1" height="1" /><color red="0" green="0" blue="0" /></rect>
+ <disk><bounds x="8" y="0" width="2" height="2" /><color red="0.43" green="0.33" blue="0.23" /></disk>
+ <rect><bounds x="9" y="9" width="1" height="1" /><color red="0" green="0" blue="0" /></rect>
+ <disk><bounds x="8" y="8" width="2" height="2" /><color red="0.43" green="0.33" blue="0.23" /></disk>
+ <rect><bounds x="0" y="9" width="1" height="1" /><color red="0" green="0" blue="0" /></rect>
+ <disk><bounds x="0" y="8" width="2" height="2" /><color red="0.43" green="0.33" blue="0.23" /></disk>
+ </element>
+
+ <element name="redkey">
+ <rect><bounds x="0" y="0" width="10" height="10" /> <color red="0.85" green="0.18" blue="0.16" /></rect>
+ <disk><bounds x="0.5" y="0.5" width="9" height="9" /><color red="0.65" green="0.00" blue="0.00" /></disk>
+ <disk><bounds x="1" y="1" width="8" height="8" /> <color red="0.75" green="0.08" blue="0.06" /></disk>
+ <rect><bounds x="2" y="0.5" width="6" height="1.5" /><color red="0.65" green="0.00" blue="0.00" /></rect>
+ <rect><bounds x="1" y="0.5" width="8" height="1.0" /><color red="0.85" green="0.18" blue="0.16" /></rect>
+ <!-- Rounded corners -->
+ <rect><bounds x="0" y="0" width="1" height="1" /><color red="0" green="0" blue="0" /></rect>
+ <disk><bounds x="0" y="0" width="2" height="2" /><color red="0.85" green="0.18" blue="0.16" /></disk>
+ <rect><bounds x="9" y="0" width="1" height="1" /><color red="0" green="0" blue="0" /></rect>
+ <disk><bounds x="8" y="0" width="2" height="2" /><color red="0.85" green="0.18" blue="0.16" /></disk>
+ <rect><bounds x="9" y="9" width="1" height="1" /><color red="0" green="0" blue="0" /></rect>
+ <disk><bounds x="8" y="8" width="2" height="2" /><color red="0.85" green="0.18" blue="0.16" /></disk>
+ <rect><bounds x="0" y="9" width="1" height="1" /><color red="0" green="0" blue="0" /></rect>
+ <disk><bounds x="0" y="8" width="2" height="2" /><color red="0.85" green="0.18" blue="0.16" /></disk>
+ </element>
+
+ <element name="greenkey">
+ <rect><bounds x="0" y="0" width="10" height="10" /> <color red="0.24" green="0.64" blue="0.28" /></rect>
+ <disk><bounds x="0.5" y="0.5" width="9" height="9" /><color red="0.04" green="0.44" blue="0.08" /></disk>
+ <disk><bounds x="1" y="1" width="8" height="8" /> <color red="0.14" green="0.54" blue="0.18" /></disk>
+ <rect><bounds x="2" y="0.5" width="6" height="1.5" /><color red="0.04" green="0.44" blue="0.08" /></rect>
+ <rect><bounds x="1" y="0.5" width="8" height="1.0" /><color red="0.24" green="0.64" blue="0.28" /></rect>
+ <!-- Rounded corners -->
+ <rect><bounds x="0" y="0" width="1" height="1" /><color red="0" green="0" blue="0" /></rect>
+ <disk><bounds x="0" y="0" width="2" height="2" /><color red="0.24" green="0.64" blue="0.28" /></disk>
+ <rect><bounds x="9" y="0" width="1" height="1" /><color red="0" green="0" blue="0" /></rect>
+ <disk><bounds x="8" y="0" width="2" height="2" /><color red="0.24" green="0.64" blue="0.28" /></disk>
+ <rect><bounds x="9" y="9" width="1" height="1" /><color red="0" green="0" blue="0" /></rect>
+ <disk><bounds x="8" y="8" width="2" height="2" /><color red="0.24" green="0.64" blue="0.28" /></disk>
+ <rect><bounds x="0" y="9" width="1" height="1" /><color red="0" green="0" blue="0" /></rect>
+ <disk><bounds x="0" y="8" width="2" height="2" /><color red="0.24" green="0.64" blue="0.28" /></disk>
+ </element>
+
+ <element name="mount">
+ <disk><bounds x="0" y="0" width="100" height="100" /><color red="0.64" green="0.64" blue="0.64" /></disk>
+ <disk><bounds x="22" y="22" width="56" height="56" /><color red="0.54" green="0.54" blue="0.54" /></disk>
+ <disk><bounds x="30" y="30" width="40" height="40" /><color red="0.0" green="0.0" blue="0.0" /></disk>
+ </element>
+
+ <element name="screwhead">
+ <disk><bounds x="0" y="0" width="100" height="100" /><color red="1" green="1" blue="1" /></disk>
+ <disk><bounds x="2" y="2" width="96" height="96" /> <color red="0" green="0" blue="0" /></disk>
+ <disk><bounds x="5" y="5" width="90" height="90" /> <color red="0.8" green="0.8" blue="0.8" /></disk>
+ </element>
+
+ <element name="hole">
+ <disk><bounds x="0" y="0" width="100" height="100" /><color red="0" green="0" blue="0" /></disk>
+ </element>
+
+ <group name="screw">
+ <bezel element="screwhead"><bounds x="0" y="0" width="100" height="100" /></bezel>
+ <repeat count="50">
+ <param name="x1" start="25" increment="1" />
+ <param name="x2" start="75" increment="-1" />
+ <param name="y" start="25" increment="1" />
+ <bezel element="hole"><bounds x="~x1~" y="~y~" width="8" height="8" /></bezel>
+ <bezel element="hole"><bounds x="~x2~" y="~y~" width="8" height="8" /></bezel>
+ </repeat>
+ </group>
+
+ <element name="pin">
+ <disk><bounds x="0" y="0" width="100" height="100" /><color red="0.64" green="0.64" blue="0.64" /></disk>
+ <disk><bounds x="23" y="23" width="54" height="54" /><color red="0.0" green="0.0" blue="0.0" /></disk>
+ <disk><bounds x="30" y="30" width="38" height="38" /><color red="0.84" green="0.84" blue="0.84" /></disk>
+ </element>
+
+ <element name="trim">
+ <rect><bounds x="0" y="0" width="100" height="100" /><color red="0.0" green="0.0" blue="0.0" /></rect>
+ <disk><bounds x="30" y="30" width="40" height="40" /><color red="0.9" green="0.9" blue="0.9" /></disk>
+ <rect><bounds x="47" y="0" width="6" height="100" /><color red="0.0" green="0.0" blue="0.0" /></rect>
+ </element>
+
+ <element name="amp">
+ <rect><bounds x="115" y="0" width="175" height="905" /><color red="0.1" green="0.1" blue="0.1" /></rect> <!-- body -->
+
+ <rect><bounds x="0" y="0" width="125" height="50" /><color red="0.1" green="0.1" blue="0.1" /></rect> <!-- upper jaw -->
+
+ <rect><bounds x="90" y="0" width="25" height="155" /><color red="0.1" green="0.1" blue="0.1" /></rect> <!-- upper parts -->
+ <rect><bounds x="90" y="200" width="25" height="230" /><color red="0.1" green="0.1" blue="0.1" /></rect>
+
+ <rect><bounds x="115" y="430" width="100" height="55" /><color red="0.3" green="0.3" blue="0.3" /></rect><!-- mid gap -->
+ <rect><bounds x="100" y="453" width="115" height="7" /><color red="0.9" green="0.9" blue="0.9" /></rect> <!-- pin -->
+
+ <rect><bounds x="90" y="485" width="25" height="230" /><color red="0.1" green="0.1" blue="0.1" /></rect> <!-- lower parts -->
+ <rect><bounds x="90" y="750" width="25" height="155" /><color red="0.1" green="0.1" blue="0.1" /></rect>
+
+ <rect><bounds x="0" y="855" width="125" height="50" /><color red="0.1" green="0.1" blue="0.1" /></rect> <!-- lower jaw -->
+ </element>
+
+ <element name="xtal">
+ <rect><bounds x="4" y="0" width="143" height="185" /><color red="0.8" green="0.78" blue="0.63" /></rect>
+ <rect><bounds x="0" y="185" width="151" height="4" /><color red="0.6" green="0.58" blue="0.43" /></rect>
+ <rect><bounds x="45" y="189" width="3" height="45" /><color red="0.6" green="0.58" blue="0.43" /></rect>
+ <rect><bounds x="106" y="189" width="3" height="45" /><color red="0.6" green="0.58" blue="0.43" /></rect>
+ </element>
+
+ <group name="hdip">
+ <bezel element="~col~"><bounds x="10" y="20" width="~w~" height="~h~" /></bezel>
+ <bezel element="~t~"><bounds x="30" y="30" width="~tw~" height="~th~" /></bezel>
+ <repeat count="~c~">
+ <param name="x" start="15" increment="35" />
+ <bezel element="silver"><bounds y="10" x="~x~" width="25" height="10" /></bezel>
+ <bezel element="silver"><bounds y="~b~" x="~x~" width="25" height="10" /></bezel>
+ </repeat>
+ </group>
+
+ <group name="vdip">
+ <bezel element="~col~"><bounds x="20" y="10" width="80" height="~h~" /></bezel>
+ <bezel element="~t~"><bounds x="30" y="30" width="60" height="30" /></bezel>
+ <repeat count="~c~">
+ <param name="y" start="15" increment="35" />
+ <bezel element="silver"><bounds x="10" y="~y~" width="10" height="25" /></bezel>
+ <bezel element="silver"><bounds x="100" y="~y~" width="10" height="25" /></bezel>
+ </repeat>
+ </group>
+
+ <group name="key">
+ <bezel element="~keycol~" inputtag="LINE~line~" inputmask="~mask~">
+ <bounds x="~x~" y="~y~" width="262" height="262" />
+ </bezel>
+ <bezel element="text_~bname~">
+ <bounds x="~xt~" y="~yt~" width="150" height="150" />
+ </bezel>
+ </group>
+
+ <element name="digit" defstate="1">
+ <led7seg>
+ <color red="0.75" green="0.0" blue="0.0" />
+ </led7seg>
+ </element>
+
+ <group name="digit">
+ <bezel name="digit~dno~" element="digit">
+ <bounds x="~x~" y="~y~" width="188" height="276" />
+ </bezel>
+ </group>
+
+ <element name="plexi">
+ <rect><bounds x="0" y="1784" width="300" height="596" /></rect> <!-- below side connector -->
+ <rect><bounds x="300" y="500" width="1040" height="1880" /></rect> <!-- below port pins -->
+ <rect><bounds x="1340" y="0" width="388" height="2380" /></rect> <!-- between CPU and keyboard -->
+ <rect><bounds x="1728" y="0" width="1402" height="810" /></rect> <!-- Above keyboard -->
+ <rect><bounds x="1728" y="2200" width="1402" height="180" /></rect> <!-- Below keyboard -->
+ <rect><bounds x="2830" y="1096" width="300" height="1280" /></rect> <!-- Right of keyboard -->
+ <rect><bounds x="3100" y="810" width="30" height="286" /></rect> <!-- Right of RST key -->
+ </element>
+
+ <group name="hood">
+ <bezel element="plexi" />
+ </group>
+
+ <group name="pcb">
+ <backdrop element="pcb_blue"><bounds left="0" top="0" right="3200" bottom="2400"/></backdrop>
+ <bezel element="text_esselte"><bounds x="164" y="2044" width="264" height="52" /></bezel>
+ <bezel element="text_studium"><bounds x="164" y="2110" width="264" height="52" /></bezel>
+
+ <!-- Key pad -->
+ <bezel element="black"><bounds x="1780" y="818" width="1110" height="1395" /></bezel>
+ <bezel element="black"><bounds x="1780" y="818" width="1390" height="280" /></bezel>
+ <param name="keycol" value="brownkey" />
+ <repeat count="4">
+ <param name="bname" start="0" increment="1" />
+ <param name="line" start="0" increment="1" />
+ <param name="x" start="1780" increment="280" />
+ <param name="xt" start="1835" increment="280" />
+ <repeat count="4">
+ <param name="bname" start="~bname~" increment="4" />
+ <param name="mask" start="1" lshift="1" />
+ <param name="y" start="1950" increment="-280" />
+ <param name="yt" start="2020" increment="-280" />
+ <group ref="key"/>
+ </repeat>
+ </repeat>
+ <!-- Special Keys -->
+ <!-- RUN key -->
+ <param name="keycol" value="greenkey" />
+ <param name="bname" value="run" />
+ <param name="line" value="0" />
+ <param name="x" value="1780" />
+ <param name="xt" value="1835" />
+ <param name="mask" value="0x10" />
+ <param name="y" value="824" />
+ <param name="yt" value="888" />
+ <group ref="key"/>
+ <!-- ADS key -->
+ <param name="keycol" value="brownkey" />
+ <param name="bname" value="ads" />
+ <param name="line" value="1" />
+ <param name="x" value="2060" />
+ <param name="xt" value="2115" />
+ <group ref="key"/>
+ <!-- FWD key -->
+ <param name="bname" value="fwd" />
+ <param name="line" value="2" />
+ <param name="x" value="2340" />
+ <param name="xt" value="2395" />
+ <group ref="key"/>
+ <!-- C/B key -->
+ <param name="bname" value="cb" />
+ <param name="line" value="3" />
+ <param name="x" value="2620" />
+ <param name="xt" value="2675" />
+ <group ref="key"/>
+ <!-- RESET key -->
+ <param name="keycol" value="redkey" />
+ <param name="bname" value="rst" />
+ <param name="line" value="4" />
+ <param name="x" value="2900" />
+ <param name="xt" value="2955" />
+ <param name="mask" value="0x04" />
+ <group ref="key"/>
+
+ <!-- BCD 7seg display -->
+ <!--Adress-->
+ <bezel element="text_adress"><bounds x="1820" y="44" width="228" height="52" /></bezel>
+ <param name="y" value="222" />
+ <param name="h" value="240" />
+ <param name="c" value="7" />
+ <param name="col" value="brown"/>
+ <param name="t" value="text_164"/>
+ <repeat count="4">
+ <param name="dno" start="5" increment="-1" />
+ <param name="x" start="1472" increment="224" />
+ <group ref="digit" />
+ <param name="xdip" start="1512" increment="224" />
+ <group ref="vdip"><bounds x="~xdip~" y="528" width="100" height="270" /></group>
+ </repeat>
+ <!--Data-->
+ <bezel element="text_data"><bounds x="2532" y="44" width="156" height="52" /></bezel>
+ <repeat count="2">
+ <param name="dno" start="1" increment="-1" />
+ <param name="x" start="2428" increment="224" />
+ <param name="xdip" start="2468" increment="224" />
+ <param name="xdipt" start="2489" increment="224" />
+ <group ref="digit" />
+ <group ref="vdip"><bounds x="~xdip~" y="528" width="100" height="270" /></group>
+ </repeat>
+
+ <!--scattered IC:s -->
+ <param name="t" value="text_ls14"/>
+ <group ref="vdip"><bounds x="1512" y="890" width="100" height="270" /></group>
+ <param name="c" value="8"/>
+ <param name="h" value="280"/>
+ <param name="t" value="text_138"/>
+ <group ref="vdip"><bounds x="1512" y="1236" width="100" height="320" /></group>
+ <group ref="vdip"><bounds x="1512" y="2040" width="100" height="320" /></group>
+ <param name="w" value="280"/>
+ <param name="h" value="80"/>
+ <param name="b" value="100"/>
+ <param name="t" value="text_367"/>
+ <param name="th" value="30"/>
+ <param name="tw" value="60"/>
+ <group ref="hdip"><bounds x="1110" y="2160" width="320" height="100" /></group>
+ <param name="t" value="text_123"/>
+ <group ref="hdip"><bounds x="600" y="2160" width="320" height="100" /></group>
+ <param name="c" value="10" />
+ <param name="h" value="350" />
+ <param name="t" value="text_923"/>
+ <group ref="vdip"><bounds x="1512" y="1590" width="100" height="400" /></group>
+
+ <!-- larger IC:s -->
+ <param name="h" value="260"/>
+ <param name="b" value="280"/>
+ <param name="col" value="black"/>
+ <param name="c" value="12"/>
+ <param name="w" value="420"/>
+ <param name="t" value="text_6116"/>
+ <param name="th" value="40"/>
+ <param name="tw" value="240"/>
+ <group ref="hdip"><bounds x="725" y="1875" width="~w~" height="~h~" /></group> <!-- RAM -->
+ <param name="col" value="brown"/>
+ <param name="c" value="14"/>
+ <param name="w" value="490"/>
+ <param name="t" value="text_2764"/>
+ <group ref="hdip"><bounds x="655" y="1600" width="~w~" height="~h~" /></group> <!-- ROM -->
+ <param name="c" value="20"/>
+ <param name="w" value="700"/>
+ <param name="t" value="text_6802"/>
+ <group ref="hdip"><bounds x="655" y="1240" width="~w~" height="~h~" /></group> <!-- CPU -->
+ <param name="t" value="text_8154"/>
+ <group ref="hdip"><bounds x="655" y="900" width="~w~" height="~h~" /></group> <!-- INS8154 -->
+
+
+ <!-- descrete components -->
+ <bezel element="xtal"><bounds x="410" y="995" width="160" height="240" /></bezel>
+ <bezel element="text_4mhz"><bounds x="420" y="1025" width="140" height="40" /></bezel>
+ <bezel element="text_sunny"><bounds x="420" y="1075" width="140" height="40" /></bezel>
+
+ <!-- mount holes -->
+ <bezel element="mount"><bounds x="250" y="2300" width="75" height="75" /></bezel>
+ <bezel element="mount"><bounds x="1700" y="2300" width="75" height="75" /></bezel>
+ <bezel element="mount"><bounds x="2860" y="2300" width="75" height="75" /></bezel>
+ <bezel element="mount"><bounds x="250" y="30" width="75" height="75" /></bezel>
+ <bezel element="mount"><bounds x="1700" y="30" width="75" height="75" /></bezel>
+ <bezel element="mount"><bounds x="2860" y="30" width="75" height="75" /></bezel>
+ <bezel element="mount"><bounds x="1170" y="630" width="75" height="75" /></bezel>
+
+ <!-- pins -->
+ <!-- IRQ -->
+ <bezel element="pin"><bounds x="440" y="1450" width="30" height="30" /></bezel>
+ <bezel element="text_irq"><bounds x="400" y="1395" width="120" height="50" /></bezel>
+ <!-- Ports -->
+ <repeat count="8">
+ <param name="tid" start="7" increment="-1" />
+ <param name="xp" start="180" increment="150" />
+ <param name="txp" start="100" increment="150" />
+ <repeat count="2">
+ <param name="yp" start="280" increment="140" />
+ <param name="typ" start="275" increment="140" />
+ <bezel element="pin"><bounds x="~xp~" y="~yp~" width="30" height="30" /></bezel>
+ <bezel element="text_~tid~"><bounds x="~txp~" y="~typ~" width="120" height="50" /></bezel>
+ </repeat>
+ </repeat>
+ <bezel element="text_porta"><bounds x="350" y="200" width="500" height="75" /></bezel>
+ <bezel element="text_portb"><bounds x="350" y="340" width="500" height="75" /></bezel>
+ <!-- power feed -->
+ <bezel element="pin"><bounds x="150" y="575" width="30" height="30" /></bezel>
+ <bezel element="text_vcc"><bounds x="150" y="615" width="100" height="50" /></bezel>
+ <bezel element="pin"><bounds x="150" y="710" width="30" height="30" /></bezel>
+ <bezel element="text_gnd"><bounds x="150" y="660" width="100" height="50" /></bezel>
+ <!-- R pins -->
+ <bezel element="pin"><bounds x="3050" y="1740" width="30" height="30" /></bezel>
+ <bezel element="text_r"><bounds x="2950" y="1735" width="100" height="50" /></bezel>
+ <bezel element="pin"><bounds x="3050" y="1890" width="30" height="30" /></bezel>
+ <bezel element="text_r"><bounds x="2950" y="1885" width="100" height="50" /></bezel>
+ <!-- trim pot -->
+ <bezel element="trim"><bounds x="950" y="2160" width="120" height="120" /></bezel>
+ <!-- side connector -->
+ <bezel element="amp"><bounds x="0" y="850" width="250" height="925" /></bezel>
+ </group>
+
+ <group name="screws">
+ <!-- max size -->
+ <bezel element="pcb_blue"><bounds x="0" y="0" width="1" height="1" /></bezel>
+ <bezel element="pcb_blue"><bounds x="3200" y="2400" width="1" height="1" /></bezel>
+ <!-- screws -->
+ <group ref="screw"><bounds x="250" y="2300" width="75" height="75" /></group>
+ <group ref="screw"><bounds x="1700" y="2300" width="75" height="75" /></group>
+ <group ref="screw"><bounds x="2860" y="2300" width="75" height="75" /></group>
+ <group ref="screw"><bounds x="1700" y="30" width="75" height="75" /></group>
+ <group ref="screw"><bounds x="2860" y="30" width="75" height="75" /></group>
+ <group ref="screw"><bounds x="1170" y="630" width="75" height="75" /></group>
+ </group>
+
+ <view name="Base Artwork">
+ <group ref="pcb"><bounds x="0" y="0" width="800" height="600" /></group>
+ <group ref="hood"><bounds x="0" y="0" width="800" height="600"/> <color alpha="0.2" /></group>
+ <group ref="screws"><bounds x="0" y="0" width="800" height="600"/></group>
+ </view>
+
+ <view name="Leds and Buttons Artwork">
+ <group ref="pcb"><bounds x="0" y="0" width="800" height="600" /></group>
+ <!-- group ref="hood"><bounds x="0" y="0" width="800" height="600"/> <color alpha="0.2" /></group>
+ <group ref="screws"><bounds x="0" y="0" width="800" height="600"/></group -->
+ </view>
+</mamelayout>
diff --git a/src/mame/layout/msthawk.lay b/src/mame/layout/msthawk.lay
new file mode 100644
index 00000000000..8a100ac0c88
--- /dev/null
+++ b/src/mame/layout/msthawk.lay
@@ -0,0 +1,22 @@
+<?xml version="1.0"?>
+<mamelayout version="2">
+
+<!-- define elements -->
+
+ <element name="white"><rect><color red="0.85" green="0.85" blue="0.85" /></rect></element>
+ <element name="text_l"><text string="("><color red="0.85" green="0.85" blue="0.85" /></text></element>
+ <element name="text_r"><text string=")"><color red="0.85" green="0.85" blue="0.85" /></text></element>
+
+
+<!-- build screen -->
+
+ <view name="Internal Layout">
+ <screen index="0"><bounds x="0" y="0" width="100" height="36.25" /></screen>
+
+ <bezel element="text_l"><bounds x="38.2" y="14.5" width="1.35" height="6.5" /></bezel>
+ <bezel element="text_r"><bounds x="45.3" y="14.5" width="1.35" height="6.5" /></bezel>
+ <bezel element="white"><bounds x="37.45" y="18.25" width="1.1" height="0.35" /></bezel>
+ <bezel element="white"><bounds x="46.2" y="18.25" width="1.1" height="0.35" /></bezel>
+
+ </view>
+</mamelayout>
diff --git a/src/mame/layout/mwcbaseb.lay b/src/mame/layout/mwcbaseb.lay
new file mode 100644
index 00000000000..8a30292f40d
--- /dev/null
+++ b/src/mame/layout/mwcbaseb.lay
@@ -0,0 +1,41 @@
+<?xml version="1.0"?>
+<mamelayout version="2">
+
+<!-- define elements -->
+
+ <element name="gray"><disk><color red="0.45" green="0.45" blue="0.45" /></disk></element>
+
+
+<!-- build screen -->
+
+ <view name="Internal Layout">
+ <screen index="0"><bounds x="0" y="0" width="96" height="23.9" /></screen>
+
+ <!-- draw the baseball diamond -->
+
+ <repeat count="200">
+ <param name="x" start="21" increment="0.145" />
+ <param name="y" start="16" increment="-0.0475" />
+ <bezel element="gray"><bounds x="~x~" y="~y~" width="0.7" height="0.7" /><color alpha="0.15" /></bezel>
+ </repeat>
+
+ <repeat count="199">
+ <param name="x" start="21.145" increment="0.145" />
+ <param name="y" start="16.0475" increment="0.0475" />
+ <bezel element="gray"><bounds x="~x~" y="~y~" width="0.7" height="0.7" /><color alpha="0.15" /></bezel>
+ </repeat>
+
+ <repeat count="200">
+ <param name="x" start="50" increment="0.145" />
+ <param name="y" start="6.5" increment="0.0475" />
+ <bezel element="gray"><bounds x="~x~" y="~y~" width="0.7" height="0.7" /><color alpha="0.15" /></bezel>
+ </repeat>
+
+ <repeat count="199">
+ <param name="x" start="50" increment="0.145" />
+ <param name="y" start="25.5" increment="-0.0475" />
+ <bezel element="gray"><bounds x="~x~" y="~y~" width="0.7" height="0.7" /><color alpha="0.15" /></bezel>
+ </repeat>
+
+ </view>
+</mamelayout>
diff --git a/src/mame/layout/novag_cforte.lay b/src/mame/layout/novag_cforte.lay
index 57926b35213..ec82af339dd 100644
--- a/src/mame/layout/novag_cforte.lay
+++ b/src/mame/layout/novag_cforte.lay
@@ -99,11 +99,11 @@
</element>
<element name="text_m8x">
<rect><color red="0.81" green="0.8" blue="0.79" /></rect>
- <text string="&lt;-"><color red="0.1" green="0.1" blue="0.1" /></text>
+ <text string="&#x2190;"><color red="0.1" green="0.1" blue="0.1" /></text>
</element>
<element name="text_r8x">
<rect><color red="0.7" green="0.13" blue="0.12" /></rect>
- <text string="-&gt;"><color red="0.1" green="0.1" blue="0.1" /></text>
+ <text string="&#x2192;"><color red="0.1" green="0.1" blue="0.1" /></text>
</element>
<element name="text_m1a"><text string="Player/Player"><color red="0.51" green="0.5" blue="0.49" /></text></element>
@@ -142,27 +142,27 @@
<element name="text_king">
<rect><color red="0.81" green="0.8" blue="0.79" /></rect>
- <text string="&#x265a;"><color red="0.1" green="0.1" blue="0.1" /></text>
+ <text string="[K]"><color red="0.1" green="0.1" blue="0.1" /></text>
</element>
<element name="text_queen">
<rect><color red="0.81" green="0.8" blue="0.79" /></rect>
- <text string="&#x265b;"><color red="0.1" green="0.1" blue="0.1" /></text>
+ <text string="[Q]"><color red="0.1" green="0.1" blue="0.1" /></text>
</element>
<element name="text_rook">
<rect><color red="0.81" green="0.8" blue="0.79" /></rect>
- <text string="&#x265c;"><color red="0.1" green="0.1" blue="0.1" /></text>
+ <text string="[R]"><color red="0.1" green="0.1" blue="0.1" /></text>
</element>
<element name="text_bishop">
<rect><color red="0.81" green="0.8" blue="0.79" /></rect>
- <text string="&#x265d;"><color red="0.1" green="0.1" blue="0.1" /></text>
+ <text string="[B]"><color red="0.1" green="0.1" blue="0.1" /></text>
</element>
<element name="text_knight">
<rect><color red="0.81" green="0.8" blue="0.79" /></rect>
- <text string="&#x265e;"><color red="0.1" green="0.1" blue="0.1" /></text>
+ <text string="[N]"><color red="0.1" green="0.1" blue="0.1" /></text>
</element>
<element name="text_pawn">
<rect><color red="0.81" green="0.8" blue="0.79" /></rect>
- <text string="&#x265f;"><color red="0.1" green="0.1" blue="0.1" /></text>
+ <text string="[P]"><color red="0.1" green="0.1" blue="0.1" /></text>
</element>
@@ -372,12 +372,12 @@
<bezel element="white"><bounds x="101.25" y="70.29" width="6" height="4" /></bezel>
<bezel element="static_red"><bounds x="101.25" y="78.00" width="6" height="4" /></bezel>
- <bezel element="text_king"><bounds x="93.13" y="24.50" width="3" height="3" /></bezel>
- <bezel element="text_queen"><bounds x="93.13" y="32.21" width="3" height="3" /></bezel>
- <bezel element="text_bishop"><bounds x="93.13" y="39.93" width="3" height="3" /></bezel>
- <bezel element="text_knight"><bounds x="93.13" y="47.64" width="3" height="3" /></bezel>
- <bezel element="text_rook"><bounds x="93.13" y="55.36" width="3" height="3" /></bezel>
- <bezel element="text_pawn"><bounds x="93.13" y="63.07" width="3" height="3" /></bezel>
+ <bezel element="text_king"><bounds x="93.13" y="24.70" width="3" height="2.2" /></bezel>
+ <bezel element="text_queen"><bounds x="93.13" y="32.41" width="3" height="2.2" /></bezel>
+ <bezel element="text_bishop"><bounds x="93.13" y="40.13" width="3" height="2.2" /></bezel>
+ <bezel element="text_knight"><bounds x="93.13" y="47.84" width="3" height="2.2" /></bezel>
+ <bezel element="text_rook"><bounds x="93.13" y="55.56" width="3" height="2.2" /></bezel>
+ <bezel element="text_pawn"><bounds x="93.13" y="63.27" width="3" height="2.2" /></bezel>
<bezel element="text_r2x"><bounds x="101.26" y="33.01" width="5.98" height="1.4" /></bezel>
<bezel element="text_r3x"><bounds x="101.26" y="40.73" width="5.98" height="1.4" /></bezel>
@@ -385,8 +385,8 @@
<bezel element="text_r5x"><bounds x="101.26" y="56.16" width="5.98" height="1.4" /></bezel>
<bezel element="text_r6x"><bounds x="101.26" y="63.87" width="5.98" height="1.4" /></bezel>
<bezel element="text_r7x"><bounds x="101.26" y="71.59" width="5.98" height="1.4" /></bezel>
- <bezel element="text_r8x"><bounds x="101.26" y="78.50" width="5.98" height="3" /></bezel>
- <bezel element="text_m8x"><bounds x="91.64" y="78.50" width="5.98" height="3" /></bezel>
+ <bezel element="text_r8x"><bounds x="101.26" y="78.30" width="5.98" height="3" /></bezel>
+ <bezel element="text_m8x"><bounds x="91.64" y="78.30" width="5.98" height="3" /></bezel>
<bezel element="hlb" inputtag="IN.0" inputmask="0x200"><bounds x="91.63" y="24.00" width="6" height="4" /><color alpha="0.4" /></bezel>
<bezel element="hlb" inputtag="IN.1" inputmask="0x200"><bounds x="91.63" y="31.71" width="6" height="4" /><color alpha="0.4" /></bezel>
diff --git a/src/mame/layout/novag_delta1.lay b/src/mame/layout/novag_delta1.lay
index 68ea1072544..43268e1da9c 100644
--- a/src/mame/layout/novag_delta1.lay
+++ b/src/mame/layout/novag_delta1.lay
@@ -3,20 +3,293 @@
<!-- define elements -->
+ <element name="black"><rect><color red="0.16" green="0.16" blue="0.16" /></rect></element>
+ <element name="black2"><rect><color red="0.1" green="0.1" blue="0.1" /></rect></element>
+ <element name="white"><rect><color red="0.8" green="0.8" blue="0.8" /></rect></element>
+ <element name="white2"><rect><color red="0.96" green="0.96" blue="0.96" /></rect></element>
+ <element name="brown"><rect><color red="0.55" green="0.48" blue="0.4" /></rect></element>
+
+ <element name="led"><disk><color red="1.0" green="0.1" blue="0.15" /></disk></element>
+
<element name="digit" defstate="0">
<led7seg><color red="1.0" green="0.1" blue="0.15" /></led7seg>
</element>
+ <element name="hl" defstate="0">
+ <text string=" ">
+ <bounds x="0.0" y="0.0" width="1.0" height="1.0" />
+ <color red="0.0" green="0.0" blue="0.0" />
+ </text>
+ <rect state="1">
+ <bounds x="0.0" y="0.0" width="1.0" height="1.0" />
+ <color red="0.0" green="0.0" blue="0.0" />
+ </rect>
+ </element>
+
+ <element name="text_b01a">
+ <rect><color red="0.55" green="0.48" blue="0.4" /></rect>
+ <text string="A" align="1"><color red="0.87" green="0.87" blue="0.87" /></text>
+ </element>
+ <element name="text_b01b">
+ <rect><color red="0.55" green="0.48" blue="0.4" /></rect>
+ <text string="1" align="2"><color red="0.87" green="0.87" blue="0.87" /></text>
+ </element>
+ <element name="text_b01c">
+ <rect><color red="0.55" green="0.48" blue="0.4" /></rect>
+ <text string="[K]"><color red="0.87" green="0.87" blue="0.87" /></text>
+ </element>
+ <element name="text_b02a">
+ <rect><color red="0.55" green="0.48" blue="0.4" /></rect>
+ <text string="B" align="1"><color red="0.87" green="0.87" blue="0.87" /></text>
+ </element>
+ <element name="text_b02b">
+ <rect><color red="0.55" green="0.48" blue="0.4" /></rect>
+ <text string="2" align="2"><color red="0.87" green="0.87" blue="0.87" /></text>
+ </element>
+ <element name="text_b02c">
+ <rect><color red="0.55" green="0.48" blue="0.4" /></rect>
+ <text string="[Q]"><color red="0.87" green="0.87" blue="0.87" /></text>
+ </element>
+ <element name="text_b03a">
+ <rect><color red="0.55" green="0.48" blue="0.4" /></rect>
+ <text string="C" align="1"><color red="0.87" green="0.87" blue="0.87" /></text>
+ </element>
+ <element name="text_b03b">
+ <rect><color red="0.55" green="0.48" blue="0.4" /></rect>
+ <text string="3" align="2"><color red="0.87" green="0.87" blue="0.87" /></text>
+ </element>
+ <element name="text_b03c">
+ <rect><color red="0.55" green="0.48" blue="0.4" /></rect>
+ <text string="[R]"><color red="0.87" green="0.87" blue="0.87" /></text>
+ </element>
+ <element name="text_b04a">
+ <rect><color red="0.55" green="0.48" blue="0.4" /></rect>
+ <text string="D" align="1"><color red="0.87" green="0.87" blue="0.87" /></text>
+ </element>
+ <element name="text_b04b">
+ <rect><color red="0.55" green="0.48" blue="0.4" /></rect>
+ <text string="4" align="2"><color red="0.87" green="0.87" blue="0.87" /></text>
+ </element>
+ <element name="text_b05a">
+ <rect><color red="0.55" green="0.48" blue="0.4" /></rect>
+ <text string="E" align="1"><color red="0.87" green="0.87" blue="0.87" /></text>
+ </element>
+ <element name="text_b05b">
+ <rect><color red="0.55" green="0.48" blue="0.4" /></rect>
+ <text string="5" align="2"><color red="0.87" green="0.87" blue="0.87" /></text>
+ </element>
+ <element name="text_b05c">
+ <rect><color red="0.55" green="0.48" blue="0.4" /></rect>
+ <text string="[B]"><color red="0.87" green="0.87" blue="0.87" /></text>
+ </element>
+ <element name="text_b06a">
+ <rect><color red="0.55" green="0.48" blue="0.4" /></rect>
+ <text string="F" align="1"><color red="0.87" green="0.87" blue="0.87" /></text>
+ </element>
+ <element name="text_b06b">
+ <rect><color red="0.55" green="0.48" blue="0.4" /></rect>
+ <text string="6" align="2"><color red="0.87" green="0.87" blue="0.87" /></text>
+ </element>
+ <element name="text_b06c">
+ <rect><color red="0.55" green="0.48" blue="0.4" /></rect>
+ <text string="[N]"><color red="0.87" green="0.87" blue="0.87" /></text>
+ </element>
+ <element name="text_b07a">
+ <rect><color red="0.55" green="0.48" blue="0.4" /></rect>
+ <text string="G" align="1"><color red="0.87" green="0.87" blue="0.87" /></text>
+ </element>
+ <element name="text_b07b">
+ <rect><color red="0.55" green="0.48" blue="0.4" /></rect>
+ <text string="7" align="2"><color red="0.87" green="0.87" blue="0.87" /></text>
+ </element>
+ <element name="text_b07c">
+ <rect><color red="0.55" green="0.48" blue="0.4" /></rect>
+ <text string="[P]"><color red="0.87" green="0.87" blue="0.87" /></text>
+ </element>
+ <element name="text_b08a">
+ <rect><color red="0.55" green="0.48" blue="0.4" /></rect>
+ <text string="H" align="1"><color red="0.87" green="0.87" blue="0.87" /></text>
+ </element>
+ <element name="text_b08b">
+ <rect><color red="0.55" green="0.48" blue="0.4" /></rect>
+ <text string="8" align="2"><color red="0.87" green="0.87" blue="0.87" /></text>
+ </element>
+ <element name="text_b09">
+ <rect><color red="0.55" green="0.48" blue="0.4" /></rect>
+ <text string="CE"><color red="0.87" green="0.87" blue="0.87" /></text>
+ </element>
+ <element name="text_b18">
+ <rect><color red="0.55" green="0.48" blue="0.4" /></rect>
+ <text string="ENTER"><color red="0.87" green="0.87" blue="0.87" /></text>
+ </element>
+
+ <element name="text_b10b">
+ <rect><color red="0.8" green="0.8" blue="0.8" /></rect>
+ <text string="9" align="2"><color red="0.1" green="0.1" blue="0.1" /></text>
+ </element>
+ <element name="text_b10c">
+ <rect><color red="0.8" green="0.8" blue="0.8" /></rect>
+ <text string="[K]"><color red="0.1" green="0.1" blue="0.1" /></text>
+ </element>
+ <element name="text_b11b">
+ <rect><color red="0.8" green="0.8" blue="0.8" /></rect>
+ <text string="0" align="2"><color red="0.1" green="0.1" blue="0.1" /></text>
+ </element>
+ <element name="text_b11c">
+ <rect><color red="0.8" green="0.8" blue="0.8" /></rect>
+ <text string="[Q]"><color red="0.1" green="0.1" blue="0.1" /></text>
+ </element>
+ <element name="text_b12a">
+ <rect><color red="0.8" green="0.8" blue="0.8" /></rect>
+ <text string="T" align="1"><color red="0.1" green="0.1" blue="0.1" /></text>
+ </element>
+ <element name="text_b12c">
+ <rect><color red="0.8" green="0.8" blue="0.8" /></rect>
+ <text string="[R]"><color red="0.1" green="0.1" blue="0.1" /></text>
+ </element>
+ <element name="text_b13a">
+ <rect><color red="0.8" green="0.8" blue="0.8" /></rect>
+ <text string="&#x2192;" align="1"><color red="0.1" green="0.1" blue="0.1" /></text>
+ </element>
+ <element name="text_b13b">
+ <rect><color red="0.8" green="0.8" blue="0.8" /></rect>
+ <text string="T" align="2"><color red="0.1" green="0.1" blue="0.1" /></text>
+ </element>
+ <element name="text_b14a">
+ <rect><color red="0.8" green="0.8" blue="0.8" /></rect>
+ <text string="FP" align="1"><color red="0.1" green="0.1" blue="0.1" /></text>
+ </element>
+ <element name="text_b14c">
+ <rect><color red="0.8" green="0.8" blue="0.8" /></rect>
+ <text string="[B]"><color red="0.1" green="0.1" blue="0.1" /></text>
+ </element>
+ <element name="text_b15a">
+ <rect><color red="0.8" green="0.8" blue="0.8" /></rect>
+ <text string="EP" align="1"><color red="0.1" green="0.1" blue="0.1" /></text>
+ </element>
+ <element name="text_b15c">
+ <rect><color red="0.8" green="0.8" blue="0.8" /></rect>
+ <text string="[N]"><color red="0.1" green="0.1" blue="0.1" /></text>
+ </element>
+ <element name="text_b16c">
+ <rect><color red="0.8" green="0.8" blue="0.8" /></rect>
+ <text string="[P]"><color red="0.1" green="0.1" blue="0.1" /></text>
+ </element>
+ <element name="text_b17">
+ <rect><color red="0.8" green="0.8" blue="0.8" /></rect>
+ <text string="CB"><color red="0.1" green="0.1" blue="0.1" /></text>
+ </element>
+
+ <element name="text_d1"><text string="TIME DISPLAY"><color red="0.9" green="0.9" blue="0.9" /></text></element>
+ <element name="text_d2"><text string="TIME SET"><color red="0.9" green="0.9" blue="0.9" /></text></element>
+ <element name="text_d3"><text string="CHANGE COLOR"><color red="0.9" green="0.9" blue="0.9" /></text></element> <!-- this label isn't on the real device -->
+ <element name="text_d4"><text string="NEW GAME"><color red="0.9" green="0.9" blue="0.9" /></text></element>
+
<!-- build screen -->
<view name="Internal Layout">
- <bounds left="0" right="40" top="0" bottom="15" />
+ <bounds left="-1.5" right="88.5" top="4" bottom="39" />
+
+ <bezel element="black"><bounds x="-1.5" y="17.5" width="90" height="1" /></bezel>
+ <bezel element="led"><bounds x="4.5" y="13.5" width="2.5" height="2.5" /></bezel> <!-- power led, always on -->
+
+ <bezel name="digit3" element="digit"><bounds x="10" y="5.5" width="7" height="10.5" /></bezel>
+ <bezel name="digit2" element="digit"><bounds x="17" y="5.5" width="7" height="10.5" /></bezel>
+ <bezel name="digit1" element="digit"><bounds x="24" y="5.5" width="7" height="10.5" /></bezel>
+ <bezel name="digit0" element="digit"><bounds x="31" y="5.5" width="7" height="10.5" /></bezel>
+
+ <!-- button panel -->
+
+ <bezel element="text_d1"><bounds x="17" y="37.2" width="13" height="1.5" /></bezel>
+ <bezel element="text_d2"><bounds x="27" y="37.2" width="13" height="1.5" /></bezel>
+ <bezel element="text_d3"><bounds x="57" y="37.2" width="13" height="1.5" /></bezel>
+ <bezel element="text_d4"><bounds x="67" y="37.2" width="13" height="1.5" /></bezel>
+
+ <bezel element="brown"><bounds x="0" y="20" width="7" height="7" /></bezel>
+ <bezel element="brown"><bounds x="10" y="20" width="7" height="7" /></bezel>
+ <bezel element="brown"><bounds x="20" y="20" width="7" height="7" /></bezel>
+ <bezel element="brown"><bounds x="30" y="20" width="7" height="7" /></bezel>
+ <bezel element="brown"><bounds x="40" y="20" width="7" height="7" /></bezel>
+ <bezel element="brown"><bounds x="50" y="20" width="7" height="7" /></bezel>
+ <bezel element="brown"><bounds x="60" y="20" width="7" height="7" /></bezel>
+ <bezel element="brown"><bounds x="70" y="20" width="7" height="7" /></bezel>
+ <bezel element="brown"><bounds x="80" y="20" width="7" height="7" /></bezel>
+
+ <bezel element="white"><bounds x="0" y="30" width="7" height="7" /></bezel>
+ <bezel element="white"><bounds x="10" y="30" width="7" height="7" /></bezel>
+ <bezel element="white"><bounds x="20" y="30" width="7" height="7" /></bezel>
+ <bezel element="white"><bounds x="30" y="30" width="7" height="7" /></bezel>
+ <bezel element="white"><bounds x="40" y="30" width="7" height="7" /></bezel>
+ <bezel element="white"><bounds x="50" y="30" width="7" height="7" /></bezel>
+ <bezel element="white"><bounds x="60" y="30" width="7" height="7" /></bezel>
+ <bezel element="white"><bounds x="70" y="30" width="7" height="7" /></bezel>
+ <bezel element="brown"><bounds x="80" y="30" width="7" height="7" /></bezel>
+
+ <bezel element="white2"><bounds x="60.8" y="30.8" width="2" height="2" /></bezel>
+ <bezel element="black2"><bounds x="64.2" y="30.8" width="2" height="2" /></bezel>
+ <bezel element="black2"><bounds x="70.5" y="30.5" width="6" height="6" /></bezel>
+ <bezel element="white"><bounds x="70.7" y="30.7" width="5.6" height="5.6" /></bezel>
+
+ <bezel element="text_b01c"><bounds x="0.5" y="23.0" width="6" height="3" /></bezel>
+ <bezel element="text_b01a"><bounds x="0.9" y="20.5" width="5" height="2.5" /></bezel>
+ <bezel element="text_b01b"><bounds x="3.5" y="20.5" width="2.5" height="2.5" /></bezel>
+ <bezel element="text_b02c"><bounds x="10.5" y="23.0" width="6" height="3" /></bezel>
+ <bezel element="text_b02a"><bounds x="10.9" y="20.5" width="5" height="2.5" /></bezel>
+ <bezel element="text_b02b"><bounds x="13.5" y="20.5" width="2.5" height="2.5" /></bezel>
+ <bezel element="text_b03c"><bounds x="20.5" y="23.0" width="6" height="3" /></bezel>
+ <bezel element="text_b03a"><bounds x="20.9" y="20.5" width="5" height="2.5" /></bezel>
+ <bezel element="text_b03b"><bounds x="23.5" y="20.5" width="2.5" height="2.5" /></bezel>
+ <bezel element="text_b04a"><bounds x="30.9" y="20.5" width="5" height="2.5" /></bezel>
+ <bezel element="text_b04b"><bounds x="33.5" y="20.5" width="2.5" height="2.5" /></bezel>
+ <bezel element="text_b05c"><bounds x="40.5" y="23.0" width="6" height="3" /></bezel>
+ <bezel element="text_b05a"><bounds x="40.9" y="20.5" width="5" height="2.5" /></bezel>
+ <bezel element="text_b05b"><bounds x="43.5" y="20.5" width="2.5" height="2.5" /></bezel>
+ <bezel element="text_b06c"><bounds x="50.5" y="23.0" width="6" height="3" /></bezel>
+ <bezel element="text_b06a"><bounds x="50.9" y="20.5" width="5" height="2.5" /></bezel>
+ <bezel element="text_b06b"><bounds x="53.5" y="20.5" width="2.5" height="2.5" /></bezel>
+ <bezel element="text_b07c"><bounds x="60.5" y="23.0" width="6" height="3" /></bezel>
+ <bezel element="text_b07a"><bounds x="60.9" y="20.5" width="5" height="2.5" /></bezel>
+ <bezel element="text_b07b"><bounds x="63.5" y="20.5" width="2.5" height="2.5" /></bezel>
+ <bezel element="text_b08a"><bounds x="70.9" y="20.5" width="5" height="2.5" /></bezel>
+ <bezel element="text_b08b"><bounds x="73.5" y="20.5" width="2.5" height="2.5" /></bezel>
+ <bezel element="text_b09"><bounds x="80.5" y="21.75" width="6" height="3.5" /></bezel>
+
+ <bezel element="text_b10c"><bounds x="0.5" y="33.0" width="6" height="3" /></bezel>
+ <bezel element="text_b10b"><bounds x="3.5" y="30.5" width="2.5" height="2.5" /></bezel>
+ <bezel element="text_b11c"><bounds x="10.5" y="33.0" width="6" height="3" /></bezel>
+ <bezel element="text_b11b"><bounds x="13.5" y="30.5" width="2.5" height="2.5" /></bezel>
+ <bezel element="text_b12c"><bounds x="20.5" y="33.0" width="6" height="3" /></bezel>
+ <bezel element="text_b12a"><bounds x="20.9" y="30.5" width="5" height="2.5" /></bezel>
+ <bezel element="text_b13a"><bounds x="30.9" y="30.5" width="5" height="2.5" /></bezel>
+ <bezel element="text_b13b"><bounds x="33.5" y="30.5" width="2.5" height="2.5" /></bezel>
+ <bezel element="text_b14c"><bounds x="40.5" y="33.0" width="6" height="3" /></bezel>
+ <bezel element="text_b14a"><bounds x="40.9" y="30.5" width="5" height="2.5" /></bezel>
+ <bezel element="text_b15c"><bounds x="50.5" y="33.0" width="6" height="3" /></bezel>
+ <bezel element="text_b15a"><bounds x="50.9" y="30.5" width="5" height="2.5" /></bezel>
+ <bezel element="text_b16c"><bounds x="60.5" y="33.0" width="6" height="3" /></bezel>
+ <bezel element="text_b17"><bounds x="71.5" y="32.3" width="4" height="2.4" /></bezel>
+ <bezel element="text_b18"><bounds x="80.1" y="32.3" width="6.8" height="2.4" /></bezel>
+
+ <bezel element="hl" inputtag="IN.1" inputmask="0x01"><bounds x="0" y="20" width="7" height="7" /><color alpha="0.25" /></bezel>
+ <bezel element="hl" inputtag="IN.1" inputmask="0x02"><bounds x="10" y="20" width="7" height="7" /><color alpha="0.25" /></bezel>
+ <bezel element="hl" inputtag="IN.1" inputmask="0x04"><bounds x="20" y="20" width="7" height="7" /><color alpha="0.25" /></bezel>
+ <bezel element="hl" inputtag="IN.1" inputmask="0x08"><bounds x="30" y="20" width="7" height="7" /><color alpha="0.25" /></bezel>
+ <bezel element="hl" inputtag="IN.2" inputmask="0x01"><bounds x="40" y="20" width="7" height="7" /><color alpha="0.25" /></bezel>
+ <bezel element="hl" inputtag="IN.2" inputmask="0x02"><bounds x="50" y="20" width="7" height="7" /><color alpha="0.25" /></bezel>
+ <bezel element="hl" inputtag="IN.2" inputmask="0x04"><bounds x="60" y="20" width="7" height="7" /><color alpha="0.25" /></bezel>
+ <bezel element="hl" inputtag="IN.2" inputmask="0x08"><bounds x="70" y="20" width="7" height="7" /><color alpha="0.25" /></bezel>
+ <bezel element="hl" inputtag="IN.3" inputmask="0x08"><bounds x="80" y="20" width="7" height="7" /><color alpha="0.25" /></bezel>
- <bezel name="digit3" element="digit"><bounds x="0" y="0" width="10" height="15" /></bezel>
- <bezel name="digit2" element="digit"><bounds x="10" y="0" width="10" height="15" /></bezel>
- <bezel name="digit1" element="digit"><bounds x="20" y="0" width="10" height="15" /></bezel>
- <bezel name="digit0" element="digit"><bounds x="30" y="0" width="10" height="15" /></bezel>
+ <bezel element="hl" inputtag="IN.3" inputmask="0x01"><bounds x="0" y="30" width="7" height="7" /><color alpha="0.22" /></bezel>
+ <bezel element="hl" inputtag="IN.3" inputmask="0x02"><bounds x="10" y="30" width="7" height="7" /><color alpha="0.22" /></bezel>
+ <bezel element="hl" inputtag="IN.3" inputmask="0x04"><bounds x="20" y="30" width="7" height="7" /><color alpha="0.22" /></bezel>
+ <bezel element="hl" inputtag="IN.0" inputmask="0x02"><bounds x="30" y="30" width="7" height="7" /><color alpha="0.22" /></bezel>
+ <bezel element="hl" inputtag="IN.4" inputmask="0x01"><bounds x="40" y="30" width="7" height="7" /><color alpha="0.22" /></bezel>
+ <bezel element="hl" inputtag="IN.4" inputmask="0x02"><bounds x="50" y="30" width="7" height="7" /><color alpha="0.22" /></bezel>
+ <bezel element="hl" inputtag="IN.4" inputmask="0x04"><bounds x="60" y="30" width="7" height="7" /><color alpha="0.22" /></bezel>
+ <bezel element="hl" inputtag="RESET" inputmask="0x01"><bounds x="70" y="30" width="7" height="7" /><color alpha="0.22" /></bezel>
+ <bezel element="hl" inputtag="IN.4" inputmask="0x08"><bounds x="80" y="30" width="7" height="7" /><color alpha="0.25" /></bezel>
</view>
</mamelayout>
diff --git a/src/mame/layout/novag_diablo68k.lay b/src/mame/layout/novag_diablo68k.lay
index f56d9de4757..2eddf42b940 100644
--- a/src/mame/layout/novag_diablo68k.lay
+++ b/src/mame/layout/novag_diablo68k.lay
@@ -102,12 +102,12 @@
<element name="text_r8a"><text string="Go"><color red="0.51" green="0.5" blue="0.49" /></text></element>
<element name="text_r8b"><text string=" "><color red="0.51" green="0.5" blue="0.49" /></text></element>
- <element name="text_king"><text string="&#x265a;"><color red="0.61" green="0.6" blue="0.59" /></text></element>
- <element name="text_queen"><text string="&#x265b;"><color red="0.61" green="0.6" blue="0.59" /></text></element>
- <element name="text_rook"><text string="&#x265c;"><color red="0.61" green="0.6" blue="0.59" /></text></element>
- <element name="text_bishop"><text string="&#x265d;"><color red="0.61" green="0.6" blue="0.59" /></text></element>
- <element name="text_knight"><text string="&#x265e;"><color red="0.61" green="0.6" blue="0.59" /></text></element>
- <element name="text_pawn"><text string="&#x265f;"><color red="0.61" green="0.6" blue="0.59" /></text></element>
+ <element name="text_king"><text string="[K]"><color red="0.61" green="0.6" blue="0.59" /></text></element>
+ <element name="text_queen"><text string="[Q]"><color red="0.61" green="0.6" blue="0.59" /></text></element>
+ <element name="text_rook"><text string="[R]"><color red="0.61" green="0.6" blue="0.59" /></text></element>
+ <element name="text_bishop"><text string="[B]"><color red="0.61" green="0.6" blue="0.59" /></text></element>
+ <element name="text_knight"><text string="[N]"><color red="0.61" green="0.6" blue="0.59" /></text></element>
+ <element name="text_pawn"><text string="[P]"><color red="0.61" green="0.6" blue="0.59" /></text></element>
<!-- build screen -->
@@ -330,7 +330,7 @@
<!-- lcd panel -->
- <screen index="0">
+ <screen tag="screen">
<bounds x="86.5" y="9.5" width="24.25" height="2.5" />
</screen>
@@ -368,12 +368,12 @@
<bezel element="but" inputtag="IN.1" inputmask="0x100"><bounds x="107.00" y="70.29" width="2.5" height="2.5" /></bezel>
<bezel element="but" inputtag="IN.0" inputmask="0x100"><bounds x="107.00" y="78.00" width="2.5" height="2.5" /></bezel>
- <bezel element="text_king"><bounds x="100.38" y="23.50" width="3" height="3" /></bezel>
- <bezel element="text_queen"><bounds x="100.38" y="31.21" width="3" height="3" /></bezel>
- <bezel element="text_bishop"><bounds x="100.38" y="38.93" width="3" height="3" /></bezel>
- <bezel element="text_knight"><bounds x="100.38" y="46.64" width="3" height="3" /></bezel>
- <bezel element="text_rook"><bounds x="100.38" y="54.36" width="3" height="3" /></bezel>
- <bezel element="text_pawn"><bounds x="100.38" y="62.07" width="3" height="3" /></bezel>
+ <bezel element="text_king"><bounds x="99.6" y="24.20" width="4" height="1.8" /></bezel>
+ <bezel element="text_queen"><bounds x="99.6" y="31.91" width="4" height="1.8" /></bezel>
+ <bezel element="text_bishop"><bounds x="99.6" y="39.63" width="4" height="1.8" /></bezel>
+ <bezel element="text_knight"><bounds x="99.6" y="47.34" width="4" height="1.8" /></bezel>
+ <bezel element="text_rook"><bounds x="99.6" y="54.86" width="4" height="1.8" /></bezel>
+ <bezel element="text_pawn"><bounds x="99.6" y="62.77" width="4" height="1.8" /></bezel>
<bezel element="text_l1a"><bounds x="82" y="22.35" width="14" height="1.4" /></bezel>
<bezel element="text_l1b"><bounds x="82" y="26.70" width="14" height="1.4" /></bezel>
diff --git a/src/mame/layout/novag_presto.lay b/src/mame/layout/novag_presto.lay
index 3bf1afb89f9..1c176ddf37b 100644
--- a/src/mame/layout/novag_presto.lay
+++ b/src/mame/layout/novag_presto.lay
@@ -88,27 +88,27 @@
<element name="text_king">
<rect><color red="0.81" green="0.8" blue="0.79" /></rect>
- <text string="&#x265a;"><color red="0.1" green="0.1" blue="0.1" /></text>
+ <text string="[K]"><color red="0.1" green="0.1" blue="0.1" /></text>
</element>
<element name="text_queen">
<rect><color red="0.81" green="0.8" blue="0.79" /></rect>
- <text string="&#x265b;"><color red="0.1" green="0.1" blue="0.1" /></text>
+ <text string="[Q]"><color red="0.1" green="0.1" blue="0.1" /></text>
</element>
<element name="text_rook">
<rect><color red="0.81" green="0.8" blue="0.79" /></rect>
- <text string="&#x265c;"><color red="0.1" green="0.1" blue="0.1" /></text>
+ <text string="[R]"><color red="0.1" green="0.1" blue="0.1" /></text>
</element>
<element name="text_bishop">
<rect><color red="0.81" green="0.8" blue="0.79" /></rect>
- <text string="&#x265d;"><color red="0.1" green="0.1" blue="0.1" /></text>
+ <text string="[B]"><color red="0.1" green="0.1" blue="0.1" /></text>
</element>
<element name="text_knight">
<rect><color red="0.81" green="0.8" blue="0.79" /></rect>
- <text string="&#x265e;"><color red="0.1" green="0.1" blue="0.1" /></text>
+ <text string="[N]"><color red="0.1" green="0.1" blue="0.1" /></text>
</element>
<element name="text_pawn">
<rect><color red="0.81" green="0.8" blue="0.79" /></rect>
- <text string="&#x265f;"><color red="0.1" green="0.1" blue="0.1" /></text>
+ <text string="[P]"><color red="0.1" green="0.1" blue="0.1" /></text>
</element>
@@ -315,12 +315,12 @@
<bezel element="white"><bounds x="86" y="66" width="6" height="4" /></bezel>
<bezel element="white"><bounds x="89" y="76" width="3" height="4" /></bezel>
- <bezel element="text_king"><bounds x="86" y="16.1" width="6" height="3.5" /></bezel>
- <bezel element="text_queen"><bounds x="86" y="26.1" width="6" height="3.5" /></bezel>
- <bezel element="text_bishop"><bounds x="86" y="36.1" width="6" height="3.5" /></bezel>
- <bezel element="text_knight"><bounds x="86" y="46.1" width="6" height="3.5" /></bezel>
- <bezel element="text_rook"><bounds x="86" y="56.1" width="6" height="3.5" /></bezel>
- <bezel element="text_pawn"><bounds x="86" y="66.1" width="6" height="3.5" /></bezel>
+ <bezel element="text_king"><bounds x="86" y="16.6" width="6" height="2.4" /></bezel>
+ <bezel element="text_queen"><bounds x="86" y="26.6" width="6" height="2.4" /></bezel>
+ <bezel element="text_bishop"><bounds x="86" y="36.6" width="6" height="2.4" /></bezel>
+ <bezel element="text_knight"><bounds x="86" y="46.6" width="6" height="2.4" /></bezel>
+ <bezel element="text_rook"><bounds x="86" y="56.6" width="6" height="2.4" /></bezel>
+ <bezel element="text_pawn"><bounds x="86" y="66.6" width="6" height="2.4" /></bezel>
<bezel element="hlb" inputtag="IN.8" inputmask="0x80"><bounds x="86" y="6" width="6" height="4" /><color alpha="0.25" /></bezel>
<bezel element="hlb" inputtag="IN.8" inputmask="0x40"><bounds x="86" y="16" width="6" height="4" /><color alpha="0.4" /></bezel>
diff --git a/src/mame/layout/novag_scorpio68k.lay b/src/mame/layout/novag_scorpio68k.lay
index 0e226f8f746..be2ffa5875a 100644
--- a/src/mame/layout/novag_scorpio68k.lay
+++ b/src/mame/layout/novag_scorpio68k.lay
@@ -103,12 +103,12 @@
<element name="text_r8a"><text string="Go"><color red="0.3" green="0.7" blue="0.7" /></text></element>
<element name="text_r8b"><text string=" "><color red="0.51" green="0.5" blue="0.49" /></text></element>
- <element name="text_king"><text string="&#x265a;"><color red="0.3" green="0.7" blue="0.7" /></text></element>
- <element name="text_queen"><text string="&#x265b;"><color red="0.3" green="0.7" blue="0.7" /></text></element>
- <element name="text_rook"><text string="&#x265c;"><color red="0.3" green="0.7" blue="0.7" /></text></element>
- <element name="text_bishop"><text string="&#x265d;"><color red="0.3" green="0.7" blue="0.7" /></text></element>
- <element name="text_knight"><text string="&#x265e;"><color red="0.3" green="0.7" blue="0.7" /></text></element>
- <element name="text_pawn"><text string="&#x265f;"><color red="0.3" green="0.7" blue="0.7" /></text></element>
+ <element name="text_king"><text string="[K]"><color red="0.3" green="0.7" blue="0.7" /></text></element>
+ <element name="text_queen"><text string="[Q]"><color red="0.3" green="0.7" blue="0.7" /></text></element>
+ <element name="text_rook"><text string="[R]"><color red="0.3" green="0.7" blue="0.7" /></text></element>
+ <element name="text_bishop"><text string="[B]"><color red="0.3" green="0.7" blue="0.7" /></text></element>
+ <element name="text_knight"><text string="[N]"><color red="0.3" green="0.7" blue="0.7" /></text></element>
+ <element name="text_pawn"><text string="[P]"><color red="0.3" green="0.7" blue="0.7" /></text></element>
<!-- build screen -->
@@ -183,23 +183,23 @@
<!-- chessboard leds -->
- <bezel name="7.1" element="ledr"><bounds x="-1" y="7.5" width="2" height="1" /></bezel>
- <bezel name="6.1" element="ledr"><bounds x="-1" y="17.5" width="2" height="1" /></bezel>
- <bezel name="5.1" element="ledr"><bounds x="-1" y="27.5" width="2" height="1" /></bezel>
- <bezel name="4.1" element="ledr"><bounds x="-1" y="37.5" width="2" height="1" /></bezel>
- <bezel name="3.1" element="ledr"><bounds x="-1" y="47.5" width="2" height="1" /></bezel>
- <bezel name="2.1" element="ledr"><bounds x="-1" y="57.5" width="2" height="1" /></bezel>
- <bezel name="1.1" element="ledr"><bounds x="-1" y="67.5" width="2" height="1" /></bezel>
- <bezel name="0.1" element="ledr"><bounds x="-1" y="77.5" width="2" height="1" /></bezel>
-
- <bezel name="7.0" element="ledr"><bounds x="7" y="85" width="2" height="1" /></bezel>
- <bezel name="6.0" element="ledr"><bounds x="17" y="85" width="2" height="1" /></bezel>
- <bezel name="5.0" element="ledr"><bounds x="27" y="85" width="2" height="1" /></bezel>
- <bezel name="4.0" element="ledr"><bounds x="37" y="85" width="2" height="1" /></bezel>
- <bezel name="3.0" element="ledr"><bounds x="47" y="85" width="2" height="1" /></bezel>
- <bezel name="2.0" element="ledr"><bounds x="57" y="85" width="2" height="1" /></bezel>
- <bezel name="1.0" element="ledr"><bounds x="67" y="85" width="2" height="1" /></bezel>
- <bezel name="0.0" element="ledr"><bounds x="77" y="85" width="2" height="1" /></bezel>
+ <bezel name="7.9" element="ledr"><bounds x="-1" y="7.5" width="2" height="1" /></bezel>
+ <bezel name="6.9" element="ledr"><bounds x="-1" y="17.5" width="2" height="1" /></bezel>
+ <bezel name="5.9" element="ledr"><bounds x="-1" y="27.5" width="2" height="1" /></bezel>
+ <bezel name="4.9" element="ledr"><bounds x="-1" y="37.5" width="2" height="1" /></bezel>
+ <bezel name="3.9" element="ledr"><bounds x="-1" y="47.5" width="2" height="1" /></bezel>
+ <bezel name="2.9" element="ledr"><bounds x="-1" y="57.5" width="2" height="1" /></bezel>
+ <bezel name="1.9" element="ledr"><bounds x="-1" y="67.5" width="2" height="1" /></bezel>
+ <bezel name="0.9" element="ledr"><bounds x="-1" y="77.5" width="2" height="1" /></bezel>
+
+ <bezel name="7.8" element="ledr"><bounds x="7" y="85" width="2" height="1" /></bezel>
+ <bezel name="6.8" element="ledr"><bounds x="17" y="85" width="2" height="1" /></bezel>
+ <bezel name="5.8" element="ledr"><bounds x="27" y="85" width="2" height="1" /></bezel>
+ <bezel name="4.8" element="ledr"><bounds x="37" y="85" width="2" height="1" /></bezel>
+ <bezel name="3.8" element="ledr"><bounds x="47" y="85" width="2" height="1" /></bezel>
+ <bezel name="2.8" element="ledr"><bounds x="57" y="85" width="2" height="1" /></bezel>
+ <bezel name="1.8" element="ledr"><bounds x="67" y="85" width="2" height="1" /></bezel>
+ <bezel name="0.8" element="ledr"><bounds x="77" y="85" width="2" height="1" /></bezel>
<!-- chessboard sensors -->
@@ -277,7 +277,7 @@
<!-- lcd panel -->
- <screen index="0">
+ <screen tag="screen">
<bounds x="48.25" y="93" width="24.25" height="2.5" />
</screen>
@@ -315,12 +315,12 @@
<bezel element="black"><bounds x="105.25" y="60.29" width="6" height="4" /></bezel>
<bezel element="black"><bounds x="105.25" y="68.00" width="6" height="4" /></bezel>
- <bezel element="text_king"><bounds x="95" y="17.5" width="2.5" height="2.5" /></bezel>
- <bezel element="text_queen"><bounds x="95" y="25.21" width="3" height="3" /></bezel>
- <bezel element="text_bishop"><bounds x="95" y="32.93" width="3" height="3" /></bezel>
- <bezel element="text_knight"><bounds x="95" y="40.64" width="3" height="3" /></bezel>
- <bezel element="text_rook"><bounds x="95" y="48.36" width="3" height="3" /></bezel>
- <bezel element="text_pawn"><bounds x="95" y="56.07" width="3" height="3" /></bezel>
+ <bezel element="text_king"><bounds x="95" y="18.20" width="2.5" height="1.4" /></bezel>
+ <bezel element="text_queen"><bounds x="95" y="25.91" width="3" height="1.4" /></bezel>
+ <bezel element="text_bishop"><bounds x="95" y="33.63" width="3" height="1.4" /></bezel>
+ <bezel element="text_knight"><bounds x="95" y="41.34" width="3" height="1.4" /></bezel>
+ <bezel element="text_rook"><bounds x="95" y="49.06" width="3" height="1.4" /></bezel>
+ <bezel element="text_pawn"><bounds x="95" y="56.77" width="3" height="1.4" /></bezel>
<bezel element="hlb" inputtag="IN.7" inputmask="0x400"><bounds x="86" y="14.00" width="6" height="4" /><color alpha="0.12" /></bezel>
<bezel element="hlb" inputtag="IN.6" inputmask="0x400"><bounds x="86" y="21.71" width="6" height="4" /><color alpha="0.12" /></bezel>
diff --git a/src/mame/layout/novag_sexpert.lay b/src/mame/layout/novag_sexpert.lay
index f56d9de4757..2eddf42b940 100644
--- a/src/mame/layout/novag_sexpert.lay
+++ b/src/mame/layout/novag_sexpert.lay
@@ -102,12 +102,12 @@
<element name="text_r8a"><text string="Go"><color red="0.51" green="0.5" blue="0.49" /></text></element>
<element name="text_r8b"><text string=" "><color red="0.51" green="0.5" blue="0.49" /></text></element>
- <element name="text_king"><text string="&#x265a;"><color red="0.61" green="0.6" blue="0.59" /></text></element>
- <element name="text_queen"><text string="&#x265b;"><color red="0.61" green="0.6" blue="0.59" /></text></element>
- <element name="text_rook"><text string="&#x265c;"><color red="0.61" green="0.6" blue="0.59" /></text></element>
- <element name="text_bishop"><text string="&#x265d;"><color red="0.61" green="0.6" blue="0.59" /></text></element>
- <element name="text_knight"><text string="&#x265e;"><color red="0.61" green="0.6" blue="0.59" /></text></element>
- <element name="text_pawn"><text string="&#x265f;"><color red="0.61" green="0.6" blue="0.59" /></text></element>
+ <element name="text_king"><text string="[K]"><color red="0.61" green="0.6" blue="0.59" /></text></element>
+ <element name="text_queen"><text string="[Q]"><color red="0.61" green="0.6" blue="0.59" /></text></element>
+ <element name="text_rook"><text string="[R]"><color red="0.61" green="0.6" blue="0.59" /></text></element>
+ <element name="text_bishop"><text string="[B]"><color red="0.61" green="0.6" blue="0.59" /></text></element>
+ <element name="text_knight"><text string="[N]"><color red="0.61" green="0.6" blue="0.59" /></text></element>
+ <element name="text_pawn"><text string="[P]"><color red="0.61" green="0.6" blue="0.59" /></text></element>
<!-- build screen -->
@@ -330,7 +330,7 @@
<!-- lcd panel -->
- <screen index="0">
+ <screen tag="screen">
<bounds x="86.5" y="9.5" width="24.25" height="2.5" />
</screen>
@@ -368,12 +368,12 @@
<bezel element="but" inputtag="IN.1" inputmask="0x100"><bounds x="107.00" y="70.29" width="2.5" height="2.5" /></bezel>
<bezel element="but" inputtag="IN.0" inputmask="0x100"><bounds x="107.00" y="78.00" width="2.5" height="2.5" /></bezel>
- <bezel element="text_king"><bounds x="100.38" y="23.50" width="3" height="3" /></bezel>
- <bezel element="text_queen"><bounds x="100.38" y="31.21" width="3" height="3" /></bezel>
- <bezel element="text_bishop"><bounds x="100.38" y="38.93" width="3" height="3" /></bezel>
- <bezel element="text_knight"><bounds x="100.38" y="46.64" width="3" height="3" /></bezel>
- <bezel element="text_rook"><bounds x="100.38" y="54.36" width="3" height="3" /></bezel>
- <bezel element="text_pawn"><bounds x="100.38" y="62.07" width="3" height="3" /></bezel>
+ <bezel element="text_king"><bounds x="99.6" y="24.20" width="4" height="1.8" /></bezel>
+ <bezel element="text_queen"><bounds x="99.6" y="31.91" width="4" height="1.8" /></bezel>
+ <bezel element="text_bishop"><bounds x="99.6" y="39.63" width="4" height="1.8" /></bezel>
+ <bezel element="text_knight"><bounds x="99.6" y="47.34" width="4" height="1.8" /></bezel>
+ <bezel element="text_rook"><bounds x="99.6" y="54.86" width="4" height="1.8" /></bezel>
+ <bezel element="text_pawn"><bounds x="99.6" y="62.77" width="4" height="1.8" /></bezel>
<bezel element="text_l1a"><bounds x="82" y="22.35" width="14" height="1.4" /></bezel>
<bezel element="text_l1b"><bounds x="82" y="26.70" width="14" height="1.4" /></bezel>
diff --git a/src/mame/layout/novag_sforte.lay b/src/mame/layout/novag_sforte.lay
index f7c4b27cf5a..f8f3f97275e 100644
--- a/src/mame/layout/novag_sforte.lay
+++ b/src/mame/layout/novag_sforte.lay
@@ -67,11 +67,11 @@
<element name="text_l6b"><text string="Start of Game"><color red="0.51" green="0.5" blue="0.49" /></text></element>
<element name="text_l7">
<rect><color red="0.81" green="0.8" blue="0.79" /></rect>
- <text string="&lt;-"><color red="0.1" green="0.1" blue="0.1" /></text>
+ <text string="&#x2190;"><color red="0.1" green="0.1" blue="0.1" /></text>
</element>
<element name="text_l8">
<rect><color red="0.81" green="0.8" blue="0.79" /></rect>
- <text string="-&gt;"><color red="0.1" green="0.1" blue="0.1" /></text>
+ <text string="&#x2192;"><color red="0.1" green="0.1" blue="0.1" /></text>
</element>
<element name="text_m1a"><text string="Player/Player"><color red="0.51" green="0.5" blue="0.49" /></text></element>
@@ -110,27 +110,27 @@
<element name="text_king">
<rect><color red="0.81" green="0.8" blue="0.79" /></rect>
- <text string="&#x265a;"><color red="0.1" green="0.1" blue="0.1" /></text>
+ <text string="[K]"><color red="0.1" green="0.1" blue="0.1" /></text>
</element>
<element name="text_queen">
<rect><color red="0.81" green="0.8" blue="0.79" /></rect>
- <text string="&#x265b;"><color red="0.1" green="0.1" blue="0.1" /></text>
+ <text string="[Q]"><color red="0.1" green="0.1" blue="0.1" /></text>
</element>
<element name="text_rook">
<rect><color red="0.81" green="0.8" blue="0.79" /></rect>
- <text string="&#x265c;"><color red="0.1" green="0.1" blue="0.1" /></text>
+ <text string="[R]"><color red="0.1" green="0.1" blue="0.1" /></text>
</element>
<element name="text_bishop">
<rect><color red="0.81" green="0.8" blue="0.79" /></rect>
- <text string="&#x265d;"><color red="0.1" green="0.1" blue="0.1" /></text>
+ <text string="[B]"><color red="0.1" green="0.1" blue="0.1" /></text>
</element>
<element name="text_knight">
<rect><color red="0.81" green="0.8" blue="0.79" /></rect>
- <text string="&#x265e;"><color red="0.1" green="0.1" blue="0.1" /></text>
+ <text string="[N]"><color red="0.1" green="0.1" blue="0.1" /></text>
</element>
<element name="text_pawn">
<rect><color red="0.81" green="0.8" blue="0.79" /></rect>
- <text string="&#x265f;"><color red="0.1" green="0.1" blue="0.1" /></text>
+ <text string="[P]"><color red="0.1" green="0.1" blue="0.1" /></text>
</element>
@@ -300,7 +300,7 @@
<!-- lcd panel -->
- <screen index="0">
+ <screen tag="screen">
<bounds x="86.5" y="9.5" width="24.25" height="2.5" />
</screen>
@@ -338,15 +338,15 @@
<bezel element="white"><bounds x="105.25" y="70.29" width="6" height="4" /></bezel>
<bezel element="static_red"><bounds x="105.25" y="78.00" width="6" height="4" /></bezel>
- <bezel element="text_l7"><bounds x="87.5" y="70.79" width="3" height="3" /></bezel>
- <bezel element="text_l8"><bounds x="87.5" y="78.50" width="3" height="3" /></bezel>
+ <bezel element="text_l7"><bounds x="87.5" y="70.59" width="3" height="3" /></bezel>
+ <bezel element="text_l8"><bounds x="87.5" y="78.30" width="3" height="3" /></bezel>
- <bezel element="text_king"><bounds x="97.13" y="24.50" width="3" height="3" /></bezel>
- <bezel element="text_queen"><bounds x="97.13" y="32.21" width="3" height="3" /></bezel>
- <bezel element="text_bishop"><bounds x="97.13" y="39.93" width="3" height="3" /></bezel>
- <bezel element="text_knight"><bounds x="97.13" y="47.64" width="3" height="3" /></bezel>
- <bezel element="text_rook"><bounds x="97.13" y="55.36" width="3" height="3" /></bezel>
- <bezel element="text_pawn"><bounds x="97.13" y="63.07" width="3" height="3" /></bezel>
+ <bezel element="text_king"><bounds x="97.13" y="24.70" width="3" height="2.2" /></bezel>
+ <bezel element="text_queen"><bounds x="97.13" y="32.41" width="3" height="2.2" /></bezel>
+ <bezel element="text_bishop"><bounds x="97.13" y="40.13" width="3" height="2.2" /></bezel>
+ <bezel element="text_knight"><bounds x="97.13" y="47.84" width="3" height="2.2" /></bezel>
+ <bezel element="text_rook"><bounds x="97.13" y="55.56" width="3" height="2.2" /></bezel>
+ <bezel element="text_pawn"><bounds x="97.13" y="63.27" width="3" height="2.2" /></bezel>
<bezel element="hlb" inputtag="IN.7" inputmask="0x400"><bounds x="86" y="24.00" width="6" height="4" /><color alpha="0.4" /></bezel>
<bezel element="hlb" inputtag="IN.6" inputmask="0x400"><bounds x="86" y="31.71" width="6" height="4" /><color alpha="0.4" /></bezel>
diff --git a/src/mame/layout/novag_supercon.lay b/src/mame/layout/novag_supercon.lay
index 5c45e200599..09cedc163ad 100644
--- a/src/mame/layout/novag_supercon.lay
+++ b/src/mame/layout/novag_supercon.lay
@@ -87,36 +87,36 @@
<element name="text_rg6"><text string="Black"><color red="0.81" green="0.8" blue="0.79" /></text></element>
<element name="text_rg7"><text string="White"><color red="0.81" green="0.8" blue="0.79" /></text></element>
- <element name="text_king1"><text string="&#x265a;"><color red="0.81" green="0.8" blue="0.79" /></text></element>
- <element name="text_queen1"><text string="&#x265b;"><color red="0.81" green="0.8" blue="0.79" /></text></element>
- <element name="text_rook1"><text string="&#x265c;"><color red="0.81" green="0.8" blue="0.79" /></text></element>
- <element name="text_bishop1"><text string="&#x265d;"><color red="0.81" green="0.8" blue="0.79" /></text></element>
- <element name="text_knight1"><text string="&#x265e;"><color red="0.81" green="0.8" blue="0.79" /></text></element>
- <element name="text_pawn1"><text string="&#x265f;"><color red="0.81" green="0.8" blue="0.79" /></text></element>
+ <element name="text_king1"><text string="[K]"><color red="0.81" green="0.8" blue="0.79" /></text></element>
+ <element name="text_queen1"><text string="[Q]"><color red="0.81" green="0.8" blue="0.79" /></text></element>
+ <element name="text_rook1"><text string="[R]"><color red="0.81" green="0.8" blue="0.79" /></text></element>
+ <element name="text_bishop1"><text string="[B]"><color red="0.81" green="0.8" blue="0.79" /></text></element>
+ <element name="text_knight1"><text string="[N]"><color red="0.81" green="0.8" blue="0.79" /></text></element>
+ <element name="text_pawn1"><text string="[P]"><color red="0.81" green="0.8" blue="0.79" /></text></element>
<element name="text_king2">
<rect><color red="0.81" green="0.8" blue="0.79" /></rect>
- <text string="&#x265a;"><color red="0.1" green="0.1" blue="0.1" /></text>
+ <text string="[K]"><color red="0.1" green="0.1" blue="0.1" /></text>
</element>
<element name="text_queen2">
<rect><color red="0.81" green="0.8" blue="0.79" /></rect>
- <text string="&#x265b;"><color red="0.1" green="0.1" blue="0.1" /></text>
+ <text string="[Q]"><color red="0.1" green="0.1" blue="0.1" /></text>
</element>
<element name="text_rook2">
<rect><color red="0.81" green="0.8" blue="0.79" /></rect>
- <text string="&#x265c;"><color red="0.1" green="0.1" blue="0.1" /></text>
+ <text string="[R]"><color red="0.1" green="0.1" blue="0.1" /></text>
</element>
<element name="text_bishop2">
<rect><color red="0.81" green="0.8" blue="0.79" /></rect>
- <text string="&#x265d;"><color red="0.1" green="0.1" blue="0.1" /></text>
+ <text string="[B]"><color red="0.1" green="0.1" blue="0.1" /></text>
</element>
<element name="text_knight2">
<rect><color red="0.81" green="0.8" blue="0.79" /></rect>
- <text string="&#x265e;"><color red="0.1" green="0.1" blue="0.1" /></text>
+ <text string="[N]"><color red="0.1" green="0.1" blue="0.1" /></text>
</element>
<element name="text_pawn2">
<rect><color red="0.81" green="0.8" blue="0.79" /></rect>
- <text string="&#x265f;"><color red="0.1" green="0.1" blue="0.1" /></text>
+ <text string="[P]"><color red="0.1" green="0.1" blue="0.1" /></text>
</element>
<element name="text_rb00"><text string="Multi Move"><color red="0.51" green="0.5" blue="0.49" /></text></element>
@@ -379,12 +379,12 @@
<bezel element="white"><bounds x="88" y="66" width="6" height="4" /></bezel>
<bezel element="white"><bounds x="88" y="76" width="6" height="4" /></bezel>
- <bezel element="text_king2"><bounds x="88" y="6.1" width="6" height="3.5" /></bezel>
- <bezel element="text_queen2"><bounds x="88" y="16.1" width="6" height="3.5" /></bezel>
- <bezel element="text_bishop2"><bounds x="88" y="26.1" width="6" height="3.5" /></bezel>
- <bezel element="text_knight2"><bounds x="88" y="36.1" width="6" height="3.5" /></bezel>
- <bezel element="text_rook2"><bounds x="88" y="46.1" width="6" height="3.5" /></bezel>
- <bezel element="text_pawn2"><bounds x="88" y="56.1" width="6" height="3.5" /></bezel>
+ <bezel element="text_king2"><bounds x="88" y="6.7" width="6" height="2.2" /></bezel>
+ <bezel element="text_queen2"><bounds x="88" y="16.7" width="6" height="2.2" /></bezel>
+ <bezel element="text_bishop2"><bounds x="88" y="26.7" width="6" height="2.2" /></bezel>
+ <bezel element="text_knight2"><bounds x="88" y="36.7" width="6" height="2.2" /></bezel>
+ <bezel element="text_rook2"><bounds x="88" y="46.7" width="6" height="2.2" /></bezel>
+ <bezel element="text_pawn2"><bounds x="88" y="56.7" width="6" height="2.2" /></bezel>
<bezel element="hlb" inputtag="IN.0" inputmask="0x200"><bounds x="88" y="6" width="6" height="4" /><color alpha="0.4" /></bezel>
<bezel element="hlb" inputtag="IN.1" inputmask="0x200"><bounds x="88" y="16" width="6" height="4" /><color alpha="0.4" /></bezel>
@@ -426,12 +426,12 @@
<bezel element="text_rg6"><bounds x="108" y="65.7" width="10" height="1.5" /></bezel>
<bezel element="text_rg7"><bounds x="108" y="75.7" width="10" height="1.5" /></bezel>
- <bezel element="text_king1"><bounds x="108.2" y="8.6" width="10" height="2" /></bezel>
- <bezel element="text_queen1"><bounds x="108.2" y="18.6" width="10" height="2" /></bezel>
- <bezel element="text_bishop1"><bounds x="108.2" y="28.6" width="10" height="2" /></bezel>
- <bezel element="text_knight1"><bounds x="108.2" y="38.6" width="10" height="2" /></bezel>
- <bezel element="text_rook1"><bounds x="108.2" y="48.6" width="10" height="2" /></bezel>
- <bezel element="text_pawn1"><bounds x="108.2" y="58.6" width="10" height="2" /></bezel>
+ <bezel element="text_king1"><bounds x="108.2" y="8.7" width="10" height="1.5" /></bezel>
+ <bezel element="text_queen1"><bounds x="108.2" y="18.7" width="10" height="1.5" /></bezel>
+ <bezel element="text_bishop1"><bounds x="108.2" y="28.7" width="10" height="1.5" /></bezel>
+ <bezel element="text_knight1"><bounds x="108.2" y="38.7" width="10" height="1.5" /></bezel>
+ <bezel element="text_rook1"><bounds x="108.2" y="48.7" width="10" height="1.5" /></bezel>
+ <bezel element="text_pawn1"><bounds x="108.2" y="58.7" width="10" height="1.5" /></bezel>
<bezel name="0.0" element="ledg"><bounds x="112" y="7.5" width="2" height="1" /></bezel>
<bezel name="0.1" element="ledg"><bounds x="112" y="17.5" width="2" height="1" /></bezel>
diff --git a/src/mame/layout/packmon.lay b/src/mame/layout/packmon.lay
new file mode 100644
index 00000000000..04078d516c4
--- /dev/null
+++ b/src/mame/layout/packmon.lay
@@ -0,0 +1,81 @@
+<?xml version="1.0"?>
+<mamelayout version="2">
+
+<!-- define elements -->
+
+ <element name="white"><rect><color red="0.85" green="0.85" blue="0.85" /></rect></element>
+
+ <element name="text_score"><text string="SCORE"><color red="0.95" green="0.95" blue="0.95" /></text></element>
+ <element name="text_warpl"><text string="&lt; WARP" align="1"><color red="0.95" green="0.95" blue="0.95" /></text></element>
+ <element name="text_warpr"><text string="WARP &gt;" align="1"><color red="0.95" green="0.95" blue="0.95" /></text></element>
+
+
+<!-- build screen -->
+
+ <view name="Internal Layout">
+ <bounds left="-1.2" right="56.2" top="-2.9" bottom="17.4" />
+ <screen index="0"><bounds x="0" y="0" width="48" height="17" /></screen>
+
+ <bezel element="text_score"><bounds x="22.6" y="-2.8" width="10" height="2.2" /></bezel>
+ <bezel element="text_warpl"><bounds x="-0.7" y="14.7" width="10" height="2.2" /></bezel>
+ <bezel element="text_warpr"><bounds x="49" y="14.7" width="10" height="2.2" /></bezel>
+
+ <!-- maze overlay -->
+
+ <!-- h1 -->
+ <bezel element="white"><bounds x="6.3" y="-0.3" width="42.5" height="0.2" /></bezel>
+
+ <!-- h2 -->
+ <bezel element="white"><bounds x="11.2" y="3.2" width="4.5" height="0.2" /></bezel>
+ <bezel element="white"><bounds x="20.4" y="3.2" width="14.3" height="0.2" /></bezel>
+ <bezel element="white"><bounds x="39.4" y="3.2" width="4.5" height="0.2" /></bezel>
+
+ <!-- h3 -->
+ <bezel element="white"><bounds x="-1.2" y="6.7" width="5.1" height="0.2" /></bezel>
+ <bezel element="white"><bounds x="6.3" y="6.7" width="4.7" height="0.2" /></bezel>
+ <bezel element="white"><bounds x="15.9" y="6.7" width="9.2" height="0.2" /></bezel>
+ <bezel element="white"><bounds x="30.1" y="6.7" width="9.2" height="0.2" /></bezel>
+ <bezel element="white"><bounds x="44.1" y="6.7" width="4.7" height="0.2" /></bezel>
+
+ <!-- h4 -->
+ <bezel element="white"><bounds x="-1.2" y="10.2" width="5.1" height="0.2" /></bezel>
+ <bezel element="white"><bounds x="11.0" y="10.2" width="4.7" height="0.2" /></bezel>
+ <bezel element="white"><bounds x="20.4" y="10.2" width="14.3" height="0.2" /></bezel>
+ <bezel element="white"><bounds x="39.4" y="10.2" width="4.7" height="0.2" /></bezel>
+
+ <!-- h5 -->
+ <bezel element="white"><bounds x="-1.2" y="13.7" width="5.1" height="0.2" /></bezel>
+ <bezel element="white"><bounds x="5.5" y="13.7" width="1" height="0.2" /></bezel>
+ <bezel element="white"><bounds x="25.3" y="13.7" width="4.6" height="0.2" /></bezel>
+ <bezel element="white"><bounds x="48.6" y="13.7" width="1" height="0.2" /></bezel>
+
+ <!-- h6 -->
+ <bezel element="white"><bounds x="7.3" y="17.2" width="40.5" height="0.2" /></bezel>
+
+ <!-- v0 -->
+ <bezel element="white"><bounds x="3.7" y="6.7" width="0.2" height="7.2" /></bezel>
+
+ <!-- v1 -->
+ <bezel element="white"><bounds x="6.3" y="-0.3" width="0.2" height="14.2" /></bezel>
+
+ <!-- v2 -->
+ <bezel element="white"><bounds x="11.0" y="10.2" width="0.2" height="3.5" /></bezel>
+
+ <!-- v4 -->
+ <bezel element="white"><bounds x="20.4" y="-0.3" width="0.2" height="3.7" /></bezel>
+ <bezel element="white"><bounds x="20.4" y="6.7" width="0.2" height="3.7" /></bezel>
+ <bezel element="white"><bounds x="20.4" y="13.9" width="0.2" height="3.5" /></bezel>
+
+ <!-- v7 -->
+ <bezel element="white"><bounds x="34.5" y="-0.3" width="0.2" height="3.7" /></bezel>
+ <bezel element="white"><bounds x="34.5" y="6.7" width="0.2" height="3.7" /></bezel>
+ <bezel element="white"><bounds x="34.5" y="13.9" width="0.2" height="3.5" /></bezel>
+
+ <!-- v9 -->
+ <bezel element="white"><bounds x="43.9" y="10.2" width="0.2" height="3.5" /></bezel>
+
+ <!-- v10 -->
+ <bezel element="white"><bounds x="48.6" y="-0.3" width="0.2" height="14.2" /></bezel>
+
+ </view>
+</mamelayout>
diff --git a/src/mame/layout/phpball.lay b/src/mame/layout/phpball.lay
new file mode 100644
index 00000000000..bfaaf062914
--- /dev/null
+++ b/src/mame/layout/phpball.lay
@@ -0,0 +1,72 @@
+<?xml version="1.0"?>
+<mamelayout version="2">
+
+<!-- define elements -->
+
+ <element name="digit" defstate="0">
+ <led7seg><color red="1.0" green="0.20" blue="0.22" /></led7seg>
+ </element>
+
+ <element name="led" defstate="0">
+ <disk state="0"><color red="0.14" green="0.02" blue="0.03" /></disk>
+ <disk state="1"><color red="1.0" green="0.20" blue="0.22" /></disk>
+ </element>
+ <element name="ledr" defstate="0">
+ <rect state="0"><color red="0.14" green="0.02" blue="0.03" /></rect>
+ <rect state="1"><color red="1.0" green="0.20" blue="0.22" /></rect>
+ </element>
+
+
+<!-- build screen -->
+
+ <view name="Internal Layout">
+ <bounds left="0" right="100" top="0" bottom="178" />
+
+ <bezel name="digit2" element="digit"><bounds x="26" y="4" width="10" height="15" /></bezel>
+ <bezel name="digit1" element="digit"><bounds x="36" y="4" width="10" height="15" /></bezel>
+ <bezel name="digit0" element="digit"><bounds x="46" y="4" width="10" height="15" /></bezel>
+
+ <bezel name="3.3" element="led"><bounds x="32.5" y="39.5" width="4.5" height="4.5" /></bezel> <!-- 1 -->
+ <bezel name="3.1" element="led"><bounds x="41.5" y="39.5" width="4.5" height="4.5" /></bezel> <!-- 2 -->
+ <bezel name="3.2" element="led"><bounds x="50.5" y="39.5" width="4.5" height="4.5" /></bezel> <!-- 3 -->
+ <bezel name="4.0" element="led"><bounds x="41.5" y="51" width="4.5" height="4.5" /></bezel> <!-- 4 -->
+ <bezel name="4.1" element="led"><bounds x="56.5" y="60" width="4.5" height="4.5" /></bezel> <!-- 5 -->
+ <bezel name="4.2" element="led"><bounds x="56.5" y="78" width="4.5" height="4.5" /></bezel> <!-- 6 -->
+ <bezel name="4.3" element="led"><bounds x="41.5" y="87" width="4.5" height="4.5" /></bezel> <!-- 7 -->
+ <bezel name="4.4" element="led"><bounds x="26.5" y="78" width="4.5" height="4.5" /></bezel> <!-- 8 -->
+ <bezel name="4.5" element="led"><bounds x="26.5" y="60" width="4.5" height="4.5" /></bezel> <!-- 9 -->
+
+ <bezel name="5.0" element="led"><bounds x="81" y="46.5" width="4.5" height="4.5" /></bezel> <!-- 10 -->
+ <bezel name="5.5" element="led"><bounds x="70.5" y="69.5" width="4.5" height="4.5" /></bezel> <!-- 11 -->
+ <bezel name="5.1" element="led"><bounds x="81" y="92" width="4.5" height="4.5" /></bezel> <!-- 12 -->
+ <bezel name="5.2" element="led"><bounds x="41.5" y="105" width="4.5" height="4.5" /></bezel> <!-- 13 -->
+ <bezel name="5.3" element="led"><bounds x="2.5" y="92" width="4.5" height="4.5" /></bezel> <!-- 14 -->
+ <bezel name="6.0" element="led"><bounds x="12.5" y="69.5" width="4.5" height="4.5" /></bezel> <!-- 15 -->
+ <bezel name="5.4" element="led"><bounds x="6.5" y="46.5" width="4.5" height="4.5" /></bezel> <!-- 16 -->
+ <bezel name="6.1" element="led"><bounds x="41.5" y="123" width="4.5" height="4.5" /></bezel> <!-- 17 -->
+ <bezel name="6.2" element="led"><bounds x="24" y="133" width="4.5" height="4.5" /></bezel> <!-- 18 -->
+ <bezel name="6.3" element="led"><bounds x="58.5" y="133" width="4.5" height="4.5" /></bezel> <!-- 19 -->
+
+ <bezel name="6.4" element="led"><bounds x="41.5" y="141" width="4.5" height="4.5" /></bezel> <!-- 20 -->
+ <bezel name="6.5" element="led"><bounds x="12.5" y="149" width="4.5" height="4.5" /></bezel> <!-- 21 -->
+ <bezel name="7.0" element="led"><bounds x="70.5" y="149" width="4.5" height="4.5" /></bezel> <!-- 22 -->
+ <bezel name="7.1" element="led"><bounds x="41.5" y="171" width="4.5" height="4.5" /></bezel> <!-- 23 -->
+ <bezel name="7.2" element="led"><bounds x="93" y="136.5" width="4.5" height="4.5" /></bezel> <!-- 24 -->
+ <bezel name="7.3" element="led"><bounds x="93" y="115" width="4.5" height="4.5" /></bezel> <!-- 25 -->
+ <bezel name="7.4" element="led"><bounds x="93" y="86.5" width="4.5" height="4.5" /></bezel> <!-- 26 -->
+
+ <bezel name="3.0" element="led"><bounds x="41.5" y="69.5" width="4.5" height="4.5" /></bezel> <!-- A -->
+ <bezel name="3.4" element="led"><bounds x="20.5" y="105" width="4.5" height="4.5" /></bezel> <!-- B -->
+ <bezel name="3.5" element="led"><bounds x="62.5" y="105" width="4.5" height="4.5" /></bezel> <!-- C -->
+ <bezel name="8.0" element="led"><bounds x="7" y="115" width="4.5" height="4.5" /></bezel> <!-- D -->
+ <bezel name="8.1" element="led"><bounds x="76" y="115" width="4.5" height="4.5" /></bezel> <!-- E -->
+ <bezel name="8.2" element="led"><bounds x="35.5" y="156" width="4.5" height="4.5" /></bezel> <!-- F -->
+ <bezel name="8.3" element="led"><bounds x="47" y="156" width="4.5" height="4.5" /></bezel> <!-- G -->
+
+ <bezel name="10.a" element="ledr"><bounds x="5.75" y="121" width="7" height="3" /></bezel> <!-- under D -->
+ <bezel name="9.a" element="ledr"><bounds x="74.75" y="121" width="7" height="3" /></bezel> <!-- under E -->
+ <bezel name="10.a" element="ledr"><bounds x="34.25" y="162" width="7" height="3" /></bezel> <!-- under F -->
+ <bezel name="9.a" element="ledr"><bounds x="45.75" y="162" width="7" height="3" /></bezel> <!-- under G -->
+
+ </view>
+</mamelayout>
diff --git a/src/mame/layout/raisedvl.lay b/src/mame/layout/raisedvl.lay
index 07893968116..e1025d378e0 100644
--- a/src/mame/layout/raisedvl.lay
+++ b/src/mame/layout/raisedvl.lay
@@ -23,54 +23,49 @@
<bezel name="digit0" element="digit"><bounds x="147" y="318" width="13" height="20" /></bezel>
<bezel element="digit"><bounds x="160" y="318" width="13" height="20" /></bezel> <!-- unconnected -->
- <bezel name="4.0" element="led"><bounds x="162" y="12" width="6" height="6" /></bezel>
- <bezel name="4.1" element="led"><bounds x="118" y="12" width="6" height="6" /></bezel>
-
- <bezel name="4.2" element="led"><bounds x="63" y="47" width="6" height="6" /></bezel>
- <bezel name="4.3" element="led"><bounds x="99" y="58" width="6" height="6" /></bezel>
- <bezel name="4.4" element="led"><bounds x="140" y="58" width="6" height="6" /></bezel>
- <bezel name="4.5" element="led"><bounds x="184" y="58" width="6" height="6" /></bezel>
- <bezel name="3.4" element="led"><bounds x="217" y="47" width="6" height="6" /></bezel>
-
- <bezel name="3.0" element="led"><bounds x="235" y="226" width="6" height="6" /></bezel>
- <bezel name="3.1" element="led"><bounds x="235" y="190" width="6" height="6" /></bezel>
- <bezel name="3.2" element="led"><bounds x="235" y="154" width="6" height="6" /></bezel>
- <bezel name="3.3" element="led"><bounds x="235" y="119" width="6" height="6" /></bezel>
-
- <bezel name="5.0" element="led"><bounds x="176" y="98" width="6" height="6" /></bezel>
- <bezel name="5.1" element="led"><bounds x="140" y="110" width="6" height="6" /></bezel>
- <bezel name="5.2" element="led"><bounds x="103" y="98" width="6" height="6" /></bezel>
-
- <bezel name="7.2" element="led"><bounds x="126" y="141" width="6" height="6" /></bezel>
- <bezel name="7.3" element="led"><bounds x="153" y="141" width="6" height="6" /></bezel>
- <bezel name="5.4" element="led"><bounds x="103" y="165" width="6" height="6" /></bezel>
- <bezel name="7.4" element="led"><bounds x="140" y="177" width="6" height="6" /></bezel>
- <bezel name="5.3" element="led"><bounds x="176" y="165" width="6" height="6" /></bezel>
-
- <bezel name="6.4" element="led"><bounds x="58" y="233" width="6" height="6" /></bezel>
- <bezel name="6.0" element="led"><bounds x="89" y="201" width="6" height="6" /></bezel>
- <bezel name="6.3" element="led"><bounds x="140" y="231" width="6" height="6" /></bezel>
- <bezel name="6.1" element="led"><bounds x="188" y="201" width="6" height="6" /></bezel>
- <bezel name="6.2" element="led"><bounds x="219" y="233" width="6" height="6" /></bezel>
- <bezel name="6.5" element="led"><bounds x="140" y="293" width="6" height="6" /></bezel>
-
- <bezel name="8.4" element="led"><bounds x="113" y="250" width="6" height="6" /></bezel>
- <bezel name="9.4" element="led"><bounds x="165" y="250" width="6" height="6" /></bezel>
-
- <bezel name="7.0" element="led"><bounds x="96" y="270" width="6" height="6" /></bezel>
- <bezel name="8.1" element="led"><bounds x="108" y="264" width="6" height="6" /></bezel>
- <bezel name="8.0" element="led"><bounds x="120" y="258" width="6" height="6" /></bezel>
- <bezel name="9.1" element="led"><bounds x="158" y="258" width="6" height="6" /></bezel>
- <bezel name="9.0" element="led"><bounds x="170" y="264" width="6" height="6" /></bezel>
- <bezel name="7.1" element="led"><bounds x="180" y="270" width="6" height="6" /></bezel>
-
- <bezel name="8.2" element="led"><bounds x="108" y="276" width="6" height="6" /></bezel>
- <bezel name="8.5" element="led"><bounds x="120" y="271" width="6" height="6" /></bezel>
- <bezel name="9.5" element="led"><bounds x="158" y="271" width="6" height="6" /></bezel>
- <bezel name="9.3" element="led"><bounds x="170" y="276" width="6" height="6" /></bezel>
-
- <bezel name="8.3" element="led"><bounds x="120" y="282" width="6" height="6" /></bezel>
- <bezel name="9.2" element="led"><bounds x="158" y="282" width="6" height="6" /></bezel>
+ <bezel name="3.0" element="led"><bounds x="235" y="226" width="6" height="6" /></bezel> <!-- 1 -->
+ <bezel name="3.1" element="led"><bounds x="235" y="190" width="6" height="6" /></bezel> <!-- 2 -->
+ <bezel name="3.2" element="led"><bounds x="235" y="154" width="6" height="6" /></bezel> <!-- 3 -->
+ <bezel name="3.3" element="led"><bounds x="235" y="119" width="6" height="6" /></bezel> <!-- 4 -->
+ <bezel name="3.4" element="led"><bounds x="217" y="47" width="6" height="6" /></bezel> <!-- 5 -->
+ <bezel name="4.0" element="led"><bounds x="162" y="12" width="6" height="6" /></bezel> <!-- 6 -->
+ <bezel name="4.1" element="led"><bounds x="118" y="12" width="6" height="6" /></bezel> <!-- 7 -->
+ <bezel name="4.2" element="led"><bounds x="63" y="47" width="6" height="6" /></bezel> <!-- 8 -->
+ <bezel name="4.3" element="led"><bounds x="99" y="58" width="6" height="6" /></bezel> <!-- 9 -->
+
+ <bezel name="4.4" element="led"><bounds x="140" y="58" width="6" height="6" /></bezel> <!-- 10 -->
+ <bezel name="4.5" element="led"><bounds x="184" y="58" width="6" height="6" /></bezel> <!-- 11 -->
+ <bezel name="5.0" element="led"><bounds x="176" y="98" width="6" height="6" /></bezel> <!-- 13 -->
+ <bezel name="5.1" element="led"><bounds x="140" y="110" width="6" height="6" /></bezel> <!-- 14 -->
+ <bezel name="5.2" element="led"><bounds x="103" y="98" width="6" height="6" /></bezel> <!-- 15 -->
+ <bezel name="7.2" element="led"><bounds x="126" y="141" width="6" height="6" /></bezel> <!-- 17 -->
+ <bezel name="7.3" element="led"><bounds x="153" y="141" width="6" height="6" /></bezel> <!-- 18 -->
+
+ <bezel name="5.3" element="led"><bounds x="176" y="165" width="6" height="6" /></bezel> <!-- 20 -->
+ <bezel name="5.4" element="led"><bounds x="103" y="165" width="6" height="6" /></bezel> <!-- 21 -->
+ <bezel name="6.0" element="led"><bounds x="89" y="201" width="6" height="6" /></bezel> <!-- 23 -->
+ <bezel name="6.1" element="led"><bounds x="188" y="201" width="6" height="6" /></bezel> <!-- 24 -->
+ <bezel name="6.2" element="led"><bounds x="219" y="233" width="6" height="6" /></bezel> <!-- 25 -->
+ <bezel name="6.3" element="led"><bounds x="140" y="231" width="6" height="6" /></bezel> <!-- 26 -->
+ <bezel name="6.4" element="led"><bounds x="58" y="233" width="6" height="6" /></bezel> <!-- 27 -->
+ <bezel name="8.4" element="led"><bounds x="113" y="250" width="6" height="6" /></bezel> <!-- 28 -->
+ <bezel name="9.4" element="led"><bounds x="165" y="250" width="6" height="6" /></bezel> <!-- 29 -->
+
+ <bezel name="9.5" element="led"><bounds x="158" y="271" width="6" height="6" /></bezel> <!-- 30 -->
+ <bezel name="8.5" element="led"><bounds x="120" y="271" width="6" height="6" /></bezel> <!-- 31 -->
+ <bezel name="6.5" element="led"><bounds x="140" y="293" width="6" height="6" /></bezel> <!-- 32 -->
+ <bezel name="7.4" element="led"><bounds x="140" y="177" width="6" height="6" /></bezel> <!-- 33 -->
+ <bezel name="7.0" element="led"><bounds x="96" y="270" width="6" height="6" /></bezel> <!-- 34 -->
+ <bezel name="7.1" element="led"><bounds x="180" y="270" width="6" height="6" /></bezel> <!-- 35 -->
+ <bezel name="8.0" element="led"><bounds x="120" y="258" width="6" height="6" /></bezel> <!-- 36 -->
+ <bezel name="8.1" element="led"><bounds x="108" y="264" width="6" height="6" /></bezel> <!-- 37 -->
+ <bezel name="8.2" element="led"><bounds x="108" y="276" width="6" height="6" /></bezel> <!-- 38 -->
+ <bezel name="8.3" element="led"><bounds x="120" y="282" width="6" height="6" /></bezel> <!-- 39 -->
+
+ <bezel name="9.2" element="led"><bounds x="158" y="282" width="6" height="6" /></bezel> <!-- 40 -->
+ <bezel name="9.3" element="led"><bounds x="170" y="276" width="6" height="6" /></bezel> <!-- 41 -->
+ <bezel name="9.0" element="led"><bounds x="170" y="264" width="6" height="6" /></bezel> <!-- 42 -->
+ <bezel name="9.1" element="led"><bounds x="158" y="258" width="6" height="6" /></bezel> <!-- 43 -->
</view>
</mamelayout>
diff --git a/src/mame/layout/rebound.lay b/src/mame/layout/rebound.lay
new file mode 100644
index 00000000000..dda062ec35a
--- /dev/null
+++ b/src/mame/layout/rebound.lay
@@ -0,0 +1,23 @@
+<?xml version="1.0"?>
+<mamelayout version="2">
+
+ <element name="credit_led" defstate="0">
+ <disk state="1">
+ <color red="1.0" green="0.3" blue="0.3" />
+ </disk>
+ <text string="CREDIT" state="1">
+ <color red="0.0" green="0.0" blue="0.0" />
+ <bounds x="0" y="0.1" width="1" height="0.8" />
+ </text>
+ </element>
+
+
+ <view name="Credit Led Overlay">
+ <screen index="0">
+ <bounds left="0" top="0" right="4" bottom="3" />
+ </screen>
+ <bezel name="credit_led" element="credit_led">
+ <bounds x="0.1" y="0.1" width="0.2" height="0.2" />
+ </bezel>
+ </view>
+</mamelayout>
diff --git a/src/mame/layout/risc2500.lay b/src/mame/layout/risc2500.lay
index 4adb6418077..64718c4b15b 100644
--- a/src/mame/layout/risc2500.lay
+++ b/src/mame/layout/risc2500.lay
@@ -181,21 +181,21 @@
<element name="text_up"> <rect><color red="0.63" green="0.63" blue="0.63" /></rect> <text string="&#x2191;" > <color red="0.17" green="0.15" blue="0.15" /></text> </element>
<element name="text_down"> <rect><color red="0.63" green="0.63" blue="0.63" /></rect> <text string="&#x2193;" > <color red="0.17" green="0.15" blue="0.15" /></text> </element>
<element name="text_enter"> <rect><color red="0.63" green="0.63" blue="0.63" /></rect> <text string="ENTER" > <color red="0.17" green="0.15" blue="0.15" /></text> </element>
- <element name="text_p1"> <rect><color red="0.63" green="0.63" blue="0.63" /></rect> <text string="&#x265a;" > <color red="0.17" green="0.15" blue="0.15" /></text> </element>
- <element name="text_p2"> <rect><color red="0.63" green="0.63" blue="0.63" /></rect> <text string="&#x265b;" > <color red="0.17" green="0.15" blue="0.15" /></text> </element>
- <element name="text_p3"> <rect><color red="0.63" green="0.63" blue="0.63" /></rect> <text string="&#x265c;" > <color red="0.17" green="0.15" blue="0.15" /></text> </element>
- <element name="text_p4"> <rect><color red="0.63" green="0.63" blue="0.63" /></rect> <text string="&#x265d;" > <color red="0.17" green="0.15" blue="0.15" /></text> </element>
- <element name="text_p5"> <rect><color red="0.63" green="0.63" blue="0.63" /></rect> <text string="&#x265e;" > <color red="0.17" green="0.15" blue="0.15" /></text> </element>
- <element name="text_p6"> <rect><color red="0.63" green="0.63" blue="0.63" /></rect> <text string="&#x265f;" > <color red="0.17" green="0.15" blue="0.15" /></text> </element>
+ <element name="text_p1"> <rect><color red="0.63" green="0.63" blue="0.63" /></rect> <text string="[K]" > <color red="0.17" green="0.15" blue="0.15" /></text> </element>
+ <element name="text_p2"> <rect><color red="0.63" green="0.63" blue="0.63" /></rect> <text string="[Q]" > <color red="0.17" green="0.15" blue="0.15" /></text> </element>
+ <element name="text_p3"> <rect><color red="0.63" green="0.63" blue="0.63" /></rect> <text string="[R]" > <color red="0.17" green="0.15" blue="0.15" /></text> </element>
+ <element name="text_p4"> <rect><color red="0.63" green="0.63" blue="0.63" /></rect> <text string="[B]" > <color red="0.17" green="0.15" blue="0.15" /></text> </element>
+ <element name="text_p5"> <rect><color red="0.63" green="0.63" blue="0.63" /></rect> <text string="[N]" > <color red="0.17" green="0.15" blue="0.15" /></text> </element>
+ <element name="text_p6"> <rect><color red="0.63" green="0.63" blue="0.63" /></rect> <text string="[P]" > <color red="0.17" green="0.15" blue="0.15" /></text> </element>
<element name="sym_colon"> <rect><color red="0.00" green="0.00" blue="0.00" /></rect> <text string=":" state="1"> <color red="1.0" green="1.0" blue="1.0" /></text> </element>
<element name="sym_left"> <rect><color red="0.00" green="0.00" blue="0.00" /></rect> <text string="&#x2190;" state="1"> <color red="1.0" green="1.0" blue="1.0" /> </text> </element>
<element name="sym_right"> <rect><color red="0.00" green="0.00" blue="0.00" /></rect> <text string="&#x2192;" state="1"> <color red="1.0" green="1.0" blue="1.0" /> </text> </element>
- <element name="sym_p1"> <rect><color red="0.00" green="0.00" blue="0.00" /></rect> <text string="&#x265a;" state="1"> <color red="1.0" green="1.0" blue="1.0" /> </text> </element>
- <element name="sym_p2"> <rect><color red="0.00" green="0.00" blue="0.00" /></rect> <text string="&#x265b;" state="1"> <color red="1.0" green="1.0" blue="1.0" /> </text> </element>
- <element name="sym_p3"> <rect><color red="0.00" green="0.00" blue="0.00" /></rect> <text string="&#x265c;" state="1"> <color red="1.0" green="1.0" blue="1.0" /> </text> </element>
- <element name="sym_p4"> <rect><color red="0.00" green="0.00" blue="0.00" /></rect> <text string="&#x265d;" state="1"> <color red="1.0" green="1.0" blue="1.0" /> </text> </element>
- <element name="sym_p5"> <rect><color red="0.00" green="0.00" blue="0.00" /></rect> <text string="&#x265e;" state="1"> <color red="1.0" green="1.0" blue="1.0" /> </text> </element>
- <element name="sym_p6"> <rect><color red="0.00" green="0.00" blue="0.00" /></rect> <text string="&#x265f;" state="1"> <color red="1.0" green="1.0" blue="1.0" /> </text> </element>
+ <element name="sym_p1"> <rect><color red="0.00" green="0.00" blue="0.00" /></rect> <text string="[K]" state="1"> <color red="1.0" green="1.0" blue="1.0" /> </text> </element>
+ <element name="sym_p2"> <rect><color red="0.00" green="0.00" blue="0.00" /></rect> <text string="[Q]" state="1"> <color red="1.0" green="1.0" blue="1.0" /> </text> </element>
+ <element name="sym_p3"> <rect><color red="0.00" green="0.00" blue="0.00" /></rect> <text string="[R]" state="1"> <color red="1.0" green="1.0" blue="1.0" /> </text> </element>
+ <element name="sym_p4"> <rect><color red="0.00" green="0.00" blue="0.00" /></rect> <text string="[B]" state="1"> <color red="1.0" green="1.0" blue="1.0" /> </text> </element>
+ <element name="sym_p5"> <rect><color red="0.00" green="0.00" blue="0.00" /></rect> <text string="[N]" state="1"> <color red="1.0" green="1.0" blue="1.0" /> </text> </element>
+ <element name="sym_p6"> <rect><color red="0.00" green="0.00" blue="0.00" /></rect> <text string="[P]" state="1"> <color red="1.0" green="1.0" blue="1.0" /> </text> </element>
<element name="sym_white"> <rect><color red="0.00" green="0.00" blue="0.00" /></rect> <text string="&#x25cb;" state="1"> <color red="1.0" green="1.0" blue="1.0" /> </text> </element>
<element name="sym_black"> <text string="&#x25cf;" state="1"> <color red="1.0" green="1.0" blue="1.0" /> </text> </element>
<element name="white"><rect><color red="1" green="1" blue="1" /></rect></element>
@@ -203,19 +203,19 @@
<element name="background"><rect><color red="0.63" green="0.63" blue="0.63" /></rect></element>
<element name="piece" defstate="0">
- <text string="&#x265a;" state="1"><color red="0.27" green="0.25" blue="0.25" /></text>
- <text string="&#x265b;" state="2"><color red="0.27" green="0.25" blue="0.25" /></text>
- <text string="&#x265c;" state="3"><color red="0.27" green="0.25" blue="0.25" /></text>
- <text string="&#x265d;" state="4"><color red="0.27" green="0.25" blue="0.25" /></text>
- <text string="&#x265e;" state="5"><color red="0.27" green="0.25" blue="0.25" /></text>
- <text string="&#x265f;" state="6"><color red="0.27" green="0.25" blue="0.25" /></text>
-
- <text string="&#x265a;" state="7"><color red="0.71" green="0.7" blue="0.69" /></text>
- <text string="&#x265b;" state="8"><color red="0.71" green="0.7" blue="0.69" /></text>
- <text string="&#x265c;" state="9"><color red="0.71" green="0.7" blue="0.69" /></text>
- <text string="&#x265d;" state="10"><color red="0.71" green="0.7" blue="0.69" /></text>
- <text string="&#x265e;" state="11"><color red="0.71" green="0.7" blue="0.69" /></text>
- <text string="&#x265f;" state="12"><color red="0.71" green="0.7" blue="0.69" /></text>
+ <text string="[K]" state="1"><color red="0.27" green="0.25" blue="0.25" /></text>
+ <text string="[Q]" state="2"><color red="0.27" green="0.25" blue="0.25" /></text>
+ <text string="[R]" state="3"><color red="0.27" green="0.25" blue="0.25" /></text>
+ <text string="[B]" state="4"><color red="0.27" green="0.25" blue="0.25" /></text>
+ <text string="[N]" state="5"><color red="0.27" green="0.25" blue="0.25" /></text>
+ <text string="[P]" state="6"><color red="0.27" green="0.25" blue="0.25" /></text>
+
+ <text string="[K]" state="7"><color red="0.71" green="0.7" blue="0.69" /></text>
+ <text string="[Q]" state="8"><color red="0.71" green="0.7" blue="0.69" /></text>
+ <text string="[R]" state="9"><color red="0.71" green="0.7" blue="0.69" /></text>
+ <text string="[B]" state="10"><color red="0.71" green="0.7" blue="0.69" /></text>
+ <text string="[N]" state="11"><color red="0.71" green="0.7" blue="0.69" /></text>
+ <text string="[P]" state="12"><color red="0.71" green="0.7" blue="0.69" /></text>
<!-- selected pieces -->
<disk state="17"> <color red="1.00" green="0.25" blue="1.00" /> </disk>
@@ -231,19 +231,19 @@
<disk state="27"> <color red="1.00" green="0.25" blue="1.00" /> </disk>
<disk state="28"> <color red="1.00" green="0.25" blue="1.00" /> </disk>
- <text string="&#x265a;" state="17"><color red="0.27" green="0.25" blue="0.25" /></text>
- <text string="&#x265b;" state="18"><color red="0.27" green="0.25" blue="0.25" /></text>
- <text string="&#x265c;" state="19"><color red="0.27" green="0.25" blue="0.25" /></text>
- <text string="&#x265d;" state="20"><color red="0.27" green="0.25" blue="0.25" /></text>
- <text string="&#x265e;" state="21"><color red="0.27" green="0.25" blue="0.25" /></text>
- <text string="&#x265f;" state="22"><color red="0.27" green="0.25" blue="0.25" /></text>
-
- <text string="&#x265a;" state="23"><color red="0.71" green="0.7" blue="0.69" /></text>
- <text string="&#x265b;" state="24"><color red="0.71" green="0.7" blue="0.69" /></text>
- <text string="&#x265c;" state="25"><color red="0.71" green="0.7" blue="0.69" /></text>
- <text string="&#x265d;" state="26"><color red="0.71" green="0.7" blue="0.69" /></text>
- <text string="&#x265e;" state="27"><color red="0.71" green="0.7" blue="0.69" /></text>
- <text string="&#x265f;" state="28"><color red="0.71" green="0.7" blue="0.69" /></text>
+ <text string="[K]" state="17"><color red="0.27" green="0.25" blue="0.25" /></text>
+ <text string="[Q]" state="18"><color red="0.27" green="0.25" blue="0.25" /></text>
+ <text string="[R]" state="19"><color red="0.27" green="0.25" blue="0.25" /></text>
+ <text string="[B]" state="20"><color red="0.27" green="0.25" blue="0.25" /></text>
+ <text string="[N]" state="21"><color red="0.27" green="0.25" blue="0.25" /></text>
+ <text string="[P]" state="22"><color red="0.27" green="0.25" blue="0.25" /></text>
+
+ <text string="[K]" state="23"><color red="0.71" green="0.7" blue="0.69" /></text>
+ <text string="[Q]" state="24"><color red="0.71" green="0.7" blue="0.69" /></text>
+ <text string="[R]" state="25"><color red="0.71" green="0.7" blue="0.69" /></text>
+ <text string="[B]" state="26"><color red="0.71" green="0.7" blue="0.69" /></text>
+ <text string="[N]" state="27"><color red="0.71" green="0.7" blue="0.69" /></text>
+ <text string="[P]" state="28"><color red="0.71" green="0.7" blue="0.69" /></text>
</element>
<!-- build screen -->
@@ -479,12 +479,12 @@
<bezel name="digit0" element="digit" ><bounds x="122.85" y="9" width="1.6" height="3" /></bezel>
<bezel name="sym1" element="sym_right" > <bounds x="121.60" y="12.7" width="3" height="3" /></bezel>
- <bezel name="sym2" element="sym_p6" > <bounds x="116.60" y="12.5" width="5" height="3" /></bezel>
- <bezel name="sym3" element="sym_p5" > <bounds x="113.75" y="12.5" width="4" height="3" /></bezel>
- <bezel name="sym4" element="sym_p4" > <bounds x="110.88" y="12.5" width="4" height="3" /></bezel>
- <bezel name="sym6" element="sym_p3" > <bounds x="108.00" y="12.5" width="4" height="3" /></bezel>
- <bezel name="sym7" element="sym_p2" > <bounds x="105.13" y="12.5" width="4" height="3" /></bezel>
- <bezel name="sym8" element="sym_p1" > <bounds x="102.25" y="12.5" width="4" height="3" /></bezel>
+ <bezel name="sym2" element="sym_p6" > <bounds x="116.60" y="12.7" width="3.5" height="2.2" /></bezel>
+ <bezel name="sym3" element="sym_p5" > <bounds x="113.75" y="12.7" width="3.5" height="2.2" /></bezel>
+ <bezel name="sym4" element="sym_p4" > <bounds x="110.88" y="12.7" width="3.5" height="2.2" /></bezel>
+ <bezel name="sym6" element="sym_p3" > <bounds x="108.00" y="12.7" width="3.5" height="2.2" /></bezel>
+ <bezel name="sym7" element="sym_p2" > <bounds x="105.13" y="12.7" width="3.5" height="2.2" /></bezel>
+ <bezel name="sym8" element="sym_p1" > <bounds x="102.25" y="12.7" width="3.5" height="2.2" /></bezel>
<bezel name="sym9" element="sym_white" > <bounds x="99.00" y="12.5" width="4" height="3" /></bezel>
<bezel name="sym10" element="sym_black" > <bounds x="99.90" y="13.0" width="2.2" height="2.2" /></bezel>
<bezel name="sym11" element="sym_left" > <bounds x="95.40" y="12.7" width="3" height="3" /></bezel>
@@ -504,12 +504,12 @@
<bezel element="text_down" ><bounds x="132" y="51" width="7" height="3" /></bezel>
<bezel element="text_enter" ><bounds x="141" y="52" width="7" height="2" /></bezel>
- <bezel element="text_p1" ><bounds x="96" y="65" width="7" height="5" /></bezel>
- <bezel element="text_p2" ><bounds x="105" y="65" width="7" height="5" /></bezel>
- <bezel element="text_p3" ><bounds x="114" y="65" width="7" height="5" /></bezel>
- <bezel element="text_p4" ><bounds x="123" y="65" width="7" height="5" /></bezel>
- <bezel element="text_p5" ><bounds x="132" y="65" width="7" height="5" /></bezel>
- <bezel element="text_p6" ><bounds x="141" y="65" width="7" height="5" /></bezel>
+ <bezel element="text_p1" ><bounds x="96" y="66" width="7" height="3" /></bezel>
+ <bezel element="text_p2" ><bounds x="105" y="66" width="7" height="3" /></bezel>
+ <bezel element="text_p3" ><bounds x="114" y="66" width="7" height="3" /></bezel>
+ <bezel element="text_p4" ><bounds x="123" y="66" width="7" height="3" /></bezel>
+ <bezel element="text_p5" ><bounds x="132" y="66" width="7" height="3" /></bezel>
+ <bezel element="text_p6" ><bounds x="141" y="66" width="7" height="3" /></bezel>
<bezel element="button" inputtag="RESET" inputmask="0x00000001"><bounds x="96" y="40" width="8" height="2" /></bezel>
<bezel element="button" inputtag="P7" inputmask="0x80000000"><bounds x="107" y="40" width="8" height="2" /></bezel>
diff --git a/src/mame/layout/sc1.lay b/src/mame/layout/sc1.lay
deleted file mode 100644
index c6ed82b9123..00000000000
--- a/src/mame/layout/sc1.lay
+++ /dev/null
@@ -1,62 +0,0 @@
-<?xml version="1.0"?>
-<mamelayout version="2">
- <element name="digit" defstate="0">
- <led7seg>
- <color red="0.75" green="0.75" blue="0.0" />
- </led7seg>
- </element>
- <element name="led" defstate="0">
- <disk state="1">
- <color red="0.8" green="0.8" blue="0.0" />
- </disk>
- <disk state="0">
- <color red="0.2" green="0.2" blue="0.0" />
- </disk>
- </element>
- <element name="schach">
- <text string="SCHACH">
- <color red="1.0" green="1.0" blue="1.0" /></text>
- </element>
- <element name="matt">
- <text string="MATT">
- <color red="1.0" green="1.0" blue="1.0" /></text>
- </element>
- <element name="background">
- <rect>
- <bounds left="0" top="0" right="1" bottom="1" />
- <color red="0.0" green="0.0" blue="0.0" />
- </rect>
- </element>
-
- <view name="Default Layout">
- <!-- Black background -->
- <bezel element="background">
- <bounds left="00" top="00" right="240" bottom="95" />
- </bezel>
-
- <bezel name="digit0" element="digit">
- <bounds x="10" y="10" width="50" height="80" />
- </bezel>
- <bezel name="digit1" element="digit">
- <bounds x="70" y="10" width="50" height="80" />
- </bezel>
- <bezel name="digit2" element="digit">
- <bounds x="130" y="10" width="50" height="80" />
- </bezel>
- <bezel name="digit3" element="digit">
- <bounds x="190" y="10" width="50" height="80" />
- </bezel>
- <bezel name="led0" element="led">
- <bounds x="10" y="95" width="10" height="10" />
- </bezel>
- <bezel name="led1" element="led">
- <bounds x="220" y="95" width="10" height="10" />
- </bezel>
- <bezel name="schach_str" element="schach">
- <bounds x="20" y="95" width="40" height="10" />
- </bezel>
- <bezel name="matt_str" element="matt">
- <bounds x="185" y="95" width="40" height="10" />
- </bezel>
- </view>
-</mamelayout>
diff --git a/src/mame/layout/sc2.lay b/src/mame/layout/sc2.lay
index c68cee7e136..844169b2f34 100644
--- a/src/mame/layout/sc2.lay
+++ b/src/mame/layout/sc2.lay
@@ -1,62 +1,203 @@
<?xml version="1.0"?>
<mamelayout version="2">
+
+<!-- define elements -->
+
+ <element name="black"><rect><color red="0.22" green="0.22" blue="0.22" /></rect></element>
+ <element name="white"><rect><color red="0.72" green="0.72" blue="0.72" /></rect></element>
+
<element name="digit" defstate="0">
- <led7seg>
- <color red="0.0" green="0.75" blue="0.0" />
- </led7seg>
+ <led7seg><color red="0.25" green="0.9" blue="0.1" /></led7seg>
</element>
+
<element name="led" defstate="0">
- <disk state="1">
- <color red="0.0" green="0.8" blue="0.0" />
- </disk>
- <disk state="0">
- <color red="0.0" green="0.2" blue="0.0" />
- </disk>
- </element>
- <element name="schach">
- <text string="SCHACH">
- <color red="1.0" green="1.0" blue="1.0" /></text>
- </element>
- <element name="matt">
- <text string="MATT">
- <color red="1.0" green="1.0" blue="1.0" /></text>
- </element>
- <element name="background">
- <rect>
- <bounds left="0" top="0" right="1" bottom="1" />
+ <disk state="1"><color red="1.0" green="0.0" blue="0.0" /></disk>
+ <disk state="0"><color red="0.15" green="0.0" blue="0.0" /> </disk>
+ </element>
+
+ <element name="hl" defstate="0">
+ <text string=" ">
+ <bounds x="0.0" y="0.0" width="1.0" height="1.0" />
+ <color red="0.0" green="0.0" blue="0.0" />
+ </text>
+ <rect state="1">
+ <bounds x="0.0" y="0.0" width="1.0" height="1.0" />
<color red="0.0" green="0.0" blue="0.0" />
</rect>
</element>
- <view name="Default Layout">
- <!-- Black background -->
- <bezel element="background">
- <bounds left="00" top="00" right="240" bottom="95" />
- </bezel>
-
- <bezel name="digit0" element="digit">
- <bounds x="10" y="10" width="50" height="80" />
- </bezel>
- <bezel name="digit1" element="digit">
- <bounds x="70" y="10" width="50" height="80" />
- </bezel>
- <bezel name="digit2" element="digit">
- <bounds x="130" y="10" width="50" height="80" />
- </bezel>
- <bezel name="digit3" element="digit">
- <bounds x="190" y="10" width="50" height="80" />
- </bezel>
- <bezel name="led0" element="led">
- <bounds x="10" y="95" width="10" height="10" />
- </bezel>
- <bezel name="led1" element="led">
- <bounds x="220" y="95" width="10" height="10" />
- </bezel>
- <bezel name="schach_str" element="schach">
- <bounds x="20" y="95" width="40" height="10" />
- </bezel>
- <bezel name="matt_str" element="matt">
- <bounds x="185" y="95" width="40" height="10" />
- </bezel>
+ <element name="text_schach"><text string="SCHACH" align="1"><color red="0.8" green="0.8" blue="0.8" /></text></element>
+ <element name="text_matt"><text string="MATT" align="2"><color red="0.8" green="0.8" blue="0.8" /></text></element>
+
+ <element name="text_b01">
+ <rect><color red="0.22" green="0.22" blue="0.22" /></rect>
+ <text string="R"><color red="0.82" green="0.82" blue="0.82" /></text>
+ </element>
+ <element name="text_b02">
+ <rect><color red="0.22" green="0.22" blue="0.22" /></rect>
+ <text string="K"><color red="0.82" green="0.82" blue="0.82" /></text>
+ </element>
+ <element name="text_b03">
+ <rect><color red="0.22" green="0.22" blue="0.22" /></rect>
+ <text string="W"><color red="0.82" green="0.82" blue="0.82" /></text>
+ </element>
+ <element name="text_b04">
+ <rect><color red="0.22" green="0.22" blue="0.22" /></rect>
+ <text string="P"><color red="0.82" green="0.82" blue="0.82" /></text>
+ </element>
+ <element name="text_b05">
+ <rect><color red="0.22" green="0.22" blue="0.22" /></rect>
+ <text string="T"><color red="0.82" green="0.82" blue="0.82" /></text>
+ </element>
+ <element name="text_b06">
+ <rect><color red="0.22" green="0.22" blue="0.22" /></rect>
+ <text string="L"><color red="0.82" green="0.82" blue="0.82" /></text>
+ </element>
+ <element name="text_b07">
+ <rect><color red="0.22" green="0.22" blue="0.22" /></rect>
+ <text string="Q"><color red="0.82" green="0.82" blue="0.82" /></text>
+ </element>
+
+ <element name="text_b08a">
+ <rect><color red="0.72" green="0.72" blue="0.72" /></rect>
+ <text string="A"><color red="0.08" green="0.08" blue="0.08" /></text>
+ </element>
+ <element name="text_b08b">
+ <rect><color red="0.72" green="0.72" blue="0.72" /></rect>
+ <text string="1"><color red="0.08" green="0.08" blue="0.08" /></text>
+ </element>
+ <element name="text_b09a">
+ <rect><color red="0.72" green="0.72" blue="0.72" /></rect>
+ <text string="B"><color red="0.08" green="0.08" blue="0.08" /></text>
+ </element>
+ <element name="text_b09b">
+ <rect><color red="0.72" green="0.72" blue="0.72" /></rect>
+ <text string="2"><color red="0.08" green="0.08" blue="0.08" /></text>
+ </element>
+ <element name="text_b10a">
+ <rect><color red="0.72" green="0.72" blue="0.72" /></rect>
+ <text string="C"><color red="0.08" green="0.08" blue="0.08" /></text>
+ </element>
+ <element name="text_b10b">
+ <rect><color red="0.72" green="0.72" blue="0.72" /></rect>
+ <text string="3"><color red="0.08" green="0.08" blue="0.08" /></text>
+ </element>
+ <element name="text_b11a">
+ <rect><color red="0.72" green="0.72" blue="0.72" /></rect>
+ <text string="D"><color red="0.08" green="0.08" blue="0.08" /></text>
+ </element>
+ <element name="text_b11b">
+ <rect><color red="0.72" green="0.72" blue="0.72" /></rect>
+ <text string="4"><color red="0.08" green="0.08" blue="0.08" /></text>
+ </element>
+ <element name="text_b12a">
+ <rect><color red="0.72" green="0.72" blue="0.72" /></rect>
+ <text string="E"><color red="0.08" green="0.08" blue="0.08" /></text>
+ </element>
+ <element name="text_b12b">
+ <rect><color red="0.72" green="0.72" blue="0.72" /></rect>
+ <text string="5"><color red="0.08" green="0.08" blue="0.08" /></text>
+ </element>
+ <element name="text_b13a">
+ <rect><color red="0.72" green="0.72" blue="0.72" /></rect>
+ <text string="F"><color red="0.08" green="0.08" blue="0.08" /></text>
+ </element>
+ <element name="text_b13b">
+ <rect><color red="0.72" green="0.72" blue="0.72" /></rect>
+ <text string="6"><color red="0.08" green="0.08" blue="0.08" /></text>
+ </element>
+ <element name="text_b14a">
+ <rect><color red="0.72" green="0.72" blue="0.72" /></rect>
+ <text string="G"><color red="0.08" green="0.08" blue="0.08" /></text>
+ </element>
+ <element name="text_b14b">
+ <rect><color red="0.72" green="0.72" blue="0.72" /></rect>
+ <text string="7"><color red="0.08" green="0.08" blue="0.08" /></text>
+ </element>
+ <element name="text_b15a">
+ <rect><color red="0.72" green="0.72" blue="0.72" /></rect>
+ <text string="H"><color red="0.08" green="0.08" blue="0.08" /></text>
+ </element>
+ <element name="text_b15b">
+ <rect><color red="0.72" green="0.72" blue="0.72" /></rect>
+ <text string="8"><color red="0.08" green="0.08" blue="0.08" /></text>
+ </element>
+
+
+<!-- build screen -->
+
+ <view name="Internal Layout">
+ <bounds left="0" right="270" top="0" bottom="395" />
+
+ <bezel name="digit0" element="digit"><bounds x="10" y="10" width="50" height="80" /></bezel>
+ <bezel name="digit1" element="digit"><bounds x="70" y="10" width="50" height="80" /></bezel>
+ <bezel name="digit2" element="digit"><bounds x="150" y="10" width="50" height="80" /></bezel>
+ <bezel name="digit3" element="digit"><bounds x="210" y="10" width="50" height="80" /></bezel>
+
+ <bezel name="led0" element="led"><bounds x="12.5" y="152.5" width="20" height="20" /></bezel>
+ <bezel name="led1" element="led"><bounds x="237.5" y="152.5" width="20" height="20" /></bezel>
+
+ <bezel element="text_schach"><bounds x="5" y="110" width="100" height="20" /></bezel>
+ <bezel element="text_matt"><bounds x="165" y="110" width="100" height="20" /></bezel>
+
+ <!-- button panel -->
+
+ <bezel element="black"><bounds x="42.5" y="135" width="55" height="55" /></bezel>
+ <bezel element="black"><bounds x="107.5" y="135" width="55" height="55" /></bezel>
+ <bezel element="black"><bounds x="172.5" y="135" width="55" height="55" /></bezel>
+ <bezel element="black"><bounds x="10" y="200" width="55" height="55" /></bezel>
+ <bezel element="black"><bounds x="75" y="200" width="55" height="55" /></bezel>
+ <bezel element="black"><bounds x="140" y="200" width="55" height="55" /></bezel>
+ <bezel element="black"><bounds x="205" y="200" width="55" height="55" /></bezel>
+ <bezel element="white"><bounds x="10" y="265" width="55" height="55" /></bezel>
+ <bezel element="white"><bounds x="75" y="265" width="55" height="55" /></bezel>
+ <bezel element="white"><bounds x="140" y="265" width="55" height="55" /></bezel>
+ <bezel element="white"><bounds x="205" y="265" width="55" height="55" /></bezel>
+ <bezel element="white"><bounds x="10" y="330" width="55" height="55" /></bezel>
+ <bezel element="white"><bounds x="75" y="330" width="55" height="55" /></bezel>
+ <bezel element="white"><bounds x="140" y="330" width="55" height="55" /></bezel>
+ <bezel element="white"><bounds x="205" y="330" width="55" height="55" /></bezel>
+
+ <bezel element="text_b01"><bounds x="45" y="145" width="50" height="33" /></bezel>
+ <bezel element="text_b02"><bounds x="110" y="145" width="50" height="33" /></bezel>
+ <bezel element="text_b03"><bounds x="175" y="145" width="50" height="33" /></bezel>
+ <bezel element="text_b04"><bounds x="12.5" y="210" width="50" height="33" /></bezel>
+ <bezel element="text_b05"><bounds x="77.5" y="210" width="50" height="33" /></bezel>
+ <bezel element="text_b06"><bounds x="142.5" y="210" width="50" height="33" /></bezel>
+ <bezel element="text_b07"><bounds x="207.5" y="210" width="50" height="33" /></bezel>
+
+ <bezel element="text_b08a"><bounds x="12.5" y="267.5" width="50" height="25" /></bezel>
+ <bezel element="text_b08b"><bounds x="12.5" y="292.5" width="50" height="25" /></bezel>
+ <bezel element="text_b09a"><bounds x="77.5" y="267.5" width="50" height="25" /></bezel>
+ <bezel element="text_b09b"><bounds x="77.5" y="292.5" width="50" height="25" /></bezel>
+ <bezel element="text_b10a"><bounds x="142.5" y="267.5" width="50" height="25" /></bezel>
+ <bezel element="text_b10b"><bounds x="142.5" y="292.5" width="50" height="25" /></bezel>
+ <bezel element="text_b11a"><bounds x="207.5" y="267.5" width="50" height="25" /></bezel>
+ <bezel element="text_b11b"><bounds x="207.5" y="292.5" width="50" height="25" /></bezel>
+ <bezel element="text_b12a"><bounds x="12.5" y="332.5" width="50" height="25" /></bezel>
+ <bezel element="text_b12b"><bounds x="12.5" y="357.5" width="50" height="25" /></bezel>
+ <bezel element="text_b13a"><bounds x="77.5" y="332.5" width="50" height="25" /></bezel>
+ <bezel element="text_b13b"><bounds x="77.5" y="357.5" width="50" height="25" /></bezel>
+ <bezel element="text_b14a"><bounds x="142.5" y="332.5" width="50" height="25" /></bezel>
+ <bezel element="text_b14b"><bounds x="142.5" y="357.5" width="50" height="25" /></bezel>
+ <bezel element="text_b15a"><bounds x="207.5" y="332.5" width="50" height="25" /></bezel>
+ <bezel element="text_b15b"><bounds x="207.5" y="357.5" width="50" height="25" /></bezel>
+
+ <bezel element="hl" inputtag="LINE4" inputmask="0x40"><bounds x="42.5" y="135" width="55" height="55" /><color alpha="0.22" /></bezel>
+ <bezel element="hl" inputtag="LINE4" inputmask="0x10"><bounds x="107.5" y="135" width="55" height="55" /><color alpha="0.22" /></bezel>
+ <bezel element="hl" inputtag="LINE4" inputmask="0x20"><bounds x="172.5" y="135" width="55" height="55" /><color alpha="0.22" /></bezel>
+ <bezel element="hl" inputtag="LINE4" inputmask="0x80"><bounds x="10" y="200" width="55" height="55" /><color alpha="0.22" /></bezel>
+ <bezel element="hl" inputtag="LINE1" inputmask="0x20"><bounds x="75" y="200" width="55" height="55" /><color alpha="0.22" /></bezel>
+ <bezel element="hl" inputtag="LINE1" inputmask="0x40"><bounds x="140" y="200" width="55" height="55" /><color alpha="0.22" /></bezel>
+ <bezel element="hl" inputtag="LINE1" inputmask="0x80"><bounds x="205" y="200" width="55" height="55" /><color alpha="0.22" /></bezel>
+ <bezel element="hl" inputtag="LINE2" inputmask="0x10"><bounds x="10" y="265" width="55" height="55" /><color alpha="0.25" /></bezel>
+ <bezel element="hl" inputtag="LINE2" inputmask="0x20"><bounds x="75" y="265" width="55" height="55" /><color alpha="0.25" /></bezel>
+ <bezel element="hl" inputtag="LINE2" inputmask="0x40"><bounds x="140" y="265" width="55" height="55" /><color alpha="0.25" /></bezel>
+ <bezel element="hl" inputtag="LINE2" inputmask="0x80"><bounds x="205" y="265" width="55" height="55" /><color alpha="0.25" /></bezel>
+ <bezel element="hl" inputtag="LINE3" inputmask="0x10"><bounds x="10" y="330" width="55" height="55" /><color alpha="0.25" /></bezel>
+ <bezel element="hl" inputtag="LINE3" inputmask="0x20"><bounds x="75" y="330" width="55" height="55" /><color alpha="0.25" /></bezel>
+ <bezel element="hl" inputtag="LINE3" inputmask="0x40"><bounds x="140" y="330" width="55" height="55" /><color alpha="0.25" /></bezel>
+ <bezel element="hl" inputtag="LINE3" inputmask="0x80"><bounds x="205" y="330" width="55" height="55" /><color alpha="0.25" /></bezel>
+
</view>
</mamelayout>
diff --git a/src/mame/layout/simon.lay b/src/mame/layout/simon.lay
index c268c37ec88..98129551cfb 100644
--- a/src/mame/layout/simon.lay
+++ b/src/mame/layout/simon.lay
@@ -7,16 +7,15 @@
<element name="disk_black"><disk><color red="0.0" green="0.0" blue="0.0" /></disk></element>
<element name="disk_grey"><disk><color red="0.6" green="0.6" blue="0.6" /></disk></element>
-<!-- TODO: add these, maybe -->
<element name="text_game">
<rect><color red="0.6" green="0.6" blue="0.6" /></rect>
- <text string="GAME">
+ <text string="GAME (1-3)" align="1">
<color red="0.0" green="0.0" blue="0.0" />
</text>
</element>
<element name="text_skill">
<rect><color red="0.6" green="0.6" blue="0.6" /></rect>
- <text string="SKILL LEVEL">
+ <text string="SKILL LEVEL (1-4)" align="1">
<color red="0.0" green="0.0" blue="0.0" />
</text>
</element>
@@ -40,6 +39,49 @@
</text>
</element>
+ <element name="text_lb">
+ <disk><color red="0.0" green="0.0" blue="0.0" /></disk>
+ <text string="&#x25c4;">
+ <color red="0.3" green="0.4" blue="0.85" />
+ </text>
+ </element>
+ <element name="text_rb">
+ <disk><color red="0.0" green="0.0" blue="0.0" /></disk>
+ <text string="&#x25ba;">
+ <color red="0.3" green="0.4" blue="0.85" />
+ </text>
+ </element>
+ <element name="text_lg">
+ <disk><color red="0.0" green="0.0" blue="0.0" /></disk>
+ <text string="&#x25c4;">
+ <color red="0.33" green="0.8" blue="0.25" />
+ </text>
+ </element>
+ <element name="text_rg">
+ <disk><color red="0.0" green="0.0" blue="0.0" /></disk>
+ <text string="&#x25ba;">
+ <color red="0.33" green="0.8" blue="0.25" />
+ </text>
+ </element>
+
+ <element name="switch_game" defstate="0">
+ <rect><color red="0.6" green="0.6" blue="0.6" /></rect>
+ <text state="0x02" string="1"><color red="0.0" green="0.0" blue="0.0" /></text>
+ <text state="0x01" string="2"><color red="0.0" green="0.0" blue="0.0" /></text>
+ <text state="0x04" string="3"><color red="0.0" green="0.0" blue="0.0" /></text>
+ </element>
+ <element name="switch_skill" defstate="0">
+ <rect><color red="0.6" green="0.6" blue="0.6" /></rect>
+ <text state="0x02" string="1"><color red="0.0" green="0.0" blue="0.0" /></text>
+ <text state="0x04" string="2"><color red="0.0" green="0.0" blue="0.0" /></text>
+ <text state="0x08" string="3"><color red="0.0" green="0.0" blue="0.0" /></text>
+ <text state="0x01" string="4"><color red="0.0" green="0.0" blue="0.0" /></text>
+ </element>
+
+ <element name="nothing" defstate="0">
+ <text string=" "><color red="0" green="0" blue="0" /></text>
+ </element>
+
<element name="button_r" defstate="0">
<disk><color red="0.0" green="0.0" blue="0.0" /></disk>
<disk state="0">
@@ -131,7 +173,6 @@
<bounds x="140" y="140" width="20" height="20" />
</bezel>
-
<bezel element="static_black">
<bounds x="0" y="90" width="200" height="20" />
</bezel>
@@ -149,6 +190,51 @@
<bounds x="52" y="90" width="96" height="1" />
</bezel>
+ <!-- switches -->
+
+ <bezel element="text_game">
+ <bounds x="68" y="93" width="20" height="4" />
+ </bezel>
+ <bezel element="nothing" inputtag="DUMMY" inputmask="0x01">
+ <bounds x="73.9" y="97.9" width="3.2" height="4.2" />
+ </bezel>
+ <bezel element="switch_game" inputtag="IN.0" inputmask="0x07" inputraw="1">
+ <bounds x="74" y="98" width="3" height="4" />
+ </bezel>
+ <bezel element="text_lg">
+ <bounds x="66.5" y="97" width="6" height="6" />
+ </bezel>
+ <bezel element="nothing" inputtag="SWITCH" inputmask="0x01">
+ <bounds x="65.5" y="96" width="8" height="8" />
+ </bezel>
+ <bezel element="text_rg">
+ <bounds x="78" y="97" width="6" height="6" />
+ </bezel>
+ <bezel element="nothing" inputtag="SWITCH" inputmask="0x02">
+ <bounds x="77" y="96" width="8" height="8" />
+ </bezel>
+
+ <bezel element="text_skill">
+ <bounds x="112" y="93" width="30" height="4" />
+ </bezel>
+ <bezel element="nothing" inputtag="DUMMY" inputmask="0x01">
+ <bounds x="122.9" y="97.9" width="3.2" height="4.2" />
+ </bezel>
+ <bezel element="switch_skill" inputtag="IN.3" inputmask="0x0f" inputraw="1">
+ <bounds x="123" y="98" width="3" height="4" />
+ </bezel>
+ <bezel element="text_lb">
+ <bounds x="115.5" y="97" width="6" height="6" />
+ </bezel>
+ <bezel element="nothing" inputtag="SWITCH" inputmask="0x04">
+ <bounds x="114.5" y="96" width="8" height="8" />
+ </bezel>
+ <bezel element="text_rb">
+ <bounds x="127" y="97" width="6" height="6" />
+ </bezel>
+ <bezel element="nothing" inputtag="SWITCH" inputmask="0x08">
+ <bounds x="126" y="96" width="8" height="8" />
+ </bezel>
<!-- other controls -->
diff --git a/src/mame/layout/slc1a.lay b/src/mame/layout/slc1a.lay
new file mode 100644
index 00000000000..6086c8ac714
--- /dev/null
+++ b/src/mame/layout/slc1a.lay
@@ -0,0 +1,20 @@
+<?xml version="1.0"?>
+<mamelayout version="2">
+
+<!-- define elements -->
+
+ <element name="digit" defstate="0">
+ <led7seg><color red="1.0" green="0.1" blue="0.15" /></led7seg>
+ </element>
+
+
+<!-- build screen -->
+
+ <view name="Internal Layout">
+ <bezel name="digit0" element="digit"><bounds x="0" y="0" width="10" height="15" /></bezel>
+ <bezel name="digit1" element="digit"><bounds x="10" y="0" width="10" height="15" /></bezel>
+ <bezel name="digit2" element="digit"><bounds x="20" y="0" width="10" height="15" /></bezel>
+ <bezel name="digit3" element="digit"><bounds x="30" y="0" width="10" height="15" /></bezel>
+
+ </view>
+</mamelayout>
diff --git a/src/mame/layout/ssimon.lay b/src/mame/layout/ssimon.lay
index 50f9b1f0cc0..9be8cca7a43 100644
--- a/src/mame/layout/ssimon.lay
+++ b/src/mame/layout/ssimon.lay
@@ -4,8 +4,13 @@
<!-- define elements -->
<element name="static_black"><rect><color red="0.0" green="0.0" blue="0.0" /></rect></element>
+ <element name="static_black2"><rect><color red="0.25" green="0.25" blue="0.25" /></rect></element>
<element name="static_grey"><rect><color red="0.6" green="0.6" blue="0.6" /></rect></element>
+ <element name="nothing" defstate="0">
+ <text string=" "><color red="0" green="0" blue="0" /></text>
+ </element>
+
<element name="text_tie">
<rect><color red="0.6" green="0.6" blue="0.6" /></rect>
<text string="TIE"><color red="0.0" green="0.0" blue="0.0" /></text>
@@ -19,23 +24,75 @@
<text string="LOSE"><color red="0.0" green="0.0" blue="0.0" /></text>
</element>
- <element name="text_decision">
- <rect><color red="0.0" green="0.0" blue="0.0" /></rect>
- <text string="DECISION"><color red="0.6" green="0.6" blue="0.6" /></text>
+ <element name="text_1">
+ <rect><color red="0.6" green="0.6" blue="0.6" /></rect>
+ <text string="1"><color red="0.0" green="0.0" blue="0.0" /></text>
+ </element>
+ <element name="text_2">
+ <rect><color red="0.6" green="0.6" blue="0.6" /></rect>
+ <text string="2"><color red="0.0" green="0.0" blue="0.0" /></text>
+ </element>
+ <element name="text_3">
+ <rect><color red="0.6" green="0.6" blue="0.6" /></rect>
+ <text string="3"><color red="0.0" green="0.0" blue="0.0" /></text>
+ </element>
+ <element name="text_4">
+ <rect><color red="0.6" green="0.6" blue="0.6" /></rect>
+ <text string="4"><color red="0.0" green="0.0" blue="0.0" /></text>
+ </element>
+ <element name="text_5">
+ <rect><color red="0.6" green="0.6" blue="0.6" /></rect>
+ <text string="5"><color red="0.0" green="0.0" blue="0.0" /></text>
+ </element>
+ <element name="text_hh">
+ <rect><color red="0.6" green="0.6" blue="0.6" /></rect>
+ <text string="HEAD-HEAD" align="2"><color red="0.0" green="0.0" blue="0.0" /></text>
+ </element>
+ <element name="text_s1">
+ <rect><color red="0.6" green="0.6" blue="0.6" /></rect>
+ <text string="SIMPLE" align="1"><color red="0.0" green="0.0" blue="0.0" /></text>
+ </element>
+ <element name="text_s2">
+ <rect><color red="0.6" green="0.6" blue="0.6" /></rect>
+ <text string="NORMAL" align="1"><color red="0.0" green="0.0" blue="0.0" /></text>
+ </element>
+ <element name="text_s3">
+ <rect><color red="0.6" green="0.6" blue="0.6" /></rect>
+ <text string="SUPER" align="1"><color red="0.0" green="0.0" blue="0.0" /></text>
+ </element>
+
+ <element name="text_speed"><text string="SPEED"><color red="0.6" green="0.6" blue="0.6" /></text></element>
+ <element name="text_game"><text string="GAME"><color red="0.6" green="0.6" blue="0.6" /></text></element>
+ <element name="text_skill"><text string="SKILL LV."><color red="0.6" green="0.6" blue="0.6" /></text></element>
+ <element name="text_decision"><text string="DECISION"><color red="0.6" green="0.6" blue="0.6" /></text></element>
+ <element name="text_longest"><text string="LONGEST"><color red="0.6" green="0.6" blue="0.6" /></text></element>
+ <element name="text_last"><text string="LAST"><color red="0.6" green="0.6" blue="0.6" /></text></element>
+ <element name="text_start"><text string="START"><color red="0.6" green="0.6" blue="0.6" /></text></element>
+
+ <element name="switch0" defstate="0">
+ <text string=" "><color red="0" green="0" blue="0" /></text>
+ <rect state="0"><color red="0.6" green="0.6" blue="0.6" /></rect>
+ </element>
+ <element name="switch1" defstate="0">
+ <text string=" "><color red="0" green="0" blue="0" /></text>
+ <rect state="1"><color red="0.6" green="0.6" blue="0.6" /></rect>
</element>
- <element name="text_longest">
- <rect><color red="0.0" green="0.0" blue="0.0" /></rect>
- <text string="LONGEST"><color red="0.6" green="0.6" blue="0.6" /></text>
+ <element name="switch2" defstate="0">
+ <text string=" "><color red="0" green="0" blue="0" /></text>
+ <rect state="2"><color red="0.6" green="0.6" blue="0.6" /></rect>
</element>
- <element name="text_last">
- <rect><color red="0.0" green="0.0" blue="0.0" /></rect>
- <text string="LAST"><color red="0.6" green="0.6" blue="0.6" /></text>
+ <element name="switch4" defstate="0">
+ <text string=" "><color red="0" green="0" blue="0" /></text>
+ <rect state="4"><color red="0.6" green="0.6" blue="0.6" /></rect>
</element>
- <element name="text_start">
- <rect><color red="0.0" green="0.0" blue="0.0" /></rect>
- <text string="START"><color red="0.6" green="0.6" blue="0.6" /></text>
+ <element name="switch8" defstate="0">
+ <text string=" "><color red="0" green="0" blue="0" /></text>
+ <rect state="8"><color red="0.6" green="0.6" blue="0.6" /></rect>
</element>
+ <element name="text_up"><text string="&#x25b2;"><color red="0.6" green="0.6" blue="0.1" /></text></element>
+ <element name="text_down"><text string="&#x25bc;"><color red="0.6" green="0.6" blue="0.1" /></text></element>
+
<element name="button" defstate="0">
<rect>
<color red="0.0" green="0.0" blue="0.0" />
@@ -72,10 +129,7 @@
<!-- build screen -->
<view name="Internal Layout">
- <bounds left="0" right="47" top="0" bottom="53" />
- <bezel element="static_black">
- <bounds left="0" right="47" top="0" bottom="53" />
- </bezel>
+ <bounds left="-8" right="55" top="0" bottom="53" />
<!-- lamps -->
@@ -109,15 +163,15 @@
<bezel element="static_grey"><bounds x="1" y="22" width="45" height="9" /></bezel>
- <bezel element="text_tie"><bounds x="1" y="22.2" width="10" height="0.6" /></bezel>
- <bezel element="text_lose"><bounds x="12" y="22.2" width="10" height="0.6" /></bezel>
- <bezel element="text_win"><bounds x="25" y="22.2" width="10" height="0.6" /></bezel>
- <bezel element="text_lose"><bounds x="36" y="22.2" width="10" height="0.6" /></bezel>
+ <bezel element="text_tie"><bounds x="1" y="22.2" width="10" height="0.9" /></bezel>
+ <bezel element="text_lose"><bounds x="12" y="22.2" width="10" height="0.9" /></bezel>
+ <bezel element="text_win"><bounds x="25" y="22.2" width="10" height="0.9" /></bezel>
+ <bezel element="text_lose"><bounds x="36" y="22.2" width="10" height="0.9" /></bezel>
- <bezel element="text_tie"><bounds x="1" y="30.2" width="10" height="0.6" /></bezel>
- <bezel element="text_win"><bounds x="12" y="30.2" width="10" height="0.6" /></bezel>
- <bezel element="text_lose"><bounds x="25" y="30.2" width="10" height="0.6" /></bezel>
- <bezel element="text_lose"><bounds x="36" y="30.2" width="10" height="0.6" /></bezel>
+ <bezel element="text_tie"><bounds x="1" y="29.9" width="10" height="0.9" /></bezel>
+ <bezel element="text_win"><bounds x="12" y="29.9" width="10" height="0.9" /></bezel>
+ <bezel element="text_lose"><bounds x="25" y="29.9" width="10" height="0.9" /></bezel>
+ <bezel element="text_lose"><bounds x="36" y="29.9" width="10" height="0.9" /></bezel>
<bezel element="static_black"><bounds x="2" y="24" width="7" height="2" /></bezel>
<bezel element="text_decision"><bounds x="2" y="24.3" width="7" height="1.4" /></bezel>
@@ -143,5 +197,87 @@
<bounds x="34.3" y="27" width="3.2" height="2" />
</bezel>
+ <!-- side switches -->
+
+ <bezel element="static_grey"><bounds x="-5" y="16" width="5" height="21" /></bezel>
+ <bezel element="static_black"><bounds x="-4.5" y="24" width="4" height="2" /></bezel>
+ <bezel element="static_black"><bounds x="-4.5" y="27" width="4" height="2" /></bezel>
+ <bezel element="text_speed"><bounds x="-4.5" y="27.6" width="4" height="0.9" /></bezel>
+
+ <bezel element="text_s1"><bounds x="-3.9" y="29.65" width="3.5" height="0.9" /></bezel>
+ <bezel element="text_s2"><bounds x="-3.9" y="30.90" width="3.5" height="0.9" /></bezel>
+ <bezel element="text_s3"><bounds x="-3.9" y="32.15" width="3.5" height="0.9" /></bezel>
+
+ <bezel element="static_black2"><bounds x="-6.5" y="29.125" width="0.5" height="4.5" /></bezel>
+ <bezel element="nothing" inputtag="DUMMY" inputmask="0x01"><bounds x="-7.25" y="29.125" width="2" height="4.5" /></bezel>
+ <bezel element="switch0" inputtag="IN.6" inputmask="0x03" inputraw="1"><bounds x="-7" y="29.625" width="1.5" height="1" /></bezel>
+ <bezel element="switch1" inputtag="IN.6" inputmask="0x03" inputraw="1"><bounds x="-7" y="30.875" width="1.5" height="1" /></bezel>
+ <bezel element="switch2" inputtag="IN.6" inputmask="0x03" inputraw="1"><bounds x="-7" y="32.125" width="1.5" height="1" /></bezel>
+
+ <bezel element="static_black"><bounds x="-6.25" y="30.00" width="2" height="0.25" /></bezel>
+ <bezel element="static_black"><bounds x="-6.25" y="31.25" width="2" height="0.25" /></bezel>
+ <bezel element="static_black"><bounds x="-6.25" y="32.50" width="2" height="0.25" /></bezel>
+
+ <bezel element="text_up"><bounds x="-7.7" y="27.25" width="3" height="1.6" /></bezel>
+ <bezel element="nothing" inputtag="SWITCH" inputmask="0x10"><bounds x="-7.2" y="27.15" width="2" height="1.8" /></bezel>
+ <bezel element="text_down"><bounds x="-7.7" y="33.75" width="3" height="1.6" /></bezel>
+ <bezel element="nothing" inputtag="SWITCH" inputmask="0x20"><bounds x="-7.2" y="33.65" width="2" height="1.8" /></bezel>
+
+ <bezel element="static_grey"><bounds x="47" y="16" width="5" height="21" /></bezel>
+ <bezel element="static_black"><bounds x="47.5" y="24" width="4" height="2" /></bezel>
+ <bezel element="static_black"><bounds x="47.5" y="27" width="4" height="2" /></bezel>
+ <bezel element="text_game"><bounds x="47.5" y="24.6" width="4" height="0.9" /></bezel>
+ <bezel element="text_skill"><bounds x="47.5" y="27.6" width="4" height="0.9" /></bezel>
+
+ <bezel element="text_5"><bounds x="50.25" y="17.40" width="1" height="0.9" /></bezel>
+ <bezel element="text_4"><bounds x="50.25" y="18.65" width="1" height="0.9" /></bezel>
+ <bezel element="text_3"><bounds x="50.25" y="19.90" width="1" height="0.9" /></bezel>
+ <bezel element="text_2"><bounds x="50.25" y="21.15" width="1" height="0.9" /></bezel>
+ <bezel element="text_1"><bounds x="50.25" y="22.40" width="1" height="0.9" /></bezel>
+
+ <bezel element="text_hh"><bounds x="47.25" y="29.65" width="4" height="0.9" /></bezel>
+ <bezel element="text_1"><bounds x="50.25" y="30.90" width="1" height="0.9" /></bezel>
+ <bezel element="text_2"><bounds x="50.25" y="32.15" width="1" height="0.9" /></bezel>
+ <bezel element="text_3"><bounds x="50.25" y="33.40" width="1" height="0.9" /></bezel>
+ <bezel element="text_4"><bounds x="50.25" y="34.65" width="1" height="0.9" /></bezel>
+
+ <bezel element="static_black2"><bounds x="53" y="16.875" width="0.5" height="7" /></bezel>
+ <bezel element="nothing" inputtag="DUMMY" inputmask="0x01"><bounds x="52.25" y="16.875" width="2" height="7" /></bezel>
+ <bezel element="switch0" inputtag="IN.0" inputmask="0x0f" inputraw="1"><bounds x="52.5" y="17.375" width="1.5" height="1" /></bezel>
+ <bezel element="switch8" inputtag="IN.0" inputmask="0x0f" inputraw="1"><bounds x="52.5" y="18.625" width="1.5" height="1" /></bezel>
+ <bezel element="switch4" inputtag="IN.0" inputmask="0x0f" inputraw="1"><bounds x="52.5" y="19.875" width="1.5" height="1" /></bezel>
+ <bezel element="switch2" inputtag="IN.0" inputmask="0x0f" inputraw="1"><bounds x="52.5" y="21.125" width="1.5" height="1" /></bezel>
+ <bezel element="switch1" inputtag="IN.0" inputmask="0x0f" inputraw="1"><bounds x="52.5" y="22.375" width="1.5" height="1" /></bezel>
+
+ <bezel element="static_black2"><bounds x="53" y="29.125" width="0.5" height="7" /></bezel>
+ <bezel element="nothing" inputtag="DUMMY" inputmask="0x01"><bounds x="52.25" y="29.125" width="2" height="7" /></bezel>
+ <bezel element="switch0" inputtag="IN.4" inputmask="0x0f" inputraw="1"><bounds x="52.5" y="29.625" width="1.5" height="1" /></bezel>
+ <bezel element="switch2" inputtag="IN.4" inputmask="0x0f" inputraw="1"><bounds x="52.5" y="30.875" width="1.5" height="1" /></bezel>
+ <bezel element="switch4" inputtag="IN.4" inputmask="0x0f" inputraw="1"><bounds x="52.5" y="32.125" width="1.5" height="1" /></bezel>
+ <bezel element="switch8" inputtag="IN.4" inputmask="0x0f" inputraw="1"><bounds x="52.5" y="33.375" width="1.5" height="1" /></bezel>
+ <bezel element="switch1" inputtag="IN.4" inputmask="0x0f" inputraw="1"><bounds x="52.5" y="34.625" width="1.5" height="1" /></bezel>
+
+ <bezel element="static_black"><bounds x="51.25" y="17.75" width="2" height="0.25" /></bezel>
+ <bezel element="static_black"><bounds x="51.25" y="19.00" width="2" height="0.25" /></bezel>
+ <bezel element="static_black"><bounds x="51.25" y="20.25" width="2" height="0.25" /></bezel>
+ <bezel element="static_black"><bounds x="51.25" y="21.50" width="2" height="0.25" /></bezel>
+ <bezel element="static_black"><bounds x="51.25" y="22.75" width="2" height="0.25" /></bezel>
+
+ <bezel element="static_black"><bounds x="51.25" y="30.00" width="2" height="0.25" /></bezel>
+ <bezel element="static_black"><bounds x="51.25" y="31.25" width="2" height="0.25" /></bezel>
+ <bezel element="static_black"><bounds x="51.25" y="32.50" width="2" height="0.25" /></bezel>
+ <bezel element="static_black"><bounds x="51.25" y="33.75" width="2" height="0.25" /></bezel>
+ <bezel element="static_black"><bounds x="51.25" y="35.00" width="2" height="0.25" /></bezel>
+
+ <bezel element="text_up"><bounds x="51.8" y="15" width="3" height="1.6" /></bezel>
+ <bezel element="nothing" inputtag="SWITCH" inputmask="0x02"><bounds x="52.3" y="14.9" width="2" height="1.8" /></bezel>
+ <bezel element="text_down"><bounds x="51.8" y="24" width="3" height="1.6" /></bezel>
+ <bezel element="nothing" inputtag="SWITCH" inputmask="0x01"><bounds x="52.3" y="23.9" width="2" height="1.8" /></bezel>
+
+ <bezel element="text_up"><bounds x="51.8" y="27.25" width="3" height="1.6" /></bezel>
+ <bezel element="nothing" inputtag="SWITCH" inputmask="0x04"><bounds x="52.3" y="27.15" width="2" height="1.8" /></bezel>
+ <bezel element="text_down"><bounds x="51.8" y="36.25" width="3" height="1.6" /></bezel>
+ <bezel element="nothing" inputtag="SWITCH" inputmask="0x08"><bounds x="52.3" y="36.15" width="2" height="1.8" /></bezel>
+
</view>
</mamelayout>
diff --git a/src/mame/layout/tgm.lay b/src/mame/layout/tgm.lay
new file mode 100644
index 00000000000..04d43cac89d
--- /dev/null
+++ b/src/mame/layout/tgm.lay
@@ -0,0 +1,28 @@
+<?xml version="1.0"?>
+<mamelayout version="2">
+
+<!-- define elements -->
+
+ <element name="digit" defstate="0">
+ <led7seg><color red="0.2" green="1.0" blue="0.85" /></led7seg>
+ </element>
+
+
+<!-- build screen -->
+
+ <view name="Internal Layout">
+ <bezel name="digit11" element="digit"><bounds x="0" y="0" width="10" height="15" /></bezel>
+ <bezel name="digit10" element="digit"><bounds x="10" y="0" width="10" height="15" /></bezel>
+ <bezel name="digit9" element="digit"><bounds x="20" y="0" width="10" height="15" /></bezel>
+ <bezel name="digit8" element="digit"><bounds x="30" y="0" width="10" height="15" /></bezel>
+ <bezel name="digit7" element="digit"><bounds x="40" y="0" width="10" height="15" /></bezel>
+ <bezel name="digit6" element="digit"><bounds x="50" y="0" width="10" height="15" /></bezel>
+ <bezel name="digit5" element="digit"><bounds x="60" y="0" width="10" height="15" /></bezel>
+ <bezel name="digit4" element="digit"><bounds x="70" y="0" width="10" height="15" /></bezel>
+ <bezel name="digit3" element="digit"><bounds x="80" y="0" width="10" height="15" /></bezel>
+ <bezel name="digit2" element="digit"><bounds x="90" y="0" width="10" height="15" /></bezel>
+ <bezel name="digit1" element="digit"><bounds x="100" y="0" width="10" height="15" /></bezel>
+ <bezel name="digit0" element="digit"><bounds x="110" y="0" width="10" height="15" /></bezel>
+
+ </view>
+</mamelayout>
diff --git a/src/mame/layout/ti74.lay b/src/mame/layout/ti74.lay
index 24563b7dc8c..b8df75728a9 100644
--- a/src/mame/layout/ti74.lay
+++ b/src/mame/layout/ti74.lay
@@ -9,20 +9,20 @@
<element name="ind_left" defstate="0">
<rect><color red="0.5412" green="0.57255" blue="0.5804" /></rect>
- <text string="&#x25c0;" align="1" state="0">
+ <text string="&#x25c4;" align="1" state="0">
<color red="0.515" green="0.537" blue="0.548" />
</text>
- <text string="&#x25c0;" align="1" state="1">
+ <text string="&#x25c4;" align="1" state="1">
<color red="0.361" green="0.326" blue="0.346" />
</text>
</element>
<element name="ind_right" defstate="0">
<rect><color red="0.5412" green="0.57255" blue="0.5804" /></rect>
- <text string="&#x25b6;" align="2" state="0">
+ <text string="&#x25ba;" align="2" state="0">
<color red="0.515" green="0.537" blue="0.548" />
</text>
- <text string="&#x25b6;" align="2" state="1">
+ <text string="&#x25ba;" align="2" state="1">
<color red="0.361" green="0.326" blue="0.346" />
</text>
</element>
@@ -172,11 +172,11 @@
<!-- draw top row of lcd indicators -->
<bezel name="lamp10" element="ind_left">
- <bounds x="1.5" y="0" width="20" height="7" />
+ <bounds x="1.5" y="0.5" width="20" height="5.5" />
</bezel>
<bezel name="lamp4" element="ind_right">
- <bounds x="167.5" y="0" width="20" height="7" />
+ <bounds x="167.5" y="0.5" width="20" height="5.5" />
</bezel>
<bezel name="lamp11" element="ind_shift">
diff --git a/src/mame/layout/ti95.lay b/src/mame/layout/ti95.lay
index 7c70bda1e05..ea118cee66b 100644
--- a/src/mame/layout/ti95.lay
+++ b/src/mame/layout/ti95.lay
@@ -39,10 +39,10 @@
<element name="ind_left" defstate="0">
<rect><color red="0.5412" green="0.57255" blue="0.5804" /></rect>
- <text string="&#x25c0;" align="1" state="0">
+ <text string="&#x25c4;" align="1" state="0">
<color red="0.515" green="0.537" blue="0.548" />
</text>
- <text string="&#x25c0;" align="1" state="1">
+ <text string="&#x25c4;" align="1" state="1">
<color red="0.361" green="0.326" blue="0.346" />
</text>
</element>
@@ -259,7 +259,7 @@
<bounds x="1" y="9" width="5" height="5" />
</bezel>
<bezel name="lamp71" element="ind_left">
- <bounds x="8" y="8" width="5" height="7" />
+ <bounds x="7.5" y="8" width="4" height="6" />
</bezel>
<!-- right: run, sys -->
diff --git a/src/mame/layout/tmtennis.lay b/src/mame/layout/tmtennis.lay
new file mode 100644
index 00000000000..1bdddc7cd5e
--- /dev/null
+++ b/src/mame/layout/tmtennis.lay
@@ -0,0 +1,56 @@
+<?xml version="1.0"?>
+<mamelayout version="2">
+
+<!-- define elements -->
+
+ <element name="green"><rect><color red="0" green="0.5" blue="0" /></rect></element>
+ <element name="greena"><rect><color red="0" green="1" blue="0" /></rect></element>
+ <element name="greend"><rect><color red="0" green="1" blue="0" /></rect></element>
+
+
+<!-- build screen -->
+
+ <view name="Internal Layout">
+ <screen index="0"><bounds x="10" y="10" width="64" height="13.9" /></screen>
+
+ <!-- draw the tennis court -->
+
+ <repeat count="201">
+ <param name="x" start="6.9" increment="0.0475" />
+ <param name="y" start="27" increment="-0.105" />
+ <bezel element="greend"><bounds x="~x~" y="~y~" width="0.35" height="0.35" /><color alpha="0.18" /></bezel>
+ </repeat>
+
+ <repeat count="201">
+ <param name="x" start="76.8" increment="-0.0475" />
+ <param name="y" start="27" increment="-0.105" />
+ <bezel element="greend"><bounds x="~x~" y="~y~" width="0.35" height="0.35" /><color alpha="0.18" /></bezel>
+ </repeat>
+
+ <repeat count="159">
+ <param name="x" start="20.7" increment="0.029" />
+ <param name="y" start="24.7" increment="-0.105" />
+ <bezel element="greend"><bounds x="~x~" y="~y~" width="0.35" height="0.35" /><color alpha="0.18" /></bezel>
+ </repeat>
+
+ <repeat count="159">
+ <param name="x" start="63" increment="-0.029" />
+ <param name="y" start="24.7" increment="-0.105" />
+ <bezel element="greend"><bounds x="~x~" y="~y~" width="0.35" height="0.35" /><color alpha="0.18" /></bezel>
+ </repeat>
+
+ <bezel element="greena"><bounds x="41.85" y="6" width="0.3" height="20" /><color alpha="0.5" /></bezel>
+
+ <bezel element="green"><bounds x="16.5" y="6.1" width="51" height="0.3" /></bezel>
+ <bezel element="green"><bounds x="15.7" y="8" width="52.6" height="0.3" /></bezel>
+
+ <bezel element="green"><bounds x="23.35" y="15.9" width="37.3" height="0.3" /></bezel>
+
+ <bezel element="green"><bounds x="8.1" y="24.8" width="67.8" height="0.3" /></bezel>
+ <bezel element="green"><bounds x="7" y="27" width="70" height="0.3" /></bezel>
+
+ <bezel element="green"><bounds x="41.4" y="2.3" width="1.2" height="3.9" /></bezel>
+ <bezel element="green"><bounds x="41.4" y="23" width="1.2" height="4.2" /></bezel>
+
+ </view>
+</mamelayout>
diff --git a/src/mame/layout/tntell.lay b/src/mame/layout/tntell.lay
index 629a79643c2..ce4f1c733d8 100644
--- a/src/mame/layout/tntell.lay
+++ b/src/mame/layout/tntell.lay
@@ -5,6 +5,7 @@
<element name="static_black"><rect><color red="0.1" green="0.1" blue="0.1" /></rect></element>
<element name="static_white"><rect><color red="0.98" green="0.98" blue="1.0" /></rect></element>
+ <element name="overlay_default" defstate="4"><text string=" "></text></element>
<element name="text_on">
<rect><color red="0.98" green="0.98" blue="1.0" /></rect>
@@ -40,6 +41,11 @@
<view name="Internal Layout">
<bounds left="3" right="71.8" top="9.7" bottom="71.8" />
+
+ <!-- this "overlay_code" example only works for 1 view, since MAME parses all views and not just current active one -->
+ <!-- you can also put the overlay code in the view name, as $XX where XX is the hex value of the overlay in tispeak.cpp -->
+ <bezel name="overlay_code" element="overlay_default"><bounds x="0" y="0" width="1" height="1" /></bezel>
+
<bezel element="static_black">
<bounds left="3" right="71.8" top="9.7" bottom="71.8" />
</bezel>
diff --git a/src/mame/layout/touchme.lay b/src/mame/layout/touchme.lay
index 00745eaa252..7d514b91729 100644
--- a/src/mame/layout/touchme.lay
+++ b/src/mame/layout/touchme.lay
@@ -34,6 +34,31 @@
<rect><color red="0.7" green="0.72" blue="0.75" /></rect>
<text string="SKILL"><color red="0.02" green="0.02" blue="0.02" /></text>
</element>
+ <element name="text_s1">
+ <rect><color red="0.7" green="0.72" blue="0.75" /></rect>
+ <text string="1"><color red="0.02" green="0.02" blue="0.02" /></text>
+ </element>
+ <element name="text_s2">
+ <rect><color red="0.7" green="0.72" blue="0.75" /></rect>
+ <text string="2"><color red="0.02" green="0.02" blue="0.02" /></text>
+ </element>
+ <element name="text_s3">
+ <rect><color red="0.7" green="0.72" blue="0.75" /></rect>
+ <text string="3"><color red="0.02" green="0.02" blue="0.02" /></text>
+ </element>
+
+ <element name="switch1" defstate="0">
+ <text string=" "><color red="0" green="0" blue="0" /></text>
+ <disk state="0x06"><color red="0.45" green="0.45" blue="0.45" /></disk>
+ </element>
+ <element name="switch2" defstate="0">
+ <text string=" "><color red="0" green="0" blue="0" /></text>
+ <disk state="0x05"><color red="0.45" green="0.45" blue="0.45" /></disk>
+ </element>
+ <element name="switch3" defstate="0">
+ <text string=" "><color red="0" green="0" blue="0" /></text>
+ <disk state="0x03"><color red="0.45" green="0.45" blue="0.45" /></disk>
+ </element>
<element name="hl" defstate="0">
<text string=" "><color red="0.0" green="0.0" blue="0.0" /></text>
@@ -53,14 +78,14 @@
<!-- build screen -->
<view name="Internal Layout">
- <bounds left="1.41" right="10.89" top="5" bottom="19.3" />
+ <bounds left="1.41" right="10.89" top="5" bottom="20" />
<bezel name="digit0" element="digit"><bounds x="5.15" y="5.6" width="1" height="1.5" /></bezel>
<bezel name="digit1" element="digit"><bounds x="6.15" y="5.6" width="1" height="1.5" /></bezel>
<!-- bezel (also allow clicking it) -->
- <bezel element="static_gray"><bounds x="1.4" y="7.7" width="9.5" height="12" /></bezel>
+ <bezel element="static_gray"><bounds x="1.4" y="7.7" width="9.5" height="12.4" /></bezel>
<bezel element="static_black"><bounds x="1.7" y="9.7" width="8.9" height="8.9" /></bezel>
<bezel element="static_blue"><bounds x="2" y="10" width="4" height="4" /></bezel>
@@ -75,37 +100,45 @@
<!-- smooth edges -->
- <bezel element="static_gray"><bounds x="1.5" y="9.5" width="1.3" height="1.3" /></bezel>
- <bezel element="disk_black"><bounds x="1.7" y="9.7" width="2" height="2" /></bezel>
- <bezel element="disk_blue"><bounds x="2" y="10" width="2" height="2" /></bezel>
- <bezel element="disk_blue"><bounds x="2.15" y="10" width="2" height="2" /></bezel>
- <bezel element="disk_blue"><bounds x="2.3" y="10" width="2" height="2" /></bezel>
- <bezel element="disk_blue"><bounds x="2" y="10.15" width="2" height="2" /></bezel>
- <bezel element="disk_blue"><bounds x="2" y="10.3" width="2" height="2" /></bezel>
-
- <bezel element="static_gray"><bounds x="9.5" y="9.5" width="1.3" height="1.3" /></bezel>
- <bezel element="disk_black"><bounds x="8.6" y="9.7" width="2" height="2" /></bezel>
- <bezel element="disk_yellow"><bounds x="8.3" y="10" width="2" height="2" /></bezel>
- <bezel element="disk_yellow"><bounds x="8.15" y="10" width="2" height="2" /></bezel>
- <bezel element="disk_yellow"><bounds x="8.0" y="10" width="2" height="2" /></bezel>
- <bezel element="disk_yellow"><bounds x="8.3" y="10.15" width="2" height="2" /></bezel>
- <bezel element="disk_yellow"><bounds x="8.3" y="10.3" width="2" height="2" /></bezel>
-
- <bezel element="static_gray"><bounds x="1.5" y="17.5" width="1.3" height="1.3" /></bezel>
- <bezel element="disk_black"><bounds x="1.7" y="16.6" width="2" height="2" /></bezel>
- <bezel element="disk_red"><bounds x="2" y="16.3" width="2" height="2" /></bezel>
- <bezel element="disk_red"><bounds x="2.15" y="16.3" width="2" height="2" /></bezel>
- <bezel element="disk_red"><bounds x="2.3" y="16.3" width="2" height="2" /></bezel>
- <bezel element="disk_red"><bounds x="2" y="16.15" width="2" height="2" /></bezel>
- <bezel element="disk_red"><bounds x="2" y="16.0" width="2" height="2" /></bezel>
-
- <bezel element="static_gray"><bounds x="9.5" y="17.5" width="1.3" height="1.3" /></bezel>
- <bezel element="disk_black"><bounds x="8.6" y="16.6" width="2" height="2" /></bezel>
- <bezel element="disk_green"><bounds x="8.3" y="16.3" width="2" height="2" /></bezel>
- <bezel element="disk_green"><bounds x="8.15" y="16.3" width="2" height="2" /></bezel>
- <bezel element="disk_green"><bounds x="8.0" y="16.3" width="2" height="2" /></bezel>
- <bezel element="disk_green"><bounds x="8.3" y="16.15" width="2" height="2" /></bezel>
- <bezel element="disk_green"><bounds x="8.3" y="16.0" width="2" height="2" /></bezel>
+ <bezel element="static_gray"><bounds x="1.5" y="9.3" width="1.55" height="1.55" /></bezel>
+ <bezel element="disk_black"><bounds x="1.7" y="9.7" width="2.6" height="2.6" /></bezel>
+ <repeat count="10">
+ <param name="x" start="2.0" increment="0.1" />
+ <param name="y" start="10.0" increment="0.1" />
+ <bezel element="disk_blue"><bounds x="2.0" y="~y~" width="2" height="2" /></bezel>
+ <bezel element="disk_blue"><bounds x="~x~" y="10.0" width="2" height="2" /></bezel>
+ <bezel element="disk_blue"><bounds x="~x~" y="~y~" width="2" height="2" /></bezel>
+ </repeat>
+
+ <bezel element="static_gray"><bounds x="9.25" y="9.3" width="1.55" height="1.55" /></bezel>
+ <bezel element="disk_black"><bounds x="8.0" y="9.7" width="2.6" height="2.6" /></bezel>
+ <repeat count="10">
+ <param name="x" start="8.31" increment="-0.1" />
+ <param name="y" start="10.0" increment="0.1" />
+ <bezel element="disk_yellow"><bounds x="8.31" y="~y~" width="2" height="2" /></bezel>
+ <bezel element="disk_yellow"><bounds x="~x~" y="10.0" width="2" height="2" /></bezel>
+ <bezel element="disk_yellow"><bounds x="~x~" y="~y~" width="2" height="2" /></bezel>
+ </repeat>
+
+ <bezel element="static_gray"><bounds x="1.5" y="17.25" width="1.55" height="1.55" /></bezel>
+ <bezel element="disk_black"><bounds x="1.7" y="16.0" width="2.6" height="2.6" /></bezel>
+ <repeat count="10">
+ <param name="x" start="2.0" increment="0.1" />
+ <param name="y" start="16.31" increment="-0.1" />
+ <bezel element="disk_red"><bounds x="2.0" y="~y~" width="2" height="2" /></bezel>
+ <bezel element="disk_red"><bounds x="~x~" y="16.31" width="2" height="2" /></bezel>
+ <bezel element="disk_red"><bounds x="~x~" y="~y~" width="2" height="2" /></bezel>
+ </repeat>
+
+ <bezel element="static_gray"><bounds x="9.25" y="17.25" width="1.55" height="1.55" /></bezel>
+ <bezel element="disk_black"><bounds x="8.0" y="16.0" width="2.6" height="2.6" /></bezel>
+ <repeat count="10">
+ <param name="x" start="8.31" increment="-0.1" />
+ <param name="y" start="16.31" increment="-0.1" />
+ <bezel element="disk_green"><bounds x="8.31" y="~y~" width="2" height="2" /></bezel>
+ <bezel element="disk_green"><bounds x="~x~" y="16.31" width="2" height="2" /></bezel>
+ <bezel element="disk_green"><bounds x="~x~" y="~y~" width="2" height="2" /></bezel>
+ </repeat>
<!-- middle buttons, leds -->
@@ -151,5 +184,21 @@
<bezel element="hl" inputtag="IN.0" inputmask="0x04"><bounds x="6.6" y="8.4" width="1.5" height="1" /><color alpha="0.25" /></bezel>
<bezel element="hl" inputtag="IN.0" inputmask="0x08"><bounds x="9.0" y="8.4" width="1.5" height="1" /><color alpha="0.25" /></bezel>
+ <!-- bottom switch -->
+
+ <bezel element="text_s1"><bounds x="7.55" y="19.45" width="0.6" height="0.5" /></bezel>
+ <bezel element="text_s2"><bounds x="8.00" y="19.45" width="0.6" height="0.5" /></bezel>
+ <bezel element="text_s3"><bounds x="8.45" y="19.45" width="0.6" height="0.5" /></bezel>
+ <bezel element="disk_black"><bounds x="8.00" y="19.67" width="0.1" height="0.1" /></bezel>
+ <bezel element="disk_black"><bounds x="8.45" y="19.67" width="0.1" height="0.1" /></bezel>
+
+ <bezel element="disk_black"><bounds x="7.6" y="18.9" width="0.5" height="0.5" /></bezel>
+ <bezel element="disk_black"><bounds x="8.5" y="18.9" width="0.5" height="0.5" /></bezel>
+ <bezel element="static_black"><bounds x="7.8" y="18.9" width="1.0" height="0.5" /></bezel>
+
+ <bezel element="switch1" inputtag="IN.2" inputmask="0x07" inputraw="1"><bounds x="7.55" y="18.85" width="0.6" height="0.6" /></bezel>
+ <bezel element="switch2" inputtag="IN.2" inputmask="0x07" inputraw="1"><bounds x="8.00" y="18.85" width="0.6" height="0.6" /></bezel>
+ <bezel element="switch3" inputtag="IN.2" inputmask="0x07" inputraw="1"><bounds x="8.45" y="18.85" width="0.6" height="0.6" /></bezel>
+
</view>
</mamelayout>
diff --git a/src/mame/layout/wildfire.lay b/src/mame/layout/wildfire.lay
index 3c9a3fae054..c8782668f27 100644
--- a/src/mame/layout/wildfire.lay
+++ b/src/mame/layout/wildfire.lay
@@ -3,41 +3,126 @@
<!-- define elements -->
- <element name="static_black"><rect><color red="0.0" green="0.0" blue="0.0" /></rect></element>
-
<element name="digit" defstate="0">
<led7seg><color red="1.0" green="0.20" blue="0.22" /></led7seg>
</element>
+
<element name="led" defstate="0">
- <disk state="0"><color red="0.2" green="0.04" blue="0.05" /></disk>
+ <disk state="0"><color red="0.14" green="0.02" blue="0.03" /></disk>
<disk state="1"><color red="1.0" green="0.20" blue="0.22" /></disk>
</element>
<!-- build screen -->
- <view name="Test Layout">
- <bounds left="0" right="64" top="0" bottom="64" />
- <bezel element="static_black">
- <bounds left="0" right="64" top="0" bottom="64" />
- </bezel>
-
- <bezel name="digit0" element="digit"><bounds x="0" y="0" width="10" height="15" /></bezel>
- <bezel name="digit1" element="digit"><bounds x="10" y="0" width="10" height="15" /></bezel>
- <bezel name="digit2" element="digit"><bounds x="20" y="0" width="10" height="15" /></bezel>
-
- <!-- 13*8 matrix (first 3 are the 7segs) -->
-
- <repeat count="13">
- <param name="ypos" start="20" increment="2" />
- <param name="rowno" start="0" increment="10" />
- <repeat count="8">
- <param name="xpos" start="0" increment="2" />
- <param name="lampno" start="~rowno~" increment="1" />
- <bezel name="lamp~lampno~" element="led">
- <bounds x="~xpos~" y="~ypos~" width="1" height="1" />
- </bezel>
- </repeat>
+ <view name="Internal Layout">
+ <bounds left="4" right="96.5" top="-2" bottom="172" />
+
+ <bezel name="digit0" element="digit"><bounds x="38" y="0" width="8" height="12" /></bezel>
+ <bezel name="digit1" element="digit"><bounds x="46" y="0" width="8" height="12" /></bezel>
+ <bezel name="digit2" element="digit"><bounds x="54" y="0" width="8" height="12" /></bezel>
+
+ <bezel name="10.7" element="led"><bounds x="90.5" y="135" width="4" height="4" /></bezel> <!-- L1 -->
+ <bezel name="10.0" element="led"><bounds x="90.5" y="117" width="4" height="4" /></bezel> <!-- L2 -->
+ <bezel name="10.1" element="led"><bounds x="90.5" y="99" width="4" height="4" /></bezel> <!-- L3 -->
+ <bezel name="10.2" element="led"><bounds x="90.5" y="81.5" width="4" height="4" /></bezel> <!-- L4 -->
+ <bezel name="10.3" element="led"><bounds x="90.5" y="63.5" width="4" height="4" /></bezel> <!-- L5 -->
+ <bezel name="10.4" element="led"><bounds x="84" y="46" width="4" height="4" /></bezel> <!-- L6 -->
+ <bezel name="10.5" element="led"><bounds x="73" y="32.5" width="4" height="4" /></bezel> <!-- L7 -->
+ <bezel name="8.6" element="led"><bounds x="60.5" y="26" width="4" height="4" /></bezel> <!-- L8 -->
+ <bezel name="7.6" element="led"><bounds x="47.5" y="23.5" width="4" height="4" /></bezel> <!-- L9 -->
+
+ <bezel name="6.6" element="led"><bounds x="34.5" y="26" width="4" height="4" /></bezel> <!-- L10 -->
+ <bezel name="5.6" element="led"><bounds x="21.5" y="32.5" width="4" height="4" /></bezel> <!-- L11 -->
+ <bezel name="6.5" element="led"><bounds x="34.5" y="43.5" width="4" height="4" /></bezel> <!-- L12 -->
+ <bezel name="7.5" element="led"><bounds x="47.5" y="41.5" width="4" height="4" /></bezel> <!-- L13 -->
+ <bezel name="8.5" element="led"><bounds x="60.5" y="43.5" width="4" height="4" /></bezel> <!-- L14 -->
+ <bezel name="9.4" element="led"><bounds x="73" y="54.5" width="4" height="4" /></bezel> <!-- L15 -->
+ <bezel name="8.4" element="led"><bounds x="65" y="59" width="4" height="4" /></bezel> <!-- L16 -->
+ <bezel name="7.4" element="led"><bounds x="52" y="65.5" width="4" height="4" /></bezel> <!-- L17 -->
+ <bezel name="11.2" element="led"><bounds x="34.5" y="57.5" width="4" height="4" /></bezel> <!-- L18 -->
+ <bezel name="5.5" element="led"><bounds x="21.5" y="54.5" width="4" height="4" /></bezel> <!-- L19 -->
+
+ <bezel name="4.5" element="led"><bounds x="6.5" y="57.5" width="4" height="4" /></bezel> <!-- L20 -->
+ <bezel name="4.4" element="led"><bounds x="15.5" y="72.5" width="4" height="4" /></bezel> <!-- L21 -->
+ <bezel name="5.4" element="led"><bounds x="26" y="68" width="4" height="4" /></bezel> <!-- L22 -->
+ <bezel name="6.3" element="led"><bounds x="41" y="72.5" width="4" height="4" /></bezel> <!-- L23 -->
+ <bezel name="7.3" element="led"><bounds x="58.5" y="81.5" width="4" height="4" /></bezel> <!-- L24 -->
+ <bezel name="11.1" element="led"><bounds x="66.5" y="72.5" width="4" height="4" /></bezel> <!-- L25 -->
+ <bezel name="9.3" element="led"><bounds x="80" y="72.5" width="4" height="4" /></bezel> <!-- L26 -->
+ <bezel name="9.2" element="led"><bounds x="77.5" y="90" width="4" height="4" /></bezel> <!-- L27 -->
+ <bezel name="8.2" element="led"><bounds x="60.5" y="99" width="4" height="4" /></bezel> <!-- L28 -->
+ <bezel name="11.0" element="led"><bounds x="47.5" y="90" width="4" height="4" /></bezel> <!-- L29 -->
+
+ <bezel name="5.3" element="led"><bounds x="30.5" y="81.5" width="4" height="4" /></bezel> <!-- L30 -->
+ <bezel name="4.3" element="led"><bounds x="17.5" y="90" width="4" height="4" /></bezel> <!-- L31 -->
+ <bezel name="5.2" element="led"><bounds x="32.5" y="90" width="4" height="4" /></bezel> <!-- L32 -->
+ <bezel name="5.1" element="led"><bounds x="21.5" y="108" width="4" height="4" /></bezel> <!-- L33 -->
+ <bezel name="11.7" element="led"><bounds x="32.5" y="108" width="4" height="4" /></bezel> <!-- L34 -->
+ <bezel name="7.1" element="led"><bounds x="47.5" y="112.5" width="4" height="4" /></bezel> <!-- L35 -->
+ <bezel name="9.1" element="led"><bounds x="73" y="108" width="4" height="4" /></bezel> <!-- L36 -->
+ <bezel name="5.0" element="led"><bounds x="13" y="126" width="4" height="4" /></bezel> <!-- L37 -->
+ <bezel name="6.1" element="led"><bounds x="32.5" y="121.5" width="4" height="4" /></bezel> <!-- L38 -->
+ <bezel name="8.1" element="led"><bounds x="63" y="121.5" width="4" height="4" /></bezel> <!-- L39 -->
+
+ <bezel name="5.7" element="led"><bounds x="13" y="148.5" width="4" height="4" /></bezel> <!-- L40 -->
+ <bezel name="6.0" element="led"><bounds x="26" y="139" width="4" height="4" /></bezel> <!-- L41 -->
+ <bezel name="7.0" element="led"><bounds x="43" y="135" width="4" height="4" /></bezel> <!-- L42 -->
+ <bezel name="8.0" element="led"><bounds x="51.5" y="135" width="4" height="4" /></bezel> <!-- L43 -->
+ <bezel name="9.0" element="led"><bounds x="69" y="139" width="4" height="4" /></bezel> <!-- L44 -->
+ <bezel name="6.7" element="led"><bounds x="38.5" y="152.5" width="4" height="4" /></bezel> <!-- L45 -->
+ <bezel name="7.7" element="led"><bounds x="47.5" y="152.5" width="4" height="4" /></bezel> <!-- L46 -->
+ <bezel name="8.7" element="led"><bounds x="56.5" y="152.5" width="4" height="4" /></bezel> <!-- L47 -->
+ <bezel name="9.7" element="led"><bounds x="47.5" y="166" width="4" height="4" /></bezel> <!-- L48 -->
+ <bezel name="3.3" element="led"><bounds x="21.5" y="41.5" width="4" height="4" /></bezel> <!-- L70 -->
+
+ <repeat count="40">
+ <param name="x" start="10.8" increment="0.02308" />
+ <param name="y" start="72" increment="-0.15128" />
+ <bezel name="11.6" element="led"><bounds x="~x~" y="~y~" width="3" height="3" /></bezel> <!-- L50 -->
+ </repeat>
+
+ <repeat count="40">
+ <param name="x" start="28.6" increment="0.11795" />
+ <param name="y" start="119" increment="-0.07949" />
+ <bezel name="11.5" element="led"><bounds x="~x~" y="~y~" width="3" height="3" /></bezel> <!-- L51 -->
+ </repeat>
+
+ <repeat count="40">
+ <param name="x" start="78.7" increment="0.05128" />
+ <param name="y" start="110.7" increment="-0.13846" />
+ <bezel name="11.4" element="led"><bounds x="~x~" y="~y~" width="3" height="3" /></bezel> <!-- L52 -->
+ </repeat>
+
+ <repeat count="40">
+ <param name="x" start="10.7" increment="0.15897" />
+ <param name="y" start="154.7" increment="0.0" />
+ <bezel name="11.3" element="led"><bounds x="~x~" y="~y~" width="3" height="3" /></bezel> <!-- L53 -->
+ </repeat>
+
+ <repeat count="40">
+ <param name="x" start="61.8" increment="-0.11538" />
+ <param name="y" start="151.4" increment="-0.12308" />
+ <bezel name="3.6" element="led"><bounds x="~x~" y="~y~" width="3" height="3" /></bezel> <!-- L60 -->
+ </repeat>
+
+ <repeat count="40">
+ <param name="x" start="76.3" increment="0.13333" />
+ <param name="y" start="84.2" increment="0.03333" />
+ <bezel name="3.6" element="led"><bounds x="~x~" y="~y~" width="3" height="3" /></bezel> <!-- L61 -->
+ </repeat>
+
+ <repeat count="40">
+ <param name="x" start="34.2" increment="0.11538" />
+ <param name="y" start="151.4" increment="-0.12308" />
+ <bezel name="3.5" element="led"><bounds x="~x~" y="~y~" width="3" height="3" /></bezel> <!-- L62 -->
</repeat>
+
+ <repeat count="40">
+ <param name="x" start="14.2" increment="0.14615" />
+ <param name="y" start="86.5" increment="-0.05897" />
+ <bezel name="3.5" element="led"><bounds x="~x~" y="~y~" width="3" height="3" /></bezel> <!-- L63 -->
+ </repeat>
+
</view>
</mamelayout>
diff --git a/src/mame/layout/zodiac.lay b/src/mame/layout/zodiac.lay
index e21e121b21b..cf04cc1d466 100644
--- a/src/mame/layout/zodiac.lay
+++ b/src/mame/layout/zodiac.lay
@@ -3,40 +3,131 @@
<!-- define elements -->
- <element name="static_black"><rect><color red="0" green="0" blue="0" /></rect></element>
+ <element name="static_white"><rect><color red="0.77" green="0.77" blue="0.77" /></rect></element>
<element name="disk_black"><disk><color red="0" green="0" blue="0" /></disk></element>
- <element name="disk_red"><disk><color red="0.2" green="0.02" blue="0.05" /></disk></element>
+ <element name="disk_red"><disk><color red="0.16" green="0.02" blue="0.05" /></disk></element>
<element name="led" defstate="0">
- <disk state="0"><color red="0.2" green="0.04" blue="0.046" /></disk>
- <disk state="1"><color red="1.0" green="0.2" blue="0.23" /></disk>
+ <disk state="0"><color red="0.15" green="0.02" blue="0.01" /></disk>
+ <disk state="1"><color red="1.0" green="0.15" blue="0.08" /></disk>
</element>
<element name="digit" defstate="0">
<led7seg><color red="1.0" green="0.15" blue="0.08" /></led7seg>
</element>
- <element name="text_z1"><text string="&#x2648;"><color red="0.7" green="0.7" blue="0.7" /></text></element>
- <element name="text_z2"><text string="&#x2649;"><color red="0.7" green="0.7" blue="0.7" /></text></element>
- <element name="text_z3"><text string="&#x264a;"><color red="0.7" green="0.7" blue="0.7" /></text></element>
- <element name="text_z4"><text string="&#x264b;"><color red="0.7" green="0.7" blue="0.7" /></text></element>
- <element name="text_z5"><text string="&#x264c;"><color red="0.7" green="0.7" blue="0.7" /></text></element>
- <element name="text_z6"><text string="&#x264d;"><color red="0.7" green="0.7" blue="0.7" /></text></element>
- <element name="text_z7"><text string="&#x264e;"><color red="0.7" green="0.7" blue="0.7" /></text></element>
- <element name="text_z8"><text string="&#x264f;"><color red="0.7" green="0.7" blue="0.7" /></text></element>
- <element name="text_z9"><text string="&#x2650;"><color red="0.7" green="0.7" blue="0.7" /></text></element>
- <element name="text_z10"><text string="&#x2651;"><color red="0.7" green="0.7" blue="0.7" /></text></element>
- <element name="text_z11"><text string="&#x2652;"><color red="0.7" green="0.7" blue="0.7" /></text></element>
- <element name="text_z12"><text string="&#x2653;"><color red="0.7" green="0.7" blue="0.7" /></text></element>
+ <element name="hl" defstate="0">
+ <text string=" ">
+ <bounds x="0.0" y="0.0" width="1.0" height="1.0" />
+ <color red="0.0" green="0.0" blue="0.0" />
+ </text>
+ <rect state="1">
+ <bounds x="0.0" y="0.0" width="1.0" height="1.0" />
+ <color red="0.0" green="0.0" blue="0.0" />
+ </rect>
+ </element>
+
+ <element name="switch_mode" defstate="0">
+ <disk><color red="0.77" green="0.77" blue="0.77" /></disk>
+ <text state="0x01" string="H"><color red="0.07" green="0.07" blue="0.07" /></text>
+ <text state="0x02" string="P"><color red="0.07" green="0.07" blue="0.07" /></text>
+ <text state="0x00" string="A"><color red="0.07" green="0.07" blue="0.07" /></text>
+ </element>
+
+ <element name="text_b1">
+ <rect><color red="0.77" green="0.77" blue="0.77" /></rect>
+ <text string="1"><color red="0.07" green="0.07" blue="0.07" /></text>
+ </element>
+ <element name="text_b2">
+ <rect><color red="0.77" green="0.77" blue="0.77" /></rect>
+ <text string="2"><color red="0.07" green="0.07" blue="0.07" /></text>
+ </element>
+ <element name="text_b3">
+ <rect><color red="0.77" green="0.77" blue="0.77" /></rect>
+ <text string="3"><color red="0.07" green="0.07" blue="0.07" /></text>
+ </element>
+ <element name="text_b4">
+ <rect><color red="0.77" green="0.77" blue="0.77" /></rect>
+ <text string="4"><color red="0.07" green="0.07" blue="0.07" /></text>
+ </element>
+ <element name="text_b5">
+ <rect><color red="0.77" green="0.77" blue="0.77" /></rect>
+ <text string="5"><color red="0.07" green="0.07" blue="0.07" /></text>
+ </element>
+ <element name="text_b6">
+ <rect><color red="0.77" green="0.77" blue="0.77" /></rect>
+ <text string="6"><color red="0.07" green="0.07" blue="0.07" /></text>
+ </element>
+ <element name="text_b7">
+ <rect><color red="0.77" green="0.77" blue="0.77" /></rect>
+ <text string="7"><color red="0.07" green="0.07" blue="0.07" /></text>
+ </element>
+ <element name="text_b8">
+ <rect><color red="0.77" green="0.77" blue="0.77" /></rect>
+ <text string="8"><color red="0.07" green="0.07" blue="0.07" /></text>
+ </element>
+ <element name="text_b9">
+ <rect><color red="0.77" green="0.77" blue="0.77" /></rect>
+ <text string="9"><color red="0.07" green="0.07" blue="0.07" /></text>
+ </element>
+ <element name="text_b0">
+ <rect><color red="0.77" green="0.77" blue="0.77" /></rect>
+ <text string="0"><color red="0.07" green="0.07" blue="0.07" /></text>
+ </element>
+ <element name="text_bent">
+ <rect><color red="0.77" green="0.77" blue="0.77" /></rect>
+ <text string="ENT"><color red="0.07" green="0.07" blue="0.07" /></text>
+ </element>
+ <element name="text_bclr">
+ <rect><color red="0.77" green="0.77" blue="0.77" /></rect>
+ <text string="CLR"><color red="0.07" green="0.07" blue="0.07" /></text>
+ </element>
+
+ <element name="text_bp">
+ <disk><color red="0.77" green="0.77" blue="0.77" /></disk>
+ <text string="P"><color red="0.07" green="0.07" blue="0.07" /></text>
+ </element>
+ <element name="text_bl">
+ <disk><color red="0.77" green="0.77" blue="0.77" /></disk>
+ <text string="L"><color red="0.07" green="0.07" blue="0.07" /></text>
+ </element>
+ <element name="text_bj">
+ <disk><color red="0.77" green="0.77" blue="0.77" /></disk>
+ <text string="J"><color red="0.07" green="0.07" blue="0.07" /></text>
+ </element>
+ <element name="text_ba">
+ <disk><color red="0.77" green="0.77" blue="0.77" /></disk>
+ <text string="A"><color red="0.07" green="0.07" blue="0.07" /></text>
+ </element>
+ <element name="text_bd">
+ <disk><color red="0.77" green="0.77" blue="0.77" /></disk>
+ <text string="D"><color red="0.07" green="0.07" blue="0.07" /></text>
+ </element>
+ <element name="text_be">
+ <disk><color red="0.77" green="0.77" blue="0.77" /></disk>
+ <text string="E"><color red="0.07" green="0.07" blue="0.07" /></text>
+ </element>
+
+ <element name="text_z1"><text string="Aries" align="1"><color red="0.77" green="0.77" blue="0.77" /></text></element> <!-- ♈ "&#x2648;" -->
+ <element name="text_z2"><text string="Taurus" align="1"><color red="0.77" green="0.77" blue="0.77" /></text></element> <!-- ♉ "&#x2649;" -->
+ <element name="text_z3"><text string="Gemini" align="1"><color red="0.77" green="0.77" blue="0.77" /></text></element> <!-- ♊ "&#x264a;" -->
+ <element name="text_z4"><text string="Cancer" align="1"><color red="0.77" green="0.77" blue="0.77" /></text></element> <!-- ♋ "&#x264b;" -->
+ <element name="text_z5"><text string="Leo" align="1"><color red="0.77" green="0.77" blue="0.77" /></text></element> <!-- ♌ "&#x264c;" -->
+ <element name="text_z6"><text string="Virgo" align="1"><color red="0.77" green="0.77" blue="0.77" /></text></element> <!-- ♍ "&#x264d;" -->
+ <element name="text_z7"><text string="Libra" align="1"><color red="0.77" green="0.77" blue="0.77" /></text></element> <!-- ♎ "&#x264e;" -->
+ <element name="text_z8"><text string="Scorpio" align="1"><color red="0.77" green="0.77" blue="0.77" /></text></element> <!-- ♏ "&#x264f;" -->
+ <element name="text_z9"><text string="Sagittarius" align="1"><color red="0.77" green="0.77" blue="0.77" /></text></element> <!-- ♐ "&#x2650;" -->
+ <element name="text_z10"><text string="Capricorn" align="1"><color red="0.77" green="0.77" blue="0.77" /></text></element> <!-- ♑ "&#x2651;" -->
+ <element name="text_z11"><text string="Aquarius" align="1"><color red="0.77" green="0.77" blue="0.77" /></text></element> <!-- ♒ "&#x2652;" -->
+ <element name="text_z12"><text string="Pisces" align="1"><color red="0.77" green="0.77" blue="0.77" /></text></element> <!-- ♓ "&#x2653;" -->
+
+ <element name="text_mode"><text string="Mode (H-P-A)"><color red="0.77" green="0.77" blue="0.77" /></text></element>
<!-- build screen -->
<view name="Internal Layout">
<bounds left="-35" right="158" top="5" bottom="198" />
- <bezel element="static_black">
- <bounds left="-35" right="158" top="5" bottom="198" />
- </bezel>
<bezel element="disk_red"><bounds x="-40" y="0" width="203" height="203" /></bezel>
<bezel element="disk_black"><bounds x="-15" y="25" width="153" height="153" /></bezel>
@@ -50,6 +141,8 @@
<bezel name="digit1" element="digit"><bounds x="80" y="70" width="10" height="15" /></bezel>
<bezel name="digit0" element="digit"><bounds x="90" y="70" width="10" height="15" /></bezel>
+ <!-- edgy leds -->
+
<bezel name="9.7" element="led"><bounds x="15" y="145" width="3" height="3" /></bezel>
<bezel name="9.2" element="led"><bounds x="40" y="160" width="3" height="3" /></bezel>
<bezel name="9.4" element="led"><bounds x="80" y="160" width="3" height="3" /></bezel>
@@ -64,19 +157,66 @@
<bezel name="8.1" element="led"><bounds x="0" y="80" width="3" height="3" /></bezel>
<bezel name="8.3" element="led"><bounds x="0" y="120" width="3" height="3" /></bezel>
- <bezel element="text_z1"><bounds x="17" y="143" width="12" height="7" /></bezel>
- <bezel element="text_z2"><bounds x="42" y="158" width="12" height="7" /></bezel>
- <bezel element="text_z3"><bounds x="82" y="158" width="12" height="7" /></bezel>
- <bezel element="text_z4"><bounds x="107" y="143" width="12" height="7" /></bezel>
- <bezel element="text_z5"><bounds x="122" y="118" width="12" height="7" /></bezel>
- <bezel element="text_z6"><bounds x="122" y="78" width="12" height="7" /></bezel>
-
- <bezel element="text_z7"><bounds x="107" y="53" width="12" height="7" /></bezel>
- <bezel element="text_z8"><bounds x="82" y="38" width="12" height="7" /></bezel>
- <bezel element="text_z9"><bounds x="42" y="38" width="12" height="7" /></bezel>
- <bezel element="text_z10"><bounds x="17" y="53" width="12" height="7" /></bezel>
- <bezel element="text_z11"><bounds x="2" y="78" width="12" height="7" /></bezel>
- <bezel element="text_z12"><bounds x="2" y="118" width="12" height="7" /></bezel>
+ <bezel element="text_z1"><bounds x="19" y="144" width="20" height="4" /></bezel>
+ <bezel element="text_z2"><bounds x="44" y="159" width="20" height="4" /></bezel>
+ <bezel element="text_z3"><bounds x="84" y="159" width="20" height="4" /></bezel>
+ <bezel element="text_z4"><bounds x="109" y="144" width="20" height="4" /></bezel>
+ <bezel element="text_z5"><bounds x="124" y="119" width="20" height="4" /></bezel>
+ <bezel element="text_z6"><bounds x="124" y="79" width="20" height="4" /></bezel>
+
+ <bezel element="text_z7"><bounds x="109" y="54" width="20" height="4" /></bezel>
+ <bezel element="text_z8"><bounds x="84" y="39" width="20" height="4" /></bezel>
+ <bezel element="text_z9"><bounds x="44" y="39" width="20" height="4" /></bezel>
+ <bezel element="text_z10"><bounds x="19" y="54" width="20" height="4" /></bezel>
+ <bezel element="text_z11"><bounds x="4" y="79" width="20" height="4" /></bezel>
+ <bezel element="text_z12"><bounds x="4" y="119" width="20" height="4" /></bezel>
+
+ <!-- buttons -->
+
+ <bezel element="text_b1"><bounds x="46.5" y="93" width="7" height="7" /></bezel>
+ <bezel element="text_b4"><bounds x="46.5" y="103" width="7" height="7" /></bezel>
+ <bezel element="text_b7"><bounds x="46.5" y="113" width="7" height="7" /></bezel>
+ <bezel element="text_b0"><bounds x="46.5" y="123" width="7" height="7" /></bezel>
+ <bezel element="text_b2"><bounds x="56.5" y="93" width="7" height="7" /></bezel>
+ <bezel element="text_b5"><bounds x="56.5" y="103" width="7" height="7" /></bezel>
+ <bezel element="text_b8"><bounds x="56.5" y="113" width="7" height="7" /></bezel>
+ <bezel element="static_white"><bounds x="56.5" y="123" width="7" height="7" /></bezel>
+ <bezel element="text_bent"><bounds x="56.6" y="124.3" width="6.8" height="4.1" /></bezel>
+ <bezel element="text_b3"><bounds x="66.5" y="93" width="7" height="7" /></bezel>
+ <bezel element="text_b6"><bounds x="66.5" y="103" width="7" height="7" /></bezel>
+ <bezel element="text_b9"><bounds x="66.5" y="113" width="7" height="7" /></bezel>
+ <bezel element="static_white"><bounds x="66.5" y="123" width="7" height="7" /></bezel>
+ <bezel element="text_bclr"><bounds x="66.6" y="124.3" width="6.8" height="4.1" /></bezel>
+
+ <bezel element="text_bp"><bounds x="26.5" y="89.5" width="7" height="7" /></bezel>
+ <bezel element="text_bl"><bounds x="19.5" y="106.25" width="7" height="7" /></bezel>
+ <bezel element="text_bj"><bounds x="26.5" y="123" width="7" height="7" /></bezel>
+ <bezel element="text_ba"><bounds x="86.5" y="89.5" width="7" height="7" /></bezel>
+ <bezel element="text_bd"><bounds x="93.5" y="106.25" width="7" height="7" /></bezel>
+ <bezel element="text_be"><bounds x="86.5" y="123" width="7" height="7" /></bezel>
+
+ <bezel element="hl" inputtag="IN.0" inputmask="0x04"><bounds x="46.5" y="93" width="7" height="7" /><color alpha="0.2" /></bezel>
+ <bezel element="hl" inputtag="IN.1" inputmask="0x08"><bounds x="46.5" y="103" width="7" height="7" /><color alpha="0.2" /></bezel>
+ <bezel element="hl" inputtag="IN.1" inputmask="0x01"><bounds x="46.5" y="113" width="7" height="7" /><color alpha="0.2" /></bezel>
+ <bezel element="hl" inputtag="IN.0" inputmask="0x08"><bounds x="46.5" y="123" width="7" height="7" /><color alpha="0.2" /></bezel>
+ <bezel element="hl" inputtag="IN.0" inputmask="0x02"><bounds x="56.5" y="93" width="7" height="7" /><color alpha="0.2" /></bezel>
+ <bezel element="hl" inputtag="IN.1" inputmask="0x04"><bounds x="56.5" y="103" width="7" height="7" /><color alpha="0.2" /></bezel>
+ <bezel element="hl" inputtag="IN.2" inputmask="0x08"><bounds x="56.5" y="113" width="7" height="7" /><color alpha="0.2" /></bezel>
+ <bezel element="hl" inputtag="IN.4" inputmask="0x01"><bounds x="56.5" y="123" width="7" height="7" /><color alpha="0.2" /></bezel>
+ <bezel element="hl" inputtag="IN.0" inputmask="0x01"><bounds x="66.5" y="93" width="7" height="7" /><color alpha="0.2" /></bezel>
+ <bezel element="hl" inputtag="IN.1" inputmask="0x02"><bounds x="66.5" y="103" width="7" height="7" /><color alpha="0.2" /></bezel>
+ <bezel element="hl" inputtag="IN.2" inputmask="0x04"><bounds x="66.5" y="113" width="7" height="7" /><color alpha="0.2" /></bezel>
+ <bezel element="hl" inputtag="IN.4" inputmask="0x08"><bounds x="66.5" y="123" width="7" height="7" /><color alpha="0.2" /></bezel>
+
+ <bezel element="hl" inputtag="IN.3" inputmask="0x01"><bounds x="26.5" y="89.5" width="7" height="7" /><color alpha="0.2" /></bezel>
+ <bezel element="hl" inputtag="IN.3" inputmask="0x02"><bounds x="19.5" y="106.25" width="7" height="7" /><color alpha="0.2" /></bezel>
+ <bezel element="hl" inputtag="IN.3" inputmask="0x04"><bounds x="26.5" y="123" width="7" height="7" /><color alpha="0.2" /></bezel>
+ <bezel element="hl" inputtag="IN.2" inputmask="0x02"><bounds x="86.5" y="89.5" width="7" height="7" /><color alpha="0.2" /></bezel>
+ <bezel element="hl" inputtag="IN.2" inputmask="0x01"><bounds x="93.5" y="106.25" width="7" height="7" /><color alpha="0.2" /></bezel>
+ <bezel element="hl" inputtag="IN.3" inputmask="0x08"><bounds x="86.5" y="123" width="7" height="7" /><color alpha="0.2" /></bezel>
+
+ <bezel element="switch_mode" inputtag="IN.5" inputmask="0x03" inputraw="1"><bounds x="56.5" y="140" width="7" height="7" /></bezel>
+ <bezel element="text_mode"><bounds x="45" y="148" width="30" height="4" /></bezel>
</view>
</mamelayout>
diff --git a/src/mame/machine/abc80kb.cpp b/src/mame/machine/abc80kb.cpp
index dcf61566f86..80f1117b651 100644
--- a/src/mame/machine/abc80kb.cpp
+++ b/src/mame/machine/abc80kb.cpp
@@ -126,11 +126,12 @@ void abc80_keyboard_device::abc80_keyboard_io(address_map &map)
// device_add_mconfig - add device configuration
//-------------------------------------------------
-MACHINE_CONFIG_START(abc80_keyboard_device::device_add_mconfig)
- MCFG_DEVICE_ADD(I8048_TAG, I8048, 4000000)
- MCFG_DEVICE_IO_MAP(abc80_keyboard_io)
- MCFG_DEVICE_DISABLE()
-MACHINE_CONFIG_END
+void abc80_keyboard_device::device_add_mconfig(machine_config &config)
+{
+ I8048(config, m_maincpu, 4000000);
+ m_maincpu->set_addrmap(AS_IO, &abc80_keyboard_device::abc80_keyboard_io);
+ m_maincpu->set_disable();
+}
//-------------------------------------------------
diff --git a/src/mame/machine/acs8600_ics.cpp b/src/mame/machine/acs8600_ics.cpp
index e44d040a81b..09a21cc6d39 100644
--- a/src/mame/machine/acs8600_ics.cpp
+++ b/src/mame/machine/acs8600_ics.cpp
@@ -16,8 +16,7 @@ acs8600_ics_device::acs8600_ics_device(const machine_config &mconfig, const char
m_icscpu(*this, "icscpu"),
m_out_irq1_func(*this),
m_out_irq2_func(*this),
- m_host_space_device(*this, finder_base::DUMMY_TAG),
- m_host_space_index(-1)
+ m_host_space(*this, finder_base::DUMMY_TAG, -1)
{
}
@@ -44,12 +43,12 @@ WRITE8_MEMBER(acs8600_ics_device::ctrl_w)
READ8_MEMBER(acs8600_ics_device::hostram_r)
{
- return m_maincpu_mem->read_byte((m_hiaddr << 16) | (BIT(m_ctrl, 0) << 15) | (offset & 0x7fff));
+ return m_host_space->read_byte((m_hiaddr << 16) | (BIT(m_ctrl, 0) << 15) | (offset & 0x7fff));
}
WRITE8_MEMBER(acs8600_ics_device::hostram_w)
{
- m_maincpu_mem->write_byte((m_hiaddr << 16) | (BIT(m_ctrl, 0) << 15) | (offset & 0x7fff), data);
+ m_host_space->write_byte((m_hiaddr << 16) | (BIT(m_ctrl, 0) << 15) | (offset & 0x7fff), data);
}
WRITE_LINE_MEMBER(acs8600_ics_device::attn_w)
@@ -202,7 +201,6 @@ void acs8600_ics_device::device_add_mconfig(machine_config &config)
void acs8600_ics_device::device_resolve_objects()
{
- m_maincpu_mem = &m_host_space_device->space(m_host_space_index);
m_out_irq1_func.resolve_safe();
m_out_irq2_func.resolve_safe();
}
diff --git a/src/mame/machine/acs8600_ics.h b/src/mame/machine/acs8600_ics.h
index 697666fdd8f..7f11f035e59 100644
--- a/src/mame/machine/acs8600_ics.h
+++ b/src/mame/machine/acs8600_ics.h
@@ -17,7 +17,7 @@ public:
auto irq1_callback() { return m_out_irq1_func.bind(); }
auto irq2_callback() { return m_out_irq2_func.bind(); }
- template <typename T> void set_host_space(T &&tag, int index) { m_host_space_device.set_tag(std::forward<T>(tag)); m_host_space_index = index; }
+ template <typename T> void set_host_space(T &&tag, int index) { m_host_space.set_tag(std::forward<T>(tag), index); }
const tiny_rom_entry *device_rom_region() const override;
protected:
@@ -37,9 +37,7 @@ private:
required_device<z80_device> m_icscpu;
devcb_write_line m_out_irq1_func;
devcb_write_line m_out_irq2_func;
- required_device<device_memory_interface> m_host_space_device;
- int m_host_space_index;
- address_space *m_maincpu_mem;
+ required_address_space m_host_space;
u8 m_hiaddr;
u8 m_ctrl;
};
diff --git a/src/mame/machine/aim65.cpp b/src/mame/machine/aim65.cpp
index 5f449393fb8..dc4b506b8cb 100644
--- a/src/mame/machine/aim65.cpp
+++ b/src/mame/machine/aim65.cpp
@@ -128,21 +128,21 @@ void aim65_state::machine_start()
// Init ROM sockets
if (m_z24->exists())
- space.install_read_handler(0xd000, 0xdfff, read8_delegate(FUNC(generic_slot_device::read_rom),(generic_slot_device*)m_z24));
+ space.install_read_handler(0xd000, 0xdfff, read8sm_delegate(FUNC(generic_slot_device::read_rom),(generic_slot_device*)m_z24));
if (m_z25->exists())
- space.install_read_handler(0xc000, 0xcfff, read8_delegate(FUNC(generic_slot_device::read_rom),(generic_slot_device*)m_z25));
+ space.install_read_handler(0xc000, 0xcfff, read8sm_delegate(FUNC(generic_slot_device::read_rom),(generic_slot_device*)m_z25));
if (m_z26->exists())
- space.install_read_handler(0xb000, 0xbfff, read8_delegate(FUNC(generic_slot_device::read_rom),(generic_slot_device*)m_z26));
+ space.install_read_handler(0xb000, 0xbfff, read8sm_delegate(FUNC(generic_slot_device::read_rom),(generic_slot_device*)m_z26));
// Init PROM/ROM module sockets
if (m_z12->exists())
- space.install_read_handler(0x4000, 0x4fff, read8_delegate(FUNC(generic_slot_device::read_rom),(generic_slot_device*)m_z12));
+ space.install_read_handler(0x4000, 0x4fff, read8sm_delegate(FUNC(generic_slot_device::read_rom),(generic_slot_device*)m_z12));
if (m_z13->exists())
- space.install_read_handler(0x5000, 0x5fff, read8_delegate(FUNC(generic_slot_device::read_rom),(generic_slot_device*)m_z13));
+ space.install_read_handler(0x5000, 0x5fff, read8sm_delegate(FUNC(generic_slot_device::read_rom),(generic_slot_device*)m_z13));
if (m_z14->exists())
- space.install_read_handler(0x6000, 0x6fff, read8_delegate(FUNC(generic_slot_device::read_rom),(generic_slot_device*)m_z14));
+ space.install_read_handler(0x6000, 0x6fff, read8sm_delegate(FUNC(generic_slot_device::read_rom),(generic_slot_device*)m_z14));
if (m_z15->exists())
- space.install_read_handler(0x7000, 0x7fff, read8_delegate(FUNC(generic_slot_device::read_rom),(generic_slot_device*)m_z15));
+ space.install_read_handler(0x7000, 0x7fff, read8sm_delegate(FUNC(generic_slot_device::read_rom),(generic_slot_device*)m_z15));
// Init RAM
space.install_ram(0x0000, m_ram->size() - 1, m_ram->pointer());
diff --git a/src/mame/machine/amiga.cpp b/src/mame/machine/amiga.cpp
index bcda93d108c..f03f2a3374a 100644
--- a/src/mame/machine/amiga.cpp
+++ b/src/mame/machine/amiga.cpp
@@ -1052,10 +1052,10 @@ READ16_MEMBER( amiga_state::cia_r )
uint16_t data = 0;
if ((offset & 0x1000/2) == 0 && ACCESSING_BITS_0_7)
- data |= m_cia_0->read(space, offset >> 7);
+ data |= m_cia_0->read(offset >> 7);
if ((offset & 0x2000/2) == 0 && ACCESSING_BITS_8_15)
- data |= m_cia_1->read(space, offset >> 7) << 8;
+ data |= m_cia_1->read(offset >> 7) << 8;
if (LOG_CIA)
logerror("%s: cia_r(%06x) = %04x & %04x\n", machine().describe_context(), offset, data, mem_mask);
@@ -1069,10 +1069,10 @@ WRITE16_MEMBER( amiga_state::cia_w )
logerror("%s: cia_w(%06x) = %04x & %04x\n", machine().describe_context(), offset, data, mem_mask);
if ((offset & 0x1000/2) == 0 && ACCESSING_BITS_0_7)
- m_cia_0->write(space, offset >> 7, data & 0xff);
+ m_cia_0->write(offset >> 7, data & 0xff);
if ((offset & 0x2000/2) == 0 && ACCESSING_BITS_8_15)
- m_cia_1->write(space, offset >> 7, data >> 8);
+ m_cia_1->write(offset >> 7, data >> 8);
}
WRITE16_MEMBER( amiga_state::gayle_cia_w )
diff --git a/src/mame/machine/amstrad.cpp b/src/mame/machine/amstrad.cpp
index 280c4a2cb28..022ff0b5c39 100644
--- a/src/mame/machine/amstrad.cpp
+++ b/src/mame/machine/amstrad.cpp
@@ -505,9 +505,9 @@ void amstrad_state::amstrad_plus_dma_parse(int channel)
{
case 0x0000: // Load PSG register
{
- m_ay->address_w(generic_space(), 0, (command & 0x0f00) >> 8);
- m_ay->data_w(generic_space(), 0, command & 0x00ff);
- m_ay->address_w(generic_space(), 0, m_prev_reg);
+ m_ay->address_w((command & 0x0f00) >> 8);
+ m_ay->data_w(command & 0x00ff);
+ m_ay->address_w(m_prev_reg);
}
logerror("DMA %i: LOAD %i, %i\n",channel,(command & 0x0f00) >> 8, command & 0x00ff);
break;
@@ -1867,9 +1867,9 @@ READ8_MEMBER(amstrad_state::amstrad_cpc_io_r)
{
case 0x02:
// CRTC Type 1 (UM6845R) only!!
- //data = m_crtc->status_r( space, 0 );
+ //data = m_crtc->status_r();
if ( m_system_type == SYSTEM_PLUS || m_system_type == SYSTEM_GX4000 ) // All Plus systems are Type 3 (AMS40489)
- data = m_crtc->register_r( space, 0 );
+ data = m_crtc->register_r();
else
data = 0xff; // Type 0 (HD6845S/UM6845) and Type 2 (MC6845) return 0xff
#if 0
@@ -1890,7 +1890,7 @@ READ8_MEMBER(amstrad_state::amstrad_cpc_io_r)
break;
case 0x03:
/* All CRTC type : Read from selected internal 6845 register Read only */
- data = m_crtc->register_r( space, 0 );
+ data = m_crtc->register_r();
break;
}
}
@@ -1939,10 +1939,10 @@ The exception is the case where none of b7-b0 are reset (i.e. port &FBFF), which
switch (b8b0)
{
case 0x02:
- data = m_fdc->msr_r(space, 0);
+ data = m_fdc->msr_r();
break;
case 0x03:
- data = m_fdc->fifo_r(space, 0);
+ data = m_fdc->fifo_r();
break;
default:
break;
@@ -2043,7 +2043,7 @@ WRITE8_MEMBER(amstrad_state::amstrad_cpc_io_w)
switch ((offset & 0x0300) >> 8) // r1r0
{
case 0x00: /* Select internal 6845 register Write Only */
- m_crtc->address_w( space, 0, data );
+ m_crtc->address_w(data);
if ( m_system_type == SYSTEM_PLUS || m_system_type == SYSTEM_GX4000 )
amstrad_plus_seqcheck(data);
@@ -2058,7 +2058,7 @@ WRITE8_MEMBER(amstrad_state::amstrad_cpc_io_w)
timer_set(attotime::from_usec(0), TIMER_VIDEO_UPDATE, 1);
else
timer_set(attotime::from_usec(0), TIMER_VIDEO_UPDATE, 0);
- m_crtc->register_w( space, 0, data );
+ m_crtc->register_w(data);
/* printer port bit 8 */
if (m_printer_bit8_selected && m_system_type == SYSTEM_PLUS)
@@ -2158,7 +2158,7 @@ The exception is the case where none of b7-b0 are reset (i.e. port &FBFF), which
break;
case 0x03: /* Write Data register of FDC */
- m_fdc->fifo_w(space, 0,data);
+ m_fdc->fifo_w(data);
break;
default:
@@ -2196,7 +2196,6 @@ The exception is the case where none of b7-b0 are reset (i.e. port &FBFF), which
/* load CPCEMU style snapshots */
void amstrad_state::amstrad_handle_snapshot(unsigned char *pSnapshot)
{
- address_space &space = m_maincpu->space(AS_PROGRAM);
int RegData;
int i;
@@ -2284,11 +2283,11 @@ void amstrad_state::amstrad_handle_snapshot(unsigned char *pSnapshot)
/* init CRTC */
for (i=0; i<18; i++)
{
- m_crtc->address_w( space, 0, i );
- m_crtc->register_w( space, 0, pSnapshot[0x043+i] & 0xff );
+ m_crtc->address_w(i);
+ m_crtc->register_w(pSnapshot[0x043+i] & 0xff);
}
- m_crtc->address_w( space, 0, i );
+ m_crtc->address_w(i);
/* upper rom selection */
m_gate_array.upper_bank = pSnapshot[0x055];
@@ -2303,11 +2302,11 @@ void amstrad_state::amstrad_handle_snapshot(unsigned char *pSnapshot)
/* PSG */
for (i=0; i<16; i++)
{
- m_ay->address_w(space, 0, i);
- m_ay->data_w(space, 0, pSnapshot[0x05b + i] & 0x0ff);
+ m_ay->address_w(i);
+ m_ay->data_w(pSnapshot[0x05b + i] & 0x0ff);
}
- m_ay->address_w(space, 0, pSnapshot[0x05a]);
+ m_ay->address_w(pSnapshot[0x05a]);
{
int MemSize;
@@ -2486,20 +2485,18 @@ BDIR BC1 |
/* PSG function selected */
void amstrad_state::update_psg()
{
- address_space &space = m_maincpu->space(AS_PROGRAM);
-
if(m_aleste_mode & 0x20) // RTC selected
{
switch(m_aleste_rtc_function)
{
case 0x02: // AS
- m_rtc->write(space, 0,m_ppi_port_outputs[amstrad_ppi_PortA]);
+ m_rtc->write(0, m_ppi_port_outputs[amstrad_ppi_PortA]);
break;
case 0x04: // DS write
- m_rtc->write(space, 1,m_ppi_port_outputs[amstrad_ppi_PortA]);
+ m_rtc->write(1, m_ppi_port_outputs[amstrad_ppi_PortA]);
break;
case 0x05: // DS read
- m_ppi_port_inputs[amstrad_ppi_PortA] = m_rtc->read(space, 1);
+ m_ppi_port_inputs[amstrad_ppi_PortA] = m_rtc->read(1);
break;
}
return;
@@ -2511,12 +2508,12 @@ void amstrad_state::update_psg()
} break;
case 1:
{/* b6 = 1 ? : Read from selected PSG register and make the register data available to PPI Port A */
- m_ppi_port_inputs[amstrad_ppi_PortA] = m_ay->data_r(space, 0);
+ m_ppi_port_inputs[amstrad_ppi_PortA] = m_ay->data_r();
}
break;
case 2:
{/* b7 = 1 ? : Write to selected PSG register and write data to PPI Port A */
- m_ay->data_w(space, 0, m_ppi_port_outputs[amstrad_ppi_PortA]);
+ m_ay->data_w(m_ppi_port_outputs[amstrad_ppi_PortA]);
}
break;
case 3:
@@ -2524,7 +2521,7 @@ void amstrad_state::update_psg()
/* ignore if an invalid PSG register is selected, usually when the PPI port directions are changed after selecting the PSG register */
if(m_ppi_port_outputs[amstrad_ppi_PortA] <= 15)
{
- m_ay->address_w(space, 0, m_ppi_port_outputs[amstrad_ppi_PortA]);
+ m_ay->address_w(m_ppi_port_outputs[amstrad_ppi_PortA]);
m_prev_reg = m_ppi_port_outputs[amstrad_ppi_PortA];
}
}
diff --git a/src/mame/machine/apollo.cpp b/src/mame/machine/apollo.cpp
index 2e2e96ddac1..2cdbd251a08 100644
--- a/src/mame/machine/apollo.cpp
+++ b/src/mame/machine/apollo.cpp
@@ -106,7 +106,7 @@ INPUT_PORTS_START( apollo_config )
// PORT_CONFNAME(APOLLO_CONF_IDLE_SLEEP, 0x00, "Idle Sleep")
// PORT_CONFSETTING(0x00, DEF_STR ( Off ) )
// PORT_CONFSETTING(APOLLO_CONF_IDLE_SLEEP, DEF_STR ( On ) )
-
+#ifdef APOLLO_XXL
PORT_CONFNAME(APOLLO_CONF_TRAP_TRACE, 0x00, "Trap Trace")
PORT_CONFSETTING(0x00, DEF_STR ( Off ) )
PORT_CONFSETTING(APOLLO_CONF_TRAP_TRACE, DEF_STR ( On ) )
@@ -114,7 +114,7 @@ INPUT_PORTS_START( apollo_config )
PORT_CONFNAME(APOLLO_CONF_FPU_TRACE, 0x00, "FPU Trace")
PORT_CONFSETTING(0x00, DEF_STR ( Off ) )
PORT_CONFSETTING(APOLLO_CONF_FPU_TRACE, DEF_STR ( On ) )
-#ifdef APOLLO_XXL
+
PORT_CONFNAME(APOLLO_CONF_DISK_TRACE, 0x00, "Disk Trace")
PORT_CONFSETTING(0x00, DEF_STR ( Off ) )
PORT_CONFSETTING(APOLLO_CONF_DISK_TRACE, DEF_STR ( On ) )
@@ -256,11 +256,11 @@ WRITE16_MEMBER(apollo_state::apollo_csr_control_register_w)
// disable FPU (i.e. FPU opcodes in CPU)
apollo_set_cpu_has_fpu(m_maincpu, 0);
- if (!apollo_is_dn3000())
+ if (!apollo_is_dn3000() && !m_maincpu->get_pmmu_enable())
{
// hack: set APOLLO_CSR_SR_FP_TRAP in cpu status register for /sau7/self_test
// APOLLO_CSR_SR_FP_TRAP in status register should be set by next fmove instruction
- // cpu_status_register |= APOLLO_CSR_SR_FP_TRAP;
+ cpu_status_register |= APOLLO_CSR_SR_FP_TRAP;
}
}
@@ -317,11 +317,11 @@ static uint8_t dn3000_dma_channel2 = 5; // 5 = memory dma channel
WRITE8_MEMBER(apollo_state::apollo_dma_1_w){
SLOG1(("apollo_dma_1_w: writing DMA Controller 1 at offset %02x = %02x", offset, data));
- m_dma8237_1->write(space, offset, data);
+ m_dma8237_1->write(offset, data);
}
READ8_MEMBER(apollo_state::apollo_dma_1_r){
- uint8_t data = m_dma8237_1->read(space, offset);
+ uint8_t data = m_dma8237_1->read(offset);
SLOG1(("apollo_dma_1_r: reading DMA Controller 1 at offset %02x = %02x", offset, data));
return data;
}
@@ -332,7 +332,7 @@ READ8_MEMBER(apollo_state::apollo_dma_1_r){
WRITE8_MEMBER(apollo_state::apollo_dma_2_w){
SLOG1(("apollo_dma_2_w: writing DMA Controller 2 at offset %02x = %02x", offset/2, data));
- m_dma8237_2->write(space, offset / 2, data);
+ m_dma8237_2->write(offset / 2, data);
}
READ8_MEMBER(apollo_state::apollo_dma_2_r){
@@ -351,7 +351,7 @@ READ8_MEMBER(apollo_state::apollo_dma_2_r){
break;
}
}
- uint8_t data = m_dma8237_2->read(space, offset / 2);
+ uint8_t data = m_dma8237_2->read(offset / 2);
SLOG1(("apollo_dma_2_r: reading DMA Controller 2 at offset %02x = %02x", offset/2, data));
return data;
}
@@ -672,8 +672,7 @@ WRITE_LINE_MEMBER(apollo_state::apollo_ptm_irq_function)
WRITE8_MEMBER(apollo_state::apollo_rtc_w)
{
- m_rtc->write(space, 0, offset);
- m_rtc->write(space, 1, data);
+ m_rtc->write_direct(offset, data);
if (offset >= 0x0b && offset <= 0x0c)
{
SLOG2(("writing MC146818 at offset %02x = %02x", offset, data));
@@ -683,8 +682,7 @@ WRITE8_MEMBER(apollo_state::apollo_rtc_w)
READ8_MEMBER(apollo_state::apollo_rtc_r)
{
uint8_t data;
- m_rtc->write(space, 0, offset);
- data = m_rtc->read(space, 1);
+ data = m_rtc->read_direct(offset);
if (offset >= 0x0b && offset <= 0x0c)
{
SLOG2(("reading MC146818 at offset %02x = %02x", offset, data));
@@ -1047,7 +1045,8 @@ static void apollo_isa_cards(device_slot_interface &device)
device.option_add("3c505", ISA16_3C505); // 3Com 3C505 Ethernet card
}
-MACHINE_CONFIG_START(apollo_state::common)
+void apollo_state::common(machine_config &config)
+{
// configuration MUST be reset first !
APOLLO_CONF(config, APOLLO_CONF_TAG, 0);
@@ -1097,8 +1096,8 @@ MACHINE_CONFIG_START(apollo_state::common)
m_ptm->set_external_clocks(250000, 125000, 62500);
m_ptm->irq_callback().set(FUNC(apollo_state::apollo_ptm_irq_function));
- MCFG_DEVICE_ADD("ptmclock", CLOCK, 250000)
- MCFG_CLOCK_SIGNAL_HANDLER(WRITELINE(*this, apollo_state, apollo_ptm_timer_tick))
+ clock_device &ptmclock(CLOCK(config, "ptmclock", 250000));
+ ptmclock.signal_handler().set(FUNC(apollo_state::apollo_ptm_timer_tick));
MC146818(config, m_rtc, 32.768_kHz_XTAL);
// FIXME: is this interrupt really only connected on DN3000?
@@ -1114,7 +1113,6 @@ MACHINE_CONFIG_START(apollo_state::common)
m_sio2->irq_cb().set(FUNC(apollo_state::sio2_irq_handler));
ISA16(config, m_isa, 0);
- m_isa->set_cputag(MAINCPU);
m_isa->set_custom_spaces();
m_isa->irq2_callback().set(m_pic8259_slave, FUNC(pic8259_device::ir2_w)); // in place of irq 2 on at irq 9 is used
m_isa->irq3_callback().set(m_pic8259_master, FUNC(pic8259_device::ir3_w));
@@ -1135,16 +1133,16 @@ MACHINE_CONFIG_START(apollo_state::common)
m_isa->drq6_callback().set(m_dma8237_2, FUNC(am9517a_device::dreq2_w));
m_isa->drq7_callback().set(m_dma8237_2, FUNC(am9517a_device::dreq3_w));
- MCFG_DEVICE_ADD("isa1", ISA16_SLOT, 0, APOLLO_ISA_TAG, apollo_isa_cards, "wdc", false) // FIXME: determine ISA bus clock
- MCFG_DEVICE_ADD("isa2", ISA16_SLOT, 0, APOLLO_ISA_TAG, apollo_isa_cards, "ctape", false)
- MCFG_DEVICE_ADD("isa3", ISA16_SLOT, 0, APOLLO_ISA_TAG, apollo_isa_cards, "3c505", false)
- MCFG_DEVICE_ADD("isa4", ISA16_SLOT, 0, APOLLO_ISA_TAG, apollo_isa_cards, nullptr, false)
- MCFG_DEVICE_ADD("isa5", ISA16_SLOT, 0, APOLLO_ISA_TAG, apollo_isa_cards, nullptr, false)
- MCFG_DEVICE_ADD("isa6", ISA16_SLOT, 0, APOLLO_ISA_TAG, apollo_isa_cards, nullptr, false)
- MCFG_DEVICE_ADD("isa7", ISA16_SLOT, 0, APOLLO_ISA_TAG, apollo_isa_cards, nullptr, false)
+ ISA16_SLOT(config, "isa1", 0, APOLLO_ISA_TAG, apollo_isa_cards, "wdc", false); // FIXME: determine ISA bus clock
+ ISA16_SLOT(config, "isa2", 0, APOLLO_ISA_TAG, apollo_isa_cards, "ctape", false);
+ ISA16_SLOT(config, "isa3", 0, APOLLO_ISA_TAG, apollo_isa_cards, "3c505", false);
+ ISA16_SLOT(config, "isa4", 0, APOLLO_ISA_TAG, apollo_isa_cards, nullptr, false);
+ ISA16_SLOT(config, "isa5", 0, APOLLO_ISA_TAG, apollo_isa_cards, nullptr, false);
+ ISA16_SLOT(config, "isa6", 0, APOLLO_ISA_TAG, apollo_isa_cards, nullptr, false);
+ ISA16_SLOT(config, "isa7", 0, APOLLO_ISA_TAG, apollo_isa_cards, nullptr, false);
- MCFG_SOFTWARE_LIST_ADD("ctape_list", "apollo_ctape")
-MACHINE_CONFIG_END
+ SOFTWARE_LIST(config, "ctape_list").set_original("apollo_ctape");
+}
// for machines with the keyboard and a graphics head
void apollo_state::apollo(machine_config &config)
diff --git a/src/mame/machine/apollo_kbd.cpp b/src/mame/machine/apollo_kbd.cpp
index 13e3ba485b8..54302827fea 100644
--- a/src/mame/machine/apollo_kbd.cpp
+++ b/src/mame/machine/apollo_kbd.cpp
@@ -15,6 +15,7 @@
#define VERBOSE 0
#include "machine/apollo_kbd.h"
+#include "speaker.h"
#define LOG(x) { m_device->logerror ("%s apollo_kbd: ", m_device->cpu_context()); m_device->logerror x; m_device->logerror ("\n"); }
@@ -188,6 +189,7 @@ DEFINE_DEVICE_TYPE(APOLLO_KBD, apollo_kbd_device, "apollo_kbd", "Apollo Keyboard
apollo_kbd_device::apollo_kbd_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
: device_t(mconfig, APOLLO_KBD, tag, owner, clock)
, device_serial_interface(mconfig, *this)
+ , m_beep(*this, "beep")
, m_io_keyboard(*this, "keyboard%u", 1U)
, m_io_mouse(*this, "mouse%u", 1U)
, m_tx_w(*this)
@@ -196,6 +198,18 @@ apollo_kbd_device::apollo_kbd_device(const machine_config &mconfig, const char *
}
//-------------------------------------------------
+// device_add_mconfig - add device-specific
+// machine configuration
+//-------------------------------------------------
+
+void apollo_kbd_device::device_add_mconfig(machine_config &config)
+{
+ /* keyboard beeper */
+ SPEAKER(config, "mono").front_center();
+ BEEP(config, m_beep, 1000).add_route(ALL_OUTPUTS, "mono", 1.00);
+}
+
+//-------------------------------------------------
// device_input_ports - device-specific ports
//-------------------------------------------------
@@ -300,7 +314,7 @@ void apollo_kbd_device::beeper::start(apollo_kbd_device *device)
{
m_device = device;
LOG2(("start apollo_kbd::beeper"));
- m_beeper = m_device->machine().device<beep_device>("beep");
+ m_beeper = m_device->m_beep.target();
m_timer = m_device->machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(apollo_kbd_device::beeper::beeper_callback), this));
}
@@ -367,15 +381,10 @@ void apollo_kbd_device::mouse::read_mouse()
}
else
{
- int b = m_device->m_io_mouse[0]->read();
- int x = m_device->m_io_mouse[1]->read();
- int y = m_device->m_io_mouse[2]->read();
-
- /* sign extend values < 0 */
- if (x & 0x80)
- x |= 0xffffff00;
- if (y & 0x80)
- y |= 0xffffff00;
+ char b = m_device->m_io_mouse[0]->read();
+ char x = m_device->m_io_mouse[1]->read();
+ char y = m_device->m_io_mouse[2]->read();
+
y = -y;
if (m_last_b < 0)
@@ -422,9 +431,9 @@ void apollo_kbd_device::mouse::read_mouse()
// mouse data submitted; update current mouse state
m_last_b = b;
- m_last_x += dx;
- m_last_y += dy;
- m_tx_pending = 100; // mouse data packet will take 40 ms
+ m_last_x = x;
+ m_last_y = y;
+ m_tx_pending = 50; // mouse data packet will take 40 ms
}
}
}
diff --git a/src/mame/machine/apollo_kbd.h b/src/mame/machine/apollo_kbd.h
index a7343470a3d..35a2720215b 100644
--- a/src/mame/machine/apollo_kbd.h
+++ b/src/mame/machine/apollo_kbd.h
@@ -46,6 +46,7 @@ public:
private:
// device-level overrides
virtual ioport_constructor device_input_ports() const override;
+ virtual void device_add_mconfig(machine_config &config) override;
virtual void device_resolve_objects() override;
virtual void device_start() override;
virtual void device_reset() override;
@@ -110,6 +111,7 @@ private:
static const int XMIT_RING_SIZE = 64;
+ required_device<beep_device> m_beep;
required_ioport_array<4> m_io_keyboard;
required_ioport_array<3> m_io_mouse;
diff --git a/src/mame/machine/apple2common.cpp b/src/mame/machine/apple2common.cpp
new file mode 100644
index 00000000000..880ea935ac0
--- /dev/null
+++ b/src/mame/machine/apple2common.cpp
@@ -0,0 +1,806 @@
+// license:BSD-3-Clause
+// copyright-holders:R. Belmont
+/*********************************************************************
+
+ apple2common.cpp
+
+ Apple II stuff shared between apple2/apple2e/apple2gs.
+
+*********************************************************************/
+
+#include "emu.h"
+#include "emuopts.h"
+
+#include "apple2common.h"
+
+// device type definition
+DEFINE_DEVICE_TYPE(APPLE2_COMMON, apple2_common_device, "apple2com", "Apple II Common Components")
+
+//-------------------------------------------------
+// apple2_common_device - constructor
+//-------------------------------------------------
+
+apple2_common_device::apple2_common_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+ : device_t(mconfig, APPLE2_COMMON, tag, owner, clock),
+ m_GScpu(*this, finder_base::DUMMY_TAG)
+{
+}
+
+//-------------------------------------------------
+// device_start - device-specific startup
+//-------------------------------------------------
+
+void apple2_common_device::device_start()
+{
+ // precalculate joystick time constants
+ m_x_calibration = attotime::from_nsec(10800).as_double();
+ m_y_calibration = attotime::from_nsec(10800).as_double();
+ m_joystick_x1_time = m_joystick_x2_time = m_joystick_y1_time = m_joystick_y2_time = 0.0;
+}
+
+//-------------------------------------------------
+// device_validity_check - device-specific validation
+//-------------------------------------------------
+void apple2_common_device::device_validity_check(validity_checker &valid) const
+{
+ if ((m_GScpu.finder_tag() != finder_base::DUMMY_TAG) && !m_GScpu)
+ {
+ osd_printf_error("IIgs CPU configured but not found.\n");
+ }
+}
+
+struct dasm_data
+{
+ u16 addr;
+ const char *name;
+};
+
+struct dasm_data32
+{
+ u32 addr;
+ const char *name;
+};
+
+static const struct dasm_data p8_calls[] =
+{
+ { 0x40, "ALLOC_INTERRUPT" }, { 0x41, "DEALLOC_INTERRUPT" },
+ { 0x65, "QUIT" }, { 0x80, "READ_BLOCK" }, { 0x81, "WRITE_BLOCK" }, { 0x82, "GET_TIME" },
+ { 0x99, "ATINIT" }, { 0xc0, "CREATE" }, { 0xc1, "DESTROY" }, { 0xc2, "RENAME" }, { 0xc3, "SET_FILE_INFO" },
+ { 0xc4, "GET_FILE_INFO" }, { 0xc5, "ONLINE" }, { 0xc6, "SET_PREFIX" }, { 0xc7, "GET_PREFIX" }, { 0xc8, "OPEN" },
+ { 0xc9, "NEWLINE" }, { 0xca, "READ" }, { 0xcb, "WRITE" }, { 0xcc, "CLOSE" }, { 0xcd, "FLUSH" }, { 0xce, "SET_MARK" },
+ { 0xcf, "GET_MARK" }, { 0xd0, "SET_EOF" }, { 0xd1, "GET_EOF" }, { 0xd2, "SET_BUF" }, { 0xd3, "GET_BUF" },
+
+ { 0xffff, "" }
+};
+
+static const struct dasm_data a2_stuff[] =
+{
+ { 0x0020, "WNDLFT" }, { 0x0021, "WNDWDTH" }, { 0x0022, "WNDTOP" }, { 0x0023, "WNDBTM" },
+ { 0x0024, "CH" }, { 0x0025, "CV" }, { 0x0026, "GBASL" }, { 0x0027, "GBASH" },
+ { 0x0028, "BASL" }, { 0x0029, "BASH" }, { 0x002b, "BOOTSLOT" }, { 0x002c, "H2" },
+ { 0x002d, "V2" }, { 0x002e, "MASK" }, { 0x0030, "COLOR" }, { 0x0031, "MODE" },
+ { 0x0032, "INVFLG" }, { 0x0033, "PROMPT" }, { 0x0036, "CSWL" }, { 0x0037, "CSWH" },
+ { 0x0038, "KSWL" }, { 0x0039, "KSWH" }, { 0x0045, "ACC" }, { 0x0046, "XREG" },
+ { 0x0047, "YREG" }, { 0x0048, "STATUS" }, { 0x004E, "RNDL" }, { 0x004F, "RNDH" },
+ { 0x0067, "TXTTAB" }, { 0x0069, "VARTAB" }, { 0x006b, "ARYTAB" }, { 0x6d, "STREND" },
+ { 0x006f, "FRETOP" }, { 0x0071, "FRESPC" }, { 0x0073, "MEMSIZ" }, { 0x0075, "CURLIN" },
+ { 0x0077, "OLDLIN" }, { 0x0079, "OLDTEXT" }, { 0x007b, "DATLIN" }, { 0x007d, "DATPTR" },
+ { 0x007f, "INPTR" }, { 0x0081, "VARNAM" }, { 0x0083, "VARPNT" }, { 0x0085, "FORPNT" },
+ { 0x009A, "EXPON" }, { 0x009C, "EXPSGN" }, { 0x009d, "FAC" }, { 0x00A2, "FAC.SIGN" },
+ { 0x00a5, "ARG" }, { 0x00AA, "ARG.SIGN" }, { 0x00af, "PRGEND" }, { 0x00B8, "TXTPTR" },
+ { 0x00C9, "RNDSEED" }, { 0x00D6, "LOCK" }, { 0x00D8, "ERRFLG" }, { 0x00DA, "ERRLIN" },
+ { 0x00DE, "ERRNUM" }, { 0x00E4, "HGR.COLOR" }, { 0x00E6, "HGR.PAGE" }, { 0x00F1, "SPEEDZ" },
+
+ { 0xc000, "KBD / 80STOREOFF" }, { 0xc001, "80STOREON" }, { 0xc002, "RDMAINRAM" }, {0xc003, "RDCARDRAM" }, {0xc004, "WRMAINRAM" },
+ { 0xc005, "WRCARDRAM" }, { 0xc006, "SETSLOTCXROM" }, { 0xc007, "SETINTCXROM" }, { 0xc008, "SETSTDZP" },
+ { 0xc009, "SETALTZP "}, { 0xc00a, "SETINTC3ROM" }, { 0xc00b, "SETSLOTC3ROM" }, { 0xc00c, "CLR80VID" },
+ { 0xc00d, "SET80VID" }, { 0xc00e, "CLRALTCHAR" }, { 0xc00f, "SETALTCHAR" }, { 0xc010, "KBDSTRB" },
+ { 0xc011, "RDLCBNK2" }, { 0xc012, "RDLCRAM" }, { 0xc013, "RDRAMRD" }, { 0xc014, "RDRAMWRT" },
+ { 0xc015, "RDCXROM" }, { 0xc016, "RDALTZP" }, { 0xc017, "RDC3ROM" }, { 0xc018, "RD80STORE" },
+ { 0xc019, "RDVBL" }, { 0xc01a, "RDTEXT" }, { 0xc01b, "RDMIXED" }, { 0xc01c, "RDPAGE2" },
+ { 0xc01d, "RDHIRES" }, { 0xc01e, "RDALTCHAR" }, { 0xc01f, "RD80VID" }, { 0xc020, "TAPEOUT" },
+ { 0xc021, "MONOCOLOR" }, { 0xc022, "TBCOLOR" }, { 0xc023, "VGCINT" }, { 0xc024, "MOUSEDATA" },
+ { 0xc025, "KEYMODREG" }, { 0xc026, "DATAREG" }, { 0xc027, "KMSTATUS" }, { 0xc028, "ROMBANK" },
+ { 0xc029, "NEWVIDEO"}, { 0xc02b, "LANGSEL" }, { 0xc02c, "CHARROM" }, { 0xc02d, "SLOTROMSEL" },
+ { 0xc02e, "VERTCNT" }, { 0xc02f, "HORIZCNT" }, { 0xc030, "SPKR" }, { 0xc031, "DISKREG" },
+ { 0xc032, "SCANINT" }, { 0xc033, "CLOCKDATA" }, { 0xc034, "CLOCKCTL" }, { 0xc035, "SHADOW" },
+ { 0xc036, "FPIREG/CYAREG" }, { 0xc037, "BMAREG" }, { 0xc038, "SCCBREG" }, { 0xc039, "SCCAREG" },
+ { 0xc03a, "SCCBDATA" }, { 0xc03b, "SCCADATA" }, { 0xc03c, "SOUNDCTL" }, { 0xc03d, "SOUNDDATA" },
+ { 0xc03e, "SOUNDADRL" }, { 0xc03f, "SOUNDADRH" }, { 0xc040, "STROBE/RDXYMSK" }, { 0xc041, "RDVBLMSK" },
+ { 0xc042, "RDX0EDGE" }, { 0xc043, "RDY0EDGE" }, { 0xc044, "MMDELTAX" }, { 0xc045, "MMDELTAY" },
+ { 0xc046, "DIAGTYPE" }, { 0xc047, "CLRVBLINT" }, { 0xc048, "CLRXYINT" }, { 0xc04f, "EMUBYTE" },
+ { 0xc050, "TXTCLR" }, { 0xc051, "TXTSET" },
+ { 0xc052, "MIXCLR" }, { 0xc053, "MIXSET" }, { 0xc054, "TXTPAGE1" }, { 0xc055, "TXTPAGE2" },
+ { 0xc056, "LORES" }, { 0xc057, "HIRES" }, { 0xc058, "CLRAN0" }, { 0xc059, "SETAN0" },
+ { 0xc05a, "CLRAN1" }, { 0xc05b, "SETAN1" }, { 0xc05c, "CLRAN2" }, { 0xc05d, "SETAN2" },
+ { 0xc05e, "DHIRESON" }, { 0xc05f, "DHIRESOFF" }, { 0xc060, "TAPEIN" }, { 0xc061, "RDBTN0" },
+ { 0xc062, "BUTN1" }, { 0xc063, "RD63" }, { 0xc064, "PADDL0" }, { 0xc065, "PADDL1" },
+ { 0xc066, "PADDL2" }, { 0xc067, "PADDL3" }, { 0xc068, "STATEREG" }, { 0xc070, "PTRIG" }, { 0xc073, "BANKSEL" },
+ { 0xc07e, "IOUDISON" }, { 0xc07f, "IOUDISOFF" }, { 0xc081, "ROMIN" }, { 0xc083, "LCBANK2" },
+ { 0xc085, "ROMIN" }, { 0xc087, "LCBANK2" }, { 0xcfff, "DISCC8ROM" },
+
+ { 0xF800, "F8ROM:PLOT" }, { 0xF80E, "F8ROM:PLOT1" } , { 0xF819, "F8ROM:HLINE" }, { 0xF828, "F8ROM:VLINE" },
+ { 0xF832, "F8ROM:CLRSCR" }, { 0xF836, "F8ROM:CLRTOP" }, { 0xF838, "F8ROM:CLRSC2" }, { 0xF847, "F8ROM:GBASCALC" },
+ { 0xF856, "F8ROM:GBCALC" }, { 0xF85F, "F8ROM:NXTCOL" }, { 0xF864, "F8ROM:SETCOL" }, { 0xF871, "F8ROM:SCRN" },
+ { 0xF882, "F8ROM:INSDS1" }, { 0xF88E, "F8ROM:INSDS2" }, { 0xF8A5, "F8ROM:ERR" }, { 0xF8A9, "F8ROM:GETFMT" },
+ { 0xF8D0, "F8ROM:INSTDSP" }, { 0xF940, "F8ROM:PRNTYX" }, { 0xF941, "F8ROM:PRNTAX" }, { 0xF944, "F8ROM:PRNTX" },
+ { 0xF948, "F8ROM:PRBLNK" }, { 0xF94A, "F8ROM:PRBL2" }, { 0xF84C, "F8ROM:PRBL3" }, { 0xF953, "F8ROM:PCADJ" },
+ { 0xF854, "F8ROM:PCADJ2" }, { 0xF856, "F8ROM:PCADJ3" }, { 0xF85C, "F8ROM:PCADJ4" }, { 0xF962, "F8ROM:FMT1" },
+ { 0xF9A6, "F8ROM:FMT2" }, { 0xF9B4, "F8ROM:CHAR1" }, { 0xF9BA, "F8ROM:CHAR2" }, { 0xF9C0, "F8ROM:MNEML" },
+ { 0xFA00, "F8ROM:MNEMR" }, { 0xFA40, "F8ROM:OLDIRQ" }, { 0xFA4C, "F8ROM:BREAK" }, { 0xFA59, "F8ROM:OLDBRK" },
+ { 0xFA62, "F8ROM:RESET" }, { 0xFAA6, "F8ROM:PWRUP" }, { 0xFABA, "F8ROM:SLOOP" }, { 0xFAD7, "F8ROM:REGDSP" },
+ { 0xFADA, "F8ROM:RGDSP1" }, { 0xFAE4, "F8ROM:RDSP1" }, { 0xFB19, "F8ROM:RTBL" }, { 0xFB1E, "F8ROM:PREAD" },
+ { 0xFB21, "F8ROM:PREAD4" }, { 0xFB25, "F8ROM:PREAD2" }, { 0xFB2F, "F8ROM:INIT" }, { 0xFB39, "F8ROM:SETTXT" },
+ { 0xFB40, "F8ROM:SETGR" }, { 0xFB4B, "F8ROM:SETWND" }, { 0xFB51, "F8ROM:SETWND2" }, { 0xFB5B, "F8ROM:TABV" },
+ { 0xFB60, "F8ROM:APPLEII" }, { 0xFB6F, "F8ROM:SETPWRC" }, { 0xFB78, "F8ROM:VIDWAIT" }, { 0xFB88, "F8ROM:KBDWAIT" },
+ { 0xFBB3, "F8ROM:VERSION" }, { 0xFBBF, "F8ROM:ZIDBYTE2" }, { 0xFBC0, "F8ROM:ZIDBYTE" }, { 0xFBC1, "F8ROM:BASCALC" },
+ { 0xFBD0, "F8ROM:BSCLC2" }, { 0xFBDD, "F8ROM:BELL1" }, { 0xFBE2, "F8ROM:BELL1.2" }, { 0xFBE4, "F8ROM:BELL2" },
+ { 0xFBF0, "F8ROM:STORADV" }, { 0xFBF4, "F8ROM:ADVANCE" }, { 0xFBFD, "F8ROM:VIDOUT" }, { 0xFC10, "F8ROM:BS" },
+ { 0xFC1A, "F8ROM:UP" }, { 0xFC22, "F8ROM:VTAB" }, { 0xFC24, "F8ROM:VTABZ" }, { 0xFC42, "F8ROM:CLREOP" },
+ { 0xFC46, "F8ROM:CLEOP1" }, { 0xFC58, "F8ROM:HOME" }, { 0xFC62, "F8ROM:CR" }, { 0xFC66, "F8ROM:LF" },
+ { 0xFC70, "F8ROM:SCROLL" }, { 0xFC95, "F8ROM:SCRL3" }, { 0xFC9C, "F8ROM:CLREOL" }, { 0xFC9E, "F8ROM:CLREOLZ" },
+ { 0xFCA8, "F8ROM:WAIT" }, { 0xFCB4, "F8ROM:NXTA4" }, { 0xFCBA, "F8ROM:NXTA1" }, { 0xFCC9, "F8ROM:HEADR" },
+ { 0xFCEC, "F8ROM:RDBYTE" }, { 0xFCEE, "F8ROM:RDBYT2" }, { 0xFCFA, "F8ROM:RD2BIT" }, { 0xFD0C, "F8ROM:RDKEY" },
+ { 0xFD18, "F8ROM:RDKEY1" }, { 0xFD1B, "F8ROM:KEYIN" }, { 0xFD2F, "F8ROM:ESC" }, { 0xFD35, "F8ROM:RDCHAR" },
+ { 0xFD3D, "F8ROM:NOTCR" }, { 0xFD62, "F8ROM:CANCEL" }, { 0xFD67, "F8ROM:GETLNZ" }, { 0xFD6A, "F8ROM:GETLN" },
+ { 0xFD6C, "F8ROM:GETLN0" }, { 0xFD6F, "F8ROM:GETLN1" }, { 0xFD8B, "F8ROM:CROUT1" }, { 0xFD8E, "F8ROM:CROUT" },
+ { 0xFD92, "F8ROM:PRA1" }, { 0xFDA3, "F8ROM:XAM8" }, { 0xFDDA, "F8ROM:PRBYTE" }, { 0xFDE3, "F8ROM:PRHEX" },
+ { 0xFDE5, "F8ROM:PRHEXZ" }, { 0xFDED, "F8ROM:COUT" }, { 0xFDF0, "F8ROM:COUT1" }, { 0xFDF6, "F8ROM:COUTZ" },
+ { 0xFE18, "F8ROM:SETMODE" }, { 0xFE1F, "F8ROM:IDROUTINE" }, { 0xFE20, "F8ROM:LT" }, { 0xFE22, "F8ROM:LT2" },
+ { 0xFE2C, "F8ROM:MOVE" }, { 0xFE36, "F8ROM:VFY" }, { 0xFE5E, "F8ROM:LIST" }, { 0xFE63, "F8ROM:LIST2" },
+ { 0xFE75, "F8ROM:A1PC" }, { 0xFE80, "F8ROM:SETINV" }, { 0xFE84, "F8ROM:SETNORM" }, { 0xFE89, "F8ROM:SETKBD" },
+ { 0xFE8B, "F8ROM:INPORT" }, { 0xFE8D, "F8ROM:INPRT" }, { 0xFE93, "F8ROM:SETVID" }, { 0xFE95, "F8ROM:OUTPORT" },
+ { 0xFE97, "F8ROM:OUTPRT" }, { 0xFEB0, "F8ROM:XBASIC" }, { 0xFEB3, "F8ROM:BASCONT" }, { 0xFEB6, "F8ROM:GO" },
+ { 0xFECA, "F8ROM:USR" }, { 0xFECD, "F8ROM:WRITE" }, { 0xFEFD, "F8ROM:READ" }, { 0xFF2D, "F8ROM:PRERR" },
+ { 0xFF3A, "F8ROM:BELL" }, { 0xFF3F, "F8ROM:RESTORE" }, { 0xFF4A, "F8ROM:SAVE" }, { 0xFF58, "F8ROM:IORTS" },
+ { 0xFF59, "F8ROM:OLDRST" }, { 0xFF65, "F8ROM:MON" }, { 0xFF69, "F8ROM:MONZ" }, { 0xFF6C, "F8ROM:MONZ2" },
+ { 0xFF70, "F8ROM:MONZ4" }, { 0xFF8A, "F8ROM:DIG" }, { 0xFFA7, "F8ROM:GETNUM" }, { 0xFFAD, "F8ROM:NXTCHR" },
+ { 0xFFBE, "F8ROM:TOSUB" }, { 0xFFC7, "F8ROM:ZMODE" }, { 0xFFCC, "F8ROM:CHRTBL" }, { 0xFFE3, "F8ROM:SUBTBL" },
+
+ { 0xffff, "" }
+};
+
+static const struct dasm_data gs_tools[] =
+{
+ { 0x0101, "TLBootInit()" }, { 0x0201, "TLStartUp()" }, { 0x0301, "TLShutDown()" }, { 0x0401, "TLVersion():Vers" }, { 0x0501, "TLReset()" },
+ { 0x0601, "TLStatus():ActFlg" }, { 0x0901, "GetTSPtr(SysFlg,TS#):@FPT" }, { 0x0A01, "SetTSPtr(SysFlg,TS#,@FPT)" }, { 0x0B01, "GetFuncPtr(SysFlg,Func):@Func" },
+ { 0x0C01, "GetWAP(SysFlg,TS#):@WAP" }, { 0x0D01, "SetWAP(SysFlg,TS#,@WAP)" }, { 0x0E01, "LoadTools(@ToolTable)" }, { 0x0F01, "LoadOneTool(TS#,MinVers)" },
+ { 0x1001, "UnloadOneTool(TS#)" }, { 0x1101, "TLMountVolume(X,Y,@L1,@L2,@B1,@B2):Btn#" }, { 0x1201, "TLTextMountVolume(@L1,@L2,@B1,@B2):Btn#" },
+ { 0x1301, "SaveTextState():StateH" }, { 0x1401, "RestoreTextState(StateH)" }, { 0x1501, "MessageCenter(Action,Type,MsgH)" }, { 0x1601, "SetDefaultTPT()" },
+ { 0x1701, "MessageByName(CreateF,@inpRec):Created,Type" }, { 0x1801, "StartUpTools(MemID,ssDesc,ssRef/4):ssRef/4" }, { 0x1901, "ShutDownTools(ssDesc,ssRef/4)" },
+ { 0x1A01, "GetMsgHandle(Flags,MsgRef/4):H" }, { 0x1B01, "AcceptRequests(@NameStr,UserID,@ReqProc)" }, { 0x1C01, "SendRequest(ReqCode,How,Target/4,@In,@Out)" },
+ { 0x0102, "MMBootInit()" }, { 0x0202, "MMStartUp():MemID" }, { 0x0302, "MMShutDown(MemID)" }, { 0x0402, "MMVersion():Vers" }, { 0x0502, "MMReset()" },
+ { 0x0602, "MMStatus():ActFlg" }, { 0x0902, "NewHandle(Size/4,MemID,Attr,@loc):H" }, { 0x0A02, "ReAllocHandle(Size/4,MemID,Attr,@loc,H)" }, { 0x0B02, "RestoreHandle(H)" },
+ { 0x0C02, "AddToOOMQueue(@header)" }, { 0x0D02, "RemoveFromOOMQueue(@header)" }, { 0x1002, "DisposeHandle(H)" }, { 0x1102, "DisposeAll(MemID)" },
+ { 0x1202, "PurgeHandle(H)" }, { 0x1302, "PurgeAll(MemID)" }, { 0x1802, "GetHandleSize(H):Size/4" }, { 0x1902, "SetHandleSize(Size/4,H)" }, { 0x1A02, "FindHandle(@byte):H" },
+ { 0x1B02, "FreeMem():FreeBytes/4" }, { 0x1C02, "MaxBlock():Size/4" }, { 0x1D02, "TotalMem():Size/4" }, { 0x1E02, "CheckHandle(H)" }, { 0x1F02, "CompactMem()" },
+ { 0x2002, "HLock(H)" }, { 0x2102, "HLockAll(MemID)" }, { 0x2202, "HUnlock(H)" }, { 0x2302, "HUnlockAll(MemID)" }, { 0x2402, "SetPurge(PrgLvl,H)" },
+ { 0x2502, "SetPurgeAll(PrgLvl,MemID)" }, { 0x2802, "PtrToHand(@Src,DestH,Count/4)" }, { 0x2902, "HandToPtr(SrcH,@Dest,Count/4)" }, { 0x2A02, "HandToHand(SrcH,DestH,Count/4)" },
+ { 0x2B02, "BlockMove(@Source,@Dest,Count/4)" }, { 0x2F02, "RealFreeMem():Size/4" }, { 0x3002, "SetHandleID(newMemID,theH):oldMemID" }, { 0x0103, "MTBootInit()" },
+ { 0x0203, "MTStartUp()" }, { 0x0303, "MTShutDown()" }, { 0x0403, "MTVersion():Vers" }, { 0x0503, "MTReset()" }, { 0x0603, "MTStatus():ActFlg" },
+ { 0x0903, "WriteBRam(@Buff)" }, { 0x0A03, "ReadBRam(@Buff)" }, { 0x0B03, "WriteBParam(Data,Parm#)" }, { 0x0C03, "ReadBParam(Parm#):Data" }, { 0x0D03, "ReadTimeHex():WkDay,Mn&Dy,Yr&Hr,Mn&Sec" },
+ { 0x0E03, "WriteTimeHex(Mn&Dy,Yr&Hr,Mn&Sec)" }, { 0x0F03, "ReadAsciiTime(@Buff)" }, { 0x1003, "SetVector(Vec#,@x)" }, { 0x1103, "GetVector(Vec#):@x" },
+ { 0x1203, "SetHeartBeat(@Task)" }, { 0x1303, "DelHeartBeat(@Task)" }, { 0x1403, "ClrHeartBeat()" }, { 0x1503, "SysFailMgr(Code,@Msg)" }, { 0x1603, "GetAddr(Ref#):@Parm" },
+ { 0x1703, "ReadMouse():X,Y,Stat&Mode" }, { 0x1803, "InitMouse(Slot)" }, { 0x1903, "SetMouse(Mode)" }, { 0x1A03, "HomeMouse()" }, { 0x1B03, "ClearMouse()" },
+ { 0x1C03, "ClampMouse(Xmn,Xmx,Ymn,Ymx)" }, { 0x1D03, "GetMouseClamp():Xmn,Xmx,Ymn,Ymx" }, { 0x1E03, "PosMouse(X,Y)" }, { 0x1F03, "ServeMouse():IntStat" },
+ { 0x2003, "GetNewID(Kind):MemID" }, { 0x2103, "DeleteID(MemID)" }, { 0x2203, "StatusID(MemID)" }, { 0x2303, "IntSource(Ref#)" }, { 0x2403, "FWEntry(A,X,Y,Address):P,A,X,Y" },
+ { 0x2503, "GetTick():Ticks/4" }, { 0x2603, "PackBytes(@StartPtr,@Sz,@OutBf,OutSz):Size" }, { 0x2703, "UnPackBytes(@Buff,BfSz,@StartPtr,@Sz):Size" },
+ { 0x2803, "Munger(@Dst,@DstL,@t,tL,@Rpl,RplL,@Pad):N" }, { 0x2903, "GetIRQEnable():IntStat" }, { 0x2A03, "SetAbsClamp(Xmn,Xmx,Ymn,Ymx)" },
+ { 0x2B03, "GetAbsClamp():Xmn,Xmx,Ymn,Ymx" }, { 0x2C03, "SysBeep()" }, { 0x2E03, "AddToQueue(@newTask,@queueHeader)" }, { 0x2F03, "DeleteFromQueue(@task,@queueHeader)" },
+ { 0x3003, "SetInterruptState(@stateRec,NumBytes)" }, { 0x3103, "GetInterruptState(@stateRec,NumBytes)" }, { 0x3203, "GetIntStateRecSize():Size" },
+ { 0x3303, "ReadMouse2():xPos,yPos,StatMode" }, { 0x3403, "GetCodeResConverter():@proc" }, { 0x3503, "GetROMResource(?,?/4):???H" },
+ { 0x3603, "ReleaseROMResource(?,?/4)" }, { 0x3703, "ConvSeconds(convVerb,Secs/4,@Date):SecondsOut/4" }, { 0x3803, "SysBeep2(beepKind)" },
+ { 0x3903, "VersionString(flags,Version/4,@Buffer)" }, { 0x3A03, "WaitUntil(WaitFromTime,DelayTime):NewTime" }, { 0x3B03, "StringToText(flags,@String,StrLen,@Buffer):ResFlags,PrntLen" },
+ { 0x3C03, "ShowBootInfo(@String,@Icon)" }, { 0x3D03, "ScanDevices():DevNum" }, { 0x3E03, "AlertMessage(@Table,MsgNum,@Subs):Button" }, { 0x3F03, "DoSysPrefs(bitsToClear,bitsToSet):SysPrefs" },
+ { 0x0104, "QDBootInit()" }, { 0x0204, "QDStartUp(DirPg,MastSCB,MaxWid,MemID)" }, { 0x0304, "QDShutDown()" }, { 0x0404, "QDVersion():Vers" }, { 0x0504, "QDReset()" },
+ { 0x0604, "QDStatus():ActFlg" }, { 0x0904, "GetAddress(what):@Table" }, { 0x0A04, "GrafOn()" }, { 0x0B04, "GrafOff()" }, { 0x0C04, "GetStandardSCB():SCB" },
+ { 0x0D04, "InitColorTable(@Table)" }, { 0x0E04, "SetColorTable(Tab#,@SrcTab)" }, { 0x0F04, "GetColorTable(Tab#,@DestTbl)" }, { 0x1004, "SetColorEntry(Tab#,Ent#,NewCol)" },
+ { 0x1104, "GetColorEntry(Tab#,Ent#):Color" }, { 0x1204, "SetSCB(Line#,SCB)" }, { 0x1304, "GetSCB(Line#):SCB" }, { 0x1404, "SetAllSCBs(SCB)" }, { 0x1504, "ClearScreen(Color)" },
+ { 0x1604, "SetMasterSCB(SCB)" }, { 0x1704, "GetMasterSCB():SCB" }, { 0x1804, "OpenPort(@Port)" }, { 0x1904, "InitPort(@Port)" }, { 0x1A04, "ClosePort(@Port)" },
+ { 0x1B04, "SetPort(@Port)" }, { 0x1C04, "GetPort():@Port" }, { 0x1D04, "SetPortLoc(@LocInfo)" }, { 0x1E04, "GetPortLoc(@LocInfo)" }, { 0x1F04, "SetPortRect(@Rect)" },
+ { 0x2004, "GetPortRect(@Rect)" }, { 0x2104, "SetPortSize(w,h)" }, { 0x2204, "MovePortTo(h,v)" }, { 0x2304, "SetOrigin(h,v)" }, { 0x2404, "SetClip(RgnH)" },
+ { 0x2504, "GetClip(RgnH)" }, { 0x2604, "ClipRect(@Rect)" }, { 0x2704, "HidePen()" }, { 0x2804, "ShowPen()" }, { 0x2904, "GetPen(@Pt)" }, { 0x2A04, "SetPenState(@PenSt)" },
+ { 0x2B04, "GetPenState(@PenSt)" }, { 0x2C04, "SetPenSize(w,h)" }, { 0x2D04, "GetPenSize(@Pt)" }, { 0x2E04, "SetPenMode(Mode)" }, { 0x2F04, "GetPenMode():Mode" }, { 0x3004, "SetPenPat(@Patt)" },
+ { 0x3104, "GetPenPat(@Patt)" }, { 0x3204, "SetPenMask(@Mask)" }, { 0x3304, "GetPenMask(@Mask)" }, { 0x3404, "SetBackPat(@Patt)" }, { 0x3504, "GetBackPat(@Patt)" },
+ { 0x3604, "PenNormal()" }, { 0x3704, "SetSolidPenPat(Color)" }, { 0x3804, "SetSolidBackPat(Color)" }, { 0x3904, "SolidPattern(Color,@Patt)" }, { 0x3A04, "MoveTo(h,v)" },
+ { 0x3B04, "Move(dh,dv)" }, { 0x3C04, "LineTo(h,v)" }, { 0x3D04, "Line(dh,dv)" }, { 0x3E04, "SetPicSave(Val/4)" }, { 0x3F04, "GetPicSave():Val/4" },{ 0x4004, "SetRgnSave(Val/4)" },
+ { 0x4104, "GetRgnSave():Val/4" }, { 0x4204, "SetPolySave(Val/4)" }, { 0x4304, "GetPolySave():Val/4" }, { 0x4404, "SetGrafProcs(@GrafProcs)" },{ 0x4504, "GetGrafProcs():@GrafProcs" },
+ { 0x4604, "SetUserField(Val/4)" }, { 0x4704, "GetUserField():Val/4" }, { 0x4804, "SetSysField(Val/4)" }, { 0x4904, "GetSysField():Val/4" }, { 0x4A04, "SetRect(@Rect,left,top,right,bot)" },
+ { 0x4B04, "OffsetRect(@Rect,dh,dv)" }, { 0x4C04, "InsetRect(@Rect,dh,dv)" }, { 0x4D04, "SectRect(@R1,@R2,@DstR):nonEmptyF" }, { 0x4E04, "UnionRect(@Rect1,@Rect2,@UnionRect)" },
+ { 0x4F04, "PtInRect(@Pt,@Rect):Flag" }, { 0x5004, "Pt2Rect(@Pt1,@Pt2,@Rect)" }, { 0x5104, "EqualRect(@Rect1,@Rect2):Flag" }, { 0x5204, "NotEmptyRect(@Rect):Flag" },
+ { 0x5304, "FrameRect(@Rect)" }, { 0x5404, "PaintRect(@Rect)" }, { 0x5504, "EraseRect(@Rect)" }, { 0x5604, "InvertRect(@Rect)" }, { 0x5704, "FillRect(@Rect,@Patt)" },
+ { 0x5804, "FrameOval(@Rect)" }, { 0x5904, "PaintOval(@Rect)" }, { 0x5A04, "EraseOval(@Rect)" }, { 0x5B04, "InvertOval(@Rect)" }, { 0x5C04, "FillOval(@Rect,@Patt)" },
+ { 0x5D04, "FrameRRect(@Rect,OvalW,OvalHt)" }, { 0x5E04, "PaintRRect(@Rect,OvalW,OvalHt)" }, { 0x5F04, "EraseRRect(@Rect,OvalW,OvalHt)" }, { 0x6004, "InvertRRect(@Rect,OvalW,OvalHt)" },
+ { 0x6104, "FillRRect(@Rect,OvalW,OvalHt,@Patt)" }, { 0x6204, "FrameArc(@Rect,Ang1,ArcAng)" }, { 0x6304, "PaintArc(@Rect,Ang1,ArcAng)" }, { 0x6404, "EraseArc(@Rect,Ang1,ArcAng)" },
+ { 0x6504, "InvertArc(@Rect,Ang1,ArcAng)" }, { 0x6604, "FillArc(@Rect,Ang1,ArcAng,@Patt)" }, { 0x6704, "NewRgn():RgnH" }, { 0x6804, "DisposeRgn(RgnH)" },
+ { 0x6904, "CopyRgn(SrcRgnH,DestRgnH)" }, { 0x6A04, "SetEmptyRgn(RgnH)" }, { 0x6B04, "SetRectRgn(RgnH,left,top,right,bot)" }, { 0x6C04, "RectRgn(RgnH,@Rect)" },
+ { 0x6D04, "OpenRgn()" }, { 0x6E04, "CloseRgn(RgnH)" }, { 0x6F04, "OffsetRgn(RgnH,dh,dv)" }, { 0x7004, "InsetRgn(RgnH,dh,dv)" }, { 0x7104, "SectRgn(Rgn1H,Rgn2H,DstRgnH)" },
+ { 0x7204, "UnionRgn(Rgn1H,Rgn2H,UnionRgnH)" }, { 0x7304, "DiffRgn(Rgn1H,Rgn2H,DstRgnH)" }, { 0x7404, "XorRgn(Rgn1H,Rgn2H,DstRgnH)" }, { 0x7504, "PtInRgn(@Pt,RgnH):Flag" },
+ { 0x7604, "RectInRgn(@Rect,RgnH):Flag" }, { 0x7704, "EqualRgn(Rgn1H,Rgn2H):Flag" }, { 0x7804, "EmptyRgn(RgnH):Flag" }, { 0x7904, "FrameRgn(RgnH)" },
+ { 0x7A04, "PaintRgn(RgnH)" }, { 0x7B04, "EraseRgn(RgnH)" }, { 0x7C04, "InvertRgn(RgnH)" }, { 0x7D04, "FillRgn(RgnH,@Patt)" }, { 0x7E04, "ScrollRect(@Rect,dh,dv,UpdtRgnH)" },
+ { 0x7F04, "PaintPixels(@ppParms)" }, { 0x8004, "AddPt(@SrcPt,@DestPt)" }, { 0x8104, "SubPt(@SrcPt,@DstPt)" }, { 0x8204, "SetPt(@Pt,h,v)" }, { 0x8304, "EqualPt(@Pt1,@Pt2):Flag" },
+ { 0x8404, "LocalToGlobal(@Pt)" }, { 0x8504, "GlobalToLocal(@Pt)" }, { 0x8604, "Random():N" }, { 0x8704, "SetRandSeed(Seed/4)" }, { 0x8804, "GetPixel(Hor,Vert):Pixel" },
+ { 0x8904, "ScalePt(@Pt,@SrcRect,@DstRect)" }, { 0x8A04, "MapPt(@Pt,@SrcRect,@DstRect)" }, { 0x8B04, "MapRect(@Rect,@SrcRect,@DstRect)" }, { 0x8C04, "MapRgn(MapRgnH,@SrcRect,@DstRect)" },
+ { 0x8D04, "SetStdProcs(@StdProcRec)" }, { 0x8E04, "SetCursor(@Curs)" }, { 0x8F04, "GetCursorAdr():@Curs" }, { 0x9004, "HideCursor()" }, { 0x9104, "ShowCursor()" },
+ { 0x9204, "ObscureCursor()" }, { 0x9304, "SetMouseLoc ???" }, { 0x9404, "SetFont(FontH)" }, { 0x9504, "GetFont():FontH" }, { 0x9604, "GetFontInfo(@InfoRec)" },
+ { 0x9704, "GetFontGlobals(@FGRec)" }, { 0x9804, "SetFontFlags(Flags)" }, { 0x9904, "GetFontFlags():Flags" }, { 0x9A04, "SetTextFace(TextF)" }, { 0x9B04, "GetTextFace():TextF" },
+ { 0x9C04, "SetTextMode(TextM)" }, { 0x9D04, "GetTextMode():TextM" }, { 0x9E04, "SetSpaceExtra(SpEx/4f)" }, { 0x9F04, "GetSpaceExtra():SpEx/4f" }, { 0xA004, "SetForeColor(Color)" },
+ { 0xA104, "GetForeColor():Color" }, { 0xA204, "SetBackColor(BackCol)" }, { 0xA304, "GetBackColor():BackCol" }, { 0xA404, "DrawChar(Char)" }, { 0xA504, "DrawString(@Str)" },
+ { 0xA604, "DrawCString(@cStr)" }, { 0xA704, "DrawText(@Text,Len)" }, { 0xA804, "CharWidth(Char):Width" }, { 0xA904, "StringWidth(@Str):Width" }, { 0xAA04, "CStringWidth(@cStr):Width" },
+ { 0xAB04, "TextWidth(@Text,Len):Width" }, { 0xAC04, "CharBounds(Char,@Rect)" }, { 0xAD04, "StringBounds(@Str,@Rect)" }, { 0xAE04, "CStringBounds(@cStr,@Rect)" },
+ { 0xAF04, "TextBounds(@Text,Len,@Rect)" }, { 0xB004, "SetArcRot(ArcRot)" }, { 0xB104, "GetArcRot():ArcRot" }, { 0xB204, "SetSysFont(FontH)" }, { 0xB304, "GetSysFont():FontH" },
+ { 0xB404, "SetVisRgn(RgnH)" }, { 0xB504, "GetVisRgn(RgnH)" }, { 0xB604, "SetIntUse(Flag)" }, { 0xB704, "OpenPicture(@FrameRect):PicH" }, { 0xB804, "PicComment(Kind,DataSz,DataH)" },
+ { 0xB904, "ClosePicture()" }, { 0xBA04, "DrawPicture(PicH,@DstRect)" }, { 0xBB04, "KillPicture(PicH)" }, { 0xBC04, "FramePoly(PolyH)" }, { 0xBD04, "PaintPoly(PolyH)" },
+ { 0xBE04, "ErasePoly(PolyH)" }, { 0xBF04, "InvertPoly(PolyH)" }, { 0xC004, "FillPoly(PolyH,@Patt)" }, { 0xC104, "OpenPoly():PolyH" }, { 0xC204, "ClosePoly()" },
+ { 0xC304, "KillPoly(PolyH)" }, { 0xC404, "OffsetPoly(PolyH,dh,dv)" }, { 0xC504, "MapPoly(PolyH,@SrcRect,@DstRect)" }, { 0xC604, "SetClipHandle(RgnH)" },
+ { 0xC704, "GetClipHandle():RgnH" }, { 0xC804, "SetVisHandle(RgnH)" }, { 0xC904, "GetVisHandle():RgnH" }, { 0xCA04, "InitCursor()" }, { 0xCB04, "SetBufDims(MaxW,MaxFontHt,MaxFBRext)" },
+ { 0xCC04, "ForceBufDims(MaxW,MaxFontHt,MaxFBRext)" }, { 0xCD04, "SaveBufDims(@SizeInfo)" }, { 0xCE04, "RestoreBufDims(@SizeInfo)" }, { 0xCF04, "GetFGSize():FGSize" },
+ { 0xD004, "SetFontID(FontID/4)" }, { 0xD104, "GetFontID():FontID/4" }, { 0xD204, "SetTextSize(TextSz)" }, { 0xD304, "GetTextSize():TextSz" }, { 0xD404, "SetCharExtra(ChEx/4f)" },
+ { 0xD504, "GetCharExtra():ChEx/4f" }, { 0xD604, "PPToPort(@SrcLoc,@SrcRect,X,Y,Mode)" }, { 0xD704, "InflateTextBuffer(NewW,NewHt)" }, { 0xD804, "GetRomFont(@Rec)" },
+ { 0xD904, "GetFontLore(@Rec,RecSize):Size" }, { 0xDA04, "Get640Colors():@PattTable" }, { 0xDB04, "Set640Color(color)" }, { 0x0105, "DeskBootInit()" },
+ { 0x0205, "DeskStartUp()" }, { 0x0305, "DeskShutDown()" }, { 0x0405, "DeskVersion():Vers" }, { 0x0505, "DeskReset()" }, { 0x0605, "DeskStatus():ActFlg" },
+ { 0x0905, "SaveScrn()" }, { 0x0A05, "RestScrn()" }, { 0x0B05, "SaveAll()" }, { 0x0C05, "RestAll()" }, { 0x0E05, "InstallNDA(ndaH)" }, { 0x0F05, "InstallCDA(cdaH)" },
+ { 0x1105, "ChooseCDA()" }, { 0x1305, "SetDAStrPtr(AltDispH,@StrTbl)" }, { 0x1405, "GetDAStrPtr():@StrTbl" }, { 0x1505, "OpenNDA(ItemID):Ref#" }, { 0x1605, "CloseNDA(Ref#)" },
+ { 0x1705, "SystemClick(@EvRec,@Wind,fwRes)" }, { 0x1805, "SystemEdit(eType):Flag" }, { 0x1905, "SystemTask()" }, { 0x1A05, "SystemEvent(Mods,Where/4,When/4,Msg/4,What):F" },
+ { 0x1B05, "GetNumNDAs():N" }, { 0x1C05, "CloseNDAbyWinPtr(@Wind)" }, { 0x1D05, "CloseAllNDAs()" }, { 0x1E05, "FixAppleMenu(MenuID)" }, { 0x1F05, "AddToRunQ(@taskHeader)" },
+ { 0x2005, "RemoveFromRunQ(@taskHeader)" }, { 0x2105, "RemoveCDA(cdaH)" }, { 0x2205, "RemoveNDA(ndaH)" }, { 0x2305, "GetDeskAccInfo(flags,daRef/4,BufSize,@Buffer)" },
+ { 0x2405, "CallDeskAcc(flags,daRef/4,Action,Data/4):Result" }, { 0x2505, "GetDeskGlobal(selector):Value/4" }, { 0x0106, "EMBootInit()" }, { 0x0206, "EMStartUp(DirPg,qSz,Xmn,Xmx,Ymn,Ymx,MemID)" },
+ { 0x0306, "EMShutDown()" }, { 0x0406, "EMVersion():Vers" }, { 0x0506, "EMReset()" }, { 0x0606, "EMStatus():ActFlg" }, { 0x0906, "DoWindows():DirPg" },{ 0x0A06, "GetNextEvent(evMask,@EvRec):Flag" },
+ { 0x0B06, "EventAvail(evMask,@EvRec):Flag" }, { 0x0C06, "GetMouse(@Pt)" }, { 0x0D06, "Button(Btn#):DownFlg" }, { 0x0E06, "StillDown(Btn#):Flag" },
+ { 0x0F06, "WaitMouseUp(Btn#):Flag" }, { 0x1006, "TickCount():Ticks/4" }, { 0x1106, "GetDblTime():Ticks/4" }, { 0x1206, "GetCaretTime():Ticks/4" },
+ { 0x1306, "SetSwitch()" }, { 0x1406, "PostEvent(code,Msg/4):Flag" }, { 0x1506, "FlushEvents(evMask,StopMask):F" }, { 0x1606, "GetOSEvent(evMask,@EvRec):Flag" },
+ { 0x1706, "OSEventAvail(evMask,@EvRec):Flag" }, { 0x1806, "SetEventMask(evMask)" }, { 0x1906, "FakeMouse(ChFlg,Mods,X,Y,BtnStat)" }, { 0x1A06, "SetAutoKeyLimit(NewLimit)" },
+ { 0x1B06, "GetKeyTranslation():kTransID" }, { 0x1C06, "SetKeyTranslation(kTransID)" }, { 0x0107, "SchBootInit()" }, { 0x0207, "SchStartUp()" }, { 0x0307, "SchShutDown()" },
+ { 0x0407, "SchVersion():Vers" }, { 0x0507, "SchReset()" }, { 0x0607, "SchStatus():ActFlg" }, { 0x0907, "SchAddTask(@Task):Flag" }, { 0x0A07, "SchFlush()" },
+ { 0x0108, "SoundBootInit()" }, { 0x0208, "SoundStartUp(DirPg)" }, { 0x0308, "SoundShutDown()" }, { 0x0408, "SoundVersion():Vers" }, { 0x0508, "SoundReset()" },
+ { 0x0608, "SoundToolStatus():ActFlg" }, { 0x0908, "WriteRamBlock(@Src,DOCStart,Count)" }, { 0x0A08, "ReadRamBlock(@Dest,DOCStart,Count)" }, { 0x0B08, "GetTableAddress():@JumpTbl" },
+ { 0x0C08, "GetSoundVolume(Gen#):Vol" }, { 0x0D08, "SetSoundVolume(Vol,Gen#)" }, { 0x0E08, "FFStartSound(GenN&mode,@Parms)" }, { 0x0F08, "FFStopSound(GenMask)" },
+ { 0x1008, "FFSoundStatus():ActFlg" }, { 0x1108, "FFGeneratorStatus(Gen#):Stat" }, { 0x1208, "SetSoundMIRQV(@IntHandler)" }, { 0x1308, "SetUserSoundIRQV(@NewIRQ):@OldIRQ" },
+ { 0x1408, "FFSoundDoneStatus(Gen#):Stat" }, { 0x1508, "FFSetUpSound(ChannelGen,@Parms)" }, { 0x1608, "FFStartPlaying(GenWord)" }, { 0x1708, "SetDocReg(@DocRegParms)" },
+ { 0x1808, "ReadDocReg(@DocRegParms)" }, { 0x0109, "ADBBootInit()" }, { 0x0209, "ADBStartUp()" }, { 0x0309, "ADBShutDown()" }, { 0x0409, "ADBVersion():Vers" },
+ { 0x0509, "ADBReset()" }, { 0x0609, "ADBStatus():ActFlg" }, { 0x0909, "SendInfo(NumB,@Data,Cmd)" }, { 0x0A09, "ReadKeyMicroData(NumB,@Data,Cmd)" }, { 0x0B09, "ReadKeyMicroMemory(@DataOut,@DataIn,Cmd)" },
+ { 0x0C09, "[resynch--don't call]" }, { 0x0D09, "AsyncADBReceive(@CompVec,Cmd)" }, { 0x0E09, "SyncADBReceive(InputWrd,@CompVec,Cmd)" }, { 0x0F09, "AbsOn()" },
+ { 0x1009, "AbsOff()" }, { 0x1109, "RdAbs():Flag" }, { 0x1209, "SetAbsScale(@DataOut)" }, { 0x1309, "GetAbsScale(@DataIn)" }, { 0x1409, "SRQPoll(@CompVec,ADBreg)" },
+ { 0x1509, "SRQRemove(ADBreg)" }, { 0x1609, "ClearSRQTable()" }, { 0xFF09, "[OBSOLETE: Use 09FF]" }, { 0x010A, "SANEBootInit()" }, { 0x020A, "SANEStartUp(DirPg)" },
+ { 0x030A, "SANEShutDown()" }, { 0x040A, "SANEVersion():Vers" }, { 0x050A, "SANEReset()" }, { 0x060A, "SANEStatus():ActFlg" }, { 0x090A, "FPNum (...)" },
+ { 0x0A0A, "DecStrNum (...)" }, { 0x0B0A, "ElemNum (...)" }, { 0xFF0A, "[OBSOLETE: USE $0AFF]" }, { 0x010B, "IMBootInit()" }, { 0x020B, "IMStartUp()" },
+ { 0x030B, "IMShutDown()" }, { 0x040B, "IMVersion():Vers" }, { 0x050B, "IMReset()" }, { 0x060B, "IMStatus():ActFlg" }, { 0x090B, "Multiply(A,B):Prod/4" },
+ { 0x0A0B, "SDivide(Num,Den):Rem,Quot" }, { 0x0B0B, "UDivide(Num,Den):Rem,Quot" }, { 0x0C0B, "LongMul(A/4,B/4):Prod/8" }, { 0x0D0B, "LongDivide(Num/4,Denom/4):Rem/4,Quot/4" },
+ { 0x0E0B, "FixRatio(Numer,Denom):fxRatio/4" }, { 0x0F0B, "FixMul(fx1/4,fx2/4):fxProd/4" }, { 0x100B, "FracMul(fr1/4,fr2/4):frRes/4" }, { 0x110B, "FixDiv(Quot/4,Divisor/4):fxRes/4" },
+ { 0x120B, "FracDiv(Quot/4,Divisor/4):frRes/4" }, { 0x130B, "FixRound(fxVal/4):Int" }, { 0x140B, "FracSqrt(frVal/4):frRes/4" }, { 0x150B, "FracCos(fxAngle/4):frRes/4" },
+ { 0x160B, "FracSin(fxAngle/4):frRes/4" }, { 0x170B, "FixATan2(In1/4,In2/4):fxArcTan/4" }, { 0x180B, "HiWord(Long/4):Int" }, { 0x190B, "LoWord(Long/4):Int" },
+ { 0x1A0B, "Long2Fix(Long/4):fxRes/4" }, { 0x1B0B, "Fix2Long(Fix/4):Long/4" }, { 0x1C0B, "Fix2Frac(fxVal/4):Frac/4" }, { 0x1D0B, "Frac2Fix(frVal/4):fxRes/4" },
+ { 0x1E0B, "Fix2X(Fix/4,@Extended)" }, { 0x1F0B, "Frac2X(frVal/4,@Extended)" }, { 0x200B, "X2Fix(@Extended):fxRes/4" }, { 0x210B, "X2Frac(@Extended):frRes/4" },
+ { 0x220B, "Int2Hex(Int,@Str,Len)" }, { 0x230B, "Long2Hex(Long/4,@Str,Len)" }, { 0x240B, "Hex2Int(@Str,Len):Int" }, { 0x250B, "Hex2Long(@Str,Len):Long/4" },
+ { 0x260B, "Int2Dec(Int,@Str,Len,SgnFlg)" }, { 0x270B, "Long2Dec(Long/4,@Str,Len,SgnFlg)" }, { 0x280B, "Dec2Int(@Str,Len,SgnFlg):Int" }, { 0x290B, "Dec2Long(@Str,Len,SgnFlg):Long/4" },
+ { 0x2A0B, "HexIt(Int):Hex/4" }, { 0x010C, "TextBootInit()" }, { 0x020C, "TextStartUp()" }, { 0x030C, "TextShutDown()" }, { 0x040C, "TextVersion():Vers" },
+ { 0x050C, "TextReset()" }, { 0x060C, "TextStatus():ActFlg" }, { 0x090C, "SetInGlobals(ANDmsk,ORmsk)" }, { 0x0A0C, "SetOutGlobals(ANDmsk,ORmsk)" },
+ { 0x0B0C, "SetErrGlobals(ANDmsk,ORmsk)" }, { 0x0C0C, "GetInGlobals():ANDmsk,ORmsk" }, { 0x0D0C, "GetOutGlobals():ANDmsk,ORmsk" }, { 0x0E0C, "GetErrGlobals():ANDmsk,ORmsk" },
+ { 0x0F0C, "SetInputDevice(Type,@drvr|Slot/4)" }, { 0x100C, "SetOutputDevice(Type,@drvr|Slot/4)" }, { 0x110C, "SetErrorDevice(Type,@drvr|Slot/4)" }, { 0x120C, "GetInputDevice():Type,@drvr|Slot/4" },
+ { 0x130C, "GetOutputDevice():Type,@drvr|Slot/4" }, { 0x140C, "GetErrorDevice():Type,@drvr|Slot/4" },{ 0x150C, "InitTextDev(dev)" }, { 0x160C, "CtlTextDev(dev,code)" },
+ { 0x170C, "StatusTextDev(dev,request)" }, { 0x180C, "WriteChar(Char)" }, { 0x190C, "ErrWriteChar(Char)" }, { 0x1A0C, "WriteLine(@Str)" }, { 0x1B0C, "ErrWriteLine(@Str)" },
+ { 0x1C0C, "WriteString(@Str)" }, { 0x1D0C, "ErrWriteString(@Str)" }, { 0x1E0C, "TextWriteBlock(@Text,Offset,Len)" }, { 0x1F0C, "ErrWriteBlock(@Text,Offset,Len)" },{ 0x200C, "WriteCString(@cStr)" },
+ { 0x210C, "ErrWriteCString(@cStr)" }, { 0x220C, "ReadChar(EchoFlg):Char" }, { 0x230C, "TextReadBlock(@Buff,Offset,Size,EchoFlg)" }, { 0x240C, "ReadLine(@Buff,Max,EOLch,EchoFlg):Count" },
+ { 0x010E, "WindBootInit()" }, { 0x020E, "WindStartUp(MemID)" }, { 0x030E, "WindShutDown()" }, { 0x040E, "WindVersion():Vers" }, { 0x050E, "WindReset()" },{ 0x060E, "WindStatus():ActFlg" },
+ { 0x090E, "NewWindow(@Parms):@Wind" }, { 0x0A0E, "CheckUpdate(@EvRec):Flag" }, { 0x0B0E, "CloseWindow(@Wind)" }, { 0x0C0E, "Desktop(Oper,param/4):result/4" },
+ { 0x0D0E, "SetWTitle(@Title,@Wind)" }, { 0x0E0E, "GetWTitle(@Wind):@Title" }, { 0x0F0E, "SetFrameColor(@NewColTbl,@Wind)" }, { 0x100E, "GetFrameColor(@Table,@Wind)" },
+ { 0x110E, "SelectWindow(@Wind)" }, { 0x120E, "HideWindow(@Wind)" }, { 0x130E, "ShowWindow(@Wind)" }, { 0x140E, "SendBehind(@BehindWho,@Wind)" },
+ { 0x150E, "FrontWindow():@Wind" }, { 0x160E, "SetInfoDraw(@Proc,@Wind)" }, { 0x170E, "FindWindow(@WindVar,X,Y):Where" }, { 0x180E, "TrackGoAway(X,Y,@Wind):Flag" },
+ { 0x190E, "MoveWindow(X,Y,@Wind)" }, { 0x1A0E, "DragWindow(Grid,X,Y,Grace,@bRect,@Wind)" }, { 0x1B0E, "GrowWindow(mnW,mnH,X,Y,@Wind):nSize/4" },
+ { 0x1C0E, "SizeWindow(w,h,@Wind)" }, { 0x1D0E, "TaskMaster(evMask,@TaskRec):Code" }, { 0x1E0E, "BeginUpdate(@Wind)" }, { 0x1F0E, "EndUpdate(@Wind)" },
+ { 0x200E, "GetWMgrPort():@Port" }, { 0x210E, "PinRect(X,Y,@Rect):Point/4" }, { 0x220E, "HiliteWindow(Flag,@Wind)" }, { 0x230E, "ShowHide(Flag,@Wind)" },
+ { 0x240E, "BringToFront(@Wind)" }, { 0x250E, "WindNewRes()" }, { 0x260E, "TrackZoom(X,Y,@Wind):Flag" }, { 0x270E, "ZoomWindow(@Wind)" }, { 0x280E, "SetWRefCon(Refcon/4,@Wind)" },
+ { 0x290E, "GetWRefCon(@Wind):Refcon/4" }, { 0x2A0E, "GetNextWindow(@Wind):@Wind" }, { 0x2B0E, "GetWKind(@Wind):Flag" }, { 0x2C0E, "GetWFrame(@Wind):Frame" },
+ { 0x2D0E, "SetWFrame(Frame,@Wind)" }, { 0x2E0E, "GetStructRgn(@Wind):StructRgnH" }, { 0x2F0E, "GetContentRgn(@Wind):ContRgnH" }, { 0x300E, "GetUpdateRgn(@Wind):UpdateRgnH" },
+ { 0x310E, "GetDefProc(@Wind):@Proc" }, { 0x320E, "SetDefProc(@Proc,@Wind)" }, { 0x330E, "GetWControls(@Wind):CtrlH" }, { 0x340E, "SetOriginMask(Mask,@Wind)" },
+ { 0x350E, "GetInfoRefCon(@Wind):Refcon/4" }, { 0x360E, "SetInfoRefCon(Val/4,@Wind)" }, { 0x370E, "GetZoomRect(@Wind):@zRect" }, { 0x380E, "SetZoomRect(@zRect,@Wind)" },
+ { 0x390E, "RefreshDesktop(@Rect)" }, { 0x3A0E, "InvalRect(@Rect)" }, { 0x3B0E, "InvalRgn(RgnH)" }, { 0x3C0E, "ValidRect(@Rect)" }, { 0x3D0E, "ValidRgn(RgnH)" },
+ { 0x3E0E, "GetContentOrigin(@Wind):Origin/4" }, { 0x3F0E, "SetContentOrigin(X,Y,@Wind)" }, { 0x400E, "GetDataSize(@Wind):DataSize/4" }, { 0x410E, "SetDataSize(w,h,@Wind)" },
+ { 0x420E, "GetMaxGrow(@Wind):MaxGrow/4" }, { 0x430E, "SetMaxGrow(maxWidth,maxHeight,@Wind)" }, { 0x440E, "GetScroll(@Wind):Scroll/4" }, { 0x450E, "SetScroll(h,v,@Wind)" },
+ { 0x460E, "GetPage(@Wind):Page/4" }, { 0x470E, "SetPage(h,v,@Wind)" }, { 0x480E, "GetContentDraw(@Wind):@Proc" }, { 0x490E, "SetContentDraw(@Proc,@Wind)" },
+ { 0x4A0E, "GetInfoDraw(@Wind):@Proc" }, { 0x4B0E, "SetSysWindow(@Wind)" }, { 0x4C0E, "GetSysWFlag(@Wind):Flag" }, { 0x4D0E, "StartDrawing(@Wind)" },
+ { 0x4E0E, "SetWindowIcons(NewFontH):OldFontH" }, { 0x4F0E, "GetRectInfo(@InfoRect,@Wind)" }, { 0x500E, "StartInfoDrawing(@iRect,@Wind)" }, { 0x510E, "EndInfoDrawing()" },
+ { 0x520E, "GetFirstWindow():@Wind" }, { 0x530E, "WindDragRect(@a,@P,X,Y,@R,@lR,@sR,F):M/4" }, { 0x540E, "Private01():@func [GetDragRectPtr]" },
+ { 0x550E, "DrawInfoBar(@Wind)" }, { 0x560E, "WindowGlobal(Flags):Flags" }, { 0x570E, "SetContentOrigin2(ScrollFlag,X,Y,@Wind)" }, { 0x580E, "GetWindowMgrGlobals():@Globals" },
+ { 0x590E, "AlertWindow(AlertDesc,@SubArray,AlertRef/4):Btn" }, { 0x5A0E, "StartFrameDrawing(@Wind)" }, { 0x5B0E, "EndFrameDrawing()" }, { 0x5C0E, "ResizeWindow(hidden,@ContRect,@Wind)" },
+ { 0x5D0E, "TaskMasterContent" }, { 0x5E0E, "TaskMasterKey" }, { 0x5F0E, "TaskMasterDA(evMask,@bigTaskRec):taskCode" }, { 0x600E, "CompileText(subType,@subs,@text,size):H" },
+ { 0x610E, "NewWindow2(@T,RC/4,@draw,@def,pDesc,pRef/4,rType):@W" }, { 0x620E, "ErrorWindow(subType,@subs,ErrNum):Button" },
+ { 0x630E, "GetAuxWindInfo(@Wind):@Info" }, { 0x640E, "DoModalWindow(@Event,@Update,@EvHook,@Beep,Flags):Result/4" }, { 0x650E, "MWGetCtlPart():Part" },
+ { 0x660E, "MWSetMenuProc(@NewMenuProc):@OldMenuProc" }, { 0x670E, "MWStdDrawProc()" }, { 0x680E, "MWSetUpEditMenu()" }, { 0x690E, "FindCursorCtl(@CtrlH,x,y,@Wind):PartCode" },
+ { 0x6A0E, "ResizeInfoBar(flags,newHeight,@Wind)" }, { 0x6B0E, "HandleDiskInsert(flags,devNum):resFlags,resDevNum" }, { 0x6C0E, "UpdateWindow(flags,@Wind)" },
+ { 0x010F, "MenuBootInit()" }, { 0x020F, "MenuStartUp(MemID,DirPg)" }, { 0x030F, "MenuShutDown()" }, { 0x040F, "MenuVersion():Vers" }, { 0x050F, "MenuReset()" },
+ { 0x060F, "MenuStatus():ActFlg" }, { 0x090F, "MenuKey(@TaskRec,BarH)" }, { 0x0A0F, "GetMenuBar():BarH" }, { 0x0B0F, "MenuRefresh(@RedrawProc)" }, { 0x0C0F, "FlashMenuBar()" },
+ { 0x0D0F, "InsertMenu(MenuH,AfterWhat)" }, { 0x0E0F, "DeleteMenu(MenuID)" }, { 0x0F0F, "InsertMItem(@Item,AfterItem,MenuID)" }, { 0x100F, "DeleteMItem(ItemID)" },
+ { 0x110F, "GetSysBar():BarH" }, { 0x120F, "SetSysBar(BarH)" }, { 0x130F, "FixMenuBar():Height" }, { 0x140F, "CountMItems(MenuID):N" }, { 0x150F, "NewMenuBar(@Wind):BarH" },
+ { 0x160F, "GetMHandle(MenuID):MenuH" }, { 0x170F, "SetBarColors(BarCol,InvCol,OutCol)" }, { 0x180F, "GetBarColors():Colors/4" }, { 0x190F, "SetMTitleStart(hStart)" },
+ { 0x1A0F, "GetMTitleStart():hStart" }, { 0x1B0F, "GetMenuMgrPort():@Port" }, { 0x1C0F, "CalcMenuSize(w,h,MenuID)" }, { 0x1D0F, "SetMTitleWidth(w,MenuID)" },
+ { 0x1E0F, "GetMTitleWidth(MenuID):TitleWidth" }, { 0x1F0F, "SetMenuFlag(Flags,MenuID)" }, { 0x200F, "GetMenuFlag(MenuID):Flags" },{ 0x210F, "SetMenuTitle(@Title,MenuID)" },
+ { 0x220F, "GetMenuTitle(MenuID):@Title" }, { 0x230F, "MenuGlobal(Flags):Flags" }, { 0x240F, "SetMItem(@Str,ItemID)" }, { 0x250F, "GetMItem(ItemID):@ItemName" },
+ { 0x260F, "SetMItemFlag(Flags,ItemID)" }, { 0x270F, "GetMItemFlag(ItemID):Flag" }, { 0x280F, "SetMItemBlink(Count)" }, { 0x290F, "MenuNewRes()" },
+ { 0x2A0F, "DrawMenuBar()" }, { 0x2B0F, "MenuSelect(@TaskRec,BarH)" }, { 0x2C0F, "HiliteMenu(Flag,MenuID)" }, { 0x2D0F, "NewMenu(@MenuStr):MenuH" }, { 0x2E0F, "DisposeMenu(MenuH)" },
+ { 0x2F0F, "InitPalette()" }, { 0x300F, "EnableMItem(ItemID)" }, { 0x310F, "DisableMItem(ItemID)" }, { 0x320F, "CheckMItem(Flag,ItemID)" }, { 0x330F, "SetMItemMark(MarkCh,ItemID)" },
+ { 0x340F, "GetMItemMark(ItemID):MarkChar" }, { 0x350F, "SetMItemStyle(TextStyle,ItemID)" }, { 0x360F, "GetMItemStyle(ItemID):TextStyle" }, { 0x370F, "SetMenuID(New,Old)" },
+ { 0x380F, "SetMItemID(New,Old)" }, { 0x390F, "SetMenuBar(BarH)" }, { 0x3A0F, "SetMItemName(@Str,ItemID)" }, { 0x3B0F, "GetPopUpDefProc():@proc" },
+ { 0x3C0F, "PopUpMenuSelect(SelID,left,top,flag,MenuH):id" }, { 0x3D0F, "[DrawPopUp(SelID,Flag,right,bottom,left,top,MenuH)]" }, { 0x3E0F, "NewMenu2(RefDesc,Ref/4):MenuH" },
+ { 0x3F0F, "InsertMItem2(RefDesc,Ref/4,After,MenuID)" }, { 0x400F, "SetMenuTitle2(RefDesc,TitleRef/4,MenuID)" }, { 0x410F, "SetMItem2(RefDesc,Ref/4,Item)" },
+ { 0x420F, "SetMItemName2(RefDesc,Ref/4,Item)" }, { 0x430F, "NewMenuBar2(RefDesc,Ref/4,@Wind):BarH" }, { 0x450F, "HideMenuBar()" }, { 0x460F, "ShowMenuBar()" },
+ { 0x470F, "SetMItemIcon(IconDesc,IconRef/4,ItemID)" }, { 0x480F, "GetMItemIcon(ItemID):IconRef/4" }, { 0x490F, "SetMItemStruct(Desc,StructRef/4,ItemID)" },
+ { 0x4A0F, "GetMItemStruct(ItemID):ItemStruct/4" }, { 0x4B0F, "RemoveMItemStruct(ItemID)" }, { 0x4C0F, "GetMItemFlag2(ItemID):ItemFlag2" }, { 0x4D0F, "SetMItemFlag2(newValue,ItemID)" },
+ { 0x4F0F, "GetMItemBlink():Count" }, { 0x500F, "InsertPathMItems(flags,@Path,devnum,MenuID,AfterID,StartID,@Results)" }, { 0x0110, "CtlBootInit()" },
+ { 0x0210, "CtlStartUp(MemID,DirPg)" }, { 0x0310, "CtlShutDown()" }, { 0x0410, "CtlVersion():Vers" }, { 0x0510, "CtlReset()" }, { 0x0610, "CtlStatus():ActFlg" },
+ { 0x0910, "NewControl(@W,@R,@T,F,V,P1,P2,@p,r/4,@C):cH" }, { 0x0A10, "DisposeControl(CtrlH)" }, { 0x0B10, "KillControls(@Wind)" }, { 0x0C10, "SetCtlTitle(@Title,CtrlH)" },
+ { 0x0D10, "GetCtlTitle(CtrlH):@Title" }, { 0x0E10, "HideControl(CtrlH)" }, { 0x0F10, "ShowControl(CtrlH)" }, { 0x1010, "DrawControls(@Wind)" },{ 0x1110, "HiliteControl(Flag,CtrlH)" },
+ { 0x1210, "CtlNewRes()" }, { 0x1310, "FindControl(@CtrlHVar,X,Y,@Wind):Part" }, { 0x1410, "TestControl(X,Y,CtrlH):Part" }, { 0x1510, "TrackControl(X,Y,@ActProc,CtrlH):Part" },
+ { 0x1610, "MoveControl(X,Y,CtrlH)" }, { 0x1710, "DragControl(X,Y,@LimR,@slR,Axis,CtrlH)" }, { 0x1810, "SetCtlIcons(FontH):OldFontH" }, { 0x1910, "SetCtlValue(Val,CtrlH)" },
+ { 0x1A10, "GetCtlValue(CtrlH):Val" }, { 0x1B10, "SetCtlParams(P2,P1,CtrlH)" }, { 0x1C10, "GetCtlParams(CtrlH):P1,P2" }, { 0x1D10, "DragRect(@acPr,@P,X,Y,@drR,@l,@slR,F):M/4" },
+ { 0x1E10, "GrowSize():Size/4" }, { 0x1F10, "GetCtlDpage():DirPg" }, { 0x2010, "SetCtlAction(@ActProc,CtrlH)" }, { 0x2110, "GetCtlAction(CtrlH):Action/4" }, { 0x2210, "SetCtlRefCon(Refcon/4,CtrlH)" },
+ { 0x2310, "GetCtlRefCon(CtrlH):Refcon/4" }, { 0x2410, "EraseControl(CtrlH)" }, { 0x2510, "DrawOneCtl(CtrlH)" }, { 0x2610, "FindTargetCtl():CtrlH" },
+ { 0x2710, "MakeNextCtlTarget():CtrlH" }, { 0x2810, "MakeThisCtlTarget(CtrlH)" }, { 0x2910, "SendEventToCtl(TgtOnly,@Wind,@eTask):Accepted" }, { 0x2A10, "GetCtlID(CtrlH):CtlID/4" },
+ { 0x2B10, "SetCtlID(CtlID/4,CtrlH)" }, { 0x2C10, "CallCtlDefProc(CtrlH,Msg,Param/4):Result/4" }, { 0x2D10, "NotifyCtls(Mask,Msg,Param/4,@Wind)" },
+ { 0x2E10, "GetCtlMoreFlags(CtrlH):Flags" }, { 0x2F10, "SetCtlMoreFlags(Flags,CtrlH)" }, { 0x3010, "GetCtlHandleFromID(@Wind,CtlID/4):CtrlH" }, { 0x3110, "NewControl2(@Wind,InKind,InRef/4):CtrlH" },
+ { 0x3210, "CMLoadResource(rType,rID/4):resH" }, { 0x3310, "CMReleaseResource(rType,rID/4)" }, { 0x3410, "SetCtlParamPtr(@SubArray)" }, { 0x3510, "GetCtlParamPtr():@SubArray" },
+ { 0x3710, "InvalCtls(@Wind)" }, { 0x3810, "[reserved]" }, { 0x3910, "FindRadioButton(@Wind,FamilyNum):WhichRadio" }, { 0x3A10, "SetLETextByID(@Wind,leID/4,@PString)" },
+ { 0x3B10, "GetLETextByID(@Wind,leID/4,@PString)" }, { 0x3C10, "SetCtlValueByID(Value,@Wind,CtlID/4)" }, { 0x3D10, "GetCtlValueByID(@Wind,CtlID/4):Value" },{ 0x3E10, "InvalOneCtlByID(@Wind,CtlID/4)" },
+ { 0x3F10, "HiliteCtlByID(Hilite,@Wind,CtlID/4)" }, { 0x0111, "LoaderBootInit()" }, { 0x0211, "LoaderStartUp()" }, { 0x0311, "LoaderShutDown()" },
+ { 0x0411, "LoaderVersion():Vers" }, { 0x0511, "LoaderReset()" }, { 0x0611, "LoaderStatus():ActFlg" }, { 0x0911, "InitialLoad(MemID,@path,F):dpsSz,dps,@l,MemID" },
+ { 0x0A11, "Restart(MemID):dpsSz,dps,@loc,MemID" }, { 0x0B11, "LoadSegNum(MemID,file#,seg#):@loc" }, { 0x0C11, "UnloadSegNum(MemID,file#,seg#)" }, { 0x0D11, "LoadSegName(MemID,@path,@segn):@loc,MemID,file#,sg#" },
+ { 0x0E11, "UnloadSeg(@loc):seg#,file#,MemID" }, { 0x0F11, "GetLoadSegInfo(MemID,file#,seg#,@buff)" }, { 0x1011, "GetUserID(@Pathname):MemID" }, { 0x1111, "LGetPathname(MemID,file#):@path" },
+ { 0x1211, "UserShutDown(MemID,qFlag):MemID" }, { 0x1311, "RenamePathname(@path1,@path2)" }, { 0x2011, "InitialLoad2(MemID,@in,F,Type):dpsSz,dps,@l,MemID" },
+ { 0x2111, "GetUserID2(@path):MemID" }, { 0x2211, "LGetPathname2(MemID,file#):@path" }, { 0x0112, "QDAuxBootInit()" }, { 0x0212, "QDAuxStartUp()" },
+ { 0x0312, "QDAuxShutDown()" }, { 0x0412, "QDAuxVersion():Vers" }, { 0x0512, "QDAuxReset()" }, { 0x0612, "QDAuxStatus():ActFlg" }, { 0x0912, "CopyPixels(@sLoc,@dLoc,@sRect,@dRct,M,MskH)" },
+ { 0x0A12, "WaitCursor()" }, { 0x0B12, "DrawIcon(@Icon,Mode,X,Y)" }, { 0x0C12, "SpecialRect(@Rect,FrameColor,FillColor)" }, { 0x0D12, "SeedFill(@sLoc,@sR,@dLoc,@dR,X,Y,Mode,@Patt,@Leak)" },
+ { 0x0E12, "CalcMask(@sLoc,@sR,@dLoc,@dR,Mode,@Patt,@Leak)" }, { 0x0F12, "GetSysIcon(flags,value,aux/4):@Icon" }, { 0x1012, "PixelMap2Rgn(@srcLoc,bitsPerPix,colorMask):RgnH" },
+ { 0x1312, "IBeamCursor()" }, { 0x1412, "WhooshRect(flags/4,@smallRect,@bigRect)" }, { 0x1512, "DrawStringWidth(Flags,Ref/4,Width)" }, { 0x1612, "UseColorTable(tableNum,@Table,Flags):ColorInfoH" },
+ { 0x1712, "RestoreColorTable(ColorInfoH,Flags)" }, { 0x0113, "PMBootInit()" }, { 0x0213, "PMStartUp(MemID,DirPg)" }, { 0x0313, "PMShutDown()" },
+ { 0x0413, "PMVersion():Vers" }, { 0x0513, "PMReset()" }, { 0x0613, "PMStatus():ActFlg" }, { 0x0913, "PrDefault(PrRecH)" }, { 0x0A13, "PrValidate(PrRecH):Flag" },
+ { 0x0B13, "PrStlDialog(PrRecH):Flag" }, { 0x0C13, "PrJobDialog(PrRecH):Flag" }, { 0x0D13, "PrPixelMap(@LocInfo,@SrcRect,colorFlag)" }, { 0x0E13, "PrOpenDoc(PrRecH,@Port):@Port" },
+ { 0x0F13, "PrCloseDoc(@Port)" }, { 0x1013, "PrOpenPage(@Port,@Frame)" }, { 0x1113, "PrClosePage(@Port)" }, { 0x1213, "PrPicFile(PrRecH,@Port,@StatRec)" },{ 0x1313, "PrControl [obsolete]" },
+ { 0x1413, "PrError():Error" }, { 0x1513, "PrSetError(Error)" }, { 0x1613, "PrChoosePrinter():DrvFlag" }, { 0x1813, "PrGetPrinterSpecs():Type,Characteristics" },
+ { 0x1913, "PrDevPrChanged(@PrinterName)" }, { 0x1A13, "PrDevStartup(@PrinterName,@ZoneName)" }, { 0x1B13, "PrDevShutDown()" }, { 0x1C13, "PrDevOpen(@compProc,Reserved/4)" },
+ { 0x1D13, "PrDevRead(@buffer,reqCount):xferCount" }, { 0x1E13, "PrDevWrite(@compProc,@buff,bufLen)" }, { 0x1F13, "PrDevClose()" }, { 0x2013, "PrDevStatus(@statBuff)" },
+ { 0x2113, "PrDevAsyncRead(@compPr,bufLen,@buff):xferCount" }, { 0x2213, "PrDevWriteBackground(@compProc,bufLen,@buff)" }, { 0x2313, "PrDriverVer():Vers" },
+ { 0x2413, "PrPortVer():Vers" }, { 0x2513, "PrGetZoneName():@ZoneName" }, { 0x2813, "PrGetPrinterDvrName():@Name" }, { 0x2913, "PrGetPortDvrName():@Name" },
+ { 0x2A13, "PrGetUserName():@Name" }, { 0x2B13, "PrGetNetworkName():@Name" }, { 0x3013, "PrDevIsItSafe():safeFlag" }, { 0x3113, "GetZoneList [obsolete?]" },
+ { 0x3213, "GetMyZone [obsolete?]" }, { 0x3313, "GetPrinterList [obsolete?]" }, { 0x3413, "PMUnloadDriver(whichDriver)" }, { 0x3513, "PMLoadDriver(whichDriver)" },
+ { 0x3613, "PrGetDocName():@pStr" }, { 0x3713, "PrSetDocName(@pStr)" }, { 0x3813, "PrGetPgOrientation(PrRecH):Orientation" }, { 0x0114, "LEBootInit()" },
+ { 0x0214, "LEStartUp(MemID,DirPg)" }, { 0x0314, "LEShutDown()" }, { 0x0414, "LEVersion():Vers" }, { 0x0514, "LEReset()" }, { 0x0614, "LEStatus():ActFlg" },
+ { 0x0914, "LENew(@DstRect,@ViewRect,MaxL):leH" }, { 0x0A14, "LEDispose(leH)" }, { 0x0B14, "LESetText(@Text,Len,leH)" }, { 0x0C14, "LEIdle(leH)" },
+ { 0x0D14, "LEClick(@EvRec,leH)" }, { 0x0E14, "LESetSelect(Start,End,leH)" }, { 0x0F14, "LEActivate(leH)" }, { 0x1014, "LEDeactivate(leH)" }, { 0x1114, "LEKey(Key,Mods,leH)" },
+ { 0x1214, "LECut(leH)" }, { 0x1314, "LECopy(leH)" }, { 0x1414, "LEPaste(leH)" }, { 0x1514, "LEDelete(leH)" },{ 0x1614, "LEInsert(@Text,Len,leH)" },
+ { 0x1714, "LEUpdate(leH)" }, { 0x1814, "LETextBox(@Text,Len,@Rect,Just)" }, { 0x1914, "LEFromScrap()" }, { 0x1A14, "LEToScrap()" }, { 0x1B14, "LEScrapHandle():ScrapH" },
+ { 0x1C14, "LEGetScrapLen():Len" }, { 0x1D14, "LESetScrapLen(NewL)" }, { 0x1E14, "LESetHilite(@HiliteProc,leH)" }, { 0x1F14, "LESetCaret(@CaretProc,leH)" },
+ { 0x2014, "LETextBox2(@Text,Len,@Rect,Just)" }, { 0x2114, "LESetJust(Just,leH)" }, { 0x2214, "LEGetTextHand(leH):TextH" }, { 0x2314, "LEGetTextLen(leH):TxtLen" },
+ { 0x2414, "GetLEDefProc():@proc" }, { 0x2514, "LEClassifyKey(@Event):Flag" }, { 0x0115, "DialogBootInit()" }, { 0x0215, "DialogStartUp(MemID)" }, { 0x0315, "DialogShutDown()" },
+ { 0x0415, "DialogVersion():Vers" }, { 0x0515, "DialogReset()" }, { 0x0615, "DialogStatus():ActFlg" }, { 0x0915, "ErrorSound(@SoundProc)" }, { 0x0A15, "NewModalDialog(@bR,vis,refcon/4):@Dlog" },
+ { 0x0B15, "NewModelessDialog(@R,@T,@b,fr,rf/4,@zR):@D" }, { 0x0C15, "CloseDialog(@Dlog)" }, { 0x0D15, "NewDItem(@Dlog,dItem,@R,ty,Des/4,V,F,@Col)" },
+ { 0x0E15, "RemoveDItem(@Dlog,dItem)" }, { 0x0F15, "ModalDialog(@FilterProc):Hit" }, { 0x1015, "IsDialogEvent(@EvRec):Flag" },{ 0x1115, "DialogSelect(@EvRec,@Dlog,@Hit):Flag" },
+ { 0x1215, "DlgCut(@Dlog)" }, { 0x1315, "DlgCopy(@Dlog)" }, { 0x1415, "DlgPaste(@Dlog)" }, { 0x1515, "DlgDelete(@Dlog)" }, { 0x1615, "DrawDialog(@Dlog)" },
+ { 0x1715, "Alert(@AlertTmpl,@FiltProc):Hit" }, { 0x1815, "StopAlert(@AlertTmpl,@FiltProc):Hit" }, { 0x1915, "NoteAlert(@AlertTmpl,@FiltProc):Hit" },
+ { 0x1A15, "CautionAlert(@AlertTmpl,@FiltProc):Hit" }, { 0x1B15, "ParamText(@P0,@P1,@P2,@P3)" }, { 0x1C15, "SetDAFont(FontH)" }, { 0x1E15, "GetControlDItem(@Dlog,dItem):CtrlH" },
+ { 0x1F15, "GetIText(@Dlog,dItem,@Str)" }, { 0x2015, "SetIText(@Dlog,dItem,@Str)" }, { 0x2115, "SelectIText(@Dlog,dItem,start,end)" }, { 0x2215, "HideDItem(@Dlog,dItem)" },
+ { 0x2315, "ShowDItem(@Dlog,dItem)" }, { 0x2415, "FindDItem(@Dlog,Point/4):Hit" }, { 0x2515, "UpdateDialog(@Dlog,UpdtRgnH)" }, { 0x2615, "GetDItemType(@Dlog,dItem):type" },
+ { 0x2715, "SetDItemType(type,@Dlog,dItem)" }, { 0x2815, "GetDItemBox(@Dlog,dItem,@Rect)" }, { 0x2915, "SetDItemBox(@Dlog,dItem,@Rect)" },
+ { 0x2A15, "GetFirstDItem(@Dlog):dItem" }, { 0x2B15, "GetNextDItem(@Dlog,dItem):dItem" }, { 0x2C15, "ModalDialog2(@FilterProc):HitInfo/4" },{ 0x2E15, "GetDItemValue(@Dlog,dItem):Val" },
+ { 0x2F15, "SetDItemValue(val,@Dlog,dItem)" }, { 0x3215, "GetNewModalDialog(@DlogTmpl):@Dlog" }, { 0x3315, "GetNewDItem(@Dlog,@ItemTmpl)" },{ 0x3415, "GetAlertStage():Stage" },
+ { 0x3515, "ResetAlertStage()" }, { 0x3615, "DefaultFilter(@Dlog,@EvRec,@Hit):Flag" }, { 0x3715, "GetDefButton(@Dlog):dItem" }, { 0x3815, "SetDefButton(BtnID,@Dlog)" },
+ { 0x3915, "DisableDItem(@Dlog,dItem)" }, { 0x3A15, "EnableDItem(@Dlog,dItem)" }, { 0x0116, "ScrapBootInit()" }, { 0x0216, "ScrapStartUp()" }, { 0x0316, "ScrapShutDown()" },
+ { 0x0416, "ScrapVersion():Vers" }, { 0x0516, "ScrapReset()" }, { 0x0616, "ScrapStatus():ActFlg" }, { 0x0916, "UnloadScrap()" }, { 0x0A16, "LoadScrap()" },
+ { 0x0B16, "ZeroScrap()" }, { 0x0C16, "PutScrap(Count/4,Type,@Src)" }, { 0x0D16, "GetScrap(DestH,Type)" }, { 0x0E16, "GetScrapHandle(Type):ScrapH" },
+ { 0x0F16, "GetScrapSize(Type):Size/4" },{ 0x1016, "GetScrapPath():@Pathname" }, { 0x1116, "SetScrapPath(@Pathname)" }, { 0x1216, "GetScrapCount():Count" },
+ { 0x1316, "GetScrapState():State" }, { 0x1416, "GetIndScrap(Index,@buffer)" }, { 0x1516, "ShowClipboard(flags,@rect):@Wind" }, { 0x0117, "SFBootInit()" },
+ { 0x0217, "SFStartUp(MemID,DirPg)" }, { 0x0317, "SFShutDown()" }, { 0x0417, "SFVersion():Vers" }, { 0x0517, "SFReset()" },{ 0x0617, "SFStatus():ActFlg" },
+ { 0x0917, "SFGetFile(X,Y,@Prmpt,@FPrc,@tL,@Reply)" }, { 0x0A17, "SFPutFile(X,Y,@Prompt,@DfltName,mxL,@Reply)" },{ 0x0B17, "SFPGetFile(X,Y,@P,@FPrc,@tL,@dTmp,@dHk,@Rp)" },
+ { 0x0C17, "SFPPutFile(X,Y,@P,@Df,mxL,@dTmpl,@dHk,@Rply)" }, { 0x0D17, "SFAllCaps(Flag)" },{ 0x0E17, "SFGetFile2(X,Y,prDesc,prRef/4,@fProc,@tList,@rep)" },
+ { 0x0F17, "SFPutFile2(X,Y,prDesc,prRef/4,nmDesc,nmRef/4,@rep)" }, { 0x1017, "SFPGetFile2(X,Y,@draw,prD,prRf/4,@fP,@tL,@d,@hk,@rep)" }, { 0x1117, "SFPPutFile2(X,Y,@draw,prD,prRf/4,nmD,nmRf/4,@d,@hk,@rep)" },
+ { 0x1217, "SFShowInvisible(InvisState):OldState" }, { 0x1317, "SFReScan(@filterProc,@typeList)" }, { 0x1417, "SFMultiGet2(X,Y,prDesc,prRef/4,@fP,@tL,@rep)" },
+ { 0x1517, "SFPMultiGet2(X,Y,@draw,prD,prRf/4,@fP,@tL,@d,@hk,@rep)" }, { 0x0119, "NSBootInit()" }, { 0x0219, "NSStartUp(Rate,@UpdProc)" }, { 0x0319, "NSShutDown()" },
+ { 0x0419, "NSVersion():Vers" }, { 0x0519, "NSReset()" }, { 0x0619, "NSStatus():ActFlg" }, { 0x0919, "AllocGen(Priority):Gen#" }, { 0x0A19, "DeallocGen(Gen#)" },
+ { 0x0B19, "NoteOn(Gen#,Semitone,Vol,@Instr)" }, { 0x0C19, "NoteOff(Gen#,Semitone)" }, { 0x0D19, "AllNotesOff()" }, { 0x0E19, "NSSetUpdateRate(NewRate):OldRate" },
+ { 0x0F19, "NSSetUserUpdateRtn(@New):@Old" }, { 0x011A, "SeqBootInit()" }, { 0x021A, "SeqStartUp(DirPg,Mode,Rate,Incr)" }, { 0x031A, "SeqShutDown()" },
+ { 0x041A, "SeqVersion():Vers" }, { 0x051A, "SeqReset()" }, { 0x061A, "SeqStatus():ActFlg" }, { 0x091A, "SetIncr(Increment)" }, { 0x0A1A, "ClearIncr():OldIncr" },
+ { 0x0B1A, "GetTimer():Tick" }, { 0x0C1A, "GetLoc():Phrase,Patt,Level" }, { 0x0D1A, "SeqAllNotesOff()" }, { 0x0E1A, "SetTrkInfo(Priority,InstIndex,TrkNum)" },
+ { 0x0F1A, "StartSeq(@ErrRtn,@CompRtn,SeqH)" }, { 0x101A, "StepSeq()" }, { 0x111A, "StopSeq(NextFlag)" }, { 0x121A, "SetInstTable(TableH)" }, { 0x131A, "StartInts()" },
+ { 0x141A, "StopInts()" }, { 0x151A, "StartSeqRel(@errHndlr,@CompRtn,SeqH)" }, { 0x011B, "FMBootInit()" }, { 0x021B, "FMStartUp(MemID,DirPg)" }, { 0x031B, "FMShutDown()" },
+ { 0x041B, "FMVersion():Vers" }, { 0x051B, "FMReset()" }, { 0x061B, "FMStatus():ActFlg" }, { 0x091B, "CountFamilies(FamSpecs):Count" }, { 0x0A1B, "FindFamily(Specs,Pos,@Name):FamNum" },
+ { 0x0B1B, "GetFamInfo(FamNum,@Name):FamStats" }, { 0x0C1B, "GetFamNum(@Name):FamNum" }, { 0x0D1B, "AddFamily(FamNum,@Name)" }, { 0x0E1B, "InstallFont(ID/4,Scale)" },
+ { 0x0F1B, "SetPurgeStat(FontID/4,PrgStat)" }, { 0x101B, "CountFonts(ID/4,Specs):N" }, { 0x111B, "FindFontStats(ID/4,Specs,Pos,@FStatRec)" }, { 0x121B, "LoadFont(ID/4,Specs,Pos,@FStatRec)" },
+ { 0x131B, "LoadSysFont()" }, { 0x141B, "AddFontVar(FontH,NewSpecs)" }, { 0x151B, "FixFontMenu(MenuID,StartID,FamSpecs)" }, { 0x161B, "ChooseFont(CurrID/4,Famspecs):NewID/4" },
+ { 0x171B, "ItemID2FamNum(ItemID):FamNum" }, { 0x181B, "FMSetSysFont(FontID/4)" }, { 0x191B, "FMGetSysFID():SysID/4" }, { 0x1A1B, "FMGetCurFID():CurID/4" },
+ { 0x1B1B, "FamNum2ItemID(FamNum):ItemID" }, { 0x1C1B, "InstallWithStats(ID/4,Scale,@ResultRec)" }, { 0x011C, "ListBootInit()" }, { 0x021C, "ListStartUp()" }, { 0x031C, "ListShutDown()" },
+ { 0x041C, "ListVersion():Vers" }, { 0x051C, "ListReset()" }, { 0x061C, "ListStatus():ActFlg" }, { 0x091C, "CreateList(@Wind,@ListRec):CtrlH" }, { 0x0A1C, "SortList(@CompareProc,@ListRec)" },
+ { 0x0B1C, "NextMember(@Member,@ListRec):@NxtMemVal" }, { 0x0C1C, "DrawMember(@Member,@ListRec)" }, { 0x0D1C, "SelectMember(@Member,@ListRec)" }, { 0x0E1C, "GetListDefProc():@Proc" },
+ { 0x0F1C, "ResetMember(@ListRec):NxtMemVal/4" }, { 0x101C, "NewList(@Member,@ListRec)" }, { 0x111C, "DrawMember2(itemNum,CtrlH)" }, { 0x121C, "NextMember2(itemNum,CtrlH):itemNum" },
+ { 0x131C, "ResetMember2(CtrlH):itemNum" }, { 0x141C, "SelectMember2(itemNum,CtrlH)" }, { 0x151C, "SortList2(@CompareProc,CtrlH)" }, { 0x161C, "NewList2(@draw,start,ref/4,refKind,size,CtrlH)" },
+ { 0x171C, "ListKey(flags,@EventRec,CtrlH)" }, { 0x181C, "CompareStrings(flags,@String1,@String2):Order" }, { 0x011D, "ACEBootInit()" }, { 0x021D, "ACEStartUp(DirPg)" },
+ { 0x031D, "ACEShutDown()" }, { 0x041D, "ACEVersion():Vers" }, { 0x051D, "ACEReset()" }, { 0x061D, "ACEStatus():ActFlg" }, { 0x071D, "ACEInfo(Code):Value/4" },
+ { 0x091D, "ACECompress(SrcH,SrcOff/4,DestH,DestOff/4,Blks,Method)" }, { 0x0A1D, "ACEExpand(SrcH,SrcOff/4,DestH,DestOff/4,Blks,Method)" }, { 0x0B1D, "ACECompBegin()" },
+ { 0x0C1D, "ACEExpBegin()" }, { 0x0D1D, "GetACEExpState(@Buffer)" }, { 0x0E1D, "SetACEExpState(@Buffer)" }, { 0x011E, "ResourceBootInit()" }, { 0x021E, "ResourceStartUp(MemID)" },
+ { 0x031E, "ResourceShutDown()" }, { 0x041E, "ResourceVersion():Vers" }, { 0x051E, "ResourceReset()" }, { 0x061E, "ResourceStatus():ActFlag" }, { 0x091E, "CreateResourceFile(aux/4,fType,Access,@n)" },
+ { 0x0A1E, "OpenResourceFile(reqAcc,@mapAddr,@n):fileID" }, { 0x0B1E, "CloseResourceFile(fileID)" }, { 0x0C1E, "AddResource(H,Attr,rType,rID/4)" }, { 0x0D1E, "UpdateResourcefile(fileID)" },
+ { 0x0E1E, "LoadResource(rType,rID/4):H" }, { 0x0F1E, "RemoveResource(rType,rID/4)" }, { 0x101E, "MarkResourceChange(changeFlag,rType,rID/4)" }, { 0x111E, "SetCurResourceFile(fileID)" },
+ { 0x121E, "GetCurResourceFile():fileID" }, { 0x131E, "SetCurResourceApp(MemID)" }, { 0x141E, "GetCurResourceApp():MemID" }, { 0x151E, "HomeResourceFile(rType,rID/4):fileID" },
+ { 0x161E, "WriteResource(rType,rID/4)" }, { 0x171E, "ReleaseResource(PurgeLevel,rType,rID/4)" }, { 0x181E, "DetachResource(rType,rID/4)" }, { 0x191E, "UniqueResourceID(IDrange,rType):rID/4" },
+ { 0x1A1E, "SetResourceID(newID/4,rType,oldID/4)" }, { 0x1B1E, "GetResourceAttr(rType,rID/4):Attr" }, { 0x1C1E, "SetResourceAttr(rAttr,rType,rID/4)" }, { 0x1D1E, "GetResourceSize(rType,rID/4):Size/4" },
+ { 0x1E1E, "MatchResourceHandle(@buffer,H)" }, { 0x1F1E, "GetOpenFileRefNum(fileID):RefNum" }, { 0x201E, "CountTypes():Num" }, { 0x211E, "GetIndType(tIndex):rType" },
+ { 0x221E, "CountResources(rType):Num/4" }, { 0x231E, "GetIndResource(rType,rIndex/4):rID/4" }, { 0x241E, "SetResourceLoad(Flag):oldFlag" }, { 0x251E, "SetResourceFileDepth(Depth):oldDepth" },
+ { 0x261E, "GetMapHandle(fileID):MapH" }, { 0x271E, "LoadAbsResource(@loc,MaxSize/4,rType,rID/4):Size/4" }, { 0x281E, "ResourceConverter(@proc,rType,logFlags)" },
+ { 0x291E, "LoadResource2(flag,@AttrBuff,rType,rID/4):H" }, { 0x2A1E, "RMFindNamedResource(rType,@name,@fileID):rID/4" },{ 0x2B1E, "RMGetResourceName(rType,rID/4,@nameBuffer)" },
+ { 0x2C1E, "RMLoadNamedResource(rType,@name):H" }, { 0x2D1E, "RMSetResourceName(rType,rID/4,@name)" }, { 0x2E1E, "OpenResourceFileByID(reqAcc,userID):oldResApp" },
+ { 0x2F1E, "CompactResourceFile(flags,fileID)" }, { 0x0120, "MidiBootInit()" }, { 0x0220, "MidiStartUp(MemID,DirPg)" }, { 0x0320, "MidiShutDown()" },
+ { 0x0420, "MidiVersion():Vers" }, { 0x0520, "MidiReset()" }, { 0x0620, "MidiStatus():ActFlg" }, { 0x0920, "MidiControl(Function,Argument/4)" }, { 0x0A20, "MidiDevice(Function,@DriverInfo)" },
+ { 0x0B20, "MidiClock(Function,Argument/4)" }, { 0x0C20, "MidiInfo(Function):Info/4" }, { 0x0D20, "MidiReadPacket(@buff,size):Count" }, { 0x0E20, "MidiWritePacket(@buff):Count" },
+ { 0x0121, "VDBootInit()" }, { 0x0221, "VDStartUp()" }, { 0x0321, "VDShutDown()" }, { 0x0421, "VDVersion():Vers" }, { 0x0521, "VDReset()" }, { 0x0621, "VDStatus():ActFlg" },
+ { 0x0921, "VDInStatus(Selector):Status" }, { 0x0A21, "VDInSetStd(InStandard)" }, { 0x0B21, "VDInGetStd():InStandard" }, { 0x0C21, "VDInConvAdj(Selector,AdjFunction)" },
+ { 0x0D21, "VDKeyControl(Selector,KeyerCtrlVal)" }, { 0x0E21, "VDKeyStatus(Selector):KeyerStatus" }, { 0x0F21, "VDKeySetKCol(Red,Green,Blue)" }, { 0x1021, "VDKeyGetKRCol():RedValue" },
+ { 0x1121, "VDKeyGetKGCol():GreenValue" }, { 0x1221, "VDKeyGetKBCol():BlueValue" }, { 0x1321, "VDKeySetKDiss(KDissolve)" }, { 0x1421, "VDKeyGetKDiss():KDissolve" },
+ { 0x1521, "VDKeySetNKDiss(NKDissolve)" }, { 0x1621, "VDKeyGetNKDiss():NKDissolve" }, { 0x1721, "VDOutSetStd(OutStandard)" }, { 0x1821, "VDOutGetStd():OutStandard" },
+ { 0x1921, "VDOutControl(Selector,Value)" }, { 0x1A21, "VDOutStatus(Selector):OutStatus" }, { 0x1B21, "VDGetFeatures(Feature):Info" }, { 0x1C21, "VDInControl(Selector,Value)" },
+ { 0x1D21, "VDGGControl(Selector,Value)" }, { 0x1E21, "VDGGStatus(Selector):Value" }, { 0x0122, "TEBootInit()" }, { 0x0222, "TEStartUp(MemID,DirPg)" },
+ { 0x0322, "TEShutDown()" }, { 0x0422, "TEVersion():Vers" }, { 0x0522, "TEReset()" }, { 0x0622, "TEStatus():ActFlg" }, { 0x0922, "TENew(@parms):teH" },
+ { 0x0A22, "TEKill(teH)" }, { 0x0B22, "TESetText(tDesc,tRef/4,Len/4,stDesc,stRef/4,teH)" }, { 0x0C22, "TEGetText(bDesc,bRef/4,bLen/4,stDesc,stRef/4,teH):L/4" },
+ { 0x0D22, "TEGetTextInfo(@infoRec,parmCount,teH)" }, { 0x0E22, "TEIdle(teH)" }, { 0x0F22, "TEActivate(teH)" }, { 0x1022, "TEDeactivate(teH)" }, { 0x1122, "TEClick(@eventRec,teH)" },
+ { 0x1222, "TEUpdate(teH)" }, { 0x1322, "TEPaintText(@Port,startLn/4,@R,Flags,teH):NextLn/4" }, { 0x1422, "TEKey(@eventRec,teH)" }, { 0x1522, "[not supported]" },
+ { 0x1622, "TECut(teH)" }, { 0x1722, "TECopy(teH)" }, { 0x1822, "TEPaste(teH)" }, { 0x1922, "TEClear(teH)" }, { 0x1A22, "TEInsert(tDesc,tRef/4,tLen/4,stDesc,stRef/4,teH)" },{ 0x1B22, "TEReplace(tDesc,tRef/4,tLen/4,stDesc,stRef/4,teH)" },
+ { 0x1C22, "TEGetSelection(@selStart,@selEnd,teH)" }, { 0x1D22, "TESetSelection(selStart/4,selEnd/4,teH)" }, { 0x1E22, "TEGetSelectionStyle(@stRec,stH,teH):comFlag" }, { 0x1F22, "TEStyleChange(flags,@stRec,teH)" },
+ { 0x2022, "TEOffsetToPoint(offset/4,@vertPos,@horPos,teH)" }, { 0x2122, "TEPointToOffset(vertPos/4,horPos/4,teH):textOffset/4" }, { 0x2222, "TEGetDefProc():@defProc" },
+ { 0x2322, "TEGetRuler(rulerDesc,rulerRef/4,teH)" }, { 0x2422, "TESetRuler(rulerDesc,rulerRef/4,teH)" }, { 0x2522, "TEScroll(scrDesc,vertAmt/4,horAmt/4,teH):Offset/4" },
+ { 0x2622, "TEGetInternalProc():@proc" }, { 0x2722, "TEGetLastError(clearFlag,teH):lastError" }, { 0x2822, "TECompactRecord(teH)" }, { 0x0123, "MSBootInit()" },
+ { 0x0223, "MSStartUp()" }, { 0x0323, "MSShutDown()" }, { 0x0423, "MSVersion():Vers" }, { 0x0523, "MSReset()" }, { 0x0623, "MSStatus():ActFlg" },{ 0x0923, "SetBasicChannel(Channel)" },
+ { 0x0A23, "SetMIDIMode(Mode)" }, { 0x0B23, "PlayNote(Channel,NoteNum,KeyVel)" }, { 0x0C23, "StopNote(Channel,NoteNum)" }, { 0x0D23, "KillAllNotes()" },
+ { 0x0E23, "SetRecTrack(TrackNum)" }, { 0x0F23, "SetPlayTrack(TrackNum,State)" }, { 0x1023, "TrackToChannel(TrackNum,ChannelNum)" }, { 0x1123, "Locate(TimeStamp/4,@SeqBuff):@SeqItem" },
+ { 0x1223, "SetVelComp(VelocityOffset)" }, { 0x1323, "SetMIDIPort(EnabInput,EnabOutput)" }, { 0x1423, "SetInstrument(@InstRec,InstNum)" }, { 0x1523, "SeqPlayer(@SeqPlayerRec)" },
+ { 0x1623, "SetTempo(Tempo)" }, { 0x1723, "SetCallBack(@CallBackRec)" }, { 0x1823, "SysExOut(@Msg,Delay,@MonRoutine)" }, { 0x1923, "SetBeat(BeatDuration)" },
+ { 0x1A23, "MIDIMessage(Dest,nBytes,Message,Byte1,Byte2)" }, { 0x1B23, "LocateEnd(@seqBuffer):@End" }, { 0x1C23, "Merge(@Buffer1,@Buffer2)" }, { 0x1D23, "DeleteTrack(TrackNum,@Seq)" },
+ { 0x1E23, "SetMetro(Volume,Freq,@Wave)" }, { 0x1F23, "GetMSData():Reserved/4,@DirPage" }, { 0x2023, "ConvertToTime(TkPerBt,BtPerMsr,BeatNum,MsrNum):Ticks/4" }, { 0x2123, "ConvertToMeasure(TkPerBt,BtPerMsr,Ticks/4):Ticks,Beat,Msr" },
+ { 0x2223, "MSSuspend()" }, { 0x2323, "MSResume()" }, { 0x2423, "SetTuningTable(@Table)" }, { 0x2523, "GetTuningTable(@Buffer)" }, { 0x2623, "SetTrackOut(TrackNum,PathVal)" },
+ { 0x2723, "InitMIDIDriver(Slot,Internal,UserID,@Driver)" }, { 0x2823, "RemoveMIDIDriver()" }, { 0x0126, "MCBootInit()" }, { 0x0226, "MCStartUp(MemID)" }, { 0x0326, "MCShutDown()" },
+ { 0x0426, "MCVersion():Vers" }, { 0x0526, "MCReset()" }, { 0x0626, "MCStatus():ActFlg" }, { 0x0926, "MCGetErrorMsg(mcErrorNo,@PStringBuff)" }, { 0x0A26, "MCLoadDriver(mcChannelNo)" },
+ { 0x0B26, "MCUnLoadDriver(mcChannelNo)" }, { 0x0C26, "MCTimeToBin(mcTimeValue/4):result/4" }, { 0x0D26, "MCBinToTime(mcBinVal/4):result/4" }, { 0x0E26, "MCGetTrackTitle(mcDiskID/4,mcTrackNo,@PStringBuff)" },
+ { 0x0F26, "MCSetTrackTitle(mcDiskID/4,TrackNum,@title)" }, { 0x1026, "MCGetProgram(mcDiskID/4,@resultBuff)" }, { 0x1126, "MCSetProgram(mcDiskID/4,@mcProg)" },
+ { 0x1226, "MCGetDiscTitle(mcDiskID/4,@PStringBuff)" }, { 0x1326, "MCSetDiscTitle(mcDiskID/4,@title)" }, { 0x1426, "MCDStartUp(mcChannelNo,@portName,userID)" },
+ { 0x1526, "MCDShutDown(mcChannelNo)" }, { 0x1626, "MCGetFeatures(mcChannelNo,mcFeatSel):result/4" }, { 0x1726, "MCPlay(mcChannelNo)" }, { 0x1826, "MCPause(mcChannelNo)" },
+ { 0x1926, "MCSendRawData(mcChannelNo,@mcNative)" }, { 0x1A26, "MCGetStatus(mcChannelNo,mcStatusSel):result" }, { 0x1B26, "MCControl(mcChannelNo,ctlCommand)" },
+ { 0x1C26, "MCScan(mcChannelNo,mcDirection)" }, { 0x1D26, "MCGetSpeeds(mcChannelNo,@PStringBuff)" }, { 0x1E26, "MCSpeed(mcChannelNo,mcFPS)" },
+ { 0x1F26, "MCStopAt(mcChannelNo,mcUnitType,mcStopLoc/4)" }, { 0x2026, "MCJog(mcChannelNo,mcUnitType,mcNJog/4,mcJogRepeat)" }, { 0x2126, "MCSearchTo(mcChannelNo,mcUnitType,searchLoc/4)" },
+ { 0x2226, "MCSearchDone(mcChannelNo):result" }, { 0x2326, "MCSearchWait(mcChannelNo)" }, { 0x2426, "MCGetPosition(mcChannelNo,mcUnitType):result/4" },{ 0x2526, "MCSetAudio(mcChannelNo,mcAudioCtl)" },
+ { 0x2626, "MCGetTimes(mcChannelNo,mctimesSel):result/4" }, { 0x2726, "MCGetDiscTOC(mcChannelNo,mcTrackNo):result/4" }, { 0x2826, "MCGetDiscID(mcChannelNo):result/4" },
+ { 0x2926, "MCGetNoTracks(mcChannelNo):result" }, { 0x2A26, "MCRecord(mcChannelNo)" }, { 0x2B26, "MCStop(mcChannelNo)" }, { 0x2C26, "MCWaitRawData(mcChannelNo,@result,tickWait,termMask)" },
+ { 0x2D26, "MCGetName(mcChannelNo,@PStringBuff)" }, { 0x2E26, "MCSetVolume(mcChannelNo,mcLeftVol,mcRightVol)" }, { 0x0136, "TCPIPBootInit()" }, { 0x0236, "TCPIPStartUp()" },
+ { 0x0336, "TCPIPShutDown()" }, { 0x0436, "TCPIPVersion():Vers" }, { 0x0536, "TCPIPReset()" }, { 0x0636, "TCPIPStatus():ActFlg" }, { 0x0836, "TCPIPLongVersion():rVersion/4" },
+ { 0x0936, "TCPIPGetConnectStatus():connectedFlag" }, { 0x0A36, "TCPIPGetErrorTable():@errTablePtr" },{ 0x0B36, "TCPIPGetReconnectStatus():reconnectFlag" },{ 0x0C36, "TCPIPReconnect(@displayPtr)" },
+ { 0x0D36, "TCPIPConvertIPToHex(@cvtRecPtr,@ddippstring)" }, { 0x0E36, "TCPIPConvertIPToASCII(ipaddress/4,@ddpstring,flags):strlen" }, { 0x0F36, "TCPIPGetMyIPAddress():ipaddress/4" },
+ { 0x1036, "TCPIPGetConnectMethod():method" }, { 0x1136, "TCPIPSetConnectMethod(method)" }, { 0x1236, "TCPIPConnect(@displayPtr)" }, { 0x1336, "TCPIPDisconnect(forceflag,@displayPtr)" },
+ { 0x1436, "TCPIPGetMTU():mtu" }, { 0x1536, "TCPIPValidateIPCString(@cstringPtr):validFlag" }, { 0x1636, "TCPIPGetConnectData(userid,method):H" }, { 0x1736, "TCPIPSetConnectData(method,H)" },
+ { 0x1836, "TCPIPGetDisconnectData(userid,method):H" }, { 0x1936, "TCPIPSetDisconnectData(method,H)" }, { 0x1A36, "TCPIPLoadPreferences()" }, { 0x1B36, "TCPIPSavePreferences()" },
+ { 0x1C36, "TCPIPGetDNS(@DNSRecPtr)" }, { 0x1D36, "TCPIPSetDNS(@DNSRecPtr)" }, { 0x1E36, "TCPIPGetTuningTable(@tunePtr)" }, { 0x1F36, "TCPIPSetTuningTable(@tunePtr)" },
+ { 0x2036, "TCPIPCancelDNR(@dnrBufferPtr)" }, { 0x2136, "TCPIPDNRNameToIP(@nameptr,@dnrBufferPtr)" }, { 0x2236, "TCPIPPoll()" }, { 0x2336, "TCPIPLogin(userid,destip/4,destport,defaultTOS,defaultTTL):ipid" },
+ { 0x2436, "TCPIPLogout(ipid)" }, { 0x2536, "TCPIPSendICMP(ipid,@messagePtr,messageLen)" }, { 0x2636, "TCPIPSendUDP(ipid,@udpPtr,udpLen)" }, { 0x2736, "TCPIPGetDatagramCount(ipid,protocol):dgmCount" },
+ { 0x2836, "TCPIPGetNextDatagram(ipid,protocol,flags):H" }, { 0x2936, "TCPIPGetLoginCount():loginCount" }, { 0x2A36, "TCPIPSendICMPEcho(ipid,seqNum)" },
+ { 0x2B36, "TCPIPReceiveICMPEcho(ipid):seqNum" }, { 0x2C36, "TCPIPOpenTCP(ipid):tcpError" }, { 0x2D36, "TCPIPWriteTCP(ipid,@dataPtr,dataLength/4,pushFlag,urgentFlag):tcpError" },
+ { 0x2E36, "TCPIPReadTCP(ipid,buffType,buffData/4,buffLen/4,@rrBuffPtr):tcpError" }, { 0x2F36, "TCPIPCloseTCP(ipid):tcpError" }, { 0x3036, "TCPIPAbortTCP(ipid):tcpError" },
+ { 0x3136, "TCPIPStatusTCP(ipid,@srBuffPtr):tcpError" }, { 0x3236, "TCPIPGetSourcePort(ipid):sourcePort" }, { 0x3336, "TCPIPGetTOS(ipid):TOS" }, { 0x3436, "TCPIPSetTOS(ipid,TOS)" },
+ { 0x3536, "TCPIPGetTTL(ipid):TTL" }, { 0x3636, "TCPIPSetTTL(ipid,TTL)" }, { 0x3736, "TCPIPSetSourcePort(ipid,sourcePort)" }, { 0x3836, "TCPIPSetMyIPAddress(ipaddress/4)" },
+ { 0x3936, "TCPIPGetDP():dp" }, { 0x3A36, "TCPIPGetDebugHex():debugFlag" }, { 0x3B36, "TCPIPDebugHex(debugFlag)" }, { 0x3C36, "TCPIPGetDebugTCP():debugFlag" },
+ { 0x3D36, "TCPIPDebugTCP(debugFlag)" }, { 0x3E36, "TCPIPGetUserRecord(ipid):userRecEntry/4" }, { 0x3F36, "TCPIPConvertIPCToHex(@cvtRecPtr,@ddipcstring)" },
+ { 0x4036, "TCPIPSendIPDatagram(@datagramPtr)" }, { 0x4136, "TCPIPConvertIPToClass(ipaddress/4):class" }, { 0x4236, "TCPIPGetConnectMsgFlag():conMsgFlag" },
+ { 0x4336, "TCPIPSetConnectMsgFlag(conMsgFlag)" }, { 0x4436, "TCPIPGetUsername(@unBuffPtr)" }, { 0x4536, "TCPIPSetUsername(@usernamePtr)" }, { 0x4636, "TCPIPGetPassword(@pwBuffPtr)" },
+ { 0x4736, "TCPIPSetPassword(@passwordPtr)" }, { 0x4836, "TCPIPValidateIPString(@pstringPtr):validFlag" }, { 0x4936, "TCPIPGetUserStatistic(ipid,statisticNum):statistic/4" },{ 0x4A36, "TCPIPGetLinkVariables():@variablesPtr" },
+ { 0x4B36, "TCPIPEditLinkConfig(connectHandle/4,disconnectHandle/4)" }, { 0x4C36, "TCPIPGetModuleNames():@moduleListPtr" }, { 0x4D36, "TCPIPRebuildModuleList()" },
+ { 0x4E36, "TCPIPListenTCP(ipid):tcpError" }, { 0x4F36, "TCPIPAcceptTCP(ipid,reserved):newipid" }, { 0x5036, "TCPIPSetNewDestination(ipid,destip/4,destport)" },{ 0x5136, "TCPIPGetHostName(@hnBuffPtr)" },
+ { 0x5236, "TCPIPSetHostName(@hostNamePtr)" }, { 0x5336, "TCPIPStatusUDP(ipid,@udpVarsPtr)" }, { 0x5436, "TCPIPGetLinkLayer(@linkInfoBlkPtr)" }, { 0x5536, "TCPIPPtrToPtr(@from,@to,len/4)" },
+ { 0x5636, "TCPIPPtrToPtrNeg(@fromend,@toend,len/4)" },{ 0x5736, "TCPIPGetAuthMessage(userid):authMsgHandle/4" },
+ { 0x5836, "TCPIPConvertIPToCASCII(ipaddress/4,@ddcstring,flags):strlen" },{ 0x5936, "TCPIPMangleDomainName(flags,@dnPstringPtr):port" },
+ { 0x5A36, "TCPIPGetAliveFlag():aliveFlag" },{ 0x5B36, "TCPIPSetAliveFlag(aliveFlag)" },{ 0x5C36, "TCPIPGetAliveMinutes():aliveMinutes" },
+ { 0x5D36, "TCPIPSetAliveMinutes(aliveMinutes)" },{ 0x5E36, "TCPIPReadLineTCP(ipid,@delimitStrPtr,buffType,buffData/4,buffLen/4,@rrBuffPtr):tcpError" },
+ { 0x5F36, "TCPIPGetBootConnectFlag():bootConnectFlag" }, { 0x6036, "TCPIPSetBootConnectFlag(bootConnectFlag)" }, { 0x6136, "TCPIPSetUDPDispatch(ipid,dispatchFlag)" },
+ { 0x6236, "TCPIPGetDestination(ipid,@destRecPtr)" }, { 0x6336, "TCPIPGetUserEventTrigger(triggerNumber,ipid):triggerProcPtr/4" }, { 0x6436, "TCPIPSetUserEventTrigger(triggerNumber,ipid,@triggerProcPtr)" },
+ { 0x6536, "TCPIPGetSysEventTrigger(triggerNumber):triggerProcPtr/4" }, { 0x6636, "TCPIPSetSysEventTrigger(triggerNumber,@triggerProcPtr)" }, { 0x6736, "TCPIPGetDNRTimeouts(@dnrTimeoutsBuffPtr)" },
+ { 0x6836, "TCPIPSetDNRTimeouts(@dnrTimeoutsBuffPtr)" },
+
+ { 0xffff, "" }
+};
+
+static const struct dasm_data32 gs_vectors[] =
+{
+ { 0xE10000, "System Tool dispatcher" }, { 0xE10004, "System Tool dispatcher, glue entry" }, { 0xE10008, "User Tool dispatcher" }, { 0xE1000C, "User Tool dispatcher, glue entry" },
+ { 0xE10010, "Interrupt mgr" }, { 0xE10014, "COP mgr" }, { 0xE10018, "Abort mgr" }, { 0xE1001C, "System Death mgr" }, { 0xE10020, "AppleTalk interrupt" },
+ { 0xE10024, "Serial interrupt" }, { 0xE10028, "Scanline interrupt" }, { 0xE1002C, "Sound interrupt" }, { 0xE10030, "VertBlank interrupt" }, { 0xE10034, "Mouse interrupt" },
+ { 0xE10038, "1/4 sec interrupt" }, { 0xE1003C, "Keyboard interrupt" }, { 0xE10040, "ADB Response byte int" }, { 0xE10044, "ADB SRQ int" }, { 0xE10048, "Desk Acc mgr" },
+ { 0xE1004C, "FlushBuffer handler" }, { 0xE10050, "KbdMicro interrupt" }, { 0xE10054, "1 sec interrupt" }, { 0xE10058, "External VGC int" }, { 0xE1005C, "other interrupt" },
+ { 0xE10060, "Cursor update" }, { 0xE10064, "IncBusy" }, { 0xE10068, "DecBusy" }, { 0xE1006C, "Bell vector" }, { 0xE10070, "Break vector" }, { 0xE10074, "Trace vector" },
+ { 0xE10078, "Step vector" }, { 0xE1007C, "[install ROMdisk]" }, { 0xE10080, "ToWriteBram" }, { 0xE10084, "ToReadBram" }, { 0xE10088, "ToWriteTime" },
+ { 0xE1008C, "ToReadTime" }, { 0xE10090, "ToCtrlPanel" }, { 0xE10094, "ToBramSetup" }, { 0xE10098, "ToPrintMsg8" }, { 0xE1009C, "ToPrintMsg16" }, { 0xE100A0, "Native Ctrl-Y" },
+ { 0xE100A4, "ToAltDispCDA" }, { 0xE100A8, "ProDOS 16 [inline parms]" }, { 0xE100AC, "OS vector" }, { 0xE100B0, "GS/OS(@parms,call) [stack parms]" },
+ { 0xE100B4, "OS_P8_Switch" }, { 0xE100B8, "OS_Public_Flags" }, { 0xE100BC, "OS_KIND (byte: 0=P8,1=P16)" }, { 0xE100BD, "OS_BOOT (byte)" }, { 0xE100BE, "OS_BUSY (bit 15=busy)" },
+ { 0xE100C0, "MsgPtr" }, { 0xe10135, "CURSOR" }, { 0xe10136, "NXTCUR" },
+ { 0xE10180, "ToBusyStrip" }, { 0xE10184, "ToStrip" }, { 0xe10198, "MDISPATCH" }, { 0xe1019c, "MAINSIDEPATCH" },
+ { 0xE101B2, "MidiInputPoll" }, { 0xE10200, "Memory Mover" }, { 0xE10204, "Set System Speed" },
+ { 0xE10208, "Slot Arbiter" }, { 0xE10220, "HyperCard IIgs callback" }, { 0xE10224, "WordForRTL" }, { 0xE11004, "ATLK: BASIC" }, { 0xE11008, "ATLK: Pascal" },
+ { 0xE1100C, "ATLK: RamGoComp" }, { 0xE11010, "ATLK: SoftReset" }, { 0xE11014, "ATLK: RamDispatch" }, { 0xE11018, "ATLK: RamForbid" }, { 0xE1101C, "ATLK: RamPermit" },
+ { 0xE11020, "ATLK: ProEntry" }, { 0xE11022, "ATLK: ProDOS" }, { 0xE11026, "ATLK: SerStatus" }, { 0xE1102A, "ATLK: SerWrite" }, { 0xE1102E, "ATLK: SerRead" },
+ { 0xE1103A, "ATLK: InitFileHook" }, { 0xE1103E, "ATLK: PFI Vector" }, { 0xE1D600, "ATLK: CmdTable" }, { 0xE1DA00, "ATLK: TickCount" },
+ { 0xE01D00, "BRegSave" }, { 0xE01D02, "IntStatus" }, { 0xE01D03, "SVStateReg" }, { 0xE01D04, "80ColSave" }, { 0xE01D05, "LoXClampSave" },
+ { 0xE01D07, "LoYClampSave" }, { 0xE01D09, "HiXClampSave" }, { 0xE01D0B, "HiYClampSave" }, { 0xE01D0D, "OutGlobals" }, { 0xE01D14, "Want40" },
+ { 0xE01D16, "CursorSave" }, { 0xE01D18, "NEWVIDSave" }, { 0xE01D1A, "TXTSave" }, { 0xE01D1B, "MIXSave" }, { 0xE01D1C, "PAGE2Save" },
+ { 0xE01D1D, "HIRESSave" }, { 0xE01D1E, "ALTCHARSave" }, { 0xE01D1F, "VID80Save" }, { 0xE01D20, "Int1AY" }, { 0xE01D2D, "Int1BY" },
+ { 0xE01D39, "Int2AY" }, { 0xE01D4C, "Int2BY" }, { 0xE01D61, "MOUSVBLSave" }, { 0xE01D63, "DirPgSave" }, { 0xE01D65, "C3ROMSave" },
+ { 0xE01D66, "Save4080" }, { 0xE01D67, "NumInts" }, { 0xE01D68, "MMode" }, { 0xE01D6A, "MyMSLOT" }, { 0xE01D6C, "Slot" },
+ { 0xE01D6E, "EntryCount" }, { 0xE01D70, "BottomLine" }, { 0xE01D72, "HPos" }, { 0xE01D74, "VPos" }, { 0xE01D76, "CurScreenLoc" },
+ { 0xE01D7C, "NumDAs" }, { 0xE01D7E, "LeftBorder" }, { 0xE01D80, "FirstMenuItem" }, { 0xE01D82, "IDNum" }, { 0xE01D84, "CDATabHndl" },
+ { 0xE01D88, "RoomLeft" }, { 0xE01D8A, "KeyInput" }, { 0xE01D8C, "EvntRec" }, { 0xE01D8E, "Message" }, { 0xE01D92, "When" },
+ { 0xE01D96, "Where" }, { 0xE01D9A, "Mods" }, { 0xE01D9C, "StackSave" }, { 0xE01D9E, "OldOutGlobals" }, { 0xE01DA2, "OldOutDevice" },
+ { 0xE01DA8, "CDataBPtr" }, { 0xE01DAC, "DAStrPtr" }, { 0xE01DB0, "CurCDA" }, { 0xE01DB2, "OldOutHook" }, { 0xE01DB4, "OldInDev" },
+ { 0xE01DBA, "OldInGlob" }, { 0xE01DBE, "RealDeskStat" }, { 0xE01DC0, "Next" }, { 0xE01DDE, "SchActive" }, { 0xE01DDF, "TaskQueue" },
+ { 0xE01DDF, "FirstTask" }, { 0xE01DE3, "SecondTask" }, { 0xE01DED, "Scheduler" }, { 0xE01DEF, "Offset" }, { 0xE01DFF, "Lastbyte" },
+ { 0xE01E04, "QD:StdText" }, { 0xE01E08, "QD:StdLine" }, { 0xE01E0C, "QD:StdRect" }, { 0xE01E10, "QD:StdRRect" }, { 0xE01E14, "QD:StdOval" }, { 0xE01E18, "QD:StdArc" }, { 0xE01E1C, "QD:StdPoly" },
+ { 0xE01E20, "QD:StdRgn" }, { 0xE01E24, "QD:StdPixels" }, { 0xE01E28, "QD:StdComment" }, { 0xE01E2C, "QD:StdTxMeas" }, { 0xE01E30, "QD:StdTxBnds" }, { 0xE01E34, "QD:StdGetPic" },
+ { 0xE01E38, "QD:StdPutPic" }, { 0xE01E98, "QD:ShieldCursor" }, { 0xE01E9C, "QD:UnShieldCursor" },
+ { 0x010100, "MNEMSTKPTR" }, { 0x010101, "ALEMSTKPTR" }, { 0x01FC00, "SysSrv:DEV_DISPATCHER" }, { 0x01FC04, "SysSrv:CACHE_FIND_BLK" }, { 0x01FC08, "SysSrv:CACHE_ADD_BLK" },
+ { 0x01FC0C, "SysSrv:CACHE_INIT" }, { 0x01FC10, "SysSrv:CACHE_SHUTDN" }, { 0x01FC14, "SysSrv:CACHE_DEL_BLK" }, { 0x01FC18, "SysSrv:CACHE_DEL_VOL" },
+ { 0x01FC1C, "SysSrv:ALLOC_SEG" }, { 0x01FC20, "SysSrv:RELEASE_SEG" }, { 0x01FC24, "SysSrv:ALLOC_VCR" }, { 0x01FC28, "SysSrv:RELEASE_VCR" },
+ { 0x01FC2C, "SysSrv:ALLOC_FCR" }, { 0x01FC30, "SysSrv:RELEASE_FCR" }, { 0x01FC34, "SysSrv:SWAP_OUT" }, { 0x01FC38, "SysSrv:DEREF" },
+ { 0x01FC3C, "SysSrv:GET_SYS_GBUF" }, { 0x01FC40, "SysSrv:SYS_EXIT" }, { 0x01FC44, "SysSrv:SYS_DEATH" }, { 0x01FC48, "SysSrv:FIND_VCR" },
+ { 0x01FC4C, "SysSrv:FIND_FCR" }, { 0x01FC50, "SysSrv:SET_SYS_SPEED" }, { 0x01FC54, "SysSrv:CACHE_FLSH_DEF" }, { 0x01FC58, "SysSrv:RENAME_VCR" },
+ { 0x01FC5C, "SysSrv:RENAME_FCR" }, { 0x01FC60, "SysSrv:GET_VCR" }, { 0x01FC64, "SysSrv:GET_FCR" }, { 0x01FC68, "SysSrv:LOCK_MEM" },
+ { 0x01FC6C, "SysSrv:UNLOCK_MEM" }, { 0x01FC70, "SysSrv:MOVE_INFO" }, { 0x01FC74, "SysSrv:CVT_0TO1" }, { 0x01FC78, "SysSrv:CVT_1TO0" },
+ { 0x01FC7C, "SysSrv:REPLACE80" }, { 0x01FC80, "SysSrv:TO_B0_CORE" }, { 0x01FC84, "SysSrv:G_DISPATCH" }, { 0x01FC88, "SysSrv:SIGNAL" },
+ { 0x01FC8C, "SysSrv:GET_SYS_BUFF" }, { 0x01FC90, "SysSrv:SET_DISK_SW" }, { 0x01FC94, "SysSrv:REPORT_ERROR" }, { 0x01FC98, "SysSrv:MOUNT_MESSAGE" },
+ { 0x01FC9C, "SysSrv:FULL_ERROR" }, { 0x01FCA0, "SysSrv:RESERVED_07" }, { 0x01FCA4, "SysSrv:SUP_DRVR_DISP" }, { 0x01FCA8, "SysSrv:INSTALL_DRIVER" },
+ { 0x01FCAC, "SysSrv:S_GET_BOOT_PFX" }, { 0x01FCB0, "SysSrv:S_SET_BOOT_PFX" }, { 0x01FCB4, "SysSrv:LOW_ALLOCATE" },
+ { 0x01FCB8, "SysSrv:GET_STACKED_ID" }, { 0x01FCBC, "SysSrv:DYN_SLOT_ARBITER" }, { 0x01FCC0, "SysSrv:PARSE_PATH" },
+ { 0x01FCC4, "SysSrv:OS_EVENT" }, { 0x01FCC8, "SysSrv:INSERT_DRIVER" }, { 0x01FCCC, "SysSrv:(device manager?)" },
+ { 0x01FCD0, "SysSrv:Old Device Dispatcher" }, { 0x01FCD4, "SysSrv:INIT_PARSE_PATH" }, { 0x01FCD8, "SysSrv:UNBIND_INT_VEC" },
+ { 0x01FCDC, "SysSrv:DO_INSERT_SCAN" }, { 0x01FCE0, "SysSrv:TOOLBOX_MSG" },
+
+ { 0xffff, "" }
+};
+
+offs_t apple2_common_device::com_2byte_op(std::ostream &stream, offs_t pc, const util::disasm_interface::data_buffer &opcodes, const char *opname)
+{
+ int item = 0;
+
+ if (m_GScpu)
+ {
+ if (m_GScpu->g65816_get_reg(g65816_device::G65816_D) != 0)
+ {
+ return 0;
+ }
+ }
+
+ u16 operand = (u16)opcodes.r8(pc+1);
+ while ((a2_stuff[item].addr & 0xff00) == 0)
+ {
+ if (a2_stuff[item].addr == operand)
+ {
+ stream << opname << " <" << a2_stuff[item].name;
+ return 2 | util::disasm_interface::SUPPORTED;
+ }
+ item++;
+ }
+
+ return 0;
+}
+
+offs_t apple2_common_device::com_3byte_op(std::ostream &stream, offs_t pc, const util::disasm_interface::data_buffer &opcodes, const char *opname)
+{
+ int item = 0;
+ u16 operand = opcodes.r16(pc+1);
+
+ // check for GS-specific stores with the databank set
+ if (m_GScpu)
+ {
+ u32 bank = m_GScpu->g65816_get_reg(g65816_device::G65816_DB) << 16;
+ bank |= operand;
+
+ int item = 0;
+ while (gs_vectors[item].addr != 0xffff)
+ {
+ if (gs_vectors[item].addr == bank)
+ {
+ stream << opname << " " << gs_vectors[item].name;
+ return 3 | util::disasm_interface::SUPPORTED;
+ }
+ item++;
+ }
+
+ // if we failed the GS stuff and the DB isn't a special bank, don't match the classic A2 switches.
+ bank >>= 16;
+ bank &= 0xff;
+ if ((bank != 0) && (bank != 1) && (bank != 0xe0) && (bank != 0xe1))
+ {
+ return 0;
+ }
+ }
+
+ while (a2_stuff[item].addr != 0xffff)
+ {
+ if (a2_stuff[item].addr == operand)
+ {
+ stream << opname << " " << a2_stuff[item].name;
+ return 3 | util::disasm_interface::SUPPORTED;
+ }
+ item++;
+ }
+
+ return 0;
+}
+
+offs_t apple2_common_device::com_long_op(std::ostream &stream, offs_t pc, const util::disasm_interface::data_buffer &opcodes, const char *opname)
+{
+ int item = 0;
+ u32 operand = opcodes.r32(pc) >> 8;
+ while (gs_vectors[item].addr != 0xffff)
+ {
+ if (gs_vectors[item].addr == operand)
+ {
+ stream << opname << " >" << gs_vectors[item].name;
+ return 4 | util::disasm_interface::SUPPORTED;
+ }
+ item++;
+ }
+
+ return 0;
+}
+
+offs_t apple2_common_device::dasm_override(std::ostream &stream, offs_t pc, const util::disasm_interface::data_buffer &opcodes, const util::disasm_interface::data_buffer &params)
+{
+ u8 opcode;
+ unsigned result = 0;
+
+ opcode = opcodes.r8(pc);
+
+ switch (opcode)
+ {
+ case 0x0d: // ORA
+ return com_3byte_op(stream, pc, opcodes, "ora");
+
+ case 0xad: // LDA
+ return com_3byte_op(stream, pc, opcodes, "lda");
+
+ case 0x8d: // STA
+ return com_3byte_op(stream, pc, opcodes, "sta");
+
+ case 0x2c: // BIT
+ return com_3byte_op(stream, pc, opcodes, "bit");
+
+ case 0x9c: // STZ
+ return com_3byte_op(stream, pc, opcodes, "stz");
+
+ case 0x20: // JSR
+ {
+ u16 operand = opcodes.r16(pc + 1);
+ if (operand == 0xbf00)
+ {
+ u8 p8call = opcodes.r8(pc + 3);
+ u16 p8params = opcodes.r16(pc + 4);
+ int item = 0;
+
+ while (p8_calls[item].addr != 0xffff)
+ {
+ if (p8_calls[item].addr == p8call)
+ {
+ util::stream_format(stream, "jsr ProDOS 8: %s ($%04x)", p8_calls[item].name, p8params);
+ return 6 | util::disasm_interface::SUPPORTED | util::disasm_interface::STEP_OVER;
+ }
+ item++;
+ }
+ }
+ else
+ {
+ offs_t rv = com_3byte_op(stream, pc, opcodes, "jsr");
+
+ if (rv > 0)
+ {
+ rv |= util::disasm_interface::STEP_OVER;
+ }
+ return rv;
+ }
+ }
+ break;
+
+ case 0x4c: // JMP
+ return com_3byte_op(stream, pc, opcodes, "jmp");
+
+ case 0x84: // STY ZP
+ return com_2byte_op(stream, pc, opcodes, "sty");
+
+ case 0x85: // STA ZP
+ return com_2byte_op(stream, pc, opcodes, "sta");
+
+ case 0xa4: // LDY ZP
+ return com_2byte_op(stream, pc, opcodes, "ldy");
+
+ case 0xa5: // LDA ZP
+ return com_2byte_op(stream, pc, opcodes, "lda");
+
+ case 0x65: // ADC ZP
+ return com_2byte_op(stream, pc, opcodes, "adc");
+
+ case 0xc5: // CMP ZP
+ return com_2byte_op(stream, pc, opcodes, "cmp");
+
+ case 0xc6: // DEC ZP
+ return com_2byte_op(stream, pc, opcodes, "dec");
+
+ case 0xe6: // INC ZP
+ return com_2byte_op(stream, pc, opcodes, "inc");
+
+ default:
+ break;
+ }
+
+ return result;
+}
+
+offs_t apple2_common_device::dasm_override_GS(std::ostream &stream, offs_t pc, const util::disasm_interface::data_buffer &opcodes, const util::disasm_interface::data_buffer &params)
+{
+ u8 opcode;
+ unsigned result = 0;
+
+ assert(m_GScpu); // ensure the IIgs CPU was configured if we're using this with a IIgs
+
+ opcode = opcodes.r8(pc);
+
+ switch (opcode)
+ {
+ case 0x0c: // TSB
+ return com_3byte_op(stream, pc, opcodes, "tsb");
+
+ case 0xa2: // LDX
+ if (opcodes.r32(pc + 3) == 0xe1000022) // JSL E10000
+ {
+ u16 toolcall = opcodes.r16(pc + 1);
+ int item = 0;
+ while (gs_tools[item].addr != 0xffff)
+ {
+ if (gs_tools[item].addr == toolcall)
+ {
+ util::stream_format(stream, "_%s (%04x)", gs_tools[item].name, toolcall);
+ return 7 | util::disasm_interface::SUPPORTED | util::disasm_interface::STEP_OVER;
+ }
+ item++;
+ }
+ }
+ else
+ {
+ u32 vec = opcodes.r32(pc) >> 8;
+ int item = 0;
+ while (gs_vectors[item].addr != 0xffff)
+ {
+ if (gs_tools[item].addr == vec)
+ {
+ util::stream_format(stream, "jsl %s (%06x)", gs_tools[item].name, vec);
+ return 4 | util::disasm_interface::SUPPORTED | util::disasm_interface::STEP_OVER;
+ }
+ item++;
+ }
+ }
+ break;
+
+ case 0x8f: // STA long
+ return com_long_op(stream, pc, opcodes, "sta");
+
+ // on IIgs, this is more likely to refer to some non-Monitor direct page, so don't do these that way
+ // (we need a m_maincpu so we can check the D register for a smarter version of this)
+ case 0x84: // STY ZP
+ case 0x85: // STA ZP
+ case 0xa4: // LDY ZP
+ case 0xa5: // LDA ZP
+ case 0x65: // ADC ZP
+ case 0xc5: // CMP ZP
+ case 0xc6: // DEC ZP
+ case 0xe6: // INC ZP
+ return dasm_override(stream, pc, opcodes, params);
+
+
+ default:
+ break;
+ }
+
+ if (!result)
+ {
+ return dasm_override(stream, pc, opcodes, params);
+ }
+
+ return result;
+}
diff --git a/src/mame/machine/apple2common.h b/src/mame/machine/apple2common.h
new file mode 100644
index 00000000000..bdfb34c4802
--- /dev/null
+++ b/src/mame/machine/apple2common.h
@@ -0,0 +1,54 @@
+// license:BSD-3-Clause
+// copyright-holders:R. Belmont
+/*********************************************************************
+
+ apple2common.h
+
+ Apple II stuff shared between apple2/apple2e/apple2gs.
+
+*********************************************************************/
+#ifndef MAME_MACHINE_APPLE2_COMMON_H
+#define MAME_MACHINE_APPLE2_COMMON_H
+
+#pragma once
+
+#include "cpu/g65816/g65816.h"
+
+// ======================> apple2_common_device
+
+class apple2_common_device : public device_t
+{
+public:
+ // construction/destruction
+ apple2_common_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+
+ template <typename T> void set_GS_cputag(T &&tag) { m_GScpu.set_tag(std::forward<T>(tag)); }
+
+ offs_t dasm_override(std::ostream &stream, offs_t pc, const util::disasm_interface::data_buffer &opcodes, const util::disasm_interface::data_buffer &params);
+ offs_t dasm_override_GS(std::ostream &stream, offs_t pc, const util::disasm_interface::data_buffer &opcodes, const util::disasm_interface::data_buffer &params);
+
+protected:
+ // device-level overrides
+ virtual void device_start() override;
+ virtual void device_validity_check(validity_checker &valid) const override;
+
+private:
+ optional_device<g65816_device> m_GScpu;
+
+ double m_x_calibration, m_y_calibration;
+ double m_joystick_x1_time;
+ double m_joystick_y1_time;
+ double m_joystick_x2_time;
+ double m_joystick_y2_time;
+
+ offs_t com_2byte_op(std::ostream &stream, offs_t pc, const util::disasm_interface::data_buffer &opcodes, const char *opname);
+ offs_t com_3byte_op(std::ostream &stream, offs_t pc, const util::disasm_interface::data_buffer &opcodes, const char *opname);
+ offs_t com_long_op(std::ostream &stream, offs_t pc, const util::disasm_interface::data_buffer &opcodes, const char *opname);
+};
+
+
+// device type definition
+DECLARE_DEVICE_TYPE(APPLE2_COMMON, apple2_common_device)
+
+
+#endif // MAME_MACHINE_APPLE2_COMMON_H
diff --git a/src/mame/machine/apple3.cpp b/src/mame/machine/apple3.cpp
index fa1afdde13f..8e7f0091f0b 100644
--- a/src/mame/machine/apple3.cpp
+++ b/src/mame/machine/apple3.cpp
@@ -47,8 +47,8 @@
#include "emu.h"
#include "includes/apple3.h"
-#define LOG_MEMORY 1
-#define LOG_INDXADDR 1
+#define LOG_MEMORY 0
+#define LOG_INDXADDR 0
#define ENV_SLOWSPEED (0x80)
#define ENV_IOENABLE (0x40)
@@ -63,7 +63,7 @@
// 2 MHz mode probably has every 33rd cycle stretched but this is currently unproven.
static constexpr XTAL APPLE2_CLOCK(1'021'800);
-READ8_MEMBER(apple3_state::apple3_c0xx_r)
+uint8_t apple3_state::apple3_c0xx_r(offs_t offset)
{
uint8_t result = 0xFF;
device_a2bus_card_interface *slotdevice;
@@ -195,7 +195,7 @@ READ8_MEMBER(apple3_state::apple3_c0xx_r)
case 0x74: case 0x75: case 0x76: case 0x77:
case 0x78: case 0x79: case 0x7A: case 0x7B:
case 0x7C: case 0x7D: case 0x7E: case 0x7F:
- result = m_rtc->read(space, m_via_0_b);
+ result = m_rtc->read(m_via_0_b);
break;
case 0x90: case 0x91: case 0x92: case 0x93:
@@ -304,7 +304,7 @@ READ8_MEMBER(apple3_state::apple3_c0xx_r)
case 0xf1:
case 0xf2:
case 0xf3:
- result = m_acia->read(space, offset & 0x03);
+ result = m_acia->read(offset & 0x03);
break;
}
return result;
@@ -312,7 +312,7 @@ READ8_MEMBER(apple3_state::apple3_c0xx_r)
-WRITE8_MEMBER(apple3_state::apple3_c0xx_w)
+void apple3_state::apple3_c0xx_w(offs_t offset, uint8_t data)
{
device_a2bus_card_interface *slotdevice;
@@ -375,7 +375,7 @@ WRITE8_MEMBER(apple3_state::apple3_c0xx_w)
case 0x74: case 0x75: case 0x76: case 0x77:
case 0x78: case 0x79: case 0x7A: case 0x7B:
case 0x7C: case 0x7D: case 0x7E: case 0x7F:
- m_rtc->write(space, m_via_0_b, data);
+ m_rtc->write(m_via_0_b, data);
break;
@@ -470,7 +470,7 @@ WRITE8_MEMBER(apple3_state::apple3_c0xx_w)
case 0xf1:
case 0xf2:
case 0xf3:
- m_acia->write(space, offset & 0x03, data);
+ m_acia->write(offset & 0x03, data);
break;
}
}
@@ -606,23 +606,23 @@ void apple3_state::apple3_via_out(uint8_t *var, uint8_t data)
}
-WRITE8_MEMBER(apple3_state::apple3_via_0_out_a)
+void apple3_state::apple3_via_0_out_a(uint8_t data)
{
apple3_via_out(&m_via_0_a, data);
}
-WRITE8_MEMBER(apple3_state::apple3_via_0_out_b)
+void apple3_state::apple3_via_0_out_b(uint8_t data)
{
// printf("ZP to %02x\n", data);
apple3_via_out(&m_via_0_b, data);
}
-WRITE8_MEMBER(apple3_state::apple3_via_1_out_a)
+void apple3_state::apple3_via_1_out_a(uint8_t data)
{
apple3_via_out(&m_via_1_a, data);
}
-WRITE8_MEMBER(apple3_state::apple3_via_1_out_b)
+void apple3_state::apple3_via_1_out_b(uint8_t data)
{
m_dac->write(data);
apple3_via_out(&m_via_1_b, data);
@@ -746,7 +746,7 @@ void apple3_state::device_post_load()
apple3_update_memory();
}
-READ8_MEMBER(apple3_state::apple3_memory_r)
+uint8_t apple3_state::apple3_memory_r(offs_t offset)
{
uint8_t rv = 0xff;
@@ -797,7 +797,7 @@ READ8_MEMBER(apple3_state::apple3_memory_r)
{
if (!machine().side_effects_disabled())
{
- rv = apple3_c0xx_r(space, offset-0xc000);
+ rv = apple3_c0xx_r(offset-0xc000);
}
}
else
@@ -882,7 +882,7 @@ READ8_MEMBER(apple3_state::apple3_memory_r)
return rv;
}
-WRITE8_MEMBER(apple3_state::apple3_memory_w)
+void apple3_state::apple3_memory_w(offs_t offset, uint8_t data)
{
if ((m_indir_bank & 0x80) && (offset >= 0x100))
{
@@ -922,7 +922,7 @@ WRITE8_MEMBER(apple3_state::apple3_memory_w)
{
if (!machine().side_effects_disabled())
{
- apple3_c0xx_w(space, offset-0xc000, data);
+ apple3_c0xx_w(offset-0xc000, data);
}
}
else
diff --git a/src/mame/machine/apricotkb.cpp b/src/mame/machine/apricotkb.cpp
index f573832986f..d5e4aecc451 100644
--- a/src/mame/machine/apricotkb.cpp
+++ b/src/mame/machine/apricotkb.cpp
@@ -68,12 +68,13 @@ void apricot_keyboard_device::apricot_keyboard_io(address_map &map)
// device_add_mconfig - add device configuration
//-------------------------------------------------
-MACHINE_CONFIG_START(apricot_keyboard_device::device_add_mconfig)
+void apricot_keyboard_device::device_add_mconfig(machine_config &config)
+{
#ifdef UPD7507_EMULATED
- MCFG_DEVICE_ADD(UPD7507C_TAG, UPD7507, XTAL(32'768))
- MCFG_DEVICE_IO_MAP(apricot_keyboard_io)
+ upd7507_device &upd(UPD7507(config, UPD7507C_TAG, XTAL(32'768)));
+ upd.set_addrmap(AS_IO, &apricot_keyboard_device::apricot_keyboard_io);
#endif
-MACHINE_CONFIG_END
+}
//-------------------------------------------------
diff --git a/src/mame/machine/at.cpp b/src/mame/machine/at.cpp
index 85286de7a30..9edac77f473 100644
--- a/src/mame/machine/at.cpp
+++ b/src/mame/machine/at.cpp
@@ -46,14 +46,16 @@ void at_mb_device::device_start()
downcast<i80286_cpu_device *>(m_maincpu.target())->set_a20_callback(i80286_cpu_device::a20_cb(&at_mb_device::a20_286, this));
}
-MACHINE_CONFIG_START(at_mb_device::at_softlists)
+void at_mb_device::at_softlists(machine_config &config)
+{
/* software lists */
- MCFG_SOFTWARE_LIST_ADD("pc_disk_list","ibm5150")
- MCFG_SOFTWARE_LIST_ADD("at_disk_list","ibm5170")
- MCFG_SOFTWARE_LIST_ADD("at_cdrom_list","ibm5170_cdrom")
-MACHINE_CONFIG_END
+ SOFTWARE_LIST(config, "pc_disk_list").set_original("ibm5150");
+ SOFTWARE_LIST(config, "at_disk_list").set_original("ibm5170");
+ SOFTWARE_LIST(config, "at_cdrom_list").set_original("ibm5170_cdrom");
+}
-MACHINE_CONFIG_START(at_mb_device::device_add_mconfig)
+void at_mb_device::device_add_mconfig(machine_config &config)
+{
PIT8254(config, m_pit8254, 0);
m_pit8254->set_clk<0>(4772720/4); /* heartbeat IRQ */
m_pit8254->out_handler<0>().set("pic8259_master", FUNC(pic8259_device::ir0_w));
@@ -105,7 +107,8 @@ MACHINE_CONFIG_START(at_mb_device::device_add_mconfig)
m_pic8259_slave->in_sp_callback().set_constant(0);
ISA16(config, m_isabus, 0);
- m_isabus->set_cputag(":maincpu");
+ m_isabus->set_memspace(":maincpu", AS_PROGRAM);
+ m_isabus->set_iospace(":maincpu", AS_IO);
m_isabus->irq2_callback().set(m_pic8259_slave, FUNC(pic8259_device::ir2_w)); // in place of irq 2 on at irq 9 is used
m_isabus->irq3_callback().set("pic8259_master", FUNC(pic8259_device::ir3_w));
m_isabus->irq4_callback().set("pic8259_master", FUNC(pic8259_device::ir4_w));
@@ -124,6 +127,7 @@ MACHINE_CONFIG_START(at_mb_device::device_add_mconfig)
m_isabus->drq5_callback().set(m_dma8237_2, FUNC(am9517a_device::dreq1_w));
m_isabus->drq6_callback().set(m_dma8237_2, FUNC(am9517a_device::dreq2_w));
m_isabus->drq7_callback().set(m_dma8237_2, FUNC(am9517a_device::dreq3_w));
+ m_isabus->iochck_callback().set(FUNC(at_mb_device::iochck_w));
MC146818(config, m_mc146818, 32.768_kHz_XTAL);
m_mc146818->irq().set(m_pic8259_slave, FUNC(pic8259_device::ir0_w));
@@ -131,8 +135,7 @@ MACHINE_CONFIG_START(at_mb_device::device_add_mconfig)
/* sound hardware */
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("speaker", SPEAKER_SOUND)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.50)
+ SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.50);
at_keyboard_controller_device &keybc(AT_KEYBOARD_CONTROLLER(config, "keybc", 12_MHz_XTAL));
keybc.hot_res().set_inputline(":maincpu", INPUT_LINE_RESET);
@@ -141,10 +144,10 @@ MACHINE_CONFIG_START(at_mb_device::device_add_mconfig)
keybc.kbd_clk().set("pc_kbdc", FUNC(pc_kbdc_device::clock_write_from_mb));
keybc.kbd_data().set("pc_kbdc", FUNC(pc_kbdc_device::data_write_from_mb));
- MCFG_DEVICE_ADD("pc_kbdc", PC_KBDC, 0)
- MCFG_PC_KBDC_OUT_CLOCK_CB(WRITELINE("keybc", at_keyboard_controller_device, kbd_clk_w))
- MCFG_PC_KBDC_OUT_DATA_CB(WRITELINE("keybc", at_keyboard_controller_device, kbd_data_w))
-MACHINE_CONFIG_END
+ pc_kbdc_device &pc_kbdc(PC_KBDC(config, "pc_kbdc", 0));
+ pc_kbdc.out_clock_cb().set("keybc", FUNC(at_keyboard_controller_device::kbd_clk_w));
+ pc_kbdc.out_data_cb().set("keybc", FUNC(at_keyboard_controller_device::kbd_data_w));
+}
void at_mb_device::map(address_map &map)
@@ -364,11 +367,12 @@ WRITE8_MEMBER( at_mb_device::write_rtc )
{
if (offset==0) {
m_nmi_enabled = BIT(data,7);
- m_isabus->set_nmi_state((m_nmi_enabled==0) && (m_channel_check==0));
- m_mc146818->write(space,0,data);
+ if (!m_nmi_enabled)
+ m_maincpu->set_input_line(INPUT_LINE_NMI, CLEAR_LINE);
+ m_mc146818->write(0,data);
}
else {
- m_mc146818->write(space,offset,data);
+ m_mc146818->write(offset,data);
}
}
@@ -413,5 +417,12 @@ WRITE8_MEMBER( at_mb_device::portb_w )
m_pit8254->write_gate2(BIT(data, 0));
speaker_set_spkrdata( BIT(data, 1));
m_channel_check = BIT(data, 3);
- m_isabus->set_nmi_state((m_nmi_enabled==0) && (m_channel_check==0));
+ if (m_channel_check)
+ m_maincpu->set_input_line(INPUT_LINE_NMI, CLEAR_LINE);
+}
+
+WRITE_LINE_MEMBER( at_mb_device::iochck_w )
+{
+ if (!state && m_nmi_enabled && !m_channel_check)
+ m_maincpu->set_input_line(INPUT_LINE_NMI, ASSERT_LINE);
}
diff --git a/src/mame/machine/at.h b/src/mame/machine/at.h
index a24bc316f44..d797b7d25c4 100644
--- a/src/mame/machine/at.h
+++ b/src/mame/machine/at.h
@@ -24,6 +24,7 @@ public:
DECLARE_READ8_MEMBER(portb_r);
DECLARE_WRITE8_MEMBER(portb_w);
DECLARE_WRITE8_MEMBER(write_rtc);
+ DECLARE_WRITE_LINE_MEMBER(iochck_w);
DECLARE_WRITE_LINE_MEMBER(shutdown);
diff --git a/src/mame/machine/atarifdc.cpp b/src/mame/machine/atarifdc.cpp
index 357cdb906af..977db4392d3 100644
--- a/src/mame/machine/atarifdc.cpp
+++ b/src/mame/machine/atarifdc.cpp
@@ -796,6 +796,7 @@ void atari_fdc_device::device_start()
// device_add_mconfig - add device configuration
//-------------------------------------------------
-MACHINE_CONFIG_START(atari_fdc_device::device_add_mconfig)
- MCFG_LEGACY_FLOPPY_4_DRIVES_ADD(atari_floppy_interface)
-MACHINE_CONFIG_END
+void atari_fdc_device::device_add_mconfig(machine_config &config)
+{
+ legacy_floppy_image_device::add_4drives(config, &atari_floppy_interface);
+}
diff --git a/src/mame/machine/balsente.cpp b/src/mame/machine/balsente.cpp
index b6a9e07cf38..b8c9939079b 100644
--- a/src/mame/machine/balsente.cpp
+++ b/src/mame/machine/balsente.cpp
@@ -263,7 +263,7 @@ WRITE8_MEMBER(balsente_state::novram_8bit_w)
WRITE8_MEMBER(balsente_state::acia_w)
{
// Ugly workaround: suppress soft reset command in order to avert race condition
- m_acia->write(space, offset, (BIT(offset, 0) && data == 0xe0) ? 0 : data);
+ m_acia->write(offset, (BIT(offset, 0) && data == 0xe0) ? 0 : data);
}
diff --git a/src/mame/machine/bbc.cpp b/src/mame/machine/bbc.cpp
index 2a861da480c..4d35da5a3b4 100644
--- a/src/mame/machine/bbc.cpp
+++ b/src/mame/machine/bbc.cpp
@@ -50,9 +50,9 @@ READ8_MEMBER(bbc_state::bbc_paged_r)
uint8_t data;
std::string region_tag;
- if (m_rom[m_swrbank] && memregion(region_tag.assign(m_rom[m_swrbank]->tag()).append(GENERIC_ROM_REGION_TAG).c_str()))
+ if (m_rom[m_swrbank] && memregion(region_tag.assign(m_rom[m_swrbank]->tag()).append(BBC_ROM_REGION_TAG).c_str()))
{
- data = m_rom[m_swrbank]->read_rom(space, offset);
+ data = m_rom[m_swrbank]->read(offset);
}
else
{
@@ -71,8 +71,13 @@ WRITE8_MEMBER(bbc_state::bbc_paged_w)
{ 0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0 }, // 2: 64K (banks 4 to 7) for Acorn sideways ram FE30 bank latch
{ 0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1 }, // 3: 128K (banks 8 to 15) for Acorn sideways ram FE30 bank latch
};
+ std::string region_tag;
- if (swramtype[m_swramtype][m_swrbank])
+ if (m_rom[m_swrbank] && memregion(region_tag.assign(m_rom[m_swrbank]->tag()).append(BBC_ROM_REGION_TAG).c_str()))
+ {
+ m_rom[m_swrbank]->write(offset, data);
+ }
+ else if (swramtype[m_swramtype][m_swrbank])
{
m_region_swr->base()[offset + (m_swrbank << 14)] = data;
}
@@ -149,9 +154,9 @@ READ8_MEMBER(bbc_state::bbcbp_paged_r)
}
else
{
- if (m_rom[m_swrbank] && memregion(region_tag.assign(m_rom[m_swrbank]->tag()).append(GENERIC_ROM_REGION_TAG).c_str()))
+ if (m_rom[m_swrbank] && memregion(region_tag.assign(m_rom[m_swrbank]->tag()).append(BBC_ROM_REGION_TAG).c_str()))
{
- data = m_rom[m_swrbank]->read_rom(space, offset);
+ data = m_rom[m_swrbank]->read(offset);
}
else
{
@@ -166,14 +171,22 @@ WRITE8_MEMBER(bbc_state::bbcbp_paged_w)
{
/* the BBC Model B+ 128K has extra RAM mapped in replacing the ROM banks 0,1,c and d. */
static const unsigned short swram_banks[16] = { 1,1,0,0,0,0,0,0,0,0,0,0,1,1,0,0 };
+ std::string region_tag;
if (m_paged_ram && offset < 0x3000)
{
m_ram->pointer()[offset + 0x8000] = data;
}
- else if (m_ram->size() == 128 * 1024 && swram_banks[m_swrbank])
+ else
{
- m_region_swr->base()[offset + (m_swrbank << 14)] = data;
+ if (m_rom[m_swrbank] && memregion(region_tag.assign(m_rom[m_swrbank]->tag()).append(BBC_ROM_REGION_TAG).c_str()))
+ {
+ m_rom[m_swrbank]->write(offset, data);
+ }
+ else if (m_ram->size() == 128 * 1024 && swram_banks[m_swrbank])
+ {
+ m_region_swr->base()[offset + (m_swrbank << 14)] = data;
+ }
}
}
@@ -282,9 +295,9 @@ READ8_MEMBER(bbc_state::bbcm_paged_r)
}
else
{
- if (m_rom[m_swrbank] && memregion(region_tag.assign(m_rom[m_swrbank]->tag()).append(GENERIC_ROM_REGION_TAG).c_str()))
+ if (m_rom[m_swrbank] && memregion(region_tag.assign(m_rom[m_swrbank]->tag()).append(BBC_ROM_REGION_TAG).c_str()))
{
- data = m_rom[m_swrbank]->read_rom(space, offset);
+ data = m_rom[m_swrbank]->read(offset);
}
else
{
@@ -297,13 +310,22 @@ READ8_MEMBER(bbc_state::bbcm_paged_r)
WRITE8_MEMBER(bbc_state::bbcm_paged_w)
{
+ std::string region_tag;
+
if (m_paged_ram && offset < 0x1000)
{
m_ram->pointer()[offset + 0x8000] = data;
}
- else if ((!m_lk19_ic37_paged_rom && (m_swrbank == 4 || m_swrbank == 5)) || (!m_lk18_ic41_paged_rom && (m_swrbank == 6 || m_swrbank == 7)))
+ else
{
- m_region_swr->base()[offset + (m_swrbank << 14)] = data;
+ if (m_rom[m_swrbank] && memregion(region_tag.assign(m_rom[m_swrbank]->tag()).append(BBC_ROM_REGION_TAG).c_str()))
+ {
+ m_rom[m_swrbank]->write(offset, data);
+ }
+ else if ((!m_lk19_ic37_paged_rom && (m_swrbank == 4 || m_swrbank == 5)) || (!m_lk18_ic41_paged_rom && (m_swrbank == 6 || m_swrbank == 7)))
+ {
+ m_region_swr->base()[offset + (m_swrbank << 14)] = data;
+ }
}
}
@@ -338,12 +360,12 @@ READ8_MEMBER(bbc_state::bbcm_tube_r)
if (m_acccon_itu)
{
/* internal Tube */
- if (m_intube) data = m_intube->host_r(space, offset);
+ if (m_intube) data = m_intube->host_r(offset);
}
else
{
/* external Tube */
- if (m_extube) data = m_extube->host_r(space, offset);
+ if (m_extube) data = m_extube->host_r(offset);
}
return data;
@@ -354,12 +376,12 @@ WRITE8_MEMBER(bbc_state::bbcm_tube_w)
if (m_acccon_itu)
{
/* internal Tube */
- if (m_intube) m_intube->host_w(space, offset, data);
+ if (m_intube) m_intube->host_w(offset, data);
}
else
{
/* external Tube */
- if (m_extube) m_extube->host_w(space, offset, data);
+ if (m_extube) m_extube->host_w(offset, data);
}
}
@@ -591,7 +613,7 @@ WRITE_LINE_MEMBER(bbc_state::shiftlock_led_w)
}
-void bbc_state::mc146818_set(address_space &space)
+void bbc_state::mc146818_set()
{
/* if chip enabled */
if (m_mc146818_ce)
@@ -601,18 +623,18 @@ void bbc_state::mc146818_set(address_space &space)
{
if (m_latch->q1_r()) // WR
{
- m_via_system_porta = m_rtc->read(space, 1);
+ m_via_system_porta = m_rtc->read(1);
}
else
{
- m_rtc->write(space, 1, m_via_system_porta);
+ m_rtc->write(1, m_via_system_porta);
}
}
/* if address select is set then set the address in the 146818 */
if (m_mc146818_as)
{
- m_rtc->write(space, 0, m_via_system_porta);
+ m_rtc->write(0, m_via_system_porta);
}
}
}
@@ -640,7 +662,7 @@ WRITE8_MEMBER(bbc_state::via_system_porta_w)
if (m_rtc)
{
- mc146818_set(space);
+ mc146818_set();
}
}
@@ -685,7 +707,7 @@ WRITE8_MEMBER(bbc_state::via_system_portb_w)
/* set Chip Enable and Address Strobe lines */
m_mc146818_ce = BIT(data, 6);
m_mc146818_as = BIT(data, 7);
- mc146818_set(space);
+ mc146818_set();
}
/* Master Compact only */
@@ -1154,65 +1176,6 @@ WRITE8_MEMBER(bbc_state::bbcmc_drive_control_w)
}
/**************************************
- BBC romslot loading functions
-***************************************/
-
-image_init_result bbc_state::load_rom16(device_image_interface &image, generic_slot_device *slot)
-{
- uint32_t size = slot->common_get_size("rom");
-
- // socket accepts 8K and 16K ROM only
- if (size > 0x4000)
- {
- image.seterror(IMAGE_ERROR_UNSPECIFIED, "ROM socket accepts 16K/8K only");
- return image_init_result::FAIL;
- }
-
- slot->rom_alloc(0x4000, GENERIC_ROM8_WIDTH, ENDIANNESS_LITTLE);
- slot->common_load_rom(slot->get_rom_base(), size, "rom");
-
- uint8_t *crt = slot->get_rom_base();
- if (size <= 0x2000)
- {
- /* mirror 8K ROMs */
- memcpy(crt + 0x2000, crt, 0x2000);
- }
-
- return image_init_result::PASS;
-}
-
-image_init_result bbc_state::load_rom32(device_image_interface &image, generic_slot_device *slot)
-{
- uint32_t size = slot->common_get_size("rom");
-
- // socket accepts 32K,16K and 8K ROM only
- if (size > 0x8000)
- {
- image.seterror(IMAGE_ERROR_UNSPECIFIED, "ROM socket accepts 32K/16K/8K only");
- return image_init_result::FAIL;
- }
-
- slot->rom_alloc(0x8000, GENERIC_ROM8_WIDTH, ENDIANNESS_LITTLE);
- slot->common_load_rom(slot->get_rom_base(), size, "rom");
-
- uint8_t *crt = slot->get_rom_base();
- if (size <= 0x2000)
- {
- /* mirror 8K ROMs */
- memcpy(crt + 0x2000, crt, 0x2000);
- memcpy(crt + 0x4000, crt, 0x2000);
- memcpy(crt + 0x6000, crt, 0x2000);
- }
- else if (size <= 0x4000)
- {
- /* mirror 16K ROMs */
- memcpy(crt + 0x4000, crt, 0x4000);
- }
-
- return image_init_result::PASS;
-}
-
-/**************************************
BBC cartslot loading functions
***************************************/
@@ -1290,7 +1253,7 @@ void bbc_state::init_bbcm()
init_bbc();
/* set links if ROM present, disabling RAM */
- if (m_rom[4] && memregion(region_tag.assign(m_rom[4]->tag()).append(GENERIC_ROM_REGION_TAG).c_str()))
+ if (m_rom[4] && memregion(region_tag.assign(m_rom[4]->tag()).append(BBC_ROM_REGION_TAG).c_str()))
{
/* link for ROM in slots 4 and 5 */
m_lk19_ic37_paged_rom = true;
@@ -1299,7 +1262,7 @@ void bbc_state::init_bbcm()
{
m_lk18_ic41_paged_rom = false;
}
- if (m_rom[6] && memregion(region_tag.assign(m_rom[6]->tag()).append(GENERIC_ROM_REGION_TAG).c_str()))
+ if (m_rom[6] && memregion(region_tag.assign(m_rom[6]->tag()).append(BBC_ROM_REGION_TAG).c_str()))
{
/* link for ROM in slots 6 and 7 */
m_lk18_ic41_paged_rom = true;
@@ -1362,7 +1325,7 @@ void bbc_state::insert_device_rom(memory_region *rom)
for (int bank = 15; bank >= 0; bank--)
{
/* if bank has socket and is empty */
- if (m_rom[bank] && !memregion(region_tag.assign(m_rom[bank]->tag()).append(GENERIC_ROM_REGION_TAG).c_str()))
+ if (m_rom[bank] && !memregion(region_tag.assign(m_rom[bank]->tag()).append(BBC_ROM_REGION_TAG).c_str()))
{
uint8_t *swr = m_region_swr->base() + (bank * 0x4000);
switch (rom->bytes())
@@ -1371,7 +1334,7 @@ void bbc_state::insert_device_rom(memory_region *rom)
/* 32K (or 2x16K) ROM, check whether ROM exists in this and next bank */
if (swr[0x0006] == 0xff && swr[0x4006] == 0xff)
{
- memcpy(m_region_swr->base() + (bank * 0x4000), rom->base(), 0x8000);
+ memcpy(m_region_swr->base() + (bank * 0x4000), rom->base(), rom->bytes());
osd_printf_verbose("Inserting '%s' into romslot%d\n", get_rom_name(rom->base() + 0x4000).c_str(), bank + 1);
osd_printf_verbose("Inserting '%s' into romslot%d\n", get_rom_name(rom->base()).c_str(), bank);
return;
@@ -1382,7 +1345,7 @@ void bbc_state::insert_device_rom(memory_region *rom)
/* 16/8K ROM, check whether ROM exists in this bank */
if (swr[0x0006] == 0xff)
{
- memcpy(m_region_swr->base() + (bank * 0x4000), rom->base(), 0x4000);
+ memcpy(m_region_swr->base() + (bank * 0x4000), rom->base(), rom->bytes());
osd_printf_verbose("Inserting '%s' into romslot%d\n", get_rom_name(rom->base()).c_str(), bank);
return;
}
@@ -1414,18 +1377,12 @@ void bbc_state::setup_device_roms()
/* configure romslots */
for (int i = 0; i < 16; i++)
{
- if (m_rom[i] && (rom_region = memregion(region_tag.assign(m_rom[i]->tag()).append(GENERIC_ROM_REGION_TAG).c_str())))
+ if (m_rom[i] && (rom_region = memregion(region_tag.assign(m_rom[i]->tag()).append(BBC_ROM_REGION_TAG).c_str())))
{
- switch (rom_region->bytes())
- {
- case 0x4000: /* 16K socket */
- memcpy(m_region_swr->base() + (i * 0x4000), rom_region->base(), rom_region->bytes());
- break;
- case 0x8000: /* 32K socket */
- memcpy(m_region_swr->base() + (i * 0x4000), rom_region->base(), rom_region->bytes());
- i++;
- break;
- }
+ if (m_rom[i]->get_rom_size())
+ memcpy(m_region_swr->base() + (i * 0x4000), rom_region->base(), std::min((int32_t)m_rom[i]->get_slot_size(), (int32_t)m_rom[i]->get_rom_size()));
+ else
+ memset(m_region_swr->base() + (i * 0x4000), 0, 0x4000);
}
}
@@ -1554,7 +1511,7 @@ void bbc_state::machine_reset()
/* install econet hardware */
if (m_bbcconfig.read_safe(0) & 0x04)
- m_maincpu->space(AS_PROGRAM).install_readwrite_handler(0xfea0, 0xfebf, read8_delegate(FUNC(mc6854_device::read), m_adlc.target()), write8_delegate(FUNC(mc6854_device::write), m_adlc.target()));
+ m_maincpu->space(AS_PROGRAM).install_readwrite_handler(0xfea0, 0xfebf, read8sm_delegate(FUNC(mc6854_device::read), m_adlc.target()), write8sm_delegate(FUNC(mc6854_device::write), m_adlc.target()));
else
m_maincpu->space(AS_PROGRAM).install_read_handler(0xfea0, 0xfebf, read8_delegate(FUNC(bbc_state::bbc_fe_r), this));
diff --git a/src/mame/machine/bebox.cpp b/src/mame/machine/bebox.cpp
index 9108801c6a5..f75af07d232 100644
--- a/src/mame/machine/bebox.cpp
+++ b/src/mame/machine/bebox.cpp
@@ -599,14 +599,14 @@ WRITE_LINE_MEMBER(bebox_state::bebox_timer0_w)
READ8_MEMBER(bebox_state::bebox_flash_r)
{
offset = (offset & ~7) | (7 - (offset & 7));
- return m_flash->read(space, offset);
+ return m_flash->read(offset);
}
WRITE8_MEMBER(bebox_state::bebox_flash_w)
{
offset = (offset & ~7) | (7 - (offset & 7));
- m_flash->write(space, offset, data);
+ m_flash->write(offset, data);
}
/*************************************
diff --git a/src/mame/machine/cbm_snqk.h b/src/mame/machine/cbm_snqk.h
index 5d19d453df2..32c9a597743 100644
--- a/src/mame/machine/cbm_snqk.h
+++ b/src/mame/machine/cbm_snqk.h
@@ -13,7 +13,7 @@
#include "imagedev/snapquik.h"
-#define CBM_QUICKLOAD_DELAY_SECONDS 3
+#define CBM_QUICKLOAD_DELAY (attotime::from_seconds(3))
image_init_result general_cbm_loadsnap(
device_image_interface &image,
diff --git a/src/mame/machine/cedar_magnet_plane.cpp b/src/mame/machine/cedar_magnet_plane.cpp
index 0fd0301d2c9..12f3596a8ba 100644
--- a/src/mame/machine/cedar_magnet_plane.cpp
+++ b/src/mame/machine/cedar_magnet_plane.cpp
@@ -71,10 +71,11 @@ WRITE8_MEMBER(cedar_magnet_plane_device::plane_portcf_w)
m_cf_data = data;
}
-MACHINE_CONFIG_START(cedar_magnet_plane_device::device_add_mconfig)
- MCFG_DEVICE_ADD("planecpu", Z80,4000000)
- MCFG_DEVICE_PROGRAM_MAP(cedar_magnet_plane_map)
- MCFG_DEVICE_IO_MAP(cedar_magnet_plane_io)
+void cedar_magnet_plane_device::device_add_mconfig(machine_config &config)
+{
+ z80_device &planecpu(Z80(config, "planecpu", 4000000));
+ planecpu.set_addrmap(AS_PROGRAM, &cedar_magnet_plane_device::cedar_magnet_plane_map);
+ planecpu.set_addrmap(AS_IO, &cedar_magnet_plane_device::cedar_magnet_plane_io);
z80pio_device& pio0(Z80PIO(config, "z80pio0", 4000000/2));
// pio0.out_int_callback().set_inputline("maincpu", INPUT_LINE_IRQ0);
@@ -89,7 +90,7 @@ MACHINE_CONFIG_START(cedar_magnet_plane_device::device_add_mconfig)
pio1.out_pa_callback().set(FUNC(cedar_magnet_plane_device::pio1_pa_w));
// pio1.in_pb_callback().set(FUNC(cedar_magnet_plane_device::pio1_pb_r));
pio1.out_pb_callback().set(FUNC(cedar_magnet_plane_device::pio1_pb_w));
-MACHINE_CONFIG_END
+}
READ8_MEMBER(cedar_magnet_plane_device::pio0_pa_r)
diff --git a/src/mame/machine/cedar_magnet_sprite.cpp b/src/mame/machine/cedar_magnet_sprite.cpp
index 4c21f4da167..a871fd3b7ab 100644
--- a/src/mame/machine/cedar_magnet_sprite.cpp
+++ b/src/mame/machine/cedar_magnet_sprite.cpp
@@ -201,10 +201,11 @@ WRITE8_MEMBER(cedar_magnet_sprite_device::sprite_port9c_w)
// printf("%s:sprite_port9c_w %02x\n", machine().describe_context().c_str(), data);
}
-MACHINE_CONFIG_START(cedar_magnet_sprite_device::device_add_mconfig)
- MCFG_DEVICE_ADD("spritecpu", Z80,4000000)
- MCFG_DEVICE_PROGRAM_MAP(cedar_magnet_sprite_map)
- MCFG_DEVICE_IO_MAP(cedar_magnet_sprite_io)
+void cedar_magnet_sprite_device::device_add_mconfig(machine_config &config)
+{
+ z80_device &spritecpu(Z80(config, "spritecpu", 4000000));
+ spritecpu.set_addrmap(AS_PROGRAM, &cedar_magnet_sprite_device::cedar_magnet_sprite_map);
+ spritecpu.set_addrmap(AS_IO, &cedar_magnet_sprite_device::cedar_magnet_sprite_io);
Z80PIO(config, m_pio0, 4000000/2);
// m_pio0->out_int_callback().set_inputline("maincpu", INPUT_LINE_IRQ0);
@@ -228,8 +229,8 @@ MACHINE_CONFIG_START(cedar_magnet_sprite_device::device_add_mconfig)
m_pio2->out_pb_callback().set(FUNC(cedar_magnet_sprite_device::pio2_pb_w));
- ADDRESS_MAP_BANK(config, "sp_sub_ram").set_map(&cedar_magnet_sprite_device::cedar_magnet_sprite_sub_ram_map).set_options(ENDIANNESS_LITTLE, 8, 18, 0x10000);
-MACHINE_CONFIG_END
+ ADDRESS_MAP_BANK(config, m_sprite_ram_bankdev).set_map(&cedar_magnet_sprite_device::cedar_magnet_sprite_sub_ram_map).set_options(ENDIANNESS_LITTLE, 8, 18, 0x10000);
+}
READ8_MEMBER(cedar_magnet_sprite_device::pio0_pa_r)
diff --git a/src/mame/machine/chessbase.cpp b/src/mame/machine/chessbase.cpp
new file mode 100644
index 00000000000..4515e632e28
--- /dev/null
+++ b/src/mame/machine/chessbase.cpp
@@ -0,0 +1,318 @@
+// license:BSD-3-Clause
+// copyright-holders:hap
+/******************************************************************************
+
+Generic chess computers base driver
+
+This file contains helpers for generic chessboard leds and input handling.
+
+NOTE: MAME doesn't include a generalized implementation for boardpieces yet,
+greatly affecting user playability of emulated electronic board games.
+As workaround for the chess games, use an external chess GUI on the side,
+such as Arena(in editmode).
+
+******************************************************************************/
+
+#include "emu.h"
+#include "includes/chessbase.h"
+
+
+// machine start/reset
+
+void chessbase_state::machine_start()
+{
+ // resolve handlers
+ m_out_x.resolve();
+ m_out_a.resolve();
+ m_out_digit.resolve();
+
+ // zerofill
+ memset(m_display_state, 0, sizeof(m_display_state));
+ memset(m_display_decay, 0, sizeof(m_display_decay));
+ memset(m_display_segmask, 0, sizeof(m_display_segmask));
+
+ m_inp_mux = 0;
+ m_led_select = 0;
+ m_led_data = 0;
+ m_led_latch = 0;
+ m_7seg_data = 0;
+
+ // register for savestates
+ save_item(NAME(m_display_maxy));
+ save_item(NAME(m_display_maxx));
+ save_item(NAME(m_display_wait));
+
+ save_item(NAME(m_display_state));
+ save_item(NAME(m_display_decay));
+ save_item(NAME(m_display_segmask));
+
+ save_item(NAME(m_inp_mux));
+ save_item(NAME(m_led_select));
+ save_item(NAME(m_led_data));
+ save_item(NAME(m_led_latch));
+ save_item(NAME(m_7seg_data));
+}
+
+void chessbase_state::machine_reset()
+{
+}
+
+
+/***************************************************************************
+ Helper Functions
+***************************************************************************/
+
+// The device may strobe the outputs very fast, it is unnoticeable to the user.
+// To prevent flickering here, we need to simulate a decay.
+
+void chessbase_state::display_update()
+{
+ for (int y = 0; y < m_display_maxy; y++)
+ {
+ u32 active_state = 0;
+
+ for (int x = 0; x <= m_display_maxx; x++)
+ {
+ // turn on powered segments
+ if (m_display_state[y] >> x & 1)
+ m_display_decay[y][x] = m_display_wait;
+
+ // determine active state
+ u32 ds = (m_display_decay[y][x] != 0) ? 1 : 0;
+ active_state |= (ds << x);
+
+ // output to y.x, or y.a when always-on
+ if (x != m_display_maxx)
+ m_out_x[y][x] = ds;
+ else
+ m_out_a[y] = ds;
+ }
+
+ // output to digity
+ if (m_display_segmask[y] != 0)
+ m_out_digit[y] = active_state & m_display_segmask[y];
+ }
+}
+
+TIMER_DEVICE_CALLBACK_MEMBER(chessbase_state::display_decay_tick)
+{
+ // slowly turn off unpowered segments
+ for (int y = 0; y < m_display_maxy; y++)
+ for (int x = 0; x <= m_display_maxx; x++)
+ if (m_display_decay[y][x] != 0)
+ m_display_decay[y][x]--;
+
+ display_update();
+}
+
+void chessbase_state::set_display_size(int maxx, int maxy)
+{
+ m_display_maxx = maxx;
+ m_display_maxy = maxy;
+}
+
+void chessbase_state::set_display_segmask(u32 digits, u32 mask)
+{
+ // set a segment mask per selected digit, but leave unselected ones alone
+ for (int i = 0; i < 0x20; i++)
+ {
+ if (digits & 1)
+ m_display_segmask[i] = mask;
+ digits >>= 1;
+ }
+}
+
+void chessbase_state::display_matrix(int maxx, int maxy, u32 setx, u32 sety, bool update)
+{
+ set_display_size(maxx, maxy);
+
+ // update current state
+ u32 mask = (1 << maxx) - 1;
+ for (int y = 0; y < maxy; y++)
+ m_display_state[y] = (sety >> y & 1) ? ((setx & mask) | (1 << maxx)) : 0;
+
+ if (update)
+ display_update();
+}
+
+
+// generic input handlers
+
+u16 chessbase_state::read_inputs(int columns)
+{
+ u16 ret = 0;
+
+ // read selected input rows
+ for (int i = 0; i < columns; i++)
+ if (m_inp_mux >> i & 1)
+ ret |= m_inp_matrix[i]->read();
+
+ return ret;
+}
+
+
+// chessboard generic inputs
+
+INPUT_PORTS_START( generic_cb_buttons )
+ PORT_START("IN.0")
+ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
+ PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
+ PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
+ PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
+ PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
+ PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
+ PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
+ PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
+
+ PORT_START("IN.1")
+ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
+ PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
+ PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
+ PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
+ PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
+ PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
+ PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
+ PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
+
+ PORT_START("IN.2")
+ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
+ PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
+ PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
+ PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
+ PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
+ PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
+ PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
+ PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
+
+ PORT_START("IN.3")
+ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
+ PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
+ PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
+ PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
+ PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
+ PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
+ PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
+ PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
+
+ PORT_START("IN.4")
+ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
+ PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
+ PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
+ PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
+ PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
+ PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
+ PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
+ PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
+
+ PORT_START("IN.5")
+ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
+ PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
+ PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
+ PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
+ PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
+ PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
+ PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
+ PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
+
+ PORT_START("IN.6")
+ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
+ PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
+ PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
+ PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
+ PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
+ PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
+ PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
+ PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
+
+ PORT_START("IN.7")
+ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
+ PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
+ PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
+ PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
+ PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
+ PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
+ PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
+ PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor")
+INPUT_PORTS_END
+
+INPUT_PORTS_START( generic_cb_magnets )
+ PORT_START("IN.0")
+ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
+ PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
+ PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
+ PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
+ PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
+ PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
+ PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
+ PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
+
+ PORT_START("IN.1")
+ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
+ PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
+ PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
+ PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
+ PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
+ PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
+ PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
+ PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
+
+ PORT_START("IN.2")
+ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
+ PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
+ PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
+ PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
+ PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
+ PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
+ PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
+ PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
+
+ PORT_START("IN.3")
+ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
+ PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
+ PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
+ PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
+ PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
+ PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
+ PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
+ PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
+
+ PORT_START("IN.4")
+ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
+ PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
+ PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
+ PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
+ PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
+ PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
+ PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
+ PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
+
+ PORT_START("IN.5")
+ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
+ PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
+ PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
+ PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
+ PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
+ PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
+ PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
+ PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
+
+ PORT_START("IN.6")
+ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
+ PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
+ PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
+ PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
+ PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
+ PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
+ PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
+ PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
+
+ PORT_START("IN.7")
+ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
+ PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
+ PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
+ PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
+ PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
+ PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
+ PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
+ PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
+INPUT_PORTS_END
diff --git a/src/mame/machine/cit101_kbd.cpp b/src/mame/machine/cit101_kbd.cpp
index 9f26b0e5f3c..dedefb7e335 100644
--- a/src/mame/machine/cit101_kbd.cpp
+++ b/src/mame/machine/cit101_kbd.cpp
@@ -153,11 +153,11 @@ INPUT_PORTS_START(cit101_hle_keyboard)
PORT_BIT(0x80000000, IP_ACTIVE_HIGH, IPT_UNUSED) // actually used for special stop code
INPUT_PORTS_END
-MACHINE_CONFIG_START(cit101_hle_keyboard_device::device_add_mconfig)
+void cit101_hle_keyboard_device::device_add_mconfig(machine_config &config)
+{
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("beeper", BEEP, 786)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.50)
-MACHINE_CONFIG_END
+ BEEP(config, m_beeper, 786).add_route(ALL_OUTPUTS, "mono", 0.50);
+}
ioport_constructor cit101_hle_keyboard_device::device_input_ports() const
{
diff --git a/src/mame/machine/coco.cpp b/src/mame/machine/coco.cpp
index 345a8ed18e8..71f26e266a9 100644
--- a/src/mame/machine/coco.cpp
+++ b/src/mame/machine/coco.cpp
@@ -305,7 +305,7 @@ uint8_t coco_state::floating_space_read(offs_t offset)
//
// Most of the time, the read below will result in floating_bus_read() being
// invoked
- return m_floating->read8(m_floating->space(0), offset);
+ return m_floating->read8(offset);
}
@@ -315,7 +315,7 @@ uint8_t coco_state::floating_space_read(offs_t offset)
void coco_state::floating_space_write(offs_t offset, uint8_t data)
{
- m_floating->write8(m_floating->space(0), offset, data);
+ m_floating->write8(offset, data);
}
@@ -336,7 +336,7 @@ void coco_state::floating_space_write(offs_t offset, uint8_t data)
READ8_MEMBER( coco_state::ff00_read )
{
- return pia_0().read(space, offset, mem_mask);
+ return pia_0().read(offset);
}
@@ -347,7 +347,7 @@ READ8_MEMBER( coco_state::ff00_read )
WRITE8_MEMBER( coco_state::ff00_write )
{
- pia_0().write(space, offset, data, mem_mask);
+ pia_0().write(offset, data);
}
@@ -446,7 +446,7 @@ WRITE_LINE_MEMBER( coco_state::pia0_irq_b )
READ8_MEMBER( coco_state::ff20_read )
{
- return pia_1().read(space, offset, mem_mask);
+ return pia_1().read(offset);
}
@@ -458,7 +458,7 @@ READ8_MEMBER( coco_state::ff20_read )
WRITE8_MEMBER( coco_state::ff20_write )
{
/* write to the PIA */
- pia_1().write(space, offset, data, mem_mask);
+ pia_1().write(offset, data);
/* we have to do this to do something that approximates the cartridge Q line behavior */
m_cococart->twiddle_q_lines();
diff --git a/src/mame/machine/coco_vhd.cpp b/src/mame/machine/coco_vhd.cpp
index c75e278caee..407d8b506d5 100644
--- a/src/mame/machine/coco_vhd.cpp
+++ b/src/mame/machine/coco_vhd.cpp
@@ -74,6 +74,7 @@ DEFINE_DEVICE_TYPE(COCO_VHD, coco_vhd_image_device, "coco_vhd_image", "CoCo Virt
coco_vhd_image_device::coco_vhd_image_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
: device_t(mconfig, COCO_VHD, tag, owner, clock)
, device_image_interface(mconfig, *this)
+ , m_cpu(*this, finder_base::DUMMY_TAG)
{
}
@@ -94,7 +95,6 @@ coco_vhd_image_device::~coco_vhd_image_device()
void coco_vhd_image_device::device_start()
{
m_status = VHDSTATUS_NO_VHD_ATTACHED;
- m_cpu = machine().device<cpu_device>(MAINCPU_TAG);
m_cpu_space = &m_cpu->space(AS_PROGRAM);
}
diff --git a/src/mame/machine/coco_vhd.h b/src/mame/machine/coco_vhd.h
index a484584c9f6..dc436466bf7 100644
--- a/src/mame/machine/coco_vhd.h
+++ b/src/mame/machine/coco_vhd.h
@@ -24,6 +24,12 @@ class coco_vhd_image_device : public device_t,
{
public:
// construction/destruction
+ template <typename T>
+ coco_vhd_image_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock, T &&cpu_tag)
+ : coco_vhd_image_device(mconfig, tag, owner, clock)
+ {
+ m_cpu.set_tag(std::forward<T>(cpu_tag));
+ }
coco_vhd_image_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
virtual ~coco_vhd_image_device();
@@ -52,11 +58,11 @@ protected:
void coco_vhd_readwrite(uint8_t data);
private:
- cpu_device * m_cpu;
- address_space * m_cpu_space;
- uint32_t m_logical_record_number;
- uint32_t m_buffer_address;
- uint8_t m_status;
+ required_device<cpu_device> m_cpu;
+ address_space * m_cpu_space;
+ uint32_t m_logical_record_number;
+ uint32_t m_buffer_address;
+ uint8_t m_status;
};
// device type definition
diff --git a/src/mame/machine/concept.cpp b/src/mame/machine/concept.cpp
index 655d98dd03d..01ef6742d05 100644
--- a/src/mame/machine/concept.cpp
+++ b/src/mame/machine/concept.cpp
@@ -73,6 +73,11 @@ uint32_t concept_state::screen_update(screen_device &screen, bitmap_ind16 &bitma
return 0;
}
+WRITE_LINE_MEMBER(concept_state::ioc_interrupt)
+{
+ concept_set_interrupt(IOCINT_level, state);
+}
+
void concept_state::concept_set_interrupt(int level, int state)
{
int interrupt_mask;
@@ -164,11 +169,8 @@ WRITE_LINE_MEMBER(concept_state::via_irq_func)
concept_set_interrupt(TIMINT_level, state);
}
-READ16_MEMBER(concept_state::concept_io_r)
+READ8_MEMBER(concept_state::io_r)
{
- if (! ACCESSING_BITS_0_7)
- return 0;
-
switch ((offset >> 8) & 7)
{
case 0:
@@ -216,13 +218,13 @@ READ16_MEMBER(concept_state::concept_io_r)
case 5:
/* slot status */
LOG(("concept_io_r: Slot status read at address 0x03%4.4x\n", offset << 1));
- break;
+ return (~m_a2bus->get_a2bus_nmi_mask() & 0x0f) | (~m_a2bus->get_a2bus_irq_mask() & 0x0f) << 4;
case 6:
/* calendar R/W */
VLOG(("concept_io_r: Calendar read at address 0x03%4.4x\n", offset << 1));
if (!m_clock_enable)
- return m_mm58274->read(space, m_clock_address);
+ return m_mm58274->read(m_clock_address);
break;
case 7:
@@ -231,15 +233,15 @@ READ16_MEMBER(concept_state::concept_io_r)
{
case 0:
/* NKBP keyboard */
- return m_kbdacia->read(space, (offset & 3));
+ return m_kbdacia->read(offset & 3);
case 1:
/* NSR0 data comm port 0 */
- return m_acia0->read(space, (offset & 3));
+ return m_acia0->read(offset & 3);
case 2:
/* NSR1 data comm port 1 */
- return m_acia1->read(space, (offset & 3));
+ return m_acia1->read(offset & 3);
case 3:
/* NVIA versatile system interface */
@@ -275,13 +277,8 @@ READ16_MEMBER(concept_state::concept_io_r)
return 0;
}
-WRITE16_MEMBER(concept_state::concept_io_w)
+WRITE8_MEMBER(concept_state::io_w)
{
- if (! ACCESSING_BITS_0_7)
- return;
-
- data &= 0xff;
-
switch ((offset >> 8) & 7)
{
case 0:
@@ -333,7 +330,7 @@ WRITE16_MEMBER(concept_state::concept_io_w)
/* calendar R/W */
LOG(("concept_io_w: Calendar written to at address 0x03%4.4x, data: 0x%4.4x\n", offset << 1, data));
if (!m_clock_enable)
- m_mm58274->write(space, m_clock_address, data & 0xf);
+ m_mm58274->write(m_clock_address, data & 0xf);
break;
case 7:
@@ -342,17 +339,17 @@ WRITE16_MEMBER(concept_state::concept_io_w)
{
case 0:
/* NKBP keyboard */
- m_kbdacia->write(space, (offset & 3), data);
+ m_kbdacia->write(offset & 3, data);
break;
case 1:
/* NSR0 data comm port 0 */
- m_acia0->write(space, (offset & 3), data);
+ m_acia0->write(offset & 3, data);
break;
case 2:
/* NSR1 data comm port 1 */
- m_acia1->write(space, (offset & 3), data);
+ m_acia1->write(offset & 3, data);
break;
case 3:
diff --git a/src/mame/machine/cuda.cpp b/src/mame/machine/cuda.cpp
index 59b51327211..cd7de260827 100644
--- a/src/mame/machine/cuda.cpp
+++ b/src/mame/machine/cuda.cpp
@@ -85,10 +85,11 @@ void cuda_device::cuda_map(address_map &map)
// device_add_mconfig - add device configuration
//-------------------------------------------------
-MACHINE_CONFIG_START(cuda_device::device_add_mconfig)
- MCFG_DEVICE_ADD(CUDA_CPU_TAG, M68HC05EG, XTAL(32'768)*192) // 32.768 kHz input clock, can be PLL'ed to x128 = 4.1 MHz under s/w control
- MCFG_DEVICE_PROGRAM_MAP(cuda_map)
-MACHINE_CONFIG_END
+void cuda_device::device_add_mconfig(machine_config &config)
+{
+ M68HC05EG(config, m_maincpu, XTAL(32'768)*192); // 32.768 kHz input clock, can be PLL'ed to x128 = 4.1 MHz under s/w control
+ m_maincpu->set_addrmap(AS_PROGRAM, &cuda_device::cuda_map);
+}
const tiny_rom_entry *cuda_device::device_rom_region() const
{
@@ -297,10 +298,10 @@ WRITE8_MEMBER( cuda_device::timer_ctrl_w )
{
static const attotime rates[4][5] =
{
- { attotime::from_seconds(1), attotime::from_msec(31.3f), attotime::from_msec(15.6f), attotime::from_msec(7.8f), attotime::from_msec(3.9f) },
- { attotime::from_seconds(2), attotime::from_msec(62.5f), attotime::from_msec(31.3f), attotime::from_msec(15.6f), attotime::from_msec(7.8f) },
- { attotime::from_seconds(4), attotime::from_msec(125.0f), attotime::from_msec(62.5f), attotime::from_msec(31.3f), attotime::from_msec(15.6f) },
- { attotime::from_seconds(8), attotime::from_msec(250.0f), attotime::from_msec(125.1f), attotime::from_msec(62.5f), attotime::from_msec(31.3f) },
+ { attotime::from_seconds(1), attotime::from_usec(31300), attotime::from_usec(15600), attotime::from_usec(7800), attotime::from_usec(3900) },
+ { attotime::from_seconds(2), attotime::from_usec(62500), attotime::from_usec(31300), attotime::from_usec(15600), attotime::from_usec(7800) },
+ { attotime::from_seconds(4), attotime::from_usec(125000), attotime::from_usec(62500), attotime::from_usec(31300), attotime::from_usec(15600) },
+ { attotime::from_seconds(8), attotime::from_usec(250000), attotime::from_usec(125100), attotime::from_usec(62500), attotime::from_usec(31300) },
};
// printf("%02x to timer control (PC=%x)\n", data, m_maincpu->pc());
diff --git a/src/mame/machine/dec_lk201.cpp b/src/mame/machine/dec_lk201.cpp
index 84740e07cee..4c4f5dbd4f9 100644
--- a/src/mame/machine/dec_lk201.cpp
+++ b/src/mame/machine/dec_lk201.cpp
@@ -211,14 +211,15 @@ void lk201_device::lk201_map(address_map &map)
// device_add_mconfig - add device configuration
//-------------------------------------------------
-MACHINE_CONFIG_START(lk201_device::device_add_mconfig)
- MCFG_DEVICE_ADD(LK201_CPU_TAG, M68HC05EG, XTAL(4'000'000)) // actually 68HC05C4, clock verified by Lord_Nightmare
- MCFG_DEVICE_PROGRAM_MAP(lk201_map)
+void lk201_device::device_add_mconfig(machine_config &config)
+{
+ M68HC05EG(config, m_maincpu, XTAL(4'000'000)); // actually 68HC05C4, clock verified by Lord_Nightmare
+ m_maincpu->set_addrmap(AS_PROGRAM, &lk201_device::lk201_map);
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD(LK201_SPK_TAG, BEEP, 2000) // clocked by a 555 timer at E8, the volume of the beep is controllable by: (8051 model) P2.0 thru P2.3, or (6805 model) the upper 4 bits of the LED data latch
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.50)
-MACHINE_CONFIG_END
+ BEEP(config, m_speaker, 2000); // clocked by a 555 timer at E8, the volume of the beep is controllable by: (8051 model) P2.0 thru P2.3, or (6805 model) the upper 4 bits of the LED data latch
+ m_speaker->add_route(ALL_OUTPUTS, "mono", 0.50);
+}
const tiny_rom_entry *lk201_device::device_rom_region() const
{
diff --git a/src/mame/machine/decioga.cpp b/src/mame/machine/decioga.cpp
index 3c039a9b6e0..46c2a204e10 100644
--- a/src/mame/machine/decioga.cpp
+++ b/src/mame/machine/decioga.cpp
@@ -10,10 +10,18 @@
#include "emu.h"
#include "decioga.h"
+#define LOG_DMA (1U << 0)
+#define LOG_LANCE_DMA (1U << 1)
+
+#define VERBOSE (LOG_DMA|LOG_LANCE_DMA)
+
+#include "logmacro.h"
+
DEFINE_DEVICE_TYPE(DECSTATION_IOGA, dec_ioga_device, "decioga", "DECstation I/O Gate Array")
void dec_ioga_device::map(address_map &map)
{
+ map(0x040000, 0x0400ff).rw(FUNC(dec_ioga_device::dmaptr_r), FUNC(dec_ioga_device::dmaptr_w));
map(0x040100, 0x040103).rw(FUNC(dec_ioga_device::csr_r), FUNC(dec_ioga_device::csr_w));
map(0x040110, 0x040113).rw(FUNC(dec_ioga_device::intr_r), FUNC(dec_ioga_device::intr_w));
map(0x040120, 0x040123).rw(FUNC(dec_ioga_device::imsk_r), FUNC(dec_ioga_device::imsk_w));
@@ -91,6 +99,17 @@ WRITE32_MEMBER(dec_ioga_device::imsk_w)
COMBINE_DATA(&m_imsk);
}
+READ32_MEMBER(dec_ioga_device::dmaptr_r)
+{
+ return m_dmaptrs[offset/4];
+}
+
+WRITE32_MEMBER(dec_ioga_device::dmaptr_w)
+{
+ COMBINE_DATA(&m_dmaptrs[offset/4]);
+ LOGMASKED(LOG_DMA, "DECIOGA: %08x to DMA pointer %x (addr %x)\n", data, offset/4, offset*4);
+}
+
WRITE_LINE_MEMBER(dec_ioga_device::rtc_irq_w)
{
if (state == ASSERT_LINE)
@@ -138,3 +157,21 @@ WRITE_LINE_MEMBER(dec_ioga_device::scc1_irq_w)
}
recalc_irq();
}
+
+// DMA handlers
+void dec_ioga_device::set_dma_space(address_space *space)
+{
+ m_maincpu_space = space;
+}
+
+READ16_MEMBER(dec_ioga_device::lance_dma_r)
+{
+ LOGMASKED(LOG_LANCE_DMA, "lance_dma_r: %08x (phys %08x)\n", offset, (offset<<1) + (m_dmaptrs[2]>>3));
+ return m_maincpu_space->read_word((offset<<1) + (m_dmaptrs[2]>>3));
+}
+
+WRITE16_MEMBER(dec_ioga_device::lance_dma_w)
+{
+ LOGMASKED(LOG_LANCE_DMA, "lance_dma_w: %04x to %08x\n", data, offset);
+ m_maincpu_space->write_word((offset<<1) + (m_dmaptrs[2]>>3), data);
+}
diff --git a/src/mame/machine/decioga.h b/src/mame/machine/decioga.h
index 28e7ce53990..25ec5fe5e40 100644
--- a/src/mame/machine/decioga.h
+++ b/src/mame/machine/decioga.h
@@ -28,6 +28,11 @@ public:
// multiplex irq output
auto irq_out() { return m_irq_out_cb.bind(); }
+ // DMA interface
+ void set_dma_space(address_space *space);
+ DECLARE_READ16_MEMBER(lance_dma_r);
+ DECLARE_WRITE16_MEMBER(lance_dma_w);
+
protected:
virtual void device_start() override;
virtual void device_reset() override;
@@ -38,9 +43,14 @@ protected:
DECLARE_WRITE32_MEMBER(intr_w);
DECLARE_READ32_MEMBER(imsk_r);
DECLARE_WRITE32_MEMBER(imsk_w);
+ DECLARE_READ32_MEMBER(dmaptr_r);
+ DECLARE_WRITE32_MEMBER(dmaptr_w);
+
+ address_space *m_maincpu_space;
private:
- uint32_t m_csr, m_intr, m_imsk;
+ u32 m_csr, m_intr, m_imsk;
+ u32 m_dmaptrs[0x10];
devcb_write_line m_irq_out_cb;
diff --git a/src/mame/machine/dgnalpha.cpp b/src/mame/machine/dgnalpha.cpp
index 59faa0f3ebc..dc48b3fa712 100644
--- a/src/mame/machine/dgnalpha.cpp
+++ b/src/mame/machine/dgnalpha.cpp
@@ -138,7 +138,7 @@ READ8_MEMBER( dragon_alpha_state::ff20_read )
break;
case 4: case 5: case 6: case 7:
- result = m_pia_2->read(space, offset, mem_mask);
+ result = m_pia_2->read(offset);
break;
case 8: case 9: case 10: case 11:
@@ -180,7 +180,7 @@ WRITE8_MEMBER( dragon_alpha_state::ff20_write )
break;
case 4: case 5: case 6: case 7:
- m_pia_2->write(space, offset, data, mem_mask);
+ m_pia_2->write(offset, data);
break;
case 8: case 9: case 10: case 11:
@@ -239,13 +239,13 @@ WRITE8_MEMBER( dragon_alpha_state::pia2_pa_w )
case 0x00: /* Inactive, do nothing */
break;
case 0x01: /* Write to selected port */
- m_ay8912->data_w(space, 0, m_pia_2->b_output());
+ m_ay8912->data_w(m_pia_2->b_output());
break;
case 0x02: /* Read from selected port */
- m_pia_2->write_portb(m_ay8912->data_r(space, 0));
+ m_pia_2->write_portb(m_ay8912->data_r());
break;
case 0x03: /* Select port to write to */
- m_ay8912->address_w(space, 0, m_pia_2->b_output());
+ m_ay8912->address_w(m_pia_2->b_output());
break;
}
}
diff --git a/src/mame/machine/dragon.cpp b/src/mame/machine/dragon.cpp
index 12950837d6d..ce4d6dd1be3 100644
--- a/src/mame/machine/dragon.cpp
+++ b/src/mame/machine/dragon.cpp
@@ -82,7 +82,7 @@ READ8_MEMBER( dragon64_state::ff00_read )
break;
case 4: case 5: case 6: case 7:
- result = m_acia->read(space, offset, mem_mask);
+ result = m_acia->read(offset);
break;
}
return result;
@@ -103,7 +103,7 @@ WRITE8_MEMBER( dragon64_state::ff00_write )
break;
case 4: case 5: case 6: case 7:
- m_acia->write(space, offset, data, mem_mask);
+ m_acia->write(offset, data);
break;
}
}
@@ -235,9 +235,9 @@ void d64plus_state::device_start()
{
dragon_state::device_start();
- address_space& space = m_maincpu->space(AS_PROGRAM);
- space.install_readwrite_handler(0xffe0, 0xffe0, READ8_DEVICE_DELEGATE(m_crtc, mc6845_device, status_r), WRITE8_DEVICE_DELEGATE(m_crtc, mc6845_device, address_w));
- space.install_readwrite_handler(0xffe1, 0xffe1, READ8_DEVICE_DELEGATE(m_crtc, mc6845_device, register_r), WRITE8_DEVICE_DELEGATE(m_crtc, mc6845_device, register_w));
+ address_space &space = m_maincpu->space(AS_PROGRAM);
+ space.install_readwrite_handler(0xffe0, 0xffe0, read8smo_delegate(FUNC(mc6845_device::status_r), &*m_crtc), write8smo_delegate(FUNC(mc6845_device::address_w), &*m_crtc));
+ space.install_readwrite_handler(0xffe1, 0xffe1, read8smo_delegate(FUNC(mc6845_device::register_r), &*m_crtc), write8smo_delegate(FUNC(mc6845_device::register_w), &*m_crtc));
space.install_readwrite_handler(0xffe2, 0xffe2, READ8_DELEGATE(d64plus_state, d64plus_6845_disp_r), WRITE8_DELEGATE(d64plus_state, d64plus_bank_w));
// allocate memory
diff --git a/src/mame/machine/egret.cpp b/src/mame/machine/egret.cpp
index 6b3054dd537..0959485bfad 100644
--- a/src/mame/machine/egret.cpp
+++ b/src/mame/machine/egret.cpp
@@ -84,10 +84,11 @@ void egret_device::egret_map(address_map &map)
// device_add_mconfig - add device configuration
//-------------------------------------------------
-MACHINE_CONFIG_START(egret_device::device_add_mconfig)
- MCFG_DEVICE_ADD(EGRET_CPU_TAG, M68HC05EG, XTAL(32'768)*192) // 32.768 kHz input clock, can be PLL'ed to x128 = 4.1 MHz under s/w control
- MCFG_DEVICE_PROGRAM_MAP(egret_map)
-MACHINE_CONFIG_END
+void egret_device::device_add_mconfig(machine_config &config)
+{
+ M68HC05EG(config, m_maincpu, XTAL(32'768)*192); // 32.768 kHz input clock, can be PLL'ed to x128 = 4.1 MHz under s/w control
+ m_maincpu->set_addrmap(AS_PROGRAM, &egret_device::egret_map);
+}
const tiny_rom_entry *egret_device::device_rom_region() const
{
diff --git a/src/mame/machine/electron.cpp b/src/mame/machine/electron.cpp
index 269ba54aa98..87d1056fdb4 100644
--- a/src/mame/machine/electron.cpp
+++ b/src/mame/machine/electron.cpp
@@ -237,7 +237,7 @@ READ8_MEMBER(electron_state::electron_paged_r)
default:
/* ROM in extension devices */
- data = m_exp->expbus_r(space, 0x8000 + offset, 0xff);
+ data = m_exp->expbus_r(0x8000 + offset);
break;
}
return data;
@@ -248,7 +248,7 @@ WRITE8_MEMBER(electron_state::electron_paged_w)
/* The processor will run at 2MHz during an access cycle to the ROM */
m_maincpu->set_clock_scale(1.0f);
- m_exp->expbus_w(space, 0x8000 + offset, data);
+ m_exp->expbus_w(0x8000 + offset, data);
}
READ8_MEMBER(electron_state::electron_mos_r)
@@ -265,7 +265,7 @@ WRITE8_MEMBER(electron_state::electron_mos_w)
m_maincpu->set_clock_scale(1.0f);
logerror("MOS: write %04x %02x\n", offset + 0xc000, data);
- m_exp->expbus_w(space, 0xc000 + offset, data);
+ m_exp->expbus_w(0xc000 + offset, data);
}
READ8_MEMBER(electron_state::electron_fred_r)
@@ -275,7 +275,7 @@ READ8_MEMBER(electron_state::electron_fred_r)
/* The Issue 4 ULA returns data from OS ROM, whereas Issue 6 ULA will return 0xff */
//logerror("FRED: read fc%02x\n", offset);
- return m_exp->expbus_r(space, 0xfc00 + offset, 0xff);
+ return m_exp->expbus_r(0xfc00 + offset);
}
WRITE8_MEMBER(electron_state::electron_fred_w)
@@ -287,7 +287,7 @@ WRITE8_MEMBER(electron_state::electron_fred_w)
if (offset == 0x7f) m_mrb_mapped = !(data & 0x80);
//logerror("FRED: write fc%02x\n", offset);
- m_exp->expbus_w(space, 0xfc00 + offset, data);
+ m_exp->expbus_w(0xfc00 + offset, data);
}
READ8_MEMBER(electron_state::electron_jim_r)
@@ -297,7 +297,7 @@ READ8_MEMBER(electron_state::electron_jim_r)
/* The Issue 4 ULA returns data from OS ROM, whereas Issue 6 ULA will return 0xff */
//logerror("JIM: read fd%02x\n", offset);
- return m_exp->expbus_r(space, 0xfd00 + offset, 0xff);
+ return m_exp->expbus_r(0xfd00 + offset);
}
WRITE8_MEMBER(electron_state::electron_jim_w)
@@ -306,7 +306,7 @@ WRITE8_MEMBER(electron_state::electron_jim_w)
m_maincpu->set_clock_scale(1.0f);
//logerror("JIM: write fd%02x\n", offset);
- m_exp->expbus_w(space, 0xfd00 + offset, data);
+ m_exp->expbus_w(0xfd00 + offset, data);
}
READ8_MEMBER(electron_state::electron_sheila_r)
@@ -343,7 +343,7 @@ WRITE8_MEMBER(electron_state::electron_sheila_w)
/* The processor will run at 2MHz during an access cycle to the ROM */
m_maincpu->set_clock_scale(1.0f);
- m_exp->expbus_w(space, 0xfe00 + offset, data);
+ m_exp->expbus_w(0xfe00 + offset, data);
int i = electron_palette_offset[(( offset >> 1 ) & 0x03)];
//logerror( "ULA: write fe%02x <- %02x\n", offset & 0x0f, data );
diff --git a/src/mame/machine/esqlcd.cpp b/src/mame/machine/esqlcd.cpp
index 78d6b6f91d1..a9348a5bde2 100644
--- a/src/mame/machine/esqlcd.cpp
+++ b/src/mame/machine/esqlcd.cpp
@@ -162,9 +162,10 @@ static unsigned char const Font5x7[][5] = {
};
//--------------------------------------------------------------------------------------------------------------------------------------------
-MACHINE_CONFIG_START(esq2x16_sq1_device::device_add_mconfig)
+void esq2x16_sq1_device::device_add_mconfig(machine_config &config)
+{
config.set_default_layout(layout_esq2by16);
-MACHINE_CONFIG_END
+}
//--------------------------------------------------------------------------------------------------------------------------------------------
void esq2x16_sq1_device::write_char(int data)
diff --git a/src/mame/machine/esqvfd.cpp b/src/mame/machine/esqvfd.cpp
index 987e0b72596..b8c2ad44f31 100644
--- a/src/mame/machine/esqvfd.cpp
+++ b/src/mame/machine/esqvfd.cpp
@@ -169,9 +169,10 @@ void esqvfd_device::update_display()
/* 2x40 VFD display used in the ESQ-1, VFX-SD, SD-1, and others */
-MACHINE_CONFIG_START(esq2x40_device::device_add_mconfig)
+void esq2x40_device::device_add_mconfig(machine_config &config)
+{
config.set_default_layout(layout_esq2by40);
-MACHINE_CONFIG_END
+}
void esq2x40_device::write_char(int data)
{
@@ -302,9 +303,10 @@ esq2x40_device::esq2x40_device(const machine_config &mconfig, const char *tag, d
/* 1x22 display from the VFX (not right, but it'll do for now) */
-MACHINE_CONFIG_START(esq1x22_device::device_add_mconfig)
+void esq1x22_device::device_add_mconfig(machine_config &config)
+{
config.set_default_layout(layout_esq1by22);
-MACHINE_CONFIG_END
+}
void esq1x22_device::write_char(int data)
@@ -349,9 +351,10 @@ esq1x22_device::esq1x22_device(const machine_config &mconfig, const char *tag, d
}
/* SQ-1 display, I think it's really an LCD but we'll deal with it for now */
-MACHINE_CONFIG_START(esq2x40_sq1_device::device_add_mconfig)
+void esq2x40_sq1_device::device_add_mconfig(machine_config &config)
+{
config.set_default_layout(layout_esq2by40); // we use the normal 2x40 layout
-MACHINE_CONFIG_END
+}
void esq2x40_sq1_device::write_char(int data)
{
diff --git a/src/mame/machine/fd1089.cpp b/src/mame/machine/fd1089.cpp
index 5e1a0c17599..cf42dc7f0bf 100644
--- a/src/mame/machine/fd1089.cpp
+++ b/src/mame/machine/fd1089.cpp
@@ -110,7 +110,7 @@
CPU # Type Status Game Seed Unencrypted data range
--------- ------- --- -------------------- -- -----------------------------------
317-0013A FD1089B [1] Enduro Racer 01 030000-04ffff + 100000-1fffff
- 317-0016 FD1089? ??? Fantasy Zone 05 ?
+ 317-0016 FD1089B [2] Fantasy Zone 05 ?
317-0018 FD1089A [1] Action Fighter 03 400000-4fffff + 840000-8dffff + c00000-c4ffff + ff0000-ffffff
317-0019 FD1089A [1] Outrun 07 000000-03ffff
317-0021 FD1089A [2] Alex Kidd 0b ?
diff --git a/src/mame/machine/fidelbase.cpp b/src/mame/machine/fidelbase.cpp
new file mode 100644
index 00000000000..0d638879140
--- /dev/null
+++ b/src/mame/machine/fidelbase.cpp
@@ -0,0 +1,151 @@
+// license:BSD-3-Clause
+// copyright-holders:hap
+/******************************************************************************
+
+Fidelity Electronics (mostly-)chess computers base driver
+
+TODO: (see each driver for more specific)
+- verify cpu speed and rom labels where uncertain
+- support for printer
+- improve EAS/SC12/etc CPU divider? it seems a little bit slower than the real machine.
+ Currently, a dummy timer workaround is needed, or it's much worse.
+ Is the problem here due to timing of CPU addressbus changes? We can only 'sense'
+ the addressbus at read or write accesses.
+
+Keypad legend:
+- RE: Reset
+- CL: Clear
+- EN: Enter
+- PB: Problem Mode
+- PV: Position Verification
+- LV: Playing Levels
+- TB: Take Back
+- DM: Display Move/Double Move
+- RV: Reverse
+- ST: Set/Stop
+- TM: Time
+
+Read the official manual(s) on how to play.
+
+Peripherals, compatible with various boards:
+- Fidelity Challenger Printer - thermal printer, MCU=D8048C243
+
+Program/data cartridges, for various boards, some cross-compatible:
+- CB9: Challenger Book Openings 1 - 8KB (label not known)
+- CB16: Challenger Book Openings 2 - 8+8KB 101-1042A01,02
+- *CG64: 64 Greatest Games
+- *EOA-EOE: Challenger Book Openings - Chess Encyclopedia A-E (5 modules)
+
+******************************************************************************/
+
+#include "emu.h"
+#include "includes/fidelbase.h"
+
+
+// machine start/reset
+
+void fidelbase_state::machine_start()
+{
+ chessbase_state::machine_start();
+
+ // zerofill/register for savestates
+ m_speech_data = 0;
+ m_speech_bank = 0;
+
+ save_item(NAME(m_speech_data));
+ save_item(NAME(m_speech_bank));
+ save_item(NAME(m_div_status));
+}
+
+void fidelbase_state::machine_reset()
+{
+ chessbase_state::machine_reset();
+
+ m_div_status = ~0;
+}
+
+
+/***************************************************************************
+ Helper Functions
+***************************************************************************/
+
+// cartridge
+
+DEVICE_IMAGE_LOAD_MEMBER(fidelbase_state, scc_cartridge)
+{
+ u32 size = m_cart->common_get_size("rom");
+
+ // max size is 16KB?
+ if (size > 0x4000)
+ {
+ image.seterror(IMAGE_ERROR_UNSPECIFIED, "Invalid file size");
+ return image_init_result::FAIL;
+ }
+
+ m_cart->rom_alloc(size, GENERIC_ROM8_WIDTH, ENDIANNESS_LITTLE);
+ m_cart->common_load_rom(m_cart->get_rom_base(), size, "rom");
+
+ return image_init_result::PASS;
+}
+
+READ8_MEMBER(fidelbase_state::cartridge_r)
+{
+ if (m_cart->exists())
+ return m_cart->read_rom(offset);
+ else
+ return 0;
+}
+
+
+// Offset-dependent CPU divider on some 6502-based machines
+
+void fidelbase_state::div_set_cpu_freq(offs_t offset)
+{
+ static const u16 mask = 0x6000;
+ u16 status = (offset & mask) | m_div_config->read();
+
+ if (status != m_div_status && status & 2)
+ {
+ // when a13/a14 is high, XTAL goes through divider(s)
+ // (depending on factory-set jumper, either one or two 7474)
+ float div = (status & 1) ? 0.25 : 0.5;
+ m_maincpu->set_clock_scale((offset & mask) ? div : 1.0);
+ }
+
+ m_div_status = status;
+}
+
+void fidelbase_state::div_trampoline_w(offs_t offset, u8 data)
+{
+ div_set_cpu_freq(offset);
+ m_mainmap->write8(offset, data);
+}
+
+u8 fidelbase_state::div_trampoline_r(offs_t offset)
+{
+ if (!machine().side_effects_disabled())
+ div_set_cpu_freq(offset);
+
+ return m_mainmap->read8(offset);
+}
+
+void fidelbase_state::div_trampoline(address_map &map)
+{
+ map(0x0000, 0xffff).rw(FUNC(fidelbase_state::div_trampoline_r), FUNC(fidelbase_state::div_trampoline_w));
+}
+
+INPUT_PORTS_START( fidel_cpu_div_2 )
+ PORT_START("div_config") // hardwired, default to /2
+ PORT_CONFNAME( 0x03, 0x02, "CPU Divider" )
+ PORT_CONFSETTING( 0x00, "Disabled" )
+ PORT_CONFSETTING( 0x02, "2" )
+ PORT_CONFSETTING( 0x03, "4" )
+INPUT_PORTS_END
+
+INPUT_PORTS_START( fidel_cpu_div_4 )
+ PORT_START("div_config") // hardwired, default to /4
+ PORT_CONFNAME( 0x03, 0x03, "CPU Divider" )
+ PORT_CONFSETTING( 0x00, "Disabled" )
+ PORT_CONFSETTING( 0x02, "2" )
+ PORT_CONFSETTING( 0x03, "4" )
+INPUT_PORTS_END
diff --git a/src/mame/machine/gaelco2.cpp b/src/mame/machine/gaelco2.cpp
index 8c186326c3c..672afa9d51e 100644
--- a/src/mame/machine/gaelco2.cpp
+++ b/src/mame/machine/gaelco2.cpp
@@ -22,7 +22,7 @@
***************************************************************************/
-void gaelco2_state::gaelco2_ROM16_split_gfx(const char *src_reg, const char *dst_reg, int start, int length, int dest1, int dest2)
+void gaelco2_state::ROM16_split_gfx(const char *src_reg, const char *dst_reg, int start, int length, int dest1, int dest2)
{
int i;
@@ -67,16 +67,16 @@ void gaelco2_state::init_alighunt()
*/
/* split ROM u48 */
- gaelco2_ROM16_split_gfx("gfx2", "gfx1", 0x0000000, 0x0400000, 0x0000000, 0x0400000);
+ ROM16_split_gfx("gfx2", "gfx1", 0x0000000, 0x0400000, 0x0000000, 0x0400000);
/* split ROM u47 */
- gaelco2_ROM16_split_gfx("gfx2", "gfx1", 0x0400000, 0x0400000, 0x0200000, 0x0600000);
+ ROM16_split_gfx("gfx2", "gfx1", 0x0400000, 0x0400000, 0x0200000, 0x0600000);
/* split ROM u50 */
- gaelco2_ROM16_split_gfx("gfx2", "gfx1", 0x0800000, 0x0400000, 0x0800000, 0x0c00000);
+ ROM16_split_gfx("gfx2", "gfx1", 0x0800000, 0x0400000, 0x0800000, 0x0c00000);
/* split ROM u49 */
- gaelco2_ROM16_split_gfx("gfx2", "gfx1", 0x0c00000, 0x0400000, 0x0a00000, 0x0e00000);
+ ROM16_split_gfx("gfx2", "gfx1", 0x0c00000, 0x0400000, 0x0a00000, 0x0e00000);
}
@@ -98,17 +98,17 @@ void gaelco2_state::init_touchgo()
*/
/* split ROM ic65 */
- gaelco2_ROM16_split_gfx("gfx2", "gfx1", 0x0000000, 0x0400000, 0x0000000, 0x0400000);
+ ROM16_split_gfx("gfx2", "gfx1", 0x0000000, 0x0400000, 0x0000000, 0x0400000);
/* split ROM ic66 */
- gaelco2_ROM16_split_gfx("gfx2", "gfx1", 0x0400000, 0x0200000, 0x0200000, 0x0600000);
+ ROM16_split_gfx("gfx2", "gfx1", 0x0400000, 0x0200000, 0x0200000, 0x0600000);
/* split ROM ic67 */
- gaelco2_ROM16_split_gfx("gfx2", "gfx1", 0x0800000, 0x0400000, 0x0800000, 0x0c00000);
+ ROM16_split_gfx("gfx2", "gfx1", 0x0800000, 0x0400000, 0x0800000, 0x0c00000);
}
-void gaelco2_state::init_snowboar()
+void gaelco2_state::init_snowboara()
{
/*
For "gfx2" we have this memory map:
@@ -126,13 +126,14 @@ void gaelco2_state::init_snowboar()
*/
/* split ROM sb44 */
- gaelco2_ROM16_split_gfx("gfx2", "gfx1", 0x0000000, 0x0400000, 0x0000000, 0x0400000);
+ ROM16_split_gfx("gfx2", "gfx1", 0x0000000, 0x0400000, 0x0000000, 0x0400000);
/* split ROM sb45 */
- gaelco2_ROM16_split_gfx("gfx2", "gfx1", 0x0400000, 0x0400000, 0x0200000, 0x0600000);
+ ROM16_split_gfx("gfx2", "gfx1", 0x0400000, 0x0400000, 0x0200000, 0x0600000);
/* split ROM sb46 */
- gaelco2_ROM16_split_gfx("gfx2", "gfx1", 0x0800000, 0x0400000, 0x0800000, 0x0c00000);
+ ROM16_split_gfx("gfx2", "gfx1", 0x0800000, 0x0400000, 0x0800000, 0x0c00000);
+ init_snowboar();
}
@@ -151,10 +152,10 @@ void gaelco2_state::init_wrally2()
*/
/* split ROM wr2_ic69.ic69 */
- gaelco2_ROM16_split_gfx("gfx2", "gfx1", 0x0000000, 0x0400000, 0x0000000, 0x0200000);
+ ROM16_split_gfx("gfx2", "gfx1", 0x0000000, 0x0400000, 0x0000000, 0x0200000);
/* split ROM wr2_ic70.ic70 */
- gaelco2_ROM16_split_gfx("gfx2", "gfx1", 0x0400000, 0x0200000, 0x0400000, 0x0600000);
+ ROM16_split_gfx("gfx2", "gfx1", 0x0400000, 0x0200000, 0x0400000, 0x0600000);
}
@@ -164,13 +165,13 @@ void gaelco2_state::init_wrally2()
***************************************************************************/
-WRITE8_MEMBER(gaelco2_state::shareram_w)
+void gaelco2_state::shareram_w(offs_t offset, u8 data)
{
// why isn't there an AM_SOMETHING macro for this?
reinterpret_cast<u8 *>(m_shareram.target())[BYTE_XOR_BE(offset)] = data;
}
-READ8_MEMBER(gaelco2_state::shareram_r)
+u8 gaelco2_state::shareram_r(offs_t offset)
{
// why isn't there an AM_SOMETHING macro for this?
return reinterpret_cast<u8 const *>(m_shareram.target())[BYTE_XOR_BE(offset)];
@@ -183,7 +184,7 @@ READ8_MEMBER(gaelco2_state::shareram_r)
***************************************************************************/
-WRITE16_MEMBER(gaelco2_state::wrally2_latch_w)
+void gaelco2_state::wrally2_latch_w(offs_t offset, u16 data)
{
m_mainlatch->write_bit(offset >> 2, BIT(data, 0));
}
@@ -208,7 +209,7 @@ WRITE_LINE_MEMBER(gaelco2_state::coin4_counter_w)
machine().bookkeeping().coin_counter_w(3, state);
}
-WRITE16_MEMBER(gaelco2_state::alighunt_coin_w)
+void gaelco2_state::alighunt_coin_w(u16 data)
{
/* Coin Lockouts */
machine().bookkeeping().coin_lockout_w(0, ~data & 0x01);
@@ -231,7 +232,7 @@ void bang_state::init_bang()
m_clr_gun_int = 0;
}
-WRITE16_MEMBER(bang_state::bang_clr_gun_int_w)
+void bang_state::bang_clr_gun_int_w(u16 data)
{
m_clr_gun_int = 1;
}
@@ -300,12 +301,17 @@ WRITE_LINE_MEMBER(wrally2_state::wrally2_adc_cs)
***************************************************************************/
-static uint32_t rol(uint32_t x, unsigned int c)
+void gaelco2_state::init_snowboar()
+{
+ save_item(NAME(m_snowboard_latch));
+}
+
+static u32 rol(u32 x, u8 c)
{
return (x << c) | (x >> (32 - c));
}
-static uint16_t get_lo(uint32_t x)
+static u16 get_lo(u32 x)
{
return ((x & 0x00000010) << 1) |
((x & 0x00000800) << 3) |
@@ -322,7 +328,7 @@ static uint16_t get_lo(uint32_t x)
((x & 0x00000020) >> 1);
}
-static uint16_t get_hi(uint32_t x)
+static u16 get_hi(u32 x)
{
return ((x & 0x00001400) >> 0) |
((x & 0x10000000) >> 26) |
@@ -341,7 +347,7 @@ static uint16_t get_hi(uint32_t x)
((x & 0x00000100) >> 1);
}
-static uint16_t get_out(uint16_t x)
+static u16 get_out(u16 x)
{
return ((x & 0xc840) << 0) |
((x & 0x0080) << 2) |
@@ -357,27 +363,25 @@ static uint16_t get_out(uint16_t x)
((x & 0x0020) >> 2);
}
-uint16_t mangle(uint32_t x)
+u16 mangle(u32 x)
{
- uint16_t a = get_lo(x);
- uint16_t b = get_hi(x);
+ u16 a = get_lo(x);
+ u16 b = get_hi(x);
return get_out(((a ^ 0x0010) - (b ^ 0x0024)) ^ 0x5496);
}
-READ16_MEMBER(gaelco2_state::snowboar_protection_r)
+u16 gaelco2_state::snowboar_protection_r()
{
- uint16_t ret = mangle(snowboard_latch);
+ u16 ret = mangle(m_snowboard_latch);
ret = ((ret & 0xff00) >> 8) | ((ret & 0x00ff) << 8);
return ret;
-
}
-WRITE16_MEMBER(gaelco2_state::snowboar_protection_w)
+void gaelco2_state::snowboar_protection_w(offs_t offset, u16 data, u16 mem_mask)
{
COMBINE_DATA(&m_snowboar_protection[offset]);
- snowboard_latch = (snowboard_latch << 16) | data;
+ m_snowboard_latch = (m_snowboard_latch << 16) | data;
logerror("%06x: protection write %04x to %04x\n", m_maincpu->pc(), data, offset*2);
-
}
diff --git a/src/mame/machine/gaelco_ds5002fp.cpp b/src/mame/machine/gaelco_ds5002fp.cpp
index 9f2837ba95f..36f0aab9b11 100644
--- a/src/mame/machine/gaelco_ds5002fp.cpp
+++ b/src/mame/machine/gaelco_ds5002fp.cpp
@@ -38,15 +38,16 @@ WRITE8_MEMBER(gaelco_ds5002fp_device::hostmem_w)
m_hostmem->write_byte(offset, data);
}
-MACHINE_CONFIG_START(gaelco_ds5002fp_device::device_add_mconfig)
- MCFG_DEVICE_ADD("mcu", DS5002FP, DERIVED_CLOCK(1, 1))
- MCFG_DEVICE_PROGRAM_MAP(dallas_rom)
- MCFG_DEVICE_IO_MAP(dallas_ram)
+void gaelco_ds5002fp_device::device_add_mconfig(machine_config &config)
+{
+ ds5002fp_device &mcu(DS5002FP(config, "mcu", DERIVED_CLOCK(1, 1)));
+ mcu.set_addrmap(AS_PROGRAM, &gaelco_ds5002fp_device::dallas_rom);
+ mcu.set_addrmap(AS_IO, &gaelco_ds5002fp_device::dallas_ram);
- MCFG_QUANTUM_PERFECT_CPU("mcu")
+ config.m_perfect_cpu_quantum = subtag("mcu");
NVRAM(config, "sram", nvram_device::DEFAULT_ALL_0);
-MACHINE_CONFIG_END
+}
void gaelco_ds5002fp_device::device_start()
{
diff --git a/src/mame/machine/gaelco_ds5002fp.h b/src/mame/machine/gaelco_ds5002fp.h
index f5eaf91e375..675e2c49267 100644
--- a/src/mame/machine/gaelco_ds5002fp.h
+++ b/src/mame/machine/gaelco_ds5002fp.h
@@ -14,12 +14,6 @@ class gaelco_ds5002fp_device : public device_t, public device_memory_interface
public:
gaelco_ds5002fp_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- // not really public, but address map needs to get them
- DECLARE_READ8_MEMBER(hostmem_r);
- DECLARE_WRITE8_MEMBER(hostmem_w);
-
- void dallas_ram(address_map &map);
- void dallas_rom(address_map &map);
protected:
// device_t implementation
virtual void device_add_mconfig(machine_config &config) override;
@@ -29,8 +23,15 @@ protected:
virtual space_config_vector memory_space_config() const override;
private:
+
+ void dallas_ram(address_map &map);
+ void dallas_rom(address_map &map);
+
address_space_config const m_hostmem_config;
address_space *m_hostmem;
+
+ DECLARE_READ8_MEMBER(hostmem_r);
+ DECLARE_WRITE8_MEMBER(hostmem_w);
};
#endif // MAME_MACHINE_GAELCO_DS5002FP_H
diff --git a/src/mame/machine/gamepock.cpp b/src/mame/machine/gamepock.cpp
index 9d705519d0f..dd690f1b0ce 100644
--- a/src/mame/machine/gamepock.cpp
+++ b/src/mame/machine/gamepock.cpp
@@ -140,7 +140,7 @@ void gamepock_state::machine_reset()
hd44102ch_init( 2 );
if (m_cart->exists())
- m_maincpu->space(AS_PROGRAM).install_read_handler(0x4000,0xbfff, read8_delegate(FUNC(generic_slot_device::read_rom),(generic_slot_device*)m_cart));
+ m_maincpu->space(AS_PROGRAM).install_read_handler(0x4000,0xbfff, read8sm_delegate(FUNC(generic_slot_device::read_rom),(generic_slot_device*)m_cart));
}
diff --git a/src/mame/machine/gdrom.cpp b/src/mame/machine/gdrom.cpp
index 5f6bd02fe17..a25cc5d5373 100644
--- a/src/mame/machine/gdrom.cpp
+++ b/src/mame/machine/gdrom.cpp
@@ -22,18 +22,50 @@
/*
- Following data contain real command reply obfuscated, it is extracted by such code:
-
- for (uint32_t i = 0, offset = 0; i < length; i++)
+ Officially not documented security-related packet commands:
+
+ SYS_CHK_SECU (70h) Media security check
+ Parameters: 1byte - R0011111, R - "recheck" (it seems actual security check performed automatically at drive power on or when disc was inserted, so normally this and next command returns result of already performed check.
+ however, when MSB R bit is 1 will be forced media security recheck)
+ Result: none
+ SYS_REQ_SECU (71h) Request security data
+ Parameters: 1byte - always 0x1f
+ Result: a bit less than 1Kbyte chunk of data (length vary each time), contains real command reply obfuscated, which is extracted by such code:
+
+ u8 reply[], real_reply[];
+ for (u32 i = 0, offset = 0; i < length; i++)
{
offset++;
- offset += GDROM_Cmd71_Reply[offset] - 2;
- result[i] = GDROM_Cmd71_Reply[offset++];
+ u32 skip = reply[offset] - 2; // normally skip value is < 0x10, might be used to identify real reply length
+ offset += skip;
+ real_reply[i] = reply[offset++];
}
- in the case of cmd 0x71 only 1 byte extracted, and later verified for &0x10.
+ Real reply is 43 byte:
+ struct sec_reply {
+ u8 check_result; // 0x1f - valid GD-ROM, 0x10 - valid Mil-CD (in this case following char[] fields is empty, 0x00-filled)
+ char key_id[10]; // presumable Disc ID (T-xxxxxx or HDR-xxxxx etc)
+ char key_maker_id[16]; // presumable "SEGA ENTERPRISES"
+ char hard_id[16]; // presumable "SEGA SEGAKATANA "
+ };
+
+ *_id fields names came from Dev.box "Checker BIOS" disassembly, contents meaning is guesswork because all the reply dumps we have now was dumped with Mil-CD disc inserted but not GD-ROM.
+ Presumable these data somehow encoded in GD-ROM disc HD area Lead-in (or Security Ring area ?), and compared with data in LD area IP.BIN by GD-drive firmware,
+ as described in Sega patent EP0935242A1 https://patents.google.com/patent/EP0935242A1
+
+ Dreamcast BIOS code verify only 1st result byte, if it's 5th bit (0x10) == 1.
+ Naomi DIMM firmware verify if result byte equal to 0x1f.
+
+ SYS_CHG_COMD (72h) ??? Authentication for next command ?
+ Parameters: 1byte, probably key/password, in retail Dreamcast - 5th byte of unit SN# (located in flash ROM at 1A05Ah), 0 in Dev.box checker BIOS.
+ Result: none
+
+ SYS_REQ_COMD (73h) Request command list
+ Parameters: none
+ Result: chunk of data where obfuscated real reply, see command 71.
+ real result: 14 bytes - codes of all regular (not security) packet commands supported by drive (00 10 11 12 13 14 15 16 20 21 22 30 31 40).
- SysCalls/BIOS uses same extract routine for command 0x72 (14 bytes), but it seems not used on practice
+ Dreamcast BIOS SysCalls contain commands 0x72/73 routine, but it seems not used at practice.
*/
static const uint8_t GDROM_Cmd71_Reply[] =
@@ -233,7 +265,7 @@ void gdrom_device::ExecCommand()
break;
}
- case 0x70: // unknown, return no data, always followed by cmd 0x71, command[1] parameter can be 0x1f or 0x9f
+ case 0x70: // security check, return no data, always followed by cmd 0x71, command[1] parameter can be 0x1f or 0x9f
m_phase = SCSI_PHASE_STATUS;
m_status_code = SCSI_STATUS_CODE_GOOD;
m_transfer_length = 0;
diff --git a/src/mame/machine/harddriv.cpp b/src/mame/machine/harddriv.cpp
index fbae3bc7b54..5ef10fbb81d 100644
--- a/src/mame/machine/harddriv.cpp
+++ b/src/mame/machine/harddriv.cpp
@@ -144,7 +144,7 @@ READ16_MEMBER( harddriv_state::hd68k_gsp_io_r )
uint16_t result;
offset = (offset / 2) ^ 1;
m_hd34010_host_access = true;
- result = m_gsp->host_r(space, offset, 0xffff);
+ result = m_gsp->host_r(offset);
m_hd34010_host_access = false;
return result;
}
@@ -154,7 +154,7 @@ WRITE16_MEMBER( harddriv_state::hd68k_gsp_io_w )
{
offset = (offset / 2) ^ 1;
m_hd34010_host_access = true;
- m_gsp->host_w(space, offset, data, 0xffff);
+ m_gsp->host_w(offset, data);
m_hd34010_host_access = false;
}
@@ -171,7 +171,7 @@ READ16_MEMBER( harddriv_state::hd68k_msp_io_r )
uint16_t result;
offset = (offset / 2) ^ 1;
m_hd34010_host_access = true;
- result = m_msp.found() ? m_msp->host_r(space, offset, 0xffff) : 0xffff;
+ result = m_msp.found() ? m_msp->host_r(offset) : 0xffff;
m_hd34010_host_access = false;
return result;
}
@@ -183,7 +183,7 @@ WRITE16_MEMBER( harddriv_state::hd68k_msp_io_w )
if (m_msp.found())
{
m_hd34010_host_access = true;
- m_msp->host_w(space, offset, data, 0xffff);
+ m_msp->host_w(offset, data);
m_hd34010_host_access = false;
}
}
@@ -312,7 +312,7 @@ WRITE16_MEMBER( harddriv_state::hd68k_adc_control_w )
COMBINE_DATA(&m_adc_control);
/* handle a write to the 8-bit ADC address select */
- m_adc8->address_w(space, 0, m_adc_control & 0x07);
+ m_adc8->address_w(m_adc_control & 0x07);
m_adc8->start_w(BIT(m_adc_control, 3));
/* handle a write to the 12-bit ADC address select */
@@ -464,7 +464,7 @@ READ16_MEMBER( harddriv_state::hd68k_zram_r )
data |= m_210e->read(space, offset, mem_mask);
if (ACCESSING_BITS_8_15)
- data |= m_200e->read(space, offset, mem_mask >> 8) << 8;
+ data |= m_200e->read(offset) << 8;
return data;
}
@@ -478,7 +478,7 @@ WRITE16_MEMBER( harddriv_state::hd68k_zram_w )
m_210e->write(space, offset, data, mem_mask);
if (ACCESSING_BITS_8_15)
- m_200e->write(space, offset, data >> 8, mem_mask >> 8);
+ m_200e->write(offset, data >> 8);
}
}
@@ -503,7 +503,7 @@ WRITE_LINE_MEMBER(harddriv_state::harddriv_duart_irq_handler)
*
*************************************/
-WRITE16_MEMBER( harddriv_state::hdgsp_io_w )
+void harddriv_state::hdgsp_io_w(offs_t offset, u16 data, u16 mem_mask)
{
/* detect an enabling of the shift register and force yielding */
if (offset == REG_DPYCTL)
@@ -520,10 +520,8 @@ WRITE16_MEMBER( harddriv_state::hdgsp_io_w )
screen_device &scr = m_gsp->screen();
/* detect changes to HEBLNK and HSBLNK and force an update before they change */
- if ((offset == REG_HEBLNK || offset == REG_HSBLNK) && data != m_gsp->io_register_r(space, offset, 0xffff))
+ if ((offset == REG_HEBLNK || offset == REG_HSBLNK) && data != m_gsp->io_register_r(offset))
scr.update_partial(scr.vpos() - 1);
-
- m_gsp->io_register_w(space, offset, data, mem_mask);
}
diff --git a/src/mame/machine/hng64_net.cpp b/src/mame/machine/hng64_net.cpp
index fe98e1ee974..eb862354e57 100644
--- a/src/mame/machine/hng64_net.cpp
+++ b/src/mame/machine/hng64_net.cpp
@@ -142,8 +142,9 @@ void hng64_state::reset_net()
m_mmub[5] = 0; // rolls back to 0xffff
}
-MACHINE_CONFIG_START(hng64_state::hng64_network)
- MCFG_DEVICE_ADD("network", KL5C80A12, HNG64_MASTER_CLOCK / 4) /* KL5C80A12CFP - binary compatible with Z80. */
- MCFG_DEVICE_PROGRAM_MAP(hng_comm_map)
- MCFG_DEVICE_IO_MAP(hng_comm_io_map)
-MACHINE_CONFIG_END
+void hng64_state::hng64_network(machine_config &config)
+{
+ KL5C80A12(config, m_comm, HNG64_MASTER_CLOCK / 4); /* KL5C80A12CFP - binary compatible with Z80. */
+ m_comm->set_addrmap(AS_PROGRAM, &hng64_state::hng_comm_map);
+ m_comm->set_addrmap(AS_IO, &hng64_state::hng_comm_io_map);
+}
diff --git a/src/mame/machine/hp9825_tape.cpp b/src/mame/machine/hp9825_tape.cpp
index d53b75652c5..f2f12135ef1 100644
--- a/src/mame/machine/hp9825_tape.cpp
+++ b/src/mame/machine/hp9825_tape.cpp
@@ -99,7 +99,8 @@ hp9825_tape_device::hp9825_tape_device(const machine_config &mconfig, const char
{
}
-MACHINE_CONFIG_START(hp9825_tape_device::device_add_mconfig)
+void hp9825_tape_device::device_add_mconfig(machine_config &config)
+{
TTL74123(config , m_short_gap_timer , 0);
m_short_gap_timer->set_connection_type(TTL74123_NOT_GROUNDED_NO_DIODE);
m_short_gap_timer->set_resistor_value(RES_K(37.9));
@@ -114,7 +115,7 @@ MACHINE_CONFIG_START(hp9825_tape_device::device_add_mconfig)
m_long_gap_timer->set_capacitor_value(CAP_U(0.22));
m_long_gap_timer->set_clear_pin_value(1);
m_long_gap_timer->out_cb().set(FUNC(hp9825_tape_device::long_gap_w));
-MACHINE_CONFIG_END
+}
void hp9825_tape_device::device_start()
{
diff --git a/src/mame/machine/hp9845_printer.cpp b/src/mame/machine/hp9845_printer.cpp
index 0342f39e5dd..3c053cdb07b 100644
--- a/src/mame/machine/hp9845_printer.cpp
+++ b/src/mame/machine/hp9845_printer.cpp
@@ -137,10 +137,11 @@ const tiny_rom_entry *hp9845_printer_device::device_rom_region() const
return ROM_NAME(hp9845_printer);
}
-MACHINE_CONFIG_START(hp9845_printer_device::device_add_mconfig)
- MCFG_DEVICE_ADD("prt_alpha", BITBANGER, 0)
- MCFG_DEVICE_ADD("prt_graphic", BITBANGER, 0)
-MACHINE_CONFIG_END
+void hp9845_printer_device::device_add_mconfig(machine_config &config)
+{
+ BITBANGER(config, m_prt_alpha_out, 0);
+ BITBANGER(config, m_prt_graph_out, 0);
+}
void hp9845_printer_device::device_start()
{
diff --git a/src/mame/machine/hpc1.cpp b/src/mame/machine/hpc1.cpp
index 9bce71552bb..7d6dfd6fff3 100644
--- a/src/mame/machine/hpc1.cpp
+++ b/src/mame/machine/hpc1.cpp
@@ -10,9 +10,9 @@
#include "cpu/mips/mips3.h"
#include "bus/rs232/rs232.h"
#include "bus/rs232/hlemouse.h"
-#include "bus/scsi/scsi.h"
-#include "bus/scsi/scsicd512.h"
-#include "bus/scsi/scsihd.h"
+#include "machine/nscsi_bus.h"
+#include "machine/nscsi_cd.h"
+#include "machine/nscsi_hd.h"
#include "bus/sgikbd/sgikbd.h"
#include "machine/hpc1.h"
#include "speaker.h"
@@ -28,9 +28,10 @@
#define LOG_DUART1 (1 << 8)
#define LOG_DUART2 (1 << 9)
#define LOG_PIT (1 << 10)
+#define LOG_CHAIN (1 << 11)
#define LOG_REGS (LOG_UNKNOWN | LOG_READS | LOG_WRITES)
#define LOG_DUART (LOG_DUART0 | LOG_DUART1 | LOG_DUART2)
-#define LOG_ALL (LOG_REGS | LOG_INT | LOG_EEPROM | LOG_SCSI | LOG_SCSI_DMA | LOG_DUART | LOG_PIT)
+#define LOG_ALL (LOG_REGS | LOG_INT | LOG_EEPROM | LOG_SCSI | LOG_SCSI_DMA | LOG_DUART | LOG_PIT | LOG_CHAIN)
#define VERBOSE (LOG_UNKNOWN)
#include "logmacro.h"
@@ -50,7 +51,7 @@ hpc1_device::hpc1_device(const machine_config &mconfig, const char *tag, device_
: device_t(mconfig, SGI_HPC1, tag, owner, clock)
, m_maincpu(*this, finder_base::DUMMY_TAG)
, m_eeprom(*this, finder_base::DUMMY_TAG)
- , m_wd33c93(*this, "wd33c93")
+ , m_wd33c93(*this, "scsibus:0:wd33c93")
, m_scc(*this, "scc%u", 0U)
, m_pit(*this, "pit")
, m_rtc(*this, "rtc")
@@ -68,14 +69,14 @@ void hpc1_device::device_start()
save_item(NAME(m_vme_int_mask));
save_item(NAME(m_scsi_dma.m_desc));
- save_item(NAME(m_scsi_dma.m_ctrl));
save_item(NAME(m_scsi_dma.m_addr));
- save_item(NAME(m_scsi_dma.m_flag));
- save_item(NAME(m_scsi_dma.m_next));
+ save_item(NAME(m_scsi_dma.m_ctrl));
save_item(NAME(m_scsi_dma.m_length));
+ save_item(NAME(m_scsi_dma.m_next));
+ save_item(NAME(m_scsi_dma.m_irq));
+ save_item(NAME(m_scsi_dma.m_drq));
save_item(NAME(m_scsi_dma.m_to_mem));
save_item(NAME(m_scsi_dma.m_active));
- save_item(NAME(m_scsi_dma.m_end));
save_item(NAME(m_duart_int_status));
}
@@ -91,14 +92,14 @@ void hpc1_device::device_reset()
memset(m_vme_int_mask, 0, sizeof(uint32_t) * 2);
m_scsi_dma.m_desc = 0;
- m_scsi_dma.m_ctrl = 0;
m_scsi_dma.m_addr = 0;
- m_scsi_dma.m_flag = 0;
- m_scsi_dma.m_next = 0;
+ m_scsi_dma.m_ctrl = 0;
m_scsi_dma.m_length = 0;
+ m_scsi_dma.m_next = 0;
+ m_scsi_dma.m_irq = false;
+ m_scsi_dma.m_drq = false;
m_scsi_dma.m_to_mem = false;
m_scsi_dma.m_active = false;
- m_scsi_dma.m_end = false;
m_duart_int_status = 0;
@@ -111,8 +112,8 @@ void hpc1_device::device_reset()
void hpc1_device::cdrom_config(device_t *device)
{
- cdda_device *cdda = device->subdevice<cdda_device>("cdda");
- cdda->add_route(ALL_OUTPUTS, "^^mono", 1.0);
+ // cdda_device *cdda = device->subdevice<cdda_device>("cdda");
+ // cdda->add_route(ALL_OUTPUTS, "^^mono", 1.0);
}
void hpc1_device::indigo_mice(device_slot_interface &device)
@@ -120,6 +121,19 @@ void hpc1_device::indigo_mice(device_slot_interface &device)
device.option_add("sgimouse", SGI_HLE_SERIAL_MOUSE);
}
+void hpc1_device::scsi_devices(device_slot_interface &device)
+{
+ device.option_add("cdrom", NSCSI_CDROM_SGI);
+ device.option_add("harddisk", NSCSI_HARDDISK);
+}
+
+void hpc1_device::wd33c93(device_t *device)
+{
+ device->set_clock(10000000);
+ downcast<wd33c93_device *>(device)->irq_cb().set(*this, FUNC(hpc1_device::scsi_irq));
+ downcast<wd33c93_device *>(device)->drq_cb().set(*this, FUNC(hpc1_device::scsi_drq));
+}
+
void hpc1_device::device_add_mconfig(machine_config &config)
{
SCC85C30(config, m_scc[0], SCC_PCLK);
@@ -159,17 +173,19 @@ void hpc1_device::device_add_mconfig(machine_config &config)
rs232b.dcd_handler().set(m_scc[1], FUNC(scc85c30_device::dcdb_w));
rs232b.rxd_handler().set(m_scc[1], FUNC(scc85c30_device::rxb_w));
- scsi_port_device &scsi(SCSI_PORT(config, "scsi"));
- scsi.set_slot_device(1, "harddisk", SCSIHD, DEVICE_INPUT_DEFAULTS_NAME(SCSI_ID_1));
- scsi.set_slot_device(2, "cdrom", RRD45, DEVICE_INPUT_DEFAULTS_NAME(SCSI_ID_4));
- scsi.slot(2).set_option_machine_config("cdrom", cdrom_config);
+ NSCSI_BUS(config, "scsibus", 0);
+ NSCSI_CONNECTOR(config, "scsibus:0").option_set("wd33c93", WD33C93)
+ .machine_config([this](device_t *device) { wd33c93(device); });
+ NSCSI_CONNECTOR(config, "scsibus:1", scsi_devices, "harddisk", false);
+ NSCSI_CONNECTOR(config, "scsibus:2", scsi_devices, nullptr, false);
+ NSCSI_CONNECTOR(config, "scsibus:3", scsi_devices, nullptr, false);
+ NSCSI_CONNECTOR(config, "scsibus:4", scsi_devices, "cdrom", false);
+ NSCSI_CONNECTOR(config, "scsibus:5", scsi_devices, nullptr, false);
+ NSCSI_CONNECTOR(config, "scsibus:6", scsi_devices, nullptr, false);
+ NSCSI_CONNECTOR(config, "scsibus:7", scsi_devices, nullptr, false);
DP8573(config, m_rtc);
- WD33C93(config, m_wd33c93);
- m_wd33c93->set_scsi_port("scsi");
- m_wd33c93->irq_cb().set(FUNC(hpc1_device::scsi_irq));
-
PIT8254(config, m_pit, 0);
m_pit->set_clk<0>(1000000);
m_pit->set_clk<1>(1000000);
@@ -207,13 +223,13 @@ READ32_MEMBER(hpc1_device::read)
return 0x00000000;
case 0x0120/4:
{
- uint32_t ret = m_wd33c93->read(space, 0) << 8;
+ uint32_t ret = m_wd33c93->indir_addr_r() << 8;
LOGMASKED(LOG_SCSI, "%s: HPC SCSI Offset 0 Read: %08x & %08x\n", machine().describe_context(), ret, mem_mask);
return ret;
}
case 0x0124/4:
{
- uint32_t ret = m_wd33c93->read(space, 1) << 8;
+ uint32_t ret = m_wd33c93->indir_reg_r() << 8;
LOGMASKED(LOG_SCSI, "%s: HPC SCSI Offset 1 Read: %08x & %08x\n", machine().describe_context(), ret, mem_mask);
return ret;
}
@@ -332,6 +348,8 @@ WRITE32_MEMBER(hpc1_device::write)
m_scsi_dma.m_ctrl = data &~ (HPC_DMACTRL_FLUSH | HPC_DMACTRL_RESET);
m_scsi_dma.m_to_mem = (m_scsi_dma.m_ctrl & HPC_DMACTRL_TO_MEM);
m_scsi_dma.m_active = (m_scsi_dma.m_ctrl & HPC_DMACTRL_ENABLE);
+ if (m_scsi_dma.m_drq && m_scsi_dma.m_active)
+ do_scsi_dma();
break;
case 0x00ac/4:
@@ -342,14 +360,14 @@ WRITE32_MEMBER(hpc1_device::write)
if (ACCESSING_BITS_8_15)
{
LOGMASKED(LOG_SCSI, "%s: HPC SCSI Controller Address Write: %08x & %08x\n", machine().describe_context(), data, mem_mask);
- m_wd33c93->write(space, 0, (uint8_t)(data >> 8));
+ m_wd33c93->indir_addr_w((uint8_t)(data >> 8));
}
break;
case 0x0124/4:
if (ACCESSING_BITS_8_15)
{
LOGMASKED(LOG_SCSI, "%s: HPC SCSI Controller Data Write: %08x & %08x\n", machine().describe_context(), data, mem_mask);
- m_wd33c93->write(space, 1, (uint8_t)(data >> 8));
+ m_wd33c93->indir_reg_w((uint8_t)(data >> 8));
}
break;
case 0x01b0/4:
@@ -484,134 +502,76 @@ WRITE32_MEMBER(hpc1_device::write)
// SCSI DMA
//**************************************************************************
+void hpc1_device::dump_chain(uint32_t base)
+{
+ const uint32_t addr = m_cpu_space->read_dword(base);
+ const uint32_t ctrl = m_cpu_space->read_dword(base+4);
+ const uint32_t next = m_cpu_space->read_dword(base+8);
+
+ LOGMASKED(LOG_CHAIN, "Chain Node:\n");
+ LOGMASKED(LOG_CHAIN, " Addr: %08x\n", addr);
+ LOGMASKED(LOG_CHAIN, " Ctrl: %08x\n", ctrl);
+ LOGMASKED(LOG_CHAIN, " Next: %08x\n", next);
+
+ if (next != 0 && !BIT(addr, 31))
+ {
+ dump_chain(next & 0x0fffffff);
+ }
+}
void hpc1_device::fetch_chain()
{
- m_scsi_dma.m_flag = m_cpu_space->read_dword(m_scsi_dma.m_desc);
+ m_scsi_dma.m_ctrl = m_cpu_space->read_dword(m_scsi_dma.m_desc);
m_scsi_dma.m_addr = m_cpu_space->read_dword(m_scsi_dma.m_desc+4);
m_scsi_dma.m_next = m_cpu_space->read_dword(m_scsi_dma.m_desc+8);
- m_scsi_dma.m_length = m_scsi_dma.m_flag & 0x1fff;
- LOGMASKED(LOG_SCSI_DMA, "Fetched SCSI DMA Descriptor block:\n");
- LOGMASKED(LOG_SCSI_DMA, " Ctrl: %08x\n", m_scsi_dma.m_flag);
- LOGMASKED(LOG_SCSI_DMA, " Addr: %08x\n", m_scsi_dma.m_addr);
- LOGMASKED(LOG_SCSI_DMA, " Next: %08x\n", m_scsi_dma.m_next);
- LOGMASKED(LOG_SCSI_DMA, " Length: %04x\n", m_scsi_dma.m_length);
- m_scsi_dma.m_end = BIT(m_scsi_dma.m_addr, 31);
- m_scsi_dma.m_addr &= 0x0fffffff;
- m_scsi_dma.m_next &= 0x0fffffff;
+ m_scsi_dma.m_length = m_scsi_dma.m_ctrl & 0x1fff;
+
+ LOGMASKED(LOG_CHAIN, "Fetching chain from %08x:\n", m_scsi_dma.m_desc);
+ LOGMASKED(LOG_CHAIN, " Addr: %08x\n", m_scsi_dma.m_addr);
+ LOGMASKED(LOG_CHAIN, " Ctrl: %08x\n", m_scsi_dma.m_ctrl);
+ LOGMASKED(LOG_CHAIN, " Next: %08x\n", m_scsi_dma.m_next);
}
-void hpc1_device::advance_chain()
+void hpc1_device::decrement_chain()
{
- m_scsi_dma.m_addr++;
m_scsi_dma.m_length--;
if (m_scsi_dma.m_length == 0)
{
- if (m_scsi_dma.m_end)
+ if (BIT(m_scsi_dma.m_addr, 31))
{
- LOGMASKED(LOG_SCSI_DMA, "HPC: Disabling SCSI DMA due to end of chain\n");
m_scsi_dma.m_active = false;
m_scsi_dma.m_ctrl &= ~HPC_DMACTRL_ENABLE;
+ return;
}
- else
- {
- m_scsi_dma.m_desc = m_scsi_dma.m_next;
- fetch_chain();
- }
+ m_scsi_dma.m_desc = m_scsi_dma.m_next & 0x0fffffff;
+ fetch_chain();
}
}
-void hpc1_device::scsi_dma()
+WRITE_LINE_MEMBER(hpc1_device::scsi_drq)
{
- int byte_count = m_wd33c93->get_dma_count();
+ m_scsi_dma.m_drq = state;
- LOGMASKED(LOG_SCSI_DMA, "HPC: Transferring %d bytes %s %08x %s SCSI0\n",
- byte_count, m_scsi_dma.m_to_mem ? "to" : "from", m_scsi_dma.m_addr, m_scsi_dma.m_to_mem ? "from" : "to");
-
- uint8_t dma_buffer[512];
- if (m_scsi_dma.m_to_mem)
+ if (m_scsi_dma.m_drq && m_scsi_dma.m_active)
{
- // HPC SCSI DMA: device to host
- if (byte_count <= 512)
- {
- m_wd33c93->dma_read_data(byte_count, dma_buffer);
-
- for (int i = 0; i < byte_count; i++)
- {
- LOGMASKED(LOG_SCSI_DMA, "HPC: Reading %02x to %08x\n", dma_buffer[i], m_scsi_dma.m_addr);
- m_cpu_space->write_byte(m_scsi_dma.m_addr, dma_buffer[i]);
- advance_chain();
- if (!m_scsi_dma.m_active)
- break;
- }
- }
- else
- {
- while (byte_count)
- {
- int sub_count = m_wd33c93->dma_read_data(512, dma_buffer);
-
- for (int i = 0; i < sub_count; i++)
- {
- LOGMASKED(LOG_SCSI_DMA, "HPC: Reading %02x to %08x\n", dma_buffer[i], m_scsi_dma.m_addr);
- m_cpu_space->write_byte(m_scsi_dma.m_addr, dma_buffer[i]);
- advance_chain();
- if (!m_scsi_dma.m_active)
- break;
- }
-
- byte_count -= sub_count;
- if (!m_scsi_dma.m_active)
- break;
- }
- }
+ do_scsi_dma();
}
+}
+
+void hpc1_device::do_scsi_dma()
+{
+ if (m_scsi_dma.m_to_mem)
+ m_cpu_space->write_byte(m_scsi_dma.m_addr & 0x0fffffff, m_wd33c93->dma_r());
else
+ m_wd33c93->dma_w(m_cpu_space->read_byte(m_scsi_dma.m_addr & 0x0fffffff));
+
+ m_scsi_dma.m_addr++;
+ decrement_chain();
+
+ if (!m_scsi_dma.m_active)
{
- // HPC SCSI DMA: host to device
- if (byte_count <= 512)
- {
- for (int i = 0; i < byte_count; i++)
- {
- dma_buffer[i] = m_cpu_space->read_byte(m_scsi_dma.m_addr);
- LOGMASKED(LOG_SCSI_DMA, "HPC: Writing %02x from %08x\n", dma_buffer[i], m_scsi_dma.m_addr);
- advance_chain();
- if (!m_scsi_dma.m_active)
- break;
- }
-
- m_wd33c93->dma_write_data(byte_count, dma_buffer);
- }
- else
- {
- while (byte_count)
- {
- int sub_count = std::min(512, byte_count);
-
- for (int i = 0; i < sub_count; i++)
- {
- dma_buffer[i] = m_cpu_space->read_byte(m_scsi_dma.m_addr);
- LOGMASKED(LOG_SCSI_DMA, "HPC: Writing %02x from %08x\n", dma_buffer[i], m_scsi_dma.m_addr);
- advance_chain();
- if (!m_scsi_dma.m_active)
- break;
- }
-
- m_wd33c93->dma_write_data(sub_count, dma_buffer);
-
- if (!m_scsi_dma.m_active)
- {
- break;
- }
- else
- {
- byte_count -= sub_count;
- }
- }
- }
+ // clear HPC3 DMA active flag
+ m_scsi_dma.m_ctrl &= ~HPC_DMACTRL_ENABLE;
}
-
- // clear DMA on the controller
- m_wd33c93->clear_dma();
}
//**************************************************************************
@@ -710,11 +670,6 @@ WRITE_LINE_MEMBER(hpc1_device::scsi_irq)
if (state)
{
LOGMASKED(LOG_SCSI, "SCSI: Set IRQ\n");
- int count = m_wd33c93->get_dma_count();
- LOGMASKED(LOG_SCSI_DMA, "SCSI: count %d, active %d\n", count, m_scsi_dma.m_active);
- if (count && m_scsi_dma.m_active)
- scsi_dma();
-
raise_local_irq(0, LOCAL0_SCSI);
}
else
diff --git a/src/mame/machine/hpc1.h b/src/mame/machine/hpc1.h
index efde8747f9d..a5e365f06ab 100644
--- a/src/mame/machine/hpc1.h
+++ b/src/mame/machine/hpc1.h
@@ -14,7 +14,7 @@
#include "machine/dp8573.h"
#include "machine/eepromser.h"
#include "machine/pit8253.h"
-#include "machine/wd33c93.h"
+#include "machine/wd33c9x.h"
#include "machine/z80scc.h"
class hpc1_device : public device_t
@@ -39,6 +39,7 @@ protected:
virtual void device_add_mconfig(machine_config &config) override;
DECLARE_WRITE_LINE_MEMBER(scsi_irq);
+ DECLARE_WRITE_LINE_MEMBER(scsi_drq);
void set_timer_int_clear(uint32_t data);
DECLARE_WRITE_LINE_MEMBER(timer0_int);
@@ -53,9 +54,11 @@ protected:
void lower_local_irq(int channel, uint8_t source_mask);
void update_irq(int channel);
+ void do_scsi_dma();
+
+ void dump_chain(uint32_t base);
void fetch_chain();
- void advance_chain();
- void scsi_dma();
+ void decrement_chain();
required_device<cpu_device> m_maincpu;
required_device<eeprom_serial_93cxx_device> m_eeprom;
@@ -94,18 +97,20 @@ protected:
struct scsi_dma_t
{
uint32_t m_desc;
- uint32_t m_ctrl;
uint32_t m_addr;
- uint32_t m_flag;
+ uint32_t m_ctrl;
+ uint32_t m_length;
uint32_t m_next;
- uint16_t m_length;
+ bool m_irq;
+ bool m_drq;
bool m_to_mem;
bool m_active;
- bool m_end;
};
static void cdrom_config(device_t *device);
+ static void scsi_devices(device_slot_interface &device);
static void indigo_mice(device_slot_interface &device);
+ void wd33c93(device_t *device);
uint8_t m_misc_status;
uint32_t m_cpu_aux_ctrl;
diff --git a/src/mame/machine/hpc3.cpp b/src/mame/machine/hpc3.cpp
index 3728be15dc7..715fda748c9 100644
--- a/src/mame/machine/hpc3.cpp
+++ b/src/mame/machine/hpc3.cpp
@@ -13,10 +13,11 @@
#define LOG_PBUS_DMA (1 << 1)
#define LOG_SCSI (1 << 2)
#define LOG_SCSI_DMA (1 << 3)
-#define LOG_ETHERNET (1 << 4)
-#define LOG_PBUS4 (1 << 5)
-#define LOG_CHAIN (1 << 6)
-#define LOG_ALL (LOG_UNKNOWN | LOG_PBUS_DMA | LOG_SCSI | LOG_SCSI_DMA | LOG_ETHERNET | LOG_PBUS4 | LOG_CHAIN)
+#define LOG_SCSI_IRQ (1 << 4)
+#define LOG_ETHERNET (1 << 5)
+#define LOG_PBUS4 (1 << 6)
+#define LOG_CHAIN (1 << 7)
+#define LOG_ALL (LOG_UNKNOWN | LOG_PBUS_DMA | LOG_SCSI | LOG_SCSI_DMA | LOG_SCSI_IRQ | LOG_ETHERNET | LOG_PBUS4 | LOG_CHAIN)
#define VERBOSE (0)
#include "logmacro.h"
@@ -52,6 +53,7 @@ void hpc3_device::device_start()
save_item(NAME(m_scsi_dma[i].m_length), i);
save_item(NAME(m_scsi_dma[i].m_next), i);
save_item(NAME(m_scsi_dma[i].m_irq), i);
+ save_item(NAME(m_scsi_dma[i].m_drq), i);
save_item(NAME(m_scsi_dma[i].m_big_endian), i);
save_item(NAME(m_scsi_dma[i].m_to_device), i);
save_item(NAME(m_scsi_dma[i].m_active), i);
@@ -60,13 +62,13 @@ void hpc3_device::device_start()
for (uint32_t i = 0; i < 8; i++)
{
save_item(NAME(m_pbus_dma[i].m_active), i);
- save_item(NAME(m_pbus_dma[i].m_buf_ptr), i);
save_item(NAME(m_pbus_dma[i].m_cur_ptr), i);
save_item(NAME(m_pbus_dma[i].m_desc_ptr), i);
save_item(NAME(m_pbus_dma[i].m_desc_flags), i);
save_item(NAME(m_pbus_dma[i].m_next_ptr), i);
save_item(NAME(m_pbus_dma[i].m_bytes_left), i);
save_item(NAME(m_pbus_dma[i].m_config), i);
+ save_item(NAME(m_pbus_dma[i].m_control), i);
m_pbus_dma[i].m_timer = timer_alloc(TIMER_PBUS_DMA + i);
m_pbus_dma[i].m_timer->adjust(attotime::never);
@@ -85,12 +87,12 @@ void hpc3_device::device_reset()
{
m_pbus_dma[i].m_active = 0;
m_pbus_dma[i].m_cur_ptr = 0;
- m_pbus_dma[i].m_buf_ptr = 0;
m_pbus_dma[i].m_desc_ptr = 0;
m_pbus_dma[i].m_desc_flags = 0;
m_pbus_dma[i].m_next_ptr = 0;
m_pbus_dma[i].m_bytes_left = 0;
m_pbus_dma[i].m_config = 0;
+ m_pbus_dma[i].m_control = 0;
m_pbus_dma[i].m_active = false;
m_pbus_dma[i].m_timer->adjust(attotime::never);
@@ -111,7 +113,6 @@ void hpc3_device::device_add_mconfig(machine_config &config)
m_rdac->add_route(ALL_OUTPUTS, "rspeaker", 0.25);
voltage_regulator_device &vreg = VOLTAGE_REGULATOR(config, "vref");
- vreg.set_output(5.0);
vreg.add_route(0, "ldac", 1.0, DAC_VREF_POS_INPUT);
vreg.add_route(0, "rdac", 1.0, DAC_VREF_POS_INPUT);
vreg.add_route(0, "ldac", -1.0, DAC_VREF_NEG_INPUT);
@@ -270,6 +271,11 @@ WRITE32_MEMBER(hpc3_device::hd_enet_w)
m_scsi_dma[0].m_big_endian = (m_scsi_dma[0].m_ctrl & HPC3_DMACTRL_ENDIAN);
m_scsi_dma[0].m_active = (m_scsi_dma[0].m_ctrl & HPC3_DMACTRL_ENABLE);
m_scsi_dma[0].m_irq = (m_scsi_dma[0].m_ctrl & HPC3_DMACTRL_IRQ);
+ m_wd33c93->reset_w(BIT(data, 6));
+ if (m_scsi_dma[0].m_drq && m_scsi_dma[0].m_active)
+ {
+ do_scsi_dma(0);
+ }
break;
case 0x4000/4:
LOGMASKED(LOG_ETHERNET, "%s: HPC3 Ethernet CBP Write: %08x\n", machine().describe_context(), data);
@@ -297,7 +303,7 @@ READ32_MEMBER(hpc3_device::hd_r)
case 0x4000/4:
if (ACCESSING_BITS_0_7)
{
- const uint8_t ret = index ? m_wd33c93_2->read(space, 0) : m_wd33c93->read(space, 0);
+ const uint8_t ret = index ? m_wd33c93_2->indir_addr_r() : m_wd33c93->indir_addr_r();
LOGMASKED(LOG_SCSI, "%s: SCSI%d Read 0: %02x\n", machine().describe_context(), index, ret);
return ret;
}
@@ -306,7 +312,7 @@ READ32_MEMBER(hpc3_device::hd_r)
case 0x4004/4:
if (ACCESSING_BITS_0_7)
{
- const uint8_t ret = index ? m_wd33c93_2->read(space, 1) : m_wd33c93->read(space, 1);
+ const uint8_t ret = index ? m_wd33c93_2->indir_reg_r() : m_wd33c93->indir_reg_r();
LOGMASKED(LOG_SCSI, "%s: SCSI%d Read 1: %02x\n", machine().describe_context(), index, ret);
return ret;
}
@@ -331,14 +337,14 @@ WRITE32_MEMBER(hpc3_device::hd_w)
if (ACCESSING_BITS_0_7)
{
LOGMASKED(LOG_SCSI, "%s: SCSI%d Write 0 = %02x\n", machine().describe_context(), index, (uint8_t)data);
- index ? m_wd33c93_2->write(space, 0, data & 0xff) : m_wd33c93->write(space, 0, data & 0xff);
+ index ? m_wd33c93_2->indir_addr_w(data & 0xff) : m_wd33c93->indir_addr_w(data & 0xff);
}
break;
case 0x0001:
if (ACCESSING_BITS_0_7)
{
LOGMASKED(LOG_SCSI, "%s: SCSI%d Write 1 = %02x\n", machine().describe_context(), index, (uint8_t)data);
- index ? m_wd33c93_2->write(space, 1, data & 0xff) : m_wd33c93->write(space, 1, data & 0xff);
+ index ? m_wd33c93_2->indir_reg_w(data & 0xff) : m_wd33c93->indir_reg_w(data & 0xff);
}
break;
default:
@@ -465,7 +471,7 @@ READ32_MEMBER(hpc3_device::pbusdma_r)
switch (offset & 0x07ff)
{
case 0x0000/4:
- ret = dma.m_buf_ptr;
+ ret = dma.m_cur_ptr;
LOGMASKED(LOG_PBUS_DMA, "%s: PBUS DMA Channel %d Buffer Pointer Read: %08x & %08x\n", machine().describe_context(), channel, ret, mem_mask);
break;
case 0x0004/4:
@@ -490,21 +496,17 @@ WRITE32_MEMBER(hpc3_device::pbusdma_w)
switch (offset & 0x07ff)
{
- case 0x0000/4:
- LOGMASKED(LOG_PBUS_DMA, "%s: PBUS DMA Channel %d Buffer Pointer Write: %08x\n", machine().describe_context(), channel, data);
- dma.m_buf_ptr = data;
- break;
case 0x0004/4:
LOGMASKED(LOG_PBUS_DMA, "%s: PBUS DMA Channel %d Descriptor Pointer Write: %08x\n", machine().describe_context(), channel, data);
dma.m_desc_ptr = data;
- LOGMASKED(LOG_PBUS_DMA, "%s: PBUS_DMA_DescPtr = %08x\n", machine().describe_context(), dma.m_desc_ptr); fflush(stdout);
+ LOGMASKED(LOG_PBUS_DMA, "%s: PBUS_DMA_DescPtr = %08x\n", machine().describe_context(), dma.m_desc_ptr);
dma.m_cur_ptr = space.read_dword(dma.m_desc_ptr);
dma.m_desc_flags = space.read_dword(dma.m_desc_ptr + 4);
dma.m_next_ptr = space.read_dword(dma.m_desc_ptr + 8);
dma.m_bytes_left = dma.m_desc_flags & 0x7fffffff;
- LOGMASKED(LOG_PBUS_DMA, "%s: PBUS_DMA_CurPtr = %08x\n", machine().describe_context(), dma.m_cur_ptr); fflush(stdout);
- LOGMASKED(LOG_PBUS_DMA, "%s: PBUS_DMA_BytesLeft = %08x\n", machine().describe_context(), dma.m_bytes_left); fflush(stdout);
- LOGMASKED(LOG_PBUS_DMA, "%s: PBUS_DMA_NextPtr = %08x\n", machine().describe_context(), dma.m_next_ptr); fflush(stdout);
+ LOGMASKED(LOG_PBUS_DMA, "%s: PBUS_DMA_CurPtr = %08x\n", machine().describe_context(), dma.m_cur_ptr);
+ LOGMASKED(LOG_PBUS_DMA, "%s: PBUS_DMA_BytesLeft = %08x\n", machine().describe_context(), dma.m_bytes_left);
+ LOGMASKED(LOG_PBUS_DMA, "%s: PBUS_DMA_NextPtr = %08x\n", machine().describe_context(), dma.m_next_ptr);
break;
case 0x1000/4:
LOGMASKED(LOG_PBUS_DMA, "%s: PBUS DMA Channel %d Control Register Write: %08x\n", machine().describe_context(), channel, data);
@@ -530,7 +532,7 @@ WRITE32_MEMBER(hpc3_device::pbusdma_w)
LOGMASKED(LOG_PBUS_DMA, " FIFO Begin: Row %04x\n", (data & PBUS_CTRL_FIFO_BEG) >> 16);
LOGMASKED(LOG_PBUS_DMA, " FIFO End: Row %04x\n", (data & PBUS_CTRL_FIFO_END) >> 24);
- if (((data & PBUS_CTRL_DMASTART) && (data & PBUS_CTRL_LOAD_EN)) && (channel == 1 || channel == 2))
+ if (((data & PBUS_CTRL_DMASTART) && (data & PBUS_CTRL_LOAD_EN)) && channel < 4)
{
LOGMASKED(LOG_PBUS_DMA, " Starting DMA\n");
dma.m_timer->adjust(attotime::from_hz(44100));
@@ -664,14 +666,18 @@ void hpc3_device::decrement_chain(int channel)
void hpc3_device::scsi_drq(bool state, int channel)
{
-#if 0
scsi_dma_t &dma = m_scsi_dma[channel];
+ dma.m_drq = state;
- if (!dma.m_active)
+ if (dma.m_drq && dma.m_active)
{
- LOGMASKED(LOG_SCSI_DMA, "HPC3: SCSI%d DRQ set while no active SCSI DMA!\n", channel);
- return;
+ do_scsi_dma(channel);
}
+}
+
+void hpc3_device::do_scsi_dma(int channel)
+{
+ scsi_dma_t &dma = m_scsi_dma[channel];
if (dma.m_to_device)
m_wd33c93->dma_w(m_cpu_space->read_byte(dma.m_big_endian ? BYTE4_XOR_BE(dma.m_addr) : BYTE4_XOR_LE(dma.m_addr)));
@@ -686,7 +692,6 @@ void hpc3_device::scsi_drq(bool state, int channel)
// clear HPC3 DMA active flag
dma.m_ctrl &= ~HPC3_DMACTRL_ENABLE;
}
-#endif
}
WRITE_LINE_MEMBER(hpc3_device::scsi0_drq)
@@ -699,6 +704,7 @@ WRITE_LINE_MEMBER(hpc3_device::scsi1_drq)
scsi_drq(state, 1);
}
+#if 0
void hpc3_device::scsi_dma(int channel)
{
int byte_count = channel ? m_wd33c93_2->get_dma_count() : m_wd33c93->get_dma_count();
@@ -812,18 +818,21 @@ void hpc3_device::scsi_dma(int channel)
// clear DMA on the controller
m_wd33c93->clear_dma();
}
+#endif
WRITE_LINE_MEMBER(hpc3_device::scsi0_irq)
{
if (state)
{
- if (m_wd33c93->get_dma_count() && m_scsi_dma[0].m_active)
- scsi_dma(0);
+ LOGMASKED(LOG_SCSI_IRQ, "Raising SCSI 0 IRQ\n");
+ //if (m_wd33c93->get_dma_count() && m_scsi_dma[0].m_active)
+ // scsi_dma(0);
m_ioc2->raise_local_irq(0, ioc2_device::INT3_LOCAL0_SCSI0);
}
else
{
+ LOGMASKED(LOG_SCSI_IRQ, "Lowering SCSI 0 IRQ\n");
m_ioc2->lower_local_irq(0, ioc2_device::INT3_LOCAL0_SCSI0);
}
}
@@ -832,13 +841,17 @@ WRITE_LINE_MEMBER(hpc3_device::scsi1_irq)
{
if (state)
{
- if (m_wd33c93_2->get_dma_count() && m_scsi_dma[1].m_active)
- scsi_dma(1);
+ LOGMASKED(LOG_SCSI_IRQ, "Raising SCSI 1 IRQ\n");
+
+ //if (m_wd33c93_2->get_dma_count() && m_scsi_dma[1].m_active)
+ // scsi_dma(1);
m_ioc2->raise_local_irq(0, ioc2_device::INT3_LOCAL0_SCSI1);
}
else
{
+ LOGMASKED(LOG_SCSI_IRQ, "Lowering SCSI 0 IRQ\n");
+
m_ioc2->lower_local_irq(0, ioc2_device::INT3_LOCAL0_SCSI1);
}
}
diff --git a/src/mame/machine/hpc3.h b/src/mame/machine/hpc3.h
index 94d6c65e595..10c658bd362 100644
--- a/src/mame/machine/hpc3.h
+++ b/src/mame/machine/hpc3.h
@@ -11,12 +11,11 @@
#pragma once
-#include "cpu/mips/mips3.h"
#include "machine/ds1386.h"
#include "machine/eepromser.h"
#include "machine/hal2.h"
#include "machine/ioc2.h"
-#include "machine/wd33c93.h"
+#include "machine/wd33c9x.h"
#include "sound/dac.h"
#include "sound/volt_reg.h"
#include "speaker.h"
@@ -78,25 +77,26 @@ protected:
DECLARE_WRITE32_MEMBER(pio_config_w);
void do_pbus_dma(uint32_t channel);
+ void do_scsi_dma(int channel);
void dump_chain(uint32_t base);
void fetch_chain(int channel);
void decrement_chain(int channel);
void scsi_drq(bool state, int channel);
- void scsi_dma(int channel);
+ //void scsi_dma(int channel);
static const device_timer_id TIMER_PBUS_DMA = 0;
struct pbus_dma_t
{
bool m_active;
- uint32_t m_buf_ptr;
uint32_t m_cur_ptr;
uint32_t m_desc_ptr;
uint32_t m_desc_flags;
uint32_t m_next_ptr;
uint32_t m_bytes_left;
uint32_t m_config;
+ uint32_t m_control;
emu_timer *m_timer;
};
@@ -131,9 +131,9 @@ protected:
HPC3_DMACTRL_ENABLE = 0x10,
};
- required_device<mips3_device> m_maincpu;
- required_device<wd33c93_device> m_wd33c93;
- optional_device<wd33c93_device> m_wd33c93_2;
+ required_device<cpu_device> m_maincpu;
+ required_device<wd33c93b_device> m_wd33c93;
+ optional_device<wd33c93b_device> m_wd33c93_2;
required_device<eeprom_serial_93cxx_device> m_eeprom;
required_device<ds1386_device> m_rtc;
required_device<ioc2_device> m_ioc2;
@@ -153,6 +153,7 @@ protected:
uint32_t m_length;
uint32_t m_next;
bool m_irq;
+ bool m_drq;
bool m_big_endian;
bool m_to_device;
bool m_active;
diff --git a/src/mame/machine/ibm6580_fdc.cpp b/src/mame/machine/ibm6580_fdc.cpp
index 8a3e997ef62..ff838bf9a49 100644
--- a/src/mame/machine/ibm6580_fdc.cpp
+++ b/src/mame/machine/ibm6580_fdc.cpp
@@ -3,17 +3,15 @@
#include "emu.h"
#include "ibm6580_fdc.h"
-#define VERBOSE_DBG 2 /* general debug messages */
-#define DBG_LOG(N,M,A) \
- do { \
- if(VERBOSE_DBG>=N) \
- { \
- if( M ) \
- logerror("%11.6f at %s: %-10s",machine().time().as_double(),machine().describe_context(),(char*)M ); \
- logerror A; \
- } \
- } while (0)
+//#define LOG_GENERAL (1U << 0) //defined in logmacro.h already
+#define LOG_DEBUG (1U << 1)
+
+//#define VERBOSE (LOG_GENERAL | LOG_DEBUG)
+//#define LOG_OUTPUT_FUNC printf
+#include "logmacro.h"
+
+#define LOGDBG(...) LOGMASKED(LOG_DEBUG, __VA_ARGS__)
DEFINE_DEVICE_TYPE(DW_FDC, dw_fdc_device, "dw_fdc", "IBM Displaywriter Floppy")
@@ -44,8 +42,8 @@ void dw_fdc_device::device_add_mconfig(machine_config &config)
UPD765A(config, "upd765", 24_MHz_XTAL / 3, false, false);
// m_upd_fdc->intrq_wr_callback().set("pic8259", FUNC(pic8259_device::ir4_w));
// m_upd_fdc->drq_wr_callback().set("dma8257", FUNC(dma8257_device::XXX));
-// MCFG_FLOPPY_DRIVE_ADD(UPD765_TAG ":0", wangpc_floppies, "525dd", wangpc_state::floppy_formats)
-// MCFG_FLOPPY_DRIVE_ADD(UPD765_TAG ":1", wangpc_floppies, "525dd", wangpc_state::floppy_formats)
+// FLOPPY_CONNECTOR(config, UPD765_TAG ":0", wangpc_floppies, "525dd", wangpc_state::floppy_formats);
+// FLOPPY_CONNECTOR(config, UPD765_TAG ":1", wangpc_floppies, "525dd", wangpc_state::floppy_formats);
}
@@ -80,35 +78,35 @@ WRITE8_MEMBER( dw_fdc_device::p1_w )
{
m_p1 = data;
- DBG_LOG(2,"p1",( "<- %02x\n", data, m_p1));
+ LOGDBG("p1 <- %02x\n", data, m_p1);
}
WRITE8_MEMBER( dw_fdc_device::p2_w )
{
m_p2 = data;
- DBG_LOG(2,"p2",( "<- %02x\n", data));
+ LOGDBG("p2 <- %02x\n", data);
}
READ8_MEMBER( dw_fdc_device::p2_r )
{
uint8_t data = m_p2;
- DBG_LOG(2,"p2",( "== %02x\n", data));
+ LOGDBG("p2 == %02x\n", data);
return data;
}
READ_LINE_MEMBER( dw_fdc_device::t0_r )
{
- DBG_LOG(2,"t0",( "== %d\n", m_t0));
+ LOGDBG("t0 == %d\n", m_t0);
return m_t0;
}
READ_LINE_MEMBER( dw_fdc_device::t1_r )
{
- DBG_LOG(2,"t1",( "== %d\n", m_t1));
+ LOGDBG("t1 == %d\n", m_t1);
return m_t1;
}
diff --git a/src/mame/machine/ibm6580_kbd.cpp b/src/mame/machine/ibm6580_kbd.cpp
index e412388c8cb..35d6aaa2423 100644
--- a/src/mame/machine/ibm6580_kbd.cpp
+++ b/src/mame/machine/ibm6580_kbd.cpp
@@ -3,17 +3,17 @@
#include "emu.h"
#include "ibm6580_kbd.h"
-#define VERBOSE_DBG 0 /* general debug messages */
-#define DBG_LOG(N,M,A) \
- do { \
- if(VERBOSE_DBG>=N) \
- { \
- if( M ) \
- logerror("%11.6f at %s: %-10s",machine().time().as_double(),machine().describe_context(),(char*)M ); \
- logerror A; \
- } \
- } while (0)
+//#define LOG_GENERAL (1U << 0) //defined in logmacro.h already
+#define LOG_DEBUG (1U << 1)
+#define LOG_KEYBOARD (1U << 2)
+
+//#define VERBOSE (LOG_GENERAL | LOG_DEBUG)
+//#define LOG_OUTPUT_FUNC printf
+#include "logmacro.h"
+
+#define LOGDBG(...) LOGMASKED(LOG_DEBUG, __VA_ARGS__)
+#define LOGKBD(...) LOGMASKED(LOG_KEYBOARD, __VA_ARGS__)
DEFINE_DEVICE_TYPE(DW_KEYBOARD, dw_keyboard_device, "dw_kbd", "IBM Displaywriter Keyboard")
@@ -210,7 +210,7 @@ WRITE8_MEMBER( dw_keyboard_device::p1_w )
{
m_drive = data;
- DBG_LOG(2,"p1",( "<- %02x = drive %04x\n", data, m_drive));
+ LOGDBG("p1 <- %02x = drive %04x\n", data, m_drive);
}
WRITE8_MEMBER( dw_keyboard_device::p2_w )
@@ -222,28 +222,28 @@ WRITE8_MEMBER( dw_keyboard_device::p2_w )
m_p2 = data;
m_drive = ((data & 0xf0) << 4);
- DBG_LOG(2,"p2",( "<- %02x = drive %04x sense row %d\n", data, m_drive, data & 7));
+ LOGDBG("p2 <- %02x = drive %04x sense row %d\n", data, m_drive, data & 7);
}
READ8_MEMBER( dw_keyboard_device::p2_r )
{
uint8_t data = m_p2;
- DBG_LOG(2,"p2",( "== %02x\n", data));
+ LOGDBG("p2 == %02x\n", data);
return data;
}
READ_LINE_MEMBER( dw_keyboard_device::t0_r )
{
- DBG_LOG(3,"t0",( "== %d\n", m_ack));
+ LOGKBD("t0 == %d\n", m_ack);
return m_ack;
}
READ_LINE_MEMBER( dw_keyboard_device::t1_r )
{
- DBG_LOG(2,"t1",( "== %d\n", m_keylatch));
+ LOGDBG("t1 == %d\n", m_keylatch);
return m_keylatch;
}
@@ -266,8 +266,8 @@ WRITE8_MEMBER( dw_keyboard_device::bus_w )
*/
if ((data & 0x72) != 0x72)
- DBG_LOG(1,"bus",( "<- %02x = send %d strobe %d clock %d | dip clk %d dip load %d\n",
- data, BIT(data, 0), BIT(data, 1), BIT(data, 4), BIT(data, 5), BIT(data, 6)));
+ LOG("bus <- %02x = send %d strobe %d clock %d | dip clk %d dip load %d\n",
+ data, BIT(data, 0), BIT(data, 1), BIT(data, 4), BIT(data, 5), BIT(data, 6));
m_bus = data;
@@ -284,12 +284,12 @@ WRITE8_MEMBER( dw_keyboard_device::bus_w )
}
m_keylatch = BIT(sense, m_sense);
if (m_keylatch)
- DBG_LOG(1,"bus",("key %02x pressed (drive %04x sense %x)\n", (i << 3) | m_sense, m_drive, m_sense));
+ LOG("bus key %02x pressed (drive %04x sense %x)\n", (i << 3) | m_sense, m_drive, m_sense);
}
if (!BIT(data, 6)) {
m_dip = ~ioport("DIP")->read();
- DBG_LOG(1,"bus",("loaded DIP switch setting 0x%02x\n", m_dip));
+ LOG("bus loaded DIP switch setting 0x%02x\n", m_dip);
m_mcu->set_input_line(MCS48_INPUT_IRQ, m_dip & 1 ? ASSERT_LINE : CLEAR_LINE);
}
diff --git a/src/mame/machine/imds2ioc.cpp b/src/mame/machine/imds2ioc.cpp
index 28cea70c5c8..20863ecc7a4 100644
--- a/src/mame/machine/imds2ioc.cpp
+++ b/src/mame/machine/imds2ioc.cpp
@@ -563,11 +563,12 @@ static void imds2_floppies(device_slot_interface &device)
device.option_add("8sssd", FLOPPY_8_SSSD);
}
-MACHINE_CONFIG_START(imds2ioc_device::device_add_mconfig)
+void imds2ioc_device::device_add_mconfig(machine_config &config)
+{
I8080A(config, m_ioccpu, IOC_XTAL_Y2 / 18); // 2.448 MHz but running at 50% (due to wait states & DMA usage of bus)
m_ioccpu->set_addrmap(AS_PROGRAM, &imds2ioc_device::mem_map);
m_ioccpu->set_addrmap(AS_IO, &imds2ioc_device::io_map);
- MCFG_QUANTUM_TIME(attotime::from_hz(100))
+ config.m_minimum_quantum = attotime::from_hz(100);
// The IOC CRT hw is a bit complex, as the character clock (CCLK) to i8275
// is varied according to the part of the video frame being scanned and according to
@@ -623,8 +624,7 @@ MACHINE_CONFIG_START(imds2ioc_device::device_add_mconfig)
I8271(config, m_iocfdc, IOC_XTAL_Y1 / 2);
m_iocfdc->drq_wr_callback().set(m_iocdma, FUNC(i8257_device::dreq1_w));
- MCFG_FLOPPY_DRIVE_ADD("iocfdc:0", imds2_floppies, "8sssd", floppy_image_device::default_floppy_formats)
- MCFG_SLOT_FIXED(true)
+ FLOPPY_CONNECTOR(config, "iocfdc:0", imds2_floppies, "8sssd", floppy_image_device::default_floppy_formats, true);
I8041(config, m_iocpio, IOC_XTAL_Y3);
m_iocpio->p1_in_cb().set(FUNC(imds2ioc_device::pio_port_p1_r));
@@ -642,7 +642,7 @@ MACHINE_CONFIG_START(imds2ioc_device::device_add_mconfig)
m_centronics->ack_handler().set(FUNC(imds2ioc_device::pio_lpt_ack_w));
m_centronics->busy_handler().set(FUNC(imds2ioc_device::pio_lpt_busy_w));
m_centronics->perror_handler().set(FUNC(imds2ioc_device::pio_lpt_select_w));
-MACHINE_CONFIG_END
+}
ROM_START(imds2ioc)
// ROM definition of IOC cpu (8080A)
diff --git a/src/mame/machine/inder_sb.cpp b/src/mame/machine/inder_sb.cpp
index 0149c180291..871c0e0df14 100644
--- a/src/mame/machine/inder_sb.cpp
+++ b/src/mame/machine/inder_sb.cpp
@@ -150,7 +150,8 @@ void inder_sb_device::sound_io(address_map &map)
}
-MACHINE_CONFIG_START(inder_sb_device::device_add_mconfig)
+void inder_sb_device::device_add_mconfig(machine_config &config)
+{
Z80(config, m_audiocpu, 8000000); // unk freq
m_audiocpu->set_daisy_config(daisy_chain);
m_audiocpu->set_addrmap(AS_PROGRAM, &inder_sb_device::sound_map);
@@ -161,20 +162,20 @@ MACHINE_CONFIG_START(inder_sb_device::device_add_mconfig)
m_ctc->intr_callback().set_inputline(m_audiocpu, 0);
SPEAKER(config, "speaker").front_center();
- MCFG_DEVICE_ADD("dac0", DAC_8BIT_R2R_TWOS_COMPLEMENT, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 0.5) // unknown DAC
- MCFG_DEVICE_ADD("dac1", DAC_8BIT_R2R_TWOS_COMPLEMENT, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 0.5) // unknown DAC
- MCFG_DEVICE_ADD("dac2", DAC_8BIT_R2R_TWOS_COMPLEMENT, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 0.5) // unknown DAC
- MCFG_DEVICE_ADD("dac3", DAC_8BIT_R2R_TWOS_COMPLEMENT, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 0.5) // unknown DAC
- MCFG_DEVICE_ADD("dac0vol", DAC_8BIT_R2R, 0) MCFG_SOUND_ROUTE(0, "dac0", 1.0, DAC_VREF_POS_INPUT) MCFG_SOUND_ROUTE(0, "dac0", -1.0, DAC_VREF_NEG_INPUT) // unknown DAC
- MCFG_DEVICE_ADD("dac1vol", DAC_8BIT_R2R, 0) MCFG_SOUND_ROUTE(0, "dac1", 1.0, DAC_VREF_POS_INPUT) MCFG_SOUND_ROUTE(0, "dac1", -1.0, DAC_VREF_NEG_INPUT) // unknown DAC
- MCFG_DEVICE_ADD("dac2vol", DAC_8BIT_R2R, 0) MCFG_SOUND_ROUTE(0, "dac2", 1.0, DAC_VREF_POS_INPUT) MCFG_SOUND_ROUTE(0, "dac2", -1.0, DAC_VREF_NEG_INPUT) // unknown DAC
- MCFG_DEVICE_ADD("dac3vol", DAC_8BIT_R2R, 0) MCFG_SOUND_ROUTE(0, "dac3", 1.0, DAC_VREF_POS_INPUT) MCFG_SOUND_ROUTE(0, "dac3", -1.0, DAC_VREF_NEG_INPUT) // unknown DAC
- MCFG_DEVICE_ADD("vref", VOLTAGE_REGULATOR, 0) MCFG_VOLTAGE_REGULATOR_OUTPUT(5.0)
- MCFG_SOUND_ROUTE(0, "dac0vol", 1.0, DAC_VREF_POS_INPUT)
- MCFG_SOUND_ROUTE(0, "dac1vol", 1.0, DAC_VREF_POS_INPUT)
- MCFG_SOUND_ROUTE(0, "dac2vol", 1.0, DAC_VREF_POS_INPUT)
- MCFG_SOUND_ROUTE(0, "dac3vol", 1.0, DAC_VREF_POS_INPUT)
-MACHINE_CONFIG_END
+ DAC_8BIT_R2R_TWOS_COMPLEMENT(config, "dac0", 0).add_route(ALL_OUTPUTS, "speaker", 0.5); // unknown DAC
+ DAC_8BIT_R2R_TWOS_COMPLEMENT(config, "dac1", 0).add_route(ALL_OUTPUTS, "speaker", 0.5); // unknown DAC
+ DAC_8BIT_R2R_TWOS_COMPLEMENT(config, "dac2", 0).add_route(ALL_OUTPUTS, "speaker", 0.5); // unknown DAC
+ DAC_8BIT_R2R_TWOS_COMPLEMENT(config, "dac3", 0).add_route(ALL_OUTPUTS, "speaker", 0.5); // unknown DAC
+ DAC_8BIT_R2R(config, "dac0vol", 0).add_route(0, "dac0", 1.0, DAC_VREF_POS_INPUT).add_route(0, "dac0", -1.0, DAC_VREF_NEG_INPUT); // unknown DAC
+ DAC_8BIT_R2R(config, "dac1vol", 0).add_route(0, "dac1", 1.0, DAC_VREF_POS_INPUT).add_route(0, "dac1", -1.0, DAC_VREF_NEG_INPUT); // unknown DAC
+ DAC_8BIT_R2R(config, "dac2vol", 0).add_route(0, "dac2", 1.0, DAC_VREF_POS_INPUT).add_route(0, "dac2", -1.0, DAC_VREF_NEG_INPUT); // unknown DAC
+ DAC_8BIT_R2R(config, "dac3vol", 0).add_route(0, "dac3", 1.0, DAC_VREF_POS_INPUT).add_route(0, "dac3", -1.0, DAC_VREF_NEG_INPUT); // unknown DAC
+ voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref", 0));
+ vref.add_route(0, "dac0vol", 1.0, DAC_VREF_POS_INPUT);
+ vref.add_route(0, "dac1vol", 1.0, DAC_VREF_POS_INPUT);
+ vref.add_route(0, "dac2vol", 1.0, DAC_VREF_POS_INPUT);
+ vref.add_route(0, "dac3vol", 1.0, DAC_VREF_POS_INPUT);
+}
void inder_sb_device::device_start()
diff --git a/src/mame/machine/inder_vid.cpp b/src/mame/machine/inder_vid.cpp
index 35c30b9d698..e5005ea52b3 100644
--- a/src/mame/machine/inder_vid.cpp
+++ b/src/mame/machine/inder_vid.cpp
@@ -31,7 +31,6 @@ void inder_vid_device::megaphx_tms_map(address_map &map)
map(0x04000030, 0x0400003f).w("ramdac", FUNC(ramdac_device::index_r_w)).umask16(0x00ff);
map(0x04000090, 0x0400009f).nopw();
map(0x7fc00000, 0x7fffffff).ram().mirror(0x80000000);
- map(0xc0000000, 0xc00001ff).rw(m_tms, FUNC(tms34010_device::io_register_r), FUNC(tms34010_device::io_register_w));
}
@@ -97,7 +96,8 @@ void inder_vid_device::ramdac_map(address_map &map)
map(0x000, 0x3ff).rw("ramdac", FUNC(ramdac_device::ramdac_pal_r), FUNC(ramdac_device::ramdac_rgb888_w));
}
-MACHINE_CONFIG_START(inder_vid_device::device_add_mconfig)
+void inder_vid_device::device_add_mconfig(machine_config &config)
+{
TMS34010(config, m_tms, XTAL(40'000'000));
m_tms->set_addrmap(AS_PROGRAM, &inder_vid_device::megaphx_tms_map);
m_tms->set_halt_on_reset(true);
@@ -108,17 +108,16 @@ MACHINE_CONFIG_START(inder_vid_device::device_add_mconfig)
m_tms->set_shiftreg_in_callback(FUNC(inder_vid_device::to_shiftreg));
m_tms->set_shiftreg_out_callback(FUNC(inder_vid_device::from_shiftreg));
- MCFG_SCREEN_ADD("inder_screen", RASTER)
- MCFG_SCREEN_RAW_PARAMS(XTAL(40'000'000)/12, 424, 0, 338-1, 262, 0, 246-1)
- MCFG_SCREEN_UPDATE_DEVICE("tms", tms34010_device, tms340x0_rgb32)
+ screen_device &screen(SCREEN(config, "inder_screen", SCREEN_TYPE_RASTER));
+ screen.set_raw(XTAL(40'000'000)/12, 424, 0, 338-1, 262, 0, 246-1);
+ screen.set_screen_update("tms", FUNC(tms34010_device::tms340x0_rgb32));
- MCFG_PALETTE_ADD(m_palette, 256)
+ PALETTE(config, m_palette).set_entries(256);
ramdac_device &ramdac(RAMDAC(config, "ramdac", 0, m_palette));
ramdac.set_addrmap(0, &inder_vid_device::ramdac_map);
ramdac.set_split_read(1);
-
-MACHINE_CONFIG_END
+}
void inder_vid_device::device_start()
diff --git a/src/mame/machine/interpro_ioga.cpp b/src/mame/machine/interpro_ioga.cpp
index 3eef48dbcb6..36f58f107c5 100644
--- a/src/mame/machine/interpro_ioga.cpp
+++ b/src/mame/machine/interpro_ioga.cpp
@@ -133,7 +133,7 @@ DEFINE_DEVICE_TYPE(SAPPHIRE_IOGA, sapphire_ioga_device, "ioga_s", "I/O Gate Arra
interpro_ioga_device::interpro_ioga_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock)
: device_t(mconfig, type, tag, owner, clock)
- , m_memory_device(*this, finder_base::DUMMY_TAG)
+ , m_memory_space(*this, finder_base::DUMMY_TAG, -1, 32)
, m_memory(nullptr)
, m_out_nmi_func(*this)
, m_out_irq_func(*this)
@@ -168,12 +168,7 @@ sapphire_ioga_device::sapphire_ioga_device(const machine_config &mconfig, const
void interpro_ioga_device::device_start()
{
- // get the memory space
- if (!m_memory_device->has_space(m_memory_spacenum))
- fatalerror("%s: device %s (%s) doesn't have memory space %d\n",
- tag(), m_memory_device->device().tag(), m_memory_device->device().name(), m_memory_spacenum);
-
- m_memory = m_memory_device->space(m_memory_spacenum).cache<2, 0, ENDIANNESS_LITTLE>();
+ m_memory = m_memory_space->cache<2, 0, ENDIANNESS_LITTLE>();
// resolve callbacks
m_out_nmi_func.resolve();
diff --git a/src/mame/machine/interpro_ioga.h b/src/mame/machine/interpro_ioga.h
index f55951fec6d..1589a105ae1 100644
--- a/src/mame/machine/interpro_ioga.h
+++ b/src/mame/machine/interpro_ioga.h
@@ -60,11 +60,7 @@ public:
auto fdc_tc_callback() { return m_fdc_tc_func.bind(); }
auto eth_ca_callback() { return m_eth_ca_func.bind(); }
- template <typename T> void set_memory(T &&tag, int spacenum)
- {
- m_memory_device.set_tag(std::forward<T>(tag));
- m_memory_spacenum = spacenum;
- }
+ template <typename T> void set_memory(T &&tag, int spacenum) { m_memory_space.set_tag(std::forward<T>(tag), spacenum); }
virtual void map(address_map &map) = 0;
@@ -246,8 +242,7 @@ protected:
virtual void device_start() override;
virtual void device_reset() override;
- required_device<device_memory_interface> m_memory_device;
- int m_memory_spacenum;
+ required_address_space m_memory_space;
memory_access_cache<2, 0, ENDIANNESS_LITTLE> *m_memory;
// callbacks
diff --git a/src/mame/machine/intv.cpp b/src/mame/machine/intv.cpp
index 3d883acf75e..846f702b311 100644
--- a/src/mame/machine/intv.cpp
+++ b/src/mame/machine/intv.cpp
@@ -539,9 +539,9 @@ WRITE16_MEMBER( intv_state::intv_ram16_w )
READ8_MEMBER( intv_state::intvkb_iocart_r )
{
if (m_iocart1->exists())
- return m_iocart1->read_rom(space, offset, mem_mask);
+ return m_iocart1->read_rom(offset);
else if (m_iocart2->exists())
- return m_iocart2->read_rom(space, offset, mem_mask);
+ return m_iocart2->read_rom(offset);
else
return m_region_keyboard->as_u8(offset + 0xe000);
}
@@ -598,35 +598,35 @@ void intv_state::machine_start()
switch (m_cart->get_type())
{
case INTV_RAM:
- m_maincpu->space(AS_PROGRAM).install_readwrite_handler(0xd000, 0xd7ff, read16_delegate(FUNC(intv_cart_slot_device::read_ram),(intv_cart_slot_device*)m_cart), write16_delegate(FUNC(intv_cart_slot_device::write_ram),(intv_cart_slot_device*)m_cart));
+ m_maincpu->space(AS_PROGRAM).install_readwrite_handler(0xd000, 0xd7ff, read16sm_delegate(FUNC(intv_cart_slot_device::read_ram),(intv_cart_slot_device*)m_cart), write16sm_delegate(FUNC(intv_cart_slot_device::write_ram),(intv_cart_slot_device*)m_cart));
break;
case INTV_GFACT:
- m_maincpu->space(AS_PROGRAM).install_readwrite_handler(0x8800, 0x8fff, read16_delegate(FUNC(intv_cart_slot_device::read_ram),(intv_cart_slot_device*)m_cart), write16_delegate(FUNC(intv_cart_slot_device::write_ram),(intv_cart_slot_device*)m_cart));
+ m_maincpu->space(AS_PROGRAM).install_readwrite_handler(0x8800, 0x8fff, read16sm_delegate(FUNC(intv_cart_slot_device::read_ram),(intv_cart_slot_device*)m_cart), write16sm_delegate(FUNC(intv_cart_slot_device::write_ram),(intv_cart_slot_device*)m_cart));
break;
case INTV_VOICE:
m_cart->late_subslot_setup();
- m_maincpu->space(AS_PROGRAM).install_readwrite_handler(0x0080, 0x0081, read16_delegate(FUNC(intv_cart_slot_device::read_speech),(intv_cart_slot_device*)m_cart), write16_delegate(FUNC(intv_cart_slot_device::write_speech),(intv_cart_slot_device*)m_cart));
+ m_maincpu->space(AS_PROGRAM).install_readwrite_handler(0x0080, 0x0081, read16sm_delegate(FUNC(intv_cart_slot_device::read_speech),(intv_cart_slot_device*)m_cart), write16sm_delegate(FUNC(intv_cart_slot_device::write_speech),(intv_cart_slot_device*)m_cart));
// passthru for RAM-equipped carts
- m_maincpu->space(AS_PROGRAM).install_write_handler(0x8800, 0x8fff, write16_delegate(FUNC(intv_cart_slot_device::write_88),(intv_cart_slot_device*)m_cart));
- m_maincpu->space(AS_PROGRAM).install_write_handler(0xd000, 0xd7ff, write16_delegate(FUNC(intv_cart_slot_device::write_d0),(intv_cart_slot_device*)m_cart));
+ m_maincpu->space(AS_PROGRAM).install_write_handler(0x8800, 0x8fff, write16sm_delegate(FUNC(intv_cart_slot_device::write_88),(intv_cart_slot_device*)m_cart));
+ m_maincpu->space(AS_PROGRAM).install_write_handler(0xd000, 0xd7ff, write16sm_delegate(FUNC(intv_cart_slot_device::write_d0),(intv_cart_slot_device*)m_cart));
break;
case INTV_ECS:
m_cart->late_subslot_setup();
- m_maincpu->space(AS_PROGRAM).install_readwrite_handler(0x00f0, 0x00ff, read16_delegate(FUNC(intv_cart_slot_device::read_ay),(intv_cart_slot_device*)m_cart), write16_delegate(FUNC(intv_cart_slot_device::write_ay),(intv_cart_slot_device*)m_cart));
- m_maincpu->space(AS_PROGRAM).install_readwrite_handler(0x4000, 0x47ff, read16_delegate(FUNC(intv_cart_slot_device::read_ram),(intv_cart_slot_device*)m_cart), write16_delegate(FUNC(intv_cart_slot_device::write_ram),(intv_cart_slot_device*)m_cart));
+ m_maincpu->space(AS_PROGRAM).install_readwrite_handler(0x00f0, 0x00ff, read16sm_delegate(FUNC(intv_cart_slot_device::read_ay),(intv_cart_slot_device*)m_cart), write16sm_delegate(FUNC(intv_cart_slot_device::write_ay),(intv_cart_slot_device*)m_cart));
+ m_maincpu->space(AS_PROGRAM).install_readwrite_handler(0x4000, 0x47ff, read16sm_delegate(FUNC(intv_cart_slot_device::read_ram),(intv_cart_slot_device*)m_cart), write16sm_delegate(FUNC(intv_cart_slot_device::write_ram),(intv_cart_slot_device*)m_cart));
- m_maincpu->space(AS_PROGRAM).install_write_handler(0x2000, 0x2fff, write16_delegate(FUNC(intv_cart_slot_device::write_rom20),(intv_cart_slot_device*)m_cart));
- m_maincpu->space(AS_PROGRAM).install_write_handler(0x7000, 0x7fff, write16_delegate(FUNC(intv_cart_slot_device::write_rom70),(intv_cart_slot_device*)m_cart));
- m_maincpu->space(AS_PROGRAM).install_write_handler(0xe000, 0xefff, write16_delegate(FUNC(intv_cart_slot_device::write_rome0),(intv_cart_slot_device*)m_cart));
- m_maincpu->space(AS_PROGRAM).install_write_handler(0xf000, 0xffff, write16_delegate(FUNC(intv_cart_slot_device::write_romf0),(intv_cart_slot_device*)m_cart));
+ m_maincpu->space(AS_PROGRAM).install_write_handler(0x2000, 0x2fff, write16sm_delegate(FUNC(intv_cart_slot_device::write_rom20),(intv_cart_slot_device*)m_cart));
+ m_maincpu->space(AS_PROGRAM).install_write_handler(0x7000, 0x7fff, write16sm_delegate(FUNC(intv_cart_slot_device::write_rom70),(intv_cart_slot_device*)m_cart));
+ m_maincpu->space(AS_PROGRAM).install_write_handler(0xe000, 0xefff, write16sm_delegate(FUNC(intv_cart_slot_device::write_rome0),(intv_cart_slot_device*)m_cart));
+ m_maincpu->space(AS_PROGRAM).install_write_handler(0xf000, 0xffff, write16sm_delegate(FUNC(intv_cart_slot_device::write_romf0),(intv_cart_slot_device*)m_cart));
// passthru for Intellivoice expansion
- m_maincpu->space(AS_PROGRAM).install_readwrite_handler(0x0080, 0x0081, read16_delegate(FUNC(intv_cart_slot_device::read_speech),(intv_cart_slot_device*)m_cart), write16_delegate(FUNC(intv_cart_slot_device::write_speech),(intv_cart_slot_device*)m_cart));
+ m_maincpu->space(AS_PROGRAM).install_readwrite_handler(0x0080, 0x0081, read16sm_delegate(FUNC(intv_cart_slot_device::read_speech),(intv_cart_slot_device*)m_cart), write16sm_delegate(FUNC(intv_cart_slot_device::write_speech),(intv_cart_slot_device*)m_cart));
// passthru for RAM-equipped carts
- m_maincpu->space(AS_PROGRAM).install_write_handler(0x8800, 0x8fff, write16_delegate(FUNC(intv_cart_slot_device::write_88),(intv_cart_slot_device*)m_cart));
- m_maincpu->space(AS_PROGRAM).install_write_handler(0xd000, 0xd7ff, write16_delegate(FUNC(intv_cart_slot_device::write_d0),(intv_cart_slot_device*)m_cart));
+ m_maincpu->space(AS_PROGRAM).install_write_handler(0x8800, 0x8fff, write16sm_delegate(FUNC(intv_cart_slot_device::write_88),(intv_cart_slot_device*)m_cart));
+ m_maincpu->space(AS_PROGRAM).install_write_handler(0xd000, 0xd7ff, write16sm_delegate(FUNC(intv_cart_slot_device::write_d0),(intv_cart_slot_device*)m_cart));
break;
}
diff --git a/src/mame/machine/ioc2.cpp b/src/mame/machine/ioc2.cpp
index 120d6cadc93..ff9c9fc80a9 100644
--- a/src/mame/machine/ioc2.cpp
+++ b/src/mame/machine/ioc2.cpp
@@ -21,7 +21,8 @@
#define LOG_WRITE (1 << 8)
#define LOG_INT3 (1 << 9)
#define LOG_PIT (1 << 10)
-#define LOG_ALL (LOG_PI1 | LOG_SERIAL | LOG_MOUSEKBD | LOG_PANEL | LOG_SYSID | LOG_READ | LOG_DMA_SEL | LOG_RESET | LOG_WRITE | LOG_INT3 | LOG_PIT)
+#define LOG_IRQS (1 << 11)
+#define LOG_ALL (LOG_PI1 | LOG_SERIAL | LOG_MOUSEKBD | LOG_PANEL | LOG_SYSID | LOG_READ | LOG_DMA_SEL | LOG_RESET | LOG_WRITE | LOG_INT3 | LOG_PIT | LOG_IRQS)
#define LOG_DEFAULT (LOG_ALL & ~(LOG_SYSID | LOG_MOUSEKBD))
#define VERBOSE (0)
@@ -95,12 +96,12 @@ void ioc2_device::device_add_mconfig(machine_config &config)
m_kbdc->input_buffer_full_callback().set(FUNC(ioc2_device::kbdc_int_w));
PIT8254(config, m_pit, 0);
- m_pit->set_clk<0>(1000000);
- m_pit->set_clk<1>(1000000);
+ m_pit->set_clk<0>(0);
+ m_pit->set_clk<1>(0);
m_pit->set_clk<2>(1000000);
m_pit->out_handler<0>().set(FUNC(ioc2_device::timer0_int));
m_pit->out_handler<1>().set(FUNC(ioc2_device::timer1_int));
- m_pit->out_handler<2>().set(m_kbdc, FUNC(kbdc8042_device::write_out2));
+ m_pit->out_handler<2>().set(FUNC(ioc2_device::pit_clock2_out));
}
@@ -172,26 +173,45 @@ void ioc2_device::device_reset()
void ioc2_device::raise_local_irq(int channel, uint8_t mask)
{
+ const uint8_t old = m_int3_local_status_reg[channel];
m_int3_local_status_reg[channel] |= mask;
- m_maincpu->set_input_line(MIPS3_IRQ0 + channel, (m_int3_local_mask_reg[channel] & m_int3_local_status_reg[channel]) ? ASSERT_LINE : CLEAR_LINE);
+ LOGMASKED(LOG_IRQS, "Raising Local%d interrupt mask %02x, interrupt status was %02x, now %02x, %sing interrupt\n", channel, mask, old,
+ m_int3_local_status_reg[channel], (m_int3_local_mask_reg[channel] & m_int3_local_status_reg[channel]) ? "rais" : "lower");
+ m_maincpu->set_input_line(channel, (m_int3_local_mask_reg[channel] & m_int3_local_status_reg[channel]) ? ASSERT_LINE : CLEAR_LINE);
}
void ioc2_device::lower_local_irq(int channel, uint8_t mask)
{
+ const uint8_t old = m_int3_local_status_reg[channel];
m_int3_local_status_reg[channel] &= ~mask;
- m_maincpu->set_input_line(MIPS3_IRQ0 + channel, (m_int3_local_mask_reg[channel] & m_int3_local_status_reg[channel]) ? ASSERT_LINE : CLEAR_LINE);
+ LOGMASKED(LOG_IRQS, "Lowering Local%d interrupt mask %02x, interrupt status was %02x, now %02x, %sing interrupt\n", channel, mask, old,
+ m_int3_local_status_reg[channel], (m_int3_local_mask_reg[channel] & m_int3_local_status_reg[channel]) ? "rais" : "lower");
+ m_maincpu->set_input_line(channel, (m_int3_local_mask_reg[channel] & m_int3_local_status_reg[channel]) ? ASSERT_LINE : CLEAR_LINE);
}
WRITE_LINE_MEMBER(ioc2_device::timer0_int)
{
if (state)
- m_maincpu->set_input_line(MIPS3_IRQ2, ASSERT_LINE);
+ {
+ LOGMASKED(LOG_IRQS, "Raising IRQ line 2\n");
+ m_maincpu->set_input_line(2, ASSERT_LINE);
+ }
}
WRITE_LINE_MEMBER(ioc2_device::timer1_int)
{
if (state)
- m_maincpu->set_input_line(MIPS3_IRQ3, ASSERT_LINE);
+ {
+ LOGMASKED(LOG_IRQS, "Raising IRQ line 3\n");
+ m_maincpu->set_input_line(3, ASSERT_LINE);
+ }
+}
+
+WRITE_LINE_MEMBER(ioc2_device::pit_clock2_out)
+{
+ m_pit->write_clk0(state);
+ m_pit->write_clk1(state);
+ m_kbdc->write_out2(state);
}
WRITE_LINE_MEMBER(ioc2_device::kbdc_int_w)
@@ -206,20 +226,36 @@ WRITE_LINE_MEMBER(ioc2_device::duart_int_w)
void ioc2_device::set_mappable_int(uint8_t mask, bool state)
{
+ const uint8_t old = m_int3_map_status_reg;
+ const uint8_t old0 = m_int3_map_mask_reg[0] & old;
+ const uint8_t old1 = m_int3_map_mask_reg[1] & old;
+
if (state)
m_int3_map_status_reg |= mask;
else
m_int3_map_status_reg &= ~mask;
- if (m_int3_map_mask_reg[0] & m_int3_map_status_reg)
- raise_local_irq(0, INT3_LOCAL0_MAPPABLE0);
- else
- lower_local_irq(0, INT3_LOCAL0_MAPPABLE0);
+ const uint8_t new0 = m_int3_map_mask_reg[0] & m_int3_map_status_reg;
+ if (old0 ^ new0)
+ {
+ LOGMASKED(LOG_IRQS, "%sing Mappable interrupt mask %02x, interrupt status was %02x, now %02x, %sing mappable0\n", state ? "Rais" : "Lower", mask, old,
+ m_int3_map_status_reg, (m_int3_map_mask_reg[0] & m_int3_map_status_reg) ? "rais" : "lower");
+ if (m_int3_map_mask_reg[0] & m_int3_map_status_reg)
+ raise_local_irq(0, INT3_LOCAL0_MAPPABLE0);
+ else
+ lower_local_irq(0, INT3_LOCAL0_MAPPABLE0);
+ }
- if (m_int3_map_mask_reg[1] & m_int3_map_status_reg)
- raise_local_irq(1, INT3_LOCAL1_MAPPABLE1);
- else
- lower_local_irq(1, INT3_LOCAL1_MAPPABLE1);
+ const uint8_t new1 = m_int3_map_mask_reg[1] & m_int3_map_status_reg;
+ if (old1 ^ new1)
+ {
+ LOGMASKED(LOG_IRQS, "%sing Mappable interrupt mask %02x, interrupt status was %02x, now %02x, %sing mappable1\n", state ? "Rais" : "Lower", mask, old,
+ m_int3_map_status_reg, (m_int3_map_mask_reg[0] & m_int3_map_status_reg) ? "rais" : "lower");
+ if (m_int3_map_mask_reg[1] & m_int3_map_status_reg)
+ raise_local_irq(1, INT3_LOCAL1_MAPPABLE1);
+ else
+ lower_local_irq(1, INT3_LOCAL1_MAPPABLE1);
+ }
}
READ32_MEMBER(ioc2_device::read)
@@ -617,7 +653,7 @@ void ioc2_device::set_local_int_mask(int channel, uint32_t mask)
if (old_line != new_line)
{
const uint32_t int_bits = (m_int3_local_mask_reg[channel] & m_int3_local_status_reg[channel]);
- m_maincpu->set_input_line(MIPS3_IRQ0 + channel, int_bits != 0 ? ASSERT_LINE : CLEAR_LINE);
+ m_maincpu->set_input_line(channel, int_bits != 0 ? ASSERT_LINE : CLEAR_LINE);
}
}
@@ -629,9 +665,15 @@ void ioc2_device::set_map_int_mask(int channel, uint32_t mask)
void ioc2_device::set_timer_int_clear(uint32_t data)
{
if (BIT(data, 0))
- m_maincpu->set_input_line(MIPS3_IRQ2, CLEAR_LINE);
+ {
+ LOGMASKED(LOG_IRQS, "Lowering IRQ line 2\n");
+ m_maincpu->set_input_line(2, CLEAR_LINE);
+ }
if (BIT(data, 1))
- m_maincpu->set_input_line(MIPS3_IRQ3, CLEAR_LINE);
+ {
+ LOGMASKED(LOG_IRQS, "Lowering IRQ line 3\n");
+ m_maincpu->set_input_line(3, CLEAR_LINE);
+ }
}
void ioc2_device::handle_reset_reg_write(uint8_t data)
diff --git a/src/mame/machine/ioc2.h b/src/mame/machine/ioc2.h
index a90011ae919..5e99996e7c6 100644
--- a/src/mame/machine/ioc2.h
+++ b/src/mame/machine/ioc2.h
@@ -11,7 +11,6 @@
#pragma once
-#include "cpu/mips/mips3.h"
#include "machine/8042kbdc.h"
#include "machine/pc_lpt.h"
#include "machine/pckeybrd.h"
@@ -79,6 +78,7 @@ protected:
DECLARE_WRITE_LINE_MEMBER(timer0_int);
DECLARE_WRITE_LINE_MEMBER(timer1_int);
+ DECLARE_WRITE_LINE_MEMBER(pit_clock2_out);
DECLARE_WRITE_LINE_MEMBER(kbdc_int_w);
DECLARE_WRITE_LINE_MEMBER(duart_int_w);
@@ -154,7 +154,7 @@ protected:
DMA_SEL_CLOCK_SEL_EXT = 0x20,
};
- required_device<mips3_device> m_maincpu;
+ required_device<cpu_device> m_maincpu;
required_device<scc85230_device> m_scc;
required_device<pc_lpt_device> m_pi1; // we assume standard parallel port (SPP) mode
// TODO: SGI parallel port (SGIPP), HP BOISE high speed parallel port (HPBPP), and Ricoh scanner modes
diff --git a/src/mame/machine/isbc_208.cpp b/src/mame/machine/isbc_208.cpp
index 04789cd8ecf..28005c388dd 100644
--- a/src/mame/machine/isbc_208.cpp
+++ b/src/mame/machine/isbc_208.cpp
@@ -38,8 +38,8 @@ void isbc_208_device::device_add_mconfig(machine_config &config)
m_dmac->out_eop_callback().set(FUNC(isbc_208_device::out_eop_w));
m_dmac->in_memr_callback().set(FUNC(isbc_208_device::dma_read_byte));
m_dmac->out_memw_callback().set(FUNC(isbc_208_device::dma_write_byte));
- m_dmac->in_ior_callback<0>().set(m_fdc, FUNC(i8272a_device::mdma_r));
- m_dmac->out_iow_callback<0>().set(m_fdc, FUNC(i8272a_device::mdma_w));
+ m_dmac->in_ior_callback<0>().set(m_fdc, FUNC(i8272a_device::dma_r));
+ m_dmac->out_iow_callback<0>().set(m_fdc, FUNC(i8272a_device::dma_w));
I8272A(config, m_fdc, 8_MHz_XTAL, true);
m_fdc->intrq_wr_callback().set(FUNC(isbc_208_device::irq_w));
diff --git a/src/mame/machine/iteagle_fpga.cpp b/src/mame/machine/iteagle_fpga.cpp
index 7ba6967747f..6a585fc24ec 100644
--- a/src/mame/machine/iteagle_fpga.cpp
+++ b/src/mame/machine/iteagle_fpga.cpp
@@ -51,7 +51,8 @@ iteagle_fpga_device::iteagle_fpga_device(const machine_config &mconfig, const ch
set_ids(0x55cc33aa, 0xaa, 0xaaaaaa, 0x00);
}
-MACHINE_CONFIG_START(iteagle_fpga_device::device_add_mconfig)
+void iteagle_fpga_device::device_add_mconfig(machine_config &config)
+{
NVRAM(config, "eagle2_rtc", nvram_device::DEFAULT_ALL_0);
NVRAM(config, "eagle1_bram", nvram_device::DEFAULT_ALL_1);
@@ -72,7 +73,7 @@ MACHINE_CONFIG_START(iteagle_fpga_device::device_add_mconfig)
com2.rxd_handler().set(m_scc1, FUNC(scc85c30_device::rxa_w));
com2.dcd_handler().set(m_scc1, FUNC(scc85c30_device::dcda_w));
com2.cts_handler().set(m_scc1, FUNC(scc85c30_device::ctsa_w));
-MACHINE_CONFIG_END
+}
void iteagle_fpga_device::device_start()
{
@@ -277,7 +278,7 @@ READ32_MEMBER( iteagle_fpga_device::fpga_r )
logerror("%s:fpga_r offset %04X = %08X & %08X\n", machine().describe_context(), offset*4, result, mem_mask);
break;
case 0x14/4: // GUN1-- Interrupt & 0x4==0x00080000
- result = (m_guny_cb(0) << 16) | (m_gunx_cb(0) << 0);
+ result = (m_gun_y << 16) | (m_gun_x << 0);
if (LOG_FPGA)
logerror("%s:fpga_r offset %04X = %08X & %08X\n", machine().describe_context(), offset*4, result, mem_mask);
break;
diff --git a/src/mame/machine/jazz_mct_adr.cpp b/src/mame/machine/jazz_mct_adr.cpp
index e14075f3f3f..e41e88db232 100644
--- a/src/mame/machine/jazz_mct_adr.cpp
+++ b/src/mame/machine/jazz_mct_adr.cpp
@@ -20,7 +20,10 @@
* http://cvsweb.netbsd.org/bsdweb.cgi/src/sys/arch/arc/jazz/
*
* TODO
- * - everything (skeleton only)
+ * - proper width dma
+ * - dma address translation errors
+ * - I/O cache
+ * - revision 2 device
*/
#include "emu.h"
@@ -33,19 +36,275 @@ DEFINE_DEVICE_TYPE(JAZZ_MCT_ADR, jazz_mct_adr_device, "jazz_mct_adr", "Jazz MCT-
jazz_mct_adr_device::jazz_mct_adr_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
: device_t(mconfig, JAZZ_MCT_ADR, tag, owner, clock)
+ , m_bus(*this, finder_base::DUMMY_TAG, -1, 64)
+ , m_out_int_dma(*this)
+ , m_out_int_device(*this)
+ , m_out_int_timer(*this)
+ , m_eisa_iack(*this)
+ , m_dma_r{ *this, *this, *this, *this }
+ , m_dma_w{ *this, *this, *this, *this }
{
}
void jazz_mct_adr_device::map(address_map &map)
{
- map(0x000, 0x003).lr32("config", [](){ return 0x00000000; });
- map(0x008, 0x00b).lr32("revision", [](){ return 0xf0000000; });
+ map(0x000, 0x007).lrw32("configuration", [this](){ return m_config; }, [this](u32 data) { m_config = data; });
+ map(0x008, 0x00f).lr32("revision_level", [](){ return 1; });
+ map(0x010, 0x017).lr32("invalid_address", []() { return 0; });
+ map(0x018, 0x01f).lrw32("translation_base", [this]() { return m_trans_tbl_base; }, [this](u32 data) { LOG("tbl base 0x%08x\n", data); m_trans_tbl_base = data; });
+ map(0x020, 0x027).lrw32("translation_limit", [this]() { return m_trans_tbl_limit; }, [this](u32 data) { LOG("tbl limit 0x%08x\n", data); m_trans_tbl_limit = data; });
+ map(0x028, 0x02f).lrw32("translation_invalidate", []() { return 0; }, [](u32 data) { });
+ map(0x030, 0x037).lw32("cache_maintenance", [this](u32 data) { m_ioc_maint = data; });
+ map(0x038, 0x03f).lr32("remote_failed_address", []() { return 0; });
+ map(0x040, 0x047).lr32("memory_failed_address", []() { return 0; });
+ map(0x048, 0x04f).lw32("io_cache_physical_tag", [this](u32 data) { m_ioc_physical_tag = data; });
+ map(0x050, 0x057).lw32("io_cache_logical_tag", [this](u32 data) { m_ioc_logical_tag = data; });
+ map(0x058, 0x05f).lrw32("io_cache_byte_mask",
+ // FIXME: hack to pass diagnostics
+ [this]()
+ {
+ u32 const data = m_ioc_byte_mask;
+
+ if (data == 0xffffffff)
+ m_ioc_byte_mask = 0;
+ return data;
+ },
+ [this](u32 data) { m_ioc_byte_mask |= data; });
+ map(0x060, 0x067).lw32("io_cache_buffer_window_lo", [this](u32 data)
+ {
+ // FIXME: hack to pass diagnostics
+ if (m_ioc_logical_tag == 0x80000001 && m_ioc_byte_mask == 0x0f0f0f0f)
+ {
+ u32 const address = (m_ioc_physical_tag & ~0x1) + ((m_ioc_maint & 0x3) << 3);
+
+ m_bus->write_dword(address, data);
+ }
+ });
+ // io_cache_buffer_window_hi
+ map(0x070, 0x0ef).lrw32("remote_speed",
+ [this](offs_t offset) { return m_remote_speed[offset >> 1]; },
+ [this](offs_t offset, u32 data) { m_remote_speed[offset >> 1] = data; });
+ // parity_diagnostic_lo
+ // parity_diagnostic_hi
+ map(0x100, 0x1ff).lrw32("dma_reg",
+ [this](offs_t offset) { return m_dma_reg[offset >> 1]; },
+ [this](offs_t offset, u32 data)
+ {
+ unsigned const reg = offset >> 1;
+
+ LOG("dma_reg %d data 0x%08x (%s)\n", offset, data, machine().describe_context());
+
+ m_dma_reg[reg] = data;
+
+ if ((reg == REG_ENABLE) && (data & DMA_ENABLE))
+ LOG("dma started address 0x%08x count %d\n", translate_address(m_dma_reg[(0 << 2) + REG_ADDRESS]), m_dma_reg[(0 << 2) + REG_COUNT]);
+ });
+ map(0x200, 0x207).lr32("interrupt_source", []() { return 0; });
+ map(0x208, 0x20f).lr32("error_type", []() { return 0; });
+ map(0x210, 0x217).lrw32("refresh_rate", [this]() { return m_memory_refresh_rate; }, [this](u32 data) { m_memory_refresh_rate = data; });
+ // refresh_counter
+ map(0x220, 0x227).lrw32("system_security", [this]() { return m_nvram_protect; }, [this](u32 data) { LOG("nvram_protect 0x%08x (%s)\n", data, machine().describe_context()); m_nvram_protect = data; });
+ map(0x228, 0x22f).lw32("interrupt_interval", [this](u32 data)
+ {
+ LOG("timer_w 0x%08x\n", data);
+
+ attotime interval = attotime::from_ticks((data + 1) & 0x1ff, 1000);
+
+ m_interval_timer->adjust(interval, 0, interval);
+ });
+ map(0x230, 0x237).lr32("interval_timer", [this]() { if (m_out_int_timer_asserted) { m_out_int_timer_asserted = false; m_out_int_timer(0); } return 0; });
+ map(0x238, 0x23b).lr32("interrupt_acknowledge", [this]() { return m_eisa_iack(); });
}
void jazz_mct_adr_device::device_start()
{
+ m_out_int_dma.resolve();
+ m_out_int_device.resolve();
+ m_out_int_timer.resolve();
+ m_eisa_iack.resolve();
+
+ for (int i = 0; i < 4; i++)
+ {
+ m_dma_r[i].resolve_safe(0xff);
+ m_dma_w[i].resolve_safe();
+ }
+
+ m_config = 0x104; // REV1, REV2 is 0x410
+
+ m_ioc_maint = 0;
+ m_ioc_physical_tag = 0;
+ m_ioc_logical_tag = 0;
+ m_trans_tbl_base = 0;
+ m_trans_tbl_limit = 0;
+ m_ioc_byte_mask = 0;
+
+ for (u32 &val : m_remote_speed)
+ val = 0x7;
+
+ for (u32 &val : m_dma_reg)
+ val = 0;
+
+ m_memory_refresh_rate = 0x18186;
+ m_nvram_protect = 0x7;
+
+ m_irq_check = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(jazz_mct_adr_device::irq_check), this));
+ m_dma_check = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(jazz_mct_adr_device::dma_check), this));
+ m_interval_timer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(jazz_mct_adr_device::interval_timer), this));
+
+ m_out_int_timer_asserted = false;
+ m_out_int_device_asserted = false;
}
void jazz_mct_adr_device::device_reset()
{
+ m_isr = 0;
+ m_imr = 0; // 0x10;
+
+ m_interval_timer->adjust(attotime::from_usec(1), 0, attotime::from_usec(1));
+}
+
+void jazz_mct_adr_device::set_irq_line(int irq, int state)
+{
+ if ((irq != 3) && (m_isr & (1 << irq)) ^ (state << irq))
+ LOG("set_irq_line %d state %d m_imr 0x%04x\n", irq, state, m_imr);
+
+ if (state)
+ m_isr |= (1 << irq);
+ else
+ m_isr &= ~(1 << irq);
+
+ m_irq_check->adjust(attotime::zero);
+}
+
+TIMER_CALLBACK_MEMBER(jazz_mct_adr_device::irq_check)
+{
+ if (bool(m_isr & m_imr) != m_out_int_device_asserted)
+ {
+ m_out_int_device_asserted = bool(m_isr & m_imr);
+
+ m_out_int_device(m_out_int_device_asserted ? 1 : 0);
+ }
+}
+
+u16 jazz_mct_adr_device::isr_r()
+{
+ u16 const pending = m_isr & m_imr;
+
+ // FIXME: really?
+ //m_out_int_device(CLEAR_LINE);
+
+ for (u16 irq = 0; irq < 16; irq++)
+ if (BIT(pending, irq))
+ return (irq + 1) << 2;
+
+ return 0;
+}
+
+void jazz_mct_adr_device::imr_w(u16 data)
+{
+ LOG("imr_w 0x%04x (%s)\n", data, machine().describe_context());
+
+ m_imr = data;
+
+ m_irq_check->adjust(attotime::zero);
+}
+
+TIMER_CALLBACK_MEMBER(jazz_mct_adr_device::interval_timer)
+{
+ //m_out_int_timer(CLEAR_LINE);
+ if (!m_out_int_timer_asserted)
+ {
+ m_out_int_timer_asserted = true;
+ m_out_int_timer(1);
+ }
+}
+
+void jazz_mct_adr_device::set_drq_line(int channel, int state)
+{
+ m_drq_active[channel] = state == ASSERT_LINE;
+
+ if (state)
+ m_dma_check->adjust(attotime::zero);
+}
+
+TIMER_CALLBACK_MEMBER(jazz_mct_adr_device::dma_check)
+{
+ bool active = false;
+
+ for (int channel = 0; channel < 4; channel++)
+ {
+ if (!m_drq_active[channel])
+ continue;
+
+ // reg 0x00: 0x00000011 - mode (ch0) (WIDTH16 | ATIME_80)
+ // reg 0x20: 0x0000000a - mode (ch1) (WIDTH8 | ATIME_120)
+ // reg 0x18: 0x00000f20 - address
+ // reg 0x10: 0x00000024 - count
+ // reg 0x08: 0x00000001 - enable (ENABLE | !WRITE)
+
+ // check channel enabled
+ if (!(m_dma_reg[(channel << 2) + REG_ENABLE] & DMA_ENABLE))
+ return;
+
+ // check transfer count
+ if (!m_dma_reg[(channel << 2) + REG_COUNT])
+ return;
+
+ u32 const address = translate_address(m_dma_reg[(channel << 2) + REG_ADDRESS]);
+
+ // perform dma transfer
+ if (m_dma_reg[(channel << 2) + REG_ENABLE] & DMA_DIRECTION)
+ {
+ u8 const data = m_bus->read_byte(address);
+
+ //LOG("dma_w data 0x%02x address 0x%08x\n", data, address);
+
+ m_dma_w[channel](data);
+ }
+ else
+ {
+ u8 const data = m_dma_r[channel]();
+
+ //LOG("dma_r data 0x%02x address 0x%08x\n", data, address);
+
+ m_bus->write_byte(address, data);
+ }
+
+ // increment address, decrement count
+ m_dma_reg[(channel << 2) + REG_ADDRESS]++;
+ m_dma_reg[(channel << 2) + REG_COUNT]--;
+
+ // set terminal count flag
+ if (!m_dma_reg[(channel << 2) + REG_COUNT])
+ {
+ m_dma_reg[(channel << 2) + REG_ENABLE] |= DMA_TERMINAL_COUNT;
+
+ // TODO: dma interrupts
+ if (m_dma_reg[(channel << 2) + REG_ENABLE] & DMA_INTERRUPT_ENABLE)
+ logerror("dma interrupt enable - interrupt expected\n");
+ }
+
+ if (m_drq_active[channel])
+ active = true;
+ }
+
+ if (active)
+ m_dma_check->adjust(attotime::zero);
+}
+
+u32 jazz_mct_adr_device::translate_address(u32 logical_address)
+{
+ u32 page = logical_address >> 12;
+ if (page < (m_trans_tbl_limit) >> 3)
+ {
+ u32 entry_address = (m_trans_tbl_base & 0x7fffffff) + page * 8;
+
+ return m_bus->read_dword(entry_address) | (logical_address & 0xfff);
+ }
+ else
+ {
+ logerror("failed to translate address 0x%08x\n", logical_address);
+
+ return 0; // FIXME: address error
+ }
}
diff --git a/src/mame/machine/jazz_mct_adr.h b/src/mame/machine/jazz_mct_adr.h
index dd2b651d25c..f71c28a8933 100644
--- a/src/mame/machine/jazz_mct_adr.h
+++ b/src/mame/machine/jazz_mct_adr.h
@@ -11,12 +11,135 @@ class jazz_mct_adr_device : public device_t
public:
jazz_mct_adr_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+ // configuration
+ template <typename T> void set_bus(T &&tag, int spacenum) { m_bus.set_tag(std::forward<T>(tag), spacenum); }
+
+ auto out_int_dma_cb() { return m_out_int_dma.bind(); }
+ auto out_int_device_cb() { return m_out_int_device.bind(); }
+ auto out_int_timer_cb() { return m_out_int_timer.bind(); }
+ auto eisa_iack_cb() { return m_eisa_iack.bind(); }
+
+ template <unsigned DMA> auto dma_r_cb() { return m_dma_r[DMA].bind(); }
+ template <unsigned DMA> auto dma_w_cb() { return m_dma_w[DMA].bind(); }
+
+ template <unsigned IRQ> DECLARE_WRITE_LINE_MEMBER(irq) { set_irq_line(IRQ, state); }
+ template <unsigned DRQ> DECLARE_WRITE_LINE_MEMBER(drq) { set_drq_line(DRQ, state); }
+
virtual void map(address_map &map);
+ u16 isr_r();
+ u16 imr_r() { return m_imr; }
+ void imr_w(u16 data);
+
protected:
// device_t overrides
virtual void device_start() override;
virtual void device_reset() override;
+
+private:
+ void set_irq_line(int number, int state);
+ void set_drq_line(int channel, int state);
+
+ TIMER_CALLBACK_MEMBER(irq_check);
+ TIMER_CALLBACK_MEMBER(dma_check);
+ TIMER_CALLBACK_MEMBER(interval_timer);
+
+ u32 translate_address(u32 logical_address);
+
+ required_address_space m_bus;
+
+ devcb_write_line m_out_int_dma;
+ devcb_write_line m_out_int_device;
+ devcb_write_line m_out_int_timer;
+ devcb_read32 m_eisa_iack;
+
+ devcb_read8 m_dma_r[4];
+ devcb_write8 m_dma_w[4];
+ bool m_drq_active[4];
+
+ emu_timer *m_irq_check;
+ emu_timer *m_dma_check;
+ emu_timer *m_interval_timer;
+
+ enum isr_mask : u16
+ {
+ ISR_PRINTER = 0x0001,
+ ISR_FLOPPY = 0x0002,
+ ISR_SOUND = 0x0004,
+ ISR_VIDEO = 0x0008,
+ ISR_NETWORK = 0x0010,
+ ISR_SCSI = 0x0020,
+ ISR_KEYBOARD = 0x0040,
+ ISR_MOUSE = 0x0080,
+ ISR_SERIAL0 = 0x0100,
+ ISR_SERIAL1 = 0x0200,
+ };
+ u16 m_isr; // local bus interrupt source
+ u16 m_imr; // local bus interrupt mask
+
+ u32 m_config;
+
+ enum dma_register : unsigned
+ {
+ REG_MODE = 0,
+ REG_ENABLE = 1,
+ REG_COUNT = 2,
+ REG_ADDRESS = 3,
+ };
+ enum dma_mode_mask : u32
+ {
+ DMA_ACCESS_TIME = 0x00000007,
+ DMA_TRANSFER_WIDTH = 0x00000018,
+ DMA_INTERRUPT_ENABLE = 0x00000020,
+ DMA_BURST_MODE = 0x00000040,
+ DMA_FAST_DMA_CYCLE = 0x00000080,
+ };
+ enum dma_access_time : u32
+ {
+ ACCESS_40NS = 0x00,
+ ACCESS_80NS = 0x01,
+ ACCESS_120NS = 0x02,
+ ACCESS_160NS = 0x03,
+ ACCESS_200NS = 0x04,
+ ACCESS_240NS = 0x05,
+ ACCESS_280NS = 0x06,
+ ACCESS_320NS = 0x07,
+ };
+ enum dma_transfer_width : u32
+ {
+ WIDTH_8BITS = 0x08,
+ WIDTH_16BITS = 0x10,
+ WIDTH_32BITS = 0x18,
+ };
+ enum dma_enable_mask : u32
+ {
+ DMA_ENABLE = 0x00000001,
+ DMA_DIRECTION = 0x00000002, // 1 == write to device
+ DMA_TERMINAL_COUNT = 0x00000100,
+ DMA_MEMORY_ERROR = 0x00000200,
+ DMA_TRANSLATION_ERROR = 0x00000400,
+ };
+ enum dma_interrupt_source : u32
+ {
+ DMA_INTERRUPT_PENDING = 0x000000ff,
+ DMA_PARITY_ERROR = 0x00000100,
+ DMA_ADDRESS_ERROR = 0000000200,
+ DMA_CACHE_FLUSH_ERROR = 0x00000400,
+ };
+
+ u32 m_trans_tbl_base;
+ u32 m_trans_tbl_limit;
+ u32 m_ioc_maint;
+ u32 m_ioc_physical_tag;
+ u32 m_ioc_logical_tag;
+ u32 m_ioc_byte_mask;
+ u32 m_remote_speed[16];
+ u32 m_dma_reg[32];
+ u32 m_memory_refresh_rate;
+ u32 m_nvram_protect;
+
+ bool m_out_int_timer_asserted;
+ bool m_out_int_device_asserted;
};
// device type definition
diff --git a/src/mame/machine/k7659kb.cpp b/src/mame/machine/k7659kb.cpp
index e7338a105b2..e7fe62bc645 100644
--- a/src/mame/machine/k7659kb.cpp
+++ b/src/mame/machine/k7659kb.cpp
@@ -61,9 +61,9 @@ const tiny_rom_entry *k7659_keyboard_device::device_rom_region() const
// device_add_mconfig - add device configuration
//-------------------------------------------------
-MACHINE_CONFIG_START(k7659_keyboard_device::device_add_mconfig)
-
-MACHINE_CONFIG_END
+void k7659_keyboard_device::device_add_mconfig(machine_config &config)
+{
+}
//-------------------------------------------------
diff --git a/src/mame/machine/kc_keyb.cpp b/src/mame/machine/kc_keyb.cpp
index 37c1beb7397..5fceb7fc8f9 100644
--- a/src/mame/machine/kc_keyb.cpp
+++ b/src/mame/machine/kc_keyb.cpp
@@ -42,7 +42,7 @@ The keyboard of the KC is driven by a remote control circuit that is
originally designed for infrared remote control. This one was named
U807 and I learned there should be a similar chip called SAB 3021
available but I never found the specs on the web. The SAB 3021 was
-produced by Valvo which doesn't exist anymore (bought by Phillips
+produced by Valvo which doesn't exist anymore (bought by Philips
if I remember correctly). If you have more luck finding the specs
I'm still interested.
There also was a complementary chip for the receiving side but that
diff --git a/src/mame/machine/km035.cpp b/src/mame/machine/km035.cpp
index f32036bf497..c63940bbd63 100644
--- a/src/mame/machine/km035.cpp
+++ b/src/mame/machine/km035.cpp
@@ -11,16 +11,16 @@
#include "km035.h"
#include "speaker.h"
-#define VERBOSE_DBG 0 /* general debug messages */
-#define DBG_LOG(N,M,A) \
- do { \
- if(VERBOSE_DBG>=N) \
- { \
- logerror("%11.6f at %s: ",machine().time().as_double(),machine().describe_context()); \
- logerror A; \
- } \
- } while (0)
+//#define LOG_GENERAL (1U << 0) //defined in logmacro.h already
+#define LOG_DEBUG (1U << 1)
+
+//#define VERBOSE (LOG_GENERAL | LOG_DEBUG)
+//#define LOG_OUTPUT_FUNC printf
+#include "logmacro.h"
+
+#define LOGDBG(...) LOGMASKED(LOG_DEBUG, __VA_ARGS__)
+
//**************************************************************************
// MACROS / CONSTANTS
@@ -292,7 +292,7 @@ void km035_device::device_reset()
WRITE_LINE_MEMBER( km035_device::write_rxd )
{
- DBG_LOG(1,0,("write_rxd %d\n", state));
+ LOG("write_rxd %d\n", state);
m_maincpu->set_input_line(MCS48_INPUT_IRQ, state ? CLEAR_LINE : ASSERT_LINE);
m_rx = state;
}
@@ -317,20 +317,20 @@ WRITE8_MEMBER( km035_device::p1_w )
6 Matrix row bit 2
7 Matrix row bit 3
*/
- DBG_LOG(2,0,( "p1_w %02x = row %d col %d tx %d\n", data, (data>>4)&15, data&7, !BIT(data, 3)));
+ LOGDBG("p1_w %02x = row %d col %d tx %d\n", data, (data>>4)&15, data&7, !BIT(data, 3));
m_p1 = data;
sense = m_kbd[(data>>4) & 15]->read();
m_keylatch = BIT(sense, (data & 7));
if (m_keylatch)
- DBG_LOG(1,0,( "keypress at row %d col %d\n", (data>>4)&15, data&7));
+ LOG("keypress at row %d col %d\n", (data>>4)&15, data&7);
m_tx_handler(!BIT(data, 3));
}
WRITE8_MEMBER( km035_device::p2_w )
{
- DBG_LOG(2,0,( "p2_w %02x\n", data ));
+ LOGDBG("p2_w %02x\n", data);
m_p2 = data;
}
@@ -351,7 +351,7 @@ READ8_MEMBER( km035_device::p2_r )
WRITE8_MEMBER( km035_device::bus_w )
{
- DBG_LOG(2,0,( "bus_w %02x\n", data));
+ LOGDBG("bus_w %02x\n", data);
}
//-------------------------------------------------
diff --git a/src/mame/machine/leland.cpp b/src/mame/machine/leland.cpp
index 59434792ff0..46c871dd30e 100644
--- a/src/mame/machine/leland.cpp
+++ b/src/mame/machine/leland.cpp
@@ -1103,10 +1103,10 @@ READ8_MEMBER(leland_state::leland_master_input_r)
case 0x03: /* /IGID */
case 0x13:
if (m_ay8910)
- result &= m_ay8910->data_r(space, 0);
+ result &= m_ay8910->data_r();
if (m_ay8912)
- result &= m_ay8912->data_r(space, 0);
+ result &= m_ay8912->data_r();
break;
case 0x10: /* /GIN0 */
@@ -1146,10 +1146,10 @@ WRITE8_MEMBER(leland_state::leland_master_output_w)
case 0x0a: /* /OGIA */
case 0x0b: /* /OGID */
if (m_ay8910)
- m_ay8910->address_data_w(space, offset - 0x0a, data);
+ m_ay8910->address_data_w(offset - 0x0a, data);
if (m_ay8912)
- m_ay8912->address_data_w(space, offset - 0x0a, data);
+ m_ay8912->address_data_w(offset - 0x0a, data);
break;
case 0x0c: /* /BKXL */
diff --git a/src/mame/machine/lisa.cpp b/src/mame/machine/lisa.cpp
index 2ef7fe045fc..bf4244dcb2a 100644
--- a/src/mame/machine/lisa.cpp
+++ b/src/mame/machine/lisa.cpp
@@ -799,7 +799,7 @@ DIRECT_UPDATE_HANDLER (lisa_OPbaseoverride)
}
- if (m_maincpu->state_int(M68K_SR) & 0x2000)
+ if (BIT(m_maincpu->get_fc(), 2))
{
/* supervisor mode -> force register file 0 */
the_seg = 0;
@@ -1267,7 +1267,7 @@ READ16_MEMBER(lisa_state::lisa_r)
}
}
- if (m_maincpu->state_int(M68K_SR) & 0x2000)
+ if (BIT(m_maincpu->get_fc(), 2))
/* supervisor mode -> force register file 0 */
the_seg = 0;
@@ -1473,7 +1473,7 @@ WRITE16_MEMBER(lisa_state::lisa_w)
}
}
- if (m_maincpu->state_int(M68K_SR) & 0x2000)
+ if (BIT(m_maincpu->get_fc(), 2))
/* supervisor mode -> force register file 0 */
the_seg = 0;
diff --git a/src/mame/machine/lynx.cpp b/src/mame/machine/lynx.cpp
index 26b7c6793ef..a24ee0e7198 100644
--- a/src/mame/machine/lynx.cpp
+++ b/src/mame/machine/lynx.cpp
@@ -1020,7 +1020,7 @@ READ8_MEMBER(lynx_state::suzy_read)
break;
case RCART:
if (m_cart->exists())
- value = m_cart->read_rom(space, (m_suzy.high * m_granularity) + m_suzy.low);
+ value = m_cart->read_rom((m_suzy.high * m_granularity) + m_suzy.low);
else
value = 0;
m_suzy.low = (m_suzy.low + 1) & (m_granularity - 1);
diff --git a/src/mame/machine/m20_8086.cpp b/src/mame/machine/m20_8086.cpp
index d479a1b2590..d961cef1014 100644
--- a/src/mame/machine/m20_8086.cpp
+++ b/src/mame/machine/m20_8086.cpp
@@ -57,12 +57,13 @@ void m20_8086_device::i86_io(address_map &map)
map(0x7ffa, 0x7ffd).w(FUNC(m20_8086_device::handshake_w));
}
-MACHINE_CONFIG_START(m20_8086_device::device_add_mconfig)
- MCFG_DEVICE_ADD("8086", I8086, XTAL(24'000'000)/3)
- MCFG_DEVICE_PROGRAM_MAP(i86_prog)
- MCFG_DEVICE_IO_MAP(i86_io)
- MCFG_DEVICE_IRQ_ACKNOWLEDGE_DRIVER(m20_8086_device, int_cb)
-MACHINE_CONFIG_END
+void m20_8086_device::device_add_mconfig(machine_config &config)
+{
+ I8086(config, m_8086, XTAL(24'000'000)/3);
+ m_8086->set_addrmap(AS_PROGRAM, &m20_8086_device::i86_prog);
+ m_8086->set_addrmap(AS_IO, &m20_8086_device::i86_io);
+ m_8086->set_irq_acknowledge_callback(FUNC(m20_8086_device::int_cb));
+}
READ16_MEMBER(m20_8086_device::z8000_io_r)
{
diff --git a/src/mame/machine/m24_z8000.cpp b/src/mame/machine/m24_z8000.cpp
index 99d8b78428a..062dc11be3f 100644
--- a/src/mame/machine/m24_z8000.cpp
+++ b/src/mame/machine/m24_z8000.cpp
@@ -9,7 +9,7 @@ m24_z8000_device::m24_z8000_device(const machine_config &mconfig, const char *ta
device_t(mconfig, M24_Z8000, tag, owner, clock),
m_z8000(*this, "z8000"),
m_maincpu(*this, ":maincpu"),
- m_pic(*this, ":mb:pic8259"),
+ m_pic(*this, ":pic"),
m_halt_out(*this),
m_z8000_halt(true)
{
diff --git a/src/mame/machine/m2comm.cpp b/src/mame/machine/m2comm.cpp
index 6b43ecdf428..bccabacd422 100644
--- a/src/mame/machine/m2comm.cpp
+++ b/src/mame/machine/m2comm.cpp
@@ -182,8 +182,9 @@ DEFINE_DEVICE_TYPE(M2COMM, m2comm_device, "m2comm", "Model 2 Communication Board
// device_add_mconfig - add device configuration
//-------------------------------------------------
-MACHINE_CONFIG_START(m2comm_device::device_add_mconfig)
-MACHINE_CONFIG_END
+void m2comm_device::device_add_mconfig(machine_config &config)
+{
+}
//**************************************************************************
// LIVE DEVICE
diff --git a/src/mame/machine/m3comm.cpp b/src/mame/machine/m3comm.cpp
index 57163cce44a..a4c72c7801b 100644
--- a/src/mame/machine/m3comm.cpp
+++ b/src/mame/machine/m3comm.cpp
@@ -118,12 +118,13 @@ DEFINE_DEVICE_TYPE(M3COMM, m3comm_device, "m3comm", "Model 3 Communication Board
// device_add_mconfig - add device configuration
//-------------------------------------------------
-MACHINE_CONFIG_START(m3comm_device::device_add_mconfig)
- MCFG_DEVICE_ADD(M68K_TAG, M68000, 10000000) // random
- MCFG_DEVICE_PROGRAM_MAP(m3comm_mem)
+void m3comm_device::device_add_mconfig(machine_config &config)
+{
+ M68000(config, m_commcpu, 10000000); // random
+ m_commcpu->set_addrmap(AS_PROGRAM, &m3comm_device::m3comm_mem);
RAM(config, RAM_TAG).set_default_size("128K");
-MACHINE_CONFIG_END
+}
//**************************************************************************
// LIVE DEVICE
diff --git a/src/mame/machine/macpci.cpp b/src/mame/machine/macpci.cpp
index 08655f03dc0..4986892f6a7 100644
--- a/src/mame/machine/macpci.cpp
+++ b/src/mame/machine/macpci.cpp
@@ -186,11 +186,11 @@ READ8_MEMBER(macpci_state::mac_5396_r)
{
if (offset < 0x100)
{
- return m_539x_1->read(space, offset>>4);
+ return m_539x_1->read(offset>>4);
}
else // pseudo-DMA: read from the FIFO
{
- return m_539x_1->read(space, 2);
+ return m_539x_1->read(2);
}
// never executed
@@ -201,11 +201,11 @@ WRITE8_MEMBER(macpci_state::mac_5396_w)
{
if (offset < 0x100)
{
- m_539x_1->write(space, offset>>4, data);
+ m_539x_1->write(offset>>4, data);
}
else // pseudo-DMA: write to the FIFO
{
- m_539x_1->write(space, 2, data);
+ m_539x_1->write(2, data);
}
}
diff --git a/src/mame/machine/mbc55x.cpp b/src/mame/machine/mbc55x.cpp
deleted file mode 100644
index 4ae8d0fe92b..00000000000
--- a/src/mame/machine/mbc55x.cpp
+++ /dev/null
@@ -1,383 +0,0 @@
-// license:BSD-3-Clause
-// copyright-holders:Phill Harvey-Smith
-/*
- machine/mbc55x.c
-
- Machine driver for the Sanyo MBC-550 and MBC-555.
-
- Phill Harvey-Smith
- 2011-01-29.
-*****************************************************************************/
-
-#include "emu.h"
-#include <functional>
-
-#include "includes/mbc55x.h"
-#include "debug/debugcpu.h"
-
-
-/*-------------------------------------------------------------------------*/
-/* Defines, constants, and global variables */
-/*-------------------------------------------------------------------------*/
-
-/* Debugging */
-
-#define DEBUG_SET(flags) ((state->m_debug_machine & (flags))==(flags))
-
-#define DEBUG_NONE 0x0000000
-#define DMA_BREAK 0x0000001
-#define DECODE_BIOS 0x0000002
-#define DECODE_BIOS_RAW 0x0000004
-#define DECODE_DOS21 0x0000008
-
-#define LOG_KEYBOARD 1
-
-static void decode_dos21(device_t *device,offs_t pc);
-//static void mbc55x_recalculate_ints(running_machine &machine);
-static int instruction_hook(device_t &device, offs_t curpc);
-//static void fdc_reset(running_machine &machine);
-//static void set_disk_int(running_machine &machine, int state);
-
-READ8_MEMBER(mbc55x_state::iodecode_r)
-{
- return m_iodecode->read8(space, offset >> 1);
-}
-
-WRITE8_MEMBER(mbc55x_state::iodecode_w)
-{
- m_iodecode->write8(space, offset >> 1, data);
-}
-
-/* 8255 Configuration */
-
-READ8_MEMBER(mbc55x_state::game_io_r)
-{
- return 0xff;
-}
-
-WRITE8_MEMBER(mbc55x_state::game_io_w)
-{
-}
-
-READ8_MEMBER( mbc55x_state::printer_status_r)
-{
- return m_printer_status;
-}
-
-WRITE8_MEMBER(mbc55x_state::printer_data_w)
-{
- m_printer->write_data7(!BIT(data, 7));
- m_printer->write_data6(!BIT(data, 6));
- m_printer->write_data5(!BIT(data, 5));
- m_printer->write_data4(!BIT(data, 4));
- m_printer->write_data3(!BIT(data, 3));
- m_printer->write_data2(!BIT(data, 2));
- m_printer->write_data1(!BIT(data, 1));
- m_printer->write_data0(!BIT(data, 0));
-}
-
-WRITE8_MEMBER(mbc55x_state::disk_select_w)
-{
- floppy_image_device *floppy = nullptr;
-
- switch (data & 0x03)
- {
- case 0: floppy = m_floppy[0]->get_device(); break;
- case 1: floppy = m_floppy[1]->get_device(); break;
- case 2: floppy = m_floppy[2]->get_device(); break;
- case 3: floppy = m_floppy[3]->get_device(); break;
- }
-
- m_fdc->set_floppy(floppy);
-
- if (floppy)
- {
- floppy->mon_w(0);
- floppy->ss_w(BIT(data, 2));
- }
-
- m_printer->write_strobe(!BIT(data, 3));
-}
-
-WRITE_LINE_MEMBER(mbc55x_state::printer_busy_w)
-{
- m_printer_status = (m_printer_status & 0xef) | (state ? 0x10 : 0x00);
-}
-
-WRITE_LINE_MEMBER(mbc55x_state::printer_paper_end_w)
-{
- m_printer_status = (m_printer_status & 0xdf) | (state ? 0x20 : 0x00);
-}
-
-WRITE_LINE_MEMBER(mbc55x_state::printer_select_w)
-{
- m_printer_status = (m_printer_status & 0xbf) | (state ? 0x40 : 0x00);
-}
-
-/* Video ram page register */
-
-READ8_MEMBER( mbc55x_state::vram_page_r )
-{
- return m_vram_page;
-}
-
-WRITE8_MEMBER( mbc55x_state::vram_page_w )
-{
- logerror("%s : set vram page to %02X\n", machine().describe_context(),data);
-
- m_vram_page=data;
-}
-
-
-/*
- Keyboard emulation
-
-*/
-
-void mbc55x_state::keyboard_reset()
-{
- logerror("keyboard_reset()\n");
-
- memset(m_keyboard.keyrows,0xFF,MBC55X_KEYROWS);
- m_keyboard.key_special=0;
-
- // Setup timer to scan keyboard.
- m_keyboard.keyscan_timer->adjust(attotime::zero, 0, attotime::from_hz(50));
-}
-
-void mbc55x_state::scan_keyboard()
-{
- uint8_t keyrow;
- uint8_t row;
- uint8_t bitno;
- uint8_t mask;
-
- char key;
- static const char *const keynames[] =
- {
- "KEY0", "KEY1", "KEY2", "KEY3", "KEY4",
- "KEY5", "KEY6", "KEY7", "KEY8", "KEY9",
- "KEY10"
- };
-
- static const char keyvalues_normal[MBC55X_KEYROWS][8] =
- {
- { '1', '2', '3', '4' , '5', '6', '7', '8' },
- { '9', '0', '-', '=', '\\', 'q', 'w', 'e' },
- { 'r', 't', 'y', 'u', 'i', 'o', 'p', '[' },
- { ']', 'a', 's', 'd', 'f', 'g', 'h', 'j' },
- { 'k', 'l', ';', '\'', '`', 0x0d, 'z', 'x' },
- { 'c', 'v', 'b', 'n', 'm', ',', '.', '/', },
- { ' ', 0x08, ' ', ' ', ' ', ' ', ' ', ' ', }
-
- };
-
- static const char keyvalues_shift[MBC55X_KEYROWS][8] =
- {
- { '!', '@', '#', '$' , '%', '^', '&', '*' },
- { '(', ')', '_', '+', '|', 'Q', 'W', 'E' },
- { 'R', 'T', 'Y', 'U', 'I', 'O', 'P', '{' },
- { '}', 'A', 'S', 'D', 'F', 'G', 'H', 'J' },
- { 'K', 'L', ':', '"', '~', 0x0d, 'Z', 'X' },
- { 'C', 'V', 'B', 'N', 'M', ',', '?', '/' },
- { ' ', 0x08, ' ', ' ', ' ', ' ', ' ', ' ' }
- };
-
- // First read shift, control and graph
-
- m_keyboard.key_special = ioport(KEY_SPECIAL_TAG)->read();
-
- for(row=0; row<MBC55X_KEYROWS; row++)
- {
- keyrow = ioport(keynames[row])->read();
-
- for(mask=0x80, bitno=7;mask>0;mask=mask>>1, bitno-=1)
- {
- if(!(keyrow & mask) && (m_keyboard.keyrows[row] & mask))
- {
- if(m_keyboard.key_special & (KEY_BIT_LSHIFT | KEY_BIT_RSHIFT))
- key=keyvalues_shift[row][bitno];
- else
- key=keyvalues_normal[row][bitno];
-
- if (LOG_KEYBOARD) logerror("keypress %c\n",key);
- m_kb_uart->receive_character(key);
- }
- }
-
- m_keyboard.keyrows[row]=keyrow;
- }
-}
-
-TIMER_CALLBACK_MEMBER(mbc55x_state::keyscan_callback)
-{
- scan_keyboard();
-}
-
-READ8_MEMBER(mbc55x_state::mbc55x_kb_usart_r)
-{
- uint8_t result = 0;
-
- switch (offset)
- {
- case 0: //logerror("%s read kb_uart\n",machine().describe_context());
- result = m_kb_uart->data_r();
- break;
-
- case 1:
- result = m_kb_uart->status_r();
- if (m_keyboard.key_special & KEY_BIT_CTRL) // Parity error used to flag control down
- result |= i8251_device::I8251_STATUS_PARITY_ERROR;
- break;
- }
-
- return result;
-}
-
-void mbc55x_state::set_ram_size()
-{
- address_space &space = m_maincpu->space( AS_PROGRAM );
- int ramsize = m_ram->size();
- int nobanks = ramsize / RAM_BANK_SIZE;
- char bank[10];
- int bankno;
- uint8_t *ram = &m_ram->pointer()[0];
- uint8_t *map_base;
- int bank_base;
-
-
- logerror("Ramsize is %d bytes\n",ramsize);
- logerror("RAM_BANK_SIZE=%d, nobanks=%d\n",RAM_BANK_SIZE,nobanks);
-
- // Main memory mapping
-
- for(bankno=0; bankno<RAM_BANK_COUNT; bankno++)
- {
- sprintf(bank,"bank%x",bankno);
- bank_base=bankno*RAM_BANK_SIZE;
- map_base=&ram[bank_base];
-
- if(bankno<nobanks)
- {
- membank(bank)->set_base(map_base);
- space.install_readwrite_bank(bank_base, bank_base+(RAM_BANK_SIZE-1), bank);
- logerror("Mapping bank %d at %05X to RAM\n",bankno,bank_base);
- }
- else
- {
- space.nop_readwrite(bank_base, bank_base+(RAM_BANK_SIZE-1));
- logerror("Mapping bank %d at %05X to NOP\n",bankno,bank_base);
- }
- }
-
- // Graphics red and blue plane memory mapping, green is in main memory
- membank(RED_PLANE_TAG)->set_base(&m_video_mem[RED_PLANE_OFFSET]);
- space.install_readwrite_bank(RED_PLANE_MEMBASE, RED_PLANE_MEMBASE+(COLOUR_PLANE_SIZE-1), RED_PLANE_TAG);
- membank(BLUE_PLANE_TAG)->set_base(&m_video_mem[BLUE_PLANE_OFFSET]);
- space.install_readwrite_bank(BLUE_PLANE_MEMBASE, BLUE_PLANE_MEMBASE+(COLOUR_PLANE_SIZE-1), BLUE_PLANE_TAG);
-}
-
-void mbc55x_state::init_mbc55x()
-{
-}
-
-void mbc55x_state::machine_reset()
-{
- set_ram_size();
- keyboard_reset();
-}
-
-void mbc55x_state::machine_start()
-{
- /* init cpu */
-// mbc55x_cpu_init();
-
-
- /* setup debug commands */
- if (machine().debug_flags & DEBUG_FLAG_ENABLED)
- {
- using namespace std::placeholders;
- machine().debugger().console().register_command("mbc55x_debug", CMDFLAG_NONE, 0, 0, 1, std::bind(&mbc55x_state::debug_command, this, _1, _2));
-
- /* set up the instruction hook */
- m_maincpu->debug()->set_instruction_hook(instruction_hook);
- }
-
- m_debug_machine=DEBUG_NONE;
-
- m_printer_status = 0xff;
-
- // Allocate keyscan timer
- m_keyboard.keyscan_timer=machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(mbc55x_state::keyscan_callback),this));
-
- m_kb_uart->write_cts(0);
-}
-
-
-void mbc55x_state::debug_command(int ref, const std::vector<std::string> &params)
-{
- if (params.size() > 0)
- {
- int temp;
- sscanf(params[0].c_str(), "%d", &temp);
- m_debug_machine = temp;
- }
- else
- {
- machine().debugger().console().printf("Error usage : mbc55x_debug <debuglevel>\n");
- machine().debugger().console().printf("Current debuglevel=%02X\n", m_debug_machine);
- }
-}
-
-/*-----------------------------------------------
- instruction_hook - per-instruction hook
------------------------------------------------*/
-
-static int instruction_hook(device_t &device, offs_t curpc)
-{
- mbc55x_state *state = device.machine().driver_data<mbc55x_state>();
- address_space &space = device.memory().space(AS_PROGRAM);
- uint8_t *addr_ptr;
-
- addr_ptr = (uint8_t*)space.get_read_ptr(curpc);
-
- if ((addr_ptr !=nullptr) && (addr_ptr[0]==0xCD))
- {
-// logerror("int %02X called\n",addr_ptr[1]);
-
- if(DEBUG_SET(DECODE_DOS21) && (addr_ptr[1]==0x21))
- decode_dos21(&device,curpc);
- }
-
- return 0;
-}
-
-static void decode_dos21(device_t *device,offs_t pc)
-{
- mbc55x_state *state = device->machine().driver_data<mbc55x_state>();
-
- uint16_t ax = state->m_maincpu->state_int(I8086_AX);
- uint16_t bx = state->m_maincpu->state_int(I8086_BX);
- uint16_t cx = state->m_maincpu->state_int(I8086_CX);
- uint16_t dx = state->m_maincpu->state_int(I8086_DX);
- uint16_t cs = state->m_maincpu->state_int(I8086_CS);
- uint16_t ds = state->m_maincpu->state_int(I8086_DS);
- uint16_t es = state->m_maincpu->state_int(I8086_ES);
- uint16_t ss = state->m_maincpu->state_int(I8086_SS);
-
- uint16_t si = state->m_maincpu->state_int(I8086_SI);
- uint16_t di = state->m_maincpu->state_int(I8086_DI);
- uint16_t bp = state->m_maincpu->state_int(I8086_BP);
-
- device->logerror("=======================================================================\n");
- device->logerror("DOS Int 0x21 call at %05X\n",pc);
- device->logerror("AX=%04X, BX=%04X, CX=%04X, DX=%04X\n",ax,bx,cx,dx);
- device->logerror("CS=%04X, DS=%04X, ES=%04X, SS=%04X\n",cs,ds,es,ss);
- device->logerror("SI=%04X, DI=%04X, BP=%04X\n",si,di,bp);
- device->logerror("=======================================================================\n");
-
- if((ax & 0xff00)==0x0900)
- {
- device->machine().debug_break();
- }
-}
diff --git a/src/mame/machine/mbc55x_kbd.cpp b/src/mame/machine/mbc55x_kbd.cpp
new file mode 100644
index 00000000000..e4393486b86
--- /dev/null
+++ b/src/mame/machine/mbc55x_kbd.cpp
@@ -0,0 +1,295 @@
+// license:BSD-3-Clause
+// copyright-holders:AJR
+/*******************************************************************************
+
+ Serial keyboard emulation for Sanyo MBC-55x.
+
+ The key matrix is based on schematics, though the MCU is not yet dumped.
+ The Graph, Lock, Num Lock and 00 keys are not emulated yet, nor are the
+ Lock and Graph key LEDs and the alternate keypad functions. The unknown
+ jumper might select an international key layout.
+
+ The interface has only one unidirectional communication line. The reset
+ switch appears to be part of the main unit rather than the keyboard. The
+ ASCII codes sent by this keyboard are converted into XT codes by MS-DOS
+ using the lookup tables at the beginning of the ROM.
+
+*******************************************************************************/
+
+#include "emu.h"
+#include "machine/mbc55x_kbd.h"
+
+#include "cpu/mcs48/mcs48.h"
+#include "machine/keyboard.ipp"
+
+//**************************************************************************
+// DEVICE TYPE DEFINITION
+//**************************************************************************
+
+DEFINE_DEVICE_TYPE(MBC55X_KEYBOARD, mbc55x_keyboard_device, "mbc55x_kbd", "MBC-55x Keyboard")
+
+mbc55x_keyboard_device::mbc55x_keyboard_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
+ : device_t(mconfig, MBC55X_KEYBOARD, tag, owner, clock)
+ , device_matrix_keyboard_interface(mconfig, *this, "Y0", "Y1", "Y2", "Y3", "Y4", "Y5", "Y6", "Y7", "Y8", "Y9", "Y10", "Y11")
+ , device_serial_interface(mconfig, *this)
+ , m_modifiers(*this, "BUS")
+ , m_txd_callback(*this)
+{
+}
+
+//**************************************************************************
+// INPUT MATRIX
+//**************************************************************************
+
+static INPUT_PORTS_START(mbc55x_kbd)
+ PORT_START("Y0")
+ PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CHAR('\\') PORT_CHAR('|') PORT_CODE(KEYCODE_BACKSLASH)
+ PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CHAR(0x1b) PORT_CODE(KEYCODE_ESC)
+ PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CHAR(UCHAR_MAMEKEY(NUMLOCK)) PORT_CODE(KEYCODE_NUMLOCK)
+ PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CHAR('1') PORT_CHAR('!') PORT_CODE(KEYCODE_1)
+ PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CHAR('q') PORT_CHAR('Q') PORT_CODE(KEYCODE_Q)
+ PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CHAR('a') PORT_CHAR('A') PORT_CODE(KEYCODE_A)
+ PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CHAR('<') PORT_CHAR('>') PORT_CODE(KEYCODE_BACKSLASH2)
+ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("PF1 PF6") PORT_CHAR(UCHAR_MAMEKEY(F1)) PORT_CHAR(UCHAR_MAMEKEY(F6)) PORT_CODE(KEYCODE_F1)
+
+ PORT_START("Y1")
+ PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD) /*PORT_NAME("\xe2\x87\x90")*/ PORT_CHAR(0x08) PORT_CODE(KEYCODE_BACKSPACE) // ⇐
+ PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD) /*PORT_NAME("\xe2\x86\xb9")*/ PORT_CHAR(0x09) PORT_CODE(KEYCODE_TAB) // ↹
+ PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Space") PORT_CHAR(' ') PORT_CODE(KEYCODE_SPACE)
+ PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CHAR('2') PORT_CHAR('@') PORT_CODE(KEYCODE_2)
+ PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CHAR('w') PORT_CHAR('W') PORT_CODE(KEYCODE_W)
+ PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CHAR('s') PORT_CHAR('S') PORT_CODE(KEYCODE_S)
+ PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CHAR('z') PORT_CHAR('Z') PORT_CODE(KEYCODE_Z)
+ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("PF2 PF7") PORT_CHAR(UCHAR_MAMEKEY(F2)) PORT_CHAR(UCHAR_MAMEKEY(F7)) PORT_CODE(KEYCODE_F2)
+
+ PORT_START("Y2")
+ PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Del Ins") PORT_CHAR(UCHAR_MAMEKEY(DEL)) PORT_CHAR(UCHAR_MAMEKEY(INSERT)) PORT_CODE(KEYCODE_DEL)
+ PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD) /*PORT_NAME("\xe2\x8f\x8e")*/ PORT_CHAR(0x0d) PORT_CODE(KEYCODE_ENTER) // ⏎
+ PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Lock") PORT_CHAR(UCHAR_MAMEKEY(CAPSLOCK)) PORT_CODE(KEYCODE_LALT)
+ PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CHAR('3') PORT_CHAR('#') PORT_CODE(KEYCODE_3)
+ PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CHAR('e') PORT_CHAR('E') PORT_CODE(KEYCODE_E)
+ PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CHAR('d') PORT_CHAR('D') PORT_CODE(KEYCODE_D)
+ PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CHAR('x') PORT_CHAR('X') PORT_CODE(KEYCODE_X)
+ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("PF3 PF8") PORT_CHAR(UCHAR_MAMEKEY(F3)) PORT_CHAR(UCHAR_MAMEKEY(F8)) PORT_CODE(KEYCODE_F3)
+
+ PORT_START("Y3")
+ PORT_BIT(0xc0, IP_ACTIVE_HIGH, IPT_UNUSED)
+ PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Graph") PORT_CODE(KEYCODE_RALT)
+ PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CHAR('4') PORT_CHAR('$') PORT_CODE(KEYCODE_4)
+ PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CHAR('r') PORT_CHAR('R') PORT_CODE(KEYCODE_R)
+ PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CHAR('f') PORT_CHAR('F') PORT_CODE(KEYCODE_F)
+ PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CHAR('c') PORT_CHAR('C') PORT_CODE(KEYCODE_C)
+ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("PF4 PF9") PORT_CHAR(UCHAR_MAMEKEY(F4)) PORT_CHAR(UCHAR_MAMEKEY(F9)) PORT_CODE(KEYCODE_F4)
+
+ PORT_START("Y4")
+ PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_UNUSED)
+ PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Keypad 4 " UTF8_LEFT) PORT_CHAR(UCHAR_MAMEKEY(4_PAD)) PORT_CODE(KEYCODE_4_PAD)
+ PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CHAR(UCHAR_MAMEKEY(0_PAD)) PORT_CODE(KEYCODE_0_PAD)
+ PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CHAR('5') PORT_CHAR('%') PORT_CODE(KEYCODE_5)
+ PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CHAR('t') PORT_CHAR('T') PORT_CODE(KEYCODE_T)
+ PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CHAR('g') PORT_CHAR('G') PORT_CODE(KEYCODE_G)
+ PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CHAR('v') PORT_CHAR('V') PORT_CODE(KEYCODE_V)
+ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("PF5 PF10") PORT_CHAR(UCHAR_MAMEKEY(F5)) PORT_CHAR(UCHAR_MAMEKEY(F10)) PORT_CODE(KEYCODE_F5)
+
+ PORT_START("Y5")
+ PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_UNUSED)
+ PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Keypad 5 " UTF8_DOWN) PORT_CHAR(UCHAR_MAMEKEY(5_PAD)) PORT_CODE(KEYCODE_5_PAD)
+ PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CHAR(UCHAR_MAMEKEY(00_PAD)) PORT_CODE(KEYCODE_00_PAD)
+ PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CHAR('6') PORT_CHAR('^') PORT_CODE(KEYCODE_6)
+ PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CHAR('y') PORT_CHAR('Y') PORT_CODE(KEYCODE_Y)
+ PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CHAR('h') PORT_CHAR('H') PORT_CODE(KEYCODE_H)
+ PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CHAR('b') PORT_CHAR('B') PORT_CODE(KEYCODE_B)
+ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CHAR(UCHAR_MAMEKEY(EQUALS_PAD)) PORT_CODE(KEYCODE_EQUALS_PAD)
+
+ PORT_START("Y6")
+ PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_UNUSED)
+ PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Keypad 6 " UTF8_RIGHT) PORT_CHAR(UCHAR_MAMEKEY(6_PAD)) PORT_CODE(KEYCODE_6_PAD)
+ PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CHAR(UCHAR_MAMEKEY(DEL_PAD)) PORT_CODE(KEYCODE_DEL_PAD)
+ PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CHAR('7') PORT_CHAR('$') PORT_CODE(KEYCODE_7)
+ PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CHAR('u') PORT_CHAR('U') PORT_CODE(KEYCODE_U)
+ PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CHAR('j') PORT_CHAR('J') PORT_CODE(KEYCODE_J)
+ PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CHAR('n') PORT_CHAR('N') PORT_CODE(KEYCODE_N)
+ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CHAR(UCHAR_MAMEKEY(SLASH_PAD)) PORT_CODE(KEYCODE_SLASH_PAD)
+
+ PORT_START("Y7")
+ PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_UNUSED)
+ PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Keypad 7 \xe2\x86\x96") PORT_CHAR(UCHAR_MAMEKEY(7_PAD)) PORT_CODE(KEYCODE_7_PAD) // ↖
+ PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Keypad 1 LF") PORT_CHAR(UCHAR_MAMEKEY(1_PAD)) PORT_CODE(KEYCODE_1_PAD)
+ PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CHAR('8') PORT_CHAR('*') PORT_CODE(KEYCODE_8)
+ PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CHAR('i') PORT_CHAR('I') PORT_CODE(KEYCODE_I)
+ PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CHAR('k') PORT_CHAR('K') PORT_CODE(KEYCODE_K)
+ PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CHAR('m') PORT_CHAR('M') PORT_CODE(KEYCODE_M)
+ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CHAR(UCHAR_MAMEKEY(ASTERISK)) PORT_CODE(KEYCODE_ASTERISK)
+
+ PORT_START("Y8")
+ PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_UNUSED)
+ PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Keypad 8 " UTF8_UP) PORT_CHAR(UCHAR_MAMEKEY(8_PAD)) PORT_CODE(KEYCODE_8_PAD)
+ PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CHAR(UCHAR_MAMEKEY(2_PAD)) PORT_CODE(KEYCODE_2_PAD)
+ PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CHAR('9') PORT_CHAR('(') PORT_CODE(KEYCODE_9)
+ PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CHAR('o') PORT_CHAR('O') PORT_CODE(KEYCODE_O)
+ PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CHAR('l') PORT_CHAR('L') PORT_CODE(KEYCODE_L)
+ PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME(", ,") PORT_CHAR(',') PORT_CODE(KEYCODE_COMMA)
+ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Break") PORT_CODE(KEYCODE_F15)
+
+ PORT_START("Y9")
+ PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_UNUSED)
+ PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Keypad 9 Pg Up") PORT_CHAR(UCHAR_MAMEKEY(9_PAD)) PORT_CODE(KEYCODE_9_PAD)
+ PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Keypad 3 Pg Dn") PORT_CHAR(UCHAR_MAMEKEY(3_PAD)) PORT_CODE(KEYCODE_3_PAD)
+ PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CHAR('0') PORT_CHAR(')') PORT_CODE(KEYCODE_0)
+ PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CHAR('p') PORT_CHAR('P') PORT_CODE(KEYCODE_P)
+ PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CHAR(';') PORT_CHAR(':') PORT_CODE(KEYCODE_COLON)
+ PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME(". .") PORT_CHAR('.') PORT_CODE(KEYCODE_STOP)
+ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CHAR(UCHAR_MAMEKEY(MINUS_PAD)) PORT_CODE(KEYCODE_F15)
+
+ PORT_START("Y10")
+ PORT_BIT(0xe0, IP_ACTIVE_HIGH, IPT_UNUSED)
+ PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CHAR('-') PORT_CHAR('_') PORT_CODE(KEYCODE_MINUS)
+ PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CHAR('[') PORT_CHAR('{') PORT_CODE(KEYCODE_OPENBRACE)
+ PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CHAR('\'') PORT_CHAR('"') PORT_CODE(KEYCODE_QUOTE)
+ PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CHAR('/') PORT_CHAR('?') PORT_CODE(KEYCODE_SLASH)
+
+ PORT_START("Y11")
+ PORT_BIT(0xe0, IP_ACTIVE_HIGH, IPT_UNUSED)
+ PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CHAR('=') PORT_CHAR('+') PORT_CODE(KEYCODE_EQUALS)
+ PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CHAR(']') PORT_CHAR('}') PORT_CODE(KEYCODE_CLOSEBRACE)
+ PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CHAR('`') PORT_CHAR('~') PORT_CODE(KEYCODE_TILDE) // to right of quote
+ PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CHAR('*') PORT_CODE(KEYCODE_RCONTROL) // between slash and right shift
+ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) /*PORT_NAME("Keypad \xe2\x8f\x8e")*/ PORT_CHAR(UCHAR_MAMEKEY(ENTER_PAD)) PORT_CODE(KEYCODE_ENTER_PAD) // ⏎
+
+ PORT_START("BUS")
+ PORT_BIT(0x8f, IP_ACTIVE_LOW, IPT_UNUSED)
+ PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Shift") PORT_CHAR(UCHAR_SHIFT_1) PORT_CODE(KEYCODE_LSHIFT) PORT_CODE(KEYCODE_RSHIFT)
+ PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Ctrl") PORT_CHAR(UCHAR_SHIFT_2) PORT_CODE(KEYCODE_LCONTROL)
+ PORT_DIPNAME(0x40, 0x00, DEF_STR(Unknown)) PORT_DIPLOCATION("JP1:1")
+ PORT_DIPSETTING(0x40, DEF_STR(Off))
+ PORT_DIPSETTING(0x00, DEF_STR(On))
+INPUT_PORTS_END
+
+ioport_constructor mbc55x_keyboard_device::device_input_ports() const
+{
+ return INPUT_PORTS_NAME(mbc55x_kbd);
+}
+
+//**************************************************************************
+// INITIALIZATION AND HLE SERIAL INTERFACE
+//**************************************************************************
+
+void mbc55x_keyboard_device::device_resolve_objects()
+{
+ m_txd_callback.resolve_safe();
+}
+
+void mbc55x_keyboard_device::device_start()
+{
+ set_tra_rate(1230); // more or less
+}
+
+void mbc55x_keyboard_device::device_reset()
+{
+ start_processing(attotime::from_hz(6_MHz_XTAL / 75)); // guess
+ m_txd_callback(1);
+}
+
+void mbc55x_keyboard_device::tra_callback()
+{
+ m_txd_callback(transmit_register_get_data_bit());
+}
+
+void mbc55x_keyboard_device::tra_complete()
+{
+ start_processing(attotime::from_hz(6_MHz_XTAL / 75));
+}
+
+//**************************************************************************
+// KEYBOARD SCAN AND DECODING
+//**************************************************************************
+
+const u8 mbc55x_keyboard_device::s_code_table[2][12][8] =
+{
+ {
+ { 0x15, '>', 'A', 'Q', '!', 0x00, 0x1b, '|' },
+ { 0x16, 'Z', 'S', 'W', '@', ' ', 0x05, 0x08 },
+ { 0x17, 'X', 'D', 'E', '#', 0x00, 0x0d, 0x07 },
+ { 0x18, 'C', 'F', 'R', '$', '0', '4', 0x00 },
+ { 0x19, 'V', 'G', 'T', '%', 0x00, '5', 0x00 },
+ { '=', 'B', 'H', 'Y', '^', '.', '6', 0x00 },
+ { '/', 'N', 'J', 'U', '&', '1', '7', 0x00 },
+ { '*', 'M', 'K', 'I', '*', '2', '8', 0x00 },
+ { 0x03, ',', 'L', 'O', '(', '3', '9', 0x00 },
+ { '-', '.', ':', 'P', ')', 0x00, 0x00, 0x00 },
+ { '+', '?', '"', '{', '_', 0x00, 0x00, 0x00 },
+ { 0x0d, '*', '~', '}', '+', 0x00, 0x00, 0x00 }
+ },
+ {
+ { 0x10, '<', 'a', 'q', '1', 0x00, 0x1b, '\\' },
+ { 0x11, 'z', 's', 'w', '2', ' ', 0x09, 0x08 },
+ { 0x12, 'x', 'd', 'e', '3', 0x00, 0x0d, 0x7f },
+ { 0x13, 'c', 'f', 'r', '4', '0', '4', 0x00 },
+ { 0x14, 'v', 'g', 't', '5', 0x00, '5', 0x00 },
+ { '=', 'b', 'h', 'y', '6', '.', '6', 0x00 },
+ { '/', 'n', 'j', 'u', '7', '1', '7', 0x00 },
+ { '*', 'm', 'k', 'i', '8', '2', '8', 0x00 },
+ { 0x03, ',', 'l', 'o', '9', '3', '9', 0x00 },
+ { '-', '.', ';', 'p', '0', 0x00, 0x00, 0x00 },
+ { '+', '/', '\'', '[', '-', 0x00, 0x00, 0x00 },
+ { 0x0d, '*', '`', ']', '=', 0x00, 0x00, 0x00 }
+ }
+};
+
+void mbc55x_keyboard_device::key_make(u8 row, u8 column)
+{
+ send_translated(row, column);
+}
+
+void mbc55x_keyboard_device::key_repeat(u8 row, u8 column)
+{
+ send_translated(row, column);
+}
+
+void mbc55x_keyboard_device::scan_complete()
+{
+ if (!is_transmit_register_empty())
+ stop_processing();
+}
+
+void mbc55x_keyboard_device::send_key(u8 code, bool ctrl_active)
+{
+ if (!is_transmit_register_empty())
+ return;
+
+ // Control characters are transmitted with inverted parity
+ set_data_frame(1, 8, ctrl_active ? PARITY_ODD : PARITY_EVEN, STOP_BITS_2);
+
+ transmit_register_setup(code);
+}
+
+void mbc55x_keyboard_device::send_translated(u8 row, u8 column)
+{
+ const ioport_value modifiers = m_modifiers->read();
+
+ u8 code = s_code_table[BIT(modifiers, 4)][row][column];
+ if (code != 0)
+ send_key(code, !BIT(modifiers, 5));
+}
+
+//**************************************************************************
+// KEYBOARD CONTROLLER CONFIGURATION
+//**************************************************************************
+
+void mbc55x_keyboard_device::device_add_mconfig(machine_config &config)
+{
+ I8049(config, "kbdc", 6_MHz_XTAL).set_disable();
+ //kbdc.bus_in_cb().set_ioport("BUS");
+ //kbdc.p1_in_cb().set(FUNC(mbc55x_keyboard_device::key_matrix_r));
+ //kbdc.p2_out_cb().set(FUNC(mbc55x_keyboard_device::scan_output_w));
+}
+
+ROM_START(mbc55x_kbd)
+ ROM_REGION(0x0800, "kbdc", 0)
+ ROM_LOAD("d8049hc.m1", 0x0000, 0x0800, NO_DUMP)
+ROM_END
+
+const tiny_rom_entry *mbc55x_keyboard_device::device_rom_region() const
+{
+ return ROM_NAME(mbc55x_kbd);
+}
diff --git a/src/mame/machine/mbc55x_kbd.h b/src/mame/machine/mbc55x_kbd.h
new file mode 100644
index 00000000000..9096e9afd0b
--- /dev/null
+++ b/src/mame/machine/mbc55x_kbd.h
@@ -0,0 +1,64 @@
+// license:BSD-3-Clause
+// copyright-holders:AJR
+
+/*******************************************************************************
+
+ Serial keyboard emulation for Sanyo MBC-55x.
+
+*******************************************************************************/
+
+#ifndef MAME_MACHINE_MBC55X_KBD_H
+#define MAME_MACHINE_MBC55X_KBD_H
+
+#pragma once
+
+#include "diserial.h"
+#include "machine/keyboard.h"
+
+//**************************************************************************
+// TYPE DEFINITIONS
+//**************************************************************************
+
+class mbc55x_keyboard_device : public device_t, public device_matrix_keyboard_interface<12U>, public device_serial_interface
+{
+ static const u8 s_code_table[2][12][8];
+
+public:
+ // construction/destruction
+ mbc55x_keyboard_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock = 0);
+
+ // configuration
+ auto txd_callback() { return m_txd_callback.bind(); }
+
+protected:
+ // device-level overrides
+ virtual ioport_constructor device_input_ports() const override;
+ virtual void device_resolve_objects() override;
+ virtual void device_start() override;
+ virtual void device_reset() override;
+ virtual void device_add_mconfig(machine_config &config) override;
+ virtual const tiny_rom_entry *device_rom_region() const override;
+
+ // device_matrix_keyboard_interface overrides
+ virtual void key_make(u8 row, u8 column) override;
+ virtual void key_repeat(u8 row, u8 column) override;
+ virtual void scan_complete() override;
+
+ // device_serial_interface overrides;
+ virtual void tra_callback() override;
+ virtual void tra_complete() override;
+
+private:
+ void send_key(u8 code, bool ctrl_active);
+ void send_translated(u8 row, u8 column);
+
+ // input ports
+ required_ioport m_modifiers;
+
+ // output callback
+ devcb_write_line m_txd_callback;
+};
+
+DECLARE_DEVICE_TYPE(MBC55X_KEYBOARD, mbc55x_keyboard_device)
+
+#endif // MAME_MACHINE_MBC55X_KBD_H
diff --git a/src/mame/machine/mbee.cpp b/src/mame/machine/mbee.cpp
index fe8efb5d15d..774676ec75d 100644
--- a/src/mame/machine/mbee.cpp
+++ b/src/mame/machine/mbee.cpp
@@ -233,17 +233,17 @@ READ8_MEMBER( mbee_state::speed_high_r )
WRITE8_MEMBER( mbee_state::port04_w ) // address
{
- m_rtc->write(space, 0, data);
+ m_rtc->write(0, data);
}
WRITE8_MEMBER( mbee_state::port06_w ) // write
{
- m_rtc->write(space, 1, data);
+ m_rtc->write(1, data);
}
READ8_MEMBER( mbee_state::port07_r ) // read
{
- return m_rtc->read(space, 1);
+ return m_rtc->read(1);
}
// See it work: Run mbeett, choose RTC in the config switches, run the F3 test, press Esc.
diff --git a/src/mame/machine/mega32x.cpp b/src/mame/machine/mega32x.cpp
index 3ab57276e1d..9a9fa04cdb0 100644
--- a/src/mame/machine/mega32x.cpp
+++ b/src/mame/machine/mega32x.cpp
@@ -1781,7 +1781,6 @@ void sega_32x_device::device_add_mconfig(machine_config &config)
#endif
voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref", 0));
- vref.set_output(5.0);
vref.add_route(0, "ldac", 1.0, DAC_VREF_POS_INPUT);
vref.add_route(0, "ldac", -1.0, DAC_VREF_NEG_INPUT);
vref.add_route(0, "rdac", 1.0, DAC_VREF_POS_INPUT);
diff --git a/src/mame/machine/megacd.cpp b/src/mame/machine/megacd.cpp
index 24aad56af20..8b7e9f27574 100644
--- a/src/mame/machine/megacd.cpp
+++ b/src/mame/machine/megacd.cpp
@@ -292,50 +292,50 @@ static GFXDECODE_START( gfx_segacd )
GFXDECODE_END
-MACHINE_CONFIG_START(sega_segacd_device::device_add_mconfig)
-
- MCFG_DEVICE_ADD("segacd_68k", M68000, SEGACD_CLOCK ) /* 12.5 MHz */
- MCFG_DEVICE_PROGRAM_MAP(segacd_map)
- MCFG_DEVICE_IRQ_ACKNOWLEDGE_DEVICE(DEVICE_SELF, sega_segacd_device, segacd_sub_int_callback)
+void sega_segacd_device::device_add_mconfig(machine_config &config)
+{
+ M68000(config, m_scdcpu, SEGACD_CLOCK); /* 12.5 MHz */
+ m_scdcpu->set_addrmap(AS_PROGRAM, &sega_segacd_device::segacd_map);
+ m_scdcpu->set_irq_acknowledge_callback(device_irq_acknowledge_delegate(FUNC(sega_segacd_device::segacd_sub_int_callback),this));
- MCFG_DEVICE_ADD("cdc", LC89510, 0) // cd controller
+ LC89510(config, "cdc", 0); // cd controller
// temporary until things are cleaned up
LC89510_TEMP(config, m_lc89510_temp, 0); // cd controller
m_lc89510_temp->set_cdc_do_dma_callback(FUNC(sega_segacd_device::SegaCD_CDC_Do_DMA), this); // hack
-
- MCFG_TIMER_ADD_NONE("sw_timer") //stopwatch timer
- MCFG_TIMER_DRIVER_ADD("stamp_timer", sega_segacd_device, stamp_timer_callback)
- MCFG_TIMER_DRIVER_ADD("irq3_timer", sega_segacd_device, irq3_timer_callback)
- MCFG_TIMER_DRIVER_ADD("dma_timer", sega_segacd_device, dma_timer_callback)
+ TIMER(config, m_stopwatch_timer).configure_generic(timer_device::expired_delegate()); //stopwatch timer
+ TIMER(config, m_stamp_timer).configure_generic(FUNC(sega_segacd_device::stamp_timer_callback));
+ TIMER(config, m_irq3_timer).configure_generic(FUNC(sega_segacd_device::irq3_timer_callback));
+ TIMER(config, m_dma_timer).configure_generic(FUNC(sega_segacd_device::dma_timer_callback));
config.set_default_layout(layout_megacd);
- MCFG_DEVICE_ADD("rfsnd", RF5C68, SEGACD_CLOCK) // RF5C164!
- MCFG_SOUND_ROUTE( 0, ":lspeaker", 0.50 )
- MCFG_SOUND_ROUTE( 1, ":rspeaker", 0.50 )
- MCFG_DEVICE_ADDRESS_MAP(0, segacd_pcm_map)
+ RF5C68(config, m_rfsnd, SEGACD_CLOCK); // RF5C164!
+ m_rfsnd->add_route( 0, ":lspeaker", 0.50 );
+ m_rfsnd->add_route( 1, ":rspeaker", 0.50 );
+ m_rfsnd->set_addrmap(0, &sega_segacd_device::segacd_pcm_map);
NVRAM(config, "backupram", nvram_device::DEFAULT_ALL_0);
- MCFG_QUANTUM_PERFECT_CPU("segacd_68k") // perfect sync to the fastest cpu
-MACHINE_CONFIG_END
+ config.m_perfect_cpu_quantum = subtag("segacd_68k"); // perfect sync to the fastest cpu
+}
sega_segacd_device::sega_segacd_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock)
- : device_t(mconfig, type, tag, owner, clock),
- device_gfx_interface(mconfig, *this, gfx_segacd),
- m_scdcpu(*this, "segacd_68k"),
- m_rfsnd(*this, "rfsnd"),
- m_lc89510_temp(*this, "tempcdc"),
- m_stopwatch_timer(*this, "sw_timer"),
- m_stamp_timer(*this, "stamp_timer"),
- m_irq3_timer(*this, "irq3_timer"),
- m_dma_timer(*this, "dma_timer"),
- m_prgram(*this, "prgram"),
- m_dataram(*this, "dataram"),
- m_font_bits(*this, "font_bits")
+ : device_t(mconfig, type, tag, owner, clock)
+ , device_gfx_interface(mconfig, *this, gfx_segacd)
+ , m_scdcpu(*this, "segacd_68k")
+ , m_hostcpu(*this, finder_base::DUMMY_TAG)
+ , m_rfsnd(*this, "rfsnd")
+ , m_lc89510_temp(*this, "tempcdc")
+ , m_stopwatch_timer(*this, "sw_timer")
+ , m_stamp_timer(*this, "stamp_timer")
+ , m_irq3_timer(*this, "irq3_timer")
+ , m_dma_timer(*this, "dma_timer")
+ , m_prgram(*this, "prgram")
+ , m_dataram(*this, "dataram")
+ , m_font_bits(*this, "font_bits")
{
}
@@ -568,7 +568,7 @@ READ16_MEMBER( sega_segacd_device::scd_a12002_memory_mode_r )
// RET = Return access (bit 1)
-WRITE8_MEMBER( sega_segacd_device::scd_a12002_memory_mode_w_8_15 )
+void sega_segacd_device::scd_a12002_memory_mode_w_8_15(u8 data)
{
if (data & 0xff00)
{
@@ -579,7 +579,7 @@ WRITE8_MEMBER( sega_segacd_device::scd_a12002_memory_mode_w_8_15 )
}
-WRITE8_MEMBER( sega_segacd_device::scd_a12002_memory_mode_w_0_7 )
+void sega_segacd_device::scd_a12002_memory_mode_w_0_7(u8 data)
{
//printf("scd_a12002_memory_mode_w_0_7 %04x\n",data);
@@ -605,10 +605,10 @@ WRITE8_MEMBER( sega_segacd_device::scd_a12002_memory_mode_w_0_7 )
WRITE16_MEMBER( sega_segacd_device::scd_a12002_memory_mode_w )
{
if (ACCESSING_BITS_8_15)
- scd_a12002_memory_mode_w_8_15(space, 0, data>>8, mem_mask>>8);
+ scd_a12002_memory_mode_w_8_15(data>>8);
if (ACCESSING_BITS_0_7)
- scd_a12002_memory_mode_w_0_7(space, 0, data&0xff, mem_mask&0xff);
+ scd_a12002_memory_mode_w_0_7(data&0xff);
}
@@ -627,14 +627,14 @@ READ16_MEMBER( sega_segacd_device::segacd_sub_memory_mode_r )
}
-WRITE8_MEMBER( sega_segacd_device::segacd_sub_memory_mode_w_8_15 )
+void sega_segacd_device::segacd_sub_memory_mode_w_8_15(u8 data)
{
/* setting write protect bits from sub-cpu has no effect? */
}
-WRITE8_MEMBER( sega_segacd_device::segacd_sub_memory_mode_w_0_7 )
+void sega_segacd_device::segacd_sub_memory_mode_w_0_7(u8 data)
{
segacd_memory_priority_mode = (data&0x0018)>>3;
@@ -696,10 +696,10 @@ WRITE16_MEMBER( sega_segacd_device::segacd_sub_memory_mode_w )
if (ACCESSING_BITS_8_15)
- segacd_sub_memory_mode_w_8_15(space, 0, data>>8, mem_mask>>8);
+ segacd_sub_memory_mode_w_8_15(data>>8);
if (ACCESSING_BITS_0_7)
- segacd_sub_memory_mode_w_0_7(space, 0, data&0xff, mem_mask&0xff);
+ segacd_sub_memory_mode_w_0_7(data&0xff);
}
@@ -1724,7 +1724,7 @@ READ16_MEMBER( sega_segacd_device::font_converted_r )
void sega_segacd_device::device_start()
{
- address_space& space = machine().device("maincpu")->memory().space(AS_PROGRAM);
+ address_space& space = m_hostcpu->space(AS_PROGRAM);
m_backupram.resize(0x2000);
subdevice<nvram_device>("backupram")->set_base(&m_backupram[0], 0x2000);
@@ -1852,7 +1852,6 @@ void sega_segacd_device::SegaCD_CDC_Do_DMA(int &dmacount, uint8_t *CDC_BUFFER, u
uint16_t *dest;
int srcoffset = 0;
int dstoffset = 0;
- address_space& space = m_scdcpu->space(AS_PROGRAM);
bool PCM_DMA = false;
@@ -1890,8 +1889,8 @@ void sega_segacd_device::SegaCD_CDC_Do_DMA(int &dmacount, uint8_t *CDC_BUFFER, u
if (PCM_DMA)
{
- m_rfsnd->rf5c68_mem_w(space, dstoffset & 0xfff, data >> 8);
- m_rfsnd->rf5c68_mem_w(space, (dstoffset+1) & 0xfff, data);
+ m_rfsnd->rf5c68_mem_w(dstoffset & 0xfff, data >> 8);
+ m_rfsnd->rf5c68_mem_w((dstoffset+1) & 0xfff, data);
// printf("PCM_DMA writing %04x %04x\n",0xff2000+(dstoffset*2), data);
}
else
diff --git a/src/mame/machine/megacd.h b/src/mame/machine/megacd.h
index 6ae5df9e616..aacb18d56a9 100644
--- a/src/mame/machine/megacd.h
+++ b/src/mame/machine/megacd.h
@@ -14,6 +14,8 @@
class sega_segacd_device : public device_t, public device_gfx_interface
{
public:
+ template <typename T> void set_hostcpu(T &&tag) { m_hostcpu.set_tag(std::forward<T>(tag)); }
+
// set some variables at start, depending on region (shall be moved to a device interface?)
void set_framerate(int rate) { m_framerate = rate; }
void set_total_scanlines(int total) { m_base_total_scanlines = total; } // this gets set at start only
@@ -25,12 +27,12 @@ public:
DECLARE_WRITE16_MEMBER( scd_a12000_halt_reset_w );
DECLARE_READ16_MEMBER( scd_a12000_halt_reset_r );
DECLARE_READ16_MEMBER( scd_a12002_memory_mode_r );
- DECLARE_WRITE8_MEMBER( scd_a12002_memory_mode_w_8_15 );
- DECLARE_WRITE8_MEMBER( scd_a12002_memory_mode_w_0_7 );
+ void scd_a12002_memory_mode_w_8_15(u8 data);
+ void scd_a12002_memory_mode_w_0_7(u8 data);
DECLARE_WRITE16_MEMBER( scd_a12002_memory_mode_w );
DECLARE_READ16_MEMBER( segacd_sub_memory_mode_r );
- DECLARE_WRITE8_MEMBER( segacd_sub_memory_mode_w_8_15 );
- DECLARE_WRITE8_MEMBER( segacd_sub_memory_mode_w_0_7 );
+ void segacd_sub_memory_mode_w_8_15(u8 data);
+ void segacd_sub_memory_mode_w_0_7(u8 data);
DECLARE_WRITE16_MEMBER( segacd_sub_memory_mode_w );
DECLARE_READ16_MEMBER( segacd_comms_flags_r );
@@ -105,6 +107,7 @@ protected:
virtual void device_add_mconfig(machine_config &config) override;
required_device<cpu_device> m_scdcpu;
+ required_device<cpu_device> m_hostcpu;
required_device<rf5c68_device> m_rfsnd;
required_device<lc89510_temp_device> m_lc89510_temp;
required_device<timer_device> m_stopwatch_timer;
diff --git a/src/mame/machine/megacdcd.cpp b/src/mame/machine/megacdcd.cpp
index 5620ab2f25c..dd5739a809f 100644
--- a/src/mame/machine/megacdcd.cpp
+++ b/src/mame/machine/megacdcd.cpp
@@ -1154,13 +1154,14 @@ TIMER_DEVICE_CALLBACK_MEMBER( lc89510_temp_device::segacd_access_timer_callback
}
-MACHINE_CONFIG_START(lc89510_temp_device::device_add_mconfig)
- MCFG_TIMER_DRIVER_ADD_PERIODIC("hock_timer", lc89510_temp_device, segacd_access_timer_callback, attotime::from_hz(75))
+void lc89510_temp_device::device_add_mconfig(machine_config &config)
+{
+ TIMER(config, "hock_timer").configure_periodic(FUNC(lc89510_temp_device::segacd_access_timer_callback), attotime::from_hz(75));
- MCFG_DEVICE_ADD( "cdda", CDDA )
- MCFG_SOUND_ROUTE( 0, ":lspeaker", 0.50 ) // TODO: accurate volume balance
- MCFG_SOUND_ROUTE( 1, ":rspeaker", 0.50 )
-MACHINE_CONFIG_END
+ cdda_device &cdda(CDDA(config, "cdda"));
+ cdda.add_route(0, ":lspeaker", 0.50); // TODO: accurate volume balance
+ cdda.add_route(1, ":rspeaker", 0.50);
+}
diff --git a/src/mame/machine/megadriv.cpp b/src/mame/machine/megadriv.cpp
index e322e6c2225..43da1c28c11 100644
--- a/src/mame/machine/megadriv.cpp
+++ b/src/mame/machine/megadriv.cpp
@@ -50,7 +50,7 @@ READ8_MEMBER(md_base_state::megadriv_68k_YM2612_read)
//osd_printf_debug("megadriv_68k_YM2612_read %02x %04x\n",offset,mem_mask);
if ((m_genz80.z80_has_bus == 0) && (m_genz80.z80_is_reset == 0))
{
- return m_ymsnd->read(space, offset);
+ return m_ymsnd->read(offset);
}
else
{
@@ -68,7 +68,7 @@ WRITE8_MEMBER(md_base_state::megadriv_68k_YM2612_write)
//osd_printf_debug("megadriv_68k_YM2612_write %02x %04x %04x\n",offset,data,mem_mask);
if ((m_genz80.z80_has_bus == 0) && (m_genz80.z80_is_reset == 0))
{
- m_ymsnd->write(space, offset, data);
+ m_ymsnd->write(offset, data);
}
else
{
@@ -877,12 +877,14 @@ IRQ_CALLBACK_MEMBER(md_base_state::genesis_int_callback)
return (0x60+irqline*4)/4; // vector address
}
-MACHINE_CONFIG_START(md_base_state::megadriv_timers)
- MCFG_TIMER_DEVICE_ADD(m_scan_timer, "gen_vdp", sega315_5313_device, megadriv_scanline_timer_callback)
-MACHINE_CONFIG_END
+void md_base_state::megadriv_timers(machine_config &config)
+{
+ TIMER(config, m_scan_timer).configure_generic("gen_vdp", FUNC(sega315_5313_device::megadriv_scanline_timer_callback));
+}
-MACHINE_CONFIG_START(md_base_state::md_ntsc)
+void md_base_state::md_ntsc(machine_config &config)
+{
M68000(config, m_maincpu, MASTER_CLOCK_NTSC / 7); /* 7.67 MHz */
m_maincpu->set_addrmap(AS_PROGRAM, &md_base_state::megadriv_map);
m_maincpu->set_irq_acknowledge_callback(FUNC(md_base_state::genesis_int_callback));
@@ -899,22 +901,22 @@ MACHINE_CONFIG_START(md_base_state::md_ntsc)
megadriv_timers(config);
- MCFG_DEVICE_ADD("gen_vdp", SEGA315_5313, MASTER_CLOCK_NTSC, "maincpu")
- MCFG_SEGA315_5313_IS_PAL(false)
- MCFG_SEGA315_5313_SND_IRQ_CALLBACK(WRITELINE(*this, md_base_state, vdp_sndirqline_callback_genesis_z80));
- MCFG_SEGA315_5313_LV6_IRQ_CALLBACK(WRITELINE(*this, md_base_state, vdp_lv6irqline_callback_genesis_68k));
- MCFG_SEGA315_5313_LV4_IRQ_CALLBACK(WRITELINE(*this, md_base_state, vdp_lv4irqline_callback_genesis_68k));
- MCFG_VIDEO_SET_SCREEN("megadriv")
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 0.25)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker",0.25)
-
- MCFG_SCREEN_ADD("megadriv", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) // Vblank handled manually.
- MCFG_SCREEN_SIZE(64*8, 620)
- MCFG_SCREEN_VISIBLE_AREA(0, 32*8-1, 0, 28*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(md_base_state, screen_update_megadriv) /* Copies a bitmap */
- MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE(*this, md_base_state, screen_vblank_megadriv)) /* Used to Sync the timing */
+ SEGA315_5313(config, m_vdp, MASTER_CLOCK_NTSC, m_maincpu);
+ m_vdp->set_is_pal(false);
+ m_vdp->snd_irq().set(FUNC(md_base_state::vdp_sndirqline_callback_genesis_z80));
+ m_vdp->lv6_irq().set(FUNC(md_base_state::vdp_lv6irqline_callback_genesis_68k));
+ m_vdp->lv4_irq().set(FUNC(md_base_state::vdp_lv4irqline_callback_genesis_68k));
+ m_vdp->set_screen("megadriv");
+ m_vdp->add_route(ALL_OUTPUTS, "lspeaker", 0.25);
+ m_vdp->add_route(ALL_OUTPUTS, "rspeaker", 0.25);
+
+ screen_device &screen(SCREEN(config, "megadriv", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0)); // Vblank handled manually.
+ screen.set_size(64*8, 620);
+ screen.set_visarea(0, 32*8-1, 0, 28*8-1);
+ screen.set_screen_update(FUNC(md_base_state::screen_update_megadriv)); /* Copies a bitmap */
+ screen.screen_vblank().set(FUNC(md_base_state::screen_vblank_megadriv)); /* Used to Sync the timing */
MCFG_VIDEO_START_OVERRIDE(md_base_state, megadriv)
@@ -922,22 +924,22 @@ MACHINE_CONFIG_START(md_base_state::md_ntsc)
SPEAKER(config, "lspeaker").front_left();
SPEAKER(config, "rspeaker").front_right();
- MCFG_DEVICE_ADD("ymsnd", YM2612, MASTER_CLOCK_NTSC/7) /* 7.67 MHz */
- MCFG_SOUND_ROUTE(0, "lspeaker", 0.50)
- MCFG_SOUND_ROUTE(1, "rspeaker", 0.50)
-MACHINE_CONFIG_END
+ YM2612(config, m_ymsnd, MASTER_CLOCK_NTSC/7); /* 7.67 MHz */
+ m_ymsnd->add_route(0, "lspeaker", 0.50);
+ m_ymsnd->add_route(1, "rspeaker", 0.50);
+}
-MACHINE_CONFIG_START(md_cons_state::dcat16_megadriv_base)
+void md_cons_state::dcat16_megadriv_base(machine_config &config)
+{
md_ntsc(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(dcat16_megadriv_map)
- MCFG_DEVICE_IRQ_ACKNOWLEDGE_DRIVER(md_base_state,genesis_int_callback)
-MACHINE_CONFIG_END
+ m_maincpu->set_addrmap(AS_PROGRAM, &md_base_state::dcat16_megadriv_map);
+}
/************ PAL hardware has a different master clock *************/
-MACHINE_CONFIG_START(md_base_state::md_pal)
+void md_base_state::md_pal(machine_config &config)
+{
M68000(config, m_maincpu, MASTER_CLOCK_PAL / 7); /* 7.67 MHz */
m_maincpu->set_addrmap(AS_PROGRAM, &md_base_state::megadriv_map);
m_maincpu->set_irq_acknowledge_callback(FUNC(md_base_state::genesis_int_callback));
@@ -953,22 +955,22 @@ MACHINE_CONFIG_START(md_base_state::md_pal)
megadriv_timers(config);
- MCFG_DEVICE_ADD("gen_vdp", SEGA315_5313, MASTER_CLOCK_PAL, "maincpu")
- MCFG_SEGA315_5313_IS_PAL(true)
- MCFG_SEGA315_5313_SND_IRQ_CALLBACK(WRITELINE(*this, md_base_state, vdp_sndirqline_callback_genesis_z80));
- MCFG_SEGA315_5313_LV6_IRQ_CALLBACK(WRITELINE(*this, md_base_state, vdp_lv6irqline_callback_genesis_68k));
- MCFG_SEGA315_5313_LV4_IRQ_CALLBACK(WRITELINE(*this, md_base_state, vdp_lv4irqline_callback_genesis_68k));
- MCFG_VIDEO_SET_SCREEN("megadriv")
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 0.25)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker",0.25)
-
- MCFG_SCREEN_ADD("megadriv", RASTER)
- MCFG_SCREEN_REFRESH_RATE(50)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) // Vblank handled manually.
- MCFG_SCREEN_SIZE(64*8, 620)
- MCFG_SCREEN_VISIBLE_AREA(0, 32*8-1, 0, 28*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(md_base_state, screen_update_megadriv) /* Copies a bitmap */
- MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE(*this, md_base_state, screen_vblank_megadriv)) /* Used to Sync the timing */
+ SEGA315_5313(config, m_vdp, MASTER_CLOCK_PAL, m_maincpu);
+ m_vdp->set_is_pal(true);
+ m_vdp->snd_irq().set(FUNC(md_base_state::vdp_sndirqline_callback_genesis_z80));
+ m_vdp->lv6_irq().set(FUNC(md_base_state::vdp_lv6irqline_callback_genesis_68k));
+ m_vdp->lv4_irq().set(FUNC(md_base_state::vdp_lv4irqline_callback_genesis_68k));
+ m_vdp->set_screen("megadriv");
+ m_vdp->add_route(ALL_OUTPUTS, "lspeaker", 0.25);
+ m_vdp->add_route(ALL_OUTPUTS, "rspeaker", 0.25);
+
+ screen_device &screen(SCREEN(config, "megadriv", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(50);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0)); // Vblank handled manually.
+ screen.set_size(64*8, 620);
+ screen.set_visarea(0, 32*8-1, 0, 28*8-1);
+ screen.set_screen_update(FUNC(md_base_state::screen_update_megadriv)); /* Copies a bitmap */
+ screen.screen_vblank().set(FUNC(md_base_state::screen_vblank_megadriv)); /* Used to Sync the timing */
MCFG_VIDEO_START_OVERRIDE(md_base_state, megadriv)
@@ -976,10 +978,10 @@ MACHINE_CONFIG_START(md_base_state::md_pal)
SPEAKER(config, "lspeaker").front_left();
SPEAKER(config, "rspeaker").front_right();
- MCFG_DEVICE_ADD("ymsnd", YM2612, MASTER_CLOCK_PAL/7) /* 7.67 MHz */
- MCFG_SOUND_ROUTE(0, "lspeaker", 0.50)
- MCFG_SOUND_ROUTE(1, "rspeaker", 0.50)
-MACHINE_CONFIG_END
+ YM2612(config, m_ymsnd, MASTER_CLOCK_NTSC/7); /* 7.67 MHz */
+ m_ymsnd->add_route(0, "lspeaker", 0.50);
+ m_ymsnd->add_route(1, "rspeaker", 0.50);
+}
WRITE8_MEMBER(md_base_state::megadriv_tas_callback)
diff --git a/src/mame/machine/microtan.cpp b/src/mame/machine/microtan.cpp
index 203f497f401..8868e8ca959 100644
--- a/src/mame/machine/microtan.cpp
+++ b/src/mame/machine/microtan.cpp
@@ -770,15 +770,15 @@ void microtan_state::snapshot_copy(uint8_t *snapshot_buff, int snapshot_size)
/* first set of AY8910 registers */
for (int i = 0; i < 16; i++ )
{
- m_ay8910[0]->address_w(generic_space(), 0, i);
- m_ay8910[0]->data_w(generic_space(), 0, snapshot_buff[base++]);
+ m_ay8910[0]->address_w(i);
+ m_ay8910[0]->data_w(snapshot_buff[base++]);
}
/* second set of AY8910 registers */
for (int i = 0; i < 16; i++ )
{
- m_ay8910[0]->address_w(generic_space(), 0, i);
- m_ay8910[0]->data_w(generic_space(), 0, snapshot_buff[base++]);
+ m_ay8910[0]->address_w(i);
+ m_ay8910[0]->data_w(snapshot_buff[base++]);
}
for (int i = 0; i < 32*16; i++)
diff --git a/src/mame/machine/midtunit.cpp b/src/mame/machine/midtunit.cpp
index fe284aed25d..5572fa5e7d7 100644
--- a/src/mame/machine/midtunit.cpp
+++ b/src/mame/machine/midtunit.cpp
@@ -546,7 +546,7 @@ WRITE16_MEMBER(midtunit_state::midtunit_sound_w)
case SOUND_ADPCM:
case SOUND_ADPCM_LARGE:
m_adpcm_sound->reset_write(~data & 0x100);
- m_adpcm_sound->write(space, offset, data & 0xff);
+ m_adpcm_sound->write(data & 0xff);
/* the games seem to check for $82 loops, so this should be just barely enough */
m_fake_sound_state = 128;
diff --git a/src/mame/machine/midwayic.cpp b/src/mame/machine/midwayic.cpp
index 1744942fd77..02b727b7acb 100644
--- a/src/mame/machine/midwayic.cpp
+++ b/src/mame/machine/midwayic.cpp
@@ -28,6 +28,33 @@
/*************************************
*
+ * Serial number input kludge
+ *
+ *************************************/
+
+static INPUT_PORTS_START( pic_serial_adjust )
+ PORT_START("SERIAL_DIGIT")
+ PORT_DIPNAME( 0x0f, 0x06, "Serial Low Digit")
+ PORT_DIPSETTING( 0x00, "0")
+ PORT_DIPSETTING( 0x01, "1")
+ PORT_DIPSETTING( 0x02, "2")
+ PORT_DIPSETTING( 0x03, "3")
+ PORT_DIPSETTING( 0x04, "4")
+ PORT_DIPSETTING( 0x05, "5")
+ PORT_DIPSETTING( 0x06, "6")
+ PORT_DIPSETTING( 0x07, "7")
+ PORT_DIPSETTING( 0x08, "8")
+ PORT_DIPSETTING( 0x09, "9")
+ PORT_BIT( 0xf0, 0x00, IPT_UNUSED )
+INPUT_PORTS_END
+
+ioport_constructor midway_serial_pic_device::device_input_ports() const
+{
+ return INPUT_PORTS_NAME(pic_serial_adjust);
+}
+
+/*************************************
+ *
* Serial number encoding
*
*************************************/
@@ -38,8 +65,9 @@ void midway_serial_pic_device::generate_serial_data(int upper)
uint32_t serial_number, temp;
uint8_t serial_digit[9];
- serial_number = 123456;
+ serial_number = 123450;
serial_number += upper * 1000000;
+ serial_number += m_io_serial_digit->read() & 0x0f;
serial_digit[0] = (serial_number / 100000000) % 10;
serial_digit[1] = (serial_number / 10000000) % 10;
@@ -119,6 +147,7 @@ midway_serial_pic_device::midway_serial_pic_device(const machine_config &mconfig
midway_serial_pic_device::midway_serial_pic_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock) :
device_t(mconfig, type, tag, owner, clock),
+ m_io_serial_digit(*this, "SERIAL_DIGIT"),
m_upper(0),
m_buff(0),
m_idx(0),
@@ -136,9 +165,12 @@ midway_serial_pic_device::midway_serial_pic_device(const machine_config &mconfig
void midway_serial_pic_device::device_start()
{
serial_register_state();
- generate_serial_data(m_upper);
}
+void midway_serial_pic_device::device_reset()
+{
+ generate_serial_data(m_upper);
+}
WRITE_LINE_MEMBER(midway_serial_pic_device::reset_w)
{
@@ -151,13 +183,13 @@ WRITE_LINE_MEMBER(midway_serial_pic_device::reset_w)
}
-READ8_MEMBER(midway_serial_pic_device::status_r)
+u8 midway_serial_pic_device::status_r()
{
return m_status;
}
-READ8_MEMBER(midway_serial_pic_device::read)
+u8 midway_serial_pic_device::read()
{
logerror("%s:security R = %04X\n", machine().describe_context(), m_buff);
m_status = 1;
@@ -165,7 +197,7 @@ READ8_MEMBER(midway_serial_pic_device::read)
}
-WRITE8_MEMBER(midway_serial_pic_device::write)
+void midway_serial_pic_device::write(u8 data)
{
logerror("%s:security W = %04X\n", machine().describe_context(), data);
@@ -354,7 +386,7 @@ void midway_serial_pic2_device::set_default_nvram(const uint8_t *nvram)
}
-READ8_MEMBER(midway_serial_pic2_device::status_r)
+u8 midway_serial_pic2_device::status_r()
{
uint8_t result = 0;
@@ -373,7 +405,7 @@ READ8_MEMBER(midway_serial_pic2_device::status_r)
}
-READ8_MEMBER(midway_serial_pic2_device::read)
+u8 midway_serial_pic2_device::read()
{
uint8_t result = 0;
@@ -393,7 +425,7 @@ READ8_MEMBER(midway_serial_pic2_device::read)
}
-WRITE8_MEMBER(midway_serial_pic2_device::write)
+void midway_serial_pic2_device::write(u8 data)
{
static FILE *nvramlog;
if (LOG_NVRAM && !nvramlog)
@@ -1028,7 +1060,7 @@ READ32_MEMBER( midway_ioasic_device::read )
break;
case IOASIC_PICIN:
- result = midway_serial_pic2_device::read(space,0) | (midway_serial_pic2_device::status_r(space,0) << 8);
+ result = midway_serial_pic2_device::read() | (midway_serial_pic2_device::status_r() << 8);
break;
default:
@@ -1161,11 +1193,11 @@ WRITE32_MEMBER( midway_ioasic_device::write )
case IOASIC_PICOUT:
if (m_shuffle_type == MIDWAY_IOASIC_VAPORTRX)
- midway_serial_pic2_device::write(space, 0, newreg ^ 0x0a);
+ midway_serial_pic2_device::write(newreg ^ 0x0a);
else if (m_shuffle_type == MIDWAY_IOASIC_SFRUSHRK)
- midway_serial_pic2_device::write(space, 0, newreg ^ 0x05);
+ midway_serial_pic2_device::write(newreg ^ 0x05);
else
- midway_serial_pic2_device::write(space, 0, newreg);
+ midway_serial_pic2_device::write(newreg);
break;
case IOASIC_PICIN:
diff --git a/src/mame/machine/midwayic.h b/src/mame/machine/midwayic.h
index e5a422782b5..4e0a18a36d8 100644
--- a/src/mame/machine/midwayic.h
+++ b/src/mame/machine/midwayic.h
@@ -25,9 +25,9 @@ public:
void set_upper(int upper) { m_upper = upper; }
- DECLARE_READ8_MEMBER( read );
- DECLARE_WRITE8_MEMBER( write );
- DECLARE_READ8_MEMBER( status_r );
+ u8 read();
+ void write(u8 data);
+ u8 status_r();
DECLARE_WRITE_LINE_MEMBER( reset_w );
protected:
@@ -35,12 +35,17 @@ protected:
// device-level overrides
virtual void device_start() override;
+ virtual void device_reset() override;
+ virtual ioport_constructor device_input_ports() const override;
void generate_serial_data(int upper);
void serial_register_state();
+ required_ioport m_io_serial_digit;
+
uint8_t m_data[16]; // reused by other devices
int m_upper;
+
private:
uint8_t m_buff;
uint8_t m_idx;
@@ -95,9 +100,9 @@ public:
void set_yearoffs(int yearoffs) { m_yearoffs = yearoffs; }
- DECLARE_READ8_MEMBER( read );
- DECLARE_WRITE8_MEMBER( write );
- DECLARE_READ8_MEMBER( status_r );
+ u8 read();
+ void write(u8 data);
+ u8 status_r();
void set_default_nvram(const uint8_t *nvram);
diff --git a/src/mame/machine/midwunit.cpp b/src/mame/machine/midwunit.cpp
index f37dbe5deee..cacd27d68a9 100644
--- a/src/mame/machine/midwunit.cpp
+++ b/src/mame/machine/midwunit.cpp
@@ -118,7 +118,7 @@ READ16_MEMBER(midwunit_state::midwunit_io_r)
case 4:
{
int picret = 0;
- if (m_midway_serial_pic) picret = m_midway_serial_pic->status_r(space, 0);
+ if (m_midway_serial_pic) picret = m_midway_serial_pic->status_r();
return (picret << 12) | midwunit_sound_state_r(space, 0, 0xffff);
}
@@ -335,7 +335,7 @@ void midwunit_state::machine_reset()
READ16_MEMBER(midwunit_state::midwunit_security_r)
{
uint16_t picret = 0;
- if (m_midway_serial_pic) picret = m_midway_serial_pic->read(space, 0);
+ if (m_midway_serial_pic) picret = m_midway_serial_pic->read();
return picret;
}
@@ -344,7 +344,7 @@ WRITE16_MEMBER(midwunit_state::midwunit_security_w)
{
if (offset == 0 && ACCESSING_BITS_0_7)
{
- if (m_midway_serial_pic) m_midway_serial_pic->write(space, 0, data);
+ if (m_midway_serial_pic) m_midway_serial_pic->write(data);
}
}
diff --git a/src/mame/machine/midxunit.cpp b/src/mame/machine/midxunit.cpp
index a597eff9c4e..9ac0370eafa 100644
--- a/src/mame/machine/midxunit.cpp
+++ b/src/mame/machine/midxunit.cpp
@@ -107,7 +107,7 @@ WRITE_LINE_MEMBER(midxunit_state::adc_int_w)
READ16_MEMBER(midxunit_state::midxunit_status_r)
{
/* low bit indicates whether the ADC is done reading the current input */
- return (m_midway_serial_pic->status_r(space,0) << 1) | (m_adc_int ? 1 : 0);
+ return (m_midway_serial_pic->status_r() << 1) | (m_adc_int ? 1 : 0);
}
@@ -280,7 +280,7 @@ void midxunit_state::machine_reset()
READ16_MEMBER(midxunit_state::midxunit_security_r)
{
- return m_midway_serial_pic->read(space,0);
+ return m_midway_serial_pic->read();
}
WRITE16_MEMBER(midxunit_state::midxunit_security_w)
@@ -293,7 +293,7 @@ WRITE16_MEMBER(midxunit_state::midxunit_security_w)
WRITE16_MEMBER(midxunit_state::midxunit_security_clock_w)
{
if (offset == 0 && ACCESSING_BITS_0_7)
- m_midway_serial_pic->write(space, 0, ((~data & 2) << 3) | m_security_bits);
+ m_midway_serial_pic->write(((~data & 2) << 3) | m_security_bits);
}
diff --git a/src/mame/machine/midyunit.cpp b/src/mame/machine/midyunit.cpp
index efcbffcf8b7..a959e493516 100644
--- a/src/mame/machine/midyunit.cpp
+++ b/src/mame/machine/midyunit.cpp
@@ -130,7 +130,7 @@ READ16_MEMBER(midyunit_state::term2_input_r)
if (offset != 2)
return m_ports[offset]->read();
- return m_term2_adc->read(space, 0) | 0xff00;
+ return m_term2_adc->read() | 0xff00;
}
WRITE16_MEMBER(midyunit_state::term2_sound_w)
@@ -160,10 +160,10 @@ WRITE16_MEMBER(midyunit_state::term2_sound_w)
}
if (offset == 0)
- m_term2_adc->write(space, 0, ((data >> 12) & 3) | 4);
+ m_term2_adc->write(((data >> 12) & 3) | 4);
m_adpcm_sound->reset_write((~data & 0x100) >> 1);
- m_adpcm_sound->write(space, offset, data);
+ m_adpcm_sound->write(data);
}
@@ -577,18 +577,18 @@ WRITE16_MEMBER(midyunit_state::midyunit_sound_w)
switch (m_chip_type)
{
case SOUND_NARC:
- m_narc_sound->write(space, offset, data);
+ m_narc_sound->write(data);
break;
case SOUND_CVSD_SMALL:
case SOUND_CVSD:
m_cvsd_sound->reset_write((~data & 0x100) >> 8);
- m_cvsd_sound->write(space, offset, (data & 0xff) | ((data & 0x200) >> 1));
+ m_cvsd_sound->write((data & 0xff) | ((data & 0x200) >> 1));
break;
case SOUND_ADPCM:
m_adpcm_sound->reset_write((~data & 0x100) >> 8);
- m_adpcm_sound->write(space, offset, data);
+ m_adpcm_sound->write(data);
break;
case SOUND_YAWDIM:
diff --git a/src/mame/machine/mips_rambo.cpp b/src/mame/machine/mips_rambo.cpp
index 2d6bd16e17c..53023cce5a7 100644
--- a/src/mame/machine/mips_rambo.cpp
+++ b/src/mame/machine/mips_rambo.cpp
@@ -9,8 +9,9 @@
* https://github.com/NetBSD/src/blob/trunk/sys/arch/mipsco/obio/rambo.h
*
* TODO
- * - interrupts
* - buzzer
+ * - dma reload
+ * - save state
*/
#include "emu.h"
@@ -18,6 +19,7 @@
#define LOG_GENERAL (1U << 0)
#define LOG_REG (1U << 1)
+#define LOG_DMA (1U << 2)
//#define VERBOSE (LOG_GENERAL|LOG_REG)
#include "logmacro.h"
@@ -32,10 +34,8 @@ mips_rambo_device::mips_rambo_device(const machine_config &mconfig, const char *
, m_timer_out_cb(*this)
, m_buzzer_out_cb(*this)
, m_channel{{ 0,0,0,0,0,0, false, *this, *this }, { 0,0,0,0,0,0, false, *this, *this }}
- , m_irq_out_state(0)
, m_buzzer_out_state(0)
{
- (void)m_irq_out_state;
}
void mips_rambo_device::map(address_map &map)
@@ -74,23 +74,59 @@ void mips_rambo_device::device_start()
}
m_timer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(mips_rambo_device::timer), this));
- m_buzzer_timer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(mips_rambo_device::buzzer_toggle), this));
-
+ m_dma = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(mips_rambo_device::dma), this));
+ m_buzzer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(mips_rambo_device::buzzer), this));
}
void mips_rambo_device::device_reset()
{
- // TODO: update interrupts
-
m_tcount = machine().time();
+
+ for (dma_t &channel : m_channel)
+ {
+ if (channel.mode & MODE_DMA_INTR)
+ m_irq_out_cb(0);
+
+ channel.load_address = 0;
+ channel.diag = 0;
+ channel.mode = 0;
+ channel.block_count = 0;
+ channel.reload_count = 0;
+ channel.current_address = 0;
+ }
+
+ m_buzzer->enable(false);
+ if (m_buzzer_out_state)
+ {
+ m_buzzer_out_state = 0;
+ m_buzzer_out_cb(m_buzzer_out_state);
+ }
+}
+
+template <unsigned Channel> u16 mips_rambo_device::fifo_r()
+{
+ if (m_fifo[Channel].empty())
+ m_dma->adjust(attotime::zero, Channel);
+
+ return m_fifo[Channel].dequeue();
+}
+
+template <unsigned Channel> READ32_MEMBER(mips_rambo_device::mode_r)
+{
+ u32 data = m_channel[Channel].mode | m_fifo[Channel].queue_length();
+
+ if (m_fifo[Channel].full())
+ data |= MODE_FIFO_FULL;
+ else if (m_fifo[Channel].empty())
+ data |= MODE_FIFO_EMPTY;
+
+ return data;
}
READ32_MEMBER(mips_rambo_device::tcount_r)
{
u32 const data = attotime_to_clocks(machine().time() - m_tcount);
- LOGMASKED(LOG_REG, "tcount_r 0x%08x (%s)\n", data, machine().describe_context());
-
return data;
}
@@ -115,7 +151,7 @@ WRITE32_MEMBER(mips_rambo_device::control_w)
LOGMASKED(LOG_REG, "control_w 0x%08x (%s)\n", data, machine().describe_context());
// stop the buzzer
- m_buzzer_timer->enable(false);
+ m_buzzer->enable(false);
m_buzzer_out_state = 0;
m_buzzer_out_cb(m_buzzer_out_state);
@@ -124,7 +160,7 @@ WRITE32_MEMBER(mips_rambo_device::control_w)
{
attotime const period = attotime::from_ticks(1 << ((data & CONTROL_BUZZMASK) >> 4), 1524_Hz_XTAL);
- m_buzzer_timer->adjust(period, 0, period);
+ m_buzzer->adjust(period, 0, period);
}
}
@@ -135,28 +171,55 @@ template <unsigned Channel> WRITE32_MEMBER(mips_rambo_device::load_address_w)
COMBINE_DATA(&m_channel[Channel].load_address);
}
-template <unsigned Channel> WRITE16_MEMBER(mips_rambo_device::fifo_w)
+template <unsigned Channel> void mips_rambo_device::fifo_w(u16 data)
{
LOGMASKED(LOG_REG, "fifo_w<%d> 0x%04x (%s)\n", Channel, data, machine().describe_context());
+
+ m_fifo[Channel].enqueue(data);
+
+ if (m_fifo[Channel].full())
+ m_dma->adjust(attotime::zero, Channel);
}
template <unsigned Channel> WRITE32_MEMBER(mips_rambo_device::mode_w)
{
LOGMASKED(LOG_REG, "mode_w<%d> 0x%08x (%s)\n", Channel, data, machine().describe_context());
+ dma_t &channel = m_channel[Channel];
+
if (data & MODE_CHANNEL_EN)
- m_channel[Channel].current_address = m_channel[Channel].load_address;
+ channel.current_address = channel.load_address;
+
+ if (data & MODE_FLUSH_FIFO)
+ m_fifo[Channel].clear();
mem_mask &= MODE_WRITE_MASK;
- COMBINE_DATA(&m_channel[Channel].mode);
+ COMBINE_DATA(&channel.mode);
+
+ // schedule dma transfer
+ if (channel.drq_asserted && (channel.block_count || !m_fifo[Channel].empty()))
+ m_dma->adjust(attotime::zero, Channel);
}
template <unsigned Channel> WRITE16_MEMBER(mips_rambo_device::block_count_w)
{
LOGMASKED(LOG_REG, "block_count_w<%d> 0x%04x (%s)\n", Channel, data, machine().describe_context());
- COMBINE_DATA(&m_channel[Channel].block_count);
- COMBINE_DATA(&m_channel[Channel].reload_count);
+ dma_t &channel = m_channel[Channel];
+
+ COMBINE_DATA(&channel.block_count);
+ COMBINE_DATA(&channel.reload_count);
+
+ // FIXME: do this here?
+ if (channel.mode & MODE_DMA_INTR)
+ {
+ channel.mode &= ~MODE_DMA_INTR;
+ m_irq_out_cb(0);
+ }
+
+ // schedule dma transfer
+ if (channel.drq_asserted && (channel.block_count || !m_fifo[Channel].empty()))
+ m_dma->adjust(attotime::zero, Channel);
}
TIMER_CALLBACK_MEMBER(mips_rambo_device::timer)
@@ -166,7 +229,89 @@ TIMER_CALLBACK_MEMBER(mips_rambo_device::timer)
m_timer_out_cb(CLEAR_LINE);
}
-TIMER_CALLBACK_MEMBER(mips_rambo_device::buzzer_toggle)
+TIMER_CALLBACK_MEMBER(mips_rambo_device::dma)
+{
+ dma_t &channel = m_channel[param];
+
+ // check channel enabled
+ if (!(channel.mode & MODE_CHANNEL_EN))
+ return;
+
+ if (channel.mode & MODE_TO_MEMORY)
+ {
+ // fill fifo from device
+ while (channel.drq_asserted && !m_fifo[param].full())
+ {
+ u16 const data = channel.read_cb();
+
+ m_fifo[param].enqueue(data);
+ }
+
+ // empty fifo to memory
+ if (m_fifo[param].full() && channel.block_count)
+ {
+ LOGMASKED(LOG_DMA, "dma transfer to memory 0x%08x\n", channel.current_address);
+ while (!m_fifo[param].empty())
+ {
+ u16 const data = m_fifo[param].dequeue();
+
+ m_ram->write(BYTE4_XOR_BE(channel.current_address++), data >> 8);
+ m_ram->write(BYTE4_XOR_BE(channel.current_address++), data);
+ }
+
+ channel.block_count--;
+ }
+ }
+ else
+ {
+ if (m_fifo[param].empty() && channel.block_count)
+ {
+ LOGMASKED(LOG_DMA, "dma transfer from memory 0x%08x\n", channel.current_address);
+
+ // fill fifo from memory
+ while (!m_fifo[param].full())
+ {
+ u8 const hi = m_ram->read(BYTE4_XOR_BE(channel.current_address++));
+ u8 const lo = m_ram->read(BYTE4_XOR_BE(channel.current_address++));
+
+ m_fifo[param].enqueue((hi << 8) | lo);
+ }
+
+ channel.block_count--;
+ }
+
+ // empty fifo to device
+ while (channel.drq_asserted && !m_fifo[param].empty())
+ {
+ u16 const data = m_fifo[param].dequeue();
+
+ channel.write_cb(data);
+ }
+ }
+
+ if (m_fifo[param].empty())
+ {
+ if (channel.block_count == 0)
+ {
+ LOGMASKED(LOG_DMA, "dma transfer complete\n");
+
+ // trigger interrupt
+ if ((channel.mode & MODE_INTR_EN) && !(channel.mode & MODE_DMA_INTR))
+ {
+ channel.mode |= MODE_DMA_INTR;
+ m_irq_out_cb(1);
+ }
+
+ // TODO: reload
+ if (channel.mode & MODE_AUTO_RELOAD)
+ logerror("auto reload not supported\n");
+ }
+ else if (channel.drq_asserted)
+ m_dma->adjust(attotime::zero, param);
+ }
+}
+
+TIMER_CALLBACK_MEMBER(mips_rambo_device::buzzer)
{
m_buzzer_out_state = !m_buzzer_out_state;
m_buzzer_out_cb(m_buzzer_out_state);
@@ -174,22 +319,24 @@ TIMER_CALLBACK_MEMBER(mips_rambo_device::buzzer_toggle)
u32 mips_rambo_device::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect)
{
+ dma_t &channel = m_channel[1];
+
// check if dma channel is configured
u32 const blocks_required = (screen.visible_area().height() * screen.visible_area().width()) >> 9;
- if (!(m_channel[1].mode & MODE_CHANNEL_EN) || (m_channel[1].reload_count != blocks_required))
+ if (!(channel.mode & MODE_CHANNEL_EN) || (channel.reload_count != blocks_required))
return 1;
// screen is blanked unless auto reload is enabled
- if (!(m_channel[1].mode & MODE_AUTO_RELOAD))
+ if (!(channel.mode & MODE_AUTO_RELOAD))
{
- m_channel[1].block_count = 0;
+ channel.block_count = 0;
return 0;
}
else
- m_channel[1].block_count = m_channel[1].reload_count;
+ channel.block_count = channel.reload_count;
- u32 address = m_channel[1].load_address;
+ u32 address = channel.load_address;
for (int y = screen.visible_area().min_y; y <= screen.visible_area().max_y; y++)
for (int x = screen.visible_area().min_x; x <= screen.visible_area().max_x; x += 8)
{
@@ -215,29 +362,11 @@ template WRITE_LINE_MEMBER(mips_rambo_device::drq_w<1>);
template <unsigned Channel> WRITE_LINE_MEMBER(mips_rambo_device::drq_w)
{
- m_channel[Channel].drq_asserted = bool(state == ASSERT_LINE);
+ dma_t &channel = m_channel[Channel];
- while (m_channel[Channel].drq_asserted)
- {
- // check channel enabled
- if (!(m_channel[Channel].mode & MODE_CHANNEL_EN))
- break;
+ channel.drq_asserted = bool(state == ASSERT_LINE);
- // TODO: check data remaining
-
- // FIXME: 16 bit dma
- if (m_channel[Channel].mode & MODE_TO_MEMORY)
- {
- u8 const data = m_channel[Channel].read_cb();
-
- m_ram->write(BYTE4_XOR_BE(m_channel[Channel].current_address), data);
- }
- else
- {
- u8 const data = m_ram->read(BYTE4_XOR_BE(m_channel[Channel].current_address));
- m_channel[Channel].write_cb(data);
- }
-
- m_channel[Channel].current_address++;
- }
+ // schedule dma transfer
+ if (channel.drq_asserted && (channel.block_count || !m_fifo[Channel].empty()))
+ m_dma->adjust(attotime::zero, Channel);
}
diff --git a/src/mame/machine/mips_rambo.h b/src/mame/machine/mips_rambo.h
index f3703cbabc3..fb57b6fff0a 100644
--- a/src/mame/machine/mips_rambo.h
+++ b/src/mame/machine/mips_rambo.h
@@ -25,7 +25,6 @@ public:
template <unsigned Channel> auto dma_w() { return m_channel[Channel].write_cb.bind(); }
// input lines
- template <unsigned Interrupt> DECLARE_WRITE_LINE_MEMBER(irq_w) {}
template <unsigned Channel> DECLARE_WRITE_LINE_MEMBER(drq_w);
void map(address_map &map);
@@ -38,12 +37,12 @@ protected:
template <unsigned Channel> DECLARE_READ32_MEMBER(load_address_r) { return m_channel[Channel].load_address; }
template <unsigned Channel> DECLARE_READ32_MEMBER(diag_r) { return 0; }
- template <unsigned Channel> DECLARE_READ16_MEMBER(fifo_r) { return 0; }
- template <unsigned Channel> DECLARE_READ32_MEMBER(mode_r) { return m_channel[Channel].mode; }
+ template <unsigned Channel> u16 fifo_r();
+ template <unsigned Channel> DECLARE_READ32_MEMBER(mode_r);
template <unsigned Channel> DECLARE_READ16_MEMBER(block_count_r)
{
if ((Channel == 0) || !(m_channel[Channel].mode & MODE_CHANNEL_EN))
- return m_channel[0].block_count;
+ return m_channel[Channel].block_count;
/*
* HACK: The RISC/os boot sequence tests the dma channel 1 block count
@@ -65,7 +64,7 @@ protected:
DECLARE_READ32_MEMBER(control_r) { return 0; }
template <unsigned Channel> DECLARE_WRITE32_MEMBER(load_address_w);
- template <unsigned Channel> DECLARE_WRITE16_MEMBER(fifo_w);
+ template <unsigned Channel> void fifo_w(u16 data);
template <unsigned Channel> DECLARE_WRITE32_MEMBER(mode_w);
template <unsigned Channel> DECLARE_WRITE16_MEMBER(block_count_w);
@@ -74,7 +73,8 @@ protected:
DECLARE_WRITE32_MEMBER(control_w);
TIMER_CALLBACK_MEMBER(timer);
- TIMER_CALLBACK_MEMBER(buzzer_toggle);
+ TIMER_CALLBACK_MEMBER(dma);
+ TIMER_CALLBACK_MEMBER(buzzer);
private:
enum mode_mask : u32
@@ -92,7 +92,7 @@ private:
MODE_FIFO_EMPTY = 0x00000400, // fifo empty state
MODE_DMA_ERROR = 0x00000200, // parity error during transfer
MODE_DMA_INTR = 0x00000100, // channel interrupt pending
- MODE_COUNT_MASK = 0x000000ff, // halfword count bits
+ MODE_COUNT_MASK = 0x000000ff, // fifo queue length
MODE_WRITE_MASK = 0xff000000,
};
@@ -124,16 +124,18 @@ private:
bool drq_asserted;
- // FIXME: 16 bit dma
- devcb_read8 read_cb;
- devcb_write8 write_cb;
+ devcb_read16 read_cb;
+ devcb_write16 write_cb;
}
m_channel[2];
+ // FIXME: move this into dma_t
+ util::fifo<u16, 32> m_fifo[2];
+
emu_timer *m_timer;
- emu_timer *m_buzzer_timer;
+ emu_timer *m_dma;
+ emu_timer *m_buzzer;
- int m_irq_out_state;
int m_buzzer_out_state;
attotime m_tcount;
diff --git a/src/mame/machine/mmboard.cpp b/src/mame/machine/mmboard.cpp
index 30483da163e..2e00ab158f9 100644
--- a/src/mame/machine/mmboard.cpp
+++ b/src/mame/machine/mmboard.cpp
@@ -320,24 +320,24 @@ mephisto_display_modul_device::mephisto_display_modul_device(const machine_confi
// device_add_mconfig
//-------------------------------------------------
-MACHINE_CONFIG_START(mephisto_display_modul_device::device_add_mconfig)
+void mephisto_display_modul_device::device_add_mconfig(machine_config &config)
+{
/* video hardware */
- MCFG_SCREEN_ADD("screen", LCD)
- MCFG_SCREEN_REFRESH_RATE(50)
- MCFG_SCREEN_SIZE(16*6, 9*2)
- MCFG_SCREEN_VISIBLE_AREA(0, 16*6-1, 0, 9*2-3)
- MCFG_SCREEN_UPDATE_DEVICE("hd44780", hd44780_device, screen_update)
- MCFG_SCREEN_PALETTE("palette")
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_LCD));
+ screen.set_refresh_hz(50);
+ screen.set_size(16*6, 9*2);
+ screen.set_visarea(0, 16*6-1, 0, 9*2-3);
+ screen.set_screen_update("hd44780", FUNC(hd44780_device::screen_update));
+ screen.set_palette("palette");
PALETTE(config, "palette", FUNC(mephisto_display_modul_device::lcd_palette), 2);
- MCFG_HD44780_ADD("hd44780")
- MCFG_HD44780_LCD_SIZE(2, 16)
+ HD44780(config, m_lcdc, 0);
+ m_lcdc->set_lcd_size(2, 16);
/* sound hardware */
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("beeper", BEEP, 3250)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
-MACHINE_CONFIG_END
+ BEEP(config, m_beeper, 3250).add_route(ALL_OUTPUTS, "mono", 1.0);
+}
void mephisto_display_modul_device::lcd_palette(palette_device &palette) const
diff --git a/src/mame/machine/mpu4.cpp b/src/mame/machine/mpu4.cpp
index 125a28367d4..c7ba1927c32 100644
--- a/src/mame/machine/mpu4.cpp
+++ b/src/mame/machine/mpu4.cpp
@@ -1114,14 +1114,14 @@ void mpu4_state::update_ay(device_t *device)
case 0x02:
/* CA2 = 0 CB2 = 1? : Write to selected PSG register and write data to Port A */
- m_ay8913->data_w(generic_space(), 0, m_pia6->a_output());
+ m_ay8913->data_w(m_pia6->a_output());
LOG(("AY Chip Write \n"));
break;
case 0x03:
/* CA2 = 1 CB2 = 1? : The register will now be selected and the user can read from or write to it.
The register will remain selected until another is chosen.*/
- m_ay8913->address_w(generic_space(), 0, m_pia6->a_output());
+ m_ay8913->address_w(m_pia6->a_output());
LOG(("AY Chip Select \n"));
break;
@@ -1333,7 +1333,7 @@ WRITE_LINE_MEMBER(mpu4_state::pia_ic8_cb2_w)
WRITE8_MEMBER(mpu4_state::pia_gb_porta_w)
{
LOG_SS(("%s: GAMEBOARD: PIA Port A Set to %2x\n", machine().describe_context(),data));
- m_msm6376->write(space, 0, data);
+ m_msm6376->write(data);
}
WRITE8_MEMBER(mpu4_state::pia_gb_portb_w)
@@ -1422,7 +1422,7 @@ calculate the oscillation frequency in advance. We're running the timer for inte
purposes, but the frequency calculation is done by plucking the values out as they are written.*/
WRITE8_MEMBER(mpu4_state::ic3ss_w)
{
- m_ptm_ic3ss->write(space, offset,data);
+ m_ptm_ic3ss->write(offset,data);
if (offset == 3)
{
@@ -2115,12 +2115,12 @@ READ8_MEMBER(mpu4_state::bwb_characteriser_r)
WRITE8_MEMBER(mpu4_state::mpu4_ym2413_w)
{
- if (m_ym2413) m_ym2413->write(space,offset,data);
+ if (m_ym2413) m_ym2413->write(offset,data);
}
READ8_MEMBER(mpu4_state::mpu4_ym2413_r)
{
-// if (m_ym2413) return m_ym2413->read(space,offset);
+// if (m_ym2413) return m_ym2413->read(offset);
return 0xff;
}
@@ -2135,8 +2135,8 @@ void mpu4_state::mpu4_install_mod4oki_space(address_space &space)
{
pia6821_device *pia_ic4ss = subdevice<pia6821_device>("pia_ic4ss");
- space.install_readwrite_handler(0x0880, 0x0883, read8_delegate(FUNC(pia6821_device::read), pia_ic4ss), write8_delegate(FUNC(pia6821_device::write), pia_ic4ss));
- space.install_read_handler(0x08c0, 0x08c7, read8_delegate(FUNC(ptm6840_device::read), (ptm6840_device*)m_ptm_ic3ss));
+ space.install_readwrite_handler(0x0880, 0x0883, read8sm_delegate(FUNC(pia6821_device::read), pia_ic4ss), write8sm_delegate(FUNC(pia6821_device::write), pia_ic4ss));
+ space.install_read_handler(0x08c0, 0x08c7, read8sm_delegate(FUNC(ptm6840_device::read), (ptm6840_device*)m_ptm_ic3ss));
space.install_write_handler(0x08c0, 0x08c7, write8_delegate(FUNC(mpu4_state::ic3ss_w),this));
}
@@ -2981,8 +2981,9 @@ void mpu4_state::mpu4_bwb_7reel(machine_config &config)
m_reel[7]->optic_handler().set(FUNC(mpu4_state::reel_optic_cb<7>));
}
-MACHINE_CONFIG_START(mpu4_state::mpu4_common)
- MCFG_TIMER_DRIVER_ADD_PERIODIC("50hz", mpu4_state, gen_50hz, attotime::from_hz(100))
+void mpu4_state::mpu4_common(machine_config &config)
+{
+ TIMER(config, "50hz").configure_periodic(FUNC(mpu4_state::gen_50hz), attotime::from_hz(100));
MSC1937(config, m_vfd);
/* 6840 PTM */
@@ -3045,12 +3046,11 @@ MACHINE_CONFIG_START(mpu4_state::mpu4_common)
m_pia8->irqa_handler().set(FUNC(mpu4_state::cpu0_irq));
m_pia8->irqb_handler().set(FUNC(mpu4_state::cpu0_irq));
- MCFG_DEVICE_ADD("meters", METERS, 0)
- MCFG_METERS_NUMBER(8)
-
-MACHINE_CONFIG_END
+ METERS(config, m_meters, 0).set_number(8);
+}
-MACHINE_CONFIG_START(mpu4_state::mpu4_common2)
+void mpu4_state::mpu4_common2(machine_config &config)
+{
PTM6840(config, m_ptm_ic3ss, MPU4_MASTER_CLOCK / 4);
m_ptm_ic3ss->set_external_clocks(0, 0, 0);
m_ptm_ic3ss->o1_callback().set("ptm_ic3ss", FUNC(ptm6840_device::set_c2));
@@ -3064,15 +3064,15 @@ MACHINE_CONFIG_START(mpu4_state::mpu4_common2)
pia_ic4ss.writepb_handler().set(FUNC(mpu4_state::pia_gb_portb_w));
pia_ic4ss.ca2_handler().set(FUNC(mpu4_state::pia_gb_ca2_w));
pia_ic4ss.cb2_handler().set(FUNC(mpu4_state::pia_gb_cb2_w));
-MACHINE_CONFIG_END
+}
/* machine driver for MOD 2 board */
-MACHINE_CONFIG_START(mpu4_state::mpu4base)
-
+void mpu4_state::mpu4base(machine_config &config)
+{
MCFG_MACHINE_START_OVERRIDE(mpu4_state,mod2 )
MCFG_MACHINE_RESET_OVERRIDE(mpu4_state,mpu4)
- MCFG_DEVICE_ADD("maincpu", MC6809, MPU4_MASTER_CLOCK) // MC68B09P
- MCFG_DEVICE_PROGRAM_MAP(mpu4_memmap)
+ MC6809(config, m_maincpu, MPU4_MASTER_CLOCK); // MC68B09P
+ m_maincpu->set_addrmap(AS_PROGRAM, &mpu4_state::mpu4_memmap);
mpu4_common(config);
@@ -3082,7 +3082,7 @@ MACHINE_CONFIG_START(mpu4_state::mpu4base)
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
config.set_default_layout(layout_mpu4);
-MACHINE_CONFIG_END
+}
void mpu4_state::mod2(machine_config &config)
@@ -3109,71 +3109,77 @@ void mpu4_state::mod2_alt(machine_config &config)
-MACHINE_CONFIG_START(mpu4_state::mod4yam)
+void mpu4_state::mod4yam(machine_config &config)
+{
mpu4base(config);
MCFG_MACHINE_START_OVERRIDE(mpu4_state,mpu4yam)
mpu4_std_6reel(config);
- MCFG_DEVICE_ADD("ym2413", YM2413, MPU4_MASTER_CLOCK/4)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 1.0)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 1.0)
-MACHINE_CONFIG_END
+ YM2413(config, m_ym2413, MPU4_MASTER_CLOCK/4);
+ m_ym2413->add_route(ALL_OUTPUTS, "lspeaker", 1.0);
+ m_ym2413->add_route(ALL_OUTPUTS, "rspeaker", 1.0);
+}
-MACHINE_CONFIG_START(mpu4_state::mod4oki)
+void mpu4_state::mod4oki(machine_config &config)
+{
mpu4base(config);
MCFG_MACHINE_START_OVERRIDE(mpu4_state,mpu4oki)
mpu4_common2(config);
mpu4_std_6reel(config);
- MCFG_DEVICE_ADD("msm6376", OKIM6376, 128000) //16KHz sample Can also be 85430 at 10.5KHz and 64000 at 8KHz
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 1.0)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 1.0)
-MACHINE_CONFIG_END
+ OKIM6376(config, m_msm6376, 128000); //16KHz sample Can also be 85430 at 10.5KHz and 64000 at 8KHz
+ m_msm6376->add_route(ALL_OUTPUTS, "lspeaker", 1.0);
+ m_msm6376->add_route(ALL_OUTPUTS, "rspeaker", 1.0);
+}
-MACHINE_CONFIG_START(mpu4_state::mod4oki_alt)
+void mpu4_state::mod4oki_alt(machine_config &config)
+{
mpu4base(config);
MCFG_MACHINE_START_OVERRIDE(mpu4_state,mpu4oki)
mpu4_common2(config);
mpu4_type2_6reel(config);
- MCFG_DEVICE_ADD("msm6376", OKIM6376, 128000) //16KHz sample Can also be 85430 at 10.5KHz and 64000 at 8KHz
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 1.0)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 1.0)
-MACHINE_CONFIG_END
+ OKIM6376(config, m_msm6376, 128000); //16KHz sample Can also be 85430 at 10.5KHz and 64000 at 8KHz
+ m_msm6376->add_route(ALL_OUTPUTS, "lspeaker", 1.0);
+ m_msm6376->add_route(ALL_OUTPUTS, "rspeaker", 1.0);
+}
-MACHINE_CONFIG_START(mpu4_state::mod4oki_5r)
+void mpu4_state::mod4oki_5r(machine_config &config)
+{
mpu4base(config);
MCFG_MACHINE_START_OVERRIDE(mpu4_state,mpu4oki)
mpu4_common2(config);
mpu4_std_5reel(config);
- MCFG_DEVICE_ADD("msm6376", OKIM6376, 128000) //16KHz sample Can also be 85430 at 10.5KHz and 64000 at 8KHz
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 1.0)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 1.0)
-MACHINE_CONFIG_END
+ OKIM6376(config, m_msm6376, 128000); //16KHz sample Can also be 85430 at 10.5KHz and 64000 at 8KHz
+ m_msm6376->add_route(ALL_OUTPUTS, "lspeaker", 1.0);
+ m_msm6376->add_route(ALL_OUTPUTS, "rspeaker", 1.0);
+}
-MACHINE_CONFIG_START(mpu4_state::bwboki)
+void mpu4_state::bwboki(machine_config &config)
+{
mpu4base(config);
MCFG_MACHINE_START_OVERRIDE(mpu4_state,mpu4bwb)
mpu4_common2(config);
mpu4_bwb_5reel(config);
- MCFG_DEVICE_ADD("msm6376", OKIM6376, 128000) //16KHz sample Can also be 85430 at 10.5KHz and 64000 at 8KHz
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 1.0)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 1.0)
-MACHINE_CONFIG_END
+ OKIM6376(config, m_msm6376, 128000); //16KHz sample Can also be 85430 at 10.5KHz and 64000 at 8KHz
+ m_msm6376->add_route(ALL_OUTPUTS, "lspeaker", 1.0);
+ m_msm6376->add_route(ALL_OUTPUTS, "rspeaker", 1.0);
+}
-MACHINE_CONFIG_START(mpu4_state::mpu4crys)
+void mpu4_state::mpu4crys(machine_config &config)
+{
mod2(config);
MCFG_MACHINE_START_OVERRIDE(mpu4_state,mpu4cry)
- MCFG_DEVICE_ADD("upd", UPD7759)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 1.0)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 1.0)
-MACHINE_CONFIG_END
+ upd7759_device &upd(UPD7759(config, "upd"));
+ upd.add_route(ALL_OUTPUTS, "lspeaker", 1.0);
+ upd.add_route(ALL_OUTPUTS, "rspeaker", 1.0);
+}
#define GAME_FLAGS (MACHINE_NOT_WORKING|MACHINE_REQUIRES_ARTWORK|MACHINE_MECHANICAL)
diff --git a/src/mame/machine/ms7004.cpp b/src/mame/machine/ms7004.cpp
index 13c4f215507..270fecc8753 100644
--- a/src/mame/machine/ms7004.cpp
+++ b/src/mame/machine/ms7004.cpp
@@ -13,16 +13,15 @@
#include "speaker.h"
-#define VERBOSE_DBG 1 /* general debug messages */
+//#define LOG_GENERAL (1U << 0) //defined in logmacro.h already
+#define LOG_DEBUG (1U << 1)
+
+//#define VERBOSE (LOG_GENERAL | LOG_DEBUG)
+//#define LOG_OUTPUT_FUNC printf
+#include "logmacro.h"
+
+#define LOGDBG(...) LOGMASKED(LOG_DEBUG, __VA_ARGS__)
-#define DBG_LOG(N,M,A) \
- do { \
- if(VERBOSE_DBG>=N) \
- { \
- logerror("%11.6f at %s: ",machine().time().as_double(),machine().describe_context()); \
- logerror A; \
- } \
- } while (0)
//**************************************************************************
// MACROS / CONSTANTS
@@ -406,7 +405,7 @@ WRITE8_MEMBER( ms7004_device::p1_w )
6
7 Serial TX
*/
- DBG_LOG(2,0,( "%s: p1_w %02x = send %d\n", tag(), data, BIT(data, 7)));
+ LOGDBG("p1_w %02x = send %d\n", data, BIT(data, 7));
m_p1 = data;
m_tx_handler(BIT(data, 7));
@@ -431,7 +430,7 @@ WRITE8_MEMBER( ms7004_device::p2_w )
6 LED "Caps"
7 LED "Hold"
*/
- DBG_LOG(2,0,( "p2_w %02x = col %d\n", data, data&15));
+ LOGDBG("p2_w %02x = col %d\n", data, data&15);
m_p2 = data;
m_i8243->p2_w(data);
@@ -447,7 +446,7 @@ void ms7004_device::i8243_port_w(uint8_t data)
{
int sense = 0;
- DBG_LOG(2,0,( "8243 port %d data %02xH\n", P + 4, data));
+ LOGDBG("8243 port %d data %02xH\n", P + 4, data);
if (data) {
switch(data) {
@@ -458,8 +457,8 @@ void ms7004_device::i8243_port_w(uint8_t data)
}
m_keylatch = BIT(sense, (m_p1 & 7));
if (m_keylatch)
- DBG_LOG(1,0,( "row %d col %02x t1 %d\n",
- (m_p1 & 7), (P << 4 | data), m_keylatch));
+ LOG("row %d col %02x t1 %d\n",
+ (m_p1 & 7), (P << 4 | data), m_keylatch);
}
}
diff --git a/src/mame/machine/msx.cpp b/src/mame/machine/msx.cpp
index 64d2c1238eb..56a1c63aa14 100644
--- a/src/mame/machine/msx.cpp
+++ b/src/mame/machine/msx.cpp
@@ -362,13 +362,11 @@ READ8_MEMBER( msx_state::msx_ppi_port_b_r )
*
***********************************************************************/
-void msx_state::install_slot_pages(uint8_t prim, uint8_t sec, uint8_t page, uint8_t numpages, device_t *device)
+void msx_state::install_slot_pages(uint8_t prim, uint8_t sec, uint8_t page, uint8_t numpages, msx_internal_slot_interface &device)
{
- msx_internal_slot_interface *internal_slot = dynamic_cast<msx_internal_slot_interface *>(device);
-
for ( int i = page; i < std::min(page + numpages, 4); i++ )
{
- m_all_slots[prim][sec][i] = internal_slot;
+ m_all_slots[prim][sec][i] = &device;
}
if ( sec )
{
@@ -430,12 +428,12 @@ void msx_state::msx_memory_map_all ()
READ8_MEMBER( msx_state::msx_mem_read )
{
- return m_current_page[offset >> 14]->read(space, offset);
+ return m_current_page[offset >> 14]->read(offset);
}
WRITE8_MEMBER( msx_state::msx_mem_write )
{
- m_current_page[offset >> 14]->write(space, offset, data);
+ m_current_page[offset >> 14]->write(offset, data);
}
WRITE8_MEMBER( msx_state::msx_sec_slot_w )
@@ -450,7 +448,7 @@ WRITE8_MEMBER( msx_state::msx_sec_slot_w )
msx_memory_map_all ();
}
else
- m_current_page[3]->write(space, 0xffff, data);
+ m_current_page[3]->write(0xffff, data);
}
READ8_MEMBER( msx_state::msx_sec_slot_r )
@@ -463,7 +461,7 @@ READ8_MEMBER( msx_state::msx_sec_slot_r )
}
else
{
- return m_current_page[3]->read(space, 0xffff);
+ return m_current_page[3]->read(0xffff);
}
}
diff --git a/src/mame/machine/mtx.cpp b/src/mame/machine/mtx.cpp
index 846648b30e8..ae717521d76 100644
--- a/src/mame/machine/mtx.cpp
+++ b/src/mame/machine/mtx.cpp
@@ -111,38 +111,20 @@ void mtx_state::bankswitch(uint8_t data)
program.install_readwrite_bank(0x8000, 0xbfff, "rammap_bank3");
/* set ram bank, for invalid pages a nop-handler will be installed */
- switch (ram_page)
- {
- case 0:
- if (ram_page * 0xc000 + 0x10000 <= m_ram->size())
- membank("rammap_bank1")->set_entry(ram_page);
- else
- program.nop_readwrite(0x0000, 0x3fff);
- if (ram_page * 0xc000 + 0xc000 <= m_ram->size())
- membank("rammap_bank2")->set_entry(ram_page);
- else
- program.nop_readwrite(0x4000, 0x7fff);
- if (ram_page * 0xc000 + 0x8000 <= m_ram->size())
- membank("rammap_bank3")->set_entry(ram_page);
- else
- program.nop_readwrite(0x8000, 0xbfff);
- break;
-
- default:
- if (ram_page * 0xc000 + 0x8000 <= m_ram->size())
- membank("rammap_bank1")->set_entry(ram_page);
- else
- program.nop_readwrite(0x0000, 0x3fff);
- if (ram_page * 0xc000 + 0xc000 <= m_ram->size())
- membank("rammap_bank2")->set_entry(ram_page);
- else
- program.nop_readwrite(0x4000, 0x7fff);
- if (ram_page * 0xc000 + 0x10000 <= m_ram->size())
- membank("rammap_bank3")->set_entry(ram_page);
- else
- program.nop_readwrite(0x8000, 0xbfff);
- break;
- }
+ if ((ram_page == 0 && m_ram->size() > 0xc000) || (ram_page > 0 && m_ram->size() > 0x10000 + ram_page * 0xc000))
+ membank("rammap_bank1")->set_entry(ram_page);
+ else
+ program.nop_readwrite(0x0000, 0x3fff);
+ if ((ram_page == 0 && m_ram->size() > 0x8000) || (ram_page > 0 && m_ram->size() > 0x14000 + ram_page * 0xc000))
+
+ membank("rammap_bank2")->set_entry(ram_page);
+ else
+ program.nop_readwrite(0x4000, 0x7fff);
+ if ((ram_page == 0 && m_ram->size() > 0x4000) || (ram_page > 0 && m_ram->size() > 0x18000 + ram_page * 0xc000))
+
+ membank("rammap_bank3")->set_entry(ram_page);
+ else
+ program.nop_readwrite(0x8000, 0xbfff);
}
else
{
@@ -158,11 +140,11 @@ void mtx_state::bankswitch(uint8_t data)
membank("rommap_bank1")->set_entry(rom_page);
/* set ram bank, for invalid pages a nop-handler will be installed */
- if (ram_page * 0x8000 + 0xc000 <= m_ram->size())
+ if ((ram_page == 0 && m_ram->size() > 0x8000) || (ram_page > 0 && m_ram->size() > 0x10000 + ram_page * 0x8000))
membank("rommap_bank2")->set_entry(ram_page);
else
program.nop_readwrite(0x4000, 0x7fff);
- if (ram_page * 0x8000 + 0x8000 <= m_ram->size())
+ if ((ram_page == 0 && m_ram->size() > 0x4000) || (ram_page == 1 && m_ram->size() > 0xc000) || (ram_page > 1 && m_ram->size() > 0x14000 + ram_page * 0x8000))
membank("rommap_bank3")->set_entry(ram_page);
else
program.nop_readwrite(0x8000, 0xbfff);
@@ -208,7 +190,16 @@ WRITE8_MEMBER(mtx_state::mtx_cst_w)
WRITE8_MEMBER(mtx_state::mtx_cst_motor_w)
{
- m_cassette->change_state(data ? CASSETTE_MOTOR_ENABLED : CASSETTE_MOTOR_DISABLED, CASSETTE_MASK_MOTOR);
+ /* supported in the MTX ROM */
+ switch (data)
+ {
+ case 0xaa:
+ m_cassette->change_state(CASSETTE_MOTOR_ENABLED, CASSETTE_MASK_MOTOR);
+ break;
+ case 0x55:
+ m_cassette->change_state(CASSETTE_MOTOR_DISABLED, CASSETTE_MASK_MOTOR);
+ break;
+ }
}
/*-------------------------------------------------
@@ -453,14 +444,10 @@ DEVICE_IMAGE_LOAD_MEMBER( mtx_state, rompak_load )
SNAPSHOT_LOAD_MEMBER( mtx_state, mtx )
{
address_space &program = m_maincpu->space(AS_PROGRAM);
- void *ptr;
- uint8_t header[18];
-
- // read header
- image.fread(&header, sizeof(header));
+ uint8_t *data = (uint8_t*)image.ptr();
// verify first byte
- if (header[0] != 0xff)
+ if (data[0] != 0xff)
{
image.seterror(IMAGE_ERROR_INVALIDIMAGE, nullptr);
return image_init_result::FAIL;
@@ -468,37 +455,74 @@ SNAPSHOT_LOAD_MEMBER( mtx_state, mtx )
// get tape name
char tape_name[16];
- memcpy(&tape_name, &header[1], 15);
+ memcpy(&tape_name, &data[1], 15);
tape_name[15] = '\0';
image.message("Loading '%s'", tape_name);
+ // reset memory map
+ bankswitch(0);
+
// start of system variables area
- uint16_t system_variables_base = pick_integer_le(header, 16, 2);
+ uint16_t system_variables_base = pick_integer_le(data, 16, 2);
// write system variables
uint16_t system_variables_size = 0;
if (system_variables_base != 0)
{
- ptr = program.get_write_ptr(system_variables_base);
system_variables_size = 0xfb4b - system_variables_base;
- image.fread(ptr, system_variables_size);
+ for (int i = 0; i < system_variables_size; i++)
+ program.write_byte(system_variables_base + i, data[18 + i]);
}
// write actual image data
uint16_t data_size = snapshot_size - 18 - system_variables_size;
+ for (int i = 0; i < data_size; i++)
+ program.write_byte(0x4000 + i, data[18 + system_variables_size + i]);
- ptr = program.get_write_ptr(0x4000);
- image.fread(ptr, 0x4000);
+ logerror("snapshot name = '%s', system_size = 0x%04x, data_size = 0x%04x\n", tape_name, system_variables_size, data_size);
+
+ return image_init_result::PASS;
+}
- // if we cross the page boundary, get a new write pointer and write the rest
- if (data_size > 0x4000)
+/***************************************************************************
+ QUICKLOAD
+***************************************************************************/
+
+QUICKLOAD_LOAD_MEMBER(mtx_state, mtx)
+{
+ address_space &program = m_maincpu->space(AS_PROGRAM);
+ uint8_t *data = (uint8_t*)image.ptr();
+
+ if (quickload_size < 4)
{
- ptr = program.get_write_ptr(0x8000);
- image.fread(ptr, 0x4000);
+ image.seterror(IMAGE_ERROR_INVALIDIMAGE, "File too short");
+ return image_init_result::FAIL;
}
- logerror("snapshot name = '%s', system_size = 0x%04x, data_size = 0x%04x\n", tape_name, system_variables_size, data_size);
+ uint16_t code_base = pick_integer_le(data, 0, 2);
+ uint16_t code_length = pick_integer_le(data, 2, 2);
+
+ if (quickload_size < code_length)
+ {
+ image.seterror(IMAGE_ERROR_INVALIDIMAGE, "File too short");
+ return image_init_result::FAIL;
+ }
+
+ if (code_base < 0x4000 || (code_base + code_length) >= 0x10000)
+ {
+ image.seterror(IMAGE_ERROR_INVALIDIMAGE, "Invalid code base and length");
+ return image_init_result::FAIL;
+ }
+
+ // reset memory map
+ bankswitch(0);
+
+ // write image data
+ for (int i = 0; i < code_length; i++)
+ program.write_byte(code_base + i, data[4 + i]);
+
+ m_maincpu->set_pc(code_base);
return image_init_result::PASS;
}
@@ -511,7 +535,7 @@ SNAPSHOT_LOAD_MEMBER( mtx_state, mtx )
MACHINE_START( mtx512 )
-------------------------------------------------*/
-MACHINE_START_MEMBER(mtx_state, mtx512)
+void mtx_state::machine_start()
{
address_space &program = m_maincpu->space(AS_PROGRAM);
@@ -521,12 +545,11 @@ MACHINE_START_MEMBER(mtx_state, mtx512)
program.install_readwrite_bank(0x8000, 0xbfff, "rommap_bank3");
membank("rommap_bank1")->configure_entries(0, 8, memregion("user2")->base(), 0x2000);
- if (m_extrom->exists())
- membank("rommap_bank1")->configure_entry(2, m_extrom->get_rom_base());
- if (m_rompak->exists())
- membank("rommap_bank1")->configure_entry(7, m_rompak->get_rom_base());
- membank("rommap_bank2")->configure_entries(0, 16, m_ram->pointer() + 0x8000, 0x8000);
- membank("rommap_bank3")->configure_entries(0, 16, m_ram->pointer() + 0x4000, 0x8000);
+ membank("rommap_bank2")->configure_entry(0, m_ram->pointer() + 0x8000);
+ membank("rommap_bank2")->configure_entries(1, 15, m_ram->pointer() + 0x10000, 0x8000);
+ membank("rommap_bank3")->configure_entry(0, m_ram->pointer() + 0x4000);
+ membank("rommap_bank3")->configure_entry(1, m_ram->pointer() + 0xc000);
+ membank("rommap_bank3")->configure_entries(2, 14, m_ram->pointer() + 0x14000, 0x8000);
/* setup banks for ram based memory map */
program.install_readwrite_bank(0x0000, 0x3fff, "rammap_bank1");
@@ -544,8 +567,18 @@ MACHINE_START_MEMBER(mtx_state, mtx512)
program.install_ram(0xc000, 0xffff, m_ram->pointer());
}
-MACHINE_RESET_MEMBER(mtx_state, mtx512)
+void mtx_state::machine_reset()
{
+ /* extension board ROMs */
+ if (m_extrom->exists())
+ membank("rommap_bank1")->configure_entry(2, m_extrom->get_rom_base());
+ /* keyboard ROMs */
+ if (ioport("keyboard_rom")->read())
+ membank("rommap_bank1")->configure_entry(7, memregion("keyboard_rom")->base() + (ioport("keyboard_rom")->read() - 1) * 0x2000);
+ /* rompak ROMs */
+ if (m_rompak->exists())
+ membank("rommap_bank1")->configure_entry(7, m_rompak->get_rom_base());
+
/* bank switching */
bankswitch(0);
}
diff --git a/src/mame/machine/mw8080bw.cpp b/src/mame/machine/mw8080bw.cpp
index 1d081aa551f..ae8b32dd8ff 100644
--- a/src/mame/machine/mw8080bw.cpp
+++ b/src/mame/machine/mw8080bw.cpp
@@ -45,19 +45,16 @@ int mw8080bw_state::vysnc_chain_counter_to_vpos( uint8_t counter, int vblank )
}
-TIMER_CALLBACK_MEMBER(mw8080bw_state::mw8080bw_interrupt_callback)
+TIMER_CALLBACK_MEMBER(mw8080bw_state::interrupt_trigger)
{
- uint8_t next_counter;
- int next_vpos;
- int next_vblank;
-
- /* compute vector and set the interrupt line */
int vpos = m_screen->vpos();
uint8_t counter = vpos_to_vysnc_chain_counter(vpos);
- uint8_t vector = 0xc7 | ((counter & 0x40) >> 2) | ((~counter & 0x40) >> 3);
- m_maincpu->set_input_line_and_vector(0, HOLD_LINE, vector);
+
+ m_maincpu->set_input_line(0, ASSERT_LINE);
/* set up for next interrupt */
+ uint8_t next_counter;
+ int next_vblank;
if (counter == MW8080BW_INT_TRIGGER_COUNT_1)
{
next_counter = MW8080BW_INT_TRIGGER_COUNT_2;
@@ -69,14 +66,25 @@ TIMER_CALLBACK_MEMBER(mw8080bw_state::mw8080bw_interrupt_callback)
next_vblank = MW8080BW_INT_TRIGGER_VBLANK_1;
}
- next_vpos = vysnc_chain_counter_to_vpos(next_counter, next_vblank);
+ int next_vpos = vysnc_chain_counter_to_vpos(next_counter, next_vblank);
m_interrupt_timer->adjust(m_screen->time_until_pos(next_vpos));
}
+IRQ_CALLBACK_MEMBER(mw8080bw_state::interrupt_vector)
+{
+ int vpos = m_screen->vpos();
+ uint8_t counter = vpos_to_vysnc_chain_counter(vpos);
+ uint8_t vector = 0xc7 | ((counter & 0x40) >> 2) | ((~counter & 0x40) >> 3);
+
+ m_maincpu->set_input_line(0, CLEAR_LINE);
+ return vector;
+}
+
+
void mw8080bw_state::mw8080bw_create_interrupt_timer( )
{
- m_interrupt_timer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(mw8080bw_state::mw8080bw_interrupt_callback),this));
+ m_interrupt_timer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(mw8080bw_state::interrupt_trigger),this));
}
diff --git a/src/mame/machine/namcos1.cpp b/src/mame/machine/namcos1.cpp
index 627e2a8222c..02dc8fedb50 100644
--- a/src/mame/machine/namcos1.cpp
+++ b/src/mame/machine/namcos1.cpp
@@ -10,20 +10,20 @@
* *
*******************************************************************************/
-WRITE8_MEMBER( namcos1_state::_3dcs_w )
+void namcos1_state::_3dcs_w(offs_t offset, u8 data)
{
if (offset & 1) popmessage("LEFT");
else popmessage("RIGHT");
}
-READ8_MEMBER( namcos1_state::no_key_r )
+u8 namcos1_state::no_key_r(offs_t offset)
{
popmessage("%s: keychip read %04x\n", m_mcu->tag(), m_mcu->pc(), offset);
return 0;
}
-WRITE8_MEMBER( namcos1_state::no_key_w )
+void namcos1_state::no_key_w(offs_t offset, u8 data)
{
popmessage("%s: keychip write %04x=%02x\n", m_mcu->tag(), m_mcu->pc(), offset, data);
}
@@ -128,7 +128,7 @@ puzlclub:
CPU #0 PC e017: keychip write 0003=35 [they probably used RAM instead of a key chip for this prototype]
CPU #0 PC e3d4: keychip read 0003 [AND #$37 = key no.]
*/
-READ8_MEMBER( namcos1_state::key_type1_r )
+u8 namcos1_state::key_type1_r(offs_t offset)
{
// logerror("%s: keychip read %04x\n", machine().describe_context(), offset);
@@ -159,7 +159,7 @@ READ8_MEMBER( namcos1_state::key_type1_r )
return 0;
}
-WRITE8_MEMBER( namcos1_state::key_type1_w )
+void namcos1_state::key_type1_w(offs_t offset, u8 data)
{
// logerror("%s: keychip write %04x=%02x\n", machine().describe_context(), offset, data);
@@ -311,7 +311,7 @@ CPU #0 PC e574: keychip read 0001
*/
-READ8_MEMBER( namcos1_state::key_type2_r )
+u8 namcos1_state::key_type2_r(offs_t offset)
{
// logerror("%s: keychip read %04x\n", machine().describe_context(), offset);
@@ -330,7 +330,7 @@ READ8_MEMBER( namcos1_state::key_type2_r )
return 0;
}
-WRITE8_MEMBER( namcos1_state::key_type2_w )
+void namcos1_state::key_type2_w(offs_t offset, u8 data)
{
// logerror("%s: keychip write %04x=%02x\n", machine().describe_context(), offset, data);
@@ -340,8 +340,8 @@ WRITE8_MEMBER( namcos1_state::key_type2_w )
if (offset == 3)
{
- unsigned int d = (m_key[0] << 8) | m_key[1];
- unsigned int n = (m_key_numerator_high_word << 16) | (m_key[2] << 8) | m_key[3];
+ u32 d = (m_key[0] << 8) | m_key[1];
+ u32 n = (m_key_numerator_high_word << 16) | (m_key[2] << 8) | m_key[3];
if (d)
{
@@ -437,7 +437,7 @@ CPU #0 PC ca96: keychip read 0043 [0x30 | (ARG & 0x0f)]
CPU #0 PC e45a: keychip read 0030 [discarded]
*/
-READ8_MEMBER( namcos1_state::key_type3_r )
+u8 namcos1_state::key_type3_r(offs_t offset)
{
// logerror("%s: keychip read %04x\n", machine().describe_context(), offset);
@@ -447,7 +447,7 @@ READ8_MEMBER( namcos1_state::key_type3_r )
The schematics don't show A11 being used, so I go for this handling.
*/
- int op = (offset & 0x70) >> 4;
+ const int op = (offset & 0x70) >> 4;
if (op == m_key_reg) return m_key_id;
if (op == m_key_rng) return machine().rand();
@@ -461,7 +461,7 @@ READ8_MEMBER( namcos1_state::key_type3_r )
return 0;
}
-WRITE8_MEMBER( namcos1_state::key_type3_w )
+void namcos1_state::key_type3_w(offs_t offset, u8 data)
{
// logerror("%s: keychip write %04x=%02x\n", machine().describe_context(), offset, data);
@@ -476,7 +476,7 @@ WRITE8_MEMBER( namcos1_state::key_type3_w )
* *
*******************************************************************************/
-WRITE8_MEMBER(namcos1_state::sound_bankswitch_w)
+void namcos1_state::sound_bankswitch_w(u8 data)
{
m_soundbank->set_entry((data & 0x70) >> 4);
}
@@ -545,7 +545,7 @@ void namcos1_state::machine_reset()
*******************************************************************************/
/* mcu banked rom area select */
-WRITE8_MEMBER(namcos1_state::mcu_bankswitch_w)
+void namcos1_state::mcu_bankswitch_w(u8 data)
{
int bank;
@@ -581,7 +581,7 @@ WRITE8_MEMBER(namcos1_state::mcu_bankswitch_w)
/* I found set $A6 only initialize in MCU */
/* This patch kill write this data by MCU case $A6 to xx(clear) */
-WRITE8_MEMBER(namcos1_state::mcu_patch_w)
+void namcos1_state::mcu_patch_w(u8 data)
{
//logerror("mcu C000 write %s data=%02x\n",machine().describe_context(),data);
if (m_mcu_patch_data == 0xa6) return;
@@ -603,14 +603,14 @@ void namcos1_state::driver_init()
{
if ((i & 0x010000) == 0)
{
- uint8_t t = m_rom[i];
+ u8 t = m_rom[i];
m_rom[i] = m_rom[i + 0x010000];
m_rom[i + 0x010000] = t;
}
}
// kludge! see notes
- m_mcu->space(AS_PROGRAM).install_write_handler(0xc000, 0xc000, write8_delegate(FUNC(namcos1_state::mcu_patch_w), this));
+ m_mcu->space(AS_PROGRAM).install_write_handler(0xc000, 0xc000, write8smo_delegate(FUNC(namcos1_state::mcu_patch_w), this));
// these are overridden as needed in the specific DRIVER_INIT_MEMBERs
m_key_id = 0;
@@ -622,6 +622,38 @@ void namcos1_state::driver_init()
m_key_top4 = 0;
}
+void namcos1_state::key_type_1_init(int key_id)
+{
+ m_c117->space(AS_PROGRAM).install_readwrite_handler(0x2f8000, 0x2f9fff,
+ read8sm_delegate(FUNC(namcos1_state::key_type1_r),this),
+ write8sm_delegate(FUNC(namcos1_state::key_type1_w),this));
+ m_key_id = key_id;
+}
+
+void namcos1_state::key_type_2_init(int key_id)
+{
+ m_c117->space(AS_PROGRAM).install_readwrite_handler(0x2f8000, 0x2f9fff,
+ read8sm_delegate(FUNC(namcos1_state::key_type2_r),this),
+ write8sm_delegate(FUNC(namcos1_state::key_type2_w),this));
+ m_key_id = key_id;
+ save_item(NAME(m_key_quotient));
+ save_item(NAME(m_key_reminder));
+ save_item(NAME(m_key_numerator_high_word));
+}
+
+void namcos1_state::key_type_3_init(int key_id, int reg, int rng, int swap4_arg, int swap4, int bottom4, int top4)
+{
+ m_c117->space(AS_PROGRAM).install_readwrite_handler(0x2f8000, 0x2f9fff,
+ read8sm_delegate(FUNC(namcos1_state::key_type3_r),this),
+ write8sm_delegate(FUNC(namcos1_state::key_type3_w),this));
+ m_key_id = key_id;
+ m_key_reg = reg;
+ m_key_rng = rng;
+ m_key_swap4_arg = swap4_arg;
+ m_key_swap4 = swap4;
+ m_key_bottom4 = bottom4;
+ m_key_top4 = top4;
+}
/*******************************************************************************
* Shadowland / Youkai Douchuuki specific *
@@ -637,10 +669,7 @@ void namcos1_state::init_shadowld()
void namcos1_state::init_dspirit()
{
driver_init();
- m_c117->space(AS_PROGRAM).install_readwrite_handler(0x2f8000, 0x2f9fff,
- read8_delegate(FUNC(namcos1_state::key_type1_r),this),
- write8_delegate(FUNC(namcos1_state::key_type1_w),this));
- m_key_id = 0x36;
+ key_type_1_init(0x36);
}
/*******************************************************************************
@@ -649,10 +678,7 @@ void namcos1_state::init_dspirit()
void namcos1_state::init_wldcourt()
{
driver_init();
- m_c117->space(AS_PROGRAM).install_readwrite_handler(0x2f8000, 0x2f9fff,
- read8_delegate(FUNC(namcos1_state::key_type1_r),this),
- write8_delegate(FUNC(namcos1_state::key_type1_w),this));
- m_key_id = 0x35;
+ key_type_1_init(0x35);
}
/*******************************************************************************
@@ -661,10 +687,7 @@ void namcos1_state::init_wldcourt()
void namcos1_state::init_blazer()
{
driver_init();
- m_c117->space(AS_PROGRAM).install_readwrite_handler(0x2f8000, 0x2f9fff,
- read8_delegate(FUNC(namcos1_state::key_type1_r),this),
- write8_delegate(FUNC(namcos1_state::key_type1_w),this));
- m_key_id = 0x13;
+ key_type_1_init(0x13);
}
/*******************************************************************************
@@ -673,10 +696,7 @@ void namcos1_state::init_blazer()
void namcos1_state::init_puzlclub()
{
driver_init();
- m_c117->space(AS_PROGRAM).install_readwrite_handler(0x2f8000, 0x2f9fff,
- read8_delegate(FUNC(namcos1_state::key_type1_r),this),
- write8_delegate(FUNC(namcos1_state::key_type1_w),this));
- m_key_id = 0x35;
+ key_type_1_init(0x35);
}
/*******************************************************************************
@@ -685,13 +705,7 @@ void namcos1_state::init_puzlclub()
void namcos1_state::init_pacmania()
{
driver_init();
- m_c117->space(AS_PROGRAM).install_readwrite_handler(0x2f8000, 0x2f9fff,
- read8_delegate(FUNC(namcos1_state::key_type2_r),this),
- write8_delegate(FUNC(namcos1_state::key_type2_w),this));
- m_key_id = 0x12;
- save_item(NAME(m_key_quotient));
- save_item(NAME(m_key_reminder));
- save_item(NAME(m_key_numerator_high_word));
+ key_type_2_init(0x12);
}
/*******************************************************************************
@@ -700,13 +714,7 @@ void namcos1_state::init_pacmania()
void namcos1_state::init_alice()
{
driver_init();
- m_c117->space(AS_PROGRAM).install_readwrite_handler(0x2f8000, 0x2f9fff,
- read8_delegate(FUNC(namcos1_state::key_type2_r),this),
- write8_delegate(FUNC(namcos1_state::key_type2_w),this));
- m_key_id = 0x25;
- save_item(NAME(m_key_quotient));
- save_item(NAME(m_key_reminder));
- save_item(NAME(m_key_numerator_high_word));
+ key_type_2_init(0x25);
}
/*******************************************************************************
@@ -715,13 +723,7 @@ void namcos1_state::init_alice()
void namcos1_state::init_galaga88()
{
driver_init();
- m_c117->space(AS_PROGRAM).install_readwrite_handler(0x2f8000, 0x2f9fff,
- read8_delegate(FUNC(namcos1_state::key_type2_r),this),
- write8_delegate(FUNC(namcos1_state::key_type2_w),this));
- m_key_id = 0x31;
- save_item(NAME(m_key_quotient));
- save_item(NAME(m_key_reminder));
- save_item(NAME(m_key_numerator_high_word));
+ key_type_2_init(0x31);
}
/*******************************************************************************
@@ -730,13 +732,7 @@ void namcos1_state::init_galaga88()
void namcos1_state::init_ws()
{
driver_init();
- m_c117->space(AS_PROGRAM).install_readwrite_handler(0x2f8000, 0x2f9fff,
- read8_delegate(FUNC(namcos1_state::key_type2_r),this),
- write8_delegate(FUNC(namcos1_state::key_type2_w),this));
- m_key_id = 0x07;
- save_item(NAME(m_key_quotient));
- save_item(NAME(m_key_reminder));
- save_item(NAME(m_key_numerator_high_word));
+ key_type_2_init(0x07);
}
/*******************************************************************************
@@ -745,13 +741,7 @@ void namcos1_state::init_ws()
void namcos1_state::init_bakutotu()
{
driver_init();
- m_c117->space(AS_PROGRAM).install_readwrite_handler(0x2f8000, 0x2f9fff,
- read8_delegate(FUNC(namcos1_state::key_type2_r),this),
- write8_delegate(FUNC(namcos1_state::key_type2_w),this));
- m_key_id = 0x22;
- save_item(NAME(m_key_quotient));
- save_item(NAME(m_key_reminder));
- save_item(NAME(m_key_numerator_high_word));
+ key_type_2_init(0x22);
}
/*******************************************************************************
@@ -760,16 +750,7 @@ void namcos1_state::init_bakutotu()
void namcos1_state::init_splatter()
{
driver_init();
- m_c117->space(AS_PROGRAM).install_readwrite_handler(0x2f8000, 0x2f9fff,
- read8_delegate(FUNC(namcos1_state::key_type3_r),this),
- write8_delegate(FUNC(namcos1_state::key_type3_w),this));
- m_key_id = 181;
- m_key_reg = 3;
- m_key_rng = 4;
- m_key_swap4_arg = -1;
- m_key_swap4 = -1;
- m_key_bottom4 = -1;
- m_key_top4 = -1;
+ key_type_3_init(181, 3, 4, -1, -1, -1, -1);
}
/*******************************************************************************
@@ -778,16 +759,7 @@ void namcos1_state::init_splatter()
void namcos1_state::init_rompers()
{
driver_init();
- m_c117->space(AS_PROGRAM).install_readwrite_handler(0x2f8000, 0x2f9fff,
- read8_delegate(FUNC(namcos1_state::key_type3_r),this),
- write8_delegate(FUNC(namcos1_state::key_type3_w),this));
- m_key_id = 182;
- m_key_reg = 7;
- m_key_rng = -1;
- m_key_swap4_arg = -1;
- m_key_swap4 = -1;
- m_key_bottom4 = -1;
- m_key_top4 = -1;
+ key_type_3_init(182, 7, -1, -1, -1, -1, -1);
}
/*******************************************************************************
@@ -796,16 +768,7 @@ void namcos1_state::init_rompers()
void namcos1_state::init_blastoff()
{
driver_init();
- m_c117->space(AS_PROGRAM).install_readwrite_handler(0x2f8000, 0x2f9fff,
- read8_delegate(FUNC(namcos1_state::key_type3_r),this),
- write8_delegate(FUNC(namcos1_state::key_type3_w),this));
- m_key_id = 183;
- m_key_reg = 0;
- m_key_rng = 7;
- m_key_swap4_arg = 3;
- m_key_swap4 = 5;
- m_key_bottom4 = -1;
- m_key_top4 = -1;
+ key_type_3_init(183, 0, 7, 3, 5, -1, -1);
}
/*******************************************************************************
@@ -814,16 +777,7 @@ void namcos1_state::init_blastoff()
void namcos1_state::init_ws89()
{
driver_init();
- m_c117->space(AS_PROGRAM).install_readwrite_handler(0x2f8000, 0x2f9fff,
- read8_delegate(FUNC(namcos1_state::key_type3_r),this),
- write8_delegate(FUNC(namcos1_state::key_type3_w),this));
- m_key_id = 184;
- m_key_reg = 2;
- m_key_rng = -1;
- m_key_swap4_arg = -1;
- m_key_swap4 = -1;
- m_key_bottom4 = -1;
- m_key_top4 = -1;
+ key_type_3_init(184, 2, -1, -1, -1, -1, -1);
}
/*******************************************************************************
@@ -832,16 +786,7 @@ void namcos1_state::init_ws89()
void namcos1_state::init_tankfrce()
{
driver_init();
- m_c117->space(AS_PROGRAM).install_readwrite_handler(0x2f8000, 0x2f9fff,
- read8_delegate(FUNC(namcos1_state::key_type3_r),this),
- write8_delegate(FUNC(namcos1_state::key_type3_w),this));
- m_key_id = 185;
- m_key_reg = 5;
- m_key_rng = -1;
- m_key_swap4_arg = 1;
- m_key_swap4 = -1;
- m_key_bottom4 = 2;
- m_key_top4 = -1;
+ key_type_3_init(185, 5, -1, 1, -1, 2, -1);
}
void namcos1_state::init_tankfrc4()
@@ -853,7 +798,7 @@ void namcos1_state::init_tankfrc4()
m_stored_input[0] = 0;
m_stored_input[1] = 0;
- m_mcu->space(AS_PROGRAM).install_read_handler(0x1400, 0x1401, read8_delegate(FUNC(namcos1_state::faceoff_inputs_r), this));
+ m_mcu->space(AS_PROGRAM).install_read_handler(0x1400, 0x1401, read8sm_delegate(FUNC(namcos1_state::faceoff_inputs_r), this));
save_item(NAME(m_input_count));
save_item(NAME(m_stored_input));
}
@@ -864,16 +809,7 @@ void namcos1_state::init_tankfrc4()
void namcos1_state::init_dangseed()
{
driver_init();
- m_c117->space(AS_PROGRAM).install_readwrite_handler(0x2f8000, 0x2f9fff,
- read8_delegate(FUNC(namcos1_state::key_type3_r),this),
- write8_delegate(FUNC(namcos1_state::key_type3_w),this));
- m_key_id = 308;
- m_key_reg = 6;
- m_key_rng = -1;
- m_key_swap4_arg = 5;
- m_key_swap4 = -1;
- m_key_bottom4 = 0;
- m_key_top4 = 4;
+ key_type_3_init(308, 6, -1, 5, -1, 0, 4);
}
/*******************************************************************************
@@ -882,16 +818,7 @@ void namcos1_state::init_dangseed()
void namcos1_state::init_pistoldm()
{
driver_init();
- m_c117->space(AS_PROGRAM).install_readwrite_handler(0x2f8000, 0x2f9fff,
- read8_delegate(FUNC(namcos1_state::key_type3_r),this),
- write8_delegate(FUNC(namcos1_state::key_type3_w),this));
- m_key_id = 309;
- m_key_reg = 1;
- m_key_rng = 2;
- m_key_swap4_arg = 0;
- m_key_swap4 = -1;
- m_key_bottom4 = 4;
- m_key_top4 = -1;
+ key_type_3_init(309, 1, 2, 0, -1, 4, -1);
}
/*******************************************************************************
@@ -900,16 +827,7 @@ void namcos1_state::init_pistoldm()
void namcos1_state::init_ws90()
{
driver_init();
- m_c117->space(AS_PROGRAM).install_readwrite_handler(0x2f8000, 0x2f9fff,
- read8_delegate(FUNC(namcos1_state::key_type3_r),this),
- write8_delegate(FUNC(namcos1_state::key_type3_w),this));
- m_key_id = 310;
- m_key_reg = 4;
- m_key_rng = -1;
- m_key_swap4_arg = 7;
- m_key_swap4 = -1;
- m_key_bottom4 = 3;
- m_key_top4 = -1;
+ key_type_3_init(310, 4, -1, 7, -1, 3, -1);
}
/*******************************************************************************
@@ -918,16 +836,7 @@ void namcos1_state::init_ws90()
void namcos1_state::init_soukobdx()
{
driver_init();
- m_c117->space(AS_PROGRAM).install_readwrite_handler(0x2f8000, 0x2f9fff,
- read8_delegate(FUNC(namcos1_state::key_type3_r),this),
- write8_delegate(FUNC(namcos1_state::key_type3_w),this));
- m_key_id = 311;
- m_key_reg = 2;
- m_key_rng = 3; /*?*/
- m_key_swap4_arg = 0;
- m_key_swap4 = -1;
- m_key_bottom4 = 4;
- m_key_top4 = -1;
+ key_type_3_init(311, 2, 3 /*?*/, 0, -1, 4, -1);
}
@@ -935,16 +844,16 @@ void namcos1_state::init_soukobdx()
/*******************************************************************************
* Quester specific *
*******************************************************************************/
-READ8_MEMBER( namcos1_state::quester_paddle_r )
+u8 namcos1_state::quester_paddle_r(offs_t offset)
{
if (offset == 0)
{
int ret;
if (!(m_strobe & 0x20))
- ret = (ioport("CONTROL0")->read()&0x90) | (m_strobe & 0x40) | (ioport("PADDLE0")->read()&0x0f);
+ ret = (m_io_control[0]->read()&0x90) | (m_strobe & 0x40) | (m_io_paddle[0]->read()&0x0f);
else
- ret = (ioport("CONTROL0")->read()&0x90) | (m_strobe & 0x40) | (ioport("PADDLE1")->read()&0x0f);
+ ret = (m_io_control[0]->read()&0x90) | (m_strobe & 0x40) | (m_io_paddle[1]->read()&0x0f);
m_strobe ^= 0x40;
@@ -955,9 +864,9 @@ READ8_MEMBER( namcos1_state::quester_paddle_r )
int ret;
if (!(m_strobe & 0x20))
- ret = (ioport("CONTROL1")->read()&0x90) | 0x00 | (ioport("PADDLE0")->read()>>4);
+ ret = (m_io_control[1]->read()&0x90) | 0x00 | (m_io_paddle[0]->read()>>4);
else
- ret = (ioport("CONTROL1")->read()&0x90) | 0x20 | (ioport("PADDLE1")->read()>>4);
+ ret = (m_io_control[1]->read()&0x90) | 0x20 | (m_io_paddle[1]->read()>>4);
if (!(m_strobe & 0x40)) m_strobe ^= 0x20;
@@ -969,7 +878,7 @@ void namcos1_state::init_quester()
{
m_strobe = 0;
driver_init();
- m_mcu->space(AS_PROGRAM).install_read_handler(0x1400, 0x1401, read8_delegate(FUNC(namcos1_state::quester_paddle_r), this));
+ m_mcu->space(AS_PROGRAM).install_read_handler(0x1400, 0x1401, read8sm_delegate(FUNC(namcos1_state::quester_paddle_r), this));
save_item(NAME(m_strobe));
}
@@ -979,7 +888,7 @@ void namcos1_state::init_quester()
* Beraboh Man specific *
*******************************************************************************/
-READ8_MEMBER( namcos1_state::berabohm_buttons_r )
+u8 namcos1_state::berabohm_buttons_r(offs_t offset)
{
int res;
@@ -987,16 +896,13 @@ READ8_MEMBER( namcos1_state::berabohm_buttons_r )
{
int inp = m_input_count;
- if (inp == 4) res = ioport("CONTROL0")->read();
+ if (inp == 4) res = m_io_control[0]->read();
else
{
- char portname[40];
-
#ifdef PRESSURE_SENSITIVE
static int counter[4];
- sprintf(portname,"IN%d",inp); /* IN0-IN3 */
- res = ioport(portname)->read();
+ res = m_io_in[inp]->read(); /* IN0-IN3 */
if (res & 0x80)
{
if (counter[inp] >= 0)
@@ -1019,8 +925,7 @@ READ8_MEMBER( namcos1_state::berabohm_buttons_r )
else
counter[inp] = -1;
#else
- sprintf(portname,"IN%d",inp); /* IN0-IN3 */
- res = ioport(portname)->read();
+ res = m_io_in[inp]->read(); /* IN0-IN3 */
if (res & 1) res = 0x7f; /* weak */
else if (res & 2) res = 0x48; /* medium */
else if (res & 4) res = 0x40; /* strong */
@@ -1031,7 +936,7 @@ READ8_MEMBER( namcos1_state::berabohm_buttons_r )
}
else
{
- res = ioport("CONTROL1")->read() & 0x8f;
+ res = m_io_control[1]->read() & 0x8f;
/* the strobe cannot happen too often, otherwise the MCU will waste too
much time reading the inputs and won't have enough cycles to play two
@@ -1059,7 +964,7 @@ void namcos1_state::init_berabohm()
m_strobe = 0;
m_strobe_count = 0;
driver_init();
- m_mcu->space(AS_PROGRAM).install_read_handler(0x1400, 0x1401, read8_delegate(FUNC(namcos1_state::berabohm_buttons_r), this));
+ m_mcu->space(AS_PROGRAM).install_read_handler(0x1400, 0x1401, read8sm_delegate(FUNC(namcos1_state::berabohm_buttons_r), this));
save_item(NAME(m_input_count));
save_item(NAME(m_strobe));
save_item(NAME(m_strobe_count));
@@ -1073,19 +978,19 @@ void namcos1_state::init_berabohm()
// used by faceoff and tankforce 4 player (input multiplex)
-READ8_MEMBER( namcos1_state::faceoff_inputs_r )
+u8 namcos1_state::faceoff_inputs_r(offs_t offset)
{
int res;
if (offset == 0)
{
- res = (ioport("CONTROL0")->read() & 0x80) | m_stored_input[0];
+ res = (m_io_control[0]->read() & 0x80) | m_stored_input[0];
return res;
}
else
{
- res = ioport("CONTROL1")->read() & 0x80;
+ res = m_io_control[1]->read() & 0x80;
/* the strobe cannot happen too often, otherwise the MCU will waste too
much time reading the inputs and won't have enough cycles to play two
@@ -1100,17 +1005,17 @@ READ8_MEMBER( namcos1_state::faceoff_inputs_r )
switch (m_input_count)
{
case 0:
- m_stored_input[0] = ioport("IN0")->read() & 0x1f;
- m_stored_input[1] = (ioport("IN3")->read() & 0x07) << 3;
+ m_stored_input[0] = m_io_in[0]->read() & 0x1f;
+ m_stored_input[1] = (m_io_in[3]->read() & 0x07) << 3;
break;
case 3:
- m_stored_input[0] = ioport("IN2")->read() & 0x1f;
+ m_stored_input[0] = m_io_in[2]->read() & 0x1f;
break;
case 4:
- m_stored_input[0] = ioport("IN1")->read() & 0x1f;
- m_stored_input[1] = ioport("IN3")->read() & 0x18;
+ m_stored_input[0] = m_io_in[1]->read() & 0x1f;
+ m_stored_input[1] = m_io_in[3]->read() & 0x18;
break;
default:
@@ -1138,7 +1043,7 @@ void namcos1_state::init_faceoff()
m_stored_input[1] = 0;
driver_init();
- m_mcu->space(AS_PROGRAM).install_read_handler(0x1400, 0x1401, read8_delegate(FUNC(namcos1_state::faceoff_inputs_r), this));
+ m_mcu->space(AS_PROGRAM).install_read_handler(0x1400, 0x1401, read8sm_delegate(FUNC(namcos1_state::faceoff_inputs_r), this));
save_item(NAME(m_input_count));
save_item(NAME(m_stored_input));
}
diff --git a/src/mame/machine/nb1412m2.cpp b/src/mame/machine/nb1412m2.cpp
index 9370a32f54f..f0216b886ff 100644
--- a/src/mame/machine/nb1412m2.cpp
+++ b/src/mame/machine/nb1412m2.cpp
@@ -126,7 +126,7 @@ void nb1412m2_device::nb1412m2_map(address_map &map)
nb1412m2_device::nb1412m2_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
: device_t(mconfig, NB1412M2, tag, owner, clock)
, device_memory_interface(mconfig, *this)
- , m_space_config("regs", ENDIANNESS_LITTLE, 8, 8, 0, address_map_constructor(), address_map_constructor(FUNC(nb1412m2_device::nb1412m2_map), this))
+ , m_space_config("regs", ENDIANNESS_LITTLE, 8, 8, 0, address_map_constructor(FUNC(nb1412m2_device::nb1412m2_map), this))
, m_data(*this, DEVICE_SELF)
, m_dac_cb(*this)
{
diff --git a/src/mame/machine/nes.cpp b/src/mame/machine/nes.cpp
index 9adc870ed8e..7b15384293e 100644
--- a/src/mame/machine/nes.cpp
+++ b/src/mame/machine/nes.cpp
@@ -55,18 +55,18 @@ void nes_state::machine_start()
if (m_cartslot && m_cartslot->m_cart)
{
// Set up memory handlers
- space.install_read_handler(0x4100, 0x5fff, read8_delegate(FUNC(nes_cart_slot_device::read_l), (nes_cart_slot_device *)m_cartslot));
- space.install_write_handler(0x4100, 0x5fff, write8_delegate(FUNC(nes_cart_slot_device::write_l), (nes_cart_slot_device *)m_cartslot));
- space.install_read_handler(0x6000, 0x7fff, read8_delegate(FUNC(nes_cart_slot_device::read_m), (nes_cart_slot_device *)m_cartslot));
- space.install_write_handler(0x6000, 0x7fff, write8_delegate(FUNC(nes_cart_slot_device::write_m), (nes_cart_slot_device *)m_cartslot));
+ space.install_read_handler(0x4100, 0x5fff, read8sm_delegate(FUNC(nes_cart_slot_device::read_l), (nes_cart_slot_device *)m_cartslot));
+ space.install_write_handler(0x4100, 0x5fff, write8sm_delegate(FUNC(nes_cart_slot_device::write_l), (nes_cart_slot_device *)m_cartslot));
+ space.install_read_handler(0x6000, 0x7fff, read8sm_delegate(FUNC(nes_cart_slot_device::read_m), (nes_cart_slot_device *)m_cartslot));
+ space.install_write_handler(0x6000, 0x7fff, write8sm_delegate(FUNC(nes_cart_slot_device::write_m), (nes_cart_slot_device *)m_cartslot));
space.install_read_bank(0x8000, 0x9fff, "prg0");
space.install_read_bank(0xa000, 0xbfff, "prg1");
space.install_read_bank(0xc000, 0xdfff, "prg2");
space.install_read_bank(0xe000, 0xffff, "prg3");
- space.install_write_handler(0x8000, 0xffff, write8_delegate(FUNC(nes_cart_slot_device::write_h), (nes_cart_slot_device *)m_cartslot));
+ space.install_write_handler(0x8000, 0xffff, write8sm_delegate(FUNC(nes_cart_slot_device::write_h), (nes_cart_slot_device *)m_cartslot));
- m_ppu->space(AS_PROGRAM).install_readwrite_handler(0, 0x1fff, read8_delegate(FUNC(device_nes_cart_interface::chr_r),m_cartslot->m_cart), write8_delegate(FUNC(device_nes_cart_interface::chr_w),m_cartslot->m_cart));
- m_ppu->space(AS_PROGRAM).install_readwrite_handler(0x2000, 0x3eff, read8_delegate(FUNC(device_nes_cart_interface::nt_r),m_cartslot->m_cart), write8_delegate(FUNC(device_nes_cart_interface::nt_w),m_cartslot->m_cart));
+ m_ppu->space(AS_PROGRAM).install_readwrite_handler(0, 0x1fff, read8sm_delegate(FUNC(device_nes_cart_interface::chr_r),m_cartslot->m_cart), write8sm_delegate(FUNC(device_nes_cart_interface::chr_w),m_cartslot->m_cart));
+ m_ppu->space(AS_PROGRAM).install_readwrite_handler(0x2000, 0x3eff, read8sm_delegate(FUNC(device_nes_cart_interface::nt_r),m_cartslot->m_cart), write8sm_delegate(FUNC(device_nes_cart_interface::nt_w),m_cartslot->m_cart));
m_ppu->set_scanline_callback(ppu2c0x_device::scanline_delegate(FUNC(device_nes_cart_interface::scanline_irq),m_cartslot->m_cart));
m_ppu->set_hblank_callback(ppu2c0x_device::hblank_delegate(FUNC(device_nes_cart_interface::hblank_irq),m_cartslot->m_cart));
m_ppu->set_latch(ppu2c0x_device::latch_delegate(FUNC(device_nes_cart_interface::ppu_latch),m_cartslot->m_cart));
@@ -82,20 +82,20 @@ void nes_state::machine_start()
|| m_cartslot->get_pcb_id() == BMC_70IN1 || m_cartslot->get_pcb_id() == BMC_800IN1)
{
logerror("read_h installed!\n");
- space.install_read_handler(0x8000, 0xffff, read8_delegate(FUNC(nes_cart_slot_device::read_h), (nes_cart_slot_device *)m_cartslot));
+ space.install_read_handler(0x8000, 0xffff, read8sm_delegate(FUNC(nes_cart_slot_device::read_h), (nes_cart_slot_device *)m_cartslot));
}
if (m_cartslot->get_pcb_id() == BTL_SMB2JB || m_cartslot->get_pcb_id() == UNL_AC08 || m_cartslot->get_pcb_id() == UNL_SMB2J || m_cartslot->get_pcb_id() == BTL_09034A)
{
logerror("write_ex installed!\n");
- space.install_write_handler(0x4020, 0x40ff, write8_delegate(FUNC(nes_cart_slot_device::write_ex), (nes_cart_slot_device *)m_cartslot));
+ space.install_write_handler(0x4020, 0x40ff, write8sm_delegate(FUNC(nes_cart_slot_device::write_ex), (nes_cart_slot_device *)m_cartslot));
}
if (m_cartslot->get_pcb_id() == KAISER_KS7017 || m_cartslot->get_pcb_id() == UNL_603_5052 || m_cartslot->get_pcb_id() == STD_DISKSYS)
{
logerror("write_ex & read_ex installed!\n");
- space.install_read_handler(0x4020, 0x40ff, read8_delegate(FUNC(nes_cart_slot_device::read_ex), (nes_cart_slot_device *)m_cartslot));
- space.install_write_handler(0x4020, 0x40ff, write8_delegate(FUNC(nes_cart_slot_device::write_ex), (nes_cart_slot_device *)m_cartslot));
+ space.install_read_handler(0x4020, 0x40ff, read8sm_delegate(FUNC(nes_cart_slot_device::read_ex), (nes_cart_slot_device *)m_cartslot));
+ space.install_write_handler(0x4020, 0x40ff, write8sm_delegate(FUNC(nes_cart_slot_device::write_ex), (nes_cart_slot_device *)m_cartslot));
}
m_cartslot->pcb_start(m_ciram.get());
diff --git a/src/mame/machine/nl_breakout.cpp b/src/mame/machine/nl_breakout.cpp
index 87426734036..1a19b119b61 100644
--- a/src/mame/machine/nl_breakout.cpp
+++ b/src/mame/machine/nl_breakout.cpp
@@ -181,9 +181,11 @@ CIRCUIT_LAYOUT( breakout )
DIODE(CR5, "1N914")
DIODE(CR7, "1N914")
- QBJT_EB(Q1, "2N3644")
- QBJT_EB(Q2, "2N3643")
- QBJT_EB(Q3, "2N3643")
+ // No need to model capacitance
+ QBJT_EB(Q1, "2N3644(CJC=0 CJE=0)")
+ QBJT_EB(Q2, "2N3643(CJC=0 CJE=0)")
+ QBJT_EB(Q3, "2N3643(CJC=0 CJE=0)")
+
CAP(C19, CAP_U(0.1))
CAP(C16, CAP_U(0.1))
@@ -1702,22 +1704,19 @@ CIRCUIT_LAYOUT( breakout )
NET_C(GND, D9.1, D9.2, D9.13, D9.3, D9.4, D9.5)
- HINT(A3.1.sub, NO_DEACTIVATE)
+#if 1
+ // 163% -- manually optimized
HINT(B6.s3, NO_DEACTIVATE)
HINT(C4.s3, NO_DEACTIVATE)
HINT(C4.s4, NO_DEACTIVATE)
HINT(C5.s3, NO_DEACTIVATE)
HINT(C5.s4, NO_DEACTIVATE)
- HINT(D3.2.sub, NO_DEACTIVATE)
HINT(E2.s2, NO_DEACTIVATE)
HINT(E3.s2, NO_DEACTIVATE)
HINT(E5.s4, NO_DEACTIVATE)
- HINT(E8.2.sub, NO_DEACTIVATE)
HINT(E9.s6, NO_DEACTIVATE)
- HINT(F5.2.sub, NO_DEACTIVATE)
HINT(H2.s1, NO_DEACTIVATE)
HINT(H3.s1, NO_DEACTIVATE)
- HINT(H6.sub, NO_DEACTIVATE)
HINT(J3.s4, NO_DEACTIVATE)
HINT(J5, NO_DEACTIVATE)
HINT(J6.sub, NO_DEACTIVATE)
@@ -1729,9 +1728,45 @@ CIRCUIT_LAYOUT( breakout )
HINT(M4.s2, NO_DEACTIVATE)
HINT(M6.sub, NO_DEACTIVATE)
HINT(M8.s1, NO_DEACTIVATE)
- HINT(N6.sub, NO_DEACTIVATE)
HINT(N7.s3, NO_DEACTIVATE)
+#else
+ // 167% hints provided by log output - manually optimized
+ HINT(M4.s2, NO_DEACTIVATE) // 29.001761 197676 6816
+ HINT(M3.s3, NO_DEACTIVATE) // inf 129571 0
+ HINT(N7.s3, NO_DEACTIVATE) // inf 7850387 0 xx
+ HINT(M3.s2, NO_DEACTIVATE) // 23.234535 395870 17038
+ HINT(M3.s1, NO_DEACTIVATE) // 14.500880 197676 13632
+ HINT(L7.s3, NO_DEACTIVATE) // 122672.000000 122672 1
+ HINT(L7.s2, NO_DEACTIVATE) // 122672.000000 122672 1
+ HINT(K7.s4, NO_DEACTIVATE) // 122673.000000 122673 1
+ HINT(K7.s3, NO_DEACTIVATE) // 122672.000000 122672 1
+ HINT(K7.s2, NO_DEACTIVATE) // 122673.000000 122673 1
+ HINT(K7.s1, NO_DEACTIVATE) // 122673.000000 122673 1
+ HINT(K4.s4, NO_DEACTIVATE) // 1438.774735 4202661 2921 xx
+ HINT(K4.s2, NO_DEACTIVATE) // 3.939380 847790 215209 xx
+ HINT(E2.s2, NO_DEACTIVATE) // 108.050000 315506 2920 xx
+ HINT(L7.s4, NO_DEACTIVATE) // 122672.000000 122672 1
+ HINT(E9.s6, NO_DEACTIVATE) // inf 129571 0
+ //HINT(J2.s6, NO_DEACTIVATE) // 493.408951 959187 1944
+ HINT(C5.s3, NO_DEACTIVATE) // inf 195514 0
+ HINT(M3.s4, NO_DEACTIVATE) // 27.744898 418726 15092 xx
+ HINT(J8.s1, NO_DEACTIVATE) // 40890.000000 122670 3
+ HINT(E3.s2, NO_DEACTIVATE) // 203581.000000 203581 1
+ HINT(M9.s4, NO_DEACTIVATE) // inf 323268 0
+ //HINT(L4.s2, NO_DEACTIVATE) // 7.290053 1192536 163584
+ HINT(J3.s4, NO_DEACTIVATE) // 393.639951 957726 2433 xx
+ HINT(L7.s1, NO_DEACTIVATE) // inf 122672 0
+ HINT(F2.s1, NO_DEACTIVATE) // 286289.000000 286289 1
+ HINT(M8.s1, NO_DEACTIVATE) // 129571.000000 129571 1
+ HINT(J7.s2, NO_DEACTIVATE) // inf 122672 0
+ //HINT(H2.s1, NO_DEACTIVATE) // 393.839704 958212 2433
+ HINT(H3.s1, NO_DEACTIVATE) // 3.932473 850122 216180 xx
+ HINT(J2.s5, NO_DEACTIVATE) // 26.140344 203581 7788
+ HINT(J7.s1, NO_DEACTIVATE) // inf 122672 0
+ HINT(J8.s3, NO_DEACTIVATE) // 40890.000000 122670 3
+#endif
+
CIRCUIT_LAYOUT_END
/*
diff --git a/src/mame/machine/nl_palestra.cpp b/src/mame/machine/nl_palestra.cpp
new file mode 100644
index 00000000000..4048a599d23
--- /dev/null
+++ b/src/mame/machine/nl_palestra.cpp
@@ -0,0 +1,710 @@
+// license:BSD-3-Clause
+// copyright-holders:Sergey Svishchev
+
+/***************************************************************************
+
+ Netlist (palestra) to be included from palestra.cpp
+
+ https://www.mobygames.com/game/dedicated-console/palestra-02
+ database entry
+ http://www.ccjvq.com/slydc/palestra02.rar
+ schematics
+ http://discreteconsoles.blogspot.com/2015/10/emulation-of-ay-3-8500-1-and-clones-soon.html
+ photos
+ https://www.youtube.com/watch?v=3XZxkTvOF4Y
+ gameplay video
+
+ To do:
+ - write 74H53 device
+ - trace the boards (schematic contains several errors)
+ - hook up inputs
+
+***************************************************************************/
+
+#ifndef __PLIB_PREPROCESSOR__
+ #define NL_PROHIBIT_BASEH_INCLUDE 1
+ #include "netlist/devices/net_lib.h"
+#endif
+
+#define SLOW_BUT_ACCURATE 0
+
+NETLIST_START(palestra)
+
+// SOLVER(Solver, 10000000) to maintain accuracy when SLOW is set and CAP()s are connected
+ SOLVER(Solver, 50000)
+// PARAM(Solver.PARALLEL, 0) // Don't do parallel solvers
+ PARAM(Solver.ACCURACY, 1e-5) // ???
+// PARAM(Solver.LTE, 1e-4) // Default is not enough for paddle control if using LTE
+ PARAM(NETLIST.USE_DEACTIVATE, 1)
+
+ ANALOG_INPUT(V5, 5)
+
+ TTL_INPUT(high, 1)
+ TTL_INPUT(low, 0)
+
+/*
+ * board A2 -- score display
+ */
+
+ TTL_7410_NAND(A2D1_1, N0X3, N1X4, N0X5)
+ TTL_7410_NAND(A2D1_2, A2D1_1.Q, A2D1_1.Q, A2D1_1.Q)
+
+ TTL_7410_NAND(A2D1_3, N1X3, N0X4, N0X5)
+ TTL_7400_NAND(A2D9_1, A2D1_3.Q, A2D1_3.Q)
+ TTL_7400_NAND(A2D9_2, P_EX, a2x28)
+ TTL_7400_NAND(A2D9_3, A2D9_2.Q, A2D9_2.Q)
+
+ TTL_7410_NAND(A2D2_1, N1X3, N1X4, N0X5)
+ TTL_7410_NAND(A2D2_2, N0X3, N0X4, N1X5)
+ TTL_7410_NAND(A2D2_3, N1X3, N0X4, N1X5)
+ TTL_7410_NAND(A2D10_1, A2D2_1.Q, A2D2_2.Q, A2D2_3.Q)
+ TTL_7400_NAND(A2D9_4, A2D2_2.Q, A2D2_2.Q)
+
+ TTL_7410_NAND(A2D3_1, N1Y3, N1Y4, N0Y5)
+ TTL_7410_NAND(A2D3_2, N0Y3, N0Y4, N1Y5)
+ TTL_7410_NAND(A2D4_1, N1Y3, N0Y4, N1Y5)
+ TTL_7410_NAND(A2D4_2, N0Y3, N1Y4, N1Y5)
+ TTL_7410_NAND(A2D4_3, N1Y3, N1Y4, N1Y5)
+ TTL_7400_NAND(A2D11_1, A2D3_1.Q, A2D3_1.Q)
+ TTL_7400_NAND(A2D11_2, A2D4_1.Q, A2D4_1.Q)
+ TTL_7400_NAND(A2D11_3, A2D4_3.Q, A2D4_3.Q)
+ TTL_7400_NAND(A2D11_4, A2D2_1.Q, A2D2_1.Q)
+ TTL_7400_NAND(A2D12_1, A2D2_3.Q, A2D2_3.Q)
+ TTL_7400_NAND(A2D12_2, A2D4_2.Q, A2D4_3.Q)
+ TTL_7410_NAND(A2D3_3, A2D4_1.Q, A2D3_1.Q, A2D3_2.Q)
+
+ // player 1 score counter
+ TTL_7493(A2D5, SCORE1, A2D5.QA, A2D8_2.Q, A2D8_2.Q)
+ TTL_7400_NAND(A2D8_1, A2D5.QD, A2D5.QB)
+ TTL_7400_NAND(A2D8_2, A2D8_1.Q, RESET)
+ TTL_7474(A2D6_1, A2D8_2.Q, A2D6_1.QQ, high, RESET)
+
+ // player 2 score counter
+ TTL_7493(A2D7, SCORE2, A2D7.QA, A2D8_4.Q, A2D8_4.Q)
+ TTL_7400_NAND(A2D8_3, A2D7.QD, A2D7.QB)
+ TTL_7400_NAND(A2D8_4, A2D8_3.Q, RESET)
+ TTL_7474(A2D6_2, A2D8_4.Q, A2D6_2.QQ, high, RESET)
+
+ TTL_7450_ANDORINVERT(A2D13_1, a2x3, N0X6, a2x4, N1X6)
+ TTL_7450_ANDORINVERT(A2D13_2, a2x5, N0X6, a2x6, N1X6)
+ TTL_7450_ANDORINVERT(A2D14_1, a2x7, N0X6, a2x8, N1X6)
+ TTL_7450_ANDORINVERT(A2D14_2, a2x10, N0X6, a2x9, N1X6)
+ TTL_7450_ANDORINVERT(A2D15_1, A2D6_1.Q, N0X6, A2D6_2.Q, N1X6)
+// NET_C(A2D17_1.A, a2x21) // XXX typo in schematics?
+
+ TTL_7400_NAND(A2D16_1, A2D13_1.Q, A2D13_1.Q)
+ TTL_7400_NAND(A2D16_2, A2D13_2.Q, A2D13_2.Q)
+ TTL_7400_NAND(A2D16_3, A2D14_1.Q, A2D14_1.Q)
+ TTL_7400_NAND(A2D16_4, A2D14_2.Q, A2D14_2.Q)
+
+ TTL_7420_NAND(A2D17_1, A2D13_1.Q, A2D13_2.Q, A2D14_1.Q, A2D14_2.Q)
+ TTL_7420_NAND(A2D17_2, A2D13_2.Q, A2D14_1.Q, a2x17, A2D14_2.Q)
+ TTL_7420_NAND(A2D18_1, A2D13_1.Q, A2D14_1.Q, A2D14_2.Q, a2x18)
+ TTL_7420_NAND(A2D18_2, a2x17, A2D14_1.Q, a2x18, A2D14_2.Q)
+ TTL_7410_NAND(A2D19_1, A2D13_1.Q, a2x19, A2D13_2.Q)
+ TTL_7410_NAND(A2D19_2, a2x17, A2D13_2.Q, a2x19)
+ TTL_7410_NAND(A2D19_3, A2D13_1.Q, a2x18, a2x19)
+ TTL_7410_NAND(A2D10_2, a2x19, a2x18, a2x17)
+ TTL_7400_NAND(A2D12_4, a2x17, a2x20)
+
+//
+
+ TTL_7450_ANDORINVERT(A2D15_2, a2x16, A2D9_3.Q, A2D9_3.Q, a2x15)
+ TTL_7420_NAND(A2D20_1, a2x11, a2x12, a2x22, a2x25)
+ TTL_7410_NAND(A2D21_1, a2x11, a2x22, a2x29)
+ TTL_7400_NAND(A2D12_3, A2D21_1.Q, A2D21_1.Q)
+ TTL_7410_NAND(A2D21_2, A2D12_3.Q, a2x13, a2x21)
+ TTL_7410_NAND(A2D21_3, A2D12_3.Q, a2x14, a2x25)
+ TTL_7430_NAND(A2D22, a2x15, a2x22, a2x23, a2x24, a2x29, P_CX, P_CX, P_CX)
+ TTL_7420_NAND(A2D20_2, a2x15, P_AX, a2x26, a2x27)
+ TTL_7430_NAND(A2D23, P_CX, a2x16, a2x22, a2x24, a2x25, a2x26, a2x29, a2x30)
+ TTL_7410_NAND(A2D10_3, P_AX, a2x16, a2x23)
+ TTL_7430_NAND(A2D24, A2D15_2.Q, A2D20_1.Q, A2D21_2.Q, A2D21_3.Q, A2D22.Q, A2D20_2.Q, A2D23.Q, A2D10_3.Q)
+
+ TTL_7400_NAND(A2D25_1, a2x26, a2x26)
+ TTL_7400_NAND(A2D25_2, A2D25_1.Q, a2x28)
+#if 1
+ CAP(A2Cx, CAP_P(11)) // XXX value not specified
+ NET_C(a2x28, A2Cx.1)
+ NET_C(A2Cx.2, A2D25_2.Q)
+#endif
+
+ // inputs
+ ALIAS(RESET, N1X7)
+
+ // outputs
+ ALIAS(P_CYRG_X, A2D1_2.Q)
+ ALIAS(P_CYRD_X, A2D9_1.Q)
+ ALIAS(P_CYRW_X, A2D11_4.Q)
+ ALIAS(P_CYRB_X, A2D9_4.Q)
+ ALIAS(P_CYRA_X, A2D12_1.Q)
+ ALIAS(P_AX, P_CYRA_X)
+ ALIAS(P_BX, P_CYRB_X)
+ ALIAS(P_CX, P_CYRW_X)
+ ALIAS(P_DX, P_CYRG_X)
+ ALIAS(P_EX, P_CYRD_X)
+ ALIAS(GAME_OVER, A2D25_2.Q)
+ ALIAS(SCORE_OUT, A2D24.Q)
+
+ // test points
+ ALIAS(a2x3, A2D5.QA)
+ ALIAS(a2x4, A2D7.QA)
+ ALIAS(a2x5, A2D5.QB)
+ ALIAS(a2x6, A2D7.QB)
+ ALIAS(a2x7, A2D5.QC)
+ ALIAS(a2x8, A2D7.QC)
+ ALIAS(a2x9, A2D7.QD)
+ ALIAS(a2x10, A2D5.QD)
+ ALIAS(a2x11, A2D10_1.Q)
+ ALIAS(a2x12, A2D11_1.Q)
+ ALIAS(a2x13, A2D11_2.Q)
+ ALIAS(a2x14, A2D11_3.Q)
+ ALIAS(a2x15, A2D3_3.Q)
+ ALIAS(a2x16, A2D12_2.Q)
+ ALIAS(a2x17, A2D16_1.Q)
+ ALIAS(a2x18, A2D16_2.Q)
+ ALIAS(a2x19, A2D16_3.Q)
+ ALIAS(a2x20, A2D16_4.Q)
+ ALIAS(a2x21, A2D17_1.Q)
+ ALIAS(a2x22, A2D17_2.Q)
+ ALIAS(a2x23, A2D18_1.Q)
+ ALIAS(a2x24, A2D18_2.Q)
+ ALIAS(a2x25, A2D19_1.Q)
+ ALIAS(a2x26, A2D19_2.Q)
+ ALIAS(a2x27, A2D19_3.Q)
+ ALIAS(a2x28, A2D15_1.Q)
+ ALIAS(a2x29, A2D10_2.Q)
+ ALIAS(a2x30, A2D12_4.Q)
+
+/*
+ * board A3 -- sync generator
+ */
+
+#if SLOW_BUT_ACCURATE
+ TTL_7400_NAND(A3D1_3, A3D5.QA, A3D5.QA)
+ TTL_7400_NAND(A3D1_4, A3D1_3.Q, A3D2_1.Q)
+#else
+ TTL_7400_NAND(A3D1_4, N0X1, A3D2_1.Q)
+#endif
+ TTL_7420_NAND(A3D2_1, MOVE_LEFT, STOP_BALL, P_SPEED_X, GAME_OVER)
+ TTL_7420_NAND(A3D2_2, MOVE_RIGHT, GAME_OVER, P_SPEED_X, STOP_BALL)
+
+ // CLK1, CLK2, R1, R2 [14, 1, 2, 3]
+#if SLOW_BUT_ACCURATE
+ TTL_7493(A3D5, clk, A3D5.QA, A3D1_4.Q, a3x3)
+#else
+ TTL_7493(A3D5, low, N1X1, A3D1_4.Q, a3x3)
+#endif
+ TTL_7493(A3D6, A3D5.QD, A3D6.QA, A3D1_4.Q, a3x3)
+ TTL_7400_NAND(A3D4_3, A3D5.QB, A3D5.QB)
+ TTL_7400_NAND(A3D4_4, A3D5.QC, A3D5.QC)
+ TTL_7400_NAND(A3D12_3, A3D4_3.Q, A3D4_4.Q)
+ TTL_7430_NAND(A3D15, A3D12_3.Q, A3D12_3.Q, A3D5.QD, A3D6.QA, A3D6.QB, A3D6.QC, A3D6.QD, P_MY)
+ TTL_7430_NAND(A3D16, A3D5.QD, A3D6.QA, A3D6.QB, A3D6.QC, A3D6.QD, A3D5.QC, A3D5.QB, A3D2_2.Q)
+ TTL_7400_NAND(A3D12_4, N_M, N_M)
+ TTL_7400_NAND(A3D17_1, N_M, N_M)
+ TTL_7400_NAND(A3D20_1, A3D16.Q, A3D16.Q)
+
+ TTL_7400_NAND(A3D1_1, MOVE_UP, P_SPEED_Y)
+ TTL_7400_NAND(A3D1_2, P_SPEED_Y, MOVE_DOWN)
+ TTL_7400_NAND(A3D4_1, N0X8, A3D1_1.Q)
+ TTL_7410_NAND(A3D7_1, N1X7, A3D4_1.Q, A3D1_2.Q)
+ // CLK, D, CLRQ, PREQ [3, 2, 1, 4]
+ TTL_7474(A3D8_1, A3D7_1.Q, A3D8_1.QQ, high, high)
+ // CLK1, CLK2, R1, R2 [14, 1, 2, 3]
+ TTL_7493(A3D13, A3D8_1.Q, A3D13.QA, a3x4, low) //A3D14.QD) XXX
+ TTL_7493(A3D14, A3D13.QD, A3D14.QA, a3x4, low) //A3D14.QD) XXX
+ TTL_7410_NAND(A3D7_2, A3D13.QC, A3D14.QA, A3D13.QD)
+ TTL_7400_NAND(A3D26_4, A3D7_2.Q, A3D7_2.Q)
+ TTL_7420_NAND(A3D3_2, A3D13.QB, A3D14.QB, a3x4, A3D14.QC)
+ TTL_7400_NAND(A3D20_2, A3D3_2.Q, A3D3_2.Q)
+
+ // outputs
+ ALIAS(N_M, A3D15.Q)
+ ALIAS(P_M1, A3D12_4.Q)
+ ALIAS(P_M2, A3D17_1.Q)
+ ALIAS(P_MY, A3D20_2.Q)
+
+ // test points
+ ALIAS(a3x3, A3D20_1.Q)
+ ALIAS(a3x4, A3D26_4.Q)
+
+// hsync
+
+#if SLOW_BUT_ACCURATE
+ MAINCLOCK(clk, 4000000.0)
+
+#if 1
+ CAP(A3C5, CAP_P(200))
+ NET_C(clk, A3C5.1)
+ NET_C(N1X1, A3C5.2)
+// NET_C(A3C5.2, A3D21.CLKB)
+#endif
+
+ // CLK1, CLK2, R1, R2 [14, 1, 2, 3]
+ TTL_7493(A3D21, clk, N1X1, a3x6, a3x6)
+ TTL_7493(A3D22, N1X4, N1X5, a3x6, a3x6)
+ TTL_7400_NAND(A3D20_3, N1X1, N1X1)
+ TTL_7400_NAND(A3D25_2, N1X2, N1X2)
+ TTL_7400_NAND(A3D20_4, N1X3, N1X3)
+ TTL_7400_NAND(A3D25_3, N1X4, N1X4)
+ TTL_7400_NAND(A3D23_1, N1X5, N1X5)
+ TTL_7400_NAND(A3D25_4, N1X6a, N1X6a)
+ TTL_7400_NAND(A3D23_2, N1X6a, N1X6a)
+ TTL_7400_NAND(A3D26_1, N0X6b, N0X6b)
+ TTL_7400_NAND(A3D23_3, N1X7a, N1X7a)
+ TTL_7400_NAND(A3D26_2, N0X7, N0X7)
+ TTL_7400_NAND(A3D23_4, N1X8, N1X8)
+ TTL_7430_NAND(A3D24, N1X1, N1X2, N1X3, N1X4, N1X5, N1X6a, N1X7a, N1X8)
+ TTL_7400_NAND(A3D25_1, A3D24.Q, A3D24.Q)
+#else
+ ALIAS(clk, low)
+ CLOCK(N1X1, 2000000.0)
+ CLOCK(N1X2, 1000000.0)
+ CLOCK(N1X3, 500000.0)
+ CLOCK(N1X4, 250000.0)
+ CLOCK(N1X5, 125000.0)
+ CLOCK(N1X6a, 62500.0)
+ CLOCK(N1X7a, 31250.0)
+ CLOCK(N1X8, 15625.0)
+ ALIAS(N1X6b, N1X6a)
+ ALIAS(N1X7b, N1X7a)
+ EXTCLOCK(N0X1, 2000000.0, "1,1")
+ EXTCLOCK(N0X2, 1000000.0, "1,1")
+ EXTCLOCK(N0X3, 500000.0, "1,1")
+ EXTCLOCK(N0X4, 250000.0, "1,1")
+ EXTCLOCK(N0X5, 125000.0, "1,1")
+ EXTCLOCK(N0X6a, 62500.0, "1,1")
+ EXTCLOCK(N0X7, 31250.0, "1,1")
+ EXTCLOCK(N0X8, 15625.0, "1,1")
+ PARAM(N0X1.OFFSET, -2.5e-7)
+ PARAM(N0X2.OFFSET, -5e-7)
+ PARAM(N0X3.OFFSET, -1e-6)
+ PARAM(N0X4.OFFSET, -2e-6)
+ PARAM(N0X5.OFFSET, -4e-6)
+ PARAM(N0X6a.OFFSET, -8e-6)
+ PARAM(N0X7.OFFSET, -1.6e-5)
+ PARAM(N0X8.OFFSET, -3.2e-5)
+ ALIAS(N0X6b, N0X6a)
+#endif
+ ALIAS(N1X7, N1X7a)
+ ALIAS(N1X6, N1X6a)
+ ALIAS(N0X6, N0X6a)
+ TTL_7420_NAND(A3D27_1, N1X5, N0X6b, N0X7, N0X8)
+ TTL_7420_NAND(A3D27_2, N1X5, N1X6a, N0X7, N0X8)
+ TTL_7400_NAND(A3D26_3, A3D27_2.Q, A3D27_2.Q)
+
+ // outputs
+#if SLOW_BUT_ACCURATE
+ ALIAS(N1X1, A3D21.QA)
+ ALIAS(N1X2, A3D21.QB)
+ ALIAS(N1X3, A3D21.QC)
+ ALIAS(N1X4, A3D21.QD)
+ ALIAS(N1X5, A3D22.QA)
+ ALIAS(N1X6a, A3D22.QB)
+ ALIAS(N1X7a, A3D22.QC)
+ ALIAS(N1X8, A3D22.QD)
+ ALIAS(N1X6b, A3D26_1.Q)
+ ALIAS(N1X7b, A3D26_2.Q)
+
+ ALIAS(N0X1, A3D20_3.Q)
+ ALIAS(N0X2, A3D25_2.Q)
+ ALIAS(N0X3, A3D20_4.Q)
+ ALIAS(N0X4, A3D25_3.Q)
+ ALIAS(N0X5, A3D23_1.Q)
+ ALIAS(N0X6a, A3D25_4.Q)
+ ALIAS(N0X6b, A3D23_2.Q)
+ ALIAS(N0X7, A3D23_3.Q)
+ ALIAS(N0X8, A3D23_4.Q)
+
+ ALIAS(a3x6, A3D25_1.Q)
+#endif
+
+ ALIAS(HSYNC, A3D27_1.Q)
+ ALIAS(STOPSOUND, A3D26_3.Q)
+
+// vsync
+
+ // CLK, D, CLRQ, PREQ [3, 2, 1, 4]
+ TTL_7474(A3D8_2, N0X8, A3D8_2.QQ, high, high)
+ // CLK1, CLK2, R1, R2 [14, 1, 2, 3]
+ TTL_7493(A3D10, A3D8_2.QQ, N1Y2, A3D12_1.Q, low) // N1Y9) XXX
+ TTL_7493(A3D11, N1Y5, N1Y6, A3D12_1.Q, low) // N1Y9) XXX
+ TTL_7400_NAND(A3D18_1, N1Y2, N1Y2)
+ TTL_7400_NAND(A3D18_2, N1Y3, N1Y3)
+ TTL_7400_NAND(A3D18_3, N1Y4, N1Y4)
+ TTL_7400_NAND(A3D18_4, N1Y5, N1Y5)
+ TTL_7400_NAND(A3D19_1, N1Y6, N1Y6)
+ TTL_7400_NAND(A3D19_2, N1Y7, N1Y7)
+ TTL_7400_NAND(A3D19_3, N1Y8, N1Y8)
+ TTL_7400_NAND(A3D19_4, N1Y9, N1Y9)
+ TTL_7410_NAND(A3D7_3, N1Y6, N1Y5, N1Y4)
+ TTL_7400_NAND(A3D12_1, A3D7_3.Q, A3D7_3.Q)
+
+ TTL_7420_NAND(A3D3_1, N0Y4, N0Y5, N1Y3, N1Y2)
+ TTL_7400_NAND(A3D4_2, A3D3_1.Q, A3D3_1.Q)
+ TTL_7430_NAND(A3D9, N0Y8, N0Y7, N0Y6, N0Y5, N0Y4, A3D3_1.Q, N0Y9, N0Y9)
+ TTL_7400_NAND(A3D12_2, N_6LINES, N_6LINES)
+
+ // outputs
+ ALIAS(N1Y1, A3D8_2.Q)
+ ALIAS(N1Y2, A3D10.QA)
+ ALIAS(N1Y3, A3D10.QB)
+ ALIAS(N1Y4, A3D10.QC)
+ ALIAS(N1Y5, A3D10.QD)
+ ALIAS(N1Y6, A3D11.QA)
+ ALIAS(N1Y7, A3D11.QB)
+ ALIAS(N1Y8, A3D11.QC)
+ ALIAS(N1Y9, A3D11.QD)
+ ALIAS(N0Y2, A3D18_1.Q)
+ ALIAS(N0Y3, A3D18_2.Q)
+ ALIAS(N0Y4, A3D18_3.Q)
+ ALIAS(N0Y5, A3D18_4.Q)
+ ALIAS(N0Y6, A3D19_1.Q)
+ ALIAS(N0Y7, A3D19_2.Q)
+ ALIAS(N0Y8, A3D19_3.Q)
+ ALIAS(N0Y9, A3D19_4.Q)
+
+ ALIAS(P_EY, A3D4_2.Q)
+ ALIAS(N_6LINES, A3D9.Q)
+ ALIAS(P_6LINES, A3D12_2.Q)
+
+ // test points
+ ALIAS(a3x5, clk)
+
+/*
+ * board A4 -- game logic
+ */
+
+// player 1
+
+ // CLK, D, CLRQ, PREQ [3, 2, 1, 4]
+ TTL_7474(A4D1_1, A4D16_2.Q, a4x3, high, high)
+ TTL_7400_NAND(A4D4_1, A4D1_2.QQ, A4D1_1.QQ)
+ TTL_7400_NAND(A4D4_2, A4D4_1.Q, A4D4_1.Q)
+ TTL_7474(A4D1_2, A4D7_2.Q, A4D1_2.Q, high, A4D1_1.QQ)
+
+ TTL_7400_NAND(A4D2_1, tbc, G_SIZE)
+ TTL_7400_NAND(A4D2_2, N1X8, A4D2_1.Q)
+ // CLK1, CLK2, R1, R2 [14, 1, 2, 3]
+ TTL_7493(A4D5, A4D2_2.Q, A4D5.QA, A4D4_1.Q, A4D4_1.Q)
+ TTL_7400_NAND(A4D7_1, A4D5.QC, A4D5.QC)
+ TTL_7400_NAND(A4D7_2, A4D5.QD, A4D5.QD)
+
+// player 2
+
+ // CLK, D, CLRQ, PREQ [3, 2, 1, 4]
+ TTL_7474(A4D3_1, A4D16_2.Q, a4x4, high, high)
+ TTL_7400_NAND(A4D4_3, A4D3_2.QQ, A4D3_1.QQ)
+ TTL_7400_NAND(A4D4_4, A4D4_3.Q, A4D4_3.Q)
+ TTL_7474(A4D3_2, A4D7_4.Q, A4D3_2.Q, high, A4D3_1.QQ)
+
+ TTL_7400_NAND(A4D2_3, tbc, G_SIZE2)
+ TTL_7400_NAND(A4D2_4, N1X8, A4D2_3.Q)
+ // CLK1, CLK2, R1, R2 [14, 1, 2, 3]
+ TTL_7493(A4D6, A4D2_4.Q, A4D6.QA, A4D4_3.Q, A4D4_3.Q)
+ TTL_7400_NAND(A4D7_3, A4D6.QC, A4D6.QC)
+ TTL_7400_NAND(A4D7_4, A4D6.QD, A4D6.QD)
+
+//
+
+ TTL_7420_NAND(A4D9_1, P_M2, P_I1, A4D7_2.Q, A4D7_1.Q)
+ TTL_7420_NAND(A4D9_2, P_M2, P_I1, A4D7_1.Q, A4D5.QC)
+ TTL_7420_NAND(A4D10_1, P_M2, P_I1, A4D5.QD, A4D7_1.Q)
+ TTL_7420_NAND(A4D10_2, P_M2, P_I1, A4D5.QC, A4D5.QD)
+
+ TTL_7420_NAND(A4D11_1, P_M2, P_I2, A4D7_4.Q, A4D7_3.Q)
+ TTL_7420_NAND(A4D11_2, P_M2, P_I2, A4D6.QC, A4D7_4.Q)
+ TTL_7420_NAND(A4D12_1, P_M2, P_I2, A4D6.QD, A4D7_3.Q)
+ TTL_7420_NAND(A4D12_2, P_M2, P_I2, A4D6.QC, A4D6.QD)
+
+ TTL_7400_NAND(A4D8_1, P_BOTTOM_BORDER, P_MY)
+ TTL_7400_NAND(A4D8_2, P_MY, P_TOP_BORDER)
+ TTL_7400_NAND(A4D8_3, P_M2, P_I)
+
+ // four RS flip-flops
+ TTL_7410_NAND(A4D13_1, a4x5, A4D11_1.Q, A4D14_1.Q)
+ TTL_7400_NAND(A4D14_1, A4D13_1.Q, A4D16_4.Q)
+ TTL_7410_NAND(A4D13_2, a4x6, a4x9, A4D14_2.Q)
+ TTL_7400_NAND(A4D14_2, A4D13_2.Q, A4D16_4.Q)
+ TTL_7410_NAND(A4D15_1, a4x7, a4x10, A4D14_3.Q)
+ TTL_7400_NAND(A4D14_3, A4D15_1.Q, A4D16_4.Q)
+ TTL_7410_NAND(A4D15_2, a4x8, a4x11, A4D14_4.Q)
+ TTL_7400_NAND(A4D14_4, A4D15_2.Q, A4D16_4.Q)
+
+ TTL_7400_NAND(A4D16_1, N0Y3, P_6LINES)
+ TTL_7400_NAND(A4D16_2, HSYNC, A4D16_1.Q)
+ TTL_7400_NAND(A4D16_3, A4D16_1.Q, A4D16_1.Q)
+ TTL_7400_NAND(A4D16_4, N0Y2, A4D16_3.Q)
+
+ // five RS flip-flops
+ TTL_7400_NAND(A4D8_4, a4x12, A4D13_3.Q)
+ TTL_7410_NAND(A4D13_3, A4D8_4.Q, A4D14_4.Q, A4D14_1.Q)
+ TTL_7400_NAND(A4D17_1, a4x12, A4D17_2.Q)
+ TTL_7400_NAND(A4D17_2, A4D17_1.Q, A4D14_2.Q)
+ TTL_7400_NAND(A4D17_3, a4x12, A4D17_4.Q)
+ TTL_7400_NAND(A4D17_4, A4D17_3.Q, A4D14_3.Q)
+ TTL_7420_NAND(A4D18_1, A4D14_1.Q, A4D14_2.Q, A4D8_1.Q, A4D18_2.Q)
+ TTL_7420_NAND(A4D18_2, A4D18_1.Q, A4D14_3.Q, A4D14_4.Q, A4D8_2.Q)
+ TTL_7400_NAND(A4D19_1, a4x12, A4D19_2.Q)
+ TTL_7400_NAND(A4D19_2, A4D19_1.Q, a4x14)
+
+// speed Y
+
+ TTL_7400_NAND(A4D24_1, A4D16_4.Q, A4D16_4.Q)
+ TTL_7400_NAND(A4D24_2, N1Y1, A4D24_1.Q)
+ TTL_7400_NAND(A4D24_3, A4D24_2.Q, P_6LINES)
+ TTL_7400_NAND(A4D24_4, A4D24_2.Q, A4D16_3.Q)
+ TTL_7400_NAND(A4D21_1, A4D17_1.Q, A4D17_4.Q)
+ TTL_7400_NAND(A4D21_2, A4D17_2.Q, A4D17_3.Q)
+ TTL_7400_NAND(A4D21_3, A4D21_1.Q, A4D21_2.Q)
+ TTL_7400_NAND(A4D21_4, A4D24_4.Q, G_ANGLE)
+ TTL_7400_NAND(A4D25_2, A4D16_4.Q, G_ANGLE)
+ TTL_7400_NAND(A4D25_3, A4D24_2.Q, G_ANGLE)
+
+ TTL_7420_NAND(A4D28_1, P_6LINES, A4D17_1.Q, A4D17_3.Q, A4D21_4.Q)
+ TTL_7420_NAND(A4D28_2, A4D16_3.Q, A4D13_3.Q, a4x13, A4D25_2.Q)
+ TTL_7420_NAND(A4D20_2, A4D24_1.Q, A4D8_4.Q, a4x13, A4D25_3.Q)
+ TTL_7410_NAND(A4D29_1, A4D28_1.Q, A4D28_2.Q, A4D20_2.Q)
+
+// speed X
+
+ // CLK1, CLK2, R1, R2 [14, 1, 2, 3]
+ TTL_7493(A4D31, SOUND_GATE, A4D31.QA, SOUND_GATE, SOUND_GATE)
+ TTL_7400_NAND(A4D30_3, A4D31.QB, A4D31.QB)
+ TTL_7400_NAND(A4D30_4, A4D31.QD, A4D31.QD)
+ TTL_7410_NAND(A4D29_3, A4D31.QC, A4D31.QB, A4D31.QD)
+
+ TTL_7400_NAND(A4D25_1, A4D30_4.Q, G_SPEED_AUTO)
+ TTL_7400_NAND(A4D25_4, G_SPEED_3, A4D25_1.Q)
+ TTL_7400_NAND(A4D27_1, A4D30_3.Q, G_SPEED_AUTO)
+ TTL_7400_NAND(A4D27_3, A4D27_1.Q, G_SPEED_4)
+ TTL_7400_NAND(A4D27_4, A4D29_3.Q, G_SPEED_4)
+// TTL_74H53_AND_OR_INVERT(A4D32, tbc, tbc, A4D24_3.Q, A4D27_3.Q, A4D16_1.Q, A4D25_4.Q, A4D16_4.Q, A4D27_4.Q, G_SPEED_1)
+
+// sound
+
+ // CLK, D, CLRQ, PREQ [3, 2, 1, 4]
+ TTL_7474(A4D22_1, N1Y5, A4D22_1.QQ, high, A4D19_1.Q)
+ TTL_7474(A4D22_2, A4D22_1.Q, A4D22_2.QQ, high, A4D19_1.Q)
+ TTL_7400_NAND(A4D19_3, A4D22_2.QQ, A4D22_1.QQ)
+
+ TTL_7420_NAND(A4D20_1, A4D8_2.Q, A4D8_1.Q, REFLECT_LEFT, REFLECT_RIGHT)
+ TTL_7410_NAND(A4D15_3, A4D20_1.Q, A4D20_1.Q, A4D20_1.Q)
+ TTL_7474(A4D23_1, low, low, A4D15_3.Q, A4D27_2.Q)
+ TTL_7474(A4D23_2, N1Y5, A4D23_2.QQ, high, SOUND_GATE)
+ TTL_7474(A4D26_1, N1Y5, A4D23_1.QQ, high, A4D26_1.QQ)
+ TTL_7474(A4D26_2, A4D26_1.Q, A4D26_2.QQ, high, A4D23_1.QQ)
+ TTL_7400_NAND(A4D27_2, A4D26_2.QQ, A4D26_1.QQ)
+
+ TTL_7400_NAND(A4D19_4, A4D22_1.QQ, N0Y9)
+ TTL_7400_NAND(A4D30_1, A4D26_1.QQ, N1Y4)
+ TTL_7400_NAND(A4D30_2, N0Y3, A4D23_2.QQ)
+ TTL_7410_NAND(A4D29_2, A4D19_4.Q, A4D30_1.Q, A4D30_2.Q)
+
+ // outputs
+ ALIAS(MOVE_UP, A4D18_1.Q)
+ ALIAS(MOVE_DOWN, A4D18_2.Q)
+// ALIAS(P_SPEED_X, A4D32.Q)
+ ALIAS(P_SPEED_X, low)
+ ALIAS(P_SPEED_Y, A4D29_1.Q)
+ ALIAS(P_I1Y, A4D4_2.Q)
+ ALIAS(P_I2Y, A4D4_4.Q)
+ ALIAS(SYNC_MIX, A4D16_2.Q)
+ ALIAS(soundmix, A4D29_2.Q)
+
+ // hacks
+ ALIAS(G_SIZE, low)
+ ALIAS(G_SIZE2, low)
+ ALIAS(G_ANGLE, low)
+ ALIAS(G_SPEED_1, low)
+ ALIAS(G_SPEED_3, low)
+ ALIAS(G_SPEED_4, low)
+ ALIAS(G_SPEED_AUTO, low)
+
+ // test points
+ ALIAS(a4x3, N1Y1) // XXX player 1 input
+ ALIAS(a4x4, N1Y1) // XXX player 2 input
+ ALIAS(a4x5, A4D9_1.Q)
+ ALIAS(a4x6, A4D9_2.Q)
+ ALIAS(a4x7, A4D10_1.Q)
+ ALIAS(a4x8, A4D10_2.Q)
+ ALIAS(a4x9, A4D11_1.Q)
+ ALIAS(a4x10, A4D12_1.Q)
+ ALIAS(a4x11, A4D12_2.Q)
+ ALIAS(a4x12, A4D8_3.Q)
+ ALIAS(a4x13, A4D21_3.Q)
+ ALIAS(a4x14, A4D19_2.Q)
+
+/*
+ * board A5 -- playfield composer
+ */
+
+ TTL_7410_NAND(A5D6_1, N1Y6, N0Y7, N0Y8)
+ TTL_7400_NAND(A5D15_1, A5D6_1.Q, A5D6_1.Q)
+ TTL_7410_NAND(A5D6_2, tbc, N0Y9, A5D15_1.Q)
+ TTL_7410_NAND(A5D6_3, A5D15_1.Q, N1Y9, P_EY)
+ TTL_7420_NAND(A5D5_2, A5D5_1.Q, SCORE_OUT, N0X1, A5D15_1.Q)
+ TTL_7420_NAND(A5D7_1, N1Y8, N1Y6, N1Y7, tbc)
+ TTL_7420_NAND(A5D7_2, tbc, N1Y7, N1Y6, N0Y8)
+ TTL_7430_NAND(A5D8, N1X3, N1X4, N1X5, RESET, N0X1, N1Y1, A5D3_1.Q, A5D3_1.Q)
+
+//
+
+ TTL_7400_NAND(A5D1_1, N0X2, N0X1)
+ TTL_7400_NAND(A5D1_3, N1X2, N1X1)
+#if 0
+ CAP(A5Cx, CAP_P(390))
+ NET_C(N1X1, A5Cx.1)
+ NET_C(A5Cx.2, A5D1_3.Q)
+#endif
+
+ TTL_7400_NAND(A5D2_1, G_TRAINING, G_RIGHT_LEFT)
+ TTL_7400_NAND(A5D2_2, A5D2_1.Q, G_TRAINING)
+ TTL_7400_NAND(A5D2_3, G_RIGHT_LEFT, G_SQUASH)
+ TTL_7400_NAND(A5D2_4, A5D2_3.Q, G_SQUASH)
+
+ TTL_7400_NAND(A5D3_1, G_TENNIS, G_VOLLEYBALL)
+ TTL_7400_NAND(A5D3_2, G_VOLLEYBALL, A5D2_1.Q)
+ TTL_7400_NAND(A5D3_3, G_FOOSBALL, A5D2_4.Q)
+ TTL_7400_NAND(A5D3_4, G_FOOSBALL, A5D2_3.Q)
+ TTL_7400_NAND(A5D4_1, G_VOLLEYBALL, A5D2_2.Q)
+ TTL_7400_NAND(A5D4_2, G_FOOSBALL, A5D2_2.Q)
+ TTL_7400_NAND(A5D4_3, A5D2_2.Q, N1X6)
+ TTL_7400_NAND(A5D4_4, G_FOOSBALL, A5D2_1.Q)
+ TTL_7400_NAND(A5D1_2, A5D2_1.Q, RESET)
+ TTL_7420_NAND(A5D5_1, A5D4_3.Q, A5D2_3.Q, A5D2_4.Q, A5D1_2.Q)
+
+//
+
+ TTL_7420_NAND(A5D9_1, A5D16_1.Q, P_AX, P_I1Y, A5D3_2.Q)
+ TTL_7420_NAND(A5D9_2, N0X8, N1X7, N1X6, N0X2)
+ TTL_7420_NAND(A5D10_1, A5D16_1.Q, N1Y1, P_I2Y, A5D3_4.Q)
+ TTL_7420_NAND(A5D10_2, N1X8, N1X7, RESET, N1X2)
+ TTL_7420_NAND(A5D11_1, A5D16_2.Q, P_DX, P_I1Y, A5D3_3.Q)
+ TTL_7420_NAND(A5D11_2, A5D4_1.Q, P_I2Y, P_EX, A5D16_2.Q)
+ TTL_7430_NAND(A5D12, A5D1_1.Q, N1Y1, RESET, N1X7, N0X8, P_I1Y, A5D3_1.Q, A5D3_1.Q)
+ TTL_7430_NAND(A5D13, A5D1_3.Q, P_DX, N1X6, N1X7, N1X8, P_I2Y, A5D3_1.Q, A5D3_1.Q)
+ TTL_7420_NAND(A5D14_1, N0X8, RESET, N1X7, P_CX)
+ TTL_7420_NAND(A5D14_2, N1X8, N1X6, N1X7, P_CX)
+
+ TTL_7400_NAND(A5D15_2, A5D6_2.Q, A5D6_3.Q)
+ TTL_7400_NAND(A5D15_3, A5D15_2.Q, N0X3)
+ TTL_7410_NAND(A5D17_2, A5D7_1.Q, A5D3_1.Q, A5D1_4.Q)
+ TTL_7400_NAND(A5D1_4, A5D17_2.Q, A5D7_2.Q)
+
+ CAP(A5C5, CAP_P(390))
+ TTL_7400_NAND(A5D16_1, A5D9_2.Q, A5D9_2.Q)
+ NET_C(A5D9_2.Q, A5C5.1)
+ NET_C(A5D16_1.Q, A5C5.2)
+ TTL_7400_NAND(A5D16_2, A5D10_2.Q, A5D10_2.Q)
+
+ TTL_7410_NAND(A5D17_1, A5D13.Q, A5D11_2.Q, A5D10_1.Q)
+ TTL_7400_NAND(A5D16_4, A5D17_1.Q, A5D17_1.Q)
+ TTL_7420_NAND(A5D18_1, A5D19_1.Q, N1Y1, A5D17_2.Q, A5D4_2.Q)
+ TTL_7400_NAND(A5D19_1, A5D14_1.Q, A5D14_1.Q)
+ TTL_7400_NAND(A5D19_2, A5D14_2.Q, A5D14_2.Q)
+
+ CAP(A5C6, CAP_P(390))
+ NET_C(A5C6.2, GND)
+ NET_C(N_6LINES, A5C6.1)
+ TTL_7400_NAND(A5D20_1, A5D6_2.Q, A5D20_2.Q)
+ TTL_7400_NAND(A5D20_2, A5D20_1.Q, N_6LINES)
+ TTL_7400_NAND(A5D20_3, N_6LINES, A5D20_4.Q)
+ TTL_7400_NAND(A5D20_4, A5D20_3.Q, A5D6_3.Q)
+ TTL_7400_NAND(A5D15_4, A5D6_3.Q, A5D20_4.Q)
+
+ TTL_7410_NAND(A5D17_3, A5D9_1.Q, A5D11_1.Q, a5x3)
+ TTL_7400_NAND(A5D16_3, P_I1, P_I1)
+
+ TTL_7400_NAND(A5D21_1, A5D18_1.Q, A5D18_1.Q)
+ TTL_7420_NAND(A5D18_2, A5D4_4.Q, A5D19_2.Q, N1Y1, A5D17_2.Q)
+ TTL_7400_NAND(A5D19_3, A5D14_2.Q, A5D19_4.Q)
+ TTL_7400_NAND(A5D19_4, A5D19_3.Q, A5D14_1.Q)
+ TTL_7400_NAND(A5D21_2, A5D18_2.Q, A5D18_2.Q)
+ TTL_7400_NAND(A5D22_2, A5D19_3.Q, A5D14_2.Q)
+
+ CAP(A5C4, CAP_P(150))
+ NET_C(SCORE_OUT, A5C4.1)
+ NET_C(A5C4.2, A5D5_2.Q)
+ TTL_7430_NAND(A5D23, A5C4.2, A5D8.Q, A5D16_3.Q, N_M, A5D15_3.Q, A5D18_1.Q, A5D18_2.Q, A5D16_4.Q)
+ TTL_7400_NAND(A5D22_1, A5D2_4.Q, A5D2_4.Q)
+ TTL_7400_NAND(A5D22_3, A5D2_3.Q, A5D2_3.Q)
+ TTL_7410_NAND(A5D24_1, A5D16_3.Q, A5D16_4.Q, A5D16_4.Q)
+ TTL_7400_NAND(A5D25_1, A5D21_1.Q, P_M1)
+ TTL_7400_NAND(A5D25_2, A5D21_2.Q, P_M1)
+ TTL_7400_NAND(A5D25_3, SERVE, A5D25_4.Q)
+ TTL_7400_NAND(A5D25_4, A5D25_3.Q, A5D27_2.Q)
+
+ TTL_7410_NAND(A5D26_1, SYNC_MIX, P_M1, tbc)
+ TTL_7410_NAND(A5D26_2, P_M1, SYNC_MIX, STOPSOUND)
+ TTL_7410_NAND(A5D24_2, SYNC_MIX, P_M1, MOVE_LEFT)
+ TTL_7410_NAND(A5D24_3, P_M1, tbc, STOPSOUND)
+ TTL_7410_NAND(A5D26_3, A5D27_2.Q, A5D26_2.Q, A5D26_1.Q)
+ TTL_7420_NAND(A5D27_2, A5D26_3.Q, A5D24_3.Q, A5D24_2.Q, N0X6)
+
+ TTL_7420_NAND(A5D27_1, a5x9, a5x7, a5x8, a5x5)
+ TTL_7420_NAND(A5D28_1, A5D2_4.Q, A5D33_1.Q, P_I1, P_M1) // possible typo in schematic
+ TTL_7420_NAND(A5D28_2, P_I2, P_M1, A5D31_3.Q, A5D22_3.Q)
+ TTL_7420_NAND(A5D29_1, A5D22_1.Q, A5D33_1.Q, P_I1, P_M1)
+ TTL_7420_NAND(A5D29_2, P_M1, A5D2_3.Q, A5D31_3.Q, P_I2)
+
+ TTL_7420_NAND(A5D30_1, a5x14, a5x10, REFLECT_LEFT, MOVE_LEFT)
+ TTL_7420_NAND(A5D30_2, A5D30_1.Q, A5D29_1.Q, a5x11, A5D25_2.Q)
+ TTL_7410_NAND(A5D31_1, a5x14, A5D29_1.Q, REFLECT_RIGHT)
+ TTL_7420_NAND(A5D32_1, A5D31_1.Q, REFLECT_LEFT, REFLECT_RIGHT, A5D32_2.Q)
+ TTL_7420_NAND(A5D32_2, REFLECT_RIGHT, REFLECT_LEFT, A5D25_2.Q, A5D31_2.Q)
+ TTL_7410_NAND(A5D31_2, a5x10, a5x11, A5D32_2.Q)
+
+ TTL_7400_NAND(A5D21_3, MOVE_LEFT, A5D2_3.Q)
+ TTL_7400_NAND(A5D21_4, tbc, A5D2_4.Q)
+ TTL_7400_NAND(A5D22_4, A5D2_4.Q, A5D2_3.Q)
+ TTL_7410_NAND(A5D31_3, REFLECT_RIGHT, A5D22_4.Q, A5D33_1.Q)
+ TTL_7410_NAND(A5D33_1, A5D22_4.Q, A5D32_2.Q, A5D31_3.Q)
+ TTL_7410_NAND(A5D33_2, A5D21_4.Q, SOUND_GATE, A5D33_1.Q)
+ TTL_7410_NAND(A5D33_3, SOUND_GATE, A5D21_3.Q, A5D31_3.Q)
+
+ ALIAS(tbc, low)
+ ALIAS(G_TRAINING, low)
+ ALIAS(G_RIGHT_LEFT, low)
+ ALIAS(G_VOLLEYBALL, low)
+ ALIAS(G_SQUASH, low)
+ ALIAS(G_FOOSBALL, low)
+ ALIAS(G_TENNIS, low)
+ ALIAS(SERVE, low)
+
+ // outputs
+ ALIAS(videomix, A5D27_1.Q)
+ ALIAS(P_I, A5D24_1.Q)
+ ALIAS(P_I1, A5D17_3.Q)
+ ALIAS(P_I2, A5D17_1.Q)
+ ALIAS(P_TOP_BORDER, A5D20_2.Q)
+ ALIAS(P_BOTTOM_BORDER, A5D20_3.Q)
+ ALIAS(STOP_BALL, A5D25_3.Q)
+ ALIAS(REFLECT_LEFT, A5D25_1.Q)
+ ALIAS(MOVE_LEFT, A5D30_2.Q)
+ ALIAS(REFLECT_RIGHT, A5D32_1.Q)
+ ALIAS(MOVE_RIGHT, tbc)
+ ALIAS(SOUND_GATE, A5D26_3.Q)
+ ALIAS(SCORE1, A5D33_3.Q)
+ ALIAS(SCORE2, A5D33_2.Q)
+
+ // test points
+ ALIAS(a5x3, A5D12.Q)
+ ALIAS(a5x5, A5D22_2.Q)
+ ALIAS(a5x6, A5D17_3.Q)
+ ALIAS(a5x7, A5D15_4.Q)
+ ALIAS(a5x8, A5D23.Q)
+ ALIAS(a5x9, A5D20_1.Q)
+ ALIAS(a5x10, A5D28_2.Q)
+ ALIAS(a5x11, A5D29_2.Q)
+ ALIAS(a5x12, A5D27_2.Q)
+ ALIAS(a5x13, A5D28_2.Q)
+ ALIAS(a5x14, A5D28_1.Q)
+
+#if 0
+ HINT(clk, NO_DEACTIVATE)
+#endif
+
+NETLIST_END()
+
diff --git a/src/mame/machine/nl_palestra.h b/src/mame/machine/nl_palestra.h
new file mode 100644
index 00000000000..5f618c5bc78
--- /dev/null
+++ b/src/mame/machine/nl_palestra.h
@@ -0,0 +1,4 @@
+// license:BSD-3-Clause
+// copyright-holders:Sergey Svishchev
+
+NETLIST_EXTERNAL(palestra)
diff --git a/src/mame/machine/nl_rebound.cpp b/src/mame/machine/nl_rebound.cpp
new file mode 100644
index 00000000000..66da37a9a26
--- /dev/null
+++ b/src/mame/machine/nl_rebound.cpp
@@ -0,0 +1,1272 @@
+// license:GPL-2.0+
+// copyright-holders:Couriersud,DICE Team,
+/*
+ * The work herein is based on the "Rebound computer service manual"
+ * available on archive.org:
+ *
+ * https://archive.org/details/ArcadeGameManualRebound
+ *
+ * Changelog:
+ *
+ * - Migrated from DICE (Couriersud)
+ * - Added all missing elements (Couriersud)
+ * - Added discrete startup logic
+ * - Added credit led
+ * - Added missing start and coin discrete elements
+ * - Added missing paddle elements
+ * - Fixed bugs in start and coin logic and ensured it matches schematics
+ * - Replaced HLE by discrete elements (Couriersud)
+ * - Documented PCB connector (Couriersud)
+ *
+ * TODO:
+ * - Add switch to pull Connector 3 (CON3) to GND
+ *
+ * The MAME team has asked for and received written confirmation from the
+ * author of DICE to use, modify and redistribute code under:
+ *
+ * - GPL (GNU General Public License)
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ * - DICE itself is licensed under version 3 of the GNU General Public License.
+ * Under no circumstances the exemptions listed above shall apply to any
+ * other code of DICE not contained in this file.
+ *
+ * The following is an extract from the DICE readme.
+ *
+ * ----------------------------------------------------------------------------
+ *
+ * DICE is a Discrete Integrated Circuit Emulator. It emulates computer systems
+ * that lack any type of CPU, consisting only of discrete logic components.
+ *
+ * Project Page: http://sourceforge.net/projects/dice/
+ * Email: dice.emulator@gmail.com
+ *
+ * License
+ *
+ * Copyright (C) 2008-2013 DICE Team
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ */
+
+#ifndef __PLIB_PREPROCESSOR__
+ #define NL_PROHIBIT_BASEH_INCLUDE 1
+ #include "netlist/devices/net_lib.h"
+#endif
+
+NETLIST_START(rebound_schematics)
+ SOLVER(Solver, 48000)
+ PARAM(Solver.DYNAMIC_TS, 1)
+ PARAM(Solver.LTE, 1e-2)
+ PARAM(Solver.DYNAMIC_MIN_TIMESTEP, 5e-7)
+
+ PARAM(Solver.PARALLEL, 0) // Don't do parallel solvers
+ PARAM(Solver.ACCURACY, 1e-9)
+ PARAM(NETLIST.USE_DEACTIVATE, 1)
+
+ ANALOG_INPUT(V5, 5)
+
+ /* -----------------------------------------------------------------------
+ * External interface section
+ * -----------------------------------------------------------------------*/
+
+ SWITCH2(COIN1_SW)
+ SWITCH2(START_SW)
+
+ TTL_INPUT(antenna, 0)
+
+ // DSW1a/b are actually only a 1 contact switches.
+ // The logic is needed to force high level on
+ // inputs since proxies have zero input impedance.
+ SWITCH2(DSW1a)
+ NET_C(V5, DSW1a.1)
+ SWITCH2(DSW1b)
+ NET_C(V5, DSW1b.1)
+ SWITCH2(DSW2)
+
+ // POTS
+ POT(POTP1, RES_K(1)) // 1k ... pure guess - not documented
+ PARAM(POTP1.DIALLOG, 0)
+ PARAM(POTP1.REVERSE, 1)
+ NET_C(POTP1.1, V5)
+ NET_C(POTP1.3, GND)
+ ALIAS(CON14, POTP1.2)
+
+ POT(POTP2, RES_K(1)) // 1k ... pure guess - not documented
+ PARAM(POTP2.DIALLOG, 0)
+ PARAM(POTP2.REVERSE, 1)
+ NET_C(POTP2.1, V5)
+ NET_C(POTP2.3, GND)
+ ALIAS(CON18, POTP2.2)
+
+ NET_C(START_SW.1, CON5)
+ NET_C(START_SW.2, CON7)
+ NET_C(START_SW.Q, GND)
+
+ NET_C(COIN1_SW.1, CON12)
+ NET_C(COIN1_SW.2, CON10)
+ NET_C(COIN1_SW.Q, GND)
+
+ NET_C(CON15, antenna)
+
+ /* -----------------------------------------------------------------------
+ * Real netlist start
+ * -----------------------------------------------------------------------*/
+
+ MAINCLOCK(CLOCK, 14318000.0) //7159000.0*2
+
+ TTL_7400_DIP(A1)
+
+ TTL_7400_DIP(B1)
+ TTL_7474_DIP(B2)
+ TTL_74107_DIP(B3)
+ TTL_9316_DIP(B4)
+ TTL_7404_DIP(B5)
+ TTL_9322_DIP(B6)
+ TTL_9316_DIP(B7)
+ TTL_7410_DIP(B8)
+ TTL_7493_DIP(C1)
+ TTL_7450_DIP(C2)
+ TTL_7410_DIP(C3)
+ TTL_9316_DIP(C4)
+ TTL_7486_DIP(C5)
+ TTL_7474_DIP(C6)
+ TTL_9316_DIP(C7)
+ TTL_7402_DIP(C8)
+ TTL_7402_DIP(D2)
+ TTL_9316_DIP(D3)
+ TTL_9316_DIP(D4)
+ TTL_7400_DIP(D5)
+ TTL_7474_DIP(D6)
+ TTL_7400_DIP(D7)
+ TTL_7474_DIP(D8)
+
+ TTL_7400_DIP(E1)
+ TTL_7483_DIP(E2)
+ TTL_9316_DIP(E3)
+ TTL_74193_DIP(E4)
+ TTL_7408_DIP(E5)
+ TTL_7402_DIP(E6)
+ TTL_7474_DIP(E7)
+ TTL_7474_DIP(E8)
+ TTL_7404_DIP(E9)
+
+ TTL_7474_DIP(F1)
+ TTL_7408_DIP(F2)
+ TTL_74107_DIP(F3)
+ TTL_7420_DIP(F4)
+ TTL_7493_DIP(F5)
+ TTL_7410_DIP(F6)
+ TTL_7408_DIP(F7)
+ TTL_7410_DIP(F8)
+ TTL_7404_DIP(F9)
+
+ TTL_7400_DIP(H1)
+ TTL_7410_DIP(H2)
+ TTL_7493_DIP(H3)
+ TTL_74107_DIP(H4)
+ TTL_7493_DIP(H5)
+ TTL_7427_DIP(H6)
+ TTL_7410_DIP(H7)
+ TTL_7430_DIP(H8)
+ TTL_74107_DIP(H9)
+
+ TTL_7474_DIP(J1)
+ TTL_7474_DIP(J2)
+ TTL_7493_DIP(J3)
+ TTL_7474_DIP(J4)
+ TTL_7486_DIP(J5)
+ TTL_7400_DIP(J6)
+ TTL_7410_DIP(J7)
+ TTL_74153_DIP(J8)
+ TTL_7490_DIP(J9)
+
+ TTL_7493_DIP(K2)
+ TTL_9316_DIP(K3)
+ TTL_7400_DIP(K4)
+ TTL_7474_DIP(K5)
+ TTL_7402_DIP(K6)
+ TTL_7448_DIP(K7)
+ TTL_74153_DIP(K8)
+ TTL_7490_DIP(K9)
+
+ /* -----------------------------------------------------------------------
+ * Paddle 2
+ * -----------------------------------------------------------------------*/
+
+ // FIXME: Hack, schematic shows 100k (100 to be exact which makes even less sense)
+ // One way or the other, according to schematics both horizontal position logic for
+ // P1 and P2 start at hreset_n. This limits the usable range for P2.
+
+ RES(R24, 47)
+ CAP(CC27, CAP_U(0.1))
+ NET_C(CC27.2, GND)
+ NET_C(B9.5, CC27.1, R24.2)
+ NET_C(R24.1, CON18)
+
+ NE555_DIP(B9)
+ RES(R23, RES_K(200.0))
+ CAP(CC26, CAP_P(220.0))
+
+ NET_C(B9.6, B9.7)
+ NET_C(B9.6, R23.1)
+ NET_C(B9.6, CC26.1)
+ NET_C(R23.2, V5)
+ NET_C(CC26.2, GND)
+ NET_C(B9.8, V5)
+ NET_C(B9.1, GND)
+
+ /* -----------------------------------------------------------------------
+ * Paddle 1
+ * -----------------------------------------------------------------------*/
+
+ RES(R17, 47)
+ CAP(CC23, CAP_U(0.1))
+ NET_C(CC23.2, GND)
+ NET_C(C9.5, CC23.1, R17.2)
+ NET_C(R17.1, CON14)
+
+ NE555_DIP(C9)
+ NET_C(C9.6, C9.7)
+ RES(R16, RES_K(100.0))
+ CAP(CC22, CAP_P(220.0))
+ NET_C(C9.6, R16.1)
+ NET_C(C9.6, CC22.1)
+ NET_C(R16.2, V5)
+ NET_C(CC22.2, GND)
+ NET_C(C9.8, V5)
+ NET_C(C9.1, GND)
+
+ TTL_9602_DIP(D1)
+
+ RES(R10, RES_K(47.0))
+ CAP(CC16, CAP_U(5.0))
+ RES(R9, RES_K(47.0))
+ CAP(CC21, CAP_U(10.0))
+
+ NET_C(V5, D1.16)
+ NET_C(GND, D1.8)
+ NET_C(D1.1, CC16.1)
+ NET_C(D1.2, CC16.2)
+ NET_C(D1.2, R10.2)
+ NET_C(V5, R10.1)
+ NET_C(D1.15, CC21.1)
+ NET_C(D1.14, CC21.2)
+ NET_C(D1.14, R9.2)
+ NET_C(V5, R9.1)
+
+ TTL_9602_DIP(K1)
+
+ RES(R2, RES_K(33.0))
+ CAP(CC2, CAP_U(47.0))
+ RES(R1, RES_K(47.0))
+ CAP(CC3, CAP_U(10.0))
+
+ NET_C(V5, K1.16)
+ NET_C(GND, K1.8)
+ NET_C(K1.1, CC2.1)
+ NET_C(K1.2, CC2.2)
+ NET_C(K1.2, R2.2)
+ NET_C(V5, R2.1)
+ NET_C(K1.15, CC3.1)
+ NET_C(K1.14, CC3.2)
+ NET_C(K1.14, R1.2)
+ NET_C(V5, R1.1)
+
+ /* -----------------------------------------------------------------------
+ * Start circuit
+ * -----------------------------------------------------------------------*/
+
+ RES(R30, RES_K(1))
+ RES(R31, RES_K(1))
+
+ NET_C(V5, R31.1, R30.1)
+ NET_C(B1.3, B1.4, A1.5, R30.2)
+ NET_C(B1.6, B1.2)
+ NET_C(R31.2, E9.1)
+ NET_C(E9.2, B1.1)
+
+ ALIAS(CON5, R30.2)
+ ALIAS(CON7, B1.2)
+ ALIAS(CON3, R31.2) // Not explained in manual
+
+ /* -----------------------------------------------------------------------
+ * Coin circuit
+ * -----------------------------------------------------------------------*/
+
+ DIODE(CR3, "1N916")
+ DIODE(CR4, "1N4001")
+ CAP(CC20, CAP_U(0.1))
+ CAP(CC17, CAP_U(0.1))
+ CAP(CC18, CAP_U(0.1))
+ CAP(CC19, CAP_U(0.1))
+ RES(R12, RES_K(1))
+ RES(R13, RES_K(100))
+
+ NE555_DIP(D9)
+
+ NET_C(V5, CR4.K, R12.1, D9.8, D9.4, R13.1, E8.10)
+ NET_C(CR3.K, CR4.A)
+ NET_C(E9.10, E9.13, B1.5, CC20.2, CR3.A)
+ NET_C(E9.12, E9.11, CC17.1, C8.2, E8.13, E8.12)
+ NET_C(CC20.1, R12.2, D9.2)
+ NET_C(CC19.1, D9.5)
+ NET_C(CC18.1, D9.6, D9.7, R13.2)
+ NET_C(D9.3, E9.9)
+ NET_C(E9.8, E8.11)
+ NET_C(CR8.K, E8.8, D8.1, D8.13)
+
+ NET_C(GND, CC17.2, CC19.2, D9.1, CC18.2)
+
+ ALIAS(CON12, E9.11)
+ ALIAS(CON10, CR3.K)
+
+ /* -----------------------------------------------------------------------
+ * Power on clear
+ * -----------------------------------------------------------------------*/
+
+ QBJT_EB(Q1, "2N3643")
+ QBJT_EB(Q2, "2N3644")
+ QBJT_EB(Q3, "2N3643")
+ DIODE(CR6, "1N914")
+ DIODE(CR7, "1N914")
+ DIODE(CR8, "1N914") // not readable on schematic, guessing CR8
+
+ CAP(CC15, CAP_U(0.1))
+ CAP(CC24, CAP_U(0.1))
+ RES(R8, 100)
+ RES(R14, 330)
+ RES(R15, 100)
+ RES(R18, 100)
+ RES(R19, 220)
+
+ NET_C(D7.3, CR6.K)
+ NET_C(CR6.A, R19.1, R15.2)
+ NET_C(R15.1, Q2.C)
+ NET_C(V5, Q2.E, CC15.1, R8.1)
+ NET_C(Q2.B, CC15.2, R8.2, R14.1)
+ NET_C(R14.2, Q3.C, CR8.A, E9.3)
+ NET_C(Q1.C, R19.2, CC24.1, R18.1, Q3.B)
+ NET_C(GND, Q1.E, CC24.2, R18.2, Q3.E, CR7.A)
+ NET_C(CR7.K, Q1.B)
+
+ /* -----------------------------------------------------------------------
+ * Antenna
+ * -----------------------------------------------------------------------*/
+
+ ALIAS(CON15, CR7.K)
+
+ /* -----------------------------------------------------------------------
+ * Credit LED
+ * -----------------------------------------------------------------------*/
+
+ RES(R7, 150)
+ NET_C(D8.8, E9.5)
+ NET_C(E9.6, R7.2)
+
+ ALIAS(CON11, R7.1)
+
+ DIODE(CR_LED, "LedRed")
+ NET_C(CR_LED.K, CON11)
+ NET_C(CR_LED.A, V5)
+
+ /* -----------------------------------------------------------------------
+ * Aliases
+ * -----------------------------------------------------------------------*/
+
+ ALIAS(CLK ,J4.5)
+ ALIAS(CLK_n ,J4.6)
+
+ ALIAS(H1 ,H5.12)
+ ALIAS(H2 ,H5.9)
+ ALIAS(H4 ,H5.8)
+ ALIAS(H8 ,H5.11)
+
+ ALIAS(H16 ,F5.12)
+ ALIAS(H32 ,F5.9)
+ ALIAS(H64 ,F5.8)
+ ALIAS(H128 ,F5.11)
+
+ ALIAS(H256 ,H4.3)
+ ALIAS(H256_n ,H4.2)
+
+ ALIAS(HRESET ,J4.8)
+ ALIAS(HRESET_n ,J4.9)
+
+ ALIAS(HBLANK ,K5.5)
+ ALIAS(HBLANK_n ,K5.6)
+
+ ALIAS(HSYNC ,K5.9)
+ ALIAS(HSYNC_n ,K5.8)
+
+ ALIAS(V1 ,J3.12)
+ ALIAS(V2 ,J3.9)
+ ALIAS(V4 ,J3.8)
+ ALIAS(V8 ,J3.11)
+
+ ALIAS(V16 ,H3.12)
+ ALIAS(V32 ,H3.9)
+ ALIAS(V64 ,H3.8)
+ ALIAS(V128 ,H3.11)
+
+ ALIAS(V256 ,H4.5)
+ ALIAS(V256_n ,H4.6)
+
+ ALIAS(VRESET ,J2.8)
+ ALIAS(VRESET_n ,J2.9)
+
+ ALIAS(VSYNC_n ,H1.11)
+
+ ALIAS(NET_n ,B8.12)
+ ALIAS(PADDLE_12 ,K6.10)
+ ALIAS(NET_HEIGHT_n ,B5.10)
+
+ ALIAS(STOP1_n ,F7.8)
+ ALIAS(STOP2_n ,F7.6)
+
+ ALIAS(DISP_PAD1_n ,B8.6)
+ ALIAS(DISP_PAD2_n ,B8.8)
+
+ ALIAS(BACKWARDS_n ,D6.5)
+ ALIAS(DP ,C6.5)
+ ALIAS(CP_n ,D6.8)
+ ALIAS(BP_n ,C6.8)
+
+ ALIAS(V64_n ,C8.13)
+
+ ALIAS(HIT ,E6.10)
+ ALIAS(HIT_n ,D5.3)
+
+ ALIAS(SERVE ,J1.8)
+ ALIAS(SERVE_n ,J1.9)
+ ALIAS(SERVE_TIME ,K1.6)
+ ALIAS(SERVE_TIME_n ,K1.7)
+
+ ALIAS(RIGHT_SCORE ,A1.11)
+ ALIAS(LEFT_SCORE ,A1.3)
+
+ ALIAS(BALL_RETURN ,J5.3)
+ ALIAS(MISS_n ,D2.1)
+
+ ALIAS(BALL ,E6.4)
+ ALIAS(BALL_n ,E6.1)
+
+ ALIAS(LSB1 ,K9.12)
+ ALIAS(LSB2 ,J9.12)
+ ALIAS(STOP ,J6.8)
+
+ ALIAS(ATTRACT ,E8.5)
+ ALIAS(ATTRACT_n ,E8.6)
+
+ ALIAS(START ,E7.9)
+ ALIAS(START_n ,E7.8)
+
+
+ /* -----------------------------------------------------------------------
+ * HRESET
+ * -----------------------------------------------------------------------*/
+
+ NET_C(CLOCK.Q, J4.3)
+ NET_C(J4.6, J4.2)
+ NET_C(V5, J4.4)
+ NET_C(V5, J4.1)
+
+ NET_C(CLK, H5.14)
+ NET_C(J4.8, H5.2)
+ NET_C(J4.8, H5.3)
+ NET_C(H5.12, H5.1)
+
+ NET_C(H5.11, F5.14)
+ NET_C(J4.8, F5.2)
+ NET_C(J4.8, F5.3)
+ NET_C(F5.12, F5.1)
+
+ NET_C(F5.11, H4.12)
+ NET_C(J4.9, H4.13)
+ NET_C(V5, H4.1)
+ NET_C(V5, H4.4)
+
+ NET_C(H256, F4.5)
+ NET_C(H128, F4.2)
+ NET_C(H64, F4.1)
+ NET_C(H4, F4.4)
+
+ NET_C(CLK_n, J4.11)
+ NET_C(V5, J4.10)
+ NET_C(V5, J4.13)
+ NET_C(F4.6, J4.12)
+
+ /* -----------------------------------------------------------------------
+ * HBLANK/HSYNC
+ * -----------------------------------------------------------------------*/
+
+ NET_C(H16, K4.2)
+ NET_C(H64, K4.1)
+
+ NET_C(HRESET_n, K5.4)
+ NET_C(GND, K5.2)
+ NET_C(GND, K5.3)
+ NET_C(K4.3, K5.1)
+
+ NET_C(H64, B5.3)
+
+ NET_C(H32, K4.13)
+ NET_C(B5.4, K4.12)
+
+ NET_C(B5.4, F7.1)
+ NET_C(K5.5, F7.2)
+
+ NET_C(V5, K5.10)
+ NET_C(K4.11, K5.12)
+ NET_C(H16, K5.11)
+ NET_C(F7.3, K5.13)
+
+ /* -----------------------------------------------------------------------
+ * VRESET
+ * -----------------------------------------------------------------------*/
+
+ NET_C(J4.8, J3.14)
+ NET_C(J2.8, J3.2)
+ NET_C(J2.8, J3.3)
+ NET_C(J3.12, J3.1)
+
+ NET_C(J3.11, H3.14)
+ NET_C(J2.8, H3.2)
+ NET_C(J2.8, H3.3)
+ NET_C(H3.12, H3.1)
+
+ NET_C(H3.11, H4.9)
+ NET_C(J2.9, H4.10)
+ NET_C(V5, H4.8)
+ NET_C(V5, H4.11)
+
+ NET_C(V256, H2.1)
+ NET_C(V4, H2.2)
+ NET_C(V1, H2.13)
+
+ NET_C(J4.8, J2.11)
+ NET_C(V5, J2.10)
+ NET_C(V5, J2.13)
+ NET_C(H2.12, J2.12)
+
+ /* -----------------------------------------------------------------------
+ * VSYNC
+ * -----------------------------------------------------------------------*/
+
+ NET_C(V8, H2.3)
+ NET_C(V4, H2.4)
+ NET_C(V2, H2.5)
+
+ NET_C(J2.9, H1.1)
+ NET_C(H1.11, H1.2)
+
+ NET_C(H1.3, H1.12)
+ NET_C(H2.6, H1.13)
+
+ /* -----------------------------------------------------------------------
+ * Volleyball net
+ * -----------------------------------------------------------------------*/
+
+ NET_C(SERVE_n, K1.11)
+ NET_C(BALL_RETURN, K1.12)
+ NET_C(V5, K1.13)
+
+ NET_C(J1.6, J1.2)
+ NET_C(K1.9, J1.3)
+ NET_C(V5, J1.4)
+ NET_C(H1.6, J1.1)
+
+ NET_C(SERVE, K2.2)
+ NET_C(SERVE, K2.3)
+ NET_C(J1.5, K2.14)
+ NET_C(K2.12, K2.1)
+
+ NET_C(K2.9, H1.4)
+ NET_C(K2.11, H1.5)
+
+ NET_C(V128, K3.9)
+ NET_C(V5, K3.3)
+ NET_C(K2.9, K3.4)
+ NET_C(K2.8, K3.5)
+ NET_C(K2.11, K3.6)
+ NET_C(K4.8, K3.7)
+ NET_C(V5, K3.10)
+ NET_C(V4, K3.2)
+ NET_C(V5, K3.1) //Not shown on schematic
+
+ NET_C(V64, H2.11)
+ NET_C(V32, H2.10)
+ NET_C(V128, H2.9)
+
+ NET_C(V16, B1.12)
+ NET_C(V8, B1.13)
+
+ NET_C(H2.8, K6.9)
+ NET_C(B1.11, K6.8)
+
+ NET_C(V128, K4.10)
+ NET_C(K3.15, K4.9)
+
+ NET_C(H2.8, K4.4)
+ NET_C(K4.8, K4.5)
+
+ NET_C(K4.6, B5.11)
+
+ NET_C(K4.6, B2.10)
+ NET_C(H256, B2.12)
+ NET_C(H2, B2.11)
+ NET_C(V5, B2.13)
+
+ NET_C(V4, B8.2)
+ NET_C(H256, B8.1)
+ NET_C(B2.8, B8.13)
+
+ /* -----------------------------------------------------------------------
+ * Stop signals
+ * -----------------------------------------------------------------------*/
+
+ NET_C(H256, F6.3)
+ NET_C(H128, F6.5)
+ NET_C(H16, F6.4)
+
+ NET_C(H64, F6.11)
+ NET_C(H128, F6.9)
+ NET_C(H32, F6.10)
+
+ NET_C(F6.6, F7.5)
+ NET_C(ATTRACT_n, F7.4)
+
+ NET_C(F6.8, F7.9)
+ NET_C(ATTRACT_n, F7.10)
+
+ /* -----------------------------------------------------------------------
+ * Paddle 1
+ * -----------------------------------------------------------------------*/
+
+ NET_C(HRESET_n, C9.2)
+ NET_C(STOP1_n, C9.4)
+
+ NET_C(K5.5, C8.6)
+ NET_C(C9.3, C8.5)
+
+ NET_C(V5, C7.10)
+ NET_C(D7.11, C7.7)
+ NET_C(H1, C7.2)
+ NET_C(GND, C7.3)
+ NET_C(GND, C7.4)
+ NET_C(GND, C7.5)
+ NET_C(GND, C7.6)
+ NET_C(V5, C7.1)
+ NET_C(C8.4, C7.9)
+
+ NET_C(ATTRACT_n, D7.12)
+ NET_C(C7.15, D7.13)
+
+ NET_C(D7.11, B8.4)
+ NET_C(PADDLE_12, B8.3)
+ NET_C(C8.4, B8.5)
+
+ /* -----------------------------------------------------------------------
+ * Paddle 2
+ * -----------------------------------------------------------------------*/
+
+ NET_C(HRESET_n, B9.2)
+ NET_C(STOP2_n, B9.4)
+
+ NET_C(H256_n, C8.8)
+ NET_C(B9.3, C8.9)
+
+ NET_C(V5, B7.10)
+ NET_C(D7.8, B7.7)
+ NET_C(H1, B7.2)
+ NET_C(GND, B7.3)
+ NET_C(GND, B7.4)
+ NET_C(GND, B7.5)
+ NET_C(GND, B7.6)
+ NET_C(V5, B7.1)
+ NET_C(C8.10, B7.9)
+
+ NET_C(ATTRACT_n, D7.10)
+ NET_C(B7.15, D7.9)
+
+ NET_C(D7.8, B8.10)
+ NET_C(PADDLE_12, B8.11)
+ NET_C(C8.10, B8.9)
+
+ /* -----------------------------------------------------------------------
+ * Ball direction and speed
+ * -----------------------------------------------------------------------*/
+
+ NET_C(C7.11, B6.2)
+ NET_C(B7.11, B6.3)
+ NET_C(C7.12, B6.5)
+ NET_C(B7.12, B6.6)
+ NET_C(C7.13, B6.14)
+ NET_C(B7.13, B6.13)
+ NET_C(B8.6, B6.11)
+ NET_C(B8.8, B6.10)
+ NET_C(H256, B6.1)
+ NET_C(GND, B6.15)
+
+ NET_C(B6.9, B5.1)
+
+ NET_C(B5.2, D5.2)
+ NET_C(BALL, D5.1)
+
+ NET_C(H1, E6.9)
+ NET_C(D5.3, E6.8)
+
+ NET_C(E6.10, E6.11)
+ NET_C(GND, E6.12)
+
+ NET_C(E6.13, E5.13)
+ NET_C(SERVE_TIME_n, E5.12)
+
+ NET_C(H256_n, C5.5)
+ NET_C(B6.4, C5.4)
+
+ NET_C(LSB1, C5.9)
+ NET_C(LSB2, C5.10)
+
+ NET_C(SERVE, D5.10)
+ NET_C(C5.8, D5.9)
+
+ NET_C(C5.8, B5.5)
+
+ NET_C(SERVE, D5.12)
+ NET_C(B5.6, D5.13)
+
+ NET_C(V5, D6.4)
+ NET_C(C5.6, D6.2)
+ NET_C(E6.10, D6.3)
+ NET_C(SERVE_TIME_n, D6.1)
+
+ NET_C(D5.8, C6.4)
+ NET_C(B6.4, C6.2)
+ NET_C(E6.10, C6.3)
+ NET_C(D5.11, C6.1)
+
+ NET_C(D5.11, D6.10)
+ NET_C(B6.7, D6.12)
+ NET_C(E6.10, D6.11)
+ NET_C(D5.8, D6.13)
+
+ NET_C(D5.8, C6.10)
+ NET_C(B6.12, C6.12)
+ NET_C(E6.10, C6.11)
+ NET_C(D5.11, C6.13)
+
+ NET_C(D6.9, C5.1)
+ NET_C(C6.5, C5.2)
+
+ NET_C(C6.9, C5.13)
+ NET_C(C6.5, C5.12)
+
+ NET_C(C5.3, E5.4)
+ NET_C(SERVE_n, E5.5)
+
+ NET_C(B4.15, B5.9)
+
+ NET_C(V5, B4.10)
+ NET_C(V5, B4.7)
+ NET_C(V64, B4.2)
+ NET_C(V5, B4.3)
+ NET_C(V5, B4.4)
+ NET_C(GND, B4.5)
+ NET_C(GND, B4.6)
+ NET_C(B5.8, B4.9)
+ NET_C(D5.3, B4.1)
+
+ NET_C(V5, E4.5)
+ NET_C(B4.15, E4.4)
+ NET_C(E5.11, E4.11)
+ NET_C(C5.11, E4.15)
+ NET_C(E5.6, E4.1)
+ NET_C(SERVE_n, E4.10)
+ NET_C(V5, E4.9)
+ NET_C(GND, E4.14)
+
+ /* -----------------------------------------------------------------------
+ * Score
+ * -----------------------------------------------------------------------*/
+
+ NET_C(V64, C8.11)
+ NET_C(V64, C8.12)
+
+ NET_C(V128, F9.5)
+
+ NET_C(V32, F7.12)
+ NET_C(F9.6, F7.13)
+
+ NET_C(H256_n, J5.9)
+ NET_C(H64, J5.10)
+
+ NET_C(H256, J5.13)
+ NET_C(H128, J5.12)
+
+ NET_C(C8.13, J6.2)
+ NET_C(F7.11, J6.1)
+
+ NET_C(J5.8, J6.5)
+ NET_C(J5.11, J6.4)
+
+ NET_C(J6.3, K6.5)
+ NET_C(J6.6, K6.6)
+
+ /* -----------------------------------------------------------------------
+ * Score decoder
+ * -----------------------------------------------------------------------*/
+
+ NET_C(K6.4, K7.4)
+ NET_C(V5, K7.3) //Not on schematic
+ NET_C(V5, K7.5) //Not on schematic
+ NET_C(K8.7, K7.7)
+ NET_C(K8.9, K7.1)
+ NET_C(J8.7, K7.2)
+ NET_C(J8.9, K7.6)
+
+ NET_C(H4, J6.13)
+ NET_C(H8, J6.12)
+
+ NET_C(H16, K6.2)
+ NET_C(GND, K6.3)
+
+ NET_C(V4, F6.2)
+ NET_C(V8, F6.1)
+ NET_C(H16, F6.13)
+
+ NET_C(H8, H6.5)
+ NET_C(H4, H6.4)
+ NET_C(K6.1, H6.3)
+
+ NET_C(V16, F9.3)
+
+ NET_C(J6.11, K6.11)
+ NET_C(K6.1, K6.12)
+
+ NET_C(K6.1, H6.2)
+ NET_C(V8, H6.1)
+ NET_C(V4, H6.13)
+
+ NET_C(F6.12, F9.9)
+
+ NET_C(K7.15, J7.2)
+ NET_C(H6.6, J7.13)
+ NET_C(F9.4, J7.1)
+
+ NET_C(K7.9, J7.9)
+ NET_C(H6.6, J7.10)
+ NET_C(V16, J7.11)
+
+ NET_C(F9.4, H7.3)
+ NET_C(K6.13, H7.4)
+ NET_C(K7.12, H7.5)
+
+ NET_C(V16, J7.3)
+ NET_C(K6.13, J7.4)
+ NET_C(K7.11, J7.5)
+
+ NET_C(K7.13, F8.9)
+ NET_C(F9.4, F8.10)
+ NET_C(H6.12, F8.11)
+
+ NET_C(F9.4, H7.1)
+ NET_C(K7.14, H7.2)
+ NET_C(F9.8, H7.13)
+
+ NET_C(K7.10, H7.9)
+ NET_C(V16, H7.10)
+ NET_C(F9.8, H7.11)
+
+ NET_C(J7.12, H8.4)
+ NET_C(J7.8, H8.6)
+ NET_C(H7.6, H8.3)
+ NET_C(J7.6, H8.5)
+ NET_C(NET_n, H8.1)
+ NET_C(F8.8, H8.12)
+ NET_C(H7.12, H8.11)
+ NET_C(H7.8, H8.2)
+
+ /* -----------------------------------------------------------------------
+ * Score counters
+ * -----------------------------------------------------------------------*/
+
+ NET_C(LEFT_SCORE, K9.14)
+ NET_C(K9.1, K9.12)
+ NET_C(GND, K9.6)
+ NET_C(GND, K9.7)
+ NET_C(START, K9.2)
+ NET_C(START, K9.3)
+
+ NET_C(V5, H9.8)
+ NET_C(K9.11, H9.9)
+ NET_C(V5, H9.11)
+ NET_C(START_n, H9.10)
+
+ NET_C(RIGHT_SCORE, J9.14)
+ NET_C(J9.1, J9.12)
+ NET_C(GND, J9.6)
+ NET_C(GND, J9.7)
+ NET_C(START, J9.2)
+ NET_C(START, J9.3)
+
+ NET_C(V5, H9.1)
+ NET_C(J9.11, H9.12)
+ NET_C(V5, H9.4)
+ NET_C(START_n, H9.13)
+
+ NET_C(K9.8, DSW1a.2)
+
+ NET_C(H9.5, F8.4)
+ NET_C(K9.12, F8.5)
+ NET_C(DSW1a.Q, F8.3)
+
+ NET_C(J9.8, DSW1b.2)
+
+ NET_C(H9.3, F8.2)
+ NET_C(J9.12, F8.1)
+ NET_C(DSW1b.Q, F8.13)
+
+ NET_C(F8.6, J6.10)
+ NET_C(F8.12, J6.9)
+
+ NET_C(H32, K8.14)
+ NET_C(H64, K8.2)
+ NET_C(K9.12, K8.5)
+ NET_C(K9.9, K8.11)
+ NET_C(V5, K8.6)
+ NET_C(V5, K8.4)
+ NET_C(J9.12, K8.3)
+ NET_C(J9.9, K8.13)
+ NET_C(H9.2, K8.12)
+ NET_C(H9.6, K8.10)
+ NET_C(GND, K8.1)
+ NET_C(GND, K8.15)
+
+ NET_C(H32, J8.14)
+ NET_C(H64, J8.2)
+ NET_C(K9.8, J8.5)
+ NET_C(K9.11, J8.11)
+ NET_C(H9.6, J8.6)
+ NET_C(H9.2, J8.4)
+ NET_C(J9.8, J8.3)
+ NET_C(J9.11, J8.13)
+ NET_C(H9.2, J8.12)
+ NET_C(H9.6, J8.10)
+ NET_C(GND, J8.1)
+ NET_C(GND, J8.15)
+
+ /* -----------------------------------------------------------------------
+ * Serve logic
+ * -----------------------------------------------------------------------*/
+
+ NET_C(H128, C3.10)
+ NET_C(H64, C3.11)
+ NET_C(H256_n, C3.9)
+
+ NET_C(V64_n, H6.10)
+ NET_C(V128, H6.9)
+ NET_C(C3.8, H6.11)
+
+ NET_C(START, K1.4)
+ NET_C(D1.7, K1.5)
+ NET_C(V5, K1.3)
+
+ NET_C(V5, J1.10)
+ NET_C(K1.7, J1.12)
+ NET_C(H6.8, J1.11)
+ NET_C(K1.7, J1.13)
+
+ /* -----------------------------------------------------------------------
+ * Out of bounds checks
+ * -----------------------------------------------------------------------*/
+
+ NET_C(H256, B3.1)
+ NET_C(BALL, B3.12)
+ NET_C(H256_n, B3.4)
+ NET_C(SERVE_n, B3.13)
+
+ NET_C(SERVE_n, J2.4)
+ NET_C(B3.3, J2.2)
+ NET_C(H2, J2.3)
+ NET_C(V5, J2.1)
+
+ NET_C(B3.3, J5.2)
+ NET_C(J2.5, J5.1)
+
+ NET_C(V5, D1.11)
+ NET_C(F1.8, D1.12)
+ NET_C(V5, D1.13)
+
+ NET_C(J5.3, C1.2)
+ NET_C(J5.3, C1.3)
+ NET_C(D1.9, C1.14)
+ NET_C(C1.12, C1.1)
+
+ NET_C(HBLANK_n, B1.9)
+ NET_C(NET_HEIGHT_n, B1.10)
+
+ NET_C(J5.3, E5.1)
+ NET_C(B1.8, E5.2)
+
+ NET_C(C1.8, D2.8)
+ NET_C(E5.3, D2.9)
+
+ NET_C(D2.10, D2.11)
+ NET_C(SERVE, D2.12)
+
+ NET_C(BALL_n, D2.5)
+ NET_C(V256_n, D2.6)
+
+ NET_C(D2.4, D2.3)
+ NET_C(D2.13, D2.2)
+
+ NET_C(V5, B2.4)
+ NET_C(H256_n, B2.2)
+ NET_C(HIT, B2.3)
+ NET_C(V5, B2.1)
+
+ NET_C(D2.4, C2.1)
+ NET_C(H256_n, C2.13)
+ NET_C(D2.13, C2.10)
+ NET_C(B2.5, C2.9)
+
+ NET_C(D2.4, C2.2)
+ NET_C(H256, C2.3)
+ NET_C(D2.13, C2.4)
+ NET_C(B2.6, C2.5)
+
+ NET_C(C2.8, A1.13)
+ NET_C(ATTRACT_n, A1.12)
+
+ NET_C(ATTRACT_n, A1.2)
+ NET_C(C2.6, A1.1)
+
+ /* -----------------------------------------------------------------------
+ * Horizontal motion
+ * -----------------------------------------------------------------------*/
+
+ NET_C(V5, F1.4)
+ NET_C(F1.6, F1.2)
+ NET_C(VRESET, F1.3)
+ NET_C(BACKWARDS_n, F1.1)
+
+ NET_C(F1.6, F2.5)
+ NET_C(VRESET, F2.4)
+
+ NET_C(BP_n, F2.1)
+ NET_C(F2.6, F2.2)
+
+ NET_C(CP_n, F2.13)
+ NET_C(F2.6, F2.12)
+
+ NET_C(DP, H1.9)
+ NET_C(F2.6, H1.10)
+
+ NET_C(H1.8, E1.12)
+ NET_C(H1.8, E1.13)
+
+ NET_C(F2.3, E2.10)
+ NET_C(F2.11, E2.8)
+ NET_C(H1.8, E2.3)
+ NET_C(GND, E2.1)
+ NET_C(E1.11, E2.11)
+ NET_C(V5, E2.7)
+ NET_C(V5, E2.4)
+ NET_C(GND, E2.16)
+ NET_C(GND, E2.13)
+
+ NET_C(E2.15, E3.6)
+ NET_C(E2.2, E3.5)
+ NET_C(E2.6, E3.4)
+ NET_C(E2.9, E3.3)
+ NET_C(C3.6, E3.9)
+ NET_C(SERVE_n, E3.1)
+ NET_C(V5, E3.10)
+ NET_C(V5, E3.7)
+ NET_C(CLK, E3.2)
+
+ NET_C(GND, D3.6)
+ NET_C(GND, D3.5)
+ NET_C(V5, D3.4)
+ NET_C(V5, D3.3)
+ NET_C(C3.6, D3.9)
+ NET_C(SERVE_n, D3.1)
+ NET_C(V5, D3.10)
+ NET_C(E3.15, D3.7)
+ NET_C(CLK, D3.2)
+
+ NET_C(V5, F3.1)
+ NET_C(D3.15, F3.12)
+ NET_C(V5, F3.4)
+ NET_C(SERVE_n, F3.13)
+
+ NET_C(E3.15, C3.5)
+ NET_C(D3.15, C3.3)
+ NET_C(F3.3, C3.4)
+
+ NET_C(F3.3, F4.9)
+ NET_C(D3.15, F4.10)
+ NET_C(E3.11, F4.12)
+ NET_C(E3.12, F4.13)
+
+ /* -----------------------------------------------------------------------
+ * Vertical motion
+ * -----------------------------------------------------------------------*/
+
+ NET_C(E4.7, D4.6)
+ NET_C(E4.6, D4.5)
+ NET_C(E4.2, D4.4)
+ NET_C(E4.3, D4.3)
+ NET_C(D5.6, D4.9)
+ NET_C(SERVE_n, D4.1)
+ NET_C(VSYNC_n, D4.10)
+ NET_C(V5, D4.7)
+ NET_C(HSYNC_n, D4.2)
+
+ NET_C(GND, C4.6)
+ NET_C(GND, C4.5)
+ NET_C(GND, C4.4)
+ NET_C(GND, C4.3)
+ NET_C(D5.6, C4.9)
+ NET_C(SERVE_n, C4.1)
+ NET_C(V5, C4.10)
+ NET_C(D4.15, C4.7)
+ NET_C(HSYNC_n, C4.2)
+
+ NET_C(D4.15, D5.5)
+ NET_C(C4.15, D5.4)
+
+ NET_C(C4.15, C3.13)
+ NET_C(D4.11, C3.2)
+ NET_C(D4.12, C3.1)
+
+ NET_C(F4.8, E6.5)
+ NET_C(C3.12, E6.6)
+
+ NET_C(E6.4, E6.3)
+ NET_C(E6.4, E6.2)
+
+ /* -----------------------------------------------------------------------
+ * Sound
+ * -----------------------------------------------------------------------*/
+
+ NET_C(D2.1, D1.5)
+ NET_C(GND, D1.4)
+ NET_C(V5, D1.3)
+
+ NET_C(V32, E1.10)
+ NET_C(D1.6, E1.9)
+
+ NET_C(J1.9, F1.10)
+ NET_C(HIT_n, F1.12)
+ NET_C(C4.15, F1.11)
+ NET_C(HIT_n, F1.13)
+
+ NET_C(F1.8, E1.2)
+ NET_C(C4.14, E1.1)
+
+ NET_C(ATTRACT_n, F2.10)
+ NET_C(E1.8, F2.9)
+
+ NET_C(F2.8, E1.5)
+ NET_C(E1.3, E1.4)
+
+
+ /* -----------------------------------------------------------------------
+ * Coin and Start switches continued
+ * -----------------------------------------------------------------------*/
+
+ NET_C(GND, DSW2.1)
+ NET_C(V5, DSW2.2)
+
+ NET_C(V5, D8.2)
+ NET_C(DSW2.Q, D8.4)
+ NET_C(ATTRACT, D8.3)
+
+ NET_C(D8.5, D8.12)
+ NET_C(E9.4, D8.10)
+ NET_C(ATTRACT, D8.11)
+
+ NET_C(D8.9, C8.3)
+
+ NET_C(C8.1, A1.4)
+
+ NET_C(V5, E7.4)
+ NET_C(E8.5, E7.2)
+ NET_C(A1.6, E7.3)
+ NET_C(E7.8, E7.1)
+
+ NET_C(V5, E7.10)
+ NET_C(E7.5, E7.12)
+ NET_C(V256, E7.11)
+ NET_C(C8.1, E7.13)
+
+ NET_C(E7.9, D7.5)
+ NET_C(D8.8, D7.4)
+
+ NET_C(E9.4, E8.4)
+ NET_C(V5, E8.2)
+ NET_C(STOP, E8.3)
+ NET_C(D7.6, E8.1)
+
+ NET_C(D8.9, D7.2)
+ NET_C(ATTRACT, D7.1)
+
+ /* -----------------------------------------------------------------------
+ * Video signal
+ * -----------------------------------------------------------------------*/
+
+ NET_C(V4, E5.9)
+ NET_C(B5.2, E5.10)
+
+ NET_C(J5.4, H1.11) // VSYNC
+ NET_C(J5.5, K5.9) // HSYNC
+
+ RES(R29, 1000)
+ RES(R25, 330)
+ RES(R26, 330)
+ RES(R27, 330)
+ RES(R28, 330)
+
+ NET_C(R29.1, V5)
+ NET_C(H8.8, R25.1)
+ NET_C(J5.6, R26.1)
+ NET_C(E6.4, R27.1) // BALL
+ NET_C(E5.8, R28.1)
+
+ NET_C(R29.2, R25.2, R26.2, R27.2, R28.2)
+
+ ALIAS(videomix, R29.2)
+
+ /* -----------------------------------------------------------------------
+ * Audio signal
+ * -----------------------------------------------------------------------*/
+
+ ALIAS(sound, E1.6)
+
+ /* -----------------------------------------------------------------------
+ * Inputs not used
+ * -----------------------------------------------------------------------*/
+
+ NET_C(V5, A1.s3.A, A1.s3.B, B5.s6.A)
+ NET_C(V5, B3.2.CLK, B3.2.CLRQ, B3.2.J, B3.2.K)
+ NET_C(V5, F3.2.CLK, F3.2.CLRQ, F3.2.J, F3.2.K)
+ NET_C(V5, F9.s1.A, F9.s5.A, F9.s6.A)
+
+NETLIST_END()
diff --git a/src/mame/machine/nl_rebound.h b/src/mame/machine/nl_rebound.h
new file mode 100644
index 00000000000..9caa161e281
--- /dev/null
+++ b/src/mame/machine/nl_rebound.h
@@ -0,0 +1,4 @@
+// license:GPL-2.0+
+// copyright-holders: Couriersud
+
+NETLIST_EXTERNAL(rebound_schematics)
diff --git a/src/mame/machine/nl_tp1983.cpp b/src/mame/machine/nl_tp1983.cpp
new file mode 100644
index 00000000000..eb1945b38af
--- /dev/null
+++ b/src/mame/machine/nl_tp1983.cpp
@@ -0,0 +1,123 @@
+// license:BSD-3-Clause
+// copyright-holders:Sergey Svishchev
+
+/***************************************************************************
+
+ Netlist (tp1983) included from testpat.cpp
+
+***************************************************************************/
+
+#ifndef __PLIB_PREPROCESSOR__
+ #define NL_PROHIBIT_BASEH_INCLUDE 1
+ #include "netlist/devices/net_lib.h"
+#endif
+
+// gray scale
+#define SB3 0
+// vertical stripes
+#define SB4 1
+// vertical lines
+#define SB5 0
+// horizontal stripes
+#define SB6 0
+// horizontal lines
+#define SB7 0
+// "M"
+#define SB8 1
+// inverse
+//efine SB9 0
+
+NETLIST_START(tp1983)
+
+ SOLVER(Solver, 480000)
+// PARAM(Solver.PARALLEL, 0) // Don't do parallel solvers
+ PARAM(Solver.ACCURACY, 1e-5) // ???
+// PARAM(Solver.LTE, 1e-4) // Default is not enough for paddle control if using LTE
+ PARAM(NETLIST.USE_DEACTIVATE, 1)
+
+ ANALOG_INPUT(V5, 5)
+
+ TTL_INPUT(high, 1)
+ TTL_INPUT(low, 0)
+
+ // skipping D7.1 D7.2 D8.2 clock generator circuit
+ MAINCLOCK(clk, 250000.0)
+
+// vsync generator
+
+#define _C6 0
+
+ CAP(C6, CAP_P(11))
+ RES(R19, RES_K(30))
+
+#if _C6
+ NET_C(V5, C6.1)
+#else
+ NET_C(DD6_2.Q, C6.1)
+#endif
+ NET_C(C6.2, R19.1)
+ //NET_C(R19.2, GND)
+ NET_C(R19.2, V5)
+
+ // CLK, STROBE, ENABLE, UNITY, CLR, Bx [9, 10, 11, 12, 13, ...]
+ TTL_7497(DD4, clk, low, low, low, DD5.Y, high, vsync, low, vsync, vsync, low)
+#if 1
+ TTL_7497(DD5, DD4.ZQ, DD6_2.QQ, low, DD5.ENOUTQ, DD5.Y, high, DD6_1.QQ, low, low, low, low)
+#else
+ TTL_7497(DD5, DD4.Z, low, low, DD5.ENOUT, DD5.Y, high, DD6_1.QQ, low, low, low, low)
+#endif
+
+ // CLK, D, CLRQ, PREQ [3, 2, 1, 4]
+#if 1
+ TTL_7474(DD6_1, DD5.Y, DD6_2.Q, C6.2, high)
+ TTL_7474(DD6_2, DD5.Y, DD6_1.QQ, C6.2, high)
+#else
+ TTL_7474(DD6_1, DD5.Y, DD6_2.Q, low, high)
+ TTL_7474(DD6_2, DD5.Y, DD6_1.QQ, low, high)
+#endif
+
+ ALIAS(vsync, DD6_1.Q)
+
+// hsync generator
+
+#if 0
+ CAP(C1, CAP_P(330))
+ CAP(C2, CAP_P(3300)) // XXX tunable 3300
+ RES(R2, RES_K(30))
+ RES(R3, 1200)
+
+ // A, B, C, D, CLEAR, LOADQ, CU, CD [15, 1, 10, 9, 14, 11, 5, 4]
+ TTL_74193(DD1, low, low, low, low, low, high, clk, high)
+ NET_C(DD1.CARRYQ, C1.1)
+ NET_C(R2.2, GND)
+
+ TTL_7400_NAND(DD2_1, hsync, C1.2)
+ NET_C(C1.2, R2.1)
+ NET_C(DD2_1.Q, C2.1)
+ NET_C(vsync, R3.1)
+ NET_C(R3.2, C2.2)
+
+ TTL_7400_NAND(DD2_2, C2.2, C2.2)
+ TTL_7400_NAND(DD2_3, hsync, hsync)
+
+ ALIAS(hsync, DD2_2.Q)
+
+// video mixer
+
+ RES(R10, 820)
+ NET_C(hsync, R10.1)
+
+ ALIAS(videomix, R10.2)
+#else
+ ALIAS(videomix, vsync)
+#endif
+
+ //LOG(log_V0, vsync)
+ //LOG(log_V1, DD6_2.Q)
+
+#if 1
+ HINT(clk, NO_DEACTIVATE)
+#endif
+
+NETLIST_END()
+
diff --git a/src/mame/machine/nl_tp1983.h b/src/mame/machine/nl_tp1983.h
new file mode 100644
index 00000000000..e7ef3dcac1e
--- /dev/null
+++ b/src/mame/machine/nl_tp1983.h
@@ -0,0 +1,4 @@
+// license:BSD-3-Clause
+// copyright-holders:Sergey Svishchev
+
+NETLIST_EXTERNAL(tp1983)
diff --git a/src/mame/machine/nl_tp1985.cpp b/src/mame/machine/nl_tp1985.cpp
new file mode 100644
index 00000000000..6f84538d26a
--- /dev/null
+++ b/src/mame/machine/nl_tp1985.cpp
@@ -0,0 +1,246 @@
+// license:BSD-3-Clause
+// copyright-holders:Sergey Svishchev
+
+/***************************************************************************
+
+ Netlist (tp1985) included from testpat.cpp
+
+***************************************************************************/
+
+#ifndef __PLIB_PREPROCESSOR__
+ #define NL_PROHIBIT_BASEH_INCLUDE 1
+ #include "netlist/devices/net_lib.h"
+#endif
+
+// gray scale
+#define SB3 0
+// vertical stripes
+#define SB4 1
+// vertical lines
+#define SB5 0
+// horizontal stripes
+#define SB6 0
+// horizontal lines
+#define SB7 0
+// "M"
+#define SB8 1
+// inverse
+//efine SB9 0
+
+//
+#define _R19 0
+//
+#define _VD4 0
+//
+#define _DD4 1
+
+NETLIST_START(tp1985)
+
+ SOLVER(Solver, 48000)
+// PARAM(Solver.PARALLEL, 0) // Don't do parallel solvers
+ PARAM(Solver.ACCURACY, 1e-5) // ???
+// PARAM(Solver.LTE, 1e-4) // Default is not enough for paddle control if using LTE
+ PARAM(NETLIST.USE_DEACTIVATE, 0)
+
+ ANALOG_INPUT(V5, 5)
+
+ TTL_INPUT(high, 1)
+ TTL_INPUT(low, 0)
+
+ MAINCLOCK(clk, 4000000.0)
+
+// raster generator: DD1-DD4, DD5.3, DD5.4, DD6-DD7
+
+ RES(R1, 1000)
+ NET_C(R1.1, V5)
+
+ // A, B, C, D, CLEAR, LOADQ, CU, CD [15, 1, 10, 9, 14, 11, 5, 4]
+ TTL_74193(DD1, low, low, low, low, GND, R1.2, DD2.CARRYQ, R1.2)
+ TTL_74193(DD2, low, low, low, low, GND, R1.2, clk, R1.2)
+
+ ALIAS(F250K, DD2.CARRYQ)
+ ALIAS(F15625, DD1.CARRYQ)
+
+ RES(R2, 2000)
+ RES(R3, 1000)
+ RES(R4, 510)
+ RES(R5, 240)
+ RES(R6, 510)
+ RES(R7, 510)
+ RES(R8, 240)
+ DIODE(VD1, "1N34A") // XXX actually D9B
+ DIODE(VD2, "1N34A") // XXX actually D9B
+#if SB3
+ DIODE(VD6, "1N34A") // XXX actually D9B
+#endif
+
+ NET_C(DD1.QA, R2.1, R6.1)
+ NET_C(DD1.QB, R3.1, VD1.A)
+ NET_C(DD1.QC, R4.1)
+ NET_C(DD1.QD, R5.1)
+
+ NET_C(DD2.QC, R7.1)
+ NET_C(DD2.QD, R8.1)
+ NET_C(R6.2, DD3_2.D)
+
+ // and to SB1.1, SB4.2, SB3...
+#if SB3
+#if SB4
+ NET_C(R2.2, R3.2, R4.2, R5.2)
+ NET_C(GND, VD6.A)
+#else
+ NET_C(R2.2, R3.2, R4.2, R5.2, VD6.A)
+#endif
+#else
+ NET_C(R2.2, R3.2, R4.2, R5.2)
+#endif
+
+ // and to SB6.2
+ NET_C(R7.2, R8.2, VD2.A)
+
+ // CLK, D, CLRQ, PREQ [3, 2, 1, 4]
+ TTL_7474(DD3_1, DD1.QA, DD1.QB, DD1.CARRYQ, DD3_1.QQ)
+// TTL_7474(DD3_2, VD1.K, DD2.QD, high, DD3_1.QQ) // per book, produces one pulse, shifted too far.
+#if _DD4
+ TTL_7474(DD3_2, DD2.QD, VD1.K, DD4.Y, DD3_1.QQ) // per journal, produces two pulse, shifted correctly.
+#else
+ TTL_7474(DD3_2, DD2.QD, VD1.K, high, DD3_1.QQ) // per journal, produces two pulse, shifted correctly.
+#endif
+ /*
+ * verified:
+ *
+ * DD3.1 = hblank generator, 12 us @ 75%
+ * DD3.2 = hsync generator, 4 us @ 100%, shifted 2 us after hblank
+ * hsync period = 64us (15625 Hz)
+ */
+
+#if _DD4
+ RES(R12, 2000)
+ RES(R13, 2000)
+ CAP(C2, CAP_P(1000))
+
+ NET_C(V5, R13.1)
+ NET_C(GND, R12.1)
+ NET_C(C2.2, R13.2)
+ NET_C(R13.2, R12.2)
+ NET_C(DD6.QD, C2.1)
+
+ // CLK, STROBE, ENABLE, UNITY, CLR, Bx
+ //
+ // STRB, ENin are tied to GND
+ TTL_7497(DD4, DD3_1.QQ, low, low, DD5_3.Q, DD5_4.Q, low, DD4.Y, low, DD5_3.Q, low, low)
+// TTL_7497(DD4, DD3_1.QQ, low, low, low, DD5_4.Q, low, DD4.Y, low, DD5_3.Q, low, low)
+// TTL_7497(DD4, DD3_1.QQ, low, low, low, DD5_4.Q, low, DD4.Y, low, low, low, low)
+ TTL_7400_NAND(DD5_3, R13.2, DD4.Y)
+// TTL_7400_NAND(DD5_3, high, DD4.Y)
+ TTL_7400_NAND(DD5_4, DD4.ENOUTQ, DD4.ENOUTQ)
+ TTL_7493(DD6, DD4.ZQ, DD4.ENOUTQ, DD6.QD, DD6.QB) // CLK1, CLK2, R1, R2 [14, 1, 2, 3]
+#else
+ TTL_7497(DD4, DD3_1.QQ, low, low, low, low, low, high, low, low, low, low)
+// TTL_7493(DDx, DD3_1.QQ, DD3_1.QQ, low, low)
+ TTL_7493(DDx, DD3_1.QQ, DD3_1.QQ, DDx.QD, DDx.QB)
+#endif
+
+// pattern selector
+
+ RES(R10, 1000)
+ RES(R11, 240)
+ RES(R14, 510)
+ RES(R15, 1000)
+ RES(R16, 510)
+ DIODE(VD3, "1N34A") // XXX actually D9B
+#if _VD4
+ DIODE(VD4, "1N34A") // XXX actually D9B
+#endif
+ DIODE(VD5, "1N34A") // XXX actually D9B
+
+#if SB4
+ ALIAS(hpatsource, DD1.QA)
+#endif
+#if SB5
+ ALIAS(hpatsource, DD2.CARRYQ)
+#endif
+#if !(SB4+SB5)
+ ALIAS(hpatsource, R11.2)
+#endif
+
+#if SB6
+ ALIAS(vpatsource, DD6.QA)
+#endif
+#if SB7
+ ALIAS(vpatsource, DD4.Z)
+#endif
+#if !(SB6+SB7)
+ ALIAS(vpatsource, R11.2)
+#endif
+
+ NET_C(V5, R10.1)
+ NET_C(V5, R11.1)
+ NET_C(V5, R15.1)
+ NET_C(R11.2, VD3.A)
+ NET_C(hpatsource, R14.1)
+ NET_C(R14.2, DD7_2.A)
+
+ TTL_7400_NAND(DD7_1, hpatsource, vpatsource)
+#if !SB8
+ TTL_7400_NAND(DD7_2, VD3.K, R15.2)
+ NET_C(VD2.K, DD7_2.B)
+#else
+ TTL_7400_NAND(DD7_2, VD3.K, DD7_1.Q)
+ NET_C(R15.2, GND)
+ NET_C(VD2.K, GND)
+#endif
+
+#if _VD4
+ NET_C(DD7_2.Q, VD4.K)
+ NET_C(VD4.A, R16.2)
+#else
+ NET_C(DD7_2.Q, R16.2)
+#endif
+ NET_C(DD3_1.Q, R16.1)
+
+ TTL_7400_NAND(DD7_3, DD7_2.Q, R10.2)
+ TTL_7400_NAND(DD7_4, R16.1, DD7_3.Q)
+
+ NET_C(DD7_4.Q, VD5.A)
+ NET_C(VD5.K, R17.1)
+#if SB3
+ NET_C(VD6.K, R17.1)
+#endif
+
+// video mixer
+
+#ifdef VD7
+ DIODE(VD7, "1N34A") // XXX actually D9B
+#endif
+ RES(R17, 10) // XXX actually 470 ohm POT
+ RES(R18, 430)
+#if _R19
+ RES(R19, 430)
+ CAP(C3, CAP_U(50))
+#endif
+
+#ifdef VD7
+ NET_C(DD3_2.QQ, VD7.A)
+ NET_C(VD7.K, R18.1)
+#else
+ NET_C(DD3_2.QQ, R18.1)
+#endif
+ NET_C(R17.2, R18.2) // XXX
+
+#if _R19
+ NET_C(GND, R19.1)
+ NET_C(R18.2, C3.2)
+ NET_C(R19.2, C3.2)
+ ALIAS(videomix, C3.1)
+#else
+ ALIAS(videomix, R18.2)
+ //LOG(logV, R18.2)
+#endif
+
+#if 0
+ HINT(clk, NO_DEACTIVATE)
+#endif
+
+NETLIST_END()
+
diff --git a/src/mame/machine/nl_tp1985.h b/src/mame/machine/nl_tp1985.h
new file mode 100644
index 00000000000..908a18211cc
--- /dev/null
+++ b/src/mame/machine/nl_tp1985.h
@@ -0,0 +1,4 @@
+// license:BSD-3-Clause
+// copyright-holders:Sergey Svishchev
+
+NETLIST_EXTERNAL(tp1985)
diff --git a/src/mame/machine/novagbase.cpp b/src/mame/machine/novagbase.cpp
new file mode 100644
index 00000000000..6595de8e288
--- /dev/null
+++ b/src/mame/machine/novagbase.cpp
@@ -0,0 +1,60 @@
+// license:BSD-3-Clause
+// copyright-holders:hap
+/******************************************************************************
+
+Novag chess computers base driver
+
+TODO:
+- printer port
+
+******************************************************************************/
+
+#include "emu.h"
+#include "includes/novagbase.h"
+
+
+// machine start/reset
+
+void novagbase_state::machine_start()
+{
+ chessbase_state::machine_start();
+
+ // zerofill/register for savestates
+ m_lcd_control = 0;
+ m_lcd_data = 0;
+
+ save_item(NAME(m_lcd_control));
+ save_item(NAME(m_lcd_data));
+}
+
+void novagbase_state::machine_reset()
+{
+ chessbase_state::machine_reset();
+}
+
+
+/***************************************************************************
+ Helper Functions
+***************************************************************************/
+
+// LCD
+
+void novagbase_state::novag_lcd_palette(palette_device &palette) const
+{
+ palette.set_pen_color(0, rgb_t(138, 146, 148)); // background
+ palette.set_pen_color(1, rgb_t(92, 83, 88)); // lcd pixel on
+ palette.set_pen_color(2, rgb_t(131, 136, 139)); // lcd pixel off
+}
+
+HD44780_PIXEL_UPDATE(novagbase_state::novag_lcd_pixel_update)
+{
+ // char size is 5x8
+ if (x > 4 || y > 7)
+ return;
+
+ if (line < 2 && pos < 8)
+ {
+ // internal: (8+8)*1, external: 1*16
+ bitmap.pix16(1 + y, 1 + line*8*6 + pos*6 + x) = state ? 1 : 2;
+ }
+}
diff --git a/src/mame/machine/orion.cpp b/src/mame/machine/orion.cpp
index d6dc146a678..a61d6433cd0 100644
--- a/src/mame/machine/orion.cpp
+++ b/src/mame/machine/orion.cpp
@@ -27,7 +27,7 @@ READ8_MEMBER(orion_state::orion_romdisk_porta_r)
{
uint16_t addr = (m_romdisk_msb << 8) | m_romdisk_lsb;
if (m_cart->exists() && addr < m_cart->get_rom_size())
- return m_cart->read_rom(space, addr);
+ return m_cart->read_rom(addr);
else
return 0xff;
}
@@ -198,7 +198,7 @@ READ8_MEMBER(orion_state::orionz80_floppy_rtc_r)
{
if ((offset >= 0x60) && (offset <= 0x6f))
{
- return m_rtc->read(space,offset-0x60);
+ return m_rtc->read(offset-0x60);
}
else
{
@@ -210,7 +210,7 @@ WRITE8_MEMBER(orion_state::orionz80_floppy_rtc_w)
{
if ((offset >= 0x60) && (offset <= 0x6f))
{
- m_rtc->write(space,offset-0x60,data);
+ m_rtc->write(offset-0x60,data);
}
else
{
@@ -357,7 +357,7 @@ READ8_MEMBER(orion_state::orionz80_io_r)
{
if (offset == 0xFFFD)
{
- return m_ay8912->data_r(space, 0);
+ return m_ay8912->data_r();
}
return 0xff;
}
@@ -375,10 +375,10 @@ WRITE8_MEMBER(orion_state::orionz80_io_w)
}
switch(offset)
{
- case 0xfffd : m_ay8912->address_w(space, 0, data);
+ case 0xfffd : m_ay8912->address_w(data);
break;
case 0xbffd :
- case 0xbefd : m_ay8912->data_w(space, 0, data);
+ case 0xbefd : m_ay8912->data_w(data);
break;
}
}
@@ -548,7 +548,7 @@ READ8_MEMBER(orion_state::orionpro_io_r)
}
if (offset == 0xFFFD)
{
- return m_ay8912->data_r(space, 0);
+ return m_ay8912->data_r();
}
return 0xff;
}
@@ -586,10 +586,10 @@ WRITE8_MEMBER(orion_state::orionpro_io_w)
}
switch(offset)
{
- case 0xfffd : m_ay8912->address_w(space, 0, data);
+ case 0xfffd : m_ay8912->address_w(data);
break;
case 0xbffd :
- case 0xbefd : m_ay8912->data_w(space, 0, data);
+ case 0xbefd : m_ay8912->data_w(data);
break;
}
}
diff --git a/src/mame/machine/osborne1.cpp b/src/mame/machine/osborne1.cpp
index 62687698e69..40b540f0e78 100644
--- a/src/mame/machine/osborne1.cpp
+++ b/src/mame/machine/osborne1.cpp
@@ -37,7 +37,7 @@ READ8_MEMBER( osborne1_state::bank_2xxx_3xxx_r )
if ((offset & 0x900) == 0x100) // Floppy
data &= m_fdc->read(offset & 0x03);
if ((offset & 0x900) == 0x900) // IEEE488 PIA
- data &= m_pia0->read(space, offset & 0x03);
+ data &= m_pia0->read(offset & 0x03);
if ((offset & 0xA00) == 0x200) // Keyboard
{
if (offset & 0x01) data &= m_keyb_row[0]->read();
@@ -51,14 +51,14 @@ READ8_MEMBER( osborne1_state::bank_2xxx_3xxx_r )
}
if ((offset & 0xA00) == 0xA00) // Serial
{
- data &= m_acia->read(space, offset & 0x01);
+ data &= m_acia->read(offset & 0x01);
}
if ((offset & 0xC00) == 0x400) // SCREEN-PAC
{
if (m_screen_pac) data &= 0xFB;
}
if ((offset & 0xC00) == 0xC00) // Video PIA
- data &= m_pia1->read(space, offset & 0x03);
+ data &= m_pia1->read(offset & 0x03);
return data;
}
@@ -74,10 +74,10 @@ WRITE8_MEMBER( osborne1_state::bank_2xxx_3xxx_w )
if ((offset & 0x900) == 0x100) // Floppy
m_fdc->write(offset & 0x03, data);
if ((offset & 0x900) == 0x900) // IEEE488 PIA
- m_pia0->write(space, offset & 0x03, data);
+ m_pia0->write(offset & 0x03, data);
if ((offset & 0xA00) == 0xA00) // Serial
{
- m_acia->write(space, offset & 0x01, data);
+ m_acia->write(offset & 0x01, data);
}
if ((offset & 0xC00) == 0x400) // SCREEN-PAC
{
@@ -85,7 +85,7 @@ WRITE8_MEMBER( osborne1_state::bank_2xxx_3xxx_w )
m_hc_left = (data & 0x02) ? 0 : 1;
}
if ((offset & 0xC00) == 0xC00) // Video PIA
- m_pia1->write(space, offset & 0x03, data);
+ m_pia1->write(offset & 0x03, data);
}
}
diff --git a/src/mame/machine/pce_cd.cpp b/src/mame/machine/pce_cd.cpp
index 94986e2a424..484395b6981 100644
--- a/src/mame/machine/pce_cd.cpp
+++ b/src/mame/machine/pce_cd.cpp
@@ -241,23 +241,22 @@ void pce_cd_device::nvram_init(nvram_device &nvram, void *data, size_t size)
}
// TODO: left and right speaker tags should be passed from the parent config, instead of using the hard-coded ones below!?!
- MACHINE_CONFIG_START(pce_cd_device::device_add_mconfig)
- NVRAM(config, "bram").set_custom_handler(FUNC(pce_cd_device::nvram_init));
-
- MCFG_CDROM_ADD("cdrom")
- MCFG_CDROM_INTERFACE("pce_cdrom")
+void pce_cd_device::device_add_mconfig(machine_config &config)
+{
+ NVRAM(config, m_nvram).set_custom_handler(FUNC(pce_cd_device::nvram_init));
- MCFG_DEVICE_ADD( "msm5205", MSM5205, PCE_CD_CLOCK / 6 )
- MCFG_MSM5205_VCLK_CB(WRITELINE(*this, pce_cd_device, msm5205_int)) /* interrupt function */
- MCFG_MSM5205_PRESCALER_SELECTOR(S48_4B) /* 1/48 prescaler, 4bit data */
- MCFG_SOUND_ROUTE( ALL_OUTPUTS, "^lspeaker", 0.50 )
- MCFG_SOUND_ROUTE( ALL_OUTPUTS, "^rspeaker", 0.50 )
+ CDROM(config, m_cdrom).set_interface("pce_cdrom");
- MCFG_DEVICE_ADD( "cdda", CDDA )
- MCFG_SOUND_ROUTE( 0, "^lspeaker", 1.00 )
- MCFG_SOUND_ROUTE( 1, "^rspeaker", 1.00 )
-MACHINE_CONFIG_END
+ MSM5205(config, m_msm, PCE_CD_CLOCK / 6);
+ m_msm->vck_legacy_callback().set(FUNC(pce_cd_device::msm5205_int)); /* interrupt function */
+ m_msm->set_prescaler_selector(msm5205_device::S48_4B); /* 1/48 prescaler, 4bit data */
+ m_msm->add_route(ALL_OUTPUTS, "^lspeaker", 0.50);
+ m_msm->add_route(ALL_OUTPUTS, "^rspeaker", 0.50);
+ CDDA(config, m_cdda);
+ m_cdda->add_route(0, "^lspeaker", 1.00);
+ m_cdda->add_route(1, "^rspeaker", 1.00);
+}
void pce_cd_device::adpcm_stop(uint8_t irq_flag)
{
diff --git a/src/mame/machine/pcshare.cpp b/src/mame/machine/pcshare.cpp
index 0cedba2dd03..8d9fbac3f27 100644
--- a/src/mame/machine/pcshare.cpp
+++ b/src/mame/machine/pcshare.cpp
@@ -141,51 +141,51 @@ void pcat_base_state::pcat32_io_common(address_map &map)
}
-MACHINE_CONFIG_START(pcat_base_state::pcvideo_vga)
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_RAW_PARAMS(25.1748_MHz_XTAL, 900, 0, 640, 526, 0, 480)
- MCFG_SCREEN_UPDATE_DEVICE("vga", vga_device, screen_update)
-
- MCFG_DEVICE_ADD("vga", VGA, 0)
- MCFG_VIDEO_SET_SCREEN("screen")
-MACHINE_CONFIG_END
-
-MACHINE_CONFIG_START(pcat_base_state::pcvideo_trident_vga)
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_RAW_PARAMS(25.1748_MHz_XTAL, 900, 0, 640, 526, 0, 480)
- MCFG_SCREEN_UPDATE_DEVICE("vga", trident_vga_device, screen_update)
-
- MCFG_DEVICE_ADD("vga", TRIDENT_VGA, 0)
- MCFG_VIDEO_SET_SCREEN("screen")
-MACHINE_CONFIG_END
-
-MACHINE_CONFIG_START(pcat_base_state::pcvideo_s3_vga)
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_RAW_PARAMS(25.1748_MHz_XTAL, 900, 0, 640, 526, 0, 480)
- MCFG_SCREEN_UPDATE_DEVICE("vga", s3_vga_device, screen_update)
-
- MCFG_DEVICE_ADD("vga", S3_VGA, 0)
- MCFG_VIDEO_SET_SCREEN("screen")
-MACHINE_CONFIG_END
-
-
-MACHINE_CONFIG_START(pcat_base_state::pcvideo_cirrus_gd5428)
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_RAW_PARAMS(25.1748_MHz_XTAL, 900, 0, 640, 526, 0, 480)
- MCFG_SCREEN_UPDATE_DEVICE("vga", cirrus_gd5428_device, screen_update)
-
- MCFG_DEVICE_ADD("vga", CIRRUS_GD5428, 0)
- MCFG_VIDEO_SET_SCREEN("screen")
-MACHINE_CONFIG_END
-
-MACHINE_CONFIG_START(pcat_base_state::pcvideo_cirrus_gd5430)
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_RAW_PARAMS(25.1748_MHz_XTAL, 900, 0, 640, 526, 0, 480)
- MCFG_SCREEN_UPDATE_DEVICE("vga", cirrus_gd5430_device, screen_update)
-
- MCFG_DEVICE_ADD("vga", CIRRUS_GD5430, 0)
- MCFG_VIDEO_SET_SCREEN("screen")
-MACHINE_CONFIG_END
+void pcat_base_state::pcvideo_vga(machine_config &config)
+{
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_raw(25.1748_MHz_XTAL, 900, 0, 640, 526, 0, 480);
+ screen.set_screen_update("vga", FUNC(vga_device::screen_update));
+
+ VGA(config, "vga", 0).set_screen("screen");
+}
+
+void pcat_base_state::pcvideo_trident_vga(machine_config &config)
+{
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_raw(25.1748_MHz_XTAL, 900, 0, 640, 526, 0, 480);
+ screen.set_screen_update("vga", FUNC(trident_vga_device::screen_update));
+
+ TRIDENT_VGA(config, "vga", 0).set_screen("screen");
+}
+
+void pcat_base_state::pcvideo_s3_vga(machine_config &config)
+{
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_raw(25.1748_MHz_XTAL, 900, 0, 640, 526, 0, 480);
+ screen.set_screen_update("vga", FUNC(s3_vga_device::screen_update));
+
+ S3_VGA(config, "vga", 0).set_screen("screen");
+}
+
+
+void pcat_base_state::pcvideo_cirrus_gd5428(machine_config &config)
+{
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_raw(25.1748_MHz_XTAL, 900, 0, 640, 526, 0, 480);
+ screen.set_screen_update("vga", FUNC(cirrus_gd5428_device::screen_update));
+
+ CIRRUS_GD5428(config, "vga", 0).set_screen("screen");
+}
+
+void pcat_base_state::pcvideo_cirrus_gd5430(machine_config &config)
+{
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_raw(25.1748_MHz_XTAL, 900, 0, 640, 526, 0, 480);
+ screen.set_screen_update("vga", FUNC(cirrus_gd5430_device::screen_update));
+
+ CIRRUS_GD5430(config, "vga", 0).set_screen("screen");
+}
void pcat_base_state::pcat_common(machine_config &config)
{
diff --git a/src/mame/machine/pgmprot_igs025_igs012.cpp b/src/mame/machine/pgmprot_igs025_igs012.cpp
index a188ce5bc95..0fd73fab0f9 100644
--- a/src/mame/machine/pgmprot_igs025_igs012.cpp
+++ b/src/mame/machine/pgmprot_igs025_igs012.cpp
@@ -133,17 +133,17 @@ void pgm_012_025_state::drgw2_mem(address_map &map)
map(0xd00000, 0xd00fff).noprw(); // Written, but never read back? Related to the protection device? - IGS012?
}
-MACHINE_CONFIG_START(pgm_012_025_state::pgm_012_025_drgw2)
+void pgm_012_025_state::pgm_012_025_drgw2(machine_config &config)
+{
pgmbase(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(drgw2_mem)
+ m_maincpu->set_addrmap(AS_PROGRAM, &pgm_012_025_state::drgw2_mem);
IGS025(config, m_igs025, 0);
//m_igs025->set_external_cb(FUNC(pgm_022_025_state::igs025_to_igs012_callback), this);
MCFG_MACHINE_RESET_OVERRIDE(pgm_012_025_state,drgw2)
-MACHINE_CONFIG_END
+}
void pgm_012_025_state::init_drgw2()
diff --git a/src/mame/machine/pgmprot_igs025_igs022.cpp b/src/mame/machine/pgmprot_igs025_igs022.cpp
index 1fa7ac4a75e..95b51171b27 100644
--- a/src/mame/machine/pgmprot_igs025_igs022.cpp
+++ b/src/mame/machine/pgmprot_igs025_igs022.cpp
@@ -375,28 +375,30 @@ void pgm_022_025_state::killbld_mem(address_map &map)
}
-MACHINE_CONFIG_START(pgm_022_025_state::pgm_022_025)
+void pgm_022_025_state::pgm_022_025(machine_config &config)
+{
pgmbase(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(killbld_mem)
+ m_maincpu->set_addrmap(AS_PROGRAM, &pgm_022_025_state::killbld_mem);
IGS025(config, m_igs025, 0);
m_igs025->set_external_cb(FUNC(pgm_022_025_state::igs025_to_igs022_callback), this);
IGS022(config, m_igs022, 0);
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(pgm_022_025_state::pgm_022_025_dw3)
+void pgm_022_025_state::pgm_022_025_dw3(machine_config &config)
+{
pgm_022_025(config);
MCFG_MACHINE_RESET_OVERRIDE(pgm_022_025_state, dw3)
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(pgm_022_025_state::pgm_022_025_killbld)
+void pgm_022_025_state::pgm_022_025_killbld(machine_config &config)
+{
pgm_022_025(config);
MCFG_MACHINE_RESET_OVERRIDE(pgm_022_025_state, killbld)
-MACHINE_CONFIG_END
+}
INPUT_PORTS_START( killbld )
diff --git a/src/mame/machine/pgmprot_igs025_igs028.cpp b/src/mame/machine/pgmprot_igs025_igs028.cpp
index cc95946766d..d7f9214d947 100644
--- a/src/mame/machine/pgmprot_igs025_igs028.cpp
+++ b/src/mame/machine/pgmprot_igs025_igs028.cpp
@@ -186,11 +186,11 @@ void pgm_028_025_state::igs025_to_igs028_callback( void )
}
-MACHINE_CONFIG_START(pgm_028_025_state::pgm_028_025_ol)
+void pgm_028_025_state::pgm_028_025_ol(machine_config &config)
+{
pgmbase(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(olds_mem)
+ m_maincpu->set_addrmap(AS_PROGRAM, &pgm_028_025_state::olds_mem);
IGS025(config, m_igs025, 0);
m_igs025->set_external_cb(FUNC(pgm_028_025_state::igs025_to_igs028_callback), this);
@@ -198,7 +198,7 @@ MACHINE_CONFIG_START(pgm_028_025_state::pgm_028_025_ol)
IGS028(config, m_igs028, 0);
MCFG_MACHINE_RESET_OVERRIDE(pgm_028_025_state,olds)
-MACHINE_CONFIG_END
+}
INPUT_PORTS_START( olds )
diff --git a/src/mame/machine/pgmprot_igs027a_type1.cpp b/src/mame/machine/pgmprot_igs027a_type1.cpp
index 151f2def734..54a2bbd72dc 100644
--- a/src/mame/machine/pgmprot_igs027a_type1.cpp
+++ b/src/mame/machine/pgmprot_igs027a_type1.cpp
@@ -215,38 +215,37 @@ MACHINE_START_MEMBER(pgm_arm_type1_state,pgm_arm_type1)
save_item(NAME(m_slots));
}
-MACHINE_CONFIG_START(pgm_arm_type1_state::pgm_arm_type1_cave)
+void pgm_arm_type1_state::pgm_arm_type1_cave(machine_config &config)
+{
pgmbase(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(cavepgm_mem)
+ m_maincpu->set_addrmap(AS_PROGRAM, &pgm_arm_type1_state::cavepgm_mem);
MCFG_MACHINE_START_OVERRIDE(pgm_arm_type1_state, pgm_arm_type1 )
- MCFG_SCREEN_MODIFY("screen")
- MCFG_SCREEN_REFRESH_RATE(59.17) // verified on pcb
-MACHINE_CONFIG_END
+ subdevice<screen_device>("screen")->set_refresh_hz(59.17); // verified on pcb
+}
-MACHINE_CONFIG_START(pgm_arm_type1_state::pgm_arm_type1_sim)
+void pgm_arm_type1_state::pgm_arm_type1_sim(machine_config &config)
+{
pgm_arm_type1_cave(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(kov_sim_map)
+ m_maincpu->set_addrmap(AS_PROGRAM, &pgm_arm_type1_state::kov_sim_map);
/* protection CPU */
- MCFG_DEVICE_ADD("prot", ARM7, 20000000 ) // 55857E?
- MCFG_DEVICE_PROGRAM_MAP(_55857E_arm7_map)
- MCFG_DEVICE_DISABLE()
-MACHINE_CONFIG_END
+ ARM7(config, m_prot, 20000000); // 55857E?
+ m_prot->set_addrmap(AS_PROGRAM, &pgm_arm_type1_state::_55857E_arm7_map);
+ m_prot->set_disable();
+}
-MACHINE_CONFIG_START(pgm_arm_type1_state::pgm_arm_type1)
+void pgm_arm_type1_state::pgm_arm_type1(machine_config &config)
+{
pgm_arm_type1_cave(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(kov_map)
+ m_maincpu->set_addrmap(AS_PROGRAM, &pgm_arm_type1_state::kov_map);
/* protection CPU */
- MCFG_DEVICE_ADD("prot", ARM7, 20000000) // 55857E?
- MCFG_DEVICE_PROGRAM_MAP(_55857E_arm7_map)
-MACHINE_CONFIG_END
+ ARM7(config, m_prot, 20000000); // 55857E?
+ m_prot->set_addrmap(AS_PROGRAM, &pgm_arm_type1_state::_55857E_arm7_map);
+}
void pgm_arm_type1_state::pgm_arm7_type1_latch_init()
{
diff --git a/src/mame/machine/pgmprot_igs027a_type2.cpp b/src/mame/machine/pgmprot_igs027a_type2.cpp
index fde207c1582..40f23f438a3 100644
--- a/src/mame/machine/pgmprot_igs027a_type2.cpp
+++ b/src/mame/machine/pgmprot_igs027a_type2.cpp
@@ -132,18 +132,18 @@ MACHINE_START_MEMBER(pgm_arm_type2_state,pgm_arm_type2)
/******* ARM 55857F *******/
-MACHINE_CONFIG_START(pgm_arm_type2_state::pgm_arm_type2)
+void pgm_arm_type2_state::pgm_arm_type2(machine_config &config)
+{
pgmbase(config);
MCFG_MACHINE_START_OVERRIDE(pgm_arm_type2_state, pgm_arm_type2 )
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(kov2_mem)
+ m_maincpu->set_addrmap(AS_PROGRAM, &pgm_arm_type2_state::kov2_mem);
/* protection CPU */
- MCFG_DEVICE_ADD("prot", ARM7, 20000000) // 55857F
- MCFG_DEVICE_PROGRAM_MAP(_55857F_arm7_map)
-MACHINE_CONFIG_END
+ ARM7(config, m_prot, 20000000); // 55857F
+ m_prot->set_addrmap(AS_PROGRAM, &pgm_arm_type2_state::_55857F_arm7_map);
+}
diff --git a/src/mame/machine/pgmprot_igs027a_type3.cpp b/src/mame/machine/pgmprot_igs027a_type3.cpp
index a1ff65d223a..cea87b7fcab 100644
--- a/src/mame/machine/pgmprot_igs027a_type3.cpp
+++ b/src/mame/machine/pgmprot_igs027a_type3.cpp
@@ -190,20 +190,20 @@ MACHINE_START_MEMBER(pgm_arm_type3_state,pgm_arm_type3)
/******* ARM 55857G *******/
-MACHINE_CONFIG_START(pgm_arm_type3_state::pgm_arm_type3)
+void pgm_arm_type3_state::pgm_arm_type3(machine_config &config)
+{
pgmbase(config);
MCFG_MACHINE_START_OVERRIDE(pgm_arm_type3_state, pgm_arm_type3 )
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(svg_68k_mem)
+ m_maincpu->set_addrmap(AS_PROGRAM, &pgm_arm_type3_state::svg_68k_mem);
/* protection CPU */
- MCFG_DEVICE_ADD("prot", ARM7, XTAL(33'000'000)) // 55857G - 33Mhz Xtal, at least on SVG
- MCFG_DEVICE_PROGRAM_MAP(_55857G_arm7_map)
+ ARM7(config, m_prot, XTAL(33'000'000)); // 55857G - 33Mhz Xtal, at least on SVG
+ m_prot->set_addrmap(AS_PROGRAM, &pgm_arm_type3_state::_55857G_arm7_map);
MCFG_MACHINE_RESET_OVERRIDE(pgm_arm_type3_state, pgm_arm_type3_reset)
-MACHINE_CONFIG_END
+}
diff --git a/src/mame/machine/pgmprot_orlegend.cpp b/src/mame/machine/pgmprot_orlegend.cpp
index 65e10823144..1b3460530bd 100644
--- a/src/mame/machine/pgmprot_orlegend.cpp
+++ b/src/mame/machine/pgmprot_orlegend.cpp
@@ -220,6 +220,7 @@ INPUT_PORTS_START( orlegendk )
INPUT_PORTS_END
-MACHINE_CONFIG_START(pgm_asic3_state::pgm_asic3)
+void pgm_asic3_state::pgm_asic3(machine_config &config)
+{
pgmbase(config);
-MACHINE_CONFIG_END
+}
diff --git a/src/mame/machine/poly.cpp b/src/mame/machine/poly.cpp
index f25e0e3d21f..cb8d7a35959 100644
--- a/src/mame/machine/poly.cpp
+++ b/src/mame/machine/poly.cpp
@@ -157,12 +157,12 @@ WRITE8_MEMBER(poly_state::baud_rate_w )
READ8_MEMBER(poly_state::network_r)
{
- return m_adlc->read(space, offset >> 1);
+ return m_adlc->read(offset >> 1);
}
WRITE8_MEMBER(poly_state::network_w)
{
- m_adlc->write(space, offset >> 1, data);
+ m_adlc->write(offset >> 1, data);
}
WRITE_LINE_MEMBER(poly_state::network_clk_w)
diff --git a/src/mame/machine/qimi.cpp b/src/mame/machine/qimi.cpp
index 00bbc5fc209..dba7bd9ee59 100644
--- a/src/mame/machine/qimi.cpp
+++ b/src/mame/machine/qimi.cpp
@@ -139,7 +139,7 @@ void qimi_device::device_reset()
// read -
//-------------------------------------------------
-uint8_t qimi_device::read(address_space &space, offs_t offset, uint8_t data)
+uint8_t qimi_device::read(offs_t offset, uint8_t data)
{
switch (offset)
{
@@ -169,8 +169,10 @@ uint8_t qimi_device::read(address_space &space, offs_t offset, uint8_t data)
// write -
//-------------------------------------------------
-WRITE8_MEMBER( qimi_device::write )
+void qimi_device::write(offs_t offset, uint8_t data)
{
+ (void)data;
+
// write to 0x1bfbe resets int status
if (offset == 0x1bfbe)
{
diff --git a/src/mame/machine/qimi.h b/src/mame/machine/qimi.h
index 1c4f89dff55..033d8d7bc7a 100644
--- a/src/mame/machine/qimi.h
+++ b/src/mame/machine/qimi.h
@@ -29,8 +29,8 @@ public:
// optional information overrides
virtual ioport_constructor device_input_ports() const override;
- uint8_t read(address_space &space, offs_t offset, uint8_t data);
- DECLARE_WRITE8_MEMBER( write );
+ uint8_t read(offs_t offset, uint8_t data);
+ void write(offs_t offset, uint8_t data);
DECLARE_INPUT_CHANGED_MEMBER( mouse_x_changed );
DECLARE_INPUT_CHANGED_MEMBER( mouse_y_changed );
diff --git a/src/mame/machine/qix.cpp b/src/mame/machine/qix.cpp
index 453098d32c0..8cc23584abf 100644
--- a/src/mame/machine/qix.cpp
+++ b/src/mame/machine/qix.cpp
@@ -228,7 +228,7 @@ WRITE8_MEMBER(qixmcu_state::mcu_portb_w)
TIMER_CALLBACK_MEMBER(qix_state::pia_w_callback)
{
- m_pia0->write(generic_space(), param >> 8, param & 0xff);
+ m_pia0->write(param >> 8, param & 0xff);
}
diff --git a/src/mame/machine/rad_eu3a05gpio.h b/src/mame/machine/rad_eu3a05gpio.h
index b7d55ad2ef4..a46a654d09d 100644
--- a/src/mame/machine/rad_eu3a05gpio.h
+++ b/src/mame/machine/rad_eu3a05gpio.h
@@ -1,8 +1,8 @@
// license:BSD-3-Clause
// copyright-holders:David Haywood
-#ifndef MAME_AUDIO_RAD_EU3A05GPIO_H
-#define MAME_AUDIO_RAD_EU3A05GPIO_H
+#ifndef MAME_MACHINE_RAD_EU3A05GPIO_H
+#define MAME_MACHINE_RAD_EU3A05GPIO_H
class radica6502_gpio_device : public device_t
@@ -40,4 +40,4 @@ private:
DECLARE_DEVICE_TYPE(RADICA6502_GPIO, radica6502_gpio_device)
-#endif // MAME_AUDIO_RAD_EU3A05GPIO_H
+#endif // MAME_MACHINE_RAD_EU3A05GPIO_H
diff --git a/src/mame/machine/radio86.cpp b/src/mame/machine/radio86.cpp
index 759020dab81..f15da84afdc 100644
--- a/src/mame/machine/radio86.cpp
+++ b/src/mame/machine/radio86.cpp
@@ -177,7 +177,7 @@ READ8_MEMBER(radio86_state::radio86rom_romdisk_porta_r)
{
uint16_t addr = (m_romdisk_msb << 8) | m_romdisk_lsb;
if (m_cart->exists() && addr < m_cart->get_rom_size())
- return m_cart->read_rom(space, addr);
+ return m_cart->read_rom(addr);
else
return 0xff;
}
diff --git a/src/mame/machine/rx01.cpp b/src/mame/machine/rx01.cpp
index 06f74f56b02..b98bd78fd7c 100644
--- a/src/mame/machine/rx01.cpp
+++ b/src/mame/machine/rx01.cpp
@@ -53,9 +53,10 @@ rx01_device::rx01_device(const machine_config &mconfig, const char *tag, device_
// device_add_mconfig - add device configuration
//-------------------------------------------------
-MACHINE_CONFIG_START(rx01_device::device_add_mconfig)
- MCFG_LEGACY_FLOPPY_2_DRIVES_ADD(rx01_floppy_interface)
-MACHINE_CONFIG_END
+void rx01_device::device_add_mconfig(machine_config &config)
+{
+ legacy_floppy_image_device::add_2drives(config, &rx01_floppy_interface);
+}
//-------------------------------------------------
// device_start - device-specific startup
diff --git a/src/mame/machine/s32comm.cpp b/src/mame/machine/s32comm.cpp
index 761e0a14981..5015d445f7d 100644
--- a/src/mame/machine/s32comm.cpp
+++ b/src/mame/machine/s32comm.cpp
@@ -84,8 +84,9 @@ DEFINE_DEVICE_TYPE(S32COMM, s32comm_device, "s32comm", "System 32 Communication
// device_add_mconfig - add device configuration
//-------------------------------------------------
-MACHINE_CONFIG_START(s32comm_device::device_add_mconfig)
-MACHINE_CONFIG_END
+void s32comm_device::device_add_mconfig(machine_config &config)
+{
+}
//**************************************************************************
// LIVE DEVICE
diff --git a/src/mame/machine/saturn_cdb.cpp b/src/mame/machine/saturn_cdb.cpp
index cd7662e7a64..e31761bdd2f 100644
--- a/src/mame/machine/saturn_cdb.cpp
+++ b/src/mame/machine/saturn_cdb.cpp
@@ -28,11 +28,12 @@ void saturn_cdb_device::saturn_cdb_map(address_map &map)
map(0x00000000, 0x0000ffff).rom();
}
-MACHINE_CONFIG_START(saturn_cdb_device::device_add_mconfig)
- MCFG_DEVICE_ADD("cdbcpu", SH1, DERIVED_CLOCK(1, 1))
- MCFG_DEVICE_PROGRAM_MAP(saturn_cdb_map)
- MCFG_DEVICE_DISABLE() // we're not actually using the CD Block ROM for now
-MACHINE_CONFIG_END
+void saturn_cdb_device::device_add_mconfig(machine_config &config)
+{
+ sh1_device &cdbcpu(SH1(config, "cdbcpu", DERIVED_CLOCK(1, 1)));
+ cdbcpu.set_addrmap(AS_PROGRAM, &saturn_cdb_device::saturn_cdb_map);
+ cdbcpu.set_disable(); // we're not actually using the CD Block ROM for now
+}
ROM_START( satcdb )
ROM_REGION( 0x10000, "cdbcpu", 0 )
diff --git a/src/mame/machine/segaic16.cpp b/src/mame/machine/segaic16.cpp
index 5f80c323933..2cdf44af85b 100644
--- a/src/mame/machine/segaic16.cpp
+++ b/src/mame/machine/segaic16.cpp
@@ -129,9 +129,9 @@ void sega_16bit_common_base::palette_init()
int i2 = (value >> 2) & 1;
int i1 = (value >> 1) & 1;
int i0 = (value >> 0) & 1;
- m_palette_normal[value] = combine_6_weights(weights_normal, i0, i1, i2, i3, i4, 0);
- m_palette_shadow[value] = combine_6_weights(weights_sh, i0, i1, i2, i3, i4, 0);
- m_palette_hilight[value] = combine_6_weights(weights_sh, i0, i1, i2, i3, i4, 1);
+ m_palette_normal[value] = combine_weights(weights_normal, i0, i1, i2, i3, i4, 0);
+ m_palette_shadow[value] = combine_weights(weights_sh, i0, i1, i2, i3, i4, 0);
+ m_palette_hilight[value] = combine_weights(weights_sh, i0, i1, i2, i3, i4, 1);
}
}
diff --git a/src/mame/machine/seicopbl.cpp b/src/mame/machine/seicopbl.cpp
index b6db3793117..b36f8130c90 100644
--- a/src/mame/machine/seicopbl.cpp
+++ b/src/mame/machine/seicopbl.cpp
@@ -407,7 +407,7 @@ seibu_cop_bootleg_device::seibu_cop_bootleg_device(const machine_config &mconfig
: device_t(mconfig, SEIBU_COP_BOOTLEG, tag, owner, clock),
device_memory_interface(mconfig, *this),
m_host_cpu(*this, finder_base::DUMMY_TAG),
- m_space_config("regs", ENDIANNESS_BIG, 16, 9, 0, address_map_constructor(), address_map_constructor(FUNC(seibu_cop_bootleg_device::seibucopbl_map), this))
+ m_space_config("regs", ENDIANNESS_BIG, 16, 9, 0, address_map_constructor(FUNC(seibu_cop_bootleg_device::seibucopbl_map), this))
{
}
diff --git a/src/mame/machine/sgi.cpp b/src/mame/machine/sgi.cpp
index 2172f9b5969..629aa753a77 100644
--- a/src/mame/machine/sgi.cpp
+++ b/src/mame/machine/sgi.cpp
@@ -10,7 +10,6 @@
#include "emu.h"
#include "sgi.h"
-#include "cpu/mips/mips3.h"
#define LOG_UNKNOWN (1 << 0)
#define LOG_READS (1 << 1)
@@ -20,6 +19,7 @@
#define LOG_MEMCFG (1 << 5)
#define LOG_MEMCFG_EXT (1 << 6)
#define LOG_EEPROM (1 << 7)
+#define LOG_DMA (1 << 8)
#define LOG_DEFAULT (LOG_READS | LOG_WRITES | LOG_RPSS | LOG_WATCHDOG | LOG_UNKNOWN)
#define VERBOSE (0)
@@ -31,7 +31,9 @@ sgi_mc_device::sgi_mc_device(const machine_config &mconfig, const char *tag, dev
: device_t(mconfig, SGI_MC, tag, owner, clock)
, m_maincpu(*this, finder_base::DUMMY_TAG)
, m_eeprom(*this, finder_base::DUMMY_TAG)
+ , m_hpc3(*this, finder_base::DUMMY_TAG)
, m_rpss_timer(nullptr)
+ , m_dma_timer(nullptr)
, m_watchdog(0)
, m_sys_id(0)
, m_rpss_divider(0)
@@ -53,14 +55,6 @@ sgi_mc_device::sgi_mc_device(const machine_config &mconfig, const char *tag, dev
, m_gio64_substitute_bits(0)
, m_dma_int_cause(0)
, m_dma_control(0)
- , m_dma_tlb_entry0_hi(0)
- , m_dma_tlb_entry0_lo(0)
- , m_dma_tlb_entry1_hi(0)
- , m_dma_tlb_entry1_lo(0)
- , m_dma_tlb_entry2_hi(0)
- , m_dma_tlb_entry2_lo(0)
- , m_dma_tlb_entry3_hi(0)
- , m_dma_tlb_entry3_lo(0)
, m_rpss_counter(0)
, m_dma_mem_addr(0)
, m_dma_size(0)
@@ -68,7 +62,7 @@ sgi_mc_device::sgi_mc_device(const machine_config &mconfig, const char *tag, dev
, m_dma_gio64_addr(0)
, m_dma_mode(0)
, m_dma_count(0)
- , m_dma_running(0)
+ , m_dma_run(0)
, m_eeprom_ctrl(0)
, m_rpss_divide_counter(0)
, m_rpss_divide_count(0)
@@ -85,16 +79,19 @@ void sgi_mc_device::device_start()
// if Indigo2, ID appropriately
if (!strcmp(machine().system().name, "ip244415"))
{
- m_sys_id = 0x12; // rev. C MC, EISA bus present
+ m_sys_id = 0x13; // rev. C MC, EISA bus present
}
else
{
- m_sys_id = 0x02; // rev. C MC, no EISA bus
+ m_sys_id = 0x03; // rev. C MC, no EISA bus
}
m_rpss_timer = timer_alloc(TIMER_RPSS);
m_rpss_timer->adjust(attotime::never);
+ m_dma_timer = timer_alloc(TIMER_DMA);
+ m_dma_timer->adjust(attotime::never);
+
save_item(NAME(m_cpu_control));
save_item(NAME(m_watchdog));
save_item(NAME(m_sys_id));
@@ -118,14 +115,8 @@ void sgi_mc_device::device_start()
save_item(NAME(m_gio64_substitute_bits));
save_item(NAME(m_dma_int_cause));
save_item(NAME(m_dma_control));
- save_item(NAME(m_dma_tlb_entry0_hi));
- save_item(NAME(m_dma_tlb_entry0_lo));
- save_item(NAME(m_dma_tlb_entry1_hi));
- save_item(NAME(m_dma_tlb_entry1_lo));
- save_item(NAME(m_dma_tlb_entry2_hi));
- save_item(NAME(m_dma_tlb_entry2_lo));
- save_item(NAME(m_dma_tlb_entry3_hi));
- save_item(NAME(m_dma_tlb_entry3_lo));
+ save_item(NAME(m_dma_tlb_entry_hi));
+ save_item(NAME(m_dma_tlb_entry_lo));
save_item(NAME(m_rpss_counter));
save_item(NAME(m_dma_mem_addr));
save_item(NAME(m_dma_size));
@@ -133,7 +124,7 @@ void sgi_mc_device::device_start()
save_item(NAME(m_dma_gio64_addr));
save_item(NAME(m_dma_mode));
save_item(NAME(m_dma_count));
- save_item(NAME(m_dma_running));
+ save_item(NAME(m_dma_run));
save_item(NAME(m_eeprom_ctrl));
save_item(NAME(m_semaphore));
save_item(NAME(m_rpss_divide_counter));
@@ -167,14 +158,11 @@ void sgi_mc_device::device_reset()
m_gio64_substitute_bits = 0;
m_dma_int_cause = 0;
m_dma_control = 0;
- m_dma_tlb_entry0_hi = 0;
- m_dma_tlb_entry0_lo = 0;
- m_dma_tlb_entry1_hi = 0;
- m_dma_tlb_entry1_lo = 0;
- m_dma_tlb_entry2_hi = 0;
- m_dma_tlb_entry2_lo = 0;
- m_dma_tlb_entry3_hi = 0;
- m_dma_tlb_entry3_lo = 0;
+ for (int i = 0; i < 4; i++)
+ {
+ m_dma_tlb_entry_hi[i] = 0;
+ m_dma_tlb_entry_lo[i] = 0;
+ }
m_rpss_counter = 0;
m_dma_mem_addr = 0;
m_dma_size = 0;
@@ -182,13 +170,15 @@ void sgi_mc_device::device_reset()
m_dma_gio64_addr = 0;
m_dma_mode = 0;
m_dma_count = 0;
- m_dma_running = 0;
+ m_dma_run = 0;
m_eeprom_ctrl = 0;
memset(m_semaphore, 0, sizeof(uint32_t) * 16);
m_rpss_timer->adjust(attotime::from_hz(10000000), 0, attotime::from_hz(10000000));
m_rpss_divide_counter = 4;
m_rpss_divide_count = 4;
m_rpss_increment = 1;
+
+ m_space = &m_maincpu->space(AS_PROGRAM);
}
void sgi_mc_device::set_cpu_buserr(uint32_t address)
@@ -201,6 +191,107 @@ void sgi_mc_device::set_cpu_buserr(uint32_t address)
m_cpu_error_status |= 0x0000000f;
}
+uint32_t sgi_mc_device::dma_translate(uint32_t address)
+{
+ for (int entry = 0; entry < 4; entry++)
+ {
+ if ((address & 0xffe00000) == (m_dma_tlb_entry_hi[entry] & 0xffe00000))
+ {
+ const uint32_t vpn_lo = (address & 0x001ff000) >> 12;
+ const uint32_t pte = m_space->read_dword(((m_dma_tlb_entry_lo[entry] & 0x003fffc0) << 6) + (vpn_lo << 2));
+ const uint32_t offset = address & 0xfff;
+ return ((pte & 0x03ffffc0) << 6) + offset;
+ }
+ }
+ return 0;
+}
+
+void sgi_mc_device::dma_tick()
+{
+ uint32_t addr = m_dma_mem_addr;
+ if (m_dma_control & (1 << 8))
+ { // Enable virtual address translation
+ addr = dma_translate(addr);
+ }
+
+ if (m_dma_mode & (1 << 1))
+ { // Graphics to host
+ if (m_dma_mode & (1 << 3))
+ { // Fill mode
+ m_space->write_dword(addr, m_dma_gio64_addr);
+ m_dma_count -= 4;
+ }
+ else
+ {
+ const uint32_t remaining = m_dma_count & 0x0000ffff;
+ uint32_t length = 8;
+ uint64_t shift = 56;
+ if (remaining < 8)
+ length = remaining;
+
+ uint64_t data = m_space->read_qword(m_dma_gio64_addr);
+ for (uint32_t i = 0; i < length; i++)
+ {
+ m_space->write_byte(addr, (uint8_t)(data >> shift));
+ addr++;
+ shift -= 8;
+ }
+
+ m_dma_mem_addr += length;
+ m_dma_count -= length;
+ }
+ }
+ else
+ { // Host to graphics
+ const uint32_t remaining = m_dma_count & 0x0000ffff;
+ uint32_t length = 8;
+ uint64_t shift = 56;
+ if (remaining < 8)
+ length = remaining;
+
+ uint64_t data = 0;
+ for (uint32_t i = 0; i < length; i++)
+ {
+ data |= (uint64_t)m_space->read_byte(addr) << shift;
+ addr++;
+ shift -= 8;
+ }
+
+ m_space->write_qword(m_dma_gio64_addr, data);
+ m_dma_mem_addr += length;
+ m_dma_count -= length;
+ }
+
+ if ((m_dma_count & 0x0000ffff) == 0)
+ { // If remaining byte count is 0, deduct zoom count
+ m_dma_count -= 0x00010000;
+ if (m_dma_count == 0)
+ { // If remaining zoom count is also 0, move to next line
+ m_dma_mem_addr += m_dma_stride & 0x0000ffff;
+ m_dma_size -= 0x00010000;
+ if ((m_dma_size & 0xffff0000) == 0)
+ { // If no remaining lines, DMA is done.
+ m_dma_timer->adjust(attotime::never);
+ m_dma_run |= (1 << 3);
+ m_dma_run &= ~(1 << 6);
+ if (BIT(m_dma_control, 4))
+ {
+ m_hpc3->raise_local_irq(3, 1 << 4);
+ }
+ }
+ else
+ {
+ m_dma_count = (m_dma_stride & 0x03ff0000) | (m_dma_size & 0x0000ffff);
+ }
+ }
+ else
+ { // If remaining zoom count is non-zero, reload byte count and return source address to the beginning of the line.
+ m_dma_count |= m_dma_size & 0x0000ffff;
+ m_dma_mem_addr -= m_dma_size & 0x0000ffff;
+ }
+ }
+}
+
READ32_MEMBER(sgi_mc_device::read)
{
switch (offset & ~1)
@@ -284,72 +375,69 @@ READ32_MEMBER(sgi_mc_device::read)
LOGMASKED(LOG_READS, "%s: GIO64 Translation Address Substitution Bits Read: %08x & %08x\n", machine().describe_context(), m_gio64_substitute_bits, mem_mask);
return m_gio64_substitute_bits;
case 0x0160/4:
- LOGMASKED(LOG_READS, "%s: DMA Interrupt Cause: %08x & %08x\n", machine().describe_context(), m_dma_int_cause, mem_mask);
+ LOGMASKED(LOG_READS | LOG_DMA, "%s: DMA Interrupt Cause: %08x & %08x\n", machine().describe_context(), m_dma_int_cause, mem_mask);
return m_dma_int_cause;
case 0x0168/4:
- LOGMASKED(LOG_READS, "%s: DMA Control Read: %08x & %08x\n", machine().describe_context(), m_dma_control, mem_mask);
+ LOGMASKED(LOG_READS | LOG_DMA, "%s: DMA Control Read: %08x & %08x\n", machine().describe_context(), m_dma_control, mem_mask);
return m_dma_control;
case 0x0180/4:
- LOGMASKED(LOG_READS, "%s: DMA TLB Entry 0 High Read: %08x & %08x\n", machine().describe_context(), m_dma_tlb_entry0_hi, mem_mask);
- return m_dma_tlb_entry0_hi;
+ LOGMASKED(LOG_READS | LOG_DMA, "%s: DMA TLB Entry 0 High Read: %08x & %08x\n", machine().describe_context(), m_dma_tlb_entry_hi[0], mem_mask);
+ return m_dma_tlb_entry_hi[0];
case 0x0188/4:
- LOGMASKED(LOG_READS, "%s: DMA TLB Entry 0 Low Read: %08x & %08x\n", machine().describe_context(), m_dma_tlb_entry0_lo, mem_mask);
- return m_dma_tlb_entry0_lo;
+ LOGMASKED(LOG_READS | LOG_DMA, "%s: DMA TLB Entry 0 Low Read: %08x & %08x\n", machine().describe_context(), m_dma_tlb_entry_lo[0], mem_mask);
+ return m_dma_tlb_entry_lo[0];
case 0x0190/4:
- LOGMASKED(LOG_READS, "%s: DMA TLB Entry 1 High Read: %08x & %08x\n", machine().describe_context(), m_dma_tlb_entry1_hi, mem_mask);
- return m_dma_tlb_entry1_hi;
+ LOGMASKED(LOG_READS | LOG_DMA, "%s: DMA TLB Entry 1 High Read: %08x & %08x\n", machine().describe_context(), m_dma_tlb_entry_hi[1], mem_mask);
+ return m_dma_tlb_entry_hi[1];
case 0x0198/4:
- LOGMASKED(LOG_READS, "%s: DMA TLB Entry 1 Low Read: %08x & %08x\n", machine().describe_context(), m_dma_tlb_entry1_lo, mem_mask);
- return m_dma_tlb_entry1_lo;
+ LOGMASKED(LOG_READS | LOG_DMA, "%s: DMA TLB Entry 1 Low Read: %08x & %08x\n", machine().describe_context(), m_dma_tlb_entry_lo[1], mem_mask);
+ return m_dma_tlb_entry_lo[1];
case 0x01a0/4:
- LOGMASKED(LOG_READS, "%s: DMA TLB Entry 2 High Read: %08x & %08x\n", machine().describe_context(), m_dma_tlb_entry2_hi, mem_mask);
- return m_dma_tlb_entry2_hi;
+ LOGMASKED(LOG_READS | LOG_DMA, "%s: DMA TLB Entry 2 High Read: %08x & %08x\n", machine().describe_context(), m_dma_tlb_entry_hi[2], mem_mask);
+ return m_dma_tlb_entry_hi[2];
case 0x01a8/4:
- LOGMASKED(LOG_READS, "%s: DMA TLB Entry 2 Low Read: %08x & %08x\n", machine().describe_context(), m_dma_tlb_entry2_lo, mem_mask);
- return m_dma_tlb_entry2_lo;
+ LOGMASKED(LOG_READS | LOG_DMA, "%s: DMA TLB Entry 2 Low Read: %08x & %08x\n", machine().describe_context(), m_dma_tlb_entry_lo[2], mem_mask);
+ return m_dma_tlb_entry_lo[2];
case 0x01b0/4:
- LOGMASKED(LOG_READS, "%s: DMA TLB Entry 3 High Read: %08x & %08x\n", machine().describe_context(), m_dma_tlb_entry3_hi, mem_mask);
- return m_dma_tlb_entry3_hi;
+ LOGMASKED(LOG_READS | LOG_DMA, "%s: DMA TLB Entry 3 High Read: %08x & %08x\n", machine().describe_context(), m_dma_tlb_entry_hi[3], mem_mask);
+ return m_dma_tlb_entry_hi[3];
case 0x01b8/4:
- LOGMASKED(LOG_READS, "%s: DMA TLB Entry 3 Low Read: %08x & %08x\n", machine().describe_context(), m_dma_tlb_entry3_lo, mem_mask);
- return m_dma_tlb_entry3_lo;
+ LOGMASKED(LOG_READS | LOG_DMA, "%s: DMA TLB Entry 3 Low Read: %08x & %08x\n", machine().describe_context(), m_dma_tlb_entry_lo[3], mem_mask);
+ return m_dma_tlb_entry_lo[3];
case 0x1000/4:
LOGMASKED(LOG_RPSS, "%s: RPSS 100ns Counter Read: %08x & %08x\n", machine().describe_context(), m_rpss_counter, mem_mask);
return m_rpss_counter;
case 0x2000/4:
case 0x2008/4:
- LOGMASKED(LOG_READS, "%s: DMA Memory Address Read: %08x & %08x\n", machine().describe_context(), m_dma_mem_addr, mem_mask);
+ LOGMASKED(LOG_READS | LOG_DMA, "%s: DMA Memory Address Read: %08x & %08x\n", machine().describe_context(), m_dma_mem_addr, mem_mask);
return m_dma_mem_addr;
case 0x2010/4:
- LOGMASKED(LOG_READS, "%s: DMA Line Count and Width Read: %08x & %08x\n", machine().describe_context(), m_dma_size, mem_mask);
+ LOGMASKED(LOG_READS | LOG_DMA, "%s: DMA Line Count and Width Read: %08x & %08x\n", machine().describe_context(), m_dma_size, mem_mask);
return m_dma_size;
case 0x2018/4:
- LOGMASKED(LOG_READS, "%s: DMA Line Zoom and Stride Read: %08x & %08x\n", machine().describe_context(), m_dma_stride, mem_mask);
+ LOGMASKED(LOG_READS | LOG_DMA, "%s: DMA Line Zoom and Stride Read: %08x & %08x\n", machine().describe_context(), m_dma_stride, mem_mask);
return m_dma_stride;
case 0x2020/4:
case 0x2028/4:
- LOGMASKED(LOG_READS, "%s: DMA GIO64 Address Read: %08x & %08x\n", machine().describe_context(), m_dma_gio64_addr, mem_mask);
+ LOGMASKED(LOG_READS | LOG_DMA, "%s: DMA GIO64 Address Read: %08x & %08x\n", machine().describe_context(), m_dma_gio64_addr, mem_mask);
return m_dma_gio64_addr;
case 0x2030/4:
- LOGMASKED(LOG_READS, "%s: DMA Mode Write: %08x & %08x\n", machine().describe_context(), m_dma_mode, mem_mask);
+ LOGMASKED(LOG_READS | LOG_DMA, "%s: DMA Mode Write: %08x & %08x\n", machine().describe_context(), m_dma_mode, mem_mask);
return m_dma_mode;
case 0x2038/4:
- LOGMASKED(LOG_READS, "%s: DMA Zoom Count Read: %08x & %08x\n", machine().describe_context(), m_dma_count, mem_mask);
+ LOGMASKED(LOG_READS | LOG_DMA, "%s: DMA Zoom Count Read: %08x & %08x\n", machine().describe_context(), m_dma_count, mem_mask);
return m_dma_count;
case 0x2040/4:
- LOGMASKED(LOG_READS, "%s: DMA Start Read\n", machine().describe_context());
+ LOGMASKED(LOG_READS | LOG_DMA, "%s: DMA Start Read\n", machine().describe_context());
return 0;
case 0x2048/4:
- LOGMASKED(LOG_READS, "%s: VDMA Running Read: %08x & %08x\n", machine().describe_context(), m_dma_running, mem_mask);
- if (m_dma_running == 1)
- {
- m_dma_running = 0;
- return 0x00000040;
- }
- else
+ {
+ if (!(m_dma_run & 0x40))
{
- return 0;
+ LOGMASKED(LOG_READS | LOG_DMA, "%s: DMA Run Read: %08x & %08x\n", machine().describe_context(), m_dma_run, mem_mask);
}
+ return m_dma_run;
+ }
case 0x10000/4:
case 0x11000/4:
case 0x12000/4:
@@ -458,12 +546,12 @@ WRITE32_MEMBER( sgi_mc_device::write )
break;
case 0x00e8/4:
LOGMASKED(LOG_WRITES, "%s: CPU Error Status Clear\n", machine().describe_context());
- m_maincpu->set_input_line(MIPS3_IRQ4, CLEAR_LINE);
+ m_maincpu->set_input_line(4, CLEAR_LINE);
m_cpu_error_status = 0;
break;
case 0x00f8/4:
LOGMASKED(LOG_WRITES, "%s: GIO Error Status Clear\n", machine().describe_context());
- m_maincpu->set_input_line(MIPS3_IRQ4, CLEAR_LINE);
+ m_maincpu->set_input_line(4, CLEAR_LINE);
m_gio_error_status = 0;
break;
case 0x0100/4:
@@ -487,89 +575,106 @@ WRITE32_MEMBER( sgi_mc_device::write )
m_gio64_substitute_bits = data;
break;
case 0x0160/4:
- LOGMASKED(LOG_WRITES, "%s: DMA Interrupt Cause Write: %08x & %08x\n", machine().describe_context(), data, mem_mask);
+ LOGMASKED(LOG_WRITES | LOG_DMA, "%s: DMA Interrupt Cause Write: %08x & %08x\n", machine().describe_context(), data, mem_mask);
m_dma_int_cause = data;
break;
case 0x0168/4:
- LOGMASKED(LOG_WRITES, "%s: DMA Control Write: %08x & %08x\n", machine().describe_context(), data, mem_mask);
+ LOGMASKED(LOG_WRITES | LOG_DMA, "%s: DMA Control Write: %08x & %08x\n", machine().describe_context(), data, mem_mask);
m_dma_control = data;
+ if (!BIT(m_dma_control, 4) && m_hpc3)
+ {
+ m_hpc3->lower_local_irq(3, 1 << 4);
+ }
break;
case 0x0180/4:
- LOGMASKED(LOG_WRITES, "%s: DMA TLB Entry 0 High Write: %08x & %08x\n", machine().describe_context(), data, mem_mask);
- m_dma_tlb_entry0_hi = data;
+ LOGMASKED(LOG_WRITES | LOG_DMA, "%s: DMA TLB Entry 0 High Write: %08x & %08x\n", machine().describe_context(), data, mem_mask);
+ m_dma_tlb_entry_hi[0] = data;
break;
case 0x0188/4:
- LOGMASKED(LOG_WRITES, "%s: DMA TLB Entry 0 Low Write: %08x & %08x\n", machine().describe_context(), data, mem_mask);
- m_dma_tlb_entry0_lo = data;
+ LOGMASKED(LOG_WRITES | LOG_DMA, "%s: DMA TLB Entry 0 Low Write: %08x & %08x\n", machine().describe_context(), data, mem_mask);
+ m_dma_tlb_entry_lo[0] = data;
break;
case 0x0190/4:
- LOGMASKED(LOG_WRITES, "%s: DMA TLB Entry 1 High Write: %08x & %08x\n", machine().describe_context(), data, mem_mask);
- m_dma_tlb_entry1_hi = data;
+ LOGMASKED(LOG_WRITES | LOG_DMA, "%s: DMA TLB Entry 1 High Write: %08x & %08x\n", machine().describe_context(), data, mem_mask);
+ m_dma_tlb_entry_hi[1] = data;
break;
case 0x0198/4:
- LOGMASKED(LOG_WRITES, "%s: DMA TLB Entry 1 Low Write: %08x & %08x\n", machine().describe_context(), data, mem_mask);
- m_dma_tlb_entry1_lo = data;
+ LOGMASKED(LOG_WRITES | LOG_DMA, "%s: DMA TLB Entry 1 Low Write: %08x & %08x\n", machine().describe_context(), data, mem_mask);
+ m_dma_tlb_entry_lo[1] = data;
break;
case 0x01a0/4:
- LOGMASKED(LOG_WRITES, "%s: DMA TLB Entry 2 High Write: %08x & %08x\n", machine().describe_context(), data, mem_mask);
- m_dma_tlb_entry2_hi = data;
+ LOGMASKED(LOG_WRITES | LOG_DMA, "%s: DMA TLB Entry 2 High Write: %08x & %08x\n", machine().describe_context(), data, mem_mask);
+ m_dma_tlb_entry_hi[2] = data;
break;
case 0x01a8/4:
- LOGMASKED(LOG_WRITES, "%s: DMA TLB Entry 2 Low Write: %08x & %08x\n", machine().describe_context(), data, mem_mask);
- m_dma_tlb_entry2_lo = data;
+ LOGMASKED(LOG_WRITES | LOG_DMA, "%s: DMA TLB Entry 2 Low Write: %08x & %08x\n", machine().describe_context(), data, mem_mask);
+ m_dma_tlb_entry_lo[2] = data;
break;
case 0x01b0/4:
- LOGMASKED(LOG_WRITES, "%s: DMA TLB Entry 3 High Write: %08x & %08x\n", machine().describe_context(), data, mem_mask);
- m_dma_tlb_entry3_hi = data;
+ LOGMASKED(LOG_WRITES | LOG_DMA, "%s: DMA TLB Entry 3 High Write: %08x & %08x\n", machine().describe_context(), data, mem_mask);
+ m_dma_tlb_entry_hi[3] = data;
break;
case 0x01b8/4:
- LOGMASKED(LOG_WRITES, "%s: DMA TLB Entry 3 Low Write: %08x & %08x\n", machine().describe_context(), data, mem_mask);
- m_dma_tlb_entry3_lo = data;
+ LOGMASKED(LOG_WRITES | LOG_DMA, "%s: DMA TLB Entry 3 Low Write: %08x & %08x\n", machine().describe_context(), data, mem_mask);
+ m_dma_tlb_entry_lo[3] = data;
break;
case 0x2000/4:
- LOGMASKED(LOG_WRITES, "%s: DMA Memory Address Write: %08x & %08x\n", machine().describe_context(), data, mem_mask);
+ LOGMASKED(LOG_WRITES | LOG_DMA, "%s: DMA Memory Address Write: %08x & %08x\n", machine().describe_context(), data, mem_mask);
m_dma_mem_addr = data;
break;
case 0x2008/4:
- LOGMASKED(LOG_WRITES, "%s: DMA Memory Address + Default Params Write: %08x & %08x\n", machine().describe_context(), data, mem_mask);
+ LOGMASKED(LOG_WRITES | LOG_DMA, "%s: DMA Memory Address + Default Params Write: %08x & %08x\n", machine().describe_context(), data, mem_mask);
m_dma_mem_addr = data;
break;
case 0x2010/4:
- LOGMASKED(LOG_WRITES, "%s: DMA Line Count and Width Write: %08x & %08x\n", machine().describe_context(), data, mem_mask);
+ LOGMASKED(LOG_WRITES | LOG_DMA, "%s: DMA Line Count and Width Write: %08x & %08x\n", machine().describe_context(), data, mem_mask);
+ m_dma_count &= 0xffff0000;
+ m_dma_count |= data & 0x0000ffff;
m_dma_size = data;
break;
case 0x2018/4:
- LOGMASKED(LOG_WRITES, "%s: DMA Line Zoom and Stride Write: %08x & %08x\n", machine().describe_context(), data, mem_mask);
+ LOGMASKED(LOG_WRITES | LOG_DMA, "%s: DMA Line Zoom and Stride Write: %08x & %08x\n", machine().describe_context(), data, mem_mask);
+ m_dma_count &= 0x0000ffff;
+ m_dma_count |= data & 0x03ff0000;
m_dma_stride = data;
break;
case 0x2020/4:
- LOGMASKED(LOG_WRITES, "%s: DMA GIO64 Address Write: %08x & %08x\n", machine().describe_context(), data, mem_mask);
+ LOGMASKED(LOG_WRITES | LOG_DMA, "%s: DMA GIO64 Address Write: %08x & %08x\n", machine().describe_context(), data, mem_mask);
m_dma_gio64_addr = data;
break;
case 0x2028/4:
- LOGMASKED(LOG_WRITES, "%s: DMA GIO64 Address Write + Start DMA: %08x & %08x\n", machine().describe_context(), data, mem_mask);
+ {
+ LOGMASKED(LOG_WRITES | LOG_DMA, "%s: DMA GIO64 Address Write + Start DMA: %08x & %08x\n", machine().describe_context(), data, mem_mask);
m_dma_gio64_addr = data;
- // Start DMA
- m_dma_running = 1;
+ m_dma_run |= 0x40;
+ m_dma_timer->adjust(attotime::from_hz(33333333), 0, attotime::from_hz(33333333));
break;
+ }
case 0x2030/4:
- LOGMASKED(LOG_WRITES, "%s: DMA Mode Write: %08x & %08x\n", machine().describe_context(), data, mem_mask);
+ LOGMASKED(LOG_WRITES | LOG_DMA, "%s: DMA Mode Write: %08x & %08x\n", machine().describe_context(), data, mem_mask);
m_dma_mode = data;
break;
case 0x2038/4:
- LOGMASKED(LOG_WRITES, "%s: DMA Zoom Count + Byte Count Write: %08x & %08x\n", machine().describe_context(), data, mem_mask);
+ LOGMASKED(LOG_WRITES | LOG_DMA, "%s: DMA Zoom Count + Byte Count Write: %08x & %08x\n", machine().describe_context(), data, mem_mask);
m_dma_count = data;
break;
case 0x2040/4:
- LOGMASKED(LOG_WRITES, "%s: DMA Start Write: %08x & %08x\n", machine().describe_context(), data, mem_mask);
- // Start DMA
- m_dma_running = 1;
+ LOGMASKED(LOG_WRITES | LOG_DMA, "%s: DMA Start Write: %08x & %08x\n", machine().describe_context(), data, mem_mask);
+ if (data & 1)
+ {
+ m_dma_run |= 0x40;
+ m_dma_timer->adjust(attotime::from_hz(33333333), 0, attotime::from_hz(33333333));
+ }
break;
case 0x2070/4:
- LOGMASKED(LOG_WRITES, "%s: DMA GIO64 Address Write + Default Params Write + Start DMA: %08x & %08x\n", machine().describe_context(), data, mem_mask);
+ LOGMASKED(LOG_WRITES | LOG_DMA, "%s: DMA GIO64 Address Write + Default Params Write + Start DMA: %08x & %08x\n", machine().describe_context(), data, mem_mask);
m_dma_gio64_addr = data;
- // Start DMA
- m_dma_running = 1;
+ m_dma_size = 0x0001000c;
+ m_dma_stride = 0x00010000;
+ m_dma_count = 0x0001000c;
+ m_dma_mode = 0x00000028;
+ m_dma_run |= 0x40;
+ m_dma_timer->adjust(attotime::from_hz(33333333), 0, attotime::from_hz(33333333));
break;
case 0x10000/4:
case 0x11000/4:
@@ -610,4 +715,11 @@ void sgi_mc_device::device_timer(emu_timer &timer, device_timer_id id, int param
m_rpss_counter += m_rpss_increment;
}
}
+ else if (id == TIMER_DMA)
+ {
+ while (m_dma_run & (1 << 6))
+ {
+ dma_tick();
+ }
+ }
}
diff --git a/src/mame/machine/sgi.h b/src/mame/machine/sgi.h
index 45937d6c649..73eb68561cd 100644
--- a/src/mame/machine/sgi.h
+++ b/src/mame/machine/sgi.h
@@ -14,10 +14,19 @@
#pragma once
#include "machine/eepromser.h"
+#include "machine/hpc3.h"
class sgi_mc_device : public device_t
{
public:
+ template <typename T, typename U, typename V>
+ sgi_mc_device(const machine_config &mconfig, const char *tag, device_t *owner, T &&cpu_tag, U &&eeprom_tag, V &&hpc3_tag)
+ : sgi_mc_device(mconfig, tag, owner, (uint32_t)0)
+ {
+ m_maincpu.set_tag(std::forward<T>(cpu_tag));
+ m_eeprom.set_tag(std::forward<U>(eeprom_tag));
+ m_hpc3.set_tag(std::forward<V>(hpc3_tag));
+ }
template <typename T, typename U>
sgi_mc_device(const machine_config &mconfig, const char *tag, device_t *owner, T &&cpu_tag, U &&eeprom_tag)
: sgi_mc_device(mconfig, tag, owner, (uint32_t)0)
@@ -25,7 +34,6 @@ public:
m_maincpu.set_tag(std::forward<T>(cpu_tag));
m_eeprom.set_tag(std::forward<U>(eeprom_tag));
}
-
sgi_mc_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
DECLARE_READ32_MEMBER(read);
@@ -41,12 +49,20 @@ protected:
virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override;
static const device_timer_id TIMER_RPSS = 0;
+ static const device_timer_id TIMER_DMA = 1;
private:
+ uint32_t dma_translate(uint32_t address);
+ void dma_tick();
+
required_device<cpu_device> m_maincpu;
required_device<eeprom_serial_93cxx_device> m_eeprom;
+ optional_device<hpc3_device> m_hpc3;
+
+ address_space *m_space;
emu_timer *m_rpss_timer;
+ emu_timer *m_dma_timer;
uint32_t m_cpu_control[2];
uint32_t m_watchdog;
@@ -71,14 +87,8 @@ private:
uint32_t m_gio64_substitute_bits;
uint32_t m_dma_int_cause;
uint32_t m_dma_control;
- uint32_t m_dma_tlb_entry0_hi;
- uint32_t m_dma_tlb_entry0_lo;
- uint32_t m_dma_tlb_entry1_hi;
- uint32_t m_dma_tlb_entry1_lo;
- uint32_t m_dma_tlb_entry2_hi;
- uint32_t m_dma_tlb_entry2_lo;
- uint32_t m_dma_tlb_entry3_hi;
- uint32_t m_dma_tlb_entry3_lo;
+ uint32_t m_dma_tlb_entry_hi[4];
+ uint32_t m_dma_tlb_entry_lo[4];
uint32_t m_rpss_counter;
uint32_t m_dma_mem_addr;
uint32_t m_dma_size;
@@ -86,7 +96,7 @@ private:
uint32_t m_dma_gio64_addr;
uint32_t m_dma_mode;
uint32_t m_dma_count;
- uint32_t m_dma_running;
+ uint32_t m_dma_run;
uint32_t m_eeprom_ctrl;
uint32_t m_semaphore[16];
int m_rpss_divide_counter;
diff --git a/src/mame/machine/sms.cpp b/src/mame/machine/sms.cpp
index fde2dc580de..4d506becd49 100644
--- a/src/mame/machine/sms.cpp
+++ b/src/mame/machine/sms.cpp
@@ -3,7 +3,6 @@
#include "emu.h"
#include "crsshair.h"
#include "video/315_5124.h"
-#include "sound/sn76496.h"
#include "sound/ym2413.h"
#include "includes/sms.h"
@@ -203,9 +202,9 @@ WRITE8_MEMBER(sms_state::sms_io_control_w)
READ8_MEMBER(sms_state::sms_count_r)
{
if (offset & 0x01)
- return m_vdp->hcount_read(*m_space, offset);
+ return m_vdp->hcount_read();
else
- return m_vdp->vcount_read(*m_space, offset);
+ return m_vdp->vcount_read();
}
@@ -467,9 +466,9 @@ void sms_state::smsj_set_audio_control(uint8_t data)
1,1 : Both PSG and FM enabled
*/
if (m_smsj_audio_control == 0x00 || m_smsj_audio_control == 0x03)
- m_psg_sms->set_output_gain(ALL_OUTPUTS, 1.0);
+ m_vdp->set_output_gain(ALL_OUTPUTS, 1.0);
else
- m_psg_sms->set_output_gain(ALL_OUTPUTS, 0.0);
+ m_vdp->set_output_gain(ALL_OUTPUTS, 0.0);
if (m_smsj_audio_control == 0x01 || m_smsj_audio_control == 0x03)
m_ym->set_output_gain(ALL_OUTPUTS, 1.0);
@@ -515,26 +514,14 @@ READ8_MEMBER(sms_state::smsj_audio_control_r)
WRITE8_MEMBER(sms_state::smsj_ym2413_register_port_w)
{
- m_ym->write(space, 0, data & 0x3f);
+ m_ym->write(0, data & 0x3f);
}
WRITE8_MEMBER(sms_state::smsj_ym2413_data_port_w)
{
//logerror("data_port_w %x %x\n", offset, data);
- m_ym->write(space, 1, data);
-}
-
-
-WRITE8_MEMBER(sms_state::sms_psg_w)
-{
- m_psg_sms->write(data);
-}
-
-
-WRITE8_MEMBER(sms_state::gg_psg_w)
-{
- m_psg_gg->write(data);
+ m_ym->write(1, data);
}
@@ -543,7 +530,7 @@ WRITE8_MEMBER(sms_state::gg_psg_stereo_w)
if (m_cartslot->exists() && m_cartslot->get_sms_mode())
return;
- m_psg_gg->stereo_w(space, offset, data, mem_mask);
+ m_vdp->psg_stereo_w(data);
}
@@ -1033,12 +1020,7 @@ void sms_state::machine_start()
m_led_pwr = 1;
}
- char str[7];
-
- m_cartslot = machine().device<sega8_cart_slot_device>("slot");
- m_cardslot = machine().device<sega8_card_slot_device>("mycard");
- m_smsexpslot = machine().device<sms_expansion_slot_device>("smsexp");
- m_sgexpslot = machine().device<sg1000_expansion_slot_device>("sgexp");
+ m_cartslot = m_slot.target();
m_space = &m_maincpu->space(AS_PROGRAM);
if (m_mainram == nullptr)
@@ -1101,30 +1083,18 @@ void sms_state::machine_start()
save_item(NAME(m_gg_sio));
}
- if (m_is_sdisp)
- {
- machine().save().register_postload(save_prepost_delegate(FUNC(sms_state::store_post_load), this));
-
- save_item(NAME(m_store_control));
- save_item(NAME(m_store_cart_selection_data));
-
- m_slots[0] = m_cartslot;
- for (int i = 1; i < 16; i++)
- {
- sprintf(str,"slot%i",i + 1);
- m_slots[i] = machine().device<sega8_cart_slot_device>(str);
- }
- for (int i = 0; i < 16; i++)
- {
- sprintf(str,"slot%i",i + 16 + 1);
- m_cards[i] = machine().device<sega8_card_slot_device>(str);
- }
- }
-
if (m_cartslot)
m_cartslot->save_ram();
}
+void smssdisp_state::machine_start()
+{
+ sms_state::machine_start();
+
+ save_item(NAME(m_store_control));
+ save_item(NAME(m_store_cart_selection_data));
+}
+
void sms_state::machine_reset()
{
if (m_is_smsj)
@@ -1166,17 +1136,19 @@ void sms_state::machine_reset()
m_gg_sio[4] = 0x00;
}
- if (m_is_sdisp)
- {
- m_store_control = 0;
- m_store_cart_selection_data = 0;
- store_select_cart(m_store_cart_selection_data);
- }
-
setup_bios();
setup_media_slots();
}
+void smssdisp_state::machine_reset()
+{
+ m_store_control = 0;
+ m_store_cart_selection_data = 0;
+ store_select_cart(m_store_cart_selection_data);
+
+ sms_state::machine_reset();
+}
+
READ8_MEMBER(smssdisp_state::sms_store_cart_select_r)
{
return m_store_cart_selection_data;
@@ -1191,7 +1163,7 @@ WRITE8_MEMBER(smssdisp_state::sms_store_cart_select_w)
}
-void sms_state::store_post_load()
+void smssdisp_state::device_post_load()
{
store_select_cart(m_store_cart_selection_data);
}
@@ -1206,7 +1178,7 @@ void sms_state::store_post_load()
// that seems to change the active cart/card slot pair or, for the 4th
// game switch onward of the 16-3 model, the active cart slot only.
-void sms_state::store_select_cart(uint8_t data)
+void smssdisp_state::store_select_cart(uint8_t data)
{
uint8_t slot = data >> 4;
uint8_t slottype = data & 0x08;
@@ -1214,9 +1186,9 @@ void sms_state::store_select_cart(uint8_t data)
// The SMS Store Display Unit only uses the logical cartridge slot to
// map the active cartridge or card slot, of its multiple ones.
if (slottype == 0)
- m_cartslot = m_slots[slot];
+ m_cartslot = m_slots[slot].target();
else
- m_cartslot = m_cards[slot];
+ m_cartslot = m_cards[slot].target();
logerror("switching in part of %s slot #%d\n", slottype ? "card" : "cartridge", slot);
}
diff --git a/src/mame/machine/snes.cpp b/src/mame/machine/snes.cpp
index de0e730da04..40d7584ea55 100644
--- a/src/mame/machine/snes.cpp
+++ b/src/mame/machine/snes.cpp
@@ -260,11 +260,6 @@ TIMER_CALLBACK_MEMBER(snes_state::snes_hblank_tick)
*************************************/
-READ8_MEMBER( snes_state::snes_open_bus_r )
-{
- return snes_open_bus_r();
-}
-
uint8_t snes_state::snes_open_bus_r()
{
static uint8_t recurse = 0;
diff --git a/src/mame/machine/sorcerer.cpp b/src/mame/machine/sorcerer.cpp
index 76e5651652b..5ccd9e792e0 100644
--- a/src/mame/machine/sorcerer.cpp
+++ b/src/mame/machine/sorcerer.cpp
@@ -272,8 +272,7 @@ WRITE8_MEMBER(sorcerer_state::port_fe_w)
// bit 6 baud rate */
if (BIT(changed_bits, 6))
{
- m_uart->set_receiver_clock(BIT(data, 6) ? ES_UART_CLOCK*4 : ES_UART_CLOCK);
- m_uart->set_transmitter_clock(BIT(data, 6) ? ES_UART_CLOCK*4 : ES_UART_CLOCK);
+ m_uart_clock->set_unscaled_clock(BIT(data, 6) ? ES_UART_CLOCK*4 : ES_UART_CLOCK);
}
}
@@ -418,7 +417,7 @@ void sorcerer_state::machine_start()
}
if (m_cart->exists())
- space.install_read_handler(0xc000, 0xdfff, read8_delegate(FUNC(generic_slot_device::read_rom),(generic_slot_device*)m_cart));
+ space.install_read_handler(0xc000, 0xdfff, read8sm_delegate(FUNC(generic_slot_device::read_rom),(generic_slot_device*)m_cart));
}
MACHINE_START_MEMBER(sorcerer_state,sorcererd)
@@ -446,7 +445,7 @@ MACHINE_START_MEMBER(sorcerer_state,sorcererd)
}
if (m_cart->exists())
- space.install_read_handler(0xc000, 0xdfff, read8_delegate(FUNC(generic_slot_device::read_rom),(generic_slot_device*)m_cart));
+ space.install_read_handler(0xc000, 0xdfff, read8sm_delegate(FUNC(generic_slot_device::read_rom),(generic_slot_device*)m_cart));
}
void sorcerer_state::machine_reset()
diff --git a/src/mame/machine/spec_snqk.cpp b/src/mame/machine/spec_snqk.cpp
index 9b5334b7679..08d7fc4e6c7 100644
--- a/src/mame/machine/spec_snqk.cpp
+++ b/src/mame/machine/spec_snqk.cpp
@@ -2323,10 +2323,10 @@ void spectrum_state::setup_z80(uint8_t *snapdata, uint32_t snapsize)
// Only set up sound registers for 128K machine or TS2068!
for (i = 0; i < 16; i++)
{
- ay8912->address_w(generic_space(), 0, i);
- ay8912->data_w(generic_space(), 0, snapdata[39 + i]);
+ ay8912->address_w(i);
+ ay8912->data_w(snapdata[39 + i]);
}
- ay8912->address_w(generic_space(), 0, snapdata[38]);
+ ay8912->address_w(snapdata[38]);
}
pSource = snapdata + header_size;
diff --git a/src/mame/machine/taitocchip.cpp b/src/mame/machine/taitocchip.cpp
index db8fb681600..06021e23d85 100644
--- a/src/mame/machine/taitocchip.cpp
+++ b/src/mame/machine/taitocchip.cpp
@@ -89,11 +89,11 @@ C-chip EXTERNAL memory map (it acts as a device mapped to ram; dtack is asserted
command and 0x04 set if error; this register is very likely handled by the internal rom in the upd78c11 itself rather
than the eprom, and probably tests the sram and the 78c11 internal ram, among other things.
* Current guess: 0x401 is actually attached to the high 2 bits of the PF register; bit 0 is pf6 out, bit 1 is pf6 in
- (attached to pf6 thru a resistor?), bit 2 is pf7 out, bit 3 is pf7 in (attached to pf7 through a resistor).
- The 78c11 (I'm guessing) reads pf6 and pf7 once per int; if pf6-in is set it reruns the startup selftest,
- clears pf6-out, then re-sets it. if there is an error, it also sets pf7.
+ (attached to pf6 thru a resistor?), bit 2 is pf7 out, bit 3 is pf7 in (attached to pf7 through a resistor).
+ The 78c11 (I'm guessing) reads pf6 and pf7 once per int; if pf6-in is set it reruns the startup selftest,
+ clears pf6-out, then re-sets it. if there is an error, it also sets pf7.
* Alternate guess: pf4 selects between rom and ram but pf5,6,7 are all mapped to 0x401. a memory mapped register in
- upd78c11 space selects low vs high half of rom/ram access
+ upd78c11 space selects low vs high half of rom/ram access
0x402-0x5ff = unknown (may be mirror of 0x400 and 0x401?) no idea if /DTACK is asserted for R or W here
0x600 = ?W ram window bank select, selects one of 8 1k banks to be accessible at 0x000-0x3ff , only low 3 bits are valid on this register. not sure if readable.
0x601-0x7ff = unknown, no idea if /DTACK is asserted for R or W here
@@ -110,7 +110,7 @@ This chip *ALWAYS* has a bypass capacitor (ceramic, 104, 0.10 uF) soldered on to
DEFINE_DEVICE_TYPE(TAITO_CCHIP, taito_cchip_device, "cchip", "Taito TC0030CMD (C-Chip)")
-taito_cchip_device::taito_cchip_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) :
+taito_cchip_device::taito_cchip_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock) :
device_t(mconfig, TAITO_CCHIP, tag, owner, clock),
m_upd7811(*this, "upd7811"),
m_upd4464_bank(*this, "upd4464_bank"),
@@ -148,7 +148,7 @@ void taito_cchip_device::cchip_ram_bank68(address_map &map)
map(0x0000, 0x1fff).ram().share("upd4464");
}
-READ8_MEMBER(taito_cchip_device::asic_r)
+u8 taito_cchip_device::asic_r(offs_t offset)
{
if ((offset != 0x001) && (!machine().side_effects_disabled())) // prevent logerror spam for now
logerror("%s: asic_r %04x\n", machine().describe_context(), offset);
@@ -157,7 +157,7 @@ READ8_MEMBER(taito_cchip_device::asic_r)
return 0x00; // 600-7ff is write-only(?) asic banking reg, may read as open bus or never assert /DTACK on read?
}
-WRITE8_MEMBER(taito_cchip_device::asic_w)
+void taito_cchip_device::asic_w(offs_t offset, u8 data)
{
//logerror("%s: asic_w %04x %02x\n", machine().describe_context(), offset, data);
if (offset == 0x200)
@@ -171,7 +171,7 @@ WRITE8_MEMBER(taito_cchip_device::asic_w)
}
}
-WRITE8_MEMBER(taito_cchip_device::asic68_w)
+void taito_cchip_device::asic68_w(offs_t offset, u8 data)
{
//logerror("%s: asic68_w %04x %02x\n", machine().describe_context(), offset, data);
if (offset == 0x200)
@@ -185,24 +185,24 @@ WRITE8_MEMBER(taito_cchip_device::asic68_w)
}
}
-READ8_MEMBER(taito_cchip_device::mem_r)
+u8 taito_cchip_device::mem_r(offs_t offset)
{
- return m_upd4464_bank->read8(space, offset & 0x03ff);
+ return m_upd4464_bank->read8(offset & 0x03ff);
}
-WRITE8_MEMBER(taito_cchip_device::mem_w)
+void taito_cchip_device::mem_w(offs_t offset, u8 data)
{
- return m_upd4464_bank->write8(space, offset & 0x03ff, data);
+ return m_upd4464_bank->write8(offset & 0x03ff, data);
}
-READ8_MEMBER(taito_cchip_device::mem68_r)
+u8 taito_cchip_device::mem68_r(offs_t offset)
{
- return m_upd4464_bank68->read8(space, offset & 0x03ff);
+ return m_upd4464_bank68->read8(offset & 0x03ff);
}
-WRITE8_MEMBER(taito_cchip_device::mem68_w)
+void taito_cchip_device::mem68_w(offs_t offset, u8 data)
{
- return m_upd4464_bank68->write8(space, offset & 0x03ff, data);
+ return m_upd4464_bank68->write8(offset & 0x03ff, data);
}
void taito_cchip_device::cchip_map(address_map &map)
diff --git a/src/mame/machine/taitocchip.h b/src/mame/machine/taitocchip.h
index 7f3c75506a6..eac1e06ed78 100644
--- a/src/mame/machine/taitocchip.h
+++ b/src/mame/machine/taitocchip.h
@@ -14,7 +14,7 @@ class taito_cchip_device : public device_t
{
public:
// construction/destruction
- taito_cchip_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+ taito_cchip_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
auto in_pa_callback() { return m_in_pa_cb.bind(); }
auto in_pb_callback() { return m_in_pb_cb.bind(); }
@@ -25,15 +25,15 @@ public:
auto out_pc_callback() { return m_out_pc_cb.bind(); }
// can be accessed externally
- DECLARE_READ8_MEMBER(asic_r);
- DECLARE_WRITE8_MEMBER(asic_w);
- DECLARE_WRITE8_MEMBER(asic68_w);
+ u8 asic_r(offs_t offset);
+ void asic_w(offs_t offset, u8 data);
+ void asic68_w(offs_t offset, u8 data);
- DECLARE_READ8_MEMBER(mem_r);
- DECLARE_WRITE8_MEMBER(mem_w);
+ u8 mem_r(offs_t offset);
+ void mem_w(offs_t offset, u8 data);
- DECLARE_READ8_MEMBER(mem68_r);
- DECLARE_WRITE8_MEMBER(mem68_w);
+ u8 mem68_r(offs_t offset);
+ void mem68_w(offs_t offset, u8 data);
void ext_interrupt(int state);
@@ -49,12 +49,12 @@ protected:
virtual void device_reset() override;
private:
- uint8_t m_asic_ram[4];
+ u8 m_asic_ram[4];
required_device<cpu_device> m_upd7811;
required_device<address_map_bank_device> m_upd4464_bank;
required_device<address_map_bank_device> m_upd4464_bank68;
- required_shared_ptr<uint8_t> m_upd4464;
+ required_shared_ptr<u8> m_upd4464;
devcb_read8 m_in_pa_cb;
devcb_read8 m_in_pb_cb;
diff --git a/src/mame/machine/tatsumi.cpp b/src/mame/machine/tatsumi.cpp
index 0966e444998..5bcd279ba72 100644
--- a/src/mame/machine/tatsumi.cpp
+++ b/src/mame/machine/tatsumi.cpp
@@ -307,7 +307,7 @@ WRITE16_MEMBER(tatsumi_state::tatsumi_v30_68000_w)
// self-test in Tatsumi games. Needs fixed, but hack it here for now.
READ8_MEMBER(tatsumi_state::tatsumi_hack_ym2151_r)
{
- int r=m_ym2151->status_r(space,0);
+ int r=m_ym2151->status_r();
if (m_audiocpu->pc()==0x2aca || m_audiocpu->pc()==0x29fe
|| m_audiocpu->pc()==0xf9721
@@ -318,7 +318,7 @@ READ8_MEMBER(tatsumi_state::tatsumi_hack_ym2151_r)
READ8_MEMBER(cyclwarr_state::oki_status_xor_r)
{
- int r = m_oki->read(space,0);
+ int r = m_oki->read();
// Cycle Warriors and Big Fight access this with reversed activeness.
// this is particularly noticeable with the "We got em" sample played in CW at stage clear:
diff --git a/src/mame/machine/teleprinter.cpp b/src/mame/machine/teleprinter.cpp
index 6cbc53090cf..8ef1576a2c2 100644
--- a/src/mame/machine/teleprinter.cpp
+++ b/src/mame/machine/teleprinter.cpp
@@ -211,20 +211,20 @@ uint32_t teleprinter_device::tp_update(screen_device &device, bitmap_rgb32 &bitm
/***************************************************************************
VIDEO HARDWARE
***************************************************************************/
-MACHINE_CONFIG_START(teleprinter_device::device_add_mconfig)
- MCFG_SCREEN_ADD(TELEPRINTER_SCREEN_TAG, RASTER)
- MCFG_SCREEN_REFRESH_RATE(50)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */
- MCFG_SCREEN_SIZE(teleprinter_device::WIDTH*8, teleprinter_device::HEIGHT*8)
- MCFG_SCREEN_VISIBLE_AREA(0, teleprinter_device::WIDTH*8-1, 0, teleprinter_device::HEIGHT*8-1)
- MCFG_SCREEN_UPDATE_DEVICE(DEVICE_SELF, teleprinter_device, tp_update)
+void teleprinter_device::device_add_mconfig(machine_config &config)
+{
+ screen_device &screen(SCREEN(config, TELEPRINTER_SCREEN_TAG, SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(50);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */
+ screen.set_size(teleprinter_device::WIDTH*8, teleprinter_device::HEIGHT*8);
+ screen.set_visarea(0, teleprinter_device::WIDTH*8-1, 0, teleprinter_device::HEIGHT*8-1);
+ screen.set_screen_update(FUNC(teleprinter_device::tp_update));
generic_keyboard_device &keyboard(GENERIC_KEYBOARD(config, "keyboard", 0));
keyboard.set_keyboard_callback(FUNC(generic_terminal_device::kbd_put));
SPEAKER(config, "bell").front_center();
- MCFG_DEVICE_ADD("beeper", BEEP, 2'000)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "bell", 0.50)
-MACHINE_CONFIG_END
+ BEEP(config, "beeper", 2'000).add_route(ALL_OUTPUTS, "bell", 0.50);
+}
/*-------------------------------------------------
diff --git a/src/mame/machine/thomflop.cpp b/src/mame/machine/thomflop.cpp
index 1fa600121d8..2f935851f88 100644
--- a/src/mame/machine/thomflop.cpp
+++ b/src/mame/machine/thomflop.cpp
@@ -1678,7 +1678,7 @@ void thomson_state::to7_network_reset()
READ8_MEMBER( thomson_state::to7_network_r )
{
if ( offset < 4 )
- return m_mc6854->read( space, offset );
+ return m_mc6854->read( offset );
if ( offset == 8 )
{
@@ -1697,7 +1697,7 @@ READ8_MEMBER( thomson_state::to7_network_r )
WRITE8_MEMBER( thomson_state::to7_network_w )
{
if ( offset < 4 )
- m_mc6854->write( space, offset, data );
+ m_mc6854->write( offset, data );
else
{
logerror( "%f $%04x to7_network_w: invalid write offset %i (data=$%02X)\n",
diff --git a/src/mame/machine/thomson.cpp b/src/mame/machine/thomson.cpp
index 0d7c7e7f379..97867d1a6ed 100644
--- a/src/mame/machine/thomson.cpp
+++ b/src/mame/machine/thomson.cpp
@@ -157,7 +157,7 @@ WRITE_LINE_MEMBER( thomson_state::to7_set_cassette_motor )
Bit-order is most significant bit first (unlike TO7).
Double-density MO6 cassettes follow the exact same mechanism, but with
- at double frequency (perdiods at 2400 Hz, and half-perdios at 1200 Hz).
+ at double frequency (periods at 2400 Hz, and half-periods at 1200 Hz).
*/
@@ -520,7 +520,8 @@ to7_io_line_device::to7_io_line_device(const machine_config &mconfig, const char
{
}
-MACHINE_CONFIG_START(to7_io_line_device::device_add_mconfig)
+void to7_io_line_device::device_add_mconfig(machine_config &config)
+{
/// THIS PIO is part of CC 90-232 expansion
PIA6821(config, m_pia_io, 0);
m_pia_io->readpa_handler().set(FUNC(to7_io_line_device::porta_in));
@@ -535,13 +536,13 @@ MACHINE_CONFIG_START(to7_io_line_device::device_add_mconfig)
m_rs232->cts_handler().set(FUNC(to7_io_line_device::write_cts));
m_rs232->dsr_handler().set(FUNC(to7_io_line_device::write_dsr));
- MCFG_DEVICE_ADD("centronics", CENTRONICS, centronics_devices, "printer")
- MCFG_CENTRONICS_ACK_HANDLER(WRITELINE(THOM_PIA_IO, pia6821_device, cb1_w))
- MCFG_CENTRONICS_BUSY_HANDLER(WRITELINE(*this, to7_io_line_device, write_centronics_busy))
-
- MCFG_CENTRONICS_OUTPUT_LATCH_ADD("cent_data_out", "centronics")
+ centronics_device &centronics(CENTRONICS(config, "centronics", centronics_devices, "printer"));
+ centronics.ack_handler().set(m_pia_io, FUNC(pia6821_device::cb1_w));
+ centronics.busy_handler().set(FUNC(to7_io_line_device::write_centronics_busy));
-MACHINE_CONFIG_END
+ output_latch_device &cent_data_out(OUTPUT_LATCH(config, "cent_data_out"));
+ centronics.set_output_latch(cent_data_out);
+}
void to7_io_line_device::device_start()
@@ -683,7 +684,7 @@ READ8_MEMBER( thomson_state::to7_modem_mea8000_r )
{
case 0:
case 1:
- return m_acia->read(space, offset & 1);
+ return m_acia->read(offset & 1);
default:
return 0;
@@ -705,7 +706,7 @@ WRITE8_MEMBER( thomson_state::to7_modem_mea8000_w )
{
case 0:
case 1:
- m_acia->write(space, offset & 1, data);
+ m_acia->write(offset & 1, data);
break;
}
}
@@ -1713,14 +1714,14 @@ void thomson_state::to9_set_video_mode( uint8_t data, int style )
thom_set_video_mode( THOM_VMODE_TO9 );
break;
- // undocumented, but tested on a real TO8D
- case 0x20: thom_set_video_mode( THOM_VMODE_MO5_ALT ); break;
+ // undocumented, but tested on a real TO8D
+ case 0x20: thom_set_video_mode( THOM_VMODE_MO5_ALT ); break;
case 0x21: thom_set_video_mode( THOM_VMODE_BITMAP4 ); break;
case 0x41: thom_set_video_mode( THOM_VMODE_BITMAP4_ALT ); break;
- // also undocumented but tested
+ // also undocumented but tested
case 0x59: thom_set_video_mode( THOM_VMODE_BITMAP4_ALT_HALF ); break;
case 0x2a:
@@ -1743,6 +1744,9 @@ void thomson_state::to9_set_video_mode( uint8_t data, int style )
case 0x3f: thom_set_video_mode( THOM_VMODE_OVERLAY3 ); break;
+ // undocumented variant enconding for bitmap16
+ case 0x5b: thom_set_video_mode( THOM_VMODE_BITMAP16_ALT ); break;
+
default:
logerror( "to9_set_video_mode: unknown mode $%02X tr=%i phi=%i mod=%i\n", data, (data >> 5) & 3, (data >> 3) & 2, data & 7 );
}
diff --git a/src/mame/machine/ti85.cpp b/src/mame/machine/ti85.cpp
index 316ce8313c1..dd8e23dc6bd 100644
--- a/src/mame/machine/ti85.cpp
+++ b/src/mame/machine/ti85.cpp
@@ -155,24 +155,24 @@ void ti85_state::update_ti83p_memory ()
{
//address_space &space = m_maincpu->space(AS_PROGRAM);
- m_membank1->set_bank(m_booting ? 0x1f : 0); //Always flash page 0, well almost
+ m_membank[0]->set_bank(m_booting ? 0x1f : 0); //Always flash page 0, well almost
if (m_ti83p_port4 & 1)
{
- m_membank2->set_bank(m_ti8x_memory_page_1 & 0xfe);
+ m_membank[1]->set_bank(m_ti8x_memory_page_1 & 0xfe);
- m_membank3->set_bank(m_ti8x_memory_page_1);
+ m_membank[2]->set_bank(m_ti8x_memory_page_1);
- m_membank4->set_bank(m_ti8x_memory_page_2);
+ m_membank[3]->set_bank(m_ti8x_memory_page_2);
}
else
{
- m_membank2->set_bank(m_ti8x_memory_page_1);
+ m_membank[1]->set_bank(m_ti8x_memory_page_1);
- m_membank3->set_bank(m_ti8x_memory_page_2);
+ m_membank[2]->set_bank(m_ti8x_memory_page_2);
- m_membank4->set_bank(0x40); //Always first ram page
+ m_membank[3]->set_bank(0x40); //Always first ram page
}
}
@@ -181,25 +181,25 @@ void ti85_state::update_ti83pse_memory ()
{
//address_space &space = m_maincpu->space(AS_PROGRAM);
- m_membank1->set_bank(m_booting ? (m_model==TI84P ? 0x3f : 0x7f) : 0);
+ m_membank[0]->set_bank(m_booting ? (m_model==TI84P ? 0x3f : 0x7f) : 0);
if (m_ti83p_port4 & 1)
{
- m_membank2->set_bank(m_ti8x_memory_page_1 & 0xfe);
+ m_membank[1]->set_bank(m_ti8x_memory_page_1 & 0xfe);
- m_membank3->set_bank(m_ti8x_memory_page_1 | 1);
+ m_membank[2]->set_bank(m_ti8x_memory_page_1 | 1);
- m_membank4->set_bank(m_ti8x_memory_page_2);
+ m_membank[3]->set_bank(m_ti8x_memory_page_2);
}
else
{
- m_membank2->set_bank(m_ti8x_memory_page_1);
+ m_membank[1]->set_bank(m_ti8x_memory_page_1);
- m_membank3->set_bank(m_ti8x_memory_page_2);
+ m_membank[2]->set_bank(m_ti8x_memory_page_2);
- m_membank4->set_bank(m_ti8x_memory_page_3 + 0x80);
+ m_membank[3]->set_bank(m_ti8x_memory_page_3 + 0x80);
}
}
@@ -269,7 +269,7 @@ MACHINE_RESET_MEMBER(ti85_state,ti85)
m_PCR = 0xc0;
}
-READ8_MEMBER(ti85_state::ti83p_membank2_r)
+uint8_t ti85_state::ti83p_membank2_r(offs_t offset)
{
/// http://wikiti.brandonw.net/index.php?title=83Plus:State_of_the_calculator_at_boot
/// should only trigger when fetching opcodes
@@ -287,10 +287,10 @@ READ8_MEMBER(ti85_state::ti83p_membank2_r)
}
}
- return m_membank2->read8(space, offset);
+ return m_membank[1]->read8(offset);
}
-READ8_MEMBER(ti85_state::ti83p_membank3_r)
+uint8_t ti85_state::ti83p_membank3_r(offs_t offset)
{
/// http://wikiti.brandonw.net/index.php?title=83Plus:State_of_the_calculator_at_boot
/// should only trigger when fetching opcodes
@@ -309,7 +309,7 @@ READ8_MEMBER(ti85_state::ti83p_membank3_r)
}
}
- return m_membank3->read8(space, offset);
+ return m_membank[2]->read8(offset);
}
MACHINE_RESET_MEMBER(ti85_state,ti83p)
diff --git a/src/mame/machine/toaplan1.cpp b/src/mame/machine/toaplan1.cpp
index 7f0df70d4b3..3e10d414f97 100644
--- a/src/mame/machine/toaplan1.cpp
+++ b/src/mame/machine/toaplan1.cpp
@@ -12,22 +12,19 @@
#include "includes/toaplan1.h"
-void toaplan1_state::toaplan1_interrupt()
+void toaplan1_state::interrupt()
{
if (m_intenable)
m_maincpu->set_input_line(4, HOLD_LINE);
}
-WRITE16_MEMBER(toaplan1_state::toaplan1_intenable_w)
+void toaplan1_state::intenable_w(u8 data)
{
- if (ACCESSING_BITS_0_7)
- {
- m_intenable = data & 0xff;
- }
+ m_intenable = data;
}
-WRITE16_MEMBER(toaplan1_state::demonwld_dsp_addrsel_w)
+void toaplan1_demonwld_state::dsp_addrsel_w(u16 data)
{
/* This sets the main CPU RAM address the DSP should */
/* read/write, via the DSP IO port 0 */
@@ -42,13 +39,14 @@ WRITE16_MEMBER(toaplan1_state::demonwld_dsp_addrsel_w)
logerror("DSP PC:%04x IO write %04x (%08x) at port 0\n", m_dsp->pcbase(), data, m_main_ram_seg + m_dsp_addr_w);
}
-READ16_MEMBER(toaplan1_state::demonwld_dsp_r)
+u16 toaplan1_demonwld_state::dsp_r()
{
/* DSP can read data from main CPU RAM via DSP IO port 1 */
- uint16_t input_data = 0;
+ u16 input_data = 0;
- switch (m_main_ram_seg) {
+ switch (m_main_ram_seg)
+ {
case 0xc00000: {address_space &mainspace = m_maincpu->space(AS_PROGRAM);
input_data = mainspace.read_word(m_main_ram_seg + m_dsp_addr_w);
break;}
@@ -58,11 +56,12 @@ READ16_MEMBER(toaplan1_state::demonwld_dsp_r)
return input_data;
}
-WRITE16_MEMBER(toaplan1_state::demonwld_dsp_w)
+void toaplan1_demonwld_state::dsp_w(u16 data)
{
/* Data written to main CPU RAM via DSP IO port 1 */
m_dsp_execute = 0;
- switch (m_main_ram_seg) {
+ switch (m_main_ram_seg)
+ {
case 0xc00000: {if ((m_dsp_addr_w < 3) && (data == 0)) m_dsp_execute = 1;
address_space &mainspace = m_maincpu->space(AS_PROGRAM);
mainspace.write_word(m_main_ram_seg + m_dsp_addr_w, data);
@@ -72,7 +71,7 @@ WRITE16_MEMBER(toaplan1_state::demonwld_dsp_w)
logerror("DSP PC:%04x IO write %04x at %08x (port 1)\n", m_dsp->pcbase(), data, m_main_ram_seg + m_dsp_addr_w);
}
-WRITE16_MEMBER(toaplan1_state::demonwld_dsp_bio_w)
+void toaplan1_demonwld_state::dsp_bio_w(u16 data)
{
/* data 0xffff means inhibit BIO line to DSP and enable */
/* communication to main processor */
@@ -82,11 +81,13 @@ WRITE16_MEMBER(toaplan1_state::demonwld_dsp_bio_w)
logerror("DSP PC:%04x IO write %04x at port 3\n", m_dsp->pcbase(), data);
- if (data & 0x8000) {
+ if (data & 0x8000)
m_dsp_bio = CLEAR_LINE;
- }
- if (data == 0) {
- if (m_dsp_execute) {
+
+ if (data == 0)
+ {
+ if (m_dsp_execute)
+ {
logerror("Turning 68000 on\n");
m_maincpu->set_input_line(INPUT_LINE_HALT, CLEAR_LINE);
m_dsp_execute = 0;
@@ -95,13 +96,13 @@ WRITE16_MEMBER(toaplan1_state::demonwld_dsp_bio_w)
}
}
-READ_LINE_MEMBER(toaplan1_state::demonwld_bio_r)
+READ_LINE_MEMBER(toaplan1_demonwld_state::bio_r)
{
return m_dsp_bio;
}
-void toaplan1_state::demonwld_dsp(int enable)
+void toaplan1_demonwld_state::dsp_int_w(int enable)
{
m_dsp_on = enable;
if (enable)
@@ -119,55 +120,45 @@ void toaplan1_state::demonwld_dsp(int enable)
}
}
-void toaplan1_state::demonwld_restore_dsp()
+void toaplan1_demonwld_state::device_post_load()
{
- demonwld_dsp(m_dsp_on);
+ dsp_int_w(m_dsp_on);
}
-WRITE16_MEMBER(toaplan1_state::demonwld_dsp_ctrl_w)
+void toaplan1_demonwld_state::dsp_ctrl_w(u8 data)
{
#if 0
- logerror("68000:%08x Writing %08x to %08x.\n",m_maincpu->pc() ,data ,0xe0000a + offset);
+ logerror("68000:%08x Writing %02x to $e0000b.\n",m_maincpu->pc() ,data);
#endif
- if (ACCESSING_BITS_0_7)
+ switch (data)
{
- switch (data)
- {
- case 0x00: demonwld_dsp(1); break; /* Enable the INT line to the DSP */
- case 0x01: demonwld_dsp(0); break; /* Inhibit the INT line to the DSP */
- default: logerror("68000:%04x Writing unknown command %08x to %08x\n",m_maincpu->pcbase() ,data ,0xe0000a + offset); break;
- }
- }
- else
- {
- logerror("68000:%04x Writing unknown command %08x to %08x\n",m_maincpu->pcbase() ,data ,0xe0000a + offset);
+ case 0x00: dsp_int_w(1); break; /* Enable the INT line to the DSP */
+ case 0x01: dsp_int_w(0); break; /* Inhibit the INT line to the DSP */
+ default: logerror("68000:%08x Writing unknown command %02x to $e0000b\n",m_maincpu->pcbase() ,data); break;
}
}
-READ16_MEMBER(toaplan1_state::samesame_port_6_word_r)
+u8 toaplan1_samesame_state::port_6_word_r()
{
/* Bit 0x80 is secondary CPU (HD647180) ready signal */
- logerror("PC:%04x Warning !!! IO reading from $14000a\n",m_maincpu->pcbase());
- return (0x80 | ioport("TJUMP")->read()) & 0xff;
+ logerror("PC:%08x Warning !!! IO reading from $14000b\n",m_maincpu->pcbase());
+ return (0x80 | m_tjump_io->read()) & 0xff;
}
-READ16_MEMBER(toaplan1_state::toaplan1_shared_r)
+u8 toaplan1_state::shared_r(offs_t offset)
{
- return m_sharedram[offset] & 0xff;
+ return m_sharedram[offset];
}
-WRITE16_MEMBER(toaplan1_state::toaplan1_shared_w)
+void toaplan1_state::shared_w(offs_t offset, u8 data)
{
- if (ACCESSING_BITS_0_7)
- {
- m_sharedram[offset] = data & 0xff;
- }
+ m_sharedram[offset] = data;
}
-void toaplan1_state::toaplan1_reset_sound()
+void toaplan1_state::reset_sound()
{
/* Reset the secondary CPU and sound chip */
/* rallybik, truxton, hellfire, demonwld write to a port to cause a reset */
@@ -176,9 +167,9 @@ void toaplan1_state::toaplan1_reset_sound()
m_audiocpu->pulse_input_line(INPUT_LINE_RESET, attotime::zero);
}
-WRITE16_MEMBER(toaplan1_state::toaplan1_reset_sound_w)
+void toaplan1_state::reset_sound_w(u8 data)
{
- if (ACCESSING_BITS_0_7 && (data == 0)) toaplan1_reset_sound();
+ if (data == 0) reset_sound();
}
@@ -203,14 +194,15 @@ WRITE_LINE_MEMBER(toaplan1_rallybik_state::coin_lockout_2_w)
}
-WRITE8_MEMBER(toaplan1_state::toaplan1_coin_w)
+void toaplan1_state::coin_w(u8 data)
{
logerror("Z80 writing %02x to coin control\n",data);
/* This still isnt too clear yet. */
/* Coin C has no coin lock ? */
/* Are some outputs for lights ? (no space on JAMMA for it though) */
- switch (data) {
+ switch (data)
+ {
case 0xee: machine().bookkeeping().coin_counter_w(1,1); machine().bookkeeping().coin_counter_w(1,0); break; /* Count slot B */
case 0xed: machine().bookkeeping().coin_counter_w(0,1); machine().bookkeeping().coin_counter_w(0,0); break; /* Count slot A */
/* The following are coin counts after coin-lock active (faulty coin-lock ?) */
@@ -233,24 +225,12 @@ WRITE8_MEMBER(toaplan1_state::toaplan1_coin_w)
}
}
-WRITE16_MEMBER(toaplan1_state::samesame_coin_w)
-{
- if (ACCESSING_BITS_0_7)
- {
- toaplan1_coin_w(space, offset, data & 0xff);
- }
- if (ACCESSING_BITS_8_15 && (data&0xff00))
- {
- logerror("PC:%04x Writing unknown MSB data (%04x) to coin count/lockout port\n",m_maincpu->pcbase(),data);
- }
-}
-
-WRITE_LINE_MEMBER(toaplan1_state::toaplan1_reset_callback)
+WRITE_LINE_MEMBER(toaplan1_state::reset_callback)
{
- toaplan1_reset_sound();
+ reset_sound();
}
-MACHINE_RESET_MEMBER(toaplan1_state,toaplan1)
+void toaplan1_state::machine_reset()
{
m_intenable = 0;
machine().bookkeeping().coin_lockout_global_w(0);
@@ -259,37 +239,37 @@ MACHINE_RESET_MEMBER(toaplan1_state,toaplan1)
/* zerowing, fireshrk, outzone */
MACHINE_RESET_MEMBER(toaplan1_state,zerowing)
{
- MACHINE_RESET_CALL_MEMBER(toaplan1);
- m_maincpu->set_reset_callback(write_line_delegate(FUNC(toaplan1_state::toaplan1_reset_callback),this));
+ machine_reset();
+ m_maincpu->set_reset_callback(write_line_delegate(FUNC(toaplan1_state::reset_callback),this));
}
-MACHINE_RESET_MEMBER(toaplan1_state,demonwld)
+void toaplan1_demonwld_state::machine_reset()
{
- MACHINE_RESET_CALL_MEMBER(toaplan1);
+ toaplan1_state::machine_reset();
m_dsp_addr_w = 0;
m_main_ram_seg = 0;
m_dsp_execute = 0;
}
-MACHINE_RESET_MEMBER(toaplan1_state,vimana)
-{
- MACHINE_RESET_CALL_MEMBER(toaplan1);
- m_maincpu->set_reset_callback(write_line_delegate(FUNC(toaplan1_state::toaplan1_reset_callback),this));
-}
-
-void toaplan1_state::toaplan1_driver_savestate()
+void toaplan1_state::machine_start()
{
save_item(NAME(m_intenable));
}
-void toaplan1_state::demonwld_driver_savestate()
+void toaplan1_demonwld_state::machine_start()
{
+ toaplan1_state::machine_start();
save_item(NAME(m_dsp_on));
save_item(NAME(m_dsp_addr_w));
save_item(NAME(m_main_ram_seg));
save_item(NAME(m_dsp_bio));
save_item(NAME(m_dsp_execute));
- machine().save().register_postload(save_prepost_delegate(FUNC(toaplan1_state::demonwld_restore_dsp), this));
}
+void toaplan1_samesame_state::machine_start()
+{
+ toaplan1_state::machine_start();
+ save_item(NAME(m_to_mcu));
+ save_item(NAME(m_cmdavailable));
+}
diff --git a/src/mame/machine/trs80.cpp b/src/mame/machine/trs80.cpp
index 1012bf5d8b7..42a49a0cfcc 100644
--- a/src/mame/machine/trs80.cpp
+++ b/src/mame/machine/trs80.cpp
@@ -357,8 +357,7 @@ void trs80_state::machine_reset()
{
const uint16_t s_bauds[8]={ 110, 300, 600, 1200, 2400, 4800, 9600, 19200 };
u16 s_clock = s_bauds[m_io_baud->read()] << 4;
- m_uart->set_receiver_clock(s_clock);
- m_uart->set_transmitter_clock(s_clock);
+ m_uart_clock->set_unscaled_clock(s_clock);
}
}
diff --git a/src/mame/machine/tv950kb.cpp b/src/mame/machine/tv950kb.cpp
index 6e07fa86cec..ab92932b710 100644
--- a/src/mame/machine/tv950kb.cpp
+++ b/src/mame/machine/tv950kb.cpp
@@ -200,7 +200,7 @@ static INPUT_PORTS_START(tv950kb)
PORT_START("FUNCT")
PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Funct") PORT_CHAR(UCHAR_MAMEKEY(LALT)) PORT_CODE(KEYCODE_LALT)
- PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Alpha Lock") PORT_CHAR(UCHAR_MAMEKEY(CAPSLOCK)) PORT_CODE(KEYCODE_CAPSLOCK)
+ PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Alpha Lock") PORT_CHAR(UCHAR_MAMEKEY(CAPSLOCK)) PORT_CODE(KEYCODE_CAPSLOCK) PORT_TOGGLE
PORT_BIT(0x9f, IP_ACTIVE_LOW, IPT_UNUSED)
INPUT_PORTS_END
diff --git a/src/mame/machine/tv955kb.cpp b/src/mame/machine/tv955kb.cpp
index 6e5c2e23557..4ad8e08431e 100644
--- a/src/mame/machine/tv955kb.cpp
+++ b/src/mame/machine/tv955kb.cpp
@@ -17,6 +17,7 @@ Connector pinout:
#include "emu.h"
#include "machine/tv955kb.h"
#include "machine/input_merger.h"
+#include "speaker.h"
DEFINE_DEVICE_TYPE(TV955_KEYBOARD, tv955kb_device, "tv955kb", "TeleVideo 955 Keyboard")
@@ -25,7 +26,9 @@ tv955kb_device::tv955kb_device(const machine_config &mconfig, const char *tag, d
, m_txd_cb(*this)
, m_reset_cb(*this)
, m_mcu(*this, "mcu")
+ , m_bell(*this, "bell")
, m_keys(*this, "Y%u", 0U)
+ , m_bell_on(false)
{
}
@@ -37,6 +40,32 @@ void tv955kb_device::device_resolve_objects()
void tv955kb_device::device_start()
{
+ m_bell_timer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(tv955kb_device::bell_q8), this));
+
+ save_item(NAME(m_bell_on));
+
+ // Hack to avoid starting up in wrong state
+ auto &resetctl = *subdevice<input_merger_device>("resetctl");
+ resetctl.in_w<0>(1);
+ resetctl.in_w<1>(1);
+}
+
+void tv955kb_device::device_reset()
+{
+ bell_reset();
+}
+
+TIMER_CALLBACK_MEMBER(tv955kb_device::bell_q8)
+{
+ m_bell_on = !m_bell_on;
+ m_bell->level_w(m_bell_on);
+}
+
+void tv955kb_device::bell_reset()
+{
+ m_bell_on = false;
+ m_bell->level_w(0);
+ m_bell_timer->enable(false);
}
WRITE_LINE_MEMBER(tv955kb_device::write_rxd)
@@ -59,7 +88,14 @@ u8 tv955kb_device::keys_r()
WRITE_LINE_MEMBER(tv955kb_device::bell_w)
{
- // TODO
+ if (state && m_bell_timer->enabled())
+ bell_reset();
+ else if (!state && !m_bell_timer->enabled())
+ {
+ // Speaker driven through 2N4401 from Q8 output of MC14040 clocked by ALE
+ attotime period = m_mcu->cycles_to_attotime(128);
+ m_bell_timer->adjust(period, 0, period);
+ }
}
WRITE_LINE_MEMBER(tv955kb_device::txd_w)
@@ -69,6 +105,9 @@ WRITE_LINE_MEMBER(tv955kb_device::txd_w)
WRITE_LINE_MEMBER(tv955kb_device::reset_w)
{
+ m_mcu->set_input_line(INPUT_LINE_RESET, state ? CLEAR_LINE : ASSERT_LINE);
+ if (!state)
+ bell_reset();
m_reset_cb(state);
}
@@ -82,9 +121,11 @@ void tv955kb_device::device_add_mconfig(machine_config &config)
m_mcu->t1_in_cb().set_ioport("FUNCT").bit(1);
m_mcu->bus_in_cb().set(FUNC(tv955kb_device::keys_r));
- INPUT_MERGER_ALL_LOW(config, "resetctl").output_handler().set(FUNC(tv955kb_device::reset_w));
+ input_merger_device &resetctl(INPUT_MERGER_ALL_LOW(config, "resetctl"));
+ resetctl.output_handler().set(FUNC(tv955kb_device::reset_w)).invert();
- // TODO: bell (MC14040 clocked by ALE)
+ SPEAKER(config, "mono").front_center();
+ SPEAKER_SOUND(config, m_bell).add_route(ALL_OUTPUTS, "mono", 0.05);
}
static INPUT_PORTS_START(tv955kb)
diff --git a/src/mame/machine/tv955kb.h b/src/mame/machine/tv955kb.h
index d79f4df14ed..8b45986b622 100644
--- a/src/mame/machine/tv955kb.h
+++ b/src/mame/machine/tv955kb.h
@@ -7,9 +7,7 @@
#pragma once
#include "cpu/mcs48/mcs48.h"
-//#include "machine/ripple_counter.h"
-//#include "sound/spkrdev.h"
-//#include "speaker.h"
+#include "sound/spkrdev.h"
//**************************************************************************
@@ -29,12 +27,11 @@ public:
DECLARE_WRITE_LINE_MEMBER(write_rxd);
- static constexpr feature_type unemulated_features() { return feature::SOUND; }
-
protected:
// device-specific overrides
virtual void device_resolve_objects() override;
virtual void device_start() override;
+ virtual void device_reset() override;
virtual void device_add_mconfig(machine_config &config) override;
virtual ioport_constructor device_input_ports() const override;
virtual const tiny_rom_entry *device_rom_region() const override;
@@ -45,12 +42,19 @@ private:
DECLARE_WRITE_LINE_MEMBER(txd_w);
DECLARE_WRITE_LINE_MEMBER(reset_w);
+ TIMER_CALLBACK_MEMBER(bell_q8);
+ void bell_reset();
+
// line output callbacks
devcb_write_line m_txd_cb;
devcb_write_line m_reset_cb;
required_device<mcs48_cpu_device> m_mcu;
+ required_device<speaker_sound_device> m_bell;
required_ioport_array<16> m_keys;
+
+ emu_timer *m_bell_timer;
+ bool m_bell_on;
};
// device type definition
diff --git a/src/mame/machine/twincobr.cpp b/src/mame/machine/twincobr.cpp
index 5fa63ece69a..2bfdbbf9f79 100644
--- a/src/mame/machine/twincobr.cpp
+++ b/src/mame/machine/twincobr.cpp
@@ -34,7 +34,7 @@ WRITE_LINE_MEMBER(twincobr_state::wardner_vblank_irq)
}
-WRITE16_MEMBER(twincobr_state::twincobr_dsp_addrsel_w)
+void twincobr_state::twincobr_dsp_addrsel_w(u16 data)
{
/* This sets the main CPU RAM address the DSP should */
/* read/write, via the DSP IO port 0 */
@@ -50,11 +50,11 @@ WRITE16_MEMBER(twincobr_state::twincobr_dsp_addrsel_w)
LOG(("DSP PC:%04x IO write %04x (%08x) at port 0\n",m_dsp->pcbase(),data,m_main_ram_seg + m_dsp_addr_w));
}
-READ16_MEMBER(twincobr_state::twincobr_dsp_r)
+u16 twincobr_state::twincobr_dsp_r()
{
/* DSP can read data from main CPU RAM via DSP IO port 1 */
- uint16_t input_data = 0;
+ u16 input_data = 0;
switch (m_main_ram_seg)
{
case 0x30000:
@@ -68,7 +68,7 @@ READ16_MEMBER(twincobr_state::twincobr_dsp_r)
return input_data;
}
-WRITE16_MEMBER(twincobr_state::twincobr_dsp_w)
+void twincobr_state::twincobr_dsp_w(u16 data)
{
/* Data written to main CPU RAM via DSP IO port 1 */
m_dsp_execute = 0;
@@ -84,7 +84,7 @@ WRITE16_MEMBER(twincobr_state::twincobr_dsp_w)
LOG(("DSP PC:%04x IO write %04x at %08x (port 1)\n",m_dsp->pcbase(),data,m_main_ram_seg + m_dsp_addr_w));
}
-WRITE16_MEMBER(twincobr_state::wardner_dsp_addrsel_w)
+void twincobr_state::wardner_dsp_addrsel_w(u16 data)
{
/* This sets the main CPU RAM address the DSP should */
/* read/write, via the DSP IO port 0 */
@@ -99,11 +99,11 @@ WRITE16_MEMBER(twincobr_state::wardner_dsp_addrsel_w)
LOG(("DSP PC:%04x IO write %04x (%08x) at port 0\n",m_dsp->pcbase(),data,m_main_ram_seg + m_dsp_addr_w));
}
-READ16_MEMBER(twincobr_state::wardner_dsp_r)
+u16 twincobr_state::wardner_dsp_r()
{
/* DSP can read data from main CPU RAM via DSP IO port 1 */
- uint16_t input_data = 0;
+ u16 input_data = 0;
switch (m_main_ram_seg)
{
case 0x7000:
@@ -118,7 +118,7 @@ READ16_MEMBER(twincobr_state::wardner_dsp_r)
return input_data;
}
-WRITE16_MEMBER(twincobr_state::wardner_dsp_w)
+void twincobr_state::wardner_dsp_w(u16 data)
{
/* Data written to main CPU RAM via DSP IO port 1 */
m_dsp_execute = 0;
@@ -135,7 +135,7 @@ WRITE16_MEMBER(twincobr_state::wardner_dsp_w)
LOG(("DSP PC:%04x IO write %04x at %08x (port 1)\n",m_dsp->pcbase(),data,m_main_ram_seg + m_dsp_addr_w));
}
-WRITE16_MEMBER(twincobr_state::twincobr_dsp_bio_w)
+void twincobr_state::twincobr_dsp_bio_w(u16 data)
{
/* data 0xffff means inhibit BIO line to DSP and enable */
/* communication to main processor */
@@ -159,7 +159,7 @@ WRITE16_MEMBER(twincobr_state::twincobr_dsp_bio_w)
}
}
-READ16_MEMBER(twincobr_state::fsharkbt_dsp_r)
+u16 twincobr_state::fsharkbt_dsp_r()
{
/* IO Port 2 used by Flying Shark bootleg */
/* DSP reads data from an extra MCU (8741) at IO port 2 */
@@ -170,7 +170,7 @@ READ16_MEMBER(twincobr_state::fsharkbt_dsp_r)
return (m_fsharkbt_8741 & 1);
}
-WRITE16_MEMBER(twincobr_state::fsharkbt_dsp_w)
+void twincobr_state::fsharkbt_dsp_w(u16 data)
{
/* Flying Shark bootleg DSP writes data to an extra MCU (8741) at IO port 2 */
#if 0
@@ -209,7 +209,7 @@ WRITE_LINE_MEMBER(twincobr_state::dsp_int_w)
}
}
-void twincobr_state::twincobr_restore_dsp()
+void twincobr_state::device_post_load()
{
dsp_int_w(m_dsp_on);
}
@@ -236,21 +236,18 @@ WRITE_LINE_MEMBER(twincobr_state::coin_lockout_2_w)
}
-READ16_MEMBER(twincobr_state::twincobr_sharedram_r)
+u8 twincobr_state::twincobr_sharedram_r(offs_t offset)
{
return m_sharedram[offset];
}
-WRITE16_MEMBER(twincobr_state::twincobr_sharedram_w)
+void twincobr_state::twincobr_sharedram_w(offs_t offset, u8 data)
{
- if (ACCESSING_BITS_0_7)
- {
- m_sharedram[offset] = data & 0xff;
- }
+ m_sharedram[offset] = data;
}
-MACHINE_RESET_MEMBER(twincobr_state,twincobr)
+void twincobr_state::machine_reset()
{
m_dsp_addr_w = 0;
m_main_ram_seg = 0;
@@ -259,7 +256,7 @@ MACHINE_RESET_MEMBER(twincobr_state,twincobr)
m_fsharkbt_8741 = -1;
}
-void twincobr_state::twincobr_driver_savestate()
+void twincobr_state::driver_savestate()
{
save_item(NAME(m_intenable));
save_item(NAME(m_dsp_on));
@@ -268,6 +265,4 @@ void twincobr_state::twincobr_driver_savestate()
save_item(NAME(m_dsp_bio));
save_item(NAME(m_dsp_execute));
save_item(NAME(m_fsharkbt_8741));
-
- machine().save().register_postload(save_prepost_delegate(FUNC(twincobr_state::twincobr_restore_dsp), this));
}
diff --git a/src/mame/machine/v102_kbd.cpp b/src/mame/machine/v102_kbd.cpp
new file mode 100644
index 00000000000..728745dccc7
--- /dev/null
+++ b/src/mame/machine/v102_kbd.cpp
@@ -0,0 +1,225 @@
+// license:BSD-3-Clause
+// copyright-holders:AJR
+/***********************************************************************************************************************************
+
+Visual 102 keyboard emulation (somewhat preliminary).
+
+The internals of this VT102 lookalike seem typical of Keytronic keyboards. It transmits ASCII codes and receives commands at 600
+baud (8 data bits, no parity). The Visual 220 keyboard is different but apparently uses the same protocol.
+
+The input port definitions use the standard U.S./U.K. keyboard layout, though three alternate European layouts can be selected
+through software commands.
+
+************************************************************************************************************************************/
+
+#include "emu.h"
+#include "machine/v102_kbd.h"
+
+DEFINE_DEVICE_TYPE(V102_KEYBOARD, v102_keyboard_device, "v102_kbd", "Visual 102 Keyboard")
+
+v102_keyboard_device::v102_keyboard_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
+ : device_t(mconfig, V102_KEYBOARD, tag, owner, clock)
+ , m_txd_callback(*this)
+ , m_kbdc(*this, "kbdc")
+ , m_keys(*this, "KEY%u", 0U)
+{
+}
+
+INPUT_PORTS_START(v102_keyboard)
+ PORT_START("KEY0")
+ PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Left Shift") PORT_CHAR(UCHAR_SHIFT_1) PORT_CODE(KEYCODE_LSHIFT)
+ PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Ctrl") PORT_CHAR(UCHAR_SHIFT_2) PORT_CODE(KEYCODE_LCONTROL)
+ PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Caps Lock") PORT_CHAR(UCHAR_MAMEKEY(CAPSLOCK)) PORT_CODE(KEYCODE_CAPSLOCK)
+ PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Right Shift") PORT_CHAR(UCHAR_SHIFT_1) PORT_CODE(KEYCODE_RSHIFT)
+ PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Key C0")
+ PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR(0x1b) PORT_CODE(KEYCODE_TILDE)
+ PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Key 8C")
+ PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Key 84")
+
+ PORT_START("KEY1")
+ PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Key 83")
+ PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Keypad 6 " UTF8_RIGHT) PORT_CHAR(UCHAR_MAMEKEY(6_PAD)) PORT_CODE(KEYCODE_6_PAD)
+ PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Keypad 3 \xe2\x86\x98") PORT_CHAR(UCHAR_MAMEKEY(3_PAD)) PORT_CODE(KEYCODE_3_PAD)
+ PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_UNUSED)
+ PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR(UCHAR_MAMEKEY(MINUS_PAD)) PORT_CODE(KEYCODE_MINUS_PAD)
+ PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Keypad 9 \xe2\x86\x97") PORT_CHAR(UCHAR_MAMEKEY(9_PAD)) PORT_CODE(KEYCODE_9_PAD)
+ PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR(UCHAR_MAMEKEY(COMMA_PAD)) PORT_CODE(KEYCODE_PLUS_PAD)
+ PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR(UCHAR_MAMEKEY(DEL_PAD)) PORT_CODE(KEYCODE_DEL_PAD)
+
+ PORT_START("KEY2")
+ PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Key C4")
+ PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Key CC")
+ PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Key F8")
+ PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Key 90")
+ PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Key C8")
+ PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Key F4")
+ PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Key D0")
+ PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Key 94")
+
+ PORT_START("KEY3")
+ PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Line Feed") PORT_CHAR(0x0a)
+ PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('c') PORT_CHAR('C') PORT_CODE(KEYCODE_C)
+ PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Retn") PORT_CHAR(0x0d) PORT_CODE(KEYCODE_ENTER)
+ PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Key 81")
+ PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Key 88")
+ PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Back Space") PORT_CHAR(0x08) PORT_CODE(KEYCODE_BACKSPACE)
+ PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Del") PORT_CHAR(UCHAR_MAMEKEY(DEL)) PORT_CODE(KEYCODE_DEL)
+ PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR(UCHAR_MAMEKEY(0_PAD)) PORT_CODE(KEYCODE_0_PAD)
+
+ PORT_START("KEY4")
+ PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_UNUSED)
+ PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR(UCHAR_MAMEKEY(5_PAD)) PORT_CODE(KEYCODE_5_PAD)
+ PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Keypad 1 \xe2\x86\x99") PORT_CHAR(UCHAR_MAMEKEY(1_PAD)) PORT_CODE(KEYCODE_1_PAD)
+ PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_UNUSED)
+ PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Keypad 7 \xe2\x86\x96") PORT_CHAR(UCHAR_MAMEKEY(7_PAD)) PORT_CODE(KEYCODE_7_PAD)
+ PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Keypad 8 " UTF8_UP) PORT_CHAR(UCHAR_MAMEKEY(8_PAD)) PORT_CODE(KEYCODE_8_PAD)
+ PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Keypad 4 " UTF8_LEFT) PORT_CHAR(UCHAR_MAMEKEY(4_PAD)) PORT_CODE(KEYCODE_4_PAD)
+ PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Keypad 2 " UTF8_DOWN) PORT_CHAR(UCHAR_MAMEKEY(2_PAD)) PORT_CODE(KEYCODE_2_PAD)
+
+ PORT_START("KEY5")
+ PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("K") PORT_CHAR('k') PORT_CHAR('K') PORT_CHAR(0x0b) PORT_CODE(KEYCODE_K)
+ PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("P") PORT_CHAR('p') PORT_CHAR('P') PORT_CHAR(0x10) PORT_CODE(KEYCODE_P)
+ PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("H") PORT_CHAR('h') PORT_CHAR('H') PORT_CODE(KEYCODE_H)
+ PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("L") PORT_CHAR('l') PORT_CHAR('L') PORT_CHAR(0x0c) PORT_CODE(KEYCODE_L)
+ PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("U") PORT_CHAR('u') PORT_CHAR('U') PORT_CHAR(0x15) PORT_CODE(KEYCODE_U)
+ PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("I") PORT_CHAR('i') PORT_CHAR('I') PORT_CODE(KEYCODE_I)
+ PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("O") PORT_CHAR('o') PORT_CHAR('O') PORT_CHAR(0x0f) PORT_CODE(KEYCODE_O)
+ PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("J") PORT_CHAR('j') PORT_CHAR('J') PORT_CODE(KEYCODE_J)
+
+ PORT_START("KEY6")
+ PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("V") PORT_CHAR('v') PORT_CHAR('V') PORT_CHAR(0x16) PORT_CODE(KEYCODE_V)
+ PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("G Bell") PORT_CHAR('g') PORT_CHAR('G') PORT_CHAR(0x07) PORT_CODE(KEYCODE_G)
+ PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("F") PORT_CHAR('f') PORT_CHAR('F') PORT_CHAR(0x06) PORT_CODE(KEYCODE_F)
+ PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("N") PORT_CHAR('n') PORT_CHAR('N') PORT_CHAR(0x0e) PORT_CODE(KEYCODE_N)
+ PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("T") PORT_CHAR('t') PORT_CHAR('T') PORT_CHAR(0x14) PORT_CODE(KEYCODE_T)
+ PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR(' ') PORT_CODE(KEYCODE_SPACE)
+ PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Y") PORT_CHAR('y') PORT_CHAR('Y') PORT_CHAR(0x19) PORT_CODE(KEYCODE_Y)
+ PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("B") PORT_CHAR('b') PORT_CHAR('B') PORT_CHAR(0x02) PORT_CODE(KEYCODE_B)
+
+ PORT_START("KEY7")
+ PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Key F0")
+ PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Key E4")
+ PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Key E8")
+ PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Key FC")
+ PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Key D8")
+ PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Key DC")
+ PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Key E0")
+ PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Key EC")
+
+ PORT_START("KEY8")
+ PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("X") PORT_CHAR('x') PORT_CHAR('X') PORT_CHAR(0x18) PORT_CODE(KEYCODE_X)
+ PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("R") PORT_CHAR('r') PORT_CHAR('R') PORT_CHAR(0x12) PORT_CODE(KEYCODE_R)
+ PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("D") PORT_CHAR('d') PORT_CHAR('D') PORT_CHAR(0x04) PORT_CODE(KEYCODE_D)
+ PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("\\ |") PORT_CHAR('\\') PORT_CHAR('|') PORT_CHAR(0x1c) PORT_CODE(KEYCODE_RCONTROL)
+ PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Key D4")
+ PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('1') PORT_CHAR('!') PORT_CODE(KEYCODE_1)
+ PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("E") PORT_CHAR('e') PORT_CHAR('E') PORT_CHAR(0x16) PORT_CODE(KEYCODE_E)
+ PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("S") PORT_CHAR('s') PORT_CHAR('S') PORT_CHAR(0x16) PORT_CODE(KEYCODE_S)
+
+ PORT_START("KEY9")
+ PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("A") PORT_CHAR('a') PORT_CHAR('A') PORT_CHAR(0x01) PORT_CODE(KEYCODE_A)
+ PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("W") PORT_CHAR('w') PORT_CHAR('W') PORT_CHAR(0x17) PORT_CODE(KEYCODE_W)
+ PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('4') PORT_CHAR('$') PORT_CODE(KEYCODE_4)
+ PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Z") PORT_CHAR('z') PORT_CHAR('Z') PORT_CHAR(0x1a) PORT_CODE(KEYCODE_Z)
+ PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('2') PORT_CHAR('@') PORT_CODE(KEYCODE_2)
+ PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("3 # \xc2\xa3") PORT_CHAR('3') PORT_CHAR('#') PORT_CODE(KEYCODE_3)
+ PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Q") PORT_CHAR('q') PORT_CHAR('Q') PORT_CHAR(0x11) PORT_CODE(KEYCODE_Q)
+ PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('5') PORT_CHAR('%') PORT_CODE(KEYCODE_5)
+
+ PORT_START("KEY10")
+ PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('`') PORT_CHAR('~') PORT_CODE(KEYCODE_BACKSLASH)
+ PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('9') PORT_CHAR('(') PORT_CODE(KEYCODE_9)
+ PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('0') PORT_CHAR(')') PORT_CODE(KEYCODE_0)
+ PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('=') PORT_CHAR('+') PORT_CODE(KEYCODE_EQUALS)
+ PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('6') PORT_CHAR('^') PORT_CODE(KEYCODE_6)
+ PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('-') PORT_CHAR('_') PORT_CODE(KEYCODE_MINUS)
+ PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('8') PORT_CHAR('*') PORT_CODE(KEYCODE_8)
+ PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('7') PORT_CHAR('&') PORT_CODE(KEYCODE_9)
+
+ PORT_START("KEY11")
+ PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR(',') PORT_CHAR('<') PORT_CODE(KEYCODE_COMMA)
+ PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR(';') PORT_CHAR(':') PORT_CODE(KEYCODE_COLON)
+ PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('\'') PORT_CHAR('"') PORT_CODE(KEYCODE_QUOTE)
+ PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('.') PORT_CHAR('>') PORT_CODE(KEYCODE_STOP)
+ PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('[') PORT_CHAR('{') PORT_CODE(KEYCODE_OPENBRACE)
+ PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('/') PORT_CHAR('?') PORT_CODE(KEYCODE_SLASH)
+ PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("] }") PORT_CHAR(']') PORT_CHAR('}') PORT_CHAR(0x1d) PORT_CODE(KEYCODE_CLOSEBRACE)
+ PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("M") PORT_CHAR('m') PORT_CHAR('M') PORT_CODE(KEYCODE_M)
+INPUT_PORTS_END
+
+ioport_constructor v102_keyboard_device::device_input_ports() const
+{
+ return INPUT_PORTS_NAME(v102_keyboard);
+}
+
+void v102_keyboard_device::device_resolve_objects()
+{
+ m_txd_callback.resolve_safe();
+}
+
+void v102_keyboard_device::device_start()
+{
+ m_key_select = 0x0f;
+ m_prog_line = true;
+
+ save_item(NAME(m_prog_line));
+ save_item(NAME(m_key_select));
+}
+
+WRITE_LINE_MEMBER(v102_keyboard_device::write_rxd)
+{
+ m_kbdc->set_input_line(MCS48_INPUT_IRQ, state ? CLEAR_LINE : ASSERT_LINE);
+}
+
+u8 v102_keyboard_device::p1_r()
+{
+ if (m_key_select < 12)
+ return m_keys[m_key_select]->read();
+
+ return 0xff;
+}
+
+void v102_keyboard_device::p2_w(u8 data)
+{
+ m_txd_callback(BIT(data, 7));
+}
+
+WRITE_LINE_MEMBER(v102_keyboard_device::prog_w)
+{
+ if (state && !m_prog_line)
+ m_key_select = m_kbdc->p2_r() & 0x0f;
+
+ m_prog_line = bool(state);
+}
+
+void v102_keyboard_device::prog_map(address_map &map)
+{
+ map(0x000, 0x7ff).rom().region("kbdc", 0);
+}
+
+void v102_keyboard_device::ext_map(address_map &map)
+{
+ map(0x00, 0xff).nopr(); // only accessed at startup
+}
+
+void v102_keyboard_device::device_add_mconfig(machine_config &config)
+{
+ I8039(config, m_kbdc, 4.608_MHz_XTAL); // TMP8039P-6
+ m_kbdc->set_addrmap(AS_PROGRAM, &v102_keyboard_device::prog_map);
+ m_kbdc->set_addrmap(AS_IO, &v102_keyboard_device::ext_map);
+ m_kbdc->p1_in_cb().set(FUNC(v102_keyboard_device::p1_r));
+ m_kbdc->p2_out_cb().set(FUNC(v102_keyboard_device::p2_w));
+ m_kbdc->prog_out_cb().set(FUNC(v102_keyboard_device::prog_w));
+}
+
+// The oscillator is marked 4608 / 300 107 / KSS4D.
+// Flanking the "68039" and its oscillator are two 20-pin custom SDIPs from Exar, marked 22-908-03A and 22-950-3B.
+ROM_START(v102_kbd)
+ ROM_REGION(0x0800, "kbdc", 0)
+ ROM_LOAD("150.kbd", 0x0000, 0x0800, CRC(afe55cff) SHA1(b26ebdde63ec0e94c08780285def39a282e128b3)) // MM2716Q
+ROM_END
+
+const tiny_rom_entry *v102_keyboard_device::device_rom_region() const
+{
+ return ROM_NAME(v102_kbd);
+}
diff --git a/src/mame/machine/v102_kbd.h b/src/mame/machine/v102_kbd.h
new file mode 100644
index 00000000000..1a1a6a32c04
--- /dev/null
+++ b/src/mame/machine/v102_kbd.h
@@ -0,0 +1,45 @@
+// license:BSD-3-Clause
+// copyright-holders:AJR
+
+#ifndef MAME_MACHINE_V102_KBD_H
+#define MAME_MACHINE_V102_KBD_H
+
+#pragma once
+
+#include "cpu/mcs48/mcs48.h"
+
+class v102_keyboard_device : public device_t
+{
+public:
+ v102_keyboard_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock = 0);
+
+ auto txd_callback() { return m_txd_callback.bind(); }
+
+ DECLARE_WRITE_LINE_MEMBER(write_rxd);
+
+protected:
+ virtual ioport_constructor device_input_ports() const override;
+ virtual void device_resolve_objects() override;
+ virtual void device_start() override;
+ virtual void device_add_mconfig(machine_config &config) override;
+ virtual const tiny_rom_entry *device_rom_region() const override;
+
+private:
+ u8 p1_r();
+ void p2_w(u8 data);
+ DECLARE_WRITE_LINE_MEMBER(prog_w);
+ void prog_map(address_map &map);
+ void ext_map(address_map &map);
+
+ devcb_write_line m_txd_callback;
+
+ required_device<mcs48_cpu_device> m_kbdc;
+ required_ioport_array<12> m_keys;
+
+ u8 m_key_select;
+ bool m_prog_line;
+};
+
+DECLARE_DEVICE_TYPE(V102_KEYBOARD, v102_keyboard_device)
+
+#endif // MAME_MACHINE_V102_KBD_H
diff --git a/src/mame/machine/v1050kb.cpp b/src/mame/machine/v1050kb.cpp
index da37c65dd14..6b4d20fb4f5 100644
--- a/src/mame/machine/v1050kb.cpp
+++ b/src/mame/machine/v1050kb.cpp
@@ -72,7 +72,8 @@ DISCRETE_SOUND_END
// device_add_mconfig - add device configuration
//-------------------------------------------------
-MACHINE_CONFIG_START(v1050_keyboard_device::device_add_mconfig)
+void v1050_keyboard_device::device_add_mconfig(machine_config &config)
+{
I8049(config, m_maincpu, XTAL(4'608'000));
m_maincpu->p1_in_cb().set(FUNC(v1050_keyboard_device::kb_p1_r));
m_maincpu->p1_out_cb().set(FUNC(v1050_keyboard_device::kb_p1_w));
@@ -81,9 +82,8 @@ MACHINE_CONFIG_START(v1050_keyboard_device::device_add_mconfig)
// discrete sound
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD(DISCRETE_TAG, DISCRETE, v1050kb_discrete)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.80)
-MACHINE_CONFIG_END
+ DISCRETE(config, m_discrete, v1050kb_discrete).add_route(ALL_OUTPUTS, "mono", 0.80);
+}
//-------------------------------------------------
diff --git a/src/mame/machine/vector06.cpp b/src/mame/machine/vector06.cpp
index bd1b9797528..2208fc5024a 100644
--- a/src/mame/machine/vector06.cpp
+++ b/src/mame/machine/vector06.cpp
@@ -72,9 +72,9 @@ READ8_MEMBER( vector06_state::vector06_romdisk_portb_r )
{
uint16_t addr = ((m_romdisk_msb & 0x7f) << 8) | m_romdisk_lsb;
if ((m_romdisk_msb & 0x80) && m_cart->exists() && addr < m_cart->get_rom_size())
- return m_cart->read_rom(space, addr);
+ return m_cart->read_rom(addr);
else
- return m_ay->read_data();
+ return m_ay->data_r();
}
WRITE8_MEMBER(vector06_state::vector06_romdisk_portb_w)
@@ -90,7 +90,7 @@ WRITE8_MEMBER( vector06_state::vector06_romdisk_porta_w )
WRITE8_MEMBER( vector06_state::vector06_romdisk_portc_w )
{
if (data & 4)
- m_ay->address_data_w(space, (data >> 1) & 1, m_aylatch);
+ m_ay->address_data_w((data >> 1) & 1, m_aylatch);
m_romdisk_msb = data;
}
diff --git a/src/mame/machine/vectrex.cpp b/src/mame/machine/vectrex.cpp
index 67d64165f09..a54f3f0227e 100644
--- a/src/mame/machine/vectrex.cpp
+++ b/src/mame/machine/vectrex.cpp
@@ -205,7 +205,7 @@ READ8_MEMBER(vectrex_base_state::vectrex_via_pa_r)
if ((!(m_via_out[PORTB] & 0x10)) && (m_via_out[PORTB] & 0x08))
/* BDIR inactive, we can read the PSG. BC1 has to be active. */
{
- m_via_out[PORTA] = m_ay8912->data_r(space, 0)
+ m_via_out[PORTA] = m_ay8912->data_r()
& ~(m_imager_pinlevel & 0x80);
}
return m_via_out[PORTA];
diff --git a/src/mame/machine/vertigo.cpp b/src/mame/machine/vertigo.cpp
index da3ea2c1ef6..887b2a52fab 100644
--- a/src/mame/machine/vertigo.cpp
+++ b/src/mame/machine/vertigo.cpp
@@ -69,7 +69,7 @@ WRITE_LINE_MEMBER( vertigo_state::adc_eoc_w )
READ16_MEMBER(vertigo_state::vertigo_io_convert)
{
- m_adc->address_offset_start_w(space, offset, 0);
+ m_adc->address_offset_start_w(offset, 0);
return 0;
}
diff --git a/src/mame/machine/vt100_kbd.cpp b/src/mame/machine/vt100_kbd.cpp
index 134d0ef0571..591e0789cc4 100644
--- a/src/mame/machine/vt100_kbd.cpp
+++ b/src/mame/machine/vt100_kbd.cpp
@@ -73,7 +73,7 @@ static INPUT_PORTS_START(vt100_kbd)
PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("]") PORT_CODE(KEYCODE_CLOSEBRACE) PORT_CHAR(']') PORT_CHAR('}')
PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("~") PORT_CODE(KEYCODE_TILDE) PORT_CHAR('`') PORT_CHAR('~')
PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("=") PORT_CODE(KEYCODE_EQUALS) PORT_CHAR('=') PORT_CHAR('+')
- PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Line feed") PORT_CODE(KEYCODE_RALT) PORT_CHAR(UCHAR_MAMEKEY(RALT))
+ PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Line feed") PORT_CODE(KEYCODE_RALT) PORT_CHAR(0x0a)
PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_UNUSED)
PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Return") PORT_CODE(KEYCODE_ENTER) PORT_CHAR(13)
PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_UNUSED)
@@ -152,7 +152,7 @@ static INPUT_PORTS_START(vt100_kbd)
PORT_START("LINEE")
PORT_BIT(0x7F, IP_ACTIVE_LOW, IPT_UNUSED)
- PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Caps lock") PORT_CODE(KEYCODE_CAPSLOCK) PORT_CHAR(UCHAR_MAMEKEY(CAPSLOCK))
+ PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Caps lock") PORT_CODE(KEYCODE_CAPSLOCK) PORT_CHAR(UCHAR_MAMEKEY(CAPSLOCK)) PORT_TOGGLE
PORT_START("LINEF")
PORT_BIT(0x7F, IP_ACTIVE_LOW, IPT_UNUSED)
@@ -472,11 +472,11 @@ static INPUT_PORTS_START(ms7002)
PORT_START("LINED")
PORT_BIT(0x7F, IP_ACTIVE_LOW, IPT_UNUSED)
- PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("\xd0\x92\xd0\xa0") PORT_CODE(KEYCODE_LSHIFT) PORT_CHAR(UCHAR_SHIFT_1) // ВР = верхний регистр
+ PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("\xd0\xa1\xd0\x94\xd0\x92") PORT_CODE(KEYCODE_LSHIFT) PORT_CHAR(UCHAR_SHIFT_1) // СДВ = сдвинуть
PORT_START("LINEE")
PORT_BIT(0x7F, IP_ACTIVE_LOW, IPT_UNUSED)
- PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_CAPSLOCK) PORT_CHAR(UCHAR_MAMEKEY(CAPSLOCK)) // maybe
+ PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("\xd0\x92\xd0\xa0") PORT_CODE(KEYCODE_CAPSLOCK) PORT_CHAR(UCHAR_MAMEKEY(CAPSLOCK)) PORT_TOGGLE // ВР = верхний регистр
PORT_START("LINEF")
PORT_BIT(0x7F, IP_ACTIVE_LOW, IPT_UNUSED)
diff --git a/src/mame/machine/vtech2.cpp b/src/mame/machine/vtech2.cpp
index b5bcf1ff08e..494044db80b 100644
--- a/src/mame/machine/vtech2.cpp
+++ b/src/mame/machine/vtech2.cpp
@@ -43,9 +43,6 @@ void vtech2_state::init_laser()
// check ROM expansion
std::string region_tag;
m_cart_rom = memregion(region_tag.assign(m_cart->tag()).append(GENERIC_ROM_REGION_TAG).c_str());
-
- // setup expansion slot
- m_ioexp->set_io_space(&m_maincpu->space(AS_IO));
}
@@ -76,7 +73,7 @@ READ8_MEMBER( vtech2_state::cart_r )
{
if (offset >= m_cart_size)
return 0xff;
- return m_cart->read_rom(space, offset);
+ return m_cart->read_rom(offset);
}
diff --git a/src/mame/machine/wangpckb.cpp b/src/mame/machine/wangpckb.cpp
index 26c26b7204d..41aa630bb7a 100644
--- a/src/mame/machine/wangpckb.cpp
+++ b/src/mame/machine/wangpckb.cpp
@@ -102,7 +102,7 @@ void wangpc_keyboard_device::wangpc_keyboard_io(address_map &map)
{
//AM_RANGE(0x0000, 0xfeff) AM_READNOP
map(0x47, 0x58).mirror(0xff00).nopr();
- map(0x00, 0x00).mirror(0xff00).w(SN76496_TAG, FUNC(sn76496_device::command_w));
+ map(0x00, 0x00).mirror(0xff00).w(SN76496_TAG, FUNC(sn76496_device::write));
}
diff --git a/src/mame/machine/williams.cpp b/src/mame/machine/williams.cpp
index 267f7bad1f0..30e8ca1027c 100644
--- a/src/mame/machine/williams.cpp
+++ b/src/mame/machine/williams.cpp
@@ -523,13 +523,13 @@ TIMER_CALLBACK_MEMBER(joust2_state::joust2_deferred_snd_cmd_w)
WRITE_LINE_MEMBER(joust2_state::joust2_pia_3_cb1_w)
{
m_joust2_current_sound_data = (m_joust2_current_sound_data & ~0x100) | ((state << 8) & 0x100);
- m_cvsd_sound->write(machine().dummy_space(), 0, m_joust2_current_sound_data);
+ m_cvsd_sound->write(m_joust2_current_sound_data);
}
WRITE8_MEMBER(joust2_state::joust2_snd_cmd_w)
{
m_joust2_current_sound_data = (m_joust2_current_sound_data & ~0xff) | (data & 0xff);
- m_cvsd_sound->write(machine().dummy_space(), 0, m_joust2_current_sound_data);
+ m_cvsd_sound->write(m_joust2_current_sound_data);
machine().scheduler().synchronize(timer_expired_delegate(FUNC(joust2_state::joust2_deferred_snd_cmd_w),this), m_joust2_current_sound_data);
}
diff --git a/src/mame/machine/wswan.cpp b/src/mame/machine/wswan.cpp
index 4b13275868a..08fe0799392 100644
--- a/src/mame/machine/wswan.cpp
+++ b/src/mame/machine/wswan.cpp
@@ -137,7 +137,7 @@ void wswan_state::dma_sound_cb()
{
address_space &space = m_maincpu->space(AS_PROGRAM);
/* TODO: Output sound DMA byte */
- port_w(space, 0x89, space.read_byte(m_sound_dma.source));
+ port_w(0x89, space.read_byte(m_sound_dma.source));
m_sound_dma.size--;
m_sound_dma.source = (m_sound_dma.source + 1) & 0x0fffff;
if (m_sound_dma.size == 0)
@@ -180,15 +180,15 @@ void wswan_state::common_start()
if (m_cart->exists())
{
// ROM
- m_maincpu->space(AS_PROGRAM).install_read_handler(0x20000, 0x2ffff, read8_delegate(FUNC(ws_cart_slot_device::read_rom20),(ws_cart_slot_device*)m_cart));
- m_maincpu->space(AS_PROGRAM).install_read_handler(0x30000, 0x3ffff, read8_delegate(FUNC(ws_cart_slot_device::read_rom30),(ws_cart_slot_device*)m_cart));
- m_maincpu->space(AS_PROGRAM).install_read_handler(0x40000, 0xeffff, read8_delegate(FUNC(ws_cart_slot_device::read_rom40),(ws_cart_slot_device*)m_cart));
+ m_maincpu->space(AS_PROGRAM).install_read_handler(0x20000, 0x2ffff, read8sm_delegate(FUNC(ws_cart_slot_device::read_rom20),(ws_cart_slot_device*)m_cart));
+ m_maincpu->space(AS_PROGRAM).install_read_handler(0x30000, 0x3ffff, read8sm_delegate(FUNC(ws_cart_slot_device::read_rom30),(ws_cart_slot_device*)m_cart));
+ m_maincpu->space(AS_PROGRAM).install_read_handler(0x40000, 0xeffff, read8sm_delegate(FUNC(ws_cart_slot_device::read_rom40),(ws_cart_slot_device*)m_cart));
// SRAM
if (m_cart->get_type() == WS_SRAM)
{
- m_maincpu->space(AS_PROGRAM).install_read_handler(0x10000, 0x1ffff, read8_delegate(FUNC(ws_cart_slot_device::read_ram),(ws_cart_slot_device*)m_cart));
- m_maincpu->space(AS_PROGRAM).install_write_handler(0x10000, 0x1ffff, write8_delegate(FUNC(ws_cart_slot_device::write_ram),(ws_cart_slot_device*)m_cart));
+ m_maincpu->space(AS_PROGRAM).install_read_handler(0x10000, 0x1ffff, read8sm_delegate(FUNC(ws_cart_slot_device::read_ram),(ws_cart_slot_device*)m_cart));
+ m_maincpu->space(AS_PROGRAM).install_write_handler(0x10000, 0x1ffff, write8sm_delegate(FUNC(ws_cart_slot_device::write_ram),(ws_cart_slot_device*)m_cart));
}
}
}
@@ -224,15 +224,15 @@ void wswan_state::machine_reset()
memset(&m_sound_dma, 0, sizeof(m_sound_dma));
}
-READ8_MEMBER( wswan_state::bios_r )
+uint8_t wswan_state::bios_r(offs_t offset)
{
if (!m_bios_disabled)
return m_ws_bios_bank[offset];
else
- return m_cart->read_rom40(space, offset + 0xb0000);
+ return m_cart->read_rom40(offset + 0xb0000);
}
-READ8_MEMBER( wswan_state::port_r )
+uint8_t wswan_state::port_r(offs_t offset)
{
uint8_t value = m_ws_portram[offset];
@@ -240,7 +240,7 @@ READ8_MEMBER( wswan_state::port_r )
logerror("PC=%X: port read %02X\n", m_maincpu->pc(), offset);
if (offset < 0x40 || (offset >= 0xa1 && offset < 0xb0))
- return m_vdp->reg_r(space, offset);
+ return m_vdp->reg_r(offset);
switch (offset)
{
@@ -263,7 +263,7 @@ READ8_MEMBER( wswan_state::port_r )
value = m_sound_dma.enable;
break;
case 0x60:
- value = m_vdp->reg_r(space, offset);
+ value = m_vdp->reg_r(offset);
break;
case 0xa0: // Hardware type
// Bit 0 - Disable/enable Bios
@@ -289,14 +289,14 @@ READ8_MEMBER( wswan_state::port_r )
case 0xcd:
case 0xce:
case 0xcf:
- value = m_cart->read_io(space, offset & 0x0f);
+ value = m_cart->read_io(offset & 0x0f);
break;
}
return value;
}
-WRITE8_MEMBER( wswan_state::port_w )
+void wswan_state::port_w(offs_t offset, uint8_t data)
{
address_space &mem = m_maincpu->space(AS_PROGRAM);
uint8_t input;
@@ -304,7 +304,7 @@ WRITE8_MEMBER( wswan_state::port_w )
if (offset < 0x40 || (offset >= 0xa1 && offset < 0xb0))
{
- m_vdp->reg_w(space, offset, data);
+ m_vdp->reg_w(offset, data);
return;
}
@@ -403,7 +403,7 @@ WRITE8_MEMBER( wswan_state::port_w )
m_sound_dma.enable = data;
break;
case 0x60:
- m_vdp->reg_w(space, offset, data);
+ m_vdp->reg_w(offset, data);
break;
case 0x80: /* Audio 1 freq (lo)
Bit 0-7 - Audio channel 1 frequency bit 0-7
@@ -488,7 +488,7 @@ WRITE8_MEMBER( wswan_state::port_w )
Bit 0-3 - Master volume
Bit 4-7 - Unknown
*/
- m_sound->port_w(space, offset, data);
+ m_sound->port_w(offset, data);
break;
case 0xa0: /* Hardware type - this is probably read only
Bit 0 - Enable cartridge slot and/or disable bios
@@ -652,7 +652,7 @@ WRITE8_MEMBER( wswan_state::port_w )
case 0xcd:
case 0xce:
case 0xcf:
- m_cart->write_io(space, offset & 0x0f, data);
+ m_cart->write_io(offset & 0x0f, data);
break;
default:
logerror( "Write to unsupported port: %X - %X\n", offset, data );
diff --git a/src/mame/machine/wy50kb.cpp b/src/mame/machine/wy50kb.cpp
new file mode 100644
index 00000000000..ba964aa378f
--- /dev/null
+++ b/src/mame/machine/wy50kb.cpp
@@ -0,0 +1,187 @@
+// license:BSD-3-Clause
+// copyright-holders:AJR
+/*******************************************************************************
+
+ The WY-50, like other early Wyse products, has a detachable non-serial
+ keyboard with a custom round connector over which are passed 4 column
+ select bits (S6-S3), 3 row select bits (S2-S0) and one active-low return
+ line. The WY-1100 WysePC has a very similar key matrix.
+
+ 1 Ground
+ 2 Ground
+ 3 +5 Volts
+ 4 S2
+ 5 S1
+ 6 S0
+ 7 S3
+ 8 S5
+ 9 S6
+ 10 S4
+ 11 Keyboard Data
+ 12 Not Used
+
+*******************************************************************************/
+
+#include "emu.h"
+#include "machine/wy50kb.h"
+
+DEFINE_DEVICE_TYPE(WY50_KEYBOARD, wy50_keyboard_device, "wy50kb", "WY-50 Keyboard")
+
+wy50_keyboard_device::wy50_keyboard_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
+ : device_t(mconfig, WY50_KEYBOARD, tag, owner, clock)
+ , m_key_matrix(*this, "COL%u", 0U)
+ , m_address(0)
+{
+}
+
+static INPUT_PORTS_START(wy50kb)
+ PORT_START("COL0")
+ PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('u') PORT_CHAR('U') PORT_CODE(KEYCODE_U)
+ PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR(UCHAR_MAMEKEY(INSERT)) PORT_NAME("Ins Char Ins Line")
+ PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR(UCHAR_MAMEKEY(2_PAD)) PORT_CODE(KEYCODE_2_PAD)
+ PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('8') PORT_CHAR('*') PORT_CODE(KEYCODE_8)
+ PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR(UCHAR_MAMEKEY(NUMLOCK)) PORT_NAME("Clr Line Clr Scrn")
+ PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR(UCHAR_MAMEKEY(DOWN)) PORT_CODE(KEYCODE_DOWN)
+ PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR(',') PORT_CHAR('<') PORT_CODE(KEYCODE_COMMA)
+ PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('h') PORT_CHAR('H') PORT_CODE(KEYCODE_H)
+
+ PORT_START("COL1")
+ PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('y') PORT_CHAR('Y') PORT_CODE(KEYCODE_Y)
+ PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_UNUSED)
+ PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR(UCHAR_MAMEKEY(RIGHT)) PORT_CODE(KEYCODE_RIGHT)
+ PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('7') PORT_CHAR('&') PORT_CODE(KEYCODE_7)
+ PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Set Up") PORT_CODE(KEYCODE_ESC)
+ PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_UNUSED)
+ PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('m') PORT_CHAR('M') PORT_CODE(KEYCODE_M)
+ PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('g') PORT_CHAR('G') PORT_CODE(KEYCODE_G)
+
+ PORT_START("COL2")
+ PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('t') PORT_CHAR('T') PORT_CODE(KEYCODE_T)
+ PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR(UCHAR_MAMEKEY(4_PAD)) PORT_CODE(KEYCODE_4_PAD)
+ PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR(UCHAR_MAMEKEY(1_PAD)) PORT_CODE(KEYCODE_1_PAD)
+ PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('6') PORT_CHAR('^') PORT_CODE(KEYCODE_6)
+ PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR(UCHAR_MAMEKEY(7_PAD)) PORT_CODE(KEYCODE_7_PAD)
+ PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR(UCHAR_MAMEKEY(0_PAD)) PORT_CODE(KEYCODE_0_PAD)
+ PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('n') PORT_CHAR('N') PORT_CODE(KEYCODE_N)
+ PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('f') PORT_CHAR('F') PORT_CODE(KEYCODE_F)
+
+ PORT_START("COL3")
+ PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR(0x09) PORT_CODE(KEYCODE_TAB)
+ PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR(' ') PORT_CODE(KEYCODE_SPACE)
+ PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Back Space") PORT_CHAR(0x08) PORT_CODE(KEYCODE_BACKSPACE)
+ PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('1') PORT_CHAR('!') PORT_CODE(KEYCODE_1)
+ PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR(UCHAR_MAMEKEY(F10)) PORT_CODE(KEYCODE_F10)
+ PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR(UCHAR_MAMEKEY(F1)) PORT_CODE(KEYCODE_F1)
+ PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('z') PORT_CHAR('Z') PORT_CODE(KEYCODE_Z)
+ PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Ctrl") PORT_CHAR(UCHAR_MAMEKEY(LCONTROL)) PORT_CODE(KEYCODE_LCONTROL)
+
+ PORT_START("COL4")
+ PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR(UCHAR_MAMEKEY(F5)) PORT_CODE(KEYCODE_F5)
+ PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR(UCHAR_MAMEKEY(F16)) PORT_CODE(KEYCODE_F16)
+ PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR(UCHAR_MAMEKEY(F12)) PORT_CODE(KEYCODE_F12)
+ PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR(UCHAR_MAMEKEY(F3)) PORT_CODE(KEYCODE_F4)
+ PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR(UCHAR_MAMEKEY(F9)) PORT_CODE(KEYCODE_F9)
+ PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR(UCHAR_MAMEKEY(F3)) PORT_CODE(KEYCODE_F3)
+ PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR(UCHAR_MAMEKEY(F7)) PORT_CODE(KEYCODE_F7)
+ PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR(UCHAR_MAMEKEY(F6)) PORT_CODE(KEYCODE_F6)
+
+ PORT_START("COL5")
+ PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('r') PORT_CHAR('R') PORT_CODE(KEYCODE_R)
+ PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR(UCHAR_MAMEKEY(DEL_PAD)) PORT_CODE(KEYCODE_DEL_PAD)
+ PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR(UCHAR_MAMEKEY(5_PAD)) PORT_CODE(KEYCODE_5_PAD)
+ PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('5') PORT_CHAR('%') PORT_CODE(KEYCODE_5)
+ PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR(UCHAR_MAMEKEY(6_PAD)) PORT_CODE(KEYCODE_6_PAD)
+ PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR(UCHAR_MAMEKEY(DEL)) PORT_NAME("Del Char Del Line")
+ PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('b') PORT_CHAR('B') PORT_CODE(KEYCODE_B)
+ PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('l') PORT_CHAR('L') PORT_CODE(KEYCODE_L)
+
+ PORT_START("COL6")
+ PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('e') PORT_CHAR('E') PORT_CODE(KEYCODE_E)
+ PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR(UCHAR_MAMEKEY(MINUS_PAD)) PORT_CODE(KEYCODE_MINUS_PAD)
+ PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Repl Ins")
+ PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('4') PORT_CHAR('$') PORT_CODE(KEYCODE_4)
+ PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Break")
+ PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR(UCHAR_MAMEKEY(ENTER_PAD)) PORT_CODE(KEYCODE_ENTER_PAD)
+ PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('v') PORT_CHAR('V') PORT_CODE(KEYCODE_V)
+ PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('d') PORT_CHAR('D') PORT_CODE(KEYCODE_D)
+
+ PORT_START("COL7")
+ PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('q') PORT_CHAR('Q') PORT_CODE(KEYCODE_Q)
+ PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Func") PORT_CODE(KEYCODE_LALT)
+ PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR(UCHAR_MAMEKEY(CAPSLOCK)) PORT_CODE(KEYCODE_CAPSLOCK)
+ PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('2') PORT_CHAR('@') PORT_CODE(KEYCODE_2)
+ PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Esc") PORT_CHAR(0x1b) PORT_CODE(KEYCODE_TILDE)
+ PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR(UCHAR_MAMEKEY(F2)) PORT_CODE(KEYCODE_F2)
+ PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('x') PORT_CHAR('X') PORT_CODE(KEYCODE_X)
+ PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('a') PORT_CHAR('A') PORT_CODE(KEYCODE_A)
+
+ PORT_START("COL8")
+ PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_UNUSED)
+ PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Next Page Prev Page") PORT_CODE(KEYCODE_PGDN)
+ PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('[') PORT_CHAR('{') PORT_CODE(KEYCODE_OPENBRACE)
+ PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('-') PORT_CHAR('_') PORT_CODE(KEYCODE_MINUS)
+ PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR(';') PORT_CHAR(':') PORT_CODE(KEYCODE_COLON)
+ PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR(']') PORT_CHAR('}') PORT_CODE(KEYCODE_CLOSEBRACE)
+ PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('\'') PORT_CHAR('"') PORT_CODE(KEYCODE_QUOTE)
+ PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_UNUSED)
+
+ PORT_START("COL9")
+ PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('w') PORT_CHAR('W') PORT_CODE(KEYCODE_W)
+ PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR(UCHAR_MAMEKEY(F8)) PORT_CODE(KEYCODE_F8)
+ PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Shift") PORT_CHAR(UCHAR_SHIFT_1) PORT_CODE(KEYCODE_LSHIFT) PORT_CODE(KEYCODE_RSHIFT)
+ PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('3') PORT_CHAR('#') PORT_CODE(KEYCODE_3)
+ PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('`') PORT_CHAR('~') PORT_CODE(KEYCODE_BACKSLASH) // to right of ]
+ PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR(UCHAR_MAMEKEY(UP)) PORT_CODE(KEYCODE_UP)
+ PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('c') PORT_CHAR('c') PORT_CODE(KEYCODE_C)
+ PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('s') PORT_CHAR('S') PORT_CODE(KEYCODE_S)
+
+ PORT_START("COL10")
+ PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR(UCHAR_MAMEKEY(F13)) PORT_CODE(KEYCODE_F13)
+ PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('p') PORT_CHAR('P') PORT_CODE(KEYCODE_P)
+ PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR(UCHAR_MAMEKEY(3_PAD)) PORT_CODE(KEYCODE_3_PAD)
+ PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('=') PORT_CHAR('+') PORT_CODE(KEYCODE_EQUALS)
+ PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR(UCHAR_MAMEKEY(F14)) PORT_CODE(KEYCODE_F14)
+ PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR(UCHAR_MAMEKEY(8_PAD)) PORT_CODE(KEYCODE_8_PAD)
+ PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR(UCHAR_MAMEKEY(F15)) PORT_CODE(KEYCODE_F15)
+ PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR(UCHAR_MAMEKEY(F11)) PORT_CODE(KEYCODE_F11)
+
+ PORT_START("COL11")
+ PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('i') PORT_CHAR('I') PORT_CODE(KEYCODE_I)
+ PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR(UCHAR_MAMEKEY(9_PAD)) PORT_CODE(KEYCODE_9_PAD)
+ PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR(UCHAR_MAMEKEY(LEFT)) PORT_CODE(KEYCODE_LEFT)
+ PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('9') PORT_CHAR('(') PORT_CODE(KEYCODE_9)
+ PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('\\') PORT_CHAR('|') PORT_CODE(KEYCODE_RALT) // between space bar and left
+ PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR(UCHAR_MAMEKEY(COMMA_PAD)) PORT_CODE(KEYCODE_PLUS_PAD)
+ PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('.') PORT_CHAR('>') PORT_CODE(KEYCODE_STOP)
+ PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('j') PORT_CHAR('J') PORT_CODE(KEYCODE_J)
+
+ PORT_START("COL12")
+ PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('o') PORT_CHAR('O') PORT_CODE(KEYCODE_O)
+ PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR(UCHAR_MAMEKEY(HOME))
+ PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Del") PORT_CHAR(0x7f)
+ PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('0') PORT_CHAR(')') PORT_CODE(KEYCODE_0)
+ PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Send Print")
+ PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Return") PORT_CHAR(0x0d) PORT_CODE(KEYCODE_ENTER)
+ PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('/') PORT_CHAR('?') PORT_CODE(KEYCODE_SLASH)
+ PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('k') PORT_CHAR('K') PORT_CODE(KEYCODE_K)
+INPUT_PORTS_END
+
+ioport_constructor wy50_keyboard_device::device_input_ports() const
+{
+ return INPUT_PORTS_NAME(wy50kb);
+}
+
+void wy50_keyboard_device::device_start()
+{
+ save_item(NAME(m_address));
+}
+
+void wy50_keyboard_device::scan_w(u8 address)
+{
+ m_address = address;
+}
+
+READ_LINE_MEMBER(wy50_keyboard_device::sense_r)
+{
+ return BIT(m_key_matrix[(m_address >> 3) & 15].read_safe(0xff), m_address & 7);
+}
diff --git a/src/mame/machine/wy50kb.h b/src/mame/machine/wy50kb.h
new file mode 100644
index 00000000000..8b9afbe0490
--- /dev/null
+++ b/src/mame/machine/wy50kb.h
@@ -0,0 +1,29 @@
+// license:BSD-3-Clause
+// copyright-holders:AJR
+
+#ifndef MAME_MACHINE_WY50KB_H
+#define MAME_MACHINE_WY50KB_H
+
+#pragma once
+
+class wy50_keyboard_device : public device_t
+{
+public:
+ wy50_keyboard_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock = 0);
+
+ void scan_w(u8 address);
+ DECLARE_READ_LINE_MEMBER(sense_r);
+
+protected:
+ virtual ioport_constructor device_input_ports() const override;
+ virtual void device_start() override;
+
+private:
+ optional_ioport_array<16> m_key_matrix;
+
+ u8 m_address;
+};
+
+DECLARE_DEVICE_TYPE(WY50_KEYBOARD, wy50_keyboard_device)
+
+#endif // MAME_MACHINE_WY50KB_H
diff --git a/src/mame/machine/xavix.cpp b/src/mame/machine/xavix.cpp
index dc4058f861f..480e5155cfd 100644
--- a/src/mame/machine/xavix.cpp
+++ b/src/mame/machine/xavix.cpp
@@ -247,58 +247,6 @@ WRITE8_MEMBER(xavix_state::ioevent_irqack_w)
-WRITE8_MEMBER(xavix_state::adc_7b00_w)
-{
- LOG("%s: adc_7b00_w %02x\n", machine().describe_context(), data);
-}
-
-READ8_MEMBER(xavix_state::adc_7b80_r)
-{
- LOG("%s: adc_7b80_r\n", machine().describe_context());
- return m_adc_inlatch;
-}
-
-WRITE8_MEMBER(xavix_state::adc_7b80_w)
-{
- // is the latch writeable?
- LOG("%s: adc_7b80_w %02x\n", machine().describe_context(), data);
-}
-
-WRITE8_MEMBER(xavix_state::adc_7b81_w)
-{
-// m_irqsource &= ~0x04;
-// update_irqs();
-
- LOG("%s: adc_7b81_w %02x\n", machine().describe_context(), data);
- m_adc_control = data;
-
- // bit 0x40 = run? or IRQ? (doesn't seem to be any obvious way to clear IRQs tho, ADC handling is usually done in timer IRQ?)
- // should probably set latch after a timer has expired not instantly?
- // bits 0x0c are not port select?
- // bit 0x80 is some kind of ack? / done flag?
- switch (m_adc_control & 0x13)
- {
- case 0x00: m_adc_inlatch = m_an_in[0]->read(); break;
- case 0x01: m_adc_inlatch = m_an_in[1]->read(); break;
- case 0x02: m_adc_inlatch = m_an_in[2]->read(); break;
- case 0x03: m_adc_inlatch = m_an_in[3]->read(); break;
- case 0x10: m_adc_inlatch = m_an_in[4]->read(); break;
- case 0x11: m_adc_inlatch = m_an_in[5]->read(); break;
- case 0x12: m_adc_inlatch = m_an_in[6]->read(); break;
- case 0x13: m_adc_inlatch = m_an_in[7]->read(); break;
- }
-
-// m_adc_timer->adjust(attotime::from_usec(200));
-}
-
-READ8_MEMBER(xavix_state::adc_7b81_r)
-{
-// has_wamg polls this if interrupt is enabled
- return machine().rand();
-}
-
-
-
WRITE8_MEMBER(xavix_state::slotreg_7810_w)
{
LOG("%s: slotreg_7810_w %02x\n", machine().describe_context(), data);
@@ -366,7 +314,23 @@ WRITE8_MEMBER(xavix_state::dispctrl_6ff8_w)
m_maincpu->set_input_line(INPUT_LINE_NMI, CLEAR_LINE);
}
+ uint8_t old_vid = m_video_ctrl;
+
m_video_ctrl = data & 0x3f;
+
+ // epo_guru needs something like this, otherwise raster IRQ ends up blocking all other IRQs forever
+ if ((old_vid & 0x10) != (m_video_ctrl & 0x10))
+ {
+ if (!(m_video_ctrl & 0x10))
+ {
+ //printf("callback on scanline %d %d with IRQ enabled\n", m_screen->vpos(), m_screen->hpos());
+ m_video_ctrl &= ~0x40;
+ m_irqsource &= ~0x40;
+ update_irqs();
+ }
+ }
+
+
// printf("%s: dispctrl_6ff8_w %02x\n", machine().describe_context(), data);
}
@@ -393,7 +357,8 @@ TIMER_CALLBACK_MEMBER(xavix_state::interrupt_gen)
m_screen->update_partial(m_screen->vpos());
}
- m_interrupt_timer->adjust(attotime::never, 0);
+// m_interrupt_timer->adjust(attotime::never, 0);
+ m_interrupt_timer->adjust(m_screen->time_until_pos(m_posirq_y[0], m_posirq_x[0]), 0); // epo_dmon expects it to keep firing without being reloaded? check this doesn't break anything else!
}
@@ -413,14 +378,75 @@ WRITE8_MEMBER(xavix_state::dispctrl_posirq_y_w)
/* Per Game IO port callbacks */
+
+CUSTOM_INPUT_MEMBER(xavix_i2c_state::i2c_r)
+{
+ return m_i2cmem->read_sda();
+}
+
+CUSTOM_INPUT_MEMBER(xavix_i2c_cart_state::i2c_r)
+{
+ return m_i2cmem->read_sda();
+}
+
+CUSTOM_INPUT_MEMBER(xavix_i2c_lotr_state::camera_r) // seems to be some kind of camera status bits
+{
+ return machine().rand();
+}
+
+CUSTOM_INPUT_MEMBER(xavix_i2c_bowl_state::camera_r) // seems to be some kind of camera status bits
+{
+ return machine().rand();
+}
+
+CUSTOM_INPUT_MEMBER(xavix_ekara_state::ekara_multi0_r)
+{
+ switch (m_extraioselect & 0x7f)
+ {
+ case 0x01: return (m_extra0->read() & 0x01) >> 0; break;
+ case 0x02: return (m_extra0->read() & 0x04) >> 2; break;
+ case 0x04: return (m_extra0->read() & 0x10) >> 4; break;
+ case 0x08: return (m_extra0->read() & 0x40) >> 6; break;
+ case 0x10: return (m_extra1->read() & 0x01) >> 0; break;
+ case 0x20: return (m_extra1->read() & 0x04) >> 2; break;
+ case 0x40: return (m_extra1->read() & 0x10) >> 4; break;
+ default:
+ LOG("latching inputs with invalid m_extraioselect value of %02x\n", m_extraioselect);
+ return 0x00;
+ }
+ return 0x00;
+}
+
+CUSTOM_INPUT_MEMBER(xavix_ekara_state::ekara_multi1_r)
+{
+ switch (m_extraioselect & 0x7f)
+ {
+ case 0x01: return (m_extra0->read() & 0x02) >> 1;
+ case 0x02: return (m_extra0->read() & 0x08) >> 3;
+ case 0x04: return (m_extra0->read() & 0x20) >> 5;
+ case 0x08: return (m_extra0->read() & 0x80) >> 7;
+ case 0x10: return (m_extra1->read() & 0x02) >> 1;
+ case 0x20: return (m_extra1->read() & 0x08) >> 3;
+ case 0x40: return (m_extra1->read() & 0x20) >> 5;
+ default:
+ LOG("latching inputs with invalid m_extraioselect value of %02x\n", m_extraioselect);
+ return 0x00;
+ }
+ return 0x00;
+}
+
uint8_t xavix_state::read_io0(uint8_t direction)
{
+// LOG("%s: read_io0\n", machine().describe_context());
+
// no special handling
return m_in0->read();
}
uint8_t xavix_state::read_io1(uint8_t direction)
{
+// LOG("%s: read_io1\n", machine().describe_context());
+
// no special handling
return m_in1->read();
}
@@ -435,19 +461,6 @@ void xavix_state::write_io1(uint8_t data, uint8_t direction)
// no special handling
}
-uint8_t xavix_i2c_state::read_io1(uint8_t direction)
-{
- uint8_t ret = m_in1->read();
-
- if (!(direction & 0x08))
- {
- ret &= ~0x08;
- ret |= (m_i2cmem->read_sda() & 1) << 3;
- }
-
- return ret;
-}
-
void xavix_i2c_state::write_io1(uint8_t data, uint8_t direction)
{
// ignore these writes so that epo_edfx can send read requests to the ee-prom and doesn't just report an error
@@ -468,20 +481,22 @@ void xavix_i2c_state::write_io1(uint8_t data, uint8_t direction)
}
}
-// for taikodp
-uint8_t xavix_i2c_cart_state::read_io1(uint8_t direction)
+// ltv_tam
+void xavix_i2c_ltv_tam_state::write_io1(uint8_t data, uint8_t direction)
{
- uint8_t ret = m_in1->read();
-
- if (!(direction & 0x08))
+ if (direction & 0x08)
{
- ret &= ~0x08;
- ret |= (m_i2cmem->read_sda() & 1) << 3;
+ m_i2cmem->write_sda((data & 0x08) >> 3);
}
- return ret;
+ if (direction & 0x04)
+ {
+ m_i2cmem->write_scl((data & 0x04) >> 2);
+ }
}
+
+// for taikodp
void xavix_i2c_cart_state::write_io1(uint8_t data, uint8_t direction)
{
if (direction & 0x08)
@@ -495,83 +510,80 @@ void xavix_i2c_cart_state::write_io1(uint8_t data, uint8_t direction)
}
}
+void xavix_ekara_state::write_io0(uint8_t data, uint8_t direction)
+{
+ // is bit 0x80 an enable for something else? LED? Microphone? it doesn't seem related to the multiplexing
+ m_extraioselect = data & direction;
+}
-uint8_t xavix_i2c_lotr_state::read_io1(uint8_t direction)
+void xavix_ekara_state::write_io1(uint8_t data, uint8_t direction)
{
- uint8_t ret = m_in1->read();
+ uint8_t extraiowrite = data & direction;
+ m_extraiowrite = extraiowrite;
+}
- // some kind of comms with the IR sensor?
- ret ^= (machine().rand() & 0x02);
- ret ^= (machine().rand() & 0x04);
+/* SuperXavix IO port handliner (per game) */
- if (!(direction & 0x08))
- {
- ret &= ~0x08;
- ret |= (m_i2cmem->read_sda() & 1) << 3;
- }
+READ8_MEMBER(xavix_i2c_jmat_state::read_extended_io0)
+{
+ LOG("%s: read_extended_io0\n", machine().describe_context());
+ return 0x00;
+}
- return ret;
+READ8_MEMBER(xavix_i2c_jmat_state::read_extended_io1)
+{
+ LOG("%s: read_extended_io1\n", machine().describe_context());
+
+ // reads this by reading the byte, then shifting right 4 times to place value into carry flag
+ return m_i2cmem->read_sda() << 3;
+ //return 0x00;
}
-uint8_t xavix_ekara_state::read_io1(uint8_t direction)
+READ8_MEMBER(xavix_i2c_jmat_state::read_extended_io2)
{
- uint8_t extrainlatch0 = 0x00;
- uint8_t extrainlatch1 = 0x00;
+ LOG("%s: read_extended_io2\n", machine().describe_context());
+ return 0x00;
+}
- switch (m_extraioselect & 0x7f)
- {
- case 0x01:
- extrainlatch0 = (m_extra0->read() & 0x01) >> 0;
- extrainlatch1 = (m_extra0->read() & 0x02) >> 1;
- break;
- case 0x02:
- extrainlatch0 = (m_extra0->read() & 0x04) >> 2;
- extrainlatch1 = (m_extra0->read() & 0x08) >> 3;
- break;
- case 0x04:
- extrainlatch0 = (m_extra0->read() & 0x10) >> 4;
- extrainlatch1 = (m_extra0->read() & 0x20) >> 5;
- break;
- case 0x08:
- extrainlatch0 = (m_extra0->read() & 0x40) >> 6;
- extrainlatch1 = (m_extra0->read() & 0x80) >> 7;
- break;
- case 0x10:
- extrainlatch0 = (m_extra1->read() & 0x01) >> 0;
- extrainlatch1 = (m_extra1->read() & 0x02) >> 1;
- break;
- case 0x20:
- extrainlatch0 = (m_extra1->read() & 0x04) >> 2;
- extrainlatch1 = (m_extra1->read() & 0x08) >> 3;
- break;
- case 0x40:
- extrainlatch0 = (m_extra1->read() & 0x10) >> 4;
- extrainlatch1 = (m_extra1->read() & 0x20) >> 5;
- break;
- default:
- LOG("latching inputs with invalid m_extraioselect value of %02x\n", m_extraioselect);
- break;
- }
+WRITE8_MEMBER(xavix_i2c_jmat_state::write_extended_io0)
+{
+ LOG("%s: io0_data_w %02x\n", machine().describe_context(), data);
+}
+
+WRITE8_MEMBER(xavix_i2c_jmat_state::write_extended_io1)
+{
+ LOG("%s: io1_data_w %02x\n", machine().describe_context(), data);
+
+ m_i2cmem->write_sda((data & 0x08) >> 3);
+ m_i2cmem->write_scl((data & 0x10) >> 4);
- uint8_t ret = m_in1->read();
- ret &= 0xfc;
- ret |= extrainlatch0 << 0;
- ret |= extrainlatch1 << 1;
- return ret;
}
-void xavix_ekara_state::write_io0(uint8_t data, uint8_t direction)
+WRITE8_MEMBER(xavix_i2c_jmat_state::write_extended_io2)
{
- // is bit 0x80 an enable for something else? LED? Microphone? it doesn't seem related to the multiplexing
- m_extraioselect = data & direction;
+ LOG("%s: io2_data_w %02x\n", machine().describe_context(), data);
}
-void xavix_ekara_state::write_io1(uint8_t data, uint8_t direction)
+// the cart pins Popira 2 uses for IO with cart gc0010 are not controllable by the CPU on other ekara systems
+
+CUSTOM_INPUT_MEMBER(xavix_popira2_cart_state::i2c_r)
{
- uint8_t extraiowrite = data & direction;
- m_extraiowrite = extraiowrite;
+ if (m_cartslot->has_cart())
+ return m_cartslot->read_sda();
+ else
+ return 0x0;
+}
+
+void xavix_popira2_cart_state::write_io1(uint8_t data, uint8_t direction)
+{
+ if (m_cartslot->has_cart())
+ {
+ m_cartslot->write_sda((data & 0x08) >> 3);
+ m_cartslot->write_scl((data & 0x10) >> 4);
+ }
}
+
/* General IO port handling */
READ8_MEMBER(xavix_state::io0_data_r)
@@ -602,14 +614,14 @@ READ8_MEMBER(xavix_state::io1_direction_r)
WRITE8_MEMBER(xavix_state::io0_data_w)
{
m_io0_data = data;
- write_io0(data, m_io0_direction);
+ write_io0((data & m_io0_direction) | (read_io0(m_io0_direction) & ~m_io0_direction), m_io0_direction);
LOG("%s: io0_data_w %02x\n", machine().describe_context(), data);
}
WRITE8_MEMBER(xavix_state::io1_data_w)
{
m_io1_data = data;
- write_io1(data, m_io1_direction);
+ write_io1((data & m_io1_direction) | (read_io1(m_io1_direction) & ~m_io1_direction), m_io1_direction);
LOG("%s: io1_data_w %02x\n", machine().describe_context(), data);
}
@@ -793,79 +805,6 @@ TIMER_CALLBACK_MEMBER(xavix_state::freq_timer_done)
//m_freq_timer->adjust(attotime::from_usec(50000));
}
-TIMER_CALLBACK_MEMBER(xavix_state::adc_timer_done)
-{
- //m_irqsource |= 0x04;
- //update_irqs();
-}
-
-
-
-READ8_MEMBER(xavix_state::mult_r)
-{
- return m_multresults[offset];
-}
-
-WRITE8_MEMBER(xavix_state::mult_w)
-{
- // rad_madf writes here to set the base value which the multiplication result gets added to
- m_multresults[offset] = data;
-}
-
-READ8_MEMBER(xavix_state::mult_param_r)
-{
- return m_multparams[offset];
-}
-
-WRITE8_MEMBER(xavix_state::mult_param_w)
-{
- COMBINE_DATA(&m_multparams[offset]);
- // there are NOPs after one of the writes, so presumably the operation is write triggerd and not intstant
- // see test code at 0184a4 in monster truck
-
- // offset0 is control
-
- // mm-- --Ss
- // mm = mode, S = sign for param1, s = sign for param2
- // modes 00 = multiply (regular?) 11 = add to previous 01 / 10 unknown (maybe subtract?)
-
- if (offset == 2)
- {
- // assume 0 is upper bits, might be 'mode' instead, check
-
-
- int signmode = (m_multparams[0] & 0x3f);
-
- uint16_t result = 0;
-
- // rad_madf uses this mode (add to previous result)
- if ((m_multparams[0] & 0xc0) == 0xc0)
- {
- const int param1 = signmode & 0x2 ? (int8_t)m_multparams[1] : (uint8_t)m_multparams[1];
- const int param2 = signmode & 0x1 ? (int8_t)m_multparams[2] : (uint8_t)m_multparams[2];
-
- result = param1 * param2;
-
- uint16_t oldresult = (m_multresults[1] << 8) | m_multresults[0];
- result = oldresult + result;
- }
- else if ((m_multparams[0] & 0xc0) == 0x00)
- {
- const int param1 = signmode & 0x2 ? (int8_t)m_multparams[1] : (uint8_t)m_multparams[1];
- const int param2 = signmode & 0x1 ? (int8_t)m_multparams[2] : (uint8_t)m_multparams[2];
-
- result = param1 * param2;
- }
- else
- {
- popmessage("unknown multiplier mode %02x", m_multparams[0] & 0xc0);
- }
-
- m_multresults[1] = (result >> 8) & 0xff;
- m_multresults[0] = result & 0xff;
- }
-}
-
READ8_MEMBER(xavix_state::irq_source_r)
{
@@ -908,7 +847,6 @@ void xavix_state::machine_start()
m_interrupt_timer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(xavix_state::interrupt_gen), this));
m_freq_timer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(xavix_state::freq_timer_done), this));
- m_adc_timer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(xavix_state::adc_timer_done), this));
for (int i = 0; i < 4; i++)
{
@@ -926,7 +864,6 @@ void xavix_state::machine_start()
save_item(NAME(m_io1_data));
save_item(NAME(m_io0_direction));
save_item(NAME(m_io1_direction));
- save_item(NAME(m_adc_control));
save_item(NAME(m_sound_irqstatus));
save_item(NAME(m_soundreg16_0));
save_item(NAME(m_soundreg16_1));
@@ -940,8 +877,6 @@ void xavix_state::machine_start()
save_item(NAME(m_nmi_vector_hi_data));
save_item(NAME(m_irq_vector_lo_data));
save_item(NAME(m_irq_vector_hi_data));
- save_item(NAME(m_multparams));
- save_item(NAME(m_multresults));
save_item(NAME(m_spritefragment_dmaparam1));
save_item(NAME(m_spritefragment_dmaparam2));
save_item(NAME(m_tmap1_regs));
@@ -958,6 +893,8 @@ void xavix_state::machine_start()
save_item(NAME(m_sndtimer));
save_item(NAME(m_timer_baseval));
save_item(NAME(m_spritereg));
+
+ save_item(NAME(m_sx_extended_extbus));
}
void xavix_state::machine_reset()
@@ -996,8 +933,6 @@ void xavix_state::machine_reset()
m_sndtimer[i] = 0x00;
}
- std::fill(std::begin(m_multparams), std::end(m_multparams), 0x00);
- std::fill(std::begin(m_multresults), std::end(m_multresults), 0x00);
std::fill(std::begin(m_spritefragment_dmaparam1), std::end(m_spritefragment_dmaparam1), 0x00);
std::fill(std::begin(m_tmap1_regs), std::end(m_tmap1_regs), 0x00);
std::fill(std::begin(m_tmap2_regs), std::end(m_tmap2_regs), 0x00);
@@ -1021,9 +956,8 @@ void xavix_state::machine_reset()
m_sound_irqstatus = 0x00;
- m_sound_regbase = 0x00;
+ m_sound_regbase = 0x02; // rad_bb doesn't initialize this and expects it here. It is possible the default is 0x00, but since 0x00 and 0x01 are special (zero page and stack) those values would also use bank 0x02
- m_adc_control = 0x00;
m_sprite_xhigh_ignore_hack = true;
@@ -1033,6 +967,13 @@ void xavix_state::machine_reset()
m_extbusctrl[1] = 0x00;
m_extbusctrl[2] = 0x00;
+
+ // SuperXaviX
+
+ for (int i = 0; i < 3; i++)
+ {
+ m_sx_extended_extbus[i] = 0x00;
+ }
}
typedef device_delegate<uint8_t(int which, int half)> xavix_interrupt_vector_delegate;
@@ -1060,3 +1001,22 @@ int16_t xavix_state::get_vectors(int which, int half)
}
+// additional SuperXaviX / XaviX2002 stuff
+
+WRITE8_MEMBER(xavix_state::extended_extbus_reg0_w)
+{
+ LOG("%s: extended_extbus_reg0_w %02x\n", machine().describe_context(), data);
+ m_sx_extended_extbus[0] = data;
+}
+
+WRITE8_MEMBER(xavix_state::extended_extbus_reg1_w)
+{
+ LOG("%s: extended_extbus_reg1_w %02x\n", machine().describe_context(), data);
+ m_sx_extended_extbus[1] = data;
+}
+
+WRITE8_MEMBER(xavix_state::extended_extbus_reg2_w)
+{
+ LOG("%s: extended_extbus_reg2_w %02x\n", machine().describe_context(), data);
+ m_sx_extended_extbus[2] = data;
+}
diff --git a/src/mame/machine/xavix2002_io.cpp b/src/mame/machine/xavix2002_io.cpp
new file mode 100644
index 00000000000..dd91f103682
--- /dev/null
+++ b/src/mame/machine/xavix2002_io.cpp
@@ -0,0 +1,127 @@
+// license:BSD-3-Clause
+// copyright-holders:David Haywood
+
+// has separate input / output addresses but still uses direction registers, or I've misunderstood this entirely.
+
+#include "emu.h"
+#include "xavix2002_io.h"
+
+#define VERBOSE 0
+#include "logmacro.h"
+
+DEFINE_DEVICE_TYPE(XAVIX2002IO, xavix2002_io_device, "xavix2002io", "XaviX 2002 IO")
+
+xavix2002_io_device::xavix2002_io_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+ : device_t(mconfig, XAVIX2002IO, tag, owner, clock)
+ , m_in0_cb(*this)
+ , m_in1_cb(*this)
+ , m_in2_cb(*this)
+ , m_out0_cb(*this)
+ , m_out1_cb(*this)
+ , m_out2_cb(*this)
+{
+}
+
+void xavix2002_io_device::device_start()
+{
+ m_in0_cb.resolve_safe(0xff);
+ m_in1_cb.resolve_safe(0xff);
+ m_in2_cb.resolve_safe(0xff);
+
+ m_out0_cb.resolve_safe();
+ m_out1_cb.resolve_safe();
+ m_out2_cb.resolve_safe();
+
+ save_item(NAME(m_sx_pio_dir));
+ save_item(NAME(m_sx_pio_out));
+}
+
+void xavix2002_io_device::device_reset()
+{
+ for (int i = 0; i < 3; i++)
+ {
+ m_sx_pio_dir[i] = 0;
+ m_sx_pio_out[i] = 0;
+ }
+}
+
+WRITE8_MEMBER(xavix2002_io_device::pio_dir_w)
+{
+ LOG("%s: superxavix pio_dir_w (port %d) %02x\n", machine().describe_context(), offset, data);
+
+ if (offset < 3)
+ {
+ m_sx_pio_dir[offset] = data;
+ pio_out_w(space,offset, m_sx_pio_out[offset]);
+ // update port?
+ }
+}
+
+READ8_MEMBER(xavix2002_io_device::pio_dir_r)
+{
+ LOG("%s: superxavix pio_dir_r (port %d)\n", machine().describe_context(), offset);
+ uint8_t ret = 0x00;
+
+ if (offset < 3)
+ {
+ ret = m_sx_pio_dir[offset];
+ }
+
+ return ret;
+}
+
+WRITE8_MEMBER(xavix2002_io_device::pio_out_w)
+{
+ LOG("%s: superxavix pio_out_w (port %d) %02x\n", machine().describe_context(), offset, data);
+
+ if (offset < 3)
+ {
+ m_sx_pio_out[offset] = data;
+
+ // TODO: look at direction register
+
+ uint8_t outdata = m_sx_pio_out[offset] & m_sx_pio_dir[offset];
+
+ switch (offset)
+ {
+ case 0: m_out0_cb(space,0,outdata); break;
+ case 1: m_out1_cb(space,0,outdata); break;
+ case 2: m_out2_cb(space,0,outdata); break;
+ default: break;
+ }
+ }
+}
+
+READ8_MEMBER(xavix2002_io_device::pio_out_r)
+{
+ // what does this actually read?
+
+ LOG("%s: superxavix pio_out_r (port %d)\n", machine().describe_context(), offset);
+
+ uint8_t ret = 0x00;
+
+ if (offset<3)
+ ret = m_sx_pio_out[offset];
+
+ return ret;
+}
+
+
+READ8_MEMBER(xavix2002_io_device::pio_in_r)
+{
+ LOG("%s: superxavix pio_in_r (port %d)\n", machine().describe_context(), offset);
+
+ uint8_t ret = 0x00;
+
+ switch (offset)
+ {
+ case 0: ret = m_in0_cb(); break;
+ case 1: ret = m_in1_cb(); break;
+ case 2: ret = m_in2_cb(); break;
+ default: ret = 0x00; break;
+ }
+
+ // mask with direction register before returning
+
+ return ret;
+}
diff --git a/src/mame/machine/xavix2002_io.h b/src/mame/machine/xavix2002_io.h
new file mode 100644
index 00000000000..c67adf98ce5
--- /dev/null
+++ b/src/mame/machine/xavix2002_io.h
@@ -0,0 +1,49 @@
+// license:BSD-3-Clause
+// copyright-holders:David Haywood
+
+#ifndef MAME_MACHINE_XAVIX2002_IO_H
+#define MAME_MACHINE_XAVIX2002_IO_H
+
+
+class xavix2002_io_device : public device_t
+{
+public:
+ xavix2002_io_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+
+ auto read_0_callback() { return m_in0_cb.bind(); }
+ auto read_1_callback() { return m_in1_cb.bind(); }
+ auto read_2_callback() { return m_in2_cb.bind(); }
+
+ auto write_0_callback() { return m_out0_cb.bind(); }
+ auto write_1_callback() { return m_out1_cb.bind(); }
+ auto write_2_callback() { return m_out2_cb.bind(); }
+
+ DECLARE_WRITE8_MEMBER(pio_dir_w);
+ DECLARE_READ8_MEMBER(pio_dir_r);
+
+ DECLARE_WRITE8_MEMBER(pio_out_w);
+ DECLARE_READ8_MEMBER(pio_out_r);
+
+ DECLARE_READ8_MEMBER(pio_in_r);
+
+protected:
+ // device-level overrides
+ virtual void device_start() override;
+ virtual void device_reset() override;
+
+private:
+ devcb_read8 m_in0_cb;
+ devcb_read8 m_in1_cb;
+ devcb_read8 m_in2_cb;
+
+ devcb_write8 m_out0_cb;
+ devcb_write8 m_out1_cb;
+ devcb_write8 m_out2_cb;
+
+ uint8_t m_sx_pio_dir[3];
+ uint8_t m_sx_pio_out[3];
+};
+
+DECLARE_DEVICE_TYPE(XAVIX2002IO, xavix2002_io_device)
+
+#endif // MAME_MACHINE_XAVIX2002_IO_H
diff --git a/src/mame/machine/xavix_adc.cpp b/src/mame/machine/xavix_adc.cpp
new file mode 100644
index 00000000000..6d171c8018d
--- /dev/null
+++ b/src/mame/machine/xavix_adc.cpp
@@ -0,0 +1,100 @@
+// license:BSD-3-Clause
+// copyright-holders:David Haywood
+
+#include "emu.h"
+#include "xavix_adc.h"
+
+#define VERBOSE 0
+#include "logmacro.h"
+
+DEFINE_DEVICE_TYPE(XAVIX_ADC, xavix_adc_device, "xavix_adc", "XaviX ADC")
+
+xavix_adc_device::xavix_adc_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+ : device_t(mconfig, XAVIX_ADC, tag, owner, clock)
+ , m_in0_cb(*this)
+ , m_in1_cb(*this)
+ , m_in2_cb(*this)
+ , m_in3_cb(*this)
+ , m_in4_cb(*this)
+ , m_in5_cb(*this)
+ , m_in6_cb(*this)
+ , m_in7_cb(*this)
+{
+}
+
+void xavix_adc_device::device_start()
+{
+ m_in0_cb.resolve_safe(0xff);
+ m_in1_cb.resolve_safe(0xff);
+ m_in2_cb.resolve_safe(0xff);
+ m_in3_cb.resolve_safe(0xff);
+ m_in4_cb.resolve_safe(0xff);
+ m_in5_cb.resolve_safe(0xff);
+ m_in6_cb.resolve_safe(0xff);
+ m_in7_cb.resolve_safe(0xff);
+
+ m_adc_timer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(xavix_adc_device::adc_timer_done), this));
+
+ save_item(NAME(m_adc_control));
+ save_item(NAME(m_adc_inlatch));
+}
+
+TIMER_CALLBACK_MEMBER(xavix_adc_device::adc_timer_done)
+{
+ //m_irqsource |= 0x04;
+ //update_irqs();
+}
+
+void xavix_adc_device::device_reset()
+{
+ m_adc_control = 0x00;
+ m_adc_inlatch = 0xff;
+}
+
+
+READ8_MEMBER(xavix_adc_device::adc_7b80_r)
+{
+ LOG("%s: adc_7b80_r\n", machine().describe_context());
+ return m_adc_inlatch;
+}
+
+WRITE8_MEMBER(xavix_adc_device::adc_7b80_w)
+{
+ // is the latch writeable?
+ LOG("%s: adc_7b80_w %02x\n", machine().describe_context(), data);
+}
+
+WRITE8_MEMBER(xavix_adc_device::adc_7b81_w)
+{
+// m_irqsource &= ~0x04;
+// update_irqs();
+
+ LOG("%s: adc_7b81_w %02x\n", machine().describe_context(), data);
+ m_adc_control = data;
+
+ // bit 0x40 = run? or IRQ? (doesn't seem to be any obvious way to clear IRQs tho, ADC handling is usually done in timer IRQ?)
+ // should probably set latch after a timer has expired not instantly?
+ // bits 0x0c are not port select?
+ // bit 0x80 is some kind of ack? / done flag?
+ switch (m_adc_control & 0x13)
+ {
+ case 0x00: m_adc_inlatch = m_in0_cb(); break;
+ case 0x01: m_adc_inlatch = m_in1_cb(); break;
+ case 0x02: m_adc_inlatch = m_in2_cb(); break;
+ case 0x03: m_adc_inlatch = m_in3_cb(); break;
+ case 0x10: m_adc_inlatch = m_in4_cb(); break;
+ case 0x11: m_adc_inlatch = m_in5_cb(); break;
+ case 0x12: m_adc_inlatch = m_in6_cb(); break;
+ case 0x13: m_adc_inlatch = m_in7_cb(); break;
+ }
+
+// m_adc_timer->adjust(attotime::from_usec(200));
+}
+
+READ8_MEMBER(xavix_adc_device::adc_7b81_r)
+{
+// has_wamg polls this if interrupt is enabled
+ return machine().rand();
+}
+
+
diff --git a/src/mame/machine/xavix_adc.h b/src/mame/machine/xavix_adc.h
new file mode 100644
index 00000000000..5bf524eb9d8
--- /dev/null
+++ b/src/mame/machine/xavix_adc.h
@@ -0,0 +1,50 @@
+// license:BSD-3-Clause
+// copyright-holders:David Haywood
+
+#ifndef MAME_MACHINE_XAVIX_ADC_H
+#define MAME_MACHINE_XAVIX_ADC_H
+
+class xavix_adc_device : public device_t
+{
+public:
+ xavix_adc_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+
+ auto read_0_callback() { return m_in0_cb.bind(); }
+ auto read_1_callback() { return m_in1_cb.bind(); }
+ auto read_2_callback() { return m_in2_cb.bind(); }
+ auto read_3_callback() { return m_in3_cb.bind(); }
+ auto read_4_callback() { return m_in4_cb.bind(); }
+ auto read_5_callback() { return m_in5_cb.bind(); }
+ auto read_6_callback() { return m_in6_cb.bind(); }
+ auto read_7_callback() { return m_in7_cb.bind(); }
+
+ DECLARE_READ8_MEMBER(adc_7b80_r);
+ DECLARE_WRITE8_MEMBER(adc_7b80_w);
+ DECLARE_READ8_MEMBER(adc_7b81_r);
+ DECLARE_WRITE8_MEMBER(adc_7b81_w);
+
+protected:
+ // device-level overrides
+ virtual void device_start() override;
+ virtual void device_reset() override;
+
+private:
+ devcb_read8 m_in0_cb;
+ devcb_read8 m_in1_cb;
+ devcb_read8 m_in2_cb;
+ devcb_read8 m_in3_cb;
+ devcb_read8 m_in4_cb;
+ devcb_read8 m_in5_cb;
+ devcb_read8 m_in6_cb;
+ devcb_read8 m_in7_cb;
+
+ uint8_t m_adc_inlatch;
+ uint8_t m_adc_control;
+ emu_timer *m_adc_timer;
+
+ TIMER_CALLBACK_MEMBER(adc_timer_done);
+};
+
+DECLARE_DEVICE_TYPE(XAVIX_ADC, xavix_adc_device)
+
+#endif // MAME_MACHINE_XAVIX_ADC_H
diff --git a/src/mame/machine/xavix_anport.cpp b/src/mame/machine/xavix_anport.cpp
new file mode 100644
index 00000000000..502dfc6adee
--- /dev/null
+++ b/src/mame/machine/xavix_anport.cpp
@@ -0,0 +1,81 @@
+// license:BSD-3-Clause
+// copyright-holders:David Haywood
+
+// are these still part of the ADC? if so merge into xavix_adc.cpp
+
+#include "emu.h"
+#include "xavix_anport.h"
+
+#define VERBOSE 0
+#include "logmacro.h"
+
+DEFINE_DEVICE_TYPE(XAVIX_ANPORT, xavix_anport_device, "xavix_anport", "XaviX Analog ports")
+
+xavix_anport_device::xavix_anport_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+ : device_t(mconfig, XAVIX_ANPORT, tag, owner, clock)
+ , m_in0_cb(*this)
+ , m_in1_cb(*this)
+ , m_in2_cb(*this)
+ , m_in3_cb(*this)
+{
+}
+
+void xavix_anport_device::device_start()
+{
+ m_in0_cb.resolve_safe(0xff);
+ m_in1_cb.resolve_safe(0xff);
+ m_in2_cb.resolve_safe(0xff);
+ m_in3_cb.resolve_safe(0xff);
+}
+
+void xavix_anport_device::device_reset()
+{
+}
+
+
+READ8_MEMBER(xavix_anport_device::mouse_7b00_r)
+{
+ LOG("%s: mouse_7b00_r\n", machine().describe_context());
+ return m_in0_cb();
+
+}
+
+READ8_MEMBER(xavix_anport_device::mouse_7b01_r)
+{
+ LOG("%s: mouse_7b01_r\n", machine().describe_context());
+ return m_in1_cb();
+}
+
+READ8_MEMBER(xavix_anport_device::mouse_7b10_r)
+{
+ LOG("%s: mouse_7b10_r\n", machine().describe_context());
+ return m_in2_cb();
+}
+
+READ8_MEMBER(xavix_anport_device::mouse_7b11_r)
+{
+ LOG("%s: mouse_7b11_r\n", machine().describe_context());
+ return m_in3_cb();
+}
+
+WRITE8_MEMBER(xavix_anport_device::mouse_7b00_w)
+{
+ LOG("%s: mouse_7b00_w %02x\n", machine().describe_context(), data);
+}
+
+WRITE8_MEMBER(xavix_anport_device::mouse_7b01_w)
+{
+ LOG("%s: mouse_7b01_w %02x\n", machine().describe_context(), data);
+}
+
+WRITE8_MEMBER(xavix_anport_device::mouse_7b10_w)
+{
+ LOG("%s: mouse_7b10_w %02x\n", machine().describe_context(), data);
+}
+
+WRITE8_MEMBER(xavix_anport_device::mouse_7b11_w)
+{
+ LOG("%s: mouse_7b11_w %02x\n", machine().describe_context(), data);
+}
+
+
diff --git a/src/mame/machine/xavix_anport.h b/src/mame/machine/xavix_anport.h
new file mode 100644
index 00000000000..b826d718d2f
--- /dev/null
+++ b/src/mame/machine/xavix_anport.h
@@ -0,0 +1,41 @@
+// license:BSD-3-Clause
+// copyright-holders:David Haywood
+
+#ifndef MAME_MACHINE_XAVIX_ANPORT_H
+#define MAME_MACHINE_XAVIX_ANPORT_H
+
+class xavix_anport_device : public device_t
+{
+public:
+ xavix_anport_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+
+ auto read_0_callback() { return m_in0_cb.bind(); }
+ auto read_1_callback() { return m_in1_cb.bind(); }
+ auto read_2_callback() { return m_in2_cb.bind(); }
+ auto read_3_callback() { return m_in3_cb.bind(); }
+
+ DECLARE_READ8_MEMBER(mouse_7b00_r);
+ DECLARE_READ8_MEMBER(mouse_7b01_r);
+ DECLARE_READ8_MEMBER(mouse_7b10_r);
+ DECLARE_READ8_MEMBER(mouse_7b11_r);
+
+ DECLARE_WRITE8_MEMBER(mouse_7b00_w);
+ DECLARE_WRITE8_MEMBER(mouse_7b01_w);
+ DECLARE_WRITE8_MEMBER(mouse_7b10_w);
+ DECLARE_WRITE8_MEMBER(mouse_7b11_w);
+
+protected:
+ // device-level overrides
+ virtual void device_start() override;
+ virtual void device_reset() override;
+
+private:
+ devcb_read8 m_in0_cb;
+ devcb_read8 m_in1_cb;
+ devcb_read8 m_in2_cb;
+ devcb_read8 m_in3_cb;
+};
+
+DECLARE_DEVICE_TYPE(XAVIX_ANPORT, xavix_anport_device)
+
+#endif // MAME_MACHINE_XAVIX_ANPORT_H
diff --git a/src/mame/machine/xavix_io.cpp b/src/mame/machine/xavix_io.cpp
new file mode 100644
index 00000000000..e08a8cecc31
--- /dev/null
+++ b/src/mame/machine/xavix_io.cpp
@@ -0,0 +1,103 @@
+// license:BSD-3-Clause
+// copyright-holders:David Haywood
+
+// TODO: hook this back up, and work out why taikodp eeprom breaks when it is hooked up. epo_efdx breakage is expected because that requires an ugly hack to get to the title
+// note, eeproms don't work properly in most games at the moment, but no behavioral change was expected with taikodp
+
+#include "emu.h"
+#include "xavix_io.h"
+
+#define VERBOSE 0
+#include "logmacro.h"
+
+DEFINE_DEVICE_TYPE(XAVIXIO, xavix_io_device, "xavixio", "XaviX IO")
+
+xavix_io_device::xavix_io_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+ : device_t(mconfig, XAVIXIO, tag, owner, clock)
+ , m_in0_cb(*this)
+ , m_in1_cb(*this)
+ , m_out0_cb(*this)
+ , m_out1_cb(*this)
+{
+}
+
+void xavix_io_device::device_start()
+{
+ m_in0_cb.resolve_safe(0xff);
+ m_in1_cb.resolve_safe(0xff);
+
+ m_out0_cb.resolve_safe();
+ m_out1_cb.resolve_safe();
+
+ save_item(NAME(m_dir));
+ save_item(NAME(m_dat));
+}
+
+void xavix_io_device::device_reset()
+{
+ for (int i = 0; i < 2; i++)
+ {
+ m_dir[i] = 0;
+ m_dat[i] = 0;
+ }
+}
+
+// direction: 1 is out, 0 is in
+
+WRITE8_MEMBER(xavix_io_device::xav_7a0x_dir_w)
+{
+ LOG("%s: xavix IO xav_7a0x_dir_w (port %d) %02x\n", machine().describe_context(), offset, data);
+ if (offset < 2)
+ {
+ m_dir[offset] = data;
+ // write back to the port
+ xav_7a0x_dat_w(space,offset,m_dat[offset]);
+ }
+
+}
+
+WRITE8_MEMBER(xavix_io_device::xav_7a0x_dat_w)
+{
+ LOG("%s: xavix IO xav_7a0x_dat_w (port %d) %02x\n", machine().describe_context(), offset, data);
+ if (offset < 2)
+ {
+ m_dat[offset] = data;
+
+ uint8_t outdata = m_dat[offset] & m_dir[offset];
+
+ switch (offset)
+ {
+ case 0x0: m_out0_cb(space, 0, outdata); break;
+ case 0x1: m_out1_cb(space, 0, outdata); break;
+ }
+ }
+}
+
+READ8_MEMBER(xavix_io_device::xav_7a0x_dir_r)
+{
+ uint8_t ret = 0x00;
+ LOG("%s: xavix IO xav_7a0x_dir_r (port %d)\n", machine().describe_context(), offset);
+ if (offset < 2)
+ {
+ ret = m_dir[offset];
+ }
+ return ret;
+}
+
+READ8_MEMBER(xavix_io_device::xav_7a0x_dat_r)
+{
+ uint8_t ret = 0x00;
+ LOG("%s: xavix IO xav_7a0x_dat_r (port %d)\n", machine().describe_context(), offset);
+ if (offset < 2)
+ {
+ switch (offset)
+ {
+ case 0x0: ret = m_in0_cb(space, 0); break;
+ case 0x1: ret = m_in1_cb(space, 0); break;
+ }
+
+ ret &= ~m_dir[offset];
+ ret |= m_dat[offset] & m_dir[offset];
+ }
+ return ret;
+}
diff --git a/src/mame/machine/xavix_io.h b/src/mame/machine/xavix_io.h
new file mode 100644
index 00000000000..31bb695d3f5
--- /dev/null
+++ b/src/mame/machine/xavix_io.h
@@ -0,0 +1,42 @@
+// license:BSD-3-Clause
+// copyright-holders:David Haywood
+
+#ifndef MAME_MACHINE_XAVIX_IO_H
+#define MAME_MACHINE_XAVIX_IO_H
+
+class xavix_io_device : public device_t
+{
+public:
+ xavix_io_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+
+ auto read_0_callback() { return m_in0_cb.bind(); }
+ auto read_1_callback() { return m_in1_cb.bind(); }
+
+ auto write_0_callback() { return m_out0_cb.bind(); }
+ auto write_1_callback() { return m_out1_cb.bind(); }
+
+ DECLARE_WRITE8_MEMBER(xav_7a0x_dir_w);
+ DECLARE_WRITE8_MEMBER(xav_7a0x_dat_w);
+
+ DECLARE_READ8_MEMBER(xav_7a0x_dir_r);
+ DECLARE_READ8_MEMBER(xav_7a0x_dat_r);
+
+protected:
+ // device-level overrides
+ virtual void device_start() override;
+ virtual void device_reset() override;
+
+private:
+ devcb_read8 m_in0_cb;
+ devcb_read8 m_in1_cb;
+
+ devcb_write8 m_out0_cb;
+ devcb_write8 m_out1_cb;
+
+ uint8_t m_dir[2];
+ uint8_t m_dat[2];
+};
+
+DECLARE_DEVICE_TYPE(XAVIXIO, xavix_io_device)
+
+#endif // MAME_MACHINE_XAVIX_IO_H
diff --git a/src/mame/machine/xavix_math.cpp b/src/mame/machine/xavix_math.cpp
new file mode 100644
index 00000000000..3e180e4d4e2
--- /dev/null
+++ b/src/mame/machine/xavix_math.cpp
@@ -0,0 +1,171 @@
+// license:BSD-3-Clause
+// copyright-holders:David Haywood
+
+#include "emu.h"
+#include "xavix_math.h"
+
+#define VERBOSE 0
+#include "logmacro.h"
+
+DEFINE_DEVICE_TYPE(XAVIX_MATH, xavix_math_device, "xavix_math", "XaviX Math Unit")
+
+xavix_math_device::xavix_math_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+ : device_t(mconfig, XAVIX_MATH, tag, owner, clock)
+{
+}
+
+void xavix_math_device::device_start()
+{
+ save_item(NAME(m_barrel_params));
+ save_item(NAME(m_multparams));
+ save_item(NAME(m_multresults));
+}
+
+void xavix_math_device::device_reset()
+{
+ m_barrel_params[0] = 0x00;
+ m_barrel_params[1] = 0x00;
+
+ std::fill(std::begin(m_multparams), std::end(m_multparams), 0x00);
+ std::fill(std::begin(m_multresults), std::end(m_multresults), 0x00);
+}
+
+
+// epo_guru uses this for ground movement in 3d stages (and other places)
+READ8_MEMBER(xavix_math_device::barrel_r)
+{
+ if (offset == 0)
+ {
+ // or upper bits of result?
+ LOG("%s: reading shift trigger?!\n", machine().describe_context());
+ return 0x00;
+ }
+ else
+ {
+ uint8_t retdata = m_barrel_params[1];
+ LOG("%s: reading shift results/data %02x\n", machine().describe_context(), retdata);
+ return retdata;
+ }
+}
+
+// epo_guru 3d stages still flicker a lot with this, but it seems unrelated to the calculations here, possibly a raster timing issue
+// the pickup animations however don't seem to play, which indicates this could still be wrong.
+WRITE8_MEMBER(xavix_math_device::barrel_w)
+{
+ LOG("%s: barrel_w %02x\n", machine().describe_context(), data);
+
+ m_barrel_params[offset] = data;
+
+ // offset 0 = trigger
+ if (offset == 0)
+ {
+ int shift_data = m_barrel_params[1];
+ int shift_amount = data & 0x0f;
+ int shift_param = (data & 0xf0) >> 4;
+
+ if (shift_param == 0x00) // just a shift? (definitely right for 'hammer throw'
+ {
+ // used in epo_guru for 'hammer throw', 'pre-title screen', 'mini game select', '3d chase game (floor scroll, pickups, misc)', 'toilet roll mini game (when you make an error)'
+
+ if (shift_amount & 0x08)
+ {
+ m_barrel_params[1] = (shift_data >> (shift_amount & 0x7));
+ }
+ else
+ {
+ m_barrel_params[1] = (shift_data << (shift_amount & 0x7));
+ }
+ }
+ else if (shift_param == 0x8) // rotate? (should it rotate through a carry bit of some kind?)
+ {
+ // used in epo_guru for '3d chase game' (unsure of actual purpose in it)
+ switch (shift_amount)
+ {
+ case 0x0: m_barrel_params[1] = shift_data; break;
+ case 0x1: m_barrel_params[1] = (shift_data << 1) | ((shift_data >> 7) & 0x01); break;
+ case 0x2: m_barrel_params[1] = (shift_data << 2) | ((shift_data >> 6) & 0x03); break;
+ case 0x3: m_barrel_params[1] = (shift_data << 3) | ((shift_data >> 5) & 0x07); break;
+ case 0x4: m_barrel_params[1] = (shift_data << 4) | ((shift_data >> 4) & 0x0f); break;
+ case 0x5: m_barrel_params[1] = (shift_data << 5) | ((shift_data >> 3) & 0x1f); break;
+ case 0x6: m_barrel_params[1] = (shift_data << 6) | ((shift_data >> 2) & 0x2f); break;
+ case 0x7: m_barrel_params[1] = (shift_data << 7) | ((shift_data >> 1) & 0x3f); break;
+ case 0x8: m_barrel_params[1] = shift_data; break;
+ case 0x9: m_barrel_params[1] = (shift_data >> 1) | ((shift_data & 0x01) << 7); break;
+ case 0xa: m_barrel_params[1] = (shift_data >> 2) | ((shift_data & 0x03) << 6); break;
+ case 0xb: m_barrel_params[1] = (shift_data >> 3) | ((shift_data & 0x07) << 5); break;
+ case 0xc: m_barrel_params[1] = (shift_data >> 4) | ((shift_data & 0x0f) << 4); break;
+ case 0xd: m_barrel_params[1] = (shift_data >> 5) | ((shift_data & 0x1f) << 3); break;
+ case 0xe: m_barrel_params[1] = (shift_data >> 6) | ((shift_data & 0x2f) << 2); break;
+ case 0xf: m_barrel_params[1] = (shift_data >> 7) | ((shift_data & 0x3f) << 1); break;
+ }
+ }
+ }
+}
+
+
+
+READ8_MEMBER(xavix_math_device::mult_r)
+{
+ return m_multresults[offset];
+}
+
+WRITE8_MEMBER(xavix_math_device::mult_w)
+{
+ // rad_madf writes here to set the base value which the multiplication result gets added to
+ m_multresults[offset] = data;
+}
+
+READ8_MEMBER(xavix_math_device::mult_param_r)
+{
+ return m_multparams[offset];
+}
+
+WRITE8_MEMBER(xavix_math_device::mult_param_w)
+{
+ COMBINE_DATA(&m_multparams[offset]);
+ // there are NOPs after one of the writes, so presumably the operation is write triggerd and not intstant
+ // see test code at 0184a4 in monster truck
+
+ // offset0 is control
+
+ // mm-- --Ss
+ // mm = mode, S = sign for param1, s = sign for param2
+ // modes 00 = multiply (regular?) 11 = add to previous 01 / 10 unknown (maybe subtract?)
+
+ if (offset == 2)
+ {
+ // assume 0 is upper bits, might be 'mode' instead, check
+
+
+ int signmode = (m_multparams[0] & 0x3f);
+
+ uint16_t result = 0;
+
+ // rad_madf uses this mode (add to previous result)
+ if ((m_multparams[0] & 0xc0) == 0xc0)
+ {
+ const int param1 = signmode & 0x2 ? (int8_t)m_multparams[1] : (uint8_t)m_multparams[1];
+ const int param2 = signmode & 0x1 ? (int8_t)m_multparams[2] : (uint8_t)m_multparams[2];
+
+ result = param1 * param2;
+
+ uint16_t oldresult = (m_multresults[1] << 8) | m_multresults[0];
+ result = oldresult + result;
+ }
+ else if ((m_multparams[0] & 0xc0) == 0x00)
+ {
+ const int param1 = signmode & 0x2 ? (int8_t)m_multparams[1] : (uint8_t)m_multparams[1];
+ const int param2 = signmode & 0x1 ? (int8_t)m_multparams[2] : (uint8_t)m_multparams[2];
+
+ result = param1 * param2;
+ }
+ else
+ {
+ popmessage("unknown multiplier mode %02x", m_multparams[0] & 0xc0);
+ }
+
+ m_multresults[1] = (result >> 8) & 0xff;
+ m_multresults[0] = result & 0xff;
+ }
+}
+
diff --git a/src/mame/machine/xavix_math.h b/src/mame/machine/xavix_math.h
new file mode 100644
index 00000000000..d0bdeb6bf1f
--- /dev/null
+++ b/src/mame/machine/xavix_math.h
@@ -0,0 +1,34 @@
+// license:BSD-3-Clause
+// copyright-holders:David Haywood
+
+#ifndef MAME_MACHINE_XAVIX_MATH_H
+#define MAME_MACHINE_XAVIX_MATH_H
+
+class xavix_math_device : public device_t
+{
+public:
+ xavix_math_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+
+ DECLARE_READ8_MEMBER(mult_r);
+ DECLARE_WRITE8_MEMBER(mult_w);
+ DECLARE_READ8_MEMBER(mult_param_r);
+ DECLARE_WRITE8_MEMBER(mult_param_w);
+
+ DECLARE_READ8_MEMBER(barrel_r);
+ DECLARE_WRITE8_MEMBER(barrel_w);
+
+protected:
+ // device-level overrides
+ virtual void device_start() override;
+ virtual void device_reset() override;
+
+private:
+
+ uint8_t m_barrel_params[2];
+ uint8_t m_multparams[3];
+ uint8_t m_multresults[2];
+};
+
+DECLARE_DEVICE_TYPE(XAVIX_MATH, xavix_math_device)
+
+#endif // MAME_MACHINE_XAVIX_MATH_H
diff --git a/src/mame/machine/xbox.cpp b/src/mame/machine/xbox.cpp
index a1ecc331cf3..01dcb4631a5 100644
--- a/src/mame/machine/xbox.cpp
+++ b/src/mame/machine/xbox.cpp
@@ -7,7 +7,6 @@
#include "includes/xbox.h"
#include "cpu/i386/i386.h"
-#include "machine/pit8253.h"
#include "debug/debugcon.h"
#include "debug/debugcmd.h"
@@ -523,54 +522,7 @@ void xbox_base_state::debug_generate_irq(int irq, bool active)
debug_irq_active = false;
state = 0;
}
- switch (irq)
- {
- case 0:
- xbox_base_devs.pic8259_1->ir0_w(state);
- break;
- case 1:
- xbox_base_devs.pic8259_1->ir1_w(state);
- break;
- case 3:
- xbox_base_devs.pic8259_1->ir3_w(state);
- break;
- case 4:
- xbox_base_devs.pic8259_1->ir4_w(state);
- break;
- case 5:
- xbox_base_devs.pic8259_1->ir5_w(state);
- break;
- case 6:
- xbox_base_devs.pic8259_1->ir6_w(state);
- break;
- case 7:
- xbox_base_devs.pic8259_1->ir7_w(state);
- break;
- case 8:
- xbox_base_devs.pic8259_2->ir0_w(state);
- break;
- case 9:
- xbox_base_devs.pic8259_2->ir1_w(state);
- break;
- case 10:
- xbox_base_devs.pic8259_2->ir2_w(state);
- break;
- case 11:
- xbox_base_devs.pic8259_2->ir3_w(state);
- break;
- case 12:
- xbox_base_devs.pic8259_2->ir4_w(state);
- break;
- case 13:
- xbox_base_devs.pic8259_2->ir5_w(state);
- break;
- case 14:
- xbox_base_devs.pic8259_2->ir6_w(state);
- break;
- case 15:
- xbox_base_devs.pic8259_2->ir7_w(state);
- break;
- }
+ mcpxlpc->debug_generate_irq(irq, state);
}
WRITE_LINE_MEMBER(xbox_base_state::vblank_callback)
@@ -587,54 +539,38 @@ uint32_t xbox_base_state::screen_update_callback(screen_device &screen, bitmap_r
* PIC & PIT
*/
-WRITE_LINE_MEMBER(xbox_base_state::xbox_pic8259_1_set_int_line)
+WRITE_LINE_MEMBER(xbox_base_state::maincpu_interrupt)
{
m_maincpu->set_input_line(0, state ? HOLD_LINE : CLEAR_LINE);
}
-READ8_MEMBER(xbox_base_state::get_slave_ack)
-{
- if (offset == 2) { // IRQ = 2
- return xbox_base_devs.pic8259_2->acknowledge();
- }
- return 0x00;
-}
-
IRQ_CALLBACK_MEMBER(xbox_base_state::irq_callback)
{
- int r = 0;
- r = xbox_base_devs.pic8259_1->acknowledge();
+ int r;
+ r = mcpxlpc->acknowledge();
if (debug_irq_active)
debug_generate_irq(debug_irq_number, false);
return r;
}
-WRITE_LINE_MEMBER(xbox_base_state::xbox_pit8254_out0_changed)
+WRITE_LINE_MEMBER(xbox_base_state::ohci_usb_interrupt_changed)
{
- if (xbox_base_devs.pic8259_1)
- {
- xbox_base_devs.pic8259_1->ir0_w(state);
- }
-}
-
-WRITE_LINE_MEMBER(xbox_base_state::xbox_pit8254_out2_changed)
-{
- //xbox_speaker_set_input( state ? 1 : 0 );
+ mcpxlpc->irq1(state);
}
-WRITE_LINE_MEMBER(xbox_base_state::xbox_ohci_usb_interrupt_changed)
+WRITE_LINE_MEMBER(xbox_base_state::nv2a_interrupt_changed)
{
- xbox_base_devs.pic8259_1->ir1_w(state);
+ mcpxlpc->irq3(state);
}
-WRITE_LINE_MEMBER(xbox_base_state::xbox_smbus_interrupt_changed)
+WRITE_LINE_MEMBER(xbox_base_state::smbus_interrupt_changed)
{
- xbox_base_devs.pic8259_2->ir3_w(state);
+ mcpxlpc->irq11(state);
}
-WRITE_LINE_MEMBER(xbox_base_state::xbox_nv2a_interrupt_changed)
+WRITE_LINE_MEMBER(xbox_base_state::ide_interrupt_changed)
{
- xbox_base_devs.pic8259_1->ir3_w(state);
+ mcpxlpc->irq14(state);
}
/*
@@ -846,15 +782,12 @@ void xbox_base_state::machine_start()
{
find_debug_params();
nvidia_nv2a = subdevice<nv2a_gpu_device>("pci:1e.0:00.0")->debug_get_renderer();
- xbox_base_devs.pic8259_1 = subdevice<pic8259_device>("pic8259_1");
- xbox_base_devs.pic8259_2 = subdevice<pic8259_device>("pic8259_2");
- xbox_base_devs.ide = subdevice<bus_master_ide_controller_device>("ide");
if (machine().debug_flags & DEBUG_FLAG_ENABLED)
{
using namespace std::placeholders;
machine().debugger().console().register_command("xbox", CMDFLAG_NONE, 0, 1, 4, std::bind(&xbox_base_state::xbox_debug_commands, this, _1, _2));
}
- subdevice<xbox_eeprom_device>("pci:01.1:54")->hack_eeprom =
+ subdevice<xbox_eeprom_device>("pci:01.1:154")->hack_eeprom =
[&](void)
{
hack_eeprom();
@@ -869,7 +802,7 @@ void xbox_base_state::machine_start()
memset(&superiost, 0, sizeof(superiost));
superiost.configuration_mode = false;
superiost.registers[0][0x26] = 0x2e; // Configuration port address byte 0
- // savestates
+ // savestates
save_item(NAME(debug_irq_active));
save_item(NAME(debug_irq_number));
}
@@ -890,10 +823,7 @@ void xbox_base_state::xbox_base_map(address_map &map)
void xbox_base_state::xbox_base_map_io(address_map &map)
{
- map(0x0020, 0x0023).rw("pic8259_1", FUNC(pic8259_device::read), FUNC(pic8259_device::write));
map(0x002e, 0x002f).rw(FUNC(xbox_base_state::superio_read), FUNC(xbox_base_state::superio_write));
- map(0x0040, 0x0043).rw("pit8254", FUNC(pit8254_device::read), FUNC(pit8254_device::write));
- map(0x00a0, 0x00a3).rw("pic8259_2", FUNC(pic8259_device::read), FUNC(pic8259_device::write));
map(0x01f0, 0x01f7).rw(":pci:09.0:ide", FUNC(bus_master_ide_controller_device::cs0_r), FUNC(bus_master_ide_controller_device::cs0_w));
map(0x03f8, 0x03ff).rw(FUNC(xbox_base_state::superiors232_read), FUNC(xbox_base_state::superiors232_write));
#if 0
@@ -908,56 +838,41 @@ void xbox_base_state::xbox_base_map_io(address_map &map)
#endif
}
-MACHINE_CONFIG_START(xbox_base_state::xbox_base)
+void xbox_base_state::xbox_base(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD(m_maincpu, PENTIUM3, 733333333) /* Wrong! family 6 model 8 stepping 10 */
- MCFG_DEVICE_PROGRAM_MAP(xbox_base_map)
- MCFG_DEVICE_IO_MAP(xbox_base_map_io)
- MCFG_DEVICE_IRQ_ACKNOWLEDGE_DRIVER(xbox_base_state, irq_callback)
-
- MCFG_QUANTUM_TIME(attotime::from_hz(6000))
-
- PCI_ROOT(config, ":pci", 0);
- NV2A_HOST(config, ":pci:00.0", 0, m_maincpu);
- NV2A_RAM(config, ":pci:00.3", 0);
- MCPX_LPC(config, ":pci:01.0", 0);
- MCPX_SMBUS(config, ":pci:01.1", 0).interrupt_handler().set(FUNC(xbox_base_state::xbox_smbus_interrupt_changed));
- XBOX_PIC16LC(config, ":pci:01.1:10", 0);
- XBOX_CX25871(config, ":pci:01.1:45", 0);
- XBOX_EEPROM(config, ":pci:01.1:54", 0);
- MCPX_OHCI(config, ":pci:02.0", 0).interrupt_handler().set(FUNC(xbox_base_state::xbox_ohci_usb_interrupt_changed));
- MCPX_OHCI(config, ":pci:03.0", 0);
- MCPX_ETH(config, ":pci:04.0", 0);
- MCPX_APU(config, ":pci:05.0", 0, m_maincpu);
+ PENTIUM3(config, m_maincpu, 733333333); /* Wrong! family 6 model 8 stepping 10 */
+ m_maincpu->set_addrmap(AS_PROGRAM, &xbox_base_state::xbox_base_map);
+ m_maincpu->set_addrmap(AS_IO, &xbox_base_state::xbox_base_map_io);
+ m_maincpu->set_irq_acknowledge_callback(FUNC(xbox_base_state::irq_callback));
+
+ config.m_minimum_quantum = attotime::from_hz(6000);
+
+ PCI_ROOT(config, ":pci", 0);
+ NV2A_HOST(config, ":pci:00.0", 0, m_maincpu);
+ NV2A_RAM(config, ":pci:00.3", 0);
+ MCPX_ISALPC(config, ":pci:01.0", 0, 0).interrupt_output().set(FUNC(xbox_base_state::maincpu_interrupt));
+ MCPX_SMBUS(config, ":pci:01.1", 0).interrupt_handler().set(FUNC(xbox_base_state::smbus_interrupt_changed));
+ XBOX_PIC16LC(config, ":pci:01.1:110", 0); // these 3 are on smbus number 1
+ XBOX_CX25871(config, ":pci:01.1:145", 0);
+ XBOX_EEPROM(config, ":pci:01.1:154", 0);
+ MCPX_OHCI(config, ":pci:02.0", 0).interrupt_handler().set(FUNC(xbox_base_state::ohci_usb_interrupt_changed));
+ MCPX_OHCI(config, ":pci:03.0", 0);
+ MCPX_ETH(config, ":pci:04.0", 0);
+ MCPX_APU(config, ":pci:05.0", 0, m_maincpu);
MCPX_AC97_AUDIO(config, ":pci:06.0", 0);
MCPX_AC97_MODEM(config, ":pci:06.1", 0);
- PCI_BRIDGE(config, ":pci:08.0", 0, 0x10de01b8, 0);
- MCPX_IDE(config, ":pci:09.0", 0).interrupt_handler().set("pic8259_2", FUNC(pic8259_device::ir6_w));
- NV2A_AGP(config, ":pci:1e.0", 0, 0x10de01b7, 0);
- NV2A_GPU(config, ":pci:1e.0:00.0", 0, m_maincpu).interrupt_handler().set(FUNC(xbox_base_state::xbox_nv2a_interrupt_changed));
-
- pic8259_device &pic8259_1(PIC8259(config, "pic8259_1", 0));
- pic8259_1.out_int_callback().set(FUNC(xbox_base_state::xbox_pic8259_1_set_int_line));
- pic8259_1.in_sp_callback().set_constant(1);
- pic8259_1.read_slave_ack_callback().set(FUNC(xbox_base_state::get_slave_ack));
-
- pic8259_device &pic8259_2(PIC8259(config, "pic8259_2", 0));
- pic8259_2.out_int_callback().set("pic8259_1", FUNC(pic8259_device::ir2_w));
- pic8259_2.in_sp_callback().set_constant(0);
-
- pit8254_device &pit8254(PIT8254(config, "pit8254", 0));
- pit8254.set_clk<0>(1125000); /* heartbeat IRQ */
- pit8254.out_handler<0>().set(FUNC(xbox_base_state::xbox_pit8254_out0_changed));
- pit8254.set_clk<1>(1125000); /* (unused) dram refresh */
- pit8254.set_clk<2>(1125000); /* (unused) pio port c pin 4, and speaker polling enough */
- pit8254.out_handler<2>().set(FUNC(xbox_base_state::xbox_pit8254_out2_changed));
+ PCI_BRIDGE(config, ":pci:08.0", 0, 0x10de01b8, 0);
+ MCPX_IDE(config, ":pci:09.0", 0).interrupt_handler().set(FUNC(xbox_base_state::ide_interrupt_changed));
+ NV2A_AGP(config, ":pci:1e.0", 0, 0x10de01b7, 0);
+ NV2A_GPU(config, ":pci:1e.0:00.0", 0, m_maincpu).interrupt_handler().set(FUNC(xbox_base_state::nv2a_interrupt_changed));
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */
- MCFG_SCREEN_SIZE(640, 480)
- MCFG_SCREEN_VISIBLE_AREA(0, 639, 0, 479)
- MCFG_SCREEN_UPDATE_DRIVER(xbox_base_state, screen_update_callback)
- MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE(*this, xbox_base_state, vblank_callback))
-MACHINE_CONFIG_END
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */
+ screen.set_size(640, 480);
+ screen.set_visarea(0, 639, 0, 479);
+ screen.set_screen_update(FUNC(xbox_base_state::screen_update_callback));
+ screen.screen_vblank().set(FUNC(xbox_base_state::vblank_callback));
+}
diff --git a/src/mame/machine/xbox_pci.cpp b/src/mame/machine/xbox_pci.cpp
index 825150833ee..b70b01dab1e 100644
--- a/src/mame/machine/xbox_pci.cpp
+++ b/src/mame/machine/xbox_pci.cpp
@@ -5,6 +5,7 @@
#include "machine/pci.h"
#include "includes/xbox_pci.h"
#include "includes/xbox.h"
+#include "machine/ds128x.h"
#include <functional>
@@ -20,7 +21,7 @@ nv2a_host_device::nv2a_host_device(const machine_config &mconfig, const char *ta
pci_host_device(mconfig, NV2A_HOST, tag, owner, clock),
cpu(*this, finder_base::DUMMY_TAG)
{
- set_ids(0x10de01b0, 0, 0, 0);
+ set_ids_host(0x10de02a5, 0, 0);
}
void nv2a_host_device::map_extra(uint64_t memory_window_start, uint64_t memory_window_end, uint64_t memory_offset, address_space *memory_space,
@@ -81,38 +82,205 @@ WRITE32_MEMBER(nv2a_ram_device::config_register_w)
* LPC Bus
*/
-DEFINE_DEVICE_TYPE(MCPX_LPC, mcpx_lpc_device, "mcpx_lpc", "MCPX HUB Interface - ISA Bridge")
+DEFINE_DEVICE_TYPE(MCPX_ISALPC, mcpx_isalpc_device, "mcpx_isalpc", "MCPX HUB Interface - ISA Bridge")
-void mcpx_lpc_device::lpc_io(address_map &map)
+void mcpx_isalpc_device::lpc_io(address_map &map)
{
- map(0x00000000, 0x000000ff).rw(FUNC(mcpx_lpc_device::lpc_r), FUNC(mcpx_lpc_device::lpc_w));
+ map(0x00000000, 0x000000ff).rw(FUNC(mcpx_isalpc_device::acpi_r), FUNC(mcpx_isalpc_device::acpi_w));
}
-mcpx_lpc_device::mcpx_lpc_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
- : pci_device(mconfig, MCPX_LPC, tag, owner, clock)
+void mcpx_isalpc_device::internal_io_map(address_map &map)
{
- set_ids(0x10de01b2, 0xb4, 0, 0); // revision id must be at least 0xb4, otherwise usb will require a hub
+ map(0x0020, 0x0023).rw("pic8259_1", FUNC(pic8259_device::read), FUNC(pic8259_device::write));
+ map(0x0040, 0x0043).rw("pit8254", FUNC(pit8254_device::read), FUNC(pit8254_device::write));
+ map(0x0070, 0x0073).rw("rtc", FUNC(ds12885ext_device::read_extended), FUNC(ds12885ext_device::write_extended));
+ map(0x0080, 0x0080).w(FUNC(mcpx_isalpc_device::boot_state_w));
+ map(0x00a0, 0x00a3).rw("pic8259_2", FUNC(pic8259_device::read), FUNC(pic8259_device::write));
}
-void mcpx_lpc_device::device_start()
+void mcpx_isalpc_device::map_extra(uint64_t memory_window_start, uint64_t memory_window_end, uint64_t memory_offset, address_space *memory_space,
+ uint64_t io_window_start, uint64_t io_window_end, uint64_t io_offset, address_space *io_space)
+{
+ io_space->install_device(0, 0xffff, *this, &mcpx_isalpc_device::internal_io_map);
+}
+
+mcpx_isalpc_device::mcpx_isalpc_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock, uint32_t subsystem_id)
+ : mcpx_isalpc_device(mconfig, tag, owner, clock)
+{
+ set_ids(0x10de01b2, 0xb4, 0, subsystem_id); // revision id must be at least 0xb4, otherwise usb will require a hub
+}
+
+mcpx_isalpc_device::mcpx_isalpc_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+ : pci_device(mconfig, MCPX_ISALPC, tag, owner, clock),
+ m_interrupt_output(*this),
+ m_boot_state_hook(*this),
+ pic8259_1(*this, "pic8259_1"),
+ pic8259_2(*this, "pic8259_2"),
+ pit8254(*this, "pit8254")
+{
+}
+
+void mcpx_isalpc_device::device_start()
{
pci_device::device_start();
- add_map(0x00000100, M_IO, FUNC(mcpx_lpc_device::lpc_io));
+ m_interrupt_output.resolve_safe();
+ m_boot_state_hook.resolve_safe();
+ add_map(0x00000100, M_IO, FUNC(mcpx_isalpc_device::lpc_io));
bank_infos[0].adr = 0x8000;
}
-void mcpx_lpc_device::device_reset()
+void mcpx_isalpc_device::device_reset()
{
pci_device::device_reset();
}
-READ32_MEMBER(mcpx_lpc_device::lpc_r)
+void mcpx_isalpc_device::device_add_mconfig(machine_config &config)
+{
+ pic8259_device &pic8259_1(PIC8259(config, "pic8259_1", 0));
+ pic8259_1.out_int_callback().set(FUNC(mcpx_isalpc_device::interrupt_ouptut_changed));
+ pic8259_1.in_sp_callback().set_constant(1);
+ pic8259_1.read_slave_ack_callback().set(FUNC(mcpx_isalpc_device::get_slave_ack));
+
+ pic8259_device &pic8259_2(PIC8259(config, "pic8259_2", 0));
+ pic8259_2.out_int_callback().set(pic8259_1, FUNC(pic8259_device::ir2_w));
+ pic8259_2.in_sp_callback().set_constant(0);
+
+ pit8254_device &pit8254(PIT8254(config, "pit8254", 0));
+ pit8254.set_clk<0>(1125000); /* heartbeat IRQ */
+ pit8254.out_handler<0>().set(FUNC(mcpx_isalpc_device::pit8254_out0_changed));
+ pit8254.set_clk<1>(1125000); /* (unused) dram refresh */
+ pit8254.set_clk<2>(1125000); /* (unused) pio port c pin 4, and speaker polling enough */
+ pit8254.out_handler<2>().set(FUNC(mcpx_isalpc_device::pit8254_out2_changed));
+
+ ds12885ext_device &ds12885(DS12885EXT(config, "rtc", 0));
+ ds12885.irq().set(pic8259_2, FUNC(pic8259_device::ir0_w));
+
+ /*
+ More devices are needed:
+ 82093 compatible I/O APIC
+ dual 8237 DMA controllers
+ */
+}
+
+READ32_MEMBER(mcpx_isalpc_device::acpi_r)
{
+ logerror("Acpi read from %04X mask %08X\n", bank_infos[0].adr + offset, mem_mask);
return 0;
}
-WRITE32_MEMBER(mcpx_lpc_device::lpc_w)
+WRITE32_MEMBER(mcpx_isalpc_device::acpi_w)
+{
+ logerror("Acpi write %08X to %04X mask %08X\n", data, bank_infos[0].adr + offset, mem_mask);
+}
+
+WRITE8_MEMBER(mcpx_isalpc_device::boot_state_w)
+{
+ if (m_boot_state_hook)
+ m_boot_state_hook((offs_t)0, data);
+}
+
+WRITE_LINE_MEMBER(mcpx_isalpc_device::interrupt_ouptut_changed)
+{
+ m_interrupt_output(state);
+}
+
+READ8_MEMBER(mcpx_isalpc_device::get_slave_ack)
+{
+ if (offset == 2) // IRQ = 2
+ return pic8259_2->acknowledge();
+ return 0x00;
+}
+
+WRITE_LINE_MEMBER(mcpx_isalpc_device::pit8254_out0_changed)
+{
+ pic8259_1->ir0_w(state);
+}
+
+WRITE_LINE_MEMBER(mcpx_isalpc_device::pit8254_out2_changed)
+{
+ //xbox_speaker_set_input( state ? 1 : 0 );
+}
+
+WRITE_LINE_MEMBER(mcpx_isalpc_device::irq1)
+{
+ pic8259_1->ir1_w(state);
+}
+
+WRITE_LINE_MEMBER(mcpx_isalpc_device::irq3)
+{
+ pic8259_1->ir3_w(state);
+}
+
+WRITE_LINE_MEMBER(mcpx_isalpc_device::irq10)
+{
+ pic8259_2->ir2_w(state);
+}
+
+WRITE_LINE_MEMBER(mcpx_isalpc_device::irq11)
+{
+ pic8259_2->ir3_w(state);
+}
+
+WRITE_LINE_MEMBER(mcpx_isalpc_device::irq14)
+{
+ pic8259_2->ir6_w(state);
+}
+
+uint32_t mcpx_isalpc_device::acknowledge()
+{
+ return pic8259_1->acknowledge();
+}
+
+void mcpx_isalpc_device::debug_generate_irq(int irq, int state)
{
+ switch (irq)
+ {
+ case 0:
+ pic8259_1->ir0_w(state);
+ break;
+ case 1:
+ pic8259_1->ir1_w(state);
+ break;
+ case 3:
+ pic8259_1->ir3_w(state);
+ break;
+ case 4:
+ pic8259_1->ir4_w(state);
+ break;
+ case 5:
+ pic8259_1->ir5_w(state);
+ break;
+ case 6:
+ pic8259_1->ir6_w(state);
+ break;
+ case 7:
+ pic8259_1->ir7_w(state);
+ break;
+ case 8:
+ pic8259_2->ir0_w(state);
+ break;
+ case 9:
+ pic8259_2->ir1_w(state);
+ break;
+ case 10:
+ pic8259_2->ir2_w(state);
+ break;
+ case 11:
+ pic8259_2->ir3_w(state);
+ break;
+ case 12:
+ pic8259_2->ir4_w(state);
+ break;
+ case 13:
+ pic8259_2->ir5_w(state);
+ break;
+ case 14:
+ pic8259_2->ir6_w(state);
+ break;
+ case 15:
+ pic8259_2->ir7_w(state);
+ break;
+ }
}
/*
@@ -123,12 +291,12 @@ DEFINE_DEVICE_TYPE(MCPX_SMBUS, mcpx_smbus_device, "mcpx_smbus", "MCPX SMBus Cont
void mcpx_smbus_device::smbus_io0(address_map &map)
{
- map(0x00000000, 0x0000000f).noprw();
+ map(0x00000000, 0x0000000f).rw(FUNC(mcpx_smbus_device::smbus0_r), FUNC(mcpx_smbus_device::smbus0_w));
}
void mcpx_smbus_device::smbus_io1(address_map &map)
{
- map(0x00000000, 0x0000000f).rw(FUNC(mcpx_smbus_device::smbus_r), FUNC(mcpx_smbus_device::smbus_w));
+ map(0x00000000, 0x0000000f).rw(FUNC(mcpx_smbus_device::smbus1_r), FUNC(mcpx_smbus_device::smbus1_w));
}
void mcpx_smbus_device::smbus_io2(address_map &map)
@@ -154,8 +322,9 @@ void mcpx_smbus_device::device_start()
add_map(0x00000020, M_IO, FUNC(mcpx_smbus_device::smbus_io2));
bank_infos[2].adr = 0xc200;
memset(&smbusst, 0, sizeof(smbusst));
- for (int n = 0; n < 128; n++)
- smbusst.devices[n] = nullptr;
+ for (int b = 0; b < 2; b++)
+ for (int a = 0; a < 128; a++)
+ smbusst[b].devices[a] = nullptr;
for (device_t &d : subdevices())
{
const char *t = d.tag();
@@ -168,12 +337,16 @@ void mcpx_smbus_device::device_start()
{
l++;
int address = strtol(t + l, nullptr, 16);
- if ((address > 0) && (address < 128))
+ int bus;
+
+ bus = address >> 8;
+ address = address & 0xff;
+ if ((address > 0) && (address < 128) && (bus >= 0) && (bus <= 1))
{
- if (smbusst.devices[address] == nullptr)
+ if (smbusst[bus].devices[address] == nullptr)
{
smbus_interface *i = dynamic_cast<smbus_interface *>(&d);
- smbusst.devices[address] = i;
+ smbusst[bus].devices[address] = i;
}
else
logerror("Duplicate address for SMBus device with tag %s\n", t);
@@ -191,44 +364,44 @@ void mcpx_smbus_device::device_reset()
pci_device::device_reset();
}
-READ32_MEMBER(mcpx_smbus_device::smbus_r)
+uint32_t mcpx_smbus_device::smbus_read(int bus, offs_t offset, uint32_t mem_mask)
{
if (offset == 0) // 0 smbus status
- smbusst.words[offset] = (smbusst.words[offset] & ~0xffff) | ((smbusst.status & 0xffff) << 0);
+ smbusst[bus].words[offset] = (smbusst[bus].words[offset] & ~0xffff) | ((smbusst[bus].status & 0xffff) << 0);
if (offset == 1) // 6 smbus data
- smbusst.words[offset] = (smbusst.words[offset] & ~(0xffff << 16)) | ((smbusst.data & 0xffff) << 16);
- return smbusst.words[offset];
+ smbusst[bus].words[offset] = (smbusst[bus].words[offset] & ~(0xffff << 16)) | ((smbusst[bus].data & 0xffff) << 16);
+ return smbusst[bus].words[offset];
}
-WRITE32_MEMBER(mcpx_smbus_device::smbus_w)
+void mcpx_smbus_device::smbus_write(int bus, offs_t offset, uint32_t data, uint32_t mem_mask)
{
- COMBINE_DATA(smbusst.words);
+ COMBINE_DATA(smbusst[bus].words);
if ((offset == 0) && (ACCESSING_BITS_0_7 || ACCESSING_BITS_8_15)) // 0 smbus status
{
- if (!((smbusst.status ^ data) & 0x10)) // clearing interrupt
+ if (!((smbusst[bus].status ^ data) & 0x10)) // clearing interrupt
{
if (m_interrupt_handler)
m_interrupt_handler(0);
}
- smbusst.status &= ~data;
+ smbusst[bus].status &= ~data;
}
if ((offset == 0) && ACCESSING_BITS_16_23) // 2 smbus control
{
data = data >> 16;
- smbusst.control = data;
- int cycletype = smbusst.control & 7;
- if (smbusst.control & 8) { // start
+ smbusst[bus].control = data;
+ int cycletype = smbusst[bus].control & 7;
+ if (smbusst[bus].control & 8) { // start
if ((cycletype & 6) == 2)
{
- if (smbusst.devices[smbusst.address])
- if (smbusst.rw == 0)
- smbusst.devices[smbusst.address]->execute_command(smbusst.command, smbusst.rw, smbusst.data);
+ if (smbusst[bus].devices[smbusst[bus].address])
+ if (smbusst[bus].rw == 0)
+ smbusst[bus].devices[smbusst[bus].address]->execute_command(smbusst[bus].command, smbusst[bus].rw, smbusst[bus].data);
else
- smbusst.data = smbusst.devices[smbusst.address]->execute_command(smbusst.command, smbusst.rw, smbusst.data);
+ smbusst[bus].data = smbusst[bus].devices[smbusst[bus].address]->execute_command(smbusst[bus].command, smbusst[bus].rw, smbusst[bus].data);
else
- logerror("SMBUS: access to missing device at address %d\n", smbusst.address);
- smbusst.status |= 0x10;
- if (smbusst.control & 0x10)
+ logerror("SMBUS: access to missing device at bus %d address %d\n", bus, smbusst[bus].address);
+ smbusst[bus].status |= 0x10;
+ if (smbusst[bus].control & 0x10)
{
if (m_interrupt_handler)
m_interrupt_handler(1);
@@ -238,16 +411,36 @@ WRITE32_MEMBER(mcpx_smbus_device::smbus_w)
}
if ((offset == 1) && ACCESSING_BITS_0_7) // 4 smbus address
{
- smbusst.address = data >> 1;
- smbusst.rw = data & 1;
+ smbusst[bus].address = data >> 1;
+ smbusst[bus].rw = data & 1;
}
if ((offset == 1) && (ACCESSING_BITS_16_23 || ACCESSING_BITS_16_31)) // 6 smbus data
{
data = data >> 16;
- smbusst.data = data;
+ smbusst[bus].data = data;
}
if ((offset == 2) && ACCESSING_BITS_0_7) // 8 smbus command
- smbusst.command = data;
+ smbusst[bus].command = data;
+}
+
+READ32_MEMBER(mcpx_smbus_device::smbus0_r)
+{
+ return smbus_read(0, offset, mem_mask);
+}
+
+WRITE32_MEMBER(mcpx_smbus_device::smbus0_w)
+{
+ smbus_write(0, offset, data, mem_mask);
+}
+
+READ32_MEMBER(mcpx_smbus_device::smbus1_r)
+{
+ return smbus_read(1, offset, mem_mask);
+}
+
+WRITE32_MEMBER(mcpx_smbus_device::smbus1_w)
+{
+ smbus_write(1, offset, data, mem_mask);
}
/*
@@ -747,7 +940,7 @@ void mcpx_ide_device::device_add_mconfig(machine_config &config)
{
bus_master_ide_controller_device &ide(BUS_MASTER_IDE_CONTROLLER(config, "ide", 0));
ide.irq_handler().set(FUNC(mcpx_ide_device::ide_interrupt));
- ide.set_bus_master_space("maincpu", AS_PROGRAM);
+ ide.set_bus_master_space(":maincpu", AS_PROGRAM);
}
WRITE_LINE_MEMBER(mcpx_ide_device::ide_interrupt)
diff --git a/src/mame/machine/z80ne.cpp b/src/mame/machine/z80ne.cpp
index 6d1251a69ee..c9e1677e667 100644
--- a/src/mame/machine/z80ne.cpp
+++ b/src/mame/machine/z80ne.cpp
@@ -276,8 +276,7 @@ MACHINE_RESET_MEMBER(z80ne_state,z80ne_base)
m_uart->write_eps(1);
m_uart->write_np(m_io_lx_385->read() & 0x80 ? 1 : 0);
m_uart->write_cs(1);
- m_uart->set_receiver_clock(m_cass_data.speed * 16.0);
- m_uart->set_transmitter_clock(m_cass_data.speed * 16.0);
+ m_uart_clock->set_unscaled_clock(m_cass_data.speed * 16);
lx385_ctrl_w(m_maincpu->space(AS_PROGRAM), 0, 0);
@@ -511,14 +510,13 @@ WRITE8_MEMBER(z80ne_state::lx385_ctrl_w)
* 3 *TAPEA Enable (active low) (at reset: low)
* 4 *TAPEB Enable (active low) (at reset: low)
*/
- uint8_t uart_reset, uart_rdav, uart_tx_clock;
+ uint8_t uart_reset, uart_rdav;
uint8_t motor_a, motor_b;
uint8_t changed_bits = (m_lx385_ctrl ^ data) & 0x1C;
m_lx385_ctrl = data;
uart_reset = ((data & 0x03) == 0x00);
uart_rdav = ((data & 0x03) == 0x01);
- uart_tx_clock = ((data & 0x04) == 0x04);
motor_a = ((data & 0x08) == 0x00);
motor_b = ((data & 0x10) == 0x00);
@@ -537,10 +535,6 @@ WRITE8_MEMBER(z80ne_state::lx385_ctrl_w)
if (!changed_bits) return;
- /* UART Tx Clock enable/disable */
- if (changed_bits & 0x04)
- m_uart->set_transmitter_clock(uart_tx_clock ? m_cass_data.speed * 16.0 : 0.0);
-
/* motors */
if(changed_bits & 0x18)
{
@@ -557,6 +551,12 @@ WRITE8_MEMBER(z80ne_state::lx385_ctrl_w)
}
}
+WRITE_LINE_MEMBER(z80ne_state::lx385_uart_tx_clock_w)
+{
+ if (BIT(m_lx385_ctrl, 2))
+ m_uart->write_tcp(state);
+}
+
READ_LINE_MEMBER(z80ne_state::lx387_shift_r)
{
return BIT(m_io_modifiers->read(), 0) || BIT(m_io_modifiers->read(), 2);
diff --git a/src/mame/mame.lst b/src/mame/mame.lst
index a90d536c37f..3d07627e772 100644
--- a/src/mame/mame.lst
+++ b/src/mame/mame.lst
@@ -154,6 +154,7 @@ invadpt2br // Taito do Brasil
invadrmr // (c) 1978 Model Racing
invasion // Sidam
invasiona // bootleg
+invasiona2 // bootleg
invasionb // bootleg
invasionrz // bootleg
invasionrza // bootleg
@@ -871,6 +872,12 @@ sp_zigzgk //
sp_zigzgl //
sp_zigzgm //
+@source:aci_boris.cpp
+boris //
+
+@source:aci_borisdpl.cpp
+borisdpl //
+
@source:acommand.cpp
acommand // (c) 1990
@@ -903,6 +910,15 @@ viruscl // (c) 2004 Access GmbH
@source:adam.cpp
adam // Coleco Adam
+@source:adm23.cpp
+adm23 //
+
+@source:adm31.cpp
+adm31 //
+
+@source:adm36.cpp
+adm36 //
+
@source:adp.cpp
fashiong // (c) 1997
fashiong2 // (c) 1997
@@ -990,6 +1006,7 @@ alcat7100 //
aleck64 // (c) 1998 Nintendo/Seta
doncdoon // (c) 2003 Aruze (Arcade TV Game List - P.90, Right, 8 from bottom)
hipai // (c) 2003 Seta/Aruze (Arcade TV Game List - P.92, Right, 16 from top)
+hipai2 // (c) 2004 Seta/Aruze/Paon
kurufev // (c) 2003 Aruze (Arcade TV Game List - P.75, Right, 1st entry on top)
mayjin3 // (c) 2000 Seta (Arcade TV Game List - P.101, Right, 9 from top)
mtetrisc // (c) 1998 Capcom
@@ -1636,16 +1653,19 @@ qnilece // (c) 2001
qnilecea // (c) 2001
qnileceb // (c) 2001
qniled // (c) 1999
+qnilefl // (c) 2001
+qnilemax // (c) 1999
qnilenl // (c) 2000
+qnilenz // (c) 1998
+qnileql // (c) 1999
qnileu // (c) 1997
qnileua // (c) 1997
qnilev // (c) 1997
-qnilemax // (c) 1999
-qnilenz // (c) 1998
qtbird // (c) 1994
rainwrce // (c) 2000
reelpwr // (c) 1996
reelrock // (c) 1998
+reelrockql // (c) 2000
retrsam // (c) 1997
retrsama // (c) 1997
retrsamb // (c) 1997
@@ -1728,6 +1748,7 @@ beavbuk // (c) 2008
betzoo // (c) 2003
bigben // (c) 2003
bigbena // (c) 2003
+bigbenq // (c) 2005
bigheart // (c) 1999
bigred // (c) 2002
bigreda // (c) 2002
@@ -1750,15 +1771,16 @@ calyking // (c) 2005
canaryrc // (c) 2006
cmtonig // (c) 2005
cinhell // (c) 2004
-csd // (c) 2002
-csdsp // (c) 2002
-csdm // (c) 2003
-csdce // (c) 2003
-csret // (c) 2006
corrida // (c) 2005
cryspri // (c) 2003
crysprim // (c) 2003
cryspriu // (c) 2006
+csd // (c) 2002
+csdce // (c) 2003
+csdm // (c) 2003
+csdq // (c) 2002
+csret // (c) 2006
+csdsp // (c) 2002
deepfrz // (c) 2009
deepfrzu // (c) 2009
deltabel // (c) 2005
@@ -1769,6 +1791,7 @@ di4ever // (c) 2002
dinosa6 // (c) 2003
dblagent // (c) 2005
dbldolph // (c) 2000
+dbldolphq // (c) 2000
drgnlord // (c) 2004
drgnmgic // (c) 2006
drmcatch // (c) 2003
@@ -1796,6 +1819,7 @@ gogreen // (c) 2001
goldarch // (c) 2005
gldnflc // (c) 2003
gldgong // (c) 2005
+gldgongq // (c) 2005
goldinc // (c) 2004
goldincu // (c) 2005
goldpym // (c) 2002
@@ -1836,14 +1860,16 @@ lovestuk // (c) 200?
luigibal // (c) 2007
lucky88 // (c) 2007
magforst // (c) 2005
+magician // (c) 2006
magmerm // (c) 2003
+mchilli // (c) 2008
+mchilliq // (c) 2010
metestrm // (c) 2007
milkin // (c) 2007
mskitty // (c) 2005
mnytree // (c) 2000
+moonfire // (c) 2004
moonwalt // (c) 2007
-mchilli // (c) 2008
-mchilliq // (c) 2010
mrwoo // (c) 200?
mystarr // (c) 2002
mysteycm // (c) 2001
@@ -1884,9 +1910,12 @@ qnilese // (c) 2001
qnilesea // (c) 2001
qnilejc // (c) 2002
qnilejcsp // (c) 2002
+qnilemt2 // (c) 2005
qsheba // (c) 2003
raprichs // (c) 2005
redbara6 // (c) 2002
+redbarfl // (c) 2003
+reelrkfl // (c) 201?
retsama6 // (c) 2002
roadtrip // (c) 2005
ruprup // (c) 2002
@@ -1900,11 +1929,13 @@ shorthng // (c) 2004
shamnmg // (c) 2006
shamnmgu // (c) 200?
smtma6 // (c) 2001
+smtma6q // (c) 2001
silkrda6 // (c) 2006
silgola6 // (c) 2002
skydnca6 // (c) 2008
spgcarn // (c) 1999
spgcarnq // (c) 2001
+spgfest // (c) 2008
stardrft // (c) 2003
stardrftu // (c) 2004
starqst // (c) 2001
@@ -1939,6 +1970,7 @@ whalecshua // (c) 2005
wheregld // (c) 2004
wheregldsp // (c) 2004
wheregldm // (c) 2004
+wheregldq // (c) 2005
whtwater // (c) 2003
wikwin2 // (c) 2006
wldafr // (c) 2002
@@ -2689,6 +2721,9 @@ avalnche // 030574 1978/04 [6502]
cascade // bootleg
catchp // 008837 prototype 1977/?? [6502]
+@source:ave_arb.cpp
+arb //
+
@source:avigo.cpp
avigo // 1997 Avigo
avigo_de // 1997 Avigo (German)
@@ -2806,6 +2841,7 @@ metrocrsa // (c) 1985
barata //
@source:barni.cpp
+champion //
redbarnp //
@source:bartop52.cpp
@@ -2919,6 +2955,9 @@ ldrink //
ldrinka //
merryjn //
+@source:bert.cpp
+bert //
+
@source:berzerk.cpp
berzerk // (c) 1980
berzerk1 // (c) 1980
@@ -8823,6 +8862,7 @@ bionicc2 // 3/1987 (c) 1987 (US)
bioniccbl // bootleg
bioniccbl2 // bootleg
topsecrt // 3/1987 (c) 1987 (Japan)
+topsecrt2 // 3/1987 (c) 1987 (Japan)
@source:bishi.cpp
bishi // GX575 (c) 1996 (Japan)
@@ -9241,6 +9281,9 @@ c128dcrp //
c128dp //
c128p //
+@source:c2color.cpp
+c2color
+
@source:c64.cpp
c64 //
c64_jp // Commodore 64 (Japan)
@@ -9718,8 +9761,6 @@ chessmsta //
chessmstdm //
@source:chesstrv.cpp
-boris //
-borisdpl //
chesstrv //
@source:chexx.cpp
@@ -9732,6 +9773,7 @@ dmodrbcc // (c) 1976 Chicago Coin
@source:chihiro.cpp
ccfboxa // 2009.03.31 Firmware Update For Compact Flash Box (Rev A)
chihiro // 2002.?? Chihiro BIOS
+cregchg // 2003.02 Chihiro Change Region USA
crtaxihr // 2003.02.24 Crazy Taxi High Roller (Rev B)
ghostsqo // 2004.12 Ghost Squad
ghostsqu // 2004.12.09 Ghost Squad (Rev A)
@@ -9741,8 +9783,10 @@ mj2 // 2005.02.02 Sega Network Taisen Mahjong MJ 2 (
mj2c // 2004.12 Sega Network Taisen Mahjong MJ 2 (Rev C)
mj2f // 2005.02 Sega Network Taisen Mahjong MJ 2 (Rev F)
mj3 // 2005.12 Sega Network Taisen Mahjong MJ 3 (Rev F)
+mj3c // 2005.11 Sega Network Taisen Mahjong MJ 3 (Rev C)
mj3d // 2005.12 Sega Network Taisen Mahjong MJ 3 (Rev D)
mj3evo // 2007.06 Sega Network Taisen Mahjong MJ 3 Evolution (Rev B)
+mj3evoa // 2007.02 Sega Network Taisen Mahjong MJ 3 Evolution (Rev A)
ollie // 2004.03 Ollie King
outr2 // 2003.12 Outrun 2 (Rev A)
outr2stjo // 2004.09 Outrun 2 Special Tours (Japan)
@@ -9863,7 +9907,7 @@ citycon // (c) 1985 Jaleco
citycona // (c) 1985 Jaleco
cruisin // (c) 1985 Jaleco/Kitkorp
-@source:ckz80.cpp
+@source:cking_master.cpp
ckmaster //
@source:clayshoo.cpp
@@ -9872,6 +9916,9 @@ clayshoo // [1979 Allied Leisure]
@source:clcd.cpp
clcd // Commodore LCD
+@source:clickstart.cpp
+clikstrt // (c) 2007 LeapFrog Enterprises
+
@source:cliffhgr.cpp
cliffhgr // (c) 1983
cliffhgra // (c) 1983
@@ -10720,6 +10767,9 @@ crimfghtj // GX821 (c) 1989 (Japan)
@source:crimson.cpp
crimson // (c) 1992 SGI
+@source:cromptons.cpp
+ffruits //
+
@source:crospang.cpp
bestri // (c) F2 System
bestria //
@@ -10878,7 +10928,7 @@ wallst // (c) 1982 Century
@source:cwheel.cpp
cwheel // (c) 19?? Gamebar
-@source:cxgz80.cpp
+@source:cxg_ch2001.cpp
ch2001 //
@source:cxhumax.cpp
@@ -11188,6 +11238,7 @@ stwr_103 //
stwr_104 //
stwr_106 //
stwr_106s //
+stwr_a046 //
stwr_a14 //
stwr_e12 //
stwr_g11 //
@@ -11267,6 +11318,7 @@ ffantasyb // EX (c) 1989 Data East Corporation (World)
ffantasybl // bootleg
hbarrel // (c) 1987 Data East USA (US)
hbarrelw // (c) 1987 Data East Corporation (World)
+bandit // (c) 1989 Data East USA (US)
hippodrm // EW (c) 1989 Data East USA (US)
midres // (c) 1989 Data East Corporation (World)
midresb // bootleg
@@ -11476,6 +11528,7 @@ diablo //
@source:didact.cpp
md6802 //
mp68a //
+modulab //
@source:dietgo.cpp
dietgo // MAY (c) 1993
@@ -11504,9 +11557,11 @@ divebomb // GX840 (c) 1989 (Japan)
diverboy // (c) 1992 Electronic Devices
@source:djboy.cpp
-djboy // (c) 1989 Kaneko
-djboya // (c) 1989 Kaneko
-djboyj // (c) 1989 Kaneko
+djboy // (c) 1989 Kaneko (World)
+djboyj // (c) 1989 Kaneko (Japan, Sega license)
+djboyja // (c) 1989 Kaneko (Japan, Sega license)
+djboyu // (c) 1990 Kaneko (USA, American Sammy license)
+djboyua // (c) 1990 Kaneko (USA, American Sammy license)
@source:djmain.cpp
bm1stmix // GQ753 (c) 1997 (Japan)
@@ -12726,6 +12781,7 @@ fanucspgm // 1983
@source:fastfred.cpp
boggy84 // (c) 1984 Kaneko
boggy84b // bootleg
+boggy84b2 // bootleg
fastfred // 136009 (c) 1982 Atari
flyboy // (c) 1982 Kaneko
flyboyb // bootleg
@@ -12809,68 +12865,53 @@ feversoc // (c) 2004
fgoal // TF (c) 1979 Taito Corporation
fgoala // MF (c) 1979 Taito Corporation
-@source:fidel6502.cpp
+@source:fidel_as12.cpp
+feleg //
+
+@source:fidel_card.cpp
+bridgec3 //
+bridgeca //
+gincribc //
+vbrc //
+
+@source:fidel_cc1.cpp
+cc1 //
+
+@source:fidel_cc10.cpp
+cc10 //
+checkc4 //
+
+@source:fidel_cc7.cpp
+backgamc //
+cc7 //
+
+@source:fidel_chesster.cpp
chesster //
chesstera //
kishon //
-csc // CSC: Champion Sensory Chess Challenger (English)
-cscfr // * French
-cscg // * German
-cscsp // * Spanish
-fdes2000 //
-fdes2100 //
-fdes2000d //
-fdes2100d //
-feasbu // EAS: Elite A/S Challenger (Budapest program, English)
-feasbufr // * French
-feasbug // * German
-feasbusp // * Spanish
-feasgla // EAS: Elite A/S Challenger (Glasgow program, English)
-feasglafr // * French
-feasglag // * German
-feasglasp // * Spanish
-feag2100 // EAG: Elite Avant Garde 2100 (English)
-feag2100fr // * French
-feag2100g // * German
-feag2100sp // * Spanish
-feleg //
-fexcel //
-fexcel12 //
-fexcel124 //
-fexcela //
-fexceld //
-fexcelp //
-fexcelpb //
-fexcelv //
-fphantom //
-fpres //
-fpressp //
-fpresg //
-fpresfr //
-fpresbu //
-fpresbusp //
-fpresbug //
-fpresbufr //
-fscc9 //
-fscc9b //
-fscc9c //
-fscc9ps //
-fscc12 //
-fscc12b //
-granits // RCS
+kishona //
+
+@source:fidel_csc.cpp
+csc //
+csce //
reversic //
-super9cc // SU9: Super 9 Sensory Chess Challenger (English)
-super9ccfr // * French
-super9ccg // * German
-super9ccsp // * Spanish
+super9cc //
+
+@source:fidel_dames.cpp
+damesc //
-@source:fidel68k.cpp
+@source:fidel_desdis.cpp
+fdes2000d //
+fdes2100d //
fdes2265 //
fdes2325 //
+
+@source:fidel_eag68k.cpp
feagv10 //
feagv11 //
feagv2 //
-feagv2a //
+feagv3 //
+feagv5 //
feagv7 //
feagv7a //
feagv9 //
@@ -12880,31 +12921,57 @@ fex68kb //
fex68km2 //
fex68km3 //
-@source:fidelmcs48.cpp
+@source:fidel_elite.cpp
+feasbu //
+feasgla //
+feag //
+feag2100 //
+fepriv //
+fpres //
+fpresbu //
+
+@source:fidel_excel.cpp
+fdes2000 //
+fdes2100 //
+fexcel //
+fexcel12 //
+fexcel124 //
+fexcela //
+fexceld //
+fexcelp //
+fexcelpb //
+fexcelv //
+granits // RCS
+
+@source:fidel_phantom.cpp
+fphantom //
+
+@source:fidel_sc12.cpp
+fscc12 //
+fscc12b //
+
+@source:fidel_sc6.cpp
fscc6 //
-@source:fidelz80.cpp
-bridgec3 //
-cc10 //
-cc7 //
-damesc //
+@source:fidel_sc8.cpp
fscc8 //
-uvc // UVC: Advanced Voice Chess Challenger (English)
-uvcfr // * French
-uvcg // * German
-uvcsp // * Spanish
-vbrc //
-vcc // VCC: Voice Chess Challenger (English)
-vccfr // * German
-vccg // * Spanish
-vccsp // * French
-vsc // VSC: Voice Sensory Chess Challenger (English)
-vscfr // * French
-vscg // * German
-vscsp // * Spanish
+
+@source:fidel_sc9.cpp
+fscc9 //
+fscc9b //
+fscc9c //
+fscc9ps //
+
+@source:fidel_vcc.cpp
+uvc //
+vcc //
+
+@source:fidel_vsc.cpp
+vsc //
@source:finalizr.cpp
finalizr // GX523 (c) 1985
+finalizra // GX523 (c) 1985
finalizrb // bootleg
@source:fireball.cpp
@@ -13035,6 +13102,7 @@ fp6000 //
@source:freekick.cpp
omega // (c) 1986 Nihon System
+omegaa // (c) 1986 Nihon System
countrun // (c) 1988 Nihon System (+ optional Sega) NS6201-A 1988.3
countrunb // (c) 1988 bootleg
countrunb2 // (c) 1988 bootleg
@@ -13052,6 +13120,9 @@ pbillrd // (c) 1987 Nihon System
pbillrds // (c) 1987 Nihon System (Sega license?)
pbillrdsa // (c) 1987 Nihon System (Sega license?)
+@source:freeway.cpp
+freeway
+
@source:fresh.cpp
fresh // (c) Chain Leisure
@@ -13236,7 +13307,8 @@ aligatoruna // (c) 1994 - Ref 940411 (unprotected)
bang // (c) 1998 - Ref ???
bangj // (c) 1999 - Ref ???
play2000 // (c) 1999 - Ref ???
-play2000a // (c) 1999 - Ref ???
+play2000_40i // (c) 1999 - Ref ???
+play2000_50i // (c) 1999 - Ref ???
maniacsq // (c) 1996 - Ref 940411
maniacsqa // (c) 1996 - Ref 940411
maniacsqu // (c) 1996 - Ref 940411 - (unprotected)
@@ -13473,6 +13545,7 @@ scobra // GX316 (c) 1981 Konami
scobrab // GX316 (c) 1981 Karateco (bootleg?)
scobrae // GX316 (c) 1981 Stern
scobrag // AVG by Zaccaria (bootleg?)
+scobraggi // bootleg (Cocamatic)
scobras // GX316 (c) 1981 Stern
scobrase // GX316 (c) 1981 Sega
scorpion // (c) 1982 Zaccaria
@@ -13481,6 +13554,7 @@ scorpionb // (c) 1982 Zaccaria
scorpionmc // bootleg
scramble // GX387 (c) 1981 Konami
scramblebb // bootleg?
+kamikazesp // bootleg (Euromatic S.A.)
scramblebf // bootleg
scrambles // GX387 (c) 1981 Stern
scrambles2 // GX387 (c) 1981 Stern
@@ -13661,6 +13735,9 @@ gcbr // (c) 2002 Nintendo
gamekin3 //
gameking //
+@source:gamemachine.cpp
+2001tgm //
+
@source:gamemasters.cpp
gmsshoot // (c) 1989 GameMasters
@@ -14131,7 +14208,7 @@ goal92 // bootleg
@source:goindol.cpp
goindol // (c) 1987 Sun a Electronics
-goindolk // (c) 1987 Sun a Electronics
+goindolj // (c) 1987 Sun a Electronics
goindolu // (c) 1987 Sun a Electronics
homo // bootleg
@@ -14371,6 +14448,7 @@ nfb96c // (c) 1996 Amcoe
nfb96se // bootleg
nfb96sea // bootleg
nfb96seb // bootleg
+nfb96sec // bootleg
nfb96txt // (c) 2000 Amcoe
nfm // bootleg
ns8lines // unknown
@@ -14415,6 +14493,7 @@ totmejan // (c) 1991 Seibu/Tecmo
@source:gotcha.cpp
gotcha // (c) 1997 Dongsung + "presented by Para"
ppchamp // (c) 1997 Dongsung + "presented by Para"
+ppchampa // (c) 1997 Dongsung + "presented by Para"
@source:gottlieb.cpp
3stooges // GV-113 (c) 1984 Mylstar
@@ -14971,7 +15050,7 @@ gdigdug // Gakken
ghalien // Gakken
kingman // Tomy
machiman // Bandai
-msthawk // Bandai/Mattel
+msthawk // Mattel
mwcbaseb // Mattel
packmon // Bandai
pairmtch // Bandai
@@ -15004,6 +15083,7 @@ uspbball // US Games
@source:hh_sm510.cpp
exospace // Elektronika
+gnw_bfight // Nintendo
gnw_bjack // Nintendo
gnw_boxing // Nintendo
gnw_climber // Nintendo
@@ -15011,14 +15091,23 @@ gnw_dkjr // Nintendo
gnw_dkong // Nintendo
gnw_dkong2 // Nintendo
gnw_egg // Nintendo
+gnw_fire // Nintendo
+gnw_fireatk // Nintendo
gnw_ghouse // Nintendo
+gnw_lboat // Nintendo
+gnw_manhole // Nintendo
gnw_mario // Nintendo
gnw_mariocm // Nintendo
gnw_mmouse // Nintendo
gnw_mickdon // Nintendo
+gnw_octopus // Nintendo
gnw_opanic // Nintendo
+gnw_pchute // Nintendo
+gnw_rshower // Nintendo
gnw_smb // Nintendo
gnw_squish // Nintendo
+gnw_stennis // Nintendo
+gnw_tbridge // Nintendo
gnw_tfish // Nintendo
kbilly // Konami
kblades // Konami
@@ -15125,6 +15214,7 @@ ginv2000 // Gakken
gjackpot // Gakken
gpoker // Gakken
h2hbaseb // Coleco
+h2hbaskb // Coleco
h2hboxing // Coleco
h2hfootb // Coleco
h2hhockey // Coleco
@@ -15371,6 +15461,7 @@ hp95lx //
@source:hp9825.cpp
hp9825b // HP 9825B
+hp9825t // HP 9825T
@source:hp9845.cpp
hp9835a //
@@ -15664,6 +15755,9 @@ inteladv
intlc44 //
intlc440 //
+@source:intellect02.cpp
+intel02 //
+
@source:interact.cpp
hector1 //
interact //
@@ -15857,6 +15951,7 @@ wcbowl11 // (c) 1995 Incredible Technologies
wcbowl12 // (c) 1995 Incredible Technologies
wcbowl13 // (c) 1995 Incredible Technologies
wcbowl13j // (c) 1995 IT Inc, Licensed to Excellent System Ltd. for Japan
+wcbowl130 // (c) 1995 Incredible Technologies
wcbowl14 // (c) 1995 Incredible Technologies
wcbowl140 // (c) 1995 Incredible Technologies
wcbowl15 // (c) 1995 Incredible Technologies
@@ -16068,6 +16163,11 @@ jclub2v220 // v2.20 14 APR. 1998
@source:jedi.cpp
jedi // 136030 (c) 1984
+@source:jensen.cpp
+d2k300axp // DEC 2000 Model 300 AXP
+d2k500axp // DEC 2000 Model 500 AXP
+dpcaxp150 // DECpc AXP 150
+
@source:jeutel.cpp
leking //
olympic //
@@ -17658,6 +17758,8 @@ karatevs // (c) 1984 Data East Corporation (Japan)
kchamp // (c) 1984 Data East USA (US)
kchampvs // (c) 1984 Data East USA (US)
kchampvs2 // (c) 1984 Data East USA (US)
+kchampvs3 // (c) 1984 Data East USA (US)
+kchampvs4 // (c) 1984 Data East USA (US)
@source:kdt6.cpp
psi98 // (c) 1984 Kontron
@@ -18101,6 +18203,12 @@ lckydraw // (c) 1979 Mirco
@source:lcmate2.cpp
lcmate2 //
+@source:leapfrog_leappad.cpp
+leappad // (c) 2001 LeapFrog / Knowledge Kids Enterprises, Inc.
+leappadca // (c) 2004 LeapFrog
+mfleappad // (c) 2002 LeapFrog
+mfleappadus // (c) 2004 LeapFrog
+
@source:leapster.cpp
leapster //
leapstertv //
@@ -18184,6 +18292,7 @@ lemmings // prototype (c) 1991 Data East USA (US)
lethalen // GX191 (c) 1992
lethaleneaa // GX191 (c) 1992
lethaleneab // GX191 (c) 1992
+lethalenead // GX191 (c) 1992
lethaleneae // GX191 (c) 1992
lethalenj // GX191 (c) 1992
lethalenua // GX191 (c) 1992
@@ -18495,6 +18604,7 @@ gallop // (c) 1991 (Japan)
hharry // (c) 1990 (World)
hharryu // (c) 1990 Irem America (US)
imgfight // (c) 1988 (World)
+imgfightb // bootleg
imgfightj // (c) 1988 (Japan)
kengo // (c) 1991 (Japan)
kengoa // (c) 1991 (Japan)
@@ -20904,12 +21014,14 @@ dcat16 //
@source:megadriv_acbl.cpp
aladmdb // MegaDrive-based hack
+barek3mb // MegaDrive-based hack
+jparkmb // MegaDrive-based hack
mk3mdb // MegaDrive-based hack
sonic2mb // MegaDrive-based hack
srmdb // MegaDrive-based hack
ssf2mdb // MegaDrive-based hack
topshoot // (c) 1995 Sun Mixing
-barek3mb // MegaDrive-based hack
+twinktmb // MegaDrive-based hack
@source:megadriv_rad.cpp
rad_sf // (c)2004 Radica
@@ -21222,8 +21334,9 @@ lastfortk // (c) 1994
moegonta // (c) 1993 Yanyaka (Japan) (Arcade TV Game List - P.101, Right, 2 from Bottom)
mouja // (c) 1996 Etona (Japan)
msgogo // (c) 1995 Metro
-pangpoms // (c) 1992
+pangpoms // (c) 1992 Metro
pangpomsm // (c) 1992 Mitchell / Metro
+pangpomsn // (c) 1992 Nova
poitto // (c) 1993 Metro / Able Corp.
pururun // (c) 1995 Metro / Banpresto
puzzlet // (c) 2000 Yunizu Corporation (Japan)
@@ -21303,6 +21416,9 @@ md3 //
@source:microkit.cpp
microkit //
+@source:micromon.cpp
+micromon7141 //
+
@source:micronic.cpp
micronic //
@@ -21548,6 +21664,9 @@ miraxa // (c) 1985 Current Technologies
bublpong // bootleg on enhanced hardware
missb2 // bootleg on enhanced hardware
+@source:missbamby.cpp
+msbamby // 198?
+
@source:missile.cpp
mcombat // bootleg
mcombata // bootleg
@@ -21610,6 +21729,7 @@ mjsister // (c) 1986 Toaplan
@source:mk1.cpp
ccmk1 // Chess Champion MK I
+cmpchess
@source:mk14.cpp
mk14 //
@@ -21707,6 +21827,7 @@ motoraid // 1997.10 Motor Raid Twin
motoraiddx // 1997.10 Motor Raid DX
overrev // 1997.09 Over Rev (Revision A)
overrevb // 1997.09 Over Rev (Revision B)
+overrevba // 1997.09 Over Rev (Revision A)
pltkids // 1999.03 Pilot Kids (Revision A)
pltkidsa // 1999.03 Pilot Kids
rascot2 // 1997.?? Royal Ascot II
@@ -21719,6 +21840,7 @@ skisuprg // 1996.12 Sega Ski Super G
skytargt // 1995.10 Sky Target
srallyc // 1995.02 Sega Rally Championship TWIN (Revision C)
srallycb // 1995.02 Sega Rally Championship TWIN (Revision B)
+srallycc // 1995.02 Sega Rally Championship TWIN (Revision A)
srallycdx // 1995.02 Sega Rally Championship DX (Revision A)
srallycdxa // 1995.02 Sega Rally Championship DX
stcc // 1996.09 Sega Touring Car Championship
@@ -21766,7 +21888,7 @@ harleya // 1997.12 Harley Davidson & L.A.Riders (rev A)
lamachin // 1998.12 L.A. Machine Guns
lemans24 // 1997.09 Le Mans 24
lostwsga // 1997.07 Lost World Jurassic Park
-lostwsgo // 1997.06 Lost World Jurassic Park (older)
+lostwsgp // 1997.06 Lost World Jurassic Park (location test)
magtruck // 1999.03 Magical Truck Adventure (US)
oceanhun // 1998.09 Ocean Hunter
scud // 1996.12 Scud Race
@@ -28642,6 +28764,7 @@ mugsmash // (c) Electronic Devices (Italy) / 3D Games (En
crzmon2 // (c) 2010
crzmon2_2 // (c) 2010
crzmon2_3 // (c) 2010
+crzmon2_4 // (c) 2010
czmon_13 // (c) 2003
czmon_15 // (c) 2003
czmon_16 // (c) 2003
@@ -28683,6 +28806,7 @@ gnome_9 // (c) 2007
goldfish // (c) 2002 - Prototype of Multifish
island // (c) 2005
island_2 // (c) 2005
+island_3 // (c) 2005
island2 // (c) 2006
island2_3 // (c) 2006
island2_4 // (c) 2006
@@ -28693,6 +28817,8 @@ keks_2 // (c) 2006
keks_3 // (c) 2006
keks_4 // (c) 2006
keks_5 // (c) 2006
+keks_6 // (c) 2006
+keks_7 // (c) 2006
lhaunt_10 // (c) 2003
lhaunt_11 // (c) 2003
lhaunt_2 // (c) 2003
@@ -28710,6 +28836,7 @@ mfish_8 // (c) 2002
pirate_2 // (c) 2005
pirate_3 // (c) 2005
pirate_4 // (c) 2005
+pirate_5 // (c) 2005
pirate2 // (c) 2006
pirate2_2 // (c) 2006
pirate2_3 // (c) 2006
@@ -28727,9 +28854,11 @@ resdnt_8 // (c) 2004
resdnt_9 // (c) 2004
rollfr_2 // (c) 2003
rollfr_3 // (c) 2003
-rollfr_4 // (c) 2003 (bootleg?)
+rollfr_4 // (c) 2003
+rollfr_5 // (c) 2003
sweetl // (c) 2004
sweetl_2 // (c) 2004
+sweetl_3 // (c) 2004
sweetl2 // (c) 2007
sweetl2_2 // (c) 2007
sweetl2_3 // (c) 2007
@@ -29482,6 +29611,7 @@ cleoftp // 2002.05 Cleopatra Fortune Plus
clubk2k3 // 2003.?? Club Kart: European Session (2003, Rev A)
clubk2kp // 2003.?? Club Kart: European Session (2003, prototype)
clubkcyc // 2003.?? Club Kart Cycraft Edition (Rev A)
+clubkcyco // 2003.?? Club Kart Cycraft Edition
clubkprz // 2003.?? Club Kart Prize
clubkpzb // 2004.01.23 Club Kart Prize Ver. B (strings in the EPROM indicate a build date of Jan. 23, 2004 for the game's program)
clubkrt // 2001.06 Club Kart: European Session (Rev D)
@@ -29560,6 +29690,7 @@ initdexpo // 2002.?? Initial D Arcade Stage (Export)
initdo // 2002.03 Initial D Arcade Stage (Japan)
initdv2e // 2002.12 Initial D Arcade Stage Ver. 2 (export)
initdv2j // 2003.05.27 Initial D Arcade Stage Ver. 2 (Japan) (Rev B)
+initdv2ja // 2002.12 Initial D Arcade Stage Ver. 2 (Japan) (Rev A)
initdv2jo // 2002.12 Initial D Arcade Stage Ver. 2 (Japan)
initdv3e // 2004.05.18 Initial D Arcade Stage Ver. 3 (Export)
initdv3j // 2004.01.30 Initial D Arcade Stage Ver. 3 (Japan) (Rev C)
@@ -29571,12 +29702,14 @@ karous // 2006.11 Karous
keyboard // 2001.11 La Keyboard
kick4csh // 2004.?? Kick '4' Cash
kingrt66 // 2002.02 The King of Route 66 (Rev A)
+kingrt66p // 2002.01 The King of Route 66 (prototype)
kofnw // 2004.07 The King of Fighters Neo Wave
kofnwj // 2004.07 The King of Fighters Neo Wave (Japan)
kofxi // 2005.10 The King of Fighters XI
kov7sprt // 2003.11 Knights of Valour - The Seven Sprits
kurucham // 2006.03 Kurukuru Chameleon
-lupinsho // 2001.12 Lupin the Third: the Shooting
+lupinsho // 2002.05 Lupin the Third: the Shooting (Rev A)
+lupinshoo // 2001.12 Lupin the Third: the Shooting
luptype // 2002.04 Lupin The Third - The Typing (Rev A)
mamonoro // 2008.07 Mamoru-kun wa Norowarete Shimatta!
manicpnc // 2007.07 Manic Panic Ghosts! (USA)
@@ -29643,6 +29776,7 @@ rumblefp // 2004.02 The Rumble Fish (prototype)
rumblf2p // 2005.01 The Rumble Fish 2 (prototype)
salmankt // 2004.06 Salary Man Kintarou Net Select
samba // 1999.12 Samba de Amigo (Rev B)
+sambaa // 1999.?? Samba de Amigo (Rev A)
samba2k // 2000.12 Samba de Amigo Ver.2000
sambap // 1999.?? Samba de Amigo (prototype)
samsptk // 2005.09 Samurai Spirits Tenkaichi Kenkakuden
@@ -29717,7 +29851,8 @@ vf4tunedd // 2004.10 Virtua Fighter 4 Final Tuned (Rev D)
vfurlong // 2005.03 Net Select Keiba Victory Furlong
virnba // 2000.02 Virtua NBA (USA)
virnbao // 2000.02 Virtua NBA
-virnbap // 2000.02 Virtua NBA (prototype)
+virnbap // 1999.?? Virtua NBA (prototype)
+virnbapa // 1999.11 Virtua NBA (prototype, 15.11)
vonot // 2000.06 Virtual-on Oratorio Tangram M.S.B.S. Ver.5.66 2000 Edition
vs2_2ko // 1999.08 Virtua Striker 2 version 2000
vs2_2k // 1999.08 Virtua Striker 2 version 2000 (Rev C)
@@ -30249,7 +30384,17 @@ svcpcba // 0269 (c) 2003 Playmore / Capcom - JAMMA PCB
98best44 //
neoprint //
npcartv1 //
+npcramen //
+npfpit //
+npmillen //
+npotogib //
nprsp //
+npscv1 //
+npskv //
+npsprg98 //
+npsprgv4 //
+npssr2 //
+npusagif //
@source:neptunp2.cpp
neptunp2 //
@@ -30284,6 +30429,8 @@ mc_dg101
mc_aa2
mc_105te
mc_sp69
+polmega
+silv35
mc_dcat8
mc_dcat8a
pjoyn50
@@ -30447,6 +30594,7 @@ dolmen // (c) 1995
firehawk // (c) 2001 ESD
firehawkv // (c) 2001 ESD
grdnstrm // (c) 1998 Apples Industries license
+grdnstrmau // (c) 1998 (Australia)
grdnstrmg // (c) 1998
grdnstrmj // (c) 1998 (Japan)
grdnstrmk // (c) 1998 (Korea)
@@ -30580,9 +30728,25 @@ pkunwarj // UPL-????? (c) 1985 (Arcade Game TV List - P.9
raiders5 // UPL-85004 (c) 1985
raiders5t // UPL-85004 (c) 1985 Taito license
-@source:novag6502.cpp
+@source:novag_cforte.cpp
cfortea //
cforteb //
+
+@source:novag_delta1.cpp
+ccdelta1 //
+
+@source:novag_diablo.cpp
+diablo68 //
+scorpio68 //
+
+@source:novag_presto.cpp
+nocto //
+npresto //
+
+@source:novag_scon.cpp
+supercon //
+
+@source:novag_sexpert.cpp
sexperta //
sexpertb //
sexpertc //
@@ -30591,18 +30755,6 @@ sfortea //
sfortea1 //
sforteb //
sfortec //
-supercon //
-
-@source:novag68k.cpp
-diablo68 //
-scorpio68 //
-
-@source:novagf8.cpp
-ccdelta1 //
-
-@source:novagmcs48.cpp
-nocto //
-npresto //
@source:nsg6809.cpp
pitchhit //
@@ -30714,7 +30866,8 @@ ondrav //
@source:oneshot.cpp
maddonna // (c) 1995 Tuning
-maddonnb // (c) 1995 Tuning
+komocomo //
+maddonnab // (c) 1995 Tuning
oneshot // no copyright notice
@source:onetwo.cpp
@@ -30926,6 +31079,7 @@ sprglbpg // German bootleg
sprglobp // (c) 1983 Epos Corporation
superabc // hack
superabco // hack
+theglobme // (c) 1983 Magic Electronics
theglobp // (c) 1983 Epos Corporation
titanpac // hack
pacmanfm // bootleg (FAMARE S.A.)
@@ -31248,6 +31402,7 @@ pengo4 // 834-0386 (c) 1982 Sega
pengo5 // 834-0386 (c) 1982 Sega
pengob // bootleg
penta // bootleg
+schick // Microhard
@source:pentagon.cpp
pent1024 //
@@ -32106,6 +32261,7 @@ picno2 // Konami Picno 2 (1993)
3lilpigs //
dumpump //
fidlstix //
+hoopitup //
hoopshot //
jackbean //
piggypas //
@@ -32526,6 +32682,7 @@ breakout // (c) 1976 Atari
pong // (c) 1972 Atari
pongd // (c) 1973 Atari
pongf // (c) 1972 Atari
+rebound //
@source:poolshrk.cpp
poolshrk // 006281 1977/06 [6800]
@@ -32803,22 +32960,22 @@ gametree // (c) 1978 PSE
@source:psikyo.cpp
btlkroad // (c) 1994
-btlkroadk // (c) 1994
+btlkroadk // (c) 1994 (Korea)
gunbird // (c) 1994
-gunbirdj // (c) 1994
-gunbirdk // (c) 1994
-s1945 // (c) 1995
+gunbirdj // (c) 1994 (Japan)
+gunbirdk // (c) 1994 (Korea)
+s1945 // (c) 1995 (Japan)
s1945a // (c) 1995
s1945bl // (c) 1995 (Hong Kong bootleg)
-s1945j // (c) 1995
-s1945jn // (c) 1995
-s1945k // (c) 1995
-s1945n // (c) 1995
+s1945j // (c) 1995 (Japan)
+s1945k // (c) 1995 (Korea)
+s1945n // (c) 1995 (World, unprotected)
+s1945nj // (c) 1995 (Japan, unprotected)
samuraia // (c) 1993 (World)
sngkace // (c) 1993 (Japan)
sngkacea // (c) 1993 (Japan)
-tengai // (c) 1996
-tengaij // (c) 1996
+tengai // (c) 1996 (World)
+tengaij // (c) 1996 (Japan)
@source:psikyo4.cpp
hgkairak // (c) 1998
@@ -33046,7 +33203,15 @@ rabbitjt // (c) 1996 Electronic Arts
@source:rad_eu3a14.cpp
rad_gtg
+rad_rsg
+rad_rsgp
rad_foot
+rad_bb3
+rad_bb3p
+rad_hnt3
+rad_hnt3p
+rad_bask
+rad_baskp
@source:rad_eu3a05.cpp
rad_sinv
@@ -33074,6 +33239,7 @@ raidenkb // (c) bootleg
raident // (c) 1990 Seibu Kaihatsu + Liang HWA Electronics license
raidenu // (c) 1990 Seibu Kaihatsu + Fabtek license
raidenua // (c) 1990 Seibu Kaihatsu + Fabtek license
+raidenub // (c) 1990 Seibu Kaihatsu + Fabtek license
@source:raiden2.cpp
raiden2 // (c) 1993 Seibu Kaihatsu + Fabtek license
@@ -33168,6 +33334,7 @@ rastsagab // B04 (c) 1987 Taito Corporation (Japan)
@source:rastersp.cpp
fbcrazy // 1997
rotr // 1994
+rotra // 1994
@source:ravens.cpp
ravens //
@@ -33223,6 +33390,7 @@ ww3 // M27 (c) 1981
redclash // (c) 1981 Tehkan
redclasha // (c) 1981 Tehkan
redclashk // (c) Kaneko (bootleg?)
+redclashs // (c) Suntronics (licensed?)
zerohour // 8011 (c) Universal
zerohoura // 8011 (c) Universal
zerohouri //
@@ -33963,11 +34131,9 @@ sbrkoutct // 034555-034559 proto ???? [6502]
sbugger // (c) 1981 Game-A-Tron
sbuggera // (c) 1981 Game-A-Tron
-@source:sc1.cpp
-sc1 //
-
@source:sc2.cpp
sc2 //
+sc2a //
@source:scm_500.cpp
scm_500 //
@@ -34111,6 +34277,9 @@ wg3dh // (c) 1996 Atari Games
@source:seattlecmp.cpp
scp300f // Seattle SCP-300F
+@source:sega_beena.cpp
+beena //
+
@source:sega_sawatte.cpp
sawatte //
@@ -34287,6 +34456,7 @@ dumpmtmt // (c) 1986 (Japan)
fantzone // (c) 1986 (Unprotected Rev A)
fantzone1 // (c) 1986 (Unprotected)
fantzonep // (c) 1986 (NEC 0317-5000, encrypted)
+fantzonee //
fantzonepr //
mjleague // (c) 1985
passsht16a // (c) 1988 (FD1094)
@@ -34410,6 +34580,7 @@ passshtj // (c) 1988 (FD1094)
passshtjd //
riotcity // (c) 1991 Sega / Westone (Unprotected)
ryukyu // (c) 1990 (FD1094)
+ryukyua // (c) 1990 (FD1094)
ryukyud //
sdib // (c) 1987 (FD1089A)
sdibl // (c) 1987 bootleg
@@ -34543,6 +34714,7 @@ arabfgtu // 1992.03 Arabian Fight (US)
arescue // 1992.03 Air Rescue (World)
arescuej // 1992.04 Air Rescue (Japan)
arescueu // 1992.03 Air Rescue (US)
+as1 // 1993.?? AS-1
brival // 1993.?? Burning Rival (World)
brivalj // 1993.08 Burning Rival (Japan)
darkedge // 1993.?? Dark Edge (World)
@@ -34599,6 +34771,7 @@ dinoki25 //
dinoking // 2005.09 Kodai Ouja Kyouryuu King / Ancient Ruler Dinosaur King
dinokior //
loveber3 //
+loveber3cn //
lovebero //
lovebery // 2004.10 Oshare Majo Love and Berry / Fashionable Witch Love and Berry
ochaken //
@@ -34704,6 +34877,7 @@ rdft2it // (c) 1997 Seibu Kaihatsu
rdft2j // (c) 1997 Seibu Kaihatsu
rdft2ja // (c) 1997 Seibu Kaihatsu
rdft2jb // (c) 1997 Seibu Kaihatsu
+rdft2jc // (c) 1997 Seibu Kaihatsu
rdft2t // (c) 1997 Seibu Kaihatsu
rdft2u // (c) 1997 Seibu Kaihatsu (Fabtek license)
rdft2us // (c) 1997 Seibu Kaihatsu (Fabtek license)
@@ -34812,6 +34986,7 @@ magspeed // (c) 1994 Allumer
metafox // UP (c) 1989 + Jordan, Romstar or Taito license (DSW)
msgundam // (c) 1993 Banpresto
msgundam1 // (c) 1993 Banpresto
+msgundamb // bootleg
neobattl // (c) 1992 Banpresto / Sotsu Agency. Sunrise
oisipuzl // (c) 1993 SunSoft / Atlus
orbs // (c) 1994 American Sammy
@@ -34859,6 +35034,7 @@ funcube3 // (c) 2001 Namco
funcube4 // (c) 2001 Namco
funcube5 // (c) 2002 Namco
grdians // (c) 1995 Banpresto
+grdiansa // (c) 1995 Banpresto
gundamex // (c) 1994 Banpresto
mj4simai // (c) 1996 Maboroshi Ware
myangel // (c) 1996 Namco
@@ -35390,6 +35566,9 @@ slapshot // D71 (c) 1994 Taito Corporation (Japan)
@source:slc1.cpp
slc1 //
+@source:slc1a.cpp
+slc1a
+
@source:sleic.cpp
bikerace //
bikerace2 //
@@ -35450,6 +35629,7 @@ snespal // Nintendo Super Nintendo PAL
@source:snesb.cpp
denseib // bootleg
+denseib2 // bootleg
endless // bootleg
ffight2b // bootleg
iron // bootleg
@@ -35617,6 +35797,16 @@ sorcerer // Sorcerer
sorcerer2 // monitor 1.1 1979
sorcererd // Sorcerer with floppies
+@source:storio.cpp
+vreader // (c) 2011 V.Tech
+vreadercaen // (c) 2011 V.Tech
+vreadercafr // (c) 2011 V.Tech
+storio // (c) 2011 V.Tech
+storiode // (c) 2011 V.Tech
+storioes // (c) 2011 V.Tech
+storiofr // (c) 2011 V.Tech
+storionl // (c) 2011 V.Tech
+
@source:sothello.cpp
sothello // (c) 1986 Success / Fujiwara.
@@ -36218,7 +36408,12 @@ humlan // (c) 2001 Subsino & Truemax
mtrain // (c) 1996 Subsino
new2001 // (c) 2000 Subsino
ptrain // (c) 1999 Subsino
+queenbee // (c) 2001 American Alpha
+queenbeeb // (c) 2001 Subsino
+queenbeei // (c) 2001 Subsino
+queenbeesa // (c) 2001 Subsino
saklove // (c) 1998 Subsino
+squeenb // (c) 2002 Subsino
wtrnymph // (c) 1996 Subsino
xplan // (c) 2006 Subsino
xtrain // (c) 1999 Subsino
@@ -36376,6 +36571,7 @@ galpani4j // 1996.09 (c) 1996 Kaneko (Japan)
galpani4k // 1996.09 (c) 1996 Kaneko (Korea)
galpanidx // 1996.09 (c) 1996 Kaneko (Asia)
galpanis // 1997.04 (c) 1997 Kaneko (Europe)
+galpanisa // 1997.04 (c) 1997 Kaneko (Asia)
galpanise // 1997.04 (c) 1997 Kaneko (Europe)
galpanisj // 1997.04 (c) 1997 Kaneko (Japan)
galpanisk // 1997.04 (c) 1997 Kaneko (Korea)
@@ -36913,6 +37109,7 @@ contcircu // B33 (c) 1987 Taito America Corporation (US)
contcircua // B33 (c) 1987 Taito America Corporation (US)
dblaxle // C78 (c) 1991 Taito America Corporation (US)
dblaxleu // C78 (c) 1991 Taito America Corporation (US)
+dblaxleul // C78 (c) 1991 Taito America Corporation (US)
enforce // B58 (c) 1988 Taito Corporation Japan (World)
enforcej // B58 (c) 1988 Taito Corporation (Japan)
enforceja // B58 (c) 1988 Taito Corporation (Japan)
@@ -37157,6 +37354,7 @@ spcteam //
backfirt // bootleg [(c) 1988 Tecmo]
gemini // (c) 1987 Tecmo
geminib // bootleg
+geminij // (c) 1987 Tecmo
rygar // 6002 - (c) 1986 Tecmo
rygar2 // 6002 - (c) 1986 Tecmo
rygar3 // 6002 - (c) 1986 Tecmo
@@ -37365,6 +37563,8 @@ ti83 // 1996 TI-83 (Z80 6 MHz)
ti83p // 1999 TI-83 Plus (Boot Code 1.00) (Z80 6 MHz)
ti83pb // 20?? TI-83 Plus (Bootleg) (Z80 6 MHz)
ti83pse // 2001 TI-83 Plus Silver Edition (Boot Code 1.00)
+ti83pseb // 20?? TI-83 Plus Silver Edition (Bootleg)
+ti83pcev15 //
ti84p // 2004 TI-84 Plus (Boot Code 1.00)
ti84pv2 // 200? TI-84 Plus (Boot Code 1.02)
ti84pv3 // 2011 TI-84 Plus (Boot Code 1.03)
@@ -37376,6 +37576,7 @@ ti84pob // 201? TI-84 Plus Orion (Bootleg)
ti84pov2 // 201? TI-84 Plus Orion (Boot Code 1.02)
ti84pov3 // 201? TI-84 Plus Orion (Boot Code 1.03)
ti84pcse // 20?? TI-84 Plus Color Silver Edition (Boot Code 4.0)
+ti84pcsev2 //
ti84pce // 2015 TI-84 Plus Color Edition (Boot Code 5.00)
ti84pcev15 // 2016 TI-84 Plus Color Edition (Boot Code 5.15)
ti84pcev30 // 2017 TI-84 Plus Color Edition (Boot Code 5.30)
@@ -37496,6 +37697,10 @@ timepltc // GX393 (c) 1982 + Centuri license
timetrv // (c) 1991.10 Virtual Image Productions
timetrv2 // (c) 1991.10 Virtual Image Productions
+@source:titan_soc.cpp
+megadri4
+megadri4a
+
@source:timex.cpp
tc2048 // 198? TC2048
ts2068 // 1983 TS2068
@@ -37713,6 +37918,7 @@ outzonecv // TP-O18 (c) 1990 Toaplan (TP-015 conversion)
rallybik // B45 / TP-O12 (c) 1988 Taito
samesame // TP-O17 (c) 1989 Toaplan
samesame2 // TP-O17 (c) 1989 Toaplan
+samesamecn // TP-O17 (c) 1990 Toaplan
samesamenh // hack
truxton // B65 / TP-O13B (c) 1988 Taito
vimana // TP-O19 (c) 1991 Toaplan (+ Tecmo license when set to Japan)
@@ -37891,10 +38097,12 @@ avalns12 // 2004.03 The Key Of Avalon 1.20 - Summon The N
avalns13 // 2004.06.08 The Key Of Avalon 1.30 - Chaotic Sabbat (server) (Rev C)
avalon20 // 2004.11.02 The Key Of Avalon 2.0 - Eutaxy Commandment (client) (Rev B)
avalonc // 2003.11 The Key Of Avalon: The Wizard Master (client) (Rev G)
+avalonca // 2003.07 The Key Of Avalon: The Wizard Master (client) (Rev A)
avalonce // 2003.08 The Key Of Avalon: The Wizard Master (client) (Rev E)
avaloncc // 2003.07 The Key Of Avalon: The Wizard Master (client) (Rev C)
avaloncf // 2003.09 The Key Of Avalon: The Wizard Master (client) (Rev F)
avalons // 2003.11 The Key Of Avalon: The Wizard Master (server) (Rev G)
+avalonsa // 2003.07 The Key Of Avalon: The Wizard Master (server) (Rev A)
avalonsc // 2003.07 The Key Of Avalon: The Wizard Master (server) (Rev C)
avalonse // 2003.08 The Key Of Avalon: The Wizard Master (server) (Rev E)
avalonsf // 2003.09 The Key Of Avalon: The Wizard Master (server) (Rev F)
@@ -37904,6 +38112,7 @@ avalnc25 // 2005.08 The Key Of Avalon 2.5 - War of the Ke
avalnc25a // 2005.05 The Key Of Avalon 2.5 - War of the Key (client) (Rev A)
fzeroax // 2003.12 F-Zero AX (Rev E)
fzeroaxc // 2003.06.11 F-Zero AX (Rev C)
+fzeroaxd // 2003.06.28 F-Zero AX (Rev D)
fzeroaxm // 2003.09 F-Zero AX Monster Ride
gekpurya // 2003.10 Gekitou Pro Yakyuu Mizushima Shinji All Stars vs. Pro Yakyuu (Rev C)
gekpuryb // 2003.10 Gekitou Pro Yakyuu Mizushima Shinji All Stars vs. Pro Yakyuu (Rev B)
@@ -37915,16 +38124,24 @@ tfupdate // 2004.?? Triforce GDROM Boot Update
triforce // 2002.?? Triforce BIOS
vs2002ex // 2002.07.30 Virtua Striker 2002 (Export)
vs2002j // 2002.10 Virtua Striker 2002 (Japan)
-vs4 // 2004.12.02 Virtua Striker 4 (Export) (GDT-0015)
-vs4e // 2004.12.03 Virtua Striker 4 (Export) (GDT-0014)
+vs2002t3 // 2004.03 Virtua Striker 2002 (Type 3)
+vs4 // 2005.04.11 Virtua Striker 4 (Export) (GDT-0015A)
+vs4o // 2004.12.02 Virtua Striker 4 (Export) (GDT-0015)
+vs4e // 2005.05.23 Virtua Striker 4 (Asia) (GDT-0014B)
+vs4eo // 2004.12.03 Virtua Striker 4 (Asia) (GDT-0014)
vs42006b // 2006.05 Virtua Striker 4 Ver.2006 (Japan) (Rev B)
vs42006 // 2006.05 Virtua Striker 4 Ver.2006 (Japan) (Rev D)
vs42k6ex // 2006.01.31 Virtua Striker 4 Ver.2006 (Export)
vs4j // 2004.10 Virtua Striker 4 (Japan) (Rev E)
+vs4jc // 2004.09 Virtua Striker 4 (Japan) (Rev C)
@source:triplhnt.cpp
triplhnt // 008422-008791 1977/04 [6800]
+@source:trkfldch.cpp
+trkfldch // (c) 2007 Konami
+my1stddr // (c) 2006 Konami
+
@source:trs80.cpp
ht108064 // Hradstechnika Szvetkezet HT-1080Z/64
ht1080z // Hradstechnika Szvetkezet HT-1080Z
@@ -37932,6 +38149,7 @@ ht1080z2 // Hradstechnika Szvetkezet HT-1080Z Series II
lnw80 // LNW Research LNW-80
radionic // Radionic
sys80 // EACA System 80
+sys80p // EACA System 80
trs80 // TRS-80 Model I - Level I BASIC
trs80l2 // TRS-80 Model I - Level II BASIC
@@ -38228,6 +38446,9 @@ uts20 //
@source:unkhorse.cpp
unkhorse //
+@source:unkpoker.cpp
+unkpoker //
+
@source:upscope.cpp
upscope // (c) 1986 Grand products
@@ -38533,10 +38754,32 @@ vigilantd // (c) 1988 (Japan Rev D)
vigilantg // (c) 1988 (US Rev G)
vigilanto // (c) 1988 (US)
+@source:spg110.cpp
+jak_capb //
+jak_spdmo //
+
@source:vii.cpp
-batmantv // The Batman, 2004
+jak_batm // The Batman, 2004
+jak_wall //
+jak_wwe //
+jak_fan4 //
+jak_just //
+jak_dora //
+jak_dorr //
+jak_disn //
+jak_disf //
+jak_disp //
+jak_sith //
+jak_sdoo //
+jak_dbz //
+jak_mpac //
+jak_wof //
+jak_spdm //
+jak_pooh //
+jak_nick //
+jak_sbfc //
+lexizeus // Lexibook
vii // KenSingTon / Jungle Soft / Siatronics Vii
-walle //
wrlshunt // Wireless: Hunting Video Game System
wirels60 // Wireless 60
wlsair60 // Wireless Air 60
@@ -38546,12 +38789,22 @@ rad_skat //
rad_skatp //
rad_sktv //
rad_crik //
+rad_fb2 //
+mattelcs //
+dreamlif //
+smartfp //
+icanguit //
+icanpian //
@source:vsmile.cpp
vsmile //
-vsmileb //
vsmilef //
vsmileg //
+vsmilem //
+
+@source:vsmileb.cpp
+vsmileb //
+vsmilebsw //
@source:vsmilepro.cpp
vsmilpro
@@ -39454,6 +39707,7 @@ sttng_g7 //
sttng_l1 //
sttng_l2 //
sttng_l3 //
+sttng_l5 //
sttng_l7 //
sttng_p4 //
sttng_p5 //
@@ -39626,20 +39880,27 @@ wwfsstaru4 // TA-0024 (c) 1989 (US)
@source:wy100.cpp
wy100 // WY-100
+@source:wy150.cpp
+wy120 // WY-120
+wy150 // WY-150
+wy160 // WY-160
+
+@source:wy30p.cpp
+wy30p // WY-30+
+
@source:wy50.cpp
wy50 // WY-50
wy75 // WY-75
-@source:wy85.cpp
-wy85 // WY-85
-
-@source:wyse.cpp
+@source:wy55.cpp
wy55 // WY-55
+
+@source:wy60.cpp
wy60 // WY-60
-wy120 // WY-120
-wy150 // WY-150
-wy160 // WY-160
-wy30p // WY-30+
+wy60a // WY-60
+
+@source:wy85.cpp
+wy85 // WY-85
@source:wyvernf0.cpp
wyvernf0 // A39 (c) 1985 Taito Corporation (Japan)
@@ -39677,32 +39938,71 @@ rad_ping //
rad_pingp //
rad_mtrk //
rad_mtrkp //
+rad_bb //
rad_bb2 //
rad_box //
rad_boxp //
rad_crdn //
rad_crdnp //
rad_opus //
+rad_hnt //
+rad_hnt2 //
rad_bass //
rad_bassp //
rad_snow //
rad_snowp //
rad_madf //
rad_fb //
+rad_socr //
+epo_epp //
+epo_epp3 //
epo_efdx //
+epo_ebox //
+epo_sdb //
+epo_guru //
+epo_dmon //
rad_rh //
+rad_ssx //
+rad_ssxp //
+rad_sbw //
+rad_bdp //
has_wamg //
+ltv_tam //
+tak_geig //
+ban_onep //
ekara //
ekaraa //
ekaraj //
+ekarag //
+ekaraphs //
+epitch //
+ekaramix //
ddrfammt //
popira //
+popira2 //
taikodp //
-xavtenni //
+jpopira //
+evio //
ttv_sw //
ttv_lotr //
ttv_mx //
drgqst //
+tmy_thom //
+xavtenni //
+xavbaseb //
+xavbassf //
+xavbowl //
+xavbox //
+xavjmat //
+xavmusic //
+domfitex //
+domfitch //
+domdance //
+
+@source:xavix2.cpp
+ltv_naru //
+domfitad //
+dombikec //
@source:xbox.cpp
xbox //
@@ -39733,6 +40033,7 @@ xmena // GX065 (c) 1992 (Asia)
xmenaa // GX065 (c) 1992 (Asia)
xmene // GX065 (c) 1992 (World)
xmenj // GX065 (c) 1992 (Japan)
+xmenja // GX065 (c) 1992 (Japan)
@source:xor100.cpp
xor100 //
@@ -39768,8 +40069,11 @@ yiear // GX407 (c) 1985
yiear2 // GX407 (c) 1985
@source:ymmu100.cpp
+mu50 // 1995 MU-50
+mu80 // 1994 MU-80
mu100 // 1997 MU-100
mu100r // 1997 MU-100 Rackable version
+vl70 // 1996 VL70-m
@source:yunsun16.cpp
bombkick // (c) 1998 Yun Sung
@@ -40104,6 +40408,13 @@ zx80 // 1980 Sinclair ZX-80
zx81 // 1981 Sinclair ZX-81
zx97 //
+@source:testpat.cpp
+tp1983
+tp1985
+
+@source:palestra.cpp
+palestra
+
@source:vgmplay.cpp
vgmplay
diff --git a/src/mame/mess.flt b/src/mame/mess.flt
index 537c9960a4b..675f1b05dc3 100644
--- a/src/mame/mess.flt
+++ b/src/mame/mess.flt
@@ -16,10 +16,15 @@ ac1.cpp
accomm.cpp
acd.cpp
aceex.cpp
+aci_boris.cpp
+aci_borisdpl.cpp
acrnsys1.cpp
acrnsys.cpp
acvirus.cpp
adam.cpp
+adm23.cpp
+adm31.cpp
+adm36.cpp
advision.cpp
agat.cpp
aim65.cpp
@@ -78,6 +83,7 @@ att4425.cpp
att630.cpp
attache.cpp
aussiebyte.cpp
+ave_arb.cpp
avigo.cpp
ax20.cpp
b16.cpp
@@ -90,6 +96,7 @@ bbcbc.cpp
bcs3.cpp
bebox.cpp
beehive.cpp
+bert.cpp
besta.cpp
beta.cpp
bigbord2.cpp
@@ -108,6 +115,7 @@ bw12.cpp
bw2.cpp
c10.cpp
c128.cpp
+c2color.cpp
c64.cpp
c64dtv.cpp
c65.cpp
@@ -134,8 +142,9 @@ chessmst.cpp
chesstrv.cpp
cit101.cpp
cit220.cpp
-ckz80.cpp
+cking_master.cpp
clcd.cpp
+clickstart.cpp
cm1800.cpp
cmi.cpp
cms.cpp
@@ -158,7 +167,7 @@ crimson.cpp
crvision.cpp
ct486.cpp
cvicny.cpp
-cxgz80.cpp
+cxg_ch2001.cpp
cxhumax.cpp
cybiko.cpp
cz101.cpp
@@ -234,10 +243,25 @@ fb01.cpp
fc100.cpp
fccpu20.cpp
fccpu30.cpp
-fidel6502.cpp
-fidel68k.cpp
-fidelmcs48.cpp
-fidelz80.cpp
+fidel_as12.cpp
+fidel_card.cpp
+fidel_cc1.cpp
+fidel_cc10.cpp
+fidel_cc7.cpp
+fidel_chesster.cpp
+fidel_csc.cpp
+fidel_dames.cpp
+fidel_desdis.cpp
+fidel_eag68k.cpp
+fidel_elite.cpp
+fidel_excel.cpp
+fidel_phantom.cpp
+fidel_sc12.cpp
+fidel_sc6.cpp
+fidel_sc8.cpp
+fidel_sc9.cpp
+fidel_vcc.cpp
+fidel_vsc.cpp
fk1.cpp
fm7.cpp
fmtowns.cpp
@@ -254,6 +278,7 @@ gamate.cpp
gamecom.cpp
gamecube.cpp
gameking.cpp
+gamemachine.cpp
gamepock.cpp
gb.cpp
gba.cpp
@@ -330,6 +355,7 @@ indy_indigo2.cpp
instruct.cpp
inteladv.cpp
intellec4.cpp
+intellect02.cpp
interact.cpp
interpro.cpp
intv.cpp
@@ -350,6 +376,7 @@ itt1700.cpp
itt3030.cpp
jade.cpp
jazz.cpp
+jensen.cpp
jonos.cpp
jr100.cpp
jr200.cpp
@@ -374,6 +401,7 @@ laser3k.cpp
lb186.cpp
lc80.cpp
lcmate2.cpp
+leapfrog_leappad.cpp
leapster.cpp
learnwin.cpp
lee1214.cpp
@@ -421,6 +449,7 @@ micral.cpp
micro20.cpp
microdec.cpp
microkit.cpp
+micromon.cpp
micronic.cpp
microtan.cpp
microterm.cpp
@@ -499,10 +528,12 @@ ngen.cpp
ngp.cpp
nokia_3310.cpp
notetaker.cpp
-novag6502.cpp
-novag68k.cpp
-novagf8.cpp
-novagmcs48.cpp
+novag_cforte.cpp
+novag_delta1.cpp
+novag_diablo.cpp
+novag_presto.cpp
+novag_scon.cpp
+novag_sexpert.cpp
o2.cpp
ob68k1a.cpp
octane.cpp
@@ -524,6 +555,7 @@ p2000t.cpp
p8k.cpp
palm.cpp
palmz22.cpp
+palestra.cpp
partner.cpp
paso1600.cpp
pasogo.cpp
@@ -654,7 +686,6 @@ saturn.cpp
savia84.cpp
sbc6510.cpp
sbrain.cpp
-sc1.cpp
sc2.cpp
scopus.cpp
scorpion.cpp
@@ -664,6 +695,7 @@ sdk80.cpp
sdk85.cpp
sdk86.cpp
seattlecmp.cpp
+sega_beena.cpp
sega_sawatte.cpp
segapico.cpp
segapm.cpp
@@ -675,6 +707,7 @@ si5500.cpp
sitcom.cpp
sk1.cpp
slc1.cpp
+slc1a.cpp
slicer.cpp
sm1800.cpp
sm7238.cpp
@@ -691,10 +724,12 @@ spec128.cpp
special.cpp
specpls3.cpp
spectrum.cpp
+spg110.cpp
squale.cpp
ssem.cpp
ssystem3.cpp
st17xx.cpp
+storio.cpp
stratos.cpp
studio2.cpp
sun1.cpp
@@ -735,6 +770,7 @@ terco.cpp
terminal.cpp
test_t400.cpp
testconsole.cpp
+testpat.cpp
textelcomp.cpp
tg100.cpp
thomson.cpp
@@ -751,6 +787,7 @@ ti990_10.cpp
ti990_4.cpp
ticalc1x.cpp
tiki100.cpp
+titan_soc.cpp
tim011.cpp
tim100.cpp
timex.cpp
@@ -768,6 +805,7 @@ tr175.cpp
tr606.cpp
tranz330.cpp
tricep.cpp
+trkfldch.cpp
trs80.cpp
trs80dt1.cpp
trs80m2.cpp
@@ -826,6 +864,7 @@ votrtnt.cpp
vp415.cpp
vp60.cpp
vsmile.cpp
+vsmileb.cpp
vsmilepro.cpp
vt100.cpp
vt220.cpp
@@ -842,14 +881,18 @@ wangpc.cpp
wicat.cpp
wswan.cpp
wy100.cpp
+wy150.cpp
+wy30p.cpp
wy50.cpp
+wy55.cpp
+wy60.cpp
wy85.cpp
-wyse.cpp
x07.cpp
x1.cpp
x1twin.cpp
x68k.cpp
xavix.cpp
+xavix2.cpp
xbox.cpp
xerox820.cpp
xor100.cpp
diff --git a/src/mame/nl.lst b/src/mame/nl.lst
index 694354892fa..63b48cbd058 100644
--- a/src/mame/nl.lst
+++ b/src/mame/nl.lst
@@ -20,6 +20,9 @@
1942p // prototype
1942h // hack (Two Bit Score?)
+@source:gamemachine.cpp
+2001tgm //
+
// hazeltin.cpp
hazl1500 // Hazeltine 1500 (c) 1977
@@ -83,7 +86,7 @@ stuntcyc // (c) 1976 Atari
// Atari TTL Missing Rom Dumps
//astrotrf // (c) 1975 Atari
//lemans // (c) 1974 Atari
-//gtrak10 // (c) 1974 Atari / Kee
+gtrak10 // (c) 1974 Atari / Kee
//gtrak20 // (c) 1976 Atari / Kee
//qwak // (c) 1974 Atari
// Atari 100% TTL
@@ -98,7 +101,6 @@ stuntcyc // (c) 1976 Atari
//pinpong // (c) 1974 Atari
//pursuit // (c) 1975 Atari / Kee
//quadpong // (c) 1974 Atari
-//rebound // (c) 1974 Atari / Kee
//spacrace // (c) 1973 Atari
//touchme // (c) 1974 Atari
//worldcup // (c) 1974 Atari
@@ -108,6 +110,7 @@ breakout // (c) 1976 Atari
pong // (c) 1972 Atari
pongd // (c) 1973 Atari
pongf // (c) 1972 Atari
+rebound // (c) 1974 Atari
//coupedav // (c) 1973 Atari France
//pongbarl // (c) 1973 Atari
//cktpong // (c) 1974 Atari / National Entertainment Co.
diff --git a/src/mame/video/20pacgal.cpp b/src/mame/video/20pacgal.cpp
index d8eef7e0c6d..f087ed59822 100644
--- a/src/mame/video/20pacgal.cpp
+++ b/src/mame/video/20pacgal.cpp
@@ -445,14 +445,15 @@ void _20pacgal_state::video_start()
*
*************************************/
-MACHINE_CONFIG_START(_20pacgal_state::_20pacgal_video)
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(SCREEN_WIDTH, SCREEN_HEIGHT)
- MCFG_SCREEN_VISIBLE_AREA(0, SCREEN_WIDTH - 1, 0, SCREEN_HEIGHT - 1)
- MCFG_SCREEN_UPDATE_DRIVER(_20pacgal_state, screen_update_20pacgal)
- MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE(*this, _20pacgal_state, vblank_irq))
+void _20pacgal_state::_20pacgal_video(machine_config &config)
+{
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(SCREEN_WIDTH, SCREEN_HEIGHT);
+ screen.set_visarea(0, SCREEN_WIDTH - 1, 0, SCREEN_HEIGHT - 1);
+ screen.set_screen_update(FUNC(_20pacgal_state::screen_update_20pacgal));
+ screen.screen_vblank().set(FUNC(_20pacgal_state::vblank_irq));
PALETTE(config, m_palette, FUNC(_20pacgal_state::starpal_init), NUM_PENS + NUM_PENS);
-MACHINE_CONFIG_END
+}
diff --git a/src/mame/video/3dom2_te.cpp b/src/mame/video/3dom2_te.cpp
index bd95c0fac86..d39836a40ec 100644
--- a/src/mame/video/3dom2_te.cpp
+++ b/src/mame/video/3dom2_te.cpp
@@ -3053,9 +3053,9 @@ uint8_t m2_te_device::alu_calc(uint16_t a, uint16_t b)
switch (j)
{
case 0: cinv |= (cntl & 1); break;
- case 1: cinv |= (cntl & 2) && 1; break;
- case 2: cinv |= (cntl & 4) && 1; break;
- case 3: cinv |= (cntl & 8) && 1; break;
+ case 1: cinv |= ((cntl & 2) != 0); break;
+ case 2: cinv |= ((cntl & 4) != 0); break;
+ case 3: cinv |= ((cntl & 8) != 0); break;
}
cinv <<= 1;
diff --git a/src/mame/video/733_asr.cpp b/src/mame/video/733_asr.cpp
index 59bfa3bc76f..80995c2f415 100644
--- a/src/mame/video/733_asr.cpp
+++ b/src/mame/video/733_asr.cpp
@@ -315,7 +315,7 @@ READ8_MEMBER( asr733_device::cru_r )
{
int reply = 0;
- switch (offset)
+ switch (offset >> 3)
{
case 0:
/* receive buffer */
@@ -328,7 +328,7 @@ READ8_MEMBER( asr733_device::cru_r )
break;
}
- return reply;
+ return BIT(reply, offset & 7);
}
/*
@@ -777,15 +777,15 @@ ioport_constructor asr733_device::device_input_ports() const
//-------------------------------------------------
-MACHINE_CONFIG_START(asr733_device::device_add_mconfig)
+void asr733_device::device_add_mconfig(machine_config &config)
+{
PALETTE(config, "palette", palette_device::MONOCHROME_INVERTED);
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */
- MCFG_SCREEN_UPDATE_DEVICE(DEVICE_SELF, asr733_device, screen_update)
-
- MCFG_SCREEN_SIZE(640, 480)
- MCFG_SCREEN_VISIBLE_AREA(0, 640-1, 0, 480-1)
- MCFG_SCREEN_PALETTE("palette")
-MACHINE_CONFIG_END
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_refresh_hz(60);
+ m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */
+ m_screen->set_screen_update(FUNC(asr733_device::screen_update));
+ m_screen->set_size(640, 480);
+ m_screen->set_visarea(0, 640-1, 0, 480-1);
+ m_screen->set_palette("palette");
+}
diff --git a/src/mame/video/911_vdt.cpp b/src/mame/video/911_vdt.cpp
index 1290e3bea51..694fdff5a2a 100644
--- a/src/mame/video/911_vdt.cpp
+++ b/src/mame/video/911_vdt.cpp
@@ -280,11 +280,11 @@ READ8_MEMBER( vdt911_device::cru_r )
{
int reply=0;
- offset &= 0x1;
+ offset &= 0xf;
if (!m_word_select)
{ /* select word 0 */
- switch (offset)
+ switch (offset >> 3)
{
case 0:
reply = m_display_RAM[m_cursor_address];
@@ -299,7 +299,7 @@ READ8_MEMBER( vdt911_device::cru_r )
}
else
{ /* select word 1 */
- switch (offset)
+ switch (offset >> 3)
{
case 0:
reply = m_cursor_address & 0xff;
@@ -321,7 +321,7 @@ READ8_MEMBER( vdt911_device::cru_r )
}
}
- return reply;
+ return BIT(reply, offset & 3);
}
/*
@@ -794,18 +794,18 @@ INPUT_PORTS_END
// device_add_mconfig - add device configuration
//-------------------------------------------------
-MACHINE_CONFIG_START(vdt911_device::device_add_mconfig)
- screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
- screen.set_raw(11.004_MHz_XTAL, 700, 0, 560, 262, 0, 240);
- screen.set_screen_update(FUNC(vdt911_device::screen_update));
- screen.set_palette("palette");
+void vdt911_device::device_add_mconfig(machine_config &config)
+{
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_raw(11.004_MHz_XTAL, 700, 0, 560, 262, 0, 240);
+ m_screen->set_screen_update(FUNC(vdt911_device::screen_update));
+ m_screen->set_palette("palette");
SPEAKER(config, "speaker").front_center();
- MCFG_DEVICE_ADD("beeper", BEEP, 3250)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 0.50)
+ BEEP(config, m_beeper, 3250).add_route(ALL_OUTPUTS, "speaker", 0.50);
PALETTE(config, "palette", FUNC(vdt911_device::vdt911_palette), ARRAY_LENGTH(vdt911_pens), ARRAY_LENGTH(vdt911_colors));
-MACHINE_CONFIG_END
+}
ioport_constructor vdt911_device::device_input_ports() const
{
diff --git a/src/mame/video/abc1600.cpp b/src/mame/video/abc1600.cpp
index 5fa0fa95a9f..d40c864ad74 100644
--- a/src/mame/video/abc1600.cpp
+++ b/src/mame/video/abc1600.cpp
@@ -199,12 +199,13 @@ MC6845_ON_UPDATE_ADDR_CHANGED( abc1600_mover_device::crtc_update )
// device_add_mconfig - add device configuration
//-------------------------------------------------
-MACHINE_CONFIG_START(abc1600_mover_device::device_add_mconfig)
+void abc1600_mover_device::device_add_mconfig(machine_config &config)
+{
config.set_default_layout(layout_abc1600);
- MCFG_SCREEN_ADD_MONOCHROME(SCREEN_TAG, RASTER, rgb_t::green())
- MCFG_SCREEN_UPDATE_DRIVER(abc1600_mover_device, screen_update)
- MCFG_SCREEN_RAW_PARAMS(XTAL(64'000'000), 0x3e0, 0, 0x300, 0x433, 0, 0x400)
+ screen_device &screen(SCREEN(config, SCREEN_TAG, SCREEN_TYPE_RASTER, rgb_t::green()));
+ screen.set_screen_update(FUNC(abc1600_mover_device::screen_update));
+ screen.set_raw(XTAL(64'000'000), 0x3e0, 0, 0x300, 0x433, 0, 0x400);
PALETTE(config, m_palette, palette_device::MONOCHROME);
@@ -214,7 +215,7 @@ MACHINE_CONFIG_START(abc1600_mover_device::device_add_mconfig)
m_crtc->set_char_width(32);
m_crtc->set_update_row_callback(FUNC(abc1600_mover_device::crtc_update_row), this);
m_crtc->set_on_update_addr_change_callback(FUNC(abc1600_mover_device::crtc_update), this);
-MACHINE_CONFIG_END
+}
//**************************************************************************
diff --git a/src/mame/video/abc80.cpp b/src/mame/video/abc80.cpp
index bc6768223da..5aa828894cf 100644
--- a/src/mame/video/abc80.cpp
+++ b/src/mame/video/abc80.cpp
@@ -189,15 +189,15 @@ uint32_t abc80_state::screen_update(screen_device &screen, bitmap_rgb32 &bitmap,
//-------------------------------------------------
-// MACHINE_CONFIG_START( abc80_video )
+// machine_config( abc80_video )
//-------------------------------------------------
-MACHINE_CONFIG_START(abc80_state::abc80_video)
- MCFG_SCREEN_ADD(SCREEN_TAG, RASTER)
- MCFG_SCREEN_UPDATE_DRIVER(abc80_state, screen_update)
-
- MCFG_SCREEN_RAW_PARAMS(XTAL(11'980'800)/2, ABC80_HTOTAL, ABC80_HBEND, ABC80_HBSTART, ABC80_VTOTAL, ABC80_VBEND, ABC80_VBSTART)
+void abc80_state::abc80_video(machine_config &config)
+{
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_screen_update(FUNC(abc80_state::screen_update));
+ m_screen->set_raw(XTAL(11'980'800)/2, ABC80_HTOTAL, ABC80_HBEND, ABC80_HBSTART, ABC80_VTOTAL, ABC80_VBEND, ABC80_VBSTART);
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_abc80)
+ GFXDECODE(config, "gfxdecode", m_palette, gfx_abc80);
PALETTE(config, m_palette, palette_device::MONOCHROME);
-MACHINE_CONFIG_END
+}
diff --git a/src/mame/video/abc800.cpp b/src/mame/video/abc800.cpp
index eb8286e58ea..e03bcf19c81 100644
--- a/src/mame/video/abc800.cpp
+++ b/src/mame/video/abc800.cpp
@@ -153,23 +153,24 @@ void abc800c_state::abc800c_palette(palette_device &palette) const
//-------------------------------------------------
-// MACHINE_CONFIG_START( abc800c_video )
+// machine_config( abc800c_video )
//-------------------------------------------------
-MACHINE_CONFIG_START(abc800c_state::abc800c_video)
- MCFG_SCREEN_ADD(SCREEN_TAG, RASTER)
- MCFG_SCREEN_UPDATE_DRIVER(abc800c_state, screen_update)
- MCFG_SCREEN_REFRESH_RATE(50)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500))
- MCFG_SCREEN_SIZE(480, 480)
- MCFG_SCREEN_VISIBLE_AREA(0, 480-1, 0, 480-1)
+void abc800c_state::abc800c_video(machine_config &config)
+{
+ screen_device &screen(SCREEN(config, SCREEN_TAG, SCREEN_TYPE_RASTER));
+ screen.set_screen_update(FUNC(abc800c_state::screen_update));
+ screen.set_refresh_hz(50);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500));
+ screen.set_size(480, 480);
+ screen.set_visarea(0, 480-1, 0, 480-1);
PALETTE(config, m_palette, FUNC(abc800c_state::abc800c_palette), 8);
- MCFG_DEVICE_ADD(SAA5052_TAG, SAA5052, XTAL(12'000'000)/2)
- MCFG_SAA5050_D_CALLBACK(READ8(*this, abc800c_state, char_ram_r))
- MCFG_SAA5050_SCREEN_SIZE(40, 24, 40)
-MACHINE_CONFIG_END
+ SAA5052(config, m_trom, XTAL(12'000'000)/2);
+ m_trom->d_cb().set(FUNC(abc800c_state::char_ram_r));
+ m_trom->set_screen_size(40, 24, 40);
+}
@@ -273,10 +274,11 @@ uint32_t abc800m_state::screen_update(screen_device &screen, bitmap_rgb32 &bitma
//-------------------------------------------------
-// MACHINE_CONFIG_START( abc800m_video )
+// machine_config( abc800m_video )
//-------------------------------------------------
-MACHINE_CONFIG_START(abc800m_state::abc800m_video)
+void abc800m_state::abc800m_video(machine_config &config)
+{
mc6845_device &mc6845(MC6845(config, MC6845_TAG, ABC800_CCLK));
mc6845.set_screen(SCREEN_TAG);
mc6845.set_show_border_area(true);
@@ -284,9 +286,9 @@ MACHINE_CONFIG_START(abc800m_state::abc800m_video)
mc6845.set_update_row_callback(FUNC(abc800m_state::abc800m_update_row), this);
mc6845.out_vsync_callback().set(m_dart, FUNC(z80dart_device::rib_w)).invert();
- MCFG_SCREEN_ADD_MONOCHROME(SCREEN_TAG, RASTER, rgb_t(0xff, 0xff, 0x00))
- MCFG_SCREEN_UPDATE_DRIVER(abc800m_state, screen_update)
- MCFG_SCREEN_RAW_PARAMS(XTAL(12'000'000), 0x300, 0, 0x1e0, 0x13a, 0, 0xf0)
+ screen_device &screen(SCREEN(config, SCREEN_TAG, SCREEN_TYPE_RASTER, rgb_t(0xff, 0xff, 0x00)));
+ screen.set_screen_update(FUNC(abc800m_state::screen_update));
+ screen.set_raw(XTAL(12'000'000), 0x300, 0, 0x1e0, 0x13a, 0, 0xf0);
PALETTE(config, m_palette, palette_device::MONOCHROME);
-MACHINE_CONFIG_END
+}
diff --git a/src/mame/video/abc802.cpp b/src/mame/video/abc802.cpp
index 70f088fb0fb..7ea2c43b284 100644
--- a/src/mame/video/abc802.cpp
+++ b/src/mame/video/abc802.cpp
@@ -175,10 +175,11 @@ WRITE_LINE_MEMBER( abc802_state::vs_w )
//-------------------------------------------------
-// MACHINE_CONFIG_START( abc802_video )
+// machine_config( abc802_video )
//-------------------------------------------------
-MACHINE_CONFIG_START(abc802_state::abc802_video)
+void abc802_state::abc802_video(machine_config &config)
+{
mc6845_device &mc6845(MC6845(config, MC6845_TAG, ABC800_CCLK));
mc6845.set_screen(SCREEN_TAG);
mc6845.set_show_border_area(true);
@@ -187,9 +188,9 @@ MACHINE_CONFIG_START(abc802_state::abc802_video)
mc6845.out_vsync_callback().set(FUNC(abc802_state::vs_w));
mc6845.out_vsync_callback().append(m_dart, FUNC(z80dart_device::rib_w)).invert();
- MCFG_SCREEN_ADD_MONOCHROME(SCREEN_TAG, RASTER, rgb_t::amber())
- MCFG_SCREEN_UPDATE_DEVICE(MC6845_TAG, mc6845_device, screen_update)
- MCFG_SCREEN_RAW_PARAMS(XTAL(12'000'000), 0x300, 0, 0x1e0, 0x13a, 0, 0xf0)
+ screen_device &screen(SCREEN(config, SCREEN_TAG, SCREEN_TYPE_RASTER, rgb_t::amber()));
+ screen.set_screen_update(MC6845_TAG, FUNC(mc6845_device::screen_update));
+ screen.set_raw(XTAL(12'000'000), 0x300, 0, 0x1e0, 0x13a, 0, 0xf0);
PALETTE(config, m_palette, palette_device::MONOCHROME);
-MACHINE_CONFIG_END
+}
diff --git a/src/mame/video/abc806.cpp b/src/mame/video/abc806.cpp
index 78d4a67306d..82dd1238316 100644
--- a/src/mame/video/abc806.cpp
+++ b/src/mame/video/abc806.cpp
@@ -474,10 +474,11 @@ void abc806_state::abc806_palette(palette_device &palette) const
//-------------------------------------------------
-// MACHINE_CONFIG_START( abc806_video )
+// machine_config( abc806_video )
//-------------------------------------------------
-MACHINE_CONFIG_START(abc806_state::abc806_video)
+void abc806_state::abc806_video(machine_config &config)
+{
MC6845(config, m_crtc, ABC800_CCLK);
m_crtc->set_screen(SCREEN_TAG);
m_crtc->set_show_border_area(true);
@@ -486,9 +487,9 @@ MACHINE_CONFIG_START(abc806_state::abc806_video)
m_crtc->out_hsync_callback().set(FUNC(abc806_state::hs_w));
m_crtc->out_vsync_callback().set(FUNC(abc806_state::vs_w));
- MCFG_SCREEN_ADD(SCREEN_TAG, RASTER)
- MCFG_SCREEN_UPDATE_DRIVER(abc806_state, screen_update)
- MCFG_SCREEN_RAW_PARAMS(XTAL(12'000'000), 0x300, 0, 0x1e0, 0x13a, 0, 0xfa)
+ screen_device &screen(SCREEN(config, SCREEN_TAG, SCREEN_TYPE_RASTER));
+ screen.set_screen_update(FUNC(abc806_state::screen_update));
+ screen.set_raw(XTAL(12'000'000), 0x300, 0, 0x1e0, 0x13a, 0, 0xfa);
PALETTE(config, m_palette, FUNC(abc806_state::abc806_palette), 8);
-MACHINE_CONFIG_END
+}
diff --git a/src/mame/video/agat7.cpp b/src/mame/video/agat7.cpp
index cc551d87237..bfce6c81b96 100644
--- a/src/mame/video/agat7.cpp
+++ b/src/mame/video/agat7.cpp
@@ -39,12 +39,13 @@ DEFINE_DEVICE_TYPE(AGAT7VIDEO, agat7video_device, "agat7video", "Agat-7 Video")
// device_add_mconfig - add device configuration
//-------------------------------------------------
-MACHINE_CONFIG_START(agat7video_device::device_add_mconfig)
- MCFG_SCREEN_ADD("a7screen", RASTER)
- MCFG_SCREEN_RAW_PARAMS(XTAL(10'500'000), 672, 0, 512, 312, 0, 256)
- MCFG_SCREEN_UPDATE_DRIVER(agat7video_device, screen_update)
- MCFG_SCREEN_PALETTE(DEVICE_SELF)
-MACHINE_CONFIG_END
+void agat7video_device::device_add_mconfig(machine_config &config)
+{
+ screen_device &a7screen(SCREEN(config, "a7screen", SCREEN_TYPE_RASTER));
+ a7screen.set_raw(XTAL(10'500'000), 672, 0, 512, 312, 0, 256);
+ a7screen.set_screen_update(FUNC(agat7video_device::screen_update));
+ a7screen.set_palette(DEVICE_SELF);
+}
//**************************************************************************
diff --git a/src/mame/video/airraid_dev.cpp b/src/mame/video/airraid_dev.cpp
index e68717671be..3dac9982bc7 100644
--- a/src/mame/video/airraid_dev.cpp
+++ b/src/mame/video/airraid_dev.cpp
@@ -58,20 +58,19 @@ static GFXDECODE_START( gfx_cshooter )
GFXDECODE_ENTRY( "fg_gfx", 0, char16layout, 0, 16 )
GFXDECODE_END
-MACHINE_CONFIG_START(airraid_video_device::device_add_mconfig)
-
+void airraid_video_device::device_add_mconfig(machine_config &config)
+{
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(256, 256)
- MCFG_SCREEN_VISIBLE_AREA(0, 256-1, 16, 256-1-16)
- MCFG_SCREEN_UPDATE_DRIVER(airraid_video_device, screen_update_airraid)
- MCFG_SCREEN_PALETTE("^palette")
-
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "^palette", gfx_cshooter)
-
-MACHINE_CONFIG_END
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_refresh_hz(60);
+ m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ m_screen->set_size(256, 256);
+ m_screen->set_visarea(0, 256-1, 16, 256-1-16);
+ m_screen->set_screen_update(FUNC(airraid_video_device::screen_update_airraid));
+ m_screen->set_palette(m_palette);
+
+ GFXDECODE(config, m_gfxdecode, m_palette, gfx_cshooter);
+}
void airraid_video_device::device_start()
diff --git a/src/mame/video/amiga.cpp b/src/mame/video/amiga.cpp
index 804f4643325..d6ad936aee3 100644
--- a/src/mame/video/amiga.cpp
+++ b/src/mame/video/amiga.cpp
@@ -1094,26 +1094,28 @@ void amiga_state::update_screenmode()
// MACHINE DRIVER FRAGMENTS
//**************************************************************************
-MACHINE_CONFIG_START(amiga_state::pal_video)
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_RAW_PARAMS
+void amiga_state::pal_video(machine_config &config)
+{
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_raw
(
(amiga_state::CLK_28M_PAL / 4) * 2 * 2,
amiga_state::SCREEN_WIDTH, amiga_state::HBLANK, amiga_state::SCREEN_WIDTH,
amiga_state::SCREEN_HEIGHT_PAL, amiga_state::VBLANK_PAL, amiga_state::SCREEN_HEIGHT_PAL
- )
- MCFG_SCREEN_UPDATE_DRIVER(amiga_state, screen_update_amiga)
- MCFG_SCREEN_PALETTE("palette")
-MACHINE_CONFIG_END
-
-MACHINE_CONFIG_START(amiga_state::ntsc_video)
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_RAW_PARAMS
+ );
+ m_screen->set_screen_update(FUNC(amiga_state::screen_update_amiga));
+ m_screen->set_palette(m_palette);
+}
+
+void amiga_state::ntsc_video(machine_config &config)
+{
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_raw
(
(amiga_state::CLK_28M_NTSC / 4) * 2 * 2,
amiga_state::SCREEN_WIDTH, amiga_state::HBLANK, amiga_state::SCREEN_WIDTH,
amiga_state::SCREEN_HEIGHT_NTSC, amiga_state::VBLANK_NTSC, amiga_state::SCREEN_HEIGHT_NTSC
- )
- MCFG_SCREEN_UPDATE_DRIVER(amiga_state, screen_update_amiga)
- MCFG_SCREEN_PALETTE("palette")
-MACHINE_CONFIG_END
+ );
+ m_screen->set_screen_update(FUNC(amiga_state::screen_update_amiga));
+ m_screen->set_palette(m_palette);
+}
diff --git a/src/mame/video/ampoker2.cpp b/src/mame/video/ampoker2.cpp
index 358b720e20d..fafd36e60c7 100644
--- a/src/mame/video/ampoker2.cpp
+++ b/src/mame/video/ampoker2.cpp
@@ -99,19 +99,19 @@ void ampoker2_state::ampoker2_palette(palette_device &palette) const
// blue component
bit0 = BIT(color_prom[i], 0);
bit1 = BIT(color_prom[i], 1);
- int const b = combine_2_weights(weights_b, bit0, bit1);
+ int const b = combine_weights(weights_b, bit0, bit1);
// green component
bit0 = BIT(color_prom[i], 2);
bit1 = BIT(color_prom[i], 3);
bit2 = BIT(color_prom[i], 4);
- int const g = combine_3_weights(weights_g, bit0, bit1, bit2);
+ int const g = combine_weights(weights_g, bit0, bit1, bit2);
// red component
bit0 = BIT(color_prom[i], 5);
bit1 = BIT(color_prom[i], 6);
bit2 = BIT(color_prom[i], 7);
- int const r = combine_3_weights(weights_r, bit0, bit1, bit2);
+ int const r = combine_weights(weights_r, bit0, bit1, bit2);
palette.set_pen_color(i, rgb_t(r, g, b));
}
diff --git a/src/mame/video/apollo.cpp b/src/mame/video/apollo.cpp
index 7d169e706ac..eba48d5868d 100644
--- a/src/mame/video/apollo.cpp
+++ b/src/mame/video/apollo.cpp
@@ -1712,13 +1712,14 @@ void apollo_graphics_15i::register_vblank_callback()
MACHINE DRIVERS
***************************************************************************/
-MACHINE_CONFIG_START(apollo_graphics_15i::device_add_mconfig)
+void apollo_graphics_15i::device_add_mconfig(machine_config &config)
+{
config.set_default_layout(layout_apollo_15i);
- MCFG_SCREEN_ADD(m_screen, RASTER)
- MCFG_SCREEN_VIDEO_ATTRIBUTES(VIDEO_UPDATE_AFTER_VBLANK)
- MCFG_SCREEN_RAW_PARAMS(68000000, 1346, 0, 1024, 841, 0, 800)
- MCFG_SCREEN_UPDATE_DEVICE(DEVICE_SELF, apollo_graphics_15i, screen_update)
-MACHINE_CONFIG_END
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_video_attributes(VIDEO_UPDATE_AFTER_VBLANK);
+ m_screen->set_raw(68000000, 1346, 0, 1024, 841, 0, 800);
+ m_screen->set_screen_update(FUNC(apollo_graphics_15i::screen_update));
+}
DEFINE_DEVICE_TYPE(APOLLO_GRAPHICS, apollo_graphics_15i, "apollo_graphics_15i", "Apollo Screen")
@@ -1884,14 +1885,15 @@ void apollo_graphics_15i::device_reset()
//-------------------------------------------------
-MACHINE_CONFIG_START(apollo_graphics_19i::device_add_mconfig)
+void apollo_graphics_19i::device_add_mconfig(machine_config &config)
+{
config.set_default_layout(layout_apollo);
PALETTE(config, "palette", palette_device::MONOCHROME);
- MCFG_SCREEN_ADD(m_screen, RASTER)
- MCFG_SCREEN_VIDEO_ATTRIBUTES(VIDEO_UPDATE_AFTER_VBLANK)
- MCFG_SCREEN_RAW_PARAMS(120000000, 1728, 0, 1280, 1066, 0, 1024)
- MCFG_SCREEN_UPDATE_DEVICE(DEVICE_SELF, apollo_graphics_19i, screen_update)
-MACHINE_CONFIG_END
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_video_attributes(VIDEO_UPDATE_AFTER_VBLANK);
+ m_screen->set_raw(120000000, 1728, 0, 1280, 1066, 0, 1024);
+ m_screen->set_screen_update(FUNC(apollo_graphics_19i::screen_update));
+}
DEFINE_DEVICE_TYPE(APOLLO_MONO19I, apollo_graphics_19i, "apollo_graphics_19i", "Apollo 19\" Monochrome Screen")
diff --git a/src/mame/video/arabian.cpp b/src/mame/video/arabian.cpp
index 241cc2d8ed0..5e68b8cb240 100644
--- a/src/mame/video/arabian.cpp
+++ b/src/mame/video/arabian.cpp
@@ -128,12 +128,12 @@ void arabian_state::arabian_palette(palette_device &palette) const
/* convert an RGB color -
there are effectively 6 bits of color: 2 red, 2 green, 2 blue */
int const r = ( rhi * (int)(((153.0 * 192) / 255) + 0.5)) +
- ( rlo * int(((102.0 * 192) / 255) + 0.5)) +
- ((rhi | rlo) ? 63 : 0);
+ ( rlo * int(((102.0 * 192) / 255) + 0.5)) +
+ ((rhi | rlo) ? 63 : 0);
int const g = ( ghi * (int)(((156.0 * 192) / 255) + 0.5)) +
- ( glo * int((( 99.0 * 192) / 255) + 0.5)) +
- ((ghi | glo) ? 63 : 0);
+ ( glo * int((( 99.0 * 192) / 255) + 0.5)) +
+ ((ghi | glo) ? 63 : 0);
int const b = (bhi * 192) + (bbase * 63);
diff --git a/src/mame/video/astrocde.cpp b/src/mame/video/astrocde.cpp
index 2dbb9991410..781cee11b18 100644
--- a/src/mame/video/astrocde.cpp
+++ b/src/mame/video/astrocde.cpp
@@ -142,21 +142,21 @@ void astrocde_state::profpac_palette(palette_device &palette) const
bit1 = BIT(i, 1);
bit2 = BIT(i, 2);
bit3 = BIT(i, 3);
- int const b = combine_4_weights(weights, bit0, bit1, bit2, bit3);
+ int const b = combine_weights(weights, bit0, bit1, bit2, bit3);
// green component
bit0 = BIT(i, 4);
bit1 = BIT(i, 5);
bit2 = BIT(i, 6);
bit3 = BIT(i, 7);
- int const g = combine_4_weights(weights, bit0, bit1, bit2, bit3);
+ int const g = combine_weights(weights, bit0, bit1, bit2, bit3);
// red component
bit0 = BIT(i, 8);
bit1 = BIT(i, 9);
bit2 = BIT(i, 10);
bit3 = BIT(i, 11);
- int const r = combine_4_weights(weights, bit0, bit1, bit2, bit3);
+ int const r = combine_weights(weights, bit0, bit1, bit2, bit3);
palette.set_pen_color(i, rgb_t(r, g, b));
}
@@ -395,6 +395,14 @@ void astrocde_state::device_timer(emu_timer &timer, device_timer_id id, int para
}
}
+WRITE_LINE_MEMBER(astrocde_state::lightpen_trigger_w)
+{
+ if (state)
+ {
+ uint8_t res_shift = 1 - m_video_mode;
+ astrocade_trigger_lightpen(mame_vpos_to_astrocade_vpos(m_screen->vpos()) & ~res_shift, (m_screen->hpos() >> res_shift) + 12);
+ }
+}
void astrocde_state::astrocade_trigger_lightpen(uint8_t vfeedback, uint8_t hfeedback)
{
diff --git a/src/mame/video/aussiebyte.cpp b/src/mame/video/aussiebyte.cpp
index 23de8c9b940..da24476a701 100644
--- a/src/mame/video/aussiebyte.cpp
+++ b/src/mame/video/aussiebyte.cpp
@@ -76,7 +76,7 @@ MC6845_ON_UPDATE_ADDR_CHANGED( aussiebyte_state::crtc_update_addr )
WRITE8_MEMBER( aussiebyte_state::address_w )
{
- m_crtc->address_w( space, 0, data );
+ m_crtc->address_w(data);
m_video_index = data & 0x1f;
@@ -100,7 +100,7 @@ WRITE8_MEMBER( aussiebyte_state::address_w )
WRITE8_MEMBER( aussiebyte_state::register_w )
{
- m_crtc->register_w( space, 0, data );
+ m_crtc->register_w(data);
uint16_t temp = m_alpha_address;
// Get transparent address
diff --git a/src/mame/video/bagman.cpp b/src/mame/video/bagman.cpp
index 41e61a97311..6b0e9036074 100644
--- a/src/mame/video/bagman.cpp
+++ b/src/mame/video/bagman.cpp
@@ -64,18 +64,18 @@ void bagman_state::bagman_palette(palette_device &palette) const
bit0 = BIT(color_prom[i], 0);
bit1 = BIT(color_prom[i], 1);
bit2 = BIT(color_prom[i], 2);
- int const r = combine_3_weights(weights_r, bit0, bit1, bit2);
+ int const r = combine_weights(weights_r, bit0, bit1, bit2);
// green component
bit0 = BIT(color_prom[i], 3);
bit1 = BIT(color_prom[i], 4);
bit2 = BIT(color_prom[i], 5);
- int const g = combine_3_weights(weights_g, bit0, bit1, bit2);
+ int const g = combine_weights(weights_g, bit0, bit1, bit2);
// blue component
bit0 = BIT(color_prom[i], 6);
bit1 = BIT(color_prom[i], 7);
- int const b = combine_2_weights(weights_b, bit0, bit1);
+ int const b = combine_weights(weights_b, bit0, bit1);
palette.set_pen_color(i, rgb_t(r, g, b));
}
diff --git a/src/mame/video/bfm_adr2.cpp b/src/mame/video/bfm_adr2.cpp
index a8e6d409cfb..1da7d078b2e 100644
--- a/src/mame/video/bfm_adr2.cpp
+++ b/src/mame/video/bfm_adr2.cpp
@@ -549,17 +549,18 @@ void bfm_adder2_device::adder2_memmap(address_map &map)
// device_add_mconfig - add device configuration
//-------------------------------------------------
-MACHINE_CONFIG_START(bfm_adder2_device::device_add_mconfig)
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_SIZE( 400, 280)
- MCFG_SCREEN_VISIBLE_AREA( 0, 400-1, 0, 280-1)
- MCFG_SCREEN_REFRESH_RATE(50)
- MCFG_SCREEN_PALETTE("palette")
- MCFG_SCREEN_UPDATE_DEVICE(DEVICE_SELF, bfm_adder2_device, update_screen)
- MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE(*this, bfm_adder2_device, adder2_vbl_w)) // board has a VBL IRQ
-
- MCFG_PALETTE_ADD("palette", 16)
-
- MCFG_DEVICE_ADD("adder2", M6809, ADDER_CLOCK/4 ) // adder2 board 6809 CPU at 2 Mhz
- MCFG_DEVICE_PROGRAM_MAP(adder2_memmap) // setup adder2 board memorymap
-MACHINE_CONFIG_END
+void bfm_adder2_device::device_add_mconfig(machine_config &config)
+{
+ M6809(config, m_cpu, ADDER_CLOCK/4); // adder2 board 6809 CPU at 2 Mhz
+ m_cpu->set_addrmap(AS_PROGRAM, &bfm_adder2_device::adder2_memmap); // setup adder2 board memorymap
+
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_size(400, 280);
+ screen.set_visarea(0, 400-1, 0, 280-1);
+ screen.set_refresh_hz(50);
+ screen.set_palette("palette");
+ screen.set_screen_update(FUNC(bfm_adder2_device::update_screen));
+ screen.screen_vblank().set(FUNC(bfm_adder2_device::adder2_vbl_w)); // board has a VBL IRQ
+
+ PALETTE(config, "palette").set_entries(16);
+}
diff --git a/src/mame/video/bfm_dm01.cpp b/src/mame/video/bfm_dm01.cpp
index 2447c93e4db..4c38871258b 100644
--- a/src/mame/video/bfm_dm01.cpp
+++ b/src/mame/video/bfm_dm01.cpp
@@ -288,22 +288,22 @@ INTERRUPT_GEN_MEMBER( bfm_dm01_device::nmi_line_assert )
m_matrixcpu->set_input_line(INPUT_LINE_NMI, ASSERT_LINE);
}
-MACHINE_CONFIG_START(bfm_dm01_device::device_add_mconfig)
- MCFG_DEVICE_ADD("matrix", M6809, 2000000 ) /* matrix board 6809 CPU at 2 Mhz ?? I don't know the exact freq.*/
- MCFG_DEVICE_PROGRAM_MAP(bfm_dm01_memmap)
- MCFG_DEVICE_PERIODIC_INT_DRIVER(bfm_dm01_device, nmi_line_assert, 1500 ) /* generate 1500 NMI's per second ?? what is the exact freq?? */
-
- MCFG_PALETTE_ADD("palette_lcd", 3)
-
- MCFG_SCREEN_ADD("dmd", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(65*2, 21*2)
- MCFG_SCREEN_VISIBLE_AREA(0, 65*2-1, 0, 21*2-1)
- MCFG_SCREEN_UPDATE_DRIVER(bfm_dm01_device, screen_update)
-
- MCFG_SCREEN_PALETTE("palette_lcd")
-MACHINE_CONFIG_END
+void bfm_dm01_device::device_add_mconfig(machine_config &config)
+{
+ M6809(config, m_matrixcpu, 2000000); /* matrix board 6809 CPU at 2 Mhz ?? I don't know the exact freq.*/
+ m_matrixcpu->set_addrmap(AS_PROGRAM, &bfm_dm01_device::bfm_dm01_memmap);
+ m_matrixcpu->set_periodic_int(FUNC(bfm_dm01_device::nmi_line_assert), attotime::from_hz(1500)); /* generate 1500 NMI's per second ?? what is the exact freq?? */
+
+ PALETTE(config, m_palette).set_entries(3);
+
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_refresh_hz(60);
+ m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ m_screen->set_size(65*2, 21*2);
+ m_screen->set_visarea(0, 65*2-1, 0, 21*2-1);
+ m_screen->set_screen_update(FUNC(bfm_dm01_device::screen_update));
+ m_screen->set_palette(m_palette);
+}
///////////////////////////////////////////////////////////////////////////
diff --git a/src/mame/video/bking.cpp b/src/mame/video/bking.cpp
index 678482e5d7b..59d43fbc4dc 100644
--- a/src/mame/video/bking.cpp
+++ b/src/mame/video/bking.cpp
@@ -62,18 +62,18 @@ void bking_state::bking_palette(palette_device &palette) const
bit0 = (color_prom[pen] >> 0) & 0x01;
bit1 = (color_prom[pen] >> 1) & 0x01;
bit2 = (color_prom[pen] >> 2) & 0x01;
- int const r = combine_3_weights(rweights, bit0, bit1, bit2);
+ int const r = combine_weights(rweights, bit0, bit1, bit2);
// green component
bit0 = (color_prom[pen] >> 3) & 0x01;
bit1 = (color_prom[pen] >> 4) & 0x01;
bit2 = (color_prom[pen] >> 5) & 0x01;
- int const g = combine_3_weights(gweights, bit0, bit1, bit2);
+ int const g = combine_weights(gweights, bit0, bit1, bit2);
// blue component
bit0 = (color_prom[pen] >> 6) & 0x01;
bit1 = (color_prom[pen] >> 7) & 0x01;
- int const b = combine_2_weights(gweights, bit0, bit1);
+ int const b = combine_weights(gweights, bit0, bit1);
palette.set_pen_color(i, rgb_t(r, g, b));
}
diff --git a/src/mame/video/btoads.cpp b/src/mame/video/btoads.cpp
index 8ffb026b1c1..5bcbfb82067 100644
--- a/src/mame/video/btoads.cpp
+++ b/src/mame/video/btoads.cpp
@@ -127,13 +127,13 @@ WRITE16_MEMBER( btoads_state::scroll1_w )
WRITE16_MEMBER( btoads_state::paletteram_w )
{
- m_tlc34076->write(space, offset/2, data);
+ m_tlc34076->write(offset/2, data);
}
READ16_MEMBER( btoads_state::paletteram_r )
{
- return m_tlc34076->read(space, offset/2);
+ return m_tlc34076->read(offset/2);
}
diff --git a/src/mame/video/capbowl.cpp b/src/mame/video/capbowl.cpp
index d035b030ff7..86153598849 100644
--- a/src/mame/video/capbowl.cpp
+++ b/src/mame/video/capbowl.cpp
@@ -28,7 +28,7 @@ WRITE8_MEMBER(capbowl_state::tms34061_w)
col ^= 2;
/* Row address (RA0-RA8) is not dependent on the offset */
- m_tms34061->write(space, col, *m_rowaddress, func, data);
+ m_tms34061->write(col, *m_rowaddress, func, data);
}
@@ -43,7 +43,7 @@ READ8_MEMBER(capbowl_state::tms34061_r)
col ^= 2;
/* Row address (RA0-RA8) is not dependent on the offset */
- return m_tms34061->read(space, col, *m_rowaddress, func);
+ return m_tms34061->read(col, *m_rowaddress, func);
}
diff --git a/src/mame/video/ccastles.cpp b/src/mame/video/ccastles.cpp
index 96981f086d2..79571327ddd 100644
--- a/src/mame/video/ccastles.cpp
+++ b/src/mame/video/ccastles.cpp
@@ -90,19 +90,19 @@ WRITE8_MEMBER(ccastles_state::ccastles_paletteram_w)
bit0 = (~r >> 0) & 0x01;
bit1 = (~r >> 1) & 0x01;
bit2 = (~r >> 2) & 0x01;
- r = combine_3_weights(m_rweights, bit0, bit1, bit2);
+ r = combine_weights(m_rweights, bit0, bit1, bit2);
/* green component (inverted) */
bit0 = (~g >> 0) & 0x01;
bit1 = (~g >> 1) & 0x01;
bit2 = (~g >> 2) & 0x01;
- g = combine_3_weights(m_gweights, bit0, bit1, bit2);
+ g = combine_weights(m_gweights, bit0, bit1, bit2);
/* blue component (inverted) */
bit0 = (~b >> 0) & 0x01;
bit1 = (~b >> 1) & 0x01;
bit2 = (~b >> 2) & 0x01;
- b = combine_3_weights(m_bweights, bit0, bit1, bit2);
+ b = combine_weights(m_bweights, bit0, bit1, bit2);
m_palette->set_pen_color(offset & 0x1f, rgb_t(r, g, b));
}
diff --git a/src/mame/video/cclimber.cpp b/src/mame/video/cclimber.cpp
index 370f2987f09..2e7ff665d84 100644
--- a/src/mame/video/cclimber.cpp
+++ b/src/mame/video/cclimber.cpp
@@ -57,18 +57,18 @@ void cclimber_state::cclimber_palette(palette_device &palette) const
bit0 = BIT(color_prom[i], 0);
bit1 = BIT(color_prom[i], 1);
bit2 = BIT(color_prom[i], 2);
- int const r = combine_3_weights(weights_rg, bit0, bit1, bit2);
+ int const r = combine_weights(weights_rg, bit0, bit1, bit2);
// green component
bit0 = BIT(color_prom[i], 3);
bit1 = BIT(color_prom[i], 4);
bit2 = BIT(color_prom[i], 5);
- int const g = combine_3_weights(weights_rg, bit0, bit1, bit2);
+ int const g = combine_weights(weights_rg, bit0, bit1, bit2);
// blue component
bit0 = BIT(color_prom[i], 6);
bit1 = BIT(color_prom[i], 7);
- int const b = combine_2_weights(weights_b, bit0, bit1);
+ int const b = combine_weights(weights_b, bit0, bit1);
palette.set_pen_color(i, rgb_t(r, g, b));
}
diff --git a/src/mame/video/cgc7900.cpp b/src/mame/video/cgc7900.cpp
index 5668b63a75f..4eb02ed07e8 100644
--- a/src/mame/video/cgc7900.cpp
+++ b/src/mame/video/cgc7900.cpp
@@ -227,17 +227,18 @@ GFXDECODE_END
MACHINE_DRIVER( cgc7900_video )
-------------------------------------------------*/
-MACHINE_CONFIG_START(cgc7900_state::cgc7900_video)
- MCFG_SCREEN_ADD(SCREEN_TAG, RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */
- MCFG_SCREEN_UPDATE_DRIVER(cgc7900_state, screen_update)
- MCFG_SCREEN_SIZE(1024, 768)
- MCFG_SCREEN_VISIBLE_AREA(0, 1024-1, 0, 768-1)
- MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE(*this, cgc7900_state, irq<0xc>))
-
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, m_palette, gfx_cgc7900)
+void cgc7900_state::cgc7900_video(machine_config &config)
+{
+ screen_device &screen(SCREEN(config, SCREEN_TAG, SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */
+ screen.set_screen_update(FUNC(cgc7900_state::screen_update));
+ screen.set_size(1024, 768);
+ screen.set_visarea(0, 1024-1, 0, 768-1);
+ screen.screen_vblank().set(FUNC(cgc7900_state::irq<0xc>));
+
+ GFXDECODE(config, "gfxdecode", m_palette, gfx_cgc7900);
PALETTE(config, m_palette, FUNC(cgc7900_state::cgc7900_palette), 8);
- MCFG_TIMER_DRIVER_ADD_PERIODIC("blink", cgc7900_state, blink_tick, attotime::from_hz(XTAL(28'480'000)/7500000))
-MACHINE_CONFIG_END
+ TIMER(config, "blink").configure_periodic(FUNC(cgc7900_state::blink_tick), attotime::from_hz(XTAL(28'480'000)/7500000));
+}
diff --git a/src/mame/video/champbas.cpp b/src/mame/video/champbas.cpp
index 8357dfa7581..f329bc31622 100644
--- a/src/mame/video/champbas.cpp
+++ b/src/mame/video/champbas.cpp
@@ -50,18 +50,18 @@ void champbas_state::champbas_palette(palette_device &palette) const
bit0 = (color_prom[i] >> 0) & 0x01;
bit1 = (color_prom[i] >> 1) & 0x01;
bit2 = (color_prom[i] >> 2) & 0x01;
- int const r = combine_3_weights(rweights, bit0, bit1, bit2);
+ int const r = combine_weights(rweights, bit0, bit1, bit2);
/* green component */
bit0 = (color_prom[i] >> 3) & 0x01;
bit1 = (color_prom[i] >> 4) & 0x01;
bit2 = (color_prom[i] >> 5) & 0x01;
- int const g = combine_3_weights(gweights, bit0, bit1, bit2);
+ int const g = combine_weights(gweights, bit0, bit1, bit2);
/* blue component */
bit0 = (color_prom[i] >> 6) & 0x01;
bit1 = (color_prom[i] >> 7) & 0x01;
- int const b = combine_2_weights(bweights, bit0, bit1);
+ int const b = combine_weights(bweights, bit0, bit1);
palette.set_indirect_color(i, rgb_t(r, g, b));
}
diff --git a/src/mame/video/circusc.cpp b/src/mame/video/circusc.cpp
index f8d06ff65b7..fa50b26a0a8 100644
--- a/src/mame/video/circusc.cpp
+++ b/src/mame/video/circusc.cpp
@@ -54,18 +54,18 @@ void circusc_state::circusc_palette(palette_device &palette) const
bit0 = BIT(color_prom[i], 0);
bit1 = BIT(color_prom[i], 1);
bit2 = BIT(color_prom[i], 2);
- int const r = combine_3_weights(rweights, bit0, bit1, bit2);
+ int const r = combine_weights(rweights, bit0, bit1, bit2);
// green component
bit0 = BIT(color_prom[i], 3);
bit1 = BIT(color_prom[i], 4);
bit2 = BIT(color_prom[i], 5);
- int const g = combine_3_weights(gweights, bit0, bit1, bit2);
+ int const g = combine_weights(gweights, bit0, bit1, bit2);
// blue component
bit0 = BIT(color_prom[i], 6);
bit1 = BIT(color_prom[i], 7);
- int const b = combine_2_weights(bweights, bit0, bit1);
+ int const b = combine_weights(bweights, bit0, bit1);
palette.set_indirect_color(i, rgb_t(r, g, b));
}
diff --git a/src/mame/video/cloak.cpp b/src/mame/video/cloak.cpp
index d550499533f..351379a4ada 100644
--- a/src/mame/video/cloak.cpp
+++ b/src/mame/video/cloak.cpp
@@ -66,19 +66,19 @@ void cloak_state::set_pen(int i)
bit0 = (~palette_ram[i] >> 6) & 0x01;
bit1 = (~palette_ram[i] >> 7) & 0x01;
bit2 = (~palette_ram[i] >> 8) & 0x01;
- r = combine_3_weights(weights, bit0, bit1, bit2);
+ r = combine_weights(weights, bit0, bit1, bit2);
/* green component */
bit0 = (~palette_ram[i] >> 3) & 0x01;
bit1 = (~palette_ram[i] >> 4) & 0x01;
bit2 = (~palette_ram[i] >> 5) & 0x01;
- g = combine_3_weights(weights, bit0, bit1, bit2);
+ g = combine_weights(weights, bit0, bit1, bit2);
/* blue component */
bit0 = (~palette_ram[i] >> 0) & 0x01;
bit1 = (~palette_ram[i] >> 1) & 0x01;
bit2 = (~palette_ram[i] >> 2) & 0x01;
- b = combine_3_weights(weights, bit0, bit1, bit2);
+ b = combine_weights(weights, bit0, bit1, bit2);
m_palette->set_pen_color(i, rgb_t(r, g, b));
}
diff --git a/src/mame/video/cloud9.cpp b/src/mame/video/cloud9.cpp
index af1d5d5c6d1..f126bf98acb 100644
--- a/src/mame/video/cloud9.cpp
+++ b/src/mame/video/cloud9.cpp
@@ -66,19 +66,19 @@ WRITE8_MEMBER(cloud9_state::cloud9_paletteram_w)
bit0 = (~r >> 0) & 0x01;
bit1 = (~r >> 1) & 0x01;
bit2 = (~r >> 2) & 0x01;
- r = combine_3_weights(m_rweights, bit0, bit1, bit2);
+ r = combine_weights(m_rweights, bit0, bit1, bit2);
/* green component (inverted) */
bit0 = (~g >> 0) & 0x01;
bit1 = (~g >> 1) & 0x01;
bit2 = (~g >> 2) & 0x01;
- g = combine_3_weights(m_gweights, bit0, bit1, bit2);
+ g = combine_weights(m_gweights, bit0, bit1, bit2);
/* blue component (inverted) */
bit0 = (~b >> 0) & 0x01;
bit1 = (~b >> 1) & 0x01;
bit2 = (~b >> 2) & 0x01;
- b = combine_3_weights(m_bweights, bit0, bit1, bit2);
+ b = combine_weights(m_bweights, bit0, bit1, bit2);
m_palette->set_pen_color(offset & 0x3f, rgb_t(r, g, b));
}
diff --git a/src/mame/video/cninja.cpp b/src/mame/video/cninja.cpp
index aede19bd9c0..d6bc0fc72d6 100644
--- a/src/mame/video/cninja.cpp
+++ b/src/mame/video/cninja.cpp
@@ -208,14 +208,14 @@ uint32_t cninja_state::screen_update_robocop2(screen_device &screen, bitmap_ind1
/* One of the tilemap chips can switch between 2 tilemaps at 4bpp, or 1 at 8bpp */
if (priority & 4)
{
- m_deco_tilegen[0]->set_tilemap_colour_mask(2, 0);
- m_deco_tilegen[0]->set_tilemap_colour_mask(3, 0);
+ m_deco_tilegen[1]->set_tilemap_colour_mask(0, 0);
+ m_deco_tilegen[1]->set_tilemap_colour_mask(1, 0);
m_deco_tilegen[1]->pf12_set_gfxbank(0, 4);
}
else
{
- m_deco_tilegen[0]->set_tilemap_colour_mask(2, 0xf);
- m_deco_tilegen[0]->set_tilemap_colour_mask(3, 0xf);
+ m_deco_tilegen[1]->set_tilemap_colour_mask(0, 0xf);
+ m_deco_tilegen[1]->set_tilemap_colour_mask(1, 0xf);
m_deco_tilegen[1]->pf12_set_gfxbank(0, 2);
}
diff --git a/src/mame/video/cps1.cpp b/src/mame/video/cps1.cpp
index 1e9bcb9396b..34723a3fb1a 100644
--- a/src/mame/video/cps1.cpp
+++ b/src/mame/video/cps1.cpp
@@ -1580,7 +1580,7 @@ static const struct CPS1config cps1_config_table[]=
{"sf2b", CPS_B_17, mapper_STF29, 0x36, 0, 0, 1 },
{"sf2b2", CPS_B_17, mapper_STF29, 0x36, 0, 0, 1 },
{"sf2ceupl", HACK_B_1, mapper_S9263B, 0x36, 0, 0, 1 },
- {"sf2rules", HACK_B_1, mapper_S9263B, 0, 0, 0, 2 },
+ {"sf2rules", HACK_B_1, mapper_S9263B, 0x36, 0, 0, 2 },
{"sf2cems6a", HACK_B_1, mapper_S9263B, 0, 0, 0, 2 },
{"sf2cems6b", HACK_B_1, mapper_S9263B, 0, 0, 0, 2 },
{"sf2cems6c", HACK_B_1, mapper_S9263B, 0, 0, 0, 2 },
diff --git a/src/mame/video/crospang.cpp b/src/mame/video/crospang.cpp
index adef54bea52..5e83d448063 100644
--- a/src/mame/video/crospang.cpp
+++ b/src/mame/video/crospang.cpp
@@ -15,19 +15,19 @@
#include "includes/crospang.h"
-WRITE16_MEMBER(crospang_state::bestri_tilebank_select_w)
+void crospang_state::tilebank_select_w(u16 data)
{
- logerror("bestri_tilebank_select_w %04x\n", data & mem_mask);
+ logerror("tilebank_select_w %04x\n", data);
- m_bestri_tilebankselect = (data >> 8) & 3;
+ m_tilebankselect = (data >> 8) & 3;
}
-WRITE16_MEMBER(crospang_state::bestri_tilebank_data_w)
+void crospang_state::tilebank_data_w(u16 data)
{
- logerror("bestri_tilebank_data_w %04x\n", data & mem_mask);
+ logerror("tilebank_data_w %04x\n", data);
- m_bestri_tilebank[m_bestri_tilebankselect] = data >> 8;
+ m_tilebank[m_tilebankselect] = data >> 8;
m_fg_layer->mark_all_dirty();
m_bg_layer->mark_all_dirty();
@@ -35,7 +35,7 @@ WRITE16_MEMBER(crospang_state::bestri_tilebank_data_w)
// Bestri performs some unusual operations on the scroll values before writing them
-WRITE16_MEMBER(crospang_state::bestri_bg_scrolly_w)
+void crospang_state::bestri_bg_scrolly_w(u16 data)
{
// addi.w #$1f8, D0
// eori.w #$154, D0
@@ -43,7 +43,7 @@ WRITE16_MEMBER(crospang_state::bestri_bg_scrolly_w)
m_bg_layer->set_scrolly(0, -scroll + 7);
}
-WRITE16_MEMBER(crospang_state::bestri_fg_scrolly_w)
+void crospang_state::bestri_fg_scrolly_w(u16 data)
{
// addi.w #$1f8, D0
// eori.w #$aa, D0
@@ -51,7 +51,7 @@ WRITE16_MEMBER(crospang_state::bestri_fg_scrolly_w)
m_fg_layer->set_scrolly(0, -scroll + 7);
}
-WRITE16_MEMBER(crospang_state::bestri_fg_scrollx_w)
+void crospang_state::bestri_fg_scrollx_w(u16 data)
{
// addi.w #$400, D1
// eori.w #$1e0, D1
@@ -59,7 +59,7 @@ WRITE16_MEMBER(crospang_state::bestri_fg_scrollx_w)
m_fg_layer->set_scrollx(0, scroll - 1);
}
-WRITE16_MEMBER(crospang_state::bestri_bg_scrollx_w)
+void crospang_state::bestri_bg_scrollx_w(u16 data)
{
// addi.w #$3fc, D1
// eori.w #$3c0, D1
@@ -68,34 +68,34 @@ WRITE16_MEMBER(crospang_state::bestri_bg_scrollx_w)
}
-WRITE16_MEMBER(crospang_state::crospang_fg_scrolly_w)
+void crospang_state::fg_scrolly_w(u16 data)
{
m_fg_layer->set_scrolly(0, data + 8);
}
-WRITE16_MEMBER(crospang_state::crospang_bg_scrolly_w)
+void crospang_state::bg_scrolly_w(u16 data)
{
m_bg_layer->set_scrolly(0, data + 8);
}
-WRITE16_MEMBER(crospang_state::crospang_fg_scrollx_w)
+void crospang_state::fg_scrollx_w(u16 data)
{
m_fg_layer->set_scrollx(0, data);
}
-WRITE16_MEMBER(crospang_state::crospang_bg_scrollx_w)
+void crospang_state::bg_scrollx_w(u16 data)
{
m_bg_layer->set_scrollx(0, data + 4);
}
-WRITE16_MEMBER(crospang_state::crospang_fg_videoram_w)
+void crospang_state::fg_videoram_w(offs_t offset, u16 data, u16 mem_mask)
{
COMBINE_DATA(&m_fg_videoram[offset]);
m_fg_layer->mark_tile_dirty(offset);
}
-WRITE16_MEMBER(crospang_state::crospang_bg_videoram_w)
+void crospang_state::bg_videoram_w(offs_t offset, u16 data, u16 mem_mask)
{
COMBINE_DATA(&m_bg_videoram[offset]);
m_bg_layer->mark_tile_dirty(offset);
@@ -106,7 +106,7 @@ TILE_GET_INFO_MEMBER(crospang_state::get_bg_tile_info)
int data = m_bg_videoram[tile_index];
int tile = data & 0x03ff;
int tilebank = (data & 0x0c00) >> 10;
- tile = tile + (m_bestri_tilebank[tilebank] << 10);
+ tile = tile + (m_tilebank[tilebank] << 10);
int color = (data >> 12) & 0x0f;
SET_TILE_INFO_MEMBER(1, tile, color + 0x20, 0);
@@ -117,7 +117,7 @@ TILE_GET_INFO_MEMBER(crospang_state::get_fg_tile_info)
int data = m_fg_videoram[tile_index];
int tile = data & 0x03ff;
int tilebank = (data & 0x0c00) >> 10;
- tile = tile + (m_bestri_tilebank[tilebank] << 10);
+ tile = tile + (m_tilebank[tilebank] << 10);
int color = (data >> 12) & 0x0f;
SET_TILE_INFO_MEMBER(1, tile, color + 0x10, 0);
@@ -132,7 +132,7 @@ void crospang_state::video_start()
m_fg_layer->set_transparent_pen(0);
}
-uint32_t crospang_state::screen_update_crospang(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
+u32 crospang_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{
m_bg_layer->draw(screen, bitmap, cliprect, 0, 0);
m_fg_layer->draw(screen, bitmap, cliprect, 0, 0);
diff --git a/src/mame/video/dcheese.cpp b/src/mame/video/dcheese.cpp
index 8e4e1d5b1ff..f7a82d589aa 100644
--- a/src/mame/video/dcheese.cpp
+++ b/src/mame/video/dcheese.cpp
@@ -17,8 +17,8 @@
*
*************************************/
-#define DSTBITMAP_WIDTH 512
-#define DSTBITMAP_HEIGHT 512
+static constexpr u32 DSTBITMAP_WIDTH = 512;
+static constexpr u32 DSTBITMAP_HEIGHT = 512;
/*************************************
@@ -31,7 +31,7 @@ void dcheese_state::dcheese_palette(palette_device &palette) const
{
for (int i = 0; i < 65536; i++)
{
- int const data = m_palrom[i];
+ u16 const data = m_palrom[i];
palette.set_pen_color(i, pal6bit(data >> 0), pal5bit(data >> 6), pal5bit(data >> 11));
}
}
@@ -49,16 +49,13 @@ void dcheese_state::update_scanline_irq()
/* if not in range, don't bother */
if (m_blitter_vidparam[0x22/2] <= m_blitter_vidparam[0x1e/2])
{
- int effscan;
- attotime time;
-
/* compute the effective scanline of the interrupt */
- effscan = m_blitter_vidparam[0x22/2] - m_blitter_vidparam[0x1a/2];
+ int effscan = m_blitter_vidparam[0x22/2] - m_blitter_vidparam[0x1a/2];
if (effscan < 0)
effscan += m_blitter_vidparam[0x1e/2];
/* determine the time; if it's in this scanline, bump to the next frame */
- time = m_screen->time_until_pos(effscan);
+ attotime time = m_screen->time_until_pos(effscan);
if (time < m_screen->scan_period())
time += m_screen->frame_period();
m_blitter_timer->adjust(time);
@@ -71,11 +68,11 @@ void dcheese_state::device_timer(emu_timer &timer, device_timer_id id, int param
switch (id)
{
case TIMER_BLITTER_SCANLINE:
- dcheese_signal_irq(3);
+ signal_irq(3);
update_scanline_irq();
break;
case TIMER_SIGNAL_IRQ:
- dcheese_signal_irq(param);
+ signal_irq(param);
break;
default:
assert_always(false, "Unknown id in dcheese_state::device_timer");
@@ -114,17 +111,15 @@ void dcheese_state::video_start()
*
*************************************/
-uint32_t dcheese_state::screen_update_dcheese(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
+u32 dcheese_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{
- int x, y;
-
/* update the pixels */
- for (y = cliprect.min_y; y <= cliprect.max_y; y++)
+ for (int y = cliprect.min_y; y <= cliprect.max_y; y++)
{
- uint16_t *dest = &bitmap.pix16(y);
- uint16_t *src = &m_dstbitmap->pix16((y + m_blitter_vidparam[0x28/2]) & 0x1ff);
+ u16 *dest = &bitmap.pix16(y);
+ u16 *src = &m_dstbitmap->pix16((y + m_blitter_vidparam[0x28/2]) & 0x1ff);
- for (x = cliprect.min_x; x <= cliprect.max_x; x++)
+ for (int x = cliprect.min_x; x <= cliprect.max_x; x++)
dest[x] = src[x];
}
return 0;
@@ -138,12 +133,10 @@ uint32_t dcheese_state::screen_update_dcheese(screen_device &screen, bitmap_ind1
*
*************************************/
-void dcheese_state::do_clear( )
+void dcheese_state::do_clear()
{
- int y;
-
/* clear the requested scanlines */
- for (y = m_blitter_vidparam[0x2c/2]; y < m_blitter_vidparam[0x2a/2]; y++)
+ for (int y = m_blitter_vidparam[0x2c/2]; y < m_blitter_vidparam[0x2a/2]; y++)
memset(&m_dstbitmap->pix16(y & 0x1ff), 0, DSTBITMAP_WIDTH * 2);
/* signal an IRQ when done (timing is just a guess) */
@@ -151,31 +144,31 @@ void dcheese_state::do_clear( )
}
-void dcheese_state::do_blit( )
+void dcheese_state::do_blit()
{
- int32_t const srcminx = m_blitter_xparam[0] << 12;
- int32_t const srcmaxx = m_blitter_xparam[1] << 12;
- int32_t const srcminy = m_blitter_yparam[0] << 12;
- int32_t const srcmaxy = m_blitter_yparam[1] << 12;
- int32_t const srcx = ((m_blitter_xparam[2] & 0x0fff) | ((m_blitter_xparam[3] & 0x0fff) << 12)) << 7;
- int32_t const srcy = ((m_blitter_yparam[2] & 0x0fff) | ((m_blitter_yparam[3] & 0x0fff) << 12)) << 7;
- int32_t const dxdx = (int32_t)(((m_blitter_xparam[4] & 0x0fff) | ((m_blitter_xparam[5] & 0x0fff) << 12)) << 12) >> 12;
- int32_t const dxdy = (int32_t)(((m_blitter_xparam[6] & 0x0fff) | ((m_blitter_xparam[7] & 0x0fff) << 12)) << 12) >> 12;
- int32_t const dydx = (int32_t)(((m_blitter_yparam[4] & 0x0fff) | ((m_blitter_yparam[5] & 0x0fff) << 12)) << 12) >> 12;
- int32_t const dydy = (int32_t)(((m_blitter_yparam[6] & 0x0fff) | ((m_blitter_yparam[7] & 0x0fff) << 12)) << 12) >> 12;
- uint32_t const pagemask = m_gfxrom.mask() >> 18;
+ s32 const srcminx = m_blitter_xparam[0] << 12;
+ s32 const srcmaxx = m_blitter_xparam[1] << 12;
+ s32 const srcminy = m_blitter_yparam[0] << 12;
+ s32 const srcmaxy = m_blitter_yparam[1] << 12;
+ s32 const srcx = ((m_blitter_xparam[2] & 0x0fff) | ((m_blitter_xparam[3] & 0x0fff) << 12)) << 7;
+ s32 const srcy = ((m_blitter_yparam[2] & 0x0fff) | ((m_blitter_yparam[3] & 0x0fff) << 12)) << 7;
+ s32 const dxdx = (s32)(((m_blitter_xparam[4] & 0x0fff) | ((m_blitter_xparam[5] & 0x0fff) << 12)) << 12) >> 12;
+ s32 const dxdy = (s32)(((m_blitter_xparam[6] & 0x0fff) | ((m_blitter_xparam[7] & 0x0fff) << 12)) << 12) >> 12;
+ s32 const dydx = (s32)(((m_blitter_yparam[4] & 0x0fff) | ((m_blitter_yparam[5] & 0x0fff) << 12)) << 12) >> 12;
+ s32 const dydy = (s32)(((m_blitter_yparam[6] & 0x0fff) | ((m_blitter_yparam[7] & 0x0fff) << 12)) << 12) >> 12;
+ u32 const pagemask = m_gfxrom.mask() >> 18;
int const xstart = m_blitter_xparam[14];
int const xend = m_blitter_xparam[15] + 1;
int const ystart = m_blitter_yparam[14];
int const yend = m_blitter_yparam[15];
- int const color = (m_blitter_color[0] << 8) & 0xff00;
- int const mask = (m_blitter_color[0] >> 8) & 0x00ff;
- int const opaque = (dxdx | dxdy | dydx | dydy) == 0; /* bit of a hack for fredmem */
+ u32 const color = (m_blitter_color[0] << 8) & 0xff00;
+ u8 const mask = (m_blitter_color[0] >> 8) & 0x00ff;
+ bool const opaque = (dxdx | dxdy | dydx | dydy) == 0; /* bit of a hack for fredmem */
/* loop over target rows */
for (int y = ystart; y <= yend; y++)
{
- uint16_t *dst = &m_dstbitmap->pix16(y & 0x1ff);
+ u16 *dst = &m_dstbitmap->pix16(y & 0x1ff);
/* loop over target columns */
for (int x = xstart; x <= xend; x++)
@@ -188,8 +181,8 @@ void dcheese_state::do_blit( )
if (sx >= srcminx && sx <= srcmaxx && sy >= srcminy && sy <= srcmaxy)
{
/* page comes from bit 22 of Y and bit 21 of X */
- int const page = (((sy >> 21) & 2) | ((sx >> 21) & 1) | ((sx >> 20) & 4)) & pagemask;
- int const pix = m_gfxrom[(page << 18) | (((sy >> 12) & 0x1ff) << 9) | ((sx >> 12) & 0x1ff)];
+ u32 const page = (((sy >> 21) & 2) | ((sx >> 21) & 1) | ((sx >> 20) & 4)) & pagemask;
+ u8 const pix = m_gfxrom[(page << 18) | (((sy >> 12) & 0x1ff) << 9) | ((sx >> 12) & 0x1ff)];
/* only non-zero pixels get written */
if (pix | opaque)
@@ -300,9 +293,9 @@ READ16_MEMBER(dcheese_state::blitter_vidparam_r)
{
/* analog inputs seem to be hooked up here -- might not actually map to blitter */
if (offset == 0x02/2)
- return ioport("2a0002")->read();
+ return m_2a0002_io->read();
if (offset == 0x0e/2)
- return ioport("2a000e")->read();
+ return m_2a000e_io->read();
/* early code polls on this bit, wants it to be 0 */
if (offset == 0x36/2)
diff --git a/src/mame/video/dec0.cpp b/src/mame/video/dec0.cpp
index 0955478da7e..6c94ca6d0ff 100644
--- a/src/mame/video/dec0.cpp
+++ b/src/mame/video/dec0.cpp
@@ -36,6 +36,33 @@ uint32_t dec0_state::screen_update_hbarrel(screen_device &screen, bitmap_ind16 &
/******************************************************************************/
+uint32_t dec0_state::screen_update_bandit(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
+{
+ bool flip = m_tilegen[0]->get_flip_state();
+ m_tilegen[0]->set_flip_screen(flip);
+ m_tilegen[1]->set_flip_screen(flip);
+ m_tilegen[2]->set_flip_screen(flip);
+ m_spritegen->set_flip_screen(flip);
+
+ if (m_pri==0)
+ {
+ m_tilegen[2]->deco_bac06_pf_draw(bitmap,cliprect,TILEMAP_DRAW_OPAQUE, 0x00, 0x00, 0x00, 0x00);
+ m_tilegen[1]->deco_bac06_pf_draw(bitmap,cliprect,0, 0x00, 0x00, 0x00, 0x00);
+ m_spritegen->draw_sprites(bitmap, cliprect, m_buffered_spriteram, 0x00, 0x00, 0x0f);
+ m_tilegen[0]->deco_bac06_pf_draw(bitmap,cliprect,0, 0x00, 0x00, 0x00, 0x00);
+ }
+ else
+ {
+ m_tilegen[2]->deco_bac06_pf_draw(bitmap,cliprect,TILEMAP_DRAW_OPAQUE, 0x00, 0x00, 0x00, 0x00);
+ m_tilegen[1]->deco_bac06_pf_draw(bitmap,cliprect,0, 0x00, 0x00, 0x00, 0x00);
+ m_tilegen[0]->deco_bac06_pf_draw(bitmap,cliprect,0, 0x00, 0x00, 0x00, 0x00);
+ m_spritegen->draw_sprites(bitmap, cliprect, m_buffered_spriteram, 0x00, 0x00, 0x0f);
+ }
+ return 0;
+}
+
+/******************************************************************************/
+
uint32_t dec0_state::screen_update_baddudes(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{
bool flip = m_tilegen[0]->get_flip_state();
diff --git a/src/mame/video/decbac06.cpp b/src/mame/video/decbac06.cpp
index 590a569e245..e89d24f957d 100644
--- a/src/mame/video/decbac06.cpp
+++ b/src/mame/video/decbac06.cpp
@@ -3,20 +3,20 @@
/*
Deco BAC06 tilemap generator:
- this a direct relative of the later chip implemented in deco16ic.c
+ this a direct relative of the later chip implemented in deco16ic.cpp
we could implement this as either an 8-bit or a 16-bit chip, for now
- I'm using the 16-bit implementation from dec0.c
+ I'm using the 16-bit implementation from dec0.cpp
used by:
- actfancr.c
- dec0.c
- dec8.c (oscar, cobracom, ghostb)
- madmotor.c
- stadhero.c
- pcktgal.c
+ actfancr.cpp
+ dec0.cpp
+ dec8.cpp (oscar, cobracom, ghostb)
+ madmotor.cpp
+ stadhero.cpp
+ pcktgal.cpp
- Notes (from dec0.c)
+ Notes (from dec0.cpp)
All games contain three BAC06 background generator chips, usual (software)
configuration is 2 chips of 16*16 tiles, 1 of 8*8.
@@ -25,7 +25,7 @@ configuration is 2 chips of 16*16 tiles, 1 of 8*8.
bank 0:
0:
bit 0 (0x1) set = 8*8 tiles, else 16*16 tiles
- Bit 1 (0x2) unknown
+ Bit 1 (0x2) set = row major tile layout, else column major*
bit 2 (0x4) set enables rowscroll
bit 3 (0x8) set enables colscroll
bit 7 (0x80) set in playfield 1 is reverse screen (set via dip-switch)
@@ -44,6 +44,9 @@ configuration is 2 chips of 16*16 tiles, 1 of 8*8.
The shift register controls the granularity of the scroll offsets
(more details given later).
+ * Bandit is the only game known to use column major tile layout, when in this
+ mode X scrolling is also inverted, and tile character data is flipped on X.
+
Playfield priority (Bad Dudes, etc):
In the bottommost playfield, pens 8-15 can have priority over the next playfield.
In that next playfield, pens 8-15 can have priority over sprites.
@@ -60,6 +63,8 @@ Priority word (Midres):
Bit 2
Bit 3 set = ...
+ Note that priority mixing is handled outside of the BAC-06 chip.
+
*/
#include "emu.h"
@@ -87,10 +92,10 @@ deco_bac06_device::deco_bac06_device(const machine_config &mconfig, const char *
, m_gfxdecode(*this, finder_base::DUMMY_TAG)
{
for (int i = 0; i < 8; i++)
- {
- m_pf_control_0[i] = 0;
- m_pf_control_1[i] = 0;
- }
+ {
+ m_pf_control_0[i] = 0;
+ m_pf_control_1[i] = 0;
+ }
}
void deco_bac06_device::device_start()
@@ -139,31 +144,46 @@ void deco_bac06_device::set_flip_screen(bool flip)
TILEMAP_MAPPER_MEMBER(deco_bac06_device::tile_shape0_scan)
{
+ if ((m_pf_control_0[0]&2)==0)
+ {
+ int col_mask = num_cols - 1;
+ return (row & 0xf) + ((col_mask - (col & col_mask)) << 4);
+ }
return (col & 0xf) + ((row & 0xf) << 4) + ((col & 0x1f0) << 4);
}
TILEMAP_MAPPER_MEMBER(deco_bac06_device::tile_shape1_scan)
{
+ //if (m_pf_control_0[0]&2) // Needs testing on real hardware, not used by any game
+ // return (row & 0xf) + ((col & 0x1f) << 4) + ((col & 0xf0) << 5);
return (col & 0xf) + ((row & 0x1f) << 4) + ((col & 0xf0) << 5);
}
TILEMAP_MAPPER_MEMBER(deco_bac06_device::tile_shape2_scan)
{
+ //if (m_pf_control_0[0]&2) // Needs testing on real hardware, not used by any game
+ // return (col & 0xf) + ((row & 0x3f) << 4) + ((row & 0x70) << 6);
return (col & 0xf) + ((row & 0x3f) << 4) + ((col & 0x70) << 6);
}
TILEMAP_MAPPER_MEMBER(deco_bac06_device::tile_shape0_8x8_scan)
{
+ //if (m_pf_control_0[0]&2) // Needs testing on real hardware, not used by any game
+ // return (col & 0x1f) + ((row & 0x1f) << 5) + ((row & 0x60) << 5);
return (col & 0x1f) + ((row & 0x1f) << 5) + ((col & 0x60) << 5);
}
TILEMAP_MAPPER_MEMBER(deco_bac06_device::tile_shape1_8x8_scan)
{
+ //if (m_pf_control_0[0]&2) // Needs testing on real hardware, not used by any game
+ // return (row & 0x1f) + ((col & 0x1f) << 5) + ((col & 0x20) << 5) + ((row & 0x20) << 6);
return (col & 0x1f) + ((row & 0x1f) << 5) + ((row & 0x20) << 5) + ((col & 0x20) << 6);
}
TILEMAP_MAPPER_MEMBER(deco_bac06_device::tile_shape2_8x8_scan)
{
+ //if (m_pf_control_0[0]&2) // Needs testing on real hardware, not used by any game
+ // return (row & 0x1f) + ((col & 0x7f) << 5);
return (col & 0x1f) + ((row & 0x7f) << 5);
}
@@ -172,7 +192,8 @@ TILE_GET_INFO_MEMBER(deco_bac06_device::get_pf8x8_tile_info)
if (m_rambank&1) tile_index+=0x1000;
int tile=m_pf_data[tile_index];
int colourpri=(tile>>12);
- SET_TILE_INFO_MEMBER(m_tile_region_8,tile&0xfff,0,0);
+ int flags=(m_pf_control_0[0]&2) ? 0 : TILE_FLIPX;
+ SET_TILE_INFO_MEMBER(m_tile_region_8,tile&0xfff,0,flags);
tileinfo.category = colourpri;
}
@@ -181,7 +202,8 @@ TILE_GET_INFO_MEMBER(deco_bac06_device::get_pf16x16_tile_info)
if (m_rambank&1) tile_index+=0x1000;
int tile=m_pf_data[tile_index];
int colourpri=(tile>>12);
- SET_TILE_INFO_MEMBER(m_tile_region_16,tile&0xfff,0,0);
+ int flags=(m_pf_control_0[0]&2) ? 0 : TILE_FLIPX;
+ SET_TILE_INFO_MEMBER(m_tile_region_16,tile&0xfff,0,flags);
tileinfo.category = colourpri;
}
@@ -194,40 +216,38 @@ void deco_bac06_device::create_tilemaps(int region8x8, int region16x16)
m_pf8x8_tilemap[1] = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(deco_bac06_device::get_pf8x8_tile_info),this),tilemap_mapper_delegate(FUNC(deco_bac06_device::tile_shape1_8x8_scan),this), 8, 8, 64, 64);
m_pf8x8_tilemap[2] = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(deco_bac06_device::get_pf8x8_tile_info),this),tilemap_mapper_delegate(FUNC(deco_bac06_device::tile_shape2_8x8_scan),this), 8, 8, 32,128);
-
if (m_wide==2)
{
m_pf16x16_tilemap[0] = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(deco_bac06_device::get_pf16x16_tile_info),this), tilemap_mapper_delegate(FUNC(deco_bac06_device::tile_shape0_scan),this), 16, 16, 256, 16);
- m_pf16x16_tilemap[1] = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(deco_bac06_device::get_pf16x16_tile_info),this), tilemap_mapper_delegate(FUNC(deco_bac06_device::tile_shape1_scan),this), 16, 16, 128, 32);
- m_pf16x16_tilemap[2] = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(deco_bac06_device::get_pf16x16_tile_info),this), tilemap_mapper_delegate(FUNC(deco_bac06_device::tile_shape2_scan),this), 16, 16, 64, 64);
+ m_pf16x16_tilemap[1] = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(deco_bac06_device::get_pf16x16_tile_info),this), tilemap_mapper_delegate(FUNC(deco_bac06_device::tile_shape1_scan),this), 16, 16, 128, 32);
+ m_pf16x16_tilemap[2] = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(deco_bac06_device::get_pf16x16_tile_info),this), tilemap_mapper_delegate(FUNC(deco_bac06_device::tile_shape2_scan),this), 16, 16, 64, 64);
}
else if (m_wide==1)
{
m_pf16x16_tilemap[0] = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(deco_bac06_device::get_pf16x16_tile_info),this), tilemap_mapper_delegate(FUNC(deco_bac06_device::tile_shape0_scan),this), 16, 16, 128, 16);
- m_pf16x16_tilemap[1] = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(deco_bac06_device::get_pf16x16_tile_info),this), tilemap_mapper_delegate(FUNC(deco_bac06_device::tile_shape1_scan),this), 16, 16, 64, 32);
- m_pf16x16_tilemap[2] = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(deco_bac06_device::get_pf16x16_tile_info),this), tilemap_mapper_delegate(FUNC(deco_bac06_device::tile_shape2_scan),this), 16, 16, 32, 64);
+ m_pf16x16_tilemap[1] = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(deco_bac06_device::get_pf16x16_tile_info),this), tilemap_mapper_delegate(FUNC(deco_bac06_device::tile_shape1_scan),this), 16, 16, 64, 32);
+ m_pf16x16_tilemap[2] = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(deco_bac06_device::get_pf16x16_tile_info),this), tilemap_mapper_delegate(FUNC(deco_bac06_device::tile_shape2_scan),this), 16, 16, 32, 64);
}
else
{
- m_pf16x16_tilemap[0] = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(deco_bac06_device::get_pf16x16_tile_info),this),tilemap_mapper_delegate(FUNC(deco_bac06_device::tile_shape0_scan),this), 16,16, 64, 16);
- m_pf16x16_tilemap[1] = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(deco_bac06_device::get_pf16x16_tile_info),this),tilemap_mapper_delegate(FUNC(deco_bac06_device::tile_shape1_scan),this), 16,16, 32, 32);
- m_pf16x16_tilemap[2] = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(deco_bac06_device::get_pf16x16_tile_info),this),tilemap_mapper_delegate(FUNC(deco_bac06_device::tile_shape2_scan),this), 16,16, 16, 64);
+ m_pf16x16_tilemap[0] = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(deco_bac06_device::get_pf16x16_tile_info),this),tilemap_mapper_delegate(FUNC(deco_bac06_device::tile_shape0_scan),this), 16, 16, 64, 16);
+ m_pf16x16_tilemap[1] = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(deco_bac06_device::get_pf16x16_tile_info),this),tilemap_mapper_delegate(FUNC(deco_bac06_device::tile_shape1_scan),this), 16, 16, 32, 32);
+ m_pf16x16_tilemap[2] = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(deco_bac06_device::get_pf16x16_tile_info),this),tilemap_mapper_delegate(FUNC(deco_bac06_device::tile_shape2_scan),this), 16, 16, 16, 64);
}
}
void deco_bac06_device::custom_tilemap_draw(bitmap_ind16 &bitmap,
- const rectangle &cliprect,
- tilemap_t *tilemap_ptr,
- const uint16_t *rowscroll_ptr,
- const uint16_t *colscroll_ptr,
- const uint16_t *control0,
- const uint16_t *control1,
- int flags,
- uint16_t penmask,
- uint16_t pencondition,
- uint16_t colprimask,
- uint16_t colpricondition
- )
+ const rectangle &cliprect,
+ tilemap_t *tilemap_ptr,
+ const uint16_t *rowscroll_ptr,
+ const uint16_t *colscroll_ptr,
+ const uint16_t *control0,
+ const uint16_t *control1,
+ int flags,
+ uint16_t penmask,
+ uint16_t pencondition,
+ uint16_t colprimask,
+ uint16_t colpricondition)
{
const bitmap_ind16 &src_bitmap = tilemap_ptr->pixmap();
const bitmap_ind8 &flags_bitmap = tilemap_ptr->flagsmap();
@@ -238,7 +258,10 @@ void deco_bac06_device::custom_tilemap_draw(bitmap_ind16 &bitmap,
if (control1)
{
- scrollx = control1[0];
+ if (control0 && (control0[0]&2)==0) // Use of column major mode inverts scroll direction
+ scrollx = -control1[0] - 0x100;
+ else
+ scrollx = control1[0];
scrolly = control1[1];
}
@@ -282,7 +305,8 @@ void deco_bac06_device::custom_tilemap_draw(bitmap_ind16 &bitmap,
else
src_y = scrolly;
- for (y=0; y<=cliprect.bottom(); y++) {
+ for (y=0; y<=cliprect.bottom(); y++)
+ {
if (row_scroll_enabled)
src_x=scrollx + rowscroll_ptr[(src_y >> (control1[3]&0xf))&(0x1ff>>(control1[3]&0xf))];
else
@@ -291,7 +315,8 @@ void deco_bac06_device::custom_tilemap_draw(bitmap_ind16 &bitmap,
if (m_flip_screen)
src_x=(src_bitmap.width() - 256) - src_x;
- for (x=0; x<=cliprect.right(); x++) {
+ for (x=0; x<=cliprect.right(); x++)
+ {
if (col_scroll_enabled)
column_offset=colscroll_ptr[((src_x >> 3) >> (control1[2]&0xf))&(0x3f>>(control1[2]&0xf))];
@@ -342,7 +367,6 @@ void deco_bac06_device::deco_bac06_pf_draw(bitmap_ind16 &bitmap,const rectangle
if (tm)
custom_tilemap_draw(bitmap,cliprect,tm,m_pf_rowscroll.get(),m_pf_colscroll.get(),m_pf_control_0,m_pf_control_1,flags, penmask, pencondition, colprimask, colpricondition);
-
}
// used for pocket gal bootleg, which doesn't set registers properly and simply expects a fixed size tilemap.
@@ -359,10 +383,27 @@ void deco_bac06_device::deco_bac06_pf_draw_bootleg(bitmap_ind16 &bitmap,const re
WRITE16_MEMBER( deco_bac06_device::pf_control_0_w )
{
+ int old_register0 = m_pf_control_0[0];
+
offset &= 3;
COMBINE_DATA(&m_pf_control_0[offset]);
+ bool dirty_all = false;
+ if (offset==0)
+ {
+ if ((old_register0&2)!=(m_pf_control_0[offset]&2))
+ {
+ // The tilemap has changed from row major to column major or vice versa.
+ // Must force an update of the mapping.
+ for (int i = 0; i < 3; i++)
+ {
+ m_pf8x8_tilemap[i]->mark_mapping_dirty();
+ m_pf16x16_tilemap[i]->mark_mapping_dirty();
+ }
+ dirty_all = true;
+ }
+ }
if (offset==2)
{
int newbank = m_pf_control_0[offset]&1;
@@ -373,13 +414,17 @@ WRITE16_MEMBER( deco_bac06_device::pf_control_0_w )
if (strcmp(machine().system().name,"stadhero"))
printf("tilemap ram bank change to %d\n", newbank&1);
+ dirty_all = true;
m_rambank = newbank&1;
- m_pf8x8_tilemap[0]->mark_all_dirty();
- m_pf8x8_tilemap[1]->mark_all_dirty();
- m_pf8x8_tilemap[2]->mark_all_dirty();
- m_pf16x16_tilemap[0]->mark_all_dirty();
- m_pf16x16_tilemap[1]->mark_all_dirty();
- m_pf16x16_tilemap[2]->mark_all_dirty();
+ }
+ }
+
+ if (dirty_all)
+ {
+ for (int i = 0; i < 3; i++)
+ {
+ m_pf8x8_tilemap[i]->mark_all_dirty();
+ m_pf16x16_tilemap[i]->mark_all_dirty();
}
}
}
@@ -401,12 +446,12 @@ WRITE16_MEMBER( deco_bac06_device::pf_data_w )
if (m_rambank&1) offset+=0x1000;
COMBINE_DATA(&m_pf_data[offset]);
- m_pf8x8_tilemap[0]->mark_tile_dirty(offset);
- m_pf8x8_tilemap[1]->mark_tile_dirty(offset);
- m_pf8x8_tilemap[2]->mark_tile_dirty(offset);
- m_pf16x16_tilemap[0]->mark_tile_dirty(offset);
- m_pf16x16_tilemap[1]->mark_tile_dirty(offset);
- m_pf16x16_tilemap[2]->mark_tile_dirty(offset);
+
+ for (int i = 0; i < 3; i++)
+ {
+ m_pf8x8_tilemap[i]->mark_tile_dirty(offset);
+ m_pf16x16_tilemap[i]->mark_tile_dirty(offset);
+ }
}
READ16_MEMBER( deco_bac06_device::pf_data_r )
@@ -452,7 +497,7 @@ READ16_MEMBER( deco_bac06_device::pf_colscroll_r )
return m_pf_colscroll[offset];
}
-/* used by dec8.c */
+/* used by dec8.cpp */
WRITE8_MEMBER( deco_bac06_device::pf_control0_8bit_w )
{
if (offset&1)
@@ -461,7 +506,7 @@ WRITE8_MEMBER( deco_bac06_device::pf_control0_8bit_w )
pf_control_0_w(space,offset/2,data,0x00ff);
}
-/* used by dec8.c */
+/* used by dec8.cpp */
READ8_MEMBER( deco_bac06_device::pf_control1_8bit_r )
{
if (offset&1)
@@ -470,7 +515,7 @@ READ8_MEMBER( deco_bac06_device::pf_control1_8bit_r )
return pf_control_1_r(space,offset/2,0xff00)>>8;
}
-/* used by dec8.c */
+/* used by dec8.cpp */
WRITE8_MEMBER( deco_bac06_device::pf_control1_8bit_w )
{
if (offset<4) // these registers are 16-bit?
diff --git a/src/mame/video/decmxc06.cpp b/src/mame/video/decmxc06.cpp
index 76e15e189cc..fbf91e3cbaa 100644
--- a/src/mame/video/decmxc06.cpp
+++ b/src/mame/video/decmxc06.cpp
@@ -61,7 +61,7 @@ void deco_mxc06_device::draw_sprites( bitmap_ind16 &bitmap, const rectangle &cli
offs = 0;
while (offs < m_ramsize / 2)
{
- int sx, sy, code, color, w, h, flipx, flipy, incy, flash, mult, x, y;
+ int sx, sy, code, color, w, h, flipx, flipy, incy, flash, mult, x, y, parentFlipY;
sy = spriteram[offs];
sx = spriteram[offs + 2];
@@ -70,12 +70,9 @@ void deco_mxc06_device::draw_sprites( bitmap_ind16 &bitmap, const rectangle &cli
flash = sx & 0x800;
flipx = sy & 0x2000;
- flipy = sy & 0x4000;
+ parentFlipY = flipy = sy & 0x4000;
h = (1 << ((sy & 0x1800) >> 11)); /* 1x, 2x, 4x, 8x height */
w = (1 << ((sy & 0x0600) >> 9)); /* 1x, 2x, 4x, 8x width */
- /* multi width used only on the title screen? */
-
-
sx = sx & 0x01ff;
sy = sy & 0x01ff;
@@ -112,7 +109,7 @@ void deco_mxc06_device::draw_sprites( bitmap_ind16 &bitmap, const rectangle &cli
code &= ~(h - 1);
// not affected by flipscreen
- if (spriteram[offs] & 0x4000)
+ if (parentFlipY) // in the case of multi-width sprites the y flip bit is set by the parent
incy = -1;
else
{
diff --git a/src/mame/video/decodmd1.cpp b/src/mame/video/decodmd1.cpp
index 1553fcbb137..e0164ad5c55 100644
--- a/src/mame/video/decodmd1.cpp
+++ b/src/mame/video/decodmd1.cpp
@@ -195,21 +195,22 @@ void decodmd_type1_device::decodmd1_io_map(address_map &map)
map(0x00, 0xff).rw(FUNC(decodmd_type1_device::dmd_port_r), FUNC(decodmd_type1_device::dmd_port_w));
}
-MACHINE_CONFIG_START(decodmd_type1_device::device_add_mconfig)
+void decodmd_type1_device::device_add_mconfig(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("dmdcpu", Z80, XTAL(8'000'000) / 2)
- MCFG_DEVICE_PROGRAM_MAP(decodmd1_map)
- MCFG_DEVICE_IO_MAP(decodmd1_io_map)
+ Z80(config, m_cpu, XTAL(8'000'000) / 2);
+ m_cpu->set_addrmap(AS_PROGRAM, &decodmd_type1_device::decodmd1_map);
+ m_cpu->set_addrmap(AS_IO, &decodmd_type1_device::decodmd1_io_map);
- MCFG_QUANTUM_TIME(attotime::from_hz(50))
+ config.m_minimum_quantum = attotime::from_hz(50);
- MCFG_TIMER_DRIVER_ADD_PERIODIC("nmi_timer", decodmd_type1_device, dmd_nmi, attotime::from_hz(2000)) // seems a lot
+ TIMER(config, "nmi_timer").configure_periodic(FUNC(decodmd_type1_device::dmd_nmi), attotime::from_hz(2000)); // seems a lot
- MCFG_SCREEN_ADD("dmd", LCD)
- MCFG_SCREEN_SIZE(128, 16)
- MCFG_SCREEN_VISIBLE_AREA(0, 128-1, 0, 16-1)
- MCFG_SCREEN_UPDATE_DRIVER(decodmd_type1_device, screen_update)
- MCFG_SCREEN_REFRESH_RATE(50)
+ screen_device &dmd(SCREEN(config, "dmd", SCREEN_TYPE_LCD));
+ dmd.set_size(128, 16);
+ dmd.set_visarea(0, 128-1, 0, 16-1);
+ dmd.set_screen_update(FUNC(decodmd_type1_device::screen_update));
+ dmd.set_refresh_hz(50);
RAM(config, RAM_TAG).set_default_size("8K");
@@ -220,7 +221,7 @@ MACHINE_CONFIG_START(decodmd_type1_device::device_add_mconfig)
m_bitlatch->q_out_cb<5>().set(FUNC(decodmd_type1_device::rowdata_w));
m_bitlatch->q_out_cb<6>().set(FUNC(decodmd_type1_device::rowclock_w));
m_bitlatch->q_out_cb<7>().set(FUNC(decodmd_type1_device::test_w));
-MACHINE_CONFIG_END
+}
decodmd_type1_device::decodmd_type1_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
diff --git a/src/mame/video/decodmd2.cpp b/src/mame/video/decodmd2.cpp
index 087935701fb..e57a2ff79d3 100644
--- a/src/mame/video/decodmd2.cpp
+++ b/src/mame/video/decodmd2.cpp
@@ -21,18 +21,18 @@ WRITE8_MEMBER( decodmd_type2_device::bank_w )
WRITE8_MEMBER( decodmd_type2_device::crtc_address_w )
{
- m_mc6845->address_w(space,offset,data);
+ m_mc6845->address_w(data);
m_crtc_index = data;
}
READ8_MEMBER( decodmd_type2_device::crtc_status_r )
{
- return m_mc6845->register_r(space,offset);
+ return m_mc6845->register_r();
}
WRITE8_MEMBER( decodmd_type2_device::crtc_register_w )
{
- m_mc6845->register_w(space,offset,data);
+ m_mc6845->register_w(data);
m_crtc_reg[m_crtc_index] = data;
}
diff --git a/src/mame/video/decodmd3.cpp b/src/mame/video/decodmd3.cpp
index e1f67500e7b..9041d92f229 100644
--- a/src/mame/video/decodmd3.cpp
+++ b/src/mame/video/decodmd3.cpp
@@ -74,7 +74,7 @@ WRITE16_MEMBER( decodmd_type3_device::crtc_address_w )
{
if(ACCESSING_BITS_8_15)
{
- m_mc6845->address_w(space,offset,data >> 8);
+ m_mc6845->address_w(data >> 8);
m_crtc_index = data >> 8;
}
}
@@ -82,7 +82,7 @@ WRITE16_MEMBER( decodmd_type3_device::crtc_address_w )
READ16_MEMBER( decodmd_type3_device::crtc_status_r )
{
if(ACCESSING_BITS_8_15)
- return m_mc6845->register_r(space,offset);
+ return m_mc6845->register_r();
else
return 0xff;
}
@@ -93,7 +93,7 @@ WRITE16_MEMBER( decodmd_type3_device::crtc_register_w )
{
if(m_crtc_index == 9) // hack!!
data -= 0x100;
- m_mc6845->register_w(space,offset,data >> 8);
+ m_mc6845->register_w(data >> 8);
m_crtc_reg[m_crtc_index] = data >> 8;
}
}
diff --git a/src/mame/video/divebomb.cpp b/src/mame/video/divebomb.cpp
index 801f8940794..1b5bd73fdee 100644
--- a/src/mame/video/divebomb.cpp
+++ b/src/mame/video/divebomb.cpp
@@ -106,13 +106,13 @@ void divebomb_state::decode_proms(palette_device &palette, const uint8_t * rgn,
for (uint32_t i = 0; i < size; ++i)
{
uint32_t const rdata = rgn[i + size*2] & 0x0f;
- uint32_t const r = combine_4_weights(rweights, BIT(rdata, 0), BIT(rdata, 1), BIT(rdata, 2), BIT(rdata, 3));
+ uint32_t const r = combine_weights(rweights, BIT(rdata, 0), BIT(rdata, 1), BIT(rdata, 2), BIT(rdata, 3));
uint32_t const gdata = rgn[i + size] & 0x0f;
- uint32_t const g = combine_4_weights(gweights, BIT(gdata, 0), BIT(gdata, 1), BIT(gdata, 2), BIT(gdata, 3));
+ uint32_t const g = combine_weights(gweights, BIT(gdata, 0), BIT(gdata, 1), BIT(gdata, 2), BIT(gdata, 3));
uint32_t const bdata = rgn[i] & 0x0f;
- uint32_t const b = combine_4_weights(bweights, BIT(bdata, 0), BIT(bdata, 1), BIT(bdata, 2), BIT(bdata, 3));
+ uint32_t const b = combine_weights(bweights, BIT(bdata, 0), BIT(bdata, 1), BIT(bdata, 2), BIT(bdata, 3));
if (!inv)
palette.set_pen_color(index + i, rgb_t(r, g, b));
diff --git a/src/mame/video/esd16.cpp b/src/mame/video/esd16.cpp
index c36ee9ca06f..589aadecf64 100644
--- a/src/mame/video/esd16.cpp
+++ b/src/mame/video/esd16.cpp
@@ -53,73 +53,43 @@ Note: if MAME_DEBUG is defined, pressing Z with:
***************************************************************************/
-TILE_GET_INFO_MEMBER(esd16_state::get_tile_info_0)
+template<unsigned Layer>
+TILE_GET_INFO_MEMBER(esd16_state::get_tile_info)
{
- uint16_t code = m_vram_0[tile_index];
+ const u16 code = m_vram[Layer][tile_index];
SET_TILE_INFO_MEMBER(1,
code,
- m_tilemap0_color,
+ m_tilemap_color[Layer],
0);
}
-TILE_GET_INFO_MEMBER(esd16_state::get_tile_info_0_16x16)
+template<unsigned Layer>
+TILE_GET_INFO_MEMBER(esd16_state::get_tile_info_16x16)
{
- uint16_t code = m_vram_0[tile_index];
+ const u16 code = m_vram[Layer][tile_index];
SET_TILE_INFO_MEMBER(2,
code,
- m_tilemap0_color,
+ m_tilemap_color[Layer],
0);
}
-TILE_GET_INFO_MEMBER(esd16_state::get_tile_info_1)
+void esd16_state::tilemap0_color_w(u16 data)
{
- uint16_t code = m_vram_1[tile_index];
- SET_TILE_INFO_MEMBER(1,
- code,
- m_tilemap1_color,
- 0);
-}
-
-TILE_GET_INFO_MEMBER(esd16_state::get_tile_info_1_16x16)
-{
- uint16_t code = m_vram_1[tile_index];
- SET_TILE_INFO_MEMBER(2,
- code,
- m_tilemap1_color,
- 0);
-}
-
-WRITE16_MEMBER(esd16_state::esd16_vram_0_w)
-{
- COMBINE_DATA(&m_vram_0[offset]);
- m_tilemap_0->mark_tile_dirty(offset);
- m_tilemap_0_16x16->mark_tile_dirty(offset);
-}
-
-WRITE16_MEMBER(esd16_state::esd16_vram_1_w)
-{
- COMBINE_DATA(&m_vram_1[offset]);
- m_tilemap_1->mark_tile_dirty(offset);
- m_tilemap_1_16x16->mark_tile_dirty(offset);
-}
-
-WRITE16_MEMBER(esd16_state::esd16_tilemap0_color_w)
-{
- m_tilemap0_color = data & 0x03;
- m_tilemap_0->mark_all_dirty();
- m_tilemap_0_16x16->mark_all_dirty();
+ m_tilemap_color[0] = data & 0x03;
+ m_tilemap[0]->mark_all_dirty();
+ m_tilemap_16x16[0]->mark_all_dirty();
bool flip = BIT(data, 7);
flip_screen_set(flip);
m_sprgen->set_flip_screen(flip);
}
-WRITE16_MEMBER(esd16_state::esd16_tilemap0_color_jumppop_w)
+void esd16_state::tilemap0_color_jumppop_w(u16 data)
{
// todo
- m_tilemap0_color = 2;
- m_tilemap1_color = 1;
+ m_tilemap_color[0] = 2;
+ m_tilemap_color[1] = 1;
bool flip = BIT(data, 7);
flip_screen_set(flip);
@@ -138,22 +108,22 @@ WRITE16_MEMBER(esd16_state::esd16_tilemap0_color_jumppop_w)
void esd16_state::video_start()
{
- m_tilemap_0 = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(esd16_state::get_tile_info_0),this), TILEMAP_SCAN_ROWS, 8, 8, 0x80, 0x40);
- m_tilemap_1 = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(esd16_state::get_tile_info_1),this), TILEMAP_SCAN_ROWS, 8, 8, 0x80, 0x40);
+ m_tilemap[0] = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(esd16_state::get_tile_info<0>),this), TILEMAP_SCAN_ROWS, 8, 8, 0x80, 0x40);
+ m_tilemap[1] = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(esd16_state::get_tile_info<1>),this), TILEMAP_SCAN_ROWS, 8, 8, 0x80, 0x40);
/* swatpolc changes tilemap 0 to 16x16 at various times */
- m_tilemap_0_16x16 = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(esd16_state::get_tile_info_0_16x16),this), TILEMAP_SCAN_ROWS, 16,16, 0x40, 0x40);
+ m_tilemap_16x16[0] = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(esd16_state::get_tile_info_16x16<0>),this), TILEMAP_SCAN_ROWS, 16,16, 0x40, 0x40);
/* hedpanic changes tilemap 1 to 16x16 at various times */
- m_tilemap_1_16x16 = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(esd16_state::get_tile_info_1_16x16),this), TILEMAP_SCAN_ROWS, 16,16, 0x40, 0x40);
+ m_tilemap_16x16[1] = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(esd16_state::get_tile_info_16x16<1>),this), TILEMAP_SCAN_ROWS, 16,16, 0x40, 0x40);
- m_tilemap_0->set_scrolldx(-0x60 + 2, -0x60);
- m_tilemap_1->set_scrolldx(-0x60, -0x60 + 2);
- m_tilemap_0_16x16->set_scrolldx(-0x60 + 2, -0x60);
- m_tilemap_1_16x16->set_scrolldx(-0x60, -0x60 + 2);
+ m_tilemap[0]->set_scrolldx(-0x60 + 2, -0x60);
+ m_tilemap[1]->set_scrolldx(-0x60, -0x60 + 2);
+ m_tilemap_16x16[0]->set_scrolldx(-0x60 + 2, -0x60);
+ m_tilemap_16x16[1]->set_scrolldx(-0x60, -0x60 + 2);
- m_tilemap_1->set_transparent_pen(0x00);
- m_tilemap_1_16x16->set_transparent_pen(0x00);
+ m_tilemap[1]->set_transparent_pen(0x00);
+ m_tilemap_16x16[1]->set_transparent_pen(0x00);
}
@@ -165,7 +135,7 @@ void esd16_state::video_start()
***************************************************************************/
-uint32_t esd16_state::screen_update_hedpanic(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
+u32 esd16_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{
int layers_ctrl = -1;
@@ -186,15 +156,15 @@ if (machine().input().code_pressed(KEYCODE_Z))
{
if (m_head_layersize[0] & 0x0001)
{
- m_tilemap_0_16x16->set_scrollx(0, m_scroll_0[0]);
- m_tilemap_0_16x16->set_scrolly(0, m_scroll_0[1]);
- m_tilemap_0_16x16->draw(screen, bitmap, cliprect, 0, 0);
+ m_tilemap_16x16[0]->set_scrollx(0, m_scroll[0][0]);
+ m_tilemap_16x16[0]->set_scrolly(0, m_scroll[0][1]);
+ m_tilemap_16x16[0]->draw(screen, bitmap, cliprect, 0, 0);
}
else
{
- m_tilemap_0->set_scrollx(0, m_scroll_0[0]);
- m_tilemap_0->set_scrolly(0, m_scroll_0[1]);
- m_tilemap_0->draw(screen, bitmap, cliprect, 0, 0);
+ m_tilemap[0]->set_scrollx(0, m_scroll[0][0]);
+ m_tilemap[0]->set_scrolly(0, m_scroll[0][1]);
+ m_tilemap[0]->draw(screen, bitmap, cliprect, 0, 0);
}
}
else
@@ -207,15 +177,15 @@ if (machine().input().code_pressed(KEYCODE_Z))
{
if (m_head_layersize[0] & 0x0002)
{
- m_tilemap_1_16x16->set_scrollx(0, m_scroll_1[0]);
- m_tilemap_1_16x16->set_scrolly(0, m_scroll_1[1]);
- m_tilemap_1_16x16->draw(screen, bitmap, cliprect, 0, 1);
+ m_tilemap_16x16[1]->set_scrollx(0, m_scroll[1][0]);
+ m_tilemap_16x16[1]->set_scrolly(0, m_scroll[1][1]);
+ m_tilemap_16x16[1]->draw(screen, bitmap, cliprect, 0, 1);
}
else
{
- m_tilemap_1->set_scrollx(0, m_scroll_1[0]);
- m_tilemap_1->set_scrolly(0, m_scroll_1[1]);
- m_tilemap_1->draw(screen, bitmap, cliprect, 0, 1);
+ m_tilemap[1]->set_scrollx(0, m_scroll[1][0]);
+ m_tilemap[1]->set_scrolly(0, m_scroll[1][1]);
+ m_tilemap[1]->draw(screen, bitmap, cliprect, 0, 1);
}
}
diff --git a/src/mame/video/exerion.cpp b/src/mame/video/exerion.cpp
index feaaa9246f4..459824cb202 100644
--- a/src/mame/video/exerion.cpp
+++ b/src/mame/video/exerion.cpp
@@ -58,18 +58,18 @@ void exerion_state::exerion_palette(palette_device &palette) const
bit0 = BIT(color_prom[i], 0);
bit1 = BIT(color_prom[i], 1);
bit2 = BIT(color_prom[i], 2);
- int const r = combine_3_weights(rweights, bit0, bit1, bit2);
+ int const r = combine_weights(rweights, bit0, bit1, bit2);
// green component
bit0 = BIT(color_prom[i], 3);
bit1 = BIT(color_prom[i], 4);
bit2 = BIT(color_prom[i], 5);
- int const g = combine_3_weights(gweights, bit0, bit1, bit2);
+ int const g = combine_weights(gweights, bit0, bit1, bit2);
// blue component
bit0 = BIT(color_prom[i], 6);
bit1 = BIT(color_prom[i], 7);
- int const b = combine_2_weights(bweights, bit0, bit1);
+ int const b = combine_weights(bweights, bit0, bit1);
palette.set_indirect_color(i, rgb_t(r, g, b));
}
diff --git a/src/mame/video/exidy440.cpp b/src/mame/video/exidy440.cpp
index 12de6ba3be0..c3a09628098 100644
--- a/src/mame/video/exidy440.cpp
+++ b/src/mame/video/exidy440.cpp
@@ -460,22 +460,23 @@ uint32_t topsecex_state::screen_update_topsecex(screen_device &screen, bitmap_in
*
*************************************/
-MACHINE_CONFIG_START(exidy440_state::exidy440_video)
- MCFG_PALETTE_ADD("palette", 256)
-
- screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
- screen.set_video_attributes(VIDEO_ALWAYS_UPDATE);
- screen.set_raw(PIXEL_CLOCK, HTOTAL, HBEND, HBSTART, VTOTAL, VBEND, VBSTART);
- screen.set_screen_update(FUNC(exidy440_state::screen_update_exidy440));
- screen.set_palette(m_palette);
- screen.screen_vblank().set(FUNC(exidy440_state::vblank_interrupt_w));
- screen.screen_vblank().append(m_custom, FUNC(exidy440_sound_device::sound_interrupt_w));
-MACHINE_CONFIG_END
-
-
-MACHINE_CONFIG_START(topsecex_state::topsecex_video)
- MCFG_SCREEN_MODIFY("screen")
- MCFG_SCREEN_VIDEO_ATTRIBUTES(0)
- MCFG_SCREEN_RAW_PARAMS(PIXEL_CLOCK, HTOTAL, HBEND, HBSTART, VTOTAL, VBEND, TOPSECEX_VBSTART)
- MCFG_SCREEN_UPDATE_DRIVER(topsecex_state, screen_update_topsecex)
-MACHINE_CONFIG_END
+void exidy440_state::exidy440_video(machine_config &config)
+{
+ PALETTE(config, m_palette). set_entries(256);
+
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_video_attributes(VIDEO_ALWAYS_UPDATE);
+ m_screen->set_raw(PIXEL_CLOCK, HTOTAL, HBEND, HBSTART, VTOTAL, VBEND, VBSTART);
+ m_screen->set_screen_update(FUNC(exidy440_state::screen_update_exidy440));
+ m_screen->set_palette(m_palette);
+ m_screen->screen_vblank().set(FUNC(exidy440_state::vblank_interrupt_w));
+ m_screen->screen_vblank().append(m_custom, FUNC(exidy440_sound_device::sound_interrupt_w));
+}
+
+
+void topsecex_state::topsecex_video(machine_config &config)
+{
+ m_screen->set_video_attributes(0);
+ m_screen->set_raw(PIXEL_CLOCK, HTOTAL, HBEND, HBSTART, VTOTAL, VBEND, TOPSECEX_VBSTART);
+ m_screen->set_screen_update(FUNC(topsecex_state::screen_update_topsecex));
+}
diff --git a/src/mame/video/fastfred.cpp b/src/mame/video/fastfred.cpp
index 73aad7722d0..13ae8f0c554 100644
--- a/src/mame/video/fastfred.cpp
+++ b/src/mame/video/fastfred.cpp
@@ -47,21 +47,21 @@ void fastfred_state::fastfred_palette(palette_device &palette) const
bit1 = BIT(color_prom[i | 0x000], 1);
bit2 = BIT(color_prom[i | 0x000], 2);
bit3 = BIT(color_prom[i | 0x000], 3);
- int const r = combine_4_weights(rweights, bit0, bit1, bit2, bit3);
+ int const r = combine_weights(rweights, bit0, bit1, bit2, bit3);
// green component
bit0 = BIT(color_prom[i | 0x100], 0);
bit1 = BIT(color_prom[i | 0x100], 1);
bit2 = BIT(color_prom[i | 0x100], 2);
bit3 = BIT(color_prom[i | 0x100], 3);
- int const g = combine_4_weights(gweights, bit0, bit1, bit2, bit3);
+ int const g = combine_weights(gweights, bit0, bit1, bit2, bit3);
// blue component
bit0 = BIT(color_prom[i | 0x200], 0);
bit1 = BIT(color_prom[i | 0x200], 1);
bit2 = BIT(color_prom[i | 0x200], 2);
bit3 = BIT(color_prom[i | 0x200], 3);
- int const b = combine_4_weights(bweights, bit0, bit1, bit2, bit3);
+ int const b = combine_weights(bweights, bit0, bit1, bit2, bit3);
palette.set_indirect_color(i, rgb_t(r, g, b));
}
diff --git a/src/mame/video/finalizr.cpp b/src/mame/video/finalizr.cpp
index 279e77bced8..e0f05132bb8 100644
--- a/src/mame/video/finalizr.cpp
+++ b/src/mame/video/finalizr.cpp
@@ -57,21 +57,21 @@ void finalizr_state::finalizr_palette(palette_device &palette) const
bit1 = BIT(color_prom[i], 1);
bit2 = BIT(color_prom[i], 2);
bit3 = BIT(color_prom[i], 3);
- int const r = combine_4_weights(rweights, bit0, bit1, bit2, bit3);
+ int const r = combine_weights(rweights, bit0, bit1, bit2, bit3);
// green component
bit0 = BIT(color_prom[i], 4);
bit1 = BIT(color_prom[i], 5);
bit2 = BIT(color_prom[i], 6);
bit3 = BIT(color_prom[i], 7);
- int const g = combine_4_weights(gweights, bit0, bit1, bit2, bit3);
+ int const g = combine_weights(gweights, bit0, bit1, bit2, bit3);
// blue component
bit0 = BIT(color_prom[i + 0x20], 0);
bit1 = BIT(color_prom[i + 0x20], 1);
bit2 = BIT(color_prom[i + 0x20], 2);
bit3 = BIT(color_prom[i + 0x20], 3);
- int const b = combine_4_weights(bweights, bit0, bit1, bit2, bit3);
+ int const b = combine_weights(bweights, bit0, bit1, bit2, bit3);
palette.set_indirect_color(i, rgb_t(r, g, b));
}
diff --git a/src/mame/video/foodf.cpp b/src/mame/video/foodf.cpp
index b2ea49556b3..92ab95dc0ff 100644
--- a/src/mame/video/foodf.cpp
+++ b/src/mame/video/foodf.cpp
@@ -85,18 +85,18 @@ WRITE16_MEMBER(foodf_state::foodf_paletteram_w)
bit0 = (newword >> 0) & 0x01;
bit1 = (newword >> 1) & 0x01;
bit2 = (newword >> 2) & 0x01;
- r = combine_3_weights(m_rweights, bit0, bit1, bit2);
+ r = combine_weights(m_rweights, bit0, bit1, bit2);
/* green component */
bit0 = (newword >> 3) & 0x01;
bit1 = (newword >> 4) & 0x01;
bit2 = (newword >> 5) & 0x01;
- g = combine_3_weights(m_gweights, bit0, bit1, bit2);
+ g = combine_weights(m_gweights, bit0, bit1, bit2);
/* blue component */
bit0 = (newword >> 6) & 0x01;
bit1 = (newword >> 7) & 0x01;
- b = combine_2_weights(m_bweights, bit0, bit1);
+ b = combine_weights(m_bweights, bit0, bit1);
m_palette->set_pen_color(offset, rgb_t(r, g, b));
}
diff --git a/src/mame/video/funworld.cpp b/src/mame/video/funworld.cpp
index cd8b298c8af..82345499aa2 100644
--- a/src/mame/video/funworld.cpp
+++ b/src/mame/video/funworld.cpp
@@ -70,16 +70,16 @@ void funworld_state::funworld_palette(palette_device &palette) const
bit0 = BIT(color_prom[i], 0);
bit1 = BIT(color_prom[i], 1);
bit2 = BIT(color_prom[i], 2);
- int const r = combine_3_weights(weights_r, bit0, bit1, bit2);
+ int const r = combine_weights(weights_r, bit0, bit1, bit2);
// blue component
bit0 = BIT(color_prom[i], 3);
bit1 = BIT(color_prom[i], 4);
bit2 = BIT(color_prom[i], 5);
- int const b = combine_3_weights(weights_b, bit0, bit1, bit2);
+ int const b = combine_weights(weights_b, bit0, bit1, bit2);
// green component
bit0 = BIT(color_prom[i], 6);
bit1 = BIT(color_prom[i], 7);
- int const g = combine_2_weights(weights_g, bit0, bit1);
+ int const g = combine_weights(weights_g, bit0, bit1);
palette.set_pen_color(i, rgb_t(r, g, b));
}
@@ -110,9 +110,9 @@ WRITE8_MEMBER(funworld_state::funworld_colorram_w)
TILE_GET_INFO_MEMBER(funworld_state::get_bg_tile_info)
{
/* - bits -
- 7654 3210
- xxxx ---- tiles color.
- ---- xxxx unused.
+ 7654 3210
+ xxxx ---- tiles color.
+ ---- xxxx unused.
*/
int offs = tile_index;
int attr = m_videoram[offs] + (m_colorram[offs] << 8);
diff --git a/src/mame/video/gaelco2.cpp b/src/mame/video/gaelco2.cpp
index 5632581de32..3c6e5403da8 100644
--- a/src/mame/video/gaelco2.cpp
+++ b/src/mame/video/gaelco2.cpp
@@ -104,20 +104,12 @@ Multi monitor notes:
***************************************************************************/
-TILE_GET_INFO_MEMBER(gaelco2_state::get_tile_info_gaelco2_screen0)
+template<unsigned Layer>
+TILE_GET_INFO_MEMBER(gaelco2_state::get_tile_info)
{
- int data = m_videoram[(((m_vregs[0] >> 9) & 0x07)*0x2000/2) + (tile_index << 1)];
- int data2 = m_videoram[(((m_vregs[0] >> 9) & 0x07)*0x2000/2) + ((tile_index << 1) + 1)];
- int code = ((data & 0x07) << 16) | (data2 & 0xffff);
-
- SET_TILE_INFO_MEMBER(0, code, ((data >> 9) & 0x7f), TILE_FLIPXY((data >> 6) & 0x03));
-}
-
-TILE_GET_INFO_MEMBER(gaelco2_state::get_tile_info_gaelco2_screen1)
-{
- int data = m_videoram[(((m_vregs[1] >> 9) & 0x07)*0x2000/2) + (tile_index << 1)];
- int data2 = m_videoram[(((m_vregs[1] >> 9) & 0x07)*0x2000/2) + ((tile_index << 1) + 1)];
- int code = ((data & 0x07) << 16) | (data2 & 0xffff);
+ const u16 data = m_videoram[(((m_vregs[Layer] >> 9) & 0x07) * 0x2000 / 2) + (tile_index << 1)];
+ const u16 data2 = m_videoram[(((m_vregs[Layer] >> 9) & 0x07) * 0x2000 / 2) + ((tile_index << 1) + 1)];
+ const u32 code = ((data & 0x07) << 16) | (data2 & 0xffff);
SET_TILE_INFO_MEMBER(0, code, ((data >> 9) & 0x7f), TILE_FLIPXY((data >> 6) & 0x03));
}
@@ -145,22 +137,14 @@ TILE_GET_INFO_MEMBER(gaelco2_state::get_tile_info_gaelco2_screen1)
***************************************************************************/
-TILE_GET_INFO_MEMBER(gaelco2_state::get_tile_info_gaelco2_screen0_dual)
-{
- int data = m_videoram[(((m_vregs[0] >> 9) & 0x07)*0x2000/2) + (tile_index << 1)];
- int data2 = m_videoram[(((m_vregs[0] >> 9) & 0x07)*0x2000/2) + ((tile_index << 1) + 1)];
- int code = ((data & 0x07) << 16) | (data2 & 0xffff);
-
- SET_TILE_INFO_MEMBER(0, code, ((data >> 9) & 0x3f), TILE_FLIPXY((data >> 6) & 0x03));
-}
-
-TILE_GET_INFO_MEMBER(gaelco2_state::get_tile_info_gaelco2_screen1_dual)
+template<unsigned Layer>
+TILE_GET_INFO_MEMBER(gaelco2_state::get_tile_info_dual)
{
- int data = m_videoram[(((m_vregs[1] >> 9) & 0x07)*0x2000/2) + (tile_index << 1)];
- int data2 = m_videoram[(((m_vregs[1] >> 9) & 0x07)*0x2000/2) + ((tile_index << 1) + 1)];
- int code = ((data & 0x07) << 16) | (data2 & 0xffff);
+ const u16 data = m_videoram[(((m_vregs[Layer] >> 9) & 0x07) * 0x2000 / 2) + (tile_index << 1)];
+ const u16 data2 = m_videoram[(((m_vregs[Layer] >> 9) & 0x07) * 0x2000 / 2) + ((tile_index << 1) + 1)];
+ const u32 code = ((data & 0x07) << 16) | (data2 & 0xffff);
- SET_TILE_INFO_MEMBER(0, code, 0x40 + ((data >> 9) & 0x3f), TILE_FLIPXY((data >> 6) & 0x03));
+ SET_TILE_INFO_MEMBER(0, code, (Layer * 0x40) + ((data >> 9) & 0x3f), TILE_FLIPXY((data >> 6) & 0x03));
}
@@ -170,23 +154,38 @@ TILE_GET_INFO_MEMBER(gaelco2_state::get_tile_info_gaelco2_screen1_dual)
***************************************************************************/
-WRITE16_MEMBER(gaelco2_state::gaelco2_vram_w)
+void gaelco2_state::vram_w(offs_t offset, u16 data, u16 mem_mask)
{
- int pant0_start = ((m_vregs[0] >> 9) & 0x07)*0x1000;
- int pant0_end = pant0_start + 0x1000;
- int pant1_start = ((m_vregs[1] >> 9) & 0x07)*0x1000;
- int pant1_end = pant1_start + 0x1000;
+ const u32 pant0_start = ((m_vregs[0] >> 9) & 0x07) * 0x1000;
+ const u32 pant0_end = pant0_start + 0x1000;
+ const u32 pant1_start = ((m_vregs[1] >> 9) & 0x07) * 0x1000;
+ const u32 pant1_end = pant1_start + 0x1000;
COMBINE_DATA(&m_videoram[offset]);
/* tilemap 0 writes */
- if ((offset >= pant0_start) && (offset < pant0_end)){
+ if ((offset >= pant0_start) && (offset < pant0_end))
m_pant[0]->mark_tile_dirty(((offset << 1) & 0x1fff) >> 2);
- }
/* tilemap 1 writes */
- if ((offset >= pant1_start) && (offset < pant1_end)){
+ if ((offset >= pant1_start) && (offset < pant1_end))
m_pant[1]->mark_tile_dirty(((offset << 1) & 0x1fff) >> 2);
+
+}
+
+void gaelco2_state::vregs_w(offs_t offset, u16 data, u16 mem_mask)
+{
+ u16 old = m_vregs[offset];
+ data = COMBINE_DATA(&m_vregs[offset]);
+ switch (offset)
+ {
+ case 0:
+ case 1:
+ if (((old ^ data) >> 9) & 7) // tilemap ram offset
+ {
+ m_pant[offset]->mark_all_dirty();
+ }
+ break;
}
}
@@ -210,44 +209,39 @@ WRITE16_MEMBER(gaelco2_state::gaelco2_vram_w)
***************************************************************************/
-#define RGB_CHG 0x08
-#define ADJUST_COLOR(c) ((c < 0) ? 0 : ((c > 255) ? 255 : c))
+static constexpr u8 RGB_CHG = 0x08;
+static inline const u8 ADJUST_COLOR(s16 c) { return (c < 0) ? 0 : ((c > 255) ? 255 : c); }
/* table used for color adjustment */
-static const int pen_color_adjust[16] = {
- +RGB_CHG*0, -RGB_CHG*1, -RGB_CHG*2, -RGB_CHG*3, -RGB_CHG*4, -RGB_CHG*5, -RGB_CHG*6, -RGB_CHG*7,
- +RGB_CHG*8, +RGB_CHG*7, +RGB_CHG*6, +RGB_CHG*5, +RGB_CHG*4, +RGB_CHG*3, +RGB_CHG*2, +RGB_CHG*1
+static const s8 pen_color_adjust[16] = {
+ +RGB_CHG * 0, -RGB_CHG * 1, -RGB_CHG * 2, -RGB_CHG * 3, -RGB_CHG * 4, -RGB_CHG * 5, -RGB_CHG * 6, -RGB_CHG * 7,
+ +RGB_CHG * 8, +RGB_CHG * 7, +RGB_CHG * 6, +RGB_CHG * 5, +RGB_CHG * 4, +RGB_CHG * 3, +RGB_CHG * 2, +RGB_CHG * 1
};
-WRITE16_MEMBER(gaelco2_state::gaelco2_palette_w)
+void gaelco2_state::palette_w(offs_t offset, u16 data, u16 mem_mask)
{
- int i, color, r, g, b, auxr, auxg, auxb;
-
- COMBINE_DATA(&m_generic_paletteram_16[offset]);
- color = m_generic_paletteram_16[offset];
+ COMBINE_DATA(&m_paletteram[offset]);
+ const u16 color = m_paletteram[offset];
/* extract RGB components */
- r = (color >> 10) & 0x1f;
- g = (color >> 5) & 0x1f;
- b = (color >> 0) & 0x1f;
-
- r = pal5bit(r);
- g = pal5bit(g);
- b = pal5bit(b);
+ const u8 r = pal5bit(color >> 10);
+ const u8 g = pal5bit(color >> 5);
+ const u8 b = pal5bit(color & 0x1f);
/* update game palette */
m_palette->set_pen_color(4096*0 + offset, rgb_t(r, g, b));
- /* update shadow/highligh palettes */
- for (i = 1; i < 16; i++){
+ /* update shadow/highlight palettes */
+ for (int i = 1; i < 16; i++)
+ {
/* because the last palette entry is reserved for shadows and highlights, we
don't use it and that way we save some colors so the UI looks fine ;-) */
if ((offset >= 0xff0) && (offset <= 0xfff)) return;
- auxr = ADJUST_COLOR(r + pen_color_adjust[i]);
- auxg = ADJUST_COLOR(g + pen_color_adjust[i]);
- auxb = ADJUST_COLOR(b + pen_color_adjust[i]);
+ const u8 auxr = ADJUST_COLOR(r + pen_color_adjust[i]);
+ const u8 auxg = ADJUST_COLOR(g + pen_color_adjust[i]);
+ const u8 auxb = ADJUST_COLOR(b + pen_color_adjust[i]);
m_palette->set_pen_color(4096*i + offset, rgb_t(auxr, auxg, auxb));
}
@@ -264,8 +258,8 @@ VIDEO_START_MEMBER(gaelco2_state,gaelco2)
m_videoram = m_spriteram->live();
/* create tilemaps */
- m_pant[0] = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(gaelco2_state::get_tile_info_gaelco2_screen0),this),TILEMAP_SCAN_ROWS,16,16,64,32);
- m_pant[1] = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(gaelco2_state::get_tile_info_gaelco2_screen1),this),TILEMAP_SCAN_ROWS,16,16,64,32);
+ m_pant[0] = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(gaelco2_state::get_tile_info<0>),this),TILEMAP_SCAN_ROWS,16,16,64,32);
+ m_pant[1] = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(gaelco2_state::get_tile_info<1>),this),TILEMAP_SCAN_ROWS,16,16,64,32);
/* set tilemap properties */
m_pant[0]->set_transparent_pen(0);
@@ -284,8 +278,8 @@ VIDEO_START_MEMBER(gaelco2_state,gaelco2_dual)
m_videoram = m_spriteram->live();
/* create tilemaps */
- m_pant[0] = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(gaelco2_state::get_tile_info_gaelco2_screen0_dual),this),TILEMAP_SCAN_ROWS,16,16,64,32);
- m_pant[1] = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(gaelco2_state::get_tile_info_gaelco2_screen1_dual),this),TILEMAP_SCAN_ROWS,16,16,64,32);
+ m_pant[0] = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(gaelco2_state::get_tile_info_dual<0>),this),TILEMAP_SCAN_ROWS,16,16,64,32);
+ m_pant[1] = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(gaelco2_state::get_tile_info_dual<1>),this),TILEMAP_SCAN_ROWS,16,16,64,32);
/* set tilemap properties */
m_pant[0]->set_transparent_pen(0);
@@ -335,80 +329,87 @@ VIDEO_START_MEMBER(gaelco2_state,gaelco2_dual)
***************************************************************************/
-void gaelco2_state::draw_sprites(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, int mask, int xoffs)
+void gaelco2_state::draw_sprites(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, int mask)
{
- uint16_t *buffered_spriteram16 = m_spriteram->buffer();
- int j, x, y, ex, ey, px, py;
+ u16 *buffered_spriteram16 = m_spriteram->buffer();
gfx_element *gfx = m_gfxdecode->gfx(0);
/* get sprite ram start and end offsets */
- int start_offset = (m_vregs[1] & 0x10)*0x100;
- int end_offset = start_offset + 0x1000;
+ const u32 start_offset = (m_vregs[1] & 0x10) * 0x100;
+ const u32 end_offset = start_offset + 0x1000;
- /* sprite offset is based on the visible area */
- int spr_x_adjust = (screen.visible_area().max_x - 320 + 1) - (511 - 320 - 1) - ((m_vregs[0] >> 4) & 0x01) + xoffs;
+ /* sprite offset is based on the visible area - this seems very kludgy */
+ const int spr_x_adjust = (screen.visible_area().max_x - 320 + 1) - (511 - 320 - 1) - ((m_vregs[0] >> 4) & 0x01) + m_global_spritexoff;
- for (j = start_offset; j < end_offset; j += 8){
- int data = buffered_spriteram16[(j/2) + 0];
- int data2 = buffered_spriteram16[(j/2) + 1];
- int data3 = buffered_spriteram16[(j/2) + 2];
- int data4 = buffered_spriteram16[(j/2) + 3];
+ for (int j = start_offset; j < end_offset; j += 8)
+ {
+ const u16 data = buffered_spriteram16[(j / 2) + 0];
+ const u16 data2 = buffered_spriteram16[(j / 2) + 1];
+ const u16 data3 = buffered_spriteram16[(j / 2) + 2];
+ const u16 data4 = buffered_spriteram16[(j / 2) + 3];
- int sx = data3 & 0x3ff;
- int sy = data2 & 0x1ff;
+ const int sx = data3 & 0x3ff;
+ const int sy = data2 & 0x1ff;
- int xflip = data2 & 0x800;
- int yflip = data2 & 0x400;
+ const bool xflip = data2 & 0x800;
+ const bool yflip = data2 & 0x400;
- int xsize = ((data3 >> 12) & 0x0f) + 1;
- int ysize = ((data2 >> 12) & 0x0f) + 1;
+ const int xsize = ((data3 >> 12) & 0x0f) + 1;
+ const int ysize = ((data2 >> 12) & 0x0f) + 1;
if (m_dual_monitor && ((data & 0x8000) != mask)) continue;
/* if it's enabled, draw it */
- if ((data2 & 0x0200) != 0){
- for (y = 0; y < ysize; y++){
- for (x = 0; x < xsize; x++){
+ if ((data2 & 0x0200) != 0)
+ {
+ for (int y = 0; y < ysize; y++)
+ {
+ for (int x = 0; x < xsize; x++)
+ {
/* for each x,y of the sprite, fetch the sprite data */
- int data5 = buffered_spriteram16[((data4/2) + (y*xsize + x)) & 0x7fff];
- int number = ((data & 0x1ff) << 10) + (data5 & 0x0fff);
- int color = ((data >> 9) & 0x7f) + ((data5 >> 12) & 0x0f);
- int color_effect = m_dual_monitor ? ((color & 0x3f) == 0x3f) : (color == 0x7f);
+ const u16 data5 = buffered_spriteram16[((data4 / 2) + (y*xsize + x)) & 0x7fff];
+ const u32 number = ((data & 0x1ff) << 10) + (data5 & 0x0fff);
+ const u32 color = ((data >> 9) & 0x7f) + ((data5 >> 12) & 0x0f);
+ const bool color_effect = m_dual_monitor ? ((color & 0x3f) == 0x3f) : (color == 0x7f);
- ex = xflip ? (xsize - 1 - x) : x;
- ey = yflip ? (ysize - 1 - y) : y;
+ const int ex = xflip ? (xsize - 1 - x) : x;
+ const int ey = yflip ? (ysize - 1 - y) : y;
/* normal sprite, pen 0 transparent */
- if (color_effect == 0){
+ if (!color_effect)
+ {
gfx->transpen(bitmap,cliprect, number,
color, xflip, yflip,
- ((sx + ex*16) & 0x3ff) + spr_x_adjust,
- ((sy + ey*16) & 0x1ff), 0);
-
- } else { /* last palette entry is reserved for shadows and highlights */
+ ((sx + ex * 16) & 0x3ff) + spr_x_adjust,
+ ((sy + ey * 16) & 0x1ff), 0);
+ }
+ else
+ { /* last palette entry is reserved for shadows and highlights */
/* get a pointer to the current sprite's gfx data */
const uint8_t *gfx_src = gfx->get_data(number % gfx->elements());
- for (py = 0; py < gfx->height(); py++){
+ for (int py = 0; py < gfx->height(); py++)
+ {
/* get a pointer to the current line in the screen bitmap */
- int ypos = ((sy + ey*16 + py) & 0x1ff);
- uint16_t *srcy = &bitmap.pix16(ypos);
+ const int ypos = ((sy + ey * 16 + py) & 0x1ff);
+ u16 *srcy = &bitmap.pix16(ypos);
- int gfx_py = yflip ? (gfx->height() - 1 - py) : py;
+ const int gfx_py = yflip ? (gfx->height() - 1 - py) : py;
if ((ypos < cliprect.min_y) || (ypos > cliprect.max_y)) continue;
- for (px = 0; px < gfx->width(); px++){
+ for (int px = 0; px < gfx->width(); px++)
+ {
/* get current pixel */
- int xpos = (((sx + ex*16 + px) & 0x3ff) + spr_x_adjust) & 0x3ff;
- uint16_t *pixel = srcy + xpos;
- int src_color = *pixel;
+ const int xpos = (((sx + ex * 16 + px) & 0x3ff) + spr_x_adjust) & 0x3ff;
+ u16 *pixel = srcy + xpos;
+ const u16 src_color = *pixel;
- int gfx_px = xflip ? (gfx->width() - 1 - px) : px;
+ const int gfx_px = xflip ? (gfx->width() - 1 - px) : px;
/* get asociated pen for the current sprite pixel */
- int gfx_pen = gfx_src[gfx->rowbytes()*gfx_py + gfx_px];
+ const u8 gfx_pen = gfx_src[gfx->rowbytes() * gfx_py + gfx_px];
if ((gfx_pen == 0) || (gfx_pen >= 16)) continue;
@@ -431,29 +432,28 @@ void gaelco2_state::draw_sprites(screen_device &screen, bitmap_ind16 &bitmap, co
***************************************************************************/
-uint32_t gaelco2_state::screen_update_gaelco2(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
+u32 gaelco2_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{
- int i;
-
int xoff0 = 0x14;
int xoff1 = xoff0 - 4;
int yoff0 = 0x01;
int yoff1 = 0x01;
/* read scroll values */
- int scroll0x = m_videoram[0x2802/2] + xoff0;
- int scroll1x = m_videoram[0x2806/2] + xoff1;
- int scroll0y = m_videoram[0x2800/2] + yoff0;
- int scroll1y = m_videoram[0x2804/2] + yoff1;
+ int scroll0x = m_videoram[0x2802 / 2] + xoff0;
+ int scroll1x = m_videoram[0x2806 / 2] + xoff1;
+ int scroll0y = m_videoram[0x2800 / 2] + yoff0;
+ int scroll1y = m_videoram[0x2804 / 2] + yoff1;
/* set y scroll registers */
m_pant[0]->set_scrolly(0, scroll0y & 0x1ff);
m_pant[1]->set_scrolly(0, scroll1y & 0x1ff);
/* set x linescroll registers */
- for (i = 0; i < 512; i++){
- m_pant[0]->set_scrollx(i & 0x1ff, (m_vregs[0] & 0x8000) ? (m_videoram[(0x2000/2) + i] + xoff0) & 0x3ff : scroll0x & 0x3ff);
- m_pant[1]->set_scrollx(i & 0x1ff, (m_vregs[1] & 0x8000) ? (m_videoram[(0x2400/2) + i] + xoff1) & 0x3ff : scroll1x & 0x3ff);
+ for (int i = 0; i < 512; i++)
+ {
+ m_pant[0]->set_scrollx(i & 0x1ff, (m_vregs[0] & 0x8000) ? (m_videoram[(0x2000 / 2) + i] + xoff0) & 0x3ff : scroll0x & 0x3ff);
+ m_pant[1]->set_scrollx(i & 0x1ff, (m_vregs[1] & 0x8000) ? (m_videoram[(0x2400 / 2) + i] + xoff1) & 0x3ff : scroll1x & 0x3ff);
}
/* draw screen */
@@ -461,24 +461,22 @@ uint32_t gaelco2_state::screen_update_gaelco2(screen_device &screen, bitmap_ind1
m_pant[1]->draw(screen, bitmap, cliprect, 0, 0);
m_pant[0]->draw(screen, bitmap, cliprect, 0, 0);
- draw_sprites(screen, bitmap, cliprect, 0, 0);
+ draw_sprites(screen, bitmap, cliprect, 0);
return 0;
}
-uint32_t gaelco2_state::dual_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, int index)
+u32 gaelco2_state::dual_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, int index)
{
- int i;
-
int xoff0 = 0x14; // intro scenes align better with 0x13, but test screen is definitely 0x14
int xoff1 = xoff0 - 4;
int yoff0 = 0x01;
int yoff1 = 0x01;
/* read scroll values */
- int scroll0x = m_videoram[0x2802/2] + xoff0;
- int scroll1x = m_videoram[0x2806/2] + xoff1;
- int scroll0y = m_videoram[0x2800/2] + yoff0;
- int scroll1y = m_videoram[0x2804/2] + yoff1;
+ int scroll0x = m_videoram[0x2802 / 2] + xoff0;
+ int scroll1x = m_videoram[0x2806 / 2] + xoff1;
+ int scroll0y = m_videoram[0x2800 / 2] + yoff0;
+ int scroll1y = m_videoram[0x2804 / 2] + yoff1;
// if linescroll is enabled y-scroll handling changes too?
// touchgo uses 0x1f0 / 0x1ef between game and intro screens but actual scroll position needs to be different
@@ -498,21 +496,20 @@ uint32_t gaelco2_state::dual_update(screen_device &screen, bitmap_ind16 &bitmap,
m_pant[1]->set_scrolly(0, scroll1y & 0x1ff);
/* set x linescroll registers */
- for (i = 0; i < 512; i++){
- m_pant[0]->set_scrollx(i & 0x1ff, (m_vregs[0] & 0x8000) ? (m_videoram[(0x2000/2) + i] + xoff0) & 0x3ff : scroll0x & 0x3ff);
- m_pant[1]->set_scrollx(i & 0x1ff, (m_vregs[1] & 0x8000) ? (m_videoram[(0x2400/2) + i] + xoff1) & 0x3ff : scroll1x & 0x3ff);
+ for (int i = 0; i < 512; i++)
+ {
+ m_pant[0]->set_scrollx(i & 0x1ff, (m_vregs[0] & 0x8000) ? (m_videoram[(0x2000 / 2) + i] + xoff0) & 0x3ff : scroll0x & 0x3ff);
+ m_pant[1]->set_scrollx(i & 0x1ff, (m_vregs[1] & 0x8000) ? (m_videoram[(0x2400 / 2) + i] + xoff1) & 0x3ff : scroll1x & 0x3ff);
}
-
-
/* draw screen */
bitmap.fill(0, cliprect);
m_pant[index]->draw(screen, bitmap, cliprect, 0, 0);
- draw_sprites(screen,bitmap,cliprect, 0x8000 * index, 0);
+ draw_sprites(screen,bitmap,cliprect, 0x8000 * index);
return 0;
}
-uint32_t gaelco2_state::screen_update_gaelco2_left(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect){ return dual_update(screen, bitmap, cliprect, 0); }
-uint32_t gaelco2_state::screen_update_gaelco2_right(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect){ return dual_update(screen, bitmap, cliprect, 1); }
+u32 gaelco2_state::screen_update_left(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect){ return dual_update(screen, bitmap, cliprect, 0); }
+u32 gaelco2_state::screen_update_right(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect){ return dual_update(screen, bitmap, cliprect, 1); }
diff --git a/src/mame/video/galastrm.cpp b/src/mame/video/galastrm.cpp
index 49e3efa5bf0..77863568fe9 100644
--- a/src/mame/video/galastrm.cpp
+++ b/src/mame/video/galastrm.cpp
@@ -31,9 +31,7 @@ void galastrm_state::video_start()
save_item(NAME(m_rsxoffs));
save_item(NAME(m_rsyoffs));
save_item(NAME(m_frame_counter));
- save_item(NAME(m_tc0110pcr_addr));
- save_item(NAME(m_tc0610_0_addr));
- save_item(NAME(m_tc0610_1_addr));
+ save_item(NAME(m_tc0610_addr));
save_item(NAME(m_tc0610_ctrl_reg));
}
@@ -86,8 +84,6 @@ Heavy use is made of sprite zooming.
void galastrm_state::draw_sprites_pre(int x_offs, int y_offs)
{
- uint32_t *spriteram32 = m_spriteram;
- uint16_t *spritemap = (uint16_t *)memregion("user1")->base();
int offs, data, tilenum, color, flipx, flipy;
int x, y, priority, dblsize, curx, cury;
int sprites_flipscreen = 0;
@@ -101,19 +97,19 @@ void galastrm_state::draw_sprites_pre(int x_offs, int y_offs)
for (offs = (m_spriteram.bytes()/4-4);offs >= 0;offs -= 4)
{
- data = spriteram32[offs+0];
+ data = m_spriteram[offs+0];
flipx = (data & 0x00800000) >> 23;
zoomx = (data & 0x007f0000) >> 16;
tilenum = (data & 0x00007fff);
if (!tilenum) continue;
- data = spriteram32[offs+2];
+ data = m_spriteram[offs+2];
priority = (data & 0x000c0000) >> 18;
color = (data & 0x0003fc00) >> 10;
x = (data & 0x000003ff);
- data = spriteram32[offs+3];
+ data = m_spriteram[offs+3];
dblsize = (data & 0x00040000) >> 18;
flipy = (data & 0x00020000) >> 17;
zoomy = (data & 0x0001fc00) >> 10;
@@ -146,7 +142,7 @@ void galastrm_state::draw_sprites_pre(int x_offs, int y_offs)
if (flipx) px = dimension-1-k;
if (flipy) py = dimension-1-j;
- code = spritemap[map_offset + px + (py<<(dblsize+1))];
+ code = m_spritemap_rom[map_offset + px + (py<<(dblsize+1))];
if (code==0xffff)
{
diff --git a/src/mame/video/galaxian.cpp b/src/mame/video/galaxian.cpp
index 3f42cc2fde6..f3a192ad024 100644
--- a/src/mame/video/galaxian.cpp
+++ b/src/mame/video/galaxian.cpp
@@ -286,18 +286,18 @@ void galaxian_state::galaxian_palette(palette_device &palette)
bit0 = BIT(color_prom[i], 0);
bit1 = BIT(color_prom[i], 1);
bit2 = BIT(color_prom[i], 2);
- int const r = combine_3_weights(rweights, bit0, bit1, bit2);
+ int const r = combine_weights(rweights, bit0, bit1, bit2);
// green component
bit0 = BIT(color_prom[i], 3);
bit1 = BIT(color_prom[i], 4);
bit2 = BIT(color_prom[i], 5);
- int const g = combine_3_weights(gweights, bit0, bit1, bit2);
+ int const g = combine_weights(gweights, bit0, bit1, bit2);
// blue component
bit0 = BIT(color_prom[i], 6);
bit1 = BIT(color_prom[i], 7);
- int const b = combine_2_weights(bweights, bit0, bit1);
+ int const b = combine_weights(bweights, bit0, bit1);
palette.set_pen_color(i, rgb_t(r, g, b));
}
@@ -366,6 +366,18 @@ void galaxian_state::moonwar_palette(palette_device &palette)
m_bullet_color[7] = rgb_t(0xef, 0xef, 0x97);
}
+void galaxian_state::eagle_palette(palette_device &palette)
+{
+ galaxian_palette(palette);
+
+ // uses a wiring harness that swaps RGB -> GBR
+ for (unsigned i = 0; palette.entries() > i; ++i)
+ {
+ rgb_t const c = palette.pen(i);
+ palette.set_pen_color(i, c.g(), c.b(), c.r());
+ }
+}
+
/*************************************
*
* Common video init
diff --git a/src/mame/video/gamate.cpp b/src/mame/video/gamate.cpp
index 67e0272c8aa..f4a302ed321 100644
--- a/src/mame/video/gamate.cpp
+++ b/src/mame/video/gamate.cpp
@@ -305,18 +305,19 @@ void gamate_video_device::gamate_palette(palette_device &palette) const
frame rate is 60.8093Hz.
*/
-MACHINE_CONFIG_START(gamate_video_device::device_add_mconfig)
- MCFG_SCREEN_ADD("screen", LCD)
- MCFG_SCREEN_REFRESH_RATE(60.8093)
- MCFG_SCREEN_SIZE(160, 150)
- MCFG_SCREEN_VISIBLE_AREA(0, 160-1, 0, 150-1)
- MCFG_SCREEN_UPDATE_DRIVER(gamate_video_device, screen_update)
- MCFG_SCREEN_PALETTE("palette")
- MCFG_SCREEN_VIDEO_ATTRIBUTES(VIDEO_UPDATE_SCANLINE) // close approximate until we use timers to emulate exact video update
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
+void gamate_video_device::device_add_mconfig(machine_config &config)
+{
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_LCD));
+ screen.set_refresh_hz(60.8093);
+ screen.set_size(160, 150);
+ screen.set_visarea(0, 160-1, 0, 150-1);
+ screen.set_screen_update(FUNC(gamate_video_device::screen_update));
+ screen.set_palette("palette");
+ screen.set_video_attributes(VIDEO_UPDATE_SCANLINE); // close approximate until we use timers to emulate exact video update
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
PALETTE(config, "palette", FUNC(gamate_video_device::gamate_palette), 4);
-MACHINE_CONFIG_END
+}
void gamate_video_device::device_start()
{
diff --git a/src/mame/video/gottlieb.cpp b/src/mame/video/gottlieb.cpp
index b92fb9ef792..f108ad2c512 100644
--- a/src/mame/video/gottlieb.cpp
+++ b/src/mame/video/gottlieb.cpp
@@ -25,12 +25,12 @@ void gottlieb_state::palette_w(offs_t offset, u8 data)
/* blue & green are encoded in the even bytes */
val = m_paletteram[offset & ~1];
- int const g = combine_4_weights(m_weights, BIT(val, 4), BIT(val, 5), BIT(val, 6), BIT(val, 7));
- int const b = combine_4_weights(m_weights, BIT(val, 0), BIT(val, 1), BIT(val, 2), BIT(val, 3));
+ int const g = combine_weights(m_weights, BIT(val, 4), BIT(val, 5), BIT(val, 6), BIT(val, 7));
+ int const b = combine_weights(m_weights, BIT(val, 0), BIT(val, 1), BIT(val, 2), BIT(val, 3));
/* red is encoded in the odd bytes */
val = m_paletteram[offset | 1];
- int const r = combine_4_weights(m_weights, BIT(val, 0), BIT(val, 1), BIT(val, 2), BIT(val, 3));
+ int const r = combine_weights(m_weights, BIT(val, 0), BIT(val, 1), BIT(val, 2), BIT(val, 3));
/* alpha is set to 0 if laserdisc video is enabled */
int const a = (m_transparent0 && offset / 2 == 0) ? 0 : 255;
diff --git a/src/mame/video/gotya.cpp b/src/mame/video/gotya.cpp
index 0fe00462fc9..473676eef7e 100644
--- a/src/mame/video/gotya.cpp
+++ b/src/mame/video/gotya.cpp
@@ -33,18 +33,18 @@ void gotya_state::gotya_palette(palette_device &palette) const
bit0 = BIT(color_prom[i], 0);
bit1 = BIT(color_prom[i], 1);
bit2 = BIT(color_prom[i], 2);
- int const r = combine_3_weights(rweights, bit0, bit1, bit2);
+ int const r = combine_weights(rweights, bit0, bit1, bit2);
// green component
bit0 = BIT(color_prom[i], 3);
bit1 = BIT(color_prom[i], 4);
bit2 = BIT(color_prom[i], 5);
- int const g = combine_3_weights(gweights, bit0, bit1, bit2);
+ int const g = combine_weights(gweights, bit0, bit1, bit2);
// blue component
bit0 = BIT(color_prom[i], 6);
bit1 = BIT(color_prom[i], 7);
- int const b = combine_2_weights(bweights, bit0, bit1);
+ int const b = combine_weights(bweights, bit0, bit1);
palette.set_indirect_color(i, rgb_t(r, g, b));
}
diff --git a/src/mame/video/grchamp.cpp b/src/mame/video/grchamp.cpp
index b95d3e2846a..03eb3b23b6f 100644
--- a/src/mame/video/grchamp.cpp
+++ b/src/mame/video/grchamp.cpp
@@ -34,18 +34,18 @@ void grchamp_state::grchamp_palette(palette_device &palette) const
bit0 = BIT(color_prom[i], 0);
bit1 = BIT(color_prom[i], 1);
bit2 = BIT(color_prom[i], 2);
- int const r = combine_3_weights(rweights, bit0, bit1, bit2);
+ int const r = combine_weights(rweights, bit0, bit1, bit2);
// green component
bit0 = BIT(color_prom[i], 3);
bit1 = BIT(color_prom[i], 4);
bit2 = BIT(color_prom[i], 5);
- int const g = combine_3_weights(gweights, bit0, bit1, bit2);
+ int const g = combine_weights(gweights, bit0, bit1, bit2);
// blue component
bit0 = BIT(color_prom[i], 6);
bit1 = BIT(color_prom[i], 7);
- int const b = combine_2_weights(bweights, bit0, bit1);
+ int const b = combine_weights(bweights, bit0, bit1);
palette.set_pen_color(i, rgb_t(r, g, b));
}
diff --git a/src/mame/video/gyruss.cpp b/src/mame/video/gyruss.cpp
index 61ddfee37b2..c4787fa72ee 100644
--- a/src/mame/video/gyruss.cpp
+++ b/src/mame/video/gyruss.cpp
@@ -53,18 +53,18 @@ void gyruss_state::gyruss_palette(palette_device &palette) const
bit0 = BIT(color_prom[i], 0);
bit1 = BIT(color_prom[i], 1);
bit2 = BIT(color_prom[i], 2);
- int const r = combine_3_weights(weights_rg, bit0, bit1, bit2);
+ int const r = combine_weights(weights_rg, bit0, bit1, bit2);
// green component
bit0 = BIT(color_prom[i], 3);
bit1 = BIT(color_prom[i], 4);
bit2 = BIT(color_prom[i], 5);
- int const g = combine_3_weights(weights_rg, bit0, bit1, bit2);
+ int const g = combine_weights(weights_rg, bit0, bit1, bit2);
// blue component
bit0 = BIT(color_prom[i], 6);
bit1 = BIT(color_prom[i], 7);
- int const b = combine_2_weights(weights_b, bit0, bit1);
+ int const b = combine_weights(weights_b, bit0, bit1);
palette.set_indirect_color(i, rgb_t(r, g, b));
}
diff --git a/src/mame/video/homedata.cpp b/src/mame/video/homedata.cpp
index 36c9de30cce..aec14eb5888 100644
--- a/src/mame/video/homedata.cpp
+++ b/src/mame/video/homedata.cpp
@@ -37,7 +37,7 @@
***************************************************************************/
-void homedata_state::mrokumei_handleblit( address_space &space, int rom_base )
+void homedata_state::mrokumei_handleblit( int rom_base )
{
int i;
int dest_param;
@@ -45,7 +45,7 @@ void homedata_state::mrokumei_handleblit( address_space &space, int rom_base )
int dest_addr;
int base_addr;
int opcode, data, num_tiles;
- uint8_t *pBlitData = memregion("user1")->base() + rom_base;
+ uint8_t *pBlitData = &m_blit_rom[rom_base & m_blit_rom.mask()];
dest_param = m_blitter_param[(m_blitter_param_count - 4) & 3] * 256 +
m_blitter_param[(m_blitter_param_count - 3) & 3];
@@ -103,7 +103,7 @@ void homedata_state::mrokumei_handleblit( address_space &space, int rom_base )
} /* i!=0 */
if (data) /* 00 is a nop */
- mrokumei_videoram_w(space, base_addr + dest_addr, data);
+ mrokumei_videoram_w(base_addr + dest_addr, data);
if (m_vreg[1] & 0x80) /* flip screen */
{
@@ -123,14 +123,14 @@ finish:
m_maincpu->set_input_line(M6809_FIRQ_LINE, HOLD_LINE);
}
-void homedata_state::reikaids_handleblit( address_space &space, int rom_base )
+void homedata_state::reikaids_handleblit( int rom_base )
{
int i;
uint16_t dest_param;
int flipx;
int source_addr, base_addr;
int dest_addr;
- uint8_t *pBlitData = memregion("user1")->base() + rom_base;
+ uint8_t *pBlitData = &m_blit_rom[rom_base & m_blit_rom.mask()];
int opcode, data, num_tiles;
@@ -205,7 +205,7 @@ void homedata_state::reikaids_handleblit( address_space &space, int rom_base )
addr ^= 0x007c;
}
- reikaids_videoram_w(space, addr, dat);
+ reikaids_videoram_w(addr, dat);
}
}
@@ -220,14 +220,14 @@ finish:
m_maincpu->set_input_line(M6809_FIRQ_LINE, HOLD_LINE);
}
-void homedata_state::pteacher_handleblit( address_space &space, int rom_base )
+void homedata_state::pteacher_handleblit( int rom_base )
{
int i;
int dest_param;
int source_addr;
int dest_addr, base_addr;
int opcode, data, num_tiles;
- uint8_t *pBlitData = memregion("user1")->base() + rom_base;
+ uint8_t *pBlitData = &m_blit_rom[rom_base & m_blit_rom.mask()];
dest_param = m_blitter_param[(m_blitter_param_count - 4) & 3] * 256 +
m_blitter_param[(m_blitter_param_count - 3) & 3];
@@ -291,7 +291,7 @@ void homedata_state::pteacher_handleblit( address_space &space, int rom_base )
if ((addr & 0x2080) == 0)
{
addr = ((addr & 0xc000) >> 2) | ((addr & 0x1f00) >> 1) | (addr & 0x7f);
- mrokumei_videoram_w(space, addr, data);
+ mrokumei_videoram_w(addr, data);
}
}
@@ -681,13 +681,13 @@ VIDEO_START_MEMBER(homedata_state,mirderby)
***************************************************************************/
-WRITE8_MEMBER(homedata_state::mrokumei_videoram_w)
+void homedata_state::mrokumei_videoram_w(offs_t offset, u8 data)
{
m_videoram[offset] = data;
m_bg_tilemap[(offset & 0x2000) >> 13][(offset & 0x1000) >> 12]->mark_tile_dirty((offset & 0xffe) >> 1);
}
-WRITE8_MEMBER(homedata_state::reikaids_videoram_w)
+void homedata_state::reikaids_videoram_w(offs_t offset, u8 data)
{
m_videoram[offset] = data;
m_bg_tilemap[(offset & 0x2000) >> 13][offset & 3]->mark_tile_dirty((offset & 0xffc) >> 2);
@@ -764,7 +764,7 @@ WRITE8_MEMBER(homedata_state::pteacher_blitter_bank_w)
WRITE8_MEMBER(homedata_state::mrokumei_blitter_start_w)
{
if (data & 0x80)
- mrokumei_handleblit(space, ((m_blitter_bank & 0x04) >> 2) * 0x10000);
+ mrokumei_handleblit(((m_blitter_bank & 0x04) >> 2) * 0x10000);
/* bit 0 = bank switch; used by hourouki to access the
optional service mode ROM (not available in current dump) */
@@ -772,12 +772,12 @@ WRITE8_MEMBER(homedata_state::mrokumei_blitter_start_w)
WRITE8_MEMBER(homedata_state::reikaids_blitter_start_w)
{
- reikaids_handleblit(space, (m_blitter_bank & 3) * 0x10000);
+ reikaids_handleblit((m_blitter_bank & 3) * 0x10000);
}
WRITE8_MEMBER(homedata_state::pteacher_blitter_start_w)
{
- pteacher_handleblit(space, (m_blitter_bank >> 5) * 0x10000 & (memregion("user1")->bytes() - 1));
+ pteacher_handleblit((m_blitter_bank >> 5) * 0x10000 & m_blit_rom.mask());
}
@@ -1014,7 +1014,7 @@ uint32_t homedata_state::screen_update_mirderby(screen_device &screen, bitmap_in
}
-WRITE_LINE_MEMBER(homedata_state::screen_vblank_homedata)
+WRITE_LINE_MEMBER(homedata_state::screen_vblank)
{
// rising edge
if (state)
diff --git a/src/mame/video/homerun.cpp b/src/mame/video/homerun.cpp
index 3bb2660b868..f376ec0290d 100644
--- a/src/mame/video/homerun.cpp
+++ b/src/mame/video/homerun.cpp
@@ -12,13 +12,13 @@
/**************************************************************************/
-CUSTOM_INPUT_MEMBER(homerun_state::homerun_sprite0_r)
+CUSTOM_INPUT_MEMBER(homerun_state::sprite0_r)
{
// sprite-0 vs background collision status, similar to NES
return (m_screen->vpos() > (m_spriteram[0] - 16 + 1)) ? 1 : 0;
}
-WRITE8_MEMBER(homerun_state::homerun_scrollhi_w)
+WRITE8_MEMBER(homerun_state::scrollhi_w)
{
// d0: scroll y high bit
// d1: scroll x high bit
@@ -27,40 +27,49 @@ WRITE8_MEMBER(homerun_state::homerun_scrollhi_w)
m_scrollx = (m_scrollx & 0xff) | (data << 7 & 0x100);
}
-WRITE8_MEMBER(homerun_state::homerun_scrolly_w)
+WRITE8_MEMBER(homerun_state::scrolly_w)
{
m_scrolly = (m_scrolly & 0xff00) | data;
}
-WRITE8_MEMBER(homerun_state::homerun_scrollx_w)
+WRITE8_MEMBER(homerun_state::scrollx_w)
{
m_scrollx = (m_scrollx & 0xff00) | data;
}
-WRITE8_MEMBER(homerun_state::homerun_banking_w)
+void homerun_state::banking_w(u8 data)
{
- // games do mid-screen gfx bank switching
- int vpos = m_screen->vpos();
- m_screen->update_partial(vpos);
-
- // d0-d1: gfx bank
- // d2-d4: ?
- // d5-d7: prg bank
- m_gfx_ctrl = data;
- m_tilemap->mark_all_dirty();
- membank("bank1")->set_entry(data >> 5 & 7);
+ u8 const old = m_gfx_ctrl;
+ if (old ^ data)
+ {
+ if ((old ^ data) & 3)
+ {
+ // games do mid-screen gfx bank switching
+ int vpos = m_screen->vpos();
+ m_screen->update_partial(vpos);
+ }
+
+ // d0-d1: gfx bank
+ // d2-d4: ?
+ // d5-d7: prg bank
+ m_gfx_ctrl = data;
+ if ((old ^ m_gfx_ctrl) & 1)
+ m_tilemap->mark_all_dirty();
+
+ if ((old ^ m_gfx_ctrl) >> 5 & 7)
+ m_mainbank->set_entry(m_gfx_ctrl >> 5 & 7);
+
+ }
}
-WRITE8_MEMBER(homerun_state::homerun_videoram_w)
+WRITE8_MEMBER(homerun_state::videoram_w)
{
m_videoram[offset] = data;
m_tilemap->mark_tile_dirty(offset & 0xfff);
}
-WRITE8_MEMBER(homerun_state::homerun_color_w)
+rgb_t homerun_state::homerun_RGB332(u32 raw)
{
- m_colorram[offset] = data;
-
/* from PCB photo:
bit 7: 470 ohm resistor \
bit 6: 220 ohm resistor - --> 470 ohm resistor --> blue
@@ -73,32 +82,30 @@ WRITE8_MEMBER(homerun_state::homerun_color_w)
*/
// let's implement it the old fashioned way until it's found out how exactly the resnet is hooked up
- int r, g, b;
- int bit0, bit1, bit2;
-
- bit0 = (data >> 0) & 0x01;
- bit1 = (data >> 1) & 0x01;
- bit2 = (data >> 2) & 0x01;
- r = 0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2;
- bit0 = (data >> 3) & 0x01;
- bit1 = (data >> 4) & 0x01;
- bit2 = (data >> 5) & 0x01;
- g = 0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2;
+ u8 bit0, bit1, bit2;
+
+ bit0 = (raw >> 0) & 0x01;
+ bit1 = (raw >> 1) & 0x01;
+ bit2 = (raw >> 2) & 0x01;
+ int r = 0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2;
+ bit0 = (raw >> 3) & 0x01;
+ bit1 = (raw >> 4) & 0x01;
+ bit2 = (raw >> 5) & 0x01;
+ int g = 0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2;
bit0 = 0;
- bit1 = (data >> 6) & 0x01;
- bit2 = (data >> 7) & 0x01;
- b = 0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2;
+ bit1 = (raw >> 6) & 0x01;
+ bit2 = (raw >> 7) & 0x01;
+ int b = 0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2;
- m_palette->set_pen_color(offset, rgb_t(r,g,b));
+ return rgb_t(r, g, b);
}
-
/**************************************************************************/
-TILE_GET_INFO_MEMBER(homerun_state::get_homerun_tile_info)
+TILE_GET_INFO_MEMBER(homerun_state::get_tile_info)
{
- int tileno = (m_videoram[tile_index]) | ((m_videoram[tile_index | 0x1000] & 0x38) << 5) | ((m_gfx_ctrl & 1) << 11);
- int palno = (m_videoram[tile_index | 0x1000] & 0x07);
+ u32 const tileno = (m_videoram[tile_index]) | ((m_videoram[tile_index | 0x1000] & 0x38) << 5) | ((m_gfx_ctrl & 1) << 11);
+ u16 const palno = (m_videoram[tile_index | 0x1000] & 0x07);
SET_TILE_INFO_MEMBER(0, tileno, palno, 0);
}
@@ -106,26 +113,27 @@ TILE_GET_INFO_MEMBER(homerun_state::get_homerun_tile_info)
void homerun_state::video_start()
{
- m_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(homerun_state::get_homerun_tile_info),this), TILEMAP_SCAN_ROWS, 8, 8, 64, 64);
+ m_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(homerun_state::get_tile_info),this), TILEMAP_SCAN_ROWS, 8, 8, 64, 64);
+
+ save_item(NAME(m_gfx_ctrl));
+ save_item(NAME(m_scrolly));
+ save_item(NAME(m_scrollx));
}
-void homerun_state::draw_sprites( bitmap_ind16 &bitmap, const rectangle &cliprect )
+void homerun_state::draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect)
{
- uint8_t *spriteram = m_spriteram;
- int offs;
-
- for (offs = m_spriteram.bytes() - 4; offs >= 0; offs -= 4)
+ for (int offs = m_spriteram.bytes() - 4; offs >= 0; offs -= 4)
{
- if (spriteram[offs + 0] == 0)
+ if (m_spriteram[offs + 0] == 0)
continue;
- int sy = spriteram[offs + 0] - 16 + 1;
- int sx = spriteram[offs + 3];
- int code = (spriteram[offs + 1]) | ((spriteram[offs + 2] & 0x8) << 5) | ((m_gfx_ctrl & 3) << 9);
- int color = (spriteram[offs + 2] & 0x07) | 8;
- int flipx = (spriteram[offs + 2] & 0x40) >> 6;
- int flipy = (spriteram[offs + 2] & 0x80) >> 7;
+ int const sy = m_spriteram[offs + 0] - 16 + 1;
+ int const sx = m_spriteram[offs + 3];
+ u32 const code = (m_spriteram[offs + 1]) | ((m_spriteram[offs + 2] & 0x8) << 5) | ((m_gfx_ctrl & 3) << 9);
+ u32 const color = (m_spriteram[offs + 2] & 0x07) | 8;
+ bool const flipx = (m_spriteram[offs + 2] & 0x40) >> 6;
+ bool const flipy = (m_spriteram[offs + 2] & 0x80) >> 7;
if (sy >= 0)
{
@@ -137,7 +145,7 @@ void homerun_state::draw_sprites( bitmap_ind16 &bitmap, const rectangle &cliprec
}
}
-uint32_t homerun_state::screen_update_homerun(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
+u32 homerun_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{
m_tilemap->set_scrolly(0, m_scrolly);
m_tilemap->set_scrollx(0, m_scrollx);
diff --git a/src/mame/video/hyperspt.cpp b/src/mame/video/hyperspt.cpp
index 95ae4941cdf..e6e21823296 100644
--- a/src/mame/video/hyperspt.cpp
+++ b/src/mame/video/hyperspt.cpp
@@ -53,18 +53,18 @@ void hyperspt_state::hyperspt_palette(palette_device &palette) const
bit0 = BIT(color_prom[i], 0);
bit1 = BIT(color_prom[i], 1);
bit2 = BIT(color_prom[i], 2);
- int const r = combine_3_weights(rweights, bit0, bit1, bit2);
+ int const r = combine_weights(rweights, bit0, bit1, bit2);
// green component
bit0 = BIT(color_prom[i], 3);
bit1 = BIT(color_prom[i], 4);
bit2 = BIT(color_prom[i], 5);
- int const g = combine_3_weights(gweights, bit0, bit1, bit2);
+ int const g = combine_weights(gweights, bit0, bit1, bit2);
// blue component
bit0 = BIT(color_prom[i], 6);
bit1 = BIT(color_prom[i], 7);
- int const b = combine_2_weights(bweights, bit0, bit1);
+ int const b = combine_weights(bweights, bit0, bit1);
palette.set_indirect_color(i, rgb_t(r, g, b));
}
diff --git a/src/mame/video/ironhors.cpp b/src/mame/video/ironhors.cpp
index 973d0f0318f..eda424a1e15 100644
--- a/src/mame/video/ironhors.cpp
+++ b/src/mame/video/ironhors.cpp
@@ -40,21 +40,21 @@ void ironhors_state::ironhors_palette(palette_device &palette) const
bit1 = BIT(color_prom[i | 0x000], 1);
bit2 = BIT(color_prom[i | 0x000], 2);
bit3 = BIT(color_prom[i | 0x000], 3);
- int const r = combine_4_weights(rweights, bit0, bit1, bit2, bit3);
+ int const r = combine_weights(rweights, bit0, bit1, bit2, bit3);
// green component
bit0 = BIT(color_prom[i | 0x100], 0);
bit1 = BIT(color_prom[i | 0x100], 1);
bit2 = BIT(color_prom[i | 0x100], 2);
bit3 = BIT(color_prom[i | 0x100], 3);
- int const g = combine_4_weights(gweights, bit0, bit1, bit2, bit3);
+ int const g = combine_weights(gweights, bit0, bit1, bit2, bit3);
// blue component
bit0 = BIT(color_prom[i | 0x200], 0);
bit1 = BIT(color_prom[i | 0x200], 1);
bit2 = BIT(color_prom[i | 0x200], 2);
bit3 = BIT(color_prom[i | 0x200], 3);
- int const b = combine_4_weights(bweights, bit0, bit1, bit2, bit3);
+ int const b = combine_weights(bweights, bit0, bit1, bit2, bit3);
palette.set_indirect_color(i, rgb_t(r, g, b));
}
diff --git a/src/mame/video/itech8.cpp b/src/mame/video/itech8.cpp
index 6218c6c8e5e..93256dade99 100644
--- a/src/mame/video/itech8.cpp
+++ b/src/mame/video/itech8.cpp
@@ -165,7 +165,7 @@ void itech8_state::video_start()
WRITE8_MEMBER(itech8_state::palette_w)
{
- m_tlc34076->write(space, offset/2, data);
+ m_tlc34076->write(offset/2, data);
}
@@ -257,7 +257,7 @@ inline void itech8_state::consume_rle(int count)
*
*************************************/
-void itech8_state::perform_blit(address_space &space)
+void itech8_state::perform_blit()
{
offs_t addr = m_tms34061->xyaddress() | ((m_tms34061->xyoffset() & 0x300) << 8);
uint8_t shift = (BLITTER_FLAGS & BLITFLAG_SHIFT) ? 4 : 0;
@@ -266,7 +266,7 @@ void itech8_state::perform_blit(address_space &space)
int xdir = (BLITTER_FLAGS & BLITFLAG_XFLIP) ? -1 : 1;
int xflip = (BLITTER_FLAGS & BLITFLAG_XFLIP);
int rle = (BLITTER_FLAGS & BLITFLAG_RLE);
- int color = m_tms34061->latch_r(space, 0);
+ int color = m_tms34061->latch_r();
int width = BLITTER_WIDTH;
int height = BLITTER_HEIGHT;
uint8_t transmaskhi, transmasklo;
@@ -468,7 +468,7 @@ WRITE8_MEMBER(itech8_state::blitter_w)
}
/* perform the blit */
- perform_blit(space);
+ perform_blit();
m_blit_in_progress = 1;
/* set a timer to go off when we're done */
@@ -498,7 +498,7 @@ WRITE8_MEMBER(itech8_state::tms34061_w)
col ^= 2;
/* Row address (RA0-RA8) is not dependent on the offset */
- m_tms34061->write(space, col, 0xff, func, data);
+ m_tms34061->write(col, 0xff, func, data);
}
@@ -513,7 +513,7 @@ READ8_MEMBER(itech8_state::tms34061_r)
col ^= 2;
/* Row address (RA0-RA8) is not dependent on the offset */
- return m_tms34061->read(space, col, 0xff, func);
+ return m_tms34061->read(col, 0xff, func);
}
diff --git a/src/mame/video/jedi.cpp b/src/mame/video/jedi.cpp
index d99be2e9568..9383b5dcbeb 100644
--- a/src/mame/video/jedi.cpp
+++ b/src/mame/video/jedi.cpp
@@ -361,10 +361,11 @@ uint32_t jedi_state::screen_update_jedi(screen_device &screen, bitmap_rgb32 &bit
*
*************************************/
-MACHINE_CONFIG_START(jedi_state::jedi_video)
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_SIZE(64*8, 262) /* verify vert size */
- MCFG_SCREEN_VISIBLE_AREA(0*8, 37*8-1, 0*8, 30*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(jedi_state, screen_update_jedi)
-MACHINE_CONFIG_END
+void jedi_state::jedi_video(machine_config &config)
+{
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_refresh_hz(60);
+ m_screen->set_size(64*8, 262); /* verify vert size */
+ m_screen->set_visarea(0*8, 37*8-1, 0*8, 30*8-1);
+ m_screen->set_screen_update(FUNC(jedi_state::screen_update_jedi));
+}
diff --git a/src/mame/video/k057714.cpp b/src/mame/video/k057714.cpp
index 8092e80095c..084ed639473 100644
--- a/src/mame/video/k057714.cpp
+++ b/src/mame/video/k057714.cpp
@@ -10,6 +10,7 @@
#define DUMP_VRAM 0
#define PRINT_GCU 0
+#define PRINT_CMD_EXEC 0
DEFINE_DEVICE_TYPE(K057714, k057714_device, "k057714", "k057714_device GCU")
@@ -36,6 +37,9 @@ void k057714_device::device_reset()
m_vram_fifo0_addr = 0;
m_vram_fifo1_addr = 0;
+ m_fb_origin_x = 0;
+ m_fb_origin_y = 0;
+
for (auto & elem : m_frame)
{
elem.base = 0;
@@ -106,9 +110,12 @@ WRITE32_MEMBER(k057714_device::write)
}
}
if (ACCESSING_BITS_0_15)
+ {
+ m_layer_select = data;
#if PRINT_GCU
printf("%s_w: %02X, %08X, %08X\n", basetag(), reg, data, mem_mask);
#endif
+ }
break;
case 0x14: // ?
@@ -126,15 +133,31 @@ WRITE32_MEMBER(k057714_device::write)
break;
case 0x20: // Framebuffer 0 Origin(?)
+ if (ACCESSING_BITS_16_31)
+ m_frame[0].y = (data >> 16) & 0xffff;
+ if (ACCESSING_BITS_0_15)
+ m_frame[0].x = data & 0xffff;
break;
case 0x24: // Framebuffer 1 Origin(?)
+ if (ACCESSING_BITS_16_31)
+ m_frame[1].y = (data >> 16) & 0xffff;
+ if (ACCESSING_BITS_0_15)
+ m_frame[1].x = data & 0xffff;
break;
case 0x28: // Framebuffer 2 Origin(?)
+ if (ACCESSING_BITS_16_31)
+ m_frame[2].y = (data >> 16) & 0xffff;
+ if (ACCESSING_BITS_0_15)
+ m_frame[2].x = data & 0xffff;
break;
case 0x2c: // Framebuffer 3 Origin(?)
+ if (ACCESSING_BITS_16_31)
+ m_frame[3].y = (data >> 16) & 0xffff;
+ if (ACCESSING_BITS_0_15)
+ m_frame[3].x = data & 0xffff;
break;
case 0x30: // Framebuffer 0 Dimensions
@@ -142,6 +165,9 @@ WRITE32_MEMBER(k057714_device::write)
m_frame[0].height = (data >> 16) & 0xffff;
if (ACCESSING_BITS_0_15)
m_frame[0].width = data & 0xffff;
+#if PRINT_GCU
+ printf("%s FB0 Dimensions: W %04X, H %04X\n", basetag(), data & 0xffff, (data >> 16) & 0xffff);
+#endif
break;
case 0x34: // Framebuffer 1 Dimensions
@@ -149,6 +175,9 @@ WRITE32_MEMBER(k057714_device::write)
m_frame[1].height = (data >> 16) & 0xffff;
if (ACCESSING_BITS_0_15)
m_frame[1].width = data & 0xffff;
+#if PRINT_GCU
+ printf("%s FB1 Dimensions: W %04X, H %04X\n", basetag(), data & 0xffff, (data >> 16) & 0xffff);
+#endif
break;
case 0x38: // Framebuffer 2 Dimensions
@@ -156,6 +185,9 @@ WRITE32_MEMBER(k057714_device::write)
m_frame[2].height = (data >> 16) & 0xffff;
if (ACCESSING_BITS_0_15)
m_frame[2].width = data & 0xffff;
+#if PRINT_GCU
+ printf("%s FB2 Dimensions: W %04X, H %04X\n", basetag(), data & 0xffff, (data >> 16) & 0xffff);
+#endif
break;
case 0x3c: // Framebuffer 3 Dimensions
@@ -163,6 +195,9 @@ WRITE32_MEMBER(k057714_device::write)
m_frame[3].height = (data >> 16) & 0xffff;
if (ACCESSING_BITS_0_15)
m_frame[3].width = data & 0xffff;
+#if PRINT_GCU
+ printf("%s FB3 Dimensions: W %04X, H %04X\n", basetag(), data & 0xffff, (data >> 16) & 0xffff);
+#endif
break;
case 0x40: // Framebuffer 0 Base
@@ -269,8 +304,15 @@ WRITE32_MEMBER(k057714_device::write)
}
break;
+ case 0x6c:
+ if (ACCESSING_BITS_0_15)
+ {
+ m_reg_6c = data & 0xffff;
+ }
+ break;
+
default:
- //printf("%s_w: %02X, %08X, %08X at %s\n", basetag(), reg, data, mem_mask, m_maincpu->pc());
+ //printf("%s_w: %02X, %08X, %08X\n", basetag(), reg, data, mem_mask);
break;
}
}
@@ -305,12 +347,41 @@ WRITE32_MEMBER(k057714_device::fifo_w)
}
}
-int k057714_device::draw(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
+void k057714_device::draw_frame(int frame, bitmap_ind16 &bitmap, const rectangle &cliprect, bool inverse_trans)
{
+ int height = m_frame[frame].height;
+ int width = m_frame[frame].width;
+
+ if (width == 0 || height == 0)
+ return;
+
uint16_t *vram16 = (uint16_t*)m_vram.get();
- int x = 0;
- int y = 0;
+ int fb_pitch = 1024;
+
+ uint16_t trans_value = inverse_trans ? 0x8000 : 0x0000;
+
+ if (m_frame[frame].y + height > cliprect.max_y)
+ height = cliprect.max_y - m_frame[frame].y;
+ if (m_frame[frame].x + width > cliprect.max_x)
+ width = cliprect.max_x - m_frame[frame].x;
+
+ for (int j = 0; j < height; j++)
+ {
+ uint16_t *d = &bitmap.pix16(j + m_frame[frame].y, m_frame[frame].x);
+ int li = (j * fb_pitch);
+ for (int i = 0; i < width; i++)
+ {
+ uint16_t pix = vram16[(m_frame[frame].base + li + i) ^ NATIVE_ENDIAN_VALUE_LE_BE(1, 0)];
+ if ((pix & 0x8000) != trans_value) {
+ d[i] = pix & 0x7fff;
+ }
+ }
+ }
+}
+
+int k057714_device::draw(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
+{
int width = m_frame[0].width;
int height = m_frame[0].height;
@@ -325,45 +396,18 @@ int k057714_device::draw(screen_device &screen, bitmap_ind16 &bitmap, const rect
}
}
- int fb_pitch = 1024;
+ bitmap.fill(0, cliprect);
- for (int j=0; j < height; j++)
- {
- uint16_t *d = &bitmap.pix16(j, x);
- int li = ((j+y) * fb_pitch) + x;
- uint32_t fbaddr0 = m_frame[0].base + li;
- uint32_t fbaddr1 = m_frame[1].base + li;
- uint32_t fbaddr2 = m_frame[2].base + li;
-// uint32_t fbaddr3 = m_frame[3].base + li;
+ bool inverse_trans = false;
- for (int i=0; i < width; i++)
- {
- uint16_t pix0 = vram16[fbaddr0 ^ NATIVE_ENDIAN_VALUE_LE_BE(1,0)];
- uint16_t pix1 = vram16[fbaddr1 ^ NATIVE_ENDIAN_VALUE_LE_BE(1,0)];
- uint16_t pix2 = vram16[fbaddr2 ^ NATIVE_ENDIAN_VALUE_LE_BE(1,0)];
-// uint16_t pix3 = vram16[fbaddr3 ^ NATIVE_ENDIAN_VALUE_LE_BE(1,0)];
+ // most likely wrong, inverse transparency is only used by kbm
+ if ((m_reg_6c & 0xf) != 0)
+ inverse_trans = true;
- d[i] = 0;
-
- if (pix2 & 0x8000)
- {
- d[i] = pix2 & 0x7fff;
- }
- if (pix1 & 0x8000)
- {
- d[i] = pix1 & 0x7fff;
- }
- if (pix0 & 0x8000)
- {
- d[i] = pix0 & 0x7fff;
- }
-
- fbaddr0++;
- fbaddr1++;
- fbaddr2++;
-// fbaddr3++;
- }
- }
+ draw_frame((m_layer_select >> 8) & 3, bitmap, cliprect, inverse_trans);
+ draw_frame((m_layer_select >> 10) & 3, bitmap, cliprect, inverse_trans);
+ draw_frame((m_layer_select >> 12) & 3, bitmap, cliprect, inverse_trans);
+ draw_frame((m_layer_select >> 14) & 3, bitmap, cliprect, inverse_trans);
return 0;
}
@@ -382,12 +426,19 @@ void k057714_device::draw_object(uint32_t *cmd)
// 0x01: ----x--- -------- -------- -------- object y flip
// 0x01: --xx---- -------- -------- -------- object alpha enable (different blend modes?)
// 0x01: -x------ -------- -------- -------- object transparency enable (?)
+ // 0x01: x------- -------- -------- -------- inverse transparency? (used by kbm)
// 0x02: -------- -------- ------xx xxxxxxxx object width
// 0x02: -------- -----xxx xxxxxx-- -------- object x scale
+ // 0x02: xxxxx--- -------- -------- -------- ?
+ // 0x02: -----xxx xx------ -------- -------- translucency
+ // 0x02: -------- --xxx--- -------- -------- ?
// 0x03: -------- -------- ------xx xxxxxxxx object height
// 0x03: -------- -----xxx xxxxxx-- -------- object y scale
+ // 0x03: xxxxx--- -------- -------- -------- ?
+ // 0x03: -----xxx xx------ -------- -------- ?
+ // 0x03: -------- --xxx--- -------- -------- ?
int x = cmd[1] & 0x3ff;
int y = (cmd[1] >> 10) & 0x3fff;
@@ -398,11 +449,13 @@ void k057714_device::draw_object(uint32_t *cmd)
bool xflip = (cmd[1] & 0x04000000) ? true : false;
bool yflip = (cmd[1] & 0x08000000) ? true : false;
bool alpha_enable = (cmd[1] & 0x30000000) ? true : false;
- bool trans_enable = (cmd[1] & 0x40000000) ? true : false;
+ bool trans_enable = (cmd[1] & 0xc0000000) ? true : false;
uint32_t address = cmd[0] & 0xffffff;
- int alpha_level = (cmd[2] >> 27) & 0x1f;
+ int alpha_level = (cmd[2] >> 22) & 0x1f;
bool relative_coords = (cmd[0] & 0x10000000) ? true : false;
+ uint16_t trans_value = (cmd[1] & 0x80000000) ? 0x0000 : 0x8000;
+
if (relative_coords)
{
x += m_fb_origin_x;
@@ -416,13 +469,21 @@ void k057714_device::draw_object(uint32_t *cmd)
return;
}
-#if PRINT_GCU
- printf("%s Draw Object %08X, x %d, y %d, w %d, h %d [%08X %08X %08X %08X]\n", basetag(), address, x, y, width, height, cmd[0], cmd[1], cmd[2], cmd[3]);
+#if PRINT_CMD_EXEC
+ printf("%s Draw Object %08X, x %d, y %d, w %d, h %d, sx: %f, sy: %f [%08X %08X %08X %08X]\n", basetag(), address, x, y, width, height, (float)(xscale) / 64.0f, (float)(yscale) / 64.0f, cmd[0], cmd[1], cmd[2], cmd[3]);
#endif
width = (((width * 65536) / xscale) * 64) / 65536;
height = (((height * 65536) / yscale) * 64) / 65536;
+ int fb_width = m_frame[0].width;
+ int fb_height = m_frame[0].height;
+
+ if (width > fb_width)
+ width = fb_width;
+ if (height > fb_height)
+ height = fb_height;
+
int fb_pitch = 1024;
int v = 0;
@@ -455,7 +516,7 @@ void k057714_device::draw_object(uint32_t *cmd)
for (int i=0; i < width; i++)
{
uint16_t pix = vram16[((index + (u >> 6)) ^ NATIVE_ENDIAN_VALUE_LE_BE(1,0)) & 0xffffff];
- bool draw = !trans_enable || (trans_enable && (pix & 0x8000));
+ bool draw = !trans_enable || (trans_enable && ((pix & 0x8000) == trans_value));
if (alpha_enable)
{
if (draw)
@@ -487,7 +548,7 @@ void k057714_device::draw_object(uint32_t *cmd)
{
if (draw)
{
- vram16[fbaddr ^ NATIVE_ENDIAN_VALUE_LE_BE(1,0)] = pix;
+ vram16[fbaddr ^ NATIVE_ENDIAN_VALUE_LE_BE(1,0)] = (pix & 0xffff);
}
}
@@ -510,6 +571,7 @@ void k057714_device::fill_rect(uint32_t *cmd)
// 0x01: -------- -------- ------xx xxxxxxxx x
// 0x01: -------- xxxxxxxx xxxxxx-- -------- y
+ // 0x01: ---x---- -------- -------- -------- ?
// 0x02: xxxxxxxx xxxxxxxx -------- -------- fill pattern pixel 0
// 0x02: -------- -------- xxxxxxxx xxxxxxxx fill pattern pixel 1
@@ -535,7 +597,7 @@ void k057714_device::fill_rect(uint32_t *cmd)
color[2] = (cmd[3] >> 16);
color[3] = (cmd[3] & 0xffff);
-#if PRINT_GCU
+#if PRINT_CMD_EXEC
printf("%s Fill Rect x %d, y %d, w %d, h %d, %08X %08X [%08X %08X %08X %08X]\n", basetag(), x, y, width, height, cmd[2], cmd[3], cmd[0], cmd[1], cmd[2], cmd[3]);
#endif
@@ -568,6 +630,7 @@ void k057714_device::draw_character(uint32_t *cmd)
// 0x01: -------- -------- ------xx xxxxxxxx character x
// 0x01: -------- xxxxxxxx xxxxxx-- -------- character y
// 0x01: -------x -------- -------- -------- double height
+ // 0x01: --x----- -------- -------- -------- ?
// 0x01: -x------ -------- -------- -------- transparency enable
// 0x02: xxxxxxxx xxxxxxxx -------- -------- color 0
@@ -595,8 +658,8 @@ void k057714_device::draw_character(uint32_t *cmd)
color[2] = cmd[3] >> 16;
color[3] = cmd[3] & 0xffff;
-#if PRINT_GCU
- printf("%s Draw Char %08X, x %d, y %d\n", basetag(), address, x, y);
+#if PRINT_CMD_EXEC
+ printf("%s Draw Char %08X, x %d, y %d [%08X %08X %08X %08X]\n", basetag(), address, x, y, cmd[0], cmd[1], cmd[2], cmd[3]);
#endif
uint16_t *vram16 = (uint16_t*)m_vram.get();
@@ -615,7 +678,7 @@ void k057714_device::draw_character(uint32_t *cmd)
int p = (line >> ((7-i) * 2)) & 3;
bool draw = !trans_enable || (trans_enable && (color[p] & 0x8000));
if (draw)
- vram16[(fbaddr+x+i) ^ NATIVE_ENDIAN_VALUE_LE_BE(1,0)] = color[p] | 0x8000;
+ vram16[(fbaddr+x+i) ^ NATIVE_ENDIAN_VALUE_LE_BE(1,0)] = color[p];
}
}
}
@@ -630,7 +693,7 @@ void k057714_device::fb_config(uint32_t *cmd)
// 0x03: -------- -------- --xxxxxx xxxxxxxx Framebuffer Origin Y
-#if PRINT_GCU
+#if PRINT_CMD_EXEC
printf("%s FB Config %08X %08X %08X %08X\n", basetag(), cmd[0], cmd[1], cmd[2], cmd[3]);
#endif
@@ -644,7 +707,7 @@ void k057714_device::execute_display_list(uint32_t addr)
int counter = 0;
-#if PRINT_GCU
+#if PRINT_CMD_EXEC
printf("%s Exec Display List %08X\n", basetag(), addr);
#endif
@@ -698,7 +761,7 @@ void k057714_device::execute_command(uint32_t* cmd)
{
int command = (cmd[0] >> 29) & 0x7;
-#if PRINT_GCU
+#if PRINT_CMD_EXEC
printf("%s Exec Command %08X, %08X, %08X, %08X\n", basetag(), cmd[0], cmd[1], cmd[2], cmd[3]);
#endif
diff --git a/src/mame/video/k057714.h b/src/mame/video/k057714.h
index a52bb898c5a..190a8dd92c7 100644
--- a/src/mame/video/k057714.h
+++ b/src/mame/video/k057714.h
@@ -23,6 +23,8 @@ public:
uint32_t base;
int width;
int height;
+ int x;
+ int y;
};
protected:
@@ -38,6 +40,8 @@ private:
void draw_character(uint32_t *cmd);
void fb_config(uint32_t *cmd);
+ void draw_frame(int frame, bitmap_ind16 &bitmap, const rectangle &cliprect, bool inverse_trans);
+
std::unique_ptr<uint32_t[]> m_vram;
uint32_t m_vram_read_addr;
uint32_t m_vram_fifo0_addr;
@@ -57,6 +61,8 @@ private:
framebuffer m_frame[4];
uint32_t m_fb_origin_x;
uint32_t m_fb_origin_y;
+ uint32_t m_layer_select;
+ uint32_t m_reg_6c;
devcb_write_line m_irq;
};
diff --git a/src/mame/video/kaypro.cpp b/src/mame/video/kaypro.cpp
index 95a542532d2..d3de6878b61 100644
--- a/src/mame/video/kaypro.cpp
+++ b/src/mame/video/kaypro.cpp
@@ -257,13 +257,13 @@ READ8_MEMBER( kaypro_state::kaypro484_status_r )
{
/* Need bit 7 high or computer hangs */
- return 0x80 | m_crtc->register_r(space, 0);
+ return 0x80 | m_crtc->register_r();
}
WRITE8_MEMBER( kaypro_state::kaypro484_index_w )
{
m_mc6845_ind = data & 0x1f;
- m_crtc->address_w( space, 0, data );
+ m_crtc->address_w(data);
}
WRITE8_MEMBER( kaypro_state::kaypro484_register_w )
@@ -275,7 +275,7 @@ WRITE8_MEMBER( kaypro_state::kaypro484_register_w )
else
m_mc6845_reg[m_mc6845_ind] = data;
- m_crtc->register_w( space, 0, data );
+ m_crtc->register_w(data);
if ((m_mc6845_ind == 1) || (m_mc6845_ind == 6) || (m_mc6845_ind == 9))
mc6845_screen_configure(); /* adjust screen size */
diff --git a/src/mame/video/kingobox.cpp b/src/mame/video/kingobox.cpp
index a4a10cbda46..fc5a692786c 100644
--- a/src/mame/video/kingobox.cpp
+++ b/src/mame/video/kingobox.cpp
@@ -57,21 +57,21 @@ void kingofb_state::palette_init_common( palette_device &palette, const uint8_t
bit1 = (r_data >> 1) & 0x01;
bit2 = (r_data >> 2) & 0x01;
bit3 = (r_data >> 3) & 0x01;
- r = combine_4_weights(rweights, bit0, bit1, bit2, bit3);
+ r = combine_weights(rweights, bit0, bit1, bit2, bit3);
/* green component */
bit0 = (g_data >> 0) & 0x01;
bit1 = (g_data >> 1) & 0x01;
bit2 = (g_data >> 2) & 0x01;
bit3 = (g_data >> 3) & 0x01;
- g = combine_4_weights(gweights, bit0, bit1, bit2, bit3);
+ g = combine_weights(gweights, bit0, bit1, bit2, bit3);
/* blue component */
bit0 = (b_data >> 0) & 0x01;
bit1 = (b_data >> 1) & 0x01;
bit2 = (b_data >> 2) & 0x01;
bit3 = (b_data >> 3) & 0x01;
- b = combine_4_weights(bweights, bit0, bit1, bit2, bit3);
+ b = combine_weights(bweights, bit0, bit1, bit2, bit3);
palette.set_indirect_color(i, rgb_t(r, g, b));
}
@@ -132,31 +132,31 @@ void kingofb_state::ringking_palette(palette_device &palette)
palette_init_common(palette, color_prom, &kingofb_state::ringking_get_rgb_data);
}
-WRITE8_MEMBER(kingofb_state::kingofb_videoram_w)
+void kingofb_state::kingofb_videoram_w(offs_t offset, uint8_t data)
{
m_videoram[offset] = data;
m_bg_tilemap->mark_tile_dirty(offset);
}
-WRITE8_MEMBER(kingofb_state::kingofb_colorram_w)
+void kingofb_state::kingofb_colorram_w(offs_t offset, uint8_t data)
{
m_colorram[offset] = data;
m_bg_tilemap->mark_tile_dirty(offset);
}
-WRITE8_MEMBER(kingofb_state::kingofb_videoram2_w)
+void kingofb_state::kingofb_videoram2_w(offs_t offset, uint8_t data)
{
m_videoram2[offset] = data;
m_fg_tilemap->mark_tile_dirty(offset);
}
-WRITE8_MEMBER(kingofb_state::kingofb_colorram2_w)
+void kingofb_state::kingofb_colorram2_w(offs_t offset, uint8_t data)
{
m_colorram2[offset] = data;
m_fg_tilemap->mark_tile_dirty(offset);
}
-WRITE8_MEMBER(kingofb_state::kingofb_f800_w)
+void kingofb_state::kingofb_f800_w(uint8_t data)
{
m_nmigate->in_w<1>(BIT(data, 5));
diff --git a/src/mame/video/kyocera.cpp b/src/mame/video/kyocera.cpp
index eb0659c0683..6b910160fef 100644
--- a/src/mame/video/kyocera.cpp
+++ b/src/mame/video/kyocera.cpp
@@ -20,16 +20,8 @@ void tandy200_state::tandy200_palette(palette_device &palette) const
uint32_t kc85_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{
- m_lcdc0->screen_update(screen, bitmap, cliprect);
- m_lcdc1->screen_update(screen, bitmap, cliprect);
- m_lcdc2->screen_update(screen, bitmap, cliprect);
- m_lcdc3->screen_update(screen, bitmap, cliprect);
- m_lcdc4->screen_update(screen, bitmap, cliprect);
- m_lcdc5->screen_update(screen, bitmap, cliprect);
- m_lcdc6->screen_update(screen, bitmap, cliprect);
- m_lcdc7->screen_update(screen, bitmap, cliprect);
- m_lcdc8->screen_update(screen, bitmap, cliprect);
- m_lcdc9->screen_update(screen, bitmap, cliprect);
+ for (uint8_t i = 0; i < 10; i++)
+ m_lcdc[i]->screen_update(screen, bitmap, cliprect);
return 0;
}
@@ -47,42 +39,44 @@ void tandy200_state::tandy200_lcdc(address_map &map)
map(0x0000, 0x1fff).ram();
}
-MACHINE_CONFIG_START(kc85_state::kc85_video)
- MCFG_SCREEN_ADD(SCREEN_TAG, LCD)
- MCFG_SCREEN_REFRESH_RATE(44)
- MCFG_SCREEN_UPDATE_DRIVER(kc85_state, screen_update)
- MCFG_SCREEN_SIZE(240, 64)
- MCFG_SCREEN_VISIBLE_AREA(0, 240-1, 0, 64-1)
- MCFG_SCREEN_PALETTE("palette")
+void kc85_state::kc85_video(machine_config &config)
+{
+ screen_device &screen(SCREEN(config, SCREEN_TAG, SCREEN_TYPE_LCD));
+ screen.set_refresh_hz(44);
+ screen.set_screen_update(FUNC(kc85_state::screen_update));
+ screen.set_size(240, 64);
+ screen.set_visarea(0, 240-1, 0, 64-1);
+ screen.set_palette("palette");
PALETTE(config, "palette", FUNC(kc85_state::kc85_palette), 2);
- MCFG_HD44102_ADD(HD44102_0_TAG, SCREEN_TAG, 0, 0)
- MCFG_HD44102_ADD(HD44102_1_TAG, SCREEN_TAG, 50, 0)
- MCFG_HD44102_ADD(HD44102_2_TAG, SCREEN_TAG, 100, 0)
- MCFG_HD44102_ADD(HD44102_3_TAG, SCREEN_TAG, 150, 0)
- MCFG_HD44102_ADD(HD44102_4_TAG, SCREEN_TAG, 200, 0)
- MCFG_HD44102_ADD(HD44102_5_TAG, SCREEN_TAG, 0, 32)
- MCFG_HD44102_ADD(HD44102_6_TAG, SCREEN_TAG, 50, 32)
- MCFG_HD44102_ADD(HD44102_7_TAG, SCREEN_TAG, 100, 32)
- MCFG_HD44102_ADD(HD44102_8_TAG, SCREEN_TAG, 150, 32)
- MCFG_HD44102_ADD(HD44102_9_TAG, SCREEN_TAG, 200, 32)
+ HD44102(config, m_lcdc[0], 0, SCREEN_TAG, 0, 0);
+ HD44102(config, m_lcdc[1], 0, SCREEN_TAG, 50, 0);
+ HD44102(config, m_lcdc[2], 0, SCREEN_TAG, 100, 0);
+ HD44102(config, m_lcdc[3], 0, SCREEN_TAG, 150, 0);
+ HD44102(config, m_lcdc[4], 0, SCREEN_TAG, 200, 0);
+ HD44102(config, m_lcdc[5], 0, SCREEN_TAG, 0, 32);
+ HD44102(config, m_lcdc[6], 0, SCREEN_TAG, 50, 32);
+ HD44102(config, m_lcdc[7], 0, SCREEN_TAG, 100, 32);
+ HD44102(config, m_lcdc[8], 0, SCREEN_TAG, 150, 32);
+ HD44102(config, m_lcdc[9], 0, SCREEN_TAG, 200, 32);
// MCFG_HD44103_MASTER_ADD("m11", SCREEN_TAG, CAP_P(18), RES_K(100), HD44103_FS_HIGH, HD44103_DUTY_1_32)
// MCFG_HD44103_SLAVE_ADD( "m12", "m11", SCREEN_TAG, HD44103_FS_HIGH, HD44103_DUTY_1_32)
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(tandy200_state::tandy200_video)
- MCFG_SCREEN_ADD(SCREEN_TAG, LCD)
- MCFG_SCREEN_REFRESH_RATE(80)
- MCFG_SCREEN_UPDATE_DRIVER(tandy200_state, screen_update)
- MCFG_SCREEN_SIZE(240, 128)
- MCFG_SCREEN_VISIBLE_AREA(0, 240-1, 0, 128-1)
- MCFG_SCREEN_PALETTE("palette")
+void tandy200_state::tandy200_video(machine_config &config)
+{
+ screen_device &screen(SCREEN(config, SCREEN_TAG, SCREEN_TYPE_LCD));
+ screen.set_refresh_hz(80);
+ screen.set_screen_update(FUNC(tandy200_state::screen_update));
+ screen.set_size(240, 128);
+ screen.set_visarea(0, 240-1, 0, 128-1);
+ screen.set_palette("palette");
PALETTE(config, "palette", FUNC(tandy200_state::tandy200_palette), 2);
- MCFG_DEVICE_ADD(HD61830_TAG, HD61830, XTAL(4'915'200)/2/2)
- MCFG_DEVICE_ADDRESS_MAP(0, tandy200_lcdc)
- MCFG_VIDEO_SET_SCREEN(SCREEN_TAG)
-MACHINE_CONFIG_END
+ HD61830(config, m_lcdc, XTAL(4'915'200)/2/2);
+ m_lcdc->set_addrmap(0, &tandy200_state::tandy200_lcdc);
+ m_lcdc->set_screen(SCREEN_TAG);
+}
diff --git a/src/mame/video/ladybug.cpp b/src/mame/video/ladybug.cpp
index b6b0c4f5878..ae69cb4d321 100644
--- a/src/mame/video/ladybug.cpp
+++ b/src/mame/video/ladybug.cpp
@@ -292,17 +292,17 @@ void ladybug_base_state::palette_init_common(palette_device &palette, const uint
// red component
bit0 = BIT(~color_prom[i], r_bit0);
bit1 = BIT(~color_prom[i], r_bit1);
- int const r = combine_2_weights(rweights, bit0, bit1);
+ int const r = combine_weights(rweights, bit0, bit1);
// green component
bit0 = BIT(~color_prom[i], g_bit0);
bit1 = BIT(~color_prom[i], g_bit1);
- int const g = combine_2_weights(gweights, bit0, bit1);
+ int const g = combine_weights(gweights, bit0, bit1);
// blue component
bit0 = BIT(~color_prom[i], b_bit0);
bit1 = BIT(~color_prom[i], b_bit1);
- int const b = combine_2_weights(bweights, bit0, bit1);
+ int const b = combine_weights(bweights, bit0, bit1);
palette.set_indirect_color(i, rgb_t(r, g, b));
}
diff --git a/src/mame/video/leland.cpp b/src/mame/video/leland.cpp
index 6d5b817d4c6..ccaece336bd 100644
--- a/src/mame/video/leland.cpp
+++ b/src/mame/video/leland.cpp
@@ -511,22 +511,24 @@ static GFXDECODE_START( gfx_ataxx )
GFXDECODE_ENTRY( "bg_gfx", 0, ataxx_layout, 0, 16) // 16 is foreground
GFXDECODE_END
-MACHINE_CONFIG_START(leland_state::leland_video)
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_leland)
+void leland_state::leland_video(machine_config &config)
+{
+ GFXDECODE(config, m_gfxdecode, m_palette, gfx_leland);
PALETTE(config, m_palette).set_format(palette_device::BGR_233, 1024);
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_VIDEO_ATTRIBUTES(VIDEO_ALWAYS_UPDATE)
- MCFG_SCREEN_SIZE(40*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 40*8-1, 0*8, 30*8-1)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_UPDATE_DRIVER(leland_state, screen_update)
- MCFG_SCREEN_PALETTE(m_palette)
-MACHINE_CONFIG_END
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_video_attributes(VIDEO_ALWAYS_UPDATE);
+ m_screen->set_size(40*8, 32*8);
+ m_screen->set_visarea(0*8, 40*8-1, 0*8, 30*8-1);
+ m_screen->set_refresh_hz(60);
+ m_screen->set_screen_update(FUNC(leland_state::screen_update));
+ m_screen->set_palette(m_palette);
+}
-MACHINE_CONFIG_START(ataxx_state::ataxx_video)
+void ataxx_state::ataxx_video(machine_config &config)
+{
leland_video(config);
- MCFG_DEVICE_REPLACE("gfxdecode", GFXDECODE, "palette", gfx_ataxx)
+ GFXDECODE(config.replace(), m_gfxdecode, m_palette, gfx_ataxx);
m_palette->set_format(palette_device::xRGB_444, 1024);
-MACHINE_CONFIG_END
+}
diff --git a/src/mame/video/light.cpp b/src/mame/video/light.cpp
new file mode 100644
index 00000000000..ff47c95c7e3
--- /dev/null
+++ b/src/mame/video/light.cpp
@@ -0,0 +1,381 @@
+// license:BSD-3-Clause
+// copyright-holders:Ryan Holtz, Tyson Smith
+/*
+ Silicon Graphics LG1 "Light" graphics board used as
+ entry level graphics in the Indigo and IRIS Crimson.
+*/
+
+#include "emu.h"
+#include "video/light.h"
+#include "screen.h"
+
+#define LOG_REX (1 << 0)
+#define LOG_ALL (LOG_REX)
+
+#define VERBOSE (0)
+#include "logmacro.h"
+
+enum
+{
+ REX15_PAGE0_SET = 0x00000000,
+ REX15_PAGE0_GO = 0x00000800,
+ REX15_PAGE1_SET = 0x00004790,
+ REX15_PAGE1_GO = 0x00004f90,
+
+ REX15_P0REG_COMMAND = 0x00000000,
+ REX15_P0REG_XSTARTI = 0x0000000c,
+ REX15_P0REG_YSTARTI = 0x0000001c,
+ REX15_P0REG_XYMOVE = 0x00000034,
+ REX15_P0REG_COLORREDI = 0x00000038,
+ REX15_P0REG_COLORGREENI = 0x00000040,
+ REX15_P0REG_COLORBLUEI = 0x00000048,
+ REX15_P0REG_COLORBACK = 0x0000005c,
+ REX15_P0REG_ZPATTERN = 0x00000060,
+ REX15_P0REG_XENDI = 0x00000084,
+ REX15_P0REG_YENDI = 0x00000088,
+
+ REX15_P1REG_WCLOCKREV = 0x00000054,
+ REX15_P1REG_CFGDATA = 0x00000058,
+ REX15_P1REG_CFGSEL = 0x0000005c,
+ REX15_P1REG_VC1_ADDRDATA = 0x00000060,
+ REX15_P1REG_CFGMODE = 0x00000068,
+ REX15_P1REG_XYOFFSET = 0x0000006c,
+
+ REX15_OP_NOP = 0x00000000,
+ REX15_OP_DRAW = 0x00000001,
+
+ REX15_OP_FLAG_BLOCK = 0x00000008,
+ REX15_OP_FLAG_LENGTH32 = 0x00000010,
+ REX15_OP_FLAG_QUADMODE = 0x00000020,
+ REX15_OP_FLAG_XYCONTINUE = 0x00000080,
+ REX15_OP_FLAG_STOPONX = 0x00000100,
+ REX15_OP_FLAG_STOPONY = 0x00000200,
+ REX15_OP_FLAG_ENZPATTERN = 0x00000400,
+ REX15_OP_FLAG_LOGICSRC = 0x00080000,
+ REX15_OP_FLAG_ZOPAQUE = 0x00800000,
+ REX15_OP_FLAG_ZCONTINUE = 0x01000000,
+
+ REX15_WRITE_ADDR = 0x00,
+ REX15_PALETTE_RAM = 0x01,
+ REX15_PIXEL_READ_MASK = 0x02,
+ REX15_CONTROL = 0x06
+};
+
+DEFINE_DEVICE_TYPE(LIGHT_VIDEO, light_video_device, "light_video", "SGI Light graphics board")
+
+
+light_video_device::light_video_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+ : device_t(mconfig, LIGHT_VIDEO, tag, owner, clock)
+ , m_palette(*this, "palette")
+{
+}
+
+
+//-------------------------------------------------
+// device_add_mconfig - device-specific machine configuration
+//-------------------------------------------------
+
+void light_video_device::device_add_mconfig(machine_config &config)
+{
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */
+ screen.set_size(x_res, y_res);
+ screen.set_visarea(0, x_res-1, 0, y_res-1);
+ screen.set_screen_update(FUNC(light_video_device::screen_update));
+
+ PALETTE(config, m_palette).set_entries(256);
+}
+
+
+//-------------------------------------------------
+// device_start - device-specific startup
+//-------------------------------------------------
+
+void light_video_device::device_start()
+{
+ m_framebuffer = std::make_unique<uint8_t[]>(x_res*y_res);
+
+ save_item(NAME(m_lg1.m_config_sel));
+ save_item(NAME(m_lg1.m_write_addr));
+ save_item(NAME(m_lg1.m_control));
+ save_item(NAME(m_lg1.m_command));
+ save_item(NAME(m_lg1.m_x_start_i));
+ save_item(NAME(m_lg1.m_y_start_i));
+ save_item(NAME(m_lg1.m_xy_move));
+ save_item(NAME(m_lg1.m_color_red_i));
+ save_item(NAME(m_lg1.m_color_green_i));
+ save_item(NAME(m_lg1.m_color_blue_i));
+ save_item(NAME(m_lg1.m_color_back));
+ save_item(NAME(m_lg1.m_z_pattern));
+ save_item(NAME(m_lg1.m_x_end_i));
+ save_item(NAME(m_lg1.m_y_end_i));
+ save_item(NAME(m_lg1.m_x_curr_i));
+ save_item(NAME(m_lg1.m_y_curr_i));
+ save_item(NAME(m_lg1.m_palette_idx));
+ save_item(NAME(m_lg1.m_palette_channel));
+ save_item(NAME(m_lg1.m_palette_entry));
+ save_item(NAME(m_lg1.m_pix_read_mask));
+
+ save_pointer(NAME(&m_framebuffer[0]), x_res*y_res);
+}
+
+//-------------------------------------------------
+// device_reset - device-specific reset
+//-------------------------------------------------
+
+void light_video_device::device_reset()
+{
+ memset(&m_lg1, 0, sizeof(lg1_t));
+ memset(&m_framebuffer[0], 0, x_res*y_res);
+}
+
+uint32_t light_video_device::screen_update(screen_device &device, bitmap_rgb32 &bitmap, const rectangle &cliprect)
+{
+ const rgb_t *pens = m_palette->palette()->entry_list_raw();
+ const uint8_t *src = &m_framebuffer[0];
+ for (uint32_t y = 0; y < y_res; y++) {
+ uint32_t *dst = &bitmap.pix32(y);
+ for (uint32_t x = 0; x < x_res; x++) {
+ *dst++ = pens[*src++];
+ }
+ }
+ return 0;
+}
+
+READ32_MEMBER(light_video_device::entry_r)
+{
+ uint32_t ret = 0;
+ switch (offset)
+ {
+ case REX15_PAGE0_GO/4:
+ LOGMASKED(LOG_REX, "%s: LG1 Read: Status(?) (Go) %08x = %08x & %08x\n", machine().describe_context(), 0x1f3f0000 + offset*4, ret, mem_mask);
+ do_rex_command();
+ break;
+ case 0x0014/4:
+ ret = 0x033c0000;
+ LOGMASKED(LOG_REX, "%s: LG1 Read: Presence Detect(?) %08x = %08x & %08x\n", machine().describe_context(), 0x1f3f0000 + offset*4, ret, mem_mask);
+ break;
+ default:
+ LOGMASKED(LOG_REX, "%s: Unknown LG1 Read: %08x = %08x & %08x\n", machine().describe_context(), 0x1f3f0000 + offset*4, ret, mem_mask);
+ break;
+ }
+ return ret;
+}
+
+WRITE32_MEMBER(light_video_device::entry_w)
+{
+ bool go = (offset >= REX15_PAGE1_GO/4) || (offset >= REX15_PAGE0_GO/4 && offset < REX15_PAGE1_SET/4);
+
+ switch (offset)
+ {
+ case (REX15_PAGE0_SET+REX15_P0REG_COMMAND)/4:
+ case (REX15_PAGE0_GO+REX15_P0REG_COMMAND)/4:
+ m_lg1.m_command = data;
+ LOGMASKED(LOG_REX, "%s: LG1 REX1.5 Command Write (%s) = %08x\n", machine().describe_context(), (offset & 0x200) ? "Go" : "Set", data);
+ if (go)
+ do_rex_command();
+ break;
+ case (REX15_PAGE0_SET+REX15_P0REG_XSTARTI)/4:
+ case (REX15_PAGE0_GO+REX15_P0REG_XSTARTI)/4:
+ m_lg1.m_x_start_i = data;
+ m_lg1.m_x_curr_i = m_lg1.m_x_start_i;
+ LOGMASKED(LOG_REX, "%s: LG1 REX1.5 XStartI Write (%s) = %08x\n", machine().describe_context(), (offset & 0x200) ? "Go" : "Set", data);
+ break;
+ case (REX15_PAGE0_SET+REX15_P0REG_YSTARTI)/4:
+ case (REX15_PAGE0_GO+REX15_P0REG_YSTARTI)/4:
+ m_lg1.m_y_start_i = data;
+ m_lg1.m_y_curr_i = m_lg1.m_y_start_i;
+ LOGMASKED(LOG_REX, "%s: LG1 REX1.5 YStartI Write (%s) = %08x\n", machine().describe_context(), (offset & 0x200) ? "Go" : "Set", data);
+ break;
+ case (REX15_PAGE0_SET+REX15_P0REG_XYMOVE)/4:
+ case (REX15_PAGE0_GO+REX15_P0REG_XYMOVE)/4:
+ m_lg1.m_xy_move = data;
+ LOGMASKED(LOG_REX, "%s: LG1 REX1.5 XYMove Write (%s) = %08x\n", machine().describe_context(), (offset & 0x200) ? "Go" : "Set", data);
+ if (go)
+ do_rex_command();
+ break;
+ case (REX15_PAGE0_SET+REX15_P0REG_COLORREDI)/4:
+ case (REX15_PAGE0_GO+REX15_P0REG_COLORREDI)/4:
+ m_lg1.m_color_red_i = data;
+ LOGMASKED(LOG_REX, "%s: LG1 REX1.5 ColorRedI Write (%s) = %08x\n", machine().describe_context(), (offset & 0x200) ? "Go" : "Set", data);
+ break;
+ case (REX15_PAGE0_SET+REX15_P0REG_COLORGREENI)/4:
+ case (REX15_PAGE0_GO+REX15_P0REG_COLORGREENI)/4:
+ m_lg1.m_color_green_i = data;
+ LOGMASKED(LOG_REX, "%s: LG1 REX1.5 ColorGreenI Write (%s) = %08x\n", machine().describe_context(), (offset & 0x200) ? "Go" : "Set", data);
+ break;
+ case (REX15_PAGE0_SET+REX15_P0REG_COLORBLUEI)/4:
+ case (REX15_PAGE0_GO+REX15_P0REG_COLORBLUEI)/4:
+ m_lg1.m_color_blue_i = data;
+ LOGMASKED(LOG_REX, "%s: LG1 REX1.5 ColorBlueI Write (%s) = %08x\n", machine().describe_context(), (offset & 0x200) ? "Go" : "Set", data);
+ break;
+ case (REX15_PAGE0_SET+REX15_P0REG_COLORBACK)/4:
+ case (REX15_PAGE0_GO+REX15_P0REG_COLORBACK)/4:
+ m_lg1.m_color_back = data;
+ LOGMASKED(LOG_REX, "%s: LG1 REX1.5 ColorBlueI Write (%s) = %08x\n", machine().describe_context(), (offset & 0x200) ? "Go" : "Set", data);
+ break;
+ case (REX15_PAGE0_SET+REX15_P0REG_ZPATTERN)/4:
+ case (REX15_PAGE0_GO+REX15_P0REG_ZPATTERN)/4:
+ m_lg1.m_z_pattern = data;
+ LOGMASKED(LOG_REX, "%s: LG1 REX1.5 ZPattern Write (%s) = %08x\n", machine().describe_context(), (offset & 0x200) ? "Go" : "Set", data);
+ if (go)
+ do_rex_command();
+ break;
+ case (REX15_PAGE0_SET+REX15_P0REG_XENDI)/4:
+ case (REX15_PAGE0_GO+REX15_P0REG_XENDI)/4:
+ m_lg1.m_x_end_i = data;
+ LOGMASKED(LOG_REX, "%s: LG1 REX1.5 XEndI Write (%s) = %08x\n", machine().describe_context(), (offset & 0x200) ? "Go" : "Set", data);
+ break;
+ case (REX15_PAGE0_SET+REX15_P0REG_YENDI)/4:
+ case (REX15_PAGE0_GO+REX15_P0REG_YENDI)/4:
+ m_lg1.m_y_end_i = data;
+ LOGMASKED(LOG_REX, "%s: LG1 REX1.5 YEndI Write (%s) = %08x\n", machine().describe_context(), (offset & 0x200) ? "Go" : "Set", data);
+ break;
+
+ case (REX15_PAGE1_SET+REX15_P1REG_CFGSEL)/4:
+ case (REX15_PAGE1_GO+REX15_P1REG_CFGSEL)/4:
+ m_lg1.m_config_sel = data;
+ switch (data)
+ {
+ case REX15_WRITE_ADDR:
+ LOGMASKED(LOG_REX, "%s: LG1 ConfigSel Write = %08x (Write Addr)\n", machine().describe_context(), data);
+ break;
+ case REX15_PALETTE_RAM:
+ LOGMASKED(LOG_REX, "%s: LG1 ConfigSel Write = %08x (Palette RAM)\n", machine().describe_context(), data);
+ break;
+ case REX15_CONTROL:
+ LOGMASKED(LOG_REX, "%s: LG1 ConfigSel Write = %08x (Control)\n", machine().describe_context(), data);
+ break;
+ case REX15_PIXEL_READ_MASK:
+ LOGMASKED(LOG_REX, "%s: LG1 ConfigSel Write = %08x (Pixel Read Mask)\n", machine().describe_context(), data);
+ break;
+ default:
+ LOGMASKED(LOG_REX, "%s: LG1 ConfigSel Write = %08x (Unknown)\n", machine().describe_context(), data);
+ break;
+ }
+ break;
+ case (REX15_PAGE1_SET+REX15_P1REG_CFGDATA)/4:
+ case (REX15_PAGE1_GO+REX15_P1REG_CFGDATA)/4:
+ if (go) // Ignore 'Go' writes for now, unsure what they do
+ break;
+ switch (m_lg1.m_config_sel)
+ {
+ case REX15_WRITE_ADDR:
+ LOGMASKED(LOG_REX, "%s: LG1 ConfigSel Write: Setting WriteAddr to %08x\n", machine().describe_context(), data);
+ m_lg1.m_write_addr = data;
+ if (m_lg1.m_control == 0xf)
+ {
+ LOGMASKED(LOG_REX, "%s: LG1 about to set palette entry %02x\n", machine().describe_context(), (uint8_t)data);
+ m_lg1.m_palette_idx = (uint8_t)data;
+ m_lg1.m_palette_channel = 0;
+ }
+ break;
+ case REX15_PALETTE_RAM:
+ LOGMASKED(LOG_REX, "%s: LG1 ConfigSel Write: Setting Palette RAM %02x entry %d to %02x\n", machine().describe_context(),
+ m_lg1.m_palette_idx, m_lg1.m_palette_channel, (uint8_t)data);
+ m_lg1.m_palette_entry[m_lg1.m_palette_channel++] = (uint8_t)data;
+ if (m_lg1.m_palette_channel == 3)
+ {
+ m_palette->set_pen_color(m_lg1.m_palette_idx, m_lg1.m_palette_entry[0], m_lg1.m_palette_entry[1], m_lg1.m_palette_entry[2]);
+ }
+ break;
+ case REX15_CONTROL:
+ LOGMASKED(LOG_REX, "%s: LG1 ConfigSel Write: Setting Control to %08x\n", machine().describe_context(), data);
+ m_lg1.m_control = data;
+ break;
+ case REX15_PIXEL_READ_MASK:
+ LOGMASKED(LOG_REX, "%s: LG1 ConfigSel Write = %08x (Pixel Read Mask, entry %02x)\n", machine().describe_context(), data, m_lg1.m_palette_idx);
+ m_lg1.m_pix_read_mask[m_lg1.m_palette_idx] = (uint8_t)data;
+ break;
+ default:
+ LOGMASKED(LOG_REX, "%s: LG1 Unknown ConfigData Write = %08x\n", machine().describe_context(), data);
+ break;
+ }
+ break;
+ default:
+ LOGMASKED(LOG_REX, "%s: Unknown LG1 Write: %08x = %08x & %08x\n", machine().describe_context(), 0x1f3f0000 + offset*4, data, mem_mask);
+ break;
+ }
+}
+
+void light_video_device::do_rex_command()
+{
+ if (m_lg1.m_command == 0)
+ {
+ return;
+ }
+ if (m_lg1.m_command == 0x30080329)
+ {
+ bool xycontinue = (m_lg1.m_command & REX15_OP_FLAG_XYCONTINUE);
+ bool copy = (m_lg1.m_command & REX15_OP_FLAG_LOGICSRC);
+ const uint32_t start_x = xycontinue ? m_lg1.m_x_curr_i : m_lg1.m_x_start_i;
+ const uint32_t start_y = xycontinue ? m_lg1.m_y_curr_i : m_lg1.m_y_start_i;
+ const uint32_t end_x = m_lg1.m_x_end_i;
+ const uint32_t end_y = m_lg1.m_y_end_i;
+ const uint32_t src_start_x = start_x + (m_lg1.m_xy_move >> 16);
+ const uint32_t src_start_y = start_y + (uint16_t)m_lg1.m_xy_move;;
+
+ LOGMASKED(LOG_REX, "LG1: Command %08x: Block copy from %d,%d-%d,%d inclusive.\n", m_lg1.m_command, start_x, start_y, end_x, end_y);
+ if (copy)
+ {
+ for (uint32_t y = start_y, src_y = src_start_y; y <= end_y; y++, src_y++)
+ for (uint32_t x = start_x, src_x = src_start_x; x <= end_x; x++, src_x++)
+ m_framebuffer[y*x_res + x] = m_framebuffer[src_y*x_res + src_x];
+ }
+ else
+ {
+ for (uint32_t y = start_y; y <= end_y; y++)
+ for (uint32_t x = start_x; x <= end_x; x++)
+ m_framebuffer[y*x_res + x] = m_lg1.m_color_red_i;
+ }
+ }
+ else if (m_lg1.m_command == 0x30000329)
+ {
+ bool xycontinue = (m_lg1.m_command & REX15_OP_FLAG_XYCONTINUE);
+ uint32_t start_x = xycontinue ? m_lg1.m_x_curr_i : m_lg1.m_x_start_i;
+ uint32_t start_y = xycontinue ? m_lg1.m_y_curr_i : m_lg1.m_y_start_i;
+ uint32_t end_x = m_lg1.m_x_end_i;
+ uint32_t end_y = m_lg1.m_y_end_i;
+
+ LOGMASKED(LOG_REX, "LG1: Command %08x: Block draw from %d,%d-%d,%d inclusive.\n", m_lg1.m_command, start_x, start_y, end_x, end_y);
+ for (uint32_t y = start_y; y <= end_y; y++)
+ {
+ for (uint32_t x = start_x; x <= end_x; x++)
+ {
+ m_framebuffer[y*x_res + x] = m_lg1.m_color_red_i;
+ }
+ }
+ }
+ else if (m_lg1.m_command == 0x300005a1 ||
+ m_lg1.m_command == 0x300005a9 ||
+ m_lg1.m_command == 0x300005b9)
+ {
+ bool xycontinue = (m_lg1.m_command & REX15_OP_FLAG_XYCONTINUE);
+ uint32_t start_x = xycontinue ? m_lg1.m_x_curr_i : m_lg1.m_x_start_i;
+ uint32_t start_y = xycontinue ? m_lg1.m_y_curr_i : m_lg1.m_y_start_i;
+ uint32_t end_x = m_lg1.m_x_end_i;
+ LOGMASKED(LOG_REX, "LG1: Command %08x: Pattern draw from %d-%d at %d\n", m_lg1.m_command, start_x, end_x, start_y);
+ for (uint32_t x = start_x; x <= end_x && x < (start_x + 32); x++)
+ {
+ if (BIT(m_lg1.m_z_pattern, 31 - (x - start_x)))
+ {
+ m_framebuffer[start_y*x_res + x] = m_lg1.m_color_red_i;
+ }
+ m_lg1.m_x_curr_i++;
+ }
+
+ if (m_lg1.m_command & REX15_OP_FLAG_BLOCK)
+ {
+ if (m_lg1.m_x_curr_i > m_lg1.m_x_end_i)
+ {
+ m_lg1.m_y_curr_i--;
+ m_lg1.m_x_curr_i = m_lg1.m_x_start_i;
+ }
+ }
+ }
+ else
+ {
+ LOGMASKED(LOG_REX, "%s: Unknown LG1 command: %08x\n", machine().describe_context(), m_lg1.m_command);
+ }
+}
diff --git a/src/mame/video/light.h b/src/mame/video/light.h
new file mode 100644
index 00000000000..82799fc906b
--- /dev/null
+++ b/src/mame/video/light.h
@@ -0,0 +1,75 @@
+// license:BSD-3-Clause
+// copyright-holders:Ryan Holtz, Tyson Smith
+/*
+ Silicon Graphics LG1 "Light" graphics board used as
+ entry level graphics in the Indigo and IRIS Crimson.
+*/
+
+#ifndef MAME_VIDEO_LIGHT_H
+#define MAME_VIDEO_LIGHT_H
+
+#pragma once
+
+#include "emupal.h"
+
+class light_video_device : public device_t
+{
+public:
+ light_video_device(const machine_config &mconfig, const char *tag, device_t *owner)
+ : light_video_device(mconfig, tag, owner, (uint32_t)0)
+ {
+ }
+
+ light_video_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+
+ uint32_t screen_update(screen_device &device, bitmap_rgb32 &bitmap, const rectangle &cliprect);
+
+ DECLARE_READ32_MEMBER(entry_r);
+ DECLARE_WRITE32_MEMBER(entry_w);
+
+ static constexpr uint32_t x_res = 1024;
+ static constexpr uint32_t y_res = 768;
+
+protected:
+ void device_add_mconfig(machine_config &config) override;
+ virtual void device_start() override;
+ virtual void device_reset() override;
+
+private:
+ void do_rex_command();
+
+ struct lg1_t
+ {
+ uint32_t m_config_sel;
+ uint32_t m_write_addr;
+ uint32_t m_control;
+
+ uint32_t m_command;
+ uint32_t m_x_start_i;
+ uint32_t m_y_start_i;
+ uint32_t m_xy_move;
+ uint32_t m_color_red_i;
+ uint32_t m_color_green_i;
+ uint32_t m_color_blue_i;
+ uint32_t m_color_back;
+ uint32_t m_z_pattern;
+ uint32_t m_x_end_i;
+ uint32_t m_y_end_i;
+ uint32_t m_x_curr_i;
+ uint32_t m_y_curr_i;
+
+ uint8_t m_palette_idx;
+ uint8_t m_palette_channel;
+ uint8_t m_palette_entry[3];
+ uint8_t m_pix_read_mask[256];
+ };
+ lg1_t m_lg1;
+
+ required_device<palette_device> m_palette;
+ std::unique_ptr<uint8_t[]> m_framebuffer;
+};
+
+DECLARE_DEVICE_TYPE(LIGHT_VIDEO, light_video_device)
+
+
+#endif // MAME_VIDEO_LIGHT_H
diff --git a/src/mame/video/lucky74.cpp b/src/mame/video/lucky74.cpp
index b295311e6c2..adf9b5a5623 100644
--- a/src/mame/video/lucky74.cpp
+++ b/src/mame/video/lucky74.cpp
@@ -147,42 +147,42 @@ void lucky74_state::lucky74_palette(palette_device &palette) const
bit1 = BIT(color_prom[0x000 + i], 1);
bit2 = BIT(color_prom[0x000 + i], 2);
bit3 = BIT(color_prom[0x000 + i], 3);
- int const r1 = combine_4_weights(weights_r, bit0, bit1, bit2, bit3);
+ int const r1 = combine_weights(weights_r, bit0, bit1, bit2, bit3);
// red component (this 2, PROM E7)
bit0 = BIT(color_prom[0x100 + i], 0);
bit1 = BIT(color_prom[0x100 + i], 1);
bit2 = BIT(color_prom[0x100 + i], 2);
bit3 = BIT(color_prom[0x100 + i], 3);
- int const r2 = combine_4_weights(weights_r, bit0, bit1, bit2, bit3);
+ int const r2 = combine_weights(weights_r, bit0, bit1, bit2, bit3);
// green component (this 1, PROM D6)
bit0 = BIT(color_prom[0x200 + i], 0);
bit1 = BIT(color_prom[0x200 + i], 1);
bit2 = BIT(color_prom[0x200 + i], 2);
bit3 = BIT(color_prom[0x200 + i], 3);
- int const g1 = combine_4_weights(weights_g, bit0, bit1, bit2, bit3);
+ int const g1 = combine_weights(weights_g, bit0, bit1, bit2, bit3);
// green component (this 2, PROM D7)
bit0 = BIT(color_prom[0x300 + i], 0);
bit1 = BIT(color_prom[0x300 + i], 1);
bit2 = BIT(color_prom[0x300 + i], 2);
bit3 = BIT(color_prom[0x300 + i], 3);
- int const g2 = combine_4_weights(weights_g, bit0, bit1, bit2, bit3);
+ int const g2 = combine_weights(weights_g, bit0, bit1, bit2, bit3);
// blue component (this 1, PROM C6)
bit0 = BIT(color_prom[0x400 + i], 0);
bit1 = BIT(color_prom[0x400 + i], 1);
bit2 = BIT(color_prom[0x400 + i], 2);
bit3 = BIT(color_prom[0x400 + i], 3);
- int const b1 = combine_4_weights(weights_b, bit0, bit1, bit2, bit3);
+ int const b1 = combine_weights(weights_b, bit0, bit1, bit2, bit3);
// blue component (this 2, PROM C7)
bit0 = BIT(color_prom[0x500 + i], 0);
bit1 = BIT(color_prom[0x500 + i], 1);
bit2 = BIT(color_prom[0x500 + i], 2);
bit3 = BIT(color_prom[0x500 + i], 3);
- int const b2 = combine_4_weights(weights_b, bit0, bit1, bit2, bit3);
+ int const b2 = combine_weights(weights_b, bit0, bit1, bit2, bit3);
// PROMs circuitry, 1st state
diff --git a/src/mame/video/m52.cpp b/src/mame/video/m52.cpp
index 5d73df8fcd6..dedb6bb33ad 100644
--- a/src/mame/video/m52.cpp
+++ b/src/mame/video/m52.cpp
@@ -35,10 +35,10 @@ void m52_state::init_palette()
const uint8_t *char_pal = memregion("tx_pal")->base();
for (int i = 0; i < 512; i++)
{
- uint8_t promval = char_pal[i];
- int r = combine_3_weights(weights_r, BIT(promval, 0), BIT(promval, 1), BIT(promval, 2));
- int g = combine_3_weights(weights_g, BIT(promval, 3), BIT(promval, 4), BIT(promval, 5));
- int b = combine_2_weights(weights_b, BIT(promval, 6), BIT(promval, 7));
+ uint8_t const promval = char_pal[i];
+ int const r = combine_weights(weights_r, BIT(promval, 0), BIT(promval, 1), BIT(promval, 2));
+ int const g = combine_weights(weights_g, BIT(promval, 3), BIT(promval, 4), BIT(promval, 5));
+ int const b = combine_weights(weights_b, BIT(promval, 6), BIT(promval, 7));
m_tx_palette->set_pen_color(i, rgb_t(r, g, b));
}
@@ -48,9 +48,9 @@ void m52_state::init_palette()
for (int i = 0; i < 32; i++)
{
uint8_t promval = back_pal[i];
- int r = combine_3_weights(weights_r, BIT(promval, 0), BIT(promval, 1), BIT(promval, 2));
- int g = combine_3_weights(weights_g, BIT(promval, 3), BIT(promval, 4), BIT(promval, 5));
- int b = combine_2_weights(weights_b, BIT(promval, 6), BIT(promval, 7));
+ int r = combine_weights(weights_r, BIT(promval, 0), BIT(promval, 1), BIT(promval, 2));
+ int g = combine_weights(weights_g, BIT(promval, 3), BIT(promval, 4), BIT(promval, 5));
+ int b = combine_weights(weights_b, BIT(promval, 6), BIT(promval, 7));
m_bg_palette->set_indirect_color(i, rgb_t(r, g, b));
}
@@ -81,7 +81,8 @@ void m52_state::init_palette()
init_sprite_palette(resistances_3, resistances_2, weights_r, weights_g, weights_b, scale);
}
-void m52_state::init_sprite_palette(const int *resistances_3, const int *resistances_2, double *weights_r, double *weights_g, double *weights_b, double scale)
+template <size_t N, size_t O, size_t P>
+void m52_state::init_sprite_palette(const int *resistances_3, const int *resistances_2, double (&weights_r)[N], double (&weights_g)[O], double (&weights_b)[P], double scale)
{
const uint8_t *sprite_pal = memregion("spr_pal")->base();
const uint8_t *sprite_table = memregion("spr_clut")->base();
@@ -95,10 +96,10 @@ void m52_state::init_sprite_palette(const int *resistances_3, const int *resista
/* sprite palette */
for (int i = 0; i < 32; i++)
{
- uint8_t promval = sprite_pal[i];
- int r = combine_2_weights(weights_r, BIT(promval, 6), BIT(promval, 7));
- int g = combine_3_weights(weights_g, BIT(promval, 3), BIT(promval, 4), BIT(promval, 5));
- int b = combine_3_weights(weights_b, BIT(promval, 0), BIT(promval, 1), BIT(promval, 2));
+ uint8_t const promval = sprite_pal[i];
+ int const r = combine_weights(weights_r, BIT(promval, 6), BIT(promval, 7));
+ int const g = combine_weights(weights_g, BIT(promval, 3), BIT(promval, 4), BIT(promval, 5));
+ int const b = combine_weights(weights_b, BIT(promval, 0), BIT(promval, 1), BIT(promval, 2));
m_sp_palette->set_indirect_color(i, rgb_t(r, g, b));
}
diff --git a/src/mame/video/m58.cpp b/src/mame/video/m58.cpp
index 55dca247574..413cca1e90f 100644
--- a/src/mame/video/m58.cpp
+++ b/src/mame/video/m58.cpp
@@ -42,9 +42,9 @@ void m58_state::m58_palette(palette_device &palette) const
for (int i = 0; i < 256; i++)
{
uint8_t const promval = (char_lopal[i] & 0x0f) | (char_hipal[i] << 4);
- int const r = combine_2_weights(weights_r, BIT(promval,6), BIT(promval,7));
- int const g = combine_3_weights(weights_g, BIT(promval,3), BIT(promval,4), BIT(promval,5));
- int const b = combine_3_weights(weights_b, BIT(promval,0), BIT(promval,1), BIT(promval,2));
+ int const r = combine_weights(weights_r, BIT(promval,6), BIT(promval,7));
+ int const g = combine_weights(weights_g, BIT(promval,3), BIT(promval,4), BIT(promval,5));
+ int const b = combine_weights(weights_b, BIT(promval,0), BIT(promval,1), BIT(promval,2));
palette.set_indirect_color(i, rgb_t(r, g, b));
}
@@ -53,9 +53,9 @@ void m58_state::m58_palette(palette_device &palette) const
for (int i = 0; i < 256; i++)
{
uint8_t const promval = (radar_lopal[i] & 0x0f) | (radar_hipal[i] << 4);
- int const r = combine_2_weights(weights_r, BIT(promval,6), BIT(promval,7));
- int const g = combine_3_weights(weights_g, BIT(promval,3), BIT(promval,4), BIT(promval,5));
- int const b = combine_3_weights(weights_b, BIT(promval,0), BIT(promval,1), BIT(promval,2));
+ int const r = combine_weights(weights_r, BIT(promval,6), BIT(promval,7));
+ int const g = combine_weights(weights_g, BIT(promval,3), BIT(promval,4), BIT(promval,5));
+ int const b = combine_weights(weights_b, BIT(promval,0), BIT(promval,1), BIT(promval,2));
palette.set_indirect_color(256 + i, rgb_t(r, g, b));
}
@@ -70,9 +70,9 @@ void m58_state::m58_palette(palette_device &palette) const
for (int i = 0; i < 16; i++)
{
uint8_t const promval = sprite_pal[i];
- int const r = combine_2_weights(weights_r, BIT(promval,6), BIT(promval,7));
- int const g = combine_3_weights(weights_g, BIT(promval,3), BIT(promval,4), BIT(promval,5));
- int const b = combine_3_weights(weights_b, BIT(promval,0), BIT(promval,1), BIT(promval,2));
+ int const r = combine_weights(weights_r, BIT(promval,6), BIT(promval,7));
+ int const g = combine_weights(weights_g, BIT(promval,3), BIT(promval,4), BIT(promval,5));
+ int const b = combine_weights(weights_b, BIT(promval,0), BIT(promval,1), BIT(promval,2));
palette.set_indirect_color(256 + 256 + i, rgb_t(r, g, b));
}
diff --git a/src/mame/video/madalien.cpp b/src/mame/video/madalien.cpp
index fa699674374..380d80cba01 100644
--- a/src/mame/video/madalien.cpp
+++ b/src/mame/video/madalien.cpp
@@ -116,10 +116,8 @@ WRITE8_MEMBER(madalien_state::madalien_videoram_w)
}
-VIDEO_START_MEMBER(madalien_state,madalien)
+void madalien_state::video_start()
{
- int i;
-
static const tilemap_mapper_delegate scan_functions[4] =
{
tilemap_mapper_delegate(FUNC(madalien_state::scan_mode0),this),
@@ -136,7 +134,7 @@ VIDEO_START_MEMBER(madalien_state,madalien)
m_tilemap_fg = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(madalien_state::get_tile_info_FG),this), TILEMAP_SCAN_COLS_FLIP_X, 8, 8, 32, 32);
m_tilemap_fg->set_transparent_pen(0);
- for (i = 0; i < 4; i++)
+ for (int i = 0; i < 4; i++)
{
m_tilemap_edge1[i] = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(madalien_state::get_tile_info_BG_1),this), scan_functions[i], 16, 16, tilemap_cols[i], 8);
@@ -364,19 +362,19 @@ static GFXDECODE_START( gfx_madalien )
GFXDECODE_END
-MACHINE_CONFIG_START(madalien_state::madalien_video)
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_RAW_PARAMS(PIXEL_CLOCK, 336, 0, 256, 288, 0, 256)
- MCFG_SCREEN_UPDATE_DRIVER(madalien_state, screen_update_madalien)
- MCFG_SCREEN_PALETTE(m_palette)
+void madalien_state::madalien_video(machine_config &config)
+{
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_raw(PIXEL_CLOCK, 336, 0, 256, 288, 0, 256);
+ screen.set_screen_update(FUNC(madalien_state::screen_update_madalien));
+ screen.set_palette(m_palette);
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, m_palette, gfx_madalien)
+ GFXDECODE(config, m_gfxdecode, m_palette, gfx_madalien);
PALETTE(config, m_palette, FUNC(madalien_state::madalien_palette), 0x30, 0x20);
- MCFG_VIDEO_START_OVERRIDE(madalien_state,madalien)
mc6845_device &crtc(MC6845(config, "crtc", PIXEL_CLOCK / 8));
crtc.set_screen("screen");
crtc.set_show_border_area(false);
crtc.set_char_width(8);
crtc.out_vsync_callback().set_inputline(m_audiocpu, INPUT_LINE_NMI);
-MACHINE_CONFIG_END
+}
diff --git a/src/mame/video/mappy.cpp b/src/mame/video/mappy.cpp
index 81828b961a7..ccb2a54715c 100644
--- a/src/mame/video/mappy.cpp
+++ b/src/mame/video/mappy.cpp
@@ -53,18 +53,18 @@ void mappy_state::superpac_palette(palette_device &palette) const
bit0 = BIT(color_prom[i], 0);
bit1 = BIT(color_prom[i], 1);
bit2 = BIT(color_prom[i], 2);
- int const r = combine_3_weights(rweights, bit0, bit1, bit2);
+ int const r = combine_weights(rweights, bit0, bit1, bit2);
// green component
bit0 = BIT(color_prom[i], 3);
bit1 = BIT(color_prom[i], 4);
bit2 = BIT(color_prom[i], 5);
- int const g = combine_3_weights(gweights, bit0, bit1, bit2);
+ int const g = combine_weights(gweights, bit0, bit1, bit2);
// blue component
bit0 = BIT(color_prom[i], 6);
bit1 = BIT(color_prom[i], 7);
- int const b = combine_2_weights(bweights, bit0, bit1);
+ int const b = combine_weights(bweights, bit0, bit1);
palette.set_indirect_color(i, rgb_t(r, g, b));
}
@@ -108,18 +108,18 @@ void mappy_state::mappy_palette(palette_device &palette) const
bit0 = BIT(color_prom[i], 0);
bit1 = BIT(color_prom[i], 1);
bit2 = BIT(color_prom[i], 2);
- int const r = combine_3_weights(rweights, bit0, bit1, bit2);
+ int const r = combine_weights(rweights, bit0, bit1, bit2);
// green component
bit0 = BIT(color_prom[i], 3);
bit1 = BIT(color_prom[i], 4);
bit2 = BIT(color_prom[i], 5);
- int const g = combine_3_weights(gweights, bit0, bit1, bit2);
+ int const g = combine_weights(gweights, bit0, bit1, bit2);
// blue component
bit0 = BIT(color_prom[i], 6);
bit1 = BIT(color_prom[i], 7);
- int const b = combine_2_weights(bweights, bit0, bit1);
+ int const b = combine_weights(bweights, bit0, bit1);
palette.set_indirect_color(i, rgb_t(r, g, b));
}
@@ -176,21 +176,21 @@ void mappy_state::phozon_palette(palette_device &palette) const
bit1 = BIT(color_prom[i], 1);
bit2 = BIT(color_prom[i], 2);
bit3 = BIT(color_prom[i], 3);
- int const r = combine_4_weights(rweights, bit0, bit1, bit2, bit3);
+ int const r = combine_weights(rweights, bit0, bit1, bit2, bit3);
// green component
bit0 = BIT(color_prom[i | 0x100], 0);
bit1 = BIT(color_prom[i | 0x100], 1);
bit2 = BIT(color_prom[i | 0x100], 2);
bit3 = BIT(color_prom[i | 0x100], 3);
- int const g = combine_4_weights(gweights, bit0, bit1, bit2, bit3);
+ int const g = combine_weights(gweights, bit0, bit1, bit2, bit3);
// blue component
bit0 = BIT(color_prom[i | 0x200], 0);
bit1 = BIT(color_prom[i | 0x200], 1);
bit2 = BIT(color_prom[i | 0x200], 2);
bit3 = BIT(color_prom[i | 0x200], 3);
- int const b = combine_4_weights(bweights, bit0, bit1, bit2, bit3);
+ int const b = combine_weights(bweights, bit0, bit1, bit2, bit3);
palette.set_indirect_color(i, rgb_t(r, g, b));
}
diff --git a/src/mame/video/mbc55x.cpp b/src/mame/video/mbc55x.cpp
index f9f7f50cb49..c9ab2aac277 100644
--- a/src/mame/video/mbc55x.cpp
+++ b/src/mame/video/mbc55x.cpp
@@ -163,6 +163,40 @@ WRITE_LINE_MEMBER( mbc55x_state::vid_vsync_changed )
{
}
+static constexpr rgb_t mbc55x_pens[SCREEN_NO_COLOURS]
+{
+ // normal brightness
+ { 0x00, 0x00, 0x00 }, // black
+ { 0x00, 0x00, 0x80 }, // blue
+ { 0x00, 0x80, 0x00 }, // green
+ { 0x00, 0x80, 0x80 }, // cyan
+ { 0x80, 0x00, 0x00 }, // red
+ { 0x80, 0x00, 0x80 }, // magenta
+ { 0x80, 0x80, 0x00 }, // yellow
+ { 0x80, 0x80, 0x80 } // light grey
+};
+
+void mbc55x_state::mbc55x_palette(palette_device &palette) const
+{
+ logerror("initializing palette\n");
+
+ palette.set_pen_colors(0, mbc55x_pens);
+}
+
+/* Video ram page register */
+
+uint8_t mbc55x_state::vram_page_r()
+{
+ return m_vram_page;
+}
+
+void mbc55x_state::vram_page_w(uint8_t data)
+{
+ logerror("%s : set vram page to %02X\n", machine().describe_context(),data);
+
+ m_vram_page=data;
+}
+
void mbc55x_state::video_start()
{
m_debug_video=0;
diff --git a/src/mame/video/mbee.cpp b/src/mame/video/mbee.cpp
index 665e5fe75b1..0724f991cf7 100644
--- a/src/mame/video/mbee.cpp
+++ b/src/mame/video/mbee.cpp
@@ -256,7 +256,7 @@ WRITE8_MEMBER ( mbee_state::m6545_index_w )
{
data &= 0x1f;
m_sy6545_ind = data;
- m_crtc->address_w( space, 0, data );
+ m_crtc->address_w(data);
}
WRITE8_MEMBER ( mbee_state::m6545_data_w )
@@ -272,7 +272,7 @@ WRITE8_MEMBER ( mbee_state::m6545_data_w )
break;
}
m_sy6545_reg[m_sy6545_ind] = data & sy6545_mask[m_sy6545_ind]; /* save data in register */
- m_crtc->register_w( space, 0, data );
+ m_crtc->register_w(data);
if ((m_sy6545_ind > 8) && (m_sy6545_ind < 12)) sy6545_cursor_configure(); /* adjust cursor shape - remove when mame fixed */
}
diff --git a/src/mame/video/megasys1.cpp b/src/mame/video/megasys1.cpp
index 8b0d3dc577d..ace59ad82cd 100644
--- a/src/mame/video/megasys1.cpp
+++ b/src/mame/video/megasys1.cpp
@@ -202,17 +202,14 @@ VIDEO_START_MEMBER(megasys1_state,megasys1)
{
m_spriteram = &m_ram[0x8000/2];
- m_buffer_objectram = std::make_unique<uint16_t[]>(0x2000);
- m_buffer_spriteram16 = std::make_unique<uint16_t[]>(0x2000);
- m_buffer2_objectram = std::make_unique<uint16_t[]>(0x2000);
- m_buffer2_spriteram16 = std::make_unique<uint16_t[]>(0x2000);
+ m_buffer_objectram = std::make_unique<u16[]>(0x2000);
+ m_buffer_spriteram16 = std::make_unique<u16[]>(0x2000);
+ m_buffer2_objectram = std::make_unique<u16[]>(0x2000);
+ m_buffer2_spriteram16 = std::make_unique<u16[]>(0x2000);
m_active_layers = m_sprite_bank = m_screen_flag = m_sprite_flag = 0;
m_hardware_type_z = 0;
- if (strcmp(machine().system().name, "lomakai") == 0 ||
- strcmp(machine().system().name, "makaiden") == 0)
- m_hardware_type_z = 1;
m_screen->register_screen_bitmap(m_sprite_buffer_bitmap);
@@ -225,6 +222,12 @@ VIDEO_START_MEMBER(megasys1_state,megasys1)
save_item(NAME(m_sprite_flag));
}
+VIDEO_START_MEMBER(megasys1_state,megasys1_z)
+{
+ VIDEO_START_CALL_MEMBER(megasys1);
+ m_hardware_type_z = 1;
+}
+
/***************************************************************************
Video registers access
@@ -268,20 +271,20 @@ WRITE16_MEMBER(megasys1_state::screen_flag_w)
WRITE16_MEMBER(megasys1_state::soundlatch_w)
{
- m_soundlatch->write(space, 0, data, mem_mask);
+ m_soundlatch[0]->write(space, 0, data, mem_mask);
m_audiocpu->set_input_line(4, HOLD_LINE);
}
WRITE16_MEMBER(megasys1_state::soundlatch_z_w)
{
- m_soundlatch_z->write(space, 0, data & 0xff);
+ m_soundlatch[0]->write(space, 0, data & 0xff);
m_audiocpu->set_input_line(5, HOLD_LINE);
}
WRITE16_MEMBER(megasys1_state::soundlatch_c_w)
{
// Cybattler reads sound latch on irq 2
- m_soundlatch->write(space, 0, data, mem_mask);
+ m_soundlatch[0]->write(space, 0, data, mem_mask);
m_audiocpu->set_input_line(2, HOLD_LINE);
}
@@ -331,17 +334,17 @@ WRITE16_MEMBER(megasys1_state::monkelf_scroll1_w)
void megasys1_state::mix_sprite_bitmap(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{
gfx_element *decodegfx = m_gfxdecode->gfx(0);
- uint16_t colorbase = decodegfx->colorbase();
+ u16 colorbase = decodegfx->colorbase();
for (int y = cliprect.min_y;y <= cliprect.max_y;y++)
{
- uint16_t* srcline = &m_sprite_buffer_bitmap.pix16(y);
- uint16_t* dstline = &bitmap.pix16(y);
- uint8_t *prio = &screen.priority().pix8(y);
+ u16* srcline = &m_sprite_buffer_bitmap.pix16(y);
+ u16* dstline = &bitmap.pix16(y);
+ u8 *prio = &screen.priority().pix8(y);
for (int x = cliprect.min_x;x <= cliprect.max_x;x++)
{
- uint16_t pixel = srcline[x];
+ u16 pixel = srcline[x];
if ((pixel & 0xf) != 0xf)
{
@@ -350,7 +353,7 @@ void megasys1_state::mix_sprite_bitmap(screen_device &screen, bitmap_ind16 &bitm
if ((priority & (1 << (prio[x] & 0x1f))) == 0)
{
- uint8_t coldat = pixel & 0x3fff;
+ u8 coldat = pixel & 0x3fff;
dstline[x] = coldat + colorbase;
}
@@ -359,15 +362,15 @@ void megasys1_state::mix_sprite_bitmap(screen_device &screen, bitmap_ind16 &bitm
}
}
-void megasys1_state::partial_clear_sprite_bitmap(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, uint8_t param)
+void megasys1_state::partial_clear_sprite_bitmap(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, u8 param)
{
for (int y = cliprect.min_y;y <= cliprect.max_y;y++)
{
- uint16_t* srcline = &m_sprite_buffer_bitmap.pix16(y);
+ u16* srcline = &m_sprite_buffer_bitmap.pix16(y);
for (int x = cliprect.min_x;x <= cliprect.max_x;x++)
{
- uint16_t pixel = srcline[x];
+ u16 pixel = srcline[x];
srcline[x] = pixel & 0x7fff; // wipe our 'drawn here' marker otherwise trails will always have priority over new sprites, which is incorrect.
// guess, very unclear from the video refernece we have, used when removing p47 trails
@@ -378,13 +381,13 @@ void megasys1_state::partial_clear_sprite_bitmap(screen_device &screen, bitmap_i
}
-inline void megasys1_state::draw_16x16_priority_sprite(screen_device &screen, bitmap_ind16 &bitmap,const rectangle &cliprect, int32_t code, int32_t color, int32_t sx, int32_t sy, int32_t flipx, int32_t flipy, uint8_t mosaic, uint8_t mosaicsol, int32_t priority)
+inline void megasys1_state::draw_16x16_priority_sprite(screen_device &screen, bitmap_ind16 &bitmap,const rectangle &cliprect, s32 code, s32 color, s32 sx, s32 sy, s32 flipx, s32 flipy, u8 mosaic, u8 mosaicsol, s32 priority)
{
// if (sy >= nScreenHeight || sy < -15 || sx >= nScreenWidth || sx < -15) return;
gfx_element *decodegfx = m_gfxdecode->gfx(0);
sy = sy + 16;
- const uint8_t* gfx = decodegfx->get_data(code);
+ const u8* gfx = decodegfx->get_data(code);
flipy = (flipy) ? 0x0f : 0;
flipx = (flipx) ? 0x0f : 0;
@@ -392,28 +395,28 @@ inline void megasys1_state::draw_16x16_priority_sprite(screen_device &screen, bi
color = color * 16;
- for (int32_t y = 0; y < 16; y++, sy++, sx-=16)
+ for (s32 y = 0; y < 16; y++, sy++, sx-=16)
{
- // uint16_t *dest = &bitmap.pix16(sy)+ sx;
- // uint8_t *prio = &screen.priority().pix8(sy) + sx;
- uint16_t* dest = &m_sprite_buffer_bitmap.pix16(sy)+ sx;
+ // u16 *dest = &bitmap.pix16(sy)+ sx;
+ // u8 *prio = &screen.priority().pix8(sy) + sx;
+ u16* dest = &m_sprite_buffer_bitmap.pix16(sy)+ sx;
- for (int32_t x = 0; x < 16; x++, sx++)
+ for (s32 x = 0; x < 16; x++, sx++)
{
if (sx < cliprect.min_x || sy < cliprect.min_y || sx > cliprect.max_x || sy > cliprect.max_y) continue;
- int32_t pxl;
+ s32 pxl;
- if (mosaicsol) {
+ if (mosaicsol)
pxl = gfx[(((y ^ flipy) | mosaic) * 16) + ((x ^ flipx) | mosaic)];
- } else {
+ else
pxl = gfx[(((y ^ flipy) & ~mosaic) * 16) + ((x ^ flipx) & ~mosaic)];
- }
- if (pxl != 0x0f) {
- if (!(dest[x] & 0x8000)) {
+ if (pxl != 0x0f)
+ {
+ if (!(dest[x] & 0x8000))
+ {
dest[x] = (pxl+color) | (priority << 14);
-
dest[x] |= 0x8000;
}
}
@@ -446,36 +449,36 @@ void megasys1_state::draw_sprites(screen_device &screen, bitmap_ind16 &bitmap,co
partial_clear_sprite_bitmap(screen, bitmap, cliprect, m_sprite_flag&0x0f);
}
- int32_t color_mask = (m_sprite_flag & 0x100) ? 0x07 : 0x0f;
+ s32 color_mask = (m_sprite_flag & 0x100) ? 0x07 : 0x0f;
- uint16_t *objectram = (uint16_t*)m_buffer2_objectram.get();
- uint16_t *spriteram = (uint16_t*)m_buffer2_spriteram16.get();
+ u16 *objectram = (u16*)m_buffer2_objectram.get();
+ u16 *spriteram = (u16*)m_buffer2_spriteram16.get();
- for (int32_t offs = (0x800-8)/2; offs >= 0; offs -= 4)
+ for (s32 offs = (0x800-8)/2; offs >= 0; offs -= 4)
{
- for (int32_t sprite = 0; sprite < 4 ; sprite ++)
+ for (s32 sprite = 0; sprite < 4 ; sprite ++)
{
- uint16_t *objectdata = &objectram[offs + (0x800/2) * sprite];
- uint16_t *spritedata = &spriteram[(objectdata[0] & 0x7f) * 8];
+ u16 *objectdata = &objectram[offs + (0x800/2) * sprite];
+ u16 *spritedata = &spriteram[(objectdata[0] & 0x7f) * 8];
- int32_t attr = spritedata[4];
+ s32 attr = spritedata[4];
if (((attr & 0xc0) >> 6) != sprite) continue;
- int32_t sx = (spritedata[5] + objectdata[1]) & 0x1ff;
- int32_t sy = (spritedata[6] + objectdata[2]) & 0x1ff;
+ s32 sx = (spritedata[5] + objectdata[1]) & 0x1ff;
+ s32 sy = (spritedata[6] + objectdata[2]) & 0x1ff;
if (sx > 255) sx -= 512;
if (sy > 255) sy -= 512;
- int32_t code = spritedata[7] + objectdata[3];
- int32_t color = attr & color_mask;
+ s32 code = spritedata[7] + objectdata[3];
+ s32 color = attr & color_mask;
- int32_t flipx = attr & 0x40;
- int32_t flipy = attr & 0x80;
- //int32_t pri = (attr & 0x08) ? 0x0c : 0x0a;
- int32_t pri = (attr & 0x08)>>3;
- int32_t mosaic = (attr & 0x0f00)>>8;
- int32_t mossol = (attr & 0x1000)>>8;
+ s32 flipx = attr & 0x40;
+ s32 flipy = attr & 0x80;
+ //s32 pri = (attr & 0x08) ? 0x0c : 0x0a;
+ s32 pri = (attr & 0x08)>>3;
+ s32 mosaic = (attr & 0x0f00)>>8;
+ s32 mossol = (attr & 0x1000)>>8;
code = (code & 0xfff) + ((m_sprite_bank & 1) << 12);
@@ -493,13 +496,13 @@ void megasys1_state::draw_sprites(screen_device &screen, bitmap_ind16 &bitmap,co
} /* non Z hw */
else
{
- uint16_t *spriteram16 = m_spriteram;
+ u16 *spriteram16 = m_spriteram;
/* MS1-Z just draws Sprite Data, and in reverse order */
for (sprite = 0x80-1;sprite >= 0;sprite--)
{
- uint16_t *spritedata = &spriteram16[ sprite * 0x10/2];
+ u16 *spritedata = &spriteram16[ sprite * 0x10/2];
attr = spritedata[ 8/2 ];
@@ -613,7 +616,7 @@ struct priority
*/
void megasys1_state::priority_create()
{
- const uint8_t *color_prom = memregion("proms")->base();
+ const u8 *color_prom = memregion("proms")->base();
int pri_code, offset, i, order;
/* convert PROM to something we can use */
@@ -766,7 +769,7 @@ void megasys1_state::megasys1_palette(palette_device &palette)
***************************************************************************/
-uint32_t megasys1_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
+u32 megasys1_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{
int i, flag, pri, primask;
int active_layers;
diff --git a/src/mame/video/megazone.cpp b/src/mame/video/megazone.cpp
index fb3356010fa..908aef20564 100644
--- a/src/mame/video/megazone.cpp
+++ b/src/mame/video/megazone.cpp
@@ -60,18 +60,18 @@ void megazone_state::megazone_palette(palette_device &palette) const
bit0 = BIT(color_prom[i], 0);
bit1 = BIT(color_prom[i], 1);
bit2 = BIT(color_prom[i], 2);
- int const r = combine_3_weights(rweights, bit0, bit1, bit2);
+ int const r = combine_weights(rweights, bit0, bit1, bit2);
// green component
bit0 = BIT(color_prom[i], 3);
bit1 = BIT(color_prom[i], 4);
bit2 = BIT(color_prom[i], 5);
- int const g = combine_3_weights(gweights, bit0, bit1, bit2);
+ int const g = combine_weights(gweights, bit0, bit1, bit2);
// blue component
bit0 = BIT(color_prom[i], 6);
bit1 = BIT(color_prom[i], 7);
- int const b = combine_2_weights(bweights, bit0, bit1);
+ int const b = combine_weights(bweights, bit0, bit1);
palette.set_indirect_color(i, rgb_t(r, g, b));
}
diff --git a/src/mame/video/mikie.cpp b/src/mame/video/mikie.cpp
index ec37c32e220..434bbbf82e9 100644
--- a/src/mame/video/mikie.cpp
+++ b/src/mame/video/mikie.cpp
@@ -50,21 +50,21 @@ void mikie_state::mikie_palette(palette_device &palette) const
bit1 = BIT(color_prom[i + 0x000], 1);
bit2 = BIT(color_prom[i + 0x000], 2);
bit3 = BIT(color_prom[i + 0x000], 3);
- int const r = combine_4_weights(rweights, bit0, bit1, bit2, bit3);
+ int const r = combine_weights(rweights, bit0, bit1, bit2, bit3);
// green component
bit0 = BIT(color_prom[i + 0x100], 0);
bit1 = BIT(color_prom[i + 0x100], 1);
bit2 = BIT(color_prom[i + 0x100], 2);
bit3 = BIT(color_prom[i + 0x100], 3);
- int const g = combine_4_weights(gweights, bit0, bit1, bit2, bit3);
+ int const g = combine_weights(gweights, bit0, bit1, bit2, bit3);
// blue component
bit0 = BIT(color_prom[i + 0x200], 0);
bit1 = BIT(color_prom[i + 0x200], 1);
bit2 = BIT(color_prom[i + 0x200], 2);
bit3 = BIT(color_prom[i + 0x200], 3);
- int const b = combine_4_weights(bweights, bit0, bit1, bit2, bit3);
+ int const b = combine_weights(bweights, bit0, bit1, bit2, bit3);
palette.set_indirect_color(i, rgb_t(r, g, b));
}
diff --git a/src/mame/video/mikromik.cpp b/src/mame/video/mikromik.cpp
index 25bce3b9a97..f66a3af4e21 100644
--- a/src/mame/video/mikromik.cpp
+++ b/src/mame/video/mikromik.cpp
@@ -126,29 +126,30 @@ void mm1_state::mm1_palette(palette_device &palette) const
//-------------------------------------------------
-// MACHINE_CONFIG_START( mm1m6_video )
+// machine_config( mm1m6_video )
//-------------------------------------------------
-MACHINE_CONFIG_START(mm1_state::mm1m6_video)
- MCFG_SCREEN_ADD( SCREEN_TAG, RASTER )
- MCFG_SCREEN_REFRESH_RATE( 50 )
- MCFG_SCREEN_UPDATE_DRIVER(mm1_state, screen_update)
- MCFG_SCREEN_SIZE( 800, 375 ) // (25 text rows * 15 vertical pixels / character)
- MCFG_SCREEN_VISIBLE_AREA( 0, 800-1, 0, 375-1 )
- //MCFG_SCREEN_RAW_PARAMS(XTAL(18'720'000), ...)
+void mm1_state::mm1m6_video(machine_config &config)
+{
+ screen_device &screen(SCREEN(config, SCREEN_TAG, SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz( 50 );
+ screen.set_screen_update(FUNC(mm1_state::screen_update));
+ screen.set_size( 800, 375 ); // (25 text rows * 15 vertical pixels / character)
+ screen.set_visarea( 0, 800-1, 0, 375-1 );
+ //screen.set_raw(XTAL(18'720'000), ...);
GFXDECODE(config, "gfxdecode", m_palette, gfx_mm1);
PALETTE(config, m_palette, FUNC(mm1_state::mm1_palette), 3);
- MCFG_DEVICE_ADD(I8275_TAG, I8275, XTAL(18'720'000)/8)
- MCFG_I8275_CHARACTER_WIDTH(HORIZONTAL_CHARACTER_PIXELS)
- MCFG_I8275_DRAW_CHARACTER_CALLBACK_OWNER(mm1_state, crtc_display_pixels)
- MCFG_I8275_DRQ_CALLBACK(WRITELINE(I8237_TAG, am9517a_device, dreq0_w))
- MCFG_I8275_VRTC_CALLBACK(WRITELINE(UPD7220_TAG, upd7220_device, ext_sync_w))
- MCFG_VIDEO_SET_SCREEN(SCREEN_TAG)
+ I8275(config, m_crtc, XTAL(18'720'000)/8);
+ m_crtc->set_character_width(HORIZONTAL_CHARACTER_PIXELS);
+ m_crtc->set_display_callback(FUNC(mm1_state::crtc_display_pixels), this);
+ m_crtc->drq_wr_callback().set(m_dmac, FUNC(am9517a_device::dreq0_w));
+ m_crtc->vrtc_wr_callback().set(m_hgdc, FUNC(upd7220_device::ext_sync_w));
+ m_crtc->set_screen("screen");
UPD7220(config, m_hgdc, XTAL(18'720'000)/8);
m_hgdc->set_addrmap(0, &mm1_state::mm1_upd7220_map);
- m_hgdc->set_display_pixels_callback(FUNC(mm1_state::hgdc_display_pixels), this);
+ m_hgdc->set_display_pixels(FUNC(mm1_state::hgdc_display_pixels));
m_hgdc->set_screen(SCREEN_TAG);
-MACHINE_CONFIG_END
+}
diff --git a/src/mame/video/mystston.cpp b/src/mame/video/mystston.cpp
index 564b9ca6ce0..ef5f62baa32 100644
--- a/src/mame/video/mystston.cpp
+++ b/src/mame/video/mystston.cpp
@@ -100,18 +100,18 @@ void mystston_state::set_palette()
bit0 = (data >> 0) & 0x01;
bit1 = (data >> 1) & 0x01;
bit2 = (data >> 2) & 0x01;
- r = combine_3_weights(weights_rg, bit0, bit1, bit2);
+ r = combine_weights(weights_rg, bit0, bit1, bit2);
/* green component */
bit0 = (data >> 3) & 0x01;
bit1 = (data >> 4) & 0x01;
bit2 = (data >> 5) & 0x01;
- g = combine_3_weights(weights_rg, bit0, bit1, bit2);
+ g = combine_weights(weights_rg, bit0, bit1, bit2);
/* blue component */
bit0 = (data >> 6) & 0x01;
bit1 = (data >> 7) & 0x01;
- b = combine_2_weights(weights_b, bit0, bit1);
+ b = combine_weights(weights_b, bit0, bit1);
m_palette->set_pen_color(i, rgb_t(r, g, b));
}
@@ -213,7 +213,7 @@ void mystston_state::draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprec
*
*************************************/
-VIDEO_START_MEMBER(mystston_state,mystston)
+void mystston_state::video_start()
{
m_bg_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(mystston_state::get_bg_tile_info),this), TILEMAP_SCAN_COLS_FLIP_X, 16, 16, 16, 32);
@@ -232,7 +232,7 @@ VIDEO_START_MEMBER(mystston_state,mystston)
*
*************************************/
-VIDEO_RESET_MEMBER(mystston_state,mystston)
+void mystston_state::video_reset()
{
m_interrupt_timer->adjust(m_screen->time_until_pos(FIRST_INT_VPOS - 1, INT_HPOS), FIRST_INT_VPOS);
}
@@ -310,15 +310,13 @@ GFXDECODE_END
*
*************************************/
-MACHINE_CONFIG_START(mystston_state::mystston_video)
- MCFG_VIDEO_START_OVERRIDE(mystston_state,mystston)
- MCFG_VIDEO_RESET_OVERRIDE(mystston_state,mystston)
-
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_mystston)
- MCFG_PALETTE_ADD("palette", 0x40)
+void mystston_state::mystston_video(machine_config &config)
+{
+ GFXDECODE(config, m_gfxdecode, m_palette, gfx_mystston);
+ PALETTE(config, m_palette).set_entries(0x40);
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_RAW_PARAMS(PIXEL_CLOCK, HTOTAL, HBEND, HBSTART, VTOTAL, VBEND, VBSTART)
- MCFG_SCREEN_UPDATE_DRIVER(mystston_state, screen_update_mystston)
- MCFG_SCREEN_PALETTE("palette")
-MACHINE_CONFIG_END
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_raw(PIXEL_CLOCK, HTOTAL, HBEND, HBSTART, VTOTAL, VBEND, VBSTART);
+ m_screen->set_screen_update(FUNC(mystston_state::screen_update_mystston));
+ m_screen->set_palette("palette");
+}
diff --git a/src/mame/video/namcos1.cpp b/src/mame/video/namcos1.cpp
index af5c91be3a1..ccabf3c0ca9 100644
--- a/src/mame/video/namcos1.cpp
+++ b/src/mame/video/namcos1.cpp
@@ -53,7 +53,7 @@ Namco System 1 Video Hardware
***************************************************************************/
-void namcos1_state::TilemapCB(uint16_t code, int *tile, int *mask)
+void namcos1_state::TilemapCB(u16 code, int *tile, int *mask)
{
code &= 0x3fff;
*tile = code;
@@ -82,7 +82,7 @@ void namcos1_state::video_start()
for (i = 0x0800;i < 0x1000;i++)
m_c116->shadow_table()[i] = i + 0x0800;
- m_copy_sprites = 0;
+ m_copy_sprites = false;
save_item(NAME(m_copy_sprites));
}
@@ -95,7 +95,7 @@ void namcos1_state::video_start()
***************************************************************************/
-WRITE8_MEMBER( namcos1_state::spriteram_w )
+void namcos1_state::spriteram_w(offs_t offset, u8 data)
{
/* 0000-07ff work ram */
/* 0800-0fff sprite ram */
@@ -103,7 +103,7 @@ WRITE8_MEMBER( namcos1_state::spriteram_w )
/* a write to this offset tells the sprite chip to buffer the sprite list */
if (offset == 0x0ff2)
- m_copy_sprites = 1;
+ m_copy_sprites = true;
}
@@ -136,32 +136,32 @@ sprite format:
void namcos1_state::draw_sprites(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{
- uint8_t *spriteram = m_spriteram + 0x800;
- const uint8_t *source = &spriteram[0x800-0x20]; /* the last is NOT a sprite */
- const uint8_t *finish = &spriteram[0];
+ u8 *spriteram = m_spriteram + 0x800;
+ const u8 *source = &spriteram[0x800-0x20]; /* the last is NOT a sprite */
+ const u8 *finish = &spriteram[0];
gfx_element *gfx = m_gfxdecode->gfx(0);
- int sprite_xoffs = spriteram[0x07f5] + ((spriteram[0x07f4] & 1) << 8);
- int sprite_yoffs = spriteram[0x07f7];
+ const int sprite_xoffs = spriteram[0x07f5] + ((spriteram[0x07f4] & 1) << 8);
+ const int sprite_yoffs = spriteram[0x07f7];
while (source >= finish)
{
static const int sprite_size[4] = { 16, 8, 32, 4 };
- int attr1 = source[10];
- int attr2 = source[14];
- int color = source[12];
+ const u8 attr1 = source[10];
+ const u8 attr2 = source[14];
+ u32 color = source[12];
int flipx = (attr1 & 0x20) >> 5;
int flipy = (attr2 & 0x01);
- int sizex = sprite_size[(attr1 & 0xc0) >> 6];
- int sizey = sprite_size[(attr2 & 0x06) >> 1];
- int tx = (attr1 & 0x18) & (~(sizex-1));
- int ty = (attr2 & 0x18) & (~(sizey-1));
+ const u16 sizex = sprite_size[(attr1 & 0xc0) >> 6];
+ const u16 sizey = sprite_size[(attr2 & 0x06) >> 1];
+ const u16 tx = (attr1 & 0x18) & (~(sizex - 1));
+ const u16 ty = (attr2 & 0x18) & (~(sizey - 1));
int sx = source[13] + ((color & 0x01) << 8);
int sy = -source[15] - sizey;
- int sprite = source[11];
- int sprite_bank = attr1 & 7;
- int priority = (source[14] & 0xe0) >> 5;
- int pri_mask = (0xff << (priority + 1)) & 0xff;
+ u32 sprite = source[11];
+ const u32 sprite_bank = attr1 & 7;
+ const int priority = (source[14] & 0xe0) >> 5;
+ const u8 pri_mask = (0xff << (priority + 1)) & 0xff;
sprite += sprite_bank * 256;
color = color >> 1;
@@ -205,7 +205,7 @@ void namcos1_state::draw_sprites(screen_device &screen, bitmap_ind16 &bitmap, co
-uint32_t namcos1_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
+u32 namcos1_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{
int i;
rectangle new_clip = cliprect;
@@ -252,16 +252,15 @@ WRITE_LINE_MEMBER(namcos1_state::screen_vblank)
{
if (m_copy_sprites)
{
- uint8_t *spriteram = m_spriteram + 0x800;
- int i,j;
+ u8 *spriteram = m_spriteram + 0x800;
- for (i = 0;i < 0x800;i += 16)
+ for (int i = 0; i < 0x800; i += 16)
{
- for (j = 10;j < 16;j++)
- spriteram[i+j] = spriteram[i+j - 6];
+ for (int j = 10; j < 16; j++)
+ spriteram[i + j] = spriteram[i + j - 6];
}
- m_copy_sprites = 0;
+ m_copy_sprites = false;
}
m_maincpu->set_input_line(M6809_IRQ_LINE, ASSERT_LINE);
m_subcpu->set_input_line(M6809_IRQ_LINE, ASSERT_LINE);
diff --git a/src/mame/video/naughtyb.cpp b/src/mame/video/naughtyb.cpp
index 650183619bb..ef6ebf5f485 100644
--- a/src/mame/video/naughtyb.cpp
+++ b/src/mame/video/naughtyb.cpp
@@ -78,17 +78,17 @@ void naughtyb_state::naughtyb_palette(palette_device &palette) const
// red component
bit0 = BIT(color_prom[i], 0);
bit1 = BIT(color_prom[i+0x100], 0);
- int const r = combine_2_weights(weights, bit0, bit1);
+ int const r = combine_weights(weights, bit0, bit1);
// green component
bit0 = BIT(color_prom[i], 2);
bit1 = BIT(color_prom[i+0x100], 2);
- int const g = combine_2_weights(weights, bit0, bit1);
+ int const g = combine_weights(weights, bit0, bit1);
// blue component
bit0 = BIT(color_prom[i], 1);
bit1 = BIT(color_prom[i+0x100], 1);
- int const b = combine_2_weights(weights, bit0, bit1);
+ int const b = combine_weights(weights, bit0, bit1);
palette.set_pen_color(bitswap<8>(i, 5, 7, 6, 2, 1, 0, 4, 3), rgb_t(r, g, b));
}
diff --git a/src/mame/video/neogeo.cpp b/src/mame/video/neogeo.cpp
index 47e88ab434c..4360a7c6dde 100644
--- a/src/mame/video/neogeo.cpp
+++ b/src/mame/video/neogeo.cpp
@@ -59,10 +59,10 @@ void neogeo_base_state::create_rgb_lookups()
int i2 = (i >> 2) & 1;
int i1 = (i >> 1) & 1;
int i0 = (i >> 0) & 1;
- m_palette_lookup[i][0] = combine_5_weights(weights_normal, i0, i1, i2, i3, i4);
- m_palette_lookup[i][1] = combine_5_weights(weights_dark, i0, i1, i2, i3, i4);
- m_palette_lookup[i][2] = combine_5_weights(weights_shadow, i0, i1, i2, i3, i4);
- m_palette_lookup[i][3] = combine_5_weights(weights_dark_shadow, i0, i1, i2, i3, i4);
+ m_palette_lookup[i][0] = combine_weights(weights_normal, i0, i1, i2, i3, i4);
+ m_palette_lookup[i][1] = combine_weights(weights_dark, i0, i1, i2, i3, i4);
+ m_palette_lookup[i][2] = combine_weights(weights_shadow, i0, i1, i2, i3, i4);
+ m_palette_lookup[i][3] = combine_weights(weights_dark_shadow, i0, i1, i2, i3, i4);
}
}
diff --git a/src/mame/video/neogeo_spr.cpp b/src/mame/video/neogeo_spr.cpp
index ea4fd41fd88..b069f8fc143 100644
--- a/src/mame/video/neogeo_spr.cpp
+++ b/src/mame/video/neogeo_spr.cpp
@@ -18,7 +18,9 @@ neosprite_base_device::neosprite_base_device(
device_t *owner,
uint32_t clock)
: device_t(mconfig, type, tag, owner, clock)
+ , device_video_interface(mconfig, *this)
, m_bppshift(4)
+ , m_region_zoomy(*this, "zoomy")
{
}
@@ -53,9 +55,6 @@ void neosprite_base_device::device_start()
save_item(NAME(m_auto_animation_disabled));
save_item(NAME(m_auto_animation_counter));
save_item(NAME(m_auto_animation_frame_counter));
-
-
- m_region_zoomy = memregion(":zoomy")->base();
}
void neosprite_base_device::device_reset()
@@ -146,7 +145,7 @@ TIMER_CALLBACK_MEMBER(neosprite_base_device::auto_animation_timer_callback)
else
m_auto_animation_frame_counter = m_auto_animation_frame_counter - 1;
- m_auto_animation_timer->adjust(m_screen->time_until_pos(NEOGEO_VSSTART));
+ m_auto_animation_timer->adjust(screen().time_until_pos(NEOGEO_VSSTART));
}
@@ -158,7 +157,7 @@ void neosprite_base_device::create_auto_animation_timer()
void neosprite_base_device::start_auto_animation_timer()
{
- m_auto_animation_timer->adjust(m_screen->time_until_pos(NEOGEO_VSSTART));
+ m_auto_animation_timer->adjust(screen().time_until_pos(NEOGEO_VSSTART));
}
@@ -178,7 +177,6 @@ void neosprite_base_device::neogeo_set_fixed_layer_source(uint8_t data)
void neosprite_base_device::draw_fixed_layer(bitmap_rgb32 &bitmap, int scanline)
{
assert((m_fixed_layer_source && m_region_fixed != nullptr) || (m_region_fixedbios != nullptr));
- int x;
uint8_t* gfx_base = m_fixed_layer_source ? m_region_fixed : m_region_fixedbios->base();
uint32_t addr_mask = ( m_fixed_layer_source ? m_region_fixed_size : m_region_fixedbios->bytes() ) - 1;
@@ -207,7 +205,7 @@ void neosprite_base_device::draw_fixed_layer(bitmap_rgb32 &bitmap, int scanline)
}
}
- for (x = 0; x < 40; x++)
+ for (int x = 0; x < 40; x++)
{
uint16_t code_and_palette = *video_data;
uint16_t code = code_and_palette & 0x0fff;
@@ -228,22 +226,19 @@ void neosprite_base_device::draw_fixed_layer(bitmap_rgb32 &bitmap, int scanline)
}
{
- int i;
int gfx_offset = ((code << 5) | (scanline & 0x07)) & addr_mask;
const pen_t *char_pens;
char_pens = &m_pens[code_and_palette >> 12 << m_bppshift];
-
static const uint32_t pix_offsets[] = { 0x10, 0x18, 0x00, 0x08 };
- for (i = 0; i < 4; i++)
+ for (int i = 0; i < 4; i++)
{
draw_fixed_layer_2pixels(pixel_addr, gfx_offset + pix_offsets[i], gfx_base, char_pens);
}
}
-
video_data = video_data + 0x20;
}
}
@@ -274,26 +269,8 @@ inline void neosprite_base_device::draw_fixed_layer_2pixels(uint32_t*&pixel_addr
/* horizontal zoom table - verified on real hardware */
-static const int zoom_x_tables[][16] =
-{
- { 0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0 },
- { 0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0 },
- { 0,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0 },
- { 0,0,1,0,1,0,0,0,1,0,0,0,1,0,0,0 },
- { 0,0,1,0,1,0,0,0,1,0,0,0,1,0,1,0 },
- { 0,0,1,0,1,0,1,0,1,0,0,0,1,0,1,0 },
- { 0,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0 },
- { 1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0 },
- { 1,0,1,0,1,0,1,0,1,1,1,0,1,0,1,0 },
- { 1,0,1,1,1,0,1,0,1,1,1,0,1,0,1,0 },
- { 1,0,1,1,1,0,1,0,1,1,1,0,1,0,1,1 },
- { 1,0,1,1,1,0,1,1,1,1,1,0,1,0,1,1 },
- { 1,0,1,1,1,0,1,1,1,1,1,0,1,1,1,1 },
- { 1,1,1,1,1,0,1,1,1,1,1,0,1,1,1,1 },
- { 1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1 },
- { 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 }
-};
-
+static const u16 zoom_x_tables[16] =
+{ 0x0080, 0x0880, 0x0888, 0x2888, 0x288a, 0x2a8a, 0x2aaa, 0xaaaa, 0xaaea, 0xbaea, 0xbaeb, 0xbbeb, 0xbbef, 0xfbef, 0xfbff, 0xffff };
inline bool neosprite_base_device::sprite_on_scanline(int scanline, int y, int rows)
@@ -302,13 +279,9 @@ inline bool neosprite_base_device::sprite_on_scanline(int scanline, int y, int r
}
-
-
void neosprite_base_device::draw_sprites(bitmap_rgb32 &bitmap, int scanline)
{
- int sprite_index;
int max_sprite_index;
-
int y = 0;
int x = 0;
int rows = 0;
@@ -335,7 +308,7 @@ void neosprite_base_device::draw_sprites(bitmap_rgb32 &bitmap, int scanline)
if (max_sprite_index != (MAX_SPRITES_PER_LINE - 1))
max_sprite_index = max_sprite_index + 1;
- for (sprite_index = 0; sprite_index <= max_sprite_index; sprite_index++)
+ for (int sprite_index = 0; sprite_index <= max_sprite_index; sprite_index++)
{
uint16_t sprite_number = sprite_list[sprite_index] & 0x01ff;
uint16_t y_control = m_videoram_drawsource[0x8200 | sprite_number];
@@ -373,7 +346,6 @@ void neosprite_base_device::draw_sprites(bitmap_rgb32 &bitmap, int scanline)
offs_t attr_and_code_offs;
uint16_t attr;
uint32_t code;
- const int *zoom_x_table;
const pen_t *line_pens;
int x_inc;
@@ -423,15 +395,13 @@ void neosprite_base_device::draw_sprites(bitmap_rgb32 &bitmap, int scanline)
if (attr & 0x0002)
sprite_y ^= 0x0f;
- zoom_x_table = zoom_x_tables[zoom_x];
+ u16 zoom_x_table = zoom_x_tables[zoom_x];
/* compute offset in gfx ROM and mask it to the number of bits available */
int gfx_base = ((code << 8) | (sprite_y << 4)) & m_sprite_gfx_address_mask;
-
line_pens = &m_pens[attr >> 8 << m_bppshift];
-
/* horizontal flip? */
if (attr & 0x0001)
{
@@ -444,34 +414,33 @@ void neosprite_base_device::draw_sprites(bitmap_rgb32 &bitmap, int scanline)
/* draw the line - no wrap-around */
if (x <= 0x01f0)
{
- int i;
-
uint32_t *pixel_addr = &bitmap.pix32(scanline, x + NEOGEO_HBEND);
- for (i = 0; i < 0x10; i++)
+ for (int i = 0; i < 0x10; i++)
{
- if (*zoom_x_table)
+ if (zoom_x_table & 0x8000)
{
draw_pixel(gfx_base, pixel_addr, line_pens);
pixel_addr++;
}
- zoom_x_table++;
+ zoom_x_table <<= 1;
+ if (zoom_x_table == 0)
+ break;
+
gfx_base += x_inc;
}
}
/* wrap-around */
else
{
- int i;
-
int x_save = x;
uint32_t *pixel_addr = &bitmap.pix32(scanline, NEOGEO_HBEND);
- for (i = 0; i < 0x10; i++)
+ for (int i = 0; i < 0x10; i++)
{
- if (*zoom_x_table)
+ if (zoom_x_table & 0x8000)
{
if (x >= 0x200)
{
@@ -483,10 +452,12 @@ void neosprite_base_device::draw_sprites(bitmap_rgb32 &bitmap, int scanline)
x++;
}
- zoom_x_table++;
+ zoom_x_table <<= 1;
+ if (zoom_x_table == 0)
+ break;
+
gfx_base += x_inc;
}
-
x = x_save;
}
}
@@ -552,14 +523,14 @@ TIMER_CALLBACK_MEMBER(neosprite_base_device::sprite_line_timer_callback)
/* we are at the beginning of a scanline -
we need to draw the previous scanline and parse the sprites on the current one */
if (scanline != 0)
- m_screen->update_partial(scanline - 1);
+ screen().update_partial(scanline - 1);
parse_sprites(scanline);
/* let's come back at the beginning of the next line */
scanline = (scanline + 1) % NEOGEO_VTOTAL;
- m_sprite_line_timer->adjust(m_screen->time_until_pos(scanline), scanline);
+ m_sprite_line_timer->adjust(screen().time_until_pos(scanline), scanline);
}
@@ -571,7 +542,7 @@ void neosprite_base_device::create_sprite_line_timer()
void neosprite_base_device::start_sprite_line_timer()
{
- m_sprite_line_timer->adjust(m_screen->time_until_pos(0));
+ m_sprite_line_timer->adjust(screen().time_until_pos(0));
}
@@ -626,11 +597,6 @@ void neosprite_base_device::set_fixed_regions(uint8_t* fix_cart, uint32_t fix_ca
m_region_fixedbios = fix_bios;
}
-void neosprite_base_device::set_screen(screen_device* screen)
-{
- m_screen = screen;
-}
-
void neosprite_base_device::set_pens(const pen_t* pens)
{
m_pens = pens;
diff --git a/src/mame/video/neogeo_spr.h b/src/mame/video/neogeo_spr.h
index 0c4cc9ce5d6..983915cf10d 100644
--- a/src/mame/video/neogeo_spr.h
+++ b/src/mame/video/neogeo_spr.h
@@ -21,7 +21,7 @@
#define NEOGEO_VSSTART (0x100)
// todo, sort out what needs to be public and make the rest private/protected
-class neosprite_base_device : public device_t
+class neosprite_base_device : public device_t, public device_video_interface
{
public:
virtual void optimize_sprite_data();
@@ -48,7 +48,6 @@ public:
void start_sprite_line_timer();
virtual void set_sprite_region(uint8_t* region_sprites, uint32_t region_sprites_size);
void set_fixed_regions(uint8_t* fix_cart, uint32_t fix_cart_size, memory_region* fix_bios);
- void set_screen(screen_device* screen);
void set_pens(const pen_t* pens);
std::unique_ptr<uint16_t[]> m_videoram;
@@ -58,8 +57,6 @@ public:
uint16_t m_vram_read_buffer;
uint16_t m_vram_modulo;
- const uint8_t *m_region_zoomy;
-
uint32_t m_sprite_gfx_address_mask;
uint8_t m_auto_animation_speed;
@@ -76,7 +73,6 @@ public:
TIMER_CALLBACK_MEMBER(auto_animation_timer_callback);
TIMER_CALLBACK_MEMBER(sprite_line_timer_callback);
-
int m_bppshift; // 4 for 4bpp gfx (NeoGeo) 8 for 8bpp gfx (Midas)
protected:
@@ -93,8 +89,9 @@ protected:
uint8_t* m_region_sprites; uint32_t m_region_sprites_size;
uint8_t* m_region_fixed; uint32_t m_region_fixed_size;
memory_region* m_region_fixedbios;
- screen_device* m_screen;
const pen_t *m_pens;
+
+ required_region_ptr<uint8_t> m_region_zoomy;
};
diff --git a/src/mame/video/newbrain.cpp b/src/mame/video/newbrain.cpp
index c829acc2e90..4e49210aeaa 100644
--- a/src/mame/video/newbrain.cpp
+++ b/src/mame/video/newbrain.cpp
@@ -186,14 +186,15 @@ GFXDECODE_END
/* Machine Drivers */
-MACHINE_CONFIG_START(newbrain_state::newbrain_video)
- MCFG_SCREEN_ADD_MONOCHROME(SCREEN_TAG, RASTER, rgb_t::green())
- MCFG_SCREEN_UPDATE_DRIVER(newbrain_state, screen_update)
- MCFG_SCREEN_REFRESH_RATE(50)
- MCFG_SCREEN_SIZE(640, 250)
- MCFG_SCREEN_VISIBLE_AREA(0, 639, 0, 249)
+void newbrain_state::newbrain_video(machine_config &config)
+{
+ screen_device &screen(SCREEN(config, SCREEN_TAG, SCREEN_TYPE_RASTER, rgb_t::green()));
+ screen.set_screen_update(FUNC(newbrain_state::screen_update));
+ screen.set_refresh_hz(50);
+ screen.set_size(640, 250);
+ screen.set_visarea(0, 639, 0, 249);
PALETTE(config, m_palette, palette_device::MONOCHROME);
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_newbrain)
-MACHINE_CONFIG_END
+ GFXDECODE(config, "gfxdecode", m_palette, gfx_newbrain);
+}
diff --git a/src/mame/video/newport.cpp b/src/mame/video/newport.cpp
index f26ec2039ec..72715b628db 100644
--- a/src/mame/video/newport.cpp
+++ b/src/mame/video/newport.cpp
@@ -37,9 +37,10 @@
#define LOG_XMAP1 (1 << 5)
#define LOG_REX3 (1 << 6)
#define LOG_COMMANDS (1 << 7)
+#define LOG_REJECTS (1 << 8)
#define LOG_ALL (LOG_UNKNOWN | LOG_VC2 | LOG_CMAP0 | LOG_CMAP1 | LOG_XMAP0 | LOG_XMAP1 | LOG_REX3)
-#define VERBOSE (0)
+#define VERBOSE (0)//(LOG_UNKNOWN | LOG_REX3 | LOG_COMMANDS | LOG_REJECTS)
#include "logmacro.h"
DEFINE_DEVICE_TYPE(NEWPORT_VIDEO, newport_video_device, "newport_video", "SGI Newport graphics board")
@@ -59,9 +60,15 @@ newport_video_device::newport_video_device(const machine_config &mconfig, const
void newport_video_device::device_start()
{
- m_base = make_unique_clear<uint32_t[]>((1280+64) * (1024+64));
+ m_rgbci = make_unique_clear<uint8_t[]>((1280+64) * (1024+64));
+ m_olay = make_unique_clear<uint8_t[]>((1280+64) * (1024+64));
+ m_pup = make_unique_clear<uint8_t[]>((1280+64) * (1024+64));
+ m_cid = make_unique_clear<uint8_t[]>((1280+64) * (1024+64));
- save_pointer(NAME(m_base), (1280+64) * (1024+64));
+ save_pointer(NAME(m_rgbci), (1280+64) * (1024+64));
+ save_pointer(NAME(m_olay), (1280+64) * (1024+64));
+ save_pointer(NAME(m_pup), (1280+64) * (1024+64));
+ save_pointer(NAME(m_cid), (1280+64) * (1024+64));
save_item(NAME(m_vc2.m_vid_entry));
save_item(NAME(m_vc2.m_cursor_entry));
save_item(NAME(m_vc2.m_cursor_x));
@@ -99,8 +106,9 @@ void newport_video_device::device_start()
save_item(NAME(m_xmap1.m_mode_table_idx));
save_item(NAME(m_xmap1.m_mode_table));
- save_item(NAME(m_rex3.m_draw_mode1));
save_item(NAME(m_rex3.m_draw_mode0));
+ save_item(NAME(m_rex3.m_draw_mode1));
+ save_item(NAME(m_rex3.m_write_width));
save_item(NAME(m_rex3.m_ls_mode));
save_item(NAME(m_rex3.m_ls_pattern));
save_item(NAME(m_rex3.m_ls_pattern_saved));
@@ -108,8 +116,8 @@ void newport_video_device::device_start()
save_item(NAME(m_rex3.m_color_back));
save_item(NAME(m_rex3.m_color_vram));
save_item(NAME(m_rex3.m_alpha_ref));
- save_item(NAME(m_rex3.m_smask0_x));
- save_item(NAME(m_rex3.m_smask0_y));
+ save_item(NAME(m_rex3.m_smask_x));
+ save_item(NAME(m_rex3.m_smask_y));
save_item(NAME(m_rex3.m_setup));
save_item(NAME(m_rex3.m_step_z));
save_item(NAME(m_rex3.m_x_start));
@@ -119,6 +127,8 @@ void newport_video_device::device_start()
save_item(NAME(m_rex3.m_x_save));
save_item(NAME(m_rex3.m_xy_move));
+ save_item(NAME(m_rex3.m_x_move));
+ save_item(NAME(m_rex3.m_y_move));
save_item(NAME(m_rex3.m_bres_d));
save_item(NAME(m_rex3.m_bres_s1));
save_item(NAME(m_rex3.m_bres_octant_inc1));
@@ -132,6 +142,9 @@ void newport_video_device::device_start()
save_item(NAME(m_rex3.m_x_end_f));
save_item(NAME(m_rex3.m_y_end_f));
save_item(NAME(m_rex3.m_x_start_i));
+ save_item(NAME(m_rex3.m_y_start_i));
+ save_item(NAME(m_rex3.m_x_end_i));
+ save_item(NAME(m_rex3.m_y_end_i));
save_item(NAME(m_rex3.m_xy_start_i));
save_item(NAME(m_rex3.m_xy_end_i));
save_item(NAME(m_rex3.m_x_start_end_i));
@@ -144,30 +157,23 @@ void newport_video_device::device_start()
save_item(NAME(m_rex3.m_slope_green));
save_item(NAME(m_rex3.m_slope_blue));
save_item(NAME(m_rex3.m_write_mask));
- save_item(NAME(m_rex3.m_zero_fract));
+ save_item(NAME(m_rex3.m_color_i));
save_item(NAME(m_rex3.m_zero_overflow));
- save_item(NAME(m_rex3.m_host_dataport_msw));
- save_item(NAME(m_rex3.m_host_dataport_lsw));
+ save_item(NAME(m_rex3.m_host_dataport));
save_item(NAME(m_rex3.m_dcb_mode));
save_item(NAME(m_rex3.m_dcb_reg_select));
save_item(NAME(m_rex3.m_dcb_slave_select));
save_item(NAME(m_rex3.m_dcb_data_msw));
save_item(NAME(m_rex3.m_dcb_data_lsw));
- save_item(NAME(m_rex3.m_s_mask1_x));
- save_item(NAME(m_rex3.m_s_mask1_y));
- save_item(NAME(m_rex3.m_s_mask2_x));
- save_item(NAME(m_rex3.m_s_mask2_y));
- save_item(NAME(m_rex3.m_s_mask3_x));
- save_item(NAME(m_rex3.m_s_mask3_y));
- save_item(NAME(m_rex3.m_s_mask4_x));
- save_item(NAME(m_rex3.m_s_mask4_y));
save_item(NAME(m_rex3.m_top_scanline));
save_item(NAME(m_rex3.m_xy_window));
+ save_item(NAME(m_rex3.m_x_window));
+ save_item(NAME(m_rex3.m_y_window));
save_item(NAME(m_rex3.m_clip_mode));
save_item(NAME(m_rex3.m_config));
save_item(NAME(m_rex3.m_status));
save_item(NAME(m_rex3.m_xfer_width));
- save_item(NAME(m_rex3.m_skipline_kludge));
+ save_item(NAME(m_rex3.m_read_active));
save_item(NAME(m_cmap0.m_palette_idx));
save_item(NAME(m_cmap0.m_palette));
@@ -188,13 +194,52 @@ void newport_video_device::device_reset()
m_rex3.m_draw_mode0 = 0x00000000;
m_rex3.m_draw_mode1 = 0x3002f001;
m_rex3.m_dcb_mode = 0x00000780;
- m_rex3.m_skipline_kludge = 0;
m_xmap0.m_entries = 0x2;
m_xmap1.m_entries = 0x2;
+
+#if ENABLE_NEWVIEW_LOG
+ m_newview_log = nullptr;
+#endif
+}
+
+#if ENABLE_NEWVIEW_LOG
+void newport_video_device::start_logging()
+{
+ uint16_t log_index = 0xffff;
+ char log_name_buf[128];
+ FILE *log_test = nullptr;
+ do
+ {
+ log_index++;
+ snprintf(log_name_buf, 128, "newview%04d.log", log_index);
+ log_test = fopen(log_name_buf, "rb");
+ } while(log_test != nullptr);
+
+ m_newview_log = fopen(log_name_buf, "wb");
+
+ popmessage("Recording Newport to %s", log_name_buf);
+
+ fwrite(&m_vc2, sizeof(vc2_t), 1, m_newview_log);
+ fwrite(&m_xmap0, sizeof(xmap_t), 1, m_newview_log);
+ fwrite(&m_xmap1, sizeof(xmap_t), 1, m_newview_log);
+ fwrite(&m_rex3, sizeof(rex3_t), 1, m_newview_log);
+ fwrite(&m_cmap0, sizeof(cmap_t), 1, m_newview_log);
+ fwrite(&m_rgbci[0], 1, (1280+64)*(1024+64), m_newview_log);
+ fwrite(&m_olay[0], 1, (1280+64)*(1024+64), m_newview_log);
+ fwrite(&m_pup[0], 1, (1280+64)*(1024+64), m_newview_log);
+ fwrite(&m_cid[0], 1, (1280+64)*(1024+64), m_newview_log);
+}
+
+void newport_video_device::stop_logging()
+{
+ popmessage("Newport recording stopped.");
+ fclose(m_newview_log);
+ m_newview_log = nullptr;
}
+#endif
-uint32_t newport_video_device::get_cursor_pixel(int x, int y)
+uint8_t newport_video_device::get_cursor_pixel(int x, int y)
{
if (x < 0 || y < 0)
return 0;
@@ -211,16 +256,14 @@ uint32_t newport_video_device::get_cursor_pixel(int x, int y)
{
const int address = y * 4 + (x / 16);
const uint16_t word = m_vc2.m_ram[m_vc2.m_cursor_entry + address];
- const uint16_t entry = BIT(word, shift);
- return m_cmap0.m_palette[entry];
+ return BIT(word, shift);
}
else
{
const int address = y * 2 + (x / 16);
const uint16_t word0 = m_vc2.m_ram[m_vc2.m_cursor_entry + address];
const uint16_t word1 = m_vc2.m_ram[m_vc2.m_cursor_entry + address + 64];
- const uint16_t entry = BIT(word0, shift) | (BIT(word1, shift) << 1);
- return m_cmap0.m_palette[entry];
+ return BIT(word0, shift) | (BIT(word1, shift) << 1);
}
}
@@ -230,29 +273,122 @@ uint32_t newport_video_device::screen_update(screen_device &device, bitmap_rgb32
&& BIT(m_vc2.m_display_ctrl, DCR_CURSOR_ENABLE_BIT) != 0
&& BIT(m_vc2.m_display_ctrl, DCR_CURSOR_MODE_BIT) == DCR_CURSOR_MODE_GLYPH;
+ const uint16_t cursor_msb = (uint16_t)m_xmap0.m_cursor_cmap << 5;
+ const uint16_t popup_msb = (uint16_t)m_xmap0.m_popup_cmap << 5;
+
/* loop over rows and copy to the destination */
for (int y = cliprect.min_y; y <= cliprect.max_y; y++)
{
- uint32_t *src = &m_base[1344 * y];
+ uint8_t *src_ci = &m_rgbci[1344 * y];
+ uint8_t *src_pup = &m_pup[1344 * y];
uint32_t *dest = &bitmap.pix32(y, cliprect.min_x);
+ m_vc2.m_did_frame_ptr = m_vc2.m_did_entry + (uint16_t)y;
+ m_vc2.m_did_line_ptr = m_vc2.m_ram[m_vc2.m_did_frame_ptr];
+
+ // Fetch the initial DID entry
+ uint16_t curr_did_entry = m_vc2.m_ram[m_vc2.m_did_line_ptr];
+ uint32_t table_entry = m_xmap0.m_mode_table[curr_did_entry & 0x1f];
+ uint16_t ci_msb = 0;
+ switch ((table_entry >> 8) & 3)
+ {
+ case 0: ci_msb = (m_xmap0.m_mode_table[curr_did_entry & 0x1f] & 0xf8) << 5; break;
+ case 1: ci_msb = 0x1d00; break;
+ case 2: ci_msb = 0x1e00; break;
+ case 3: ci_msb = 0x1f00; break;
+ }
+
+ // Prepare for the next DID entry
+ m_vc2.m_did_line_ptr++;
+ curr_did_entry = m_vc2.m_ram[m_vc2.m_did_line_ptr];
+
/* loop over columns */
for (int x = cliprect.min_x; x < cliprect.max_x; x++)
{
- uint32_t cursor_pixel = 0;
+ if ((uint16_t)x == (curr_did_entry >> 5))
+ {
+ table_entry = m_xmap0.m_mode_table[curr_did_entry & 0x1f];
+ switch ((table_entry >> 8) & 3)
+ {
+ case 0: ci_msb = (m_xmap0.m_mode_table[curr_did_entry & 0x1f] & 0xf8) << 5; break;
+ case 1: ci_msb = 0x1d00; break;
+ case 2: ci_msb = 0x1e00; break;
+ case 3: ci_msb = 0x1f00; break;
+ }
+ m_vc2.m_did_line_ptr++;
+ curr_did_entry = m_vc2.m_ram[m_vc2.m_did_line_ptr];
+ }
+ uint8_t cursor_pixel = 0;
if (x >= (m_vc2.m_cursor_x - 31) && x <= m_vc2.m_cursor_x && y >= (m_vc2.m_cursor_y - 31) && y <= m_vc2.m_cursor_y && enable_cursor)
{
cursor_pixel = get_cursor_pixel(x - ((int)m_vc2.m_cursor_x - 31), y - ((int)m_vc2.m_cursor_y - 31));
}
- *dest++ = cursor_pixel ? cursor_pixel : *src;
- src++;
+
+ if (cursor_pixel)
+ {
+ *dest++ = m_cmap0.m_palette[cursor_msb | cursor_pixel];
+ }
+ else if (*src_pup)
+ {
+ const uint8_t src = (*src_pup >> 2) & 3;
+ *dest++ = m_cmap0.m_palette[popup_msb | src];
+ }
+ else
+ {
+ switch ((table_entry >> 8) & 3)
+ {
+ case 0:
+ switch ((table_entry >> 10) & 3)
+ {
+ case 0: // 4bpp
+ {
+ const uint8_t shift = BIT(table_entry, 0) ? 4 : 0;
+ const uint8_t pix_in = *src_ci;
+ *dest++ = m_cmap0.m_palette[ci_msb | ((pix_in >> shift) & 0x0f)];
+ break;
+ }
+ case 1: // 8bpp
+ *dest++ = m_cmap0.m_palette[ci_msb | *src_ci];
+ break;
+ case 2: // 12bpp (not yet supported)
+ case 3: // 24bpp (not yet supported)
+ break;
+ }
+ break;
+ case 1:
+ case 2:
+ case 3:
+ {
+ const uint8_t pix_in = *src_ci;
+ const uint8_t r = (0x92 * BIT(pix_in, 2)) | (0x49 * BIT(pix_in, 1)) | (0x24 * BIT(pix_in, 0));
+ const uint8_t g = (0x92 * BIT(pix_in, 5)) | (0x49 * BIT(pix_in, 4)) | (0x24 * BIT(pix_in, 3));
+ const uint8_t b = (0xaa * BIT(pix_in, 7)) | (0x55 * BIT(pix_in, 6));
+ *dest++ = (r << 16) | (g << 8) | b;
+ break;
+ }
+ }
+ }
+
+ src_ci++;
+ src_pup++;
}
}
+
+#if ENABLE_NEWVIEW_LOG
+ if (machine().input().code_pressed_once(KEYCODE_TILDE))
+ {
+ if (m_newview_log == nullptr)
+ start_logging();
+ else
+ stop_logging();
+ }
+#endif
+
return 0;
}
-WRITE32_MEMBER(newport_video_device::cmap0_w)
+void newport_video_device::cmap0_write(uint32_t data)
{
switch (m_rex3.m_dcb_reg_select)
{
@@ -270,7 +406,7 @@ WRITE32_MEMBER(newport_video_device::cmap0_w)
}
}
-READ32_MEMBER(newport_video_device::cmap0_r)
+uint32_t newport_video_device::cmap0_read()
{
switch (m_rex3.m_dcb_reg_select)
{
@@ -286,7 +422,7 @@ READ32_MEMBER(newport_video_device::cmap0_r)
}
}
-READ32_MEMBER(newport_video_device::cmap1_r)
+uint32_t newport_video_device::cmap1_read()
{
switch (m_rex3.m_dcb_reg_select)
{
@@ -302,7 +438,7 @@ READ32_MEMBER(newport_video_device::cmap1_r)
}
}
-READ32_MEMBER(newport_video_device::xmap0_r)
+uint32_t newport_video_device::xmap0_read()
{
switch (m_rex3.m_dcb_reg_select)
{
@@ -311,7 +447,7 @@ READ32_MEMBER(newport_video_device::xmap0_r)
return m_xmap0.m_config;
case 1:
LOGMASKED(LOG_XMAP0, "XMAP0 Revision Read: %08x\n", 0);
- return m_xmap0.m_revision;
+ return 1;
case 2:
LOGMASKED(LOG_XMAP0, "XMAP0 FIFO Availability Read: %08x\n", 0x2);
return 0x2;
@@ -360,7 +496,7 @@ READ32_MEMBER(newport_video_device::xmap0_r)
return 0;
}
-WRITE32_MEMBER(newport_video_device::xmap0_w)
+void newport_video_device::xmap0_write(uint32_t data)
{
switch (m_rex3.m_dcb_reg_select)
{
@@ -399,7 +535,7 @@ WRITE32_MEMBER(newport_video_device::xmap0_w)
}
}
-READ32_MEMBER(newport_video_device::xmap1_r)
+uint32_t newport_video_device::xmap1_read()
{
switch (m_rex3.m_dcb_reg_select)
{
@@ -408,7 +544,7 @@ READ32_MEMBER(newport_video_device::xmap1_r)
return m_xmap1.m_config;
case 1:
LOGMASKED(LOG_XMAP1, "XMAP1 Revision Read: %08x\n", 0);
- return m_xmap1.m_revision;
+ return 1;
case 2:
LOGMASKED(LOG_XMAP1, "XMAP1 FIFO Availability Read: %08x\n", 0x02);
return 0x2;
@@ -457,7 +593,7 @@ READ32_MEMBER(newport_video_device::xmap1_r)
return 0;
}
-WRITE32_MEMBER(newport_video_device::xmap1_w)
+void newport_video_device::xmap1_write(uint32_t data)
{
switch (m_rex3.m_dcb_reg_select)
{
@@ -496,7 +632,7 @@ WRITE32_MEMBER(newport_video_device::xmap1_w)
}
}
-READ32_MEMBER(newport_video_device::vc2_r)
+uint32_t newport_video_device::vc2_read()
{
switch (m_rex3.m_dcb_reg_select)
{
@@ -578,7 +714,7 @@ READ32_MEMBER(newport_video_device::vc2_r)
}
}
-WRITE32_MEMBER(newport_video_device::vc2_w)
+void newport_video_device::vc2_write(uint32_t data)
{
switch (m_rex3.m_xfer_width)
{
@@ -713,969 +849,1888 @@ WRITE_LINE_MEMBER(newport_video_device::vblank_w)
{
if (state)
{
- m_rex3.m_status |= 0x20;
if (BIT(m_vc2.m_display_ctrl, 0))
- m_hpc3->raise_local_irq(1, ioc2_device::INT3_LOCAL1_RETRACE);
+ {
+ m_rex3.m_status |= 0x20;
+ m_hpc3->raise_local_irq(0, ioc2_device::INT3_LOCAL0_GRAPHICS);
+ }
}
}
-READ32_MEMBER(newport_video_device::rex3_r)
+READ64_MEMBER(newport_video_device::rex3_r)
{
- switch (offset & ~(0x800/4))
+ uint64_t ret = 0;
+ switch (offset & ~(0x800/8))
{
- case 0x0000/4:
- LOGMASKED(LOG_REX3, "REX3 Draw Mode 1 Read: %08x\n", m_rex3.m_draw_mode1);
- return m_rex3.m_draw_mode1;
- case 0x0004/4:
- LOGMASKED(LOG_REX3, "REX3 Draw Mode 0 Read: %08x\n", m_rex3.m_draw_mode0);
- return m_rex3.m_draw_mode0;
- case 0x0008/4:
- LOGMASKED(LOG_REX3, "REX3 Line Stipple Mode Read: %08x\n", m_rex3.m_ls_mode);
- return m_rex3.m_ls_mode;
- case 0x000c/4:
- LOGMASKED(LOG_REX3, "REX3 Line Stipple Pattern Read: %08x\n", m_rex3.m_ls_pattern);
- return m_rex3.m_ls_pattern;
- case 0x0010/4:
- LOGMASKED(LOG_REX3, "REX3 Line Stipple Pattern (Save) Read: %08x\n", m_rex3.m_ls_pattern_saved);
- return m_rex3.m_ls_pattern_saved;
- case 0x0014/4:
- LOGMASKED(LOG_REX3, "REX3 Pattern Register Read: %08x\n", m_rex3.m_z_pattern);
- return m_rex3.m_z_pattern;
- case 0x0018/4:
- LOGMASKED(LOG_REX3, "REX3 Opaque Pattern / Blendfunc Dest Color Read: %08x\n", m_rex3.m_color_back);
- return m_rex3.m_color_back;
- case 0x001c/4:
- LOGMASKED(LOG_REX3, "REX3 VRAM Fastclear Color Read: %08x\n", m_rex3.m_color_vram);
- return m_rex3.m_color_vram;
- case 0x0020/4:
+ case 0x0000/8:
+ if (ACCESSING_BITS_32_63)
+ {
+ LOGMASKED(LOG_REX3, "REX3 Draw Mode 1 Read: %08x\n", m_rex3.m_draw_mode1);
+ ret |= (uint64_t)m_rex3.m_draw_mode1 << 32;
+ }
+ if (ACCESSING_BITS_0_31)
+ {
+ LOGMASKED(LOG_REX3, "REX3 Draw Mode 0 Read: %08x\n", m_rex3.m_draw_mode0);
+ ret |= m_rex3.m_draw_mode0;
+ }
+ break;
+ case 0x0008/8:
+ if (ACCESSING_BITS_32_63)
+ {
+ LOGMASKED(LOG_REX3, "REX3 Line Stipple Mode Read: %08x\n", m_rex3.m_ls_mode);
+ ret |= (uint64_t)m_rex3.m_ls_mode << 32;
+ }
+ if (ACCESSING_BITS_0_31)
+ {
+ LOGMASKED(LOG_REX3, "REX3 Line Stipple Pattern Read: %08x\n", m_rex3.m_ls_pattern);
+ ret |= m_rex3.m_ls_pattern;
+ }
+ break;
+ case 0x0010/8:
+ if (ACCESSING_BITS_32_63)
+ {
+ LOGMASKED(LOG_REX3, "REX3 Line Stipple Pattern (Save) Read: %08x\n", m_rex3.m_ls_pattern_saved);
+ ret |= (uint64_t)m_rex3.m_ls_pattern_saved << 32;
+ }
+ if (ACCESSING_BITS_0_31)
+ {
+ LOGMASKED(LOG_REX3, "REX3 Pattern Register Read: %08x\n", m_rex3.m_z_pattern);
+ ret |= m_rex3.m_z_pattern;
+ }
+ break;
+ case 0x0018/8:
+ if (ACCESSING_BITS_32_63)
+ {
+ LOGMASKED(LOG_REX3, "REX3 Opaque Pattern / Blendfunc Dest Color Read: %08x\n", m_rex3.m_color_back);
+ ret |= (uint64_t)m_rex3.m_color_back << 32;
+ }
+ if (ACCESSING_BITS_0_31)
+ {
+ LOGMASKED(LOG_REX3, "REX3 VRAM Fastclear Color Read: %08x\n", m_rex3.m_color_vram);
+ ret |= m_rex3.m_color_vram;
+ }
+ break;
+ case 0x0020/8:
LOGMASKED(LOG_REX3, "REX3 AFUNCTION Reference Alpha Read: %08x\n", m_rex3.m_alpha_ref);
- return m_rex3.m_alpha_ref;
- case 0x0028/4:
- LOGMASKED(LOG_REX3, "REX3 Screenmask 0 X Min/Max Read: %08x\n", m_rex3.m_smask0_x);
- return m_rex3.m_smask0_x;
- case 0x002c/4:
- LOGMASKED(LOG_REX3, "REX3 Screenmask 0 Y Min/Max Read: %08x\n", m_rex3.m_smask0_y);
- return m_rex3.m_smask0_y;
- case 0x0030/4:
- LOGMASKED(LOG_REX3, "REX3 Line/Span Setup Read: %08x\n", m_rex3.m_setup);
- return m_rex3.m_setup;
- case 0x0034/4:
- LOGMASKED(LOG_REX3, "REX3 ZPattern Enable Read: %08x\n", m_rex3.m_step_z);
- return m_rex3.m_step_z;
- case 0x0100/4:
- LOGMASKED(LOG_REX3, "REX3 X Start Read: %08x\n", m_rex3.m_x_start);
- return m_rex3.m_x_start;
- case 0x0104/4:
- LOGMASKED(LOG_REX3, "REX3 YStart Read: %08x\n", m_rex3.m_y_start);
- return m_rex3.m_y_start;
- case 0x0108/4:
- LOGMASKED(LOG_REX3, "REX3 XEnd Read: %08x\n", m_rex3.m_x_end);
- return m_rex3.m_x_end;
- case 0x010c/4:
- LOGMASKED(LOG_REX3, "REX3 YEnd Read: %08x\n", m_rex3.m_y_end);
- return m_rex3.m_y_end;
- case 0x0110/4:
- LOGMASKED(LOG_REX3, "REX3 XSave Read: %08x\n", m_rex3.m_x_save);
- return m_rex3.m_x_save;
- case 0x0114/4:
- LOGMASKED(LOG_REX3, "REX3 XYMove Read: %08x\n", m_rex3.m_xy_move);
- return m_rex3.m_xy_move;
- case 0x0118/4:
- LOGMASKED(LOG_REX3, "REX3 Bresenham D Read: %08x\n", m_rex3.m_bres_d);
- return m_rex3.m_bres_d;
- case 0x011c/4:
- LOGMASKED(LOG_REX3, "REX3 Bresenham S1 Read: %08x\n", m_rex3.m_bres_s1);
- return m_rex3.m_bres_s1;
- case 0x0120/4:
- LOGMASKED(LOG_REX3, "REX3 Bresenham Octant & Incr1 Read: %08x\n", m_rex3.m_bres_octant_inc1);
- return m_rex3.m_bres_octant_inc1;
- case 0x0124/4:
- LOGMASKED(LOG_REX3, "REX3 Bresenham Octant Rounding Mode & Incr2 Read: %08x\n", m_rex3.m_bres_round_inc2);
- return m_rex3.m_bres_round_inc2;
- case 0x0128/4:
- LOGMASKED(LOG_REX3, "REX3 Bresenham E1 Read: %08x\n", m_rex3.m_bres_e1);
- return m_rex3.m_bres_e1;
- case 0x012c/4:
- LOGMASKED(LOG_REX3, "REX3 Bresenham S2 Read: %08x\n", m_rex3.m_bres_s2);
- return m_rex3.m_bres_s2;
- case 0x0130/4:
- LOGMASKED(LOG_REX3, "REX3 AA Line Weight Table 1/2 Read: %08x\n", m_rex3.m_a_weight0);
- return m_rex3.m_a_weight0;
- case 0x0134/4:
- LOGMASKED(LOG_REX3, "REX3 AA Line Weight Table 2/2 Read: %08x\n", m_rex3.m_a_weight1);
- return m_rex3.m_a_weight1;
- case 0x0138/4:
- LOGMASKED(LOG_REX3, "REX3 GL XStart Read: %08x\n", m_rex3.m_x_start_f);
- return m_rex3.m_x_start_f;
- case 0x013c/4:
- LOGMASKED(LOG_REX3, "REX3 GL YStart Read: %08x\n", m_rex3.m_y_start_f);
- return m_rex3.m_y_start_f;
- case 0x0140/4:
- LOGMASKED(LOG_REX3, "REX3 GL XEnd Read: %08x\n", m_rex3.m_x_end_f);
- return m_rex3.m_x_end_f;
- case 0x0144/4:
- LOGMASKED(LOG_REX3, "REX3 GL YEnd Read: %08x\n", m_rex3.m_y_end_f);
- return m_rex3.m_y_end_f;
- case 0x0148/4:
- LOGMASKED(LOG_REX3, "REX3 XStart (integer) Read: %08x\n", m_rex3.m_x_start_i);
- return m_rex3.m_x_start_i;
- case 0x014c/4:
- LOGMASKED(LOG_REX3, "REX3 GL XEnd (copy) Read: %08x\n", m_rex3.m_x_end_f);
- return m_rex3.m_x_end_f;
- case 0x0150/4:
- LOGMASKED(LOG_REX3, "REX3 XYStart (integer) Read: %08x\n", m_rex3.m_xy_start_i);
- return m_rex3.m_xy_start_i;
- case 0x0154/4:
- LOGMASKED(LOG_REX3, "REX3 XYEnd (integer) Read: %08x\n", m_rex3.m_xy_end_i);
- return m_rex3.m_xy_end_i;
- case 0x0158/4:
- LOGMASKED(LOG_REX3, "REX3 XStartEnd (integer) Read: %08x\n", m_rex3.m_x_start_end_i);
- return m_rex3.m_x_start_end_i;
- case 0x0200/4:
- LOGMASKED(LOG_REX3, "REX3 Red/CI Full State Read: %08x\n", m_rex3.m_color_red);
- return m_rex3.m_color_red;
- case 0x0204/4:
- LOGMASKED(LOG_REX3, "REX3 Alpha Full State Read: %08x\n", m_rex3.m_color_alpha);
- return m_rex3.m_color_alpha;
- case 0x0208/4:
- LOGMASKED(LOG_REX3, "REX3 Green Full State Read: %08x\n", m_rex3.m_color_green);
- return m_rex3.m_color_green;
- case 0x020c/4:
- LOGMASKED(LOG_REX3, "REX3 Blue Full State Read: %08x\n", m_rex3.m_color_blue);
- return m_rex3.m_color_blue;
- case 0x0210/4:
- LOGMASKED(LOG_REX3, "REX3 Red/CI Slope Read: %08x\n", m_rex3.m_slope_red);
- return m_rex3.m_slope_red;
- case 0x0214/4:
- LOGMASKED(LOG_REX3, "REX3 Alpha Slope Read: %08x\n", m_rex3.m_slope_alpha);
- return m_rex3.m_slope_alpha;
- case 0x0218/4:
- LOGMASKED(LOG_REX3, "REX3 Green Slope Read: %08x\n", m_rex3.m_slope_green);
- return m_rex3.m_slope_green;
- case 0x021c/4:
- LOGMASKED(LOG_REX3, "REX3 Blue Slope Read: %08x\n", m_rex3.m_slope_blue);
- return m_rex3.m_slope_blue;
- case 0x0220/4:
- LOGMASKED(LOG_REX3, "REX3 Write Mask Read: %08x\n", m_rex3.m_write_mask);
- return m_rex3.m_write_mask;
- case 0x0224/4:
- LOGMASKED(LOG_REX3, "REX3 Packed Color Fractions Read: %08x\n", m_rex3.m_zero_fract);
- return m_rex3.m_zero_fract;
- case 0x0228/4:
- LOGMASKED(LOG_REX3, "REX3 Color Index Zeros Overflow Read: %08x\n", m_rex3.m_zero_overflow);
- return m_rex3.m_zero_overflow;
- case 0x022c/4:
- LOGMASKED(LOG_REX3, "REX3 Red/CI Slope (copy) Read: %08x\n", m_rex3.m_slope_red);
- return m_rex3.m_slope_red;
- case 0x0230/4:
- LOGMASKED(LOG_REX3, "REX3 Host Data Port MSW Read: %08x\n", m_rex3.m_host_dataport_msw);
- return m_rex3.m_host_dataport_msw;
- case 0x0234/4:
- LOGMASKED(LOG_REX3, "REX3 Host Data Port LSW Read: %08x\n", m_rex3.m_host_dataport_lsw);
- return m_rex3.m_host_dataport_lsw;
- case 0x0238/4:
- LOGMASKED(LOG_REX3, "REX3 Display Control Bus Mode Read: %08x\n", m_rex3.m_dcb_mode);
- return m_rex3.m_dcb_mode;
- case 0x0240/4:
- switch (m_rex3.m_dcb_slave_select)
+ ret |= (uint64_t)m_rex3.m_alpha_ref << 32;
+ break;
+ case 0x0028/8:
+ if (ACCESSING_BITS_32_63)
{
- case 0x00:
- return vc2_r(space, 0, mem_mask);
- case 0x02:
- return cmap0_r(space, 0, mem_mask);
- case 0x03:
- return cmap1_r(space, 0, mem_mask);
- case 0x05:
- return xmap0_r(space, 0, mem_mask);
- case 0x06:
- return xmap1_r(space, 0, mem_mask);
- default:
- LOGMASKED(LOG_REX3, "REX3 Display Control Bus Data MSW Read: %08x\n", m_rex3.m_dcb_data_msw);
+ LOGMASKED(LOG_REX3, "REX3 Screenmask 0 X Min/Max Read: %08x\n", m_rex3.m_smask_x[0]);
+ ret |= (uint64_t)m_rex3.m_smask_x[0] << 32;
+ }
+ if (ACCESSING_BITS_0_31)
+ {
+ LOGMASKED(LOG_REX3, "REX3 Screenmask 0 Y Min/Max Read: %08x\n", m_rex3.m_smask_y[0]);
+ ret |= m_rex3.m_smask_y[0];
+ }
+ break;
+ case 0x0030/8:
+ if (ACCESSING_BITS_32_63)
+ {
+ LOGMASKED(LOG_REX3, "REX3 Line/Span Setup Read: %08x\n", m_rex3.m_setup);
+ ret |= (uint64_t)m_rex3.m_setup << 32;
+ }
+ break;
+ case 0x0100/8:
+ if (ACCESSING_BITS_32_63)
+ {
+ LOGMASKED(LOG_REX3, "%s: REX3 X Start Read: %08x\n", machine().describe_context(), m_rex3.m_x_start);
+ ret |= (uint64_t)m_rex3.m_x_start << 32;
+ }
+ if (ACCESSING_BITS_0_31)
+ {
+ LOGMASKED(LOG_REX3, "REX3 YStart Read: %08x\n", m_rex3.m_y_start);
+ ret |= m_rex3.m_y_start;
+ }
+ break;
+ case 0x0108/8:
+ if (ACCESSING_BITS_32_63)
+ {
+ LOGMASKED(LOG_REX3, "REX3 XEnd Read: %08x\n", m_rex3.m_x_end);
+ ret |= (uint64_t)m_rex3.m_x_end << 32;
+ }
+ if (ACCESSING_BITS_0_31)
+ {
+ LOGMASKED(LOG_REX3, "REX3 YEnd Read: %08x\n", m_rex3.m_y_end);
+ ret |= m_rex3.m_y_end;
+ }
+ break;
+ case 0x0110/8:
+ if (ACCESSING_BITS_32_63)
+ {
+ LOGMASKED(LOG_REX3, "REX3 XSave Read: %08x\n", m_rex3.m_x_save);
+ ret |= (uint64_t)(uint16_t)m_rex3.m_x_save << 32;
+ }
+ if (ACCESSING_BITS_0_31)
+ {
+ LOGMASKED(LOG_REX3, "REX3 XYMove Read: %08x\n", m_rex3.m_xy_move);
+ ret |= m_rex3.m_xy_move;
+ }
+ break;
+ case 0x0118/8:
+ if (ACCESSING_BITS_32_63)
+ {
+ LOGMASKED(LOG_REX3, "REX3 Bresenham D Read: %08x\n", m_rex3.m_bres_d);
+ ret |= (uint64_t)m_rex3.m_bres_d << 32;
+ }
+ if (ACCESSING_BITS_0_31)
+ {
+ LOGMASKED(LOG_REX3, "REX3 Bresenham S1 Read: %08x\n", m_rex3.m_bres_s1);
+ ret |= m_rex3.m_bres_s1;
+ }
+ break;
+ case 0x0120/8:
+ if (ACCESSING_BITS_32_63)
+ {
+ LOGMASKED(LOG_REX3, "REX3 Bresenham Octant & Incr1 Read: %08x\n", m_rex3.m_bres_octant_inc1);
+ ret |= (uint64_t)m_rex3.m_bres_octant_inc1 << 32;
+ }
+ if (ACCESSING_BITS_0_31)
+ {
+ LOGMASKED(LOG_REX3, "REX3 Bresenham Octant Rounding Mode & Incr2 Read: %08x\n", m_rex3.m_bres_round_inc2);
+ ret |= m_rex3.m_bres_round_inc2;
+ }
+ break;
+ case 0x0128/8:
+ if (ACCESSING_BITS_32_63)
+ {
+ LOGMASKED(LOG_REX3, "REX3 Bresenham E1 Read: %08x\n", m_rex3.m_bres_e1);
+ ret |= (uint64_t)m_rex3.m_bres_e1 << 32;
+ }
+ if (ACCESSING_BITS_0_31)
+ {
+ LOGMASKED(LOG_REX3, "REX3 Bresenham S2 Read: %08x\n", m_rex3.m_bres_s2);
+ ret |= m_rex3.m_bres_s2;
+ }
+ break;
+ case 0x0130/8:
+ if (ACCESSING_BITS_32_63)
+ {
+ LOGMASKED(LOG_REX3, "REX3 AA Line Weight Table 1/2 Read: %08x\n", m_rex3.m_a_weight0);
+ ret |= (uint64_t)m_rex3.m_a_weight0 << 32;
+ }
+ if (ACCESSING_BITS_0_31)
+ {
+ LOGMASKED(LOG_REX3, "REX3 AA Line Weight Table 2/2 Read: %08x\n", m_rex3.m_a_weight1);
+ ret |= m_rex3.m_a_weight1;
+ }
+ break;
+ case 0x0138/8:
+ if (ACCESSING_BITS_32_63)
+ {
+ LOGMASKED(LOG_REX3, "REX3 GL XStart Read: %08x\n", m_rex3.m_x_start_f);
+ ret |= (uint64_t)m_rex3.m_x_start_f << 32;
+ }
+ if (ACCESSING_BITS_0_31)
+ {
+ LOGMASKED(LOG_REX3, "REX3 GL YStart Read: %08x\n", m_rex3.m_y_start_f);
+ ret |= m_rex3.m_y_start_f;
+ }
+ break;
+ case 0x0140/8:
+ if (ACCESSING_BITS_32_63)
+ {
+ LOGMASKED(LOG_REX3, "REX3 GL XEnd Read: %08x\n", m_rex3.m_x_end_f);
+ ret |= (uint64_t)m_rex3.m_x_end_f << 32;
+ }
+ if (ACCESSING_BITS_0_31)
+ {
+ LOGMASKED(LOG_REX3, "REX3 GL YEnd Read: %08x\n", m_rex3.m_y_end_f);
+ ret |= m_rex3.m_y_end_f;
+ }
+ break;
+ case 0x0148/8:
+ if (ACCESSING_BITS_32_63)
+ {
+ LOGMASKED(LOG_REX3, "REX3 XStart (integer) Read: %08x\n", m_rex3.m_x_start_i);
+ ret |= (uint64_t)m_rex3.m_x_start_i << 32;
+ }
+ if (ACCESSING_BITS_0_31)
+ {
+ LOGMASKED(LOG_REX3, "REX3 GL XEnd (copy) Read: %08x\n", m_rex3.m_x_end_f);
+ ret |= m_rex3.m_x_end_f;
+ }
+ break;
+ case 0x0150/8:
+ if (ACCESSING_BITS_32_63)
+ {
+ LOGMASKED(LOG_REX3, "REX3 XYStart (integer) Read: %08x\n", m_rex3.m_xy_start_i);
+ ret |= (uint64_t)m_rex3.m_xy_start_i << 32;
+ }
+ if (ACCESSING_BITS_0_31)
+ {
+ LOGMASKED(LOG_REX3, "REX3 XYEnd (integer) Read: %08x\n", m_rex3.m_xy_end_i);
+ ret |= m_rex3.m_xy_end_i;
+ }
+ break;
+ case 0x0158/8:
+ if (ACCESSING_BITS_32_63)
+ {
+ LOGMASKED(LOG_REX3, "REX3 XStartEnd (integer) Read: %08x\n", m_rex3.m_x_start_end_i);
+ ret |= (uint64_t)m_rex3.m_x_start_end_i << 32;
+ }
+ break;
+ case 0x0200/8:
+ if (ACCESSING_BITS_32_63)
+ {
+ LOGMASKED(LOG_REX3, "REX3 Red/CI Full State Read: %08x\n", m_rex3.m_color_red);
+ ret |= (uint64_t)m_rex3.m_color_red << 32;
+ }
+ if (ACCESSING_BITS_0_31)
+ {
+ LOGMASKED(LOG_REX3, "REX3 Alpha Full State Read: %08x\n", m_rex3.m_color_alpha);
+ ret |= m_rex3.m_color_alpha;
+ }
+ break;
+ case 0x0208/8:
+ if (ACCESSING_BITS_32_63)
+ {
+ LOGMASKED(LOG_REX3, "REX3 Green Full State Read: %08x\n", m_rex3.m_color_green);
+ ret |= (uint64_t)m_rex3.m_color_green << 32;
+ }
+ if (ACCESSING_BITS_0_31)
+ {
+ LOGMASKED(LOG_REX3, "REX3 Blue Full State Read: %08x\n", m_rex3.m_color_blue);
+ ret |= m_rex3.m_color_blue;
+ }
+ break;
+ case 0x0210/8:
+ if (ACCESSING_BITS_32_63)
+ {
+ LOGMASKED(LOG_REX3, "REX3 Red/CI Slope Read: %08x\n", m_rex3.m_slope_red);
+ ret |= (uint64_t)m_rex3.m_slope_red << 32;
+ }
+ if (ACCESSING_BITS_0_31)
+ {
+ LOGMASKED(LOG_REX3, "REX3 Alpha Slope Read: %08x\n", m_rex3.m_slope_alpha);
+ ret |= m_rex3.m_slope_alpha;
+ }
+ break;
+ case 0x0218/8:
+ if (ACCESSING_BITS_32_63)
+ {
+ LOGMASKED(LOG_REX3, "REX3 Green Slope Read: %08x\n", m_rex3.m_slope_green);
+ ret |= (uint64_t)m_rex3.m_slope_green << 32;
+ }
+ if (ACCESSING_BITS_0_31)
+ {
+ LOGMASKED(LOG_REX3, "REX3 Blue Slope Read: %08x\n", m_rex3.m_slope_blue);
+ ret |= m_rex3.m_slope_blue;
+ }
+ break;
+ case 0x0220/8:
+ if (ACCESSING_BITS_32_63)
+ {
+ LOGMASKED(LOG_REX3, "REX3 Write Mask Read: %08x\n", m_rex3.m_write_mask);
+ ret |= (uint64_t)m_rex3.m_write_mask << 32;
+ }
+ if (ACCESSING_BITS_0_31)
+ {
+ LOGMASKED(LOG_REX3, "REX3 Packed Color Fractions Read: %08x\n", m_rex3.m_color_i);
+ ret |= m_rex3.m_color_i;
+ }
+ break;
+ case 0x0228/8:
+ if (ACCESSING_BITS_32_63)
+ {
+ LOGMASKED(LOG_REX3, "REX3 Color Index Zeros Overflow Read: %08x\n", m_rex3.m_zero_overflow);
+ ret |= (uint64_t)m_rex3.m_zero_overflow << 32;
+ }
+ if (ACCESSING_BITS_0_31)
+ {
+ LOGMASKED(LOG_REX3, "REX3 Red/CI Slope (copy) Read: %08x\n", m_rex3.m_slope_red);
+ ret |= m_rex3.m_slope_red;
+ }
+ break;
+ case 0x0230/8:
+ if (m_rex3.m_read_active)
+ m_rex3.m_host_dataport = do_pixel_word_read();
+ LOGMASKED(LOG_REX3, "%s: REX3 Host Data Port Read: %08x%08x\n", machine().describe_context(), (uint32_t)(m_rex3.m_host_dataport >> 32),
+ (uint32_t)m_rex3.m_host_dataport);
+ ret = m_rex3.m_host_dataport;
+ break;
+ case 0x0238/8:
+ if (ACCESSING_BITS_32_63)
+ {
+ LOGMASKED(LOG_REX3, "REX3 Display Control Bus Mode Read: %08x\n", m_rex3.m_dcb_mode);
+ ret |= (uint64_t)m_rex3.m_dcb_mode << 32;
+ }
+ break;
+ case 0x0240/8:
+ if (ACCESSING_BITS_32_63)
+ {
+ switch (m_rex3.m_dcb_slave_select)
+ {
+ case 0x00:
+ ret |= (uint64_t)vc2_read() << 32;
+ break;
+ case 0x02:
+ ret |= (uint64_t)cmap0_read() << 32;
+ break;
+ case 0x03:
+ ret |= (uint64_t)cmap1_read() << 32;
+ break;
+ case 0x05:
+ ret |= (uint64_t)xmap0_read() << 32;
+ break;
+ case 0x06:
+ ret |= (uint64_t)xmap1_read() << 32;
+ break;
+ default:
+ LOGMASKED(LOG_REX3, "REX3 Display Control Bus Data MSW Read: %08x\n", m_rex3.m_dcb_data_msw);
+ ret |= (uint64_t)m_rex3.m_dcb_data_msw << 32;
+ break;
+ }
+ if (BIT(m_rex3.m_dcb_mode, 3))
+ {
+ m_rex3.m_dcb_reg_select++;
+ m_rex3.m_dcb_reg_select &= 7;
+ }
+ }
+ if (ACCESSING_BITS_0_31)
+ {
+ LOGMASKED(LOG_REX3, "REX3 Display Control Bus Data LSW Read: %08x\n", m_rex3.m_dcb_data_lsw);
+ ret |= m_rex3.m_dcb_data_lsw;
+ }
+ break;
+ case 0x1300/8:
+ if (ACCESSING_BITS_32_63)
+ {
+ LOGMASKED(LOG_REX3, "REX3 Screenmask 1 X Min/Max Read: %08x\n", m_rex3.m_smask_x[1]);
+ ret |= (uint64_t)m_rex3.m_smask_x[1] << 32;
+ }
+ if (ACCESSING_BITS_0_31)
+ {
+ LOGMASKED(LOG_REX3, "REX3 Screenmask 1 Y Min/Max Read: %08x\n", m_rex3.m_smask_y[1]);
+ ret |= m_rex3.m_smask_y[1];
+ }
+ break;
+ case 0x1308/8:
+ if (ACCESSING_BITS_32_63)
+ {
+ LOGMASKED(LOG_REX3, "REX3 Screenmask 2 X Min/Max Read: %08x\n", m_rex3.m_smask_x[2]);
+ ret |= (uint64_t)m_rex3.m_smask_x[2] << 32;
+ }
+ if (ACCESSING_BITS_0_31)
+ {
+ LOGMASKED(LOG_REX3, "REX3 Screenmask 2 Y Min/Max Read: %08x\n", m_rex3.m_smask_y[2]);
+ ret |= m_rex3.m_smask_y[2];
+ }
+ break;
+ case 0x1310/8:
+ if (ACCESSING_BITS_32_63)
+ {
+ LOGMASKED(LOG_REX3, "REX3 Screenmask 3 X Min/Max Read: %08x\n", m_rex3.m_smask_x[3]);
+ ret |= (uint64_t)m_rex3.m_smask_x[3] << 32;
+ }
+ if (ACCESSING_BITS_0_31)
+ {
+ LOGMASKED(LOG_REX3, "REX3 Screenmask 3 Y Min/Max Read: %08x\n", m_rex3.m_smask_y[3]);
+ ret |= m_rex3.m_smask_y[3];
+ }
+ break;
+ case 0x1318/8:
+ if (ACCESSING_BITS_32_63)
+ {
+ LOGMASKED(LOG_REX3, "REX3 Screenmask 4 X Min/Max Read: %08x\n", m_rex3.m_smask_x[4]);
+ ret |= (uint64_t)m_rex3.m_smask_x[4] << 32;
+ }
+ if (ACCESSING_BITS_0_31)
+ {
+ LOGMASKED(LOG_REX3, "REX3 Screenmask 4 Y Min/Max Read: %08x\n", m_rex3.m_smask_y[4]);
+ ret |= m_rex3.m_smask_y[4];
+ }
+ break;
+ case 0x1320/8:
+ if (ACCESSING_BITS_32_63)
+ {
+ LOGMASKED(LOG_REX3, "REX3 Top of Screen Scanline Read: %08x\n", m_rex3.m_top_scanline);
+ ret |= (uint64_t)m_rex3.m_top_scanline << 32;
+ }
+ if (ACCESSING_BITS_0_31)
+ {
+ LOGMASKED(LOG_REX3, "REX3 XY Window Read: %08x\n", m_rex3.m_xy_window);
+ ret |= m_rex3.m_xy_window;
+ }
+ break;
+ case 0x1328/8:
+ if (ACCESSING_BITS_32_63)
+ {
+ LOGMASKED(LOG_REX3, "REX3 Clipping Mode Read: %08x\n", m_rex3.m_clip_mode);
+ ret |= (uint64_t)m_rex3.m_clip_mode << 32;
+ }
+ break;
+ case 0x1330/8:
+ if (ACCESSING_BITS_32_63)
+ {
+ LOGMASKED(LOG_REX3, "REX3 Config Read: %08x\n", m_rex3.m_config);
+ ret |= (uint64_t)m_rex3.m_config << 32;
+ }
+ break;
+ case 0x1338/8:
+ if (ACCESSING_BITS_32_63)
+ {
+ LOGMASKED(LOG_REX3, "REX3 Status Read: %08x\n", m_rex3.m_status);
+ uint32_t old_status = m_rex3.m_status;
+ m_rex3.m_status = 0;
+ m_hpc3->lower_local_irq(0, ioc2_device::INT3_LOCAL0_GRAPHICS);
+ ret |= (uint64_t)(old_status | 3) << 32;
+ }
+ if (ACCESSING_BITS_0_31)
+ {
+ LOGMASKED(LOG_REX3, "REX3 User Status Read: %08x\n", m_rex3.m_status);
+ ret |= m_rex3.m_status;
+ }
+ break;
+ default:
+ LOGMASKED(LOG_REX3 | LOG_UNKNOWN, "Unknown REX3 Read: %08x (%08x%08x)\n", 0x1f0f0000 + (offset << 2), (uint32_t)(mem_mask >> 32), (uint32_t)mem_mask);
+ return 0;
+ }
+ return ret;
+}
+
+void newport_video_device::write_pixel(uint8_t color, bool shade)
+{
+ if (shade)
+ write_pixel(m_rex3.m_x_start_i, m_rex3.m_y_start_i, (uint8_t)(m_rex3.m_color_red >> 11));
+ else
+ write_pixel(m_rex3.m_x_start_i, m_rex3.m_y_start_i, color);
+}
+
+bool newport_video_device::pixel_clip_pass(int16_t x, int16_t y)
+{
+ bool mask0_pass = true;
+ if (BIT(m_rex3.m_clip_mode, 0))
+ {
+ const int16_t min_x = (int16_t)(m_rex3.m_smask_x[0] >> 16);
+ const int16_t min_y = (int16_t)(m_rex3.m_smask_y[0] >> 16);
+ const int16_t max_x = (int16_t)m_rex3.m_smask_x[0];
+ const int16_t max_y = (int16_t)m_rex3.m_smask_y[0];
+
+ if (x < min_x)
+ mask0_pass = false;
+ else if (y < min_y)
+ mask0_pass = false;
+ else if (x > max_x)
+ mask0_pass = false;
+ else if (y > max_y)
+ mask0_pass = false;
+ }
+
+ if (!mask0_pass)
+ {
+ LOGMASKED(LOG_REJECTS, "Rejecting pixel at %d,%d due to Mask 0 clipping (%d,%d - %d,%d)\n", x, y,
+ (int16_t)(m_rex3.m_smask_x[0] >> 16), (int16_t)(m_rex3.m_smask_y[0] >> 16), (int16_t)m_rex3.m_smask_x[0], (int16_t)m_rex3.m_smask_y[0]);
+ return false;
+ }
+
+ x += m_rex3.m_x_window;
+ y += m_rex3.m_y_window;
+ x -= 0x1000;
+ y -= 0x1000;
+
+ if (m_rex3.m_clip_mode & 0x1e)
+ {
+ uint8_t bit = 1;
+ for (; bit < 5; bit++)
+ {
+ if (!BIT(m_rex3.m_clip_mode, bit))
+ continue;
+
+ int16_t min_x = (int16_t)(m_rex3.m_smask_x[bit] >> 16) - 0x1000;
+ int16_t min_y = (int16_t)(m_rex3.m_smask_y[bit] >> 16) - 0x1000;
+ int16_t max_x = (int16_t)m_rex3.m_smask_x[bit] - 0x1000;
+ int16_t max_y = (int16_t)m_rex3.m_smask_y[bit] - 0x1000;
+
+ if (x < min_x)
+ {
+ LOGMASKED(LOG_REJECTS, "Skipping Mask %d because %04x,%04x is outside %04x,%04x to %04x,%04x (MinX)\n", bit, x, y, min_x, min_y, max_x, max_y);
+ continue;
+ }
+ if (x > max_x)
+ {
+ LOGMASKED(LOG_REJECTS, "Skipping Mask %d because %04x,%04x is outside %04x,%04x to %04x,%04x (MaxX)\n", bit, x, y, min_x, min_y, max_x, max_y);
+ continue;
+ }
+ if (y < min_y)
+ {
+ LOGMASKED(LOG_REJECTS, "Skipping Mask %d because %04x,%04x is outside %04x,%04x to %04x,%04x (MinY)\n", bit, x, y, min_x, min_y, max_x, max_y);
+ continue;
+ }
+ if (y > max_y)
+ {
+ LOGMASKED(LOG_REJECTS, "Skipping Mask %d because %04x,%04x is outside %04x,%04x to %04x,%04x (MaxY)\n", bit, x, y, min_x, min_y, max_x, max_y);
+ continue;
+ }
break;
}
- return m_rex3.m_dcb_data_msw;
- case 0x0244/4:
- LOGMASKED(LOG_REX3, "REX3 Display Control Bus Data LSW Read: %08x\n", m_rex3.m_dcb_data_lsw);
- return m_rex3.m_dcb_data_lsw;
- case 0x1300/4:
- LOGMASKED(LOG_REX3, "REX3 Screenmask 1 X Min/Max Read: %08x\n", m_rex3.m_s_mask1_x);
- return m_rex3.m_s_mask1_x;
- case 0x1304/4:
- LOGMASKED(LOG_REX3, "REX3 Screenmask 1 Y Min/Max Read: %08x\n", m_rex3.m_s_mask1_y);
- return m_rex3.m_s_mask1_y;
- case 0x1308/4:
- LOGMASKED(LOG_REX3, "REX3 Screenmask 2 X Min/Max Read: %08x\n", m_rex3.m_s_mask2_x);
- return m_rex3.m_s_mask2_x;
- case 0x130c/4:
- LOGMASKED(LOG_REX3, "REX3 Screenmask 2 Y Min/Max Read: %08x\n", m_rex3.m_s_mask2_y);
- return m_rex3.m_s_mask2_y;
- case 0x1310/4:
- LOGMASKED(LOG_REX3, "REX3 Screenmask 3 X Min/Max Read: %08x\n", m_rex3.m_s_mask3_x);
- return m_rex3.m_s_mask3_x;
- case 0x1314/4:
- LOGMASKED(LOG_REX3, "REX3 Screenmask 3 Y Min/Max Read: %08x\n", m_rex3.m_s_mask3_y);
- return m_rex3.m_s_mask3_y;
- case 0x1318/4:
- LOGMASKED(LOG_REX3, "REX3 Screenmask 4 X Min/Max Read: %08x\n", m_rex3.m_s_mask4_x);
- return m_rex3.m_s_mask4_x;
- case 0x131c/4:
- LOGMASKED(LOG_REX3, "REX3 Screenmask 4 Y Min/Max Read: %08x\n", m_rex3.m_s_mask4_y);
- return m_rex3.m_s_mask4_y;
- case 0x1320/4:
- LOGMASKED(LOG_REX3, "REX3 Top of Screen Scanline Read: %08x\n", m_rex3.m_top_scanline);
- return m_rex3.m_top_scanline;
- case 0x1324/4:
- LOGMASKED(LOG_REX3, "REX3 XY Window Read: %08x\n", m_rex3.m_xy_window);
- return m_rex3.m_xy_window;
- case 0x1328/4:
- LOGMASKED(LOG_REX3, "REX3 Clipping Mode Read: %08x\n", m_rex3.m_clip_mode);
- return m_rex3.m_clip_mode;
- case 0x1330/4:
- LOGMASKED(LOG_REX3, "REX3 Config Read: %08x\n", m_rex3.m_config);
- return m_rex3.m_config;
- case 0x1338/4:
+ if (bit == 5)
+ {
+ LOGMASKED(LOG_REJECTS, "Rejecting pixel at %d,%d due to Mask 1-4 clipping\n", x, y);
+ return false;
+ }
+ }
+
+ if (x < 0 || y < 0 || x >= (1280+64) || y >= 1024)
{
- LOGMASKED(LOG_REX3, "REX3 Status Read: %08x\n", m_rex3.m_status);
- uint32_t old_status = m_rex3.m_status;
- m_rex3.m_status = 0;
- m_hpc3->lower_local_irq(1, ioc2_device::INT3_LOCAL1_RETRACE);
- return old_status;
+ LOGMASKED(LOG_REJECTS, "Rejecting pixel at %d,%d due to VRAM clipping\n", x, y);
+ return false;
}
- case 0x133c/4:
- LOGMASKED(LOG_REX3, "REX3 User Status Read: %08x\n", m_rex3.m_status);
- return m_rex3.m_status;
- default:
- LOGMASKED(LOG_REX3 | LOG_UNKNOWN, "Unknown REX3 Read: %08x (%08x)\n", 0x1f0f0000 + (offset << 2), mem_mask);
- return 0;
+
+ return true;
+}
+
+void newport_video_device::store_pixel(uint8_t *dest_buf, uint8_t src)
+{
+ if (BIT(m_rex3.m_draw_mode1, 5))
+ src <<= 4;
+
+ const uint8_t dst = *dest_buf;
+ *dest_buf &= ~m_rex3.m_write_mask;
+
+ switch ((m_rex3.m_draw_mode1 >> 28) & 15)
+ {
+ case 0: break;
+ case 1: *dest_buf |= (src & dst) & m_rex3.m_write_mask; break;
+ case 2: *dest_buf |= (src & ~dst) & m_rex3.m_write_mask; break;
+ case 3: *dest_buf |= (src) & m_rex3.m_write_mask; break;
+ case 4: *dest_buf |= (~src & dst) & m_rex3.m_write_mask; break;
+ case 5: *dest_buf |= (dst) & m_rex3.m_write_mask; break;
+ case 6: *dest_buf |= (src ^ dst) & m_rex3.m_write_mask; break;
+ case 7: *dest_buf |= (src | dst) & m_rex3.m_write_mask; break;
+ case 8: *dest_buf |= ~(src | dst) & m_rex3.m_write_mask; break;
+ case 9: *dest_buf |= ~(src ^ dst) & m_rex3.m_write_mask; break;
+ case 10: *dest_buf |= ~(dst) & m_rex3.m_write_mask; break;
+ case 11: *dest_buf |= (src | ~dst) & m_rex3.m_write_mask; break;
+ case 12: *dest_buf |= ~(src) & m_rex3.m_write_mask; break;
+ case 13: *dest_buf |= (~src | dst) & m_rex3.m_write_mask; break;
+ case 14: *dest_buf |= ~(src & dst) & m_rex3.m_write_mask; break;
+ case 15: *dest_buf |= 0xff & m_rex3.m_write_mask; break;
+ }
+}
+
+void newport_video_device::write_pixel(int16_t x, int16_t y, uint8_t color)
+{
+ if (!pixel_clip_pass(x, y))
+ return;
+
+ x += m_rex3.m_x_window;
+ y += m_rex3.m_y_window;
+ x -= 0x1000;
+ y -= 0x1000;
+
+ switch (m_rex3.m_draw_mode1 & 7)
+ {
+ case 1: // RGB/CI planes
+ store_pixel(&m_rgbci[y * (1280 + 64) + x], color);
+ break;
+ case 2: // RGBA planes
+ // Not yet handled
+ break;
+ case 4: // Overlay planes
+ store_pixel(&m_olay[y * (1280 + 64) + x], color);
+ break;
+ case 5: // Popup planes
+ store_pixel(&m_pup[y * (1280 + 64) + x], (color << 2) | (color << 6));
+ break;
+ case 6: // CID planes
+ store_pixel(&m_cid[y * (1280 + 64) + x], color);
+ break;
+ }
+}
+
+void newport_video_device::do_v_iline(uint8_t color, bool skip_last, bool shade)
+{
+ int16_t x1 = m_rex3.m_x_start_i;
+ int16_t y1 = m_rex3.m_y_start_i;
+ int16_t y2 = m_rex3.m_y_end_i;
+
+ int16_t incy = (y2 < y1) ? -1 : 1;
+
+ do
+ {
+ if (shade)
+ write_pixel(x1, y1, (uint8_t)(m_rex3.m_color_red >> 11));
+ else
+ write_pixel(x1, y1, color);
+
+ y1 += incy;
+
+ if (shade)
+ m_rex3.m_color_red += (m_rex3.m_slope_red << 8) >> 8;
+ } while (y1 != y2);
+
+ if (!skip_last)
+ {
+ if (shade)
+ write_pixel(x1, y1, (uint8_t)(m_rex3.m_color_red >> 11));
+ else
+ write_pixel(x1, y1, color);
+ }
+
+ write_x_start(x1 << 11);
+ write_y_start(y1 << 11);
+}
+
+void newport_video_device::do_h_iline(uint8_t color, bool skip_last, bool shade)
+{
+ int16_t x1 = m_rex3.m_x_start_i;
+ int16_t y1 = m_rex3.m_y_start_i;
+ int16_t x2 = m_rex3.m_x_end_i;
+
+ int16_t incx = (x2 < x1) ? -1 : 1;
+
+ do
+ {
+ if (shade)
+ write_pixel(x1, y1, (uint8_t)(m_rex3.m_color_red >> 11));
+ else
+ write_pixel(x1, y1, color);
+
+ x1 += incx;
+
+ if (shade)
+ m_rex3.m_color_red += (m_rex3.m_slope_red << 8) >> 8;
+ } while (x1 != x2);
+
+ if (!skip_last) {
+ if (shade)
+ write_pixel(x1, y1, (uint8_t)(m_rex3.m_color_red >> 11));
+ else
+ write_pixel(x1, y1, color);
}
+
+ write_x_start(x1 << 11);
+ write_y_start(y1 << 11);
+}
+
+void newport_video_device::do_iline(uint8_t color, bool skip_last, bool shade)
+{
+ int16_t x1 = m_rex3.m_x_start_i;
+ int16_t y1 = m_rex3.m_y_start_i;
+ int16_t x2 = m_rex3.m_x_end_i;
+ int16_t y2 = m_rex3.m_y_end_i;
+
+ unsigned char c1 = 0;
+ int16_t incy = 1;
+
+ int16_t dx = abs(x2 - x1);
+ int16_t dy = abs(y2 - y1);
+
+ if (dy > dx)
+ {
+ int16_t t = y2;
+ y2 = x2;
+ x2 = t;
+
+ t = y1;
+ y1 = x1;
+ x1 = t;
+
+ t = dx;
+ dx = dy;
+ dy = t;
+
+ c1 = 1;
+ }
+
+ if (x1 > x2)
+ {
+ int16_t t = y2;
+ y2 = y1;
+ y1 = t;
+
+ t = x1;
+ x1 = x2;
+ x2 = t;
+ }
+
+ int horiz = dy << 1;
+ int diago = (dy - dx) << 1;
+ int e = (dy << 1) - dx;
+
+ if (y1 <= y2)
+ incy = 1;
+ else
+ incy = -1;
+
+ if (c1)
+ {
+ do
+ {
+ if (shade)
+ write_pixel(y1, x1, (uint8_t)(m_rex3.m_color_red >> 11));
+ else
+ write_pixel(y1, x1, color);
+
+ if (e > 0)
+ {
+ y1 += incy;
+ e = e + diago;
+ }
+ else
+ {
+ e = e + horiz;
+ }
+
+ x1++;
+ if (shade)
+ m_rex3.m_color_red += (m_rex3.m_slope_red << 8) >> 8;
+ } while (x1 != x2);
+
+ if (!skip_last)
+ {
+ if (shade)
+ write_pixel(y1, x1, (uint8_t)(m_rex3.m_color_red >> 11));
+ else
+ write_pixel(y1, x1, color);
+ }
+ }
+ else
+ {
+ do
+ {
+ if (shade)
+ write_pixel(x1, y1, (uint8_t)(m_rex3.m_color_red >> 11));
+ else
+ write_pixel(x1, y1, color);
+
+ if (e > 0)
+ {
+ y1 += incy;
+ e = e + diago;
+ }
+ else
+ {
+ e = e + horiz;
+ }
+
+ x1++;
+ if (shade)
+ m_rex3.m_color_red += (m_rex3.m_slope_red << 8) >> 8;
+ } while (x1 != x2);
+
+ if (!skip_last)
+ {
+ if (shade)
+ write_pixel(x1, y1, (uint8_t)(m_rex3.m_color_red >> 11));
+ else
+ write_pixel(x1, y1, color);
+ }
+ }
+
+ write_x_start(x1 << 11);
+ write_y_start(y1 << 11);
+}
+
+uint8_t newport_video_device::do_pixel_read()
+{
+ if (m_rex3.m_xy_start_i == m_rex3.m_xy_end_i)
+ m_rex3.m_read_active = false;
+ LOGMASKED(LOG_COMMANDS, "Reading from %04x, %04x\n", m_rex3.m_x_start_i, m_rex3.m_y_start_i);
+ m_rex3.m_bres_octant_inc1 = 0;
+ const uint8_t ret = m_rgbci[m_rex3.m_y_start_i * (1280 + 64) + m_rex3.m_x_start_i];
+ m_rex3.m_x_start_i++;
+ if (m_rex3.m_x_start_i > m_rex3.m_x_end_i)
+ {
+ m_rex3.m_y_start_i++;
+ m_rex3.m_x_start_i = m_rex3.m_x_save;
+ }
+
+ write_x_start(m_rex3.m_x_start_i << 11);
+ write_y_start(m_rex3.m_y_start_i << 11);
+ return ret;
+}
+
+uint64_t newport_video_device::do_pixel_word_read()
+{
+ const uint16_t x_start = (uint16_t)(m_rex3.m_xy_start_i >> 16);
+ const uint16_t x_end = (uint16_t)(m_rex3.m_xy_end_i >> 16);
+ const bool doubleword = BIT(m_rex3.m_draw_mode1, 10);
+ const uint16_t max_width = doubleword ? 8 : 4;
+ uint16_t width = (x_end - x_start) + 1;
+ if (width > max_width)
+ width = max_width;
+
+ uint64_t ret = 0;
+ uint64_t shift = 56;
+ for (uint16_t i = 0; i < width; i++)
+ {
+ ret |= (uint64_t)do_pixel_read() << shift;
+ shift -= 8;
+ }
+ return ret;
}
void newport_video_device::do_rex3_command()
{
- uint32_t command = ((m_rex3.m_draw_mode0 & (1 << 15)) >> 15) |
- ((m_rex3.m_draw_mode0 & (1 << 5)) >> 4) |
- ((m_rex3.m_draw_mode0 & (1 << 9)) >> 7) |
- ((m_rex3.m_draw_mode0 & (1 << 8)) >> 5) |
- ((m_rex3.m_draw_mode0 & 0x0000001c) << 2) |
- ((m_rex3.m_draw_mode0 & 0x00000003) << 7);
- uint16_t start_x = (uint16_t)(m_rex3.m_xy_start_i >> 16);
- uint16_t start_y = (uint16_t)m_rex3.m_xy_start_i;
- uint16_t end_x = (uint16_t)(m_rex3.m_xy_end_i >> 16);
- uint16_t end_y = (uint16_t)m_rex3.m_xy_end_i;
-
- switch (command)
+ static const char* const s_opcode_str[4] = { "Noop", "Read", "Draw", "Scr2Scr" };
+ static const char* const s_adrmode_str[8] = {
+ "Span", "Block", "IntLine", "FracLine", "AALine", "Unk5", "Unk6", "Unk7"
+ };
+
+ const uint32_t mode0 = m_rex3.m_draw_mode0;
+ const uint32_t mode1 = m_rex3.m_draw_mode1;
+
+ int16_t start_x = m_rex3.m_x_start_i;
+ int16_t start_y = m_rex3.m_y_start_i;
+ int16_t end_x = m_rex3.m_x_end_i;
+ int16_t end_y = m_rex3.m_y_end_i;
+ int16_t dx = start_x > end_x ? -1 : 1;
+ int16_t dy = start_y > end_y ? -1 : 1;
+
+ LOGMASKED(LOG_COMMANDS, "REX3 Command: %08x|%08x - %s %s\n", mode0, mode1, s_opcode_str[mode0 & 3], s_adrmode_str[(mode0 >> 2) & 7]);
+
+ switch (mode0)
{
- case 0x00000110:
+ case 0x00000000: // NoOp
+ break;
+ case 0x00000006: // Block, Draw
{
- uint16_t x = start_x;
- uint16_t y = start_y;
- LOGMASKED(LOG_COMMANDS, "Tux Logo Draw: %04x, %04x = %08x\n", x, y, m_cmap0.m_palette[m_rex3.m_host_dataport_msw >> 24]);
-// m_rex3.m_skipline_kludge = 1;
+ LOGMASKED(LOG_COMMANDS, "%04x, %04x = %02x\n", start_x, start_y, m_rex3.m_color_i & 0xff);
m_rex3.m_bres_octant_inc1 = 0;
- m_base[y * (1280 + 64) + x] = m_cmap0.m_palette[m_rex3.m_host_dataport_msw >> 24];
- x++;
- if (x > (m_rex3.m_xy_end_i >> 16))
+ write_pixel(m_rex3.m_color_i & 0xff, false);
+ start_x++;
+ if (start_x > end_x)
{
- y++;
- x = m_rex3.m_x_save;
+ start_y++;
+ start_x = m_rex3.m_x_save;
}
- m_rex3.m_xy_start_i = (x << 16) | y;
- m_rex3.m_x_start_i = x;
- m_rex3.m_x_start = ((m_rex3.m_xy_start_i & 0xffff0000) >> 5);
- m_rex3.m_y_start = ((m_rex3.m_xy_start_i & 0x0000ffff) << 11);
+
+ write_x_start(start_x << 11);
+ write_y_start(start_y << 11);
break;
}
- case 0x0000011e:
- LOGMASKED(LOG_COMMANDS, "Block draw: %04x, %04x to %04x, %04x = %08x\n", start_x, start_y, end_x, end_y, m_cmap0.m_palette[m_rex3.m_zero_fract]);
- for (uint16_t y = start_y; y <= end_y; y++)
+ case 0x00000046: // ColorHost, Block, Draw
+ {
+ m_rex3.m_bres_octant_inc1 = 0;
+ if (BIT(mode1, 7)) // Packed
{
- for (uint16_t x = start_x; x <= end_x; x++)
+ const bool doubleword = BIT(mode1, 10);
+ uint16_t remaining_length = (end_x - start_x) + 1;
+ uint16_t length = doubleword ? 8 : 4;
+ if (remaining_length < length)
+ length = remaining_length;
+ LOGMASKED(LOG_COMMANDS, "%04x, %04x = %08x%08x\n", start_x, start_y, (uint32_t)(m_rex3.m_host_dataport >> 32), (uint32_t)m_rex3.m_host_dataport);
+ uint64_t shift = 56;
+ for (uint16_t i = 0; i < length; i++)
{
- m_base[y * (1280 + 64) + x] = m_cmap0.m_palette[m_rex3.m_zero_fract];
+ write_pixel(start_x, start_y, (uint8_t)(m_rex3.m_host_dataport >> shift));
+ start_x++;
+ shift -= 8;
}
}
+ else
+ {
+ LOGMASKED(LOG_COMMANDS, "%04x, %04x = %02x\n", start_x, start_y, (uint8_t)(m_rex3.m_host_dataport >> 56));
+ write_pixel(start_x, start_y, m_rex3.m_host_dataport >> 56);
+ start_x++;
+ }
+ if (start_x > end_x)
+ {
+ start_y++;
+ start_x = m_rex3.m_x_save;
+ }
+ write_x_start(start_x << 11);
+ write_y_start(start_y << 11);
+ break;
+ }
+ case 0x00000045: // ColorHost, Block, Read
+ case 0x00000065: // ColorHost, Block, Read
+ {
+ m_rex3.m_read_active = true;
break;
- case 0x00000119:
- if (!m_rex3.m_skipline_kludge)
+ }
+ case 0x00000022: // DoSetup, Span, Draw
+ case 0x00000102: // StopOnX, Span, Draw
+ case 0x00000122: // StopOnX, DoSetup, Span, Draw
+ case 0x00022102: // LSOpaque, EnLSPattern, StopOnX, Span, Draw
+ case 0x00080122: // LROnly, StopOnX, DoSetup, Span, Draw
+ case 0x000c0122: // LROnly, Shade, StopOnX, DoSetup, Span, Draw
+ case 0x000c9102: // LROnly, Shade, Length32, EnZPattern, StopOnX, Span, Draw
+ {
+ if (BIT(mode0, 19) && dx < 0) // LROnly
+ break;
+
+ if (!BIT(mode0, 8))
+ end_x = start_x;
+
+ end_x += dx;
+ end_y += dy;
+
+ bool shade = BIT(mode0, 18);
+
+ uint32_t color = m_rex3.m_color_i & 0xff;
+ LOGMASKED(LOG_COMMANDS, "%04x, %04x to %04x, %04x = %08x\n", start_x, start_y, end_x, end_y, color);
+ for (; start_x != end_x; start_x += dx)
{
- LOGMASKED(LOG_COMMANDS, "Pattern Line Draw: %08x at %04x, %04x color %08x\n", m_rex3.m_z_pattern, m_rex3.m_xy_start_i >> 16, (uint16_t)m_rex3.m_xy_start_i, m_cmap0.m_palette[m_rex3.m_zero_fract]);
- for (uint16_t x = start_x; x <= end_x && x < (start_x + 32); x++)
+ if (shade)
{
- if (m_rex3.m_z_pattern & (1 << (31 - (x - start_x))))
- {
- m_base[start_y * (1280 + 64) + x] = m_cmap0.m_palette[m_rex3.m_zero_fract];
- }
+ write_pixel(start_x, start_y, (uint8_t)(m_rex3.m_color_red >> 11));
+ m_rex3.m_color_red += (m_rex3.m_slope_red << 8) >> 8;
}
- if (BIT(m_rex3.m_bres_octant_inc1, 24))
- start_y--;
else
- start_y++;
- m_rex3.m_xy_start_i = (start_x << 16) | start_y;
- m_rex3.m_y_start = ((m_rex3.m_xy_start_i & 0x0000ffff) << 11);
+ {
+ write_pixel(start_x, start_y, color);
+ }
+ }
+ start_y++;
+
+ write_x_start(start_x << 11);
+ write_y_start(start_y << 11);
+ break;
+ }
+ case 0x00000326: // StopOnX, StopOnY, DoSetup, Block, Draw
+ {
+ end_x += dx;
+ end_y += dy;
+
+ uint32_t color = m_rex3.m_color_i & 0xff;
+ if (BIT(mode1, 17))
+ {
+ color = m_rex3.m_color_vram & 0xff;
+ }
+ LOGMASKED(LOG_COMMANDS, "%04x, %04x to %04x, %04x = %08x, %04x\n", start_x, start_y, end_x, end_y, m_cmap0.m_palette[color], m_rex3.m_x_save);
+ for (; start_y != end_y; start_y += dy)
+ {
+ for (; start_x != end_x; start_x += dx)
+ {
+ write_pixel(start_x, start_y, color);
+ }
+ start_x = m_rex3.m_x_save;
+ }
+
+ write_x_start(start_x << 11);
+ write_y_start(start_y << 11);
+ break;
+ }
+ case 0x00000327: // StopOnX, StopOnY, DoSetup, Block, Scr2Scr
+ {
+ end_x += dx;
+ end_y += dy;
+ LOGMASKED(LOG_COMMANDS, "%04x, %04x - %04x, %04x to %04x, %04x\n", start_x, start_y, end_x, end_y, start_x + m_rex3.m_x_move, start_y + m_rex3.m_y_move);
+ for (; start_y != end_y; start_y += dy)
+ {
+ for (; start_x != end_x; start_x += dx)
+ {
+ write_pixel(start_x + m_rex3.m_x_move, start_y + m_rex3.m_y_move, m_rgbci[(start_y + m_rex3.m_y_window - 0x1000) * (1280 + 64) + (start_x + m_rex3.m_x_window - 0x1000)]);
+ }
+ start_x = m_rex3.m_x_save;
+ }
+ write_x_start(start_x << 11);
+ write_y_start(start_y << 11);
+ break;
+ }
+ case 0x0000000a: // I_Line, Draw
+ case 0x0000032a: // StopOnX, StopOnY, DoSetup, I_Line, Draw
+ case 0x00000b2a: // SkipLast, StopOnX, StopOnY, DoSetup, I_Line, Draw
+ case 0x0000232e: // EnLSPattern, StopOnX, StopOnY, DoSetup, F_Line, Draw
+ case 0x0004232e: // Shade, EnLSPattern, StopOnX, StopOnY, DoSetup, F_Line, Draw
+ case 0x00442332: // EndFilter, Shade, EnLSPattern, StopOnX, StopOnY, DoSetp, A_Line, Draw
+ {
+ const bool skip_last = BIT(mode0, 11);
+ const bool shade = BIT(mode0, 18);
+
+ LOGMASKED(LOG_COMMANDS, "%cLine: %04x, %04x to %04x, %04x = %08x\n", (mode0 & 0x1c) == 3 ? 'F' : 'I',
+ start_x, start_y, end_x, end_y, m_cmap0.m_palette[m_rex3.m_color_i]);
+ if (start_x == end_x && start_y == end_y)
+ {
+ write_pixel(m_rex3.m_color_i, shade);
+ }
+ else if (start_x == end_x)
+ {
+ do_v_iline(m_rex3.m_color_i, skip_last, shade);
+ }
+ else if (start_y == end_y)
+ {
+ do_h_iline(m_rex3.m_color_i, skip_last, shade);
+ }
+ else
+ {
+ do_iline(m_rex3.m_color_i, skip_last, shade);
}
break;
- case 0x0000019e:
+ }
+ case 0x00001106: // EnZPattern, StopOnX, Block, Draw
+ case 0x00002106: // EnLSPattern, StopOnX, Block, Draw
+ case 0x00009106: // Length32, EnZPattern, StopOnX, Block, Draw
+ case 0x00022106: // LSOpaque, EnLSPattern, StopOnX, Block, Draw
+ case 0x00019106: // ZPOpaque, EnLSPattern, StopOnX, Block, Draw
{
- int16_t move_x = (int16_t)((m_rex3.m_xy_move >> 16) & 0x0000ffff);
- int16_t move_y = (int16_t)m_rex3.m_xy_move;
- LOGMASKED(LOG_COMMANDS, "FB to FB Copy: %04x, %04x - %04x, %04x to %04x, %04x\n", start_x, start_y, end_x, end_y, start_x + move_x, start_y + move_y);
- for (uint16_t y = start_y; y <= end_y; y++)
+ const bool opaque = (mode0 == 0x00019106) || (mode0 == 0x00022106);
+ const uint32_t pattern = BIT(mode0, 12) ? m_rex3.m_z_pattern : m_rex3.m_ls_pattern;
+ const uint8_t foreground = m_rex3.m_color_i & 0xff;
+ const uint8_t background = m_rex3.m_color_back & 0xff;
+ LOGMASKED(LOG_COMMANDS, "%08x at %04x, %04x color %08x\n", pattern, start_x, start_y, foreground);
+ end_x += dx;
+ int16_t end = end_x;
+ if (BIT(mode0, 15))
+ {
+ if ((end_x - start_x) >= 32)
+ {
+ end = start_x + 31;
+ }
+ }
+ for (; start_x != end; start_x += dx)
{
- for (uint16_t x = start_x; x <= end_x; x++)
+ if (pattern & (1 << (31 - (start_x - m_rex3.m_x_start_i))))
+ {
+ write_pixel(start_x, start_y, foreground);
+ }
+ else if (opaque)
{
- m_base[(y + move_y) * (1280 + 64) + (x + move_x)] = m_base[y * (1280 + 64) + x];
+ write_pixel(start_x, start_y, background);
}
}
+ if (BIT(m_rex3.m_bres_octant_inc1, 24))
+ start_y--;
+ else
+ start_y++;
+
+ start_x = m_rex3.m_x_save;
+ write_x_start(start_x << 11);
+ write_y_start(start_y << 11);
break;
}
default:
- LOGMASKED(LOG_COMMANDS | LOG_UNKNOWN, "Unknown draw command: %08x\n", command);
+ LOGMASKED(LOG_COMMANDS | LOG_UNKNOWN, "Draw command %08x not recognized\n", m_rex3.m_draw_mode0);
break;
}
}
-WRITE32_MEMBER(newport_video_device::rex3_w)
+void newport_video_device::write_x_start(int32_t val)
{
- if (offset & 0x00000200)
+ m_rex3.m_x_start = val & 0x07ffff80;
+ m_rex3.m_x_start_i = (int16_t)(val >> 11);
+ m_rex3.m_x_start_f = (uint32_t)val & 0x007fff80;
+ m_rex3.m_xy_start_i = (m_rex3.m_xy_start_i & 0x0000ffff) | (m_rex3.m_x_start_i << 16);
+}
+
+void newport_video_device::write_y_start(int32_t val)
+{
+ m_rex3.m_y_start = val & 0x07ffff80;
+ m_rex3.m_y_start_i = (int16_t)(val >> 11);
+ m_rex3.m_y_start_f = (uint32_t)val & 0x007fff80;
+ m_rex3.m_xy_start_i = (m_rex3.m_xy_start_i & 0xffff0000) | (uint16_t)m_rex3.m_y_start_i;
+}
+
+void newport_video_device::write_x_end(int32_t val)
+{
+ m_rex3.m_x_end = val & 0x07ffff80;
+ m_rex3.m_x_end_i = (int16_t)(val >> 11);
+ m_rex3.m_x_end_f = (uint32_t)val & 0x007fff80;
+ m_rex3.m_xy_end_i = (m_rex3.m_xy_end_i & 0x0000ffff) | (m_rex3.m_x_end_i << 16);
+}
+
+void newport_video_device::write_y_end(int32_t val)
+{
+ m_rex3.m_y_end = val & 0x07ffff80;
+ m_rex3.m_y_end_i = (int16_t)(val >> 11);
+ m_rex3.m_y_end_f = (uint32_t)val & 0x007fff80;
+ m_rex3.m_xy_end_i = (m_rex3.m_xy_end_i & 0xffff0000) | (uint16_t)m_rex3.m_y_end_i;
+}
+
+WRITE64_MEMBER(newport_video_device::rex3_w)
+{
+#if ENABLE_NEWVIEW_LOG
+ if (m_newview_log != nullptr)
{
- LOGMASKED(LOG_REX3 | LOG_COMMANDS, "Start Command\n");
+ uint32_t offset_lo = (uint32_t)offset;
+ uint32_t data_hi = (uint32_t)(data >> 32);
+ uint32_t data_lo = (uint32_t)data;
+ uint32_t mem_mask_hi = (uint32_t)(mem_mask >> 32);
+ uint32_t mem_mask_lo = (uint32_t)mem_mask;
+
+ fwrite(&offset_lo, sizeof(uint32_t), 1, m_newview_log);
+ fwrite(&data_hi, sizeof(uint32_t), 1, m_newview_log);
+ fwrite(&data_lo, sizeof(uint32_t), 1, m_newview_log);
+ fwrite(&mem_mask_hi, sizeof(uint32_t), 1, m_newview_log);
+ fwrite(&mem_mask_lo, sizeof(uint32_t), 1, m_newview_log);
}
- switch (offset & ~(0x800/4))
+#endif
+
+ switch (offset & ~(0x800/8))
{
- case 0x0000/4:
- LOGMASKED(LOG_REX3, "REX3 Draw Mode 1 Write: %08x\n", data);
- switch (data & 7)
+ case 0x0000/8:
+ if (ACCESSING_BITS_32_63)
{
- case 0x00:
- LOGMASKED(LOG_REX3, " Planes Enabled: None\n");
- break;
- case 0x01:
- LOGMASKED(LOG_REX3, " Planes Enabled: R/W RGB/CI\n");
- break;
- case 0x02:
- LOGMASKED(LOG_REX3, " Planes Enabled: R/W RGBA\n");
- break;
- case 0x03:
- LOGMASKED(LOG_REX3, " Planes Enabled: R/W OLAY\n");
- break;
- case 0x04:
- LOGMASKED(LOG_REX3, " Planes Enabled: R/W PUP\n");
- break;
- case 0x05:
- LOGMASKED(LOG_REX3, " Planes Enabled: R/W CID\n");
- break;
- default:
- LOGMASKED(LOG_REX3 | LOG_UNKNOWN, " Unknown Plane Enable Value\n");
- break;
+ const uint32_t data32 = (uint32_t)(data >> 32);
+ LOGMASKED(LOG_REX3, "REX3 Draw Mode 1 Write: %08x\n", data32);
+ switch (data32 & 7)
+ {
+ case 0x00:
+ LOGMASKED(LOG_REX3, " Planes Enabled: None\n");
+ break;
+ case 0x01:
+ LOGMASKED(LOG_REX3, " Planes Enabled: R/W RGB/CI\n");
+ break;
+ case 0x02:
+ LOGMASKED(LOG_REX3, " Planes Enabled: R/W RGBA\n");
+ break;
+ case 0x04:
+ LOGMASKED(LOG_REX3, " Planes Enabled: R/W OLAY\n");
+ break;
+ case 0x05:
+ LOGMASKED(LOG_REX3, " Planes Enabled: R/W PUP\n");
+ break;
+ case 0x06:
+ LOGMASKED(LOG_REX3, " Planes Enabled: R/W CID\n");
+ break;
+ default:
+ LOGMASKED(LOG_REX3 | LOG_UNKNOWN, " Unknown Plane Enable Value\n");
+ break;
+ }
+ switch ((data32 & 0x00000018) >> 3)
+ {
+ case 0x00:
+ LOGMASKED(LOG_REX3, " Plane Draw Depth: 4 bits\n");
+ m_rex3.m_write_width = 0x0000000f;
+ break;
+ case 0x01:
+ LOGMASKED(LOG_REX3, " Plane Draw Depth: 8 bits\n");
+ m_rex3.m_write_width = 0x000000ff;
+ break;
+ case 0x02:
+ LOGMASKED(LOG_REX3, " Plane Draw Depth: 12 bits\n");
+ m_rex3.m_write_width = 0x000000ff; // TODO: 24-bit
+ break;
+ case 0x03:
+ LOGMASKED(LOG_REX3, " Plane Draw Depth: 32 bits\n");
+ m_rex3.m_write_width = 0x000000ff; // TODO: 24-bit
+ break;
+ }
+ LOGMASKED(LOG_REX3, " DBuf Source Buffer: %d\n", BIT(data32, 5));
+ LOGMASKED(LOG_REX3, " GL Y Coordinates: %d\n", BIT(data32, 6));
+ LOGMASKED(LOG_REX3, " Enable Pxl Packing: %d\n", BIT(data32, 7));
+ switch ((data32 & 0x00000300) >> 8)
+ {
+ case 0x00:
+ LOGMASKED(LOG_REX3, " HOSTRW Depth: 4 bits\n");
+ break;
+ case 0x01:
+ LOGMASKED(LOG_REX3, " HOSTRW Depth: 8 bits\n");
+ break;
+ case 0x02:
+ LOGMASKED(LOG_REX3, " HOSTRW Depth: 12 bits\n");
+ break;
+ case 0x03:
+ LOGMASKED(LOG_REX3, " HOSTRW Depth: 32 bits\n");
+ break;
+ }
+ LOGMASKED(LOG_REX3, " DWord Transfers: %d\n", BIT(data32, 10));
+ LOGMASKED(LOG_REX3, " Swap Endianness: %d\n", BIT(data32, 11));
+ LOGMASKED(LOG_REX3, " Compare Src > Dest: %d\n", BIT(data32, 12));
+ LOGMASKED(LOG_REX3, " Compare Src = Dest: %d\n", BIT(data32, 13));
+ LOGMASKED(LOG_REX3, " Compare Src < Dest: %d\n", BIT(data32, 14));
+ LOGMASKED(LOG_REX3, " RGB Mode Select: %d\n", BIT(data32, 15));
+ LOGMASKED(LOG_REX3, " Enable Dithering: %d\n", BIT(data32, 16));
+ LOGMASKED(LOG_REX3, " Enable Fast Clear: %d\n", BIT(data32, 17));
+ LOGMASKED(LOG_REX3, " Enable Blending: %d\n", BIT(data32, 18));
+ switch ((data32 & 0x00380000) >> 19)
+ {
+ case 0x00:
+ LOGMASKED(LOG_REX3, " Src Blend Factor: 0\n");
+ break;
+ case 0x01:
+ LOGMASKED(LOG_REX3, " Src Blend Factor: 1\n");
+ break;
+ case 0x02:
+ LOGMASKED(LOG_REX3, " Src Blend Factor: Normalized Dest (or COLORBACK)\n");
+ break;
+ case 0x03:
+ LOGMASKED(LOG_REX3, " Src Blend Factor: 1 - Normalized Dest (or COLORBACK)\n");
+ break;
+ case 0x04:
+ LOGMASKED(LOG_REX3, " Src Blend Factor: Normalized Src\n");
+ break;
+ case 0x05:
+ LOGMASKED(LOG_REX3, " Src Blend Factor: 1 - Normalized Src\n");
+ break;
+ default:
+ LOGMASKED(LOG_REX3 | LOG_UNKNOWN, " Unknown Src Blend Factor: %02x\n", (data32 & 0x00380000) >> 19);
+ break;
+ }
+ switch ((data32 & 0x01c00000) >> 22)
+ {
+ case 0x00:
+ LOGMASKED(LOG_REX3, " Dest Blend Factor: 0\n");
+ break;
+ case 0x01:
+ LOGMASKED(LOG_REX3, " Dest Blend Factor: 1\n");
+ break;
+ case 0x02:
+ LOGMASKED(LOG_REX3, " Dest Blend Factor: Normalized Dest (or COLORBACK)\n");
+ break;
+ case 0x03:
+ LOGMASKED(LOG_REX3, " Dest Blend Factor: 1 - Normalized Dest (or COLORBACK)\n");
+ break;
+ case 0x04:
+ LOGMASKED(LOG_REX3, " Dest Blend Factor: Normalized Src\n");
+ break;
+ case 0x05:
+ LOGMASKED(LOG_REX3, " Dest Blend Factor: 1 - Normalized Src\n");
+ break;
+ default:
+ LOGMASKED(LOG_REX3 | LOG_UNKNOWN, " Unknown Src Blend Factor: %02x\n", (data32 & 0x00380000) >> 19);
+ break;
+ }
+ LOGMASKED(LOG_REX3, " COLORBACK Dest Blend: %d\n", BIT(data32, 25));
+ LOGMASKED(LOG_REX3, " Enable Pxl Prefetch: %d\n", BIT(data32, 26));
+ LOGMASKED(LOG_REX3, " SFACTOR Src Alpha: %d\n", BIT(data32, 27));
+ switch ((data32 & 0xf0000000) >> 28)
+ {
+ case 0x00:
+ LOGMASKED(LOG_REX3, " Logical Op. Type: 0\n");
+ break;
+ case 0x01:
+ LOGMASKED(LOG_REX3, " Logical Op. Type: Src & Dst\n");
+ break;
+ case 0x02:
+ LOGMASKED(LOG_REX3, " Logical Op. Type: Src & ~Dst\n");
+ break;
+ case 0x03:
+ LOGMASKED(LOG_REX3, " Logical Op. Type: Src\n");
+ break;
+ case 0x04:
+ LOGMASKED(LOG_REX3, " Logical Op. Type: ~Src & Dst\n");
+ break;
+ case 0x05:
+ LOGMASKED(LOG_REX3, " Logical Op. Type: Dst\n");
+ break;
+ case 0x06:
+ LOGMASKED(LOG_REX3, " Logical Op. Type: Src ^ Dst\n");
+ break;
+ case 0x07:
+ LOGMASKED(LOG_REX3, " Logical Op. Type: Src | Dst\n");
+ break;
+ case 0x08:
+ LOGMASKED(LOG_REX3, " Logical Op. Type: ~(Src | Dst)\n");
+ break;
+ case 0x09:
+ LOGMASKED(LOG_REX3, " Logical Op. Type: ~(Src ^ Dst)\n");
+ break;
+ case 0x0a:
+ LOGMASKED(LOG_REX3, " Logical Op. Type: ~Dst\n");
+ break;
+ case 0x0b:
+ LOGMASKED(LOG_REX3, " Logical Op. Type: Src | ~Dst\n");
+ break;
+ case 0x0c:
+ LOGMASKED(LOG_REX3, " Logical Op. Type: ~Src\n");
+ break;
+ case 0x0d:
+ LOGMASKED(LOG_REX3, " Logical Op. Type: ~Src | Dst\n");
+ break;
+ case 0x0e:
+ LOGMASKED(LOG_REX3, " Logical Op. Type: ~(Src & Dst)\n");
+ break;
+ case 0x0f:
+ LOGMASKED(LOG_REX3, " Logical Op. Type: 1\n");
+ break;
+ }
+ m_rex3.m_draw_mode1 = data32;
}
- switch ((data & 0x00000018) >> 3)
+ if (ACCESSING_BITS_0_31)
{
- case 0x00:
- LOGMASKED(LOG_REX3, " Plane Draw Depth: 4 bits\n");
- break;
- case 0x01:
- LOGMASKED(LOG_REX3, " Plane Draw Depth: 8 bits\n");
- break;
- case 0x02:
- LOGMASKED(LOG_REX3, " Plane Draw Depth: 12 bits\n");
- break;
- case 0x03:
- LOGMASKED(LOG_REX3, " Plane Draw Depth: 32 bits\n");
- break;
+ const uint32_t data32 = (uint32_t)data;
+ LOGMASKED(LOG_REX3, "REX3 Draw Mode 0 Write: %08x\n", data32);
+ switch (data32 & 3)
+ {
+ case 0x00:
+ LOGMASKED(LOG_REX3, " Primitive Function: No Op\n");
+ break;
+ case 0x01:
+ LOGMASKED(LOG_REX3, " Primitive Function: Read From FB\n");
+ break;
+ case 0x02:
+ LOGMASKED(LOG_REX3, " Primitive Function: Draw To FB\n");
+ break;
+ case 0x03:
+ LOGMASKED(LOG_REX3, " Primitive Function: Copy FB To FB\n");
+ break;
+ }
+ switch ((data32 & 0x0000001c) >> 2)
+ {
+ case 0x00:
+ LOGMASKED(LOG_REX3, " Addressing Mode: Span/Point\n");
+ break;
+ case 0x01:
+ LOGMASKED(LOG_REX3, " Addressing Mode: Block\n");
+ break;
+ case 0x02:
+ LOGMASKED(LOG_REX3, " Addressing Mode: Bresenham Line, Integer Endpoints\n");
+ break;
+ case 0x03:
+ LOGMASKED(LOG_REX3, " Addressing Mode: Bresenham Line, Fractional Endpoints\n");
+ break;
+ case 0x04:
+ LOGMASKED(LOG_REX3, " Addressing Mode: AA Bresenham Line\n");
+ break;
+ default:
+ LOGMASKED(LOG_REX3 | LOG_UNKNOWN, " Unknown Addressing Mode: %02x\n", (data32 & 0x0000001c) >> 2);
+ break;
+ }
+ LOGMASKED(LOG_REX3, " Iterator Setup: %d\n", BIT(data32, 5));
+ LOGMASKED(LOG_REX3, " RGB/CI Draw Source: %d\n", BIT(data32, 6));
+ LOGMASKED(LOG_REX3, " Alpha Draw Source: %d\n", BIT(data32, 7));
+ LOGMASKED(LOG_REX3, " Stop On X: %d\n", BIT(data32, 8));
+ LOGMASKED(LOG_REX3, " Stop On Y: %d\n", BIT(data32, 9));
+ LOGMASKED(LOG_REX3, " Skip Start Point: %d\n", BIT(data32, 10));
+ LOGMASKED(LOG_REX3, " Skip End Point: %d\n", BIT(data32, 11));
+ LOGMASKED(LOG_REX3, " Enable Patterning: %d\n", BIT(data32, 12));
+ LOGMASKED(LOG_REX3, " Enable Stippling: %d\n", BIT(data32, 13));
+ LOGMASKED(LOG_REX3, " Stipple Advance: %d\n", BIT(data32, 14));
+ LOGMASKED(LOG_REX3, " Limit Draw To 32px: %d\n", BIT(data32, 15));
+ LOGMASKED(LOG_REX3, " Z Opaque Stipple %d\n", BIT(data32, 16));
+ LOGMASKED(LOG_REX3, " LS Opaque Stipple: %d\n", BIT(data32, 17));
+ LOGMASKED(LOG_REX3, " Enable Lin. Shade: %d\n", BIT(data32, 18));
+ LOGMASKED(LOG_REX3, " Left-Right Only: %d\n", BIT(data32, 19));
+ LOGMASKED(LOG_REX3, " Offset by XYMove: %d\n", BIT(data32, 20));
+ LOGMASKED(LOG_REX3, " Enable CI Clamping: %d\n", BIT(data32, 21));
+ LOGMASKED(LOG_REX3, " Enable End Filter: %d\n", BIT(data32, 22));
+ LOGMASKED(LOG_REX3, " Enable Y+2 Stride: %d\n", BIT(data32, 23));
+ m_rex3.m_draw_mode0 = data32;
}
- LOGMASKED(LOG_REX3, " DBuf Source Buffer: %d\n", BIT(data, 5));
- LOGMASKED(LOG_REX3, " GL Y Coordinates: %d\n", BIT(data, 6));
- LOGMASKED(LOG_REX3, " Enable Pxl Packing: %d\n", BIT(data, 7));
- switch ((data & 0x00000300) >> 8)
+ break;
+ case 0x0008/8:
+ if (ACCESSING_BITS_32_63)
{
- case 0x00:
- LOGMASKED(LOG_REX3, " HOSTRW Depth: 4 bits\n");
- break;
- case 0x01:
- LOGMASKED(LOG_REX3, " HOSTRW Depth: 8 bits\n");
- break;
- case 0x02:
- LOGMASKED(LOG_REX3, " HOSTRW Depth: 12 bits\n");
- break;
- case 0x03:
- LOGMASKED(LOG_REX3, " HOSTRW Depth: 32 bits\n");
- break;
+ LOGMASKED(LOG_REX3, "REX3 Line Stipple Mode Write: %08x\n", (uint32_t)(data >> 32));
+ m_rex3.m_ls_mode = (uint32_t)(data >> 32) & 0xfffffff;
}
- LOGMASKED(LOG_REX3, " DWord Transfers: %d\n", BIT(data, 10));
- LOGMASKED(LOG_REX3, " Swap Endianness: %d\n", BIT(data, 11));
- LOGMASKED(LOG_REX3, " Compare Src > Dest: %d\n", BIT(data, 12));
- LOGMASKED(LOG_REX3, " Compare Src = Dest: %d\n", BIT(data, 13));
- LOGMASKED(LOG_REX3, " Compare Src < Dest: %d\n", BIT(data, 14));
- LOGMASKED(LOG_REX3, " RGB Mode Select: %d\n", BIT(data, 15));
- LOGMASKED(LOG_REX3, " Enable Dithering: %d\n", BIT(data, 16));
- LOGMASKED(LOG_REX3, " Enable Fast Clear: %d\n", BIT(data, 17));
- LOGMASKED(LOG_REX3, " Enable Blending: %d\n", BIT(data, 18));
- switch ((data & 0x00380000) >> 19)
+ if (ACCESSING_BITS_0_31)
{
- case 0x00:
- LOGMASKED(LOG_REX3, " Src Blend Factor: 0\n");
- break;
- case 0x01:
- LOGMASKED(LOG_REX3, " Src Blend Factor: 1\n");
- break;
- case 0x02:
- LOGMASKED(LOG_REX3, " Src Blend Factor: Normalized Dest (or COLORBACK)\n");
- break;
- case 0x03:
- LOGMASKED(LOG_REX3, " Src Blend Factor: 1 - Normalized Dest (or COLORBACK)\n");
- break;
- case 0x04:
- LOGMASKED(LOG_REX3, " Src Blend Factor: Normalized Src\n");
- break;
- case 0x05:
- LOGMASKED(LOG_REX3, " Src Blend Factor: 1 - Normalized Src\n");
- break;
- default:
- LOGMASKED(LOG_REX3 | LOG_UNKNOWN, " Unknown Src Blend Factor: %02x\n", (data & 0x00380000) >> 19);
- break;
+ LOGMASKED(LOG_REX3, "REX3 Line Stipple Pattern Write: %08x\n", (uint32_t)data);
+ m_rex3.m_ls_pattern = (uint32_t)data;
}
- switch ((data & 0x01c00000) >> 22)
+ break;
+ case 0x0010/8:
+ if (ACCESSING_BITS_32_63)
{
- case 0x00:
- LOGMASKED(LOG_REX3, " Dest Blend Factor: 0\n");
- break;
- case 0x01:
- LOGMASKED(LOG_REX3, " Dest Blend Factor: 1\n");
- break;
- case 0x02:
- LOGMASKED(LOG_REX3, " Dest Blend Factor: Normalized Dest (or COLORBACK)\n");
- break;
- case 0x03:
- LOGMASKED(LOG_REX3, " Dest Blend Factor: 1 - Normalized Dest (or COLORBACK)\n");
- break;
- case 0x04:
- LOGMASKED(LOG_REX3, " Dest Blend Factor: Normalized Src\n");
- break;
- case 0x05:
- LOGMASKED(LOG_REX3, " Dest Blend Factor: 1 - Normalized Src\n");
- break;
- default:
- LOGMASKED(LOG_REX3 | LOG_UNKNOWN, " Unknown Src Blend Factor: %02x\n", (data & 0x00380000) >> 19);
- break;
+ LOGMASKED(LOG_REX3, "REX3 Line Stipple Pattern (Save) Write: %08x\n", (uint32_t)(data >> 32));
+ m_rex3.m_ls_pattern_saved = (uint32_t)(data >> 32);
}
- LOGMASKED(LOG_REX3, " COLORBACK Dest Blend: %d\n", BIT(data, 25));
- LOGMASKED(LOG_REX3, " Enable Pxl Prefetch: %d\n", BIT(data, 26));
- LOGMASKED(LOG_REX3, " SFACTOR Src Alpha: %d\n", BIT(data, 27));
- switch ((data & 0xf0000000) >> 28)
+ if (ACCESSING_BITS_0_31)
{
- case 0x00:
- LOGMASKED(LOG_REX3, " Logical Op. Type: 0\n");
- break;
- case 0x01:
- LOGMASKED(LOG_REX3, " Logical Op. Type: Src & Dst\n");
- break;
- case 0x02:
- LOGMASKED(LOG_REX3, " Logical Op. Type: Src & ~Dst\n");
- break;
- case 0x03:
- LOGMASKED(LOG_REX3, " Logical Op. Type: Src\n");
- break;
- case 0x04:
- LOGMASKED(LOG_REX3, " Logical Op. Type: ~Src & Dst\n");
- break;
- case 0x05:
- LOGMASKED(LOG_REX3, " Logical Op. Type: Dst\n");
- break;
- case 0x06:
- LOGMASKED(LOG_REX3, " Logical Op. Type: Src ^ Dst\n");
- break;
- case 0x07:
- LOGMASKED(LOG_REX3, " Logical Op. Type: Src | Dst\n");
- break;
- case 0x08:
- LOGMASKED(LOG_REX3, " Logical Op. Type: ~(Src | Dst)\n");
- break;
- case 0x09:
- LOGMASKED(LOG_REX3, " Logical Op. Type: ~(Src ^ Dst)\n");
- break;
- case 0x0a:
- LOGMASKED(LOG_REX3, " Logical Op. Type: ~Dst\n");
- break;
- case 0x0b:
- LOGMASKED(LOG_REX3, " Logical Op. Type: Src | ~Dst\n");
- break;
- case 0x0c:
- LOGMASKED(LOG_REX3, " Logical Op. Type: ~Src\n");
- break;
- case 0x0d:
- LOGMASKED(LOG_REX3, " Logical Op. Type: ~Src | Dst\n");
- break;
- case 0x0e:
- LOGMASKED(LOG_REX3, " Logical Op. Type: ~(Src & Dst)\n");
- break;
- case 0x0f:
- LOGMASKED(LOG_REX3, " Logical Op. Type: 1\n");
- break;
+ LOGMASKED(LOG_REX3, "REX3 Pattern Register Write: %08x\n", (uint32_t)data);
+ m_rex3.m_z_pattern = (uint32_t)data;
}
- m_rex3.m_draw_mode1 = data;
break;
- case 0x0004/4:
- LOGMASKED(LOG_REX3, "REX3 Draw Mode 0 Write: %08x\n", data);
- switch (data & 3)
+ case 0x0018/8:
+ if (ACCESSING_BITS_32_63)
{
- case 0x00:
- LOGMASKED(LOG_REX3, " Primitive Function: No Op\n");
- break;
- case 0x01:
- LOGMASKED(LOG_REX3, " Primitive Function: Read From FB\n");
- break;
- case 0x02:
- LOGMASKED(LOG_REX3, " Primitive Function: Draw To FB\n");
- break;
- case 0x03:
- LOGMASKED(LOG_REX3, " Primitive Function: Copy FB To FB\n");
- break;
+ LOGMASKED(LOG_REX3, "REX3 Opaque Pattern / Blendfunc Dest Color Write: %08x\n", (uint32_t)(data >> 32));
+ m_rex3.m_color_back = (uint32_t)(data >> 32);
}
- switch ((data & 0x0000001c) >> 2)
+ if (ACCESSING_BITS_0_31)
{
- case 0x00:
- LOGMASKED(LOG_REX3, " Addressing Mode: Span/Point\n");
- break;
- case 0x01:
- LOGMASKED(LOG_REX3, " Addressing Mode: Block\n");
- break;
- case 0x02:
- LOGMASKED(LOG_REX3, " Addressing Mode: Bresenham Line, Integer Endpoints\n");
- break;
- case 0x03:
- LOGMASKED(LOG_REX3, " Addressing Mode: Bresenham Line, Fractional Endpoints\n");
- break;
- case 0x04:
- LOGMASKED(LOG_REX3, " Addressing Mode: AA Bresenham Line\n");
- break;
- default:
- LOGMASKED(LOG_REX3 | LOG_UNKNOWN, " Unknown Addressing Mode: %02x\n", (data & 0x0000001c) >> 2);
- break;
+ LOGMASKED(LOG_REX3, "REX3 VRAM Fastclear Color Write: %08x\n", (uint32_t)data);
+ m_rex3.m_color_vram = (uint32_t)data;
}
- LOGMASKED(LOG_REX3, " Iterator Setup: %d\n", BIT(data, 5));
- LOGMASKED(LOG_REX3, " RGB/CI Draw Source: %d\n", BIT(data, 6));
- LOGMASKED(LOG_REX3, " Alpha Draw Source: %d\n", BIT(data, 7));
- LOGMASKED(LOG_REX3, " Stop On X: %d\n", BIT(data, 8));
- LOGMASKED(LOG_REX3, " Stop On Y: %d\n", BIT(data, 9));
- LOGMASKED(LOG_REX3, " Skip Start Point: %d\n", BIT(data, 10));
- LOGMASKED(LOG_REX3, " Skip End Point: %d\n", BIT(data, 11));
- LOGMASKED(LOG_REX3, " Enable Patterning: %d\n", BIT(data, 12));
- LOGMASKED(LOG_REX3, " Enable Stippling: %d\n", BIT(data, 13));
- LOGMASKED(LOG_REX3, " Stipple Advance: %d\n", BIT(data, 14));
- LOGMASKED(LOG_REX3, " Limit Draw To 32px: %d\n", BIT(data, 15));
- LOGMASKED(LOG_REX3, " Z Opaque Stipple %d\n", BIT(data, 16));
- LOGMASKED(LOG_REX3, " LS Opaque Stipple: %d\n", BIT(data, 17));
- LOGMASKED(LOG_REX3, " Enable Lin. Shade: %d\n", BIT(data, 18));
- LOGMASKED(LOG_REX3, " Left-Right Only: %d\n", BIT(data, 19));
- LOGMASKED(LOG_REX3, " Offset by XYMove: %d\n", BIT(data, 20));
- LOGMASKED(LOG_REX3, " Enable CI Clamping: %d\n", BIT(data, 21));
- LOGMASKED(LOG_REX3, " Enable End Filter: %d\n", BIT(data, 22));
- LOGMASKED(LOG_REX3, " Enable Y+2 Stride: %d\n", BIT(data, 23));
- m_rex3.m_draw_mode0 = data;
- break;
- case 0x0008/4:
- LOGMASKED(LOG_REX3, "REX3 Line Stipple Mode Write: %08x\n", data);
- m_rex3.m_ls_mode = data & 0xfffffff;
- break;
- case 0x000C/4:
- LOGMASKED(LOG_REX3, "REX3 Line Stipple Pattern Write: %08x\n", data);
- m_rex3.m_ls_pattern = data;
- break;
- case 0x0010/4:
- LOGMASKED(LOG_REX3, "REX3 Line Stipple Pattern (Save) Write: %08x\n", data);
- m_rex3.m_ls_pattern_saved = data;
- break;
- case 0x0014/4:
- LOGMASKED(LOG_REX3, "REX3 Pattern Register Write: %08x\n", data);
- m_rex3.m_z_pattern = data;
- if (offset & 0x00000200)
- {
- do_rex3_command();
- }
- break;
- case 0x0018/4:
- LOGMASKED(LOG_REX3, "REX3 Opaque Pattern / Blendfunc Dest Color Write: %08x\n", data);
- m_rex3.m_color_back = data;
- break;
- case 0x001c/4:
- LOGMASKED(LOG_REX3, "REX3 VRAM Fastclear Color Write: %08x\n", data);
- m_rex3.m_color_vram = data;
- break;
- case 0x0020/4:
- LOGMASKED(LOG_REX3, "REX3 AFUNCTION Reference Alpha Write: %08x\n", data);
- m_rex3.m_alpha_ref = (uint8_t)data;
- break;
- case 0x0024/4:
- LOGMASKED(LOG_REX3, "REX3 Stall GFIFO Write: %08x\n", data);
- break;
- case 0x0028/4:
- LOGMASKED(LOG_REX3, "REX3 Screenmask 0 X Min/Max Write: %08x\n", data);
- m_rex3.m_smask0_x = data;
- break;
- case 0x002c/4:
- LOGMASKED(LOG_REX3, "REX3 Screenmask 0 Y Min/Max Write: %08x\n", data);
- m_rex3.m_smask0_y = data;
- break;
- case 0x0030/4:
- LOGMASKED(LOG_REX3, "REX3 Line/Span Setup Write: %08x\n", data);
- m_rex3.m_setup = data;
- break;
- case 0x0034/4:
- LOGMASKED(LOG_REX3, "REX3 ZPattern Enable Write: %08x\n", data);
- m_rex3.m_step_z = data;
- break;
- case 0x0038/4:
- LOGMASKED(LOG_REX3, "REX3 Update LSPATTERN/LSRCOUNT\n");
- m_rex3.m_ls_pattern = m_rex3.m_ls_pattern_saved;
- break;
- case 0x003c/4:
- LOGMASKED(LOG_REX3, "REX3 Update LSPATSAVE/LSRCNTSAVE\n");
- m_rex3.m_ls_pattern_saved = m_rex3.m_ls_pattern;
- break;
- case 0x0100/4:
- LOGMASKED(LOG_REX3, "REX3 XStart Write: %08x\n", data);
- m_rex3.m_x_start = data & (0x0000fffff << 7);
- break;
- case 0x0104/4:
- LOGMASKED(LOG_REX3, "REX3 YStart Write: %08x\n", data);
- m_rex3.m_y_start = data & (0x0000fffff << 7);
- break;
- case 0x0108/4:
- LOGMASKED(LOG_REX3, "REX3 XEnd Write: %08x\n", data);
- m_rex3.m_x_end = data & (0x0000fffff << 7);
- break;
- case 0x010c/4:
- LOGMASKED(LOG_REX3, "REX3 YEnd Write: %08x\n", data);
- m_rex3.m_y_end = data & (0x0000fffff << 7);
- break;
- case 0x0110/4:
- LOGMASKED(LOG_REX3, "REX3 XSave Write: %08x\n", data);
- m_rex3.m_x_save = (uint16_t)data;
- m_rex3.m_x_start_i = (uint16_t)m_rex3.m_x_save;
- break;
- case 0x0114/4:
- LOGMASKED(LOG_REX3, "REX3 XYMove Write: %08x\n", data);
- m_rex3.m_xy_move = data;
- if (offset & 0x00000200)
- {
- do_rex3_command();
- }
- break;
- case 0x0118/4:
- LOGMASKED(LOG_REX3, "REX3 Bresenham D Write: %08x\n", data);
- m_rex3.m_bres_d = data & 0x7ffffff;
- break;
- case 0x011c/4:
- LOGMASKED(LOG_REX3, "REX3 Bresenham S1 Write: %08x\n", data);
- m_rex3.m_bres_s1 = data & 0x1ffff;
- break;
- case 0x0120/4:
- LOGMASKED(LOG_REX3, "REX3 Bresenham Octant & Incr1 Write: %08x\n", data);
- m_rex3.m_bres_octant_inc1 = data & 0x70fffff;
- break;
- case 0x0124/4:
- LOGMASKED(LOG_REX3, "REX3 Bresenham Octant Rounding Mode & Incr2 Write: %08x\n", data);
- m_rex3.m_bres_round_inc2 = data & 0xff1fffff;
break;
- case 0x0128/4:
- LOGMASKED(LOG_REX3, "REX3 Bresenham E1 Write: %08x\n", data);
- m_rex3.m_bres_e1 = (uint16_t)data;
- break;
- case 0x012c/4:
- LOGMASKED(LOG_REX3, "REX3 Bresenham S2 Write: %08x\n", data);
- m_rex3.m_bres_s2 = data & 0x3ffffff;
+ case 0x0020/8:
+ if (ACCESSING_BITS_32_63)
+ {
+ LOGMASKED(LOG_REX3, "REX3 AFUNCTION Reference Alpha Write: %08x\n", (uint32_t)(data >> 32));
+ m_rex3.m_alpha_ref = (uint8_t)(data >> 32);
+ }
+ if (ACCESSING_BITS_0_31)
+ {
+ LOGMASKED(LOG_REX3, "REX3 Stall GFIFO Write: %08x\n", data);
+ break;
+ }
break;
- case 0x0130/4:
- LOGMASKED(LOG_REX3, "REX3 AA Line Weight Table 1/2 Write: %08x\n", data);
- m_rex3.m_a_weight0 = data;
+ case 0x0028/8:
+ if (ACCESSING_BITS_32_63)
+ {
+ LOGMASKED(LOG_REX3, "REX3 Screenmask 0 X Min/Max Write: %08x\n", (uint32_t)(data >> 32));
+ m_rex3.m_smask_x[0] = (uint32_t)(data >> 32);
+ }
+ if (ACCESSING_BITS_0_31)
+ {
+ LOGMASKED(LOG_REX3, "REX3 Screenmask 0 Y Min/Max Write: %08x\n", (uint32_t)data);
+ m_rex3.m_smask_y[0] = (uint32_t)data;
+ }
break;
- case 0x0134/4:
- LOGMASKED(LOG_REX3, "REX3 AA Line Weight Table 2/2 Write: %08x\n", data);
- m_rex3.m_a_weight1 = data;
+ case 0x0030/8:
+ if (ACCESSING_BITS_32_63)
+ {
+ LOGMASKED(LOG_REX3, "REX3 Line/Span Setup Write: %08x\n", (uint32_t)(data >> 32));
+ m_rex3.m_setup = (uint32_t)(data >> 32);
+ }
+ if (ACCESSING_BITS_0_31)
+ {
+ LOGMASKED(LOG_REX3, "REX3 ZPattern Enable Write\n");
+ m_rex3.m_step_z = 1;
+ }
break;
- case 0x0138/4:
- LOGMASKED(LOG_REX3, "REX3 GL XStart Write: %08x\n", data);
- m_rex3.m_x_start_f = data & 0x7fff80;
+ case 0x0038/8:
+ if (ACCESSING_BITS_32_63)
+ {
+ LOGMASKED(LOG_REX3, "REX3 Update LSPATTERN/LSRCOUNT\n");
+ m_rex3.m_ls_pattern = m_rex3.m_ls_pattern_saved;
+ }
+ if (ACCESSING_BITS_0_31)
+ {
+ LOGMASKED(LOG_REX3, "REX3 Update LSPATSAVE/LSRCNTSAVE\n");
+ m_rex3.m_ls_pattern_saved = m_rex3.m_ls_pattern;
+ }
break;
- case 0x013c/4:
- LOGMASKED(LOG_REX3, "REX3 GL YStart Write: %08x\n", data);
- m_rex3.m_y_start_f = data & 0x7fff80;
+ case 0x0100/8:
+ if (ACCESSING_BITS_32_63)
+ {
+ LOGMASKED(LOG_REX3, "REX3 XStart Write: %08x\n", (uint32_t)(data >> 32));
+ write_x_start((int32_t)(data >> 32));
+ m_rex3.m_x_save = m_rex3.m_x_start_i;
+ }
+ if (ACCESSING_BITS_0_31)
+ {
+ LOGMASKED(LOG_REX3, "REX3 YStart Write: %08x\n", (uint32_t)data);
+ write_y_start((int32_t)data);
+ }
break;
- case 0x0140/4:
- LOGMASKED(LOG_REX3, "REX3 GL XEnd Write: %08x\n", data);
- m_rex3.m_x_end_f = data & 0x7fff80;
+ case 0x0108/8:
+ if (ACCESSING_BITS_32_63)
+ {
+ LOGMASKED(LOG_REX3, "REX3 XEnd Write: %08x\n", (uint32_t)(data >> 32));
+ write_x_end((int32_t)(data >> 32));
+ }
+ if (ACCESSING_BITS_0_31)
+ {
+ LOGMASKED(LOG_REX3, "REX3 YEnd Write: %08x\n", (uint32_t)data);
+ write_y_end((int32_t)data);
+ }
break;
- case 0x0144/4:
- LOGMASKED(LOG_REX3, "REX3 GL YEnd Write: %08x\n", data);
- m_rex3.m_y_end_f = data & 0x7fff80;
- break;
- case 0x0148/4:
- LOGMASKED(LOG_REX3, "REX3 XStart (integer) Write: %08x\n", data);
- m_rex3.m_x_start_i = (uint16_t)data;
- m_rex3.m_x_save = m_rex3.m_x_start_i;
- m_rex3.m_x_start = ((m_rex3.m_x_start_i & 0x0000ffff) << 11);
- break;
- case 0x014c/4:
- LOGMASKED(LOG_REX3, "REX3 GL XEnd (copy) Write: %08x\n", data);
- m_rex3.m_x_end_f = data & ( 0x0000ffff << 7 );
- break;
- case 0x0150/4:
- LOGMASKED(LOG_REX3, "REX3 XYStart (integer) Write: %08x\n", data);
- m_rex3.m_xy_start_i = data;
- m_rex3.m_x_start_i = data >> 16;
- m_rex3.m_x_save = m_rex3.m_x_start_i;
- m_rex3.m_x_start = ((m_rex3.m_xy_start_i & 0xffff0000) >> 5);
- m_rex3.m_y_start = ((m_rex3.m_xy_start_i & 0x0000ffff) << 11);
- break;
- case 0x0154/4:
- LOGMASKED(LOG_REX3, "REX3 XYEnd (integer) Write: %08x\n", data);
- m_rex3.m_xy_end_i = data;
- m_rex3.m_x_end = ((m_rex3.m_xy_end_i & 0xffff0000) >> 5);
- m_rex3.m_y_end = ((m_rex3.m_xy_end_i & 0x0000ffff) << 11);
- if (offset & 0x00000200)
- {
- do_rex3_command();
- }
- break;
- case 0x0158/4:
- LOGMASKED(LOG_REX3, "REX3 XStartEnd (integer) Write: %08x\n", data);
- m_rex3.m_x_start_end_i = data;
- m_rex3.m_xy_end_i = (uint16_t)m_rex3.m_xy_end_i | ((m_rex3.m_x_start_end_i & 0x0000ffff) << 16);
- m_rex3.m_xy_start_i = (uint16_t)m_rex3.m_xy_start_i | ( m_rex3.m_x_start_end_i & 0xffff0000);
- m_rex3.m_x_save = m_rex3.m_x_start_i;
- m_rex3.m_x_start = ((m_rex3.m_x_start_end_i & 0xffff0000) >> 5);
- m_rex3.m_x_end = ((m_rex3.m_x_start_end_i & 0x0000ffff) << 11);
- break;
- case 0x0200/4:
- LOGMASKED(LOG_REX3, "REX3 Red/CI Full State Write: %08x\n", data);
- m_rex3.m_color_red = data & 0xffffff;
- break;
- case 0x0204/4:
- LOGMASKED(LOG_REX3, "REX3 Alpha Full State Write: %08x\n", data);
- m_rex3.m_color_alpha = data & 0xfffff;
- break;
- case 0x0208/4:
- LOGMASKED(LOG_REX3, "REX3 Green Full State Write: %08x\n", data);
- m_rex3.m_color_green = data & 0xfffff;
+ case 0x0110/8:
+ if (ACCESSING_BITS_32_63)
+ {
+ LOGMASKED(LOG_REX3, "REX3 XSave Write: %08x\n", (uint32_t)(data >> 32));
+ m_rex3.m_x_save = (int16_t)(data >> 32);
+ }
+ if (ACCESSING_BITS_0_31)
+ {
+ LOGMASKED(LOG_REX3, "REX3 XYMove Write: %08x\n", (uint32_t)data);
+ m_rex3.m_xy_move = (uint32_t)data;
+ m_rex3.m_x_move = (int16_t)(m_rex3.m_xy_move >> 16);
+ m_rex3.m_y_move = (int16_t)m_rex3.m_xy_move;
+ }
break;
- case 0x020c/4:
- LOGMASKED(LOG_REX3, "REX3 Blue Full State Write: %08x\n", data);
- m_rex3.m_color_blue = data & 0xfffff;
- break;
- case 0x0210/4:
- {
- LOGMASKED(LOG_REX3, "REX3 Red/CI Slope Write: %08x\n", data);
- data &= 0x807fffff;
- uint32_t temp = 0;
- if (BIT(data, 31))
+ case 0x0118/8:
+ if (ACCESSING_BITS_32_63)
{
- temp = 0x00800000 - (data & 0x7fffff);
- temp |= 0x00800000;
+ LOGMASKED(LOG_REX3, "REX3 Bresenham D Write: %08x\n", (uint32_t)(data >> 32));
+ m_rex3.m_bres_d = (uint32_t)(data >> 32) & 0x7ffffff;
}
- else
+ if (ACCESSING_BITS_0_31)
{
- temp = data & 0x7fffff;
+ LOGMASKED(LOG_REX3, "REX3 Bresenham S1 Write: %08x\n", (uint32_t)data);
+ m_rex3.m_bres_s1 = (uint32_t)data & 0x1ffff;
}
- m_rex3.m_slope_red = temp;
break;
- }
- case 0x0214/4:
- {
- LOGMASKED(LOG_REX3, "REX3 Alpha Slope Write: %08x\n", data);
- data &= 0x8007ffff;
- uint32_t temp = 0;
- if (BIT(data, 31))
+ case 0x0120/8:
+ if (ACCESSING_BITS_32_63)
{
- temp = 0x00080000 - (data & 0x7ffff);
- temp |= 0x00080000;
+ LOGMASKED(LOG_REX3, "REX3 Bresenham Octant & Incr1 Write: %08x\n", (uint32_t)(data >> 32));
+ m_rex3.m_bres_octant_inc1 = (uint32_t)(data >> 32) & 0x70fffff;
}
- else
+ if (ACCESSING_BITS_0_31)
{
- temp = data & 0x7ffff;
+ LOGMASKED(LOG_REX3, "REX3 Bresenham Octant Rounding Mode & Incr2 Write: %08x\n", (uint32_t)data);
+ m_rex3.m_bres_round_inc2 = data & 0xff1fffff;
}
- m_rex3.m_slope_alpha = temp;
break;
- }
- case 0x0218/4:
- {
- LOGMASKED(LOG_REX3, "REX3 Green Slope Write: %08x\n", data);
- data &= 0x8007ffff;
- uint32_t temp = 0;
- if (BIT(data, 31))
+ case 0x0128/8:
+ if (ACCESSING_BITS_32_63)
{
- temp = 0x00080000 - (data & 0x7ffff);
- temp |= 0x00080000;
+ LOGMASKED(LOG_REX3, "REX3 Bresenham E1 Write: %08x\n", (uint32_t)(data >> 32));
+ m_rex3.m_bres_e1 = (uint16_t)(data >> 32);
}
- else
+ if (ACCESSING_BITS_0_31)
{
- temp = data & 0x7ffff;
+ LOGMASKED(LOG_REX3, "REX3 Bresenham S2 Write: %08x\n", (uint32_t)data);
+ m_rex3.m_bres_s2 = (uint32_t)data & 0x3ffffff;
}
- m_rex3.m_slope_green = temp;
break;
- }
- case 0x021c/4:
- {
- LOGMASKED(LOG_REX3, "REX3 Blue Slope Write: %08x\n", data);
- data &= 0x8007ffff;
- uint32_t temp = 0;
- if (BIT(data, 31))
+ case 0x0130/8:
+ if (ACCESSING_BITS_32_63)
{
- temp = 0x00080000 - (data & 0x7ffff);
- temp |= 0x00080000;
+ LOGMASKED(LOG_REX3, "REX3 AA Line Weight Table 1/2 Write: %08x\n", (uint32_t)(data >> 32));
+ m_rex3.m_a_weight0 = (uint32_t)(data >> 32);
}
- else
+ if (ACCESSING_BITS_0_31)
{
- temp = data & 0x7ffff;
+ LOGMASKED(LOG_REX3, "REX3 AA Line Weight Table 2/2 Write: %08x\n", (uint32_t)data);
+ m_rex3.m_a_weight1 = (uint32_t)data;
}
- m_rex3.m_slope_blue = temp;
break;
- }
- case 0x0220/4:
- LOGMASKED(LOG_REX3, "REX3 Write Mask Write: %08x\n", data);
- m_rex3.m_write_mask = data & 0xffffff;
+ case 0x0138/8:
+ if (ACCESSING_BITS_32_63)
+ {
+ LOGMASKED(LOG_REX3, "REX3 GL XStart Write: %08x\n", (uint32_t)(data >> 32));
+ write_x_start((int32_t)(data >> 32) & 0x007fff80);
+ m_rex3.m_x_save = m_rex3.m_x_start_i;
+ }
+ if (ACCESSING_BITS_0_31)
+ {
+ LOGMASKED(LOG_REX3, "REX3 GL YStart Write: %08x\n", (uint32_t)data);
+ write_y_start((int32_t)data & 0x007fff80);
+ }
break;
- case 0x0224/4:
- LOGMASKED(LOG_REX3, "REX3 Packed Color Fractions Write: %08x\n", data);
- m_rex3.m_zero_fract = data;
+ case 0x0140/8:
+ if (ACCESSING_BITS_32_63)
+ {
+ LOGMASKED(LOG_REX3, "REX3 GL XEnd Write: %08x\n", (uint32_t)(data >> 32));
+ write_x_end((int32_t)(data >> 32) & 0x007fff80);
+ }
+ if (ACCESSING_BITS_0_31)
+ {
+ LOGMASKED(LOG_REX3, "REX3 GL YEnd Write: %08x\n", (uint32_t)data);
+ write_y_end((int32_t)data & 0x007fff80);
+ }
break;
- case 0x0228/4:
- LOGMASKED(LOG_REX3, "REX3 Color Index Zeros Overflow Write: %08x\n", data);
- m_rex3.m_zero_overflow = data;
+ case 0x0148/8:
+ if (ACCESSING_BITS_32_63)
+ {
+ LOGMASKED(LOG_REX3, "REX3 XStart (integer) Write: %08x\n", (uint32_t)(data >> 32));
+ write_x_start(((int32_t)(int16_t)(data >> 32)) << 11);
+ m_rex3.m_x_save = m_rex3.m_x_start_i;
+ }
+ if (ACCESSING_BITS_0_31)
+ {
+ LOGMASKED(LOG_REX3, "REX3 GL XEnd (copy) Write: %08x\n", (uint32_t)data);
+ write_x_end((int32_t)data & 0x007fff80);
+ }
break;
- case 0x022c/4:
- LOGMASKED(LOG_REX3, "REX3 Red/CI Slope (copy) Write: %08x\n", data);
- m_rex3.m_slope_red = data;
+ case 0x0150/8:
+ if (ACCESSING_BITS_32_63)
+ {
+ const uint32_t data32 = (uint32_t)(data >> 32);
+ LOGMASKED(LOG_REX3, "REX3 XYStart (integer) Write: %08x\n", data32);
+ write_x_start(((int32_t)(int16_t)(data >> 48)) << 11);
+ write_y_start(((int32_t)(int16_t)(data >> 32)) << 11);
+ m_rex3.m_x_save = m_rex3.m_x_start_i;
+ }
+ if (ACCESSING_BITS_0_31)
+ {
+ LOGMASKED(LOG_REX3, "REX3 XYEnd (integer) Write: %08x\n", (uint32_t)data);
+ write_x_end(((int32_t)(int16_t)(data >> 16)) << 11);
+ write_y_end(((int32_t)(int16_t)(data >> 0)) << 11);
+ }
break;
- case 0x0230/4:
- //verboselog(machine(), 3, "REX3 Host Data Port MSW Write: %08x\n", data );
- m_rex3.m_host_dataport_msw = data;
- if (offset & 0x00000200)
+ case 0x0158/8:
+ if (ACCESSING_BITS_32_63)
{
- do_rex3_command();
+ const uint32_t data32 = (uint32_t)(data >> 32);
+ LOGMASKED(LOG_REX3, "REX3 XStartEnd (integer) Write: %08x\n", data32);
+ write_x_start(((int32_t)(int16_t)(data >> 48)) << 11);
+ write_x_end(((int32_t)(int16_t)(data >> 32)) << 11);
+ m_rex3.m_x_save = m_rex3.m_x_start_i;
}
break;
- case 0x0234/4:
- LOGMASKED(LOG_REX3, "REX3 Host Data Port LSW Write: %08x\n", data);
- m_rex3.m_host_dataport_lsw = data;
+ case 0x0200/8:
+ if (ACCESSING_BITS_32_63)
+ {
+ LOGMASKED(LOG_REX3, "REX3 Red/CI Full State Write: %08x\n", (uint32_t)(data >> 32));
+ m_rex3.m_color_red = (int32_t)((data >> 32) & 0xffffff);
+ m_rex3.m_color_i = (uint32_t)(m_rex3.m_color_red >> 11) & 0x000000ff;
+ }
+ if (ACCESSING_BITS_0_31)
+ {
+ LOGMASKED(LOG_REX3, "REX3 Alpha Full State Write: %08x\n", (uint32_t)data);
+ m_rex3.m_color_alpha = (int32_t)(data & 0xfffff);
+ }
break;
- case 0x0238/4:
- LOGMASKED(LOG_REX3, "REX3 Display Control Bus Mode Write: %08x\n", data);
- switch (data & 3)
+ case 0x0208/8:
+ if (ACCESSING_BITS_32_63)
{
- case 0x00:
- LOGMASKED(LOG_REX3, " Transfer Width: 4 bytes\n");
- m_rex3.m_xfer_width = 4;
- break;
- case 0x01:
- LOGMASKED(LOG_REX3, " Transfer Width: 1 bytes\n");
- m_rex3.m_xfer_width = 1;
- break;
- case 0x02:
- LOGMASKED(LOG_REX3, " Transfer Width: 2 bytes\n");
- m_rex3.m_xfer_width = 2;
- break;
- case 0x03:
- LOGMASKED(LOG_REX3, " Transfer Width: 3 bytes\n");
- m_rex3.m_xfer_width = 3;
- break;
+ LOGMASKED(LOG_REX3, "REX3 Green Full State Write: %08x\n", (uint32_t)(data >> 32));
+ m_rex3.m_color_green = (int32_t)((data >> 32) & 0xfffff);
}
- LOGMASKED(LOG_REX3, " DCB Reg Select Adr: %d\n", (data & 0x00000070 ) >> 4);
- LOGMASKED(LOG_REX3, " DCB Slave Address: %d\n", (data & 0x00000780 ) >> 7);
- LOGMASKED(LOG_REX3, " Use Sync XFer ACK: %d\n", (data & 0x00000800 ) >> 11);
- LOGMASKED(LOG_REX3, " Use Async XFer ACK: %d\n", (data & 0x00001000 ) >> 12);
- LOGMASKED(LOG_REX3, " GIO CLK Cycle Width: %d\n", (data & 0x0003e000 ) >> 13);
- LOGMASKED(LOG_REX3, " GIO CLK Cycle Hold: %d\n", (data & 0x007c0000 ) >> 18);
- LOGMASKED(LOG_REX3, " GIO CLK Cycle Setup: %d\n", (data & 0x0f800000 ) >> 23);
- LOGMASKED(LOG_REX3, " Swap Byte Ordering: %d\n", (data & 0x10000000 ) >> 28);
- m_rex3.m_dcb_reg_select = (data & 0x00000070) >> 4;
- m_rex3.m_dcb_slave_select = (data & 0x00000780) >> 7;
- m_rex3.m_dcb_mode = data & 0x1fffffff;
- break;
- case 0x0240/4:
- m_rex3.m_dcb_data_msw = data;
- switch (m_rex3.m_dcb_slave_select)
+ if (ACCESSING_BITS_0_31)
{
- case 0x00:
- vc2_w(space, 0, data, mem_mask);
- break;
- case 0x01:
- cmap0_w(space, 0, data, mem_mask);
- break;
- case 0x04:
- xmap0_w(space, 0, data, mem_mask);
- xmap1_w(space, 0, data, mem_mask);
- break;
- case 0x05:
- xmap0_w(space, 0, data, mem_mask);
- break;
- case 0x06:
- xmap1_w(space, 0, data, mem_mask);
- break;
- default:
- LOGMASKED(LOG_REX3 | LOG_UNKNOWN, "REX3 Display Control Bus Data MSW Write: %08x\n", data);
- break;
+ LOGMASKED(LOG_REX3, "REX3 Blue Full State Write: %08x\n", (uint32_t)data);
+ m_rex3.m_color_blue = (int32_t)(data & 0xfffff);
}
break;
- case 0x0244/4:
- LOGMASKED(LOG_REX3, "REX3 Display Control Bus Data LSW Write: %08x\n", data);
- m_rex3.m_dcb_data_lsw = data;
+ case 0x0210/8:
+ {
+ if (ACCESSING_BITS_32_63)
+ {
+ uint32_t data32 = (uint32_t)(data >> 32);
+ LOGMASKED(LOG_REX3, "REX3 Red/CI Slope Write: %08x\n", data32);
+ data32 &= 0x807fffff;
+ int32_t temp = 0;
+ if (BIT(data32, 31))
+ {
+ temp = 0x00800000 - (data32 & 0x7fffff);
+ temp |= 0x00800000;
+ }
+ else
+ {
+ temp = data32 & 0x7fffff;
+ }
+ m_rex3.m_slope_red = temp;
+ }
+ if (ACCESSING_BITS_0_31)
+ {
+ LOGMASKED(LOG_REX3, "REX3 Alpha Slope Write: %08x\n", (uint32_t)data);
+ data &= 0x8007ffff;
+ int32_t temp = 0;
+ if (BIT(data, 31))
+ {
+ temp = 0x00080000 - (data & 0x7ffff);
+ temp |= 0x00080000;
+ }
+ else
+ {
+ temp = data & 0x7ffff;
+ }
+ m_rex3.m_slope_alpha = temp;
+ }
break;
- case 0x1300/4:
- LOGMASKED(LOG_REX3, "REX3 Screenmask 1 X Min/Max Write: %08x\n", data);
- m_rex3.m_s_mask1_x = data;
+ }
+ case 0x0218/8:
+ {
+ if (ACCESSING_BITS_32_63)
+ {
+ uint32_t data32 = (uint32_t)(data >> 32);
+ LOGMASKED(LOG_REX3, "REX3 Green Slope Write: %08x\n", data32);
+ data32 &= 0x8007ffff;
+ int32_t temp = 0;
+ if (BIT(data32, 31))
+ {
+ temp = 0x00080000 - (data32 & 0x7ffff);
+ temp |= 0x00080000;
+ }
+ else
+ {
+ temp = data32 & 0x7ffff;
+ }
+ m_rex3.m_slope_green = temp;
+ }
+ if (ACCESSING_BITS_0_31)
+ {
+ LOGMASKED(LOG_REX3, "REX3 Blue Slope Write: %08x\n", (uint32_t)data);
+ data &= 0x8007ffff;
+ int32_t temp = 0;
+ if (BIT(data, 31))
+ {
+ temp = 0x00080000 - (data & 0x7ffff);
+ temp |= 0x00080000;
+ }
+ else
+ {
+ temp = data & 0x7ffff;
+ }
+ m_rex3.m_slope_blue = temp;
+ }
break;
- case 0x1304/4:
- LOGMASKED(LOG_REX3, "REX3 Screenmask 1 Y Min/Max Write: %08x\n", data);
- m_rex3.m_s_mask1_y = data;
+ }
+ case 0x0220/8:
+ if (ACCESSING_BITS_32_63)
+ {
+ const uint32_t data32 = (uint32_t)(data >> 32);
+ LOGMASKED(LOG_REX3, "REX3 Write Mask Write: %08x\n", data32);
+ m_rex3.m_write_mask = data32 & 0xffffff;
+ }
+ if (ACCESSING_BITS_0_31)
+ {
+ LOGMASKED(LOG_REX3, "REX3 Packed Color Fractions Write: %08x\n", (uint32_t)data);
+ m_rex3.m_color_i = (uint32_t)data;
+ m_rex3.m_color_red = m_rex3.m_color_i << 11;
+ }
break;
- case 0x1308/4:
- LOGMASKED(LOG_REX3, "REX3 Screenmask 2 X Min/Max Write: %08x\n", data);
- m_rex3.m_s_mask2_x = data;
+ case 0x0228/8:
+ if (ACCESSING_BITS_32_63)
+ {
+ LOGMASKED(LOG_REX3, "REX3 Color Index Zeros Overflow Write: %08x\n", (uint32_t)(data >> 32));
+ m_rex3.m_zero_overflow = (uint32_t)(data >> 32);
+ }
+ if (ACCESSING_BITS_0_31)
+ {
+ LOGMASKED(LOG_REX3, "REX3 Red/CI Slope (copy) Write: %08x\n", (uint32_t)data);
+ m_rex3.m_slope_red = (uint32_t)data;
+ }
break;
- case 0x130c/4:
- LOGMASKED(LOG_REX3, "REX3 Screenmask 2 Y Min/Max Write: %08x\n", data);
- m_rex3.m_s_mask2_y = data;
+ case 0x0230/8:
+ LOGMASKED(LOG_REX3, "REX3 Host Data Port Write: %08x%08x & %08x%08x\n", (uint32_t)(data >> 32), (uint32_t)data, (uint64_t)(mem_mask >> 32), (uint32_t)mem_mask);
+ COMBINE_DATA(&m_rex3.m_host_dataport);
break;
- case 0x1310/4:
- LOGMASKED(LOG_REX3, "REX3 Screenmask 3 X Min/Max Write: %08x\n", data);
- m_rex3.m_s_mask3_x = data;
+ case 0x0238/8:
+ if (ACCESSING_BITS_32_63)
+ {
+ data >>= 32;
+ LOGMASKED(LOG_REX3, "REX3 Display Control Bus Mode Write: %08x\n", (uint32_t)data);
+ switch (data & 3)
+ {
+ case 0x00:
+ LOGMASKED(LOG_REX3, " Transfer Width: 4 bytes\n");
+ m_rex3.m_xfer_width = 4;
+ break;
+ case 0x01:
+ LOGMASKED(LOG_REX3, " Transfer Width: 1 bytes\n");
+ m_rex3.m_xfer_width = 1;
+ break;
+ case 0x02:
+ LOGMASKED(LOG_REX3, " Transfer Width: 2 bytes\n");
+ m_rex3.m_xfer_width = 2;
+ break;
+ case 0x03:
+ LOGMASKED(LOG_REX3, " Transfer Width: 3 bytes\n");
+ m_rex3.m_xfer_width = 3;
+ break;
+ }
+ LOGMASKED(LOG_REX3, " Enable Data Packing: %d\n", BIT(data, 2));
+ LOGMASKED(LOG_REX3, " Enable Auto-Increment: %d\n", BIT(data, 3));
+ LOGMASKED(LOG_REX3, " DCB Reg Select Adr: %d\n", (data & 0x00000070 ) >> 4);
+ LOGMASKED(LOG_REX3, " DCB Slave Address: %d\n", (data & 0x00000780 ) >> 7);
+ LOGMASKED(LOG_REX3, " Use Sync XFer ACK: %d\n", (data & 0x00000800 ) >> 11);
+ LOGMASKED(LOG_REX3, " Use Async XFer ACK: %d\n", (data & 0x00001000 ) >> 12);
+ LOGMASKED(LOG_REX3, " GIO CLK Cycle Width: %d\n", (data & 0x0003e000 ) >> 13);
+ LOGMASKED(LOG_REX3, " GIO CLK Cycle Hold: %d\n", (data & 0x007c0000 ) >> 18);
+ LOGMASKED(LOG_REX3, " GIO CLK Cycle Setup: %d\n", (data & 0x0f800000 ) >> 23);
+ LOGMASKED(LOG_REX3, " Swap Byte Ordering: %d\n", (data & 0x10000000 ) >> 28);
+ m_rex3.m_dcb_reg_select = (data & 0x00000070) >> 4;
+ m_rex3.m_dcb_slave_select = (data & 0x00000780) >> 7;
+ m_rex3.m_dcb_mode = data & 0x1fffffff;
+ }
break;
- case 0x1314/4:
- LOGMASKED(LOG_REX3, "REX3 Screenmask 3 Y Min/Max Write: %08x\n", data);
- m_rex3.m_s_mask3_y = data;
+ case 0x0240/8:
+ if (ACCESSING_BITS_32_63)
+ {
+ const uint32_t data32 = (uint32_t)(data >> 32);
+ m_rex3.m_dcb_data_msw = data32;
+ switch (m_rex3.m_dcb_slave_select)
+ {
+ case 0x00:
+ vc2_write(data32);
+ break;
+ case 0x01:
+ cmap0_write(data32);
+ break;
+ case 0x04:
+ xmap0_write(data32);
+ xmap1_write(data32);
+ break;
+ case 0x05:
+ xmap0_write(data32);
+ break;
+ case 0x06:
+ xmap1_write(data32);
+ break;
+ default:
+ LOGMASKED(LOG_REX3 | LOG_UNKNOWN, "REX3 Display Control Bus Data MSW Write: %08x\n", data32);
+ break;
+ }
+ if (BIT(m_rex3.m_dcb_mode, 3))
+ {
+ m_rex3.m_dcb_reg_select++;
+ m_rex3.m_dcb_reg_select &= 7;
+ }
+ }
+ if (ACCESSING_BITS_0_31)
+ {
+ LOGMASKED(LOG_REX3, "REX3 Display Control Bus Data LSW Write: %08x\n", (uint32_t)data);
+ m_rex3.m_dcb_data_lsw = (uint32_t)data;
+ }
break;
- case 0x1318/4:
- LOGMASKED(LOG_REX3, "REX3 Screenmask 4 X Min/Max Write: %08x\n", data);
- m_rex3.m_s_mask4_x = data;
+ case 0x1300/8:
+ if (ACCESSING_BITS_32_63)
+ {
+ LOGMASKED(LOG_REX3, "REX3 Screenmask 1 X Min/Max Write: %08x\n", (uint32_t)(data >> 32));
+ m_rex3.m_smask_x[1] = (uint32_t)(data >> 32);
+ }
+ if (ACCESSING_BITS_0_31)
+ {
+ LOGMASKED(LOG_REX3, "REX3 Screenmask 1 Y Min/Max Write: %08x\n", (uint32_t)data);
+ m_rex3.m_smask_y[1] = (uint32_t)data;
+ }
break;
- case 0x131c/4:
- LOGMASKED(LOG_REX3, "REX3 Screenmask 4 Y Min/Max Write: %08x\n", data);
- m_rex3.m_s_mask4_y = data;
+ case 0x1308/8:
+ if (ACCESSING_BITS_32_63)
+ {
+ LOGMASKED(LOG_REX3, "REX3 Screenmask 2 X Min/Max Write: %08x\n", (uint32_t)(data >> 32));
+ m_rex3.m_smask_x[2] = (uint32_t)(data >> 32);
+ }
+ if (ACCESSING_BITS_0_31)
+ {
+ LOGMASKED(LOG_REX3, "REX3 Screenmask 2 Y Min/Max Write: %08x\n", (uint32_t)data);
+ m_rex3.m_smask_y[2] = (uint32_t)data;
+ }
break;
- case 0x1320/4:
- LOGMASKED(LOG_REX3, "REX3 Top of Screen Scanline Write: %08x\n", data);
- m_rex3.m_top_scanline = data & 0x3ff;
+ case 0x1310/8:
+ if (ACCESSING_BITS_32_63)
+ {
+ LOGMASKED(LOG_REX3, "REX3 Screenmask 3 X Min/Max Write: %08x\n", (uint32_t)(data >> 32));
+ m_rex3.m_smask_x[3] = (uint32_t)(data >> 32);
+ }
+ if (ACCESSING_BITS_0_31)
+ {
+ LOGMASKED(LOG_REX3, "REX3 Screenmask 3 Y Min/Max Write: %08x\n", (uint32_t)data);
+ m_rex3.m_smask_y[3] = (uint32_t)data;
+ }
break;
- case 0x1324/4:
- LOGMASKED(LOG_REX3, "REX3 XY Window Write: %08x\n", data);
- m_rex3.m_xy_window = data;
+ case 0x1318/8:
+ if (ACCESSING_BITS_32_63)
+ {
+ LOGMASKED(LOG_REX3, "REX3 Screenmask 4 X Min/Max Write: %08x\n", (uint32_t)(data >> 32));
+ m_rex3.m_smask_x[4] = (uint32_t)(data >> 32);
+ }
+ if (ACCESSING_BITS_0_31)
+ {
+ LOGMASKED(LOG_REX3, "REX3 Screenmask 4 Y Min/Max Write: %08x\n", (uint32_t)data);
+ m_rex3.m_smask_y[4] = (uint32_t)data;
+ }
break;
- case 0x1328/4:
- LOGMASKED(LOG_REX3, "REX3 Clipping Mode Write: %08x\n", data);
- m_rex3.m_clip_mode = data & 0x1fff;
+ case 0x1320/8:
+ if (ACCESSING_BITS_32_63)
+ {
+ const uint32_t data32 = (uint32_t)(data >> 32);
+ LOGMASKED(LOG_REX3, "REX3 Top of Screen Scanline Write: %08x\n", data32);
+ m_rex3.m_top_scanline = data32 & 0x3ff;
+ }
+ if (ACCESSING_BITS_0_31)
+ {
+ LOGMASKED(LOG_REX3, "REX3 XY Window Write: %08x\n", (uint32_t)data);
+ m_rex3.m_xy_window = (uint32_t)data;
+ m_rex3.m_x_window = (int16_t)(m_rex3.m_xy_window >> 16);
+ m_rex3.m_y_window = (int16_t)m_rex3.m_xy_window;
+ }
break;
- case 0x132c/4:
- LOGMASKED(LOG_REX3, "Request GFIFO Stall\n");
+ case 0x1328/8:
+ if (ACCESSING_BITS_32_63)
+ {
+ const uint32_t data32 = (uint32_t)(data >> 32);
+ LOGMASKED(LOG_REX3, "REX3 Clipping Mode Write: %08x\n", data32);
+ m_rex3.m_clip_mode = data32 & 0x1fff;
+ }
+ if (ACCESSING_BITS_0_31)
+ {
+ LOGMASKED(LOG_REX3, "Request GFIFO Stall\n");
+ }
break;
- case 0x1330/4:
- LOGMASKED(LOG_REX3, "REX3 Config Write: %08x\n", data);
- m_rex3.m_config = data & 0x1fffff;
+ case 0x1330/8:
+ if (ACCESSING_BITS_32_63)
+ {
+ LOGMASKED(LOG_REX3, "REX3 Config Write: %08x\n", (uint32_t)(data >> 32));
+ m_rex3.m_config = (data >> 32) & 0x1fffff;
+ }
break;
- case 0x1340/4:
- LOGMASKED(LOG_REX3, "Reset DCB Bus and Flush BFIFO\n");
+ case 0x1340/8:
+ if (ACCESSING_BITS_32_63)
+ {
+ LOGMASKED(LOG_REX3, "Reset DCB Bus and Flush BFIFO\n");
+ }
break;
default:
LOGMASKED(LOG_REX3 | LOG_UNKNOWN, "Unknown REX3 Write: %08x (%08x): %08x\n", 0xbf0f0000 + (offset << 2), mem_mask, data);
break;
}
+
+ if (offset & 0x00000100)
+ {
+ do_rex3_command();
+ }
}
diff --git a/src/mame/video/newport.h b/src/mame/video/newport.h
index a5a3b4a0918..8e050eeff5b 100644
--- a/src/mame/video/newport.h
+++ b/src/mame/video/newport.h
@@ -9,9 +9,10 @@
#pragma once
-#include "cpu/mips/mips3.h"
#include "machine/hpc3.h"
+#define ENABLE_NEWVIEW_LOG (0)
+
class newport_video_device : public device_t
{
public:
@@ -25,8 +26,8 @@ public:
newport_video_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- DECLARE_READ32_MEMBER(rex3_r);
- DECLARE_WRITE32_MEMBER(rex3_w);
+ DECLARE_READ64_MEMBER(rex3_r);
+ DECLARE_WRITE64_MEMBER(rex3_w);
uint32_t screen_update(screen_device &device, bitmap_rgb32 &bitmap, const rectangle &cliprect);
@@ -93,6 +94,7 @@ private:
{
uint32_t m_draw_mode0;
uint32_t m_draw_mode1;
+ uint32_t m_write_width;
uint32_t m_ls_mode;
uint32_t m_ls_pattern;
uint32_t m_ls_pattern_saved;
@@ -100,16 +102,16 @@ private:
uint32_t m_color_back;
uint32_t m_color_vram;
uint32_t m_alpha_ref;
- uint32_t m_smask0_x;
- uint32_t m_smask0_y;
uint32_t m_setup;
uint32_t m_step_z;
- uint32_t m_x_start;
- uint32_t m_y_start;
- uint32_t m_x_end;
- uint32_t m_y_end;
- uint32_t m_x_save;
+ int32_t m_x_start;
+ int32_t m_y_start;
+ int32_t m_x_end;
+ int32_t m_y_end;
+ int16_t m_x_save;
uint32_t m_xy_move;
+ int16_t m_x_move;
+ int16_t m_y_move;
uint32_t m_bres_d;
uint32_t m_bres_s1;
uint32_t m_bres_octant_inc1;
@@ -122,75 +124,98 @@ private:
uint32_t m_y_start_f;
uint32_t m_x_end_f;
uint32_t m_y_end_f;
- uint32_t m_x_start_i;
+ int16_t m_x_start_i;
uint32_t m_xy_start_i;
+ int16_t m_y_start_i;
uint32_t m_xy_end_i;
+ int16_t m_x_end_i;
+ int16_t m_y_end_i;
uint32_t m_x_start_end_i;
- uint32_t m_color_red;
- uint32_t m_color_alpha;
- uint32_t m_color_green;
- uint32_t m_color_blue;
- uint32_t m_slope_red;
- uint32_t m_slope_alpha;
- uint32_t m_slope_green;
- uint32_t m_slope_blue;
+ int32_t m_color_red;
+ int32_t m_color_alpha;
+ int32_t m_color_green;
+ int32_t m_color_blue;
+ int32_t m_slope_red;
+ int32_t m_slope_alpha;
+ int32_t m_slope_green;
+ int32_t m_slope_blue;
uint32_t m_write_mask;
- uint32_t m_zero_fract;
+ uint32_t m_color_i;
uint32_t m_zero_overflow;
- uint32_t m_host_dataport_msw;
- uint32_t m_host_dataport_lsw;
+ uint64_t m_host_dataport;
uint32_t m_dcb_mode;
uint32_t m_dcb_reg_select;
uint32_t m_dcb_slave_select;
uint32_t m_dcb_data_msw;
uint32_t m_dcb_data_lsw;
- uint32_t m_s_mask1_x;
- uint32_t m_s_mask1_y;
- uint32_t m_s_mask2_x;
- uint32_t m_s_mask2_y;
- uint32_t m_s_mask3_x;
- uint32_t m_s_mask3_y;
- uint32_t m_s_mask4_x;
- uint32_t m_s_mask4_y;
+ uint32_t m_smask_x[5];
+ uint32_t m_smask_y[5];
uint32_t m_top_scanline;
uint32_t m_xy_window;
+ int16_t m_x_window;
+ int16_t m_y_window;
uint32_t m_clip_mode;
uint32_t m_config;
uint32_t m_status;
uint8_t m_xfer_width;
- uint32_t m_skipline_kludge;
+ bool m_read_active;
};
-
struct cmap_t
{
uint16_t m_palette_idx;
uint32_t m_palette[0x10000];
};
- uint32_t get_cursor_pixel(int x, int y);
+ uint8_t get_cursor_pixel(int x, int y);
// internal state
- DECLARE_READ32_MEMBER(cmap0_r);
- DECLARE_WRITE32_MEMBER(cmap0_w);
- DECLARE_READ32_MEMBER(cmap1_r);
- DECLARE_READ32_MEMBER(xmap0_r);
- DECLARE_WRITE32_MEMBER(xmap0_w);
- DECLARE_READ32_MEMBER(xmap1_r);
- DECLARE_WRITE32_MEMBER(xmap1_w);
- DECLARE_READ32_MEMBER(vc2_r);
- DECLARE_WRITE32_MEMBER(vc2_w);
+ uint32_t cmap0_read();
+ void cmap0_write(uint32_t data);
+ uint32_t cmap1_read();
+ uint32_t xmap0_read();
+ void xmap0_write(uint32_t data);
+ uint32_t xmap1_read();
+ void xmap1_write(uint32_t data);
+ uint32_t vc2_read();
+ void vc2_write(uint32_t data);
+
+ void write_x_start(int32_t val);
+ void write_y_start(int32_t val);
+ void write_x_end(int32_t val);
+ void write_y_end(int32_t val);
+
+ bool pixel_clip_pass(int16_t x, int16_t y);
+ void write_pixel(uint8_t color, bool shade);
+ void write_pixel(int16_t x, int16_t y, uint8_t color);
+ void store_pixel(uint8_t *dest_buf, uint8_t src);
+
+ void do_v_iline(uint8_t color, bool skip_last, bool shade);
+ void do_h_iline(uint8_t color, bool skip_last, bool shade);
+ void do_iline(uint8_t color, bool skip_last, bool shade);
+ uint8_t do_pixel_read();
+ uint64_t do_pixel_word_read();
void do_rex3_command();
- required_device<mips3_device> m_maincpu;
+ required_device<cpu_device> m_maincpu;
required_device<hpc3_device> m_hpc3;
vc2_t m_vc2;
xmap_t m_xmap0;
xmap_t m_xmap1;
rex3_t m_rex3;
- std::unique_ptr<uint32_t[]> m_base;
+ std::unique_ptr<uint8_t[]> m_rgbci;
+ std::unique_ptr<uint8_t[]> m_olay;
+ std::unique_ptr<uint8_t[]> m_pup;
+ std::unique_ptr<uint8_t[]> m_cid;
cmap_t m_cmap0;
+
+#if ENABLE_NEWVIEW_LOG
+ void start_logging();
+ void stop_logging();
+
+ FILE *m_newview_log;
+#endif
};
DECLARE_DEVICE_TYPE(NEWPORT_VIDEO, newport_video_device)
diff --git a/src/mame/video/nick.cpp b/src/mame/video/nick.cpp
index 79a8e4b4625..a70c2d12081 100644
--- a/src/mame/video/nick.cpp
+++ b/src/mame/video/nick.cpp
@@ -335,9 +335,9 @@ void nick_device::initialize_palette()
int ba = BIT(i, 2);
int bb = BIT(i, 5);
- uint8_t r = combine_3_weights(color_weights_rg, rc, rb, ra);
- uint8_t g = combine_3_weights(color_weights_rg, gc, gb, ga);
- uint8_t b = combine_2_weights(color_weights_b, bb, ba);
+ uint8_t r = combine_weights(color_weights_rg, rc, rb, ra);
+ uint8_t g = combine_weights(color_weights_rg, gc, gb, ga);
+ uint8_t b = combine_weights(color_weights_b, bb, ba);
m_palette[i] = rgb_t(r, g, b);
}
diff --git a/src/mame/video/nova2001.cpp b/src/mame/video/nova2001.cpp
index 8061ab4b477..748dff44a36 100644
--- a/src/mame/video/nova2001.cpp
+++ b/src/mame/video/nova2001.cpp
@@ -12,7 +12,7 @@
void nova2001_state::nova2001_palette(palette_device &palette) const
{
- uint8_t const *const color_prom = memregion("proms")->base();
+ u8 const *const color_prom = memregion("proms")->base();
/*
Color #1 is used for palette animation.
@@ -35,17 +35,17 @@ void nova2001_state::nova2001_palette(palette_device &palette) const
}
}
-rgb_t nova2001_state::BBGGRRII(uint32_t raw)
+rgb_t nova2001_state::BBGGRRII(u32 raw)
{
- uint8_t const i = raw & 3;
- uint8_t const r = ((raw >> 0) & 0x0c) | i;
- uint8_t const g = ((raw >> 2) & 0x0c) | i;
- uint8_t const b = ((raw >> 4) & 0x0c) | i;
+ u8 const i = raw & 3;
+ u8 const r = ((raw >> 0) & 0x0c) | i;
+ u8 const g = ((raw >> 2) & 0x0c) | i;
+ u8 const b = ((raw >> 4) & 0x0c) | i;
return rgb_t(r | (r << 4), g | (g << 4), b | (b << 4));
}
-WRITE8_MEMBER(nova2001_state::ninjakun_paletteram_w)
+WRITE8_MEMBER(nova2001_state::paletteram_w)
{
m_palette->write8(space, offset, data);
@@ -74,17 +74,17 @@ WRITE8_MEMBER(nova2001_state::ninjakun_paletteram_w)
TILE_GET_INFO_MEMBER(nova2001_state::nova2001_get_bg_tile_info)
{
- int code = m_bg_videoram[tile_index];
- int color = m_bg_videoram[tile_index + 0x400] & 0x0f;
+ int const code = m_bg_videoram[tile_index];
+ int const color = m_bg_videoram[tile_index + 0x400] & 0x0f;
SET_TILE_INFO_MEMBER(2, code, color, 0);
}
TILE_GET_INFO_MEMBER(nova2001_state::nova2001_get_fg_tile_info)
{
- int attr = m_fg_videoram[tile_index + 0x400];
- int code = m_fg_videoram[tile_index];
- int color = attr & 0x0f;
+ int const attr = m_fg_videoram[tile_index + 0x400];
+ int const code = m_fg_videoram[tile_index];
+ int const color = attr & 0x0f;
SET_TILE_INFO_MEMBER(1, code, color, 0);
@@ -93,18 +93,18 @@ TILE_GET_INFO_MEMBER(nova2001_state::nova2001_get_fg_tile_info)
TILE_GET_INFO_MEMBER(nova2001_state::ninjakun_get_bg_tile_info)
{
- int attr = m_bg_videoram[tile_index+0x400];
- int code = m_bg_videoram[tile_index] + ((attr & 0xc0) << 2);
- int color = attr & 0x0f;
+ int const attr = m_bg_videoram[tile_index + 0x400];
+ int const code = m_bg_videoram[tile_index] + ((attr & 0xc0) << 2);
+ int const color = attr & 0x0f;
SET_TILE_INFO_MEMBER(2, code, color, 0);
}
TILE_GET_INFO_MEMBER(nova2001_state::ninjakun_get_fg_tile_info)
{
- int attr = m_fg_videoram[tile_index+0x400];
- int code = m_fg_videoram[tile_index] + ((attr & 0x20) << 3);
- int color = attr & 0x0f;
+ int const attr = m_fg_videoram[tile_index + 0x400];
+ int const code = m_fg_videoram[tile_index] + ((attr & 0x20) << 3);
+ int const color = attr & 0x0f;
SET_TILE_INFO_MEMBER(1, code, color, 0);
@@ -113,9 +113,9 @@ TILE_GET_INFO_MEMBER(nova2001_state::ninjakun_get_fg_tile_info)
TILE_GET_INFO_MEMBER(nova2001_state::pkunwar_get_bg_tile_info)
{
- int attr = m_bg_videoram[tile_index + 0x400];
- int code = m_bg_videoram[tile_index] + ((attr & 0x07) << 8);
- int color = (attr & 0xf0) >> 4;
+ int const attr = m_bg_videoram[tile_index + 0x400];
+ int const code = m_bg_videoram[tile_index] + ((attr & 0x07) << 8);
+ int const color = (attr & 0xf0) >> 4;
SET_TILE_INFO_MEMBER(1, code, color, 0);
@@ -124,17 +124,17 @@ TILE_GET_INFO_MEMBER(nova2001_state::pkunwar_get_bg_tile_info)
TILE_GET_INFO_MEMBER(nova2001_state::raiders5_get_bg_tile_info)
{
- int attr = m_bg_videoram[tile_index+0x400];
- int code = m_bg_videoram[tile_index] + ((attr & 0x01) << 8);
- int color = (attr & 0xf0) >> 4;
+ int const attr = m_bg_videoram[tile_index + 0x400];
+ int const code = m_bg_videoram[tile_index] + ((attr & 0x01) << 8);
+ int const color = (attr & 0xf0) >> 4;
SET_TILE_INFO_MEMBER(2, code, color, 0);
}
TILE_GET_INFO_MEMBER(nova2001_state::raiders5_get_fg_tile_info)
{
- int code = m_fg_videoram[tile_index];
- int color = (m_fg_videoram[tile_index + 0x400] & 0xf0) >> 4;
+ int const code = m_fg_videoram[tile_index];
+ int const color = (m_fg_videoram[tile_index + 0x400] & 0xf0) >> 4;
SET_TILE_INFO_MEMBER(1, code, color, 0);
}
@@ -185,7 +185,7 @@ VIDEO_START_MEMBER(nova2001_state,raiders5)
*
*************************************/
-WRITE8_MEMBER(nova2001_state::nova2001_fg_videoram_w)
+WRITE8_MEMBER(nova2001_state::fg_videoram_w)
{
m_fg_videoram[offset] = data;
m_fg_tilemap->mark_tile_dirty(offset & 0x3ff);
@@ -199,8 +199,8 @@ WRITE8_MEMBER(nova2001_state::nova2001_bg_videoram_w)
WRITE8_MEMBER(nova2001_state::ninjakun_bg_videoram_w)
{
- int x = m_bg_tilemap->scrollx(0) >> 3;
- int y = m_bg_tilemap->scrolly(0) >> 3;
+ int const x = m_bg_tilemap->scrollx(0) >> 3;
+ int const y = m_bg_tilemap->scrolly(0) >> 3;
// add scroll registers to address
offset = ((offset + x + (y << 5)) & 0x3ff) + (offset & 0x400);
@@ -211,8 +211,8 @@ WRITE8_MEMBER(nova2001_state::ninjakun_bg_videoram_w)
READ8_MEMBER(nova2001_state::ninjakun_bg_videoram_r)
{
- int x = m_bg_tilemap->scrollx(0) >> 3;
- int y = m_bg_tilemap->scrolly(0) >> 3;
+ int const x = m_bg_tilemap->scrollx(0) >> 3;
+ int const y = m_bg_tilemap->scrolly(0) >> 3;
// add scroll registers to address
offset = ((offset + x + (y << 5)) & 0x3ff) + (offset & 0x400);
@@ -220,12 +220,12 @@ READ8_MEMBER(nova2001_state::ninjakun_bg_videoram_r)
return m_bg_videoram[offset];
}
-WRITE8_MEMBER(nova2001_state::nova2001_scroll_x_w)
+WRITE8_MEMBER(nova2001_state::scroll_x_w)
{
m_bg_tilemap->set_scrollx(0, data);
}
-WRITE8_MEMBER(nova2001_state::nova2001_scroll_y_w)
+WRITE8_MEMBER(nova2001_state::scroll_y_w)
{
m_bg_tilemap->set_scrolly(0, data);
}
@@ -251,19 +251,15 @@ WRITE8_MEMBER(nova2001_state::pkunwar_flipscreen_w)
void nova2001_state::nova2001_draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect )
{
- uint8_t *spriteram = m_spriteram;
- gfx_element *gfx = m_gfxdecode->gfx(0);
- int offs;
-
- for (offs = 0; offs < 0x800; offs += 32)
+ for (int offs = 0; offs < 0x800; offs += 32)
{
- int attr = spriteram[offs+3];
+ int const attr = m_spriteram[offs+3];
int flipx = attr & 0x10;
int flipy = attr & 0x20;
- int sx = spriteram[offs+1] - ((attr & 0x40) << 2); // high bit shown in schematics, not used by game
- int sy = spriteram[offs+2];
- int tile = spriteram[offs+0];
- int color = attr & 0x0f;
+ int sx = m_spriteram[offs+1] - ((attr & 0x40) << 2); // high bit shown in schematics, not used by game
+ int sy = m_spriteram[offs+2];
+ int const tile = m_spriteram[offs+0];
+ int const color = attr & 0x0f;
if (attr & 0x80) // disable bit shown in schematics, not used by game
{
@@ -278,7 +274,7 @@ void nova2001_state::nova2001_draw_sprites(bitmap_ind16 &bitmap, const rectangle
flipy = !flipy;
}
- gfx->transpen(bitmap,cliprect,
+ m_gfxdecode->gfx(0)->transpen(bitmap,cliprect,
tile,
color,
flipx, flipy,
@@ -288,19 +284,15 @@ void nova2001_state::nova2001_draw_sprites(bitmap_ind16 &bitmap, const rectangle
void nova2001_state::pkunwar_draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect )
{
- uint8_t *spriteram = m_spriteram;
- gfx_element *gfx = m_gfxdecode->gfx(0);
- int offs;
-
- for (offs = 0; offs < 0x800; offs += 32)
+ for (int offs = 0; offs < 0x800; offs += 32)
{
- int attr = spriteram[offs+3];
- int flipx = spriteram[offs+0] & 0x01;
- int flipy = spriteram[offs+0] & 0x02;
- int sx = spriteram[offs+1];
- int sy = spriteram[offs+2];
- int tile = ((spriteram[offs+0] & 0xfc) >> 2) + ((attr & 0x07) << 6);
- int color = (attr & 0xf0) >> 4;
+ int const attr = m_spriteram[offs+3];
+ int flipx = m_spriteram[offs+0] & 0x01;
+ int flipy = m_spriteram[offs+0] & 0x02;
+ int sx = m_spriteram[offs+1];
+ int sy = m_spriteram[offs+2];
+ int const tile = ((m_spriteram[offs+0] & 0xfc) >> 2) + ((attr & 0x07) << 6);
+ int const color = (attr & 0xf0) >> 4;
if (attr & 0x08) // deducted by comparison, not used by game
{
@@ -315,24 +307,24 @@ void nova2001_state::pkunwar_draw_sprites(bitmap_ind16 &bitmap, const rectangle
flipy = !flipy;
}
- gfx->transpen(bitmap,cliprect,
- tile,
- color,
- flipx, flipy,
- sx, sy, 0);
+ m_gfxdecode->gfx(0)->transpen(bitmap,cliprect,
+ tile,
+ color,
+ flipx, flipy,
+ sx, sy, 0);
// there's no X MSB, so draw with wraparound (fixes title screen)
- gfx->transpen(bitmap,cliprect,
- tile,
- color,
- flipx, flipy,
- sx - 256, sy, 0);
+ m_gfxdecode->gfx(0)->transpen(bitmap,cliprect,
+ tile,
+ color,
+ flipx, flipy,
+ sx - 256, sy, 0);
}
}
-uint32_t nova2001_state::screen_update_nova2001(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
+u32 nova2001_state::screen_update_nova2001(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{
m_bg_tilemap->draw(screen, bitmap, cliprect, 0, 0);
@@ -346,7 +338,7 @@ uint32_t nova2001_state::screen_update_nova2001(screen_device &screen, bitmap_in
return 0;
}
-uint32_t nova2001_state::screen_update_pkunwar(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
+u32 nova2001_state::screen_update_pkunwar(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{
m_bg_tilemap->draw(screen, bitmap, cliprect, TILEMAP_DRAW_OPAQUE | TILEMAP_DRAW_ALL_CATEGORIES, 0);
@@ -357,7 +349,7 @@ uint32_t nova2001_state::screen_update_pkunwar(screen_device &screen, bitmap_ind
return 0;
}
-uint32_t nova2001_state::screen_update_ninjakun(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
+u32 nova2001_state::screen_update_ninjakun(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{
m_bg_tilemap->draw(screen, bitmap, cliprect, 0, 0);
@@ -370,7 +362,7 @@ uint32_t nova2001_state::screen_update_ninjakun(screen_device &screen, bitmap_in
return 0;
}
-uint32_t nova2001_state::screen_update_raiders5(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
+u32 nova2001_state::screen_update_raiders5(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{
m_bg_tilemap->draw(screen, bitmap, cliprect, 0, 0);
diff --git a/src/mame/video/oneshot.cpp b/src/mame/video/oneshot.cpp
index b1a0a7f212a..76646953b82 100644
--- a/src/mame/video/oneshot.cpp
+++ b/src/mame/video/oneshot.cpp
@@ -7,28 +7,28 @@
/* bg tilemap */
-TILE_GET_INFO_MEMBER(oneshot_state::get_oneshot_bg_tile_info)
+TILE_GET_INFO_MEMBER(oneshot_state::get_bg_tile_info)
{
- int tileno = m_bg_videoram[tile_index * 2 + 1];
+ const u32 tileno = m_bg_videoram[tile_index * 2 + 1];
SET_TILE_INFO_MEMBER(0, tileno, 0, 0);
}
-WRITE16_MEMBER(oneshot_state::oneshot_bg_videoram_w)
+void oneshot_state::bg_videoram_w(offs_t offset, u16 data, u16 mem_mask)
{
COMBINE_DATA(&m_bg_videoram[offset]);
m_bg_tilemap->mark_tile_dirty(offset / 2);
}
/* mid tilemap */
-TILE_GET_INFO_MEMBER(oneshot_state::get_oneshot_mid_tile_info)
+TILE_GET_INFO_MEMBER(oneshot_state::get_mid_tile_info)
{
- int tileno = m_mid_videoram[tile_index * 2 + 1];
+ const u32 tileno = m_mid_videoram[tile_index * 2 + 1];
SET_TILE_INFO_MEMBER(0, tileno, 2, 0);
}
-WRITE16_MEMBER(oneshot_state::oneshot_mid_videoram_w)
+void oneshot_state::mid_videoram_w(offs_t offset, u16 data, u16 mem_mask)
{
COMBINE_DATA(&m_mid_videoram[offset]);
m_mid_tilemap->mark_tile_dirty(offset / 2);
@@ -36,14 +36,14 @@ WRITE16_MEMBER(oneshot_state::oneshot_mid_videoram_w)
/* fg tilemap */
-TILE_GET_INFO_MEMBER(oneshot_state::get_oneshot_fg_tile_info)
+TILE_GET_INFO_MEMBER(oneshot_state::get_fg_tile_info)
{
- int tileno = m_fg_videoram[tile_index * 2 + 1];
+ const u32 tileno = m_fg_videoram[tile_index * 2 + 1];
SET_TILE_INFO_MEMBER(0, tileno, 3, 0);
}
-WRITE16_MEMBER(oneshot_state::oneshot_fg_videoram_w)
+void oneshot_state::fg_videoram_w(offs_t offset, u16 data, u16 mem_mask)
{
COMBINE_DATA(&m_fg_videoram[offset]);
m_fg_tilemap->mark_tile_dirty(offset / 2);
@@ -51,22 +51,22 @@ WRITE16_MEMBER(oneshot_state::oneshot_fg_videoram_w)
void oneshot_state::video_start()
{
- m_bg_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(oneshot_state::get_oneshot_bg_tile_info),this), TILEMAP_SCAN_ROWS, 16, 16, 32, 32);
- m_mid_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(oneshot_state::get_oneshot_mid_tile_info),this), TILEMAP_SCAN_ROWS, 16, 16, 32, 32);
- m_fg_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(oneshot_state::get_oneshot_fg_tile_info),this), TILEMAP_SCAN_ROWS, 16, 16, 32, 32);
+ m_bg_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(oneshot_state::get_bg_tile_info),this), TILEMAP_SCAN_ROWS, 16, 16, 32, 32);
+ m_mid_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(oneshot_state::get_mid_tile_info),this), TILEMAP_SCAN_ROWS, 16, 16, 32, 32);
+ m_fg_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(oneshot_state::get_fg_tile_info),this), TILEMAP_SCAN_ROWS, 16, 16, 32, 32);
m_bg_tilemap->set_transparent_pen(0);
m_mid_tilemap->set_transparent_pen(0);
m_fg_tilemap->set_transparent_pen(0);
}
-void oneshot_state::draw_crosshairs( bitmap_ind16 &bitmap, const rectangle &cliprect )
+void oneshot_state::draw_crosshairs()
{
//int xpos,ypos;
/* get gun raw coordinates (player 1) */
- m_gun_x_p1 = (ioport("LIGHT0_X")->read() & 0xff) * 320 / 256;
- m_gun_y_p1 = (ioport("LIGHT0_Y")->read() & 0xff) * 240 / 256;
+ m_gun_x_p1 = (m_io_lightgun_x[0]->read() & 0xff) * 320 / 256;
+ m_gun_y_p1 = (m_io_lightgun_y[0]->read() & 0xff) * 240 / 256;
/* compute the coordinates for drawing (from routine at 0x009ab0) */
//xpos = m_gun_x_p1;
@@ -80,8 +80,8 @@ void oneshot_state::draw_crosshairs( bitmap_ind16 &bitmap, const rectangle &clip
/* get gun raw coordinates (player 2) */
- m_gun_x_p2 = (ioport("LIGHT1_X")->read() & 0xff) * 320 / 256;
- m_gun_y_p2 = (ioport("LIGHT1_Y")->read() & 0xff) * 240 / 256;
+ m_gun_x_p2 = (m_io_lightgun_x[1]->read() & 0xff) * 320 / 256;
+ m_gun_y_p2 = (m_io_lightgun_y[1]->read() & 0xff) * 240 / 256;
/* compute the coordinates for drawing (from routine at 0x009b6e) */
//xpos = m_gun_x_p2;
@@ -92,37 +92,41 @@ void oneshot_state::draw_crosshairs( bitmap_ind16 &bitmap, const rectangle &clip
m_gun_x_p2 = 0;
}
-void oneshot_state::draw_sprites( bitmap_ind16 &bitmap, const rectangle &cliprect )
+void oneshot_state::draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect)
{
- const uint16_t *source = m_sprites;
- const uint16_t *finish = source + (0x1000 / 2);
+ const u16 *source = m_spriteram;
+ const u16 *finish = source + (0x1000 / 2);
gfx_element *gfx = m_gfxdecode->gfx(1);
- int xpos, ypos;
-
while (source < finish)
{
- int blockx, blocky;
- int num = source[1] & 0xffff;
- int xsize = (source[2] & 0x000f) + 1;
- int ysize = (source[3] & 0x000f) + 1;
+ const u16 attr = source[0];
- ypos = source[3] & 0xff80;
- xpos = source[2] & 0xff80;
+ if (attr & 0x0001) // end of sprites
+ break;
- ypos = ypos >> 7;
- xpos = xpos >> 7;
+ if (!(attr & 0x8000)) // visible bit
+ {
+ source += 0x4;
+ continue;
+ }
+ const u32 num = source[1] & 0xffff;
+ const int xsize = (source[2] & 0x000f) + 1;
+ const int ysize = (source[3] & 0x000f) + 1;
- if (source[0] == 0x0001)
- break;
+ int ypos = source[3] & 0xff80;
+ int xpos = source[2] & 0xff80;
+
+ ypos = ypos >> 7;
+ xpos = xpos >> 7;
xpos -= 8;
ypos -= 6;
- for (blockx = 0; blockx < xsize; blockx++)
+ for (int blockx = 0; blockx < xsize; blockx++)
{
- for (blocky = 0; blocky < ysize; blocky++)
+ for (int blocky = 0; blocky < ysize; blocky++)
{
gfx->transpen(
bitmap,
@@ -132,7 +136,6 @@ void oneshot_state::draw_sprites( bitmap_ind16 &bitmap, const rectangle &cliprec
0,0,
xpos + blockx * 8, ypos + blocky * 8, 0);
-
gfx->transpen(
bitmap,
cliprect,
@@ -144,10 +147,9 @@ void oneshot_state::draw_sprites( bitmap_ind16 &bitmap, const rectangle &cliprec
}
source += 0x4;
}
-
}
-uint32_t oneshot_state::screen_update_oneshot(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
+u32 oneshot_state::screen_update_oneshot(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{
bitmap.fill(m_palette->black_pen(), cliprect);
@@ -158,11 +160,11 @@ uint32_t oneshot_state::screen_update_oneshot(screen_device &screen, bitmap_ind1
m_mid_tilemap->draw(screen, bitmap, cliprect, 0, 0);
draw_sprites(bitmap, cliprect);
m_fg_tilemap->draw(screen, bitmap, cliprect, 0, 0);
- draw_crosshairs(bitmap, cliprect);
+ draw_crosshairs();
return 0;
}
-uint32_t oneshot_state::screen_update_maddonna(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
+u32 oneshot_state::screen_update_maddonna(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{
bitmap.fill(m_palette->black_pen(), cliprect);
@@ -176,3 +178,19 @@ uint32_t oneshot_state::screen_update_maddonna(screen_device &screen, bitmap_ind
// popmessage ("%04x %04x %04x %04x %04x %04x %04x %04x", m_scroll[0], m_scroll[1], m_scroll[2], m_scroll[3], m_scroll[4], m_scroll[5], m_scroll[6], m_scroll[7]);
return 0;
}
+
+// why are the layers in a different order?
+u32 oneshot_state::screen_update_komocomo(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
+{
+ bitmap.fill(m_palette->black_pen(), cliprect);
+
+ m_mid_tilemap->set_scrolly(0, m_scroll[1]); // other registers aren't used so we don't know which layers they relate to
+
+ m_bg_tilemap->draw(screen, bitmap, cliprect, 0, 0);
+ m_mid_tilemap->draw(screen, bitmap, cliprect, 0, 0);
+ m_fg_tilemap->draw(screen, bitmap, cliprect, 0, 0);
+ draw_sprites(bitmap, cliprect);
+
+// popmessage ("%04x %04x %04x %04x %04x %04x %04x %04x", m_scroll[0], m_scroll[1], m_scroll[2], m_scroll[3], m_scroll[4], m_scroll[5], m_scroll[6], m_scroll[7]);
+ return 0;
+}
diff --git a/src/mame/video/osi.cpp b/src/mame/video/osi.cpp
index f23b83f5c4d..d06540810e6 100644
--- a/src/mame/video/osi.cpp
+++ b/src/mame/video/osi.cpp
@@ -140,35 +140,38 @@ uint32_t uk101_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap,
/* Machine Drivers */
-MACHINE_CONFIG_START(sb2m600_state::osi600_video)
- MCFG_SCREEN_ADD(SCREEN_TAG, RASTER)
- MCFG_SCREEN_REFRESH_RATE(X1/256/256) // 60 Hz
- MCFG_SCREEN_UPDATE_DRIVER(sb2m600_state, screen_update)
- MCFG_SCREEN_SIZE(64*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 64*8-1, 0, 32*8-1)
- MCFG_SCREEN_PALETTE("palette")
+void sb2m600_state::osi600_video(machine_config &config)
+{
+ screen_device &screen(SCREEN(config, SCREEN_TAG, SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(X1/256/256); // 60 Hz
+ screen.set_screen_update(FUNC(sb2m600_state::screen_update));
+ screen.set_size(64*8, 32*8);
+ screen.set_visarea(0*8, 64*8-1, 0, 32*8-1);
+ screen.set_palette("palette");
PALETTE(config, "palette", palette_device::MONOCHROME);
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(uk101_state::uk101_video)
- MCFG_SCREEN_ADD(SCREEN_TAG, RASTER)
- MCFG_SCREEN_REFRESH_RATE(50)
- MCFG_SCREEN_UPDATE_DRIVER(uk101_state, screen_update)
- MCFG_SCREEN_SIZE(64*8, 16*16)
- MCFG_SCREEN_VISIBLE_AREA(0, 64*8-1, 0, 16*16-1)
- MCFG_SCREEN_PALETTE("palette")
+void uk101_state::uk101_video(machine_config &config)
+{
+ screen_device &screen(SCREEN(config, SCREEN_TAG, SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(50);
+ screen.set_screen_update(FUNC(uk101_state::screen_update));
+ screen.set_size(64*8, 16*16);
+ screen.set_visarea(0, 64*8-1, 0, 16*16-1);
+ screen.set_palette("palette");
PALETTE(config, "palette", palette_device::MONOCHROME);
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(sb2m600_state::osi630_video)
- MCFG_SCREEN_ADD(SCREEN_TAG, RASTER)
- MCFG_SCREEN_REFRESH_RATE(X1/256/256) // 60 Hz
- MCFG_SCREEN_UPDATE_DRIVER(sb2m600_state, screen_update)
- MCFG_SCREEN_SIZE(64*8, 16*16)
- MCFG_SCREEN_VISIBLE_AREA(0, 64*8-1, 0, 16*16-1)
- MCFG_SCREEN_PALETTE("palette")
+void sb2m600_state::osi630_video(machine_config &config)
+{
+ screen_device &screen(SCREEN(config, SCREEN_TAG, SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(X1/256/256); // 60 Hz
+ screen.set_screen_update(FUNC(sb2m600_state::screen_update));
+ screen.set_size(64*8, 16*16);
+ screen.set_visarea(0, 64*8-1, 0, 16*16-1);
+ screen.set_palette("palette");
PALETTE(config, "palette", FUNC(sb2m600_state::osi630_palette), 8+2);
-MACHINE_CONFIG_END
+}
diff --git a/src/mame/video/pacman.cpp b/src/mame/video/pacman.cpp
index 6325500b408..cda16a3ea48 100644
--- a/src/mame/video/pacman.cpp
+++ b/src/mame/video/pacman.cpp
@@ -84,18 +84,18 @@ void pacman_state::pacman_palette(palette_device &palette) const
bit0 = BIT(color_prom[i], 0);
bit1 = BIT(color_prom[i], 1);
bit2 = BIT(color_prom[i], 2);
- int const r = combine_3_weights(rweights, bit0, bit1, bit2);
+ int const r = combine_weights(rweights, bit0, bit1, bit2);
// green component
bit0 = BIT(color_prom[i], 3);
bit1 = BIT(color_prom[i], 4);
bit2 = BIT(color_prom[i], 5);
- int const g = combine_3_weights(gweights, bit0, bit1, bit2);
+ int const g = combine_weights(gweights, bit0, bit1, bit2);
// blue component
bit0 = BIT(color_prom[i], 6);
bit1 = BIT(color_prom[i], 7);
- int const b = combine_2_weights(bweights, bit0, bit1);
+ int const b = combine_weights(bweights, bit0, bit1);
palette.set_indirect_color(i, rgb_t(r, g, b));
}
diff --git a/src/mame/video/pandoras.cpp b/src/mame/video/pandoras.cpp
index bf2afb944f8..f47f83e1826 100644
--- a/src/mame/video/pandoras.cpp
+++ b/src/mame/video/pandoras.cpp
@@ -45,18 +45,18 @@ void pandoras_state::pandoras_palette(palette_device &palette) const
bit0 = BIT(color_prom[i], 0);
bit1 = BIT(color_prom[i], 1);
bit2 = BIT(color_prom[i], 2);
- int const r = combine_3_weights(rweights, bit0, bit1, bit2);
+ int const r = combine_weights(rweights, bit0, bit1, bit2);
// green component
bit0 = BIT(color_prom[i], 3);
bit1 = BIT(color_prom[i], 4);
bit2 = BIT(color_prom[i], 5);
- int const g = combine_3_weights(gweights, bit0, bit1, bit2);
+ int const g = combine_weights(gweights, bit0, bit1, bit2);
// blue component
bit0 = BIT(color_prom[i], 6);
bit1 = BIT(color_prom[i], 7);
- int const b = combine_2_weights(bweights, bit0, bit1);
+ int const b = combine_weights(bweights, bit0, bit1);
palette.set_indirect_color(i, rgb_t(r, g, b));
}
diff --git a/src/mame/video/pc1512.cpp b/src/mame/video/pc1512.cpp
index 82c5e563991..187baf20690 100644
--- a/src/mame/video/pc1512.cpp
+++ b/src/mame/video/pc1512.cpp
@@ -137,7 +137,7 @@ READ8_MEMBER( pc1512_state::vdu_r )
switch (offset)
{
case 1: case 3: case 5: case 7:
- data = m_vdu->register_r(space, 0);
+ data = m_vdu->register_r();
break;
case 0xa: // VDU Status
@@ -190,11 +190,11 @@ WRITE8_MEMBER( pc1512_state::vdu_w )
switch (offset)
{
case 0: case 2: case 4: case 6:
- m_vdu->address_w(space, 0, data);
+ m_vdu->address_w(data);
break;
case 1: case 3: case 5: case 7:
- m_vdu->register_w(space, 0, data);
+ m_vdu->register_w(data);
break;
case 8: // VDU Mode Control
@@ -590,7 +590,7 @@ uint32_t pc1512_state::screen_update(screen_device &screen, bitmap_rgb32 &bitmap
//-------------------------------------------------
-// MACHINE_CONFIG( pc1512 )
+// machine_config( pc1512 )
//-------------------------------------------------
void pc1512_state::pc1512_video(machine_config &config)
diff --git a/src/mame/video/pc8401a.cpp b/src/mame/video/pc8401a.cpp
index 0c38ce83c39..832b5c7cb1b 100644
--- a/src/mame/video/pc8401a.cpp
+++ b/src/mame/video/pc8401a.cpp
@@ -58,52 +58,54 @@ void pc8401a_state::pc8500_lcdc(address_map &map)
/* Machine Drivers */
-MACHINE_CONFIG_START(pc8401a_state::pc8401a_video)
+void pc8401a_state::pc8401a_video(machine_config &config)
+{
// config.set_default_layout(layout_pc8401a);
PALETTE(config, "palette", FUNC(pc8401a_state::pc8401a_palette), 2);
/* LCD */
- MCFG_SCREEN_ADD(SCREEN_TAG, LCD)
- MCFG_SCREEN_REFRESH_RATE(44)
- MCFG_SCREEN_UPDATE_DEVICE(SED1330_TAG, sed1330_device, screen_update)
- MCFG_SCREEN_SIZE(480, 128)
- MCFG_SCREEN_VISIBLE_AREA(0, 480-1, 0, 128-1)
- MCFG_SCREEN_PALETTE("palette")
+ SCREEN(config, m_screen_lcd, SCREEN_TYPE_LCD);
+ m_screen_lcd->set_refresh_hz(44);
+ m_screen_lcd->set_screen_update(SED1330_TAG, FUNC(sed1330_device::screen_update));
+ m_screen_lcd->set_size(480, 128);
+ m_screen_lcd->set_visarea(0, 480-1, 0, 128-1);
+ m_screen_lcd->set_palette("palette");
SED1330(config, m_lcdc, 0);
- m_lcdc->set_screen(SCREEN_TAG);
+ m_lcdc->set_screen(m_screen_lcd);
m_lcdc->set_addrmap(0, &pc8401a_state::pc8401a_lcdc);
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(pc8500_state::pc8500_video)
+void pc8500_state::pc8500_video(machine_config &config)
+{
config.set_default_layout(layout_pc8500);
PALETTE(config, "palette", FUNC(pc8500_state::pc8401a_palette), 2 + 8);
/* LCD */
- MCFG_SCREEN_ADD(SCREEN_TAG, LCD)
- MCFG_SCREEN_REFRESH_RATE(44)
- MCFG_SCREEN_UPDATE_DEVICE(SED1330_TAG, sed1330_device, screen_update)
- MCFG_SCREEN_SIZE(480, 208)
- MCFG_SCREEN_VISIBLE_AREA(0, 480-1, 0, 200-1)
- MCFG_SCREEN_PALETTE("palette")
+ SCREEN(config, m_screen_lcd, SCREEN_TYPE_LCD);
+ m_screen_lcd->set_refresh_hz(44);
+ m_screen_lcd->set_screen_update(SED1330_TAG, FUNC(sed1330_device::screen_update));
+ m_screen_lcd->set_size(480, 208);
+ m_screen_lcd->set_visarea(0, 480-1, 0, 200-1);
+ m_screen_lcd->set_palette("palette");
SED1330(config, m_lcdc, 0);
m_lcdc->set_screen(SCREEN_TAG);
m_lcdc->set_addrmap(0, &pc8500_state::pc8500_lcdc);
/* PC-8441A CRT */
- MCFG_SCREEN_ADD(CRT_SCREEN_TAG, RASTER)
- MCFG_SCREEN_UPDATE_DRIVER(pc8500_state, screen_update)
- MCFG_SCREEN_SIZE(80*8, 24*8)
- MCFG_SCREEN_VISIBLE_AREA(0, 80*8-1, 0, 24*8-1)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500))
- MCFG_SCREEN_REFRESH_RATE(50)
- MCFG_SCREEN_PALETTE("palette")
+ screen_device &screen(SCREEN(config, CRT_SCREEN_TAG, SCREEN_TYPE_RASTER));
+ screen.set_screen_update(FUNC(pc8500_state::screen_update));
+ screen.set_size(80*8, 24*8);
+ screen.set_visarea(0, 80*8-1, 0, 24*8-1);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500));
+ screen.set_refresh_hz(50);
+ screen.set_palette("palette");
MC6845(config, m_crtc, 400000);
m_crtc->set_screen(CRT_SCREEN_TAG);
m_crtc->set_show_border_area(false);
m_crtc->set_char_width(6);
-MACHINE_CONFIG_END
+}
diff --git a/src/mame/video/pc9801.cpp b/src/mame/video/pc9801.cpp
index 34d8d3e04c7..c6fee1e569d 100644
--- a/src/mame/video/pc9801.cpp
+++ b/src/mame/video/pc9801.cpp
@@ -321,7 +321,7 @@ READ8_MEMBER(pc9801_state::pc9801_a0_r)
{
case 0x00:
case 0x02:
- return m_hgdc2->read(space, (offset & 2) >> 1);
+ return m_hgdc2->read((offset & 2) >> 1);
/* TODO: double check these two */
case 0x04:
return m_vram_disp & 1;
@@ -366,7 +366,7 @@ WRITE8_MEMBER(pc9801_state::pc9801_a0_w)
{
case 0x00:
case 0x02:
- m_hgdc2->write(space, (offset & 2) >> 1,data);
+ m_hgdc2->write((offset & 2) >> 1,data);
return;
case 0x04:
m_vram_disp = data & 1;
diff --git a/src/mame/video/pc_t1t.cpp b/src/mame/video/pc_t1t.cpp
index 02248cc9a67..7dcfd5e1cbd 100644
--- a/src/mame/video/pc_t1t.cpp
+++ b/src/mame/video/pc_t1t.cpp
@@ -875,10 +875,10 @@ WRITE8_MEMBER( pcvideo_t1000_device::write )
switch( offset )
{
case 0: case 2: case 4: case 6:
- m_mc6845->address_w( space, offset, data );
+ m_mc6845->address_w(data);
break;
case 1: case 3: case 5: case 7:
- m_mc6845->register_w( space, offset, data );
+ m_mc6845->register_w(data);
break;
case 8:
mode_control_w(data);
@@ -913,10 +913,10 @@ WRITE8_MEMBER( pcvideo_pcjr_device::write )
switch( offset )
{
case 0: case 4:
- m_mc6845->address_w( space, offset, data );
+ m_mc6845->address_w(data);
break;
case 1: case 5:
- m_mc6845->register_w( space, offset, data );
+ m_mc6845->register_w(data);
break;
case 10:
if ( m_address_data_ff & 0x01 )
@@ -958,7 +958,7 @@ READ8_MEMBER( pc_t1t_device::read )
break;
case 1: case 3: case 5: case 7:
- data = m_mc6845->register_r( space, offset );
+ data = m_mc6845->register_r();
break;
case 8:
diff --git a/src/mame/video/pcd.cpp b/src/mame/video/pcd.cpp
index 2b3a4fe8604..b70289ae319 100644
--- a/src/mame/video/pcd.cpp
+++ b/src/mame/video/pcd.cpp
@@ -99,7 +99,8 @@ ioport_constructor pcd_video_device::device_input_ports() const
return INPUT_PORTS_NAME(pcd_mouse);
}
-MACHINE_CONFIG_START(pcd_video_device::device_add_mconfig)
+void pcd_video_device::device_add_mconfig(machine_config &config)
+{
i8741_device &mcu(I8741(config, "graphics", 16_MHz_XTAL / 2));
mcu.p1_in_cb().set(FUNC(pcd_video_device::p1_r));
mcu.p2_out_cb().set(FUNC(pcd_video_device::p2_w));
@@ -117,8 +118,8 @@ MACHINE_CONFIG_START(pcd_video_device::device_add_mconfig)
m_crtc->set_display_callback(FUNC(pcd_video_device::display_pixels));
m_crtc->set_screen("screen");
- MCFG_TIMER_DRIVER_ADD_PERIODIC("mouse_timer", pcd_video_device, mouse_timer, attotime::from_hz(15000)) // guess
-MACHINE_CONFIG_END
+ TIMER(config, "mouse_timer").configure_periodic(FUNC(pcd_video_device::mouse_timer), attotime::from_hz(15000)); // guess
+}
void pcx_video_device::pcx_vid_map(address_map &map)
{
@@ -191,7 +192,7 @@ SCN2674_DRAW_CHARACTER_MEMBER(pcd_video_device::display_pixels)
int bgnd = 0, fgnd = 1;
data = m_charram[m_vram[address] * 16 + linecount];
attr = m_vram[address + 1];
- if(cursor && blink)
+ if(cursor)
data = 0xff;
if(ul && (attr & 0x20))
data = 0xff;
@@ -219,16 +220,16 @@ SCN2672_DRAW_CHARACTER_MEMBER(pcx_video_device::display_pixels)
{
uint16_t data = m_charrom[charcode * 16 + linecount + (attrcode & 0x20 ? 4096 : 0)];
- if (cursor && blink)
- data = 0x3ff;
+ if (cursor)
+ data = 0x7ff;
else
{
data <<= 1;
data |= data << 1;
}
- if (m_p1 & 0x20)
- data ^= 0x3ff;
+ if (BIT(m_p1, 5))
+ data ^= 0x7ff;
for (int i = 0; i < 12; i++)
{
diff --git a/src/mame/video/pooyan.cpp b/src/mame/video/pooyan.cpp
index 255c69324ce..e1fbc6f2875 100644
--- a/src/mame/video/pooyan.cpp
+++ b/src/mame/video/pooyan.cpp
@@ -51,18 +51,18 @@ void pooyan_state::pooyan_palette(palette_device &palette) const
bit0 = BIT(color_prom[i], 0);
bit1 = BIT(color_prom[i], 1);
bit2 = BIT(color_prom[i], 2);
- int const r = combine_3_weights(rweights, bit0, bit1, bit2);
+ int const r = combine_weights(rweights, bit0, bit1, bit2);
// green component
bit0 = BIT(color_prom[i], 3);
bit1 = BIT(color_prom[i], 4);
bit2 = BIT(color_prom[i], 5);
- int const g = combine_3_weights(gweights, bit0, bit1, bit2);
+ int const g = combine_weights(gweights, bit0, bit1, bit2);
// blue component
bit0 = BIT(color_prom[i], 6);
bit1 = BIT(color_prom[i], 7);
- int const b = combine_2_weights(bweights, bit0, bit1);
+ int const b = combine_weights(bweights, bit0, bit1);
palette.set_indirect_color(i, rgb_t(r, g, b));
}
diff --git a/src/mame/video/psikyo.cpp b/src/mame/video/psikyo.cpp
index ae5885db06a..96cbbe08e5a 100644
--- a/src/mame/video/psikyo.cpp
+++ b/src/mame/video/psikyo.cpp
@@ -76,14 +76,14 @@ Offset:
template<int Layer>
TILE_GET_INFO_MEMBER(psikyo_state::get_tile_info)
{
- uint16_t code = ((uint16_t *)m_vram[Layer].target())[BYTE_XOR_BE(tile_index)];
+ u16 code = ((u16 *)m_vram[Layer].target())[BYTE_XOR_BE(tile_index)];
SET_TILE_INFO_MEMBER(1,
(code & 0x1fff) + 0x2000 * m_tilemap_bank[Layer],
((code >> 13) & 7) + (Layer * 0x40),
0);
}
-void psikyo_state::psikyo_switch_banks( int tmap, int bank )
+void psikyo_state::switch_bgbanks(u8 tmap, u8 bank)
{
if (bank != m_tilemap_bank[tmap])
{
@@ -96,6 +96,8 @@ void psikyo_state::psikyo_switch_banks( int tmap, int bank )
VIDEO_START_MEMBER(psikyo_state,psikyo)
{
+ m_spritelist = std::make_unique<sprite_t[]>(0x800/2*8*8);
+ m_sprite_ptr_pre = m_spritelist.get();
/* The Hardware is Capable of Changing the Dimensions of the Tilemaps, its safer to create
the various sized tilemaps now as opposed to later */
@@ -110,21 +112,16 @@ VIDEO_START_MEMBER(psikyo_state,psikyo)
m_tilemap[layer][size]->set_scroll_cols(1);
}
}
-
- m_spritebuf[0] = std::make_unique<uint32_t[]>(0x2000 / 4);
- m_spritebuf[1] = std::make_unique<uint32_t[]>(0x2000 / 4);
-
- save_pointer(NAME(m_spritebuf[0]), 0x2000 / 4, 0);
- save_pointer(NAME(m_spritebuf[1]), 0x2000 / 4, 1);
save_item(NAME(m_old_linescroll));
+ save_item(NAME(m_sprite_ctrl));
}
VIDEO_START_MEMBER(psikyo_state,sngkace)
{
VIDEO_START_CALL_MEMBER( psikyo );
- psikyo_switch_banks(0, 0); // sngkace / samuraia don't use banking
- psikyo_switch_banks(1, 1); // They share "gfx2" to save memory on other boards
+ switch_bgbanks(0, 0); // sngkace / samuraia don't use banking
+ switch_bgbanks(1, 1); // They share "gfx2" to save memory on other boards
}
@@ -173,62 +170,53 @@ Note: Not all sprites are displayed: in the top part of spriteram
***************************************************************************/
-void psikyo_state::draw_sprites( screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, int trans_pen )
+void psikyo_state::get_sprites()
{
/* tile layers 0 & 1 have priorities 1 & 2 */
+ m_sprite_ctrl = m_spriteram->buffer()[0x1ffe / 4] & 0xffff;
static const int pri[] = { 0, 0xfc, 0xff, 0xff };
- int offs;
- uint16_t *spritelist = (uint16_t *)(m_spritebuf[1].get() + 0x1800 / 4);
- uint8_t *TILES = m_spritelut->base(); // Sprites LUT
- int TILES_LEN = m_spritelut->bytes();
+ const u16 *spritelist = (u16 *)(m_spriteram->buffer() + 0x1800 / 4);
+ const u8 *TILES = m_spritelut->base(); // Sprites LUT
+ u32 const TILES_LEN = m_spritelut->bytes();
- int width = m_screen->width();
- int height = m_screen->height();
+ u16 const width = m_screen->width();
+ u16 const height = m_screen->height();
/* Exit if sprites are disabled */
- if (spritelist[BYTE_XOR_BE((0x800 - 2) / 2)] & 1) return;
+ m_sprite_ptr_pre = m_spritelist.get();
+ if (m_sprite_ctrl & 1)
+ return;
/* Look for "end of sprites" marker in the sprites list */
- for (offs = 0/2 ; offs < (0x800 - 2)/2 ; offs += 2/2) // skip last "sprite"
- {
- uint16_t sprite = spritelist[BYTE_XOR_BE(offs)];
- if (sprite == 0xffff)
- break;
- }
-
- offs -= 2/2;
-
- // fprintf(stderr, "\n");
- for ( ; offs >= 0/2 ; offs -= 2/2)
+ for (int offs = 0/2 ; offs < (0x800 - 2)/2 ; offs += 2/2) // skip last "sprite"
{
- uint32_t *source;
- int sprite;
-
- int x, y, attr, code, flipx, flipy, nx, ny, zoomx, zoomy;
- int dx, dy, xstart, ystart, xend, yend, xinc, yinc;
+ int xstart, ystart, xend, yend, xinc, yinc;
/* Get next entry in the list */
- sprite = spritelist[BYTE_XOR_BE(offs)];
+ u16 sprite = spritelist[BYTE_XOR_BE(offs)];
+
+ if (sprite == 0xffff)
+ break;
sprite %= 0x300;
- source = &m_spritebuf[1][sprite * 8 / 4];
+ const u32 *source = &m_spriteram->buffer()[sprite * 8 / 4];
/* Draw this sprite */
- y = source[0 / 4] >> 16;
- x = source[0 / 4] & 0xffff;
- attr = source[4 / 4] >> 16;
- code = source[4 / 4] & 0x1ffff;
+ s32 y = source[0 / 4] >> 16;
+ s32 x = source[0 / 4] & 0xffff;
+ u16 const attr = source[4 / 4] >> 16;
+ u32 code = source[4 / 4] & 0x1ffff;
- flipx = attr & 0x4000;
- flipy = attr & 0x8000;
+ int flipx = attr & 0x4000;
+ int flipy = attr & 0x8000;
- zoomx = ((x & 0xf000) >> 12);
- zoomy = ((y & 0xf000) >> 12);
- nx = ((x & 0x0e00) >> 9) + 1;
- ny = ((y & 0x0e00) >> 9) + 1;
- x = ((x & 0x01ff));
- y = ((y & 0x00ff)) - (y & 0x100);
+ u32 zoomx = ((x & 0xf000) >> 12);
+ u32 zoomy = ((y & 0xf000) >> 12);
+ u8 const nx = ((x & 0x0e00) >> 9) + 1;
+ u8 const ny = ((y & 0x0e00) >> 9) + 1;
+ x = ((x & 0x01ff));
+ y = ((y & 0x00ff)) - (y & 0x100);
/* 180-1ff are negative coordinates. Note that $80 pixels is
the maximum extent of a sprite, which can therefore be moved
@@ -256,29 +244,32 @@ void psikyo_state::draw_sprites( screen_device &screen, bitmap_ind16 &bitmap, co
if (flipy) { ystart = ny - 1; yend = -1; yinc = -1; }
else { ystart = 0; yend = ny; yinc = +1; }
- for (dy = ystart; dy != yend; dy += yinc)
+ for (int dy = ystart; dy != yend; dy += yinc)
{
- for (dx = xstart; dx != xend; dx += xinc)
+ for (int dx = xstart; dx != xend; dx += xinc)
{
- int addr = (code * 2) & (TILES_LEN - 1);
+ u32 const addr = (code * 2) & (TILES_LEN - 1);
+ m_sprite_ptr_pre->gfx = 0;
+ m_sprite_ptr_pre->code = TILES[addr+1] * 256 + TILES[addr];
+ m_sprite_ptr_pre->color = attr >> 8;
+ m_sprite_ptr_pre->flipx = flipx;
+ m_sprite_ptr_pre->flipy = flipy;
if (zoomx == 32 && zoomy == 32)
- m_gfxdecode->gfx(0)->prio_transpen(bitmap,cliprect,
- TILES[addr+1] * 256 + TILES[addr],
- attr >> 8,
- flipx, flipy,
- x + dx * 16, y + dy * 16,
- screen.priority(),
- pri[(attr & 0xc0) >> 6],trans_pen);
+ {
+ m_sprite_ptr_pre->x = x + dx * 16;
+ m_sprite_ptr_pre->y = y + dy * 16;
+ }
else
- m_gfxdecode->gfx(0)->prio_zoom_transpen(bitmap,cliprect,
- TILES[addr+1] * 256 + TILES[addr],
- attr >> 8,
- flipx, flipy,
- x + (dx * zoomx) / 2, y + (dy * zoomy) / 2,
- zoomx << 11,zoomy << 11,
- screen.priority(),pri[(attr & 0xc0) >> 6],trans_pen);
+ {
+ m_sprite_ptr_pre->x = x + (dx * zoomx) / 2;
+ m_sprite_ptr_pre->y = y + (dy * zoomy) / 2;
+ }
+ m_sprite_ptr_pre->zoomx = zoomx << 11;
+ m_sprite_ptr_pre->zoomy = zoomy << 11;
+ m_sprite_ptr_pre->primask = pri[(attr & 0xc0) >> 6];
+ m_sprite_ptr_pre++;
code++;
}
}
@@ -290,63 +281,53 @@ void psikyo_state::draw_sprites( screen_device &screen, bitmap_ind16 &bitmap, co
// until I work out why it makes a partial copy of the sprite list, and how best to apply it
// sprite placement of the explosion graphic seems incorrect compared to the original sets? (no / different zoom support?)
// it might be a problem with the actual bootleg
-void psikyo_state::draw_sprites_bootleg( screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, int trans_pen )
+void psikyo_state::get_sprites_bootleg()
{
/* tile layers 0 & 1 have priorities 1 & 2 */
+ m_sprite_ctrl = m_spriteram->buffer()[0x1ffe / 4] & 0xffff;
static const int pri[] = { 0, 0xfc, 0xff, 0xff };
- int offs;
- uint16_t *spritelist = (uint16_t *)(m_spritebuf[1].get()+ 0x1800 / 4);
- uint8_t *TILES = m_spritelut->base(); // Sprites LUT
- int TILES_LEN = m_spritelut->bytes();
+ const u16 *spritelist = (u16 *)(m_spriteram->buffer() + 0x1800 / 4);
+ const u8 *TILES = m_spritelut->base(); // Sprites LUT
+ u32 const TILES_LEN = m_spritelut->bytes();
- int width = m_screen->width();
- int height = m_screen->height();
+ u16 const width = m_screen->width();
+ u16 const height = m_screen->height();
/* Exit if sprites are disabled */
- if (spritelist[BYTE_XOR_BE((0x800 - 2) / 2)] & 1)
+ m_sprite_ptr_pre = m_spritelist.get();
+ if (m_sprite_ctrl & 1)
return;
/* Look for "end of sprites" marker in the sprites list */
- for (offs = 0/2 ; offs < (0x800 - 2)/2 ; offs += 2/2) // skip last "sprite"
- {
- uint16_t sprite = spritelist[BYTE_XOR_BE(offs)];
- if (sprite == 0xffff)
- break;
- }
-
- offs -= 2/2;
-
- // fprintf(stderr, "\n");
- for ( ; offs >= 0/2 ; offs -= 2/2)
+ for (int offs = 0/2 ; offs < (0x800 - 2)/2 ; offs += 2/2) // skip last "sprite"
{
- uint32_t *source;
- int sprite;
-
- int x, y, attr, code, flipx, flipy, nx, ny, zoomx, zoomy;
- int dx, dy, xstart, ystart, xend, yend, xinc, yinc;
+ int xstart, ystart, xend, yend, xinc, yinc;
/* Get next entry in the list */
- sprite = spritelist[BYTE_XOR_BE(offs)];
+ u16 sprite = spritelist[BYTE_XOR_BE(offs)];
+
+ if (sprite == 0xffff)
+ break;
sprite %= 0x300;
- source = &m_spritebuf[1][sprite * 8 / 4];
+ const u32 *source = &m_spriteram->buffer()[sprite * 8 / 4];
/* Draw this sprite */
- y = source[0] >> 16;
- x = source[0] & 0xffff;
- attr = source[1] >> 16;
- code = source[1] & 0x1ffff;
+ s32 y = source[0 / 4] >> 16;
+ s32 x = source[0 / 4] & 0xffff;
+ u16 const attr = source[4 / 4] >> 16;
+ u32 code = source[4 / 4] & 0x1ffff;
- flipx = attr & 0x4000;
- flipy = attr & 0x8000;
+ int flipx = attr & 0x4000;
+ int flipy = attr & 0x8000;
- zoomx = ((x & 0xf000) >> 12);
- zoomy = ((y & 0xf000) >> 12);
- nx = ((x & 0x0e00) >> 9) + 1;
- ny = ((y & 0x0e00) >> 9) + 1;
- x = ((x & 0x01ff));
- y = ((y & 0x00ff)) - (y & 0x100);
+ u32 zoomx = ((x & 0xf000) >> 12);
+ u32 zoomy = ((y & 0xf000) >> 12);
+ u8 const nx = ((x & 0x0e00) >> 9) + 1;
+ u8 const ny = ((y & 0x0e00) >> 9) + 1;
+ x = ((x & 0x01ff));
+ y = ((y & 0x00ff)) - (y & 0x100);
/* 180-1ff are negative coordinates. Note that $80 pixels is
the maximum extent of a sprite, which can therefore be moved
@@ -375,38 +356,70 @@ void psikyo_state::draw_sprites_bootleg( screen_device &screen, bitmap_ind16 &bi
if (flipy) { ystart = ny - 1; yend = -1; yinc = -1; }
else { ystart = 0; yend = ny; yinc = +1; }
- for (dy = ystart; dy != yend; dy += yinc)
+ for (int dy = ystart; dy != yend; dy += yinc)
{
- for (dx = xstart; dx != xend; dx += xinc)
+ for (int dx = xstart; dx != xend; dx += xinc)
{
- int addr = (code * 2) & (TILES_LEN-1);
+ u32 const addr = (code * 2) & (TILES_LEN-1);
+ m_sprite_ptr_pre->gfx = 0;
+ m_sprite_ptr_pre->code = TILES[addr+1] * 256 + TILES[addr];
+ m_sprite_ptr_pre->color = attr >> 8;
+ m_sprite_ptr_pre->flipx = flipx;
+ m_sprite_ptr_pre->flipy = flipy;
if (zoomx == 32 && zoomy == 32)
- m_gfxdecode->gfx(0)->prio_transpen(bitmap,cliprect,
- TILES[addr+1] * 256 + TILES[addr],
- attr >> 8,
- flipx, flipy,
- x + dx * 16, y + dy * 16,
- screen.priority(),
- pri[(attr & 0xc0) >> 6],trans_pen);
+ {
+ m_sprite_ptr_pre->x = x + dx * 16;
+ m_sprite_ptr_pre->y = y + dy * 16;
+ }
else
- m_gfxdecode->gfx(0)->prio_zoom_transpen(bitmap,cliprect,
- TILES[addr+1] * 256 + TILES[addr],
- attr >> 8,
- flipx, flipy,
- x + (dx * zoomx) / 2, y + (dy * zoomy) / 2,
- zoomx << 11,zoomy << 11,
- screen.priority(),pri[(attr & 0xc0) >> 6],trans_pen);
+ {
+ m_sprite_ptr_pre->x = x + (dx * zoomx) / 2;
+ m_sprite_ptr_pre->y = y + (dy * zoomy) / 2;
+ }
+ m_sprite_ptr_pre->zoomx = zoomx << 11;
+ m_sprite_ptr_pre->zoomy = zoomy << 11;
+ m_sprite_ptr_pre->primask = pri[(attr & 0xc0) >> 6];
+ m_sprite_ptr_pre++;
code++;
}
}
}
}
+void psikyo_state::draw_sprites(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
+{
+ struct sprite_t *sprite_ptr = m_sprite_ptr_pre;
+ u32 transmask = 0;
+ if (m_sprite_ctrl & 4) transmask |= (1 << 0);
+ if (m_sprite_ctrl & 8) transmask |= (1 << 15);
+ while (sprite_ptr != m_spritelist.get())
+ {
+ sprite_ptr--;
-
+ if (sprite_ptr->zoomx == 0x10000 && sprite_ptr->zoomy == 0x10000)
+ {
+ m_gfxdecode->gfx(sprite_ptr->gfx)->prio_transmask(bitmap,cliprect,
+ sprite_ptr->code,
+ sprite_ptr->color,
+ sprite_ptr->flipx,sprite_ptr->flipy,
+ sprite_ptr->x,sprite_ptr->y,
+ screen.priority(),sprite_ptr->primask,transmask);
+ }
+ else
+ {
+ m_gfxdecode->gfx(sprite_ptr->gfx)->prio_zoom_transmask(bitmap,cliprect,
+ sprite_ptr->code,
+ sprite_ptr->color,
+ sprite_ptr->flipx,sprite_ptr->flipy,
+ sprite_ptr->x,sprite_ptr->y,
+ sprite_ptr->zoomx,sprite_ptr->zoomy,
+ screen.priority(),sprite_ptr->primask,transmask);
+ }
+ }
+}
/***************************************************************************
@@ -414,21 +427,20 @@ void psikyo_state::draw_sprites_bootleg( screen_device &screen, bitmap_ind16 &bi
***************************************************************************/
-int psikyo_state::tilemap_width( int size )
+u16 psikyo_state::tilemap_width(u8 size)
{
return (0x80 * 16) >> size;
}
-uint32_t psikyo_state::screen_update_psikyo(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
+u32 psikyo_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{
- uint16_t bgpen = 0;
+ u16 bgpen = 0;
int i, layers_ctrl = -1;
- uint32_t tmsize[2];
+ u32 tmsize[2];
- uint32_t scrollx[2]{ m_vregs[0x406 / 4], m_vregs[0x40e / 4] }, scrolly[2]{ m_vregs[0x402 / 4], m_vregs[0x40a / 4] };
- uint32_t layer_ctrl[2]{ m_vregs[0x412 / 4], m_vregs[0x416 / 4] };
- uint32_t spr_ctrl = m_spritebuf[1][0x1ffe / 4];
+ u32 scrollx[2]{ m_vregs[0x406 / 4], m_vregs[0x40e / 4] }, scrolly[2]{ m_vregs[0x402 / 4], m_vregs[0x40a / 4] };
+ u32 layer_ctrl[2]{ m_vregs[0x412 / 4], m_vregs[0x416 / 4] };
tilemap_t *tmptilemap[2];
@@ -468,15 +480,15 @@ uint32_t psikyo_state::screen_update_psikyo(screen_device &screen, bitmap_ind16
/* For gfx banking for s1945jn/gunbird/btlkroad */
if (m_ka302c_banking)
{
- psikyo_switch_banks(layer, (layer_ctrl[layer] & 0x400) >> 10);
+ switch_bgbanks(layer, (layer_ctrl[layer] & 0x400) >> 10);
}
switch ((layer_ctrl[layer] & 0x00c0) >> 6)
{
- case 0: tmsize[layer] = 1; break;
- case 1: tmsize[layer] = 2; break;
- case 2: tmsize[layer] = 3; break;
- default:tmsize[layer] = 0; break;
+ case 0: tmsize[layer] = 1; break;
+ case 1: tmsize[layer] = 2; break;
+ case 2: tmsize[layer] = 3; break;
+ default: tmsize[layer] = 0; break;
}
tmptilemap[layer] = m_tilemap[layer][tmsize[layer]];
@@ -499,7 +511,7 @@ uint32_t psikyo_state::screen_update_psikyo(screen_device &screen, bitmap_ind16
}
for (i = 0; i < 256; i++) /* 256 screen lines */
{
- int x0 = ((uint16_t *)m_vregs.target())[BYTE_XOR_BE((layer * 0x200)/2 + (i >> tile_rowscroll))];
+ int x0 = ((u16 *)m_vregs.target())[BYTE_XOR_BE((layer * 0x200)/2 + (i >> tile_rowscroll))];
tmptilemap[layer]->set_scrollx(
(i + scrolly[layer]) % (tilemap_width(tmsize[layer])),
scrollx[layer] + x0 );
@@ -539,7 +551,7 @@ uint32_t psikyo_state::screen_update_psikyo(screen_device &screen, bitmap_ind16
tmptilemap[1]->draw(screen, bitmap, cliprect, layer_ctrl[1] & 2 ? TILEMAP_DRAW_OPAQUE : 0, 2);
if (layers_ctrl & 4)
- draw_sprites(screen, bitmap, cliprect, (spr_ctrl & 4 ? 0 : 15));
+ draw_sprites(screen, bitmap, cliprect);
return 0;
}
@@ -552,16 +564,15 @@ uint32_t psikyo_state::screen_update_psikyo(screen_device &screen, bitmap_ind16
*/
-uint32_t psikyo_state::screen_update_psikyo_bootleg(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
+u32 psikyo_state::screen_update_bootleg(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{
- uint16_t bgpen = 0;
+ u16 bgpen = 0;
int i, layers_ctrl = -1;
- uint32_t tmsize[2];
+ u32 tmsize[2];
- uint32_t scrollx[2]{ m_vregs[0x406 / 4], m_vregs[0x40e / 4] }, scrolly[2]{ m_vregs[0x402 / 4], m_vregs[0x40a / 4] };
- uint32_t layer_ctrl[2]{ m_vregs[0x412 / 4], m_vregs[0x416 / 4] };
- uint32_t spr_ctrl = m_spritebuf[1][0x1ffe / 4];
+ u32 scrollx[2]{ m_vregs[0x406 / 4], m_vregs[0x40e / 4] }, scrolly[2]{ m_vregs[0x402 / 4], m_vregs[0x40a / 4] };
+ u32 layer_ctrl[2]{ m_vregs[0x412 / 4], m_vregs[0x416 / 4] };
tilemap_t *tmptilemap[2];
@@ -601,15 +612,15 @@ uint32_t psikyo_state::screen_update_psikyo_bootleg(screen_device &screen, bitma
/* For gfx banking for s1945jn/gunbird/btlkroad */
if (m_ka302c_banking)
{
- psikyo_switch_banks(layer, (layer_ctrl[layer] & 0x400) >> 10);
+ switch_bgbanks(layer, (layer_ctrl[layer] & 0x400) >> 10);
}
switch ((layer_ctrl[layer] & 0x00c0) >> 6)
{
- case 0: tmsize[layer] = 1; break;
- case 1: tmsize[layer] = 2; break;
- case 2: tmsize[layer] = 3; break;
- default: tmsize[layer] = 0; break;
+ case 0: tmsize[layer] = 1; break;
+ case 1: tmsize[layer] = 2; break;
+ case 2: tmsize[layer] = 3; break;
+ default: tmsize[layer] = 0; break;
}
tmptilemap[layer] = m_tilemap[layer][tmsize[layer]];
@@ -633,7 +644,7 @@ uint32_t psikyo_state::screen_update_psikyo_bootleg(screen_device &screen, bitma
}
for (i = 0; i < 256; i++) /* 256 screen lines */
{
- int x0 = ((uint16_t *)m_vregs.target())[BYTE_XOR_BE((layer * 0x200)/2 + (i >> tile_rowscroll))];
+ int x0 = ((u16 *)m_vregs.target())[BYTE_XOR_BE((layer * 0x200)/2 + (i >> tile_rowscroll))];
tmptilemap[layer]->set_scrollx(
(i + scrolly[layer]) % (tilemap_width(tmsize[layer])),
scrollx[layer] + x0 );
@@ -673,18 +684,28 @@ uint32_t psikyo_state::screen_update_psikyo_bootleg(screen_device &screen, bitma
tmptilemap[1]->draw(screen, bitmap, cliprect, layer_ctrl[1] & 2 ? TILEMAP_DRAW_OPAQUE : 0, 2);
if (layers_ctrl & 4)
- draw_sprites_bootleg(screen, bitmap, cliprect, (spr_ctrl & 4 ? 0 : 15));
+ draw_sprites(screen, bitmap, cliprect);
return 0;
}
-WRITE_LINE_MEMBER(psikyo_state::screen_vblank_psikyo)
+WRITE_LINE_MEMBER(psikyo_state::screen_vblank)
+{
+ // rising edge
+ if (state)
+ {
+ get_sprites();
+ m_spriteram->copy();
+ }
+}
+
+WRITE_LINE_MEMBER(psikyo_state::screen_vblank_bootleg)
{
// rising edge
if (state)
{
- memcpy(m_spritebuf[1].get(), m_spritebuf[0].get(), 0x2000);
- memcpy(m_spritebuf[0].get(), m_spriteram, 0x2000);
+ get_sprites_bootleg(); // TODO : it's seems differ?
+ m_spriteram->copy();
}
}
diff --git a/src/mame/video/psikyosh.cpp b/src/mame/video/psikyosh.cpp
index 7c8d5d39636..a0f87ca5676 100644
--- a/src/mame/video/psikyosh.cpp
+++ b/src/mame/video/psikyosh.cpp
@@ -2,7 +2,7 @@
// copyright-holders:David Haywood, Paul Priest
/*
Psikyo PS6406B (PS3v1/PS5/PS5v2):
-See src/drivers/psikyosh.c for more info
+See src/mame/drivers/psikyosh.cpp for more info
Hardware is extremely flexible (and luckily underused, although we now have a relatively complete implementation :). Many effects are subtle (e.g. fades, scanline effects).
diff --git a/src/mame/video/rallyx.cpp b/src/mame/video/rallyx.cpp
index 8df8741902d..0823b3fc8e7 100644
--- a/src/mame/video/rallyx.cpp
+++ b/src/mame/video/rallyx.cpp
@@ -80,18 +80,18 @@ void rallyx_state::rallyx_palette(palette_device &palette) const
bit0 = BIT(color_prom[i], 0);
bit1 = BIT(color_prom[i], 1);
bit2 = BIT(color_prom[i], 2);
- int const r = combine_3_weights(rweights, bit0, bit1, bit2);
+ int const r = combine_weights(rweights, bit0, bit1, bit2);
// green component
bit0 = BIT(color_prom[i], 3);
bit1 = BIT(color_prom[i], 4);
bit2 = BIT(color_prom[i], 5);
- int const g = combine_3_weights(gweights, bit0, bit1, bit2);
+ int const g = combine_weights(gweights, bit0, bit1, bit2);
// blue component
bit0 = BIT(color_prom[i], 6);
bit1 = BIT(color_prom[i], 7);
- int const b = combine_2_weights(bweights, bit0, bit1);
+ int const b = combine_weights(bweights, bit0, bit1);
palette.set_indirect_color(i, rgb_t(r, g, b));
}
@@ -141,18 +141,18 @@ void rallyx_state::jungler_palette(palette_device &palette) const
bit0 = BIT(color_prom[i], 0);
bit1 = BIT(color_prom[i], 1);
bit2 = BIT(color_prom[i], 2);
- int const r = combine_3_weights(rweights, bit0, bit1, bit2);
+ int const r = combine_weights(rweights, bit0, bit1, bit2);
// green component
bit0 = BIT(color_prom[i], 3);
bit1 = BIT(color_prom[i], 4);
bit2 = BIT(color_prom[i], 5);
- int const g = combine_3_weights(gweights, bit0, bit1, bit2);
+ int const g = combine_weights(gweights, bit0, bit1, bit2);
// blue component
bit0 = BIT(color_prom[i], 6);
bit1 = BIT(color_prom[i], 7);
- int const b = combine_2_weights(bweights, bit0, bit1);
+ int const b = combine_weights(bweights, bit0, bit1);
palette.set_indirect_color(i, rgb_t(r, g, b));
}
@@ -165,17 +165,17 @@ void rallyx_state::jungler_palette(palette_device &palette) const
// red component
bit0 = BIT((i - 0x20), 0);
bit1 = BIT((i - 0x20), 1);
- int const r = combine_2_weights(rweights_star, bit0, bit1);
+ int const r = combine_weights(rweights_star, bit0, bit1);
// green component
bit0 = BIT(i - 0x20, 2);
bit1 = BIT(i - 0x20, 3);
- int const g = combine_2_weights(gweights_star, bit0, bit1);
+ int const g = combine_weights(gweights_star, bit0, bit1);
// blue component
bit0 = BIT(i - 0x20, 4);
bit1 = BIT(i - 0x20, 5);
- int const b = combine_2_weights(bweights_star, bit0, bit1);
+ int const b = combine_weights(bweights_star, bit0, bit1);
palette.set_indirect_color(i, rgb_t(r, g, b));
}
diff --git a/src/mame/video/redalert.cpp b/src/mame/video/redalert.cpp
index e045aee9e26..2c7294427df 100644
--- a/src/mame/video/redalert.cpp
+++ b/src/mame/video/redalert.cpp
@@ -80,9 +80,9 @@ void redalert_state::get_pens(pen_t *pens)
uint8_t b0_bit = (data >> 0) & 0x01;
uint8_t b1_bit = (data >> 7) & 0x01;
- uint8_t r = combine_3_weights(charmap_rg_weights, r0_bit, r1_bit, r2_bit);
- uint8_t g = combine_3_weights(charmap_rg_weights, g0_bit, g1_bit, g2_bit);
- uint8_t b = combine_2_weights(charmap_b_weights, b0_bit, b1_bit);
+ uint8_t r = combine_weights(charmap_rg_weights, r0_bit, r1_bit, r2_bit);
+ uint8_t g = combine_weights(charmap_rg_weights, g0_bit, g1_bit, g2_bit);
+ uint8_t b = combine_weights(charmap_b_weights, b0_bit, b1_bit);
pens[offs] = rgb_t(r, g, b);
}
@@ -402,28 +402,27 @@ uint32_t redalert_state::screen_update_panther(screen_device &screen, bitmap_rgb
*
*************************************/
-MACHINE_CONFIG_START(redalert_state::redalert_video_common)
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(32*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 1*8, 31*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(redalert_state, screen_update_redalert)
-MACHINE_CONFIG_END
-
-MACHINE_CONFIG_START(redalert_state::redalert_video)
+void redalert_state::redalert_video_common(machine_config &config)
+{
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_refresh_hz(60);
+ m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ m_screen->set_size(32*8, 32*8);
+ m_screen->set_visarea(0*8, 32*8-1, 1*8, 31*8-1);
+ m_screen->set_screen_update(FUNC(redalert_state::screen_update_redalert));
+}
+void redalert_state::redalert_video(machine_config &config)
+{
MCFG_VIDEO_START_OVERRIDE(redalert_state,redalert)
redalert_video_common(config);
+}
-MACHINE_CONFIG_END
-
-MACHINE_CONFIG_START(redalert_state::ww3_video)
-
+void redalert_state::ww3_video(machine_config &config)
+{
MCFG_VIDEO_START_OVERRIDE(redalert_state, ww3 )
redalert_video_common(config);
-
-MACHINE_CONFIG_END
+}
/*************************************
@@ -432,26 +431,21 @@ MACHINE_CONFIG_END
*
*************************************/
-MACHINE_CONFIG_START(redalert_state::demoneye_video)
+void redalert_state::demoneye_video(machine_config &config)
+{
MCFG_VIDEO_START_OVERRIDE(redalert_state,redalert)
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(32*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 1*8, 31*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(redalert_state, screen_update_demoneye)
-MACHINE_CONFIG_END
+ redalert_video_common(config);
+ m_screen->set_screen_update(FUNC(redalert_state::screen_update_demoneye));
+}
-MACHINE_CONFIG_START(redalert_state::panther_video)
+void redalert_state::panther_video(machine_config &config)
+{
MCFG_VIDEO_START_OVERRIDE(redalert_state,ww3)
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(32*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 1*8, 31*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(redalert_state, screen_update_panther)
-MACHINE_CONFIG_END
+ redalert_video_common(config);
+
+ m_screen->set_screen_update(FUNC(redalert_state::screen_update_panther));
+}
diff --git a/src/mame/video/redclash.cpp b/src/mame/video/redclash.cpp
index 83e4e00ce1e..7737b711fe3 100644
--- a/src/mame/video/redclash.cpp
+++ b/src/mame/video/redclash.cpp
@@ -2,7 +2,7 @@
// copyright-holders:David Haywood
/***************************************************************************
- video.c
+ redclash.cpp
Functions to emulate the video hardware of the machine.
@@ -21,7 +21,7 @@
***************************************************************************/
-void redclash_state::redclash_palette(palette_device &palette) const
+void redclash_state::palette(palette_device &palette) const
{
const uint8_t *color_prom = memregion("proms")->base();
@@ -98,13 +98,13 @@ void redclash_state::redclash_palette(palette_device &palette) const
}
-WRITE8_MEMBER( redclash_state::redclash_videoram_w )
+WRITE8_MEMBER( redclash_state::videoram_w )
{
m_videoram[offset] = data;
m_fg_tilemap->mark_tile_dirty(offset);
}
-WRITE8_MEMBER( redclash_state::redclash_gfxbank_w )
+WRITE8_MEMBER( redclash_state::gfxbank_w )
{
if (m_gfxbank != (data & 0x01))
{
@@ -113,12 +113,12 @@ WRITE8_MEMBER( redclash_state::redclash_gfxbank_w )
}
}
-WRITE8_MEMBER( redclash_state::redclash_flipscreen_w )
+WRITE8_MEMBER( redclash_state::flipscreen_w )
{
flip_screen_set(data & 0x01);
}
-WRITE8_MEMBER( redclash_state::redclash_star_reset_w )
+WRITE8_MEMBER( redclash_state::star_reset_w )
{
m_stars->set_enable(true);
}
@@ -138,33 +138,30 @@ void redclash_state::video_start()
m_fg_tilemap->set_transparent_pen(0);
}
-void redclash_state::redclash_draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect)
+void redclash_state::draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect)
{
- uint8_t *spriteram = m_spriteram;
- int i, offs;
-
- for (offs = m_spriteram.bytes() - 0x20; offs >= 0; offs -= 0x20)
+ for (int offs = m_spriteram.bytes() - 0x20; offs >= 0; offs -= 0x20)
{
- i = 0;
- while (i < 0x20 && spriteram[offs + i] != 0)
+ int i = 0;
+ while (i < 0x20 && m_spriteram[offs + i] != 0)
i += 4;
while (i > 0)
{
i -= 4;
- if (spriteram[offs + i] & 0x80)
+ if (m_spriteram[offs + i] & 0x80)
{
- int color = spriteram[offs + i + 2] & 0x0f;
- int sx = spriteram[offs + i + 3];
- int sy = offs / 4 + (spriteram[offs + i] & 0x07);
+ int color = m_spriteram[offs + i + 2] & 0x0f;
+ int sx = m_spriteram[offs + i + 3];
+ int sy = offs / 4 + (m_spriteram[offs + i] & 0x07);
- switch ((spriteram[offs + i] & 0x18) >> 3)
+ switch ((m_spriteram[offs + i] & 0x18) >> 3)
{
case 3: /* 24x24 */
{
- int code = ((spriteram[offs + i + 1] & 0xf0) >> 4) + ((m_gfxbank & 1) << 4);
+ int code = ((m_spriteram[offs + i + 1] & 0xf0) >> 4) + ((m_gfxbank & 1) << 4);
m_gfxdecode->gfx(3)->transpen(bitmap,cliprect,
code,
@@ -181,10 +178,10 @@ void redclash_state::redclash_draw_sprites(bitmap_ind16 &bitmap, const rectangle
}
case 2: /* 16x16 */
- if (spriteram[offs + i] & 0x20) /* zero hour spaceships */
+ if (m_spriteram[offs + i] & 0x20) /* zero hour spaceships */
{
- int code = ((spriteram[offs + i + 1] & 0xf8) >> 3) + ((m_gfxbank & 1) << 5);
- int bank = (spriteram[offs + i + 1] & 0x02) >> 1;
+ int code = ((m_spriteram[offs + i + 1] & 0xf8) >> 3) + ((m_gfxbank & 1) << 5);
+ int bank = (m_spriteram[offs + i + 1] & 0x02) >> 1;
m_gfxdecode->gfx(4+bank)->transpen(bitmap,cliprect,
code,
@@ -194,7 +191,7 @@ void redclash_state::redclash_draw_sprites(bitmap_ind16 &bitmap, const rectangle
}
else
{
- int code = ((spriteram[offs + i + 1] & 0xf0) >> 4) + ((m_gfxbank & 1) << 4);
+ int code = ((m_spriteram[offs + i + 1] & 0xf0) >> 4) + ((m_gfxbank & 1) << 4);
m_gfxdecode->gfx(2)->transpen(bitmap,cliprect,
code,
@@ -206,7 +203,7 @@ void redclash_state::redclash_draw_sprites(bitmap_ind16 &bitmap, const rectangle
case 1: /* 8x8 */
m_gfxdecode->gfx(1)->transpen(bitmap,cliprect,
- spriteram[offs + i + 1],// + 4 * (spriteram[offs + i + 2] & 0x10),
+ m_spriteram[offs + i + 1],// + 4 * (m_spriteram[offs + i + 2] & 0x10),
color,
0,0,
sx,sy - 16,0);
@@ -221,11 +218,9 @@ void redclash_state::redclash_draw_sprites(bitmap_ind16 &bitmap, const rectangle
}
}
-void redclash_state::redclash_draw_bullets( bitmap_ind16 &bitmap, const rectangle &cliprect )
+void redclash_state::draw_bullets( bitmap_ind16 &bitmap, const rectangle &cliprect )
{
- int offs;
-
- for (offs = 0; offs < 0x20; offs++)
+ for (int offs = 0; offs < 0x20; offs++)
{
// sx = m_videoramoffs];
int sx = 8 * offs + (m_videoram[offs] & 0x07); /* ?? */
@@ -241,19 +236,19 @@ void redclash_state::redclash_draw_bullets( bitmap_ind16 &bitmap, const rectangl
}
}
-WRITE_LINE_MEMBER(redclash_state::screen_vblank_redclash)
+WRITE_LINE_MEMBER(redclash_state::screen_vblank)
{
// falling edge
if (!state)
m_stars->update_state();
}
-uint32_t redclash_state::screen_update_redclash(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
+uint32_t redclash_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{
bitmap.fill(m_palette->black_pen(), cliprect);
m_stars->draw(bitmap, cliprect, 0x60, true, 0x00, 0xff);
- redclash_draw_sprites(bitmap, cliprect);
- redclash_draw_bullets(bitmap, cliprect);
+ draw_sprites(bitmap, cliprect);
+ draw_bullets(bitmap, cliprect);
m_fg_tilemap->draw(screen, bitmap, cliprect, 0, 0);
return 0;
}
diff --git a/src/mame/video/rocnrope.cpp b/src/mame/video/rocnrope.cpp
index b0b029b0903..f8a253cddec 100644
--- a/src/mame/video/rocnrope.cpp
+++ b/src/mame/video/rocnrope.cpp
@@ -53,18 +53,18 @@ void rocnrope_state::rocnrope_palette(palette_device &palette) const
bit0 = BIT(color_prom[i], 0);
bit1 = BIT(color_prom[i], 1);
bit2 = BIT(color_prom[i], 2);
- int const r = combine_3_weights(rweights, bit0, bit1, bit2);
+ int const r = combine_weights(rweights, bit0, bit1, bit2);
// green component
bit0 = BIT(color_prom[i], 3);
bit1 = BIT(color_prom[i], 4);
bit2 = BIT(color_prom[i], 5);
- int const g = combine_3_weights(gweights, bit0, bit1, bit2);
+ int const g = combine_weights(gweights, bit0, bit1, bit2);
// blue component
bit0 = BIT(color_prom[i], 6);
bit1 = BIT(color_prom[i], 7);
- int const b = combine_2_weights(bweights, bit0, bit1);
+ int const b = combine_weights(bweights, bit0, bit1);
palette.set_indirect_color(i, rgb_t(r, g, b));
}
diff --git a/src/mame/video/sbasketb.cpp b/src/mame/video/sbasketb.cpp
index fb0381d0bb6..f7fc1e0345c 100644
--- a/src/mame/video/sbasketb.cpp
+++ b/src/mame/video/sbasketb.cpp
@@ -50,21 +50,21 @@ void sbasketb_state::sbasketb_palette(palette_device &palette) const
bit1 = BIT(color_prom[i | 0x000], 1);
bit2 = BIT(color_prom[i | 0x000], 2);
bit3 = BIT(color_prom[i | 0x000], 3);
- int const r = combine_4_weights(rweights, bit0, bit1, bit2, bit3);
+ int const r = combine_weights(rweights, bit0, bit1, bit2, bit3);
// green component
bit0 = BIT(color_prom[i | 0x100], 0);
bit1 = BIT(color_prom[i | 0x100], 1);
bit2 = BIT(color_prom[i | 0x100], 2);
bit3 = BIT(color_prom[i | 0x100], 3);
- int const g = combine_4_weights(gweights, bit0, bit1, bit2, bit3);
+ int const g = combine_weights(gweights, bit0, bit1, bit2, bit3);
// blue component
bit0 = BIT(color_prom[i | 0x200], 0);
bit1 = BIT(color_prom[i | 0x200], 1);
bit2 = BIT(color_prom[i | 0x200], 2);
bit3 = BIT(color_prom[i | 0x200], 3);
- int const b = combine_4_weights(bweights, bit0, bit1, bit2, bit3);
+ int const b = combine_weights(bweights, bit0, bit1, bit2, bit3);
palette.set_indirect_color(i, rgb_t(r, g, b));
}
diff --git a/src/mame/video/segag80r.cpp b/src/mame/video/segag80r.cpp
index c92f4db537e..af00f8240f1 100644
--- a/src/mame/video/segag80r.cpp
+++ b/src/mame/video/segag80r.cpp
@@ -95,18 +95,18 @@ void segag80r_state::g80_set_palette_entry(int entry, uint8_t data)
bit0 = (r >> 0) & 0x01;
bit1 = (r >> 1) & 0x01;
bit2 = (r >> 2) & 0x01;
- r = combine_3_weights(m_rweights, bit0, bit1, bit2);
+ r = combine_weights(m_rweights, bit0, bit1, bit2);
/* green component */
bit0 = (g >> 0) & 0x01;
bit1 = (g >> 1) & 0x01;
bit2 = (g >> 2) & 0x01;
- g = combine_3_weights(m_gweights, bit0, bit1, bit2);
+ g = combine_weights(m_gweights, bit0, bit1, bit2);
/* blue component */
bit0 = (b >> 0) & 0x01;
bit1 = (b >> 1) & 0x01;
- b = combine_2_weights(m_bweights, bit0, bit1);
+ b = combine_weights(m_bweights, bit0, bit1);
m_palette->set_pen_color(entry, rgb_t(r, g, b));
}
@@ -138,17 +138,17 @@ void segag80r_state::spaceod_bg_init_palette()
/* red component */
bit0 = (r >> 0) & 0x01;
bit1 = (r >> 1) & 0x01;
- r = combine_2_weights(trweights, bit0, bit1);
+ r = combine_weights(trweights, bit0, bit1);
/* green component */
bit0 = (g >> 0) & 0x01;
bit1 = (g >> 1) & 0x01;
- g = combine_2_weights(tgweights, bit0, bit1);
+ g = combine_weights(tgweights, bit0, bit1);
/* blue component */
bit0 = (b >> 0) & 0x01;
bit1 = (b >> 1) & 0x01;
- b = combine_2_weights(tbweights, bit0, bit1);
+ b = combine_weights(tbweights, bit0, bit1);
m_palette->set_pen_color(64 + i, rgb_t(r, g, b));
}
diff --git a/src/mame/video/segaybd.cpp b/src/mame/video/segaybd.cpp
index fb93042f19e..f00b47d1886 100644
--- a/src/mame/video/segaybd.cpp
+++ b/src/mame/video/segaybd.cpp
@@ -55,8 +55,6 @@ uint32_t segaybd_state::screen_update(screen_device &screen, bitmap_ind16 &bitma
uint16_t *src = &sprites.pix(y);
uint8_t *pri = &screen.priority().pix(y);
-
-
for (int x = rect->min_x; x <= rect->max_x; x++)
{
// only process written pixels
diff --git a/src/mame/video/seibu_crtc.cpp b/src/mame/video/seibu_crtc.cpp
index 9abc3453b0a..059fdff517b 100644
--- a/src/mame/video/seibu_crtc.cpp
+++ b/src/mame/video/seibu_crtc.cpp
@@ -279,7 +279,7 @@ seibu_crtc_device::seibu_crtc_device(const machine_config &mconfig, const char *
m_layer_scroll_cb(*this),
m_reg_1a_cb(*this),
m_layer_scroll_base_cb(*this),
- m_space_config("vregs", ENDIANNESS_LITTLE, 16, 7, 0, address_map_constructor(), address_map_constructor(FUNC(seibu_crtc_device::seibu_crtc_vregs), this))
+ m_space_config("vregs", ENDIANNESS_LITTLE, 16, 7, 0, address_map_constructor(FUNC(seibu_crtc_device::seibu_crtc_vregs), this))
{
}
diff --git a/src/mame/video/seta2.cpp b/src/mame/video/seta2.cpp
index 8114ec08b43..d1aaef6758b 100644
--- a/src/mame/video/seta2.cpp
+++ b/src/mame/video/seta2.cpp
@@ -621,11 +621,12 @@ void seta2_state::draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect)
TIMER_CALLBACK_MEMBER(seta2_state::raster_timer_done)
{
- if (m_tmp68301)
+ auto *tmp68301 = dynamic_cast<tmp68301_device *>(m_maincpu.target());
+ if (tmp68301)
{
if (m_rasterenabled & 1)
{
- m_tmp68301->external_interrupt_1();
+ tmp68301->external_interrupt_1();
logerror("external int (vpos is %d)\n", m_screen->vpos());
m_screen->update_partial(m_screen->vpos() - 1);
}
diff --git a/src/mame/video/shaolins.cpp b/src/mame/video/shaolins.cpp
index d78d5169dc3..eab6c5d169b 100644
--- a/src/mame/video/shaolins.cpp
+++ b/src/mame/video/shaolins.cpp
@@ -50,21 +50,21 @@ void shaolins_state::shaolins_palette(palette_device &palette) const
bit1 = BIT(color_prom[i | 0x000], 1);
bit2 = BIT(color_prom[i | 0x000], 2);
bit3 = BIT(color_prom[i | 0x000], 3);
- int const r = combine_4_weights(rweights, bit0, bit1, bit2, bit3);
+ int const r = combine_weights(rweights, bit0, bit1, bit2, bit3);
// green component
bit0 = BIT(color_prom[i | 0x100], 0);
bit1 = BIT(color_prom[i | 0x100], 1);
bit2 = BIT(color_prom[i | 0x100], 2);
bit3 = BIT(color_prom[i | 0x100], 3);
- int const g = combine_4_weights(gweights, bit0, bit1, bit2, bit3);
+ int const g = combine_weights(gweights, bit0, bit1, bit2, bit3);
// blue component
bit0 = BIT(color_prom[i | 0x200], 0);
bit1 = BIT(color_prom[i | 0x200], 1);
bit2 = BIT(color_prom[i | 0x200], 2);
bit3 = BIT(color_prom[i | 0x200], 3);
- int const b = combine_4_weights(bweights, bit0, bit1, bit2, bit3);
+ int const b = combine_weights(bweights, bit0, bit1, bit2, bit3);
palette.set_indirect_color(i, rgb_t(r, g, b));
}
diff --git a/src/mame/video/snookr10.cpp b/src/mame/video/snookr10.cpp
index 34ea2d82094..ecc5529d71f 100644
--- a/src/mame/video/snookr10.cpp
+++ b/src/mame/video/snookr10.cpp
@@ -68,18 +68,18 @@ void snookr10_state::snookr10_palette(palette_device &palette) const
bit0 = BIT(color_prom[i], 0);
bit1 = BIT(color_prom[i], 1);
bit2 = BIT(color_prom[i], 2);
- int const r = combine_3_weights(weights_r, bit0, bit1, bit2);
+ int const r = combine_weights(weights_r, bit0, bit1, bit2);
// blue component
bit0 = BIT(color_prom[i], 3);
bit1 = BIT(color_prom[i], 4);
bit2 = BIT(color_prom[i], 5);
- int const b = combine_3_weights(weights_b, bit0, bit1, bit2);
+ int const b = combine_weights(weights_b, bit0, bit1, bit2);
// green component
bit0 = BIT(color_prom[i], 6);
bit1 = BIT(color_prom[i], 7);
- int const g = combine_2_weights(weights_g, bit0, bit1);
+ int const g = combine_weights(weights_g, bit0, bit1);
palette.set_pen_color(i, rgb_t(r, g, b));
}
@@ -132,18 +132,18 @@ void snookr10_state::apple10_palette(palette_device &palette) const
bit0 = BIT(color_prom[i], 0);
bit1 = BIT(color_prom[i], 1);
bit2 = BIT(color_prom[i], 2);
- int const r = combine_3_weights(weights_r, bit0, bit1, bit2);
+ int const r = combine_weights(weights_r, bit0, bit1, bit2);
/* blue component */
bit0 = BIT(color_prom[i], 3);
bit1 = BIT(color_prom[i], 4);
bit2 = BIT(color_prom[i], 5);
- int const b = combine_3_weights(weights_b, bit0, bit1, bit2);
+ int const b = combine_weights(weights_b, bit0, bit1, bit2);
/* green component */
bit0 = BIT(color_prom[i], 6);
bit1 = BIT(color_prom[i], 7);
- int const g = combine_2_weights(weights_g, bit0, bit1);
+ int const g = combine_weights(weights_g, bit0, bit1);
/* encrypted color matrix */
int const cn = bitswap<8>(i, 4, 5, 6, 7, 2, 3, 0, 1);
@@ -199,18 +199,18 @@ void snookr10_state::crystalc_palette(palette_device &palette) const
bit0 = BIT(color_prom[i], 0);
bit1 = BIT(color_prom[i], 1);
bit2 = BIT(color_prom[i], 2);
- int const r = combine_3_weights(weights_r, bit0, bit1, bit2);
+ int const r = combine_weights(weights_r, bit0, bit1, bit2);
// blue component
bit0 = BIT(color_prom[i], 3);
bit1 = BIT(color_prom[i], 4);
bit2 = BIT(color_prom[i], 5);
- int const b = combine_3_weights(weights_b, bit0, bit1, bit2);
+ int const b = combine_weights(weights_b, bit0, bit1, bit2);
// green component
bit0 = BIT(color_prom[i], 6);
bit1 = BIT(color_prom[i], 7);
- int const g = combine_2_weights(weights_g, bit0, bit1);
+ int const g = combine_weights(weights_g, bit0, bit1);
// encrypted color matrix
int const cn = bitswap<8>(i, 7, 5, 6, 4, 3, 2, 1, 0);
diff --git a/src/mame/video/spacefb.cpp b/src/mame/video/spacefb.cpp
index 69c4e4e5f2b..8556da42b7a 100644
--- a/src/mame/video/spacefb.cpp
+++ b/src/mame/video/spacefb.cpp
@@ -135,9 +135,9 @@ void spacefb_state::get_starfield_pens(pen_t *pens)
uint8_t ra = (((i >> 4) & 0x01) || background_red) && !disable_star_field;
uint8_t rb = ((i >> 5) & 0x01) && color_contrast_r && !disable_star_field;
- uint8_t r = combine_3_weights(m_color_weights_rg, 0, rb, ra);
- uint8_t g = combine_3_weights(m_color_weights_rg, 0, gb, ga);
- uint8_t b = combine_2_weights(m_color_weights_b, bb, ba);
+ uint8_t r = combine_weights(m_color_weights_rg, 0, rb, ra);
+ uint8_t g = combine_weights(m_color_weights_rg, 0, gb, ga);
+ uint8_t b = combine_weights(m_color_weights_b, bb, ba);
pens[i] = rgb_t(r, g, b);
}
@@ -233,9 +233,9 @@ void spacefb_state::get_sprite_pens(pen_t *pens)
uint8_t b1 = (data >> 6) & 0x01;
uint8_t b2 = (data >> 7) & 0x01;
- uint8_t r = combine_3_weights(m_color_weights_rg, r0, r1, r2);
- uint8_t g = combine_3_weights(m_color_weights_rg, g0, g1, g2);
- uint8_t b = combine_2_weights(m_color_weights_b, b1, b2);
+ uint8_t r = combine_weights(m_color_weights_rg, r0, r1, r2);
+ uint8_t g = combine_weights(m_color_weights_rg, g0, g1, g2);
+ uint8_t b = combine_weights(m_color_weights_b, b1, b2);
if (i >> 4)
{
diff --git a/src/mame/video/speedatk.cpp b/src/mame/video/speedatk.cpp
index 64120bd1896..49df817e4cd 100644
--- a/src/mame/video/speedatk.cpp
+++ b/src/mame/video/speedatk.cpp
@@ -61,12 +61,12 @@ WRITE8_MEMBER(speedatk_state::m6845_w)
if(offset == 0)
{
m_crtc_index = data;
- m_crtc->address_w(space,0,data);
+ m_crtc->address_w(data);
}
else
{
m_crtc_vreg[m_crtc_index] = data;
- m_crtc->register_w(space,0,data);
+ m_crtc->register_w(data);
}
}
diff --git a/src/mame/video/stactics.cpp b/src/mame/video/stactics.cpp
index 5f9ab186403..ed74bb411e2 100644
--- a/src/mame/video/stactics.cpp
+++ b/src/mame/video/stactics.cpp
@@ -426,15 +426,16 @@ uint32_t stactics_state::screen_update(screen_device &screen, bitmap_ind16 &bitm
*
*************************************/
-MACHINE_CONFIG_START(stactics_state::stactics_video)
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_VIDEO_ATTRIBUTES(VIDEO_ALWAYS_UPDATE)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(32*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 0*8, 30*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(stactics_state, screen_update)
- MCFG_SCREEN_PALETTE("palette")
+void stactics_state::stactics_video(machine_config &config)
+{
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_video_attributes(VIDEO_ALWAYS_UPDATE);
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ screen.set_size(32*8, 32*8);
+ screen.set_visarea(0*8, 32*8-1, 0*8, 30*8-1);
+ screen.set_screen_update(FUNC(stactics_state::screen_update));
+ screen.set_palette("palette");
PALETTE(config, "palette", FUNC(stactics_state::stactics_palette), 0x400);
-MACHINE_CONFIG_END
+}
diff --git a/src/mame/video/stadhero.cpp b/src/mame/video/stadhero.cpp
index 0e1b68fcc4a..acabf0aec90 100644
--- a/src/mame/video/stadhero.cpp
+++ b/src/mame/video/stadhero.cpp
@@ -6,7 +6,7 @@
*********************************************************************
- MXC-06 chip to produce sprites, see dec0.c
+ MXC-06 chip to produce sprites, see decmxc06.cpp
BAC-06 chip for background
??? for text layer
diff --git a/src/mame/video/stfight_dev.cpp b/src/mame/video/stfight_dev.cpp
index d558473f77f..18c81092dea 100644
--- a/src/mame/video/stfight_dev.cpp
+++ b/src/mame/video/stfight_dev.cpp
@@ -109,18 +109,19 @@ static GFXDECODE_START( gfx_stfight )
GFXDECODE_ENTRY( "spr_gfx", 0x0000, spritelayout, 0, 32 )
GFXDECODE_END
-MACHINE_CONFIG_START(stfight_video_device::device_add_mconfig)
+void stfight_video_device::device_add_mconfig(machine_config &config)
+{
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(32*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(stfight_video_device, screen_update_stfight)
- MCFG_SCREEN_PALETTE("^palette")
-
- MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "^palette", gfx_stfight)
-MACHINE_CONFIG_END
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_refresh_hz(60);
+ m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ m_screen->set_size(32*8, 32*8);
+ m_screen->set_visarea(0*8, 32*8-1, 2*8, 30*8-1);
+ m_screen->set_screen_update(FUNC(stfight_video_device::screen_update_stfight));
+ m_screen->set_palette(m_palette);
+
+ GFXDECODE(config, m_gfxdecode, m_palette, gfx_stfight);
+}
/*
Graphics ROM Format
diff --git a/src/mame/video/super80.cpp b/src/mame/video/super80.cpp
index 204860f1e66..c7ea76e3100 100644
--- a/src/mame/video/super80.cpp
+++ b/src/mame/video/super80.cpp
@@ -449,12 +449,12 @@ WRITE8_MEMBER( super80_state::super80v_10_w )
{
data &= 0x1f;
m_mc6845_ind = data;
- m_crtc->address_w( space, 0, data );
+ m_crtc->address_w(data);
}
WRITE8_MEMBER( super80_state::super80v_11_w )
{
m_mc6845_reg[m_mc6845_ind] = data & mc6845_mask[m_mc6845_ind]; /* save data in register */
- m_crtc->register_w( space, 0, data );
+ m_crtc->register_w(data);
if ((m_mc6845_ind > 8) && (m_mc6845_ind < 12)) mc6845_cursor_configure(); /* adjust cursor shape - remove when mame fixed */
}
diff --git a/src/mame/video/system16.cpp b/src/mame/video/system16.cpp
index d7e66cf9c21..8fdec421bf1 100644
--- a/src/mame/video/system16.cpp
+++ b/src/mame/video/system16.cpp
@@ -131,19 +131,19 @@ WRITE16_MEMBER(segas1x_bootleg_state::sys16_paletteram_w)
int b4 = (newword >> 11) & 1;
/* Normal colors */
- r = combine_6_weights(m_weights[0][0], r0, r1, r2, r3, r4, 0);
- g = combine_6_weights(m_weights[0][1], g0, g1, g2, g3, g4, 0);
- b = combine_6_weights(m_weights[0][2], b0, b1, b2, b3, b4, 0);
+ r = combine_weights(m_weights[0][0], r0, r1, r2, r3, r4, 0);
+ g = combine_weights(m_weights[0][1], g0, g1, g2, g3, g4, 0);
+ b = combine_weights(m_weights[0][2], b0, b1, b2, b3, b4, 0);
/* Shadow colors */
- rs = combine_6_weights(m_weights[1][0], r0, r1, r2, r3, r4, 0);
- gs = combine_6_weights(m_weights[1][1], g0, g1, g2, g3, g4, 0);
- bs = combine_6_weights(m_weights[1][2], b0, b1, b2, b3, b4, 0);
+ rs = combine_weights(m_weights[1][0], r0, r1, r2, r3, r4, 0);
+ gs = combine_weights(m_weights[1][1], g0, g1, g2, g3, g4, 0);
+ bs = combine_weights(m_weights[1][2], b0, b1, b2, b3, b4, 0);
/* Highlight colors */
- //rh = combine_6_weights(m_weights[1][0], r0, r1, r2, r3, r4, 1);
- //gh = combine_6_weights(m_weights[1][1], g0, g1, g2, g3, g4, 1);
- //bh = combine_6_weights(m_weights[1][2], b0, b1, b2, b3, b4, 1);
+ //rh = combine_weights(m_weights[1][0], r0, r1, r2, r3, r4, 1);
+ //gh = combine_weights(m_weights[1][1], g0, g1, g2, g3, g4, 1);
+ //bh = combine_weights(m_weights[1][2], b0, b1, b2, b3, b4, 1);
m_palette->set_pen_color(offset, rgb_t(r, g, b) );
diff --git a/src/mame/video/taitosj.cpp b/src/mame/video/taitosj.cpp
index 69f6896e82e..4a4366eb79c 100644
--- a/src/mame/video/taitosj.cpp
+++ b/src/mame/video/taitosj.cpp
@@ -112,21 +112,21 @@ void taitosj_state::set_pens()
bit1 = (~val >> 7) & 0x01;
val = m_paletteram[(i << 1) | 0x00];
bit2 = (~val >> 0) & 0x01;
- r = combine_3_weights(rweights, bit0, bit1, bit2);
+ r = combine_weights(rweights, bit0, bit1, bit2);
/* green component */
val = m_paletteram[(i << 1) | 0x01];
bit0 = (~val >> 3) & 0x01;
bit1 = (~val >> 4) & 0x01;
bit2 = (~val >> 5) & 0x01;
- g = combine_3_weights(gweights, bit0, bit1, bit2);
+ g = combine_weights(gweights, bit0, bit1, bit2);
/* blue component */
val = m_paletteram[(i << 1) | 0x01];
bit0 = (~val >> 0) & 0x01;
bit1 = (~val >> 1) & 0x01;
bit2 = (~val >> 2) & 0x01;
- b = combine_3_weights(bweights, bit0, bit1, bit2);
+ b = combine_weights(bweights, bit0, bit1, bit2);
m_palette->set_pen_color(i, rgb_t(r, g, b));
}
diff --git a/src/mame/video/thomson.cpp b/src/mame/video/thomson.cpp
index ff72cbfe2d6..a3e386b1e3c 100644
--- a/src/mame/video/thomson.cpp
+++ b/src/mame/video/thomson.cpp
@@ -9,12 +9,12 @@
**********************************************************************/
#include "emu.h"
-#include <math.h>
#include "includes/thomson.h"
+#include <math.h>
-#define VERBOSE 0
-#define LOG(x) do { if (VERBOSE) logerror x; } while (0)
+//#define VERBOSE 1
+#include "logmacro.h"
/* One GPL is what is drawn in 1 us by the video system in the active window.
@@ -162,7 +162,7 @@ struct thom_vsignal thomson_state::thom_get_lightpen_vsignal( int xdec, int ydec
void thomson_state::thom_set_lightpen_callback( int nb )
{
- LOG (( "%f thom_set_lightpen_callback called\n", machine().time().as_double()));
+ LOG("%f thom_set_lightpen_callback called\n", machine().time().as_double());
m_thom_lightpen_nb = nb;
}
@@ -268,7 +268,7 @@ void thomson_state::thom_set_border_color( unsigned index )
assert( index < 16 );
if ( index != m_thom_border_index )
{
- LOG (( "thom_set_border_color: %i at line %i col %i\n", index, thom_video_elapsed() / 64, thom_video_elapsed() % 64 ));
+ LOG("thom_set_border_color: %i at line %i col %i\n", index, thom_video_elapsed() / 64, thom_video_elapsed() % 64);
m_thom_border_index = index;
thom_border_changed();
}
@@ -286,7 +286,7 @@ void thomson_state::thom_set_palette( unsigned index, uint16_t color )
if ( m_thom_pal[ index ] == color )
return;
- LOG (( "thom_set_palette: %i to %03x at line %i col %i\n", index, color, thom_video_elapsed() / 64, thom_video_elapsed() % 64 ));
+ LOG("thom_set_palette: %i to %03x at line %i col %i\n", index, color, thom_video_elapsed() / 64, thom_video_elapsed() % 64);
m_thom_pal[ index ] = color;
if ( index == m_thom_border_index )
@@ -303,7 +303,7 @@ void thomson_state::thom_set_video_mode( unsigned mode )
if ( mode != m_thom_vmode )
{
- LOG (( "thom_set_video_mode: %i at line %i, col %i\n", mode, thom_video_elapsed() / 64, thom_video_elapsed() % 64 ));
+ LOG("thom_set_video_mode: %i at line %i, col %i\n", mode, thom_video_elapsed() / 64, thom_video_elapsed() % 64);
m_thom_vmode = mode;
thom_gplinfo_changed();
m_thom_vstate_dirty = 1;
@@ -315,10 +315,11 @@ void thomson_state::thom_set_video_mode( unsigned mode )
void thomson_state::thom_set_video_page( unsigned page )
{
- assert( page < THOM_NB_PAGES )
- ;
- if ( page != m_thom_vpage ) {
- LOG (( "thom_set_video_page: %i at line %i col %i\n", page, thom_video_elapsed() / 64, thom_video_elapsed() % 64 ));
+ assert( page < THOM_NB_PAGES );
+
+ if ( page != m_thom_vpage )
+ {
+ LOG("thom_set_video_page: %i at line %i col %i\n", page, thom_video_elapsed() / 64, thom_video_elapsed() % 64);
m_thom_vpage = page;
thom_gplinfo_changed();
m_thom_vstate_dirty = 1;
@@ -568,6 +569,41 @@ UPDATE_LOW( bitmap16 )
END_UPDATE
+/* 160x200, 16-colors, no constraint, alternate encoding, undocumented, tested */
+
+static constexpr unsigned tbl_bit16[4][4] = {
+ { 0, 2, 8, 10 },
+ { 1, 3, 9, 11 },
+ { 4, 6, 12, 14 },
+ { 5, 7, 13, 15 } };
+
+UPDATE_HI( bitmap16alt )
+{
+ unsigned p0 = tbl_bit16[ramb >> 6][rama >> 6];
+ unsigned p1 = tbl_bit16[(ramb >> 4) & 3][(rama >> 4) & 3];
+ unsigned p2 = tbl_bit16[(ramb >> 2) & 3][(rama >> 2) & 3];
+ unsigned p3 = tbl_bit16[ramb & 3][rama & 3];
+ dst[ 0] = dst[ 1] = dst[ 2] = dst[ 3] = pal[ p0 ];
+ dst[ 4] = dst[ 5] = dst[ 6] = dst[ 7] = pal[ p1 ];
+ dst[ 8] = dst[ 9] = dst[10] = dst[11] = pal[ p2 ];
+ dst[12] = dst[13] = dst[14] = dst[15] = pal[ p3 ];
+}
+END_UPDATE
+
+UPDATE_LOW( bitmap16alt )
+{
+ unsigned p0 = tbl_bit16[ramb >> 6][rama >> 6];
+ unsigned p1 = tbl_bit16[(ramb >> 4) & 3][(rama >> 4) & 3];
+ unsigned p2 = tbl_bit16[(ramb >> 2) & 3][(rama >> 2) & 3];
+ unsigned p3 = tbl_bit16[ramb & 3][rama & 3];
+ dst[0] = dst[1] = pal[ p0 ];
+ dst[2] = dst[3] = pal[ p1 ];
+ dst[4] = dst[5] = pal[ p2 ];
+ dst[6] = dst[7] = pal[ p3 ];
+}
+END_UPDATE
+
+
/* 640x200 (80 text column), 2-colors, no constraint */
@@ -785,7 +821,8 @@ static const thom_scandraw thom_scandraw_funcs[THOM_VMODE_NB][2] =
FUN(to770), FUN(mo5), FUN(bitmap4), FUN(bitmap4alt), FUN(mode80),
FUN(bitmap16), FUN(page1), FUN(page2), FUN(overlay), FUN(overlay3),
FUN(to9), FUN(mode80_to9),
- FUN(bitmap4althalf), FUN(mo5alt), FUN(overlayhalf),
+ FUN(bitmap4althalf), FUN(mo5alt), FUN(overlayhalf),
+ FUN(bitmap16alt)
};
@@ -915,7 +952,7 @@ uint32_t thomson_state::screen_update_thom(screen_device &screen, bitmap_ind16 &
rectangle lrect(0, xbleft - 1, 0, 0);
rectangle rrect(xbright, xright - 1, 0, 0);
- //LOG (( "%f thom: video update called\n", machine().time().as_double()));
+ //LOG("%f thom: video update called\n", machine().time().as_double());
/* upper border */
for ( y = 0; y < THOM_BORDER_HEIGHT - m_thom_bheight; y++ )
@@ -1013,7 +1050,7 @@ uint32_t thomson_state::screen_update_thom(screen_device &screen, bitmap_ind16 &
TIMER_CALLBACK_MEMBER( thomson_state::thom_set_init )
{
int init = param;
- LOG (( "%f thom_set_init: %i, at line %i col %i\n", machine().time().as_double(), init, thom_video_elapsed() / 64, thom_video_elapsed() % 64 ));
+ LOG("%f thom_set_init: %i, at line %i col %i\n", machine().time().as_double(), init, thom_video_elapsed() / 64, thom_video_elapsed() % 64);
if ( m_thom_init_cb )
(this->*m_thom_init_cb)( init );
@@ -1032,7 +1069,7 @@ WRITE_LINE_MEMBER(thomson_state::thom_vblank)
uint16_t b = 0;
struct thom_vsignal l = thom_get_lightpen_vsignal( 0, -1, 0 );
- LOG (( "%f thom: video eof called\n", machine().time().as_double() ));
+ LOG("%f thom: video eof called\n", machine().time().as_double());
/* floppy indicator count */
if ( m_thom_floppy_wcount )
@@ -1120,7 +1157,7 @@ static const uint16_t mo5_pal_init[16] =
VIDEO_START_MEMBER( thomson_state, thom )
{
- LOG (( "thom: video start called\n" ));
+ LOG("thom: video start called\n");
/* scan-line state */
memset( m_thom_border_l, 0xff, sizeof( m_thom_border_l ) );
@@ -1200,7 +1237,7 @@ void thomson_state::thom_configure_palette(double gamma, const uint16_t* pal, pa
void thomson_state::thom_palette(palette_device &palette)
{
- LOG (( "thom: palette init called\n" ));
+ LOG("thom: palette init called\n");
/* TO8 and later use an EF9369 color palette chip
The spec shows a built-in gamma correction for gamma=2.8
@@ -1216,7 +1253,7 @@ void thomson_state::thom_palette(palette_device &palette)
void thomson_state::mo5_palette(palette_device &palette)
{
- LOG (( "thom: MO5 palette init called\n" ));
+ LOG("thom: MO5 palette init called\n");
/* The MO5 has a different fixed palette than the TO7/70.
We use a smaller gamma correction which gives intutively better
diff --git a/src/mame/video/tia.cpp b/src/mame/video/tia.cpp
index c6230e2f418..1c60324d6a7 100644
--- a/src/mame/video/tia.cpp
+++ b/src/mame/video/tia.cpp
@@ -126,112 +126,112 @@ void tia_ntsc_video_device::tia_ntsc_palette(palette_device &palette) const
********************************************************************/
/*********************************
Phase Shift 24.7
- { 0.000, 0.000 },
- { 0.192, -0.127 },
- { 0.239, -0.052 },
- { 0.244, 0.030 },
- { 0.201, 0.108 },
- { 0.125, 0.166 },
- { 0.026, 0.194 },
- { -0.080, 0.185 },
- { -0.169, 0.145 },
- { -0.230, 0.077 },
- { -0.247, -0.006 },
- { -0.220, -0.087 },
- { -0.152, -0.153 },
- { -0.057, -0.189 },
- { 0.049, -0.193 },
- { 0.144, -0.161 }
+ { 0.000, 0.000 },
+ { 0.192, -0.127 },
+ { 0.239, -0.052 },
+ { 0.244, 0.030 },
+ { 0.201, 0.108 },
+ { 0.125, 0.166 },
+ { 0.026, 0.194 },
+ { -0.080, 0.185 },
+ { -0.169, 0.145 },
+ { -0.230, 0.077 },
+ { -0.247, -0.006 },
+ { -0.220, -0.087 },
+ { -0.152, -0.153 },
+ { -0.057, -0.189 },
+ { 0.049, -0.193 },
+ { 0.144, -0.161 }
Phase Shift 25.2
- { 0.000, 0.000 },
- { 0.192, -0.127 },
- { 0.239, -0.052 },
- { 0.244, 0.033 },
- { 0.200, 0.113 },
- { 0.119, 0.169 },
- { 0.013, 0.195 },
- { -0.094, 0.183 },
- { -0.182, 0.136 },
- { -0.237, 0.062 },
- { -0.245, -0.020 },
- { -0.210, -0.103 },
- { -0.131, -0.164 },
- { -0.027, -0.193 },
- { 0.079, -0.187 },
- { 0.169, -0.145 }
+ { 0.000, 0.000 },
+ { 0.192, -0.127 },
+ { 0.239, -0.052 },
+ { 0.244, 0.033 },
+ { 0.200, 0.113 },
+ { 0.119, 0.169 },
+ { 0.013, 0.195 },
+ { -0.094, 0.183 },
+ { -0.182, 0.136 },
+ { -0.237, 0.062 },
+ { -0.245, -0.020 },
+ { -0.210, -0.103 },
+ { -0.131, -0.164 },
+ { -0.027, -0.193 },
+ { 0.079, -0.187 },
+ { 0.169, -0.145 }
Phase Shift 25.7
- { 0.000, 0.000 },
- { 0.192, -0.127 },
- { 0.243, -0.049 },
- { 0.242, 0.038 },
- { 0.196, 0.116 },
- { 0.109, 0.172 },
- { 0.005, 0.196 },
- { -0.104, 0.178 },
- { -0.192, 0.127 },
- { -0.241, 0.051 },
- { -0.244, -0.037 },
- { -0.197, -0.115 },
- { -0.112, -0.173 },
- { -0.004, -0.197 },
- { 0.102, -0.179 },
- { 0.190, -0.128 }
+ { 0.000, 0.000 },
+ { 0.192, -0.127 },
+ { 0.243, -0.049 },
+ { 0.242, 0.038 },
+ { 0.196, 0.116 },
+ { 0.109, 0.172 },
+ { 0.005, 0.196 },
+ { -0.104, 0.178 },
+ { -0.192, 0.127 },
+ { -0.241, 0.051 },
+ { -0.244, -0.037 },
+ { -0.197, -0.115 },
+ { -0.112, -0.173 },
+ { -0.004, -0.197 },
+ { 0.102, -0.179 },
+ { 0.190, -0.128 }
Phase Shift 26.7
- { 0.000, 0.000 },
- { 0.192, -0.127 },
- { 0.242, -0.046 },
- { 0.240, 0.044 },
- { 0.187, 0.125 },
- { 0.092, 0.180 },
- { -0.020, 0.195 },
- { -0.128, 0.170 },
- { -0.210, 0.107 },
- { -0.247, 0.022 },
- { -0.231, -0.067 },
- { -0.166, -0.142 },
- { -0.064, -0.188 },
- { 0.049, -0.193 },
- { 0.154, -0.155 },
- { 0.227, -0.086 }
+ { 0.000, 0.000 },
+ { 0.192, -0.127 },
+ { 0.242, -0.046 },
+ { 0.240, 0.044 },
+ { 0.187, 0.125 },
+ { 0.092, 0.180 },
+ { -0.020, 0.195 },
+ { -0.128, 0.170 },
+ { -0.210, 0.107 },
+ { -0.247, 0.022 },
+ { -0.231, -0.067 },
+ { -0.166, -0.142 },
+ { -0.064, -0.188 },
+ { 0.049, -0.193 },
+ { 0.154, -0.155 },
+ { 0.227, -0.086 }
Phase Shift 27.2
- { 0.000, 0.000 },
- { 0.192, -0.127 },
- { 0.243, -0.044 },
- { 0.239, 0.047 },
- { 0.183, 0.129 },
- { 0.087, 0.181 },
- { -0.029, 0.195 },
- { -0.138, 0.164 },
- { -0.217, 0.098 },
- { -0.246, 0.009 },
- { -0.223, -0.081 },
- { -0.149, -0.153 },
- { -0.041, -0.192 },
- { 0.073, -0.188 },
- { 0.173, -0.142 },
- { 0.235, -0.067 }
+ { 0.000, 0.000 },
+ { 0.192, -0.127 },
+ { 0.243, -0.044 },
+ { 0.239, 0.047 },
+ { 0.183, 0.129 },
+ { 0.087, 0.181 },
+ { -0.029, 0.195 },
+ { -0.138, 0.164 },
+ { -0.217, 0.098 },
+ { -0.246, 0.009 },
+ { -0.223, -0.081 },
+ { -0.149, -0.153 },
+ { -0.041, -0.192 },
+ { 0.073, -0.188 },
+ { 0.173, -0.142 },
+ { 0.235, -0.067 }
Phase Shift 27.7
- { 0.000, 0.000 },
- { 0.192, -0.127 },
- { 0.243, -0.044 },
- { 0.238, 0.051 },
- { 0.178, 0.134 },
- { 0.078, 0.184 },
- { -0.041, 0.194 },
- { -0.151, 0.158 },
- { -0.224, 0.087 },
- { -0.248, -0.005 },
- { -0.214, -0.096 },
- { -0.131, -0.164 },
- { -0.019, -0.195 },
- { 0.099, -0.182 },
- { 0.194, -0.126 },
- { 0.244, -0.042 }
+ { 0.000, 0.000 },
+ { 0.192, -0.127 },
+ { 0.243, -0.044 },
+ { 0.238, 0.051 },
+ { 0.178, 0.134 },
+ { 0.078, 0.184 },
+ { -0.041, 0.194 },
+ { -0.151, 0.158 },
+ { -0.224, 0.087 },
+ { -0.248, -0.005 },
+ { -0.214, -0.096 },
+ { -0.131, -0.164 },
+ { -0.019, -0.195 },
+ { 0.099, -0.182 },
+ { 0.194, -0.126 },
+ { 0.244, -0.042 }
*********************************/
/*********************************
diff --git a/src/mame/video/timelimt.cpp b/src/mame/video/timelimt.cpp
index 1d3f1020e55..3dc75daf30b 100644
--- a/src/mame/video/timelimt.cpp
+++ b/src/mame/video/timelimt.cpp
@@ -44,18 +44,18 @@ void timelimt_state::timelimt_palette(palette_device &palette) const
bit0 = BIT(color_prom[i], 0);
bit1 = BIT(color_prom[i], 1);
bit2 = BIT(color_prom[i], 2);
- int const r = combine_3_weights(weights_r, bit0, bit1, bit2);
+ int const r = combine_weights(weights_r, bit0, bit1, bit2);
// green component
bit0 = BIT(color_prom[i], 3);
bit1 = BIT(color_prom[i], 4);
bit2 = BIT(color_prom[i], 5);
- int const g = combine_3_weights(weights_g, bit0, bit1, bit2);
+ int const g = combine_weights(weights_g, bit0, bit1, bit2);
// blue component
bit0 = BIT(color_prom[i], 6);
bit1 = BIT(color_prom[i], 7);
- int const b = combine_2_weights(weights_b, bit0, bit1);
+ int const b = combine_weights(weights_b, bit0, bit1);
palette.set_pen_color(i, rgb_t(r, g, b));
}
diff --git a/src/mame/video/tmc1800.cpp b/src/mame/video/tmc1800.cpp
index 71110e5aa51..f672d4d2c27 100644
--- a/src/mame/video/tmc1800.cpp
+++ b/src/mame/video/tmc1800.cpp
@@ -46,13 +46,14 @@ void tmc1800_state::tmc1800_video(machine_config &config)
SCREEN(config, SCREEN_TAG, SCREEN_TYPE_RASTER);
}
-MACHINE_CONFIG_START(osc1000b_state::osc1000b_video)
- MCFG_SCREEN_ADD(SCREEN_TAG, RASTER)
- MCFG_SCREEN_UPDATE_DRIVER(osc1000b_state, screen_update)
- MCFG_SCREEN_REFRESH_RATE(50)
- MCFG_SCREEN_SIZE(320, 200)
- MCFG_SCREEN_VISIBLE_AREA(0, 319, 0, 199)
-MACHINE_CONFIG_END
+void osc1000b_state::osc1000b_video(machine_config &config)
+{
+ screen_device &screen(SCREEN(config, SCREEN_TAG, SCREEN_TYPE_RASTER));
+ screen.set_screen_update(FUNC(osc1000b_state::screen_update));
+ screen.set_refresh_hz(50);
+ screen.set_size(320, 200);
+ screen.set_visarea(0, 319, 0, 199);
+}
void tmc2000_state::tmc2000_video(machine_config &config)
{
diff --git a/src/mame/video/toaplan1.cpp b/src/mame/video/toaplan1.cpp
index 4ef0d39aed4..7a1e58c029d 100644
--- a/src/mame/video/toaplan1.cpp
+++ b/src/mame/video/toaplan1.cpp
@@ -137,67 +137,20 @@ Abnormalities:
***************************************************************************/
-TILE_GET_INFO_MEMBER(toaplan1_state::get_pf1_tile_info)
+template<unsigned Layer>
+TILE_GET_INFO_MEMBER(toaplan1_state::get_tile_info)
{
int color, tile_number, attrib;
- tile_number = m_pf1_tilevram16[2*tile_index+1] & 0x7fff;
- attrib = m_pf1_tilevram16[2*tile_index];
+ tile_number = m_tilevram[Layer][2 * tile_index + 1] & 0x7fff;
+ attrib = m_tilevram[Layer][2 * tile_index];
color = attrib & 0x3f;
SET_TILE_INFO_MEMBER(0,
tile_number,
color,
0);
// "disabled" tiles are behind everything else
- if (m_pf1_tilevram16[2*tile_index+1] & 0x8000) tileinfo.category = 16;
- else tileinfo.category = (attrib & 0xf000) >> 12;
-}
-
-TILE_GET_INFO_MEMBER(toaplan1_state::get_pf2_tile_info)
-{
- int color, tile_number, attrib;
-
- tile_number = m_pf2_tilevram16[2*tile_index+1] & 0x7fff;
- attrib = m_pf2_tilevram16[2*tile_index];
- color = attrib & 0x3f;
- SET_TILE_INFO_MEMBER(0,
- tile_number,
- color,
- 0);
- // "disabled" tiles are behind everything else
- if (m_pf2_tilevram16[2*tile_index+1] & 0x8000) tileinfo.category = 16;
- else tileinfo.category = (attrib & 0xf000) >> 12;
-}
-
-TILE_GET_INFO_MEMBER(toaplan1_state::get_pf3_tile_info)
-{
- int color, tile_number, attrib;
-
- tile_number = m_pf3_tilevram16[2*tile_index+1] & 0x7fff;
- attrib = m_pf3_tilevram16[2*tile_index];
- color = attrib & 0x3f;
- SET_TILE_INFO_MEMBER(0,
- tile_number,
- color,
- 0);
- // "disabled" tiles are behind everything else
- if (m_pf3_tilevram16[2*tile_index+1] & 0x8000) tileinfo.category = 16;
- else tileinfo.category = (attrib & 0xf000) >> 12;
-}
-
-TILE_GET_INFO_MEMBER(toaplan1_state::get_pf4_tile_info)
-{
- int color, tile_number, attrib;
-
- tile_number = m_pf4_tilevram16[2*tile_index+1] & 0x7fff;
- attrib = m_pf4_tilevram16[2*tile_index];
- color = attrib & 0x3f;
- SET_TILE_INFO_MEMBER(0,
- tile_number,
- color,
- 0);
- // "disabled" tiles are behind everything else
- if (m_pf4_tilevram16[2*tile_index+1] & 0x8000) tileinfo.category = 16;
+ if (m_tilevram[Layer][2 * tile_index + 1] & 0x8000) tileinfo.category = 16;
else tileinfo.category = (attrib & 0xf000) >> 12;
}
@@ -207,62 +160,55 @@ TILE_GET_INFO_MEMBER(toaplan1_state::get_pf4_tile_info)
***************************************************************************/
-void toaplan1_state::toaplan1_create_tilemaps()
+void toaplan1_state::create_tilemaps()
{
- m_pf1_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(toaplan1_state::get_pf1_tile_info),this), TILEMAP_SCAN_ROWS, 8, 8, 64, 64);
- m_pf2_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(toaplan1_state::get_pf2_tile_info),this), TILEMAP_SCAN_ROWS, 8, 8, 64, 64);
- m_pf3_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(toaplan1_state::get_pf3_tile_info),this), TILEMAP_SCAN_ROWS, 8, 8, 64, 64);
- m_pf4_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(toaplan1_state::get_pf4_tile_info),this), TILEMAP_SCAN_ROWS, 8, 8, 64, 64);
+ m_tilemap[0] = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(toaplan1_state::get_tile_info<0>),this), TILEMAP_SCAN_ROWS, 8, 8, 64, 64);
+ m_tilemap[1] = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(toaplan1_state::get_tile_info<1>),this), TILEMAP_SCAN_ROWS, 8, 8, 64, 64);
+ m_tilemap[2] = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(toaplan1_state::get_tile_info<2>),this), TILEMAP_SCAN_ROWS, 8, 8, 64, 64);
+ m_tilemap[3] = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(toaplan1_state::get_tile_info<3>),this), TILEMAP_SCAN_ROWS, 8, 8, 64, 64);
- m_pf1_tilemap->set_transparent_pen(0);
- m_pf2_tilemap->set_transparent_pen(0);
- m_pf3_tilemap->set_transparent_pen(0);
- m_pf4_tilemap->set_transparent_pen(0);
+ m_tilemap[0]->set_transparent_pen(0);
+ m_tilemap[1]->set_transparent_pen(0);
+ m_tilemap[2]->set_transparent_pen(0);
+ m_tilemap[3]->set_transparent_pen(0);
}
-void toaplan1_state::toaplan1_vram_alloc()
+void toaplan1_state::vram_alloc()
{
- m_pf1_tilevram16 = make_unique_clear<uint16_t[]>(TOAPLAN1_TILEVRAM_SIZE/2);
- m_pf2_tilevram16 = make_unique_clear<uint16_t[]>(TOAPLAN1_TILEVRAM_SIZE/2);
- m_pf3_tilevram16 = make_unique_clear<uint16_t[]>(TOAPLAN1_TILEVRAM_SIZE/2);
- m_pf4_tilevram16 = make_unique_clear<uint16_t[]>(TOAPLAN1_TILEVRAM_SIZE/2);
-
- save_pointer(NAME(m_pf1_tilevram16), TOAPLAN1_TILEVRAM_SIZE/2);
- save_pointer(NAME(m_pf2_tilevram16), TOAPLAN1_TILEVRAM_SIZE/2);
- save_pointer(NAME(m_pf3_tilevram16), TOAPLAN1_TILEVRAM_SIZE/2);
- save_pointer(NAME(m_pf4_tilevram16), TOAPLAN1_TILEVRAM_SIZE/2);
+ for (int i = 0; i < 4; i++)
+ {
+ m_tilevram[i] = make_unique_clear<u16[]>(TOAPLAN1_TILEVRAM_SIZE / 2);
+ save_pointer(NAME(m_tilevram[i]), TOAPLAN1_TILEVRAM_SIZE / 2, i);
+ }
#ifdef MAME_DEBUG
- m_display_pf1 = 1;
- m_display_pf2 = 1;
- m_display_pf3 = 1;
- m_display_pf4 = 1;
+ m_display_pf[0] = 1;
+ m_display_pf[1] = 1;
+ m_display_pf[2] = 1;
+ m_display_pf[3] = 1;
m_displog = 0;
#endif
}
-void toaplan1_state::toaplan1_spritevram_alloc()
+void toaplan1_state::spritevram_alloc()
{
- m_spriteram.allocate(TOAPLAN1_SPRITERAM_SIZE/2);
- m_buffered_spriteram = make_unique_clear<uint16_t[]>(TOAPLAN1_SPRITERAM_SIZE/2);
- m_spritesizeram16 = make_unique_clear<uint16_t[]>(TOAPLAN1_SPRITESIZERAM_SIZE/2);
- m_buffered_spritesizeram16 = make_unique_clear<uint16_t[]>(TOAPLAN1_SPRITESIZERAM_SIZE/2);
+ m_spriteram.allocate(TOAPLAN1_SPRITERAM_SIZE / 2);
+ m_buffered_spriteram = make_unique_clear<u16[]>(TOAPLAN1_SPRITERAM_SIZE / 2);
+ m_spritesizeram = make_unique_clear<u16[]>(TOAPLAN1_SPRITESIZERAM_SIZE / 2);
+ m_buffered_spritesizeram = make_unique_clear<u16[]>(TOAPLAN1_SPRITESIZERAM_SIZE / 2);
- save_pointer(NAME(m_buffered_spriteram), TOAPLAN1_SPRITERAM_SIZE/2);
- save_pointer(NAME(m_spritesizeram16), TOAPLAN1_SPRITESIZERAM_SIZE/2);
- save_pointer(NAME(m_buffered_spritesizeram16), TOAPLAN1_SPRITESIZERAM_SIZE/2);
+ save_pointer(NAME(m_buffered_spriteram), TOAPLAN1_SPRITERAM_SIZE / 2);
+ save_pointer(NAME(m_spritesizeram), TOAPLAN1_SPRITESIZERAM_SIZE / 2);
+ save_pointer(NAME(m_buffered_spritesizeram), TOAPLAN1_SPRITESIZERAM_SIZE / 2);
}
-void toaplan1_state::toaplan1_set_scrolls()
+void toaplan1_state::set_scrolls()
{
- m_pf1_tilemap->set_scrollx(0, (m_pf1_scrollx >> 7) - m_tiles_offsetx);
- m_pf2_tilemap->set_scrollx(0, (m_pf2_scrollx >> 7) - m_tiles_offsetx);
- m_pf3_tilemap->set_scrollx(0, (m_pf3_scrollx >> 7) - m_tiles_offsetx);
- m_pf4_tilemap->set_scrollx(0, (m_pf4_scrollx >> 7) - m_tiles_offsetx);
- m_pf1_tilemap->set_scrolly(0, (m_pf1_scrolly >> 7) - m_tiles_offsety);
- m_pf2_tilemap->set_scrolly(0, (m_pf2_scrolly >> 7) - m_tiles_offsety);
- m_pf3_tilemap->set_scrolly(0, (m_pf3_scrolly >> 7) - m_tiles_offsety);
- m_pf4_tilemap->set_scrolly(0, (m_pf4_scrolly >> 7) - m_tiles_offsety);
+ for (int i = 0; i < 4; i++)
+ {
+ m_tilemap[i]->set_scrollx(0, (m_scrollx[i] >> 7) - m_tiles_offsetx);
+ m_tilemap[i]->set_scrolly(0, (m_scrolly[i] >> 7) - m_tiles_offsety);
+ }
}
void toaplan1_state::register_common()
@@ -270,14 +216,8 @@ void toaplan1_state::register_common()
save_item(NAME(m_bcu_flipscreen));
save_item(NAME(m_fcu_flipscreen));
- save_item(NAME(m_pf1_scrollx));
- save_item(NAME(m_pf1_scrolly));
- save_item(NAME(m_pf2_scrollx));
- save_item(NAME(m_pf2_scrolly));
- save_item(NAME(m_pf3_scrollx));
- save_item(NAME(m_pf3_scrolly));
- save_item(NAME(m_pf4_scrollx));
- save_item(NAME(m_pf4_scrolly));
+ save_item(NAME(m_scrollx));
+ save_item(NAME(m_scrolly));
save_item(NAME(m_tiles_offsetx));
save_item(NAME(m_tiles_offsety));
@@ -286,25 +226,25 @@ void toaplan1_state::register_common()
}
-VIDEO_START_MEMBER(toaplan1_rallybik_state,rallybik)
+void toaplan1_rallybik_state::video_start()
{
m_spritegen->alloc_sprite_bitmap(*m_screen);
m_spritegen->gfx(0)->set_colorbase(64*16);
- toaplan1_create_tilemaps();
- toaplan1_vram_alloc();
+ create_tilemaps();
+ vram_alloc();
- m_buffered_spriteram = make_unique_clear<uint16_t[]>(m_spriteram.bytes()/2);
- save_pointer(NAME(m_buffered_spriteram), m_spriteram.bytes()/2);
+ m_buffered_spriteram = make_unique_clear<u16[]>(m_spriteram.bytes() / 2);
+ save_pointer(NAME(m_buffered_spriteram), m_spriteram.bytes() / 2);
- m_pf1_tilemap->set_scrolldx(-0x00d-6, -0x80+6);
- m_pf2_tilemap->set_scrolldx(-0x00d-4, -0x80+4);
- m_pf3_tilemap->set_scrolldx(-0x00d-2, -0x80+2);
- m_pf4_tilemap->set_scrolldx(-0x00d-0, -0x80+0);
- m_pf1_tilemap->set_scrolldy(-0x111, 0x8);
- m_pf2_tilemap->set_scrolldy(-0x111, 0x8);
- m_pf3_tilemap->set_scrolldy(-0x111, 0x8);
- m_pf4_tilemap->set_scrolldy(-0x111, 0x8);
+ m_tilemap[0]->set_scrolldx(-0x00d - 6, -0x80 + 6);
+ m_tilemap[1]->set_scrolldx(-0x00d - 4, -0x80 + 4);
+ m_tilemap[2]->set_scrolldx(-0x00d - 2, -0x80 + 2);
+ m_tilemap[3]->set_scrolldx(-0x00d - 0, -0x80 + 0);
+ m_tilemap[0]->set_scrolldy(-0x111, 0x8);
+ m_tilemap[1]->set_scrolldy(-0x111, 0x8);
+ m_tilemap[2]->set_scrolldy(-0x111, 0x8);
+ m_tilemap[3]->set_scrolldy(-0x111, 0x8);
m_bcu_flipscreen = -1;
m_fcu_flipscreen = 0;
@@ -312,20 +252,20 @@ VIDEO_START_MEMBER(toaplan1_rallybik_state,rallybik)
register_common();
}
-VIDEO_START_MEMBER(toaplan1_state,toaplan1)
+void toaplan1_state::video_start()
{
- toaplan1_create_tilemaps();
- toaplan1_vram_alloc();
- toaplan1_spritevram_alloc();
+ create_tilemaps();
+ vram_alloc();
+ spritevram_alloc();
- m_pf1_tilemap->set_scrolldx(-0x1ef-6, -0x11+6);
- m_pf2_tilemap->set_scrolldx(-0x1ef-4, -0x11+4);
- m_pf3_tilemap->set_scrolldx(-0x1ef-2, -0x11+2);
- m_pf4_tilemap->set_scrolldx(-0x1ef-0, -0x11+0);
- m_pf1_tilemap->set_scrolldy(-0x101, -0xff);
- m_pf2_tilemap->set_scrolldy(-0x101, -0xff);
- m_pf3_tilemap->set_scrolldy(-0x101, -0xff);
- m_pf4_tilemap->set_scrolldy(-0x101, -0xff);
+ m_tilemap[0]->set_scrolldx(-0x1ef - 6, -0x11 + 6);
+ m_tilemap[1]->set_scrolldx(-0x1ef - 4, -0x11 + 4);
+ m_tilemap[2]->set_scrolldx(-0x1ef - 2, -0x11 + 2);
+ m_tilemap[3]->set_scrolldx(-0x1ef - 0, -0x11 + 0);
+ m_tilemap[0]->set_scrolldy(-0x101, -0xff);
+ m_tilemap[1]->set_scrolldy(-0x101, -0xff);
+ m_tilemap[2]->set_scrolldy(-0x101, -0xff);
+ m_tilemap[3]->set_scrolldy(-0x101, -0xff);
m_bcu_flipscreen = -1;
m_fcu_flipscreen = 0;
@@ -340,14 +280,14 @@ VIDEO_START_MEMBER(toaplan1_state,toaplan1)
***************************************************************************/
-READ16_MEMBER(toaplan1_state::toaplan1_frame_done_r)
+u16 toaplan1_state::frame_done_r()
{
return m_screen->vblank();
}
-WRITE16_MEMBER(toaplan1_state::toaplan1_tile_offsets_w)
+WRITE16_MEMBER(toaplan1_state::tile_offsets_w)
{
- if ( offset == 0 )
+ if (offset == 0)
{
COMBINE_DATA(&m_tiles_offsetx);
logerror("Tiles_offsetx now = %08x\n", m_tiles_offsetx);
@@ -357,49 +297,46 @@ WRITE16_MEMBER(toaplan1_state::toaplan1_tile_offsets_w)
COMBINE_DATA(&m_tiles_offsety);
logerror("Tiles_offsety now = %08x\n", m_tiles_offsety);
}
- toaplan1_set_scrolls();
+ set_scrolls();
}
-WRITE16_MEMBER(toaplan1_state::toaplan1_bcu_flipscreen_w)
+void toaplan1_state::bcu_flipscreen_w(u8 data)
{
- if (ACCESSING_BITS_0_7 && (data != m_bcu_flipscreen))
+ if (data != m_bcu_flipscreen)
{
- logerror("Setting BCU controller flipscreen port to %04x\n",data);
+ logerror("Setting BCU controller flipscreen port to %02x\n",data);
m_bcu_flipscreen = data & 0x01; /* 0x0001 = flip, 0x0000 = no flip */
machine().tilemap().set_flip_all((data ? (TILEMAP_FLIPY | TILEMAP_FLIPX) : 0));
- toaplan1_set_scrolls();
+ set_scrolls();
}
}
-WRITE16_MEMBER(toaplan1_state::toaplan1_fcu_flipscreen_w)
+void toaplan1_state::fcu_flipscreen_w(u8 data)
{
- if (ACCESSING_BITS_8_15)
- {
- logerror("Setting FCU controller flipscreen port to %04x\n",data);
- m_fcu_flipscreen = data & 0x8000; /* 0x8000 = flip, 0x0000 = no flip */
- }
+ logerror("Setting FCU controller flipscreen port to %02x\n",data);
+ m_fcu_flipscreen = data & 0x80; /* 0x80 = flip, 0x00 = no flip */
}
-READ16_MEMBER(toaplan1_state::toaplan1_spriteram_offs_r)/// this aint really needed ?
+u16 toaplan1_state::spriteram_offs_r() // this aint really needed ?
{
return m_spriteram_offs;
}
-WRITE16_MEMBER(toaplan1_state::toaplan1_spriteram_offs_w)
+void toaplan1_state::spriteram_offs_w(offs_t offset, u16 data, u16 mem_mask)
{
COMBINE_DATA(&m_spriteram_offs);
}
-WRITE16_MEMBER(toaplan1_state::toaplan1_bgpalette_w)
+void toaplan1_state::bgpalette_w(offs_t offset, u16 data, u16 mem_mask)
{
COMBINE_DATA(&m_bgpaletteram[offset]);
data = m_bgpaletteram[offset];
m_palette->set_pen_color(offset, pal5bit(data>>0), pal5bit(data>>5), pal5bit(data>>10));
}
-WRITE16_MEMBER(toaplan1_state::toaplan1_fgpalette_w)
+void toaplan1_state::fgpalette_w(offs_t offset, u16 data, u16 mem_mask)
{
COMBINE_DATA(&m_fgpaletteram[offset]);
data = m_fgpaletteram[offset];
@@ -407,17 +344,17 @@ WRITE16_MEMBER(toaplan1_state::toaplan1_fgpalette_w)
}
-READ16_MEMBER(toaplan1_state::toaplan1_spriteram16_r)
+u16 toaplan1_state::spriteram_r()
{
- return m_spriteram[m_spriteram_offs & ((TOAPLAN1_SPRITERAM_SIZE/2)-1)];
+ return m_spriteram[m_spriteram_offs & ((TOAPLAN1_SPRITERAM_SIZE / 2)-1)];
}
-WRITE16_MEMBER(toaplan1_state::toaplan1_spriteram16_w)
+void toaplan1_state::spriteram_w(offs_t offset, u16 data, u16 mem_mask)
{
- COMBINE_DATA(&m_spriteram[m_spriteram_offs & ((TOAPLAN1_SPRITERAM_SIZE/2)-1)]);
+ COMBINE_DATA(&m_spriteram[m_spriteram_offs & ((TOAPLAN1_SPRITERAM_SIZE / 2)-1)]);
#ifdef MAME_DEBUG
- if (m_spriteram_offs >= (TOAPLAN1_SPRITERAM_SIZE/2))
+ if (m_spriteram_offs >= (TOAPLAN1_SPRITERAM_SIZE / 2))
{
logerror("Sprite_RAM_word_w, %08x out of range !\n", m_spriteram_offs);
return;
@@ -427,17 +364,17 @@ WRITE16_MEMBER(toaplan1_state::toaplan1_spriteram16_w)
m_spriteram_offs++;
}
-READ16_MEMBER(toaplan1_state::toaplan1_spritesizeram16_r)
+u16 toaplan1_state::spritesizeram_r()
{
- return m_spritesizeram16[m_spriteram_offs & ((TOAPLAN1_SPRITESIZERAM_SIZE/2)-1)];
+ return m_spritesizeram[m_spriteram_offs & ((TOAPLAN1_SPRITESIZERAM_SIZE / 2)-1)];
}
-WRITE16_MEMBER(toaplan1_state::toaplan1_spritesizeram16_w)
+void toaplan1_state::spritesizeram_w(offs_t offset, u16 data, u16 mem_mask)
{
- COMBINE_DATA(&m_spritesizeram16[m_spriteram_offs & ((TOAPLAN1_SPRITESIZERAM_SIZE/2)-1)]);
+ COMBINE_DATA(&m_spritesizeram[m_spriteram_offs & ((TOAPLAN1_SPRITESIZERAM_SIZE / 2)-1)]);
#ifdef MAME_DEBUG
- if (m_spriteram_offs >= (TOAPLAN1_SPRITESIZERAM_SIZE/2))
+ if (m_spriteram_offs >= (TOAPLAN1_SPRITESIZERAM_SIZE / 2))
{
logerror("Sprite_Size_RAM_word_w, %08x out of range !\n", m_spriteram_offs);
return;
@@ -449,17 +386,17 @@ WRITE16_MEMBER(toaplan1_state::toaplan1_spritesizeram16_w)
-WRITE16_MEMBER(toaplan1_state::toaplan1_bcu_control_w)
+void toaplan1_state::bcu_control_w(offs_t offset, u16 data)
{
logerror("BCU tile controller register:%02x now = %04x\n",offset,data);
}
-READ16_MEMBER(toaplan1_state::toaplan1_tileram_offs_r)
+u16 toaplan1_state::tileram_offs_r()
{
return m_pf_voffs;
}
-WRITE16_MEMBER(toaplan1_state::toaplan1_tileram_offs_w)
+void toaplan1_state::tileram_offs_w(offs_t offset, u16 data, u16 mem_mask)
{
if (data >= 0x4000)
logerror("Hmmm, unknown video layer being selected (%08x)\n",data);
@@ -467,28 +404,21 @@ WRITE16_MEMBER(toaplan1_state::toaplan1_tileram_offs_w)
}
-READ16_MEMBER(toaplan1_state::toaplan1_tileram16_r)
+u16 toaplan1_state::tileram_r(offs_t offset)
{
+ const int layer = m_pf_voffs >> 12;
+ const int offs = m_pf_voffs & 0xfff;
offs_t vram_offset;
- uint16_t video_data = 0;
+ u16 video_data = 0;
- switch (m_pf_voffs & 0xf000) /* Locate Layer (PlayField) */
+ switch (layer) /* Locate Layer (PlayField) */
{
- case 0x0000:
- vram_offset = ((m_pf_voffs * 2) + offset) & ((TOAPLAN1_TILEVRAM_SIZE/2)-1);
- video_data = m_pf1_tilevram16[vram_offset];
- break;
- case 0x1000:
- vram_offset = ((m_pf_voffs * 2) + offset) & ((TOAPLAN1_TILEVRAM_SIZE/2)-1);
- video_data = m_pf2_tilevram16[vram_offset];
- break;
- case 0x2000:
- vram_offset = ((m_pf_voffs * 2) + offset) & ((TOAPLAN1_TILEVRAM_SIZE/2)-1);
- video_data = m_pf3_tilevram16[vram_offset];
- break;
- case 0x3000:
- vram_offset = ((m_pf_voffs * 2) + offset) & ((TOAPLAN1_TILEVRAM_SIZE/2)-1);
- video_data = m_pf4_tilevram16[vram_offset];
+ case 0x0:
+ case 0x1:
+ case 0x2:
+ case 0x3:
+ vram_offset = ((offs * 2) + offset) & ((TOAPLAN1_TILEVRAM_SIZE / 2)-1);
+ video_data = m_tilevram[layer][vram_offset];
break;
default:
logerror("Hmmm, reading %04x from unknown playfield layer address %06x Offset:%01x !!!\n", video_data, m_pf_voffs, offset);
@@ -498,9 +428,9 @@ READ16_MEMBER(toaplan1_state::toaplan1_tileram16_r)
return video_data;
}
-READ16_MEMBER(toaplan1_rallybik_state::rallybik_tileram16_r)
+u16 toaplan1_rallybik_state::tileram_r(offs_t offset)
{
- uint16_t data = toaplan1_tileram16_r(space, offset, mem_mask);
+ u16 data = toaplan1_state::tileram_r(offset);
if (offset == 0) /* some bit lines may be stuck to others */
{
@@ -510,31 +440,21 @@ READ16_MEMBER(toaplan1_rallybik_state::rallybik_tileram16_r)
return data;
}
-WRITE16_MEMBER(toaplan1_state::toaplan1_tileram16_w)
+void toaplan1_state::tileram_w(offs_t offset, u16 data, u16 mem_mask)
{
+ const int layer = m_pf_voffs >> 12;
+ const int offs = m_pf_voffs & 0xfff;
offs_t vram_offset;
- switch (m_pf_voffs & 0xf000) /* Locate Layer (PlayField) */
+ switch (layer) /* Locate Layer (PlayField) */
{
- case 0x0000:
- vram_offset = ((m_pf_voffs * 2) + offset) & ((TOAPLAN1_TILEVRAM_SIZE/2)-1);
- COMBINE_DATA(&m_pf1_tilevram16[vram_offset]);
- m_pf1_tilemap->mark_tile_dirty(vram_offset/2);
- break;
- case 0x1000:
- vram_offset = ((m_pf_voffs * 2) + offset) & ((TOAPLAN1_TILEVRAM_SIZE/2)-1);
- COMBINE_DATA(&m_pf2_tilevram16[vram_offset]);
- m_pf2_tilemap->mark_tile_dirty(vram_offset/2);
- break;
- case 0x2000:
- vram_offset = ((m_pf_voffs * 2) + offset) & ((TOAPLAN1_TILEVRAM_SIZE/2)-1);
- COMBINE_DATA(&m_pf3_tilevram16[vram_offset]);
- m_pf3_tilemap->mark_tile_dirty(vram_offset/2);
- break;
- case 0x3000:
- vram_offset = ((m_pf_voffs * 2) + offset) & ((TOAPLAN1_TILEVRAM_SIZE/2)-1);
- COMBINE_DATA(&m_pf4_tilevram16[vram_offset]);
- m_pf4_tilemap->mark_tile_dirty(vram_offset/2);
+ case 0x0:
+ case 0x1:
+ case 0x2:
+ case 0x3:
+ vram_offset = ((offs * 2) + offset) & ((TOAPLAN1_TILEVRAM_SIZE / 2)-1);
+ COMBINE_DATA(&m_tilevram[layer][vram_offset]);
+ m_tilemap[layer]->mark_tile_dirty(vram_offset / 2);
break;
default:
logerror("Hmmm, writing %04x to unknown playfield layer address %06x Offset:%01x\n", data, m_pf_voffs, offset);
@@ -544,56 +464,48 @@ WRITE16_MEMBER(toaplan1_state::toaplan1_tileram16_w)
-READ16_MEMBER(toaplan1_state::toaplan1_scroll_regs_r)
+u16 toaplan1_state::scroll_regs_r(offs_t offset)
{
- uint16_t scroll = 0;
+ const int layer = (offset >> 1);
+ u16 scroll = 0;
- switch(offset)
+ switch (offset)
{
- case 00: scroll = m_pf1_scrollx; break;
- case 01: scroll = m_pf1_scrolly; break;
- case 02: scroll = m_pf2_scrollx; break;
- case 03: scroll = m_pf2_scrolly; break;
- case 04: scroll = m_pf3_scrollx; break;
- case 05: scroll = m_pf3_scrolly; break;
- case 06: scroll = m_pf4_scrollx; break;
- case 07: scroll = m_pf4_scrolly; break;
- default: logerror("Hmmm, reading unknown video scroll register (%08x) !!!\n",offset);
+ case 00:
+ case 02:
+ case 04:
+ case 06: scroll = m_scrollx[layer]; break;
+ case 01:
+ case 03:
+ case 05:
+ case 07: scroll = m_scrolly[layer]; break;
+ default: logerror("Hmmm, reading unknown video scroll register (%02x) !!!\n",offset);
break;
}
return scroll;
}
-WRITE16_MEMBER(toaplan1_state::toaplan1_scroll_regs_w)
+void toaplan1_state::scroll_regs_w(offs_t offset, u16 data, u16 mem_mask)
{
- switch(offset)
+ const int layer = (offset >> 1);
+ switch (offset)
{
- case 00: COMBINE_DATA(&m_pf1_scrollx); /* 1D3h */
- m_pf1_tilemap->set_scrollx(0, (m_pf1_scrollx >> 7) - m_tiles_offsetx);
- break;
- case 01: COMBINE_DATA(&m_pf1_scrolly); /* 1EBh */
- m_pf1_tilemap->set_scrolly(0, (m_pf1_scrolly >> 7) - m_tiles_offsety);
- break;
- case 02: COMBINE_DATA(&m_pf2_scrollx); /* 1D5h */
- m_pf2_tilemap->set_scrollx(0, (m_pf2_scrollx >> 7) - m_tiles_offsetx);
+ case 00: /* 1D3h */
+ case 02: /* 1D5h */
+ case 04: /* 1D7h */
+ case 06: /* 1D9h */
+ COMBINE_DATA(&m_scrollx[layer]);
+ m_tilemap[layer]->set_scrollx(0, (m_scrollx[layer] >> 7) - m_tiles_offsetx);
break;
- case 03: COMBINE_DATA(&m_pf2_scrolly); /* 1EBh */
- m_pf2_tilemap->set_scrolly(0, (m_pf2_scrolly >> 7) - m_tiles_offsety);
+ case 01: /* 1EBh */
+ case 03: /* 1EBh */
+ case 05: /* 1EBh */
+ case 07: /* 1EBh */
+ COMBINE_DATA(&m_scrolly[layer]);
+ m_tilemap[layer]->set_scrolly(0, (m_scrolly[layer] >> 7) - m_tiles_offsety);
break;
- case 04: COMBINE_DATA(&m_pf3_scrollx); /* 1D7h */
- m_pf3_tilemap->set_scrollx(0, (m_pf3_scrollx >> 7) - m_tiles_offsetx);
- break;
- case 05: COMBINE_DATA(&m_pf3_scrolly); /* 1EBh */
- m_pf3_tilemap->set_scrolly(0, (m_pf3_scrolly >> 7) - m_tiles_offsety);
- break;
- case 06: COMBINE_DATA(&m_pf4_scrollx); /* 1D9h */
- m_pf4_tilemap->set_scrollx(0, (m_pf4_scrollx >> 7) - m_tiles_offsetx);
- break;
- case 07: COMBINE_DATA(&m_pf4_scrolly); /* 1EBh */
- m_pf4_tilemap->set_scrolly(0, (m_pf4_scrolly >> 7) - m_tiles_offsety);
- break;
- default: logerror("Hmmm, writing %08x to unknown video scroll register (%08x) !!!\n",data ,offset);
+ default: logerror("Hmmm, writing %04x to unknown video scroll register (%02x) !!!\n",data ,offset);
break;
}
}
@@ -601,37 +513,37 @@ WRITE16_MEMBER(toaplan1_state::toaplan1_scroll_regs_w)
-void toaplan1_state::toaplan1_log_vram()
+void toaplan1_state::log_vram()
{
#ifdef MAME_DEBUG
- if ( machine().input().code_pressed(KEYCODE_M) )
+ if (machine().input().code_pressed(KEYCODE_M))
{
- uint16_t *spriteram16 = m_spriteram;
- uint16_t *buffered_spriteram16 = m_buffered_spriteram.get();
+ u16 *spriteram = m_spriteram;
+ u16 *buffered_spriteram = m_buffered_spriteram.get();
offs_t sprite_voffs;
while (machine().input().code_pressed(KEYCODE_M)) ;
- if (m_spritesizeram16) /* FCU controller */
+ if (m_spritesizeram) /* FCU controller */
{
int schar,sattr,sxpos,sypos,bschar,bsattr,bsxpos,bsypos;
- uint16_t *size = (uint16_t *)(m_spritesizeram16.get());
- uint16_t *bsize = (uint16_t *)(m_buffered_spritesizeram16.get());
+ u16 *size = (u16 *)(m_spritesizeram.get());
+ u16 *bsize = (u16 *)(m_buffered_spritesizeram.get());
logerror("Scrolls PF1-X PF1-Y PF2-X PF2-Y PF3-X PF3-Y PF4-X PF4-Y\n");
logerror("------> #%04x #%04x #%04x #%04x #%04x #%04x #%04x #%04x\n",
- m_pf1_scrollx, m_pf1_scrolly, m_pf2_scrollx, m_pf2_scrolly, m_pf3_scrollx, m_pf3_scrolly, m_pf4_scrollx, m_pf4_scrolly);
- for ( sprite_voffs = 0; sprite_voffs < m_spriteram.bytes()/2; sprite_voffs += 4 )
+ m_scrollx[0], m_scrolly[0], m_scrollx[1], m_scrolly[1], m_scrollx[2], m_scrolly[2], m_scrollx[3], m_scrolly[3]);
+ for (sprite_voffs = 0; sprite_voffs < m_spriteram.bytes() / 2; sprite_voffs += 4)
{
- bschar = buffered_spriteram16[sprite_voffs];
- bsattr = buffered_spriteram16[sprite_voffs + 1];
- bsxpos = buffered_spriteram16[sprite_voffs + 2];
- bsypos = buffered_spriteram16[sprite_voffs + 3];
- schar = spriteram16[sprite_voffs];
- sattr = spriteram16[sprite_voffs + 1];
- sxpos = spriteram16[sprite_voffs + 2];
- sypos = spriteram16[sprite_voffs + 3];
+ bschar = buffered_spriteram[sprite_voffs];
+ bsattr = buffered_spriteram[sprite_voffs + 1];
+ bsxpos = buffered_spriteram[sprite_voffs + 2];
+ bsypos = buffered_spriteram[sprite_voffs + 3];
+ schar = spriteram[sprite_voffs];
+ sattr = spriteram[sprite_voffs + 1];
+ sxpos = spriteram[sprite_voffs + 2];
+ sypos = spriteram[sprite_voffs + 3];
logerror("$(%04x) Tile-Attr-Xpos-Ypos Now:%04x %04x %04x.%01x %04x.%01x nxt:%04x %04x %04x.%01x %04x.%01x\n", sprite_voffs,
- schar, sattr, sxpos, size[( sattr>>6)&0x3f]&0xf, sypos,( size[( sattr>>6)&0x3f]>>4)&0xf,
- bschar,bsattr,bsxpos,bsize[(bsattr>>6)&0x3f]&0xf,bsypos,(bsize[(bsattr>>6)&0x3f]>>4)&0xf);
+ schar, sattr, sxpos, size[( sattr >> 6) & 0x3f] & 0xf, sypos,( size[( sattr >> 6) & 0x3f] >> 4) & 0xf,
+ bschar,bsattr,bsxpos,bsize[(bsattr >> 6) & 0x3f] & 0xf,bsypos,(bsize[(bsattr >> 6) & 0x3f] >> 4) & 0xf);
}
}
else /* SCU controller */
@@ -639,17 +551,17 @@ void toaplan1_state::toaplan1_log_vram()
int schar,sattr,sxpos,sypos,bschar,bsattr,bsxpos,bsypos;
logerror("Scrolls PF1-X PF1-Y PF2-X PF2-Y PF3-X PF3-Y PF4-X PF4-Y\n");
logerror("------> #%04x #%04x #%04x #%04x #%04x #%04x #%04x #%04x\n",
- m_pf1_scrollx, m_pf1_scrolly, m_pf2_scrollx, m_pf2_scrolly, m_pf3_scrollx, m_pf3_scrolly, m_pf4_scrollx, m_pf4_scrolly);
- for ( sprite_voffs = 0; sprite_voffs < m_spriteram.bytes()/2; sprite_voffs += 4 )
+ m_scrollx[0], m_scrolly[0], m_scrollx[1], m_scrolly[1], m_scrollx[2], m_scrolly[2], m_scrollx[3], m_scrolly[3]);
+ for (sprite_voffs = 0; sprite_voffs < m_spriteram.bytes() / 2; sprite_voffs += 4)
{
- bschar = buffered_spriteram16[sprite_voffs];
- bsattr = buffered_spriteram16[sprite_voffs + 1];
- bsypos = buffered_spriteram16[sprite_voffs + 2];
- bsxpos = buffered_spriteram16[sprite_voffs + 3];
- schar = spriteram16[sprite_voffs];
- sattr = spriteram16[sprite_voffs + 1];
- sypos = spriteram16[sprite_voffs + 2];
- sxpos = spriteram16[sprite_voffs + 3];
+ bschar = buffered_spriteram[sprite_voffs];
+ bsattr = buffered_spriteram[sprite_voffs + 1];
+ bsypos = buffered_spriteram[sprite_voffs + 2];
+ bsxpos = buffered_spriteram[sprite_voffs + 3];
+ schar = spriteram[sprite_voffs];
+ sattr = spriteram[sprite_voffs + 1];
+ sypos = spriteram[sprite_voffs + 2];
+ sxpos = spriteram[sprite_voffs + 3];
logerror("$(%04x) Tile-Attr-Xpos-Ypos Now:%04x %04x %04x %04x nxt:%04x %04x %04x %04x\n", sprite_voffs,
schar, sattr, sxpos, sypos,
bschar,bsattr,bsxpos, bsypos);
@@ -657,59 +569,59 @@ void toaplan1_state::toaplan1_log_vram()
}
}
- if ( machine().input().code_pressed(KEYCODE_SLASH) )
+ if (machine().input().code_pressed(KEYCODE_SLASH))
{
- uint16_t *size = (uint16_t *)(m_spritesizeram16.get());
- uint16_t *bsize = (uint16_t *)(m_buffered_spritesizeram16.get());
+ u16 *size = (u16 *)(m_spritesizeram.get());
+ u16 *bsize = (u16 *)(m_buffered_spritesizeram.get());
offs_t offs;
while (machine().input().code_pressed(KEYCODE_SLASH)) ;
- if (m_spritesizeram16) /* FCU controller */
+ if (m_spritesizeram) /* FCU controller */
{
logerror("Scrolls PF1-X PF1-Y PF2-X PF2-Y PF3-X PF3-Y PF4-X PF4-Y\n");
logerror("------> #%04x #%04x #%04x #%04x #%04x #%04x #%04x #%04x\n",
- m_pf1_scrollx, m_pf1_scrolly, m_pf2_scrollx, m_pf2_scrolly, m_pf3_scrollx, m_pf3_scrolly, m_pf4_scrollx, m_pf4_scrolly);
- for ( offs = 0; offs < (TOAPLAN1_SPRITESIZERAM_SIZE/2); offs +=4 )
+ m_scrollx[0], m_scrolly[0], m_scrollx[1], m_scrolly[1], m_scrollx[2], m_scrolly[2], m_scrollx[3], m_scrolly[3]);
+ for (offs = 0; offs < (TOAPLAN1_SPRITESIZERAM_SIZE / 2); offs += 4)
{
logerror("SizeOffs:%04x now:%04x %04x %04x %04x next: %04x %04x %04x %04x\n", offs,
- bsize[offs+0], bsize[offs+1],
- bsize[offs+2], bsize[offs+3],
- size[offs+0], size[offs+1],
- size[offs+2], size[offs+3]);
+ bsize[offs + 0], bsize[offs + 1],
+ bsize[offs + 2], bsize[offs + 3],
+ size[offs + 0], size[offs + 1],
+ size[offs + 2], size[offs + 3]);
}
}
}
- if ( machine().input().code_pressed(KEYCODE_N) )
+ if (machine().input().code_pressed(KEYCODE_N))
{
offs_t tile_voffs;
- int tchar[5], tattr[5];
+ int tchar[4], tattr[4];
while (machine().input().code_pressed(KEYCODE_N)) ; /* BCU controller */
logerror("Scrolls PF1-X PF1-Y PF2-X PF2-Y PF3-X PF3-Y PF4-X PF4-Y\n");
logerror("------> #%04x #%04x #%04x #%04x #%04x #%04x #%04x #%04x\n",
- m_pf1_scrollx, m_pf1_scrolly, m_pf2_scrollx, m_pf2_scrolly, m_pf3_scrollx, m_pf3_scrolly, m_pf4_scrollx, m_pf4_scrolly);
- for ( tile_voffs = 0; tile_voffs < (TOAPLAN1_TILEVRAM_SIZE/2); tile_voffs += 2 )
+ m_scrollx[0], m_scrolly[0], m_scrollx[1], m_scrolly[1], m_scrollx[2], m_scrolly[2], m_scrollx[3], m_scrolly[3]);
+ for (tile_voffs = 0; tile_voffs < (TOAPLAN1_TILEVRAM_SIZE / 2); tile_voffs += 2)
{
- tchar[1] = m_pf1_tilevram16[tile_voffs + 1];
- tattr[1] = m_pf1_tilevram16[tile_voffs];
- tchar[2] = m_pf2_tilevram16[tile_voffs + 1];
- tattr[2] = m_pf2_tilevram16[tile_voffs];
- tchar[3] = m_pf3_tilevram16[tile_voffs + 1];
- tattr[3] = m_pf3_tilevram16[tile_voffs];
- tchar[4] = m_pf4_tilevram16[tile_voffs + 1];
- tattr[4] = m_pf4_tilevram16[tile_voffs];
+ tchar[0] = m_tilevram[0][tile_voffs + 1];
+ tattr[0] = m_tilevram[0][tile_voffs];
+ tchar[1] = m_tilevram[1][tile_voffs + 1];
+ tattr[1] = m_tilevram[1][tile_voffs];
+ tchar[2] = m_tilevram[2][tile_voffs + 1];
+ tattr[2] = m_tilevram[2][tile_voffs];
+ tchar[3] = m_tilevram[3][tile_voffs + 1];
+ tattr[3] = m_tilevram[3][tile_voffs];
// logerror("PF3 offs:%04x Tile:%04x Attr:%04x\n", tile_voffs, tchar, tattr);
logerror("$(%04x) Attr-Tile PF1:%04x-%04x PF2:%04x-%04x PF3:%04x-%04x PF4:%04x-%04x\n", tile_voffs,
- tattr[1], tchar[1], tattr[2], tchar[2],
- tattr[3], tchar[3], tattr[4], tchar[4]);
+ tattr[0], tchar[0], tattr[1], tchar[1],
+ tattr[2], tchar[2], tattr[3], tchar[3]);
}
}
- if ( machine().input().code_pressed(KEYCODE_W) )
+ if (machine().input().code_pressed(KEYCODE_W))
{
while (machine().input().code_pressed(KEYCODE_W)) ;
logerror("Mark here\n");
}
- if ( machine().input().code_pressed(KEYCODE_E) )
+ if (machine().input().code_pressed(KEYCODE_E))
{
while (machine().input().code_pressed(KEYCODE_E)) ;
m_displog += 1;
@@ -719,35 +631,35 @@ void toaplan1_state::toaplan1_log_vram()
{
logerror("Scrolls PF1-X PF1-Y PF2-X PF2-Y PF3-X PF3-Y PF4-X PF4-Y\n");
logerror("------> #%04x #%04x #%04x #%04x #%04x #%04x #%04x #%04x\n",
- m_pf1_scrollx, m_pf1_scrolly, m_pf2_scrollx, m_pf2_scrolly, m_pf3_scrollx, m_pf3_scrolly, m_pf4_scrollx, m_pf4_scrolly);
+ m_scrollx[0], m_scrolly[0], m_scrollx[1], m_scrolly[1], m_scrollx[2], m_scrolly[2], m_scrollx[3], m_scrolly[3]);
}
- if ( machine().input().code_pressed(KEYCODE_L) ) /* Turn Playfield 4 on/off */
+ if (machine().input().code_pressed(KEYCODE_L)) /* Turn Playfield 4 on/off */
{
while (machine().input().code_pressed(KEYCODE_L)) ;
- m_display_pf4 += 1;
- m_display_pf4 &= 1;
- m_pf4_tilemap->enable(m_display_pf4);
+ m_display_pf[3] += 1;
+ m_display_pf[3] &= 1;
+ m_tilemap[3]->enable(m_display_pf[3]);
}
- if ( machine().input().code_pressed(KEYCODE_K) ) /* Turn Playfield 3 on/off */
+ if (machine().input().code_pressed(KEYCODE_K)) /* Turn Playfield 3 on/off */
{
while (machine().input().code_pressed(KEYCODE_K)) ;
- m_display_pf3 += 1;
- m_display_pf3 &= 1;
- m_pf3_tilemap->enable(m_display_pf3);
+ m_display_pf[2] += 1;
+ m_display_pf[2] &= 1;
+ m_tilemap[2]->enable(m_display_pf[2]);
}
- if ( machine().input().code_pressed(KEYCODE_J) ) /* Turn Playfield 2 on/off */
+ if (machine().input().code_pressed(KEYCODE_J)) /* Turn Playfield 2 on/off */
{
while (machine().input().code_pressed(KEYCODE_J)) ;
- m_display_pf2 += 1;
- m_display_pf2 &= 1;
- m_pf2_tilemap->enable(m_display_pf2);
+ m_display_pf[1] += 1;
+ m_display_pf[1] &= 1;
+ m_tilemap[1]->enable(m_display_pf[1]);
}
- if ( machine().input().code_pressed(KEYCODE_H) ) /* Turn Playfield 1 on/off */
+ if (machine().input().code_pressed(KEYCODE_H)) /* Turn Playfield 1 on/off */
{
while (machine().input().code_pressed(KEYCODE_H)) ;
- m_display_pf1 += 1;
- m_display_pf1 &= 1;
- m_pf1_tilemap->enable(m_display_pf1);
+ m_display_pf[0] += 1;
+ m_display_pf[0] &= 1;
+ m_tilemap[0]->enable(m_display_pf[0]);
}
#endif
}
@@ -759,31 +671,31 @@ void toaplan1_state::toaplan1_log_vram()
***************************************************************************/
// custom function to draw a single sprite. needed to keep correct sprites - sprites and sprites - tilemaps priorities
-static void toaplan1_draw_sprite_custom(screen_device &screen, bitmap_ind16 &dest_bmp,const rectangle &clip,gfx_element *gfx,
- uint32_t code,uint32_t color,int flipx,int flipy,int sx,int sy,
+static void draw_sprite_custom(screen_device &screen, bitmap_ind16 &dest_bmp, const rectangle &clip, gfx_element *gfx,
+ u32 code, u32 color, int flipx, int flipy, int sx, int sy,
int priority)
{
- int pal_base = gfx->colorbase() + gfx->granularity() * (color % gfx->colors());
- const uint8_t *source_base = gfx->get_data(code % gfx->elements());
+ const u32 pal_base = gfx->colorbase() + gfx->granularity() * (color % gfx->colors());
+ const u8 *source_base = gfx->get_data(code % gfx->elements());
bitmap_ind8 &priority_bitmap = screen.priority();
- int sprite_screen_height = ((1<<16)*gfx->height()+0x8000)>>16;
- int sprite_screen_width = ((1<<16)*gfx->width()+0x8000)>>16;
+ const int sprite_screen_height = ((1 << 16) * gfx->height() + 0x8000) >> 16;
+ const int sprite_screen_width = ((1 << 16) * gfx->width() + 0x8000) >> 16;
if (sprite_screen_width && sprite_screen_height)
{
/* compute sprite increment per screen pixel */
- int dx = (gfx->width()<<16)/sprite_screen_width;
- int dy = (gfx->height()<<16)/sprite_screen_height;
+ int dx = (gfx->width() << 16) / sprite_screen_width;
+ int dy = (gfx->height() << 16) / sprite_screen_height;
- int ex = sx+sprite_screen_width;
- int ey = sy+sprite_screen_height;
+ int ex = sx + sprite_screen_width;
+ int ey = sy + sprite_screen_height;
int x_index_base;
int y_index;
- if( flipx )
+ if (flipx)
{
- x_index_base = (sprite_screen_width-1)*dx;
+ x_index_base = (sprite_screen_width - 1) * dx;
dx = -dx;
}
else
@@ -791,9 +703,9 @@ static void toaplan1_draw_sprite_custom(screen_device &screen, bitmap_ind16 &des
x_index_base = 0;
}
- if( flipy )
+ if (flipy)
{
- y_index = (sprite_screen_height-1)*dy;
+ y_index = (sprite_screen_height - 1) * dy;
dy = -dy;
}
else
@@ -801,48 +713,46 @@ static void toaplan1_draw_sprite_custom(screen_device &screen, bitmap_ind16 &des
y_index = 0;
}
- if( sx < clip.min_x)
+ if (sx < clip.min_x)
{ /* clip left */
- int pixels = clip.min_x-sx;
+ int pixels = clip.min_x - sx;
sx += pixels;
- x_index_base += pixels*dx;
+ x_index_base += pixels * dx;
}
- if( sy < clip.min_y )
+ if (sy < clip.min_y)
{ /* clip top */
- int pixels = clip.min_y-sy;
+ int pixels = clip.min_y - sy;
sy += pixels;
- y_index += pixels*dy;
+ y_index += pixels * dy;
}
/* NS 980211 - fixed incorrect clipping */
- if( ex > clip.max_x+1 )
+ if (ex > clip.max_x + 1)
{ /* clip right */
- int pixels = ex-clip.max_x-1;
+ int pixels = ex-clip.max_x - 1;
ex -= pixels;
}
- if( ey > clip.max_y+1 )
+ if (ey > clip.max_y + 1)
{ /* clip bottom */
- int pixels = ey-clip.max_y-1;
+ int pixels = ey-clip.max_y - 1;
ey -= pixels;
}
- if( ex>sx )
+ if (ex > sx)
{ /* skip if inner loop doesn't draw anything */
- int y;
-
- for( y=sy; y<ey; y++ )
+ for (int y = sy; y < ey; y++)
{
- const uint8_t *source = source_base + (y_index>>16) * gfx->rowbytes();
- uint16_t *dest = &dest_bmp.pix16(y);
- uint8_t *pri = &priority_bitmap.pix8(y);
+ const u8 *source = source_base + (y_index >> 16) * gfx->rowbytes();
+ u16 *dest = &dest_bmp.pix16(y);
+ u8 *pri = &priority_bitmap.pix8(y);
- int x, x_index = x_index_base;
- for( x=sx; x<ex; x++ )
+ int x_index = x_index_base;
+ for (int x = sx; x < ex; x++)
{
- int c = source[x_index>>16];
- if( c != 0 )
+ const u8 c = source[x_index >> 16];
+ if (c != 0)
{
if (pri[x] < priority)
- dest[x] = pal_base+c;
+ dest[x] = pal_base + c;
pri[x] = 0xff; // mark it "already drawn"
}
x_index += dx;
@@ -855,35 +765,32 @@ static void toaplan1_draw_sprite_custom(screen_device &screen, bitmap_ind16 &des
}
-void toaplan1_state::draw_sprites(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect )
+void toaplan1_state::draw_sprites(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{
- uint16_t *source = (uint16_t *)m_buffered_spriteram.get();
- uint16_t *size = (uint16_t *)m_buffered_spritesizeram16.get();
+ u16 *source = (u16 *)m_buffered_spriteram.get();
+ u16 *size = (u16 *)m_buffered_spritesizeram.get();
int fcu_flipscreen = m_fcu_flipscreen;
- int offs;
- for (offs = m_spriteram.bytes()/2 - 4; offs >= 0; offs -= 4)
+ for (int offs = m_spriteram.bytes() / 2 - 4; offs >= 0; offs -= 4)
{
if (!(source[offs] & 0x8000))
{
- int attrib, sprite, color, priority, sx, sy;
- int sprite_sizex, sprite_sizey, dim_x, dim_y, sx_base, sy_base;
- int sizeram_ptr;
+ int sx, sy;
- attrib = source[offs+1];
- priority = (attrib & 0xf000) >> 12;
+ const u16 attrib = source[offs + 1];
+ const u8 priority = (attrib & 0xf000) >> 12;
- sprite = source[offs] & 0x7fff;
- color = attrib & 0x3f;
+ u32 sprite = source[offs] & 0x7fff;
+ u32 color = attrib & 0x3f;
/****** find sprite dimension ******/
- sizeram_ptr = (attrib >> 6) & 0x3f;
- sprite_sizex = ( size[sizeram_ptr] & 0x0f) * 8;
- sprite_sizey = ((size[sizeram_ptr] >> 4) & 0x0f) * 8;
+ const u32 sizeram_ptr = (attrib >> 6) & 0x3f;
+ const u32 sprite_sizex = ( size[sizeram_ptr] & 0x0f) * 8;
+ const u32 sprite_sizey = ((size[sizeram_ptr] >> 4) & 0x0f) * 8;
/****** find position to display sprite ******/
- sx_base = (source[offs + 2] >> 7) & 0x1ff;
- sy_base = (source[offs + 3] >> 7) & 0x1ff;
+ int sx_base = (source[offs + 2] >> 7) & 0x1ff;
+ int sy_base = (source[offs + 3] >> 7) & 0x1ff;
if (sx_base >= 0x180) sx_base -= 0x200;
if (sy_base >= 0x180) sy_base -= 0x200;
@@ -895,26 +802,26 @@ void toaplan1_state::draw_sprites(screen_device &screen, bitmap_ind16 &bitmap, c
sx_base = visarea.width() - (sx_base + 8); /* visarea.x = 320 */
sy_base = visarea.height() - (sy_base + 8); /* visarea.y = 240 */
- sy_base += ((visarea.max_y + 1) - visarea.height()) * 2; /* Horizontal games are offset so adjust by +0x20 */
+ sy_base += ((visarea.max_y + 1) - visarea.height()) * 2; /* Horizontal games are offset so adjust by + 0x20 */
}
- for (dim_y = 0; dim_y < sprite_sizey; dim_y += 8)
+ for (int dim_y = 0; dim_y < sprite_sizey; dim_y += 8)
{
if (fcu_flipscreen) sy = sy_base - dim_y;
else sy = sy_base + dim_y;
- for (dim_x = 0; dim_x < sprite_sizex; dim_x += 8)
+ for (int dim_x = 0; dim_x < sprite_sizex; dim_x += 8)
{
if (fcu_flipscreen) sx = sx_base - dim_x;
else sx = sx_base + dim_x;
- toaplan1_draw_sprite_custom(screen,bitmap,cliprect,m_gfxdecode->gfx(1),
+ draw_sprite_custom(screen,bitmap,cliprect,m_gfxdecode->gfx(1),
sprite,color,
fcu_flipscreen,fcu_flipscreen,
sx,sy,
priority);
- sprite++ ;
+ sprite++;
}
}
}
@@ -928,24 +835,22 @@ void toaplan1_state::draw_sprites(screen_device &screen, bitmap_ind16 &bitmap, c
Draw the game screen in the given bitmap_ind16.
***************************************************************************/
-uint32_t toaplan1_rallybik_state::screen_update_rallybik(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
+u32 toaplan1_rallybik_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{
- int priority;
-
- toaplan1_log_vram();
+ log_vram();
m_spritegen->draw_sprites_to_tempbitmap(cliprect, m_buffered_spriteram.get(), m_spriteram.bytes());
// first draw everything, including "disabled" tiles and priority 0
- m_pf1_tilemap->draw(screen, bitmap, cliprect, TILEMAP_DRAW_OPAQUE | TILEMAP_DRAW_ALL_CATEGORIES, 0);
+ m_tilemap[0]->draw(screen, bitmap, cliprect, TILEMAP_DRAW_OPAQUE | TILEMAP_DRAW_ALL_CATEGORIES, 0);
// then draw the higher priority layers in order
- for (priority = 1; priority < 16; priority++)
+ for (int priority = 1; priority < 16; priority++)
{
- m_pf4_tilemap->draw(screen, bitmap, cliprect, priority, 0);
- m_pf3_tilemap->draw(screen, bitmap, cliprect, priority, 0);
- m_pf2_tilemap->draw(screen, bitmap, cliprect, priority, 0);
- m_pf1_tilemap->draw(screen, bitmap, cliprect, priority, 0);
+ m_tilemap[3]->draw(screen, bitmap, cliprect, priority, 0);
+ m_tilemap[2]->draw(screen, bitmap, cliprect, priority, 0);
+ m_tilemap[1]->draw(screen, bitmap, cliprect, priority, 0);
+ m_tilemap[0]->draw(screen, bitmap, cliprect, priority, 0);
//if (pririoty==0x00) m_spritegen->copy_sprites_from_tempbitmap(bitmap,cliprect,0);
if (priority==0x04) m_spritegen->copy_sprites_from_tempbitmap(bitmap,cliprect,1);
@@ -957,24 +862,22 @@ uint32_t toaplan1_rallybik_state::screen_update_rallybik(screen_device &screen,
return 0;
}
-uint32_t toaplan1_state::screen_update_toaplan1(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
+u32 toaplan1_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{
- int priority;
-
- toaplan1_log_vram();
+ log_vram();
screen.priority().fill(0, cliprect);
// first draw everything, including "disabled" tiles and priority 0
- m_pf1_tilemap->draw(screen, bitmap, cliprect, TILEMAP_DRAW_OPAQUE | TILEMAP_DRAW_ALL_CATEGORIES, 0);
+ m_tilemap[0]->draw(screen, bitmap, cliprect, TILEMAP_DRAW_OPAQUE | TILEMAP_DRAW_ALL_CATEGORIES, 0);
// then draw the higher priority layers in order
- for (priority = 1; priority < 16; priority++)
+ for (int priority = 1; priority < 16; priority++)
{
- m_pf4_tilemap->draw(screen, bitmap, cliprect, priority, priority, 0);
- m_pf3_tilemap->draw(screen, bitmap, cliprect, priority, priority, 0);
- m_pf2_tilemap->draw(screen, bitmap, cliprect, priority, priority, 0);
- m_pf1_tilemap->draw(screen, bitmap, cliprect, priority, priority, 0);
+ m_tilemap[3]->draw(screen, bitmap, cliprect, priority, priority, 0);
+ m_tilemap[2]->draw(screen, bitmap, cliprect, priority, priority, 0);
+ m_tilemap[1]->draw(screen, bitmap, cliprect, priority, priority, 0);
+ m_tilemap[0]->draw(screen, bitmap, cliprect, priority, priority, 0);
}
draw_sprites(screen, bitmap, cliprect);
@@ -987,35 +890,35 @@ uint32_t toaplan1_state::screen_update_toaplan1(screen_device &screen, bitmap_in
assume it happens automatically every frame, at the end of vblank
****************************************************************************/
-WRITE_LINE_MEMBER(toaplan1_rallybik_state::screen_vblank_rallybik)
+WRITE_LINE_MEMBER(toaplan1_rallybik_state::screen_vblank)
{
// rising edge
if (state)
{
memcpy(m_buffered_spriteram.get(), m_spriteram, m_spriteram.bytes());
- toaplan1_interrupt();
+ interrupt();
}
}
-WRITE_LINE_MEMBER(toaplan1_state::screen_vblank_toaplan1)
+WRITE_LINE_MEMBER(toaplan1_state::screen_vblank)
{
// rising edge
if (state)
{
memcpy(m_buffered_spriteram.get(), m_spriteram, m_spriteram.bytes());
- memcpy(m_buffered_spritesizeram16.get(), m_spritesizeram16.get(), TOAPLAN1_SPRITESIZERAM_SIZE);
- toaplan1_interrupt();
+ memcpy(m_buffered_spritesizeram.get(), m_spritesizeram.get(), TOAPLAN1_SPRITESIZERAM_SIZE);
+ interrupt();
}
}
-WRITE_LINE_MEMBER(toaplan1_state::screen_vblank_samesame)
+WRITE_LINE_MEMBER(toaplan1_samesame_state::screen_vblank)
{
// rising edge
if (state)
{
memcpy(m_buffered_spriteram.get(), m_spriteram, m_spriteram.bytes());
- memcpy(m_buffered_spritesizeram16.get(), m_spritesizeram16.get(), TOAPLAN1_SPRITESIZERAM_SIZE);
- toaplan1_interrupt();
+ memcpy(m_buffered_spritesizeram.get(), m_spritesizeram.get(), TOAPLAN1_SPRITESIZERAM_SIZE);
+ interrupt();
m_maincpu->set_input_line(M68K_IRQ_2, HOLD_LINE); /* Frame done */
}
}
diff --git a/src/mame/video/toaplan2.cpp b/src/mame/video/toaplan2.cpp
index 8abe80e19ca..b89c4c7cdd1 100644
--- a/src/mame/video/toaplan2.cpp
+++ b/src/mame/video/toaplan2.cpp
@@ -192,7 +192,7 @@ WRITE16_MEMBER(toaplan2_state::batrider_textdata_dma_w)
m_dma_space->set_bank(1);
for (int i = 0; i < (0x8000 >> 1); i++)
{
- m_dma_space->write16(space, i, m_mainram[i]);
+ m_dma_space->write16(i, m_mainram[i]);
}
}
@@ -204,7 +204,7 @@ WRITE16_MEMBER(toaplan2_state::batrider_pal_text_dma_w)
m_dma_space->set_bank(0);
for (int i = 0; i < (0x3400 >> 1); i++)
{
- m_dma_space->write16(space, i, m_mainram[i]);
+ m_dma_space->write16(i, m_mainram[i]);
}
}
diff --git a/src/mame/video/toaplan_scu.cpp b/src/mame/video/toaplan_scu.cpp
index cb75a21e237..b1edb459d1c 100644
--- a/src/mame/video/toaplan_scu.cpp
+++ b/src/mame/video/toaplan_scu.cpp
@@ -29,7 +29,7 @@ GFXDECODE_MEMBER( toaplan_scu_device::gfxinfo )
GFXDECODE_END
-toaplan_scu_device::toaplan_scu_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+toaplan_scu_device::toaplan_scu_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
: device_t(mconfig, TOAPLAN_SCU, tag, owner, clock)
, device_gfx_interface(mconfig, *this, gfxinfo)
{
@@ -52,38 +52,35 @@ void toaplan_scu_device::alloc_sprite_bitmap(screen_device &screen)
Sprite Handlers
***************************************************************************/
-void toaplan_scu_device::draw_sprites_to_tempbitmap(const rectangle &cliprect, uint16_t* spriteram, uint32_t bytes )
+void toaplan_scu_device::draw_sprites_to_tempbitmap(const rectangle &cliprect, u16* spriteram, u32 bytes)
{
- int offs;
- m_temp_spritebitmap.fill(0,cliprect);
+ m_temp_spritebitmap.fill(0, cliprect);
- for (offs = 0;offs < bytes/2;offs += 4)
+ for (int offs = 0; offs < bytes / 2; offs += 4)
{
- int attribute,sx,sy,flipx,flipy;
- int sprite, color;
-
- attribute = spriteram[offs + 1];
- int priority = (attribute & 0x0c00)>>10;
+ const u16 attribute = spriteram[offs + 1];
+ const int priority = (attribute & 0x0c00) >> 10;
// are 0 priority really skipped, or can they still mask?
if (!priority) continue;
- sy = spriteram[offs + 3] >> 7;
- if (sy != 0x0100) { /* sx = 0x01a0 or 0x0040*/
- sprite = spriteram[offs] & 0x7ff;
- color = attribute & 0x3f;
+ const int sy = spriteram[offs + 3] >> 7;
+ if (sy != 0x0100) /* sx = 0x01a0 or 0x0040*/
+ {
+ const u32 sprite = spriteram[offs] & 0x7ff;
+ u32 color = attribute & 0x3f;
color |= priority << 6; // encode colour
- sx = spriteram[offs + 2] >> 7;
- flipx = attribute & 0x100;
- if (flipx) sx -= m_xoffs_flipped;
+ int sx = spriteram[offs + 2] >> 7;
+ const int flipx = attribute & 0x100;
+ if (flipx) sx -= m_xoffs_flipped;
- flipy = attribute & 0x200;
- gfx(0)->transpen_raw(m_temp_spritebitmap,cliprect,
+ const int flipy = attribute & 0x200;
+ gfx(0)->transpen_raw(m_temp_spritebitmap, cliprect,
sprite,
color << 4 /* << 4 because using _raw */ ,
- flipx,flipy,
- sx-m_xoffs,sy-16,0);
+ flipx, flipy,
+ sx - m_xoffs, sy - 16, 0);
}
}
@@ -96,23 +93,22 @@ void toaplan_scu_device::draw_sprites_to_tempbitmap(const rectangle &cliprect, u
void toaplan_scu_device::copy_sprites_from_tempbitmap(bitmap_ind16 &bitmap, const rectangle &cliprect, int priority)
{
- int y, x;
- int colourbase = gfx(0)->colorbase();
+ const int colourbase = gfx(0)->colorbase();
- for (y=cliprect.min_y;y<=cliprect.max_y;y++)
+ for (int y = cliprect.min_y; y <= cliprect.max_y; y++)
{
- uint16_t* srcline = &m_temp_spritebitmap.pix16(y);
- uint16_t* dstline = &bitmap.pix16(y);
+ u16* srcline = &m_temp_spritebitmap.pix16(y);
+ u16* dstline = &bitmap.pix16(y);
- for (x=cliprect.min_x;x<=cliprect.max_x;x++)
+ for (int x = cliprect.min_x; x <= cliprect.max_x; x++)
{
- uint16_t pix = srcline[x];
+ const u16 pix = srcline[x];
- if ( (pix>>(4+6)) == priority )
+ if ((pix >> (4 + 6)) == priority)
{
- if (pix&0xf)
+ if (pix & 0xf)
{
- dstline[x] = (pix & 0x3ff)+colourbase;
+ dstline[x] = (pix & 0x3ff) + colourbase;
}
}
}
diff --git a/src/mame/video/toaplan_scu.h b/src/mame/video/toaplan_scu.h
index bafceb28953..c07bcaa74df 100644
--- a/src/mame/video/toaplan_scu.h
+++ b/src/mame/video/toaplan_scu.h
@@ -10,7 +10,7 @@
class toaplan_scu_device : public device_t, public device_gfx_interface
{
public:
- toaplan_scu_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+ toaplan_scu_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
// configuration
void set_xoffsets(int xoffs, int xoffs_flipped)
@@ -19,7 +19,7 @@ public:
m_xoffs_flipped = xoffs_flipped;
}
- void draw_sprites_to_tempbitmap(const rectangle &cliprect, uint16_t* spriteram, uint32_t bytes );
+ void draw_sprites_to_tempbitmap(const rectangle &cliprect, u16* spriteram, u32 bytes);
void copy_sprites_from_tempbitmap(bitmap_ind16 &bitmap, const rectangle &cliprect, int priority);
void alloc_sprite_bitmap(screen_device &screen);
diff --git a/src/mame/video/tp84.cpp b/src/mame/video/tp84.cpp
index 14a64748c89..726b97417ff 100644
--- a/src/mame/video/tp84.cpp
+++ b/src/mame/video/tp84.cpp
@@ -65,21 +65,21 @@ void tp84_state::tp84_palette(palette_device &palette) const
bit1 = BIT(color_prom[i | 0x000], 1);
bit2 = BIT(color_prom[i | 0x000], 2);
bit3 = BIT(color_prom[i | 0x000], 3);
- int const r = combine_4_weights(weights, bit0, bit1, bit2, bit3);
+ int const r = combine_weights(weights, bit0, bit1, bit2, bit3);
// green component
bit0 = BIT(color_prom[i | 0x100], 0);
bit1 = BIT(color_prom[i | 0x100], 1);
bit2 = BIT(color_prom[i | 0x100], 2);
bit3 = BIT(color_prom[i | 0x100], 3);
- int const g = combine_4_weights(weights, bit0, bit1, bit2, bit3);
+ int const g = combine_weights(weights, bit0, bit1, bit2, bit3);
// blue component
bit0 = BIT(color_prom[i | 0x200], 0);
bit1 = BIT(color_prom[i | 0x200], 1);
bit2 = BIT(color_prom[i | 0x200], 2);
bit3 = BIT(color_prom[i | 0x200], 3);
- int const b = combine_4_weights(weights, bit0, bit1, bit2, bit3);
+ int const b = combine_weights(weights, bit0, bit1, bit2, bit3);
palette.set_indirect_color(i, rgb_t(r, g, b));
}
diff --git a/src/mame/video/trackfld.cpp b/src/mame/video/trackfld.cpp
index 0e89d6f1869..807ee3961f0 100644
--- a/src/mame/video/trackfld.cpp
+++ b/src/mame/video/trackfld.cpp
@@ -53,18 +53,18 @@ void trackfld_state::trackfld_palette(palette_device &palette) const
bit0 = BIT(color_prom[i], 0);
bit1 = BIT(color_prom[i], 1);
bit2 = BIT(color_prom[i], 2);
- int const r = combine_3_weights(rweights, bit0, bit1, bit2);
+ int const r = combine_weights(rweights, bit0, bit1, bit2);
// green component
bit0 = BIT(color_prom[i], 3);
bit1 = BIT(color_prom[i], 4);
bit2 = BIT(color_prom[i], 5);
- int const g = combine_3_weights(gweights, bit0, bit1, bit2);
+ int const g = combine_weights(gweights, bit0, bit1, bit2);
// blue component
bit0 = BIT(color_prom[i], 6);
bit1 = BIT(color_prom[i], 7);
- int const b = combine_2_weights(bweights, bit0, bit1);
+ int const b = combine_weights(bweights, bit0, bit1);
palette.set_indirect_color(i, rgb_t(r, g, b));
}
diff --git a/src/mame/video/tubep.cpp b/src/mame/video/tubep.cpp
index dbc89df3845..100df948494 100644
--- a/src/mame/video/tubep.cpp
+++ b/src/mame/video/tubep.cpp
@@ -158,16 +158,16 @@ void tubep_state::tubep_palette(palette_device &palette)
bit0 = BIT(*color_prom, 0);
bit1 = BIT(*color_prom, 1);
bit2 = BIT(*color_prom, 2);
- int const r = combine_3_weights(weights_txt_rg, bit0, bit1, bit2);
+ int const r = combine_weights(weights_txt_rg, bit0, bit1, bit2);
// green component
bit0 = BIT(*color_prom, 3);
bit1 = BIT(*color_prom, 4);
bit2 = BIT(*color_prom, 5);
- int const g = combine_3_weights(weights_txt_rg, bit0, bit1, bit2);
+ int const g = combine_weights(weights_txt_rg, bit0, bit1, bit2);
// blue component
bit0 = BIT(*color_prom, 6);
bit1 = BIT(*color_prom, 7);
- int const b = combine_2_weights(weights_txt_b, bit0, bit1);
+ int const b = combine_weights(weights_txt_b, bit0, bit1);
palette.set_pen_color(i, rgb_t(r, g, b));
@@ -692,16 +692,16 @@ void tubep_state::rjammer_palette(palette_device &palette) const
bit0 = BIT(*color_prom, 0);
bit1 = BIT(*color_prom, 1);
bit2 = BIT(*color_prom, 2);
- int const r = combine_3_weights(weights_rg, bit0, bit1, bit2);
+ int const r = combine_weights(weights_rg, bit0, bit1, bit2);
// green component
bit0 = BIT(*color_prom, 3);
bit1 = BIT(*color_prom, 4);
bit2 = BIT(*color_prom, 5);
- int const g = combine_3_weights(weights_rg, bit0, bit1, bit2);
+ int const g = combine_weights(weights_rg, bit0, bit1, bit2);
// blue component
bit0 = BIT(*color_prom, 6);
bit1 = BIT(*color_prom, 7);
- int const b = combine_2_weights(weights_b, bit0, bit1);
+ int const b = combine_weights(weights_b, bit0, bit1);
palette.set_pen_color(i, rgb_t(r,g,b));
diff --git a/src/mame/video/turbo.cpp b/src/mame/video/turbo.cpp
index 7d61bbfc61a..a23d7370906 100644
--- a/src/mame/video/turbo.cpp
+++ b/src/mame/video/turbo.cpp
@@ -42,13 +42,13 @@ void turbo_state::turbo_palette(palette_device &palette) const
for (int i = 0; i < 256; i++)
{
// red component
- int const r = combine_3_weights(rweights, BIT(i, 0), BIT(i, 1), BIT(i, 2));
+ int const r = combine_weights(rweights, BIT(i, 0), BIT(i, 1), BIT(i, 2));
// green component
- int const g = combine_3_weights(gweights, BIT(i, 3), BIT(i, 4), BIT(i, 5));
+ int const g = combine_weights(gweights, BIT(i, 3), BIT(i, 4), BIT(i, 5));
// blue component
- int const b = combine_2_weights(bweights, BIT(i, 6), BIT(i, 7));
+ int const b = combine_weights(bweights, BIT(i, 6), BIT(i, 7));
palette.set_pen_color(i, rgb_t(r, g, b));
}
@@ -70,13 +70,13 @@ void turbo_state::subroc3d_palette(palette_device &palette) const
for (int i = 0; i < 256; i++)
{
// red component
- int const r = combine_3_weights(rweights, BIT(i, 0), BIT(i, 1), BIT(i, 2));
+ int const r = combine_weights(rweights, BIT(i, 0), BIT(i, 1), BIT(i, 2));
// green component
- int const g = combine_3_weights(gweights, BIT(i, 3), BIT(i, 4), BIT(i, 5));
+ int const g = combine_weights(gweights, BIT(i, 3), BIT(i, 4), BIT(i, 5));
// blue component
- int const b = combine_2_weights(bweights, BIT(i, 6), BIT(i, 7));
+ int const b = combine_weights(bweights, BIT(i, 6), BIT(i, 7));
palette.set_pen_color(i, rgb_t(r, g, b));
}
@@ -98,13 +98,13 @@ void turbo_state::buckrog_palette(palette_device &palette) const
for (int i = 0; i < 1024; i++)
{
// red component
- int const r = combine_3_weights(rweights, BIT(i, 0), BIT(i, 1), BIT(i, 2));
+ int const r = combine_weights(rweights, BIT(i, 0), BIT(i, 1), BIT(i, 2));
// green component
- int const g = combine_3_weights(gweights, BIT(i, 3), BIT(i, 4), BIT(i, 5));
+ int const g = combine_weights(gweights, BIT(i, 3), BIT(i, 4), BIT(i, 5));
// blue component - note the shuffled bits
- int const b = combine_4_weights(bweights, BIT(i, 8), BIT(i, 9), BIT(i, 6), BIT(i, 7));
+ int const b = combine_weights(bweights, BIT(i, 8), BIT(i, 9), BIT(i, 6), BIT(i, 7));
palette.set_pen_color(i, rgb_t(r, g, b));
}
diff --git a/src/mame/video/twincobr.cpp b/src/mame/video/twincobr.cpp
index 61951369a1b..ed15675d03d 100644
--- a/src/mame/video/twincobr.cpp
+++ b/src/mame/video/twincobr.cpp
@@ -24,11 +24,9 @@
TILE_GET_INFO_MEMBER(twincobr_state::get_bg_tile_info)
{
- int code, tile_number, color;
-
- code = m_bgvideoram16[tile_index+m_bg_ram_bank];
- tile_number = code & 0x0fff;
- color = (code & 0xf000) >> 12;
+ const u16 code = m_bgvideoram16[tile_index+m_bg_ram_bank];
+ const u32 tile_number = code & 0x0fff;
+ const u32 color = (code & 0xf000) >> 12;
SET_TILE_INFO_MEMBER(2,
tile_number,
color,
@@ -37,11 +35,9 @@ TILE_GET_INFO_MEMBER(twincobr_state::get_bg_tile_info)
TILE_GET_INFO_MEMBER(twincobr_state::get_fg_tile_info)
{
- int code, tile_number, color;
-
- code = m_fgvideoram16[tile_index];
- tile_number = (code & 0x0fff) | m_fg_rom_bank;
- color = (code & 0xf000) >> 12;
+ const u16 code = m_fgvideoram16[tile_index];
+ const u32 tile_number = (code & 0x0fff) | m_fg_rom_bank;
+ const u32 color = (code & 0xf000) >> 12;
SET_TILE_INFO_MEMBER(1,
tile_number,
color,
@@ -50,11 +46,9 @@ TILE_GET_INFO_MEMBER(twincobr_state::get_fg_tile_info)
TILE_GET_INFO_MEMBER(twincobr_state::get_tx_tile_info)
{
- int code, tile_number, color;
-
- code = m_txvideoram16[tile_index];
- tile_number = code & 0x07ff;
- color = (code & 0xf800) >> 11;
+ const u16 code = m_txvideoram16[tile_index];
+ const u32 tile_number = code & 0x07ff;
+ const u32 color = (code & 0xf800) >> 11;
SET_TILE_INFO_MEMBER(0,
tile_number,
color,
@@ -93,9 +87,9 @@ void twincobr_state::video_start()
twincobr_create_tilemaps();
- m_txvideoram16 = make_unique_clear<uint16_t[]>(m_txvideoram_size);
- m_fgvideoram16 = make_unique_clear<uint16_t[]>(m_fgvideoram_size);
- m_bgvideoram16 = make_unique_clear<uint16_t[]>(m_bgvideoram_size);
+ m_txvideoram16 = make_unique_clear<u16[]>(m_txvideoram_size);
+ m_fgvideoram16 = make_unique_clear<u16[]>(m_fgvideoram_size);
+ m_bgvideoram16 = make_unique_clear<u16[]>(m_bgvideoram_size);
m_display_on = 0;
@@ -135,140 +129,148 @@ WRITE_LINE_MEMBER(twincobr_state::flipscreen_w)
WRITE_LINE_MEMBER(twincobr_state::bg_ram_bank_w)
{
m_bg_ram_bank = state ? 0x1000 : 0x0000;
+ m_bg_tilemap->mark_all_dirty();
}
WRITE_LINE_MEMBER(twincobr_state::fg_rom_bank_w)
{
m_fg_rom_bank = state ? 0x1000 : 0x0000;
+ m_fg_tilemap->mark_all_dirty();
}
-WRITE16_MEMBER(twincobr_state::twincobr_txoffs_w)
+void twincobr_state::twincobr_txoffs_w(offs_t offset, u16 data, u16 mem_mask)
{
COMBINE_DATA(&m_txoffs);
m_txoffs %= m_txvideoram_size;
}
-READ16_MEMBER(twincobr_state::twincobr_txram_r)
+u16 twincobr_state::twincobr_txram_r()
{
return m_txvideoram16[m_txoffs];
}
-WRITE16_MEMBER(twincobr_state::twincobr_txram_w)
+void twincobr_state::twincobr_txram_w(offs_t offset, u16 data, u16 mem_mask)
{
COMBINE_DATA(&m_txvideoram16[m_txoffs]);
m_tx_tilemap->mark_tile_dirty(m_txoffs);
}
-WRITE16_MEMBER(twincobr_state::twincobr_bgoffs_w)
+void twincobr_state::twincobr_bgoffs_w(offs_t offset, u16 data, u16 mem_mask)
{
COMBINE_DATA(&m_bgoffs);
m_bgoffs %= (m_bgvideoram_size >> 1);
}
-READ16_MEMBER(twincobr_state::twincobr_bgram_r)
+u16 twincobr_state::twincobr_bgram_r()
{
return m_bgvideoram16[m_bgoffs+m_bg_ram_bank];
}
-WRITE16_MEMBER(twincobr_state::twincobr_bgram_w)
+void twincobr_state::twincobr_bgram_w(offs_t offset, u16 data, u16 mem_mask)
{
COMBINE_DATA(&m_bgvideoram16[m_bgoffs+m_bg_ram_bank]);
m_bg_tilemap->mark_tile_dirty((m_bgoffs+m_bg_ram_bank));
}
-WRITE16_MEMBER(twincobr_state::twincobr_fgoffs_w)
+void twincobr_state::twincobr_fgoffs_w(offs_t offset, u16 data, u16 mem_mask)
{
COMBINE_DATA(&m_fgoffs);
m_fgoffs %= m_fgvideoram_size;
}
-READ16_MEMBER(twincobr_state::twincobr_fgram_r)
+u16 twincobr_state::twincobr_fgram_r()
{
return m_fgvideoram16[m_fgoffs];
}
-WRITE16_MEMBER(twincobr_state::twincobr_fgram_w)
+void twincobr_state::twincobr_fgram_w(offs_t offset, u16 data, u16 mem_mask)
{
COMBINE_DATA(&m_fgvideoram16[m_fgoffs]);
m_fg_tilemap->mark_tile_dirty(m_fgoffs);
}
-WRITE16_MEMBER(twincobr_state::twincobr_txscroll_w)
+void twincobr_state::twincobr_txscroll_w(offs_t offset, u16 data, u16 mem_mask)
{
- if (offset == 0) {
+ if (offset == 0)
+ {
COMBINE_DATA(&m_txscrollx);
m_tx_tilemap->set_scrollx(0, m_txscrollx);
}
- else {
+ else
+ {
COMBINE_DATA(&m_txscrolly);
m_tx_tilemap->set_scrolly(0, m_txscrolly);
}
}
-WRITE16_MEMBER(twincobr_state::twincobr_bgscroll_w)
+void twincobr_state::twincobr_bgscroll_w(offs_t offset, u16 data, u16 mem_mask)
{
- if (offset == 0) {
+ if (offset == 0)
+ {
COMBINE_DATA(&m_bgscrollx);
m_bg_tilemap->set_scrollx(0, m_bgscrollx);
}
- else {
+ else
+ {
COMBINE_DATA(&m_bgscrolly);
m_bg_tilemap->set_scrolly(0, m_bgscrolly);
}
}
-WRITE16_MEMBER(twincobr_state::twincobr_fgscroll_w)
+void twincobr_state::twincobr_fgscroll_w(offs_t offset, u16 data, u16 mem_mask)
{
- if (offset == 0) {
+ if (offset == 0)
+ {
COMBINE_DATA(&m_fgscrollx);
m_fg_tilemap->set_scrollx(0, m_fgscrollx);
}
- else {
+ else
+ {
COMBINE_DATA(&m_fgscrolly);
m_fg_tilemap->set_scrolly(0, m_fgscrolly);
}
}
-WRITE16_MEMBER(twincobr_state::twincobr_exscroll_w)/* Extra unused video layer */
+void twincobr_state::twincobr_exscroll_w(offs_t offset, u16 data)/* Extra unused video layer */
{
if (offset == 0) logerror("PC - write %04x to unknown video scroll Y register\n",data);
else logerror("PC - write %04x to unknown video scroll X register\n",data);
}
/******************** Wardner interface to this hardware ********************/
-WRITE8_MEMBER(twincobr_state::wardner_txlayer_w)
+void twincobr_state::wardner_txlayer_w(offs_t offset, u8 data)
{
int shift = 8 * (offset & 1);
- twincobr_txoffs_w(space, offset / 2, data << shift, 0xff << shift);
+ twincobr_txoffs_w(offset / 2, data << shift, 0xff << shift);
}
-WRITE8_MEMBER(twincobr_state::wardner_bglayer_w)
+void twincobr_state::wardner_bglayer_w(offs_t offset, u8 data)
{
int shift = 8 * (offset & 1);
- twincobr_bgoffs_w(space, offset / 2, data << shift, 0xff << shift);
+ twincobr_bgoffs_w(offset / 2, data << shift, 0xff << shift);
}
-WRITE8_MEMBER(twincobr_state::wardner_fglayer_w)
+void twincobr_state::wardner_fglayer_w(offs_t offset, u8 data)
{
int shift = 8 * (offset & 1);
- twincobr_fgoffs_w(space, offset / 2, data << shift, 0xff << shift);
+ twincobr_fgoffs_w(offset / 2, data << shift, 0xff << shift);
}
-WRITE8_MEMBER(twincobr_state::wardner_txscroll_w)
+void twincobr_state::wardner_txscroll_w(offs_t offset, u8 data)
{
int shift = 8 * (offset & 1);
- twincobr_txscroll_w(space, offset / 2, data << shift, 0xff << shift);
+ twincobr_txscroll_w(offset / 2, data << shift, 0xff << shift);
}
-WRITE8_MEMBER(twincobr_state::wardner_bgscroll_w)
+void twincobr_state::wardner_bgscroll_w(offs_t offset, u8 data)
{
int shift = 8 * (offset & 1);
- twincobr_bgscroll_w(space, offset / 2, data << shift, 0xff << shift);
+ twincobr_bgscroll_w(offset / 2, data << shift, 0xff << shift);
}
-WRITE8_MEMBER(twincobr_state::wardner_fgscroll_w)
+void twincobr_state::wardner_fgscroll_w(offs_t offset, u8 data)
{
int shift = 8 * (offset & 1);
- twincobr_fgscroll_w(space, offset / 2, data << shift, 0xff << shift);
+ twincobr_fgscroll_w(offset / 2, data << shift, 0xff << shift);
}
-WRITE8_MEMBER(twincobr_state::wardner_exscroll_w)/* Extra unused video layer */
+void twincobr_state::wardner_exscroll_w(offs_t offset, u8 data)/* Extra unused video layer */
{
switch (offset)
{
@@ -279,37 +281,39 @@ WRITE8_MEMBER(twincobr_state::wardner_exscroll_w)/* Extra unused video layer */
}
}
-READ8_MEMBER(twincobr_state::wardner_videoram_r)
+u8 twincobr_state::wardner_videoram_r(offs_t offset)
{
int shift = 8 * (offset & 1);
- switch (offset/2) {
- case 0: return twincobr_txram_r(space,0,0xffff) >> shift;
- case 1: return twincobr_bgram_r(space,0,0xffff) >> shift;
- case 2: return twincobr_fgram_r(space,0,0xffff) >> shift;
+ switch (offset / 2)
+ {
+ case 0: return twincobr_txram_r() >> shift;
+ case 1: return twincobr_bgram_r() >> shift;
+ case 2: return twincobr_fgram_r() >> shift;
}
return 0;
}
-WRITE8_MEMBER(twincobr_state::wardner_videoram_w)
+void twincobr_state::wardner_videoram_w(offs_t offset, u8 data)
{
int shift = 8 * (offset & 1);
- switch (offset/2) {
- case 0: twincobr_txram_w(space,0,data << shift, 0xff << shift); break;
- case 1: twincobr_bgram_w(space,0,data << shift, 0xff << shift); break;
- case 2: twincobr_fgram_w(space,0,data << shift, 0xff << shift); break;
+ switch (offset / 2)
+ {
+ case 0: twincobr_txram_w(0,data << shift, 0xff << shift); break;
+ case 1: twincobr_bgram_w(0,data << shift, 0xff << shift); break;
+ case 2: twincobr_fgram_w(0,data << shift, 0xff << shift); break;
}
}
-READ8_MEMBER(twincobr_state::wardner_sprite_r)
+u8 twincobr_state::wardner_sprite_r(offs_t offset)
{
- uint16_t *spriteram16 = reinterpret_cast<uint16_t *>(m_spriteram8->live());
+ u16 *spriteram16 = reinterpret_cast<u16 *>(m_spriteram8->live());
int shift = (offset & 1) * 8;
return spriteram16[offset/2] >> shift;
}
-WRITE8_MEMBER(twincobr_state::wardner_sprite_w)
+void twincobr_state::wardner_sprite_w(offs_t offset, u8 data)
{
- uint16_t *spriteram16 = reinterpret_cast<uint16_t *>(m_spriteram8->live());
+ u16 *spriteram16 = reinterpret_cast<u16 *>(m_spriteram8->live());
if (offset & 1)
spriteram16[offset/2] = (spriteram16[offset/2] & 0x00ff) | (data << 8);
else
@@ -320,7 +324,7 @@ WRITE8_MEMBER(twincobr_state::wardner_sprite_w)
-void twincobr_state::twincobr_log_vram()
+void twincobr_state::log_vram()
{
#ifdef MAME_DEBUG
@@ -360,12 +364,12 @@ void twincobr_state::twincobr_log_vram()
}
-uint32_t twincobr_state::screen_update_toaplan0(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
+u32 twincobr_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{
- twincobr_log_vram();
+ log_vram();
- uint16_t *buffered_spriteram16;
- uint32_t bytes;
+ u16 *buffered_spriteram16;
+ u32 bytes;
if (m_spriteram16 != nullptr)
{
buffered_spriteram16 = m_spriteram16->buffer();
@@ -373,7 +377,7 @@ uint32_t twincobr_state::screen_update_toaplan0(screen_device &screen, bitmap_in
}
else
{
- buffered_spriteram16 = reinterpret_cast<uint16_t *>(m_spriteram8->buffer());
+ buffered_spriteram16 = reinterpret_cast<u16 *>(m_spriteram8->buffer());
bytes = m_spriteram8->bytes();
}
diff --git a/src/mame/video/v1050.cpp b/src/mame/video/v1050.cpp
index fe13a93ea24..d8bd838ef3c 100644
--- a/src/mame/video/v1050.cpp
+++ b/src/mame/video/v1050.cpp
@@ -109,7 +109,8 @@ void v1050_state::video_start()
/* Machine Drivers */
-MACHINE_CONFIG_START(v1050_state::v1050_video)
+void v1050_state::v1050_video(machine_config &config)
+{
H46505(config, m_crtc, 15.36_MHz_XTAL/8);
m_crtc->set_screen(SCREEN_TAG);
m_crtc->set_show_border_area(true);
@@ -117,12 +118,12 @@ MACHINE_CONFIG_START(v1050_state::v1050_video)
m_crtc->set_update_row_callback(FUNC(v1050_state::crtc_update_row), this);
m_crtc->out_vsync_callback().set(FUNC(v1050_state::crtc_vs_w));
- MCFG_SCREEN_ADD_MONOCHROME(SCREEN_TAG, RASTER, rgb_t::green())
- MCFG_SCREEN_UPDATE_DEVICE(H46505_TAG, h46505_device, screen_update)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500))
- MCFG_SCREEN_SIZE(640, 400)
- MCFG_SCREEN_VISIBLE_AREA(0,640-1, 0, 400-1)
+ screen_device &screen(SCREEN(config, SCREEN_TAG, SCREEN_TYPE_RASTER, rgb_t::green()));
+ screen.set_screen_update(H46505_TAG, FUNC(h46505_device::screen_update));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500));
+ screen.set_size(640, 400);
+ screen.set_visarea(0,640-1, 0, 400-1);
PALETTE(config, m_palette, palette_device::MONOCHROME_HIGHLIGHT);
-MACHINE_CONFIG_END
+}
diff --git a/src/mame/video/vectrex.cpp b/src/mame/video/vectrex.cpp
index c73bce34c9e..67502327e24 100644
--- a/src/mame/video/vectrex.cpp
+++ b/src/mame/video/vectrex.cpp
@@ -345,9 +345,9 @@ WRITE8_MEMBER(vectrex_base_state::v_via_pb_w)
if (data & 0x10)
{
if (data & 0x08) /* BC1 (do we select a reg or write it ?) */
- m_ay8912->address_w(space, 0, m_via_out[PORTA]);
+ m_ay8912->address_w(m_via_out[PORTA]);
else
- m_ay8912->data_w(space, 0, m_via_out[PORTA]);
+ m_ay8912->data_w(m_via_out[PORTA]);
}
if (!(data & 0x1) && (m_via_out[PORTB] & 0x1))
diff --git a/src/mame/video/videopin.cpp b/src/mame/video/videopin.cpp
index 71c50bc9334..1db00b15dc2 100644
--- a/src/mame/video/videopin.cpp
+++ b/src/mame/video/videopin.cpp
@@ -89,14 +89,14 @@ uint32_t videopin_state::screen_update(screen_device &screen, bitmap_ind16 &bitm
}
-WRITE8_MEMBER(videopin_state::ball_w)
+void videopin_state::ball_w(uint8_t data)
{
m_ball_x = data & 15;
m_ball_y = data >> 4;
}
-WRITE8_MEMBER(videopin_state::video_ram_w)
+void videopin_state::video_ram_w(offs_t offset, uint8_t data)
{
m_video_ram[offset] = data;
m_bg_tilemap->mark_tile_dirty(offset);
diff --git a/src/mame/video/vtvideo.cpp b/src/mame/video/vtvideo.cpp
index 3fed7fd93f7..8e67e6957b5 100644
--- a/src/mame/video/vtvideo.cpp
+++ b/src/mame/video/vtvideo.cpp
@@ -922,6 +922,7 @@ void vt100_video_device::device_add_mconfig(machine_config &config)
PALETTE(config, m_palette, palette_device::MONOCHROME);
}
-MACHINE_CONFIG_START(rainbow_video_device::device_add_mconfig)
- MCFG_PALETTE_ADD("palette", 4)
-MACHINE_CONFIG_END
+void rainbow_video_device::device_add_mconfig(machine_config &config)
+{
+ PALETTE(config, m_palette).set_entries(4);
+}
diff --git a/src/mame/video/warpwarp.cpp b/src/mame/video/warpwarp.cpp
index a6bc99ce8ac..10bb73b47f2 100644
--- a/src/mame/video/warpwarp.cpp
+++ b/src/mame/video/warpwarp.cpp
@@ -112,18 +112,18 @@ void warpwarp_state::warpwarp_palette(palette_device &palette) const
bit0 = BIT(i, 0);
bit1 = BIT(i, 1);
bit2 = BIT(i, 2);
- int const r = combine_3_weights(weights_tiles_rg, bit0, bit1, bit2);
+ int const r = combine_weights(weights_tiles_rg, bit0, bit1, bit2);
// green component
bit0 = BIT(i, 3);
bit1 = BIT(i, 4);
bit2 = BIT(i, 5);
- int const g = combine_3_weights(weights_tiles_rg, bit0, bit1, bit2);
+ int const g = combine_weights(weights_tiles_rg, bit0, bit1, bit2);
// blue component
bit0 = BIT(i, 6);
bit1 = BIT(i, 7);
- int const b = combine_2_weights(weights_tiles_b, bit0, bit1);
+ int const b = combine_weights(weights_tiles_b, bit0, bit1);
palette.set_pen_color((i << 1) | 0, rgb_t::black());
palette.set_pen_color((i << 1) | 1, rgb_t(r, g, b));
diff --git a/src/mame/video/williams.cpp b/src/mame/video/williams.cpp
index 77f16f5d58a..ae81e4d3638 100644
--- a/src/mame/video/williams.cpp
+++ b/src/mame/video/williams.cpp
@@ -330,9 +330,9 @@ void williams_state::williams_palette(palette_device &palette) const
// build a palette lookup
for (int i = 0; i < 256; i++)
{
- int const r = combine_3_weights(weights_r, BIT(i, 0), BIT(i, 1), BIT(i, 2));
- int const g = combine_3_weights(weights_g, BIT(i, 3), BIT(i, 4), BIT(i, 5));
- int const b = combine_2_weights(weights_b, BIT(i, 6), BIT(i, 7));
+ int const r = combine_weights(weights_r, BIT(i, 0), BIT(i, 1), BIT(i, 2));
+ int const g = combine_weights(weights_g, BIT(i, 3), BIT(i, 4), BIT(i, 5));
+ int const b = combine_weights(weights_b, BIT(i, 6), BIT(i, 7));
palette.set_pen_color(i, rgb_t(r, g, b));
}
diff --git a/src/mame/video/wiping.cpp b/src/mame/video/wiping.cpp
index 8539998fbe4..01260184c2c 100644
--- a/src/mame/video/wiping.cpp
+++ b/src/mame/video/wiping.cpp
@@ -41,18 +41,18 @@ void wiping_state::wiping_palette(palette_device &palette) const
bit0 = BIT(color_prom[i], 0);
bit1 = BIT(color_prom[i], 1);
bit2 = BIT(color_prom[i], 2);
- int const r = combine_3_weights(rweights, bit0, bit1, bit2);
+ int const r = combine_weights(rweights, bit0, bit1, bit2);
// green component
bit0 = BIT(color_prom[i], 3);
bit1 = BIT(color_prom[i], 4);
bit2 = BIT(color_prom[i], 5);
- int const g = combine_3_weights(gweights, bit0, bit1, bit2);
+ int const g = combine_weights(gweights, bit0, bit1, bit2);
// blue component
bit0 = BIT(color_prom[i], 6);
bit1 = BIT(color_prom[i], 7);
- int const b = combine_2_weights(bweights, bit0, bit1);
+ int const b = combine_weights(bweights, bit0, bit1);
palette.set_indirect_color(i, rgb_t(r, g, b));
}
diff --git a/src/mame/video/wiz.cpp b/src/mame/video/wiz.cpp
index e1b23685ca7..381862a1532 100644
--- a/src/mame/video/wiz.cpp
+++ b/src/mame/video/wiz.cpp
@@ -50,21 +50,21 @@ void wiz_state::wiz_palette(palette_device &palette) const
bit1 = BIT(color_prom[i + 0x000], 1);
bit2 = BIT(color_prom[i + 0x000], 2);
bit3 = BIT(color_prom[i + 0x000], 3);
- int const r = combine_4_weights(rweights, bit0, bit1, bit2, bit3);
+ int const r = combine_weights(rweights, bit0, bit1, bit2, bit3);
// green component
bit0 = BIT(color_prom[i + 0x100], 0);
bit1 = BIT(color_prom[i + 0x100], 1);
bit2 = BIT(color_prom[i + 0x100], 2);
bit3 = BIT(color_prom[i + 0x100], 3);
- int const g = combine_4_weights(gweights, bit0, bit1, bit2, bit3);
+ int const g = combine_weights(gweights, bit0, bit1, bit2, bit3);
// blue component
bit0 = BIT(color_prom[i + 0x200], 0);
bit1 = BIT(color_prom[i + 0x200], 1);
bit2 = BIT(color_prom[i + 0x200], 2);
bit3 = BIT(color_prom[i + 0x200], 3);
- int const b = combine_4_weights(bweights, bit0, bit1, bit2, bit3);
+ int const b = combine_weights(bweights, bit0, bit1, bit2, bit3);
m_palette->set_pen_color(i, rgb_t(r, g, b));
}
diff --git a/src/mame/video/wpc_dmd.cpp b/src/mame/video/wpc_dmd.cpp
index 683ee65e407..75b3e5cbddf 100644
--- a/src/mame/video/wpc_dmd.cpp
+++ b/src/mame/video/wpc_dmd.cpp
@@ -35,16 +35,17 @@ wpc_dmd_device::~wpc_dmd_device()
{
}
-MACHINE_CONFIG_START(wpc_dmd_device::device_add_mconfig)
- MCFG_SCREEN_ADD("screen", LCD)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500))
- MCFG_SCREEN_UPDATE_DEVICE(DEVICE_SELF, wpc_dmd_device, screen_update)
- MCFG_SCREEN_SIZE(128*4, 32*4)
- MCFG_SCREEN_VISIBLE_AREA(0, 128*4-1, 0, 32*4-1)
-
- MCFG_TIMER_DRIVER_ADD_PERIODIC("scanline", wpc_dmd_device, scanline_timer, attotime::from_hz(60*4*32))
-MACHINE_CONFIG_END
+void wpc_dmd_device::device_add_mconfig(machine_config &config)
+{
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_LCD));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500));
+ screen.set_screen_update(FUNC(wpc_dmd_device::screen_update));
+ screen.set_size(128*4, 32*4);
+ screen.set_visarea(0, 128*4-1, 0, 32*4-1);
+
+ TIMER(config, "scanline").configure_periodic(FUNC(wpc_dmd_device::scanline_timer), attotime::from_hz(60*4*32));
+}
void wpc_dmd_device::device_start()
{
diff --git a/src/mame/video/wswan.cpp b/src/mame/video/wswan.cpp
index 804af6f985e..b04eefe2a2d 100644
--- a/src/mame/video/wswan.cpp
+++ b/src/mame/video/wswan.cpp
@@ -856,7 +856,7 @@ uint32_t wswan_video_device::screen_update(screen_device &screen, bitmap_ind16 &
}
-READ8_MEMBER(wswan_video_device::reg_r)
+uint8_t wswan_video_device::reg_r(offs_t offset)
{
uint8_t value = m_regs[offset];
@@ -892,7 +892,7 @@ READ8_MEMBER(wswan_video_device::reg_r)
}
-WRITE8_MEMBER(wswan_video_device::reg_w)
+void wswan_video_device::reg_w(offs_t offset, uint8_t data)
{
if (offset >= 0x20 && offset < 0x40)
{
@@ -1206,12 +1206,12 @@ void wswan_video_device::scanline_interrupt()
}
-READ8_MEMBER(wswan_video_device::vram_r)
+uint8_t wswan_video_device::vram_r(offs_t offset)
{
return m_vram[offset];
}
-WRITE8_MEMBER(wswan_video_device::vram_w)
+void wswan_video_device::vram_w(offs_t offset, uint8_t data)
{
m_vram[offset] = data;
}
diff --git a/src/mame/video/wswan.h b/src/mame/video/wswan.h
index 89eb0c499da..44f866db983 100644
--- a/src/mame/video/wswan.h
+++ b/src/mame/video/wswan.h
@@ -47,10 +47,10 @@ public:
uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
- virtual DECLARE_READ8_MEMBER(vram_r);
- virtual DECLARE_WRITE8_MEMBER(vram_w);
- virtual DECLARE_READ8_MEMBER(reg_r);
- virtual DECLARE_WRITE8_MEMBER(reg_w);
+ uint8_t vram_r(offs_t offset);
+ void vram_w(offs_t offset, uint8_t data);
+ uint8_t reg_r(offs_t offset);
+ void reg_w(offs_t offset, uint8_t data);
protected:
// device-level overrides
diff --git a/src/mame/video/xavix.cpp b/src/mame/video/xavix.cpp
index 89571158df1..58a12e516a3 100644
--- a/src/mame/video/xavix.cpp
+++ b/src/mame/video/xavix.cpp
@@ -109,61 +109,97 @@ WRITE8_MEMBER(xavix_state::spriteram_w)
}
}
-double xavix_state::hue2rgb(double p, double q, double t)
-{
- if (t < 0) t += 1;
- if (t > 1) t -= 1;
- if (t < 1 / 6.0f) return p + (q - p) * 6 * t;
- if (t < 1 / 2.0f) return q;
- if (t < 2 / 3.0f) return p + (q - p) * (2 / 3.0f - t) * 6;
- return p;
-}
-
void xavix_state::update_pen(int pen, uint8_t shval, uint8_t lval)
{
uint16_t dat;
dat = shval;
dat |= lval << 8;
- int l_raw = (dat & 0x1f00) >> 8;
- int s_raw = (dat & 0x00e0) >> 5;
+ int y_raw = (dat & 0x1f00) >> 8;
+ int c_raw = (dat & 0x00e0) >> 5;
int h_raw = (dat & 0x001f) >> 0;
- //if (h_raw > 24)
- // LOG("hraw >24 (%02x)\n", h_raw);
-
- //if (l_raw > 24)
- // LOG("lraw >24 (%02x)\n", l_raw);
-
- //if (s_raw > 7)
- // LOG("s_raw >5 (%02x)\n", s_raw);
-
- double l = (double)l_raw / 24.0f; // ekara and drgqst go up to 23 during fades, expect that to be brightest
- l = l * (std::atan(1)*2); // does not appear to be a linear curve
- l = std::sin(l);
-
- double s = (double)s_raw / 7.0f;
- s = s * (std::atan(1)*2); // does not appear to be a linear curve
- s = std::sin(s);
-
- double h = (double)h_raw / 24.0f; // hue values 24-31 render as transparent
-
- double r, g, b;
-
- if (s == 0) {
- r = g = b = l; // greyscale
- }
- else {
- double q = l < 0.5f ? l * (1 + s) : l + s - l * s;
- double p = 2 * l - q;
- r = hue2rgb(p, q, h + 1 / 3.0f);
- g = hue2rgb(p, q, h);
- b = hue2rgb(p, q, h - 1 / 3.0f);
- }
-
- int r_real = r * 255.0f;
- int g_real = g * 255.0f;
- int b_real = b * 255.0f;
+ // The dividers may be dynamic
+ double y = y_raw / 20.0;
+ double c = c_raw / 5.0;
+
+ // These weights may be dynamic too. They're standard NTSC values, would they change on PAL?
+ const double wr = 0.299;
+ const double wg = 0.587;
+ const double wb = 0.114;
+
+ // Table of hues
+ // Values 24+ are transparent
+
+ const double hues[32][3] = {
+ { 1.00, 0.00, 0.00 },
+ { 1.00, 0.25, 0.00 },
+ { 1.00, 0.50, 0.00 },
+ { 1.00, 0.75, 0.00 },
+ { 1.00, 1.00, 0.00 },
+ { 0.75, 1.00, 0.00 },
+ { 0.50, 1.00, 0.00 },
+ { 0.25, 1.00, 0.00 },
+ { 0.00, 1.00, 0.00 },
+ { 0.00, 1.00, 0.25 },
+ { 0.00, 1.00, 0.50 },
+ { 0.00, 1.00, 0.75 },
+ { 0.00, 1.00, 1.00 },
+ { 0.00, 0.75, 1.00 },
+ { 0.00, 0.50, 1.00 },
+ { 0.00, 0.25, 1.00 },
+ { 0.00, 0.00, 1.00 },
+ { 0.25, 0.00, 1.00 },
+ { 0.50, 0.00, 1.00 },
+ { 0.75, 0.00, 1.00 },
+ { 1.00, 0.00, 1.00 },
+ { 1.00, 0.00, 0.75 },
+ { 1.00, 0.00, 0.50 },
+ { 1.00, 0.00, 0.25 },
+
+ { 0 , 0 , 0 },
+ { 0 , 0 , 0 },
+ { 0 , 0 , 0 },
+ { 0 , 0 , 0 },
+ { 0 , 0 , 0 },
+ { 0 , 0 , 0 },
+ { 0 , 0 , 0 },
+ { 0 , 0 , 0 },
+ };
+
+ double r0 = hues[h_raw][0];
+ double g0 = hues[h_raw][1];
+ double b0 = hues[h_raw][2];
+
+ double z = wr * r0 + wg * g0 + wb * b0;
+
+ if(y < z)
+ c *= y/z;
+ else if(z < 1)
+ c *= (1-y) / (1-z);
+
+ double r1 = (r0 - z) * c + y;
+ double g1 = (g0 - z) * c + y;
+ double b1 = (b0 - z) * c + y;
+
+ if(r1 < 0)
+ r1 = 0;
+ else if(r1 > 1)
+ r1 = 1.0;
+
+ if(g1 < 0)
+ g1 = 0;
+ else if(g1 > 1)
+ g1 = 1.0;
+
+ if(b1 < 0)
+ b1 = 0;
+ else if(b1 > 1)
+ b1 = 1.0;
+
+ int r_real = r1 * 255.0f;
+ int g_real = g1 * 255.0f;
+ int b_real = b1 * 255.0f;
m_palette->set_pen_color(pen, r_real, g_real, b_real);
}
@@ -372,8 +408,8 @@ void xavix_state::draw_tilemap_line(screen_device &screen, bitmap_ind16 &bitmap,
int scrollx = tileregs[0x4];
int basereg;
- int flipx = 0;
- int flipy = 0;
+ int flipx = (tileregs[0x03]&0x40)>>6;
+ int flipy = (tileregs[0x03]&0x80)>>7;
int gfxbase;
// tile 0 is always skipped, doesn't even point to valid data packets in alt mode
@@ -785,26 +821,49 @@ uint32_t xavix_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap,
// temp, needs priority, transparency etc. also it's far bigger than the screen, I guess it must get scaled?!
if (m_bmp_base)
{
- if (m_bmp_base[0x14] & 0x01)
+ // looks like it can zoom the bitmap using these?
+ uint16_t top = ((m_bmp_base[0x01] << 8) | m_bmp_base[0x00]);
+ uint16_t bot = ((m_bmp_base[0x03] << 8) | m_bmp_base[0x02]);
+ uint16_t lft = ((m_bmp_base[0x05] << 8) | m_bmp_base[0x04]);
+ uint16_t rgt = ((m_bmp_base[0x07] << 8) | m_bmp_base[0x06]);
+
+ // and can specify base address relative start / end positions with these for data reading to be cut off?
+ uint16_t topadr = ((m_bmp_base[0x09] << 8) | m_bmp_base[0x08]);
+ uint16_t botadr = ((m_bmp_base[0x0b] << 8) | m_bmp_base[0x0a]);
+ uint16_t lftadr = ((m_bmp_base[0x0d] << 8) | m_bmp_base[0x0c]);
+ uint16_t rgtadr = ((m_bmp_base[0x0f] << 8) | m_bmp_base[0x0e]);
+
+ uint16_t start = ((m_bmp_base[0x11] << 8) | m_bmp_base[0x10]);
+ uint8_t end = m_bmp_base[0x12]; // ?? related to width?
+ uint8_t size = m_bmp_base[0x13]; // some kind of additional scaling?
+ uint8_t mode = m_bmp_base[0x14]; // eanble,bpp, zval etc.
+
+ uint32_t unused = ((m_bmp_base[0x15] << 16) | (m_bmp_base[0x16] << 8) | (m_bmp_base[0x17] << 0));
+
+ if (mode & 0x01)
{
- popmessage("bitmap %02x %02x %02x %02x %02x %02x %02x %02x -- -- %02x %02x %02x %02x %02x %02x -- -- %02x %02x %02x %02x %02x %02x",
- m_bmp_base[0x00], m_bmp_base[0x01], m_bmp_base[0x02], m_bmp_base[0x03], m_bmp_base[0x04], m_bmp_base[0x05], m_bmp_base[0x06], m_bmp_base[0x07],
- /*m_bmp_base[0x08], m_bmp_base[0x09],*/ m_bmp_base[0x0a], m_bmp_base[0x0b], m_bmp_base[0x0c], m_bmp_base[0x0d], m_bmp_base[0x0e], m_bmp_base[0x0f],
- /*m_bmp_base[0x10], m_bmp_base[0x11],*/ m_bmp_base[0x12], m_bmp_base[0x13], m_bmp_base[0x14], m_bmp_base[0x15], m_bmp_base[0x16], m_bmp_base[0x17]);
+ popmessage("bitmap t:%04x b:%04x l:%04x r:%04x -- -- ba:%04x la:%04x ra:%04x -- -- end:%02x - size:%02x unused:%08x",
+ top, bot, lft, rgt,
+ /*topadr*/ botadr, lftadr, rgtadr,
+ /*start*/ end, size, unused);
+
+ int base = start * 0x800;
+ int base2 = topadr * 0x8;
- int base = ((m_bmp_base[0x11] << 8) | m_bmp_base[0x10]) * 0x800;
- int base2 = ((m_bmp_base[0x09] << 8) | m_bmp_base[0x08]) * 0x8;
+ int bpp = ((mode & 0x0e) >> 1) + 1;
+ int zval = ((mode & 0xf0) >> 4);
+
+ int width = (rgtadr * 8) / bpp;
//int count = 0;
set_data_address(base + base2, 0);
- for (int y = 0; y < 256; y++)
+ for (int y = top; y < 256; y++)
{
- for (int x = 0; x < 512; x++)
+ for (int x = 0; x < width; x++)
{
uint16_t* yposptr = &bitmap.pix16(y);
-
- int bpp = 6;
+ uint16_t* zyposptr = &m_zbuffer.pix16(y);
uint8_t dat = 0;
for (int i = 0; i < bpp; i++)
@@ -812,8 +871,17 @@ uint32_t xavix_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap,
dat |= (get_next_bit() << i);
}
- if (x < cliprect.max_x)
- yposptr[x] = dat + 0x100;
+ if (((x <= cliprect.max_x) && (x >= cliprect.min_x)) && ((y <= cliprect.max_y) && (y >= cliprect.min_y)))
+ {
+ if ((m_bmp_palram_sh[dat] & 0x1f) < 24) // same transparency logic as everything else? (baseball title)
+ {
+ if (zval >= zyposptr[x])
+ {
+ yposptr[x] = dat + 0x100;
+ zyposptr[x] = zval;
+ }
+ }
+ }
}
}
diff --git a/src/mame/video/zaccaria.cpp b/src/mame/video/zaccaria.cpp
index 9616b66ec24..99e898b0c27 100644
--- a/src/mame/video/zaccaria.cpp
+++ b/src/mame/video/zaccaria.cpp
@@ -67,18 +67,18 @@ void zaccaria_state::zaccaria_palette(palette_device &palette) const
bit0 = BIT(color_prom[i + 0x000], 3);
bit1 = BIT(color_prom[i + 0x000], 2);
bit2 = BIT(color_prom[i + 0x000], 1);
- int const r = combine_3_weights(weights_rg, bit0, bit1, bit2);
+ int const r = combine_weights(weights_rg, bit0, bit1, bit2);
// green component
bit0 = BIT(color_prom[i + 0x000], 0);
bit1 = BIT(color_prom[i + 0x200], 3);
bit2 = BIT(color_prom[i + 0x200], 2);
- int const g = combine_3_weights(weights_rg, bit0, bit1, bit2);
+ int const g = combine_weights(weights_rg, bit0, bit1, bit2);
// blue component
bit0 = BIT(color_prom[i + 0x200], 1);
bit1 = BIT(color_prom[i + 0x200], 0);
- int const b = combine_2_weights(weights_b, bit0, bit1);
+ int const b = combine_weights(weights_b, bit0, bit1);
palette.set_indirect_color(i, rgb_t(r, g, b));
}
diff --git a/src/mame/video/zaxxon.cpp b/src/mame/video/zaxxon.cpp
index 76b11ba6a98..ae7be184bf3 100644
--- a/src/mame/video/zaxxon.cpp
+++ b/src/mame/video/zaxxon.cpp
@@ -38,18 +38,18 @@ void zaxxon_state::zaxxon_palette(palette_device &palette)
bit0 = BIT(color_prom[i], 0);
bit1 = BIT(color_prom[i], 1);
bit2 = BIT(color_prom[i], 2);
- int const r = combine_3_weights(rweights, bit0, bit1, bit2);
+ int const r = combine_weights(rweights, bit0, bit1, bit2);
// green component
bit0 = BIT(color_prom[i], 3);
bit1 = BIT(color_prom[i], 4);
bit2 = BIT(color_prom[i], 5);
- int const g = combine_3_weights(gweights, bit0, bit1, bit2);
+ int const g = combine_weights(gweights, bit0, bit1, bit2);
// blue component
bit0 = BIT(color_prom[i], 6);
bit1 = BIT(color_prom[i], 7);
- int const b = combine_2_weights(bweights, bit0, bit1);
+ int const b = combine_weights(bweights, bit0, bit1);
palette.set_pen_color(i, rgb_t(r, g, b));
}
diff --git a/src/mame/video/zx8301.cpp b/src/mame/video/zx8301.cpp
index 213327afb3a..dd07316ef4b 100644
--- a/src/mame/video/zx8301.cpp
+++ b/src/mame/video/zx8301.cpp
@@ -58,7 +58,8 @@ DEFINE_DEVICE_TYPE(ZX8301, zx8301_device, "zx8301", "Sinclair ZX8301")
// default address map
void zx8301_device::zx8301(address_map &map)
{
- map(0x00000, 0x1ffff).ram();
+ if (!has_configured_map(0))
+ map(0x00000, 0x1ffff).ram();
}
@@ -113,7 +114,7 @@ zx8301_device::zx8301_device(const machine_config &mconfig, const char *tag, dev
: device_t(mconfig, ZX8301, tag, owner, clock)
, device_memory_interface(mconfig, *this)
, device_video_interface(mconfig, *this)
- , m_space_config("videoram", ENDIANNESS_LITTLE, 8, 17, 0, address_map_constructor(), address_map_constructor(FUNC(zx8301_device::zx8301), this))
+ , m_space_config("videoram", ENDIANNESS_LITTLE, 8, 17, 0, address_map_constructor(FUNC(zx8301_device::zx8301), this))
, m_cpu(*this, finder_base::DUMMY_TAG)
, m_write_vsync(*this)
, m_dispoff(1)
diff --git a/src/osd/eigccx86.h b/src/osd/eigccx86.h
index b3831d21524..3c8f63aa47e 100644
--- a/src/osd/eigccx86.h
+++ b/src/osd/eigccx86.h
@@ -456,6 +456,40 @@ _recip_approx(float value)
#endif
+/*-------------------------------------------------
+ mul_64x64 - perform a signed 64 bit x 64 bit
+ multiply and return the full 128 bit result
+-------------------------------------------------*/
+
+#ifdef __x86_64__
+#define mul_64x64 _mul_64x64
+inline int64_t ATTR_FORCE_INLINE
+_mul_64x64(int64_t a, int64_t b, int64_t *hi)
+{
+ __int128 const r(__int128(a) * b);
+ *hi = int64_t(uint64_t((unsigned __int128)r >> 64));
+ return int64_t(uint64_t((unsigned __int128)r));
+}
+#endif
+
+
+/*-------------------------------------------------
+ mulu_64x64 - perform an unsigned 64 bit x 64
+ bit multiply and return the full 128 bit result
+-------------------------------------------------*/
+
+#ifdef __x86_64__
+#define mulu_64x64 _mulu_64x64
+inline uint64_t ATTR_FORCE_INLINE
+_mulu_64x64(uint64_t a, uint64_t b, uint64_t *hi)
+{
+ unsigned __int128 const r((unsigned __int128)a * b);
+ *hi = uint64_t(r >> 64);
+ return uint64_t(r);
+}
+#endif
+
+
/***************************************************************************
INLINE BIT MANIPULATION FUNCTIONS
diff --git a/src/osd/eivcx86.h b/src/osd/eivcx86.h
index f913ac94624..3fd3e70948c 100644
--- a/src/osd/eivcx86.h
+++ b/src/osd/eivcx86.h
@@ -403,4 +403,24 @@ static inline float _recip_approx(float z)
}
#endif
+
+/*-------------------------------------------------
+ mul_64x64 - perform a signed 64 bit x 64 bit
+ multiply and return the full 128 bit result
+-------------------------------------------------*/
+
+#ifdef PTR64
+#define mul_64x64 _mul128
+#endif
+
+
+/*-------------------------------------------------
+ mulu_64x64 - perform an unsigned 64 bit x 64
+ bit multiply and return the full 128 bit result
+-------------------------------------------------*/
+
+#ifdef PTR64
+#define mulu_64x64 _umul128
+#endif
+
#endif // MAME_OSD_EIVCX86_H
diff --git a/src/osd/eminline.h b/src/osd/eminline.h
index bb0aec63468..eb8ffaa9748 100644
--- a/src/osd/eminline.h
+++ b/src/osd/eminline.h
@@ -260,6 +260,64 @@ inline float recip_approx(float value)
#endif
+/*-------------------------------------------------
+ mul_64x64 - perform a signed 64 bit x 64 bit
+ multiply and return the full 128 bit result
+-------------------------------------------------*/
+
+#ifndef mul_64x64
+inline int64_t mul_64x64(int64_t a, int64_t b, int64_t *hi)
+{
+ uint64_t const a_hi = uint64_t(a) >> 32;
+ uint64_t const b_hi = uint64_t(b) >> 32;
+ uint64_t const a_lo = uint32_t(uint64_t(a));
+ uint64_t const b_lo = uint32_t(uint64_t(b));
+
+ uint64_t const ab_lo = a_lo * b_lo;
+ uint64_t const ab_m1 = a_hi * b_lo;
+ uint64_t const ab_m2 = a_lo * b_hi;
+ uint64_t const ab_hi = a_hi * b_hi;
+ uint64_t const carry = ((ab_lo >> 32) + uint32_t(ab_m1) + uint32_t(ab_m2)) >> 32;
+
+ *hi = ab_hi + (ab_m1 >> 32) + (ab_m2 >> 32) + carry;
+
+ // adjust for sign
+ if (a < 0)
+ *hi -= b;
+ if (b < 0)
+ *hi -= a;
+
+ return ab_lo + (ab_m1 << 32) + (ab_m2 << 32);
+}
+#endif
+
+
+/*-------------------------------------------------
+ mulu_64x64 - perform an unsigned 64 bit x 64
+ bit multiply and return the full 128 bit result
+-------------------------------------------------*/
+
+#ifndef mulu_64x64
+inline uint64_t mulu_64x64(uint64_t a, uint64_t b, uint64_t *hi)
+{
+ uint64_t const a_hi = uint32_t(a >> 32);
+ uint64_t const b_hi = uint32_t(b >> 32);
+ uint64_t const a_lo = uint32_t(a);
+ uint64_t const b_lo = uint32_t(b);
+
+ uint64_t const ab_lo = a_lo * b_lo;
+ uint64_t const ab_m1 = a_hi * b_lo;
+ uint64_t const ab_m2 = a_lo * b_hi;
+ uint64_t const ab_hi = a_hi * b_hi;
+ uint64_t const carry = ((ab_lo >> 32) + uint32_t(ab_m1) + uint32_t(ab_m2)) >> 32;
+
+ *hi = ab_hi + (ab_m1 >> 32) + (ab_m2 >> 32) + carry;
+
+ return ab_lo + (ab_m1 << 32) + (ab_m2 << 32);
+}
+#endif
+
+
/***************************************************************************
INLINE BIT MANIPULATION FUNCTIONS
diff --git a/src/osd/modules/debugger/qt/debuggerview.cpp b/src/osd/modules/debugger/qt/debuggerview.cpp
index 71a736f6bb7..7dc16c0a3de 100644
--- a/src/osd/modules/debugger/qt/debuggerview.cpp
+++ b/src/osd/modules/debugger/qt/debuggerview.cpp
@@ -241,7 +241,7 @@ void DebuggerView::mousePressEvent(QMouseEvent* event)
{
QFontMetrics actualFont = fontMetrics();
const double fontWidth = actualFont.width(QString(100, '_')) / 100.;
- const int fontHeight = std::max(1, actualFont.height());
+ const int fontHeight = std::max(1, actualFont.lineSpacing());
debug_view_xy topLeft = m_view->visible_position();
debug_view_xy clickViewPosition;
diff --git a/src/osd/modules/debugger/qt/memorywindow.cpp b/src/osd/modules/debugger/qt/memorywindow.cpp
index 19e3dee6785..c799ab66c65 100644
--- a/src/osd/modules/debugger/qt/memorywindow.cpp
+++ b/src/osd/modules/debugger/qt/memorywindow.cpp
@@ -329,7 +329,7 @@ void DebuggerMemView::mousePressEvent(QMouseEvent* event)
{
QFontMetrics actualFont = fontMetrics();
const double fontWidth = actualFont.width(QString(100, '_')) / 100.;
- const int fontHeight = std::max(1, actualFont.height());
+ const int fontHeight = std::max(1, actualFont.lineSpacing());
debug_view_xy topLeft = view()->visible_position();
debug_view_xy clickViewPosition;
diff --git a/src/osd/modules/input/input_common.cpp b/src/osd/modules/input/input_common.cpp
index 7c952ac05a4..ab51b6bbe34 100644
--- a/src/osd/modules/input/input_common.cpp
+++ b/src/osd/modules/input/input_common.cpp
@@ -34,8 +34,8 @@
#elif defined(OSD_SDL)
// SDL include
#include <SDL2/SDL.h>
-#define KEY_TRANS_ENTRY0(mame, sdlsc, sdlkey, disc, virtual, uwp, ascii, UI) { ITEM_ID_##mame, SDL_SCANCODE_ ## sdlsc, SDLK_ ## sdlkey, ascii, "ITEM_ID_"#mame, (char *) UI }
-#define KEY_TRANS_ENTRY1(mame, sdlsc, sdlkey, disc, virtual, uwp, ascii) { ITEM_ID_##mame, SDL_SCANCODE_ ## sdlsc, SDLK_ ## sdlkey, ascii, "ITEM_ID_"#mame, (char*) #mame }
+#define KEY_TRANS_ENTRY0(mame, sdlsc, sdlkey, disc, virtual, uwp, ascii, UI) { ITEM_ID_##mame, SDL_SCANCODE_ ## sdlsc, ascii, "ITEM_ID_"#mame, (char *) UI }
+#define KEY_TRANS_ENTRY1(mame, sdlsc, sdlkey, disc, virtual, uwp, ascii) { ITEM_ID_##mame, SDL_SCANCODE_ ## sdlsc, ascii, "ITEM_ID_"#mame, (char*) #mame }
#elif defined(OSD_UWP)
#define KEY_TRANS_ENTRY0(mame, sdlsc, sdlkey, disc, virtual, uwp, ascii, UI) { ITEM_ID_##mame, KEY_ ## disc, Windows::System::VirtualKey:: ## uwp, ascii, "ITEM_ID_"#mame, (char *) UI }
#define KEY_TRANS_ENTRY1(mame, sdlsc, sdlkey, disc, virtual, uwp, ascii) { ITEM_ID_##mame, KEY_ ## disc, Windows::System::VirtualKey:: ## uwp, ascii, "ITEM_ID_"#mame, (char*) #mame }
@@ -43,6 +43,8 @@
// osd mini
#endif
+// FIXME: sdl_key can be removed from the table below. It is no longer used.
+
#if defined(OSD_WINDOWS) || defined(OSD_SDL) || defined(OSD_UWP)
key_trans_entry keyboard_trans_table::s_default_table[] =
{
diff --git a/src/osd/modules/input/input_common.h b/src/osd/modules/input/input_common.h
index 96a197f2543..b4005a6b76a 100644
--- a/src/osd/modules/input/input_common.h
+++ b/src/osd/modules/input/input_common.h
@@ -358,7 +358,6 @@ struct key_trans_entry {
#if defined(OSD_SDL)
int sdl_scancode;
- int sdl_key;
#elif defined(OSD_WINDOWS)
int scan_code;
unsigned char virtual_key;
diff --git a/src/osd/modules/input/input_sdl.cpp b/src/osd/modules/input/input_sdl.cpp
index 35dc665f8e2..40fe037f8c7 100644
--- a/src/osd/modules/input/input_sdl.cpp
+++ b/src/osd/modules/input/input_sdl.cpp
@@ -63,24 +63,265 @@ struct key_lookup_table
static key_lookup_table sdl_lookup_table[] =
{
- KE7(UNKNOWN, BACKSPACE, TAB, CLEAR, RETURN, PAUSE, ESCAPE)
+ KE(UNKNOWN)
+
+ KE(A)
+ KE(B)
+ KE(C)
+ KE(D)
+ KE(E)
+ KE(F)
+ KE(G)
+ KE(H)
+ KE(I)
+ KE(J)
+ KE(K)
+ KE(L)
+ KE(M)
+ KE(N)
+ KE(O)
+ KE(P)
+ KE(Q)
+ KE(R)
+ KE(S)
+ KE(T)
+ KE(U)
+ KE(V)
+ KE(W)
+ KE(X)
+ KE(Y)
+ KE(Z)
+
+ KE(1)
+ KE(2)
+ KE(3)
+ KE(4)
+ KE(5)
+ KE(6)
+ KE(7)
+ KE(8)
+ KE(9)
+ KE(0)
+
+ KE(RETURN)
+ KE(ESCAPE)
+ KE(BACKSPACE)
+ KE(TAB)
KE(SPACE)
- KE5(COMMA, MINUS, PERIOD, SLASH, 0)
- KE8(1, 2, 3, 4, 5, 6, 7, 8)
- KE3(9, SEMICOLON, EQUALS)
- KE5(LEFTBRACKET,BACKSLASH, RIGHTBRACKET, A, B)
- KE8(C, D, E, F, G, H, I, J)
- KE8(K, L, M, N, O, P, Q, R)
- KE8(S, T, U, V, W, X, Y, Z)
- KE8(DELETE, KP_0, KP_1, KP_2, KP_3, KP_4, KP_5, KP_6)
- KE8(KP_7, KP_8, KP_9, KP_PERIOD, KP_DIVIDE, KP_MULTIPLY,KP_MINUS, KP_PLUS)
- KE8(KP_ENTER, KP_EQUALS, UP, DOWN, RIGHT, LEFT, INSERT, HOME)
- KE8(END, PAGEUP, PAGEDOWN, F1, F2, F3, F4, F5)
- KE8(F6, F7, F8, F9, F10, F11, F12, F13)
- KE8(F14, F15, NUMLOCKCLEAR, CAPSLOCK, SCROLLLOCK, RSHIFT, LSHIFT, RCTRL)
- KE5(LCTRL, RALT, LALT, LGUI, RGUI)
- KE8(GRAVE, LEFTBRACKET,RIGHTBRACKET, SEMICOLON, APOSTROPHE, BACKSLASH, PRINTSCREEN,MENU)
+
+ KE(MINUS)
+ KE(EQUALS)
+ KE(LEFTBRACKET)
+ KE(RIGHTBRACKET)
+ KE(BACKSLASH)
+ KE(NONUSHASH)
+ KE(SEMICOLON)
+ KE(APOSTROPHE)
+ KE(GRAVE)
+ KE(COMMA)
+ KE(PERIOD)
+ KE(SLASH)
+
+ KE(CAPSLOCK)
+
+ KE(F1)
+ KE(F2)
+ KE(F3)
+ KE(F4)
+ KE(F5)
+ KE(F6)
+ KE(F7)
+ KE(F8)
+ KE(F9)
+ KE(F10)
+ KE(F11)
+ KE(F12)
+
+ KE(PRINTSCREEN)
+ KE(SCROLLLOCK)
+ KE(PAUSE)
+ KE(INSERT)
+ KE(HOME)
+ KE(PAGEUP)
+ KE(DELETE)
+ KE(END)
+ KE(PAGEDOWN)
+ KE(RIGHT)
+ KE(LEFT)
+ KE(DOWN)
+ KE(UP)
+
+ KE(NUMLOCKCLEAR)
+ KE(KP_DIVIDE)
+ KE(KP_MULTIPLY)
+ KE(KP_MINUS)
+ KE(KP_PLUS)
+ KE(KP_ENTER)
+ KE(KP_1)
+ KE(KP_2)
+ KE(KP_3)
+ KE(KP_4)
+ KE(KP_5)
+ KE(KP_6)
+ KE(KP_7)
+ KE(KP_8)
+ KE(KP_9)
+ KE(KP_0)
+ KE(KP_PERIOD)
+
+ KE(NONUSBACKSLASH)
+ KE(APPLICATION)
+ KE(POWER)
+ KE(KP_EQUALS)
+ KE(F13)
+ KE(F14)
+ KE(F15)
+ KE(F16)
+ KE(F17)
+ KE(F18)
+ KE(F19)
+ KE(F20)
+ KE(F21)
+ KE(F22)
+ KE(F23)
+ KE(F24)
+ KE(EXECUTE)
+ KE(HELP)
+ KE(MENU)
+ KE(SELECT)
+ KE(STOP)
+ KE(AGAIN)
KE(UNDO)
+ KE(CUT)
+ KE(COPY)
+ KE(PASTE)
+ KE(FIND)
+ KE(MUTE)
+ KE(VOLUMEUP)
+ KE(VOLUMEDOWN)
+ KE(KP_COMMA)
+ KE(KP_EQUALSAS400)
+
+ KE(INTERNATIONAL1)
+ KE(INTERNATIONAL2)
+ KE(INTERNATIONAL3)
+ KE(INTERNATIONAL4)
+ KE(INTERNATIONAL5)
+ KE(INTERNATIONAL6)
+ KE(INTERNATIONAL7)
+ KE(INTERNATIONAL8)
+ KE(INTERNATIONAL9)
+ KE(LANG1)
+ KE(LANG2)
+ KE(LANG3)
+ KE(LANG4)
+ KE(LANG5)
+ KE(LANG6)
+ KE(LANG7)
+ KE(LANG8)
+ KE(LANG9)
+
+ KE(ALTERASE)
+ KE(SYSREQ)
+ KE(CANCEL)
+ KE(CLEAR)
+ KE(PRIOR)
+ KE(RETURN2)
+ KE(SEPARATOR)
+ KE(OUT)
+ KE(OPER)
+ KE(CLEARAGAIN)
+ KE(CRSEL)
+ KE(EXSEL)
+
+ KE(KP_00)
+ KE(KP_000)
+ KE(THOUSANDSSEPARATOR)
+ KE(DECIMALSEPARATOR)
+ KE(CURRENCYUNIT)
+ KE(CURRENCYSUBUNIT)
+ KE(KP_LEFTPAREN)
+ KE(KP_RIGHTPAREN)
+ KE(KP_LEFTBRACE)
+ KE(KP_RIGHTBRACE)
+ KE(KP_TAB)
+ KE(KP_BACKSPACE)
+ KE(KP_A)
+ KE(KP_B)
+ KE(KP_C)
+ KE(KP_D)
+ KE(KP_E)
+ KE(KP_F)
+ KE(KP_XOR)
+ KE(KP_POWER)
+ KE(KP_PERCENT)
+ KE(KP_LESS)
+ KE(KP_GREATER)
+ KE(KP_AMPERSAND)
+ KE(KP_DBLAMPERSAND)
+ KE(KP_VERTICALBAR)
+ KE(KP_DBLVERTICALBAR)
+ KE(KP_COLON)
+ KE(KP_HASH)
+ KE(KP_SPACE)
+ KE(KP_AT)
+ KE(KP_EXCLAM)
+ KE(KP_MEMSTORE)
+ KE(KP_MEMRECALL)
+ KE(KP_MEMCLEAR)
+ KE(KP_MEMADD)
+ KE(KP_MEMSUBTRACT)
+ KE(KP_MEMMULTIPLY)
+ KE(KP_MEMDIVIDE)
+ KE(KP_PLUSMINUS)
+ KE(KP_CLEAR)
+ KE(KP_CLEARENTRY)
+ KE(KP_BINARY)
+ KE(KP_OCTAL)
+ KE(KP_DECIMAL)
+ KE(KP_HEXADECIMAL)
+
+ KE(LCTRL)
+ KE(LSHIFT)
+ KE(LALT)
+ KE(LGUI)
+ KE(RCTRL)
+ KE(RSHIFT)
+ KE(RALT)
+ KE(RGUI)
+
+ KE(MODE)
+ KE(AUDIONEXT)
+ KE(AUDIOPREV)
+ KE(AUDIOSTOP)
+ KE(AUDIOPLAY)
+ KE(AUDIOMUTE)
+ KE(MEDIASELECT)
+ KE(WWW)
+ KE(MAIL)
+ KE(CALCULATOR)
+ KE(COMPUTER)
+ KE(AC_SEARCH)
+ KE(AC_HOME)
+ KE(AC_BACK)
+ KE(AC_FORWARD)
+ KE(AC_STOP)
+ KE(AC_REFRESH)
+ KE(AC_BOOKMARKS)
+
+ KE(BRIGHTNESSDOWN)
+ KE(BRIGHTNESSUP)
+ KE(DISPLAYSWITCH)
+ KE(KBDILLUMTOGGLE)
+ KE(KBDILLUMDOWN)
+ KE(KBDILLUMUP)
+ KE(EJECT)
+ KE(SLEEP)
+
+ KE(APP1)
+ KE(APP2)
+
+
{
-1, ""
}
@@ -126,7 +367,6 @@ protected:
// sdl_keyboard_device
//============================================================
-#define OSD_SDL_INDEX_KEYSYM(keysym) ((keysym)->scancode)
class sdl_keyboard_device : public sdl_device
{
public:
@@ -143,13 +383,13 @@ public:
switch (sdlevent.type)
{
case SDL_KEYDOWN:
- keyboard.state[OSD_SDL_INDEX_KEYSYM(&sdlevent.key.keysym)] = 0x80;
+ keyboard.state[sdlevent.key.keysym.scancode] = 0x80;
if (sdlevent.key.keysym.sym < 0x20)
machine().ui_input().push_char_event(osd_common_t::s_window_list.front()->target(), sdlevent.key.keysym.sym);
break;
case SDL_KEYUP:
- keyboard.state[OSD_SDL_INDEX_KEYSYM(&sdlevent.key.keysym)] = 0x00;
+ keyboard.state[sdlevent.key.keysym.scancode] = 0x00;
break;
case SDL_TEXTINPUT:
@@ -567,11 +807,6 @@ private:
char *keymap_filename;
FILE *keymap_file;
int line = 1;
- int index, len, sk, vk, ak;
- char buf[256];
- char mks[41];
- char sks[41];
- char kns[41];
int sdl2section = 0;
keyboard_trans_table &default_table = keyboard_trans_table::instance();
@@ -601,41 +836,42 @@ private:
while (!feof(keymap_file))
{
+ char buf[256];
+
char *ret = fgets(buf, 255, keymap_file);
if (ret && buf[0] != '\n' && buf[0] != '#')
{
buf[255] = 0;
- len = strlen(buf);
+ int len = strlen(buf);
if (len && buf[len - 1] == '\n')
buf[len - 1] = 0;
if (strncmp(buf, "[SDL2]", 6) == 0)
{
sdl2section = 1;
}
- else if (((SDLMAME_SDL2) ^ sdl2section) == 0)
+ else if (sdl2section == 1)
{
- mks[0] = 0;
- sks[0] = 0;
- memset(kns, 0, ARRAY_LENGTH(kns));
- sscanf(buf, "%40s %40s %x %x %40c\n",
- mks, sks, &vk, &ak, kns);
+ char mks[41] = {0};
+ char sks[41] = {0};
+ char kns[41] = {0};
+
+ int n = sscanf(buf, "%40s %40s %40c\n", mks, sks, kns);
+ if (n != 3)
+ osd_printf_error("Keymap: Error on line %d : Expected 3 parameters, got %d\n", line, n);
- index = default_table.lookup_mame_index(mks);
- sk = lookup_sdl_code(sks);
+ int index = default_table.lookup_mame_index(mks);
+ int sk = lookup_sdl_code(sks);
if (sk >= 0 && index >= 0)
{
key_trans_entry &entry = (*custom_table)[index];
- entry.sdl_key = sk;
- // vk and ak are not really needed
- //key_trans_table[index][VIRTUAL_KEY] = vk;
- //key_trans_table[index][ASCII_KEY] = ak;
+ entry.sdl_scancode = sk;
entry.ui_name = auto_alloc_array(machine, char, strlen(kns) + 1);
strcpy(entry.ui_name, kns);
osd_printf_verbose("Keymap: Mapped <%s> to <%s> with ui-text <%s>\n", sks, mks, kns);
}
else
- osd_printf_warning("Keymap: Error on line %d - %s key not found: %s\n", line, (sk<0) ? "sdl" : "mame", buf);
+ osd_printf_error("Keymap: Error on line %d - %s key not found: %s\n", line, (sk<0) ? "sdl" : "mame", buf);
}
}
line++;
diff --git a/src/osd/modules/input/input_x11.cpp b/src/osd/modules/input/input_x11.cpp
index 0762b5ae35d..f7c48a10d87 100644
--- a/src/osd/modules/input/input_x11.cpp
+++ b/src/osd/modules/input/input_x11.cpp
@@ -401,7 +401,23 @@ public:
else if (xevent.type == button_press_type || xevent.type == button_release_type)
{
XDeviceButtonEvent *button = reinterpret_cast<XDeviceButtonEvent *>(&xevent);
- lightgun.buttons[button->button] = (xevent.type == button_press_type) ? 0x80 : 0;
+
+ /*
+ * SDL/X11 Number the buttons 1,2,3, while windows and other parts of MAME
+ * like offscreen_reload expect 0,2,1. Transpose buttons 2 and 3, and then
+ * -1 the button number to align the numbering schemes.
+ */
+ int button_number = button->button;
+ switch (button_number)
+ {
+ case 2:
+ button_number = 3;
+ break;
+ case 3:
+ button_number = 2;
+ break;
+ }
+ lightgun.buttons[button_number - 1] = (xevent.type == button_press_type) ? 0x80 : 0;
}
}
diff --git a/src/osd/modules/lib/osdobj_common.cpp b/src/osd/modules/lib/osdobj_common.cpp
index 3cb67e6ded4..d3f5f35192e 100644
--- a/src/osd/modules/lib/osdobj_common.cpp
+++ b/src/osd/modules/lib/osdobj_common.cpp
@@ -163,7 +163,7 @@ const options_entry osd_options::s_option_entries[] =
};
osd_options::osd_options()
-: emu_options()
+ : emu_options()
{
add_entries(osd_options::s_option_entries);
}
@@ -176,20 +176,20 @@ std::list<std::shared_ptr<osd_window>> osd_common_t::s_window_list;
//-------------------------------------------------
osd_common_t::osd_common_t(osd_options &options)
- : osd_output(), m_machine(nullptr),
- m_options(options),
- m_print_verbose(false),
- m_font_module(nullptr),
- m_sound(nullptr),
- m_debugger(nullptr),
- m_midi(nullptr),
- m_keyboard_input(nullptr),
- m_mouse_input(nullptr),
- m_lightgun_input(nullptr),
- m_joystick_input(nullptr),
- m_output(nullptr),
- m_monitor_module(nullptr),
- m_watchdog(nullptr)
+ : osd_output(), m_machine(nullptr)
+ , m_options(options)
+ , m_print_verbose(false)
+ , m_font_module(nullptr)
+ , m_sound(nullptr)
+ , m_debugger(nullptr)
+ , m_midi(nullptr)
+ , m_keyboard_input(nullptr)
+ , m_mouse_input(nullptr)
+ , m_lightgun_input(nullptr)
+ , m_joystick_input(nullptr)
+ , m_output(nullptr)
+ , m_monitor_module(nullptr)
+ , m_watchdog(nullptr)
{
osd_output::push(this);
}
@@ -409,7 +409,6 @@ void osd_common_t::output_callback(osd_output_channel channel, const char *msg,
void osd_common_t::init(running_machine &machine)
{
- //
// This function is responsible for initializing the OSD-specific
// video and input functionality, and registering that functionality
// with the MAME core.
@@ -437,7 +436,6 @@ void osd_common_t::init(running_machine &machine)
//
// Audio initialization may eventually move into here as well,
// instead of relying on independent callbacks from each system.
- //
m_machine = &machine;
diff --git a/src/osd/modules/lib/osdobj_common.h b/src/osd/modules/lib/osdobj_common.h
index 8c275ebf48d..af4d2d332bc 100644
--- a/src/osd/modules/lib/osdobj_common.h
+++ b/src/osd/modules/lib/osdobj_common.h
@@ -245,11 +245,12 @@ public:
// osd_output interface ...
virtual void output_callback(osd_output_channel channel, const char *msg, va_list args) override;
bool verbose() const { return m_print_verbose; }
- void set_verbose(bool print_verbose) { m_print_verbose = print_verbose; }
+ virtual void set_verbose(bool print_verbose) override { m_print_verbose = print_verbose; }
void notify(const char *outname, int32_t value) const { m_output->notify(outname, value); }
static std::list<std::shared_ptr<osd_window>> s_window_list;
+
protected:
virtual bool input_init();
virtual void input_pause();
diff --git a/src/osd/modules/osdhelper.h b/src/osd/modules/osdhelper.h
index 463d8cdfb48..093c392e249 100644
--- a/src/osd/modules/osdhelper.h
+++ b/src/osd/modules/osdhelper.h
@@ -6,23 +6,23 @@
//
//============================================================
-#pragma once
+#ifndef MAME_OSD_MODULES_OSDHELPER_H
+#define MAME_OSD_MODULES_OSDHELPER_H
-#ifndef __OSDHELPER__
-#define __OSDHELPER__
+#pragma once
class osd_dim
{
public:
- osd_dim(const int &w, const int &h)
- : m_w(w), m_h(h)
- {
- }
- int width() const { return m_w; }
- int height() const { return m_h; }
+ constexpr osd_dim() : m_w(0), m_h(0) { }
+ constexpr osd_dim(int w, int h) : m_w(w), m_h(h) { }
+
+ constexpr int width() const { return m_w; }
+ constexpr int height() const { return m_h; }
+
+ constexpr bool operator!=(const osd_dim &other) { return (m_w != other.width()) || (m_h != other.height()); }
+ constexpr bool operator==(const osd_dim &other) { return (m_w == other.width()) && (m_h == other.height()); }
- bool operator!=(const osd_dim &other) { return (m_w != other.width()) || (m_h != other.height()); }
- bool operator==(const osd_dim &other) { return (m_w == other.width()) && (m_h == other.height()); }
private:
int m_w;
int m_h;
@@ -31,30 +31,25 @@ private:
class osd_rect
{
public:
- osd_rect()
- : m_x(0), m_y(0), m_d(0,0)
- {
- }
- osd_rect(const int x, const int y, const int &w, const int &h)
- : m_x(x), m_y(y), m_d(w,h)
- {
- }
- osd_rect(const int x, const int y, const osd_dim &d)
- : m_x(x), m_y(y), m_d(d)
- {
- }
- int top() const { return m_y; }
- int left() const { return m_x; }
- int width() const { return m_d.width(); }
- int height() const { return m_d.height(); }
+ constexpr osd_rect() : m_x(0), m_y(0), m_d(0, 0) { }
+ constexpr osd_rect(int x, int y, int w, int h) : m_x(x), m_y(y), m_d(w, h) { }
+ constexpr osd_rect(int x, int y, const osd_dim &d) : m_x(x), m_y(y), m_d(d) { }
+
+ constexpr int left() const { return m_x; }
+ constexpr int top() const { return m_y; }
+ constexpr int width() const { return m_d.width(); }
+ constexpr int height() const { return m_d.height(); }
+
+ constexpr osd_dim dim() const { return m_d; }
- osd_dim dim() const { return m_d; }
+ constexpr int right() const { return m_x + m_d.width(); }
+ constexpr int bottom() const { return m_y + m_d.height(); }
- int bottom() const { return m_y + m_d.height(); }
- int right() const { return m_x + m_d.width(); }
+ constexpr osd_rect move_by(int dx, int dy) const { return osd_rect(m_x + dx, m_y + dy, m_d); }
+ constexpr osd_rect resize(int w, int h) const { return osd_rect(m_x, m_y, w, h); }
- osd_rect move_by(int dx, int dy) const { return osd_rect(m_x + dx, m_y + dy, m_d); }
- osd_rect resize(int w, int h) const { return osd_rect(m_x, m_y, w, h); }
+ constexpr bool operator!=(const osd_rect &other) { return (m_x != other.left()) || (m_y != other.top()) || (m_d != other.dim()); }
+ constexpr bool operator==(const osd_rect &other) { return (m_x == other.left()) && (m_y == other.top()) && (m_d == other.dim()); }
private:
int m_x;
@@ -62,4 +57,4 @@ private:
osd_dim m_d;
};
-#endif // __OSDHELPER__
+#endif // MAME_OSD_MODULES_OSDHELPER_H
diff --git a/src/osd/modules/render/bgfx/shaders/chains/hlsl/fs_chroma.sc b/src/osd/modules/render/bgfx/shaders/chains/hlsl/fs_chroma.sc
index b76370c0aa9..51bb14676d3 100644
--- a/src/osd/modules/render/bgfx/shaders/chains/hlsl/fs_chroma.sc
+++ b/src/osd/modules/render/bgfx/shaders/chains/hlsl/fs_chroma.sc
@@ -23,9 +23,9 @@ void main()
vec4 cout = vec4(0.0, 0.0, 0.0, cin.a);
mat3 xy = mat3(u_chroma_a.xyz, u_chroma_b.xyz, u_chroma_c.xyz);
const mat3 XYZ_TO_sRGB = mat3(
- 3.2406, -1.5372, -0.4986,
- -0.9689, 1.8758, 0.0415,
- 0.0557, -0.2040, 1.0570
+ 3.2406, -0.9689, 0.0557,
+ -1.5372, 1.8758, -0.2040,
+ -0.4986, 0.0415, 1.0570
);
for (int i = 0; i < 3; ++i) {
diff --git a/src/osd/modules/render/bgfx/shaders/chains/xbr/fs_xbr-lv3-noblend.sc b/src/osd/modules/render/bgfx/shaders/chains/xbr/fs_xbr-lv3-noblend.sc
index 8d65128f8fc..554c222db47 100644
--- a/src/osd/modules/render/bgfx/shaders/chains/xbr/fs_xbr-lv3-noblend.sc
+++ b/src/osd/modules/render/bgfx/shaders/chains/xbr/fs_xbr-lv3-noblend.sc
@@ -166,11 +166,11 @@ void main()
// It uses CORNER_C if none of the others are defined.
#ifdef CORNER_A
vec4 interp_restriction_lv1 = interp_restriction_lv0;
-#elif CORNER_B
+#elif defined(CORNER_B)
vec4 interp_restriction_lv1 = (interp_restriction_lv0 * (neq(f,b) * neq(h,d) + eq(e,i) * neq(f,i4) * neq(h,i5) + eq(e,g) + eq(e,c)));
-#elif CORNER_D
+#elif defined(CORNER_D)
vec4 interp_restriction_lv1 = (interp_restriction_lv0 * (neq(f,b) * neq(h,d) + eq(e,i) * neq(f,i4) * neq(h,i5) + eq(e,g) + eq(e,c)) * (vec4(notEqual(f,f4)) * vec4(notEqual(f,i)) + vec4(notEqual(h,h5)) * vec4(notEqual(h,i)) + vec4(notEqual(h,g)) + vec4(notEqual(f,c)) + eq(b,c1) * eq(d,g0)));
-#elif CORNER_C
+#elif defined(CORNER_C)
vec4 interp_restriction_lv1 = (interp_restriction_lv0 * (neq(f,b) * neq(f,c) + neq(h,d) * neq(h,g) + eq(e,i) * (neq(f,f4) * neq(f,i4) + neq(h,h5) * neq(h,i5)) + eq(e,g) + eq(e,c)));
#endif
diff --git a/src/osd/modules/render/bgfx/shaders/shader.mk b/src/osd/modules/render/bgfx/shaders/shader.mk
index 84035e255fa..e7db3cdc242 100644
--- a/src/osd/modules/render/bgfx/shaders/shader.mk
+++ b/src/osd/modules/render/bgfx/shaders/shader.mk
@@ -1,5 +1,5 @@
#
-# Copyright 2011-2018 Branimir Karadzic. All rights reserved.
+# Copyright 2011-2019 Branimir Karadzic. All rights reserved.
# License: http://www.opensource.org/licenses/BSD-2-Clause
#
diff --git a/src/osd/modules/render/drawogl.cpp b/src/osd/modules/render/drawogl.cpp
index 98db62fdf1f..95345878cfd 100644
--- a/src/osd/modules/render/drawogl.cpp
+++ b/src/osd/modules/render/drawogl.cpp
@@ -2056,8 +2056,9 @@ static inline void copyline_palette16(uint32_t *dst, const uint16_t *src, int wi
for (x = 0; x < width; x++)
{
int srcpix = *src++;
+ uint32_t dstval = 0xff000000 | palette[srcpix];
for (int x2 = 0; x2 < xprescale; x2++)
- *dst++ = 0xff000000 | palette[srcpix];
+ *dst++ = dstval;
}
if (xborderpix)
*dst++ = 0xff000000 | palette[*--src];
@@ -2079,8 +2080,9 @@ static inline void copyline_palettea16(uint32_t *dst, const uint16_t *src, int w
for (x = 0; x < width; x++)
{
int srcpix = *src++;
+ uint32_t dstval = palette[srcpix];
for (int x2 = 0; x2 < xprescale; x2++)
- *dst++ = palette[srcpix];
+ *dst++ = dstval;
}
if (xborderpix)
*dst++ = palette[*--src];
@@ -2109,10 +2111,9 @@ static inline void copyline_rgb32(uint32_t *dst, const uint32_t *src, int width,
for (x = 0; x < width; x++)
{
rgb_t srcpix = *src++;
+ uint32_t dstval = 0xff000000 | palette[0x200 + srcpix.r()] | palette[0x100 + srcpix.g()] | palette[srcpix.b()];
for (int x2 = 0; x2 < xprescale; x2++)
- {
- *dst++ = 0xff000000 | palette[0x200 + srcpix.r()] | palette[0x100 + srcpix.g()] | palette[srcpix.b()];
- }
+ *dst++ = dstval;
}
if (xborderpix)
{
@@ -2129,11 +2130,9 @@ static inline void copyline_rgb32(uint32_t *dst, const uint32_t *src, int width,
for (x = 0; x < width; x++)
{
rgb_t srcpix = *src++;
-
+ uint32_t dstval = 0xff000000 | srcpix;
for (int x2 = 0; x2 < xprescale; x2++)
- {
- *dst++ = 0xff000000 | srcpix;
- }
+ *dst++ = dstval;
}
if (xborderpix)
*dst++ = 0xff000000 | *--src;
@@ -2161,8 +2160,9 @@ static inline void copyline_argb32(uint32_t *dst, const uint32_t *src, int width
for (x = 0; x < width; x++)
{
rgb_t srcpix = *src++;
+ uint32_t dstval = (srcpix & 0xff000000) | palette[0x200 + srcpix.r()] | palette[0x100 + srcpix.g()] | palette[srcpix.b()];
for (int x2 = 0; x2 < xprescale; x2++)
- *dst++ = (srcpix & 0xff000000) | palette[0x200 + srcpix.r()] | palette[0x100 + srcpix.g()] | palette[srcpix.b()];
+ *dst++ = dstval;
}
if (xborderpix)
{
@@ -2257,10 +2257,12 @@ static inline void copyline_yuy16_to_argb(uint32_t *dst, const uint16_t *src, in
uint16_t srcpix1 = *src++;
uint8_t cb = srcpix0 & 0xff;
uint8_t cr = srcpix1 & 0xff;
+ uint32_t dstval0 = ycc_to_rgb(palette[0x000 + (srcpix0 >> 8)], cb, cr);
+ uint32_t dstval1 = ycc_to_rgb(palette[0x000 + (srcpix1 >> 8)], cb, cr);
for (int x2 = 0; x2 < xprescale; x2++)
- *dst++ = ycc_to_rgb(palette[0x000 + (srcpix0 >> 8)], cb, cr);
+ *dst++ = dstval0;
for (int x2 = 0; x2 < xprescale; x2++)
- *dst++ = ycc_to_rgb(palette[0x000 + (srcpix1 >> 8)], cb, cr);
+ *dst++ = dstval1;
}
if (xborderpix)
{
@@ -2291,10 +2293,12 @@ static inline void copyline_yuy16_to_argb(uint32_t *dst, const uint16_t *src, in
uint16_t srcpix1 = *src++;
uint8_t cb = srcpix0 & 0xff;
uint8_t cr = srcpix1 & 0xff;
+ uint32_t dstval0 = ycc_to_rgb(srcpix0 >> 8, cb, cr);
+ uint32_t dstval1 = ycc_to_rgb(srcpix1 >> 8, cb, cr);
for (int x2 = 0; x2 < xprescale; x2++)
- *dst++ = ycc_to_rgb(srcpix0 >> 8, cb, cr);
+ *dst++ = dstval0;
for (int x2 = 0; x2 < xprescale; x2++)
- *dst++ = ycc_to_rgb(srcpix1 >> 8, cb, cr);
+ *dst++ = dstval1;
}
if (xborderpix)
{
diff --git a/src/osd/modules/sound/sdl_sound.cpp b/src/osd/modules/sound/sdl_sound.cpp
index a04a44c0298..5ff8f2e6821 100644
--- a/src/osd/modules/sound/sdl_sound.cpp
+++ b/src/osd/modules/sound/sdl_sound.cpp
@@ -46,7 +46,6 @@ public:
sound_sdl() :
osd_module(OSD_SOUND_PROVIDER, "sdl"), sound_module(),
stream_in_initialized(0),
- stream_loop(0),
attenuation(0), buf_locked(0), stream_buffer(nullptr), stream_buffer_size(0), buffer_underflows(0), buffer_overflows(0)
{
sdl_xfer_samples = SDL_XFER_SAMPLES;
@@ -80,7 +79,7 @@ private:
static void sdl_callback(void *userdata, Uint8 *stream, int len);
- int lock_buffer();
+ void lock_buffer();
void unlock_buffer();
void attenuate(int16_t *data, int bytes);
void copy_sample_data(bool is_throttled, const int16_t *data, int bytes_to_copy);
@@ -89,7 +88,6 @@ private:
int sdl_xfer_samples;
int stream_in_initialized;
- int stream_loop;
int attenuation;
int buf_locked;
@@ -179,7 +177,7 @@ int sound_sdl::ring_buffer::pop(void *data, size_t size)
//============================================================
// lock_buffer
//============================================================
-int sound_sdl::lock_buffer()
+void sound_sdl::lock_buffer()
{
if (!buf_locked)
SDL_LockAudio();
@@ -187,8 +185,6 @@ int sound_sdl::lock_buffer()
if (LOG_SOUND)
*sound_log << "locking\n";
-
- return 0;
}
//============================================================
@@ -359,7 +355,6 @@ int sound_sdl::init(const osd_options &options)
sdl_xfer_samples = SDL_XFER_SAMPLES;
stream_in_initialized = 0;
- stream_loop = 0;
// set up the audio specs
aspec.freq = sample_rate();
diff --git a/src/osd/osdepend.h b/src/osd/osdepend.h
index 07f6ddd99f1..2587b93e560 100644
--- a/src/osd/osdepend.h
+++ b/src/osd/osdepend.h
@@ -7,11 +7,11 @@
OS-dependent code interface.
*******************************************************************c********/
+#ifndef MAME_OSD_OSDEPEND_H
+#define MAME_OSD_OSDEPEND_H
#pragma once
-#ifndef MAME_OSD_OSDEPEND_H
-#define MAME_OSD_OSDEPEND_H
#include "emucore.h"
#include "osdcore.h"
@@ -64,6 +64,7 @@ public:
// general overridables
virtual void init(running_machine &machine) = 0;
virtual void update(bool skip_redraw) = 0;
+ virtual void set_verbose(bool print_verbose) = 0;
// debugger overridables
virtual void init_debugger() = 0;
diff --git a/src/osd/sdl/sdlmain.cpp b/src/osd/sdl/sdlmain.cpp
index f7d80a10484..37d1434a2e8 100644
--- a/src/osd/sdl/sdlmain.cpp
+++ b/src/osd/sdl/sdlmain.cpp
@@ -375,6 +375,7 @@ static void osd_sdl_info(void)
void sdl_osd_interface::video_register()
{
video_options_add("soft", nullptr);
+ video_options_add("accel", nullptr);
#if USE_OPENGL
video_options_add("opengl", nullptr);
#endif
diff --git a/src/osd/windows/video.h b/src/osd/windows/video.h
index 3f4b49efbe4..c012e42af9d 100644
--- a/src/osd/windows/video.h
+++ b/src/osd/windows/video.h
@@ -1,19 +1,29 @@
// license:BSD-3-Clause
-// copyright-holders:Aaron Giles
+// copyright-holders:Aaron Giles, Vas Crabb
//============================================================
//
-// video.h - Win32 implementation of MAME video routines
+// video.h - Win32 video helpers
//
//============================================================
+#ifndef MAME_OSD_WINDOWS_VIDEO_H
+#define MAME_OSD_WINDOWS_VIDEO_H
-#ifndef __WIN_VIDEO__
-#define __WIN_VIDEO__
+#pragma once
#include "modules/osdhelper.h"
-inline osd_rect RECT_to_osd_rect(const RECT &r)
+#include <windows.h>
+
+
+constexpr osd_rect RECT_to_osd_rect(RECT const &r)
{
return osd_rect(r.left, r.top, r.right - r.left, r.bottom - r.top);
}
-#endif
+inline RECT osd_rect_to_RECT(osd_rect const &r)
+{
+ RECT const result{ r.left(), r.top(), r.right(), r.bottom() };
+ return result;
+}
+
+#endif // MAME_OSD_WINDOWS_VIDEO_H
diff --git a/src/osd/windows/window.cpp b/src/osd/windows/window.cpp
index c3376b2fb0c..d331ec3f4d8 100644
--- a/src/osd/windows/window.cpp
+++ b/src/osd/windows/window.cpp
@@ -15,6 +15,7 @@
#include <process.h>
#include <atomic>
+#include <cstring>
#include <chrono>
#include <list>
#include <memory>
@@ -1663,7 +1664,7 @@ void win_window_info::minimize_window()
RECT bounds;
GetWindowRect(platform_window(), &bounds);
- osd_rect newrect(bounds.left, bounds.top, newsize );
+ osd_rect newrect(bounds.left, bounds.top, newsize);
SetWindowPos(platform_window(), nullptr, newrect.left(), newrect.top(), newrect.width(), newrect.height(), SWP_NOZORDER);
@@ -1715,17 +1716,35 @@ void win_window_info::adjust_window_position_after_major_change()
if (video_config.keepaspect)
newrect = constrain_to_aspect_ratio(newrect, WMSZ_BOTTOMRIGHT);
}
-
- // in full screen, make sure it covers the primary display
else
{
+ // in full screen, make sure it covers the primary display
std::shared_ptr<osd_monitor_info> monitor = monitor_from_rect(nullptr);
newrect = monitor->position_size();
}
+ // restrict the window to one monitor and avoid toolbars if possible
+ HMONITOR const nearest_monitor = MonitorFromWindow(platform_window(), MONITOR_DEFAULTTONEAREST);
+ if (NULL != nearest_monitor)
+ {
+ MONITORINFO info;
+ std::memset(&info, 0, sizeof(info));
+ info.cbSize = sizeof(info);
+ if (GetMonitorInfo(nearest_monitor, &info))
+ {
+ if (newrect.right() > info.rcWork.right)
+ newrect = newrect.move_by(info.rcWork.right - newrect.right(), 0);
+ if (newrect.bottom() > info.rcWork.bottom)
+ newrect = newrect.move_by(0, info.rcWork.bottom - newrect.bottom());
+ if (newrect.left() < info.rcWork.left)
+ newrect = newrect.move_by(info.rcWork.left - newrect.left(), 0);
+ if (newrect.top() < info.rcWork.top)
+ newrect = newrect.move_by(0, info.rcWork.top - newrect.top());
+ }
+ }
+
// adjust the position if different
- if (oldrect.left != newrect.left() || oldrect.top != newrect.top() ||
- oldrect.right != newrect.right() || oldrect.bottom != newrect.bottom())
+ if (RECT_to_osd_rect(oldrect) != newrect)
SetWindowPos(platform_window(), fullscreen() ? HWND_TOPMOST : HWND_TOP,
newrect.left(), newrect.top(),
newrect.width(), newrect.height(), 0);
diff --git a/src/osd/windows/winmain.cpp b/src/osd/windows/winmain.cpp
index 9225acc0443..45d790aea78 100644
--- a/src/osd/windows/winmain.cpp
+++ b/src/osd/windows/winmain.cpp
@@ -6,20 +6,6 @@
//
//============================================================
-// only for oslog callback
-#include <functional>
-
-// standard windows headers
-#include <windows.h>
-#include <commctrl.h>
-#include <mmsystem.h>
-#include <tchar.h>
-#include <io.h>
-
-// standard C headers
-#include <ctype.h>
-#include <stdarg.h>
-
// MAME headers
#include "emu.h"
#include "emuopts.h"
@@ -34,6 +20,18 @@
#include "modules/diagnostics/diagnostics_module.h"
#include "modules/monitor/monitor_common.h"
+// standard C headers
+#include <ctype.h>
+#include <stdarg.h>
+#include <stdio.h>
+
+// standard windows headers
+#include <windows.h>
+#include <commctrl.h>
+#include <mmsystem.h>
+#include <tchar.h>
+#include <io.h>
+
#if !WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
#include <wrl/client.h>
using namespace Windows::Storage;
@@ -475,6 +473,8 @@ void windows_osd_interface::output_oslog(const char *buffer)
{
if (IsDebuggerPresent())
win_output_debug_string_utf8(buffer);
+ else
+ fputs(buffer, stderr);
}
@@ -573,10 +573,7 @@ void windows_osd_interface::init(running_machine &machine)
// hook up the debugger log
if (options.oslog())
- {
- using namespace std::placeholders;
- machine.add_logerror_callback(std::bind(&windows_osd_interface::output_oslog, this, _1));
- }
+ machine.add_logerror_callback(&windows_osd_interface::output_oslog);
#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
// crank up the multimedia timer resolution to its max
diff --git a/src/osd/windows/winmain.h b/src/osd/windows/winmain.h
index 79e3b023b64..5fb71fa9286 100644
--- a/src/osd/windows/winmain.h
+++ b/src/osd/windows/winmain.h
@@ -312,7 +312,7 @@ protected:
private:
virtual void osd_exit() override;
- void output_oslog(const char *buffer);
+ static void output_oslog(const char *buffer);
windows_options & m_options;
diff --git a/src/osd/windows/winutf8.cpp b/src/osd/windows/winutf8.cpp
index 1c076158ebe..a056d694b89 100644
--- a/src/osd/windows/winutf8.cpp
+++ b/src/osd/windows/winutf8.cpp
@@ -6,15 +6,15 @@
//
//============================================================
-// standard windows headers
-#include <windows.h>
-#include <shellapi.h>
-#include <stdlib.h>
-
// MAMEOS headers
#include "winutf8.h"
#include "strconv.h"
+#include <stdlib.h>
+
+// standard windows headers
+#include <shellapi.h>
+
//============================================================
// win_output_debug_string_utf8
diff --git a/src/osd/windows/winutf8.h b/src/osd/windows/winutf8.h
index a8d072ed2cc..1ec5429cfab 100644
--- a/src/osd/windows/winutf8.h
+++ b/src/osd/windows/winutf8.h
@@ -6,11 +6,15 @@
//
//============================================================
-#ifndef __WINUTF8__
-#define __WINUTF8__
+#ifndef MAME_OSD_WINDOWS_WINUTF8_H
+#define MAME_OSD_WINDOWS_WINUTF8_H
+
+#pragma once
#include "osdcore.h"
+#include <windows.h>
+
// wrappers for kernel32.dll
void win_output_debug_string_utf8(const char *string);
@@ -18,8 +22,15 @@ void win_output_debug_string_utf8(const char *string);
int win_message_box_utf8(HWND window, const char *text, const char *caption, UINT type);
BOOL win_set_window_text_utf8(HWND window, const char *text);
std::string win_get_window_text_utf8(HWND window);
-HWND win_create_window_ex_utf8(DWORD exstyle, const char* classname, const char* windowname, DWORD style,
- int x, int y, int width, int height, HWND wndparent, HMENU menu,
- HINSTANCE instance, void* param);
+HWND win_create_window_ex_utf8(
+ DWORD exstyle,
+ const char *classname,
+ const char *windowname,
+ DWORD style,
+ int x, int y, int width, int height,
+ HWND wndparent,
+ HMENU menu,
+ HINSTANCE instance,
+ void *param);
-#endif // __WINUTF8__
+#endif // MAME_OSD_WINDOWS_WINUTF8_H
diff --git a/src/tools/chdman.cpp b/src/tools/chdman.cpp
index cc807e622c8..7bdf2be0a9b 100644
--- a/src/tools/chdman.cpp
+++ b/src/tools/chdman.cpp
@@ -1259,7 +1259,7 @@ void output_track_metadata(int mode, util::core_file &file, int tracknum, const
switch (info.trktype)
{
case CD_TRACK_MODE1:
- mode = 0;
+ mode = 4;
size = 2048;
break;
diff --git a/src/tools/imgtool/filtbas.cpp b/src/tools/imgtool/filtbas.cpp
index c626fb25b86..10da0694844 100644
--- a/src/tools/imgtool/filtbas.cpp
+++ b/src/tools/imgtool/filtbas.cpp
@@ -116,6 +116,8 @@ static imgtoolerr_t basic_readfile(const basictokens *tokens,
destf.printf("%u ", (unsigned) line_number);
shift = 0x00;
+ in_string = false; // in case the last line didn't terminate a string
+
while((mem_stream->read(&b, 1) > 0) && (b != 0x00))
{
if (b == 0x22)
diff --git a/src/tools/imgtool/main.cpp b/src/tools/imgtool/main.cpp
index 5c55535932e..6ed8b486825 100644
--- a/src/tools/imgtool/main.cpp
+++ b/src/tools/imgtool/main.cpp
@@ -287,6 +287,8 @@ static int cmd_dir(const struct command *c, int argc, char *argv[])
util::stream_format(std::wcout, L"%8i File(s) %8i bytes", total_count, total_size);
if (!freespace_err)
util::stream_format(std::wcout, L" %8u bytes free\n", (unsigned int)freespace);
+ else
+ util::stream_format(std::wcout, L"\n");
done:
if (err)
diff --git a/src/tools/imgtool/modules.cpp b/src/tools/imgtool/modules.cpp
index ec2762d34fc..35b31a38be0 100644
--- a/src/tools/imgtool/modules.cpp
+++ b/src/tools/imgtool/modules.cpp
@@ -103,5 +103,6 @@ MODULE(bml3)
MODULE(hp48)
MODULE(hp9845_tape)
MODULE(hp85_tape)
+MODULE(rt11)
#endif /* MODULES_RECURSIVE */
diff --git a/src/tools/imgtool/modules/rt11.cpp b/src/tools/imgtool/modules/rt11.cpp
new file mode 100644
index 00000000000..f7f5a515f2c
--- /dev/null
+++ b/src/tools/imgtool/modules/rt11.cpp
@@ -0,0 +1,695 @@
+// license:BSD-3-Clause
+// copyright-holders:Sergey Svishchev
+/****************************************************************************
+
+ rt11.cpp
+
+ DEC RT-11 disk images
+
+ References:
+
+ VaFFM -- bitsavers://pdf/dec/pdp11/rt11/v5.6_Aug91/AA-PD6PA-TC_RT-11_Volume_and_File_Formats_Manual_Aug91.pdf
+ DHM -- bitsavers://pdf/dec/pdp11/rt11/v5.6_Aug91/AA-PE7VA-TC_RT-11_Device_Handlers_Manual_Aug91.pdf
+ SSM -- bitsavers://pdf/dec/pdp11/rt11/v5.0_Mar83/AA-H379B-TC_5.0_SWsuppMar83.pdf
+ TSX+ -- bitsavers://pdf/dec/pdp11/tsxPlus/manuals_6.31/TSX-Plus_UsersRef_Jan88.pdf
+ PUTR -- http://www.dbit.com/pub/putr/putr.asm
+
+ To do:
+ - filter for text files
+ - read-write support
+ - report empty 'last modified' time if date field is all zeros
+ - report free space
+ - arbitrary sized images
+ - don't crash when strings in home block have non-ascii chars (charconverter does not apply)
+ - do something about bootblock bug in imgtool (commit aca90520)
+
+ LBN Contents
+ --- --------
+ 0 Reserved (primary bootstrap)
+ 1 Reserved (home block)
+ 2-5 Reserved (secondary bootstrap)
+ 6-7 Directory segment 1
+ ... Directory segment 2-n
+ ... Data
+
+ Home block
+ ----------
+ 000-201 Bad block replacement table
+ 202-203 ?
+ 204-251 INITIALIZE/RESTORE data area
+ 252-273 BUP information area
+ 274-677 ?
+ 700-701 (Reserved for Digital, must be zero)
+ 702-703 (Reserved for Digital, must be zero)
+ 704-721 ?
+ 722-723 Pack cluster size (= 1)
+ 724-725 Block number of first directory segment
+ 726-727 System version (RAD50)
+ 730-742 Volume Identification
+ 744-757 Owner name
+ 760-773 System Identification
+ 776-777 Checksum
+
+ Directory segment header
+ ------------------------
+ 0 The total number of segments in this directory.
+ 1 The segment number of the next logical directory segment. If this word is 0, there are no more segments in the list.
+ 2 The number of the highest segment currently in use. Valid only in the first directory segment.
+ 3 The number of extra bytes per directory entry, always an unsigned, even octal number.
+ 4 The block number on the volume where the actual stored data identified by this segment begins.
+
+ Directory entry
+ ---------------
+ 0 Status word
+ 1 File name 1-3 (RAD50)
+ 2 File name 4-6 (RAD50)
+ 3 File type 1-3 (RAD50)
+ 4 Total file length (blocks)
+ 5 Job#, Channel# (RT-11 uses this information only for tentative files)
+ 6 Creation date
+ 7- Optional extra words
+
+****************************************************************************/
+
+#include "imgtool.h"
+#include "formats/imageutl.h"
+#include "iflopimg.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+
+namespace
+{
+ struct rt11_diskinfo
+ {
+ uint16_t directory_start;
+ uint16_t total_segments;
+ uint16_t last_segment;
+ uint16_t dirent_size;
+ int dirents_per_block;
+ // autodetected
+ int tracks;
+ int heads;
+ int sectors;
+ uint32_t sector_size;
+ // cache
+ int map[16];
+ int cached_track;
+ int cached_head;
+ };
+
+ enum misc_t
+ {
+ HOME_BLOCK = 1,
+ BLOCK_SIZE = 512
+ };
+
+ struct rt11_direnum
+ {
+ uint8_t segment_data[2 * BLOCK_SIZE];
+ uint16_t segment;
+ uint16_t index;
+ uint16_t data;
+ };
+
+ struct rt11_dirent
+ {
+ uint16_t status;
+ uint16_t filename[3];
+ uint16_t time;
+ // synthetic
+ uint64_t filesize;
+ uint16_t data;
+ };
+
+ enum rt11_status
+ {
+ E_PRE = 0000020,
+ E_TENT = 0000400,
+ E_MPTY = 0001000,
+ E_PERM = 0002000,
+ E_EOS = 0004000,
+ E_READ = 0040000,
+ E_PROT = 0100000
+ };
+
+ enum creation_policy_t
+ {
+ CREATE_NONE,
+ CREATE_FILE,
+ };
+
+
+ util::arbitrary_datetime _rt11_crack_time(uint16_t rt11_time)
+ {
+ util::arbitrary_datetime dt;
+
+ dt.second = 0;
+ dt.minute = 0;
+ dt.hour = 0;
+ dt.day_of_month = (rt11_time >> 5) & 31;
+ dt.month = (rt11_time >> 10) & 15;
+ dt.year = 1972 + (rt11_time & 31) + 32 * ((rt11_time >> 14) & 3);
+
+ return dt;
+ }
+
+ imgtool::datetime rt11_crack_time(uint16_t rt11_time)
+ {
+ util::arbitrary_datetime dt;
+ imgtool::datetime it;
+
+ if (rt11_time == 0)
+ {
+ return imgtool::datetime(imgtool::datetime::datetime_type::NONE, dt);
+ }
+
+ dt = _rt11_crack_time(rt11_time);
+
+ it = imgtool::datetime(imgtool::datetime::datetime_type::LOCAL, dt);
+
+ return it;
+ }
+
+ void rt11_from_rad50(char *ascii, uint16_t *rad50, int num)
+ {
+ const char rad[] = " ABCDEFGHIJKLMNOPQRSTUVWXYZ$.%0123456789:";
+
+ for (int i = 0, j = 0; i < num; i++)
+ {
+ ascii[j++] = rad[ rad50[i] / (050 * 050)];
+ ascii[j++] = rad[(rad50[i] / 050) % 050];
+ ascii[j++] = rad[ rad50[i] % 050];
+ }
+ }
+
+ void rt11_filename_from_rad50(char *ascii, uint16_t *rad50)
+ {
+ int i, j;
+
+ rt11_from_rad50(&ascii[0], &rad50[0], 2);
+ for (i = 0; i < 6; i++)
+ {
+ if (ascii[i] == ' ') break;
+ }
+ ascii[i++] = '.';
+ rt11_from_rad50(&ascii[i], &rad50[2], 1);
+ for (j = i; j < i + 3; j++)
+ {
+ if (ascii[j] == ' ') break;
+ }
+ ascii[j] = '\0';
+ }
+
+ int is_file_storagetype(uint16_t status)
+ {
+ return !(status & (E_MPTY | E_EOS | E_TENT));
+ }
+
+ rt11_diskinfo *get_rt11_info(imgtool::image &image)
+ {
+ return (rt11_diskinfo *)imgtool_floppy_extrabytes(image);
+ }
+}
+
+
+static imgtoolerr_t rt11_image_get_geometry(imgtool::image &image, uint32_t *tracks, uint32_t *heads, uint32_t *sectors)
+{
+ const rt11_diskinfo *di = get_rt11_info(image);
+
+ *sectors = di->sectors;
+ *heads = di->heads;
+ *tracks = di->tracks;
+ return IMGTOOLERR_SUCCESS;
+}
+
+static imgtoolerr_t rt11_get_sector_position(imgtool::image &image, uint32_t sector_index,
+ uint32_t &head, uint32_t &track, uint32_t &sector)
+{
+ imgtoolerr_t err;
+ rt11_diskinfo *di = get_rt11_info(image);
+ uint32_t tracks, heads, sectors;
+
+ err = image.get_geometry(&tracks, &heads, &sectors);
+ if (err)
+ return err;
+
+ track = sector_index / sectors / heads;
+ head = (sector_index / sectors) % heads;
+
+ // map 1-based sector numbers, possibly interleaved, to sector indexes
+ if (track != di->cached_track || head != di->cached_head)
+ {
+ memset(di->map, -1, sizeof(di->map));
+ for (int i = 0; i < 256; i++)
+ {
+ int sector_id;
+
+ if (floppy_get_indexed_sector_info(imgtool_floppy(image), head, track, i, NULL, NULL, &sector_id, NULL, NULL))
+ continue;
+
+ if (sector_id > 0 && sector_id <= sectors)
+ di->map[sector_id - 1] = i;
+ }
+ di->cached_track = track;
+ di->cached_head = head;
+ }
+
+ if (di->map[(sector_index % sectors)] < 0)
+ {
+ return IMGTOOLERR_SEEKERROR;
+ }
+ else
+ {
+ sector = di->map[(sector_index % sectors)];
+ return IMGTOOLERR_SUCCESS;
+ }
+}
+
+
+static imgtoolerr_t rt11_image_readblock(imgtool::image &image, void *buffer, uint64_t block)
+{
+ imgtoolerr_t err;
+ floperr_t ferr;
+ const rt11_diskinfo *di = get_rt11_info(image);
+ uint32_t track, head, sector;
+ unsigned long flags;
+
+ if (di->sector_size == 256)
+ {
+ err = rt11_get_sector_position(image, block * 2, head, track, sector);
+ if (err)
+ return err;
+
+ ferr = floppy_read_indexed_sector(imgtool_floppy(image), head, track, sector, 0, buffer, 256);
+ if (ferr)
+ return imgtool_floppy_error(ferr);
+
+ ferr = floppy_get_indexed_sector_info(imgtool_floppy(image), head, track, sector, NULL, NULL, NULL, NULL, &flags);
+ if (ferr)
+ return imgtool_floppy_error(ferr);
+
+ if (flags)
+ return IMGTOOLERR_READERROR;
+
+ err = rt11_get_sector_position(image, (block * 2) + 1, head, track, sector);
+ if (err)
+ return err;
+
+ ferr = floppy_read_indexed_sector(imgtool_floppy(image), head, track, sector, 0, ((uint8_t *) buffer) + 256, 256);
+ if (ferr)
+ return imgtool_floppy_error(ferr);
+
+ ferr = floppy_get_indexed_sector_info(imgtool_floppy(image), head, track, sector, NULL, NULL, NULL, NULL, &flags);
+ if (ferr)
+ return imgtool_floppy_error(ferr);
+
+ if (flags)
+ return IMGTOOLERR_READERROR;
+ }
+ else
+ {
+ err = rt11_get_sector_position(image, block, head, track, sector);
+ if (err)
+ return err;
+
+ ferr = floppy_read_indexed_sector(imgtool_floppy(image), head, track, sector, 0, buffer, BLOCK_SIZE);
+ if (ferr)
+ return imgtool_floppy_error(ferr);
+
+ ferr = floppy_get_indexed_sector_info(imgtool_floppy(image), head, track, sector, NULL, NULL, NULL, NULL, &flags);
+ if (ferr)
+ return imgtool_floppy_error(ferr);
+
+ if (flags)
+ return IMGTOOLERR_READERROR;
+ }
+
+ return IMGTOOLERR_SUCCESS;
+}
+
+static imgtoolerr_t rt11_probe_geometry(imgtool::image &image)
+{
+ floperr_t ferr;
+ rt11_diskinfo *di = get_rt11_info(image);
+
+ // MX (11x256 byte sectors) or MY (10x512 byte sectors)?
+ ferr = floppy_get_indexed_sector_info(imgtool_floppy(image), 0, 0, 0, NULL, NULL, NULL, &di->sector_size, NULL);
+ if (ferr)
+ return imgtool_floppy_error(ferr);
+
+ if (di->sector_size == 256)
+ di->sectors = 11;
+ else
+ di->sectors = 10;
+
+ // double- or single-sided?
+ ferr = floppy_get_indexed_sector_info(imgtool_floppy(image), 1, 0, 0, NULL, NULL, NULL, NULL, NULL);
+ if (ferr)
+ di->heads = 1;
+ else
+ di->heads = 2;
+
+ // 80 or 40 tracks?
+ ferr = floppy_get_indexed_sector_info(imgtool_floppy(image), 0, 50, 0, NULL, NULL, NULL, NULL, NULL);
+ if (ferr)
+ di->tracks = 40;
+ else
+ di->tracks = 80;
+
+ return IMGTOOLERR_SUCCESS;
+}
+
+static imgtoolerr_t rt11_image_open(imgtool::image &image, imgtool::stream::ptr &&dummy)
+{
+ imgtoolerr_t err;
+ uint8_t buffer[BLOCK_SIZE];
+ rt11_diskinfo *di = get_rt11_info(image);
+
+ di->cached_head = -1;
+ di->cached_track = -1;
+ memset(di->map, -1, sizeof(di->map));
+ // dummy values for rt11_image_readblock
+ di->tracks = 40;
+ di->heads = 1;
+
+ err = rt11_probe_geometry(image);
+ if (err)
+ return err;
+
+ /* load home block */
+ err = rt11_image_readblock(image, buffer, HOME_BLOCK);
+ if (err)
+ return err;
+
+ di->directory_start = pick_integer_le(buffer, 0724, 2);
+
+ // real-world images seem to never have a valid checksum, but directory_start is always 6
+#if 0
+ uint16_t tmp, cksum;
+
+ tmp = 0;
+ cksum = pick_integer_le(buffer, 0776, 2);
+ for (int i = 0; i < 510; i+=2)
+ {
+ tmp += pick_integer_le(buffer, i, 2);
+ }
+
+ /* sanity check these values */
+ if (cksum != tmp)
+ {
+ fprintf(stderr, "cksum stored:computed %04x:%04x\n", cksum, tmp);
+ return IMGTOOLERR_CORRUPTIMAGE;
+ }
+#endif
+ if (di->directory_start != 6)
+ {
+ return IMGTOOLERR_CORRUPTIMAGE;
+ }
+
+ /* load first directory segment */
+ err = rt11_image_readblock(image, buffer, di->directory_start);
+ if (err)
+ return err;
+
+ di->total_segments = pick_integer_le(buffer, 0, 2);
+ di->last_segment = pick_integer_le(buffer, 4, 2);
+ di->dirent_size = (pick_integer_le(buffer, 6, 2) + 7) * 2;
+ di->dirents_per_block = (2 * BLOCK_SIZE - 10) / di->dirent_size;
+
+ return IMGTOOLERR_SUCCESS;
+}
+
+static void rt11_image_info(imgtool::image &image, std::ostream &stream)
+{
+ uint8_t buffer[BLOCK_SIZE];
+ char system[4];
+ char vid[13], oid[13], sid[13];
+
+ rt11_image_readblock(image, buffer, HOME_BLOCK);
+ rt11_from_rad50(system, (uint16_t *)&buffer[0726], 1);
+ system[3] = '\0';
+
+ memcpy(vid, &buffer[0730], 12);
+ memcpy(oid, &buffer[0744], 12);
+ memcpy(sid, &buffer[0760], 12);
+ vid[12] = '\0';
+ oid[12] = '\0';
+ sid[12] = '\0';
+
+ stream << "System version: '" << system << "', System ID: '" << sid << "', Volume ID: '" << vid << "', Owner: '" << oid << "'";
+}
+
+// directory operations
+
+static imgtoolerr_t rt11_enum_seek(imgtool::image &image,
+ rt11_direnum *rt11enum, uint16_t segment, uint16_t index)
+{
+ const rt11_diskinfo *di = get_rt11_info(image);
+ imgtoolerr_t err;
+ uint8_t buffer[BLOCK_SIZE];
+
+ if (rt11enum->segment != segment)
+ {
+ if (segment != 0)
+ {
+ err = rt11_image_readblock(image, buffer, di->directory_start + (segment - 1) * 2);
+ if (err)
+ return err;
+ memcpy(rt11enum->segment_data, buffer, sizeof(buffer));
+
+ err = rt11_image_readblock(image, buffer, di->directory_start + (segment - 1) * 2 + 1);
+ if (err)
+ return err;
+ memcpy(&rt11enum->segment_data[BLOCK_SIZE], buffer, sizeof(buffer));
+
+ rt11enum->data = pick_integer_le(rt11enum->segment_data, 8, 2);
+ }
+ rt11enum->segment = segment;
+ }
+
+ rt11enum->index = index;
+ return IMGTOOLERR_SUCCESS;
+}
+
+static imgtoolerr_t rt11_get_next_dirent(imgtool::image &image,
+ rt11_direnum *rt11enum, rt11_dirent &rt_ent)
+{
+ imgtoolerr_t err;
+ const rt11_diskinfo *di = get_rt11_info(image);
+ uint32_t next_segment, next_index;
+ uint32_t offset;
+
+ memset(&rt_ent, 0, sizeof(rt_ent));
+
+ /* have we hit the end of the file? */
+ if (rt11enum->segment == 0)
+ return IMGTOOLERR_SUCCESS;
+
+ /* populate the resulting dirent */
+ offset = (rt11enum->index * di->dirent_size) + 10;
+ rt_ent.status = pick_integer_le(rt11enum->segment_data, offset, 2);
+ memcpy(rt_ent.filename, &rt11enum->segment_data[offset + 2], 6);
+ rt_ent.filesize = pick_integer_le(rt11enum->segment_data, offset + 8, 2) * BLOCK_SIZE;
+ rt_ent.data = rt11enum->data;
+ rt_ent.time = pick_integer_le(rt11enum->segment_data, offset + 12, 2);
+ rt11enum->data += pick_integer_le(rt11enum->segment_data, offset + 8, 2);
+
+ /* identify next entry */
+ next_segment = rt11enum->segment;
+ next_index = rt11enum->index + 1;
+ if (next_index >= di->dirents_per_block || (rt_ent.status & E_EOS))
+ {
+ next_segment = pick_integer_le(rt11enum->segment_data, 2, 2);
+ next_index = 0;
+ }
+
+ if (next_segment > di->total_segments || next_segment > di->last_segment)
+ return IMGTOOLERR_CORRUPTIMAGE;
+
+ /* seek next segment */
+ err = rt11_enum_seek(image, rt11enum, next_segment, next_index);
+ if (err)
+ return err;
+
+ return IMGTOOLERR_SUCCESS;
+}
+
+static imgtoolerr_t rt11_image_beginenum(imgtool::directory &enumeration, const char *path)
+{
+ imgtoolerr_t err;
+ imgtool::image &image(enumeration.image());
+
+ /* seek initial block */
+ err = rt11_enum_seek(image, (rt11_direnum *) enumeration.extra_bytes(), 1, 0);
+ if (err)
+ return err;
+
+ return IMGTOOLERR_SUCCESS;
+}
+
+static imgtoolerr_t rt11_image_nextenum(imgtool::directory &enumeration, imgtool_dirent &ent)
+{
+ imgtoolerr_t err;
+ imgtool::image &image(enumeration.image());
+ rt11_direnum *rt11enum = (rt11_direnum *)enumeration.extra_bytes();
+ rt11_dirent rt_ent;
+
+ do
+ {
+ err = rt11_get_next_dirent(image, rt11enum, rt_ent);
+ if (err)
+ return err;
+ }
+ while (rt11enum->segment && !is_file_storagetype(rt_ent.status));
+
+ /* end of file? */
+ if (rt11enum->segment == 0)
+ {
+ ent.eof = 1;
+ return IMGTOOLERR_SUCCESS;
+ }
+
+ ent.directory = 0;
+ ent.lastmodified_time = rt11_crack_time(rt_ent.time);
+ ent.filesize = rt_ent.filesize;
+
+ rt11_filename_from_rad50(ent.filename, rt_ent.filename);
+
+ snprintf(ent.attr, sizeof(ent.attr), "%c%c%c %4d %06o",
+ rt_ent.status & E_PROT ? 'P' : '.',
+ rt_ent.time == 0 ? 'B' : '.',
+ rt_ent.status & E_TENT ? 'T' : '.',
+ rt_ent.data, rt_ent.status);
+
+ return IMGTOOLERR_SUCCESS;
+}
+
+// file operations
+
+static imgtoolerr_t rt11_lookup_path(imgtool::image &image, const char *path,
+ creation_policy_t create, rt11_direnum *direnum, rt11_dirent *rt_ent)
+{
+ imgtoolerr_t err;
+ rt11_direnum my_direnum;
+ uint16_t this_segment;
+ uint32_t this_index;
+ char filename[16];
+
+ if (!direnum)
+ direnum = &my_direnum;
+
+ memset(direnum, 0, sizeof(*direnum));
+ err = rt11_enum_seek(image, direnum, 1, 0);
+ if (err)
+ goto done;
+
+ do
+ {
+ this_segment = direnum->segment;
+ this_index = direnum->index;
+
+ err = rt11_get_next_dirent(image, direnum, *rt_ent);
+ if (err)
+ goto done;
+ rt11_filename_from_rad50(filename, rt_ent->filename);
+ }
+ while(direnum->segment && (strcmp(path, filename) ||
+ !is_file_storagetype(rt_ent->status)));
+
+ if (!direnum->segment)
+ {
+ /* did not find file; maybe we need to create it */
+ if (create == CREATE_NONE)
+ {
+ err = IMGTOOLERR_FILENOTFOUND;
+ goto done;
+ }
+ }
+ else
+ {
+ /* we've found the file; seek that dirent */
+ err = rt11_enum_seek(image, direnum, this_segment, this_index);
+ if (err)
+ goto done;
+ }
+
+ err = IMGTOOLERR_SUCCESS;
+done:
+ return err;
+}
+
+static imgtoolerr_t rt11_read_bootblock(imgtool::partition &partition, imgtool::stream &stream)
+{
+ imgtoolerr_t err;
+ uint8_t block[BLOCK_SIZE];
+
+ err = rt11_image_readblock(partition.image(), block, 0);
+ if (err)
+ return err;
+
+ stream.write(block, sizeof(block));
+ return IMGTOOLERR_SUCCESS;
+}
+
+static imgtoolerr_t rt11_image_readfile(imgtool::partition &partition, const char *filename, const char *fork, imgtool::stream &destf)
+{
+ imgtoolerr_t err;
+ imgtool::image &image(partition.image());
+ rt11_dirent rt_ent;
+ uint8_t buffer[BLOCK_SIZE];
+
+ if (filename == FILENAME_BOOTBLOCK)
+ return rt11_read_bootblock(partition, destf);
+
+ err = rt11_lookup_path(image, filename, CREATE_NONE, NULL, &rt_ent);
+ if (err)
+ return err;
+
+ for (uint16_t i = rt_ent.data; i < rt_ent.data + (rt_ent.filesize / BLOCK_SIZE); i++)
+ {
+ err = rt11_image_readblock(image, buffer, i);
+ if (err)
+ return err;
+
+ destf.write(buffer, BLOCK_SIZE);
+ }
+
+ return IMGTOOLERR_SUCCESS;
+}
+
+
+void rt11_get_info(const imgtool_class *imgclass, uint32_t state, union imgtoolinfo *info)
+{
+ switch (state)
+ {
+ /* --- the following bits of info are returned as 64-bit signed integers --- */
+ case IMGTOOLINFO_INT_PREFER_UCASE: info->i = 1; break;
+ case IMGTOOLINFO_INT_OPEN_IS_STRICT: info->i = 1; break;
+ case IMGTOOLINFO_INT_SUPPORTS_LASTMODIFIED_TIME: info->i = 1; break;
+ case IMGTOOLINFO_INT_SUPPORTS_BOOTBLOCK: info->i = 1; break;
+ case IMGTOOLINFO_INT_BLOCK_SIZE: info->i = BLOCK_SIZE; break;
+ case IMGTOOLINFO_INT_IMAGE_EXTRA_BYTES: info->i = sizeof(rt11_diskinfo); break;
+ case IMGTOOLINFO_INT_DIRECTORY_EXTRA_BYTES: info->i = sizeof(rt11_direnum); break;
+
+ /* --- the following bits of info are returned as NULL-terminated strings --- */
+ case IMGTOOLINFO_STR_NAME: strcpy(info->s = imgtool_temp_str(), "rt11"); break;
+ case IMGTOOLINFO_STR_DESCRIPTION: strcpy(info->s = imgtool_temp_str(), "RT11 format"); break;
+ case IMGTOOLINFO_STR_FILE: strcpy(info->s = imgtool_temp_str(), __FILE__); break;
+ case IMGTOOLINFO_STR_EOLN: strcpy(info->s = imgtool_temp_str(), EOLN_CRLF); break;
+
+ /* --- the following bits of info are returned as pointers to data or functions --- */
+ case IMGTOOLINFO_PTR_INFO: info->info = rt11_image_info; break;
+ case IMGTOOLINFO_PTR_MAKE_CLASS: info->make_class = imgtool_floppy_make_class; break;
+ case IMGTOOLINFO_PTR_GET_GEOMETRY: info->get_geometry = rt11_image_get_geometry; break;
+ case IMGTOOLINFO_PTR_READ_BLOCK: info->read_block = rt11_image_readblock; break;
+ case IMGTOOLINFO_PTR_BEGIN_ENUM: info->begin_enum = rt11_image_beginenum; break;
+ case IMGTOOLINFO_PTR_NEXT_ENUM: info->next_enum = rt11_image_nextenum; break;
+ case IMGTOOLINFO_PTR_READ_FILE: info->read_file = rt11_image_readfile; break;
+
+ case IMGTOOLINFO_PTR_FLOPPY_OPEN: info->open = rt11_image_open; break;
+ case IMGTOOLINFO_PTR_FLOPPY_FORMAT: info->p = (void *) floppyoptions_default; break;
+ }
+}
diff --git a/src/tools/testkeys.cpp b/src/tools/testkeys.cpp
new file mode 100644
index 00000000000..9ee08808c19
--- /dev/null
+++ b/src/tools/testkeys.cpp
@@ -0,0 +1,346 @@
+//============================================================
+//
+// testkeys.cpp - A small utility to analyze SDL keycodes
+//
+// Copyright (c) 1996-2019, Nicola Salmoria and the MAME Team.
+// Visit http://mamedev.org for licensing and usage restrictions.
+//
+// SDLMAME by Olivier Galibert and R. Belmont
+// testkeys by couriersud
+//
+//============================================================
+
+#include "osdcore.h"
+
+#include "SDL2/SDL.h"
+
+#include <iostream>
+#include <string>
+
+//#include "unicode.h"
+
+
+struct key_lookup_table { int code; const char *name; };
+
+#define KE(x) { SDL_SCANCODE_##x, "SDL_SCANCODE_" #x },
+
+static constexpr key_lookup_table sdl_lookup[] =
+{
+ KE(UNKNOWN)
+
+ KE(A)
+ KE(B)
+ KE(C)
+ KE(D)
+ KE(E)
+ KE(F)
+ KE(G)
+ KE(H)
+ KE(I)
+ KE(J)
+ KE(K)
+ KE(L)
+ KE(M)
+ KE(N)
+ KE(O)
+ KE(P)
+ KE(Q)
+ KE(R)
+ KE(S)
+ KE(T)
+ KE(U)
+ KE(V)
+ KE(W)
+ KE(X)
+ KE(Y)
+ KE(Z)
+
+ KE(1)
+ KE(2)
+ KE(3)
+ KE(4)
+ KE(5)
+ KE(6)
+ KE(7)
+ KE(8)
+ KE(9)
+ KE(0)
+
+ KE(RETURN)
+ KE(ESCAPE)
+ KE(BACKSPACE)
+ KE(TAB)
+ KE(SPACE)
+
+ KE(MINUS)
+ KE(EQUALS)
+ KE(LEFTBRACKET)
+ KE(RIGHTBRACKET)
+ KE(BACKSLASH)
+ KE(NONUSHASH)
+ KE(SEMICOLON)
+ KE(APOSTROPHE)
+ KE(GRAVE)
+ KE(COMMA)
+ KE(PERIOD)
+ KE(SLASH)
+
+ KE(CAPSLOCK)
+
+ KE(F1)
+ KE(F2)
+ KE(F3)
+ KE(F4)
+ KE(F5)
+ KE(F6)
+ KE(F7)
+ KE(F8)
+ KE(F9)
+ KE(F10)
+ KE(F11)
+ KE(F12)
+
+ KE(PRINTSCREEN)
+ KE(SCROLLLOCK)
+ KE(PAUSE)
+ KE(INSERT)
+ KE(HOME)
+ KE(PAGEUP)
+ KE(DELETE)
+ KE(END)
+ KE(PAGEDOWN)
+ KE(RIGHT)
+ KE(LEFT)
+ KE(DOWN)
+ KE(UP)
+
+ KE(NUMLOCKCLEAR)
+ KE(KP_DIVIDE)
+ KE(KP_MULTIPLY)
+ KE(KP_MINUS)
+ KE(KP_PLUS)
+ KE(KP_ENTER)
+ KE(KP_1)
+ KE(KP_2)
+ KE(KP_3)
+ KE(KP_4)
+ KE(KP_5)
+ KE(KP_6)
+ KE(KP_7)
+ KE(KP_8)
+ KE(KP_9)
+ KE(KP_0)
+ KE(KP_PERIOD)
+
+ KE(NONUSBACKSLASH)
+ KE(APPLICATION)
+ KE(POWER)
+ KE(KP_EQUALS)
+ KE(F13)
+ KE(F14)
+ KE(F15)
+ KE(F16)
+ KE(F17)
+ KE(F18)
+ KE(F19)
+ KE(F20)
+ KE(F21)
+ KE(F22)
+ KE(F23)
+ KE(F24)
+ KE(EXECUTE)
+ KE(HELP)
+ KE(MENU)
+ KE(SELECT)
+ KE(STOP)
+ KE(AGAIN)
+ KE(UNDO)
+ KE(CUT)
+ KE(COPY)
+ KE(PASTE)
+ KE(FIND)
+ KE(MUTE)
+ KE(VOLUMEUP)
+ KE(VOLUMEDOWN)
+ KE(KP_COMMA)
+ KE(KP_EQUALSAS400)
+
+ KE(INTERNATIONAL1)
+ KE(INTERNATIONAL2)
+ KE(INTERNATIONAL3)
+ KE(INTERNATIONAL4)
+ KE(INTERNATIONAL5)
+ KE(INTERNATIONAL6)
+ KE(INTERNATIONAL7)
+ KE(INTERNATIONAL8)
+ KE(INTERNATIONAL9)
+ KE(LANG1)
+ KE(LANG2)
+ KE(LANG3)
+ KE(LANG4)
+ KE(LANG5)
+ KE(LANG6)
+ KE(LANG7)
+ KE(LANG8)
+ KE(LANG9)
+
+ KE(ALTERASE)
+ KE(SYSREQ)
+ KE(CANCEL)
+ KE(CLEAR)
+ KE(PRIOR)
+ KE(RETURN2)
+ KE(SEPARATOR)
+ KE(OUT)
+ KE(OPER)
+ KE(CLEARAGAIN)
+ KE(CRSEL)
+ KE(EXSEL)
+
+ KE(KP_00)
+ KE(KP_000)
+ KE(THOUSANDSSEPARATOR)
+ KE(DECIMALSEPARATOR)
+ KE(CURRENCYUNIT)
+ KE(CURRENCYSUBUNIT)
+ KE(KP_LEFTPAREN)
+ KE(KP_RIGHTPAREN)
+ KE(KP_LEFTBRACE)
+ KE(KP_RIGHTBRACE)
+ KE(KP_TAB)
+ KE(KP_BACKSPACE)
+ KE(KP_A)
+ KE(KP_B)
+ KE(KP_C)
+ KE(KP_D)
+ KE(KP_E)
+ KE(KP_F)
+ KE(KP_XOR)
+ KE(KP_POWER)
+ KE(KP_PERCENT)
+ KE(KP_LESS)
+ KE(KP_GREATER)
+ KE(KP_AMPERSAND)
+ KE(KP_DBLAMPERSAND)
+ KE(KP_VERTICALBAR)
+ KE(KP_DBLVERTICALBAR)
+ KE(KP_COLON)
+ KE(KP_HASH)
+ KE(KP_SPACE)
+ KE(KP_AT)
+ KE(KP_EXCLAM)
+ KE(KP_MEMSTORE)
+ KE(KP_MEMRECALL)
+ KE(KP_MEMCLEAR)
+ KE(KP_MEMADD)
+ KE(KP_MEMSUBTRACT)
+ KE(KP_MEMMULTIPLY)
+ KE(KP_MEMDIVIDE)
+ KE(KP_PLUSMINUS)
+ KE(KP_CLEAR)
+ KE(KP_CLEARENTRY)
+ KE(KP_BINARY)
+ KE(KP_OCTAL)
+ KE(KP_DECIMAL)
+ KE(KP_HEXADECIMAL)
+
+ KE(LCTRL)
+ KE(LSHIFT)
+ KE(LALT)
+ KE(LGUI)
+ KE(RCTRL)
+ KE(RSHIFT)
+ KE(RALT)
+ KE(RGUI)
+
+ KE(MODE)
+ KE(AUDIONEXT)
+ KE(AUDIOPREV)
+ KE(AUDIOSTOP)
+ KE(AUDIOPLAY)
+ KE(AUDIOMUTE)
+ KE(MEDIASELECT)
+ KE(WWW)
+ KE(MAIL)
+ KE(CALCULATOR)
+ KE(COMPUTER)
+ KE(AC_SEARCH)
+ KE(AC_HOME)
+ KE(AC_BACK)
+ KE(AC_FORWARD)
+ KE(AC_STOP)
+ KE(AC_REFRESH)
+ KE(AC_BOOKMARKS)
+
+ KE(BRIGHTNESSDOWN)
+ KE(BRIGHTNESSUP)
+ KE(DISPLAYSWITCH)
+ KE(KBDILLUMTOGGLE)
+ KE(KBDILLUMDOWN)
+ KE(KBDILLUMUP)
+ KE(EJECT)
+ KE(SLEEP)
+
+ KE(APP1)
+ KE(APP2)
+};
+
+static char const *lookup_key_name(int kc)
+{
+ for (key_lookup_table const &k : sdl_lookup)
+ {
+ if (k.code == kc)
+ return k.name;
+ }
+ return nullptr;
+}
+
+int main(int argc, char *argv[])
+{
+ if (SDL_Init(SDL_INIT_VIDEO) < 0) {
+ fprintf(stderr, "Couldn't initialize SDL: %s\n", SDL_GetError());
+ exit(1);
+ }
+ SDL_CreateWindow("Input Test", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, 100, 100, 0);
+
+ SDL_Event event;
+ bool quit = false;
+ std::string lasttext;
+ while (SDL_PollEvent(&event) || !quit) {
+ switch(event.type) {
+ case SDL_QUIT:
+ quit = true;
+ break;
+ case SDL_KEYDOWN:
+ if (event.key.keysym.sym == SDLK_ESCAPE) {
+ quit = true;
+ } else {
+ std::cout
+ << "ITEM_ID_XY "
+ << lookup_key_name(event.key.keysym.scancode)
+ << ' '
+ << std::endl;
+ lasttext.clear();
+ }
+ break;
+ case SDL_KEYUP:
+ std::cout
+ << "ITEM_ID_XY "
+ << lookup_key_name(event.key.keysym.scancode)
+ << ' '
+ << lasttext
+ << std::endl;
+ break;
+ case SDL_TEXTINPUT:
+ lasttext = event.text.text;
+ break;
+ }
+ event.type = 0;
+
+#ifdef SDLMAME_OS2
+ SDL_Delay(10);
+#endif
+ }
+ SDL_Quit();
+ return(0);
+}
diff --git a/src/tools/unidasm.cpp b/src/tools/unidasm.cpp
index e811991b872..c668fcba82d 100644
--- a/src/tools/unidasm.cpp
+++ b/src/tools/unidasm.cpp
@@ -17,6 +17,7 @@ using util::BIT;
#include "cpu/8x300/8x300dasm.h"
#include "cpu/adsp2100/2100dasm.h"
#include "cpu/alph8201/8201dasm.h"
+#include "cpu/alpha/alphad.h"
#include "cpu/alto2/alto2dsm.h"
#include "cpu/am29000/am29dasm.h"
#include "cpu/amis2000/amis2000d.h"
@@ -54,6 +55,7 @@ using util::BIT;
#include "cpu/hcd62121/hcd62121d.h"
#include "cpu/hd61700/hd61700d.h"
#include "cpu/hmcs40/hmcs40d.h"
+#include "cpu/hpc/hpcdasm.h"
#include "cpu/hphybrid/hphybrid_dasm.h"
#include "cpu/i386/i386dasm.h"
#include "cpu/i8008/8008dasm.h"
@@ -97,6 +99,7 @@ using util::BIT;
#include "cpu/mn10200/mn102dis.h"
#include "cpu/nanoprocessor/nanoprocessor_dasm.h"
#include "cpu/nec/necdasm.h"
+#include "cpu/ns32000/ns32000dasm.h"
#include "cpu/nuon/nuondasm.h"
#include "cpu/patinhofeio/patinho_feio_dasm.h"
#include "cpu/pdp1/pdp1dasm.h"
@@ -299,8 +302,12 @@ struct options
static const dasm_table_entry dasm_table[] =
{
- { "8x300", be, 0, []() -> util::disasm_interface * { return new n8x300_disassembler; } },
+ { "8x300", be, -1, []() -> util::disasm_interface * { return new n8x300_disassembler; } },
{ "adsp21xx", le, -2, []() -> util::disasm_interface * { return new adsp21xx_disassembler; } },
+ { "alpha", le, 0, []() -> util::disasm_interface * { return new alpha_disassembler; } },
+ { "alpha_nt", le, 0, []() -> util::disasm_interface * { return new alpha_disassembler(alpha_disassembler::TYPE_NT); } },
+ { "alpha_unix", le, 0, []() -> util::disasm_interface * { return new alpha_disassembler(alpha_disassembler::TYPE_UNIX); } },
+ { "alpha_vms", le, 0, []() -> util::disasm_interface * { return new alpha_disassembler(alpha_disassembler::TYPE_VMS); } },
{ "alpha8201", le, 0, []() -> util::disasm_interface * { return new alpha8201_disassembler; } },
{ "alto2", be, -2, []() -> util::disasm_interface * { return new alto2_disassembler; } },
{ "am29000", be, 0, []() -> util::disasm_interface * { return new am29000_disassembler; } },
@@ -355,6 +362,8 @@ static const dasm_table_entry dasm_table[] =
{ "hp_5061_3001", be, -1, []() -> util::disasm_interface * { return new hp_5061_3001_disassembler; } },
{ "hp_5061_3011", be, -1, []() -> util::disasm_interface * { return new hp_5061_3011_disassembler; } },
{ "hp_09825_67907", be, -1, []() -> util::disasm_interface * { return new hp_09825_67907_disassembler; } },
+ { "hpc16083", le, 0, []() -> util::disasm_interface * { return new hpc16083_disassembler; } },
+ { "hpc16164", le, 0, []() -> util::disasm_interface * { return new hpc16164_disassembler; } },
{ "hyperstone", be, 0, []() -> util::disasm_interface * { return new hyperstone_disassembler(&hyperstone_unidasm); } },
{ "i4004", le, 0, []() -> util::disasm_interface * { return new i4004_disassembler; } },
{ "i4040", le, 0, []() -> util::disasm_interface * { return new i4040_disassembler; } },
@@ -412,6 +421,7 @@ static const dasm_table_entry dasm_table[] =
{ "mn10200", le, 0, []() -> util::disasm_interface * { return new mn10200_disassembler; } },
{ "nanoprocessor", le, 0, []() -> util::disasm_interface * { return new hp_nanoprocessor_disassembler; } },
{ "nec", le, 0, []() -> util::disasm_interface * { return new nec_disassembler; } },
+ { "ns32000", le, 0, []() -> util::disasm_interface * { return new ns32000_disassembler; } },
{ "nuon", be, 0, []() -> util::disasm_interface * { return new nuon_disassembler; } },
{ "nsc8105", be, 0, []() -> util::disasm_interface * { return new m680x_disassembler(8105); } },
{ "patinho_feio", le, 0, []() -> util::disasm_interface * { return new patinho_feio_disassembler; } },
@@ -841,8 +851,6 @@ unidasm_data_buffer::unidasm_data_buffer(util::disasm_interface *_disasm, const
case 3:
lr8 = [](offs_t pc) -> u8 { abort(); };
- lr32 = [](offs_t pc) -> u32 { abort(); };
- lr64 = [](offs_t pc) -> u64 { abort(); };
lr16 = [this](offs_t pc) -> u16 {
if(pc < base_pc)
return 0x0000;
@@ -851,6 +859,31 @@ unidasm_data_buffer::unidasm_data_buffer(util::disasm_interface *_disasm, const
return 0x0000;
return reinterpret_cast<const u16 *>(&data[delta])[0];
};
+ switch(entry->endian) {
+ case le:
+ lr32 = [this](offs_t pc) -> u32 {
+ if(pc < base_pc)
+ return 0x00000000;
+ offs_t delta = (pc - base_pc) >> 3;
+ if(delta >= size + 2)
+ return 0x00000000;
+ auto p = reinterpret_cast<const u16 *>(&data[delta]);
+ return p[0] | (u32(p[1]) << 16);
+ };
+ break;
+ case be:
+ lr32 = [this](offs_t pc) -> u32 {
+ if(pc < base_pc)
+ return 0x00000000;
+ offs_t delta = (pc - base_pc) >> 3;
+ if(delta >= size + 2)
+ return 0x00000000;
+ auto p = reinterpret_cast<const u16 *>(&data[delta]);
+ return (u32(p[0]) << 16) | p[1];
+ };
+ break;
+ }
+ lr64 = [](offs_t pc) -> u64 { abort(); };
break;
default:
diff --git a/src/zexall/zexall.cpp b/src/zexall/zexall.cpp
index f05b20ca12f..f9fff9b2526 100644
--- a/src/zexall/zexall.cpp
+++ b/src/zexall/zexall.cpp
@@ -141,11 +141,12 @@ INPUT_PORTS_END
Machine Drivers
******************************************************************************/
-MACHINE_CONFIG_START(zexall_state::zexall)
+void zexall_state::zexall(machine_config &config)
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, XTAL(3'579'545))
- MCFG_DEVICE_PROGRAM_MAP(z80_mem)
-MACHINE_CONFIG_END
+ Z80(config, m_maincpu, XTAL(3'579'545));
+ m_maincpu->set_addrmap(AS_PROGRAM, &zexall_state::z80_mem);
+}
/******************************************************************************